[med-svn] [gatb-core] 01/01: Create package

Nadiya Sitdykova rovenskasa-guest at moszumanska.debian.org
Wed Oct 11 04:40:43 UTC 2017


This is an automated email from the git hooks/post-receive script.

rovenskasa-guest pushed a commit to branch master
in repository gatb-core.

commit e3c8b5c2ab9924bf1282eaad57100f6887a04bcb
Author: Nadiya Sitdykova <rovenskasa at gmail.com>
Date:   Wed Oct 11 00:38:32 2017 -0400

    Create package
---
 .travis.yml                                        |    31 +
 README.md                                          |   252 +
 debian/changelog                                   |     5 +
 debian/compat                                      |     1 +
 debian/control                                     |    26 +
 debian/copyright                                   |    28 +
 debian/rules                                       |    25 +
 debian/source/format                               |     1 +
 debian/upstream/.metadata.swp                      |   Bin 0 -> 12288 bytes
 debian/upstream/metadata                           |    17 +
 debian/watch                                       |     6 +
 gatb-core/.gitignore                               |     7 +
 gatb-core/.project                                 |    27 +
 gatb-core/CMakeLists.txt                           |   316 +
 gatb-core/DELIVERY.md                              |    18 +
 gatb-core/LICENCE                                  |   622 ++
 gatb-core/RELEASES.md                              |   124 +
 gatb-core/THIRDPARTIES.md                          |   140 +
 gatb-core/cmake/CheckCompiler.cmake                |    23 +
 gatb-core/cmake/CppUnit.cmake                      |    41 +
 gatb-core/cmake/DefineInteger.cmake                |    65 +
 gatb-core/cmake/Delivery.cmake                     |    90 +
 gatb-core/cmake/GatbCore.cmake                     |    55 +
 gatb-core/cmake/UseLATEX.cmake                     |   734 ++
 gatb-core/doc/CMakeLists.txt                       |    28 +
 gatb-core/doc/book/.gitignore                      |     3 +
 gatb-core/doc/book/main.tex                        |    45 +
 .../modelio/GATB/.config/auditconfiguration.xml    |     1 +
 .../doc/design/modelio/GATB/.config/project.prefs  |     4 +
 .../modelio/GATB/.config/styles/default.style      |     1 +
 .../modelio/GATB/.config/styles/extern.style       |    76 +
 .../modelio/GATB/.config/styles/intern.style       |    76 +
 .../design/modelio/GATB/.config/styles/main.style  |    84 +
 .../design/modelio/GATB/.config/styles/ramc.style  |   442 +
 .../modelio/GATB/.config/styles/use case.style     |     8 +
 gatb-core/doc/design/modelio/GATB/GATB.ofpx        |   Bin 0 -> 5804544 bytes
 .../.runtime/ModelerModule/lib/ModelerModule.jar   |   Bin 0 -> 12488 bytes
 .../.runtime/ModelingWizard/lib/ModelingWizard.jar |   Bin 0 -> 95486 bytes
 .../modelio/GATB/mda/LocalModule/module.properties |     4 +
 .../GATB/mda/LocalModule/module_fr.properties      |     4 +
 .../GATB/mda/ModelerModule/lib/ModelerModule.jar   |   Bin 0 -> 12488 bytes
 .../GATB/mda/ModelerModule/module.properties       |   206 +
 .../modelio/GATB/mda/ModelerModule/module.xml      |  1338 +++
 .../GATB/mda/ModelerModule/module_fr.properties    |   206 +
 .../GATB/mda/ModelerModule/res/bmp/autodiagram.png |   Bin 0 -> 557 bytes
 .../mda/ModelerModule/res/bmp/bigdictionary.png    |   Bin 0 -> 3640 bytes
 .../GATB/mda/ModelerModule/res/bmp/bigprimary.png  |   Bin 0 -> 1493 bytes
 .../mda/ModelerModule/res/bmp/bigrequirement.png   |   Bin 0 -> 1221 bytes
 .../res/bmp/bigrequirement_business_rule.png       |   Bin 0 -> 2129 bytes
 .../ModelerModule/res/bmp/bigrequirement_goal.png  |   Bin 0 -> 2711 bytes
 .../res/bmp/bigrequirementcontainer.png            |   Bin 0 -> 1220 bytes
 .../bmp/bigrequirementcontainer_business_rule.png  |   Bin 0 -> 2445 bytes
 .../res/bmp/bigrequirementcontainer_goal.png       |   Bin 0 -> 2383 bytes
 .../GATB/mda/ModelerModule/res/bmp/bigscenario.png |   Bin 0 -> 2809 bytes
 .../mda/ModelerModule/res/bmp/bigsecondary.png     |   Bin 0 -> 771 bytes
 .../GATB/mda/ModelerModule/res/bmp/bigsystem.png   |   Bin 0 -> 2857 bytes
 .../GATB/mda/ModelerModule/res/bmp/bigterm.png     |   Bin 0 -> 1090 bytes
 .../GATB/mda/ModelerModule/res/bmp/dataflow.png    |   Bin 0 -> 355 bytes
 .../ModelerModule/res/bmp/dependency_antonym.png   |   Bin 0 -> 379 bytes
 .../ModelerModule/res/bmp/dependency_assigned.png  |   Bin 0 -> 220 bytes
 .../ModelerModule/res/bmp/dependency_context.png   |   Bin 0 -> 351 bytes
 .../ModelerModule/res/bmp/dependency_derive.png    |   Bin 0 -> 951 bytes
 .../ModelerModule/res/bmp/dependency_guarantee.png |   Bin 0 -> 214 bytes
 .../ModelerModule/res/bmp/dependency_homonym.png   |   Bin 0 -> 357 bytes
 .../ModelerModule/res/bmp/dependency_impacted.png  |   Bin 0 -> 244 bytes
 .../ModelerModule/res/bmp/dependency_implement.png |   Bin 0 -> 227 bytes
 .../ModelerModule/res/bmp/dependency_measure.png   |   Bin 0 -> 214 bytes
 .../res/bmp/dependency_negativeinfluence.png       |   Bin 0 -> 184 bytes
 .../mda/ModelerModule/res/bmp/dependency_part.png  |   Bin 0 -> 232 bytes
 .../res/bmp/dependency_positiveinfluence.png       |   Bin 0 -> 200 bytes
 .../ModelerModule/res/bmp/dependency_refers.png    |   Bin 0 -> 220 bytes
 .../ModelerModule/res/bmp/dependency_refine.png    |   Bin 0 -> 225 bytes
 .../ModelerModule/res/bmp/dependency_related.png   |   Bin 0 -> 222 bytes
 .../ModelerModule/res/bmp/dependency_satisfy.png   |   Bin 0 -> 227 bytes
 .../ModelerModule/res/bmp/dependency_synonym.png   |   Bin 0 -> 378 bytes
 .../ModelerModule/res/bmp/dependency_verify.png    |   Bin 0 -> 227 bytes
 .../ModelerModule/res/bmp/designpattern_icon.png   |   Bin 0 -> 247 bytes
 .../GATB/mda/ModelerModule/res/bmp/dictionary.png  |   Bin 0 -> 321 bytes
 .../ModelerModule/res/bmp/dictionarybrowser.png    |   Bin 0 -> 321 bytes
 .../mda/ModelerModule/res/bmp/externalDocument.png |   Bin 0 -> 1707 bytes
 .../res/bmp/operation_constructor.png              |   Bin 0 -> 969 bytes
 .../ModelerModule/res/bmp/operation_destructor.png |   Bin 0 -> 950 bytes
 .../GATB/mda/ModelerModule/res/bmp/primary.png     |   Bin 0 -> 342 bytes
 .../mda/ModelerModule/res/bmp/raisedexception.png  |   Bin 0 -> 246 bytes
 .../GATB/mda/ModelerModule/res/bmp/ramc.png        |   Bin 0 -> 413 bytes
 .../GATB/mda/ModelerModule/res/bmp/ramcarchive.png |   Bin 0 -> 299 bytes
 .../GATB/mda/ModelerModule/res/bmp/requirement.png |   Bin 0 -> 492 bytes
 .../res/bmp/requirement_business_rule.png          |   Bin 0 -> 771 bytes
 .../mda/ModelerModule/res/bmp/requirement_goal.png |   Bin 0 -> 1131 bytes
 .../ModelerModule/res/bmp/requirementbrowser.png   |   Bin 0 -> 492 bytes
 .../ModelerModule/res/bmp/requirementcontainer.png |   Bin 0 -> 411 bytes
 .../res/bmp/requirementcontainer_business_rule.png |   Bin 0 -> 662 bytes
 .../res/bmp/requirementcontainer_goal.png          |   Bin 0 -> 953 bytes
 .../res/bmp/requirementcontainerbrowser.png        |   Bin 0 -> 456 bytes
 .../ModelerModule/res/bmp/requirementproject.png   |   Bin 0 -> 295 bytes
 .../GATB/mda/ModelerModule/res/bmp/scenario.png    |   Bin 0 -> 748 bytes
 .../GATB/mda/ModelerModule/res/bmp/secondary.png   |   Bin 0 -> 318 bytes
 .../ModelerModule/res/bmp/staticdiagram_48x48.png  |   Bin 0 -> 1401 bytes
 .../res/bmp/staticdiagram_business_rule.png        |   Bin 0 -> 733 bytes
 .../res/bmp/staticdiagram_business_rule_image.png  |   Bin 0 -> 1784 bytes
 .../ModelerModule/res/bmp/staticdiagram_class.png  |   Bin 0 -> 649 bytes
 .../res/bmp/staticdiagram_class_image.png          |   Bin 0 -> 1359 bytes
 .../res/bmp/staticdiagram_collaboration.png        |   Bin 0 -> 439 bytes
 .../res/bmp/staticdiagram_collaboration_image.png  |   Bin 0 -> 1629 bytes
 .../res/bmp/staticdiagram_communication.png        |   Bin 0 -> 649 bytes
 .../res/bmp/staticdiagram_communication_image.png  |   Bin 0 -> 1456 bytes
 .../res/bmp/staticdiagram_deployment.png           |   Bin 0 -> 394 bytes
 .../res/bmp/staticdiagram_deployment_image.png     |   Bin 0 -> 1297 bytes
 .../res/bmp/staticdiagram_dictionary.png           |   Bin 0 -> 418 bytes
 .../res/bmp/staticdiagram_dictionary_image.png     |   Bin 0 -> 1888 bytes
 .../ModelerModule/res/bmp/staticdiagram_goal.png   |   Bin 0 -> 755 bytes
 .../res/bmp/staticdiagram_goal_image.png           |   Bin 0 -> 1857 bytes
 .../ModelerModule/res/bmp/staticdiagram_image.png  |   Bin 0 -> 1333 bytes
 .../ModelerModule/res/bmp/staticdiagram_impact.png |   Bin 0 -> 687 bytes
 .../res/bmp/staticdiagram_impact_image.png         |   Bin 0 -> 1415 bytes
 .../ModelerModule/res/bmp/staticdiagram_object.png |   Bin 0 -> 409 bytes
 .../res/bmp/staticdiagram_object_image.png         |   Bin 0 -> 1454 bytes
 .../res/bmp/staticdiagram_requirement.png          |   Bin 0 -> 539 bytes
 .../res/bmp/staticdiagram_requirement_image.png    |   Bin 0 -> 1538 bytes
 .../res/bmp/staticdiagram_sequence.png             |   Bin 0 -> 406 bytes
 .../res/bmp/staticdiagram_sequence_image.png       |   Bin 0 -> 1983 bytes
 .../ModelerModule/res/bmp/staticdiagram_state.png  |   Bin 0 -> 426 bytes
 .../res/bmp/staticdiagram_state_image.png          |   Bin 0 -> 1398 bytes
 .../res/bmp/staticdiagram_usecase.png              |   Bin 0 -> 402 bytes
 .../res/bmp/staticdiagram_usecase_image.png        |   Bin 0 -> 1551 bytes
 .../GATB/mda/ModelerModule/res/bmp/subsystem.png   |   Bin 0 -> 267 bytes
 .../GATB/mda/ModelerModule/res/bmp/system.png      |   Bin 0 -> 689 bytes
 .../GATB/mda/ModelerModule/res/bmp/term.png        |   Bin 0 -> 338 bytes
 .../mda/ModelerModule/res/bmp/traceability.png     |   Bin 0 -> 305 bytes
 .../res/bmp/usecasedependencyextend.png            |   Bin 0 -> 1074 bytes
 .../res/bmp/usecasedependencyinclude.png           |   Bin 0 -> 1073 bytes
 .../GATB/mda/ModelingWizard/lib/ModelingWizard.jar |   Bin 0 -> 95486 bytes
 .../GATB/mda/ModelingWizard/module.properties      |     2 +
 .../modelio/GATB/mda/ModelingWizard/module.xml     |     5 +
 .../GATB/mda/ModelingWizard/module_en.properties   |     2 +
 .../GATB/mda/ModelingWizard/module_fr.properties   |     4 +
 .../mda/ModelingWizard/res/bmp/ModelingWizard.png  |   Bin 0 -> 543 bytes
 gatb-core/doc/doxygen/doxygen.css                  |  1183 +++
 gatb-core/doc/doxygen/gatb.doxyfile                |  1719 ++++
 gatb-core/doc/doxygen/images/BankGlobal.png        |   Bin 0 -> 29200 bytes
 gatb-core/doc/doxygen/images/CoreGlobal.png        |   Bin 0 -> 7797 bytes
 gatb-core/doc/doxygen/images/ICountProcessor.png   |   Bin 0 -> 81633 bytes
 gatb-core/doc/doxygen/images/SystemGlobal.png      |   Bin 0 -> 7762 bytes
 gatb-core/doc/doxygen/images/ToolsGlobal.png       |   Bin 0 -> 3578 bytes
 gatb-core/doc/doxygen/images/Transfo.png           |   Bin 0 -> 69831 bytes
 gatb-core/doc/doxygen/src/dbgh5page.hpp            |    97 +
 gatb-core/doc/doxygen/src/designpage.hpp           |   104 +
 gatb-core/doc/doxygen/src/downloadpage.hpp         |    30 +
 gatb-core/doc/doxygen/src/mainpage.hpp             |   111 +
 gatb-core/doc/doxygen/src/snippetspage.hpp         |  1344 +++
 gatb-core/doc/doxygen/src/testspage.hpp            |    18 +
 gatb-core/doc/misc/README.txt                      |   123 +
 gatb-core/docker/Dockerfile                        |   169 +
 gatb-core/docker/Dockerfile.clang                  |   172 +
 gatb-core/docker/gatb-compile.sh                   |    63 +
 gatb-core/docker/gatb-test.sh                      |    27 +
 gatb-core/examples/CMakeLists.txt                  |    35 +
 gatb-core/examples/README.md                       |    84 +
 gatb-core/examples/bank/bank1.cpp                  |    44 +
 gatb-core/examples/bank/bank10.cpp                 |   123 +
 gatb-core/examples/bank/bank11.cpp                 |    61 +
 gatb-core/examples/bank/bank12.cpp                 |    87 +
 gatb-core/examples/bank/bank13.cpp                 |    78 +
 gatb-core/examples/bank/bank14.cpp                 |    61 +
 gatb-core/examples/bank/bank15.cpp                 |    50 +
 gatb-core/examples/bank/bank16.cpp                 |    72 +
 gatb-core/examples/bank/bank17.cpp                 |    61 +
 gatb-core/examples/bank/bank18.cpp                 |    64 +
 gatb-core/examples/bank/bank19.cpp                 |    59 +
 gatb-core/examples/bank/bank2.cpp                  |    54 +
 gatb-core/examples/bank/bank20.cpp                 |    52 +
 gatb-core/examples/bank/bank21.cpp                 |    97 +
 gatb-core/examples/bank/bank22.cpp                 |    50 +
 gatb-core/examples/bank/bank23.cpp                 |    49 +
 gatb-core/examples/bank/bank24.cpp                 |    77 +
 gatb-core/examples/bank/bank25.cpp                 |    93 +
 gatb-core/examples/bank/bank26.cpp                 |    54 +
 gatb-core/examples/bank/bank27.cpp                 |    70 +
 gatb-core/examples/bank/bank28.cpp                 |    64 +
 gatb-core/examples/bank/bank3.cpp                  |    56 +
 gatb-core/examples/bank/bank4.cpp                  |    58 +
 gatb-core/examples/bank/bank5.cpp                  |    46 +
 gatb-core/examples/bank/bank6.cpp                  |    97 +
 gatb-core/examples/bank/bank7.cpp                  |    66 +
 gatb-core/examples/bank/bank8.cpp                  |    98 +
 gatb-core/examples/bank/bank9.cpp                  |    86 +
 gatb-core/examples/debruijn/debruijn1.cpp          |    45 +
 gatb-core/examples/debruijn/debruijn10.cpp         |    66 +
 gatb-core/examples/debruijn/debruijn11.cpp         |    82 +
 gatb-core/examples/debruijn/debruijn12.cpp         |    55 +
 gatb-core/examples/debruijn/debruijn13.cpp         |    42 +
 gatb-core/examples/debruijn/debruijn14.cpp         |    46 +
 gatb-core/examples/debruijn/debruijn15.cpp         |    47 +
 gatb-core/examples/debruijn/debruijn16.cpp         |    56 +
 gatb-core/examples/debruijn/debruijn17.cpp         |    58 +
 gatb-core/examples/debruijn/debruijn18.cpp         |   122 +
 gatb-core/examples/debruijn/debruijn19.cpp         |   235 +
 gatb-core/examples/debruijn/debruijn2.cpp          |    42 +
 gatb-core/examples/debruijn/debruijn20.cpp         |   258 +
 gatb-core/examples/debruijn/debruijn21.cpp         |    62 +
 gatb-core/examples/debruijn/debruijn22.cpp         |   179 +
 gatb-core/examples/debruijn/debruijn23.cpp         |    13 +
 gatb-core/examples/debruijn/debruijn24.cpp         |   153 +
 gatb-core/examples/debruijn/debruijn25.cpp         |   121 +
 gatb-core/examples/debruijn/debruijn26.cpp         |    36 +
 gatb-core/examples/debruijn/debruijn27.cpp         |    51 +
 gatb-core/examples/debruijn/debruijn3.cpp          |    42 +
 gatb-core/examples/debruijn/debruijn4.cpp          |    43 +
 gatb-core/examples/debruijn/debruijn5.cpp          |    43 +
 gatb-core/examples/debruijn/debruijn6.cpp          |    56 +
 gatb-core/examples/debruijn/debruijn7.cpp          |    68 +
 gatb-core/examples/debruijn/debruijn8.cpp          |    55 +
 gatb-core/examples/debruijn/debruijn9.cpp          |    65 +
 gatb-core/examples/debruijn/traversal1.cpp         |    82 +
 gatb-core/examples/debruijn/traversal2.cpp         |    97 +
 gatb-core/examples/kmer/kmer1.cpp                  |    24 +
 gatb-core/examples/kmer/kmer10.cpp                 |    73 +
 gatb-core/examples/kmer/kmer11.cpp                 |   158 +
 gatb-core/examples/kmer/kmer12.cpp                 |   179 +
 gatb-core/examples/kmer/kmer13.cpp                 |   149 +
 gatb-core/examples/kmer/kmer14.cpp                 |   169 +
 gatb-core/examples/kmer/kmer15.cpp                 |   190 +
 gatb-core/examples/kmer/kmer16.cpp                 |    77 +
 gatb-core/examples/kmer/kmer17.cpp                 |   146 +
 gatb-core/examples/kmer/kmer2.cpp                  |   130 +
 gatb-core/examples/kmer/kmer3.cpp                  |    37 +
 gatb-core/examples/kmer/kmer4.cpp                  |    87 +
 gatb-core/examples/kmer/kmer5.cpp                  |   154 +
 gatb-core/examples/kmer/kmer6.cpp                  |    41 +
 gatb-core/examples/kmer/kmer7.cpp                  |   112 +
 gatb-core/examples/kmer/kmer8.cpp                  |   155 +
 gatb-core/examples/kmer/kmer9.cpp                  |    52 +
 gatb-core/examples/protos/MicroSNP.cpp             |   107 +
 gatb-core/examples/storage/storage1.cpp            |    60 +
 gatb-core/examples/storage/storage10.cpp           |    59 +
 gatb-core/examples/storage/storage2.cpp            |    67 +
 gatb-core/examples/storage/storage3.cpp            |    36 +
 gatb-core/examples/storage/storage4.cpp            |    36 +
 gatb-core/examples/storage/storage5.cpp            |    10 +
 gatb-core/examples/storage/storage6.cpp            |   110 +
 gatb-core/examples/storage/storage7.cpp            |    37 +
 gatb-core/examples/storage/storage8.cpp            |    68 +
 gatb-core/examples/storage/storage9.cpp            |    41 +
 gatb-core/examples/tools/ToyTool.cpp               |   124 +
 gatb-core/examples/tools/iterators1.cpp            |    28 +
 gatb-core/examples/tools/iterators2.cpp            |    34 +
 gatb-core/examples/tools/iterators3.cpp            |    29 +
 gatb-core/examples/tools/iterators4.cpp            |    46 +
 gatb-core/examples/tools/iterators5.cpp            |    33 +
 gatb-core/examples/tools/iterators6.cpp            |    34 +
 gatb-core/examples/tools/iterators7.cpp            |    30 +
 gatb-core/examples/tools/iterators8.cpp            |    42 +
 gatb-core/examples/tools/iterators9.cpp            |    34 +
 gatb-core/examples/tools/multithreading1.cpp       |    55 +
 gatb-core/examples/tools/multithreading2.cpp       |    71 +
 gatb-core/examples/tools/multithreading3.cpp       |    62 +
 gatb-core/examples/tools/multithreading4.cpp       |    57 +
 gatb-core/examples/tools/multithreading5.cpp       |    66 +
 gatb-core/examples/tools/multithreading6.cpp       |    78 +
 gatb-core/examples/tools/multithreading7.cpp       |    61 +
 gatb-core/examples/tools/observer1.cpp             |    51 +
 gatb-core/examples/tools/optionsparser1.cpp        |    45 +
 gatb-core/examples/tools/optionsparser2.cpp        |    28 +
 gatb-core/scripts/NewProject/CMakeLists.txt        |    83 +
 gatb-core/scripts/NewProject/CMakeLists_tools.txt  |    40 +
 gatb-core/scripts/NewProject/NewProject.sh         |   243 +
 gatb-core/scripts/NewProject/README.md             |    94 +
 gatb-core/scripts/NewProject/XXX.cpp               |    42 +
 gatb-core/scripts/NewProject/XXX.hpp               |    51 +
 gatb-core/scripts/NewProject/main.cpp              |    39 +
 gatb-core/scripts/NewProject/package_tool.sh       |    87 +
 gatb-core/scripts/delivery_check_repo.sh           |    27 +
 gatb-core/scripts/delivery_compile.sh              |    47 +
 gatb-core/scripts/delivery_dump_system.sh          |    28 +
 gatb-core/scripts/git_tag_manager.sh               |   147 +
 gatb-core/scripts/github_release_api.sh            |   462 +
 gatb-core/scripts/github_release_manager.sh        |   142 +
 gatb-core/scripts/histodump.sh                     |     3 +
 gatb-core/scripts/histognuplot.sh                  |     7 +
 gatb-core/scripts/json-v2.sh                       |   205 +
 gatb-core/scripts/make_official_release.sh         |   171 +
 gatb-core/scripts/parse_gcc_output.py              |    45 +
 gatb-core/scripts/test-github_release_api.sh       |    79 +
 gatb-core/src/CMakeLists.txt                       |   101 +
 gatb-core/src/gatb/bank/api/IAlphabet.hpp          |    71 +
 gatb-core/src/gatb/bank/api/IBank.hpp              |   176 +
 gatb-core/src/gatb/bank/api/Sequence.hpp           |   276 +
 gatb-core/src/gatb/bank/impl/AbstractBank.hpp      |   103 +
 gatb-core/src/gatb/bank/impl/Alphabet.hpp          |    64 +
 gatb-core/src/gatb/bank/impl/Bank.cpp              |   207 +
 gatb-core/src/gatb/bank/impl/Bank.hpp              |   157 +
 gatb-core/src/gatb/bank/impl/BankAlbum.cpp         |   352 +
 gatb-core/src/gatb/bank/impl/BankAlbum.hpp         |   144 +
 gatb-core/src/gatb/bank/impl/BankBinary.cpp        |   565 +
 gatb-core/src/gatb/bank/impl/BankBinary.hpp        |   206 +
 gatb-core/src/gatb/bank/impl/BankComposite.hpp     |   191 +
 .../src/gatb/bank/impl/BankConverterAlgorithm.cpp  |   227 +
 .../src/gatb/bank/impl/BankConverterAlgorithm.hpp  |   106 +
 gatb-core/src/gatb/bank/impl/BankFasta.cpp         |   821 ++
 gatb-core/src/gatb/bank/impl/BankFasta.hpp         |   251 +
 gatb-core/src/gatb/bank/impl/BankHelpers.cpp       |    95 +
 gatb-core/src/gatb/bank/impl/BankHelpers.hpp       |   212 +
 gatb-core/src/gatb/bank/impl/BankRandom.cpp        |   147 +
 gatb-core/src/gatb/bank/impl/BankRandom.hpp        |   131 +
 gatb-core/src/gatb/bank/impl/BankSplitter.cpp      |   195 +
 gatb-core/src/gatb/bank/impl/BankSplitter.hpp      |   162 +
 gatb-core/src/gatb/bank/impl/BankStrings.hpp       |   149 +
 gatb-core/src/gatb/bank/impl/Banks.hpp             |    34 +
 gatb-core/src/gatb/bcalm2/ThreadPool.h             |   130 +
 gatb-core/src/gatb/bcalm2/bcalm_algo.cpp           |   857 ++
 gatb-core/src/gatb/bcalm2/bcalm_algo.hpp           |    42 +
 gatb-core/src/gatb/bcalm2/bglue_algo.cpp           |  1152 +++
 gatb-core/src/gatb/bcalm2/bglue_algo.hpp           |   147 +
 gatb-core/src/gatb/bcalm2/binSeq.cpp.unused4now    |   630 ++
 gatb-core/src/gatb/bcalm2/binSeq.h                 |    71 +
 gatb-core/src/gatb/bcalm2/logging.cpp              |    40 +
 gatb-core/src/gatb/bcalm2/logging.hpp              |     6 +
 gatb-core/src/gatb/bcalm2/ograph.cpp               |   417 +
 gatb-core/src/gatb/bcalm2/ograph.cpp.128bits       |   356 +
 gatb-core/src/gatb/bcalm2/ograph.h                 |    82 +
 gatb-core/src/gatb/bcalm2/ograph.h.128bits         |    69 +
 .../src/gatb/bcalm2/ographBin.cpp.notsureifused    |   132 +
 gatb-core/src/gatb/bcalm2/ographBin.h              |    55 +
 gatb-core/src/gatb/bcalm2/unionFind.hpp            |   608 ++
 gatb-core/src/gatb/debruijn/api/IContainerNode.hpp |    64 +
 .../src/gatb/debruijn/impl/BranchingAlgorithm.cpp  |   349 +
 .../src/gatb/debruijn/impl/BranchingAlgorithm.hpp  |   117 +
 gatb-core/src/gatb/debruijn/impl/ContainerNode.hpp |   192 +
 gatb-core/src/gatb/debruijn/impl/ExtremityInfo.hpp |    63 +
 gatb-core/src/gatb/debruijn/impl/Frontline.cpp     |   317 +
 gatb-core/src/gatb/debruijn/impl/Frontline.hpp     |   187 +
 gatb-core/src/gatb/debruijn/impl/Graph.cpp         |  3913 +++++++
 gatb-core/src/gatb/debruijn/impl/Graph.hpp         |  1354 +++
 gatb-core/src/gatb/debruijn/impl/GraphUnitigs.cpp  |  2106 ++++
 gatb-core/src/gatb/debruijn/impl/GraphUnitigs.hpp  |   442 +
 .../src/gatb/debruijn/impl/IterativeExtensions.cpp |   378 +
 .../src/gatb/debruijn/impl/IterativeExtensions.hpp |   137 +
 gatb-core/src/gatb/debruijn/impl/LinkTigs.cpp      |   374 +
 gatb-core/src/gatb/debruijn/impl/LinkTigs.hpp      |    40 +
 gatb-core/src/gatb/debruijn/impl/NodesDeleter.hpp  |   151 +
 .../src/gatb/debruijn/impl/Simplifications.cpp     |  1827 ++++
 .../src/gatb/debruijn/impl/Simplifications.hpp     |   121 +
 gatb-core/src/gatb/debruijn/impl/Terminator.cpp    |   339 +
 gatb-core/src/gatb/debruijn/impl/Terminator.hpp    |   326 +
 gatb-core/src/gatb/debruijn/impl/Traversal.cpp     |   859 ++
 gatb-core/src/gatb/debruijn/impl/Traversal.hpp     |   386 +
 .../debruijn/impl/UnitigsConstructionAlgorithm.cpp |   142 +
 .../debruijn/impl/UnitigsConstructionAlgorithm.hpp |    88 +
 gatb-core/src/gatb/debruijn/impl/dag_vector.hpp    |   325 +
 gatb-core/src/gatb/debruijn/impl/rank_vector.hpp   |   137 +
 gatb-core/src/gatb/gatb_core.hpp                   |   120 +
 gatb-core/src/gatb/kmer/api/ICountProcessor.hpp    |   189 +
 gatb-core/src/gatb/kmer/api/IModel.hpp             |   109 +
 gatb-core/src/gatb/kmer/impl/BankKmerIterator.hpp  |   281 +
 gatb-core/src/gatb/kmer/impl/BankKmers.hpp         |   222 +
 gatb-core/src/gatb/kmer/impl/BloomAlgorithm.cpp    |   205 +
 gatb-core/src/gatb/kmer/impl/BloomAlgorithm.hpp    |   100 +
 gatb-core/src/gatb/kmer/impl/BloomBuilder.cpp      |    30 +
 gatb-core/src/gatb/kmer/impl/BloomBuilder.hpp      |   188 +
 gatb-core/src/gatb/kmer/impl/Configuration.cpp     |   183 +
 gatb-core/src/gatb/kmer/impl/Configuration.hpp     |   121 +
 .../src/gatb/kmer/impl/ConfigurationAlgorithm.cpp  |   517 +
 .../src/gatb/kmer/impl/ConfigurationAlgorithm.hpp  |    79 +
 gatb-core/src/gatb/kmer/impl/CountProcessor.hpp    |    34 +
 .../src/gatb/kmer/impl/CountProcessorAbstract.hpp  |   112 +
 .../src/gatb/kmer/impl/CountProcessorChain.hpp     |   180 +
 .../src/gatb/kmer/impl/CountProcessorCutoff.hpp    |   155 +
 .../src/gatb/kmer/impl/CountProcessorDump.hpp      |   224 +
 .../src/gatb/kmer/impl/CountProcessorHistogram.hpp |   168 +
 .../src/gatb/kmer/impl/CountProcessorProxy.hpp     |   112 +
 .../src/gatb/kmer/impl/CountProcessorSolidity.hpp  |   343 +
 gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.cpp  |   708 ++
 gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.hpp  |   211 +
 gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.pri  |   163 +
 .../src/gatb/kmer/impl/DebloomAlgorithmFactory.hpp |    89 +
 .../gatb/kmer/impl/DebloomMinimizerAlgorithm.cpp   |   453 +
 .../gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp   |    90 +
 gatb-core/src/gatb/kmer/impl/LinearCounter.cpp     |    95 +
 gatb-core/src/gatb/kmer/impl/LinearCounter.hpp     |    81 +
 gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.cpp     |   367 +
 gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.hpp     |   190 +
 gatb-core/src/gatb/kmer/impl/Model.cpp             |    28 +
 gatb-core/src/gatb/kmer/impl/Model.hpp             |  1598 +++
 gatb-core/src/gatb/kmer/impl/Model.pri             |   542 +
 gatb-core/src/gatb/kmer/impl/ModelData.cpp         |   559 +
 gatb-core/src/gatb/kmer/impl/PartiInfo.cpp         |   314 +
 gatb-core/src/gatb/kmer/impl/PartiInfo.hpp         |   426 +
 gatb-core/src/gatb/kmer/impl/PartitionsCommand.cpp |  2243 ++++
 gatb-core/src/gatb/kmer/impl/PartitionsCommand.hpp |   394 +
 .../src/gatb/kmer/impl/RepartitionAlgorithm.cpp    |   547 +
 .../src/gatb/kmer/impl/RepartitionAlgorithm.hpp    |    96 +
 .../src/gatb/kmer/impl/Sequence2SuperKmer.hpp      |   209 +
 .../src/gatb/kmer/impl/SortingCountAlgorithm.cpp   |  1500 +++
 .../src/gatb/kmer/impl/SortingCountAlgorithm.hpp   |   270 +
 gatb-core/src/gatb/system/api/Exception.hpp        |   178 +
 gatb-core/src/gatb/system/api/IFileSystem.hpp      |   284 +
 gatb-core/src/gatb/system/api/IMemory.hpp          |   169 +
 gatb-core/src/gatb/system/api/ISmartPointer.hpp    |   270 +
 gatb-core/src/gatb/system/api/ISystemInfo.hpp      |   136 +
 gatb-core/src/gatb/system/api/IThread.hpp          |   235 +
 gatb-core/src/gatb/system/api/ITime.hpp            |    90 +
 gatb-core/src/gatb/system/api/build_info.hpp.in    |    27 +
 gatb-core/src/gatb/system/api/config.hpp.in        |    34 +
 gatb-core/src/gatb/system/api/config_sha1.hpp      |     1 +
 gatb-core/src/gatb/system/api/types.hpp            |    56 +
 .../src/gatb/system/impl/FileSystemCommon.cpp      |   341 +
 .../src/gatb/system/impl/FileSystemCommon.hpp      |   235 +
 gatb-core/src/gatb/system/impl/FileSystemLinux.cpp |   176 +
 gatb-core/src/gatb/system/impl/FileSystemLinux.hpp |    70 +
 gatb-core/src/gatb/system/impl/FileSystemMacos.cpp |   170 +
 gatb-core/src/gatb/system/impl/FileSystemMacos.hpp |    70 +
 gatb-core/src/gatb/system/impl/MemoryCommon.hpp    |   415 +
 gatb-core/src/gatb/system/impl/System.cpp          |   247 +
 gatb-core/src/gatb/system/impl/System.hpp          |   372 +
 .../src/gatb/system/impl/SystemInfoCommon.cpp      |   395 +
 .../src/gatb/system/impl/SystemInfoCommon.hpp      |   177 +
 gatb-core/src/gatb/system/impl/ThreadLinux.cpp     |   146 +
 gatb-core/src/gatb/system/impl/ThreadLinux.hpp     |    62 +
 gatb-core/src/gatb/system/impl/ThreadMacos.cpp     |   147 +
 gatb-core/src/gatb/system/impl/ThreadMacos.hpp     |    62 +
 gatb-core/src/gatb/system/impl/TimeCommon.hpp      |   173 +
 .../gatb/template/TemplateSpecialization1.cpp.in   |    19 +
 .../gatb/template/TemplateSpecialization10.cpp.in  |    40 +
 .../gatb/template/TemplateSpecialization2.cpp.in   |    19 +
 .../gatb/template/TemplateSpecialization3.cpp.in   |    19 +
 .../gatb/template/TemplateSpecialization4.cpp.in   |    17 +
 .../gatb/template/TemplateSpecialization5.cpp.in   |    28 +
 .../gatb/template/TemplateSpecialization6.cpp.in   |    33 +
 .../gatb/template/TemplateSpecialization7.cpp.in   |    34 +
 .../gatb/template/TemplateSpecialization8.cpp.in   |    27 +
 .../gatb/template/TemplateSpecialization9.cpp.in   |    35 +
 gatb-core/src/gatb/tools/collections/api/Bag.hpp   |    85 +
 .../src/gatb/tools/collections/api/Collection.hpp  |    86 +
 .../src/gatb/tools/collections/api/Container.hpp   |    62 +
 .../src/gatb/tools/collections/api/Iterable.hpp    |   107 +
 .../src/gatb/tools/collections/impl/BagCache.hpp   |   293 +
 .../src/gatb/tools/collections/impl/BagFile.hpp    |   303 +
 .../gatb/tools/collections/impl/BagPartition.hpp   |   150 +
 .../src/gatb/tools/collections/impl/Bloom.cpp      |    44 +
 .../src/gatb/tools/collections/impl/Bloom.hpp      |  1289 +++
 .../src/gatb/tools/collections/impl/BloomGroup.hpp |   499 +
 .../src/gatb/tools/collections/impl/BooPHF.hpp     |   395 +
 .../tools/collections/impl/CollectionAbstract.hpp  |   143 +
 .../tools/collections/impl/CollectionCache.hpp     |   127 +
 .../gatb/tools/collections/impl/ContainerSet.hpp   |    81 +
 .../src/gatb/tools/collections/impl/Hash16.hpp     |   343 +
 .../tools/collections/impl/IterableHelpers.hpp     |   155 +
 .../gatb/tools/collections/impl/IteratorFile.hpp   |   534 +
 .../src/gatb/tools/collections/impl/MapMPHF.hpp    |   242 +
 .../src/gatb/tools/collections/impl/OAHash.hpp     |   287 +
 .../gatb/tools/compression/CompressionUtils.hpp    |   226 +
 gatb-core/src/gatb/tools/compression/DnaCoder.cpp  |  1784 ++++
 gatb-core/src/gatb/tools/compression/DnaCoder.hpp  |   307 +
 .../src/gatb/tools/compression/HeaderCoder.cpp     |   789 ++
 .../src/gatb/tools/compression/HeaderCoder.hpp     |   186 +
 gatb-core/src/gatb/tools/compression/Leon.cpp      |  2434 +++++
 gatb-core/src/gatb/tools/compression/Leon.hpp      |   490 +
 .../src/gatb/tools/compression/RangeCoder.cpp      |   250 +
 .../src/gatb/tools/compression/RangeCoder.hpp      |   135 +
 .../src/gatb/tools/designpattern/api/ICommand.hpp  |   346 +
 .../src/gatb/tools/designpattern/api/IObserver.hpp |   175 +
 .../src/gatb/tools/designpattern/api/Iterator.hpp  |   273 +
 .../src/gatb/tools/designpattern/impl/Command.cpp  |   233 +
 .../src/gatb/tools/designpattern/impl/Command.hpp  |   139 +
 .../tools/designpattern/impl/IteratorHelpers.hpp   |  1023 ++
 .../src/gatb/tools/designpattern/impl/Observer.cpp |   146 +
 .../src/gatb/tools/designpattern/impl/Observer.hpp |   101 +
 gatb-core/src/gatb/tools/math/FastMinimizer.hpp    |   154 +
 gatb-core/src/gatb/tools/math/Integer.hpp          |   526 +
 gatb-core/src/gatb/tools/math/LargeInt.hpp         |   898 ++
 gatb-core/src/gatb/tools/math/LargeInt1.pri        |   319 +
 gatb-core/src/gatb/tools/math/LargeInt2.pri        |   285 +
 gatb-core/src/gatb/tools/math/NativeInt128.hpp     |   225 +
 gatb-core/src/gatb/tools/math/NativeInt16.hpp      |    92 +
 gatb-core/src/gatb/tools/math/NativeInt32.hpp      |    92 +
 gatb-core/src/gatb/tools/math/NativeInt64.hpp      |   269 +
 gatb-core/src/gatb/tools/math/NativeInt8.hpp       |    91 +
 gatb-core/src/gatb/tools/misc/api/Abundance.hpp    |   135 +
 gatb-core/src/gatb/tools/misc/api/Data.hpp         |   190 +
 gatb-core/src/gatb/tools/misc/api/Enums.hpp        |   340 +
 gatb-core/src/gatb/tools/misc/api/IHistogram.hpp   |   133 +
 .../src/gatb/tools/misc/api/IOptionsParser.hpp     |   187 +
 gatb-core/src/gatb/tools/misc/api/IProperty.hpp    |   300 +
 gatb-core/src/gatb/tools/misc/api/Macros.hpp       |    42 +
 gatb-core/src/gatb/tools/misc/api/Range.hpp        |   159 +
 .../src/gatb/tools/misc/api/StringsRepository.hpp  |   195 +
 gatb-core/src/gatb/tools/misc/api/Vector.hpp       |   150 +
 gatb-core/src/gatb/tools/misc/impl/Algorithm.cpp   |   126 +
 gatb-core/src/gatb/tools/misc/impl/Algorithm.hpp   |   213 +
 gatb-core/src/gatb/tools/misc/impl/Histogram.cpp   |   194 +
 gatb-core/src/gatb/tools/misc/impl/Histogram.hpp   |   229 +
 gatb-core/src/gatb/tools/misc/impl/HostInfo.hpp    |    78 +
 gatb-core/src/gatb/tools/misc/impl/LibraryInfo.hpp |    95 +
 .../src/gatb/tools/misc/impl/OptionsParser.cpp     |   587 ++
 .../src/gatb/tools/misc/impl/OptionsParser.hpp     |   394 +
 gatb-core/src/gatb/tools/misc/impl/Pool.hpp        |   439 +
 gatb-core/src/gatb/tools/misc/impl/Progress.cpp    |   380 +
 gatb-core/src/gatb/tools/misc/impl/Progress.hpp    |   279 +
 gatb-core/src/gatb/tools/misc/impl/Property.cpp    |  1024 ++
 gatb-core/src/gatb/tools/misc/impl/Property.hpp    |   299 +
 gatb-core/src/gatb/tools/misc/impl/StringLine.hpp  |    83 +
 gatb-core/src/gatb/tools/misc/impl/Stringify.hpp   |   108 +
 gatb-core/src/gatb/tools/misc/impl/TimeInfo.cpp    |   181 +
 gatb-core/src/gatb/tools/misc/impl/TimeInfo.hpp    |   185 +
 gatb-core/src/gatb/tools/misc/impl/Tokenizer.cpp   |   153 +
 gatb-core/src/gatb/tools/misc/impl/Tokenizer.hpp   |   116 +
 gatb-core/src/gatb/tools/misc/impl/Tool.cpp        |   431 +
 gatb-core/src/gatb/tools/misc/impl/Tool.hpp        |   319 +
 gatb-core/src/gatb/tools/misc/impl/XmlReader.cpp   |   302 +
 gatb-core/src/gatb/tools/misc/impl/XmlReader.hpp   |   204 +
 gatb-core/src/gatb/tools/storage/api/ICell.hpp     |    91 +
 gatb-core/src/gatb/tools/storage/impl/Cell.hpp     |    90 +
 .../src/gatb/tools/storage/impl/CollectionFile.hpp |   133 +
 .../src/gatb/tools/storage/impl/CollectionHDF5.hpp |   486 +
 .../tools/storage/impl/CollectionHDF5Patch.hpp     |   575 ++
 gatb-core/src/gatb/tools/storage/impl/Storage.cpp  |   593 ++
 gatb-core/src/gatb/tools/storage/impl/Storage.hpp  |   669 ++
 gatb-core/src/gatb/tools/storage/impl/Storage.tpp  |   603 ++
 .../src/gatb/tools/storage/impl/StorageFile.hpp    |   414 +
 .../src/gatb/tools/storage/impl/StorageHDF5.hpp    |   406 +
 .../src/gatb/tools/storage/impl/StorageTools.cpp   |    32 +
 .../src/gatb/tools/storage/impl/StorageTools.hpp   |   172 +
 gatb-core/test/CMakeLists.txt                      |    13 +
 gatb-core/test/benchmark/CMakeLists.txt            |    15 +
 gatb-core/test/benchmark/bench1.cpp                |   363 +
 gatb-core/test/benchmark/bench_bloom.cpp           |   279 +
 gatb-core/test/benchmark/bench_graph.cpp           |   432 +
 gatb-core/test/benchmark/bench_minim.cpp           |   239 +
 gatb-core/test/benchmark/bench_mphf.cpp            |   258 +
 .../db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.gz  |   Bin 0 -> 3891060 bytes
 ...IST7035_TAAGGCGA_L001_R1_001_5OK.fastq.leon-ref |   Bin 0 -> 3276064 bytes
 gatb-core/test/db/README.md                        |    22 +
 gatb-core/test/db/album.txt                        |     2 +
 gatb-core/test/db/celegans_reads.h5                |   Bin 0 -> 668632 bytes
 gatb-core/test/db/giab.hg002.2D_6K.fastq.gz        |   Bin 0 -> 23908774 bytes
 gatb-core/test/db/leon1.fastq                      |    28 +
 gatb-core/test/db/leon1.fastq.leon-ref             |   Bin 0 -> 134856 bytes
 gatb-core/test/db/leon2.fastq                      |    28 +
 gatb-core/test/db/leon2.fastq.leon-ref             |   Bin 0 -> 134856 bytes
 gatb-core/test/db/microsnp.fa                      |     4 +
 gatb-core/test/db/query.fa                         |   766 ++
 gatb-core/test/db/query.fa.gz                      |   Bin 0 -> 25963 bytes
 gatb-core/test/db/reads1.fa                        |  1498 +++
 gatb-core/test/db/reads1.fa.gz                     |   Bin 0 -> 29280 bytes
 gatb-core/test/db/reads1_list_ids.txt              |     2 +
 gatb-core/test/db/reads2.fa                        |  7252 +++++++++++++
 gatb-core/test/db/reads3.fa.gz                     |   Bin 0 -> 1565377 bytes
 gatb-core/test/db/sample.fastq                     |    28 +
 gatb-core/test/db/sample.fastq.gz                  |   Bin 0 -> 490 bytes
 gatb-core/test/db/sample1.fa                       |    40 +
 gatb-core/test/db/sample1.fa.gz                    |   Bin 0 -> 191 bytes
 gatb-core/test/db/sample2.fa                       |    20 +
 gatb-core/test/functional/test1/check/dump.txt     |     2 +
 .../functional/test1/check/k127/SRR1785130.props   |    17 +
 .../functional/test1/check/k31/ERR039477.props     |    17 +
 .../test1/check/k31/ERR039477_SRR387476.props      |    17 +
 .../functional/test1/check/k31/SRR1785130.props    |    17 +
 .../functional/test1/check/k31/SRR387476.props     |    17 +
 .../functional/test1/check/k63/ERR039477.props     |    17 +
 .../test1/check/k63/ERR039477_SRR387476.props      |    17 +
 .../functional/test1/check/k63/SRR1785130.props    |    17 +
 .../functional/test1/check/k63/SRR387476.props     |    17 +
 .../functional/test1/check/k95/ERR039477.props     |    17 +
 .../test1/check/k95/ERR039477_SRR387476.props      |    17 +
 .../functional/test1/check/k95/SRR1785130.props    |    17 +
 .../functional/test1/check/k95/SRR387476.props     |    17 +
 gatb-core/test/functional/test1/run.sh             |   168 +
 gatb-core/test/jenkins/finalize-release-debian.sh  |    48 +
 gatb-core/test/jenkins/finalize-release-macos.sh   |    56 +
 gatb-core/test/jenkins/leon/README.md              |    62 +
 gatb-core/test/jenkins/leon/download.sh            |    72 +
 gatb-core/test/jenkins/leon/test_integrity.sh      |    31 +
 .../leon/tool-leon-functional-tests-compile.sh     |    80 +
 .../leon/tool-leon-functional-tests-test.sh        |   266 +
 gatb-core/test/jenkins/publish-doc-api.sh          |    91 +
 .../jenkins/test-bin-debian7-64bits-gcc-4.7.sh     |    94 +
 .../jenkins/test-bin-macos-10.9.5-gcc-4.2.1.sh     |    84 +
 .../test-docker-gatb-core-compile-clang36.sh       |    42 +
 .../test-snippets-debian7-64bits-gcc-4.7.sh        |   205 +
 .../jenkins/test-suite-debian7-64bits-gcc-4.7.sh   |   140 +
 .../test/jenkins/test-suite-fedora20-gcc-4.8.sh    |   137 +
 .../jenkins/test-suite-macos-10.9.5-clang-6.0.sh   |    97 +
 .../jenkins/test-suite-macos-10.9.5-gcc-4.2.1.sh   |   124 +
 .../test-valgrind-debian7-64bits-gcc-4.7.sh        |   119 +
 .../test/slaves/ubuntu16-shell-provisioner.sh      |    99 +
 gatb-core/test/unit/CMakeLists.txt                 |    30 +
 gatb-core/test/unit/src/CppunitCommon.hpp          |    91 +
 gatb-core/test/unit/src/bank/TestBank.cpp          |  1105 ++
 gatb-core/test/unit/src/bank/TestLeon.cpp          |   434 +
 gatb-core/test/unit/src/debruijn/TestDebruijn.cpp  |  1263 +++
 .../test/unit/src/debruijn/TestDebruijnUnitigs.cpp |   984 ++
 .../test/unit/src/debruijn/TestSimplifications.cpp |   363 +
 .../src/debruijn/TestSimplificationsUnitigs.cpp    |   421 +
 gatb-core/test/unit/src/kmer/TestDSK.cpp           |   716 ++
 gatb-core/test/unit/src/kmer/TestDebloom.cpp       |   173 +
 gatb-core/test/unit/src/kmer/TestKmer.cpp          |   599 ++
 gatb-core/test/unit/src/kmer/TestKmerBank.cpp      |   167 +
 gatb-core/test/unit/src/kmer/TestMPHF.cpp          |   334 +
 gatb-core/test/unit/src/main.cpp                   |   108 +
 gatb-core/test/unit/src/system/TestSystem.cpp      |   974 ++
 .../test/unit/src/tools/collections/TestBag.cpp    |   204 +
 .../unit/src/tools/collections/TestCollection.cpp  |   139 +
 .../unit/src/tools/collections/TestContainer.cpp   |   144 +
 .../unit/src/tools/collections/TestIterable.cpp    |    59 +
 .../test/unit/src/tools/collections/TestMap.cpp    |   237 +
 .../unit/src/tools/designpattern/TestIterators.cpp |   372 +
 gatb-core/test/unit/src/tools/math/TestMath.cpp    |   184 +
 gatb-core/test/unit/src/tools/misc/TestMisc.cpp    |   418 +
 .../test/unit/src/tools/storage/TestStorage.cpp    |   460 +
 gatb-core/thirdparty/BooPHF/BooPHF.h               |  1223 +++
 gatb-core/thirdparty/CMakeLists.txt                |    69 +
 gatb-core/thirdparty/boost/aligned_storage.hpp     |   143 +
 gatb-core/thirdparty/boost/assert.hpp              |    78 +
 gatb-core/thirdparty/boost/blank.hpp               |   106 +
 gatb-core/thirdparty/boost/blank_fwd.hpp           |    22 +
 gatb-core/thirdparty/boost/call_traits.hpp         |    20 +
 gatb-core/thirdparty/boost/checked_delete.hpp      |    17 +
 gatb-core/thirdparty/boost/config.hpp              |    67 +
 .../thirdparty/boost/config/abi/borland_prefix.hpp |    27 +
 .../thirdparty/boost/config/abi/borland_suffix.hpp |    12 +
 .../thirdparty/boost/config/abi/msvc_prefix.hpp    |    22 +
 .../thirdparty/boost/config/abi/msvc_suffix.hpp    |     8 +
 gatb-core/thirdparty/boost/config/abi_prefix.hpp   |    25 +
 gatb-core/thirdparty/boost/config/abi_suffix.hpp   |    27 +
 gatb-core/thirdparty/boost/config/auto_link.hpp    |   439 +
 .../thirdparty/boost/config/compiler/borland.hpp   |   318 +
 .../thirdparty/boost/config/compiler/clang.hpp     |   271 +
 .../thirdparty/boost/config/compiler/codegear.hpp  |   220 +
 .../thirdparty/boost/config/compiler/comeau.hpp    |    59 +
 .../boost/config/compiler/common_edg.hpp           |   143 +
 .../boost/config/compiler/compaq_cxx.hpp           |    19 +
 .../thirdparty/boost/config/compiler/cray.hpp      |    92 +
 .../boost/config/compiler/digitalmars.hpp          |   124 +
 gatb-core/thirdparty/boost/config/compiler/gcc.hpp |   296 +
 .../thirdparty/boost/config/compiler/gcc_xml.hpp   |    95 +
 .../boost/config/compiler/greenhills.hpp           |    28 +
 .../thirdparty/boost/config/compiler/hp_acc.hpp    |   145 +
 .../thirdparty/boost/config/compiler/intel.hpp     |   529 +
 gatb-core/thirdparty/boost/config/compiler/kai.hpp |    33 +
 .../boost/config/compiler/metrowerks.hpp           |   179 +
 gatb-core/thirdparty/boost/config/compiler/mpw.hpp |   121 +
 .../thirdparty/boost/config/compiler/nvcc.hpp      |    16 +
 .../thirdparty/boost/config/compiler/pathscale.hpp |   114 +
 gatb-core/thirdparty/boost/config/compiler/pgi.hpp |   155 +
 .../boost/config/compiler/sgi_mipspro.hpp          |    29 +
 .../thirdparty/boost/config/compiler/sunpro_cc.hpp |   194 +
 .../thirdparty/boost/config/compiler/vacpp.hpp     |   162 +
 .../thirdparty/boost/config/compiler/visualc.hpp   |   297 +
 .../thirdparty/boost/config/compiler/xlcpp.hpp     |   258 +
 gatb-core/thirdparty/boost/config/no_tr1/cmath.hpp |    28 +
 .../thirdparty/boost/config/no_tr1/complex.hpp     |    28 +
 .../thirdparty/boost/config/no_tr1/functional.hpp  |    28 +
 .../thirdparty/boost/config/no_tr1/memory.hpp      |    28 +
 .../thirdparty/boost/config/no_tr1/utility.hpp     |    28 +
 gatb-core/thirdparty/boost/config/platform/aix.hpp |    33 +
 .../thirdparty/boost/config/platform/amigaos.hpp   |    15 +
 .../thirdparty/boost/config/platform/beos.hpp      |    26 +
 gatb-core/thirdparty/boost/config/platform/bsd.hpp |    86 +
 .../thirdparty/boost/config/platform/cray.hpp      |    18 +
 .../thirdparty/boost/config/platform/cygwin.hpp    |    58 +
 .../thirdparty/boost/config/platform/haiku.hpp     |    31 +
 .../thirdparty/boost/config/platform/hpux.hpp      |    87 +
 .../thirdparty/boost/config/platform/irix.hpp      |    31 +
 .../thirdparty/boost/config/platform/linux.hpp     |   105 +
 .../thirdparty/boost/config/platform/macos.hpp     |    87 +
 .../thirdparty/boost/config/platform/qnxnto.hpp    |    31 +
 .../thirdparty/boost/config/platform/solaris.hpp   |    31 +
 .../thirdparty/boost/config/platform/symbian.hpp   |    97 +
 gatb-core/thirdparty/boost/config/platform/vms.hpp |    25 +
 .../thirdparty/boost/config/platform/vxworks.hpp   |   369 +
 .../thirdparty/boost/config/platform/win32.hpp     |    82 +
 .../thirdparty/boost/config/posix_features.hpp     |    95 +
 .../thirdparty/boost/config/requires_threads.hpp   |    92 +
 .../boost/config/select_compiler_config.hpp        |   148 +
 .../boost/config/select_platform_config.hpp        |   133 +
 .../boost/config/select_stdlib_config.hpp          |   105 +
 .../thirdparty/boost/config/stdlib/dinkumware.hpp  |   189 +
 .../thirdparty/boost/config/stdlib/libcomo.hpp     |    83 +
 .../thirdparty/boost/config/stdlib/libcpp.hpp      |    80 +
 .../thirdparty/boost/config/stdlib/libstdcpp3.hpp  |   277 +
 .../thirdparty/boost/config/stdlib/modena.hpp      |    69 +
 gatb-core/thirdparty/boost/config/stdlib/msl.hpp   |    88 +
 .../thirdparty/boost/config/stdlib/roguewave.hpp   |   198 +
 gatb-core/thirdparty/boost/config/stdlib/sgi.hpp   |   158 +
 .../thirdparty/boost/config/stdlib/stlport.hpp     |   248 +
 gatb-core/thirdparty/boost/config/stdlib/vacpp.hpp |    64 +
 gatb-core/thirdparty/boost/config/suffix.hpp       |   995 ++
 gatb-core/thirdparty/boost/config/user.hpp         |   133 +
 .../thirdparty/boost/config/warning_disable.hpp    |    47 +
 gatb-core/thirdparty/boost/core/addressof.hpp      |   162 +
 gatb-core/thirdparty/boost/core/checked_delete.hpp |    69 +
 gatb-core/thirdparty/boost/core/demangle.hpp       |   121 +
 gatb-core/thirdparty/boost/core/enable_if.hpp      |   119 +
 .../boost/core/explicit_operator_bool.hpp          |   154 +
 gatb-core/thirdparty/boost/core/ignore_unused.hpp  |    70 +
 gatb-core/thirdparty/boost/core/is_same.hpp        |    40 +
 .../thirdparty/boost/core/lightweight_test.hpp     |   171 +
 .../boost/core/lightweight_test_trait.hpp          |    56 +
 .../boost/core/no_exceptions_support.hpp           |    44 +
 gatb-core/thirdparty/boost/core/noncopyable.hpp    |    48 +
 gatb-core/thirdparty/boost/core/null_deleter.hpp   |    44 +
 gatb-core/thirdparty/boost/core/ref.hpp            |   301 +
 gatb-core/thirdparty/boost/core/scoped_enum.hpp    |   192 +
 gatb-core/thirdparty/boost/core/swap.hpp           |    60 +
 gatb-core/thirdparty/boost/core/typeinfo.hpp       |   151 +
 .../thirdparty/boost/core/underlying_type.hpp      |    79 +
 gatb-core/thirdparty/boost/cstdint.hpp             |   546 +
 gatb-core/thirdparty/boost/current_function.hpp    |    71 +
 gatb-core/thirdparty/boost/detail/algorithm.hpp    |    82 +
 .../boost/detail/allocator_utilities.hpp           |   187 +
 gatb-core/thirdparty/boost/detail/atomic_count.hpp |    21 +
 .../boost/detail/atomic_redef_macros.hpp           |    19 +
 .../boost/detail/atomic_undef_macros.hpp           |    39 +
 .../thirdparty/boost/detail/basic_pointerbuf.hpp   |   139 +
 .../thirdparty/boost/detail/binary_search.hpp      |   216 +
 gatb-core/thirdparty/boost/detail/bitmask.hpp      |    47 +
 gatb-core/thirdparty/boost/detail/call_traits.hpp  |   172 +
 .../thirdparty/boost/detail/catch_exceptions.hpp   |   142 +
 .../thirdparty/boost/detail/compressed_pair.hpp    |   443 +
 .../thirdparty/boost/detail/container_fwd.hpp      |   157 +
 .../thirdparty/boost/detail/dynamic_bitset.hpp     |   241 +
 gatb-core/thirdparty/boost/detail/endian.hpp       |    11 +
 gatb-core/thirdparty/boost/detail/fenv.hpp         |   101 +
 .../boost/detail/has_default_constructor.hpp       |    29 +
 gatb-core/thirdparty/boost/detail/identifier.hpp   |    87 +
 .../thirdparty/boost/detail/indirect_traits.hpp    |   204 +
 gatb-core/thirdparty/boost/detail/interlocked.hpp  |   218 +
 .../thirdparty/boost/detail/is_incrementable.hpp   |   133 +
 gatb-core/thirdparty/boost/detail/is_sorted.hpp    |    56 +
 gatb-core/thirdparty/boost/detail/is_xxx.hpp       |    27 +
 gatb-core/thirdparty/boost/detail/iterator.hpp     |    26 +
 .../thirdparty/boost/detail/lcast_precision.hpp    |   184 +
 .../thirdparty/boost/detail/lightweight_main.hpp   |    36 +
 .../thirdparty/boost/detail/lightweight_mutex.hpp  |    22 +
 .../thirdparty/boost/detail/lightweight_test.hpp   |    17 +
 .../boost/detail/lightweight_test_report.hpp       |    56 +
 .../thirdparty/boost/detail/lightweight_thread.hpp |   135 +
 .../boost/detail/named_template_params.hpp         |   177 +
 .../boost/detail/no_exceptions_support.hpp         |    17 +
 .../thirdparty/boost/detail/numeric_traits.hpp     |   182 +
 .../thirdparty/boost/detail/ob_compressed_pair.hpp |   499 +
 .../thirdparty/boost/detail/quick_allocator.hpp    |    23 +
 .../thirdparty/boost/detail/reference_content.hpp  |   120 +
 .../boost/detail/scoped_enum_emulation.hpp         |    17 +
 gatb-core/thirdparty/boost/detail/select_type.hpp  |    36 +
 gatb-core/thirdparty/boost/detail/sp_typeinfo.hpp  |    36 +
 .../thirdparty/boost/detail/templated_streams.hpp  |    74 +
 .../thirdparty/boost/detail/utf8_codecvt_facet.hpp |   214 +
 .../thirdparty/boost/detail/utf8_codecvt_facet.ipp |   283 +
 .../boost/detail/winapi/GetCurrentProcess.hpp      |    29 +
 .../boost/detail/winapi/GetCurrentThread.hpp       |    38 +
 .../boost/detail/winapi/GetLastError.hpp           |    31 +
 .../boost/detail/winapi/GetProcessTimes.hpp        |    39 +
 .../boost/detail/winapi/GetThreadTimes.hpp         |    37 +
 .../thirdparty/boost/detail/winapi/LocalFree.hpp   |    33 +
 .../thirdparty/boost/detail/winapi/basic_types.hpp |   134 +
 .../thirdparty/boost/detail/winapi/config.hpp      |    53 +
 gatb-core/thirdparty/boost/detail/winapi/crypt.hpp |    88 +
 .../boost/detail/winapi/directory_management.hpp   |    46 +
 gatb-core/thirdparty/boost/detail/winapi/dll.hpp   |    86 +
 .../boost/detail/winapi/error_handling.hpp         |    93 +
 .../boost/detail/winapi/file_management.hpp        |   130 +
 .../thirdparty/boost/detail/winapi/handles.hpp     |    46 +
 .../thirdparty/boost/detail/winapi/memory.hpp      |    60 +
 .../thirdparty/boost/detail/winapi/process.hpp     |    36 +
 .../thirdparty/boost/detail/winapi/security.hpp    |    65 +
 .../boost/detail/winapi/synchronization.hpp        |   293 +
 .../thirdparty/boost/detail/winapi/system.hpp      |    62 +
 .../thirdparty/boost/detail/winapi/thread.hpp      |    49 +
 .../thirdparty/boost/detail/winapi/thread_pool.hpp |    96 +
 gatb-core/thirdparty/boost/detail/winapi/time.hpp  |   105 +
 .../thirdparty/boost/detail/winapi/timers.hpp      |    44 +
 gatb-core/thirdparty/boost/detail/winapi/tls.hpp   |    49 +
 .../boost/detail/winapi/waitable_timer.hpp         |   110 +
 gatb-core/thirdparty/boost/detail/workaround.hpp   |   267 +
 gatb-core/thirdparty/boost/exception.hpp           |    11 +
 gatb-core/thirdparty/boost/exception/N3757.hpp     |    46 +
 gatb-core/thirdparty/boost/exception/all.hpp       |    36 +
 .../boost/exception/current_exception_cast.hpp     |    43 +
 .../exception/detail/clone_current_exception.hpp   |    56 +
 .../boost/exception/detail/error_info_impl.hpp     |    74 +
 .../boost/exception/detail/exception_ptr.hpp       |   513 +
 .../exception/detail/is_output_streamable.hpp      |    60 +
 .../boost/exception/detail/object_hex_dump.hpp     |    50 +
 .../boost/exception/detail/type_info.hpp           |    81 +
 .../boost/exception/diagnostic_information.hpp     |   201 +
 .../boost/exception/enable_current_exception.hpp   |     6 +
 .../boost/exception/enable_error_info.hpp          |     6 +
 .../boost/exception/errinfo_api_function.hpp       |    22 +
 .../thirdparty/boost/exception/errinfo_at_line.hpp |    18 +
 .../thirdparty/boost/exception/errinfo_errno.hpp   |    44 +
 .../boost/exception/errinfo_file_handle.hpp        |    20 +
 .../boost/exception/errinfo_file_name.hpp          |    26 +
 .../boost/exception/errinfo_file_open_mode.hpp     |    26 +
 .../boost/exception/errinfo_nested_exception.hpp   |    18 +
 .../boost/exception/errinfo_type_info_name.hpp     |    23 +
 .../thirdparty/boost/exception/error_info.hpp      |     9 +
 gatb-core/thirdparty/boost/exception/exception.hpp |   489 +
 .../thirdparty/boost/exception/get_error_info.hpp  |   130 +
 gatb-core/thirdparty/boost/exception/info.hpp      |   198 +
 .../thirdparty/boost/exception/info_tuple.hpp      |   100 +
 gatb-core/thirdparty/boost/exception/to_string.hpp |    88 +
 .../thirdparty/boost/exception/to_string_stub.hpp  |   117 +
 gatb-core/thirdparty/boost/exception_ptr.hpp       |    11 +
 gatb-core/thirdparty/boost/functional.hpp          |   548 +
 gatb-core/thirdparty/boost/functional/factory.hpp  |   179 +
 .../boost/functional/forward_adapter.hpp           |   472 +
 gatb-core/thirdparty/boost/functional/hash.hpp     |     7 +
 .../functional/hash/detail/float_functions.hpp     |   336 +
 .../boost/functional/hash/detail/hash_float.hpp    |   271 +
 .../boost/functional/hash/detail/limits.hpp        |    62 +
 .../boost/functional/hash/extensions.hpp           |   318 +
 .../thirdparty/boost/functional/hash/hash.hpp      |   559 +
 .../thirdparty/boost/functional/hash/hash_fwd.hpp  |    36 +
 gatb-core/thirdparty/boost/functional/hash_fwd.hpp |    11 +
 .../functional/lightweight_forward_adapter.hpp     |   259 +
 .../boost/functional/overloaded_function.hpp       |   311 +
 .../functional/overloaded_function/config.hpp      |    50 +
 .../functional/overloaded_function/detail/base.hpp |    86 +
 .../overloaded_function/detail/function_type.hpp   |    85 +
 .../thirdparty/boost/functional/value_factory.hpp  |    69 +
 .../boost/math/bindings/detail/big_digamma.hpp     |   295 +
 .../boost/math/bindings/detail/big_lanczos.hpp     |   777 ++
 .../thirdparty/boost/math/bindings/e_float.hpp     |   809 ++
 gatb-core/thirdparty/boost/math/bindings/mpfr.hpp  |   954 ++
 .../thirdparty/boost/math/bindings/mpreal.hpp      |   898 ++
 gatb-core/thirdparty/boost/math/bindings/rr.hpp    |   884 ++
 gatb-core/thirdparty/boost/math/common_factor.hpp  |    16 +
 .../thirdparty/boost/math/common_factor_ct.hpp     |    97 +
 .../thirdparty/boost/math/common_factor_rt.hpp     |   460 +
 gatb-core/thirdparty/boost/math/complex.hpp        |    32 +
 gatb-core/thirdparty/boost/math/complex/acos.hpp   |   245 +
 gatb-core/thirdparty/boost/math/complex/acosh.hpp  |    34 +
 gatb-core/thirdparty/boost/math/complex/asin.hpp   |   252 +
 gatb-core/thirdparty/boost/math/complex/asinh.hpp  |    32 +
 gatb-core/thirdparty/boost/math/complex/atan.hpp   |    36 +
 gatb-core/thirdparty/boost/math/complex/atanh.hpp  |   214 +
 .../thirdparty/boost/math/complex/details.hpp      |    96 +
 gatb-core/thirdparty/boost/math/complex/fabs.hpp   |    23 +
 .../boost/math/concepts/distributions.hpp          |   491 +
 .../boost/math/concepts/real_concept.hpp           |   451 +
 .../boost/math/concepts/real_type_concept.hpp      |   122 +
 .../boost/math/concepts/std_real_concept.hpp       |   405 +
 .../boost/math/constants/calculate_constants.hpp   |   968 ++
 .../thirdparty/boost/math/constants/constants.hpp  |   359 +
 gatb-core/thirdparty/boost/math/constants/info.hpp |   163 +
 .../boost/math/cstdfloat/cstdfloat_cmath.hpp       |   600 ++
 .../boost/math/cstdfloat/cstdfloat_complex.hpp     |    38 +
 .../boost/math/cstdfloat/cstdfloat_complex_std.hpp |   641 ++
 .../boost/math/cstdfloat/cstdfloat_iostream.hpp    |   771 ++
 .../boost/math/cstdfloat/cstdfloat_limits.hpp      |    75 +
 .../boost/math/cstdfloat/cstdfloat_types.hpp       |   440 +
 gatb-core/thirdparty/boost/math/distributions.hpp  |    53 +
 .../boost/math/distributions/arcsine.hpp           |   535 +
 .../boost/math/distributions/bernoulli.hpp         |   336 +
 .../thirdparty/boost/math/distributions/beta.hpp   |   541 +
 .../boost/math/distributions/binomial.hpp          |   728 ++
 .../thirdparty/boost/math/distributions/cauchy.hpp |   362 +
 .../boost/math/distributions/chi_squared.hpp       |   364 +
 .../boost/math/distributions/complement.hpp        |   195 +
 .../distributions/detail/common_error_handling.hpp |   194 +
 .../distributions/detail/derived_accessors.hpp     |   163 +
 .../math/distributions/detail/generic_mode.hpp     |   149 +
 .../math/distributions/detail/generic_quantile.hpp |    91 +
 .../distributions/detail/hypergeometric_cdf.hpp    |   100 +
 .../distributions/detail/hypergeometric_pdf.hpp    |   488 +
 .../detail/hypergeometric_quantile.hpp             |   199 +
 .../distributions/detail/inv_discrete_quantile.hpp |   571 ++
 .../boost/math/distributions/exponential.hpp       |   275 +
 .../boost/math/distributions/extreme_value.hpp     |   300 +
 .../boost/math/distributions/find_location.hpp     |   146 +
 .../boost/math/distributions/find_scale.hpp        |   211 +
 .../boost/math/distributions/fisher_f.hpp          |   387 +
 .../thirdparty/boost/math/distributions/fwd.hpp    |   153 +
 .../thirdparty/boost/math/distributions/gamma.hpp  |   349 +
 .../boost/math/distributions/geometric.hpp         |   516 +
 .../boost/math/distributions/hyperexponential.hpp  |   634 ++
 .../boost/math/distributions/hypergeometric.hpp    |   293 +
 .../math/distributions/inverse_chi_squared.hpp     |   391 +
 .../boost/math/distributions/inverse_gamma.hpp     |   461 +
 .../boost/math/distributions/inverse_gaussian.hpp  |   512 +
 .../boost/math/distributions/laplace.hpp           |   350 +
 .../boost/math/distributions/logistic.hpp          |   299 +
 .../boost/math/distributions/lognormal.hpp         |   341 +
 .../boost/math/distributions/negative_binomial.hpp |   607 ++
 .../boost/math/distributions/non_central_beta.hpp  |   925 ++
 .../math/distributions/non_central_chi_squared.hpp |   996 ++
 .../boost/math/distributions/non_central_f.hpp     |   410 +
 .../boost/math/distributions/non_central_t.hpp     |  1202 +++
 .../thirdparty/boost/math/distributions/normal.hpp |   329 +
 .../thirdparty/boost/math/distributions/pareto.hpp |   444 +
 .../boost/math/distributions/poisson.hpp           |   527 +
 .../boost/math/distributions/rayleigh.hpp          |   301 +
 .../boost/math/distributions/skew_normal.hpp       |   719 ++
 .../boost/math/distributions/students_t.hpp        |   490 +
 .../boost/math/distributions/triangular.hpp        |   523 +
 .../boost/math/distributions/uniform.hpp           |   379 +
 .../boost/math/distributions/weibull.hpp           |   395 +
 gatb-core/thirdparty/boost/math/octonion.hpp       |  4250 ++++++++
 .../boost/math/policies/error_handling.hpp         |   805 ++
 .../thirdparty/boost/math/policies/policy.hpp      |   996 ++
 gatb-core/thirdparty/boost/math/quaternion.hpp     |  1773 ++++
 .../thirdparty/boost/math/special_functions.hpp    |    71 +
 .../boost/math/special_functions/acosh.hpp         |   104 +
 .../boost/math/special_functions/airy.hpp          |   469 +
 .../boost/math/special_functions/asinh.hpp         |   106 +
 .../boost/math/special_functions/atanh.hpp         |   117 +
 .../boost/math/special_functions/bernoulli.hpp     |   143 +
 .../boost/math/special_functions/bessel.hpp        |   786 ++
 .../boost/math/special_functions/bessel_prime.hpp  |   359 +
 .../boost/math/special_functions/beta.hpp          |  1529 +++
 .../boost/math/special_functions/binomial.hpp      |    82 +
 .../boost/math/special_functions/cbrt.hpp          |   180 +
 .../boost/math/special_functions/cos_pi.hpp        |    82 +
 .../special_functions/detail/airy_ai_bi_zero.hpp   |   160 +
 .../special_functions/detail/bernoulli_details.hpp |   653 ++
 .../detail/bessel_derivatives_linear.hpp           |    75 +
 .../math/special_functions/detail/bessel_i0.hpp    |   129 +
 .../math/special_functions/detail/bessel_i1.hpp    |   133 +
 .../math/special_functions/detail/bessel_ik.hpp    |   449 +
 .../math/special_functions/detail/bessel_j0.hpp    |   193 +
 .../math/special_functions/detail/bessel_j1.hpp    |   199 +
 .../math/special_functions/detail/bessel_jn.hpp    |   134 +
 .../math/special_functions/detail/bessel_jy.hpp    |   589 ++
 .../special_functions/detail/bessel_jy_asym.hpp    |   205 +
 .../detail/bessel_jy_derivatives_asym.hpp          |   141 +
 .../detail/bessel_jy_derivatives_series.hpp        |   220 +
 .../special_functions/detail/bessel_jy_series.hpp  |   261 +
 .../special_functions/detail/bessel_jy_zero.hpp    |   617 ++
 .../math/special_functions/detail/bessel_k0.hpp    |   152 +
 .../math/special_functions/detail/bessel_k1.hpp    |   148 +
 .../math/special_functions/detail/bessel_kn.hpp    |    86 +
 .../math/special_functions/detail/bessel_y0.hpp    |   224 +
 .../math/special_functions/detail/bessel_y1.hpp    |   196 +
 .../math/special_functions/detail/bessel_yn.hpp    |   104 +
 .../math/special_functions/detail/erf_inv.hpp      |   536 +
 .../math/special_functions/detail/fp_traits.hpp    |   580 ++
 .../math/special_functions/detail/gamma_inva.hpp   |   233 +
 .../math/special_functions/detail/ibeta_inv_ab.hpp |   328 +
 .../special_functions/detail/ibeta_inverse.hpp     |   993 ++
 .../boost/math/special_functions/detail/iconv.hpp  |    42 +
 .../special_functions/detail/igamma_inverse.hpp    |   551 +
 .../math/special_functions/detail/igamma_large.hpp |   768 ++
 .../math/special_functions/detail/lanczos_sse2.hpp |   204 +
 .../math/special_functions/detail/lgamma_small.hpp |   522 +
 .../math/special_functions/detail/polygamma.hpp    |   538 +
 .../math/special_functions/detail/round_fwd.hpp    |    93 +
 .../detail/t_distribution_inv.hpp                  |   549 +
 .../detail/unchecked_bernoulli.hpp                 |   700 ++
 .../detail/unchecked_factorial.hpp                 |   625 ++
 .../boost/math/special_functions/digamma.hpp       |   628 ++
 .../boost/math/special_functions/ellint_1.hpp      |   201 +
 .../boost/math/special_functions/ellint_2.hpp      |   198 +
 .../boost/math/special_functions/ellint_3.hpp      |   376 +
 .../boost/math/special_functions/ellint_d.hpp      |   180 +
 .../boost/math/special_functions/ellint_rc.hpp     |   114 +
 .../boost/math/special_functions/ellint_rd.hpp     |   201 +
 .../boost/math/special_functions/ellint_rf.hpp     |   174 +
 .../boost/math/special_functions/ellint_rg.hpp     |   136 +
 .../boost/math/special_functions/ellint_rj.hpp     |   302 +
 .../boost/math/special_functions/erf.hpp           |  1155 +++
 .../boost/math/special_functions/expint.hpp        |  1672 +++
 .../boost/math/special_functions/expm1.hpp         |   343 +
 .../boost/math/special_functions/factorials.hpp    |   268 +
 .../boost/math/special_functions/fpclassify.hpp    |   606 ++
 .../boost/math/special_functions/gamma.hpp         |  2035 ++++
 .../boost/math/special_functions/hankel.hpp        |   180 +
 .../boost/math/special_functions/hermite.hpp       |    76 +
 .../boost/math/special_functions/heuman_lambda.hpp |    87 +
 .../boost/math/special_functions/hypot.hpp         |    86 +
 .../math/special_functions/jacobi_elliptic.hpp     |   321 +
 .../boost/math/special_functions/jacobi_zeta.hpp   |    74 +
 .../boost/math/special_functions/laguerre.hpp      |   139 +
 .../boost/math/special_functions/lanczos.hpp       |  1296 +++
 .../boost/math/special_functions/legendre.hpp      |   194 +
 .../boost/math/special_functions/log1p.hpp         |   503 +
 .../boost/math/special_functions/math_fwd.hpp      |  1573 +++
 .../boost/math/special_functions/modf.hpp          |    71 +
 .../boost/math/special_functions/next.hpp          |   500 +
 .../special_functions/nonfinite_num_facets.hpp     |   592 ++
 .../boost/math/special_functions/owens_t.hpp       |  1071 ++
 .../boost/math/special_functions/polygamma.hpp     |    83 +
 .../boost/math/special_functions/pow.hpp           |   148 +
 .../boost/math/special_functions/powm1.hpp         |    61 +
 .../boost/math/special_functions/prime.hpp         |  1220 +++
 .../boost/math/special_functions/round.hpp         |   132 +
 .../boost/math/special_functions/sign.hpp          |   194 +
 .../boost/math/special_functions/sin_pi.hpp        |    78 +
 .../boost/math/special_functions/sinc.hpp          |   145 +
 .../boost/math/special_functions/sinhc.hpp         |   156 +
 .../math/special_functions/spherical_harmonic.hpp  |   205 +
 .../boost/math/special_functions/sqrt1pm1.hpp      |    48 +
 .../boost/math/special_functions/trigamma.hpp      |   469 +
 .../boost/math/special_functions/trunc.hpp         |   111 +
 .../boost/math/special_functions/zeta.hpp          |  1086 ++
 .../thirdparty/boost/math/tools/big_constant.hpp   |    86 +
 gatb-core/thirdparty/boost/math/tools/config.hpp   |   409 +
 .../math/tools/detail/polynomial_horner1_10.hpp    |    84 +
 .../math/tools/detail/polynomial_horner1_11.hpp    |    90 +
 .../math/tools/detail/polynomial_horner1_12.hpp    |    96 +
 .../math/tools/detail/polynomial_horner1_13.hpp    |   102 +
 .../math/tools/detail/polynomial_horner1_14.hpp    |   108 +
 .../math/tools/detail/polynomial_horner1_15.hpp    |   114 +
 .../math/tools/detail/polynomial_horner1_16.hpp    |   120 +
 .../math/tools/detail/polynomial_horner1_17.hpp    |   126 +
 .../math/tools/detail/polynomial_horner1_18.hpp    |   132 +
 .../math/tools/detail/polynomial_horner1_19.hpp    |   138 +
 .../math/tools/detail/polynomial_horner1_2.hpp     |    36 +
 .../math/tools/detail/polynomial_horner1_20.hpp    |   144 +
 .../math/tools/detail/polynomial_horner1_3.hpp     |    42 +
 .../math/tools/detail/polynomial_horner1_4.hpp     |    48 +
 .../math/tools/detail/polynomial_horner1_5.hpp     |    54 +
 .../math/tools/detail/polynomial_horner1_6.hpp     |    60 +
 .../math/tools/detail/polynomial_horner1_7.hpp     |    66 +
 .../math/tools/detail/polynomial_horner1_8.hpp     |    72 +
 .../math/tools/detail/polynomial_horner1_9.hpp     |    78 +
 .../math/tools/detail/polynomial_horner2_10.hpp    |    90 +
 .../math/tools/detail/polynomial_horner2_11.hpp    |    97 +
 .../math/tools/detail/polynomial_horner2_12.hpp    |   104 +
 .../math/tools/detail/polynomial_horner2_13.hpp    |   111 +
 .../math/tools/detail/polynomial_horner2_14.hpp    |   118 +
 .../math/tools/detail/polynomial_horner2_15.hpp    |   125 +
 .../math/tools/detail/polynomial_horner2_16.hpp    |   132 +
 .../math/tools/detail/polynomial_horner2_17.hpp    |   139 +
 .../math/tools/detail/polynomial_horner2_18.hpp    |   146 +
 .../math/tools/detail/polynomial_horner2_19.hpp    |   153 +
 .../math/tools/detail/polynomial_horner2_2.hpp     |    48 +
 .../math/tools/detail/polynomial_horner2_20.hpp    |   160 +
 .../math/tools/detail/polynomial_horner2_3.hpp     |    48 +
 .../math/tools/detail/polynomial_horner2_4.hpp     |    48 +
 .../math/tools/detail/polynomial_horner2_5.hpp     |    55 +
 .../math/tools/detail/polynomial_horner2_6.hpp     |    62 +
 .../math/tools/detail/polynomial_horner2_7.hpp     |    69 +
 .../math/tools/detail/polynomial_horner2_8.hpp     |    76 +
 .../math/tools/detail/polynomial_horner2_9.hpp     |    83 +
 .../math/tools/detail/polynomial_horner3_10.hpp    |   156 +
 .../math/tools/detail/polynomial_horner3_11.hpp    |   181 +
 .../math/tools/detail/polynomial_horner3_12.hpp    |   208 +
 .../math/tools/detail/polynomial_horner3_13.hpp    |   237 +
 .../math/tools/detail/polynomial_horner3_14.hpp    |   268 +
 .../math/tools/detail/polynomial_horner3_15.hpp    |   301 +
 .../math/tools/detail/polynomial_horner3_16.hpp    |   336 +
 .../math/tools/detail/polynomial_horner3_17.hpp    |   373 +
 .../math/tools/detail/polynomial_horner3_18.hpp    |   412 +
 .../math/tools/detail/polynomial_horner3_19.hpp    |   453 +
 .../math/tools/detail/polynomial_horner3_2.hpp     |    48 +
 .../math/tools/detail/polynomial_horner3_20.hpp    |   496 +
 .../math/tools/detail/polynomial_horner3_3.hpp     |    48 +
 .../math/tools/detail/polynomial_horner3_4.hpp     |    48 +
 .../math/tools/detail/polynomial_horner3_5.hpp     |    61 +
 .../math/tools/detail/polynomial_horner3_6.hpp     |    76 +
 .../math/tools/detail/polynomial_horner3_7.hpp     |    93 +
 .../math/tools/detail/polynomial_horner3_8.hpp     |   112 +
 .../math/tools/detail/polynomial_horner3_9.hpp     |   133 +
 .../math/tools/detail/rational_horner1_10.hpp      |   138 +
 .../math/tools/detail/rational_horner1_11.hpp      |   150 +
 .../math/tools/detail/rational_horner1_12.hpp      |   162 +
 .../math/tools/detail/rational_horner1_13.hpp      |   174 +
 .../math/tools/detail/rational_horner1_14.hpp      |   186 +
 .../math/tools/detail/rational_horner1_15.hpp      |   198 +
 .../math/tools/detail/rational_horner1_16.hpp      |   210 +
 .../math/tools/detail/rational_horner1_17.hpp      |   222 +
 .../math/tools/detail/rational_horner1_18.hpp      |   234 +
 .../math/tools/detail/rational_horner1_19.hpp      |   246 +
 .../boost/math/tools/detail/rational_horner1_2.hpp |    42 +
 .../math/tools/detail/rational_horner1_20.hpp      |   258 +
 .../boost/math/tools/detail/rational_horner1_3.hpp |    54 +
 .../boost/math/tools/detail/rational_horner1_4.hpp |    66 +
 .../boost/math/tools/detail/rational_horner1_5.hpp |    78 +
 .../boost/math/tools/detail/rational_horner1_6.hpp |    90 +
 .../boost/math/tools/detail/rational_horner1_7.hpp |   102 +
 .../boost/math/tools/detail/rational_horner1_8.hpp |   114 +
 .../boost/math/tools/detail/rational_horner1_9.hpp |   126 +
 .../math/tools/detail/rational_horner2_10.hpp      |   144 +
 .../math/tools/detail/rational_horner2_11.hpp      |   160 +
 .../math/tools/detail/rational_horner2_12.hpp      |   176 +
 .../math/tools/detail/rational_horner2_13.hpp      |   192 +
 .../math/tools/detail/rational_horner2_14.hpp      |   208 +
 .../math/tools/detail/rational_horner2_15.hpp      |   224 +
 .../math/tools/detail/rational_horner2_16.hpp      |   240 +
 .../math/tools/detail/rational_horner2_17.hpp      |   256 +
 .../math/tools/detail/rational_horner2_18.hpp      |   272 +
 .../math/tools/detail/rational_horner2_19.hpp      |   288 +
 .../boost/math/tools/detail/rational_horner2_2.hpp |    48 +
 .../math/tools/detail/rational_horner2_20.hpp      |   304 +
 .../boost/math/tools/detail/rational_horner2_3.hpp |    48 +
 .../boost/math/tools/detail/rational_horner2_4.hpp |    48 +
 .../boost/math/tools/detail/rational_horner2_5.hpp |    64 +
 .../boost/math/tools/detail/rational_horner2_6.hpp |    80 +
 .../boost/math/tools/detail/rational_horner2_7.hpp |    96 +
 .../boost/math/tools/detail/rational_horner2_8.hpp |   112 +
 .../boost/math/tools/detail/rational_horner2_9.hpp |   128 +
 .../math/tools/detail/rational_horner3_10.hpp      |   396 +
 .../math/tools/detail/rational_horner3_11.hpp      |   482 +
 .../math/tools/detail/rational_horner3_12.hpp      |   576 ++
 .../math/tools/detail/rational_horner3_13.hpp      |   678 ++
 .../math/tools/detail/rational_horner3_14.hpp      |   788 ++
 .../math/tools/detail/rational_horner3_15.hpp      |   906 ++
 .../math/tools/detail/rational_horner3_16.hpp      |  1032 ++
 .../math/tools/detail/rational_horner3_17.hpp      |  1166 +++
 .../math/tools/detail/rational_horner3_18.hpp      |  1308 +++
 .../math/tools/detail/rational_horner3_19.hpp      |  1458 +++
 .../boost/math/tools/detail/rational_horner3_2.hpp |    48 +
 .../math/tools/detail/rational_horner3_20.hpp      |  1616 +++
 .../boost/math/tools/detail/rational_horner3_3.hpp |    48 +
 .../boost/math/tools/detail/rational_horner3_4.hpp |    48 +
 .../boost/math/tools/detail/rational_horner3_5.hpp |    86 +
 .../boost/math/tools/detail/rational_horner3_6.hpp |   132 +
 .../boost/math/tools/detail/rational_horner3_7.hpp |   186 +
 .../boost/math/tools/detail/rational_horner3_8.hpp |   248 +
 .../boost/math/tools/detail/rational_horner3_9.hpp |   318 +
 gatb-core/thirdparty/boost/math/tools/fraction.hpp |   252 +
 gatb-core/thirdparty/boost/math/tools/minima.hpp   |   152 +
 .../thirdparty/boost/math/tools/polynomial.hpp     |   323 +
 .../thirdparty/boost/math/tools/precision.hpp      |   392 +
 .../thirdparty/boost/math/tools/promotion.hpp      |   175 +
 gatb-core/thirdparty/boost/math/tools/rational.hpp |   333 +
 .../thirdparty/boost/math/tools/real_cast.hpp      |    29 +
 gatb-core/thirdparty/boost/math/tools/roots.hpp    |   542 +
 gatb-core/thirdparty/boost/math/tools/series.hpp   |   158 +
 gatb-core/thirdparty/boost/math/tools/stats.hpp    |    88 +
 .../thirdparty/boost/math/tools/toms748_solve.hpp  |   609 ++
 gatb-core/thirdparty/boost/math/tools/traits.hpp   |   111 +
 gatb-core/thirdparty/boost/math/tools/tuple.hpp    |    90 +
 gatb-core/thirdparty/boost/math/tools/user.hpp     |   105 +
 .../thirdparty/boost/math/tools/workaround.hpp     |    38 +
 gatb-core/thirdparty/boost/math/tr1.hpp            |  1115 ++
 gatb-core/thirdparty/boost/math/tr1_c_macros.ipp   |   810 ++
 gatb-core/thirdparty/boost/math_fwd.hpp            |   108 +
 gatb-core/thirdparty/boost/move/adl_move_swap.hpp  |   233 +
 gatb-core/thirdparty/boost/move/algorithm.hpp      |   282 +
 gatb-core/thirdparty/boost/move/core.hpp           |   497 +
 gatb-core/thirdparty/boost/move/default_delete.hpp |   195 +
 .../thirdparty/boost/move/detail/config_begin.hpp  |    19 +
 .../thirdparty/boost/move/detail/config_end.hpp    |    12 +
 .../thirdparty/boost/move/detail/fwd_macros.hpp    |   465 +
 .../boost/move/detail/iterator_traits.hpp          |    87 +
 .../thirdparty/boost/move/detail/meta_utils.hpp    |   559 +
 .../boost/move/detail/meta_utils_core.hpp          |   120 +
 .../thirdparty/boost/move/detail/move_helpers.hpp  |   178 +
 .../thirdparty/boost/move/detail/type_traits.hpp   |  1078 ++
 .../boost/move/detail/unique_ptr_meta_utils.hpp    |   591 ++
 .../thirdparty/boost/move/detail/workaround.hpp    |    55 +
 gatb-core/thirdparty/boost/move/iterator.hpp       |   312 +
 gatb-core/thirdparty/boost/move/make_unique.hpp    |   237 +
 gatb-core/thirdparty/boost/move/move.hpp           |    35 +
 gatb-core/thirdparty/boost/move/traits.hpp         |    77 +
 gatb-core/thirdparty/boost/move/unique_ptr.hpp     |   869 ++
 gatb-core/thirdparty/boost/move/utility.hpp        |   149 +
 gatb-core/thirdparty/boost/move/utility_core.hpp   |   315 +
 gatb-core/thirdparty/boost/mpl/O1_size.hpp         |    40 +
 gatb-core/thirdparty/boost/mpl/O1_size_fwd.hpp     |    24 +
 gatb-core/thirdparty/boost/mpl/accumulate.hpp      |    39 +
 gatb-core/thirdparty/boost/mpl/advance.hpp         |    76 +
 gatb-core/thirdparty/boost/mpl/advance_fwd.hpp     |    28 +
 gatb-core/thirdparty/boost/mpl/alias.hpp           |    21 +
 gatb-core/thirdparty/boost/mpl/always.hpp          |    38 +
 gatb-core/thirdparty/boost/mpl/and.hpp             |    60 +
 gatb-core/thirdparty/boost/mpl/apply.hpp           |   229 +
 gatb-core/thirdparty/boost/mpl/apply_fwd.hpp       |   107 +
 gatb-core/thirdparty/boost/mpl/apply_wrap.hpp      |   234 +
 gatb-core/thirdparty/boost/mpl/arg.hpp             |   131 +
 gatb-core/thirdparty/boost/mpl/arg_fwd.hpp         |    28 +
 gatb-core/thirdparty/boost/mpl/arithmetic.hpp      |    25 +
 gatb-core/thirdparty/boost/mpl/as_sequence.hpp     |    38 +
 gatb-core/thirdparty/boost/mpl/assert.hpp          |   439 +
 gatb-core/thirdparty/boost/mpl/at.hpp              |    52 +
 gatb-core/thirdparty/boost/mpl/at_fwd.hpp          |    24 +
 .../thirdparty/boost/mpl/aux_/O1_size_impl.hpp     |    87 +
 .../thirdparty/boost/mpl/aux_/adl_barrier.hpp      |    48 +
 .../thirdparty/boost/mpl/aux_/advance_backward.hpp |   128 +
 .../thirdparty/boost/mpl/aux_/advance_forward.hpp  |   127 +
 gatb-core/thirdparty/boost/mpl/aux_/apply_1st.hpp  |    35 +
 .../thirdparty/boost/mpl/aux_/arg_typedef.hpp      |    31 +
 .../thirdparty/boost/mpl/aux_/arithmetic_op.hpp    |    92 +
 gatb-core/thirdparty/boost/mpl/aux_/arity.hpp      |    39 +
 gatb-core/thirdparty/boost/mpl/aux_/arity_spec.hpp |    67 +
 gatb-core/thirdparty/boost/mpl/aux_/at_impl.hpp    |    45 +
 gatb-core/thirdparty/boost/mpl/aux_/back_impl.hpp  |    43 +
 gatb-core/thirdparty/boost/mpl/aux_/basic_bind.hpp |    21 +
 .../thirdparty/boost/mpl/aux_/begin_end_impl.hpp   |   101 +
 gatb-core/thirdparty/boost/mpl/aux_/clear_impl.hpp |    35 +
 .../thirdparty/boost/mpl/aux_/common_name_wknd.hpp |    34 +
 .../thirdparty/boost/mpl/aux_/comparison_op.hpp    |    83 +
 gatb-core/thirdparty/boost/mpl/aux_/config/adl.hpp |    40 +
 .../thirdparty/boost/mpl/aux_/config/arrays.hpp    |    30 +
 gatb-core/thirdparty/boost/mpl/aux_/config/bcc.hpp |    28 +
 .../thirdparty/boost/mpl/aux_/config/bind.hpp      |    33 +
 .../thirdparty/boost/mpl/aux_/config/compiler.hpp  |    66 +
 .../thirdparty/boost/mpl/aux_/config/ctps.hpp      |    30 +
 .../boost/mpl/aux_/config/dependent_nttp.hpp       |    35 +
 .../boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp   |    27 +
 gatb-core/thirdparty/boost/mpl/aux_/config/dtp.hpp |    46 +
 gatb-core/thirdparty/boost/mpl/aux_/config/eti.hpp |    47 +
 .../boost/mpl/aux_/config/forwarding.hpp           |    27 +
 gatb-core/thirdparty/boost/mpl/aux_/config/gcc.hpp |    23 +
 gatb-core/thirdparty/boost/mpl/aux_/config/gpu.hpp |    35 +
 .../thirdparty/boost/mpl/aux_/config/has_apply.hpp |    32 +
 .../thirdparty/boost/mpl/aux_/config/has_xxx.hpp   |    34 +
 .../thirdparty/boost/mpl/aux_/config/integral.hpp  |    38 +
 .../thirdparty/boost/mpl/aux_/config/intel.hpp     |    21 +
 .../thirdparty/boost/mpl/aux_/config/lambda.hpp    |    32 +
 .../thirdparty/boost/mpl/aux_/config/msvc.hpp      |    21 +
 .../boost/mpl/aux_/config/msvc_typename.hpp        |    26 +
 .../thirdparty/boost/mpl/aux_/config/nttp.hpp      |    41 +
 .../thirdparty/boost/mpl/aux_/config/operators.hpp |    34 +
 .../boost/mpl/aux_/config/overload_resolution.hpp  |    29 +
 .../boost/mpl/aux_/config/pp_counter.hpp           |    26 +
 .../boost/mpl/aux_/config/preprocessor.hpp         |    39 +
 .../boost/mpl/aux_/config/static_constant.hpp      |    25 +
 gatb-core/thirdparty/boost/mpl/aux_/config/ttp.hpp |    41 +
 .../thirdparty/boost/mpl/aux_/config/typeof.hpp    |    38 +
 .../boost/mpl/aux_/config/use_preprocessed.hpp     |    19 +
 .../boost/mpl/aux_/config/workaround.hpp           |    19 +
 .../thirdparty/boost/mpl/aux_/contains_impl.hpp    |    61 +
 gatb-core/thirdparty/boost/mpl/aux_/count_args.hpp |   105 +
 gatb-core/thirdparty/boost/mpl/aux_/count_impl.hpp |    44 +
 gatb-core/thirdparty/boost/mpl/aux_/empty_impl.hpp |    43 +
 gatb-core/thirdparty/boost/mpl/aux_/erase_impl.hpp |    69 +
 .../thirdparty/boost/mpl/aux_/erase_key_impl.hpp   |    32 +
 .../thirdparty/boost/mpl/aux_/filter_iter.hpp      |   140 +
 .../thirdparty/boost/mpl/aux_/find_if_pred.hpp     |    31 +
 gatb-core/thirdparty/boost/mpl/aux_/fold_impl.hpp  |    43 +
 .../thirdparty/boost/mpl/aux_/fold_impl_body.hpp   |   365 +
 gatb-core/thirdparty/boost/mpl/aux_/fold_op.hpp    |    37 +
 gatb-core/thirdparty/boost/mpl/aux_/fold_pred.hpp  |    37 +
 gatb-core/thirdparty/boost/mpl/aux_/front_impl.hpp |    41 +
 .../thirdparty/boost/mpl/aux_/full_lambda.hpp      |   354 +
 gatb-core/thirdparty/boost/mpl/aux_/has_apply.hpp  |    32 +
 gatb-core/thirdparty/boost/mpl/aux_/has_begin.hpp  |    23 +
 .../thirdparty/boost/mpl/aux_/has_key_impl.hpp     |    34 +
 gatb-core/thirdparty/boost/mpl/aux_/has_rebind.hpp |    99 +
 gatb-core/thirdparty/boost/mpl/aux_/has_size.hpp   |    23 +
 gatb-core/thirdparty/boost/mpl/aux_/has_tag.hpp    |    23 +
 gatb-core/thirdparty/boost/mpl/aux_/has_type.hpp   |    23 +
 .../boost/mpl/aux_/include_preprocessed.hpp        |    42 +
 .../thirdparty/boost/mpl/aux_/insert_impl.hpp      |    68 +
 .../boost/mpl/aux_/insert_range_impl.hpp           |    80 +
 .../boost/mpl/aux_/inserter_algorithm.hpp          |   159 +
 .../thirdparty/boost/mpl/aux_/integral_wrapper.hpp |    93 +
 .../thirdparty/boost/mpl/aux_/is_msvc_eti_arg.hpp  |    64 +
 gatb-core/thirdparty/boost/mpl/aux_/iter_apply.hpp |    47 +
 .../boost/mpl/aux_/iter_fold_if_impl.hpp           |   210 +
 .../thirdparty/boost/mpl/aux_/iter_fold_impl.hpp   |    42 +
 .../thirdparty/boost/mpl/aux_/iter_push_front.hpp  |    36 +
 gatb-core/thirdparty/boost/mpl/aux_/joint_iter.hpp |   120 +
 .../boost/mpl/aux_/lambda_arity_param.hpp          |    25 +
 .../thirdparty/boost/mpl/aux_/lambda_no_ctps.hpp   |   193 +
 .../thirdparty/boost/mpl/aux_/lambda_spec.hpp      |    49 +
 .../thirdparty/boost/mpl/aux_/lambda_support.hpp   |   169 +
 .../thirdparty/boost/mpl/aux_/largest_int.hpp      |    63 +
 gatb-core/thirdparty/boost/mpl/aux_/logical_op.hpp |   165 +
 gatb-core/thirdparty/boost/mpl/aux_/msvc_dtw.hpp   |    68 +
 .../thirdparty/boost/mpl/aux_/msvc_eti_base.hpp    |    77 +
 .../thirdparty/boost/mpl/aux_/msvc_is_class.hpp    |    58 +
 .../thirdparty/boost/mpl/aux_/msvc_never_true.hpp  |    34 +
 gatb-core/thirdparty/boost/mpl/aux_/msvc_type.hpp  |    62 +
 gatb-core/thirdparty/boost/mpl/aux_/na.hpp         |    95 +
 gatb-core/thirdparty/boost/mpl/aux_/na_assert.hpp  |    34 +
 gatb-core/thirdparty/boost/mpl/aux_/na_fwd.hpp     |    31 +
 gatb-core/thirdparty/boost/mpl/aux_/na_spec.hpp    |   175 +
 .../thirdparty/boost/mpl/aux_/nested_type_wknd.hpp |    48 +
 gatb-core/thirdparty/boost/mpl/aux_/nttp_decl.hpp  |    35 +
 .../boost/mpl/aux_/numeric_cast_utils.hpp          |    77 +
 gatb-core/thirdparty/boost/mpl/aux_/numeric_op.hpp |   315 +
 gatb-core/thirdparty/boost/mpl/aux_/order_impl.hpp |    76 +
 .../thirdparty/boost/mpl/aux_/overload_names.hpp   |    48 +
 .../thirdparty/boost/mpl/aux_/partition_op.hpp     |    58 +
 .../thirdparty/boost/mpl/aux_/pop_back_impl.hpp    |    34 +
 .../thirdparty/boost/mpl/aux_/pop_front_impl.hpp   |    44 +
 .../mpl/aux_/preprocessed/bcc/advance_backward.hpp |    97 +
 .../mpl/aux_/preprocessed/bcc/advance_forward.hpp  |    97 +
 .../boost/mpl/aux_/preprocessed/bcc/and.hpp        |    69 +
 .../boost/mpl/aux_/preprocessed/bcc/apply.hpp      |   169 +
 .../boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp  |    52 +
 .../boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp |   461 +
 .../boost/mpl/aux_/preprocessed/bcc/arg.hpp        |   117 +
 .../boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp |   300 +
 .../boost/mpl/aux_/preprocessed/bcc/bind.hpp       |   397 +
 .../boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp   |    46 +
 .../boost/mpl/aux_/preprocessed/bcc/bitand.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/bcc/bitor.hpp      |   147 +
 .../boost/mpl/aux_/preprocessed/bcc/bitxor.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/bcc/deque.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/bcc/divides.hpp    |   146 +
 .../boost/mpl/aux_/preprocessed/bcc/equal_to.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp  |   180 +
 .../mpl/aux_/preprocessed/bcc/full_lambda.hpp      |   558 +
 .../boost/mpl/aux_/preprocessed/bcc/greater.hpp    |    94 +
 .../mpl/aux_/preprocessed/bcc/greater_equal.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/bcc/inherit.hpp    |   139 +
 .../aux_/preprocessed/bcc/iter_fold_if_impl.hpp    |   133 +
 .../mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp   |   180 +
 .../mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp   |   229 +
 .../boost/mpl/aux_/preprocessed/bcc/less.hpp       |    94 +
 .../boost/mpl/aux_/preprocessed/bcc/less_equal.hpp |    94 +
 .../boost/mpl/aux_/preprocessed/bcc/list.hpp       |   323 +
 .../boost/mpl/aux_/preprocessed/bcc/list_c.hpp     |   328 +
 .../boost/mpl/aux_/preprocessed/bcc/map.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/bcc/minus.hpp      |   146 +
 .../boost/mpl/aux_/preprocessed/bcc/modulus.hpp    |   101 +
 .../mpl/aux_/preprocessed/bcc/not_equal_to.hpp     |    94 +
 .../boost/mpl/aux_/preprocessed/bcc/or.hpp         |    69 +
 .../mpl/aux_/preprocessed/bcc/placeholders.hpp     |   105 +
 .../boost/mpl/aux_/preprocessed/bcc/plus.hpp       |   146 +
 .../boost/mpl/aux_/preprocessed/bcc/quote.hpp      |   119 +
 .../aux_/preprocessed/bcc/reverse_fold_impl.hpp    |   295 +
 .../preprocessed/bcc/reverse_iter_fold_impl.hpp    |   295 +
 .../boost/mpl/aux_/preprocessed/bcc/set.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/bcc/set_c.hpp      |   328 +
 .../boost/mpl/aux_/preprocessed/bcc/shift_left.hpp |    99 +
 .../mpl/aux_/preprocessed/bcc/shift_right.hpp      |    99 +
 .../mpl/aux_/preprocessed/bcc/template_arity.hpp   |    40 +
 .../boost/mpl/aux_/preprocessed/bcc/times.hpp      |   146 +
 .../mpl/aux_/preprocessed/bcc/unpack_args.hpp      |    97 +
 .../boost/mpl/aux_/preprocessed/bcc/vector.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/bcc/vector_c.hpp   |   309 +
 .../aux_/preprocessed/bcc551/advance_backward.hpp  |    97 +
 .../aux_/preprocessed/bcc551/advance_forward.hpp   |    97 +
 .../boost/mpl/aux_/preprocessed/bcc551/and.hpp     |    69 +
 .../boost/mpl/aux_/preprocessed/bcc551/apply.hpp   |   169 +
 .../mpl/aux_/preprocessed/bcc551/apply_fwd.hpp     |    52 +
 .../mpl/aux_/preprocessed/bcc551/apply_wrap.hpp    |   456 +
 .../boost/mpl/aux_/preprocessed/bcc551/arg.hpp     |   123 +
 .../mpl/aux_/preprocessed/bcc551/basic_bind.hpp    |   306 +
 .../boost/mpl/aux_/preprocessed/bcc551/bind.hpp    |   403 +
 .../mpl/aux_/preprocessed/bcc551/bind_fwd.hpp      |    46 +
 .../boost/mpl/aux_/preprocessed/bcc551/bitand.hpp  |   147 +
 .../boost/mpl/aux_/preprocessed/bcc551/bitor.hpp   |   147 +
 .../boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp  |   147 +
 .../boost/mpl/aux_/preprocessed/bcc551/deque.hpp   |   323 +
 .../boost/mpl/aux_/preprocessed/bcc551/divides.hpp |   146 +
 .../mpl/aux_/preprocessed/bcc551/equal_to.hpp      |    94 +
 .../mpl/aux_/preprocessed/bcc551/fold_impl.hpp     |   180 +
 .../mpl/aux_/preprocessed/bcc551/full_lambda.hpp   |   558 +
 .../boost/mpl/aux_/preprocessed/bcc551/greater.hpp |    94 +
 .../mpl/aux_/preprocessed/bcc551/greater_equal.hpp |    94 +
 .../boost/mpl/aux_/preprocessed/bcc551/inherit.hpp |   141 +
 .../aux_/preprocessed/bcc551/iter_fold_if_impl.hpp |   133 +
 .../aux_/preprocessed/bcc551/iter_fold_impl.hpp    |   180 +
 .../aux_/preprocessed/bcc551/lambda_no_ctps.hpp    |   229 +
 .../boost/mpl/aux_/preprocessed/bcc551/less.hpp    |    94 +
 .../mpl/aux_/preprocessed/bcc551/less_equal.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/bcc551/list.hpp    |   323 +
 .../boost/mpl/aux_/preprocessed/bcc551/list_c.hpp  |   328 +
 .../boost/mpl/aux_/preprocessed/bcc551/map.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/bcc551/minus.hpp   |   146 +
 .../boost/mpl/aux_/preprocessed/bcc551/modulus.hpp |   101 +
 .../mpl/aux_/preprocessed/bcc551/not_equal_to.hpp  |    94 +
 .../boost/mpl/aux_/preprocessed/bcc551/or.hpp      |    69 +
 .../mpl/aux_/preprocessed/bcc551/placeholders.hpp  |   105 +
 .../boost/mpl/aux_/preprocessed/bcc551/plus.hpp    |   146 +
 .../boost/mpl/aux_/preprocessed/bcc551/quote.hpp   |    11 +
 .../aux_/preprocessed/bcc551/reverse_fold_impl.hpp |   295 +
 .../preprocessed/bcc551/reverse_iter_fold_impl.hpp |   295 +
 .../boost/mpl/aux_/preprocessed/bcc551/set.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/bcc551/set_c.hpp   |   328 +
 .../mpl/aux_/preprocessed/bcc551/shift_left.hpp    |    99 +
 .../mpl/aux_/preprocessed/bcc551/shift_right.hpp   |    99 +
 .../aux_/preprocessed/bcc551/template_arity.hpp    |    40 +
 .../boost/mpl/aux_/preprocessed/bcc551/times.hpp   |   146 +
 .../mpl/aux_/preprocessed/bcc551/unpack_args.hpp   |    97 +
 .../boost/mpl/aux_/preprocessed/bcc551/vector.hpp  |   323 +
 .../mpl/aux_/preprocessed/bcc551/vector_c.hpp      |   309 +
 .../preprocessed/bcc_pre590/advance_backward.hpp   |    97 +
 .../preprocessed/bcc_pre590/advance_forward.hpp    |    97 +
 .../boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp |    69 +
 .../mpl/aux_/preprocessed/bcc_pre590/apply.hpp     |   169 +
 .../mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp |    52 +
 .../aux_/preprocessed/bcc_pre590/apply_wrap.hpp    |   456 +
 .../boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp |   117 +
 .../aux_/preprocessed/bcc_pre590/basic_bind.hpp    |   300 +
 .../mpl/aux_/preprocessed/bcc_pre590/bind.hpp      |   397 +
 .../mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp  |    46 +
 .../mpl/aux_/preprocessed/bcc_pre590/bitand.hpp    |   147 +
 .../mpl/aux_/preprocessed/bcc_pre590/bitor.hpp     |   147 +
 .../mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp    |   147 +
 .../mpl/aux_/preprocessed/bcc_pre590/deque.hpp     |   323 +
 .../mpl/aux_/preprocessed/bcc_pre590/divides.hpp   |   146 +
 .../mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp  |    94 +
 .../mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp |   180 +
 .../aux_/preprocessed/bcc_pre590/full_lambda.hpp   |   558 +
 .../mpl/aux_/preprocessed/bcc_pre590/greater.hpp   |    94 +
 .../aux_/preprocessed/bcc_pre590/greater_equal.hpp |    94 +
 .../mpl/aux_/preprocessed/bcc_pre590/inherit.hpp   |   139 +
 .../preprocessed/bcc_pre590/iter_fold_if_impl.hpp  |   133 +
 .../preprocessed/bcc_pre590/iter_fold_impl.hpp     |   180 +
 .../preprocessed/bcc_pre590/lambda_no_ctps.hpp     |   229 +
 .../mpl/aux_/preprocessed/bcc_pre590/less.hpp      |    94 +
 .../aux_/preprocessed/bcc_pre590/less_equal.hpp    |    94 +
 .../mpl/aux_/preprocessed/bcc_pre590/list.hpp      |   323 +
 .../mpl/aux_/preprocessed/bcc_pre590/list_c.hpp    |   328 +
 .../boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp |   323 +
 .../mpl/aux_/preprocessed/bcc_pre590/minus.hpp     |   146 +
 .../mpl/aux_/preprocessed/bcc_pre590/modulus.hpp   |   101 +
 .../aux_/preprocessed/bcc_pre590/not_equal_to.hpp  |    94 +
 .../boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp  |    69 +
 .../aux_/preprocessed/bcc_pre590/placeholders.hpp  |   105 +
 .../mpl/aux_/preprocessed/bcc_pre590/plus.hpp      |   146 +
 .../mpl/aux_/preprocessed/bcc_pre590/quote.hpp     |    11 +
 .../preprocessed/bcc_pre590/reverse_fold_impl.hpp  |   295 +
 .../bcc_pre590/reverse_iter_fold_impl.hpp          |   295 +
 .../boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp |   323 +
 .../mpl/aux_/preprocessed/bcc_pre590/set_c.hpp     |   328 +
 .../aux_/preprocessed/bcc_pre590/shift_left.hpp    |    99 +
 .../aux_/preprocessed/bcc_pre590/shift_right.hpp   |    99 +
 .../preprocessed/bcc_pre590/template_arity.hpp     |    40 +
 .../mpl/aux_/preprocessed/bcc_pre590/times.hpp     |   146 +
 .../aux_/preprocessed/bcc_pre590/unpack_args.hpp   |    97 +
 .../mpl/aux_/preprocessed/bcc_pre590/vector.hpp    |   323 +
 .../mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp  |   309 +
 .../mpl/aux_/preprocessed/dmc/advance_backward.hpp |    97 +
 .../mpl/aux_/preprocessed/dmc/advance_forward.hpp  |    97 +
 .../boost/mpl/aux_/preprocessed/dmc/and.hpp        |    69 +
 .../boost/mpl/aux_/preprocessed/dmc/apply.hpp      |   169 +
 .../boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp  |    52 +
 .../boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp |    84 +
 .../boost/mpl/aux_/preprocessed/dmc/arg.hpp        |   123 +
 .../boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp |   406 +
 .../boost/mpl/aux_/preprocessed/dmc/bind.hpp       |   515 +
 .../boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp   |    53 +
 .../boost/mpl/aux_/preprocessed/dmc/bitand.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/dmc/bitor.hpp      |   147 +
 .../boost/mpl/aux_/preprocessed/dmc/bitxor.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/dmc/deque.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/dmc/divides.hpp    |   146 +
 .../boost/mpl/aux_/preprocessed/dmc/equal_to.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp  |   180 +
 .../mpl/aux_/preprocessed/dmc/full_lambda.hpp      |   536 +
 .../boost/mpl/aux_/preprocessed/dmc/greater.hpp    |    94 +
 .../mpl/aux_/preprocessed/dmc/greater_equal.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/inherit.hpp    |   141 +
 .../aux_/preprocessed/dmc/iter_fold_if_impl.hpp    |   133 +
 .../mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp   |   180 +
 .../mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp   |   229 +
 .../boost/mpl/aux_/preprocessed/dmc/less.hpp       |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/less_equal.hpp |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/list.hpp       |   323 +
 .../boost/mpl/aux_/preprocessed/dmc/list_c.hpp     |   328 +
 .../boost/mpl/aux_/preprocessed/dmc/map.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/dmc/minus.hpp      |   146 +
 .../boost/mpl/aux_/preprocessed/dmc/modulus.hpp    |   101 +
 .../mpl/aux_/preprocessed/dmc/not_equal_to.hpp     |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/or.hpp         |    69 +
 .../mpl/aux_/preprocessed/dmc/placeholders.hpp     |   105 +
 .../boost/mpl/aux_/preprocessed/dmc/plus.hpp       |   146 +
 .../boost/mpl/aux_/preprocessed/dmc/quote.hpp      |   123 +
 .../aux_/preprocessed/dmc/reverse_fold_impl.hpp    |   231 +
 .../preprocessed/dmc/reverse_iter_fold_impl.hpp    |   231 +
 .../boost/mpl/aux_/preprocessed/dmc/set.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/dmc/set_c.hpp      |   328 +
 .../boost/mpl/aux_/preprocessed/dmc/shift_left.hpp |    99 +
 .../mpl/aux_/preprocessed/dmc/shift_right.hpp      |    99 +
 .../mpl/aux_/preprocessed/dmc/template_arity.hpp   |    11 +
 .../boost/mpl/aux_/preprocessed/dmc/times.hpp      |   146 +
 .../mpl/aux_/preprocessed/dmc/unpack_args.hpp      |    94 +
 .../boost/mpl/aux_/preprocessed/dmc/vector.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/dmc/vector_c.hpp   |   309 +
 .../mpl/aux_/preprocessed/gcc/advance_backward.hpp |    97 +
 .../mpl/aux_/preprocessed/gcc/advance_forward.hpp  |    97 +
 .../boost/mpl/aux_/preprocessed/gcc/and.hpp        |    69 +
 .../boost/mpl/aux_/preprocessed/gcc/apply.hpp      |   169 +
 .../boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp  |    52 +
 .../boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp |    84 +
 .../boost/mpl/aux_/preprocessed/gcc/arg.hpp        |   123 +
 .../boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp |   440 +
 .../boost/mpl/aux_/preprocessed/gcc/bind.hpp       |   561 +
 .../boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp   |    52 +
 .../boost/mpl/aux_/preprocessed/gcc/bitand.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/gcc/bitor.hpp      |   147 +
 .../boost/mpl/aux_/preprocessed/gcc/bitxor.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/gcc/deque.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/gcc/divides.hpp    |   146 +
 .../boost/mpl/aux_/preprocessed/gcc/equal_to.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp  |   180 +
 .../mpl/aux_/preprocessed/gcc/full_lambda.hpp      |   558 +
 .../boost/mpl/aux_/preprocessed/gcc/greater.hpp    |    94 +
 .../mpl/aux_/preprocessed/gcc/greater_equal.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/inherit.hpp    |   141 +
 .../aux_/preprocessed/gcc/iter_fold_if_impl.hpp    |   133 +
 .../mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp   |   180 +
 .../mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp   |   229 +
 .../boost/mpl/aux_/preprocessed/gcc/less.hpp       |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/less_equal.hpp |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/list.hpp       |   323 +
 .../boost/mpl/aux_/preprocessed/gcc/list_c.hpp     |   328 +
 .../boost/mpl/aux_/preprocessed/gcc/map.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/gcc/minus.hpp      |   146 +
 .../boost/mpl/aux_/preprocessed/gcc/modulus.hpp    |   101 +
 .../mpl/aux_/preprocessed/gcc/not_equal_to.hpp     |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/or.hpp         |    69 +
 .../mpl/aux_/preprocessed/gcc/placeholders.hpp     |   105 +
 .../boost/mpl/aux_/preprocessed/gcc/plus.hpp       |   146 +
 .../boost/mpl/aux_/preprocessed/gcc/quote.hpp      |   123 +
 .../aux_/preprocessed/gcc/reverse_fold_impl.hpp    |   231 +
 .../preprocessed/gcc/reverse_iter_fold_impl.hpp    |   231 +
 .../boost/mpl/aux_/preprocessed/gcc/set.hpp        |   323 +
 .../boost/mpl/aux_/preprocessed/gcc/set_c.hpp      |   328 +
 .../boost/mpl/aux_/preprocessed/gcc/shift_left.hpp |    99 +
 .../mpl/aux_/preprocessed/gcc/shift_right.hpp      |    99 +
 .../mpl/aux_/preprocessed/gcc/template_arity.hpp   |    97 +
 .../boost/mpl/aux_/preprocessed/gcc/times.hpp      |   146 +
 .../mpl/aux_/preprocessed/gcc/unpack_args.hpp      |    94 +
 .../boost/mpl/aux_/preprocessed/gcc/vector.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/gcc/vector_c.hpp   |   309 +
 .../aux_/preprocessed/msvc60/advance_backward.hpp  |   132 +
 .../aux_/preprocessed/msvc60/advance_forward.hpp   |   132 +
 .../boost/mpl/aux_/preprocessed/msvc60/and.hpp     |    73 +
 .../boost/mpl/aux_/preprocessed/msvc60/apply.hpp   |   166 +
 .../mpl/aux_/preprocessed/msvc60/apply_fwd.hpp     |    46 +
 .../mpl/aux_/preprocessed/msvc60/apply_wrap.hpp    |   247 +
 .../boost/mpl/aux_/preprocessed/msvc60/arg.hpp     |   123 +
 .../mpl/aux_/preprocessed/msvc60/basic_bind.hpp    |   328 +
 .../boost/mpl/aux_/preprocessed/msvc60/bind.hpp    |   432 +
 .../mpl/aux_/preprocessed/msvc60/bind_fwd.hpp      |    46 +
 .../boost/mpl/aux_/preprocessed/msvc60/bitand.hpp  |   149 +
 .../boost/mpl/aux_/preprocessed/msvc60/bitor.hpp   |   149 +
 .../boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp  |   149 +
 .../boost/mpl/aux_/preprocessed/msvc60/deque.hpp   |   556 +
 .../boost/mpl/aux_/preprocessed/msvc60/divides.hpp |   148 +
 .../mpl/aux_/preprocessed/msvc60/equal_to.hpp      |   102 +
 .../mpl/aux_/preprocessed/msvc60/fold_impl.hpp     |   293 +
 .../mpl/aux_/preprocessed/msvc60/full_lambda.hpp   |   554 +
 .../boost/mpl/aux_/preprocessed/msvc60/greater.hpp |   102 +
 .../mpl/aux_/preprocessed/msvc60/greater_equal.hpp |   102 +
 .../boost/mpl/aux_/preprocessed/msvc60/inherit.hpp |   166 +
 .../aux_/preprocessed/msvc60/iter_fold_if_impl.hpp |   133 +
 .../aux_/preprocessed/msvc60/iter_fold_impl.hpp    |   293 +
 .../aux_/preprocessed/msvc60/lambda_no_ctps.hpp    |   229 +
 .../boost/mpl/aux_/preprocessed/msvc60/less.hpp    |   102 +
 .../mpl/aux_/preprocessed/msvc60/less_equal.hpp    |   102 +
 .../boost/mpl/aux_/preprocessed/msvc60/list.hpp    |   556 +
 .../boost/mpl/aux_/preprocessed/msvc60/list_c.hpp  |   534 +
 .../boost/mpl/aux_/preprocessed/msvc60/map.hpp     |   556 +
 .../boost/mpl/aux_/preprocessed/msvc60/minus.hpp   |   148 +
 .../boost/mpl/aux_/preprocessed/msvc60/modulus.hpp |   115 +
 .../mpl/aux_/preprocessed/msvc60/not_equal_to.hpp  |   102 +
 .../boost/mpl/aux_/preprocessed/msvc60/or.hpp      |    73 +
 .../mpl/aux_/preprocessed/msvc60/placeholders.hpp  |   105 +
 .../boost/mpl/aux_/preprocessed/msvc60/plus.hpp    |   148 +
 .../boost/mpl/aux_/preprocessed/msvc60/quote.hpp   |    11 +
 .../aux_/preprocessed/msvc60/reverse_fold_impl.hpp |   343 +
 .../preprocessed/msvc60/reverse_iter_fold_impl.hpp |   343 +
 .../boost/mpl/aux_/preprocessed/msvc60/set.hpp     |   556 +
 .../boost/mpl/aux_/preprocessed/msvc60/set_c.hpp   |   534 +
 .../mpl/aux_/preprocessed/msvc60/shift_left.hpp    |   114 +
 .../mpl/aux_/preprocessed/msvc60/shift_right.hpp   |   114 +
 .../aux_/preprocessed/msvc60/template_arity.hpp    |    46 +
 .../boost/mpl/aux_/preprocessed/msvc60/times.hpp   |   148 +
 .../mpl/aux_/preprocessed/msvc60/unpack_args.hpp   |   109 +
 .../boost/mpl/aux_/preprocessed/msvc60/vector.hpp  |   556 +
 .../mpl/aux_/preprocessed/msvc60/vector_c.hpp      |   534 +
 .../aux_/preprocessed/msvc70/advance_backward.hpp  |    97 +
 .../aux_/preprocessed/msvc70/advance_forward.hpp   |    97 +
 .../boost/mpl/aux_/preprocessed/msvc70/and.hpp     |    71 +
 .../boost/mpl/aux_/preprocessed/msvc70/apply.hpp   |   160 +
 .../mpl/aux_/preprocessed/msvc70/apply_fwd.hpp     |    46 +
 .../mpl/aux_/preprocessed/msvc70/apply_wrap.hpp    |   138 +
 .../boost/mpl/aux_/preprocessed/msvc70/arg.hpp     |   123 +
 .../mpl/aux_/preprocessed/msvc70/basic_bind.hpp    |   328 +
 .../boost/mpl/aux_/preprocessed/msvc70/bind.hpp    |   432 +
 .../mpl/aux_/preprocessed/msvc70/bind_fwd.hpp      |    46 +
 .../boost/mpl/aux_/preprocessed/msvc70/bitand.hpp  |   151 +
 .../boost/mpl/aux_/preprocessed/msvc70/bitor.hpp   |   151 +
 .../boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp  |   151 +
 .../boost/mpl/aux_/preprocessed/msvc70/deque.hpp   |   556 +
 .../boost/mpl/aux_/preprocessed/msvc70/divides.hpp |   150 +
 .../mpl/aux_/preprocessed/msvc70/equal_to.hpp      |   102 +
 .../mpl/aux_/preprocessed/msvc70/fold_impl.hpp     |   245 +
 .../mpl/aux_/preprocessed/msvc70/full_lambda.hpp   |   554 +
 .../boost/mpl/aux_/preprocessed/msvc70/greater.hpp |   102 +
 .../mpl/aux_/preprocessed/msvc70/greater_equal.hpp |   102 +
 .../boost/mpl/aux_/preprocessed/msvc70/inherit.hpp |   166 +
 .../aux_/preprocessed/msvc70/iter_fold_if_impl.hpp |   133 +
 .../aux_/preprocessed/msvc70/iter_fold_impl.hpp    |   245 +
 .../aux_/preprocessed/msvc70/lambda_no_ctps.hpp    |   229 +
 .../boost/mpl/aux_/preprocessed/msvc70/less.hpp    |   102 +
 .../mpl/aux_/preprocessed/msvc70/less_equal.hpp    |   102 +
 .../boost/mpl/aux_/preprocessed/msvc70/list.hpp    |   556 +
 .../boost/mpl/aux_/preprocessed/msvc70/list_c.hpp  |   534 +
 .../boost/mpl/aux_/preprocessed/msvc70/map.hpp     |   556 +
 .../boost/mpl/aux_/preprocessed/msvc70/minus.hpp   |   150 +
 .../boost/mpl/aux_/preprocessed/msvc70/modulus.hpp |   115 +
 .../mpl/aux_/preprocessed/msvc70/not_equal_to.hpp  |   102 +
 .../boost/mpl/aux_/preprocessed/msvc70/or.hpp      |    71 +
 .../mpl/aux_/preprocessed/msvc70/placeholders.hpp  |   105 +
 .../boost/mpl/aux_/preprocessed/msvc70/plus.hpp    |   150 +
 .../boost/mpl/aux_/preprocessed/msvc70/quote.hpp   |   116 +
 .../aux_/preprocessed/msvc70/reverse_fold_impl.hpp |   295 +
 .../preprocessed/msvc70/reverse_iter_fold_impl.hpp |   295 +
 .../boost/mpl/aux_/preprocessed/msvc70/set.hpp     |   556 +
 .../boost/mpl/aux_/preprocessed/msvc70/set_c.hpp   |   534 +
 .../mpl/aux_/preprocessed/msvc70/shift_left.hpp    |   114 +
 .../mpl/aux_/preprocessed/msvc70/shift_right.hpp   |   114 +
 .../aux_/preprocessed/msvc70/template_arity.hpp    |    46 +
 .../boost/mpl/aux_/preprocessed/msvc70/times.hpp   |   150 +
 .../mpl/aux_/preprocessed/msvc70/unpack_args.hpp   |   109 +
 .../boost/mpl/aux_/preprocessed/msvc70/vector.hpp  |   556 +
 .../mpl/aux_/preprocessed/msvc70/vector_c.hpp      |   534 +
 .../aux_/preprocessed/mwcw/advance_backward.hpp    |    97 +
 .../mpl/aux_/preprocessed/mwcw/advance_forward.hpp |    97 +
 .../boost/mpl/aux_/preprocessed/mwcw/and.hpp       |    69 +
 .../boost/mpl/aux_/preprocessed/mwcw/apply.hpp     |   169 +
 .../boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp |    52 +
 .../mpl/aux_/preprocessed/mwcw/apply_wrap.hpp      |   456 +
 .../boost/mpl/aux_/preprocessed/mwcw/arg.hpp       |   123 +
 .../mpl/aux_/preprocessed/mwcw/basic_bind.hpp      |   440 +
 .../boost/mpl/aux_/preprocessed/mwcw/bind.hpp      |   561 +
 .../boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp  |    52 +
 .../boost/mpl/aux_/preprocessed/mwcw/bitand.hpp    |   147 +
 .../boost/mpl/aux_/preprocessed/mwcw/bitor.hpp     |   147 +
 .../boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp    |   147 +
 .../boost/mpl/aux_/preprocessed/mwcw/deque.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/mwcw/divides.hpp   |   146 +
 .../boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp  |    94 +
 .../boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp |   180 +
 .../mpl/aux_/preprocessed/mwcw/full_lambda.hpp     |   554 +
 .../boost/mpl/aux_/preprocessed/mwcw/greater.hpp   |    94 +
 .../mpl/aux_/preprocessed/mwcw/greater_equal.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/mwcw/inherit.hpp   |   141 +
 .../aux_/preprocessed/mwcw/iter_fold_if_impl.hpp   |   133 +
 .../mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp  |   180 +
 .../mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp  |   229 +
 .../boost/mpl/aux_/preprocessed/mwcw/less.hpp      |    94 +
 .../mpl/aux_/preprocessed/mwcw/less_equal.hpp      |    94 +
 .../boost/mpl/aux_/preprocessed/mwcw/list.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/mwcw/list_c.hpp    |   328 +
 .../boost/mpl/aux_/preprocessed/mwcw/map.hpp       |   323 +
 .../boost/mpl/aux_/preprocessed/mwcw/minus.hpp     |   146 +
 .../boost/mpl/aux_/preprocessed/mwcw/modulus.hpp   |   101 +
 .../mpl/aux_/preprocessed/mwcw/not_equal_to.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/mwcw/or.hpp        |    69 +
 .../mpl/aux_/preprocessed/mwcw/placeholders.hpp    |   105 +
 .../boost/mpl/aux_/preprocessed/mwcw/plus.hpp      |   146 +
 .../boost/mpl/aux_/preprocessed/mwcw/quote.hpp     |   123 +
 .../aux_/preprocessed/mwcw/reverse_fold_impl.hpp   |   231 +
 .../preprocessed/mwcw/reverse_iter_fold_impl.hpp   |   231 +
 .../boost/mpl/aux_/preprocessed/mwcw/set.hpp       |   323 +
 .../boost/mpl/aux_/preprocessed/mwcw/set_c.hpp     |   328 +
 .../mpl/aux_/preprocessed/mwcw/shift_left.hpp      |    99 +
 .../mpl/aux_/preprocessed/mwcw/shift_right.hpp     |    99 +
 .../mpl/aux_/preprocessed/mwcw/template_arity.hpp  |    11 +
 .../boost/mpl/aux_/preprocessed/mwcw/times.hpp     |   146 +
 .../mpl/aux_/preprocessed/mwcw/unpack_args.hpp     |    94 +
 .../boost/mpl/aux_/preprocessed/mwcw/vector.hpp    |   323 +
 .../boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp  |   309 +
 .../aux_/preprocessed/no_ctps/advance_backward.hpp |    97 +
 .../aux_/preprocessed/no_ctps/advance_forward.hpp  |    97 +
 .../boost/mpl/aux_/preprocessed/no_ctps/and.hpp    |    73 +
 .../boost/mpl/aux_/preprocessed/no_ctps/apply.hpp  |   268 +
 .../mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp    |    50 +
 .../mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp   |    78 +
 .../boost/mpl/aux_/preprocessed/no_ctps/arg.hpp    |   123 +
 .../mpl/aux_/preprocessed/no_ctps/basic_bind.hpp   |   486 +
 .../boost/mpl/aux_/preprocessed/no_ctps/bind.hpp   |   590 ++
 .../mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp     |    52 +
 .../boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp |   134 +
 .../boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp  |   134 +
 .../boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp |   134 +
 .../boost/mpl/aux_/preprocessed/no_ctps/deque.hpp  |   556 +
 .../mpl/aux_/preprocessed/no_ctps/divides.hpp      |   133 +
 .../mpl/aux_/preprocessed/no_ctps/equal_to.hpp     |    94 +
 .../mpl/aux_/preprocessed/no_ctps/fold_impl.hpp    |   245 +
 .../mpl/aux_/preprocessed/no_ctps/full_lambda.hpp  |   554 +
 .../mpl/aux_/preprocessed/no_ctps/greater.hpp      |    94 +
 .../aux_/preprocessed/no_ctps/greater_equal.hpp    |    94 +
 .../mpl/aux_/preprocessed/no_ctps/inherit.hpp      |   166 +
 .../preprocessed/no_ctps/iter_fold_if_impl.hpp     |   133 +
 .../aux_/preprocessed/no_ctps/iter_fold_impl.hpp   |   245 +
 .../aux_/preprocessed/no_ctps/lambda_no_ctps.hpp   |   229 +
 .../boost/mpl/aux_/preprocessed/no_ctps/less.hpp   |    94 +
 .../mpl/aux_/preprocessed/no_ctps/less_equal.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/no_ctps/list.hpp   |   556 +
 .../boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp |   534 +
 .../boost/mpl/aux_/preprocessed/no_ctps/map.hpp    |   556 +
 .../boost/mpl/aux_/preprocessed/no_ctps/minus.hpp  |   133 +
 .../mpl/aux_/preprocessed/no_ctps/modulus.hpp      |   101 +
 .../mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp |    94 +
 .../boost/mpl/aux_/preprocessed/no_ctps/or.hpp     |    73 +
 .../mpl/aux_/preprocessed/no_ctps/placeholders.hpp |   105 +
 .../boost/mpl/aux_/preprocessed/no_ctps/plus.hpp   |   133 +
 .../boost/mpl/aux_/preprocessed/no_ctps/quote.hpp  |   116 +
 .../preprocessed/no_ctps/reverse_fold_impl.hpp     |   295 +
 .../no_ctps/reverse_iter_fold_impl.hpp             |   295 +
 .../boost/mpl/aux_/preprocessed/no_ctps/set.hpp    |   556 +
 .../boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp  |   534 +
 .../mpl/aux_/preprocessed/no_ctps/shift_left.hpp   |    99 +
 .../mpl/aux_/preprocessed/no_ctps/shift_right.hpp  |    99 +
 .../aux_/preprocessed/no_ctps/template_arity.hpp   |    40 +
 .../boost/mpl/aux_/preprocessed/no_ctps/times.hpp  |   133 +
 .../mpl/aux_/preprocessed/no_ctps/unpack_args.hpp  |   109 +
 .../boost/mpl/aux_/preprocessed/no_ctps/vector.hpp |   556 +
 .../mpl/aux_/preprocessed/no_ctps/vector_c.hpp     |   534 +
 .../aux_/preprocessed/no_ttp/advance_backward.hpp  |    97 +
 .../aux_/preprocessed/no_ttp/advance_forward.hpp   |    97 +
 .../boost/mpl/aux_/preprocessed/no_ttp/and.hpp     |    69 +
 .../boost/mpl/aux_/preprocessed/no_ttp/apply.hpp   |   169 +
 .../mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp     |    52 +
 .../mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp    |    84 +
 .../boost/mpl/aux_/preprocessed/no_ttp/arg.hpp     |   123 +
 .../mpl/aux_/preprocessed/no_ttp/basic_bind.hpp    |   369 +
 .../boost/mpl/aux_/preprocessed/no_ttp/bind.hpp    |   466 +
 .../mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp      |    52 +
 .../boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp  |   157 +
 .../boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp   |   157 +
 .../boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp  |   157 +
 .../boost/mpl/aux_/preprocessed/no_ttp/deque.hpp   |   323 +
 .../boost/mpl/aux_/preprocessed/no_ttp/divides.hpp |   156 +
 .../mpl/aux_/preprocessed/no_ttp/equal_to.hpp      |    98 +
 .../mpl/aux_/preprocessed/no_ttp/fold_impl.hpp     |   180 +
 .../mpl/aux_/preprocessed/no_ttp/full_lambda.hpp   |   554 +
 .../boost/mpl/aux_/preprocessed/no_ttp/greater.hpp |    98 +
 .../mpl/aux_/preprocessed/no_ttp/greater_equal.hpp |    98 +
 .../boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp |   141 +
 .../aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp |   133 +
 .../aux_/preprocessed/no_ttp/iter_fold_impl.hpp    |   180 +
 .../aux_/preprocessed/no_ttp/lambda_no_ctps.hpp    |   229 +
 .../boost/mpl/aux_/preprocessed/no_ttp/less.hpp    |    98 +
 .../mpl/aux_/preprocessed/no_ttp/less_equal.hpp    |    98 +
 .../boost/mpl/aux_/preprocessed/no_ttp/list.hpp    |   323 +
 .../boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp  |   328 +
 .../boost/mpl/aux_/preprocessed/no_ttp/map.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/no_ttp/minus.hpp   |   156 +
 .../boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp |   111 +
 .../mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp  |    98 +
 .../boost/mpl/aux_/preprocessed/no_ttp/or.hpp      |    69 +
 .../mpl/aux_/preprocessed/no_ttp/placeholders.hpp  |   105 +
 .../boost/mpl/aux_/preprocessed/no_ttp/plus.hpp    |   156 +
 .../boost/mpl/aux_/preprocessed/no_ttp/quote.hpp   |    11 +
 .../aux_/preprocessed/no_ttp/reverse_fold_impl.hpp |   231 +
 .../preprocessed/no_ttp/reverse_iter_fold_impl.hpp |   231 +
 .../boost/mpl/aux_/preprocessed/no_ttp/set.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp   |   328 +
 .../mpl/aux_/preprocessed/no_ttp/shift_left.hpp    |   110 +
 .../mpl/aux_/preprocessed/no_ttp/shift_right.hpp   |   110 +
 .../aux_/preprocessed/no_ttp/template_arity.hpp    |    40 +
 .../boost/mpl/aux_/preprocessed/no_ttp/times.hpp   |   156 +
 .../mpl/aux_/preprocessed/no_ttp/unpack_args.hpp   |    94 +
 .../boost/mpl/aux_/preprocessed/no_ttp/vector.hpp  |   323 +
 .../mpl/aux_/preprocessed/no_ttp/vector_c.hpp      |   309 +
 .../aux_/preprocessed/plain/advance_backward.hpp   |    97 +
 .../aux_/preprocessed/plain/advance_forward.hpp    |    97 +
 .../boost/mpl/aux_/preprocessed/plain/and.hpp      |    64 +
 .../boost/mpl/aux_/preprocessed/plain/apply.hpp    |   139 +
 .../mpl/aux_/preprocessed/plain/apply_fwd.hpp      |    52 +
 .../mpl/aux_/preprocessed/plain/apply_wrap.hpp     |    84 +
 .../boost/mpl/aux_/preprocessed/plain/arg.hpp      |   123 +
 .../mpl/aux_/preprocessed/plain/basic_bind.hpp     |   440 +
 .../boost/mpl/aux_/preprocessed/plain/bind.hpp     |   561 +
 .../boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp |    52 +
 .../boost/mpl/aux_/preprocessed/plain/bitand.hpp   |   142 +
 .../boost/mpl/aux_/preprocessed/plain/bitor.hpp    |   142 +
 .../boost/mpl/aux_/preprocessed/plain/bitxor.hpp   |   142 +
 .../boost/mpl/aux_/preprocessed/plain/deque.hpp    |   323 +
 .../boost/mpl/aux_/preprocessed/plain/divides.hpp  |   141 +
 .../boost/mpl/aux_/preprocessed/plain/equal_to.hpp |    92 +
 .../mpl/aux_/preprocessed/plain/fold_impl.hpp      |   180 +
 .../mpl/aux_/preprocessed/plain/full_lambda.hpp    |   554 +
 .../boost/mpl/aux_/preprocessed/plain/greater.hpp  |    92 +
 .../mpl/aux_/preprocessed/plain/greater_equal.hpp  |    92 +
 .../boost/mpl/aux_/preprocessed/plain/inherit.hpp  |   125 +
 .../aux_/preprocessed/plain/iter_fold_if_impl.hpp  |   133 +
 .../mpl/aux_/preprocessed/plain/iter_fold_impl.hpp |   180 +
 .../mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp |   228 +
 .../boost/mpl/aux_/preprocessed/plain/less.hpp     |    92 +
 .../mpl/aux_/preprocessed/plain/less_equal.hpp     |    92 +
 .../boost/mpl/aux_/preprocessed/plain/list.hpp     |   323 +
 .../boost/mpl/aux_/preprocessed/plain/list_c.hpp   |   328 +
 .../boost/mpl/aux_/preprocessed/plain/map.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/plain/minus.hpp    |   141 +
 .../boost/mpl/aux_/preprocessed/plain/modulus.hpp  |    99 +
 .../mpl/aux_/preprocessed/plain/not_equal_to.hpp   |    92 +
 .../boost/mpl/aux_/preprocessed/plain/or.hpp       |    64 +
 .../mpl/aux_/preprocessed/plain/placeholders.hpp   |   105 +
 .../boost/mpl/aux_/preprocessed/plain/plus.hpp     |   141 +
 .../boost/mpl/aux_/preprocessed/plain/quote.hpp    |   123 +
 .../aux_/preprocessed/plain/reverse_fold_impl.hpp  |   231 +
 .../preprocessed/plain/reverse_iter_fold_impl.hpp  |   231 +
 .../boost/mpl/aux_/preprocessed/plain/set.hpp      |   323 +
 .../boost/mpl/aux_/preprocessed/plain/set_c.hpp    |   328 +
 .../mpl/aux_/preprocessed/plain/shift_left.hpp     |    97 +
 .../mpl/aux_/preprocessed/plain/shift_right.hpp    |    97 +
 .../mpl/aux_/preprocessed/plain/template_arity.hpp |    11 +
 .../boost/mpl/aux_/preprocessed/plain/times.hpp    |   141 +
 .../mpl/aux_/preprocessed/plain/unpack_args.hpp    |    94 +
 .../boost/mpl/aux_/preprocessed/plain/vector.hpp   |   323 +
 .../boost/mpl/aux_/preprocessed/plain/vector_c.hpp |   309 +
 .../thirdparty/boost/mpl/aux_/preprocessor/add.hpp |    65 +
 .../mpl/aux_/preprocessor/def_params_tail.hpp      |   105 +
 .../boost/mpl/aux_/preprocessor/default_params.hpp |    67 +
 .../boost/mpl/aux_/preprocessor/enum.hpp           |    62 +
 .../boost/mpl/aux_/preprocessor/ext_params.hpp     |    78 +
 .../boost/mpl/aux_/preprocessor/filter_params.hpp  |    28 +
 .../boost/mpl/aux_/preprocessor/is_seq.hpp         |    54 +
 .../boost/mpl/aux_/preprocessor/params.hpp         |    65 +
 .../mpl/aux_/preprocessor/partial_spec_params.hpp  |    32 +
 .../boost/mpl/aux_/preprocessor/range.hpp          |    30 +
 .../boost/mpl/aux_/preprocessor/repeat.hpp         |    51 +
 .../thirdparty/boost/mpl/aux_/preprocessor/sub.hpp |    65 +
 .../boost/mpl/aux_/preprocessor/token_equal.hpp    |    56 +
 .../boost/mpl/aux_/preprocessor/tuple.hpp          |    29 +
 gatb-core/thirdparty/boost/mpl/aux_/ptr_to_ref.hpp |    46 +
 .../thirdparty/boost/mpl/aux_/push_back_impl.hpp   |    70 +
 .../thirdparty/boost/mpl/aux_/push_front_impl.hpp  |    71 +
 .../thirdparty/boost/mpl/aux_/range_c/O1_size.hpp  |    31 +
 .../thirdparty/boost/mpl/aux_/range_c/back.hpp     |    34 +
 .../thirdparty/boost/mpl/aux_/range_c/empty.hpp    |    37 +
 .../thirdparty/boost/mpl/aux_/range_c/front.hpp    |    33 +
 .../thirdparty/boost/mpl/aux_/range_c/iterator.hpp |   106 +
 .../thirdparty/boost/mpl/aux_/range_c/size.hpp     |    37 +
 .../thirdparty/boost/mpl/aux_/range_c/tag.hpp      |    24 +
 .../boost/mpl/aux_/reverse_fold_impl.hpp           |    44 +
 .../boost/mpl/aux_/reverse_fold_impl_body.hpp      |   412 +
 .../boost/mpl/aux_/reverse_iter_fold_impl.hpp      |    43 +
 .../thirdparty/boost/mpl/aux_/sequence_wrapper.hpp |   292 +
 gatb-core/thirdparty/boost/mpl/aux_/shift_op.hpp   |    87 +
 .../boost/mpl/aux_/single_element_iter.hpp         |   118 +
 gatb-core/thirdparty/boost/mpl/aux_/size_impl.hpp  |    52 +
 gatb-core/thirdparty/boost/mpl/aux_/sort_impl.hpp  |   121 +
 .../thirdparty/boost/mpl/aux_/static_cast.hpp      |    27 +
 .../thirdparty/boost/mpl/aux_/template_arity.hpp   |   189 +
 .../boost/mpl/aux_/template_arity_fwd.hpp          |    23 +
 gatb-core/thirdparty/boost/mpl/aux_/test.hpp       |    32 +
 .../thirdparty/boost/mpl/aux_/test/assert.hpp      |    29 +
 gatb-core/thirdparty/boost/mpl/aux_/test/data.hpp  |    25 +
 .../thirdparty/boost/mpl/aux_/test/test_case.hpp   |    21 +
 .../boost/mpl/aux_/traits_lambda_spec.hpp          |    63 +
 .../thirdparty/boost/mpl/aux_/transform_iter.hpp   |   123 +
 .../thirdparty/boost/mpl/aux_/type_wrapper.hpp     |    47 +
 gatb-core/thirdparty/boost/mpl/aux_/unwrap.hpp     |    51 +
 gatb-core/thirdparty/boost/mpl/aux_/value_wknd.hpp |    89 +
 gatb-core/thirdparty/boost/mpl/aux_/yes_no.hpp     |    58 +
 gatb-core/thirdparty/boost/mpl/back.hpp            |    39 +
 gatb-core/thirdparty/boost/mpl/back_fwd.hpp        |    24 +
 gatb-core/thirdparty/boost/mpl/back_inserter.hpp   |    34 +
 gatb-core/thirdparty/boost/mpl/base.hpp            |    35 +
 gatb-core/thirdparty/boost/mpl/begin.hpp           |    19 +
 gatb-core/thirdparty/boost/mpl/begin_end.hpp       |    57 +
 gatb-core/thirdparty/boost/mpl/begin_end_fwd.hpp   |    27 +
 gatb-core/thirdparty/boost/mpl/bind.hpp            |   551 +
 gatb-core/thirdparty/boost/mpl/bind_fwd.hpp        |    99 +
 gatb-core/thirdparty/boost/mpl/bitand.hpp          |    45 +
 gatb-core/thirdparty/boost/mpl/bitor.hpp           |    45 +
 gatb-core/thirdparty/boost/mpl/bitwise.hpp         |    24 +
 gatb-core/thirdparty/boost/mpl/bitxor.hpp          |    23 +
 gatb-core/thirdparty/boost/mpl/bool.hpp            |    39 +
 gatb-core/thirdparty/boost/mpl/bool_fwd.hpp        |    33 +
 gatb-core/thirdparty/boost/mpl/char.hpp            |    22 +
 gatb-core/thirdparty/boost/mpl/char_fwd.hpp        |    27 +
 gatb-core/thirdparty/boost/mpl/clear.hpp           |    39 +
 gatb-core/thirdparty/boost/mpl/clear_fwd.hpp       |    24 +
 gatb-core/thirdparty/boost/mpl/comparison.hpp      |    24 +
 gatb-core/thirdparty/boost/mpl/contains.hpp        |    41 +
 gatb-core/thirdparty/boost/mpl/contains_fwd.hpp    |    25 +
 gatb-core/thirdparty/boost/mpl/copy.hpp            |    58 +
 gatb-core/thirdparty/boost/mpl/copy_if.hpp         |    96 +
 gatb-core/thirdparty/boost/mpl/count.hpp           |    40 +
 gatb-core/thirdparty/boost/mpl/count_fwd.hpp       |    24 +
 gatb-core/thirdparty/boost/mpl/count_if.hpp        |    79 +
 gatb-core/thirdparty/boost/mpl/deque.hpp           |    58 +
 gatb-core/thirdparty/boost/mpl/deref.hpp           |    41 +
 gatb-core/thirdparty/boost/mpl/distance.hpp        |    78 +
 gatb-core/thirdparty/boost/mpl/distance_fwd.hpp    |    28 +
 gatb-core/thirdparty/boost/mpl/divides.hpp         |    21 +
 gatb-core/thirdparty/boost/mpl/empty.hpp           |    39 +
 gatb-core/thirdparty/boost/mpl/empty_base.hpp      |    63 +
 gatb-core/thirdparty/boost/mpl/empty_fwd.hpp       |    24 +
 gatb-core/thirdparty/boost/mpl/empty_sequence.hpp  |    43 +
 gatb-core/thirdparty/boost/mpl/end.hpp             |    19 +
 gatb-core/thirdparty/boost/mpl/equal.hpp           |   112 +
 gatb-core/thirdparty/boost/mpl/equal_to.hpp        |    21 +
 gatb-core/thirdparty/boost/mpl/erase.hpp           |    42 +
 gatb-core/thirdparty/boost/mpl/erase_fwd.hpp       |    24 +
 gatb-core/thirdparty/boost/mpl/erase_key.hpp       |    41 +
 gatb-core/thirdparty/boost/mpl/erase_key_fwd.hpp   |    24 +
 gatb-core/thirdparty/boost/mpl/eval_if.hpp         |    71 +
 gatb-core/thirdparty/boost/mpl/filter_view.hpp     |    46 +
 gatb-core/thirdparty/boost/mpl/find.hpp            |    38 +
 gatb-core/thirdparty/boost/mpl/find_if.hpp         |    50 +
 gatb-core/thirdparty/boost/mpl/fold.hpp            |    48 +
 gatb-core/thirdparty/boost/mpl/for_each.hpp        |   123 +
 gatb-core/thirdparty/boost/mpl/front.hpp           |    39 +
 gatb-core/thirdparty/boost/mpl/front_fwd.hpp       |    24 +
 gatb-core/thirdparty/boost/mpl/front_inserter.hpp  |    33 +
 gatb-core/thirdparty/boost/mpl/greater.hpp         |    21 +
 gatb-core/thirdparty/boost/mpl/greater_equal.hpp   |    21 +
 gatb-core/thirdparty/boost/mpl/has_key.hpp         |    41 +
 gatb-core/thirdparty/boost/mpl/has_key_fwd.hpp     |    25 +
 gatb-core/thirdparty/boost/mpl/has_xxx.hpp         |   647 ++
 gatb-core/thirdparty/boost/mpl/identity.hpp        |    45 +
 gatb-core/thirdparty/boost/mpl/if.hpp              |   135 +
 gatb-core/thirdparty/boost/mpl/index_if.hpp        |    60 +
 gatb-core/thirdparty/boost/mpl/index_of.hpp        |    39 +
 gatb-core/thirdparty/boost/mpl/inherit.hpp         |   229 +
 .../thirdparty/boost/mpl/inherit_linearly.hpp      |    39 +
 gatb-core/thirdparty/boost/mpl/insert.hpp          |    41 +
 gatb-core/thirdparty/boost/mpl/insert_fwd.hpp      |    24 +
 gatb-core/thirdparty/boost/mpl/insert_range.hpp    |    41 +
 .../thirdparty/boost/mpl/insert_range_fwd.hpp      |    24 +
 gatb-core/thirdparty/boost/mpl/inserter.hpp        |    32 +
 gatb-core/thirdparty/boost/mpl/int.hpp             |    22 +
 gatb-core/thirdparty/boost/mpl/int_fwd.hpp         |    27 +
 gatb-core/thirdparty/boost/mpl/integral_c.hpp      |    51 +
 gatb-core/thirdparty/boost/mpl/integral_c_fwd.hpp  |    32 +
 gatb-core/thirdparty/boost/mpl/integral_c_tag.hpp  |    26 +
 gatb-core/thirdparty/boost/mpl/is_placeholder.hpp  |    67 +
 gatb-core/thirdparty/boost/mpl/is_sequence.hpp     |   112 +
 gatb-core/thirdparty/boost/mpl/iter_fold.hpp       |    49 +
 gatb-core/thirdparty/boost/mpl/iter_fold_if.hpp    |   117 +
 .../thirdparty/boost/mpl/iterator_category.hpp     |    35 +
 gatb-core/thirdparty/boost/mpl/iterator_range.hpp  |    42 +
 gatb-core/thirdparty/boost/mpl/iterator_tags.hpp   |    27 +
 gatb-core/thirdparty/boost/mpl/joint_view.hpp      |    65 +
 gatb-core/thirdparty/boost/mpl/key_type.hpp        |    42 +
 gatb-core/thirdparty/boost/mpl/key_type_fwd.hpp    |    25 +
 gatb-core/thirdparty/boost/mpl/lambda.hpp          |    29 +
 gatb-core/thirdparty/boost/mpl/lambda_fwd.hpp      |    57 +
 gatb-core/thirdparty/boost/mpl/less.hpp            |    21 +
 gatb-core/thirdparty/boost/mpl/less_equal.hpp      |    21 +
 gatb-core/thirdparty/boost/mpl/limits/arity.hpp    |    21 +
 gatb-core/thirdparty/boost/mpl/limits/list.hpp     |    21 +
 gatb-core/thirdparty/boost/mpl/limits/map.hpp      |    21 +
 gatb-core/thirdparty/boost/mpl/limits/set.hpp      |    21 +
 gatb-core/thirdparty/boost/mpl/limits/string.hpp   |    21 +
 .../thirdparty/boost/mpl/limits/unrolling.hpp      |    21 +
 gatb-core/thirdparty/boost/mpl/limits/vector.hpp   |    21 +
 gatb-core/thirdparty/boost/mpl/list.hpp            |    57 +
 .../thirdparty/boost/mpl/list/aux_/O1_size.hpp     |    33 +
 .../thirdparty/boost/mpl/list/aux_/begin_end.hpp   |    44 +
 gatb-core/thirdparty/boost/mpl/list/aux_/clear.hpp |    34 +
 gatb-core/thirdparty/boost/mpl/list/aux_/empty.hpp |    34 +
 gatb-core/thirdparty/boost/mpl/list/aux_/front.hpp |    33 +
 .../boost/mpl/list/aux_/include_preprocessed.hpp   |    35 +
 gatb-core/thirdparty/boost/mpl/list/aux_/item.hpp  |    55 +
 .../thirdparty/boost/mpl/list/aux_/iterator.hpp    |    76 +
 .../thirdparty/boost/mpl/list/aux_/numbered.hpp    |    68 +
 .../thirdparty/boost/mpl/list/aux_/numbered_c.hpp  |    71 +
 .../thirdparty/boost/mpl/list/aux_/pop_front.hpp   |    34 +
 .../mpl/list/aux_/preprocessed/plain/list10.hpp    |   149 +
 .../mpl/list/aux_/preprocessed/plain/list10_c.hpp  |   164 +
 .../mpl/list/aux_/preprocessed/plain/list20.hpp    |   169 +
 .../mpl/list/aux_/preprocessed/plain/list20_c.hpp  |   173 +
 .../mpl/list/aux_/preprocessed/plain/list30.hpp    |   189 +
 .../mpl/list/aux_/preprocessed/plain/list30_c.hpp  |   183 +
 .../mpl/list/aux_/preprocessed/plain/list40.hpp    |   209 +
 .../mpl/list/aux_/preprocessed/plain/list40_c.hpp  |   193 +
 .../mpl/list/aux_/preprocessed/plain/list50.hpp    |   229 +
 .../mpl/list/aux_/preprocessed/plain/list50_c.hpp  |   203 +
 .../thirdparty/boost/mpl/list/aux_/push_back.hpp   |    36 +
 .../thirdparty/boost/mpl/list/aux_/push_front.hpp  |    39 +
 gatb-core/thirdparty/boost/mpl/list/aux_/size.hpp  |    33 +
 gatb-core/thirdparty/boost/mpl/list/aux_/tag.hpp   |    24 +
 gatb-core/thirdparty/boost/mpl/list/list0.hpp      |    42 +
 gatb-core/thirdparty/boost/mpl/list/list0_c.hpp    |    31 +
 gatb-core/thirdparty/boost/mpl/list/list10.hpp     |    43 +
 gatb-core/thirdparty/boost/mpl/list/list10_c.hpp   |    43 +
 gatb-core/thirdparty/boost/mpl/list/list20.hpp     |    43 +
 gatb-core/thirdparty/boost/mpl/list/list20_c.hpp   |    43 +
 gatb-core/thirdparty/boost/mpl/list/list30.hpp     |    43 +
 gatb-core/thirdparty/boost/mpl/list/list30_c.hpp   |    43 +
 gatb-core/thirdparty/boost/mpl/list/list40.hpp     |    43 +
 gatb-core/thirdparty/boost/mpl/list/list40_c.hpp   |    43 +
 gatb-core/thirdparty/boost/mpl/list/list50.hpp     |    43 +
 gatb-core/thirdparty/boost/mpl/list/list50_c.hpp   |    43 +
 gatb-core/thirdparty/boost/mpl/list_c.hpp          |    60 +
 gatb-core/thirdparty/boost/mpl/logical.hpp         |    21 +
 gatb-core/thirdparty/boost/mpl/long.hpp            |    22 +
 gatb-core/thirdparty/boost/mpl/long_fwd.hpp        |    27 +
 gatb-core/thirdparty/boost/mpl/lower_bound.hpp     |   143 +
 gatb-core/thirdparty/boost/mpl/map.hpp             |    57 +
 .../thirdparty/boost/mpl/map/aux_/at_impl.hpp      |   144 +
 .../boost/mpl/map/aux_/begin_end_impl.hpp          |    50 +
 .../thirdparty/boost/mpl/map/aux_/clear_impl.hpp   |    35 +
 .../boost/mpl/map/aux_/contains_impl.hpp           |    43 +
 .../thirdparty/boost/mpl/map/aux_/empty_impl.hpp   |    34 +
 .../thirdparty/boost/mpl/map/aux_/erase_impl.hpp   |    41 +
 .../boost/mpl/map/aux_/erase_key_impl.hpp          |    53 +
 .../thirdparty/boost/mpl/map/aux_/has_key_impl.hpp |    44 +
 .../boost/mpl/map/aux_/include_preprocessed.hpp    |    53 +
 .../thirdparty/boost/mpl/map/aux_/insert_impl.hpp  |    72 +
 .../boost/mpl/map/aux_/insert_range_impl.hpp       |    41 +
 gatb-core/thirdparty/boost/mpl/map/aux_/item.hpp   |   141 +
 .../thirdparty/boost/mpl/map/aux_/iterator.hpp     |   169 +
 .../boost/mpl/map/aux_/key_type_impl.hpp           |    36 +
 gatb-core/thirdparty/boost/mpl/map/aux_/map0.hpp   |    74 +
 .../thirdparty/boost/mpl/map/aux_/numbered.hpp     |   110 +
 .../mpl/map/aux_/preprocessed/no_ctps/map10.hpp    |   350 +
 .../mpl/map/aux_/preprocessed/no_ctps/map20.hpp    |   370 +
 .../mpl/map/aux_/preprocessed/no_ctps/map30.hpp    |   390 +
 .../mpl/map/aux_/preprocessed/no_ctps/map40.hpp    |   410 +
 .../mpl/map/aux_/preprocessed/no_ctps/map50.hpp    |   430 +
 .../mpl/map/aux_/preprocessed/plain/map10.hpp      |   290 +
 .../mpl/map/aux_/preprocessed/plain/map20.hpp      |   310 +
 .../mpl/map/aux_/preprocessed/plain/map30.hpp      |   330 +
 .../mpl/map/aux_/preprocessed/plain/map40.hpp      |   350 +
 .../mpl/map/aux_/preprocessed/plain/map50.hpp      |   370 +
 .../map/aux_/preprocessed/typeof_based/map10.hpp   |   150 +
 .../map/aux_/preprocessed/typeof_based/map20.hpp   |   170 +
 .../map/aux_/preprocessed/typeof_based/map30.hpp   |   190 +
 .../map/aux_/preprocessed/typeof_based/map40.hpp   |   210 +
 .../map/aux_/preprocessed/typeof_based/map50.hpp   |   230 +
 .../thirdparty/boost/mpl/map/aux_/size_impl.hpp    |    33 +
 gatb-core/thirdparty/boost/mpl/map/aux_/tag.hpp    |    24 +
 .../boost/mpl/map/aux_/value_type_impl.hpp         |    36 +
 gatb-core/thirdparty/boost/mpl/map/map0.hpp        |    37 +
 gatb-core/thirdparty/boost/mpl/map/map10.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/map/map20.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/map/map30.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/map/map40.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/map/map50.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/math/fixed_c.hpp    |    36 +
 gatb-core/thirdparty/boost/mpl/math/is_even.hpp    |    54 +
 gatb-core/thirdparty/boost/mpl/math/rational_c.hpp |    37 +
 gatb-core/thirdparty/boost/mpl/max.hpp             |    19 +
 gatb-core/thirdparty/boost/mpl/max_element.hpp     |    72 +
 gatb-core/thirdparty/boost/mpl/min.hpp             |    19 +
 gatb-core/thirdparty/boost/mpl/min_element.hpp     |    40 +
 gatb-core/thirdparty/boost/mpl/min_max.hpp         |    46 +
 gatb-core/thirdparty/boost/mpl/minus.hpp           |    21 +
 gatb-core/thirdparty/boost/mpl/modulus.hpp         |    22 +
 gatb-core/thirdparty/boost/mpl/multiplies.hpp      |    53 +
 .../boost/mpl/multiset/aux_/count_impl.hpp         |    82 +
 .../boost/mpl/multiset/aux_/insert_impl.hpp        |    34 +
 .../thirdparty/boost/mpl/multiset/aux_/item.hpp    |   114 +
 .../boost/mpl/multiset/aux_/multiset0.hpp          |    34 +
 .../thirdparty/boost/mpl/multiset/aux_/tag.hpp     |    23 +
 .../thirdparty/boost/mpl/multiset/multiset0.hpp    |    36 +
 gatb-core/thirdparty/boost/mpl/negate.hpp          |    81 +
 gatb-core/thirdparty/boost/mpl/next.hpp            |    19 +
 gatb-core/thirdparty/boost/mpl/next_prior.hpp      |    49 +
 gatb-core/thirdparty/boost/mpl/not.hpp             |    51 +
 gatb-core/thirdparty/boost/mpl/not_equal_to.hpp    |    21 +
 gatb-core/thirdparty/boost/mpl/numeric_cast.hpp    |    41 +
 gatb-core/thirdparty/boost/mpl/or.hpp              |    61 +
 gatb-core/thirdparty/boost/mpl/order.hpp           |    41 +
 gatb-core/thirdparty/boost/mpl/order_fwd.hpp       |    25 +
 gatb-core/thirdparty/boost/mpl/pair.hpp            |    70 +
 gatb-core/thirdparty/boost/mpl/pair_view.hpp       |   169 +
 gatb-core/thirdparty/boost/mpl/partition.hpp       |    53 +
 gatb-core/thirdparty/boost/mpl/placeholders.hpp    |   100 +
 gatb-core/thirdparty/boost/mpl/plus.hpp            |    21 +
 gatb-core/thirdparty/boost/mpl/pop_back.hpp        |    39 +
 gatb-core/thirdparty/boost/mpl/pop_back_fwd.hpp    |    24 +
 gatb-core/thirdparty/boost/mpl/pop_front.hpp       |    39 +
 gatb-core/thirdparty/boost/mpl/pop_front_fwd.hpp   |    24 +
 gatb-core/thirdparty/boost/mpl/print.hpp           |    75 +
 gatb-core/thirdparty/boost/mpl/prior.hpp           |    19 +
 gatb-core/thirdparty/boost/mpl/protect.hpp         |    55 +
 gatb-core/thirdparty/boost/mpl/push_back.hpp       |    53 +
 gatb-core/thirdparty/boost/mpl/push_back_fwd.hpp   |    24 +
 gatb-core/thirdparty/boost/mpl/push_front.hpp      |    52 +
 gatb-core/thirdparty/boost/mpl/push_front_fwd.hpp  |    24 +
 gatb-core/thirdparty/boost/mpl/quote.hpp           |   151 +
 gatb-core/thirdparty/boost/mpl/range_c.hpp         |    48 +
 gatb-core/thirdparty/boost/mpl/remove.hpp          |    52 +
 gatb-core/thirdparty/boost/mpl/remove_if.hpp       |    83 +
 gatb-core/thirdparty/boost/mpl/replace.hpp         |    55 +
 gatb-core/thirdparty/boost/mpl/replace_if.hpp      |    88 +
 gatb-core/thirdparty/boost/mpl/reverse.hpp         |    38 +
 gatb-core/thirdparty/boost/mpl/reverse_fold.hpp    |    50 +
 .../thirdparty/boost/mpl/reverse_iter_fold.hpp     |    56 +
 gatb-core/thirdparty/boost/mpl/same_as.hpp         |    55 +
 gatb-core/thirdparty/boost/mpl/sequence_tag.hpp    |   124 +
 .../thirdparty/boost/mpl/sequence_tag_fwd.hpp      |    26 +
 gatb-core/thirdparty/boost/mpl/set.hpp             |    57 +
 .../thirdparty/boost/mpl/set/aux_/at_impl.hpp      |    40 +
 .../boost/mpl/set/aux_/begin_end_impl.hpp          |    43 +
 .../thirdparty/boost/mpl/set/aux_/clear_impl.hpp   |    35 +
 .../thirdparty/boost/mpl/set/aux_/empty_impl.hpp   |    34 +
 .../thirdparty/boost/mpl/set/aux_/erase_impl.hpp   |    41 +
 .../boost/mpl/set/aux_/erase_key_impl.hpp          |    53 +
 .../thirdparty/boost/mpl/set/aux_/has_key_impl.hpp |    60 +
 .../boost/mpl/set/aux_/include_preprocessed.hpp    |    42 +
 .../thirdparty/boost/mpl/set/aux_/insert_impl.hpp  |    65 +
 .../boost/mpl/set/aux_/insert_range_impl.hpp       |    41 +
 gatb-core/thirdparty/boost/mpl/set/aux_/item.hpp   |    82 +
 .../thirdparty/boost/mpl/set/aux_/iterator.hpp     |    98 +
 .../boost/mpl/set/aux_/key_type_impl.hpp           |    34 +
 .../thirdparty/boost/mpl/set/aux_/numbered.hpp     |    48 +
 .../thirdparty/boost/mpl/set/aux_/numbered_c.hpp   |    48 +
 .../mpl/set/aux_/preprocessed/plain/set10.hpp      |   140 +
 .../mpl/set/aux_/preprocessed/plain/set10_c.hpp    |   145 +
 .../mpl/set/aux_/preprocessed/plain/set20.hpp      |   168 +
 .../mpl/set/aux_/preprocessed/plain/set20_c.hpp    |   154 +
 .../mpl/set/aux_/preprocessed/plain/set30.hpp      |   195 +
 .../mpl/set/aux_/preprocessed/plain/set30_c.hpp    |   164 +
 .../mpl/set/aux_/preprocessed/plain/set40.hpp      |   221 +
 .../mpl/set/aux_/preprocessed/plain/set40_c.hpp    |   174 +
 .../mpl/set/aux_/preprocessed/plain/set50.hpp      |   250 +
 .../mpl/set/aux_/preprocessed/plain/set50_c.hpp    |   184 +
 gatb-core/thirdparty/boost/mpl/set/aux_/set0.hpp   |    69 +
 .../thirdparty/boost/mpl/set/aux_/size_impl.hpp    |    33 +
 gatb-core/thirdparty/boost/mpl/set/aux_/tag.hpp    |    24 +
 .../boost/mpl/set/aux_/value_type_impl.hpp         |    34 +
 gatb-core/thirdparty/boost/mpl/set/set0.hpp        |    36 +
 gatb-core/thirdparty/boost/mpl/set/set0_c.hpp      |    32 +
 gatb-core/thirdparty/boost/mpl/set/set10.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/set/set10_c.hpp     |    45 +
 gatb-core/thirdparty/boost/mpl/set/set20.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/set/set20_c.hpp     |    45 +
 gatb-core/thirdparty/boost/mpl/set/set30.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/set/set30_c.hpp     |    45 +
 gatb-core/thirdparty/boost/mpl/set/set40.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/set/set40_c.hpp     |    45 +
 gatb-core/thirdparty/boost/mpl/set/set50.hpp       |    44 +
 gatb-core/thirdparty/boost/mpl/set/set50_c.hpp     |    45 +
 gatb-core/thirdparty/boost/mpl/set_c.hpp           |    60 +
 gatb-core/thirdparty/boost/mpl/shift_left.hpp      |    22 +
 gatb-core/thirdparty/boost/mpl/shift_right.hpp     |    22 +
 gatb-core/thirdparty/boost/mpl/single_view.hpp     |    38 +
 gatb-core/thirdparty/boost/mpl/size.hpp            |    42 +
 gatb-core/thirdparty/boost/mpl/size_fwd.hpp        |    24 +
 gatb-core/thirdparty/boost/mpl/size_t.hpp          |    25 +
 gatb-core/thirdparty/boost/mpl/size_t_fwd.hpp      |    28 +
 gatb-core/thirdparty/boost/mpl/sizeof.hpp          |    36 +
 gatb-core/thirdparty/boost/mpl/sort.hpp            |    27 +
 .../thirdparty/boost/mpl/stable_partition.hpp      |    75 +
 gatb-core/thirdparty/boost/mpl/string.hpp          |   607 ++
 gatb-core/thirdparty/boost/mpl/switch.hpp          |    49 +
 gatb-core/thirdparty/boost/mpl/tag.hpp             |    52 +
 gatb-core/thirdparty/boost/mpl/times.hpp           |    21 +
 gatb-core/thirdparty/boost/mpl/transform.hpp       |   145 +
 gatb-core/thirdparty/boost/mpl/transform_view.hpp  |    46 +
 gatb-core/thirdparty/boost/mpl/unique.hpp          |    85 +
 gatb-core/thirdparty/boost/mpl/unpack_args.hpp     |   150 +
 gatb-core/thirdparty/boost/mpl/upper_bound.hpp     |   141 +
 gatb-core/thirdparty/boost/mpl/value_type.hpp      |    42 +
 gatb-core/thirdparty/boost/mpl/value_type_fwd.hpp  |    25 +
 gatb-core/thirdparty/boost/mpl/vector.hpp          |    57 +
 .../thirdparty/boost/mpl/vector/aux_/O1_size.hpp   |    56 +
 gatb-core/thirdparty/boost/mpl/vector/aux_/at.hpp  |   116 +
 .../thirdparty/boost/mpl/vector/aux_/back.hpp      |    59 +
 .../thirdparty/boost/mpl/vector/aux_/begin_end.hpp |    49 +
 .../thirdparty/boost/mpl/vector/aux_/clear.hpp     |    55 +
 .../thirdparty/boost/mpl/vector/aux_/empty.hpp     |    68 +
 .../thirdparty/boost/mpl/vector/aux_/front.hpp     |    56 +
 .../boost/mpl/vector/aux_/include_preprocessed.hpp |    55 +
 .../thirdparty/boost/mpl/vector/aux_/item.hpp      |   103 +
 .../thirdparty/boost/mpl/vector/aux_/iterator.hpp  |   130 +
 .../thirdparty/boost/mpl/vector/aux_/numbered.hpp  |   218 +
 .../boost/mpl/vector/aux_/numbered_c.hpp           |    77 +
 .../thirdparty/boost/mpl/vector/aux_/pop_back.hpp  |    40 +
 .../thirdparty/boost/mpl/vector/aux_/pop_front.hpp |    40 +
 .../vector/aux_/preprocessed/no_ctps/vector10.hpp  |  1528 +++
 .../aux_/preprocessed/no_ctps/vector10_c.hpp       |   149 +
 .../vector/aux_/preprocessed/no_ctps/vector20.hpp  |  1804 ++++
 .../aux_/preprocessed/no_ctps/vector20_c.hpp       |   195 +
 .../vector/aux_/preprocessed/no_ctps/vector30.hpp  |  2124 ++++
 .../aux_/preprocessed/no_ctps/vector30_c.hpp       |   238 +
 .../vector/aux_/preprocessed/no_ctps/vector40.hpp  |  2444 +++++
 .../aux_/preprocessed/no_ctps/vector40_c.hpp       |   281 +
 .../vector/aux_/preprocessed/no_ctps/vector50.hpp  |  2764 +++++
 .../aux_/preprocessed/no_ctps/vector50_c.hpp       |   325 +
 .../vector/aux_/preprocessed/plain/vector10.hpp    |   829 ++
 .../vector/aux_/preprocessed/plain/vector10_c.hpp  |   149 +
 .../vector/aux_/preprocessed/plain/vector20.hpp    |  1144 +++
 .../vector/aux_/preprocessed/plain/vector20_c.hpp  |   195 +
 .../vector/aux_/preprocessed/plain/vector30.hpp    |  1464 +++
 .../vector/aux_/preprocessed/plain/vector30_c.hpp  |   238 +
 .../vector/aux_/preprocessed/plain/vector40.hpp    |  1784 ++++
 .../vector/aux_/preprocessed/plain/vector40_c.hpp  |   281 +
 .../vector/aux_/preprocessed/plain/vector50.hpp    |  2104 ++++
 .../vector/aux_/preprocessed/plain/vector50_c.hpp  |   325 +
 .../aux_/preprocessed/typeof_based/vector10.hpp    |   139 +
 .../aux_/preprocessed/typeof_based/vector10_c.hpp  |   154 +
 .../aux_/preprocessed/typeof_based/vector20.hpp    |   159 +
 .../aux_/preprocessed/typeof_based/vector20_c.hpp  |   163 +
 .../aux_/preprocessed/typeof_based/vector30.hpp    |   179 +
 .../aux_/preprocessed/typeof_based/vector30_c.hpp  |   173 +
 .../aux_/preprocessed/typeof_based/vector40.hpp    |   199 +
 .../aux_/preprocessed/typeof_based/vector40_c.hpp  |   183 +
 .../aux_/preprocessed/typeof_based/vector50.hpp    |   219 +
 .../aux_/preprocessed/typeof_based/vector50_c.hpp  |   193 +
 .../thirdparty/boost/mpl/vector/aux_/push_back.hpp |    40 +
 .../boost/mpl/vector/aux_/push_front.hpp           |    40 +
 .../thirdparty/boost/mpl/vector/aux_/size.hpp      |    49 +
 gatb-core/thirdparty/boost/mpl/vector/aux_/tag.hpp |    32 +
 .../thirdparty/boost/mpl/vector/aux_/vector0.hpp   |    52 +
 gatb-core/thirdparty/boost/mpl/vector/vector0.hpp  |    34 +
 .../thirdparty/boost/mpl/vector/vector0_c.hpp      |    31 +
 gatb-core/thirdparty/boost/mpl/vector/vector10.hpp |    45 +
 .../thirdparty/boost/mpl/vector/vector10_c.hpp     |    46 +
 gatb-core/thirdparty/boost/mpl/vector/vector20.hpp |    45 +
 .../thirdparty/boost/mpl/vector/vector20_c.hpp     |    46 +
 gatb-core/thirdparty/boost/mpl/vector/vector30.hpp |    45 +
 .../thirdparty/boost/mpl/vector/vector30_c.hpp     |    47 +
 gatb-core/thirdparty/boost/mpl/vector/vector40.hpp |    45 +
 .../thirdparty/boost/mpl/vector/vector40_c.hpp     |    46 +
 gatb-core/thirdparty/boost/mpl/vector/vector50.hpp |    45 +
 .../thirdparty/boost/mpl/vector/vector50_c.hpp     |    46 +
 gatb-core/thirdparty/boost/mpl/vector_c.hpp        |    61 +
 gatb-core/thirdparty/boost/mpl/void.hpp            |    76 +
 gatb-core/thirdparty/boost/mpl/void_fwd.hpp        |    26 +
 gatb-core/thirdparty/boost/mpl/zip_view.hpp        |    65 +
 gatb-core/thirdparty/boost/noncopyable.hpp         |    17 +
 gatb-core/thirdparty/boost/preprocessor.hpp        |    19 +
 .../thirdparty/boost/preprocessor/arithmetic.hpp   |    25 +
 .../boost/preprocessor/arithmetic/add.hpp          |    51 +
 .../boost/preprocessor/arithmetic/dec.hpp          |   288 +
 .../preprocessor/arithmetic/detail/div_base.hpp    |    61 +
 .../boost/preprocessor/arithmetic/div.hpp          |    39 +
 .../boost/preprocessor/arithmetic/inc.hpp          |   288 +
 .../boost/preprocessor/arithmetic/mod.hpp          |    39 +
 .../boost/preprocessor/arithmetic/mul.hpp          |    53 +
 .../boost/preprocessor/arithmetic/sub.hpp          |    50 +
 gatb-core/thirdparty/boost/preprocessor/array.hpp  |    32 +
 .../thirdparty/boost/preprocessor/array/data.hpp   |    28 +
 .../thirdparty/boost/preprocessor/array/elem.hpp   |    29 +
 .../thirdparty/boost/preprocessor/array/enum.hpp   |    33 +
 .../thirdparty/boost/preprocessor/array/insert.hpp |    55 +
 .../boost/preprocessor/array/pop_back.hpp          |    37 +
 .../boost/preprocessor/array/pop_front.hpp         |    38 +
 .../boost/preprocessor/array/push_back.hpp         |    33 +
 .../boost/preprocessor/array/push_front.hpp        |    33 +
 .../thirdparty/boost/preprocessor/array/remove.hpp |    54 +
 .../boost/preprocessor/array/replace.hpp           |    49 +
 .../boost/preprocessor/array/reverse.hpp           |    29 +
 .../thirdparty/boost/preprocessor/array/size.hpp   |    28 +
 .../boost/preprocessor/array/to_list.hpp           |    33 +
 .../thirdparty/boost/preprocessor/array/to_seq.hpp |    33 +
 .../boost/preprocessor/array/to_tuple.hpp          |    22 +
 .../thirdparty/boost/preprocessor/assert_msg.hpp   |    17 +
 gatb-core/thirdparty/boost/preprocessor/cat.hpp    |    35 +
 gatb-core/thirdparty/boost/preprocessor/comma.hpp  |    17 +
 .../thirdparty/boost/preprocessor/comma_if.hpp     |    17 +
 .../thirdparty/boost/preprocessor/comparison.hpp   |    24 +
 .../boost/preprocessor/comparison/equal.hpp        |    34 +
 .../boost/preprocessor/comparison/greater.hpp      |    38 +
 .../preprocessor/comparison/greater_equal.hpp      |    38 +
 .../boost/preprocessor/comparison/less.hpp         |    46 +
 .../boost/preprocessor/comparison/less_equal.hpp   |    39 +
 .../boost/preprocessor/comparison/not_equal.hpp    |   814 ++
 .../boost/preprocessor/config/config.hpp           |   105 +
 .../boost/preprocessor/config/limits.hpp           |    30 +
 .../thirdparty/boost/preprocessor/control.hpp      |    22 +
 .../boost/preprocessor/control/deduce_d.hpp        |    22 +
 .../preprocessor/control/detail/dmc/while.hpp      |   536 +
 .../preprocessor/control/detail/edg/while.hpp      |   534 +
 .../preprocessor/control/detail/msvc/while.hpp     |   277 +
 .../boost/preprocessor/control/detail/while.hpp    |   536 +
 .../boost/preprocessor/control/expr_if.hpp         |    30 +
 .../boost/preprocessor/control/expr_iif.hpp        |    31 +
 .../thirdparty/boost/preprocessor/control/if.hpp   |    30 +
 .../thirdparty/boost/preprocessor/control/iif.hpp  |    34 +
 .../boost/preprocessor/control/while.hpp           |   312 +
 gatb-core/thirdparty/boost/preprocessor/debug.hpp  |    18 +
 .../thirdparty/boost/preprocessor/debug/assert.hpp |    44 +
 .../thirdparty/boost/preprocessor/debug/error.hpp  |    33 +
 .../thirdparty/boost/preprocessor/debug/line.hpp   |    35 +
 gatb-core/thirdparty/boost/preprocessor/dec.hpp    |    17 +
 .../boost/preprocessor/detail/auto_rec.hpp         |   293 +
 .../thirdparty/boost/preprocessor/detail/check.hpp |    48 +
 .../boost/preprocessor/detail/dmc/auto_rec.hpp     |   286 +
 .../boost/preprocessor/detail/is_binary.hpp        |    30 +
 .../boost/preprocessor/detail/is_nullary.hpp       |    30 +
 .../boost/preprocessor/detail/is_unary.hpp         |    30 +
 .../thirdparty/boost/preprocessor/detail/null.hpp  |    17 +
 .../thirdparty/boost/preprocessor/detail/split.hpp |    35 +
 gatb-core/thirdparty/boost/preprocessor/empty.hpp  |    17 +
 gatb-core/thirdparty/boost/preprocessor/enum.hpp   |    17 +
 .../thirdparty/boost/preprocessor/enum_params.hpp  |    17 +
 .../preprocessor/enum_params_with_a_default.hpp    |    17 +
 .../preprocessor/enum_params_with_defaults.hpp     |    17 +
 .../thirdparty/boost/preprocessor/enum_shifted.hpp |    17 +
 .../boost/preprocessor/enum_shifted_params.hpp     |    17 +
 gatb-core/thirdparty/boost/preprocessor/expand.hpp |    17 +
 .../thirdparty/boost/preprocessor/expr_if.hpp      |    17 +
 .../thirdparty/boost/preprocessor/facilities.hpp   |    23 +
 .../boost/preprocessor/facilities/apply.hpp        |    34 +
 .../boost/preprocessor/facilities/empty.hpp        |    21 +
 .../boost/preprocessor/facilities/expand.hpp       |    28 +
 .../boost/preprocessor/facilities/identity.hpp     |    23 +
 .../boost/preprocessor/facilities/intercept.hpp    |   277 +
 .../boost/preprocessor/facilities/is_1.hpp         |    23 +
 .../boost/preprocessor/facilities/is_empty.hpp     |    43 +
 .../preprocessor/facilities/is_empty_or_1.hpp      |    30 +
 .../boost/preprocessor/facilities/overload.hpp     |    25 +
 gatb-core/thirdparty/boost/preprocessor/for.hpp    |    17 +
 .../thirdparty/boost/preprocessor/identity.hpp     |    17 +
 gatb-core/thirdparty/boost/preprocessor/if.hpp     |    17 +
 gatb-core/thirdparty/boost/preprocessor/inc.hpp    |    17 +
 .../thirdparty/boost/preprocessor/iterate.hpp      |    17 +
 .../thirdparty/boost/preprocessor/iteration.hpp    |    19 +
 .../iteration/detail/bounds/lower1.hpp             |    99 +
 .../iteration/detail/bounds/lower2.hpp             |    99 +
 .../iteration/detail/bounds/lower3.hpp             |    99 +
 .../iteration/detail/bounds/lower4.hpp             |    99 +
 .../iteration/detail/bounds/lower5.hpp             |    99 +
 .../iteration/detail/bounds/upper1.hpp             |    99 +
 .../iteration/detail/bounds/upper2.hpp             |    99 +
 .../iteration/detail/bounds/upper3.hpp             |    99 +
 .../iteration/detail/bounds/upper4.hpp             |    99 +
 .../iteration/detail/bounds/upper5.hpp             |    99 +
 .../boost/preprocessor/iteration/detail/finish.hpp |    99 +
 .../iteration/detail/iter/forward1.hpp             |  1342 +++
 .../iteration/detail/iter/forward2.hpp             |  1338 +++
 .../iteration/detail/iter/forward3.hpp             |  1338 +++
 .../iteration/detail/iter/forward4.hpp             |  1338 +++
 .../iteration/detail/iter/forward5.hpp             |  1338 +++
 .../iteration/detail/iter/reverse1.hpp             |  1296 +++
 .../iteration/detail/iter/reverse2.hpp             |  1296 +++
 .../iteration/detail/iter/reverse3.hpp             |  1296 +++
 .../iteration/detail/iter/reverse4.hpp             |  1296 +++
 .../iteration/detail/iter/reverse5.hpp             |  1296 +++
 .../boost/preprocessor/iteration/detail/local.hpp  |   812 ++
 .../boost/preprocessor/iteration/detail/rlocal.hpp |   782 ++
 .../boost/preprocessor/iteration/detail/self.hpp   |    21 +
 .../boost/preprocessor/iteration/detail/start.hpp  |    99 +
 .../boost/preprocessor/iteration/iterate.hpp       |    82 +
 .../boost/preprocessor/iteration/local.hpp         |    26 +
 .../boost/preprocessor/iteration/self.hpp          |    19 +
 .../thirdparty/boost/preprocessor/library.hpp      |    36 +
 gatb-core/thirdparty/boost/preprocessor/limits.hpp |    17 +
 gatb-core/thirdparty/boost/preprocessor/list.hpp   |    37 +
 .../thirdparty/boost/preprocessor/list/adt.hpp     |    73 +
 .../thirdparty/boost/preprocessor/list/append.hpp  |    40 +
 .../thirdparty/boost/preprocessor/list/at.hpp      |    39 +
 .../thirdparty/boost/preprocessor/list/cat.hpp     |    42 +
 .../preprocessor/list/detail/dmc/fold_left.hpp     |   279 +
 .../preprocessor/list/detail/edg/fold_left.hpp     |   536 +
 .../preprocessor/list/detail/edg/fold_right.hpp    |   794 ++
 .../boost/preprocessor/list/detail/fold_left.hpp   |   279 +
 .../boost/preprocessor/list/detail/fold_right.hpp  |   277 +
 .../thirdparty/boost/preprocessor/list/enum.hpp    |    41 +
 .../thirdparty/boost/preprocessor/list/filter.hpp  |    54 +
 .../thirdparty/boost/preprocessor/list/first_n.hpp |    58 +
 .../boost/preprocessor/list/fold_left.hpp          |   303 +
 .../boost/preprocessor/list/fold_right.hpp         |    40 +
 .../boost/preprocessor/list/for_each.hpp           |    49 +
 .../boost/preprocessor/list/for_each_i.hpp         |    65 +
 .../boost/preprocessor/list/for_each_product.hpp   |   141 +
 .../thirdparty/boost/preprocessor/list/rest_n.hpp  |    55 +
 .../thirdparty/boost/preprocessor/list/reverse.hpp |    40 +
 .../thirdparty/boost/preprocessor/list/size.hpp    |    58 +
 .../boost/preprocessor/list/to_array.hpp           |   123 +
 .../thirdparty/boost/preprocessor/list/to_seq.hpp  |    32 +
 .../boost/preprocessor/list/to_tuple.hpp           |    38 +
 .../boost/preprocessor/list/transform.hpp          |    49 +
 .../thirdparty/boost/preprocessor/logical.hpp      |    29 +
 .../thirdparty/boost/preprocessor/logical/and.hpp  |    30 +
 .../boost/preprocessor/logical/bitand.hpp          |    38 +
 .../boost/preprocessor/logical/bitnor.hpp          |    38 +
 .../boost/preprocessor/logical/bitor.hpp           |    38 +
 .../boost/preprocessor/logical/bitxor.hpp          |    38 +
 .../thirdparty/boost/preprocessor/logical/bool.hpp |   288 +
 .../boost/preprocessor/logical/compl.hpp           |    36 +
 .../thirdparty/boost/preprocessor/logical/nor.hpp  |    30 +
 .../thirdparty/boost/preprocessor/logical/not.hpp  |    30 +
 .../thirdparty/boost/preprocessor/logical/or.hpp   |    30 +
 .../thirdparty/boost/preprocessor/logical/xor.hpp  |    30 +
 gatb-core/thirdparty/boost/preprocessor/max.hpp    |    17 +
 gatb-core/thirdparty/boost/preprocessor/min.hpp    |    17 +
 .../thirdparty/boost/preprocessor/punctuation.hpp  |    20 +
 .../boost/preprocessor/punctuation/comma.hpp       |    21 +
 .../boost/preprocessor/punctuation/comma_if.hpp    |    31 +
 .../boost/preprocessor/punctuation/paren.hpp       |    23 +
 .../boost/preprocessor/punctuation/paren_if.hpp    |    38 +
 gatb-core/thirdparty/boost/preprocessor/repeat.hpp |    17 +
 .../thirdparty/boost/preprocessor/repeat_2nd.hpp   |    17 +
 .../thirdparty/boost/preprocessor/repeat_3rd.hpp   |    17 +
 .../boost/preprocessor/repeat_from_to.hpp          |    17 +
 .../boost/preprocessor/repeat_from_to_2nd.hpp      |    17 +
 .../boost/preprocessor/repeat_from_to_3rd.hpp      |    17 +
 .../thirdparty/boost/preprocessor/repetition.hpp   |    32 +
 .../boost/preprocessor/repetition/deduce_r.hpp     |    22 +
 .../boost/preprocessor/repetition/deduce_z.hpp     |    22 +
 .../preprocessor/repetition/detail/dmc/for.hpp     |   536 +
 .../preprocessor/repetition/detail/edg/for.hpp     |   534 +
 .../boost/preprocessor/repetition/detail/for.hpp   |   536 +
 .../preprocessor/repetition/detail/msvc/for.hpp    |   277 +
 .../boost/preprocessor/repetition/enum.hpp         |    66 +
 .../preprocessor/repetition/enum_binary_params.hpp |    54 +
 .../boost/preprocessor/repetition/enum_params.hpp  |    41 +
 .../repetition/enum_params_with_a_default.hpp      |    25 +
 .../repetition/enum_params_with_defaults.hpp       |    24 +
 .../boost/preprocessor/repetition/enum_shifted.hpp |    68 +
 .../repetition/enum_shifted_binary_params.hpp      |    51 +
 .../repetition/enum_shifted_params.hpp             |    44 +
 .../preprocessor/repetition/enum_trailing.hpp      |    63 +
 .../repetition/enum_trailing_binary_params.hpp     |    53 +
 .../repetition/enum_trailing_params.hpp            |    38 +
 .../boost/preprocessor/repetition/for.hpp          |   306 +
 .../boost/preprocessor/repetition/repeat.hpp       |   825 ++
 .../preprocessor/repetition/repeat_from_to.hpp     |    87 +
 .../thirdparty/boost/preprocessor/selection.hpp    |    18 +
 .../boost/preprocessor/selection/max.hpp           |    39 +
 .../boost/preprocessor/selection/min.hpp           |    39 +
 gatb-core/thirdparty/boost/preprocessor/seq.hpp    |    43 +
 .../thirdparty/boost/preprocessor/seq/cat.hpp      |    49 +
 .../preprocessor/seq/detail/binary_transform.hpp   |    40 +
 .../boost/preprocessor/seq/detail/split.hpp        |   284 +
 .../thirdparty/boost/preprocessor/seq/elem.hpp     |   304 +
 .../thirdparty/boost/preprocessor/seq/enum.hpp     |   288 +
 .../thirdparty/boost/preprocessor/seq/filter.hpp   |    54 +
 .../thirdparty/boost/preprocessor/seq/first_n.hpp  |    30 +
 .../boost/preprocessor/seq/fold_left.hpp           |  1070 ++
 .../boost/preprocessor/seq/fold_right.hpp          |   288 +
 .../thirdparty/boost/preprocessor/seq/for_each.hpp |    60 +
 .../boost/preprocessor/seq/for_each_i.hpp          |    61 +
 .../boost/preprocessor/seq/for_each_product.hpp    |   126 +
 .../thirdparty/boost/preprocessor/seq/insert.hpp   |    28 +
 .../thirdparty/boost/preprocessor/seq/pop_back.hpp |    29 +
 .../boost/preprocessor/seq/pop_front.hpp           |    27 +
 .../boost/preprocessor/seq/push_back.hpp           |    19 +
 .../boost/preprocessor/seq/push_front.hpp          |    19 +
 .../thirdparty/boost/preprocessor/seq/remove.hpp   |    29 +
 .../thirdparty/boost/preprocessor/seq/replace.hpp  |    29 +
 .../thirdparty/boost/preprocessor/seq/rest_n.hpp   |    30 +
 .../thirdparty/boost/preprocessor/seq/reverse.hpp  |    39 +
 .../thirdparty/boost/preprocessor/seq/seq.hpp      |    44 +
 .../thirdparty/boost/preprocessor/seq/size.hpp     |   547 +
 .../thirdparty/boost/preprocessor/seq/subseq.hpp   |    28 +
 .../thirdparty/boost/preprocessor/seq/to_array.hpp |    28 +
 .../thirdparty/boost/preprocessor/seq/to_list.hpp  |    29 +
 .../thirdparty/boost/preprocessor/seq/to_tuple.hpp |    27 +
 .../boost/preprocessor/seq/transform.hpp           |    48 +
 gatb-core/thirdparty/boost/preprocessor/slot.hpp   |    17 +
 .../thirdparty/boost/preprocessor/slot/counter.hpp |    25 +
 .../boost/preprocessor/slot/detail/counter.hpp     |   269 +
 .../boost/preprocessor/slot/detail/def.hpp         |    49 +
 .../boost/preprocessor/slot/detail/shared.hpp      |   247 +
 .../boost/preprocessor/slot/detail/slot1.hpp       |   267 +
 .../boost/preprocessor/slot/detail/slot2.hpp       |   267 +
 .../boost/preprocessor/slot/detail/slot3.hpp       |   267 +
 .../boost/preprocessor/slot/detail/slot4.hpp       |   267 +
 .../boost/preprocessor/slot/detail/slot5.hpp       |   267 +
 .../thirdparty/boost/preprocessor/slot/slot.hpp    |    32 +
 .../thirdparty/boost/preprocessor/stringize.hpp    |    33 +
 gatb-core/thirdparty/boost/preprocessor/tuple.hpp  |    28 +
 .../thirdparty/boost/preprocessor/tuple/eat.hpp    |   106 +
 .../thirdparty/boost/preprocessor/tuple/elem.hpp   |   191 +
 .../thirdparty/boost/preprocessor/tuple/enum.hpp   |    22 +
 .../thirdparty/boost/preprocessor/tuple/rem.hpp    |   135 +
 .../boost/preprocessor/tuple/reverse.hpp           |   114 +
 .../thirdparty/boost/preprocessor/tuple/size.hpp   |    28 +
 .../boost/preprocessor/tuple/to_array.hpp          |    37 +
 .../boost/preprocessor/tuple/to_list.hpp           |   116 +
 .../thirdparty/boost/preprocessor/tuple/to_seq.hpp |   114 +
 .../thirdparty/boost/preprocessor/variadic.hpp     |    23 +
 .../boost/preprocessor/variadic/elem.hpp           |    94 +
 .../boost/preprocessor/variadic/size.hpp           |    30 +
 .../boost/preprocessor/variadic/to_array.hpp       |    32 +
 .../boost/preprocessor/variadic/to_list.hpp        |    25 +
 .../boost/preprocessor/variadic/to_seq.hpp         |    25 +
 .../boost/preprocessor/variadic/to_tuple.hpp       |    24 +
 gatb-core/thirdparty/boost/preprocessor/while.hpp  |    17 +
 .../thirdparty/boost/preprocessor/wstringize.hpp   |    29 +
 gatb-core/thirdparty/boost/ref.hpp                 |    17 +
 gatb-core/thirdparty/boost/static_assert.hpp       |   195 +
 gatb-core/thirdparty/boost/swap.hpp                |    17 +
 gatb-core/thirdparty/boost/throw_exception.hpp     |   102 +
 gatb-core/thirdparty/boost/type_index.hpp          |   265 +
 .../boost/type_index/ctti_type_index.hpp           |   179 +
 .../type_index/detail/compile_time_type_info.hpp   |   144 +
 .../type_index/detail/ctti_register_class.hpp      |    40 +
 .../boost/type_index/detail/stl_register_class.hpp |    40 +
 .../thirdparty/boost/type_index/stl_type_index.hpp |   272 +
 .../boost/type_index/type_index_facade.hpp         |   300 +
 gatb-core/thirdparty/boost/type_traits.hpp         |   102 +
 .../thirdparty/boost/type_traits/add_const.hpp     |    45 +
 gatb-core/thirdparty/boost/type_traits/add_cv.hpp  |    46 +
 .../boost/type_traits/add_lvalue_reference.hpp     |    26 +
 .../thirdparty/boost/type_traits/add_pointer.hpp   |    72 +
 .../thirdparty/boost/type_traits/add_reference.hpp |    72 +
 .../boost/type_traits/add_rvalue_reference.hpp     |    66 +
 .../thirdparty/boost/type_traits/add_volatile.hpp  |    45 +
 .../boost/type_traits/aligned_storage.hpp          |    13 +
 .../thirdparty/boost/type_traits/alignment_of.hpp  |   126 +
 .../boost/type_traits/alignment_traits.hpp         |    15 +
 .../boost/type_traits/arithmetic_traits.hpp        |    20 +
 .../thirdparty/boost/type_traits/array_traits.hpp  |    15 +
 .../boost/type_traits/broken_compiler_spec.hpp     |    14 +
 .../thirdparty/boost/type_traits/common_type.hpp   |   157 +
 .../boost/type_traits/composite_traits.hpp         |    29 +
 .../thirdparty/boost/type_traits/conditional.hpp   |    25 +
 gatb-core/thirdparty/boost/type_traits/config.hpp  |    72 +
 .../boost/type_traits/conversion_traits.hpp        |    17 +
 .../thirdparty/boost/type_traits/cv_traits.hpp     |    24 +
 gatb-core/thirdparty/boost/type_traits/decay.hpp   |    44 +
 .../boost/type_traits/detail/bool_trait_def.hpp    |   188 +
 .../boost/type_traits/detail/bool_trait_undef.hpp  |    28 +
 .../boost/type_traits/detail/common_type_imp.hpp   |   333 +
 .../boost/type_traits/detail/cv_traits_impl.hpp    |   140 +
 .../boost/type_traits/detail/false_result.hpp      |    28 +
 .../type_traits/detail/has_binary_operator.hpp     |   229 +
 .../type_traits/detail/has_postfix_operator.hpp    |   202 +
 .../type_traits/detail/has_prefix_operator.hpp     |   210 +
 .../boost/type_traits/detail/ice_and.hpp           |    35 +
 .../thirdparty/boost/type_traits/detail/ice_eq.hpp |    36 +
 .../boost/type_traits/detail/ice_not.hpp           |    31 +
 .../thirdparty/boost/type_traits/detail/ice_or.hpp |    34 +
 .../type_traits/detail/is_function_ptr_helper.hpp  |   168 +
 .../type_traits/detail/is_function_ptr_tester.hpp  |   440 +
 .../type_traits/detail/is_mem_fun_pointer_impl.hpp |   713 ++
 .../detail/is_mem_fun_pointer_tester.hpp           |  1790 ++++
 .../boost/type_traits/detail/size_t_trait_def.hpp  |    51 +
 .../type_traits/detail/size_t_trait_undef.hpp      |    16 +
 .../type_traits/detail/template_arity_spec.hpp     |    31 +
 .../boost/type_traits/detail/type_trait_def.hpp    |    67 +
 .../boost/type_traits/detail/type_trait_undef.hpp  |    19 +
 .../thirdparty/boost/type_traits/detail/wrap.hpp   |    18 +
 .../boost/type_traits/detail/yes_no_type.hpp       |    26 +
 gatb-core/thirdparty/boost/type_traits/extent.hpp  |   141 +
 .../boost/type_traits/floating_point_promotion.hpp |    91 +
 .../boost/type_traits/function_traits.hpp          |   174 +
 .../thirdparty/boost/type_traits/has_bit_and.hpp   |    49 +
 .../boost/type_traits/has_bit_and_assign.hpp       |    55 +
 .../thirdparty/boost/type_traits/has_bit_or.hpp    |    49 +
 .../boost/type_traits/has_bit_or_assign.hpp        |    55 +
 .../thirdparty/boost/type_traits/has_bit_xor.hpp   |    49 +
 .../boost/type_traits/has_bit_xor_assign.hpp       |    55 +
 .../boost/type_traits/has_complement.hpp           |    32 +
 .../boost/type_traits/has_dereference.hpp          |    31 +
 .../thirdparty/boost/type_traits/has_divides.hpp   |    40 +
 .../boost/type_traits/has_divides_assign.hpp       |    47 +
 .../thirdparty/boost/type_traits/has_equal_to.hpp  |    49 +
 .../thirdparty/boost/type_traits/has_greater.hpp   |    49 +
 .../boost/type_traits/has_greater_equal.hpp        |    49 +
 .../boost/type_traits/has_left_shift.hpp           |    49 +
 .../boost/type_traits/has_left_shift_assign.hpp    |    55 +
 .../thirdparty/boost/type_traits/has_less.hpp      |    49 +
 .../boost/type_traits/has_less_equal.hpp           |    49 +
 .../boost/type_traits/has_logical_and.hpp          |    40 +
 .../boost/type_traits/has_logical_not.hpp          |    32 +
 .../boost/type_traits/has_logical_or.hpp           |    40 +
 .../thirdparty/boost/type_traits/has_minus.hpp     |    60 +
 .../boost/type_traits/has_minus_assign.hpp         |    65 +
 .../thirdparty/boost/type_traits/has_modulus.hpp   |    49 +
 .../boost/type_traits/has_modulus_assign.hpp       |    55 +
 .../boost/type_traits/has_multiplies.hpp           |    40 +
 .../boost/type_traits/has_multiplies_assign.hpp    |    47 +
 .../thirdparty/boost/type_traits/has_negate.hpp    |    25 +
 .../boost/type_traits/has_new_operator.hpp         |   154 +
 .../boost/type_traits/has_not_equal_to.hpp         |    49 +
 .../boost/type_traits/has_nothrow_assign.hpp       |    44 +
 .../boost/type_traits/has_nothrow_constructor.hpp  |    53 +
 .../boost/type_traits/has_nothrow_copy.hpp         |    53 +
 .../boost/type_traits/has_nothrow_destructor.hpp   |    25 +
 .../thirdparty/boost/type_traits/has_operator.hpp  |    51 +
 .../thirdparty/boost/type_traits/has_plus.hpp      |    54 +
 .../boost/type_traits/has_plus_assign.hpp          |    66 +
 .../boost/type_traits/has_post_decrement.hpp       |    44 +
 .../boost/type_traits/has_post_increment.hpp       |    44 +
 .../boost/type_traits/has_pre_decrement.hpp        |    44 +
 .../boost/type_traits/has_pre_increment.hpp        |    44 +
 .../boost/type_traits/has_right_shift.hpp          |    49 +
 .../boost/type_traits/has_right_shift_assign.hpp   |    55 +
 .../boost/type_traits/has_trivial_assign.hpp       |    57 +
 .../boost/type_traits/has_trivial_constructor.hpp  |    51 +
 .../boost/type_traits/has_trivial_copy.hpp         |    82 +
 .../boost/type_traits/has_trivial_destructor.hpp   |    49 +
 .../boost/type_traits/has_trivial_move_assign.hpp  |    57 +
 .../type_traits/has_trivial_move_constructor.hpp   |    57 +
 .../boost/type_traits/has_unary_minus.hpp          |    25 +
 .../boost/type_traits/has_unary_plus.hpp           |    23 +
 .../boost/type_traits/has_virtual_destructor.hpp   |    29 +
 gatb-core/thirdparty/boost/type_traits/ice.hpp     |    20 +
 .../boost/type_traits/integral_constant.hpp        |    39 +
 .../boost/type_traits/integral_promotion.hpp       |   194 +
 .../thirdparty/boost/type_traits/intrinsics.hpp    |   348 +
 .../thirdparty/boost/type_traits/is_abstract.hpp   |   153 +
 .../thirdparty/boost/type_traits/is_arithmetic.hpp |    51 +
 .../thirdparty/boost/type_traits/is_array.hpp      |    50 +
 .../boost/type_traits/is_base_and_derived.hpp      |   252 +
 .../thirdparty/boost/type_traits/is_base_of.hpp    |    49 +
 .../boost/type_traits/is_base_of_tr1.hpp           |    48 +
 .../thirdparty/boost/type_traits/is_class.hpp      |   129 +
 .../thirdparty/boost/type_traits/is_complex.hpp    |    34 +
 .../thirdparty/boost/type_traits/is_compound.hpp   |    46 +
 .../thirdparty/boost/type_traits/is_const.hpp      |    90 +
 .../boost/type_traits/is_convertible.hpp           |   494 +
 .../boost/type_traits/is_copy_assignable.hpp       |   147 +
 .../boost/type_traits/is_copy_constructible.hpp    |   125 +
 .../thirdparty/boost/type_traits/is_empty.hpp      |   142 +
 gatb-core/thirdparty/boost/type_traits/is_enum.hpp |   188 +
 .../thirdparty/boost/type_traits/is_final.hpp      |    41 +
 .../thirdparty/boost/type_traits/is_float.hpp      |    27 +
 .../boost/type_traits/is_floating_point.hpp        |    27 +
 .../thirdparty/boost/type_traits/is_function.hpp   |   109 +
 .../boost/type_traits/is_fundamental.hpp           |    45 +
 .../thirdparty/boost/type_traits/is_integral.hpp   |    88 +
 .../boost/type_traits/is_lvalue_reference.hpp      |    56 +
 .../type_traits/is_member_function_pointer.hpp     |   133 +
 .../boost/type_traits/is_member_object_pointer.hpp |    46 +
 .../boost/type_traits/is_member_pointer.hpp        |    65 +
 .../type_traits/is_nothrow_move_assignable.hpp     |   108 +
 .../type_traits/is_nothrow_move_constructible.hpp  |   109 +
 .../thirdparty/boost/type_traits/is_object.hpp     |    45 +
 gatb-core/thirdparty/boost/type_traits/is_pod.hpp  |    79 +
 .../thirdparty/boost/type_traits/is_pointer.hpp    |    88 +
 .../boost/type_traits/is_polymorphic.hpp           |   123 +
 .../thirdparty/boost/type_traits/is_reference.hpp  |    45 +
 .../boost/type_traits/is_rvalue_reference.hpp      |    29 +
 gatb-core/thirdparty/boost/type_traits/is_same.hpp |    45 +
 .../thirdparty/boost/type_traits/is_scalar.hpp     |    55 +
 .../thirdparty/boost/type_traits/is_signed.hpp     |   136 +
 .../thirdparty/boost/type_traits/is_stateless.hpp  |    48 +
 .../thirdparty/boost/type_traits/is_union.hpp      |    57 +
 .../thirdparty/boost/type_traits/is_unsigned.hpp   |   135 +
 .../boost/type_traits/is_virtual_base_of.hpp       |   117 +
 gatb-core/thirdparty/boost/type_traits/is_void.hpp |    38 +
 .../thirdparty/boost/type_traits/is_volatile.hpp   |    84 +
 .../thirdparty/boost/type_traits/make_signed.hpp   |   151 +
 .../thirdparty/boost/type_traits/make_unsigned.hpp |   151 +
 .../thirdparty/boost/type_traits/object_traits.hpp |    33 +
 gatb-core/thirdparty/boost/type_traits/promote.hpp |    40 +
 gatb-core/thirdparty/boost/type_traits/rank.hpp    |    89 +
 .../boost/type_traits/reference_traits.hpp         |    15 +
 .../boost/type_traits/remove_all_extents.hpp       |    40 +
 .../thirdparty/boost/type_traits/remove_bounds.hpp |    40 +
 .../thirdparty/boost/type_traits/remove_const.hpp  |    79 +
 .../thirdparty/boost/type_traits/remove_cv.hpp     |    63 +
 .../thirdparty/boost/type_traits/remove_extent.hpp |    40 +
 .../boost/type_traits/remove_pointer.hpp           |    83 +
 .../boost/type_traits/remove_reference.hpp         |    59 +
 .../boost/type_traits/remove_volatile.hpp          |    77 +
 .../thirdparty/boost/type_traits/same_traits.hpp   |    15 +
 .../boost/type_traits/transform_traits.hpp         |    21 +
 .../boost/type_traits/transform_traits_spec.hpp    |    14 +
 .../boost/type_traits/type_with_alignment.hpp      |   357 +
 gatb-core/thirdparty/boost/utility.hpp             |    21 +
 gatb-core/thirdparty/boost/utility/addressof.hpp   |    17 +
 .../thirdparty/boost/utility/base_from_member.hpp  |   171 +
 gatb-core/thirdparty/boost/utility/binary.hpp      |   708 ++
 .../thirdparty/boost/utility/compare_pointees.hpp  |    68 +
 gatb-core/thirdparty/boost/utility/declval.hpp     |    44 +
 .../utility/detail/in_place_factory_prefix.hpp     |    36 +
 .../utility/detail/in_place_factory_suffix.hpp     |    23 +
 .../boost/utility/detail/result_of_iterate.hpp     |   221 +
 .../thirdparty/boost/utility/empty_deleter.hpp     |    43 +
 gatb-core/thirdparty/boost/utility/enable_if.hpp   |    17 +
 .../boost/utility/explicit_operator_bool.hpp       |    17 +
 .../thirdparty/boost/utility/identity_type.hpp     |    46 +
 .../thirdparty/boost/utility/in_place_factory.hpp  |    86 +
 gatb-core/thirdparty/boost/utility/result_of.hpp   |   210 +
 gatb-core/thirdparty/boost/utility/string_ref.hpp  |   536 +
 .../thirdparty/boost/utility/string_ref_fwd.hpp    |    37 +
 gatb-core/thirdparty/boost/utility/swap.hpp        |    17 +
 .../boost/utility/typed_in_place_factory.hpp       |    77 +
 gatb-core/thirdparty/boost/utility/value_init.hpp  |   281 +
 gatb-core/thirdparty/boost/variant.hpp             |    27 +
 .../thirdparty/boost/variant/apply_visitor.hpp     |    20 +
 gatb-core/thirdparty/boost/variant/bad_visit.hpp   |    41 +
 .../boost/variant/detail/apply_visitor_binary.hpp  |   280 +
 .../boost/variant/detail/apply_visitor_delayed.hpp |   151 +
 .../boost/variant/detail/apply_visitor_unary.hpp   |   173 +
 .../boost/variant/detail/backup_holder.hpp         |    95 +
 .../boost/variant/detail/bool_trait_def.hpp        |    30 +
 .../boost/variant/detail/bool_trait_undef.hpp      |    21 +
 .../boost/variant/detail/cast_storage.hpp          |    42 +
 .../thirdparty/boost/variant/detail/config.hpp     |    37 +
 .../boost/variant/detail/element_index.hpp         |    63 +
 .../boost/variant/detail/enable_recursive.hpp      |   133 +
 .../boost/variant/detail/enable_recursive_fwd.hpp  |    87 +
 .../boost/variant/detail/forced_return.hpp         |   102 +
 .../boost/variant/detail/generic_result_type.hpp   |    88 +
 .../boost/variant/detail/has_result_type.hpp       |    37 +
 .../boost/variant/detail/hash_variant.hpp          |    47 +
 .../boost/variant/detail/initializer.hpp           |   249 +
 .../boost/variant/detail/make_variant_list.hpp     |    73 +
 gatb-core/thirdparty/boost/variant/detail/move.hpp |    53 +
 .../variant/detail/multivisitors_cpp11_based.hpp   |   183 +
 .../variant/detail/multivisitors_cpp14_based.hpp   |   142 +
 .../detail/multivisitors_preprocessor_based.hpp    |   143 +
 .../boost/variant/detail/over_sequence.hpp         |    58 +
 .../thirdparty/boost/variant/detail/substitute.hpp |   253 +
 .../boost/variant/detail/substitute_fwd.hpp        |    58 +
 .../thirdparty/boost/variant/detail/variant_io.hpp |    95 +
 .../boost/variant/detail/visitation_impl.hpp       |   277 +
 gatb-core/thirdparty/boost/variant/get.hpp         |   305 +
 .../thirdparty/boost/variant/multivisitors.hpp     |    32 +
 .../thirdparty/boost/variant/polymorphic_get.hpp   |   344 +
 .../thirdparty/boost/variant/recursive_variant.hpp |   209 +
 .../thirdparty/boost/variant/recursive_wrapper.hpp |   158 +
 .../boost/variant/recursive_wrapper_fwd.hpp        |    99 +
 .../thirdparty/boost/variant/static_visitor.hpp    |    95 +
 gatb-core/thirdparty/boost/variant/variant.hpp     |  2415 +++++
 gatb-core/thirdparty/boost/variant/variant_fwd.hpp |   333 +
 gatb-core/thirdparty/boost/variant/visitor_ptr.hpp |   117 +
 gatb-core/thirdparty/hdf5/ACKNOWLEDGMENTS          |    18 +
 gatb-core/thirdparty/hdf5/CMakeFilters.cmake       |   130 +
 gatb-core/thirdparty/hdf5/CMakeInstallation.cmake  |   603 ++
 gatb-core/thirdparty/hdf5/CMakeLists.txt           |   813 ++
 gatb-core/thirdparty/hdf5/COPYING                  |    92 +
 gatb-core/thirdparty/hdf5/CTestConfig.cmake        |    32 +
 gatb-core/thirdparty/hdf5/README.txt               |    38 +
 gatb-core/thirdparty/hdf5/UserMacros.cmake         |    22 +
 gatb-core/thirdparty/hdf5/config/BlankForm         |   138 +
 gatb-core/thirdparty/hdf5/config/COPYING           |    16 +
 gatb-core/thirdparty/hdf5/config/Makefile.am.blank |    69 +
 gatb-core/thirdparty/hdf5/config/apple             |   178 +
 gatb-core/thirdparty/hdf5/config/cce-fflags        |    73 +
 gatb-core/thirdparty/hdf5/config/cce-flags         |    79 +
 .../hdf5/config/cmake/CPack.Info.plist.in          |    26 +
 .../thirdparty/hdf5/config/cmake/CTestCustom.cmake |   215 +
 .../hdf5/config/cmake/ConfigureChecks.cmake        |   269 +
 .../thirdparty/hdf5/config/cmake/ConversionTests.c |   267 +
 .../thirdparty/hdf5/config/cmake/H5cxx_config.h.in |     5 +
 .../thirdparty/hdf5/config/cmake/H5pubconf.h.in    |   628 ++
 .../hdf5/config/cmake/HDF518_Examples.cmake.in     |   200 +
 .../thirdparty/hdf5/config/cmake/HDF5Macros.cmake  |    49 +
 .../hdf5/config/cmake/HDFCompilerFlags.cmake       |   274 +
 gatb-core/thirdparty/hdf5/config/cmake/PkgInfo.in  |     1 +
 .../hdf5/config/cmake/README.txt.cmake.in          |    67 +
 .../hdf5/config/cmake/UserMacros/Windows_MT.cmake  |    41 +
 .../thirdparty/hdf5/config/cmake/cacheinit.cmake   |    62 +
 .../hdf5/config/cmake/hdf5-config-version.cmake.in |    47 +
 .../hdf5/config/cmake/hdf5-config.cmake.in         |   160 +
 .../hdf5/config/cmake/libhdf5.settings.cmake.in    |    71 +
 .../thirdparty/hdf5/config/cmake/mccacheinit.cmake |    76 +
 gatb-core/thirdparty/hdf5/config/cmake/patch.xml   |    11 +
 .../hdf5/config/cmake/scripts/CTestScript.cmake    |   296 +
 .../hdf5/config/cmake/scripts/HDF518config.cmake   |   266 +
 .../hdf5/config/cmake/userblockTest.cmake          |   120 +
 .../thirdparty/hdf5/config/cmake/vfdTest.cmake     |    50 +
 .../hdf5/config/cmake_ext_mod/CTestCustom.cmake    |    16 +
 .../hdf5/config/cmake_ext_mod/CheckTypeSize.cmake  |    50 +
 .../config/cmake_ext_mod/ConfigureChecks.cmake     |   749 ++
 .../hdf5/config/cmake_ext_mod/FindMPI.cmake        |   684 ++
 .../hdf5/config/cmake_ext_mod/FindSZIP.cmake       |   172 +
 .../hdf5/config/cmake_ext_mod/GetTimeOfDayTest.cpp |    15 +
 .../hdf5/config/cmake_ext_mod/HDFCXXTests.cpp      |    56 +
 .../hdf5/config/cmake_ext_mod/HDFLibMacros.cmake   |   271 +
 .../hdf5/config/cmake_ext_mod/HDFMacros.cmake      |   291 +
 .../hdf5/config/cmake_ext_mod/HDFTests.c           |   472 +
 .../hdf5/config/cmake_ext_mod/HDFUseFortran.cmake  |   179 +
 .../cmake_ext_mod/NSIS.InstallOptions.ini.in       |    37 +
 .../hdf5/config/cmake_ext_mod/NSIS.template.in     |   974 ++
 .../hdf5/config/cmake_ext_mod/grepTest.cmake       |    64 +
 .../thirdparty/hdf5/config/cmake_ext_mod/hdf.bmp   |   Bin 0 -> 1254 bytes
 .../thirdparty/hdf5/config/cmake_ext_mod/hdf.icns  |   Bin 0 -> 326012 bytes
 .../thirdparty/hdf5/config/cmake_ext_mod/hdf.ico   |   Bin 0 -> 23558 bytes
 .../hdf5/config/cmake_ext_mod/prunTest.cmake       |   145 +
 .../hdf5/config/cmake_ext_mod/runTest.cmake        |   241 +
 .../hdf5/config/cmake_ext_mod/version.plist.in     |    17 +
 gatb-core/thirdparty/hdf5/config/commence.am       |   105 +
 gatb-core/thirdparty/hdf5/config/conclude.am       |   235 +
 gatb-core/thirdparty/hdf5/config/cygwin            |    24 +
 gatb-core/thirdparty/hdf5/config/examples.am       |   122 +
 gatb-core/thirdparty/hdf5/config/freebsd           |    58 +
 gatb-core/thirdparty/hdf5/config/gnu-fflags        |    99 +
 gatb-core/thirdparty/hdf5/config/gnu-flags         |   826 ++
 gatb-core/thirdparty/hdf5/config/ibm-aix           |   150 +
 gatb-core/thirdparty/hdf5/config/ibm-flags         |   108 +
 gatb-core/thirdparty/hdf5/config/intel-fflags      |    95 +
 gatb-core/thirdparty/hdf5/config/intel-flags       |   115 +
 gatb-core/thirdparty/hdf5/config/linux-gnu         |    19 +
 gatb-core/thirdparty/hdf5/config/linux-gnuaout     |    19 +
 gatb-core/thirdparty/hdf5/config/linux-gnulibc1    |   247 +
 gatb-core/thirdparty/hdf5/config/linux-gnulibc2    |    24 +
 gatb-core/thirdparty/hdf5/config/lt_vers.am        |    82 +
 gatb-core/thirdparty/hdf5/config/pgi-fflags        |   106 +
 gatb-core/thirdparty/hdf5/config/pgi-flags         |   108 +
 .../thirdparty/hdf5/config/site-specific/BlankForm |    47 +
 gatb-core/thirdparty/hdf5/config/solaris           |   159 +
 gatb-core/thirdparty/hdf5/src/CMakeLists.txt       |   787 ++
 gatb-core/thirdparty/hdf5/src/COPYING              |    16 +
 gatb-core/thirdparty/hdf5/src/H5.c                 |  1060 ++
 gatb-core/thirdparty/hdf5/src/H5A.c                |  1697 +++
 gatb-core/thirdparty/hdf5/src/H5AC.c               |  4986 +++++++++
 gatb-core/thirdparty/hdf5/src/H5ACpkg.h            |   390 +
 gatb-core/thirdparty/hdf5/src/H5ACprivate.h        |   369 +
 gatb-core/thirdparty/hdf5/src/H5ACpublic.h         |   508 +
 gatb-core/thirdparty/hdf5/src/H5Abtree2.c          |   554 +
 gatb-core/thirdparty/hdf5/src/H5Adense.c           |  1908 ++++
 gatb-core/thirdparty/hdf5/src/H5Adeprec.c          |   461 +
 gatb-core/thirdparty/hdf5/src/H5Aint.c             |  2426 +++++
 gatb-core/thirdparty/hdf5/src/H5Apkg.h             |   280 +
 gatb-core/thirdparty/hdf5/src/H5Aprivate.h         |    91 +
 gatb-core/thirdparty/hdf5/src/H5Apublic.h          |   120 +
 gatb-core/thirdparty/hdf5/src/H5Atest.c            |   150 +
 gatb-core/thirdparty/hdf5/src/H5B.c                |  2104 ++++
 gatb-core/thirdparty/hdf5/src/H5B2.c               |  1408 +++
 gatb-core/thirdparty/hdf5/src/H5B2cache.c          |  1125 ++
 gatb-core/thirdparty/hdf5/src/H5B2dbg.c            |   434 +
 gatb-core/thirdparty/hdf5/src/H5B2hdr.c            |   616 ++
 gatb-core/thirdparty/hdf5/src/H5B2int.c            |  3332 ++++++
 gatb-core/thirdparty/hdf5/src/H5B2pkg.h            |   378 +
 gatb-core/thirdparty/hdf5/src/H5B2private.h        |   158 +
 gatb-core/thirdparty/hdf5/src/H5B2public.h         |    54 +
 gatb-core/thirdparty/hdf5/src/H5B2stat.c           |   149 +
 gatb-core/thirdparty/hdf5/src/H5B2test.c           |   541 +
 gatb-core/thirdparty/hdf5/src/H5Bcache.c           |   410 +
 gatb-core/thirdparty/hdf5/src/H5Bdbg.c             |   290 +
 gatb-core/thirdparty/hdf5/src/H5Bpkg.h             |    98 +
 gatb-core/thirdparty/hdf5/src/H5Bprivate.h         |   181 +
 gatb-core/thirdparty/hdf5/src/H5Bpublic.h          |    41 +
 gatb-core/thirdparty/hdf5/src/H5C.c                |  8557 ++++++++++++++++
 gatb-core/thirdparty/hdf5/src/H5CS.c               |   327 +
 gatb-core/thirdparty/hdf5/src/H5CSprivate.h        |    44 +
 gatb-core/thirdparty/hdf5/src/H5Cpkg.h             |  3566 +++++++
 gatb-core/thirdparty/hdf5/src/H5Cprivate.h         |  1141 +++
 gatb-core/thirdparty/hdf5/src/H5Cpublic.h          |    61 +
 gatb-core/thirdparty/hdf5/src/H5D.c                |  1004 ++
 gatb-core/thirdparty/hdf5/src/H5Dbtree.c           |  1484 +++
 gatb-core/thirdparty/hdf5/src/H5Dchunk.c           |  5354 ++++++++++
 gatb-core/thirdparty/hdf5/src/H5Dcompact.c         |   578 ++
 gatb-core/thirdparty/hdf5/src/H5Dcontig.c          |  1523 +++
 gatb-core/thirdparty/hdf5/src/H5Ddbg.c             |   123 +
 gatb-core/thirdparty/hdf5/src/H5Ddeprec.c          |   401 +
 gatb-core/thirdparty/hdf5/src/H5Defl.c             |   624 ++
 gatb-core/thirdparty/hdf5/src/H5Dfill.c            |   707 ++
 gatb-core/thirdparty/hdf5/src/H5Dint.c             |  2829 +++++
 gatb-core/thirdparty/hdf5/src/H5Dio.c              |  1240 +++
 gatb-core/thirdparty/hdf5/src/H5Dlayout.c          |   484 +
 gatb-core/thirdparty/hdf5/src/H5Dmpio.c            |  1836 ++++
 gatb-core/thirdparty/hdf5/src/H5Doh.c              |   481 +
 gatb-core/thirdparty/hdf5/src/H5Dpkg.h             |   718 ++
 gatb-core/thirdparty/hdf5/src/H5Dprivate.h         |   185 +
 gatb-core/thirdparty/hdf5/src/H5Dpublic.h          |   173 +
 gatb-core/thirdparty/hdf5/src/H5Dscatgath.c        |  1103 ++
 gatb-core/thirdparty/hdf5/src/H5Dselect.c          |   314 +
 gatb-core/thirdparty/hdf5/src/H5Dtest.c            |   189 +
 gatb-core/thirdparty/hdf5/src/H5E.c                |  1734 ++++
 gatb-core/thirdparty/hdf5/src/H5Edefin.h           |   216 +
 gatb-core/thirdparty/hdf5/src/H5Edeprec.c          |   495 +
 gatb-core/thirdparty/hdf5/src/H5Einit.h            |   810 ++
 gatb-core/thirdparty/hdf5/src/H5Eint.c             |  1034 ++
 gatb-core/thirdparty/hdf5/src/H5Epkg.h             |   151 +
 gatb-core/thirdparty/hdf5/src/H5Eprivate.h         |   129 +
 gatb-core/thirdparty/hdf5/src/H5Epubgen.h          |   368 +
 gatb-core/thirdparty/hdf5/src/H5Epublic.h          |   228 +
 gatb-core/thirdparty/hdf5/src/H5Eterm.h            |   218 +
 gatb-core/thirdparty/hdf5/src/H5F.c                |  1418 +++
 gatb-core/thirdparty/hdf5/src/H5FD.c               |  2062 ++++
 gatb-core/thirdparty/hdf5/src/H5FDcore.c           |  1519 +++
 gatb-core/thirdparty/hdf5/src/H5FDcore.h           |    42 +
 gatb-core/thirdparty/hdf5/src/H5FDdirect.c         |  1314 +++
 gatb-core/thirdparty/hdf5/src/H5FDdirect.h         |    57 +
 gatb-core/thirdparty/hdf5/src/H5FDfamily.c         |  1331 +++
 gatb-core/thirdparty/hdf5/src/H5FDfamily.h         |    44 +
 gatb-core/thirdparty/hdf5/src/H5FDint.c            |   387 +
 gatb-core/thirdparty/hdf5/src/H5FDlog.c            |  1542 +++
 gatb-core/thirdparty/hdf5/src/H5FDlog.h            |    72 +
 gatb-core/thirdparty/hdf5/src/H5FDmpi.c            |   492 +
 gatb-core/thirdparty/hdf5/src/H5FDmpi.h            |    62 +
 gatb-core/thirdparty/hdf5/src/H5FDmpio.c           |  2098 ++++
 gatb-core/thirdparty/hdf5/src/H5FDmpio.h           |    66 +
 gatb-core/thirdparty/hdf5/src/H5FDmulti.c          |  1920 ++++
 gatb-core/thirdparty/hdf5/src/H5FDmulti.h          |    49 +
 gatb-core/thirdparty/hdf5/src/H5FDpkg.h            |    67 +
 gatb-core/thirdparty/hdf5/src/H5FDprivate.h        |   168 +
 gatb-core/thirdparty/hdf5/src/H5FDpublic.h         |   329 +
 gatb-core/thirdparty/hdf5/src/H5FDsec2.c           |   897 ++
 gatb-core/thirdparty/hdf5/src/H5FDsec2.h           |    42 +
 gatb-core/thirdparty/hdf5/src/H5FDspace.c          |   462 +
 gatb-core/thirdparty/hdf5/src/H5FDstdio.c          |  1079 ++
 gatb-core/thirdparty/hdf5/src/H5FDstdio.h          |    41 +
 gatb-core/thirdparty/hdf5/src/H5FDwindows.c        |    69 +
 gatb-core/thirdparty/hdf5/src/H5FDwindows.h        |    49 +
 gatb-core/thirdparty/hdf5/src/H5FL.c               |  2563 +++++
 gatb-core/thirdparty/hdf5/src/H5FLprivate.h        |   430 +
 gatb-core/thirdparty/hdf5/src/H5FO.c               |   604 ++
 gatb-core/thirdparty/hdf5/src/H5FOprivate.h        |    53 +
 gatb-core/thirdparty/hdf5/src/H5FS.c               |   958 ++
 gatb-core/thirdparty/hdf5/src/H5FScache.c          |  1025 ++
 gatb-core/thirdparty/hdf5/src/H5FSdbg.c            |   311 +
 gatb-core/thirdparty/hdf5/src/H5FSpkg.h            |   250 +
 gatb-core/thirdparty/hdf5/src/H5FSprivate.h        |   213 +
 gatb-core/thirdparty/hdf5/src/H5FSpublic.h         |    54 +
 gatb-core/thirdparty/hdf5/src/H5FSsection.c        |  2422 +++++
 gatb-core/thirdparty/hdf5/src/H5FSstat.c           |   106 +
 gatb-core/thirdparty/hdf5/src/H5FStest.c           |   156 +
 gatb-core/thirdparty/hdf5/src/H5Faccum.c           |  1085 ++
 gatb-core/thirdparty/hdf5/src/H5Fcwfs.c            |   323 +
 gatb-core/thirdparty/hdf5/src/H5Fdbg.c             |   148 +
 gatb-core/thirdparty/hdf5/src/H5Fefc.c             |   950 ++
 gatb-core/thirdparty/hdf5/src/H5Ffake.c            |   129 +
 gatb-core/thirdparty/hdf5/src/H5Fint.c             |  2058 ++++
 gatb-core/thirdparty/hdf5/src/H5Fio.c              |   176 +
 gatb-core/thirdparty/hdf5/src/H5Fmount.c           |   784 ++
 gatb-core/thirdparty/hdf5/src/H5Fmpi.c             |   262 +
 gatb-core/thirdparty/hdf5/src/H5Fpkg.h             |   348 +
 gatb-core/thirdparty/hdf5/src/H5Fprivate.h         |   631 ++
 gatb-core/thirdparty/hdf5/src/H5Fpublic.h          |   198 +
 gatb-core/thirdparty/hdf5/src/H5Fquery.c           |  1075 ++
 gatb-core/thirdparty/hdf5/src/H5Fsfile.c           |   225 +
 gatb-core/thirdparty/hdf5/src/H5Fsuper.c           |   777 ++
 gatb-core/thirdparty/hdf5/src/H5Fsuper_cache.c     |   887 ++
 gatb-core/thirdparty/hdf5/src/H5Ftest.c            |   188 +
 gatb-core/thirdparty/hdf5/src/H5G.c                |   824 ++
 gatb-core/thirdparty/hdf5/src/H5Gbtree2.c          |   536 +
 gatb-core/thirdparty/hdf5/src/H5Gcache.c           |   410 +
 gatb-core/thirdparty/hdf5/src/H5Gcompact.c         |   648 ++
 gatb-core/thirdparty/hdf5/src/H5Gdense.c           |  1890 ++++
 gatb-core/thirdparty/hdf5/src/H5Gdeprec.c          |  1199 +++
 gatb-core/thirdparty/hdf5/src/H5Gent.c             |   607 ++
 gatb-core/thirdparty/hdf5/src/H5Gint.c             |  1193 +++
 gatb-core/thirdparty/hdf5/src/H5Glink.c            |   569 ++
 gatb-core/thirdparty/hdf5/src/H5Gloc.c             |   940 ++
 gatb-core/thirdparty/hdf5/src/H5Gname.c            |  1352 +++
 gatb-core/thirdparty/hdf5/src/H5Gnode.c            |  1575 +++
 gatb-core/thirdparty/hdf5/src/H5Gobj.c             |  1227 +++
 gatb-core/thirdparty/hdf5/src/H5Goh.c              |   417 +
 gatb-core/thirdparty/hdf5/src/H5Gpkg.h             |   539 +
 gatb-core/thirdparty/hdf5/src/H5Gprivate.h         |   307 +
 gatb-core/thirdparty/hdf5/src/H5Gpublic.h          |   178 +
 gatb-core/thirdparty/hdf5/src/H5Groot.c            |   414 +
 gatb-core/thirdparty/hdf5/src/H5Gstab.c            |  1228 +++
 gatb-core/thirdparty/hdf5/src/H5Gtest.c            |   800 ++
 gatb-core/thirdparty/hdf5/src/H5Gtraverse.c        |   866 ++
 gatb-core/thirdparty/hdf5/src/H5HF.c               |   891 ++
 gatb-core/thirdparty/hdf5/src/H5HFbtree2.c         |  1150 +++
 gatb-core/thirdparty/hdf5/src/H5HFcache.c          |  1765 ++++
 gatb-core/thirdparty/hdf5/src/H5HFdbg.c            |   863 ++
 gatb-core/thirdparty/hdf5/src/H5HFdblock.c         |   716 ++
 gatb-core/thirdparty/hdf5/src/H5HFdtable.c         |   371 +
 gatb-core/thirdparty/hdf5/src/H5HFhdr.c            |  1521 +++
 gatb-core/thirdparty/hdf5/src/H5HFhuge.c           |  1114 ++
 gatb-core/thirdparty/hdf5/src/H5HFiblock.c         |  1737 ++++
 gatb-core/thirdparty/hdf5/src/H5HFiter.c           |   664 ++
 gatb-core/thirdparty/hdf5/src/H5HFman.c            |   609 ++
 gatb-core/thirdparty/hdf5/src/H5HFpkg.h            |   799 ++
 gatb-core/thirdparty/hdf5/src/H5HFprivate.h        |   140 +
 gatb-core/thirdparty/hdf5/src/H5HFpublic.h         |    54 +
 gatb-core/thirdparty/hdf5/src/H5HFsection.c        |  4185 ++++++++
 gatb-core/thirdparty/hdf5/src/H5HFspace.c          |   639 ++
 gatb-core/thirdparty/hdf5/src/H5HFstat.c           |   180 +
 gatb-core/thirdparty/hdf5/src/H5HFtest.c           |   552 +
 gatb-core/thirdparty/hdf5/src/H5HFtiny.c           |   421 +
 gatb-core/thirdparty/hdf5/src/H5HG.c               |   850 ++
 gatb-core/thirdparty/hdf5/src/H5HGcache.c          |   415 +
 gatb-core/thirdparty/hdf5/src/H5HGdbg.c            |   179 +
 gatb-core/thirdparty/hdf5/src/H5HGpkg.h            |   149 +
 gatb-core/thirdparty/hdf5/src/H5HGprivate.h        |    78 +
 gatb-core/thirdparty/hdf5/src/H5HGpublic.h         |    33 +
 gatb-core/thirdparty/hdf5/src/H5HGquery.c          |   145 +
 gatb-core/thirdparty/hdf5/src/H5HL.c               |  1223 +++
 gatb-core/thirdparty/hdf5/src/H5HLcache.c          |   851 ++
 gatb-core/thirdparty/hdf5/src/H5HLdbg.c            |   136 +
 gatb-core/thirdparty/hdf5/src/H5HLint.c            |   417 +
 gatb-core/thirdparty/hdf5/src/H5HLpkg.h            |   160 +
 gatb-core/thirdparty/hdf5/src/H5HLprivate.h        |    79 +
 gatb-core/thirdparty/hdf5/src/H5HLpublic.h         |    41 +
 gatb-core/thirdparty/hdf5/src/H5HP.c               |   920 ++
 gatb-core/thirdparty/hdf5/src/H5HPprivate.h        |    71 +
 gatb-core/thirdparty/hdf5/src/H5I.c                |  2440 +++++
 gatb-core/thirdparty/hdf5/src/H5Ipkg.h             |    76 +
 gatb-core/thirdparty/hdf5/src/H5Iprivate.h         |    88 +
 gatb-core/thirdparty/hdf5/src/H5Ipublic.h          |   104 +
 gatb-core/thirdparty/hdf5/src/H5Itest.c            |    98 +
 gatb-core/thirdparty/hdf5/src/H5L.c                |  3100 ++++++
 gatb-core/thirdparty/hdf5/src/H5Lexternal.c        |   711 ++
 gatb-core/thirdparty/hdf5/src/H5Lpkg.h             |    64 +
 gatb-core/thirdparty/hdf5/src/H5Lprivate.h         |    98 +
 gatb-core/thirdparty/hdf5/src/H5Lpublic.h          |   202 +
 gatb-core/thirdparty/hdf5/src/H5MF.c               |  1168 +++
 gatb-core/thirdparty/hdf5/src/H5MFaggr.c           |   915 ++
 gatb-core/thirdparty/hdf5/src/H5MFdbg.c            |   246 +
 gatb-core/thirdparty/hdf5/src/H5MFpkg.h            |   176 +
 gatb-core/thirdparty/hdf5/src/H5MFprivate.h        |    93 +
 gatb-core/thirdparty/hdf5/src/H5MFsection.c        |   537 +
 gatb-core/thirdparty/hdf5/src/H5MM.c               |   262 +
 gatb-core/thirdparty/hdf5/src/H5MMprivate.h        |    48 +
 gatb-core/thirdparty/hdf5/src/H5MMpublic.h         |    47 +
 gatb-core/thirdparty/hdf5/src/H5MP.c               |   473 +
 gatb-core/thirdparty/hdf5/src/H5MPpkg.h            |   106 +
 gatb-core/thirdparty/hdf5/src/H5MPprivate.h        |    62 +
 gatb-core/thirdparty/hdf5/src/H5MPtest.c           |   237 +
 gatb-core/thirdparty/hdf5/src/H5O.c                |  3531 +++++++
 gatb-core/thirdparty/hdf5/src/H5Oainfo.c           |   533 +
 gatb-core/thirdparty/hdf5/src/H5Oalloc.c           |  2311 +++++
 gatb-core/thirdparty/hdf5/src/H5Oattr.c            |   876 ++
 gatb-core/thirdparty/hdf5/src/H5Oattribute.c       |  2049 ++++
 gatb-core/thirdparty/hdf5/src/H5Obogus.c           |   217 +
 gatb-core/thirdparty/hdf5/src/H5Obtreek.c          |   258 +
 gatb-core/thirdparty/hdf5/src/H5Ocache.c           |  1457 +++
 gatb-core/thirdparty/hdf5/src/H5Ochunk.c           |   406 +
 gatb-core/thirdparty/hdf5/src/H5Ocont.c            |   289 +
 gatb-core/thirdparty/hdf5/src/H5Ocopy.c            |  1970 ++++
 gatb-core/thirdparty/hdf5/src/H5Odbg.c             |   581 ++
 gatb-core/thirdparty/hdf5/src/H5Odrvinfo.c         |   314 +
 gatb-core/thirdparty/hdf5/src/H5Odtype.c           |  2153 ++++
 gatb-core/thirdparty/hdf5/src/H5Oefl.c             |   591 ++
 gatb-core/thirdparty/hdf5/src/H5Ofill.c            |  1025 ++
 gatb-core/thirdparty/hdf5/src/H5Oginfo.c           |   352 +
 gatb-core/thirdparty/hdf5/src/H5Olayout.c          |   758 ++
 gatb-core/thirdparty/hdf5/src/H5Olinfo.c           |   587 ++
 gatb-core/thirdparty/hdf5/src/H5Olink.c            |   878 ++
 gatb-core/thirdparty/hdf5/src/H5Omessage.c         |  2438 +++++
 gatb-core/thirdparty/hdf5/src/H5Omtime.c           |   536 +
 gatb-core/thirdparty/hdf5/src/H5Oname.c            |   308 +
 gatb-core/thirdparty/hdf5/src/H5Onull.c            |    56 +
 gatb-core/thirdparty/hdf5/src/H5Opkg.h             |   627 ++
 gatb-core/thirdparty/hdf5/src/H5Opline.c           |   692 ++
 gatb-core/thirdparty/hdf5/src/H5Oprivate.h         |   745 ++
 gatb-core/thirdparty/hdf5/src/H5Opublic.h          |   212 +
 gatb-core/thirdparty/hdf5/src/H5Orefcount.c        |   325 +
 gatb-core/thirdparty/hdf5/src/H5Osdspace.c         |   541 +
 gatb-core/thirdparty/hdf5/src/H5Oshared.c          |   758 ++
 gatb-core/thirdparty/hdf5/src/H5Oshared.h          |   491 +
 gatb-core/thirdparty/hdf5/src/H5Oshmesg.c          |   248 +
 gatb-core/thirdparty/hdf5/src/H5Ostab.c            |   444 +
 gatb-core/thirdparty/hdf5/src/H5Otest.c            |   569 ++
 gatb-core/thirdparty/hdf5/src/H5Ounknown.c         |    89 +
 gatb-core/thirdparty/hdf5/src/H5P.c                |  1620 +++
 gatb-core/thirdparty/hdf5/src/H5PL.c               |   746 ++
 gatb-core/thirdparty/hdf5/src/H5PLextern.h         |    46 +
 gatb-core/thirdparty/hdf5/src/H5PLprivate.h        |    52 +
 gatb-core/thirdparty/hdf5/src/H5PLpublic.h         |    53 +
 gatb-core/thirdparty/hdf5/src/H5Pacpl.c            |    88 +
 gatb-core/thirdparty/hdf5/src/H5Pdapl.c            |   548 +
 gatb-core/thirdparty/hdf5/src/H5Pdcpl.c            |  1967 ++++
 gatb-core/thirdparty/hdf5/src/H5Pdeprec.c          |   485 +
 gatb-core/thirdparty/hdf5/src/H5Pdxpl.c            |  1453 +++
 gatb-core/thirdparty/hdf5/src/H5Pfapl.c            |  2446 +++++
 gatb-core/thirdparty/hdf5/src/H5Pfcpl.c            |   963 ++
 gatb-core/thirdparty/hdf5/src/H5Pfmpl.c            |   127 +
 gatb-core/thirdparty/hdf5/src/H5Pgcpl.c            |   513 +
 gatb-core/thirdparty/hdf5/src/H5Pint.c             |  4935 +++++++++
 gatb-core/thirdparty/hdf5/src/H5Plapl.c            |   908 ++
 gatb-core/thirdparty/hdf5/src/H5Plcpl.c            |   204 +
 gatb-core/thirdparty/hdf5/src/H5Pocpl.c            |  1679 +++
 gatb-core/thirdparty/hdf5/src/H5Pocpypl.c          |   630 ++
 gatb-core/thirdparty/hdf5/src/H5Ppkg.h             |   214 +
 gatb-core/thirdparty/hdf5/src/H5Pprivate.h         |   165 +
 gatb-core/thirdparty/hdf5/src/H5Ppublic.h          |   500 +
 gatb-core/thirdparty/hdf5/src/H5Pstrcpl.c          |   202 +
 gatb-core/thirdparty/hdf5/src/H5Ptest.c            |   173 +
 gatb-core/thirdparty/hdf5/src/H5R.c                |  1014 ++
 gatb-core/thirdparty/hdf5/src/H5RC.c               |   127 +
 gatb-core/thirdparty/hdf5/src/H5RCprivate.h        |    63 +
 gatb-core/thirdparty/hdf5/src/H5RS.c               |   499 +
 gatb-core/thirdparty/hdf5/src/H5RSprivate.h        |    61 +
 gatb-core/thirdparty/hdf5/src/H5Rdeprec.c          |   186 +
 gatb-core/thirdparty/hdf5/src/H5Rpkg.h             |    64 +
 gatb-core/thirdparty/hdf5/src/H5Rprivate.h         |    31 +
 gatb-core/thirdparty/hdf5/src/H5Rpublic.h          |    92 +
 gatb-core/thirdparty/hdf5/src/H5S.c                |  2182 ++++
 gatb-core/thirdparty/hdf5/src/H5SL.c               |  2558 +++++
 gatb-core/thirdparty/hdf5/src/H5SLprivate.h        |   100 +
 gatb-core/thirdparty/hdf5/src/H5SM.c               |  2776 +++++
 gatb-core/thirdparty/hdf5/src/H5SMbtree2.c         |   299 +
 gatb-core/thirdparty/hdf5/src/H5SMcache.c          |   747 ++
 gatb-core/thirdparty/hdf5/src/H5SMmessage.c        |   365 +
 gatb-core/thirdparty/hdf5/src/H5SMpkg.h            |   292 +
 gatb-core/thirdparty/hdf5/src/H5SMprivate.h        |    80 +
 gatb-core/thirdparty/hdf5/src/H5SMtest.c           |   123 +
 gatb-core/thirdparty/hdf5/src/H5ST.c               |   793 ++
 gatb-core/thirdparty/hdf5/src/H5STprivate.h        |    64 +
 gatb-core/thirdparty/hdf5/src/H5Sall.c             |   988 ++
 gatb-core/thirdparty/hdf5/src/H5Sdbg.c             |   125 +
 gatb-core/thirdparty/hdf5/src/H5Shyper.c           |  8858 ++++++++++++++++
 gatb-core/thirdparty/hdf5/src/H5Smpio.c            |  1094 ++
 gatb-core/thirdparty/hdf5/src/H5Snone.c            |   920 ++
 gatb-core/thirdparty/hdf5/src/H5Spkg.h             |   260 +
 gatb-core/thirdparty/hdf5/src/H5Spoint.c           |  1717 ++++
 gatb-core/thirdparty/hdf5/src/H5Sprivate.h         |   305 +
 gatb-core/thirdparty/hdf5/src/H5Spublic.h          |   152 +
 gatb-core/thirdparty/hdf5/src/H5Sselect.c          |  2066 ++++
 gatb-core/thirdparty/hdf5/src/H5Stest.c            |   111 +
 gatb-core/thirdparty/hdf5/src/H5T.c                |  5525 ++++++++++
 gatb-core/thirdparty/hdf5/src/H5TS.c               |   520 +
 gatb-core/thirdparty/hdf5/src/H5TSprivate.h        |   131 +
 gatb-core/thirdparty/hdf5/src/H5Tarray.c           |   454 +
 gatb-core/thirdparty/hdf5/src/H5Tbit.c             |   717 ++
 gatb-core/thirdparty/hdf5/src/H5Tcommit.c          |   888 ++
 gatb-core/thirdparty/hdf5/src/H5Tcompound.c        |   671 ++
 gatb-core/thirdparty/hdf5/src/H5Tconv.c            |  9865 ++++++++++++++++++
 gatb-core/thirdparty/hdf5/src/H5Tcset.c            |   151 +
 gatb-core/thirdparty/hdf5/src/H5Tdbg.c             |   402 +
 gatb-core/thirdparty/hdf5/src/H5Tdeprec.c          |   255 +
 gatb-core/thirdparty/hdf5/src/H5Tenum.c            |   608 ++
 gatb-core/thirdparty/hdf5/src/H5Tfields.c          |   513 +
 gatb-core/thirdparty/hdf5/src/H5Tfixed.c           |   180 +
 gatb-core/thirdparty/hdf5/src/H5Tfloat.c           |   422 +
 gatb-core/thirdparty/hdf5/src/H5Tnative.c          |   937 ++
 gatb-core/thirdparty/hdf5/src/H5Toffset.c          |   300 +
 gatb-core/thirdparty/hdf5/src/H5Toh.c              |   235 +
 gatb-core/thirdparty/hdf5/src/H5Topaque.c          |   141 +
 gatb-core/thirdparty/hdf5/src/H5Torder.c           |   309 +
 gatb-core/thirdparty/hdf5/src/H5Tpad.c             |   147 +
 gatb-core/thirdparty/hdf5/src/H5Tpkg.h             |  1325 +++
 gatb-core/thirdparty/hdf5/src/H5Tprecis.c          |   302 +
 gatb-core/thirdparty/hdf5/src/H5Tprivate.h         |   165 +
 gatb-core/thirdparty/hdf5/src/H5Tpublic.h          |   621 ++
 gatb-core/thirdparty/hdf5/src/H5Tstrpad.c          |   163 +
 gatb-core/thirdparty/hdf5/src/H5Tvisit.c           |   155 +
 gatb-core/thirdparty/hdf5/src/H5Tvlen.c            |  1279 +++
 gatb-core/thirdparty/hdf5/src/H5VM.c               |  1712 ++++
 gatb-core/thirdparty/hdf5/src/H5VMprivate.h        |   492 +
 gatb-core/thirdparty/hdf5/src/H5WB.c               |   291 +
 gatb-core/thirdparty/hdf5/src/H5WBprivate.h        |    64 +
 gatb-core/thirdparty/hdf5/src/H5Z.c                |  1715 ++++
 gatb-core/thirdparty/hdf5/src/H5Zdeflate.c         |   208 +
 gatb-core/thirdparty/hdf5/src/H5Zfletcher32.c      |   167 +
 gatb-core/thirdparty/hdf5/src/H5Znbit.c            |  1474 +++
 gatb-core/thirdparty/hdf5/src/H5Zpkg.h             |    57 +
 gatb-core/thirdparty/hdf5/src/H5Zprivate.h         |   111 +
 gatb-core/thirdparty/hdf5/src/H5Zpublic.h          |   250 +
 gatb-core/thirdparty/hdf5/src/H5Zscaleoffset.c     |  1723 ++++
 gatb-core/thirdparty/hdf5/src/H5Zshuffle.c         |   292 +
 gatb-core/thirdparty/hdf5/src/H5Zszip.c            |   373 +
 gatb-core/thirdparty/hdf5/src/H5Ztrans.c           |  1718 ++++
 gatb-core/thirdparty/hdf5/src/H5api_adpt.h         |   278 +
 gatb-core/thirdparty/hdf5/src/H5checksum.c         |   496 +
 gatb-core/thirdparty/hdf5/src/H5config.h.in        |   556 +
 gatb-core/thirdparty/hdf5/src/H5dbg.c              |   146 +
 gatb-core/thirdparty/hdf5/src/H5detect.c           |  1790 ++++
 gatb-core/thirdparty/hdf5/src/H5err.txt            |   261 +
 gatb-core/thirdparty/hdf5/src/H5make_libsettings.c |   298 +
 gatb-core/thirdparty/hdf5/src/H5overflow.h         |  1939 ++++
 gatb-core/thirdparty/hdf5/src/H5overflow.txt       |    45 +
 gatb-core/thirdparty/hdf5/src/H5private.h          |  2122 ++++
 gatb-core/thirdparty/hdf5/src/H5public.h           |   344 +
 gatb-core/thirdparty/hdf5/src/H5system.c           |   919 ++
 gatb-core/thirdparty/hdf5/src/H5timer.c            |   273 +
 gatb-core/thirdparty/hdf5/src/H5trace.c            |  2538 +++++
 gatb-core/thirdparty/hdf5/src/H5vers.txt           |    75 +
 gatb-core/thirdparty/hdf5/src/H5version.h          |   419 +
 gatb-core/thirdparty/hdf5/src/H5win32defs.h        |   112 +
 gatb-core/thirdparty/hdf5/src/hdf5.h               |    56 +
 gatb-core/thirdparty/hdf5/src/libhdf5.settings.in  |    72 +
 gatb-core/thirdparty/hdf5/tools/CMakeLists.txt     |    55 +
 gatb-core/thirdparty/hdf5/tools/COPYING            |    16 +
 .../thirdparty/hdf5/tools/h5dump/CMakeLists.txt    |    80 +
 gatb-core/thirdparty/hdf5/tools/h5dump/binread.c   |    97 +
 gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.c    |  1788 ++++
 gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.h    |   113 +
 .../thirdparty/hdf5/tools/h5dump/h5dump_ddl.c      |  2128 ++++
 .../thirdparty/hdf5/tools/h5dump/h5dump_ddl.h      |    52 +
 .../thirdparty/hdf5/tools/h5dump/h5dump_defines.h  |    56 +
 .../thirdparty/hdf5/tools/h5dump/h5dump_extern.h   |   113 +
 .../thirdparty/hdf5/tools/h5dump/h5dump_xml.c      |  4582 +++++++++
 .../thirdparty/hdf5/tools/h5dump/h5dump_xml.h      |    39 +
 .../thirdparty/hdf5/tools/h5dump/h5dumpgentest.c   | 10232 +++++++++++++++++++
 .../thirdparty/hdf5/tools/h5dump/testh5dump.sh.in  |  1342 +++
 .../hdf5/tools/h5dump/testh5dumppbits.sh.in        |   598 ++
 .../hdf5/tools/h5dump/testh5dumpxml.sh.in          |   388 +
 .../thirdparty/hdf5/tools/h5ls/CMakeLists.txt      |    47 +
 .../thirdparty/hdf5/tools/h5ls/CMakeTests.cmake    |   395 +
 gatb-core/thirdparty/hdf5/tools/h5ls/h5ls.c        |  2914 ++++++
 .../thirdparty/hdf5/tools/h5ls/testh5ls.sh.in      |   430 +
 gatb-core/thirdparty/hdf5/tools/lib/CMakeLists.txt |   105 +
 gatb-core/thirdparty/hdf5/tools/lib/h5diff.c       |  1941 ++++
 gatb-core/thirdparty/hdf5/tools/lib/h5diff.h       |   200 +
 gatb-core/thirdparty/hdf5/tools/lib/h5diff_array.c |  6339 ++++++++++++
 gatb-core/thirdparty/hdf5/tools/lib/h5diff_attr.c  |   599 ++
 gatb-core/thirdparty/hdf5/tools/lib/h5diff_dset.c  |   953 ++
 gatb-core/thirdparty/hdf5/tools/lib/h5diff_util.c  |   397 +
 gatb-core/thirdparty/hdf5/tools/lib/h5tools.c      |  1856 ++++
 gatb-core/thirdparty/hdf5/tools/lib/h5tools.h      |   605 ++
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.c |  3953 +++++++
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.h |    84 +
 .../thirdparty/hdf5/tools/lib/h5tools_error.h      |   124 +
 .../thirdparty/hdf5/tools/lib/h5tools_filters.c    |   210 +
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.c  |   330 +
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.h  |    38 +
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.c  |  1420 +++
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.h  |    53 +
 gatb-core/thirdparty/hdf5/tools/lib/h5tools_type.c |   203 +
 .../thirdparty/hdf5/tools/lib/h5tools_utils.c      |   934 ++
 .../thirdparty/hdf5/tools/lib/h5tools_utils.h      |   183 +
 gatb-core/thirdparty/hdf5/tools/lib/h5trav.c       |  1260 +++
 gatb-core/thirdparty/hdf5/tools/lib/h5trav.h       |   199 +
 gatb-core/thirdparty/hdf5/tools/lib/io_timer.c     |   232 +
 gatb-core/thirdparty/hdf5/tools/lib/io_timer.h     |    83 +
 gatb-core/thirdparty/hdf5/tools/lib/ph5diff.h      |    52 +
 gatb-core/thirdparty/json/json.hpp                 |   659 ++
 gatb-core/tools/BankDownload.cpp                   |   189 +
 gatb-core/tools/CMakeLists.txt                     |    47 +
 gatb-core/tools/ClearCache.cpp                     |    82 +
 gatb-core/tools/KmerChecksum.cpp                   |    69 +
 gatb-core/tools/bankgen.cpp                        |    99 +
 gatb-core/tools/dbgcheck.cpp                       |   133 +
 gatb-core/tools/dbgh5.cpp                          |   200 +
 gatb-core/tools/dbginfo.cpp                        |    54 +
 gatb-core/tools/dbgtopology.cpp                    |   321 +
 gatb-core/tools/leon.cpp                           |    61 +
 3169 files changed, 830384 insertions(+)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..672d2f3
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,31 @@
+language: cpp
+os:
+- linux
+compiler:
+- clang
+- gcc
+addons:
+  apt:
+    sources:
+    - ubuntu-toolchain-r-test
+    - llvm-toolchain-precise-3.7
+    - george-edison55-precise-backports  # for cmake 3
+    packages:
+    - libcppunit-dev
+    - g++-4.8
+    - clang-3.7
+    - cmake
+    - cmake-data
+install:
+- if [ "`echo $CXX`" == "g++" ]     && [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.8; fi
+- if [ "`echo $CXX`" == "clang++" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=clang++-3.7; fi
+matrix:
+script:
+- cd gatb-core
+- mkdir build
+- cd build
+- cmake .. && make 
+- export CPPUNIT_VERBOSE=TRUE && ./bin/gatb-core-cppunit
+env:
+  global:
+    - MAKEFLAGS="-j 4"
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..afe9880
--- /dev/null
+++ b/README.md
@@ -0,0 +1,252 @@
+# GATB - The Genome Analysis Toolbox with de-Bruijn graph
+
+   [![](https://img.shields.io/badge/release-1.3.0-orange.svg?style=plastic)](https://github.com/GATB/gatb-core/releases) - [![](https://img.shields.io/badge/build--Linux-passing-green.svg?style=plastic)]()  [![](https://img.shields.io/badge/build--OSX-passing-green.svg?style=plastic)]()
+
+--------------------------------------------------------------------------------
+
+   [![License](http://img.shields.io/:license-Affero--GPL-blue.svg)](http://www.gnu.org/licenses/agpl-3.0.en.html)  [![](https://tokei.rs/b1/github/GATB/gatb-core?category=code)](https://github.com/GATB/gatb-core)  [![](https://img.shields.io/badge/platform-c++/11-yellow.svg)](https://isocpp.org/wiki/faq/cpp11)  [![](https://img.shields.io/badge/run_on-Linux--Mac_OSX-yellowgreen.svg)]()
+
+--------------------------------------------------------------------------------
+**Continuous integration on master branch - build status:**
+
+|**Linux**| **gcc 4.7** | **gcc 4.8** | **gcc 4.9** | **clang 3.6** | **clang 3.9**| **Valgrind** |
+|---------|-------------|-------------|-------------|---------------|--------------|--------------|
+|*Debian 8*|    | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-docker-gatb-core-compile-gcc48/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-docker-gatb-core-compile-gcc48/) | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-docker-gatb-core-compile-gcc49/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-docker-gatb-core-compile-gcc49/) | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/ [...]
+|*Debian 7*| [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-debian7-64bits-gcc-4.7/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-debian7-64bits-gcc-4.7/) | - | - | - | - | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-valgrind-debian7-64bits-gcc-4.7/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-valgrind-debian7-64bits-gcc-4.7/) | 
+|*Fedora 20*| - | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-fedora20-gcc-4.8/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-fedora20-gcc-4.8/) | - | - | - | - | 
+
+| **Mac OSX** | **clang-600** | **gcc 4.2.1** |
+|    :--:     |---------------|---------------|
+| *10.9* | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-macos-10.9.5-clang-6.0/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-macos-10.9.5-clang-6.0/) | [![Build Status](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-macos-10.9.5-gcc-4.2.1/badge/icon)](https://ci.inria.fr/gatb-core/view/GATB-CORE/job/test-suite-macos-10.9.5-gcc-4.2.1/) | 
+
+
+--------------------------------------------------------------------------------
+# What is GATB?
+
+GATB is made of two master projects: 
+
+* The **GATB-CORE project** provides a set of highly efficient algorithms to analyse NGS data sets. These 
+methods enable the analysis of data sets of any size on multi-core desktop computers, including very 
+huge amount of reads data coming from any kind of organisms such as bacteria, plants, animals and 
+even complex samples (e.g. metagenomes). Read more about GATB at <a href="https://gatb.inria.fr/">https://gatb.inria.fr/</a>.
+ 
+* The **GATB-TOOLS project** contains a set of ready-to-use softwares relying on GATB-CORE algorithms. You can have a look at available tools at <a href="https://gatb.inria.fr/software/">https://gatb.inria.fr/software/</a>.
+
+--------------------------------------------------------------------------------
+# What is GATB-CORE ?
+
+GATB-CORE is a high-performance and low memory footprint C++ library.
+
+GATB-Core natively provides the following operations:
+
+* Reads handling: 	
+ * FASTA/FASTQ parsing
+ * Parallel iteration of sequences
+
+* K-mer: 	
+
+ * K-mer counting
+ * Minimizer computation of k-mers, partitioning of datasets by minimizers
+ * Bloom data structure of k-mers
+ * Hash table of k-mers
+ * Minimal perfect hash function of k-mers
+ * Arbitrarily large k-mers representations
+
+* de Bruijn graph: 	
+
+ * graph construction
+ * graph traversal operations (contigs, unitigs)
+ * graph simplifications for assembly (tip removal, bulge removal)
+
+By itself GATB-CORE is not an NGS data analysis tool. However, it can be 
+used to create such tools; see section [Quickly create a new GATB-TOOL software](#Quickly create a new GATB-TOOL software), below.
+
+They already exist a set of ready-to-use tools relying on GATB-CORE library: see [https://gatb.inria.fr/software/](https://gatb.inria.fr/software/)
+
+# Project content
+
+All the needed material of GATB-CORE is contained in the current directory in order to 
+generate the wanted artifacts:  
+
+* dynamic and static libraries holding the services component
+
+* 120+ unit tests of the entire library
+
+# Dependencies
+
+The following third parties have to be already installed to compile GATB-Core:
+
+* a **C++/11 capable compiler** (*e.g.* gcc 4.7+, clang 3.5+, Apple/clang 6.0+)
+* **CMake 3.1+**
+
+In addition, you could install these optional tools:
+
+* **doxygen**: to compile a local copy of the GATB-Core documentation
+* **cppunit**: to compile and run Unit tests
+
+# Compile GATB-CORE
+
+
+## Compile in Release mode (default)
+
+Type:
+
+	cd <some_directory>
+	git clone https://github.com/GATB/gatb-core.git
+	cd gatb-core/gatb-core
+	mkdir build ; cd build ; cmake .. ; make -j8
+	
+## Compile in Debug mode
+
+Type same as above, except for the CMake command:
+
+    cmake -D CMAKE_BUILD_TYPE=Debug ..
+    make -j8
+
+## Run unit tests
+
+* cppunit is required
+* compile using the command above (Release or Debug mode)
+
+Then type:
+
+
+     # enter gatb-core build directory
+     cd gatb-core/gatb-core/build
+     # set verbose mode to on so that we have name of failing tests (if any)
+     export CPPUNIT_VERBOSE=1
+     # Copy database for unit tests
+     cp -r ../test/db ./test/
+     # Launch the full test suite
+     cd bin
+     ./gatb-core-cppunit
+
+The gatb-core-cppunit command may also take as argument the categories of tests that show up in the verbose output, e.g. './gatb-core-cppunit TestBank'.
+
+More about GATB-CORE code compiling instruction is available [here](http://gatb-core.gforge.inria.fr/doc/api/compilation.html).
+
+# Work on GATB-Core code using Eclipse
+
+Read [this documentation](https://gatb.inria.fr/use-eclipse-to-develop-gatb-core-softwares/).
+
+# Work on GATB-Core code using Xcode
+
+Read [this documentation](https://gatb.inria.fr/use-xcode-to-develop-gatb-core-softwares/).
+
+
+# Learning GATB-Core: tutorial
+
+You can follow [this link](https://gatb.inria.fr/gatb-programming-tutorial/) to start the GATB-Core Online Tutorial trail.
+
+The project also contains many [code examples](https://github.com/GATB/gatb-core/tree/master/gatb-core/examples) that can be easily compiled and executed to review how to use GATB-Core APIs.
+
+# Documentation
+
+The complete GATB-Core documentation is available [here](http://gatb-core.gforge.inria.fr/doc/api/). It contains: API, code snippets, compile instructions, *etc*.
+
+Nevertheless, you can create a local copy of the documentation as follows (we suppose you already compiled the c++ code, see above; requires 'doxygen'):
+
+     cd gatb-core/gatb-core/build
+     make doc
+
+Documentation is then available in _build/html/index.html_
+
+
+# kmer default sizes
+
+By default, the library is compiled for supporting 4 ranges of kmers : 
+
+* k1 : for kmerSize < k1  (default value 32)         
+* k2 : for k1 <= kmerSize < k2 (default value 64)
+* k3 : for k2 <= kmerSize < k3 (default value 96)
+* k4 : for k3 <= kmerSize < k4 (default value 128)
+
+You can customize these values through cmake, provided they rebuild the project from scratch. For instance:
+
+    rm -Rf build; mkdir build ; cd build ; cmake -DKSIZE_LIST="64 96 128 162" ..
+
+Tools may set a default kmer lists in their CMakeFiles.txt, as such (see for instance Minia):
+
+    list (APPEND KSIZE_DEFAULT_LIST  32   64   96  128  160  192  224  256)
+
+
+--------------------------------------------------------------------------------
+# Directory content
+
+* __README__:                  this file
+
+* __CMakeList.txt__:           global cmake file
+
+* __doc__:                 
+    * __design__      design documentation for the component
+    * __doxygen__     pages for doxygen
+
+* __examples__:       snippets showing how to use the library                 
+
+* __src__:            source code for the component
+
+* __test__:           tests directory
+    * __src__         source code for unit tests
+    * __db__          FASTA databases for unit tests
+
+* __thirdparty__:    third parties    
+
+--------------------------------------------------------------------------------
+# Details for 'src' directory content
+
+It contains several sub directories, each one corresponding to one software package.
+
+A package may be composed of sub packages; the directory hierarchy should represent
+this packages tree structure.
+
+For one atomic package (or sub package), we should have:
+
+* directory 'api'       API of the package  
+
+* directory 'impl'      several implementations of the API
+
+--------------------------------------------------------------------------------
+# Quickly create a new GATB-TOOL software
+
+A GATB-TOOL is a new software relying upon GATB-CORE.
+
+You use GATB-CORE to create a new tool project, with the following script:
+
+    sh scripts/NewProject/NewProject.sh -d directory -n toolName
+
+where:
+
+    'directory' is the directory where the project will be created
+    'toolName' is the name of the project.
+
+The script will automatically creates the full path 'directory/toolName' to deploy a self-contained tool.
+ 
+By default, the following part will be included in the project:
+
+* a CMakeLists.txt file used for building the project
+* a 'tools' directory holding a default source code using GATB-Core
+* a 'scripts' directory holding a script to automatically package the tool
+* an optional 'thirdparty' directory holding the gatb-core resources
+
+The 'thirdparty' directory is only available for tool created outside the GATB-Tools repository.
+
+Tools located within GATB-Tools rely on a common GATB-CORE sub-module already available in this repository.
+
+The directory where the project is created has no link to any external resources. You can therefore
+move it anywhere you want.
+
+Such a project can be a start for building applications based on GATB-CORE. 
+
+More on creating a new GATB-Core based project: [http://gatb-core.gforge.inria.fr/doc/api/new_project.html](http://gatb-core.gforge.inria.fr/doc/api/new_project.html)
+
+
+#Contact
+
+To contact a developer, request help, *etc*, use: 
+
+    https://gatb.inria.fr/contact/
+    
+
+# License
+
+GATB is free software; you can redistribute it and/or modify it under the [Affero GPL v3 license](http://www.gnu.org/licenses/agpl-3.0.en.html).
\ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..0518e36
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+gatb-core (1.3.0-1) unstable; urgency=medium
+
+  * Initial release (Closes: #873044)  
+
+ -- DMTP  <debian-med-packaging at lists.alioth.debian.org>  Wed, 23 Aug 2017 23:59:46 -0400
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..f599e28
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+10
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..8e3ab4e
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,26 @@
+Source: gatb-core
+Section: science
+Priority: optional
+Maintainer: Debian Med Packaging Team <debian-med-packaging at lists.alioth.debian.org>
+Uploaders: Nadiya Sitdykova <rovenskasa at gmail.com>
+Build-Depends: debhelper (>= 10)
+Standards-Version: 3.9.8
+Homepage: https://github.com/GATB/gatb-core
+Vcs-Git: git://anonscm.debian.org/debian-med/gatb-core.git
+Vcs-Browser: https://anonscm.debian.org/cgit/debian-med/gatb-core.git
+
+Package: gatb-core
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: The Genome Analysis Toolbox with de-Bruijn graph
+ The GATB-CORE project provides a set of highly efficient 
+ algorithms to analyse NGS data sets. These methods enable 
+ the analysis of data sets of any size on multi-core desktop
+ computers, including very huge amount of reads data coming
+ from any kind of organisms such as bacteria, plants, 
+ animals and even complex samples (e.g. metagenomes). 
+ Read more about GATB at https://gatb.inria.fr/. 
+ By itself GATB-CORE is not an NGS data analysis tool. 
+ However, it can be used to create such tools. There already 
+ exist a set of ready-to-use tools relying on GATB-CORE 
+ library: see https://gatb.inria.fr/software/
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..508ae6b
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,28 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: gatb-core
+Source: https://github.com/GATB/gatb-core
+
+Files: *
+Copyright: © 2014-2017 Genscale research team
+License: GPL-3+
+
+Files: debian/*
+Copyright: © 2017 Nadiya Sitdykova rovenskasa at gmail.com
+License: GPL-3+
+
+License: GPL-3+
+ This package 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 3 of the License, or
+ (at your option) any later version.
+ .
+ This package 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, see <https://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..e1c367c
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,25 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+#export DH_VERBOSE = 1
+
+
+# see FEATURE AREAS in dpkg-buildflags(1)
+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+# see ENVIRONMENT in dpkg-buildflags(1)
+# package maintainers to append CFLAGS
+#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
+# package maintainers to append LDFLAGS
+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
+
+
+%:
+	dh $@
+
+
+# dh_make generated override targets
+# This is example for Cmake (See https://bugs.debian.org/641051 )
+#override_dh_auto_configure:
+#	dh_auto_configure -- #	-DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/upstream/.metadata.swp b/debian/upstream/.metadata.swp
new file mode 100644
index 0000000..5f7427e
Binary files /dev/null and b/debian/upstream/.metadata.swp differ
diff --git a/debian/upstream/metadata b/debian/upstream/metadata
new file mode 100644
index 0000000..864a0ff
--- /dev/null
+++ b/debian/upstream/metadata
@@ -0,0 +1,17 @@
+Name: gatb-core
+Cite-As: >
+  E. Drezen, G. Rizk, R. Chikhi, C. Deltel, C. Lemaitre, P. Peterlongo, D. Lavenier. (2014)
+  GATB: Genome Assembly & Analysis Tool Box.
+  Bioinformatics, 30(20):2959-2961. / BioIT 2014 poster
+Reference:
+  Author: Drezen, Erwan and Rizk, Guillaume and Chikhi, Rayan and Deltel, Charles and Lemaitre, Claire and Peterlongo, Pierre and Lavenier, Dominique
+  Title: "GATB: Genome Assembly & Analysis Tool Box"
+  Journal: Bioinformatics
+  Year: 2014
+  Volume: 30
+  Number: 20
+  Pages: 2959-2961
+  DOI: 10.1093/bioinformatics/btu406
+  URL: http://dx.doi.org/10.1093/bioinformatics/btu406
+  eprint: /oup/backfile/content_public/journal/bioinformatics/30/20/10.1093_bioinformatics_btu406/2/btu406.pdf
+Repository: https://github.com/GATB/gatb-core
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..970f806
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,6 @@
+version=4
+
+# New files on Github
+https://github.com/GATB/gatb-core/releases .*/archive/v(\d[\d.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz)
+
+
diff --git a/gatb-core/.gitignore b/gatb-core/.gitignore
new file mode 100644
index 0000000..33967a1
--- /dev/null
+++ b/gatb-core/.gitignore
@@ -0,0 +1,7 @@
+CMakeLists.txt.user
+/build*
+/.settings/
+/.cproject
+*.leon
+.DS_Store
+
diff --git a/gatb-core/.project b/gatb-core/.project
new file mode 100644
index 0000000..6bc484e
--- /dev/null
+++ b/gatb-core/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>gatb-core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/gatb-core/CMakeLists.txt b/gatb-core/CMakeLists.txt
new file mode 100644
index 0000000..0dc1f4d
--- /dev/null
+++ b/gatb-core/CMakeLists.txt
@@ -0,0 +1,316 @@
+project(gatb-core)
+
+# We set the required version
+cmake_minimum_required (VERSION 3.1.0)
+
+################################################################################
+# The version number.
+################################################################################
+# The default version number is the latest official build
+SET (gatb-core_VERSION_MAJOR 1)
+SET (gatb-core_VERSION_MINOR 4)
+SET (gatb-core_VERSION_PATCH 0)
+
+# But, it is possible to define another release number during a local build
+IF (DEFINED MAJOR)
+    SET (gatb-core_VERSION_MAJOR ${MAJOR})
+ENDIF()
+IF (DEFINED MINOR)
+    SET (gatb-core_VERSION_MINOR ${MINOR})
+ENDIF()
+IF (DEFINED PATCH)
+    SET (gatb-core_VERSION_PATCH ${PATCH})
+ENDIF()
+
+set (gatb-core-version ${gatb-core_VERSION_MAJOR}.${gatb-core_VERSION_MINOR}.${gatb-core_VERSION_PATCH})
+
+# However, continuous integration has priority over local compilation
+IF (DEFINED JENKINS_TAG)
+    SET (gatb-core-version ${JENKINS_TAG})
+ENDIF()
+
+# User login to upload doc-api; Jenkins has priority over local user
+IF (DEFINED JENKINS_GFORGE_USER)
+    SET (gatb-doc-user-login ${JENKINS_GFORGE_USER})
+ELSE()
+    SET (gatb-doc-user-login $ENV{USER})
+ENDIF()
+
+set (gatb-core-date "xxxx-xx-xx")
+
+################################################################################
+# Define cmake modules directory
+################################################################################
+set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+
+################################################################################
+# Include external cmake files
+################################################################################
+include (DefineInteger)
+include (CppUnit)
+
+# We check whether we have native 128 bits integers
+DefineInteger (k)
+
+# We get the current date
+string (TIMESTAMP gatb-core-date "%Y-%m-%d/%H:%M:%S")
+
+################################################################################
+# COMPILER DEFINITIONS
+################################################################################
+# We try to find the best compiler config, in particular for C++ extension usage
+if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+
+    IF(NOT CMAKE_CXX_COMPILER_VERSION) #for old cmakes
+        include(CheckCompiler)
+    ENDIF()
+    if (CMAKE_CXX_COMPILER_VERSION  VERSION_LESS 4.7) 
+        message(FATAL_ERROR "Insufficient gcc version (gcc>=4.7 needed)")
+    endif()
+
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+
+        if ("${CMAKE_CXX_COMPILER_VERSION}" STREQUAL "")
+        # travis-cl has a clang that shows no version, so trying this http://stackoverflow.com/questions/16150888/cmake-branch-on-clang-version
+            EXECUTE_PROCESS( COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE clang_full_version_string )
+            string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING ${clang_full_version_string})
+            set(CMAKE_CXX_COMPILER_VERSION ${CLANG_VERSION_STRING})
+        endif()
+
+    IF(CMAKE_SYSTEM_NAME MATCHES "(Darwin)") # different clang versions number between linux and mac
+        if (CMAKE_CXX_COMPILER_VERSION  VERSION_LESS 4.3)
+            message(FATAL_ERROR "Insufficient clang version (clang>=4.5 needed)")
+        endif()
+
+    else()
+        if (CMAKE_CXX_COMPILER_VERSION  VERSION_LESS 3.2) 
+            message(FATAL_ERROR "Insufficient clang version (clang>=3.2 needed)")
+        endif()
+
+    endif()
+else()
+        message ("-------------------------------------------------------------------------------------")
+        message ("-- WARNING !!! YOU USE AN UNKNOWN COMPILER...")
+        message ("-------------------------------------------------------------------------------------")
+endif()
+
+
+################################################################################
+# GENERAL DEFINITIONS
+################################################################################
+set (LIBRARY_COMPILE_DEFINITIONS "-std=c++11")
+set (LIB_COMPILE_WARNINGS "-Wall -Wno-unused-function -Wno-format -Wno-unknown-pragmas") # last one is exclusively for BooPHF
+
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+    set (debug 1)
+endif()
+
+if (debug)
+    #set (LIBRARY_COMPILE_DEFINITIONS  "${LIBRARY_COMPILE_DEFINITIONS} -g -p -pg")
+    set (LIBRARY_COMPILE_DEFINITIONS  "${LIBRARY_COMPILE_DEFINITIONS} -g -p ${LIB_COMPILE_WARNINGS}")
+    set (CMAKE_BUILD_TYPE Debug) # else CMake adds DNDEBUG
+    message("-- COMPILATION IN DEBUG MODE")
+else()
+    set (LIBRARY_COMPILE_DEFINITIONS  "${LIBRARY_COMPILE_DEFINITIONS} -O3 -DNDEBUG ${LIB_COMPILE_WARNINGS}")
+endif()
+
+if (INT128_FOUND)
+     set (LIBRARY_COMPILE_DEFINITIONS  "${LIBRARY_COMPILE_DEFINITIONS}  -DINT128_FOUND")
+endif()
+
+if (NONCANONICAL)
+    MESSAGE("--- Compiling with non-canonical (direct strand only) k-mer counting")
+    set (LIBRARY_COMPILE_DEFINITIONS  "${LIBRARY_COMPILE_DEFINITIONS}  -DNONCANONICAL=1")
+endif()
+
+
+# detect SSE for popcount 
+# this was for emphf, maybe it's for something else also? otherwise this part can be removed.
+#
+# from https://github.com/rurban/smhasher/blob/master/CMakeLists.txt
+# i do not see much performance gain for now, but let's keep that code here, might be useful later.
+# list of performance gain observed:
+# popcount in Graph::countNeighbors
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+    EXEC_PROGRAM(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)
+    STRING(REGEX REPLACE "^.*(sse2).*$" "\\1" SSE_THERE ${CPUINFO})
+    STRING(COMPARE EQUAL "sse2" "${SSE_THERE}" SSE2_TRUE)
+    STRING(REGEX REPLACE "^.*(sse4_2).*$" "\\1" SSE_THERE ${CPUINFO})
+    STRING(COMPARE EQUAL "sse4_2" "${SSE_THERE}" SSE42_TRUE)
+ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+    EXEC_PROGRAM("/usr/sbin/sysctl -n machdep.cpu.features" OUTPUT_VARIABLE
+        CPUINFO)
+    STRING(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" SSE_THERE ${CPUINFO})
+    STRING(COMPARE EQUAL "SSE2" "${SSE_THERE}" SSE2_TRUE)
+    STRING(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" SSE_THERE ${CPUINFO})
+    STRING(COMPARE EQUAL "SSE4.2" "${SSE_THERE}" SSE42_TRUE)
+ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+IF (SSE2_TRUE)
+    set(SSE2_FOUND true CACHE BOOL "SSE2 available")
+ELSE (SSE2_TRUE)
+    set(SSE2_FOUND false CACHE BOOL "SSE2 not available")
+ENDIF (SSE2_TRUE)
+IF (SSE42_TRUE)
+    set(SSE4_2_FOUND true CACHE BOOL "SSE4.2 available")
+ELSE (SSE42_TRUE)
+    set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 not available")
+ENDIF (SSE42_TRUE)
+# I could use LIBRARY_COMPILE_DEFINITIONS, but it's actually passed to "add_definitions", which isn't made for passing compilation flags, only -D ones.
+IF(SSE4_2_FOUND AND (NOT NO_SSE))
+    set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -msse2 -msse4.2 -mpopcnt")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -msse4.2 -mpopcnt")
+    message ("-- SSE 4.2 detected")
+ENDIF()
+
+# WARNING !!! For the moment, we need to remove some warnings (on Macos) due to use of offsetof macro on non Plain Old Data
+set (LIBRARY_COMPILE_DEFINITIONS "${LIBRARY_COMPILE_DEFINITIONS} -Wno-invalid-offsetof") 
+
+# We may have some custom compilation flags.
+if (use_allocator)
+    set (LIBRARY_COMPILE_DEFINITIONS "${LIBRARY_COMPILE_DEFINITIONS} -DGATB_USE_CUSTOM_ALLOCATOR") 
+endif()
+
+message("-- Options: ${LIBRARY_COMPILE_DEFINITIONS}")
+
+################################################################################
+#  DIRECTORIES MANAGEMENT 
+################################################################################
+
+set (LIBRARY_OUTPUT_PATH       ${PROJECT_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})
+set (EXECUTABLE_OUTPUT_PATH    ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
+
+################################################################################
+#  EXPORT FOR THIRD PARTIES 
+################################################################################
+
+# In case you need to use external libraries, you can use the following variables:
+#   EXTRALIBS      : names of the libraries to be used
+#   EXTRALIBS_PATH : directory where the libraries are
+#   EXTRALIBS_INC  : directory of the include files for the libraries 
+# For instance, you can do the following:
+#       cmake -DEXTRALIBS="somelib"  -DEXTRALIBS_PATH="/somewhere/libs"  -DEXTRALIBS_INC="/somewhere/inc" ..
+
+IF (DEFINED EXTRALIBS)
+    set (gatb-core-extra-libraries ${EXTRALIBS})
+    set (gatb-core-extra-libraries ${gatb-core-extra-libraries} PARENT_SCOPE)
+ENDIF()
+IF (DEFINED EXTRALIBS_PATH)
+    set (gatb-core-extra-libraries-path ${EXTRALIBS_PATH})
+    set (gatb-core-extra-libraries-path ${gatb-core-extra-libraries-path} PARENT_SCOPE)
+ENDIF()
+IF (DEFINED EXTRALIBS_INC)
+    set (gatb-core-extra-libraries-inc ${EXTRALIBS_INC})
+    set (gatb-core-extra-libraries-inc ${gatb-core-extra-libraries-inc} PARENT_SCOPE)
+ENDIF()
+
+# We define the compilation flags used for compiling binary based on gatb core
+set (gatb-core-flags ${LIBRARY_COMPILE_DEFINITIONS})
+
+# We define the include directories used for linking binary based on gatb core
+# Note that we need to add boost include dependency (not working otherwise with clang)
+set (gatb-core-includes ${PROJECT_BINARY_DIR}/include  ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE} ${PROJECT_SOURCE_DIR}/src  ${PROJECT_SOURCE_DIR}/thirdparty ${gatb-core-extra-libraries-inc})
+
+# We define the libraries used for linking binary based on gatb core
+set (gatb-core-libraries   gatbcore-static  dl  pthread  z hdf5 ${gatb-core-extra-libraries})
+
+# We define the directory where to find cmake helpers
+set (gatb-core-cmake  ${CMAKE_MODULE_PATH})
+
+# NOTE... we have to duplicate the variables for the other scopes (in particular for sub directories)
+set (gatb-core-flags          ${gatb-core-flags}          PARENT_SCOPE)
+set (gatb-core-includes       ${gatb-core-includes}       PARENT_SCOPE)
+set (gatb-core-libraries      ${gatb-core-libraries}      PARENT_SCOPE)
+set (gatb-core-cmake          ${gatb-core-cmake}          PARENT_SCOPE)
+
+################################################################################
+#  LIBRARY GENERATION 
+################################################################################
+ADD_SUBDIRECTORY(src)
+
+# NOTE... we have to duplicate the variables for the other scopes (in particular for sub directories)
+set (gatb-core-klist   ${gatb-core-klist}  PARENT_SCOPE)
+
+################################################################################
+#  UNIT TESTS GENERATION 
+################################################################################
+IF (DEFINED CPPUNIT_FOUND)
+    IF (EXISTS "${PROJECT_SOURCE_DIR}/test")
+        IF (NOT DEFINED GATB_CORE_EXCLUDE_TESTS)
+            ADD_SUBDIRECTORY (test)
+        ENDIF()
+    ENDIF()
+ENDIF()
+
+################################################################################
+#  TOOLS GENERATION 
+################################################################################
+IF (NOT DEFINED GATB_CORE_EXCLUDE_TOOLS)
+    ADD_SUBDIRECTORY(tools)
+ENDIF()
+
+################################################################################
+#  THIRD PARTY GENERATION (
+################################################################################
+ADD_SUBDIRECTORY(thirdparty)
+
+################################################################################
+#  DEPENDENCIES 
+################################################################################
+# we must be sure that hdf5 is built and installed before building gatb-core
+ADD_DEPENDENCIES (gatbcore-static hdf5 hdf5_postbuild)
+
+################################################################################
+#  DOCUMENTATION GENERATION 
+################################################################################
+IF (EXISTS "${PROJECT_SOURCE_DIR}/doc")
+    ADD_SUBDIRECTORY(doc EXCLUDE_FROM_ALL)
+ENDIF()
+
+################################################################################
+#  EXAMPLES GENERATION 
+################################################################################
+IF (EXISTS "${PROJECT_SOURCE_DIR}/examples")
+    IF (GATB_CORE_INCLUDE_EXAMPLES)
+        ADD_SUBDIRECTORY(examples)
+    ENDIF()
+ENDIF()
+# add example snippets into binary archive (use by CPack directive)
+INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/examples/" DESTINATION "examples")
+
+################################################################################
+#  INSTALL 
+################################################################################
+
+IF (NOT DEFINED GATB_CORE_INSTALL_EXCLUDE)
+    INSTALL (FILES ${PROJECT_SOURCE_DIR}/doc/misc/README.txt  DESTINATION . OPTIONAL)
+    INSTALL (FILES ${PROJECT_SOURCE_DIR}/LICENCE              DESTINATION . OPTIONAL)
+    INSTALL (FILES ${PROJECT_SOURCE_DIR}/THIRDPARTIES.md      DESTINATION . OPTIONAL)
+    INSTALL (DIRECTORY ${PROJECT_SOURCE_DIR}/thirdparty/boost DESTINATION ./include)
+ENDIF()
+
+################################################################################
+#  DELIVERY 
+################################################################################
+SET (CPACK_PACKAGE_DESCRIPTION_SUMMARY  "gatb-core project")
+SET (CPACK_PACKAGE_VENDOR               "Genscale team (INRIA)")
+SET (CPACK_PACKAGE_VERSION_MAJOR        "${gatb-core_VERSION_MAJOR}")
+SET (CPACK_PACKAGE_VERSION_MINOR        "${gatb-core_VERSION_MINOR}")
+SET (CPACK_PACKAGE_VERSION_PATCH        "${gatb-core_VERSION_PATCH}")
+SET (CPACK_PACKAGE_VERSION              "${gatb-core-version}")  
+SET (CPACK_PACKAGE_FILE_NAME            "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}-bin-${CMAKE_SYSTEM_NAME}")
+SET (CPACK_GENERATOR                    "TGZ")
+SET (CPACK_SOURCE_GENERATOR             "TGZ")
+SET (CPACK_SOURCE_IGNORE_FILES          
+    "^${PROJECT_SOURCE_DIR}/build/"  
+    "^${PROJECT_SOURCE_DIR}/.project"
+    "^${PROJECT_SOURCE_DIR}/.gitignore"
+    "^${PROJECT_SOURCE_DIR}/doc/design"
+    "^${PROJECT_SOURCE_DIR}/DELIVERY.md"
+)
+
+
+
+IF (NOT DEFINED GATB_CORE_INSTALL_EXCLUDE)
+    # We include the module and get all the delivery targets
+    include (Delivery)
+ENDIF ()
diff --git a/gatb-core/DELIVERY.md b/gatb-core/DELIVERY.md
new file mode 100644
index 0000000..8813684
--- /dev/null
+++ b/gatb-core/DELIVERY.md
@@ -0,0 +1,18 @@
+--------------------------------------------------------------------------------
+# HOW TO DELIVER A NEW RELEASE ?
+
+A delivery is made of two files:
+* binary archive
+* source archive
+
+To create a new release, simply use the script 'script/make_official_release.sh.
+
+It is worth noting that this script can only be used by Inria's Genscale team members since it requires an access to the officiel GATB-CORE repository hosted on Inria Forge.
+    
+More at https://wiki.inria.fr/genscale/Making-gatbcore-release
+
+--------------------------------------------------------------------------------
+# HOW TO KNOW THE EXISTING RELEASES ?
+
+Go to https://github.com/GATB/gatb-core/releases
+
diff --git a/gatb-core/LICENCE b/gatb-core/LICENCE
new file mode 100644
index 0000000..2024b4d
--- /dev/null
+++ b/gatb-core/LICENCE
@@ -0,0 +1,622 @@
+      GNU AFFERO GENERAL PUBLIC LICENSE
+
+Version 3, 19 November 2007
+
+Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+
+      Preamble
+
+The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+The licenses for most software and other practical works are designed to
+take away your freedom to share and change the works. By contrast, our
+General Public Licenses are intended to guarantee your freedom to share
+and change all versions of a program--to make sure it remains free
+software for all its users.
+
+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 them 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.
+
+Developers that use our General Public Licenses protect your rights with
+two steps: (1) assert copyright on the software, and (2) offer you this
+License which gives you legal permission to copy, distribute and/or
+modify the software.
+
+A secondary benefit of defending all users' freedom is that improvements
+made in alternate versions of the program, if they receive widespread
+use, become available for other developers to incorporate. Many
+developers of free software are heartened and encouraged by the
+resulting cooperation. However, in the case of software used on network
+servers, this result may fail to come about. The GNU General Public
+License permits making a modified version and letting the public access
+it on a server without ever releasing its source code to the public.
+
+The GNU Affero General Public License is designed specifically to ensure
+that, in such cases, the modified source code becomes available to the
+community. It requires the operator of a network server to provide the
+source code of the modified version running there to the users of that
+server. Therefore, public use of a modified version, on a publicly
+accessible server, gives the public access to the source code of the
+modified version.
+
+An older license, called the Affero General Public License and published
+by Affero, was designed to accomplish similar goals. This is a different
+license, not a version of the Affero GPL, but Affero has released a new
+version of the Affero GPL which permits relicensing under this license.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+      TERMS AND CONDITIONS
+
+
+        0. Definitions.
+
+"This License" refers to version 3 of the GNU Affero General Public License.
+
+"Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based on
+the Program.
+
+To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to
+the extent that it includes a convenient and prominently visible feature
+that (1) displays an appropriate copyright notice, and (2) tells the
+user that there is no warranty for the work (except to the extent that
+warranties are provided), that licensees may convey the work under this
+License, and how to view a copy of this License. If the interface
+presents a list of user commands or options, such as a menu, a prominent
+item in the list meets this criterion.
+
+
+        1. Source Code.
+
+The "source code" for a work means the preferred form of the work for
+making modifications to it. "Object code" means any non-source form of a
+work.
+
+A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that is
+widely used among developers working in that language.
+
+The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that Major
+Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A "Major
+Component", in this context, means a major essential component (kernel,
+window system, and so on) of the specific operating system (if any) on
+which the executable work runs, or a compiler used to produce the work,
+or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all the
+source code needed to generate, install, and (for an executable work)
+run the object code and to modify the work, including scripts to control
+those activities. However, it does not include the work's System
+Libraries, or general-purpose tools or generally available free programs
+which are used unmodified in performing those activities but which are
+not part of the work. For example, Corresponding Source includes
+interface definition files associated with source files for the work,
+and the source code for shared libraries and dynamically linked
+subprograms that the work is specifically designed to require, such as
+by intimate data communication or control flow between those subprograms
+and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same work.
+
+
+        2. Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10 makes
+it unnecessary.
+
+
+        3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article 11
+of the WIPO copyright treaty adopted on 20 December 1996, or similar
+laws prohibiting or restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to the
+covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+
+        4. Conveying Verbatim Copies.
+
+You may convey 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; keep
+intact all notices stating that this License and any non-permissive
+terms added in accord with section 7 apply to the code; keep intact all
+notices of the absence of any warranty; and give all recipients a copy
+of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and
+you may offer support or warranty protection for a fee.
+
+
+        5. Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the terms
+of section 4, provided that you also meet all of these conditions:
+
+    * a) The work must carry prominent notices stating that you modified
+      it, and giving a relevant date.
+    * b) The work must carry prominent notices stating that it is
+      released under this License and any conditions added under section
+      7. This requirement modifies the requirement in section 4 to "keep
+      intact all notices".
+    * c) You must license the entire work, as a whole, under this
+      License to anyone who comes into possession of a copy. This
+      License will therefore apply, along with any applicable section 7
+      additional terms, to the whole of the work, and all its parts,
+      regardless of how they are packaged. This License gives no
+      permission to license the work in any other way, but it does not
+      invalidate such permission if you have separately received it.
+    * d) If the work has interactive user interfaces, each must display
+      Appropriate Legal Notices; however, if the Program has interactive
+      interfaces that do not display Appropriate Legal Notices, your
+      work need not make them do so.
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work, and
+which are not combined with it such as to form a larger program, in or
+on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not used
+to limit the access or legal rights of the compilation's users beyond
+what the individual works permit. Inclusion of a covered work in an
+aggregate does not cause this License to apply to the other parts of the
+aggregate.
+
+
+        6. Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these ways:
+
+    * a) Convey the object code in, or embodied in, a physical product
+      (including a physical distribution medium), accompanied by the
+      Corresponding Source fixed on a durable physical medium
+      customarily used for software interchange.
+    * b) Convey the object code in, or embodied in, a physical product
+      (including a physical distribution medium), accompanied by a
+      written offer, valid for at least three years and valid for as
+      long as you offer spare parts or customer support for that product
+      model, to give anyone who possesses the object code either (1) a
+      copy of the Corresponding Source for all the software in the
+      product that is covered by this License, on a durable physical
+      medium customarily used for software interchange, for a price no
+      more than your reasonable cost of physically performing this
+      conveying of source, or (2) access to copy the Corresponding
+      Source from a network server at no charge.
+    * c) Convey individual copies of the object code with a copy of the
+      written offer to provide the Corresponding Source. This
+      alternative is allowed only occasionally and noncommercially, and
+      only if you received the object code with such an offer, in accord
+      with subsection 6b.
+    * d) Convey the object code by offering access from a designated
+      place (gratis or for a charge), and offer equivalent access to the
+      Corresponding Source in the same way through the same place at no
+      further charge. You need not require recipients to copy the
+      Corresponding Source along with the object code. If the place to
+      copy the object code is a network server, the Corresponding Source
+      may be on a different server (operated by you or a third party)
+      that supports equivalent copying facilities, provided you maintain
+      clear directions next to the object code saying where to find the
+      Corresponding Source. Regardless of what server hosts the
+      Corresponding Source, you remain obligated to ensure that it is
+      available for as long as needed to satisfy these requirements.
+    * e) Convey the object code using peer-to-peer transmission,
+      provided you inform other peers where the object code and
+      Corresponding Source of the work are being offered to the general
+      public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be included
+in conveying the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of coverage.
+For a particular product received by a particular user, "normally used"
+refers to a typical or common use of that class of product, regardless
+of the status of the particular user or of the way in which the
+particular user actually uses, or expects or is expected to use, the
+product. A product is a consumer product regardless of whether the
+product has substantial commercial, industrial or non-consumer uses,
+unless such uses represent the only significant mode of use of the product.
+
+"Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product
+from a modified version of its Corresponding Source. The information
+must suffice to ensure that the continued functioning of the modified
+object code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied by
+the Installation Information. But this requirement does not apply if
+neither you nor any third party retains the ability to install modified
+object code on the User Product (for example, the work has been
+installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided, in
+accord with this section must be in a format that is publicly documented
+(and with an implementation available to the public in source code
+form), and must require no special password or key for unpacking,
+reading or copying.
+
+
+        7. Additional Terms.
+
+"Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by this
+License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove
+any additional permissions from that copy, or from any part of it.
+(Additional permissions may be written to require their own removal in
+certain cases when you modify the work.) You may place additional
+permissions on material, added by you to a covered work, for which you
+have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+    * a) Disclaiming warranty or limiting liability differently from the
+      terms of sections 15 and 16 of this License; or
+    * b) Requiring preservation of specified reasonable legal notices or
+      author attributions in that material or in the Appropriate Legal
+      Notices displayed by works containing it; or
+    * c) Prohibiting misrepresentation of the origin of that material,
+      or requiring that modified versions of such material be marked in
+      reasonable ways as different from the original version; or
+    * d) Limiting the use for publicity purposes of names of licensors
+      or authors of the material; or
+    * e) Declining to grant rights under trademark law for use of some
+      trade names, trademarks, or service marks; or
+    * f) Requiring indemnification of licensors and authors of that
+      material by anyone who conveys the material (or modified versions
+      of it) with contractual assumptions of liability to the recipient,
+      for any liability that these contractual assumptions directly
+      impose on those licensors and authors.
+
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains a
+further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms of
+that license document, provided that the further restriction does not
+survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must
+place, in the relevant source files, a statement of the additional terms
+that apply to those files, or a notice indicating where to find the
+applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the above
+requirements apply either way.
+
+
+        8. Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally terminates
+your license, and (b) permanently, if the copyright holder fails to
+notify you of the violation by some reasonable means prior to 60 days
+after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated
+permanently if the copyright holder notifies you of the violation by
+some reasonable means, this is the first time you have received notice
+of violation of this License (for any work) from that copyright holder,
+and you cure the violation prior to 30 days after your receipt of the
+notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+
+        9. Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run a
+copy of the Program. Ancillary propagation of a covered work occurring
+solely as a consequence of using peer-to-peer transmission to receive a
+copy likewise does not require acceptance. However, nothing other than
+this License grants you permission to propagate or modify any covered
+work. These actions infringe copyright if you do not accept this
+License. Therefore, by modifying or propagating a covered work, you
+indicate your acceptance of this License to do so.
+
+
+        10. Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered work
+results from an entity transaction, each party to that transaction who
+receives a copy of the work also receives whatever licenses to the work
+the party's predecessor in interest had or could give under the previous
+paragraph, plus a right to possession of the Corresponding Source of the
+work from the predecessor in interest, if the predecessor has it or can
+get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may not
+impose a license fee, royalty, or other charge for exercise of rights
+granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that any
+patent claim is infringed by making, using, selling, offering for sale,
+or importing the Program or any portion of it.
+
+
+        11. Patents.
+
+A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The work
+thus licensed is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned or
+controlled by the contributor, whether already acquired or hereafter
+acquired, that would be infringed by some manner, permitted by this
+License, of making, using, or selling its contributor version, but do
+not include claims that would be infringed only as a consequence of
+further modification of the contributor version. For purposes of this
+definition, "control" includes the right to grant patent sublicenses in
+a manner consistent with the requirements of this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to make,
+use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and
+the Corresponding Source of the work is not available for anyone to
+copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify or
+convey a specific copy of the covered work, then the patent license you
+grant is automatically extended to all recipients of the covered work
+and works based on it.
+
+A patent license is "discriminatory" if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you are
+a party to an arrangement with a third party that is in the business of
+distributing software, under which you make payment to the third party
+based on the extent of your activity of conveying the work, and under
+which the third party grants, to any of the parties who would receive
+the covered work from you, a discriminatory patent license (a) in
+connection with copies of the covered work conveyed by you (or copies
+made from those copies), or (b) primarily for and in connection with
+specific products or compilations that contain the covered work, unless
+you entered into that arrangement, or that patent license was granted,
+prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any
+implied license or other defenses to infringement that may otherwise be
+available to you under applicable patent law.
+
+
+        12. No Surrender of Others' Freedom.
+
+If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not convey it at all. For example, if you agree to terms that
+obligate you to collect a royalty for further conveying from those to
+whom you convey the Program, the only way you could satisfy both those
+terms and this License would be to refrain entirely from conveying the
+Program.
+
+
+        13. Remote Network Interaction; Use with the GNU General Public
+        License.
+
+Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+Notwithstanding any other provision of this License, you have permission
+to link or combine any covered work with a work licensed under version 3
+of the GNU General Public License into a single combined work, and to
+convey the resulting work. The terms of this License will continue to
+apply to the part which is the covered work, but the work with which it
+is combined will remain governed by version 3 of the GNU General Public
+License.
+
+
+        14. Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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 that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the option
+of following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation. If the
+Program does not specify a version number of the GNU Affero General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different permissions.
+However, no additional obligations are imposed on any author or
+copyright holder as a result of your choosing to follow a later version.
+
+
+        15. Disclaimer of Warranty.
+
+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.
+
+
+        16. Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS 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.
+
+
+        17. Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided above
+cannot be given local legal effect according to their terms, reviewing
+courts shall apply local law that most closely approximates an absolute
+waiver of all civil liability in connection with the Program, unless a
+warranty or assumption of liability accompanies a copy of the Program in
+return for a fee.
+
+END OF TERMS AND CONDITIONS
diff --git a/gatb-core/RELEASES.md b/gatb-core/RELEASES.md
new file mode 100644
index 0000000..ad986d1
--- /dev/null
+++ b/gatb-core/RELEASES.md
@@ -0,0 +1,124 @@
+--------------------------------------------------------------------------------
+# RELEASE 1.2.1
+
+* bug fixes when MPHF is queried on a false positive node.
+
+* bug fixes that caused "Pool allocation failed" on some large instances.
+
+* fixed some compilation issues regarding clang version (version number incoherence between mac/linux).
+
+* fixed include problem in binary distribution that caused undue dependency on boost.
+
+--------------------------------------------------------------------------------
+# RELEASE 1.2.0
+
+* Assembly-inspired de Bruijn graph simplifications can be performed using a single command.
+
+Here is an example:
+
+    // removes tips, bubbles and erroneous connections, 
+    // similar to some of the algorithms implemented in the SPAdes assembler
+    graph.simplify(); 
+
+* Faster graph traversal can be activated using a single command. 
+
+Here is an example:
+
+    // allocates 1 byte/node to precompute adjacency for each nodes 
+    // in the MPHF. 
+    // Faster graph traversal (especially using neighbors()).
+    graph.precomputeAdjacency(); 
+       
+* **Breaking API changes**
+
+Major changes in API are:
+
+      neighbors\<Node>(..) *becomes* neighbors(..)
+      neighbors\<Edge>(..) *becomes* neighborsEdge(..)
+      iterator\<Node>(..) *becomes* iterator(..)
+      iterator\<BranchingNode>(..) *becomes* iteratorBranching(..) 
+      node.kmer.get\<Type>() *becomes* node.template getKmer<Type>()
+      successors\<Node>(..) *becomes* successors(..)  
+      const Node& *becomes* Node&
+           (as MPHF indices are now cached in Node objects)
+
+      etc.. for all fonctions of the type:
+      - xxx\<Node>,
+      - xxx\<Edge>, 
+      - xxx\<BranchingNode>,
+      - xxx\<BranchingEdge>.
+
+      
+* The basic kmer type (Kmer\<>::Type) no longer has a constructor. Use [kmer].setVal(0) to set the value of the variable [kmer] to zero.
+
+For instance, the following code:
+
+    optimum = Kmer<span>::Type(0)
+
+becomes:
+
+    optimum.setVal(0);
+
+* Graph is now a templated object (GraphTemplate\<Node\_t, Edge\_t, GraphDataVariant\_t>) behind the scenes. However this change is transparent to users of previous versions of GATB-core, as compatibility with the Graph class is preserved.
+
+
+* New implementation for the minimal perfect hash function (switched from emphf to BooPHF)
+
+* Non-canonical k-mer counting is supported via "cmake -DNONCANONICAL=1"
+    
+* bug fixes in how queries with dir=DIR_INCOMING are handled.
+
+* various minor bug fixes
+
+
+--------------------------------------------------------------------------------
+# RELEASE 1.1.1
+
+* Re-design to support variable number of kmer sizes
+ => now, one can use the cmake variable KSIZE_LIST, for instance "cmake -DKSIZE_LIST="32 64 96" ..
+
+* Allows "auto" value for the -abundance-min parameter
+
+--------------------------------------------------------------------------------
+# RELEASE 1.1.0
+
+* Re-design of the SortingCountAlgorithm with introduction of interface ICountProcessor
+ => it should allow development of new tools based on kmers counting
+
+--------------------------------------------------------------------------------
+# RELEASE 1.0.8
+
+* Correction of memory alignment issue on MacOs in some cases
+
+* Re-introduce multi-passes management in DSK
+
+* Correction of passes number configuration with some banks inputs
+
+* Temporary files have now unique names so dbgh5 can be launched several times in the same working directory
+
+--------------------------------------------------------------------------------
+# RELEASE 1.0.7
+
+* Correction of scripts for new project creation and delivery process
+
+--------------------------------------------------------------------------------
+# RELEASE 1.0.6
+
+* Speed up from x2 to x3 for kmer counting and graph construction phases (optimizations based on minimizers and improved Bloom filters). GATB's k-mer counter has been improved using techniques from KMC2, to achieve competitive running times compared to KMC2.
+
+* Ability to store arbitrary information associated to each kmer of the graph, enabled by a minimal perfect hash function (costs only 2.61 bits/kmer of memory)
+
+* Improved API with new possibilities (banks and kmers management)
+
+* Many new snippets showing how to use the library.
+
+
+--------------------------------------------------------------------------------
+# RELEASE 1.0.5
+
+Modifications of Kmer::Model class for kmers management
+* better implementation (factorization, optimization)
+* introduction of minimizers concept
+
+WARNING ! These modifications introduced small API changes. Please read snippets kmer2 and kmer5 to see how to handle kmers now.
+
diff --git a/gatb-core/THIRDPARTIES.md b/gatb-core/THIRDPARTIES.md
new file mode 100644
index 0000000..987a0fd
--- /dev/null
+++ b/gatb-core/THIRDPARTIES.md
@@ -0,0 +1,140 @@
+--------------------------------------------------------------------------------
+# BOOST
+
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+
+--------------------------------------------------------------------------------
+# HDF5
+
+Copyright Notice and License Terms for 
+HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+-----------------------------------------------------------------------------
+
+HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+Copyright 2006-2013 by The HDF Group.
+
+NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted for any purpose (including commercial purposes) 
+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 materials provided with the distribution.
+
+3. In addition, redistributions of modified forms of the source or binary 
+   code must carry prominent notices stating that the original code was 
+   changed and the date of the change.
+
+4. All publications or advertising materials mentioning features or use of 
+   this software are asked, but not required, to acknowledge that it was 
+   developed by The HDF Group and by the National Center for Supercomputing 
+   Applications at the University of Illinois at Urbana-Champaign and 
+   credit the contributors.
+
+5. Neither the name of The HDF Group, the name of the University, nor the 
+   name of any Contributor may be used to endorse or promote products derived 
+   from this software without specific prior written permission from 
+   The HDF Group, the University, or the Contributor, respectively.
+
+DISCLAIMER: 
+THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS 
+"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.  In no 
+event shall The HDF Group or the Contributors be liable for any damages 
+suffered by the users arising out of the use of this software, even if 
+advised of the possibility of such damage. 
+
+-----------------------------------------------------------------------------
+-----------------------------------------------------------------------------
+
+Contributors:   National Center for Supercomputing Applications (NCSA) at 
+the University of Illinois, Fortner Software, Unidata Program Center (netCDF), 
+The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), 
+and Digital Equipment Corporation (DEC).
+
+-----------------------------------------------------------------------------
+
+Portions of HDF5 were developed with support from the Lawrence Berkeley 
+National Laboratory (LBNL) and the United States Department of Energy 
+under Prime Contract No. DE-AC02-05CH11231.
+
+-----------------------------------------------------------------------------
+
+Portions of HDF5 were developed with support from the University of 
+California, Lawrence Livermore National Laboratory (UC LLNL).  
+The following statement applies to those portions of the product and must 
+be retained in any redistribution of source code, binaries, documentation, 
+and/or accompanying materials:
+
+   This work was partially produced at the University of California, 
+   Lawrence Livermore National Laboratory (UC LLNL) under contract 
+   no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy 
+   (DOE) and The Regents of the University of California (University) 
+   for the operation of UC LLNL.
+
+   DISCLAIMER: 
+   This work was prepared as an account of work sponsored by an agency of 
+   the United States Government. Neither the United States Government nor 
+   the University of California nor any of their employees, makes any 
+   warranty, express or implied, or assumes any liability or responsibility 
+   for the accuracy, completeness, or usefulness of any information, 
+   apparatus, product, or process disclosed, or represents that its use 
+   would not infringe privately- owned rights. Reference herein to any 
+   specific commercial products, process, or service by trade name, 
+   trademark, manufacturer, or otherwise, does not necessarily constitute 
+   or imply its endorsement, recommendation, or favoring by the United 
+   States Government or the University of California. The views and 
+   opinions of authors expressed herein do not necessarily state or reflect 
+   those of the United States Government or the University of California, 
+   and shall not be used for advertising or product endorsement purposes.
+
+ 
+--------------------------------------------------------------------------------
+# EMPHF
+
+Copyright 2013 Giuseppe Ottaviano <giuott at gmail.com>
+
+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.
+
+    
\ No newline at end of file
diff --git a/gatb-core/cmake/CheckCompiler.cmake b/gatb-core/cmake/CheckCompiler.cmake
new file mode 100644
index 0000000..1a3db97
--- /dev/null
+++ b/gatb-core/cmake/CheckCompiler.cmake
@@ -0,0 +1,23 @@
+# -*- mode: cmake; -*-
+#
+#  Figure out the version of the used compiler
+#  Variables set by this module
+#  CMAKE_CXX_COMPILER_MAJOR  major version of compiler
+#  CMAKE_CXX_COMPILER_MINR   minor version of compiler
+#  CMAKE_CXX_COMPILER_PATCH  patch level (e.g. gcc 4.1.0)
+#
+
+# only available in Cmake 2.8.9, 
+# extract version from command line if not available
+if(NOT CMAKE_CXX_COMPILER_VERSION) 
+  if( ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
+    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
+        OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION)
+
+    string(STRIP ${CMAKE_CXX_COMPILER_VERSION} CMAKE_CXX_COMPILER_VERSION)
+ endif( ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
+
+#TODO Write same for clang
+endif(NOT CMAKE_CXX_COMPILER_VERSION)
+
+
diff --git a/gatb-core/cmake/CppUnit.cmake b/gatb-core/cmake/CppUnit.cmake
new file mode 100644
index 0000000..526dd4f
--- /dev/null
+++ b/gatb-core/cmake/CppUnit.cmake
@@ -0,0 +1,41 @@
+################################################################################
+# CPPUNIT
+################################################################################
+
+FIND_PATH (CPPUNIT_INCLUDE_DIR cppunit/extensions/HelperMacros.h
+  $ENV{HOME}/.linuxbrew/include
+  /local/include
+  /usr/include
+  /usr/local/include
+  /usr/local/Cellar/cppunit/1.12.1/include
+  NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY (CPPUNIT_LIBRARY cppunit
+    ${CPPUNIT_INCLUDE_DIR}/../lib
+    /usr/lib
+    /usr/local/lib
+)
+
+# A little hack here... We check whether the static library is reachable too.
+if (NOT EXISTS "${CPPUNIT_INCLUDE_DIR}/../lib/libcppunit.a")
+    message ("-- CppUnit: found headers (in ${CPPUNIT_INCLUDE_DIR}) but not the static library (${CPPUNIT_INCLUDE_DIR}/../lib/libcppunit.a)")
+    SET (CPPUNIT_NO_STATIC_LIB_FOUND 1)   
+endif()
+
+IF (CPPUNIT_INCLUDE_DIR)
+    IF (CPPUNIT_LIBRARY)
+        SET (CPPUNIT_FOUND "YES")
+        SET (CPPUNIT_LIBRARIES ${CPPUNIT_LIBRARY})
+        IF (NOT CPPUNIT_NO_STATIC_LIB_FOUND)
+            SET (CPPUNIT_LIBRARY_STATIC ${CPPUNIT_INCLUDE_DIR}/../lib/libcppunit.a)
+        ENDIF()
+    ENDIF (CPPUNIT_LIBRARY)
+ENDIF (CPPUNIT_INCLUDE_DIR)
+
+IF (DEFINED CPPUNIT_FOUND)
+    message("-- CppUnit FOUND (${CPPUNIT_INCLUDE_DIR})")
+ELSE()
+    message("-- CppUnit NOT FOUND")
+ENDIF()
+
diff --git a/gatb-core/cmake/DefineInteger.cmake b/gatb-core/cmake/DefineInteger.cmake
new file mode 100644
index 0000000..faee2b8
--- /dev/null
+++ b/gatb-core/cmake/DefineInteger.cmake
@@ -0,0 +1,65 @@
+################################################################################
+# Got from https://github.com/hoytak/hashreduce/blob/master/cmake/CheckInt128.cmake
+################################################################################
+
+include(CheckTypeSize)
+
+MACRO(CHECK_INT128 INT128_NAME VARIABLE DEFINE_NAME)
+
+    if(NOT INT128_FOUND)
+        check_type_size("${INT128_NAME}" "int128_t_${DEFINE_NAME}")
+        if("HAVE_int128_t_${DEFINE_NAME}")
+            if("int128_t_${DEFINE_NAME}" EQUAL 16)
+                #message("Found: Enabling support for 128 bit integers using ${INT128_NAME}.")
+                SET(INT128_FOUND 1)
+                SET(${VARIABLE} "${DEFINE_NAME}")
+            else()
+                #message("${INT128_NAME} has size ${int128_t}, can't use.")
+            endif()
+        endif()
+    endif()
+endmacro()
+
+
+################################################################################
+# Define INTEGER_KIND and KMER_PRECISION with k as entry
+################################################################################
+
+MACRO(DefineInteger K)
+
+    # we initialize the variable
+    SET(INT128_FOUND 0)
+
+    Check_Int128 ("__uint128"    128_DEF "USE__uint128")
+    Check_Int128 ("__uint128_t"  128_DEF "USE__uint128_t")
+
+    # We may have undefined parameter => we use a default value
+    if (NOT k)
+        set (k "0")
+    endif()
+
+    if (${k} LESS 33)
+        set (INTEGER_KIND "1")
+
+    elseif (${k} LESS 65)
+
+        if (INT128_FOUND)
+            set (INTEGER_KIND "2")
+        else()
+            set (INTEGER_KIND "3")
+        endif()
+
+    else()
+        set (INTEGER_KIND "3")
+    endif()
+
+
+    if (${INTEGER_KIND} EQUAL "3")
+        MATH(EXPR KMER_PRECISION "(${k}+31)/32")
+    else()
+        set (KMER_PRECISION "1")
+    endif()
+
+    #message("-- Parameter k=${k} => INTEGER_KIND=${INTEGER_KIND} and KMER_PRECISION=${KMER_PRECISION}")
+
+endmacro()
diff --git a/gatb-core/cmake/Delivery.cmake b/gatb-core/cmake/Delivery.cmake
new file mode 100644
index 0000000..373fd01
--- /dev/null
+++ b/gatb-core/cmake/Delivery.cmake
@@ -0,0 +1,90 @@
+################################################################################
+# DELIVERY
+################################################################################
+
+# We get the 'package' and 'package_source' targets
+include (CPack)
+
+# We get the user name
+IF (NOT CPACK_USER_NAME)
+    SET (CPACK_USER_NAME  $ENV{USER})
+ENDIF (NOT CPACK_USER_NAME)
+
+# We get the date
+string (TIMESTAMP CPACK_DATE "%Y-%m-%d/%H:%M:%S")
+
+# We may have to set (if not defined) the CPACK_GFORGE_PROJECT_NAME
+IF (NOT CPACK_GFORGE_PROJECT_NAME)
+    SET (CPACK_GFORGE_PROJECT_NAME  ${PROJECT_NAME})
+ENDIF (NOT CPACK_GFORGE_PROJECT_NAME)
+
+# We define the name of the bin archive
+SET (CPACK_URI_BIN "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-bin-${CPACK_SYSTEM_NAME}.tar.gz")
+SET (CPACK_URI_BIN_INFO "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-bin-${CPACK_SYSTEM_NAME}.info.txt")
+
+# We set the text holding all the information about the delivery.
+SET (CPACK_INFO_BIN ${CPACK_GFORGE_PROJECT_NAME} bin ${CPACK_PACKAGE_VERSION} on ${CPACK_DATE} for ${CPACK_SYSTEM_NAME} by ${CPACK_USER_NAME})
+
+# We define the Inria Forge place where to place a copy of the bin archive
+SET (CPACK_SERVER_ADDRESS   "${CPACK_USER_NAME}@scm.gforge.inria.fr")
+SET (CPACK_SERVER_DIR_BIN   "/home/groups/${CPACK_GFORGE_PROJECT_NAME}/htdocs/versions/bin/")
+
+
+################################################################################
+# MAIN TARGET
+################################################################################
+
+# We add a custom target for delivery binaries
+add_custom_target (delivery 
+
+    COMMAND echo "================================================================"
+    COMMAND echo ""
+    COMMAND echo " Starting official delivery of GATB-CORE library ${CPACK_PACKAGE_VERSION}"
+    COMMAND echo ""
+    COMMAND echo "================================================================"
+    COMMAND echo "Checking Inria Forge repository..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/delivery_check_repo.sh 
+    COMMAND echo "Compiling library..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/delivery_compile.sh ${SILENT_MODE}
+    COMMAND echo "Creating release tag on git repository..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/git_tag_manager.sh -M ${gatb-core_VERSION_MAJOR} -m ${gatb-core_VERSION_MINOR} -p ${gatb-core_VERSION_PATCH} -t \"'new release: ${CPACK_INFO_BIN}'\" 
+    COMMAND echo "Uploading binary on Inria Forge..."
+    COMMAND scp -q ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN} ${CPACK_SERVER_ADDRESS}:${CPACK_SERVER_DIR_BIN}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/delivery_dump_system.sh ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO} ${CMAKE_VERSION} ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} ${CMAKE_CXX_FLAGS} ${LIBRARY_COMPILE_DEFINITIONS}
+    COMMAND scp -q ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO} ${CPACK_SERVER_ADDRESS}:${CPACK_SERVER_DIR_BIN}
+    COMMAND echo "Creating release on github..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/github_release_manager.sh -l ${GH_LOGIN} -t ${GH_TOKEN} -o ${GH_OWNER} -r ${GH_REPO} -d "v${CPACK_PACKAGE_VERSION}" -c create -m \"'new release: ${CPACK_INFO_BIN}'\" 
+    COMMAND echo "Uploading binary on github..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/github_release_manager.sh -l ${GH_LOGIN} -t ${GH_TOKEN} -o ${GH_OWNER} -r ${GH_REPO} -d "v${CPACK_PACKAGE_VERSION}" -c upload ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/github_release_manager.sh -l ${GH_LOGIN} -t ${GH_TOKEN} -o ${GH_OWNER} -r ${GH_REPO} -d "v${CPACK_PACKAGE_VERSION}" -c upload ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO}
+)
+
+# We add a custom target for delivery binaries
+add_custom_target (upload 
+
+    COMMAND echo "Compiling library..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/delivery_compile.sh true
+    COMMAND echo "Uploading binary on Inria Forge..."
+    COMMAND scp -q ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN} ${CPACK_SERVER_ADDRESS}:${CPACK_SERVER_DIR_BIN}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/delivery_dump_system.sh ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO} ${CMAKE_VERSION} ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} ${CMAKE_CXX_FLAGS} ${LIBRARY_COMPILE_DEFINITIONS}
+    COMMAND scp -q ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO} ${CPACK_SERVER_ADDRESS}:${CPACK_SERVER_DIR_BIN}
+    COMMAND echo "Uploading binary on github..."
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/github_release_manager.sh -l ${GH_LOGIN} -t ${GH_TOKEN} -o ${GH_OWNER} -r ${GH_REPO} -d "v${CPACK_PACKAGE_VERSION}" -c upload ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/github_release_manager.sh -l ${GH_LOGIN} -t ${GH_TOKEN} -o ${GH_OWNER} -r ${GH_REPO} -d "v${CPACK_PACKAGE_VERSION}" -c upload ${CMAKE_CURRENT_SOURCE_DIR}/build/${CPACK_URI_BIN_INFO}
+)
+
+
+################################################################################
+# TARGET 'help'
+################################################################################
+
+# We add a custom target for delivery sources
+add_custom_target (delivery_help
+    COMMAND echo "-----------------------------------------------------------"
+    COMMAND echo "DELIVERY TARGETS"
+    COMMAND echo "-----------------------------------------------------------"
+    COMMAND echo "delivery: build a targz for binaries, tag Inria repository, create a github release and upload to github"
+    COMMAND echo "upload:   only build a targz for binaries and upload to github"
+    COMMAND echo ""
+)
+
diff --git a/gatb-core/cmake/GatbCore.cmake b/gatb-core/cmake/GatbCore.cmake
new file mode 100644
index 0000000..43797ce
--- /dev/null
+++ b/gatb-core/cmake/GatbCore.cmake
@@ -0,0 +1,55 @@
+################################################################################
+#  MACROS 
+################################################################################
+FUNCTION (LOOKUP_PATH name items prefix result)
+
+    SET (TMP "/notfound" )
+
+    FOREACH (path ${items})
+        IF (EXISTS "${prefix}/${path}")
+            SET (TMP "${prefix}/${path}" )
+        ENDIF()
+    ENDFOREACH(path)
+
+    GET_FILENAME_COMPONENT (TMP "${TMP}" REALPATH) 
+
+    IF (NOT EXISTS ${TMP})
+        MESSAGE (FATAL_ERROR  "-- UNABLE TO FIND A DIRECTORY FOR ${name}...")
+    ELSE()
+        MESSAGE ("-- ${name} is here '${TMP}'")
+    ENDIF()
+    
+    SET (${result} ${TMP} PARENT_SCOPE)
+    
+ENDFUNCTION()
+
+################################################################################
+# GATB-CORE MANAGEMENT
+################################################################################
+
+# we don't want to install all GATB-CORE items
+SET (GATB_CORE_INSTALL_EXCLUDE "1")
+
+# We look for the gatb-core directory
+# We look for the gatb-core directory
+# WARNING: GATB-core has to be in one of the following HARDCODED locations in your project!!
+LOOKUP_PATH ("gatb-core" "gatb-core/gatb-core;../thirdparty/gatb-core;../../thirdparty/gatb-core/gatb-core;thirdparty/gatb-core;thirdparty/gatb-core/gatb-core" ${PROJECT_SOURCE_DIR} GATB_CORE_PATH)
+
+# we depend on gatb-core; here, we define where to find all the required material
+add_subdirectory (${GATB_CORE_PATH}  "${CMAKE_CURRENT_BINARY_DIR}/ext/gatb-core")
+
+# We copy the source of gatb-core to the third party directory and the cmake directory
+SET (CPACK_SOURCE_INSTALLED_DIRECTORIES 
+    "${CMAKE_CURRENT_SOURCE_DIR}"   "."
+    "${GATB_CORE_PATH}"             "thirdparty/gatb-core"
+    "${CMAKE_MODULE_PATH}"          "cmake"
+)
+
+# For the source archive, we exclude some unwanted directories.
+SET (CPACK_SOURCE_IGNORE_FILES  ${CPACK_SOURCE_IGNORE_FILES}  
+    "gatb-core/doc"  "gatb-core/examples" "gatb-core/test" "gatb-core/scripts"
+)
+
+# We set the cmake helpers directory
+set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${gatb-core-cmake})
+
diff --git a/gatb-core/cmake/UseLATEX.cmake b/gatb-core/cmake/UseLATEX.cmake
new file mode 100644
index 0000000..709b0e0
--- /dev/null
+++ b/gatb-core/cmake/UseLATEX.cmake
@@ -0,0 +1,734 @@
+# CMake utility to compile Latex documents with pdflatex 
+# Version: 1.0.1
+# Author: Baptiste Wicht <baptiste.wicht at gmail.com>
+
+# Original statement
+# Author: Kenneth Moreland <kmorel at sandia.gov>
+#
+# Copyright 2004 Sandia Corporation.
+# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
+# license for use of this work by or on behalf of the
+# U.S. Government. Redistribution and use in source and binary forms, with
+# or without modification, are permitted provided that this Notice and any
+# statement of authorship are reproduced on all copies.
+
+# The following function is defined:
+# ADD_LATEX_DOCUMENT(<tex_file>
+#                    [BIBFILES <bib_files>]
+#                    [INPUTS <input_tex_files>]
+#                    [IMAGE_DIRS] <image_directories>
+#                    [IMAGES] <image_files>
+#                    [CONFIGURE] <tex_files>
+#                    [DEPENDS] <tex_files>
+#                    [FILTER_OUTPUT]
+#                    [USE_INDEX] 
+#                    [USE_GLOSSARY])
+#
+# Adds targets that compile <tex_file>.The latex output is placed in LATEX_OUTPUT_PATH 
+# or CMAKE_CURRENT_BINARY_DIR if the former is not set.
+
+# Change log
+#
+# Version 1.0.1
+#
+# Add filter feature
+#
+# Version 1.0.0
+#
+# Clean up version of Kenneth Moreland
+
+#############################################################################
+# Find the location of myself while originally executing.  If you do this
+# inside of a macro, it will recode where the macro was invoked.
+#############################################################################
+SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE}
+    CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE
+    )
+
+#############################################################################
+# Generic helper functions
+#############################################################################
+
+FUNCTION(LATEX_LIST_CONTAINS var value)
+    SET(input_list ${ARGN})
+    LIST(FIND input_list "${value}" index)
+    IF (index GREATER -1)
+        SET(${var} TRUE PARENT_SCOPE)
+    ELSE (index GREATER -1)
+        SET(${var} PARENT_SCOPE)
+    ENDIF (index GREATER -1)
+ENDFUNCTION(LATEX_LIST_CONTAINS)
+
+# Parse function arguments.  Variables containing the results are placed
+# in the global scope for historical reasons.
+FUNCTION(LATEX_PARSE_ARGUMENTS prefix arg_names option_names)
+    SET(DEFAULT_ARGS)
+    FOREACH(arg_name ${arg_names})
+        SET(${prefix}_${arg_name} CACHE INTERNAL "${prefix} argument" FORCE)
+    ENDFOREACH(arg_name)
+    FOREACH(option ${option_names})
+        SET(${prefix}_${option} CACHE INTERNAL "${prefix} option" FORCE)
+    ENDFOREACH(option)
+
+    SET(current_arg_name DEFAULT_ARGS)
+    SET(current_arg_list)
+    FOREACH(arg ${ARGN})
+        LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names})
+        LATEX_LIST_CONTAINS(is_option ${arg} ${option_names})
+        IF (is_arg_name)
+            SET(${prefix}_${current_arg_name} ${current_arg_list}
+                CACHE INTERNAL "${prefix} argument" FORCE)
+            SET(current_arg_name ${arg})
+            SET(current_arg_list)
+        ELSEIF (is_option)
+            SET(${prefix}_${arg} TRUE CACHE INTERNAL "${prefix} option" FORCE)
+        ELSE (is_arg_name)
+            SET(current_arg_list ${current_arg_list} ${arg})
+        ENDIF (is_arg_name)
+    ENDFOREACH(arg)
+    SET(${prefix}_${current_arg_name} ${current_arg_list}
+        CACHE INTERNAL "${prefix} argument" FORCE)
+ENDFUNCTION(LATEX_PARSE_ARGUMENTS)
+
+# Match the contents of a file to a regular expression.
+FUNCTION(LATEX_FILE_MATCH variable filename regexp default)
+    # The FILE STRINGS command would be a bit better, but I'm not totally sure
+    # the match will always be to a whole line, and I don't want to break things.
+    FILE(READ ${filename} file_contents)
+    STRING(REGEX MATCHALL "${regexp}"
+        match_result ${file_contents}
+        )
+    IF (match_result)
+        SET(${variable} "${match_result}" PARENT_SCOPE)
+    ELSE (match_result)
+        SET(${variable} "${default}" PARENT_SCOPE)
+    ENDIF (match_result)
+ENDFUNCTION(LATEX_FILE_MATCH)
+
+# A version of GET_FILENAME_COMPONENT that treats extensions after the last
+# period rather than the first.  To the best of my knowledge, all filenames
+# typically used by LaTeX, including image files, have small extensions
+# after the last dot.
+FUNCTION(LATEX_GET_FILENAME_COMPONENT varname filename type)
+    SET(result)
+    IF ("${type}" STREQUAL "NAME_WE")
+        GET_FILENAME_COMPONENT(name ${filename} NAME)
+        STRING(REGEX REPLACE "\\.[^.]*\$" "" result "${name}")
+    ELSEIF ("${type}" STREQUAL "EXT")
+        GET_FILENAME_COMPONENT(name ${filename} NAME)
+        STRING(REGEX MATCH "\\.[^.]*\$" result "${name}")
+    ELSE ("${type}" STREQUAL "NAME_WE")
+        GET_FILENAME_COMPONENT(result ${filename} ${type})
+    ENDIF ("${type}" STREQUAL "NAME_WE")
+    SET(${varname} "${result}" PARENT_SCOPE)
+ENDFUNCTION(LATEX_GET_FILENAME_COMPONENT)
+
+#############################################################################
+# Functions that perform processing during a LaTeX build.
+#############################################################################
+FUNCTION(LATEX_MAKEGLOSSARIES)
+    # This is really a bare bones port of the makeglossaries perl script into
+    # CMake scripting.
+    IF (NOT LATEX_TARGET)
+        MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+    ENDIF (NOT LATEX_TARGET)
+
+    SET(aux_file ${LATEX_TARGET}.aux)
+
+    IF (NOT EXISTS ${aux_file})
+        MESSAGE(SEND_ERROR "${aux_file} does not exist.  Run latex on your target file.")
+    ENDIF (NOT EXISTS ${aux_file})
+
+    LATEX_FILE_MATCH(newglossary_lines ${aux_file}
+        "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+        "@newglossary{main}{glg}{gls}{glo}"
+        )
+
+    LATEX_FILE_MATCH(istfile_line ${aux_file}
+        "@istfilename[ \t]*{([^}]*)}"
+        "@istfilename{${LATEX_TARGET}.ist}"
+        )
+    STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1"
+        istfile ${istfile_line}
+        )
+
+    IF (NOT MAKEINDEX_COMPILER)
+        MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
+    ENDIF (NOT MAKEINDEX_COMPILER)
+
+    FOREACH(newglossary ${newglossary_lines})
+        STRING(REGEX REPLACE
+            "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+            "\\1" glossary_name ${newglossary}
+            )
+        STRING(REGEX REPLACE
+            "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+            "${LATEX_TARGET}.\\2" glossary_log ${newglossary}
+            )
+        STRING(REGEX REPLACE
+            "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+            "${LATEX_TARGET}.\\3" glossary_out ${newglossary}
+            )
+        STRING(REGEX REPLACE
+            "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+            "${LATEX_TARGET}.\\4" glossary_in ${newglossary}
+            )
+
+        IF (LATEX_FILTER_OUTPUT)
+            EXECUTE_PROCESS(
+                COMMAND ${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
+                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                OUTPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/.tmp.log
+                ERROR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/.tmp.log
+                )
+            EXECUTE_PROCESS(
+                COMMAND awk -f ../index_filter.awk ${CMAKE_CURRENT_SOURCE_DIR}/.tmp.log
+                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                )
+        ELSE ()
+            EXECUTE_PROCESS(
+                COMMAND ${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
+                WORKING_DIRECTORY ${LATEX_OUTPUT}
+                )
+        ENDIF (LATEX_FILTER_OUTPUT)
+
+    ENDFOREACH(newglossary)
+ENDFUNCTION(LATEX_MAKEGLOSSARIES)
+
+#############################################################################
+# Helper functions for establishing LaTeX build.
+#############################################################################
+
+FUNCTION(LATEX_NEEDIT VAR NAME)
+    IF (NOT ${VAR})
+        MESSAGE(SEND_ERROR "I need the ${NAME} command.")
+    ENDIF(NOT ${VAR})
+ENDFUNCTION(LATEX_NEEDIT)
+
+FUNCTION(LATEX_SETUP_VARIABLES)
+    SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}"
+        CACHE PATH "If non empty, specifies the location to place LaTeX output."
+        )
+
+    FIND_PACKAGE(LATEX)
+    FIND_PACKAGE(UnixCommands)
+
+    MARK_AS_ADVANCED(CLEAR
+        LATEX_COMPILER
+        PDFLATEX_COMPILER
+        BIBTEX_COMPILER
+        MAKEINDEX_COMPILER
+        )
+
+    LATEX_NEEDIT(PDFLATEX_COMPILER pdflatex)
+    LATEX_NEEDIT(BIBTEX_COMPILER bibtex)
+    LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex)
+
+    SET(LATEX_COMPILER_FLAGS "-interaction=errorstopmode"
+        CACHE STRING "Flags passed to latex.")
+    SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS}
+        CACHE STRING "Flags passed to pdflatex.")
+    SET(BIBTEX_COMPILER_FLAGS ""
+        CACHE STRING "Flags passed to bibtex.")
+    SET(MAKEINDEX_COMPILER_FLAGS ""
+        CACHE STRING "Flags passed to makeindex.")
+    SET(MAKEGLOSSARIES_COMPILER_FLAGS ""
+        CACHE STRING "Flags passed to makeglossaries.")
+    MARK_AS_ADVANCED(
+        LATEX_COMPILER_FLAGS
+        PDFLATEX_COMPILER_FLAGS
+        BIBTEX_COMPILER_FLAGS
+        MAKEINDEX_COMPILER_FLAGS
+        MAKEGLOSSARIES_COMPILER_FLAGS
+        )
+    SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS)
+    SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS)
+    SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS)
+    SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS)
+    SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS)
+
+    FIND_PROGRAM(IMAGEMAGICK_CONVERT convert
+        DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)."
+        )
+
+    IF (NOT IMAGEMAGICK_CONVERT)
+        MESSAGE(SEND_ERROR "Could not find convert program.  Please download ImageMagick from http://www.imagemagick.org and install.")
+    ENDIF (NOT IMAGEMAGICK_CONVERT)
+    
+    FIND_PROGRAM(CAIRO_CONVERT cairosvg
+        DOC "Cairo SVG Converter"
+        )
+
+    SET(LATEX_RASTER_SCALE 100)
+    SET(LATEX_OPPOSITE_RASTER_SCALE 16)
+
+    SET(LATEX_SVG_IMAGE_EXTENSIONS .svg CACHE INTERNAL "")
+    SET(LATEX_EPS_IMAGE_EXTENSIONS .eps CACHE INTERNAL "")
+    SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf CACHE INTERNAL "")
+    SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg CACHE INTERNAL "")
+    SET(LATEX_PDF_IMAGE_EXTENSIONS ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS} CACHE INTERNAL "")
+    SET(LATEX_IMAGE_EXTENSIONS ${LATEX_PDF_IMAGE_EXTENSIONS} ${LATEX_EPS_IMAGE_EXTENSIONS} ${LATEX_SVG_IMAGE_EXTENSIONS} CACHE INTERNAL "")
+ENDFUNCTION(LATEX_SETUP_VARIABLES)
+
+FUNCTION(LATEX_GET_OUTPUT_PATH var)
+    SET(latex_output_path)
+    IF (LATEX_OUTPUT_PATH)
+        IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+            MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.")
+        ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+            SET(latex_output_path "${LATEX_OUTPUT_PATH}")
+        ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+    ELSE (LATEX_OUTPUT_PATH)
+        IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+            MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.")
+        ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+            SET(latex_output_path "${CMAKE_CURRENT_BINARY_DIR}")
+        ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+    ENDIF (LATEX_OUTPUT_PATH)
+    SET(${var} ${latex_output_path} PARENT_SCOPE)
+ENDFUNCTION(LATEX_GET_OUTPUT_PATH)
+
+FUNCTION(LATEX_ADD_CONVERT_COMMAND
+        output_path
+        input_path
+        output_extension
+        input_extension
+        flags
+        )
+
+    IF (${input_extension} STREQUAL ".svg" AND ${output_extension} STREQUAL ".pdf")
+        ADD_CUSTOM_COMMAND(OUTPUT ${output_path}
+            COMMAND ${CAIRO_CONVERT}
+            ARGS ${input_path} "-o" ${output_path}
+            DEPENDS ${input_path}
+            )
+    ELSE ()
+        SET (converter ${IMAGEMAGICK_CONVERT})
+        SET (convert_flags "")
+
+        IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+            # ImageMagick has broken eps to pdf conversion, use ps2pdf instead
+            IF (PS2PDF_CONVERTER)
+                SET (converter ${PS2PDF_CONVERTER})
+                SET (convert_flags -dEPSCrop ${PS2PDF_CONVERTER_FLAGS})
+            ELSE (PS2PDF_CONVERTER)
+                MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.")
+            ENDIF (PS2PDF_CONVERTER)
+        ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+            SET (convert_flags ${flags})
+        ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+
+        ADD_CUSTOM_COMMAND(OUTPUT ${output_path}
+            COMMAND ${converter}
+            ARGS ${convert_flags} ${input_path} ${output_path}
+            DEPENDS ${input_path}
+            )
+    ENDIF()
+ENDFUNCTION(LATEX_ADD_CONVERT_COMMAND)
+
+# Makes custom commands to convert a file to a particular type.
+FUNCTION(LATEX_CONVERT_IMAGE
+        output_files_var
+        input_file
+        output_extension
+        convert_flags
+        output_extensions
+        other_files
+        )
+    
+    SET(output_file_list)
+    SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR})
+    
+    LATEX_GET_OUTPUT_PATH(output_dir)
+    LATEX_GET_FILENAME_COMPONENT(extension "${input_file}" EXT)
+
+    # Check input filename for potential problems with LaTeX.
+    LATEX_GET_FILENAME_COMPONENT(name "${input_file}" NAME_WE)
+    IF (name MATCHES ".*\\..*")
+        STRING(REPLACE "." "-" suggested_name "${name}")
+        SET(suggested_name "${suggested_name}${extension}")
+        MESSAGE(WARNING "Some LaTeX distributions have problems with image file names with multiple extensions.  Consider changing ${name}${extension} to something like ${suggested_name}.")
+    ENDIF (name MATCHES ".*\\..*")
+
+    STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file "${input_file}")
+
+    LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions})
+    
+    IF (is_type)
+        ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file}
+            COMMAND ${CMAKE_COMMAND}
+            ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file}
+            DEPENDS ${input_dir}/${input_file}
+            )
+        SET(output_file_list ${output_file_list} ${output_dir}/${input_file})
+    ELSE (is_type)
+        LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file}
+            ${input_dir}/${input_file} ${output_extension} ${extension}
+            "${convert_flags}")
+        SET(output_file_list ${output_file_list} ${output_dir}/${output_file})
+    ENDIF (is_type)
+
+    SET(${output_files_var} ${output_file_list} PARENT_SCOPE)
+ENDFUNCTION(LATEX_CONVERT_IMAGE)
+
+# Adds custom commands to process the given files for pdf builds.
+# Adds the output files to the given variables (does not replace).
+FUNCTION(LATEX_PROCESS_IMAGES pdf_outputs_var)
+    LATEX_GET_OUTPUT_PATH(output_dir)
+    SET(pdf_outputs)
+    FOREACH(file ${ARGN})
+        IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+            LATEX_GET_FILENAME_COMPONENT(extension "${file}" EXT)
+            SET(convert_flags)
+
+            LATEX_LIST_CONTAINS(is_raster "${extension}" ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS})
+            LATEX_LIST_CONTAINS(is_svg "${extension}" ${LATEX_SVG_IMAGE_EXTENSIONS})
+
+            # Make sure the output directory exists.
+            LATEX_GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH)
+            MAKE_DIRECTORY("${path}")
+
+            # Do conversions for PDF and SVG
+            IF (is_raster)
+                LATEX_CONVERT_IMAGE(output_files "${file}" .png "${convert_flags}"
+                    "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
+                SET(pdf_outputs ${pdf_outputs} ${output_files})
+            ELSEIF (is_svg)
+                LATEX_CONVERT_IMAGE(output_files "${file}" .pdf "${convert_flags}"
+                    "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
+                SET(pdf_outputs ${pdf_outputs} ${output_files})
+            ELSE ()
+                LATEX_CONVERT_IMAGE(output_files "${file}" .pdf "${convert_flags}"
+                    "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
+                SET(pdf_outputs ${pdf_outputs} ${output_files})
+            ENDIF ()
+        ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+            MESSAGE(WARNING "Could not find file ${CMAKE_CURRENT_SOURCE_DIR}/${file}.  Are you sure you gave relative paths to IMAGES?")
+        ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+    ENDFOREACH(file)
+
+    SET(${pdf_outputs_var} ${pdf_outputs} PARENT_SCOPE)
+ENDFUNCTION(LATEX_PROCESS_IMAGES)
+
+FUNCTION(LATEX_COPY_GLOBBED_FILES pattern dest)
+    FILE(GLOB file_list ${pattern})
+    FOREACH(in_file ${file_list})
+        LATEX_GET_FILENAME_COMPONENT(out_file ${in_file} NAME)
+        CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY)
+    ENDFOREACH(in_file)
+ENDFUNCTION(LATEX_COPY_GLOBBED_FILES)
+
+FUNCTION(LATEX_COPY_INPUT_FILE file)
+    LATEX_GET_OUTPUT_PATH(output_dir)
+
+    IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+        LATEX_GET_FILENAME_COMPONENT(path ${file} PATH)
+        FILE(MAKE_DIRECTORY ${output_dir}/${path})
+
+        LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE})
+        IF (use_config)
+            CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}
+                ${output_dir}/${file}
+                @ONLY
+                )
+            ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
+                COMMAND ${CMAKE_COMMAND}
+                ARGS ${CMAKE_BINARY_DIR}
+                DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
+                )
+        ELSE (use_config)
+            ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
+                COMMAND ${CMAKE_COMMAND}
+                ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file}
+                DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
+                )
+        ENDIF (use_config)
+    ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+        IF (EXISTS ${output_dir}/${file})
+            # Special case: output exists but input does not.  Assume that it was
+            # created elsewhere and skip the input file copy.
+        ELSE (EXISTS ${output_dir}/${file})
+            MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+        ENDIF (EXISTS ${output_dir}/${file})
+    ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+ENDFUNCTION(LATEX_COPY_INPUT_FILE)
+
+#############################################################################
+# Commands provided by the UseLATEX.cmake "package"
+#############################################################################
+
+FUNCTION(LATEX_USAGE command message)
+    MESSAGE(SEND_ERROR
+        "${message}\nUsage: ${command}(<tex_file>\n           [BIBFILES <bib_file> <bib_file> ...]\n           [INPUTS <tex_file> <tex_file> ...]\n           [IMAGE_DIRS <directory1> <directory2> ...]\n           [IMAGES <image_file1> <image_file2>\n           [CONFIGURE <tex_file> <tex_file> ...]\n           [DEPENDS <tex_file> <tex_file> ...]\n           [USE_INDEX] [FILTER_OUTPUT] [USE_GLOSSARY])"
+        )
+ENDFUNCTION(LATEX_USAGE command message)
+
+# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the
+# variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and
+# LATEX_INPUTS.
+FUNCTION(PARSE_ADD_LATEX_ARGUMENTS command)
+    LATEX_PARSE_ARGUMENTS(
+        LATEX
+        "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS"
+        "USE_INDEX;FILTER_OUTPUT;USE_GLOSSARY;USE_GLOSSARIES"
+        ${ARGN}
+        )
+
+    # The first argument is the target latex file.
+    IF (LATEX_DEFAULT_ARGS)
+        LIST(GET LATEX_DEFAULT_ARGS 0 latex_main_input)
+        LIST(REMOVE_AT LATEX_DEFAULT_ARGS 0)
+        LATEX_GET_FILENAME_COMPONENT(latex_target ${latex_main_input} NAME_WE)
+        SET(LATEX_MAIN_INPUT ${latex_main_input} CACHE INTERNAL "" FORCE)
+        SET(LATEX_TARGET ${latex_target} CACHE INTERNAL "" FORCE)
+    ELSE (LATEX_DEFAULT_ARGS)
+        LATEX_USAGE(${command} "No tex file target given to ${command}.")
+    ENDIF (LATEX_DEFAULT_ARGS)
+
+    IF (LATEX_DEFAULT_ARGS)
+        LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}")
+    ENDIF (LATEX_DEFAULT_ARGS)
+
+    # Backward compatibility between 1.6.0 and 1.6.1.
+    IF (LATEX_USE_GLOSSARIES)
+        SET(LATEX_USE_GLOSSARY TRUE CACHE INTERNAL "" FORCE)
+    ENDIF (LATEX_USE_GLOSSARIES)
+ENDFUNCTION(PARSE_ADD_LATEX_ARGUMENTS)
+
+FUNCTION(ADD_LATEX_TARGETS_INTERNAL)
+    # The commands to run LaTeX.  They are repeated multiple times.
+    SET(pdflatex_draft_command ${PDFLATEX_COMPILER} -draftmode -shell-escape ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+    SET(pdflatex_build_command ${PDFLATEX_COMPILER} -shell-escape ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+
+    # The command to create the index
+    SET(makeindex_command ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
+
+    # The command to create the bibliography
+    SET(bibtex_command ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET})
+
+    IF (LATEX_FILTER_OUTPUT)                                       
+        SET(pdflatex_draft_command ${pdflatex_draft_command} | awk -f reverse.awk | awk -f compose.awk | awk -f reverse.awk | sed \"s/\\\\[.\\+\\\\]//\" | awk -f filter.awk)
+        SET(pdflatex_build_command ${pdflatex_build_command} | awk -f reverse.awk | awk -f compose.awk | awk -f reverse.awk | sed \"s/\\\\[.\\+\\\\]//\" | awk -f filter.awk)
+        
+        SET(makeindex_command ${makeindex_command} | awk -f index_filter.awk)
+        SET(bibtex_command ${bibtex_command} | awk -f bibtex_filter.awk)
+    ENDIF (LATEX_FILTER_OUTPUT)
+
+    # Set up target names.
+    SET(pdf_target      pdf)
+    SET(auxclean_target auxclean)
+
+    # Probably not all of these will be generated, but they could be.
+    # Note that the aux file is added later.
+    SET(auxiliary_clean_files
+        ${output_dir}/${LATEX_TARGET}.bbl
+        ${output_dir}/${LATEX_TARGET}.blg
+        ${output_dir}/${LATEX_TARGET}-blx.bib
+        ${output_dir}/${LATEX_TARGET}.glg
+        ${output_dir}/${LATEX_TARGET}.glo
+        ${output_dir}/${LATEX_TARGET}.gls
+        ${output_dir}/${LATEX_TARGET}.idx
+        ${output_dir}/${LATEX_TARGET}.ilg
+        ${output_dir}/${LATEX_TARGET}.ind
+        ${output_dir}/${LATEX_TARGET}.ist
+        ${output_dir}/${LATEX_TARGET}.log
+        ${output_dir}/${LATEX_TARGET}.lol
+        ${output_dir}/${LATEX_TARGET}.tdo
+        ${output_dir}/${LATEX_TARGET}.out
+        ${output_dir}/${LATEX_TARGET}.toc
+        ${output_dir}/${LATEX_TARGET}.lof
+        ${output_dir}/${LATEX_TARGET}.xdy
+        ${output_dir}/${LATEX_TARGET}.dvi
+        ${output_dir}/${LATEX_TARGET}.ps
+        ${output_dir}/${LATEX_TARGET}.pdf
+        )
+
+    SET(image_list ${LATEX_IMAGES})
+
+    # For each directory in LATEX_IMAGE_DIRS, glob all the image files and
+    # place them in LATEX_IMAGES.
+    FOREACH(dir ${LATEX_IMAGE_DIRS})
+        IF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
+            MESSAGE(WARNING "Image directory ${CMAKE_CURRENT_SOURCE_DIR}/${dir} does not exist.  Are you sure you gave relative directories to IMAGE_DIRS?")
+        ENDIF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
+        
+        FOREACH(extension ${LATEX_IMAGE_EXTENSIONS})
+            FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension})
+            FOREACH(file ${files})
+                LATEX_GET_FILENAME_COMPONENT(filename ${file} NAME)
+                SET(image_list ${image_list} ${dir}/${filename})
+            ENDFOREACH(file)
+        ENDFOREACH(extension)
+    ENDFOREACH(dir)
+
+    LATEX_PROCESS_IMAGES(pdf_images ${image_list})
+
+    SET(make_pdf_command 
+        ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_draft_command}
+        )
+
+    SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images})
+    FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS})
+        SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input})
+        IF (${input} MATCHES "\\.tex$")
+            STRING(REGEX REPLACE "\\.tex$" "" input_we ${input})
+            SET(auxiliary_clean_files ${auxiliary_clean_files}
+                ${output_dir}/${input_we}.aux
+                ${output_dir}/${input}.aux
+                )
+        ENDIF (${input} MATCHES "\\.tex$")
+    ENDFOREACH(input)
+
+    IF (LATEX_USE_GLOSSARY)
+        FOREACH(dummy 0 1)   # Repeat these commands twice.
+            SET(make_pdf_command ${make_pdf_command}
+                COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+                ${CMAKE_COMMAND}
+                -D LATEX_BUILD_COMMAND=makeglossaries
+                -D LATEX_TARGET=${LATEX_TARGET}
+                -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+                -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
+                -D LATEX_OUTPUT=${output_dir}
+                -D LATEX_FILTER_OUTPUT=${LATEX_FILTER_OUTPUT}
+                -P ${LATEX_USE_LATEX_LOCATION}
+                COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+                ${pdflatex_draft_command}
+                )
+        ENDFOREACH(dummy)
+    ENDIF (LATEX_USE_GLOSSARY)
+
+    IF (LATEX_BIBFILES)
+        SET(make_pdf_command ${make_pdf_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${bibtex_command}
+            )
+
+        FOREACH (bibfile ${LATEX_BIBFILES})
+            SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile})
+        ENDFOREACH (bibfile ${LATEX_BIBFILES})
+    ENDIF (LATEX_BIBFILES)
+
+    IF (LATEX_USE_INDEX)
+        SET(make_pdf_command ${make_pdf_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${pdflatex_draft_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${makeindex_command} 
+            )
+    ENDIF (LATEX_USE_INDEX)
+
+    # In fast mode, only do one pass
+    SET(make_pdf_fast_command ${make_pdf_fast_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_build_command})
+    
+    # Do two pass at the end
+    SET(make_pdf_command ${make_pdf_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_draft_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_build_command})
+
+    # If all features are enabled, create faster version
+    IF (LATEX_USE_INDEX AND LATEX_BIBFILES AND LATEX_USE_GLOSSARY)
+        SET(make_pdf_command
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${pdflatex_draft_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${bibtex_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${pdflatex_draft_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${makeindex_command} 
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${CMAKE_COMMAND}
+            -D LATEX_BUILD_COMMAND=makeglossaries
+            -D LATEX_TARGET=${LATEX_TARGET}
+            -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+            -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
+            -D LATEX_OUTPUT=${output_dir}
+            -D LATEX_FILTER_OUTPUT=${LATEX_FILTER_OUTPUT}
+            -P ${LATEX_USE_LATEX_LOCATION}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${pdflatex_draft_command}
+            COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+            ${pdflatex_build_command})
+    ENDIF (LATEX_USE_INDEX AND LATEX_BIBFILES AND LATEX_USE_GLOSSARY)
+
+    # Finally add the target to the makefile
+    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf
+        COMMAND ${make_pdf_command}
+        DEPENDS ${make_pdf_depends}
+        )
+    
+    ADD_CUSTOM_TARGET(${pdf_target} ALL
+        DEPENDS ${output_dir}/${LATEX_TARGET}.pdf)
+
+    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/fast_${LATEX_TARGET}.pdf
+        COMMAND ${make_pdf_fast_command}
+        DEPENDS ${make_pdf_depends}
+        )
+    ADD_CUSTOM_TARGET(fast
+        DEPENDS ${output_dir}/fast_${LATEX_TARGET}.pdf)
+
+    SET_DIRECTORY_PROPERTIES(.
+        ADDITIONAL_MAKE_CLEAN_FILES "${auxiliary_clean_files}"
+        )
+
+    ADD_CUSTOM_TARGET(${auxclean_target}
+        COMMENT "Cleaning auxiliary LaTeX files."
+        COMMAND ${CMAKE_COMMAND} -E remove ${auxiliary_clean_files}
+        )
+ENDFUNCTION(ADD_LATEX_TARGETS_INTERNAL)
+
+FUNCTION(ADD_LATEX_TARGETS)
+    LATEX_GET_OUTPUT_PATH(output_dir)
+    PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV})
+
+    ADD_LATEX_TARGETS_INTERNAL()
+ENDFUNCTION(ADD_LATEX_TARGETS)
+
+FUNCTION(ADD_LATEX_DOCUMENT)
+    LATEX_GET_OUTPUT_PATH(output_dir)
+    IF (output_dir)
+        PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV})
+
+        LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT})
+
+        FOREACH (bib_file ${LATEX_BIBFILES})
+            LATEX_COPY_INPUT_FILE(${bib_file})
+        ENDFOREACH (bib_file)
+
+        FOREACH (input ${LATEX_INPUTS})
+            LATEX_COPY_INPUT_FILE(${input})
+        ENDFOREACH(input)
+
+        LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir})
+        LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir})
+        LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir})
+        LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir})
+        LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.ist ${output_dir})
+
+        ADD_LATEX_TARGETS_INTERNAL()
+    ENDIF (output_dir)
+ENDFUNCTION(ADD_LATEX_DOCUMENT)
+
+#############################################################################
+# Actually do stuff
+#############################################################################
+
+IF (LATEX_BUILD_COMMAND)
+    SET(command_handled)
+
+    IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
+        LATEX_MAKEGLOSSARIES()
+        SET(command_handled TRUE)
+    ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
+
+    IF (NOT command_handled)
+        MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}")
+    ENDIF (NOT command_handled)
+
+ELSE (LATEX_BUILD_COMMAND)
+    # Must be part of the actual configure (included from CMakeLists.txt).
+    LATEX_SETUP_VARIABLES()
+ENDIF (LATEX_BUILD_COMMAND)
diff --git a/gatb-core/doc/CMakeLists.txt b/gatb-core/doc/CMakeLists.txt
new file mode 100644
index 0000000..0ec67a3
--- /dev/null
+++ b/gatb-core/doc/CMakeLists.txt
@@ -0,0 +1,28 @@
+
+find_package (Doxygen)
+
+# see http://www.cmake.org/pipermail/cmake/2008-May/021426.html
+
+if (DOXYGEN_FOUND)
+
+    CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/doxygen/gatb.doxyfile  ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile  @ONLY)
+    
+    ADD_CUSTOM_TARGET (doc 
+      ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+    )
+    ADD_CUSTOM_TARGET (deploy-doc 
+      COMMAND tar -zcf ${CMAKE_BINARY_DIR}/doc/doc.tgz -C ${CMAKE_BINARY_DIR}/doc/html .
+      COMMAND scp ${CMAKE_BINARY_DIR}/doc/doc.tgz ${gatb-doc-user-login}@scm.gforge.inria.fr:/home/groups/gatb-core/
+      COMMAND ssh ${gatb-doc-user-login}@scm.gforge.inria.fr "rm -rf /home/groups/gatb-core/htdocs/doc/api/*"
+      COMMAND ssh ${gatb-doc-user-login}@scm.gforge.inria.fr "tar -xf /home/groups/gatb-core/doc.tgz --no-overwrite-dir -C /home/groups/gatb-core/htdocs/doc/api"
+    )
+    
+    INSTALL (CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} doc)")
+    
+    INSTALL (DIRECTORY ${CMAKE_BINARY_DIR}/doc/html DESTINATION doc)
+    
+endif (DOXYGEN_FOUND)
+
+
+# HERE IS A COMMAND LINE TO COPY THE HTML DOCUMENTATION TO THE GFORGE SERVER  (from the build directory)
+#    
\ No newline at end of file
diff --git a/gatb-core/doc/book/.gitignore b/gatb-core/doc/book/.gitignore
new file mode 100644
index 0000000..b5290d3
--- /dev/null
+++ b/gatb-core/doc/book/.gitignore
@@ -0,0 +1,3 @@
+/main.aux
+/main.log
+/main.pdf
diff --git a/gatb-core/doc/book/main.tex b/gatb-core/doc/book/main.tex
new file mode 100644
index 0000000..116c06a
--- /dev/null
+++ b/gatb-core/doc/book/main.tex
@@ -0,0 +1,45 @@
+\documentclass{book}
+
+%%% Begin ...
+\begin{document}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\title{The GATB's Book}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{History}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Architecture}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Rationale}
+\section{Design}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Library}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{GATB Tools}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Snippets}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Packaging / Delivery}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{GATB HDF5 format}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\end{document}
\ No newline at end of file
diff --git a/gatb-core/doc/design/modelio/GATB/.config/auditconfiguration.xml b/gatb-core/doc/design/modelio/GATB/.config/auditconfiguration.xml
new file mode 100644
index 0000000..5510eb3
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/auditconfiguration.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Configuration><RuleGroup category="Activity"><Rule ruleId="R1010" severity="error" status="enabled"><Driver class="com.modeliosoft.modelio.audit.rules.R1010"/></Rule><Rule ruleId="R1020" severity="error" status="enabled"><Driver class="com.modeliosoft.modelio.audit.rules.R1020"/></Rule><Rule ruleId="R1030" severity="error" status="enabled"><Driver class="com.modeliosoft.modelio.audit.rules.R1030"/></Rule><Rule ruleId="R1040" severit [...]
\ No newline at end of file
diff --git a/gatb-core/doc/design/modelio/GATB/.config/project.prefs b/gatb-core/doc/design/modelio/GATB/.config/project.prefs
new file mode 100644
index 0000000..f326f3c
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/project.prefs
@@ -0,0 +1,4 @@
+#
+#Mon Apr 22 15:28:16 CEST 2013
+Modelio.Project.Description=
+Modelio.Project.Author=edrezen
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/default.style b/gatb-core/doc/design/modelio/GATB/.config/styles/default.style
new file mode 100644
index 0000000..97f8f91
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/default.style
@@ -0,0 +1 @@
+stylename=default
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/extern.style b/gatb-core/doc/design/modelio/GATB/.config/styles/extern.style
new file mode 100644
index 0000000..35b62c5
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/extern.style
@@ -0,0 +1,76 @@
+#
+#Mon Apr 22 15:28:18 CEST 2013
+INTERFACE_FILLMODE=GRADIENT
+PACKAGE_FILLMODE=GRADIENT
+DATATYPE_FONT=Arial, 9, 0
+NODE_LINECOLOR=150 150 150
+ENUM_FILLCOLOR=255 191 191
+ACTOR_FONT=Arial, 9, 0
+PACKAGE_REPMODE=SIMPLE
+INTERFACE_TEXTCOLOR=64 64 64
+ARTIFACT_TEXTCOLOR=64 64 64
+ARTIFACT_REPMODE=SIMPLE
+PACKAGE_FONT=Arial, 9, 0
+SIGNAL_FILLMODE=GRADIENT
+INTERFACE_REPRES_MODE=SIMPLE
+ENUM_FILLMODE=GRADIENT
+SIGNAL_LINECOLOR=150 150 150
+INTERFACE_FILLCOLOR=255 191 191
+COLLABORATION_LINECOLOR=150 150 150
+ARTIFACT_FILLCOLOR=255 191 191
+DATATYPE_REPRES_MODE=SIMPLE
+COLLABORATION_FONT=Arial, 9, 0
+USECASE_TEXTCOLOR=64 64 64
+INTERFACE_FONT=Arial, 9, 0
+CLASS_TEXTCOLOR=64 64 64
+PACKAGE_LINECOLOR=150 150 150
+COMPONENT_TEXTCOLOR=64 64 64
+ENUM_LINECOLOR=150 150 150
+NODE_TEXTCOLOR=64 64 64
+ENUM_REPRES_MODE=SIMPLE
+ACTOR_TEXTCOLOR=64 64 64
+NODE_FILLMODE=GRADIENT
+NODE_FONT=Arial, 9, 0
+DATATYPE_LINECOLOR=150 150 150
+ARTIFACT_FILLMODE=GRADIENT
+USECASE_FILLMODE=GRADIENT
+USECASE_FILLCOLOR=255 191 191
+CLASS_FILLCOLOR=255 191 191
+COMPONENT_FILLCOLOR=255 191 191
+NODE_FILLCOLOR=255 191 191
+ACTOR_FILLCOLOR=255 191 191
+ACTOR_FILLMODE=GRADIENT
+SIGNAL_FONT=Arial, 9, 0
+NODE_REPMODE=SIMPLE
+CLASS_FILLMODE=GRADIENT
+USECASE_FONT=Arial, 9, 0
+PACKAGE_TEXTCOLOR=64 64 64
+USECASE_REPMODE=SIMPLE
+INTERFACE_LINECOLOR=150 150 150
+SIGNAL_TEXTCOLOR=64 64 64
+ARTIFACT_LINECOLOR=150 150 150
+COLLABORATION_TEXTCOLOR=64 64 64
+DATATYPE_TEXTCOLOR=64 64 64
+COMPONENT_FILLMODE=GRADIENT
+SIGNAL_REPMODE=SIMPLE
+CLASS_FONT=Arial, 9, 0
+ACTOR_REPMODE=SIMPLE
+ENUM_TEXTCOLOR=64 64 64
+USECASE_LINECOLOR=150 150 150
+CLASS_LINECOLOR=150 150 150
+basestyle=default
+COMPONENT_LINECOLOR=150 150 150
+stylename=extern
+PACKAGE_FILLCOLOR=255 191 191
+COMPONENT_FONT=Arial, 9, 0
+ACTOR_LINECOLOR=150 150 150
+ENUM_FONT=Arial, 9, 0
+DATATYPE_FILLMODE=GRADIENT
+ARTIFACT_FONT=Arial, 9, 0
+CLASS_REPRES_MODE=SIMPLE
+SIGNAL_FILLCOLOR=255 191 191
+COLLABORATION_REPMODE=SIMPLE
+COLLABORATION_FILLCOLOR=255 191 191
+DATATYPE_FILLCOLOR=255 191 191
+COMPONENT_REPRES_MODE=SIMPLE
+COLLABORATION_FILLMODE=GRADIENT
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/intern.style b/gatb-core/doc/design/modelio/GATB/.config/styles/intern.style
new file mode 100644
index 0000000..6576de4
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/intern.style
@@ -0,0 +1,76 @@
+#
+#Mon Apr 22 15:28:18 CEST 2013
+INTERFACE_FILLMODE=GRADIENT
+PACKAGE_FILLMODE=GRADIENT
+DATATYPE_FONT=Arial, 9, 0
+NODE_LINECOLOR=150 150 150
+ENUM_FILLCOLOR=191 191 255
+ACTOR_FONT=Arial, 9, 0
+PACKAGE_REPMODE=SIMPLE
+INTERFACE_TEXTCOLOR=64 64 64
+ARTIFACT_TEXTCOLOR=64 64 64
+ARTIFACT_REPMODE=SIMPLE
+PACKAGE_FONT=Arial, 9, 0
+SIGNAL_FILLMODE=GRADIENT
+INTERFACE_REPRES_MODE=SIMPLE
+ENUM_FILLMODE=GRADIENT
+SIGNAL_LINECOLOR=150 150 150
+INTERFACE_FILLCOLOR=191 191 255
+COLLABORATION_LINECOLOR=150 150 150
+ARTIFACT_FILLCOLOR=191 191 255
+DATATYPE_REPRES_MODE=SIMPLE
+COLLABORATION_FONT=Arial, 9, 0
+USECASE_TEXTCOLOR=64 64 64
+INTERFACE_FONT=Arial, 9, 0
+CLASS_TEXTCOLOR=64 64 64
+PACKAGE_LINECOLOR=150 150 150
+COMPONENT_TEXTCOLOR=64 64 64
+ENUM_LINECOLOR=150 150 150
+NODE_TEXTCOLOR=64 64 64
+ENUM_REPRES_MODE=SIMPLE
+ACTOR_TEXTCOLOR=64 64 64
+NODE_FILLMODE=GRADIENT
+NODE_FONT=Arial, 9, 0
+DATATYPE_LINECOLOR=150 150 150
+ARTIFACT_FILLMODE=GRADIENT
+USECASE_FILLMODE=GRADIENT
+USECASE_FILLCOLOR=191 191 255
+CLASS_FILLCOLOR=191 191 255
+COMPONENT_FILLCOLOR=191 191 255
+NODE_FILLCOLOR=191 191 255
+ACTOR_FILLCOLOR=191 191 255
+ACTOR_FILLMODE=GRADIENT
+SIGNAL_FONT=Arial, 9, 0
+NODE_REPMODE=SIMPLE
+CLASS_FILLMODE=GRADIENT
+USECASE_FONT=Arial, 9, 0
+PACKAGE_TEXTCOLOR=64 64 64
+USECASE_REPMODE=SIMPLE
+INTERFACE_LINECOLOR=150 150 150
+SIGNAL_TEXTCOLOR=64 64 64
+ARTIFACT_LINECOLOR=150 150 150
+COLLABORATION_TEXTCOLOR=64 64 64
+DATATYPE_TEXTCOLOR=64 64 64
+COMPONENT_FILLMODE=GRADIENT
+SIGNAL_REPMODE=SIMPLE
+CLASS_FONT=Arial, 9, 0
+ACTOR_REPMODE=SIMPLE
+ENUM_TEXTCOLOR=64 64 64
+USECASE_LINECOLOR=150 150 150
+CLASS_LINECOLOR=150 150 150
+basestyle=default
+COMPONENT_LINECOLOR=150 150 150
+stylename=intern
+PACKAGE_FILLCOLOR=191 191 255
+COMPONENT_FONT=Arial, 9, 0
+ACTOR_LINECOLOR=150 150 150
+ENUM_FONT=Arial, 9, 0
+DATATYPE_FILLMODE=GRADIENT
+ARTIFACT_FONT=Arial, 9, 0
+CLASS_REPRES_MODE=SIMPLE
+SIGNAL_FILLCOLOR=191 191 255
+COLLABORATION_REPMODE=SIMPLE
+COLLABORATION_FILLCOLOR=191 191 255
+DATATYPE_FILLCOLOR=191 191 255
+COMPONENT_REPRES_MODE=SIMPLE
+COLLABORATION_FILLMODE=GRADIENT
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/main.style b/gatb-core/doc/design/modelio/GATB/.config/styles/main.style
new file mode 100644
index 0000000..6120c44
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/main.style
@@ -0,0 +1,84 @@
+#
+#Mon Apr 22 15:28:18 CEST 2013
+INTERFACE_FILLMODE=GRADIENT
+PACKAGE_FILLMODE=GRADIENT
+NODE_LINECOLOR=0 0 128
+ACTOR_FEATURES=MANUAL
+ENUM_FILLCOLOR=206 206 255
+CLASS_FEATURES=MANUAL
+PACKAGE_REPMODE=STRUCTURED
+INTERFACE_TEXTCOLOR=0 0 128
+ARTIFACT_TEXTCOLOR=0 0 128
+CLASS_INNERVIEWMODE=DIAGRAM
+ARTIFACT_REPMODE=STRUCTURED
+COMPONENT_FEATURES=MANUAL
+SIGNAL_FILLMODE=GRADIENT
+INTERFACE_REPRES_MODE=STRUCTURED
+ENUM_FILLMODE=GRADIENT
+SIGNAL_LINECOLOR=0 0 128
+INTERFACE_FILLCOLOR=206 206 255
+COLLABORATION_LINECOLOR=0 0 128
+USECASE_INNERVIEWMODE=DIAGRAM
+ARTIFACT_FILLCOLOR=206 206 255
+DATATYPE_REPRES_MODE=STRUCTURED
+DATATYPE_FEATURES=MANUAL
+CLASS_TEXTCOLOR=0 0 128
+USECASE_TEXTCOLOR=0 0 128
+PACKAGE_LINECOLOR=0 0 128
+SIGNAL_INNERVIEWMODE=DIAGRAM
+COMPONENT_TEXTCOLOR=0 0 128
+ENUM_LINECOLOR=0 0 128
+NODE_TEXTCOLOR=0 0 128
+INTERFACE_INNERVIEWMODE=DIAGRAM
+ENUM_REPRES_MODE=STRUCTURED
+ACTOR_TEXTCOLOR=0 0 128
+COLLABORATION_FEATURES=MANUAL
+NODE_FILLMODE=GRADIENT
+INTERFACE_FEATURES=MANUAL
+ARTIFACT_INNERVIEWMODE=DIAGRAM
+DATATYPE_LINECOLOR=0 0 128
+ARTIFACT_FILLMODE=GRADIENT
+USECASE_FILLMODE=GRADIENT
+PACKAGE_CONTENTS=MANUAL
+USECASE_FILLCOLOR=206 206 255
+CLASS_FILLCOLOR=206 206 255
+USECASE_EXTENSIONPOINT_GROUPVISIBLE=true
+COMPONENT_FILLCOLOR=206 206 255
+NODE_FILLCOLOR=206 206 255
+ACTOR_FILLCOLOR=206 206 255
+SIGNAL_FEATURES=MANUAL
+ACTOR_FILLMODE=GRADIENT
+NODE_REPMODE=STRUCTURED
+CLASS_FILLMODE=GRADIENT
+NODE_FEATURES=MANUAL
+PACKAGE_TEXTCOLOR=0 0 128
+ARTIFACT_FEATURES=MANUAL
+USECASE_FEATURES=MANUAL
+INTERFACE_LINECOLOR=0 0 128
+USECASE_REPMODE=STRUCTURED
+SIGNAL_TEXTCOLOR=0 0 128
+ARTIFACT_LINECOLOR=0 0 128
+COLLABORATION_TEXTCOLOR=0 0 128
+DATATYPE_TEXTCOLOR=0 0 128
+COMPONENT_FILLMODE=GRADIENT
+SIGNAL_REPMODE=STRUCTURED
+ENUM_FEATURES_FILTER=MANUAL
+ACTOR_REPMODE=STRUCTURED
+ENUM_TEXTCOLOR=0 0 128
+USECASE_LINECOLOR=0 0 128
+CLASS_LINECOLOR=0 0 128
+NODE_INNERVIEWMODE=DIAGRAM
+basestyle=default
+COMPONENT_LINECOLOR=0 0 128
+stylename=main
+PACKAGE_FILLCOLOR=206 206 255
+ACTOR_LINECOLOR=0 0 128
+DATATYPE_FILLMODE=GRADIENT
+COMPONENT_INNERVIEWMODE=DIAGRAM
+CLASS_REPRES_MODE=STRUCTURED
+SIGNAL_FILLCOLOR=206 206 255
+COLLABORATION_REPMODE=STRUCTURED
+COLLABORATION_FILLCOLOR=206 206 255
+DATATYPE_FILLCOLOR=206 206 255
+COMPONENT_REPRES_MODE=STRUCTURED
+COLLABORATION_FILLMODE=GRADIENT
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/ramc.style b/gatb-core/doc/design/modelio/GATB/.config/styles/ramc.style
new file mode 100644
index 0000000..13377a1
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/ramc.style
@@ -0,0 +1,442 @@
+#
+#Mon Apr 22 15:28:18 CEST 2013
+ARTIFACT_LINECOLOR=128 128 128
+BPMNSEQUENCEFLOW_TEXTCOLOR=128 128 128
+CONNECTIONPOINT_TEXTCOLOR=128 128 128
+INFOITEM_LINECOLOR=128 128 128
+CLAUSE_TEXTCOLOR=128 128 128
+COMMUNICATIONNODE_REPMODE=SIMPLE
+USECASE_REPMODE=SIMPLE
+SHALLOWHISTORY_FILLCOLOR=255 255 220
+PARTITION_FILLCOLOR=255 255 220
+INITIAL_TEXTCOLOR=128 128 128
+ENTRY_REPMODE=SIMPLE
+PROVIDEDINTERFACE_TEXTCOLOR=128 128 128
+COLLABORATION_FILLMODE=SOLID
+TASK_TEXTCOLOR=128 128 128
+COMMUNICATIONNODE_TEXTCOLOR=128 128 128
+CONSTRAINT_FILLCOLOR=255 255 220
+SHALLOWHISTORY_LINECOLOR=128 128 128
+LOOPNODE_FILLCOLOR=255 255 220
+PARTITION_LINECOLOR=128 128 128
+INSTANCELINK_REPRES_MODE=SIMPLE
+ACTION_REPMODE=SIMPLE
+COLLABORATIONUSE_REPMODE=SIMPLE
+CONDITIONAL_FILLCOLOR=255 255 220
+CONSTRAINT_LINECOLOR=128 128 128
+INTERACTIONOPERAND_LINECOLOR=128 128 128
+DATA_FILLCOLOR=255 255 220
+LOOPNODE_LINECOLOR=128 128 128
+INTERMEDIATECATCHEVENT_TEXTCOLOR=128 128 128
+CALLBEHAVIOR_FILLCOLOR=255 255 220
+USECASEDEPENDENCY_TEXTCOLOR=128 128 128
+CHANGEEVENT_LINECOLOR=128 128 128
+OUTPUTPIN_FILLCOLOR=255 255 220
+INSTANCE_LINECOLOR=128 128 128
+RAISEDEXCEPTION_LINECOLOR=128 128 128
+DEEPHISTORY_TEXTCOLOR=128 128 128
+REQUIREDINTERFACE_FILLCOLOR=255 255 220
+JUNCTION_REPMODE=SIMPLE
+INTERMEDIATTHROWEVENT_REPMODE=SIMPLE
+INFOFLOWLINK_LINECOLOR=128 128 128
+ENTRY_FILLMODE=SOLID
+STRUCTUREDACTIVITY_REPMODE=SIMPLE
+SEQUENCEDIAGRAMVIEW_FILLCOLOR=255 255 220
+EXECUTIONSPECIFICATION_FILLCOLOR=255 255 220
+REQUIREDINTERFACE_LINECOLOR=128 128 128
+PACKAGEIMPORT_LINECOLOR=128 128 128
+TERMINAL_REPMODE=SIMPLE
+GATEWAY_FILLCOLOR=255 255 220
+ACCEPTSIGNAL_FILLMODE=SOLID
+CONTROLFLOW_LINECOLOR=128 128 128
+SEQUENCEDIAGRAMVIEW_LINECOLOR=128 128 128
+EXECUTIONSPECIFICATION_LINECOLOR=128 128 128
+COLLABORATIONUSE_TEXTCOLOR=128 128 128
+DEPENDENCY_TEXTCOLOR=128 128 128
+EXPANSIONNODE_TEXTCOLOR=128 128 128
+COMPONENT_FILLMODE=SOLID
+NAMESPACEUSE_LINECOLOR=128 128 128
+STRUCTUREDACTIVITY_FILLMODE=SOLID
+COMPONENT_FILLCOLOR=255 255 220
+USECASE_FILLCOLOR=255 255 220
+IMPORT_LINECOLOR=128 128 128
+INFOITEM_FILLMODE=SOLID
+SIGNAL_FILLCOLOR=255 255 220
+CENTRALBUFFER_REPMODE=SIMPLE
+COMBINEDFRAGMENT_FILLCOLOR=255 255 220
+CALLEVENT_LINECOLOR=128 128 128
+DATA_FILLMODE=SOLID
+CALLOPERATION_FILLMODE=SOLID
+GATEWAY_REPMODE=SIMPLE
+FLOWFINAL_FILLCOLOR=255 255 220
+ACTIVITYFINAL_FILLMODE=SOLID
+CONNECTOR_TEXTCOLOR=128 128 128
+ACCEPTSIGNAL_TEXTCOLOR=128 128 128
+DATATYPE_TEXTCOLOR=128 128 128
+STATEINVARIANT_TEXTCOLOR=128 128 128
+CONNECTIONPOINT_FILLCOLOR=255 255 220
+EXPANSIONNODE_FILLMODE=SOLID
+REQUIREDINTERFACE_FILLMODE=SOLID
+PORT_REPMODE=SIMPLE
+OUTPUTPIN_REPMODE=SIMPLE
+TRANSITION_TEXTCOLOR=128 128 128
+DECISIONMERGE_FILLMODE=SOLID
+INITIAL_FILLCOLOR=255 255 220
+ACTION_FILLMODE=SOLID
+TASK_FILLCOLOR=255 255 220
+COMMUNICATIONNODE_FILLCOLOR=255 255 220
+ASSOC_LINECOLOR=128 128 128
+ENUM_FILLMODE=SOLID
+FORKJOIN_LINECOLOR=128 128 128
+ACTIVITYFINAL_TEXTCOLOR=128 128 128
+SENDSIGNALACTION_LINECOLOR=128 128 128
+COLLABORATION_TEXTCOLOR=128 128 128
+CONNECTOR_FILLMODE=SOLID
+DECISIONMERGE_REPMODE=SIMPLE
+INTERMEDIATECATCHEVENT_FILLCOLOR=255 255 220
+MESSAGE_LINECOLOR=128 128 128
+EXCEPTIONHANDLER_LINECOLOR=128 128 128
+GATE_LINECOLOR=128 128 128
+DEEPHISTORY_FILLCOLOR=255 255 220
+INTERFACEREALIZATION_LINECOLOR=128 128 128
+REGION_FILLMODE=SOLID
+TIMEEVENT_FILLMODE=SOLID
+STATEDIAGRAMVIEW_TEXTCOLOR=128 128 128
+FINALSTATE_FILLMODE=SOLID
+DECISIONMERGE_LINECOLOR=128 128 128
+CLASSASSOC_LINECOLOR=128 128 128
+TEMPLATEBINDING_TEXTCOLOR=128 128 128
+BPMNMESSAGEFLOW_TEXTCOLOR=128 128 128
+OUTPUTPIN_FILLMODE=SOLID
+CALLEVENT_REPMODE=SIMPLE
+BPMNLANE_FILLMODE=SOLID
+EXIT_REPMODE=SIMPLE
+OBJECTFLOW_LINECOLOR=128 128 128
+EXPANSIONNODE_FILLCOLOR=255 255 220
+TIMEEVENT_TEXTCOLOR=128 128 128
+CALLOPERATION_TEXTCOLOR=128 128 128
+BOUNDARYEVENT_LINECOLOR=128 128 128
+CONNECTOR_REPRES_MODE=SIMPLE
+COLLABORATIONUSE_LINECOLOR=128 128 128
+LIFELINE_REPMODE=SIMPLE
+DEPENDENCY_LINECOLOR=128 128 128
+EXPANSIONNODE_LINECOLOR=128 128 128
+PARTITION_FILLMODE=SOLID
+OBJECTNODE_LINECOLOR=128 128 128
+ARTIFACT_REPMODE=SIMPLE
+GATEWAY_FILLMODE=SOLID
+REGION_FILLCOLOR=255 255 220
+STARTEVENT_LINECOLOR=128 128 128
+CLASS_TEXTCOLOR=128 128 128
+ARTIFACT_FILLMODE=SOLID
+JUNCTION_FILLMODE=SOLID
+LOOPNODE_FILLMODE=SOLID
+SUBPROCESS_LINECOLOR=128 128 128
+ACCEPTSIGNAL_FILLCOLOR=255 255 220
+DATATYPE_FILLCOLOR=255 255 220
+CHOICE_TEXTCOLOR=128 128 128
+STATEINVARIANT_FILLCOLOR=255 255 220
+VALUEPIN_FILLMODE=SOLID
+INPUTPIN_TEXTCOLOR=128 128 128
+CONNECTOR_LINECOLOR=128 128 128
+OBJECTNODE_FILLMODE=SOLID
+DATATYPE_LINECOLOR=128 128 128
+DEEPHISTORY_REPMODE=SIMPLE
+FLOWFINAL_TEXTCOLOR=128 128 128
+CONNECTIONPOINT_FILLMODE=SOLID
+STRUCTUREDACTIVITY_TEXTCOLOR=128 128 128
+INTERACTIONUSE_FILLMODE=SOLID
+TASK_FILLMODE=SOLID
+TRANSITION_LINECOLOR=128 128 128
+INPUTPIN_REPMODE=SIMPLE
+INSTANCELINK_TEXTCOLOR=128 128 128
+ACTIVITYFINAL_FILLCOLOR=255 255 220
+INTERNALTRANSITION_TEXTCOLOR=128 128 128
+COLLABORATION_FILLCOLOR=255 255 220
+ACTOR_FILLMODE=SOLID
+ACTIVITYFINAL_LINECOLOR=128 128 128
+LIFELINE_TEXTCOLOR=128 128 128
+PROVIDEDINTERFACE_REPRES_MODE=SIMPLE
+GATE_REPMODE=SIMPLE
+STATEDIAGRAMVIEW_FILLCOLOR=255 255 220
+BPMNLANE_TEXTCOLOR=128 128 128
+CONDITIONAL_LINECOLOR=128 128 128
+NOTE_FILLMODE=SOLID
+DATA_LINECOLOR=128 128 128
+INTERMEDIATECATCHEVENT_REPMODE=SIMPLE
+BPMNMESSAGEFLOW_LINECOLOR=128 128 128
+EXPANSIONREGION_REPMODE=SIMPLE
+CALLBEHAVIOR_LINECOLOR=128 128 128
+FORK_FILLMODE=SOLID
+TIMEEVENT_FILLCOLOR=255 255 220
+CALLOPERATION_FILLCOLOR=255 255 220
+DATATYPE_REPRES_MODE=SIMPLE
+OUTPUTPIN_LINECOLOR=128 128 128
+EXPANSIONREGION_TEXTCOLOR=128 128 128
+GENZ_TEXTCOLOR=128 128 128
+TERMINAL_TEXTCOLOR=128 128 128
+INTERRUPTIBLE_LINECOLOR=128 128 128
+COMPONENT_REPRES_MODE=SIMPLE
+NOTE_TEXTCOLOR=128 128 128
+GATEWAY_LINECOLOR=128 128 128
+CLASS_FILLCOLOR=255 255 220
+DEEPHISTORY_FILLMODE=SOLID
+COLLABORATIONUSELINK_LINECOLOR=128 128 128
+ENDEVENT_FILLMODE=SOLID
+CHOICE_FILLCOLOR=255 255 220
+STATICDIAGRAMVIEW_TEXTCOLOR=128 128 128
+DATASTORE_REPMODE=SIMPLE
+INPUTPIN_FILLCOLOR=255 255 220
+COMPONENT_LINECOLOR=128 128 128
+USECASE_LINECOLOR=128 128 128
+JOIN_FILLMODE=SOLID
+MANIFESTATION_TEXTCOLOR=128 128 128
+SIGNAL_LINECOLOR=128 128 128
+BOUNDARYEVENT_REPMODE=SIMPLE
+STRUCTUREDACTIVITY_FILLCOLOR=255 255 220
+COMBINEDFRAGMENT_LINECOLOR=128 128 128
+INSTANCE_FILLMODE=SOLID
+ENUM_TEXTCOLOR=128 128 128
+INTERACTIONUSE_TEXTCOLOR=128 128 128
+DATASTORE_TEXTCOLOR=128 128 128
+FLOWFINAL_LINECOLOR=128 128 128
+LOOPNODE_REPMODE=SIMPLE
+INSTANCELINK_FILLCOLOR=255 255 220
+CONDITIONAL_FILLMODE=SOLID
+SEQUENCEDIAGRAMVIEW_FILLMODE=SOLID
+FORKJOIN_REPMODE=SIMPLE
+INTERMEDIATTHROWEVENT_FILLMODE=SOLID
+BPMNSEQUENCEFLOW_LINECOLOR=128 128 128
+SIGNAL_REPMODE=SIMPLE
+CONNECTIONPOINT_LINECOLOR=128 128 128
+INSTANCELINK_LINECOLOR=128 128 128
+LIFELINE_FILLCOLOR=255 255 220
+ACTION_TEXTCOLOR=128 128 128
+ENTRY_TEXTCOLOR=128 128 128
+PROVIDEDINTERFACE_LINECOLOR=128 128 128
+SUBPROCESS_FILLMODE=SOLID
+OBJECTNODE_REPMODE=SIMPLE
+TASK_LINECOLOR=128 128 128
+CONDITIONAL_REPMODE=SIMPLE
+CENTRALBUFFER_TEXTCOLOR=128 128 128
+COMMUNICATIONNODE_LINECOLOR=128 128 128
+BPMNLANE_FILLCOLOR=255 255 220
+CHOICE_REPMODE=SIMPLE
+ACTOR_TEXTCOLOR=128 128 128
+INTERMEDIATECATCHEVENT_LINECOLOR=128 128 128
+INSTANCE_REPRES_MODE=SIMPLE
+CONNECTIONPOINT_REPMODE=SIMPLE
+USECASEDEPENDENCY_LINECOLOR=128 128 128
+VALUEPIN_TEXTCOLOR=128 128 128
+INPUTPIN_FILLMODE=SOLID
+EXPANSIONREGION_FILLCOLOR=255 255 220
+GENZ_FILLCOLOR=255 255 220
+EXIT_TEXTCOLOR=128 128 128
+DEEPHISTORY_LINECOLOR=128 128 128
+EXIT_FILLMODE=SOLID
+ACCEPTSIGNAL_REPMODE=SIMPLE
+INTERMEDIATTHROWEVENT_TEXTCOLOR=128 128 128
+NOTE_FILLCOLOR=255 255 220
+STATE_REPMODE=SIMPLE
+CENTRALBUFFER_FILLMODE=SOLID
+PACKAGEMERGE_TEXTCOLOR=128 128 128
+COMMUNICATIONCHANNEL_TEXTCOLOR=128 128 128
+CHOICE_FILLMODE=SOLID
+CHANGEEVENT_FILLMODE=SOLID
+NOTE_LINECOLOR=128 128 128
+FINALSTATE_REPMODE=SIMPLE
+STATICDIAGRAMVIEW_FILLCOLOR=255 255 220
+ACTOR_REPMODE=SIMPLE
+NODE_TEXTCOLOR=128 128 128
+JOIN_FILLCOLOR=255 255 220
+SIGNAL_FILLMODE=SOLID
+ENUM_FILLCOLOR=255 255 220
+CALLEVENT_FILLMODE=SOLID
+DATASTORE_FILLCOLOR=255 255 220
+INTERACTIONUSE_FILLCOLOR=255 255 220
+INTERFACE_REPRES_MODE=SIMPLE
+INTERACTIONUSE_LINECOLOR=128 128 128
+ACCEPTSIGNAL_LINECOLOR=128 128 128
+STATEINVARIANT_LINECOLOR=128 128 128
+PORT_FILL_COLOR=255 255 220
+CHANGEEVENT_TEXTCOLOR=128 128 128
+INITIALSTATE_TEXTCOLOR=128 128 128
+INSTANCE_TEXTCOLOR=128 128 128
+RAISEDEXCEPTION_TEXTCOLOR=128 128 128
+ACTION_FILLCOLOR=255 255 220
+ENTRY_FILLCOLOR=255 255 220
+INFOFLOWLINK_TEXTCOLOR=128 128 128
+INITIALSTATE_REPMODE=SIMPLE
+CENTRALBUFFER_FILLCOLOR=255 255 220
+EXPANSIONREGION_FILLMODE=SOLID
+ENTRY_LINECOLOR=128 128 128
+PACKAGEIMPORT_TEXTCOLOR=128 128 128
+PACKAGE_TEXTCOLOR=128 128 128
+CENTRALBUFFER_LINECOLOR=128 128 128
+COLLABORATION_LINECOLOR=128 128 128
+LIFELINE_FILLMODE=SOLID
+SENDSIGNALACTION_FILLMODE=SOLID
+ACTOR_FILLCOLOR=255 255 220
+FORKJOIN_FILLMODE=SOLID
+VALUEPIN_FILLCOLOR=255 255 220
+DATATYPE_FILLMODE=SOLID
+NAMESPACEUSE_TEXTCOLOR=128 128 128
+EXIT_FILLCOLOR=255 255 220
+CLASS_FILLMODE=SOLID
+IMPORT_TEXTCOLOR=128 128 128
+STARTEVENT_FILLMODE=SOLID
+COLLABORATION_REPMODE=SIMPLE
+SHALLOWHISTORY_REPMODE=SIMPLE
+STATEDIAGRAMVIEW_LINECOLOR=128 128 128
+SHALLOWHISTORY_FILLMODE=SOLID
+TEMPLATEBINDING_LINECOLOR=128 128 128
+NODE_FILLMODE=SOLID
+INTERMEDIATTHROWEVENT_FILLCOLOR=255 255 220
+FORK_FILLCOLOR=255 255 220
+CALLEVENT_TEXTCOLOR=128 128 128
+JUNCTION_TEXTCOLOR=128 128 128
+FORK_REPMODE=SIMPLE
+INTERMEDIATTHROWEVENT_LINECOLOR=128 128 128
+ENDEVENT_TEXTCOLOR=128 128 128
+COMMUNICATIONDIAGRAMVIEW_TEXTCOLOR=128 128 128
+TIMEEVENT_LINECOLOR=128 128 128
+CALLOPERATION_LINECOLOR=128 128 128
+COMMUNICATIONCHANNEL_LINECOLOR=128 128 128
+PACKAGE_FILLMODE=SOLID
+NODE_FILLCOLOR=255 255 220
+INFOITEM_REPRES_MODE=SIMPLE
+ASSOC_TEXTCOLOR=128 128 128
+NODE_LINECOLOR=128 128 128
+CLASS_LINECOLOR=128 128 128
+STATE_TEXTCOLOR=128 128 128
+FORKJOIN_TEXTCOLOR=128 128 128
+PORT_TEXTCOLOR=128 128 128
+FINALSTATE_TEXTCOLOR=128 128 128
+BPMNDATAASSOCIATION_TEXTCOLOR=128 128 128
+INSTANCELINK_FILLMODE=SOLID
+stylename=ramc
+SENDSIGNALACTION_TEXTCOLOR=128 128 128
+JOIN_TEXTCOLOR=128 128 128
+CHOICE_LINECOLOR=128 128 128
+CHANGEEVENT_REPMODE=SIMPLE
+INPUTPIN_LINECOLOR=128 128 128
+DATASTORE_FILLMODE=SOLID
+EXCEPTIONHANDLER_TEXTCOLOR=128 128 128
+GATE_TEXTCOLOR=128 128 128
+CHANGEEVENT_FILLCOLOR=255 255 220
+COLLABORATIONUSE_FILLMODE=SOLID
+EXPANSIONNODE_REPMODE=SIMPLE
+INITIALSTATE_FILLCOLOR=255 255 220
+ACTIVITYFINAL_REPMODE=SIMPLE
+INTERFACE_TEXTCOLOR=128 128 128
+INSTANCE_FILLCOLOR=255 255 220
+INTERFACEREALIZATION_TEXTCOLOR=128 128 128
+STRUCTUREDACTIVITY_LINECOLOR=128 128 128
+CLASS_REPRES_MODE=SIMPLE
+basestyle=default
+DECISIONMERGE_TEXTCOLOR=128 128 128
+PACKAGE_FILLCOLOR=255 255 220
+JOIN_REPMODE=SIMPLE
+USECASE_FILLMODE=SOLID
+PACKAGE_LINECOLOR=128 128 128
+NODE_REPMODE=SIMPLE
+OBJECTFLOW_TEXTCOLOR=128 128 128
+LIFELINE_LINECOLOR=128 128 128
+BOUNDARYEVENT_TEXTCOLOR=128 128 128
+BPMNLANE_LINECOLOR=128 128 128
+COMMUNICATIONNODE_FILLMODE=SOLID
+ENUM_REPRES_MODE=SIMPLE
+OBJECTNODE_TEXTCOLOR=128 128 128
+SENDSIGNALACTION_REPMODE=SIMPLE
+INITIAL_FILLMODE=SOLID
+CALLEVENT_FILLCOLOR=255 255 220
+JUNCTION_FILLCOLOR=255 255 220
+STARTEVENT_TEXTCOLOR=128 128 128
+BOUNDARYEVENT_FILLMODE=SOLID
+ENDEVENT_FILLCOLOR=255 255 220
+PACKAGE_REPMODE=SIMPLE
+COMMUNICATIONDIAGRAMVIEW_FILLCOLOR=255 255 220
+REQUIREDINTERFACE_REPRES_MODE=SIMPLE
+SUBPROCESS_TEXTCOLOR=128 128 128
+EXPANSIONREGION_LINECOLOR=128 128 128
+GENZ_LINECOLOR=128 128 128
+ENDEVENT_LINECOLOR=128 128 128
+COMMUNICATIONDIAGRAMVIEW_LINECOLOR=128 128 128
+FORK_TEXTCOLOR=128 128 128
+ABSTRACT_DIAGRAM_FILLCOLOR=255 255 220
+TERMINAL_LINECOLOR=128 128 128
+FLOWFINAL_FILLMODE=SOLID
+EXECUTIONOCCURENCESPECIFICATION_FILLMODE=SOLID
+ASSOC_FILLCOLOR=255 255 220
+ARTIFACT_TEXTCOLOR=128 128 128
+STATE_FILLCOLOR=255 255 220
+FORKJOIN_FILLCOLOR=255 255 220
+FINALSTATE_FILLCOLOR=255 255 220
+FLOWFINAL_REPMODE=SIMPLE
+GATE_FILLMODE=SOLID
+INFOITEM_TEXTCOLOR=128 128 128
+CALLOPERATION_REPMODE=SIMPLE
+SENDSIGNALACTION_FILLCOLOR=255 255 220
+INITIAL_REPMODE=SIMPLE
+STATE_LINECOLOR=128 128 128
+PORT_LINECOLOR=128 128 128
+STATICDIAGRAMVIEW_LINECOLOR=128 128 128
+BPMNDATAASSOCIATION_LINECOLOR=128 128 128
+SUBPROCESS_REPMODE=SIMPLE
+GATE_FILLCOLOR=255 255 220
+SHALLOWHISTORY_TEXTCOLOR=128 128 128
+JOIN_LINECOLOR=128 128 128
+MANIFESTATION_LINECOLOR=128 128 128
+INTERFACE_FILLCOLOR=255 255 220
+PARTITION_TEXTCOLOR=128 128 128
+CONSTRAINT_FILLMODE=SOLID
+INTERFACEREALIZATION_FILLCOLOR=255 255 220
+EXECUTIONOCCURENCESPECIFICATION_FILLCOLOR=255 255 220
+ENUM_LINECOLOR=128 128 128
+CONSTRAINT_TEXTCOLOR=128 128 128
+INTERACTIONOPERAND_TEXTCOLOR=128 128 128
+INTERFACE_LINECOLOR=128 128 128
+DATASTORE_LINECOLOR=128 128 128
+LOOPNODE_TEXTCOLOR=128 128 128
+DECISIONMERGE_FILLCOLOR=255 255 220
+CONDITIONAL_TEXTCOLOR=128 128 128
+DATA_TEXTCOLOR=128 128 128
+STATE_FILLMODE=SOLID
+TASK_REPMODE=SIMPLE
+INTERFACE_FILLMODE=SOLID
+CALLBEHAVIOR_TEXTCOLOR=128 128 128
+INTERMEDIATECATCHEVENT_FILLMODE=SOLID
+OUTPUTPIN_TEXTCOLOR=128 128 128
+BOUNDARYEVENT_FILLCOLOR=255 255 220
+ACTION_LINECOLOR=128 128 128
+COLLABORATIONUSE_FILLCOLOR=255 255 220
+REQUIREDINTERFACE_TEXTCOLOR=128 128 128
+VALUEPIN_REPMODE=SIMPLE
+CONTROLFLOW_TEXTCOLOR=128 128 128
+SEQUENCEDIAGRAMVIEW_TEXTCOLOR=128 128 128
+COMBINEDFRAGMENT_FILLMODE=SOLID
+STATEINVARIANT_FILLMODE=SOLID
+OBJECTNODE_FILLCOLOR=255 255 220
+GATEWAY_TEXTCOLOR=128 128 128
+INITIALSTATE_FILLMODE=SOLID
+STARTEVENT_FILLCOLOR=255 255 220
+ACTOR_LINECOLOR=128 128 128
+COLLABORATIONUSELINK_TEXTCOLOR=128 128 128
+SUBPROCESS_FILLCOLOR=255 255 220
+VALUEPIN_LINECOLOR=128 128 128
+TIMEEVENT_REPMODE=SIMPLE
+EXECUTIONSPECIFICATION_FILLMODE=SOLID
+CONNECTOR_FILLCOLOR=255 255 220
+EXIT_LINECOLOR=128 128 128
+STARTEVENT_REPMODE=SIMPLE
+COMPONENT_TEXTCOLOR=128 128 128
+USECASE_TEXTCOLOR=128 128 128
+CALLBEHAVIOR_REPMODE=SIMPLE
+SIGNAL_TEXTCOLOR=128 128 128
+COMBINEDFRAGMENT_TEXTCOLOR=128 128 128
+FORK_LINECOLOR=128 128 128
+ARTIFACT_FILLCOLOR=255 255 220
+ENDEVENT_REPMODE=SIMPLE
+CALLBEHAVIOR_FILLMODE=SOLID
+PACKAGEMERGE_LINECOLOR=128 128 128
+INFOITEM_FILLCOLOR=255 255 220
diff --git a/gatb-core/doc/design/modelio/GATB/.config/styles/use case.style b/gatb-core/doc/design/modelio/GATB/.config/styles/use case.style
new file mode 100644
index 0000000..924750b
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/.config/styles/use case.style	
@@ -0,0 +1,8 @@
+#
+#Mon Apr 22 15:28:17 CEST 2013
+ASSOC_SHOWLABEL=false
+ASSOC_SHOWROLES=false
+ASSOC_CONNECTIONROUTER=DIRECT
+ASSOC_SHOWNAVIGABILITY=false
+stylename=use case
+ASSOC_SHOWCARD=false
diff --git a/gatb-core/doc/design/modelio/GATB/GATB.ofpx b/gatb-core/doc/design/modelio/GATB/GATB.ofpx
new file mode 100644
index 0000000..cb841ab
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/GATB.ofpx differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelerModule/lib/ModelerModule.jar b/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelerModule/lib/ModelerModule.jar
new file mode 100644
index 0000000..2a5cfd8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelerModule/lib/ModelerModule.jar differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelingWizard/lib/ModelingWizard.jar b/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelingWizard/lib/ModelingWizard.jar
new file mode 100644
index 0000000..8e371a8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/.runtime/ModelingWizard/lib/ModelingWizard.jar differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module.properties b/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module.properties
new file mode 100644
index 0000000..c77b8e0
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module.properties
@@ -0,0 +1,4 @@
+#Generated by Modelio
+#21/02/13 18:16
+MdacLabel=Local module
+MdacDescription=The local module constains all the UML extensions defined by the user of the project.
diff --git a/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module_fr.properties b/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module_fr.properties
new file mode 100644
index 0000000..88dc52e
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/LocalModule/module_fr.properties
@@ -0,0 +1,4 @@
+#Generated by Modelio
+#21/02/13 18:16
+MdacLabel=Module local
+MdacDescription=Le module local contient les extensions UML définies par l'utilisateur du projet.
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/lib/ModelerModule.jar b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/lib/ModelerModule.jar
new file mode 100644
index 0000000..2a5cfd8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/lib/ModelerModule.jar differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.properties b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.properties
new file mode 100644
index 0000000..069e1ca
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.properties
@@ -0,0 +1,206 @@
+MdacLabel=Extensions
+MdacDescription=Standard Modelio UML Modeler extensions.
+
+AutoDiagram = Auto Diagram
+abstraction	= Abstraction
+access	= Access
+actionInputPin	= Action Input Pin
+addStructuralFeatureValueAction	= Add Structural Feature Value Action
+addVariableValueAction	= Add Variable Value Action
+analysis = Analysis
+antonym	= Antonym
+assigned	= Assigned
+association	= Association
+body	= Body
+bodyOutput	= Body Output
+broadcastSignalAction	= Broadcast Signal Action
+business_rule	= Business Rule
+business_rule_container	= Business Rule Container
+business_rule_diagram	= Business Rule Diagram
+business_rule_propertyset	= Business Rule Propertyset
+catch	= Catch
+cause_depth	= Cause Depth
+class	= Class
+classifier	= Classifier
+classifierTemplateParameter	= Classifier Template Parameter
+clearAssociationAction	= Clear Association Action
+clearStructuralFeatureAction	= Clear Structural Feature Action
+clearVariableAction	= Clear Variable Action
+collaboration	= Collaboration
+comment	= Comment
+communication	= Communication
+communicationPath	= Communication Path
+complete	= Complete
+componentRealization	= Component Realization
+connectableElementTemplateParameter	= Connectable Element Template Parameter
+consequence_depth	= Consequence Depth
+constraint	= Constraint
+context	= Context
+create	= Create
+createLinkAction	= Create Link Action
+createLinkObjectAction	= Create Link Object Action
+createObjectAction	= Create Object Action
+creationEvent	= Creation Event
+decider	= Decider
+deployment	= Deployment
+deploymentSpecification	= Deployment Specification
+derive	= Derive
+description	= Description
+design	= Design
+design_pattern	= Design Pattern
+destroy	= Destroy
+destroyed	= Destroyed
+destroyLinkAction	= Destroy Link Action
+destroyObjectAction	= Destroy Object Action
+destructionEvent	= Destruction Event
+device	= Device
+dictionary	= Dictionary
+dictionary_diagram	= Dictionary Diagram
+dictionary_propertyset	= Dictionary Propertyset
+disjoin	= Disjoin
+EcoreId = Ecore Id
+endCreationData	=  End Creation Data
+endDestructionData	= End Destruction Data
+exception	= Exception
+exceptionHandler	= Exception Handler
+exceptionType	= Exception Type
+executable	= Executable
+executionEnvironment	= Execution Environment
+executionEvent	= Execution Event
+expansionNode	= Expansion Node
+expansionRegion	= Expansion Region
+extend	= Extend
+extension	= Extension
+extensionEnd	= Extension End
+External_document	= External Document
+facade	= Facade
+first	= First
+flow	= Flow
+frameWork	= FrameWork
+friend	= Friend
+generalizationSet	= Generalization Set
+generatedDiagram	= Generated Diagram
+goal	= Goal
+goal_container	= Goal Container
+goal_diagram	= Goal Diagram
+goal_propertyset	= Goal Propertyset
+guarantee	= Guarantee
+homonym	= Homonym
+Id	= Id
+impact	= Impact
+impact_root	= Impact Root
+impact_subroot	= Impact Subroot
+implement	= Implement
+implementation	= Implementation
+implementationClass	= Implementation Class
+implicit	=  Implicit
+import	= Import
+include	= Include
+incomplete	= Incomplete
+insertAt	= Insert At
+instantiate	= Instantiate
+interaction	= Interaction
+Interaction_Overview_Diagram	= Interaction Overview Diagram
+invariant	= Invariant
+Is_a_link	= Is a link
+isDestroyDuplicates	=  Is Destroy Duplicates
+isOwnedByClassifier	= Owned by Classifier
+JEvaluation	= J Evaluation
+kind-of	= Kind-of
+Label_for_a_link	= Link label
+library	= Library
+measure	= Measure
+metaclass	= Metaclass
+metamodel	= Metamodel
+method	= Method
+mode	= Mode
+ModelComponent	= Model Component
+ModelComponentArchive	= Model Component Archive
+ModelComponentFiles	= Model Component Files
+ModelComponentVersion	= Model Component Version
+negative_influence	= -influence
+new	= New
+nocode	= No Code
+nodoc = No Documentation
+non-functional_constraint	= Non-functional Constraint
+NotExported	= Not exported with XMI
+object	= Object
+operationTemplateParameter	= Operation Template Parameter
+ordered	= Ordered
+overlapping	= Overlapping
+part	= Part
+persistence	= Persistence
+positive_influence	= +influence
+postcondition	= Postcondition
+precondition	= Precondition
+primary	= Primary
+process	= Process
+Property	= Property
+Property_type	= Property Type
+protocolConformance	= Protocol Conformance
+qualifier	= Qualifier 
+raiseExceptionAction	= Raise Exception Action
+readExtentAction	= Read Extent Action
+readIsClassifierObjectAction	= Read Is Classifier Object Action
+readLinkAction	= Read Link Action
+readLinkObjectEndAction	= Read Link Object End Action
+readLinkObjectEndQualifierAction	= Read Link Object End Qualifier Action
+readSelfAction	= Read Self Action
+readStructuralFeatureAction	= Read Structural Feature Action
+readVariableAction	= Read Variable Action
+reception	= Reception
+reclassifyObjectAction	= Reclassify Object Action
+redefinableTemplateSignature	= Redefinable Template Signature
+reduceAction	= Reduce Action
+refers	= Refers
+refine	= Refine
+related	= Related
+related_diagram	= Related Diagram
+removeStructuralFeatureAction	= Remove Structural Feature Action
+removeVariableValueAction	= Remove Variable Value Action
+replyAction	= Reply Action
+requirement	= Requirement
+requirement_container	= Requirement Container
+requirement_diagram	= Requirement Diagram
+requirement_propertyset	= Requirement Propertyset
+satisfy	= Satisfy
+scenario	= Scenario
+second	= Second
+secondary	= Secondary
+sendObjectAction	= Send Object Action
+sequenceNode	=  Sequence Node
+setup	= Setup
+signal	= Signal
+Size	= Size
+specification	= Specification
+startClassifierBehaviorAction	= Start Classifier Behavior Action
+state	= State
+Stereotype_Property	= Stereotype Property
+structuralFeature	= Structural Feature
+stub	= Stub
+subset	= Subset
+subsystem	= Subsystem
+summary	=  Summary
+synonym	= Synonym
+system	= System
+target	= Target
+templateSignature	= Template Signature
+term	= Term
+test	= Test
+testIdentityAction	= Test Identity Action
+throw	= Throw
+topLevel	= Top Level
+trace	= Trace
+transient	= Transient
+type	= Type
+Type	= Type
+undefined	= Undefined
+unmarshallAction	= Unmarshall Action
+usecase	= Usecase
+utility	= Utility
+value	= Value
+Value = Value
+valueSpecificationAction	= Value Specification Action
+verify	= Verify
+XMIImported	= XMI Imported
+xor	= Xor
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.xml b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.xml
new file mode 100644
index 0000000..f559733
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module.xml
@@ -0,0 +1,1338 @@
+<?xml version="1.0" encoding="utf-8"?>
+<module uid="00000000-0000-2710-0000-000000000000" name="ModelerModule" class="com.modeliosoft.modelio.modelermodule.impl.ModelerModuleMdac" version="7.1.06.8020" binaryversion="2.2.00.8020" licenseRequired="false">
+	<classpath>
+		<entry path="lib/ModelerModule.jar" />
+	</classpath>
+	<profile uid="00300000-0000-0032-0000-000000000000" name="Code">
+		<anonymous-stereotype uid="00bc2f68-0000-0f3a-0000-000000000000" metaclass="AssociationEnd">
+			<taggedvalues uid="00000000-0000-36be-0000-000000000000" name="nocode" label="%nocode" parameter-card="0" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="00000000-0000-3766-0000-000000000000" name="type" label="%type" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0f44-0000-000000000000" metaclass="Attribute">
+			<taggedvalues uid="00000000-0000-36bb-0000-000000000000" name="nocode" label="%nocode" parameter-card="0" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="00000000-0000-3765-0000-000000000000" name="type" label="%type" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0f51-0000-000000000000" metaclass="GeneralClass">
+			<taggedvalues uid="00000000-0000-36bc-0000-000000000000" name="nocode" label="%nocode" parameter-card="0" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0f6b-0000-000000000000" metaclass="Note">
+			<taggedvalues uid="00000000-0000-375b-0000-000000000000" name="JEvaluation" label="%JEvaluation" parameter-card="0" is-hidden="true" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0fa9-0000-000000000000" metaclass="Operation">
+			<taggedvalues uid="00000000-0000-36bd-0000-000000000000" name="nocode" label="%nocode" parameter-card="0" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0faf-0000-000000000000" metaclass="Package">
+			<taggedvalues uid="00000000-0000-36bf-0000-000000000000" name="nocode" label="%nocode" parameter-card="0" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0fc2-0000-000000000000" metaclass="Parameter">
+			<taggedvalues uid="00000000-0000-3767-0000-000000000000" name="type" label="%type" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+	</profile>
+	<profile uid="007004e8-0000-0282-0000-000000000000" name="default">
+		<anonymous-stereotype uid="00bc3924-0000-189d-0000-000000000000" metaclass="AbstractDiagram">
+			<taggedvalues uid="00bc3924-0000-1ae7-0000-000000000000" name="generatedDiagram" label="%generatedDiagram" parameter-card="*" is-hidden="true" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-0258-0000-000000000000" metaclass="Association">
+			<taggedvalues uid="00700680-0000-01e9-0000-000000000000" name="persistence" label="%persistence" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-02a9-0000-000000000000" metaclass="Attribute">
+			<taggedvalues uid="00700680-0000-01eb-0000-000000000000" name="persistence" label="%persistence" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-037a-0000-000000000000" metaclass="Classifier">
+			<taggedvalues uid="00700680-0000-01ed-0000-000000000000" name="persistence" label="%persistence" parameter-card="*" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="01ec2468-0000-0894-0000-000000000000" metaclass="Dependency">
+			<taggedvalues uid="01ec2468-0000-0aba-0000-000000000000" name="cause_depth" label="%cause_depth" parameter-card="1" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="01ec2468-0000-0abf-0000-000000000000" name="consequence_depth" label="%consequence_depth" parameter-card="1" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-08c8-0000-000000000000" metaclass="ModelElement">
+			<taggedvalues uid="c40494de-2182-11e1-85ce-002564c97630" name="nodoc" label="%nodoc" parameter-card="0" is-hidden="false" is-signed="false" />
+			<notetype uid="00000000-0000-3e81-0000-000000000000" name="description" label="%description" is-hidden="false" />
+			<notetype uid="00000000-0000-3e83-0000-000000000000" name="undefined" label="%undefined" is-hidden="false" />
+			<notetype uid="00000000-0000-3e80-0000-000000000000" name="comment" label="%comment" is-hidden="false" />
+			<externdocumenttype uid="9ccf914f-2175-11e1-a46e-002564c97630" name="description" label="%description" is-hidden="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-092f-0000-000000000000" metaclass="ModelTree">
+			<notetype uid="00000000-0000-3e84-0000-000000000000" name="summary" label="%summary" is-hidden="false" />
+			<externdocumenttype uid="06972e98-2177-11e1-a46e-002564c97630" name="specification" label="%specification" is-hidden="false" />
+			<externdocumenttype uid="06da53d0-2177-11e1-a46e-002564c97630" name="design" label="%design" is-hidden="false" />
+			<externdocumenttype uid="86f09380-2bd8-11e1-8cff-002564c97630" name="analysis" label="%analysis" is-hidden="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="deb348a5-2653-11e1-9161-002564c97630" metaclass="Operation">
+					<notetype uid="00540400-0000-011f-0000-000000000000" name="summary" label="%summary" is-hidden="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc27b8-0000-0e0b-0000-000000000000" metaclass="UseCase">
+			<notetype uid="00bc0b8c-0000-251b-0000-000000000000" name="constraint" label="%constraint" is-hidden="false" />
+			<notetype uid="00bc0c08-0000-242c-0000-000000000000" name="non-functional constraint" label="%non-functional_constraint" is-hidden="false" />
+			<notetype uid="00bc0b8c-0000-2519-0000-000000000000" name="exception" label="%exception" is-hidden="false" />
+			<notetype uid="00bc0b8c-0000-2517-0000-000000000000" name="postcondition" label="%postcondition" is-hidden="false" />
+			<notetype uid="00bc0b8c-0000-2515-0000-000000000000" name="precondition" label="%precondition" is-hidden="false" />
+			<externdocumenttype uid="85571022-1c36-11e1-90cd-002564c97631" name="usecase" label="%usecase" is-hidden="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="00bc2f68-0000-0fd8-0000-000000000000" metaclass="AssociationEnd">
+			<taggedvalues uid="00000000-0000-3729-0000-000000000000" name="ordered" label="%ordered" parameter-card="0" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="00000000-0000-372a-0000-000000000000" name="qualifier" label="%qualifier" parameter-card="1" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<stereotype uid="c2e23680-96f0-11de-a322-001fe2c988b8" name="ExternalDocument" label="%External_document" metaclass="Note" is-hidden="false">
+			<icons>
+				<small path="res/bmp/externalDocument.png" />
+				<explorer path="res/bmp/externalDocument.png" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="0da68860-96f1-11de-a322-001fe2c988b8" name="isLink" label="%Is_a_link" parameter-card="0" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="4027c488-2b5c-11df-9426-00137279a5d1" name="LinkLabel" label="%Label_for_a_link" parameter-card="1" is-hidden="false" is-signed="false" />
+		</stereotype>
+		<stereotype uid="00d0052c-0000-0143-0000-000000000000" name="ModelComponent" label="%ModelComponent" metaclass="Component" is-hidden="true">
+			<icons>
+				<small path="res/bmp/ramc.png" />
+				<explorer path="res/bmp/ramc.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00140d80-0000-0110-0000-000000000000" name="ModelComponentArchive" label="%ModelComponentArchive" metaclass="Artifact" is-hidden="true">
+			<icons>
+				<small path="res/bmp/ramcarchive.png" />
+				<explorer path="res/bmp/ramcarchive.png" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="00140d80-0000-0112-0000-000000000000" name="ModelComponentFiles" label="%ModelComponentFiles" parameter-card="*" is-hidden="true" is-signed="false" />
+			<taggedvalues uid="00140d80-0000-020c-0000-000000000000" name="ModelComponentVersion" label="%ModelComponentVersion" parameter-card="1" is-hidden="true" is-signed="false" />
+		</stereotype>
+		<stereotype uid="00700680-0000-01cc-0000-000000000000" name="access" label="%access" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="0054070c-0000-005f-0000-000000000000" name="catch" label="%catch" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01f1-0000-000000000000" name="complete" label="%complete" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-0202-0000-000000000000" name="create" label="%create" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="res/bmp/operation_constructor.png" />
+				<explorer path="res/bmp/operation_constructor.png" />
+				<diagram path="res/bmp/operation_constructor.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-0204-0000-000000000000" name="create" label="%create" metaclass="Operation" is-hidden="false">
+			<icons>
+				<small path="res/bmp/operation_constructor.png" />
+				<explorer path="res/bmp/operation_constructor.png" />
+				<diagram path="res/bmp/operation_constructor.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="007006dc-0000-0139-0000-000000000000" name="design pattern" label="%design_pattern" metaclass="Class" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="res/bmp/designpattern_icon.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-0206-0000-000000000000" name="destroy" label="%destroy" metaclass="Operation" is-hidden="false">
+			<icons>
+				<small path="res/bmp/operation_destructor.png" />
+				<explorer path="res/bmp/operation_destructor.png" />
+				<diagram path="res/bmp/operation_destructor.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01f3-0000-000000000000" name="destroyed" label="%destroyed" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01f5-0000-000000000000" name="disjoin" label="%disjoin" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01d1-0000-000000000000" name="exception" label="%exception" metaclass="Signal" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01c3-0000-000000000000" name="executable" label="%executable" metaclass="Artifact" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00000000-0000-9c48-0000-000000000000" name="extend" label="%extend" metaclass="UseCaseDependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/usecasedependencyextend.png" />
+				<explorer path="res/bmp/usecasedependencyextend.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01d5-0000-000000000000" name="facade" label="%facade" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1228-0000-0964-0000-000000000000" name="flow" label="%flow" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dataflow.png" />
+				<explorer path="res/bmp/dataflow.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01db-0000-000000000000" name="frameWork" label="%frameWork" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01ca-0000-000000000000" name="friend" label="%friend" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec2468-0000-0ac1-0000-000000000000" name="impact_root" label="%impact_root" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec2468-0000-0ac6-0000-000000000000" name="impact_subroot" label="%impact_subroot" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01c7-0000-000000000000" name="implementation" label="%implementation" metaclass="Generalization" is-hidden="false">
+			<icons>
+				<small path="res/bmp/realization.png" />
+				<explorer path="res/bmp/realization.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00bc0050-0000-006b-0000-000000000000" name="implementationClass" label="%implementationClass" metaclass="Class" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01b8-0000-000000000000" name="implicit" label="%implicit" metaclass="Association" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01ce-0000-000000000000" name="import" label="%import" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00000000-0000-9c49-0000-000000000000" name="include" label="%include" metaclass="UseCaseDependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/usecasedependencyinclude.png" />
+				<explorer path="res/bmp/usecasedependencyinclude.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01f7-0000-000000000000" name="incomplete" label="%incomplete" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01e5-0000-000000000000" name="instantiate" label="%instantiate" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00000000-0000-9c44-0000-000000000000" name="invariant" label="%invariant" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01c5-0000-000000000000" name="library" label="%library" metaclass="Artifact" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01bd-0000-000000000000" name="metaclass" label="%metaclass" metaclass="Classifier" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01e7-0000-000000000000" name="metamodel" label="%metamodel" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01f9-0000-000000000000" name="new" label="%new" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00540a84-0000-0003-0000-000000000000" name="ordered" label="%ordered" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01fb-0000-000000000000" name="overlapping" label="%overlapping" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00000000-0000-9c46-0000-000000000000" name="postcondition" label="%postcondition" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00000000-0000-9c45-0000-000000000000" name="precondition" label="%precondition" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1ac4-0000-2ef9-0000-000000000000" name="primary" label="%primary" metaclass="Actor" is-hidden="false">
+			<icons>
+				<small path="res/bmp/primary.png" />
+				<explorer path="res/bmp/primary.png" />
+				<diagram path="res/bmp/bigprimary.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01ef-0000-000000000000" name="process" label="%process" metaclass="Classifier" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1ac4-0000-2eff-0000-000000000000" name="scenario" label="%scenario" metaclass="Interaction" is-hidden="false">
+			<icons>
+				<small path="res/bmp/scenario.png" />
+				<explorer path="res/bmp/scenario.png" />
+				<diagram path="res/bmp/bigscenario.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1ac4-0000-2f04-0000-000000000000" name="secondary" label="%secondary" metaclass="Actor" is-hidden="false">
+			<icons>
+				<small path="res/bmp/secondary.png" />
+				<explorer path="res/bmp/secondary.png" />
+				<diagram path="res/bmp/bigsecondary.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01d7-0000-000000000000" name="stub" label="%stub" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00540a84-0000-0005-0000-000000000000" name="subset" label="%subset" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01d3-0000-000000000000" name="subsystem" label="%subsystem" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="res/bmp/subsystem.png" />
+				<explorer path="res/bmp/subsystem.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1ac4-0000-2f09-0000-000000000000" name="system" label="%system" metaclass="Actor" is-hidden="false">
+			<icons>
+				<small path="res/bmp/system.png" />
+				<explorer path="res/bmp/system.png" />
+				<diagram path="res/bmp/bigsystem.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="007006dc-0000-0137-0000-000000000000" name="system" label="%system" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="res/bmp/system.png" />
+				<explorer path="res/bmp/system.png" />
+				<diagram path="res/bmp/bigsystem.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="0054070c-0000-005d-0000-000000000000" name="throw" label="%throw" metaclass="ElementImport" is-hidden="false">
+			<icons>
+				<small path="res/bmp/raisedexception.png" />
+				<explorer path="res/bmp/raisedexception.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01d9-0000-000000000000" name="topLevel" label="%topLevel" metaclass="Package" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01280500-0000-0b37-0000-000000000000" name="trace" label="%trace" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/traceability.png" />
+				<explorer path="res/bmp/traceability.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01fe-0000-000000000000" name="transient" label="%transient" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01ba-0000-000000000000" name="type" label="%type" metaclass="Class" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-01bf-0000-000000000000" name="utility" label="%utility" metaclass="Classifier" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00700680-0000-0200-0000-000000000000" name="xor" label="%xor" metaclass="Constraint" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="002005c0-0001-0007-0000-000000000000" name="class" label="%class" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_class.png" />
+				<explorer path="res/bmp/staticdiagram_class.png" />
+				<diagram path="res/bmp/staticdiagram_class_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00bc3ac0-0000-0d9a-0000-000000000000" name="collaboration" label="%collaboration" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_collaboration.png" />
+				<explorer path="res/bmp/staticdiagram_collaboration.png" />
+				<diagram path="res/bmp/staticdiagram_collaboration_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="00bc4480-0000-06a8-0000-000000000000" name="communication" label="%communication" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_communication.png" />
+				<explorer path="res/bmp/staticdiagram_communication.png" />
+				<diagram path="res/bmp/staticdiagram_communication_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="002005c0-0001-000f-0000-000000000000" name="deployment" label="%deployment" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_deployment.png" />
+				<explorer path="res/bmp/staticdiagram_deployment.png" />
+				<diagram path="res/bmp/staticdiagram_deployment_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec2468-0000-0acb-0000-000000000000" name="impact" label="%impact" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_impact.png" />
+				<explorer path="res/bmp/staticdiagram_impact.png" />
+				<diagram path="res/bmp/staticdiagram_impact_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="002005c0-0001-000d-0000-000000000000" name="object" label="%object" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_object.png" />
+				<explorer path="res/bmp/staticdiagram_object.png" />
+				<diagram path="res/bmp/staticdiagram_object_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="002005c0-0001-0011-0000-000000000000" name="state" label="%state" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_state.png" />
+				<explorer path="res/bmp/staticdiagram_state.png" />
+				<diagram path="res/bmp/staticdiagram_state_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="002005c0-0001-0009-0000-000000000000" name="usecase" label="%usecase" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_usecase.png" />
+				<explorer path="res/bmp/staticdiagram_usecase.png" />
+				<diagram path="res/bmp/staticdiagram_usecase_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="2961d57b-5120-11de-bbaf-00218648fa3d" name="related_diagram" label="%related_diagram" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/relateddiagram.png" />
+				<explorer path="res/bmp/relateddiagram.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+    <stereotype uid="8fb43b1c-7819-11e1-a4f1-002564c97630" name="AutoDiagram" label="%AutoDiagram" metaclass="ClassDiagram" is-hidden="true">
+        <icons>
+            <small path="res/bmp/autodiagram.png" />
+            <explorer path="res/bmp/autodiagram.png" />
+            <diagram path="" />
+        </icons>
+    </stereotype>
+	</profile>
+	<profile uid="1be2e3fc-27ca-11e1-8d9c-002564c97630" name="Analyst">
+	  <!-- Dictionary -->
+		<anonymous-stereotype uid="67dbba9d-2d0c-11df-8003-00137279a5d1" metaclass="Dictionary">
+			<taggedvalues uid="69c6e0a5-2d0c-11df-8003-00137279a5d1" name="editionsize" label="%Size" parameter-card="*" is-hidden="true" is-signed="false" />
+		</anonymous-stereotype>
+		<stereotype uid="01ec1228-0000-17c9-0000-000000000000" name="dictionary" label="%dictionary" metaclass="Dictionary" is-hidden="true">
+			<icons>
+				<small path="res/bmp/dictionary.png" />
+				<explorer path="res/bmp/dictionary.png" />
+				<diagram path="res/bmp/bigdictionary.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec141c-0000-12fc-0000-000000000000" name="dictionary_propertyset" label="%dictionary_propertyset" metaclass="PropertySet" is-hidden="true">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0c02-0000-000000000000" name="dictionary_diagram" label="%dictionary_diagram" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_dictionary.png" />
+				<explorer path="res/bmp/staticdiagram_dictionary.png" />
+				<diagram path="res/bmp/staticdiagram_dictionary_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1228-0000-17cf-0000-000000000000" name="term" label="%term" metaclass="Term" is-hidden="true">
+			<icons>
+				<small path="res/bmp/term.png" />
+				<explorer path="res/bmp/term.png" />
+				<diagram path="res/bmp/bigterm.png" />
+			</icons>
+			<externdocumenttype uid="316a4eff-219e-11e1-b44e-002564c97630" name="term" label="%term" is-hidden="true" />
+			<taggedvalues uid="3a19d3f0-375e-11df-8692-00137279a5d1" name="editionsize" label="%Size" parameter-card="1" is-hidden="true" is-signed="false" />
+		</stereotype>
+		
+    <!-- business rule -->
+		<stereotype uid="01ec12fc-0000-0aca-0000-000000000000" name="business_rule_diagram" label="%business_rule_diagram" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_business_rule.png" />
+				<explorer path="res/bmp/staticdiagram_business_rule.png" />
+				<diagram path="res/bmp/staticdiagram_business_rule_image.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0a3c-0000-000000000000" name="business_rule" label="%business_rule" metaclass="Requirement" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirement_business_rule.png" />
+				<explorer path="res/bmp/requirement_business_rule.png" />
+				<diagram path="res/bmp/bigrequirement_business_rule.png" />
+			</icons>
+			<externdocumenttype uid="9ede8a0a-2176-11e1-a46e-002564c97630" name="business_rule" label="%business_rule" is-hidden="true" />
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0ac5-0000-000000000000" name="business_rule_container" label="%business_rule_container" metaclass="RequirementContainer" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirementcontainer_business_rule.png" />
+				<explorer path="res/bmp/requirementcontainer_business_rule.png" />
+				<diagram path="res/bmp/bigrequirementcontainer_business_rule.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec141c-0000-1301-0000-000000000000" name="business_rule_propertyset" label="%business_rule_propertyset" metaclass="PropertySet" is-hidden="true">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		
+		<!-- requirement -->
+		<anonymous-stereotype uid="3f729d49-2d0c-11df-8003-00137279a5d1" metaclass="RequirementContainer">
+			<taggedvalues uid="525a482e-2d0a-11df-9cca-00137279a5d1" name="editionsize" label="%Size" parameter-card="*" is-hidden="true" is-signed="false" />
+		</anonymous-stereotype>
+		<stereotype uid="01ec1228-0000-108e-0000-000000000000" name="requirement" label="%requirement" metaclass="Requirement" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirement.png" />
+				<explorer path="res/bmp/requirement.png" />
+				<diagram path="res/bmp/bigrequirement.png" />
+			</icons>
+			<externdocumenttype uid="9f290272-2176-11e1-a46e-002564c97630" name="requirement" label="%requirement" is-hidden="true" />
+			<taggedvalues uid="248a4be6-375e-11df-8692-00137279a5d1" name="editionsize" label="%Size" parameter-card="1" is-hidden="true" is-signed="false" />
+		</stereotype>
+		<stereotype uid="01ec1228-0000-1093-0000-000000000000" name="requirement_container" label="%requirement_container" metaclass="RequirementContainer" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirementcontainer.png" />
+				<explorer path="res/bmp/requirementcontainer.png" />
+				<diagram path="res/bmp/bigrequirementcontainer.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec141c-0000-12f7-0000-000000000000" name="requirement_propertyset" label="%requirement_propertyset" metaclass="PropertySet" is-hidden="true">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0bfd-0000-000000000000" name="requirement_diagram" label="%requirement_diagram" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_requirement.png" />
+				<explorer path="res/bmp/staticdiagram_requirement.png" />
+				<diagram path="res/bmp/staticdiagram_requirement_image.png" />
+			</icons>
+		</stereotype>
+		
+		<!-- goal -->
+		<stereotype uid="01ec12fc-0000-0271-0000-000000000000" name="goal" label="%goal" metaclass="Requirement" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirement_goal.png" />
+				<explorer path="res/bmp/requirement_goal.png" />
+				<diagram path="res/bmp/bigrequirement_goal.png" />
+			</icons>
+			<externdocumenttype uid="9f737ada-2176-11e1-a46e-002564c97630" name="goal" label="%goal" is-hidden="true" />
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0a32-0000-000000000000" name="goal_container" label="%goal_container" metaclass="RequirementContainer" is-hidden="true">
+			<icons>
+				<small path="res/bmp/requirementcontainer_goal.png" />
+				<explorer path="res/bmp/requirementcontainer_goal.png" />
+				<diagram path="res/bmp/bigrequirementcontainer_goal.png" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec141c-0000-12f2-0000-000000000000" name="goal_propertyset" label="%goal_propertyset" metaclass="PropertySet" is-hidden="true">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0a37-0000-000000000000" name="goal_diagram" label="%goal_diagram" metaclass="StaticDiagram" is-hidden="true">
+			<icons>
+				<small path="res/bmp/staticdiagram_goal.png" />
+				<explorer path="res/bmp/staticdiagram_goal.png" />
+				<diagram path="res/bmp/staticdiagram_goal_image.png" />
+			</icons>
+		</stereotype>
+		
+	  <!-- dependencies -->
+		<stereotype uid="01ec12fc-0000-00b7-0000-000000000000" name="part" label="%part" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_part.png" />
+				<explorer path="res/bmp/dependency_part.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-021a-0000-000000000000" name="derive" label="%derive" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_derive.png" />
+				<explorer path="res/bmp/dependency_derive.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0224-0000-000000000000" name="satisfy" label="%satisfy" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_satisfy.png" />
+				<explorer path="res/bmp/dependency_satisfy.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0229-0000-000000000000" name="verify" label="%verify" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_verify.png" />
+				<explorer path="res/bmp/dependency_verify.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0265-0000-000000000000" name="refers" label="%refers" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_refers.png" />
+				<explorer path="res/bmp/dependency_refers.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-021f-0000-000000000000" name="refine" label="%refine" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_refine.png" />
+				<explorer path="res/bmp/dependency_refine.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-023d-0000-000000000000" name="related" label="%related" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_related.png" />
+				<explorer path="res/bmp/dependency_related.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0260-0000-000000000000" name="implement" label="%implement" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_implement.png" />
+				<explorer path="res/bmp/dependency_implement.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0247-0000-000000000000" name="+influence" label="%positive_influence" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_positiveinfluence.png" />
+				<explorer path="res/bmp/dependency_positiveinfluence.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-024c-0000-000000000000" name="-influence" label="%negative_influence" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_negativeinfluence.png" />
+				<explorer path="res/bmp/dependency_negativeinfluence.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0251-0000-000000000000" name="guarantee" label="%guarantee" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_guarantee.png" />
+				<explorer path="res/bmp/dependency_guarantee.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0238-0000-000000000000" name="homonym" label="%homonym" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_homonym.png" />
+				<explorer path="res/bmp/dependency_homonym.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0256-0000-000000000000" name="measure" label="%measure" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_measure.png" />
+				<explorer path="res/bmp/dependency_measure.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0233-0000-000000000000" name="antonym" label="%antonym" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_antonym.png" />
+				<explorer path="res/bmp/dependency_antonym.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-025b-0000-000000000000" name="assigned" label="%assigned" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_assigned.png" />
+				<explorer path="res/bmp/dependency_assigned.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-022e-0000-000000000000" name="synonym" label="%synonym" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_synonym.png" />
+				<explorer path="res/bmp/dependency_synonym.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec12fc-0000-0242-0000-000000000000" name="context" label="%context" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_context.png" />
+				<explorer path="res/bmp/dependency_context.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="01ec1228-0000-12f8-0000-000000000000" name="kind-of" label="%kind-of" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="res/bmp/dependency_derive.png" />
+				<explorer path="res/bmp/dependency_derive.png" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+	</profile>
+	<profile uid="01ec045c-0000-3739-0000-000000000000" name="XMI">
+		<anonymous-stereotype uid="01ec045c-0000-10a1-0000-000000000000" metaclass="ModelElement">
+			<taggedvalues uid="01ec045c-0000-373f-0000-000000000000" name="XMIImported" label="%XMIImported" parameter-card="0" is-hidden="true" is-signed="false" />
+			<taggedvalues uid="1cbf4295-9bcf-11e0-8162-0027103f347c" name="NotExported" label="%NotExported" parameter-card="0" is-hidden="false" is-signed="false" />
+			<taggedvalues uid="46e094c2-6889-11e1-905a-0027103f347d" name="EcoreId" label="%EcoreId" parameter-card="0" is-hidden="true" is-signed="false" />
+		</anonymous-stereotype>
+		<anonymous-stereotype uid="7a804dc3-44ec-11e0-8f73-0027103f347c" metaclass="AssociationEnd">
+			<taggedvalues uid="7e92b0f6-44ec-11e0-8f73-0027103f347c" name="IsOwnedByClassifier" label="%isOwnedByClassifier" parameter-card="0" is-hidden="false" is-signed="false" />
+		</anonymous-stereotype>
+		<stereotype uid="b355cc6c-c4aa-11df-b100-001302895b2b" name="UML2Abstraction" label="%abstraction" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="0bd72298-5d08-11df-a996-001302895b2b" name="UML2ActionInputPin" label="%actionInputPin" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="994fc1e3-c2f9-11de-8ac8-001302895b2b" name="UML2AddStructuralFeatureValueAction" label="%addStructuralFeatureValueAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="89326f2e-c2fc-11de-8ac8-001302895b2b" name="UML2AddVariableValueAction" label="%addVariableValueAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ee97796b-de99-11de-905b-001302895b2b" name="UML2AssociationReference" label="%association" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="edc05471-5d08-11df-a996-001302895b2b" name="UML2BroadcastSignalAction" label="%broadcastSignalAction" metaclass="SendSignalAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="4a427283-5d09-11df-a996-001302895b2b" name="UML2ClassifierTemplateParameter" label="%classifierTemplateParameter" metaclass="TemplateParameter" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ed95fa9b-de99-11de-905b-001302895b2b" name="UML2ClassifierReference" label="%classifier" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="89927bbf-c2f9-11de-8ac8-001302895b2b" name="UML2ClearAssociationAction" label="%clearAssociationAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="9fb5321d-c2fc-11de-8ac8-001302895b2b" name="UML2ClearStructuralFeatureAction" label="%clearStructuralFeatureAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="b071b025-c2fc-11de-8ac8-001302895b2b" name="UML2ClearVariableAction" label="%clearVariableAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="8ed6276e-5821-11df-be59-001302895b2b" name="UML2CommunicationPath" label="%communicationPath" metaclass="Association" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="99bf7919-5d09-11df-a996-001302895b2b" name="UML2ComponentRealization" label="%componentRealization" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ff6e0375-5d09-11df-a996-001302895b2b" name="UML2ConnectableElementTemplateParameter" label="%connectableElementTemplateParameter" metaclass="TemplateParameter" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="67694a37-c2f9-11de-8ac8-001302895b2b" name="UML2CreateLinkAction" label="%createLinkAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="f8e58a85-c2fa-11de-8ac8-001302895b2b" name="UML2CreateLinkObjectAction" label="%createLinkObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="5582e283-c2f9-11de-8ac8-001302895b2b" name="UML2CreateObjectAction" label="%createObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="4edcbbef-5d0a-11df-a996-001302895b2b" name="UML2CreationEvent" label="%creationEvent" metaclass="Event" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="6faa55e3-5d0b-11df-a996-001302895b2b" name="UML2Deployment" label="%deployment" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="8c44d73d-5d0b-11df-a996-001302895b2b" name="UML2DeploymentSpecification" label="%deploymentSpecification" metaclass="Artifact" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="744f6321-c2f9-11de-8ac8-001302895b2b" name="UML2DestroyLinkAction" label="%destroyLinkAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="cf671bc3-c2f9-11de-8ac8-001302895b2b" name="UML2DestroyObjectAction" label="%destroyObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="c0f03827-5d0b-11df-a996-001302895b2b" name="UML2DestructionEvent" label="%destructionEvent" metaclass="Event" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="6f3c6234-52b8-11df-a320-001302895b2b" name="UML2Device" label="%device" metaclass="Node" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ee06097f-de99-11de-905b-001302895b2b" name="UML2EndCreationDataReference" label="%endCreationData" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="5d167c0f-df53-11de-b2b1-001302895b2b" name="UML2EndData_Reference" label="%endCreationData" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="a74178fb-df2b-11de-905b-001302895b2b" name="UML2EndDestructionDataReference" label="%endDestructionData" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="6f99afff-df2d-11de-905b-001302895b2b" name="IsDestroyDuplicates" label="%isDestroyDuplicates" parameter-card="0" is-hidden="false" is-signed="false" />
+		</stereotype>
+		<stereotype uid="1b7fd53f-205e-11df-948e-001302895b2b" name="UML2ExceptionHandler" label="%exceptionHandler" metaclass="ObjectFlow" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="4e477e48-35b4-11df-9280-001302895b2b" name="UML2ExceptionTypeReference" label="%exceptionType" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="8e76c95f-5821-11df-be59-001302895b2b" name="UML2ExecutionEnvironment" label="%executionEnvironment" metaclass="Node" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="15d2108f-5d0c-11df-a996-001302895b2b" name="UML2ExecutionEvent" label="%executionEvent" metaclass="Event" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="1b1ba62d-205e-11df-948e-001302895b2b" name="UML2ExpansionNode" label="%expansionNode" metaclass="Pin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="07111319-1fd7-11df-948e-001302895b2b" name="UML2ExpansionRegion" label="%expansionRegion" metaclass="StructuredActivityNode" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="5930231e-3117-11df-b4ad-001302895b2b" name="Mode" label="%mode" parameter-card="1" is-hidden="true" is-signed="false" />
+		</stereotype>
+		<stereotype uid="4b4745a9-5d0c-11df-a996-001302895b2b" name="UML2Extension" label="%extension" metaclass="Association" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="770df309-5d0c-11df-a996-001302895b2b" name="UML2ExtensionEnd" label="%extensionEnd" metaclass="AssociationEnd" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="37d0688a-c308-11de-8ac8-001302895b2b" name="UML2First" label="%first" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="40400bbd-0b5d-11df-8680-001302895b2b" name="UML2GeneralizationSet" label="%generalizationSet" metaclass="Generalization" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="c2c549ec-26ab-11df-ac88-001302895b2b" name="Id" label="%Id" parameter-card="1" is-hidden="false" is-signed="false" />
+		</stereotype>
+		<stereotype uid="021863a9-f3db-11df-8ada-0027103f347c" name="UML2Interaction " label="%interaction" metaclass="Activity" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="e4358003-f3da-11df-8ada-0027103f347c" name="UML2InteractionOverviewDiagram " label="%Interaction_Overview_Diagram" metaclass="StaticDiagram" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ec22d8ff-de86-11de-905b-001302895b2b" name="UML2InsertAt" label="%insertAt" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="e445c33b-de99-11de-905b-001302895b2b" name="UML2MethodReference" label="%method" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="07ba6521-5d0d-11df-a996-001302895b2b" name="UML2OperationTemplateParameter" label="%operationTemplateParameter" metaclass="Parameter" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="3edfb381-5d0d-11df-a996-001302895b2b" name="UML2ProtocolConformance" label="%protocolConformance" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="d09356f1-c2fc-11de-8ac8-001302895b2b" name="UML2RaiseExceptionAction" label="%raiseExceptionAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="c4b3add1-c2f9-11de-8ac8-001302895b2b" name="UML2ReadExtentAction" label="%readExtentAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="e4c6c55f-c2fc-11de-8ac8-001302895b2b" name="UML2ReadIsClassifierObjectAction" label="%readIsClassifierObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="6e2770bf-c2f9-11de-8ac8-001302895b2b" name="UML2ReadLinkAction" label="%readLinkAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="f9061fa3-c2fc-11de-8ac8-001302895b2b" name="UML2ReadLinkObjectEndAction" label="%readLinkObjectEndAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="06edcdd9-c2fd-11de-8ac8-001302895b2b" name="UML2ReadLinkObjectEndQualifierAction" label="%readLinkObjectEndQualifierAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="120a35e7-c2fd-11de-8ac8-001302895b2b" name="UML2ReadSelfAction" label="%readSelfAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="b9654705-c2f9-11de-8ac8-001302895b2b" name="UML2ReadStructuralFeatureAction" label="%readStructuralFeatureAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="1abd18db-c2fd-11de-8ac8-001302895b2b" name="UML2ReadVariableAction" label="%readVariableAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="a46b20b8-26ab-11df-ac88-001302895b2b" name="UML2Reception" label="%reception" metaclass="Operation" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="229bc921-c2fd-11de-8ac8-001302895b2b" name="UML2ReclassifyObjectAction" label="%reclassifyObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="90a0e341-5d0d-11df-a996-001302895b2b" name="UML2RedefinableTemplateSignature" label="%redefinableTemplateSignature" metaclass="Operation" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="2eb4ec1b-c2fd-11de-8ac8-001302895b2b" name="UML2ReduceAction" label="%reduceAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="35b84299-c2fd-11de-8ac8-001302895b2b" name="UML2RemoveStructuralFeatureAction" label="%removeStructuralFeatureAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="435869cb-c2fd-11de-8ac8-001302895b2b" name="UML2RemoveVariableValueAction" label="%removeVariableValueAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="c6a579b6-5d0d-11df-a996-001302895b2b" name="UML2ReplyAction" label="%replyAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="3f03c5f1-c308-11de-8ac8-001302895b2b" name="UML2Second" label="%second" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="52d7cccb-c2fd-11de-8ac8-001302895b2b" name="UML2SendObjectAction" label="%sendObjectAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="fca54004-5d0d-11df-a996-001302895b2b" name="UML2SequenceNode" label="%sequenceNode" metaclass="StructuredActivityNode" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="5d357779-c2fd-11de-8ac8-001302895b2b" name="UML2StartClassifierBehaviorAction" label="%startClassifierBehaviorAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="ed0bb1c3-de99-11de-905b-001302895b2b" name="UML2StructuralFeatureReference" label="%structuralFeature" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="aa99ee06-c495-11de-ada1-001302895b2b" name="UML2Target" label="%target" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="554cb8bb-5d0e-11df-a996-001302895b2b" name="UML2TemplateSignature" label="%templateSignature" metaclass="Operation" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="6a3f6989-c2fd-11de-8ac8-001302895b2b" name="UML2TestIdentityAction" label="%testIdentityAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="76c174ab-c2fd-11de-8ac8-001302895b2b" name="UML2UnmarshallAction" label="%unmarshallAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="eb8f06b7-de86-11de-905b-001302895b2b" name="UML2Value" label="%value" metaclass="InputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="1c0bf642-a90f-11de-8613-001302895b2b" name="UML2ValueSpecificationAction" label="%valueSpecificationAction" metaclass="OpaqueAction" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="b1935f69-ac36-11de-aefc-001302895b2b" name="Value" label="%Value" parameter-card="1" is-hidden="false" is-signed="false" />
+		</stereotype>
+		<stereotype uid="33ea7558-fb93-11df-8b5e-0027103f347c" name="UML2Signal" label="%signal" metaclass="Dependency" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="fdbc7d78-32c7-11e0-91f3-0027103f347c" name="UML2BodyOutput" label="%bodyOutput" metaclass="OutputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="27ac6d48-32c8-11e0-91f3-0027103f347c" name="UML2Decider" label="%decider" metaclass="OutputPin" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="76f275f9-32d9-11e0-91f3-0027103f347c" name="UML2Body" label="%body" metaclass="ActivityNode" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="86eada10-32d9-11e0-91f3-0027103f347c" name="UML2SetUp" label="%setup" metaclass="ActivityNode" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+		</stereotype>
+		<stereotype uid="bae91a3b-7009-11e0-a462-0027103f347c" name="UML2StereotypeProperty" label="%Stereotype_Property" metaclass="Class" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="c28e8b06-7009-11e0-a462-0027103f347c" name="Property" label="%Property" parameter-card="1" is-hidden="false" is-signed="false" />
+		</stereotype>
+		<stereotype uid="68c63e60-70d6-11e0-872f-0027103f347c" name="UML2PropertyType" label="%Property_type" metaclass="Attribute" is-hidden="false">
+			<icons>
+				<small path="" />
+				<explorer path="" />
+				<diagram path="" />
+			</icons>
+			<taggedvalues uid="68c63e61-70d6-11e0-872f-0027103f347c" name="Type" label="%Type" parameter-card="1" is-hidden="false" is-signed="false" />
+		</stereotype>
+	</profile>	
+</module>
\ No newline at end of file
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module_fr.properties b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module_fr.properties
new file mode 100644
index 0000000..a252ffd
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/module_fr.properties
@@ -0,0 +1,206 @@
+MdacLabel=Extensions
+MdacDescription=Extensions standards de Modelio UML Modeler.
+
+AutoDiagram = Auto Diagram
+abstraction	= Abstraction
+access	= Access
+actionInputPin	= Action Input Pin
+addStructuralFeatureValueAction	= Add Structural Feature Value Action
+addVariableValueAction	= Add Variable Value Action
+analysis = Analyse
+antonym	= Antonym
+assigned	= Assigned
+association	= Association
+body	= Body
+bodyOutput	= Body Output
+broadcastSignalAction	= Broadcast Signal Action
+business_rule	= Business Rule
+business_rule_container	= Business Rule Container
+business_rule_diagram	= Business Rule Diagram
+business_rule_propertyset	= Business Rule Propertyset
+catch	= Catch
+cause_depth	= Cause Depth
+class	= Class
+classifier	= Classifier
+classifierTemplateParameter	= Classifier Template Parameter
+clearAssociationAction	= Clear Association Action
+clearStructuralFeatureAction	= Clear Structural Feature Action
+clearVariableAction	= Clear Variable Action
+collaboration	= Collaboration
+comment	= Comment
+communication	= Communication
+communicationPath	= Communication Path
+complete	= Complete
+componentRealization	= Component Realization
+connectableElementTemplateParameter	= Connectable Element Template Parameter
+consequence_depth	= Consequence Depth
+constraint	= Constraint
+context	= Context
+create	= Create
+createLinkAction	= Create Link Action
+createLinkObjectAction	= Create Link Object Action
+createObjectAction	= Create Object Action
+creationEvent	= Creation Event
+decider	= Decider
+deployment	= Deployment
+deploymentSpecification	= Deployment Specification
+derive	= Derive
+description	= Description
+design	= Design
+design_pattern	= Design Pattern
+destroy	= Destroy
+destroyed	= Destroyed
+destroyLinkAction	= Destroy Link Action
+destroyObjectAction	= Destroy Object Action
+destructionEvent	= Destruction Event
+device	= Device
+dictionary	= Dictionary
+dictionary_diagram	= Dictionary Diagram
+dictionary_propertyset	= Dictionary Propertyset
+disjoin	= Disjoin
+EcoreId = Ecore Id
+endCreationData	=  End Creation Data
+endDestructionData	= End Destruction Data
+exception	= Exception
+exceptionHandler	= Exception Handler
+exceptionType	= Exception Type
+executable	= Executable
+executionEnvironment	= Execution Environment
+executionEvent	= Execution Event
+expansionNode	= Expansion Node
+expansionRegion	= Expansion Region
+extend	= Extend
+extension	= Extension
+extensionEnd	= Extension End
+External_document	= External Document
+facade	= Facade
+first	= First
+flow	= Flow
+frameWork	= FrameWork
+friend	= Friend
+generalizationSet	= Generalization Set
+generatedDiagram	= Generated Diagram
+goal	= Goal
+goal_container	= Goal Container
+goal_diagram	= Goal Diagram
+goal_propertyset	= Goal Propertyset
+guarantee	= Guarantee
+homonym	= Homonym
+Id	= Id
+impact	= Impact
+impact_root	= Impact Root
+impact_subroot	= Impact Subroot
+implement	= Implement
+implementation	= Implementation
+implementationClass	= Implementation Class
+implicit	=  Implicit
+import	= Import
+include	= Include
+incomplete	= Incomplete
+insertAt	= Insert At
+instantiate	= Instantiate
+interaction	= Interaction
+Interaction_Overview_Diagram	= Interaction Overview Diagram
+invariant	= Invariant
+Is_a_link	= Est un lien
+isDestroyDuplicates	=  Is Destroy Duplicates
+isOwnedByClassifier	= Appartient au Classifier
+JEvaluation	= J Evaluation
+kind-of	= Kind-of
+Label_for_a_link	= Label du lien
+library	= Library
+measure	= Measure
+metaclass	= Metaclass
+metamodel	= Metamodel
+method	= Method
+mode	= Mode
+ModelComponent	= Model Component
+ModelComponentArchive	= Model Component Archive
+ModelComponentFiles	= Model Component Files
+ModelComponentVersion	= Model Component Version
+negative_influence	= -influence
+new	= New
+nocode	= Pas de code
+nodoc = Pas de documentation
+non-functional_constraint	= Non-functional Constraint
+NotExported	= Non export\u00E9 avec XMI
+object	= Object
+operationTemplateParameter	= Operation Template Parameter
+ordered	= Ordonn\u00E9
+overlapping	= Overlapping
+part	= Part
+persistence	= Persistance
+positive_influence	= +influence
+postcondition	= Postcondition
+precondition	= Precondition
+primary	= Primary
+process	= Process
+Property	= Property
+Property_type	= Property Type
+protocolConformance	= Protocol Conformance
+qualifier	= Qualifier 
+raiseExceptionAction	= Raise Exception Action
+readExtentAction	= Read Extent Action
+readIsClassifierObjectAction	= Read Is Classifier Object Action
+readLinkAction	= Read Link Action
+readLinkObjectEndAction	= Read Link Object End Action
+readLinkObjectEndQualifierAction	= Read Link Object End Qualifier Action
+readSelfAction	= Read Self Action
+readStructuralFeatureAction	= Read Structural Feature Action
+readVariableAction	= Read Variable Action
+reception	= Reception
+reclassifyObjectAction	= Reclassify Object Action
+redefinableTemplateSignature	= Redefinable Template Signature
+reduceAction	= Reduce Action
+refers	= Refers
+refine	= Refine
+related	= Related
+related_diagram	= Related Diagram
+removeStructuralFeatureAction	= Remove Structural Feature Action
+removeVariableValueAction	= Remove Variable Value Action
+replyAction	= Reply Action
+requirement	= Requirement
+requirement_container	= Requirement Container
+requirement_diagram	= Requirement Diagram
+requirement_propertyset	= Requirement Propertyset
+satisfy	= Satisfy
+scenario	= Scenario
+second	= Second
+secondary	= Secondary
+sendObjectAction	= Send Object Action
+sequenceNode	=  Sequence Node
+setup	= Setup
+signal	= Signal
+Size	= Size
+specification	= Specification
+startClassifierBehaviorAction	= Start Classifier Behavior Action
+state	= State
+Stereotype_Property	= Stereotype Property
+structuralFeature	= Structural Feature
+stub	= Stub
+subset	= Subset
+subsystem	= Subsystem
+summary	=  Summary
+synonym	= Synonym
+system	= System
+target	= Target
+templateSignature	= Template Signature
+term	= Term
+test	= Test
+testIdentityAction	= Test Identity Action
+throw	= Throw
+topLevel	= Top Level
+trace	= Trace
+transient	= Transient
+type	= Type
+Type	= Type
+undefined	= Undefined
+unmarshallAction	= Unmarshall Action
+usecase	= Usecase
+utility	= Utility
+value	= Value
+Value = Value
+valueSpecificationAction	= Value Specification Action
+verify	= Verify
+XMIImported	= XMI Imported
+xor	= Xor
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/autodiagram.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/autodiagram.png
new file mode 100644
index 0000000..9ae443d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/autodiagram.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigdictionary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigdictionary.png
new file mode 100644
index 0000000..8150513
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigdictionary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigprimary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigprimary.png
new file mode 100644
index 0000000..afd9860
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigprimary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement.png
new file mode 100644
index 0000000..17ceec8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_business_rule.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_business_rule.png
new file mode 100644
index 0000000..cf43634
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_business_rule.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_goal.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_goal.png
new file mode 100644
index 0000000..f204053
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirement_goal.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer.png
new file mode 100644
index 0000000..edbb825
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_business_rule.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_business_rule.png
new file mode 100644
index 0000000..5e839a3
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_business_rule.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_goal.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_goal.png
new file mode 100644
index 0000000..c3f6299
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigrequirementcontainer_goal.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigscenario.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigscenario.png
new file mode 100644
index 0000000..2e525eb
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigscenario.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsecondary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsecondary.png
new file mode 100644
index 0000000..84aea55
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsecondary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsystem.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsystem.png
new file mode 100644
index 0000000..2a8b217
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigsystem.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigterm.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigterm.png
new file mode 100644
index 0000000..5c73556
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/bigterm.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dataflow.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dataflow.png
new file mode 100644
index 0000000..3accfa8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dataflow.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_antonym.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_antonym.png
new file mode 100644
index 0000000..e77c562
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_antonym.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_assigned.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_assigned.png
new file mode 100644
index 0000000..4b35613
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_assigned.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_context.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_context.png
new file mode 100644
index 0000000..960ce77
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_context.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_derive.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_derive.png
new file mode 100644
index 0000000..068b7cb
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_derive.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_guarantee.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_guarantee.png
new file mode 100644
index 0000000..f221124
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_guarantee.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_homonym.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_homonym.png
new file mode 100644
index 0000000..d1a9f1d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_homonym.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_impacted.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_impacted.png
new file mode 100644
index 0000000..6be3245
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_impacted.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_implement.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_implement.png
new file mode 100644
index 0000000..ebd4114
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_implement.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_measure.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_measure.png
new file mode 100644
index 0000000..551302f
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_measure.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_negativeinfluence.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_negativeinfluence.png
new file mode 100644
index 0000000..1c30ae8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_negativeinfluence.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_part.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_part.png
new file mode 100644
index 0000000..db91d23
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_part.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_positiveinfluence.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_positiveinfluence.png
new file mode 100644
index 0000000..e4952f5
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_positiveinfluence.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refers.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refers.png
new file mode 100644
index 0000000..7cb865e
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refers.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refine.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refine.png
new file mode 100644
index 0000000..b709a42
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_refine.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_related.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_related.png
new file mode 100644
index 0000000..c5c1e22
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_related.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_satisfy.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_satisfy.png
new file mode 100644
index 0000000..bf3c057
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_satisfy.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_synonym.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_synonym.png
new file mode 100644
index 0000000..b71a638
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_synonym.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_verify.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_verify.png
new file mode 100644
index 0000000..3916074
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dependency_verify.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/designpattern_icon.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/designpattern_icon.png
new file mode 100644
index 0000000..e38d7f8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/designpattern_icon.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionary.png
new file mode 100644
index 0000000..0466994
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionarybrowser.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionarybrowser.png
new file mode 100644
index 0000000..0466994
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/dictionarybrowser.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/externalDocument.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/externalDocument.png
new file mode 100644
index 0000000..553610d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/externalDocument.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_constructor.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_constructor.png
new file mode 100644
index 0000000..b79648a
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_constructor.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_destructor.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_destructor.png
new file mode 100644
index 0000000..a4f83d1
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/operation_destructor.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/primary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/primary.png
new file mode 100644
index 0000000..25108af
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/primary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/raisedexception.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/raisedexception.png
new file mode 100644
index 0000000..fb935b3
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/raisedexception.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramc.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramc.png
new file mode 100644
index 0000000..0888e52
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramc.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramcarchive.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramcarchive.png
new file mode 100644
index 0000000..27e121e
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/ramcarchive.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement.png
new file mode 100644
index 0000000..1187705
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_business_rule.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_business_rule.png
new file mode 100644
index 0000000..bc58271
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_business_rule.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_goal.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_goal.png
new file mode 100644
index 0000000..5b51e60
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirement_goal.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementbrowser.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementbrowser.png
new file mode 100644
index 0000000..1187705
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementbrowser.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer.png
new file mode 100644
index 0000000..364d124
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_business_rule.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_business_rule.png
new file mode 100644
index 0000000..e0bf87d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_business_rule.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_goal.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_goal.png
new file mode 100644
index 0000000..31f3dc1
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainer_goal.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainerbrowser.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainerbrowser.png
new file mode 100644
index 0000000..35bf978
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementcontainerbrowser.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementproject.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementproject.png
new file mode 100644
index 0000000..d97904d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/requirementproject.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/scenario.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/scenario.png
new file mode 100644
index 0000000..247031a
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/scenario.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/secondary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/secondary.png
new file mode 100644
index 0000000..1247a8e
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/secondary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_48x48.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_48x48.png
new file mode 100644
index 0000000..cce31cc
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_48x48.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule.png
new file mode 100644
index 0000000..5536767
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule_image.png
new file mode 100644
index 0000000..dff0f7c
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_business_rule_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class.png
new file mode 100644
index 0000000..2f0b9a1
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class_image.png
new file mode 100644
index 0000000..c2cafdf
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_class_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration.png
new file mode 100644
index 0000000..7fd2e6d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration_image.png
new file mode 100644
index 0000000..0b8b77f
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_collaboration_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication.png
new file mode 100644
index 0000000..eaa4dfc
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication_image.png
new file mode 100644
index 0000000..ecf486a
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_communication_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment.png
new file mode 100644
index 0000000..eb3bec1
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment_image.png
new file mode 100644
index 0000000..2e71fb1
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_deployment_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary.png
new file mode 100644
index 0000000..176addd
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary_image.png
new file mode 100644
index 0000000..9795952
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_dictionary_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal.png
new file mode 100644
index 0000000..f26ec1c
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal_image.png
new file mode 100644
index 0000000..8827827
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_goal_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_image.png
new file mode 100644
index 0000000..d86b818
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact.png
new file mode 100644
index 0000000..7c8d840
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact_image.png
new file mode 100644
index 0000000..9d7bc2d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_impact_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object.png
new file mode 100644
index 0000000..a24825d
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object_image.png
new file mode 100644
index 0000000..9bf59d3
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_object_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement.png
new file mode 100644
index 0000000..62524e2
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement_image.png
new file mode 100644
index 0000000..1248133
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_requirement_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence.png
new file mode 100644
index 0000000..fae47a8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence_image.png
new file mode 100644
index 0000000..422fa2a
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_sequence_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state.png
new file mode 100644
index 0000000..2635031
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state_image.png
new file mode 100644
index 0000000..6179969
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_state_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase.png
new file mode 100644
index 0000000..4af434b
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase_image.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase_image.png
new file mode 100644
index 0000000..a0dbf2e
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/staticdiagram_usecase_image.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/subsystem.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/subsystem.png
new file mode 100644
index 0000000..c317b81
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/subsystem.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/system.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/system.png
new file mode 100644
index 0000000..52d23b2
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/system.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/term.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/term.png
new file mode 100644
index 0000000..f08c427
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/term.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/traceability.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/traceability.png
new file mode 100644
index 0000000..70b045e
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/traceability.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyextend.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyextend.png
new file mode 100644
index 0000000..afee929
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyextend.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyinclude.png b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyinclude.png
new file mode 100644
index 0000000..62ebee0
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelerModule/res/bmp/usecasedependencyinclude.png differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/lib/ModelingWizard.jar b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/lib/ModelingWizard.jar
new file mode 100644
index 0000000..8e371a8
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/lib/ModelingWizard.jar differ
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.properties b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.properties
new file mode 100644
index 0000000..89b5bba
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.properties
@@ -0,0 +1,2 @@
+MdacLabel=Modeling Wizard
+MdacDescription=This module is used to create model elements from other elements through deduction, allowing you to significantly improve productivity, coherence and traceability.
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.xml b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.xml
new file mode 100644
index 0000000..4f277f4
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module.xml
@@ -0,0 +1,5 @@
+<module uid="01ec07a4-0000-129e-0000-000000000000" name="ModelingWizard" class="com.modeliosoft.modelio.modelingwizard.impl.ModelingWizardMdac" version = "4.0.05.8008" binaryversion = "2.1.00.8008" licenseRequired = "false">
+  <classpath>
+      <entry path = "lib/ModelingWizard.jar"/>
+  </classpath>
+</module>
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_en.properties b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_en.properties
new file mode 100644
index 0000000..264b800
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_en.properties
@@ -0,0 +1,2 @@
+MdacDescription=This module is used to create model elements from other elements through deduction, allowing you to significantly improve productivity, coherence and traceability.
+MdacLabel=Modeling Wizard
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_fr.properties b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_fr.properties
new file mode 100644
index 0000000..86d21f3
--- /dev/null
+++ b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/module_fr.properties
@@ -0,0 +1,4 @@
+#Generated by MDA Designer
+#Wed Mar 18 15:07:15 CET 2009
+MdacDescription=Ce module permet de cr�er des �l�ments de mod�le par d�duction � partir d'autres �l�ments, vous permettant ainsi de faire des gains significatifs en productivit�, coh�rence et tra�abilit�.
+MdacLabel=Modeling Wizard
diff --git a/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/res/bmp/ModelingWizard.png b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/res/bmp/ModelingWizard.png
new file mode 100644
index 0000000..a0540ff
Binary files /dev/null and b/gatb-core/doc/design/modelio/GATB/mda/ModelingWizard/res/bmp/ModelingWizard.png differ
diff --git a/gatb-core/doc/doxygen/doxygen.css b/gatb-core/doc/doxygen/doxygen.css
new file mode 100644
index 0000000..57589df
--- /dev/null
+++ b/gatb-core/doc/doxygen/doxygen.css
@@ -0,0 +1,1183 @@
+/* The standard CSS for doxygen $doxygenversion */
+
+body, table, div, p, dl {
+    font: 400 14px/19px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+    font-size: 150%;
+}
+
+.title {
+    font-size: 250%;
+    font-weight: bold;
+    margin: 10px 2px;
+}
+
+h2.groupheader {
+    border-bottom: 1px solid ##99;
+    color: ##44;
+    font-size: 150%;
+    font-weight: normal;
+    margin-top: 1.75em;
+    padding-top: 8px;
+    padding-bottom: 4px;
+    width: 100%;
+}
+
+h3.groupheader {
+    font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    -webkit-transition: text-shadow 0.5s linear;
+    -moz-transition: text-shadow 0.5s linear;
+    -ms-transition: text-shadow 0.5s linear;
+    -o-transition: text-shadow 0.5s linear;
+    transition: text-shadow 0.5s linear;
+    margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+    text-shadow: 0 0 15px cyan;
+}
+
+dt {
+    font-weight: bold;
+}
+
+div.multicol {
+    -moz-column-gap: 1em;
+    -webkit-column-gap: 1em;
+    -moz-column-count: 3;
+    -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+    margin-top: 2px;
+}
+
+p.endli {
+    margin-bottom: 0px;
+}
+
+p.enddd {
+    margin-bottom: 4px;
+}
+
+p.endtd {
+    margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+    font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+    background-color: ##ee;
+    border: 1px solid ##b0;
+    text-align: center;
+}
+
+div.qindex, div.navpath {
+    width: 100%;
+    line-height: 140%;
+}
+
+div.navtab {
+    margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+    color: ##50;
+    font-weight: normal;
+    text-decoration: none;
+}
+
+.contents a:visited {
+    color: ##60;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+a.qindex {
+    font-weight: bold;
+}
+
+a.qindexHL {
+    font-weight: bold;
+    background-color: ##AA;
+    color: #ffffff;
+    border: 1px double ##98;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+    font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+    color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited {
+    color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+    margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 10px;
+        margin:  10px;
+    background-color: #FFFEFA;
+    border: 1px solid #C4CFE5;
+}
+
+div.line {
+    font-family: monospace, fixed;
+        font-size: 13px;
+    min-height: 13px;
+    line-height: 1.0;
+    text-wrap: unrestricted;
+    white-space: -moz-pre-wrap; /* Moz */
+    white-space: -pre-wrap;     /* Opera 4-6 */
+    white-space: -o-pre-wrap;   /* Opera 7 */
+    white-space: pre-wrap;      /* CSS3  */
+    word-wrap: break-word;      /* IE 5.5+ */
+    text-indent: -53px;
+    padding-left: 53px;
+    padding-bottom: 0px;
+    margin: 0px;
+    -webkit-transition-property: background-color, box-shadow;
+    -webkit-transition-duration: 0.5s;
+    -moz-transition-property: background-color, box-shadow;
+    -moz-transition-duration: 0.5s;
+    -ms-transition-property: background-color, box-shadow;
+    -ms-transition-duration: 0.5s;
+    -o-transition-property: background-color, box-shadow;
+    -o-transition-duration: 0.5s;
+    transition-property: background-color, box-shadow;
+    transition-duration: 0.5s;
+}
+
+div.line.glow {
+    background-color: cyan;
+    box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+    padding-right: 4px;
+    text-align: right;
+    border-right: 2px solid #0F0;
+    background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+    background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+    background-color: #C8C8C8;
+}
+
+div.ah {
+    background-color: black;
+    font-weight: bold;
+    color: #ffffff;
+    margin-bottom: 3px;
+    margin-top: 3px;
+    padding: 0.2em;
+    border: solid thin #333;
+    border-radius: 0.5em;
+    -webkit-border-radius: .5em;
+    -moz-border-radius: .5em;
+    box-shadow: 2px 2px 3px #999;
+    -webkit-box-shadow: 2px 2px 3px #999;
+    -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+    background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+    margin-left: 16px;
+    margin-top: 12px;
+    font-weight: bold;
+}
+
+div.groupText {
+    margin-left: 16px;
+    font-style: italic;
+}
+
+body {
+    background-color: white;
+    color: black;
+        margin: 0;
+}
+
+div.contents {
+    margin-top: 10px;
+    margin-left: 12px;
+    margin-right: 8px;
+}
+
+td.indexkey {
+    background-color: ##ee;
+    font-weight: bold;
+    border: 1px solid ##cc;
+    margin: 2px 0px 2px 0;
+    padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+    background-color: ##ee;
+    border: 1px solid ##cc;
+    padding: 2px 10px;
+    margin: 2px 0px;
+}
+
+tr.memlist {
+    background-color: ##f0;
+}
+
+p.formulaDsp {
+    text-align: center;
+}
+
+img.formulaDsp {
+    
+}
+
+img.formulaInl {
+    vertical-align: middle;
+}
+
+div.center {
+    text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+    border: 0px;
+}
+
+address.footer {
+    text-align: right;
+    padding-right: 12px;
+}
+
+img.footer {
+    border: 0px;
+    vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+    color: #545454
+}
+
+span.keywordtype {
+    color: #545454
+}
+
+span.keywordflow {
+    color: #545454
+}
+
+span.comment {
+    color: #2B7A2B
+}
+
+span.preprocessor {
+    color: #545454
+}
+
+span.stringliteral {
+    color: #545454
+}
+
+span.charliteral {
+    color: #545454
+}
+
+span.vhdldigit { 
+    color: #ff00ff 
+}
+
+span.vhdlchar { 
+    color: #000000 
+}
+
+span.vhdlkeyword { 
+    color: #700070 
+}
+
+span.vhdllogic { 
+    color: #ff0000 
+}
+
+blockquote {
+        background-color: ##F8;
+        border-left: 2px solid ##FF;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+    color: #003399;
+    font-weight: bold;
+}
+
+form.search {
+    margin-bottom: 0px;
+    margin-top: 0px;
+}
+
+input.search {
+    font-size: 75%;
+    color: #000080;
+    font-weight: normal;
+    background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+    font-size: 75%;
+}
+
+.dirtab {
+    padding: 4px;
+    border-collapse: collapse;
+    border: 1px solid ##b0;
+}
+
+th.dirtab {
+    background: ##ee;
+    font-weight: bold;
+}
+
+hr {
+    height: 0px;
+    border: none;
+    border-top: 1px solid ##66;
+}
+
+hr.footer {
+    height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+    border-spacing: 0px;
+    padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+    -webkit-transition-property: background-color, box-shadow;
+    -webkit-transition-duration: 0.5s;
+    -moz-transition-property: background-color, box-shadow;
+    -moz-transition-duration: 0.5s;
+    -ms-transition-property: background-color, box-shadow;
+    -ms-transition-duration: 0.5s;
+    -o-transition-property: background-color, box-shadow;
+    -o-transition-duration: 0.5s;
+    transition-property: background-color, box-shadow;
+    transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+    background-color: cyan;
+    box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+    background-color: ##FA;
+    border: none;
+    margin: 4px;
+    padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+    padding: 0px 8px 4px 8px;
+    color: #555;
+}
+
+.memSeparator {
+        border-bottom: 1px solid #DEE4F0;
+        line-height: 1px;
+        margin: 0px;
+        padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+    width: 100%;
+}
+
+.memTemplParams {
+    color: ##60;
+        white-space: nowrap;
+    font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+    font-size: 80%;
+    color: ##60;
+    font-weight: normal;
+    margin-left: 9px;
+}
+
+.memnav {
+    background-color: ##ee;
+    border: 1px solid ##b0;
+    text-align: center;
+    margin: 2px;
+    margin-right: 15px;
+    padding: 2px;
+}
+
+.mempage {
+    width: 100%;
+}
+
+.memitem {
+    padding: 0;
+    margin-bottom: 10px;
+    margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memname td {
+    vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid ##B4;
+        border-left: 1px solid ##B4;
+        border-right: 1px solid ##B4;
+        padding: 6px 0px 6px 0px;
+        color: ##2b;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: ##E6;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        -moz-border-radius-topleft: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+        -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid ##B4;      
+        border-left: 1px solid ##B4;      
+        border-right: 1px solid ##B4; 
+        padding: 6px 10px 2px 10px;
+        background-color: ##FC;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+    text-align: right;
+}
+
+.paramtype {
+    white-space: nowrap;
+}
+
+.paramname {
+    color: #602020;
+    white-space: nowrap;
+}
+.paramname em {
+    font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+    border-spacing: 0px;
+}
+
+td.mlabels-left {
+    width: 100%;
+    padding: 0px;
+}
+
+td.mlabels-right {
+    vertical-align: bottom;
+    padding: 0px;
+    white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: ##88;
+        border-top:1px solid ##70;
+        border-left:1px solid ##70;
+        border-right:1px solid ##CC;
+        border-bottom:1px solid ##CC;
+    text-shadow: none;
+    color: white;
+    margin-right: 4px;
+    padding: 2px 3px;
+    border-radius: 3px;
+    font-size: 7pt;
+    white-space: nowrap;
+    vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+    vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+    padding-right: 6px;
+    padding-top: 3px;
+    border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+    padding-left: 6px;
+    background-color: ##F8;
+}
+
+.directory img {
+    vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+    color: ##50;
+}
+
+div.dynheader {
+        margin-top: 8px;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+address {
+    font-style: normal;
+    color: ##33;
+}
+
+table.doxtable {
+    border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+    border: 1px solid ##37;
+    padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+    background-color: ##47;
+    color: #FFFFFF;
+    font-size: 110%;
+    padding-bottom: 4px;
+    padding-top: 5px;
+}
+
+table.fieldtable {
+        /*width: 100%;*/
+        margin-bottom: 10px;
+        border: 1px solid ##B4;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid ##B4;
+        border-bottom: 1px solid ##B4;
+        vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+        padding-top: 5px;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid ##B4;
+        /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+        margin-top: 2px;
+}       
+        
+.fieldtable td.fielddoc p:last-child {
+        margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: ##E6;
+        font-size: 90%;
+        color: ##2B;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid ##B4;
+}
+
+
+.tabsearch {
+    top: 0px;
+    left: 10px;
+    height: 36px;
+    background-image: url('tab_b.png');
+    z-index: 101;
+    overflow: hidden;
+    font-size: 13px;
+}
+
+.navpath ul
+{
+    font-size: 11px;
+    background-image:url('tab_b.png');
+    background-repeat:repeat-x;
+    background-position: 0 -5px;
+    height:30px;
+    line-height:30px;
+    color:##9b;
+    border:solid 1px ##ca;
+    overflow:hidden;
+    margin:0px;
+    padding:0px;
+}
+
+.navpath li
+{
+    list-style-type:none;
+    float:left;
+    padding-left:10px;
+    padding-right:15px;
+    background-image:url('bc_s.png');
+    background-repeat:no-repeat;
+    background-position:right;
+    color:##45;
+}
+
+.navpath li.navelem a
+{
+    height:32px;
+    display:block;
+    text-decoration: none;
+    outline: none;
+    color: ##30;
+    font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+    text-decoration: none;        
+}
+
+.navpath li.navelem a:hover
+{
+    color:##80;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:##45;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+    float: right;
+    font-size: 8pt;
+    padding-right: 5px;
+    width: 50%;
+    text-align: right;
+}       
+
+div.summary a
+{
+    white-space: nowrap;
+}
+
+div.ingroups
+{
+    font-size: 8pt;
+    width: 50%;
+    text-align: left;
+}
+
+div.ingroups a
+{
+    white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+    background-color: ##FA;
+    margin:  0px;
+    border-bottom: 1px solid ##CC;
+}
+
+div.headertitle
+{
+    padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+    margin-left: 0px;
+    padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+    margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+    text-align: center;
+    vertical-align: bottom;
+    border-collapse: separate;
+}
+ 
+#projectlogo img
+{ 
+    border: 0px none;
+}
+ 
+#projectname
+{
+    font: 300% Tahoma, Arial,sans-serif;
+    margin: 0px;
+    padding: 2px 0px;
+}
+    
+#projectbrief
+{
+    font: 120% Tahoma, Arial,sans-serif;
+    margin: 0px;
+    padding: 0px;
+}
+
+#projectnumber
+{
+    font: 50% Tahoma, Arial,sans-serif;
+    margin: 0px;
+    padding: 0px;
+}
+
+#titlearea
+{
+    padding: 0px;
+    margin: 0px;
+    width: 100%;
+    border-bottom: 1px solid ##70;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.caption
+{
+    font-weight: bold;
+}
+
+div.zoom
+{
+    border: 1px solid ##A0;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:##40;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: ##F6;
+        border: 1px solid ##DD;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 20px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+    color: ##60;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+ at media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
diff --git a/gatb-core/doc/doxygen/gatb.doxyfile b/gatb-core/doc/doxygen/gatb.doxyfile
new file mode 100644
index 0000000..28a587f
--- /dev/null
+++ b/gatb-core/doc/doxygen/gatb.doxyfile
@@ -0,0 +1,1719 @@
+# Doxyfile 1.7.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = gatb.core-API- at gatb-core-version@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = 
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = YES
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST = YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+#SHOW_DIRECTORIES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../src/   @CMAKE_CURRENT_SOURCE_DIR@/../test/src/  @CMAKE_CURRENT_SOURCE_DIR@/../doc/doxygen
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/../examples 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/../doc/doxygen/images
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS = 
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is adviced to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = 
+
+# If the HTML_TIMESTAMP tag is set to YES then the generated HTML documentation will contain the timesstamp.
+
+HTML_TIMESTAMP = YES
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET = @CMAKE_CURRENT_SOURCE_DIR@/../doc/doxygen/doxygen.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+#HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+#USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = 
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE = 
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA = 
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH = 
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will write a font called Helvetica to the output
+# directory and reference it in all dot files that doxygen generates.
+# When you want a differently looking font you can specify the font name
+# using DOT_FONTNAME. You need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 11
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS = 
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/gatb-core/doc/doxygen/images/BankGlobal.png b/gatb-core/doc/doxygen/images/BankGlobal.png
new file mode 100644
index 0000000..b070b8f
Binary files /dev/null and b/gatb-core/doc/doxygen/images/BankGlobal.png differ
diff --git a/gatb-core/doc/doxygen/images/CoreGlobal.png b/gatb-core/doc/doxygen/images/CoreGlobal.png
new file mode 100644
index 0000000..b4d60ee
Binary files /dev/null and b/gatb-core/doc/doxygen/images/CoreGlobal.png differ
diff --git a/gatb-core/doc/doxygen/images/ICountProcessor.png b/gatb-core/doc/doxygen/images/ICountProcessor.png
new file mode 100644
index 0000000..06e7360
Binary files /dev/null and b/gatb-core/doc/doxygen/images/ICountProcessor.png differ
diff --git a/gatb-core/doc/doxygen/images/SystemGlobal.png b/gatb-core/doc/doxygen/images/SystemGlobal.png
new file mode 100644
index 0000000..aeedf83
Binary files /dev/null and b/gatb-core/doc/doxygen/images/SystemGlobal.png differ
diff --git a/gatb-core/doc/doxygen/images/ToolsGlobal.png b/gatb-core/doc/doxygen/images/ToolsGlobal.png
new file mode 100644
index 0000000..7279d4d
Binary files /dev/null and b/gatb-core/doc/doxygen/images/ToolsGlobal.png differ
diff --git a/gatb-core/doc/doxygen/images/Transfo.png b/gatb-core/doc/doxygen/images/Transfo.png
new file mode 100644
index 0000000..64e9980
Binary files /dev/null and b/gatb-core/doc/doxygen/images/Transfo.png differ
diff --git a/gatb-core/doc/doxygen/src/dbgh5page.hpp b/gatb-core/doc/doxygen/src/dbgh5page.hpp
new file mode 100644
index 0000000..4587e6b
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/dbgh5page.hpp
@@ -0,0 +1,97 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/**\page dbgh5_page Software dbgh5
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section dbgh5_intro Purpose of dbgh5
+ *
+ * The dbgh5 binary creates a De Bruijn graph from an input bank (likely reads).
+ *
+ * The output graph is saved in a <a href="http://www.hdfgroup.org/HDF5/">HDF5</a> file.  Such a file can be
+ * read through the gatb::core API by other tools. A classical workflow is the following:
+ *
+ * \image html Transfo.png "From reads to HDF5"
+ *
+ *****************************************************************************************************
+ ****************************************************************************************************
+ * \section dbgh5_available Availability
+ *
+ * dbgh5 is provided in the gatb::core distribution (see download page). You can get directly a binary
+ * or you can also compile it by yourself.
+ *
+ ******************************************************************************************************
+ ****************************************************************************************************
+ * \section dbgh5_algorithm General algorithm
+ *
+ * dbgh5 does all or part of the following steps:
+ *      - counts the kmers of the input bank
+ *      - put these kmers into a Bloom filter
+ *      - compute an additional structure called cFP (for critical false positives)
+ *      - locate some specific nodes in the De Bruijn graph
+ *
+ * After these steps, one has a HDF5 file that holds the De Bruijn graph information. It can be then
+ * read through the gatb::core API.
+ *
+ * ******************************************************************************************************
+ ****************************************************************************************************
+ * \section dbgh5_options Options
+ *
+ * dbgh5 is highly configurable; the minimal requirement is the input set of reads, so you can just type for instance:
+ * \code
+ * dbgh5 -in /somewhere/myreads.fasta
+ * \endcode
+ *
+ * you can just type 'dbgh5' and you will get all the available options.
+ * \code
+[graph options]
+
+   [kmer count options]
+          -in              (1 arg) :    reads file
+          -kmer-size       (1 arg) :    size of a kmer  [default '31']
+          -abundance-min   (1 arg) :    min abundance threshold for solid kmers  [default '3']
+          -abundance-max   (1 arg) :    max abundance threshold for solid kmers  [default '4294967295']
+          -histo-max       (1 arg) :    max number of values in kmers histogram  [default '10000']
+          -solidity-kind   (1 arg) :    way to compute solids (sum, min or max)  [default 'sum']
+          -solid-kmers-out (1 arg) :    output file for solid kmers  [default '']
+          -out             (1 arg) :    output file  [default '']
+          -out-dir         (1 arg) :    output directory  [default '.']
+          -minimizer-type  (1 arg) :    minimizer type (0=lexi, 1=freq)  [default '0']
+          -minimizer-size  (1 arg) :    size of a minimizer  [default '8']
+
+   [bloom options]
+          -bloom        (1 arg) :    bloom type ('basic', 'cache', 'neighbor')  [default 'neighbor']
+          -debloom      (1 arg) :    debloom type ('none', 'original' or 'cascading')  [default 'cascading']
+          -debloom-impl (1 arg) :    debloom impl ('basic', 'minimizer')  [default 'minimizer']
+
+   [branching options]
+          -branching-nodes (1 arg) :    branching type ('none' or 'stored')  [default 'stored']
+          -topology-stats  (1 arg) :    topological information level (0 for none)  [default '0']
+
+   [general options]
+          -nb-cores          (1 arg) :    number of cores  [default '0']
+          -max-disk          (1 arg) :    max disk   (in MBytes)  [default '0']
+          -max-memory        (1 arg) :    max memory (in MBytes)  [default '2000']
+          -verbose           (1 arg) :    verbosity level  [default '1']
+          -email             (1 arg) :    send statistics to the given email address  [default '']
+          -email-fmt         (1 arg) :    'raw' or 'xml'  [default 'raw']
+ * \endcode
+ *
+ *
+ */
diff --git a/gatb-core/doc/doxygen/src/designpage.hpp b/gatb-core/doc/doxygen/src/designpage.hpp
new file mode 100644
index 0000000..1f27f39
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/designpage.hpp
@@ -0,0 +1,104 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/**\page design_page Design of the library
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section coredesign Global design of gatb::core package
+ *
+ ****************************************************************************************************
+ * \subsection coredesign_intro Introduction
+ *
+ * As its name suggests, the gatb::core package holds all the fundamental packages needed for writting
+ * assembly algorithms.
+ *
+ * It holds some generic services, like:
+ *      - operating system abstraction,
+ *      - collections management
+ *      - design patterns
+ *      - genomic banks read/write
+ *      - kmers management
+ *      - De Bruijn graph management
+ *
+ * \image html CoreGlobal.png "Global view of the gatb::core package"
+ *
+ *
+ ****************************************************************************************************
+ * \subsection coredesign_system  Package gatb::core::system
+ *
+ * The gatb::core::system package holds operations related to operating system.
+ *
+ * Making such an abstraction is interesting when considering the following points:
+ * - client code should rely on interfaces defined here and not on specific implementations (for linux, macos, ...)
+ * - client code should not use compilation flags for one specific system (like \#ifdef __LINUX__)
+ * - improved operating system operations should be available to clients without modification in their code
+ *
+ * The idea is so to list all necessary operating system operations that are likely to be used, to make several
+ * interfaces that gather some operations set and to provide specific implementations for several system (linux,
+ * macos, windows).
+ *
+ * \image html SystemGlobal.png "Global view of the gatb::core::system package"
+ *
+ ****************************************************************************************************
+ * \subsection coredesign_tools  Package gatb::core::tools
+ *
+ * The gatb::core::tools package holds generic operations used throughout the project. They are not specific
+ * to genome nor assembly concerns and are defined here in a separate package.
+ *
+ * Roughly speaking, we may find the following operations:
+ *      - design patterns tools (iterator, observer, smart pointer, etc...)
+ *      - collections (container, bag, iterable, etc...)
+ *      - misc
+ *
+ * \image html ToolsGlobal.png "Global view of the gatb::core::tools package"
+ *
+ *
+ *****************************************************************************************************
+ * \subsection coredesign_bank Package gatb::core::bank
+ *
+ * The gatb::core::bank package holds operations related to genomic databases management.
+ *
+ * In particular, we define a gatb::core::bank::IBank interface that is an iterable over gatb::core::bank::Sequence
+ * instances. This interface has a lot of implementations, including FASTA format.
+ *
+ *
+ ******************************************************************************************************
+ * \subsection coredesign_kmer Package gatb::core::kmer
+ *
+ * The gatb::core::kmer package holds operations related to kmer management.
+ *
+ * A typical case is to create a IBank instance and then an iterator on it; such an iterator can feed the
+ * kmer model for iterating all the kmer from the sequences.
+ *
+ *
+ *******************************************************************************************************
+ * \subsection coredesign_debruijn Package gatb::core::debruijn
+ *
+ * The gatb::core::debruijn package holds operations related to De Bruijn graph.
+ *
+ * The main API is the gatb::core::debruijn::impl::Graph class. It holds several features:
+ *      - create graph
+ *      - load graph
+ *      - iterate nodes of the graph
+ *      - get neighbors of a node
+ *
+ * The implementation of the class relies on a probabilistic data structure named
+ * <a href="http://en.wikipedia.org/wiki/Bloom_filter">Bloom filter</a>. Its usage allows to
+ * have a very low memory footprint, even for big graphs.
+ */
diff --git a/gatb-core/doc/doxygen/src/downloadpage.hpp b/gatb-core/doc/doxygen/src/downloadpage.hpp
new file mode 100644
index 0000000..6feedd1
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/downloadpage.hpp
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/**\page download_page Download
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section download Download archives
+ *
+ * You can go to the following links to download source code and/or pre-compiled 
+ * binaries of the GATB-Core library for Linux and MacOSX: 
+ *
+ *  - Source code: <a href="https://github.com/GATB/gatb-core">https://github.com/GATB/gatb-core</a>
+ *  - Binary packages: <a href="https://github.com/GATB/gatb-core/releases">https://github.com/GATB/gatb-core/releases</a>
+ */
diff --git a/gatb-core/doc/doxygen/src/mainpage.hpp b/gatb-core/doc/doxygen/src/mainpage.hpp
new file mode 100644
index 0000000..3a38946
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/mainpage.hpp
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \mainpage GATB Core Documentation
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section intro What is GATB ?
+ *
+ * GATB means "Genome Analysis Toolbox with de-Bruijn graph".
+ * 
+ * The GATB-CORE project provides a set of highly efficient algorithms to analyse NGS data sets. These 
+ * methods enable the analysis of data sets of any size on multi-core desktop computers, including very 
+ * huge amount of reads data coming from any kind of organisms such as bacteria, plants, animals and 
+ * even complex samples (e.g. metagenomes). More: https://project.inria.fr/gatb/.
+ *
+ * GATB is made two main parts:
+ *
+ * - the GATB-CORE library: for development purpose, GATB-CORE enables the creation of new software tools
+ * - the GATB-Tools: contains ready-to-use softwares relying on GATB-CORE. More <a href="https://project.inria.fr/gatb/software/">here</a>.
+ *
+ * The GATB project has been published in <a href="http://bioinformatics.oxfordjournals.org/content/30/20/2959">BioInformatics in 2014</a>.
+ * There are also several publications about GATB use cases and tools available <a href="https://project.inria.fr/gatb/publications/">here</a>.
+ * 
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section purpose Purpose of the GATB core library
+ *
+ * gatb::core is a high-performance and low memory footprint C++ library.
+ *
+ * It supports the following operations natively:
+ *  - FASTA/FASTQ parsing and writing; support of plain text and gzipped files
+ *  - K-mer counting
+ *  - Minimizer computation of k-mers, partitioning of datasets by minimizers
+ *  - de Bruijn graph construction
+ *  - de Bruijn graph traversal operations (contigs, unitigs)
+ *
+ * One structure is central to the GATB project: the <a href="http://en.wikipedia.org/wiki/De_Bruijn_graph">De Bruijn graph</a>.
+ * This sort of data structure is today widely used in NGS software (like assembly softwares).
+ *
+ * So, one can say that GATB-CORE library provides means to build and use De Bruijn graphs with a low memory footprint,
+ * which comes initially from the <a href="https://project.inria.fr/gatb/software/minia/">minia</a> assembly tool.
+ *
+ * However, in addition to the de Bruijn graph data structure, GATB-Core provides several
+ * other ones that can be of interest for general purpose developments. These are:
+ *
+ *  - Open-Addressing Hash Table
+ *  - Linked-List Hash Table
+ *  - Bloom Filters. There are several flavors: basic, cache-optimized, optimized for k-mer neighbours; accessible through BloomFactory.
+ *  - Minimal Perfect Hash Function (BBHash)
+ * 
+ * The documentation you are reading is the official documentation of the gatb::core reference API. The
+ * audience is therefore developers interested in creating bioinformatics softwares.
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section struct Services provided by the GATB core library
+ *
+ * From the client point of view, the gatb::core package provides:
+ *   - libraries that offer low level genomic operations, up to the De Bruign graph creation
+ *   - tests of the libraries
+ *   - snippets showing how to use the library
+ *   - specific binaries that rely on the libraries
+ *   - wrappers of the libraries services for several langages (java, python, ...)
+ *
+ * You will find here the code documentation for namespaces, classes, methods of the different
+ * components that compose the <b>gatb::core</b> design.
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section howto How can I make a new software using GATB core library ?
+ *
+ * As a starting point, it is strongly recommended to have a look at \ref snippets_page. You will find
+ * there information about the compilation process and how to create a new project based on gatb::core.
+ *
+ * You will find also a lot of snippets showing gatb::core
+ * in action.
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section contact Contact
+ *
+ * You can get support on the BioStars forum <a href="http://www.biostars.org/p/101393">here</a>.
+ *
+ * You can also have general information about the <a href="https://project.inria.fr/gatb/">GATB project</a>. You will
+ * find <a href="https://project.inria.fr/gatb/tutorials">here</a> high level tutorials about GATB.
+ *
+ ****************************************************************************************************
+ ****************************************************************************************************
+ * \section other Other material
+ *
+ * You can also read the related pages:
+ *      - \ref download_page
+ *      - \ref design_page
+ *      - \ref dbgh5_page
+ */
diff --git a/gatb-core/doc/doxygen/src/snippetspage.hpp b/gatb-core/doc/doxygen/src/snippetspage.hpp
new file mode 100644
index 0000000..b59b6e1
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/snippetspage.hpp
@@ -0,0 +1,1344 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/**\page snippets_page How to use the library ?
+ *
+ * \subpage compilation           \n
+ * \subpage new_project           \n
+ * \subpage snippets_graph        \n
+ * \subpage snippets_bank         \n
+ * \subpage snippets_kmer         \n
+ * \subpage snippets_iterators    \n
+ * \subpage snippets_multithread  \n
+ * \subpage snippets_storage      \n
+ * \subpage snippets_tools        \n
+ *
+ *************************************************************************************
+ *************************************************************************************
+ * \page compilation Instructions to compile GATB-Core
+ ************************************************************************************
+ *
+ * \section compilation_library Compile the library (and other artifacts)
+ *
+ * The gatb::core library is generated by the cmake tool.
+ *
+ * In the following, we will call GATB the main directory of the gatb core project (ie.
+ * the root directory of the source archive).
+ *
+ * You have then to do the following:
+ *
+ * \code
+ * cd <some_directory>
+ * git clone https://github.com/GATB/gatb-core.git
+ * cd gatb-core/gatb-core 
+ * mkdir build ; cd build ; cmake ..
+ * make -j8   (adjust -j8 to the number of cores of your system)
+ * \endcode
+ *
+ * You can force compilation in debug mode by calling cmake in a specific way:
+ * \code
+ * cmake -D CMAKE_BUILD_TYPE=Debug ..
+ * \endcode
+ *
+ * Several artifacts are generated:
+ *
+ *  - the gatb core library is available in the generated <tt>build/lib</tt> directory
+ *  - the gatb core binaries are available in the generated <tt>build/bin</tt> directory
+ *
+ * you can type 'make help' to know all the available targets.
+ *
+ * If CppUnit is installed, a unit tests binary should be generated; you can launch it with
+ * \code
+ * cd <some_directory>/gatb-core/gatb-core/build/bin
+ * 
+ * export CPPUNIT_VERBOSE=1
+ *
+ * # Launch the full test suite
+ * ./gatb-core-cppunit all  <gatb-core-home>/gatb-core/test/db
+ * \endcode
+ * You can use the exit status code of the command to know the success status (0 for success).
+ *
+ * Use
+ * \code
+ * ./gatb-core-cppunit -h
+ * \endcode
+ *
+ * to get more information on how to use this testing program.
+ *
+ * Note that one may set the environment variable CPPUNIT_VERBOSE to 1 to known which tests pass.
+ *
+ * By default, gatb::core supports kmer sizes up to 128. In fact, it has 4 different implementations
+ * of kmers, one for KSIZE_1=32, KSIZE_2=64, KSIZE_3=96 and KSIZE_4=128. If you need bigger kmers
+ * sizes, you can compile this way:
+ * \code
+ * cmake -Dk1=32 -Dk2=64 -Dk3=96 -Dk4=256 ..
+ * \endcode
+ *
+ *
+ ************************************************************************************
+ * \section compilation_snippets Compile the code snippets
+ *
+ * A directory named <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples">examples</a> holds some snippets that show how to use services provided by the library.
+ *
+ * In order to compile them, you will first need to compile the full library (see above).
+ *
+ * A simple way to generate the snippets is to type:
+ * \code
+ * cmake -DGATB_CORE_INCLUDE_EXAMPLES=True -DCMAKE_BUILD_TYPE=Debug ..   [1]
+ * make examples
+ * \endcode
+ *
+ * [1] some code snippets use assert(), so it is required to compile in Debug mode.
+ *
+ * You can also compile a single snippet using its name, such as:
+ * \code
+ * make bank1
+ * \endcode
+ *
+ * Then, you can have a look at the header of each snippet source file to review how
+ * to use them. You can also have a look at <a href="https://github.com/GATB/gatb-core/blob/master/gatb-core/test/jenkins/test-snippets-debian7-64bits-gcc-4.7.sh">this script</a> we used on a Jenkins platform
+ * to automatically run and test all these snippets; in that script, you'll see how
+ * they are started (i.e. what is the command-line to use).
+ *
+ * Some documentation about these code snippets is also available <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples">here</a>.
+ *
+ ************************************************************************************
+ * \section use_eclipse Use Eclipse c++ IDE or Xcode IDE to work with GATB-Core
+ *
+ * If you are interested in using an IDE to develop c++ source codes relying on the
+ * GATB-Core library, we have written this manual to explain how to setup Eclipse
+ * c++ framework or Xcode one:
+ *
+ * <a href="https://gatb.inria.fr/use-eclipse-to-develop-gatb-core-softwares/">https://gatb.inria.fr/use-eclipse-to-develop-gatb-core-softwares/</a>
+ * <a href="https://gatb.inria.fr/use-xcode-to-develop-gatb-core-softwares/">https://gatb.inria.fr/use-xcode-to-develop-gatb-core-softwares/</a>
+ *
+ * You also have the opportunity to easily work on <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples">code snippets</a> directly from Eclipse/Xcode. Please, refer to the above links.
+ *
+ *************************************************************************************
+ * \page new_project Quick project creation
+ ************************************************************************************
+ *
+ * \section project_create Create a new Project
+ *
+ * You use GATB-CORE by creating a new tool project, with the following script:
+ * 
+ * \code
+ *     ./[path-to-gatb-core]/scripts/NewProject/NewProject.sh -d directory -n toolName
+ * \endcode
+ * 
+ * where 'directory' is the directory where the project will be created and 'toolName' is the name of the project.
+ * The script will automatically creates the full path directory/toolName to deploy a self-contained tool.
+ *  
+ * The directory where the project is created has no link to any external resources. You can therefore
+ * move it anywhere you want.
+ * 
+ * Such a project can be a start point for building applications based on GATB-CORE. 
+ *
+ * \section project_organisation Project organisation
+ * 
+ * By default, the following part will be included in the project:
+ *   - a CMakeLists.txt file used for building the project
+ *   - a 'scripts' directory holding a script to automatically package the tool 
+ *   - a 'tools' directory holding a default source code using GATB-Core
+ *   - a 'thirdparty' directory holding the gatb-core resources
+ *   - a 'doc' directory
+ *     
+ * The 'thirdparty' directory is only available for tool created outside the GATB-Tools repository.
+ * Tools located within GATB-Tools rely on a common GATB-Core sub-module already available in this repository.
+ * 
+ * It is advised to use:
+ * 
+ *   - 'scripts' directory to hold any scripts this tool relies on
+ *   - 'doc' directory to hold tool's documentation
+ *   - 'thirdparty' directory to hold any third-party librairies this tool relies on
+ *     
+ * \section project_source Project source code
+ *
+ * It is worth noting that 'tools' directory is organised using sub-folders; by default, there is
+ * at least one such sub-folder called 'toolName'. It holds the source code of the tool. 
+ * 
+ * However, when considering a more complex software, it could be nice to setup several "sub-tools", 
+ * each of them making a particular feature. In that case, you can easily create several "sub-tool" 
+ * folders inside "tools", each of them having a "src" folder containing the source code, as well as 
+ * a "main.cpp", for each feature. 
+ * 
+ * Using this organisation has a big advantage: the provided CMakeLists.txt is aware of 
+ * that, so you do not have to edit the CMake file when you add a new "sub-tool". As a real 
+ * example, you can have a look at the DiscoSNP software.
+ *
+ * \section project_compilation Project building
+ * 
+ * To build your project, you should do the following
+ *     
+ *     cd [path-to-tool-home]
+ *     mkdir build;  cd build;  cmake ..;  make -j8
+ *     
+ * Then, you should get a binary holding the name of the project within 'build/tools'.
+ * 
+ * The first compilation should take some time since the GATB-CORE library is generated.
+ * 
+ * Note that all the needed material is included in the generated project (in particular
+ * the gatb::core library and the header files), so you can move it wherever you want.
+ * Note also that you won't have to do any tricky configuration to build the binary; you
+ * just have to do cmake+make and you will have your binaries in the build/tools directory.
+ * 
+ * \section project_version Project version
+ * 
+ * You can set a version number to your project by editing the beginning of CMakeLists.txt file located
+ * in the tool main directory or by running cmake like this: 
+ * \code
+ * cmake -DMAJOR=1 -DMINOR=1 -DPATCH=0 ..
+ * \endcode
+ * 
+ * \section project_packaging Project packaging
+ * 
+ * You can prepare your tool for distribution using:
+ * \code    
+ *     ./[path-to-tool-home]/scripts/package_tool.sh -M X -m Y -p Z
+ * \endcode
+ *
+ *  With X, Y and Z being major, minor and patch release numbers, respectively.
+ *
+ * Then, you should get two 'tar.gz' files within 'build', one containing the binary release
+ * and the other the source codes.
+ * 
+ * Note: the script re-built the entire tool from its sources to ensure a clean build process.
+ *
+* \section use_eclipse2 Use Eclipse c++ IDE to work on a GATB-TOOL
+ *
+ * If you are interested in using an IDE to develop c++ source codes relying on the
+ * GATB-Core library, we have written this manual to explain how to setup Eclipse
+ * c++ framework:
+ *
+ * <a href="https://gatb.inria.fr/use-eclipse-to-develop-gatb-core-softwares/">https://gatb.inria.fr/use-eclipse-to-develop-gatb-core-softwares/</a>
+ *
+ ************************************************************************************
+ ************************************************************************************
+ * \page snippets_iterators Iterators snippets
+ ************************************************************************************
+  * \tableofcontents
+ *************************************************************************************
+ * \section snippets_iterators_intro Presentation
+ * 
+ * This page presents some code snippets related to the use of Iterators.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/tools">gatb-core/gatb-core/examples/tools</a>.
+ *
+ * \section snippets_iterators_snippet1 Iterate a list
+ *
+ * This snippet shows how to iterate a STL list with our iterator design.
+ *
+ * Code is from example iterators1.cpp:
+ *\snippet iterators1.cpp  snippet1
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet2 Iterate the Cartesian product of two lists
+ *
+ * This snippet shows how to iterate the Cartesian product of two lists:
+ *
+ *  1) Declare two iterators \n
+ *  2) Declare one Cartesian iterator configured with the two iterators \n
+ *  3) Iterate the Cartesian iterator. \n
+ *
+ * The current item of the iteration is a pair, so one should retrieve the couple of
+ * values with methods 'first' and 'second'.
+ *
+ * Code is from example iterators2.cpp:
+ *\snippet iterators2.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet7 Iterate two lists by pairs
+ *
+ * This snippet shows how to iterate two iterators at the same time, providing pairs
+ * of items at each iteration.
+ *
+ * A usage of such an iterator is to iterate two paired ends banks.
+ *
+ * Code is from example iterators7.cpp:
+ *\snippet iterators7.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet3 Truncating an iteration
+ *
+ * This snippet shows how to truncate the iteration of some iterator.
+ *
+ * Code is from example iterators3.cpp:
+ *\snippet iterators3.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet4 Iterate a list with progress feedback
+ *
+ * This snippet shows how to iterate a STL list and being notified as a listener about
+ * its progression.
+ *
+ * The idea is to use a SubjectIterator instance that refers the actual iterator we want
+ * to iterate.
+ *
+ * Then, it is possible to subscribe some callback function (here as a functor) to the
+ * SubjectIterator instance.
+ *
+ * The listener will then receive at regular interval the number of currently iterated
+ * items.
+ *
+ * Code is from example iterators4.cpp:
+ *\snippet iterators4.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet5 Iterate a list with progress feedback (simple)
+ *
+ * This snippet is the same as before but here we use a default console progress bar.
+ * In most case, it allows to avoid an explicit listener configuration.
+ *
+ * Code is from example iterators5.cpp:
+ *\snippet iterators5.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet6 Iterate a list and filter out some items
+ *
+ * This snippet shows how to iterate a STL list while filtering out some items that
+ * don't check some condition.
+ *
+ * Code is from example iterators6.cpp:
+ *\snippet iterators6.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ ************************************************************************************
+ * \section snippets_iterators_snippet8 Mixing iterators
+ *
+ * This snippet shows how mix several iterators. Note again that the iteration loop
+ * is still the same.
+ *
+ * Code is from example iterators8.cpp:
+ *\snippet iterators8.cpp  snippet1
+ * [go back to \ref snippets_iterators "top"]
+ *
+ *
+ ************************************************************************************
+ ************************************************************************************
+ * \page snippets_multithread Multithreading snippets
+ ************************************************************************************
+ *
+ * \tableofcontents
+ *
+ * *************************************************************************************
+ *
+ * \section snippets_multithread_intro Presentation
+ *
+ * This page presents some code snippets related to the use of Multithreading API.
+ *
+ * Some of the snippets presented below <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">can be used online</a>.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/tools">gatb-core/gatb-core/examples/tools</a>.
+ *
+ * \section snippets_multithread_snippet1 Iteration in a multithreaded fashion
+ *
+ * This snippet shows how to iterate some Iterator object (here a range of integers)
+ * with N threads in order to speed up the iteration.
+ *
+ * This snippet introduces the Dispatcher class and shows how to simply use it for
+ * parallelizing one iteration.
+ *
+ * <b>Note: this approach can work only if the items can be iterated and processed independently
+ * from each other.</b>
+ *
+ * Code is from example multithreading1.cpp:
+ *\snippet multithreading1.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ *************************************************************************************
+ *
+ * \section snippets_multithread_snippet2 Multithreaded iteration and shared resources
+ *
+ * This snippet shows how to parallelize an iteration and how several threads can modify
+ * a common resource throughout the iteration.
+ *
+ * The important point here is to understand that shared resources must be modified
+ * cautiously by different threads running at the same time.
+ *
+ * Code is from example multithreading2.cpp:
+ *\snippet multithreading2.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ *************************************************************************************
+ *
+ * \section snippets_multithread_snippet3 Multithreaded iteration with synchronization of a shared resource
+ *
+ * Here, our shared resource is a file, so we can't use intrinsic instruction like we
+ * did before for integer addition.
+ *
+ * We need some general synchronization mechanism that will ensure that a portion of code
+ * can be executed only by one thread at one time.
+ *
+ * Code is from example multithreading3.cpp:
+ *\snippet multithreading3.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ *
+ *************************************************************************************
+ *
+ * \section snippets_multithread_snippet4 Multithreaded iteration with synchronization of a shared resource (bis)
+ *
+ * This snippet is similar to the previous one. It only shows how to use the LocalSynchronizer
+ * class to simply lock/unlock the containing instruction block.
+ *
+ * This is useful for avoiding classical deadlock bugs when one forgets to unlock a
+ * synchronizer.
+ *
+ * Code is from example multithreading4.cpp:
+ *\snippet multithreading4.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ *************************************************************************************
+ *
+ * \section snippets_multithread_snippet5 Multithreaded iteration without shared resources management
+ *
+ * This snippet introduces the ThreadObject class designed to avoid concurrent accesses
+ * issues.
+ *
+ * Instead of working on a single shared resource, threads use local resources during
+ * the iteration and then, a final aggregation of the local resources is done after
+ * the iteration.
+ *
+ * Such an approach skips the need of synchronization mechanisms when threads directly
+ * uses a single shared resource. This may be interesting since synchronization mechanisms
+ * may introduce time overheads.
+ *
+ * Code is from example multithreading5.cpp:
+ *\snippet multithreading5.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ *************************************************************************************
+ *
+ * \section snippets_multithread_snippet6 Multithreaded iteration of a bank
+ *
+ * This snippet shows how to iterate sequences of a bank and counts how many A,C,G,T it
+ * contains. The interesting part is to see that the Bank class can create Iterator instances
+ * that can be iterated through a Dispatcher instance.
+ *
+ * Note: iterating a bank from a disk makes a lot of I/O, so parallelizing such an iteration
+ * may not lead to significant better performance. However, if the snippet is launched
+ * once, the bank (if not too big) may be in the RAM cache, so it is interesting to
+ * relaunch the snippet with varying number of cores and see how execution time evolves.
+ *
+ * Code is from example multithreading6.cpp:
+ *\snippet multithreading6.cpp  snippet1
+ * [go back to \ref snippets_multithread "top"]
+ *
+ ************************************************************************************
+ ************************************************************************************
+ * \page snippets_bank Bank snippets
+ ************************************************************************************
+ *
+ * \tableofcontents
+ *
+ ************************************************************************************
+ *
+ * \section snippets_bank_intro Presentation
+ *
+ * This page presents some code snippets related to the use of Bank API.
+ *
+ * Some of the snippets presented below <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">can be used online</a>.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/bank">gatb-core/gatb-core/examples/bank</a>.
+ *
+ * \section snippets_bank_snippet1 Parsing a single FASTA bank without checks
+ *
+ * This snippet shows how to read one FASTA bank in a simple way. No check is done about
+ * the correctness of the FASTA bank file path.
+ *
+ * Some information of each iterated sequence are diplayed as output.
+ *
+ * Code is from example bank1.cpp:
+ *\snippet bank1.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ ************************************************************************************
+ * \section snippets_bank_snippet2 Parsing several banks
+ *
+ * This snippet shows how to read one ore more banks in a simple way. The idea is to use
+ * the Bank::open method that analyzes the provided uri and get the correct IBank handle for
+ * one or more banks. For instance, one can run this snippet with:
+ *    - bank2  reads1.fa,reads2.fa,reads3.fa
+ *
+ * Some information of each iterated sequence are diplayed as output.
+ *
+ * Code is from example bank2.cpp:
+ *\snippet bank2.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ *************************************************************************************
+ * \section snippets_bank_snippet3 Parsing a FASTA bank in a different way
+ *
+ * This snippet shows how to read one or more FASTA banks in a "push" model;
+ * it means that the sequence iterator calls some function for each sequence.
+ *
+ * This is another way to iterate items and opposite to the "pull" model where the
+ * iterator is called to provide the current item, instead of calling some function to
+ * do as we do in this sample.
+ *
+ * Code is from example bank3.cpp:
+ *\snippet bank3.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet4 Parsing a FASTA bank and getting progress information
+ *
+ * This snippet shows how to create an iterator on something (here sequences from a FASTA
+ * file) and encapsulate it with another iterator that adds the possibility to notify some
+ * listener every 10 iterated sequences (used here for showing some progression during the
+ * iteration).
+ *
+ * Note: the "notifying" iterator is generic and could be reused to send progress notification
+ * with any kind of iterator, not only on sequences.
+ *
+ * Code is from example bank4.cpp:
+ *\snippet bank4.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet5 Parsing a FASTA bank and getting percentage progress information
+ *
+ * This snippet shows how to read one or more FASTA banks and get a percentage progress
+ * information during the iteration.
+ *
+ * We use there a ProgressIterator on Sequence. By default, we got progress information with
+ * remaining time estimation and resources usage (cpu and memory).
+ * Note that the ProgressIterator class has a second template parameter that can provide other
+ * progress information, try for instance:
+ *      - ProgressIterator<Sequence,ProgressTimer>
+ *
+ * Code is from example bank5.cpp:
+ *\snippet bank5.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet6 Output a FASTA file with data line of given size
+ *
+ * This snippet provides a small utility for cutting lines of data with a given size.
+ *
+ * Code is from example bank6.cpp:
+ *\snippet bank6.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet7 Filter sequences with a given data size
+ *
+ * This snippet shows how to parse a bank with a functor used to filter out some items.
+ *
+ * Code is from example bank7.cpp:
+ *\snippet bank7.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet7b Filter sequences using Phred quality
+ *
+ * This snippet shows how to parse a FastQ file and filtering out reads by Phred quality.
+ *
+ * Code is from example bank24.cpp:
+ *\snippet bank24.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet8 Conversion of a FASTA bank to a binary format
+ *
+ * This snippet shows how to parse a nucleic bank and convert it to a binary format.
+ *
+ * Code is from example bank8.cpp:
+ *\snippet bank8.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet9 Conversion of a bank with some filtering
+ *
+ * This snippet shows how to parse a bank, check whether the sequences match a criteria
+ * and dump the matching sequences into an output FASTA bank.s
+ *
+ * Code is from example bank9.cpp:
+ *\snippet bank9.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet10 Split a bank
+ *
+ * This snippet shows how to split an input bank into parts. It creates an output album
+ * bank by using the BankAlbum class. Example of use:
+ * \code
+ * bank10 -in reads.fa -max-size 10000000
+ * \endcode
+ * This example will create a directory 'reads_S1000000' where we can find:
+ *      - album.txt   =>  album file containing all reads_X split parts
+ *      - reads_0
+ *      - reads_1
+ *      - ...
+ *      - reads_N
+ *
+ * All the 'reads_X' files are about 1000000 bytes. Now, the generated album.txt file
+ * can be used as a bank and could be the input bank of the snippet bank14 for instance
+ * (and we should get the same results as using directly the 'reads.fa' bank)
+ *
+ * Code is from example bank10.cpp:
+ *\snippet bank10.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet11 Iterating a bank whose sequences are kmers
+ *
+ * This snippet shows how to iterate a BankKmers. Such a bank iterates all possible
+ * kmers for a given kmers size.
+ *
+ * Each sequence is saved into an output FASTA file.
+ *
+ * Code is from example bank11.cpp:
+ *\snippet bank11.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet12 Extracting sequences with specific ids with FilterIterator
+ *
+ * This snippet shows how to extract sequences from a bank. A sequence is kept if its
+ * index in its bank belongs to a set (provided as an input file holding one index per line)
+ *
+ * It uses the FilterIterator feature.
+ *
+ * Code is from example bank12.cpp:
+ *\snippet bank12.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet13 Extracting sequences with too many N characters
+ *
+ * This snippet shows how to extract sequences that don't have too many N.
+ *
+ * It uses the FilterIterator feature.
+ *
+ * Code is from example bank13.cpp:
+ *\snippet bank13.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet14  Computing statistics on a bank
+ *
+ * This snippet shows how to read a bank and get statistics on it.
+ *
+ * Code is from example bank14.cpp:
+ *\snippet bank14.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ **************************************************************************************
+ * \section snippets_bank_snippet18  Iterating paired end banks
+ *
+ * This snippet shows how to read two banks in the same time, and each item is a pair
+ * of items of bank1 and bank2.
+ *
+ * This is good example how to reads paired end banks.
+ *
+ * Code is from example bank18.cpp:
+ *\snippet bank18.cpp  snippet1
+ * [go back to \ref snippets_bank "top"]
+ *
+ * \n
+ *
+ ************************************************************************************
+ ************************************************************************************
+ * \page snippets_kmer Kmer snippets
+ ************************************************************************************
+ *
+ * \tableofcontents
+ *
+ *************************************************************************************
+ *
+ * \section snippets_kmer_intro Presentation
+ *
+ * This page presents some code snippets related to the use of k-mer API.
+ *
+ * Some of the snippets presented below <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">can be used online</a>.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/kmer">gatb-core/gatb-core/examples/kmer</a>.
+ *
+ * \section snippets_kmer_snippet1 Using a kmer model
+ *
+ * This snippet shows how to create kmer models.
+ *
+ * Code is from example kmer1.cpp:
+ *\snippet kmer1.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet2 Computing kmers with a model
+ *
+ * This snippet shows how to get kmers from a model. Here, we can see that we can
+ * use 3 different kinds of models, giving different kinds of kmers:
+ *  - ModelDirect : direct kmers
+ *  - ModelCanonical : minimum value of the direct kmer and its reverse complement
+ *  - ModelMinimizer : provides also a minimizer for the kmer
+ *
+ * The snippet shows different methods usable for each kind of model.
+ *
+ * Code is from example kmer2.cpp:
+ *\snippet kmer2.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet3 Iterating kmers from a sequence
+ *
+ * This snippet shows how to iterate the kmers from a sequence, for a given model.
+ *
+ * Code is from example kmer3.cpp:
+ *\snippet kmer3.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet4 Iterating kmers from one or several banks
+ *
+ * This snippet shows how to iterate the kmers from banks. In particular, we use two
+ * iterators and two loops:
+ *      - outer loop on sequences of the bank
+ *      - inner loop on kmer on the current sequence from the outer loop
+ *
+ * Code is from example kmer4.cpp:
+ *\snippet kmer4.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet5 Computing statistics about minimizers
+ *
+ * This snippet shows iterate the kmers of an input bank and computes some statistics
+ * about the iterated minimizers.
+ *
+ * It also computes the following distribution : number of times a read has X different
+ * minimizers (in other words, the number of super kmers).
+ *
+ * Code is from example kmer5.cpp:
+ *\snippet kmer5.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet6 Checking span of kmers model
+ *
+ * This snippet shows what is legal in terms of kmers size.
+ *
+ * Actually, a kmers model has a type with a 'span' template. This span represents the
+ * maximum kmer size reachable for this type. For instance, a span of 32 allows up to
+ * kmer size of 31, a span of 64 up to 63, etc...
+ *
+ * The 'span' value must be one of the project defined constants: KSIZE_1, KSIZE_2, KSIZE_3
+ * and KSIZE_4. By default, we have KSIZE_n = 32*n. Note that it is possible to compile
+ * GATB-CORE with a bigger value of KSIZE_4=128. See \ref compilation.
+ *
+ * It is important to understand that each one of the four span values defines a specific
+ * kmers model with a specific integer type that represents the kmers values. For instance:
+ *  - KSIZE_1=32 implies that we need 64 bits integers (2 bits per nucleotide), which is available
+ *  as a native type on 64 bits architecture
+ *  - KSIZE_2=64 implies that we need 128 bits integers which may (or not) be available as native
+ *  integer type
+ *  - for KSIZE_3 and KSIZE_4, we need to switch to specific large integer representations that
+ *  are no more native on the system, which implies bigger computation times.
+ *
+ * Code is from example kmer6.cpp:
+ *\snippet kmer6.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet7 Other kind of statistics about minimizers
+ *
+ * This snippet shows how to iterate the kmers of an input bank and computes some statistics
+ * about the iterated minimizers.
+ *
+ * Code is from example kmer7.cpp:
+ *\snippet kmer7.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet8  Setting custom minimizers definition
+ *
+ * This snippet shows how to configure custom minimizer definition through a functor.
+ *
+ * Code is from example kmer8.cpp:
+ *\snippet kmer8.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet9  Counting kmers from a bank with the sorting count algorithm
+ *
+ * This snippet shows how to use the SortingCountAlgorithm class for counting kmers in
+ * a bank
+ *
+ * Code is from example kmer9.cpp:
+ *\snippet kmer9.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_kmer_snippet10  Reading a file generated by the sorting count algorithm
+ *
+ * This snippet shows how to read the output of the SortingCountAlgorithm.
+ *
+ * We use two ways for reading the couples [kmer,abundance]
+ *  - we read all the couples with a single iterator
+ *  - we read each solid collection and use an iterator on it
+ *
+ * Code is from example kmer10.cpp:
+ *\snippet kmer10.cpp  snippet1
+ * [go back to \ref snippets_kmer "top"]
+ * \n
+ *
+ *
+ *
+ ************************************************************************************
+ *************************************************************************************
+ * \page snippets_graph De Bruijn graph snippets
+ *************************************************************************************
+ *************************************************************************************
+ *
+ *\tableofcontents
+ *
+ * \section snippets_dbg_intro Presentation
+ *
+ * This page presents some code snippets related to the use of De Bruijn graph API.
+ *
+ * Some of the snippets presented below <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">can be used online</a>.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/debruijn">gatb-core/gatb-core/examples/debruijn</a>.
+ *
+ ************************************************************************************
+ * \section snippets_dbg_1  Build / Load De Bruijn graphs
+ ************************************************************************************
+ * \subsection snippets_kmer_dbg_1  Building a De Bruijn graph from command line options
+ *
+ * This snippet shows how to create a Graph object thanks to command line options with at
+ * least a mandatory FASTA file URI.
+ *
+ * The first thing to do is to get a parser that analyzes the command line options
+ * from (argc,argv). Such a parser can be retrieved with a static method from Graph class.
+ *
+ * Then, the parsed options can be provided to the Graph::create method and then we get
+ * a Graph object on which we can do anything we want.
+ *
+ * The only mandatory option is '-in fastafile'. All other options have default values if not
+ * set through command line.
+ *
+ * In this snippet, we dump information about the Graph object building with Graph::getInfo method.
+ *
+ * \remark This snippet essentially does the same job as the \b dbgh5 tool provided by the
+ * gatb-core project: it takes a set of reads (as a FASTA file) and generates the corresponding
+ * De Bruijn graph as a HDF5 file.
+ *
+ * Code is from example debruijn1.cpp:
+ *\snippet debruijn1.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_2  Building a De Bruijn graph from a command-line-like string
+ *
+ * Like the previous snippet, we create a Graph object with command line options, but
+ * here the options are directly provided as a string.
+ *
+ * Code is from example debruijn2.cpp:
+ * \snippet debruijn2.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_3  Building a De Bruijn graph from a bank object
+ *
+ * Here, we create a Graph object by providing a bank object, more precisely a IBank
+ * object.
+ *
+ * It is therefore possible to provide a Bank instance (ie a FASTA bank), or
+ * another kind of bank that implements the IBank interface.
+ *
+ * Note in the example that we can provide additional options after the bank object.
+ *
+ * Code is from example debruijn3.cpp:
+ * \snippet debruijn3.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_4  Building a De Bruijn graph from a fake bank object
+ *
+ * Like the previous snippet, we create a Graph object by providing a bank object, but
+ * here this is a 'fake' bank built "on the fly".
+ *
+ * Such banks are often useful for testing purposes.
+ *
+ * In such a case, the output file for the graph will be named "noname", unless a specific
+ * name is set through the command line option "-out mygraph".
+ *
+ * Code is from example debruijn4.cpp:
+ * \snippet debruijn4.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_5  Load a De Bruijn graph from a graph file
+ *
+ * Once we have built a graph, it is saved as a file (likely a HDF5 file).
+ *
+ * This snippet shows how to load such a file to get a Graph object.
+ *
+ * Code is from example debruijn5.cpp:
+ * \snippet debruijn5.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_dbg_2  Iterating nodes
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_6  Iterate the nodes of a De Bruijn graph
+ *
+ * This snippet shows how to iterate all the nodes of a graph (the graph is loaded
+ * from a graph file).
+ *
+ * The idea is to get an iterator from the graph and use it to get each node of the graph.
+ *
+ * Here, the nodes are retrieved regardless of any edges between them.
+ *
+ * Code is from example debruijn6.cpp:
+ * \snippet debruijn6.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_7  Iterate the nodes of a De Bruijn graph in a multithread way
+ *
+ * As the previous example, this snippet shows how to iterate all the nodes of a graph.
+ *
+ * The difference here is that the iteration is parallelized, using all possible available
+ * cores, which should speed up the iteration.
+ *
+ * WARNING ! don't forget this is parallel execution, so you have be careful if you want to
+ * modify the same object in different thread execution contexts.
+ *
+ * Note: lambda expressions are used here to have code conciseness (which suppose to use
+ * an up-to-date compiler). You can have some information at
+ * http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11
+ *
+ * Code is from example debruijn7.cpp:
+ * \snippet debruijn7.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_dbg_3  Neighborhoods
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_9  Working with neighborhoods of nodes in the De Bruijn graph
+ *
+ * This snippet shows how to use some methods related to neighbors in a graph.
+ *
+ * We use a fake bank with one sequence of size 5 and use a kmer size of 4, so we will have 2 possible
+ * nodes in the graph.
+ *
+ * We iterate these two nodes, and for one of them, we ask for its neighbors with the Graph::successors method.
+ * We can then check that the retrieved neighbor is the correct one by analyzing the node string representations.
+ *
+ * In this example, we use the successors method, but note it is possible to get the incoming neighbors with the
+ * Graph::predecessors method. By the way, it is possible to know the in and out degree of a given node with the two
+ * corresponding methods Graph::indegree and Graph::outdegree
+ *
+ * Code is from example debruijn9.cpp:
+ * \snippet debruijn9.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_10  Working with neighborhoods of nodes in the De Bruijn graph (continued)
+ *
+ * This snippet shows how to use some methods related to neighbors in a graph.
+ *
+ * We do the same work as the previous example. The only difference is that we retrieve the neighbors as
+ * Edge objects rather than Node objects, so we will have the full information about each transition between
+ * the source node and the retrieved neighbors (including the transition nucleotide for instance).
+ *
+ * In particular, we use some of the Edge attributes (Edge::to, Edge::nt)
+ *
+ * Code is from example debruijn10.cpp:
+ * \snippet debruijn10.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_11  Working with a specific neighbor for a specific node
+ *
+ * This snippet shows how to get a specific neighbor for a specific node.
+ *
+ * Sometimes, it is interesting to ask the graph for only one neighbor for a given node.
+ * It may happen when one has already got neighbors information through a Graph::neighbors
+ * call and memorized only the transition nucleotides for valid neighbors.
+ *
+ * The Graph::neighbor fulfills this need. This method has two forms, with or without check
+ * to graph membership, according to performance considerations.
+ *
+ * Code is from example debruijn11.cpp:
+ * \snippet debruijn11.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_dbg_4  Branching nodes
+ ************************************************************************************
+ *
+ * In the De Bruijn graph, we can define two types of nodes:
+ *  - a node N is 'simple'    <=> indegree(N)==1 && outdegree(N)
+ *  - a node N is 'branching' <=> N is not simple
+ *
+ * Branching nodes set is an important subset in the whole nodes set of the De Bruijn graph, so it is of most
+ * interest to have some graph methods that work on such nodes. In particular, we can:
+ *  - iterate all the branching nodes of the De Bruijn graph
+ *  - get the branching neighbors of some node
+ *
+ * \remarks - With this definition, a branching node may have 0 outcoming neighbors or 0 incoming neighbors.
+ *
+ * \remarks - Since we are considering assembly matters, we should have few branching nodes compared to the simple
+ * nodes.
+ *
+ * \subsection snippets_kmer_dbg_8  Iterate the branching nodes of a De Bruijn graph
+ *
+ * This snippet shows how to iterate the branching nodes of a graph (the graph is loaded
+ * from a graph file).
+ *
+ * The idea is to get an iterator from the graph and use it to get each branching node of the graph.
+ *
+ * Code is from example debruijn8.cpp:
+ * \snippet debruijn8.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_16  Working with branching neighbors of a node
+ *
+ * This snippet shows how to get the branching neighbors of a node. Such neighbors are
+ * computed as follow:
+ *      - the immediate neighbors of the node are retrieved
+ *      - a simple path is done from each neighbor in order to reach the first non simple node
+ *
+ * Here, we use directly the Graph::successors<BranchingNode> method that encapsulates
+ * this behavior.
+ *
+ * Code is from example debruijn16.cpp:
+ * \snippet debruijn16.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_17  Working with branching neighbors of a node (continued)
+ *
+ * This snippet shows how to get the branching neighbors of a node.
+ *
+ * It is similar to the previous snippet. The difference here is that we retrieve BranchingEdge
+ * objects. A BranchingEdge object is made of:
+ *  - the source branching node
+ *  - the target branching node
+ *  - the direction of the neighbors (in/out coming)
+ *  - the nucleotide of the transition between the initial branching node and the first neighbor
+ *    on the simple path between the two branching nodes.
+ *  - the number of transitions that link the two branching nodes.
+ *
+ * Code is from example debruijn17.cpp:
+ * \snippet debruijn17.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ * ************************************************************************************
+ * \section snippets_dbg_14  Simple path
+ ************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_14  Iterating simple path from a node
+ *
+ * As we saw previously, a simple node is defined as having indegree==1 and outdegree==1.
+ * It is often useful to iterate successive simple nodes in order to build some path in the De Bruijn graph.
+ *
+ * This snippet shows how to iterate such a simple path. Here, the iterated items are the
+ * successive nodes of the path.
+ *
+ * Code is from example debruijn14.cpp:
+ * \snippet debruijn14.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_15  Iterating simple path from a node (continued)
+ *
+ * Like the previous example, this snippet shows how to iterate a simple path.
+ * Here, the iterated items are the successive edges of the path. If we note E an edge
+ * in this path, we will have:
+ *  - outdegree(E.from)==1  &&  indegree(E.to)==1
+ *
+ * Code is from example debruijn15.cpp:
+ * \snippet debruijn15.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_dbg_6  Miscellanous
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_12  Playing with node strands
+ *
+ * A Node object is fully defined by a kmer value and a strand that disambiguates how to
+ * interpret the kmer.
+ *
+ * It is often required to change the reading strand of a node. This can be done with the
+ * Graph::reverse method.
+ *
+ * Code is from example debruijn12.cpp:
+ * \snippet debruijn12.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *************************************************************************************
+ * \subsection snippets_kmer_dbg_13  Playing with fake nodes
+ *
+ * Sometimes, it is useful to build "fake" nodes from a simple sequence, without having
+ * a graph holding true data.
+ *
+ * It is possible to get an empty Graph object (its kmer size must be nevertheless specified),
+ * and then use the Graph::buildNode to get a node based on a Data object.
+ *
+ * Code is from example debruijn13.cpp:
+ * \snippet debruijn13.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ * \n
+ *
+ ************************************************************************************
+ * \section snippets_dbg_7  To go further...
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_18  Getting branching nodes statistics in a parallel way
+ *
+ * This example is a little bit harder than the previous ones. Its purpose is to show how
+ * to use the graph API for extracting some information. In particular, we will try to
+ * take care about time execution by using available cores.
+ *
+ * The idea here is to compute information about branching nodes and their in and out degrees.
+ * For instance, we want to know how many branching nodes have indegree==2 and outdegree=3.
+ * We compute therefore the number of branching nodes having indegree==X and outdegree==Y,
+ * with X and Y in [0..4] and the constraint that we can't have X==Y==1 (otherwise the node
+ * wouldn't be a branching one).
+ *
+ * We can do it easily by using the methods:
+ *  - Graph::successors<BranchingNode>
+ *  - Graph::predecessors<BranchingNode>
+ *
+ * Moreover, we want to do it in a parallel way in order to speed up the computation. The idea is
+ * to get an iterator over the branching nodes and iterate it through a Dispatcher object; such a
+ * dispatcher will create as many threads as wanted and will feed each threads with branching nodes.
+ * Note that this scheme can work here because the processing of one branching node is independant of
+ * the others.
+ *
+ * We need also some container for the in/out degrees statistics. A natural choice is to use a map,
+ * with the key being a unique identifier for a couple (indegree/outdegree) and the value the number
+ * of occurrences for the key. The idea is to use one map per thread and to merge the N maps into a global
+ * one after the parallel iteration of the branching nodes. We use here a ThreadObject object
+ * that allows to do it in a simple way. This object clones N time the global map and each clone is used in
+ * a specific thread. The ThreadObject class allows to hide many cumbersome points for the parallelization.
+ *
+ * In this example, we also use progress notification feature (with ProgressIterator) in order to have
+ * some user feedback during the iteration of the branching nodes.
+ *
+ * Code is from example debruijn18.cpp:
+ * \snippet debruijn18.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ *
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_19  Computing connected components of the branching nodes sub graph
+ *
+ * Code is from example debruijn19.cpp:
+ * \snippet debruijn19.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ *
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_24  Generate dot file from a graph
+ *
+ * This snippet generates a dot file from a de Bruijn graph. It is then possible to
+ * generate a pdf output of the graph (dot -Tpdf graph.dot -o graph.pdf)
+ *
+ * Code is from example debruijn24.cpp:
+ * \snippet debruijn24.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ *
+ *************************************************************************************
+ *
+ * \subsection snippets_kmer_dbg_26  Retrieve extra information from a node
+ *
+ * This snippet shows how to use the 'queryAbundance' method that returns the occurrences
+ * number of the node in the initial set of reads.
+ *
+ * Code is from example debruijn26.cpp:
+ * \snippet debruijn26.cpp  snippet1
+ * [go back to \ref snippets_graph "top"]
+ *
+ * ************************************************************************************
+ ************************************************************************************
+ * \page snippets_storage Storage snippets
+ ************************************************************************************
+ *
+ * \tableofcontents
+ *
+ * \section snippets_storage_intro Presentation
+ *
+ * This page presents some code snippets related to the use of persistency API.
+ *
+ * Some of the snippets presented below <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">can be used online</a>.
+ *
+ * Additional snippets are available in directory: <a href="https://github.com/GATB/gatb-core/tree/master/gatb-core/examples/storage">gatb-core/gatb-core/examples/storage</a>.
+ *
+ *************************************************************************************
+ *
+ * \section snippets_storage_snippet1 Create and save a collection with a Storage object
+ *
+ * This snippet shows how to use a Storage object for creating a collection of integers.
+ * We use the HDF5 format, so we can control the result of our snippet with HDF5 tools.
+ *
+ * Code is from example storage1.cpp:
+ *\snippet storage1.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet2 Create and save two collections with a Storage object
+ *
+ * This snippet shows how to use a Storage object for creating collections of integers.
+ * We use the HDF5 format, so we can control the result of our snippet with HDF5 tools.
+ *
+ * Code is from example storage2.cpp:
+ *\snippet storage2.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet3 Load a collection from a Storage object
+ *
+ * This snippet shows how to load a Storage object and get a saved collection from it.
+ *
+ * Code is from example storage3.cpp:
+ *\snippet storage3.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet4 Load collections from a Storage object
+ *
+ * This snippet shows how to load a Storage object and get saved collections from it.
+ * Note that we use lambda expressions in this example.
+ *
+ * Code is from example storage4.cpp:
+ *\snippet storage4.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet6 Iterate solid kmers from a HDF5 file
+ *
+ * This snippet shows how to use a HDF5 Storage object holding solid kmers and iterate
+ * the kmers.
+ *
+ * It also uses a Model instance in order to convert the solid kmers values into the
+ * corresponding nucleotides sequence.
+ *
+ * The input file is likely to have been generated by dbgh5 for instance, or by dsk.
+ *
+ * If you want to know the structure of the HDF5 file, you can use the h5dump utility,
+ * for instance:  h5dump -H file.h5
+ *
+ * Code is from example storage6.cpp:
+ *\snippet storage6.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet7 Associate metadata to HDF5 collections
+ *
+ * This snippet shows how to associate metadata to HDF5 collections.
+ *
+ * You can dump such values with h5dump:
+ *      h5dump -a myIntegers/myData foo.h5
+ *
+ * Code is from example storage7.cpp:
+ *\snippet storage7.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ *************************************************************************************
+ * \section snippets_storage_snippet8 Using C++ like streams with HDF5
+ *
+ * This snippet shows how to use binary input/output streams with HDF5. There are two
+ * types:
+ *  - Storage::ostream : used for saving binary data into a HDF5 collection
+ *  - Storage::istream : used for retrieving binary data from a HDF5 collection
+ *
+ * Code is from example storage8.cpp:
+ *\snippet storage8.cpp  snippet1
+ * [go back to \ref snippets_storage "top"]
+ *
+ ************************************************************************************
+ * \page snippets_tools  Tools snippets
+ ************************************************************************************
+ *
+ * \tableofcontents
+ *
+ *************************************************************************************
+ *
+ * These snippets provide several miscellaneous tools that ease the developper's life.
+ *
+ *************************************************************************************
+ * \section snippets_tools_snippet1  Using the Tool class for quick tool development
+ *
+ * This snippet shows how to quickly create a new tool by subclassing the Tool class.
+ *
+ * You can try it <a href="http://gatb-core.gforge.inria.fr/training?trail=Expert">online here</a>.
+ *
+ * Using the Tool class will give to use some useful features for developing our toy tool.
+ *
+ * Code is from example ToyTool.cpp:
+ *\snippet ToyTool.cpp  snippet1
+ *
+ */
diff --git a/gatb-core/doc/doxygen/src/testspage.hpp b/gatb-core/doc/doxygen/src/testspage.hpp
new file mode 100644
index 0000000..a274a20
--- /dev/null
+++ b/gatb-core/doc/doxygen/src/testspage.hpp
@@ -0,0 +1,18 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
diff --git a/gatb-core/doc/misc/README.txt b/gatb-core/doc/misc/README.txt
new file mode 100644
index 0000000..03ef315
--- /dev/null
+++ b/gatb-core/doc/misc/README.txt
@@ -0,0 +1,123 @@
+                          ***********************************
+                          *                                 *
+                          *  GATB-Core binary distribution  *
+                          *                                 *
+                          ***********************************
+
+==================
+== INTRODUCTION ==
+==================
+
+This release provides you with a pre-compiled binary release of the GATB-Core library. 
+Using it, you can easily compile home-made GATB software, as explained below.
+
+
+=============
+== CONTENT ==
+=============
+
+    - README.txt : the file you are reading
+    - lib        : static GATB-Core library
+    - include    : header files; usually, you’ll use ‘gatb/gatb_core.hpp’
+    - bin        : De Bruijn graph utilities (see below)
+    - test       : unit tests of the library
+    - examples   : a few snippets showing how to use the library
+
+
+===================
+== DOCUMENTATION ==
+===================
+
+For documentation, please have a look at:
+
+- tutorial with code snippets: https://gatb.inria.fr/gatb-programming-tutorial/
+  
+  This tutorial runs in action some of the code snippets available in the “examples” directory.
+  
+  All these snippets are also described here: 
+  http://gatb-core.gforge.inria.fr/doc/api/snippets_page.html
+
+- API documentation: http://gatb-core.gforge.inria.fr/doc/api/
+  
+  The complete c++ API of GATB-Core.
+
+
+=====================
+== COMPILING CODES ==
+=====================
+
+You can compile a code based on GATB-Core using the library as follows. Here, we simply compile a snippet 
+taken from the 'examples' directory:
+
+- on Linux:
+   g++ examples/debruijn/debruijn1.cpp -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -o debruijn1
+    
+-on MacOS X:
+    clang++ examples/debruijn/debruijn1.cpp -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -DBOOST_NO_CXX11_RVALUE_REFERENCES=1 -o debruijn1
+
+To get started with your own code (let's say, test.cpp), here is a quick walkthrough
+
+    wget https://github.com/GATB/gatb-core/releases/download/v1.2.2/gatb-core-1.2.2-bin-Linux.tar.gz
+    tar xf gatb-core-1.2.2-bin-Linux.tar.gz
+    mv gatb-core-1.2.2-bin-Linux gatb-core
+
+Create a small example code in test.cpp:
+
+    #include <gatb/gatb_core.hpp>
+    int main (int argc, char* argv[])
+    {
+        // a small GATB example
+
+        const size_t span = KMER_SPAN(1);
+        typedef Kmer<span>::ModelCanonical Model;
+        Model model (5);
+        Model::Kmer kmer = model.codeSeed ("AAGTC", Data::ASCII);
+        std::cout << "revcomp kmer: " << model.toString(kmer.revcomp())    << std::endl;
+    }
+
+
+Now the folder structure looks like:
+  
+    test.cpp
+    gatb-core/
+    gatb-core/include/
+    gatb-core/lib/
+    ...
+
+To compile:
+    
+    g++ test.cpp -Igatb-core/include -Lgatb-core/lib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -o test 
+
+Then the program is ready to run:
+    
+    ./test
+    
+Output:
+    
+    revcomp kmer: GACTT
+
+========================================
+== TESTING THE LIBRARY ON YOUR SYSTEM ==
+========================================
+
+You can check the library by launching unit tests on your system, as follows:
+
+  cd test
+  export CPPUNIT_VERBOSE=1
+  ./gatb-core-cppunit
+
+
+=========================
+== GATB-Core Utilities ==
+=========================
+
+The ‘bin’ directory contains the following tools:
+
+- dbgh5: converts a sequence file into a De Bruin graph and stores it into a HDF5 formatted file; 
+         file extension is: .h5
+         (HDF5 is the data format used by GATB-Core to store compact representation of a graph)
+
+- dbginfo: displays some information about a ‘.h5’ file created with ‘dbgh5’ tool
+
+- gatb-h5dump: dump the content of a ‘.h5’ file created with ‘dbgh5’ tool
+
diff --git a/gatb-core/docker/Dockerfile b/gatb-core/docker/Dockerfile
new file mode 100644
index 0000000..ec00667
--- /dev/null
+++ b/gatb-core/docker/Dockerfile
@@ -0,0 +1,169 @@
+#######################################################################################
+#
+# Dockerfile to start a GATB-Core compiling machine using these dependencies:
+#
+#     -->  gcc 4.8 
+#     -->  CMake 3.1.3
+#
+#   See below to change these values.
+#
+#--------------------------------------------------------------------------------------
+#
+# Use:
+#
+# ### To build the container, use: 
+#  
+#     docker build -f Dockerfile -t gatb_core_machine .
+#
+# ### To run the container.
+#
+#   Running the container means that you want to compile GATB-Core. For that 
+#   purpose, docker run expects some information, as illustrated in this
+#   command:
+# 
+#   docker run \
+#     -i -t \
+#     -e "GIT_BRANCH=master"                             <-- branch to build
+#     -v /path/to/gatb-core-source:/tmp/gatb-core-code \ <-- source code
+#     -v /path/to/gatb-core-build:/tmp/gatb-core-build \ <-- compiled code
+#     gatb_core_machine \                                <-- container to start
+#     gatb-compile.sh                                    <-- script to run
+#
+#   First of all, we have retain that the code is not compiled within the
+#   container. Instead we use two external volumes bound to the container using
+#   two docker run "-v" arguments. These two volumes simply target:
+#
+#      1. a directory containing the GATB-Core source code, i.e. a "git clone" of
+#         GATB-Core repository;
+#      2. a directory containing the compiled code.
+#
+#   Using such a design, you can work with an existing clone of GATB-Core 
+#   repository and you can easily access the compiled code.
+#
+#   GATB-Core source code directory (hereafter denoted as "gatb-core-source") must
+#   exist on the host system, but it can be empty. In such a case, the container
+#   will do the git clone. Thus, gatb-core-source is passed to docker run as 
+#   follows:
+#
+#      -v /full/path/to/your/gatb-core-source:/tmp/gatb-core-code
+#
+#      (do not modify "/tmp/gatb-core-code": this is the mount path within the 
+#       container)
+#
+#   GATB-Core compiled code directory (hereafter denoted as "gatb-core-build")
+#   must also exist on the host system. In all case, the container will erase its
+#   content before running the code compiling procedure.  Thus, gatb-core-build 
+#   is passed to docker run as follows:
+#
+#      -v /full/path/to/your/gatb-core-build:/tmp/gatb-core-build
+#
+#      (do not modify "/tmp/gatb-core-build": this is the mount path within the 
+#       container)
+#
+#   Finally, the docker run also accepts an optional environment variable: the 
+#   GATB-Core branch to compile. Simply pass that information using the "-e"
+#   argument of docker run as follows:
+#
+#      -e "GIT_BRANCH=master"
+#
+#      replace "master" by an appropriate value, i.e. a git branch or tag.
+#
+#   If "-e" is not provided to docker run, then the master branch of GATB-Core 
+#   is compiled.
+#
+#   All in all, the GATB-Core compiler machine can be started as follows:
+#
+#   docker run --name gatb_core_machine \
+#              -i -t \                       <-- remove if running from Jenkins/slave
+#                                                (TTY not allowed)
+#              -e "GIT_BRANCH=master"
+#              -v /path/to/gatb-core-source:/tmp/gatb-core-code \
+#              -v /path/to/gatb-core-build:/tmp/gatb-core-build \
+#              gatb_core_machine \
+#              gatb-compile.sh
+#
+#   Sample command from the real life: docker run --name gatb_core_machine -i -t -e "GIT_BRANCH=master" -v /Users/pdurand/tmp/gatb-core/docker:/tmp/gatb-core-code -v /Users/pdurand/tmp/gatb-core/docker:/tmp/gatb-core-build gatb_core_machine gatb-compile.sh
+#
+# ### Test compile code.
+#
+#   In the above docker run command, you can replace 
+#
+#     gatb-compile.sh 
+#
+#   by 
+#
+#     gatb-test.sh 
+#
+#   to run unit tests of the freshly compiled GATB-Core library.
+#                            
+# ### Additional notes
+# 
+#   Root access inside the container:
+#
+#     - if running: docker exec -it gatb_core_machine bash
+#
+#     - if not yet running: docker run --rm -i -t gatb_core_machine bash
+#
+#######################################################################################
+
+# ###
+#     Base commands
+#
+#     We use a Debian 8 (Jessie) Linux
+#
+FROM debian:jessie
+
+# who to blame?
+MAINTAINER Patrick Durand patrick.durand at inria.fr
+
+# ###
+#    Configuring gcc and cmake release
+#
+ENV GCC_VERSION=4.8 \
+    CMAKE_SERIES=3.1 \
+    CMAKE_VERSION=3.1.3
+    
+# ###
+#     Package installation and configuration
+#
+#     install latest packages of the base system
+#     as well as packages required to compile GATB-Core
+#
+RUN apt-get update && apt-get -y dist-upgrade \
+    && apt-get install -y --no-install-recommends vim git wget make zlib1g-dev libcppunit-dev \
+    && apt-get clean \
+    && git config --global http.sslVerify false
+
+# ###
+#     Compiler installation
+#
+#     We need a c/c++ compiler in an appropriate release.
+#     Note: update-alternatives used by cmake installer (./boostrap)
+#           to locate gcc
+#
+RUN apt-get install -y --no-install-recommends \
+    gcc-${GCC_VERSION} g++-${GCC_VERSION} gcc-${GCC_VERSION}-base \
+    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_VERSION} 100 \
+    && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_VERSION} 100 \
+    && apt-get clean 
+
+# ###
+#     CMAKE installation
+#
+#     we need cmake in aparticular release; we do not use: apt-get 
+#     install cmake since we have to control which version we use.
+#     Cmake install procedure: https://cmake.org/install/
+#
+RUN cd /opt \
+    && export CMAKE_URL="http://cmake.org/files/v${CMAKE_SERIES}/cmake-${CMAKE_VERSION}.tar.gz" \
+    && wget --no-check-certificate ${CMAKE_URL} -O - | tar xzf - \
+    && cd cmake-${CMAKE_VERSION} \
+    && ./bootstrap && make && make install && cd /opt && rm -rf cmake-${CMAKE_VERSION} 
+    
+
+# ###
+#     GATB-Core management scripts
+#
+COPY *.sh /usr/local/bin/
+
+
diff --git a/gatb-core/docker/Dockerfile.clang b/gatb-core/docker/Dockerfile.clang
new file mode 100644
index 0000000..a7dfc9c
--- /dev/null
+++ b/gatb-core/docker/Dockerfile.clang
@@ -0,0 +1,172 @@
+#######################################################################################
+#
+# Dockerfile to start a GATB-Core compiling machine using these dependencies:
+#
+#     -->  clang 3.6 
+#     -->  CMake 3.1.3
+#
+#   See below to change these values.
+#
+#--------------------------------------------------------------------------------------
+#
+# Use:
+#
+# ### To build the container, use: 
+#  
+#     docker build -f Dockerfile.clang -t gatb_core_machine_clang .
+#
+# ### To run the container.
+#
+#   Running the container means that you want to compile GATB-Core. For that 
+#   purpose, docker run expects some information, as illustrated in this
+#   command:
+# 
+#   docker run \
+#     -i -t \
+#     -e "GIT_BRANCH=master"                             <-- branch to build
+#     -v /path/to/gatb-core-source:/tmp/gatb-core-code \ <-- source code
+#     -v /path/to/gatb-core-build:/tmp/gatb-core-build \ <-- compiled code
+#     gatb_core_machine_clang \                          <-- container to start
+#     gatb-compile.sh                                    <-- script to run
+#
+#   First of all, we have retain that the code is not compiled within the
+#   container. Instead we use two external volumes bound to the container using
+#   two docker run "-v" arguments. These two volumes simply target:
+#
+#      1. a directory containing the GATB-Core source code, i.e. a "git clone" of
+#         GATB-Core repository;
+#      2. a directory containing the compiled code.
+#
+#   Using such a design, you can work with an existing clone of GATB-Core 
+#   repository and you can easily access the compiled code.
+#
+#   GATB-Core source code directory (hereafter denoted as "gatb-core-source") must
+#   exist on the host system, but it can be empty. In such a case, the container
+#   will do the git clone. Thus, gatb-core-source is passed to docker run as 
+#   follows:
+#
+#      -v /full/path/to/your/gatb-core-source:/tmp/gatb-core-code
+#
+#      (do not modify "/tmp/gatb-core-code": this is the mount path within the 
+#       container)
+#
+#   GATB-Core compiled code directory (hereafter denoted as "gatb-core-build")
+#   must also exist on the host system. In all case, the container will erase its
+#   content before running the code compiling procedure.  Thus, gatb-core-build 
+#   is passed to docker run as follows:
+#
+#      -v /full/path/to/your/gatb-core-build:/tmp/gatb-core-build
+#
+#      (do not modify "/tmp/gatb-core-build": this is the mount path within the 
+#       container)
+#
+#   Finally, the docker run also accepts an optional environment variable: the 
+#   GATB-Core branch to compile. Simply pass that information using the "-e"
+#   argument of docker run as follows:
+#
+#      -e "GIT_BRANCH=master"
+#
+#      replace "master" by an appropriate value, i.e. a git branch or tag.
+#
+#   If "-e" is not provided to docker run, then the master branch of GATB-Core 
+#   is compiled.
+#
+#   All in all, the GATB-Core compiler machine can be started as follows:
+#
+#   docker run --name gatb_core_machine_clang \
+#              -i -t \                       <-- remove if running from Jenkins/slave
+#                                                (TTY not allowed)
+#              -e "GIT_BRANCH=master"
+#              -v /path/to/gatb-core-source:/tmp/gatb-core-code \
+#              -v /path/to/gatb-core-build:/tmp/gatb-core-build \
+#              gatb_core_machine_clang \
+#              gatb-compile.sh
+#
+#   Sample command from the real life: docker run --name gatb_core_machine_clang -i -t -e "GIT_BRANCH=master" -v /Users/pdurand/tmp/gatb-core/docker:/tmp/gatb-core-code -v /Users/pdurand/tmp/gatb-core/docker:/tmp/gatb-core-build gatb_core_machine_clang gatb-compile.sh
+#
+# ### Test compile code.
+#
+#   In the above docker run command, you can replace 
+#
+#     gatb-compile.sh 
+#
+#   by 
+#
+#     gatb-test.sh 
+#
+#   to run unit tests of the freshly compiled GATB-Core library.
+#                            
+# ### Additional notes
+# 
+#   Root access inside the container:
+#
+#     - if running: docker exec -it gatb_core_machine_clang bash
+#
+#     - if not yet running: docker run --rm -i -t gatb_core_machine_clang bash
+#
+#######################################################################################
+
+# ###
+#     Base commands
+#
+#     We use a Debian 8 (Jessie) Linux
+#
+FROM debian:jessie
+
+# who to blame?
+MAINTAINER Patrick Durand patrick.durand at inria.fr
+
+# ###
+#    Configuring gcc and cmake release
+#
+ENV CLANG_VERSION=3.6 \
+    CMAKE_SERIES=3.1 \
+    CMAKE_VERSION=3.1.3
+
+# ###
+#     Package installation and configuration
+#
+#     install latest packages of the base system
+#     as well as packages required to compile GATB-Core
+#     Note: 'software-properties-commo'n contains 'add-apt-repository' tool.
+#           It is required to to install clang/llvm.
+#
+RUN apt-get update && apt-get -y dist-upgrade \
+    && apt-get install -y --no-install-recommends software-properties-common vim git wget make zlib1g-dev libcppunit-dev \
+    && apt-get clean \
+    && git config --global http.sslVerify false
+
+# ###
+#     Compiler installation
+#
+#     We need a clang/llvm compiler in an appropriate release.
+#     Reference: http://apt.llvm.org/
+#
+RUN add-apt-repository "deb http://apt.llvm.org/jessie/ llvm-toolchain-jessie-${CLANG_VERSION} main" \
+    && wget -O - http://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
+    && apt-get update \
+    && apt-get install -y --no-install-recommends clang-${CLANG_VERSION} lldb-${CLANG_VERSION} \
+    && apt-get clean
+
+# ###
+#     CMAKE installation
+#
+#     we need cmake in aparticular release; we do not use: apt-get 
+#     install cmake since we have to control which version we use.
+#     Cmake install procedure: https://cmake.org/install/
+#
+ENV CC=/usr/bin/clang-${CLANG_VERSION} \
+    CXX=/usr/bin/clang++-${CLANG_VERSION}
+
+RUN cd /opt \
+    && export CMAKE_URL="http://cmake.org/files/v${CMAKE_SERIES}/cmake-${CMAKE_VERSION}.tar.gz" \
+    && wget --no-check-certificate ${CMAKE_URL} -O - | tar xzf - \
+    && cd cmake-${CMAKE_VERSION} \
+    && ./bootstrap && make && make install && cd /opt && rm -rf cmake-${CMAKE_VERSION} 
+
+# ###
+#     GATB-Core management scripts
+#
+COPY *.sh /usr/local/bin/
+
+
diff --git a/gatb-core/docker/gatb-compile.sh b/gatb-core/docker/gatb-compile.sh
new file mode 100755
index 0000000..476dde2
--- /dev/null
+++ b/gatb-core/docker/gatb-compile.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+#***************************************************************************
+# GATB-Core management script: compile source code using a Docker container.
+#
+# When running inside its Docker container, we expect to find
+# two working paths (inside the container):
+#  /tmp/gatb-core-code: will contain the git clone of GATB-Core
+#  /tmp/gatb-core-build: will contain the compiled code 
+#
+# The script also uses the environment variable: GIT_BRANCH, than can
+# be set to an appropriate GATB-Core branch. If not set, we work on
+# the master branch.
+#
+#
+# Author: Patrick Durand, Inria
+# Created: February 2017
+#****************************************************************************
+
+#set -xv
+
+GCORE_SOURCE=/tmp/gatb-core-code
+GCORE_BUILD=/tmp/gatb-core-build
+
+[ ! -d ${GCORE_SOURCE} ] && { echo "${GCORE_SOURCE} does not exist. Abort."; exit 1; }
+[ ! -d ${GCORE_BUILD} ] && { echo "${GCORE_BUILD} does not exist. Abort."; exit 1; }
+
+if [ -z ${GIT_PROVIDER} ]; then
+  GIT_PROVIDER="hub"
+fi
+
+# git management not done for Jenkins/CI (Inria only)
+if [ ! ${GIT_PROVIDER} == "ci" ]; then
+  # Figure out whether or not we have to get GATB-Core source code
+  cd ${GCORE_SOURCE}
+  if [ ! -d "gatb-core" ]; then
+      git clone https://github.com/GATB/gatb-core.git 
+  fi
+
+  # Update GATB-Core then checkout appropriate branch
+  cd gatb-core
+  git pull --all
+
+  # set default branch to master if not specified otherwise using
+  # GIT_BRANCH environment variable
+  if [ -z ${GIT_BRANCH} ]; then
+    GIT_BRANCH=master
+  fi
+
+  git checkout ${GIT_BRANCH}
+fi
+
+# Prepare a fresh build directory
+cd ${GCORE_BUILD}
+if [ -d "build" ]; then
+    rm -rf build
+fi
+mkdir build 
+cd build 
+
+# Compile source code
+cmake ${GCORE_SOURCE}/gatb-core/gatb-core 
+make 
diff --git a/gatb-core/docker/gatb-test.sh b/gatb-core/docker/gatb-test.sh
new file mode 100755
index 0000000..4436c1e
--- /dev/null
+++ b/gatb-core/docker/gatb-test.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+#**************************************************************************
+# GATB-Core management script: test compiled code using a Docker container.
+#
+# When running inside its Docker container, we expect to find
+# a working path (inside the container):
+#  /tmp/gatb-core-build: will contain the compiled code 
+#
+# Author: Patrick Durand, Inria
+# Created: February 2017
+#**************************************************************************
+
+#set -xv
+
+GCORE_BUILD=/tmp/gatb-core-build/build
+GCORE_SOURCE=/tmp/gatb-core-code
+
+[ ! -d ${GCORE_BUILD} ] && { echo "${GCORE_BUILD} does not exist. Abort."; exit 1; }
+
+# Run unit tests
+cd ${GCORE_BUILD}
+
+cp -r ${GCORE_SOURCE}/gatb-core/gatb-core/test/db ./test/ 
+export CPPUNIT_VERBOSE=1 
+cd bin 
+./gatb-core-cppunit
diff --git a/gatb-core/examples/CMakeLists.txt b/gatb-core/examples/CMakeLists.txt
new file mode 100644
index 0000000..d3d8959
--- /dev/null
+++ b/gatb-core/examples/CMakeLists.txt
@@ -0,0 +1,35 @@
+################################################################################
+message ("--  ---------- GATB EXAMPLES ----------")
+################################################################################
+
+################################################################################
+#  EXAMPLES 
+################################################################################
+
+# We add the compilation options for the library
+add_definitions (${gatb-core-flags})
+
+include_directories (${gatb-core-includes})
+
+# We add the path for extra libraries
+link_directories (${gatb-core-extra-libraries-path})
+
+file (GLOB_RECURSE  PROGRAMS_FILES  *.cpp)
+
+FOREACH (program ${PROGRAMS_FILES})
+
+    # we get the base name of the current example
+    get_filename_component(basename ${program} NAME_WE)
+   
+    # we add an executable for this example
+    add_executable (${basename} ${program})
+  
+    # we use the gatb core libraries for the link
+    target_link_libraries (${basename} ${gatb-core-libraries})
+
+    list (APPEND PROGRAMS_NAMES ${basename})
+      
+ENDFOREACH (program)
+
+# We add a custom target for making all examples
+add_custom_target (examples ALL DEPENDS ${PROGRAMS_NAMES})
diff --git a/gatb-core/examples/README.md b/gatb-core/examples/README.md
new file mode 100644
index 0000000..e0abca8
--- /dev/null
+++ b/gatb-core/examples/README.md
@@ -0,0 +1,84 @@
+# GATB-Core example code snippets
+
+This directory contains many ready-to-compile code snippets you can use to learn [GATB-Core c++ API](http://gatb-core.gforge.inria.fr/doc/api/).
+
+## Dependencies
+
+The following third parties have to be already installed to compile GATB-Core examples:
+
+* a **C++/11 capable compiler** (*e.g.* gcc 4.7+, clang 3.5+, Apple/clang 6.0+)
+* **CMake 3.1+**
+
+
+## Compile GATB-CORE snippets
+
+### Get a copy of the project
+
+If not already done:
+
+	cd <some_directory>
+	git clone https://github.com/GATB/gatb-core.git
+
+### Compile all snippets
+
+	cd <some_directory>/gatb-core/gatb-core
+	mkdir build
+	cd build
+	cmake -DGATB_CORE_INCLUDE_EXAMPLES=True -DCMAKE_BUILD_TYPE=Debug .. 
+	make -j8 examples
+
+### Compile a particular snippet
+
+Instead of using:
+
+	make -j8 examples
+
+simply do:
+
+	make -j8 bank15
+
+to compile snippet "bank15.cpp". Apply the same recipe to compile any other code snippets.
+
+### Run a compiled code snippet
+
+Have a look at the begining of each c++ source code: you'll see how to use the example programs.
+
+For instance, taking the above example "bank15.cpp", you run it as follows:
+
+    # from within the 'build' directory:
+    ./bin/bank15 ../test/db/reads1.fa
+
+## Documentation
+
+Basic APIs explained:
+
+* [Bank](http://gatb-core.gforge.inria.fr/doc/api/snippets_bank.html): read/write FastA and FastQ files (plain text and gzip)
+* [Iterator](http://gatb-core.gforge.inria.fr/doc/api/snippets_iterators.html): go through a Bank by iterating over its sequences
+* [k-mer](http://gatb-core.gforge.inria.fr/doc/api/snippets_kmer.html): from sequences to k-mers
+* [De Bruijn Graph](http://gatb-core.gforge.inria.fr/doc/api/snippets_graph.html): from sequences to De Bruijn Graphs
+
+Advanced APIs explained:
+
+* [Multi-threading](http://gatb-core.gforge.inria.fr/doc/api/snippets_multithread.html): easy way to manage multi-threaded tasks on Linux and OSX
+* [Storage](http://gatb-core.gforge.inria.fr/doc/api/snippets_storage.html): easy way to handle HDF5 storage
+
+Make your own full-featured GATB-Tool:
+
+* [Tool API](http://gatb-core.gforge.inria.fr/doc/api/snippets_tools.html): make a command-line based tool quickly
+
+The complete GATB-Core API reference documentation is [here](http://gatb-core.gforge.inria.fr/doc/api/index.html).
+
+## Online tutorial
+
+Some of these code snippets are also available for direct use from the [GATB-Core online Tutorial](https://gatb.inria.fr/gatb-programming-tutorial/).
+
+## Contact
+
+To contact a developer, request help, *etc*, use: 
+
+    https://gatb.inria.fr/contact/
+    
+
+## License
+
+GATB is free software; you can redistribute it and/or modify it under the [Affero GPL v3 license](http://www.gnu.org/licenses/agpl-3.0.en.html).
\ No newline at end of file
diff --git a/gatb-core/examples/bank/bank1.cpp b/gatb-core/examples/bank/bank1.cpp
new file mode 100644
index 0000000..8ca1b56
--- /dev/null
+++ b/gatb-core/examples/bank/bank1.cpp
@@ -0,0 +1,44 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a FASTA bank and iterate its sequences.       */
+/* Some attributes of the iterated Sequence objects are used.                   */
+/*                                                                              */
+/* Cmd-line: bank1 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank1 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the file name from the user arguments
+    const char* filename = argc >= 2 ? argv[1] : "";
+
+//! [snippet1_bank]
+    // We declare a Bank instance.
+    BankFasta b (filename);
+
+    // We create an iterator over this bank.
+    BankFasta::Iterator it (b);
+
+    // We loop over sequences.
+    for (it.first(); !it.isDone(); it.next())
+    {
+        // In the following, see how we access the current sequence information through
+        // the -> operator of the iterator
+
+        // We dump the data size and the comment
+        std::cout << "[" << it->getDataSize() << "] " << it->getComment()  << std::endl;
+
+        // We dump the data
+        std::cout << it->toString() << std::endl;
+    }
+//! [snippet1_bank]
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank10.cpp b/gatb-core/examples/bank/bank10.cpp
new file mode 100644
index 0000000..2a4c95e
--- /dev/null
+++ b/gatb-core/examples/bank/bank10.cpp
@@ -0,0 +1,123 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <sstream>
+
+// We use the required packages
+using namespace std;
+
+static const char* STR_MAX_INPUT_SIZE = "-max-size";
+static const char* STR_OUTPUT_FASTQ   = "-fastq";
+static const char* STR_OUTPUT_GZ      = "-gz";
+
+/********************************************************************************/
+/*                         Bank split                                           */
+/*                                                                              */
+/* This snippet shows how to split a bank into smaller banks and how to create  */
+/* an album bank (ie a list of URL of banks). Such an album bank could be used  */
+/* as bank input by other tools.                                                */
+/* Note: all the generated files are put in a directory created by the snippet. */
+/*                                                                              */
+/* Cmd-line: -in <fasta/q file> -max-size <nb. nucl.>                           */
+/*           [-out-dir <some_dir>  -fastq 1 -gz 1 ]                             */
+/*                                                                              */
+/* Sample: bank10 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                -out-dir /tmp                                                 */
+/*                -max-size 5000                                                */
+/*         output: a new directory within ${out-dir} with sequences splitted    */
+/*                 by chunck of 5000 nucleotides                                */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankSplitter");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,      "bank reference",            true));
+    parser.push_back (new OptionOneParam (STR_MAX_INPUT_SIZE, "average db size per split", true));
+    parser.push_back (new OptionOneParam (STR_URI_OUTPUT_DIR, "output directory",          false, "."));
+    parser.push_back (new OptionNoParam  (STR_OUTPUT_FASTQ,   "fastq output",              false));
+    parser.push_back (new OptionNoParam  (STR_OUTPUT_GZ,      "gzip output",               false));
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** Shortcuts. */
+        u_int64_t maxDbSize = options->getInt(STR_MAX_INPUT_SIZE);
+
+        // We declare an input Bank
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        // We get the basename of the input bank.
+        string inputBasename = System::file().getBaseName (options->getStr(STR_URI_INPUT));
+
+        /** We set the name of the output directory. */
+        stringstream ss;  ss << inputBasename << "_S" << maxDbSize;
+        string outputDirName = ss.str();
+
+        /** We create the output directory. */
+        string outputDir = options->getStr(STR_URI_OUTPUT_DIR) + "/" + outputDirName;
+        System::file().mkdir (outputDir, S_IRWXU);
+
+        // We create the album bank.
+        BankAlbum album (outputDir + "/album.txt");
+
+        /** We get estimations about the bank. */
+        u_int64_t number, totalSize, maxSize;
+        inputBank->estimate (number, totalSize, maxSize);
+
+        u_int64_t estimationNbSeqToIterate = number;
+
+        // We create an iterator over the input bank
+        ProgressIterator<Sequence> itSeq (*inputBank, "split");
+
+        // We loop over sequences to get the exact number of sequences.
+          int64_t nbBanksOutput = -1;
+        u_int64_t nbSequences   =  0;
+        u_int64_t dbSize        = ~0;
+
+        bool isFastq   = options->get(STR_OUTPUT_FASTQ) != 0;
+        bool isGzipped = options->get(STR_OUTPUT_GZ)    != 0;
+
+        IBank* currentBank = 0;
+
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            if (dbSize > maxDbSize)
+            {
+                if (currentBank != 0)  { currentBank->flush();  currentBank->finalize(); }
+
+                nbBanksOutput ++;
+
+                /** We build the uri of the current bank. */
+                stringstream ss;  ss << inputBasename << "_" << nbBanksOutput << (isFastq ? ".fastq" : ".fasta");
+                if (isGzipped) { ss << ".gz"; }
+
+                /** We create a new bank and put it in the album. */
+                currentBank = album.addBank (outputDir, ss.str(), isFastq, isGzipped);
+
+                /** We reinit the db size counter. */
+                dbSize = 0;
+            }
+
+            dbSize += itSeq->getDataSize();
+
+            /** We insert the sequence into the current output bank. */
+            currentBank->insert (*itSeq);
+        }
+
+        if (currentBank != 0)  { currentBank->flush(); }
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (cout);
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank11.cpp b/gatb-core/examples/bank/bank11.cpp
new file mode 100644
index 0000000..96a2612
--- /dev/null
+++ b/gatb-core/examples/bank/bank11.cpp
@@ -0,0 +1,61 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*           Iterate a bank whose sequences are each kmer of a model.           */
+/*                                                                              */
+/* This snippet shows how iterate all possible kmers of a given size and dump   */
+/* them as output. This program can be viewed as a kmer generator.              */
+/*                                                                              */
+/* Cmd-line: bank11 -kmer-size <size> -out <fasta file>                         */
+/*                                                                              */
+/* Sample: bank11 -kmer-size 4 -out /tmp/kmer.fa                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("KmerIteration");
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE,   "kmer size",          true));
+    parser.push_back (new OptionOneParam (STR_URI_OUTPUT,  "output fasta bank",  false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We create a kmers bank with the provided kmer size. */
+        BankKmers bank (options->getInt(STR_KMER_SIZE));
+
+        /** We create the output bank. */
+        string outputName = options->get(STR_URI_OUTPUT) ?
+            options->getStr(STR_URI_OUTPUT) :
+            Stringify::format ("bank_k%d.fa", options->getInt(STR_KMER_SIZE));
+
+        BankFasta outputBank (outputName);
+
+        /** We create a Sequence iterator. */
+        ProgressIterator<Sequence> it (bank);
+
+        /** We iterate the bank. */
+        for (it.first(); !it.isDone(); it.next())  {  outputBank.insert (it.item());  }
+
+        /** We flush the output bank. */
+        outputBank.flush();
+    }
+
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (cout);
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank12.cpp b/gatb-core/examples/bank/bank12.cpp
new file mode 100644
index 0000000..83c42ab
--- /dev/null
+++ b/gatb-core/examples/bank/bank12.cpp
@@ -0,0 +1,87 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+static const char* STR_URI_SEQ_IDS = "-seq-ids";
+
+// We use a filtering functor that knows which sequence indexes have to be kept.
+struct FilterFunctor
+{
+    set<size_t>& indexes;
+    FilterFunctor (set<size_t>& indexes) : indexes(indexes) {}
+    bool operator ()  (Sequence& seq) const  {  return indexes.find (seq.getIndex()) != indexes.end();  }
+};
+
+/********************************************************************************/
+/*           Extract sequences from a bank.                                     */
+/*                                                                              */
+/* This snippet shows how to extract some sequences for a given list of indexes.*/
+/* An "index" i means the i-th sequence inside the input file                   */
+/* These indexes are read from an input file, one index per line.               */
+/* E.g. if the index files contains:
+ *    1                                                                         
+      5                                                                         */
+/* Then read number 1 and number 5 will be returned */
+/*                                                                              */
+/* Cmd-line: bank12 -in <fasta/q file> -seq-ids <seq-ids file>                  */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankFilter");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,    "bank reference",               true));
+    parser.push_back (new OptionOneParam (STR_URI_SEQ_IDS,  "file holding indexes of bank", true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We read the list of indexes. */
+        set<size_t> indexes;
+        FILE* file = fopen (options->getStr(STR_URI_SEQ_IDS).c_str(), "r");
+        if (file != 0)
+        {
+            char buffer[128];
+            while (fgets (buffer, sizeof(buffer), file))  {  indexes.insert (atoi(buffer));  }
+            fclose (file);
+        }
+
+        cout << "found " << indexes.size() << " indexes" << endl;
+
+        /** We open the output bank. */
+        string outputBankUri = options->getStr(STR_URI_INPUT) + "_" + System::file().getBaseName (options->getStr(STR_URI_SEQ_IDS));
+        BankFasta outputBank(outputBankUri);
+
+        /** We loop the input bank. */
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        /** We use another iterator for filtering out some sequences. */
+        FilterIterator<Sequence,FilterFunctor> itSeq (inputBank->iterator(), FilterFunctor(indexes));
+
+        /** We loop the sequences. */
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            outputBank.insert (itSeq.item());
+        }
+
+        /** We flush the output bank. */
+        outputBank.flush();
+    }
+
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (cout);
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank13.cpp b/gatb-core/examples/bank/bank13.cpp
new file mode 100644
index 0000000..da4c2d6
--- /dev/null
+++ b/gatb-core/examples/bank/bank13.cpp
@@ -0,0 +1,78 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+static const char* STR_FILTER_RATIO = "-filter-ratio";
+
+/********************************************************************************/
+/*                  Filter sequences having too many bad letters.               */
+/*                                                                              */
+/* This snippet shows how to keep sequences that have enough "good" data.       */
+/*                                                                              */
+/* A sequence is retained only if nb(A,C,G,T)/seq_size>=filter-ratio .          */
+/*                                                                              */
+/* Cmd-line: bank13 -in <fasta/q file> -filter-ratio <[0.0..1.0]>               */
+/*                                                                              */
+/* Sample: bank13 -in gatb-core/gatb-core/test/db/reads1.fa -filter-ratio 0.8   */
+/*         (output bank will be file:  reads1.fa_filtered)                      */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankFilter");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,     "bank input",   true));
+    parser.push_back (new OptionOneParam (STR_FILTER_RATIO,  "skip a sequence if 'good letters number / seq.len > X'",   false, "0.8"));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** Shortcuts. */
+        double percentThreshold = options->getDouble(STR_FILTER_RATIO);
+
+        /** We open the input bank. */
+        IBank* inBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inBank);
+
+        /** We create the output inBank. */
+        IBank* outBank = new BankFasta (options->getStr(STR_URI_INPUT) + "_filtered");
+        LOCAL (outBank);
+
+        /** We iterate the inBank. NOTE: WE USE A LAMBDA EXPRESSION HERE. */
+        inBank->iterate ([&] (Sequence& s)
+        {
+            /** Shortcut. */
+            char* data = s.getDataBuffer();
+
+            size_t nbOK = 0;
+            for (size_t i=0; i<s.getDataSize(); i++)
+            {
+                if (data[i]=='A' || data[i]=='C' || data[i]=='G' || data[i]=='T')  { nbOK++; }
+            }
+
+            if ((double)nbOK / (double)s.getDataSize() > percentThreshold)  {  outBank->insert (s);  }
+        });
+
+        /** We flush the output bank. */
+        outBank->flush();
+    }
+
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (cout);
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank14.cpp b/gatb-core/examples/bank/bank14.cpp
new file mode 100644
index 0000000..aa6b792
--- /dev/null
+++ b/gatb-core/examples/bank/bank14.cpp
@@ -0,0 +1,61 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a FASTA bank and iterate its sequences        */
+/* to provide some stats: data size, nb. sequences, etc.                        */
+/*                                                                              */
+/* Cmd-line: bank14 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank14 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We get information about the bank.
+        u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0;
+
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        ProgressIterator<Sequence> it (*inputBank, "iterate");
+        for (it.first(); !it.isDone(); it.next())
+        {
+            Data& data = it.item().getData();
+
+            nbSequences ++;
+            if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+            if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+            dataSize += data.size ();
+        }
+
+        std::cout << "data size         : " << dataSize     << std::endl;
+        std::cout << "sequence number   : " << nbSequences  << std::endl;
+        std::cout << "sequence max size : " << seqMaxSize   << std::endl;
+        std::cout << "sequence min size : " << seqMinSize   << std::endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank15.cpp b/gatb-core/examples/bank/bank15.cpp
new file mode 100644
index 0000000..707eb7d
--- /dev/null
+++ b/gatb-core/examples/bank/bank15.cpp
@@ -0,0 +1,50 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a FASTA bank and iterate its sequences        */
+/* to provide some stats: data size, nb. sequences, etc.                        */
+/*                                                                              */
+/* Cmd-line: bank15 <fasta/q file>                                              */
+/*                                                                              */
+/* Sample: bank15 gatb-core/gatb-core/test/db/reads1.fa                         */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the file name from the user arguments
+    const char* filename = argc >= 2 ? argv[1] : "";
+
+    // We get information about the bank.
+    u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0;
+
+    // We declare a Bank instance.
+    IBank* bank = Bank::open (filename);
+    LOCAL (bank);
+    Iterator<Sequence>* it = bank->iterator();
+    LOCAL (it);
+    
+    // We loop over sequences.
+    for (it->first(); !it->isDone(); it->next())
+    {
+        Sequence& seq = it->item();
+
+        Data& data = seq.getData();
+
+        nbSequences ++;
+        if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+        if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+        dataSize += data.size ();
+    }
+
+    std::cout << "# letters         : " << dataSize     << std::endl;
+    std::cout << "# sequences       : " << nbSequences  << std::endl;
+    std::cout << "sequence max size : " << seqMaxSize   << std::endl;
+    std::cout << "sequence min size : " << seqMinSize   << std::endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank16.cpp b/gatb-core/examples/bank/bank16.cpp
new file mode 100644
index 0000000..40ce8b6
--- /dev/null
+++ b/gatb-core/examples/bank/bank16.cpp
@@ -0,0 +1,72 @@
+//! [snippet16]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank opening                                    */
+/*                                                                              */
+/* This snippet shows how to open a bank with a URI and without specifying      */
+/* the actual type of the bank. The correct bank format is found by analyzing   */
+/* the URI and/or the content of the resource given by the URI.                 */
+/*                                                                              */
+/* This code produces on std::out the sequence description and the sequence     */
+/* itself.                                                                      */
+/*                                                                              */
+/* Cmd-line: bank16 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank16 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        std::string filename = options->getStr(STR_URI_INPUT);
+
+        //! [snippet16_bank]
+        // We get an instance of IBank from the URI.
+        IBank* bank = Bank::open (filename);
+
+        //! [snippet16_seq]
+        // We create an iterator on the bank
+        Iterator<Sequence>* it = bank->iterator();
+
+        // We iterate the sequences of the bank
+        for (it->first(); !it->isDone(); it->next())
+        {
+            // We get a shortcut on the current sequence and its data
+            Sequence& seq  = it->item();
+            Data&     data = seq.getData();
+
+            // We dump some information about the sequence.
+            std::cout << "comment " << seq.getComment() << std::endl;
+
+            // We dump each nucleotide. NOTE: the output depends on the data encoding
+            for (size_t i=0; i<data.size(); i++)  {  std::cout << data[i];  }  std::cout << std::endl;
+        }
+
+        //! [snippet16_seq]
+        // The bank and the iterator have been allocated on the heap, so we have to delete them
+        delete it;
+        delete bank;
+        //! [snippet16_bank]
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet16]
diff --git a/gatb-core/examples/bank/bank17.cpp b/gatb-core/examples/bank/bank17.cpp
new file mode 100644
index 0000000..0e619d5
--- /dev/null
+++ b/gatb-core/examples/bank/bank17.cpp
@@ -0,0 +1,61 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank album                                      */
+/*                                                                              */
+/* A BankAlbum file is a bank defined by a list of URI of other banks.          */
+/*                                                                              */
+/* This code produces on std::out the total bank size, then each sequence       */
+/* description.                                                                 */
+/*                                                                              */
+/* Cmd-line: bank17 -in <album file>                                            */
+/*                                                                              */
+/* Sample: bank17 -in gatb-core/gatb-core/test/db/album.txt                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        std::string filename = options->getStr(STR_URI_INPUT);
+
+        //! [snippet17_album]
+        // We declare a Bank instance.
+        BankAlbum bank (filename);
+
+        // We dump some information about the bank
+        std::cout << "cummulated files sizes : " << bank.getSize() << std::endl;
+
+        // We create an iterator on the bank
+        Iterator<Sequence>* it = bank.iterator();
+        LOCAL (it);
+
+        // We iterate the sequences of the bank
+        for (it->first(); !it->isDone(); it->next())
+        {
+            // We dump some information about the sequence.
+            std::cout << "comment " << it->item().getComment() << std::endl;
+        }
+        //! [snippet17_album]
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank18.cpp b/gatb-core/examples/bank/bank18.cpp
new file mode 100644
index 0000000..3c39777
--- /dev/null
+++ b/gatb-core/examples/bank/bank18.cpp
@@ -0,0 +1,64 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                          Read two banks                                      */
+/*                                                                              */
+/* This snippet shows how to read two banks at the same time. Iterated items    */
+/* are pairs of two sequences. This may be useful to read pair ends banks for   */
+/* instance.                                                                    */
+/*                                                                              */
+/* This code produces on std::out the sequence description of each sequence     */
+/* contained in the two sequence files.                                         */
+/*                                                                              */
+/* See also bank17.cpp where we do the same using a single album file.          */
+/*                                                                              */
+/* Cmd-line: bank18 -one <fasta/q file> -two <fasta/q file>                     */
+/*                                                                              */
+/* Sample: bank18 -one gatb-core/gatb-core/test/db/reads1.fa                    */
+/*                -two gatb-core/gatb-core/test/db/reads2.fa                    */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    static const char* STR_BANK1 = "-one";
+    static const char* STR_BANK2 = "-two";
+
+    /** We create a command line parser. */
+    OptionsParser parser ("TwoBanks");
+    parser.push_back (new OptionOneParam (STR_BANK1, "bank one",   true));
+    parser.push_back (new OptionOneParam (STR_BANK2, "bank two",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We open the two banks
+        IBank* bank1 = Bank::open (options->getStr(STR_BANK1));  LOCAL (bank1);
+        IBank* bank2 = Bank::open (options->getStr(STR_BANK2));  LOCAL (bank2);
+
+        // We iterate the two banks. Note how we provide two iterators from the two banks.
+        PairedIterator<Sequence> itPair (bank1->iterator(), bank2->iterator());
+
+        for (itPair.first(); !itPair.isDone(); itPair.next())
+        {
+            Sequence& s1 = itPair.item().first;
+            Sequence& s2 = itPair.item().second;
+
+            std::cout << "seq1.len=" << s1.getDataSize() << " seq2.len=" << s2.getDataSize() << std::endl;
+        }
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank19.cpp b/gatb-core/examples/bank/bank19.cpp
new file mode 100644
index 0000000..3252f71
--- /dev/null
+++ b/gatb-core/examples/bank/bank19.cpp
@@ -0,0 +1,59 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank checksum                                   */
+/*                                                                              */
+/* This snippet shows a checkum value on the genomic data.                      */
+/*                                                                              */
+/* Cmd-line: bank19 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank19 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankCheckum");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We get information about the bank.
+        u_int64_t checksum1=0;
+        u_int64_t checksum2=0;
+
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        ProgressIterator<Sequence,ProgressNone> it (*inputBank, "iterate");
+        for (it.first(); !it.isDone(); it.next())
+        {
+            Data& data = it.item().getData();
+
+            for (size_t i=0; i<data.size(); i++)
+            {
+                checksum1 += data[i];
+                checksum2 += data[i] * it.item().getIndex();
+            }
+        }
+
+        std::cout << "checksum1=" << std::hex << checksum1 << "  checksum2=" << checksum2 << std::endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank2.cpp b/gatb-core/examples/bank/bank2.cpp
new file mode 100644
index 0000000..9d695ee
--- /dev/null
+++ b/gatb-core/examples/bank/bank2.cpp
@@ -0,0 +1,54 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                    Bank with exception management                            */
+/*                                                                              */
+/* This snippet shows how to open a bank and iterate its sequences.             */
+/* Note: we use here a try/catch block in case the bank opening doesn't work.   */
+/*                                                                              */
+/* Cmd-line: bank2 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank2 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        std::cerr << "you must provide a bank." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We create an iterator over this bank.
+        Iterator<Sequence>* it = inputBank->iterator();
+        LOCAL (it);
+
+        // We loop over sequences.
+        for (it->first(); !it->isDone(); it->next())
+        {
+            // Shortcut
+            Sequence& seq = it->item();
+
+            // We dump the data size and the comment
+            std::cout << "[" << seq.getDataSize() << "] " << seq.getComment()  << std::endl;
+
+            // We dump the data
+            std::cout << seq.toString() << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank20.cpp b/gatb-core/examples/bank/bank20.cpp
new file mode 100644
index 0000000..09e205f
--- /dev/null
+++ b/gatb-core/examples/bank/bank20.cpp
@@ -0,0 +1,52 @@
+//! [snippet1]
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                    Bank snippet                                              */
+/*                                                                              */
+/* Cmd-line: bank20 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank20 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+void dump (IBank* bank, size_t depth=0)
+{
+    LOCAL (bank);
+
+    for (size_t i=0; i<depth; i++)  { cout << "  "; }  cout << bank->getId() << endl;
+
+    BankComposite* composite = dynamic_cast<BankComposite*> (bank);
+    if (composite != 0)
+    {
+        const std::vector<IBank*> children = composite->getBanks();
+        for (size_t i=0; i<children.size(); i++)  {  dump (children[i], depth+1); }
+    }
+}
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankDump");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We dump the bank hierarchy. */
+        dump (Bank::open (options->getStr(STR_URI_INPUT)));
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
+
diff --git a/gatb-core/examples/bank/bank21.cpp b/gatb-core/examples/bank/bank21.cpp
new file mode 100644
index 0000000..1e14ab4
--- /dev/null
+++ b/gatb-core/examples/bank/bank21.cpp
@@ -0,0 +1,97 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/* WARNING:
+ * If you DO NOT have used 'cmake' with Debug mode set to on as follows:
+ *   cmake -D CMAKE_BUILD_TYPE=Debug ..
+ * to prepare a compiled version of this snippet, please uncomment
+ * these lines (otherwise assert() calls won't be executed):
+ */
+#undef NDEBUG
+#include <assert.h>
+
+/********************************************************************************/
+/*                    Compare two banks for equality                            */
+/*                                                                              */
+/* This snippet shows how to compare two banks:                                 */
+/*   - first bank is either a Fasta or a Fastq file                             */
+/*   - second bank is the leon-lossless-compressed file of the first bank       */
+/*                                                                              */
+/* Note: we use here a try/catch block in case the bank opening doesn't work.   */
+/*                                                                              */
+/* Cmd-line: bank21 <fasta/q file> <leon file>                                  */
+/*                                                                              */
+/* Sample: bank21 gatb-core/gatb-core/test/db/sample.fastq \                    */
+/*                gatb-core/gatb-core/test/db/sample.fastq.leon                 */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        std::cerr << "you must provide two banks." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        string btype = Bank::getType(argv[1]);
+    	assert(
+        		btype.compare("fasta")==0 ||
+				btype.compare("fastq")==0
+        );
+        // We open the reference file
+        IBank* fasBank = Bank::open (argv[1]);
+
+        btype = Bank::getType(argv[2]);
+        assert(btype.compare("leon")==0);
+
+        // We open its leon-lossless-compressed representation
+        IBank* leonBank = Bank::open (argv[2]);
+
+        u_int64_t nbSeqFas = 0;
+        u_int64_t nbSeqLeon = 0;
+
+        // We create iterators over this bank.
+        Iterator<Sequence>* itFas = fasBank->iterator();
+        Iterator<Sequence>* itLeon = leonBank->iterator();
+        {
+			// we use a GATB-Core macro to automatically release
+			// memory allocated here as soon as we leave this code
+			// block
+			LOCAL(itFas);
+			LOCAL(itLeon);
+
+			// We do not use estimate() methods. Instead, we count
+			// exact number of sequences in both banks
+			for (itFas->first(); !itFas->isDone(); itFas->next()){nbSeqFas++;}
+			for (itLeon->first(); !itLeon->isDone(); itLeon->next()){nbSeqLeon++;}
+			assert(nbSeqFas==nbSeqLeon);
+        }
+
+		// We create a PairedIterator to go through both banks simultaneously
+		itFas = fasBank->iterator();
+		itLeon = leonBank->iterator();
+		LOCAL(itFas);
+		LOCAL(itLeon);
+		PairedIterator<Sequence,Sequence> it (itFas, itLeon);
+
+        for (it.first(); !it.isDone(); it.next())
+        {
+        	// check sequence comment for equality
+        	assert(it->first.getComment().compare(it->second.getComment())==0);
+        	// check sequence letters for equality
+        	assert(it->first.toString().compare(it->second.toString())==0);
+        	// check sequence quality for equality
+        	assert(it->first.getQuality().compare(it->second.getQuality())==0);
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank22.cpp b/gatb-core/examples/bank/bank22.cpp
new file mode 100644
index 0000000..4e4be6b
--- /dev/null
+++ b/gatb-core/examples/bank/bank22.cpp
@@ -0,0 +1,50 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*    Extract some sequences from a Fastq sequence file.                        */
+/*                                                                              */
+/* Cmd-line: bank22 <in_bank> <out_bank> <nb_seq_to_retain>                     */
+/*                                                                              */
+/* Sample: bank22 gatb-core/gatb-core/test/db/giab.hg002.2D.fastq.gz \          */
+/*                /tmp/new_file.fastq                                           */
+/*                500                                                           */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 4)
+    {
+        std::cerr << "you must provide: in_bank_name out_bank_name nb_seq_to_retain" << std::endl;
+        return EXIT_FAILURE;
+    }
+
+	// We open the reference file
+	IBank* inBank = Bank::open (argv[1]);
+	std::string outB(argv[2]);
+	//constructor: fileName to create,
+	BankFasta outputBank (
+		outB, // file name to create
+		true  // write fastq instead of default fasta
+		//,true // optional you can use gzip compression directly
+	);
+
+	// We create iterators over this bank.
+	Iterator<Sequence>* itseq = inBank->iterator();
+	itseq = inBank->iterator();
+	LOCAL(itseq);
+	int limit = atoi(argv[3]);
+	int count=0;
+	for (itseq->first(); !itseq->isDone(); itseq->next())
+	{
+		outputBank.insert (itseq->item());
+		count++;
+		if (count>=limit){
+			break;
+		}
+	}
+	outputBank.flush();
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank23.cpp b/gatb-core/examples/bank/bank23.cpp
new file mode 100644
index 0000000..42939af
--- /dev/null
+++ b/gatb-core/examples/bank/bank23.cpp
@@ -0,0 +1,49 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a bank and iterate its sequences              */
+/* to provide some stats: data size, nb. sequences, etc.                        */
+/*                                                                              */
+/* Cmd-line: bank23 <fasta/q file>                                              */
+/*                                                                              */
+/* Sample: bank23 gatb-core/gatb-core/test/db/reads1.fa                         */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the file name from the user arguments
+    const char* filename = argc >= 2 ? argv[1] : "";
+
+    // We get information about the bank.
+    u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0;
+
+    // We declare a Bank instance.
+    IBank* bank = Bank::open (filename);
+    LOCAL (bank);
+    ProgressIterator<Sequence> iter (*bank, "Iterating sequences");
+    
+    // We loop over sequences.
+    for (iter.first(); !iter.isDone(); iter.next())
+    {
+        Sequence& seq = iter.item();
+
+        Data& data = seq.getData();
+
+        nbSequences ++;
+        if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+        if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+        dataSize += data.size ();
+    }
+
+    std::cout << "# letters         : " << dataSize     << std::endl;
+    std::cout << "# sequences       : " << nbSequences  << std::endl;
+    std::cout << "sequence max size : " << seqMaxSize   << std::endl;
+    std::cout << "sequence min size : " << seqMinSize   << std::endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank24.cpp b/gatb-core/examples/bank/bank24.cpp
new file mode 100644
index 0000000..688d17f
--- /dev/null
+++ b/gatb-core/examples/bank/bank24.cpp
@@ -0,0 +1,77 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a FastQ file and iterate its sequences        */
+/* using a filter discarding all reads having a Phred score >= 30.              */
+/*                                                                              */
+/* Cmd-line: bank24 <fastq file>                                                */
+/*                                                                              */
+/* Sample: bank23 gatb-core/gatb-core/test/db/sample.fastq                      */
+/*                                                                              */
+/********************************************************************************/
+int threshold = 30;
+
+int computeMeanPhredScore(const std::string& quality){
+    int score=0;
+    // quality information is supposed to be FastQ-Sanger-encoded: 
+    // each letter in quality string is an ASCII code ranging from 33 to 126.
+    for(char c : quality){
+        score += (c-33);
+    }
+    return score / quality.size();
+}
+
+struct QualityFilter { 
+    bool operator () (Sequence& seq) const  { 
+        return computeMeanPhredScore(seq.getQuality()) >= threshold;
+    } 
+};
+
+/********************************************************************************/
+// START Application
+int main (int argc, char* argv[])
+{
+  // We check that the user provides at least one option: a Fasta/FastQ file.
+  // Online GATB-Tutorial: this argument is automatically filled in with an 
+  // appropriate file.
+  if (argc < 2)
+  {
+    std::cerr << "Please, provide a sequence file." << std::endl;
+    return EXIT_FAILURE;
+  }
+
+  // We define a try/catch block in case some method fails (bad filename for instance)
+  try
+  {
+    // We declare an input Bank and use it locally
+    IBank* inputBank = Bank::open (argv[1]);
+    LOCAL (inputBank);
+
+    // We create an iterator over this bank using some filtering system
+    FilterIterator<Sequence,QualityFilter> it (inputBank->iterator(), QualityFilter());
+    
+    // We loop over sequences.
+    for (it.first(); !it.isDone(); it.next())
+    {
+      // Shortcut
+      Sequence& seq = it.item();
+
+      // We dump the sequence quality
+      std::cout << "[" << seq.getQuality() << "] " << computeMeanPhredScore(seq.getQuality()) << std::endl;
+
+    }
+  }
+  catch (Exception& e)
+  {
+    std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+  }
+}
+
+//! [snippet1]
+
diff --git a/gatb-core/examples/bank/bank25.cpp b/gatb-core/examples/bank/bank25.cpp
new file mode 100644
index 0000000..23e9086
--- /dev/null
+++ b/gatb-core/examples/bank/bank25.cpp
@@ -0,0 +1,93 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/* !!!!!  WARNING !!!!!
+ * DO NOT EDIT: snippet used to test Leon!
+ */
+#undef NDEBUG
+#include <assert.h>
+
+/********************************************************************************/
+/*                    Compare two banks for equality                            */
+/*                                                                              */
+/* This snippet shows how to compare two banks:                                 */
+/*   - first bank is either a Fasta or a Fastq file                             */
+/*   - secon bank is either a Fasta or a Fastq or a Leon lossless file          */
+/*                                                                              */
+/* Note: we use here a try/catch block in case the bank opening doesn't work.   */
+/*                                                                              */
+/* Cmd-line: bank25 <fasta/q file> <leon file>                                  */
+/*                                                                              */
+/* Sample: bank25 gatb-core/gatb-core/test/db/sample.fastq \                    */
+/*                gatb-core/gatb-core/test/db/sample.fastq.leon                 */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        std::cerr << "you must provide two banks." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        string btype = Bank::getType(argv[1]);
+    	assert(
+       		btype.compare("fasta")==0 ||
+		btype.compare("fastq")==0
+        );
+        // We open the reference file
+        IBank* fasBank = Bank::open (argv[1]);
+
+        btype = Bank::getType(argv[2]);
+
+        // We open its leon-lossless-compressed representation
+        IBank* leonBank = Bank::open (argv[2]);
+
+        u_int64_t nbSeqFas = 0;
+        u_int64_t nbSeqLeon = 0;
+
+        // We create iterators over this bank.
+        Iterator<Sequence>* itFas = fasBank->iterator();
+        Iterator<Sequence>* itLeon = leonBank->iterator();
+        {
+		// we use a GATB-Core macro to automatically release
+		// memory allocated here as soon as we leave this code
+		// block
+		LOCAL(itFas);
+		LOCAL(itLeon);
+
+		// We do not use estimate() methods. Instead, we count
+		// exact number of sequences in both banks
+		for (itFas->first(); !itFas->isDone(); itFas->next()){nbSeqFas++;}
+		for (itLeon->first(); !itLeon->isDone(); itLeon->next()){nbSeqLeon++;}
+		assert(nbSeqFas==nbSeqLeon);
+        }
+
+	// We create a PairedIterator to go through both banks simultaneously
+	itFas = fasBank->iterator();
+	itLeon = leonBank->iterator();
+	LOCAL(itFas);
+	LOCAL(itLeon);
+	PairedIterator<Sequence,Sequence> it (itFas, itLeon);
+
+        for (it.first(); !it.isDone(); it.next())
+        {
+        	// check sequence comment for equality
+        	assert(it->first.getComment().compare(it->second.getComment())==0);
+        	// check sequence letters for equality
+        	assert(it->first.toString().compare(it->second.toString())==0);
+        	// check sequence quality for equality
+        	assert(it->first.getQuality().compare(it->second.getQuality())==0);
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank26.cpp b/gatb-core/examples/bank/bank26.cpp
new file mode 100644
index 0000000..e39115a
--- /dev/null
+++ b/gatb-core/examples/bank/bank26.cpp
@@ -0,0 +1,54 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/* !!!!!  WARNING !!!!!
+ * DO NOT EDIT: snippet used to test Leon!
+ */
+
+/********************************************************************************/
+/*                    Bank: count sequences                                     */
+/*                                                                              */
+/* This snippet shows how to open a bank and iterate its sequences.             */
+/*                                                                              */
+/* Cmd-line: bank26 <fasta/q file>                                              */
+/*                                                                              */
+/* Sample: bank26 gatb-core/gatb-core/test/db/reads1.fa                         */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        std::cerr << "you must provide a bank." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We create an iterator over this bank.
+        Iterator<Sequence>* it = inputBank->iterator();
+        LOCAL (it);
+
+        // We loop over sequences.
+        for (it->first(); !it->isDone(); it->next())
+        {
+            // Shortcut
+            Sequence& seq = it->item();
+
+            // We dump coment and data size
+            std::cout << seq.getComment() << "[" << seq.getDataSize() << "] " << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank27.cpp b/gatb-core/examples/bank/bank27.cpp
new file mode 100644
index 0000000..666c76f
--- /dev/null
+++ b/gatb-core/examples/bank/bank27.cpp
@@ -0,0 +1,70 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/* !!!!!  WARNING !!!!!
+ * DO NOT EDIT: snippet used to test Leon!
+ */
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* This snippet shows how to open a FASTA bank and iterate its sequences        */
+/* to provide some stats: data size, nb. sequences, etc.                        */
+/*                                                                              */
+/* Cmd-line: bank27 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank27 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE, "k-mer size",   false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We get information about the bank.
+        u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0, nbSmallSequences=0;
+
+        u_int64_t kmerSize = options->get(STR_KMER_SIZE) ? 
+          options->getInt(STR_KMER_SIZE) : 31;
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        Iterator<Sequence>* it = inputBank->iterator();
+        for (it->first(); !it->isDone(); it->next())
+        {
+            Data& data = it->item().getData();
+
+            nbSequences ++;
+            if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+            if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+            if (data.size() < kmerSize)    { nbSmallSequences++; }
+            dataSize += data.size ();
+        }
+
+        std::cout << "nb. nucleotides     : " << dataSize     << std::endl;
+        std::cout << "nb. sequences       : " << nbSequences  << std::endl;
+        std::cout << "sequence max size   : " << seqMaxSize   << std::endl;
+        std::cout << "sequence min size   : " << seqMinSize   << std::endl;
+        std::cout << "nb. small sequences : " << nbSmallSequences  << " (< " << kmerSize << " nucl.)" << std::endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank28.cpp b/gatb-core/examples/bank/bank28.cpp
new file mode 100644
index 0000000..c16b62a
--- /dev/null
+++ b/gatb-core/examples/bank/bank28.cpp
@@ -0,0 +1,64 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/* !!!!!  WARNING !!!!!
+ * DO NOT EDIT: snippet used to test Leon!
+ */
+
+/********************************************************************************/
+/*                              Bank management                                 */
+/*                                                                              */
+/* Same as bank27 but provide results in a convenient way for script handling.  */
+/*                                                                              */
+/* Cmd-line: bank28 -in <fasta/q file>                                          */
+/*                                                                              */
+/* Sample: bank28 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",   true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE, "k-mer size",   false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We get information about the bank.
+        u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0, nbSmallSequences=0;
+
+        u_int64_t kmerSize = options->get(STR_KMER_SIZE) ? 
+          options->getInt(STR_KMER_SIZE) : 31;
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (inputBank);
+
+        Iterator<Sequence>* it = inputBank->iterator();
+        for (it->first(); !it->isDone(); it->next())
+        {
+            Data& data = it->item().getData();
+
+            nbSequences ++;
+            if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+            if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+            if (data.size() < kmerSize)    { nbSmallSequences++; }
+            dataSize += data.size ();
+        }
+        printf("%u %u %u %u %u", dataSize, nbSequences, seqMaxSize, seqMinSize, nbSmallSequences);
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank3.cpp b/gatb-core/examples/bank/bank3.cpp
new file mode 100644
index 0000000..2a4faa3
--- /dev/null
+++ b/gatb-core/examples/bank/bank3.cpp
@@ -0,0 +1,56 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                    Bank iteration with a functor                             */
+/*                                                                              */
+/* This snippet shows how to iterate sequences from a FASTA through a functor.  */
+/* Note that this approach is necessary when one wants to parallelize the       */
+/* iteration (see snippets on multithreading).                                  */
+/*                                                                              */
+/* Cmd-line: bank3 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank3 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+
+// We define a functor that will be called for every iterated sequence.
+// The advantages are:
+//     - we have a code that focuses on the treatment to do on the sequence;
+//       this may be interesting when the corresponding code is long and is
+//       likely to be moved in an independent method.
+//     - such a functor can be reused in other contexts.
+
+struct Functor {  void operator ()  (Sequence& s)  const
+{
+    // We dump the data size and the comment
+    std::cout << "[" << s.getDataSize() << "] " << s.getComment()  << std::endl;
+
+    // We dump the data
+    std::cout << s.toString () << std::endl;
+}};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        std::cerr << "you must provide a bank." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We declare an input Bank and use it locally
+    IBank* inputBank = Bank::open (argv[1]);
+    LOCAL (inputBank);
+
+    // We create an iterator over this bank.
+    Iterator<Sequence>* it = inputBank->iterator();
+    LOCAL (it);
+
+    // We loop over sequences in a "push" fashion (a functor is called for each sequence)
+    Functor fct;
+    it->iterate (fct);
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank4.cpp b/gatb-core/examples/bank/bank4.cpp
new file mode 100644
index 0000000..0928c4f
--- /dev/null
+++ b/gatb-core/examples/bank/bank4.cpp
@@ -0,0 +1,58 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                    Bank iteration with progress information                  */
+/*                                                                              */
+/* This snippet shows how to iterate sequences from a FASTA with some progress  */
+/* information. In this example, we provide our own progress manager.           */
+/*                                                                              */
+/* Cmd-line: bank4 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank4 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+
+// We a define a functor that will be called during bank parsing
+struct ProgressFunctor : public IteratorListener  {  void inc (u_int64_t current)   {  std::cout << ".";  } };
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        std::cerr << "you must provide a bank." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // Note also that we have to parameterize the SubjectIterator by the kind of iterated
+        // items (Sequence) and the processing that has to be done on each iteration (ProgressFunctor).
+        SubjectIterator<Sequence> iter (inputBank->iterator(), 10);
+
+        //  We create some listener to be notified every 10 iterations and attach it to the iterator.
+        iter.addObserver (new ProgressFunctor());
+
+        // We loop over sequences.
+        for (iter.first(); !iter.isDone(); iter.next())
+        {
+            // Note that we do nothing inside the sequence iterating loop about the progression management.
+
+            // In other words, we don't "pollute" the code inside this loop by presentation concerns and
+            // we can therefore focus on the job to be done on the iterated sequences.
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank5.cpp b/gatb-core/examples/bank/bank5.cpp
new file mode 100644
index 0000000..df94766
--- /dev/null
+++ b/gatb-core/examples/bank/bank5.cpp
@@ -0,0 +1,46 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                    Bank iteration with progress information                  */
+/*                                                                              */
+/* This snippet shows how to iterate sequences from a bank with some progress   */
+/* information. In this example, we use some pre defined progress manager.      */
+/*                                                                              */
+/* Cmd-line: bank5 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank5 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        std::cerr << "you must provide a bank." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We create a sequence iterator for the bank with progress information
+        ProgressIterator<Sequence> iter (*inputBank, "Iterating sequences");
+
+        // We loop over sequences.
+        for (iter.first(); !iter.isDone(); iter.next())
+        {
+            // Note that we do nothing inside the sequence iterating loop
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank6.cpp b/gatb-core/examples/bank/bank6.cpp
new file mode 100644
index 0000000..5049e9f
--- /dev/null
+++ b/gatb-core/examples/bank/bank6.cpp
@@ -0,0 +1,97 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <fstream>
+#include <string>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                                Bank copy                                     */
+/*                                                                              */
+/* This snippet shows how to copy a bank into another one, with some possible   */
+/* modifications. Note that this snippet can be really useful for re-formatting */
+/* FASTA banks                                                                  */
+/*                                                                              */
+/* Cmd-line: bank6 <fasta/q file>                                               */
+/*                                                                              */
+/* Sample: bank6 gatb-core/gatb-core/test/db/reads1.fa                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        cerr << "you must provide at least the FASTA file path. Arguments are:" << endl;
+        cerr << "   1) FASTA file path" << endl;
+        cerr << "   2) data lines size (60 by default, 0 means only one line for sequence data)" << endl;
+        cerr << "   3) type of comments: 0 for new comments, 1 for only ids, 2 (default) for full comments" << endl;
+        cerr << "   4) number of sequences to keep (all by default)" << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We get the file name from the user arguments
+    const char* filename = argv[1];
+
+    // We define the max size of a data line in the FASTA output file
+    size_t dataLineSize = argc >= 3 ?  atoi(argv[2]) : 60;
+
+    // By convention, setting data line size to 0 will dump data on a single line
+    if (dataLineSize==0)  { dataLineSize = ~0; }
+
+    // We define the kind of output comments
+    BankFasta::Iterator::CommentMode_e mode = BankFasta::Iterator::FULL;
+    if (argc >= 4)
+    {
+        int m = atoi (argv[3]);
+             if (m==0)  { mode = BankFasta::Iterator::NONE;   }
+        else if (m==1)  { mode = BankFasta::Iterator::IDONLY; }
+    }
+
+    // We set the number of sequences to be kept.
+    u_int64_t nbSequences =  (argc >= 5 ? atol (argv[4]) : ~0);
+
+    try  {
+        // We declare a Bank instance.
+        BankFasta b (filename);
+
+        // We create an iterator over this bank.
+        // Note : here, we must use specifically BankFasta::Iterator in order to set the mode
+        BankFasta::Iterator itSeq (b, mode);
+
+        // We encapsulate it with a truncation iterator
+        TruncateIterator<Sequence> it (itSeq, nbSequences);
+
+        size_t idxSeq = 1;
+
+        // We loop over sequences.
+        for (it.first(); !it.isDone(); it.next(), idxSeq++)
+        {
+            // We dump the comment into the file according to the user mode
+            if (!it->getComment().empty())   {  cout << ">" << it->getComment() << endl;  }
+            else                             {  cout << ">seq=" << idxSeq << " len=" << it.item().getDataSize() << endl;  }
+
+            // shortcut
+            size_t len = it->getDataSize();
+
+            // We dump the data with fixed sized columns
+            for (size_t i=0; i<len; )
+            {
+                for (size_t j=0; j<dataLineSize && i<len; j++, i++)
+                {
+                    cout << (char)  (it->getData() [i]);
+                }
+                cout << endl;
+            }
+        }
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank7.cpp b/gatb-core/examples/bank/bank7.cpp
new file mode 100644
index 0000000..9f0fa3b
--- /dev/null
+++ b/gatb-core/examples/bank/bank7.cpp
@@ -0,0 +1,66 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+size_t threshold = 500;
+
+// We a define a functor that will be called during iteration for filtering odd items.
+// Here, we keep sequences whose data size is greater than 500.
+struct FilterFunctor  {  bool operator ()  (Sequence& seq) const  {  return seq.getDataSize() >= threshold; } };
+
+/********************************************************************************/
+/*                                Bank filtering                                */
+/*                                                                              */
+/* This snippet shows how to iterate a bank and filter some sequences through   */
+/* a functor.                                                                   */
+/* Note: lambda expressions could be used for the functor (in case the used     */
+/* compiler supports it)                                                        */
+/*                                                                              */
+/* Cmd-line: bank7 <fasta/q file> <threshold>                                   */
+/*                                                                              */
+/* Sample: bank7 gatb-core/gatb-core/test/db/reads1.fa 500                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        cerr << "you must provide at least the size threshold and the bank file path. Arguments are:" << endl;
+        cerr << "   1) bank" << endl;
+        cerr << "   2) minimum size threshold (default 500)" << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We set the threshold with given parameter
+        threshold = atoi (argv[2]);
+
+        // We use another iterator for filtering out some sequences.
+        FilterIterator<Sequence,FilterFunctor> itSeq (inputBank->iterator(), FilterFunctor());
+        
+        // We loop over sequences.
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            // We dump the data size and the comment
+            cout << "[" << itSeq->getDataSize() << "] " << itSeq->getComment()  << endl;
+
+            // We dump the data
+            cout << itSeq->toString() << endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank8.cpp b/gatb-core/examples/bank/bank8.cpp
new file mode 100644
index 0000000..e7cd786
--- /dev/null
+++ b/gatb-core/examples/bank/bank8.cpp
@@ -0,0 +1,98 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <iomanip>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                         Bank conversion to binary format                     */
+/*                                                                              */
+/* This snippet shows how to convert a bank from a format to another one. The   */
+/* main idea is to iterate the input bank and to insert each sequence into the  */
+/* output bank. We use progress information to get feedback about the iteration */
+/* progression.                                                                 */
+/*                                                                              */
+/* Cmd-line: bank8 <fasta/q file> <outfile>                                     */
+/*                                                                              */
+/* Sample: bank8 gatb-core/gatb-core/test/db/reads1.fa reads1.bin               */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        cerr << "you must provide an input and output banks names:" << endl;
+        cerr << "   1) bank file path" << endl;
+        cerr << "   2) binary file path" << endl;
+        cerr << "   3) dump binary output: 0 for no (default), 1 for yes" << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        //! [snippet8_binary]
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We declare an output Bank
+        BankBinary outputBank (argv[2]);
+
+        // We create a sequence iterator on the input bank (with progress information).
+        ProgressIterator<Sequence> itSeq (*inputBank, "Converting input file into binary format");
+
+        // We insert each sequence of the input bank into the output bank.
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())  {  outputBank.insert (itSeq.item());  }
+
+        // We make sure that the output bank is flushed correctly.
+        outputBank.flush ();
+        //! [snippet8_binary]
+
+        if (argc >= 4  && atoi(argv[3])==1)
+        {
+            // We create an iterator on our binary bank
+            Iterator<Sequence>* itBinary = outputBank.iterator();
+            LOCAL (itBinary);
+
+            // We iterate the sequences whose data is binary coded
+            for (itBinary->first(); !itBinary->isDone(); itBinary->next())
+            {
+                // Shortcut
+                Sequence& seq = itBinary->item();
+
+                // We display some (dummy) comment
+                cout << seq.getComment() << endl;
+
+                // In binary format, each byte holds 4 nucleotides.
+
+                for (size_t i=0; i< (seq.getDataSize()+3)/4; i++)
+                {
+                    cout << "[" << setfill('0') << setw(2) << hex << (int) (seq.getData()[i] & 0xFF) << " ";
+
+                    // We convert back from binary to ASCII
+                    char b = (seq.getData()[i] & 0xFF) ;
+
+                    static char tableASCII[] = {'A', 'C', 'T', 'G'};
+
+                    cout << tableASCII[(b>>6)&3]
+                         << tableASCII[(b>>4)&3]
+                         << tableASCII[(b>>2)&3]
+                         << tableASCII[(b>>0)&3]
+                         << "] ";
+
+                    if ((i+1)%16==0)  { cout << endl; }
+                }
+                cout << endl;
+            }
+        }
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/bank/bank9.cpp b/gatb-core/examples/bank/bank9.cpp
new file mode 100644
index 0000000..cba62f6
--- /dev/null
+++ b/gatb-core/examples/bank/bank9.cpp
@@ -0,0 +1,86 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                         Bank conversion with some filtering                  */
+/*                                                                              */
+/* This snippet shows how to copy a bank to another one with some filtering     */
+/* criteria. The criteria is described through a functor.                       */
+/* Here, we can keep only every 'modulo' sequence that have no 'N' in data.     */
+/*                                                                              */
+/* Cmd-line: bank9 <fasta/q file> <outfile> <modulo>                            */
+/*                                                                              */
+/* Sample: bank9 gatb-core/gatb-core/test/db/reads1.fa reads1_filtered.fa 5     */
+/*                                                                              */
+/********************************************************************************/
+
+// We define a functor for our sequence filtering.
+struct FilterFunctor
+{
+    int modulo;
+    FilterFunctor (int modulo) : modulo(modulo) {}
+    bool operator ()  (Sequence& seq)
+    {
+        return (seq.getIndex() % modulo == 0)  &&  (seq.toString().find("N") == string::npos);
+    }
+};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        cerr << "you must provide an input and output banks names:" << endl;
+        cerr << "   1) input URI"  << endl;
+        cerr << "   2) output URI" << endl;
+        cerr << "   3) modulo (ie keep sequence id % modulo)" << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        // We declare an input Bank and use it locally
+        IBank* inputBank = Bank::open (argv[1]);
+        LOCAL (inputBank);
+
+        // We declare an output Bank
+        BankFasta outputBank (argv[2]);
+
+        // We get the modulo value (1 by default), defined as static to be retrieved in the functor
+        int modulo = argc >= 4 ? atoi (argv[3]) : 1;
+        if (modulo<=0)  { modulo=1; }
+
+        // We create a filter on the input bank.
+        // Note the first argument of the FilterIterator is an iterator of the input bank and the
+        // second argument is the filtering functor.
+        FilterIterator<Sequence,FilterFunctor>* itFilter = new FilterIterator<Sequence,FilterFunctor>(
+            inputBank->iterator(),
+            FilterFunctor (modulo)
+        );
+
+        // We create an iterator that will provide progress notification.
+        // Note the estimated number of items takes into account the modulo
+        ProgressIterator<Sequence> itSeq (itFilter, "Filtering bank", inputBank->estimateNbItems()/modulo );
+
+        // We loop over sequences.
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            // We insert the current sequence into the output bank.
+            outputBank.insert (*itSeq);
+        }
+
+        // We make sure that the output bank is flushed correctly.
+        outputBank.flush ();
+    }
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn1.cpp b/gatb-core/examples/debruijn/debruijn1.cpp
new file mode 100644
index 0000000..0dfe419
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn1.cpp
@@ -0,0 +1,45 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*  Graph creation from command line options                                    */
+/*                                                                              */
+/*  This snippet uses the OptionsParser facility of GATB-Core library.          */
+/*                                                                              */
+/* Cmd-line: debruijn1 -in <fasta/q file>                                       */
+/*                                                                              */
+/* Sample: debruijn1 -in gatb-core/gatb-core/test/db/reads1.fa                  */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get a command line parser for graphs available options.
+    IOptionsParser* parser = Graph::getOptionsParser();
+    LOCAL (parser);
+
+    // We use a try/catch block in case we have some command line parsing issue.
+    try
+    {
+        // We parse the user options.
+        parser->parse (argc, argv);
+
+        // We create the graph with the provided options.
+        Graph graph = Graph::create (parser->getProperties());
+
+        // We dump some information about the graph.
+        std::cout << graph.getInfo() << std::endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn10.cpp b/gatb-core/examples/debruijn/debruijn10.cpp
new file mode 100644
index 0000000..851288a
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn10.cpp
@@ -0,0 +1,66 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#undef NDEBUG
+#include <cassert>
+
+/********************************************************************************/
+/*                          Node neighbors management                           */
+/*                                                                              */
+/* Cmd-line: debruijn10 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We create the graph with a bank holding one sequence, and use a specific kmer size and solid kmer abundance to 1
+        Graph graph = Graph::create (new BankStrings ("AATGC", NULL), "-kmer-size 4  -abundance-min 1  -verbose 0");
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator ();
+
+        // We check that we have only two possible nodes
+        assert (it.size() == 2);
+
+        // We loop each node.
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // A shortcut.
+            Node& current = it.item();
+
+            // We get the ascii representation of the current iterated node
+            std::string s = graph.toString (current);
+
+            // We check that it is correct.
+            assert (s=="AATG" || s=="ATGC");
+
+            if (s=="AATG")
+            {
+                // We get the neighbors of this specific current
+                // Note that we get here the full edge information
+                GraphVector<Edge> neighbors = graph.successorsEdge (current);
+
+                // We check that we got only one successor
+                assert (neighbors.size() == 1);
+
+                // We check that the target node is ok
+                assert (graph.toString(neighbors[0].to) == "ATGC");
+
+                // We check that the transition nucleotide is ok
+                assert (neighbors[0].nt == NUCL_C);
+            }
+        }
+
+        std::cout << "Test OK" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn11.cpp b/gatb-core/examples/debruijn/debruijn11.cpp
new file mode 100644
index 0000000..7050093
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn11.cpp
@@ -0,0 +1,82 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#undef NDEBUG
+#include <cassert>
+
+/********************************************************************************/
+/*                          Node neighbors management                           */
+/*                                                                              */
+/* Cmd-line: debruijn11 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We create the graph with a bank holding one sequence, and use a specific kmer size and solid kmer abundance to 1
+        Graph graph = Graph::create (new BankStrings ("AATGC", NULL), "-kmer-size 4  -abundance-min 1  -verbose 0");
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator ();
+
+        // We check that we have only two possible nodes
+        assert (it.size() == 2);
+
+        // We loop each node.
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // A shortcut.
+            Node& current = it.item();
+
+            // We get the ascii representation of the current iterated node
+            std::string s = graph.toString (current);
+
+            if (s=="AATG")
+            {
+                // We suppose that we know the only possible successor transition from this neighbor (nucl C)
+                // It could have been retrieved by an previous call to Graph::neighbors<Edge> method
+
+                // Now, we want to get the successor of the current node, only by giving the transition nucleotide.
+                Node neighbor = graph.successor (current, NUCL_C);
+
+                // WARNING ! This Graph::successor method doesn't check whether the neighbor actually belongs to the graph.
+                // It is supposed here that the client knows perfectly that its transition nucleotide is valid.
+                // This possibility is available for performance matters since checking graph membership may take some time.
+
+                // We check the result
+                assert (graph.toString (neighbor) == "ATGC");
+
+                // There is an overloaded form for the Graph::successor method, where the user can provide an extra boolean.
+                // With this implementation, a check is done to be sure whether the neighbor surely belongs to the graph.
+                // If not so, the extra boolean is set to false, true otherwise.
+                bool exists;
+                Node potentialNeighbor;
+
+                potentialNeighbor = graph.successor (current, NUCL_A, exists);
+                assert (exists == false);
+
+                potentialNeighbor = graph.successor (current, NUCL_C, exists);
+                assert (exists == true);
+                assert (graph.toString (potentialNeighbor) == "ATGC");
+
+                potentialNeighbor = graph.successor (current, NUCL_G, exists);
+                assert (exists == false);
+
+                potentialNeighbor = graph.successor (current, NUCL_T, exists);
+                assert (exists == false);
+            }
+        }
+
+        std::cout << "Test OK" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn12.cpp b/gatb-core/examples/debruijn/debruijn12.cpp
new file mode 100644
index 0000000..ec257ff
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn12.cpp
@@ -0,0 +1,55 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#undef NDEBUG
+#include <cassert>
+
+/********************************************************************************/
+/*                          Node strands management                             */
+/*                                                                              */
+/* Cmd-line: debruijn12 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We create the graph with a bank holding one sequence, and use a specific kmer size and solid kmer abundance to 1
+        Graph graph = Graph::create (new BankStrings ("AATGC", NULL), "-kmer-size 5  -abundance-min 1  -verbose 0");
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator ();
+
+        // We check that we have only one possible node
+        assert (it.size() == 1);
+
+        // We get the first (and only) node.
+        it.first();  Node& current = it.item();
+
+        // We get the ascii representation of the current iterated node
+        std::string s = graph.toString (current);
+
+        // We check the string value
+        assert (s == "AATGC");
+
+        // We reverse the node, which will be change its strand
+        Node other = graph.reverse (current);
+
+        // We check the string value of the reverse of the current node
+        assert (graph.toString(other) == "GCATT");
+
+        // We also check that the two nodes share the same kmer value
+        assert (current.kmer == other.kmer);
+
+        std::cout << "Test OK" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn13.cpp b/gatb-core/examples/debruijn/debruijn13.cpp
new file mode 100644
index 0000000..5ba2e06
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn13.cpp
@@ -0,0 +1,42 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#undef NDEBUG
+#include <cassert>
+
+/********************************************************************************/
+/*                          Fake nodes management                               */
+/*                                                                              */
+/* Cmd-line: debruijn13 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We create an empty graph with a given kmer size
+        Graph graph = Graph::create (7);
+
+        // We create a sequence
+        const char* seq = "ATGCATCGTA";
+
+        // We ask for a fake node, starting at position 0 in the data
+        Node n0 = graph.buildNode (seq+0);
+        assert (graph.toString(n0) == "ATGCATC");
+
+        // We ask for another fake node, starting at position 1 in the data
+        Node n1 = graph.buildNode (seq+1);
+        assert (graph.toString(n1) == "TGCATCG");
+
+        std::cout << "Test OK" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn14.cpp b/gatb-core/examples/debruijn/debruijn14.cpp
new file mode 100644
index 0000000..70f155b
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn14.cpp
@@ -0,0 +1,46 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                          Simple path iteration (with Node)                   */
+/*                                                                              */
+/* Cmd-line: debruijn14 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        size_t kmerSize = 11;
+        const char* seq = "AGGCGCTAGGGTAGAGGATGATGA";
+
+        std::cout << "The initial sequence is '" << seq << "', kmer size is " << kmerSize << std::endl;
+
+        // We create the graph from a given sequence, and for a given kmer size
+        Graph graph = Graph::create (new BankStrings (seq, NULL),  "-kmer-size %d  -abundance-min 1  -verbose 0", kmerSize);
+
+        // We get the first node of the sequence.
+        Node node = graph.buildNode (seq);
+
+        // We create a Node iterator that iterates all the simple nodes from the first node
+        // Remember that a simple node has indegree==1 and outdegree==1
+        GraphIterator<Node> path = graph.simplePath (node, DIR_OUTCOMING);
+
+        // We iterate the simple path.
+        for (path.first(); !path.isDone(); path.next())
+        {
+            std::cout << "   [" << path.rank() << "]  current item is " << graph.toString (path.item()) << std::endl;
+        }
+
+        std::cout << "The simple path was " << path.rank() << " long" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn15.cpp b/gatb-core/examples/debruijn/debruijn15.cpp
new file mode 100644
index 0000000..8dd2b11
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn15.cpp
@@ -0,0 +1,47 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                          Simple path iteration (with Edge)                   */
+/*                                                                              */
+/* Cmd-line: debruijn15 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        size_t kmerSize = 11;
+        char* seq = (char*) "AGGCGCTAGGGTAGAGGATGATGA";
+
+        std::cout << "The initial sequence is '" << seq << "', kmer size is " << kmerSize << std::endl;
+
+        // We create the graph from a given sequence, and for a given kmer size
+        Graph graph = Graph::create (new BankStrings (seq, NULL),  "-kmer-size %d  -abundance-min 1  -verbose 0", kmerSize);
+
+        // We get the first node of the sequence.
+        Node node = graph.buildNode (seq);
+
+        // We create a Edge iterator that iterates all the simple edges from the first node
+        // Recall that a simple node has indegree==1 and outdegree==1
+        GraphIterator<Edge> path = graph.simplePathEdge (node, DIR_OUTCOMING);
+
+        // We iterate the simple path.
+        for (path.first(); !path.isDone(); path.next())
+        {
+            std::cout << "   [" << path.rank() << "]  current item is " << graph.toString (path.item()) << std::endl;
+        }
+
+        std::cout << "The simple path was " << path.rank() << " long" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn16.cpp b/gatb-core/examples/debruijn/debruijn16.cpp
new file mode 100644
index 0000000..2848263
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn16.cpp
@@ -0,0 +1,56 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                          Branching nodes neighbors                           */
+/*                                                                              */
+/* This snippet shows how to detect a specific pattern in the graph.            */
+/*                                                                              */
+/* Cmd-line: debruijn16 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    size_t kmerSize = 7;
+
+    // We define some sequences used for building our test graph.
+    // Note that the sequences have a difference at index==kmerSize,
+    // so the initial node AGGCGCT has 3 outcoming neighbors (and
+    // therefore is a branching node)
+    const char* sequences[] =
+    {
+        //      x <- difference here
+        "AGGCGCTAGGGAGAGGATGATGAAA",
+        "AGGCGCTCGGGAGAGGATGATGAAA",
+        "AGGCGCTTGGGAGAGGATGATGAAA"
+    };
+
+    try
+    {
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, ARRAY_SIZE(sequences)),  "-kmer-size %d  -abundance-min 1  -verbose 0", kmerSize);
+
+        // We get the first node (should be AGGCGCT); this is a branching node.
+        Node node = graph.buildNode (sequences[0]);
+
+        // We retrieve the branching neighbors for the node.
+        GraphVector<BranchingNode> branchingNeighbors = graph.successorsBranching (node);
+
+        std::cout << "We found " << branchingNeighbors.size() << " branching neighbors from node " << graph.toString(node) << std::endl;
+
+        // We loop over the branching neighbors. Here, we should have 3 branching neighbors, being the same GGGAGAG
+        for (size_t i=0; i<branchingNeighbors.size(); i++)
+        {
+            std::cout << graph.toString (branchingNeighbors[i])  << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn17.cpp b/gatb-core/examples/debruijn/debruijn17.cpp
new file mode 100644
index 0000000..0106df3
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn17.cpp
@@ -0,0 +1,58 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                          Branching nodes neighbors                           */
+/*                                                                              */
+/* This snippet shows how to detect a specific pattern in the graph.            */
+/*                                                                              */
+/* Cmd-line: debruijn17 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    size_t kmerSize = 7;
+
+    // We define some sequences used for building our test graph.
+    // Note that the sequences have a difference at index==kmerSize,
+    // so the initial node AGGCGCT has 3 outcoming neighbors (and
+    // therefore is a branching node)
+    const char* sequences[] =
+    {
+        //      x <- difference here
+        "AGGCGCTAGGGAGAGGATGATGAAA",
+        "AGGCGCTCGGGAGAGGATGATGAAA",
+        "AGGCGCTTGGGAGAGGATGATGAAA"
+    };
+
+    try
+    {
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, ARRAY_SIZE(sequences)),  "-kmer-size %d  -abundance-min 1  -verbose 0", kmerSize);
+
+        // We get the first node (should be AGGCGCT); this is a branching node.
+        Node node = graph.buildNode (sequences[0]);
+
+        // We retrieve the branching neighbors for the node.
+        GraphVector<BranchingEdge> branchingNeighbors = graph.successorsBranchingEdge (node);
+
+        std::cout << "We found " << branchingNeighbors.size() << " branching neighbors from node " << graph.toString(node) << std::endl;
+
+        // We loop over the branching neighbors. Here, we should have 3 branching neighbors, being the same GGGAGAG
+        for (size_t i=0; i<branchingNeighbors.size(); i++)
+        {
+            // Note: we don't display all the transition nucleotides, only the first transition nucleotide.
+            // We also display the number of transitions needed to link the two branching nodes.
+            std::cout << graph.toString (branchingNeighbors[i])  << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn18.cpp b/gatb-core/examples/debruijn/debruijn18.cpp
new file mode 100644
index 0000000..c9dea12
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn18.cpp
@@ -0,0 +1,122 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <map>
+#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+
+using namespace std;
+
+/********************************************************************************/
+/*                   Statistics about branching nodes in/out degrees.           */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/* Cmd-line: debruijn18 -graph <h5 file>                                        */
+/*                                                                              */
+/* Sample: debruijn18 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("GraphStats");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",  true));
+    parser.push_back (new OptionOneParam (STR_NB_CORES,  "nb cores",     false, "0"));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the graph
+        Graph graph = Graph::load (options->getStr(STR_URI_GRAPH));
+
+        // We set the number of cores to be used. Use all available cores if set to 0.
+        size_t nbCores = options->getInt(STR_NB_CORES);
+
+        // We get an iterator for branching nodes of the graph.
+        // We use a progress iterator to get some progress feedback
+        ProgressGraphIterator<BranchingNode,ProgressTimer>  itBranching (graph.iteratorBranching(), "statistics");
+
+        // We define some kind of unique identifier for a couple (indegree,outdegree)
+        typedef pair<size_t,size_t> InOut_t;
+
+        // We want to gather some statistics during the iteration.
+        // Note the use of ThreadObject: this object will be cloned N times (one object per thread) and each clone will
+        // be reachable within the iteration block through ThreadObject::operator()
+        ThreadObject <map <InOut_t, size_t> > topology;
+
+        // We dispatch the iteration on several cores. Note the usage of lambda expression here.
+        IDispatcher::Status status = Dispatcher(nbCores).iterate (itBranching, [&] (const BranchingNode& node)
+        {
+            // We retrieve the current instance of map <InOut_t,size_t> for the current running thread.
+            map <InOut_t,size_t>& localTopology = topology();
+
+            // We get branching nodes neighbors for the current branching node.
+            GraphVector<BranchingEdge> successors   = graph.successorsBranchingEdge ((Node&)node); /* node casting is necessary due to incomplete Graph.hpp api for successorsBranchingEdge */
+            GraphVector<BranchingEdge> predecessors = graph.predecessorsBranchingEdge ((Node&)node); 
+
+            // We increase the occurrences number for the current couple (in/out) neighbors
+            localTopology [make_pair(predecessors.size(), successors.size())] ++;
+        });
+
+        // Now, the parallel processing is done. We want now to aggregate the information retrieved
+        // in each thread in a single map.
+
+        // We get each map<InOut_t,size_t> object filled in each thread, and we add its data into the "global" map.
+        // The global map is reachable through the ThreadObject::operator*. The "topology.foreach" will loop over
+        // all cloned object used in the threads.
+        topology.foreach ([&] (const map <InOut_t, size_t>& t)
+        {
+            // We update the occurrence of the current couple (in/out)
+            for_each (t.begin(), t.end(), [&] (const pair<InOut_t, size_t>& p) { (*topology)[p.first] += p.second;  });
+        });
+
+        // We sort the statistics by decreasing occurrence numbers. Since map have its own ordering, we need to put all
+        // the data into a vector and sort it with our own sorting criteria.
+        vector < pair<InOut_t,size_t> >  stats;
+        for (auto it = topology->begin(); it != topology->end(); it++)  { stats.push_back (*it); }
+        sort (stats.begin(), stats.end(), [=] (const pair<InOut_t,size_t>& a, const pair<InOut_t,size_t>& b) { return a.second > b.second; });
+
+        printf ("\nThere are %d branching nodes with the following distribution: \n", itBranching.size());
+
+        size_t sum=0;
+        for (size_t i=0; i<stats.size(); i++)
+        {
+            sum += stats[i].second;
+
+            printf ("    [in=%d out=%d]  nb=%7d  percent=%5.2f  distrib=%5.2f\n",
+                stats[i].first.first,
+                stats[i].first.second,
+                stats[i].second,
+                100.0*(float)stats[i].second / (float)itBranching.size(),
+                100.0*(float)sum             / (float)itBranching.size()
+            );
+        }
+
+        printf ("\nDone on %d cores in %.2f sec\n\n", status.nbCores, (float)status.time/1000.0);
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn19.cpp b/gatb-core/examples/debruijn/debruijn19.cpp
new file mode 100644
index 0000000..ecc74e1
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn19.cpp
@@ -0,0 +1,235 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <map>
+#include <cstdio>
+#include <cstdlib>
+#include <set>
+
+#undef NDEBUG
+#include <cassert>
+
+using namespace std;
+
+/********************************************************************************/
+
+//
+//
+/********************************************************************************/
+/*  BFS exploration of a graph.                                                 */
+/*                                                                              */
+/*  We define a class that marks nodes in a graph and call tell whether a given */
+/*  node is marked or not.                                                      */
+/*  We use a map for the implementation (could be not optimal).                 */
+/*                                                                              */
+/* Cmd-line: debruijn19 -graph <h5 file>                                        */
+/*                                                                              */
+/* Sample: debruijn19 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+class GraphMarker
+{
+public:
+
+    GraphMarker (const Graph& graph) : graph(graph)
+    {
+        // We insert all the nodes into our map.
+        auto iter = [&] (const BranchingNode& item)  {  this->markMap[item] = false;  };
+        graph.iteratorBranching().iterate (iter);
+    }
+
+    void mark (const BranchingNode& item)  {  markMap [item] = true;  }
+
+    void mark (const set<BranchingNode>& items)
+    {
+        for (typename set<BranchingNode>::const_iterator it=items.begin(); it != items.end(); ++it)  {  mark (*it); }
+    }
+
+    bool isMarked (const BranchingNode& item) const  {  return markMap.find(item)->second;  }
+
+private:
+    const Graph& graph;
+    map<BranchingNode,bool>  markMap;
+};
+
+/********************************************************************************/
+
+// We define a class that performs a breadth first search in a graph from a starting node.
+// We need a marker to globally mark the visited nodes from one call to another.
+// The nodes visit is handled by a std::queue object.
+class BFS
+{
+public:
+
+    BFS (const Graph& graph) : graph(graph) {}
+
+    // Process the BFS started from the provided node. As a result, we get the nodes number in the
+    // found connected component.
+    const set<BranchingNode>& run (const BranchingNode& node)
+    {
+        // ALGORITHM (recursion on n)
+        //    We define as C(n) the set of nodes of the connected component to be computed.
+        //    We define as F(n) the set of nodes for which we get neighbors for extending the BFS
+        //    We use the function N(E) that returns the set of neighbors nodes of items in set E
+        //
+        //  Init:
+        //      C(0)={b} and F(0)={b},  where b is the initial node
+        //  Recursion:
+        //      F(n+1) = N(F(n)) - C(n)
+        //      C(n+1) = N(F(n)) + C(n)
+        //  End criteria:
+        //      card(F(n)) = 0
+
+        // We set the initial state for F(0)
+        set<BranchingNode> frontline;
+        frontline.insert (node);
+
+        // We set the initial state for C(0)
+        connectedComponent.clear();
+        connectedComponent.insert (node);
+
+        // We launch the recursion.
+        while (!frontline.empty())
+        {
+            // We get the neighbors for the current front line, ie. we get N(F(n))
+            set<BranchingNode> neighbors = graph.neighbors (frontline.begin(), frontline.end()); // this is a very special overload of neighbors() from Graph.hpp
+
+            // We reset the current front line => we reuse it for computing F(n+1)
+            frontline.clear();
+
+            // We compute the recursion for F(n+1) and C(n+1)
+            for (typename set<BranchingNode>::iterator it = neighbors.begin(); it != neighbors.end(); it++)
+            {
+                if (connectedComponent.find (*it) == connectedComponent.end())
+                {
+                    // F(n+1) = N(F(n)) - C(n)
+                    frontline.insert (*it);
+
+                    // C(n+1) = N(F(n)) + C(n)
+                    connectedComponent.insert (*it);
+                }
+            }
+        }
+
+        // We return the number of nodes for this connected component
+        return connectedComponent;
+    }
+
+    // We provide an accessor to the nodes of the found connected component
+    const set<BranchingNode>& get() const { return connectedComponent; }
+
+private:
+    const Graph& graph;
+    set<BranchingNode>       connectedComponent;
+};
+
+/********************************************************************************/
+/*        Computing connected components of the branching nodes subgraph.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("GraphStats");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",  true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the graph
+        Graph graph = Graph::load (options->getStr(STR_URI_GRAPH));
+
+        // We create a graph marker.
+        GraphMarker marker (graph);
+
+        // We create an object for Breadth First Search for the de Bruijn graph.
+        BFS bfs (graph);
+
+        // We want to compute the distribution of connected components of the branching nodes.
+        //    - key is a connected component class (for a given number of branching nodes for this component)
+        //    - value is the number of times this component class occurs in the branching sub graph
+        map<size_t,size_t> distrib;
+
+        // We get an iterator for branching nodes of the graph. We use a progress iterator to get some progress feedback
+        ProgressGraphIterator<BranchingNode,ProgressTimer>  itBranching (graph.iteratorBranching(), "statistics");
+
+        // We want to know the number of connected components
+        size_t nbConnectedComponents = 0;
+
+        // We want time duration of the iteration
+        TimeInfo ti;
+        ti.start ("compute");
+
+        // We loop the branching nodes
+        for (itBranching.first(); !itBranching.isDone(); itBranching.next())
+        {
+            // We skip already visited nodes.
+            if (marker.isMarked (*itBranching))  { continue; }
+
+            // We launch the breadth first search; we get as a result the set of branching nodes in this component
+            const set<BranchingNode>& component = bfs.run (*itBranching);
+
+            // We mark the nodes for this connected component
+            marker.mark (component);
+
+            // We update our distribution
+            distrib[component.size()] ++;
+
+            // We update the number of connected components.
+            nbConnectedComponents++;
+        }
+
+        ti.stop ("compute");
+
+        // We compute the total number of branching nodes in all connected components.
+        size_t sum = 0;   for (map<size_t,size_t>::iterator it = distrib.begin(); it != distrib.end(); it++)  {  sum += it->first*it->second; }
+
+        // Note: it must be equal to the number of branching nodes of the graph
+        assert (sum == itBranching.size());
+
+        // We aggregate the computed information
+        Properties props ("connected_components");
+        props.add (1, "graph_name",              "%s", graph.getName().c_str());
+        props.add (1, "nb_branching_nodes",      "%d", sum);
+        props.add (1, "nb_connected_classes",    "%d", distrib.size());
+        props.add (1, "nb_connected_components", "%d", nbConnectedComponents);
+        for (map<size_t,size_t>::iterator it = distrib.begin(); it!=distrib.end(); it++)
+        {
+            props.add (2, "component");
+            props.add (3, "nb_nodes",    "%d", it->first);
+            props.add (3, "nb_occurs",   "%d", it->second);
+            props.add (3, "freq_nodes",  "%f", 100.0*(float)(it->first*it->second) / (float)sum);
+            //props.add (3, "freq_occurs", "%f", 100.0*(float)it->second / (float)sum);
+        }
+        props.add (1, ti.getProperties("time"));
+
+        // We dump the results in a XML file in the current directory
+        XmlDumpPropertiesVisitor v (graph.getName() + ".xml", false);
+        props.accept (&v);
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn2.cpp b/gatb-core/examples/debruijn/debruijn2.cpp
new file mode 100644
index 0000000..39f7a7c
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn2.cpp
@@ -0,0 +1,42 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*  Graph creation from command line options                                    */
+/*                                                                              */
+/*  This snippet DO NOT use the OptionsParser facility of GATB-Core library     */
+/*  but a simple string (expected to be a Fasta/q file) passed in on the        */
+/*  command-line.                                                               */
+/*                                                                              */
+/* Cmd-line: debruijn1 <fasta/q file>                                           */
+/*                                                                              */
+/* Sample: debruijn1 gatb-core/gatb-core/test/db/reads1.fa                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be a bank URI).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a bank uri." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We create the graph with the provided options.
+        Graph graph = Graph::create ("-in %s", argv[1]);
+
+        // We dump some information about the graph.
+        std::cout << graph.getInfo() << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn20.cpp b/gatb-core/examples/debruijn/debruijn20.cpp
new file mode 100644
index 0000000..04dcb8a
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn20.cpp
@@ -0,0 +1,258 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <map>
+#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+#include <queue>
+#include <deque>
+#include <set>
+#include <algorithm>
+
+#undef NDEBUG
+#include <cassert>
+
+using namespace std;
+
+/********************************************************************************/
+/*  BFS exploration of a graph.                                                 */
+/*                                                                              */
+/*  We define a class that marks nodes in a graph and call tell whether a given */
+/*  node is marked or not.                                                      */
+/*  We use a map for the implementation (could be not optimal).                 */
+/*                                                                              */
+/* Cmd-line: debruijn20 -graph <h5 file>                                        */
+/*                                                                              */
+/* Sample: debruijn20 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+class GraphMarker
+{
+public:
+
+    GraphMarker (const Graph& graph) : graph(graph)
+    {
+        // We insert all the nodes into our map.
+        auto iter = [&] (const BranchingNode& item)  {  this->markMap[item] = false;  };
+        graph.iteratorBranching().iterate (iter);
+    }
+
+    void mark (const BranchingNode& item)  {  markMap [item] = true;  }
+
+    void mark (const set<BranchingNode>& items)   {   for (typename set<BranchingNode>::const_iterator it=items.begin(); it != items.end(); ++it)  {  mark (*it); }  }
+
+    bool isMarked (const BranchingNode& item) const  {  return markMap.find(item)->second;  }
+
+private:
+    const Graph& graph;
+    map<BranchingNode,bool>  markMap;
+};
+
+/********************************************************************************/
+
+// We define a class that performs a breadth first search in a graph from a starting node.
+// We need a marker to globally mark the visited nodes from one call to another.
+// The nodes visit is handled by a std::queue object.
+class BFS
+{
+public:
+
+    BFS (const Graph& graph) : graph(graph) {}
+
+    // Process the BFS started from the provided node. As a result, we get the nodes number in the
+    // found connected component.
+    const set<BranchingNode>& run (const BranchingNode& node)
+    {
+        // ALGORITHM (recursion on n)
+        //    We define as C(n) the set of nodes of the connected component to be computed.
+        //    We define as F(n) the set of nodes for which we get neighbors for extending the BFS
+        //    We use the function N(E) that returns the set of neighbors nodes of items in set E
+        //
+        //  Init:
+        //      C(0)={b} and F(0)={b},  where b is the initial node
+        //  Recursion:
+        //      F(n+1) = N(F(n)) - C(n)
+        //      C(n+1) = N(F(n)) + C(n)
+        //  End criteria:
+        //      card(F(n)) = 0
+
+        // We set the initial state for F(0)
+        set<BranchingNode> frontline;
+        frontline.insert (node);
+
+        // We set the initial state for C(0)
+        connectedComponent.clear();
+        connectedComponent.insert (node);
+
+        // We launch the recursion.
+        while (!frontline.empty())
+        {
+            // We get the neighbors for the current front line, ie. we get N(F(n))
+            set<BranchingNode> neighbors = graph.neighbors (frontline.begin(), frontline.end());
+
+            // We reset the current front line => we reuse it for computing F(n+1)
+            frontline.clear();
+
+            // We compute the recursion for F(n+1) and C(n+1)
+            for (typename set<BranchingNode>::iterator it = neighbors.begin(); it != neighbors.end(); it++)
+            {
+                if (connectedComponent.find (*it) == connectedComponent.end())
+                {
+                    // F(n+1) = N(F(n)) - C(n)
+                    frontline.insert (*it);
+
+                    // C(n+1) = N(F(n)) + C(n)
+                    connectedComponent.insert (*it);
+                }
+            }
+        }
+
+        // We return the number of nodes for this connected component
+        return connectedComponent;
+    }
+
+    // We provide an accessor to the nodes of the found connected component
+    const set<BranchingNode>& get() const { return connectedComponent; }
+
+private:
+    const Graph& graph;
+    set<BranchingNode>       connectedComponent;
+};
+
+/********************************************************************************/
+/*        Computing connected components of the branching nodes subgraph.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("GraphStats");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",  true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the graph
+        Graph graph = Graph::load (options->getStr(STR_URI_GRAPH));
+
+        // We create a graph marker.
+        GraphMarker marker (graph);
+
+        // We create an object for Breadth First Search for the de Bruijn graph.
+        BFS bfs (graph);
+
+        // We want to compute the distribution of connected components of the branching nodes.
+        //    - key is a connected component class (for a given number of branching nodes for this component)
+        //    - value is the number of times this component class occurs in the branching sub graph
+        map<size_t,size_t> distrib;
+
+        // We get an iterator for all nodes of the graph. We use a progress iterator to get some progress feedback
+        ProgressGraphIterator<BranchingNode,ProgressTimer>  itBranching (graph.iteratorBranching(), "statistics");
+
+        // We want time duration of the iteration
+        TimeInfo ti;
+        ti.start ("compute");
+
+        // We need to keep each connected component.
+        list<set<BranchingNode> > components;
+
+        // We loop the branching nodes
+        for (itBranching.first(); !itBranching.isDone(); itBranching.next())
+        {
+            // We skip already visited nodes.
+            if (marker.isMarked (*itBranching))  { continue; }
+
+            // We launch the breadth first search; we get as a result the set of branching nodes in this component
+            const set<BranchingNode>& component = bfs.run (*itBranching);
+
+            // We memorize the component
+            components.push_back (component);
+
+            // We mark the nodes for this connected component
+            marker.mark (component);
+
+            // We update our distribution
+            distrib[component.size()] ++;
+        }
+
+        ti.stop ("compute");
+
+        // We compute the total number of branching nodes in all connected components.
+        size_t sum = 0;   for (map<size_t,size_t>::iterator it = distrib.begin(); it != distrib.end(); it++)  {  sum += it->first*it->second; }
+
+        // Note: it must be equal to the number of branching nodes of the graph
+        assert (sum == itBranching.size());
+
+        size_t idx1=0;
+        size_t cc=0;
+        // We check that each component has no intersection with all other components.
+        // Note: this check may take a long time since we have N^2 intersections to compute.
+        for (list<set<BranchingNode> >::iterator it1 = components.begin(); it1 != components.end(); it1++, idx1++)
+        {
+            size_t idx2=0;
+
+            for (list<set<BranchingNode> >::iterator it2 = components.begin(); it2 != components.end(); it2++, idx2++)
+            {
+                if (it1 != it2)
+                {
+                    set<BranchingNode> inter;
+                    set_intersection (it1->begin(),it1->end(),it2->begin(),it2->end(), std::inserter(inter,inter.begin()));
+                    if (inter.size()!=0)  { printf ("ERROR, intersection should be empty...\n");  exit(EXIT_FAILURE); }
+                }
+
+                if (++cc % 50 == 0)
+                {
+                    cc = 0;
+                    printf ("[check] %.1f  %.1f\r", 100.0*(float)idx1/(float)components.size(), 100.0*(float)idx2/(float)components.size());
+                    fflush (stdout);
+                }
+            }
+        }
+        printf ("\n");
+
+        // We aggregate the computed information
+        Properties props ("connected_components");
+        props.add (1, "graph_name",              "%s", graph.getName().c_str());
+        props.add (1, "nb_branching_nodes",      "%d", sum);
+        props.add (1, "nb_connected_components", "%d", distrib.size());
+        for (map<size_t,size_t>::iterator it = distrib.begin(); it!=distrib.end(); it++)
+        {
+            props.add (2, "component");
+            props.add (3, "nb_nodes",    "%d", it->first);
+            props.add (3, "nb_occurs",   "%d", it->second);
+            props.add (3, "freq_nodes",  "%f", 100.0*(float)(it->first*it->second) / (float)sum);
+            props.add (3, "freq_occurs", "%f", 100.0*(float)it->second / (float)sum);
+        }
+        props.add (1, ti.getProperties("time"));
+
+        // We dump the results in a XML file in the current directory
+        XmlDumpPropertiesVisitor v (graph.getName() + ".xml", false);
+        props.accept (&v);
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn21.cpp b/gatb-core/examples/debruijn/debruijn21.cpp
new file mode 100644
index 0000000..9b1ed73
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn21.cpp
@@ -0,0 +1,62 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                   Looking for simple cycles in the graph.                    */
+/*                                                                              */
+/* Cmd-line: debruijn21 -graph <h5 file>                                        */
+/*                                                                              */
+/* Sample: debruijn21 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("GraphStats");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",  true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the graph
+        Graph graph = Graph::load (options->getStr(STR_URI_GRAPH));
+
+        // We iterate the branching nodes
+        Dispatcher().iterate (graph.iteratorBranching (), [&] (const BranchingNode& node)
+        {
+            // We iterate the successors of the current node
+            graph.successorsBranchingEdge((Node&)node).iterate ([&] (const BranchingEdge& edge)
+            {
+                if (edge.from == edge.to)  {  cout << "CYCLE: " << graph.toString (edge) << endl;  }
+            });
+        });
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn22.cpp b/gatb-core/examples/debruijn/debruijn22.cpp
new file mode 100644
index 0000000..58fcded
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn22.cpp
@@ -0,0 +1,179 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*            Count number of branching nodes in each read of a bank.           */
+/*                                                                              */
+/* This snippet maps the sequences of a bank on the de Bruijn graph for this    */
+/* bank. The idea is to know, for one sequence, how many branching nodes (BN)   */
+/* are present in the sequence.                                                 */
+/*                                                                              */
+/* As a result, we get a distribution <nb branching nodes per kmer, nb occurs>  */
+/*                                                                              */
+/* This distribution is saved as a HDF5 file. It is possible to extract data    */
+/* from it with the HDF5 tools (such as 'h5dump'). For instance, you can dump   */
+/* the distribution with gnuplot with the following line:                       */
+/*      h5dump -y -d distrib  output.h5  | grep "^\ *[0-9]" | tr -d " "  | paste - - | gnuplot -p -e 'plot  "-" with lines' */
+/*                                                                              */
+/* Cmd-line: debruijn22 -graph <h5 file> -out <output file>                     */
+/*                                                                              */
+/* Sample: debruijn22 -graph gatb-core/gatb-core/test/db/celegans_reads.h5 ...  */
+/*                    -out /tmp/out.h5                                          */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+class BranchingNodeMapping : public Tool
+{
+public:
+
+    BranchingNodeMapping () : Tool ("BranchingNodeMapping")
+    {
+        getParser()->push_back (new OptionOneParam (STR_URI_GRAPH,  "graph file",  true));
+        getParser()->push_back (new OptionOneParam (STR_URI_OUTPUT, "output file", false, "output"));
+    }
+
+    void execute ()
+    {
+        try
+        {
+            // We load the graph with the provided graph uri.
+            Graph graph = Graph::load (getInput()->getStr(STR_URI_GRAPH));
+
+            // We check that the sorting count got all the kmers
+            if (graph.getInfo().getInt("abundance_min") != 1)  { throw Exception("min abundance must be 1"); }
+
+            // We retrieve a handle of the bank (we get the uri from the graph properties)
+            IBank* ibank = Bank::open (graph.getInfo().getStr("bank_uri"));
+            LOCAL (ibank);
+
+            // We convert the bank to binary form
+            BankConverterAlgorithm converter (ibank, graph.getKmerSize(), "bank.bin");
+            converter.execute();
+            IBank* bank = converter.getResult();
+            LOCAL (bank);
+
+            // We create a kmer model for iterating kmers of sequences.
+            Kmer<>::ModelCanonical model (graph.getKmerSize());
+
+            size_t totalNbKmers     = 0;
+            size_t totalNbBranching = 0;
+
+            // We create a sequences iterator
+            Iterator<Sequence>* iter = this->createIterator<Sequence> (*bank, "iterate bank");
+            LOCAL (iter);
+
+            // We need a map for building the distribution.
+            ThreadObject<map<int,int> > distrib;
+
+            // We iterate the bank
+            IDispatcher::Status status = getDispatcher()->iterate (iter, [&] (Sequence& seq)
+            {
+                // We get a reference on the local distribution for the current thread
+                map<int,int>& localDistrib = distrib();
+
+                // We compute the number of kmers in the current sequence
+                int nbKmers = seq.getDataSize() - graph.getKmerSize() + 1;
+
+                if (nbKmers > 0)
+                {
+                    int nbBranching = 0;
+
+                    // We iterate the kmers of the current sequence
+                    model.iterate (seq.getData(), [&] (const Kmer<>::ModelCanonical::Kmer& kmer, size_t rank)
+                    {
+                        // We count the branching nodes.
+                        Node node = Node::Value(kmer.value());
+                        if (graph.isBranching (node))  {  nbBranching++;  }
+                    });
+
+                    // We increase the (local) distribution for this number of branching nodes per sequence
+                    localDistrib[nbBranching] ++;
+
+                    // We also increase the number of seen kmers (synchronization required).
+                    __sync_fetch_and_add (&totalNbKmers, nbKmers);
+                }
+            });
+
+            // We merge the (local) distributions filled by each thread into the final distribution
+            distrib.foreach ([&] (map<int,int>& localDistrib)
+            {
+                for (map<int,int>::iterator it = localDistrib.begin(); it != localDistrib.end(); it++)
+                {
+                    (*distrib)[it->first] += it->second;
+                    totalNbBranching += it->first * it->second;
+                }
+            });
+
+            // We gather some statistics.
+            getInfo()->add (1, "stats");
+
+            getInfo()->add (2, "nb_kmers", "");
+            getInfo()->add (3, "total",  "%ld", totalNbKmers);
+            getInfo()->add (3, "unique", "%ld", graph.getInfo().getInt("kmers_nb_solid"));
+            getInfo()->add (3, "ratio",  "%.3f", (float)totalNbKmers / (float)graph.getInfo().getInt("kmers_nb_solid"));
+
+            getInfo()->add (2, "nb_branching", "");
+            getInfo()->add (3, "total", "%ld", totalNbBranching);
+            getInfo()->add (3, "unique", "%ld", graph.getInfo().getInt("nb_branching"));
+            getInfo()->add (3, "ratio",  "%.3f", (float)totalNbBranching / (float)graph.getInfo().getInt("nb_branching"));
+
+            getInfo()->add (2, "percentage",   "");
+            getInfo()->add (3, "total",    "%.3f", 100 * (float)totalNbBranching / (float)totalNbKmers);
+            getInfo()->add (3, "unique",   "%.3f", 100 * (float)graph.getInfo().getInt("nb_branching") / (float)graph.getInfo().getInt("kmers_nb_solid"));
+
+            getInfo()->add (1, "exec");
+            getInfo()->add (2, "time",     "%.3f", (float)status.time / 1000.0);
+            getInfo()->add (2, "nb_cores", "%d", status.nbCores);
+
+            // We create the output file
+            Storage* storage = StorageFactory(STORAGE_HDF5).create(getInput()->getStr(STR_URI_OUTPUT), true, false);
+            LOCAL (storage);
+
+            // We create the collection in the output storage
+            typedef Abundance<NativeInt64, u_int32_t> DistribEntry;
+            Collection<DistribEntry>& outDistrib = storage->root().getCollection<DistribEntry>("distrib");
+
+            // We dump the distribution in the output file
+            for (map<int,int>::iterator it = (*distrib).begin(); it != (*distrib).end(); it++)
+            {
+                outDistrib.insert (DistribEntry(it->first, it->second));
+            }
+            outDistrib.flush();
+        }
+        catch (Exception& e)
+        {
+            std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+        }
+    }
+};
+
+/********************************************************************************/
+/*            Count number of branching nodes in each read of a bank.           */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We run the branching node mapper
+        BranchingNodeMapping().run (argc, argv);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+        return EXIT_FAILURE;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn23.cpp b/gatb-core/examples/debruijn/debruijn23.cpp
new file mode 100644
index 0000000..ee44056
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn23.cpp
@@ -0,0 +1,13 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn24.cpp b/gatb-core/examples/debruijn/debruijn24.cpp
new file mode 100644
index 0000000..359290e
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn24.cpp
@@ -0,0 +1,153 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <fstream>
+#include <queue>
+#include <stack>
+#include <map>
+using namespace std;
+
+#define DEBUG(a)  //a
+#define INFO(a)   //a
+
+/********************************************************************************/
+/* Cmd-line: debruijn24 -graph <h5 file> [-out <output file>]                   */
+/*                                                                              */
+/* Sample: debruijn24 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/********************************************************************************/
+
+const char* STR_NODE_TYPE = "-type";
+
+/********************************************************************************/
+class DotGeneratorTool : public Tool
+{
+public:
+
+    // Constructor
+    DotGeneratorTool () : Tool ("DotGenerator")
+    {
+        _parser->push_front (new OptionOneParam (STR_URI_GRAPH,  "graph file", true ));
+        _parser->push_front (new OptionOneParam (STR_URI_OUTPUT, "dot file",  false ));
+        _parser->push_front (new OptionOneParam (STR_NODE_TYPE,  "node type (0: all,  1:branching)", false, "1" ));
+    }
+
+    void processNode(Graph &graph, ofstream &output)
+    {
+        map<Node, u_int64_t> mapping;
+        u_int64_t count = 0;
+    
+        GraphIterator<Node> itMap = graph.iterator ();
+        for (itMap.first(); !itMap.isDone(); itMap.next())  { mapping[itMap.item()] = count++; }
+
+        ProgressGraphIterator<Node,ProgressTimer> it = graph.iterator ();
+        for (it.first(); !it.isDone(); it.next())
+        {
+            Node current = it.item();
+
+            GraphVector<Node> neighbors = graph.neighbors(current.kmer);
+
+            for (size_t i=0; i<neighbors.size(); i++)
+            {
+                output << mapping[current.kmer] << " -> " <<  mapping[neighbors[i].kmer] << " ;\n";
+            }
+        }
+
+        output << "}\n";
+
+        output.close();
+    }
+
+    void processBranchingNode(Graph &graph, ofstream & output)
+    {
+        map<Node, u_int64_t> mapping;
+        u_int64_t count = 0;
+    
+        GraphIterator<BranchingNode> itMap = graph.iteratorBranching();
+        for (itMap.first(); !itMap.isDone(); itMap.next())  { mapping[itMap.item()] = count++; }
+
+        ProgressGraphIterator<BranchingNode,ProgressTimer> it = graph.iteratorBranching ();
+        for (it.first(); !it.isDone(); it.next())
+        {
+            BranchingNode current = it.item();
+
+            GraphVector<BranchingNode> neighbors = graph.neighborsBranching (current.kmer);
+
+            for (size_t i=0; i<neighbors.size(); i++)
+            {
+                output << mapping[current.kmer] << " -> " <<  mapping[neighbors[i].kmer] << " ;\n";
+            }
+        }
+
+        output << "}\n";
+
+        output.close();
+    }
+
+ 
+    // Actual job done by the tool is here
+    void execute ()
+    {
+
+        string outputFile = getInput()->get(STR_URI_OUTPUT) ?
+            getInput()->getStr(STR_URI_OUTPUT) :
+            (System::file().getBaseName(getInput()->getStr(STR_URI_GRAPH)) + ".dot");
+
+        ofstream output (outputFile.c_str());
+
+        // We load the graph
+        Graph graph = Graph::load (getInput()->getStr(STR_URI_GRAPH));
+
+
+
+        switch (getInput()->getInt(STR_NODE_TYPE))
+        {
+            case 0: 
+                output << "digraph " << "all" << "{\n";
+                processNode(graph, output);
+                break;
+            case 1: 
+                output << "digraph " << "branching" << "{\n";
+                processBranchingNode(graph, output);  
+                break;
+            default: break;
+        }
+     }
+};
+
+/********************************************************************************/
+/*                                                                              */
+/*                   Generate dot file from a graph.                            */
+/*                                                                              */
+/*  This snippet generates a dot file from a graph file. You can then generate  */
+/*  a pdf file with "dot -Tpdf graph.dot -o graph.pdf"                          */
+/*                                                                              */
+/*  NOTE: de Bruijn graphs may be huge and complex, so dot is not the best tool */
+/*  to display such graphs. You should use it on small graphs with only a few   */
+/*  hundreds of nodes.                                                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We run the tool with the provided command line arguments.
+        DotGeneratorTool().run (argc, argv);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn25.cpp b/gatb-core/examples/debruijn/debruijn25.cpp
new file mode 100644
index 0000000..4328165
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn25.cpp
@@ -0,0 +1,121 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                                                                              */
+/* Cmd-line: debruijn25 -in <fasta/q file>                                      */
+/*                                                                              */
+/* Sample: debruijn25 -in gatb-core/gatb-core/test/db/reads1.fa                 */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+
+#define KSIZE_32 (KSIZE_LIST == 32)                                                                                                                                                                               
+    std::cout << "this example cannot be run when gatb-core is compiled for kmers <= 32" << std::endl;
+#if KSIZE_32                                                                                                                                                                                                      
+#else        
+    const size_t SPAN = KMER_SPAN(1);
+
+    /** Shortcuts. */
+    typedef Kmer<SPAN>::Type  Type;
+    typedef Kmer<SPAN>::Count Count;
+    typedef Kmer<SPAN>::ModelCanonical ModelCanon;
+    typedef Kmer<SPAN>::ModelMinimizer <ModelCanon> Model;
+
+    size_t kmerSize = 33;
+    size_t mmerSize = 11;
+
+    /** We create a command line parser. */
+    OptionsParser parser ("GraphStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",  true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        string filename = options->getStr (STR_URI_INPUT);
+
+        /** We create the solid kmers. */
+        Graph graph = Graph::create ("-in %s -kmer-size %d  -bloom none -out toto.h5  -abundance-min 1", filename.c_str(), kmerSize);
+
+        /** We get the information of the solid kmers from the HDF5 file. */
+        Storage* storage = StorageFactory(STORAGE_HDF5).load ("toto.h5");   LOCAL (storage);
+        Group& dskGroup = storage->getGroup("dsk");
+
+        /** We get the solid kmers partition. */
+        Partition<Count>& partition = dskGroup.getPartition<Count> ("solid");
+
+        /** We create two kmers models. */
+        Model  model   (kmerSize,   mmerSize);
+        Model  modelK1 (kmerSize-1, mmerSize);
+
+        // We declare an output Bank
+        BankBinary outputBank (System::file().getBaseName(filename) + ".bin");
+
+        /** We create a sequence with BINARY encoding. */
+        Sequence seq (Data::ASCII);
+
+        /** We get an iterator over the [kmer,abundance] of solid kmers. */
+        Iterator<Count>* it = partition.iterator();   LOCAL (it);
+
+        /** We iterate the solid kmers. */
+        for (it->first(); !it->isDone(); it->next())
+        {
+            Type current = it->item().value;
+
+            cout << "kmer=" << it->item().value << "  minimizer=" << model.getMinimizerValue(current)
+                << "  abundance=" << it->item().abundance << endl;
+
+            /** We interpret the kmer value as a Data object. */
+            Data data (Data::BINARY);
+            data.setRef ((char*) &current, model.getKmerSize());
+
+            modelK1.iterate (data, [&] (const Model::Kmer& k, size_t idx)
+            {
+                /** Shortcut. */
+                Type miniminizerCurrent = k.minimizer().value();
+
+                cout << "-> " << k.value()
+                     << " minimizer=" << miniminizerCurrent << " "
+                     << modelK1.getMmersModel().toString (miniminizerCurrent)
+                     << endl;
+
+                string tmp = modelK1.getMmersModel().toString (miniminizerCurrent);
+
+                /** We interpret the minimizer value as a Data object. */
+                seq.getData().setRef ((char*)tmp.c_str(), modelK1.getMmersModel().getKmerSize());
+
+                /** We insert the sequence into the binary bank. */
+                outputBank.insert (seq);
+            });
+        }
+
+        /** We flush the output bank. */
+        outputBank.flush();
+
+        /** We iterate the output bank. */
+        outputBank.iterate ([&] (const Sequence& s)
+        {
+            /** We get the kmer corresponding to the current sequence. */
+            ModelCanon::Kmer mini = modelK1.getMmersModel().codeSeed (s.getDataBuffer(), Data::BINARY);
+
+            cout << "mini=" << mini.value() << "  " << modelK1.getMmersModel().toString (mini.value()) << endl;
+        });
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+#endif
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn26.cpp b/gatb-core/examples/debruijn/debruijn26.cpp
new file mode 100644
index 0000000..337acf3
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn26.cpp
@@ -0,0 +1,36 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                   Getting abundances for nodes graph.                        */
+/*                                                                              */
+/* This snippet shows how to retrieve the abundance of a node in the graph.     */
+/* This feature is enabled only when the "-mphf emphf" is set during graph      */
+/* creation.                                                                    */
+/*                                                                              */
+/* Cmd-line: debruijn26 (takes no argument)                                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    const char* seq = "AAAAACTACATTACCCGTTTGCGAGACAGGTA";
+
+    size_t kmerSize = strlen (seq) - 1;
+
+    // We create a fake bank with 4 times the same sequence
+    IBank* bank = new BankStrings (seq, seq, seq, seq, 0);
+
+    // We create the graph. (it needs a mphf, but now mphf is created by default)
+    Graph graph = Graph::create (bank, "-kmer-size %d  -abundance-min 1 -verbose 0", kmerSize);
+
+    // We build a fake node (we are sure that it will be in the graph).
+    Node node = graph.buildNode (seq);
+
+    // We query its abundance.
+    cout << "abundance=" << graph.queryAbundance(node) << endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn27.cpp b/gatb-core/examples/debruijn/debruijn27.cpp
new file mode 100644
index 0000000..23f44f1
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn27.cpp
@@ -0,0 +1,51 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                   Getting abundances for nodes graph.                        */
+/*                                                                              */
+/* This snippet shows how to retrieve the abundance of a node in the graph.     */
+/*                                                                              */
+/* Cmd-line: debruijn27 <h5 file> <sequence>                                    */
+/*                                                                              */
+/* Sample: debruijn27 gatb-core/gatb-core/test/db/celegans_reads.h5 ...         */
+/*                    "TTTGCCCATTTCCTGCCATTTGTC"                                */
+/*                     |-> 5' end of 1st sequence from                          */
+/*                        https://github.com/GATB/gatb-core-tuto/blob/master/server/data/celegans_reads.fasta*/
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+
+    cout << "This snippet shows how to retrieve the abundance of a node in the graph." << endl;
+
+    if (argc < 3)
+    {
+        cout << "Arguments: [graphFile] [sequence]" << endl;
+        exit(1);
+    }
+
+    char* graphFile = argv[1];
+    char* seq       = argv[2];
+
+    // We load the graph. IMPORTANT : must be have created with mphf (default parameter of dbgh5 nowadays)
+    Graph graph = Graph::load (graphFile);
+
+    // We build a fake node (we must be sure that it is in the graph).
+    Node node = graph.buildNode (seq);
+
+    // We query its abundance.
+    cout << "abundance=" << graph.queryAbundance(node) << endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn3.cpp b/gatb-core/examples/debruijn/debruijn3.cpp
new file mode 100644
index 0000000..764f13a
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn3.cpp
@@ -0,0 +1,42 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*  Graph creation from a basic command-line.                                   */
+/*  Uses abundance-min=5.                                                       */
+/*                                                                              */
+/* Cmd-line: debruijn1 <fasta/q file>                                           */
+/*                                                                              */
+/* Sample: debruijn1 gatb-core/gatb-core/test/db/reads1.fa                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be a FASTA file URI).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a FASTA file uri." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We create the graph with the bank and other options
+        Graph graph = Graph::create (Bank::open(argv[1]), "-abundance-min %d", 5);
+
+        // We dump some information about the graph.
+        std::cout << graph.getInfo() << std::endl;
+
+        // Note: Graph::create will take care about 'bank' object and will delete it if nobody else needs it.
+        // In other words: there is no need here to call 'delete' on 'bank' here.
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn4.cpp b/gatb-core/examples/debruijn/debruijn4.cpp
new file mode 100644
index 0000000..2d198c4
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn4.cpp
@@ -0,0 +1,43 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/* Graph creation from a fake bank and no command line options                  */
+/*                                                                              */
+/* You can dump the result of this test with HDF5 tools (provided by GATB):     */
+/*      h5dump mygraph.h5                                                       */
+/*                                                                              */
+/* Cmd-line: debruijn4 (takes no argument)                                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get a handle on a fake bank made of 3 sequences.
+    IBank* bank = new BankStrings (
+        "ATCGTACGACGCTAGCTAGCA",
+        "ACTACGTATCGGTATATATTTTCGATCGATCAG",
+        "TGACGGTAGCATCGATCAGGATCGA",
+        NULL
+    );
+
+    try
+    {
+        // We create the graph with the bank and other options
+        Graph graph = Graph::create (bank, "-kmer-size 5  -abundance-min 1  -out mygraph");
+
+        // We dump some information about the graph.
+        std::cout << graph.getInfo() << std::endl;
+
+        // Note: Graph::create will take care about 'bank' object and will delete it if nobody else needs it.
+        // In other words: there is no need here to call 'delete' on 'bank' here.
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn5.cpp b/gatb-core/examples/debruijn/debruijn5.cpp
new file mode 100644
index 0000000..3721d2c
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn5.cpp
@@ -0,0 +1,43 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/* Graph loading from a HDF5 file.                                              */
+/*                                                                              */
+/* Cmd-line: debruijn5 <h5 file>                                                */
+/*                                                                              */
+/* Sample: debruijn5 gatb-core/gatb-core/test/db/celegans_reads.h5              */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be in HDF5 format).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a HDF5 file." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We create the graph with the bank and other options
+        Graph graph = Graph::load (argv[1]);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn6.cpp b/gatb-core/examples/debruijn/debruijn6.cpp
new file mode 100644
index 0000000..6ed620a
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn6.cpp
@@ -0,0 +1,56 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/* Graph loading from a HDF5 file, the iterate over the nodes.                  */
+/*                                                                              */
+/* Cmd-line: debruijn6 <h5 file>                                                */
+/*                                                                              */
+/* Sample: debruijn6 gatb-core/gatb-core/test/db/celegans_reads.h5              */
+/*                                                                              */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be in HDF5 format).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a HDF5 file." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We load the graph from the given graph file
+        Graph graph = Graph::load (argv[1]);
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator ();
+
+        // We loop each node. Note the structure of the for loop.
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // The currently iterated node is available with it.item()
+
+            // We dump an ascii representation of the current node.
+            std::cout << graph.toString (it.item()) << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn7.cpp b/gatb-core/examples/debruijn/debruijn7.cpp
new file mode 100644
index 0000000..4a92dbb
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn7.cpp
@@ -0,0 +1,68 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                                                                              */
+/* Graph loading from a HDF5 file, the iterate over the nodes, parallel version.*/
+/*                                                                              */
+/* Cmd-line: debruijn7 <h5 file>                                                */
+/*                                                                              */
+/* Sample: debruijn7 gatb-core/gatb-core/test/db/celegans_reads.h5              */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be in HDF5 format).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a HDF5 file." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We load the graph from the given graph file
+        Graph graph = Graph::load (argv[1]);
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator ();
+
+        // We choose how many cores we want to use.
+        // By convention, a 0 value will use all available cores.
+        size_t nbCores = 4;
+
+        // We iterate all the nodes of the graph.
+
+        // Note how we create a Dispatcher object (with the required number of cores) and
+        // use it for dispatching the iteration in several threads.
+        IDispatcher::Status status = Dispatcher(nbCores).iterate (it, [&graph] (const Node& node)
+        {
+            // This instruction block will be executed within the context of one of the 4 created threads.
+
+            // We are given a current node and we can do some process on it in the current thread.
+        });
+
+        // We display some information about the dispatching
+        std::cout << "we used " << status.nbCores << " cores, elapsed time is " << status.time << " msec" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn8.cpp b/gatb-core/examples/debruijn/debruijn8.cpp
new file mode 100644
index 0000000..982ae58
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn8.cpp
@@ -0,0 +1,55 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/* Graph loading from a HDF5 file, the iterate over the branching nodes.        */
+/*                                                                              */
+/* Cmd-line: debruijn8 <h5 file>                                                */
+/*                                                                              */
+/* Sample: debruijn8 gatb-core/gatb-core/test/db/celegans_reads.h5              */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We check that the user provides at least one option (supposed to be in HDF5 format).
+    if (argc < 2)
+    {
+        std::cerr << "You must provide a HDF5 file." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        // We load the graph from the given graph file
+        Graph graph = Graph::load (argv[1]);
+
+        // We get an iterator for branching nodes of the graph.
+        GraphIterator<BranchingNode> it = graph.iteratorBranching ();
+
+        // We loop each node. Note the structure of the for loop.
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // The currently iterated branching node is available with it.item()
+
+            // We dump an ascii representation of the current node.
+            std::cout << "[" << it.rank() << "] " << graph.toString (it.item()) << std::endl;
+        }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/debruijn9.cpp b/gatb-core/examples/debruijn/debruijn9.cpp
new file mode 100644
index 0000000..0d4f250
--- /dev/null
+++ b/gatb-core/examples/debruijn/debruijn9.cpp
@@ -0,0 +1,65 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#undef NDEBUG
+#include <cassert>
+
+/********************************************************************************/
+/*                          Node neighbors management                           */
+/*                                                                              */
+/* Cmd-line: debruijn9 (takes no argument)                                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We create the graph with a bank holding one sequence, and use a specific kmer size and kmer solid abundance to 1
+        Graph graph = Graph::create (new BankStrings ("AATGC", NULL), "-kmer-size 4  -abundance-min 1  -verbose 0");
+
+        // We get an iterator for all nodes of the graph.
+        GraphIterator<Node> it = graph.iterator();
+
+        // We check that we have only two possible nodes
+        assert (it.size() == 2);
+
+        // We loop each node.
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // A shortcut.
+            Node& current = it.item();
+
+            // We get the ascii representation of the current iterated node
+            std::string s = graph.toString (current);
+
+            // We check that it is correct.
+            assert (s=="AATG" || s=="ATGC");
+
+            if (s=="AATG")
+            {
+                // We get the neighbors of this specific current
+                GraphVector<Node> neighbors = graph.successors(current);
+
+                // We check that we got only one successor
+                assert (neighbors.size() == 1);
+
+                // Another way to check the number of successors
+                assert (graph.outdegree(current) == 1);
+
+                // We check this is the correct neighbor
+                assert (graph.toString(neighbors[0]) == "ATGC");
+            }
+        }
+
+        std::cout << "Test OK" << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/traversal1.cpp b/gatb-core/examples/debruijn/traversal1.cpp
new file mode 100644
index 0000000..5fb0bc3
--- /dev/null
+++ b/gatb-core/examples/debruijn/traversal1.cpp
@@ -0,0 +1,82 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                  Path traversal in the graph                                 */
+/*                                                                              */
+/*  This snippet shows how to retrieve path in the graph with the Traversal     */
+/*  class.                                                                      */
+/*                                                                              */
+/* Cmd-line: traversal1 -graph <h5 file>                                        */
+/*                                                                              */
+/* Sample: traversal1 -graph gatb-core/gatb-core/test/db/celegans_reads.h5      */
+/*                                                                              */
+/* Note:                                                                        */
+/*     - '.h5' file contains the HDF5 formatted representation of a de bruijn   */
+/*     graph created from a set of reads.                                       */
+/*     - a '.h5' file is created using dbgh5 program provided with GATB-Core.   */
+/*     Basic use is as follows:                                                 */
+/*        dbgh5 -in <fasta/q file> -out <h5 file>                               */
+/*     You can also control kmer-size and kmer abundance, see dbgh5 help.       */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser.
+    OptionsParser parser ("Traversal");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",  true));
+
+    // We use a try/catch block in case we have some command line parsing issue.
+    try
+    {
+        // We parse the user options.
+        IProperties* props = parser.parse (argc, argv);
+
+        // We load the graph
+        Graph graph = Graph::load (props->getStr(STR_URI_GRAPH));
+
+        // We create a Terminator object
+        BranchingTerminator terminator (graph);
+
+        // We create a Traversal instance for unitigs.
+        Traversal* traversal = Traversal::create (TRAVERSAL_UNITIG, graph, terminator);
+        LOCAL (traversal);
+
+        Path pathRight;
+        Path pathLeft;
+
+        // We get one branching node in the graph
+        GraphIterator<BranchingNode> itBranching = graph.iteratorBranching ();
+        for (itBranching.first(); !itBranching.isDone(); itBranching.next())
+        {
+            BranchingNode current = itBranching.item();
+            bool isMarked = terminator.is_marked_branching (current);
+
+            cout << "Starting node : " << graph.toString (current) << "  marked=" << isMarked << endl;
+
+            //if (terminator.is_marked_branching (itBranching.item()))  { continue; }
+
+            int lenRight = traversal->traverse (current,                DIR_OUTCOMING, pathRight);
+            Node rev = graph.reverse(current);
+            int lenLeft  = traversal->traverse (rev, DIR_OUTCOMING, pathLeft);
+
+            cout << "lenLeft=" << lenLeft << "  lenRight=" << lenRight << endl;
+        }
+
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/debruijn/traversal2.cpp b/gatb-core/examples/debruijn/traversal2.cpp
new file mode 100644
index 0000000..b9ffed2
--- /dev/null
+++ b/gatb-core/examples/debruijn/traversal2.cpp
@@ -0,0 +1,97 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+// We define a helper function to get the traversal kind from the command line
+TraversalKind getTraversalKind (int argc, char* argv[]);
+
+/********************************************************************************/
+/*                  Path traversal in the graph                                 */
+/*                                                                              */
+/*  This snippet shows how to retrieve path in the graph with the Traversal     */
+/*  class.                                                                      */
+/*                                                                              */
+/*  If one uses the 'unitig' mode, one should get only the first part before    */
+/*  the SNP.                                                                    */
+/*                                                                              */
+/*  If one uses the 'contig' mode, one should get the whole sequence (which     */
+/*  means a consensus sequence)                                                 */
+/*                                                                              */
+/* Cmd-line: traversal2 -traversal unitig|contig                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We retrieve the traversal kind from the command line
+    TraversalKind traversalKind = getTraversalKind (argc, argv);
+
+//! [snippet1_traversal]
+    const char* seqs[] =
+    {
+        "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+        "CGCTACAGCAGCTAGTTCATCATTGTTTATCGATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+        //      SNP HERE at pos 31      x
+    };
+
+    // We create a fake bank with a SNP
+    IBank* bank = new BankStrings (seqs, ARRAY_SIZE(seqs));
+
+    // We load the graph
+    Graph graph = Graph::create (bank, "-abundance-min 1  -kmer-size 15  -verbose 0");
+
+    // We create a Terminator object
+    BranchingTerminator terminator (graph);
+
+    // We create a Traversal instance according to the chosen traversal kind
+    Traversal* traversal = Traversal::create (traversalKind, graph, terminator);
+    LOCAL (traversal);
+
+    // We create a node from the start of the first sequence
+    Node node = graph.buildNode (seqs[0]);
+
+    Path path;
+    int len = traversal->traverse (node, DIR_OUTCOMING, path);
+
+    // We dump the length, the starting node and the path
+    cout << "length=" << len << " " << graph.toString (node) << path << endl;
+//! [snippet1_traversal]
+
+    return EXIT_SUCCESS;
+}
+
+/********************************************************************************/
+TraversalKind getTraversalKind (int argc, char* argv[])
+{
+    const char* STR_TRAVERSAL_MODE = "-traversal";
+
+    TraversalKind result;
+
+    // We create a command line parser.
+    OptionsParser parser ("Traversal");
+    parser.push_back (new OptionOneParam (STR_TRAVERSAL_MODE, "traversal mode ('unitig' or 'contig'",  true));
+
+    // We retrieve the traversal kind.
+    try
+    {
+        IProperties* props = parser.parse (argc, argv);
+
+        parse (props->getStr(STR_TRAVERSAL_MODE), result);
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+        exit (EXIT_FAILURE);
+    }
+    catch (Exception& e)
+    {
+        cout << e.getMessage() << endl;
+        exit (EXIT_FAILURE);
+    }
+
+    return result;
+}
+
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer1.cpp b/gatb-core/examples/kmer/kmer1.cpp
new file mode 100644
index 0000000..3f6e0c6
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer1.cpp
@@ -0,0 +1,24 @@
+//! [snippet1]
+// We include what we need for the test
+
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                              Kmer management                                 */
+/*                                                                              */
+/* This snippet shows how instantiate the Model class and how to get info       */
+/* about it.                                                                    */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a default kmer model
+    Kmer<>::ModelCanonical model;
+
+    // We get some information about the model.
+    std::cout << "----------   MODEL   ----------"               << std::endl;
+    std::cout << "span:             " << model.getSpan()         << std::endl;
+    std::cout << "kmer size:        " << model.getKmerSize()     << std::endl;
+    std::cout << "kmer memory size: " << model.getMemorySize()   << std::endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer10.cpp b/gatb-core/examples/kmer/kmer10.cpp
new file mode 100644
index 0000000..ed0d1e4
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer10.cpp
@@ -0,0 +1,73 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet shows how read the file generated by the sorting count algo.    */
+/*                                                                              */
+/* Cmd-line: kmer10 -in <fasta/q file>                                           */
+/*                                                                              */
+/* Sample: kmer10 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser.
+    OptionsParser parser ("SortingCount");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "sorting count input", true));
+
+    try
+    {
+        // Shortcuts.
+        typedef Kmer<>::Count Count;
+        typedef Kmer<>::Type  Type;
+
+        // We parse the user options.
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the object storing the couples [kmer,abundance]
+        Storage* storage = StorageFactory(STORAGE_HDF5).load (options->getStr(STR_URI_INPUT));   LOCAL (storage);
+
+        // We get the group inside the storage object
+        Group& dskGroup = storage->getGroup("dsk");
+
+        // We retrieve the partition holding the couples [kmer,abundance]
+        Partition<Count>& solidKmers = dskGroup.getPartition<Count> ("solid");
+
+        // Now, we read the couples in two ways, computing a checksum in each case.
+        Type checksum1, checksum2;
+
+        // CASE 1: we read the couples [kmer,abundance] with an iterator over the whole partition
+        Iterator<Count>* it = solidKmers.iterator();  LOCAL (it);
+        for (it->first(); !it->isDone(); it->next())   {   checksum1 = checksum1 + it->item().value;  }
+
+        // CASE 2: we read the couples [kmer,abundance] with an iterator over each collection of the partition
+        for (size_t i=0; i<solidKmers.size(); i++)
+        {
+            // We get the current collection inside the partition
+            Collection<Count>& collection = solidKmers [i];
+
+            Iterator<Count>* it = collection.iterator();  LOCAL (it);
+            for (it->first(); !it->isDone(); it->next())   {   checksum2 = checksum2 + it->item().value;  }
+        }
+
+        // We check that we got the same checksum
+        cout << "checksum1=" << checksum1 << endl;
+        cout << "checksum2=" << checksum1 << endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer11.cpp b/gatb-core/examples/kmer/kmer11.cpp
new file mode 100644
index 0000000..926220f
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer11.cpp
@@ -0,0 +1,158 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                       Solid partitions statistics                            */
+/*                                                                              */
+/* This snippet computes statistics about the solid kmers of each partition     */
+/* generated by the sorting count algorithm.                                    */
+/*                                                                              */
+/* Cmd-line: kmer11 -in <fasta/q file>                                           */
+/*                                                                              */
+/* Sample: kmer11 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser.
+    OptionsParser parser ("SortingCount");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,  "sorting count input", true));
+    parser.push_back (new OptionOneParam (STR_URI_OUTPUT, "distrib output",      false));
+    parser.push_back (new OptionOneParam (STR_NB_CORES,   "number of cores",     false, "0"));
+
+    try
+    {
+        // Shortcuts.
+        typedef Kmer<>::Count           Count;
+        typedef Kmer<>::Type            Type;
+        typedef Kmer<>::ModelCanonical              ModelCanon;
+        typedef Kmer<>::ModelMinimizer<ModelCanon>  Model;
+
+        // We parse the user options.
+        IProperties* options = parser.parse (argc, argv);
+
+        // We load the object storing the couples [kmer,abundance]
+        Storage* storage = StorageFactory(STORAGE_HDF5).load (options->getStr(STR_URI_INPUT));   LOCAL (storage);
+
+        // We get the group inside the storage object
+        Group& dskGroup = storage->getGroup("dsk");
+
+        // We retrieve the partition holding the couples [kmer,abundance]
+        Partition<Count>& solidKmers = dskGroup.getPartition<Count> ("solid");
+
+        // We retrieve the repartitor hash function
+        Repartitor repart;
+        repart.load (storage->getGroup("minimizers"));
+
+        // We get the kmer size
+        size_t kmerSize = atol (storage->root().getProperty("kmer_size").c_str());
+
+        // We get a minimizer model
+        Model model (kmerSize, 8, typename Kmer<>::ComparatorMinimizerFrequencyOrLex(), repart.getMinimizerFrequencies());
+
+        // We create the output file
+        string outputUri = options->get(STR_URI_OUTPUT) ?
+            options->getStr(STR_URI_OUTPUT) :
+            System::file().getBaseName(options->getStr(STR_URI_INPUT)) + ".distrib";
+
+        FILE* outputFile = fopen (outputUri.c_str(), "w");
+        if (outputFile == 0)  { throw Exception ("unable to open output file"); }
+
+        fprintf (outputFile, "#   id   inLocal   inBound     total   %%local  \n");
+
+        // A little bit of parallelization won't hurt
+        Dispatcher dispatcher (options->getInt(STR_NB_CORES));
+
+        Range<size_t> range(0, solidKmers.size()-1);
+
+        typedef vector<int> Distrib;
+
+        struct Data
+        {
+            size_t nbIn;
+            size_t nbOut;
+            Distrib distrib;
+            Distrib neigbhorParts;
+            Data (size_t nbSolids) : nbIn(0), nbOut(0), distrib(9), neigbhorParts(nbSolids) {}
+        };
+
+        // We customize the progress bar width
+        StringLine::setDefaultWidth(8);
+
+        // we read the couples [kmer,abundance] with an iterator over each collection of the partition
+        ProgressIterator<size_t> itPart (range);
+        for (itPart.first(); !itPart.isDone(); itPart.next())
+        {
+            // Shortcut
+            size_t currentPart = itPart.item();
+
+            ThreadObject<Data>  data (solidKmers.size());
+
+            // We iterate the current collection inside the partition
+            dispatcher.iterate (solidKmers[currentPart].iterator(),  [&]  (const Count& count)
+            {
+                Data& d = data();
+
+                set<int> match;
+
+                // We iterate the neighbors of the current kmer
+                model.iterateNeighbors (count.value, [&] (const Type& neighbor)
+                {
+                    // We get the minimizer value of the current kmer.
+                    u_int64_t mini = model.getMinimizerValue(neighbor);
+
+                    // We get the partition index of the neighbor from its minimizer value and the minimizer repartition table.
+                    u_int64_t neighborPart = repart (mini);
+
+                    // We look whether or not the neighbor is in the same partition as the current one
+                    if (neighborPart != currentPart)  {  match.insert (neighborPart);   d.neigbhorParts[neighborPart]++;  }
+                });
+
+                d.distrib [match.size()] ++;
+
+                if (match.size()==0)    { d.nbIn  ++; }
+                else                    { d.nbOut ++; }
+            });
+
+            for (size_t i=0; i<data->distrib.size();       i++)  { (data->distrib)[i]       = 0; }
+            for (size_t i=0; i<data->neigbhorParts.size(); i++)  { (data->neigbhorParts)[i] = 0; }
+
+            data.foreach ([&] (Data& local)
+            {
+                data->nbIn   += local.nbIn;
+                data->nbOut  += local.nbOut;
+
+                for (size_t i=0; i<data->distrib.size();       i++)  { (data->distrib)[i]       += local.distrib[i];        }
+                for (size_t i=0; i<data->neigbhorParts.size(); i++)  { (data->neigbhorParts)[i] += local.neigbhorParts[i];  }
+            });
+
+            fprintf (outputFile, "%6ld  %8ld  %8ld  %8ld  %7.2f ",
+                currentPart ,
+                data->nbIn,
+                data->nbOut,
+                (data->nbIn+data->nbOut),
+                100.0 * (double)data->nbIn / (double)(data->nbIn+data->nbOut)
+            );
+
+            for (size_t i=0; i<9; i++)  { fprintf(outputFile, "%8d ", (data->distrib)[i]);  }   fprintf (outputFile, "\n");
+        }
+
+        fclose (outputFile);
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
+
+
diff --git a/gatb-core/examples/kmer/kmer12.cpp b/gatb-core/examples/kmer/kmer12.cpp
new file mode 100644
index 0000000..45bacdf
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer12.cpp
@@ -0,0 +1,179 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <numeric>
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet shows how to count the common kmers between several input banks */
+/*                                                                              */
+/* It shows how to inherit from the CountProcessor class, i.e. the class that   */
+/* receives kmer counts notifications from the SortingCountAlgorithm.           */
+/*                                                                              */
+/* Cmd-line: kmer12 -in <fasta/q file_1>[,<fasta/q file_2>,...]                 */
+/*                                                                              */
+/* Sample: kmer12 -in gatb-core/gatb-core/test/db/reads1.fa,gatb-core/gatb-core/test/db/reads2.fa  */
+/*                                                                              */
+/********************************************************************************/
+
+// We define our own CountProcessor class. Here, we want to count the number of
+// common kmers between each pair of input banks.
+//
+// We refines the 'process' method : from the vector of counts (one count per bank)
+// for the current kmer, we check for all possible pairs that the two counts are greater
+// than some threshold. In such a case, we increment the number of common kmers for
+// the current pair.
+//
+// If we have N input banks, we will have N.(N+1)/2 possible pairs. For storing the number
+// of common kmers for each pair, we use a vector of size N.(N+1)/2 and use a 'diagonal'
+// representation with the 'offset' method. For instance, for N=4, we have:
+//      0   4   7   9
+//          1   5   8       Here, row and column are the indexes of the banks.
+//              2   6       For instance, offset(1,2)=5
+//                  3       The main diagonal corresponds to the number of kmers in each bank
+//
+// At the end of the sorting count, one can get the number of common kmers between the
+// ith and jth banks with the method 'getCount(i,j)'
+//
+template<size_t span>
+class CountProcessorCustom : public CountProcessorAbstract<span>
+{
+public:
+
+    // Constructor.
+    CountProcessorCustom (size_t nbBanks, const CountRange& range)  : _nbBanks(nbBanks), _range(range)
+    {
+        // We configure the vector for the N.(N+1)/2 possible pairs
+        _countTotal.resize (_nbBanks*(_nbBanks+1)/2);
+    }
+
+    // Destructor
+    virtual ~CountProcessorCustom () {}
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    // We need to implement the cloning method for our custom count processor
+    CountProcessorAbstract<span>* clone ()  {  return new CountProcessorCustom (_nbBanks, _range);  }
+
+    // When several cloned CountProcessor instances have finished to process their partition,
+    // we need to update the main CountProcessor instance with the collected information from the clones.
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            /** We have to recover type information. */
+            if (CountProcessorCustom* clone = dynamic_cast<CountProcessorCustom*> (clones[i]))
+            {
+                for (size_t i=0; i<this->_countTotal.size(); i++)  { this->_countTotal[i] += clone->_countTotal[i];  }
+            }
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    // We refine the 'process' method
+    virtual bool process (size_t partId, const typename Kmer<span>::Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        // We try each possible pair (i,j) through the 'i' and 'j' loops
+        for (size_t i=0; i<count.size(); i++)
+        {
+            if (_range.includes(count[i]) == true)
+            {
+                for (size_t j=i; j<count.size(); j++)
+                {
+                    if (_range.includes(count[j]) == true)
+                    {
+                        // Both 'i' and 'j' banks hold the current kmer with an abundance in the correct range
+                        // so we increase the number of common kmers for this pair (i,j)
+                        _countTotal [offset(i,j)] ++;
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    // We can return the total number of common kmers in each pair of banks
+    u_int64_t getNbItems ()  {  return std::accumulate (_countTotal.begin(), _countTotal.end(), 0);  }
+
+    // After execution, this method returns the number of common kmers between banks 'i' and 'j'
+    size_t getCount (size_t i, size_t j) const { return _countTotal[offset(i,j)]; }
+
+protected:
+
+    // Get a unique integer from the pair (i,j)
+    size_t offset (size_t i, size_t j) const { return _nbBanks*(j-i) - ((j-i)*((j-i)-1))/2 + i; }
+
+private:
+
+    size_t         _nbBanks;
+    vector<size_t> _countTotal;
+    CountRange     _range;
+};
+
+/********************************************************************************/
+
+template<size_t span>  struct MainLoop  {  void operator () (IProperties* options)
+{
+    // We get the min abundance threshold
+    size_t nks = options->getInt(STR_KMER_ABUNDANCE_MIN);
+
+    // We get the number of input banks.
+    // For instance, if the uri is "file1.fa,file2.fa", this number will be 2
+    size_t nbSources = Bank::getCompositionNb (options->getStr(STR_URI_INPUT));
+
+    // We create a SortingCountAlgorithm instance.
+    SortingCountAlgorithm<span> algo (options);
+
+    // We create a custom count processor and give it to the sorting count algorithm
+    CountProcessorCustom<span>* processor = new CountProcessorCustom<span> (nbSources, CountRange(nks,1<<30));
+    algo.addProcessor(processor);
+
+    // We launch the algorithm
+    algo.execute();
+
+    // We first dump the number of kmers in each bank.
+    printf ("\n");
+    for (size_t i=0; i<nbSources; i++)  {  printf ("[%2d] %9d \n", i, processor->getCount(i,i));  }
+    printf ("\n");
+
+    // We dump statistics about each pair (i,j)
+    for (size_t i=0; i<nbSources; i++)
+    {
+        for (size_t j=i+1; j<nbSources; j++)
+        {
+            printf ("[%2d,%2d] %9d  %5.1f  %5.1f \n", i, j,
+                processor->getCount(i,j),
+                100.0*(double)processor->getCount(i,j) / (double) processor->getCount(i,i),
+                100.0*(double)processor->getCount(i,j) / (double) processor->getCount(j,j)
+            );
+        }
+    }
+}};
+
+/********************************************************************************/
+/*                              main function                                   */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser for the sorting count algorithm
+    IOptionsParser* parser = SortingCountAlgorithm<>::getOptionsParser ();
+
+    parser->push_back (new OptionOneParam (STR_NB_CORES, "nb cores",  false, "0"));
+    parser->push_back (new OptionOneParam (STR_VERBOSE,  "verbosity", false, "1"));
+
+    // We launch our functor
+    return Algorithm::mainloop <MainLoop> (parser, argc, argv);
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer13.cpp b/gatb-core/examples/kmer/kmer13.cpp
new file mode 100644
index 0000000..f772be8
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer13.cpp
@@ -0,0 +1,149 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet shows how to count the common kmers between several input banks */
+/*                                                                              */
+/* It shows how to inherit from the CountProcessor class, i.e. the class that   */
+/* receives kmer counts notifications from the SortingCountAlgorithm.           */
+/*                                                                              */
+/* Cmd-line: kmer13 -in <fasta/q file_1>[,<fasta/q file_2>,...]                 */
+/*                                                                              */
+/* Sample: kmer13 -in gatb-core/gatb-core/test/db/reads1.fa,gatb-core/gatb-core/test/db/reads2.fa  */
+/*                                                                              */
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorCustom : public CountProcessorAbstract<span>
+{
+public:
+
+    // Constructor.
+    CountProcessorCustom (
+        const vector <CountProcessorHistogram<span>* >& histogramProcessors,
+        Partition < HDF5Pair<NativeInt64> >& values
+    )
+        : _histogramProcessors(histogramProcessors), _values (values) {}
+
+    // Destructor
+    virtual ~CountProcessorCustom ()
+    {
+        for (size_t i=0; i<_histogramProcessors.size(); i++)  {  delete _histogramProcessors[i];  }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    // End of the algorithm : we 'end' each histogram
+    void end ()   {  for (size_t i=0; i<_histogramProcessors.size(); i++)  {  _histogramProcessors[i]->end();  }  }
+
+    // We need to implement the cloning method for our custom count processor
+    CountProcessorAbstract<span>* clone ()
+    {
+        // We clone each CountProcessorHistogram
+        vector <CountProcessorHistogram<span>* > clones;
+        for (size_t i=0; i<_histogramProcessors.size(); i++)  {  clones.push_back ((CountProcessorHistogram<span>*)_histogramProcessors[i]->clone());  }
+
+        // We return an instance of our custom processor with the CountProcessorHistogram clones
+        return new CountProcessorCustom (clones, _values);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    // At the end of one partition processing, we get some stats on the N cloned histograms
+    void endPart (size_t passId, size_t partId)
+    {
+        int min_auto_threshold = 3;
+
+        for (size_t i=0; i<_histogramProcessors.size(); i++)
+        {
+            IHistogram* histo = _histogramProcessors[i]->getHistogram();
+
+            // We compute the threshold
+            histo->compute_threshold (min_auto_threshold);
+
+            // We insert the computed solid cutoff and first peak values into the current ith partition
+            HDF5Pair<NativeInt64> p (histo->get_solid_cutoff(), histo->get_first_peak());
+            _values[i].insert (p);
+        }
+    }
+
+    // We forward the information to each clone histogram
+    virtual bool process (size_t partId, const typename Kmer<span>::Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        // Note that we provide the 'sum' argument as being the count of the ith bank
+        for (size_t i=0; i<_histogramProcessors.size(); i++)  {  _histogramProcessors[i]->process (partId, kmer, count, count[i]);  }
+        return true;
+    }
+
+protected:
+
+    vector <CountProcessorHistogram<span>* > _histogramProcessors;
+
+    Partition<HDF5Pair<NativeInt64> >& _values;
+};
+
+/********************************************************************************/
+
+template<size_t span>  struct MainLoop  {  void operator () (IProperties* options)
+{
+    // We create a SortingCountAlgorithm instance.
+    SortingCountAlgorithm<span> algo (options);
+
+    // We get the number of input banks. For instance, if the uri is "file1.fa,file2.fa", this number will be 2
+    size_t nbSources = Bank::getCompositionNb (options->getStr(STR_URI_INPUT));
+
+    // We create a storage for histograms.
+    Storage* histogramStorage = StorageFactory(STORAGE_HDF5).create("histograms", true, false);
+    LOCAL (histogramStorage);
+
+    Group&  histoGroup = histogramStorage->getGroup("histograms");
+
+    // We create a vector of histogram processors, one for each bank
+    vector <CountProcessorHistogram<span>* > histogramProcessors;
+    for (size_t i=0; i<nbSources; i++)
+    {
+        histogramProcessors.push_back (new CountProcessorHistogram<span> (& histoGroup.getGroup(Stringify::format("%d", i))));
+    }
+
+    // We create a custom count processor that encapsulates N CountProcessorHistogram instances
+    ICountProcessor<span>* processor = new CountProcessorCustom<span> (
+        histogramProcessors,
+        histogramStorage->root().getPartition<HDF5Pair<NativeInt64> >("values", nbSources)
+    );
+
+    // We configure the sorting count algorithm with this custom processor instance
+    algo.addProcessor (processor);
+
+    // We launch the SortingCountAlgorithm instance
+    algo.execute();
+
+    // We dump some information
+    cout << algo.getConfig().getProperties() << endl;
+
+    // We dump some information collected by each CountProcessorHistogram
+    for (size_t i=0; i<histogramProcessors.size(); i++)
+    {
+        cout << histogramProcessors[i]->getProperties() << endl;
+    }
+
+    // It is now possible to dump the successive estimations of cutoff and first peak for the Xth bank  (ie replace X by an integer) :
+    //  h5dump -y -d values/X histograms.h5 | grep [0-9] | grep -v [A-Z].* | paste - -
+}};
+
+/********************************************************************************/
+/*                              main function                                   */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We launch our functor
+    return Algorithm::mainloop <MainLoop> (SortingCountAlgorithm<>::getOptionsParser(), argc, argv);
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer14.cpp b/gatb-core/examples/kmer/kmer14.cpp
new file mode 100644
index 0000000..533e4dc
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer14.cpp
@@ -0,0 +1,169 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <numeric>
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet counts specific kmers (core and bound) for each solid partition */
+/*                                                                              */
+/* a core kmer  := all its 8 neighbors are in the same partition                */
+/* a bound kmer := a kmer that is not core.                                     */
+/*                                                                              */
+/* Cmd-line: kmer14 -in <fasta/q file_1>                                        */
+/*                                                                              */
+/* Sample: kmer14 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorCustom : public CountProcessorAbstract<span>
+{
+public:
+
+    typedef Kmer<>::Type                        Type;
+    typedef Kmer<>::ModelCanonical              ModelCanon;
+    typedef Kmer<>::ModelMinimizer<ModelCanon>  Model;
+
+    // Constructor for the prototype instance
+    CountProcessorCustom (SortingCountAlgorithm<span>* algo)
+        : _algo(algo), _repart(0), _model(0), _nbKmersCore(0), _nbKmersBound(0)
+    {
+    }
+
+    // Constructor for the clone instance
+    CountProcessorCustom (Repartitor* repart, Model* model)
+        : _algo(0), _repart(0), _model(0), _nbKmersCore(0), _nbKmersBound(0)
+    {
+        setRepart (repart);
+        setModel  (model);
+    }
+
+    // Destructor
+    virtual ~CountProcessorCustom ()
+    {
+        setRepart (0);
+        setModel  (0);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    // We need to implement the cloning method for our custom count processor
+    CountProcessorAbstract<span>* clone ()  {  return new CountProcessorCustom (_repart, _model);  }
+
+    //
+    void begin (const Configuration& config)
+    {
+        setRepart (_algo->getRepartitor());
+        setModel  (new Model (config._kmerSize, config._minim_size));
+    }
+
+    //
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            if (CountProcessorCustom* clone = dynamic_cast<CountProcessorCustom*> (clones[i]))
+            {
+                _nbKmersCore  += clone->_nbKmersCore;
+                _nbKmersBound += clone->_nbKmersBound;
+            }
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    // We refine the 'process' method
+    virtual bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        bool inCore = true;
+
+        // We iterate the neighbors of the current kmer
+        _model->iterateNeighbors (kmer, [&] (const Type& neighbor)
+        {
+            // We get the minimizer value of the current kmer.
+            u_int64_t mini = _model->getMinimizerValue(neighbor);
+
+            // We get the partition index of the neighbor from its minimizer value and the minimizer repartition table.
+            u_int64_t neighborPart = (*_repart) (mini);
+
+            // We look whether or not the neighbor is in the same partition as the current one
+            if (neighborPart != partId)  { inCore = false; }
+        });
+
+        if (inCore)  { _nbKmersCore++;  }
+        else         { _nbKmersBound++; }
+
+        return true;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    Properties getProperties() const
+    {
+        double total = _nbKmersCore + _nbKmersBound;
+
+        Properties result;
+        result.add (0, "result");
+        result.add (1, "total", "%9ld", _nbKmersCore + _nbKmersBound);
+        result.add (2, "core",  "%9ld  %5.1f ", _nbKmersCore,  100.0*(double)_nbKmersCore  / total);
+        result.add (2, "bound", "%9ld  %5.1f ", _nbKmersBound, 100.0*(double)_nbKmersBound / total);
+        return result;
+    }
+
+private:
+
+    SortingCountAlgorithm<span>* _algo;
+
+    Repartitor* _repart;
+    void setRepart (Repartitor* repart)  { SP_SETATTR(repart); }
+
+    Model*      _model;
+    void setModel (Model* model) { SP_SETATTR(model); }
+
+    u_int64_t _nbKmersCore;
+    u_int64_t _nbKmersBound;
+};
+
+/********************************************************************************/
+
+template<size_t span>  struct MainLoop  {  void operator () (IProperties* options)
+{
+    // We create a SortingCountAlgorithm instance.
+    SortingCountAlgorithm<span> algo (options);
+
+    // We create a custom count processor and give it to the sorting count algorithm
+    CountProcessorCustom<span>* processor = new CountProcessorCustom<span> (&algo);
+    algo.addProcessor(processor);
+
+    // We launch the algorithm
+    algo.execute();
+
+    // We dump statistics
+    cout << processor->getProperties() << endl;
+}};
+
+/********************************************************************************/
+/*                              main function                                   */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser for the sorting count algorithm
+    IOptionsParser* parser = SortingCountAlgorithm<>::getOptionsParser ();
+
+    parser->push_back (new OptionOneParam (STR_NB_CORES, "nb cores",  false, "0"));
+    parser->push_back (new OptionOneParam (STR_VERBOSE,  "verbosity", false, "1"));
+
+    // We launch our functor
+    return Algorithm::mainloop <MainLoop> (parser, argc, argv);
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer15.cpp b/gatb-core/examples/kmer/kmer15.cpp
new file mode 100644
index 0000000..34a2c3e
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer15.cpp
@@ -0,0 +1,190 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <numeric>
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet counts specific kmers (core and bound) for each solid partition */
+/*                                                                              */
+/* a core kmer  := all its 8 neighbors are in the same partition                */
+/* a bound kmer := a kmer that is not core.                                     */
+/*                                                                              */
+/* Cmd-line: kmer15 -in <fasta/q file_1>                                        */
+/*                                                                              */
+/* Sample: kmer15 -in gatb-core/gatb-core/test/db/reads1.fa                     */
+/*                                                                              */
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorCustom : public CountProcessorAbstract<span>
+{
+public:
+
+    typedef Kmer<>::Type                        Type;
+    typedef Kmer<>::ModelCanonical              ModelCanon;
+    typedef Kmer<>::ModelMinimizer<ModelCanon>  Model;
+
+    // Constructor for the prototype instance
+    CountProcessorCustom (SortingCountAlgorithm<span>* algo)
+        : _algo(algo), _repart(0), _model(0),_nbIsolated(0)
+    {
+    }
+
+    // Constructor for the clone instance
+    CountProcessorCustom (Repartitor* repart, Model* model)
+        : _algo(0), _repart(0), _model(0), _nbIsolated(0)
+    {
+        setRepart (repart);
+        setModel  (model);
+    }
+
+    // Destructor
+    virtual ~CountProcessorCustom ()
+    {
+        setRepart (0);
+        setModel  (0);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    // We need to implement the cloning method for our custom count processor
+    CountProcessorAbstract<span>* clone ()  {  return new CountProcessorCustom (_repart, _model);  }
+
+    //
+    void begin (const Configuration& config)
+    {
+        setRepart (_algo->getRepartitor());
+        setModel  (new Model (config._kmerSize, config._minim_size));
+    }
+
+    void end ()
+    {
+        printf ("FINAL : nbIsolated = %ld\n", _nbIsolated);
+    }
+
+    //
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            if (CountProcessorCustom* clone = dynamic_cast<CountProcessorCustom*> (clones[i]))
+            {
+                _nbIsolated += clone->_nbIsolated;
+            }
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    // We refine the 'process' method
+    virtual bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum)
+    {
+if (count[0] < 3)  { return false; }
+
+        bool inCore = true;
+
+        // We iterate the neighbors of the current kmer
+        _model->iterateNeighbors (kmer, [&] (const Type& neighbor)
+        {
+            // We get the minimizer value of the current kmer.
+            u_int64_t mini = _model->getMinimizerValue(neighbor);
+
+            // We get the partition index of the neighbor from its minimizer value and the minimizer repartition table.
+            u_int64_t neighborPart = (*_repart) (mini);
+
+            // We look whether or not the neighbor is in the same partition as the current one
+            if (neighborPart != partId)  { inCore = false; }
+        });
+
+        if (inCore)  { _core.insert  (kmer);  }
+        else         { _bound.insert (kmer);  }
+
+        return true;
+    }
+
+    void endPart (size_t passId, size_t partId)
+    {
+        for (set<Type>::iterator itCore = _core.begin(); itCore != _core.end(); ++itCore)
+        {
+            size_t nbNeighbors = 0;
+
+            // We iterate the neighbors of the current kmer
+            _model->iterateNeighbors (*itCore, [&] (const Type& neighbor)
+            {
+                if (_core.find(neighbor) != _core.end())
+                {
+                    nbNeighbors ++;
+                }
+                else if (_bound.find(neighbor) != _bound.end())
+                {
+                    nbNeighbors ++;
+                }
+            });
+
+            if (nbNeighbors == 0)  { _nbIsolated++; }
+        }
+    }
+
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+private:
+
+    SortingCountAlgorithm<span>* _algo;
+
+    Repartitor* _repart;
+    void setRepart (Repartitor* repart)  { SP_SETATTR(repart); }
+
+    Model*      _model;
+    void setModel (Model* model) { SP_SETATTR(model); }
+
+    set<Type> _core;
+    set<Type> _bound;
+
+    u_int64_t _nbIsolated;
+};
+
+/********************************************************************************/
+
+template<size_t span>  struct MainLoop  {  void operator () (IProperties* options)
+{
+    // We create a SortingCountAlgorithm instance.
+    SortingCountAlgorithm<span> algo (options);
+
+    // We create a custom count processor and give it to the sorting count algorithm
+    CountProcessorCustom<span>* processor = new CountProcessorCustom<span> (&algo);
+    algo.addProcessor(processor);
+
+    // We launch the algorithm
+    algo.execute();
+
+//    double total = processor->getNbKmersTotal();
+//    printf ("total : %9ld\n", processor->getNbKmersTotal());
+//    printf ("core  : %9ld  %5.1f \n", processor->getNbKmersCore(),  100.0 * (double) processor->getNbKmersCore()  / total);
+//    printf ("bound : %9ld  %5.1f \n", processor->getNbKmersBound(), 100.0 * (double) processor->getNbKmersBound() / total);
+}};
+
+/********************************************************************************/
+/*                              main function                                   */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser for the sorting count algorithm
+    IOptionsParser* parser = SortingCountAlgorithm<>::getOptionsParser ();
+
+    parser->push_back (new OptionOneParam (STR_NB_CORES, "nb cores",  false, "0"));
+    parser->push_back (new OptionOneParam (STR_VERBOSE,  "verbosity", false, "1"));
+
+    // We launch our functor
+    return Algorithm::mainloop <MainLoop> (parser, argc, argv);
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer16.cpp b/gatb-core/examples/kmer/kmer16.cpp
new file mode 100644
index 0000000..db426ca
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer16.cpp
@@ -0,0 +1,77 @@
+/* 
+ * given N datasets
+ * outputs a matrix containing the following information:
+ *
+ * [kmer] [abundance in dataset 1] [abundance in dataset 2] etc..
+ *
+ * for all input kmers in the union of the datasets
+ *
+ * Cmd-line: kmer16 -in <fasta/q file_1>
+ *
+ * Sample: kmer16 -in gatb-core/gatb-core/test/db/reads1.fa
+ *
+ */
+#include <gatb/gatb_core.hpp>
+using namespace std;
+
+/********************************************************************************/
+template<size_t span>
+class CountProcessorCustom : public CountProcessorAbstract<span>
+{
+public:
+
+    // We need the kmer size to dump kmers values as nucl strings
+    CountProcessorCustom (size_t kmerSize, ISynchronizer* synchro) : kmerSize(kmerSize), synchro(synchro) {}
+
+    virtual ~CountProcessorCustom () {}
+
+    CountProcessorAbstract<span>* clone ()  { return new CountProcessorCustom<span>(kmerSize, synchro); }
+
+    virtual bool process (size_t partId, const typename Kmer<span>::Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        // get a mutex
+        LocalSynchronizer sync (synchro);
+        // output kmer and counts
+        cout << kmer.toString(kmerSize) << " ";
+        for (size_t i=0; i<count.size(); i++)  {  cout << count[i] << " ";  }
+        cout  << endl;
+        return true;
+    }
+
+private:
+    size_t kmerSize;
+    ISynchronizer *synchro;
+};
+
+/********************************************************************************/
+template<size_t span>  struct MainLoop  {  void operator () (IProperties* options)
+{
+    // We force the solidity kind (otherwise default value "sum" will consider N banks as a single one)
+    options->setStr(STR_SOLIDITY_KIND, "all");
+
+    // We create a SortingCountAlgorithm instance.
+    SortingCountAlgorithm<span> algo (options);
+
+    // global synchronization
+    ISynchronizer* synchro = System::thread().newSynchronizer();
+
+    // We create a custom count processor and give it to the sorting count algorithm
+    algo.addProcessor (new CountProcessorCustom<span> (options->getInt(STR_KMER_SIZE), synchro));
+
+    // We launch the algorithm
+    algo.execute();
+}};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser for the sorting count algorithm
+    IOptionsParser* parser = SortingCountAlgorithm<>::getOptionsParser ();
+    parser->push_back (new OptionOneParam (STR_NB_CORES, "nb cores",  false, "1"));
+    parser->push_back (new OptionOneParam (STR_VERBOSE,  "verbosity", false, "1"));
+
+    // We launch our functor
+    return Algorithm::mainloop <MainLoop> (parser, argc, argv);
+}
+
+
diff --git a/gatb-core/examples/kmer/kmer17.cpp b/gatb-core/examples/kmer/kmer17.cpp
new file mode 100644
index 0000000..04c7769
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer17.cpp
@@ -0,0 +1,146 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <fstream>
+#include <string.h>
+
+/********************************************************************************/
+/*                              Minimizers                                      */
+/*                                                                              */
+/* This snippet computes the total number of minimizers with a parallel implem  */
+/*          with the use of the dispatcher                                      */
+/*                                                                              */
+/* Cmd-line: kmer17 -in <fasta/q file> -kmer-size <value> ...                   */
+/*                  -minimizer-size <size>                                      */
+/*                                                                              */
+/* Sample: kmer17 -in gatb-core/gatb-core/test/db/reads1.fa -kmer-size 11 ...   */
+/*               -minimizer-size 11                                             */
+/*                                                                              */
+/********************************************************************************/
+
+// We use the required packages
+using namespace std;
+
+/** Kmer span definition. */
+const size_t span = KMER_SPAN(0);
+
+/** Some shortcuts. */
+typedef Kmer<span>::ModelDirect    ModelDirect;
+typedef Kmer<span>::ModelCanonical    ModelCanonical;
+
+//typedef Kmer<span>::ModelMinimizer<ModelDirect> ModelMinimizer;
+typedef Kmer<span>::ModelMinimizer<ModelCanonical> ModelMinimizer;
+
+class seqProcessor
+{
+public:
+	seqProcessor(int kmerSize,int mmerSize,u_int64_t * nb_kmers_global,u_int64_t * nb_minim_global) : _nb_kmers_global(nb_kmers_global), _nb_minim_global(nb_minim_global), _kmerSize(kmerSize), _mmerSize(mmerSize)
+	{
+		// We declare a kmer model and a minimizer model
+		_nb_minim_total=0;
+		_nb_kmers_total=0;
+		_model = new ModelMinimizer(_kmerSize, _mmerSize);
+	}
+	
+	seqProcessor(seqProcessor const& ref)
+	{
+		_nb_minim_total=0;
+		_nb_kmers_total=0;
+		_nb_minim_global=ref._nb_minim_global;
+		_nb_kmers_global=ref._nb_kmers_global;
+		_mmerSize=ref._mmerSize;
+		_kmerSize=ref._kmerSize;
+		
+		_model = new ModelMinimizer(_kmerSize, _mmerSize);
+	}
+	
+	void operator() (Sequence& seq)
+	{
+		
+		// We iterate the kmers (and minimizers) of the current sequence.
+		_model->iterate (seq.getData(), [&] (const ModelMinimizer::Kmer& kmer, size_t idx)
+						 {
+							 
+							 // We may have to update the number of different minimizer in the current sequence
+							 if (kmer.hasChanged()==true)  {  _nb_minim_total++ ;   }
+							 
+							 _nb_kmers_total ++;
+						 });
+	}
+	
+	// increment the global counter in a thread safe way in the destructor
+	~seqProcessor()
+	{
+		__sync_fetch_and_add(_nb_kmers_global,_nb_kmers_total);
+		__sync_fetch_and_add(_nb_minim_global,_nb_minim_total);
+	}
+	
+private:
+	ModelMinimizer *_model;
+	u_int64_t _nb_minim_total;
+	u_int64_t * _nb_kmers_global;
+	u_int64_t * _nb_minim_global;
+	int _kmerSize, _mmerSize;
+	
+	u_int64_t _nb_kmers_total;
+};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+	static const char* STR_BATCH_SIZE = "-batch";
+	
+	/** We create a command line parser. */
+	OptionsParser parser ("KmerTest");
+	parser.push_back (new OptionOneParam (STR_URI_INPUT,      "bank input",     true));
+	parser.push_back (new OptionOneParam (STR_KMER_SIZE,      "kmer size",      true));
+	parser.push_back (new OptionOneParam (STR_MINIMIZER_SIZE, "minimizer size", true));
+	parser.push_back (new OptionOneParam (STR_NB_CORES,   "number of cores",     false, "0"));
+	parser.push_back (new OptionOneParam (STR_BATCH_SIZE,   "batch size",     false, "1000"));
+	
+	try
+	{
+		/** We parse the user options. */
+		IProperties* options = parser.parse (argc, argv);
+		
+		int nbcores = options->getInt(STR_NB_CORES);
+		int batch_size = options->getInt(STR_BATCH_SIZE);
+		
+		IDispatcher* _dispatcher  = new Dispatcher (nbcores);
+		
+		string bankFilename = options->getStr(STR_URI_INPUT);
+		
+		// We get the kmer and minimizer sizes.
+		size_t kmerSize = options->getInt(STR_KMER_SIZE);
+		size_t mmerSize = options->getInt(STR_MINIMIZER_SIZE);
+		
+		u_int64_t nbKmers       = 0;
+		u_int64_t nbMinimizers  = 0;
+		
+		// We declare a bank instance defined by a list of filenames
+		IBank* bank = Bank::open (bankFilename);
+		
+		// We create an iterator over this bank.
+		ProgressIterator<Sequence> itSeq (*bank);
+		
+		_dispatcher->iterate(itSeq,seqProcessor(kmerSize,mmerSize,&nbKmers,&nbMinimizers),batch_size);
+		
+		printf("nb cores %i batch size %i \n",nbcores,batch_size);
+		printf("nb minimizer total : %llu\n",nbMinimizers);
+		printf("nb kmers total : %llu\n",nbKmers);
+		
+	}
+	
+	catch (OptionFailure& e)
+	{
+		return e.displayErrors (std::cout);
+	}
+	catch (Exception& e)
+	{
+		std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+	}
+	
+	return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer2.cpp b/gatb-core/examples/kmer/kmer2.cpp
new file mode 100644
index 0000000..b179f9f
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer2.cpp
@@ -0,0 +1,130 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                              Kmer management                                 */
+/*                                                                              */
+/* This snippet shows how to get kmer information from a raw ascii sequence.    */
+/*                                                                              */
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+#define KSIZE_32 (KSIZE_LIST == 32)                                                                                                                                                                               
+        std::cout << "this example cannot be run when gatb-core is compiled for kmers <= 32" << std::endl;
+#if KSIZE_32                                                                                                                                                                                                      
+#else  
+
+    // We set the maximal span of the kmers. We use here a constant of gatb-core
+    // that gives a default span for kmers up to the second kmer size value
+    const size_t span = KMER_SPAN(1);
+
+    // We define some nucleotides sequence.
+    const char* seq = argc<2 ? "CTACGAATT" : argv[1];
+
+    std::cout << std::endl << "INITIAL STRING IS '" << seq << "'" << std::endl;
+
+    // We set the kmer size as the length of our sequence.
+    size_t kmerSize = strlen(seq);
+
+    if (kmerSize >= span)
+    {
+        std::cerr << "STRING TOO BIG (" << kmerSize << "),  must be less than " << span << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    // Once we have defined our span, we define some typedefs
+    // Note : such definitions are not mandatory but provides better code readability
+    typedef Kmer<span>::ModelDirect                    ModelDirect;
+    typedef Kmer<span>::ModelCanonical                 ModelCanonical;
+    typedef Kmer<span>::ModelMinimizer<ModelCanonical> ModelMinimizer;
+
+    ////////////////////////////////////////////////////////////
+    // FIRST EXAMPLE : model direct
+    ////////////////////////////////////////////////////////////
+    {
+//! [snippet1_direct]
+        // We declare a kmer model with kmer size big enough to represent our sequence.
+        ModelDirect model (kmerSize);
+
+        // We compute the kmer for a given sequence
+        ModelDirect::Kmer kmer = model.codeSeed (seq, Data::ASCII);
+
+        std::cout << std::endl;
+        std::cout << "-------------------- DIRECT --------------------" << std::endl;
+        std::cout << "kmer  value is: " << kmer.value()                 << std::endl;
+        std::cout << "kmer string is: " << model.toString(kmer.value()) << std::endl;
+//! [snippet1_direct]
+    }
+
+    ////////////////////////////////////////////////////////////
+    // SECOND EXAMPLE : model canonical
+    ////////////////////////////////////////////////////////////
+    {
+//! [snippet1_canonical]
+        // We declare a kmer model with kmer size big enough to represent our sequence.
+        ModelCanonical model (kmerSize);
+
+        // We compute the kmer for a given sequence
+        ModelCanonical::Kmer kmer = model.codeSeed (seq, Data::ASCII);
+
+        std::cout << std::endl;
+        std::cout << "-------------------- CANONICAL --------------------" << std::endl;
+        std::cout << "kmer  value is: " << kmer.value()                    << std::endl;
+        std::cout << "kmer string is: " << model.toString(kmer.value())    << std::endl;
+
+        /** With this model, we have extra information. */
+        std::cout << "forward value  is: " << kmer.forward()                    << std::endl;
+        std::cout << "forward string is: " << model.toString(kmer.forward())    << std::endl;
+        std::cout << "revcomp value  is: " << kmer.revcomp()                    << std::endl;
+        std::cout << "revcomp string is: " << model.toString(kmer.revcomp())    << std::endl;
+        std::cout << "used strand is   : " << toString(kmer.strand())           << std::endl;
+
+
+//! [snippet1_canonical]
+    }
+
+    ////////////////////////////////////////////////////////////
+    // THIRD EXAMPLE : model minimizer
+    ////////////////////////////////////////////////////////////
+    {
+//! [snippet1_minimizer]
+        // We declare a kmer model with kmer size big enough to represent our sequence.
+        // Note that we give a second size, which is the size of the minimizers
+        ModelMinimizer model (kmerSize, 8);
+
+        // We get a reference on the minimizer model, which will be useful for dumping
+        // string value of a minimizer. Recall that 'model' is a model configured with
+        // 'kmerSize' but has also to deal with mmers of size kmerSize/2. The 'getMmersModel'
+        // method just provides access to this inner model.
+        const ModelCanonical& modelMinimizer = model.getMmersModel();
+
+        // We compute the kmer for a given sequence
+        ModelMinimizer::Kmer kmer = model.codeSeed (seq, Data::ASCII);
+
+        std::cout << std::endl;
+        std::cout << "-------------------- MINIMIZER --------------------" << std::endl;
+        std::cout << "kmer  value is: " << kmer.value()                    << std::endl;
+        std::cout << "kmer string is: " << model.toString(kmer.value())    << std::endl;
+
+        // With this model, we have extra information.
+        std::cout << "forward value  is: " << kmer.forward()                    << std::endl;
+        std::cout << "forward string is: " << model.toString(kmer.forward())    << std::endl;
+        std::cout << "revcomp value  is: " << kmer.revcomp()                    << std::endl;
+        std::cout << "revcomp string is: " << model.toString(kmer.revcomp())    << std::endl;
+        std::cout << "used strand is   : " << toString(kmer.strand())           << std::endl;
+
+        // We can also have information about minimizers.
+        // Note :  kmer.minimizer() is of type ModelCanonical, ie the type provided as
+        // template argument of the ModelMinimizer class.
+        std::cout << "minimizer model size       : " << modelMinimizer.getKmerSize() << std::endl;
+        std::cout << "minimizer value is         : " << kmer.minimizer().value()     << std::endl;
+        std::cout << "minimizer string is        : " << modelMinimizer.toString(kmer.minimizer().value()) << std::endl;
+        std::cout << "minimizer position in kmer : " << kmer.position()   << std::endl;
+        std::cout << "minimizer changed          : " << kmer.hasChanged() << std::endl;
+//! [snippet1_minimizer]
+    }
+#endif
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer3.cpp b/gatb-core/examples/kmer/kmer3.cpp
new file mode 100644
index 0000000..1809af1
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer3.cpp
@@ -0,0 +1,37 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                              Kmer management                                 */
+/*                                                                              */
+/* This snippet shows how to iterate the kmers of a given string.               */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We define a sequence of nucleotides
+    const char* seq = "CATTGATAGTGGATGGT";
+    std::cout << "Initial sequence: " << seq << std::endl;
+
+    // We configure a data object with a sequence (in ASCII format)
+    Data data ((char*)seq);
+
+    // We declare a kmer model with kmer of size 5.
+    // Note that we want "direct" kmers, not the min(forward,revcomp) default behavior.
+    Kmer<>::ModelDirect model (5);
+
+    // We declare an iterator on a given sequence.
+    Kmer<>::ModelDirect::Iterator it (model);
+
+    // We configure the iterator with our sequence
+    it.setData (data);
+
+    // We iterate the kmers.
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << "kmer " << model.toString(it->value()) << ",  value " << it->value() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer4.cpp b/gatb-core/examples/kmer/kmer4.cpp
new file mode 100644
index 0000000..b627a88
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer4.cpp
@@ -0,0 +1,87 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <string.h>
+
+// We use the required packages
+using namespace std;
+
+static const size_t span = KMER_SPAN(0);
+
+/********************************************************************************/
+/*                              Kmer management                                 */
+/*                                                                              */
+/* This snippet shows how to iterate the kmers of the sequences from a bank.    */
+/*                                                                              */
+/* Cmd-line: kmer4 -in <fasta/q file> -kmer-size <value> [-verbose]             */
+/*                                                                              */
+/* Sample: kmer4 -in gatb-core/gatb-core/test/db/reads1.fa -kmer-size 11        */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("KmerTest");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input",    true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE, "kmer size",     true));
+    parser.push_back (new OptionNoParam  (STR_VERBOSE,   "display kmers", false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We define the max size of a data line in the FASTA output file
+        size_t kmerSize = options->getInt(STR_KMER_SIZE);
+
+        bool verbose = options->get(STR_VERBOSE) != 0;
+
+        u_int64_t nbSequences = 0;
+        u_int64_t nbKmers     = 0;
+
+        // We open the input bank
+        IBank* bank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (bank);
+
+        // We declare a kmer model with a given span size.
+        Kmer<span>::ModelDirect model (kmerSize);
+
+        // We declare an iterator on a given sequence.
+        Kmer<span>::ModelDirect::Iterator itKmer (model);
+
+        // We create an iterator over this bank.
+        ProgressIterator<Sequence> itSeq (*bank);
+
+        // We loop over sequences.
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            // We set the data from which we want to extract kmers.
+            itKmer.setData (itSeq->getData());
+
+            // We iterate the kmers.
+            for (itKmer.first(); !itKmer.isDone(); itKmer.next())
+            {
+                if (verbose)  {  cout << model.toString (itKmer->value()) << endl;  }
+                nbKmers++;
+            }
+
+            //  We increase the sequences counter.
+            nbSequences++;
+        }
+
+        // We dump some information about the iterations
+        cout << "FOUND " << nbKmers << " kmers in " << nbSequences << " sequences" << endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer5.cpp b/gatb-core/examples/kmer/kmer5.cpp
new file mode 100644
index 0000000..cdb8397
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer5.cpp
@@ -0,0 +1,154 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <fstream>
+#include <string.h>
+
+/********************************************************************************/
+/*                              Minimizers                                      */
+/*                                                                              */
+/* This snippet shows how to iterate the kmers and have minimizer statistics.   */
+/*                                                                              */
+/* Cmd-line: kmer5 -in <fasta/q file> -kmer-size <value> ...                    */
+/*                  -minimizer-size <size>                                      */
+/*                                                                              */
+/* Sample: kmer5 -in gatb-core/gatb-core/test/db/reads1.fa -kmer-size 11 ...    */
+/*               -minimizer-size 11                                             */
+/*                                                                              */
+/********************************************************************************/
+
+// We use the required packages
+using namespace std;
+
+/** Kmer span definition. */
+const size_t span = KMER_SPAN(0);
+
+/** Some shortcuts. */
+typedef Kmer<span>::ModelDirect    ModelDirect;
+typedef Kmer<span>::ModelMinimizer<ModelDirect> ModelMinimizer;
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    static const char* STR_URI_DISTRIB = "-distrib";
+
+    /** We create a command line parser. */
+    OptionsParser parser ("KmerTest");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,      "bank input",     true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE,      "kmer size",      true));
+    parser.push_back (new OptionOneParam (STR_MINIMIZER_SIZE, "minimizer size", true));
+    parser.push_back (new OptionNoParam  (STR_URI_DISTRIB,    "compute distribution: number of times a read has X superkmers",  false));
+    parser.push_back (new OptionNoParam  (STR_VERBOSE,        "display kmers",  false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        string bankFilename = options->getStr(STR_URI_INPUT);
+
+        // We get the kmer and minimizer sizes.
+        size_t kmerSize = options->getInt(STR_KMER_SIZE);
+        size_t mmerSize = options->getInt(STR_MINIMIZER_SIZE);
+
+        // We define a try/catch block in case some method fails (bad filename for instance)
+        u_int64_t nbSequences   = 0;
+        u_int64_t nbKmers       = 0;
+        u_int64_t nbMinimizers  = 0;
+        u_int64_t nbMinimizers2 = 0;
+        bool display = options->get(STR_VERBOSE) != 0;
+
+        // We declare a bank instance defined by a list of filenames
+        IBank* bank = Bank::open (bankFilename);
+
+        // We declare a kmer model and a minimizer model
+        ModelMinimizer model (kmerSize, mmerSize);
+
+        // We get a reference on the minimizer model, which will be useful for dumping
+        const ModelDirect& modelMinimizer = model.getMmersModel();
+
+        // We compute a distribution : number of times a reads has X superkmers
+        map<size_t,size_t> distribSuperKmers;
+
+        // We create an iterator over this bank.
+        ProgressIterator<Sequence> itSeq (*bank);
+
+        // We loop over sequences.
+        for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+        {
+            size_t nbMinimizersPerRead = 0;
+
+            // We iterate the kmers (and minimizers) of the current sequence.
+            model.iterate (itSeq->getData(), [&] (const ModelMinimizer::Kmer& kmer, size_t idx)
+            {
+                // We could display some information about the kmer and its minimizer
+                if (display)
+                {
+                    std::cout << "KMER=" << model.toString(kmer.value()) << "  "
+                          << (kmer.hasChanged() ? "NEW" : "OLD") << " "
+                          << "MINIMIZER=" << modelMinimizer.toString(kmer.minimizer().value()) << " "
+                          << "at position " << kmer.position()
+                          << std::endl;
+                }
+
+                // We may have to update the number of different minimizer in the current sequence
+                if (kmer.hasChanged()==true)  {  nbMinimizersPerRead++;  }
+
+                nbKmers ++;
+            });
+
+            distribSuperKmers [nbMinimizersPerRead]++;
+
+            // We update global statistics
+            nbSequences   ++;
+            nbMinimizers  += nbMinimizersPerRead;
+            nbMinimizers2 += nbMinimizersPerRead*nbMinimizersPerRead;
+        }
+
+        double mean  = nbSequences>0 ? (double)nbMinimizers  / (double) nbSequences : 0;
+        double mean2 = nbSequences>0 ? (double)nbMinimizers2 / (double) nbSequences : 0;
+        double devia = sqrt (mean2 - mean*mean);
+
+        // We dump results
+        Properties info;
+        info.add (0, "info");
+        info.add (1, "bank",          "%s",   bankFilename.c_str());
+        info.add (1, "kmer_size",     "%ld",  kmerSize);
+        info.add (1, "mmer_size",     "%ld",  mmerSize);
+        info.add (1, "nb_sequences",  "%ld",  nbSequences);
+        info.add (1, "nb_kmers",      "%ld",  nbKmers);
+        info.add (1, "nb_minimizers", "%ld",  nbMinimizers);
+        info.add (1, "mean",          "%.2f", mean);
+        info.add (1, "deviation",     "%.2f", devia);
+        cout << info << endl;
+
+        // We dump the superkmers distribution if any
+        if (options->get(STR_URI_DISTRIB))
+        {
+            string outputFilename = System::file().getBaseName(bankFilename) + string (".distrib");
+
+            FILE* output = fopen (outputFilename.c_str(), "w");
+            if (output)
+            {
+                for (map<size_t,size_t>::iterator it = distribSuperKmers.begin(); it != distribSuperKmers.end(); ++it)
+                {
+                    fprintf (output, "%ld %ld\n", it->first, it->second);
+                }
+
+                fclose (output);
+            }
+        }
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer6.cpp b/gatb-core/examples/kmer/kmer6.cpp
new file mode 100644
index 0000000..bc0354a
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer6.cpp
@@ -0,0 +1,41 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/*                              Kmer management                                 */
+/*                                                                              */
+/* A Model is defined:                                                          */
+/*      - the maximum kmer size supported (the template argument)               */
+/*      - the actual kmer size used (the constructor argument)                  */
+/*                                                                              */
+/* This snippet shows that the actual size can't exceed the max size.           */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a kmer model that supports size up to 32
+    // Unfortunately, we try to have a model with kmer of size 51
+    // => we should get an exception
+    try
+    {
+        Kmer<32>::ModelCanonical model (51);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    try
+    {
+        Kmer<64>::ModelCanonical model (51);
+        std::cout << "It's OK..." << std::endl;
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer7.cpp b/gatb-core/examples/kmer/kmer7.cpp
new file mode 100644
index 0000000..a02f306
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer7.cpp
@@ -0,0 +1,112 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <vector>
+#include <memory>
+using namespace std;
+
+/********************************************************************************/
+/*                              Kmer statistics                                 */
+/*                                                                              */
+/* This snippet is a little bit more complex and uses different features.       */
+/*                                                                              */
+/* Its purpose is to get the kmers distribution of a bank, for a given kmer     */
+/* size K. Each sequence of size N is split in pieces of size K, for instance:  */
+/*     ATCTCGGGCTAGCTCTCGATAAGC => for K=3, ATC TCG GGC TAG CTC TCG ATA AGC     */
+/* Then we count the number of occurrences of these pieces, and sort the result.*/
+/*                                                                              */
+/* Cmd-line: kmer7 -in <fasta/q file> -kmer-size <value>                       */
+/*                                                                              */
+/* Sample: kmer7 -in gatb-core/gatb-core/test/db/reads1.fa -kmer-size 11        */
+/*                                                                              */
+/* Finally, this distribution is saved in a Storage object (HDF5 format here).  */
+/* The resulting data can be shown with HDF5 tools (provided with GATB) by:     */
+/*      h5dump output.h5                                                        */
+/* You can directly get a gnuplot output with (4 here is the provided kmer size)*/
+/*                                                                              */
+/*      h5dump -y -w 1 -d distrib/4 -o out output.h5 > /dev/null                */
+/*      gnuplot -p -e 'plot [][0:] "out" with lines'                            */
+/*                                                                              */
+/* NOTE: don't use too big kmer size because of the potential huge memory usage.*/
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("KmerStats");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,  "bank reference", true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE,  "kmer size",      true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        size_t kmerSize = options->getInt (STR_KMER_SIZE);
+        size_t nbKmers  = 1 << (2*kmerSize);
+
+        // We create a kmer model.
+        Kmer<>::ModelDirect model (kmerSize);
+
+        // We open the bank.
+        IBank* bank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (bank);
+
+        vector<NativeInt64> distrib (nbKmers);
+        size_t totalKmers = 0;
+
+        // We define an iterator that encapsulates the sequences iterator with progress feedback
+        ProgressIterator<Sequence> iter (*bank, "iterate bank");
+
+        // We loop the bank
+        for (iter.first(); !iter.isDone(); iter.next())
+        {
+            // Shortcut
+            Sequence& seq = iter.item();
+
+            size_t len  = seq.getDataSize() / kmerSize;
+            char*  data = seq.getDataBuffer();
+
+            // We iterate the sequence data by block of size kmerSize
+            for (size_t i=0; i<len; i++, data += kmerSize)
+            {
+                // We get the kmer value of the current block
+                Kmer<>::ModelDirect::Kmer kmer = model.codeSeed (data, seq.getDataEncoding());
+
+                // We update the occurrences number for this kmer value
+                distrib [kmer.value().toInt()] += 1;
+            }
+        }
+
+        // We sort the distribution
+        std::sort (distrib.begin(), distrib.end());
+
+        // We create the output storage object
+        auto_ptr<Storage> storage (StorageFactory(STORAGE_HDF5).create ("output", true, false));
+
+        // We create a data set in our storage object
+        Collection<NativeInt64>& distribCollect = storage->getGroup("distrib").getCollection<NativeInt64> (options->getStr (STR_KMER_SIZE));
+
+        // We tag our data set with the user parameters
+        distribCollect.addProperty ("name",      options->getStr (STR_URI_INPUT));
+        distribCollect.addProperty ("kmer_size", options->getStr (STR_KMER_SIZE));
+
+        // We insert the distribution into our storage object
+        distribCollect.insert (distrib);
+
+        // We can get a gnuplot output with the following (for kmerSize=5)
+        //      h5dump -y -w 1 -d distrib/5 -o out output.h5 > /dev/null ; gnuplot -p -e 'plot [][0:] "out" with lines'
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (cout);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer8.cpp b/gatb-core/examples/kmer/kmer8.cpp
new file mode 100644
index 0000000..063cc1e
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer8.cpp
@@ -0,0 +1,155 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+#include <fstream>
+#include <string.h>
+
+/********************************************************************************/
+/*                              Minimizers                                      */
+/*                                                                              */
+/* This snippet shows how to iterate the kmers and have minimizer statistics.   */
+/*                                                                              */
+/* Cmd-line: kmer5 -in <fasta/q file> -kmer-size <value> ...                    */
+/*                  -minimizer-size <size>                                      */
+/*                                                                              */
+/* Sample: kmer5 -in gatb-core/gatb-core/test/db/reads1.fa -kmer-size 11 ...    */
+/*               -minimizer-size 11                                             */
+/*                                                                              */
+/********************************************************************************/
+
+// We use the required packages
+using namespace std;
+
+/** Kmer span definition. */
+const size_t span = KMER_SPAN(0);
+
+/** Implementation of a functor that defines what is a minimizer according to
+ *  the list of mmers within a kmer. We mimic here the default behavior
+ *  (ie. minimum of the mmers within a kmer) but we could do anything we want to
+ *  and we can more generally talk about 'optimizer' rather than 'minimizer'.
+ *
+ *  The purpose of such a functor is to select a mmer between M mmers in a
+ *  specific kmer :
+ *
+ *      1) the 'init' method is called to initialize the default 'optimum' before looping
+ *         over the mmers
+ *
+ *      2) the operator() method is called for each mmer with the current optimum
+ *         value; we can choose here what kind of optimum we want (minimum for instance)
+ *         by updating the 'optimum' value
+ */
+struct CustomMinimizer
+{
+    template<class Model>  void init (const Model& model, Kmer<span>::Type& optimum) const
+    {
+        optimum = model.getKmerMax();
+    }
+
+    bool operator() (const Kmer<span>::Type& current, const Kmer<span>::Type& optimum) const
+    {
+        return current < optimum;
+    }
+
+    void include_frequency (uint32_t* freq_order) {}
+};
+
+/** We define here a 'maximizer' in the mmers of a specific kmer. */
+struct CustomMaximizer
+{
+    template<class Model>  void init (const Model& model, Kmer<span>::Type& optimum) const
+    {
+        optimum.setVal(0);
+    }
+
+    bool operator() (const Kmer<span>::Type& current, const Kmer<span>::Type& optimum) const
+    {
+        return !(current < optimum);
+    }
+
+    void include_frequency (uint32_t* freq_order) {}
+};
+
+/** Some shortcuts. */
+typedef Kmer<span>::ModelDirect    ModelDirect;
+typedef Kmer<span>::ModelMinimizer<ModelDirect,CustomMinimizer> ModelMinimizer;
+typedef Kmer<span>::ModelMinimizer<ModelDirect,CustomMaximizer> ModelMaximizer;
+
+typedef ModelMinimizer  Model;
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("KmerTest");
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,      "bank input",     true));
+    parser.push_back (new OptionOneParam (STR_KMER_SIZE,      "kmer size",      true));
+    parser.push_back (new OptionOneParam (STR_MINIMIZER_SIZE, "minimizer size", true));
+    parser.push_back (new OptionNoParam  (STR_VERBOSE,        "display kmers",  false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        // We get the kmer and minimizer sizes.
+        size_t kmerSize = options->getInt(STR_KMER_SIZE);
+        size_t mmerSize = options->getInt(STR_MINIMIZER_SIZE);
+
+        // We define a try/catch block in case some method fails (bad filename for instance)
+        u_int64_t nbKmers       = 0;
+        bool display = options->get(STR_VERBOSE) != 0;
+
+        // We declare a Bank instance defined by a list of filenames
+        IBank* bank = Bank::open (options->getStr(STR_URI_INPUT));
+        LOCAL (bank);
+
+        // We declare a kmer model and a minimizer model
+        Model model (kmerSize, mmerSize);
+
+        // We get a reference on the minimizer model, which will be useful for dumping
+       const ModelMinimizer::Model& modelMinimizer = model.getMmersModel();
+
+        Kmer<span>::Type checksum;
+        size_t nbChanged = 0;
+        size_t nbInvalid = 0;
+
+        // We define an iterator that encapsulates the sequences iterator with progress feedback
+        ProgressIterator<Sequence> iter (*bank, "iterate bank");
+
+        // We loop over sequences.
+        for (iter.first(); !iter.isDone(); iter.next())
+        {
+            // Shortcut
+            Sequence& seq = iter.item();
+
+//! [snippet1_iterate]
+            // We iterate the kmers (and minimizers) of the current sequence.
+            model.iterate (seq.getData(), [&] (const Model::Kmer& kmer, size_t idx)
+            {
+                nbKmers ++;
+                if (kmer.hasChanged() == true)   { nbChanged++;  }
+                if (kmer.isValid()    == false)  { nbInvalid++;  }
+                checksum += kmer.minimizer().value();
+            });
+//! [snippet1_iterate]
+        }
+
+        cout << "nbKmers   : " << nbKmers   << endl;
+        cout << "nbInvalid : " << nbInvalid << endl;
+        cout << "nbChanged : " << nbChanged << endl;
+        cout << "ratio     : " << (nbChanged > 0 ? (double)nbKmers / (double)nbChanged : 0) << endl;
+        cout << "checksum  : " << checksum  << endl;
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/kmer/kmer9.cpp b/gatb-core/examples/kmer/kmer9.cpp
new file mode 100644
index 0000000..4e9b459
--- /dev/null
+++ b/gatb-core/examples/kmer/kmer9.cpp
@@ -0,0 +1,52 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                              Sorting count                                   */
+/*                                                                              */
+/* This snippet shows how to count the kmers of a bank by using the sorting     */
+/* count algorithm.                                                             */
+/*                                                                              */
+/* Cmd-line: kmer9 -in <fasta/q file>                                           */
+/*                                                                              */
+/* Sample: kmer9 -in gatb-core/gatb-core/test/db/reads1.fa                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a command line parser.
+    IOptionsParser* parser = SortingCountAlgorithm<>::getOptionsParser();
+    LOCAL (parser);
+
+    try
+    {
+        // We parse the user options.
+        IProperties* options = parser->parse (argc, argv);
+
+        // We open the input bank
+        IBank* bank = Bank::open (options->getStr(STR_URI_INPUT));
+
+        // We create a SortingCountAlgorithm instance.
+        SortingCountAlgorithm<> algo (bank, options);
+
+        // We launch the algorithm
+        algo.execute();
+
+        // We display the stats of the sorting count execution
+        cout << *algo.getInfo();
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/protos/MicroSNP.cpp b/gatb-core/examples/protos/MicroSNP.cpp
new file mode 100644
index 0000000..fa8ac8e
--- /dev/null
+++ b/gatb-core/examples/protos/MicroSNP.cpp
@@ -0,0 +1,107 @@
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/* A very simple program to find SNP in reads data.                             */
+/*                                                                              */
+/* Cmd-line: MicroSNP -in <fasta/a file> -kmer-size <size> -abundance-min <val> */
+/*                                                                              */
+/* Sample: MicroSNP -in gatb-core/gatb-core/test/db/microsnp.fa ...             */
+/*                  -kmer-size 7 -abundance-min 1                               */
+/*                                                                              */
+/********************************************************************************/
+class MicroSNP : public Tool
+{
+public:
+
+    MicroSNP () : Tool ("MicroSNP")
+    {
+        getParser()->push_back (Graph::getOptionsParser());
+    }
+
+    void execute ()
+    {
+        FILE * snps = fopen ("snps","w");
+
+        // We create the de Bruijn graph
+        Graph graph = Graph::create (getParser()->getProperties());
+
+        // We get an iterator for all nodes of the graph. We use a progress iterator to get some progress feedback
+        ProgressGraphIterator<BranchingNode,ProgressTimer>  it (graph.iteratorBranching(), "MiniDiscoSNP: finding bubbles          ");
+
+        int nbsnps = 0 ;
+        int ksize  = graph.getKmerSize();
+
+        for (it.first(); !it.isDone(); it.next())
+        {
+            Node& current = it.item();
+
+            int outdegree = graph.outdegree(current);
+            int indegree  = graph.indegree (current);
+
+			///reverse if end node
+            if ((indegree ==2 && outdegree==1) )
+            {
+                current = graph.reverse(current);
+            }
+
+			//if beginning or end of clean bubble
+            if ((indegree ==1 && outdegree==2)  ||  (indegree ==2 && outdegree==1) )
+            {
+                //get neighbor branching edges
+                GraphVector<BranchingEdge> branchingNeighbors = graph.successorsBranchingEdge (current);
+
+				//clean bubble : exactly 2 branches and size of each branch  = kmer
+                if(branchingNeighbors.size()==2  && branchingNeighbors[0].distance == ksize && branchingNeighbors[1].distance == ksize)
+                {
+                    for (size_t i=0; i<branchingNeighbors.size(); i++)
+                    {
+                        BranchingEdge edge = branchingNeighbors[i];
+
+                        // We avoid duplicates
+                        if( edge.to.kmer < edge.from.kmer )  { continue; }
+
+                        flockfile(snps);
+                        fprintf(snps,">SNP %i path %zu\n",nbsnps,i );
+                        fprintf(snps,"%s%c%s\n",graph.toString (edge.from).c_str(), ascii(edge.nt) , graph.toString (edge.to).c_str() );
+                        funlockfile(snps);
+
+                        __sync_fetch_and_add ( &nbsnps, i);
+                    }
+                }
+            }
+        }
+
+        getInfo()->add (1, "stats");
+        getInfo()->add (2, "nb", "%d", nbsnps);
+
+        fclose(snps);
+    }
+};
+
+/********************************************************************************/
+
+// Once our tool class is defined, we can run it in the main function of the program.
+int main (int argc, char* argv[])
+{
+    // We use a try/catch block since GATB functions may throw exceptions
+    try
+    {
+        MicroSNP().run (argc, argv);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+        return EXIT_FAILURE;
+    }
+}
+// test on this file
+//>read_1
+//TACACGTCGGCACATCG
+//>read_2
+//TACACGTCTGCACATCG
+//
+//with:
+//MicroSNP -in read.fasta -kmer-size 7 -abundance-min 1
+
diff --git a/gatb-core/examples/storage/storage1.cpp b/gatb-core/examples/storage/storage1.cpp
new file mode 100644
index 0000000..7d27b86
--- /dev/null
+++ b/gatb-core/examples/storage/storage1.cpp
@@ -0,0 +1,60 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*              Create a Collection and save it with the Storage class.         */
+/*                                                                              */
+/* This snippet shows how to use the Storage layer. In this example, we use the */
+/* HDF5 layer, so we can check the result of the test with HDF5 tools (like     */
+/* h5dump for instance).                                                        */
+/*                                                                              */
+/* NOTE: GATB provides some HDF5 tools (check 'bin' directory)                  */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+//! [snippet1_storage]
+    // We create a Storage product "foo" in HDF5 format
+    Storage* storage = StorageFactory(STORAGE_HDF5).create ("foo", true, false);
+//! [snippet1_storage]
+
+    // We use locally this object (means that it should be automatically deleted when
+    // leaving the enclosing instructions block).
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get a collection of native integer from the storage.
+    Collection<NativeInt64>& myIntegers = root.getCollection<NativeInt64> ("myIntegers");
+
+    // We add some entries into the collection
+    myIntegers.insert (1);
+    myIntegers.insert (2);
+    myIntegers.insert (3);
+    myIntegers.insert (5);
+    myIntegers.insert (8);
+
+    // We flush the collection to be sure to save the content properly.
+    myIntegers.flush();
+
+    // Now, you can see the content of the collection by launching the following command:  h5dump foo.h5
+    // You should get something like this:
+
+    // HDF5 "foo.h5" {
+    // GROUP "/" {
+    // DATASET "myIntegers" {
+    //      DATATYPE  H5T_STD_U8LE
+    //      DATASPACE  SIMPLE { ( 5 ) / ( H5S_UNLIMITED ) }
+    //      DATA {
+    //      (0): 1, 2, 3, 5, 8
+    //      }
+    //  }
+    // }
+    // }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage10.cpp b/gatb-core/examples/storage/storage10.cpp
new file mode 100644
index 0000000..b02137b
--- /dev/null
+++ b/gatb-core/examples/storage/storage10.cpp
@@ -0,0 +1,59 @@
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*  This snippet shows how to use binary input/output streams with files.       */
+/*  so it's the same as storage8 but with files instead of hdf5.                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    float table[] = { 0.577, 3.1415, 2.71 };
+
+    Storage* storage = StorageFactory(STORAGE_FILE).create ("foo", true, false);
+
+    // We use locally this object (means that it should be automatically deleted when
+    // leaving the enclosing instructions block).
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get an output stream in a C++ style
+    Storage::ostream os (root, "data");
+
+    // We write some information in this stream
+    os.write (reinterpret_cast<char const*>(table), sizeof(table));
+
+    // We have to flush the stream in order to be sure everything is ok
+    os.flush();
+
+    // We get a handle on the collection where we put our data
+    // Note: the collection is typed as NativeInt8, meaning we get binary data
+    Collection<NativeInt8>& dataCollection = root.getCollection<NativeInt8> ("data");
+
+    // We get the number of items in the collection.
+    size_t nbItems = dataCollection.getNbItems() / sizeof(table[0]);
+    cout << "nb items : " << nbItems << endl;
+
+    // Now we declare an input stream on the collection
+    Storage::istream is (root, "data");
+
+    // We want to read the data, we first need to have a buffer for this
+    float* buffer = new float [nbItems];
+
+    // We read the data from the input stream
+    is.read (reinterpret_cast<char*>(buffer), nbItems*sizeof(float));
+
+    // We check that we read correct values.
+    cout << "check : " << (memcmp(buffer, table, nbItems*sizeof(float)) == 0) << endl;
+
+    // cleanup
+    delete[] buffer;
+}
+
diff --git a/gatb-core/examples/storage/storage2.cpp b/gatb-core/examples/storage/storage2.cpp
new file mode 100644
index 0000000..28d5a0e
--- /dev/null
+++ b/gatb-core/examples/storage/storage2.cpp
@@ -0,0 +1,67 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*              Create 2 Collections and save them with the Storage class.      */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a Storage product "foo" in HDF5 format
+    Storage* storage = StorageFactory(STORAGE_HDF5).create ("foo", true, false);
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get two groups from the root
+    Group& group1 = root.getGroup("group1");
+    Group& group2 = root.getGroup("group2");
+
+    // We get two collections of native integer from the two groups.
+    // Note that we can use the same 'integers' name since they will be located in
+    // two different groups.
+    Collection<NativeInt64>& integers1 = group1.getCollection<NativeInt64> ("integers");
+    Collection<NativeInt64>& integers2 = group2.getCollection<NativeInt64> ("integers");
+
+    // We add some entries into the collection
+    integers1.insert (1);
+    integers1.insert (2);
+    integers1.insert (3);
+    integers2.insert (5);
+    integers2.insert (8);
+
+    // We flush the collections to be sure to save the content properly.
+    integers1.flush();
+    integers2.flush();
+
+    // Now, you can see the content of the collections by launching the following command:  h5dump foo.h5
+    // You should get something like this:
+
+    // HDF5 "foo.h5" {
+    // GROUP "/" {
+    //    GROUP "group1" {
+    //       DATASET "integers" {
+    //          DATATYPE  H5T_STD_U8LE
+    //          DATASPACE  SIMPLE { ( 3 ) / ( H5S_UNLIMITED ) }
+    //          DATA {
+    //          (0): 1, 2, 3
+    //          }
+    //       }
+    //    }
+    //    GROUP "group2" {
+    //       DATASET "integers" {
+    //          DATATYPE  H5T_STD_U8LE
+    //          DATASPACE  SIMPLE { ( 2 ) / ( H5S_UNLIMITED ) }
+    //          DATA {
+    //          (0): 5, 8
+    //          }
+    //       }
+    //    }
+    // }
+    // }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage3.cpp b/gatb-core/examples/storage/storage3.cpp
new file mode 100644
index 0000000..8e7e064
--- /dev/null
+++ b/gatb-core/examples/storage/storage3.cpp
@@ -0,0 +1,36 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  Read a Collection from a Storage file.                      */
+/*                                                                              */
+/*  This snippet reads items created during 'storage1'                          */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We load a Storage product "foo" in HDF5 format
+    // It must have been created with the storage1 snippet
+//! [snippet1_storage]
+    Storage* storage = StorageFactory(STORAGE_HDF5).load ("foo");
+//! [snippet1_storage]
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get a collection of native integer from the storage.
+    Collection<NativeInt64>& myIntegers = root.getCollection<NativeInt64> ("myIntegers");
+
+    // We create an iterator for our collection.
+    Iterator<NativeInt64>* iter = myIntegers.iterator();
+    LOCAL (iter);
+
+    // Now we can iterate the collection through this iterator.
+    for (iter->first(); !iter->isDone(); iter->next())  {  cout << iter->item() << endl;  }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage4.cpp b/gatb-core/examples/storage/storage4.cpp
new file mode 100644
index 0000000..fa0d8e2
--- /dev/null
+++ b/gatb-core/examples/storage/storage4.cpp
@@ -0,0 +1,36 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  Read two Collections from a Storage file.                   */
+/*                                                                              */
+/*  This snippet reads items created during 'storage2'                          */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We load a Storage product "foo" in HDF5 format
+    // It should have been created with the storage2 snippet
+    Storage* storage = StorageFactory(STORAGE_HDF5).load ("foo");
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get two groups from the root
+    Group& group1 = root.getGroup("group1");
+    Group& group2 = root.getGroup("group2");
+
+    // We iterate the two collections with a lambda expression. Note that we use lambda expressions here.
+    group1.getCollection<NativeInt64> ("integers").iterate ([] (const NativeInt64& n)  {  cout << n << endl;  });
+    cout << endl;
+    group2.getCollection<NativeInt64> ("integers").iterate ([] (const NativeInt64& n)  {  cout << n << endl;  });
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage5.cpp b/gatb-core/examples/storage/storage5.cpp
new file mode 100644
index 0000000..fab1e99
--- /dev/null
+++ b/gatb-core/examples/storage/storage5.cpp
@@ -0,0 +1,10 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+/********************************************************************************/
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage6.cpp b/gatb-core/examples/storage/storage6.cpp
new file mode 100644
index 0000000..d926aae
--- /dev/null
+++ b/gatb-core/examples/storage/storage6.cpp
@@ -0,0 +1,110 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <iostream>
+#include <memory>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  Iterate solid kmers from a HDF5 file                        */
+/*                                                                              */
+/* This snippet shows how to iterate solid kmers from a file generated by DSK   */
+/* or by dbgh5. It also compute the distribution of kmers.                      */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("StorageSnippet");
+    parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input",   true));
+    parser.push_back (new OptionOneParam (STR_VERBOSE,   "verbosity (0:no display, 1: display kmers, 2: display distrib",  false, "0"));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        int display = options->getInt (STR_VERBOSE);
+
+        // We get a handle on the HDF5 storage object.
+        // Note that we use an auto pointer since the StorageFactory dynamically allocates an instance
+        auto_ptr<Storage> storage (StorageFactory(STORAGE_HDF5).load (options->getStr(STR_URI_GRAPH)));
+
+        // We get the group for dsk
+        Group& dskGroup = storage->getGroup("dsk");
+
+        // We get the solid kmers collection 1) from the 'dsk' group  2) from the 'solid' collection
+        Partition<Kmer<>::Count>& solidKmers = dskGroup.getPartition<Kmer<>::Count> ("solid");
+
+        // We can retrieve information (as an XML string) about the construction of the solid kmers
+        cout << dskGroup.getProperty("xml") << endl;
+
+        // We can access each of these information through a Properties object
+        Properties props;
+        props.readXML (dskGroup.getProperty("xml"));
+
+        Properties configProps;
+        configProps.readXML (storage->getGroup("configuration").getProperty("xml"));
+
+
+        // Now, we can for instance get the kmer size (as an integer)
+        cout << "kmer size:      " << configProps.getInt ("kmer_size")      << endl;
+        cout << "nb solid kmers: " <<       props.getInt ("kmers_nb_solid") << endl;
+
+        // We create a Model instance. It will help to dump the kmers in
+        // a human readable form (ie as a string of nucleotides)
+        Kmer<>::ModelCanonical model (configProps.getInt ("kmer_size"));
+
+        size_t nbKmers = 0;
+
+        // We create an iterator for our [kmer,abundance] values
+        ProgressIterator<Kmer<>::Count> iter (solidKmers);
+
+        Kmer<>::Type checksum;
+        map<u_int64_t,u_int64_t> distrib;
+
+        // We iterate the solid kmers from the retrieved collection
+        for (iter.first(); !iter.isDone(); iter.next())
+        {
+            // shortcut
+            Kmer<>::Count& count = iter.item();
+
+            // We update the checksum.
+            checksum += count.value;
+
+            // We update the distribution
+            distrib [count.abundance] ++;
+
+            // We dump the solid kmer information:
+            //   1) nucleotides
+            //   2) raw value (integer)
+            //   3) abundance
+            if (display==1)
+            {
+                cout << "[" << ++nbKmers << "]  " << model.toString(count.value) << "  " << count.value << "  "  << count.abundance << endl;
+            }
+        }
+
+        cout << "kmer checksum:  " << checksum << endl;
+
+        if (display==2)
+        {
+            for (map<u_int64_t,u_int64_t>::iterator it = distrib.begin(); it != distrib.end(); ++it)
+            {
+                cout << it->first << "  "  << it->second << endl;
+            }
+        }
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage7.cpp b/gatb-core/examples/storage/storage7.cpp
new file mode 100644
index 0000000..e70babb
--- /dev/null
+++ b/gatb-core/examples/storage/storage7.cpp
@@ -0,0 +1,37 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  Associate metadata to HDF5 collections                      */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a Storage product "foo" in HDF5 format
+    Storage* storage = StorageFactory(STORAGE_HDF5).create ("foo", true, false);
+
+    // We use locally this object (means that it should be automatically deleted when
+    // leaving the enclosing instructions block).
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get a collection of native integer from the storage.
+    Collection<NativeInt64>& myIntegers = root.getCollection<NativeInt64> ("myIntegers");
+
+    // We associate a custom data to our collection
+    myIntegers.addProperty ("myData", "test_%d", 147);
+
+    // We can retrieve later this metadata with getProperty
+    cout << "metadata is " << myIntegers.getProperty("myData") << endl;
+
+    // You can dump such values with h5dump:
+    //      h5dump -a myIntegers/myData foo.h5
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage8.cpp b/gatb-core/examples/storage/storage8.cpp
new file mode 100644
index 0000000..3dedd10
--- /dev/null
+++ b/gatb-core/examples/storage/storage8.cpp
@@ -0,0 +1,68 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  ostream and istream with HDF5                               */
+/*                                                                              */
+/*  This snippet shows how to use binary input/output streams with HDF5.        */
+/*                                                                              */
+/*  You can use 'h5dump foo.h5' to have a look to the generated binary stream   */
+/*  inside the HDF5 dataset.                                                    */
+/*                                                                              */
+/* Here, we save 3 float objects, which needs 12 bytes, so we can see the       */
+/* binary representation of theses 3 floats.                                    */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    float table[] = { 0.577, 3.1415, 2.71 };
+
+    // We create a Storage product "foo" in HDF5 format
+    Storage* storage = StorageFactory(STORAGE_HDF5).create ("foo", true, false);
+
+    // We use locally this object (means that it should be automatically deleted when
+    // leaving the enclosing instructions block).
+    LOCAL (storage);
+
+    // Shortcut: we get the root of this Storage object
+    Group& root = storage->root();
+
+    // We get an output stream in a C++ style
+    Storage::ostream os (root, "data");
+
+    // We write some information in this stream
+    os.write (reinterpret_cast<char const*>(table), sizeof(table));
+
+    // We have to flush the stream in order to be sure everything is ok
+    os.flush();
+
+    // We get a handle on the HDF5 collection where we put our data
+    // Note: the collection is typed as NativeInt8, meaning we get binary data
+    Collection<NativeInt8>& dataCollection = root.getCollection<NativeInt8> ("data");
+
+    // We get the number of items in the collection.
+    size_t nbItems = dataCollection.getNbItems() / sizeof(table[0]);
+    cout << "nb items : " << nbItems << endl;
+
+    // Now we declare an input stream on the collection
+    Storage::istream is (root, "data");
+
+    // We want to read the data, we first need to have a buffer for this
+    float* buffer = new float [nbItems];
+
+    // We read the data from the input stream
+    is.read (reinterpret_cast<char*>(buffer), nbItems*sizeof(float));
+
+    // We check that we read correct values.
+    cout << "check : " << (memcmp(buffer, table, nbItems*sizeof(float)) == 0) << endl;
+
+    // cleanup
+    delete[] buffer;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/storage/storage9.cpp b/gatb-core/examples/storage/storage9.cpp
new file mode 100644
index 0000000..1576317
--- /dev/null
+++ b/gatb-core/examples/storage/storage9.cpp
@@ -0,0 +1,41 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+/********************************************************************************/
+/*                  Minimizer repartition object.                               */
+/*                                                                              */
+/*  This snippet shows how to retrieve the minimizer repartition object from a  */
+/*  file generated by DSK (or dbgh5).                                           */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We create a Storage product "foo" in HDF5 format
+    Storage* storage = StorageFactory(STORAGE_HDF5).load(argv[1]);
+
+    // We use locally this object (means that it should be automatically deleted when
+    // leaving the enclosing instructions block).
+    LOCAL (storage);
+
+    try
+    {
+		// We get the group for dsk
+		Group& dskGroup = storage->getGroup("dsk");
+
+		Repartitor repart;
+		repart.load (dskGroup);
+
+		for (size_t i=0; i<(1<<16); i++)  {  printf ("%ld  %d\n", i, repart(i));  }
+    }
+    catch (Exception& e)
+    {
+        std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/ToyTool.cpp b/gatb-core/examples/tools/ToyTool.cpp
new file mode 100644
index 0000000..7386224
--- /dev/null
+++ b/gatb-core/examples/tools/ToyTool.cpp
@@ -0,0 +1,124 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                   Using Tool class for quick tool development.               */
+/********************************************************************************/
+
+// We define some constant strings for names of command line parameters
+static const char* STR_RANGE_MIN = "-min";
+static const char* STR_RANGE_MAX = "-max";
+
+/********************************************************************************/
+
+// We define our own tool as a class that inherits from the Tool class
+// By doing this, we will get:
+//      - a command line parser with default options; we will add specific options
+//      - a mean to retrieve command line options values in our code
+//      - a mean to get configurable progression bar for our ongoing job
+//      - a dispatcher object for easy multi-threading
+//      - a mean to get time execution information
+//      - a mean to gather any piece of information for output
+//      - a mean to run the tool in the 'main' function
+
+class ToyTool : public Tool
+{
+public:
+
+    // The Tool constructor allows to give a name to our tool.
+    // This name appears when one gets help in the command line or in the final output
+    ToyTool () : Tool ("ToyTool")
+    {
+        // By default, the Tool class provides 3 default command line arguments:
+        //    "-nb-cores X" : number of cores used by the dispatcher object (0 means all cores)
+        //    "-verbose X"  : verbosity level (0: none, 1 and 2: bargraphs and final output)
+        //    "-help"       : just dump help about the tool
+
+        // Now, we add two custom command line arguments with the parser we got from Tool
+        //      the "-min" argument is not mandatory, with default value 1
+        //      the "-max" argument is mandatory
+        getParser()->push_front (new OptionOneParam (STR_RANGE_MIN, "lower range bound",  false, "1"));
+        getParser()->push_front (new OptionOneParam (STR_RANGE_MAX, "upper range bound",  true));
+
+        // Hence our tool can get 5 arguments as input (3 default, 2 custom)
+        // One can get them by using "./ToyTool -help"
+        // Note: if the mandatory argument is not provided, an error is dumped in console
+    }
+
+    // The 'execute' method must be implemented as we are a subclass of Tool
+    // This method does the actual job our tool is supposed to do (here some dummy computation)
+    void execute ()
+    {
+        // Our job is to compute some dummy information from integers in an range.
+        // This range is configured with our two command line arguments.
+        // Here, we see how to retrieve the arguments values through the 'getInput' method
+        Range<u_int64_t> range (
+            getInput()->getInt(STR_RANGE_MIN),
+            getInput()->getInt(STR_RANGE_MAX)
+        );
+
+        // We create an iterator over our integer range.
+        // Note how we use the Tool::createIterator method. According to the value of the "-verbose" argument,
+        // this method will add some progression bar if needed.
+        Iterator<u_int64_t>* iter = createIterator<u_int64_t> (range, "iterate range");
+        LOCAL (iter);
+
+        // We will do some dummy computation
+        u_int64_t totalSum = 0;
+
+        // We want to get execution time. We use the Tool::getTimeInfo() method for this.
+        getTimeInfo().start ("computation");
+
+        // We iterate the range through the Dispatcher we got from our Tool parent class.
+        // The dispatcher is configured with the number of cores provided by the "-nb-cores" command line argument.
+        IDispatcher::Status status = getDispatcher()->iterate (iter, [&] (const u_int64_t& i)
+        {
+            // We do some dummy computation.
+            u_int64_t sum = 0;
+            for (u_int64_t j=0; j<i; j++)  { sum += j; }
+
+            __sync_fetch_and_add (&totalSum, sum);
+        });
+
+        getTimeInfo().stop ("computation");
+
+        // We gather some statistics. Note how we use the getInfo() method from the parent class Tool
+        // If the verbosity is not 0, all this information will be dumped in the console at the end
+        // of the tool execution
+        getInfo()->add (1, "output");
+        getInfo()->add (2, "sum",     "%ld",  totalSum);
+        getInfo()->add (1, getTimeInfo().getProperties("time"));
+    }
+};
+
+/********************************************************************************/
+
+// Once our tool class is defined, we can run it in the main function of the program.
+int main (int argc, char* argv[])
+{
+    // We use a try/catch block since GATB functions may throw exceptions
+    try
+    {
+        // We run our tool with the provided command line arguments.
+        // This will call the ToyTool::execute method we have defined.
+        ToyTool().run (argc, argv);
+
+        // You can try to launch our tool with different command line arguments.
+
+        // For instance, you can try different number of threads:
+        //      ./ToyTool -max 200000 -nb-cores 1
+        //      ./ToyTool -max 200000 -nb-cores 2
+        //      ./ToyTool -max 200000 -nb-cores 4
+        //      ./ToyTool -max 200000 -nb-cores 8
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+        return EXIT_FAILURE;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators1.cpp b/gatb-core/examples/tools/iterators1.cpp
new file mode 100644
index 0000000..e8c1c3e
--- /dev/null
+++ b/gatb-core/examples/tools/iterators1.cpp
@@ -0,0 +1,28 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+/*                Iteration of a list with the gatb-core api                    */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    size_t nbItems = 0;
+
+    // We declare a STL list with some values.
+    int values[] = {1,2,3,5,8,13,21,34};
+    std::list<int> l (values, values + sizeof(values)/sizeof(values[0]) );
+
+    // We create an iterator on this STL list
+    ListIterator<int> it (l);
+
+    // We iterate the list through the iterator.
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << *it << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators2.cpp b/gatb-core/examples/tools/iterators2.cpp
new file mode 100644
index 0000000..cd37f54
--- /dev/null
+++ b/gatb-core/examples/tools/iterators2.cpp
@@ -0,0 +1,34 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+/*            Iteration of a Cartesian product of two iterators                 */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values1[] = {1,2,3,5,8,13,21,34};
+    std::list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+    // We declare a STL list with some values.
+    float values2[] = {0.5, 3.1415, 2.71};
+    std::list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]) );
+
+    // We declare two iterators on the two lists.
+    ListIterator<int>   it1 (l1);
+    ListIterator<float> it2 (l2);
+
+    // We declare a Cartesian iterator on the two iterators.
+    ProductIterator<int,float> it (it1, it2);
+
+    // We iterate the Cartesian product of the two lists
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << it->first << " -- " << it->second << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators3.cpp b/gatb-core/examples/tools/iterators3.cpp
new file mode 100644
index 0000000..1a5d803
--- /dev/null
+++ b/gatb-core/examples/tools/iterators3.cpp
@@ -0,0 +1,29 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+/*                     Iteration of a part of an iterator                       */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values[] = {1,2,3,5,8,13,21,34};
+    int valuesLen = sizeof(values)/sizeof(values[0]);
+    std::list<int> l (values, values + valuesLen);
+
+    // We declare one iterator on the list
+    ListIterator<int> it (l);
+
+    // We declare a truncated iterator for the list iterator.
+    TruncateIterator<int> itTrunc (it, valuesLen/2);
+
+    // We iterate the truncated list
+    for (itTrunc.first(); !itTrunc.isDone(); itTrunc.next())
+    {
+        std::cout << *itTrunc << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators4.cpp b/gatb-core/examples/tools/iterators4.cpp
new file mode 100644
index 0000000..ab905ce
--- /dev/null
+++ b/gatb-core/examples/tools/iterators4.cpp
@@ -0,0 +1,46 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+//! [snippet1_SubjectIterator]
+
+/********************************************************************************/
+// We a define a functor that will be called during iteration
+struct ProgressFunctor : public IteratorListener
+{
+    // we receive 'current' amount of done iterations since last call
+    void inc  (u_int64_t current)   {  std::cout << ".";  }
+};
+
+/********************************************************************************/
+/*                     Iteration with progress information                      */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values[] = {1,2,3,5,8,13,21,34};
+    int valuesLen = sizeof(values)/sizeof(values[0]);
+    std::list<int> l (values, values + valuesLen);
+
+    // We create an iterator on the list.
+    ListIterator<int>* itList = new ListIterator<int> (l);
+
+    // We declare an iterator that will send progress status every 3 iterations.
+    // Note that it refers a ListIterator instance given as constructor parameter.
+    SubjectIterator<int> itNotif (itList, 3);
+
+    //  We create some listener to be notified about progress and attach it to the iterator.
+    itNotif.addObserver (new ProgressFunctor ());
+
+    // We iterate the truncated list
+    for (itNotif.first(); !itNotif.isDone(); itNotif.next())
+    {
+        // We can do something in the loop, but there is nothing here about progress management
+    }
+}
+
+//! [snippet1_SubjectIterator]
+
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators5.cpp b/gatb-core/examples/tools/iterators5.cpp
new file mode 100644
index 0000000..1d0a396
--- /dev/null
+++ b/gatb-core/examples/tools/iterators5.cpp
@@ -0,0 +1,33 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+//! [snippet1_SubjectIterator]
+
+/********************************************************************************/
+/*                     Iteration with progress information                      */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values[] = {1,2,3,5,8,13,21,34};
+    int valuesLen = sizeof(values)/sizeof(values[0]);
+    std::list<int> l (values, values + valuesLen);
+
+    // We declare an iterator that will send default progress status.
+    // Note that we define the 'actual' iterator on the fly as first parameter of ProgressIterator
+    ProgressIterator<int> it (new ListIterator<int> (l), "Iteration running", valuesLen);
+
+    // We iterate the list
+    for (it.first(); !it.isDone(); it.next())
+    {
+        // We force a small wait
+        sleep (1);
+    }
+}
+
+//! [snippet1_SubjectIterator]
+
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators6.cpp b/gatb-core/examples/tools/iterators6.cpp
new file mode 100644
index 0000000..92ca836
--- /dev/null
+++ b/gatb-core/examples/tools/iterators6.cpp
@@ -0,0 +1,34 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+// We a define a functor that will be called during iteration for filtering odd items.
+struct FilterFunctor  {  bool operator ()  (int& val)   {  return val%2 == 0; } };
+
+/********************************************************************************/
+/*                           Iteration with filtering                           */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values[] = {1,2,3,5,8,13,21,34};
+    std::list<int> l (values, values + sizeof(values)/sizeof(values[0]));
+
+    // We declare a functor for filtering items.
+    FilterFunctor filter;
+
+    // We declare an iterator over list entries with filtering out odd values.
+    FilterIterator<int,FilterFunctor> it (new ListIterator<int> (l), filter);
+
+    // We iterate the truncated list
+    for (it.first(); !it.isDone(); it.next())
+    {
+        // We should have only even values here.
+        std::cout << *it << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators7.cpp b/gatb-core/examples/tools/iterators7.cpp
new file mode 100644
index 0000000..728aba3
--- /dev/null
+++ b/gatb-core/examples/tools/iterators7.cpp
@@ -0,0 +1,30 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+/*            Iteration of a two iterators by pairs of items                    */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values1[] = {13,5,34};
+    std::list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+    // We declare a STL list with some values.
+    float values2[] = {0.5, 3.1415, 2.71};
+    std::list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]) );
+
+    // We declare a paired iterator on the two iterators.
+    PairedIterator<int,float> it (new ListIterator<int>(l1), new ListIterator<float>(l2));
+
+    // We iterate the pairs of the two lists
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << it->first << " -- " << it->second << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators8.cpp b/gatb-core/examples/tools/iterators8.cpp
new file mode 100644
index 0000000..e6e9b93
--- /dev/null
+++ b/gatb-core/examples/tools/iterators8.cpp
@@ -0,0 +1,42 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+// Shortcut
+typedef std::pair<int,float> Type;
+
+// We define our filtering functor
+struct FilterFunctor  {  bool operator ()  (const Type& val)   {  return val.first > val.second; } };
+
+/********************************************************************************/
+/*                              Mixing iterators                                */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    int values1[] = {1,2,3,5,8,13,21,34};
+    std::list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+    // We declare a STL list with some values.
+    float values2[] = {0.5, 3.1415, 12.71, -1.51, 4.11, -11.3 };
+    std::list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]));
+
+    // We declare our 'mix' iterator
+    FilterIterator<Type,FilterFunctor> it (
+        new PairedIterator<int,float> (
+            new ListIterator<int>   (l1),
+            new ListIterator<float> (l2)
+        ),
+        FilterFunctor()
+    );
+
+    // We iterate the pairs of the two lists
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << it->first << " -- " << it->second << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/iterators9.cpp b/gatb-core/examples/tools/iterators9.cpp
new file mode 100644
index 0000000..4c86262
--- /dev/null
+++ b/gatb-core/examples/tools/iterators9.cpp
@@ -0,0 +1,34 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <vector>
+#include <iostream>
+
+/********************************************************************************/
+/*            Iteration of a two iterators by pairs of items                    */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We declare a STL list with some values.
+    float values1[] = {13,5,34};
+    std::list<float> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+    // We declare a STL list with some values.
+    float values2[] = {0.5, 3.1415, 2.71};
+    std::list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]) );
+
+    std::vector<Iterator<float>*> iterators;
+    iterators.push_back (new ListIterator<float>(l1));
+    iterators.push_back (new ListIterator<float>(l2));
+
+    // We declare a composite iterator for the two iterators.
+    CompositeIterator<float> it (iterators);
+
+    // We iterate the pairs of the two lists
+    for (it.first(); !it.isDone(); it.next())
+    {
+        std::cout << it.item() << std::endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading1.cpp b/gatb-core/examples/tools/multithreading1.cpp
new file mode 100644
index 0000000..938b5a0
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading1.cpp
@@ -0,0 +1,55 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                    Multithreaded iteration of an integer range               */
+/********************************************************************************/
+
+// We define a functor that will be cloned by the dispatcher
+struct Functor { void operator() (int i)
+{
+    // In this instruction block, we are executing in one of the nbCores threads
+    // created by the dispatcher. Note that 'i' is one value of our range
+}};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    Range<int>::Iterator it (1,1000);
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    Dispatcher dispatcher (nbCores);
+
+    // We dispatch the range iteration with the dispatcher.
+    // This will create nbCores threads and each thread will be fed with
+    // one value of the defined range
+
+    // NOTE: we could also use lambda expression (easing the code readability)
+    // Note: third argument is set to groupSize of 1 instead of 1000 (default), 
+    // to avoid that 1000 tasks are batched in the same thread.
+    // In practice, when iterating over a large set of elements, set a reasonable 
+    // groupSize value, because a groupSize=1 will incur significant overhead 
+    // if Functor() is a very quick task.
+    IDispatcher::Status status = dispatcher.iterate (it, Functor(), 1);
+
+    // We dump some information about the dispatching
+    cout << "nbCores=" << status.nbCores << "  time=" << status.time << endl;
+
+    // IMPORTANT: usage of Dispatcher has sense only if the iterated items
+    // can be processed independently from each other.
+
+    // The point to understand with the Dispatcher is that it can
+    // iterate any instance of Iterator class. If you have any set of items
+    // that can be enumerated through an Iterator implementation, then you
+    // can parallelize the iteration with a Dispatcher instance
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading2.cpp b/gatb-core/examples/tools/multithreading2.cpp
new file mode 100644
index 0000000..9b465b1
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading2.cpp
@@ -0,0 +1,71 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*         Multithreaded iteration and modification of a shared resource.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    int nmax = 10000;
+    Range<int>::Iterator it (1,nmax);
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    // The second argument tells how many consecutive values will be received by
+    // each thread. The second argument tells how to group items per thread (set
+    // here to 1 to emphasize concurrent access issue).
+    Dispatcher dispatcher (nbCores, 1);
+
+    // The idea here is to sum the integers of our range with an iteration.
+    // (Note: we know that the result is N*(N+1)/2)
+    int sum1=0, sum2=0;
+
+    //////////////////////////////////////////////////
+    // First iteration: WRONG WAY
+    //////////////////////////////////////////////////
+    // Our first attempt is to use an integer variable to sum the iterated value.
+    // This variable will be shared by all the threads and, since they access to it
+    // without caution wrt concurrent accesses, the sum result should be wrong (unless
+    // you use one core only)
+    dispatcher.iterate (it, [&] (int i)  {  sum1 += i;  });
+
+    //////////////////////////////////////////////////
+    // Second iteration: CORRECT WAY
+    //////////////////////////////////////////////////
+    // As previously, our second attempt will share the same integer variable.
+    // But now, we take care about concurrent accesses with the use of the
+    // __sync_fetch_and_add intrinsic instruction. This instruction ensures that
+    // the shared integer can be modified by only one thread at one time.
+    dispatcher.iterate (it, [&] (int i)  {  __sync_fetch_and_add (&sum2, i);  });
+
+    //////////////////////////////////////////////////
+    // CONCLUSION
+    //////////////////////////////////////////////////
+    cout << "First iteration:  sum=" << sum1 << "  (result should be " << nmax*(nmax+1)/2 << ")" << endl;
+    cout << "Second iteration: sum=" << sum2 << "  (result should be " << nmax*(nmax+1)/2 << ")" << endl;
+
+    // Parallelization of Iterator is pretty simple with the Dispatcher class.
+    // Moreover, usage of lambda expressions make the whole thing easy to write.
+    // Note that the instruction block of the lambda expression doesn't even know that
+    // it may be executed in different threads. In other words, the block doesn't refer
+    // any stuff related to thread management; it just receives one of the item of the
+    // iteration and process some action on it.
+
+    // IMPORTANT ! As we have seen here, the user has to be aware that a shared resource (one
+    // integer here) can be modified by several threads at the same time, so the user must use
+    // some kind of synchronization for modifying the shared resource. We will see in other
+    // examples that GATB provides mechanisms for this purpose.
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading3.cpp b/gatb-core/examples/tools/multithreading3.cpp
new file mode 100644
index 0000000..f494809
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading3.cpp
@@ -0,0 +1,62 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <fstream>
+using namespace std;
+
+/********************************************************************************/
+/*         Multithreaded iteration and modification of a shared resource.       */
+/********************************************************************************/
+
+// We define a functor that will be cloned by the dispatcher
+struct Functor
+{
+    ISynchronizer* synchro;    fstream& file;
+    Functor (ISynchronizer* synchro, fstream& file)  : synchro(synchro), file(file) {}
+
+    void operator() (int i)
+    {
+        // We lock the synchronizer
+        synchro->lock ();
+
+        // We dump the current integer into the file
+        file << i << endl;
+
+        // We unlock the synchronizer
+        synchro->unlock ();
+    }
+};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    int nmax = 10000;
+    Range<int>::Iterator it (1,nmax);
+
+    // We open a file. This will be our shared resource between threads.
+    fstream file ("out", std::fstream::out);
+
+    // For our file, we can't use intrinsics like we did for integer addition,
+    // so we need a general synchronization mechanism that will be shared by the threads.
+    ISynchronizer* synchro = System::thread().newSynchronizer();
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    Dispatcher dispatcher (nbCores, 1);
+
+    // We iterate the range.  NOTE: we could also use lambda expression (easing the code readability)
+   dispatcher.iterate (it, Functor(synchro,file));
+
+    // We close the file
+    file.close();
+
+    // We get rid of the synchronizer
+    delete synchro;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading4.cpp b/gatb-core/examples/tools/multithreading4.cpp
new file mode 100644
index 0000000..e5bb5cd
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading4.cpp
@@ -0,0 +1,57 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+#include <fstream>
+using namespace std;
+
+/********************************************************************************/
+/*         Multithreaded iteration and modification of a shared resource.       */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    int nmax = 1000;
+    Range<int>::Iterator it (1,nmax);
+
+    // We open a file. This will be our shared resource between threads.
+    fstream file ("out", std::fstream::out);
+
+    // For our file, we can't use intrinsics like we did for integer addition,
+    // so we need a general synchronization mechanism that will be shared by the threads.
+    ISynchronizer* synchro = System::thread().newSynchronizer();
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    Dispatcher dispatcher (nbCores, 1);
+
+    // We iterate the range
+    dispatcher.iterate (it, [&] (int i)
+    {
+        // We use a helper class that will protect the full containing instruction block
+        // against concurrent access. Note it uses our shared synchro object.
+        // We don't have to do the tandem lock/unlock, a single LocalSynchronizer
+        // declaration will protect the containing block. This may be useful because
+        // if the user forget to call the 'unlock' method, it would block the full
+        // program execution for ever.
+        LocalSynchronizer sync (synchro);
+
+        // We dump the current integer into the file
+        file << i << endl;
+    });
+
+    // We close the file
+    file.close();
+
+    // We get rid of the synchronizer
+    delete synchro;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading5.cpp b/gatb-core/examples/tools/multithreading5.cpp
new file mode 100644
index 0000000..95af624
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading5.cpp
@@ -0,0 +1,66 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*         Multithreaded iteration without modification of a shared resource.   */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    int nmax = 1000;
+    Range<int>::Iterator it (1,nmax);
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    // The second argument tells how many consecutive values will be received by
+    // each thread.
+    Dispatcher dispatcher (nbCores, 1);
+
+    // In this example, we have a different approach: we won't modify the same
+    // shared integer value. Instead, each thread will use its own local integer
+    // and at the end, all the local sums will be summed into the final one.
+    // By doing this, we don't have any more concurrent accesses issues.
+
+    //! [snippet5_threadobject]
+    // In order to ease this approach, we use a ThreadObject object. Such an object
+    // will provide local sums for each executing thread. After the iteration, it also
+    // provides a mean to get all the local sums and modify the global sum accordingly.
+    ThreadObject<int> sum;
+
+    // We iterate our range.
+    dispatcher.iterate (it, [&] (int i)
+    {
+        // We retrieve the local sum for the current executing thread with 'sum()'
+        // Note that this block instruction still doesn't refer explicit thread
+        // management; this is hidden through the () operator of the ThreadObject class.
+        sum() += i;
+    });
+
+    // We retrieve all local sums through the 'foreach' method.
+    // This loop is done 'nbCores' times.
+    sum.foreach ([&] (int localSum)
+    {
+        // Here, the *s expression represents the global integer; we add to it the
+        // current 'localSum' computed by one of the threads.
+        *sum += localSum;
+    });
+    //! [snippet5_threadobject]
+
+    cout << "sum=" << *sum << "  (result should be " << nmax*(nmax+1)/2 << ")" << endl;
+
+    // In brief, the ThreadObject is a facility to avoid concurrent accesses to a shared
+    // resource. It encapsulates all the tedious management of local resources and final
+    // result aggregation.
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading6.cpp b/gatb-core/examples/tools/multithreading6.cpp
new file mode 100644
index 0000000..d040a0d
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading6.cpp
@@ -0,0 +1,78 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                         Multithreaded iteration of a bank.                   */
+/*                                                                              */
+/*                                                                              */
+/* Cmd-line: multithreading6 <fasta/q file>                                     */
+/*                                                                              */
+/* Sample: multithreading6 gatb-core/gatb-core/test/db/reads1.fa                */
+/*                                                                              */
+/* WARNING ! THIS SNIPPET SHOWS ALSO HOW TO USE LAMBDA EXPRESSIONS, SO YOU NEED */
+/* TO USE A COMPILER THAT SUPPORTS THIS FEATURE.                                */
+/*                                                                              */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    if (argc < 2)
+    {
+        cerr << "you must provide at least the FASTA file path." << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We get a handle on a bank
+    BankFasta bank (argv[1]);
+
+    // We get the number of cores to be used.
+    size_t nbCores = (argc >=3 ? atoi(argv[2]) : 0);
+
+    // We create a dispatcher (use all cores by default).
+    Dispatcher dispatcher (nbCores);
+
+    // We will count nucleotides occurrences.
+    ThreadObject<int> sumA, sumC, sumG, sumT, sumN;
+
+    // We iterate the bank. Note how we provide a bank iterator to the dispatcher
+    dispatcher.iterate (bank.iterator(), [&] (const Sequence& seq)
+    {
+        // We use shortcuts references for the different local sums. It avoids to retrieve
+        // them each time a nucleotide of the sequence is handled (see for loop below)
+        // and may give much better performance.
+        int& localA = sumA();
+        int& localC = sumC();
+        int& localG = sumG();
+        int& localT = sumT();
+        int& localN = sumN();
+
+        // We loop the nucleotides of the current sequence.
+        for (size_t i=0; i<seq.getDataSize(); i++)
+        {
+            switch (seq.getDataBuffer()[i])
+            {
+                case 'A':  localA++;  break;
+                case 'C':  localC++;  break;
+                case 'G':  localG++;  break;
+                case 'T':  localT++;  break;
+                case 'N':  localN++;  break;
+            }
+        }
+    }, 1 /*groupSize of 1*/);
+
+    sumA.foreach ([&] (int n) { *sumA += n; });
+    sumC.foreach ([&] (int n) { *sumC += n; });
+    sumG.foreach ([&] (int n) { *sumG += n; });
+    sumT.foreach ([&] (int n) { *sumT += n; });
+    sumN.foreach ([&] (int n) { *sumN += n; });
+
+    cout << "|A|=" << *sumA << endl;
+    cout << "|C|=" << *sumC << endl;
+    cout << "|G|=" << *sumG << endl;
+    cout << "|T|=" << *sumT << endl;
+    cout << "|N|=" << *sumN << endl;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/multithreading7.cpp b/gatb-core/examples/tools/multithreading7.cpp
new file mode 100644
index 0000000..d0185c1
--- /dev/null
+++ b/gatb-core/examples/tools/multithreading7.cpp
@@ -0,0 +1,61 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+/*                    Multithreaded iteration of an integer range
+ *                    actual working example that takes some time to run        */
+/********************************************************************************/
+
+// We define a functor that will be cloned by the dispatcher
+struct Functor { void operator() (int i)
+{
+    // In this instruction block, we are executing in one of the nbCores threads
+    // created by the dispatcher. Note that 'i' is one value of our range
+        uint64_t f = 1;
+        for (uint64_t i = 0; i < 100000000LL; i ++)
+                f = (f * 200000 + i) % 112124;
+        std::cout << i << " " << f << std::endl;
+
+}};
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // We get the number of cores to be used.  If we don't give any number,
+    // we set to 0 which implies the usage of all available cores
+    size_t nbCores = (argc >=2 ? atoi(argv[1]) : 0);
+
+    // We create an iterator over an integer range
+    Range<int>::Iterator it (1,20);
+
+    // We create a dispatcher configured for 'nbCores' cores.
+    Dispatcher dispatcher (nbCores);
+
+    // We dispatch the range iteration with the dispatcher.
+    // This will create nbCores threads and each thread will be fed with
+    // one value of the defined range
+
+    // NOTE: we could also use lambda expression (easing the code readability)
+    // Note: third argument is set to groupSize of 1 instead of 1000 (default), 
+    // to avoid that 1000 tasks are batched in the same thread.
+    // In practice, when iterating over a large set of elements, set a reasonable 
+    // groupSize value, because a groupSize=1 will incur significant overhead 
+    // if Functor() is a very quick task.
+    IDispatcher::Status status = dispatcher.iterate (it, Functor(), 1); 
+
+    // We dump some information about the dispatching
+    cout << "nbCores=" << status.nbCores << "  time=" << status.time << endl;
+
+    // IMPORTANT: usage of Dispatcher has sense only if the iterated items
+    // can be processed independently from each other.
+
+    // The point to understand with the Dispatcher is that it can
+    // iterate any instance of Iterator class. If you have any set of items
+    // that can be enumerated through an Iterator implementation, then you
+    // can parallelize the iteration with a Dispatcher instance
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/observer1.cpp b/gatb-core/examples/tools/observer1.cpp
new file mode 100644
index 0000000..c90b316
--- /dev/null
+++ b/gatb-core/examples/tools/observer1.cpp
@@ -0,0 +1,51 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We define some notification information class.
+class MyEventInfo : public EventInfo
+{
+public:
+    MyEventInfo (const std::string& message) : EventInfo(0), _message(message) {}
+    const std::string& getMessage ()  { return _message; }
+private:
+    std::string _message;
+};
+
+// We define some Observer class.
+class MyObserver : public IObserver
+{
+public:
+    void update (EventInfo* evt, ISubject* subject)
+    {
+        MyEventInfo* info = dynamic_cast<MyEventInfo*> (evt);
+        if (info != 0)  {  std::cout << "Receiving: " << info->getMessage() << std::endl;  }
+    }
+};
+
+/********************************************************************************/
+/*                Usage of the Observer/Subject class                           */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    // we define a subject instance
+    ISubject* subject = new Subject ();
+
+    // we create a specific observer
+    IObserver* observer = new MyObserver ();
+
+    // we attach the observer to the subject
+    subject->addObserver (observer);
+
+    // the subject sends some notification => should be received by our observer
+    subject->notify (new MyEventInfo ("Message that should be received"));
+
+    // we detach the observer from the subject
+    subject->removeObserver (observer);
+
+    // the subject sends some notification => should not be received by our observer
+    subject->notify (new MyEventInfo ("Message that should NOT be received"));
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/optionsparser1.cpp b/gatb-core/examples/tools/optionsparser1.cpp
new file mode 100644
index 0000000..d774074
--- /dev/null
+++ b/gatb-core/examples/tools/optionsparser1.cpp
@@ -0,0 +1,45 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <list>
+#include <iostream>
+
+/********************************************************************************/
+/*                Command line parsing through IOptionParser                    */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    IOptionsParser* root = new OptionsParser ("root");
+
+    root->push_back (SortingCountAlgorithm<>::getOptionsParser(false));
+    root->push_back (DebloomAlgorithm<>::getOptionsParser());
+
+    IOptionsParser* child1 = new OptionsParser ("child1");
+
+    root->push_back (child1);
+
+    if (IOptionsParser* bloomParser = root->getParser ("bloom"))  {  bloomParser->setVisible(false);  }
+
+    child1->push_back (new OptionOneParam (STR_NB_CORES,          "nb cores (0 for all)",   false, "0"));
+    child1->push_back (new OptionOneParam (STR_MAX_MEMORY,        "max memory (in MBytes)", false, "2000"));
+    child1->push_back (new OptionOneParam (STR_MAX_DISK,          "max disk   (in MBytes)", false, "0"));
+
+    child1->push_back (BranchingAlgorithm<>::getOptionsParser());
+
+    try
+    {
+        root->parse (argc, argv);
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors(std::cout);
+    }
+
+    printf ("-------------------------------------------------------------\n");
+    RawDumpPropertiesVisitor v;
+    root->getProperties()->accept (&v);
+
+    delete root;
+}
+//! [snippet1]
diff --git a/gatb-core/examples/tools/optionsparser2.cpp b/gatb-core/examples/tools/optionsparser2.cpp
new file mode 100644
index 0000000..c71226c
--- /dev/null
+++ b/gatb-core/examples/tools/optionsparser2.cpp
@@ -0,0 +1,28 @@
+//! [snippet1]
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+/********************************************************************************/
+/*                Command line parsing through IOptionParser                    */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    IOptionsParser* root = new OptionsParser ("root");
+    LOCAL (root);
+
+    root->push_back (new OptionNoParam (STR_HELP, "help",   false));
+
+    try
+    {
+        root->parse (argc, argv);
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors(std::cout);
+    }
+
+    std::cout << "status=" << root->saw(STR_HELP) << std::endl;
+}
+//! [snippet1]
diff --git a/gatb-core/scripts/NewProject/CMakeLists.txt b/gatb-core/scripts/NewProject/CMakeLists.txt
new file mode 100644
index 0000000..a7382ee
--- /dev/null
+++ b/gatb-core/scripts/NewProject/CMakeLists.txt
@@ -0,0 +1,83 @@
+project(XXX)
+
+cmake_minimum_required(VERSION 3.1.0)
+
+################################################################################
+# The version number of YOUR tool.
+################################################################################
+SET (gatb-tool_VERSION_MAJOR 1)
+SET (gatb-tool_VERSION_MINOR 0)
+SET (gatb-tool_VERSION_PATCH 0)
+
+IF (DEFINED MAJOR)
+    SET (gatb-tool_VERSION_MAJOR ${MAJOR})
+ENDIF()
+IF (DEFINED MINOR)
+    SET (gatb-tool_VERSION_MINOR ${MINOR})
+ENDIF()
+IF (DEFINED PATCH)
+    SET (gatb-tool_VERSION_PATCH ${PATCH})
+ENDIF()
+
+set (gatb-tool-version ${gatb-tool_VERSION_MAJOR}.${gatb-tool_VERSION_MINOR}.${gatb-tool_VERSION_PATCH})
+
+################################################################################
+# Define cmake modules directory
+################################################################################
+SET (GATB_CORE_HOME  ${PROJECT_SOURCE_DIR}GGGGG)
+SET (CMAKE_MODULE_PATH ${GATB_CORE_HOME}/cmake)
+
+################################################################################
+# SUPPORTED KMER SIZES
+################################################################################
+
+# One can uncomment this line and set the wanted values
+#set (KSIZE_LIST "32   64   96  128  160  192  224  256")
+
+################################################################################
+# THIRD PARTIES
+################################################################################
+
+# We don't want to install some GATB-CORE artifacts
+SET (GATB_CORE_EXCLUDE_TOOLS     1)
+SET (GATB_CORE_EXCLUDE_TESTS     1)
+SET (GATB_CORE_INCLUDE_EXAMPLES  0)
+
+# GATB CORE
+include (GatbCore)
+
+################################################################################
+# TOOLS
+################################################################################
+
+ADD_SUBDIRECTORY(tools)
+
+################################################################################
+# Packaging
+################################################################################
+# We set the version number
+SET (CPACK_PACKAGE_DESCRIPTION_SUMMARY  "gatb-tool ${PROJECT_NAME}")
+SET (CPACK_PACKAGE_VENDOR               "Genscale team (INRIA)")
+SET (CPACK_PACKAGE_VERSION_MAJOR        "${gatb-tool_VERSION_MAJOR}")
+SET (CPACK_PACKAGE_VERSION_MINOR        "${gatb-tool_VERSION_MINOR}")
+SET (CPACK_PACKAGE_VERSION_PATCH        "${gatb-tool_VERSION_PATCH}")
+SET (CPACK_PACKAGE_VERSION              "${gatb-tool-version}")  
+
+# We set the kind of archive
+SET (CPACK_GENERATOR                    "TGZ")
+SET (CPACK_SOURCE_GENERATOR             "TGZ")
+
+# Packaging the source ; we ignore unwanted files 
+SET (CPACK_SOURCE_IGNORE_FILES          
+    "^${PROJECT_SOURCE_DIR}/build/"  
+    "^${GATB_CORE_HOME}/.project"
+    "^${GATB_CORE_HOME}/.gitignore"
+    "^${GATB_CORE_HOME}/doc"
+    "^${GATB_CORE_HOME}/DELIVERY.md"
+)
+
+# Packaging the binary ; we want to include some additional files
+INSTALL (FILES   ${CMAKE_CURRENT_SOURCE_DIR}/LICENCE                     DESTINATION .)
+INSTALL (FILES   ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/THIRDPARTIES.md  DESTINATION .)
+
+include (CPack)
diff --git a/gatb-core/scripts/NewProject/CMakeLists_tools.txt b/gatb-core/scripts/NewProject/CMakeLists_tools.txt
new file mode 100644
index 0000000..6e62a11
--- /dev/null
+++ b/gatb-core/scripts/NewProject/CMakeLists_tools.txt
@@ -0,0 +1,40 @@
+################################################################################
+#  TOOLS
+################################################################################
+
+MACRO(SUBDIRLIST result curdir)
+    FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
+    SET (dirlist "")
+    FOREACH(child ${children})
+      IF(IS_DIRECTORY ${curdir}/${child})
+          LIST(APPEND dirlist ${child})
+      ENDIF()
+    ENDFOREACH()
+    SET(${result} ${dirlist})
+ENDMACRO()
+
+# We add the compilation options for the library
+add_definitions (${gatb-core-flags})
+
+# We add the gatb-core include directory
+include_directories (${gatb-core-includes})
+
+# We add the path for extra libraries
+link_directories (${gatb-core-extra-libraries-path})
+
+# We get the list of subdirectories names
+SUBDIRLIST(PROGRAMS ${PROJECT_SOURCE_DIR}/tools)
+
+# We create a target for each 
+FOREACH (program ${PROGRAMS})
+  set (PROGRAM_SOURCE_DIR ${PROJECT_SOURCE_DIR}/tools/${program}/src)
+  include_directories (${PROGRAM_SOURCE_DIR})
+  file (GLOB_RECURSE  ProjectFiles  ${PROGRAM_SOURCE_DIR}/*.cpp)
+  add_executable(${program} ${ProjectFiles})
+  target_link_libraries(${program} ${gatb-core-libraries})
+ENDFOREACH (program)
+
+################################################################################
+#  INSTALLATION 
+################################################################################
+install (TARGETS ${PROGRAMS} DESTINATION bin)
diff --git a/gatb-core/scripts/NewProject/NewProject.sh b/gatb-core/scripts/NewProject/NewProject.sh
new file mode 100755
index 0000000..07f3846
--- /dev/null
+++ b/gatb-core/scripts/NewProject/NewProject.sh
@@ -0,0 +1,243 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-CORE: new tool script.
+#
+# This script is used to create a new software relying on GATB-CORE library.
+#
+# Usage: run script with -h as argument.
+#
+# Author: Patrick Durand, Inria
+# Created: February 2016
+#*****************************************************************************************
+
+# This script directory (absolute path)
+_scripts_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+
+# Some global variables
+INCLUDE_GATB_COPY="false"
+INSTALL_DIRECTORY=""
+TOOL_NAME=""
+GATB_CORE_PATH="${_scripts_dir}/../.."
+NB_TOOLS=1
+PROJECT_DIR=""
+GATB_CMAKE_PATH=""
+ERR=0
+
+# Some error messages and corresponding exit codes
+ERR_MSG_2=("/!\ Error: tool installation directory not provided"      "2")
+ERR_MSG_3=("/!\ Error: tool name not provided"                        "3")
+ERR_MSG_4=("/!\ Error: Directory for GATB-CORE submodule not found:"  "4")
+ERR_MSG_5=("/!\ Error: Directory for new project already exists:"     "5")
+ERR_MSG_6=("/!\ Error: unable to prepare source template"             "6")
+ERR_MSG_7=("/!\ Error: unable to copy scripts"                        "7")
+ERR_MSG_8=("/!\ Error: unable to prepare CMake files"                 "8")
+ERR_MSG_9=("/!\ Error: unable to prepare GATB-Core"                   "9")
+ERR_MSG_10=("/!\ Error: unable to copy other files"                  "10")
+ERR_MSG_11=("/!\ Error: unable to create project directory:"         "11")
+
+# ========================================================================================
+# Section: utility function declarations
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n[$0]: a tool to create a new software relying on GATB-Core library.\n\n"
+  printf "usage: [-h] [-t <number_of_binaries>] -d <install_directory> -n <tool_name>\n\n"
+  printf "  -d <install_directory>   : the directory where to place the new software; use absolute path.\n"
+  printf "  -n <tool_name>           : the tool name; use alpha-num characters only.\n"
+  printf "  -t <number_of_binaries>  : number of binaries making the tool (default is 1).\n"
+  printf "  -h                       : this message.\n\n"
+  printf "This script will automatically create the path made of <install_directory>/<tool_name>. For these\n"
+  printf "two values, we recommand you do not use space characters.\n\n"
+  printf "From time to time, you may need to organize your tool using more than one binaries. In such a case\n"
+  printf "you may be interested in organizing your source codes using a dedicated source folder, one for each\n"
+  printf "binary. In such a case, use -t <number_of_binaries>.\n"
+  exit 0
+}
+
+# --------
+# FUNCTION: creates directory to host tool source codes
+#  args: step number
+#  return: nothing
+function createToolSourceDirectory(){
+  ERR=0
+  printf "$1- Preparing template source code...\n"
+  if [[ $NB_TOOLS == 1 ]]; then
+    mkdir -p $PROJECT_DIR/tools/${TOOL_NAME}/src  || ERR=1
+    cat $_scripts_dir/main.cpp | sed s/XXX/${TOOL_NAME}/g  > $PROJECT_DIR/tools/${TOOL_NAME}/src/main.cpp  || ERR=1
+    cat $_scripts_dir/XXX.hpp  | sed s/XXX/${TOOL_NAME}/g  > $PROJECT_DIR/tools/${TOOL_NAME}/src/${TOOL_NAME}.hpp  || ERR=1
+    cat $_scripts_dir/XXX.cpp  | sed s/XXX/${TOOL_NAME}/g  > $PROJECT_DIR/tools/${TOOL_NAME}/src/${TOOL_NAME}.cpp  || ERR=1
+  else
+    for ((i=0;i<${NB_TOOLS};++i)); do
+      # We create the tools directory and two sub directory for two different tools
+      mkdir -p $PROJECT_DIR/tools/${TOOL_NAME}_${i}/src  || ERR=1
+      cat $_scripts_dir/main.cpp | sed s/XXX/${TOOL_NAME}_${i}/g  > $PROJECT_DIR/tools/${TOOL_NAME}_${i}/src/main.cpp  || ERR=1
+      cat $_scripts_dir/XXX.hpp  | sed s/XXX/${TOOL_NAME}_${i}/g  > $PROJECT_DIR/tools/${TOOL_NAME}_${i}/src/${TOOL_NAME}_${i}.hpp  || ERR=1
+      cat $_scripts_dir/XXX.cpp  | sed s/XXX/${TOOL_NAME}_${i}/g  > $PROJECT_DIR/tools/${TOOL_NAME}_${i}/src/${TOOL_NAME}_${i}.cpp  || ERR=1
+    done
+  fi
+  printf "   done\n"
+}
+
+# --------
+# FUNCTION: creates directory to host tool scripts
+#  args: step number
+#  return: nothing
+function createToolScriptDirectory(){
+  ERR=0
+  printf "$1- Copying utility scripts...\n"
+  mkdir -p $PROJECT_DIR/scripts  || ERR=1
+  # only copy required scripts (do not use *.sh: we cannot include NewProject.sh into new tool!)
+  cp  $_scripts_dir/package_tool.sh  $PROJECT_DIR/scripts/  || ERR=1
+  printf "   done\n"
+}
+
+# --------
+# FUNCTION: copy and update CMake files
+#  args: step number
+#  return: nothing
+function createCMakeFiles(){
+  ERR=0
+  printf "$1- Preparing CMake files...\n"
+  # We copy the top level CMakeLists.txt  
+  cat $_scripts_dir/CMakeLists.txt | sed s/XXX/${TOOL_NAME}/g | sed "s|GGGGG|${GATB_CMAKE_PATH}|g" > $PROJECT_DIR/CMakeLists.txt  || ERR=1
+
+  # We copy the 'tools' CMakeLists.txt
+  cat $_scripts_dir/CMakeLists_tools.txt | sed s/XXX/${TOOL_NAME}/g  > $PROJECT_DIR/tools/CMakeLists.txt  || ERR=1
+  printf "   done\n"
+}
+
+# --------
+# FUNCTION: creates directory to host a hard copy of gatb-core 
+#  args: step number
+#  return: nothing
+function createGatbCoreDirectory(){
+    ERR=0
+    if [ "$INCLUDE_GATB_COPY" == "true" ] ; then
+      printf "$1- Including hard copy of GATB-Core library...\n"
+      mkdir -p $PROJECT_DIR/thirdparty/gatb-core  || ERR=1
+      cp -r $GATB_CORE_PATH/cmake             $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp -r $GATB_CORE_PATH/doc               $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp -r $GATB_CORE_PATH/examples          $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp -r $GATB_CORE_PATH/src               $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp -r $GATB_CORE_PATH/thirdparty        $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp -r $GATB_CORE_PATH/tools             $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp    $GATB_CORE_PATH/CMakeLists.txt    $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp    $GATB_CORE_PATH/LICENCE           $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp    $GATB_CORE_PATH/../README.md      $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp    $GATB_CORE_PATH/RELEASES.md       $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+      cp    $GATB_CORE_PATH/THIRDPARTIES.md   $PROJECT_DIR/thirdparty/gatb-core/  || ERR=1
+    else
+      printf "$1- Preparing GATB-Core link...\n"
+    fi
+    printf "   done\n"
+}
+
+# --------
+# FUNCTION: copy and/or update other files
+#  args: step number
+#  return: nothing
+function createOtherFiles(){
+  ERR=0
+  local MSG1="Place here the documentation of your tool, then remove this file."
+  local MSG2="Place here any other third-party librairies this tool relies on."
+  local MSG3="Place here test suites: scripts and/or small/medium sized data files."
+  
+  printf "$1- Copying other files...\n"
+  # We copy the default README
+  cat $_scripts_dir/README.md | sed s/XXX/${TOOL_NAME}/g > $PROJECT_DIR/README.md  || ERR=1
+  cp $GATB_CORE_PATH/LICENCE                               $PROJECT_DIR/           || ERR=1
+  mkdir $PROJECT_DIR/doc                                                           || ERR=1
+  echo $MSG1 | tee $PROJECT_DIR/doc/README                                         || ERR=1
+  if [[ ! -e $PROJECT_DIR/thirdparty ]]; then
+     mkdir $PROJECT_DIR/thirdparty                                                 || ERR=1
+  fi
+  echo $MSG2 | tee $PROJECT_DIR/thirdparty/README                                  || ERR=1
+  cp $GATB_CORE_PATH/THIRDPARTIES.md                       $PROJECT_DIR/thirdparty || ERR=1
+  mkdir $PROJECT_DIR/tests                                                         || ERR=1
+  echo $MSG3 | tee $PROJECT_DIR/tests/README                                       || ERR=1
+  printf "   done\n"
+}
+
+# --------
+# FUNCTION: display final msg to provide user with some help to start with the project
+#  args: none
+#  return: nothing
+function displayEndingMsg(){
+  printf "\n*** SUCCESS: project '$TOOL_NAME' has been created in '$PROJECT_DIR'\n\n"
+  printf "    To edit source code: have a look at $PROJECT_DIR/tools/$TOOL_NAME/src\n\n"
+  printf "    To compile source code:\n"
+  printf "       cd $PROJECT_DIR \n"
+  printf "       mkdir build ; cd build ; cmake .. \n"
+  printf "           (check that cmake did not report any errors)\n"
+  printf "       make -j8 \n"
+  printf "           (adapt -j8 to your system; here, '8' means '8-core processor')\n\n"
+  printf "    Binary of your tool will be located in $PROJECT_DIR/tools\n\n"
+  printf "    More information: read $PROJECT_DIR/README.md file\n\n"
+}
+
+# ========================================================================================
+# Section : main
+
+# Prepare arguments for processing
+while getopts ht:d:n: opt
+do
+    case "$opt" in
+      h)  help;;
+      d)  INSTALL_DIRECTORY="$OPTARG";;
+      n)  TOOL_NAME="$OPTARG";;
+      t)  NB_TOOLS="$OPTARG";;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+# Define the new project directory
+PROJECT_DIR="$INSTALL_DIRECTORY/$TOOL_NAME"
+
+printf "\n>>> Start making new tool '$TOOL_NAME' within '$PROJECT_DIR'\n\n"
+
+# Check mandatory arguments
+[ -z "$INSTALL_DIRECTORY" ]   && { echo ${ERR_MSG_2[0]}; exit ${ERR_MSG_2[1]}; }
+[ -z "$TOOL_NAME" ]           && { echo ${ERR_MSG_3[0]}; exit ${ERR_MSG_3[1]}; }
+
+# Check that we found the GATB-CORE submodule directory
+[ ! -d "$GATB_CORE_PATH" ]    && { echo "${ERR_MSG_4[0]} $GATB_CORE_PATH"; exit ${ERR_MSG_4[1]}; }
+
+# Check that the new project does not already exist
+[ -d "$PROJECT_DIR" ]         && { echo "${ERR_MSG_5[0]} $PROJECT_DIR";    exit ${ERR_MSG_5[1]}; }
+
+# Create the project directory
+(mkdir -p "$PROJECT_DIR")     || { echo "${ERR_MSG_11[0]} $PROJECT_DIR";   exit ${ERR_MSG_11[1]}; }
+
+# Check how this script is called to figure out how to handle GATB-Core dependency
+ABS_PATH=`cd "$INSTALL_DIRECTORY"; pwd` 
+if [[ "$ABS_PATH" =~ "gatb-tools/tools" ]]; then
+    # if the new tool is located in gatb-tools: "link" tool to the gatb-core included 
+    # within gatb-tools
+    INCLUDE_GATB_COPY="false"
+    GATB_CMAKE_PATH="/../../thirdparty/gatb-core/gatb-core"
+else
+    # we the new tool is outside gatb-tools: make a hard copy of gatb-core
+    INCLUDE_GATB_COPY="true"
+    GATB_CMAKE_PATH="/thirdparty/gatb-core"
+fi
+
+# Prepare the new tool
+createToolSourceDirectory 1
+[ $ERR == 1 ] && { echo ${ERR_MSG_6[0]}; exit ${ERR_MSG_6[1]}; }
+
+createToolScriptDirectory 2
+[ $ERR == 1 ] && { echo ${ERR_MSG_7[0]}; exit ${ERR_MSG_7[1]}; }
+
+createCMakeFiles 3
+[ $ERR == 1 ] && { echo ${ERR_MSG_8[0]}; exit ${ERR_MSG_8[1]}; }
+
+createGatbCoreDirectory 4
+[ $ERR == 1 ] && { echo ${ERR_MSG_9[0]}; exit ${ERR_MSG_9[1]}; }
+
+createOtherFiles 5
+[ $ERR == 1 ] && { echo ${ERR_MSG_10[0]}; exit ${ERR_MSG_10[1]}; }
+
+# success!
+displayEndingMsg
diff --git a/gatb-core/scripts/NewProject/README.md b/gatb-core/scripts/NewProject/README.md
new file mode 100644
index 0000000..5b15f6b
--- /dev/null
+++ b/gatb-core/scripts/NewProject/README.md
@@ -0,0 +1,94 @@
+#About XXX
+
+This is a software tool relying on GATB-CORE library.
+
+The architecture of the tool is as follows:
+
+    * a CMakeLists.txt file used for building the project
+    * a 'tools' directory holding a default source code using GATB-Core
+    * a 'scripts' directory holding a script to automatically package the tool
+    * a 'thirdparty' directory holding the gatb-core resources
+    * a 'doc' directory
+    * a 'tests' directory holding test procedures
+    
+The 'thirdparty' directory is only available for tool created outside the GATB-Tools repository.
+Tools located within GATB-Tools rely on a common GATB-Core sub-module already available in this repository.
+
+It is advised to use:
+
+    * 'tests' directory to hold test procedures: scripts and/or small sized data files
+    * 'scripts' directory to hold any scripts this tool relies on
+    * 'doc' directory to hold tool's documentation
+    * 'thirdparty' directory to hold any third-party librairies this tool relies on
+    
+It is worth noting that 'tools' directory is organised using sub-folders; by default, there is
+at least one such sub-folder called 'XXX'. It holds the source code of the tool. However, when
+considering a more complex software, it could be nice to setup several "sub-tools", each of them
+making a particular feature. In that case, you can easily create several "sub-tool" folders inside
+"tools", each of them having a "src" folder containing the source code, as well as a "main.cpp", for
+each feature. Using this organisation has a big advantage: the provided CMakeLists.txt is aware of 
+that, so you do not have to edit the CMake file when you add a new "sub-tool". As a real example, you
+can have a look at the DiscoSNP software.
+
+#License
+
+Please not that GATB-Core is distributed under Affero-GPL license.
+
+#Dependencies
+
+The following third parties should be already installed:
+
+* cmake 2.8+ (mandatory)
+
+#Project build
+
+For building your project, you should do the following
+    
+    cd [path-to-tool-home]
+    mkdir build;  cd build;  cmake ..;  make -j8
+    
+Then, you should get a binary holding the name of the project within 'build/tools'.
+
+Note: the first compilation should take some time since the GATB-CORE library is generated.
+
+#Project packaging
+
+You can prepare your tool for distribution using:
+    
+    ./[path-to-tool-home]/scripts/package_tool.sh -M X -m Y -p Z
+
+With X, Y and Z being major, minor and patch release numbers, respectively.
+
+Then, you should get two 'tar.gz' files within 'build', one containing the binary release 
+and the other the source codes.
+
+Note: the script re-builds the entire tool from its sources to ensure a clean build process.
+
+#Examples
+
+The project is created with a default 'main' function that dumps some information about the library.
+
+You can find many snippets showing how to use the library. 
+These snippets are located in '[path-to-gatb-core]/examples' and are split in several fields.
+
+You can find documentation about the snippets <a href="http://gatb-core.gforge.inria.fr/doc/api/snippets_page.html">here</a>.
+
+You can copy the content of one of the snippet file into the 'tools/XXX/src/main.cpp' file and relaunch the build.
+
+For instance:
+
+    cp [path-to-gatb-core]/examples/debruijn/debruijn4.cpp tools/XXX/src/main.cpp
+
+WARNING: some examples use on purpose lambda expressions, so you will need a compiler supporting this feature for this examples.
+
+#Binaries from gatb-core
+
+After the project build, some gatb-core binaries are available here: 'ext/gatb-core/bin'
+
+As gatb-core uses HDF5, you will have here some H5xxx tools from the HDF5 distribution.
+
+You will also find two gatb-core binaries:
+
+    * dbgh5:    builds a DeBruijn graph from a set of reads and save it as a HDF5 file
+    * dbginfo:  dumps information about a DeBruinj graph build by dbgh5
+
diff --git a/gatb-core/scripts/NewProject/XXX.cpp b/gatb-core/scripts/NewProject/XXX.cpp
new file mode 100644
index 0000000..1de918a
--- /dev/null
+++ b/gatb-core/scripts/NewProject/XXX.cpp
@@ -0,0 +1,42 @@
+#include <XXX.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+
+// We define some constant strings for names of command line parameters
+static const char* STR_FOO = "-foo";
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XXX::XXX ()  : Tool ("XXX")
+{
+    // We add some custom arguments for command line interface
+    getParser()->push_front (new OptionOneParam (STR_FOO, "my option",  false, "1"));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XXX::execute ()
+{
+    // We can do here anything we want.
+    // For further information about the Tool class, please have a look
+    // on the ToyTool snippet  (http://gatb-core.gforge.inria.fr/snippets_tools.html)
+
+    // We gather some statistics.
+    getInfo()->add (1, "input");
+    getInfo()->add (2, STR_FOO,  "%d",  getInput()->getInt(STR_FOO));
+    getInfo()->add (1, &LibraryInfo::getInfo());
+}
diff --git a/gatb-core/scripts/NewProject/XXX.hpp b/gatb-core/scripts/NewProject/XXX.hpp
new file mode 100644
index 0000000..7976a29
--- /dev/null
+++ b/gatb-core/scripts/NewProject/XXX.hpp
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ *   GATB software relying on Genome Analysis Toolbox with de-Bruijn graph 
+ *   Copyright (C) 2014-2016  INRIA
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _TOOL_XXX_HPP_
+#define _TOOL_XXX_HPP_
+
+/********************************************************************************/
+#include <gatb/gatb_core.hpp>
+/********************************************************************************/
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// THIS FILE IS AUTOMATICALLY GENERATED...
+//
+// THIS IS A SIMPLE EXAMPLE HOW TO USE THE Tool CLASS. IF YOU WANT MORE FEATURES,
+// YOU CAN HAVE A LOOK AT THE ToyTool SNIPPET HERE:
+//
+//      http://gatb-core.gforge.inria.fr/doc/api/snippets_tools.html
+//
+////////////////////////////////////////////////////////////////////////////////
+
+class XXX : public Tool
+{
+public:
+
+    // Constructor
+    XXX ();
+
+    // Actual job done by the tool is here
+    void execute ();
+};
+
+/********************************************************************************/
+
+#endif /* _TOOL_XXX_HPP_ */
+
diff --git a/gatb-core/scripts/NewProject/main.cpp b/gatb-core/scripts/NewProject/main.cpp
new file mode 100644
index 0000000..918912c
--- /dev/null
+++ b/gatb-core/scripts/NewProject/main.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************************
+ *   GATB: Genome Analysis Toolbox with de-Bruijn graph
+ *   Copyright (C) 2014-2016  INRIA
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+// We include the header file for the tool
+#include <XXX.hpp>
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // We run the tool with the provided command line arguments.
+        XXX().run (argc, argv);
+    }
+    catch (Exception& e)
+    {
+        std::cout << "EXCEPTION: " << e.getMessage() << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
+
diff --git a/gatb-core/scripts/NewProject/package_tool.sh b/gatb-core/scripts/NewProject/package_tool.sh
new file mode 100755
index 0000000..19ba632
--- /dev/null
+++ b/gatb-core/scripts/NewProject/package_tool.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-Tool management script.
+#
+# This script is used to prepare a release of a tool on your local computer.
+#
+# Usage: run script with -h as argument.
+#
+# Author: Patrick Durand, Inria
+# Created: January 2016
+#*****************************************************************************************
+
+MAJOR_V=""
+MINOR_V=""
+PATCH_V=""
+
+# ========================================================================================
+# Section: utility function declarations
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n[$0]: a script to prepare a release of your tool.\n\n"
+  printf "usage: [-h] -M <version_major> -m <version_minor> -p <version_patch> \n\n"
+  printf "  -M <tag>             : major release number.\n"
+  printf "  -m <tag>             : minor release number.\n"
+  printf "  -p <tag>             : patch number.\n"
+  printf "  -h                   : this message.\n\n"
+  printf "This tool automatically makes a fresh release of your tool: it compiles source\n"
+  printf "codes on your computer, then package the binary within a tar.gz file. It also\n"
+  printf "packages source codes within a separate tar.gz file.\n"
+  exit 0
+}
+
+# --------
+# FUNCTION: check if mandatory arguments are provided
+#  args: none
+#  return: nothing
+#  exit application if value is empty
+function checkMandatoryArg(){
+  local params=( "-M" "-m" "-p")
+  local vars=( "$MAJOR_V" "$MINOR_V" "$PATCH_V" )
+
+  for ((i=0;i<${#params[@]};++i)); do
+    if [ -z "${vars[i]}" ]; then
+      printf "\n/!\ Missing mandatory argument: ${params[i]}\n\n" >&2
+      exit 1
+    fi
+  done
+}
+
+
+# ========================================================================================
+# Section : main
+
+# Prepare arguments for processing
+while getopts hM:m:p: opt
+do
+    case "$opt" in
+      M)  MAJOR_V="$OPTARG";;
+      m)  MINOR_V="$OPTARG";;
+      p)  PATCH_V="$OPTARG";;
+      h)  help;;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+#check provided values. Exit script if something is wrong.
+checkMandatoryArg
+
+#now, start the whole job
+script_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+
+cd $script_dir/..
+
+# prepare a clean build
+rm -rf build
+mkdir build
+cd build/
+# configure the build with a release number
+cmake -DMAJOR=$MAJOR_V -DMINOR=$MINOR_V -DPATCH=$PATCH_V ..
+# compile code and package binary
+make package -j8
+# package source 
+make package_source -j8
+
diff --git a/gatb-core/scripts/delivery_check_repo.sh b/gatb-core/scripts/delivery_check_repo.sh
new file mode 100755
index 0000000..9659958
--- /dev/null
+++ b/gatb-core/scripts/delivery_check_repo.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-CORE management script. Only for use from Delivery.cmake script.
+#
+# Check that we are preparing a gatb-core build targeting an Inria Forge repository. 
+# 
+# Author: Patrick Durand, Inria
+# Created: January 2016
+#*****************************************************************************************
+
+l_script_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+git_config="$l_script_dir/../../.git/config"
+
+if [ ! -e $git_config ]; then
+  echo "Git configuration file not found: $git_config"
+  exit 1
+fi
+
+cat $git_config | grep --quiet "scm.gforge.inria.fr"
+
+if [ $? -eq 1 ];then
+  echo "This Git repository is not targeting Inria Forge."
+  exit 2
+fi
+
+
diff --git a/gatb-core/scripts/delivery_compile.sh b/gatb-core/scripts/delivery_compile.sh
new file mode 100755
index 0000000..11a5497
--- /dev/null
+++ b/gatb-core/scripts/delivery_compile.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-CORE management script. Only for use from Delivery.cmake script.
+#
+# Compile the binary version of gatb-core from current source. 
+# 
+# Author: Patrick Durand, Inria
+# Created: January 2016
+#*****************************************************************************************
+
+# ARGUMENTS:
+# $1:   silent mode (true|flase)
+
+# SHA 1 MANAGEMENT
+export set GIT_SHA1=`git rev-parse HEAD`
+
+# temporarely change the config_sha1.hpp file
+export set CONFIG_FILE_IN="../src/gatb/system/api/config_sha1.hpp"
+echo "#define STR_GIT_SHA1 " \"$GIT_SHA1\" > sha1.tmp
+\mv sha1.tmp $CONFIG_FILE_IN
+cat $CONFIG_FILE_IN
+
+# clean, compile and package library
+make clean
+make package  
+
+# get back the to official config_sha1.hpp
+git checkout $CONFIG_FILE_IN
+
+#
+if [ "$1" == "false" ]; then
+  echo "***"
+  echo "*** SUCCESS: source code compiled and package created."
+  echo "***"
+  echo "/!\\  /!\\  /!\\  /!\\  /!\\  /!\\  /!\\  /!\\  /!\\  /!\\"
+  echo " "
+  echo "Now, you are about to:"
+  echo "  1/ create an official tag on the Inria Forge"
+  echo "  2/ create an official release on Github"
+  echo "  3/ upload library binary on Github"
+  echo " "
+  echo "If ok, press enter to continue... (CTRL+C to abort)"
+  echo " "
+  read 
+fi
+
diff --git a/gatb-core/scripts/delivery_dump_system.sh b/gatb-core/scripts/delivery_dump_system.sh
new file mode 100755
index 0000000..39c0e68
--- /dev/null
+++ b/gatb-core/scripts/delivery_dump_system.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-CORE management script. Only for use from Delivery.cmake script.
+#
+# Dump some system properties. 
+# 
+# Author: Patrick Durand, Inria
+# Created: January 2016
+#*****************************************************************************************
+
+# ARGUMENTS:
+# $1:   file where to dump properties
+# $2:   cmake version
+# $3:   cmake_system_name
+# $4:   cmake_system
+# $5:   cmake_system_processor
+# $6:   compiler_id
+# $7:   compiler_version
+# $8:   cxx_flags
+# $9:   lib_flags
+
+echo "The library for $3 has been compiled as follows:" > $1
+echo "CMake $2" >> $1
+echo "OS: $4 running on $5 processor" >> $1
+echo "Compiler: $6 $7" >> $1
+echo "Compiler flags: $8" >> $1
+echo "Library flags: $9" >> $1
diff --git a/gatb-core/scripts/git_tag_manager.sh b/gatb-core/scripts/git_tag_manager.sh
new file mode 100755
index 0000000..72354cf
--- /dev/null
+++ b/gatb-core/scripts/git_tag_manager.sh
@@ -0,0 +1,147 @@
+#!/usr/bin/env bash
+
+#*****************************************************************************************
+# Git tag management script.
+#
+# This script can be used to tag a gatb-core release. When a tag is added, it is 
+# automatically pushed to the remote server. 
+# 
+# Usage:
+#   use option -h
+# 
+# Author: Patrick Durand, Inria
+# Created: December 2015
+#*****************************************************************************************
+
+# --------
+# FUNCTION: print a spacer
+function printspacer(){
+	sname=$0 ; length=${#sname} ; ((length+=2))
+	for ((i=0;i<length;i++)); do 
+	  printf " " 
+	done
+}
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n$0: a tool to handle git release tag creation using canonical \n"
+	printspacer
+	printf "numbering including major, minor and patch numbers.\n\n"
+  printf "usage: $0 [-h] [-D] [-t <message>] -M <major> -m <minor> -p <patch>\n"
+  printf "\n"
+  printf "  -t <message> : new tag message (optional). Default message: 'new release'.\n"
+  printf "  -M <tag>     : major release number.\n"
+  printf "  -m <tag>     : minor release number.\n"
+  printf "  -p <tag>     : patch number.\n"
+  printf "  -D           : delete existing tag.\n"
+  printf "  -h           : this message.\n"
+  printf "\n"
+  printf "Using values from '-M A', '-m B' and '-p C' arguments, the script creates a tag\n"
+  printf "named 'vA.B.C' (without quotes). The tag is automatically pushed to the remote\n"
+  printf "server.\n"
+  printf "\n"
+  printf "Return value is one of:\n"
+  printf "  0: ok\n"
+  printf "  1: missing mandatory argument\n"
+  printf "  2: tag version already exists\n"
+  printf "  3: failed to create tag version\n"
+  printf "  4: failed to push tag to remote repository\n"
+  printf "  5: failed to delete tag\n"
+  exit 0
+}
+
+# Some variables
+release_msg=""
+curTag=""
+MAJOR=""
+MINOR=
+PATCH=
+TAG=""
+OUT=""
+CMD=""
+
+# Prepare arguments for processing
+while getopts hDM:m:p:t: opt
+do
+    case "$opt" in
+      M)  MAJOR="$OPTARG";;
+      m)  MINOR="$OPTARG";;
+      p)  PATCH="$OPTARG";;
+      t)  CREATE_MESSAGE="$OPTARG";;
+      D)  CMD="delete";;
+      h)  help;;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+#Do we have all mandatory arguments ?
+mandatory_params=( "-M" "-m" "-p" )
+mandatory_values=( "$MAJOR" "$MINOR" "$PATCH" )
+
+for ((i=0;i<${#mandatory_params[@]};++i)); do
+  if [ -z "${mandatory_values[i]}" ]; then
+    printf "/!\ Missing mandatory argument: ${mandatory_params[i]}\n" >&2
+    printf "    use option -h to get help.\n" >&2
+    exit 1
+  fi
+done
+
+# Prepare tag
+TAG=$(echo "v${MAJOR}.${MINOR}.${PATCH}")
+
+# Check whether provided tag already exists on repository
+curTag=`git tag -l $TAG`
+if [ ! -z "$curTag" ]; then
+  #if tag exists and we do not want to delete it: error
+  if [ ! "$CMD" == "delete" ]; then
+    printf "/!\ git tag '$TAG' already exist.\n" >&2
+    exit 2
+  fi
+  #delete tag from local repository...
+  git tag --delete $curTag
+  #... then from remote repository
+  git push --delete origin $curTag
+  exit 0
+fi
+
+#do we have to delete tag?
+if [ "$CMD" == "delete" ]; then
+  printf "/!\ git tag '$TAG' does not exist: nothing to delete.\n" >&2
+  exit 5
+fi
+
+
+# Prepare message
+if [ ! -z "$CREATE_MESSAGE" ]; then
+  release_msg=$CREATE_MESSAGE
+else
+  release_msg="new release"
+fi
+
+
+# Create tag on local repository and check if it's ok
+printf "Tagging git repository with \n"
+printf "   tag: $TAG\n"
+printf "   msg: $release_msg\n"
+git tag -m "$release_msg" $TAG
+
+OUT=$?
+if [ $OUT -eq 0 ];then
+  printf "git tag '$TAG' created.\n"
+else
+  printf "/!\ unable to create git tag '$TAG'.\n" >&2
+  exit 3
+fi
+
+# Push tag to the remote server and check if it's ok
+git push origin $TAG
+OUT=$?
+if [ $OUT -eq 0 ];then
+  printf "git tag '$TAG' pushed to remote repository.\n"
+  exit 0
+else
+  printf "/!\ git tag '$TAG' not pushed to remote repository.\n" >&2
+  exit 4
+fi
+
diff --git a/gatb-core/scripts/github_release_api.sh b/gatb-core/scripts/github_release_api.sh
new file mode 100755
index 0000000..c8eaa20
--- /dev/null
+++ b/gatb-core/scripts/github_release_api.sh
@@ -0,0 +1,462 @@
+##  /usr/bin/env bash
+
+#*****************************************************************************************
+# Github management script.
+#
+# Script relying on Github API v3, as described in:
+# https://developer.github.com/v3/repos/releases/
+#
+# This script contains an API and is intended to be used as an include within other 
+# scripts. Methods of interest are:
+#     getGithubReleaseId()
+#     getGithubReleaseDescription()
+#     uploadAsset()
+#     deleteAsset()
+#     listReleaseSummary()
+#     listAssetSummary()
+#     deleteRelease()
+# For more information, see methods description below, as well as their use within the
+# main section of the script.
+#
+# Author: Patrick Durand, Inria
+# Created: December 2015
+#*****************************************************************************************
+
+# ========================================================================================
+# Section: prepare access to JSON script
+s_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+JSON_SH=$s_dir/json-v2.sh
+
+# ========================================================================================
+# Section: variable declarations
+
+#for internal use, to store github api answers
+github_answer="_ga_.json"
+#some global variables to store credentials and github repos
+LOGIN=""
+TOKEN=""
+OWNER=""
+REPOSITORY=""
+#command to execute
+COMMAND=""
+#git tag name
+TAG=""
+#list of files from command-line ([file ...] part if any)
+FILES=""
+#default message used to create a new release
+CREATE_MESSAGE="new release"
+#by default this script talk to you
+SILENT="off"
+
+# ========================================================================================
+# Section: utility function declarations
+
+# --------
+# FUNCTION: print out an simple message on stderr (only if SILENT mode is off)
+function errorMsg(){
+  if [ "$SILENT" == "off" ]; then
+    printf "$* \n" >&2
+  fi
+}
+
+# --------
+# FUNCTION: print out an simple message on stdout (only if SILENT mode is off)
+function infoMsg(){
+  if [ "$SILENT" == "off" ]; then
+    printf "$* \n"
+  fi
+}
+
+# --------
+# FUNCTION: print out an error message on stderr and exit from application
+function throw () {
+  errorMsg "$* \n"
+  exit 77
+}
+
+# --------
+# FUNCTION: check whether or not github returns an error
+#   arg1: file containing json answer
+#   return: error msg to display
+function isError(){
+  local github_error_msg=$(cat "$1" | $JSON_SH -b | grep -F -e "[message]" | cut -s -f 2 | sed -e "s/\"//g" | tr [:upper:] [:lower:])
+
+  if [ "$github_error_msg" == "not found" ]; then 
+    echo "true"
+  else
+    echo "false"
+  fi
+}
+
+# --------
+# FUNCTION: clean any resources created
+function clean(){
+  if [ -e $github_answer ]; then
+    rm -f $github_answer
+  fi
+}
+
+# --------
+# FUNCTION: return a key associated to a particular key from a json file
+#   arg1: file containing json answer from github
+#   arg2: key. Can be a simple string or structured keys should have the form A.B.C when
+#         a json file has a structured contents. 
+#   return: a string containing the value or an empty string if not found
+function getDataField(){
+  echo $(cat "$1" | $JSON_SH -b | grep -F -e "[$2]" | cut -s -f 2 | sed -e "s/\"//g")
+}
+
+# ========================================================================================
+# Section: github_API_v3 based function declarations
+
+# --------
+# FUNCTION: return a github release id given a git release tag
+#   arg1: git release tag
+#   return: a string containing release id 
+#   throw: exit application if release does not exist
+function getGithubReleaseId(){
+  # Connect github to check whether or not release already exists
+  curl --user ${LOGIN}:${TOKEN} \
+     --request GET \
+     --output "$github_answer" \
+     --silent \
+     --data @- \
+     https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases/tags/${1} <<END
+END
+
+  #do we have an error ?
+  if [ $(isError "$github_answer") == "true" ]; then
+	  throw "/!\ Cannot find release github ID for git tag ${1}"
+  fi
+
+  echo $(getDataField "$github_answer" "id")
+
+}
+
+# --------
+# FUNCTION: return a github release description
+#   arg1: github release ID
+#   return: a json containing release description 
+#   throw: exit application if release does not exist
+function getGithubReleaseDescription(){
+  # Connect github to check whether or not release already exists
+  curl --user ${LOGIN}:${TOKEN} \
+     --request GET \
+     --output "$github_answer" \
+     --silent \
+     --data @- \
+     https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases/${1} <<END
+END
+
+  #do we have an error ?
+  if [ $(isError "$github_answer") == "true" ]; then
+	  throw "/!\ Cannot find github ID ${1}"
+  fi
+
+  echo $(cat "$github_answer")
+}
+
+
+# --------
+# FUNCTION: return a list of assets that are contained in a specific release
+#   arg1: github release id
+#   return: a json structured contents
+function getAssetsDescription(){
+  curl --user ${LOGIN}:${TOKEN} \
+     --request GET \
+     --output "$github_answer" \
+     --silent \
+     --data @- \
+     https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases/${1}/assets <<END
+END
+  echo $(cat "$github_answer")
+}
+
+# --------
+# FUNCTION: return a list of release that are contained in a specific repository
+#   args: none
+#   return: a json structured contents
+function getReleasesDescription(){
+  curl --user ${LOGIN}:${TOKEN} \
+     --request GET \
+     --output "$github_answer" \
+     --silent \
+     --data @- \
+     https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases <<END
+END
+  echo $(cat "$github_answer")
+}
+
+# --------
+# FUNCTION: display the release available on github for a particular repository
+#   args: none
+#   return: nothing
+function listReleaseSummary(){
+  local dRelName="" 
+  local dRelDate="" 
+  local dRelId="" 
+
+  infoMsg "Releases available on github for ${OWNER}/${REPOSITORY}:"
+  local rels=$($(echo getReleasesDescription $1) | $JSON_SH -b | cut -s -d "." -f 1 | sed -e "s/\[//g" | uniq)
+  if [ ! -z "$rels" ]; then
+    for key in $rels; 
+      do
+        dRelName=$(getDataField "$github_answer" "${key}.tag_name")
+        dRelId=$(getDataField "$github_answer" "${key}.id")
+        dRelDate=$(getDataField "$github_answer" "${key}.created_at")
+        infoMsg " asset $key: $dRelName ($dRelId), $dRelDate";
+      done
+  else
+    infoMsg "  none."
+  fi
+}
+
+# --------
+# FUNCTION: display the assets (id and name) contained in a release
+#   arg1: github release id
+#   return: nothing
+function listAssetSummary(){
+  local dFileName="" 
+  local dFileSize="" 
+  local dFileDate="" 
+  local dFileDownload=""
+
+  infoMsg "File(s) for release $1:"
+  local files=$($(echo getAssetsDescription $1) | $JSON_SH -b | cut -s -d "." -f 1 | sed -e "s/\[//g" | uniq)
+  if [ ! -z "$files" ]; then
+    for key in $files; 
+      do
+        dFileName=$(getDataField "$github_answer" "${key}.name")
+        dFileSize=$(getDataField "$github_answer" "${key}.size")
+        dFileDate=$(getDataField "$github_answer" "${key}.created_at")
+        dFileDownload=$(getDataField "$github_answer" "${key}.download_count")
+        
+        infoMsg " asset $key: $dFileName ($dFileSize bytes), $dFileDate; $dFileDownload downloads.";
+      done
+  else
+    infoMsg "  none."
+  fi
+}
+
+# --------
+# FUNCTION: delete an asset by its file name. Utility method, use deleteAsset() instead.
+#   arg1: github release id
+#   arg2: file name to delete
+#   return: 0 if success (file found and deleted), 1 otherwise
+function deleteAssetbyName(){
+  local dFileName="" 
+  local dFileId="" 
+  for key in $($(echo getAssetsDescription $1) | $JSON_SH -b | cut -s -d "." -f 1 | sed -e "s/\[//g" | uniq); 
+  do
+    dFileName=$(getDataField "$github_answer" "${key}.name")
+    if [ "$dFileName" == "$2" ]; then
+      dFileId=$(getDataField "$github_answer" "${key}.id")
+      curl --user ${LOGIN}:${TOKEN} \
+           --request DELETE \
+           --output "$github_answer" \
+           --silent \
+           --data @- \
+           https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases/assets/$dFileId <<END
+END
+      return 0
+    fi
+  done
+  return 1
+}
+
+# --------
+# FUNCTION: delete a file on remote github repository
+#   arg1: github release id
+#   arg2: file name to delete
+#   return: nothing
+function deleteAsset(){
+  infoMsg "Deleting $2"
+  if $(deleteAssetbyName "$1" "$2"); 
+    then 
+      infoMsg "  deleted."; 
+    else 
+      errorMsg "  not deleted (maybe not found)"; 
+  fi
+}
+
+# --------
+# FUNCTION: upload a file to github
+#   arg1: github release id
+#   arg2: file to upload
+#   return: nothing
+#   throw: exit application if file cannot be found of if upload failed
+function uploadAsset(){
+  local release_desc=""
+  local tmpFile=""
+  local dField=""
+  local dField2=""
+  local upURL=""
+  local upFile=""
+  local upBaseName=""
+  
+  # Connect github to get upload_url from release description
+  release_desc=$(getGithubReleaseDescription $1)
+  tmpFile="zmtp.json"
+  echo $release_desc > $tmpFile
+  dField=$(getDataField "$tmpFile" "upload_url")
+  rm -f $tmpFile
+  # Connect github to upload a file (binary mode only)
+  upURL=$(echo $dField | cut -d "{" -f 1)
+  upURL="${upURL}?name="
+  upFile=$2
+  infoMsg "Uploading files on github for release $1"
+  infoMsg "Upload URL: ${upURL}"
+  infoMsg "  uploading file: ${upFile}"
+  upBaseName=$(basename $upFile)
+  curl --user ${LOGIN}:${TOKEN} \
+     --request POST \
+     --silent \
+     --output "$github_answer" \
+     --header "Content-Type: application/octet-stream" \
+     --data-binary @${upFile} \
+     ${upURL}${upBaseName} <<END
+END
+
+  dField=$(getDataField "$github_answer" "state")
+  if [ ! "$dField" == "uploaded" ]; then
+	  dField=$(getDataField "$github_answer" "message")
+	  dField2=$(getDataField "$github_answer" "errors.0.code")
+	  throw "/!\ Cannot upload file. ${dField}. ${dField2}."
+  fi
+  infoMsg "    uploaded."
+}
+
+# --------
+# FUNCTION: upload a file to github
+#   arg1: tag name
+#   arg2: release description (optional)
+#   return: nothing
+#   throw: exit if tag already exist as a release on github side, or if release 
+#          creation failed.
+function createRelease(){
+  local release_desc="new release"
+  local dField=""
+  # Connect github to create release
+  infoMsg "Connecting github to create release: $1"
+
+  if [ $# -eq 2 ]; then
+    release_desc=$2 
+  fi
+  curl --user ${LOGIN}:${TOKEN} \
+     --request POST \
+     --output "$github_answer" \
+     --silent \
+     --data @- \
+     https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases <<END
+{
+ "tag_name": "$1",
+ "target_commitish": "master",
+ "name": "$1",
+ "body": "$release_desc",
+ "draft": false,
+ "prerelease": false
+}
+END
+
+  #do we find that release ?
+  dField=$(getDataField "$github_answer" "errors.0.code")
+  if [ "$dField" == "already_exists" ]; then
+	  throw "/!\ Release ${1} already exists, cannot create it again."
+  fi
+
+  #if created, we should have a github ID, show it!
+  dField=$(getDataField "$github_answer" "id")
+  if [ ! -z "$dField" ]; then
+	  infoMsg "  created with github ID: $dField"
+  else
+    dField=$(getDataField "$github_answer" "message")
+	  throw "  Failed. $dField"
+  fi
+}
+
+# --------
+# FUNCTION: delete a github release
+# !!!! se with caution: there is no undo !!!!
+# arg1: github release id
+# return: nothing
+function deleteRelease(){
+  infoMsg "Deleting github release: $1"
+  curl --user ${LOGIN}:${TOKEN} \
+       --request DELETE \
+       --output "$github_answer" \
+       --silent \
+       --data @- \
+       https://api.github.com/repos/${OWNER}/${REPOSITORY}/releases/${1} <<END
+END
+  infoMsg "  done."
+}
+
+# --------
+# FUNCTION: check if mandatory arguments are provided
+#  args: none
+#  return: nothing
+#  throw: exit application if value is empty
+function checkMandatoryArg(){
+  local params=( "-l" "-t" "-o" "-r" "-c" )
+  local vars=( "$LOGIN" "$TOKEN" "$OWNER" "$REPOSITORY" "$COMMAND" )
+
+  for ((i=0;i<${#params[@]};++i)); do
+    #printf "  %s %s\n" "${params[i]}" "${vars[i]}"
+    if [ -z "${vars[i]}" ]; then
+      throw "/!\ Missing mandatory argument: ${params[i]}"
+    fi
+  done
+}
+
+# --------
+# FUNCTION: check if command is valid
+#  arg1: command name (a string)
+#  return: nothing
+#   throw: exit application if value is unknown
+function checkCommand(){
+  local cmds=( "create" "flist" "rlist" "upload" "delete" "info" "erase")
+  
+  if [[ "${cmds[*]}" =~ "$1" ]]; then
+    return 0
+  fi
+  throw "/!\ Unknown command: '$1'. Valid command is one of: ${cmds[*]}"
+}
+
+# --------
+# FUNCTION: check if we have a git tag for commands that require it
+function checkTag(){
+  if [ -z "$TAG" ]; then
+    throw "/!\ Missing mandatory argument: -d"
+  fi
+}
+
+# --------
+# FUNCTION: check if we have some files for command delete/upload
+#  arg1: command name (a string)
+#  arg2: a string containing some file names
+#  return: nothing
+#   throw: exit application if we do not provide some files for commands delete/upload
+function checkFileList(){
+  local cmds=( "upload" "delete")
+  
+  if [[ "${cmds[*]}" =~ "$1" ]]; then
+    if [ -z "$2" ]; then
+      throw "/!\ no file(s) provided for command: $1"
+    fi
+    for fname in $2
+    do
+      if [ ! -f "$fname" ]; then
+        throw "/!\ not a file: $fname"
+      fi
+    done
+  fi
+}
+
+# ========================================================================================
+# Section : tips and tricks...
+
+# these two lines from solution 12 on http://unix.stackexchange.com/questions/48533/exit-shell-script-from-a-subshell
+# to enable exit to work within the throw() method.
+set -E
+trap '[ "$?" -ne 77 ] || exit 77' ERR
+
diff --git a/gatb-core/scripts/github_release_manager.sh b/gatb-core/scripts/github_release_manager.sh
new file mode 100755
index 0000000..b7af9bf
--- /dev/null
+++ b/gatb-core/scripts/github_release_manager.sh
@@ -0,0 +1,142 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# Github management script.
+#
+# Script relying on Github API v3, as described in:
+# https://developer.github.com/v3/repos/releases/
+#
+# This script can be used either as a command-line tool (use -h to get help) or as an API.
+# For the latter use, see github_release_api.sh script.
+#
+# Author: Patrick Durand, Inria
+# Created: December 2015
+#*****************************************************************************************
+
+# ========================================================================================
+# Section: include API
+script_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+. $script_dir/github_release_api.sh
+
+# ========================================================================================
+# Section: utility function declarations
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n$0: a tool to handle github release management using github/api v3.\n\n"
+  printf "usage: $0 [-h] [-s] -l <login> -t <token> -o <owner> -r <repository> [-d <git_tab>] [-m <message>] -c <command> [file ...]\n\n"
+  printf "Credential parameters used to access remote github repository:\n"
+  printf "  -l <login> -t <token> -o <owner> -r <repository> \n"
+  printf "\n"
+  printf "Release identification:\n"
+  printf "  -d <git_tab>\n"
+  printf "\n"
+  printf "Release managment commands are provided using:\n"
+  printf "  -c <command> command to execute.\n"
+  printf "   'command' is one of create, list, upload, delete, info.\n"
+  printf "   create: create a new release.\n"
+  printf "    flist: list files available for an existing release.\n"
+  printf "   upload: upload file(s) to an existing release.\n"
+  printf "   delete: permanently delete remote file(s) from an existing release.\n"
+  printf "     info: print out some information about an existing release.\n"
+  printf "    erase: permanently delete an existing release. Use with extreme caution!\n"
+  printf "    rlist: list existing releases for a repository.\n"
+  printf "\n"
+  printf "   All commands but 'rlist' require the -d <git_tag>.\n"
+  printf "\n"
+  printf "   Commands 'upload' and 'delete' expect files as remaining command line arguments:\n"
+  printf "       -c upload file1.tgz file2.tgz\n"
+  printf "\n"
+  printf "Notice:\n"
+  printf "   /!\ this script does not handle file name/path containing space characters.\n"
+  printf "\n"
+  printf "Other arguments:\n"
+  printf "  -s turn script to silent mode\n"
+  printf "  -m release message: only used when creating a new release\n"
+  printf "  -h display this message\n"
+	exit 1
+}
+
+# ========================================================================================
+# Section : main
+
+# Prepare arguments for processing
+while getopts shl:t:o:r:c:d:m: opt
+do
+    case "$opt" in
+      s)  SILENT="true";;
+      l)  LOGIN="$OPTARG";;
+      t)  TOKEN="$OPTARG";;
+      o)  OWNER="$OPTARG";;
+      r)  REPOSITORY="$OPTARG";;
+      c)  COMMAND="$OPTARG";;
+      d)  TAG="$OPTARG";;
+      m)  CREATE_MESSAGE="$OPTARG";;
+      h)  help;;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+# remaining arguments, if any, are supposed to be the [file ...] part of the command-line
+FILES=$@
+
+#check we have all required arguments
+checkMandatoryArg
+
+#check the validity of the command name
+checkCommand "$COMMAND"
+
+#we need at least one file for these commands: upload, delete
+checkFileList "$COMMAND" "$FILES"
+
+#execute command
+case "$COMMAND" in
+  info) 
+    checkTag
+    release_id=$(getGithubReleaseId $TAG)
+    infoMsg "Git tag $TAG refers to github release ID: $release_id"
+    echo $(getGithubReleaseDescription $release_id)
+    ;;
+  create)
+    checkTag
+    createRelease $TAG "$CREATE_MESSAGE"
+    ;;
+  upload) 
+    checkTag
+    release_id=$(getGithubReleaseId $TAG)
+    infoMsg "Git tag $TAG refers to github release ID: $release_id"
+    for fname in $FILES
+      do
+        uploadAsset $release_id "$fname"
+      done
+    ;;
+  delete) 
+    checkTag
+    release_id=$(getGithubReleaseId $TAG)
+    infoMsg "Git tag $TAG refers to github release ID: $release_id"
+    for fname in $FILES
+      do
+        deleteAsset $release_id "$fname"
+      done
+    ;;
+  rlist)
+    listReleaseSummary
+    ;;
+  flist) 
+    checkTag
+    release_id=$(getGithubReleaseId $TAG)
+    infoMsg "Git tag $TAG refers to github release ID: $release_id"
+    listAssetSummary $release_id
+    ;;
+  erase) 
+    checkTag
+    release_id=$(getGithubReleaseId $TAG)
+    infoMsg "Git tag $TAG refers to github release ID: $release_id"
+    deleteRelease $release_id
+    ;;
+esac
+
+clean
+
+exit 0
diff --git a/gatb-core/scripts/histodump.sh b/gatb-core/scripts/histodump.sh
new file mode 100755
index 0000000..1440245
--- /dev/null
+++ b/gatb-core/scripts/histodump.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+h5dump -y -d histogram/histogram $1  | grep "[0-9]" | grep -v "[A-Z].*" | paste - - 
diff --git a/gatb-core/scripts/histognuplot.sh b/gatb-core/scripts/histognuplot.sh
new file mode 100755
index 0000000..cea0608
--- /dev/null
+++ b/gatb-core/scripts/histognuplot.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+echo "-----------------------------------------------------------"
+echo "DISPLAY kmers distribution for $1 with gnuplot"
+echo "-----------------------------------------------------------"
+
+h5dump -y -d histogram/histogram $1  | grep "[0-9]" | grep -v "[A-Z].*" | paste - - | gnuplot -p -e 'plot [][0:100] "-" with lines'
diff --git a/gatb-core/scripts/json-v2.sh b/gatb-core/scripts/json-v2.sh
new file mode 100755
index 0000000..2b5888c
--- /dev/null
+++ b/gatb-core/scripts/json-v2.sh
@@ -0,0 +1,205 @@
+#!/bin/bash
+
+# from http://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools
+# we found: https://github.com/dominictarr/JSON.sh
+# This is the original JSON.sh (commit ed3f9dd) retreived on Dec 11,2015
+# with an update: line 180:
+#  [ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value"
+# transformed to:
+#  [ "$print" -eq 1 ] && printf "[%s]\t%s\n" $(echo "$jpath" | sed -e "s/\"//g" | sed -e "s/,/./g") "$value"
+# to remove quotes and replace , by . in the keys
+
+throw () {
+  echo "$*" >&2
+  exit 1
+}
+
+BRIEF=0
+LEAFONLY=0
+PRUNE=0
+NORMALIZE_SOLIDUS=0
+
+usage() {
+  echo
+  echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]"
+  echo
+  echo "-p - Prune empty. Exclude fields with empty values."
+  echo "-l - Leaf only. Only show leaf nodes, which stops data duplication."
+  echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options."
+  echo "-s - Remove escaping of the solidus symbol (stright slash)."
+  echo "-h - This help text."
+  echo
+}
+
+parse_options() {
+  set -- "$@"
+  local ARGN=$#
+  while [ "$ARGN" -ne 0 ]
+  do
+    case $1 in
+      -h) usage
+          exit 0
+      ;;
+      -b) BRIEF=1
+          LEAFONLY=1
+          PRUNE=1
+      ;;
+      -l) LEAFONLY=1
+      ;;
+      -p) PRUNE=1
+      ;;
+      -s) NORMALIZE_SOLIDUS=1
+      ;;
+      ?*) echo "ERROR: Unknown option."
+          usage
+          exit 0
+      ;;
+    esac
+    shift 1
+    ARGN=$((ARGN-1))
+  done
+}
+
+awk_egrep () {
+  local pattern_string=$1
+
+  gawk '{
+    while ($0) {
+      start=match($0, pattern);
+      token=substr($0, start, RLENGTH);
+      print token;
+      $0=substr($0, start+RLENGTH);
+    }
+  }' pattern="$pattern_string"
+}
+
+tokenize () {
+  local GREP
+  local ESCAPE
+  local CHAR
+
+  if echo "test string" | egrep -ao --color=never "test" &>/dev/null
+  then
+    GREP='egrep -ao --color=never'
+  else
+    GREP='egrep -ao'
+  fi
+
+  if echo "test string" | egrep -o "test" &>/dev/null
+  then
+    ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
+    CHAR='[^[:cntrl:]"\\]'
+  else
+    GREP=awk_egrep
+    ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
+    CHAR='[^[:cntrl:]"\\\\]'
+  fi
+
+  local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
+  local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
+  local KEYWORD='null|false|true'
+  local SPACE='[[:space:]]+'
+
+  $GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$"
+}
+
+parse_array () {
+  local index=0
+  local ary=''
+  read -r token
+  case "$token" in
+    ']') ;;
+    *)
+      while :
+      do
+        parse_value "$1" "$index"
+        index=$((index+1))
+        ary="$ary""$value" 
+        read -r token
+        case "$token" in
+          ']') break ;;
+          ',') ary="$ary," ;;
+          *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
+        esac
+        read -r token
+      done
+      ;;
+  esac
+  [ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value=
+  :
+}
+
+parse_object () {
+  local key
+  local obj=''
+  read -r token
+  case "$token" in
+    '}') ;;
+    *)
+      while :
+      do
+        case "$token" in
+          '"'*'"') key=$token ;;
+          *) throw "EXPECTED string GOT ${token:-EOF}" ;;
+        esac
+        read -r token
+        case "$token" in
+          ':') ;;
+          *) throw "EXPECTED : GOT ${token:-EOF}" ;;
+        esac
+        read -r token
+        parse_value "$1" "$key"
+        obj="$obj$key:$value"        
+        read -r token
+        case "$token" in
+          '}') break ;;
+          ',') obj="$obj," ;;
+          *) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
+        esac
+        read -r token
+      done
+    ;;
+  esac
+  [ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value=
+  :
+}
+
+parse_value () {
+  local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0
+  case "$token" in
+    '{') parse_object "$jpath" ;;
+    '[') parse_array  "$jpath" ;;
+    # At this point, the only valid single-character tokens are digits.
+    ''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
+    *) value=$token
+       # if asked, replace solidus ("\/") in json strings with normalized value: "/"
+       [ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=${value//\\\//\/}
+       isleaf=1
+       [ "$value" = '""' ] && isempty=1
+       ;;
+  esac
+  [ "$value" = '' ] && return
+  [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1
+  [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1
+  [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1
+  [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \
+    [ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1
+  [ "$print" -eq 1 ] && printf "[%s]\t%s\n" $(echo "$jpath" | sed -e "s/\"//g" | sed -e "s/,/./g") "$value"
+  :
+}
+
+parse () {
+  read -r token
+  parse_value
+  read -r token
+  case "$token" in
+    '') ;;
+    *) throw "EXPECTED EOF GOT $token" ;;
+  esac
+}
+
+if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]);
+then
+  parse_options "$@"
+  tokenize | parse
+fi
diff --git a/gatb-core/scripts/make_official_release.sh b/gatb-core/scripts/make_official_release.sh
new file mode 100755
index 0000000..8f164a2
--- /dev/null
+++ b/gatb-core/scripts/make_official_release.sh
@@ -0,0 +1,171 @@
+#!/bin/bash
+
+#*****************************************************************************************
+# GATB-CORE management script.
+#
+# This script is used to prepare an official release of GATB-CORE library.
+#
+# Usage: run script with -h as argument.
+#
+# Author: Patrick Durand, Inria
+# Created: December 2015
+#*****************************************************************************************
+
+CRED_FILE="$HOME/.gatbcore_manager"
+SILENT="false"
+GH_OWNER="GATB"
+GH_REPO="gatb-core"
+GH_LOGIN=""
+GH_TOKEN=""
+IF_LOGIN="$INRIA_FORGE_LOGIN"          # known inside Jenkins tasks, empty otherwise
+MAJOR_V=""
+MINOR_V=""
+PATCH_V=""
+COMMAND=""
+
+# ========================================================================================
+# Section: utility function declarations
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n[$0]: a tool to prepare an official GATB-CORE release.\n\n"
+  printf "usage: [-h] [-s] [-l <credential_file>] -M <version_major> -m <version_minor> -p <version_patch> -c <command> \n\n"
+  printf "  -l <credential_file> : optional credential file (see below).\n"
+  printf "  -M <tag>             : major release number.\n"
+  printf "  -m <tag>             : minor release number.\n"
+  printf "  -p <tag>             : patch number.\n"
+  printf "  -h                   : this message.\n"
+  printf "  -s                   : silent mode (not set means interactive mode).\n"
+  printf "  -c <command>         : command to execute.\n"
+  printf "   'command' is one of delivery, upload or package.\n"
+  printf "      delivery: makes a full release processing as follows:\n"
+	printf "         1. compile the library on the hosted system using curent source code \n"
+	printf "         2. package library within a tar.gz file \n"
+	printf "         3. tag Inria Forge using release number \n"
+	printf "         4. create a corresponding Github release \n"
+	printf "         5. upload the library binary on Github \n"
+  printf "      upload: runs only steps 1, 2 and 5.\n"
+  printf "      package: runs only steps 1 and 2.\n\n"
+  printf "About the credential file. It is intended to contain login:token pair of values\n"
+  printf "required to connect to remote github repository. Only authorized users are able\n"
+  printf "to use this script to make a release on github.\n"
+  printf "File format is quite simple: it contains two lines:\n"
+  printf "  - first line is:  login=<value>\n"
+  printf "  - second line is: token=<value>\n"
+  printf "where values have to be replaced accordingly.\n"
+  printf "When '-l' argument is not provided, this script looks for a file called \$HOME/.gatbcore_manager\n\n"
+  exit 0
+}
+
+# --------
+# FUNCTION: print out a simple message on stderr 
+function errorMsg(){
+  printf "$* \n" >&2
+}
+
+# --------
+# FUNCTION: check if mandatory arguments are provided
+#  args: none
+#  return: nothing
+#  exit application if value is empty
+function checkMandatoryArg(){
+  local params=( "-M" "-m" "-p" "-c" )
+  local vars=( "$MAJOR_V" "$MINOR_V" "$PATCH_V" "$COMMAND" )
+
+  for ((i=0;i<${#params[@]};++i)); do
+    if [ -z "${vars[i]}" ]; then
+      errorMsg "/!\ Missing mandatory argument: ${params[i]}"
+      exit 1
+    fi
+  done
+}
+
+# --------
+# FUNCTION: read the credential file to retrieve github login:token pair of values
+#  args: none
+#  return: nothing
+#  exit application if credential file is missing or if login/token cannot be retrieved
+function readCrendentialFile(){
+  local value=""
+  if [ ! -e $CRED_FILE ];then
+    errorMsg "/!\ Crendential file not found: $CRED_FILE\n"
+    exit 2
+  fi
+  GH_LOGIN=$( cat $CRED_FILE | grep "login" | cut -d = -s -f 2)
+  if [ -z $GH_LOGIN ]; then
+    errorMsg "/!\ Missing 'login' field. Check your credential file: $CRED_FILE"
+    exit 3
+  fi
+  GH_TOKEN=$( cat $CRED_FILE | grep "token" | cut -d = -s -f 2)
+  if [ -z $GH_TOKEN ]; then
+    errorMsg "/!\ Missing 'token' field. Check your credential file: $CRED_FILE"
+    exit 4
+  fi
+}
+
+# --------
+# FUNCTION: check if command is valid
+#  arg1: command name (a string)
+#  return: nothing
+#   exit application if value is unknown
+function checkCommand(){
+  local cmds=( "delivery" "upload" "package")
+  
+  if [[ "${cmds[*]}" =~ "$1" ]]; then
+    return 0
+  fi
+  errorMsg "/!\ Unknown command: '$1'. Valid command is one of: ${cmds[*]}"
+  exit 5
+}
+
+# ========================================================================================
+# Section : main
+
+# Prepare arguments for processing
+while getopts hlsM:m:p:c: opt
+do
+    case "$opt" in
+      s)  SILENT="true";;
+      l)  CRED_FILE="$OPTARG";;
+      M)  MAJOR_V="$OPTARG";;
+      m)  MINOR_V="$OPTARG";;
+      p)  PATCH_V="$OPTARG";;
+      c)  COMMAND="$OPTARG";;
+      h)  help;;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+# Ask users if we can go ahead
+if [ "$SILENT" == "false" ]; then
+  echo "***"
+  echo "*** Making official GATB-CORE library"
+  echo "***"
+  echo " "
+  echo ">>>   DID YOU CHECK THAT EVERYTHING IS COMMITED TO GIT ?   <<<"
+  echo " "
+  echo " "
+  echo "If ok, press enter to continue... (CTRL+C to abort)"
+  echo " "
+  read 
+fi
+
+#check provided values. Exit script if something is wrong.
+readCrendentialFile
+checkMandatoryArg
+checkCommand $COMMAND
+
+#now, start the whole job
+script_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+
+cd $script_dir/..
+rm -rf build
+mkdir build
+cd build
+
+cmake -DGH_LOGIN=$GH_LOGIN -DGH_TOKEN=$GH_TOKEN -DGH_OWNER=$GH_OWNER \
+  -DGH_REPO=$GH_REPO -DMAJOR=$MAJOR_V -DMINOR=$MINOR_V -DPATCH=$PATCH_V \
+  -DSILENT_MODE=$SILENT -DCPACK_USER_NAME=$IF_LOGIN ..
+
+make $COMMAND
diff --git a/gatb-core/scripts/parse_gcc_output.py b/gatb-core/scripts/parse_gcc_output.py
new file mode 100755
index 0000000..f97fa0d
--- /dev/null
+++ b/gatb-core/scripts/parse_gcc_output.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+#usage: make -j 4 2> MAKE ; cat MAKE | python parse_gcc_output.py | less -R
+import sys,fileinput
+
+class bcolors:
+    HEADER = '\033[95m'
+    OKBLUE = '\033[94m'
+    OKGREEN = '\033[92m'
+    WARNING = '\033[93m'
+    FAIL = '\033[91m'
+    ENDC = '\033[0m'
+    BOLD = '\033[1m'
+    UNDERLINE = '\033[4m'
+
+import re
+
+for line in fileinput.input():
+    line = line.replace("gatb::core::debruijn::impl::Edge_t<gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::IntegerTemplate<boost::mpl::vector4<mpl_::int_<32>, mpl_::int_<64>, mpl_::int_<96>, mpl_::int_<128> > > > >", bcolors.OKBLUE + "Edge" + bcolors.ENDC) # default KSIZE_LIST
+    line = line.replace("gatb::core::debruijn::impl::Edge_t<gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::IntegerTemplate<boost::mpl::vector1<mpl_::int_<32> > > > >", bcolors.OKBLUE + "Edge" + bcolors.ENDC) # when compiled with KSIZE_LIST=32
+    line = line.replace("gatb::core::debruijn::impl::Edge_t<gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::LargeInt<1> > >", bcolors.OKBLUE + "EdgeFast<1>" + bcolors.ENDC)
+
+    line = line.replace("gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::IntegerTemplate<boost::mpl::vector4<mpl_::int_<32>, mpl_::int_<64>, mpl_::int_<96>, mpl_::int_<128> > > >", bcolors.OKBLUE + "Node" + bcolors.ENDC)
+    line = line.replace("gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::IntegerTemplate<boost::mpl::vector1<mpl_::int_<32> > > >", bcolors.OKBLUE + "Node" + bcolors.ENDC)
+    line = line.replace("gatb::core::debruijn::impl::Node_t<gatb::core::tools::math::LargeInt<1> >", bcolors.OKBLUE + "NodeFast<1>" + bcolors.ENDC)
+
+    line = line.replace("boost::variant<boost::detail::variant::over_sequence<boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<128ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<96ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<64ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<32ul>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0> >> ", bcolors.OKBLUE + "GraphDataVariant" + bcolors.ENDC)
+    line = line.replace("boost::variant<boost::detail::variant::over_sequence<boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<32ul>, boost::mpl::vector0<mpl_::na>, 0> >>", bcolors.OKBLUE + "GraphDataVariant" + bcolors.ENDC)
+    line = line.replace("boost::variant<gatb::core::debruijn::impl::GraphData<32ul>>",  bcolors.OKBLUE + "GraphDataVariantFast<1>" + bcolors.ENDC)
+    line = line.replace("boost::variant<gatb::core::debruijn::impl::GraphData<32ul> >", bcolors.OKBLUE + "GraphDataVariantFast<1>" + bcolors.ENDC)
+
+    line = line.replace("boost::variant<boost::detail::variant::over_sequence<boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<128ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<96ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<64ul>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<32ul>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0> > >", bcolors.OKBLUE + "GraphDataVariant" + bcolors.ENDC)
+    line = line.replace("boost::variant<boost::detail::variant::over_sequence<boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<128>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<96>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<64>, boost::mpl::v_item<gatb::core::debruijn::impl::GraphData<32>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0> >",  bcolors.OKBLUE + "GraphDataVariant" + bcolors.ENDC) # clang flavor
+
+    line = line.replace("gatb::core::tools::math::LargeInt<1>", bcolors.OKBLUE + "LargeInt<1>" + bcolors.ENDC)
+    line = line.replace("gatb::core::debruijn::impl::GraphTemplate", bcolors.OKBLUE + "GraphTemplate" + bcolors.ENDC)
+    line = line.replace("gatb::core::debruijn::impl::GraphUnitigsTemplate", bcolors.OKBLUE + "GraphUnitigsTemplate" + bcolors.ENDC)
+
+    line = line.replace("undefined reference to ", bcolors.FAIL + "undefined reference to " + bcolors.ENDC)
+    line = line.replace("In function", bcolors.WARNING + "In function" + bcolors.ENDC)
+    line = line.replace("gatb::core::tools::math::IntegerTemplate<boost::mpl::vector4<mpl_::int_<32>, mpl_::int_<64>, mpl_::int_<96>, mpl_::int_<128> > > ", bcolors.OKBLUE + "Integer" + bcolors.ENDC)
+    line = re.sub(r"([^\:]*):\(.text.[^\)]*\)",  bcolors.OKGREEN + r"\1:(..)" + bcolors.ENDC,line)
+
+    sys.stdout.write(line)
+
diff --git a/gatb-core/scripts/test-github_release_api.sh b/gatb-core/scripts/test-github_release_api.sh
new file mode 100755
index 0000000..94b046e
--- /dev/null
+++ b/gatb-core/scripts/test-github_release_api.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+#*****************************************************************************************
+# Basic test suite for Github management script.
+#
+# Author: Patrick Durand, Inria
+# Created: December 2015
+#*****************************************************************************************
+
+# ========================================================================================
+# Include the API
+script_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
+. $script_dir/github_release_api.sh
+
+# ========================================================================================
+# Section: utility function declarations
+# --------
+# FUNCTION: display help message
+function help(){
+	printf "\n$0: a tool to test github_release_api.\n\n"
+  printf "usage: $0 [-h] -l <login> -t <token> -o <owner> -r <repository> -d <git_tab> -c <command> file ...\n\n"
+	exit 1
+}
+
+# ========================================================================================
+# Section: main
+
+# Prepare arguments for processing
+while getopts shl:t:o:r:c:d:m: opt
+do
+    case "$opt" in
+      l)  LOGIN="$OPTARG";;
+      t)  TOKEN="$OPTARG";;
+      o)  OWNER="$OPTARG";;
+      r)  REPOSITORY="$OPTARG";;
+      c)  COMMAND="$OPTARG";;
+      d)  TAG="$OPTARG";;
+      m)  CREATE_MESSAGE="$OPTARG";;
+      h)  help;;
+      \?)	help;;
+    esac
+done
+shift `expr $OPTIND - 1`
+
+# remaining arguments, if any, are supposed to be the [file ...] part of the command-line
+FILES=$@
+
+echo "> Test createRelease()"
+createRelease $TAG "my new description for $TAG"
+
+echo "> Test getGithubReleaseId()"
+release_id=$(getGithubReleaseId $TAG)
+echo "$release_id"
+
+echo "> Test getGithubReleaseDescription()"
+echo $(getGithubReleaseDescription $release_id)
+
+echo "> Test getAssetsDescription()"
+assetList=$(getAssetsDescription $release_id)
+echo $assetList
+
+echo "> Test listAssetSummary()"
+listAssetSummary $release_id
+
+echo "> Test uploadAsset()"
+for fname in $FILES
+  do
+    uploadAsset $release_id "$fname"
+  done
+
+echo "> Test deleteAsset()"
+for fname in $FILES
+  do
+    deleteAsset $release_id "$fname"
+  done
+
+echo "> Test deleteRelease"
+deleteRelease $release_id
+
diff --git a/gatb-core/src/CMakeLists.txt b/gatb-core/src/CMakeLists.txt
new file mode 100644
index 0000000..3ebbdc2
--- /dev/null
+++ b/gatb-core/src/CMakeLists.txt
@@ -0,0 +1,101 @@
+################################################################################
+#  KMER SIZE DEFINITION 
+################################################################################
+
+# We define the default values for kmer sizes.
+if (NOT KSIZE_DEFAULT_LIST) # only if the tool cmake didn't override it
+    #list (APPEND KSIZE_DEFAULT_LIST  32   64)
+    list (APPEND KSIZE_DEFAULT_LIST  32   64   96  128)
+    #list (APPEND KSIZE_DEFAULT_LIST  32   64   96  128  160  192  224  256)
+endif()
+
+# We use a default list of kmer sizes if no one is provided by the user (via cmake -dKSIZE_LIST command)
+if (NOT KSIZE_LIST)
+    set (gatb-core-klist ${KSIZE_DEFAULT_LIST})
+else()
+    string(REPLACE " " ";" gatb-core-klist ${KSIZE_LIST})
+endif()
+
+set (gatb-core-klist ${gatb-core-klist} PARENT_SCOPE)
+
+# We set all KSIZE_x variables (used in config.in files)
+set (idx 0)
+FOREACH (ksize ${gatb-core-klist})
+    MATH(EXPR idx "${idx}+1")
+    # We set the default value to KSIZE_i
+    SET (KSIZE_${idx} ${ksize}) 
+ENDFOREACH()
+
+set (idx 0)
+FOREACH (ksize ${gatb-core-klist})
+    list (APPEND KSIZE_STRING_TYPE_TMP "boost::mpl::int_<${ksize}>")
+ENDFOREACH()
+
+string (REPLACE ";" "," KSIZE_STRING_COMMA "${gatb-core-klist}")
+string (REPLACE ";" " " KSIZE_STRING_SPACE "${gatb-core-klist}")
+string (REPLACE ";" "," KSIZE_STRING_TYPE  "${KSIZE_STRING_TYPE_TMP}")
+
+# We dump some information
+MESSAGE ("-- OPTIMIZED KMER SIZES INTERVALS ARE " ${KSIZE_STRING_SPACE} " <-- max supported kmer size without recompilation")
+
+
+################################################################################
+#  CONFIGURATION FILE
+################################################################################
+
+# We build the file holding system information
+configure_file (
+    ${PROJECT_SOURCE_DIR}/src/gatb/system/api/build_info.hpp.in
+    ${PROJECT_BINARY_DIR}/include/gatb/system/api/build_info.hpp
+)
+# File holding configuration macros
+configure_file (
+    ${PROJECT_SOURCE_DIR}/src/gatb/system/api/config.hpp.in
+    ${PROJECT_BINARY_DIR}/include/gatb/system/api/config.hpp
+)
+
+# We define the list of files that need template specializations for each possible kmer size
+file (GLOB_RECURSE  TemplateFiles  ${PROJECT_SOURCE_DIR}/src/gatb/template/*.cpp.in)
+
+FOREACH (KSIZE ${gatb-core-klist})
+
+    FOREACH (template ${TemplateFiles})
+
+        get_filename_component (template_out ${template} NAME)
+        
+        configure_file (
+            ${template}
+            ${PROJECT_BINARY_DIR}/src/gatb/template/${template_out}_${KSIZE}.cpp
+        )
+
+    ENDFOREACH ()
+
+ENDFOREACH ()
+
+################################################################################
+#  LIBRARY GENERATION 
+################################################################################
+
+file (GLOB_RECURSE  ComponentFiles  *  ${PROJECT_BINARY_DIR}/src/gatb/*.cpp)
+
+# We add the compilation options for the library
+add_definitions (${gatb-core-flags})
+
+include_directories (${gatb-core-includes})
+
+add_library    (gatbcore-static  STATIC  ${ComponentFiles} )
+#add_library   (gatbcore-dynamic SHARED  ${ComponentFiles} )
+
+set_target_properties  (gatbcore-static   PROPERTIES OUTPUT_NAME  gatbcore  clean_direct_output 1)
+#set_target_properties (gatbcore-dynamic  PROPERTIES OUTPUT_NAME  gatbcore  clean_direct_output 1)
+
+################################################################################
+#  INSTALLATION 
+################################################################################
+
+# We install the libraries
+IF (NOT DEFINED GATB_CORE_INSTALL_EXCLUDE)
+    install (TARGETS gatbcore-static DESTINATION lib)
+    install (DIRECTORY ${PROJECT_SOURCE_DIR}/src/ DESTINATION include FILES_MATCHING PATTERN "*.hpp" PATTERN "*.tpp" PATTERN "*.pri" PATTERN "*.h")
+    install (FILES ${PROJECT_BINARY_DIR}/include/gatb/system/api/config.hpp DESTINATION include/gatb/system/api/)
+ENDIF ()
diff --git a/gatb-core/src/gatb/bank/api/IAlphabet.hpp b/gatb-core/src/gatb/bank/api/IAlphabet.hpp
new file mode 100644
index 0000000..69ef149
--- /dev/null
+++ b/gatb-core/src/gatb/bank/api/IAlphabet.hpp
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IAlphabet.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface definition for genomic alphabets
+ */
+
+#ifndef _GATB_CORE_BANK_IALPHABET_HPP_
+#define _GATB_CORE_BANK_IALPHABET_HPP_
+
+/********************************************************************************/
+
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace bank      {
+/********************************************************************************/
+
+/* Define the kind of the underlying alphabet. For instance, it could be the kind of sequences
+ * (protein, ADN...) read from a FASTA file.
+ */
+class IAlphabet
+{
+public:
+
+    /** Define the different kinds of alphabets. */
+    enum Kind_e
+    {
+        /** Amino acid alphabet */
+        AMINO_ACID,
+        /** Nucleic acid alphabet */
+        NUCLEIC_ACID
+    };
+
+    /** \return the kind of the alphabet. */
+    virtual Kind_e getKind () = 0;
+
+    /** Return the letters that make the alphabet. For instance, the nucleic alphabet should return "ACGT".
+     * \return the alphabet letters.*/
+    virtual std::string  getLetters () = 0;
+
+    /** Destructor. */
+    virtual ~IAlphabet () {}
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IALPHABET_HPP_ */
diff --git a/gatb-core/src/gatb/bank/api/IBank.hpp b/gatb-core/src/gatb/bank/api/IBank.hpp
new file mode 100644
index 0000000..2d51986
--- /dev/null
+++ b/gatb-core/src/gatb/bank/api/IBank.hpp
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IBank.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface definition for genomic databases management
+ */
+
+#ifndef _GATB_CORE_BANK_IBANK_HPP_
+#define _GATB_CORE_BANK_IBANK_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/bank/api/Sequence.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+/** \brief Core package of the GATP project.
+ *
+ * The gatb::core package holds all the fundamental packages needed for writting
+ * assembly algorithms.
+ *
+ * It holds some generic tools, like operating system abstraction, collections management or design patterns
+ * concerns. It also holds recurrent needs as reading genomic banks, handling kmers and so on.
+ */
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace bank      {
+/********************************************************************************/
+
+/** \brief Interface for what we need to read genomic databases.
+ *
+ * The IBank interface provides means to:
+ *  - read sequences from some container.
+ *  - insert sequences into some container.
+ *
+ * One typical implementation of this interface is a FASTA bank parser.
+ *
+ * The key point here is that clients should use this interface instead of specific
+ * implementations, wherever they need to get nucleotides sequences from some container.
+ *
+ * By doing this, such clients will support many bank formats (according to the fact that
+ * a IBank implementation provides such a service). They will also support "fake" banks, for
+ * instance random generated sequences or any kind of synthetic data.
+ *
+ * From a design point of view, IBank is an Iterable (something we can get iterators from) and
+ * a Bag (something we can insert items into); in both cases, the item type is Sequence
+ *
+ * Some kind of factory method exists for using IBank instances: this is the gatb::core::bank::impl::Bank
+ * class. This class allows to get a IBank instance by providing an URI. The actual implementation
+ * class of the IBank interface is computed by analyzing the URI string itself, or the content of the
+ * file defined by the URI. So, tools developers should in general get IBank instances this way, so their
+ * tool would support different kind of input bank formats.
+ *
+ * \see Sequence
+ * \see IBankFactory
+ * \see impl::Bank
+ */
+class IBank : public tools::collections::Iterable<Sequence>, public tools::collections::Bag<Sequence>
+{
+public:
+
+    /** Get an unique identifier for the bank (could be the URI of a FASTA file for instance).
+     * \return the identifier */
+    virtual std::string getId () = 0;
+
+	/** In case of a composite bank, return the id of bank i
+	 * \return id of sub bank i */
+	virtual std::string getIdNb (int i) = 0;
+
+	
+	/** In case of a composite bank,
+	 * \return estimation of the number of sequences of sub bank i */
+	virtual int64_t estimateNbItemsBanki (int i) = 0;
+	
+    /** \copydoc tools::collections::Iterable::iterator */
+    virtual tools::dp::Iterator<Sequence>* iterator () = 0;
+
+    /** \copydoc tools::collections::Bag::insert */
+    virtual void insert (const Sequence& item) = 0;
+
+    /** Return the size of the bank (comments + data)
+     *
+     * The returned value may be an approximation in some case. For instance, if we use
+     * a zipped bank, an implementation may be not able to give accurate answer to the
+     * size of the original file.
+     *
+     * \return the bank size in bytes.*/
+    virtual u_int64_t getSize () = 0;
+
+    /** In case of a composite bank, return the number of sub banks.
+     * \return number of sub banks. */
+    virtual size_t getCompositionNb () = 0;
+
+    /** Give an estimation of sequences information in the bank.
+     * \param[out] number : sequences number
+     * \param[out] totalSize : sequences size (in bytes)
+     * \param[out] maxSize : max size size (in bytes)
+     */
+    virtual void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize) = 0;
+
+    /** Shortcut to 'estimate' method.
+     * \return estimation of the number of sequences */
+    virtual int64_t estimateNbItems () = 0;
+
+    /** Shortcut to 'estimate' method.
+     * \return estimation of the size of sequences */
+    virtual u_int64_t estimateSequencesSize () = 0;
+
+    /** \return the number of sequences read from the bank for computing estimated information */
+    virtual u_int64_t getEstimateThreshold () = 0;
+
+    /** Set the number of sequences read from the bank for computing estimated information
+     * \param[in] nbSeq : the number of sequences to be read.*/
+    virtual void setEstimateThreshold (u_int64_t nbSeq) = 0;
+
+    /** Remove physically the bank. This method will have non-empty implementation for banks using
+     * file system for instance. */
+    virtual void remove () = 0;
+
+    /** Method that may be called when the bank is done. It is called by BankFasta destructor for instance. It will close fclose() or something equivalent. You don't need to call this function yourself. */
+    virtual void finalize () = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Factory for IBank.
+ *
+ * This interface provides a factory method that builds a IBank* instance given some
+ * identifier.
+ *
+ * Such an identifier can be an uri (FASTA banks for instance), or any mechanism allowing
+ * to retrieve enough information for creating instances of a specific IBank implementation.
+ *
+ * Actually, the gatb::core::bank::impl::Bank class relies on a list of registered IBankFactory
+ * instances.
+ */
+class IBankFactory : public system::SmartPointer
+{
+public:
+
+    /** Create an instance of IBank for a given uri.
+     * \param[in] uri : the uri used for create the bank
+     * \return the IBank instance. */
+    virtual IBank* createBank (const std::string& uri) = 0;
+};
+
+/********************************************************************************/
+
+/** We define a type for bank identifiers (as integers) when dealing with several banks.*/
+typedef u_int16_t BankIdType;
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IBANK_HPP_ */
diff --git a/gatb-core/src/gatb/bank/api/Sequence.hpp b/gatb-core/src/gatb/bank/api/Sequence.hpp
new file mode 100644
index 0000000..fbed862
--- /dev/null
+++ b/gatb-core/src/gatb/bank/api/Sequence.hpp
@@ -0,0 +1,276 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Sequence.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Definition of what a genomic sequence is.
+ */
+
+#ifndef _GATB_CORE_BANK_SEQUENCE_HPP_
+#define _GATB_CORE_BANK_SEQUENCE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/api/Data.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+/********************************************************************************/
+
+/** \brief Structure holding genomic information.
+ *
+ * A sequence holds several data :
+ *  - comment (as a text)
+ *  - genomic data
+ *  - quality information (for fastq format, empty in other cases).
+ *
+ *  The genomic data is hold in a tools::misc::Data attribute and is supposed to
+ *  hold nucleotides.
+ *
+ *  Actually, the inner format may be of different kind (ASCII, INTEGER, BINARY) and
+ *  depends on the type of the bank that provides Sequence objects. For instance:
+ *      - a FASTA bank will provide Sequence instances whose data is in ASCII
+ *      - a BINARY bank will provide Sequence instances whose data is in BINARY
+ *
+ *  The buffer holding the nucleotides is located in the tools::misc::Data attribute, so have a look
+ *  there to have further details on where the buffer can be allocated. Note just here
+ *  that the buffer could be stored in the Data object itself, or may be a reference to a
+ *  buffer allocated in another place.
+ *
+ *  The class Sequence is closely related to the IBank interface.
+ *
+ *  Note that this class should not be instantiated directly by end users; it is more likely that end users will
+ *  receive such objects through an iteration from a bank.
+ *
+ * Example of use:
+ * \snippet bank16.cpp  snippet16_seq
+ *
+ *  \see IBank
+ */
+struct Sequence
+{
+    /** Constructor.
+     * \param[in] encoding : encoding scheme of the genomic data of the sequence */
+    Sequence (tools::misc::Data::Encoding_e encoding = tools::misc::Data::ASCII) : _data(encoding), _index(0)  {}
+
+    /** Constructor. For testing mainly : allows to set the genomic data through an ascii representation.
+     * For instance, one can provide "ACTTACGCAGAT" as argument of this constructor.
+     * \param[in] seq : the genomic data as an ascii string */
+    Sequence (char* seq) : _data(seq), _index(0)  {}
+
+    /** Destructor. */
+    virtual ~Sequence ()  { }
+
+    /** \return description of the sequence */
+    virtual const std::string& getComment ()  const  { return _comment; }
+
+    /** \return description of the sequence until first space */
+    virtual const std::string getCommentShort ()  const  { return _comment.substr(0, _comment.find(' ')); }
+
+    /** \return quality of the sequence (set if the underlying bank is a fastq file). */
+    virtual const std::string& getQuality ()  const  { return _quality; }
+    
+    /** \return the data as a Data structure. */
+    virtual tools::misc::Data& getData () { return _data; }
+
+    /** Return the raw buffer holding the genomic data. IMPORTANT : getting genomic data this way
+     * implies that the user knows what is the underlying encoding scheme in order to decode it
+     * (may be ASCII, INTEGER or BINARY)
+     * \return buffer holding the genomic data as a raw buffer. */
+    virtual char* getDataBuffer ()  const { return _data.getBuffer(); }
+
+    /** \return number of nucleotides in the sequence. */
+    virtual size_t getDataSize () const  { return _data.size(); }
+
+    /** \return encoding scheme of the data. */
+    virtual tools::misc::Data::Encoding_e getDataEncoding () const  { return _data.getEncoding(); }
+
+    /** Return the index of the sequence. It may be the index of the sequence in the database that
+     * holds the sequence.
+     * \return index of the sequence. */
+    virtual size_t getIndex () const  { return _index; }
+
+    /** Set the genomic data as a reference on a Data object (more precisely on a range in this data).
+     * This method may be used when one wants that the genomic data of the sequence points to an
+     * already existing buffer of nucleotides, which means that the sequence doesn't allocate any
+     * memory for storing the genomic data, it only relies on data stored somewhere else.
+     * This is mainly a shortcut to the gatb::core::tools::misc::Data::setRef method.
+     * \param[in] ref : the referred Data instance holding the genomic data
+     * \param[in] offset : starting index in the referred data
+     * \param[in] length : length of the genomic data of the current sequence. */
+    void setDataRef (tools::misc::Data* ref, int offset, int length)  {  _data.setRef (ref, offset, length);  }
+
+    /** Set the index of the sequence. Typically, it should be called by a IBank iterator that knows what is
+     * the index of the currently iterated sequence.
+     * \param[in] index : index of the sequence */
+    void setIndex (size_t index)  { _index = index; }
+
+    /** Get an ascii representation of the sequence. IMPORTANT ! this implementation supposes that the
+     * format of the Data attribute is ASCII. No conversion is done in case of other formats.
+     * \return the ascii representation of the sequence. */
+    std::string toString () const { return std::string (this->getDataBuffer(), this->getDataSize()); }
+
+    /** Set the comment of the sequence (likely to be called by a IBank iterator).
+     * \param[in] cmt : comment of the sequence */
+    void setComment (const std::string& cmt)  { _comment = cmt; }
+
+    /** Set the quality string of the sequence (likely to be called by a fastq iterator).
+     * \param[in] qual : quality string of the sequence. */
+    void setQuality (const std::string& qual)  { _quality = qual; }
+
+    /** Comment attribute (note: should be private with a setter and getter). */
+    std::string _comment;
+
+    /** Quality attribute (note: should be private with a setter and getter). */
+    std::string _quality;
+
+private:
+
+    /** Object holding the genomic data of the sequence (ie a succession of nucleotides). */
+    tools::misc::Data _data;
+
+    /** Index of the sequence (likely to be set by a IBank iterator). */
+    size_t _index;
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+//specialization of composite iterator for Sequence, so that the sequence index is correctly computed
+namespace gatb  {
+	namespace core  {
+		namespace tools {
+			namespace dp    {
+				namespace impl  {
+					
+template <>
+class CompositeIterator <bank::Sequence> : public Iterator <bank::Sequence>
+{
+public:
+	
+	/** Constructor.
+	 * \param[in] iterators : the iterators vector
+	 */
+	CompositeIterator (std::vector <Iterator<bank::Sequence>*>&  iterators)
+	: _iterators(iterators), _currentIdx(0), _currentIt(0), _isDone(true)
+	{
+		for (size_t i=0; i<_iterators.size(); i++)  { _iterators[i]->use(); }
+		
+		_currentIt = _iterators[_currentIdx];
+	}
+	
+	/** Destructor. */
+	virtual ~CompositeIterator ()
+	{
+		for (size_t i=0; i<_iterators.size(); i++)  { _iterators[i]->forget(); }
+	}
+	
+	/** \copydoc Iterator::first */
+	void first()
+	{
+		_seqIndex = 0;
+		/** We initialize attributes. */
+		_currentIdx = 0;
+		_isDone     = true;
+		
+		/** We look for the first non finished iterator. */
+		update (true);
+		
+		if (_isDone==false) { _currentIt->item().setIndex(_seqIndex); }
+
+	}
+	
+	/** \copydoc Iterator::next */
+	void next()
+	{
+		_currentIt->next();
+		_isDone = _currentIt->isDone();
+		
+		if (_isDone == true)  {  update (false);  }
+		_seqIndex++;
+		
+		if (_isDone==false) { _currentIt->item().setIndex(_seqIndex); }
+
+	}
+	
+	/** \copydoc Iterator::isDone */
+	bool isDone() { return _isDone; }
+	
+	/** \copydoc Iterator::item */
+	bank::Sequence& item ()  {  return _currentIt->item(); }
+	
+	/** IMPORTANT : the Item argument provided to 'setItem' must be the object to be modified by
+	 * one of the delegate iterator AND NOT the current item of CompositeIterator. Therefore,
+	 * we make point the delegate current item to this provided Item argument. */
+	void setItem (bank::Sequence& i)  {  _currentIt->setItem (i);  }
+	
+	/** Get a vector holding the composite structure of the iterator. */
+	virtual std::vector<Iterator<bank::Sequence>*> getComposition() { return _iterators; }
+	
+private:
+	size_t _seqIndex;
+
+	std::vector <Iterator<bank::Sequence>*>  _iterators;
+	
+	size_t          _currentIdx;
+	Iterator<bank::Sequence>* _currentIt;
+	
+	bool _isDone;
+	
+	void update (bool isFirst)
+	{
+		if (_currentIdx >= _iterators.size()) { _isDone=true;  return; }
+		
+		if (!isFirst)  { _currentIdx++; }
+		
+		while ((int)_currentIdx<(int)_iterators.size() && _isDone == true)
+		{
+			Iterator<bank::Sequence>* previous = _currentIt;
+			
+			/** We get the next iterator. */
+			_currentIt = _iterators[_currentIdx];
+			assert (_currentIt != 0);
+			
+			/** We have to take the reference of the previous iterator. */
+			_currentIt->setItem (previous->item());
+			
+			/** We have to "first" this iterator. */
+			_currentIt->first();
+			
+			/** We update the 'isDone' status. */
+			_isDone = _currentIt->isDone();
+			
+			if (_isDone==true) { _currentIdx++; }
+			
+			/** We can finish the previous item (only if not first call). */
+			if (!isFirst) { previous->finalize(); }
+		}
+	}
+};
+
+				}}}}} //end of namespace
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_SEQUENCE_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/AbstractBank.hpp b/gatb-core/src/gatb/bank/impl/AbstractBank.hpp
new file mode 100644
index 0000000..393d1cd
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/AbstractBank.hpp
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file AbstractBank.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Abstract implementation of the IBank interface
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_ABSTRACT_BANK_HPP_
+#define _GATB_CORE_BANK_IMPL_ABSTRACT_BANK_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/api/IBank.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Abstract implementation of IBank for factorizing common behavior.
+ *
+ * This abstract implementation of the IBank interface provides some methods having the
+ * same behavior for most implementations.
+ *
+ * Note that it implements the system::ISmartPointer interface as well, so it can be
+ * used as a smart pointer.
+ */
+class AbstractBank : public IBank, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    AbstractBank () : _estimateThreshold(50000) {}
+
+	
+	std::string getIdNb (int i)  { return std::string("not_a_compo_bank"); }
+
+	
+	int64_t estimateNbItemsBanki (int i)  { return this->estimateNbItems(); }
+
+	
+	
+    /** \copydoc IBank::estimateNbItems */
+    int64_t estimateNbItems ()
+    {
+        u_int64_t number, totalSize, maxSize;    estimate (number, totalSize, maxSize);  return number;
+    }
+
+    /** \copydoc IBank::estimateSequencesSize */
+    u_int64_t estimateSequencesSize ()
+    {
+        u_int64_t number, totalSize, maxSize;    estimate (number, totalSize, maxSize);  return totalSize;
+    }
+
+    /** \copydoc IBank::getEstimateThreshold */
+    u_int64_t getEstimateThreshold ()  { return _estimateThreshold; }
+
+    /** \copydoc IBank::setEstimateThreshold */
+    void setEstimateThreshold (u_int64_t nbSeq) { _estimateThreshold = nbSeq; }
+
+    /** \copydoc IBank::remove */
+    void remove () {}
+
+    /** \copydoc IBank::finalize */
+    void finalize ()  {}
+
+    /** \copydoc IBank::getCompositionNb */
+    size_t getCompositionNb ()
+    {
+        tools::dp::Iterator<Sequence>* it = this->iterator();  LOCAL(it);
+        return it->getComposition().size();
+    }
+
+private:
+
+    u_int64_t _estimateThreshold;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_ABSTRACT_BANK_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/Alphabet.hpp b/gatb-core/src/gatb/bank/impl/Alphabet.hpp
new file mode 100644
index 0000000..1c3e131
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/Alphabet.hpp
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Alphabet.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation for genomic alphabets
+ */
+
+#ifndef _GATB_CORE_BANK__IMPL_ALPHABET_HPP_
+#define _GATB_CORE_BANK__IMPL_ALPHABET_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/api/IAlphabet.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace bank      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/* Define the kind of the underlying alphabet. For instance, it could be the kind of sequences
+ * (protein, ADN...) read from a FASTA file
+ */
+class AlphabetNucleic : public IAlphabet
+{
+public:
+
+    /** Singleton method.
+     * \return the singleton instance. */
+    static IAlphabet& singleton()  { static AlphabetNucleic instance; return instance; }
+
+    /** \copydoc IAlphabet::getKind */
+    Kind_e getKind ()  { return NUCLEIC_ACID; }
+
+    /** \copydoc IAlphabet::getLetters */
+    std::string  getLetters ()  { return std::string ("ACTG"); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK__IMPL_ALPHABET_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/Bank.cpp b/gatb-core/src/gatb/bank/impl/Bank.cpp
new file mode 100644
index 0000000..ca3ddc2
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/Bank.cpp
@@ -0,0 +1,207 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/Bank.hpp>
+
+#include <gatb/bank/impl/BankFasta.hpp>
+#include <gatb/tools/compression/Leon.hpp>
+
+#include <gatb/bank/impl/BankBinary.hpp>
+#include <gatb/bank/impl/BankAlbum.hpp>
+
+#include <gatb/system/api/Exception.hpp>
+
+using namespace std;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Bank::Bank ()
+{
+    /** We register most known factories. */
+    _registerFactory_ ("album",  new BankAlbumFactory(),  false);
+    _registerFactory_ ("fasta",  new BankFastaFactory(),  false);
+	_registerFactory_ ("leon", new BankLeonFactory(), false);
+    _registerFactory_ ("binary", new BankBinaryFactory(), false);
+
+    DEBUG (("Bank::Bank,  found %ld factories\n", _factories.size()));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Bank::~Bank ()
+{
+    for (list<Entry>::iterator it = _factories.begin(); it != _factories.end(); it++)
+    {
+        (it->factory)->forget ();
+    }
+    _factories.clear();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Bank::_registerFactory_ (const std::string& name, IBankFactory* instance, bool beginning)
+{
+    /** We look whether the factory is already registered. */
+    IBankFactory* factory = _getFactory_ (name);
+
+    DEBUG (("Bank::registerFactory : name='%s'  instance=%p  => factory=%p \n", name.c_str(), instance, factory));
+
+    if (factory == 0)
+    {
+        if (beginning)  { _factories.push_front (Entry (name, instance));  }
+        else            { _factories.push_back  (Entry (name, instance));  }
+        instance->use();
+    }
+    else
+    {
+        throw system::Exception ("Bank factory '%s already registered", name.c_str());
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool Bank::_unregisterFactory_ (const std::string& name)
+{
+    for (list<Entry>::iterator it = _factories.begin(); it != _factories.end(); it++)
+    {
+        if (it->name == name)  { if (it->factory)  { it->factory->forget(); }  _factories.erase(it);  return true; }
+    }
+    return false;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBankFactory* Bank::_getFactory_ (const std::string& name)
+{
+    for (list<Entry>::iterator it = _factories.begin(); it != _factories.end(); it++)
+    {
+        if (it->name == name)  { return it->factory; }
+    }
+    return 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* Bank::_open_ (const std::string& uri)
+{
+    DEBUG (("Bank::open : %s  nbFactories=%ld \n", uri.c_str(), _factories.size()));
+
+    IBank* result = 0;
+    for (list<Entry>::iterator it = _factories.begin(); result==0 && it != _factories.end(); it++)
+    {
+        result = it->factory->createBank(uri);
+        DEBUG (("   factory '%s' => result=%p \n", it->name.c_str(), result ));
+
+        if (result) // if one of the factories produce a result, we can just stop, no need to try other factories.
+            break;
+    }
+
+    if (result == 0) { throw system::Exception ("Unable to open bank '%s' (if it is a list of files, perhaps some of the files inside don't exist)", uri.c_str()); }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+std::string Bank::_getType_ (const std::string& uri)
+{
+    string result = "unknown";
+
+    /** We try to create the bank; if a bank is valid, then we have the factory name. */
+    for (list<Entry>::iterator it = _factories.begin(); it != _factories.end(); it++)
+    {
+        IBank* bank = it->factory->createBank(uri);
+        if (bank != 0)
+        {
+            result = it->name;
+			if(!result.compare("fasta"))
+			{
+				//distinguish fasta and fastq
+				tools::dp::Iterator<Sequence>* its = bank->iterator(); LOCAL(its);
+				its->first();
+				if(!its->isDone())
+				{
+					std::string qual = its->item().getQuality();
+					if(!qual.empty())
+					{
+						result= "fastq";
+					}
+				}
+			}
+			
+            delete bank;
+            break;
+        }
+    }
+
+    return result;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/bank/impl/Bank.hpp b/gatb-core/src/gatb/bank/impl/Bank.hpp
new file mode 100644
index 0000000..22d7b50
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/Bank.hpp
@@ -0,0 +1,157 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Bank.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief User front end for opening genomic banks in a generic way
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_FACTORY_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_FACTORY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/api/IBank.hpp>
+
+#include <string>
+#include <list>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Front end for managing IBank objects.
+ *
+ * The Bank class can be used as a front end for banks management in GATB.
+ *
+ * Actually, its main purpose is to provide IBank instances from a given URI (likely
+ * to be a FASTA file for instance).
+ *
+ * By using this class, clients can open genomic banks without knowing their actual
+ * type: they only rely on the IBank interface. This means that developing tools
+ * this way make them independent of the format of the input bank (at least for the
+ * supported input format by GATB).
+ *
+ * Today, the following factories are registered:
+ *  1) BankAlbumFactory
+ *  2) BankFastaFactory
+ *  3) BankBinaryFactory
+ *
+ * During a call to 'open', each factory is tried (in the order of registration)
+ * until a correct IBank object is returned; if no valid IBank is found, an exception
+ * is thrown.
+ *
+ * Example of use:
+ * \snippet bank16.cpp  snippet16_bank
+ *
+ * NOTE : In case of a brand new bank creation, there is no corresponding method to 'open'
+ * because one has to know exactly the format of the bank (it is not possible in general
+ * to deduce the format only by analyzing the URI string and not the content).
+ *
+ * This class is a Singleton (private constructor) and its static public members are
+ * accessed to this singleton.
+ *
+ * For developers adding new implementations of the IBank interface, they should register a
+ * IBankFactory instance for their new class. Doing so make their new bank format available
+ * through the Bank::open method.
+ */
+class Bank
+{
+public:
+
+    /** Open a bank and get a IBank instance. Since the instance is created by a new
+     * statement, the client has to release the IBank when it is no longer used (otherwise
+     * a memory leak will happen).
+     * \param[in] uri : uri of the bank.
+     * \return the IBank instance. */
+    static IBank* open (const std::string& uri)  { return singleton()._open_ (uri); }
+
+    /** In case of a composite bank, return the number of sub banks.
+     * \return number of sub banks. */
+    static size_t getCompositionNb (const std::string& uri)  {  IBank* bank = open (uri);  LOCAL (bank);  return bank->getCompositionNb();  }
+
+    /** Get the type of the bank as a string
+     * \param[in] uri : uri of the bank.
+     * \return the bank type as a string. */
+    static std::string getType (const std::string& uri)  { return singleton()._getType_(uri); }
+
+    /** Register a new factory, associated with a name.
+     * Note that the position of the registered factory in the list of factories may be important; for instance,
+     * if we want to add a custom fasta file factory, we should add it at the beginning in order to be sure that
+     * our custom data format will be used by default.
+     * \param[in] name : name of the factory
+     * \param[in] instance : IBank factory
+     * \param[in] beginning : if true add the factory in the first position of the factories list, if false in the last position. */
+    static void registerFactory (const std::string& name, IBankFactory* instance, bool beginning)  { singleton()._registerFactory_ (name, instance, beginning); }
+
+    /** Unregister a factory given its name.
+     * \param[in] name : name of the factory to be unregistered.
+     * \return true if the factory has been unregistered, false otherwise. */
+    static bool unregisterFactory (const std::string& name)  { return singleton()._unregisterFactory_ (name); }
+
+    /** Get a factory for a given name. */
+    static IBankFactory* getFactory (const std::string& name)  { return singleton()._getFactory_(name); }
+
+private:
+
+    /** Private due to singleton method. */
+    Bank ();
+
+    /** Destructor. */
+    ~Bank ();
+
+    /** The order of registration is important, so we can't rely on a map and have to use
+     * a list of Entry (equivalent to <key,value> of a map). */
+    struct Entry
+    {
+        Entry (const std::string& name, IBankFactory* factory) : name(name), factory(factory) {}
+        std::string   name;
+        IBankFactory* factory;
+    };
+
+    std::list<Entry> _factories;
+
+    /** Singleton instance. */
+    static Bank& singleton()  { static Bank instance; return instance; }
+
+    /** Wrapper for 'open' method. */
+    IBank* _open_ (const std::string& uri);
+
+    /** Wrapper for 'getType' method. */
+    std::string _getType_ (const std::string& uri);
+
+    /** Wrapper for 'registerFactory' method. */
+    void _registerFactory_ (const std::string& name, IBankFactory* instance, bool beginning);
+
+    /** Wrapper for 'unregisterFactory' method. */
+    bool _unregisterFactory_ (const std::string& name);
+
+    /** Wrapper for 'getFactory' method. */
+    IBankFactory* _getFactory_ (const std::string& name);
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_FACTORY_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankAlbum.cpp b/gatb-core/src/gatb/bank/impl/BankAlbum.cpp
new file mode 100644
index 0000000..3ad3194
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankAlbum.cpp
@@ -0,0 +1,352 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankAlbum.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankFasta.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+
+#include <fstream>
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+
+#define DEBUG(a)    //printf a
+#define VERBOSE(a)
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankAlbum::BankAlbum (const std::string& name, bool deleteIfExists) : _name(name)
+{
+    /** We get a handle on the file given its name. */
+    system::IFile* file = getFile (name, deleteIfExists ? "w+" : NULL);
+
+    /** We check that the provided name exists in filesystem. */
+    if (file != 0)
+    {
+        char buffer[256];
+
+        while (file->isEOF() == false)
+        {
+            /** We init the buffer. */
+            *buffer = 0;
+
+            /** We get the current line. */
+            int len = file->gets (buffer, sizeof(buffer));
+
+            if (len > 1)
+            {
+                /** We remove the end of line. */
+                if (buffer[len-1] == '\n')  {  buffer[len-1] = 0; }
+
+                string bankUri = buffer;
+
+                /** We check whether it is a mere file name or there is also a directory name. */
+                if (isOnlyFilename(buffer) == true)
+                {
+                    /** We add the path name of the album file. */
+                    bankUri = System::file().getDirectory (name) + "/" + bankUri;
+                }
+
+                /** We add a new bank. */
+                BankComposite::addBank (Bank::open(bankUri));
+
+                /** We memorize the uri of this bank. */
+                _banksUri.push_back (bankUri);
+            }
+        }
+
+        delete file;
+    }
+    else
+    {
+        throw Exception ("Unable to use file '%s'", name.c_str());
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankAlbum::BankAlbum (const std::vector<std::string>& filenames)
+{
+    for (vector<string>::const_iterator it = filenames.begin(); it != filenames.end(); ++it)
+    {
+        /** We add a new bank. */
+        BankComposite::addBank (Bank::open(*it));
+
+        /** We memorize the uri of this bank. */
+        _banksUri.push_back (*it);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankAlbum::isAlbumValid (const std::string& uri)
+{
+    bool result = true;
+
+    FILE* file = fopen (uri.c_str(), "r");
+    if (file != 0)
+    {
+        char buffer[256];
+
+        while (fgets(buffer, sizeof(buffer), file) != 0)
+        {
+            VERBOSE (("BankAlbum::isAlbumValid  BEFORE buffer='%s'\n", buffer));
+
+            int len = strlen(buffer);
+
+            /** We skip last characters. */
+            for (len-- ; len >= 0; len--)  { if (isspace (buffer[len]) != 0)  { buffer[len]=0; } }
+
+            VERBOSE (("BankAlbum::isAlbumValid  AFTER  buffer='%s'\n", buffer));
+
+            if (strlen(buffer) > 0)
+            {
+                string bankUri = buffer;
+
+                /** We check whether it is a mere file name or there is also a directory name. */
+                if (isOnlyFilename(bankUri) == true)
+                {
+                    /** We add the path name of the album file. */
+                    bankUri = System::file().getDirectory (uri) + "/" + bankUri;
+                }
+
+                /** We check whether the file exists. */
+                bool exists = System::file().doesExist(bankUri);
+
+                DEBUG (("BankAlbum::isAlbumValid  bankUri='%s' bankUri.size()=%d  exists=%d  result=%d \n",
+                        bankUri.c_str(), bankUri.size(), exists, result
+                ));
+
+                if (!exists) { result=false; break; }
+            }
+        }
+        fclose (file);
+    }
+    else
+    {
+        result = false;
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* BankAlbum::addBank (const std::string& bankUri)
+{
+    IBank* result = 0;
+
+    DEBUG (("BankAlbum::add '%s'\n", bankUri.c_str() ));
+
+    /** We add the uri into the album file. */
+    system::IFile* file = getFile (_name);
+
+    if (file != 0)
+    {
+        /** We write the uri in the file. */
+        file->print ("%s\n", bankUri.c_str());
+
+        /** We create a new bank. */
+        result = Bank::open(bankUri);
+
+        /** We put it into the album. */
+        BankComposite::addBank (result);
+
+        /** We memorize the uri of this bank. */
+        _banksUri.push_back (bankUri);
+
+        /** Cleanup. */
+        delete file;
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* BankAlbum::addBank (const std::string& directory, const std::string& bankName, bool output_fastq, bool output_gz)
+{
+    IBank* result = 0;
+
+    DEBUG (("BankAlbum::add '%s'\n", bankName.c_str() ));
+
+    /** We add the uri into the album file. */
+    system::IFile* file = getFile (_name, "a+");
+
+    if (file != 0)
+    {
+        /** We build the bank uri. */
+        string bankUri = directory + "/" + bankName;
+
+        /** We write the uri in the file. */
+        file->print ("%s\n", bankName.c_str());
+
+        /** We create a new FASTA bank. */
+        result = new BankFasta (bankUri, output_fastq, output_gz);
+
+        /** We put it into the album. */
+        BankComposite::addBank (result);
+
+        /** We memorize the uri of this bank. */
+        _banksUri.push_back (bankUri);
+
+        /** Cleanup. */
+        delete file;
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+system::IFile* BankAlbum::getFile (const std::string& name, const char* mode)
+{
+    /** We check whether the file already exists or not. */
+    if (mode==NULL) { mode = System::file().doesExist(name) == true ? "r+" : "w+"; }
+
+    /** We create a handle on the file. */
+    return System::file().newFile (name, mode);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankAlbum::isOnlyFilename (const std::string& path)
+{
+    if (path.empty())  { throw Exception ("Bad '%s' path in isOnlyFilename", path.c_str());  }
+
+    /** It may not be bullet proof... */
+    return (path[0]!='/' && path[0]!='.');
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankAlbum::remove ()
+{
+    BankComposite::remove();
+    System::file().remove (_name);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* BankAlbumFactory::createBank (const std::string& uri)
+{
+    /** We check whether the uri is a "multiple" bank, i.e. a list (comma separated) of FASTA banks URIs. */
+    tools::misc::impl::TokenizerIterator it (uri.c_str(), ",");
+
+    /** We count the item number. */
+    vector<string> names;
+    for (it.first(); !it.isDone(); it.next())  { names.push_back(it.item()); }
+
+    /** FIRST CASE : a comma separated list of banks uri. */
+    if (names.size() > 1)
+    {
+        DEBUG (("BankAlbumFactory::createBank : count>1 (%d)\n", names.size()));
+
+        vector<IBank*> banks;
+        for (size_t i=0; i<names.size(); i++)
+        {
+            DEBUG (("   %s\n", names[i].c_str()));
+
+            /** We create a vector with the 'unitary' banks. */
+            banks.push_back (Bank::open (names[i]));
+        }
+        /** We return a composite bank. */
+        return new BankComposite (banks);
+    }
+
+    /** SECOND CASE : an album file. */
+    else if (names.size() == 1)
+    {
+        bool isAlbumValid = BankAlbum::isAlbumValid(uri);
+
+        DEBUG (("BankAlbumFactory::createBank : count==1  isAlbumValid=%d\n", isAlbumValid));
+
+        if (isAlbumValid == true)  {  return new BankAlbum (uri);  }
+    }
+
+    /** Nothing worked => return 0. */
+    return 0;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankAlbum.hpp b/gatb-core/src/gatb/bank/impl/BankAlbum.hpp
new file mode 100644
index 0000000..a344f32
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankAlbum.hpp
@@ -0,0 +1,144 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankAlbum.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bank format that holds other banks URI
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_ALBUM_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_ALBUM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/BankComposite.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Genomic bank file made of a list of other bank files URI
+ *
+ * This class allows to define a list of banks URI in two ways:
+ *  1) the album URI is a comma separated list of banks URI
+ *  2) the album is a text file holding a list of banks URI
+ *
+ * Example of a BankAlbum file content:
+ * \code
+ * somefile1.fasta
+ * somefile2.fasta
+ * somefile3.fasta
+ * \endcode
+ *
+ * An album A is defined by N filepath Pi.
+ * An album is valid if each Pi is present in filesystem
+ *
+ * If a filepath Pi is a simple filename (ie. not a fullpath), the basedir of the album URI
+ * is prefixed to Pi. This feature avoids to write the fullpath in Pi, which is interesting
+ * if the banks referred by Pi are moved; in such a case, one just has to move the album file
+ * in the same location of the moved banks.
+ *
+ * BankAlbum is a composite bank so iterating the sequences of a BankAlbum instance consists in
+ * iterating the sequences of each referred bank (in the order of the album file).
+ *
+ * The BankAlbum follows the Composite design pattern, so it is possible to have album of albums
+ * for instance; it is also possible to mix composite and leaf banks like this:
+ * \code
+ * someAlbum.txt
+ * somefile1.fasta
+ * somefile2.fasta
+ * \endcode
+ *
+ * Example of use:
+ * \snippet bank17.cpp  snippet17_album
+ *
+ */
+class BankAlbum : public BankComposite
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "album"; }
+
+    /** Constructor.
+     * \param[in] name : uri of the album.
+     * \param[in] deleteIfExists : delete the album file if it exists. */
+    BankAlbum (const std::string& name, bool deleteIfExists=false);
+
+    /** Constructor.
+     * \param[in] name : uri of the album.
+     * \param[in] banks : vector of banks instance to be added to the album. */
+    BankAlbum (const std::string& name, const std::vector<IBank*>& banks)
+        : BankComposite (banks), _name(name) {}
+
+    /** Constructor.
+     * \param[in] filenames: uri of the files to be used. */
+    BankAlbum (const std::vector<std::string>& filenames);
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()  { return _name; }
+
+    /** Add a bank to the album. */
+    IBank* addBank (const std::string& bankUri);
+
+    /** Add a bank to the album. */
+    IBank* addBank (const std::string& directory, const std::string& bankName, bool output_fastq=false, bool output_gz=false);
+
+    /** \copydoc IBank::remove. */
+    void remove ();
+
+private:
+
+    std::string _name;
+
+    std::vector<std::string> _banksUri;
+
+    system::IFile* getFile (const std::string& name, const char* mode=NULL);
+
+    static bool isOnlyFilename (const std::string& path);
+
+    /** */
+    static bool isAlbumValid (const std::string& uri);
+
+    friend class BankAlbumFactory;
+};
+
+/********************************************************************************/
+
+/* \brief Factory for the BankAlbum class. */
+class BankAlbumFactory : public IBankFactory
+{
+public:
+
+    /** \copydoc IBankFactory::createBank */
+    IBank* createBank (const std::string& uri);
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_ALBUM_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankBinary.cpp b/gatb-core/src/gatb/bank/impl/BankBinary.cpp
new file mode 100644
index 0000000..83719dc
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankBinary.cpp
@@ -0,0 +1,565 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankBinary.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <errno.h>
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+static u_int64_t BINREADS_BUFFER = 100000;
+
+/********************************************************************************/
+
+static u_int64_t MAGIC_NUMBER = 0x12345678;  // set to 0 for no usage of magic number
+
+static void writeMagic (FILE* file)
+{
+    if (MAGIC_NUMBER != 0)  {  fwrite (&MAGIC_NUMBER, sizeof(MAGIC_NUMBER), 1, file);  }
+}
+
+static bool checkMagic (FILE* file)
+{
+    if (MAGIC_NUMBER == 0)  { return true; }
+
+    u_int64_t value = 0;
+    fread (&value, sizeof(value), 1, file);
+    return  value==MAGIC_NUMBER;
+}
+
+/********************************************************************************/
+
+int NT2int(char nt)
+{
+    int i;
+    i = nt;
+    i = (i>>1)&3; // that's quite clever, guillaume.
+    return i;
+}
+
+unsigned char  code4NT(const char *seq)
+{
+    int i;
+    unsigned char x;
+
+    x=0;
+    for (i=0; i<4; ++i)
+    {
+        x = x*4 + NT2int(seq[i]);
+    }
+    return x;
+}
+
+unsigned char  code_n_NT(const char *seq, int nb)
+{
+    int i;
+    unsigned char x;
+
+    x=0;
+    for (i=0; i<nb; ++i)
+    {
+        x = x*4 + NT2int(seq[i]);
+    }
+    x = x << ((4-nb)*2) ;
+    return x;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankBinary::BankBinary (const std::string& filename, size_t nbValidLetters)
+    : _filename(filename), _nbValidLetters(nbValidLetters), binary_read_file(0)
+{
+    read_write_buffer_size = BINREADS_BUFFER;
+
+    //open (true);
+
+    buffer = (unsigned char *) MALLOC (read_write_buffer_size*sizeof(unsigned char));
+
+    cpt_buffer = 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankBinary::~BankBinary ()
+{
+    if(buffer!=NULL)
+    {
+        FREE (buffer); //buffer =NULL;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::insert (const Sequence& seq)
+{
+    /** Shortcuts. */
+    int   whole_readlen = seq.getDataSize();
+    char* pt_start      = seq.getDataBuffer();
+    char* pt_end        = pt_start + whole_readlen;
+    
+    int readlen = 0;
+    int tai = readlen;
+    unsigned char rbin;
+    unsigned int block_size = 0;
+    char *pt;
+    
+    char * pt_begin = pt_start;
+    size_t idx =0 ;
+
+    for ( ; pt_begin < pt_end; pt_begin += idx)
+    {
+        idx=0; // start a new read
+
+        if (_nbValidLetters > 0)
+        {
+            //skips NN
+            while (pt_begin < pt_end && *pt_begin =='N')
+            {
+                pt_begin ++;
+            }
+            // goes to next N or end of seq
+            while ( ((pt_begin +idx) < pt_end) && (pt_begin[idx] !='N') )
+            {
+                idx++;
+            }
+        }
+        else
+        {
+            idx = whole_readlen;
+        }
+
+        if (0<_nbValidLetters && idx<_nbValidLetters)  {  continue; }
+
+        //we have a seq beginning at  pt_begin of size idx  ,without any N, will be treated as a read: of size readlen, beginning at pt
+        readlen = tai = idx;
+        pt      = pt_begin;
+        
+        /** We may have to open the file at first call. */
+        if (binary_read_file == 0)  {  open (true); }
+        
+        //todo : also flush to disk  sometimes (ie if very large buffer, to create smaller blocks..)
+        if(cpt_buffer >= (read_write_buffer_size-readlen) || cpt_buffer > 10000000 )  ////not enough space to store next read   true space is 4 + readlen/4 + rem
+            //flush buffer to disk
+        {
+            block_size = cpt_buffer;
+            
+            if(block_size) fwrite(&block_size, sizeof(unsigned int), 1, binary_read_file); // block header
+            if (!fwrite(buffer, 1, cpt_buffer, binary_read_file)) // write a block, it ends at end of a read
+            {
+                printf("error: can't fwrite (disk full?)\n");
+                exit(1);
+            }
+            cpt_buffer=0;
+        }
+        
+        //check if still not enough space in empty buffer : can happen if large read, then enlarge buffer
+        if(read_write_buffer_size < readlen)
+        {
+            read_write_buffer_size = 2*readlen; // too large but ok
+            buffer =  (unsigned char *) REALLOC (buffer,sizeof(unsigned char) * read_write_buffer_size);
+        }
+        
+        /** We write the length of the read. */
+        memcpy(buffer+cpt_buffer,&readlen,sizeof(int));
+        cpt_buffer+= sizeof(int);
+        
+        /** We write one byte for 4 nucleotides. */
+        for (tai=readlen; tai>=4  ; tai-=4)
+        {
+            rbin = code4NT(pt);
+            buffer[cpt_buffer]=rbin; cpt_buffer++;
+            pt +=4;
+        }
+        
+        /** We write the remaining part. */
+        if(tai)
+        {
+            rbin = code_n_NT(pt,tai);
+            buffer[cpt_buffer]=rbin; cpt_buffer++;
+        }
+    }
+ }
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::flush ()
+{
+    unsigned int block_size =0;
+
+    if (binary_read_file != 0)
+    {
+        if(cpt_buffer)
+        {
+            block_size = cpt_buffer;
+
+            fwrite(&block_size, sizeof(unsigned int), 1, binary_read_file); // block header
+            if (!fwrite(buffer, 1, cpt_buffer, binary_read_file))
+            {
+                throw gatb::core::system::ExceptionErrno (STR_BANK_unable_write_file);
+            }
+        }
+        cpt_buffer=0;
+
+        fclose(binary_read_file);
+        binary_read_file = 0;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::open (bool write)
+{
+    binary_read_file = fopen (_filename.c_str(), write?"wb":"rb");
+    if( binary_read_file == NULL)
+    {
+        throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, _filename.c_str());
+    }
+
+    /** We write the magic number. */
+    if (write == true)  {  writeMagic (binary_read_file);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int64_t BankBinary::getSize ()
+{
+    return System::file().getSize (_filename);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+    /** We create an iterator for the bank. */
+    BankBinary::Iterator it (*this);
+
+    /** We return the estimation of sequences information. */
+    it.estimate (number, totalSize, maxSize);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::remove ()
+{
+    System::file().remove (_filename);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void  BankBinary::setBufferSize (u_int64_t bufferSize)
+{
+    BINREADS_BUFFER = bufferSize;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankBinary::check (const std::string& uri)
+{
+    bool result = false;
+
+    FILE* file = fopen (uri.c_str(), "rb");
+    if (file != NULL)
+    {
+        result = checkMagic (file);
+        fclose (file);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankBinary::Iterator::Iterator (BankBinary& ref)
+    : _ref(ref), _isDone(true), _bufferData (0), cpt_buffer(0), blocksize_toread(0), nseq_lues(0),
+      binary_read_file(0),
+      _index(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankBinary::Iterator::~Iterator ()
+{
+    if (binary_read_file != 0)  {  fclose (binary_read_file);  }
+
+    setBufferData(0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::Iterator::first()
+{
+    if (binary_read_file == 0)
+    {
+        /** We open the binary file at first call. */
+        binary_read_file = fopen (_ref._filename.c_str(), "rb");
+
+        /** We check that the file is opened => send an exception otherwise. */
+        if (binary_read_file == 0)  {  throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, _ref._filename.c_str());  }
+    }
+
+    if (binary_read_file != 0)
+    {
+        rewind (binary_read_file);
+
+        /** We read the magic number. */
+        if (checkMagic(binary_read_file)==false)  {  throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, _ref._filename.c_str());  }
+    }
+
+    /** We reinitialize some attributes. */
+    _isDone          = false;
+    cpt_buffer       = 0;
+    blocksize_toread = 0;
+    nseq_lues        = 0;
+
+    /** We go to the next sequence. */
+    next();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankBinary::Iterator::next ()
+{
+    int len = 0;
+    unsigned int block_size = 0;
+
+    //////////////////////////////////////////////
+    //reading new block from disk if needed
+    //////////////////////////////////////////////
+    if (cpt_buffer == blocksize_toread)
+    {
+        /** We read the size of the following cache buffer. */
+        if (! fread(&block_size,sizeof(unsigned int),1, binary_read_file)) //read block header
+        {
+            _isDone = true;
+            return;
+        }
+
+        /** We are about to read another chunk of data from the disk. We need */
+        setBufferData (new Data (block_size));
+
+        fread (_bufferData->getBuffer(), sizeof( char),block_size, binary_read_file); // read a block of reads into the buffer
+
+        cpt_buffer       = 0;
+        blocksize_toread = block_size;
+    }
+
+    //////////////////////////////////////////////
+    //now parse the whole block in ram
+    //////////////////////////////////////////////
+    if (cpt_buffer < blocksize_toread)
+    {
+        /** We increase the number of read sequences so far. */
+        nseq_lues ++;
+
+        memcpy (&len, _bufferData->getBuffer() + cpt_buffer, sizeof(int)); // read len
+
+        /** We go ahead in the file parsing. */
+        cpt_buffer += sizeof(int);
+
+        int nchar = (len+3)/4;
+
+        /** We update the information of the current sequence.
+         * NOTE: we keep the original size of the data, not the compressed one. */
+        _item->setDataRef (_bufferData, cpt_buffer, len);
+
+        /** We set the sequence index. */
+        _item->setIndex (_index++);
+
+        /** We go ahead in the file parsing. */
+        cpt_buffer += nchar;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void  BankBinary::Iterator::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+    /** We initialize the provided arguments. */
+    number    = 0;
+    totalSize = 0;
+    maxSize   = 0;
+
+    /** We open the binary file at first call. */
+    FILE* file = fopen (_ref._filename.c_str(), "rb");
+    if (file != 0)
+    {
+        if (checkMagic(file)==false)  {  throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, _ref._filename.c_str());  }
+
+        vector<char> buffer;
+
+        while (feof (file) == false)
+        {
+            unsigned int block_size = 0;
+
+            // we read the block header
+            if (! fread (&block_size,sizeof(unsigned int), 1, file))  { break; }
+
+            // we resize the buffer
+            buffer.resize (block_size);
+
+            // read a block of reads into the buffer
+            if (! fread (buffer.data(), sizeof(char), block_size, file))  { break; }
+
+            // we loop the sequences
+            char* loop = buffer.data();
+            while (loop < buffer.data() + block_size)
+            {
+                int readlen = 0;
+                memcpy (&readlen, loop, sizeof(int));
+
+                loop += sizeof(int) + (readlen+3)/4;
+
+                number ++;
+                if (readlen > (int)maxSize)  { maxSize = readlen; }
+                totalSize += readlen;
+            }
+
+            // we may count only a part of the file
+            if (number >= _ref.getEstimateThreshold())  { break; }
+        }
+
+        // we extrapolate the result according to the current location in the file
+        if (feof (file) == false)
+        {
+            // we keep the current location in the file
+            u_int64_t current = ftell (file);
+
+            // we go to the end of the file
+            fseek (file, 0, SEEK_END); /* cygwin doesnt like fseeko and fseek/fseeko seems similar */ 
+
+            // we keep the current location in the file
+            u_int64_t end = ftell (file);
+
+            // we extrapolate the result
+            number    = (number    * end) / current;
+            totalSize = (totalSize * end) / current;
+        }
+
+        // we clean up resources
+        fclose (file);
+
+    }  /* end of if (file != 0) */
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankBinary.hpp b/gatb-core/src/gatb/bank/impl/BankBinary.hpp
new file mode 100644
index 0000000..ccc3d83
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankBinary.hpp
@@ -0,0 +1,206 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankBinary.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Binary bank format
+ */
+
+#ifndef _GATB_CORE_BANK__IMPL_BANK_BINARY_HPP_
+#define _GATB_CORE_BANK__IMPL_BANK_BINARY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+
+#include <vector>
+#include <string>
+#include <stdio.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of IBank for compressed format
+ *
+ * - a binary file is made of:
+ *    - a magic number
+ *    - a list of blocks
+ *        - a block is:
+ *              - one block size (on 4 bytes)
+ *              - a list of sequences
+ *                  - a sequence is:
+ *                      - a sequence length (on 4 bytes)
+ *                      - the nucleotides of the sequences (4 nucleotides encoded in 1 byte)
+ * - number of sequences (on 4 bytes)
+ *
+ * Historically, BinaryBank has been used in the first step of the DSK tool to convert
+ * one input FASTA file into a binary format. DSK used to read several times the reads
+ * so having a binary (and so compressed) format had the nice effect to have less I/O
+ * operations and therefore less execution time.
+ *
+ * In the following example, we can see how to convert any kind of bank into a binary bank:
+ * \snippet bank8.cpp  snippet8_binary
+ *
+ */
+class BankBinary : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "binary"; }
+
+    /** Constructor. During a sequence insertion (see method 'insert'), a sequence may be split
+     *  in sub sequences if invalid characters exist (like 'N'). A sub sequence is considered
+     *  as valid if the number of consecutive letters is above some threshold (given as parameter).
+     *  If this threshold is not provided, there is no split process during 'insert'
+     * \param[in] filename : uri of the bank.
+     * \param[in] nbValidLetters : threshold for sequence split in 'insert' method
+     */
+    BankBinary (const std::string& filename, size_t nbValidLetters=0);
+
+    /** Destructor. */
+    ~BankBinary ();
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()  { return _filename; }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return new Iterator (*this); }
+
+    /** \copydoc IBank::getNbItems */
+    int64_t getNbItems () { return -1; }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item);
+
+    /** \copydoc IBank::flush */
+    void flush ();
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ();
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    /** \copydoc IBank::remove. */
+    void remove ();
+
+    /** Set default buffer size (static method). 
+      * \param[in] bufferSize : size of the buffer.    
+      */
+    static void setBufferSize (u_int64_t bufferSize);
+
+    /** Check that the given uri is a correct binary bank. */
+    static bool check (const std::string& uri);
+
+    /************************************************************/
+
+    /** \brief Specific Iterator impl for BankBinary class
+     */
+    class Iterator : public tools::dp::Iterator<Sequence>
+    {
+    public:
+        /** Constructor.
+         * \param[in] ref : the associated iterable instance.
+         */
+        Iterator (BankBinary& ref);
+
+        /** Destructor */
+        virtual ~Iterator ();
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first();
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next();
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()  { return _isDone; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        Sequence& item ()
+        {
+            _item->getData().setEncoding (tools::misc::Data::BINARY);
+            return *_item;
+        }
+
+        /** Estimation of the sequences information. */
+        void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    private:
+
+        /** Reference to the underlying Iterable instance. */
+        BankBinary&    _ref;
+
+        /** Tells whether the iteration is finished or not. */
+        bool _isDone;
+
+        /** Block buffer read from file. */
+        tools::misc::Data* _bufferData;
+        void setBufferData (tools::misc::Data* bufferData)  { SP_SETATTR(bufferData); }
+
+        int   cpt_buffer;
+        int   blocksize_toread;
+        int   nseq_lues;
+
+        FILE* binary_read_file;
+
+        size_t _index;
+    };
+
+protected:
+
+    /** URI of the bank. */
+    std::string _filename;
+
+    size_t _nbValidLetters;
+
+    unsigned char* buffer;
+    int            cpt_buffer;
+    int            read_write_buffer_size;
+    FILE*          binary_read_file;
+
+    void open  (bool write);
+    void close ();
+};
+
+/********************************************************************************/
+
+/* \brief Factory for the BankBinary class. */
+class BankBinaryFactory : public IBankFactory
+{
+public:
+
+    /** \copydoc IBankFactory::createBank */
+    IBank* createBank (const std::string& uri)
+    {
+        return BankBinary::check(uri) ? new BankBinary (uri) : 0;
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK__IMPL_BANK_BINARY_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankComposite.hpp b/gatb-core/src/gatb/bank/impl/BankComposite.hpp
new file mode 100644
index 0000000..bb0d987
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankComposite.hpp
@@ -0,0 +1,191 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankComposite.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Composite bank, ie. a bank made of other banks
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_COMPOSITE_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_COMPOSITE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <vector>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief IBank implementation for composite banks
+ *
+ * This class implements the Composite design pattern and allows to handle compound
+ * banks the same way as a single one.
+ *
+ * This is mainly a base class for other subclasses (see BankAlbum) and is not often
+ * instantiated directly.
+ *
+ * Most of the methods of IBank are implemented by iterating the list of referred banks.
+ *
+ * A BankComposite can be created with a vector of IBank instances to be referred.
+ */
+class BankComposite : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "composite"; }
+
+    /** Default constructor (no referred bank). */
+    BankComposite () : _nbItems(0), _size(0)  {}
+
+    /** Constructor.
+     * \param[in] banks : list of banks to be associated to the album.
+     */
+    BankComposite (const std::vector<IBank*>& banks) : _nbItems(0), _size(0)
+    {
+        for (size_t i=0; i<banks.size(); i++)  {  this->addBank (banks[i]); }
+    }
+
+    /** Destructor. */
+    virtual ~BankComposite ()
+    {
+        for (size_t i=0; i<_banks.size(); i++)  { _banks[i]->forget(); }
+    }
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()
+    {
+        if (_id.empty())  {  for (size_t i=0; i<_banks.size(); i++)  {  if (i>0) { _id += ","; }  _id += _banks[i]->getId();  }  }
+        return _id;
+    }
+
+	
+	std::string getIdNb (int i)
+	{
+		if(i<(int)_banks.size())
+			return _banks[i]->getId();
+		else
+			return
+				this->getId();
+	}
+	
+	
+	int64_t estimateNbItemsBanki (int i)  {
+		if(i<(int)_banks.size())
+			return _banks[i]->estimateNbItems();
+		else
+			return  this->estimateNbItems();
+	
+	}
+
+	
+    /** Add a bank into the composite
+     * \param[in] bank : the bank to be added. */
+    void addBank (IBank* bank)  { bank->use();  _banks.push_back(bank); }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()
+    {
+        std::vector <tools::dp::Iterator<Sequence>*>  iterators;
+        for (size_t i=0; i<_banks.size(); i++)  { iterators.push_back (_banks[i]->iterator()); }
+        return new tools::dp::impl::CompositeIterator<Sequence> (iterators);
+    }
+
+    /** \copydoc IBank::getNbItems */
+    int64_t getNbItems ()
+    {
+        if (_nbItems == 0)  {  for (size_t i=0; i<_banks.size(); i++)  { _nbItems += _banks[i]->getNbItems(); } }
+        return _nbItems;
+    }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item)   {  throw system::Exception ("Can't insert sequence in a composite bank.");  }
+
+    /** \copydoc IBank::flush */
+    void flush ()   {  for (size_t i=0; i<_banks.size(); i++)  { _banks[i]->flush(); } }
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ()
+    {
+        if (_size==0)  {   for (size_t i=0; i<_banks.size(); i++)  { _size += _banks[i]->getSize(); } }
+        return _size;
+    }
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+    {
+        number = totalSize = maxSize = 0;
+
+        u_int64_t numberIth=0, totalSizeIth=0, maxSizeIth=0;
+        for (size_t i=0; i<_banks.size(); i++)
+        {
+            _banks[i]->estimate (numberIth, totalSizeIth, maxSizeIth);
+            number += numberIth;  totalSize += totalSizeIth;  maxSize = std::max (maxSize, maxSizeIth);
+        }
+    }
+
+    /** */
+    size_t getCompositionNb() { return _banks.size(); }
+
+    /** \return maximum number of files. */
+    static const size_t getMaxNbFiles ()  { return 30; }
+
+    /** Return the vector of IBank objects.
+     * \return the IBank objects. */
+    const std::vector<IBank*>& getBanks() const { return _banks; }
+
+    /** Get the number of referred banks.
+     * \return the number of referred banks */
+    size_t getNbBanks () const { return _banks.size();  }
+
+    /** Direct iteration of the IBank instances.
+     * \param[in] fct : functor that will be called with each referred IBank object. */
+    template<typename Functor> void iterateBanks (Functor fct)  {  for (size_t i=0; i<_banks.size(); i++)  { fct (*_banks[i], i); }  }
+
+    /** Returns an iterator on the IBank objects (heap allocation)
+     * \return the IBank iterator. */
+    tools::dp::Iterator<IBank*>* iteratorBanks ()  { return new tools::dp::impl::VectorIterator<IBank*> (_banks); }
+
+    /** \copydoc IBank::remove. */
+    void remove ()  {  for (size_t i=0; i<_banks.size(); i++)  { _banks[i]->remove(); } }
+
+protected:
+
+    /** List of the banks. */
+    std::vector<IBank*> _banks;
+
+    u_int64_t _nbItems;
+    u_int64_t _size;
+    std::string _id;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_COMPOSITE_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.cpp b/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.cpp
new file mode 100644
index 0000000..0c2540a
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.cpp
@@ -0,0 +1,227 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace bank { namespace impl {
+/********************************************************************************/
+
+static const char* progressFormat1 = "Bank: fasta to binary                  ";
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankConverterAlgorithm::BankConverterAlgorithm (IBank* bank,  size_t kmerSize, const std::string& outputUri)
+: Algorithm ("bankconverter"), _kind(BANK_CONVERT_TMP), _bankInput(0), _bankOutput(0), _outputUri(outputUri), _kmerSize(kmerSize)
+{
+    setBankInput  (bank);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankConverterAlgorithm::BankConverterAlgorithm (tools::storage::impl::Storage& storage)
+: Algorithm ("bankconverter"), _kind(BANK_CONVERT_NONE), _bankInput(0), _bankOutput(0), _kmerSize(0)
+{
+    string xmlString = storage(this->getName()).getProperty ("xml");
+    stringstream ss; ss << xmlString;   getInfo()->readXML (ss);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankConverterAlgorithm::~BankConverterAlgorithm ()
+{
+    setBankInput  (0);
+    setBankOutput (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankConverterAlgorithm::execute ()
+{
+    /** We may have no conversion at all to do. */
+    if (_kind == BANK_CONVERT_NONE)
+    {
+        setBankOutput (_bankInput);
+        return;
+    }
+
+    /** We may have to delete the binary file if it already exists. */
+    System::file().remove (_outputUri);
+
+    /** We get information about the FASTA bank. */
+    u_int64_t number, totalSize, maxSize;
+    _bankInput->estimate (number, totalSize, maxSize);
+
+    /** We create the sequence iterator. */
+    Iterator<Sequence>* itSeq = _bankInput->iterator();
+    LOCAL (itSeq);
+
+    u_int64_t   nbSeq = 0;
+    u_int64_t sizeSeq = 0;
+
+    /** We get the composition of the provided sequence iterator. */
+    std::vector<Iterator<Sequence>*> iters = itSeq->getComposition();
+
+    /** We use a block for measuring the time elapsed in it. */
+    {
+        TIME_INFO (getTimeInfo(), "conversion");
+
+        /** We get information about the FASTA bank. */
+        u_int64_t number, totalSize, maxSize;
+        _bankInput->estimate (number, totalSize, maxSize);
+
+        if (iters.size() == 1)
+        {
+            /** We set the output bank. */
+            setBankOutput (createBank (itSeq, number, _outputUri, nbSeq, sizeSeq));
+        }
+
+        else if (iters.size() > 1)
+        {
+            vector<IBank*> ouputBanks;
+
+            for (size_t i=0; i<iters.size(); i++)
+            {
+                /** We set the name of the current binary bank. */
+                stringstream ss;   ss << _outputUri << i;
+
+                /** We create a new binary bank and add it to the vector of output banks. */
+                ouputBanks.push_back (createBank (iters[i], number / iters.size(), ss.str(), nbSeq, sizeSeq));
+            }
+
+            /** We set the result output bank. */
+            setBankOutput (new BankAlbum (_outputUri, ouputBanks));
+        }
+        else
+        {
+            throw Exception ("Error in BankConverterAlgorithm : nbIterators=%d", iters.size());
+        }
+    }
+
+    /** We flush the output bank (important if it is a file output). */
+    _bankOutput->flush ();
+
+    /** We gather some statistics. */
+    getInfo()->add (1, "info");
+    getInfo()->add (2, "input",            "%s",   _bankInput->getId().c_str());
+    getInfo()->add (2, "composite_number", "%d",   iters.size());
+    getInfo()->add (2, "sequences_number", "%ld",  nbSeq);
+    getInfo()->add (2, "sequences_size",   "%ld",  sizeSeq);
+    getInfo()->add (2, "output_size",      "%ld",  _bankOutput->getSize());
+    getInfo()->add (2, "ratio",            "%.3f",  (double)sizeSeq / (double)_bankOutput->getSize());
+    getInfo()->add (1, getTimeInfo().getProperties("time"));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* BankConverterAlgorithm::createBank (
+    Iterator<Sequence>* inputSequences,
+    size_t              nbInputSequences,
+    const string& outputName,
+    u_int64_t& nbSeq,
+    u_int64_t& sizeSeq
+)
+{
+    DEBUG (("BankConverterAlgorithm::createBank  nbInputSequences=%ld  outputName='%s'  nbSeq=%d \n",
+        nbInputSequences, outputName.c_str(), nbSeq
+    ));
+
+    /** We create a new binary bank. */
+    IBank* result = new BankBinary (outputName, _kmerSize);
+
+    /** We need an iterator on the input bank. */
+    Iterator<Sequence>* itBank = createIterator<Sequence> (
+        inputSequences,
+        nbInputSequences,
+        progressFormat1
+    );
+    LOCAL (itBank);
+
+    /** We iterate the sequences of the input bank. */
+    for (itBank->first(); !itBank->isDone(); itBank->next())
+    {
+        nbSeq ++;
+        sizeSeq += (*itBank)->getDataSize();
+
+        /** We insert the current sequence into the output bank. */
+        result->insert (itBank->item());
+    }
+
+    return result;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.hpp b/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.hpp
new file mode 100644
index 0000000..4fd0ada
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankConverterAlgorithm.hpp
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankConverterAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bank conversion from one IBank to another IBank
+ */
+
+#ifndef _BANK_CONVERTER_ALGORITHM_HPP_
+#define _BANK_CONVERTER_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Algorithm implementation that converts a bank into a binary one
+ *
+ * This algorithm converts an input IBank instance into a binary output bank.
+ *
+ * It subclasses gatb::core::tools::misc::impl::Algorithm in order to get all the features
+ * of its parent class.
+ *
+ * Historically, it was used by DSK to work on a binary bank instead of a FASTA
+ * bank (ie. less I/O operations because of smaller size of binary banks)
+ */
+class BankConverterAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** Constructor.
+     * \param[in] bank : bank to be converted (likely in FASTA format)
+     * \param[in] kmerSize : kmer size
+     * \param[in] outputUri : uri of the output binary bank. */
+    BankConverterAlgorithm (IBank* bank, size_t kmerSize, const std::string& outputUri);
+
+    /** Constructor. Used only to retrieved statistics/information gathered during
+     * a previous execution of a BankConverterAlgorithm instance
+     * \param[in] storage : storage instance where we get information from. */
+    BankConverterAlgorithm (tools::storage::impl::Storage& storage);
+
+    /** Destructor. */
+    ~BankConverterAlgorithm ();
+
+    /** \copydoc gatb::core::tools::misc::impl::Algorithm::execute */
+    void execute ();
+
+    /** Return the output binary bank
+     * \return the IBank instance */
+    IBank* getResult ()  { return _bankOutput; }
+
+private:
+
+    tools::misc::BankConvertKind _kind;
+
+    IBank*      _bankInput;
+    void setBankInput (IBank* bankInput)  { SP_SETATTR(bankInput); }
+
+    IBank*      _bankOutput;
+    void setBankOutput (IBank* bankOutput)  { SP_SETATTR(bankOutput); }
+
+    std::string _outputUri;
+
+    bank::IBank* createBank (
+        tools::dp::Iterator<bank::Sequence>* inputSequences,
+        size_t nbInputSequences,
+        const std::string& outputName,
+        u_int64_t& nbSeq,
+        u_int64_t& sizeSeq
+    );
+
+    size_t _kmerSize;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _BANK_CONVERTER_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/bank/impl/BankFasta.cpp b/gatb-core/src/gatb/bank/impl/BankFasta.cpp
new file mode 100644
index 0000000..2e78464
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankFasta.cpp
@@ -0,0 +1,821 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankFasta.hpp>
+#include <gatb/bank/impl/BankComposite.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <algorithm>
+#include <string.h>
+#include <errno.h>
+#include <zlib.h> // Added by Pierre Peterlongo on 02/08/2012.
+
+using namespace std;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+
+#define DEBUG(a)  //printf a
+
+#define BUFFER_SIZE     (256*1024)
+
+#define nearest_power_of_2(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
+
+/** https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2 */
+#define is_power_of_2(v)  (((v) & ((v) - 1)) == 0)
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+size_t BankFasta::_dataLineSize = 70;
+
+/********************************************************************************/
+// heavily inspired by kseq.h from Heng Li (https://github.com/attractivechaos/klib)
+typedef struct
+{
+    gzFile stream;
+    unsigned char *buffer;
+    int buffer_start, buffer_end;
+    bool eof;
+    char last_char;
+
+    void rewind ()
+    {
+        gzrewind (stream);
+        last_char    = 0;
+        eof          = 0;
+        buffer_start = 0;
+        buffer_end   = 0;
+    }
+
+} buffered_file_t;
+
+/********************************************************************************/
+struct variable_string_t
+{
+     variable_string_t ()  : length(0), max(0), string(0) {}
+    ~variable_string_t () { if (string!=0)  { FREE(string); } }
+
+    int length, max;
+    char *string;
+};
+
+/********************************************************************************/
+struct buffered_strings_t
+{
+     buffered_strings_t () : read(new variable_string_t), dummy(new variable_string_t), header(new variable_string_t), quality(new variable_string_t)   {}
+    ~buffered_strings_t ()
+    {
+        delete read;
+        delete dummy;
+        delete header;
+        delete quality;
+    }
+
+    variable_string_t *read, *dummy, *header, *quality;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankFasta::BankFasta (const std::string& filename, bool output_fastq, bool output_gz)
+    : filesizes(0), nb_files(0), _insertHandle(0), _gz_insertHandle(0)
+{
+    _output_fastq = output_fastq;
+    _output_gz= output_gz;
+    _filenames.push_back (filename);
+    init ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankFasta::~BankFasta ()
+{
+    if (_insertHandle    != 0)  { fclose  (_insertHandle);    }
+    if (_gz_insertHandle != 0)  { gzclose (_gz_insertHandle); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::finalize ()
+{
+    if (_insertHandle    != 0)  { fclose  (_insertHandle);    _insertHandle    = 0; }
+    if (_gz_insertHandle != 0)  { gzclose (_gz_insertHandle); _gz_insertHandle = 0; }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::init ()
+{
+    /** We check that we don't exceed the number of allowed files. */
+    if (_filenames.empty() || _filenames.size() > getMaxNbFiles())
+    {
+        /** We send an exception. */
+	    fprintf(stderr,"unable to open file(s)"); // normally you get an information exception, but not always in some test programs (e.g. GATB training day), so i'm printing an explicit message
+        throw gatb::core::system::Exception (STR_BANK_bad_file_number, _filenames.size(), getMaxNbFiles());
+    }
+
+    nb_files  = _filenames.size();
+    filesizes = 0;
+
+    // estimate total size of files
+    for (size_t i=0; i<nb_files; i++)
+    {
+        /** Shortcut. */
+        const char* fname = _filenames[i].c_str();
+
+        bool compressed = false;
+        u_int64_t estimated_filesize;
+
+        if (strstr (fname, "gz") == (fname + strlen (fname) - 2))
+            compressed = true;
+
+        if (compressed)
+            // crude hack, based on Quip paper reporting compression ratio (~0.3).
+            // gzseek(SEEK_END) isn't supported. need to read whole file otherwise :/
+
+            estimated_filesize = System::file().getSize (fname) * 4;
+        else
+            estimated_filesize = System::file().getSize (fname);
+
+        filesizes += estimated_filesize;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+    /** We create an iterator for the bank. */
+    BankFasta::Iterator it (*this, Iterator::NONE);
+
+    /** We delegate the computation to the iterator. */
+    it.estimate (number, totalSize, maxSize);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::flush ()
+{
+    if (_insertHandle    != 0)  { fflush  (_insertHandle);              }
+    if (_gz_insertHandle != 0)  { gzflush (_gz_insertHandle, Z_FINISH); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::insert (const Sequence& item)
+{
+    /** We open the last file if needed. */
+    if (_insertHandle == 0  &&  _filenames.empty()==false)
+    {
+        _insertHandle = fopen (_filenames[_filenames.size()-1].c_str(), "w");
+    }
+
+    if (_output_gz && _gz_insertHandle == 0  &&  _filenames.empty()==false)
+    {
+        _gz_insertHandle =  gzopen (_filenames[_filenames.size()-1].c_str(), "w");
+    }
+    
+    if (_insertHandle != 0)
+    {
+        if(_output_fastq)
+        {
+            if(_output_gz)
+            {
+                gzprintf (_gz_insertHandle, "@%s\n", item.getComment().c_str());
+                gzprintf (_gz_insertHandle, "%.*s\n",(int)item.getDataSize(),  item.getDataBuffer());
+                gzprintf (_gz_insertHandle, "+\n");
+                gzprintf (_gz_insertHandle, "%s\n", item.getQuality().c_str());
+            }
+            else
+            {
+                fprintf (_insertHandle, "@%s\n", item.getComment().c_str());
+                fprintf (_insertHandle, "%.*s\n",(int)item.getDataSize(),  item.getDataBuffer());
+                fprintf (_insertHandle, "+\n");
+                fprintf (_insertHandle, "%s\n", item.getQuality().c_str());
+            }
+
+        }
+        else
+        {
+        /** We add the sequence into the bag. */
+        fprintf (_insertHandle, ">%s\n", item.getComment().c_str());
+
+#if 1
+        fprintf (_insertHandle, "%.*s\n",(int)item.getDataSize(),  item.getDataBuffer());
+#else
+        // We dump the data with fixed sized columns
+        char line[4*1024];
+        char* loop = line;
+        size_t actualDataLineSize = _dataLineSize > 0 ? _dataLineSize : (size_t)(~0);
+
+        size_t len = item.getDataSize();
+
+        for (size_t i=0; i<len; )
+        {
+            size_t j=0;
+            for (j=0; j<actualDataLineSize && i<len; j++, i++)
+            {
+                *(loop++) = item.getDataBuffer() [i];
+                if (j >= sizeof(line)-2)
+                {
+                    *(loop++) = 0;   fprintf (_insertHandle, "%s", line);     loop = line;
+                }
+            }
+            *(loop++) = 0;    fprintf (_insertHandle, "%s\n", line);    loop = line;
+        }
+#endif
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankFasta::Iterator::Iterator (BankFasta& ref, CommentMode_e commentMode)
+    : _ref(ref), _commentsMode(commentMode), _isDone(true), _isInitialized(false), _nIters(0),
+      index_file(0), buffered_file(0), buffered_strings(0), _index(0)
+{
+    DEBUG (("Bank::Iterator::Iterator\n"));
+
+    /** We check that the file can be opened. */
+    if (gzFile stream = gzopen (_ref._filenames[0].c_str(), "r"))  {  gzclose (stream);  }
+    else  {  
+        throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, _ref._filenames[0].c_str());  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankFasta::Iterator::~Iterator ()
+{
+    DEBUG (("Bank::Iterator::~Iterator\n"));
+    finalize ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::Iterator::first()
+{
+    /** We may have to initialize the instance. */
+    init  ();
+
+    for (u_int64_t i = 0; i < _ref.nb_files; i++)
+    {
+        buffered_file_t* bf = (buffered_file_t *) buffered_file[i];
+        if (bf != 0)  { bf->rewind(); }
+    }
+
+    index_file = 0;
+    _isDone = false;
+    
+    _nIters = 0;
+    _index  = 0;
+    
+    next();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::Iterator::next()
+{
+    if (_isDone)  { return; }
+
+    if (_commentsMode == NONE)
+    {
+        _isDone = get_next_seq (_item->getData()) == false;
+    }
+    else
+    {
+        _isDone = get_next_seq (_item->getData(), _item->_comment,_item->_quality, _commentsMode) == false;
+    }
+    _item->setIndex (_index++);
+    DEBUG (("Bank::Iterator::next  _isDone=%d\n", _isDone));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+// the following functions are adapted from kseq.h by Heng Li (https://github.com/attractivechaos/klib)
+inline bool rebuffer (buffered_file_t *bf)
+{
+    if (bf->eof) return false;
+    bf->buffer_start = 0;
+    bf->buffer_end = gzread (bf->stream, bf->buffer, BUFFER_SIZE);
+    if (bf->buffer_end < BUFFER_SIZE) bf->eof = 1;
+    if (bf->buffer_end == 0) return false;
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+inline signed char buffered_getc (buffered_file_t *bf)
+{
+    if (bf->buffer_start >= bf->buffer_end) if (!rebuffer (bf)) return -1;
+    return (signed char) (bf->buffer[bf->buffer_start++]);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+inline signed int buffered_gets (
+    buffered_file_t*   bf,
+    variable_string_t* s,
+    char *dret,
+    bool append,
+    bool allow_spaces
+)
+{
+    if (dret) *dret = 0;
+    if (!append) s->length = 0;
+    if (bf->buffer_start >= bf->buffer_end && bf->eof) return -1;
+    while (1)
+    {
+        int i;
+        if (bf->buffer_start >= bf->buffer_end) if (!rebuffer (bf)) break;
+        if (allow_spaces)
+        {
+            for (i = bf->buffer_start; i < bf->buffer_end; i++)
+                if (bf->buffer[i] == '\n') break;
+        }
+        else
+        {
+            for (i = bf->buffer_start; i < bf->buffer_end; i++)
+                // isspace() answers yes for ' ', \t, \n, \v, \f, \r
+                if (isspace (bf->buffer[i])) break;
+        }
+        if (s->max - s->length < (i - bf->buffer_start + 1))
+        {
+            s->max = s->length + (i - bf->buffer_start + 1);
+            if (is_power_of_2(s->max))  { s->max ++; }
+            nearest_power_of_2(s->max);
+            s->string = (char*)  REALLOC (s->string, s->max);
+        }
+         memcpy (s->string + s->length, bf->buffer + bf->buffer_start, i - bf->buffer_start);
+        s->length += i - bf->buffer_start;
+        bf->buffer_start = i + 1;
+        if (i < bf->buffer_end)
+        {
+            if (dret) *dret = bf->buffer[i];
+            break;
+        }
+    }
+    if (s->string == NULL)
+    {
+        s->max = 256;
+        s->string = (char*)  CALLOC (256, 1);
+    }
+    else if (allow_spaces && s->length > 1 && s->string[s->length - 1] == '\r')
+        s->length--;
+    s->string[s->length] = '\0';
+    return s->length;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankFasta::Iterator::get_next_seq_from_file (Vector<char>& data, string& comment, string& quality, int file_id, CommentMode_e mode)
+{
+    
+    buffered_strings_t* bs = (buffered_strings_t*) buffered_strings;
+   // printf("%i -\n",bs->header->length);
+
+    signed char c;
+    buffered_file_t *bf = (buffered_file_t *) buffered_file[file_id];
+    if (bf->last_char == 0)
+    {
+        while ((c = buffered_getc (bf)) != -1 && c != '>' && c != '@')
+            ; // go to next header
+        if (c == -1) return false; // eof
+        bf->last_char = c;
+    }
+    bs->quality->length = bs->read->length = bs->dummy->length = 0;
+
+    if (buffered_gets (bf, bs->header, (char *) &c, false, false) < 0) //ici
+        return false; // eof
+
+    if (c != '\n')
+    {
+        if (mode == IDONLY)
+        {
+            variable_string_t dummy;
+            buffered_gets (bf, &dummy, NULL, true, true); // read header
+        }
+        else
+        {
+            // We add the last read character (likely a space)
+            bs->header->string[bs->header->length] = c;
+            bs->header->length++;
+            bs->header->string[bs->header->length] = 0;
+
+            buffered_gets (bf, bs->header, NULL, true, true); // read header
+        }
+	}
+
+    if (bs->read->string == NULL)
+    {
+        bs->read->max = 256;
+        bs->read->string = (char*)  MALLOC (bs->read->max);
+    }
+    while ((c = buffered_getc (bf)) != -1 && c != '>' && c != '+' && c != '@')
+    {
+        if (c == '\n') continue; // empty line
+        bs->read->string[bs->read->length++] = c;
+        buffered_gets (bf, bs->read, NULL, true, true);
+    }
+    if (c == '>' || c == '@') bf->last_char = c;
+    if (bs->read->length + 1 >= bs->read->max)
+    {
+        bs->read->max = bs->read->length + 2;
+        nearest_power_of_2(bs->read->max);
+        bs->read->string = (char*)  REALLOC (bs->read->string, bs->read->max);
+    }
+    bs->read->string[bs->read->length] = '\0';
+    if (c == '+') // fastq
+    {
+        if (bs->quality->max < bs->read->max) // resize quality to match read length
+        {
+            bs->quality->max = bs->read->max;
+            bs->quality->string = (char*)  REALLOC (bs->quality->string, bs->quality->max);
+        }
+        while ((c = buffered_getc (bf)) != -1 && c != '\n')
+            ; // read rest of quality comment
+        while (buffered_gets (bf, bs->quality, NULL, true, true) >= 0 && bs->quality->length < bs->read->length)
+            ; // read rest of quality
+        bf->last_char = 0;
+        
+        quality.assign (bs->quality->string, bs->quality->length);
+       // printf("%i  %i\n",bs->quality->length,bs->header->length);
+    }
+
+    /** We update the data of the sequence. */
+#if 1
+    data.set (bs->read->string, bs->read->length);
+#else
+    data.setRef (bs->read->string, bs->read->length);
+#endif
+
+    //if (comment.empty() == false)
+    {
+        comment.assign (bs->header->string, bs->header->length);
+    }
+
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankFasta::Iterator::get_next_seq_from_file (Vector<char>& data, int file_id)
+{
+    string dummy;
+    return get_next_seq_from_file (data, dummy,dummy, file_id, NONE);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankFasta::Iterator::get_next_seq (Vector<char>& data, string& comment,string& quality, CommentMode_e mode)
+
+{
+    bool success = get_next_seq_from_file (data, comment,quality, index_file, mode);
+    if (success) return true;
+
+    // cycle to next file if possible
+    if ((u_int64_t)index_file < _ref.nb_files - 1)
+    {
+        index_file++;
+        return get_next_seq (data, comment,quality, mode);
+    }
+    return false;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool BankFasta::Iterator::get_next_seq (Vector<char>& data)
+{
+    string  dummy;
+    return get_next_seq (data, dummy,dummy, NONE);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::Iterator::init ()
+{
+
+    if (_isInitialized == true)  { return ;}
+
+    /** We initialize the array of files. */
+    buffered_file = (void**) CALLOC (getMaxNbFiles(), sizeof(void*));
+
+    /** Shortcut. */
+    vector<string>& fnames = _ref._filenames;
+
+    // open each file for reading
+    for (size_t i=0; i<_ref.nb_files; i++)
+    {
+        /** Shortcut. */
+        const char* fname = fnames[i].c_str();
+
+        buffered_file_t** bf = (buffered_file_t **) buffered_file + i;
+        *bf = (buffered_file_t *)  CALLOC (1, sizeof(buffered_file_t));
+        (*bf)->buffer = (unsigned char*)  MALLOC (BUFFER_SIZE);
+        (*bf)->stream = gzopen (fname, "r");
+		
+        /** We check that we can open the file. */
+        if ((*bf)->stream == NULL)
+        {
+            // there used to be some cleanup here but what's the point, we're going to throw an exception anyway
+        
+			//GR : dunno why this exception does not show up, adding a message here
+            //RC: the exceptino doesn't even trigger, or there is an exception but the message doesn't show?
+			fprintf(stderr,"unable to open file %s  : %s \n",fname,strerror(errno));
+			
+            /** We launch an exception. */
+            throw gatb::core::system::ExceptionErrno (STR_BANK_unable_open_file, fname);
+
+        }
+    }
+
+    index_file = 0; // initialize the get_next_seq iterator to the first file
+
+    // init read and dummy (for readname and quality)
+    buffered_strings_t* bs = new buffered_strings_t;
+    buffered_strings = bs;
+
+    _isInitialized = true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::Iterator::finalize ()
+{
+    if (_isInitialized == false)  { return; }
+
+    buffered_strings_t* bs = (buffered_strings_t*) buffered_strings;
+
+    if (bs != 0)  { delete bs; }
+
+    for (u_int64_t i = 0; i < _ref.nb_files; i++)
+    {
+        buffered_file_t* bf = (buffered_file_t *) buffered_file[i];
+
+        if (bf != 0)
+        {
+            /** We close the handle of the file. */
+            if (bf->stream != NULL)  {  gzclose (bf->stream);  bf->stream = 0; }
+
+            /** We delete the buffer. */
+            FREE (bf->buffer);
+
+            /** We delete the buffered file itself. */
+            FREE (bf);
+        }
+    }
+
+    /** We release the array of files. */
+    FREE (buffered_file);
+
+    /** We reset the initialization flag. */
+    _isInitialized = false;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankFasta::Iterator::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+    /** We may have to initialize the instance. */
+    init  ();
+
+    Vector<char> data;
+
+    /** We rewind the files. */
+    for (u_int64_t i = 0; i < _ref.nb_files; i++)
+    {
+        buffered_file_t* bf = (buffered_file_t *) buffered_file[i];
+        if (bf != 0)  { bf->rewind(); }
+    }
+
+    /** We initialize the provided arguments. */
+    number    = 0;
+    totalSize = 0;
+    maxSize   = 0;
+
+    number = 0;
+    while (get_next_seq (data)  &&  number <= _ref.getEstimateThreshold())
+    {
+        number ++;
+        if (data.size() > maxSize)  { maxSize = data.size(); }
+        totalSize += data.size ();
+    }
+
+    u_int64_t actualPosition = 0;
+
+    /** We compute the aggregated size from the files having been read until we
+     * reached our limit number of sequences. */
+    for (int i=0; i<=index_file; i++)
+    {
+        buffered_file_t* current = (buffered_file_t *) buffered_file[i];
+
+        actualPosition += gztell (current->stream);
+    }
+
+    if (actualPosition > 0)
+    {
+        // linear extrapolation
+        number    = (number    * _ref.getSize()) / actualPosition;
+        totalSize = (totalSize * _ref.getSize()) / actualPosition;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IBank* BankFastaFactory::createBank (const std::string& uri)
+{
+    bool isFASTA = false;
+
+    /** We check whether the uri looks like a FASTA bank. */
+    gzFile file = gzopen (uri.c_str(), "r");
+    if (file != 0)
+    {
+        char buffer[256];
+        int res = gzread (file, buffer, sizeof(buffer));
+        if (res > 0)
+        {
+            int i=0;
+            char previous=' ';
+            bool foundStart = false;
+            for (i=0; !foundStart && i<res; i++)
+            {
+                if ((buffer[i]=='>' || buffer[i]=='@')  && isspace(previous))    {  foundStart = true;  break; }
+                previous=buffer[i];
+            }
+            if (foundStart)
+            {
+                /** We look for alphanum + space. */
+                bool foundSpace = false;
+                for ( ; !foundSpace && i<res; i++)
+                {
+                         if (  isspace(buffer[i]))  { foundSpace=true; }
+                    else if (! isprint(buffer[i]))  { break; }
+                }
+                isFASTA = foundSpace;
+            }
+        }
+
+        gzclose (file);
+    }
+
+    return (isFASTA ? new BankFasta (uri) : NULL);
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankFasta.hpp b/gatb-core/src/gatb/bank/impl/BankFasta.hpp
new file mode 100644
index 0000000..dacb28d
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankFasta.hpp
@@ -0,0 +1,251 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankFasta.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief FASTA bank format
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_FASTA_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_FASTA_HPP_
+
+/********************************************************************************/
+#include <zlib.h>
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+
+#include <vector>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+/** \brief Core package of the GATP project.
+ *
+ * The gatb::core package holds all the fundamental packages needed for writting
+ * assembly algorithms.
+ *
+ * It holds some generic tools, like operating system abstraction, collections management or design patterns
+ * concerns. It also holds recurrent needs as reading genomic banks, handling kmers and so on.
+ */
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace bank      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of IBank for FASTA format
+ *
+ *  This class provides FASTA management in GATB.
+ *
+ *  Actually, it provides FASTA and FASTQ formats, both in uncompressed and gzip formats.
+ *
+ *  In case of FASTQ files, the iterated Sequence objects will provide quality information.
+ *
+ * Sample of use (note however that it is better to use Bank::open for opening a bank):
+ * \snippet bank1.cpp  snippet1_bank
+ */
+class BankFasta : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "fasta"; }
+
+    /** Constructor.
+     * \param[in] filename : uri of the bank.
+     * \param[in] output_fastq : tells whether the file is in fastq or not.
+     * \param[in] output_gz: tells whether the file is gzipped or not
+     */
+    BankFasta (const std::string& filename, bool output_fastq = false, bool output_gz = false);
+
+    /** Destructor. */
+    ~BankFasta ();
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()  { return _filenames[0]; }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return new Iterator (*this); }
+
+    /** \copydoc IBank::getNbItems */
+    int64_t getNbItems () { return -1; }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item);
+
+    /** \copydoc IBank::flush */
+    void flush ();
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ()  { return filesizes; }
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    static void setDataLineSize (size_t len) { _dataLineSize = len; }
+    static size_t getDataLineSize ()  { return _dataLineSize; }
+
+    /** \copydoc IBank::finalize */
+    void finalize ();
+
+    /************************************************************/
+
+    /** \brief Specific Iterator impl for Bank class
+     *
+     * This implementation relies on the initial code from Minia. It wraps the
+     * Iterator interface with the Minia code.
+     *
+     * Note that we made some effort not to put implementation code
+     * here in the header; see in particular buffered_file and buffered_strings
+     * attributes whose type is void* (and not the implementation type defined in
+     * the cpp file).
+     *
+     * Note the small improvement compared to Minia: it is possible to create an
+     * Iterator that provides (or not) sequence comments, according to the corresponding
+     * parameter given to the Iterator constructor.
+     *
+     *  <b>IMPROVEMENTS</b>:
+     *  - in case we have several banks to read, we could have at one time only one stream opened on the currently
+     *  iterated file. The current implementation opens all streams, which may be avoided.
+     */
+    class Iterator : public tools::dp::Iterator<Sequence>
+    {
+    public:
+
+        /** Define what kind of comment we want to retrieve. Such comments can be retrieved through
+         * gatb::core::bank::Sequence
+         */
+        enum CommentMode_e
+        {
+            /** Empty comments are provided to clients. */
+            NONE,
+            /** Comments with only the FASTA ID are provided to clients. \n
+             *  Ex: 'ENSTTRP00000009639pep:novel'*/
+            IDONLY,
+            /** Full comments are provided to clients. \n
+             *  Ex: 'ENSTTRP00000001236pep:novel genescaffold:turTru1:GeneScaffold_3311:182575:189152:1'*/
+            FULL
+        };
+
+        /** Constructor.
+         * \param[in] ref : the associated iterable instance.
+         * \param[in] commentMode : kind of comments we want to retrieve
+         */
+        Iterator (BankFasta& ref, CommentMode_e commentMode = FULL);
+
+        /** Destructor */
+        ~Iterator ();
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first();
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next();
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()  { return _isDone; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        Sequence& item ()     { return *_item; }
+
+        /** Estimation of the sequences information */
+        void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    private:
+
+        /** Reference to the underlying Iterable instance. */
+        BankFasta&    _ref;
+
+        /** Tells what kind of comments we want as a client of the iterator. */
+        CommentMode_e  _commentsMode;
+
+        /** Tells whether the iteration is finished or not. */
+        bool _isDone;
+
+        /** Tells whether the instance is initialized. */
+        bool _isInitialized;
+
+        /* Number of time next has been called   */
+        u_int64_t   _nIters;
+        
+        /** Initialization method. */
+        void init ();
+
+        /** Finish method. */
+        void finalize ();
+
+        int   index_file; // index of current file
+
+        void** buffered_file;
+        void*  buffered_strings;   // variable_string_t *read, *dummy, *header;
+
+        bool get_next_seq           (tools::misc::Vector<char>& data);
+        bool get_next_seq           (tools::misc::Vector<char>& data, std::string& comment, std::string& quality, CommentMode_e mode);
+
+        bool get_next_seq_from_file (tools::misc::Vector<char>& data, int file_id);
+        bool get_next_seq_from_file (tools::misc::Vector<char>& data, std::string& comment, std::string& quality, int file_id, CommentMode_e mode);
+
+        size_t _index;
+    };
+
+protected:
+
+    /** \return maximum number of files. */
+    static const size_t getMaxNbFiles ()  { return 1; }
+
+    friend class Iterator;
+
+    bool _output_fastq;
+    bool _output_gz;
+    
+    /** List of URI of the banks. */
+    std::vector<std::string> _filenames;
+
+    u_int64_t filesizes;  // estimate of total size for all files
+    size_t    nb_files;   // total nb of files
+
+    /** File handle for inserting sequences into the bank. */
+    FILE* _insertHandle;
+
+    gzFile _gz_insertHandle;
+    
+    static size_t _dataLineSize;
+
+    /** Initialization method (compute the file sizes). */
+    void init ();
+};
+
+/********************************************************************************/
+
+/* \brief Factory for the BankFasta class. */
+class BankFastaFactory : public IBankFactory
+{
+public:
+
+    /** \copydoc IBankFactory::createBank */
+    IBank* createBank (const std::string& uri);
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_FASTA_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankHelpers.cpp b/gatb-core/src/gatb/bank/impl/BankHelpers.cpp
new file mode 100644
index 0000000..8ea2b05
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankHelpers.cpp
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <iostream>
+
+using namespace std;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperties* BankHelper::convert (IBank& in, IBank& out, tools::dp::IteratorListener* progress)
+{
+    // We need an iterator on the input bank.
+    Iterator<Sequence>* itBank = in.iterator();
+    LOCAL (itBank);
+
+    SubjectIterator<Sequence> itSeq (itBank, 100*1000);
+
+    if (progress != 0)  {  itSeq.addObserver (progress);  }
+
+    u_int64_t   nbSeq = 0;
+    u_int64_t sizeSeq = 0;
+
+    // We get current time stamp
+    TimeSystem ts (ITime::MSEC);
+    ITime::Value t0 = ts.getTimeStamp();
+
+    for (itSeq.first(); !itSeq.isDone(); itSeq.next())
+    {
+        nbSeq ++;
+        sizeSeq += (itSeq)->getDataSize();
+
+        out.insert ( itSeq.item());
+    }
+
+    /** We flush the output bank (important if it is a file output). */
+    out.flush ();
+
+    // We get current time stamp
+    ITime::Value t1 = ts.getTimeStamp();
+
+    /** We create the properties result. */
+    Properties* props = new Properties ();
+
+    props->add (0, "conversion", "");
+
+    props->add (1, "time_sec",         "%.2f", (double)(t1-t0)/1000.0);
+    props->add (1, "sequences_number", "%ld",  nbSeq);
+    props->add (1, "sequences_size",   "%ld",  sizeSeq);
+    props->add (1, "output_size",      "%ld",  out.getSize());
+
+    /** We return the result.*/
+    return props;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankHelpers.hpp b/gatb-core/src/gatb/bank/impl/BankHelpers.hpp
new file mode 100644
index 0000000..6d1514e
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankHelpers.hpp
@@ -0,0 +1,212 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankHelpers.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Helpers for managing IBank objects
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_HELPERS_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_HELPERS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/AbstractBank.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/misc/api/IProperty.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Utility class holding useful methods for bank management
+ */
+class BankHelper
+{
+public:
+
+    /** Singleton method.
+     * \return the singleton instance. */
+    static BankHelper& singleton()  { static BankHelper instance; return instance; }
+
+    /** Convert one bank into another one.
+     * \param[in] in  : the bank to be converted
+     * \param[in] out : the converted bank
+     * \param[in] progress : listener getting conversion progression information
+     * */
+    tools::misc::IProperties* convert (IBank& in, IBank& out, tools::dp::IteratorListener* progress=0);
+};
+
+/********************************************************************************/
+
+/** \brief Bank implementation that delegates work to a referred bank.
+ *
+ * Implementation of the Proxy design pattern for the IBank interface.
+ *
+ * This class is not intended to be used by end users; it is rather used for
+ * being subclassed.
+ */
+class BankDelegate : public AbstractBank
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : referred bank.
+     */
+    BankDelegate (IBank* ref) : _ref(0)  { setRef(ref); }
+
+    /** Destructor. */
+    ~BankDelegate () { setRef(0); }
+
+    /** \copydoc AbstractBank::getId */
+    std::string getId ()  { return _ref->getId(); }
+
+	std::string getIdNb (int i)  { return _ref->getIdNb(i); }
+
+	
+    /** \copydoc AbstractBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return _ref->iterator(); }
+
+    /** \copydoc AbstractBank::getNbItems */
+    int64_t getNbItems () { return _ref->getNbItems(); }
+
+    /** \copydoc AbstractBank::insert */
+    void insert (const Sequence& item)   { _ref->insert (item); }
+
+    /** \copydoc AbstractBank::flush */
+    void flush ()  {  _ref->flush ();  }
+
+    /** \copydoc AbstractBank::getSize */
+    u_int64_t getSize ()  { return _ref->getSize(); }
+
+    /** \copydoc AbstractBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)  {  _ref->estimate (number, totalSize, maxSize);  }
+
+    /** \copydoc AbstractBank::estimateNbItems */
+    int64_t estimateNbItems () { return _ref->estimateNbItems(); }
+
+	/** \copydoc AbstractBank::estimateNbItems */
+	int64_t estimateNbItemsBanki (int i) { return _ref->estimateNbItemsBanki(i); }
+	
+    /** \copydoc AbstractBank::estimateSequencesSize */
+    u_int64_t estimateSequencesSize ()  { return _ref->estimateSequencesSize(); }
+
+    /** \copydoc AbstractBank::getEstimateThreshold */
+    u_int64_t getEstimateThreshold ()  { return _ref->getEstimateThreshold(); }
+
+    /** \copydoc AbstractBank::setEstimateThreshold */
+    void setEstimateThreshold (u_int64_t nbSeq)  { _ref->setEstimateThreshold(nbSeq); }
+
+protected:
+
+    IBank* _ref;
+    void setRef (IBank* ref)  { SP_SETATTR(ref); }
+};
+
+/********************************************************************************/
+
+/** \brief Bank that can filter sequences through a provided functor.
+ *
+ * This is an utility class that allows to filter a referred bank with a functor.
+ *
+ * The functor must define the following method:
+ * \code
+ * bool operator() (const Sequence& seq)
+ * \endcode
+ *
+ * -> true means that the sequence is iterated, false the sequence is filtered out.
+ */
+template<typename Filter> class BankFiltered : public BankDelegate
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : referred bank.
+     * \param[in] filter : functor that filters sequence.
+     */
+    BankFiltered (IBank* ref, const Filter& filter) : BankDelegate (ref), _filter(filter)  {}
+
+    /** \copydoc tools::collections::Iterable::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()
+    {
+        // We create one iterator from the reference
+        tools::dp::Iterator<Sequence>* it = _ref->iterator ();
+
+        // We get the composition for this iterator
+        std::vector<tools::dp::Iterator<Sequence>*> iterators = it->getComposition();
+
+        if (iterators.size() == 1)  { return new tools::dp::impl::FilterIterator<Sequence,Filter> (it, _filter); }
+        else
+        {
+            // We are going to create a new CompositeIterator, we won't need the one we just got from the reference
+            LOCAL(it);
+
+            // We may have to encapsulate each sub iterator with the filter.
+            for (size_t i=0; i<iterators.size(); i++)  {
+            	iterators[i] = new tools::dp::impl::FilterIterator<Sequence,Filter> (iterators[i], _filter);
+            }
+            return new tools::dp::impl::CompositeIterator<Sequence> (iterators);
+        }
+    }
+
+private:
+
+    Filter _filter;
+};
+
+/********************************************************************************/
+
+/* \brief Bank factory associated to the BankFiltered class
+ */
+template<typename Filter> class BankFilteredFactory : public IBankFactory
+{
+public:
+
+    /** Constructor.
+     * \param[in] delegateFormat : format of the delegate bank to be created
+     * \param[in] filter : functor used to filtering out some sequences of the referred bank. */
+    BankFilteredFactory (const std::string& delegateFormat, const Filter& filter) : _format(delegateFormat), _filter(filter)  {}
+
+    /** \copydoc IBankFactory::createBank */
+    IBank* createBank (const std::string& uri)
+    {
+        /** We create the reference bank. */
+        IBank* ref = Bank::getFactory(_format)->createBank (uri);
+
+        /** We encapsulate with a filtered bank. */
+        return new BankFiltered<Filter> (ref, _filter);
+    }
+
+private:
+
+    std::string _format;
+    Filter      _filter;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_HELPERS_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankRandom.cpp b/gatb-core/src/gatb/bank/impl/BankRandom.cpp
new file mode 100644
index 0000000..418db0a
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankRandom.cpp
@@ -0,0 +1,147 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankRandom.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankRandom::BankRandom (size_t nbSequences, size_t length)
+    : _nbSequences(nbSequences), _length(length)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankRandom::~BankRandom ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankRandom::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankRandom::Iterator::Iterator(const BankRandom& bank)
+    : _bank(bank),_rank(0), _isDone(true), _dataRef(0)
+{
+    setDataRef (new Data (bank._length, Data::ASCII));
+
+    _item->getData().setRef (_dataRef, 0, bank._length);
+
+    srand (time(NULL));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankRandom::Iterator::~Iterator()
+{
+    setDataRef (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankRandom::Iterator::first()
+{
+    _rank = -1;
+    next ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankRandom::Iterator::next()
+{
+    _isDone = (++_rank >= (int64_t)_bank._nbSequences);
+    if (!_isDone)
+    {
+        static char table[] = {'A', 'C', 'T', 'G' };
+
+        char* buffer = _item->getDataBuffer();
+
+        for (size_t i=0; i<_item->getDataSize(); i++)
+        {
+            buffer [i] = table[rand() % sizeof(table)/sizeof(table[0])];
+        }
+    }
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankRandom.hpp b/gatb-core/src/gatb/bank/impl/BankRandom.hpp
new file mode 100644
index 0000000..6e3206b
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankRandom.hpp
@@ -0,0 +1,131 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankRandom.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Random bank format
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_RANDOM_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_RANDOM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+
+#include <vector>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of IBank for random banks
+ *
+ * This class generates random genomic data and can be used for test purpose.
+ */
+class BankRandom : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "random"; }
+
+    /** Constructor.
+     * \param[in] nbSequences : number of sequences of the random bank
+     * \param[in] length : length of a sequence. */
+    BankRandom (size_t nbSequences, size_t length);
+
+    /** Destructor. */
+    ~BankRandom ();
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()  { return "dummy"; }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return new Iterator (*this); }
+
+    /** */
+    int64_t getNbItems () { return -1; }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item) {}
+
+    /** \copydoc IBank::flush */
+    void flush ()  {}
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ()  { return 0; }
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    /** \return maximum number of files. */
+    static const size_t getMaxNbFiles ()  { return 0; }
+
+    /************************************************************/
+
+    class Iterator : public tools::dp::Iterator<Sequence>
+    {
+    public:
+
+        /** */
+        Iterator(const BankRandom& bank);
+
+        /** */
+        ~Iterator();
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first();
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next();
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()  { return _isDone; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        Sequence& item ()     { return *_item; }
+
+    private:
+        const BankRandom& _bank;
+        int64_t   _rank;
+        bool      _isDone;
+
+        tools::misc::Data* _dataRef;
+        void setDataRef (tools::misc::Data* dataRef)  { SP_SETATTR(dataRef); }
+    };
+
+protected:
+
+    size_t _nbSequences;
+    size_t _length;
+
+    friend class Iterator;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_RANDOM_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankSplitter.cpp b/gatb-core/src/gatb/bank/impl/BankSplitter.cpp
new file mode 100644
index 0000000..41ebde9
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankSplitter.cpp
@@ -0,0 +1,195 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace bank {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankSplitter::BankSplitter (
+    IBank*   reference,
+    size_t   readMeanSize,
+    size_t   overlap,
+    u_int8_t coverage
+)
+    : _reference (0), _readMeanSize(readMeanSize), _coverage(coverage), _overlap(overlap)
+{
+    setReference (reference);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankSplitter::~BankSplitter ()
+{
+    setReference (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankSplitter::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+    gatb::core::tools::dp::Iterator<gatb::core::bank::Sequence>* itSeq = _reference->iterator();
+    LOCAL (itSeq);
+
+    itSeq->first();
+    assert (itSeq->isDone() == false);
+
+    Data& data = itSeq->item().getData();
+
+    size_t offsetMax = data.size() - _readMeanSize;
+    size_t delta     = _readMeanSize -_overlap;
+    size_t nb        = 1 + offsetMax / delta;
+
+    number    = nb * _coverage;
+    totalSize = number * _readMeanSize;
+    maxSize   = _readMeanSize;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankSplitter::Iterator::Iterator(const BankSplitter& bank)
+    : _dataRef (0), _itRef(0), _readMeanSize (bank._readMeanSize),
+      _rank(0), _nbMax(0), _overlap(bank._overlap), _isDone(true)
+{
+    assert (bank._readMeanSize > 0);
+    assert (bank._readMeanSize > bank._overlap);
+
+    /** We get the first sequence of the referred bank. */
+    setItRef (bank._reference->iterator());
+    _itRef->first();
+    assert (_itRef->isDone() == false);
+
+    /** We create the reference Data object (that references the provided string).
+     * NOTE : we force the encoding to be the same as the referred bank. */
+    setDataRef (new Data (_itRef->item().getDataEncoding()));
+    *_dataRef = (*_itRef)->getData();
+
+    _offsetMax = _dataRef->size() - _readMeanSize;
+
+    DEBUG (("refSize=%d  _readMeanSize=%d  _overlap=%d  _offsetMax=%d\n", _reference->size(), _readMeanSize, _overlap, _offsetMax));
+
+    _offsets.clear();
+    size_t idx;
+    size_t delta = _readMeanSize -_overlap;
+    for (idx=0; idx<_offsetMax; idx+=delta)
+    {
+        _offsets.push_back (make_pair (idx,_readMeanSize));
+    }
+    _offsets.push_back (make_pair (idx, _dataRef->size()-idx));
+
+    DEBUG (("FOUND %d offsets\n", _offsets.size()));
+    for (size_t i=0; i<_offsets.size(); i++)
+    {
+        DEBUG (("   %d  %d\n", _offsets[i].first, _offsets[i].second));
+    }
+
+    _nbMax = _offsets.size() * bank._coverage;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+BankSplitter::Iterator::~Iterator()
+{
+    setDataRef(0);
+    setItRef(0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankSplitter::Iterator::first()
+{
+    _rank = -1;
+    next ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void BankSplitter::Iterator::next()
+{
+    _isDone = (++_rank >= _nbMax);
+    if (!_isDone)
+    {
+        size_t offset = _offsets[_rank % (_offsets.size())].first;
+        size_t size   = _offsets[_rank % (_offsets.size())].second;
+
+        _item->getData().setRef (_dataRef, offset, size);
+    }
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/bank/impl/BankSplitter.hpp b/gatb-core/src/gatb/bank/impl/BankSplitter.hpp
new file mode 100644
index 0000000..186bf0d
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankSplitter.hpp
@@ -0,0 +1,162 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankSplitter.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface definition for genomic databases management
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_SPLITTER_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_SPLITTER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+
+#include <vector>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+/** \brief Core package of the GATP project.
+ *
+ * The gatb::core package holds all the fundamental packages needed for writting
+ * assembly algorithms.
+ *
+ * It holds some generic tools, like operating system abstraction, collections management or design patterns
+ * concerns. It also holds recurrent needs as reading genomic banks, handling kmers and so on.
+ */
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace bank      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Split a given bank in pieces.
+ *
+ * This class allows to iterate the sequences of a given bank by splitting them.
+ */
+class BankSplitter : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "splitter"; }
+
+    /** Constructor.
+     * \param[in] reference : reference bank that provides the sequences to be split
+     * \param[in] readMeanSize : size of a read
+     * \param[in] overlap : nucleotides number that overlap between two consecutive reads
+     * \param[in] coverage : number of occurrences for the reads
+     */
+    BankSplitter (
+        IBank* reference,
+        size_t readMeanSize,
+        size_t   overlap,
+        u_int8_t coverage
+    );
+
+    /** Destructor. */
+    ~BankSplitter ();
+
+    /** \copydoc IBank::getId. */
+    std::string getId ()  { return "dummy"; }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return new Iterator (*this); }
+
+    /** */
+    int64_t getNbItems () { return -1; }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item) {}
+
+    /** \copydoc IBank::flush */
+    void flush ()  {}
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ()  { return 0; }
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+
+    /** \return maximum number of files. */
+    static const size_t getMaxNbFiles ()  { return 0; }
+
+    /************************************************************/
+
+    class Iterator : public tools::dp::Iterator<Sequence>
+    {
+    public:
+
+        /** */
+        Iterator(const BankSplitter& bank);
+
+        /** */
+        ~Iterator();
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first();
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next();
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()  { return _isDone; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        Sequence& item ()     { return *_item; }
+
+    private:
+        tools::misc::Data* _dataRef;
+        void setDataRef (tools::misc::Data* dataRef)  { SP_SETATTR(dataRef); }
+
+        tools::dp::Iterator<Sequence>* _itRef;
+        void setItRef (tools::dp::Iterator<Sequence>* itRef)  { SP_SETATTR(itRef); }
+
+        size_t    _readMeanSize;
+        int64_t   _rank;
+        int64_t   _nbMax;
+        size_t    _offsetMax;
+        size_t    _overlap;
+        bool      _isDone;
+
+        typedef std::pair<size_t,size_t> Offset;
+        std::vector<Offset> _offsets;
+    };
+
+protected:
+
+    IBank* _reference;
+    void setReference (IBank* reference) { SP_SETATTR(reference); }
+
+    size_t      _readMeanSize;
+    u_int8_t    _coverage;
+    size_t      _overlap;
+
+    friend class Iterator;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_SPLITTER_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/BankStrings.hpp b/gatb-core/src/gatb/bank/impl/BankStrings.hpp
new file mode 100644
index 0000000..4c57723
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/BankStrings.hpp
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankStrings.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Hard coded genomic bank (mainly for tests)
+ */
+
+#ifndef _GATB_CORE_BANK_IMPL_BANK_STRINGS_HPP_
+#define _GATB_CORE_BANK_IMPL_BANK_STRINGS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/AbstractBank.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <vector>
+#include <string>
+#include <sstream>
+#include <stdarg.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace bank      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief IBank defined by constant strings.
+ *
+ * This class allows to define banks with some nucleotides strings.
+ *
+ * Instances of this class are located in memory only.
+ *
+ * This class is mainly used for tests.
+ */
+class BankStrings : public AbstractBank
+{
+public:
+
+    /** Returns the name of the bank format. */
+    static const char* name()  { return "strings"; }
+
+    /** Constructor. */
+    std::string getId ()  { static std::string s("dummy");  return s; }
+
+    /** Constructor. */
+    BankStrings (const std::vector<std::string>& sequencesData)
+        : _sequencesData(sequencesData), _totalSize(0), _maxSize(0)  {  init ();  }
+
+    /** Constructor. */
+    BankStrings (const char* sequencesData[], size_t nb)  : _totalSize(0), _maxSize(0)
+    {
+        for (size_t i=0; i<nb; i++)  { _sequencesData.push_back (sequencesData[i]); }
+        init ();
+    }
+
+    /** Constructor. */
+    BankStrings (const char* seq, ...) : _totalSize(0), _maxSize(0)
+    {
+        va_list ap;
+        va_start (ap, seq);
+        for (const char* loop=seq; loop != 0; loop = va_arg (ap, const char*))  { _sequencesData.push_back(loop); }
+        va_end   (ap);
+
+        init ();
+    }
+
+    /** \copydoc IBank::iterator */
+    tools::dp::Iterator<Sequence>* iterator ()  { return new tools::dp::impl::VectorIterator2<Sequence> (_sequences); }
+
+    /** \copydoc IBank::getNbItems */
+    int64_t getNbItems () { return _sequences.size(); }
+
+    /** \copydoc IBank::insert */
+    void insert (const Sequence& item)
+    {
+        _totalSize += item.getDataSize();
+        if (_maxSize < item.getDataSize())  {  _maxSize = item.getDataSize(); }
+        _sequences.push_back (item);
+    }
+
+    /** \copydoc IBank::flush */
+    void flush ()  {}
+
+    /** \copydoc IBank::getSize */
+    u_int64_t getSize ()  { return _totalSize; }
+
+    /** \copydoc IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+    {
+        number    = _sequences.size();
+        totalSize = _totalSize;
+        maxSize   = _maxSize;
+    }
+
+protected:
+
+    std::vector<std::string> _sequencesData;
+
+    /** Sequences. */
+    std::vector<Sequence> _sequences;
+
+    u_int64_t _totalSize;
+    u_int64_t _maxSize;
+
+    /** */
+    void init ()
+    {
+        _sequences.resize (_sequencesData.size());
+
+        for (size_t i=0; i<_sequences.size(); i++)
+        {
+            /** Shortcut. */
+            Sequence& s = _sequences[i];
+
+            s.setIndex (i);
+            std::stringstream ss;  ss << "seq_" << i;   s._comment = ss.str();
+            s.getData().setRef ((char*) _sequencesData[i].data(), _sequencesData[i].size());
+
+            _totalSize += _sequencesData[i].size();
+
+            if (_maxSize < _sequencesData[i].size())  {  _maxSize = _sequencesData[i].size(); }
+        }
+    }
+
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_BANK_IMPL_BANK_STRINGS_HPP_ */
diff --git a/gatb-core/src/gatb/bank/impl/Banks.hpp b/gatb-core/src/gatb/bank/impl/Banks.hpp
new file mode 100644
index 0000000..d11ad5a
--- /dev/null
+++ b/gatb-core/src/gatb/bank/impl/Banks.hpp
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Banks.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Include all IBank implementations
+ */
+
+/********************************************************************************/
+
+#include <gatb/bank/impl/BankFasta.hpp>
+#include <gatb/bank/impl/BankBinary.hpp>
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+#include <gatb/bank/impl/BankComposite.hpp>
+#include <gatb/bank/impl/BankAlbum.hpp>
diff --git a/gatb-core/src/gatb/bcalm2/ThreadPool.h b/gatb-core/src/gatb/bcalm2/ThreadPool.h
new file mode 100644
index 0000000..3997e44
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ThreadPool.h
@@ -0,0 +1,130 @@
+// https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h
+//
+// modified so that a thread_id integer in [0..nb_threads] is passed to each task
+//
+// this is third-party code.
+/*
+
+Copyright (c) 2012 Jakob Progsch, Václav Zeman
+
+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.
+*/
+
+#ifndef THREAD_POOL_H
+#define THREAD_POOL_H
+
+#include <vector>
+#include <queue>
+#include <memory>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+#include <future>
+#include <functional>
+#include <stdexcept>
+
+class ThreadPool {
+public:
+    ThreadPool(size_t);
+    template<class F, class... Args>
+    auto enqueue(F&& f, Args&&... args) 
+        -> std::future<typename std::result_of<F(int, Args...)>::type>;
+    //~ThreadPool();
+    void join();
+private:
+    // need to keep track of threads so we can join them
+    std::vector< std::thread > workers;
+    // the task queue
+    std::queue< std::function<void(int)> > tasks;
+    
+    // synchronization
+    std::mutex queue_mutex;
+    std::condition_variable condition;
+    bool stop;
+};
+ 
+// the constructor just launches some amount of workers
+inline ThreadPool::ThreadPool(size_t threads)
+    :   stop(false)
+{
+    for(size_t thread_id = 0; thread_id<threads; ++ thread_id)
+        workers.emplace_back(
+            [this, thread_id]
+            {
+                for(;;)
+                {
+                    std::function<void(int)> task;
+
+                    {
+                        std::unique_lock<std::mutex> lock(this->queue_mutex);
+                        this->condition.wait(lock,
+                            [this]{ return this->stop || !this->tasks.empty(); });
+                        if(this->stop && this->tasks.empty())
+                            return;
+                        task = std::move(this->tasks.front());
+                        this->tasks.pop();
+                    }
+
+                    task(thread_id);
+                }
+            }
+        );
+}
+
+// add new work item to the pool
+template<class F, class... Args>
+auto ThreadPool::enqueue(F&& f, Args&&... args) 
+    -> std::future<typename std::result_of<F(int, Args...)>::type>
+{
+    using return_type = typename std::result_of<F(int, Args...)>::type;
+
+    auto task = std::make_shared< std::packaged_task<return_type(int)> >(
+            std::bind(std::forward<F>(f), std::placeholders::_1, std::forward<Args>(args)...)
+        );
+        
+    std::future<return_type> res = task->get_future();
+    {
+        std::unique_lock<std::mutex> lock(queue_mutex);
+
+        // don't allow enqueueing after stopping the pool
+        if(stop)
+            throw std::runtime_error("enqueue on stopped ThreadPool");
+
+        tasks.emplace([task](int thread_id){ (*task)(thread_id); });
+    }
+    condition.notify_one();
+    return res;
+}
+
+// the destructor joins all threads
+// rayan: slightly modified, now explicit join
+inline /*inline is needed :) else it will define this function many times apparently, see http://stackoverflow.com/questions/2727582/multiple-definition-in-header-file */ 
+void ThreadPool::join()
+{
+    {
+        std::unique_lock<std::mutex> lock(queue_mutex);
+        stop = true;
+    }
+    condition.notify_all();
+    for(std::thread &worker: workers)
+        worker.join();
+}
+
+#endif
diff --git a/gatb-core/src/gatb/bcalm2/bcalm_algo.cpp b/gatb-core/src/gatb/bcalm2/bcalm_algo.cpp
new file mode 100644
index 0000000..30f7860
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/bcalm_algo.cpp
@@ -0,0 +1,857 @@
+#include "bcalm_algo.hpp"
+
+#include <libgen.h> // for basename()
+#include "logging.hpp"
+#include "ograph.h"
+
+#include <assert.h>
+#include <iostream>
+#include <iomanip>
+#include <algorithm>
+#include <chrono>
+#include <tuple>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <atomic>
+#include <thread>
+
+#include "ThreadPool.h"
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/kmer/impl/PartiInfo.hpp>   // for repartitor 
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#define get_wtime() chrono::system_clock::now()
+#ifndef diff_wtime
+#define diff_wtime(x,y) chrono::duration_cast<chrono::nanoseconds>(y - x).count()
+#endif
+
+//#define BINSEQ // "graph4 is not ready" according to antoine. also, initBinSeq provokes segfault at end of bcalm
+
+#ifdef BINSEQ
+#include "binSeq.h"
+#define BUCKET_STR_TYPE binSeq
+#define TO_BUCKET_STR(x) binSeq(x)
+#define FROM_BUCKET_STR(x) (x.str())
+#else
+#define BUCKET_STR_TYPE string
+#define TO_BUCKET_STR(x) x
+#define FROM_BUCKET_STR(x) x
+#endif
+
+
+// timing-related variables
+
+#define THREAD_SAFE_TIMING
+#ifdef THREAD_SAFE_TIMING
+typedef std::atomic<double> atomic_double;
+#else
+#define atomic_double_add(d1,d2) d1 += d2;
+typedef double atomic_double;
+#endif
+
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+
+
+
+
+
+/*
+ * some notes: this code could be further optimized.
+ * many things are saved in plain ascii instead of binary
+ */
+
+using namespace std;
+
+#ifdef THREAD_SAFE_TIMING
+static void atomic_double_add(std::atomic<double> &d1, double d2) {
+      double current = d1.load();
+        while (!d1.compare_exchange_weak(current, current + d2))
+                ;
+}
+#endif
+            
+static atomic_double global_wtime_compactions (0), global_wtime_cdistribution (0), global_wtime_add_nodes (0), global_wtime_create_buckets (0), global_wtime_foreach_bucket (0), global_wtime_lambda (0), global_wtime_parallel (0), global_wtime_longest_lambda (0), global_wtime_best_sched(0);
+
+static bool time_lambdas = true;
+static std::mutex lambda_timing_mutex;
+static size_t nb_threads_simulate=1; // this is somewhat a legacy parameter, i should get rid of (and replace by nb_threads)
+
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+    /* formerly lambda function inside bcalm but needed it in InsertIntoQueues also. no choice here  unless I wanted to typedef Model again*/
+    #define minimizerMin(a,b) ((model.compareIntMinimizers(a,b)) ? a : b)
+    #define minimizerMax(a,b) ((model.compareIntMinimizers(a,b)) ? b : a)
+
+    /* class (formerly a simple lambda function) to process a kmer and decide which bucket(s) it should go to */
+    /* needed to make it a class because i want it to remember its thread index */
+    template <int SPAN>
+    class InsertIntoQueues
+    {
+        typedef typename Kmer<SPAN>::Type  Type;
+        typedef typename Kmer<SPAN>::Count Count;
+        typedef typename Kmer<SPAN>::ModelCanonical ModelCanon;
+        typedef typename Kmer<SPAN>::template ModelMinimizer <ModelCanon> Model;
+        
+        // new version, no longer using a queue-type object.
+        typedef std::tuple<uint32_t, Type, uint32_t, uint32_t, uint32_t> tuple_t;
+        typedef vector<tuple_t> flat_vector_queue_t;
+
+        unsigned int p, k, abundance_threshold, nb_threads;
+        Model &model, &modelK1;
+        std::atomic<unsigned long>  &nb_left_min_diff_right_min, &nb_kmers_in_partition;
+        Repartitor &repart;
+        int _currentThreadIndex;
+        std::vector<BankFasta*> &traveller_kmers_files;
+        vector<std::mutex> &traveller_kmers_save_mutex;
+
+        // saving traveller kmers in plain ASCII in files: a bit wasteful, but went to the easy solution
+        void save_traveller_kmer (uint32_t minimizer, const string& seq, int abundance, uint32_t leftmin, uint32_t rightmin, int p) {
+            Sequence s (Data::ASCII);
+            s.getData().setRef ((char*)seq.c_str(), seq.size());
+            s._comment = to_string(abundance); //abundance in comment
+            traveller_kmers_save_mutex[p].lock();
+            traveller_kmers_files[p]->insert(s);
+            traveller_kmers_save_mutex[p].unlock();
+        }
+
+        public: 
+        vector<flat_vector_queue_t> &flat_bucket_queues;
+
+        /* function to add a kmer to a bucket */
+        void add_to_bucket_queue(uint32_t minimizer, /*  string seq, */ Type &kmer, uint32_t abundance, uint32_t leftmin, uint32_t rightmin)
+        {
+            //bucket_queues.push_back(minimizer,std::make_tuple(TO_BUCKET_STR(seq),leftmin,rightmin,abundance));
+            flat_bucket_queues[getThreadIndex()].push_back(std::make_tuple(minimizer, kmer, abundance, leftmin, rightmin));
+        }
+
+        /* boilerplate constructor */
+        InsertIntoQueues(vector<flat_vector_queue_t> &flat_bucket_queues, 
+                Model &model,
+                Model &modelK1, 
+                unsigned int p, unsigned int k, unsigned int nb_threads,
+                int abundance_threshold,
+                Repartitor &repart,
+                std::atomic<unsigned long> &nb_left_min_diff_right_min,
+                std::atomic<unsigned long> &nb_kmers_in_partition,
+                std::vector<BankFasta*> &traveller_kmers_files,
+                vector<std::mutex> &traveller_kmers_save_mutex
+                ) : 
+            p(p), k(k), abundance_threshold(abundance_threshold), nb_threads(nb_threads),
+            model(model), modelK1(modelK1),
+        nb_left_min_diff_right_min(nb_left_min_diff_right_min), nb_kmers_in_partition(nb_kmers_in_partition),
+        repart(repart), _currentThreadIndex(-1), traveller_kmers_files(traveller_kmers_files),
+        traveller_kmers_save_mutex(traveller_kmers_save_mutex),  flat_bucket_queues(flat_bucket_queues) {}
+
+        /* does the actual work of processing a kmer, computing its minimizers, saving it to the right queue (basically the queue corresponding to its thread) */
+        void operator()     (Count& item) {
+            // if the abundance threshold is higher than the h5 abundance,
+            // filter out this kmer (useful when you want to re-use same .h5 but with higher "-abundance" parameter)
+            size_t abundance = item.abundance;
+            if (abundance < (size_t)abundance_threshold)
+                return;
+
+            Type current = item.value;
+            uint32_t leftMin(modelK1.getMinimizerValue(current >> 2));
+            uint32_t rightMin(modelK1.getMinimizerValue(current));
+
+            ++nb_kmers_in_partition;
+
+            if (repart(leftMin) == p)
+                add_to_bucket_queue(leftMin, current, abundance, leftMin, rightMin);
+
+            if (leftMin != rightMin)
+            {
+                nb_left_min_diff_right_min ++;
+
+                if (repart(rightMin) == p)
+                    add_to_bucket_queue(rightMin, current, abundance, leftMin, rightMin);
+
+                // handle "traveller kmers"
+                uint32_t max_minimizer = minimizerMax(leftMin, rightMin);
+                uint32_t min_minimizer = minimizerMin(leftMin, rightMin);
+                if (repart(max_minimizer) != repart(min_minimizer))
+                {
+                    string seq = model.toString(current);
+                    save_traveller_kmer(max_minimizer, seq, abundance, leftMin, rightMin, repart(max_minimizer));
+                    //add_to_bucket_queue(max_minimizer, seq, leftMin, rightMin, repart(max_minimizer)); // no longer saved into the queue, but to a file instead
+
+                    // sanity check
+                    if (repart(max_minimizer) < repart(min_minimizer))
+                    {                printf("unexpected problem: traveller kmer = %s, min_minimizer=%d max_minimizer=%d, repart(min_minimizer)=%d, repart(max_minimizer)=%d\n", seq.c_str(), min_minimizer, max_minimizer, repart(min_minimizer), repart(max_minimizer));                exit(1);            }
+                }
+            }
+
+            // sanity check
+            if (repart(leftMin) != p && repart(rightMin) != p)
+            {                printf("unexpected problem: repart bucket\n");                exit(1);            }
+        }
+
+        /* neat trick taken from erwan's later work in gatb to find the thread id of a dispatched function */
+        int getThreadIndex()
+        {
+            if (_currentThreadIndex < 0)
+            {
+                std::pair<IThread*,size_t> info;
+                if (ThreadGroup::findThreadInfo (System::thread().getThreadSelf(), info) == true)
+                {
+                    _currentThreadIndex = info.second;
+                }
+                else
+                {
+                    throw Exception("Unable to find thread index during InsertIntoQueues");
+                }
+            }
+            return _currentThreadIndex;
+        }
+
+    };
+
+template<size_t SPAN>
+void bcalm2(Storage *storage, 
+        std::string prefix,
+        int kmerSize, 
+        int abundance_threshold, 
+        int minSize, 
+        int nb_threads, 
+        int minimizer_type, 
+        bool verbose
+        )
+{
+    if (verbose)
+        std::cout << "bcalm_algo params, prefix:" << prefix << " k:" << kmerSize << " a:" << abundance_threshold << " minsize:" << minSize << " threads:" << nb_threads << " mintype:" << minimizer_type << std::endl;
+    if (nb_threads == 0) {std::cout << "oops bcalm called with 0 threads " << std::endl; exit(1);}
+    if (minSize > kmerSize) {std::cout << "oops bcalm called with minSize(" << minSize << ")> kmerSize(" << kmerSize << ")" << std::endl; exit(1);}
+    
+    typedef typename Kmer<SPAN>::Type  Type;
+    typedef typename Kmer<SPAN>::Count Count;
+    typedef typename Kmer<SPAN>::ModelCanonical ModelCanon;
+    typedef typename Kmer<SPAN>::template ModelMinimizer <ModelCanon> Model;
+
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(1);
+
+
+    #ifdef BINSEQ
+    initBinSeq(kmerSize);
+    #endif
+    
+    /** We set BankBinary buffer. */
+    BankBinary::setBufferSize (10000);
+
+    auto start_t=chrono::system_clock::now();
+    size_t maxBucket(0);
+
+    /** We get the dsk and minimizers hash group in the storage object. */
+    Group& dskGroup = storage->getGroup("dsk");
+    Group& minimizersGroup = storage->getGroup("minimizers");
+
+    typedef typename Kmer<SPAN>::Count Count;
+    Partition<Count>& partition = dskGroup.getPartition<Count> ("solid");
+    size_t nb_h5_partitions = partition.size();
+
+    /* get actual number of partitions/passes _during_ DSK. oh so complicated .
+     * this is needed because we need to group passes together. else 
+     * the algo simply doesn't work. */
+    Group& configGroup = storage->getGroup("configuration");
+    stringstream ss; ss << configGroup.getProperty ("xml");
+    Properties props; props.readXML (ss);
+    size_t nb_passes = props.getInt("nb_passes");
+    size_t nb_partitions = props.getInt("nb_partitions");
+
+    if (verbose)
+    {
+        cout << "DSK used " << nb_passes << " passes and " << nb_partitions << " partitions" << std::endl;
+    }
+
+    if (nb_h5_partitions != nb_passes * nb_partitions)
+    {
+        cout << "Error: number of h5 partitions ("<< nb_h5_partitions << ") does not match number of DSK passes*partitions ("\
+            << nb_passes<<"*"<<nb_partitions<<")" << endl;
+        exit(1);
+    }
+
+
+    /** We retrieve the minimizers distribution from the solid kmers storage. */
+    Repartitor repart;
+    repart.load (minimizersGroup);
+
+    u_int64_t rg = ((u_int64_t)1 << (2*minSize));
+
+    /* Retrieve frequency of minimizers;
+     * actually only used in minimizerMin and minimizerMax */
+    uint32_t *freq_order = NULL;
+
+    if (minimizer_type == 1)
+    {
+        freq_order = new uint32_t[rg];
+        Storage::istream is (minimizersGroup, "minimFrequency");
+        is.read ((char*)freq_order, sizeof(uint32_t) * rg);
+    }
+
+    Model model(kmerSize, minSize, typename Kmer<SPAN>::ComparatorMinimizerFrequencyOrLex(), freq_order);
+    Model modelK1(kmerSize-1, minSize,  typename Kmer<SPAN>::ComparatorMinimizerFrequencyOrLex(), freq_order);
+
+    std::vector<BankFasta*> out_to_glue(nb_threads); // each thread will write to its own glue file, to avoid locks
+    
+    // remove potential old glue files
+    for (unsigned int i = 0; i < 10000 /* there cannot be more than 10000 threads, right? unsure if i'll pay for that asumption someday*/; i++)
+    {
+        if (System::file().doesExist(prefix + ".glue." + std::to_string(i)))
+           System::file().remove (prefix + ".glue." + std::to_string(i)); 
+    }
+
+    unsigned long *nb_seqs_in_glue = new unsigned long[nb_threads];
+
+    // another system could have been to send all sequences in a queue, and a thread responsible for writing to glue would dequeue (might be faster)
+    for (unsigned int i = 0; i < (unsigned int)nb_threads; i++)
+    {
+        string glue_file = prefix + ".glue." + std::to_string(i);
+        out_to_glue[i] = new BankFasta(glue_file);
+        nb_seqs_in_glue[i] = 0;
+    }
+
+    double weighted_best_theoretical_speedup_cumul = 0;
+    double weighted_best_theoretical_speedup_sum_times = 0;
+    double weighted_best_theoretical_speedup = 0;
+    double weighted_actual_theoretical_speedup_cumul = 0;
+    double weighted_actual_theoretical_speedup_sum_times = 0;
+    double weighted_actual_theoretical_speedup = 0;
+
+    auto start_buckets=chrono::system_clock::now();
+
+    /* now our vocabulary is: a "DSK partition" == a "partition" == a "super-bucket" */
+    /* buckets remain what they are in bcalm-original */
+    /* a travelling kmer is one that goes to two buckets from different superbuckets */
+
+    // I used to save traveller kmers into bucket_queues, but this would be a memory hog. Let's use files instead. Total volume will be small (a few gigs for human), but that's memory saved
+    std::vector<BankFasta*> traveller_kmers_files(nb_partitions);
+    vector<std::mutex> traveller_kmers_save_mutex(nb_partitions);
+    std::string traveller_kmers_prefix = prefix + ".doubledKmers.";
+    for (unsigned int i = 0; i < nb_partitions; i++)
+        traveller_kmers_files[i] = new BankFasta(traveller_kmers_prefix + std::to_string(i));
+   
+    Dispatcher dispatcher (nb_threads); // setting up a multi-threaded dispatcher, so I guess we can say that things are getting pretty serious now
+
+    // i want to do this but i'm not inside an Algorithm object:
+    /*Iterator<int>* it_parts = Algorithm::createIterator<int>(
+            new Range<int>::Iterator (0,nb_partitions-1), nb_partitions, "Iterating DSK partitions"
+            );*/
+
+    // copied from createIterator in Algorithm.hpp
+    //  We create some listener to be notified every 1000 iterations and attach it to the iterator.
+    IteratorListener* listener;
+    if (verbose)
+        listener = new ProgressTimer(nb_partitions, "Iterating DSK partitions");
+    else
+        listener = new IteratorListener ();
+
+    auto it_parts = new tools::dp::impl::SubjectIterator<int> (
+                new Range<int>::Iterator (0,nb_partitions-1), 
+                nb_partitions/100);
+    it_parts->addObserver (listener);
+    LOCAL(it_parts);
+    
+    bcalm_logging = verbose;
+    logging("prior to queues allocation");
+ 
+    // new version, no longer using a queue-type object.
+    typedef std::tuple<uint32_t, Type, uint32_t, uint32_t, uint32_t> tuple_t;
+    typedef vector<tuple_t> flat_vector_queue_t;
+    vector<flat_vector_queue_t> flat_bucket_queues(nb_threads);
+       
+    logging("Starting BCALM2");
+
+    /*
+     *
+     * Iteration of partitions
+     *
+     *  main thread is going to read kmers from partitions and insert them into queues
+     *
+    */
+    for (it_parts->first (); !it_parts->isDone(); it_parts->next()) /**FOREACH SUPERBUCKET (= partition) **/
+    {
+        uint32_t p = it_parts->item(); /* partition index */
+
+        bool verbose_partition = verbose && ((p % ((nb_partitions+9)/10)) == 0); // only print verbose information 10 times at most
+
+        size_t k = kmerSize;
+
+        std::atomic<unsigned long> nb_left_min_diff_right_min;
+        std::atomic<unsigned long> nb_kmers_in_partition;
+        nb_kmers_in_partition = 0;
+        nb_left_min_diff_right_min = 0;
+        
+        auto start_createbucket_t=get_wtime();
+        
+        InsertIntoQueues<SPAN> insertIntoQueues(flat_bucket_queues, model, modelK1, p, k, nb_threads, abundance_threshold, repart, nb_left_min_diff_right_min, nb_kmers_in_partition, traveller_kmers_files, traveller_kmers_save_mutex);
+
+        /* MAIN FIRST LOOP: expand a superbucket by inserting kmers into queues. this creates buckets */
+        // do it for all passes (because the union of passes correspond to a partition)
+        for (size_t pass_index = 0 ; pass_index < nb_passes; pass_index ++)
+        {
+            /** We retrieve an iterator on the Count objects of the pth partition in pass pass_index */
+            unsigned long interm_partition_index = p + pass_index * nb_partitions;
+            Iterator<Count>* it_kmers = partition[interm_partition_index].iterator();
+            LOCAL (it_kmers);
+
+            if (pass_index == 0) // the first time, 
+                for (int i = 0; i < nb_threads; i++) // resize approximately the bucket queues
+                flat_bucket_queues[i].reserve(partition[interm_partition_index].getNbItems()/nb_threads);
+
+            dispatcher.iterate (it_kmers, insertIntoQueues);
+            /*for (it_kmers->first (); !it_kmers->isDone(); it_kmers->next()) // non-dispatcher version
+                insertIntoQueues(it_kmers->item());*/
+        }
+
+        if (verbose_partition) 
+            cout << endl << "Iterated " << nb_kmers_in_partition << " kmers, among them " << nb_left_min_diff_right_min << " were doubled" << endl;
+
+        // also add traveller kmers that were saved to disk from a previous superbucket
+        // but why don't we need to examine other partitions for potential traveller kmers?
+        // no, because we iterate partitions in minimizer order.
+        // but then you might say again something else:
+        // "i thought bcalm1 needed to iterate partitions in minimizer order, but not bcalm2"
+        // -> indeed, bcalm2 algorithm doesn't, but in the implementation i still choose to iterate in minimizer order.
+        // because it seemed like a good idea at the time, when handling traveller kmers.
+        // an alternative possibility would be to revert to minimizer-type 0 and repartition-type 0
+        // advantages:
+        // - this could enable loading multiple partitions at once (and more parallelization)
+        // - faster kmer counting (16 mins vs 18 mins for cami medium, 1B distinct kmers)
+        // but so far, I have not seen the need to load multiple partitions and the gain for dsk isnt big
+        // disadvantages:
+        // - would need to do a pass to write all traveller kmers to disk at first
+        traveller_kmers_files[p]->flush();
+        string traveller_kmers_file = traveller_kmers_prefix + std::to_string(p);
+        std::atomic<unsigned long> nb_traveller_kmers_loaded;
+        nb_traveller_kmers_loaded = 0;
+
+        if (System::file().doesExist(traveller_kmers_file)) // for some partitions, there may be no traveller kmers
+        {
+
+            BankFasta traveller_kmers_bank (traveller_kmers_file);
+            BankFasta::Iterator it (traveller_kmers_bank);
+       
+            class InsertTravellerKmer
+            {
+                int _currentThreadIndex;
+                vector<flat_vector_queue_t> &flat_bucket_queues;
+                Model &model, &modelK1;
+                int k;
+                std::atomic<unsigned long> &nb_traveller_kmers_loaded;
+
+                public:
+                InsertTravellerKmer(vector<flat_vector_queue_t> &flat_bucket_queues, Model& model, Model &modelK1, int k, std::atomic<unsigned long> &nb_traveller_kmers_loaded) 
+                    : _currentThreadIndex(-1), flat_bucket_queues(flat_bucket_queues), model(model), modelK1(modelK1), k(k), nb_traveller_kmers_loaded(nb_traveller_kmers_loaded) {}
+
+                int getThreadIndex()
+                {
+                    if (_currentThreadIndex < 0)
+                    {
+                        std::pair<IThread*,size_t> info;
+                        if (ThreadGroup::findThreadInfo (System::thread().getThreadSelf(), info) == true)
+                            _currentThreadIndex = info.second;
+                        else
+                            throw Exception("Unable to find thread index during InsertIntoQueues");
+                    }
+                    return _currentThreadIndex;
+                }
+                void operator () (const Sequence &sequence)
+                {
+                    string seq = sequence.toString();
+                    string comment = sequence.getComment();
+                    uint32_t abundance = atoi(comment.c_str());
+
+                    // those could be saved in the BankFasta comment eventually
+                    typename Model::Kmer kmmerBegin = modelK1.codeSeed(seq.substr(0, k - 1).c_str(), Data::ASCII);
+                    uint32_t leftMin(modelK1.getMinimizerValue(kmmerBegin.value()));
+                    typename Model::Kmer kmmerEnd = modelK1.codeSeed(seq.substr(seq.size() - k + 1, k - 1).c_str(), Data::ASCII);
+                    uint32_t rightMin(modelK1.getMinimizerValue(kmmerEnd.value()));
+                    typename Model::Kmer current = model.codeSeed(seq.c_str(), Data::ASCII);
+                    Type kmer = current.value();
+
+                    uint32_t max_minimizer = minimizerMax(leftMin, rightMin);
+                    //add_to_bucket_queue(max_minimizer, seq, abundance, leftMin, rightMin, p);
+                    flat_bucket_queues[getThreadIndex()].push_back(std::make_tuple(max_minimizer, kmer, abundance, leftMin, rightMin));
+                    nb_traveller_kmers_loaded++;
+                }
+            };
+            InsertTravellerKmer insertTravellerKmer(flat_bucket_queues, model, modelK1, k, nb_traveller_kmers_loaded);
+
+            dispatcher.iterate(it,insertTravellerKmer);
+
+            if (verbose_partition) 
+                std::cout << "Loaded " << nb_traveller_kmers_loaded << " doubled kmers for partition " << p << endl;
+            traveller_kmers_bank.finalize();
+            System::file().remove (traveller_kmers_file);
+        }
+
+        /* now that we have computed flat_bucket_queues' by each thread,
+         * sort them by minimizer */
+
+        //logging("begin sorting bucket queues");
+        ThreadPool pool_sort(nb_threads);
+        for (int thread = 0; thread < nb_threads; thread++)
+        {
+            auto sort_cmp = [] (tuple_t const &a, tuple_t const &b) -> bool { return get<0>(a) < get<0>(b); };
+
+	    // todo check si  les minimiseurs sont pas deja quasiment triés dans un sens ou un autre, ca faciliterait le tri ici
+            auto sort_bucket = [&sort_cmp, &flat_bucket_queues, thread] (int thread_id) 
+            {std::sort(flat_bucket_queues[thread].begin(), flat_bucket_queues[thread].end(), sort_cmp);};
+
+            if (nb_threads > 1)
+                pool_sort.enqueue(sort_bucket);
+            else
+                sort_bucket(0);
+        }
+        pool_sort.join();
+        //logging("end sorting bucket queues");
+
+        /* remember which minimizer occurs in flat_bucket_queues' and its start position */
+        set<uint32_t> set_minimizers;
+        vector<uint64_t> nb_kmers_per_minimizer(rg);
+        
+        for (uint64_t i = 0; i < rg; i++)
+            nb_kmers_per_minimizer[i] = 0;
+
+        vector<vector<uint64_t>> start_minimizers(nb_threads);
+        for (int thread = 0; thread < nb_threads; thread++)
+        {
+            // should be done in parallel possibly, if it takes time.
+            set<uint32_t> set_minimizers_thread;
+            start_minimizers[thread].resize(rg);
+            uint64_t pos=0;
+            //std:: cout << "iterating flat bucket queues  for thread " << thread << " elts: " << flat_bucket_queues[thread].size() << std::endl;
+            for (auto v: flat_bucket_queues[thread])
+            {
+                uint32_t minimizer = get<0>(v);
+                if (set_minimizers_thread.find(minimizer) == set_minimizers_thread.end())
+                {
+                    set_minimizers.insert(minimizer);
+                    set_minimizers_thread.insert(minimizer);
+                    start_minimizers[thread][minimizer] = pos;
+                }
+                nb_kmers_per_minimizer[minimizer]++;
+                pos++;
+            }
+        }
+
+        
+        auto end_createbucket_t=get_wtime();
+        atomic_double_add(global_wtime_create_buckets, diff_wtime(start_createbucket_t, end_createbucket_t));
+
+        ThreadPool pool(nb_threads);
+
+        std::vector<double> lambda_timings;
+        auto start_foreach_bucket_t=get_wtime();
+
+        /**FOREACH BUCKET **/
+        for(auto actualMinimizer : set_minimizers)
+        {
+            auto lambdaCompact = [&nb_kmers_per_minimizer, actualMinimizer, &model,
+                &maxBucket, &lambda_timings, &repart, &modelK1, &out_to_glue, &nb_seqs_in_glue, kmerSize, minSize,
+                nb_threads, &start_minimizers, &flat_bucket_queues](int thread_id) {
+                auto start_nodes_t=get_wtime();
+
+                // (make sure to change other places labelled "// graph3" and "// graph4" as well)
+                //graph4 g(kmerSize-1,actualMinimizer,minSize); // graph4
+                uint number_elements(nb_kmers_per_minimizer[actualMinimizer]);
+                #ifdef BINSEQ
+                graph4 graphCompactor(kmerSize-1,actualMinimizer,minSize,number_elements);
+                #else
+                // cout<<"here"<<endl;
+                //graph3 graphCompactor(kmerSize-1,actualMinimizer,minSize,number_elements);
+                graph3<SPAN> graphCompactor(kmerSize-1,actualMinimizer,minSize,number_elements); // graph3<span> switch 
+                #endif
+
+                /* add nodes to graph */
+                //while (bucket_queues.pop_immediately(actualMinimizer,bucket_elt))
+
+                /* go through all the flat_bucket_queues's that were constructed by each thread,
+                     * and iterate a certain minimizer. i dont even need a priority queue! */
+                // used to be in a lambda outside of that lambda, there was a bug, decided to put it here but didnt even solve the bug, fuck me
+                for (int thread = 0; thread < nb_threads; thread++)
+                {
+                    uint64_t pos = start_minimizers[thread][actualMinimizer];
+                    unsigned int size = flat_bucket_queues[thread].size();
+                    if (pos == size) continue;
+                    while (actualMinimizer == get<0>(flat_bucket_queues[thread][pos]))
+                    {
+                        auto tupl = flat_bucket_queues[thread][pos]; // the tuple format in flat_bucket_queues is: (minimizer, seq, abundance, leftmin, rightmin)
+                        std::tuple<BUCKET_STR_TYPE,uint,uint,uint> bucket_elt; // graph3<span> switch 
+                        // g.addleftmin(std::get<1>(bucket_elt));
+                        // g.addrightmin(std::get<2>(bucket_elt));
+                        // g.addvertex(FROM_BUCKET_STR(std::get<0>(bucket_elt)));
+                        string seq = model.toString(get<1>(tupl));
+                        uint32_t a = get<2>(tupl), b = get<3>(tupl), c = get<4>(tupl);
+                        bucket_elt = make_tuple(seq,b,c,a);
+                        //std::cout << " (debug) adding to graph: " << std::get<0>(bucket_elt) << std::endl;
+                        graphCompactor.addtuple(bucket_elt); // addtuple wants that tuple: (seq, leftmin, rightmin, abundance)
+
+                        pos++;
+                        if (pos == size) break;
+                    }
+                }
+
+
+                // cout<<"endaddtuple"<<endl;
+                auto end_nodes_t=get_wtime();
+                atomic_double_add(global_wtime_add_nodes, diff_wtime(start_nodes_t, end_nodes_t));
+
+                /* compact graph*/
+                auto start_dbg=get_wtime();
+                graphCompactor.debruijn();
+
+                auto end_dbg=get_wtime();
+                atomic_double_add(global_wtime_compactions, diff_wtime(start_dbg, end_dbg));
+
+                /* distribute nodes (to other buckets, or output, or glue) */
+                auto start_cdistribution_t=get_wtime();
+                string seq;
+                for(uint32_t i(0);i<number_elements;++i){
+                    if(graphCompactor.output(i)){
+                        #ifdef BINSEQ
+    					seq=graphCompactor.unitigs[i].str(); // graph4
+                        #else
+                        seq=graphCompactor.unitigs[i]; // graph3
+                        //std::vector<unsigned int> abundances ; // graph3 
+                        std::vector<unsigned int>& abundances = graphCompactor.unitigs_abundances[i]; // graph3 // graph3<span> switch 
+                        #endif
+                        //std::cout << " (debug) got from compacted graph: " << seq << std::endl;
+
+                        typename Model::Kmer kmmerBegin = modelK1.codeSeed(seq.substr(0, kmerSize - 1).c_str(), Data::ASCII);
+                        uint leftMin(modelK1.getMinimizerValue(kmmerBegin.value()));
+                        typename Model::Kmer kmmerEnd = modelK1.codeSeed(seq.substr(seq.size() - kmerSize + 1, kmerSize - 1).c_str(), Data::ASCII);
+                        uint rightMin(modelK1.getMinimizerValue(kmmerEnd.value()));
+                        bool lmark = actualMinimizer != leftMin;
+                        bool rmark = actualMinimizer != rightMin;
+
+                        Sequence s (Data::ASCII);
+                        s.getData().setRef ((char*)seq.c_str(), seq.size());
+                        s._comment = string(lmark?"1":"0")+string(rmark?"1":"0"); //We set the sequence comment.
+                        s._comment += " ";
+                        for (auto abundance : abundances)
+                            s._comment += to_string(abundance) + " ";
+                        out_to_glue[thread_id]->insert(s); 
+                        nb_seqs_in_glue[thread_id]++;
+                    }
+                }
+                graphCompactor.clear(); // frees memory allocated during graph3 constructor (sort of a destructor, if you will)
+                auto end_cdistribution_t=get_wtime();
+                atomic_double_add(global_wtime_cdistribution, diff_wtime(start_cdistribution_t, end_cdistribution_t));
+
+                if(number_elements>maxBucket){maxBucket=number_elements;}
+
+                if (time_lambdas)
+                {
+                    auto time_lambda = diff_wtime(start_nodes_t, end_cdistribution_t);
+                    atomic_double_add(global_wtime_lambda, time_lambda);
+                    lambda_timing_mutex.lock();
+                    lambda_timings.push_back(time_lambda);
+                    lambda_timing_mutex.unlock();
+                }
+
+            }; // end lambda function
+
+            if (nb_threads > 1)
+                pool.enqueue(lambdaCompact);
+            else
+                lambdaCompact(0);
+
+        } // end for each bucket
+
+        pool.join();
+        //logging("done compactions");
+            
+        // flush glues, clear flat_bucket_queues
+        for (int thread_id = 0; thread_id < nb_threads; thread_id++)
+        {
+            flat_bucket_queues[thread_id].clear();
+            out_to_glue[thread_id]->flush (); 
+        }
+
+        if (partition[p].getNbItems() == 0)
+            continue; // no stats to print here
+
+        /* compute and print timings */
+        {
+            auto end_foreach_bucket_t=get_wtime();
+            auto wallclock_sb = diff_wtime(start_foreach_bucket_t, end_foreach_bucket_t);
+            atomic_double_add(global_wtime_foreach_bucket, wallclock_sb);
+            atomic_double_add(global_wtime_parallel, wallclock_sb);
+
+            if (time_lambdas && lambda_timings.size() > 0)
+            {
+                std::sort(lambda_timings.begin(), lambda_timings.end());
+                std::reverse(lambda_timings.begin(), lambda_timings.end());
+                /* compute a theoretical, i think optimal, scheduling of lambda's using the current number of threads
+                */
+                double tot_time_best_sched_lambda = 0; // start with the longest lambda
+                int t = 0;
+                for (auto & lambda_time: lambda_timings) {
+                    if ((t++) % nb_threads_simulate == 0)
+                        tot_time_best_sched_lambda += lambda_time;
+                }
+
+                double longest_lambda = lambda_timings.front();
+
+                if (verbose_partition)
+                {
+                    cout <<"\nIn this superbucket (containing " << set_minimizers.size() << " active minimizers)," <<endl;
+                    cout <<"                  sum of time spent in lambda's: "<< global_wtime_lambda / 1000000 <<" msecs" <<endl;
+                    cout <<"                                 longest lambda: "<< longest_lambda / 1000000 <<" msecs" <<endl;
+                    cout <<"         tot time of best scheduling of lambdas: "<< tot_time_best_sched_lambda / 1000000 <<" msecs" <<endl;
+                }
+
+                double best_theoretical_speedup =  global_wtime_lambda  / longest_lambda;
+                double actual_theoretical_speedup =  global_wtime_lambda  / tot_time_best_sched_lambda;
+
+                if (verbose_partition)
+                {
+                    cout <<"                       best theoretical speedup: "<<  best_theoretical_speedup << "x" <<endl;
+                    if (nb_threads_simulate > 1)
+                        cout <<"     best theoretical speedup with "<< nb_threads_simulate << " thread(s): "<<  actual_theoretical_speedup << "x" <<endl;
+                }
+
+                weighted_best_theoretical_speedup_cumul += best_theoretical_speedup * wallclock_sb;
+                weighted_best_theoretical_speedup_sum_times                        += wallclock_sb;
+                weighted_best_theoretical_speedup = weighted_best_theoretical_speedup_cumul / weighted_best_theoretical_speedup_sum_times ;
+
+                weighted_actual_theoretical_speedup_cumul += actual_theoretical_speedup * wallclock_sb;
+                weighted_actual_theoretical_speedup_sum_times                        += wallclock_sb;
+                weighted_actual_theoretical_speedup = weighted_actual_theoretical_speedup_cumul / weighted_actual_theoretical_speedup_sum_times ;
+                atomic_double_add(global_wtime_longest_lambda, longest_lambda);
+                atomic_double_add(global_wtime_best_sched, tot_time_best_sched_lambda);
+                global_wtime_lambda = 0;
+            }
+        }
+
+        if (verbose_partition)
+            logging("Done with partition " + std::to_string(p));
+    } // end iteration superbuckets
+    
+    /*
+     *
+     * Finishing up
+     *
+     */
+
+    // create list of non empty glues
+    std::ofstream list_of_glues(prefix + ".glue"); 
+    for (unsigned int i = 0; i < (unsigned int)nb_threads; i++)
+    {
+
+        char* prefix_copy = strdup (prefix.c_str());
+        std::string prefix_base (basename(prefix_copy)); // posix basename() may alter the string
+        free (prefix_copy);
+
+        string glue_file = prefix_base + ".glue." + std::to_string(i);
+        if (nb_seqs_in_glue[i])
+        {
+            list_of_glues << glue_file << endl;
+        }
+    }
+    list_of_glues.close();
+
+    // gather some stats
+    uint64_t nbSeqsInGlue = 0;
+    for (int thread_id = 0; thread_id < nb_threads; thread_id++)
+        nbSeqsInGlue += nb_seqs_in_glue[thread_id];
+
+    auto end_t=chrono::system_clock::now();
+    float wtime = chrono::duration_cast<chrono::nanoseconds>(end_t - start_buckets).count() / unit;
+
+    Group& bcalmGroup = storage->getGroup("bcalm");
+    bcalmGroup.setProperty ("nb_sequences_in_glue",     Stringify::format("%ld", nbSeqsInGlue));
+    bcalmGroup.setProperty ("wtime_compactions",     Stringify::format("%f", wtime));
+
+    /* printing some timing stats */
+    if (verbose) 
+    {
+        cout <<"Number of sequences in glue: "<< nbSeqsInGlue << std::endl;
+        cout<<"Buckets compaction and gluing           : "<< wtime <<" secs"<<endl;
+        cout<<"Within that, \n";
+        cout <<"                                 creating buckets from superbuckets: "<< global_wtime_create_buckets / unit <<" secs"<<endl;
+        cout <<"                      bucket compaction (wall-clock during threads): "<< global_wtime_foreach_bucket / unit <<" secs" <<endl;
+        cout <<"\n                within all bucket compaction threads,\n";
+        cout <<"                       adding nodes to subgraphs: "<< global_wtime_add_nodes / unit <<" secs" <<endl;
+        cout <<"         subgraphs constructions and compactions: "<< global_wtime_compactions / unit <<" secs"<<endl;
+        cout <<"                  compacted nodes redistribution: "<< global_wtime_cdistribution / unit <<" secs"<<endl;
+    }
+    double sum =  global_wtime_cdistribution + global_wtime_compactions + global_wtime_add_nodes + global_wtime_create_buckets;
+    if (verbose) 
+        cout<<"Sum of CPU times for bucket compactions: "<< sum / unit <<" secs"<<endl;
+    if (nb_threads == 1)
+    {
+        if (verbose)
+        cout<<"Discrepancy between sum of fine-grained timings and total wallclock of buckets compactions step: "<< (chrono::duration_cast<chrono::nanoseconds>(end_t-start_buckets).count() - sum ) / unit <<" secs"<<endl;
+    }
+
+    if (verbose)
+        cout<<"BCALM total wallclock (excl kmer counting): "<<chrono::duration_cast<chrono::nanoseconds>(end_t-start_t).count() / unit <<" secs"<<endl;
+
+    if (verbose) 
+        cout<<"Maximum number of kmers in a subgraph: "<<maxBucket<<endl;
+
+    if (time_lambdas && verbose)
+    {
+        cout<<"Performance of compaction step:\n"<<endl;
+        cout<<"                 Wallclock time spent in parallel section : "<< global_wtime_parallel / unit << " secs"<<endl;
+        cout<<"             Best theoretical speedup in parallel section : "<< weighted_best_theoretical_speedup << "x" <<endl;
+        cout<<"Best theor. speedup in parallel section using " << nb_threads_simulate << " threads : "<< weighted_actual_theoretical_speedup << "x" <<endl;
+        cout<<"             Sum of longest bucket compaction for each sb : "<< global_wtime_longest_lambda / unit << " secs"<<endl;
+        cout<<"                       Sum of best scheduling for each sb : "<< global_wtime_best_sched / unit << " secs"<<endl;
+    }
+
+    // cleanup everything that was new'd
+    if (minimizer_type == 1)
+        delete[] freq_order;
+    delete[] nb_seqs_in_glue;
+    for (unsigned int i = 0; i < (unsigned int)nb_threads; i++)
+        delete out_to_glue[i];
+    for (unsigned int i = 0; i < nb_partitions; i++)
+        delete traveller_kmers_files[i];
+
+    logging("Done with all compactions");
+
+    //delete storage; exit(0); // to stop after bcalm, before bglue
+}
+
+
+}}}}
diff --git a/gatb-core/src/gatb/bcalm2/bcalm_algo.hpp b/gatb-core/src/gatb/bcalm2/bcalm_algo.hpp
new file mode 100644
index 0000000..6364f04
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/bcalm_algo.hpp
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014-2016  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+
+#ifndef _GATB_CORE_BCALM_ALGO_HPP_
+#define _GATB_CORE_BCALM_ALGO_HPP_
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+    template<size_t SPAN>
+void bcalm2(gatb::core::tools::storage::impl::Storage* storage, 
+        std::string prefix,
+        int kmerSize, 
+        int abundance, 
+        int minSize, 
+        int nb_threads, 
+        int minimizer_type, 
+        bool verbose
+        );
+
+}}}}
+
+#endif
diff --git a/gatb-core/src/gatb/bcalm2/bglue_algo.cpp b/gatb-core/src/gatb/bcalm2/bglue_algo.cpp
new file mode 100644
index 0000000..136955d
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/bglue_algo.cpp
@@ -0,0 +1,1152 @@
+/* remaining issue:
+- no more than 2^(32-1) sequences to glue together (should be ok for spruce)
+*/
+#include "bglue_algo.hpp"
+
+#include <unordered_map>
+#include "unionFind.hpp"
+#include <BooPHF/BooPHF.h>
+#include "ThreadPool.h"
+
+#include "logging.hpp"
+/*#include "buffer_allocator.tcc"
+#include "buffer_manager.tcc"*/
+#include <sstream>
+#include <iomanip>
+
+/*#include "ctpl_stl.h" // alternative to threadpool // https://github.com/vit-vit/CTPL/blob/master/ctpl_stl.h // didn't commit because didnt use
+#include "buffer_allocator.h" // memory pool from https://github.com/vincetse/allocator, didn't commit the files because didnt use
+#include "buffer_manager.h" // memory pool
+*/
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/kmer/impl/PartiInfo.hpp>   // for repartitor 
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/collections/impl/BooPHF.hpp>
+
+#include <queue> // for priority_queue
+
+
+//heh at this point I could have maybe just included gatb_core.hpp but well, no circular dependencies, this file is part of gatb-core now.
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+
+
+using namespace std;
+
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+    template <typename T>
+std::string to_string_with_precision(const T a_value, const int n = 1)
+{
+        std::ostringstream out;
+            out << std::fixed << std::setprecision(n) << a_value;
+                return out.str();
+}
+
+  // a hash wrapper for hashing kmers in Model form
+    template <typename ModelType>
+    class Hasher_T
+    {
+       public:
+        ModelType model;
+
+        Hasher_T(ModelType &model) : model(model) {};
+
+        // fun fact: I tried with a mask = (1<<25)-1, 
+        // and with chr14, it produced one big partition. So i guess that hash image needs to be large
+        uint64_t operator ()  (const typename ModelType::Kmer& key, uint64_t seed = 0) const  {
+                return model.getHash(key.value()) ;
+                }
+    };
+
+
+ template <typename T>
+void free_memory_vector(std::vector<T> &vec)
+{
+    vec.clear();
+    vector<T>().swap(vec); // it's a trick to properly free the memory, as clear() doesn't cut it (http://stackoverflow.com/questions/3477715/c-vectorclear)
+}
+
+
+static 
+char rc /*cheap desambiguation compared to GraphUnitigs because TemplateSpecialization8 complains */(char s) {
+	if (s == 'A') return 'T';
+	else if (s == 'C') return 'G';
+	else if (s == 'G') return 'C';
+	else if (s == 'T') return 'A';
+	else if (s == 'a') return 't';
+	else if (s == 'c') return 'g';
+	else if (s == 'g') return 'c';
+	else if (s == 't') return 'a';
+	return 'X';
+}
+
+
+static string rc(const string &s) {
+	string rcs = "";
+	for (signed int i = s.length() - 1; i >= 0; i--) {rcs += rc(((char)s[i]));}
+	return rcs;
+}
+
+
+// manipulation of abundance vectors encoded as strings. recent addition (post-publication)
+
+static float get_mean_abundance(const string& list)
+{
+    float mean_abundance=0;
+    int n=0;
+    std::stringstream stream(list);
+    while(1) {
+        int a;
+        stream >> a;
+        if(!stream)
+            break;
+        mean_abundance +=a;
+        n++;
+    }
+    return mean_abundance / (float)n;
+}
+
+static uint64_t get_sum_abundance(const string& list)
+{
+    uint64_t sum_abundances=0;
+    std::stringstream stream(list);
+    while(1) {
+        int a;
+        stream >> a;
+        if(!stream)
+            break;
+        sum_abundances +=a;
+    }
+    if (sum_abundances > 2000000000LL) std::cout << "warning, large abundance reached, may have printing problems" << std::endl; // maybe will disrupt optimizing the code of that function, but it's not that critical
+    return sum_abundances;
+}
+
+
+static string reverse_abundances(const string& list)
+{
+    string rev="";
+    std::stringstream stream(list);
+    while(1) {
+        int a;
+        stream >> a;
+        if(!stream)
+            break;
+        rev = to_string(a) + " " + rev;
+    }
+    return rev;
+}
+
+static string skip_first_abundance(const string& list)
+{
+    string res="";
+    std::stringstream stream(list);
+    bool skip = true;
+    while(1) {
+        int a;
+        stream >> a;
+        if(!stream)
+            break;
+        if (skip)
+        {
+            skip = false;
+            continue;
+        }
+        res += to_string(a) + " ";
+    }
+    return res;
+}
+
+
+template<int SPAN>
+struct markedSeq
+{
+    // there used to be "string seq; string abundance" but i noticed that i did not need that info for determining the chain of glues. not much space saved though (like 10-20%). I suppose the biggest memory-hog is the ks/ke unordered_map
+    uint64_t index;
+    bool rc;
+    bool lmark, rmark;
+    typedef typename Kmer<SPAN>::Type Type;
+    Type ks, ke; // [start,end] kmers of seq, in canonical form (redundant information with seq, but helpful)
+
+    markedSeq(uint64_t index, bool lmark, bool rmark, const Type &ks, const Type &ke) : index(index), rc(false), lmark(lmark), rmark(rmark), ks(ks), ke(ke) {};
+
+    void revcomp()
+    {
+        rc = !rc;
+        std::swap(lmark, rmark);
+        std::swap(ks, ke);
+    }
+};
+
+
+// hack to refer to a sequences in msInPart as reverse complemented
+
+static uint32_t is_rev_index(uint32_t index)
+{
+    return ((index >> 31 & 1) == 1);
+}
+
+
+static uint32_t rev_index(uint32_t index)
+{
+    if (is_rev_index(index))
+    { std::cout << "Error: glue sequence index too large " << index << std::endl; exit(1);}
+    return index | (1<<31);
+}
+
+static uint32_t no_rev_index(uint32_t index)
+{
+    return index & ((1LL<<31) - 1LL);
+}
+
+//typedef lazy::memory::buffer_allocator<markedSeq> custom_allocator_t;
+//typedef std::allocator<markedSeq> custom_allocator_t;
+
+/* input: markedSequences, list of sequences in a partition
+ * output: res, a list of lists of sequences that will be glued together
+ */
+template<int SPAN>
+static void determine_order_sequences(vector<vector<uint32_t>> &res, const vector<markedSeq<SPAN>> &markedSequences, int kmerSize, bool debug=false)
+{
+    typedef typename Kmer<SPAN>::Type Type;
+    unordered_map<Type, set<uint32_t> > kmerIndex;
+    set<uint32_t> usedSeq;
+    unsigned int nb_chained = 0;
+
+    // index kmers to their seq
+    // kmerIndex associates a kmer extremity to its index in markedSequences
+    for (uint32_t i = 0; i < markedSequences.size(); i++)
+    {
+        kmerIndex[markedSequences[i].ks].insert(i);
+        kmerIndex[markedSequences[i].ke].insert(i);
+    }
+
+    auto glue_from_extremity = [&](markedSeq<SPAN> current, uint32_t chain_index, uint32_t markedSequence_index)
+    {
+        vector<uint32_t> chain;
+        chain.push_back(chain_index);
+
+        bool rmark = current.rmark;
+        usedSeq.insert(markedSequence_index);
+
+        while (rmark)
+        {
+            if (debug)
+                std::cout << "current ke " << current.ke << " index " << no_rev_index(chain_index) << " markings: " << current.lmark << current.rmark <<std::endl;
+
+            // this sequence has a rmark, so necessarily there is another sequence to glue it with. find it here.
+            set<uint32_t> candidateSuccessors = kmerIndex[current.ke];
+           
+            assert(candidateSuccessors.find(markedSequence_index) != candidateSuccessors.end()); // remove the current seq from our indexing data structure 
+            candidateSuccessors.erase(markedSequence_index);
+
+            assert(candidateSuccessors.size() == 1); // normally there is exactly one sequence to glue with
+
+            uint32_t successor_index = *candidateSuccessors.begin(); // pop()
+            assert(successor_index != markedSequence_index);
+            markedSeq<SPAN> successor = markedSequences[successor_index];
+
+            chain_index = markedSequences[successor_index].index;
+
+            if (successor.ks != current.ke || (!successor.lmark))
+            {
+                successor.revcomp();
+                chain_index = rev_index(chain_index);
+            }
+
+            // some checks
+            {
+                if (debug)
+                    std::cout << "successor " << successor_index /*<<" successor ks ke "  << successor.ks << " "<< successor.ke*/ /* need to convert Type to string to print, didn't bother writing that code yet */ << " markings: " << successor.lmark << successor.rmark << std::endl;
+                assert(successor.lmark);
+                assert(successor.ks == current.ke);
+                // edge case where the seq to be glued starts and ends with itself. 
+                // it should be a kmer (is tested below with an assert())
+                if (successor.ks == successor.ke)
+                {
+                    if (successor.lmark == false)
+                        assert(successor.rmark == true);
+                    else
+                        assert(successor.rmark == false);
+                    // it's the only possible cases I can think of
+                    // there is actually nothing to be done now, it's an extremity, so it will end.
+                    // on a side note, it's pointless to save this kmer in bcalm.
+                }
+            }
+
+            current = successor;
+            markedSequence_index = successor_index;
+            chain.push_back(chain_index);
+            rmark = current.rmark;
+            assert((usedSeq.find(markedSequence_index) == usedSeq.end()));
+            usedSeq.insert(markedSequence_index);
+        }
+
+        res.push_back(chain);
+        nb_chained += chain.size();
+
+    };
+
+    // iterated markedSequences, and picks extremities of a chain
+    for (unsigned int i = 0; i < markedSequences.size(); i++)
+    {
+        markedSeq<SPAN> current = markedSequences[i];
+        if (usedSeq.find(i) != usedSeq.end())
+        {
+            if (debug)
+                std::cout << "sequence has already been glued" << std::endl;
+            continue; 
+        }
+
+        if (current.lmark && current.rmark)
+        {
+            if (debug)
+                std::cout << "not the extremity of a chain" << std::endl;
+            continue;  
+        }
+    
+        /* normalize sequence so that lmark is false */
+        uint32_t chain_index = markedSequences[i].index;
+        if (current.lmark)
+        {
+            current.revcomp(); 
+            chain_index = rev_index(chain_index);
+        }
+
+        assert(current.lmark == false);    
+
+        glue_from_extremity(current, chain_index, i);
+
+    }
+
+    /* // attempt to fix circular contigs, but I was in a hurry, so not finished
+    while (nb_chained < sequences.size())
+    {
+        // there might be a special case: a circular unitig, to be glued with multiple sequences all containing doubled kmers at extremities
+        // my fix plan: we pick an extremity at random, and chop the last nucleotide and mark it to not be glued. also find the corresponding kmer in other extremity, and mark it as not to be glued
+
+        vector<int> remaining_indices;
+        for (uint32_t i = 0; i < markedSequences.size(); i++)
+        {
+            if (usedSeq.find(i) != usedSeq.end())
+                remaining_indices.push_back(i);
+        }
+        uint32_t chain_index = remaining_indices[0];
+        string kmer = markedSequences[chain_index].substr(0,kmerSize);
+       // markedSequences[chain_index] = // TODO continue
+    }
+    */
+    if (nb_chained < markedSequences.size())
+    {
+        std::cout << " Note: " << markedSequences.size() - nb_chained << " sequence chunks not returned in output unitigs (likely small circular contigs)" << std::endl;
+    }
+    // assert(sequences.size() == nb_chained); // make sure we've scheduled to glue all sequences in this partition
+}
+
+/* straightforward glueing of a chain
+ * sequences should be ordered and in the right orientation
+ * so, it' just a matter of chopping of the first kmer
+ */
+static void glue_sequences(vector<uint32_t> &chain, std::vector<std::string> &sequences, std::vector<std::string> &abundances, int kmerSize, string &res_seq, string &res_abundances)
+{
+    bool debug=false;
+
+    string previous_kmer = "";
+    unsigned int k = kmerSize;
+    
+    if (debug) std::cout << "glueing new chain: ";
+    for (auto it = chain.begin(); it != chain.end(); it++)
+    {
+        uint32_t idx = *it;
+
+        string seq = sequences[no_rev_index(idx)];
+        string abs = abundances[no_rev_index(idx)];
+
+        if (is_rev_index(idx))
+        {
+            seq = rc(seq);
+            abs = reverse_abundances(abs);
+        }
+        
+        if (previous_kmer.size() == 0) // it's the first element in a chain
+        {
+            res_seq += seq;
+            res_abundances += abs;
+        }
+        else
+        {
+            assert(seq.substr(0, k).compare(previous_kmer) == 0);
+            res_seq += seq.substr(k);
+            res_abundances += skip_first_abundance(abs);
+        }
+    
+        if (debug) std::cout << seq << " ";
+
+        previous_kmer = seq.substr(seq.size() - k);
+        assert(previous_kmer.size() == k);
+    }
+     if (debug) std::cout << std::endl;
+}
+
+
+static void output(const string &seq, gatb::core::debruijn::impl::BufferedFasta &out, const string comment = "")
+{
+    out.insert(seq, comment);
+    // BufferedFasta takes care of the flush
+}
+
+
+
+ // used to get top N elements of a vector
+template <typename T>
+struct Comp{
+    Comp( const vector<T>& v ) : _v(v) {}
+    bool operator ()(T a, T b) { return _v[a] > _v[b]; }
+    const vector<T>& _v;
+};
+
+
+// taken from GATB's MPHF.hpp and BooPHF.hpp (except that we don't need the iteration stuff from that file)
+template<typename Key>
+class hasher_t
+{   
+    typedef jenkins64_hasher BaseHasher; /* from BooPHF.hpp, which itself is from emphf:base_hasher */
+    BaseHasher emphf_hasher;
+    AdaptatorDefault<Key> adaptor;
+
+    public:
+    hasher_t(){
+        std::mt19937_64 rng(37); // deterministic seed
+        emphf_hasher = BaseHasher::generate(rng);
+    }
+
+    uint64_t operator ()  (const Key& key, uint64_t seed = 0) const  {
+        if (seed != 0x33333333CCCCCCCCULL)
+            return std::get<0>(emphf_hasher(adaptor(key)));
+        return std::get<2>(emphf_hasher(adaptor(key)));
+        // this is a big hack, because I'm lazy. 
+        // I wanted to return two different hashes depending on how boophf calls it
+        // since I contrl BooPHF code's, I know it calls this function with 0x33333333CCCCCCCCULL as the second seed.
+    }
+};
+    
+typedef uint64_t partition_t;
+
+/* computes and uniquifies the hashes of marked kmers at extremities of all to-be-glued sequences */
+template <int SPAN>
+void prepare_uf(std::string prefix, IBank *in, const int nb_threads, int& kmerSize, int pass, int nb_passes, uint64_t &nb_elts, uint64_t estimated_nb_glue_sequences)
+{
+  
+    std::atomic<unsigned long> nb_marked_extremities, nb_unmarked_extremities; 
+    nb_marked_extremities = 0; nb_unmarked_extremities = 0;
+
+    std::vector<std::vector<partition_t >> uf_hashes_vectors(nb_threads);
+    
+    // relatively accurate number of sequences to be inserted
+    for (int i = 0; i < nb_threads; i++)
+        uf_hashes_vectors[i].reserve(estimated_nb_glue_sequences/(nb_passes*nb_threads));
+
+    /* class (formerly a simple lambda function) to process a kmer and decide which bucket(s) it should go to */
+    /* needed to make it a class because i want it to remember its thread index */
+    class UniquifyKeys 
+    {
+        typedef typename Kmer<SPAN>::ModelCanonical ModelCanon;
+        
+        int k;
+        int pass, nb_passes, nb_threads;
+        ModelCanon modelCanon;
+        Hasher_T<ModelCanon> hasher;
+        std::atomic<unsigned long> &nb_marked_extremities, &nb_unmarked_extremities; 
+        std::vector<std::vector<partition_t >> &uf_hashes_vectors;
+        int _currentThreadIndex;
+
+        public: 
+        UniquifyKeys(int k, int pass, int nb_passes, int nb_threads,
+                     std::atomic<unsigned long> &nb_marked_extremities, std::atomic<unsigned long> & nb_unmarked_extremities,
+                    std::vector<std::vector<partition_t >> &uf_hashes_vectors
+                     ) : k(k), pass(pass), nb_passes(nb_passes), nb_threads(nb_threads), modelCanon(k), hasher(modelCanon),
+                        nb_marked_extremities(nb_marked_extremities), nb_unmarked_extremities(nb_unmarked_extremities),
+                         uf_hashes_vectors(uf_hashes_vectors), _currentThreadIndex(-1)
+        {}
+ 
+        void operator()     (const Sequence& sequence) {
+            const string seq = sequence.toString(); 
+            const string comment = sequence.getComment();
+
+            const bool lmark = comment[0] == '1';
+            const bool rmark = comment[1] == '1';
+            int thread = getThreadIndex();
+
+            if (lmark)
+            {
+                const string kmerBegin = seq.substr(0, k );
+                // UF of canonical kmers in ModelCanon form, then hashed
+                const typename ModelCanon::Kmer kmmerBegin = modelCanon.codeSeed(kmerBegin.c_str(), Data::ASCII);
+                const uint64_t h1 = hasher(kmmerBegin);
+                if (h1 % (uint64_t)nb_passes == (uint64_t)pass)
+                {
+                    uf_hashes_vectors[thread].push_back(h1);
+                    nb_marked_extremities++;
+                }
+            }
+            else 
+                nb_unmarked_extremities++;
+
+            if (rmark)
+            {
+                const string kmerEnd = seq.substr(seq.size() - k , k );
+                const typename ModelCanon::Kmer kmmerEnd = modelCanon.codeSeed(kmerEnd.c_str(), Data::ASCII);
+                const uint64_t h2 = hasher(kmmerEnd);
+
+                if (h2 % (uint64_t)nb_passes == (uint64_t)pass)
+                {
+                    uf_hashes_vectors[thread].push_back(h2);
+                    nb_marked_extremities++;
+                }
+            }
+            else
+                nb_unmarked_extremities++;
+        }
+
+        /* neat trick taken from erwan's later work in gatb to find the thread id of a dispatched function */
+        int getThreadIndex()
+        {
+            if (_currentThreadIndex < 0)
+            {
+                std::pair<IThread*,size_t> info;
+                if (ThreadGroup::findThreadInfo (System::thread().getThreadSelf(), info) == true)
+                {
+                    _currentThreadIndex = info.second;
+                }
+                else
+                {
+                    throw Exception("Unable to find thread index during InsertIntoQueues");
+                }
+            }
+            return _currentThreadIndex;
+        }
+    };
+
+
+    Dispatcher dispatcher (nb_threads);
+
+    UniquifyKeys uniquifyKeys(kmerSize, pass, nb_passes, nb_threads,
+                              nb_marked_extremities, nb_unmarked_extremities,
+                              uf_hashes_vectors);
+    dispatcher.iterate (in->iterator(), uniquifyKeys);
+    logging( std::to_string(nb_marked_extremities.load()) + " marked kmers, " + std::to_string(nb_unmarked_extremities.load()) + " unmarked kmers");
+
+
+    //
+    // single-threaded version
+    /* auto it = in->iterator();    
+     for (it->first (); !it->isDone(); it->next())
+        prepareUF(it->item());*/
+
+
+    logging("created vector of hashes, size approx " + std::to_string( sizeof(partition_t)*nb_marked_extremities.load()/1024/1024) + " MB)");
+    ThreadPool uf_sort_pool(nb_threads); // ThreadPool
+  //  ctpl::thread_pool uf_merge_pool(nb_threads);
+
+    // sort and uniquify UF vectors (from uf_hashes_vector). the uniquify is actually optional but doesn't cost much
+    for (int i = 0; i < nb_threads; i++)
+    {
+        auto sortuniq = [&uf_hashes_vectors, i] (int thread_id)
+        {
+            std::vector<partition_t> &vec = uf_hashes_vectors[i];
+            sort( vec.begin(), vec.end() );
+            vec.erase( unique( vec.begin(), vec.end() ), vec.end() );
+        };
+        uf_sort_pool.enqueue(sortuniq);  // ThreadPool
+        //uf_sort_pool.push(sortuniq);  // ctpl
+        //sortuniq(0); // single-threaded
+    }
+
+    uf_sort_pool.join(); // ThreadPool
+    
+    
+    // a single-threaded merge and write to file before they're loaded again in bglue
+    BagFile<uint64_t> * bagf = new BagFile<uint64_t>( prefix+".glue.hashes."+ to_string(pass)); LOCAL(bagf); 
+	Bag<uint64_t> * currentbag =  new BagCache<uint64_t> (  bagf, 10000 ); LOCAL(currentbag);// really? we have to through these hoops to do a simple binary file in gatb? gotta change this.
+    uint64_t nb_elts_pass = 0;
+
+    priority_queue<std::tuple<uint64_t,int>, std::vector<std::tuple<uint64_t,int>>, std::greater<std::tuple<uint64_t,int>> > pq; // http://stackoverflow.com/questions/2439283/how-can-i-create-min-stl-priority-queue
+    vector<uint64_t> hash_vector_idx(nb_threads);
+    vector<uint64_t> hash_vector_size(nb_threads);
+
+    // prime the pq
+    for (int i = 0; i < nb_threads; i++)
+    {
+        hash_vector_idx[i] = 0;
+        hash_vector_size[i] = uf_hashes_vectors[i].size();
+        if (hash_vector_size[i] > 0)
+            pq.emplace(make_tuple(uf_hashes_vectors[i][hash_vector_idx[i]++], i));
+    }
+
+    uint64_t prev = 0;
+    while (pq.size() > 0)
+    {
+        std::tuple<uint64_t, int> elt = pq.top(); pq.pop();
+        uint64_t cur = get<0>(elt);
+        //std::cout << "got " << cur << " queue " << get<1>(elt) << std::endl;
+        if (cur != prev)
+        {
+            currentbag->insert(cur);
+            nb_elts_pass ++;
+        }
+        prev = cur;
+        
+        int i = get<1>(elt);
+        if (hash_vector_idx[i] < hash_vector_size[i])
+            pq.emplace(make_tuple(uf_hashes_vectors[i][hash_vector_idx[i]++], i));
+    }
+
+    for (int i = 0; i < nb_threads; i++)
+    free_memory_vector(uf_hashes_vectors[i]);
+
+    
+    currentbag->flush();
+    
+    free_memory_vector(uf_hashes_vectors);
+
+    logging("pass " + to_string(pass+1) + "/" + to_string(nb_passes) + ", " + std::to_string(nb_elts_pass) + " unique hashes written to disk, size " + to_string(nb_elts_pass* sizeof(partition_t) / 1024/1024) + " MB");
+
+    nb_elts += nb_elts_pass;
+}
+
+
+/* main */
+template<size_t SPAN>
+void bglue(Storage *storage, 
+        std::string prefix,
+        int kmerSize, 
+        int nb_threads, 
+        bool verbose
+        )
+{
+    auto start_t=chrono::system_clock::now();
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(1);
+
+    std::cout << "bglue_algo params, prefix:" << prefix << " k:" << kmerSize << " threads:" << nb_threads << std::endl;
+    bcalm_logging = verbose;
+    size_t k = kmerSize;
+    bool debug_uf_stats = false; // formerly cmdline parameter
+    bool only_uf = false; // idem
+
+    //int nbGluePartitions=200; // no longer fixed 
+    // autodetecting number of partitions
+    int max_open_files = System::file().getMaxFilesNumber() / 2;
+    int nbGluePartitions = std::min(2000, max_open_files); // ceil it at 2000 anyhow
+
+    logging("Starting bglue with " + std::to_string( nb_threads) + " threads");
+
+    // create a hasher for UF
+    typedef typename Kmer<SPAN>::ModelCanonical ModelCanon;
+    ModelCanon modelCanon(kmerSize); // i'm a bit lost with those models.. I think GATB could be made more simple here.
+    Hasher_T<ModelCanon> hasher(modelCanon);
+
+    ifstream f((prefix + ".glue").c_str());
+    if (f.peek() == std::ifstream::traits_type::eof())
+    {
+        std::cout << "Empty glue file (no sequences)." << std::endl;
+        return;
+    }
+
+    IBank *in = Bank::open (prefix + ".glue");
+    LOCAL(in);
+    
+    uint64_t nb_glue_sequences = 0;
+    
+    if (storage != nullptr)
+    {
+        Group& bcalmGroup = storage->getGroup("bcalm"); 
+        nb_glue_sequences = atol(bcalmGroup.getProperty ("nb_sequences_in_glue").c_str());
+    }
+
+    if (nb_glue_sequences == 0)
+    {
+        uint64_t estimated_nb_glue_sequences = in->estimateNbItems();
+        logging("estimating number of sequences to be glued (couldn't find true number)");
+        nb_glue_sequences = estimated_nb_glue_sequences;
+    }
+    logging("number of sequences to be glued: "  + to_string(nb_glue_sequences) );
+
+    /*
+     * puts all the uf hashes in disk.
+     */
+    int nb_prepare_passes = 3;
+    uint64_t nb_elts = 0;
+    for (int pass = 0; pass < nb_prepare_passes; pass++)
+        prepare_uf<SPAN>(prefix, in, nb_threads, kmerSize, pass, nb_prepare_passes, nb_elts, nb_glue_sequences);
+
+    // load uf hashes from disk
+    std::vector<partition_t> uf_hashes;
+    uf_hashes.reserve(nb_elts);
+    for (int pass = 0; pass < nb_prepare_passes; pass++)
+    {
+        IteratorFile<uint64_t> file(prefix+".glue.hashes." + to_string(pass));
+        for (file.first(); !file.isDone(); file.next())
+            uf_hashes.push_back(file.item());
+    }
+    if (uf_hashes.size() == 0) // prevent an edge case when there's nothing to glue, boophf doesn't like it
+        uf_hashes.push_back(0);
+    for (int pass = 0; pass < nb_prepare_passes; pass++)
+        System::file().remove (prefix+".glue.hashes." + to_string(pass));
+
+    unsigned long nb_uf_keys = uf_hashes.size();
+    logging("loaded all unique UF elements (" + std::to_string(nb_uf_keys) + ") into a single file vector of size " + to_string(nb_uf_keys* sizeof(partition_t) / 1024/1024) + " MB");
+
+    int gamma = 3; // make it even faster.
+
+    boomphf::mphf<partition_t , /*TODO we don't need hasher_t here now that we're not hashing kmers, but I forgot to change*/ hasher_t< partition_t> > uf_mphf(nb_uf_keys, uf_hashes, nb_threads, gamma, verbose);
+
+    free_memory_vector(uf_hashes);
+
+    if (verbose)
+    {
+        unsigned long uf_mphf_memory = uf_mphf.totalBitSize();
+        logging("UF MPHF constructed (" + std::to_string(uf_mphf_memory/8/1024/1024) + " MB)" );
+    }
+
+
+    // create a UF data structure
+    unionFind<uint32_t> ufkmers(nb_uf_keys);
+
+#if 0
+    unionFind<unsigned int> ufmin;
+    unionFind<std::string> ufprefixes;
+    unsigned int prefix_length = 10;
+    unionFind<std::string> ufkmerstr;
+#endif
+// those were toy one, here is the real one:
+    
+    // instead of UF of kmers, we do a union find of hashes of kmers. less memory. will have collisions, but that's okay i think. let's see.
+    // actually, in the current implementation, partition_t is not used, but values are indeed hardcoded in 32 bits (the UF implementation uses a 64 bits hash table for internal stuff)
+
+    // We loop over sequences.
+    /*for (it.first(); !it.isDone(); it.next())
+    {
+        string seq = it->toString();*/
+    auto createUF = [k, &modelCanon, \
+        &uf_mphf, &ufkmers, &hasher](const Sequence& sequence)
+    {
+        const string seq = sequence.toString();
+        const string comment = sequence.getComment();
+
+        if (seq.size() < k)
+        {
+            std::cout << "unexpectedly small sequence found ("<<seq.size()<<"). did you set k correctly?" <<std::endl; exit(1);
+        }
+
+        bool lmark = comment[0] == '1';
+        bool rmark = comment[1] == '1';
+
+        if ((!lmark) || (!rmark)) // if either mark is 0, no need to associate kmers in UF
+            return;
+
+        const string kmerBegin = seq.substr(0, k );
+        const string kmerEnd = seq.substr(seq.size() - k , k );
+
+        // UF of canonical kmers in ModelCanon form, then hashed
+        const typename ModelCanon::Kmer kmmerBegin = modelCanon.codeSeed(kmerBegin.c_str(), Data::ASCII);
+        const typename ModelCanon::Kmer kmmerEnd = modelCanon.codeSeed(kmerEnd.c_str(), Data::ASCII);
+
+        ufkmers.union_(uf_mphf.lookup(hasher(kmmerBegin)), uf_mphf.lookup(hasher(kmmerEnd)));
+        //ufkmers.union_((hasher(kmmerBegin)), (hasher(kmmerEnd)));
+
+#if 0
+
+        Model::Kmer kmmerBegin = model.codeSeed(kmerBegin.c_str(), Data::ASCII);
+        Model::Kmer kmmerEnd = model.codeSeed(kmerEnd.c_str(), Data::ASCII);
+
+        // UF of canonical kmers in string form, not hashed
+        string canonicalKmerBegin = modelK1.toString(kmmerBegin.value());
+        string canonicalKmerEnd = modelK1.toString(kmmerEnd.value());
+        ufkmerstr.union_(canonicalKmerBegin, canonicalKmerEnd);
+
+        // UF of minimizers of kmers
+        size_t leftMin(modelK1.getMinimizerValue(kmmerBegin.value()));
+        size_t rightMin(modelK1.getMinimizerValue(kmmerEnd.value()));
+        ufmin.union_(leftMin, rightMin);
+
+        // UF of prefix of kmers in string form
+        string prefixCanonicalKmerBegin = canonicalKmerBegin.substr(0, prefix_length);
+        string prefixCanonicalKmerEnd = canonicalKmerEnd.substr(0, prefix_length);
+        ufprefixes.union_(prefixCanonicalKmerBegin, prefixCanonicalKmerEnd);
+#endif
+
+
+    };
+
+    //setDispatcher (new SerialDispatcher()); // force single thread
+    Dispatcher dispatcher (nb_threads);
+    dispatcher.iterate (in->iterator(), createUF);
+
+#if 0
+    ufmin.printStats("uf minimizers");
+
+    ufprefixes.printStats("uf " + to_string(prefix_length) + "-prefixes of kmers");
+
+    ufkmerstr.printStats("uf kmers, std::string");
+#endif
+
+
+    logging("UF constructed");
+
+    if (debug_uf_stats) // for debugging
+    {
+        ufkmers.printStats("uf kmers");
+        logging("after computing UF stats");
+    }
+
+    if (only_uf) // for debugging
+        return;
+
+    /* now we're mirroring the UF to a vector of uint32_t's, it will take less space, and strictly same information
+     * this is to get rid of the rank (one uint32) per element in the current UF implementation 
+     * we're using the disk to save space of populating one vector from the other in memory. */
+    
+    BagFile<uint64_t> *ufkmers_bagf = new BagFile<uint64_t>(prefix+".glue.uf");  LOCAL(ufkmers_bagf);
+	BagCache<uint64_t> *ufkmers_bag = new BagCache<uint64_t>(  ufkmers_bagf, 10000 );   LOCAL(ufkmers_bag);
+
+    for (unsigned long i = 0; i < nb_uf_keys; i++)
+        //ufkmers_vector[i] = ufkmers.find(i); // just in-memory without the disk
+        ufkmers_bag->insert(ufkmers.find(i));
+
+    uint64_t size_mdata = sizeof(std::atomic<uint64_t>) * ufkmers.mData.size();
+    free_memory_vector(ufkmers.mData);
+
+    logging("freed original UF (" + to_string(size_mdata/1024/1024) + " MB)");
+
+    ufkmers_bag->flush();
+
+    std::vector<uint32_t > ufkmers_vector(nb_uf_keys);
+    IteratorFile<uint64_t> ufkmers_file(prefix+".glue.uf");
+    unsigned long i = 0;
+    for (ufkmers_file.first(); !ufkmers_file.isDone(); ufkmers_file.next())
+            ufkmers_vector[i++] = ufkmers_file.item();
+
+    System::file().remove (prefix+".glue.uf");
+    
+    logging("loaded 32-bit UF (" + to_string(nb_uf_keys*sizeof(uint32_t)/1024/1024) + " MB)");
+  
+    // setup output file
+    string output_prefix = prefix;
+    std::atomic<unsigned long> out_id; // identified for output sequences
+    out_id = 0;
+    BufferedFasta out (output_prefix, 100000);
+
+    auto get_UFclass = [&modelCanon, &ufkmers_vector, &hasher, &uf_mphf]
+        (const string &kmerBegin, const string &kmerEnd,
+         bool lmark, bool rmark,
+         typename ModelCanon::Kmer &kmmerBegin, typename ModelCanon::Kmer &kmmerEnd,  // those will be populated based on lmark and rmark
+         bool &found_class)
+        {
+            found_class = false;
+            uint32_t ufclass = 0;
+
+            if (lmark)
+            {
+                kmmerBegin = modelCanon.codeSeed(kmerBegin.c_str(), Data::ASCII);
+                found_class = true;
+                ufclass = ufkmers_vector[uf_mphf.lookup(hasher(kmmerBegin))];
+            }
+
+            if (rmark)
+            {
+                kmmerEnd = modelCanon.codeSeed(kmerEnd.c_str(), Data::ASCII);
+
+                if (found_class) // just do a small check
+                {
+                    if (ufkmers_vector[uf_mphf.lookup(hasher(kmmerEnd))] != ufclass)
+                    { std::cout << "bad UF! left kmer has partition " << ufclass << " but right kmer has partition " << ufkmers_vector[uf_mphf.lookup(hasher(kmmerEnd))] << std::endl; exit(1); }
+                }
+                else
+                {
+                    ufclass = ufkmers_vector[uf_mphf.lookup(hasher(kmmerEnd))];
+                    found_class = true;
+                }
+            }
+
+            return ufclass;
+        };
+
+    std::mutex outLock; // for the main output file
+    std::vector<BufferedFasta*> gluePartitions(nbGluePartitions);
+    std::string gluePartition_prefix = output_prefix + ".gluePartition.";
+    unsigned int max_buffer = 50000;
+    std::vector<std::atomic<unsigned long>> nb_seqs_in_partition(nbGluePartitions);
+
+
+    for (int i = 0; i < nbGluePartitions; i++)
+    {
+        string filename = gluePartition_prefix + std::to_string(i);
+        if (System::file().doesExist(filename))
+           System::file().remove (filename);
+        gluePartitions[i] = new BufferedFasta(filename, max_buffer);
+        nb_seqs_in_partition[i] = 0;
+    }
+
+    logging( "Allowed " + to_string((max_buffer * nbGluePartitions) /1024 /1024) + " MB memory for buffers");
+
+    // partition the glue into many files, à la dsk
+    auto partitionGlue = [k, &modelCanon /* crashes if copied!*/, \
+        &get_UFclass, &gluePartitions,
+        &out, &outLock, &nb_seqs_in_partition, &out_id, nbGluePartitions]
+            (const Sequence& sequence)
+    {
+        const string &seq = sequence.toString();
+        const string &comment = sequence.getComment();
+
+        bool lmark = comment[0] == '1';
+        bool rmark = comment[1] == '1';
+
+        const string kmerBegin = seq.substr(0, k );
+        const string kmerEnd = seq.substr(seq.size() - k , k );
+
+        // make canonical kmer
+        typename ModelCanon::Kmer kmmerBegin;
+        typename ModelCanon::Kmer kmmerEnd;
+
+        bool found_class = false;
+
+        uint32_t ufclass = get_UFclass(kmerBegin, kmerEnd, lmark, rmark, kmmerBegin, kmmerEnd, found_class);
+
+        if (!found_class) // this one doesn't need to be glued
+        {
+            const string abundances = comment.substr(3);
+            float mean_abundance = get_mean_abundance(abundances);
+            uint32_t sum_abundances = get_sum_abundance(abundances);
+            output(seq, out, std::to_string(out_id++) + " LN:i:" + to_string(seq.size()) + " KC:i:" + to_string(sum_abundances) + " km:f:" + to_string_with_precision(mean_abundance)); 
+            // km is not a standard GFA field so i'm putting it in lower case as per the spec
+            // maybe could optimize by writing to disk using queues, if that's ever a bottleneck
+            return;
+        }
+
+        int index = ufclass % nbGluePartitions;
+        //stringstream ss1; // to save partition later in the comment. [why? probably to avoid recomputing it]
+        //ss1 << blabla;
+
+        output(seq, *gluePartitions[index], comment);
+        nb_seqs_in_partition[index]++;
+    };
+
+    logging("Disk partitioning of glue");
+    dispatcher.iterate (in->iterator(), partitionGlue); // multi-threaded
+    /*// single-threaded version
+     auto it = in->iterator();    
+     for (it->first (); !it->isDone(); it->next())
+        partitionGlue(it->item());
+    */
+
+    for (int i = 0; i < nbGluePartitions; i++)
+        delete gluePartitions[i]; // takes care of the final flush (this doesn't delete the file, just closes it)
+    free_memory_vector(gluePartitions);
+    out.flush();
+
+
+    logging("Done disk partitioning of glue");
+
+    // get top10 largest glue partitions
+    int top_n_glue_partition = std::min(10,nbGluePartitions);
+    vector<unsigned long> vx, copy_nb_seqs_in_partition;
+    vx.resize(nb_seqs_in_partition.size());
+    copy_nb_seqs_in_partition.resize(nb_seqs_in_partition.size());
+    for(unsigned int i= 0; i<nb_seqs_in_partition.size(); ++i ) 
+    {
+        vx[i]= i;
+        copy_nb_seqs_in_partition[i] = nb_seqs_in_partition[i]; // to get rid of atomic type
+    }
+    partial_sort( vx.begin(), vx.begin()+top_n_glue_partition, vx.end(), Comp<unsigned long>(copy_nb_seqs_in_partition) );
+
+    if (verbose)
+    {
+        std::cout << "Top 10 glue partitions by size:" << std::endl;
+        for (int i = 0; i < top_n_glue_partition; i++)
+            std::cout << "Glue partition " << vx[i] << " has " << copy_nb_seqs_in_partition[vx[i]] << " sequences " << endl;
+    }
+
+    logging("Glueing partitions");
+
+    // glue all partitions using a thread pool
+    ThreadPool pool(nb_threads);
+    for (int partition = 0; partition < nbGluePartitions; partition++)
+    {
+        auto glue_partition = [&modelCanon, &ufkmers, partition, &gluePartition_prefix, nbGluePartitions, &copy_nb_seqs_in_partition,
+        &get_UFclass, &out, &outLock, &out_id, kmerSize]( int thread_id)
+        {
+            int k = kmerSize;
+
+            string partitionFile = gluePartition_prefix + std::to_string(partition);
+            BankFasta partitionBank (partitionFile); // BankFasta
+            BankFasta::Iterator it (partitionBank); // BankFasta
+
+            outLock.lock(); // should use a printlock..
+            if (partition % 20 == 0) // sparse printing
+            {
+                string message = "Gluing partition " +to_string(partition) + " (size: " +to_string(System::file().getSize(partitionFile)/1024/1024) + " MB)";
+                logging(message);
+            }
+            outLock.unlock();
+
+            unordered_map<int, vector< markedSeq<SPAN> >> msInPart;
+            uint64_t seq_index = 0;
+
+            for (it.first(); !it.isDone(); it.next()) // BankFasta
+            {
+                const string seq = it->toString();
+                const string comment = it->getComment();
+
+                const string kmerBegin = seq.substr(0, k );
+                const string kmerEnd = seq.substr(seq.size() - k , k );
+
+                uint32_t ufclass = 0;
+                bool found_class = false;
+
+                bool lmark = comment[0] == '1';
+                bool rmark = comment[1] == '1';
+
+                // todo speed improvement: get partition id from sequence header (so, save it previously)
+
+                // make canonical kmer
+                typename ModelCanon::Kmer kmmerBegin, kmmerEnd;
+
+                ufclass = get_UFclass(kmerBegin, kmerEnd, lmark, rmark, kmmerBegin, kmmerEnd, found_class);
+
+                // compute kmer extremities if we have not already
+                if (!lmark)
+                    kmmerBegin = modelCanon.codeSeed(kmerBegin.c_str(), Data::ASCII);
+                if (!rmark)
+                    kmmerEnd = modelCanon.codeSeed(kmerEnd.c_str(), Data::ASCII);
+
+                markedSeq<SPAN> ms(seq_index, lmark, rmark, kmmerBegin.value(), kmmerEnd.value());
+
+                //if (ufclass == 38145) std::cout << " ufclass " << ufclass << " seq " << seq << " seq index " << seq_index << " " << lmark << rmark << " ks " << kmmerBegin.value() << " ke " << kmmerEnd.value() << std::endl; // debug specific partition
+                msInPart[ufclass].push_back(ms);
+                seq_index++;
+            }
+
+            // now iterates all sequences in a partition to determine the order in which they're going to be glues (avoid intermediate gluing)
+            vector<vector<uint32_t>> ordered_sequences_idxs ;
+            for (auto it = msInPart.begin(); it != msInPart.end(); it++)
+            {
+                bool debug = false; //debug = it->first == 38145; // debug specific partition
+                //std::cout << "1.processing partition " << it->first << std::endl;
+                determine_order_sequences<SPAN>(ordered_sequences_idxs, it->second, kmerSize, debug); // return indices of markedSeq's inside it->second
+                //std::cout << "2.processing partition " << it->first << " nb ordered sequences: " << ordered_sequences_idxs.size() << std::endl;
+                free_memory_vector(it->second);
+            }
+
+            msInPart.clear();
+            unordered_map<int,vector<markedSeq<SPAN>>>().swap(msInPart); // free msInPart
+            
+            vector<string> sequences;
+            vector<string> abundances;
+            sequences.reserve(copy_nb_seqs_in_partition[partition]);
+            abundances.reserve(copy_nb_seqs_in_partition[partition]);
+            
+            for (it.first(); !it.isDone(); it.next()) // BankFasta
+            {
+                const string seq = it->toString();
+                const string comment = it->getComment();
+                const string abundance_str = comment.substr(3);
+                sequences.push_back(seq);
+                abundances.push_back(abundance_str);
+            }
+
+            for (auto itO = ordered_sequences_idxs.begin(); itO != ordered_sequences_idxs.end(); itO++)
+            {
+                string seq, abs;
+                glue_sequences(*itO, sequences, abundances, kmerSize, seq, abs); // takes as input the indices of ordered sequences, and the markedSeq's themselves
+
+                float mean_abundance = get_mean_abundance(abs);
+                uint32_t sum_abundances = get_sum_abundance(abs);
+                output(seq, out, std::to_string(out_id++) + " LN:i:" + to_string(seq.size()) + " KC:i:" + to_string(sum_abundances) + " km:f:" + to_string_with_precision(mean_abundance)); 
+            }
+                
+            free_memory_vector(ordered_sequences_idxs);
+
+            partitionBank.finalize(); // BankFasta
+
+            System::file().remove (partitionFile);
+
+        };
+
+        pool.enqueue(glue_partition);
+        //glue_partition(0); // single threaded
+    }
+
+    pool.join();
+   
+   out.flush(); // not sure if necessary
+
+    logging("end");
+
+    bool debug_keep_glue_files = true; // for debugging // TODO enable it if -redo-bglue param was provided (need some info from UnitigsConstructionAlgorithm). 
+    if (debug_keep_glue_files)
+    {
+        std::cout << "debug: not deleting glue files" << std::endl;
+    }
+    else
+    {
+        // cleanup glue files
+        std::string line;
+        std::ifstream infile(prefix + ".glue");
+        while (std::getline(infile, line))
+        {
+            System::file().remove (line); 
+        }
+        infile.close();
+        System::file().remove (prefix + ".glue");
+    }
+    auto end_t=chrono::system_clock::now();
+    float wtime = chrono::duration_cast<chrono::nanoseconds>(end_t - start_t).count() / unit;
+
+    if (storage != nullptr)
+    {
+        Group& bcalmGroup = storage->getGroup("bcalm"); 
+        bcalmGroup.setProperty ("wtime_glue",     Stringify::format("%f", wtime));
+    }
+}
+
+}}}}
diff --git a/gatb-core/src/gatb/bcalm2/bglue_algo.hpp b/gatb-core/src/gatb/bcalm2/bglue_algo.hpp
new file mode 100644
index 0000000..849c7d2
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/bglue_algo.hpp
@@ -0,0 +1,147 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014-2016  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+
+#ifndef _GATB_CORE_BGLUE_ALGO_HPP_
+#define _GATB_CORE_BGLUE_ALGO_HPP_
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <atomic>
+#include <set>
+#include <vector>
+#include <string>
+#include <mutex>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+
+// buffered and also thread-safe thank to a lock
+// not using BankFasta because I dont want to be recording variable-length strings in a std::vector<>, potential memory fragmentation
+// so instead it's in a flat buffer
+class BufferedFasta
+{
+        std::mutex mtx;
+        std::string buffer;
+        unsigned long buffer_length;
+        FILE* _insertHandle;
+
+    public:
+        unsigned long max_buffer;
+        bool threadsafe;
+
+        BufferedFasta(const std::string filename, unsigned long given_max_buffer = 50000)
+        {
+            max_buffer = given_max_buffer; // that much of buffering will be written to the file at once (in bytes)
+            threadsafe = true;
+            buffer_length = 0;
+            _insertHandle = fopen (filename.c_str(), "w");
+            if (!_insertHandle) { std::cout << "error opening " << filename << " for writing." << std::endl; exit(1);}
+            buffer.reserve(max_buffer+1000/*security*/);
+        }
+
+        ~BufferedFasta()
+        {
+            flush();
+            fclose(_insertHandle);
+            std::string().swap(buffer);
+        }
+
+        void insert(const std::string &seq, const std::string &comment)
+        {
+            if (threadsafe)
+                mtx.lock();
+            unsigned int insert_size = seq.size() + comment.size() + 3;
+            if (buffer_length + insert_size > max_buffer)
+                flush();
+            buffer_length += insert_size;
+            buffer += ">" + comment + "\n" + seq + "\n";
+            if (threadsafe)
+                mtx.unlock();
+        }
+
+        void flush()
+        {
+            unsigned int res = fprintf (_insertHandle, "%s", buffer.c_str());
+            if (res != buffer.size())            {  std::cout << "couldn't flush, written " << res << " out of " << buffer.size() << std::endl; exit(1);}
+            if (_insertHandle    != 0)  { fflush  (_insertHandle);              }
+            buffer_length = 0;
+            buffer.clear();
+        }
+};
+
+// not using BankFasta because I suspect that it does some funky memory fragmentation. so this one is unbuffered
+class UnbufferedFastaIterator 
+{
+        std::ifstream *input;
+    public:
+        UnbufferedFastaIterator(const std::string &filename)
+        {
+            input = new std::ifstream(filename);
+        }
+
+        ~UnbufferedFastaIterator() { delete input;}
+
+        bool read(std::string &seq, std::string &comment)
+        {
+            std::string line;
+            if (std::getline(*input, line))
+            {
+                if (line.empty())
+                    return false;
+                if (line[0] == '>')
+                    comment = line.substr(1);
+            }
+            else 
+                return false;
+            if (std::getline(*input, line))
+            {
+                if (line.empty())
+                {
+                    std::cout << "unexpected entry of one-line fasta: " <<  comment << std::endl;
+                    exit(1);
+                }
+                seq = line;
+                return true;
+            }
+            return false;
+        }
+
+        void restart()
+        {
+            input->clear();
+            input->seekg(0);
+        }
+
+};
+
+    template<size_t SPAN>
+void bglue(gatb::core::tools::storage::impl::Storage* storage, 
+        std::string prefix,
+        int kmerSize, 
+        int nb_threads, 
+        bool verbose
+        );
+
+}}}}
+
+#endif
+
diff --git a/gatb-core/src/gatb/bcalm2/binSeq.cpp.unused4now b/gatb-core/src/gatb/bcalm2/binSeq.cpp.unused4now
new file mode 100644
index 0000000..82cd40d
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/binSeq.cpp.unused4now
@@ -0,0 +1,630 @@
+#include "binSeq.h"
+#include <string>
+#include <iostream>
+#include <algorithm>
+#include <cmath>
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+
+
+uint min(uint a, uint b){return (a<b ? a : b);}
+
+
+string RCnadine(const string& str){
+	string res(str);
+	uint n = str.size();
+	for(int i(n-1), j(0); i > -1; i--, j++){
+		unsigned char c = str[i];
+		// unsigned char d = (c >> 4)&7;
+		c ^= 4;
+		if ((c&3) != 3)
+			c ^= 17;
+		res[j] = c;
+		}
+	return res;
+}
+
+
+
+static const string int2string1[]={"A","C","G","T"};
+
+
+static const string int2string2[]={
+	"AA","AC","AG","AT",
+	"CA","CC","CG","CT",
+	"GA","GC","GG","GT",
+	"TA","TC","TG","TT"
+	};
+
+
+static const string int2string3[]={
+	"AAA","AAC","AAG","AAT","ACA","ACC","ACG","ACT","AGA","AGC","AGG","AGT","ATA","ATC","ATG","ATT",
+	"CAA","CAC","CAG","CAT","CCA","CCC","CCG","CCT","CGA","CGC","CGG","CGT","CTA","CTC","CTG","CTT",
+	"GAA","GAC","GAG","GAT","GCA","GCC","GCG","GCT","GGA","GGC","GGG","GGT","GTA","GTC","GTG","GTT",
+	"TAA","TAC","TAG","TAT","TCA","TCC","TCG","TCT","TGA","TGC","TGG","TGT","TTA","TTC","TTG","TTT"
+};
+
+
+static const string int2string[][64]={
+	{},
+	{"A","C","G","T"},
+	{
+		"AA","AC","AG","AT",
+		"CA","CC","CG","CT",
+		"GA","GC","GG","GT",
+		"TA","TC","TG","TT"
+	},
+	{
+		"AAA","AAC","AAG","AAT","ACA","ACC","ACG","ACT","AGA","AGC","AGG","AGT","ATA","ATC","ATG","ATT",
+		"CAA","CAC","CAG","CAT","CCA","CCC","CCG","CCT","CGA","CGC","CGG","CGT","CTA","CTC","CTG","CTT",
+		"GAA","GAC","GAG","GAT","GCA","GCC","GCG","GCT","GGA","GGC","GGG","GGT","GTA","GTC","GTG","GTT",
+		"TAA","TAC","TAG","TAT","TCA","TCC","TCG","TCT","TGA","TGC","TGG","TGT","TTA","TTC","TTG","TTT"
+	}
+};
+
+
+static const uint8_t rc[]={
+
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+
+	0b01000011,0b01000010,0b01000001,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+
+	0b10001111,0b10001011,0b10000111,0b10000011,0b10001110,0b10001010,0b10000110,0b10000010,
+	0b10001101,0b10001001,0b10000101,0b10000001,0b10001100,0b10001000,0b10000100,0b10000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+	0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
+
+	0b11111111,0b11101111,0b11011111,0b11001111,0b11111011,0b11101011,0b11011011,0b11001011,
+	0b11110111,0b11100111,0b11010111,0b11000111,0b11110011,0b11100011,0b11010011,0b11000011,
+	0b11111110,0b11101110,0b11011110,0b11001110,0b11111010,0b11101010,0b11011010,0b11001010,
+	0b11110110,0b11100110,0b11010110,0b11000110,0b11110010,0b11100010,0b11010010,0b11000010,
+	0b11111101,0b11101101,0b11011101,0b11001101,0b11111001,0b11101001,0b11011001,0b11001001,
+	0b11110101,0b11100101,0b11010101,0b11000101,0b11110001,0b11100001,0b11010001,0b11000001,
+	0b11111100,0b11101100,0b11011100,0b11001100,0b11111000,0b11101000,0b11011000,0b11001000,
+	0b11110100,0b11100100,0b11010100,0b11000100,0b11110000,0b11100000,0b11010000,0b11000000,
+};
+
+
+static uint8_t char2int1[100];
+
+
+static uint8_t char2int[255];
+
+
+static uint8_t char2int2[255];
+
+
+uint functionwihtoutcoll(uint8_t x,uint8_t y,uint8_t z){
+	return( (x&0b00000110)|((y&0b00000110)<<2)|((z&0b00000110)<<4) );
+}
+
+
+uint functionwihtoutcoll(uint8_t x,uint8_t y){
+	return(x|(y<<4));
+}
+
+
+void initBinSeq(uint k){
+	kmerBinseq=k-1;
+
+	char2int1[65]=0b01000000;
+	char2int1[67]=0b01000001;
+	char2int1[71]=0b01000010;
+	char2int1[84]=0b01000011;
+
+	char2int2[functionwihtoutcoll(65,65)]=0b10000000;
+	char2int2[functionwihtoutcoll(65,67)]=0b10000001;
+	char2int2[functionwihtoutcoll(65,71)]=0b10000010;
+	char2int2[functionwihtoutcoll(65,84)]=0b10000011;
+	char2int2[functionwihtoutcoll(67,65)]=0b10000100;
+	char2int2[functionwihtoutcoll(67,67)]=0b10000101;
+	char2int2[functionwihtoutcoll(67,71)]=0b10000110;
+	char2int2[functionwihtoutcoll(67,84)]=0b10000111;
+	char2int2[functionwihtoutcoll(71,65)]=0b10001000;
+	char2int2[functionwihtoutcoll(71,67)]=0b10001001;
+	char2int2[functionwihtoutcoll(71,71)]=0b10001010;
+	char2int2[functionwihtoutcoll(71,84)]=0b10001011;
+	char2int2[functionwihtoutcoll(84,65)]=0b10001100;
+	char2int2[functionwihtoutcoll(84,67)]=0b10001101;
+	char2int2[functionwihtoutcoll(84,71)]=0b10001110;
+	char2int2[functionwihtoutcoll(84,84)]=0b10001111;
+
+	char2int[functionwihtoutcoll(65,65,65)]=0b11000000;
+	char2int[functionwihtoutcoll(65,65,67)]=0b11000001;
+	char2int[functionwihtoutcoll(65,65,71)]=0b11000010;
+	char2int[functionwihtoutcoll(65,65,84)]=0b11000011;
+	char2int[functionwihtoutcoll(65,67,65)]=0b11000100;
+	char2int[functionwihtoutcoll(65,67,67)]=0b11000101;
+	char2int[functionwihtoutcoll(65,67,71)]=0b11000110;
+	char2int[functionwihtoutcoll(65,67,84)]=0b11000111;
+	char2int[functionwihtoutcoll(65,71,65)]=0b11001000;
+	char2int[functionwihtoutcoll(65,71,67)]=0b11001001;
+	char2int[functionwihtoutcoll(65,71,71)]=0b11001010;
+	char2int[functionwihtoutcoll(65,71,84)]=0b11001011;
+	char2int[functionwihtoutcoll(65,84,65)]=0b11001100;
+	char2int[functionwihtoutcoll(65,84,67)]=0b11001101;
+	char2int[functionwihtoutcoll(65,84,71)]=0b11001110;
+	char2int[functionwihtoutcoll(65,84,84)]=0b11001111;
+	char2int[functionwihtoutcoll(67,65,65)]=0b11010000;
+	char2int[functionwihtoutcoll(67,65,67)]=0b11010001;
+	char2int[functionwihtoutcoll(67,65,71)]=0b11010010;
+	char2int[functionwihtoutcoll(67,65,84)]=0b11010011;
+	char2int[functionwihtoutcoll(67,67,65)]=0b11010100;
+	char2int[functionwihtoutcoll(67,67,67)]=0b11010101;
+	char2int[functionwihtoutcoll(67,67,71)]=0b11010110;
+	char2int[functionwihtoutcoll(67,67,84)]=0b11010111;
+	char2int[functionwihtoutcoll(67,71,65)]=0b11011000;
+	char2int[functionwihtoutcoll(67,71,67)]=0b11011001;
+	char2int[functionwihtoutcoll(67,71,71)]=0b11011010;
+	char2int[functionwihtoutcoll(67,71,84)]=0b11011011;
+	char2int[functionwihtoutcoll(67,84,65)]=0b11011100;
+	char2int[functionwihtoutcoll(67,84,67)]=0b11011101;
+	char2int[functionwihtoutcoll(67,84,71)]=0b11011110;
+	char2int[functionwihtoutcoll(67,84,84)]=0b11011111;
+	char2int[functionwihtoutcoll(71,65,65)]=0b11100000;
+	char2int[functionwihtoutcoll(71,65,67)]=0b11100001;
+	char2int[functionwihtoutcoll(71,65,71)]=0b11100010;
+	char2int[functionwihtoutcoll(71,65,84)]=0b11100011;
+	char2int[functionwihtoutcoll(71,67,65)]=0b11100100;
+	char2int[functionwihtoutcoll(71,67,67)]=0b11100101;
+	char2int[functionwihtoutcoll(71,67,71)]=0b11100110;
+	char2int[functionwihtoutcoll(71,67,84)]=0b11100111;
+	char2int[functionwihtoutcoll(71,71,65)]=0b11101000;
+	char2int[functionwihtoutcoll(71,71,67)]=0b11101001;
+	char2int[functionwihtoutcoll(71,71,71)]=0b11101010;
+	char2int[functionwihtoutcoll(71,71,84)]=0b11101011;
+	char2int[functionwihtoutcoll(71,84,65)]=0b11101100;
+	char2int[functionwihtoutcoll(71,84,67)]=0b11101101;
+	char2int[functionwihtoutcoll(71,84,71)]=0b11101110;
+	char2int[functionwihtoutcoll(71,84,84)]=0b11101111;
+	char2int[functionwihtoutcoll(84,65,65)]=0b11110000;
+	char2int[functionwihtoutcoll(84,65,67)]=0b11110001;
+	char2int[functionwihtoutcoll(84,65,71)]=0b11110010;
+	char2int[functionwihtoutcoll(84,65,84)]=0b11110011;
+	char2int[functionwihtoutcoll(84,67,65)]=0b11110100;
+	char2int[functionwihtoutcoll(84,67,67)]=0b11110101;
+	char2int[functionwihtoutcoll(84,67,71)]=0b11110110;
+	char2int[functionwihtoutcoll(84,67,84)]=0b11110111;
+	char2int[functionwihtoutcoll(84,71,65)]=0b11111000;
+	char2int[functionwihtoutcoll(84,71,67)]=0b11111001;
+	char2int[functionwihtoutcoll(84,71,71)]=0b11111010;
+	char2int[functionwihtoutcoll(84,71,84)]=0b11111011;
+	char2int[functionwihtoutcoll(84,84,65)]=0b11111100;
+	char2int[functionwihtoutcoll(84,84,67)]=0b11111101;
+	char2int[functionwihtoutcoll(84,84,71)]=0b11111110;
+	char2int[functionwihtoutcoll(84,84,84)]=0b11111111;
+}
+
+
+uint8_t char2Byte[]={
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,1,0,0,
+	0,2,0,0,0,0,0,0,0,0,
+	0,0,0,0,3
+	};
+
+
+uint8_t char2Byte1[]={
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,1<<2,0,0,
+	0,2<<2,0,0,0,0,0,0,0,0,
+	0,0,0,0,3<<2
+	};
+
+uint8_t char2Byte2[]={
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,0,0,0,
+	0,0,0,0,0,0,0,1<<4,0,0,
+	0,2<<4,0,0,0,0,0,0,0,0,
+	0,0,0,0,3<<4
+	};
+
+
+void printUC(uint8_t a){
+	for (int i = 0; i < 8; i++) {
+		printf("%d", !!((a << i) & 0x80));
+	}
+	printf(" ");
+}
+
+
+binSeq::binSeq(const string& str){
+	isInt=false;
+	uint mod(str.size()%3);
+	uint i(0);
+	vect.reserve((str.size()/3)+1);
+	for (; i<str.size()-mod; i+=3){
+		vect.push_back(char2int[functionwihtoutcoll(str[i],str[i+1],str[i+2])]);
+		//~ vect.push_back(0x11000000 | char2Byte[str[i]] | char2Byte1[str[i+1]] | char2Byte2[str[i+2]]);
+	}
+	if(mod!=0){
+		if(mod==1){
+			vect.push_back(char2int1[(uint8_t)(str[i])]);
+		}else{
+			vect.push_back(char2int2[functionwihtoutcoll(str[i-1],str[i])]);
+		}
+	}
+    //std::cout << "vect size " << vect.size() << " capacity " << vect.capacity() << std::endl; // turns out it's not exactly as efficient as it should (size != capacity)
+}
+
+
+binSeq::binSeq(const binSeq& bs){
+	isInt=false;
+	vect=bs.vect;
+}
+
+
+string binSeq::str(){
+	string res;
+	res.reserve(3*vect.size());
+	for(uint i(0);i<vect.size();++i){
+		res.append(int2string[vect[i]>>6][vect[i]&0b00111111]);
+	}
+	// for(uint i(0);i<res.size();++i){
+	// 	if(res[i]!='A' and res[i]!='C' and res[i]!='G' and res[i]!='T'){
+	// 		cout<<"lol"<<endl;
+	// 		exit(0);
+	// 	}
+	// }
+	return res;
+}
+
+
+// void binSeq::str2(string& res){
+// 	res.clear();
+// 	res.reserve(3*vect.size());
+// 	for(uint i(0);i<vect.size();++i){
+// 		res.append(int2string[vect[i]>>6][vect[i]&0b00111111]);
+// 	}
+// }
+
+
+// binSeq binSeq::sub(){
+// 	uint begin(30);
+// 	binSeq res;
+// 	res.vect.reserve(vect.size());
+// 	uint count(0);
+// 	bool go(true);
+// 	uint i(0);
+// 	for(; go; ++i){
+// 		uint c(vect[i]);
+// 		uint n(c>>6);
+// 		if(count+n<begin){
+// 			count+=n;
+// 		}else{
+// 			go=false;
+// 			if(count+n!=begin){
+// 				if(count+n-begin==1){
+// 					res.vect.push_back((1<<6)| c&0b00000011);
+// 				}else{
+// 					res.vect.push_back((2<<6)| c&0b00001111);
+// 				}
+// 			}
+// 		}
+// 	}
+// 	res.vect.insert(res.vect.end(), vect.begin()+i, vect.end());
+// 	return res;
+// }
+
+
+
+binSeq binSeq::sub(){
+	binSeq res;
+	res.vect.reserve(vect.size());
+	uint count(0);
+	bool go(true);
+	uint i(0);
+	for(; go; ++i){
+		uint c(vect[i]);
+		uint n(c>>6);
+		if(count+n<kmerBinseq){
+			count+=n;
+		}else{
+			go=false;
+			if(count+n!=kmerBinseq){
+				if(count+n-kmerBinseq==1){
+					res.vect.push_back((1<<6)| c&0b00000011);
+				}else{
+					res.vect.push_back((2<<6)| c&0b00001111);
+				}
+			}
+		}
+	}
+	res.vect.insert(res.vect.end(), vect.begin()+i, vect.end());
+	return res;
+}
+//
+// //
+// binSeq binSeq::getBegin(uint size){
+// 	binSeq res;
+// 	uint i(0);
+// 	for(uint c(0); c<size;++i){
+// 		uint ch(vect[i]);
+// 		uint mod(ch>>6);
+// 		uint n(c+mod-size);
+//
+// 		switch (n){
+// 			case 1:
+// 				ch&=0b00111100;
+// 				res.vect.push_back((2<<6)|(ch>>2));
+// 				c+=2;
+// 				break;
+// 			case 2:
+// 				ch&=0b00110000;
+// 				res.vect.push_back((1<<6)|(ch>>4));
+// 				c++;
+// 				break;
+// 			default:
+// 				res.vect.push_back(ch);
+// 				c+=mod;
+// 				break;
+// 		}
+// 	}
+// 	return res;
+// }
+
+
+kmer binSeq::getBeginInt(){
+	kmer res(0);
+	uint i(0);
+	for(uint c(0); c<kmerBinseq;++i){
+		uint ch(vect[i]);
+		uint mod(ch>>6);
+		int n(c+mod-kmerBinseq);
+		if(n<=0){
+			res<<=(2*mod);
+			res+=(ch&0b00111111);
+			c+=mod;
+		}else{
+			if(n==2){
+				ch&=0b00110000;
+				res<<=2;
+				res+=(ch>>4);
+				return res;
+			}else{
+				ch&=0b00111100;
+				res<<=(2*mod-2);
+				res+=(ch>>2);
+				return res;
+			}
+		}
+	}
+	return res;
+}
+
+//
+// kmer binSeq::getBeginRcInt(uint size){
+// 	kmer res(0),inter;
+// 	uint i(0);
+// 	for(uint c(0); c<size;++i){
+// 		uint ch(rc[vect[i]]);
+// 		uint mod(ch>>6);
+// 		int n(c+mod-size);
+// 		if(n<=0){
+// 			inter=(ch&0b00111111);
+// 				inter<<=(2*c);
+// 				res+=inter;
+// 				c+=mod;
+// 		}else{
+// 			if(n==1){
+// 				if(mod==3){
+// 					inter=(ch&0b00001111);
+// 				}else{
+// 					inter=(ch&0b0000011);
+// 				}
+// 				inter<<=(2*c);
+// 				res+=inter;
+// 				return res;
+// 			}else{
+// 				inter=((ch&0b00000011));
+// 				inter<<=(2*c);
+// 				res+=inter;
+// 				return res;
+// 			}
+// 		}
+// 	}
+// 	return res;
+// }
+//
+// //
+// binSeq binSeq::getEnd(uint size){
+// 	binSeq res;
+// 	uint i(vect.size()-1);
+// 	for(uint c(0); c<size;--i){
+// 		uint ch(vect[i]);
+// 		uint mod(ch>>6);
+// 		int n(c+mod-size);
+// 		switch (n){
+// 			case 1:
+// 				res.vect.push_back((2<<6)|(ch&0b00001111));
+// 				c+=2;
+// 				break;
+// 			case 2:
+// 				res.vect.push_back((1<<6)|(ch&0b00000011));
+// 				c++;
+// 				break;
+// 			default:
+// 				res.vect.push_back(ch);
+// 				c+=mod;
+// 				break;
+// 		}
+// 	}
+// 	::reverse(res.vect.begin(),res.vect.end());
+// 	return res;
+// }
+//
+
+kmer binSeq::getEndInt(){
+	kmer res(0),inter(0);
+	uint i(vect.size()-1);
+	for(uint c(0); c<kmerBinseq;--i){
+		uint ch(vect[i]);
+		uint mod(ch>>6);
+		int n(c+mod-kmerBinseq);
+		if(n<=0){
+			inter=(ch&0b00111111);
+			inter<<=(2*c);
+			res+=inter;
+			c+=mod;
+		}else{
+			if(n==1){
+				if(mod==2){
+					inter=(ch&0b00000011);
+				}else{
+					inter=(ch&0b00001111);
+				}
+				inter<<=(2*c);
+				res+=inter;
+				//~ c+=2;
+				return res;
+			}else{
+				inter=(ch&0b00000011);
+				inter<<=(2*c);
+				res+=inter;
+				//~ c++;
+				return res;
+			}
+		}
+	}
+	return res;
+}
+
+//
+// kmer binSeq::getEndRcInt(uint size){
+// 	kmer res(0);
+// 	uint i(vect.size()-1);
+// 	for(uint c(0); c<size;--i){
+// 		uint ch(rc[vect[i]]);
+// 		uint mod(ch>>6);
+// 		int n(c+mod-size);
+// 		if(n<=0){
+// 			res<<=(2*mod);
+// 			res+=(ch&0b00111111);
+// 			c+=mod;
+// 		}else{
+// 			if(n==1){
+// 				if(mod==3){
+// 					ch&=0b00111100;
+// 					res<<=4;
+// 					res+=(ch>>2);
+// 					return res;
+// 				}else{
+// 					ch&=0b00110000;
+// 					res<<=2;
+// 					res+=(ch>>4);
+// 					return res;
+// 				}
+// 			}else{
+// 				ch&=0b00110000;
+// 				res<<=2;
+// 				res+=(ch>>4);
+// 				return res;
+// 			}
+// 		}
+// 	}
+// 	return res;
+// }
+//
+
+void binSeq::add(const binSeq& bs){vect.insert(vect.end(), bs.vect.begin(), bs.vect.end());}
+
+
+binSeq::binSeq(){vect.reserve(kmerBinseq/3+1);isInt=false;}
+
+
+uint binSeq::size(){return vect.size();}
+
+
+binSeq::binSeq(uint n){
+	isInt=true;
+	while(n!=0){
+		vect.push_back((uint8_t)n%(1<<8));
+		n>>=8;
+	}
+}
+
+
+uint binSeq::getNumber(){
+	uint res(0);
+	for(int i(vect.size()-1); i>-1; --i){
+		res<<=8;
+		res+=vect[i];
+	}
+	return res;
+}
+
+//
+// kmer binSeq::getInt(){
+// 	kmer res(0);
+// 	for(uint i(0); i<vect.size(); ++i){
+// 		uint c(vect[i]);
+// 		//~ uint mod(c/(1<<6));
+// 		res<<=(2*(c>>6));
+// 		res+=c&0b00111111;
+// 	}
+// 	return res;
+// }
+
+
+void binSeq::clear(){
+	vect.clear();
+}
+
+
+binSeq binSeq::getReverse(){
+	binSeq res;
+	res.vect.reserve(vect.size());
+	for(int i((int)vect.size()-1); i>-1; --i){
+		res.vect.push_back(rc[vect[i]]);
+	}
+	return res;
+}
+
+
+void binSeq::reverse(){
+	//~ cout<<str()<<endl;
+	// string lol(RCnadine(str()));
+	uint s(vect.size());
+	uint i(0);
+	for(; i<s/2 ;++i){
+		uint inter (rc[vect[s-1-i]]);
+		vect[s-1-i]=rc[vect[i]];
+		vect[i]=inter;
+	}
+	if(s%2==1){
+		vect[i]=rc[vect[i]];
+	}
+}
diff --git a/gatb-core/src/gatb/bcalm2/binSeq.h b/gatb-core/src/gatb/bcalm2/binSeq.h
new file mode 100644
index 0000000..6e2cfee
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/binSeq.h
@@ -0,0 +1,71 @@
+//
+//  binSeq.h
+//  PBMOG
+//
+//  Created by malfoy on 27/01/2015.
+//  Copyright (c) 2015 malfoy. All rights reserved.
+//
+
+#ifndef __PBMOG__binSeq__
+#define __PBMOG__binSeq__
+
+#include <stdio.h>
+#include <vector>
+#include <string>
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <unordered_map>
+#include <stdint.h>
+
+typedef unsigned int  uint;
+//if k<=32
+// #define kmer uint64_t
+//if 32<k<=64
+#define kmerInt __uint128_t
+
+
+static uint kmerBinseq;
+
+
+using namespace std;
+
+
+class binSeq{
+public:
+	vector<uint8_t> vect;
+	bool isInt;
+
+	string str();
+	void str2(string& res);
+	binSeq sub();
+	binSeq sub(uint begin,uint size);
+	binSeq getBegin(uint size);
+	binSeq getEnd(uint size);
+	kmerInt getEndInt();
+	kmerInt getBeginInt();
+	kmerInt getBeginRcInt(uint size);
+	kmerInt getEndRcInt(uint size);
+	void reverse();
+	binSeq getReverse();
+	void add(const binSeq& b);
+	void resize();
+	void clear();
+	uint size();
+	uint getNumber();
+	kmerInt getInt();
+
+	explicit binSeq(const string& str);
+	binSeq();
+	binSeq(const binSeq& bs);
+	explicit binSeq(uint);
+};
+
+
+void initBinSeq(uint k);
+
+
+void testBinSeq();
+
+
+#endif /* defined(__PBMOG__binSeq__) */
diff --git a/gatb-core/src/gatb/bcalm2/logging.cpp b/gatb-core/src/gatb/bcalm2/logging.cpp
new file mode 100644
index 0000000..6846792
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/logging.cpp
@@ -0,0 +1,40 @@
+#include <gatb/system/impl/System.hpp>
+#include <ctime> // for time
+#include <iostream> // for time (and maybe other things?)
+#include <iomanip> // for cout mods
+
+
+#include "logging.hpp"
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+bool bcalm_logging = true;
+
+unsigned long logging(std::string message="")
+{
+    time_t t = time(0);   // get time now
+    struct tm * now = localtime( & t );
+    if (bcalm_logging) 
+    {
+        std::cout << std::setiosflags(std::ios::right);
+        std::cout << std::resetiosflags(std::ios::left);
+        std::cout << std::setw(40) << std::left << message << "      ";
+    }
+    char tmp[128];
+    snprintf (tmp, sizeof(tmp), "  %02d:%02d:%02d  ",
+            now->tm_hour, now->tm_min, now->tm_sec);
+    if (bcalm_logging) 
+        std::cout << tmp ;
+
+    // using Progress.cpp of gatb-core
+    u_int64_t mem = gatb::core::system::impl::System::info().getMemorySelfUsed() / 1024;
+    u_int64_t memMaxProcess = gatb::core::system::impl::System::info().getMemorySelfMaxUsed() / 1024;
+    snprintf (tmp, sizeof(tmp), "   memory [current, maxRSS]: [%4lu, %4lu] MB ",
+            mem, memMaxProcess);
+
+    if (bcalm_logging) 
+        std::cout << tmp << std::endl;
+    return mem;
+}
+
+
+}}}}
diff --git a/gatb-core/src/gatb/bcalm2/logging.hpp b/gatb-core/src/gatb/bcalm2/logging.hpp
new file mode 100644
index 0000000..3e14cad
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/logging.hpp
@@ -0,0 +1,6 @@
+#include <string>
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+extern bool bcalm_logging;
+extern unsigned long logging(std::string message);
+}}}}
diff --git a/gatb-core/src/gatb/bcalm2/ograph.cpp b/gatb-core/src/gatb/bcalm2/ograph.cpp
new file mode 100644
index 0000000..e2c6234
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ograph.cpp
@@ -0,0 +1,417 @@
+#include "ograph.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <thread>
+
+
+/*
+ * constructs the compressed dBG from a list of arbitrary sequences
+ */
+
+// The code used to be optimized for uint128, but then i switched everything to GATB's LargeInt. It's likely unoptimized now.
+
+using namespace std;
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+static string reverseinplace(string& str){
+	uint i(str.size()-1),j(0);
+	for(; j<str.size()/2; --i, ++j){
+		str[i] ^= 4;
+		str[j] ^= 4;
+		if ((str[i]&3) != 3){str[i]^= 17;}
+		if ((str[j]&3) != 3){str[j]^= 17;}
+		swap(str[i],str[j]);
+	}
+	if(str.size()%2==1){
+		str[j] ^= 4;
+		if ((str[j]&3) != 3){str[j]^= 17;}
+	}
+	return str;
+}
+
+
+static void reverseinplace2(string& str){
+	uint i(str.size()-1),j(0);
+	for(; j<str.size()/2; --i, ++j){
+		str[i] ^= 4;
+		str[j] ^= 4;
+		if ((str[i]&3) != 3){str[i]^= 17;}
+		if ((str[j]&3) != 3){str[j]^= 17;}
+		swap(str[i],str[j]);
+	}
+	if(str.size()%2==1){
+		str[j] ^= 4;
+		if ((str[j]&3) != 3){str[j]^= 17;}
+	}
+}
+
+
+static uint chartoint(char c){
+	char d = (c >> 1) & 3;
+	if (d > 1)
+		d ^= 1;
+	return d;
+}
+
+
+static inline bool isNumber(char c){return (c<64);}
+
+
+template<size_t span>
+typename graph3<span>::kmerType graph3<span>::beg2int128(const string& str){
+	typename graph3<span>::kmerType resBeg;
+    resBeg.setVal(0);
+	for(uint i(0);i<k;++i){
+		resBeg= resBeg << 2;
+		resBeg= resBeg + chartoint(str[i]);
+	}
+	return resBeg;
+}
+
+
+template<size_t span>
+typename graph3<span>::kmerType graph3<span>::beg2int128rc(const string& str){
+	typename graph3<span>::kmerType res;
+    res.setVal(0);
+	for(int i(k-1);i>=0;i--){
+		res=res<<2;
+		res=res+3-chartoint(str[i]);
+	}
+	return res;
+}
+
+
+template<size_t span>
+typename graph3<span>::kmerType graph3<span>::end2int128rc(const string& str){
+	typename graph3<span>::kmerType res;
+    res.setVal(0);
+	for(int i(k-1);i>=0;i--){
+		res = res << 2;
+		res = res + (3-chartoint(str[str.size()-k+i]));
+	}
+	return res;
+}
+
+
+template<size_t span>
+typename graph3<span>::kmerType graph3<span>::end2int128(const string& str){
+	typename graph3<span>::kmerType resEnd;
+    resEnd.setVal(0);
+	for(uint i(0);i<k;++i){
+		resEnd= resEnd << 2;
+		resEnd= resEnd + chartoint(str[str.size()-k+i]);
+	}
+	return resEnd;
+}
+
+
+template<size_t span>
+// is that revcomp? if so, should use gatb's
+typename graph3<span>::kmerType graph3<span>::rcb(typename graph3<span>::kmerType min){
+	typename graph3<span>::kmerType resrcb;
+	typename graph3<span>::kmerType three;
+    three.setVal(3);
+    resrcb.setVal(0);
+	for(uint i(0); i<k;++i){
+		resrcb= resrcb + ((three-(min%4))<<(2*(k-1-i)));
+		min= min >> 2;
+	}
+	return resrcb;
+}
+
+
+template<size_t span>
+void graph3<span>::compaction(uint iL,  uint iR){
+	if(iR!=iL){
+		bool b1(isNumber(unitigs[iL][0])),b2(isNumber(unitigs[iR][0]));
+		if(b1 and b2){return compaction(stoi(unitigs[iL]),stoi(unitigs[iR]));}
+		if(b1){return compaction(stoi(unitigs[iL]),iR);}
+		if(b2){return compaction(iL,stoi(unitigs[iR]));}
+
+		typename graph3<span>::kmerType beg1;//(beg2int128(unitigs[iL])); // that kind of initialization isn't supported in LargeInt.
+        beg1.setVal(beg2int128(unitigs[iL])); 
+		typename graph3<span>::kmerType end2;//(end2int128(unitigs[iR]));
+        end2.setVal(end2int128(unitigs[iR])); 
+
+		if(beg1==end2){
+			unitigs[iR]+=(unitigs[iL].substr(k));
+			unitigs[iL]=to_string(iR);
+            
+            compact_abundances(iR,iL);
+			return;
+		}
+
+		typename graph3<span>::kmerType endrc2;//(beg2int128rc(unitigs[iR]));
+        endrc2.setVal(beg2int128rc(unitigs[iR])); 
+		if(beg1==endrc2){
+			reverseinplace2(unitigs[iR]);
+			unitigs[iR]+=(unitigs[iL].substr(k));
+			unitigs[iL]=to_string(iR);
+            
+            compact_abundances(iR,iL,true,false);
+			return;
+		}
+
+		typename graph3<span>::kmerType beg2;//(rcb(endrc2));
+        beg2.setVal(rcb(endrc2)); 
+		typename graph3<span>::kmerType end1;//(end2int128(unitigs[iL]));
+        end1.setVal(end2int128(unitigs[iL]));
+		if(end1==beg2){
+			unitigs[iL]+=(unitigs[iR].substr(k));
+			unitigs[iR]=to_string(iL);
+
+            compact_abundances(iL,iR);
+			return;
+		}
+
+		typename graph3<span>::kmerType begrc2;//(rcb(end2));
+        begrc2.setVal(rcb(end2));
+/*            std::cout << "a : " << rcb(end2).toString(31) << std::endl;
+            std::cout << "a=b: " << begrc2.toString(31) << std::endl;*/ // manifestation of a bug when LargeInt constructors are removed
+
+		if(end1==begrc2){
+			unitigs[iL]+=(reverseinplace(unitigs[iR]).substr(k));
+			unitigs[iR]=to_string(iL);
+
+            compact_abundances(iL,iR, false, true);
+			return;
+		}
+	}
+}
+
+
+template<size_t span>
+void graph3<span>::compact_abundances(uint i1, uint i2, bool reverse_first, bool reverse_second){
+    // aliases just to be able to copypaste stackoverflow code!
+    std::vector<unsigned int>& v = unitigs_abundances[i1];
+    std::vector<unsigned int>& v_prime = unitigs_abundances[i2];
+    if (reverse_first)
+        std::reverse(v.begin(),v.end());
+    v.reserve(v.size() + distance(v_prime.begin(),v_prime.end()));
+    if (reverse_second)
+        std::reverse(v_prime.begin(),v_prime.end());
+    v.insert(v.end(),v_prime.begin(),v_prime.end());
+    v_prime.clear();
+}
+
+template<size_t span>
+void graph3<span>::debruijn(){
+	sort(left.begin(),left.end(),comparator<span>());
+	sort(right.begin(),right.end(),comparator<span>());
+	uint iL(0),iR(0),sizeLeft(left.size()),sizeRight(right.size());
+    typename graph3<span>::kmerType minusone;
+    minusone.setVal(-1);
+	left.push_back({0,minusone});
+	right.push_back({0,minusone});
+
+	kmerIndiceT<span> kL,kR;
+	while(iL!=sizeLeft and iR!=sizeRight){
+		kL=left[iL];
+		kR=right[iR];
+		if(kL.kmmer==kR.kmmer){
+			bool go(true);
+			++iL;++iR;
+				if(left[iL].kmmer==kL.kmmer){
+					go=false;
+					while(left[++iL].kmmer==kL.kmmer){}
+				}
+				if(right[iR].kmmer==kL.kmmer){
+					go=false;
+					while(right[++iR].kmmer==kR.kmmer){}
+				}
+			if(go){compaction(kL.indice,kR.indice);}
+		}else{
+			if(kL.kmmer<kR.kmmer){
+				while(left[++iL].kmmer==kL.kmmer){}
+			}else{
+				while(right[++iR].kmmer==kR.kmmer){}
+			}
+		}
+	}
+}
+
+
+template<size_t span>
+bool graph3<span>::output(uint i){return !isNumber(unitigs[i][0]);}
+
+
+template<size_t span>
+bool graph3<span>::clear(){delete [] unitigs; delete [] unitigs_abundances; 
+    /* // nah, not needed. it wasn't the cause of the memory fragmentation, because even when the graph isn't constructed it still happens
+    left.clear(); right.clear(); left.shrink_to_fit(); right.shrink_to_fit(); */
+    return true;}
+
+
+template<size_t span>
+uint graph3<span>::size(){return indiceUnitigs;};
+
+
+template<size_t span>
+void graph3<span>::addtuple(tuple<string,uint,uint,uint>& tuple){
+	unitigs[indiceUnitigs]=get<0>(tuple);
+	unitigs_abundances[indiceUnitigs].push_back(get<3>(tuple));
+	if(minimizer==(get<1>(tuple))){
+		typename graph3<span>::kmerType kmer1(beg2int128(unitigs[indiceUnitigs]));
+		typename graph3<span>::kmerType kmer2(rcb(kmer1));
+		if(kmer1<kmer2){
+			left.push_back(kmerIndiceT<span>{indiceUnitigs,kmer1});
+		}else{
+			right.push_back(kmerIndiceT<span>{indiceUnitigs,kmer2});
+		}
+	}
+	if(minimizer==get<2>(tuple)){
+		typename graph3<span>::kmerType kmer1(end2int128(unitigs[indiceUnitigs]));
+		typename graph3<span>::kmerType kmer2(rcb(kmer1));
+
+		if(kmer1<kmer2){
+			right.push_back(kmerIndiceT<span>{indiceUnitigs,kmer1});
+		}else{
+			left.push_back(kmerIndiceT<span>{indiceUnitigs,kmer2});
+		}
+	}
+	++indiceUnitigs;
+}
+
+
+// void compareUnitigs(const string& fileFa,const string& fileDot){
+// 	uint a(0),b(0),c(0),d(0);
+// 	unordered_set<string> setFa,setDot;
+// 	ifstream streamFa(fileFa),streamDot(fileDot);
+// 	string seq;
+// 	getline(streamFa,seq);
+// 	while (!streamFa.eof()) {
+// 		getline(streamFa,seq,'>');
+// 		seq=seq.substr(0,seq.size()-1);
+// 		setFa.insert(seq);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		getline(streamFa,seq);
+// 		++c;
+// 	}
+// 	cout<<1<<endl;
+// 	while (!streamDot.eof()){
+// 		getline(streamDot,seq);
+// 		transform(seq.begin(), seq.end(), seq.begin(), ::toupper);
+// 		seq=seq.substr(0,seq.size()-1);
+// 		setDot.insert(seq);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		++d;
+// 	}
+// 	cout<<2<<endl;
+// 	for(auto it(setFa.begin());it!=setFa.end();++it){
+// 		if(setDot.count(*it)==0){
+// 			++a;
+// 		}
+// 	}
+// 	cout<<3<<endl;
+// 	for(auto it(setDot.begin());it!=setDot.end();++it){
+// 		if(setFa.count(*it)==0){
+// 			++a;
+// 		}
+// 	}
+// 	cout<<a<<" "<<b<<endl;
+// 	cout<<c<<" "<<d<<endl;
+// }
+//
+//
+// void compareKmers(const string& fileFa,const string& fileDot){
+// 	uint k(31);
+// 	string kmer;
+// 	uint a(0),b(0),c(0),d(0);
+// 	unordered_set<string> setFa,setDot;
+// 	ifstream streamFa(fileFa),streamDot(fileDot);
+// 	string seq,inter,nimp;
+//
+//
+//
+// 	// cout<<1<<endl;
+// 	while (!streamFa.eof()) {
+// 		getline(streamFa,nimp);
+// 		// cout<<"nimp"<<nimp<<endl;
+// 		getline(streamFa,seq);
+// 		// cout<<"seq"<<seq<<endl;
+// 		point:
+// 		char c=streamFa.peek();
+// 		if(c=='>'){
+// 			point2:
+// 			// seq=seq.substr(0,seq.size());
+// 			// for(uint j(0);(j)<seq.size();++j){
+// 			// 	if(seq[j]!='A' and seq[j]!='C' and seq[j]!='T' and seq[j]!='G'){
+// 			// 		cout<<seq<<endl;
+// 			// 		cout<<"lol"<<endl;
+// 			// 		exit(0);
+// 			// 	}
+// 			// }
+// 			for (uint i = 0; i+k <=seq.size(); ++i) {
+// 				kmer=seq.substr(i,k);
+// 				// cout<<kmer<<endl;
+// 				kmer=getRepresent(kmer);
+// 				// if(setDot.count(kmer)==0){
+// 				// 	++a;
+// 				// }
+// 				setFa.insert(kmer);
+// 			}
+// 		}else{
+// 			if(!streamFa.eof()){
+// 				// cout<<"inter"<<endl;
+// 				// cout<<seq<<endl;
+// 				getline(streamFa,inter);
+// 				// cout<<inter<<endl;
+// 				seq+=inter;
+// 				goto point;
+// 			}else{
+// 				// cout<<"lol2"<<endl;
+// 				goto point2;
+// 			}
+// 		}
+// 	}
+// 	cout<<2<<endl;
+//
+// 	while (!streamDot.eof()){
+// 		getline(streamDot,seq);
+// 		seq=seq.substr(0,k);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		if(setFa.count(getRepresent(seq))==0){
+// 			cout<<seq<<endl;
+// 			++a;
+// 		}
+// 	}
+//
+// 	// while (!streamDot.eof()){
+// 	// 	getline(streamDot,seq);
+// 	// 	transform(seq.begin(), seq.end(), seq.begin(), ::toupper);
+// 	// 	seq=seq.substr(0,seq.size()-1);
+// 	// 	// cout<<seq<<endl;
+// 	// 	for (uint i = 0; i+k <=seq.size(); ++i) {
+// 	// 		kmer=seq.substr(i,k);
+// 	// 		// cout<<kmer<<endl;
+// 	// 		kmer=getRepresent(kmer);
+// 	// 		// setDot.insert(kmer);
+// 	// 		if(setFa.count(kmer)==0){
+// 	// 			++b;
+// 	// 		}
+// 	// 	}
+// 	// 	// cout<<seq<<endl;
+// 	// 	// cin.get();
+// 	// 	// ++d;
+// 	// }
+// 	// for(auto it(setFa.begin());it!=setFa.end();++it){
+// 	// 	if(setDot.count(*it)==0){
+// 	// 		++a;
+// 	// 	}
+// 	// }
+// 	cout<<3<<endl;
+// 	// for(auto it(setDot.begin());it!=setDot.end();++it){
+// 	// 	if(setFa.count(*it)==0){
+// 	// 		++b;
+// 	// 	}
+// 	// }
+// 	cout<<a<<" "<<b<<endl;
+// 	cout<<c<<" "<<d<<endl;
+// }
+
+}}}}
diff --git a/gatb-core/src/gatb/bcalm2/ograph.cpp.128bits b/gatb-core/src/gatb/bcalm2/ograph.cpp.128bits
new file mode 100644
index 0000000..42d831d
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ograph.cpp.128bits
@@ -0,0 +1,356 @@
+#include "ograph.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <thread>
+
+
+/*
+ * constructs the compressed dBG from a list of arbitrary sequences
+ */
+
+
+using namespace std;
+
+
+string reverseinplace(string& str){
+	uint i(str.size()-1),j(0);
+	for(; j<str.size()/2; --i, ++j){
+		str[i] ^= 4;
+		str[j] ^= 4;
+		if ((str[i]&3) != 3){str[i]^= 17;}
+		if ((str[j]&3) != 3){str[j]^= 17;}
+		swap(str[i],str[j]);
+	}
+	if(str.size()%2==1){
+		str[j] ^= 4;
+		if ((str[j]&3) != 3){str[j]^= 17;}
+	}
+	return str;
+}
+
+
+void reverseinplace2(string& str){
+	uint i(str.size()-1),j(0);
+	for(; j<str.size()/2; --i, ++j){
+		str[i] ^= 4;
+		str[j] ^= 4;
+		if ((str[i]&3) != 3){str[i]^= 17;}
+		if ((str[j]&3) != 3){str[j]^= 17;}
+		swap(str[i],str[j]);
+	}
+	if(str.size()%2==1){
+		str[j] ^= 4;
+		if ((str[j]&3) != 3){str[j]^= 17;}
+	}
+}
+
+
+uint chartoint(char c){
+	char d = (c >> 1) & 3;
+	if (d > 1)
+		d ^= 1;
+	return d;
+}
+
+
+bool isNumber(char c){return (c<64);}
+
+
+kmerInt graph3::beg2int128(const string& str){
+	kmerInt resBeg(0);
+	for(uint i(0);i<k;++i){
+		resBeg<<=2;
+		resBeg+=chartoint(str[i]);
+	}
+	return resBeg;
+}
+
+
+kmerInt graph3::beg2int128rc(const string& str){
+	kmerInt res(0);
+	for(int i(k-1);i>=0;i--){
+		res<<=2;
+		res+=3-chartoint(str[i]);
+	}
+	return res;
+}
+
+
+kmerInt graph3::end2int128rc(const string& str){
+	kmerInt res(0);
+	for(int i(k-1);i>=0;i--){
+		res<<=2;
+		res+=3-chartoint(str[str.size()-k+i]);
+	}
+	return res;
+}
+
+
+kmerInt graph3::end2int128(const string& str){
+	kmerInt resEnd(0);
+	for(uint i(0);i<k;++i){
+		resEnd<<=2;
+		resEnd+=chartoint(str[str.size()-k+i]);
+	}
+	return resEnd;
+}
+
+
+kmerInt graph3::rcb(kmerInt min){
+	kmerInt resrcb(0);
+	kmerInt offsetrcb(1);
+	for(uint i(0); i<k;++i){
+		resrcb+=(3-(min%4))<<(2*(k-1-i));
+		min>>=2;
+	}
+	return resrcb;
+}
+
+
+void graph3::compaction(uint iL,  uint iR){
+	if(iR!=iL){
+		uint s1(unitigs[iL].size()),s2(unitigs[iR].size());
+		bool b1(isNumber(unitigs[iL][0])),b2(isNumber(unitigs[iR][0]));
+		if(b1 and b2){return compaction(stoi(unitigs[iL]),stoi(unitigs[iR]));}
+		if(b1){return compaction(stoi(unitigs[iL]),iR);}
+		if(b2){return compaction(iL,stoi(unitigs[iR]));}
+
+		kmerInt beg1(beg2int128(unitigs[iL]));
+		kmerInt end2(end2int128(unitigs[iR]));
+		if(beg1==end2){
+			unitigs[iR]+=(unitigs[iL].substr(k));
+			unitigs[iL]=to_string(iR);
+			return;
+		}
+
+		kmerInt endrc2(beg2int128rc(unitigs[iR]));
+		if(beg1==endrc2){
+			reverseinplace2(unitigs[iR]);
+			unitigs[iR]+=(unitigs[iL].substr(k));
+			unitigs[iL]=to_string(iR);
+			return;
+		}
+
+		kmerInt beg2(rcb(endrc2));
+		kmerInt end1(end2int128(unitigs[iL]));
+		if(end1==beg2){
+			unitigs[iL]+=(unitigs[iR].substr(k));
+			unitigs[iR]=to_string(iL);
+			return;
+		}
+
+		kmerInt begrc2(rcb(end2));
+		if(end1==begrc2){
+			unitigs[iL]+=(reverseinplace(unitigs[iR]).substr(k));
+			unitigs[iR]=to_string(iL);
+			return;
+		}
+	}
+}
+
+
+void graph3::debruijn(){
+	sort(left.begin(),left.end(),comparator());
+	sort(right.begin(),right.end(),comparator());
+	uint iL(0),iR(0),sizeLeft(left.size()),sizeRight(right.size());
+	left.push_back({0,(kmerInt)-1});
+	right.push_back({0,(kmerInt)-1});
+	kmerIndice kL,kR;
+	while(iL!=sizeLeft and iR!=sizeRight){
+		kL=left[iL];
+		kR=right[iR];
+		if(kL.kmmer==kR.kmmer){
+			bool go(true);
+			++iL;++iR;
+				if(left[iL].kmmer==kL.kmmer){
+					go=false;
+					while(left[++iL].kmmer==kL.kmmer){}
+				}
+				if(right[iR].kmmer==kL.kmmer){
+					go=false;
+					while(right[++iR].kmmer==kR.kmmer){}
+				}
+			if(go){compaction(kL.indice,kR.indice);}
+		}else{
+			if(kL.kmmer<kR.kmmer){
+				while(left[++iL].kmmer==kL.kmmer){}
+			}else{
+				while(right[++iR].kmmer==kR.kmmer){}
+			}
+		}
+	}
+}
+
+
+bool graph3::output(uint i){return !isNumber(unitigs[i][0]);}
+
+
+bool graph3::clear(){delete [] unitigs;return true;}
+
+
+uint graph3::size(){return indiceUnitigs;};
+
+
+void graph3::addtuple(tuple<string,uint,uint>& tuple){
+	unitigs[indiceUnitigs]=move(get<0>(tuple));
+	if(minimizer==(get<1>(tuple))){
+		kmerInt kmer1(beg2int128(unitigs[indiceUnitigs]));
+		kmerInt kmer2(rcb(kmer1));
+		if(kmer1<kmer2){
+			left.push_back(kmerIndice{indiceUnitigs,kmer1});
+		}else{
+			right.push_back(kmerIndice{indiceUnitigs,kmer2});
+		}
+	}
+	if(minimizer==get<2>(tuple)){
+		kmerInt kmer1(end2int128(unitigs[indiceUnitigs]));
+		kmerInt kmer2(rcb(kmer1));
+		if(kmer1<kmer2){
+			right.push_back(kmerIndice{indiceUnitigs,kmer1});
+		}else{
+			left.push_back(kmerIndice{indiceUnitigs,kmer2});
+		}
+	}
+	++indiceUnitigs;
+}
+
+
+// void compareUnitigs(const string& fileFa,const string& fileDot){
+// 	uint a(0),b(0),c(0),d(0);
+// 	unordered_set<string> setFa,setDot;
+// 	ifstream streamFa(fileFa),streamDot(fileDot);
+// 	string seq;
+// 	getline(streamFa,seq);
+// 	while (!streamFa.eof()) {
+// 		getline(streamFa,seq,'>');
+// 		seq=seq.substr(0,seq.size()-1);
+// 		setFa.insert(seq);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		getline(streamFa,seq);
+// 		++c;
+// 	}
+// 	cout<<1<<endl;
+// 	while (!streamDot.eof()){
+// 		getline(streamDot,seq);
+// 		transform(seq.begin(), seq.end(), seq.begin(), ::toupper);
+// 		seq=seq.substr(0,seq.size()-1);
+// 		setDot.insert(seq);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		++d;
+// 	}
+// 	cout<<2<<endl;
+// 	for(auto it(setFa.begin());it!=setFa.end();++it){
+// 		if(setDot.count(*it)==0){
+// 			++a;
+// 		}
+// 	}
+// 	cout<<3<<endl;
+// 	for(auto it(setDot.begin());it!=setDot.end();++it){
+// 		if(setFa.count(*it)==0){
+// 			++a;
+// 		}
+// 	}
+// 	cout<<a<<" "<<b<<endl;
+// 	cout<<c<<" "<<d<<endl;
+// }
+//
+//
+// void compareKmers(const string& fileFa,const string& fileDot){
+// 	uint k(31);
+// 	string kmer;
+// 	uint a(0),b(0),c(0),d(0);
+// 	unordered_set<string> setFa,setDot;
+// 	ifstream streamFa(fileFa),streamDot(fileDot);
+// 	string seq,inter,nimp;
+//
+//
+//
+// 	// cout<<1<<endl;
+// 	while (!streamFa.eof()) {
+// 		getline(streamFa,nimp);
+// 		// cout<<"nimp"<<nimp<<endl;
+// 		getline(streamFa,seq);
+// 		// cout<<"seq"<<seq<<endl;
+// 		point:
+// 		char c=streamFa.peek();
+// 		if(c=='>'){
+// 			point2:
+// 			// seq=seq.substr(0,seq.size());
+// 			// for(uint j(0);(j)<seq.size();++j){
+// 			// 	if(seq[j]!='A' and seq[j]!='C' and seq[j]!='T' and seq[j]!='G'){
+// 			// 		cout<<seq<<endl;
+// 			// 		cout<<"lol"<<endl;
+// 			// 		exit(0);
+// 			// 	}
+// 			// }
+// 			for (uint i = 0; i+k <=seq.size(); ++i) {
+// 				kmer=seq.substr(i,k);
+// 				// cout<<kmer<<endl;
+// 				kmer=getRepresent(kmer);
+// 				// if(setDot.count(kmer)==0){
+// 				// 	++a;
+// 				// }
+// 				setFa.insert(kmer);
+// 			}
+// 		}else{
+// 			if(!streamFa.eof()){
+// 				// cout<<"inter"<<endl;
+// 				// cout<<seq<<endl;
+// 				getline(streamFa,inter);
+// 				// cout<<inter<<endl;
+// 				seq+=inter;
+// 				goto point;
+// 			}else{
+// 				// cout<<"lol2"<<endl;
+// 				goto point2;
+// 			}
+// 		}
+// 	}
+// 	cout<<2<<endl;
+//
+// 	while (!streamDot.eof()){
+// 		getline(streamDot,seq);
+// 		seq=seq.substr(0,k);
+// 		// cout<<seq<<endl;
+// 		// cin.get();
+// 		if(setFa.count(getRepresent(seq))==0){
+// 			cout<<seq<<endl;
+// 			++a;
+// 		}
+// 	}
+//
+// 	// while (!streamDot.eof()){
+// 	// 	getline(streamDot,seq);
+// 	// 	transform(seq.begin(), seq.end(), seq.begin(), ::toupper);
+// 	// 	seq=seq.substr(0,seq.size()-1);
+// 	// 	// cout<<seq<<endl;
+// 	// 	for (uint i = 0; i+k <=seq.size(); ++i) {
+// 	// 		kmer=seq.substr(i,k);
+// 	// 		// cout<<kmer<<endl;
+// 	// 		kmer=getRepresent(kmer);
+// 	// 		// setDot.insert(kmer);
+// 	// 		if(setFa.count(kmer)==0){
+// 	// 			++b;
+// 	// 		}
+// 	// 	}
+// 	// 	// cout<<seq<<endl;
+// 	// 	// cin.get();
+// 	// 	// ++d;
+// 	// }
+// 	// for(auto it(setFa.begin());it!=setFa.end();++it){
+// 	// 	if(setDot.count(*it)==0){
+// 	// 		++a;
+// 	// 	}
+// 	// }
+// 	cout<<3<<endl;
+// 	// for(auto it(setDot.begin());it!=setDot.end();++it){
+// 	// 	if(setFa.count(*it)==0){
+// 	// 		++b;
+// 	// 	}
+// 	// }
+// 	cout<<a<<" "<<b<<endl;
+// 	cout<<c<<" "<<d<<endl;
+// }
diff --git a/gatb-core/src/gatb/bcalm2/ograph.h b/gatb-core/src/gatb/bcalm2/ograph.h
new file mode 100644
index 0000000..4db460c
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ograph.h
@@ -0,0 +1,82 @@
+#ifndef OGRAPH
+#define OGRAPH
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <array>
+#include <string>
+#include <cstdlib>
+#include <stdint.h>
+
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+template<size_t span>
+struct kmerIndiceT{
+    typedef typename Kmer<span>::Type  Type;
+    //typedef __uint128_t  Type;
+	uint32_t indice;
+	Type kmmer;
+};
+
+
+
+template<size_t span>
+struct comparator{bool operator()(const kmerIndiceT<span>& a , const kmerIndiceT<span>& b) { return a.kmmer < b.kmmer; }};
+
+
+template<size_t span>
+class graph3{
+	public:
+        typedef typename Kmer<span>::Type  kmerType;
+        //typedef __uint128_t  kmerType;
+        typedef kmerIndiceT<span>  kmerIndice;
+		uint k,indiceUnitigs,nbElement,minimizer,minsize;
+		std::string*       unitigs;
+        std::vector<uint>* unitigs_abundances;
+        std::vector<kmerIndice> left;
+        std::vector<kmerIndice> right;
+		void addvertex(std::string& str);
+        void addtuple(std::tuple<std::string,uint,uint,uint>& tuple);
+		void addleftmin(unsigned int mini);
+		void addrightmin(unsigned int mini);
+		void debruijn();
+        void debruijn2();
+        void compaction2(uint iL, uint iR);
+		void compress();
+        kmerType end2int128rc(const std::string& str);
+        kmerType end2int128(const std::string& str);
+        kmerType beg2int128rc(const std::string& str);
+        kmerType beg2int128(const std::string& str);
+        kmerType rcb(kmerType min);
+		void compaction(uint iR, uint iL);
+		void compact_abundances(uint i1, uint i2, bool reverse_first=false, bool reverse_second=false);
+		uint size();
+        bool output(uint i);
+        bool clear();
+
+		graph3(uint ka, uint min,uint size, uint nb){
+            indiceUnitigs=0;
+			minsize=size;
+			k=ka;
+			minimizer=min;
+            nbElement=nb;
+            unitigs=new std::string [nbElement];
+            left.reserve(nbElement);
+    	    right.reserve(nbElement);
+            unitigs_abundances=new std::vector<uint> [nbElement];
+		}
+};
+
+}}}}
+
+#endif
diff --git a/gatb-core/src/gatb/bcalm2/ograph.h.128bits b/gatb-core/src/gatb/bcalm2/ograph.h.128bits
new file mode 100644
index 0000000..001e023
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ograph.h.128bits
@@ -0,0 +1,69 @@
+#ifndef OGRAPH
+#define OGRAPH
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <array>
+#include <string>
+#include <cstdlib>
+
+
+using namespace std;
+
+#include <stdint.h>
+
+#define kmerInt __uint128_t // limitation to k<64 right here.
+
+struct kmerIndice{
+	uint32_t indice;
+	kmerInt kmmer;
+};
+
+
+
+struct comparator{bool operator()(const kmerIndice& a , const kmerIndice& b) { return a.kmmer < b.kmmer; }};
+
+
+class graph3{
+	public:
+		uint k,indiceUnitigs,nbElement,minimizer,minsize;
+		string* unitigs;
+		vector<kmerIndice> left;
+		vector<kmerIndice> right;
+		void addvertex(string& str);
+        void addtuple(tuple<string,uint,uint>& tuple);
+		void addleftmin(unsigned int mini);
+		void addrightmin(unsigned int mini);
+		void debruijn();
+        void debruijn2();
+        void compaction2(uint iL, uint iR);
+		void compress();
+        kmerInt end2int128rc(const string& str);
+        kmerInt end2int128(const string& str);
+        kmerInt beg2int128rc(const string& str);
+        kmerInt beg2int128(const string& str);
+        kmerInt rcb(kmerInt min);
+		void compaction(uint iR, uint iL);
+		uint size();
+        bool output(uint i);
+        bool clear();
+
+		graph3(uint ka, uint min,uint size, uint nb){
+            indiceUnitigs=0;
+			minsize=size;
+			k=ka;
+			minimizer=min;
+            nbElement=nb;
+            unitigs=new string [nbElement];
+            left.reserve(nbElement);
+    	    right.reserve(nbElement);
+		}
+};
+
+uint chartoint(char c);
+string reverseinplace(string& str);
+void reverseinplace2(string& str);
+bool isNumber(char c);
+
+#endif
diff --git a/gatb-core/src/gatb/bcalm2/ographBin.cpp.notsureifused b/gatb-core/src/gatb/bcalm2/ographBin.cpp.notsureifused
new file mode 100644
index 0000000..61e487d
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ographBin.cpp.notsureifused
@@ -0,0 +1,132 @@
+#include "ographBin.h"
+#include "ograph.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include "binSeq.h"
+
+
+/*
+ * constructs the compressed dBG from a list of arbitrary sequences
+ */
+
+
+using namespace std;
+
+
+kmer graph4::rcb(kmer min){
+	kmer resrcb(0);
+	for(uint i(0); i<k;++i){
+		resrcb+=(3-(min%4))<<(2*(k-1-i));
+		min>>=2;
+	}
+	return resrcb;
+}
+
+
+void graph4::compaction(uint iL,  uint iR){
+	uint s1(unitigs[iL].size()),s2(unitigs[iR].size());
+	bool b1(unitigs[iL].isInt),b2(unitigs[iR].isInt);
+	if(b1 and b2){return compaction((unitigs[iL].getNumber()),(unitigs[iR]).getNumber());}
+	if(b1){return compaction(unitigs[iL].getNumber(),iR);}
+	if(b2){return compaction(iL,unitigs[iR].getNumber());}
+
+	kmer end1(unitigs[iL].getEndInt());
+	kmer beg2(unitigs[iR].getBeginInt());
+	if(end1==beg2){
+		unitigs[iL].add(unitigs[iR].sub());
+		unitigs[iR]=binSeq(iL);
+		return;
+	}
+
+	kmer beg1(unitigs[iL].getBeginInt());
+	kmer end2(unitigs[iR].getEndInt());
+	if(end2==beg1){
+		unitigs[iR].add(unitigs[iL].sub());
+		unitigs[iL]=binSeq(iR);
+		return;
+	}
+
+	kmer begrc2(rcb(end2));
+	if(end1==begrc2){
+		unitigs[iR].reverse();
+		unitigs[iL].add(unitigs[iR].sub());
+		unitigs[iR]=binSeq(iL);
+		return;
+	}
+
+	kmer endrc2(rcb(beg2));
+	if(endrc2==beg1){
+		unitigs[iR].reverse();
+		unitigs[iR].add(unitigs[iL].sub());
+		unitigs[iL]=binSeq(iR);
+		return;
+	}
+	// cout<<"wut"<<endl;
+}
+
+
+void graph4::debruijn(){
+	// cout<<"debruijn go"<<endl;
+	sort(left.begin(),left.end(),comparator());
+	sort(right.begin(),right.end(),comparator());
+	uint iL(0),iR(0);
+	kmerIndice kL,kR;
+	while(iL!=left.size() and iR!=right.size()){
+		kL=left[iL];
+		kR=right[iR];
+		if(kL.kmmer==kR.kmmer){
+			bool go(true);
+			++iL;++iR;
+			if(left[iL].kmmer==kL.kmmer){
+				go=false;
+				while(left[++iL].kmmer==kL.kmmer){}
+			}
+			if(right[iR].kmmer==kL.kmmer){
+				go=false;
+				while(right[++iR].kmmer==kR.kmmer){}
+			}
+			if(go){compaction(kL.indice,kR.indice);}
+		}else{
+			if(kL.kmmer<kR.kmmer){
+				while(++iL!=left.size() and left[iL].kmmer<kR.kmmer){}
+			}else{
+				while(++iR!=right.size() and right[iR].kmmer<kL.kmmer){}
+			}
+		}
+	}
+	// cout<<"debruijn end"<<endl;
+}
+
+
+bool graph4::output(uint i){return (!unitigs[i].isInt);}
+
+
+void graph4::clear(){delete [] unitigs;}
+
+
+uint graph4::size(){return indiceUnitigs;};
+
+
+void graph4::addtuple(tuple<binSeq,uint,uint>& tuple){
+	unitigs[indiceUnitigs]=(get<0>(tuple));
+	if(minimizer==(get<1>(tuple))){
+		kmer kmer1(unitigs[indiceUnitigs].getBeginInt());
+		kmer kmer2(rcb(kmer1));
+		if(kmer1<kmer2){
+			left.push_back(kmerIndice{indiceUnitigs,kmer1});
+		}else{
+			right.push_back(kmerIndice{indiceUnitigs,kmer2});
+		}
+	}
+	if(minimizer==get<2>(tuple)){
+		kmer kmer1(unitigs[indiceUnitigs].getEndInt());
+		kmer kmer2(rcb(kmer1));
+		if(kmer1<kmer2){
+			right.push_back(kmerIndice{indiceUnitigs,kmer1});
+		}else{
+			left.push_back(kmerIndice{indiceUnitigs,kmer2});
+		}
+	}
+	++indiceUnitigs;
+}
diff --git a/gatb-core/src/gatb/bcalm2/ographBin.h b/gatb-core/src/gatb/bcalm2/ographBin.h
new file mode 100644
index 0000000..fbb0590
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/ographBin.h
@@ -0,0 +1,55 @@
+#ifndef OGRAPHBIN
+#define OGRAPHBIN
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <array>
+#include <string>
+#include <cstdlib>
+#include "binSeq.h"
+#include "ograph.h" // just for kmerIndice
+
+
+using namespace std;
+
+
+class graph4{
+	public:
+		uint k,indiceUnitigs,nbElement,minimizer,minsize;
+		binSeq* unitigs;
+		vector<kmerIndice> left;
+		vector<kmerIndice> right;
+		void addvertex(string& str);
+        void addtuple(tuple<binSeq,uint,uint>& tuple);
+		void addleftmin(unsigned int mini);
+		void addrightmin(unsigned int mini);
+		void debruijn();
+        void debruijn2();
+        void compaction2(uint iL, uint iR);
+		void compress();
+        kmer rcb(kmer min);
+		void compaction(uint iR, uint iL);
+		uint size();
+        bool output(uint i);
+        void clear();
+
+		graph4(uint ka, uint min,uint size, uint nb){
+            indiceUnitigs=0;
+			minsize=size;
+			k=ka;
+			minimizer=min;
+            nbElement=nb;
+            unitigs=new binSeq [nbElement];
+            left.reserve(nbElement);
+    	    right.reserve(nbElement);
+		}
+};
+
+
+void compareUnitigs(const string& fileFa,const string& fileDot);
+void compareKmers(const string& fileFa,const string& fileDot);
+
+
+
+#endif
diff --git a/gatb-core/src/gatb/bcalm2/unionFind.hpp b/gatb-core/src/gatb/bcalm2/unionFind.hpp
new file mode 100644
index 0000000..941aa93
--- /dev/null
+++ b/gatb-core/src/gatb/bcalm2/unionFind.hpp
@@ -0,0 +1,608 @@
+#if !defined(__UNIONFIND_H)
+#define __UNIONFIND_H
+
+#include <vector>
+#include <set>
+#include <atomic>
+#include <iostream>
+#include <unordered_map>
+
+/**
+ * Lock-free parallel disjoint set data structure (aka UNION-FIND)
+ * with path compression and union by rank
+ *
+ * Supports concurrent find(), same() and unite() calls as described
+ * in the paper
+ *
+ * "Wait-free Parallel Algorithms for the Union-Find Problem"
+ * by Richard J. Anderson and Heather Woll
+ *
+ * In addition, this class supports optimistic locking (try_lock/unlock)
+ * of disjoint sets and a combined unite+unlock operation.
+ *
+ * \author Wenzel Jakob
+ */
+template<class T> // but actually we don't care about this type
+class unionFind { 
+public:
+    unionFind(uint32_t size) : mData(size) {
+        //max_rank = 0;
+        for (uint32_t i=0; i<size; ++i)
+            mData[i] = (uint32_t) i;
+    }
+
+    uint32_t find(uint32_t id) const {
+        while (id != parent(id)) {
+            uint64_t value = mData[id];
+            uint32_t new_parent = parent((uint32_t) value);
+            uint64_t new_value =
+                (value & 0xFFFFFFFF00000000ULL) | new_parent;
+            /* Try to update parent (may fail, that's ok) */
+            if (value != new_value)
+                mData[id].compare_exchange_weak(value, new_value);
+            id = new_parent;
+        }
+        return id;
+    }
+
+    bool same(uint32_t id1, uint32_t id2) const {
+        for (;;) {
+            id1 = find(id1);
+            id2 = find(id2);
+            if (id1 == id2)
+                return true;
+            if (parent(id1) == id1)
+                return false;
+        }
+    }
+
+    uint32_t union_(uint32_t id1, uint32_t id2) {
+        for (;;) {
+            id1 = find(id1);
+            id2 = find(id2);
+
+            if (id1 == id2)
+                return id1;
+
+            uint32_t r1 = rank(id1), r2 = rank(id2);
+
+            if (r1 > r2 || (r1 == r2 && id1 < id2)) {
+                std::swap(r1, r2);
+                std::swap(id1, id2);
+            }
+
+            uint64_t oldEntry = ((uint64_t) r1 << 32) | id1;
+            uint64_t newEntry = ((uint64_t) r1 << 32) | id2;
+
+            if (!mData[id1].compare_exchange_strong(oldEntry, newEntry))
+                continue;
+
+            if (r1 == r2) {
+                oldEntry = ((uint64_t) r2 << 32) | id2;
+                newEntry = ((uint64_t) (r2+1) << 32) | id2;
+                /* Try to update the rank (may fail, that's ok) */
+                mData[id2].compare_exchange_weak(oldEntry, newEntry);
+            }
+
+            break;
+        }
+        return id2;
+    }
+
+    uint32_t size() const { return (uint32_t) mData.size(); }
+
+    //uint32_t max_rank;
+    uint32_t rank(uint32_t id) {
+        uint32_t r = ((uint32_t) (mData[id] >> 32)) & 0x7FFFFFFFu;
+        /*if (max_rank < r)
+        {
+            //max_rank = r; // not thread safe but that's okay, just for debugging // looks like it maxs at 6 for human too.
+            std::cout << "new max UF rank: " << to_string(r)<<endl; 
+        }*/
+        return r;
+    }
+
+    uint32_t parent(uint32_t id) const {
+        return (uint32_t) mData[id];
+    }
+
+    // compatibility with original unionFind.cpp
+    uint32_t getSet(uint32_t key) { return find(key); }
+
+    void printStats(std::string prefix) 
+    {
+        std::unordered_map<T, std::set<T>> reverseData;
+        uint64_t getNumKeys, getNumSets;
+        for ( unsigned int i = 0; i < size(); i++ )
+            reverseData[find(i)].insert(i); // need to call find, because element isn't necessarily the representant of its equivalence class
+        unsigned int mean = 0, max = 0;
+        for ( auto it = reverseData.begin(); it != reverseData.end(); ++it )
+        {
+            max = std::max((unsigned int) it->second.size(), max);
+            mean += it->second.size();
+        }
+        if (reverseData.size() > 0)
+            mean /= reverseData.size();
+        getNumSets = reverseData.size();
+        getNumKeys = mData.size();
+        std::cout << prefix + " data structure has " << getNumKeys << " inserted elements, and made " << getNumSets << " partitions." << std::endl;
+        std::cout << "mean/max number of elements in partitions: " << mean << "/" << max << std::endl;
+        std::cout << "raw space of UF hash data: " << ( 2*getNumKeys * sizeof(T)  ) /1024/1024 << " MB" << std::endl; // 2x because each key of type T is associated to a value of type T
+    }
+
+
+
+    mutable std::vector<std::atomic<uint64_t>> mData;
+};
+
+#endif /* __UNIONFIND_H */
+
+// this one below works fine but uses an unordered_map; so two problem:
+// - memory usage
+// - has locks
+// but I needed it before using the MPHF for bglue
+
+#if 0
+
+#if !defined(__UNIONFIND_H)
+#define __UNIONFIND_H
+
+#include <vector>
+#include <atomic>
+#include <iostream>
+
+#include <mutex>
+#include <unordered_map>
+
+
+/**
+ * Lock-free parallel disjoint set data structure (aka UNION-FIND)
+ * with path compression and union by rank
+ *
+ * Supports concurrent find(), same() and unite() calls as described
+ * in the paper
+ *
+ * "Wait-free Parallel Algorithms for the Union-Find Problem"
+ * by Richard J. Anderson and Heather Woll
+ *
+ * In addition, this class supports optimistic locking (try_lock/unlock)
+ * of disjoint sets and a combined unite+unlock operation.
+ *
+ * \author Wenzel Jakob
+ *
+ * modified by Rayan Chikhi to use an unordered_map
+ */
+template<typename T>
+class unionFind {
+public:
+    unionFind (uint32_t size) {
+    }
+
+    // still mutexes are needed because mData may resize itself
+    std::mutex set_mutex;
+
+
+    uint32_t find(uint32_t id) {
+        while (id != parent(id)) {
+            set_mutex.lock();
+            if ( mData.find(id) == mData.end())
+                mData[id] = id;
+            uint64_t value = mData[id];
+            set_mutex.unlock();
+            uint32_t new_parent = parent((uint32_t) value);
+            uint64_t new_value =
+                (value & 0xFFFFFFFF00000000ULL) | new_parent;
+            /* Try to update parent (may fail, that's ok) */
+            set_mutex.lock();
+            if (value != new_value)
+                mData[id].compare_exchange_weak(value, new_value);
+            set_mutex.unlock();
+            id = new_parent;
+        }
+        return id;
+    }
+
+    bool same(uint32_t id1, uint32_t id2) const {
+        for (;;) {
+            id1 = find(id1);
+            id2 = find(id2);
+            if (id1 == id2)
+                return true;
+            if (parent(id1) == id1)
+                return false;
+        }
+    }
+
+    uint32_t union_(uint32_t id1, uint32_t id2) {
+        for (;;) {
+            id1 = find(id1);
+            id2 = find(id2);
+
+            if (id1 == id2)
+                return id1;
+
+            uint32_t r1 = rank(id1), r2 = rank(id2);
+
+            if (r1 > r2 || (r1 == r2 && id1 < id2)) {
+                std::swap(r1, r2);
+                std::swap(id1, id2);
+            }
+
+            uint64_t oldEntry = ((uint64_t) r1 << 32) | id1;
+            uint64_t newEntry = ((uint64_t) r1 << 32) | id2;
+
+            set_mutex.lock();
+            if (!mData[id1].compare_exchange_strong(oldEntry, newEntry))
+            {
+                set_mutex.unlock();
+                continue;
+            }
+            set_mutex.unlock();
+
+            if (r1 == r2) {
+                oldEntry = ((uint64_t) r2 << 32) | id2;
+                newEntry = ((uint64_t) (r2+1) << 32) | id2;
+                /* Try to update the rank (may fail, that's ok) */
+                set_mutex.lock();
+                mData[id2].compare_exchange_weak(oldEntry, newEntry);
+                set_mutex.unlock();
+            }
+
+            break;
+        }
+        return id2;
+    }
+    
+
+    uint32_t size() const { return (uint32_t) mData.size(); }
+
+    uint32_t rank(uint32_t id) {
+        set_mutex.lock();
+        uint32_t res = ((uint32_t) (mData[id] >> 32LL)) & 0x7FFFFFFFu;
+        set_mutex.unlock();
+        return res;
+    }
+
+    uint32_t parent(uint32_t id) {
+        set_mutex.lock();
+        if ( mData.find(id) == mData.end())
+            mData[id] = id;
+        uint32_t res = (uint32_t) mData[id];
+        set_mutex.unlock();
+        return res;
+    }
+
+    // compatibility with original unionFind.cpp
+    uint32_t getSet(uint32_t key) { return find(key); }
+
+    void printStats(std::string prefix) 
+    {
+        std::unordered_map<T, std::set<T>> reverseData;
+        uint64_t getNumKeys, getNumSets;
+        for ( auto it = mData.begin(); it != mData.end(); ++it )
+            reverseData[find(it->second)].insert(it->first); // need to call find, because element isn't necessarily the representant of its equivalence class
+        unsigned int mean = 0, max = 0;
+        for ( auto it = reverseData.begin(); it != reverseData.end(); ++it )
+        {
+            max = std::max((unsigned int) it->second.size(), max);
+            mean += it->second.size();
+        }
+        if (reverseData.size() > 0)
+            mean /= reverseData.size();
+        getNumSets = reverseData.size();
+        getNumKeys = mData.size();
+        std::cout << prefix + " data structure has " << getNumKeys << " inserted elements, and made " << getNumSets << " partitions." << std::endl;
+        std::cout << "mean/max number of elements in partitions: " << mean << "/" << max << std::endl;
+        std::cout << "raw space of UF hash data: " << ( 2*getNumKeys * sizeof(T)  ) /1024/1024 << " MB" << std::endl; // 2x because each key of type T is associated to a value of type T
+        std::cout << "bucket count: " << mData.bucket_count() << std::endl;// ", sizeof(std::atomic<uint64_t>>) = " << sizeof(std::atomic<uint64_t>) << std::endl; // (it's always 8 actually)
+
+    }
+
+
+    mutable std::unordered_map<uint32_t, std::atomic<uint64_t>> mData;
+};
+
+#endif /* __UNIONFIND_H */
+
+#endif
+
+
+// old code
+
+#if 0
+/* seems to work ok in single thread, but not multithread
+ *
+ * there is still a bug, see e.g. fluctations in the number of partitions:
+ *
+ * uf kmers, std::string data structure has 2074559 inserted elements, and made 695780 partitions.
+ * mean/max number of elements in partitions: 2/4817
+ *
+ * uf kmers data structure has 2074559 inserted elements, and made 695779 partitions.
+ * mean/max number of elements in partitions: 2/4817
+ *
+ * such tricky parallelism.. I'll use another library for now.
+ */
+
+#include <iostream>
+#include <cassert>
+#include <mutex>
+#include <vector>
+#include <set>
+#include <thread>
+#include <string.h>
+#include <unordered_map>
+
+
+//#define SPARSEHASH
+#ifdef SPARSEHASH
+#include <sparsehash/sparse_hash_map>
+using google::sparse_hash_map;
+#endif
+
+template<class T> 
+class unionFind {
+public:
+    unionFind()
+    {
+        numLocks=0;
+        set_mutex=NULL;
+        data.resize(1);
+    }
+    // for spasehash, one would think we need to call data.set_deleted_key("") 
+    // but actually not. it's only if we used data.erase()
+
+	unionFind(unsigned long nlocks)
+	{
+		numLocks = nlocks;
+		if (nlocks > 0)
+		{
+			set_mutex = new std::mutex[numLocks];
+		}
+		else
+		{
+			set_mutex = NULL;
+		}
+        data.resize(numLocks);
+	}
+
+    ~unionFind()
+    {
+        //cout << "destructor" << endl;
+        if (set_mutex != NULL)
+        {
+            delete[] set_mutex;
+        }
+        //cout << "destructor end" << endl;
+    }
+    
+      
+    T getSet(T set)
+    {
+		bool found = dataFind(set);
+		if (!found) {
+            std::cerr << "Invalid reference to unionFind getSet()" << std::endl;
+			exit(1);
+		}
+		return find(set);
+    }
+
+    // O(1)
+    unsigned long getNumKeys()
+    {
+        unsigned long res = 0;
+        unsigned int bound  = (numLocks == 0) ? 1 : numLocks; 
+        for (unsigned int i = 0; i < bound; i++)
+            res += data[i].size();
+        return res;
+    }
+
+    // O(|keys|)
+    unsigned long getNumSets()
+    {
+        std::set<T> finalSets;
+        unsigned int bound  = (numLocks == 0) ? 1 : numLocks; 
+        for (unsigned int i = 0; i < bound; i++)
+        for ( auto it = data[i].begin(); it != data[i].end(); ++it )
+        {
+		        finalSets.insert(find(it->second)); // need to call find, because element isn't necessarily the representant of its equivalence class
+        }
+
+        return finalSets.size();
+    }
+
+    // O(|keys|)
+    void setStats(unsigned long &mean, unsigned long &max)
+    {
+        std::unordered_map<T, std::set<T>> reverseData;
+        unsigned int bound  = (numLocks == 0) ? 1 : numLocks; 
+        for (unsigned int i = 0; i < bound; i++)
+        for ( auto it = data[i].begin(); it != data[i].end(); ++it )
+        {
+		        reverseData[find(it->second)].insert(it->first); // need to call find, because element isn't necessarily the representant of its equivalence class
+        }
+
+        mean = 0; max = 0;
+
+        for ( auto it = reverseData.begin(); it != reverseData.end(); ++it )
+        {
+            max = std::max(it->second.size(), max);
+            mean += it->second.size();
+        }
+        if (reverseData.size() > 0)
+            mean /= reverseData.size();
+    }
+
+    void printStats(std::string prefix)
+    {
+        std::cout << prefix + " data structure has " << getNumKeys() << " inserted elements, and made " << getNumSets() << " partitions." << std::endl;
+        unsigned long mean, max;
+        setStats(mean, max);
+        std::cout << "mean/max number of elements in partitions: " << mean << "/" << max << std::endl;
+        std::cout << "raw space of UF hash data: " << ( 2*getNumKeys() * sizeof(T)  ) /1024/1024 << " MB" << std::endl; // 2x because each key of type T is associated to a value of type T
+        //std::cout << "number of UF hash buckets: " << data.bucket_count() << std::endl;
+        //std::cout << "estimate of UF hash space: " << ( 2*data.bucket_count() * sizeof(T)  ) /1024/1024 << " MB" << std::endl; // 2x because each key of type T is associated to a value of type T
+        std::cout << "but don't forget there are additional data strutures constructed in setStats(), they're quite expensive" << std::endl; // 2x because each key of type T is associated to a value of type T
+        
+    }
+
+
+    T dataRead(T key) // low level function for reading from the UF hash
+                    // uses mutexes for maximum safery
+    {
+        T res;
+
+        unsigned long mutexIndex = 0;
+        if (numLocks > 0)
+        {
+            mutexIndex = getMutex(key);
+            set_mutex[mutexIndex].lock(); 
+        }
+
+        res = data[mutexIndex][key];
+        
+        if (numLocks > 0)
+            set_mutex[mutexIndex].unlock();
+        
+        return res;
+    }
+ 
+    void dataWrite(T key, T val) // low level function for reading from the UF hash
+                    // uses mutexes for maximum safery
+    {
+        unsigned long mutexIndex = 0;
+        if (numLocks > 0)
+        {
+            mutexIndex = getMutex(key);
+            set_mutex[mutexIndex].lock(); 
+        }
+
+        data[mutexIndex][key] = val;
+
+        if (numLocks > 0)
+            set_mutex[mutexIndex].unlock();
+        
+    }
+    
+    bool dataFind(T key) // low level function for reading from the UF hash
+                    // uses mutexes for maximum safery
+    {
+        unsigned long mutexIndex = 0;
+        if (numLocks > 0)
+        {
+            mutexIndex = getMutex(key);
+            set_mutex[mutexIndex].lock(); 
+        }
+
+
+        bool res = (data[mutexIndex].find(key) != data[mutexIndex].end());
+ 
+        if (numLocks > 0)
+            set_mutex[mutexIndex].unlock();
+     
+        return res;
+    }
+
+
+    T find(T key){
+        if (! dataFind(key)) {
+            dataWrite(key,key);
+        }
+
+        //vector<T> chain;
+        
+        T tmpKey = key;
+        while (dataRead(tmpKey) != tmpKey) {
+            //chain.push_back(tmpKey);
+            tmpKey = dataRead(tmpKey);
+        }
+
+        dataWrite(key,tmpKey);
+
+        // do "compress" on the fly
+        // - disabled because I didn't observe any speedup
+        //for (auto it = chain.begin(); it != chain.end(); it++)
+        //    dataWrite(*it, tmpKey);
+
+
+        return tmpKey;
+    }
+
+	void union_(T set1, T set2){
+
+        T big,  small;
+        T findSet1 = find(set1);
+        T findSet2 = find(set2);
+        if (findSet1 < findSet2) {
+            small = set1;
+            big = set2;
+        } else {
+            small = set2;
+            big = set1;
+        }
+
+        //    cout << "small " << small << " big " << big << endl;
+
+        dataWrite(big, small);
+
+        assert(getSet(big) == getSet(small));
+    }
+
+
+private:
+#ifdef SPARSEHASH
+	typedef sparse_hash_map<T, T> ufDS;
+#else
+	typedef std::unordered_map<T, std::atomic<T>> ufDS;
+#endif
+
+	std::vector<ufDS> data; 
+	
+    unsigned long numLocks;
+    std::mutex *set_mutex;
+
+    //The following function was implemented but not used in the array implementation.
+    //I (PM) did not port it because it is not used and its not immediately clear how to port it to a hash table implementation.
+    /*
+       void unionFind::compress (unsigned long start, unsigned long end)
+       {
+       unsigned long key=0,key1=0;
+       for (unsigned long i=start; i<end; i++)
+       {
+       key=i;
+       while (key!=sets[key])
+       {
+       key=sets[key];
+       }
+       key1=i;
+       while (key!=sets[key1])
+       {
+       unsigned long tmpKey=sets[key1];
+       if ((key1>=start) && (key1<end))
+       {
+       sets[key1]=key;
+       }
+       key1=tmpKey;
+       }
+       }
+       }
+       */
+
+    //unsigned long getMutex(T key) {
+		//TODO this function needs to be written for parallelism to work efficiently.
+		//When T was an int type, this would return key%numLocks
+		//But, in case T is not an int type, we need another way to get an arbitrary mutex.
+	//	return 0;
+	//}
+
+    // good idea. I got you paul, here it is for hashed int's
+    unsigned long getMutex(uint64_t key /*in bcalm, key is a hashed int, so no need to hash it further*/) {
+		return key%numLocks;
+	}
+
+    // dummy for string, no parallelization
+//    unsigned long getMutex(std::string key ) {
+//        return 0;
+//    }
+};
+
+#endif
diff --git a/gatb-core/src/gatb/debruijn/api/IContainerNode.hpp b/gatb-core/src/gatb/debruijn/api/IContainerNode.hpp
new file mode 100644
index 0000000..b2a32d6
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/api/IContainerNode.hpp
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IContainerNode.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Container interface
+ *
+ *  This file holds interfaces related to the Container interface, ie something we can ask for items.
+ */
+
+#ifndef _GATB_CORE_DEBRUIJN_ICONTAINER_NODE_HPP_
+#define _GATB_CORE_DEBRUIJN_ICONTAINER_NODE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Container.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+/********************************************************************************/
+
+/** \brief Container interface
+ *
+ * The Container interface provides an operation that ask for a given item.
+ *
+ * This interface is mainly used by the impl::Graph class
+ */
+template <class Item> class IContainerNode : public tools::collections::Container<Item>
+{
+public:
+
+    /** Destructor. */
+    virtual ~IContainerNode() {}
+
+    /** Tells whether an item exists or not in the container
+     * \return true if the item exists, false otherwise */
+    virtual bool contains (const Item& item) = 0;
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_ICONTAINER_NODE_HPP_ */
diff --git a/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.cpp b/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.cpp
new file mode 100644
index 0000000..167a448
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.cpp
@@ -0,0 +1,349 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/debruijn/impl/BranchingAlgorithm.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+#include <queue>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace debruijn  {   namespace impl {
+/********************************************************************************/
+
+static const char* progressFormat1 = "Graph: build branching nodes           ";
+static const char* progressFormat2 = "Graph: nb branching found : %-9d  ";
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+BranchingAlgorithm<span, Node, Edge, Graph>::BranchingAlgorithm (
+    const Graph& graph,
+    tools::storage::impl::Storage& storage,
+    tools::misc::BranchingKind  kind,
+    size_t                      nb_cores,
+    tools::misc::IProperties*   options
+)
+    : Algorithm("branching", nb_cores, options), _graph (&graph),  _storage(storage), _kind(kind), _branchingCollection(0)
+{
+    setBranchingCollection (& storage("branching").getCollection<Count> ("nodes"));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+BranchingAlgorithm<span, Node, Edge, Graph>::BranchingAlgorithm (tools::storage::impl::Storage& storage)
+    : Algorithm("branching", 0, 0), _graph(0), _storage(storage), _branchingCollection(0)
+{
+    setBranchingCollection (& storage("branching").getCollection<Count> ("nodes"));
+
+    string xmlString = storage(this->getName()).getProperty ("xml");
+    stringstream ss; ss << xmlString;   getInfo()->readXML (ss);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+BranchingAlgorithm<span, Node, Edge, Graph>::~BranchingAlgorithm ()
+{
+    setBranchingCollection(0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+IOptionsParser* BranchingAlgorithm<span, Node, Edge, Graph>::getOptionsParser ()
+{
+    IOptionsParser* parser = new OptionsParser ("branching");
+
+    parser->push_back (new OptionOneParam (STR_BRANCHING_TYPE,    "branching type ('none' or 'stored')",      false, "stored"));
+    parser->push_back (new OptionOneParam (STR_TOPOLOGY_STATS,    "topological information level (0 for none)", false, "0"));
+
+    return parser;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+typedef pair<size_t,size_t> InOut_t;
+inline bool CompareFct (const pair<InOut_t,size_t>& a, const pair<InOut_t,size_t>& b) { return a.second > b.second; }
+
+template<typename Count, typename Type>
+struct FunctorData
+{
+	FunctorData() {  }
+    std::vector<Count> branchingNodes;
+    map <InOut_t, size_t> topology;
+};
+
+template<typename Count, typename Type, typename Node, typename Edge, typename Graph>
+struct FunctorNodes
+{
+    const Graph* graph;
+    ThreadObject<FunctorData<Count,Type> >& functorData;
+
+    FunctorNodes (const Graph* graph, ThreadObject<FunctorData<Count,Type> >& functorData)
+        : graph(graph), functorData(functorData)  {}
+
+    void operator() (Node& node)
+    {
+        // We get branching nodes neighbors for the current node.
+        GraphVector<Node> successors   = graph->template successors   (node);
+        GraphVector<Node> predecessors = graph->template predecessors (node);
+
+        if ( ! (successors.size()==1 && predecessors.size()==1) )
+        {
+            // the node is branching
+
+        	FunctorData<Count,Type>& data = functorData();
+
+        	data.branchingNodes.push_back (Count (node.template getKmer<Type>(), node.abundance));
+
+        	data.topology [make_pair(predecessors.size(), successors.size())] ++;
+        }
+    }
+};
+
+/*********************************************************************/
+
+template<typename Count>
+class SortCmd : public tools::dp::ICommand, public system::SmartPointer
+{
+public:
+    vector<Count>& vec;
+    SortCmd (vector<Count>& vec) : vec(vec) {}
+    void execute ()  {  std::sort (vec.begin(), vec.end());  }
+};
+
+/*********************************************************************/
+
+template <typename T>
+struct Compare
+{
+    /** Biggest values first. */
+    bool operator() (const T& a, const T& b)  {  return ! (*(a.first) < *(b.first));  }
+};
+
+/*********************************************************************/
+
+template<typename Count>
+class CustomListener : public ProgressProxy
+{
+    Collection<Count>* _branchingCollection;
+
+public:
+    CustomListener (IteratorListener* ref, Collection<Count>* branchingCollection)
+        : ProgressProxy(ref), _branchingCollection(branchingCollection) {}
+
+    void finish ()  {}
+
+    void finishPostponed ()
+    {
+        this->setMessage (Stringify::format(progressFormat2, _branchingCollection->getNbItems()));
+        getRef()->finish();
+    }
+};
+
+/*********************************************************************/
+
+template <size_t span, typename Node, typename Edge, typename Graph>
+void BranchingAlgorithm<span, Node, Edge, Graph>::execute ()
+{
+    /** We get an iterator over all graph nodes. */
+    GraphIterator<Node> itNodes = _graph->Graph::iterator();
+
+    /** We create a custom listener that makes the finish() method, normally called at end of iteration, do nothing this time.
+     * => we define our own 'finishPostponed' method that is called when all the information is ok. */
+    CustomListener<Count>* listener = new CustomListener<Count> (
+        createIteratorListener (itNodes.size(), progressFormat1),
+        _branchingCollection
+    );
+
+    /** We encapsulate this iterator with a potentially decorated iterated (for progress information). */
+    tools::dp::Iterator<Node>* iter = createIterator<Node> (
+        itNodes.get(),
+        itNodes.size(),
+        progressFormat1,
+        listener
+    );
+    LOCAL (iter);
+
+    /** We get a synchronized object on the data handled by functors. */
+    ThreadObject <FunctorData<Count,Type> > functorData;
+
+    FunctorNodes<Count,Type, Node, Edge, Graph> functorNodes (this->_graph, functorData);
+
+    /** We iterate the nodes. */
+    tools::dp::IDispatcher::Status status = getDispatcher()->iterate (iter, functorNodes);
+
+    /** Now, because we iterated with N threads, we have N vector of branching nodes. (N=nbcores used by the dispatcher)
+     *  We need to merge them.
+     *  TODO doc: why do they need to be sorted actually?!
+     *  The next step are:
+     *      1) sort each vector
+     *      2) sort/merge the N vectors in the final collection
+     */
+
+    /** Step 1 : sorting the N branching nodes vectors (with the dispatcher). */
+    vector<tools::dp::ICommand*> sortCmds;
+    for (size_t i=0; i<functorData.size(); i++)  {  sortCmds.push_back (new SortCmd<Count> (functorData[i].branchingNodes));  }
+    getDispatcher()->dispatchCommands (sortCmds);
+
+    /** Step 2 : sort/merge the N vectors.
+     * We use a priority queue for the merge process. */
+    typedef typename vector<Count>::iterator BranchingIterator;
+    typedef pair<BranchingIterator,BranchingIterator> BranchingIteratorPair;
+
+    /** We use a cache to improve IO performances. */
+    CollectionCache<Count> branchingCache (*_branchingCollection, 16*1024, 0);
+
+    Type checksum; checksum.setVal( 0);
+
+    /** We initialize our priority queue. */
+    priority_queue <BranchingIteratorPair, vector<BranchingIteratorPair>, Compare<BranchingIteratorPair> > pq;
+    for (size_t i=0; i<functorData.size(); i++)
+    {
+        if (functorData[i].branchingNodes.empty() == false)
+        {
+            pq.push (make_pair (functorData[i].branchingNodes.begin(), functorData[i].branchingNodes.end()));
+        }
+    }
+
+    /** We process the merge/sort. */
+    while (!pq.empty())
+    {
+        /** We get the top iterators pair from the priority queue and remove from it. */
+        BranchingIteratorPair it = pq.top();
+        pq.pop();
+
+        /** We check that the current iterator is not finished. */
+        if (it.first != it.second)
+        {
+            /** We insert the Count object into the final bag. */
+            branchingCache.insert (*it.first);
+
+            /** Stats */
+            checksum += it.first->value;
+
+            /** We update the priority queue. */
+            ++(it.first); if (it.first != it.second)  {  pq.push (it); }
+        }
+    }
+
+    /** We have to flush the cache to be sure every items is put into the cached collection. */
+    branchingCache.flush ();
+
+    /** We call our 'custom' finish method. */
+    listener->finishPostponed();
+
+    /** We save the kind in the storage. */
+    _storage(getName()).addProperty ("kind", toString(_kind));
+
+    /* print the number of branching nodes (could be important for debugging, if a user experiences a crash and copypastes stdout) */
+    //cout << "Graph has " << _branchingCollection->getNbItems() << " branching nodes." << endl;
+
+    /** We gather some statistics. */
+    getInfo()->add (1, "stats");
+    getInfo()->add (2, "nb_branching", "%ld", _branchingCollection->getNbItems());
+    getInfo()->add (2, "percentage",   "%.1f", (itNodes.size() > 0 ? 100.0*(float)_branchingCollection->getNbItems()/(float)itNodes.size() : 0));
+
+    stringstream ss;  ss << checksum;
+    getInfo()->add (2, "checksum_branching", "%s", ss.str().c_str());
+
+    if (getInput()->get(STR_TOPOLOGY_STATS) && getInput()->getInt(STR_TOPOLOGY_STATS) > 0)
+    {
+        /** We get some topological information. */
+        for (size_t i=0; i<functorData.size(); i++)
+        {
+            for (map<InOut_t, size_t>::iterator it = functorData[i].topology.begin();  it != functorData[i].topology.end(); ++it)
+            {
+                functorData->topology[it->first] += it->second;
+            }
+        }
+
+        /** We sort the statistics. */
+        vector < pair<InOut_t,size_t> >  topologyStats;
+        for (map<InOut_t, size_t>::iterator it = functorData->topology.begin();  it != functorData->topology.end(); ++it)  { topologyStats.push_back (*it); }
+        sort (topologyStats.begin(), topologyStats.end(), CompareFct);
+
+        getInfo()->add (1, "topology");
+        for (size_t i=0; i<topologyStats.size(); i++)
+        {
+            getInfo()->add (3, "neighborhood", "[in=%ld out=%ld]  nb : %8ld   percent. : %5.2f",
+                topologyStats[i].first.first, topologyStats[i].first.second, topologyStats[i].second,
+                _branchingCollection->getNbItems() > 0 ?
+                100.0*(float)topologyStats[i].second / (float)_branchingCollection->getNbItems() : 0
+            );
+        }
+    }
+
+    getInfo()->add (1, "time");
+    getInfo()->add (2, "build", "%.3f", status.time / 1000.0);
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.hpp b/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.hpp
new file mode 100644
index 0000000..b00ccdc
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/BranchingAlgorithm.hpp
@@ -0,0 +1,117 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BranchingAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Algorithm that computes the branching nodes of a De Bruijn graph
+ */
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_BRANCHING_ALGORITHM_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_BRANCHING_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Computation of the branching nodes of a Graph
+ *
+ * This class implements an algorithm that looks for branching nodes in the provided graph.
+ *
+ * A node N is branching <=> successors(N).size()!=1 || predecessors(N).size()!=1
+ *
+ * All found branching nodes are put into a storage object.
+ *
+ * Actually, this class is mainly used in the debruijn::impl::Graph class as a fourth step for
+ * the de Bruijn graph creation.
+ */
+template <size_t span=KMER_DEFAULT_SPAN, typename Node=Node_t<>, typename Edge=Edge_t<Node_t<> >, typename Graph_t=Graph>
+class BranchingAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::Type           Type;
+    typedef typename kmer::impl::Kmer<span>::Count          Count;
+
+    /** Constructor.
+     * \param[in] graph : graph from which we look for branching nodes
+     * \param[in] storage : storage where the found branching nodes will be put
+     * \param[in] kind : kind of branching algorithm
+     * \param[in] nb_cores : number of cores to be used; 0 means all available cores
+     * \param[in] options : extra options
+     */
+    BranchingAlgorithm (
+        const Graph_t& graph,
+        tools::storage::impl::Storage& storage,
+        tools::misc::BranchingKind  kind,
+        size_t                      nb_cores = 0,
+        tools::misc::IProperties*   options  = 0
+    );
+
+    /** Constructor.
+     * \param[in] storage : retrieve the branching nodes from this storage.
+     */
+    BranchingAlgorithm (tools::storage::impl::Storage& storage);
+
+    /** Destructor. */
+    ~BranchingAlgorithm ();
+
+    /** Get an option parser for branching parameters. Dynamic allocation, so must be released when no more used.
+     * \return an instance of IOptionsParser.
+     */
+    static tools::misc::IOptionsParser* getOptionsParser ();
+
+    /** \copydoc tools::misc::impl::Algorithm::execute */
+    void execute ();
+
+    /** Get the branching nodes as a collection of Count objects, ie couples of [kmer,abundance]
+     * \return the collection of Count object.
+     */
+    tools::collections::Collection<Count>* getBranchingCollection() { return _branchingCollection; }
+
+private:
+
+    const Graph_t* _graph;
+
+    tools::storage::impl::Storage& _storage;
+
+    tools::misc::BranchingKind  _kind;
+
+    tools::collections::Collection<Count>* _branchingCollection;
+    void setBranchingCollection (tools::collections::Collection<Count>* branchingCollection)  {  SP_SETATTR(branchingCollection); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_IMPL_BRANCHING_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/debruijn/impl/ContainerNode.hpp b/gatb-core/src/gatb/debruijn/impl/ContainerNode.hpp
new file mode 100644
index 0000000..a61a184
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/ContainerNode.hpp
@@ -0,0 +1,192 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ContainerNode.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Container implementation
+ */
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_CONTAINER_NODE_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_CONTAINER_NODE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/debruijn/api/IContainerNode.hpp>
+#include <cstdarg>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief IContainerNode implementation with a Bloom filter and a cFP set
+ *
+ *  In the GATB terminology, this object contains the information relative to the nodes of the dBG.
+ *  It is not a set of nodes, as we don't store nodes explicitly. 
+ *  Only one operation is supported:
+ *     contains()
+ *
+ *  In the ContainerNode implementation, this object is actually just the Bloom filter + the set of False positives.
+ */
+template <typename Item> class ContainerNode : public IContainerNode<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor
+     * \param[in] bloom : the Bloom filter.
+     * \param[in] falsePositives : the cFP container. */
+    ContainerNode (
+        tools::collections::Container<Item>* bloom,
+        tools::collections::Container<Item>* falsePositives
+	) : _bloom(0), _falsePositives(0)
+    {
+		setBloom(bloom);
+		setFalsePositives(falsePositives);
+    }
+
+	/** Destructor. */
+	~ContainerNode ()
+	{
+		setBloom(0);
+		setFalsePositives(0);
+	}
+
+    /** \copydoc IContainerNode::contains */
+    bool contains (const Item& item)  {  return (_bloom->contains(item) && !_falsePositives->contains(item));  }
+
+protected:
+
+    tools::collections::Container<Item>* _bloom;
+	void setBloom (tools::collections::Container<Item>* bloom)  { SP_SETATTR(bloom); }
+
+	tools::collections::Container<Item>* _falsePositives;
+	void setFalsePositives (tools::collections::Container<Item>* falsePositives)  { SP_SETATTR(falsePositives); }
+};
+
+/********************************************************************************/
+
+/** \brief IContainerNode implementation with a Bloom filter
+ *
+ * This implementation has no critical False Positive set, so it implies that
+ * Graph instances using it will have false positive nodes (old 'Titus' mode).
+ */
+template <typename Item> class ContainerNodeNoCFP : public ContainerNode<Item>
+{
+public:
+
+    /** Constructor
+     * \param[in] bloom : the Bloom filter. */
+    ContainerNodeNoCFP (tools::collections::Container<Item>* bloom) : ContainerNode<Item>(bloom, NULL) {}
+
+    /** \copydoc IContainerNode::contains */
+    bool contains (const Item& item)  {  return (this->_bloom)->contains(item);  }
+};
+
+/********************************************************************************/
+/** \brief IContainerNode implementation with cascading Bloom filters
+ *
+ * This implementation uses cascading Bloom filters for coding the cFP set.
+ */
+template <typename Item> class ContainerNodeCascading : public IContainerNode<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] bloom : the Bloom filter.
+     * \param[in] bloom2 : first Bloom filter of the cascading Bloom filters
+     * \param[in] bloom3 : second Bloom filter of the cascading Bloom filters
+     * \param[in] bloom4 : third Bloom filter of the cascading Bloom filters
+     * \param[in] falsePositives : false positives container
+     */
+    ContainerNodeCascading (
+        tools::collections::Container<Item>* bloom,
+        tools::collections::Container<Item>* bloom2,
+        tools::collections::Container<Item>* bloom3,
+        tools::collections::Container<Item>* bloom4,
+        tools::collections::Container<Item>* falsePositives
+	) : _bloom(0), _bloom2(0), _bloom3(0), _bloom4(0), _falsePositives(0), _cfpArray(4)
+    {
+		setBloom          (bloom);
+        setBloom2         (bloom2);
+		setBloom3         (bloom3);
+		setBloom4         (bloom4);
+		setFalsePositives (falsePositives);
+
+		_cfpArray[0] = bloom2;
+        _cfpArray[1] = bloom3;
+        _cfpArray[2] = bloom4;
+        _cfpArray[3] = falsePositives;
+    }
+
+	/** Destructor */
+	~ContainerNodeCascading ()
+	{
+        setBloom          (0);
+		setBloom2         (0);
+		setBloom3         (0);
+		setBloom4         (0);
+		setFalsePositives (0);
+	}
+
+    /** \copydoc IContainerNode::contains */
+    bool contains (const Item& item)  {  return (_bloom->contains(item) && ! containsCFP(item));  }
+
+private:
+
+    tools::collections::Container<Item>* _bloom;
+    void setBloom (tools::collections::Container<Item>* bloom)  { SP_SETATTR(bloom); }
+
+    tools::collections::Container<Item>* _bloom2;
+	void setBloom2 (tools::collections::Container<Item>* bloom2)  { SP_SETATTR(bloom2); }
+
+	tools::collections::Container<Item>* _bloom3;
+	void setBloom3 (tools::collections::Container<Item>* bloom3)  { SP_SETATTR(bloom3); }
+
+	tools::collections::Container<Item>* _bloom4;
+	void setBloom4 (tools::collections::Container<Item>* bloom4)  { SP_SETATTR(bloom4); }
+
+	tools::collections::Container<Item>* _falsePositives;
+	void setFalsePositives (tools::collections::Container<Item>* falsePositives)  { SP_SETATTR(falsePositives); }
+
+    std::vector<tools::collections::Container<Item>*> _cfpArray;
+
+    /** */
+    bool containsCFP (const Item& item)
+    {
+        if (_bloom2->contains(item))
+        {
+            if (!_bloom3->contains(item))
+                return true;
+
+            else if (_bloom4->contains(item) && !_falsePositives->contains(item))
+                return true;
+        }
+        return false;
+    }
+
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_IMPL_CONTAINER_NODE_HPP_ */
diff --git a/gatb-core/src/gatb/debruijn/impl/ExtremityInfo.hpp b/gatb-core/src/gatb/debruijn/impl/ExtremityInfo.hpp
new file mode 100644
index 0000000..edc983e
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/ExtremityInfo.hpp
@@ -0,0 +1,63 @@
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_EXTREMITY_INFO_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_EXTREMITY_INFO_HPP_
+ 
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+    enum Unitig_pos 
+    {
+        // cannot start at 0 because i'm using (pos & UNITIG_BEGIN) as a test in many places.
+        UNITIG_BEGIN = 1,
+        UNITIG_END = 2,
+        UNITIG_BOTH = 3, /* not encoded in ExtremityInfo, but encoded in NodeGU */
+        UNITIG_INSIDE = 4 /* not encoded in ExtremityInfo, but encoded in NodeGU */
+    };
+
+
+   
+// core unitigs graph part
+    // btw
+    // bit packing so dirty i'd need to call O2 to get it cleaned up
+    struct ExtremityInfo 
+    {
+        public:
+        uint64_t unitig;
+        bool rc; /* when encoding an extremity:
+                     whether the kmer in canonical form appears as rc in the unitig
+                    when encoding a link:
+                     whether you need to reverse the next unitig in the link
+                 */
+        Unitig_pos pos; // whether the kmer is at left extremity of unitig or right extremity
+        ExtremityInfo(uint64_t u, bool r, Unitig_pos p) : unitig(u),rc(r), pos(p) {}
+        ExtremityInfo() {} // because i defined another constructor
+        ExtremityInfo(const uint64_t val) { unpack(val); } 
+        std::string toString() const
+        { return " unitig: " + std::to_string(unitig) + " rc:" + std::to_string(rc) + " p:" + ((pos&UNITIG_BEGIN)?"UNITIG_BEGIN":"") + ((pos&UNITIG_END)?"UNITIG_END":"") ; }
+        uint64_t pack()
+        {
+            if ((int)pos > 2) { std::cout << "incorrect encoding for pos in packed ExtremityInfo: " << (int)pos << std::endl; exit(1); }
+            return (pos-1) + (rc << 1) + (unitig << 2);
+        }
+        uint64_t pack_norc() // possibly used in "merci.cpp"
+        {
+            return (pos-1) + ( 0 << 1) + (unitig << 2);
+        }
+        void unpack(uint64_t val)
+        {
+            
+            pos = (val&1)?UNITIG_END:UNITIG_BEGIN;
+                                   val >>= 1;
+            rc = val&1;            val >>= 1;
+            unitig = val;
+        }
+    } ;
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
+
diff --git a/gatb-core/src/gatb/debruijn/impl/Frontline.cpp b/gatb-core/src/gatb/debruijn/impl/Frontline.cpp
new file mode 100644
index 0000000..17151cb
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Frontline.cpp
@@ -0,0 +1,317 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+// We include required definitions
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Frontline.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+#define DEBUG(a)   //a
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+// a frontline is a set of nodes having equal depth in the BFS
+template <typename Node, typename Edge, typename Graph>
+FrontlineTemplate<Node,Edge,Graph>::FrontlineTemplate (
+    Direction         direction,
+    const Graph&      graph,
+    TerminatorTemplate<Node,Edge,Graph>&       terminator,
+    Node&       startingNode
+) :
+    _direction(direction), _graph(graph), _terminator(terminator), _depth(0),
+    _all_involved_extensions(0)
+{
+    _already_frontlined.insert (startingNode.kmer);
+
+    _frontline.push (NodeNt<Node>(startingNode, kmer::NUCL_UNKNOWN));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+// a frontline is a set of nodes having equal depth in the BFS
+template <typename Node, typename Edge, typename Graph>
+FrontlineTemplate<Node,Edge,Graph>::FrontlineTemplate (
+    Direction         direction,
+    const Graph&      graph,
+    TerminatorTemplate<Node,Edge,Graph>&       terminator,
+    Node&       startingNode,
+    Node&       previousNode,
+    std::set<Node>*   all_involved_extensions
+) :
+    _direction(direction), _graph(graph), _terminator(terminator), _depth(0),
+    _all_involved_extensions(all_involved_extensions)
+{
+    _already_frontlined.insert (startingNode.kmer);
+    _already_frontlined.insert (previousNode.kmer);
+
+    _frontline.push (NodeNt<Node>(startingNode, kmer::NUCL_UNKNOWN));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool FrontlineTemplate<Node,Edge,Graph>::go_next_depth()
+{
+    // extend all nodes in this frontline simultaneously, creating a new frontline
+    stopped_reason=NONE;
+    queue_nodes new_frontline;
+
+    while (!this->_frontline.empty())
+    {
+        /** We get the first item of the queue and remove it from the queue. */
+        NodeNt<Node> current_node = this->_frontline.front();
+        _frontline.pop();
+
+        /** We check whether we use this node or not. we always use the first node at depth 0 */
+        if (_depth > 0 && check(current_node.node) == false)  { return false; }
+
+        /** We loop the neighbors edges of the current node. */
+        GraphVector<Edge> edges = _graph.neighborsEdge (current_node.node, _direction);
+
+        for (size_t i=0; i<edges.size(); i++)
+        {
+            /** Shortcuts. */
+            Edge& edge     = edges[i];
+            Node& neighbor = edge.to;
+
+            // test if that node hasn't already been explored
+            if (_already_frontlined.find (neighbor.kmer) != _already_frontlined.end())  { continue; }
+
+            // if this bubble contains a marked (branching) kmer, stop everyone at once (to avoid redundancy)
+            //if (_terminator.isEnabled() && _terminator.is_branching (neighbor) &&  _terminator.is_marked_branching(neighbor))   // legacy, before MPHFTerminator
+            if (_terminator.isEnabled() && _terminator.is_marked(neighbor))   // to accomodate MPHFTerminator
+            {  
+                stopped_reason=FrontlineTemplate<Node,Edge,Graph>::MARKED;
+                return false;  
+            }
+
+            // propagate information where this node comes from
+            kmer::Nucleotide from_nt = (current_node.nt == kmer::NUCL_UNKNOWN) ? edge.nt : current_node.nt;
+
+            /** We add the new node to the new front line. */
+            new_frontline.push (NodeNt<Node> (neighbor, from_nt));
+
+            /** We memorize the new node. */
+            _already_frontlined.insert (neighbor.kmer);
+
+            // since this extension is validated, insert into the list of involved ones
+            if (_all_involved_extensions != 0)  {  _all_involved_extensions->insert (neighbor);  }
+        }
+    }
+
+    _frontline = new_frontline;
+    ++_depth;
+
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+FrontlineBranchingTemplate<Node,Edge,Graph>::FrontlineBranchingTemplate (
+    Direction         direction,
+    const Graph&      graph,
+    TerminatorTemplate<Node,Edge,Graph>&       terminator,
+    Node&       startingNode,
+    Node&       previousNode,
+    std::set<Node>*   all_involved_extensions
+)  : FrontlineTemplate<Node,Edge,Graph>(direction,graph,terminator,startingNode,previousNode,all_involved_extensions)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+FrontlineBranchingTemplate<Node,Edge,Graph>::FrontlineBranchingTemplate (
+    Direction         direction,
+    const Graph&      graph,
+    TerminatorTemplate<Node,Edge,Graph>&       terminator,
+    Node&       startingNode
+) : FrontlineTemplate<Node,Edge,Graph>(direction,graph,terminator,startingNode)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+// new code, not in monument, to detect any in-branching longer than 3k
+template <typename Node, typename Edge, typename Graph>
+bool FrontlineBranchingTemplate<Node,Edge,Graph>::check (Node& node)
+{
+	/** We reverse the node for the inbranching path. */
+    Node actual = this->_graph.reverse(node);
+
+    /** We loop the neighbors nodes of the current node. */
+    GraphVector<Node> neighbors = this->_graph.neighbors(actual, (this->_direction));
+
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Node& neighbor = neighbors[i];
+
+        // only check in-branching from kmers not already frontlined
+        // which, for the first extension, includes the previously traversed kmer (previous_kmer)
+        // btw due to avance() invariant, previous_kmer is always within a simple path
+        if (this->_already_frontlined.find (neighbor.kmer) != this->_already_frontlined.end())  {   continue;  }
+
+        // create a new frontline inside this frontline to check for large in-branching (i know, we need to go deeper, etc..)
+        FrontlineTemplate<Node,Edge,Graph> frontline (this->_direction, this->_graph, this->_terminator, neighbor, actual, this->_all_involved_extensions);
+
+        do  {
+            bool should_continue = frontline.go_next_depth();
+
+            if (!should_continue)  
+            {  
+                this->stopped_reason = FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_OTHER;
+                break;
+            }
+
+            // don't allow a depth > 3k
+            if (frontline.depth() > 3 * this->_graph.getKmerSize())  
+            {  
+                this->stopped_reason = FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_DEPTH;
+                break;
+            }
+
+            // don't allow a breadth too large
+            if (frontline.size() > 10)  
+            {  
+                this->stopped_reason = FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_BREADTH;
+                break;
+            }
+
+            // stopping condition: no more in-branching
+            if (frontline.size() == 0)  {  break;  }
+        }
+        while (1);
+
+        // found large in-branching
+        if (frontline.size() > 0)  {  return false;  }
+    }
+
+    // didn't find any in-branching
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+FrontlineReachableTemplate<Node,Edge,Graph>::FrontlineReachableTemplate(
+    Direction         direction,
+    const Graph&      graph,
+    TerminatorTemplate<Node,Edge,Graph>&       terminator,
+    Node&       startingNode,
+    Node&       previousNode,
+    std::set<Node>*   all_involved_extensions
+)  : FrontlineTemplate<Node,Edge,Graph> (direction,graph,terminator,startingNode,previousNode,all_involved_extensions)
+{
+}
+
+
+
+template <typename Node, typename Edge, typename Graph>
+bool FrontlineReachableTemplate<Node,Edge,Graph>::check (Node& node)
+{
+	/** We reverse the node for the inbranching path. */
+    Node actual = this->_graph.reverse(node);
+
+    /** neighbors nodes of the current node. */
+    GraphVector<Node> neighbors = this->_graph.neighbors(actual, (this->_direction));
+
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Node& neighbor = neighbors[i];
+        if (this->_already_frontlined.find (neighbor.kmer) == this->_already_frontlined.end())  {
+            checkLater.insert(neighbor);
+           //return false;   // strict
+        }
+    }
+    return true;
+}
+
+template <typename Node, typename Edge, typename Graph>
+bool FrontlineReachableTemplate<Node,Edge,Graph>::isReachable()
+{
+   for (typename std::set<Node>::iterator itNode = checkLater.begin(); itNode != checkLater.end(); itNode++)
+   {
+        if (this->_already_frontlined.find((*itNode).kmer) == this->_already_frontlined.end())
+            return false;
+
+   }
+   return true;
+}
+
+// legacy GATB compatbility
+template class FrontlineTemplate<Node, Edge, Graph>; 
+template class FrontlineBranchingTemplate<Node, Edge, Graph>; 
+template class FrontlineReachableTemplate<Node, Edge, Graph>; 
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/Frontline.hpp b/gatb-core/src/gatb/debruijn/impl/Frontline.hpp
new file mode 100644
index 0000000..8ec26c7
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Frontline.hpp
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_TOOLS_FRONTLINE_HPP_
+#define _GATB_TOOLS_FRONTLINE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <set>
+#include <queue>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+// types using in advanced traversal functions
+template <typename Node>
+struct NodeNt
+{
+    Node             node;
+    kmer::Nucleotide nt;
+
+    NodeNt (const Node& node, const kmer::Nucleotide& nt)  : node(node), nt(nt)  {}
+
+    bool operator< (const NodeNt &other) const
+    {
+        // need to define a strict weak ordering
+        if (node.kmer   != other.node.kmer)    {  return (node.kmer   < other.node.kmer);    }
+        if (node.strand != other.node.strand)  {  return (node.strand < other.node.strand);  }
+        return (nt < other.nt);
+    }
+};
+
+/********************************************************************************/
+
+// auxiliary class that is used by MonumentTraversal and deblooming
+template <typename Node, typename Edge, typename Graph>
+class FrontlineTemplate
+{
+public:
+
+    /** Constructor. */
+    FrontlineTemplate (
+        Direction         direction,
+        const Graph&      graph,
+        TerminatorTemplate<Node,Edge,Graph>&       terminator,
+        Node&       startingNode,
+        Node&       previousNode,
+        std::set<Node>*   all_involved_extensions = 0
+    );
+
+    /** Constructor. */
+    FrontlineTemplate (
+        Direction         direction,
+        const Graph&      graph,
+        TerminatorTemplate<Node,Edge,Graph>&       terminator,
+        Node&       startingNode
+    );
+
+    /** */
+    virtual ~FrontlineTemplate() {}
+
+    /** */
+    bool go_next_depth();
+
+    size_t size  () const  {  return _frontline.size();  }
+    size_t depth () const  {  return _depth;             }
+
+    NodeNt<Node> front () { return _frontline.front(); }
+
+    enum reason
+    {
+        NONE,
+        ALREADY_FRONTLINED,
+        IN_BRANCHING_DEPTH,
+        IN_BRANCHING_BREADTH,
+        IN_BRANCHING_OTHER,
+        MARKED
+    };
+    reason stopped_reason;
+
+protected:
+
+    virtual bool check (Node& node)  { return true; }
+
+    Direction _direction;
+
+    const Graph& _graph;
+
+    TerminatorTemplate<Node,Edge,Graph>&  _terminator;
+
+    typedef std::queue<NodeNt<Node> > queue_nodes;
+    queue_nodes _frontline;
+
+    int  _depth;
+
+    std::set<Node>* _all_involved_extensions;
+
+    std::set<typename Node::Value> _already_frontlined; // making it simpler now
+};
+
+/********************************************************************************/
+
+// auxiliary class that is used by MonumentTraversal and deblooming
+template <typename Node, typename Edge, typename Graph>
+class FrontlineBranchingTemplate : public FrontlineTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Constructor. */
+    FrontlineBranchingTemplate (
+        Direction         direction,
+        const Graph&      graph,
+        TerminatorTemplate<Node,Edge,Graph>&       terminator,
+        Node&       startingNode,
+        Node&       previousNode,
+        std::set<Node>*   all_involved_extensions
+    );
+
+    /** Constructor. */
+    FrontlineBranchingTemplate (
+        Direction         direction,
+        const Graph&      graph,
+        TerminatorTemplate<Node,Edge,Graph>&       terminator,
+        Node&       startingNode
+    );
+
+private:
+
+    bool check (Node& node);
+};
+
+// a middle ground between Frontline and FrontlineBranching:
+// check whether all nodes inside the frontline must be reachable from startingNode
+template <typename Node, typename Edge, typename Graph>
+class FrontlineReachableTemplate : public FrontlineTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Constructor. */
+    FrontlineReachableTemplate(
+        Direction         direction,
+        const Graph&      graph,
+        TerminatorTemplate<Node,Edge,Graph>&       terminator,
+        Node&       startingNode,
+        Node&       previousNode,
+        std::set<Node>*   all_involved_extensions
+    );
+
+    bool isReachable();
+
+private:
+
+    bool check (Node& node);
+    std::set<Node> checkLater;
+};
+
+typedef FrontlineTemplate<Node, Edge, Graph> Frontline; 
+typedef FrontlineReachableTemplate<Node, Edge, Graph> FrontlineReachable; 
+typedef FrontlineBranchingTemplate<Node, Edge, Graph> FrontlineBranching; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_TOOLS_FRONTLINE_HPP_ */
+
diff --git a/gatb-core/src/gatb/debruijn/impl/Graph.cpp b/gatb-core/src/gatb/debruijn/impl/Graph.cpp
new file mode 100644
index 0000000..79646a1
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Graph.cpp
@@ -0,0 +1,3913 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/BranchingAlgorithm.hpp>
+#include <gatb/debruijn/api/IContainerNode.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/api/IThread.hpp> // for ISynchronizer 
+
+#include <gatb/tools/collections/impl/ContainerSet.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/LibraryInfo.hpp>
+#include <gatb/tools/misc/impl/HostInfo.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/tools/misc/impl/Tool.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/kmer/impl/ConfigurationAlgorithm.hpp>
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithmFactory.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+#include <gatb/kmer/impl/CountProcessor.hpp>
+#include <gatb/kmer/impl/MPHFAlgorithm.hpp>
+#include <gatb/kmer/impl/RepartitionAlgorithm.hpp>
+
+#include <gatb/debruijn/impl/Simplifications.hpp>
+
+using namespace std;
+
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+#undef NDEBUG
+#include <cassert>
+
+#define DEBUG(a)  //a
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_GRAPHCPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_GRAPHCPP_
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+template<size_t span, typename Node_in>
+unsigned long getNodeIndex (const GraphData<span>& data, Node_in& node);
+
+/** These two functions set a specific value to the given GraphDataVariant object,
+ * according to the provided kmer size.
+ *
+ * This method should be called in each Graph constructor in order to be sure to have
+ * its data variant attribute set with the correct type.
+ *
+ * Many methods of the Graph class use the boost::static_visitor mechanism in order to
+ * retrieve the "correct" type pointed by the boost variant. So it is mandatory that
+ * each Graph instance has its data variant correctly set thanks to this "setVariant"
+ * function.
+ */
+template<size_t span> struct FunctorSetVariant
+{
+    // actually this doesn't seem to help
+    //template<typename GraphDataVariant>
+    void operator ()  (GraphDataVariant& data)  {  data = GraphData<span> ();  }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct setVariant_visitor : public boost::static_visitor<>    {
+    setVariant_visitor () {}
+
+    template<size_t span>  void operator() (GraphData<span>& data) const
+    {
+        data = GraphData<span>();
+    }
+};
+ 
+template<typename Node, typename Edge, typename GraphDataVariant_t>
+void GraphTemplate<Node, Edge, GraphDataVariant_t>::setVariant (void* data, size_t kmerSize, size_t integerPrecision)
+{
+	/** We may force the kmer size and not use the optimized KSIZE value. */
+	if (integerPrecision > 0)  { kmerSize = integerPrecision*32 - 1; }
+
+    if (typeid(GraphDataVariant_t) == typeid(GraphDataVariant))
+        Integer::apply<FunctorSetVariant,GraphDataVariant&> (kmerSize, (GraphDataVariant&)(*((GraphDataVariant*)data)));
+    else
+        // boost::apply_visitor (setVariant_visitor<Node, Edge, GraphDataVariant_t>(),  (GraphDataVariant_t&)data); // it is strange that this line doesn't work
+        boost::apply_visitor (setVariant_visitor<Node, Edge, GraphDataVariant_t>(),  *(GraphDataVariant_t*)data); // but this one does
+        //*((GraphDataVariant_t*)data) = (GraphDataVariant_t) (GraphData<32>()); // this one as well, but only for a single span
+}
+
+
+
+/********************************************************************************/
+
+template<size_t span>
+struct Count2TypeAdaptor  {  typename Kmer<span>::Type& operator() (typename Kmer<span>::Count& c)  { return c.value; }  };
+
+/* This visitor is used to configure a GraphDataVariant object (ie configure its attributes).
+ * The information source used to configure the variant is a kmer size and a storage.
+ *
+ * If the storage is null, only the kmer model is set.
+ *
+ * If the storage is not null, it is likely coming from a previous graph building (dsk, debloom, ...); we can
+ * therefore configure the variant with the items coming from this storage.
+ */
+template<typename Node, typename Edge, typename GraphDataVariant>
+template <size_t span>  
+void configure_visitor<Node,Edge,GraphDataVariant>::operator() (GraphData<span>& data) const 
+{
+    size_t   kmerSize = graph.getKmerSize();
+    
+    /** We create the kmer model. */
+    data.setModel (new typename Kmer<span>::ModelCanonical (kmerSize));
+
+    if (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_CONFIGURATION_DONE)
+    {
+        /** We get the configuration group in the storage. */
+        Group& configGroup = storage.getGroup("configuration");
+
+        /** We read the XML file and update the global info. */
+        stringstream ss; ss << configGroup.getProperty ("xml");
+
+        Properties props; props.readXML (ss);
+        graph.getInfo().add (1, props);
+    }
+
+    if (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE)
+    {
+        /** We get the dsk group in the storage. */
+        Group& dskGroup = storage.getGroup("dsk");
+
+        /** We set the iterable for the solid kmers. */
+        data.setSolid (& dskGroup.getPartition<typename Kmer<span>::Count> ("solid"));
+
+        /** We read the XML file and update the global info. */
+        stringstream ss; ss << dskGroup.getProperty ("xml");
+
+        Properties props; props.readXML (ss);
+        graph.getInfo().add (1, props);
+    }
+
+    if (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BLOOM_DONE)
+    {
+        /** We set the container. */
+        BloomAlgorithm<span> algo (storage);
+        graph.getInfo().add (1, algo.getInfo());
+    }
+
+    if (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_DEBLOOM_DONE)
+    {
+        /** We set the container. */
+        DebloomAlgorithm<span> algo (storage);
+        graph.getInfo().add (1, algo.getInfo());
+        data.setContainer (algo.getContainerNode());
+    }
+
+    if (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BRANCHING_DONE)
+    {
+        /** We set the branching container. */
+        BranchingAlgorithm<span, Node, Edge, GraphTemplate<Node, Edge, GraphDataVariant>> algo (storage);
+        graph.getInfo().add (1, algo.getInfo());
+        data.setBranching (algo.getBranchingCollection());
+    }
+
+    if ((graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE) &&  (graph.getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE))
+    {
+        typedef typename Kmer<span>::Count Count;
+        typedef typename Kmer<span>::Type  Type;
+
+        /** We get the dsk group in the storage. */
+        Group& dskGroup = storage.getGroup("dsk");
+
+        /** We get the iterable for the solid counts and solid kmers. */
+        Partition<Count>* solidCounts = & dskGroup.getPartition<Count> ("solid");
+        Iterable<Type>*   solidKmers  = new IterableAdaptor<Count,Type,Count2TypeAdaptor<span> > (*solidCounts);
+
+        MPHFAlgorithm<span> mphf_algo (
+                dskGroup,
+                "mphf",
+                solidCounts,
+                solidKmers,
+                1,  // loading using 1 thread
+                false  /* build=true, load=false */
+                );
+
+        data.setAbundance (mphf_algo.getAbundanceMap());
+        data.setNodeState (mphf_algo.getNodeStateMap());
+        data.setAdjacency (mphf_algo.getAdjacencyMap());
+    }
+}
+
+
+/* used in build_visitor and build_visitor_postsolid */
+/** Algorithm configuration. */
+template<typename Node, typename Edge, typename GraphDataVariant_t>
+void GraphTemplate<Node, Edge, GraphDataVariant_t>::
+executeAlgorithm (Algorithm& algorithm, Storage* storage, IProperties* props, IProperties& info) 
+{
+    algorithm.getInput()->add (0, STR_VERBOSE, props->getStr(STR_VERBOSE));
+
+    algorithm.run ();
+
+    info.add (1, algorithm.getInfo());
+    info.add (1, algorithm.getSystemInfo());
+
+    if (storage != 0)
+    {
+        /** We memorize information of the algorithm execution as a property of the corresponding group. */
+        storage->getGroup(algorithm.getName()).setProperty("xml", string("\n") + algorithm.getInfo()->getXML());
+    }
+}
+
+
+/********************************************************************************/
+
+/* These two visitors are used to build a graph. In particular, the data variant of the graph will
+ * be configured through this boost visitor.
+ *
+ * The skeleton of the graph building is the following:
+ *
+ *  build_visitor_solid:
+ *  - conversion of the input reads into a binary format
+ *  - kmers counting
+ *
+ *  build_visitor_postsolid
+ *  - mphf
+ *  - deblooming
+ *  - branching nodes computation
+ *
+ *  The common source for storing results for these different parts is a Storage instance, configured
+ *  at the beginning of this visitor. This common storage is then provided to the different parts.
+ *
+ *  The data variant itself is configured throughout the steps. After that, the graph has enough
+ *  knowledge to provide all the services of the Graph API. In particular, the branching nodes computation
+ *  is based on the Graph API methods, and is therefore executed after the data variant configuration.
+
+ */
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+template <size_t span>  
+void build_visitor_solid<Node,Edge,GraphDataVariant>::operator() (GraphData<span>& data) const 
+{
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Count Count;
+
+    LOCAL (bank);
+
+    // TODO Erwan: do we even use those variables? if not, why put them here? I feel that it's weak to parse cmdline arguments in build_visitor
+    // because graph._kmerSize is already defined at this point; and config._minim_size has minimizer size info. The rest we don't use.
+    size_t kmerSize      = props->get(STR_KMER_SIZE)          ? props->getInt(STR_KMER_SIZE)           : 31;
+    size_t compressLevel   = props->get(STR_COMPRESS_LEVEL)   ? props->getInt(STR_COMPRESS_LEVEL)      : 0;
+    bool   configOnly      = props->get(STR_CONFIG_ONLY) != 0;
+
+    string output = props->get(STR_URI_OUTPUT) ?
+        props->getStr(STR_URI_OUTPUT)   :
+        (props->getStr(STR_URI_OUTPUT_DIR) + "/" + system::impl::System::file().getBaseName (bank->getId()));
+
+    /* create output dir if it doesn't exist */
+    if(!System::file().doesExist(props->getStr(STR_URI_OUTPUT_DIR))){
+        int ok = System::file().mkdir(props->getStr(STR_URI_OUTPUT_DIR), 0755);
+        if(ok != 0){
+            throw system::Exception ("Error: can't create output directory");
+        }
+    }
+
+    DEBUG ((cout << "builGraph for bank '" << bank->getId() << "'"
+                << " kmerSize=" << kmerSize
+                << " nksMin=" << nksMin
+                << " output='" << output << "'"
+                << endl
+           ));
+
+    /** We create the kmer model. */
+    data.setModel (new typename Kmer<span>::ModelCanonical (kmerSize));
+
+    /** We add library and host information. */
+    graph.getInfo().add (1, & LibraryInfo::getInfo());
+    graph.getInfo().add (1, & HostInfo::getInfo());
+
+    /************************************************************/
+    /*                       Storage creation                   */
+    /************************************************************/
+
+    Storage* mainStorage = StorageFactory(graph._storageMode).create (output, true, false); /* second arg true = delete if exists; we're recreating this hdf5 file */
+
+    /** We create the storage object for the graph. */
+    graph.setStorage (mainStorage);
+
+    /** We may need a specific storage instance if we want to save the solid kmers in a separate file. */
+    Storage* solidStorage = 0;
+    if (props->get(STR_URI_SOLID_KMERS) != 0)
+    {
+        string solidsName = props->getStr(STR_URI_SOLID_KMERS);
+        /** Historically (by convention), the file was deleted if its name is "none".
+         * Now, since debloom may use the minimizer repartition function (stored in the solid file),
+         * we must not delete the solid file. */
+        bool autoDelete = false; // (solidsName == "none") || (solidsName == "null");
+        solidStorage = StorageFactory(graph._storageMode).create (solidsName, true, autoDelete);
+    }
+    else
+    {
+        solidStorage = graph._storage;
+    }
+    LOCAL (solidStorage);
+
+    /** We change the compression level for the storage.  Note that we need to do this before accessing the groups. */
+    mainStorage->root(). setCompressLevel (compressLevel);
+    solidStorage->root().setCompressLevel (compressLevel);
+
+    /** We get the minimizers hash group in the storage object. */
+    Group& minimizersGroup = (*mainStorage)("minimizers");
+
+    /** We get the 'dsk' group in the storage object. */
+    Group& dskGroup = (*solidStorage)("dsk");
+
+    /************************************************************/
+    /*                       Configuration                      */
+    /************************************************************/
+    DEBUG ((cout << "build_visitor : ConfigurationAlgorithm BEGIN\n"));
+
+    ConfigurationAlgorithm<span> configAlgo (bank, props);
+    configAlgo.getInput()->add (0, STR_STORAGE_TYPE, std::to_string(graph._storageMode) );
+    graph.executeAlgorithm (configAlgo, & graph.getStorage(), props, graph._info);
+    Configuration config = configAlgo.getConfiguration();
+    graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_CONFIGURATION_DONE);
+
+    /* remember configuration details (e.g. number of passes, partitions). useful for bcalm. */                                                                     
+    graph.getStorage().getGroup(configAlgo.getName()).setProperty("xml", string("\n") + configAlgo.getInfo()->getXML());        
+
+    DEBUG ((cout << "build_visitor : ConfigurationAlgorithm END\n"));
+
+    /** We may have to stop just after configuration. */
+    if (configOnly)  { return; }
+
+    /************************************************************/
+    /*                  Minimizers repartition                  */
+    /************************************************************/
+    DEBUG ((cout << "build_visitor : RepartitorAlgorithm BEGIN\n"));
+
+    RepartitorAlgorithm<span> repart (bank, 
+            minimizersGroup, 
+            config,
+            props->get(STR_NB_CORES)   ? props->getInt(STR_NB_CORES)   : 0
+            );
+    graph.executeAlgorithm (repart, 0, props, graph._info);
+
+    DEBUG ((cout << "build_visitor : RepartitorAlgorithm END\n"));
+
+    /************************************************************/
+    /*                         Sorting count                    */
+    /************************************************************/
+    DEBUG ((cout << "build_visitor : SortingCountAlgorithm BEGIN\n"));
+
+    /** We create a DSK instance and execute it. */
+    SortingCountAlgorithm<span> sortingCount (
+            bank,
+            config,
+            new Repartitor(minimizersGroup),
+            SortingCountAlgorithm<span>::getDefaultProcessorVector (config, props, solidStorage, mainStorage),
+            props
+            );
+
+    graph.executeAlgorithm (sortingCount, solidStorage, props, graph._info);
+    graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE);
+
+    Partition<Count>* solidCounts = & dskGroup.getPartition<Count> ("solid");
+
+    /** We configure the variant. */
+    data.setSolid (solidCounts);
+
+    /** We check that we got solid kmers. */
+    if (solidCounts->getNbItems() == 0)  {  throw system::Exception ("This dataset has no solid kmers"); }
+
+    DEBUG ((cout << "build_visitor : SortingCountAlgorithm END\n"));
+
+    /** We save the state and kmer size at storage root level. */
+    graph.getGroup().setProperty ("state",     Stringify::format("%d", graph._state));
+    graph.getGroup().setProperty ("kmer_size", Stringify::format("%d", graph._kmerSize));
+}
+
+
+/* now build the rest of the graph */
+template<typename Node, typename Edge, typename GraphDataVariant>
+template <size_t span>  
+void build_visitor_postsolid<Node,Edge,GraphDataVariant>::operator() (GraphData<span>& data) const 
+{
+    typedef typename Kmer<span>::Count Count;
+    typedef typename Kmer<span>::Type  Type;
+
+    /** We may have to stop just after configuration. */
+    if (props->get(STR_CONFIG_ONLY))  { return; }
+
+    if (!graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE))
+    {
+        throw system::Exception ("Graph construction failure during build_visitor_postsolid, the input _gatb/ folder (or .h5 file) needs to contain at least solid kmers");
+    }
+
+    size_t   kmerSize = graph.getKmerSize();
+
+    // todo: see remark in build_visitor_solid, we should be able to get that info from elsewhere
+    size_t minimizerSize = props->get(STR_MINIMIZER_SIZE)     ? props->getInt(STR_MINIMIZER_SIZE)      : 8;
+
+    /** We create the kmer model. */
+    data.setModel (new typename Kmer<span>::ModelCanonical (kmerSize));
+
+    /** We may need a specific storage instance if we want to save the solid kmers in a separate file. */
+    Storage* solidStorage = 0;
+    if (props->get(STR_URI_SOLID_KMERS) != 0)
+    {
+        string solidsName = props->getStr(STR_URI_SOLID_KMERS);
+        /** Historically (by convention), the file was deleted if its name is "none".
+         * Now, since debloom may use the minimizer repartition function (stored in the solid file),
+         * we must not delete the solid file. */
+        bool autoDelete = false; // (solidsName == "none") || (solidsName == "null");
+        solidStorage = StorageFactory(graph._storageMode).create (solidsName, false, autoDelete);
+    }
+    else
+    {
+        solidStorage = graph._storage;
+    }
+    LOCAL (solidStorage);
+
+    /************************************************************/
+    /*                         MPHF                             */
+    /* note: theoretically could be done in parallel to debloom, but both tasks may or may not be IO intensive */
+    /************************************************************/
+
+    Group& dskGroup = (*solidStorage)("dsk"); 
+    Partition<Count>* solidCounts = & dskGroup.getPartition<Count> ("solid");
+
+    /** We create an instance of the MPHF Algorithm class (why is that a class, and not a function?) and execute it. */
+    if ((!graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE)))
+    {
+        DEBUG ((cout << "build_visitor : MPHFAlgorithm BEGIN\n"));
+
+        /** We get the iterable for the solid counts and solid kmers. */
+        Iterable<Type>*   solidKmers  = new IterableAdaptor<Count,Type,Count2TypeAdaptor<span> > (*solidCounts);
+
+        MPHFAlgorithm<span> mphf_algo (
+                dskGroup,
+                "mphf",
+                solidCounts,
+                solidKmers,
+                props->get(STR_NB_CORES)   ? props->getInt(STR_NB_CORES)   : 0, 
+                // TODO enhancement: also pass the MAX_MEMORY parameter to enable or disable fast mode depending on it
+                true  /* build=true, load=false */
+
+                );
+        graph.executeAlgorithm (mphf_algo, & graph.getStorage(), props, graph._info);
+        data.setAbundance(mphf_algo.getAbundanceMap());
+        data.setNodeState(mphf_algo.getNodeStateMap());
+        data.setAdjacency(mphf_algo.getAdjacencyMap());
+        graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE);
+
+        DEBUG ((cout << "build_visitor : MPHFAlgorithm END\n"));
+    }
+
+    /************************************************************/
+    /*                         Bloom                            */
+    /************************************************************/
+    if (graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE) && !(graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BLOOM_DONE)))
+    {
+        DEBUG ((cout << "build_visitor : BloomAlgorithm BEGIN\n"));
+
+        if (graph._bloomKind != BLOOM_NONE)
+        {
+            BloomAlgorithm<span> bloomAlgo (
+                    graph.getStorage(),
+                    data._solid,
+                    kmerSize,
+                    DebloomAlgorithm<span>::getNbBitsPerKmer (kmerSize, graph._debloomKind),
+                    props->get(STR_NB_CORES)   ? props->getInt(STR_NB_CORES)   : 0,
+                    graph._bloomKind
+                    );
+            graph.executeAlgorithm (bloomAlgo, & graph.getStorage(), props, graph._info);
+            graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BLOOM_DONE);
+        }
+
+        DEBUG ((cout << "build_visitor : BloomAlgorithm END\n"));
+    }
+
+    /************************************************************/
+    /*                         Debloom                          */
+    /************************************************************/
+    if (graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BLOOM_DONE) && !(graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_DEBLOOM_DONE)))
+    {
+        DEBUG ((cout << "build_visitor : DebloomAlgorithm BEGIN\n"));
+
+        Group& minimizersGroup = (graph.getStorage())("minimizers");
+
+        /** We create a debloom instance and execute it. */
+        DebloomAlgorithm<span>* debloom = DebloomAlgorithmFactory<span>::create (
+                graph._debloomImpl,
+                (graph.getStorage())("bloom"),
+                (graph.getStorage())("debloom"),
+                data._solid,
+                kmerSize, minimizerSize,
+                props->get(STR_MAX_MEMORY) ? props->getInt(STR_MAX_MEMORY) : 0,
+                props->get(STR_NB_CORES)   ? props->getInt(STR_NB_CORES)   : 0,
+                graph._bloomKind,
+                graph._debloomKind,
+                "", 0,
+                &minimizersGroup
+                );
+        LOCAL (debloom);
+
+        graph.executeAlgorithm (*debloom, & graph.getStorage(), props, graph._info);
+
+        graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_DEBLOOM_DONE);
+
+        /** We configure the variant. */
+        data.setContainer (debloom->getContainerNode());
+
+        DEBUG ((cout << "build_visitor : DebloomAlgorithm END\n"));
+    }
+
+    /************************************************************/
+    /*                         Branching                        */
+    /************************************************************/
+    if (graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_DEBLOOM_DONE) && !(graph.checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BRANCHING_DONE)))
+    {
+        DEBUG ((cout << "build_visitor : BranchingAlgorithm BEGIN\n"));
+
+        if (graph._branchingKind != BRANCHING_NONE)
+        {
+            BranchingAlgorithm<span, Node, Edge, GraphTemplate<Node,Edge,GraphDataVariant> > branchingAlgo (
+                    graph,
+                    graph.getStorage(),
+                    graph._branchingKind,
+                    props->get(STR_NB_CORES)   ? props->getInt(STR_NB_CORES)   : 0,
+                    props
+                    );
+            graph.executeAlgorithm (branchingAlgo, & graph.getStorage(), props, graph._info);
+
+            graph.setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_BRANCHING_DONE);
+
+            /** We configure the variant. */
+            data.setBranching (branchingAlgo.getBranchingCollection());
+        }
+
+        DEBUG ((cout << "build_visitor : BranchingAlgorithm END\n"));
+
+    }
+
+
+    /************************************************************/
+    /*                    Post processing                       */
+    /************************************************************/
+
+    /** In case we choose another storage for the solid kmers, we have to update the graph state. */
+    if (props->get(STR_URI_SOLID_KMERS) != 0)
+    {
+        data.setSolid (0);
+        graph.unsetState (GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE);
+    }
+
+    /** We save library information in the root of the storage. */
+    graph.getGroup().setProperty ("xml", string("\n") + LibraryInfo::getInfo().getXML());
+
+
+    /** We save the state and kmer size at storage root level. */
+    graph.getGroup().setProperty ("state",     Stringify::format("%d", graph._state));
+    graph.getGroup().setProperty ("kmer_size", Stringify::format("%d", graph._kmerSize));
+
+    /************************************************************/
+    /*                        Clean up                          */
+    /************************************************************/
+}
+
+
+
+/********************************************************************************
+                 #####   ######      #     ######   #     #
+                #     #  #     #    # #    #     #  #     #
+                #        #     #   #   #   #     #  #     #
+                #  ####  ######   #     #  ######   #######
+                #     #  #   #    #######  #        #     #
+                #     #  #    #   #     #  #        #     #
+                 #####   #     #  #     #  #        #     #
+********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+IOptionsParser* GraphTemplate<Node, Edge, GraphDataVariant>::getOptionsParser (bool includeMandatory)
+{
+
+    /** We build the root options parser. */
+    OptionsParser* parser = new OptionsParser ("graph");
+
+    /** We add children parser to it (kmer count, bloom/debloom, branching). */
+    parser->push_back (SortingCountAlgorithm<>::getOptionsParser(includeMandatory));
+    parser->push_back (DebloomAlgorithm<>::getOptionsParser());
+    parser->push_back (BranchingAlgorithm<>::getOptionsParser());
+
+    /** We create a "general options" parser. */
+    IOptionsParser* parserGeneral  = new OptionsParser ("general");
+    parserGeneral->push_front (new OptionOneParam (STR_INTEGER_PRECISION, "integers precision (0 for optimized value)", false, "0", false));
+    parserGeneral->push_front (new OptionOneParam (STR_VERBOSE,           "verbosity level",      false, "1"  ));
+    parserGeneral->push_front (new OptionOneParam (STR_NB_CORES,          "number of cores",      false, "0"  ));
+    parserGeneral->push_front (new OptionNoParam  (STR_CONFIG_ONLY,       "dump config only"));
+    
+    parser->push_back  (parserGeneral);
+
+    OptionsParser* parserDebug = new OptionsParser ("debug ");
+
+    // those are only valid for GraphUnitigs, but GraphUnitigs doesn't have custom options (yet) so i'm adding here
+    parserDebug->push_front (new OptionNoParam  ("-skip-links",       "same, but       skip     links"));
+    parserDebug->push_front (new OptionNoParam  ("-redo-links",       "same, but       redo     links"));
+    parserDebug->push_front (new OptionNoParam  ("-skip-bglue",       "same, but       skip     bglue"));
+    parserDebug->push_front (new OptionNoParam  ("-redo-bglue",       "same, but       redo     bglue     "));
+    parserDebug->push_front (new OptionNoParam  ("-skip-bcalm",       "same, but       skip     bcalm"));
+    parserDebug->push_front (new OptionNoParam  ("-redo-bcalm",       "debug function, redo the bcalm algo"));
+
+    /** We add it to the root parser. */
+    parser->push_back  (parserDebug);
+
+    return parser;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>  GraphTemplate<Node, Edge, GraphDataVariant>::create (bank::IBank* bank, const char* fmt, ...)
+{
+    IOptionsParser* parser = getOptionsParser (false);   LOCAL(parser);
+
+    /** We build the command line from the format and the ellipsis. */
+    va_list args;
+    va_start (args, fmt);
+    std::string commandLine = Stringify::format(fmt, args);
+    va_end (args);
+
+    try
+    {
+        return  GraphTemplate(bank, parser->parseString(commandLine));
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+
+        throw system::Exception ("Graph construction failure because of bad parameters (notify a developer)");
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>  GraphTemplate<Node, Edge, GraphDataVariant>::create (const char* fmt, ...)
+{
+    IOptionsParser* parser = getOptionsParser (true);   LOCAL (parser);
+
+    /** We build the command line from the format and the ellipsis. */
+    va_list args;
+    va_start (args, fmt);
+    std::string commandLine = Stringify::format(fmt, args);
+    va_end (args);
+
+    try
+    {
+        return  GraphTemplate (parser->parseString(commandLine)); /* will call the GraphTemplate<Node, Edge, GraphDataVariant>::GraphTemplate (tools::misc::IProperties* params) constructor */
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+        throw system::Exception ("Graph construction failure because of bad parameters (notify a developer)");
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : 
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : load a graph from I don't know where. looks like dummy?
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant_t>
+GraphTemplate<Node, Edge, GraphDataVariant_t>::GraphTemplate (size_t kmerSize)
+    : _storageMode(PRODUCT_MODE_DEFAULT), _storage(0),
+      _variant(new GraphDataVariant_t()), _kmerSize(kmerSize), _info("graph"),
+      _state(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_INIT_DONE),
+      _bloomKind(BLOOM_DEFAULT), _debloomKind(DEBLOOM_DEFAULT), _debloomImpl(DEBLOOM_IMPL_DEFAULT),
+      _branchingKind(BRANCHING_STORED)
+{
+    /** We configure the data variant according to the provided kmer size. */
+    setVariant (_variant, _kmerSize);
+
+    /** We configure the graph data from the storage content. */
+    boost::apply_visitor (configure_visitor<Node, Edge, GraphDataVariant_t>(*this, getStorage()),  *(GraphDataVariant_t*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : loads a graph from a h5 file name or a _gatb/ folder
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant_t>
+GraphTemplate<Node, Edge, GraphDataVariant_t>::GraphTemplate (const std::string& uri)
+    : _storageMode(PRODUCT_MODE_DEFAULT), _storage(0),
+      _variant(new GraphDataVariant_t()), _kmerSize(0), _info("graph"), 
+      _name(System::file().getBaseName(uri))
+
+{
+    /** We create a storage instance. */
+    /* (this is actually loading, not creating, the storage at "uri") */
+    setStorage (StorageFactory(_storageMode).create (uri, false, false));
+
+    /** We get some properties. */
+    _state     = (GraphTemplate<Node, Edge, GraphDataVariant_t>::StateMask) atol (getGroup().getProperty ("state").c_str());
+    _kmerSize  =                    atol (getGroup().getProperty ("kmer_size").c_str());
+
+    /** We get library information in the root of the storage. */
+    string xmlString = getGroup().getProperty ("xml");
+    stringstream ss; ss << xmlString;   IProperties* props = new Properties(); LOCAL(props);
+    props->readXML (ss);  getInfo().add (1, props);
+
+    /** We configure the data variant according to the provided kmer size. */
+    setVariant (_variant, _kmerSize);
+
+    /** We configure the graph data from the storage content. */
+    boost::apply_visitor (configure_visitor<Node, Edge, GraphDataVariant_t>(*this, getStorage()),  *(GraphDataVariant_t*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : creates a graph from a bank
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>::GraphTemplate (bank::IBank* bank, tools::misc::IProperties* params)
+    : _storageMode(PRODUCT_MODE_DEFAULT), _storage(0),
+      _variant(new GraphDataVariant()), _kmerSize(0), _info("graph"),
+      _state(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_INIT_DONE)
+{
+    /** We get the kmer size from the user parameters. */
+    _kmerSize = params->getInt (STR_KMER_SIZE);
+
+    size_t integerPrecision = params->getInt (STR_INTEGER_PRECISION);
+
+    /** We get other user parameters. */
+    parse (params->getStr(STR_BLOOM_TYPE),        _bloomKind);
+    parse (params->getStr(STR_DEBLOOM_TYPE),      _debloomKind);
+    parse (params->getStr(STR_DEBLOOM_IMPL),      _debloomImpl);
+    parse (params->getStr(STR_BRANCHING_TYPE),    _branchingKind);
+
+    /** We configure the data variant according to the provided kmer size. */
+    setVariant (_variant, _kmerSize, integerPrecision);
+
+    /** We build the graph according to the wanted precision. */
+    boost::apply_visitor (build_visitor_solid<Node, Edge, GraphDataVariant>(*this, bank,params),  *(GraphDataVariant*)_variant);
+    boost::apply_visitor (build_visitor_postsolid<Node, Edge, GraphDataVariant>(*this, params),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : creates (or completes; new feature) a graph from parsed command line arguments.
+** INPUT   : a bank or a h5 file (new feature)
+** OUTPUT  :
+** RETURN  :
+** REMARKS : this code could also work for (and is more generic than) the function above, TODO refactor.
+            it is called from Graph::create (const char* fmt, ...)
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>::GraphTemplate (tools::misc::IProperties* params)
+    : _storageMode(PRODUCT_MODE_DEFAULT), _storage(0),
+      _variant(new GraphDataVariant()), _kmerSize(0), _info("graph"),
+      _state(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_INIT_DONE)
+{
+    /** We get the kmer size from the user parameters. */
+    _kmerSize = params->getInt (STR_KMER_SIZE);
+
+    size_t integerPrecision = params->getInt (STR_INTEGER_PRECISION);
+
+    /** We get other user parameters. */
+    parse (params->getStr(STR_BLOOM_TYPE),        _bloomKind);
+    parse (params->getStr(STR_DEBLOOM_TYPE),      _debloomKind);
+    parse (params->getStr(STR_DEBLOOM_IMPL),      _debloomImpl);
+    parse (params->getStr(STR_BRANCHING_TYPE),    _branchingKind);
+
+    /** We configure the data variant according to the provided kmer size. */
+    setVariant (_variant, _kmerSize, integerPrecision);
+
+    string input = params->getStr(STR_URI_INPUT);
+
+    bool load_from_hdf5 = (system::impl::System::file().getExtension(input) == "h5");
+    bool load_from_file = (system::impl::System::file().isFolderEndingWith(input,"_gatb"));
+    bool load_graph = (load_from_hdf5 || load_from_file);
+    if (load_graph)
+    {
+        /* it's not a bank, but rather a h5 file (kmercounted or more), let's complete it to a graph */
+        
+        cout << "Input is h5 or _gatb/ (we assume that kmer counting has already been done), we will complete it into a graph if necessary.\n"; 
+        
+        /** We create a storage instance. */
+        /* (this is actually loading, not creating, the storage at "uri") */
+        _storageMode = load_from_hdf5 ? STORAGE_HDF5 : STORAGE_FILE;
+        bool append = true; // special storagehdf5 which will open the hdf5 file as read&write
+        setStorage (StorageFactory(_storageMode).create (input, false, false, append));
+    
+        /** We get some properties. */
+        _state     = (typename GraphTemplate<Node, Edge, GraphDataVariant>::StateMask) atol (getGroup().getProperty ("state").c_str());
+        _kmerSize  =                    atol (getGroup().getProperty ("kmer_size").c_str());
+
+        // TODO: code a check that the dsk group exists and put those three lines in, else print an exception
+        if (_kmerSize == 0) /* try the dsk group; this assumes kmer counting is done */
+            _kmerSize  =    atol (getGroup("dsk").getProperty ("kmer_size").c_str());
+        // also assume kmer counting is done
+        setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_SORTING_COUNT_DONE);
+        
+        /** We get library information in the root of the storage. */
+        string xmlString = getGroup().getProperty ("xml");
+        stringstream ss; ss << xmlString;   IProperties* props = new Properties(); LOCAL(props);
+        props->readXML (ss);  getInfo().add (1, props);
+        
+        /** We configure the data variant according to the provided kmer size. */
+        setVariant (_variant, _kmerSize);
+
+        /* call the configure visitor to load everything (e.g. solid kmers, MPHF, etc..) that's been done so far */
+        boost::apply_visitor (configure_visitor<Node, Edge, GraphDataVariant>(*this, getStorage()),  *(GraphDataVariant*)_variant);
+
+        boost::apply_visitor (build_visitor_postsolid<Node, Edge, GraphDataVariant>(*this, params),  *(GraphDataVariant*)_variant);
+    }
+    else
+    {
+        /** We build a Bank instance for the provided reads uri. */
+        bank::IBank* bank = Bank::open (params->getStr(STR_URI_INPUT));
+
+        /** We build the graph according to the wanted precision. */
+        boost::apply_visitor (build_visitor_solid<Node, Edge, GraphDataVariant>(*this, bank,params),  *(GraphDataVariant*)_variant);
+        boost::apply_visitor (build_visitor_postsolid<Node, Edge, GraphDataVariant>(*this, params),  *(GraphDataVariant*)_variant);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>::GraphTemplate ()
+    : _storageMode(PRODUCT_MODE_DEFAULT), _storage(0),
+      _variant(new GraphDataVariant()), _kmerSize(0), _info("graph"),
+      _state(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_INIT_DONE),
+      _bloomKind(BLOOM_DEFAULT),
+      _debloomKind(DEBLOOM_DEFAULT), _debloomImpl(DEBLOOM_IMPL_DEFAULT), _branchingKind(BRANCHING_STORED)
+{
+    //std::cout << "empty graphtemplate constructor" << std::endl;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>::GraphTemplate (const GraphTemplate<Node, Edge, GraphDataVariant>& graph)
+    : _storageMode(graph._storageMode), _storage(0),
+      _variant(new GraphDataVariant()), _kmerSize(graph._kmerSize), _info("graph"), _name(graph._name), _state(graph._state)
+{
+    setStorage (graph._storage);
+
+    if (graph._variant)  {  *((GraphDataVariant*)_variant) = *((GraphDataVariant*)graph._variant);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>& GraphTemplate<Node, Edge, GraphDataVariant>::operator= (const GraphTemplate<Node, Edge, GraphDataVariant>& graph)
+{
+    if (this != &graph)
+    {
+        _kmerSize        = graph._kmerSize;
+        _storageMode     = graph._storageMode;
+        _name            = graph._name;
+        _info            = graph._info;
+        _bloomKind       = graph._bloomKind;
+        _debloomKind     = graph._debloomKind;
+        _debloomImpl     = graph._debloomImpl;
+        _branchingKind   = graph._branchingKind;
+        _state           = graph._state;
+
+        setStorage (graph._storage);
+
+        if (graph._variant)  {  *((GraphDataVariant*)_variant) = *((GraphDataVariant*)graph._variant);  }
+    }
+    return *this;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphTemplate<Node, Edge, GraphDataVariant>::~GraphTemplate<Node, Edge, GraphDataVariant> ()
+{
+    //std::cout <<"normal graph destructor called" << std::endl;
+    /** We release resources. */
+    setStorage (0);
+    if (_variant)  {  delete (GraphDataVariant*)_variant;  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::remove ()
+{
+    getStorage().remove();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : it's a bit of a misnomer, but in GATB language, Branching means "anything not simple". I.e. simple means outdegree=indegree=1 and branching is every other degree combination, including 0's
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::isBranching (Node& node) const
+{
+    size_t in, out;
+    degree(node, in, out); 
+    return (! (in==1 && out==1));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::isSimple (Edge& edge) const
+{
+    return this->outdegree(edge.from)==1  &&  this->indegree(edge.to)==1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+Node GraphTemplate<Node, Edge, GraphDataVariant>::reverse (const Node& node) const
+{
+    Node result = node;
+    result.strand = kmer::StrandReverse(node.strand);
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+BranchingNode_t<Node> GraphTemplate<Node, Edge, GraphDataVariant>::reverse (const BranchingNode_t<Node>& node) const
+{
+    BranchingNode_t<Node> result = node;
+    result.strand = kmer::StrandReverse(node.strand);
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+Edge GraphTemplate<Node, Edge, GraphDataVariant>::reverse (const Edge& edge) const
+{
+    Edge result;
+
+    Nucleotide NT = edge.nt;
+
+    if (edge.direction == DIR_INCOMING)
+    {
+        if (edge.from.strand == kmer::STRAND_FORWARD)  {  NT = (Nucleotide) edge.from.kmer[0];  }
+        else                                           {  NT = kmer::reverse ((Nucleotide) edge.from.kmer[getKmerSize()-1]);  }
+    }
+    else
+    {
+        if (edge.from.strand == STRAND_FORWARD)  {  NT = kmer::reverse ((Nucleotide) edge.from.kmer[getKmerSize()-1]);  }
+        else                                     {  NT = (Nucleotide) edge.from.kmer[0];                                }
+    }
+
+    result.set (
+        edge.to.kmer,   edge.to.strand,
+        edge.from.kmer, edge.from.strand,
+        NT,
+        edge.direction==DIR_OUTCOMING ? DIR_INCOMING : DIR_OUTCOMING
+    );
+
+    return result;
+}
+
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+size_t GraphTemplate<Node, Edge, GraphDataVariant>::indegree  (Node& node) const  {  return degree(node, DIR_INCOMING);   }
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+size_t GraphTemplate<Node, Edge, GraphDataVariant>::outdegree (Node& node) const  {  return degree(node, DIR_OUTCOMING);  }
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+size_t GraphTemplate<Node, Edge, GraphDataVariant>::degree (Node& node, Direction dir) const  {  return countNeighbors(node, dir);  } // used to be getNodes(node,dir).size() but made it faster
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::degree (Node& node, size_t &in, size_t &out) const  {  countNeighbors(node, in, out);  } 
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename Item, typename Functor, typename GraphDataVariant>
+struct getItems_visitor : public boost::static_visitor<GraphVector<Item> >    {
+
+    Node& source;  Direction direction;  Functor fct; 
+    bool hasAdjacency;
+
+    getItems_visitor (Node& aSource, Direction aDirection, bool hasAdjacency, Functor aFct) : source(aSource), direction(aDirection), fct(aFct), hasAdjacency(hasAdjacency) {}
+
+    template<size_t span>  GraphVector<Item> operator() (const GraphData<span>& data) const
+    {
+
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        GraphVector<Item> items;
+        GraphVector<Item> itemsAdj;
+
+        size_t idx = 0;
+        size_t idxAdj = 0;
+
+        /** We get the specific typed value from the generic typed value. */
+        Type sourceVal = source.template getKmer<Type>();
+
+        /** Shortcuts. */
+        size_t      kmerSize = data._model->getKmerSize();
+        const Type& mask     = data._model->getKmerMax();
+
+        /* the kmer we're extending may be actually a revcomp sequence in the bidirected debruijn graph node */
+        Type graine = ((source.strand == STRAND_FORWARD) ?  sourceVal :  revcomp (sourceVal, kmerSize) );
+        /* TODO opt: in some cases we may skip computing graine, e.g. whenever there are no neighbors */
+
+        bool debug = false;
+        /* use adjacency information when available, because it's faster than bloom */
+        if (hasAdjacency)
+        {
+            unsigned long hashIndex = getNodeIndex<span>(data, source);
+			if(hashIndex == ULLONG_MAX) return itemsAdj;
+
+            unsigned char &value = (*(data._adjacency)).at(hashIndex);
+
+            bool forwardStrand = (source.strand == STRAND_FORWARD);
+
+            unsigned char bitmask;
+         
+ 
+            if (direction & DIR_OUTCOMING)
+            {
+                if (forwardStrand)
+                    bitmask = value & 0xF;
+                else
+                {
+                    bitmask = (value >> 4) & 0xF;
+
+                    /* also revcomp the nt's: instead of GTCA (high bits to low), make it CAGT */
+                    bitmask = ((bitmask & 3) << 2) | ((bitmask >> 2) & 3);
+                }
+
+                //std::cout << "getItems OUTCOMING: forward strand?" << forwardStrand << "; adjacency value: " << to_string((int)value) << " hashindex " << hashIndex << " dir " << direction << " bitmask " << (int)bitmask << std::endl;
+           
+                for (u_int64_t nt=0; nt<4; nt++)
+                {
+                    if (bitmask & (1 << nt))
+                    {
+                        typename Node::Value dest_value;
+                        Strand dest_strand = STRAND_FORWARD;
+                        Nucleotide dest_nt = (Nucleotide)nt;
+                        Type forward, reverse;
+                        Type single_nt; single_nt.setVal(nt);
+
+                        forward = ( (graine << 2 )  + single_nt ) & mask; /* for speedup's, there is much we could precompute here */
+                        reverse = revcomp (forward, kmerSize);
+
+                        if (forward < reverse)
+                            dest_value = forward;
+                        else
+                        {
+                            dest_value = reverse;
+                            dest_strand = STRAND_REVCOMP;
+                        }
+
+                        if (debug) std::cout << "adj, found OUT " << (dest_strand==STRAND_REVCOMP ? "REV" : "FWD") << " nt=" << nt << std::endl;
+                        fct (itemsAdj, idxAdj++, source.kmer, source.strand, dest_value, dest_strand, dest_nt, DIR_OUTCOMING);
+                    }
+                }
+            }
+
+            if (direction & DIR_INCOMING)
+            {
+                if (forwardStrand)
+                    bitmask = (value >> 4) & 0xF;
+                else
+                {
+                    bitmask = value & 0xF;
+
+                    /* also revcomp the nt's: instead of GTCA (high bits to low), make it CAGT */
+                    bitmask = ((bitmask & 3) << 2) | ((bitmask >> 2) & 3);
+                }
+
+                //std::cout << "getItems INCOMING: forward strand?" << forwardStrand << "; adjacency value: " << to_string((int)value) << " hashindex " << hashIndex << " dir " << direction << " bitmask " << (int)bitmask << std::endl;
+
+                /** IMPORTANT !!! Since we have hugely shift the nt value, we make sure to use a long enough integer. */
+                for (u_int64_t nt=0; nt<4; nt++)
+                {
+
+                    if (bitmask & (1 << nt))
+                    {
+                        typename Node::Value dest_value;
+                        Strand dest_strand = STRAND_FORWARD;
+                        Nucleotide dest_nt = (Nucleotide)nt;
+                        Type forward, reverse;
+                        Type single_nt; single_nt.setVal(nt);
+
+                        forward = ( (graine >> 2 )  + ( single_nt << ((kmerSize-1)*2)) ) & mask; /* previous kmer */
+                        reverse = revcomp (forward, kmerSize);
+
+                        if (forward < reverse)
+                            dest_value = forward;
+                        else
+                        {
+                            dest_value = reverse;
+                            dest_strand = STRAND_REVCOMP;
+                        }
+
+                        if (debug) std::cout << "adj, found INC " << (dest_strand==STRAND_REVCOMP ? "REV" : "FWD") << " nt=" << nt << std::endl;
+                        fct (itemsAdj, idxAdj++, source.kmer, source.strand, dest_value, dest_strand, dest_nt, DIR_INCOMING);
+                    }
+                }
+            }
+
+            /** We update the size of the container according to the number of found items. */
+            itemsAdj.resize (idxAdj);
+
+            /** We return the result. */
+            return itemsAdj;
+        }
+
+        /* else, run classical neighbor queries using the data.contains() operation (bloom filters behind the scenes) */
+
+        if (direction & DIR_OUTCOMING)
+        {
+            for (u_int64_t nt=0; nt<4; nt++)
+            {
+                typename Node::Value dest_value;
+                Type forward = ( (graine << 2 )  + nt) & mask;
+                Type reverse = revcomp (forward, kmerSize);
+
+                if (forward < reverse)
+                {
+                    if (data.contains (forward))
+                    {
+                        dest_value = forward;
+                        if (debug) std::cout << "kmer  "<< sourceVal << " found OUT FWD nt=" << nt << std::endl;
+                        fct (items, idx++, source.kmer, source.strand, dest_value, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING);
+                    }
+                }
+                else
+                {
+                    if (data.contains (reverse))
+                    {
+                        dest_value = reverse;
+                        if (debug) std::cout << "found OUT REV nt=" << nt << std::endl;
+                        fct (items, idx++, source.kmer, source.strand, dest_value, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING);
+                    }
+                }
+            }
+        }
+
+        if (direction & DIR_INCOMING)
+        {
+            /** IMPORTANT !!! Since we have hugely shift the nt value, we make sure to use a long enough integer. */
+            for (u_int64_t nt=0; nt<4; nt++)
+            {
+                Type single_nt;
+                single_nt.setVal(nt);
+                single_nt <<=  ((kmerSize-1)*2);
+                typename Node::Value dest_value;
+                Type forward = ((graine >> 2 )  + single_nt ) & mask; /* previous kmer */
+                Type reverse = revcomp (forward, kmerSize);
+
+                if (forward < reverse)
+                {
+                    if (data.contains (forward))
+                    {
+                        dest_value = forward;
+                        if (debug) std::cout << "found INC FWD nt=" << nt << std::endl;
+                        // It used to be that "nt" was source[0] (in forward strand) and reverse(source[k-1]) in reverse, but i think it was wrong, so i changed it. TODO: delete this line if neighbors(..,DIR_INCOMING) causes no trouble for anyone, as it is now.
+                        fct (items, idx++, source.kmer, source.strand, dest_value, STRAND_FORWARD, (Nucleotide)nt, DIR_INCOMING);
+                    }
+                }
+                else
+                {
+                    if (data.contains (reverse))
+                    {
+                        dest_value = reverse;
+                        if (debug) std::cout << "found INC REV nt=" << nt << std::endl;
+                        fct (items, idx++, source.kmer, source.strand, dest_value, STRAND_REVCOMP, (Nucleotide)nt, DIR_INCOMING);
+                    }
+                }
+            }
+        }
+
+        /** We update the size of the container according to the number of found items. */
+        items.resize (idx);
+
+        /** We return the result. */
+        return items;
+    }
+};
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct Functor_getEdges {   void operator() (
+    GraphVector<Edge>& items,
+    size_t               idx,
+    const typename Node::Value&   kmer_from,
+    kmer::Strand         strand_from,
+    const typename Node::Value&   kmer_to,
+    kmer::Strand         strand_to,
+    kmer::Nucleotide     nt,
+    Direction            dir
+) const
+{
+    items[idx++].set (kmer_from, strand_from, kmer_to, strand_to, nt, dir);
+}};
+
+/* TODO: so in principle, when Node is a NodeFast, we should be able to call the getItems_visitor 
+ * operator directly, without apply_visitor (which seems to be expensive in the minia profiling using valgrind) 
+ * but this seems tricky to code, so I gave up quickly */
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<Edge> GraphTemplate<Node, Edge, GraphDataVariant>::getEdges (Node source, Direction direction)  const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    return boost::apply_visitor (getItems_visitor<Node, Edge, Edge, Functor_getEdges<Node, Edge, GraphDataVariant>, GraphDataVariant>(source, direction, hasAdjacency, Functor_getEdges<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+}
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct Functor_getNodes {  void operator() (
+    GraphVector<Node>&   items,
+    size_t               idx,
+    const typename Node::Value&   kmer_from,
+    kmer::Strand         strand_from,
+    const typename Node::Value&   kmer_to,
+    kmer::Strand         strand_to,
+    kmer::Nucleotide     nt,
+    Direction            dir
+) const
+{
+    items[idx++].set (kmer_to, strand_to);
+}};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<Node> GraphTemplate<Node, Edge, GraphDataVariant>::getNodes (Node &source, Direction direction)  const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    return boost::apply_visitor (getItems_visitor<Node, Edge, Node, Functor_getNodes<Node, Edge, GraphDataVariant>, GraphDataVariant >(source, direction, hasAdjacency, Functor_getNodes<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : simple version of getITems above, just for counting number of neighbors. sorry for code duplication, I didn't want to use more functors (yet)
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct countNeighbors_visitor : public boost::static_visitor<void>    {
+
+    Node& source;  Direction direction;
+    bool hasAdjacency;
+    size_t &indegree;
+    size_t &outdegree;
+
+    countNeighbors_visitor (Node& aSource, Direction aDirection, bool hasAdjacency, size_t& indegree, size_t& outdegree) : source(aSource), direction(aDirection), hasAdjacency(hasAdjacency),
+    indegree(indegree), outdegree(outdegree) {}
+
+    template<size_t span>  void operator() (const GraphData<span>& data) const
+    {
+
+        indegree = 0; outdegree = 0;
+
+        //static int bitmask2nbneighbors[16] = { 
+        
+        /* use adjacency information when available, because it's faster than bloom */
+        if (hasAdjacency)
+        {
+            unsigned long hashIndex = getNodeIndex<span>(data, source);
+			if(hashIndex == ULLONG_MAX) return; // node was not found in the mphf 
+
+            unsigned char &value = (*(data._adjacency)).at(hashIndex);
+
+            bool forwardStrand = (source.strand == STRAND_FORWARD);
+
+            unsigned char bitmask;
+             
+            if (forwardStrand)
+                bitmask = value & 0xF;
+            else
+                bitmask = (value >> 4) & 0xF;
+
+            outdegree = __builtin_popcount(bitmask);
+
+            indegree = __builtin_popcount(value) - outdegree;
+
+            return;
+        }
+
+        /* else, run classical neighbor queries using the data.contains() operation (bloom filters behind the scenes) */
+
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        /** We get the specific typed value from the generic typed value. */
+        Type sourceVal = source.template getKmer<Type>();
+
+        /** Shortcuts. */
+        size_t      kmerSize = data._model->getKmerSize();
+        const Type& mask     = data._model->getKmerMax();
+
+
+        /* the kmer we're extending may be actually a revcomp sequence in the bidirected debruijn graph node */
+        Type graine = ((source.strand == STRAND_FORWARD) ?  sourceVal :  revcomp (sourceVal, kmerSize) );
+        /* TODO opt: in some cases we may skip computing graine, e.g. whenever there are no neighbors */
+
+
+        if (direction & DIR_OUTCOMING)
+        {
+            for (u_int64_t nt=0; nt<4; nt++)
+            {
+                Type forward = ( (graine << 2 )  + nt) & mask;
+                Type reverse = revcomp (forward, kmerSize);
+
+                if (forward < reverse)
+                {
+                    if (data.contains (forward))
+                    {
+                        outdegree++;
+                    }
+                }
+                else
+                {
+                    if (data.contains (reverse))
+                    {
+                        outdegree++;
+                    }
+                }
+            }
+        }
+
+        if (direction & DIR_INCOMING)
+        {
+            /** IMPORTANT !!! Since we have hugely shift the nt value, we make sure to use a long enough integer. */
+            for (u_int64_t nt=0; nt<4; nt++)
+            {
+                Type single_nt;
+                single_nt.setVal(nt);
+                single_nt <<=  ((kmerSize-1)*2);
+                Type forward = ((graine >> 2 )  + single_nt ) & mask; /* previous kmer */
+                Type reverse = revcomp (forward, kmerSize);
+
+                if (forward < reverse)
+                {
+                    if (data.contains (forward))
+                    {
+                        indegree++;
+                    }
+                }
+                else
+                {
+                    if (data.contains (reverse))
+                    {
+                        indegree++;
+                    }
+                }
+            }
+        }
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+unsigned char GraphTemplate<Node, Edge, GraphDataVariant>::countNeighbors (Node &source, Direction direction)  const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    size_t in, out;
+    boost::apply_visitor (countNeighbors_visitor<Node, Edge, GraphDataVariant >(source, direction, hasAdjacency, in, out),  *(GraphDataVariant*)_variant);
+    size_t res = 0;
+    if (direction & DIR_INCOMING) res += in;
+    if (direction & DIR_OUTCOMING) res += out;
+    return res;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::countNeighbors (Node &source, size_t &in, size_t &out)  const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    boost::apply_visitor (countNeighbors_visitor<Node, Edge, GraphDataVariant >(source, DIR_END, hasAdjacency, in, out),  *(GraphDataVariant*)_variant);
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : Why is'nt this code using getItems? ah, I guess, because there's a common functor called for both nodes neighbors at the same time. strange.
+*********************************************************************/
+template<typename Node, typename Edge, typename Item, typename Functor, typename GraphDataVariant>
+struct getItemsCouple_visitor : public boost::static_visitor<GraphVector<pair<Item,Item> > >    {
+
+    const Node& node1; const Node& node2;  Direction direction; Functor functor;
+
+    getItemsCouple_visitor (const Node& node1, const Node& node2, Direction aDirection, Functor aFct)
+        : node1(node1), node2(node2),  direction(aDirection), functor(aFct) {}
+
+    template<size_t span>  GraphVector<pair<Item,Item> > operator() (const GraphData<span>& data) const
+    {
+        typedef typename Kmer<span>::Type  Type;
+
+        size_t idx = 0;
+        GraphVector < pair<Item,Item> > items;
+
+        /** Shortcuts. */
+        size_t      kmerSize = data._model->getKmerSize();
+        const Type& mask     = data._model->getKmerMax();
+
+        /** We get the specific typed value from the generic typed value. */
+        const Type& val1 = node1.template getKmer<Type>();
+        const Type& val2 = node2.template getKmer<Type>();
+
+        /* the kmer we're extending may be actually a revcomp sequence in the bidirected debruijn graph node */
+        Type graine1 = ((node1.strand == STRAND_FORWARD) ?  val1 :  revcomp (val1, kmerSize) );
+        Type graine2 = ((node2.strand == STRAND_FORWARD) ?  val2 :  revcomp (val2, kmerSize) );
+
+        if (direction & DIR_OUTCOMING)
+        {
+            for (u_int64_t nt=0; nt<4; nt++)
+            {
+                Type forward1 = ( (graine1 << 2 )  + nt) & mask;
+                Type forward2 = ( (graine2 << 2 )  + nt) & mask;
+
+                Type reverse1 = revcomp (forward1, kmerSize);
+                Type reverse2 = revcomp (forward2, kmerSize);
+
+                bool isForwardMin1 = forward1 < reverse1;
+                bool isForwardMin2 = forward2 < reverse2;
+
+                if (isForwardMin1==true && isForwardMin2==true)
+                {
+                    if (data.contains (forward1) && data.contains (forward2))
+                    {
+                        pair<Item,Item>& p = items[idx++];
+                        typename Node::Value dest_value1, dest_value2;
+                        dest_value1 = forward1; dest_value2 = forward2;
+                        functor (p,
+                            node1.kmer, node1.strand, dest_value1, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING,
+                            node2.kmer, node2.strand, dest_value2, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING
+                        );
+                    }
+                }
+                else if (isForwardMin1==true && isForwardMin2==false)
+                {
+                    if (data.contains (forward1) && data.contains (reverse2))
+                    {
+                        pair<Item,Item>& p = items[idx++];
+                        typename Node::Value dest_value1, dest_value2;
+                        dest_value1 = forward1; dest_value2 = reverse2;
+                        functor (p,
+                            node1.kmer, node1.strand, dest_value1, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING,
+                            node2.kmer, node2.strand, dest_value2, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING
+                        );
+                    }
+                }
+                else if (isForwardMin1==false && isForwardMin2==true)
+                {
+                    if (data.contains (reverse1) && data.contains (forward2))
+                    {
+                        pair<Item,Item>& p = items[idx++];
+                        typename Node::Value dest_value1, dest_value2;
+                        dest_value1 = reverse1; dest_value2 = forward2;
+                        functor (p,
+                            node1.kmer, node1.strand, dest_value1, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING,
+                            node2.kmer, node2.strand, dest_value2, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING
+                        );
+                    }
+                }
+                else if (isForwardMin1==false && isForwardMin2==false)
+                {
+                    if (data.contains (reverse1) && data.contains (reverse2))
+                    {
+                        pair<Item,Item>& p = items[idx++];
+                        typename Node::Value dest_value1, dest_value2;
+                        dest_value1 = reverse1; dest_value2 = reverse2;
+                        functor (p,
+                            node1.kmer, node1.strand, dest_value1, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING,
+                            node2.kmer, node2.strand, dest_value2, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING
+                        );
+                    }
+                }
+            }
+        }
+
+        if (direction & DIR_INCOMING)
+        {
+            throw system::ExceptionNotImplemented();
+        }
+
+        /** We update the size of the container according to the number of found items. */
+        items.resize (idx);
+
+        /** We return the result. */
+        return items;
+    }
+};
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct Functor_getNodesCouple {  void operator() (
+    pair<Node,Node>&   items,
+    const typename Node::Value&   kmer_from1,
+    kmer::Strand         strand_from1,
+    const typename Node::Value&   kmer_to1,
+    kmer::Strand         strand_to1,
+    kmer::Nucleotide     nt1,
+    Direction            dir1,
+    const typename Node::Value&   kmer_from2,
+    kmer::Strand         strand_from2,
+    const typename Node::Value&   kmer_to2,
+    kmer::Strand         strand_to2,
+    kmer::Nucleotide     nt2,
+    Direction            dir2
+) const
+{
+    items.first.set  (kmer_to1, strand_to1);
+    items.second.set (kmer_to2, strand_to2);
+}};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<std::pair<Node,Node> > GraphTemplate<Node, Edge, GraphDataVariant>::getNodesCouple (const Node& node1, const Node& node2, Direction direction) const
+{
+    return boost::apply_visitor (getItemsCouple_visitor<Node, Edge, Node, Functor_getNodesCouple<Node, Edge, GraphDataVariant>, GraphDataVariant>(node1, node2, direction, Functor_getNodesCouple<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+}
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct Functor_getEdgesCouple {  void operator() (
+        pair<Edge,Edge>&     items,
+        const typename Node::Value&   kmer_from1,
+        kmer::Strand         strand_from1,
+        const typename Node::Value&   kmer_to1,
+        kmer::Strand         strand_to1,
+        kmer::Nucleotide     nt1,
+        Direction            dir1,
+        const typename Node::Value&   kmer_from2,
+        kmer::Strand         strand_from2,
+        const typename Node::Value&   kmer_to2,
+        kmer::Strand         strand_to2,
+        kmer::Nucleotide     nt2,
+        Direction            dir2
+) const
+{
+    items.first.set  (kmer_from1, strand_from1, kmer_to1, strand_to1, nt1, dir1);
+    items.second.set (kmer_from2, strand_from2, kmer_to2, strand_to2, nt2, dir2);
+}};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<std::pair<Edge,Edge> > GraphTemplate<Node, Edge, GraphDataVariant>::getEdgesCouple (const Node& node1, const Node& node2, Direction direction) const
+{
+    return boost::apply_visitor (getItemsCouple_visitor<Node, Edge, Edge, Functor_getEdgesCouple<Node, Edge, GraphDataVariant>, GraphDataVariant >(node1, node2, direction, Functor_getEdgesCouple<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct buildNode_visitor : public boost::static_visitor<Node>    {
+
+    const tools::misc::Data& data;  size_t offset;
+
+    buildNode_visitor (const tools::misc::Data& aData, size_t aOffset) : data(aData), offset(aOffset)  {}
+
+    template<size_t span>  Node operator() (const GraphData<span>& graphData) const
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::ModelCanonical::Kmer Kmer;
+
+        Kmer kmer = graphData._model->getKmer(data, offset);
+        
+        typename Node::Value dest_value;
+        dest_value = kmer.value();
+        return Node (dest_value, kmer.forward()==kmer.value() ? STRAND_FORWARD : STRAND_REVCOMP);
+    }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+Node GraphTemplate<Node, Edge, GraphDataVariant>::buildNode (const tools::misc::Data& data, size_t offset)  const
+{
+    return boost::apply_visitor (buildNode_visitor<Node, Edge, GraphDataVariant>(data,offset),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+Node GraphTemplate<Node, Edge, GraphDataVariant>::buildNode (const char* sequence)  const
+{
+    Data data ((char*)sequence);
+
+    return boost::apply_visitor (buildNode_visitor<Node, Edge, GraphDataVariant>(data,0),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<BranchingNode_t<Node> > GraphTemplate<Node, Edge, GraphDataVariant>::getBranchingNodeNeighbors (Node& source, Direction direction) const
+{
+    GraphVector<BranchingNode_t<Node> >  result;
+
+    /** We get the neighbors of the source node. */
+    GraphVector<Edge> neighbors = this->neighborsEdge (source, direction);
+
+    /** We resize the result vector. */
+    result.resize (neighbors.size());
+
+    /** We loop over all the neighbors. */
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** We get a simple path iterator from the current neighbor. */
+        GraphIterator<Edge> path = this->simplePathEdge (neighbors[i].to, direction);
+
+        /** We iterate this simple path from the current neighbor. */
+        for (path.first(); !path.isDone(); path.next())  {}
+
+        /** Note the trick here: we get the current path node, even if the path iteration is done. */
+        Node& last = path.item().to;
+
+        /** We set the ith branching neighbor node. */
+        result[i].set (last.kmer, last.strand);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<BranchingEdge_t<Node,Edge> > GraphTemplate<Node, Edge, GraphDataVariant>::getBranchingEdgeNeighbors (Node& source, Direction direction) const
+{
+    GraphVector<BranchingEdge_t<Node,Edge> >  result;
+
+    /** We get the neighbors of the source node. */
+    GraphVector<Edge> neighbors = this->neighborsEdge (source, direction);
+
+    /** We resize the result vector. */
+    result.resize (neighbors.size());
+
+    /** We loop over all the neighbors. */
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        DEBUG ((cout << "neighbor[" << i << "] " << this->toString(neighbors[i]) << endl));
+
+        /** We get a simple path iterator from the current neighbor. */
+        GraphIterator<Edge> path = this->simplePathEdge (neighbors[i].to, direction);
+
+        /** We iterate this simple path from the current neighbor. */
+        for (path.first(); !path.isDone(); path.next())
+        {
+            DEBUG ((cout << "===> " << this->toString(*path) << endl));
+        }
+
+        /** Note the trick here: we get the current path node, even if the path iteration is done. */
+        Node& last = path.item().to;
+
+        /** We set the ith branching neighbor node. By convention, we memorize the nucleotide of the initial transition. */
+        result[i].set (source.kmer, source.strand, last.kmer, last.strand, neighbors[i].nt, direction, path.rank()+1);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename Item, typename Functor>
+struct getItem_visitor : public boost::static_visitor<Item>    {
+
+    Node& source;  Direction direction;  Nucleotide nt; bool& exists; Functor fct; bool hasAdjacency;
+
+    getItem_visitor (Node& aSource, Direction aDirection, Nucleotide aNt, bool hasAdjacency, bool& aExists, Functor aFct)
+        : source(aSource), direction(aDirection), nt(aNt), exists(aExists), fct(aFct), hasAdjacency(hasAdjacency) {}
+
+    template<size_t span>  Item operator() (const GraphData<span>& data) const
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        Item item;
+        Item itemAdj;
+
+        /** We get the specific typed value from the generic typed value. */
+        const Type& sourceVal = source.template getKmer<Type>();
+
+        /** Shortcuts. */
+        size_t      kmerSize = data._model->getKmerSize();
+        const Type& mask     = data._model->getKmerMax();
+
+        /* the kmer we're extending may be actually a revcomp sequence in the bidirected debruijn graph node */
+        Type graine = ((source.strand == STRAND_FORWARD) ?  sourceVal :  revcomp (sourceVal, kmerSize) );
+
+
+        // this is basically the code in getItems_visitor without a loop on nt
+        bool debug = false;
+        if (hasAdjacency)
+        {
+            unsigned long hashIndex = getNodeIndex<span>(data, source);
+			if(hashIndex == ULLONG_MAX) {exists = false; return itemAdj;} // node was not found in the mphf 
+
+            unsigned char &value = (*(data._adjacency)).at(hashIndex);
+
+            bool forwardStrand = (source.strand == STRAND_FORWARD);
+
+            unsigned char bitmask;
+
+            if (direction & DIR_OUTCOMING)
+            {
+                if (forwardStrand)
+                    bitmask = value & 0xF;
+                else
+                {
+                    bitmask = (value >> 4) & 0xF;
+
+                    /* also revcomp the nt's: instead of GTCA (high bits to low), make it CAGT */
+                    bitmask = ((bitmask & 3) << 2) | ((bitmask >> 2) & 3);
+                }
+
+                //std::cout << "getItems OUTCOMING: forward strand?" << forwardStrand << "; adjacency value: " << to_string((int)value) << " hashindex " << hashIndex << " dir " << direction << " bitmask " << (int)bitmask << std::endl;
+
+                if (bitmask & (1 << nt))
+                {
+                    typename Node::Value dest_value;
+                    Strand dest_strand = STRAND_FORWARD;
+                    Nucleotide dest_nt = (Nucleotide)nt;
+                    Type forward, reverse;
+                    Type single_nt; single_nt.setVal(nt);
+
+                    forward = ( (graine << 2 )  + single_nt ) & mask; /* for speedup's, there is much we could precompute here */
+                    reverse = revcomp (forward, kmerSize);
+
+                    if (forward < reverse)
+                        dest_value = forward;
+                    else
+                    {
+                        dest_value = reverse;
+                        dest_strand = STRAND_REVCOMP;
+                    }
+
+                    if (debug) std::cout << "getItem adj, found OUT " << (dest_strand==STRAND_REVCOMP ? "REV" : "FWD") << " nt=" << nt << std::endl;
+                    fct (item, source.kmer, source.strand, dest_value, dest_strand, dest_nt, DIR_OUTCOMING);
+                    exists = true;
+                }
+                else
+                    exists = false;
+            }
+
+            if (direction & DIR_INCOMING)
+            {
+                if (forwardStrand)
+                    bitmask = (value >> 4) & 0xF;
+                else
+                {
+                    bitmask = value & 0xF;
+
+                    /* also revcomp the nt's: instead of GTCA (high bits to low), make it CAGT */
+                    bitmask = ((bitmask & 3) << 2) | ((bitmask >> 2) & 3);
+                }
+
+                //std::cout << "getItems INCOMING: forward strand?" << forwardStrand << "; adjacency value: " << to_string((int)value) << " hashindex " << hashIndex << " dir " << direction << " bitmask " << (int)bitmask << std::endl;
+
+                if (bitmask & (1 << nt))
+                {
+                    typename Node::Value dest_value;
+                    Strand dest_strand = STRAND_FORWARD;
+                    Nucleotide dest_nt = (Nucleotide)nt;
+                    Type forward, reverse;
+                    Type single_nt; single_nt.setVal(nt);
+
+                    forward = ( (graine >> 2 )  + ( single_nt << ((kmerSize-1)*2)) ) & mask; /* previous kmer */
+                    reverse = revcomp (forward, kmerSize);
+
+                    if (forward < reverse)
+                        dest_value = forward;
+                    else
+                    {
+                        dest_value = reverse;
+                        dest_strand = STRAND_REVCOMP;
+                    }
+
+                    if (debug) std::cout << "getItem adj, found INC " << (dest_strand==STRAND_REVCOMP ? "REV" : "FWD") << " nt=" << nt << std::endl;
+                    fct (item, source.kmer, source.strand, dest_value, dest_strand, dest_nt, DIR_INCOMING);
+                    exists = true;
+                }
+                else
+                    exists = false;
+            }
+
+            /** We return the result. */
+            return item;
+        }
+
+        if (direction & DIR_OUTCOMING)
+        {
+            typename Node::Value dest_value;
+            Type forward = ( (graine << 2 )  + nt) & mask;
+            Type reverse = revcomp (forward, kmerSize);
+
+            if (forward < reverse)
+            {
+                if (data.contains (forward))
+                {
+                    dest_value = forward;
+                    fct (item, source.kmer, source.strand, dest_value, STRAND_FORWARD, (Nucleotide)nt, DIR_OUTCOMING);
+                    exists = true;
+                }
+                else
+                {
+                    exists = false;
+                }
+            }
+            else
+            {
+                if (data.contains (reverse))
+                {
+                    dest_value = reverse;
+                    fct (item, source.kmer, source.strand, dest_value, STRAND_REVCOMP, (Nucleotide)nt, DIR_OUTCOMING);
+                    exists = true;
+                }
+                else
+                {
+                    exists = false;
+                }
+            }
+        }
+
+        if (direction & DIR_INCOMING)
+        {
+            Type single_nt;
+            single_nt.setVal(nt);
+            single_nt <<= ((kmerSize-1)*2);
+            typename Node::Value dest_value;
+            Type forward = ((graine >> 2 )  + single_nt ) & mask; /* previous kmer */
+            Type reverse = revcomp (forward, kmerSize);
+
+            if (forward < reverse)
+            {
+                if (data.contains (forward))
+                {
+                    dest_value = forward;
+                    fct (item, source.kmer, source.strand, dest_value, STRAND_FORWARD, (Nucleotide)nt, DIR_INCOMING);
+                    exists = true;
+                }
+                else
+                {
+                    exists = false;
+                }
+            }
+            else
+            {
+                if (data.contains (reverse))
+                {
+                    dest_value = reverse;
+                    fct (item, source.kmer, source.strand, dest_value, STRAND_REVCOMP, (Nucleotide)nt, DIR_INCOMING);
+                    exists = true;
+                }
+                else
+                {
+                    exists = false;
+                }
+            }
+        }
+
+        /** We return the result. */
+        return item;
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct Functor_getNode {  void operator() (
+    Node&                item,
+    const typename Node::Value&   kmer_from,
+    kmer::Strand         strand_from,
+    const typename Node::Value&   kmer_to,
+    kmer::Strand         strand_to,
+    kmer::Nucleotide     nt,
+    Direction            dir
+) const
+{
+    item.set (kmer_to, strand_to);
+}};
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+Node GraphTemplate<Node, Edge, GraphDataVariant>::getNode (Node& source, Direction dir, kmer::Nucleotide nt, bool& exists) const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    return boost::apply_visitor (getItem_visitor<Node, Edge, Node, Functor_getNode<Node, Edge, GraphDataVariant> >(source, dir, nt, hasAdjacency, exists, Functor_getNode<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<Edge> GraphTemplate<Node, Edge, GraphDataVariant>::getEdgeValues (const typename Node::Value& kmer) const
+{
+    Node source (kmer);
+
+    GraphVector<Edge> v1 = getEdges(source,          DIR_OUTCOMING);
+    GraphVector<Edge> v2 = getEdges(reverse(source), DIR_OUTCOMING);
+#if 0
+    v1.insert (v1.end(), v2.begin(), v2.end());
+#else
+    size_t n1=v1.size(), n2=v2.size();
+    v1.resize (n1+n2);
+    for (size_t i=0; i<n2; i++)  { v1[i+n1] = v2[i];  }
+#endif
+
+    return v1;
+}
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<Node> GraphTemplate<Node, Edge, GraphDataVariant>::getNodeValues (const typename Node::Value& kmer) const
+{
+    Node source (kmer);
+    Node rev_source (reverse(source));
+
+    GraphVector<Node> v1 = getNodes(source,          DIR_OUTCOMING);
+    GraphVector<Node> v2 = getNodes(rev_source, DIR_OUTCOMING);
+
+#if 0
+    v1.insert (v1.end(), v2.begin(), v2.end());
+#else
+    size_t n1=v1.size(), n2=v2.size();
+    v1.resize (n1+n2);
+    for (size_t i=0; i<n2; i++)  { v1[i+n1] = v2[i];  }
+#endif
+
+    return v1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<BranchingEdge_t<Node,Edge> > GraphTemplate<Node, Edge, GraphDataVariant>::getBranchingEdgeValues (const typename Node::Value& kmer) const
+{
+    Node source (kmer);
+    Node rev_source (reverse(source));
+
+    GraphVector<BranchingEdge_t<Node,Edge> > v1 = getBranchingEdgeNeighbors (source,          DIR_OUTCOMING);
+    GraphVector<BranchingEdge_t<Node,Edge> > v2 = getBranchingEdgeNeighbors (rev_source, DIR_OUTCOMING);
+#if 0
+    v1.insert (v1.end(), v2.begin(), v2.end());
+#else
+    size_t n1=v1.size(), n2=v2.size();
+    v1.resize (n1+n2);
+    for (size_t i=0; i<n2; i++)  { v1[i+n1] = v2[i];  }
+#endif
+
+    return v1;
+}
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphVector<BranchingNode_t<Node> > GraphTemplate<Node, Edge, GraphDataVariant>::getBranchingNodeValues (const typename Node::Value& kmer) const
+{
+    Node source (kmer);
+    Node rev_source (reverse(source));
+
+    GraphVector<BranchingNode_t<Node> > v1 = getBranchingNodeNeighbors (source,          DIR_OUTCOMING);
+    GraphVector<BranchingNode_t<Node> > v2 = getBranchingNodeNeighbors (rev_source, DIR_OUTCOMING);
+
+
+#if 0
+    v1.insert (v1.end(), v2.begin(), v2.end());
+#else
+    size_t n1=v1.size(), n2=v2.size();
+    v1.resize (n1+n2);
+    for (size_t i=0; i<n2; i++)  { v1[i+n1] = v2[i];  }
+#endif
+
+    return v1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct contains_visitor : public boost::static_visitor<bool>    {
+
+    const Node& node;
+    contains_visitor (const Node& aNode) : node(aNode) {}
+
+    template<size_t span>  bool operator() (const GraphData<span>& data) const
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        return data.contains (node.template getKmer<Type>());
+    }
+};
+
+/********************************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::contains (const Node& item) const
+{
+    return boost::apply_visitor (contains_visitor<Node, Edge, GraphDataVariant>(item),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+template<size_t span>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::contains (const typename Kmer<span>::Type& item) const
+{
+    return boost::apply_visitor (contains_visitor<Node, Edge, GraphDataVariant>(item),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename NodeType, typename GraphDataVariant>  struct BranchingFilter
+{
+    const GraphTemplate<Node, Edge, GraphDataVariant>& graph;
+    BranchingFilter(const GraphTemplate<Node, Edge, GraphDataVariant>& graph) : graph(graph) {}
+    bool operator () (NodeType& item) { return graph.isBranching(item); }
+};
+
+template<typename Node, typename Edge, typename NodeType, typename GraphDataVariant>
+struct nodes_visitor : public boost::static_visitor<tools::dp::ISmartIterator<NodeType>*>
+{
+    const GraphTemplate<Node, Edge, GraphDataVariant>& graph;
+    nodes_visitor (const GraphTemplate<Node, Edge, GraphDataVariant>& graph) : graph(graph) {}
+
+    template<size_t span>  tools::dp::ISmartIterator<NodeType>* operator() (const GraphData<span>& data) const
+    {
+        /** Shortcuts. */
+        typedef typename Kmer<span>::Count Count;
+
+        // soo.. we're defining a iterator class inside a visitor. that's just what it is.
+        class NodeIterator : public tools::dp::ISmartIterator<NodeType>
+        {
+        public:
+            NodeIterator (tools::dp::Iterator<Count>* ref, u_int64_t nbItems)
+                : _ref(0),  _rank(0), _isDone(true), _nbItems(nbItems)   {  
+                    setRef(ref);  
+                    this->_item->strand = STRAND_FORWARD;  // iterated nodes are always in forward strand.
+                }
+
+            ~NodeIterator ()  { setRef(0);   }
+
+            u_int64_t rank () const { return _rank; }
+
+            /** \copydoc  Iterator::first */
+            void first()
+            {
+                _ref->first();
+                _rank   = 0;
+                _isDone = _ref->isDone();
+
+                if (!_isDone)
+                {
+                    // NOTE: doesn't check if node is deleted (as it would be expensive to compute MPHF index)
+                    this->_rank ++;
+                    this->_item->kmer      = _ref->item().value;
+                    this->_item->abundance = _ref->item().abundance;
+                    this->_item->mphfIndex = 0;
+                    this->_item->iterationRank = this->_rank;
+                }
+            }
+
+            /** \copydoc  Iterator::next */
+            void next()
+            {
+                _ref->next();
+                _isDone = _ref->isDone();
+                if (!_isDone)
+                {
+                    // NOTE: doesn't check if node is deleted (as it would be expensive to compute MPHF index)
+                    this->_rank ++;
+                    this->_item->kmer      = _ref->item().value;
+                    this->_item->abundance = _ref->item().abundance;
+                    this->_item->mphfIndex = 0;
+                    this->_item->iterationRank = this->_rank;
+                }
+            }
+
+            /** \copydoc  Iterator::isDone */
+            bool isDone() { return _isDone;  }
+
+            /** \copydoc  Iterator::item */
+            NodeType& item ()  {  return *(this->_item);  }
+
+            /** */
+            void setItem (NodeType& i)
+            {
+                /** We set the node item to be set for the current iterator. */
+                this->_item = &i;
+                this->_item->strand = STRAND_FORWARD;
+
+                /** We set the kmer item to be set for the kmer iterator. */
+                // _ref->setItem (i.kmer.value.get<T>());
+                // TODO doc: uh, why is that commented?
+            }
+
+            /** */
+            u_int64_t size () const { return _nbItems; }
+
+        private:
+            tools::dp::Iterator<Count>* _ref;
+            void setRef (tools::dp::Iterator<Count>* ref)  { SP_SETATTR(ref); }
+
+            u_int64_t _rank;
+            bool      _isDone;
+            u_int64_t _nbItems;
+        };
+
+        // now this is the actual code for returning a node iterator, apparently
+
+        if (typeid(NodeType) == typeid(Node) )
+        {
+            if (data._solid != 0)
+            {
+                return new NodeIterator (data._solid->iterator (), data._solid->getNbItems());
+            }
+            else
+            {
+                throw system::Exception("Iteration impossible (no solid nodes available)");
+            }
+        }
+        else if (typeid(NodeType) == typeid(BranchingNode_t<Node>))
+        {
+            if (data._branching != 0)
+            {
+                /** We have a branching container*/
+                return new NodeIterator (data._branching->iterator (), data._branching->getNbItems());
+            }
+            else if (data._solid != 0)
+            {
+                /** We don't have pre-computed branching nodes container. We have to compute them on the fly
+                 * from the solid kmers. We can do that by filtering out all non branching nodes. */
+                return new FilterIterator<NodeType,BranchingFilter<Node, Edge, NodeType, GraphDataVariant> > (
+                    new NodeIterator (data._solid->iterator (), data._solid->getNbItems()),
+                    BranchingFilter<Node, Edge, NodeType, GraphDataVariant> (graph)
+                );
+            }
+            else
+            {
+                throw system::Exception("Iteration impossible (no solid nor branching nodes available)");
+            }
+        }
+        else {  throw system::Exception("Invalid type");  }
+    }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphIterator<Node> GraphTemplate<Node, Edge, GraphDataVariant>::getNodes () const
+{
+    return GraphIterator<Node> (boost::apply_visitor (nodes_visitor<Node,Edge, Node, GraphDataVariant>(*this),  *(GraphDataVariant*)_variant));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphIterator<BranchingNode_t<Node> > GraphTemplate<Node, Edge, GraphDataVariant>::getBranchingNodes () const
+{
+    return GraphIterator<BranchingNode_t<Node> > (boost::apply_visitor (nodes_visitor<Node, Edge, BranchingNode_t<Node>, GraphDataVariant>(*this),  *(GraphDataVariant*)_variant));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct toString_node_visitor : public boost::static_visitor<std::string>    {
+
+    const Node& node;
+    toString_node_visitor (const Node& aNode) : node(aNode) {}
+
+    template<size_t span>  std::string operator() (const GraphData<span>& data) const
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        Type value = node.template getKmer<Type>();
+        if (node.strand == STRAND_FORWARD)   {  return data._model->toString (value);  }
+        else                                 {  return data._model->toString (data._model->reverse (value));  }
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::toString (const Node& node) const
+{
+    return boost::apply_visitor (toString_node_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct debugString_node_visitor : public boost::static_visitor<std::string>    {
+
+    const Node& node;  kmer::Strand strand; int mode;
+    debugString_node_visitor (const Node& aNode, kmer::Strand aStrand, int aMode) : node(aNode), strand(aStrand), mode(aMode) {}
+
+    template<size_t span>  std::string operator() (const GraphData<span>& data) const
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type Type;
+
+        std::stringstream ss;
+
+        /** We set the strings for the kmer and the strand. */
+        std::string kmerStr;
+        std::string strandStr;
+
+        Type value = node.template getKmer<Type>();
+
+        if (strand == STRAND_ALL || node.strand == strand)
+        {
+            kmerStr = data._model->toString (value);
+            strandStr = (node.strand==STRAND_FORWARD ? "FWD" : "REV");
+        }
+        else
+        {
+            Type reverse = data._model->reverse (value);
+            kmerStr = data._model->toString (reverse);
+            strandStr = (node.strand==STRAND_FORWARD ? "REV" : "FWD");
+        }
+
+             if (mode==0)  {  ss << "[ " << value <<  " / " << strandStr << "]";  }
+        else if (mode==1)  {  ss << "[ " << kmerStr <<  " / " << strandStr << "]";  }
+        else if (mode==2)  {  ss << "[ " << kmerStr <<  " / " << strandStr << "]";  }
+
+        return ss.str();
+
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::debugString (const Node& node, kmer::Strand strand, int mode) const
+{
+    return boost::apply_visitor (debugString_node_visitor<Node, Edge, GraphDataVariant>(node,strand,mode),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct debugString_edge_visitor : public boost::static_visitor<std::string>    {
+
+    const Edge& edge;  Strand strand;  int mode;
+    debugString_edge_visitor (const Edge& aEdge, Strand aStrand, int aMode=0) : edge(aEdge), strand(aStrand), mode(aMode) {}
+
+    template<size_t span>  std::string operator() (const GraphData<span>& data) const
+    {
+        std::stringstream ss;
+
+        if (mode == 0)
+        {
+            ss << "["
+               << "(" << edge.from.kmer << "," << edge.from.strand-1 << ")"
+               << " ";
+            if (edge.direction == DIR_OUTCOMING)  {  ss <<  "--"  << ascii(edge.nt) << "-->";  }
+            else                                  {  ss <<  "<--" << ascii(edge.nt) << "--";   }
+
+            ss  << " "
+               << "(" << edge.to.kmer << "," << edge.to.strand-1 << ")"
+               << "]";
+        }
+        else if (mode==1)
+        {
+            ss << "["
+               << debugString_node_visitor<Node, Edge, GraphDataVariant>(edge.from, strand, 1) (data)
+               << " ";
+            if (edge.direction == DIR_OUTCOMING)  {  ss <<  "--"  << ascii(edge.nt) << "-->";  }
+            else                                  {  ss <<  "<--" << ascii(edge.nt) << "--";   }
+
+            ss  << " "
+                    << debugString_node_visitor<Node, Edge, GraphDataVariant>(edge.to, strand, 1) (data)
+               << "]";
+        }
+        else if (mode==2)
+        {
+            ss << "["
+               << toString_node_visitor<Node, Edge, GraphDataVariant>(edge.from) (data)
+               << " ";
+            if (edge.direction == DIR_OUTCOMING)  {  ss <<  "--"  << ascii(edge.nt) << "-->";  }
+            else                                  {  ss <<  "<--" << ascii(edge.nt) << "--";   }
+
+            ss  << " "
+                    << toString_node_visitor<Node, Edge, GraphDataVariant>(edge.to) (data)
+               << "]";
+        }
+
+        return ss.str();
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::debugString (const Edge& edge, kmer::Strand strand, int mode) const
+{
+    return boost::apply_visitor (debugString_edge_visitor<Node, Edge, GraphDataVariant>(edge, strand, mode),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::toString (const Edge& edge) const
+{
+    std::stringstream ss;
+
+    ss << "["  << this->toString (edge.from)  << " ";
+    if (edge.direction == DIR_OUTCOMING)  {  ss <<  "--"  << ascii(edge.nt) << "-->";  }
+    else                                  {  ss <<  "<--" << ascii(edge.nt) << "--";   }
+    ss << " "  << this->toString (edge.to)  << "]";
+
+    return ss.str();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::toString (const BranchingEdge_t<Node,Edge>& edge) const
+{
+    std::stringstream ss;
+
+    ss << "["  << this->toString (edge.from)  << " ";
+    if (edge.direction == DIR_OUTCOMING)  {  ss <<  "--"  << ascii(edge.nt) << "," << edge.distance << "-->";  }
+    else                                  {  ss <<  "<--" << ascii(edge.nt) << "," << edge.distance << "--";   }
+    ss << " "  << this->toString (edge.to)  << "]";
+
+    return ss.str();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+int GraphTemplate<Node, Edge, GraphDataVariant>::simplePathAvance (Node& node, Direction dir, kmer::Nucleotide& nt) const
+{
+    Edge edge;
+    int res = simplePathAvance (node, dir, edge);
+    nt = edge.nt;
+    return res;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+int GraphTemplate<Node, Edge, GraphDataVariant>::simplePathAvance (Node& node, Direction dir) const
+{
+    Edge output;  return simplePathAvance (node, dir, output);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant>
+int GraphTemplate<Node, Edge, GraphDataVariant>::simplePathAvance (Node& node, Direction dir, Edge& output) const
+{
+    GraphVector<Edge> neighbors = this->neighborsEdge (node, dir);
+
+    /** We check we have no outbranching. */
+    if (neighbors.size() == 1)
+    {
+        /** We set the output result. */
+        output = neighbors[0];
+
+        /** We check whether the neighbor has an inbranching or not. */
+        if (this->degree (neighbors[0].to, impl::reverse(dir)) > 1)  {  return -2;  }
+
+        /** We have a simple node here. */
+        return 1;
+    }
+
+    /** if this kmer has out-branching, don't extend it. */
+    if (neighbors.size() > 1)  {  return -1;  }
+
+    return 0;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+double GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathMeanAbundance     (Node& node, Direction dir) const
+{
+    GraphIterator <Node> itNodes = simplePath (node, dir);
+
+    unsigned long mean_abundance = 0;
+    int length = 0;
+    for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+    {
+        unsigned int abundance = queryAbundance(*itNodes);
+        mean_abundance += abundance;
+        length++;
+    }
+    if (length == 0)
+        return 0;
+    double meanAbundance = (double)mean_abundance / ((double)length);
+    double stdevAbundance = 0;
+
+    // get std dev, for debug only
+    bool debugstdev = false;
+    if (debugstdev)
+    {
+        for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+        {
+            unsigned int abundance = queryAbundance((*itNodes));
+            stdevAbundance += pow(fabs(abundance-meanAbundance),2);
+        }
+        stdevAbundance = sqrt(stdevAbundance/(double)length);
+    }
+
+    return meanAbundance;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+Node  GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathLastNode  (Node& node, Direction dir) const
+{
+    GraphIterator <Node> itNodes = simplePath (node, dir);
+    itNodes.first();
+    Node cur = *itNodes;
+    for (; !itNodes.isDone(); itNodes.next())
+        cur = *itNodes; // is there an easier way?
+    return cur;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+unsigned int GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathLength (Node& node, Direction dir) const
+{
+    GraphIterator <Node> itNodes = simplePath (node, dir);
+    unsigned int length = 0;
+    for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+        length++;
+    return length;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+unitigDelete (Node& node, Direction dir, NodesDeleter<Node,Edge, GraphTemplate<Node, Edge, GraphDataVariant>> &nodesDeleter) 
+{
+    std::cout << "Graph::unitigDelete not implemented" << std::endl; exit(1);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+unitigDelete (Node& node) 
+{
+    std::cout << "Graph::simplePathDelete not implemented" << std::endl; exit(1);
+}
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathDelete          (Node& node, Direction dir, NodesDeleter<Node,Edge, GraphTemplate<Node, Edge, GraphDataVariant>>& nodesDeleter) 
+{
+    GraphIterator <Node> itNodes = simplePath (node, dir);
+    for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+        nodesDeleter.markToDelete(*itNodes);
+    nodesDeleter.markToDelete(node); // don't forget the start node
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+unitigMark            (Node& node)  // used to flag simple path as traversed, in minia
+{
+    std::cout << "Graph::simplePathMark not implemented. Only in GraphUnitigs it is." << std::endl; exit(1);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::
+unitigIsMarked        (Node& node)
+{
+    std::cout << "Graph::simplePathIsMarked not implemented" << std::endl; exit(1);
+}
+
+
+
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::
+unitigSequence (Node& node, bool& isolatedLeft, bool& isolatedRight) const
+{
+    std::cout << "Graph::simplePathSequence not implemented (only in GraphUnitigs yet)" << std::endl;// would be easy to implement, just see Minia's legacy code for example
+    return "";
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathLongest_avance(const Node& node, Direction dir, int& seqLength, int& endDegree, bool dummy, float& coverage, std::string* seq, std::vector<Node> *unitigNodes) 
+{
+    std::cout << "Graph::simplePathLongest_avance not implemented (only in GraphUnitigs yet)" << std::endl;// would be easy to implement, just see Minia's legacy code for example
+    return ;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+std::string GraphTemplate<Node, Edge, GraphDataVariant>::
+simplePathBothDirections(const Node& node, bool& isolatedLeft, bool& isolatedRight, bool dummy, float& coverage) 
+{
+    std::cout << "Graph::simplePathLongest not implemented (only in GraphUnitigs yet)" << std::endl;// if wanted to implement, just see Minia's legacy code for example
+    return "";
+}
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::
+debugPrintAllUnitigs() const
+{
+    std::cout << "Graph::debugPritnAllUnitigs implemented (only in GraphUnitigs yet)" << std::endl;
+}
+
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename Item, typename Functor, typename GraphDataVariant>
+class AbstractSimplePathIterator : public tools::dp::ISmartIterator<Item>
+{
+public:
+
+    AbstractSimplePathIterator (const GraphTemplate<Node, Edge, GraphDataVariant>& graph, const Node& node, Direction dir, const Functor& update)
+        : _graph(graph), _dir(dir), _rank(0), _isDone(true), _update(update) {}
+
+    virtual ~AbstractSimplePathIterator() {}
+
+    u_int64_t rank () const { return _rank; }
+
+    /** \copydoc  Iterator::first */
+    void first()
+    {
+        _rank   = 0;
+        _isDone = false;
+        next ();
+        /** The rank must begin at 0; we just remove the 1 added in the first call to next. */
+        _rank --;
+    }
+
+    /** \copydoc  Iterator::next */
+    void next()
+    {
+        _rank ++;
+        _update (_graph, *(this->_item), _dir, _isDone);
+    }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone() {  return _isDone;  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  {  return *(this->_item);  }
+
+    /** */
+    u_int64_t size () const { return 0; }
+
+protected:
+    const GraphTemplate<Node, Edge, GraphDataVariant>&       _graph;
+    Direction          _dir;
+    u_int64_t          _rank;
+    bool               _isDone;
+    const Functor&     _update;
+};
+
+/** */
+template<typename Node, typename Edge, typename Functor, typename GraphDataVariant>
+class NodeSimplePathIterator : public AbstractSimplePathIterator<Node,Edge, Node, Functor, GraphDataVariant>
+{
+public:
+    NodeSimplePathIterator (const GraphTemplate<Node, Edge, GraphDataVariant>& graph, const Node& node, Direction dir, const Functor& update)
+        : AbstractSimplePathIterator<Node,Edge, Node,Functor, GraphDataVariant> (graph, node, dir, update)  { *(this->_item) = node;  }
+};
+
+/** */
+template<typename Node, typename Edge, typename Functor, typename GraphDataVariant>
+class EdgeSimplePathIterator : public AbstractSimplePathIterator<Node,Edge, Edge, Functor, GraphDataVariant>
+{
+public:
+    EdgeSimplePathIterator (const GraphTemplate<Node, Edge, GraphDataVariant>& graph, const Node& node, Direction dir, const Functor& udpate)
+        : AbstractSimplePathIterator<Node,Edge, Edge, Functor, GraphDataVariant> (graph, node, dir, udpate)
+    { this->_item->set (node.kmer, node.strand, node.kmer, node.strand, NUCL_UNKNOWN, dir); }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct Functor_getSimpleNodeIterator {  void operator() (
+    const GraphTemplate<Node, Edge, GraphDataVariant>&         graph,
+    Node&                item,
+    Direction            dir,
+    bool&                isDone
+) const
+{
+    Edge output;
+
+    /** We check if we have a simple node. */
+    if (graph.simplePathAvance (item, dir, output) > 0)
+    {
+        /** We update the currently iterated node. */
+        item = output.to;
+    }
+    else
+    {
+        /** We can't have a non branching node in the wanted direction => iteration is finished. */
+        isDone = true;
+    }
+}};
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+GraphIterator<Node> GraphTemplate<Node, Edge, GraphDataVariant>::getSimpleNodeIterator (Node& node, Direction dir) const
+{
+    return GraphIterator<Node> (new NodeSimplePathIterator <Node, Edge, Functor_getSimpleNodeIterator<Node, Edge, GraphDataVariant>, GraphDataVariant> (*this, node, dir, Functor_getSimpleNodeIterator<Node, Edge, GraphDataVariant>()));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct Functor_getSimpleEdgeIterator {  void operator() (
+    const GraphTemplate<Node, Edge, GraphDataVariant>&         graph,
+    Edge&                item,
+    Direction            dir,
+    bool&                isDone
+) const
+{
+    Edge output;
+
+    /** We check if we have a simple node. */
+    int res = graph.simplePathAvance (item.to, dir, output);
+
+    /** NOTE: we update the item in case we have outdegree==1 (case>0 and case==-2) */
+    if (res > 0  ||  res == -2)  {  item = output;  }
+
+    /** We can't have a non branching node in the wanted direction => iteration is finished. */
+    if (res <= 0)  {  isDone = true;  }
+
+}};
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+GraphIterator<Edge> GraphTemplate<Node, Edge, GraphDataVariant>::getSimpleEdgeIterator (Node& node, Direction dir) const
+{
+    return GraphIterator<Edge> (new EdgeSimplePathIterator<Node, Edge, Functor_getSimpleEdgeIterator<Node, Edge, GraphDataVariant>, GraphDataVariant>(*this, node, dir, Functor_getSimpleEdgeIterator<Node, Edge, GraphDataVariant>()));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant> 
+std::set<BranchingNode_t<Node> > GraphTemplate<Node, Edge, GraphDataVariant>::neighbors (typename std::set<BranchingNode_t<Node> >::iterator first, typename std::set<BranchingNode_t<Node> >::iterator last) const
+{
+#if 0
+    std::set<BranchingNode> result;
+    for (auto it=first; it!=last; ++it)
+    {
+        GraphVector<BranchingNode> neighbors = this->neighborsBranching(it->kmer);
+        for (size_t i=0; i<neighbors.size(); i++)  { result.insert (neighbors[i]); }
+    }
+    return result;
+#else
+
+    static const size_t nbThread = 8;
+    static const size_t nbThreshold = nbThread*1;
+
+    std::set<BranchingNode_t<Node> > result;
+
+    size_t nb = std::distance (first, last);
+
+    if (nb >= nbThreshold)
+    {
+        typename std::set<BranchingNode_t<Node> >::iterator begin = first;
+        typename std::set<BranchingNode_t<Node> >::iterator end;
+
+
+        int nbPerThread = nb/nbThread;
+
+        vector<pair<typename std::set<BranchingNode_t<Node> >::iterator, typename std::set<BranchingNode_t<Node> >::iterator> > iteratorPairs;
+
+        class Cmd : public tools::dp::ICommand, public system::SmartPointer
+        {
+        public:
+            Cmd (const GraphTemplate<Node, Edge, GraphDataVariant>& graph, const pair<typename std::set<BranchingNode_t<Node> >::iterator, typename std::set<BranchingNode_t<Node> >::iterator>& range)
+                : graph(graph), range(range)
+            {
+                result.reserve (std::distance(range.first,range.second)*8);
+            }
+
+            ~Cmd () {}
+
+            void execute ()
+            {
+                for (typename std::set<BranchingNode_t<Node> >::iterator it=range.first; it!=range.second; ++it)
+                {
+                    GraphVector<BranchingNode_t<Node> > neighbors = graph.neighborsBranching(it->kmer);
+                    for (size_t i=0; i<neighbors.size(); i++)  { result.push_back (neighbors[i]); }
+                }
+            }
+
+            vector<BranchingNode_t<Node> >& get() { return result; }
+
+        private:
+            const GraphTemplate<Node, Edge, GraphDataVariant>& graph;
+            pair<typename std::set<BranchingNode_t<Node> >::iterator, typename std::set<BranchingNode_t<Node> >::iterator> range;
+            vector<BranchingNode_t<Node> > result;
+        };
+
+        vector<tools::dp::ICommand*> cmds;
+
+        while (end != last)
+        {
+            end = begin;
+            std::advance (end, std::min (nbPerThread, (int)std::distance(end,last)));
+            iteratorPairs.push_back (std::make_pair(begin, end) );
+
+			tools::dp::ICommand* cmd = new Cmd (*this, std::make_pair(begin, end));
+			cmd->use();
+			cmds.push_back (cmd);
+            begin = end;
+        }
+
+        tools::dp::impl::Dispatcher().dispatchCommands(cmds, 0);
+
+        for (size_t i=0; i<cmds.size(); i++)
+        {
+            vector<BranchingNode_t<Node> >& current = ((Cmd*)cmds[i])->get();
+
+            result.insert (current.begin(), current.end());
+            cmds[i]->forget();
+        }
+    }
+    else
+    {
+        for (typename std::set<BranchingNode_t<Node> >::iterator it=first; it!=last; ++it)
+        {
+            GraphVector<BranchingNode_t<Node> > neighbors = this->neighborsBranching(it->kmer);
+            for (size_t i=0; i<neighbors.size(); i++)  { result.insert (neighbors[i]); }
+        }
+    }
+
+    return result;
+#endif
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : what's this? is it used? no documentation
+*********************************************************************/
+#if 0 // this code crashes clang, so i disable it for now; actually, i still dont know whether this code is used anywhere
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct mutate_visitor : public boost::static_visitor<GraphVector<Node> >    {
+
+    const Node& node;  size_t idx;  int mode;
+
+    mutate_visitor (const Node& node, size_t idx, int mode) : node(node), idx(idx), mode(mode){}
+
+    template<size_t span>  GraphVector<Node> operator() (const GraphData<span>& data) const
+    {
+        /** Shortcuts. */
+        typedef typename Kmer<span>::Type           Type;
+        typedef typename Kmer<span>::ModelCanonical Model;
+
+        GraphVector<Node> result;
+        size_t nbMutations = 0;
+
+        size_t kmerSize = data._model->getKmerSize();
+
+        Model* model = data._model;
+
+        Type kmer = node.template getKmer<Type>();
+
+        size_t idxReverse = kmerSize - 1 - idx;
+
+        if (node.strand == STRAND_FORWARD)
+        {
+            Nucleotide ntInit = (Nucleotide) (node.kmer[idxReverse]);
+            size_t     nt0    = mode==0 ? 0 : ntInit+1;
+
+            Type resetMask;
+            resetMask.setVal(3);
+            resetMask <<= 2*idxReverse;
+            resetMask = ~resetMask;
+
+
+            for (size_t nt=nt0; nt<4; nt++)
+            {
+                Type single_nt;
+                single_nt.setVal(nt);
+                single_nt <<= 2*idxReverse;
+ 
+                Type direct = (kmer & resetMask) | single_nt;
+                Type rev    = model->reverse(direct);
+
+                if (direct < rev)
+                {
+                    if (data.contains(direct))
+                    {
+                        Node& node  = result[nbMutations++];
+                        node.kmer   = direct;
+                        node.strand = STRAND_FORWARD;
+                        node.mphfIndex = 0;
+                        // would need to add iterationRank if it's enabled 
+                    }
+                }
+                else
+                {
+                    if (data.contains(rev))
+                    {
+                        Node& node  = result[nbMutations++];
+                        node.kmer   = rev;
+                        node.strand = STRAND_REVCOMP;
+                        node.mphfIndex = 0;
+                        // would need to add iterationRank if it's enabled 
+                    }
+                }
+            } /* end of or (size_t nt=nt0; */
+        }
+        else
+        {
+            Nucleotide ntInit = reverse ((Nucleotide) (node.kmer[idx]));
+            size_t nt0 = mode==0 ? 0 : ntInit+1;
+
+            Type resetMask;
+            resetMask.setVal(3);
+            resetMask <<= 2*idx;
+            resetMask = ~resetMask;
+
+            for (size_t nt=nt0; nt<4; nt++)
+            {
+                Type single_rev_nt;
+                single_rev_nt.setVal(reverse((Nucleotide)nt));
+                single_rev_nt <<= 2*idx;
+                Type direct = (kmer & resetMask) +  single_rev_nt;
+                Type rev    = model->reverse(direct);
+
+                if (direct < rev)
+                {
+                    if (data.contains(direct))
+                    {
+                        Node& node  = result[nbMutations++];
+                        node.kmer   = direct;
+                        node.strand = STRAND_REVCOMP;
+                        node.mphfIndex = 0;
+                        // would need to add iterationRank if it's enabled 
+                    }
+                }
+                else
+                {
+                    if (data.contains(rev))
+                    {
+                        Node& node  = result[nbMutations++];
+                        node.kmer   = rev;
+                        node.strand = STRAND_FORWARD;
+                        node.mphfIndex = 0;
+                        // would need to add iterationRank if it's enabled 
+                    }
+                }
+            }
+        }
+
+        result.resize(nbMutations);
+
+        return result;
+    }
+};
+
+/** */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+GraphVector<Node> GraphTemplate<Node, Edge, GraphDataVariant>::mutate (const Node& node, size_t idx, int mode) const
+{
+    return boost::apply_visitor (mutate_visitor<Node, Edge, GraphDataVariant>(node,idx,mode),  *(GraphDataVariant*)_variant);
+}
+#endif
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct getNT_visitor : public boost::static_visitor<Nucleotide>    {
+
+    const Node& node;  size_t idx;
+
+    getNT_visitor (const Node& node, size_t idx) : node(node), idx(idx) {}
+
+    template<size_t span>  Nucleotide operator() (const GraphData<span>& data) const
+    {
+        /** Shortcuts. */
+        size_t kmerSize = data._model->getKmerSize();
+
+        if (node.strand == STRAND_FORWARD)  { return (Nucleotide) (node.kmer[kmerSize-1-idx]); }
+        else                                { return reverse ((Nucleotide) (node.kmer[idx])); }
+    }
+};
+
+/** */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+Nucleotide GraphTemplate<Node, Edge, GraphDataVariant>::getNT (const Node& node, size_t idx) const
+{
+    return boost::apply_visitor (getNT_visitor<Node, Edge, GraphDataVariant>(node,idx),  *(GraphDataVariant*)_variant);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+template<size_t span, typename Node_in>
+unsigned long getNodeIndex (const GraphData<span>& data, Node_in& node)
+{
+    typedef typename Kmer<span>::Type  Type;
+    if (node.mphfIndex != 0) // well, this means the 0th node mphf index isn't cached. good enough for me.
+        return node.mphfIndex;
+
+    //if (data._abundance == NULL)
+    //    throw system::Exception ("Error! getNodeIndex called but MPHF not constructed");
+    /* I'm hesitant to put a check (possible branch) in such a critical code. let's check at a higher level */
+
+    /** We get the specific typed value from the generic typed value. */
+    Type value = node.template getKmer<Type>();
+
+    // this code was used to make sure that getNodeIndex was always called on a canonical kmer. it is.
+#if 0
+    {
+        size_t      kmerSize = data._model->getKmerSize();
+        Type value2 =  revcomp (value, kmerSize);
+        if (value2 < value)
+        {
+            std::cout<<"Error: getNodeIndex has been called on a node that has a kmer that's not canonical"<< std::endl;
+            exit(1);
+        }
+    }
+#endif
+
+    // we use _abundance as the mphf. we could also use _nodestate but it might be null if disabled by disableNodeState()
+    unsigned long hashIndex = (*(data._abundance)).getCode(value);
+
+    node.mphfIndex = hashIndex;
+    
+    //std::cout<<"getNodeIndex : " << value <<  " : " << hashIndex << std::endl;
+    return hashIndex;
+}
+
+
+/* this whole visitor pattern thing in the GraphTemplate<Node, Edge, GraphDataVariant>..
+  it is used to support querying the right graph variant (the one that corresponds to the adequate kmer size)
+*/
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct queryAbundance_visitor : public boost::static_visitor<int>    {
+
+    Node& node;
+
+    queryAbundance_visitor (Node& node) : node(node){}
+
+    template<size_t span>  int operator() (const GraphData<span>& data) const
+    {
+        unsigned long hashIndex = getNodeIndex<span>(data, node);
+    	if(hashIndex == ULLONG_MAX) return 0; // node was not found in the mphf 
+
+        unsigned char value = (*(data._abundance)).at(hashIndex);
+
+        return value;
+    }
+};
+
+/** */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+int GraphTemplate<Node, Edge, GraphDataVariant>::queryAbundance (Node& node) const
+{
+    return boost::apply_visitor (queryAbundance_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+/* 
+/ a node state, using the MPHF, is either:
+/ 0: unmarked (normal state)
+/ 1: marked (already in an output unitig/contig)
+/ 2: deleted (in minia: tips and collapsed bubble paths will be deleted)
+/ 3: complex (branching or deadend, unmarked)
+*/
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct queryNodeState_visitor : public boost::static_visitor<int>    {
+
+    Node& node;
+
+    queryNodeState_visitor (Node& node) : node(node){}
+
+    template<size_t span>  int operator() (const GraphData<span>& data)  const
+    {
+        unsigned long hashIndex = getNodeIndex<span>(data, node);
+    	if(hashIndex == ULLONG_MAX) return 0; // node was not found in the mphf 
+
+        unsigned char value = (*(data._nodestate)).at(hashIndex / 2);
+
+        if (hashIndex % 2 == 1)
+            value >>= 4;
+
+        value &= 0xF;
+
+        return value;
+    }
+};
+
+/** */
+template<typename Node, typename Edge, typename GraphDataVariant>
+int GraphTemplate<Node, Edge, GraphDataVariant>::queryNodeState (Node& node) const 
+{
+    return boost::apply_visitor (queryNodeState_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct setNodeState_visitor : public boost::static_visitor<int>    {
+
+    Node& node;
+
+    int state;
+
+    setNodeState_visitor (Node& node, int state) : node(node), state(state) {}
+
+    template<size_t span> int operator() (const GraphData<span>& data)  const
+    {
+        unsigned long hashIndex = getNodeIndex<span>(data, node);
+    	if(hashIndex == ULLONG_MAX) return 0; // node was not found in the mphf 
+
+        unsigned char &value = (*(data._nodestate)).at(hashIndex / 2);
+
+        int maskedState = state & 0xF;
+
+        if (hashIndex % 2 == 1)
+        {
+            value &= 0xF;
+            value |= (maskedState << 4);
+        }
+        else
+        {
+            value &= 0xF0;
+            value |= maskedState;
+        }
+
+        return 0;
+    }
+};
+
+/** */
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::setNodeState (Node& node, int state) const 
+{
+    boost::apply_visitor (setNodeState_visitor<Node, Edge, GraphDataVariant>(node, state),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct resetNodeState_visitor : public boost::static_visitor<int>    {
+
+    resetNodeState_visitor () {}
+
+    template<size_t span> int operator() (const GraphData<span>& data) const
+    {
+        (*(data._nodestate)).clearData();
+        return 0;
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::resetNodeState() const
+{
+    boost::apply_visitor (resetNodeState_visitor<Node, Edge, GraphDataVariant>(),  *(GraphDataVariant*)_variant);
+}
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct disableNodeState_visitor : public boost::static_visitor<int>    {
+
+    disableNodeState_visitor () {}
+
+    template<size_t span> int operator() (GraphData<span>& data) const
+    {
+        data._nodestate = NULL;
+        return 0;
+    }
+};
+
+/* this can be useful for benchmarking purpose.
+ * because contains() always does a MPHF query to check if the node is deleted or not
+ * unless _nodestate is NULL.
+ * thus, this functions sets _nodestate to NULL.
+ * NOTE: irreversible!
+ */
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::disableNodeState() const
+{
+    boost::apply_visitor (disableNodeState_visitor<Node, Edge, GraphDataVariant>(),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+bool GraphTemplate<Node, Edge, GraphDataVariant>::isNodeDeleted(Node& node) const
+{
+    return (!checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE)) || (((queryNodeState(node) >> 1) & 1) == 1);
+}
+
+
+// direct access to MPHF index
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct nodeMPHFIndex_visitor : public boost::static_visitor<unsigned long>    {
+
+    Node& node;
+
+    nodeMPHFIndex_visitor (Node& node) : node(node) {}
+
+    template<size_t span> unsigned long operator() (const GraphData<span>& data)  const
+    {
+        return getNodeIndex<span>(data, node);
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+unsigned long GraphTemplate<Node, Edge, GraphDataVariant>::nodeMPHFIndex(Node& node) const 
+{
+    if (!checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE))
+       return 0;
+    return boost::apply_visitor (nodeMPHFIndex_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+/* debug function, only for profiling */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct nodeMPHFIndex_visitorDummy : public boost::static_visitor<unsigned long>    {
+
+    const Node& node;
+
+    nodeMPHFIndex_visitorDummy (const Node& node) : node(node) {}
+
+    template<size_t span> unsigned long operator() (const GraphData<span>& data) const
+    {
+        /** We get the specific typed value from the generic typed value. */
+        unsigned long hashIndex = 0;
+        return hashIndex;
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+unsigned long GraphTemplate<Node, Edge, GraphDataVariant>::nodeMPHFIndexDummy(Node& node) const /* debug function, only for profiling*/
+{
+    if (!checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE))
+       return 0;
+    return boost::apply_visitor (nodeMPHFIndex_visitorDummy<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+
+/*****************************************************************************
+ *
+ * graph adjacency functions 
+ *
+ *
+ * */
+
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct getAdjacency_visitor : public boost::static_visitor<unsigned char&>    {
+
+    Node& node;
+
+    getAdjacency_visitor (Node& node) : node(node) {}
+
+    template<size_t span> unsigned char& operator() (const GraphData<span>& data) const
+    {
+        unsigned long hashIndex= getNodeIndex<span>(data, node);
+    	if(hashIndex == ULLONG_MAX) 
+        { // node was not found in the mphf: complain a return a dummy value
+            std::cout << "getAdjacency called for node not in MPHF" << std::endl; 
+            return (*(data._adjacency)).at(0);
+        }
+
+        unsigned char &value = (*(data._adjacency)).at(hashIndex);
+        //std::cout << "hashIndex " << hashIndex << " value " << (int)value << std::endl;;
+
+        return value;
+    }
+};
+
+/* initiate the adjacency map */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct allocateAdjacency_visitor : public boost::static_visitor<void>    {
+
+    template<size_t span> void operator() (const GraphData<span>& data) const
+    {
+        data._adjacency->useHashFrom(data._abundance); // use abundancemap's MPHF, and allocate 8 bits per element for the adjacency map
+    }
+};
+
+
+/* precompute the graph adjacency information using the MPHF
+ * this should be much faster than querying the bloom filter
+ * also, maybe one day, it will replace it
+ */
+template<typename Node, typename Edge, typename GraphDataVariant> 
+void GraphTemplate<Node, Edge, GraphDataVariant>::precomputeAdjacency(unsigned int nbCores, bool verbose) 
+{
+    ProgressGraphIteratorTemplate<Node, ProgressTimerAndSystem> itNode (iterator(), "precomputing adjacency", verbose);
+    
+    bool hasMPHF = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE;
+    if (!hasMPHF)
+    {
+        throw system::Exception ("Cannot precompute adjacency information - MPHF was not constructed");
+        return;
+    }
+
+    /* allocate the adjacency map */
+    boost::apply_visitor (allocateAdjacency_visitor<Node, Edge, GraphDataVariant>(),  *(GraphDataVariant*)_variant);
+
+    Dispatcher dispatcher (nbCores); 
+
+    // nt2int is defined as static in Graph.hpp
+    nt2bit[NUCL_A] = 1;
+    nt2bit[NUCL_C] = 2;
+    nt2bit[NUCL_T] = 4;
+    nt2bit[NUCL_G] = 8;
+
+    dispatcher.iterate (itNode, [&] (Node& node)        {
+
+            unsigned char &value = boost::apply_visitor (getAdjacency_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+            value = 0;
+
+            // in both directions
+            for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+            {
+                GraphVector<Edge> neighbors = this->neighborsEdge(node, dir);
+                for (unsigned int i = 0; i < neighbors.size(); i++)
+                {
+                    u_int8_t bit = nt2bit[neighbors[i].nt];
+                    value |= bit << (dir == DIR_INCOMING ? 4 : 0);
+                    //std::cout << "setting bit " << (int)bit << " shifted " << ((int)bit << (dir == DIR_INCOMING ? 4 : 0)) << " for nt " << (int)(neighbors[i].nt) << std::endl;
+                }
+
+
+                //std::cout << "node " << this->toString(node) << " has " << neighbors.size() << " neighbors in direction " << (dir == DIR_INCOMING ? "incoming" : "outcoming") << " value is now " << (int)value <<  std::endl;
+            }
+            
+    }); // end of parallel node iterate
+
+    setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE);
+    
+    // do a sanity check, to see if adjacency information matches bloom information 
+    bool adjSanityCheck = false;
+    if (adjSanityCheck)
+    {
+        ProgressGraphIteratorTemplate<Node, ProgressTimerAndSystem> itNode2 (iterator(), "checking adjacency", verbose);
+        dispatcher.iterate (itNode2, [&] (Node& node)        {
+                // in both directions
+                for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+                {
+                    for (int otherStrand = 0; otherStrand <= 2; otherStrand++) // test both strands
+                    {
+                        node.strand = (otherStrand == 0) ? STRAND_FORWARD: STRAND_REVCOMP;
+                        if (this->debugCompareNeighborhoods(node, dir, "bad adjacency check")) exit(1);
+                    }
+                }
+        }); // end of parallel node iterate
+    }
+
+
+    // TODO delete _container here
+}
+
+// now deleteNode depends on getNodeAdjacency
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::deleteNode (Node& node) const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    if (hasAdjacency)
+    {
+        /* absolutely need to update adjacency information of neighboring nodes */
+        // todo: this can be made more efficient, but I wanted quick bug-free code
+        GraphVector<Edge> neighbs = this->neighborsEdge(node);
+
+        // sanity checks regarding adjacency information
+        //if (debugCompareNeighborhoods(node, DIR_INCOMING, "node deletion, incoming neighbors")) exit(1);
+        //if (debugCompareNeighborhoods(node, DIR_OUTCOMING, "node deletion, outcoming neighbors")) exit(1);
+
+        for (size_t i = 0; i < neighbs.size(); i++)
+        {
+            Node neighbor = neighbs[i].to;
+
+            bool deleted = false;
+
+            // also, since in precomputeAdjacency i'm using DIR_INCOMING and DIR_OUTCOMING, let's do the same here. 
+            // (gatb seems to ahve different edge creation behavior when neighbors(node) and neighbors(node,DIR_INCOMING) is used)
+            for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+            {
+                GraphVector<Edge> neighbs_of_neighbs = this->neighborsEdge(neighbor, dir);
+                
+                // sanity check 
+                //if (debugCompareNeighborhoods(neighbor,  dir, "node deletion, neighbs_of_neighbs"))
+                //{
+                //    std::cout << "some debug info, node " << this->toString(node) << ", neighbor " << this->toString(neighbor) << " strand: " << ((neighbor.strand == STRAND_FORWARD)? "forward":"reverse") << " direction: " <<  (dir == DIR_INCOMING ? "incoming": "outcoming") << std::endl; exit(1);
+                //}
+
+                for (size_t j = 0; j  < neighbs_of_neighbs.size(); j++)
+                {   
+                    Nucleotide nt = neighbs_of_neighbs[j].nt;
+                    Node neigh_of_neigh = neighbs_of_neighbs[j].to;
+                    
+                    if (neigh_of_neigh == node)
+                    {
+                        unsigned char& value = boost::apply_visitor (getAdjacency_visitor<Node, Edge, GraphDataVariant>(neighbor),  *(GraphDataVariant*)_variant);
+                        u_int8_t bit = nt2bit[nt];
+                            
+                        bool forwardStrand = (neighbor.strand == STRAND_FORWARD);
+                        int shift;
+                        if (forwardStrand) 
+                        {
+                            shift = (dir == DIR_INCOMING) ? 4 : 0;
+                        }
+                        else
+                        {
+                            shift = (dir == DIR_OUTCOMING) ? 4 : 0;
+                            bit = ((bit & 3) << 2) | ((bit >> 2) & 3);
+                        }
+                        //std::cout << "deleting node with value " << (int)value << " and dir :" << (dir == DIR_INCOMING ? "incoming": "outcoming") << ": neighbor" << ((neighbor.strand==STRAND_REVCOMP) ? "(r)":"")<<" " << this->toString(neighbor) << " --(nt=" << nt << ")--> neigh_of_neigh"  << ((neigh_of_neigh.strand==STRAND_REVCOMP) ? "(r)":"")<< " " << this->toString(neigh_of_neigh) << std::endl;
+
+                        if (((value >> shift) & bit) == 0) // TODO remove this check if no problem after a while
+                        {
+                            std::cout << "Error while deleting node " <<  this->toString(node) << ": neighbor" << ((neighbor.strand==STRAND_REVCOMP) ? "(r)":"")<<" " << this->toString(neighbor) << " --(nt=" << nt << ")--> neigh_of_neigh"  << ((neigh_of_neigh.strand==STRAND_REVCOMP) ? "(r)":"")<< " " << this->toString(neigh_of_neigh) << " and dir :" << (dir == DIR_INCOMING ? "incoming": "outcoming") << ", value " << (int)value << std::endl;
+                            exit(1);
+                        }
+                        value ^= (bit << shift);
+                        
+                        deleted = true;
+                    }
+                }
+            }
+            if (deleted == false)
+            {
+                std::cout << "[bug detected in adjacency data structure] was supposed to delete node "<< this->toString(node) <<" but couldn't find it :(." << std::endl;
+                std::cout << "assembly may be inaccurate around this kmer. will continue assembling anyway" << std::endl;
+            }
+
+        }
+    }
+
+    // a little sanitycheck
+#if 0
+    Vector<Edge> neighbs = this->neighborsEdge(node);
+#endif
+
+    if (checkState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_MPHF_DONE))
+        setNodeState(node, 2);
+
+    // another test
+#if 0
+    for (size_t i = 0; i < neighbs.size(); i++)
+    {
+        Node neighbor = neighbs[i].to;
+        for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+            if (debugCompareNeighborhoods(neighbor,dir,"post delete node")) exit(1);
+    }
+#endif
+
+    // update cached branching nodes information now
+    bool _cacheNonSimpleNodes = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_NONSIMPLE_CACHE;
+    if (_cacheNonSimpleNodes)
+    {
+        cacheNonSimpleNodeDelete(node); // so in case of a tip, will delete the tip and add the next kmer as non-branching, which will be in turn deleted. not that efficient, but will do for now.
+        GraphVector<Edge> neighbs = this->neighborsEdge(node);
+        for (size_t i = 0; i < neighbs.size(); i++)
+        {
+            Node neighbor = neighbs[i].to;
+            if (isBranching(neighbor))
+                cacheNonSimpleNode(neighbor);
+        }
+    }
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+bool GraphTemplate<Node, Edge, GraphDataVariant>::debugCompareNeighborhoods(Node& node, Direction dir, std::string prefix) const
+{
+    bool hasAdjacency = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_ADJACENCY_DONE;
+    if (!hasAdjacency) return false;
+
+    GraphVector<Edge> neighborsAdj = boost::apply_visitor (getItems_visitor<Node, Edge, Edge, Functor_getEdges<Node, Edge, GraphDataVariant>, GraphDataVariant>(node, dir, true , Functor_getEdges<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant);
+    GraphVector<Edge> neighborsBloom = boost::apply_visitor (getItems_visitor<Node, Edge, Edge, Functor_getEdges<Node, Edge, GraphDataVariant>, GraphDataVariant>(node, dir, false, Functor_getEdges<Node, Edge, GraphDataVariant>()),  *(GraphDataVariant*)_variant); // without adjacency (copied neighborsEdge code because hasAdjacency parameter isn't exposed)
+
+    if (neighborsAdj.size() != neighborsBloom.size())
+    {
+        std::cout << prefix << " #### mismatched number of neighbors: node " << this->toString(node) <<  " dir " << (dir == DIR_OUTCOMING? "outcoming" :" incoming") << ", " << neighborsAdj.size() << " neighborsAdj, " << neighborsBloom.size()  << " neighborsBloom" << std::endl;
+        return true;
+    }
+
+    bool bad=false;
+    for (unsigned int j = 0; j < neighborsAdj.size(); j++)
+    {
+        if (neighborsAdj[j].to != neighborsBloom[j].to)
+        {
+            std::cout << prefix << "#### node " << this->toString(node) << " neighbor error (out of " << neighborsAdj.size() << " neighbor(s)): neighborsAdj[j].to = " << this->toString(neighborsAdj[j].to) << ", neighborsBloom[j].to = " << this->toString(neighborsBloom[j].to) << std::endl;
+            bad = true;
+        }
+
+        if (neighborsAdj[j].from != neighborsBloom[j].from)
+        {
+            std::cout << prefix << "#### node " << this->toString(node) << " neighbor error: neighborsAdj[j].from = " << this->toString(neighborsAdj[j].from) << ", neighborsBloom[j].from = " << this->toString(neighborsBloom[j].from) << std::endl;
+            bad = true;
+        }
+        if (neighborsAdj[j].nt != neighborsBloom[j].nt)
+        {
+            std::cout << prefix << "#### node " << this->toString(node) << " nucleotide error: neighborsAdj[j].nt=" << neighborsAdj[j].nt << ", neighborsBloom[j].nt=" << neighborsBloom[j].nt << std::endl;
+            bad = true;
+        }
+
+    }
+    return bad;
+}
+
+// TODO: it makes sense someday to introduce a graph._nbCore parameter, because this function, simplify() and precomputeAdjacency() all want it
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::deleteNodesByIndex(vector<bool> &bitmap, int nbCores, gatb::core::system::ISynchronizer* synchro) const
+{
+    GraphIterator<Node> itNode = this->iterator();
+    Dispatcher dispatcher (nbCores); 
+
+    dispatcher.iterate (itNode, [&] (Node& node)        {
+
+        unsigned long i = this->nodeMPHFIndex(node); 
+
+        if (bitmap[i])
+        {
+            // make this deletion atomic with respect to other node deletions
+            if (synchro)
+                synchro->lock();
+
+            this->deleteNode(node);
+
+            if (synchro)
+                synchro->unlock();
+        }
+    }); // end of parallel node iteration
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::simplify(unsigned int nbCores, bool verbose)
+{
+        Simplifications<GraphTemplate<Node, Edge, GraphDataVariant>,Node,Edge> 
+            graphSimplifications(*this, nbCores, verbose);
+        graphSimplifications.simplify();
+}
+
+
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct cacheNonSimpleNode_visitor : public boost::static_visitor<void>    {
+    const Node& node;
+
+    cacheNonSimpleNode_visitor (const Node& node) : node(node) {}
+
+    template<size_t span> void operator() (const GraphData<span>& data) const
+    {
+        typedef typename Kmer<span>::Type Type;
+        Type value = node.template getKmer<Type>();
+        if (data._nodecache->find(value) != data._nodecache->end())
+            return; // don't overwrite existing cached node
+        // add dummy cached sequence info
+        std::pair<char,string> dummy (-1,"");
+        (*(data._nodecache))[value] = dummy;
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::cacheNonSimpleNode(const Node& node) const 
+{
+    bool _cacheNonSimpleNodes = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_NONSIMPLE_CACHE;
+    if (!_cacheNonSimpleNodes)
+        return; // don't do anything if we don't cache nodes
+    boost::apply_visitor (cacheNonSimpleNode_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct cacheNonSimpleNodeDelete_visitor : public boost::static_visitor<void>    {
+
+    const Node& node;
+
+    cacheNonSimpleNodeDelete_visitor (const Node& node) : node(node) {}
+
+    template<size_t span> void operator() (const GraphData<span>& data) const
+    {
+        typedef typename Kmer<span>::Type Type;
+        Type value = node.template getKmer<Type>();
+        typename GraphData<span>::NodeCacheMap::iterator pos = data._nodecache->find(value);
+        if (pos != data._nodecache->end())
+            data._nodecache->erase(pos);
+      //  else
+      //      std::cout << "Warning: attempting to delete a node from the cache, but it wasn't present." << std::endl;
+      /* not printing that warning because will call the deleter on any node that's deleted, not just branching ones */
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::cacheNonSimpleNodeDelete(const Node& node) const 
+{
+    bool _cacheNonSimpleNodes = getState() & GraphTemplate<Node, Edge, GraphDataVariant>::STATE_NONSIMPLE_CACHE;
+    if (!_cacheNonSimpleNodes)
+        return; // don't do anything if we don't cache nodes
+    boost::apply_visitor (cacheNonSimpleNodeDelete_visitor<Node, Edge, GraphDataVariant>(node),  *(GraphDataVariant*)_variant);
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant> 
+struct allocateNonSimpleNodeCache_visitor : public boost::static_visitor<void>    {
+
+    template<size_t span> void operator() (GraphData<span>& data) const 
+    {
+        data.setNodeCache(new typename GraphData<span>::NodeCacheMap);
+    }
+};
+
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+void GraphTemplate<Node, Edge, GraphDataVariant>::cacheNonSimpleNodes(unsigned int nbCores, bool verbose) 
+{
+    boost::apply_visitor (allocateNonSimpleNodeCache_visitor<Node, Edge, GraphDataVariant>(),  *(GraphDataVariant*)_variant);
+    setState(GraphTemplate<Node, Edge, GraphDataVariant>::STATE_NONSIMPLE_CACHE);
+    GraphIterator<Node> itNode = this->iterator();
+    Dispatcher dispatcher (nbCores); 
+    system::ISynchronizer* synchro = system::impl::System::thread().newSynchronizer();
+    unsigned long nbCachedNodes = 0;
+    dispatcher.iterate (itNode, [&] (Node& node)        {
+        if (this->isNodeDeleted(node)) return; // test
+        if (this->isBranching(node))
+        {
+            synchro->lock();
+            this->cacheNonSimpleNode(node);
+            __sync_fetch_and_add(&nbCachedNodes,1);
+            synchro->unlock();
+        }
+    }); // end of parallel node iteration
+    std::cout << "Cached " << nbCachedNodes << " non-simple nodes" << std::endl;
+}
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct cached_nodes_visitor : public boost::static_visitor<tools::dp::ISmartIterator<Node>*>
+{
+    const GraphTemplate<Node, Edge, GraphDataVariant>& graph;
+    cached_nodes_visitor (const GraphTemplate<Node, Edge, GraphDataVariant>& graph) : graph(graph) {}
+
+    // we should really use STL iterators in the next rewrite.
+    template<size_t span>  tools::dp::ISmartIterator<Node>* operator() (const GraphData<span>& data) const
+    {
+        class CachedNodeIterator : public tools::dp::ISmartIterator<Node>
+        {
+        public:
+            CachedNodeIterator (typename GraphData<span>::NodeCacheMap *nodecache)
+                : _nodecache(nodecache), _rank(0), _isDone(true) {  
+                    this->_item->strand = STRAND_FORWARD;  // iterated nodes are always in forward strand.
+                }
+
+            u_int64_t rank () const { return _rank; }
+
+            /** \copydoc  Iterator::first */
+            void first()
+            {
+                _it = _nodecache->begin();
+                _rank   = 0;
+                _isDone = _it == _nodecache->end();
+
+                if (!_isDone)
+                {
+                    this->_rank ++;
+                    this->_item->kmer      = _it->first;
+                    this->_item->abundance = 0; // not recorded
+                    this->_item->mphfIndex = 0;
+                    this->_item->iterationRank = this->_rank;
+                }
+            }
+
+            /** \copydoc  Iterator::next */
+            void next()
+            {
+                _it++;
+                _isDone = _it == _nodecache->end();
+                if (!_isDone)
+                {
+                    // NOTE: doesn't check if node is deleted (as it would be expensive to compute MPHF index)
+                    this->_rank ++;
+                    this->_item->kmer      = _it->first;
+                    this->_item->abundance = 0; // not recorded
+                    this->_item->mphfIndex = 0;
+                    this->_item->iterationRank = this->_rank;
+                }
+            }
+
+            /** \copydoc  Iterator::isDone */
+            bool isDone() { return _isDone;  }
+
+            /** \copydoc  Iterator::item */
+            Node& item ()  {  return *(this->_item);  }
+
+            /** */
+            u_int64_t size () const { return _nodecache->size(); }
+
+        private:
+            typename GraphData<span>::NodeCacheMap *_nodecache;
+            typename GraphData<span>::NodeCacheMap::iterator _it;
+
+            u_int64_t _rank;
+            bool      _isDone;
+            u_int64_t _nbItems;
+        };
+
+        return new CachedNodeIterator (data._nodecache);
+    }
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+GraphIterator<Node> GraphTemplate<Node, Edge, GraphDataVariant>::iteratorCachedNodes() const
+{
+    return GraphIterator<Node> (boost::apply_visitor (cached_nodes_visitor<Node,Edge, GraphDataVariant>(*this),  *(GraphDataVariant*)_variant));
+}
+
+
+// instantiation
+// uses Node and Edge as defined in Graph.hpp (legacy GATB compatibility, when Graph was not templated)
+template class GraphTemplate<Node, Edge, GraphDataVariant>; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
diff --git a/gatb-core/src/gatb/debruijn/impl/Graph.hpp b/gatb-core/src/gatb/debruijn/impl/Graph.hpp
new file mode 100644
index 0000000..9728e91
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Graph.hpp
@@ -0,0 +1,1354 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Graph.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Graph class
+ */
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_GRAPH_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_GRAPH_HPP_
+
+/********************************************************************************/
+#include <vector>
+#include <set>
+
+#include <unordered_map>
+
+#include <gatb/system/api/IThread.hpp> // for ISynchronizer
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/tools/math/Integer.hpp>
+
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/kmer/impl/MPHFAlgorithm.hpp>
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/debruijn/impl/NodesDeleter.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for De Bruijn graph management. */
+namespace debruijn  {
+/** \brief Implementation package for De Bruijn graph management. */
+namespace impl      {
+
+/********************************************************************************/
+
+enum Direction
+{
+    DIR_OUTCOMING = 1,
+    DIR_INCOMING = 2,
+    DIR_END = 3
+};
+
+inline std::string toString (Direction d)
+{
+    if (d==DIR_OUTCOMING)      { return std::string("OUT"); }
+    else if (d==DIR_INCOMING)  { return std::string("IN");  }
+    else { return std::string ("???"); }
+}
+
+inline Direction reverse (Direction dir)  { return dir==DIR_OUTCOMING ? DIR_INCOMING : DIR_OUTCOMING; }
+
+// Quite ugly... should be improved...
+#define foreach_direction(d)  for (Direction d=DIR_OUTCOMING; d<DIR_END; d = (Direction)((int)d + 1) )
+
+
+/********************************************************************************
+                        #     #  #######  ######   #######
+                        ##    #  #     #  #     #  #
+                        # #   #  #     #  #     #  #
+                        #  #  #  #     #  #     #  #####
+                        #   # #  #     #  #     #  #
+                        #    ##  #     #  #     #  #
+                        #     #  #######  ######   #######
+********************************************************************************/
+
+/** \brief Node structure representing a node in the De Bruijn graph
+ *
+ * The Node structure needs at least two attributes for uniquely defining a node in the DBG:
+ *  - a kmer value (representing a node and its reverse complement)
+ *  - a strand value (telling on which strand the kmer has to be interpreted)
+ *
+ *  A specific Node::Value type is defined for the kmer type. It may be used sometimes when one
+ *  wants to perform some action on a node without the need to know the strand.
+ *
+ *  Although it is possible to instantiate "from scratch" a Node object, it is likely that Node
+ *  objects are retrieved through the Graph class. Indeed, a Node object is likely to be useful
+ *  if it belongs to a graph, so it makes sense that the Graph class is the main actor for providing
+ *  Node objects.
+ *
+ *  The Node structure may be inherited by other structure, mainly for refining some characteristics
+ *  for some kinds of nodes. For instance, a BranchingNode structure may be defined for nodes that have
+ *  more than one incoming and/or outcoming neighbors. Such inherited structures could be understood as
+ *  regular Node instance with a specific invariant. They can also be the material for specialization of
+ *  some template methods of the Graph class (see for instance Graph::iterator template specialization
+ *  for the BranchingNode structure).
+ *
+ *  The Node structure has also a 'abundance' attribute; it gives the occurrences number of the kmer in
+ *  the initial set of reads. Note that this attribute has a correct value only when nodes are iterated 
+ *  (from the solid kmers on disk). When Node objects are created via the Graph API (e.g. using
+ *  as a result of buildNode, successors(), predecessors(), etc..), developers should not assume
+ *  that the 'abundance' attribute is correctly set. Use the queryAbundance() function instead to get
+ *  the abundance of a node.
+ */
+
+template <typename Value_t=tools::math::Integer>
+struct Node_t
+{
+    /** Type for a kmer value. */
+    typedef Value_t Value;
+
+    /** Default constructor. */
+    Node_t() : strand(kmer::STRAND_FORWARD), abundance(0), mphfIndex(0) , iterationRank(0) {}
+
+    /** Constructor.
+     * \param[in] kmer : kmer value. By default, it is the minimum value of the forward and revcomp value.
+     * \param[in] strand : strand telling how to interpret the kmer value. Default value is forward by convention.
+     * \param[in] abundance : abundance of the kmer. Default value is 0 if not set.
+     */
+    Node_t (const Node_t::Value& kmer, kmer::Strand strand=kmer::STRAND_FORWARD, u_int16_t abundance=0, u_int64_t mphfIndex = 0)
+        : kmer(kmer), strand(strand), abundance(abundance), mphfIndex(mphfIndex) , iterationRank(0) {}
+
+    /** kmer value for the node (min of the forward and revcomp value of the bi-directed DB graph). */
+    Node_t::Value  kmer;
+
+    /** Strand telling how to interpret the node in the bi-directed DB graph. */
+    kmer::Strand strand;
+
+    /** Abundance of the kmer in the initial set of reads. */
+    u_int16_t    abundance;
+
+    u_int64_t mphfIndex;
+    u_int64_t iterationRank; // used in Simplifications.cpp (see note on tips)
+
+    /** Overload of operator ==  NOTE: by now, it doesn't take care of the strand... */
+    bool operator== (const Node_t& other) const  { return kmer == other.kmer; }
+
+    /** Overload of operator !=  NOTE: by now, it doesn't take care of the strand... */
+    bool operator!= (const Node_t& other) const  { return kmer != other.kmer; }
+
+    /** Overload of operator <  NOTE: by now, it doesn't take care of the strand... */
+    bool operator< (const Node_t& other) const  { return (kmer   < other.kmer); }
+
+    /** Setter for some attributes of the Node object. Usually used by the Graph class for setting
+     * a Node object's guts.
+     * \param[in] kmer : the kmer value to be set
+     * \param[in] strand : strand to be set
+     */
+    void set (const Node_t::Value& kmer, const kmer::Strand& strand)
+    {
+        this->kmer      = kmer;
+        this->strand    = strand;
+        this->mphfIndex = 0;
+        this->iterationRank = 0;
+    }
+
+    template<typename T>
+    const T& getKmer() const;
+};
+
+template <> 
+template<typename T>
+const T& Node_t<tools::math::Integer>::getKmer() const
+{
+    return this->kmer.get<T>();
+}
+
+/********************************************************************************/
+
+/** \brief Specific Node structure representing a branching node in the De Bruijn graph
+ *
+ * The BranchingNode inherits from the Node structure.
+ *
+ * Its semantics is to define nodes this way:
+ *      indegree!=1 || outdegree!=1
+ *
+ * Note: with such a definition, nodes that are tips (ie indegree==0 || outdegree=0) are considered
+ * as branching. This could be refined if needed (defined this way for historical matters).
+ *
+ * Its main usage is to be the template specialization type for some Graph class methods.
+ */
+template<typename Node>
+struct BranchingNode_t : Node
+{
+};
+
+/********************************************************************************/
+
+/** \brief Specific Node structure representing a simple node in the De Bruijn graph
+ *
+ * The SimpleNode inherits from the Node structure.
+ *
+ * Its semantics is to define nodes this way:
+ *      indegree==1 && outdegree==1
+ *
+ * Its main usage is to be the template specialization type for some Graph class methods.
+ */
+template <typename Node>
+struct SimpleNode : Node
+
+{
+};
+
+/********************************************************************************
+                        #######  ######    #####   #######
+                        #        #     #  #     #  #
+                        #        #     #  #        #
+                        #####    #     #  #  ####  #####
+                        #        #     #  #     #  #
+                        #        #     #  #     #  #
+                        #######  ######    #####   #######
+********************************************************************************/
+
+/** \brief Definition of an Edge, ie a transition between two nodes in the De Bruijn graph.
+ *
+ * The Edge structure represents an oriented transition between two nodes. Therefore, it holds:
+ *  - the 'from' node
+ *  - the 'to' node
+ *  - the direction of the transition
+ *  - the nucleotide that decorates the transition
+ *
+ *  The Edge objects are mainly provided by the Graph class, for instance when neighbors of a node
+ *  are needed.
+ *
+ *  The Edge structure may be used as a template specialization type for some Graph class methods.
+ */
+template <typename Node_t>
+struct Edge_t
+{
+    /** The source node of the edge. */
+    Node_t             from;
+
+    /** The target node of the edge. */
+    Node_t             to;
+
+    /** The transition nucleotide. */
+    kmer::Nucleotide nt;
+
+    /** The direction of the transition. */
+    Direction        direction;
+    
+    /** Overload of operator <.  May not really mean much to compare edges, but is used in Minia's graph simplifications */
+    bool operator< (const Edge_t<Node_t>& other) const  { return ((from < other.from) || (from == other.from && to < other.to)); }
+
+    /** Setter for some attributes of the Edge object.
+     * \param[in] kmer_from : kmer value of the 'from' Node
+     * \param[in] strand_from : strand of the 'from' Node
+     * \param[in] kmer_to : kmer value of the 'to' Node
+     * \param[in] strand_to : strand of the 'to' Node
+     * \param[in] n : the transition nucleotide
+     * \param[in] dir : direction of the transition.
+     */
+    void set (
+        const typename Node_t::Value& kmer_from, kmer::Strand strand_from,
+        const typename Node_t::Value& kmer_to,   kmer::Strand strand_to,
+        kmer::Nucleotide n, Direction dir
+    )
+    {
+        from.set (kmer_from, strand_from);
+        to.set   (kmer_to,   strand_to);
+        nt = n;
+        direction = dir;
+    }
+};
+
+
+/********************************************************************************/
+
+/** \brief Specific Edge structure representing a transition between two branching nodes
+ *
+ * The BranchingEdge inherits from the Edge structure.
+ *
+ * Note that we don't want here to get the whole simple nodes between the two branching nodes
+ * (or all the transition nucleotides required to go from source branching node to target branching node).
+ *
+ * However, we add a 'distance' attribute that counts the number of transition nucleotides between the two
+ * branching nodes.
+ */
+template<typename Node, typename Edge>
+struct BranchingEdge_t : Edge 
+{
+    void set (
+        const typename Node::Value& kmer_from, kmer::Strand strand_from,
+        const typename Node::Value& kmer_to,   kmer::Strand strand_to,
+        kmer::Nucleotide nt, Direction dir, size_t distance
+    )
+    {
+        Edge::set (kmer_from, strand_from, kmer_to, strand_to, nt, dir);
+        this->distance = distance;
+    }
+
+    // number of simple nodes between the two branching nodes
+    size_t distance;
+};
+
+/********************************************************************************
+                    ######      #     #######  #     #
+                    #     #    # #       #     #     #
+                    #     #   #   #      #     #     #
+                    ######   #     #     #     #######
+                    #        #######     #     #     #
+                    #        #     #     #     #     #
+                    #        #     #     #     #     #
+********************************************************************************/
+
+/** \brief Structure representing a path in the De Bruijn graph.
+ *
+ * The Path structure provides information on a linear path in the DB graph. It mainly holds
+ * the succession of nucleotides that define the path.
+ *
+ * The path start is defined by an Node object, which defines without ambiguity the first
+ * node of the path.
+ *
+ * It can be used by clients such a contiger tool.
+ *
+ * Note: by now, the structure is not perfect and some adaptations could come.
+ */
+template<typename Node>
+struct Path_t
+{
+    /** Constructor (default one)
+     * \param[in] n : size of the path. */
+    Path_t (size_t n=0) : path(n) {}
+
+    /** Node defining the initial transition of the path. */
+    Node start;
+
+    /** Path definition as a succession of nucleotides. */
+    std::vector<kmer::Nucleotide> path;
+
+    /** Get the path size
+     * \return the size of the path. */
+    size_t size() const  { return path.size(); }
+
+    /** Set the size of the path
+     * \param[in] n : the size of the path. */
+    void resize (size_t n) { path.resize(n); }
+
+    /** Get the ascii value of the ith nucleotide in the path.
+     * \param[in] i : index of the nucleotide
+     * \return the ascii code for the ith nucleotide. */
+    char ascii (size_t i) const { return gatb::core::kmer::ascii((*this)[i]); }
+
+    /** Add a nucleotide to the path.
+     * \param[in] nt : nucleotide to be appended to the path. */
+    void push_back (kmer::Nucleotide nt)  { path.push_back(nt); }
+
+    /** Clear the path (ie remove all the nucleotides). */
+    void clear () { path.clear(); }
+
+    /** Retrieve a reference on the ith nucleotide in the path.
+     * \param[in] i : index od the nucleotide to be retrieved.
+     * \return a reference on the ith nucleotide */
+    kmer::Nucleotide& operator[] (size_t i)        { return path[i]; }
+
+    /** Retrieve a reference on the ith nucleotide in the path.
+     * \param[in] i : index od the nucleotide to be retrieved.
+     * \return a const reference on the ith nucleotide */
+    const kmer::Nucleotide& operator[] (size_t i) const  { return path[i]; }
+};
+
+/** Define a comparator for two path. The comparison is a lexicographic comparison on
+ * the ascii representation of the path.
+ * \param[in] a : path a
+ * \param[in] b : path b
+ * \return true if path a is less than path b. */
+template <typename T>
+inline bool operator< (const Path_t<T>& a, const Path_t<T>& b)
+{
+    size_t N = std::min(a.size(),b.size());
+    for (size_t i=0; i<N; i++)
+    {
+             if (a.ascii(i) < b.ascii(i)) { return true;  }
+        else if (a.ascii(i) > b.ascii(i)) { return false; }
+    }
+    return a.size() < b.size();
+}
+
+
+/** Output stream operator for dumping a Path object as an ascii string
+ * holding the nucleotides of the path.
+ * \param[in] s : the output stream
+ * \param[in] p : the path to be output
+ * \return the output stream.
+ */
+template <typename T>
+inline std::ostream& operator<< (std::ostream& s, const Path_t<T>& p)
+{
+    for (size_t i=0; i<p.size(); i++)  { s << p.ascii(i); }
+    return s;
+}
+
+/* vector and iterator
+ */
+
+/* this was previously a member of GraphTemplate::, and it was named Iterator
+ * but I see no reason to, no i'm moving it here and calling it GraphIterator
+ * it will help readability and convenience: no more need to pass
+ * template parameters <Node,Edge,GraphDataVariant>
+ */
+template<typename Item>
+class GraphIterator : public tools::dp::ISmartIterator<Item>
+{
+    public:
+
+        /** */
+        GraphIterator (tools::dp::ISmartIterator<Item>* ref) : _ref(0) { setRef(ref); }
+
+        /* empty iterator, just for debug purposes, shouldn't be used */
+        GraphIterator () : _ref(0) {  std::cout << "empty GraphIterator used (shouldn't happen)" << std::endl; }
+
+        /** */
+        virtual ~GraphIterator() { setRef(0); }
+
+        /** */
+        GraphIterator (const GraphIterator<Item>& i) : _ref(0) { setRef(i._ref); }
+
+        /** */
+        GraphIterator& operator= (const GraphIterator<Item>& i)  {  if (this != &i)   {  setRef (i._ref);  }   return *this;  }
+
+        /** Method that the number of iterated items so far. */
+        virtual u_int64_t rank() const  { return _ref->rank(); }
+
+        /** Method that initializes the iteration. */
+        void first()  { _ref->first(); }
+
+        /** Method that goes to the next item in the iteration.
+         * \return status of the iteration
+         */
+        void next()  { _ref->next(); }
+
+        /** Method telling whether the iteration is finished or not.
+         * \return true if iteration is finished, false otherwise.
+         */
+        bool isDone()  { return _ref->isDone(); }
+
+        /** Method that returns the current iterated item. Note that the returned type is the template type.
+          \return the current item in the iteration.
+          */
+        Item& item () { return _ref->item(); }
+
+        /** */
+        void setItem (Item& i)  {  _ref->setItem (i); }
+
+        /** */
+        u_int64_t size () const  { return _ref->size(); }
+
+        /** */
+        tools::dp::ISmartIterator<Item>* get()  const { return _ref; }
+
+    private:
+
+        tools::dp::ISmartIterator<Item>* _ref;
+        void setRef (tools::dp::ISmartIterator<Item>* ref)  { SP_SETATTR(ref); }
+};
+
+/* exactly same comment as GraphIterator above*/
+template<typename Item, int NB=16 /* TODO bring it down to 8 whenever possible; or try with a much higher value (e.g. 128) and see if there is actually a performance hit*/>
+class GraphVector
+{
+    public:
+        GraphVector () : _size(0)  {} 
+        Item& operator[] (size_t idx)  { return (_items[idx]); }
+        size_t size()  { return _size; }
+        void resize (size_t n)  { _size = n; }
+
+        template<typename Functor>  void iterate (const Functor& f)  { for (size_t i=0; i<_size; i++)  { f(_items[i]); } }
+
+    protected:
+        Item   _items[NB];
+        size_t _size;
+};
+
+
+
+
+
+/********************************************************************************
+                 #####   ######      #     ######   #     #
+                #     #  #     #    # #    #     #  #     #
+                #        #     #   #   #   #     #  #     #
+                #  ####  ######   #     #  ######   #######
+                #     #  #   #    #######  #        #     #
+                #     #  #    #   #     #  #        #     #
+                 #####   #     #  #     #  #        #     #
+********************************************************************************/
+
+/** \brief Class representing a De Bruijn graph.
+ *
+ * This class is the entry point for managing De Bruijn class in gatb-core.
+ *
+ * Getting a Graph object can be done through :
+ *      - creating Graph object (likely from a set of reads).
+ *      - loading a Graph object from a file
+ *
+ * Once a client has a Graph object (with create or load), it is possible to goes
+ * through the graph in different ways.
+ *
+ * The first possibility is to use a Node iterator on the globality of the graph. For
+ * instance, all the nodes can be iterated this way, or only branching nodes.
+ *
+ * The second possibility is to navigate starting from a specific node. For instance,
+ * the neighbors of the starting node can be reached.
+ *
+ * Note: the Graph class doesn't provide means to mark nodes (ie remember which nodes
+ * have been visited); this feature could be let to subclasses or other helpers classes.
+ *
+ * Some utility methods may be useful for debugging (like ascii representation of a node
+ * or an edge).
+ *
+ * The underlying structure of the graph is taken from Minia:
+ *      - a Bloom filter
+ *      - a set of false positives
+ *
+ * Once a graph is built (from a set of reads), it is saved in a file (likely HDF5 format).
+ * It is so possible to get a Graph object by loading the file instead of re-build it.
+ *
+ * Note: branching nodes are computed during the graph building; they are also saved in the graph
+ * output file.
+ */
+template <typename Node, typename Edge, typename GraphDataVariant>
+class GraphTemplate
+{
+public:
+
+    /********************************************************************************/
+    /*                            STATIC METHODS   (create/load)                    */
+    /********************************************************************************/
+
+    /** Build an empty graph.
+     * \param[in] kmerSize: kmer size
+     * \return the created graph.
+     */
+    static GraphTemplate  create (size_t kmerSize)  {  return  GraphTemplate(kmerSize);  }
+
+    /** Build a graph from a given bank.
+     * \param[in] bank : bank to get the reads from
+     * \param[in] fmt : printf-like format for the command line string
+     * \return the created graph.
+     */
+    static GraphTemplate  create (bank::IBank* bank, const char* fmt, ...);
+
+    /** Build a graph from user options.
+     * \param[in] fmt: printf-like format
+     * \return the created graph.
+     */
+    static GraphTemplate  create (const char* fmt, ...);
+
+    /** Build a graph from scratch.
+     * \param[in] options : user parameters for building the graph.
+     * \return the created graph.
+     */
+    static GraphTemplate  create (tools::misc::IProperties* options)  {  return  GraphTemplate (options);  }
+
+    /** Load a graph from some URI.
+     * \param[in] uri : the uri to get the graph from
+     * \return the loaded graph.
+     */
+    static GraphTemplate  load (const std::string& uri)  {  return  GraphTemplate (uri);  }
+
+    /** Get a parser object that knows the user options for building a graph.
+     * \return the options parser object.
+     */
+    static tools::misc::IOptionsParser* getOptionsParser (bool includeMandatory=true);
+
+    /********************************************************************************/
+    /*                               CONSTRUCTORS                                   */
+    /********************************************************************************/
+
+    /* Default Constructor.*/
+    GraphTemplate ();
+
+    /* Copy Constructor.*/
+    GraphTemplate (const GraphTemplate& graph);
+
+    /* Destructor. */
+    ~GraphTemplate ();
+
+    /** Affectation overload. */
+    GraphTemplate& operator= (const GraphTemplate& graph);
+
+    /**********************************************************************/
+    /*                     GLOBAL ITERATOR METHODS                        */
+    /**********************************************************************/
+
+    /** Creates an iterator over nodes of the graph.
+     *      this used to be a templated method but I'm now untemplating it, because of nested templates specialization
+     *      so call iteratorBranching if you want an iterator over BranchingNode's
+     * \return the nodes iterator. */
+
+    inline GraphIterator<Node> iterator () const  {  return getNodes ();           }
+    inline GraphIterator<BranchingNode_t<Node> > iteratorBranching () const  {  return getBranchingNodes ();           }
+    GraphIterator<Node> iteratorCachedNodes () const;
+
+
+    /**********************************************************************/
+    /*                     ALL NEIGHBORS METHODS                          */
+    /**********************************************************************/
+
+    /** Returns a vector of neighbors of the provided node.
+     * \param[in] node : the node whose neighbors are wanted
+     * \param[in] direction : the direction of the neighbors. If not set, out and in neighbors are computed.
+     * \return a vector of the node neighbors (may be empty). 
+     * Warning: be sure to check if edge.from (or node.from) is actually your input node, or its reverse complement.
+     */
+    inline GraphVector<Node> neighbors    ( Node& node, Direction dir=DIR_END) const  {  return getNodes(node, dir);           }
+    
+    /** Returns a vector of neighbors of the provided kmer. It has to be understood as the following:
+     *  - a node N is built with the kmer, with the strand FORWARD
+     *  - a call to 'neighbors<T> (N,          DIR_OUTGOING)' is done; we get v1
+     *  - a call to 'neighbors<T> (reverse(N), DIR_OUTGOING)' is done; we get v2
+     *  - the result is the concatenation of v1 and v2
+     *  \param[in] kmer : the kmer whose neighbors are wanted.
+     *  \return a vector of the neighbors (may be empty).
+     */
+    inline GraphVector<Node> neighbors    ( const typename Node::Value& kmer) const          {  return getNodeValues (kmer);           }
+    
+    inline Node* neighborsDummy      ( Node& node, Direction dir=DIR_END) const  {   return NULL;           }
+
+
+    /* neighbors used to be templated.. not anymore, trying to avoid nested template specialization; 
+     * so call neighbors for getting nodes, or neighborsEdge for getting edges */
+    inline GraphVector<Edge> neighborsEdge    ( Node& node, Direction dir=DIR_END) const  {   return getEdges(node, dir);           }
+    inline Edge* neighborsDummyEdge      ( Node& node, Direction dir=DIR_END) const  {   return NULL;           }
+    inline GraphVector<Edge> neighborsEdge    ( const typename Node::Value& kmer) const          {  return getEdgeValues (kmer);           }
+
+
+    inline GraphVector<BranchingNode_t<Node> > neighborsBranching(Node& node, Direction direction) const
+    { return getBranchingNodeNeighbors (node, direction);  }
+
+    inline GraphVector<BranchingNode_t<Node> > neighborsBranching(const typename Node::Value& kmer) const
+    { return getBranchingNodeValues (kmer);  }
+
+     inline GraphVector<BranchingEdge_t<Node,Edge> > neighborsBranchingEdge (Node& node, Direction direction) const
+    { return getBranchingEdgeNeighbors (node, direction);  }
+
+    inline GraphVector<BranchingEdge_t<Node,Edge> > neighborsBranchingEdge (const typename Node::Value& kmer) const
+    { return getBranchingEdgeValues (kmer);  }
+
+
+
+    /** Shortcut for 'neighbors' method with direction==DIR_OUTCOMING.
+     * \param[in] node : the node whose neighbors are wanted
+     * \return a vector of the node neighbors (may be empty).
+     */
+    inline GraphVector<Node> successors   ( Node& node) const                 {  return getNodes(node, DIR_OUTCOMING); }
+
+    /** Shortcut for 'neighbors' method with direction==DIR_INCOMING.
+     * \param[in] node : the node whose neighbors are wanted
+     * \return a vector of the node neighbors (may be empty).
+     */
+    inline GraphVector<Node> predecessors ( Node& node) const                 {  return getNodes(node, DIR_INCOMING);  }
+    
+    inline GraphVector<Edge> successorsEdge   ( Node& node) const                 {  return getEdges(node, DIR_OUTCOMING); }
+    inline GraphVector<Edge> predecessorsEdge ( Node& node) const                 {  return getEdges(node, DIR_INCOMING);  }
+
+    inline GraphVector<BranchingNode_t<Node> > successorsBranching (Node& node) const
+        { return getBranchingNodeNeighbors (node, DIR_OUTCOMING);  }
+
+    inline GraphVector<BranchingNode_t<Node> > predecessorsBranching (Node& node) const
+        { return getBranchingNodeNeighbors (node, DIR_INCOMING);  }
+
+    inline GraphVector<BranchingEdge_t<Node,Edge> > successorsBranchingEdge (Node& node) const
+        { return getBranchingEdgeNeighbors (node, DIR_OUTCOMING);  }
+
+    inline GraphVector<BranchingEdge_t<Node,Edge> > predecessorsBranchingEdge (Node& node) const
+        { return getBranchingEdgeNeighbors (node, DIR_INCOMING);  }
+
+
+    /** Returns a set of neighbors for each node iterated with the provided two iterators
+     * \param[in] first : beginning of the iteration
+     * \param[in] last : end of the iteration
+     * \return all the neighbors computed for each iterated node. */
+    /* used to be a template, but I can't specialize it without specializing the whole graph templated class now. so got rid of templates for now*/
+    //template <typename T, typename IteratorInput>
+    //std::set<T> neighbors (IteratorInput first, IteratorInput last) const;
+    std::set<BranchingNode_t<Node> > neighbors (typename std::set<BranchingNode_t<Node> >::iterator first, typename std::set<BranchingNode_t<Node> >::iterator last) const;
+
+    /** Returns the successors of two nodes, ie with the same transition nucleotide from both nodes.
+     * \param[in] node1 : first node
+     * \param[in] node2 : sedond node
+     * \return the vector of pairs of items as successors
+     */
+    inline GraphVector<std::pair<Edge,Edge> > successorsEdge (const Node& node1, const Node& node2) const
+    { return getEdgesCouple (node1, node2, DIR_OUTCOMING); }
+
+    inline GraphVector<std::pair<Node,Node> > successors (const Node& node1, const Node& node2) const
+    { return getNodesCouple (node1, node2, DIR_OUTCOMING); }
+
+    /** Returns the predecessors of two nodes, ie with the same transition nucleotide from both nodes.
+     * \param[in] node1 : first node
+     * \param[in] node2 : sedond node
+     * \return the vector of pairs of items as predecessors
+     */
+    inline GraphVector<std::pair<Edge,Edge> > predecessorsEdge (const Node& node1, const Node& node2) const
+    { return getEdgesCouple (node1, node2, DIR_INCOMING); }
+
+    inline GraphVector<std::pair<Node,Node> > predecessors (const Node& node1, const Node& node2) const
+    { return getNodesCouple (node1, node2, DIR_INCOMING); }
+
+
+    /**********************************************************************/
+    /*                     ONE NEIGHBOR METHODS                           */
+    /**********************************************************************/
+
+    /** Return a specific neighbor from a given node. The neighbor is defined by a direction and the transition
+     * nucleotide.
+     * IMPORTANT: this method will not check that the neighbor node belongs to the graph: it merely
+     * computes the next kmer but doesn't check the Bloom filter. It is supposed that the client has already asked
+     * for the neighbors and so knows the valid transitions.
+     * \param[in] source : the source neighbor
+     * \param[in] dir : the direction of the transition
+     * \param[in] nt : the nucleotide of the transition
+     * \return the neighbor object.
+     */
+    inline Node neighbor ( Node& source, Direction dir, kmer::Nucleotide nt) const
+    {  bool exists=true; return getNode (source, dir, nt, exists);  }
+
+    /** Return a specific neighbor from a given node. The neighbor is defined by a direction and the transition
+     * nucleotide.
+     * IMPORTANT: this method will check that the neighbor node belongs to the graph. If the neighbor is not in the
+     * graph, the 'exists' parameter is set to false, true otherwise.
+     * \param[in] source : the source neighbor
+     * \param[in] dir : the direction of the transition
+     * \param[in] nt : the nucleotide of the transition
+     * \param[out] exists : yes means that the neighbor is in the graph, false otherwise
+     * \return the neighbor object.
+     */
+    inline Node neighbor ( Node& source, Direction dir, kmer::Nucleotide nt, bool& exists) const
+    {  return getNode (source, dir, nt, exists);  }
+
+    /** Shortcut for neighbor with dir==DIR_OUTCOMING. */
+    inline Node successor ( Node& source, kmer::Nucleotide nt) const
+    {  bool exists=true; return getNode (source, DIR_OUTCOMING, nt, exists);  }
+
+    inline Node successor ( Node& source, kmer::Nucleotide nt, bool& exists) const
+    {  return getNode (source, DIR_OUTCOMING, nt, exists);  }
+
+   
+    /** Shortcut for neighbor with dir==DIR_INCOMING. */
+    inline Node predecessor ( Node& source, kmer::Nucleotide nt) const
+    {  bool exists=true; return getNode (source, DIR_INCOMING, nt, exists);  }
+
+    inline Node predecessor ( Node& source, kmer::Nucleotide nt, bool& exists) const
+    {  return getNode (source, DIR_INCOMING, nt, exists);  }
+
+
+    /**********************************************************************/
+    /*                      MISC NEIGHBORS METHODS                        */
+    /**********************************************************************/
+
+    /** Get the incoming degree of the node.
+     * \param[in] node : the node
+     * \return the indegree of the node. */
+    size_t indegree  (Node& node) const;
+
+    /** Get the outcoming degree of the node.
+     * \param[in] node : the node
+     * \return the outdegree of the node. */
+    size_t outdegree (Node& node) const;
+
+    /** Get the degree of the node (either incoming or outcoming).
+     * \param[in] node : the node
+     * \param[in] dir : direction of the degree
+     * \return the degree of the node. */
+    size_t degree    (Node& node, Direction dir) const;
+    
+    /* get both the in and out degree of a node, in a single call
+     * takes advantage of adjacency
+     */
+    void degree    (Node& node, size_t& in, size_t &out) const;
+    
+    /**********************************************************************/
+    /*                      SIMPLIFICATION METHODS                        */
+    /**********************************************************************/
+
+    /* perform tip removal, bulge removal and EC removal, as in Minia */
+    void simplify(unsigned int nbCores = 1, bool verbose=true);
+
+    /**********************************************************************/
+    /*                         SIMPLE PATH METHODS                        */
+    /**********************************************************************/
+
+    /** Simple paths traversal
+     *  invariant: the input kmer has no in-branching.
+     * \returns
+     *       1 if a good extension is found
+     *       0 if a deadend was reached
+     *      -1 if out-branching was detected
+     *      -2 if no out-branching but next kmer has in-branching
+     */
+    int simplePathAvance (Node& node, Direction dir, Edge& output) const;
+
+    /** */
+    int simplePathAvance (Node& node, Direction dir) const;
+
+    /** */
+    int simplePathAvance (Node& node, Direction dir, kmer::Nucleotide& nt) const;
+
+    /** */
+    GraphIterator<Node> simplePath     (Node& node, Direction dir) const  { return getSimpleNodeIterator(node, dir); }
+    GraphIterator<Edge> simplePathEdge (Node& node, Direction dir) const  { return getSimpleEdgeIterator(node, dir); }
+    
+    // high-level functions that used to be in Simplifications.cpp
+    // convention: unitigXXX works on the unitigs as computed as bcalm. never leaves that unitig
+    //             simplepathXXX may traverse multiple unitigs
+    Node             unitigLastNode          (Node& node, Direction dir) const;
+    Node         simplePathLastNode          (Node& node, Direction dir) const;
+    unsigned int     unitigLength            (Node& node, Direction dir) const;
+    unsigned int simplePathLength            (Node& node, Direction dir) const;
+    double           unitigMeanAbundance     (Node& node) const;
+    double       simplePathMeanAbundance     (Node& node, Direction dir) const;
+    void             unitigDelete          (Node& node, Direction dir, NodesDeleter<Node,Edge, GraphTemplate<Node, Edge, GraphDataVariant> >& nodesDeleter) ;
+    void             unitigDelete          (Node& node) ;
+    void         simplePathDelete          (Node& node, Direction dir, NodesDeleter<Node,Edge, GraphTemplate<Node, Edge, GraphDataVariant> >& nodesDeleter) ;
+    std::string  unitigSequence (Node& node, bool& isolatedLeft, bool& isolatedRight) const;
+    std::string  unitigPathSequence (Node& node, bool& isolatedLeft, bool& isolatedRight) const;
+    void         unitigMark            (Node& node) ; // used to flag simple path as traversed, in minia
+    bool         unitigIsMarked        (Node& node) ;
+    
+    std::string simplePathBothDirections(const Node& node, bool& isolatedLeft, bool& isolatedRight, bool dummy, float& coverage);
+    // aux function, not meant to be called from outside, but maybe it could.
+    void simplePathLongest_avance(const Node& node, Direction dir, int& seqLength, int& endDegree, bool markDuringTraversal, float& coverage, std::string* seq = nullptr, std::vector<Node> *unitigNodes = nullptr); 
+    
+    void debugPrintAllUnitigs() const;
+
+    /**********************************************************************/
+    /*                         NODE METHODS                               */
+    /**********************************************************************/
+
+    /** Tells whether or not a node belongs to the graph.
+     * \param[in] item : the node
+     * \return true if the node belongs to the graph, false otherwise. */
+    bool contains (const Node& item) const;
+                                  
+    template<size_t span> 
+    bool contains (const typename gatb::core::kmer::impl::Kmer<span>::Type& item) const;
+
+    /** Get the ascii string for the node, according to its strand.
+     * \param[in] node: the node to get the string from
+     * \return the string representation for the provided node. */
+    std::string toString (const Node& node) const;
+
+    /** Tells whether the provided node is branching or not.
+     * \param[in] node : the node to be asked
+     * \return true if the node is branching, false otherwise. */
+    bool isBranching (Node& node) const;
+
+    /** Build a fake node (ie. not necessarily in the De Bruijn graph). Mainly for test purpose.
+     * \param[in] data : a string like structure for the sequence from which the kmer of the node is extracted
+     * \param[in] offset : starting offset in the data
+     * \return the fake node. */
+    Node buildNode (const tools::misc::Data& data, size_t offset=0) const;
+
+    /** Build a fake node (ie. not necessarily in the De Bruijn graph). Mainly for test purpose.
+     * \param[in] sequence : a sequence of nucleotides in ASCII format
+     * \return the fake node. */
+    Node buildNode (const char* sequence) const;
+
+    /** Return the reverse complement node of the provided one.
+     * param[in] node : the node to be reverted
+     * \return the reverted node.  */
+    Node reverse (const Node& node) const;
+
+    /** Return the reverse complement node of the provided one.
+     * param[in] node : the node to be reverted
+     * \return the reverted node.  */
+    BranchingNode_t<Node> reverse (const BranchingNode_t<Node>& node) const;
+
+    /** Mutation of a node. */
+    GraphVector<Node> mutate (const Node& node, size_t idx, int mode=0) const;
+
+    /** Return a nucleotide at position 'idx' of a given node 
+     * \param[in] node : the node we want to extract a nucleotide from
+     * \param[in] idx : the position of the nucleotide to be extracted
+     * \return the wanted nucleotide. */
+    kmer::Nucleotide getNT (const Node& node, size_t idx) const;
+
+    /** Return the abundance of a node by querying the perfect hash function 
+     * \param[in] node : the node
+     * \return the abundance */
+    int queryAbundance (Node& node) const;
+
+    /** Return the state of a node by querying the perfect hash function. A node state is either normal, marked, or deleted.
+     * \param[in] node : the node or a node index (unsigned long) from the MPHF
+     * \return the abundance */
+    int queryNodeState (Node& node) const;
+    void setNodeState (Node& node, int state) const;
+    void resetNodeState () const ;
+    void disableNodeState () const ; // see Graph.cpp for explanation
+
+    // deleted nodes, related to NodeState above
+    void deleteNode (Node& node) const;
+    void deleteNodesByIndex(std::vector<bool> &bitmap, int nbCores = 1, gatb::core::system::ISynchronizer* synchro=NULL) const;
+    bool isNodeDeleted(Node& node) const;
+
+    // a direct query to the MPHF data strcuture
+    /* returns an index between 0 and (number of nodes - 1)
+     * the function is a bijection between the nodes and the indices
+     *
+     * NOTE: if you query this function for a node that doesn't beling to the graph, 
+     * it may still return an index (that will be in collision with
+     * the index of another node in the graph), or it may return ULLONG_MAX, 
+     * the latter indicates that for sure, the node isn't in the graph
+     */
+    unsigned long nodeMPHFIndex(Node& node) const;
+
+
+    unsigned long nodeMPHFIndexDummy(Node& node) const; // debug function, for profiling only
+
+
+    /**********************************************************************/
+    /*                         EDGE METHODS                               */
+    /**********************************************************************/
+
+    /** Get the ascii string for the edge
+     * \param[in] edge : the edge to get the string from
+     * \return the string representation for the provided edge . */
+    std::string toString (const Edge& edge) const;
+
+    /** Get the ascii string for the branching edge
+     * \param[in] edge : the edge to get the string from
+     * \return the string representation for the provided edge . */
+    std::string toString (const BranchingEdge_t<Node, Edge>& edge) const;
+
+    /** Tells whether the provided edge is simple: outdegree(from)==1 and indegree(to)==1
+     * \param[in] edge : the edge to be asked
+     * \return true if the edge is simple, false otherwise. */
+    bool isSimple (Edge& edge) const;
+
+    /**********************************************************************/
+    /*                         MISC METHODS                               */
+    /**********************************************************************/
+
+    /** Return the name of the graph.
+     * \return the name. */
+    std::string getName() const { return _name; }
+
+    /** Get the size of the kmers.
+     * \return the kmer size. */
+    size_t getKmerSize() const { return _kmerSize; }
+
+    /** Get information about the graph (gathered during its creation).
+     * \return a property object holding graph information. */
+    tools::misc::IProperties& getInfo () const { return (tools::misc::IProperties&)_info; }
+
+    /** Remove physically a graph. */
+    void remove ();
+
+    /** Reverse an edge.
+     * param[in] edge: the edge to be reverted
+     * \return the reverted edge. */
+    Edge reverse (const Edge& edge) const;
+
+
+    /** cache adjacency information from the Bloom filter to an array, 8 bits per node, for faster traversal queries*/
+    void precomputeAdjacency(unsigned int nbCores = 1, bool verbose = true);
+    unsigned int nt2bit[256]; 
+    bool debugCompareNeighborhoods(Node& node, Direction dir, std::string prefix) const; // debug
+
+
+    /* functions to precompute non-simple nodes */
+    void cacheNonSimpleNode(const Node& node) const;
+    void cacheNonSimpleNodeDelete(const Node& node) const;
+    void cacheNonSimpleNodes(unsigned int nbCores, bool verbose) ;
+
+    /**********************************************************************/
+    /*                         DEBUG METHODS                              */
+    /**********************************************************************/
+    /** */
+    std::string debugString (const Node& node, kmer::Strand strand = kmer::STRAND_ALL, int mode=0) const;
+
+    /** */
+    std::string debugString (const Edge& edge, kmer::Strand strand = kmer::STRAND_ALL, int mode=0) const;
+
+
+    /**********************************************************************/
+    /*                         TYPES                                      */
+    /**********************************************************************/
+    enum StateMask
+    {
+        STATE_INIT_DONE           = (1<<0),
+        STATE_CONFIGURATION_DONE  = (1<<1),
+        STATE_SORTING_COUNT_DONE  = (1<<2),
+        STATE_BLOOM_DONE          = (1<<3),
+        STATE_DEBLOOM_DONE        = (1<<4),
+        STATE_BRANCHING_DONE      = (1<<5),
+        STATE_MPHF_DONE           = (1<<6),
+        STATE_ADJACENCY_DONE      = (1<<7),
+        STATE_NONSIMPLE_CACHE     = (1<<8)
+    };
+    typedef u_int64_t State; /* this is a global graph state, not to be confused of the state of a node (deleted or not) */
+    State getState () const { return _state; }
+    bool  checkState (StateMask mask) const { return (_state & (State)mask)==(State)mask; }
+    State setState   (StateMask mask) { _state |=  mask; return _state; }
+    State unsetState (StateMask mask) { _state &= ~mask; return _state; }
+
+    /** Constructor for empty graph.*/
+    GraphTemplate (size_t kmerSize);
+
+    /** Constructor. Use for GraphTemplate creation (ie. DSK + debloom) and filesystem save. */
+    GraphTemplate (bank::IBank* bank, tools::misc::IProperties* params);
+
+    /** Constructor. Use for GraphTemplate creation (ie. DSK + debloom) and filesystem save. */
+    GraphTemplate (tools::misc::IProperties* params);
+
+    /** Constructor. Use for reading from filesystem. */
+    GraphTemplate (const std::string& uri);
+
+public: // was private: before, but had many compilation errors during the change from Graph to GraphTemplate. took the easy route, set it to "public:", it solved everything.
+    
+    /** Kind of storage for the graph. */
+    tools::storage::impl::StorageMode_e _storageMode;
+
+    /** Default storage kind. */
+    static const tools::storage::impl::StorageMode_e PRODUCT_MODE_DEFAULT = tools::storage::impl::STORAGE_HDF5;
+
+    /** Storage. */
+    tools::storage::impl::Storage* _storage;
+    void setStorage (tools::storage::impl::Storage* storage)  { SP_SETATTR(storage); }
+    tools::storage::impl::Storage& getStorage()                           { return (*_storage); }
+    tools::storage::impl::Group&   getGroup  (const std::string name="")  { return getStorage() (name); }
+
+    /** Defined as a void* for hiding implementation in cpp file. */
+    void* _variant;
+
+    /** kmer size of the graph */
+    size_t _kmerSize;
+
+    /** Creation information. */
+    tools::misc::impl::Properties _info;
+
+    /** */
+    std::string _name;
+
+    State _state;
+
+    /** */
+    tools::misc::BloomKind       _bloomKind;
+    tools::misc::DebloomKind     _debloomKind;
+    tools::misc::DebloomImpl     _debloomImpl;
+    tools::misc::BranchingKind   _branchingKind;
+   
+    /** */
+    GraphIterator<Node> getNodes () const;
+    
+    unsigned char countNeighbors (Node&, Direction) const; // simple and much faster version of getNodes, for degree(), outdegree(), indegree() queries
+    void countNeighbors (Node&, size_t&, size_t&) const;  // compute in and out degree at the same time
+
+    /** */
+    GraphIterator<BranchingNode_t<Node> > getBranchingNodes () const;
+
+    /** */
+    GraphIterator<Node> getSimpleNodeIterator (Node& node, Direction dir) const;
+
+    /** */
+    GraphIterator<Edge> getSimpleEdgeIterator (Node& node, Direction dir) const;
+
+    /** */
+    GraphVector<Edge> getEdges (Node source, Direction direction) const;
+
+    /** */
+    GraphVector<std::pair<Node,Node> > getNodesCouple (const Node& node1, const Node& node2, Direction direction) const;
+
+    /** */
+    GraphVector<std::pair<Edge,Edge> > getEdgesCouple (const Node& node1, const Node& node2, Direction direction) const;
+
+    /** */
+    GraphVector<Node> getNodes (Node &source, Direction direction)  const;
+
+    /** */
+    GraphVector<BranchingNode_t<Node> > getBranchingNodeNeighbors (Node& source, Direction direction) const;
+
+    /** */
+    GraphVector<BranchingEdge_t<Node,Edge> > getBranchingEdgeNeighbors (Node& source, Direction direction) const;
+
+    /** */
+    GraphVector<Edge> getEdgeValues (const typename Node::Value& kmer) const;
+
+    /** */
+    GraphVector<Node> getNodeValues (const typename Node::Value& kmer) const;
+
+    /** */
+    GraphVector<BranchingEdge_t<Node,Edge> > getBranchingEdgeValues (const typename Node::Value& kmer) const;
+
+    /** */
+    GraphVector<BranchingNode_t<Node> > getBranchingNodeValues (const typename Node::Value& kmer) const;
+
+    /** */
+    Node getNode (Node& source, Direction dir, kmer::Nucleotide nt, bool& exists) const;
+
+    /* set the graph variant */
+    void setVariant (void* data, size_t kmerSize, size_t integerPrecision=0);
+
+    /** Friends. */
+    template<typename, typename, typename> friend struct build_visitor_solid ; // i don't know why this template<typename, typename> trick works, but it does
+    template<typename, typename, typename> friend struct build_visitor_postsolid ;
+    template<typename, typename, typename> friend struct configure_visitor;
+
+    // a late addition, because GraphUnitig wants to call it too
+    static void executeAlgorithm (gatb::core::tools::misc::impl::Algorithm& algorithm, gatb::core::tools::storage::impl::Storage* storage, gatb::core::tools::misc::IProperties* props, gatb::core::tools::misc::IProperties& info);
+};
+
+
+/********************************************************************************
+                        #     #  ###   #####    #####
+                        ##   ##   #   #     #  #     #
+                        # # # #   #   #        #
+                        #  #  #   #    #####   #
+                        #     #   #         #  #
+                        #     #   #   #     #  #     #
+                        #     #  ###   #####    #####
+********************************************************************************/
+
+template<class Type, class Listener>
+class ProgressGraphIteratorTemplate : public tools::dp::impl::SubjectIterator<Type>
+{
+public:
+    ProgressGraphIteratorTemplate (const GraphIterator<Type>& items, const char* msg = "compute", bool verbose=true, size_t divide=100)
+        : tools::dp::impl::SubjectIterator<Type> (items.get(), items.size()/divide), _size(items.size()) 
+        { 
+            if (verbose)
+                this->addObserver( new Listener(items.size(), msg) );
+        }
+    
+
+    u_int64_t size () const  { return _size; }
+
+private:
+    u_int64_t _size;
+};
+
+// I tried to overload std::hash in Integer but it didn't work, despite the fact that it should have!
+template<typename T>
+class NodeHasher
+{
+    public:
+        size_t operator()(const T & k) const 
+        {
+            return hash1(k, 0);
+        }
+};
+
+/********************************************************************************/
+
+/* We define a structure that holds all the necessary stuff for implementing the graph API.
+ *  Here, the structure is templated by the span (ie. the kmer max size).
+ *
+ *  This structure is the basis for defining a boost::variant with all required span
+ *  template instantiations.
+ */
+template<size_t span>
+struct GraphData
+{
+    /** Shortcuts. */
+    typedef typename gatb::core::kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename gatb::core::kmer::impl::Kmer<span>::Type           Type;
+    typedef typename gatb::core::kmer::impl::Kmer<span>::Count          Count;
+    typedef typename gatb::core::kmer::impl::MPHFAlgorithm<span>::AbundanceMap   AbundanceMap;
+    typedef typename gatb::core::kmer::impl::MPHFAlgorithm<span>::NodeStateMap   NodeStateMap;
+    typedef typename gatb::core::kmer::impl::MPHFAlgorithm<span>::AdjacencyMap   AdjacencyMap;
+    typedef typename std::unordered_map<Type, std::pair<char,std::string>, NodeHasher<Type> > NodeCacheMap; // rudimentary for now
+
+    /** Constructor. */
+    GraphData () : _model(0), _solid(0), _container(0), _branching(0), _abundance(0), _nodestate(0), _adjacency(0), _nodecache(0) {}
+
+    /** Destructor. */
+    ~GraphData ()
+    {
+        setModel     (0);
+        setSolid     (0);
+        setContainer (0);
+        setBranching (0);
+        setAbundance (0);
+        setNodeState (0);
+        setAdjacency (0);
+        setNodeCache (0);
+    }
+
+    /** Constructor (copy). */
+    GraphData (const GraphData& d) : _model(0), _solid(0), _container(0), _branching(0), _abundance(0), _nodestate(0), _adjacency(0), _nodecache(0)
+    {
+        setModel     (d._model);
+        setSolid     (d._solid);
+        setContainer (d._container);
+        setBranching (d._branching);
+        setAbundance (d._abundance);
+        setNodeState (d._nodestate);
+        setAdjacency (d._adjacency);
+        setNodeCache (d._nodecache);
+    }
+
+    /** Assignment operator. */
+    GraphData& operator= (const GraphData& d)
+    {
+        if (this != &d)
+        {
+            setModel     (d._model);
+            setSolid     (d._solid);
+            setContainer (d._container);
+            setBranching (d._branching);
+            setAbundance (d._abundance);
+            setNodeState (d._nodestate);
+            setAdjacency (d._adjacency);
+            setNodeCache (d._nodecache);
+        }
+        return *this;
+    }
+
+    /** Required attributes. */
+    Model*                _model;
+    tools::storage::impl::Partition<Count>*   _solid;
+    IContainerNode<Type>*                     _container;
+    tools::collections::Collection<Count>*    _branching;
+    AbundanceMap*         _abundance;
+    NodeStateMap*         _nodestate;
+    AdjacencyMap*         _adjacency;
+    NodeCacheMap*         _nodecache; // so, nodecache also records branching node, but also more stuff. i'm keeping _branching for historical reasons.
+
+    /** Setters. */
+    void setModel       (Model*                                       model)      { SP_SETATTR (model);     }
+    void setSolid       (tools::storage::impl::Partition<Count>*      solid)      { SP_SETATTR (solid);     }
+    void setContainer   (IContainerNode<Type>*                    container)  { SP_SETATTR (container); }
+    void setBranching   (tools::collections::Collection<Count>*   branching)  { SP_SETATTR (branching); }
+    void setAbundance   (AbundanceMap*          abundance)  { SP_SETATTR (abundance); }
+    void setNodeState   (NodeStateMap*          nodestate)  { SP_SETATTR (nodestate); }
+    void setAdjacency   (AdjacencyMap*          adjacency)  { SP_SETATTR (adjacency); }
+    void setNodeCache   (NodeCacheMap*          nodecache)  { _nodecache = nodecache; /* would like to do "SP_SETATTR (nodecache)" but nodecache is an unordered_map, not some type that derives from a smartpointer. so one day, address this. I'm not sure if it's important though. Anyway I'm phasing out NodeCache in favor of GraphUnitigs. */; }
+
+    /** Shortcut. */
+    bool contains (const Type& item)  const  {  
+
+        bool res = _container->contains (item);
+
+        if (!res)
+            return false;
+
+        /* check if kmer is deleted*/
+        // this is duplicated code from queryNodeState.
+        // NOTE: this does a MPHF query for each bloom contains that answer true. costly!
+        if (_nodestate != NULL)
+        {
+            unsigned long hashIndex = ((_nodestate))->getCode(item);
+			if(hashIndex == ULLONG_MAX) return false;
+            unsigned char value = ((_nodestate))->at(hashIndex / 2);
+            if ((hashIndex % 2) == 1)
+                value >>= 4;
+            value &= 0xF;
+            if (((value >> 1) & 1) == 1) 
+                return false;
+        }
+
+        return true;
+    }
+};
+
+/* This definition is the basis for having a "generic" Graph class, ie. not relying on a template
+ * parameter.
+ *
+ * This is done through a boost::variant; actually, we use a limited number of variant, corresponding
+ * to some maximum kmer sizes.
+ */
+template<typename T>  struct ToGraphDataVariant  {  typedef GraphData<T::value> type;  };
+/********************************************************************************/
+
+
+/* typedef for compatibility with all existing GATB tools */
+
+typedef Node_t<> Node; // default Node type: tools::math::Integer (which is a boost::variant)
+typedef Edge_t<Node> Edge;
+typedef Path_t<Node> Path; 
+typedef BranchingNode_t<Node> BranchingNode; 
+typedef BranchingEdge_t<Node,Edge> BranchingEdge; 
+typedef boost::make_variant_over<boost::mpl::transform<gatb::core::tools::math::IntegerList, ToGraphDataVariant<boost::mpl::_> >::type >::type GraphDataVariant;
+typedef GraphTemplate<Node, Edge, GraphDataVariant> Graph; // define classical GATB Graph
+
+
+/* rationale: Node is when you have no idea what the kmer size is going to be. NodeFast is when you do. and it's faster */
+
+template <size_t span>
+using NodeFast = Node_t<typename gatb::core::kmer::impl::Kmer<span>::Type >;
+template <size_t span>
+using EdgeFast = Edge_t<NodeFast<span> >;
+template <size_t span>
+using GraphDataVariantFast = boost::variant<GraphData<span> >; 
+
+
+template <typename Type, class Listener>
+class ProgressGraphIterator : public ProgressGraphIteratorTemplate<Type, Listener> {
+    public:
+    ProgressGraphIterator (const GraphIterator<Type>& items, const char* msg = "compute", size_t divide=100) : 
+        ProgressGraphIteratorTemplate<Type, Listener> (items,msg,divide)
+    {}
+};
+    
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct configure_visitor : public boost::static_visitor<>    {
+
+    const GraphTemplate<Node, Edge, GraphDataVariant>& graph;
+    tools::storage::impl::Storage&     storage;
+
+    configure_visitor (const GraphTemplate<Node, Edge, GraphDataVariant>& graph, tools::storage::impl::Storage& storage)  : graph(graph), storage(storage) {}
+
+    template<size_t span>  void operator() (GraphData<span>& data) const;
+};
+
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct build_visitor_solid : public boost::static_visitor<>    {
+
+    GraphTemplate<Node, Edge, GraphDataVariant>& graph; 
+    bank::IBank* bank; 
+    tools::misc::IProperties* props;
+
+    build_visitor_solid (GraphTemplate<Node, Edge, GraphDataVariant>& aGraph, bank::IBank* aBank, tools::misc::IProperties* aProps)  : graph(aGraph), bank(aBank), props(aProps) {}
+
+    template<size_t span>  void operator() (GraphData<span>& data) const;
+};
+
+/* now build the rest of the graph */
+template<typename Node, typename Edge, typename GraphDataVariant>
+struct build_visitor_postsolid : public boost::static_visitor<>    {
+
+    GraphTemplate<Node, Edge, GraphDataVariant>& graph; tools::misc::IProperties* props; 
+
+    build_visitor_postsolid (GraphTemplate<Node, Edge, GraphDataVariant>& aGraph, tools::misc::IProperties* aProps)  : graph(aGraph), props(aProps) {}
+
+    template<size_t span>  void operator() (GraphData<span>& data) const;
+};
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_IMPL_GRAPH_BASIC_HPP_ */
diff --git a/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.cpp b/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.cpp
new file mode 100644
index 0000000..24a8308
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.cpp
@@ -0,0 +1,2106 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/api/IThread.hpp> // for ISynchronizer 
+
+#include <gatb/tools/collections/impl/ContainerSet.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/LibraryInfo.hpp>
+#include <gatb/tools/misc/impl/HostInfo.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/tools/misc/impl/Tool.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/kmer/impl/ConfigurationAlgorithm.hpp>
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/CountProcessor.hpp>
+#include <gatb/kmer/impl/RepartitionAlgorithm.hpp>
+
+#include <gatb/debruijn/impl/Simplifications.hpp>
+
+// for trim()
+#include <functional> 
+#include <cctype>
+#include <locale>
+
+using namespace std;
+
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+#undef NDEBUG
+#include <cassert>
+
+#define DEBUG(a)  //a
+
+// some shorthands for unitigs
+#define BaseGraph GraphTemplate< NodeFast<span>, EdgeFast<span>, GraphDataVariantFast<span> >
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_GRAPHUNITIGSCPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_GRAPHUNITIGSCPP_
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+/********************************************************************************
+                 #####   ######      #     ######   #     #
+                #     #  #     #    # #    #     #  #     #
+                #        #     #   #   #   #     #  #     #
+                #  ####  ######   #     #  ######   #######
+                #     #  #   #    #######  #        #     #
+                #     #  #    #   #     #  #        #     #
+                 #####   #     #  #     #  #        #     #
+********************************************************************************/
+
+// we don't provide an option parser. use Graph::getOptionsParser
+//template<size_t span>
+//IOptionsParser* GraphUnitigsTemplate<span>::getOptionsParser (bool includeMandatory)
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>  GraphUnitigsTemplate<span>::create (bank::IBank* bank, const char* fmt, ...)
+{
+    IOptionsParser* parser = BaseGraph::getOptionsParser (false);   LOCAL(parser);
+    
+    /** We build the command line from the format and the ellipsis. */
+    va_list args;
+    va_start (args, fmt);
+    std::string commandLine = Stringify::format(fmt, args);
+    va_end (args);
+
+    try
+    {
+        return  GraphUnitigsTemplate(bank, parser->parseString(commandLine));
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+
+        throw system::Exception ("Graph construction failure because of bad parameters (notify a developer)");
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : some massive code duplication with above here
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>  GraphUnitigsTemplate<span>::create (const char* fmt, ...)
+{
+    IOptionsParser* parser = BaseGraph::getOptionsParser (true);   LOCAL (parser);
+    
+    /** We build the command line from the format and the ellipsis. */
+    va_list args;
+    va_start (args, fmt);
+    std::string commandLine = Stringify::format(fmt, args);
+    va_end (args);
+
+    try
+    {
+        return  GraphUnitigsTemplate (parser->parseString(commandLine), true); /* will call the GraphUnitigsTemplate<span>::GraphUnitigsTemplate (tools::misc::IProperties* params, bool load_unitigs_after) constructor */
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+        throw system::Exception ("Graph construction failure because of bad parameters (notify a developer)");
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : 
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : load a graph from I don't know where. looks like dummy?
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate (size_t kmerSize)
+    : GraphTemplate<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span> >(kmerSize)
+{
+    // will call Graph's constructor for (kmerSize), no big deal
+    //std::cout << "kmersize graphUtemplate constructor" << std::endl;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : loads a graph from a h5 file name
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate (const std::string& uri)
+{
+    std::cout << "unitigs graph constructor(uri) not supported" << std::endl; exit(1);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : creates a graph from a bank
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :  quick hack,  not supposed to be used outside of tests
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate (bank::IBank* bank, tools::misc::IProperties* params)
+{
+    
+    /** We get the kmer size from the user parameters. */
+    BaseGraph::_kmerSize = params->getInt (STR_KMER_SIZE);
+    size_t integerPrecision = params->getInt (STR_INTEGER_PRECISION);
+    /** We configure the data variant according to the provided kmer size. */
+    BaseGraph::setVariant (BaseGraph::_variant, BaseGraph::_kmerSize, integerPrecision);
+    string unitigs_filename = "dummy.unitigs.fa"; // because there's already a bank, but we don't know its name maybe? so just to be safe, i'm setting a dummy unitigs file. anyway, this constructor is only called in tests i think, not by minia for sure.
+
+    params->setInt(STR_REPARTITION_TYPE, 1);
+    params->setInt(STR_MINIMIZER_TYPE, 1);
+
+    /** We build the graph according to the wanted precision. */
+    boost::apply_visitor ( build_visitor_solid<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span>>(*this, bank,params),  *(GraphDataVariantFast<span>*)BaseGraph::_variant);
+
+    build_unitigs_postsolid(unitigs_filename, params);
+
+    load_unitigs(unitigs_filename);
+}
+
+static /* important that it's static! else TemplateSpecialization8 will complain*/
+char revcomp (char s) {
+	if (s == 'A') return 'T';
+	else if (s == 'C') return 'G';
+	else if (s == 'G') return 'C';
+	else if (s == 'T') return 'A';
+	else if (s == 'a') return 't';
+	else if (s == 'c') return 'g';
+	else if (s == 'g') return 'c';
+	else if (s == 't') return 'a';
+	return 'X';
+}
+
+static string revcomp (const string &s) {
+	string rc;
+	for (signed int i = s.length() - 1; i >= 0; i--) {rc += revcomp(s[i]);}
+	return rc;
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::build_unitigs_postsolid(std::string unitigs_filename, tools::misc::IProperties* props)
+{
+    /** We may have to stop just after configuration. I don't know if that happens in GraphU though. */
+    if (props->get(STR_CONFIG_ONLY))  { std::cout << "GraphU Config_only! does that happen?" << std::endl; return; }
+
+    //if (!BaseGraph::checkState(BaseGraph::STATE_SORTING_COUNT_DONE))
+    if (!checkState(STATE_SORTING_COUNT_DONE))
+    {
+        //throw system::Exception ("Graph construction failure during build_visitor_postsolid, the input h5 file needs to contain at least solid kmers.\nIf this is an old .h5 file, created with GATB-Core's Graph instead of GraphUnitigs, please re-create it.");
+        // let's try with shared state.
+        throw system::Exception ("Graph construction failure during build_visitor_postsolid, the input h5 file needs to contain at least solid kmers.");
+    }
+    
+    bool redo_bcalm = props->get("-redo-bcalm");
+    bool redo_bglue = props->get("-redo-bglue");
+    bool redo_links = props->get("-redo-links");
+
+    bool skip_bcalm = props->get("-skip-bcalm");
+    bool skip_bglue = props->get("-skip-bglue");
+    bool skip_links = props->get("-skip-links");
+
+    bool do_unitigs = !checkState(STATE_BCALM2_DONE);
+    bool do_bcalm = (redo_bcalm || do_unitigs) && (!skip_bcalm);
+    bool do_bglue = (redo_bglue || do_unitigs) && (!skip_bglue);
+    bool do_links = (redo_links || do_unitigs) && (!skip_links);
+
+    if (do_unitigs || do_bcalm || do_bglue || do_links)
+    {
+        int nb_threads =
+            props->getInt(STR_NB_CORES);
+
+        size_t  kmerSize = BaseGraph::getKmerSize();
+        if (kmerSize != (unsigned int)props->getInt(STR_KMER_SIZE))
+            std::cout << "kmer discrepancy: stored data has kmer size " << kmerSize << " but input command line has " << props->getInt(STR_KMER_SIZE) << std::endl;
+        // delete this message mater
+        props->setInt(STR_KMER_SIZE, kmerSize);
+
+
+        UnitigsConstructionAlgorithm<span> unitigs_algo(BaseGraph::getStorage(), unitigs_filename, nb_threads, props, do_bcalm, do_bglue, do_links);
+
+        BaseGraph::executeAlgorithm(unitigs_algo, &BaseGraph::getStorage(), props, BaseGraph::_info);
+    
+        nb_unitigs = unitigs_algo.nb_unitigs;
+        BaseGraph::getGroup().setProperty ("nb_unitigs",     Stringify::format("%d", nb_unitigs));
+        
+        setState(STATE_BCALM2_DONE);
+    }
+        
+    nb_unitigs = atol (BaseGraph::getGroup().getProperty ("nb_unitigs").c_str());
+
+    /** We save the state at storage root level. */
+    BaseGraph::getGroup().setProperty ("state",          Stringify::format("%d", BaseGraph::_state));
+}
+
+static void
+parse_unitig_header(string header, float& mean_abundance, vector<uint64_t>& inc, vector<uint64_t>& outc)
+{
+    bool debug = false;
+    if (debug) std::cout << "parsing unitig links for " << header << std::endl;
+    std::stringstream stream(header);
+    while(1) {
+        string tok;
+        stream >> tok;
+        if(!stream)
+            break;
+
+        if (tok.size() < 3)
+            // that's the id, skip it
+            continue;
+
+        string field = tok.substr(0,2);
+        if (field == "L:")
+        {
+            bool in = tok.substr(2,1) == "-";
+            int pos_rc = tok.find_last_of(':');
+            bool rc = tok.substr(pos_rc+1) == "-";
+            tok = tok.substr(0,pos_rc); // chop last field
+            uint64_t unitig = atoi(tok.substr(tok.find_last_of(':')+1).c_str());
+            /* situation is: 
+             * L:+:next_unitig:+    unitig[end] -> [begin]next_unitig 
+             * L:+:next_unitig:-    unitig[end] -> [begin]next_unitig_rc
+             * L:-:next_unitig:+    unitig_rc[end] -> [begin]next_unitig     or alternatively, next_unitig_rc[end] -> [begin]unitig
+             * L:-:next_unitig:-    unitig_rc[end] -> [begin]next_unitig_rc                       next_unitig[end] -> [begin]unitig
+             * */
+
+            /* setting pos:
+             * in case of single-kmer unitig, pos will be wrong (should be UNITIG_BOTH, but i'm not storing this info in just 1 bit). Instead of encoding it here (would add 1 bit), getEdges as well as simplePath_avance will be inferring that it's UNITIG_BOTH in cases where the unitig is just of length k
+             * thus, pos is actually also given by the following formula, if you think hard about it and look at the situations above (actually i got super confused and changed this code so many times until all unit tests passed)*/
+            Unitig_pos pos = (rc)?UNITIG_END:UNITIG_BEGIN;
+            if (in)
+                rc = !rc;
+
+            ExtremityInfo li(unitig, rc, pos);
+            if (debug)
+                std::cout << "inserting "<< (in?"incoming":"outcoming") <<  " extremity " << li.toString() << std::endl;
+            if (in)
+                inc.push_back(li.pack());
+            else
+                outc.push_back(li.pack());
+        }
+        else
+        {
+            if (field == "km")
+            {
+                mean_abundance = atof(tok.substr(tok.find_last_of(':')+1).c_str());
+                //std::cout << "unitig " << header << " mean abundance " << mean_abundance << std::endl;
+            }
+            // we don't care about other fields
+        }
+    }
+}
+
+static void
+insert_navigational_vector(std::vector<uint64_t> &v, std::vector<uint64_t>& to_insert, std::vector<uint64_t> &v_map)
+{
+    v_map.push_back(v.size());
+    v.insert(v.end(), to_insert.begin(), to_insert.end());
+}
+
+static void
+insert_compressed_navigational_vector(std::vector<uint64_t> &v, std::vector<uint64_t>& to_insert, dag::dag_vector &v_map)
+{
+    v_map.push_back(to_insert.size());
+    v.insert(v.end(), to_insert.begin(), to_insert.end());
+    /*for (auto x: to_insert) // that was for when v was a dag_vector
+    {
+        v.push_back(x);
+    }*/
+}
+
+// here we dynamically insert at the next open space in the vector after the position indicated by the v_map (pos variable)
+// since we precomputed v_map, we know that there is no way to overflow
+static void
+insert_navigational_vector_gfa(std::vector<uint64_t> &v, uint64_t to_insert, uint64_t pos)
+{
+    bool inserted = false;
+    uint64_t v_size = v.size();
+    for (uint i = 0 ; i < 16; i ++) // 16 is just some upper bound
+    {
+        if (pos+i < v_size && v[pos+i] == 0)
+        {
+            v[pos+i] = to_insert;
+            inserted = true;
+            break;
+        }
+    }
+    if (!inserted)
+    {
+        std::cout << "bad navigational vector insert at position " << pos << " / " << v_size << "! could not find a spot to insert. some debug: " << std::endl;
+        std::cout << v[pos] << " " << v[pos+1] << " " << v[pos+2] << std::endl;
+        exit(1);
+    }
+}
+
+
+
+//http://stackoverflow.com/questions/30540101/iterator-for-a-subset-of-a-vector
+template <class Iter>
+class range {
+    Iter b;
+    Iter e;
+    public:
+    range(Iter b, Iter e) : b(b), e(e) {}
+    Iter begin() { return b; }
+    Iter end() { return e; }
+};
+
+template <class Container>
+range<typename Container::const_iterator> 
+make_range(Container& c, size_t b, size_t e) {
+    return range<typename Container::const_iterator> (c.begin()+b, c.begin()+e);
+}
+
+
+/* returns an iterator of all incoming or outcoming edges from an unitig */
+static 
+range<std::vector<uint64_t>::const_iterator >
+get_from_navigational_vector(const std::vector<uint64_t> &v, uint64_t utig, const std::vector<uint64_t> &v_map) 
+{
+    if (utig == v_map.size() /*total number of unitigs*/ - 1)
+    {
+        //std::cout << "get from nav vector " << to_string(utig) << " " << to_string(v_map[utig]) << " " <<  to_string(v.size()) << " last unitig" << std::endl;
+        return make_range(v,v_map[utig],v.size());
+    }
+    else
+    {
+        //std::cout << "get from nav vector " << to_string(utig) << " " << to_string(v_map[utig]) << " " <<  to_string(v_map[utig+1]) << " (utig " << utig << "/" << v_map.size() << ")" << std::endl;
+        return make_range(v,v_map[utig],v_map[utig+1]);
+    }
+}
+
+
+/* compressed counterpart of the function above */
+static 
+range<std::vector<uint64_t>::const_iterator >
+get_from_compressed_navigational_vector(const std::vector<uint64_t> &v, uint64_t utig, const dag::dag_vector &v_map) 
+{
+    if (utig == v_map.size() /*total number of unitigs*/ - 1)
+    {
+        //std::cout << "get from nav vector " << to_string(utig) << " " << to_string(v_map[utig]) << " " <<  to_string(v.size()) << " last unitig" << std::endl;
+        return make_range(v,v_map.prefix_sum(utig),v.size());
+    }
+    else
+    {
+        if (utig == 0)
+            return make_range(v,0, v_map[0]);
+
+        //std::cout << "get from nav vector " << to_string(utig) << " " << to_string(v_map[utig]) << " " <<  to_string(v_map[utig+1]) << " (utig " << utig << "/" << v_map.size() << ")" << std::endl;
+        uint64_t ps = v_map.prefix_sum(utig);
+        return make_range(v,ps,ps + v_map[utig]);
+    }
+}
+
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::print_unitigs_mem_stats(uint64_t incoming_size, uint64_t outcoming_size, uint64_t total_unitigs_size, uint64_t nb_utigs_nucl, uint64_t nb_utigs_nucl_mem)
+{
+    uint64_t mem_vec_sizes = /*unitigs_sizes.get_alloc_byte_num(); // formerly */(unitigs_sizes.capacity() * sizeof(uint32_t));
+
+    std::cout <<  "Stats:"  << std::endl;
+    std::cout <<  "Number of unitigs: " << nb_unitigs << std::endl;
+    std::cout <<  "Average number of incoming/outcoming neighbors: " << incoming_size/(float)nb_unitigs << "/" <<  outcoming_size/(float)nb_unitigs  << std::endl;
+    std::cout <<  "Total number of nucleotides in unitigs: " << total_unitigs_size << std::endl;
+    std::cout << std::endl;
+    std::cout <<  "Memory usage:" << std::endl;
+    std::cout <<  "   " << (sizeof(uint64_t) * incoming.size()) / 1024 / 1024 << " MB keys in incoming vector" << std::endl;
+    std::cout <<  "   " << (sizeof(uint64_t) * outcoming.size()) / 1024 / 1024 << " MB keys in outcoming vector" << std::endl;
+    uint64_t inc_out_size = (sizeof(uint64_t) * incoming.size()) + (sizeof(uint64_t) * outcoming.size());
+    if (compress_navigational_vectors)
+    {
+        std::cout <<  "   " << dag_incoming_map.get_alloc_byte_num() / 1024 / 1024 << " MB keys in dag_incoming_map vector" << std::endl;
+        std::cout <<  "   " << dag_outcoming_map.get_alloc_byte_num() / 1024 / 1024 << " MB keys in dag_outcoming_map vector" << std::endl;
+        inc_out_size += dag_incoming_map.get_alloc_byte_num() + dag_outcoming_map.get_alloc_byte_num();
+    }
+    else 
+    {
+        //std::cout <<  "   " << dag_incoming.get_alloc_byte_num() / 1024 / 1024 << " MB keys in incoming vector" << std::endl;
+        //std::cout <<  "   " << dag_outcoming.get_alloc_byte_num() / 1024 / 1024 << " MB keys in outcoming vector" << std::endl;
+        std::cout <<  "   " << (sizeof(uint64_t) * incoming_map.size()) / 1024 / 1024 << " MB keys in incoming_map vector" << std::endl;
+        std::cout <<  "   " << (sizeof(uint64_t) * outcoming_map.size()) / 1024 / 1024 << " MB keys in outcoming_map vector" << std::endl;
+        inc_out_size += (sizeof(uint64_t) * incoming_map.size()) + (sizeof(uint64_t) * outcoming_map.size());
+    }
+    uint64_t mem_unitigs;
+    if (pack_unitigs)
+    {
+        uint64_t mem_packed_unitigs = packed_unitigs_sizes.prefix_sum(nb_unitigs) + packed_unitigs_sizes.get_alloc_byte_num();
+        std::cout <<  "   " <<  mem_packed_unitigs /1024 /1024      << " MB packed unitigs (incl. " << packed_unitigs_sizes.get_alloc_byte_num()/1024/1024 << " MB delimiters)"  << std::endl;
+        mem_unitigs = mem_packed_unitigs;
+    }
+    else 
+    {
+        mem_unitigs = (unitigs.capacity()       * sizeof(string) + nb_utigs_nucl_mem);
+        std::cout <<  "   " <<  mem_unitigs /1024 /1024      << " MB unitigs nucleotides (" << unitigs.capacity() << " * " << sizeof(string) << " + " <<  nb_utigs_nucl_mem << ")"  << std::endl;
+    }
+    std::cout <<  "   " <<  mem_vec_sizes/1024 /1024 << " MB unitigs lengths" << std::endl;
+    uint64_t mem_unitig_mean_abundance = /*unitigs_mean_abundance.get_alloc_byte_num()  ; // <- in dag_vector format; in vector<float> format -> */(nb_unitigs*sizeof(float));
+    std::cout <<  "   " <<  mem_unitig_mean_abundance / 1024 / 1024 << " MB unitigs abundances" << std::endl;
+    std::cout <<  "   " <<  (2*nb_unitigs/8) / 1024 / 1024 << " MB deleted/visited bitvectors" << std::endl;
+    // summation of all of the above:
+    std::cout <<  "Estimated total: " <<  (mem_unitig_mean_abundance + (nb_unitigs*2.0/8.0) +  inc_out_size + mem_unitigs + mem_vec_sizes) / 1024 / 1024 << " MB" << std::endl;
+
+    if (nb_utigs_nucl != nb_utigs_nucl_mem)
+        std::cout << "unitigs strings size " << nb_utigs_nucl << " vs capacity " << nb_utigs_nucl_mem << std::endl;
+
+}
+
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::load_unitigs(string unitigs_filename)
+{
+    bool verbose = (nb_unitigs > 1000000); // big dataset, let's show some memory usage verbosity here
+    if (verbose)
+        std::cout << "loading unitigs from disk to memory" << std::endl;
+
+    BankFasta inputBank (unitigs_filename);
+    //bank::IBank* inputBank = Bank::open (unitigs_filename);
+    //LOCAL (inputBank);
+    //ProgressIterator<bank::Sequence> itSeq (*inputBank, "loading unitigs");
+    BankFasta::Iterator itSeq (inputBank);
+
+    unsigned int kmerSize = BaseGraph::_kmerSize;
+    
+    //compress_navigational_vectors = false;
+    compress_navigational_vectors = true; //only a 10% speed hit but 2x less incoming/outcoming/incoming_map/outcoming_map memory usage, so, quite worth it.
+    pack_unitigs = true;
+
+    nb_unitigs_extremities = 0; // will be used by NodeIterator (getNodes)
+    uint64_t nb_utigs_nucl = 0;
+    uint64_t nb_utigs_nucl_mem = 0;
+    uint64_t total_unitigs_size = 0;
+    float incoming_size = 0, outcoming_size = 0;
+    for (itSeq.first(); !itSeq.isDone(); itSeq.next()) // could be done in parallel, maybe, if we used many unordered_map's with a hash on the query kmer (the same opt could be done for LinkTigs)
+    {
+        const string& seq = itSeq->toString();
+        const string& comment = itSeq->getComment();
+
+        float mean_abundance;
+        vector<uint64_t> inc, outc; // incoming and outcoming unitigs
+        parse_unitig_header(comment, mean_abundance, inc, outc);
+
+        incoming_size += inc.size();
+        outcoming_size += outc.size();
+
+        if (compress_navigational_vectors) 
+        {
+            // we won't use dag_incoming and dag_outcoming, there doesnt seem to be any performance gain. a bit surprising, though, because i was storing 64bit ints before. but gamma coding is, after all, 2-optimal and most numbers are close to 32 bits.
+            insert_compressed_navigational_vector(/*dag_incoming*/ incoming,  inc,  dag_incoming_map);
+            insert_compressed_navigational_vector(/*dag_outcoming*/ outcoming, outc, dag_outcoming_map);
+
+        }
+        else
+        {
+            insert_navigational_vector(incoming,  inc,  incoming_map); // "incoming_map" records the number of incoming links for an unitig. "incoming" records links explicitly
+            insert_navigational_vector(outcoming, outc, outcoming_map);
+        }
+
+        if (pack_unitigs)
+        {
+            packed_unitigs += internal_compress_unitig(seq);
+            packed_unitigs_sizes.push_back((seq.size()+3)/4);
+        }
+        else
+            unitigs.push_back(internal_compress_unitig(seq));
+
+        unitigs_sizes.push_back(seq.size());
+        total_unitigs_size += seq.size();
+        unitigs_mean_abundance.push_back(mean_abundance);
+
+        //std::cout << "decoded : " << internal_get_unitig_sequence(unitigs.size()-1) << std::endl;
+        //std::cout << "real    : " << seq << std::endl;
+
+        if (!pack_unitigs)
+        {
+            nb_utigs_nucl += unitigs[unitigs.size()-1].size();
+            nb_utigs_nucl_mem += unitigs[unitigs.size()-1].capacity();
+        }
+
+        if (seq.size() == kmerSize)
+            nb_unitigs_extremities++;
+        else
+            nb_unitigs_extremities+=2;
+    }
+    nb_unitigs = unitigs_sizes.size();
+
+
+    unitigs_traversed.resize(0);
+    unitigs_traversed.resize(nb_unitigs, false); // resize "traversed" bitvector, setting it to zero as well
+
+    unitigs_deleted.resize(0);
+    unitigs_deleted.resize(nb_unitigs, false); // resize "traversed" bitvector, setting it to zero as well
+
+    // an estimation of memory usage
+    if (verbose)
+        print_unitigs_mem_stats(incoming_size, outcoming_size, total_unitigs_size, nb_utigs_nucl, nb_utigs_nucl_mem);
+}
+
+//https://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
+// trim from start
+static inline std::string &ltrim(std::string &s) {
+    s.erase(s.begin(), std::find_if(s.begin(), s.end(),
+            std::not1(std::ptr_fun<int, int>(std::isspace))));
+    return s;
+}
+
+// trim from end
+static inline std::string &rtrim(std::string &s) {
+    s.erase(std::find_if(s.rbegin(), s.rend(),
+            std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
+    return s;
+}
+
+// trim from both ends
+static inline std::string &trim(std::string &s) {
+    return ltrim(rtrim(s));
+}
+
+//http://stackoverflow.com/questions/236129/split-a-string-in-c
+static vector<string> string_split(string s, char delim){
+	vector<string> ret;
+	stringstream sstream(s);
+	string temp;
+	while(getline(sstream, temp, delim)){
+		ret.push_back(trim(temp));
+	}
+	return ret;
+}
+
+
+// some code duplication with load_unitigs but nothing too major
+// inspired by gfakluge (https://github.com/edawson/gfakluge/blob/master/src/gfakluge.cpp), but quite limited compared to what kluge parses
+// Warning:
+// several assumptions are implicitly made about the GFA file, and they are not checked. so the code is not robust
+// - needs to have "k:i:[k value]" in header
+// - GFA has to be symmetric: (default of convertToGFA from bcalm), i.e. each link also has its symmetrical link
+// - segments identifiers need to be 0...|nb_unitigs|
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::load_unitigs_from_gfa(string gfa_filename, unsigned int& kmerSize)
+{
+    // in load_unitigs these two are optional. but not here, i didn't make that function flexible
+    compress_navigational_vectors = false; // i dont think i can do random inserts in a dag_vector, so, wont use them
+    pack_unitigs = true;
+	bool verbose = true;
+    
+	uint64_t incoming_size = 0, outcoming_size = 0, total_unitigs_size = 0;
+
+	ifstream gfi;
+	gfi.open(gfa_filename.c_str(), std::ifstream::in);
+	if (!gfi.good()){
+		cerr << "Cannot open GFA file. Exiting." << endl;
+        exit(1);
+	}
+   
+	string line;
+	vector<string> line_tokens;
+    vector<uint64_t> inc, outc; // incoming and outcoming unitigs
+	bool missing_mean_abundance = false;
+
+    nb_unitigs = 0; // we'll increase number of unitigs as we see them, the following loop
+    unordered_map<uint32_t, uint32_t> unitig_id_corresp; // correspondence between unitig id's seen in the GFA, and the mapping 0,...,|nb_unitigs| that we store in, e.g., the unitig_sizes array
+	while (getline(gfi, line)){
+
+		vector<string> tokens = string_split(line, '\t');
+		if (tokens[0] == "H"){
+			if (tokens.size() < 3 || tokens[2].substr(0,1).compare("k") != 0)
+			{
+				std::cout << "unsupported GFA format - the header needs to contain the k-mer size (e.g. k:i:31)" << std::endl;
+				std::cout << "header: " << line << std::endl;
+				std::cout << "tokens[2]: " << string_split(tokens[2],':')[0] << std::endl;
+				exit(1);
+			}
+			line_tokens = string_split(tokens[2], ':'); // we expect k-mer to be at 2nd position of gfa header [SPECIFIC TO BCALM2 GFA FORMAT]
+			kmerSize = atoi(line_tokens[2].c_str());
+		}
+		else if (tokens[0] ==  "S"){
+			//std::cout << " line: " << line << std::endl;
+
+        	float mean_abundance = 0;
+			for (unsigned int i = 0; i < tokens.size(); i++){
+				if (tokens[i].substr(0,2).compare("km") == 0)
+					mean_abundance = atof(string_split(tokens[i],':')[2].c_str());
+			}
+			if (mean_abundance == 0)
+				missing_mean_abundance = true;
+
+			string seq = tokens[2];
+			uint32_t unitig_id = atoi(tokens[1].c_str());
+            //std::cout << "seq: " << seq << " id: " << unitig_id << std::endl;
+			
+			packed_unitigs += internal_compress_unitig(seq);
+			packed_unitigs_sizes.push_back((seq.size()+3)/4);
+
+            unitig_id_corresp[unitig_id] = (nb_unitigs++);
+
+			unitigs_sizes.push_back(seq.size());
+			total_unitigs_size += seq.size();
+			unitigs_mean_abundance.push_back(mean_abundance);
+
+			if (seq.size() == kmerSize)
+				nb_unitigs_extremities++;
+			else
+				nb_unitigs_extremities+=2;
+
+			inc.resize(0);
+			outc.resize(0);
+		}
+		else if (tokens[0] ==  "L"){ // do a first pass to get the number of in/out links
+			bool in = tokens[2] == "-";
+            uint64_t unitig_id = atoi(tokens[1].c_str());
+
+            // strong assumption, we never see a link from a node before its S definition (unitig is in unitig_id_corresp)
+            // to make it more general: do another pass, that first pass only loads nodes
+            if (unitig_id_corresp.find(unitig_id) == unitig_id_corresp.end())
+            {
+                std::cout << "Unsupported GFA file: L line from a certain node should always be after the S line of that node" << std::endl;
+                exit(1);
+            }
+
+            if (incoming_map.size() < unitig_id_corresp[unitig_id])
+            {
+                // linear resizing
+                incoming_map.resize(unitig_id_corresp[unitig_id]+100000);
+                outcoming_map.resize(unitig_id_corresp[unitig_id]+100000);
+            }
+
+			if (in)
+            {
+                incoming_map[unitig_id_corresp[unitig_id]+1]++;  // the +1 is to make the later prefix sum correct
+                incoming_size++;
+            }
+			else
+            {
+                outcoming_map[unitig_id_corresp[unitig_id]+1]++;
+                outcoming_size++;
+            }
+		}
+	}
+
+	if (missing_mean_abundance)
+		std::cout << "NOTE: no segment abundance information was found in the GFA file (missing 'km' field in segment)" << std::endl;
+
+    incoming_map.resize(nb_unitigs); // fix size
+    outcoming_map.resize(nb_unitigs);
+    incoming.resize(incoming_size); // set size
+    outcoming.resize(outcoming_size);
+
+    // compute proper prefix sums
+	for (uint64_t i = 1; i < nb_unitigs; i++)
+    {
+        incoming_map[i] += incoming_map[i-1];
+        outcoming_map[i] += outcoming_map[i-1];
+    }
+
+	// in this second pass we actually load the links
+	gfi.close();
+	gfi.open(gfa_filename.c_str(), std::ifstream::in);
+	while (getline(gfi, line)){
+		vector<string> tokens = string_split(line, '\t');
+		if (tokens[0] ==  "L"){ 
+			bool in = tokens[2] == "-";
+            bool rc = tokens[4] == "-";
+            uint64_t from_unitig_id = atoi(tokens[1].c_str());
+            uint64_t to_unitig_id = atoi(tokens[3].c_str());
+            Unitig_pos pos = (rc)?UNITIG_END:UNITIG_BEGIN; // see load_unitigs for comments on that part
+            if (in)
+                rc = !rc;
+            ExtremityInfo li(to_unitig_id, rc, pos);
+            if (in)
+                insert_navigational_vector_gfa(incoming, li.pack(), incoming_map[unitig_id_corresp[from_unitig_id]]);
+            else
+                insert_navigational_vector_gfa(outcoming, li.pack(), outcoming_map[unitig_id_corresp[from_unitig_id]]);
+		}
+	}		    
+
+	assert(nb_unitigs == unitigs_sizes.size()); // not sure if this is enforced
+	
+    // code dupl
+    unitigs_traversed.resize(0);
+    unitigs_traversed.resize(nb_unitigs, false); // resize "traversed" bitvector, setting it to zero as well
+    unitigs_deleted.resize(0);
+    unitigs_deleted.resize(nb_unitigs, false); // resize "traversed" bitvector, setting it to zero as well
+
+	if (verbose)
+        print_unitigs_mem_stats(incoming_size, outcoming_size, total_unitigs_size);
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE : creates or completes a graph from parsed command line arguments.
+** INPUT   : a bank or a h5 file 
+** remarks: this function contains similar things to the one in Graph; there is some code duplication here. but not entirely
+SETS: the following variables are set:
+    BaseGraph::_kmerSize
+    BaseGraph::_state 
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate (tools::misc::IProperties* params, bool load_unitigs_after) 
+//    : BaseGraph() // call base () constructor // seems to do nothing, maybe it's always called by default
+{
+
+    string storage_type = params->getStr(STR_STORAGE_TYPE);
+    if (storage_type == "hdf5")
+    {
+        BaseGraph::_storageMode = tools::storage::impl::STORAGE_HDF5;
+        std::cout << "setting storage type to hdf5" << std::endl;
+    }
+    else
+    {
+        if (storage_type == "file")
+        {
+            BaseGraph::_storageMode = tools::storage::impl::STORAGE_FILE; // moving away frmo HDF5 because 1) memory leaks and 2) storing unitigs in a fasta file instead, more clean this way. nothing else needs to be stored
+            std::cout << "setting storage type to file" << std::endl;
+        }
+        else
+        {std::cout << "Error: unknown storage type specified: " << storage_type << std::endl; exit(1); }
+    }
+    
+    string input = params->getStr(STR_URI_INPUT);
+
+    // build_visitor_solid has the following defaults:
+    // minimizer size of 8. that one is okay
+    // the rest needs to be set!
+    // accoring to original BCALM2 graph::create string:
+    // -in %s -kmer-size %d -minimizer-size %d -mphf none -bloom none -out %s.h5  -abundance-min %d -verbose 1 -minimizer-type %d -repartition-type 1 -max-memory %d %s
+
+    //if ((!params->get(STR_REPARTITION_TYPE)))  // actually this doesn't seem to work, even when repartition-type isn't specified, it's (!params->get()) doesn't return true. so i'm going to force repartition type to 1, as it was in bcalm2
+    {
+        params->setInt(STR_REPARTITION_TYPE, 1);
+        //std::cout << "setting repartition type to 1" << std::endl;;
+    }
+    //if (!params->get(STR_MINIMIZER_TYPE))
+    {
+        params->setInt(STR_MINIMIZER_TYPE, 1);
+        //std::cout << "setting repartition type to 1" << std::endl;;
+    }
+
+    bool load_from_gfa = (system::impl::System::file().getExtension(input) == "gfa");
+
+    if (load_from_gfa)
+    {
+        // basically shortcut everything, we've got a badass gfa over here
+        unsigned int k = 0;
+        load_unitigs_from_gfa(input, k); // will set the kmer size
+        BaseGraph::_kmerSize = k;
+        return;
+    }
+
+
+    bool load_from_hdf5 = (system::impl::System::file().getExtension(input) == "h5");
+    bool load_from_file = (system::impl::System::file().isFolderEndingWith(input,"_gatb"));
+    bool load_graph = (load_from_hdf5 || load_from_file);
+
+    string unitigs_filename, prefix;
+
+    if (params->get(STR_URI_OUTPUT))
+        prefix = params->getStr(STR_URI_OUTPUT);
+    else
+    {
+        if (load_from_file)
+        {
+            string input_modified = input;
+            input_modified[input_modified.size()-6] = '.'; // replaces "_gatb" with ".gatb" for the purpose of getBaseName, to harmonize with ".h5"
+            prefix = System::file().getBaseName (input_modified);
+        }
+        else
+            prefix = System::file().getBaseName (input) + prefix;
+    }
+
+    unitigs_filename = prefix  + ".unitigs.fa";
+
+    if (load_graph)
+    {
+        /* it's not a bank, but rather a h5 file (kmercounted or more), let's complete it to a graph */
+        
+        if (!System::file().doesExist(input))
+            throw system::Exception ("Input file does not exist");
+
+        cout << "Input is gatb_/ or h5 (we assume that it contains at least the solid kmers).\n"; 
+        
+        /** We create a storage instance. */
+        /* (this is actually loading, not creating, the storage at "uri") */
+        BaseGraph::_storageMode = load_from_hdf5 ? STORAGE_HDF5 : STORAGE_FILE;
+        BaseGraph::setStorage (StorageFactory(BaseGraph::_storageMode).create (input, false, false));
+    
+        /** We get some properties. */
+        BaseGraph::_state     = (typename GraphUnitigsTemplate<span>::StateMask) atol (BaseGraph::getGroup().getProperty ("state").c_str());
+        
+        BaseGraph::_kmerSize  = atol (BaseGraph::getGroup().getProperty ("kmer_size").c_str());
+
+        if (BaseGraph::_kmerSize == 0) /* try the dsk group -> maybe it's a dsk h5 file, not a minia one */
+            BaseGraph::_kmerSize  =    atol (BaseGraph::getGroup("dsk").getProperty ("kmer_size").c_str());
+        
+        // also assume kmer counting is done
+        setState(GraphUnitigsTemplate<span>::STATE_SORTING_COUNT_DONE);
+        
+        /** We get library information in the root of the storage. */
+        string xmlString = BaseGraph::getGroup().getProperty ("xml");
+        stringstream ss; ss << xmlString;   IProperties* props = new Properties(); LOCAL(props);
+        props->readXML (ss);  BaseGraph::getInfo().add (1, props);
+        
+        /** We configure the data variant according to the provided kmer size. */
+        BaseGraph::setVariant (BaseGraph::_variant, BaseGraph::_kmerSize);
+
+        /* call the configure visitor to load everything (e.g. solid kmers, MPHF, etc..) that's been done so far */
+        boost::apply_visitor ( configure_visitor<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span>>(*this, BaseGraph::getStorage()),  *(GraphDataVariantFast<span>*)BaseGraph::_variant);
+
+        build_unitigs_postsolid(unitigs_filename, params);
+      
+        // cycle storage to remove leaks..? doesn't seem to help with that actually
+        //BaseGraph::setStorage (StorageFactory(BaseGraph::_storageMode).create (input, false, false));
+
+        if (load_unitigs_after) 
+            load_unitigs(unitigs_filename);
+
+    }
+    else
+    {
+        /** We get the kmer size from the user parameters. */
+        BaseGraph::_kmerSize = params->getInt (STR_KMER_SIZE);
+        size_t integerPrecision = params->getInt (STR_INTEGER_PRECISION);
+
+        /** We configure the data variant according to the provided kmer size. */
+        BaseGraph::setVariant (BaseGraph::_variant, BaseGraph::_kmerSize, integerPrecision);
+
+        /** We build a Bank instance for the provided reads uri. */
+        bank::IBank* bank = Bank::open (params->getStr(STR_URI_INPUT));
+
+        /** We build the graph according to the wanted precision. */
+        boost::apply_visitor ( build_visitor_solid<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span>>(*this, bank,params),  *(GraphDataVariantFast<span>*)BaseGraph::_variant);
+
+        build_unitigs_postsolid(unitigs_filename, params);
+        
+        if (load_unitigs_after)
+            load_unitigs(unitigs_filename);
+    }
+}
+
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate ()
+    : GraphTemplate<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span>>()
+{
+}
+
+template<size_t span>
+GraphUnitigsTemplate<span>::GraphUnitigsTemplate (const GraphUnitigsTemplate<span>& graph)
+    : GraphTemplate<NodeFast<span>,EdgeFast<span>,GraphDataVariantFast<span>>(graph)
+{
+    // will call Graph's constructor
+    std::cout << "GraphU copy-constructor called" << std::endl;
+    // doesn't it need other stuff to be copied tho? like all that's in operator=. so weird.
+}
+
+/*********************************************************************
+** PURPOSE : copy assignment operator
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>& GraphUnitigsTemplate<span>::operator= (GraphUnitigsTemplate<span> const& graph)
+{
+    std::cout <<"assignment constructor called" << std::endl;
+    if (this != &graph)
+    {
+        BaseGraph::_kmerSize        = graph._kmerSize;
+        BaseGraph::_storageMode     = graph._storageMode;
+        BaseGraph::_name            = graph._name;
+        BaseGraph::_info            = graph._info;
+        BaseGraph::_state           = graph._state;
+
+        BaseGraph::setStorage (graph._storage);
+
+        if (graph._variant)  {  *((GraphDataVariantFast<span>*)BaseGraph::_variant) = *((GraphDataVariantFast<span>*)graph._variant);  }
+
+        // don't forget those!
+        // I garantee that bugs will occur if i add a GraphUnitigs member variable and forget to copy it here
+        // DO ALSO THE MOVE FUNCTION BELOW
+    
+        incoming  = graph.incoming;
+        outcoming = graph.outcoming;
+        incoming_map  = graph.incoming_map;
+        outcoming_map = graph.outcoming_map;
+        dag_incoming  = graph.dag_incoming;
+        dag_outcoming = graph.dag_outcoming;
+        dag_incoming_map  = graph.dag_incoming_map;
+        dag_outcoming_map = graph.dag_outcoming_map;
+        compress_navigational_vectors = graph.compress_navigational_vectors;
+        pack_unitigs = graph.pack_unitigs;
+        packed_unitigs = graph.packed_unitigs;
+        packed_unitigs_sizes = graph.packed_unitigs_sizes;
+        unitigs = graph.unitigs;
+        unitigs_sizes = graph.unitigs_sizes;
+        unitigs_mean_abundance = graph.unitigs_mean_abundance;
+        unitigs_traversed = graph.unitigs_traversed;
+        unitigs_deleted = graph.unitigs_deleted;
+        nb_unitigs = graph.nb_unitigs;
+        nb_unitigs_extremities = graph.nb_unitigs_extremities;
+        
+    }
+    return *this;
+}
+
+/*********************************************************************
+** PURPOSE : move assignment operator
+** this seems important, if it was not there, in Minia, the line "graph = create (..)" would incur a copy of the graph :/ didn't investigate further, implementing that move operator was enough to prevent the copy.
+// also the copy-and-swap idiom didn't seem to help, i got infinite loop because of effect described here http://stackoverflow.com/questions/25942131/should-copy-assignment-operator-leverage-stdswap-as-a-general-rule
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>& GraphUnitigsTemplate<span>::operator= (GraphUnitigsTemplate<span> && graph)
+{
+    //std::cout <<"move constructor called" << std::endl;
+    
+    if (this != &graph)
+    {
+        BaseGraph::_kmerSize        = graph._kmerSize;
+        BaseGraph::_storageMode     = graph._storageMode;
+        BaseGraph::_name            = graph._name;
+        BaseGraph::_info            = graph._info;
+        BaseGraph::_state           = graph._state;
+
+        BaseGraph::setStorage (graph._storage);
+
+        if (graph._variant)  {  *((GraphDataVariantFast<span>*)BaseGraph::_variant) = *((GraphDataVariantFast<span>*)graph._variant);  }
+
+        // don't forget those!
+        // I garantee that bugs will occur if i add a GraphUnitigs member variable and forget to copy it here
+    
+        incoming  = std::move(graph.incoming);
+        outcoming = std::move(graph.outcoming);
+        incoming_map  = std::move(graph.incoming_map);
+        outcoming_map = std::move(graph.outcoming_map);
+        dag_incoming  = std::move(graph.dag_incoming);
+        dag_outcoming = std::move(graph.dag_outcoming);
+        dag_incoming_map  = std::move(graph.dag_incoming_map);
+        dag_outcoming_map = std::move(graph.dag_outcoming_map);
+        compress_navigational_vectors = std::move(graph.compress_navigational_vectors);
+        pack_unitigs = std::move(graph.pack_unitigs);
+        packed_unitigs = std::move(graph.packed_unitigs);
+        packed_unitigs_sizes = std::move(graph.packed_unitigs_sizes);
+        unitigs = std::move(graph.unitigs);
+        unitigs_sizes = std::move(graph.unitigs_sizes);
+        unitigs_mean_abundance = std::move(graph.unitigs_mean_abundance);
+        unitigs_traversed = std::move(graph.unitigs_traversed);
+        unitigs_deleted = std::move(graph.unitigs_deleted);
+        nb_unitigs = std::move(graph.nb_unitigs);
+        nb_unitigs_extremities = std::move(graph.nb_unitigs_extremities);
+        
+    }
+    return *this;
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+GraphUnitigsTemplate<span>::~GraphUnitigsTemplate<span> ()
+{
+    // base deleter already called
+    //std::cout <<"unitigs graph destructor called" << std::endl;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void GraphUnitigsTemplate<span>::remove ()
+{
+    //std::cout << "GraphU remove called" << std::endl;
+    BaseGraph::getStorage().remove();
+}
+
+
+    /* just a note: nothing weird with having 1-in, 1-out nodes in GraphUnitigs: consider that example:
+     *        --------
+     *                 \
+     *                  v
+     *  -------[node] -> -----------
+     *
+     * [node] is 1-in and 1-out yet compactions were fine, it's just that there is in-branching in the following node.
+     */
+
+template<size_t span>
+GraphVector<EdgeGU> GraphUnitigsTemplate<span>::getEdges (const NodeGU& source, Direction direction)  const
+{
+    bool debug = false;
+
+    if (debug)
+    {
+        std::cout << "graphU getEdges called, on source: " << toString(source) << " unitig: " << source.unitig << " pos: " << (source.pos==UNITIG_BEGIN?"beg":"end") << " strand: " << source.strand << " dir " << direction << std::endl;
+    }
+
+    if (source.pos == UNITIG_INSIDE)
+    {
+        std::cout << "Error: called getEdges on a node that's UNITIG_INSIDE: " << toString(source) << std::endl; exit(1);
+    }
+ 
+    GraphVector<EdgeGU> res;
+
+    res.resize(0);
+    
+    unsigned int kmerSize = BaseGraph::_kmerSize;
+    unsigned int seqSize = internal_get_unitig_length(source.unitig);
+    
+    bool same_orientation = node_in_same_orientation_as_in_unitig(source);
+    bool pos_begin = source.pos & UNITIG_BEGIN;
+    bool pos_end = source.pos & UNITIG_END;
+
+    if ((!pos_begin) && (!pos_end))
+    {
+        std::cout << "weird node position: " << source.pos << " unitig length: " << seqSize;
+        exit(1);
+    }
+
+	// these cases are to handle getEdges() for nodes that are inside unitigs. I don't think we use them at all.
+    if ((unsigned int)seqSize > (unsigned int)kmerSize)
+    {
+        // unitig: [kmer]-------
+        if (same_orientation && (direction & DIR_OUTCOMING) && pos_begin) 
+        {
+            Unitig_pos pos = UNITIG_INSIDE;
+            if (seqSize == kmerSize + 1) pos = UNITIG_END;
+            res.resize(res.size()+1);
+            res[res.size()-1].set ( source.unitig, source.pos, source.strand, source.unitig, pos, source.strand, DIR_OUTCOMING);
+            if (debug) std::cout << "found success of [kmer]---" << std::endl;
+        }
+
+        // unitig: [kmer rc]-------
+        if ((!same_orientation) && (direction & DIR_INCOMING) && pos_begin) 
+        {
+            Unitig_pos pos = UNITIG_INSIDE;
+            if (seqSize == kmerSize + 1) pos = UNITIG_END;
+            res.resize(res.size()+1);
+            res[res.size()-1].set ( source.unitig, source.pos, source.strand, source.unitig, pos, source.strand, DIR_INCOMING); // not sure about the dest.strand in those cases, so i'm setting to source.strand, we'll see. (applies to all 3 other cases) It doesn't matter in Minia anyway, we don't use nodes inside unitigs
+            if (debug) std::cout << "found success of [kmer rc]---" << std::endl;
+        }
+
+        // unitig: ----------[kmer]
+        if ((same_orientation) && (direction & DIR_INCOMING) && pos_end)
+        {
+            Unitig_pos pos = UNITIG_INSIDE;
+            if (seqSize == kmerSize + 1) pos = UNITIG_BEGIN;
+            res.resize(res.size()+1);
+            res[res.size()-1].set ( source.unitig, source.pos, source.strand, source.unitig, pos, source.strand, DIR_INCOMING);
+            if (debug) std::cout << "found predec of --------[kmer]" << std::endl;
+        }
+
+        // unitig: ----------[kmer rc]
+        if ((!same_orientation) && (direction & DIR_OUTCOMING) && pos_end)
+        {
+            Unitig_pos pos = UNITIG_INSIDE;
+            if (seqSize == kmerSize + 1) pos = UNITIG_BEGIN;
+            res.resize(res.size()+1);
+            res[res.size()-1].set ( source.unitig, source.pos, source.strand, source.unitig, pos, source.strand, DIR_OUTCOMING);
+            if (debug) std::cout << "found predec of --------[kmer rc]" << std::endl;
+        }
+    }
+    else
+    {
+        pos_begin = pos_end = true; // necessary fix that sohuld have happened in parse_unitig_header
+    }
+    
+    // otherwise, that extremity kmer has neighbors at are also extremities.
+    // so, mutate to get all 4 outneighrs, and test for their existence in the utigs_map
+    
+    auto functor = [&](range<std::vector<uint64_t>::const_iterator >&& edges, Direction dir)
+    {
+        auto it = edges.begin();
+        if (it == edges.end()) return;
+        for (; it != edges.end(); it++)
+        {
+            auto edge_packed = *it;
+            ExtremityInfo li(edge_packed);
+
+            if (li.unitig > unitigs_deleted.size())
+            {
+                std::cout << "unexpected error: li.unitig=" <<li.unitig<< ", unitig_deleted.size()=" << unitigs_deleted.size() << std::endl; exit(1);
+            }
+            if (unitigs_deleted[li.unitig]) 
+            {
+                if (debug)
+                    std::cout << "found deleted neighbor unitig "<<  li.unitig <<" (kmer: " << this->/*not putting this this crashes gcc 4.7 */toString(NodeGU(li.unitig, li.pos)) << ")" << std::endl;
+                continue;
+            }
+
+            uint64_t unitig = li.unitig;
+            Unitig_pos pos = li.pos;
+            bool rc = li.rc;
+
+            if (!same_orientation)
+                rc = !rc;
+
+            kmer::Strand strand = rc?STRAND_REVCOMP:STRAND_FORWARD;
+
+            if (debug) 
+            {
+                NodeGU node(unitig, pos, strand);
+                std::cout << "[out-of-unitig getEdges], found neighbor " << this->/*not putting this this crashes gcc 4.7 */toString(node) << " dir " << dir << std::endl;
+            }
+    
+            res.resize(res.size()+1);
+            res[res.size()-1].set ( source.unitig, source.pos, source.strand, unitig, pos, strand, dir);
+        }
+    }; 
+
+    // TODO: write an unit test for the bug where not putting paranthesis there: pos_end && (...) was still working, but causes more edges to be returned than necessary. (only in DIR_END i think)
+    if (pos_end && (((direction & DIR_OUTCOMING) && same_orientation) || ( (direction & DIR_INCOMING) && (!same_orientation) ) ))
+    {
+        // nodes to the right of a unitig (outcoming)
+        Direction dir = same_orientation?DIR_OUTCOMING:DIR_INCOMING;
+        if (compress_navigational_vectors) 
+            functor(get_from_compressed_navigational_vector(outcoming, source.unitig, dag_outcoming_map), dir);
+        else
+            functor(get_from_navigational_vector(outcoming, source.unitig, outcoming_map), dir);
+    }
+    if (pos_begin && (((direction & DIR_INCOMING) && same_orientation) || ( (!same_orientation) && (direction & DIR_OUTCOMING)) ))
+    {
+        // nodes to the left of a unitig (incoming)
+        Direction dir = same_orientation?DIR_INCOMING:DIR_OUTCOMING;
+        if (compress_navigational_vectors) 
+            functor(get_from_compressed_navigational_vector(incoming, source.unitig, dag_incoming_map), dir);
+        else
+            functor(get_from_navigational_vector(incoming, source.unitig, incoming_map), dir);
+    }
+
+    // sanity check on output, due to limitation on GraphVector nmber of elements
+    if (res.size() > 16)
+    { 
+        std::cout << "Error : more than 16 edges (" << res.size() << ") out of node, not supported (already more than 8 is strange)" << std::endl; 
+        std::cout << "graphU getEdges was called on source: " << toString(source) << " unitig: " << source.unitig << " pos: " << (source.pos==UNITIG_BEGIN?"beg":"end") << " strand: " << source.strand << " dir " << direction << std::endl;
+        exit(1);
+    }
+    
+    return res;
+}
+
+/* this function isn't the most efficient, but then again, Minia doesn't use it */
+// I think I only implemented it so that it passes simple tests (TestDebruijnUnitigs.cpp)
+template<size_t span>
+GraphVector<NodeGU> GraphUnitigsTemplate<span>::getNodes (const NodeGU &source, Direction direction)  const
+{
+    GraphVector<NodeGU> nodes;
+    GraphVector<EdgeGU> edges = getEdges (source, direction);
+    nodes.resize(edges.size());
+    for (unsigned int i = 0; i < edges.size(); i++)
+    {
+        nodes[i] = edges[i].to;
+    }
+    return nodes;
+}
+
+
+template<size_t span>
+unsigned char GraphUnitigsTemplate<span>::countNeighbors (const NodeGU &source, Direction direction)  const
+{
+    // for the sake of no duplication and removing bugs, i'm de-optimizing this function for now.
+    GraphVector<EdgeGU> edges = getEdges(source, direction);
+    return edges.size();
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::countNeighbors (const NodeGU &source, size_t &in, size_t &out)  const
+{
+    std::cout << "GraphU countNeighbors source,in,out not implememented" << std::endl;exit(1);
+}
+
+template<size_t span>
+NodeGU GraphUnitigsTemplate<span>::getNode (const NodeGU& source, Direction dir, kmer::Nucleotide nt, bool& exists) const
+{
+    std::cout << "GraphU getNode source,dir,nt,exists  not implememented" << std::endl;exit(1);
+    return NodeGU();
+}
+
+template<size_t span>
+GraphIterator<NodeGU> GraphUnitigsTemplate<span>::getNodes () const
+{
+    /* emulates iteration of nodes à la original GATB Graph */
+    /* except that here, we only iterate the extremities of unitigs */
+    class NodeIterator : public tools::dp::ISmartIterator<NodeGU>
+    {
+        public:
+            NodeIterator (const /*dag::dag_vector*/ std::vector<uint32_t>& unitigs_sizes, const std::vector<bool>& unitigs_deleted, unsigned int k, unsigned int nb_unitigs_extremities) 
+                :  _nbItems(nb_unitigs_extremities), _rank(0), _isDone(true), unitigs_sizes(unitigs_sizes), unitigs_deleted(unitigs_deleted), k(k), nb_unitigs(unitigs_sizes.size()) {  
+                    this->_item->strand = STRAND_FORWARD;  // iterated nodes are always in forward strand.
+                }
+
+            ~NodeIterator ()  {  }
+
+            u_int64_t rank () const { return _rank; }
+
+            void update_item()
+            {
+                this->_rank ++;
+                this->_item->unitig = it/2;
+                this->_item->pos = (it&1)?UNITIG_END:UNITIG_BEGIN;
+            }
+
+            /** \copydoc  Iterator::first */
+            void first()
+            {
+                it = 0;
+                while (unitigs_deleted[it/2] && it < 2*nb_unitigs) it++;
+                _rank   = 0;
+                _isDone = it >= (2*nb_unitigs);
+
+                if (!_isDone)
+                    update_item();
+            }
+
+            /** \copydoc  Iterator::next */
+            void next()
+            {
+                do
+                {
+                    it++;
+                    if ((it < 2*nb_unitigs) && unitigs_sizes[it/2] == k) // takes care of the case where the unitig is just a kmer
+                        it++;
+                } while ((it < 2*nb_unitigs) && unitigs_deleted[it/2]);
+                _isDone = it >= (2*nb_unitigs);
+                if (!_isDone)
+                    update_item();
+            }
+
+            /** \copydoc  Iterator::isDone */
+            bool isDone() { return _isDone;  }
+
+            /** \copydoc  Iterator::item */
+            NodeGU& item ()  {  return *(this->_item);  }
+
+            void setItem (NodeGU& i)
+            {
+                /** We set the node item to be set for the current iterator. */
+                this->_item = &i;
+                this->_item->strand = STRAND_FORWARD;
+            }
+
+            /** */
+            u_int64_t size () const { return _nbItems; }
+
+        private:
+            uint64_t it;
+            u_int64_t _nbItems;
+            u_int64_t _rank;
+            bool      _isDone;
+            const /*dag::dag_vector*/ std::vector<uint32_t>& unitigs_sizes;
+            const std::vector<bool>& unitigs_deleted;
+            unsigned int k;
+            unsigned int nb_unitigs;
+    };
+
+    return new NodeIterator(unitigs_sizes, unitigs_deleted, BaseGraph::_kmerSize, nb_unitigs_extremities);
+}
+
+template<size_t span> 
+bool GraphUnitigsTemplate<span>::isNodeDeleted(const NodeGU& node) const
+{
+    return unitigs_deleted[node.unitig];
+}
+
+
+
+// emulation of MPHF, but it's not used in minia
+template<size_t span> 
+unsigned long GraphUnitigsTemplate<span>::nodeMPHFIndex(const NodeGU& node) const 
+{
+    return (((node.pos == UNITIG_BEGIN )) ? 0 : 1) + (node.unitig << 1); 
+}
+
+/* warning: will delete the whole simple path */
+template<size_t span>
+void GraphUnitigsTemplate<span>::deleteNode (NodeGU& node) 
+{
+    unitigDelete (node);
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::cacheNonSimpleNodes(unsigned int nbCores, bool verbose) 
+{
+    // nothing to do with unitigs flavor.
+}
+ 
+template<size_t span>
+void GraphUnitigsTemplate<span>::deleteNodesByIndex(vector<bool> &bitmap, int nbCores, gatb::core::system::ISynchronizer* synchro) const
+{
+    std::cout << "deleteNodesByIndex called, shouldn't be." << std::endl; 
+    exit(1);
+}
+
+/********************************************************************************/
+template<size_t span>
+bool GraphUnitigsTemplate<span>::contains (const NodeGU& item) const
+{
+    std::cout << "contains() not implemeneted in GraphUnitigs" << std::endl; exit(1);
+    return false;
+}
+
+template<size_t span>
+bool GraphUnitigsTemplate<span>::
+node_in_same_orientation_as_in_unitig(const NodeGU& node) const
+{
+    return node.strand == kmer::STRAND_FORWARD;
+}
+
+template<size_t span>
+std::string GraphUnitigsTemplate<span>::toString (const NodeGU& node) const
+{
+    const std::string& seq = internal_get_unitig_sequence(node.unitig);
+    int kmerSize = BaseGraph::_kmerSize;
+
+    if (node.pos == UNITIG_INSIDE)
+    {    return "[GraphUnitigs.toString cannot print an UNITIG_INSIDE]"; }
+    
+    string node_str;
+    if (node.pos & UNITIG_BEGIN)
+        node_str = seq.substr(0,kmerSize);
+    else
+        node_str = seq.substr(seq.size()-kmerSize);
+
+    if (node.strand != kmer::STRAND_FORWARD)
+        node_str = revcomp(node_str);
+
+    return node_str;
+}
+
+// high-level functions that used to be in Simplifications.cpp
+template<size_t span>
+bool GraphUnitigsTemplate<span>::
+isLastNode(const NodeGU& node, Direction dir) const
+{
+    if (internal_get_unitig_length(node.unitig) == BaseGraph::_kmerSize) // special case.
+        return true;
+
+    bool same_orientation = node_in_same_orientation_as_in_unitig(node);
+    Unitig_pos pos = node.pos;
+
+    // cases where, following that unitig direction, we're already at the last node
+    if ((same_orientation    && (pos & UNITIG_END) && dir == DIR_OUTCOMING) ||
+        (same_orientation    && (pos & UNITIG_BEGIN) && dir == DIR_INCOMING) ||
+        ((!same_orientation) && (pos & UNITIG_END) && dir == DIR_INCOMING) ||
+        ((!same_orientation) && (pos & UNITIG_BEGIN) && dir == DIR_OUTCOMING))
+        return true;
+    return false;
+}
+
+template<size_t span>
+bool GraphUnitigsTemplate<span>::
+isFirstNode(const NodeGU& node, Direction dir) const
+{
+    // special case
+    if (internal_get_unitig_length(node.unitig) == BaseGraph::_kmerSize)
+    {
+        return true;
+    }
+
+    return !isLastNode(node,dir);
+}
+
+template<size_t span>
+double GraphUnitigsTemplate<span>::
+simplePathMeanAbundance     (const NodeGU& node, Direction dir) 
+{
+    if (isLastNode(node,dir))
+    {
+        if (!isFirstNode(node,dir))
+            return 0;
+        else // single-k-mer unitig
+            return unitigMeanAbundance(node);
+    }
+
+    float coverage = 0;
+    int endDegree;
+    int seqLength = 0;
+    simplePathLongest_avance(node, dir, seqLength, endDegree, false /*markDuringTraversal*/, coverage);
+    return coverage / (float)seqLength;
+}
+
+/* return the unitig's mean abundance as given by bcalm
+ * so, it's the mean abundance of all kmers inside that unitig
+ */
+template<size_t span>
+double GraphUnitigsTemplate<span>::
+unitigMeanAbundance     (const NodeGU& node) const
+{
+    return unitigs_mean_abundance[node.unitig];
+}
+
+template<size_t span>
+unsigned int GraphUnitigsTemplate<span>::
+simplePathLength            (const NodeGU& node, Direction dir) 
+{
+    float coverage = 0;
+    int endDegree;
+    int seqLength = 0;
+    simplePathLongest_avance(node, dir, seqLength, endDegree, false /*markDuringTraversal*/, coverage);
+    return seqLength;
+}
+
+template<size_t span>
+unsigned int GraphUnitigsTemplate<span>::
+unitigLength            (const NodeGU& node, Direction dir) const
+{
+    int length;
+    if (isLastNode(node,dir))
+        length = 0;
+    else
+        length = internal_get_unitig_length(node.unitig) - BaseGraph::_kmerSize;
+    return length;
+}
+
+template<size_t span>
+NodeGU GraphUnitigsTemplate<span>::
+unitigLastNode          (const NodeGU& node, Direction dir) const
+{
+    //std::cout << "lastnode" << toString(node) << " dir " << dir  << std::endl;
+    
+    if (isLastNode(node,dir))
+        return node;
+
+    // otherwise we know that we just take the other extremity, easy peasy
+    
+    NodeGU res;
+    if ((node.pos & UNITIG_BEGIN))
+        res = NodeGU(node.unitig, UNITIG_END, node.strand);
+    else
+        res = NodeGU(node.unitig, UNITIG_BEGIN, node.strand);
+    return res;
+}
+
+template<size_t span>
+NodeGU GraphUnitigsTemplate<span>::
+simplePathLastNode          (const NodeGU& node, Direction dir) 
+{
+    std::vector<NodeGU> nodesList;
+    int seqLength = 0, endDegree;
+    float coverage = 0;
+    simplePathLongest_avance(node, dir, seqLength, endDegree, false /*markDuringTraversal*/, coverage, nullptr, &nodesList);
+    if (nodesList.size() == 0)
+    {
+        assert(isLastNode(node,dir));
+        return node;
+    }
+    return nodesList.back();
+}
+
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+unitigDelete (NodeGU& node) 
+{
+    unitigs_deleted[node.unitig] = true;
+    //std::cout << "GraphU deleted unitig " << node.unitig << " seq: "  << unitigs[node.unitig] << std::endl; 
+}
+
+
+// wrapper that only puts the node into nodesDeleter
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+unitigDelete (NodeGU& node, Direction dir, NodesDeleter<NodeGU, EdgeGU, GraphUnitigsTemplate<span>>& nodesDeleter) 
+{
+    nodesDeleter.onlyListMethod = true; // a bit inefficient to always tell the deleter to be in that mode, but so be it for now. just 1 instruction, won't hurt.
+    //std::cout << "GraphU queuing to delete unitig " << node.unitig << " seq: "  << unitigs[node.unitig] << " mean abundance " << unitigMeanAbundance(node) << std::endl; 
+    nodesDeleter.markToDelete(node);
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+simplePathDelete (NodeGU& node, Direction dir, NodesDeleter<NodeGU, EdgeGU, GraphUnitigsTemplate<span>>& nodesDeleter) 
+{
+    std::vector<NodeGU> nodesList;
+    int seqLength = 0, endDegree;
+    float coverage = 0;
+    unitigDelete(node, dir, nodesDeleter);
+    simplePathLongest_avance(node, dir, seqLength, endDegree, false /*markDuringTraversal*/, coverage, nullptr, &nodesList);
+    for (auto cur_node : nodesList)
+    {
+        unitigDelete(cur_node, dir, nodesDeleter);
+    }
+}
+
+/* actually I don't think this function is called at all */
+template<size_t span>
+std::string GraphUnitigsTemplate<span>::
+unitigSequence (const NodeGU& node, bool& isolatedLeft, bool& isolatedRight) const
+{
+    const string& seq = internal_get_unitig_sequence(node.unitig);
+
+    //std::cout << " seq " << seq << " node " << toString(node) << std::endl;
+    NodeGU left = NodeGU(node.unitig, UNITIG_BEGIN);
+    NodeGU right = NodeGU(node.unitig, UNITIG_END);
+
+    isolatedLeft  = (indegree(left)   == 0);
+    isolatedRight = (outdegree(right) == 0);
+    return seq;
+}
+
+// keep traversing unitigs as far as we can.
+/* arguments:
+ * starting node 
+ * output sequence length (will be reset if previously set), NOTE: is the number of traversed kmers, so (sequencelength-k). there might be a +-1 length issue here.
+ * output end degree
+ * whether to mark during traversal
+ * total coverage of simple path (NOT normalized!)
+ * output sequence pointer (could be NULL if we don't care about it)
+ * all nodes extremities of simple paths traversed
+ */
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+simplePathLongest_avance(const NodeGU& node, Direction dir, int& seqLength, int& endDegree, bool markDuringTraversal, float& coverage, string* seq, std::vector<NodeGU> *nodesList) 
+{
+    bool debug = false;
+    if (debug)
+        std::cout << "simplePathLongest_avance called, node " << toString(node) << " strand " << node.strand << " dir " << dir << std::endl;
+
+    seqLength = 0;
+    unsigned int kmerSize = BaseGraph::_kmerSize;
+    NodeGU cur_node = node;
+    if (!isLastNode(cur_node,dir))
+    {
+        // first node in unitig may have in-branching, it's fine for a simple path traversal. we'll just go to last node and record the sequence of that unitig
+        int unitigLength = internal_get_unitig_length(node.unitig);
+
+        bool same_orientation = node_in_same_orientation_as_in_unitig(node);
+
+        if (seq != nullptr)
+        {
+            string new_seq = internal_get_unitig_sequence(node.unitig);
+
+            if (!same_orientation)
+                new_seq = revcomp(new_seq);
+
+            if (dir == DIR_OUTCOMING)
+                *seq += new_seq.substr(kmerSize-1);
+            else
+                *seq = new_seq.substr(0,new_seq.size()-(kmerSize-1)) + *seq;
+        }
+
+        // length is all the kmers of that unitig, except first one
+        seqLength += unitigLength - kmerSize;
+        // for coverage: it includes the abundance of the first kmer, because there's no way to exclude it, hence the +1
+        coverage += unitigMeanAbundance(cur_node) * (unitigLength - kmerSize + 1);
+       
+        if (debug)
+            std::cout << "simplePathLongest_avance was at a first node = " << toString(cur_node) << " strand " << cur_node.strand << " so traversed unitig of length " << unitigLength << " mean abundance: " << unitigMeanAbundance(cur_node) << ")" << std::endl;
+
+        cur_node = unitigLastNode(node,dir);       
+        
+        if (debug)
+            std::cout << "simplePathLongest_avance now at last node = " << toString(cur_node) << " strand " << cur_node.strand << std::endl;
+
+        if (nodesList != nullptr)
+            nodesList->push_back(cur_node);
+    }
+
+    if (markDuringTraversal) // no need to mark, that unitig should already be marked by minia, but doing it anyway just to be safe
+        unitigMark(cur_node);
+
+    set<uint64_t> traversed_unitigs;
+    
+    while (true)
+    { // invariant here: cur_node is the last node of a unitig
+
+        assert(isLastNode(cur_node,dir));
+
+        GraphVector<EdgeGU> neighbors = this->neighborsEdge (cur_node, dir);
+        endDegree = neighbors.size();
+        
+        /** We check we have no outbranching. */
+        if (endDegree != 1)
+        {
+            if (debug)
+                std:: cout << "simplePathLongest_avance stopped because # neighbor of node " << toString(cur_node) << ": " << neighbors.size() << std::endl;
+            return;
+        }
+      
+        uint64_t neighbor_unitig = neighbors[0].to.unitig;
+        if (traversed_unitigs.find(neighbor_unitig) != traversed_unitigs.end())
+        {
+            if (debug)
+                std::cout << "simplePathLongest_avance loop" << std::endl;
+            break;
+        }
+        traversed_unitigs.insert(neighbor_unitig);
+
+        bool same_orientation = node_in_same_orientation_as_in_unitig(neighbors[0].to);
+            
+        int unitigLength = internal_get_unitig_length(neighbor_unitig);
+
+        if (debug)
+            std::cout << "simplePathLongest_avance continues now at a last node = " << toString(cur_node) << " strand " << cur_node.strand << " of unitig " << cur_node.unitig << " length " << internal_get_unitig_length(cur_node.unitig) << ", neighbor.to " << toString(neighbors[0].to) << " strand " << neighbors[0].to.strand << " of unitig " << neighbors[0].to.unitig << " new seq length: " << unitigLength << std::endl;
+
+        // fix for 1-bit encoded unitig position. That fix could have happened in unitig_parse_header but i didn't want to encode pos in 2 bits. Also, could have happened in NodeGU constructor, but didn't want to waste time checking unitig size there
+        if (internal_get_unitig_length(neighbors[0].to.unitig) == kmerSize)
+            neighbors[0].to.pos = UNITIG_BOTH;
+
+        int npos = neighbors[0].to.pos;
+
+        // some sanity checks      
+        if (neighbors[0].to.pos != UNITIG_BOTH) 
+        {
+            // FIXME: there is a bcalm bug. see strange_seq.fa. i'll send it to antoine, but meanwhile, i'm coding a workaround
+            if (0)
+            {
+            if (dir==DIR_INCOMING )
+                assert( (npos == UNITIG_END   && same_orientation) || (npos == UNITIG_BEGIN && (!same_orientation)));
+            else
+                assert( (npos == UNITIG_BEGIN && same_orientation) || (npos == UNITIG_END   && (!same_orientation)));
+            }
+            if (dir==DIR_INCOMING )
+            {
+                if (!( (npos == UNITIG_END   && same_orientation) || (npos == UNITIG_BEGIN && (!same_orientation))))
+                {
+                    unitigDelete(neighbors[0].to);
+                    return;
+                }
+            }
+            else
+            {
+                if (!( (npos == UNITIG_BEGIN && same_orientation) || (npos == UNITIG_END   && (!same_orientation))))
+                {
+                    unitigDelete(neighbors[0].to);
+                    return;
+                }
+            }
+
+        }
+       
+        GraphVector<EdgeGU> in_neighbors_vec = this->neighborsEdge (neighbors[0].to, reverse(dir));
+        int in_neighbors = in_neighbors_vec.size();
+
+        assert(in_neighbors >= 1);
+        /** We check we have no in-branching. */
+        if (in_neighbors > 1) 
+        {
+            if (debug)
+                std:: cout << "simplePathLongest_avance stopped at " << toString(cur_node) << " because of in-branching " << in_neighbors << std::endl;
+            return;
+        } 
+
+        NodeGU last_node = unitigLastNode(neighbors[0].to, dir);
+        cur_node = last_node;
+
+        if (nodesList != nullptr)
+            nodesList->push_back(cur_node);
+
+        // append the sequence (except the overlap part, of length k-1.
+        if (seq != nullptr)
+        {
+            string new_seq = internal_get_unitig_sequence(cur_node.unitig);
+            if (!same_orientation)
+                new_seq = revcomp(new_seq);
+
+            if (dir == DIR_OUTCOMING)
+                *seq += new_seq.substr(kmerSize-1);
+            else
+                *seq = new_seq.substr(0,new_seq.size()-(kmerSize-1)) + *seq;
+        }
+
+        seqLength += unitigLength - (kmerSize-1);
+        coverage += unitigMeanAbundance(cur_node) * (unitigLength - kmerSize + 1); // here too, coverage is computed according to whole unitig
+        
+        //if (debug) std::cout << "seqlength add " << (unitigLength - (kmerSize-1)) << " added cov " << (unitigMeanAbundance(cur_node) * (unitigLength - kmerSize + 1)) << " mean ab " << unitigMeanAbundance(cur_node) << std::endl;
+
+        if (markDuringTraversal&& unitigIsMarked(cur_node)) // just a debug, can be removed
+        {
+            //std::cout << "marked node during a simple path traversal, that shouldn't happen. Maybe it's a perfect loop." << std::endl;
+            return;
+        }
+
+        if (markDuringTraversal)
+            unitigMark(cur_node);
+    }
+}
+
+/* returns the longest simple path; may have to traverse multiple unitigs, due to some branches being deleted */
+template<size_t span>
+std::string GraphUnitigsTemplate<span>::
+simplePathBothDirections(const NodeGU& node, bool& isolatedLeft, bool& isolatedRight, bool markDuringTraversal, float &coverage) 
+{
+    string seq = internal_get_unitig_sequence(node.unitig);
+    
+    int kmerSize = BaseGraph::_kmerSize;
+    float midTotalCoverage = unitigMeanAbundance(node) * (seq.size() - kmerSize + 1);
+
+    NodeGU left(node.unitig, UNITIG_BEGIN);
+    NodeGU right(node.unitig, UNITIG_END);
+
+    //std::cout << "starting seq " << seq << " (from node " << toString(node) << ") left: " << toString(left) << " right: " << toString(right) << std::endl;
+
+    if (markDuringTraversal)
+        unitigMark(left);
+
+    string seqRight = "", seqLeft = "";
+    int endDegreeLeft, endDegreeRight;
+    float rightTotalCoverage = 0, leftTotalCoverage = 0;
+    int lenSeqRight = 0, lenSeqLeft = 0;
+    simplePathLongest_avance (right, DIR_OUTCOMING, lenSeqRight, endDegreeRight, markDuringTraversal, rightTotalCoverage, &seqRight);
+    simplePathLongest_avance (left, DIR_INCOMING, lenSeqLeft, endDegreeLeft, markDuringTraversal, leftTotalCoverage, &seqLeft);
+
+    isolatedLeft  = (endDegreeLeft == 0);
+    isolatedRight = (endDegreeRight == 0);
+
+    // glue everything together
+    seq = seqLeft + seq + seqRight;
+    coverage = (rightTotalCoverage + leftTotalCoverage + midTotalCoverage) / (seq.size() - kmerSize + 1);
+    return seq;
+}
+
+
+// used to flag simple path as traversed, in minia
+// marks the whole unitig, not just an extremity
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+unitigMark            (const NodeGU& node) 
+{
+    unitigs_traversed[node.unitig] = true;
+} 
+
+template<size_t span>
+bool GraphUnitigsTemplate<span>::
+unitigIsMarked        (const NodeGU& node) const 
+{
+    return unitigs_traversed[node.unitig];
+}
+
+/* when debugging goes wrong;. print the whole graph. */
+template<size_t span>
+void GraphUnitigsTemplate<span>::
+debugPrintAllUnitigs() const
+{
+    std::cout << "Debug: printing all graph unitigs and status" << std::endl;
+    for (unsigned int i = 0; i < nb_unitigs; i++)
+    {
+        std::cout << "unitig " << i << " (length: " << internal_get_unitig_length(i) << ") " << (unitigs_deleted[i]?"[deleted]":"") << " links: ";
+
+
+        for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+        { 
+            GraphVector<EdgeGU> neighbors;
+            if (dir == DIR_OUTCOMING)
+            {
+                NodeGU cur_node(i, UNITIG_END);
+                neighbors = this->neighborsEdge (cur_node, dir);
+                std::cout << "out: ";
+            }
+            else
+            {
+                NodeGU cur_node(i, UNITIG_BEGIN);
+                neighbors = this->neighborsEdge (cur_node, dir);
+                std::cout << "in: ";
+            }
+            for (size_t i = 0; i < neighbors.size(); i++)
+            {
+                string pos = (neighbors[i].to.pos == UNITIG_BEGIN)?"beg":((neighbors[i].to.pos == UNITIG_END)?"end":"other");
+                std::cout << neighbors[i].to.unitig << "(" << pos << ") ";
+            }
+            std::cout <<  "    ";
+        }
+        std::cout << std::endl;
+    }
+    std::cout << "Done printing graph unitigs" << std::endl;
+}
+
+/* slow, O(|unitigs|) construction of a node given its kmer. for debug only */
+template<size_t span>
+NodeGU GraphUnitigsTemplate<span>::
+debugBuildNode(string startKmer) const
+{
+    bool debug=false;
+    for (unsigned int i = 0; i < nb_unitigs; i++)
+    {
+        string unitig = internal_get_unitig_sequence(i);
+        if (debug) std::cout << "debugBuildNode, testing unitig " << i << "/" << nb_unitigs << " : "  << unitig << std::endl;
+        for (int rc = 0; rc < 2; rc++)
+        {
+            if (rc == 1) 
+                unitig = revcomp(unitig);
+            if (unitig.substr(0, BaseGraph::_kmerSize) == startKmer)
+            {
+                return NodeGU(i,rc?UNITIG_END:UNITIG_BEGIN, rc?STRAND_REVCOMP:STRAND_FORWARD);
+            }
+            if (unitig.substr(unitig.size() - BaseGraph::_kmerSize) == startKmer)
+            {
+                return NodeGU(i,rc?UNITIG_BEGIN:UNITIG_END, rc?STRAND_REVCOMP:STRAND_FORWARD);
+            }
+        }
+    }
+    std::cout << "could not build node correspoding to kmer" << startKmer << ", it's not an unitig end." << std::endl;
+    exit(1);
+}
+
+
+/*
+ *
+ *
+ *
+ *
+ *
+ *
+ * boilerplate code that's common with Graph.hpp but i'm duplicating because too lazy to do a proper abstract class for GraphAbstract (and would be tedious no)
+ in other words: would be good to factorize with Graph.hpp but i think it'd require having a GraphAbstract and I'm not ready for that kind of design pattern yet.
+ *
+ * no algorithmic changes needed in GraphUnitigs
+ *
+ */
+
+
+template<size_t span>
+bool GraphUnitigsTemplate<span>::isBranching (const NodeGU& node) const
+/** REMARKS : it's a bit of a misnomer, but in GATB language, Branching means "anything not simple". I.e. simple means outdegree=indegree=1 and branching is every other degree combination, including 0's */
+{
+    size_t in, out;
+    degree(node, in, out); 
+    return (! (in==1 && out==1));
+}
+
+template<size_t span>
+bool GraphUnitigsTemplate<span>::isSimple (EdgeGU& edge) const
+{    return this->outdegree(edge.from)==1  &&  this->indegree(edge.to)==1;}
+
+template<size_t span>
+size_t GraphUnitigsTemplate<span>::indegree (const NodeGU& node) const  {  return degree(node, DIR_INCOMING);   }
+
+template<size_t span>
+size_t GraphUnitigsTemplate<span>::outdegree (const NodeGU& node) const  {  return degree(node, DIR_OUTCOMING);  }
+
+template<size_t span>
+size_t GraphUnitigsTemplate<span>::degree (const NodeGU& node, Direction dir) const  {  return countNeighbors(node, dir);  } // used to be getNodes(node,dir).size() but made it faster
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::degree (const NodeGU& node, size_t &in, size_t &out) const  {  countNeighbors(node, in, out);  } 
+
+
+template<size_t span>
+int GraphUnitigsTemplate<span>::simplePathAvance (const NodeGU& node, Direction dir) const
+{
+    EdgeGU output;  return simplePathAvance (node, dir, output);
+}
+
+template<size_t span>
+int GraphUnitigsTemplate<span>::simplePathAvance (const NodeGU& node, Direction dir, EdgeGU& output) const
+{
+    std::cout << "GraphU simplePathAvance called, not allowed in GraphUnitigs. try simplePathLongest_avance but it won't be edge-by-edge." << std::endl; exit(1);
+    // shouldn't be called!
+    // instead, do a more high level function
+    return 0;
+}
+
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::simplify(unsigned int nbCores, bool verbose)
+{
+        Simplifications<GraphUnitigsTemplate<span>,NodeGU,EdgeGU> 
+            graphSimplifications(*this, nbCores, verbose);
+        graphSimplifications.simplify();
+}
+
+
+/*
+ *
+ * functions that aren't or shouldn't be implemented in GraphUnitigs
+ *
+ *
+ */
+
+template<size_t span> 
+GraphIterator<NodeGU> GraphUnitigsTemplate<span>::getSimpleNodeIterator (const NodeGU& node, Direction dir) const
+{
+    std::cout << "getSimpleNodeIterator called in GraphU, not implemented" << std::endl; 
+    exit(1);
+    return GraphIterator<NodeGU> ();
+}
+
+template<size_t span> 
+GraphIterator<EdgeGU> GraphUnitigsTemplate<span>::getSimpleEdgeIterator (const NodeGU& node, Direction dir) const
+{
+    std::cout << "getSimpleEdgeIterator called in GraphU, not implemented" << std::endl; 
+    exit(1);
+    return GraphIterator<EdgeGU>();
+}
+
+template<size_t span> 
+int GraphUnitigsTemplate<span>::queryAbundance (const NodeGU& node) const
+{
+    std::cout << "queryAbundance called for a single node" << std::endl; 
+    exit(1);
+    return 0;
+}
+
+template<size_t span>
+int GraphUnitigsTemplate<span>::queryNodeState (const NodeGU& node) const 
+{
+    std::cout << "queryNodeState called in GraphU" << std::endl; 
+    std::cout << "not implemented" << std::endl; exit(1);
+    return 0;
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::setNodeState (const NodeGU& node, int state) const 
+{
+    //boost::apply_visitor (setNodeState_visitor<span>(node, state),  *(span*)BaseGraph::_variant);
+    std::cout << "GraphUnitigs::setNodeState() not implemented" << std::endl; exit(1);
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::resetNodeState() const
+{
+    //boost::apply_visitor (resetNodeState_visitor<span>(),  *(span*)BaseGraph::_variant);
+    std::cout << "GraphUnitigs::resetNodeState() not implemented" << std::endl; exit(1);
+}
+
+template<size_t span>
+void GraphUnitigsTemplate<span>::disableNodeState() const
+{
+    //boost::apply_visitor (disableNodeState_visitor<span>(),  *(span*)BaseGraph::_variant);
+    std::cout << "GraphUnitigs::disableNodeState() not implemented" << std::endl;
+}
+
+/*
+ *
+ * 2-bit compression of unitigs
+ *
+ */
+template<size_t span>
+std::string GraphUnitigsTemplate<span>::internal_get_unitig_sequence(unsigned int id) const
+{
+    std::string unitig_seq;
+    if (pack_unitigs)
+    {
+       if (id == 0)
+           unitig_seq = packed_unitigs.substr(0, packed_unitigs_sizes[0]);
+       else
+       {
+           uint64_t ps = packed_unitigs_sizes.prefix_sum(id);
+           unitig_seq = packed_unitigs.substr(ps, unitigs_sizes[id]);
+       }
+    }
+    else
+       unitig_seq = unitigs[id];
+    int i = unitigs_sizes[id];
+    std::string res(i,'x');
+    for (--i ; i >= 0; i--) {
+        const unsigned char c = (unitig_seq[i/4]);
+        const unsigned char byte = (c >> (2*(i % 4))) & 3;
+        if (byte == 2) 
+            res[i] = 'T';
+        else
+            res[i] = 'A' | (byte << 1);
+    }
+    return res;
+}
+
+template<size_t span>
+unsigned int GraphUnitigsTemplate<span>::internal_get_unitig_length(unsigned int id) const
+{
+    return unitigs_sizes[id];
+}
+
+template<size_t span>
+std::string GraphUnitigsTemplate<span>::internal_compress_unitig(std::string seq) const
+{
+    unsigned int n = (seq.size()+3)/4;
+    unsigned char res[n];
+    for (size_t i = 0; i < n; i++)
+        res[i] = 0;
+
+    for (size_t i = 0; i < seq.size(); i++)
+        res[i / 4] |= ((seq[i] >> 1) & 3) << (2*(i % 4));
+    
+    std::string res_str(reinterpret_cast<const char *>(res), n);
+    return res_str;
+}
+
+/*
+ *
+ *
+ * misc
+ *
+ *
+ */
+
+// instantiation
+// uses Node and Edge as defined in Graph.hpp (legacy GATB compatibility, when Graph was not templated)
+// so.. update;. this instantiation cannot be used by programs, but rather, it's to be used by TemplateSpecialization I think. So it could maybe be removed, and same for those in Graph.hpp
+template <size_t span>
+using GraphUnitigs = GraphUnitigsTemplate<span>; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
diff --git a/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.hpp b/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.hpp
new file mode 100644
index 0000000..f327ce6
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/GraphUnitigs.hpp
@@ -0,0 +1,442 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014-2016 
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_GRAPHUNITIGS_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_GRAPHUNITIGS_HPP_
+
+/********************************************************************************/
+#include <vector>
+#include <set>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/UnitigsConstructionAlgorithm.hpp>
+#include <gatb/debruijn/impl/ExtremityInfo.hpp>
+
+#include <gatb/debruijn/impl/dag_vector.hpp> // TODO move it to 3rd party
+
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for De Bruijn graph management. */
+namespace debruijn  {
+/** \brief Implementation package for De Bruijn graph management. */
+namespace impl      {
+
+/********************************************************************************/
+
+/* Nodes. Those correspond to left or right extremities of a unitig
+ *
+ * Big difference with Graph.hpp: in GraphUnitig, we don't store kmers in nodes. Kmers are inferred from unitigs
+ */
+struct NodeGU
+{
+    /** Default constructor. */
+    NodeGU() : unitig(0), pos(UNITIG_BEGIN), strand(kmer::STRAND_FORWARD)  {}
+
+    /** Constructor.
+     */
+    NodeGU (const uint64_t unitig, Unitig_pos pos, kmer::Strand strand)
+        : unitig(unitig), pos(pos), strand(strand) {}
+
+    NodeGU (const uint64_t unitig, Unitig_pos pos)
+        : unitig(unitig), pos(pos), strand(kmer::STRAND_FORWARD) {}
+
+
+    uint64_t unitig;
+    Unitig_pos pos;
+
+    /** Strand telling how to interpret the node in the bi-directed DB graph. */
+    kmer::Strand strand;
+
+    /** Overload of operator ==  NOTE: it doesn't care about the strand!!! */
+    bool operator== (const NodeGU& other) const  { return unitig == other.unitig && pos == other.pos; }
+
+    bool operator!= (const NodeGU& other) const  { return unitig != other.unitig || pos != other.pos; }
+
+    // this need to be implemented, for traversedNodes.find() in Simplifications
+    bool operator< (const NodeGU& other) const  { return (unitig < other.unitig || (unitig == other.unitig && pos < other.pos)); }
+
+    void set (uint64_t unitig, Unitig_pos pos, kmer::Strand strand)
+    {
+        this->unitig = unitig;
+        this->strand = strand;
+        this->pos    = pos;
+    }
+
+    void reverse()
+    {
+        strand = StrandReverse(strand);
+    }
+
+};
+
+struct EdgeGU 
+{
+    /** The source node of the edge. */
+    NodeGU from;
+    /** The target node of the edge. */
+    NodeGU to;
+    /** The direction of the transition. */
+    Direction        direction;
+    
+    // this need to be implemented, for something in in Simplifications
+    bool operator< (const EdgeGU& other) const  { return ((from < other.from) || (from == other.from && to < other.to)); } 
+
+    /** Setter for some attributes of the Edge object.
+     * \param[in] unitig_from
+     * \param[in] pos_from
+     * \param[in] strand_from : strand of the 'from' Node
+     * \param[in] unitig_to 
+     * \param[in] pos_to
+     * \param[in] strand_to : strand of the 'from' Node
+     * \param[in] dir : direction of the transition.
+     */
+    void set (
+        uint64_t unitig_from, Unitig_pos pos_from, kmer::Strand strand_from,
+        uint64_t unitig_to,   Unitig_pos pos_to,   kmer::Strand strand_to,
+        Direction dir
+    )
+    {
+        from.set (unitig_from, pos_from, strand_from);
+        to.set   (unitig_to,   pos_to,   strand_to);
+        direction = dir;
+    }
+};
+
+/********************************************************************************
+                 #####   ######      #     ######   #     #
+                #     #  #     #    # #    #     #  #     #
+                #        #     #   #   #   #     #  #     #
+                #  ####  ######   #     #  ######   #######
+                #     #  #   #    #######  #        #     #
+                #     #  #    #   #     #  #        #     #
+                 #####   #     #  #     #  #        #     #
+********************************************************************************/
+
+/** \brief Class representing a De Bruijn graph based on unitigs.
+ *
+ * Nodes are k-mer extremities of unitigs. They're represented implicitly internally.
+ * Edges are (k-1) overlaps between nodes in different unitigs
+ */
+
+template <size_t span>
+class GraphUnitigsTemplate : public GraphTemplate<NodeFast<span>, EdgeFast<span>, GraphDataVariantFast<span>>
+{
+    // but actually.. we almost don't use those nodes now! we use NodeGU.
+        typedef NodeFast<span> Node;
+        typedef EdgeFast<span> Edge;
+        
+public:
+
+    /********************************************************************************/
+    /*                            STATIC METHODS   (create/load)                    */
+    /********************************************************************************/
+
+    /** Build an empty graph.
+     * \param[in] kmerSize: kmer size
+     * \return the created graph.
+     */
+    static GraphUnitigsTemplate  create (size_t kmerSize)  {  return  GraphUnitigsTemplate(kmerSize);  }
+
+    /** Build a graph from a given bank.
+     * \param[in] bank : bank to get the reads from
+     * \param[in] fmt : printf-like format for the command line string
+     * \return the created graph.
+     */
+    static GraphUnitigsTemplate  create (bank::IBank* bank, const char* fmt, ...);
+
+    /** Build a graph from user options.
+     * \param[in] fmt: printf-like format
+     * \return the created graph.
+     */
+    static GraphUnitigsTemplate  create (const char* fmt, ...);
+
+    /** so, hm, what's the point of a create() function that just calls a constructor? I really don't get the factory pattern yet
+     */
+    static GraphUnitigsTemplate  create (tools::misc::IProperties* options, bool load_unitigs_after = true /* will be set to false by BCALM 2*/)  {  return  GraphUnitigsTemplate (options, load_unitigs_after);  }
+
+    /** Load a graph from some URI.
+     * \param[in] uri : the uri to get the graph from
+     * \return the loaded graph.
+     */
+    static GraphUnitigsTemplate  load (const std::string& uri)  {  return  GraphUnitigsTemplate (uri);  }
+    
+    // we don't provide an option parser. use Graph's one
+    //static tools::misc::IOptionsParser* getOptionsParser (bool includeMandatory=true);
+
+    /********************************************************************************/
+    /*                               CONSTRUCTORS                                   */
+    /********************************************************************************/
+
+    /* Default Constructor.*/
+    GraphUnitigsTemplate ();
+
+    /* Copy Constructor.*/
+    GraphUnitigsTemplate (const GraphUnitigsTemplate& graph);
+
+    /* Destructor. */
+    ~GraphUnitigsTemplate ();
+
+    /** Affectation overload. */
+    GraphUnitigsTemplate& operator= (GraphUnitigsTemplate const& graph);
+    GraphUnitigsTemplate& operator= (GraphUnitigsTemplate&& graph);
+
+    /**********************************************************************/
+    /*                     GLOBAL ITERATOR METHODS                        */
+    /**********************************************************************/
+
+    /** Creates an iterator over nodes of the graph.
+     * \return the nodes iterator. */
+
+    inline GraphIterator<NodeGU> iterator () const  {  return getNodes ();           }
+    inline GraphIterator<NodeGU> iteratorCachedNodes () const { return getNodes(); } /* cached nodes are just nodes in this case*/
+
+    /**********************************************************************/
+    /*                     ALL NEIGHBORS METHODS                          */
+    /**********************************************************************/
+
+    /** Returns a vector of neighbors of the provided node.
+     * \param[in] node : the node whose neighbors are wanted
+     * \param[in] direction : the direction of the neighbors. If not set, out and in neighbors are computed.
+     * \return a vector of the node neighbors (may be empty). 
+     * Warning: be sure to check if edge.from (or node.from) is actually your input node, or its reverse complement.
+     */
+    inline GraphVector<NodeGU> neighbors    ( NodeGU& node, Direction dir=DIR_END) const  {  return getNodes(node, dir);           }
+    
+    inline NodeGU* neighborsDummy      ( NodeGU& node, Direction dir=DIR_END) const  {   return NULL;           }
+
+
+    /* neighbors used to be templated.. not anymore, trying to avoid nested template specialization; 
+     * so call neighbors for getting nodes, or neighborsEdge for getting edges */
+    inline GraphVector<EdgeGU> neighborsEdge    ( NodeGU& node, Direction dir=DIR_END) const  {   return getEdges(node, dir);           }
+    inline EdgeGU* neighborsDummyEdge      ( NodeGU& node, Direction dir=DIR_END) const  {   return NULL;           }
+
+    /** Shortcut for 'neighbors' method
+     * \param[in] node : the node whose neighbors are wanted
+     * \return a vector of the node neighbors (may be empty).
+     */
+    inline GraphVector<NodeGU> successors   ( NodeGU& node) const                 {  return getNodes(node, DIR_OUTCOMING); }
+    inline GraphVector<NodeGU> predecessors ( NodeGU& node) const                 {  return getNodes(node, DIR_INCOMING);  }
+    inline GraphVector<EdgeGU> successorsEdge   ( NodeGU& node) const                 {  return getEdges(node, DIR_OUTCOMING); }
+    inline GraphVector<EdgeGU> predecessorsEdge ( NodeGU& node) const                 {  return getEdges(node, DIR_INCOMING);  }
+
+    /**********************************************************************/
+    /*                      MISC NEIGHBORS METHODS                        */
+    /**********************************************************************/
+
+    // would be good to factorize with Graph.hpp but i think it'd require having a GraphAbstract and I'm not ready for that kind of design pattern yet.
+    size_t indegree  (const NodeGU& node) const;
+    size_t outdegree (const NodeGU& node) const;
+    size_t degree    (const NodeGU& node, Direction dir) const;
+    void degree      (const NodeGU& node, size_t& in, size_t &out) const;
+   
+    /**********************************************************************/
+    /*                      SIMPLIFICATION METHODS                        */
+    /**********************************************************************/
+
+    /* perform tip removal, bulge removal and EC removal, as in Minia */
+    void simplify(unsigned int nbCores = 1, bool verbose=true);
+
+    /**********************************************************************/
+    /*                         SIMPLE PATH METHODS                        */
+    /**********************************************************************/
+
+    /** Simple paths traversal
+     *  invariant: the input kmer has no in-branching.
+     * \returns
+     *       1 if a good extension is found
+     *       0 if a deadend was reached
+     *      -1 if out-branching was detected
+     *      -2 if no out-branching but next kmer has in-branching
+     */
+    int simplePathAvance (const NodeGU& node, Direction dir, EdgeGU& output) const;
+    int simplePathAvance (const NodeGU& node, Direction dir) const;
+
+    /** */
+    GraphIterator<NodeGU> simplePath     (const NodeGU& node, Direction dir) const  { return getSimpleNodeIterator(node, dir); }
+    GraphIterator<EdgeGU> simplePathEdge (const NodeGU& node, Direction dir) const  { return getSimpleEdgeIterator(node, dir); }
+
+
+    /**********************************************************************/
+    /*                         UNITIGS METHODS (the essential stuff)      */
+    /**********************************************************************/
+
+    // convention: unitigXXX works on the unitigs as computed as bcalm. never leaves that unitig
+    //             simplepathXXX may traverse multiple unitigs
+    bool isLastNode                          (const NodeGU& node, Direction dir) const;
+    bool isFirstNode                         (const NodeGU& node, Direction dir) const;
+    NodeGU             unitigLastNode          (const NodeGU& node, Direction dir) const;
+    NodeGU         simplePathLastNode          (const NodeGU& node, Direction dir) ; /* cannot be const becuse it called Longuest_avance that is sometimes not const.. grr. */
+    unsigned int     unitigLength            (const NodeGU& node, Direction dir) const;
+    unsigned int simplePathLength            (const NodeGU& node, Direction dir) ; /* same reason as above*/ /* NOTE: return number of traversed kmers, so (nucleotide length-k)*/
+    double           unitigMeanAbundance     (const NodeGU& node) const;
+    double       simplePathMeanAbundance     (const NodeGU& node, Direction dir) ;
+    void             unitigDelete          (NodeGU& node, Direction dir, NodesDeleter<NodeGU, EdgeGU, GraphUnitigsTemplate<span>>& nodesDeleter);
+    void             unitigDelete          (NodeGU& node) ;
+    void         simplePathDelete          (NodeGU& node, Direction dir, NodesDeleter<NodeGU, EdgeGU, GraphUnitigsTemplate<span>>& nodesDeleter);
+    std::string  unitigSequence            (const NodeGU& node, bool& isolatedLeft, bool& isolatedRight) const;
+    void         unitigMark                (const NodeGU& node); // used to flag simple path as traversed, in minia
+    bool         unitigIsMarked        (const NodeGU& node) const;
+    
+    std::string simplePathBothDirections(const NodeGU& node, bool& isolatedLeft, bool& isolatedRight, bool dummy, float& coverage);
+    // aux function, not meant to be called from outside, but maybe it could.
+    void simplePathLongest_avance(const NodeGU& node, Direction dir, int& seqLength, int& endDegree, bool markDuringTraversal, float& coverage, std::string* seq = nullptr, std::vector<NodeGU> *unitigNodes = nullptr) ; 
+
+    void debugPrintAllUnitigs() const;
+
+    NodeGU debugBuildNode(std::string startKmer) const;
+
+    /**********************************************************************/
+    /*                         NODE METHODS                               */
+    /**********************************************************************/
+
+    std::string toString(const NodeGU& node) const;
+
+    // those are not implemented but I need them headers for compatibility with original Graph
+    bool contains (const NodeGU& item) const;
+    bool isBranching (const NodeGU& node) const;
+    int queryAbundance (const NodeGU& node) const;
+    int queryNodeState (const NodeGU& node) const;
+    void setNodeState (const NodeGU& node, int state) const;
+    void resetNodeState () const ;
+    void disableNodeState () const ;
+    void deleteNodesByIndex(std::vector<bool> &bitmap, int nbCores = 1, gatb::core::system::ISynchronizer* synchro=NULL) const;
+    unsigned long nodeMPHFIndex(const NodeGU& node) const;
+    void cacheNonSimpleNodes(unsigned int nbCores, bool verbose); 
+
+
+    // deleted nodes, related to NodeState above
+    void deleteNode (/* cannot be const because nodeDeleter isn't */ NodeGU& node) ;
+    bool isNodeDeleted(const NodeGU& node) const;
+
+    /**********************************************************************/
+    /*                         EDGE METHODS                               */
+    /**********************************************************************/
+
+    /** Tells whether the provided edge is simple: outdegree(from)==1 and indegree(to)==1
+     * \param[in] edge : the edge to be asked
+     * \return true if the edge is simple, false otherwise. */
+    bool isSimple (EdgeGU& edge) const;
+
+    /**********************************************************************/
+    /*                         MISC METHODS                               */
+    /**********************************************************************/
+
+    /** Remove physically a graph. */
+    void remove ();
+
+    /**********************************************************************/
+    /*                         TYPES                                      */
+    /**********************************************************************/
+    enum StateMask
+    {
+        STATE_INIT_DONE           = (1<<0),
+        STATE_CONFIGURATION_DONE  = (1<<1),
+        STATE_SORTING_COUNT_DONE  = (1<<2),
+        STATE_MPHF_DONE           = (1<<6), // to keep compatibility with Traversal and others who check for MPHF, since we support _some_ of the MPHF-like queries (but not on all nodes)
+        STATE_BCALM2_DONE         = (1<<20)
+    };
+    typedef u_int64_t State; /* this is a global graph state, not to be confused of the state of a node (deleted or not) */
+    typedef GraphTemplate<NodeFast<span>, EdgeFast<span>, GraphDataVariantFast<span>> BaseGraphForState;
+    State getState () const { return BaseGraphForState::_state; }
+    bool  checkState (StateMask mask) const { return (BaseGraphForState::_state & (State)mask)==(State)mask; }
+    State setState   (StateMask mask) { BaseGraphForState::_state |=  mask; return BaseGraphForState::_state; }
+    State unsetState (StateMask mask) { BaseGraphForState::_state &= ~mask; return BaseGraphForState::_state; }
+
+    /** Constructor for empty graph.*/
+    GraphUnitigsTemplate (size_t kmerSize);
+
+    GraphUnitigsTemplate (bank::IBank* bank, tools::misc::IProperties* params);
+
+    GraphUnitigsTemplate (tools::misc::IProperties* params, bool load_unitigs_after);
+
+    /** Constructor. Use for reading from filesystem. */
+    GraphUnitigsTemplate (const std::string& uri);
+
+public: // was private: before, but had many compilation errors during the change from Graph to GraphTemplate. took the easy route, set it to "public:", it solved everything.
+   
+    /** */
+    GraphIterator<NodeGU> getNodes () const;
+    
+    unsigned char countNeighbors (const NodeGU&, Direction) const; // simple and much faster version of getNodes, for degree(), outdegree(), indegree() queries
+    void countNeighbors (const NodeGU&, size_t&, size_t&) const;  // compute in and out degree at the same time
+
+    /** */
+    GraphIterator<NodeGU> getSimpleNodeIterator (const NodeGU& node, Direction dir) const;
+
+    /** */
+    GraphIterator<EdgeGU> getSimpleEdgeIterator (const NodeGU& node, Direction dir) const;
+
+    /** */
+    GraphVector<EdgeGU> getEdges (const NodeGU& source, Direction direction) const;
+
+    /** */
+    GraphVector<NodeGU> getNodes (const NodeGU &source, Direction direction)  const;
+
+    /** */
+    NodeGU getNode (const NodeGU& source, Direction dir, kmer::Nucleotide nt, bool& exists) const;
+    
+    typedef typename gatb::core::kmer::impl::Kmer<span>::Type           Type;
+
+    void build_unitigs_postsolid(std::string unitigs_filename, tools::misc::IProperties* props);
+    void load_unitigs(std::string unitigs_filename);
+
+    void load_unitigs_from_gfa(std::string gfa_filename, unsigned int& kmerSize);
+    void print_unitigs_mem_stats(uint64_t avg_incoming_size, uint64_t avg_outcoming_size, uint64_t total_unitigs_size, uint64_t nb_utigs_nucl = 0, uint64_t nb_utigs_nucl_mem = 0);
+
+    bool node_in_same_orientation_as_in_unitig(const NodeGU& node) const;
+      
+    // support for 2-bit compression of unitigs
+    std::string internal_get_unitig_sequence(unsigned int unitig_id) const;
+    unsigned int internal_get_unitig_length(unsigned int unitig_id) const;
+    std::string internal_compress_unitig(std::string seq) const;
+
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::ModelDirect ModelDirect;
+ 
+    // !!!!
+    // all member variables should be below this point, because i want you to also read this:
+    // don't forget to copy those variables in operator= (and the move operator) 
+    // classic source of bugs but i couldn't find a foolproof way.
+    // !!!!
+    std::vector<uint64_t> incoming, outcoming, incoming_map, outcoming_map;
+    dag::dag_vector dag_incoming, dag_outcoming, dag_incoming_map, dag_outcoming_map;
+    std::vector<std::string> unitigs;
+    std::string packed_unitigs;
+    std::vector<uint32_t> unitigs_sizes; 
+    dag::dag_vector packed_unitigs_sizes;
+    std::vector<float> unitigs_mean_abundance;
+    //dag::dag_vector unitigs_sizes;// perf hit: from 45s to 74s in chr14; that's because unitigs_sizes is queried _a lot_ just to check if a unitig is just of length k. could save that space with a bit vector, and actually, just use packed_unitigs_sizes for the rest. so.. just to keep in mind that this is a "todo opt" in case we really want to save the space of unitigs_sizes
+    //dag::dag_vector unitigs_mean_abundance; // not a big gain and different assembly quality, so i'm keeping it as vector<float>
+    std::vector<bool> unitigs_deleted; // could also be replaced by modifying incoming and outcoming vectors. careful not to affect the prefix sum scheme tho.
+    std::vector<bool> unitigs_traversed;
+    uint64_t nb_unitigs, nb_unitigs_extremities;
+    bool compress_navigational_vectors;
+    bool pack_unitigs;
+    // !!!!
+    // read above
+    // !!!!
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_IMPL_GRAPH_BASIC_HPP_ */
diff --git a/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.cpp b/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.cpp
new file mode 100644
index 0000000..9100f9d
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.cpp
@@ -0,0 +1,378 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Uricaru, P.Peterlongo, R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#include <gatb/debruijn/impl/IterativeExtensions.hpp>
+#include <gatb/bank/impl/BankFasta.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+#include <cstdio>
+#define DEBUG(a)    //a
+#define VERBOSE(a)
+#define INFO(a)
+
+using namespace std;
+
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+//#define DONTMARK
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+// We define a structure holding a Node and a depth
+template <typename Node>
+struct NodeDepth
+{
+    Node node;
+    int  depth;
+
+    NodeDepth () : node(0,STRAND_FORWARD), depth(0) {}
+
+    NodeDepth (typename Node::Value kmer, Strand strand, int depth) : node(kmer,strand), depth(depth) {}
+
+    // needed for comparisons inside a list
+    bool operator<(const NodeDepth &other) const
+    {
+        if (node.kmer  != other.node.kmer)  { return (node.kmer < other.node.kmer); }
+        if (depth      != other.depth)      { return (depth     < other.depth);     }
+        return (node.strand < other.node.strand);
+    }
+};
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+/*
+ * our assembly graph is connected by (k-1)-overlaps,
+ * so this function is used to make sure we see each (k-1)-overlap in at most one right extremity
+ */
+template<size_t span, typename Node, typename Edge, typename Graph>
+bool IterativeExtensions<span, Node, Edge, Graph>::compare_and_mark_last_k_minus_one_mer (const string& node, set<kmer_type>& kmers_set)
+{
+    KmerModel leftKmer = modelMinusOne.codeSeed (node.c_str(), Data::ASCII, node.size() - modelMinusOne.getKmerSize());
+    kmer_type kmer = leftKmer.value();
+
+    if (kmers_set.find(kmer) != kmers_set.end())
+        return true;
+
+    kmers_set.insert(kmer);
+    return false;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+IterativeExtensions<span, Node, Edge, Graph>::IterativeExtensions (
+    const Graph&        graph,
+    TerminatorTemplate<Node,Edge,Graph>&         terminator,
+    TraversalKind       traversalKind,
+    ExtendStopMode_e    whenToStop,
+    SearchMode_e        searchMode,
+    bool                dontOutputFirstNucl,
+    int                 max_depth,
+    int                 max_nodes
+)
+    : graph(graph), terminator(terminator),
+      traversalKind(traversalKind),  when_to_stop_extending(whenToStop),
+      searchMode(searchMode), dont_output_first_nucleotide(dontOutputFirstNucl),
+      max_depth(max_depth), max_nodes(max_nodes)
+{
+    model         = Model (graph.getKmerSize()  );
+    modelMinusOne = Model (graph.getKmerSize()-1);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+void IterativeExtensions<span, Node, Edge, Graph>::construct_linear_seqs (
+    const string& L,
+    const string& R,
+    IBank*        outputBank,
+    bool          swf
+)
+{
+    /** Shortcuts. */
+    size_t sizeKmer = graph.getKmerSize();
+
+    /** We first reset the terminator. */
+    terminator.reset(); // distinct extensions may share kmers, however, a unique extension doesn't.
+
+    DEBUG ((cout << "[IterativeExtensions::construct_linear_seqs]  output=" << outputBank->getId() << "  L=" << L
+        << "  search=" << searchMode << " swf=" << swf << endl
+    ));
+
+    /** We get a token on the bank. */
+    LOCAL (outputBank);
+
+    /** We create a Traversal instance. */
+    TraversalTemplate<Node,Edge,Graph>* traversal = TraversalTemplate<Node,Edge,Graph>::create (traversalKind, graph, terminator, max_depth, 500, 20);
+    LOCAL (traversal);
+
+    long long nbNodes = 0;
+    long long totalnt = 0;
+
+    /** We need a container that holds NodeDepth objects during the extension. */
+    vector <NodeDepth<Node> > kmers_to_traverse;
+
+    /** We get the first kmer of the L string. */
+    KmerModel leftKmer = model.codeSeed (L.c_str(), Data::ASCII, 0);
+
+    /** We put this kmer into the vector of kmers to be processed. */
+    NodeDepth<Node> ksd (typename Node::Value(leftKmer.value()), leftKmer.which() ? STRAND_FORWARD : STRAND_REVCOMP, 0);
+    kmers_to_traverse.push_back (ksd);
+
+    DEBUG ((cout << "---> kmer=" <<  leftKmer.value() << " strand=" << (leftKmer.which() ? "FW" : "RC") << endl));
+
+#ifndef DONTMARK
+    set<kmer_type> already_extended_from;
+    //   compare_and_mark_last_k_minus_one_mer(L, already_extended_from); // mark first kmer to never extend from it again, // L will be marked at first iteration below
+#endif
+
+    /** We will need a Path object and a Sequence object during the extension. */
+    Path_t<Node> rightTraversal;
+    Node endNode;
+    Sequence seq (Data::ASCII);
+
+    /**************************************************************/
+    /**          MAIN LOOP ON THE REMAINING KMERS                 */
+    /**************************************************************/
+    while (kmers_to_traverse.size() > 0) // min_depth is max_gap_length here
+    {
+        VERBOSE (("IterativeExtensions::construct_linear_seqs  MAIN LOOP %ld\n", kmers_to_traverse.size()));
+
+        if (searchMode == SearchMode_Depth)
+        {
+            ksd = kmers_to_traverse.back();
+            kmers_to_traverse.pop_back();
+        }
+        else if (searchMode == SearchMode_Breadth)
+        {
+            ksd = kmers_to_traverse.front();
+            kmers_to_traverse.erase (kmers_to_traverse.begin());
+        }
+
+        /** We compute the extension on the right. */
+        int len_right = traversal->traverse (ksd.node, endNode, DIR_OUTCOMING, rightTraversal);
+
+        DEBUG ((cout << "------> kmer=" << std::hex << ksd.node.kmer.get<kmer_type>() << std::dec
+            << "  strand=" << toString(ksd.node.strand) << "  depth=" << ksd.depth
+            << "  len_right=" << len_right << endl
+        ));
+
+        /** We build the sequence to be inserted in the output bank. */
+        buildSequence (ksd.node, rightTraversal, nbNodes, ksd.depth, seq);
+
+        /** We insert the sequence into the output bank. */
+        outputBank->insert (seq);
+
+        /** We update statistics. */
+        int node_len = len_right + sizeKmer;
+        nbNodes += 1;
+        totalnt += node_len;
+
+        // if we only want 1 extension, stop now
+        if (when_to_stop_extending == ExtendStopMode_after_first_contig)
+        {
+            INFO (("Stopping because we want only 1 extension\n"));
+            break;
+        }
+
+        if (swf)
+        {
+
+	    /*  old version            
+	    char* found = strstr (seq.getDataBuffer(), R.c_str());
+            if (found != NULL  &&  ksd.depth > (int)sizeKmer)
+            {
+                INFO (("swf STOP \n"));
+                break;
+            }
+ */
+        	// Apr 2017 : new version for MindTheGap fill with contigs
+        	//target can be the concatenation of several target kmers, checks for all the target kmers, if one found stop extending this contig but continue other branches
+        	std::string subseed;
+        	std::string target= R.c_str();
+        	bool stopExtend= false;
+        	for (unsigned i = 0; i < target.length(); i += sizeKmer)
+        	{
+        		subseed=target.substr(i, sizeKmer);
+        		char* found = strstr (seq.getDataBuffer(), R.c_str());
+
+        		if (found != NULL  &&  ksd.depth > (int)sizeKmer)
+        		{
+        			stopExtend=true;
+        			break;
+        		}
+
+        	}
+        	if (stopExtend) continue; //one of the targets was found, stop this extension but keep extending other branches
+
+        }
+
+        if (nbNodes > max_nodes) //GR stop when too complex  huum when to stop ?
+        {
+            INFO (("... XXX Stopped extending node %s because %lld nodes reached. Was at depth %d.\n",
+                seq.toString().c_str(), nbNodes, ksd.depth
+            ));
+            break;
+        }
+
+
+        // if max depth reached, don't extend that one
+        if (ksd.depth + node_len > max_depth)
+        {
+            INFO (("... XXX max depth reached for node %s (depth + node length %i %i = %i) \n",
+                seq.toString().c_str(), ksd.depth,node_len,ksd.depth + node_len
+            ));
+            continue;
+        }
+
+#ifndef DONTMARK
+        // make sure this is the only time we see this (k-1)-overlap
+        bool already_seen = compare_and_mark_last_k_minus_one_mer (graph.toString(ksd.node), already_extended_from);
+        if (already_seen)
+        {
+            INFO (("... XXX not extending node %s becaues last k-1-mer was already seen\n", seq.toString().c_str()));
+            continue;
+        }
+#endif
+
+        // continue extending from immediately overlapping kmers
+        // there may be just one 1 possibility (there was in-branching)
+
+        /** We get the successors of the node. */
+        GraphVector<Node> successors = graph.successors (endNode);
+
+        /** We iterate the successors. */
+        for (size_t i=0; i<successors.size(); i++)
+        {
+            kmers_to_traverse.push_back ( NodeDepth<Node> (successors[i].kmer, successors[i].strand, ksd.depth + len_right +1) );
+            // ou plutot depth + len_right +1 (+1 = la nt ajoutee ici) (et pas node_len)  ?
+        }
+
+        INFO (("... number of extensions: %d\n", successors.size()));
+
+    }   /* end of while (kmers_to_traverse.size() > 0) */
+
+    /** We have to flush the output bank. */
+    outputBank->flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+void IterativeExtensions<span, Node, Edge, Graph>::construct_linear_seqs (
+    const std::string& L,
+    const std::string& R,
+    const std::string& output_file,
+    bool               swf
+)
+{
+    /** We want to have only one line for data in FASTA output. */
+    BankFasta::setDataLineSize (0);
+
+    construct_linear_seqs (L, R, new BankFasta (output_file), swf);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Node, typename Edge, typename Graph>
+void IterativeExtensions<span, Node, Edge, Graph>::buildSequence (
+    const Node&     node,
+    const Path_t<Node>&     consensusRight,
+    size_t          nbNodes,
+    size_t          depth,
+    Sequence&       seq
+)
+{
+    /** Shortcuts. */
+    Data&  data     = seq.getData();
+    size_t lenRight = consensusRight.size();
+
+    /** We compute the total size of the sequence. */
+    size_t fullLength = graph.getKmerSize() + consensusRight.size();
+
+    /* we need this in mapsembler: the first used kmer should be a k-1 mer. Indeed, if a first kmer is extracted from a sequence :
+     * -------------****** (k=6), then this node is the one linked to a new one starting with ******,
+     * thus with an overlap of k and not k-1.
+     */
+    size_t offset = (depth == 0 && dont_output_first_nucleotide) ? 1 : 0;
+
+    /** We compute the total size of the sequence. */
+    size_t length = fullLength - offset;
+
+    /** We set the comment of the sequence. */
+    seq.setComment (Stringify::format ("%lli__len__%i__depth__%i", nbNodes, fullLength, depth) );
+
+    /** We set the data length. */
+    seq.getData().resize (length);
+
+    size_t idx=0;
+    size_t i = offset;
+
+    /** We dump the starting node. */
+    string nodeStr = graph.toString (node);
+    for ( ; i<nodeStr.size(); i++)  { data[idx++] = nodeStr[i]; }
+
+    /** We dump the right part. */
+    for (i=0; i<lenRight; i++)  {  data[idx++] = ascii (consensusRight[i]); }
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.hpp b/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.hpp
new file mode 100644
index 0000000..f88a520
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/IterativeExtensions.hpp
@@ -0,0 +1,137 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Uricaru, P.Peterlongo, R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_ITERATIVE_EXTENSION_H
+#define _GATB_CORE_DEBRUIJN_IMPL_ITERATIVE_EXTENSION_H
+
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Class providing helpers for graph traversal
+ *
+ * The implementation relies on the Graph class of GATB-CORE, which provides the
+ * API to traverse a de Bruijn graph.
+ */
+template <size_t span=KMER_DEFAULT_SPAN, typename Node=Node_t<>, typename Edge=Edge_t<Node_t<> >, typename Graph_t=Graph>
+class IterativeExtensions
+{
+public:
+
+    /** ShortcutS. */
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical       Model;
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical::Kmer KmerModel;
+    typedef typename kmer::impl::Kmer<span>::Type                 kmer_type;
+
+    /** Constructor.
+     * \param[in] graph : de Bruijn graph of the reads
+     * \param[in] terminator : object used to mark nodes during graph traversal.
+     * \param[in] traversalKind : kind of graph traversal (unitig,contig)
+     * \param[in] whenToStop : tells when to stop the extension
+     * \param[in] searchMode : mode of graph traversal
+     * \param[in] dontOutputFirstNucl : tells whether the first nucleotide of an extension has to be output
+     * \param[in] max_depth : max depth of the graph traversal
+     * \param[in] max_nodes : max nodes
+     */
+    IterativeExtensions (
+        const Graph_t&                  graph,
+        TerminatorTemplate<Node,Edge,Graph_t>&                   terminator,
+        tools::misc::TraversalKind    traversalKind,
+        tools::misc::ExtendStopMode_e whenToStop,
+        tools::misc::SearchMode_e     searchMode,
+        bool                          dontOutputFirstNucl,
+        int                           max_depth,
+        int                           max_nodes
+    );
+
+    /** Return the unitig/contig which starts with L, as well as all ths contigs that follow him, up to max_depth.
+     * Results go to a fasta file (output_file)
+     * \param[in] L : starter string for the unitig/contig
+     * \param[in] R :
+     * \param[in] outputBank : bank where the unitig/contig have to be dumped
+     * \param[in] swf : to be detailed
+     */
+    void construct_linear_seqs (
+        const std::string& L,
+        const std::string& R,
+        bank::IBank*       outputBank,
+        bool               swf = false
+    );
+
+    /** Return the unitig/contig which starts with L, as well as all ths contigs that follow him, up to max_depth.
+     * Results go to a fasta file (output_file)
+     * \param[in] L : starter string for the unitig/contig
+     * \param[in] R :
+     * \param[in] output_file : uri of the file where the unitig/contig have to be dumped
+     * \param[in] swf : to be detailed
+     */
+    void construct_linear_seqs (
+        const std::string& L,
+        const std::string& R,
+        const std::string& output_file,
+        bool               swf = false
+    );
+
+private:
+
+    const Graph_t&                  graph;
+    TerminatorTemplate<Node,Edge,Graph_t>&                   terminator;
+    tools::misc::TraversalKind      traversalKind;
+    tools::misc::ExtendStopMode_e   when_to_stop_extending;
+    tools::misc::SearchMode_e       searchMode;
+    bool                            dont_output_first_nucleotide;
+    int                             max_depth;
+    int                             max_nodes;
+
+    Model model;
+    Model modelMinusOne;
+
+    /** Fill a Sequence instance from the results of the current graph traversal.
+     * \param[in] node : starting node of the path
+     * \param[in] consensusRight : consensus nucleotides to be assign to the Sequence instance
+     * \param[in] nbNodes : nb nodes
+     * \param[in] depth : depth
+     * \param[out] seq : the sequence to be filled.
+     */
+    void buildSequence (
+        const Node&     node,
+        const Path_t<Node>&     consensusRight,
+        size_t          nbNodes,
+        size_t          depth,
+        bank::Sequence& seq
+    );
+
+    /** */
+    bool compare_and_mark_last_k_minus_one_mer (const std::string& node, std::set<kmer_type>& kmers_set);
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DEBRUIJN_IMPL_ITERATIVE_EXTENSION_H */
diff --git a/gatb-core/src/gatb/debruijn/impl/LinkTigs.cpp b/gatb-core/src/gatb/debruijn/impl/LinkTigs.cpp
new file mode 100644
index 0000000..0a237c1
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/LinkTigs.cpp
@@ -0,0 +1,374 @@
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/bcalm2/logging.hpp>
+#include <gatb/debruijn/impl/ExtremityInfo.hpp>
+#include <gatb/debruijn/impl/LinkTigs.hpp>
+#include <gatb/kmer/impl/Model.hpp> // for revcomp_4NT
+
+#include <queue>
+#include <string>
+#include <unordered_map>
+
+
+using namespace std;
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+    static constexpr int nb_passes = 8;
+    static void write_final_output(const string& unitigs_filename, bool verbose, BankFasta* out, uint64_t &nb_unitigs);
+    static bool get_link_from_file(std::ifstream& input, std::string &link, uint64_t &unitig_id);
+
+/* this procedure finds the overlaps between unitigs, using a hash table of all extremity (k-1)-mers
+ * I guess it's like AdjList in ABySS. It's also like contigs_to_fastg in MEGAHIT.
+ * 
+ * could be optimized by keeping edges during the BCALM step and tracking kmers in unitigs, but it's not the case for now, because would need to modify ograph 
+ *
+ * it uses the disk to store the links for extremities until they're merged into the final unitigs file. 
+ *
+ * so the memory usage is just that of the hash tables that record kmers, not of the links
+ */
+template<size_t span>
+void link_tigs(string unitigs_filename, int kmerSize, int nb_threads, uint64_t &nb_unitigs, bool verbose)
+{
+    bcalm_logging = verbose;
+    BankFasta* out = new BankFasta(unitigs_filename+".indexed");
+    if (kmerSize < 4) { std::cout << "error, recent optimizations (specifically link_unitigs) don't support k<5 for now" << std::endl; exit(1); }
+    logging("Finding links between unitigs");
+
+    for (int pass = 0; pass < nb_passes; pass++)
+        link_unitigs_pass<span>(unitigs_filename, verbose, pass, kmerSize);
+
+    write_final_output(unitigs_filename, verbose, out, nb_unitigs);
+   
+    delete out;
+    system::impl::System::file().remove (unitigs_filename);
+    system::impl::System::file().rename (unitigs_filename+".indexed", unitigs_filename);
+
+    logging("Done finding links between unitigs");
+}
+
+
+/*
+ * takes all the prefix.links.* files, sorted by unitigs.
+ * do a n-way merge to gather the links for each unitig in unitig order
+ * (single-threaded)
+ */
+
+
+static void write_final_output(const string& unitigs_filename, bool verbose, BankFasta* out, uint64_t &nb_unitigs)
+{
+    logging("gathering links from disk");
+    std::ifstream* inputLinks[nb_passes];
+
+    bitset<nb_passes> finished;
+    typedef std::tuple<uint64_t /*unitig id*/, int /*pass*/, std::string /*links */> pq_elt_t;
+    priority_queue<pq_elt_t, vector<pq_elt_t>, std::greater<pq_elt_t> > pq;
+    
+    BankFasta inputBank (unitigs_filename);
+    BankFasta::Iterator itSeq (inputBank);
+    itSeq.first(); 
+    string cur_links, seq, comment;
+    seq = itSeq->toString();
+    comment = itSeq->getComment();
+ 
+    for (int pass = 0; pass < nb_passes; pass++)
+    {
+        string link; uint64_t unitig;
+        inputLinks[pass] = new std::ifstream(unitigs_filename+ ".links." + to_string(pass));
+        // prime the pq with the first element in the file
+        if (get_link_from_file(*inputLinks[pass], link, unitig))
+            pq.emplace(make_tuple(unitig, pass, link));
+        else
+            finished[pass] = true;
+    }
+
+    uint64_t last_unitig = 0;
+    nb_unitigs = 0; // passed variable
+
+    // nb_passes-way merge sort
+    while ((!finished.all()) || pq.size() > 0)
+    {
+        pq_elt_t cur = pq.top(); pq.pop();
+        int pass = get<1>(cur);
+        uint64_t unitig = get<0>(cur);
+
+        if (unitig != last_unitig)
+        {
+            Sequence s (Data::ASCII);
+            s.getData().setRef ((char*)seq.c_str(), seq.size());
+            s._comment = comment + " " + cur_links;
+            out->insert(s);
+            
+            cur_links = "";
+            nb_unitigs++;
+            last_unitig = unitig;
+            itSeq.next();
+            seq = itSeq->toString();
+            comment = itSeq->getComment();
+        }
+            
+        cur_links += get<2>(cur);
+        //if (unitig < 10)  std::cout << " popped " << pass << " " << unitig << " " << cur_links << std::endl; // debug
+
+        // read next entry in the inputLinks[pass] file that we just popped
+        if (finished[pass])
+            continue;
+        string link;
+        if (get_link_from_file(*inputLinks[pass], link, unitig))
+            pq.emplace(make_tuple(unitig, pass, link));
+        else
+            finished[pass] = true;
+
+    }
+    // write the last element
+    Sequence s (Data::ASCII);
+    s.getData().setRef ((char*)seq.c_str(), seq.size());
+    s._comment = comment + " " + cur_links;
+    out->insert(s);
+    nb_unitigs++;
+
+    for (int pass = 0; pass < nb_passes; pass++)
+    {
+        system::impl::System::file().remove (unitigs_filename + ".links." + to_string(pass));
+        delete inputLinks[pass];
+    }
+}
+
+
+// well well, some potential code duplication with Model.hpp in here (or rather, specialization), but sshh
+static inline int nt2int(char nt)
+{
+    if (nt=='A') return 0;
+    if (nt=='C') return 1;
+    if (nt=='T') return 2;
+    if (nt=='G') return 3;
+    return 0;
+}
+
+/* that code doesn't support more than 8 passes*/
+static int normalized_smallmer(const unsigned char c1, const unsigned char c2, const unsigned char c3, const unsigned char c4)
+{
+    unsigned char smallmer = (nt2int(c1)<<6) + (nt2int(c2)<<4) + (nt2int(c3)<<2) + nt2int(c4);
+    const unsigned char rev = revcomp_4NT[smallmer];
+    if (rev < smallmer)
+        smallmer = rev;
+    return smallmer;
+}
+
+static bool
+is_in_pass (const std::string &seq, int pass, Unitig_pos p, int kmerSize) // TODO this is so un-even. should do more proper hashing..
+{
+    int e = 0;
+    if (p == UNITIG_END)
+        e = seq.size()-(kmerSize-1);
+    // x = 0123456789
+    // k = 5, k-1=4
+    // seq.size()-1-(k-1) = 10-4 = 6
+    return (normalized_smallmer(seq[e],seq[e+1],seq[e+kmerSize-1-1-1],seq[e+kmerSize-1-1]) % nb_passes) == pass;
+}
+
+/* returns true if it has read an element, false otherwise */
+static bool get_link_from_file(std::ifstream& input, std::string &link, uint64_t &unitig_id)
+{
+    string line;
+    if (std::getline(input, line))
+    {
+        unitig_id = stoull(line);
+    }
+    else
+        return false;
+    if (std::getline(input, link))
+    {
+    }
+    else
+        return false;
+    return true;
+}
+
+
+static void record_links(uint64_t utig_id, int pass, const string &link, std::ofstream &links_file)
+{
+    // maybe do a buffered thing here but it's not clear if it is bottleneck. in CAMI-medium it took 6 mins without if i don't write the links_file and 8 mins if i do..
+    links_file << to_string(utig_id) << "\n";
+    links_file << link << "\n";
+}
+
+
+template<size_t span>
+void link_unitigs_pass(const string unitigs_filename, bool verbose, const int pass, const int kmerSize)
+{
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::Type           Type;
+
+    bool debug = false;
+
+    BankFasta inputBank (unitigs_filename);
+    BankFasta::Iterator itSeq (inputBank);
+    uint64_t utig_counter = 0;
+    
+    Model modelKminusOne(kmerSize - 1); // it's canonical (defined in the .hpp file)
+    
+    typedef typename std::unordered_map<Type, std::vector<uint64_t>> NodeLinksMap;
+
+    NodeLinksMap utigs_links_map;
+
+    logging("step 1 pass " + to_string(pass));
+
+    // this is the memory-limiting step, but can be lowered with larger nb_pass
+    for (itSeq.first(); !itSeq.isDone(); itSeq.next()) 
+    {
+        const string& seq = itSeq->toString();
+        if (debug) std::cout << "unitig: " << seq << std::endl;
+
+        if (is_in_pass(seq, pass, UNITIG_BEGIN, kmerSize))
+        { 
+            if (debug) std::cout << "pass " << pass << " examining beginning" << std::endl;
+            typename Model::Kmer kmerBegin = modelKminusOne.codeSeed(seq.substr(0, kmerSize-1).c_str(), Data::ASCII);
+            bool beginInSameOrientation = modelKminusOne.toString(kmerBegin.value()) == seq.substr(0,kmerSize-1);
+            ExtremityInfo eBegin(utig_counter, !beginInSameOrientation /* because we record rc*/, UNITIG_BEGIN);
+            utigs_links_map[kmerBegin.value()].push_back(eBegin.pack());
+        }
+        if (is_in_pass(seq, pass, UNITIG_END, kmerSize))
+        {
+            if (debug) std::cout << "pass " << pass << " examining end" << std::endl;
+            typename Model::Kmer kmerEnd = modelKminusOne.codeSeed(seq.substr(seq.size() - kmerSize+1).c_str(), Data::ASCII);
+            bool endInSameOrientation = modelKminusOne.toString(kmerEnd.value()) == seq.substr(seq.size() - kmerSize+1);
+            ExtremityInfo eEnd(  utig_counter, !endInSameOrientation,                             UNITIG_END);
+            utigs_links_map[kmerEnd.value()].push_back(eEnd.pack());
+            // there is no UNITIG_BOTH here because we're taking (k-1)-mers.
+        }
+        utig_counter++;
+    }
+
+    std::ofstream links_file(unitigs_filename+".links." +to_string(pass));
+
+    uint64_t nb_hashed_entries = 0;
+    for (auto v : utigs_links_map)
+        nb_hashed_entries += v.second.size(); 
+    logging("step 2 (" + to_string(utigs_links_map.size()) + "kmers/" + to_string(nb_hashed_entries) + "extremities)");
+
+    utig_counter = 0;
+    for (itSeq.first(); !itSeq.isDone(); itSeq.next()) 
+    {
+        const string& seq = itSeq->toString();
+        
+        if (debug) std::cout << "unitig: " << seq << std::endl;
+ 
+        if (is_in_pass(seq, pass, UNITIG_BEGIN, kmerSize))
+        {
+            if (debug) std::cout << "pass " << pass << " examining beginning" << std::endl;
+            typename Model::Kmer kmerBegin = modelKminusOne.codeSeed(seq.substr(0, kmerSize-1).c_str(), Data::ASCII);
+            bool beginInSameOrientation =  modelKminusOne.toString(kmerBegin.value()) == seq.substr(0,kmerSize-1); // that could be optimized, revcomp was already computed during codeSeed
+            // treat special palindromic kmer cases
+            bool nevermindInOrientation = false;
+            if (((kmerSize - 1) % 2) == 0) 
+                if (kmerBegin.isPalindrome()) nevermindInOrientation = true;
+
+            string in_links = " "; // necessary placeholder to indicate we have links for that unitig
+
+            // in-neighbors
+            for (auto in_packed : utigs_links_map[kmerBegin.value()])
+            {
+                ExtremityInfo e_in(in_packed);
+
+                if (debug) std::cout << "extremity " << modelKminusOne.toString(kmerBegin.value()) << " ";
+                if (debug) std::cout << "potential in-neighbor: " << e_in.toString() << " beginSameOrientation " << beginInSameOrientation;
+
+                // what we want are these four cases:
+                //  ------[end same orientation] -> [begin same orientation]----
+                //  [begin diff orientation]---- -> [begin same orientation]----
+                //  ------[end diff orientation] -> [begin diff orientation]----
+                //  [begin same orientation]---- -> [begin diff orientation]----
+                if ((((beginInSameOrientation)  &&  (e_in.pos == UNITIG_END  ) && (e_in.rc == false)) ||
+                            ((beginInSameOrientation) &&  (e_in.pos == UNITIG_BEGIN) && (e_in.rc == true)) ||
+                            (((!beginInSameOrientation)) && (e_in.pos == UNITIG_END  ) && (e_in.rc == true)) ||
+                            (((!beginInSameOrientation)) && (e_in.pos == UNITIG_BEGIN) && (e_in.rc == false)))
+                        || nevermindInOrientation)
+                {
+                    if (nevermindInOrientation && (e_in.unitig == utig_counter)) continue; // don't consider the same extremity
+
+                    // this was for when i was wanting to save space while storing links in memory. now storing on disk
+                    //LinkInfo li(e_in.unitig, e_in.rc ^ beginInSameOrientation);
+                    //incoming[utig_number].push_back(li.pack());
+                    bool rc = e_in.rc ^ (!beginInSameOrientation);
+                    in_links += "L:-:" + to_string(e_in.unitig) + ":" + (rc?"+":"-") + " "; /* invert-reverse because of incoming orientation. it's very subtle and i'm still not sure i got it right */
+                    if (nevermindInOrientation)
+                       in_links += "L:-:" + to_string(e_in.unitig) + ":" + ((!rc)?"+":"-") + " "; /* in that case, there is also another link with the reverse direction*/
+
+                    if (debug) std::cout << " [valid] ";
+                }
+                if (debug) std::cout << std::endl;
+            }
+            
+            record_links(utig_counter, pass, in_links, links_file);
+        }
+
+
+        if (is_in_pass(seq, pass, UNITIG_END, kmerSize))
+        {
+            if (debug) std::cout << "pass " << pass << " examining end" << std::endl;
+            typename Model::Kmer kmerEnd = modelKminusOne.codeSeed(seq.substr(seq.size() - kmerSize+1).c_str(), Data::ASCII);
+            bool endInSameOrientation =  modelKminusOne.toString(kmerEnd.value()) == seq.substr(seq.size() - kmerSize+1);
+
+            bool nevermindOutOrientation = false;
+            if (((kmerSize - 1) % 2) == 0) 
+                if (kmerEnd.isPalindrome())   nevermindOutOrientation = true;
+
+            string out_links = " "; // necessary placeholder to indicate we have links for that unitig
+
+            // out-neighbors
+            for (auto out_packed : utigs_links_map[kmerEnd.value()])
+            {
+                ExtremityInfo e_out(out_packed);
+
+                if (debug) std::cout << "extremity " << modelKminusOne.toString(kmerEnd.value()) << " ";
+                if (debug) std::cout << "potential out-neighbor: " << e_out.toString();
+
+                // what we want are these four cases:
+                //  ------[end same orientation] -> [begin same orientation]----
+                //  ------[end same orientation] -> ------[end diff orientation]
+                //  ------[end diff orientation] -> [begin diff orientation]----
+                //  ------[end diff orientation] -> ------[end same orientation]
+                if ((((endInSameOrientation) && (e_out.pos == UNITIG_BEGIN) && (e_out.rc == false)) ||
+                            ((endInSameOrientation) && (e_out.pos == UNITIG_END  ) && (e_out.rc == true)) ||
+                            (((!endInSameOrientation)) && (e_out.pos == UNITIG_BEGIN) && (e_out.rc == true)) ||
+                            (((!endInSameOrientation)) && (e_out.pos == UNITIG_END  ) && (e_out.rc == false)))
+                        ||nevermindOutOrientation)
+                {
+                    if (nevermindOutOrientation && (e_out.unitig == utig_counter)) continue; // don't consider the same extremity
+
+                    //LinkInfo li(e_out.unitig, e_out.rc ^ endInSameOrientation);
+                    //outcoming[utig_number].push_back(li.pack());
+                    bool rc = e_out.rc ^ (!endInSameOrientation);
+                    out_links += "L:+:" + to_string(e_out.unitig) + ":" + (rc?"-":"+") + " "; /* logically this is going to be opposite of the line above */ 
+
+                    if (nevermindOutOrientation)
+                        out_links += "L:+:" + to_string(e_out.unitig) + ":" + ((!rc)?"-":"+") + " "; /* in that case, there is also another link with the reverse direction*/
+
+                    if (debug) std::cout << " [valid] ";
+                }
+                if (debug) std::cout << std::endl;
+            }
+            record_links(utig_counter, pass, out_links, links_file);
+        }
+
+        utig_counter++;
+    }
+}
+
+}}}}
diff --git a/gatb-core/src/gatb/debruijn/impl/LinkTigs.hpp b/gatb-core/src/gatb/debruijn/impl/LinkTigs.hpp
new file mode 100644
index 0000000..3369215
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/LinkTigs.hpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014-2016  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+
+#ifndef _GATB_CORE_LINK_TIGS_HPP_
+#define _GATB_CORE_LINK_TIGS_HPP_
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/bank/api/IBank.hpp>
+
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+
+
+    template<size_t SPAN>
+    void link_tigs( std::string prefix, int kmerSize, int nb_threads, uint64_t &nb_unitigs, bool verbose);
+
+    template<size_t span>
+    void link_unitigs_pass(const std::string unitigs_filename, bool verbose, const int pass, const int kmerSize);
+    
+}}}}
+
+#endif
diff --git a/gatb-core/src/gatb/debruijn/impl/NodesDeleter.hpp b/gatb-core/src/gatb/debruijn/impl/NodesDeleter.hpp
new file mode 100644
index 0000000..35be1ed
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/NodesDeleter.hpp
@@ -0,0 +1,151 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2015 INRIA
+ *   Authors: R.Chikhi, G.Rizk, D.Lavenier, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+// this class takes care of removing nodes from a graph
+// not immediately, but only when flush() is called.
+
+#ifndef _GATB_GRAPH_NODESDELETER_HPP_
+#define _GATB_GRAPH_NODESDELETER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <vector>
+#include <set>
+#include <string>
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+
+template <typename Node, typename Edge, typename Graph>
+class NodesDeleter
+{
+
+    public:
+        uint64_t nbNodes;
+        std::vector<bool> nodesToDelete; // don't delete while parallel traversal, do it afterwards
+        std::set<Node> setNodesToDelete; 
+        Graph &  _graph;
+        int _nbCores;
+        bool _verbose;
+        bool useList, onlyListMethod;
+        unsigned long explicitLimit;
+        system::ISynchronizer* synchro;
+
+    NodesDeleter(Graph&  graph, uint64_t nbNodes, int nbCores, bool verbose=true) : nbNodes(nbNodes), _graph(graph), _nbCores(nbCores), _verbose(verbose)
+    {
+        nodesToDelete.resize(nbNodes); // number of graph nodes // (!) this will alloc 1 bit per kmer.
+        for (unsigned long i = 0; i < nbNodes; i++)
+            nodesToDelete[i] = false;
+
+        /* use explicit set of nodes as long as we don't have more than 10 M nodes ok? 
+         * else resort to bit array
+         * 10M nodes, assuming 128 bytes per nodes (generous), is 1 gig.
+         * for k=21 it's actually closer to 24 bytes per node.
+         * so, WARNING: enabling this feature uses more memory. 
+         * todo: someday, introduce a --fast parameter that uses a bit more memory but does optimizations like this
+         */
+        //std::cout << "sizeof node: " << sizeof(Node) << std::endl;
+        useList = true;
+        onlyListMethod = false;
+          
+        // compute a fair amount of nodes that can be kept of memory
+        // (before, was only 10M)
+        explicitLimit = std::max((uint64_t)(nbNodes / 100), (uint64_t)10000000); 
+        // for bacteria it's 10M
+        // for human it's roughly 20M
+        // for spruce it's roughly 300M
+  
+        // set insertions aren't thread safe, so let's use a synchronizer
+        synchro = system::impl::System::thread().newSynchronizer();
+    }
+
+    ~NodesDeleter ()  { delete synchro; }
+
+    bool get(uint64_t index)
+    {
+        return nodesToDelete[index];
+    }
+    
+    bool get(Node &node)
+    {
+        if (useList)
+        {
+            return (setNodesToDelete.find(node) != setNodesToDelete.end());
+        }
+        //else
+        {
+            unsigned long index =_graph.nodeMPHFIndex(node);
+            return get(index);
+        }
+    }
+
+    void markToDelete(Node &node)
+    {
+        if (!onlyListMethod)
+        {
+            unsigned long index =_graph.nodeMPHFIndex(node);
+            nodesToDelete[index] = true;
+        }
+
+        if (useList)
+        {
+            synchro->lock();
+            setNodesToDelete.insert(node);
+            synchro->unlock();
+        }
+
+        if ((!onlyListMethod) && (setNodesToDelete.size() > explicitLimit))
+            useList = false;
+
+    }
+
+   // TODO speed: tell graph whenever all the neighbors of a node will be deleted too, that way, don't need to update their adjacency! 
+    void flush()
+    {
+        if (useList)
+        {
+            if (_verbose)
+                std::cout << "NodesDeleter mem usage prior to flush: " << (setNodesToDelete.size() * sizeof(Node)) / 1024 / 1024 << " MB" << std::endl;
+            // sequential nodes deletion (no need for parallel here, as deleteNode() needs to be atomic anyway
+            for (typename std::set<Node>::iterator it = setNodesToDelete.begin(); it != setNodesToDelete.end(); it++)
+            {
+                Node node = *it; // remove this line when (if ever?) deleteNode is const Node&
+                _graph.deleteNode(node);
+            }
+        }
+        else
+        {
+            _graph.deleteNodesByIndex(nodesToDelete, _nbCores, synchro);
+        }
+    }
+
+};
+
+/********************************************************************************/
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif 
+
diff --git a/gatb-core/src/gatb/debruijn/impl/Simplifications.cpp b/gatb-core/src/gatb/debruijn/impl/Simplifications.cpp
new file mode 100644
index 0000000..29bc3bc
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Simplifications.cpp
@@ -0,0 +1,1827 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014-2015  INRIA
+ *   Authors: R.Chikhi, G.Rizk, D.Lavenier, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_SIMPLIFCPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_SIMPLIFCPP_
+
+
+/********************************************************************************/
+// We include required definitions
+/********************************************************************************/
+
+#define DEBUG(a)    //a
+#define DEBUG_TIPS(a)    //a
+#define DEBUG_BULGES(a)    //a
+#define DEBUG_EC(a)   //a
+
+// the only time when you don't want to define this, is when debugging with gdb, because can't debug lambda's
+#define SIMPLIFICATION_LAMBDAS 
+
+// this is to control whether we instrument code for timing or not (shouldn't affect performance, in principle)
+#define TIME(a)   a
+
+#include <cassert>
+#include <gatb/debruijn/impl/Simplifications.hpp>
+#include <gatb/debruijn/impl/NodesDeleter.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp> // for ProgressTimerAndSystem
+
+#include <chrono>
+#define get_wtime() chrono::system_clock::now()
+#define diff_wtime(x,y) (unsigned long)chrono::duration_cast<chrono::nanoseconds>(y - x).count()
+
+#define DIR2STR(dir) ((dir==DIR_OUTCOMING) ? "outcoming" : "incoming")
+
+using namespace std;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::system; // for System
+using namespace gatb::core::system::impl; 
+using namespace gatb::core::tools::dp; // for dispatcher
+using namespace gatb::core::tools::dp::impl;
+
+
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+
+static const char* simplprogressFormat0 = "removing tips,    pass %2d ";
+static const char* simplprogressFormat2 = "removing bulges,  pass %2d ";
+static const char* simplprogressFormat3 = "removing ec,      pass %2d ";
+
+
+template<typename GraphType, typename Node, typename Edge>
+Simplifications<GraphType, Node, Edge>::Simplifications(GraphType& graph, int nbCores, bool verbose)
+        : _nbTipRemovalPasses(0), _nbBubbleRemovalPasses(0), _nbBulgeRemovalPasses(0), _nbECRemovalPasses(0), _graph(graph), 
+        _nbCores(nbCores), _firstNodeIteration(true), _verbose(verbose)
+{
+    // by default; do everything
+    _doTipRemoval = _doBulgeRemoval = _doECRemoval = true;
+
+    // the next list is only here to get number of nodes
+    ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem> itNode (this->_graph.iterator(), "");
+    nbNodes = itNode.size();
+
+    // compute a fair amount of tips/bubble/ec after which it's useless to do another pass
+    // (before, the previous system was to do a fixed amount of passes)
+
+    cutoffEvents = std::max((uint64_t)(nbNodes / 10000), (uint64_t)1); 
+    // maybe todo: estimate better and illustrate on sample genomes
+    
+    
+    // set some default parameters for aggressive graph simplifications (minia)
+
+    //  tips
+    _tipLen_Topo_kMult = 2.5;
+    _tipLen_RCTC_kMult = 10;
+    _tipRCTCcutoff = 2; // SPAdes-like
+    
+    // bulges
+    _bulgeLen_kMult = 3; 
+    _bulgeLen_kAdd = 100;
+    _bulgeAltPath_kAdd = 50;
+    _bulgeAltPath_covMult = 1.1;
+
+    // EC
+    _ecLen_kMult = 9;
+    _ecRCTCcutoff = 4;
+}
+
+
+/* this is the many rounds of graph simplifications that we perform in Minia */
+template<typename GraphType, typename Node, typename Edge>
+void Simplifications<GraphType,Node,Edge>::simplify()
+{
+    unsigned long nbTipsRemoved = 0, nbTipsRemovedPreviously = 0;
+    unsigned long nbBubblesRemoved = 0, nbBubblesRemovedPreviously = 0;
+    unsigned long nbECRemoved = 0, nbECRemovedPreviously = 0;
+
+    tipRemoval = "";
+    bubbleRemoval = "";
+    ECRemoval = "";
+    
+    if (_doTipRemoval)
+    {
+        do
+        {
+            nbTipsRemovedPreviously = nbTipsRemoved;
+            nbTipsRemoved = removeTips();
+            if (tipRemoval.size() != 0)
+                tipRemoval += " + ";
+            tipRemoval += to_string(nbTipsRemoved);
+        }
+        while ( ((nbTipsRemovedPreviously == 0 && nbTipsRemoved > 0) || (_nbTipRemovalPasses <= 2 || nbTipsRemoved >= cutoffEvents)) 
+                && _nbTipRemovalPasses < 20);
+    }
+
+    if (_doBulgeRemoval)
+    {
+        do
+        {
+            nbBubblesRemovedPreviously = nbBubblesRemoved;
+            nbBubblesRemoved = removeBulges(); // now we're using bulges removal, not bubbles (to follow SPAdes)
+            if (bubbleRemoval.size() != 0)
+                bubbleRemoval += " + ";
+            bubbleRemoval += to_string(nbBubblesRemoved);
+        }
+        while (((nbBubblesRemovedPreviously == 0 && nbBubblesRemoved > 0) || (_nbBulgeRemovalPasses <= 2 || nbBubblesRemoved >= cutoffEvents))
+                && _nbBulgeRemovalPasses < 20);
+    }
+
+    if (_doECRemoval)
+    {
+        do
+        {
+            nbECRemovedPreviously = nbECRemoved;
+            nbECRemoved = removeErroneousConnections(); // now we're using bulges removal, not bubbles (to follow SPAdes)
+            if (ECRemoval.size() != 0)
+                ECRemoval += " + ";
+            ECRemoval += to_string(nbECRemoved);
+        }
+        while (((nbECRemovedPreviously == 0 && nbECRemoved > 0 ) || (_nbECRemovalPasses <= 2 || nbECRemoved >= cutoffEvents))
+                && _nbECRemovalPasses < 20);
+    }
+    
+    // final simplifications rounds: do a mix of everything
+    if (_doTipRemoval && _doBulgeRemoval && _doECRemoval)
+    {
+        nbECRemoved = 0; // reset EC removal counter
+        do
+        {
+            nbTipsRemoved = removeTips();
+
+            nbBubblesRemovedPreviously = nbBubblesRemoved;
+            nbBubblesRemoved = removeBulges();
+
+            nbECRemovedPreviously = nbECRemoved;
+            nbECRemoved = removeErroneousConnections();
+
+            tipRemoval += " + " + to_string(nbTipsRemoved);
+
+            bubbleRemoval += " + " + to_string(nbBubblesRemoved);
+
+            ECRemoval += " + " + to_string(nbECRemoved);
+
+        }
+        while (((nbECRemovedPreviously == 0 && nbECRemoved > 0) || (nbECRemoved >= cutoffEvents || nbTipsRemoved >= cutoffEvents || nbBubblesRemoved >= cutoffEvents))
+                && _nbTipRemovalPasses < 30);
+    }
+}
+
+
+// gets the mean abundance of neighboring paths around a branching node (excluding the path that starts with nodeToExclude, e.g. the tip itself)
+// only considers the first 100 kmers of neighboring paths
+//
+template<typename GraphType, typename Node, typename Edge>
+double Simplifications<GraphType,Node,Edge>::getMeanAbundanceOfNeighbors(Node& branchingNode, Node nodeToExclude)
+{
+    GraphVector<Edge> neighbors = _graph.neighborsEdge(branchingNode);
+    unsigned int nbNeighbors = 0;
+    double meanNeighborsCoverage = 0;
+    //DEBUG(cout << endl << "called getMeanAbudanceOfNeighbors for node " << _graph.toString(branchingNode) << " of degrees " << _graph.indegree(branchingNode) <<"/"<< _graph.outdegree(branchingNode)<< " excluding node  " <<  _graph.toString (nodeToExclude) << endl);
+    for (size_t i = 0; i < neighbors.size(); i++)
+    {
+        double simplePathCoverage = 0;
+        if (_graph.simplePathLength(neighbors[i].from, neighbors[i].direction) > 0) // special case, we're on a unitig, don't bother querying a middle unitig kmer 
+        {
+            simplePathCoverage = _graph.simplePathMeanAbundance(neighbors[i].from, neighbors[i].direction);
+        }
+        else
+        {
+            Node neighbor = neighbors[i].to;
+            if (neighbor == nodeToExclude) 
+            {
+                //DEBUG(cout << endl << "good, seen the node to exclude" << endl);
+                continue; 
+            }
+            //std::cout << "branchingNode " << _graph.toString(neighbors[i].from) << " neighbor "  << _graph.toString(neighbor) << std::endl;;
+            simplePathCoverage = _graph.simplePathMeanAbundance(neighbor, neighbors[i].direction);
+        }
+        meanNeighborsCoverage += simplePathCoverage;
+        nbNeighbors++;
+        //DEBUG(cout << endl << "got simple path coverage for neighbor " << nbNeighbors  << " : " << " meancoverage: " <<simplePathCoverage << " over " << pathLen << " kmers" << endl);
+    }
+    meanNeighborsCoverage /= nbNeighbors;
+    return meanNeighborsCoverage;
+}
+
+// this needs to be in Graph.cpp of gatb-core
+template<typename GraphType, typename Node, typename Edge>
+string Simplifications<GraphType,Node,Edge>::path2string(Direction dir, Path_t<Node> p, Node endNode)
+{
+    // naive conversion from path to string
+    string p_str;
+    if (dir == DIR_INCOMING)
+    {
+        p_str = "";
+        for (size_t i = 0; i < p.size(); i++)
+            p_str.push_back(p.ascii(p.size()-1-i));
+        p_str += _graph.toString(p.start);
+    }
+    else
+    {
+        p_str = _graph.toString(p.start);
+        for (size_t i = 0; i < p.size(); i++)
+            p_str.push_back(p.ascii(i));
+    }
+    //std::cout << "path2string " << to_string(dir) << " " << p_str <<endl;
+    return p_str;
+}
+
+// in the case of the new heuristic_most_covered, we only record the nucleotide at branching nodes
+// this function will only be used for debugging the paths
+template<typename Node>
+string unitig2string(Direction dir, Path_t<Node> p, Node endNode)
+{
+    return "";
+}
+ 
+
+// this needs to be in Graph.cpp of gatb-core
+// computes mean abundance of path
+// optional params!
+// skip_first: skip N nucleotides at beginning of path
+// skip_last: skip N nucleotides at end of path
+// e.g. skip_first=skip_last=1 will skip the first and last kmer of path
+template<typename GraphType, typename Node, typename Edge>
+double Simplifications<GraphType,Node,Edge>::path2abundance(Direction dir, Path_t<Node> p, Node endNode, unsigned int skip_first, unsigned int skip_last)
+{
+    // the buildnode call here needs to be adapted for NodeGU
+#if 0
+    string s = path2string(dir,p,endNode);
+    if (p.size() == 0) return 0;
+    if (p.size() <= skip_first + skip_last) return 0;
+
+    unsigned long mean_abundance = 0;
+    //std::cout << " abundance: " ;
+    for (size_t i = skip_first; i < p.size() - skip_last; i++)
+    {
+        Node node = _graph.buildNode((char *)(s.c_str()), i);
+        unsigned char abundance = _graph.queryAbundance(node);
+        mean_abundance += abundance;
+        //std::cout << " " << to_string(abundance);
+        //cout << endl << "node: " << _graph.toString (node) << " abundance: "  << to_string(abundance) << endl;
+    }                              
+    //std::cout << std::endl;
+    mean_abundance /= (p.size() - skip_first - skip_last);
+    return mean_abundance;
+#endif
+    return 0;
+}
+
+inline string maybe_print(long value, string str)
+{
+    if (value == 0)
+        return "";
+    return to_string(value) + " " + str;
+}
+
+
+/* gets coverage of the simple path,
+   then compares it to coverage of other paths connected to the last node of it. */
+template<typename GraphType, typename Node, typename Edge>
+bool Simplifications<GraphType,Node,Edge>::satisfyRCTC(double pathAbundance, Node& node, double RCTCcutoff, Direction dir)
+{
+    // explore the other two or more simple paths connected to that path, to get an abundance estimate
+    // but first, get the branching node(s) the tip is connected to 
+    //
+    // invariant: node is the last node of a path. 
+
+    GraphVector<Edge> connectedBranchingNodes = _graph.neighborsEdge(node, dir);
+    unsigned int nbBranchingNodes = 0;
+    double meanNeighborsCoverage = 0;
+
+    // disabling the following check, becuse in EC removal, reverse direction, node may not be a last node (was in a hurry, need to revisit whole RCTC someday anyway to see if it can be improved)
+/*    if (_graph.simplePathLength(node , dir) > 0) 
+    {
+        std::cout << "satisfyRCTC; unexpected: node isn't a last node?" << std::endl;
+        std::cout << _graph.toString(node) << " dir " << dir << " simple path length: " << _graph.simplePathLength(node , dir)<< " connectedBranchingNodes[0].to: " << _graph.toString(connectedBranchingNodes[0].to) << " connectedBranchingNodes.size(): " << connectedBranchingNodes.size() << std::endl;
+        exit(1);
+    }*/
+
+    /* there may be more than one connectedBranchNode
+     * it's weird when it's more than one branching node though, it's a situation like:
+     * 
+     *                ..o--o--o--o..
+     *                    /
+     *  nodes-> o--o--o--o
+     *                    \
+     *                ..o--o--o--o.. 
+     *
+     *  instead of the classical:
+     *
+     *  nodes-> o--o--o--o
+     *                    \
+     *                ..o--o--o--o..)*/
+
+    for (size_t j = 0; j < connectedBranchingNodes.size(); j++)
+    {
+        meanNeighborsCoverage += this->getMeanAbundanceOfNeighbors(connectedBranchingNodes[j].to, node);
+        nbBranchingNodes++;
+    }
+    if (nbBranchingNodes > 0)
+        meanNeighborsCoverage /= nbBranchingNodes;
+
+    bool isRCTC = (meanNeighborsCoverage > RCTCcutoff * pathAbundance);
+
+    //DEBUG(cout << endl << "RCTC test, over " << nbBranchingNodes << " connected nodes. Global mean neighbors coverage: " << meanNeighborsCoverage <<  " compared to mean tip abundance over "<< nodes.size() << " values : " << meanTipAbundance << (debugstdev? " stddev: " : "") << (debugstdev? to_string(stdevTipAbundance): "") << ", is RCTC satisfied? " << isRCTC << endl);
+
+    return isRCTC;
+}
+
+/* okay let's analyze SPAdes 3.5 tip clipping conditions, just for fun: (following graph_simplifications.hpp and simplifications.info)
+ *
+ * * tc_lb is a coefficient, setting tip length to be max(read length, g*tc_lb) (see simplification_settings.hpp);
+ *
+ * * cb is a plain coverage upper bound (see basic_edge_conditions.hpp)
+ * when it's auto, it's equal to ec_bound. (source: set_detected_coverage_bound(gp.ginfo.ec_bound() in graph_simplification.hpp)
+ *
+ * * * ec_bound is given by the error threshold found by the coverage model in kmer_coverage_model.cpp (see: genomic_info_filler.cpp)
+ * it's the largest abundance value such that the probability of an erroneous kmer is less than 0.05. And, if it's smaller than the valley, it's the valley.
+ * EC bound looks off in metagenomic assemblies (a value over 50.. seems high).
+ *
+ * * * in single cell mode, it's max(average edge coverage, graph theshold), and graph threshold is quite advanced! (omni_tools.hpp)
+ * but already, in multicell mode, spades does a good job at tip clipping, so let's look at that first.
+ *
+ * * rctc is a "relative coverage tip condition" and the value given next to it is: max_relative_coverage
+ * rctc examines whether the coverage of the tip is <= max_relative_coverage * (max_{over all neighbors}(coverage of neighbor) + 1)
+ 
+ * actual tip clipping code for "tc", i.e. implementations of the conditions, is in tip_clipper
+ * (omni/graph_processing_algorithm.hpp:EdgeRemovingAlgorithm() is just generically parsing conditions)
+ *
+ * in one condition, tc_lb = 3.5, cb is 1000000 (minia's coverages values don't go that far.. yet..), rctc 2
+ * and in another, tc_lb is 10 and cb is auto
+ *
+ * some historical facts:
+ * for CAMI we were more loose than SPAdes: topological tip had no cov criterion, wherehas it should have had rctc (like spades)
+ * and long tc_lb10 tips should have the auto coverage bound, but instead they had rctc 2. 
+ *
+ * here we also keep that philosophy: topological tips (<=3.5*k) do not need a coverage criterium to be removed (no rctc)
+ *
+ * so TODO: make it more strict. but for now I'm focusing on EC.
+ */
+template<typename GraphType, typename Node, typename Edge>
+unsigned long Simplifications<GraphType,Node,Edge>::removeTips()
+{
+    unsigned int k = _graph.getKmerSize();
+    unsigned int _maxTipLengthTopological = (unsigned int)((float)k * _tipLen_Topo_kMult); // aggressive with SPAdes length threshold, but no coverage criterion
+    unsigned int _maxTipLengthRCTC = (unsigned int)(k * _tipLen_RCTC_kMult); // experimental, SPAdes-like
+
+    unsigned long nbTipsRemoved = 0;
+
+    // stats
+    unsigned long timeAll = 0, timeDecision = 0, timeProcessing = 0, timeSimplePath = 0, timeSimplePathLong = 0, timeSimplePathShortTopo = 0, timeSimplePathShortRCTC = 0, timeDel = 0, timeCache = 0;
+    unsigned long nbTipCandidates = 0;
+
+
+    char buffer[128];
+    sprintf(buffer, simplprogressFormat0, ++_nbTipRemovalPasses);
+    /** We get an iterator over all nodes */
+    /* in case of pass > 1, only over cached branching nodes */
+    // because in later iterations, we have cached non-simple nodes, so iterate on them
+    ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem> *itNode; 
+    if (_firstNodeIteration )
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iterator(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " nodes on disk" << std::endl;
+    }
+    else
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iteratorCachedNodes(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " cached nodes" << std::endl;
+    }
+
+    // parallel stuff: create a dispatcher ; support atomic operations
+    Dispatcher dispatcher (_nbCores);
+
+    // nodes deleter stuff
+    NodesDeleter<Node,Edge,GraphType> nodesDeleter(_graph, nbNodes, _nbCores, _verbose);
+
+    dispatcher.iterate (*itNode, [&] (Node& node)
+    {
+         /* just a quick note. It was observed in the context of flagging some node as uninteresting (not used anymore).
+         * here a strange dbg motif:
+         *
+         *  
+         *       (t)
+         *       / \
+         *      /   \
+         *     v     v
+         *  -->o    (n1)-->
+         *
+         *  node n1 is simple, but node (t) is considered a tip so will be deleted.
+         *  thus n1 will become a tip too
+         *  question is, should we actually delete (t)?
+         *  i'd argue so, it's likely artefactual. (n1) could be artefactual too.
+         *  consider those erroneous kmers:
+         *
+         *  AAT
+         *   ATC
+         *   ATG
+         *
+         * and assuming a true genome is TCTGTC (circular)
+         *
+         * so graph is:
+         *
+         *                   /-------------\
+         *                  v              |
+         *   AAT -> ATC -> TCT -> CTG      |
+         *    \                   /        |
+         *     \                 /         |
+         *      \               v          |
+         *       \-> ATG  --> TGT --> GTC -/
+         *
+         *  the three leftmost nodes should be removed and the four rightmost nodes are correct.
+         *  once AAT is removed, ATC and ATG are legit tips; but they were simple nodes initially. QED
+         *
+         */
+
+        TIME(auto start_thread_t=get_wtime());
+
+        // skip deleted nodes
+        if (_graph.isNodeDeleted(node)) {
+                TIME(auto end_thread_t=get_wtime()); 
+                TIME(__sync_fetch_and_add(&timeAll, diff_wtime(start_thread_t,end_thread_t))); 
+            return; }  
+
+        unsigned inDegree = _graph.indegree(node), outDegree = _graph.outdegree(node);
+
+        /* tips have out/in degree of 0 on one side, and any non-zero degree on the other */
+        if ((inDegree == 0 || outDegree == 0) && (inDegree != 0 || outDegree != 0))
+        {
+            bool isShortTopological = true;
+            bool isShortRCTC = true;
+
+            DEBUG_TIPS(cout << endl << "deadend node: " << _graph.toString (node) << endl);
+            __sync_fetch_and_add(&nbTipCandidates,1);
+
+            // this call is only to get the direction. a bit hacky.
+            GraphVector<Edge> neighbors = _graph.neighborsEdge(node); 
+            // but in fact, node may have one or more neighbors in that direction
+           
+            if (neighbors.size() == 0) { std::cout << "unexpected problem during removeTips, no neighbor; " << inDegree << " " << outDegree << " " << _graph.toString(node) << std::endl; exit(1);}
+
+            /* it may appear that we're only going to follow its first neighbor, but in fact, neighbors[0].from is node */
+            /* so, follow the simple path from this start tip node to the further node that has out-branching (out is w.r.t to the direction) */
+            TIME(auto start_simplepath_t=get_wtime());
+            Node&     simplePathStart = neighbors[0].from;
+            Direction simplePathDir   = neighbors[0].direction;
+            unsigned int pathLen = _graph.simplePathLength(simplePathStart,simplePathDir);
+            TIME(auto end_simplepath_t=get_wtime());
+            TIME(__sync_fetch_and_add(&timeSimplePath, diff_wtime(start_simplepath_t,end_simplepath_t)));
+            
+            if (k + pathLen >= _maxTipLengthTopological) // "k +" is to take into account that's we're actually traversing a path of extensions from "node"
+               isShortTopological = false;
+            if (k + pathLen >= _maxTipLengthRCTC) 
+               isShortRCTC = false;
+
+            if (isShortTopological)
+                TIME(__sync_fetch_and_add(&timeSimplePathShortTopo, diff_wtime(start_simplepath_t,end_simplepath_t)));
+            if (isShortRCTC)
+                TIME(__sync_fetch_and_add(&timeSimplePathShortRCTC, diff_wtime(start_simplepath_t,end_simplepath_t)));
+    
+            // if it's not short, then no point in computing whether it's connected
+            // also, it's pointless to examine it later, as it will never become short again (we only delete nodes)
+            // so mark the origin as non interesting! (big speed up)
+            if ( ! (isShortTopological || isShortRCTC) )
+            {   
+                TIME(__sync_fetch_and_add(&timeSimplePathLong, diff_wtime(start_simplepath_t,end_simplepath_t)));
+                TIME(auto end_thread_t=get_wtime()); 
+                TIME(__sync_fetch_and_add(&timeAll, diff_wtime(start_thread_t,end_thread_t)));
+                return;
+            }
+            
+            TIME(auto start_tip_decision_t=get_wtime());
+
+            // at this point, the last node in "nodes" is the last node of the tip.
+            // check if it's connected to something. 
+            // condition: degree > 1, because connected to the tip and to that "something"
+            Node lastNode           = _graph.simplePathLastNode(simplePathStart,simplePathDir);
+            bool isConnected = (_graph.neighborsEdge(lastNode, simplePathDir).size() >= 1);
+            if (pathLen == 0)
+            {
+                // special case: only a single tip node, check if it's not isolated
+                isConnected |=  (_graph.indegree(node) != 0 || _graph.outdegree(node) != 0); 
+            }
+
+            // TODO would be worth it to check if the node where the tip is connected to, is also connected to the tip and something else. i.e existence of a V-shaped pattern.
+
+            bool isTopologicalShortTip = isShortTopological && isConnected; 
+            bool isMaybeRCTCTip = isShortRCTC && isConnected;
+
+            DEBUG_TIPS(cout << endl << "pathlen: " << pathLen << " last node " << _graph.toString(lastNode) << " neighbors in/out: " <<_graph.indegree(lastNode) << " " << _graph.outdegree(lastNode) << " istoposhorttip: " << isTopologicalShortTip << endl);
+            
+            double pathMeanAbundance = _graph.simplePathMeanAbundance(simplePathStart,simplePathDir);
+
+            bool isRCTCTip = false;
+            if (!isTopologicalShortTip && isMaybeRCTCTip)
+            {
+                isRCTCTip = this->satisfyRCTC(pathMeanAbundance, lastNode, _tipRCTCcutoff, simplePathDir); 
+                /* fun fact: not putting "this->" crashes gcc 4.7; was fun to debug :\ */
+            }
+
+            bool isTip = isTopologicalShortTip || isRCTCTip; 
+            
+            TIME(auto end_tip_decision_t=get_wtime());
+            TIME(__sync_fetch_and_add(&timeDecision, diff_wtime(start_tip_decision_t,end_tip_decision_t)));
+
+            TIME(auto start_tip_processing_t=get_wtime());
+
+            if (isTip)
+            {
+                if (nodesDeleter.get(simplePathStart))
+                    {
+                        // not double-counting that delete
+                    }
+                else
+                {
+                    // delete it
+                    _graph.simplePathDelete(simplePathStart, simplePathDir, nodesDeleter);
+
+                    __sync_fetch_and_add(&nbTipsRemoved, 1);
+                    DEBUG_TIPS(cout << endl << "TIP FOUND, deleting node : " << _graph.toString(simplePathStart) << endl);
+                }
+            } // end if isTip
+
+            TIME(auto end_tip_processing_t=get_wtime());
+            TIME(__sync_fetch_and_add(&timeProcessing, diff_wtime(start_tip_processing_t,end_tip_processing_t)));
+
+        } // end if degree correspond to putative end-of-tip
+
+        TIME(auto end_thread_t=get_wtime()); 
+        TIME(__sync_fetch_and_add(&timeAll, diff_wtime(start_thread_t,end_thread_t)));
+
+    }); // parallel
+
+    TIME(auto start_nodesdel_t=get_wtime());
+    DEBUG_TIPS(std::cout << "end of tip removal pass" << std::endl;);
+    
+    // now delete all nodes, in parallel
+    nodesDeleter.flush();
+
+    TIME(auto end_nodesdel_t=get_wtime()); 
+    TIME(__sync_fetch_and_add(&timeDel, diff_wtime(start_nodesdel_t,end_nodesdel_t)));
+
+
+    TIME(auto start_nodescache_t=get_wtime());
+
+    if (_firstNodeIteration)
+        _graph.cacheNonSimpleNodes(_nbCores, true);
+
+    TIME(auto end_nodescache_t=get_wtime()); 
+    TIME(__sync_fetch_and_add(&timeCache, diff_wtime(start_nodescache_t,end_nodescache_t)));
+ 
+    // stats
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(1);
+    if (_verbose)
+    {
+        cout << nbTipsRemoved << " tips removed. " << endl;
+        cout << nbTipCandidates << " tip candidates passed degree check. " << endl;
+        TIME(cout << "Tips timings:   " << timeAll / unit << " CPUsecs total."<< endl);
+        TIME(cout << "                " << timeSimplePath / unit << " CPUsecs simple path traversal, including:" << endl);
+        TIME(cout << "                    " << timeSimplePathLong  / unit << " CPUsecs long simple paths" << endl);
+        TIME(cout << "                    " << timeSimplePathShortTopo / unit << " CPUsecs short (topological) simple paths" << endl);
+        TIME(cout << "                    " << timeSimplePathShortRCTC / unit << " CPUsecs short (RCTC) simple paths" << endl);
+        TIME(cout << "                " << timeDecision   / unit << " CPUsecs tip decision" << endl);
+        TIME(cout << "                " << timeProcessing / unit << " CPUsecs tip processing" << endl);
+        TIME(cout << "Nodes deletion:   " << timeDel / unit << " CPUsecs."<< endl);
+        TIME(cout << "Nodes caching :   " << timeCache / unit << " CPUsecs."<< endl);
+    }
+    
+    _firstNodeIteration = false;
+
+    return nbTipsRemoved;
+}
+
+enum HMCP_Success { HMCP_DIDNT_FIND_END = 0, HMCP_FOUND_END = 1 , HMCP_MAX_DEPTH = -1, HMCP_LOOP = -2};
+
+static string hmcpstatus2ascii(int h){
+    switch (h)
+    {
+        case HMCP_DIDNT_FIND_END:
+            return "didn't find end";
+        case HMCP_FOUND_END:
+            return "success, found end";
+        case HMCP_MAX_DEPTH:
+            return "max depth reached";
+        case HMCP_LOOP:
+            return "loop found, aborted";
+    }
+    return "unknown";
+}
+
+
+static double unitigs_chain2abundance(vector<int> &unitigs_lengths, vector<int> &unitigs_abundances)
+{
+    assert(unitigs_lengths.size() == unitigs_abundances.size());
+    //std::cout << "unitigs lengths " << unitigs_lengths.size() << std::endl;
+    double mean_abundance = 0;
+    int sum_lengths = 0;
+    for (unsigned int i = 0; i < unitigs_lengths.size(); i++)
+    {
+        mean_abundance += unitigs_lengths[i] * unitigs_abundances[i];
+        sum_lengths += unitigs_lengths[i];
+        //std::cout << "mean abundance now: "  << to_string(mean_abundance) << std::endl;
+        //std::cout << "sum lengths now: "  << to_string(sum_lengths) << std::endl;
+    }
+    return mean_abundance / sum_lengths;
+}
+
+
+/* note: the returned mean abundance does not include start and end nodes */
+// endNode is a node just after the bulge path. it's branching.
+template<typename GraphType, typename Node, typename Edge>
+void Simplifications<GraphType,Node,Edge>::heuristic_most_covered_path(
+        Direction dir, Node& startNode, Node& endNode, 
+        int traversal_depth, int& success, double &mean_abundance, 
+        Path_t<Node> &res_path,
+        unsigned int backtrackingLimit, Node *avoidFirstNode,
+        bool most_covered, bool kmer_version /* was the original version, where nodes were traversed kmer-by-kmer, now it's one simple path at a time */)
+{
+    set<Node> usedNode;
+    usedNode.insert(startNode);
+    Path_t<Node> current_path;
+    current_path.start = startNode;
+    success = HMCP_DIDNT_FIND_END;
+    vector<int> abundances; 
+    vector<int> unitigs_lengths, unitigs_abundances; 
+    unsigned long nbCalls = 0;
+    mean_abundance = 0;
+
+    // so i've disabled the kmer version, see comment on hmcp_old() function below
+#if 0
+    if (kmer_version)
+    {
+        heuristic_most_covered_path_old(dir, startNode, endNode, traversal_depth, current_path, usedNode, success, abundances,
+                backtrackingLimit, avoidFirstNode, 
+                most_covered, 
+                res_path,
+                nbCalls);
+
+        if (success == HMCP_FOUND_END)
+        { // no need to compute abundance in failed cases
+            for (unsigned int i = 0; i < abundances.size(); i++){
+                mean_abundance += abundances[i];
+            }
+            mean_abundance /= abundances.size();
+        }
+    }
+    else
+    {
+        // intermediate version, before GraphUnitigs
+/*        heuristic_most_covered_path(dir, startNode, endNode, traversal_depth, current_path, usedNode, success, mean_abundance,
+                backtrackingLimit, avoidFirstNode, 
+                most_covered, 
+                res_path,
+                nbCalls);
+  */          
+        
+        // WARNING:this is slow if ran on Graph. but fast on GraphUnitigs.
+#endif    
+        heuristic_most_covered_path_unitigs(dir, startNode, endNode, 
+                traversal_depth, usedNode, success, unitigs_lengths, unitigs_abundances, mean_abundance,
+                backtrackingLimit, avoidFirstNode, 
+                most_covered, nbCalls);
+#if 0
+    }
+#endif
+
+    /* below this point: debug stuff*/
+
+    bool debug_abundances = false;
+    if (debug_abundances)
+    {
+        cout << "abundance for path (is most covered path: " << most_covered << "): ";
+        for (unsigned int i = 0; i < abundances.size(); i++)
+            cout << abundances[i]<< " ";
+        cout << ";"<<endl;
+    }
+
+    bool debug_nbcalls = false;
+    if (debug_nbcalls)
+        cout << "number of path-finding calls: " << nbCalls << endl;
+}
+
+#if 0 //the nt stuff is not supported in EdgeGU anymore, so i'm disabling this code
+
+template<typename GraphType, typename Node, typename Edge>
+void Simplifications<GraphType,Node,Edge>::heuristic_most_covered_path_old(
+        Direction dir, Node& startNode, Node& endNode,
+        int traversal_depth, Path_t<Node>& current_path, set<Node>& usedNode, int& success, vector<int>& abundances,
+        unsigned int backtrackingLimit, Node *avoidFirstNode, 
+        bool most_covered, Path_t<Node> &res_path,
+        unsigned long &nbCalls)
+{
+    // inspired by all_consensuses_between
+    nbCalls++;
+    
+    if (traversal_depth < -1)
+    {
+        success = HMCP_DIDNT_FIND_END;
+        return;
+    }
+
+    if (startNode == endNode)
+    {
+        success = HMCP_FOUND_END;
+        res_path = current_path;
+        return;
+    }
+
+    GraphVector<Edge> neighbors = _graph.neighborsEdge (startNode, dir);
+
+    /** We loop these neighbors. */
+    vector<std::pair<int, Edge> > abundance_node;
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& edge = neighbors[i];
+
+        if (avoidFirstNode != NULL && edge.to == *avoidFirstNode)
+            continue;
+
+        // don't resolve bubbles containing loops
+        // (tandem repeats make things more complicated)
+        // that's a job for a gapfiller
+        if (usedNode.find(edge.to) != usedNode.end())
+        {
+            success = HMCP_LOOP;
+            return;
+        }
+        
+        unsigned int abundance = _graph.queryAbundance(neighbors[i].to);
+        abundance_node.push_back(std::make_pair(abundance, edge));
+        //cout << endl << "node: " << _graph.toString (neighbors[i].to) << " abundance: "  << to_string(abundance) << endl;
+    }
+
+    std::sort(abundance_node.begin(), abundance_node.end()); // sort nodes by abundance
+    if (most_covered) 
+        std::reverse(abundance_node.begin(), abundance_node.end()); // decreasing abundances
+
+    // traverse graph in abundance order, return most abundant path
+    for (unsigned int i = 0; i < abundance_node.size(); i++)
+    {
+        Edge edge = abundance_node[i].second;
+
+        // generate extended consensus sequence
+        Path_t<Node> extended_path(current_path);
+        extended_path.push_back (edge.nt);
+
+        // generate list of used kmers (to prevent loops)
+        set<Node> extended_kmers (usedNode);
+        extended_kmers.insert (edge.to);
+
+        // extend abundances
+        vector<int> extended_abundances (abundances);
+        if (edge.to != endNode) // skip abundance of last node
+            extended_abundances.push_back(abundance_node[i].first);
+
+        // recursive call to all_consensuses_between
+        heuristic_most_covered_path_old (
+            dir,
+            edge.to,
+            endNode,
+            traversal_depth - 1,
+            extended_path,
+            extended_kmers,
+            success,
+            extended_abundances,
+            backtrackingLimit,
+            NULL, // no longer avoid nodes
+            most_covered,
+            res_path,
+            nbCalls
+        );
+
+        if (backtrackingLimit > 0 && nbCalls >= backtrackingLimit)
+        {
+            success = HMCP_MAX_DEPTH;
+            return;
+        }
+
+        if (success == HMCP_FOUND_END)
+        {
+            abundances = extended_abundances;
+            return; 
+        }
+    }
+    return;
+}
+
+/* faster variant of the algo above, with cached simple paths instead of traversing node-by-node */
+// Note: not totally equivalent to the kmer version, some bubbles are found in the kmer version but not in this one
+template<typename GraphType, typename Node, typename Edge>
+void Simplifications<GraphType,Node,Edge>::heuristic_most_covered_path(
+        Direction dir, Node& startNode, Node& endNode, 
+        int traversal_depth, Path_t<Node>& current_path, set<Node>& usedNode, int& success, double &mean_abundance,
+        unsigned int backtrackingLimit, Node *avoidFirstNode, 
+        bool most_covered, Path_t<Node> &res_path,
+        unsigned long &nbCalls)
+{
+    nbCalls++;
+    
+    if (traversal_depth < -1)
+    {
+        success = HMCP_DIDNT_FIND_END;
+        return;
+    }
+
+    Node current_node = startNode;
+ 
+    if (current_node == endNode)
+    {
+        success = HMCP_FOUND_END;
+        res_path = current_path;
+        mean_abundance = path2abundance(dir, res_path, endNode, 1, 1);
+        // to get the seq, make some sort of unitig2string(), but i never did it
+        return;
+    }
+
+    set<Node>& traversedNodes (usedNode);
+
+    Path_t<Node> current_extended_path(current_path);
+    int extra_depth = 1;
+
+    auto extend_and_check = [&](Edge &edge)
+    {
+        current_node = edge.to;
+        current_extended_path.push_back( edge.nt );
+        extra_depth++;
+        nbCalls++;
+
+        if (traversedNodes.find(current_node) != traversedNodes.end() )  // loop
+        {
+            success = HMCP_LOOP;
+            return true;
+        }
+ 
+        traversedNodes.insert(current_node); 
+
+        if (current_node == endNode)
+        {
+            success = HMCP_FOUND_END;
+            res_path = current_extended_path;
+            mean_abundance = path2abundance(dir, res_path, endNode, 1, 1);
+            return true;
+        }
+
+        return false;
+    };
+
+
+    // traverse simple path from that node
+    // we end up at a branching node. 
+    // if the node has no out-branching, keep going, we don't care about in-branching here.
+    do
+    {
+        GraphIterator <Edge> itEdges
+            = _graph.template simplePathEdge (current_node, dir);
+        
+        for (itEdges.first(); !itEdges.isDone(); itEdges.next())
+        {
+            if (extend_and_check(*itEdges)) // updates current_node and current_extended_path, as well as nbCalls and extra_depth
+                return;
+        }
+
+        // end of simple path, yet no out-branching? means there is in-branching
+        if (_graph.degree(current_node, dir) == 1)
+        {
+            // get the node after in-branching
+            GraphVector<Edge> neighbors = _graph.neighborsEdge(current_node, dir);
+        
+            if (extend_and_check(neighbors[0])) // updates current_node and current_extended_path, as well as nbCalls and extra_depth
+                return;
+        }
+        else
+            break; // we're either at a deadend or at a branching node
+    }
+    while (true);
+            
+    // at this point, we've traversed simple paths from startNode and we ended up at a branching node or a deadend
+
+    // get neighbors of branching node
+    GraphVector<Edge> neighbors = _graph.neighborsEdge (current_node, dir);
+
+    /** We loop over the neighbors of that branching node, to order them by abundance */
+    vector<std::pair<int, Edge> > abundance_node;
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& edge = neighbors[i];
+
+        if (avoidFirstNode != NULL && edge.to== *avoidFirstNode)
+            continue;
+
+        // don't resolve bubbles containing loops
+        // (tandem repeats make things more complicated)
+        // that's a job for a gapfiller
+        if (traversedNodes.find(edge.to) != traversedNodes.end())
+        {
+            success = HMCP_LOOP;
+            return;
+        }
+        
+        unsigned int abundance = _graph.queryAbundance(neighbors[i].to);
+        abundance_node.push_back(std::make_pair(abundance, edge));
+    }
+
+    std::sort(abundance_node.begin(), abundance_node.end()); // sort nodes by abundance
+    if (most_covered) 
+        std::reverse(abundance_node.begin(), abundance_node.end()); // decreasing abundances
+
+    // traverse graph in abundance order, return most abundant path
+    for (unsigned int i = 0; i < abundance_node.size(); i++)
+    {
+        Edge edge = abundance_node[i].second;
+
+        // generate extended consensus sequence
+        Path_t<Node> extended_path(current_extended_path);
+        extended_path.push_back (edge.nt);
+
+        // generate list of used kmers (to prevent loops)
+        set<Node> extended_kmers (traversedNodes);
+        extended_kmers.insert (edge.to);
+
+        // recursive call to all_consensuses_between
+        heuristic_most_covered_path (
+            dir,
+            edge.to,
+            endNode,
+            traversal_depth - extra_depth,
+            extended_path,
+            extended_kmers,
+            success,
+            mean_abundance,
+            backtrackingLimit,
+            NULL, // no longer avoid nodes
+            most_covered,
+            res_path,
+            nbCalls
+        );
+              
+        if (backtrackingLimit > 0 && nbCalls >= backtrackingLimit)// if no more backtracking, return immediately
+        {
+            success = HMCP_MAX_DEPTH;
+            return;
+        }
+
+        if (success == HMCP_FOUND_END)
+        {
+            return; 
+        }
+ 
+    }
+
+    return;
+}
+#endif
+
+/* GraphUnitigs version of the algo above. 
+ * doesn't construct a Path anymore, and handles abundances differently, so i preferred to make another function rather than re-using the one above */
+template<typename GraphType, typename Node, typename Edge>
+void Simplifications<GraphType,Node,Edge>::heuristic_most_covered_path_unitigs(
+        Direction dir, Node& startNode, Node& endNode, 
+        int traversal_depth, set<Node>& usedNode, int& success, vector<int>& unitigs_lengths, vector<int>& unitigs_abundances, double& mean_abundance,
+        unsigned int backtrackingLimit, Node *avoidFirstNode, 
+        bool most_covered, unsigned long &nbCalls)
+{
+    bool debug = false;
+    
+    if (traversal_depth < -1)
+    {
+        success = HMCP_DIDNT_FIND_END;
+        return;
+    }
+    
+    nbCalls++;
+
+    Node current_node = startNode;
+    if (debug)
+        std::cout << "HMCP rec, now at : " << _graph.toString(current_node) << " dir " << dir<< std::endl;;
+ 
+    if (current_node == endNode)
+    {
+        success = HMCP_FOUND_END;
+        mean_abundance = unitigs_chain2abundance(unitigs_lengths, unitigs_abundances);
+        return;
+    }
+
+    set<Node>& traversedNodes (usedNode);
+    int extra_depth = 1;
+
+    auto processNode = [&unitigs_lengths, &unitigs_abundances, &endNode, &current_node, &success, &mean_abundance, &traversedNodes](Node &node)
+    {
+        current_node = node;
+        if (current_node == endNode)
+        {
+            success = HMCP_FOUND_END;
+            mean_abundance = unitigs_chain2abundance(unitigs_lengths, unitigs_abundances);
+            return true;
+        }
+        if (traversedNodes.find(current_node) != traversedNodes.end() )  // loop
+        {
+            //std::cout << "loop : " << _graph.toString(current_node) << std::endl;;
+            success = HMCP_LOOP;
+            return true;
+        }
+        traversedNodes.insert(current_node); 
+        return false;
+    };
+
+    // traverse simple path from that node
+    // we end up at a branching node. 
+    // if the node has no out-branching, keep going, we don't care about in-branching here.
+    do
+    {
+        if (debug)
+            std::cout << "HMCP traversing simple path from node: " << _graph.toString(current_node) << std::endl;;
+        
+        //if (processNode(current_node)) // don't check whether we're done here, because first kmer is already inserted in traversedKmers by loop invariant
+
+        Node&     simplePathStart = current_node;
+        Direction simplePathDir   = dir;
+        unsigned int pathLen = _graph.simplePathLength(simplePathStart,simplePathDir);
+        if (pathLen > 0)
+        { 
+            double pathMeanAbundance = _graph.simplePathMeanAbundance(simplePathStart,simplePathDir);
+            
+            unitigs_lengths.push_back(pathLen);
+            unitigs_abundances.push_back(pathMeanAbundance);
+
+            nbCalls += pathLen + 1;
+            extra_depth += pathLen + 1; 
+        
+            Node lastNode           = _graph.simplePathLastNode     (simplePathStart,simplePathDir);
+            if (processNode(lastNode)) // verify whether we're done
+                return;
+
+            if (debug)
+                std::cout << "HMCP now at last node : " << _graph.toString(current_node) << std::endl;;
+
+
+        }
+        else
+        {
+            if (debug)
+            {
+                Node lastNode           = _graph.simplePathLastNode     (simplePathStart,simplePathDir);
+                std::cout << "HMCP last node was equal to first node: " << _graph.toString(lastNode) << " " << _graph.toString(current_node) << std::endl;
+            }
+        }
+
+        // end of simple path, yet no out-branching? means there is in-branching
+        if (_graph.degree(current_node, dir) == 1)
+        {
+            // get the node after in-branching
+            GraphVector<Edge> neighbors = _graph.neighborsEdge(current_node, dir);
+
+            current_node = neighbors[0].to;
+            if (_graph.degree(current_node, reverse(dir)) <= 1)
+            {
+                std::cout << "Weird, there was supposed to be an in-neighbor. Maybe there's a loop. Remove this print if it never happens" << std::endl;
+                return;
+            }
+
+             if (debug)
+                std::cout << "end of simple path, at node, there is in-branching: " << _graph.toString(current_node) << " degrees " << _graph.degree(current_node, reverse(dir)) << "/" << _graph.degree(current_node, dir) << std::endl;;
+
+
+            nbCalls ++;
+            extra_depth++; 
+        
+            if (processNode(current_node)) // verify whether we're done
+                return;
+        }
+        else
+            break; // we're either at a deadend or at a branching node
+    }
+    while (true);
+            
+    // at this point, we've traversed simple paths from startNode and we ended up at a branching node or a deadend
+
+    // get neighbors of branching node
+    GraphVector<Edge> neighbors = _graph.neighborsEdge (current_node, dir);
+    
+    assert(neighbors.size() != 1);
+    
+    /** We loop over the neighbors of that branching node, to order them by abundance 
+     * there's a variant here from other flavors of HMP: we take the most abundance path. */
+    vector<std::pair<int, Edge> > abundance_node;
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& edge = neighbors[i];
+
+        if (avoidFirstNode != NULL && edge.to == *avoidFirstNode)
+            continue;
+
+        // don't resolve bubbles containing loops
+        // (tandem repeats make things more complicated)
+        // that's a job for a gapfiller
+        if (traversedNodes.find(edge.to) != traversedNodes.end())
+        {
+            success = HMCP_LOOP;
+            return;
+        }
+        
+        double abundance = _graph.simplePathMeanAbundance(edge.to,dir);
+        abundance_node.push_back(std::make_pair(abundance, edge));
+    }
+
+    std::sort(abundance_node.begin(), abundance_node.end()); // sort nodes by abundance
+    if (most_covered) 
+        std::reverse(abundance_node.begin(), abundance_node.end()); // decreasing abundances
+
+    // traverse graph in abundance order, return most abundant path
+    for (unsigned int i = 0; i < abundance_node.size(); i++)
+    {
+        Edge edge = abundance_node[i].second;
+
+        // generate list of used kmers (to prevent loops)
+        set<Node> extended_kmers (traversedNodes);
+        extended_kmers.insert (edge.to);
+
+        vector<int> new_unitigs_lengths(unitigs_lengths);
+        vector<int> new_unitigs_abundances(unitigs_abundances);
+
+        // recursive call to all_consensuses_between
+        heuristic_most_covered_path_unitigs(
+            dir,
+            edge.to,
+            endNode,
+            traversal_depth - extra_depth,
+            extended_kmers,
+            success,
+            new_unitigs_lengths,
+            new_unitigs_abundances,
+            mean_abundance,
+            backtrackingLimit,
+            NULL, // no longer avoid nodes
+            most_covered,
+            nbCalls
+        );
+              
+        if (backtrackingLimit > 0 && nbCalls >= backtrackingLimit)// if no more backtracking, return immediately
+        {
+            success = HMCP_MAX_DEPTH;
+            return;
+        }
+
+        if (success == HMCP_FOUND_END)
+        {
+            return; 
+        }
+ 
+    }
+
+    return;
+}
+
+class DebugBR
+{
+    string start;
+    struct InfoNeighbor
+    {
+        int idx;
+        string neighbor;
+        string dir;
+        string lastNode;
+        int pathLen;
+        int out_degree_lastNode;
+        string branchTo;
+        bool isTopologicalBulge;
+    };
+    vector<InfoNeighbor> neighbors;
+   
+    public: 
+    DebugBR(string node, int nb_neighbors) : start(node), neighbors(nb_neighbors) { 
+        // std::cout << "new candidate bulge: " << node << std::endl;
+    }
+    
+    void infoNeighbor(int neighbor_idx, string neighbor, string direction, string lastNode, int pathLen, int nb_outneighbors, string branchTo, bool isTopologicalBulge)
+    {   
+        InfoNeighbor info{neighbor_idx, neighbor, direction, lastNode, pathLen, nb_outneighbors, branchTo, isTopologicalBulge};
+        neighbors[neighbor_idx] = info;
+        //cout << "last node of simple path: "<< lastNode << " and " << nb_outneighbors << " neighbors in bubble direction" << endl;
+        //cout << "endNode: " << branchTo << endl);
+        //cout << "pathlen: " << pathLen << " istopobulge: " << isTopologicalBulge << endl);
+    }
+
+    void draw()
+    {
+       cout << start << " candidate bulge" << std::endl;;
+       for (unsigned int i = 0; i < neighbors.size(); i++)
+       {
+            const InfoNeighbor &nfo = neighbors[i];
+            std::cout << " --> " << nfo.neighbor << "(" << nfo.dir << ") ...[len=" << nfo.pathLen << "]... " << nfo.lastNode << " [neighbors: " << nfo.out_degree_lastNode << "] -> " << nfo.branchTo << " istopobulge: " << nfo.isTopologicalBulge << std::endl;
+       }
+    }
+};
+
+/* bulge removal algorithm. mimics spades, which doesnt remove bubbles, but only bulges. looks as effective.
+ *
+ * see a-b-c here for an explanation of bulge removal: http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3791033/figure/f4/
+ *
+ * spades pops bulges based on something like the ratio between most examined simple path and a more covered path is (whether it is above 1.1).
+ * so i'm actually doing just that. I recall checking spades source code to implement this. this was during CAMI.
+ *
+ * Small apparte about simple paths: in SPAdes' source, a simple path isn't a non-branching one, it is rather the wikipedia definition: one where nodes aren't repeated (and also here, no node is its own reverse-complement). This makes me think that GATB's simplePath function is a bit of a misnomer, should be called nonBranchingPath.
+ *
+ * so.. this is what we did for CAMI and how the code was up to 2017.
+ * but, here's the twist, it turns out that this code doesn't remove any SNPs. 
+ * kinda embarassing. metagenomes don't have SNPs so that's why i never noticed so far.
+ * (maybe should have noticed that my human genomes assemblies were so bad)
+ *
+ * let me write the analysis of spades that i should have written earlier:
+ *
+ * in bulge_removed.hpp, 
+ *
+ * if bulgecov > 1000, fail (i didn't implement this)
+ *
+ * delta = CountMaxDifference(max_delta_, g_.length(e), max_relative_delta_); 
+ * means that delta is set to max(bulgelen*0.1, 3)
+ *
+ * so we're looking for alternative paths which are of length [bulgelen-delta;bulgelen+delta]
+ *
+ */ 
+template<typename GraphType, typename Node, typename Edge>
+unsigned long Simplifications<GraphType,Node,Edge>::removeBulges()
+{
+    unsigned int k = _graph.getKmerSize();
+    unsigned int maxBulgeLength = std::max((unsigned int)((double)k * _bulgeLen_kMult), (unsigned int)(k + _bulgeLen_kAdd)); // SPAdes, exactly
+    unsigned int backtrackingLimit = k+_bulgeAltPath_kAdd;//maxBulgeLength; // arbitrary, but if too high it will take much time; // with unitigs, no reason that it has to depend on k, but for some reason, setting it to just "k" doesnt remove nearly as many bulges as k=20. todo investigate that someday.
+    unsigned int altPathCovMult = _bulgeAltPath_covMult;
+
+    // stats
+    //
+    unsigned long nbBulgesCandidates = 0;
+    unsigned long nbBulgesRemoved = 0;
+    unsigned long nbSimplePaths = 0;
+    unsigned long nbLongSimplePaths = 0;
+    unsigned long nbShortSimplePaths = 0;
+    unsigned long nbTopologicalBulges = 0;
+    unsigned long nbFirstNodeDeleted = 0;
+    unsigned long nbFirstNodeGraphDeleted = 0;
+    unsigned long nbNoAltPathBulgesLoop = 0, nbNoAltPathBulgesDepth = 0,nbNoAltPathBulgesDeadend = 0;
+    unsigned long nbBadCovBulges = 0;
+
+    unsigned long timeAll = 0, timePathFinding = 0, timeFailedPathFinding = 0, timeLongestFailure = 0,
+                  timeSimplePath = 0, timeDelete = 0, timePost = 0, timeVarious = 0;
+
+    unsigned long longestFailureDepth = 0;
+
+    /** We get an iterator over all nodes . */
+    char buffer[128];
+    sprintf(buffer, simplprogressFormat2, ++_nbBulgeRemovalPasses);
+    ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem> *itNode; 
+    if (_firstNodeIteration )
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iterator(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " nodes" << std::endl;
+    }
+    else
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iteratorCachedNodes(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " cached nodes" << std::endl;
+    }
+
+
+    // parallel stuff: create a dispatcher ; support atomic operations
+    Dispatcher dispatcher (_nbCores);
+
+    NodesDeleter<Node,Edge,GraphType> nodesDeleter(_graph, nbNodes, _nbCores, _verbose);
+
+#ifdef SIMPLIFICATION_LAMBDAS 
+    dispatcher.iterate (itNode, [&] (Node& node) {
+#else
+    for (itNode->first(); !itNode->isDone(); itNode->next())
+    {
+        Node& node = itNode->item();
+#endif
+        TIME(auto start_thread_t=get_wtime());
+
+        if (_graph.isNodeDeleted(node)) { 
+#ifdef SIMPLIFICATION_LAMBDAS
+            return; 
+#else
+            continue;
+#endif
+        }
+
+      TIME(auto start_various_overhead_t=get_wtime());
+
+          unsigned inDegree = _graph.indegree(node), outDegree = _graph.outdegree(node);
+
+      TIME(auto end_various_overhead_t=get_wtime());
+      TIME(__sync_fetch_and_add(&timeVarious, diff_wtime(start_various_overhead_t,end_various_overhead_t)));
+
+
+
+      // need to search in both directions
+      for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+      {
+         if ((outDegree >= 2 && dir == DIR_OUTCOMING) || (inDegree >= 2 && dir == DIR_INCOMING))
+         {
+            __sync_fetch_and_add(&nbBulgesCandidates,1);
+
+            TIME(auto start_various_overhead_t=get_wtime());
+    
+                /** We follow the outgoing simple paths to get their length and last neighbor */
+                GraphVector<Edge> neighbors = _graph.neighborsEdge(node, dir);
+                
+                DEBUG_BULGES(DebugBR debugBR(_graph.toString(node), neighbors.size()););
+
+
+            TIME(auto end_various_overhead_t=get_wtime());
+            TIME(__sync_fetch_and_add(&timeVarious, diff_wtime(start_various_overhead_t,end_various_overhead_t)));
+
+            // do everying for each possible short simple path that is neighbor of that node
+            assert(neighbors.size() > 1);
+            for (unsigned int i = 0; i < neighbors.size(); i++)
+            {
+                if (node == (neighbors[i].to)) // node being it's own neighbors, is rare, but let's avoid it
+                    continue;
+            
+                TIME(auto start_various_overhead_t=get_wtime());
+
+                    if (_graph.isNodeDeleted(neighbors[i].to)) { 
+                         __sync_fetch_and_add(&nbFirstNodeGraphDeleted, 1);
+                        continue;}
+
+                TIME(auto end_various_overhead_t=get_wtime());
+                TIME(__sync_fetch_and_add(&timeVarious, diff_wtime(start_various_overhead_t,end_various_overhead_t)));
+
+                /* that's the putative bulge*/
+                TIME(auto start_simplepath_t=get_wtime());
+                Node&     simplePathStart = neighbors[i].to;
+                Direction simplePathDir   = dir;
+                unsigned int pathLen = _graph.simplePathLength(simplePathStart,simplePathDir);
+                TIME(auto end_simplepath_t=get_wtime());
+                TIME(__sync_fetch_and_add(&timeSimplePath, diff_wtime(start_simplepath_t,end_simplepath_t)));
+                __sync_fetch_and_add(&nbSimplePaths, 1);
+
+                bool isShort = true;
+
+                if (k + pathLen >= maxBulgeLength) // "k +" is to take into account that's we're actually traversing a path of extensions from "node"
+                {
+                    __sync_fetch_and_add(&nbLongSimplePaths, 1);
+                    isShort = false;
+                }
+
+                if (!isShort || pathLen == 0) // can't do much if it's pathLen=0, we don't support edge removal, only node removal
+                    continue;
+                
+                __sync_fetch_and_add(&nbShortSimplePaths, 1);
+
+                TIME(start_various_overhead_t=get_wtime());
+
+                
+                    Node lastNode = _graph.simplePathLastNode(simplePathStart,simplePathDir);
+                    GraphVector<Edge> outneighbors = _graph.neighborsEdge(lastNode, dir);
+    
+                    if (outneighbors.size() == 0) // might still be a tip, unremoved for some reason
+                        continue;
+   
+                    // so here is a hidden assumption: maybe outneighbors is of size more than 1, we used to care about the first noed after.
+                    // i could decide to enforce bulge popping only if the outneighbor has size 1. 
+                    //if (outneighbors.size() != 1) 
+                    //    continue;
+                    //  but i'm decided to do without for now. TODO: explore all the end nodes, not just the first once
+
+                    Node endNode = outneighbors[0].to;
+    
+                    // at this point, the last node in "nodes" is the last node of a potential Bulge path, and endNode is hopefully a branching node right after.
+                    // check if it's connected to something that has in-branching. 
+                    bool isDoublyConnected = (dir==DIR_OUTCOMING && _graph.indegree(endNode) > 1) || (dir==DIR_INCOMING && _graph.outdegree(endNode) > 1);
+    
+                    bool isTopologicalBulge = isDoublyConnected;
+    
+                    DEBUG_BULGES(debugBR.infoNeighbor(i, _graph.toString(neighbors[i].to), DIR2STR(dir), _graph.toString(lastNode), pathLen, outneighbors.size(), _graph.toString(endNode), isTopologicalBulge););
+
+                TIME(end_various_overhead_t=get_wtime());
+                TIME(__sync_fetch_and_add(&timeVarious, diff_wtime(start_various_overhead_t,end_various_overhead_t)));
+
+                if (!isTopologicalBulge)
+                    continue;
+                    
+                //cout << "endnode has indegree/outdegree: " <<_graph.indegree(endNode) << "/" << _graph.outdegree(endNode) <<  " and the node before has indegree/outdegree: " <<_graph.indegree(nodes.back()) << "/" << _graph.outdegree(nodes.back()) << endl;
+
+                __sync_fetch_and_add(&nbTopologicalBulges, 1);
+
+                unsigned int maxlen = std::max((unsigned int)(pathLen * 1.1),(unsigned int) (pathLen + 3)); // following SPAdes
+                double mean_abundance_most_covered;
+                int success;
+                Node startNode = node;
+
+                TIME(auto start_pathfinding_t=get_wtime());
+
+                Path_t<Node>  heuristic_p_most; // actually won't be used.. (it's just for debug) so would be nice to get rid of it someday, but i don't want to deal with pointers.
+
+                /* startNode is branching, because we want to find alternative paths, except the one that go through (neighbors[i].to)*/
+                this->heuristic_most_covered_path(dir, startNode, endNode, 
+                            maxlen, 
+                            success, mean_abundance_most_covered,
+                            heuristic_p_most,
+                            backtrackingLimit, // avoid too much backtracking
+                            &(neighbors[i].to), // avoid that node
+                            true, // most covered path
+                            false // kmer version (true), unitigs version (false) 
+                            );
+
+                TIME(auto end_pathfinding_t=get_wtime());
+                TIME(__sync_fetch_and_add(&timePathFinding, diff_wtime(start_pathfinding_t,end_pathfinding_t)));
+
+                if (success != 1)
+                {
+                    DEBUG_BULGES(cout << "HMCP failed: " << hmcpstatus2ascii(success) << endl);
+                    TIME(__sync_fetch_and_add(&timeFailedPathFinding, diff_wtime(start_pathfinding_t,end_pathfinding_t)));
+                    TIME(if (diff_wtime(start_pathfinding_t,end_pathfinding_t) > timeLongestFailure) { timeLongestFailure = diff_wtime(start_pathfinding_t,end_pathfinding_t); });
+                    longestFailureDepth = maxlen;
+
+                    if (success == HMCP_LOOP)
+                        __sync_fetch_and_add(&nbNoAltPathBulgesLoop, 1);
+                    if (success == HMCP_MAX_DEPTH)
+                         __sync_fetch_and_add(&nbNoAltPathBulgesDepth, 1);
+                    if (success == HMCP_DIDNT_FIND_END )
+                         __sync_fetch_and_add(&nbNoAltPathBulgesDeadend, 1);
+                    continue;
+                }
+
+                TIME(auto start_post_t=get_wtime());
+
+                    bool debug_hmcp = false;
+                    if (debug_hmcp)
+                    {
+
+                        double mean_abundance_least_covered;
+                        Path_t<Node> heuristic_p_least, heuristic_p_most;
+                        this->heuristic_most_covered_path(dir, startNode, endNode, maxlen, success, mean_abundance_most_covered,  heuristic_p_most,  backtrackingLimit, &(neighbors[i].to),  true, true /* old version */);
+                        this->heuristic_most_covered_path(dir, startNode, endNode, maxlen, success, mean_abundance_least_covered, heuristic_p_least, backtrackingLimit, &(neighbors[i].to), false,  true /* old version */);
+                        cout << "alternative path is:  "<< this->path2string(dir, heuristic_p_most, endNode)<< " abundance: "<< mean_abundance_most_covered <<endl;
+                        DEBUG_BULGES(cout << endl << "alternative least is: "<< this->path2string(dir, heuristic_p_least, endNode)<< " abundance: "<< mean_abundance_least_covered <<endl);
+                    }
+
+                    double simplePathCoverage = _graph.simplePathMeanAbundance(simplePathStart, simplePathDir);
+    
+                    bool isBulge =  simplePathCoverage <=  mean_abundance_most_covered * altPathCovMult /*typically 1.1 in genome assembly, SPAdes*/;
+    
+                    DEBUG_BULGES(cout << "bulge coverages: " << simplePathCoverage << " (path: " << _graph.toString(simplePathStart) << ") vs most covered:" <<  mean_abundance_most_covered  << endl);
+    
+                    if (!isBulge)
+                    {
+                        __sync_fetch_and_add(&nbBadCovBulges, 1);
+                        DEBUG_BULGES(cout << "not a bulge due to coverage criterion" << endl);
+
+                        TIME(auto end_post_t=get_wtime());
+                        TIME(__sync_fetch_and_add(&timePost, diff_wtime(start_post_t,end_post_t)));
+                        continue;
+                    }
+
+                    if (nodesDeleter.get(simplePathStart))
+                    {
+                        // not double-counting that delete
+                    }
+                    else
+                    {
+                        // delete the bulge
+                        //
+                        DEBUG_BULGES(cout << endl << "BULGE of length " << pathLen << " FOUND: " <<  _graph.toString (simplePathStart) << endl);
+                        _graph.simplePathDelete(simplePathStart, simplePathDir, nodesDeleter);
+
+                        __sync_fetch_and_add(&nbBulgesRemoved, 1);
+                    }
+
+                TIME(auto end_post_t=get_wtime());
+                TIME(__sync_fetch_and_add(&timePost, diff_wtime(start_post_t,end_post_t)));
+
+                break; // quite important to break here: don't try to remove the other neighbor (which might also satisfy the bulge condition)
+
+            } // for neighbors
+
+            DEBUG_BULGES(debugBR.draw(););
+        } // if outdegree
+      } // for direction
+        TIME(auto end_thread_t=get_wtime());
+        TIME(__sync_fetch_and_add(&timeAll, diff_wtime(start_thread_t,end_thread_t)));
+    
+#ifdef SIMPLIFICATION_LAMBDAS
+            }); // parallel
+#else
+}
+#endif
+
+
+    // now delete all nodes, in parallel
+    TIME(auto start_nodedelete_t=get_wtime());
+
+    nodesDeleter.flush();
+
+    TIME(auto end_nodedelete_t=get_wtime());
+    TIME(__sync_fetch_and_add(&timeDelete, diff_wtime(start_nodedelete_t,end_nodedelete_t)));
+
+    if (_verbose)
+    {
+        cout << nbBulgesRemoved << " bulges removed. " << endl <<
+            nbSimplePaths << "/" << nbLongSimplePaths << "+" <<nbShortSimplePaths << " any=long+short simple path examined across all threads, among them " <<
+            nbTopologicalBulges << " topological bulges, " << nbFirstNodeDeleted << "+" << nbFirstNodeGraphDeleted << " were first-node duplicates." << endl;
+        cout << nbBulgesCandidates << " bulges candidates passed degree check. " << endl;
+        cout << nbNoAltPathBulgesDepth << "+" << nbNoAltPathBulgesLoop << "+" << nbNoAltPathBulgesDeadend << " without alt. path (complex+loop+noend), " 
+            << nbBadCovBulges << " didn't satisfy cov. criterion." << endl;
+    }
+
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(1);
+
+    if (_verbose)
+    {
+        TIME(cout << "Bulges timings: " << timeAll / unit << " CPUsecs total."<< endl);
+        TIME(cout << "                " << timeSimplePath / unit << " CPUsecs simple path traversal." << endl);
+        TIME(cout << "                " << timePathFinding / unit << "(/" << timePathFinding / unit << ") CPUsecs path-finding(/failed). Longest: " << timeLongestFailure / (unit/1000) << " CPUmillisecs (depth " << longestFailureDepth << ")." << endl);
+        TIME(cout << "                " << timePost / unit << " CPUsecs topological bulge processing, " << endl);
+        TIME(cout << "                " << timeDelete / unit << " CPUsecs nodes deletion." << endl);
+        TIME(cout << "                " << timeVarious / unit << " CPUsecs various overhead." << endl);
+    }
+
+    return nbBulgesRemoved;
+}
+
+
+
+/* Again, let's see what spades 3.5 does.
+ *erroneous connection remover is:
+
+ RemoveLowCoverageEdges
+ calls config then calls:
+  omnigraph::EdgeRemovingAlgorithm which is same as tc
+
+  to_ec_lb in ../src/debruijn/simplification/simplification_settings.hpp
+  is exactly like tip clipping but with a different length (2 * (max tip length with coeff 5) - 1, so that's exactly 10*min(k,readlen/2) - 1)
+
+  icb is something that removes edges with coverage = (cov_bound * iter / nb_iters )
+  where cov_bound is same as in cb
+
+  and it's asking for AlternativesPresenceCondition:
+
+    o   o                           o-->-O
+   /     \                             /
+   O-->---O    drawn differently:     /
+                                    O-->-o
+
+  so anyway, since we're not computing the coverage model like SPAdes does, I'm going to use RCTC 4 (found that RCTC 2 gives too many misassemblies)
+
+*/
+template<typename GraphType, typename Node, typename Edge>
+unsigned long Simplifications<GraphType,Node,Edge>::removeErroneousConnections()
+{
+    unsigned int k = _graph.getKmerSize();
+    unsigned int maxECLength = (unsigned int)((float)k * _ecLen_kMult) ;  // SPAdes mode 
+    double RCTCcutoff = _ecRCTCcutoff;
+
+    unsigned long nbSimplePaths = 0;
+    unsigned long nbLongSimplePaths = 0;
+    unsigned long nbShortSimplePaths = 0;
+    unsigned long nbTopologicalEC = 0;
+    unsigned long nbECRemoved = 0;
+    unsigned long nbECCandidates = 0;
+    unsigned long timeDelete = 0, timeProcessing = 0, timeCoverage = 0;
+    unsigned long timeAll = 0, timeSimplePath = 0;
+
+    /** We get an iterator over all nodes . */
+    char buffer[128];
+    sprintf(buffer, simplprogressFormat3, ++_nbECRemovalPasses);
+    ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem> *itNode; 
+    if (_firstNodeIteration )
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iterator(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " nodes on disk" << std::endl;
+    }
+    else
+    {
+        itNode = new ProgressGraphIteratorTemplate<Node,ProgressTimerAndSystem>(_graph.GraphType::iteratorCachedNodes(), buffer, _verbose);
+        if (_verbose)
+            std::cout << "iterating on " << itNode->size() << " cached nodes" << std::endl;
+    }
+
+    // parallel stuff: create a dispatcher ; support atomic operations
+    Dispatcher dispatcher (_nbCores);
+
+    // parallel stuff
+    NodesDeleter<Node,Edge,GraphType> nodesDeleter(_graph, nbNodes, _nbCores, _verbose);
+
+#ifdef SIMPLIFICATION_LAMBDAS 
+    dispatcher.iterate (itNode, [&] (Node& node) {
+#else
+    for (itNode->first(); !itNode->isDone(); itNode->next())
+    {
+        Node& node = itNode->item();
+#endif
+            TIME(auto start_thread_t=get_wtime());
+
+            if (_graph.isNodeDeleted(node)) { 
+#ifdef SIMPLIFICATION_LAMBDAS
+            return; 
+#else
+            continue;
+#endif
+            }
+
+            unsigned inDegree = _graph.indegree(node), outDegree = _graph.outdegree(node);
+
+            /* ec nodes have out/in degree of 1 or more on one side, and of 2 or more on the other */
+            if (!((inDegree >= 1 && outDegree > 1 ) || (inDegree > 1 && outDegree >=1 )))
+            {
+#ifdef SIMPLIFICATION_LAMBDAS
+            return; 
+#else
+            continue;
+#endif
+            }
+
+                /* at this point, "node" is a node such that:
+                 *
+                 *            /                  \
+                 *           /                    \
+                 *---- [node] -----     or  -------[node]-----
+                 * so it's the potential node right before an EC. 
+                 */
+
+            // need to search in both directions
+            for (Direction dir=DIR_OUTCOMING; dir<DIR_END; dir = (Direction)((int)dir + 1) )
+            {
+                if ((outDegree >= 2 && dir == DIR_OUTCOMING) || (inDegree >= 2 && dir == DIR_INCOMING))
+                {  
+                    DEBUG_EC(cout << endl << "putative EC node: " << _graph.toString (node) << endl);
+                    __sync_fetch_and_add(&nbECCandidates,1);
+
+                    /** We follow the outcoming simple paths 
+                     * (so, if it's outdegree 2, we follow them to get their length and last neighbor */
+                    GraphVector<Edge> neighbors = _graph.neighborsEdge(node, dir);
+
+                    assert(neighbors.size() > 1);
+
+                    // do everying for each possible short simple path that is neighbor of that node
+                    for (unsigned int i = 0; i < neighbors.size(); i++)
+                    {
+                        if (_graph.isNodeDeleted(neighbors[i].to)) { 
+                            continue;}
+
+                        /* at this point, neighbors[i].to is the first node of an EC, maybe. */
+                         
+                        /* explore the simple path from that node */
+                        TIME(auto start_simplepath_t=get_wtime());
+                        Node&     simplePathStart = neighbors[i].to;
+                        Direction simplePathDir   = dir;
+                        unsigned int pathLen = _graph.simplePathLength(simplePathStart,simplePathDir);
+                        TIME(auto end_simplepath_t=get_wtime());
+                        TIME(__sync_fetch_and_add(&timeSimplePath, diff_wtime(start_simplepath_t,end_simplepath_t)));
+
+                        DEBUG_EC(cout << endl << "neighbors " << i+1 << "/" << neighbors.size() << " from: " << _graph.toString (neighbors[i].to) << " dir: " << DIR2STR(dir) << endl);
+                        bool isShort = true;
+                        
+                        if (k + pathLen >= maxECLength) // "k +" is to take into account that's we're actually traversing a path of extensions from "node"
+                        {
+                            __sync_fetch_and_add(&nbLongSimplePaths, 1);
+                            isShort = false;
+                        }
+
+                        __sync_fetch_and_add(&nbSimplePaths, 1);
+
+                        if ((!isShort) || pathLen == 0) // can't do much if it's pathLen=0, we don't support edge removal, only node removal
+                        {
+                            DEBUG_EC(cout << "direction: " << DIR2STR(dir) << ", not an EC: isShort: " << isShort << " pathLen: " << pathLen << endl);
+                            continue;
+                        }
+
+                        __sync_fetch_and_add(&nbShortSimplePaths, 1);
+            
+                        Node lastNode           = _graph.simplePathLastNode     (simplePathStart,simplePathDir);
+                        double pathMeanAbundance = _graph.simplePathMeanAbundance(simplePathStart,simplePathDir);
+
+                        GraphVector<Edge> outneighbors = _graph.neighborsEdge(lastNode, dir);
+                        DEBUG_EC(cout << "last simple path node: "<< _graph.toString(lastNode) << " has " << outneighbors.size() << " outneighbors; mean abundance: " << pathMeanAbundance << endl);
+
+                        if (outneighbors.size() == 0) // might still be a tip, unremoved for some reason
+                            continue;
+
+                        Node endNode = outneighbors[0].to;
+                        DEBUG_EC(cout << "endNode: " << _graph.toString(endNode) << endl);
+
+                        // at this point, the last node in "nodes" is the last node of a potential EC, and endNode is hopefully a branching node right after.
+                        // check if it's connected to something that has in-branching and also an out neighbor. 
+                        bool isDoublyConnected = (dir==DIR_OUTCOMING && _graph.indegree(endNode) > 1 && _graph.outdegree(endNode) >= 1) || \
+                                                 (dir==DIR_INCOMING && _graph.outdegree(endNode) > 1 && _graph.indegree(endNode) >= 1 );
+
+
+                        bool isTopologicalEC = isDoublyConnected;
+
+                        DEBUG_EC(cout << "direction: " << DIR2STR(dir) << ", pathlen: " << pathLen << " last node neighbors size: " << _graph.neighborsEdge(lastNode).size() << " indegree outdegree: " <<_graph.indegree(node) << " " << _graph.outdegree(node) << " isDoublyConnected: " << isDoublyConnected << " isTopoEC: " << isTopologicalEC << endl);
+
+
+                        if (isTopologicalEC)
+                        {
+                            __sync_fetch_and_add(&nbTopologicalEC,1);
+                            TIME(auto start_ec_coverage_t=get_wtime());
+                            bool isRCTC = this->satisfyRCTC(pathMeanAbundance, lastNode, RCTCcutoff, dir);
+
+                            isRCTC |= this->satisfyRCTC(pathMeanAbundance, neighbors[i].to, RCTCcutoff, reverse(dir)); // also check in the other direction
+                            // TODO think hard, is it a |= or a &=? FIXME for potential misassemblies
+                            
+                            TIME(auto end_ec_coverage_t=get_wtime());
+                            TIME(__sync_fetch_and_add(&timeCoverage, diff_wtime(start_ec_coverage_t,end_ec_coverage_t)));
+
+                            bool isEC = isRCTC;
+                        
+                            DEBUG_EC(cout << "isRCTC:" << isRCTC << endl);
+
+                            TIME(auto start_ec_processing_t=get_wtime());
+
+                            if (isEC)
+                            {
+                                if (nodesDeleter.get(simplePathStart))
+                                {
+                                    // not double-counting that delete
+                                }
+                                else
+                                {
+                                    // delete it
+                                    //
+                                    _graph.simplePathDelete(simplePathStart, simplePathDir, nodesDeleter);
+                                    DEBUG_EC(cout << endl << "EC of length " << pathLen << " FOUND: " <<  _graph.toString (node) << endl);
+
+                                    __sync_fetch_and_add(&nbECRemoved, 1);
+                                }
+
+                            }
+                            TIME(auto end_ec_processing_t=get_wtime());
+                            TIME(__sync_fetch_and_add(&timeProcessing, diff_wtime(start_ec_processing_t,end_ec_processing_t)));
+                        }
+                    }
+                }
+            }
+            TIME(auto end_thread_t=get_wtime());
+            TIME(__sync_fetch_and_add(&timeAll, diff_wtime(start_thread_t,end_thread_t)));
+
+#ifdef SIMPLIFICATION_LAMBDAS
+            }); // parallel
+#else
+}
+#endif
+
+    TIME(auto start_nodesdel_t=get_wtime());
+
+    nodesDeleter.flush();
+
+    TIME(auto end_nodesdel_t=get_wtime()); 
+    TIME(__sync_fetch_and_add(&timeDelete, diff_wtime(start_nodesdel_t,end_nodesdel_t)));
+
+    if (_verbose)
+    {
+        cout << nbECRemoved << " erroneous connections removed. " << endl;
+        cout << nbECCandidates << " EC candidates passed degree check. " << endl;
+        cout << nbSimplePaths << "/" << nbLongSimplePaths << "+" <<nbShortSimplePaths << " any=long+short simple path examined across all threads" << endl;
+        cout << nbTopologicalEC << " topological ECs. " << endl;
+        double unit = 1000000000;
+        cout.setf(ios_base::fixed);
+        cout.precision(1);
+        TIME(cout << "EC Timings: " << timeAll / unit << " CPUsecs total, including"<< endl);
+        TIME(cout << "                " << timeSimplePath / unit << " CPUsecs EC simple paths" << endl);
+        TIME(cout << "                " << timeCoverage / unit << " CPUsecs EC coverage test" << endl);
+        TIME(cout << "                " << timeProcessing / unit << " CPUsecs EC processing" << endl);
+        TIME(cout << "Nodes deletion: " << timeDelete / unit << " CPUsecs." << endl);
+    }
+
+    return nbECRemoved;
+}
+
+// instantiation
+template class Simplifications<Graph, Node, Edge>; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
diff --git a/gatb-core/src/gatb/debruijn/impl/Simplifications.hpp b/gatb-core/src/gatb/debruijn/impl/Simplifications.hpp
new file mode 100644
index 0000000..2cf942d
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Simplifications.hpp
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, D.Lavenier, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_GRAPH_SIMPLIFICATION_HPP_
+#define _GATB_GRAPH_SIMPLIFICATION_HPP_
+
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <vector>
+#include <set>
+#include <string>
+
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+/** */
+template<typename GraphType, typename Node, typename Edge>
+class Simplifications : public system::SmartPointer
+{
+public:
+
+    Simplifications (/*const, removed because of cacheNonSimpleNodes calling a setStats */ GraphType & graph, int nbCores, bool verbose = false);
+
+    void simplify(); // perform many rounds of all simplifications, as in Minia
+
+    unsigned long removeTips();
+    unsigned long removeBulges();
+    unsigned long removeErroneousConnections();
+
+    double getSimplePathCoverage(Node node, Direction dir, unsigned int* pathLen = NULL, unsigned int maxLength = 0);
+    double getMeanAbundanceOfNeighbors(Node& branchingNode, Node nodeToExclude);
+    bool satisfyRCTC(double pathAbundance, Node& lastTipNode, double RCTCcutoff, Direction dir);
+
+    int _nbTipRemovalPasses;
+    int _nbBubbleRemovalPasses;
+    int _nbBulgeRemovalPasses;
+    int _nbECRemovalPasses;
+    
+    std::string tipRemoval, bubbleRemoval, ECRemoval;
+    bool _doTipRemoval, _doBulgeRemoval, _doECRemoval;
+   
+    /* now exposing some parameters */
+    double _tipLen_Topo_kMult;
+    double _tipLen_RCTC_kMult;
+    double _tipRCTCcutoff;
+
+    double       _bulgeLen_kMult;
+    unsigned int _bulgeLen_kAdd;
+    unsigned int _bulgeAltPath_kAdd;
+    unsigned int _bulgeAltPath_covMult;
+
+    double _ecLen_kMult;
+    double _ecRCTCcutoff;
+
+protected:
+    /*const*/ GraphType &  _graph;
+    int _nbCores;
+    uint64_t nbNodes;
+    uint64_t cutoffEvents;
+
+    bool _firstNodeIteration;
+    bool _verbose;
+
+    std::string path2string(Direction dir, Path_t<Node> p, Node endNode);
+    double path2abundance(Direction dir, Path_t<Node> p, Node endNode, unsigned int skip_first = 0, unsigned int skip_last = 0);
+
+    void heuristic_most_covered_path(Direction dir, Node& startingNode, Node& endingNode, 
+                                    int traversal_depth, int& success, double& mean_abundance,
+                                    Path_t<Node> &res_path,
+                                    unsigned int backtrackingLimit = 0, Node *avoidFirstNode = NULL /*nullptr ideally, but want old gcc compatibility at least for headers*/,
+                                    bool most_covered = true, bool kmer_version = false);
+    // kmer version
+    void heuristic_most_covered_path_old(Direction dir, Node& startingNode, Node& endingNode, 
+                                    int traversal_depth, Path_t<Node>& current_path, std::set<Node>& usedNode, int& success, std::vector<int>& abundances,
+                                    unsigned int backtrackingLimit, Node *avoidFirstNode, 
+                                    bool most_covered, Path_t<Node> &res_path,
+                                    unsigned long &nbCalls);
+    // in-between version, towards unitigs
+    void heuristic_most_covered_path(Direction dir, Node& startingNode, Node& endNode, 
+                                    int traversal_depth, Path_t<Node>& current_path, std::set<Node>& usedNode, int& success, double& mean_abundance,
+                                    unsigned int backtrackingLimit, Node *avoidFirstNode, 
+                                    bool most_covered, Path_t<Node> &res_path,
+                                    unsigned long &nbCalls);
+    // true unitigs version
+    void heuristic_most_covered_path_unitigs(Direction dir, Node& startingNode, Node& endNode, 
+                                    int traversal_depth, std::set<Node>& usedNode, int& success, std::vector<int>& unitigs_lengths, std::vector<int>& unitigs_abundances, double& mean_abundance,
+                                    unsigned int backtrackingLimit, Node *avoidFirstNode, 
+                                    bool most_covered, unsigned long &nbCalls);
+
+
+
+    std::vector<bool> interestingNodes;
+};
+
+/********************************************************************************/
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif 
+
diff --git a/gatb-core/src/gatb/debruijn/impl/Terminator.cpp b/gatb-core/src/gatb/debruijn/impl/Terminator.cpp
new file mode 100644
index 0000000..b74cda4
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Terminator.cpp
@@ -0,0 +1,339 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+// We include required definitions
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Terminator.hpp>
+
+#include <cassert>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+#define DEBUG(a)   //a
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+BranchingTerminatorTemplate<Node,Edge,Graph>::BranchingTerminatorTemplate (const Graph& graph)
+    : TerminatorTemplate<Node,Edge,Graph> (graph)
+{
+    /** We loop over the branching nodes. */
+    GraphIterator<BranchingNode_t<Node> > itBranching = this->_graph.Graph::template iteratorBranching();
+    for (itBranching.first(); !itBranching.isDone(); itBranching.next())
+    {
+        /** We add the current branching node into the map. */
+        branching_kmers.insert (itBranching.item().kmer);
+    }
+
+    /** We finalize the map. We don't sort because branching are already sorted in the graph file. */
+    branching_kmers.finalize (false);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+BranchingTerminatorTemplate<Node,Edge,Graph>::BranchingTerminatorTemplate (const BranchingTerminatorTemplate& terminator)
+	: TerminatorTemplate<Node,Edge,Graph>(terminator._graph), branching_kmers (terminator.branching_kmers)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+BranchingTerminatorTemplate<Node,Edge,Graph>::~BranchingTerminatorTemplate()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool BranchingTerminatorTemplate<Node,Edge,Graph>::is_branching (Node& node) const
+{
+    return this->_graph.isBranching (node);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+int BranchingTerminatorTemplate<Node,Edge,Graph>::getDelta (Edge& edge) const
+{
+         if (edge.direction == DIR_OUTCOMING && edge.from.strand == kmer::STRAND_FORWARD)  { return 0; }
+    else if (edge.direction == DIR_OUTCOMING && edge.from.strand == kmer::STRAND_REVCOMP)  { return 4; }
+    else if (edge.direction == DIR_INCOMING  && edge.from.strand == kmer::STRAND_FORWARD)  { return 4; }
+    else if (edge.direction == DIR_INCOMING  && edge.from.strand == kmer::STRAND_REVCOMP)  { return 0; }
+    else { return -1; }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+void BranchingTerminatorTemplate<Node,Edge,Graph>::mark (Edge& edge)
+{
+    // BranchingTerminator ignores non-branching kmers
+    if (!is_indexed (edge.from))  {   return;  }
+
+    Value val=0;
+    branching_kmers.get (edge.from.kmer, val);
+
+    int delta = getDelta (edge);
+    if (delta >= 0)
+    {
+        // set a 1 at the right NT & strand position
+        val |= 1 << (edge.nt + delta);
+
+        branching_kmers.set (edge.from.kmer,val); //was insert for Hash16
+    }
+
+    assert (is_marked(edge) == true);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool BranchingTerminatorTemplate<Node,Edge,Graph>::is_marked (Edge& edge)  const
+{
+    Value val = 0;
+    int is_present = branching_kmers.get (edge.from.kmer, val);
+
+    if (!is_present)  {   return false;  }
+
+    int extension_nucleotide_marked = 0;
+
+    int delta = getDelta (edge);
+    if (delta >= 0)
+    {
+        // set a 1 at the right NT & strand position
+        extension_nucleotide_marked = (val>>(edge.nt+delta))&1;
+    }
+
+    return  extension_nucleotide_marked == 1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+void BranchingTerminatorTemplate<Node,Edge,Graph>::mark (Node& node)
+{
+    bool could_mark = false;
+
+    // if it is a branching kmer, mark it directly (it may have no branching neighbor)
+    if (is_indexed(node))
+    {
+        Value val = 0;
+        branching_kmers.get (node.kmer, val);
+        branching_kmers.set (node.kmer, val|(1<<8));
+        could_mark = true;
+    }
+
+    /** We loop the neighbors edges of the current node. */
+    GraphVector<Edge> neighbors = this->_graph.template neighborsEdge(node.kmer);
+
+    /** We loop the branching neighbors. */
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& e = neighbors[i];
+
+        if (is_indexed(e.to)==false)  { continue; }
+
+        /** We mark this edge (reversed first, in order to have the branching as the 'from' node) */
+        Edge rev_e = this->_graph.reverse(e);
+        mark (rev_e);
+
+        could_mark = true;
+    }
+
+    if (could_mark)  {   assert(is_marked(node) == true);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool BranchingTerminatorTemplate<Node,Edge,Graph>::is_marked (Node& node) const
+{
+    // if it is a branching kmer, read marking directly (it may have no branching neighbor)
+    if (is_indexed(node))  {   return is_marked_branching(node);  }
+
+    /** We loop the neighbors edges of the current node. */
+    GraphVector<Edge> neighbors = this->_graph.neighborsEdge (node.kmer);
+
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& e = neighbors[i];
+
+        if  (is_indexed(e.to)==false)  { continue; }
+
+        Edge rev_e = this->_graph.reverse(e);
+        if (is_marked (rev_e) == true)  {  return true;  }
+    }
+
+    return false;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool BranchingTerminatorTemplate<Node,Edge,Graph>::is_marked_branching (Node& node) const
+{
+    Value val = 0;
+    branching_kmers.get (node.kmer, val);
+    return (val&(1<<8)) != 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+void BranchingTerminatorTemplate<Node,Edge,Graph>::reset()
+{
+    branching_kmers.clear();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool BranchingTerminatorTemplate<Node,Edge,Graph>::is_indexed (Node& node) const
+{
+    return branching_kmers.contains (node.kmer);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+void BranchingTerminatorTemplate<Node,Edge,Graph>::dump ()
+{
+}
+
+
+/***********************/
+
+template <typename Node, typename Edge, typename Graph>
+bool MPHFTerminatorTemplate<Node,Edge,Graph>::is_marked (Node& node) const
+{
+    int status = this->_graph.queryNodeState(node);
+    return (status & 1) == 1;
+}
+
+template <typename Node, typename Edge, typename Graph>
+void MPHFTerminatorTemplate<Node,Edge,Graph>::mark (Node& node) 
+{
+    int state = this->_graph.queryNodeState(node);
+    state |= 1;
+    this->_graph.setNodeState(node, state);
+}
+
+template <typename Node, typename Edge, typename Graph>
+void MPHFTerminatorTemplate<Node,Edge,Graph>::reset() 
+{
+    this->_graph.resetNodeState();
+}
+
+// instantiation of GATB legacy compatibility 
+template class MPHFTerminatorTemplate<Node, Edge, Graph>; 
+template class BranchingTerminatorTemplate<Node, Edge, Graph>; 
+template class TerminatorTemplate<Node, Edge, Graph>; 
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/Terminator.hpp b/gatb-core/src/gatb/debruijn/impl/Terminator.hpp
new file mode 100644
index 0000000..3b4d508
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Terminator.hpp
@@ -0,0 +1,326 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_TOOLS_TERMINATOR_HPP_
+#define _GATB_TOOLS_TERMINATOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <vector>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Interface that allows to mark certain nodes in a graph. Note: It is on the verge of becoming deprecated.
+ *
+ * In short: don't use it. Use the MPHF.
+ *
+ * This is a legacy class that was used when the graph did not have a MPHF.
+ * I.e. in Minia version 1.
+ * Back then, it was not possible to directly tag nodes inside the graph structure.
+ * So this Terminator class uses an external data structure to mark some of 
+ * the nodes (specifically, the branching nodes). It was used during graph traversal 
+ * for instance.
+ *
+ * The Terminator interface provides such a service. It is often used
+ * by the \ref Traversal class during its traversing process.
+ *
+ * The name Terminator is just related to termination, we needed a way to ensure that we don't traverse
+ * the same contig twice, so that the algorithm terminates eventually.
+ */
+
+template <typename Node, typename Edge, typename Graph>
+class TerminatorTemplate : public system::SmartPointer
+{
+public:
+
+    /** Constructor
+     * \param[in] graph : the graph */
+    TerminatorTemplate (const Graph& graph) : _graph(graph)  {}
+
+    /** Destructor. */
+    virtual ~TerminatorTemplate ()  {}
+
+    /** Get the graph.
+     * \return the graph. */
+    const Graph& getGraph() const { return _graph; }
+
+    /** Tells whether marking nodes is allowed or not
+     * \return true if marking nodes is allowed, false otherwise. */
+    virtual bool isEnabled () const { return true; }
+
+    /** Mark the provided edge
+     * \param[in] edge : edge to be marked. */
+    virtual void mark      (Edge& edge) = 0;
+
+    /** Tells whether an edge is marked
+     * \param[in] edge : edge to be checked
+     * \return true if the edge is marked, false otherwise
+     */
+    virtual bool is_marked (Edge& edge)  const = 0;
+
+    /** Mark the provided node.
+     * \param[in] node : node to be marked. */
+    virtual void mark      (Node& node) = 0;
+
+    /** Tells whether a node is marked
+     * \param[in] node : node to be checked
+     * \return true if the node is marked, false otherwise
+     */
+    virtual bool is_marked (Node& node)  const = 0;
+
+    /** Tells whether a branching node is marked
+     * \param[in] node : node to be checked
+     * \return true if the node is marked, false otherwise
+     */
+    virtual bool is_marked_branching (Node& node) const = 0;
+
+    /** Tells whether a node is branching
+     * \param[in] node : node to be checked
+     * \return true if the node is branching, false otherwise.
+     */
+    virtual bool is_branching (Node& node) const = 0;
+
+    /** Reset the current marked nodes/edges. */
+    virtual void reset () = 0;
+
+    /** Dump (for debug purpose). */
+    virtual void dump () = 0;
+
+protected:
+
+    const Graph& _graph;
+};
+
+/********************************************************************************/
+
+/** \brief Null implementation of Terminator.
+ *
+ * This class provides a null implementation, which means that no marks are done.
+ */
+template <typename Node, typename Edge, typename Graph>
+class NullTerminatorTemplate :  public TerminatorTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Singleton method.
+     * \return a singleton instance.
+     */
+    static TerminatorTemplate<Node,Edge,Graph>& singleton()
+    {
+        static Graph dummy;
+        static NullTerminatorTemplate instance(dummy); return instance;
+    }
+
+    /** \copydoc Terminator::isEnabled */
+    virtual bool isEnabled () const { return false; }
+
+    /** \copydoc Terminator::mark */
+    virtual void mark      (Edge& edge) {}
+
+    /** \copydoc Terminator::is_marked */
+    virtual bool is_marked (Edge& edge)  const  { return false; };
+
+    /** \copydoc Terminator::mark(const gatb::core::debruijn::impl::Node&)  */
+    virtual void mark      (Node& node) {}
+
+    /** \copydoc Terminator::is_marked(const gatb::core::debruijn::impl::Node&) const */
+    virtual bool is_marked (Node& node)  const  { return false; }
+
+    /** \copydoc Terminator::is_marked_branching */
+    virtual bool is_marked_branching (Node& node) const { return false; }
+
+    /** \copydoc Terminator::is_branching */
+    virtual bool is_branching (Node& node) const { return false; }
+
+    /** \copydoc Terminator::reset */
+    virtual void reset () {}
+
+    /** \copydoc Terminator::dump */
+    virtual void dump () {}
+
+//private:
+
+    NullTerminatorTemplate (const Graph& graph) : TerminatorTemplate<Node,Edge,Graph>(graph)  {}
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of Terminator that marks branching nodes.
+ */
+template <typename Node, typename Edge, typename Graph>
+class BranchingTerminatorTemplate :  public TerminatorTemplate<Node,Edge,Graph>
+{
+public:
+
+    typedef unsigned short int  Value;
+
+    /** Constructor
+     * \param[in] graph : the graph */
+    BranchingTerminatorTemplate (const Graph& graph);
+
+    /** Copy constructor
+     * \param[in] terminator: the graph */
+    BranchingTerminatorTemplate (const BranchingTerminatorTemplate& terminator);
+
+    /** Destructor. */
+    ~BranchingTerminatorTemplate();
+
+    /** \copydoc Terminator::mark */
+    void mark      (Edge& edge);
+
+    /** \copydoc Terminator::is_marked */
+    bool is_marked (Edge& edge)  const;
+
+    /** \copydoc Terminator::mark(const gatb::core::debruijn::impl::Node&)  */
+    void mark      (Node& node);
+
+    /** \copydoc Terminator::is_marked(const gatb::core::debruijn::impl::Node&) const */
+    bool is_marked (Node& node) const ;
+
+    /** \copydoc Terminator::is_marked_branching */
+    bool is_marked_branching (Node& node) const ;
+
+    /** \copydoc Terminator::is_branching */
+    bool is_branching (Node& node) const ;
+
+    /** \copydoc Terminator::reset */
+    void reset();
+
+    /** \copydoc Terminator::dump */
+    void dump ();
+
+private:
+
+    /* Custom implementation of a map.
+     * IMPORTANT : The keys set is supposed to be built only by one instance and is shared
+     * with other instances through the copy constructor.
+     */
+    template <typename Key, typename Value>  class AssocSet
+    {
+    public:
+
+        AssocSet () : isRef(false)  {  keys = new std::vector<Key>();  }
+
+        AssocSet (const AssocSet& other) : isRef(true)
+        {
+        	keys = other.keys;
+            liste_value.assign(this->keys->size(),0);
+        }
+
+        ~AssocSet ()  {  if (isRef==false)  { delete keys; }  }
+
+    	void insert (const Key& elem) { keys->push_back(elem); }
+
+        bool contains(const Key& elem)  const  {  return binary_search(keys->begin(), keys->end(), elem);  }
+
+        int get (const Key& elem, Value& val) const
+        {
+            typename std::vector<Key>::const_iterator it;
+            it = lower_bound(this->keys->begin(), this->keys->end(),elem);
+            if (it == this->keys->end() || elem != *it) return 0;
+            size_t rank = it - this->keys->begin();
+            val = liste_value[rank];
+            return 1;
+        }
+
+        int set (const Key& elem, const Value& val)
+        {
+            typename  std::vector<Key>::iterator it;
+            it = lower_bound(this->keys->begin(), this->keys->end(),elem);
+            if (it == this->keys->end() ||elem != *it) return 0;
+            size_t rank = it - this->keys->begin();
+            liste_value[rank]=val;
+            return 1;
+        }
+
+        void finalize (bool doSort=true)
+        {
+            if (doSort) {  sort(this->keys->begin(), this->keys->end());  }
+            liste_value.assign(this->keys->size(),0);
+        }
+
+        void clear()  { liste_value.assign(liste_value.size(),0); }
+
+    private:
+        std::vector<Key>*  keys;
+        std::vector<Value> liste_value;
+        bool isRef;
+    };
+
+
+    bool is_indexed (Node& node) const ;
+
+    AssocSet<typename Node::Value, Value> branching_kmers;
+
+    int getDelta (Edge& edge) const;
+};
+
+
+/** \brief MPHF implementation of Terminator.
+ *
+ */
+template <typename Node, typename Edge, typename Graph>
+class MPHFTerminatorTemplate :  public TerminatorTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** \copydoc Terminator::mark */
+    virtual void mark      (Edge& edge)  { printf("not expecting a call to MPHFTermiantor.mark(edge)\n"); exit(1); }
+
+    /** \copydoc Terminator::is_marked */
+    virtual bool is_marked (Edge& edge)  const  { printf("not expecting a call to MPHFTermiantor.is_marked(edge)\n"); exit(1); return false; }
+
+    /** \copydoc Terminator::mark(const gatb::core::debruijn::impl::Node&)  */
+    virtual void mark      (Node& node);
+
+    /** \copydoc Terminator::is_marked(const gatb::core::debruijn::impl::Node&) const */
+    virtual bool is_marked (Node& node)  const  ;
+
+    /** \copydoc Terminator::is_marked_branching */
+    virtual bool is_marked_branching (Node& node) const { printf("not expecting a call to MPHFTermiantor.is_marked_branching\n"); exit(1); return false; }
+
+    /** \copydoc Terminator::is_branching */
+    virtual bool is_branching (Node& node) const { printf("not expecting a call to MPHFTermiantor.is_branching\n"); exit(1);return false; }
+
+    /** \copydoc Terminator::reset */
+    virtual void reset ();
+
+    /** \copydoc Terminator::dump */
+    virtual void dump () { printf("not expecting a call to MPHFTermiantor.dump\n"); exit(1); };
+
+    MPHFTerminatorTemplate (const Graph& graph) : TerminatorTemplate<Node,Edge,Graph>(graph)  {}
+};
+
+typedef TerminatorTemplate<Node, Edge, Graph> Terminator; 
+typedef MPHFTerminatorTemplate<Node, Edge, Graph> MPHFTerminator; 
+typedef BranchingTerminatorTemplate<Node, Edge, Graph> BranchingTerminator; 
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_TOOLS_TERMINATOR_HPP_ */
+
diff --git a/gatb-core/src/gatb/debruijn/impl/Traversal.cpp b/gatb-core/src/gatb/debruijn/impl/Traversal.cpp
new file mode 100644
index 0000000..a1d74e4
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Traversal.cpp
@@ -0,0 +1,859 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+
+#include <gatb/debruijn/impl/Traversal.hpp>
+#include <gatb/debruijn/impl/Frontline.hpp>
+
+using namespace std;
+using namespace gatb::core::tools::misc;
+
+/********************************************************************************/
+namespace gatb {  namespace core {  namespace debruijn {  namespace impl {
+/********************************************************************************/
+
+/********************************************************************************/
+#define DEBUG(a)   //a
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+TraversalTemplate<Node,Edge,Graph>* TraversalTemplate<Node,Edge,Graph>::create (
+    TraversalKind   type,
+    const Graph&    graph,
+    TerminatorTemplate<Node,Edge,Graph>&     terminator,
+    int             max_len,
+    int             max_depth,
+    int             max_breadth
+)
+{
+    TraversalTemplate<Node,Edge,Graph>* result = 0;
+
+         if (type == TRAVERSAL_UNITIG)  { result = new SimplePathsTraversalTemplate<Node,Edge,Graph> (graph, terminator, max_len, max_depth, max_breadth); }
+    else if (type == TRAVERSAL_CONTIG)  { result = new MonumentTraversalTemplate<Node,Edge,Graph>    (graph, terminator, max_len, max_depth, max_breadth); }
+    else if (type == TRAVERSAL_NONE)    { result = new NullTraversalTemplate<Node,Edge,Graph>        (graph, terminator, max_len, max_depth, max_breadth); }
+    else                                { result = new MonumentTraversalTemplate<Node,Edge,Graph>    (graph, terminator, max_len, max_depth, max_breadth); }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+TraversalTemplate<Node,Edge,Graph>* TraversalTemplate<Node,Edge,Graph>::create (
+    const std::string&  type,
+    const Graph&        graph,
+    TerminatorTemplate<Node,Edge,Graph>&         terminator,
+    int                 max_len,
+    int                 max_depth,
+    int                 max_breadth
+)
+{
+    TraversalKind typeEnum;  parse (type, typeEnum);
+
+    return create (typeEnum, graph, terminator, max_len, max_depth, max_breadth);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+TraversalTemplate<Node,Edge,Graph>::TraversalTemplate (
+    const Graph& graph,
+    TerminatorTemplate<Node,Edge,Graph>& terminator,
+    int max_len,
+    int max_depth,
+    int max_breadth
+)
+    : final_stats(TraversalStats()), stats(TraversalStats()),
+      graph(graph), terminator(terminator),
+      maxlen      (max_len     == 0 ? TraversalTemplate<Node,Edge,Graph>::defaultMaxLen     : max_len),
+      max_depth   (max_depth   == 0 ? TraversalTemplate<Node,Edge,Graph>::defaultMaxDepth   : max_depth),
+      max_breadth (max_breadth == 0 ? TraversalTemplate<Node,Edge,Graph>::defaultMaxBreadth : max_breadth)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+int TraversalTemplate<Node,Edge,Graph>::traverse (Node& startingNode, Node& currentNode, Direction dir, Path_t<Node>& consensus)
+{
+    currentNode = startingNode;
+    Node previousNode;
+
+    int nnt = 0;
+
+    bool looping = false;
+
+    Path_t<Node> path;  path.resize (this->max_depth+1);
+
+    int bubble_start=0, bubble_end=0;
+    bubbles_positions.clear();
+
+    /** We reset the consensus to be filled. */
+    consensus.clear ();
+
+    while( (nnt = avance (currentNode, dir, consensus.size() == 0, path, previousNode)))
+    {
+        // found branching or marked kmers
+        if (nnt < 0)  {   break;  }
+
+        if (nnt > 1)  {  bubble_start = consensus.size();  }
+
+        // keep re-walking the nucleotides we just discovered, to append to consensus and mark kmers as we go
+        for (int i = 0; i < nnt; i++)
+        {
+            /** We add the current nucleotide into the contig. */
+            consensus.push_back (path[i]);
+
+            /** We update previous and current nodes. */
+            previousNode = currentNode;
+
+            /** We compute the neighbor node for the current nucleotide of the path.
+             * WARNING: we 'build' here a node without checking that it belongs to the Debruijn graph, because
+             * the transition nucleotide has been got through a call to Graph::neighbors, and therefore it should
+             * be a trustable transition nucleotide. */
+            currentNode  = this->graph.neighbor (currentNode, dir, path[i]);
+
+            /** We mark the node as used in assembly. */
+            terminator.mark (currentNode);
+
+            /** perfectly circular regions with no large branching can happen (rarely) */
+            if (currentNode.kmer == startingNode.kmer)  {  looping = true;  }
+        }
+
+        if (nnt > 1)
+        {
+            bubble_end = consensus.size();
+            bubbles_positions.push_back(std::make_pair(bubble_start,bubble_end));
+        }         
+
+        if (looping)  {  break;  }
+
+        if ((int)consensus.size() > maxlen)  {  break;  }
+
+    }  /* end of while( (nnt = avance ... */
+
+    return consensus.size();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+float TraversalTemplate<Node,Edge,Graph>::needleman_wunch (const Path_t<Node>& a, const Path_t<Node>& b)
+{
+    float gap_score = -5;
+    float mismatch_score = -5;
+    float match_score = 10;
+    #define nw_score(x,y) ( (x == y) ? match_score : mismatch_score )
+
+    int n_a = a.size(), n_b = b.size();
+    float ** score =  (float **) MALLOC (sizeof(float*) * (n_a+1));
+    for (int ii=0; ii<(n_a+1); ii++)
+    {
+        score [ii] = (float *) MALLOC (sizeof(float) * (n_b+1));
+    }
+
+
+    for (int i = 0; i <= n_a; i++)
+        score[i][0] = gap_score * i;
+    for (int j = 0; j <= n_b; j++)
+        score[0][j] = gap_score * j;
+
+    // compute dp
+    for (int i = 1; i <= n_a; i++)
+    {
+        for (int j = 1; j <= n_b; j++)
+        {
+            float match = score[i - 1][j - 1] + nw_score(a[i-1],b[j-1]);
+            float del =  score[i - 1][j] + gap_score;
+            float insert = score[i][j - 1] + gap_score;
+            score[i][j] = max( max(match, del), insert);
+        }
+    }
+
+    // traceback
+    int i=n_a, j=n_b;
+    float identity = 0;
+    while (i > 0 && j > 0)
+    {
+        float score_current = score[i][j], score_diagonal = score[i-1][j-1], score_up = score[i][j-1], score_left = score[i-1][j];
+        if (score_current == score_diagonal + nw_score(a[i-1], b[j-1]))
+        {
+            if (a[i-1]== b[j-1])
+                identity++;
+            i -= 1;
+            j -= 1;
+        }
+        else
+        {
+            if (score_current == score_left + gap_score)
+                i -= 1;
+            else if (score_current == score_up + gap_score)
+                    j -= 1;
+        }
+    }
+    identity /= max( n_a, n_b); // modif GR 27/09/2013    max of two sizes, otherwise free gaps
+
+
+
+    for (int ii=0; ii<(n_a+1); ii++)
+    {
+        FREE (score [ii]);
+    }
+    FREE(score);
+
+    return identity;
+}
+
+/*********************************************************************
+            #     #  #     #  ###  #######  ###   #####
+            #     #  ##    #   #      #      #   #     #
+            #     #  # #   #   #      #      #   #
+            #     #  #  #  #   #      #      #   #  ####
+            #     #  #   # #   #      #      #   #     #
+            #     #  #    ##   #      #      #   #     #
+             #####   #     #  ###     #     ###   #####
+*********************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+SimplePathsTraversalTemplate<Node,Edge,Graph>::SimplePathsTraversalTemplate (
+    const Graph& graph,
+    TerminatorTemplate<Node,Edge,Graph>& terminator,
+    int maxlen,
+    int max_depth,
+    int max_breadth
+)
+    : TraversalTemplate<Node,Edge,Graph>(graph, terminator, maxlen, max_depth, max_breadth)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+char SimplePathsTraversalTemplate<Node,Edge,Graph>::avance (
+    Node& node,
+    Direction dir,
+    bool first_extension,
+    Path_t<Node>& path,
+    Node& previousNode
+)
+{
+    int res = this->graph.simplePathAvance (node, dir, path[0]);
+    this->deadend = false; // whether the traversal ends with no extension or not -- helps filter out isolated contigs in Minia
+    switch (res)
+    {
+        case -2:
+           this->stats.couldnt_inbranching++; break;
+        case -1:
+           this->stats.couldnt_outbranching++; break;
+        case 0:
+           this->stats.couldnt_no_extension++; 
+           this->deadend = true; break;
+    }
+
+    return  max (res,  0);
+}
+
+/*********************************************************************
+#     #  #######  #     #  #     #  #     #  #######  #     #  #######
+##   ##  #     #  ##    #  #     #  ##   ##  #        ##    #     #
+# # # #  #     #  # #   #  #     #  # # # #  #        # #   #     #
+#  #  #  #     #  #  #  #  #     #  #  #  #  #####    #  #  #     #
+#     #  #     #  #   # #  #     #  #     #  #        #   # #     #
+#     #  #     #  #    ##  #     #  #     #  #        #    ##     #
+#     #  #######  #     #   #####   #     #  #######  #     #     #
+*********************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+MonumentTraversalTemplate<Node,Edge,Graph>::MonumentTraversalTemplate (
+    const Graph& graph,
+    TerminatorTemplate<Node,Edge,Graph>& terminator,
+    int maxlen,
+    int max_depth,
+    int max_breadth
+)
+    : TraversalTemplate<Node,Edge,Graph>(graph, terminator, maxlen, max_depth, max_breadth)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+char MonumentTraversalTemplate<Node,Edge,Graph>::avance (
+    Node& node,
+    Direction dir,
+    bool first_extension,
+    Path_t<Node>& consensus,
+    Node& previousNode
+)
+{
+    // if we're on a simple path, just traverse it
+    int is_simple_path = this->graph.simplePathAvance (node, dir, consensus[0]);
+    if (is_simple_path > 0)  {  return 1;  }
+
+    // the following function does:
+    // * a bfs from the starting kmer, stopping when:
+    //      - breadth > max_breadth
+    //      or
+    //      - depth > max_depth
+    // * check if there a single end point
+    // * computing all possible paths between start and end
+    // * returns one flattened consensus sequence
+    bool success = explore_branching (node, dir, consensus, previousNode);
+    if (!success)
+    { 
+        this->stats.ended_traversals++;
+        return 0;
+    }
+
+    return consensus.size();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool MonumentTraversalTemplate<Node,Edge,Graph>::explore_branching (
+    Node& node,
+    Direction dir,
+    Path_t<Node>& consensus,
+    Node& previousNode
+)
+{
+    set<Node> all_involved_extensions;
+
+    return explore_branching (node, dir, consensus, previousNode, all_involved_extensions);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool MonumentTraversalTemplate<Node,Edge,Graph>::explore_branching (
+    Node& startNode,
+    Direction dir,
+    Path_t<Node>& consensus,
+    Node& previousNode,
+    std::set<Node>& all_involved_extensions
+)
+{
+    Node endNode;
+
+    // find end of branching, record all involved extensions (for future marking)
+    // it returns false iff it's a complex bubble
+    int traversal_depth = find_end_of_branching (dir, startNode, endNode, previousNode, all_involved_extensions);
+    if (!traversal_depth)  
+    {
+        this->stats.couldnt_find_all_consensuses++;
+        return false;
+    }
+
+    // find all consensuses between start node and end node
+    bool success;
+    set<Path_t<Node> > consensuses = all_consensuses_between (dir, startNode, endNode, traversal_depth+1, success);
+
+    // if consensus phase failed, stop
+    if (!success)  {  return false;  }
+
+    consensus.resize (0);
+    // validate paths, based on identity
+    bool validated = validate_consensuses (consensuses, consensus);
+    if (!validated)   
+    {  
+        this->stats.couldnt_validate_consensuses++;
+        return false;  
+    }
+
+    // the consensuses agree, mark all the involved extensions
+    // (corresponding to alternative paths we will never traverse again)
+    mark_extensions (all_involved_extensions);
+
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+//template <typename Frontline=FrontlineBranching> // TODO: someday do something along this line to refactor GraphSimplification in minia
+template <typename Node, typename Edge, typename Graph>
+int MonumentTraversalTemplate<Node,Edge,Graph>::find_end_of_branching (
+    Direction    dir,
+    Node&  startingNode,
+    Node&        endNode,
+    Node&  previousNode,
+    std::set<Node>& all_involved_extensions
+)
+{
+    /** We need a branching frontline. */
+    FrontlineBranchingTemplate<Node,Edge,Graph> frontline (dir, this->graph, this->terminator, startingNode, previousNode, &all_involved_extensions);
+
+    do  {
+        bool should_continue = frontline.go_next_depth();
+        if (!should_continue) 
+        {
+            if (frontline.stopped_reason == FrontlineTemplate<Node,Edge,Graph>::MARKED)
+                this->stats.couldnt_because_marked_kmer++;
+            if (frontline.stopped_reason == FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_DEPTH)
+                this->stats.couldnt_inbranching_depth++;
+            if (frontline.stopped_reason == FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_BREADTH)
+                this->stats.couldnt_inbranching_breadth++;
+            if (frontline.stopped_reason == FrontlineTemplate<Node,Edge,Graph>::IN_BRANCHING_OTHER)
+                this->stats.couldnt_inbranching_other++;
+            return 0;
+        }
+
+        // don't allow a depth too large
+        if ((int)frontline.depth() > this->max_depth)
+        {  
+            this->stats.couldnt_traverse_bubble_depth++;
+            return 0;  
+        }
+
+        // don't allow a breadth too large
+        if ((int)(frontline.size())> this->max_breadth)
+        {  
+            this->stats.couldnt_traverse_bubble_breadth++;
+            return 0;
+        }
+
+        // stopping condition: frontline is either empty, or contains only 1 kmer
+        // needs the kmer to be non-branching, in order to avoid a special case of bubble immediatly after a bubble
+        // affects mismatch rate in ecoli greatly
+        if (frontline.size() == 0)  
+        {
+            this->stats.couldnt_find_extension++;
+            return 0;
+        }
+
+         if (frontline.size() == 1) // longer contigs but for some reason, higher mismatch rate
+             {break;}
+            // TODO: didn't implement is_branching in MPHFTerminator, but the line above used to be commented and the one below enabled. see if it still affects assembly.
+        //if (frontline.size() == 1 &&   (!terminator.isEnabled() || !terminator.is_branching(frontline.front().node)) )  {   break;  }
+    }
+    while (1);
+
+    if (frontline.size()==1)
+    {
+        endNode = frontline.front().node;
+        return frontline.depth();
+    }
+
+   return 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+void MonumentTraversalTemplate<Node,Edge,Graph>::mark_extensions (std::set<Node>& extensions_to_mark)
+{
+    if (this->terminator.isEnabled())
+    {
+        for(typename std::set<Node>::iterator it = extensions_to_mark.begin(); it != extensions_to_mark.end() ; ++it)
+        {
+            Node node = *it; // need this, because terminator.mark will want to modify node to cache its mphf index, hence it cannot be const.
+            this->terminator.mark (node);
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+set<Path_t<Node> > MonumentTraversalTemplate<Node,Edge,Graph>::all_consensuses_between (
+    Direction    dir,
+    Node& startNode,
+    Node& endNode,
+    int traversal_depth,
+    std::set<typename Node::Value> usedNode,
+    Path_t<Node> current_consensus,
+    bool& success
+)
+{
+    set<Path_t<Node> > consensuses;
+
+    // find_end_of_branching and all_consensues_between do not always agree on clean bubbles ends
+    // until I can fix the problem, here is a fix
+    // to reproduce the problem: SRR001665.fasta 21 4
+    if (traversal_depth < -1)
+    {
+        success = false;
+        this->stats.couldnt_consensus_negative_depth++;
+        return consensuses;
+    }
+
+    if (startNode.kmer == endNode.kmer)// not testing for end_strand anymore because find_end_of_branching doesn't care about strands
+    {
+        consensuses.insert(current_consensus);
+        return consensuses;
+    }
+
+    /** We retrieve the neighbors of the provided node. */
+    GraphVector<Edge> neighbors = this->graph.neighborsEdge (startNode, dir);
+
+    /** We loop these neighbors. */
+    for (size_t i=0; i<neighbors.size(); i++)
+    {
+        /** Shortcut. */
+        Edge& edge = neighbors[i];
+
+        // don't resolve bubbles containing loops
+        // (tandem repeats make things more complicated)
+        // that's a job for a gapfiller
+        if (usedNode.find(edge.to.kmer) != usedNode.end())
+        {
+            success = false;
+            this->stats.couldnt_consensus_loop++;
+            return consensuses;
+        }
+
+        // generate extended consensus sequence
+        Path_t<Node> extended_consensus(current_consensus);
+        extended_consensus.push_back (edge.nt);
+
+        // generate list of used kmers (to prevent loops)
+        set<typename Node::Value> extended_kmers (usedNode);
+        extended_kmers.insert (edge.to.kmer);
+
+        // recursive call to all_consensuses_between
+        set<Path_t<Node> > new_consensuses = all_consensuses_between (
+            dir,
+            edge.to,
+            endNode,
+            traversal_depth - 1,
+            extended_kmers,
+            extended_consensus,
+            success
+        );
+
+        consensuses.insert (new_consensuses.begin(), new_consensuses.end());
+
+        // mark to stop we end up with too many consensuses
+        if (consensuses.size() > (unsigned int)this->max_breadth)  {
+            this->stats.couldnt_consensus_amount++;
+            success = false;  
+        }
+
+        // propagate the stop if too many consensuses reached
+        if (success == false)  {   return consensuses;  }
+    }
+
+    return consensuses;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+set<Path_t<Node> > MonumentTraversalTemplate<Node,Edge,Graph>::all_consensuses_between (
+    Direction    dir,
+    Node& startNode,
+    Node& endNode,
+    int traversal_depth,
+    bool &success
+)
+{
+    set<typename Node::Value> usedNode;
+    usedNode.insert(startNode.kmer);
+    Path_t<Node> current_consensus;
+    current_consensus.start = startNode;
+    success = true;
+
+    return all_consensuses_between (dir, startNode, endNode, traversal_depth, usedNode, current_consensus, success);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool MonumentTraversalTemplate<Node,Edge,Graph>::validate_consensuses (set<Path_t<Node> >& consensuses, Path_t<Node>& result)
+{
+    bool debug = false;
+    // compute mean and stdev of consensuses
+    int mean = 0;
+    int path_number = 0;
+    for(typename set<Path_t<Node> >::iterator it = consensuses.begin(); it != consensuses.end() ; ++it)
+    {
+        //if (debug)  printf("bubble path %d: %s (len=%lu)\n",path_number,(*it).c_str(),(*it).length());
+        mean+=(*it).size();
+        path_number++;
+    }
+    mean/=consensuses.size();
+    double stdev = 0;
+    for(typename set<Path_t<Node> >::iterator it = consensuses.begin(); it != consensuses.end() ; ++it)
+    {
+        int consensus_length = (*it).size();
+        stdev += pow(fabs(consensus_length-mean),2);
+    }
+    stdev = sqrt(stdev/consensuses.size());
+
+    // don't traverse large bubbles
+    if (mean > this->max_depth)
+    {
+        this->stats.couldnt_validate_bubble_mean_depth++;
+        return false;
+    }
+
+    // don't traverse large deadends (here, having one consensus means the other paths were large deadends)
+    if (consensuses.size() == 1 && mean > (int)(this->graph.getKmerSize())+1) // deadend length should be < k+1 (most have length 1, but have seen up to 10 in ecoli)
+    {
+        this->stats.couldnt_validate_bubble_deadend++;
+        return false;
+    }
+
+    if (debug) printf("%lu-bubble mean %d, stdev %.1f\n",consensuses.size(),mean,stdev);
+
+    // traverse bubbles if paths have roughly the same length
+    if (stdev>mean/5)
+    {
+        this->stats.couldnt_validate_bubble_stdev++;
+        return false;
+    }
+
+    // check that all consensuses are similar
+    if (! all_consensuses_almost_identical(consensuses))
+    {
+        this->stats.couldnt_validate_bubble_identity++;
+        return false;
+    }
+
+    // if all good, an arbitrary consensus is chosen (if no MPHF) or the most abundance one is chosen (if MPHF available)
+    bool has_mphf = this->graph.checkState(Graph::STATE_MPHF_DONE);
+
+    Path_t<Node> chosen_consensus;
+    if (has_mphf)
+        chosen_consensus = most_abundant_consensus(consensuses);
+    else
+        chosen_consensus = *consensuses.begin();
+
+    int result_length = chosen_consensus.size();
+    if  (result_length> this->max_depth) // it can happen that consensus is longer than max_depth, despite that we didn't explore that far (in a messy bubble with branchings inside)
+    {
+        this->stats.couldnt_validate_bubble_long_chosen++;
+        return false;
+    }
+
+    /** We the the result consensus. */
+    result = chosen_consensus;
+    return true;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+bool MonumentTraversalTemplate<Node,Edge,Graph>::all_consensuses_almost_identical (set<Path_t<Node> >& consensuses)
+{
+    for (typename set<Path_t<Node> >::iterator it_a = consensuses.begin(); it_a != consensuses.end(); it_a++)
+    {
+        typename set<Path_t<Node> >::iterator it_b = it_a;
+        std::advance(it_b,1);
+        while (it_b != consensuses.end())
+        {
+            int identity = this->needleman_wunch(*it_a,*it_b) * 100;
+            if (identity < consensuses_identity)
+            {
+                //cout << "couldn't pop bubble due to identity %:" << identity << " over length " << (*it_a).size() << " " << (*it_b).size() << endl;
+                return false;
+            }
+            std::advance(it_b,1);
+        }
+    }
+    return true;
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : might have a bug, see remark in there. need investigation.
+*********************************************************************/
+template <typename Node, typename Edge, typename Graph>
+Path_t<Node> MonumentTraversalTemplate<Node,Edge,Graph>::most_abundant_consensus(set<Path_t<Node> >& consensuses)
+{
+    Path_t<Node> res;
+    bool debug = false;
+
+    unsigned long best_mean_abundance = 0;
+    string best_p_str = "";
+
+    if (debug)
+        cout << endl << "starting to decide which consensus to choose" << endl;
+
+    for (typename set<Path_t<Node> >::iterator it = consensuses.begin(); it != consensuses.end(); it++)
+    {
+        // iterate over all kmers in consensus and get mean abundance
+        Path_t<Node> p = *it;
+
+        // FIXME: I think that code might be buggy!! (wrong p_str constructed in the bubble.fa example of Minia. see GraphSimplification.cpp for a potential fix)
+        // it might have to do with a previous DIR_INCOMING nt bug.
+
+        // naive conversion from path to string
+        string p_str = this->graph.toString(p.start);
+        for (size_t i = 0; i < p.size(); i++)
+            p_str.push_back(p.ascii(i));
+
+        if (debug)
+            cout << endl << "mean cov for path: " << p_str << endl << "abundance: " << endl;
+
+        unsigned long mean_abundance = 0;
+        for (size_t i = 0; i < p.size(); i++)
+        {            
+            Node node = this->graph.buildNode((char *)(p_str.c_str()), i); 
+            /* I know that buildNode was supposed to be used for test purpose only,
+             * but couldn't find anything else to transform my substring into a kmer */
+
+            unsigned char abundance = this->graph.queryAbundance(node);
+            mean_abundance += abundance;
+        
+            if (debug)
+                cout << (unsigned int)abundance << " ";
+        }
+        mean_abundance /= p.size();
+        
+        if (debug)
+            cout << "mean: " << mean_abundance << endl;
+
+        if (mean_abundance > best_mean_abundance)
+        {
+            best_mean_abundance = mean_abundance;
+            res = p;
+            best_p_str = p_str;
+        }
+
+    }
+
+    if (debug && consensuses.size() > 1)
+        cout << endl << "chosen path: " << best_p_str << " abundance: " << best_mean_abundance << endl;
+
+    return res;
+}
+
+// legacy GATB compatibility
+template class TraversalTemplate<Node, Edge, Graph>; 
+template class MonumentTraversalTemplate<Node, Edge, Graph>; 
+template class SimplePathsTraversalTemplate<Node, Edge, Graph>; 
+template class NullTraversalTemplate<Node, Edge, Graph>; 
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/Traversal.hpp b/gatb-core/src/gatb/debruijn/impl/Traversal.hpp
new file mode 100644
index 0000000..ce388b9
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/Traversal.hpp
@@ -0,0 +1,386 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_TOOLS_TRAVERSAL_HPP_
+#define _GATB_TOOLS_TRAVERSAL_HPP_
+
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <set>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+// some stats
+struct TraversalStats
+{
+    // MonumentTraversal
+    long ended_traversals;
+    long couldnt_find_all_consensuses;
+    long couldnt_validate_consensuses;
+    long couldnt_traverse_bubble_breadth;
+    long couldnt_traverse_bubble_depth;
+    long couldnt_because_marked_kmer;
+    long couldnt_inbranching_depth;
+    long couldnt_inbranching_breadth;
+    long couldnt_inbranching_other;
+    long couldnt_find_extension;
+    //find_all_consensuses failures:
+    long couldnt_consensus_negative_depth;
+    long couldnt_consensus_amount;
+    long couldnt_consensus_loop;
+    //validate_consensus potentials failures:
+    long couldnt_validate_bubble_mean_depth;
+    long couldnt_validate_bubble_stdev;
+    long couldnt_validate_bubble_deadend;
+    long couldnt_validate_bubble_identity;
+    long couldnt_validate_bubble_long_chosen;
+
+
+    //SimplepathTraversal
+    long couldnt_no_extension;
+    long couldnt_inbranching;
+    long couldnt_outbranching;
+};
+
+/********************************************************************************/
+
+/** \brief Class that traverse nodes of a Graph
+ *
+ * The Traversal class traverses the graph according to several criteria (think of contigs and unitigs). 
+ * 
+ * This is done through the 'traverse' method. As a result, one gets a Path object that
+ * holds the traversed path information.
+ * Typically, you start from a node in the graph, and you call traverse() from that node with a direction
+ * (forward or reverse). The function returns a path in the graph that corresponds to a sequence.
+ *
+ * There are two kinds of traversal:
+ *  - \ref tools::misc::TRAVERSAL_UNITIG : one gets only the non-branching paths in the graph
+ *  - \ref tools::misc::TRAVERSAL_CONTIG : one gets contigs, according to the method implemented in Minia version 1
+ *
+ *  More specifically, TRAVERSAL_CONTIG attempts to ignore tips and bubbles.
+ *  Note that this traversal isn't used in Minia versions 2 and 3 anymore. 
+ *  Since we can now simplify the graph, we just remove tips and bulge and then perform a TRAVERSAL_UNITIG in the
+ *  simplified graph.
+ *
+ *  But anyway, TRAVERSAL_CONTIG is still provided here, as it can be of independent interest. Say, if you want
+ *  to quickly create contigs in a targeted assembly scenario.
+ *
+ * A factory method \ref create is available and should be used by end users to instantiate
+ * this class.
+ *
+ * This class is abstract since it doesn't implement avance. It is subclassed according
+ * to the wanted kind of traversal.
+ *
+ * Example of use : we create a fake bank, build its graph and traverse the graph:
+ * \snippet traversal2.cpp  snippet1_traversal
+ *
+ */
+template <typename Node, typename Edge, typename Graph>
+class TraversalTemplate: public system::SmartPointer
+{
+public:
+
+    /** Factory method that creates an instance of Traversal
+     * \param[in] type : kind of traversal
+     * \param[in] graph : graph object to be traversed
+     * \param[in] terminator : object used to tag traversed nodes
+     * \param[in] max_len : maximum length of the traversal
+     * \param[in] max_depth : maximum depth of the traversal
+     * \param[in] max_breadth : maximum depth of the traversal
+     */
+    static TraversalTemplate<Node,Edge,Graph>* create (
+        tools::misc::TraversalKind  type,
+        const Graph&                graph,
+        TerminatorTemplate<Node,Edge,Graph>&                         terminator,
+        int                         max_len     = defaultMaxLen,
+        int                         max_depth   = defaultMaxDepth,
+        int                         max_breadth = defaultMaxBreadth
+    );
+
+    /** Factory method that creates an instance of Traversal
+     * \param[in] type : type of traversal
+     * \param[in] graph : graph object to be traversed
+     * \param[in] terminator : object used to tag traversed nodes
+     * \param[in] max_len : maximum length of the traversal
+     * \param[in] max_depth : maximum depth of the traversal
+     * \param[in] max_breadth : maximum depth of the traversal
+     */
+    static TraversalTemplate<Node,Edge,Graph>* create (
+        const std::string&  type,
+        const Graph&        graph,
+        TerminatorTemplate<Node,Edge,Graph>&                 terminator,
+        int                 max_len     = defaultMaxLen,
+        int                 max_depth   = defaultMaxDepth,
+        int                 max_breadth = defaultMaxBreadth
+    );
+
+    /** Get the name of the traversal.
+     * \return traversal name.  */
+    virtual std::string getName() const = 0;
+
+    /** Traverse the graph starting from one node for a given direction. As a result,
+     * one gets a Path object
+     * \param[in] node : starting node of the traversal.
+     * \param[in] dir :  direction of the traversal
+     * \param[out] resulting_sequence : path of the traversal */
+    int traverse (Node& node, Direction dir, Path_t<Node>& resulting_sequence)
+    {
+        Node endingNode;  return traverse (node, endingNode, dir, resulting_sequence);
+    }
+
+    /** Traverse the graph starting from one node for a given direction. As a result,
+     * one gets a Path object. We get also the last traversed node.
+     * \param[in] startingNode : starting node of the traversal.
+     * \param[out] endingNode : starting node of the traversal.
+     * \param[in] dir :  direction of the traversal
+     * \param[out] resulting_sequence : path of the traversal */
+    int traverse (Node& startingNode, Node& endingNode, Direction dir, Path_t<Node>& resulting_sequence);
+
+    /** Get the maximum allowed depth
+     * \return maximum depth */
+    unsigned int getMaxDepth() const  { return max_depth; };
+
+    /** Get the maximum allowed breadth
+     * \return maximum breadth */
+    unsigned int getMaxBreadth () const  { return max_breadth; };
+
+    static const int defaultMaxLen     = 10*1000*1000;
+    static const int defaultMaxDepth   = 500;
+    static const int defaultMaxBreadth = 20;
+
+    TraversalStats final_stats, stats;
+    void commit_stats() { final_stats = stats; }; // save current stats into final stats
+    void revert_stats() { stats = final_stats; }; // discard changes in stats (because contig was discarded)
+
+    /** Compute a global alignment between two path. NOTE: could be moved to Path class.
+     * \param[in] a : first path
+     * \param[in] b : second path. */
+    static float needleman_wunch (const Path_t<Node>& a, const Path_t<Node>& b);
+
+    /** Get the bubbles found during traversal. One bubble is defined by the [begin,end] positions in the
+     * path.
+     * \return vector of positions ranges. */
+    const std::vector <std::pair<int, int> >& getBubbles()  const { return bubbles_positions; }
+
+    bool deadend;
+
+protected:
+
+    /** */
+    TraversalTemplate (
+        const Graph& graph,
+        TerminatorTemplate<Node,Edge,Graph>         & terminator,
+        int maxlen,
+        int max_depth,
+        int max_breadth
+    );
+
+    const Graph& graph;
+    TerminatorTemplate<Node,Edge,Graph>&          terminator;
+
+    int maxlen;
+    int max_depth;
+    int max_breadth;
+
+    virtual char avance (Node& node, Direction dir, bool first_extension, Path_t<Node>& path, Node& previousNode) = 0;
+
+    void mark_extensions (std::set<Node>& extensions_to_mark);
+
+    // record the start/end positions of traversed bubbles (only from the latest traverse() call)
+    std::vector <std::pair<int, int> > bubbles_positions;
+};
+
+/********************************************************************************/
+
+/** \brief Null implementation of Traversal.
+ *
+ * This class returns empty Path as a result of traverse.
+ */
+template <typename Node, typename Edge, typename Graph>
+class NullTraversalTemplate: public TraversalTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Factory method that creates an instance of NullTraversal
+     * \param[in] graph : graph object to be traversed
+     * \param[in] terminator : object used to tag traversed nodes
+     * \param[in] maxlen : maximum length of the traversal
+     * \param[in] max_depth : maximum depth of the traversal
+     * \param[in] max_breadth : maximum depth of the traversal
+     */
+    NullTraversalTemplate (
+        const Graph& graph,
+        TerminatorTemplate<Node,Edge,Graph>& terminator,
+        int maxlen      = NullTraversalTemplate::defaultMaxLen,
+        int max_depth   = NullTraversalTemplate::defaultMaxDepth,
+        int max_breadth = NullTraversalTemplate::defaultMaxBreadth
+    ) : TraversalTemplate<Node,Edge,Graph> (graph, terminator, maxlen, max_depth, max_breadth) {}
+
+    /** Get the name of the traversal
+     * \return the name */
+    std::string getName() const  { return tools::misc::toString(tools::misc::TRAVERSAL_NONE); }
+
+private:
+
+    char avance (Node& node, Direction dir, bool first_extension, Path_t<Node>& path, Node& previousNode) { return 0; }
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of Traversal that produces unitigs.
+ */
+template <typename Node, typename Edge, typename Graph>
+class SimplePathsTraversalTemplate: public TraversalTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Factory method that creates an instance of SimplePathsTraversal
+     * \param[in] graph : graph object to be traversed
+     * \param[in] terminator : object used to tag traversed nodes
+     * \param[in] maxlen : maximum length of the traversal
+     * \param[in] max_depth : maximum depth of the traversal
+     * \param[in] max_breadth : maximum depth of the traversal
+     */
+    SimplePathsTraversalTemplate (
+        const Graph& graph,
+        TerminatorTemplate<Node,Edge,Graph>& terminator,
+        int maxlen      = SimplePathsTraversalTemplate::defaultMaxLen,
+        int max_depth   = SimplePathsTraversalTemplate::defaultMaxDepth,
+        int max_breadth = SimplePathsTraversalTemplate::defaultMaxBreadth
+    );
+
+    /** Get the name of the traversal
+     * \return the name */
+    std::string getName() const  { return tools::misc::toString(tools::misc::TRAVERSAL_UNITIG); }
+
+private:
+
+    /* Implementation of the virtual method. */
+    char avance (Node& node, Direction dir, bool first_extension, Path_t<Node>& path, Node& previousNode);
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of Traversal that produces contigs.
+ */
+template <typename Node, typename Edge, typename Graph>
+class MonumentTraversalTemplate: public TraversalTemplate<Node,Edge,Graph>
+{
+public:
+
+    /** Factory method that creates an instance of MonumentTraversal
+     * \param[in] graph : graph object to be traversed
+     * \param[in] terminator : object used to tag traversed nodes
+     * \param[in] maxlen : maximum length of the traversal
+     * \param[in] max_depth : maximum depth of the traversal
+     * \param[in] max_breadth : maximum depth of the traversal
+     */
+    MonumentTraversalTemplate (
+        const Graph& graph,
+        TerminatorTemplate<Node,Edge,Graph>&          terminator,
+        int maxlen      = MonumentTraversalTemplate::defaultMaxLen,
+        int max_depth   = MonumentTraversalTemplate::defaultMaxDepth,
+        int max_breadth = MonumentTraversalTemplate::defaultMaxBreadth
+    );
+
+    /** Get the name of the traversal
+     * \return the name */
+    std::string getName() const  { return tools::misc::toString(tools::misc::TRAVERSAL_CONTIG); }
+
+    bool explore_branching (
+        Node& node,
+        Direction dir,
+        Path_t<Node>& consensus,
+        Node& previousNode,
+        std::set<Node>& all_involved_extensions
+    );
+
+
+    // those two used to be private, but I need them in graph Simplifications for now (until explore_branching gets templated or any way we can choose Frontline type)
+    bool validate_consensuses (std::set<Path_t<Node> >& consensuses, Path_t<Node>& consensus);
+
+        std::set<Path_t<Node> > all_consensuses_between (
+        Direction    dir,
+        Node& startNode,
+        Node& endNode,
+        int traversal_depth,
+        bool &success
+    );
+
+
+private:
+
+    /* Implementation of the virtual method. */
+    char avance (Node& node, Direction dir, bool first_extension, Path_t<Node>& path, Node& previousNode);
+
+    bool explore_branching (
+        Node& node,
+        Direction dir,
+        Path_t<Node>& consensus,
+        Node& previousNode
+    );
+
+    int find_end_of_branching (
+        Direction dir,
+        Node& startingNode,
+        Node& endNode,
+        Node& previousNode,
+        std::set<Node>& all_involved_extensions
+    );
+ 
+    std::set<Path_t<Node> > all_consensuses_between (
+        Direction    dir,
+        Node& startNode,
+        Node& endNode,
+        int traversal_depth,
+        std::set<typename Node::Value> usedNode,
+        Path_t<Node> current_consensus,
+        bool& success
+    );
+   
+    bool all_consensuses_almost_identical (std::set<Path_t<Node> >& consensuses);
+
+    void mark_extensions (std::set<Node>& extensions_to_mark);
+
+    Path_t<Node> most_abundant_consensus(std::set<Path_t<Node> >& consensuses);
+
+    static const int consensuses_identity = 80; // traversing bubble if paths are all pair-wise identical by 80% 
+    //(used to be > 90% in legacy minia) // by legacy minia i mean minia 1 and minia 2 up to the assembly algo rewrite in may 2015
+};
+
+/* typedef for compatibility with all existing GATB tools */
+
+typedef TraversalTemplate<Node, Edge, Graph> Traversal; 
+typedef MonumentTraversalTemplate<Node, Edge, Graph> MonumentTraversal; 
+typedef NullTraversalTemplate<Node, Edge, Graph> NullTraversal; 
+typedef SimplePathsTraversalTemplate<Node, Edge, Graph> SimplePathsTraversal;
+
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_TOOLS_TRAVERSAL_HPP_ */
+
diff --git a/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.cpp b/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.cpp
new file mode 100644
index 0000000..816a85d
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.cpp
@@ -0,0 +1,142 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/debruijn/impl/UnitigsConstructionAlgorithm.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/bcalm2/bcalm_algo.hpp>
+#include <gatb/bcalm2/bglue_algo.hpp>
+#include <gatb/debruijn/impl/LinkTigs.hpp>
+
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace debruijn  {   namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+UnitigsConstructionAlgorithm<span>::UnitigsConstructionAlgorithm (
+    tools::storage::impl::Storage& storage,
+    std::string                 unitigs_filename,
+    size_t                      nb_cores,
+    tools::misc::IProperties*   options,
+    bool do_bcalm,
+    bool do_bglue,
+    bool do_links
+)
+    : Algorithm("bcalm2-wrapper", nb_cores, options), _storage(storage), unitigs_filename(unitigs_filename),
+    do_bcalm(do_bcalm), do_bglue(do_bglue), do_links(do_links)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+UnitigsConstructionAlgorithm<span>::~UnitigsConstructionAlgorithm ()
+{
+}
+
+/*********************************************************************/
+/*********************************************************************/
+
+template <size_t span>
+void UnitigsConstructionAlgorithm<span>::execute ()
+{
+    kmerSize =
+            getInput()->getInt(STR_KMER_SIZE);
+    int abundance = 
+            getInput()->getInt(STR_KMER_ABUNDANCE_MIN);
+    int minimizerSize =
+        getInput()->getInt(STR_MINIMIZER_SIZE);
+    int nb_threads =
+        getInput()->getInt(STR_NB_CORES);
+    int minimizer_type =
+        getInput()->getInt(STR_MINIMIZER_TYPE);
+    bool verbose = getInput()->getInt(STR_VERBOSE);
+    
+    unsigned int nbThreads = this->getDispatcher()->getExecutionUnitsNumber();
+    if ((unsigned int)nb_threads > nbThreads)
+        std::cout << "Uh. Unitigs graph construction called with nb_threads " << nb_threads << " but dispatcher has nbThreads " << nbThreads << std::endl;
+
+    if (do_bcalm) bcalm2<span>(&_storage, unitigs_filename, kmerSize, abundance, minimizerSize, nbThreads, minimizer_type, verbose); 
+    if (do_bglue) bglue<span> (&_storage, unitigs_filename, kmerSize,                           nbThreads,                 verbose);
+    if (do_links) link_tigs<span>(unitigs_filename, kmerSize, nbThreads, nb_unitigs, verbose);
+
+    /** We gather some statistics. */
+    // nb_unitigs will be used in GraphUnitigs
+    //getInfo()->add (1, "stats");
+    //getInfo()->add (2, "nb_unitigs", "%ld", /* */);
+    
+    //getInfo()->add (1, "time");
+    //getInfo()->add (2, "build", "%.3f", /* */);
+}
+
+// unused but nifty
+static uint64_t sizeof_string_vector(std::vector<std::string>& v)
+{
+    //http://stackoverflow.com/questions/29868622/memory-consumed-by-a-string-vector-in-c
+    uint64_t sum=0;
+    for (auto s: v)
+        sum += s.capacity();
+
+    return  sizeof(std::vector<string>) // The size of the vector basics.
+             + sizeof(std::string) * v.capacity()  // Size of the string object, not the text
+             //  One string object for each item in the vector.
+             //   **The multiplier may want to be the capacity of the vector, 
+             //   **the reserved quantity.
+             // + sum of each string's length;
+             + sum;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.hpp b/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.hpp
new file mode 100644
index 0000000..1b8c493
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/UnitigsConstructionAlgorithm.hpp
@@ -0,0 +1,88 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_CORE_DEBRUIJN_IMPL_UTIGS_CONSTR_ALGORITHM_HPP_
+#define _GATB_CORE_DEBRUIJN_IMPL_UTIGS_CONSTR_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/kmer/impl/Model.hpp> // for KMER_DEFAULT_SPAN and so on
+                                                                                                                                                                                
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/bcalm2/bcalm_algo.hpp>
+
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace debruijn  {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Computation of the unitigs of a Graph, using BCALM 2
+ *
+ */
+template <size_t span=KMER_DEFAULT_SPAN>
+class UnitigsConstructionAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+    /** Constructor.
+     * \param[in] graph : graph from which we look for branching nodes
+     * \param[in] nb_cores : number of cores to be used; 0 means all available cores
+     * \param[in] options : extra options
+     */
+    UnitigsConstructionAlgorithm (
+        tools::storage::impl::Storage& storage,
+        std::string                 unitigs_filename,
+        size_t                      nb_cores = 0,
+        tools::misc::IProperties*   options  = 0,
+        bool do_bcalm = true,
+        bool do_bglue = true,
+        bool do_links = true
+    );
+    
+    /** Destructor. */
+    ~UnitigsConstructionAlgorithm ();
+
+    /** Get an option parser for branching parameters. Dynamic allocation, so must be released when no more used.
+     * \return an instance of IOptionsParser.
+     */
+    static tools::misc::IOptionsParser* getOptionsParser ();
+
+    /** \copydoc tools::misc::impl::Algorithm::execute */
+    void execute ();
+    
+    int kmerSize;
+
+    uint64_t nb_unitigs;
+
+private:
+
+    tools::storage::impl::Storage& _storage;
+    std::string unitigs_filename;
+    bool do_bcalm, do_bglue, do_links;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
+
diff --git a/gatb-core/src/gatb/debruijn/impl/dag_vector.hpp b/gatb-core/src/gatb/debruijn/impl/dag_vector.hpp
new file mode 100644
index 0000000..c8609a2
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/dag_vector.hpp
@@ -0,0 +1,325 @@
+/* 
+ *  Copyright (c) 2011 Daisuke Okanohara
+ * 
+ *   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. Neither the name of the authors nor the names of its contributors
+ *      may be used to endorse or promote products derived from this
+ *      software without specific prior written permission.
+ */
+
+#ifndef DAG_VECTOR_HPP_
+#define DAG_VECTOR_HPP_
+
+#include <vector>
+#include <stdint.h>
+#include "rank_vector.hpp"
+
+namespace dag{
+
+/**
+ * Direct Accessible Gamma code Vector
+ */
+class dag_vector{
+public:
+  /**
+   * Constructor
+   */
+  dag_vector(): size_(0), sum_(0), max_shift_num_(0){
+  }
+
+  /**
+   * Destructor
+   */
+  ~dag_vector(){
+  }
+
+  /**
+   * Add element in a gamma code
+   * @param val an element to be added
+   */
+  void push_back(uint64_t val){
+    uint64_t val1 = val+1;
+    uint64_t shift = binary_len(val1);
+    resize(shift);
+    for (size_t i = 0; i < shift; ++i){
+      bitvals_[i].push_back((val1 >> i) & 0x1LLU);
+      bitunaries_[i].push_back(1);
+    }
+    if (shift == bitunaries_.size()){
+      max_shift_num_++;
+    } else {
+      bitunaries_[shift].push_back(0);
+    }
+    size_++;
+    sum_ += val;
+  }
+
+  /**
+   * Lookup the ind-th element
+   * @param ind the index
+   * @return the ind-th element
+   */
+  uint64_t operator[] (uint64_t ind) const{
+    uint64_t val = 0;
+    for (uint64_t shift = 0; shift < bitunaries_.size(); ++shift){
+      if (!bitunaries_[shift].get_bit(ind)){
+        return val + ((1LLU) << shift) -1;
+      }
+      ind = bitunaries_[shift].rank(ind);
+      val += bitvals_[shift].get_bit(ind) << shift;
+    }
+    return val + ((1LLU) << bitunaries_.size()) - 1; 
+  }
+
+  /**
+   * Compute the prefix sum: the sum of [0...ind-1] values.
+   * O(log max_val) time.
+   * @param ind the index
+   * @return the sum of v[0] v[1] ... v[ind-1]
+   */
+  uint64_t prefix_sum(uint64_t ind) const{
+    uint64_t orig_ind = ind;
+    uint64_t ret = 0;
+    for (uint64_t shift = 0; shift < bitunaries_.size(); ++shift){
+      uint64_t ones = bitunaries_[shift].rank(ind);
+      ret += (ind - ones) << shift;
+      ret += bitvals_[shift].rank(ones) << shift;
+      ind = ones;
+    }
+    return ret + (ind << bitunaries_.size()) - orig_ind;
+  }
+
+  /**
+   * Compute the prefix sum and the value in O(log max_val) time.
+   * @param ind the index
+   * @return the pair of the prefix sum (sum of v[0] v[1] ... v[ind-1]) and v[ind]
+   */
+  std::pair<uint64_t, uint64_t> prefix_sum_val(uint64_t ind) const{
+    uint64_t orig_ind = ind;
+    uint64_t sum = 0;
+    uint64_t val = 0;
+    bool val_finish = false;
+    for (uint64_t shift = 0; shift < bitunaries_.size(); ++shift){
+      uint64_t ones = bitunaries_[shift].rank(ind);
+      sum += (ind - ones) << shift;
+      if (!val_finish && !bitunaries_[shift].get_bit(ind)){
+        val += (1LLU) << shift;
+        val_finish = true;
+      }
+      sum += bitvals_[shift].rank(ones) << shift;
+      if (!val_finish){
+        val += bitvals_[shift].get_bit(ones) << shift;
+      }
+      ind = ones;
+    }
+    if (!val_finish ){
+      val += (1LLU) << bitunaries_.size(); 
+    }
+    sum += ind << bitunaries_.size();
+    return std::make_pair(sum - orig_ind, val-1);
+  }
+
+  /**
+   * Return the number of elements
+   * @return the number of elements
+   */
+  uint64_t size() const{
+    return size_;
+  }
+
+  /**
+   * Return the sum of values
+   * @return the sum of values
+   */
+  uint64_t sum() const{
+    return sum_;
+  }
+
+  /**
+   * Swap the content
+   * @param dagv the dag_vector to be swapped
+   */
+  void swap(dag_vector& dagv){
+    bitvals_.swap(dagv.bitvals_);
+    bitunaries_.swap(dagv.bitunaries_);
+    std::swap(size_, dagv.size_);
+    std::swap(sum_,  dagv.sum_);
+    std::swap(max_shift_num_, dagv.max_shift_num_);
+  }
+
+  /**
+   * Clear the content
+   */
+  void clear() {
+    std::vector<rank_vector>().swap(bitvals_);
+    std::vector<rank_vector>().swap(bitunaries_);
+    size_ = 0;
+    max_shift_num_ = 0;
+  }
+
+  /**
+   * Get the number of allocated bytes 
+   */
+  uint64_t get_alloc_byte_num() const{
+    uint64_t byte_num = 0;
+    for (size_t i = 0; i < bitvals_.size(); ++i){
+      uint64_t block_num = (bitvals_[i].size() + 64 - 1) / 64;
+      byte_num += sizeof(uint64_t) * block_num
+        + sizeof(uint64_t) * (block_num / 4)
+        + sizeof(uint8_t) * block_num;
+    }
+    for (size_t i = 0; i < bitunaries_.size(); ++i){
+      uint64_t block_num = (bitunaries_[i].size() + 64 - 1) / 64;
+      byte_num += sizeof(uint64_t) * block_num
+        + sizeof(uint64_t) * (block_num / 4)
+        + sizeof(uint8_t) * block_num;
+    }
+    return byte_num;
+  }
+
+  class const_iterator : public std::iterator<std::random_access_iterator_tag, uint64_t, size_t> {
+  public:
+    const_iterator(const dag_vector& dagv) : bitunaries_(dagv.bitunaries_), bitvals_(dagv.bitvals_) {
+      bitunary_poses_.resize(bitunaries_.size()+1);
+      bitval_poses_.resize(bitvals_.size());
+      set_cur_val();
+    }
+
+    const_iterator& end(const dag_vector& dagv){
+      for (size_t i = 0; i < bitval_poses_.size(); ++i){
+        bitval_poses_[i] = bitvals_[i].size();
+      }
+      for (size_t i = 1; i < bitunary_poses_.size(); ++i){
+        bitunary_poses_[i-1] = bitunaries_[i-1].size();
+      }
+      bitunary_poses_.back() = dagv.max_shift_num_;
+      cur_val_ = 0;
+      cur_shift_ = bitval_poses_.size();
+      return *this;
+    }
+
+    const_iterator& operator++(){
+      for (size_t i = 0; ; ++i){
+        ++bitunary_poses_[i];
+        if (i == cur_shift_){
+          break;
+        }
+        ++bitval_poses_[i];
+      }
+      set_cur_val(); 
+      return *this;
+    }
+
+    const_iterator operator++(int){
+      const_iterator tmp(*this);
+      ++*this;
+      return tmp;
+    }
+
+    const_iterator& operator--(){
+      for (size_t i = 0; ; ++i){
+        --bitunary_poses_[i];
+        if (i == cur_shift_){
+          break;
+        }
+        --bitval_poses_[i];
+      }
+
+      set_cur_val();
+      return *this;
+    }
+
+    const_iterator operator--(int){
+      const_iterator tmp(*this);
+      --*this;
+      return tmp;
+    }
+
+    size_t operator-(const const_iterator& it) const{
+      return bitunary_poses_[0] - it.bitunary_poses_[0];
+    }
+
+    bool operator==(const const_iterator& it) const{
+      if (bitval_poses_ != it.bitval_poses_) return false;
+      return true;
+    }
+
+    bool operator!=(const const_iterator& it) const{
+      return !(*this == it);
+    }
+
+    uint64_t operator*() const {
+      return cur_val_;
+    }
+
+  private:
+    void set_cur_val() {
+      uint64_t val = 0; 
+      cur_shift_ = 0;
+      for (; cur_shift_ < bitunaries_.size(); ++cur_shift_){
+          if (!bitunaries_[cur_shift_].get_bit(bitunary_poses_[cur_shift_])){
+            break;
+          }
+          val += bitvals_[cur_shift_].get_bit(bitval_poses_[cur_shift_]) << cur_shift_;
+      }
+      cur_val_ = val + (1LLU << cur_shift_) - 1;
+    }
+
+    const std::vector<rank_vector>& bitunaries_;
+    const std::vector<rank_vector>& bitvals_;
+    std::vector<uint64_t> bitval_poses_;
+    std::vector<uint64_t> bitunary_poses_;
+    uint64_t cur_shift_;
+    uint64_t cur_val_;
+  };
+
+  const_iterator begin() const{
+    return const_iterator(*this);
+  }
+  
+  const_iterator end() const{
+    const_iterator it = const_iterator(*this);
+    return it.end(*this);
+  }
+
+  static uint64_t binary_len(uint64_t val){
+    uint64_t shift = 0;
+    for (; (val >> shift) > 1; ++shift){}
+    return shift;
+  }
+
+private:
+  void resize(uint64_t shift){
+    uint64_t old_shift = bitunaries_.size();    
+    if (shift <= old_shift){
+      return;
+    }
+    bitunaries_.resize(shift);
+    bitvals_.resize(shift);
+    for (size_t i = 0; i < max_shift_num_; ++i){
+      bitunaries_[old_shift].push_back(0);
+    }
+    max_shift_num_ = 0;
+  }
+
+  std::vector<rank_vector> bitunaries_; /// unary codes
+  std::vector<rank_vector> bitvals_;    /// value codes
+  uint64_t size_;                       /// the number of codes
+  uint64_t sum_;                        /// the sum of values 
+  uint64_t max_shift_num_;              /// the number of codes whose have the largest lengths
+};
+
+}
+
+#endif // DAG_VECTOR_HPP_
+
diff --git a/gatb-core/src/gatb/debruijn/impl/rank_vector.hpp b/gatb-core/src/gatb/debruijn/impl/rank_vector.hpp
new file mode 100644
index 0000000..b4dbd78
--- /dev/null
+++ b/gatb-core/src/gatb/debruijn/impl/rank_vector.hpp
@@ -0,0 +1,137 @@
+/* 
+ *  Copyright (c) 2011 Daisuke Okanohara
+ * 
+ *   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. Neither the name of the authors nor the names of its contributors
+ *      may be used to endorse or promote products derived from this
+ *      software without specific prior written permission.
+ */
+
+
+#ifndef RANK_VECTOR_HPP_
+#define RANK_VECTOR_HPP_
+
+#include <vector>
+#include <stdint.h>
+
+namespace dag{
+
+/**
+ * Bit Vector supporing Rank operation
+ */
+class rank_vector{
+public:
+
+  /**
+   * Constructor
+   */
+  rank_vector(): size_(0), one_num_(0){
+    bits_.push_back(0);
+    lblocks_.push_back(0);
+    sblocks_.push_back(0);
+  }
+
+  /**
+   * Destructor
+   */
+  ~rank_vector(){
+  }
+
+  /**
+   * Add bit to the end of the vector
+   * @param bit a bit to be added
+   */
+  void push_back(uint64_t bit){
+    if (bit){
+      bits_[size_ / BLOCKSIZE] |= (1LLU << (size_ % BLOCKSIZE)); 
+    }
+    size_++;
+    if ((size_ % BLOCKSIZE) == 0){
+      add_block();
+    }
+  }
+
+  /**
+   * Get the pos-th bit
+   * @param pos the index
+   * @return the pos-th bit
+   */
+  uint64_t get_bit(uint64_t pos) const{
+    return (bits_[pos/BLOCKSIZE] >> (pos % BLOCKSIZE)) & 0x1LLU; 
+  }
+
+  /**
+   * Calculate the number of ones in bits_[0...pos-1] in O(1) time.
+   * @param pos the position in the bit array
+   * @return the number of ones in bits_[0...pos-1]
+   */
+  uint64_t rank(uint64_t pos) const{
+    return lblocks_[pos/LBLOCKSIZE] 
+      + sblocks_[pos/BLOCKSIZE] 
+      + pop_count(bits_[pos/BLOCKSIZE] & ((1LLU << (pos % BLOCKSIZE)) - 1));
+   }
+
+  /**
+   * Return the size of bit array in bits.
+   * @return the number of bits
+   */
+  uint64_t size() const{
+    return size_;
+  }
+
+  /**
+   * Swap the content in bit vector
+   * @param rv the rank_vector to be swapped
+   */
+  void swap(rank_vector& rv){
+    bits_.swap(rv.bits_);
+    lblocks_.swap(rv.lblocks_);
+    sblocks_.swap(rv.sblocks_); 
+    std::swap(size_, rv.size_);
+    std::swap(one_num_, rv.one_num_);
+  }
+
+ private:
+  static const uint64_t LBLOCKSIZE = 256;
+  static const uint64_t BLOCKSIZE = 64;
+
+  void add_block(){
+    if (bits_.size() > 0){
+      one_num_ += pop_count(bits_.back());
+    }
+
+    if (size_ % LBLOCKSIZE == 0){
+      lblocks_.push_back(one_num_);
+    }
+    sblocks_.push_back(one_num_ - lblocks_[size_ / LBLOCKSIZE]);
+    bits_.push_back(0LLU);
+  }
+
+  inline static uint64_t pop_count(uint64_t x){
+    x = x - ((x & 0xAAAAAAAAAAAAAAAALLU) >> 1);
+    x = (x & 0x3333333333333333LLU) + ((x >> 2) & 0x3333333333333333LLU);
+    x = (x + (x >> 4)) & 0x0F0F0F0F0F0F0F0FLLU;
+    return x * 0x0101010101010101LLU >> 56;
+  }
+
+  std::vector<uint64_t> bits_;    /// bit array
+  std::vector<uint64_t> lblocks_; /// rank results for large blocks
+  std::vector<uint8_t> sblocks_;  /// rank results for small blocks
+  uint64_t size_;                 /// the length of bit array
+  uint64_t one_num_;              /// the number of ones in the bit array
+};
+
+
+}
+
+#endif // RANK_VECTOR_HPP_
diff --git a/gatb-core/src/gatb/gatb_core.hpp b/gatb-core/src/gatb/gatb_core.hpp
new file mode 100644
index 0000000..26cbae2
--- /dev/null
+++ b/gatb-core/src/gatb/gatb_core.hpp
@@ -0,0 +1,120 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file gatb_core.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Global header file
+ */
+
+#ifndef _GATB_CORE_HPP_
+#define _GATB_CORE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/designpattern/impl/Observer.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagPartition.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+#include <gatb/tools/collections/impl/BloomGroup.hpp>
+#include <gatb/tools/collections/impl/ContainerSet.hpp>
+#include <gatb/tools/collections/impl/Hash16.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/OAHash.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/tools/misc/impl/Histogram.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/Tool.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/tools/misc/impl/StringLine.hpp>
+#include <gatb/tools/misc/impl/LibraryInfo.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+#include <gatb/bank/impl/BankConverterAlgorithm.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+#include <gatb/kmer/impl/CountProcessor.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+#include <gatb/debruijn/impl/Frontline.hpp>
+#include <gatb/debruijn/impl/IterativeExtensions.hpp>
+#include <gatb/debruijn/impl/BranchingAlgorithm.hpp>
+#include <gatb/debruijn/impl/LinkTigs.hpp>
+#include <gatb/debruijn/impl/ExtremityInfo.hpp>
+#include <gatb/bcalm2/bcalm_algo.hpp>
+#include <gatb/bcalm2/bglue_algo.hpp>
+
+#include <gatb/tools/compression/RangeCoder.hpp>
+#include <gatb/tools/compression/CompressionUtils.hpp>
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+/********************************************************************************/
+
+#endif /* _GATB_CORE_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/api/ICountProcessor.hpp b/gatb-core/src/gatb/kmer/api/ICountProcessor.hpp
new file mode 100644
index 0000000..30fbb05
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/api/ICountProcessor.hpp
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_CORE_KMER_ICOUNT_PROCESSOR_HPP_
+#define _GATB_CORE_KMER_ICOUNT_PROCESSOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+/********************************************************************************/
+
+/** \brief Interface that uses kmer counting information
+ *
+ * This interface is mainly an Observer that listens to data produced by the sorting
+ * count algorithm. Such an information is made of a kmer an the number of occurrences
+ * of this kmers in each bank provided to the algorithm.
+ *
+ * Through this interface, it becomes easy to plug specific listeners that can do
+ * different things on the [kmer,counts] information. There is a default implementation
+ * of the ICountProcessor interface that does the historical job of DSK:
+ *      1) building an histogram
+ *      2) filtering out kmers with too low coverage
+ *      3) saving on disk kmers having big enough coverage
+ *
+ * Such an instance can be associated to the SortingCountAlgorithm instance with the
+ * SortingCountAlgorithm::setProcessor method; this instance will be called 'prototype
+ * instance'.
+ *
+ * From an execution point of view, one instance of ICountProcessor is created (with method
+ * 'clone') for counting the kmers of one specific partition. If N cores are used, it means
+ * that N instances of ICountProcessor will be cloned from the so called 'prototype'
+ * instance (ie. the instance associated to the SortingCountAlgorithm instance). Each
+ * clone processes its partition in one specific thread.
+ *
+ * While processing a partition, a cloned ICountProcessor instance is called
+ * via its 'process' method: this is here that the information [kmer,counts] is
+ * provided to the ICountProcessor clone, and accordingly to the actual implementation
+ * class of the ICountProcessor interface, different processings can be done.
+ *
+ * When all the clones have finished their job (in their own thread), the prototype
+ * instance is called (in the main thread) via the 'finishClones' method, where
+ * the prototype instance has access to the N clones before they are deleted. It allows
+ * for instance to gather in the prototype instance the information collected by the clones
+ * during their processing.
+ *
+ * From a global point of view, the interface is made of three parts :
+ *      1) methods called on the prototype instance in the context of the main thread
+ *      2) methods called on a cloned instance in the context of specific threads
+ *      3) all other methods
+ *
+ * The following figure shows how ICountProcessor interacts with other classes, and in particular
+ * with SortingCountAlgorithm. One can also see the multithreading context, with the main thread
+ * creating clones and with clones processing their job in specific threads.
+ *
+ * \image html ICountProcessor.png "Usage and life cycle of ICountProcessor in the context of SortingCountAlgorithm"
+ *
+ * Examples of ICountProcessor implementors :
+ *      1) CountProcessorHistogram   : collect kmers distribution information
+ *      2) CountProcessorSolidity... : check whether a kmer is solid or not
+ *      3) CountProcessorDump        : dump kmer count information in file system
+ *      4) CountProcessorChain       : list of linked ICountProcessor instances
+ *
+ * The CountProcessorChain implementation allows to link several instances of
+ * ICountProcessor. When such an instance is called via 'process', the first item
+ * of the list is called via 'process'; if it returns true, the next item in the list
+ * is called and so on; if it returns false, the chain is stopped. This class is used
+ * for the definition of the "DSK" count processor (histogram -> solidity -> dump)
+ */
+template<size_t span>
+class ICountProcessor : public system::SmartPointer
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::Type Type;
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** Called just before the mainloop of SortingCountAlgorithm.
+     * \param[in] config : configuration of the SortingCountAlgorithm. */
+    virtual void begin (const kmer::impl::Configuration& config) = 0;
+
+    /** Called just after the mainloop of SortingCountAlgorithm. */
+    virtual void end   () = 0;
+
+    /** Called just before starting a pass.
+     * \param[in] passId: index of the pass to begin */
+    virtual void beginPass (size_t passId) = 0;
+
+    /** Called just after the end of a pass. */
+    virtual void endPass   (size_t passId) = 0;
+
+    /** Clone the instance.
+     * An instance can be cloned N times in order to use the cloned instance in one thread.
+     * \return the cloned instance. */
+    virtual ICountProcessor* clone () = 0;
+
+    /** Called when N partitions have been processed through N clones. This should be the last
+     * time these clones are available before being deleted. It can be the opportunity to the
+     * prototype instance to gather information from the clones.
+     * \param[in] clones : the N cloned instances
+     */
+    virtual void finishClones (std::vector<ICountProcessor<span>*>& clones) = 0;
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** Called at the beginning of a new kmers partition processing.
+     * \param[in] passId : index of the current pass in the SortingCountAlgorithm.
+     * \param[in] passId : index of the current kmers partition in the SortingCountAlgorithm.
+     * \param[in] cacheSize : memory size used for the current kmers partition
+     * \param[in] name : class name of the child PartitionsCommand class.
+     */
+    virtual void beginPart (size_t passId, size_t partId, size_t cacheSize, const char* name) = 0;
+
+    /** Called at the end of a new kmers partition processing.
+     * \param[in] passId : index of the current pass in the SortingCountAlgorithm.
+     * \param[in] passId : index of the current kmers partition in the SortingCountAlgorithm.
+     */
+    virtual void endPart   (size_t passId, size_t partId) = 0;
+
+    /** Notification that a [kmer,counts] is available and can be handled by the count processor.
+     * \param[in] partId : index of the current partition
+     * \param[in] kmer : kmer for which we are receiving counts
+     * \param[in] count : vector of counts of the kmer, one count per bank
+     * \param[in] sum : sum of the occurrences for all bank.
+     */
+    virtual bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum=0) = 0;
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** Get a name for the count processor.
+     * \return the count processor name. */
+    virtual std::string getName() const = 0;
+
+    /** Set a name for the count processor.
+     * \param[in] name : the count processor name. */
+    virtual void setName (const std::string& name) = 0;
+
+    /** Get some properties about the count processor.
+     * \return properties. */
+    virtual tools::misc::impl::Properties getProperties() const = 0;
+
+    /** Get a vector of instances in case of the current object is a composite.
+     * \return a vector of ICountProcessor instance. */
+    virtual std::vector<ICountProcessor*> getInstances () const = 0;
+
+    /** Try to get an instance of a specific type within the current object.
+     * \return a T pointer to the instance if found, 0 otherwise. */
+    template<typename T> T* get () const
+    {
+        std::vector<ICountProcessor*> v = this->getInstances();
+        for (size_t i=0; i<v.size(); i++)  {  if (T* object = dynamic_cast<T*> (v[i]))  { return object; }  }
+        return (T*)0;
+    }
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_ICOUNT_PROCESSOR_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/api/IModel.hpp b/gatb-core/src/gatb/kmer/api/IModel.hpp
new file mode 100644
index 0000000..587daff
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/api/IModel.hpp
@@ -0,0 +1,109 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IModel.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface definition for the kmer model
+ */
+
+#ifndef _GATB_CORE_KMER_IMODEL_HPP_
+#define _GATB_CORE_KMER_IMODEL_HPP_
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+/********************************************************************************/
+
+/** \brief enumeration giving the way the kmers are computed. */
+enum KmerMode
+{
+    /** Kmer from direct strand */
+    KMER_DIRECT,
+    /** Kmer as reverse complement */
+    KMER_REVCOMP,
+    /** Kmer as minimum between the direct and reverse complement */
+    KMER_CANONICAL
+};
+
+/********************************************************************************/
+
+/** Enumeration for strand. */
+enum Strand
+{
+    /** enum for the forward strand */
+    STRAND_FORWARD = (1<<0),
+    /** enum for the reverse strand */
+    STRAND_REVCOMP = (1<<1),
+    STRAND_ALL     = STRAND_FORWARD + STRAND_REVCOMP
+};
+
+/** Ascii representation of a Strand object  ("FWD" or "REV")
+ * \param[in] s : the strand
+ * \return the Ascii representation */
+inline std::string toString (Strand s)
+{
+         if (s == STRAND_FORWARD)  { return std::string("FWD"); }
+    else if (s == STRAND_REVCOMP)  { return std::string("REV"); }
+    else { return std::string("???"); }
+}
+
+inline Strand StrandReverse (const Strand& s)  {  return (s==STRAND_FORWARD ? STRAND_REVCOMP : STRAND_FORWARD);  }
+
+/********************************************************************************/
+
+/** Enumeration for nucleotides. */
+enum Nucleotide
+{
+    /** enum for the A nucleotide */
+    NUCL_A   = 0,
+    /** enum for the C nucleotide */
+    NUCL_C   = 1,
+    /** enum for the T nucleotide */
+    NUCL_T   = 2,
+    /** enum for the G nucleotide */
+    NUCL_G   = 3,
+    NUCL_UNKNOWN = 4
+};
+
+/** Ascii representation of a Nucleotide object ('A', 'C', 'T' or 'G')
+ * \param[in] nt : the nucleotide
+ * \return the Ascii representation */
+inline char ascii (Nucleotide nt)
+{
+    static char table[] = {'A', 'C', 'T', 'G', 'N' };
+    return table[(int)nt];
+}
+
+/** Reverse complement of a nucleotide (A->T, C->G, T->A, G->C)
+ * \param[in] nt : the nucleotide to be reversed
+ * \return the reversed nucleotide
+ */
+inline Nucleotide reverse (Nucleotide nt)
+{
+    static Nucleotide table[] = {NUCL_T, NUCL_G, NUCL_A, NUCL_C, NUCL_UNKNOWN};
+    return table[(int)nt];
+}
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMODEL_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/BankKmerIterator.hpp b/gatb-core/src/gatb/kmer/impl/BankKmerIterator.hpp
new file mode 100644
index 0000000..5fce689
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BankKmerIterator.hpp
@@ -0,0 +1,281 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankKmerIterator.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Kmer iterator on sequences of a bank
+ */
+
+#ifndef _GATB_CORE_KMER_IMPL_BANK_KMER_ITERATOR_HPP_
+#define _GATB_CORE_KMER_IMPL_BANK_KMER_ITERATOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/bank/api/IBank.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/* \brief Kmer iterator on data sequences from some bank.
+ */
+class BankKmerIterator :
+    public tools::dp::Iterator<kmer_type>,
+    public tools::dp::impl::AbstractSubjectIterator
+{
+public:
+
+    /** Constructor.
+     * \param[in] bank : the bank whose sequences are to be iterated.
+     * \param[in] model : kmer model
+     */
+    BankKmerIterator (bank::IBank& bank, KmerModel& model)
+        : _itSeq(0), _itKmer(model), _isDone(true),  _moduloMask(1), _current(0)
+    {
+        /** We create an iterator over the sequences of the provided bank.
+         * Note that this is a dynamic allocation, so we will have to get rid of the instance
+         * in the destructor. */
+        setItSeq (bank.iterator());
+
+        /** We set the modulo mask for which we will send notification to potential listeners.
+         * Such notification is done on outer loop over Sequence objects. */
+        _moduloMask = (1<<10) - 1;
+    }
+
+    /** Destructor. */
+    ~BankKmerIterator ()
+    {
+        /** We get rid of the dynamically allocated Sequence iterator. */
+        setItSeq(0);
+    }
+
+    /** \copydoc tools::dp::Iterator::first */
+    void first()
+    {
+        /** We begin by notifying potential listeners that the iteration is beginning. */
+        notifyInit ();
+
+        /** We reset the iteration counter. We will check when this counter is equal to our modulo;
+         * in such a case, we will notify our potential listeners.  */
+        _current = 0;
+
+        /** We go to the first item of the Sequence iteration. */
+        _itSeq->first ();
+
+        /** We use a shortcut variable in order to avoid some calls to the isDone method for the Sequence iteration.
+         * This is important for performance concerns since the 'isDone' kmer iterator relies on it and that we use
+         * a generic Iterator<Sequence>; in other words, we have here polymorphism on Sequence iterator and we have
+         * to limit such polymorphic calls when the number of calls is huge (overhead due to polymorphism).
+         */
+        _isDone = _itSeq->isDone();
+
+        /** We check that we have at least one sequence to iterate. */
+        if (!_isDone)
+        {
+            /** We configure the kmer iterator with the current sequence data. */
+            _itKmer.setData ((*_itSeq)->getData());
+
+            /** We go to the first kmer. */
+            _itKmer.first ();
+        }
+    }
+
+    /** \copydoc tools::dp::Iterator::next */
+    void next()
+    {
+        /** We look for the next kmer. */
+        _itKmer.next ();
+
+        /** We check the case where the kmer iteration is done. */
+        if (_itKmer.isDone ())
+        {
+            /** We have no more kmer for the current sequence, therefore we go for the next sequence. */
+            _itSeq->next();
+
+            /** We check whether we have another sequence or not. */
+            _isDone = _itSeq->isDone();
+            if (!_isDone)
+            {
+                /** We configure the kmer iterator with the current sequence data. */
+                _itKmer.setData ((*_itSeq)->getData());
+
+                /** We go to the first kmer. */
+                _itKmer.first ();
+
+                /** We may have to notify potential listeners if we looped enough items. */
+                if ((_current & _moduloMask) == 0)  { notifyInc (_current);  _current=0; }
+
+                /** We increase the iterated kmers number. */
+                _current++;
+            }
+        }
+    }
+
+    /** \copydoc tools::dp::Iterator::isDone */
+    bool isDone()
+    {
+        /** If we are done, we notify potential listeners. */
+        if (_isDone) { notifyFinish(); }
+
+        /** We return the outer loop isDone status. */
+        return _isDone;
+    }
+
+    /** \copydoc tools::dp::Iterator::item */
+    kmer_type& item ()  { return _itKmer.item(); }
+
+private:
+
+    /** Outer loop iterator on Sequence. */
+    tools::dp::Iterator<bank::Sequence>* _itSeq;
+    void setItSeq (tools::dp::Iterator<bank::Sequence>* itSeq)  { SP_SETATTR(itSeq); }
+
+    /** Inner loop iterator on kmer. */
+    KmerModel::Iterator _itKmer;
+
+    /** Shortcut (for performance). */
+    bool _isDone;
+
+    u_int32_t _current;
+    u_int32_t _moduloMask;
+};
+
+/********************************************************************************/
+
+/* \brief Kmer iterator on data sequences from some bank.
+ */
+template <typename kmer_type> class BankVectorKmerIterator :
+        public tools::dp::Iterator<std::vector<kmer_type> >,
+        public tools::dp::impl::AbstractSubjectIterator
+{
+public:
+
+    /** Constructor.
+     * \param[in] bank : the bank whose sequences are to be iterated.
+     * \param[in] model : kmer model
+     */
+    BankVectorKmerIterator (bank::IBank& bank, KmerModel<kmer_type>& model)
+        : _model(model), _itSeq(0), _isDone(true),  _moduloMask(1), _idx(0)
+    {
+        /** We create an iterator over the sequences of the provided bank.
+         * Note that this is a dynamic allocation, so we will have to get rid of the instance
+         * in the destructor. */
+        setItSeq (bank.iterator());
+
+        /** We set the modulo mask for which we will send notification to potential listeners.
+         * Such notification is done on outer loop over Sequence objects. */
+        _moduloMask = (1<<10) - 1;
+    }
+
+    /** Destructor. */
+    ~BankVectorKmerIterator ()
+    {
+        /** We get rid of the dynamically allocated Sequence iterator. */
+        setItSeq(0);
+    }
+
+    /** \copydoc tools::dp::Iterator::first */
+    void first()
+    {
+        /** We begin by notifying potential listeners that the iteration is beginning. */
+        notifyInit ();
+
+        /** We reset the iteration counter. We will check when this counter is equal to our modulo;
+         * in such a case, we will notify our potential listeners.  */
+        _idx = 0;
+
+        /** We go to the first item of the Sequence iteration. */
+        _itSeq->first ();
+
+        /** We use a shortcut variable in order to avoid some calls to the isDone method for the Sequence iteration.
+         * This is important for performance concerns since the 'isDone' kmer iterator relies on it and that we use
+         * a generic Iterator<Sequence>; in other words, we have here polymorphism on Sequence iterator and we have
+         * to limit such polymorphic calls when the number of calls is huge (overhead due to polymorphism).
+         */
+        _isDone = _itSeq->isDone();
+
+        /** We check that we have at least one sequence to iterate. */
+        if (!_isDone)
+        {
+            _model.build ((*_itSeq)->getData(), *(this->_item));
+        }
+    }
+
+    /** \copydoc tools::dp::Iterator::next */
+    void next()
+    {
+		/** We have no more kmer for the current sequence, therefore we go for the next sequence. */
+		_itSeq->next();
+
+		/** We check whether we have another sequence or not. */
+		_isDone = _itSeq->isDone();
+
+		if (!_isDone)
+		{
+			/** We configure the kmer iterator with the current sequence data. */
+		    _model.build ((*_itSeq)->getData(), *(this->_item));
+
+			/** We may have to notify potential listeners if we looped enough items. */
+			if ((_idx & _moduloMask) == 0)  { notifyInc (_idx);  _idx=0; }
+
+			/** We increase the iterated kmers number. */
+			_idx++;
+		}
+    }
+
+    /** \copydoc tools::dp::Iterator::isDone */
+    bool isDone()
+    {
+        /** If we are done, we notify potential listeners. */
+        if (_isDone) { notifyFinish(); }
+
+        /** We return the outer loop isDone status. */
+        return _isDone;
+    }
+
+    /** \copydoc tools::dp::Iterator::item */
+    std::vector<kmer_type>& item ()  { return *(this->_item); }
+
+private:
+
+    KmerModel<kmer_type>& _model;
+
+    /** Outer loop iterator on Sequence. */
+    tools::dp::Iterator<bank::Sequence>* _itSeq;
+    void setItSeq (tools::dp::Iterator<bank::Sequence>* itSeq)  { SP_SETATTR(itSeq); }
+
+    /** Shortcut (for performance). */
+    bool _isDone;
+
+    u_int32_t _idx;
+    u_int32_t _moduloMask;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_BANK_KMER_ITERATOR_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/BankKmers.hpp b/gatb-core/src/gatb/kmer/impl/BankKmers.hpp
new file mode 100644
index 0000000..f0bbc8c
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BankKmers.hpp
@@ -0,0 +1,222 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BankKmers.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Kmer iterator on sequences of a bank
+ */
+
+#ifndef _GATB_CORE_KMER_IMPL_BANK_KMERS_HPP_
+#define _GATB_CORE_KMER_IMPL_BANK_KMERS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/bank/impl/AbstractBank.hpp>
+#include <cmath>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Bank whose sequences are all the possible kmers of a kmer model.
+ *
+ * For instance, for a kmer size of 3, the bank will iterate the 3^4 possible kmers.
+ */
+class BankKmers : public bank::impl::AbstractBank
+{
+public:
+
+    /** Constructor.
+     * \param[in] kmerSize : size of the kmers to be iterated. */
+    BankKmers (size_t kmerSize) : _model(kmerSize)
+    {
+        _totalNumber = ((u_int64_t)1) << (2*_model.getKmerSize());
+    }
+
+    /** \copydoc bank::IBank::getId */
+    std::string getId ()  {  std::stringstream ss; ss << "Kmers" << _model.getKmerSize();  return ss.str();  }
+
+    /** \copydoc bank::IBank::getNbItems */
+    int64_t getNbItems () { return _totalNumber; }
+
+    /** \copydoc bank::IBank::estimate */
+    void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+    {
+        number    = _totalNumber;
+        totalSize = _totalNumber * _model.getKmerSize();
+        maxSize   = _model.getKmerSize();
+    }
+
+    /** \copydoc tools::collections::Bag::insert */
+    void insert (const bank::Sequence& item)  { throw system::Exception ("Can't insert sequence to BankKmers"); }
+
+    /** \copydoc tools::collections::Bag::flush */
+    void flush ()  { throw system::Exception ("Can't flush BankKmers"); }
+
+    /** \copydoc bank::IBank::getSize */
+    u_int64_t getSize () { return _totalNumber * _model.getKmerSize(); }
+
+    /* */
+    class Iterator : public tools::dp::Iterator<bank::Sequence>
+    {
+    public:
+        /** Constructor.
+         * \param[in] ref : the associated iterable instance.
+         */
+        Iterator (BankKmers& ref) : _ref(ref), _isDone(true), _kmer(0), _kmerMax(_ref._totalNumber) {}
+
+        /** Destructor */
+        virtual ~Iterator () {}
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first()
+        {
+            _kmer = 0;
+            _isDone = (_kmer >= _kmerMax);
+            if (!_isDone)  { updateSequence (); }
+        }
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next()
+        {
+            _kmer += 1;
+            _isDone = (_kmer >= _kmerMax);
+            if (!_isDone)  { updateSequence (); }
+        }
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()  { return _isDone; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        bank::Sequence& item ()     { return *_item; }
+
+    private:
+
+        /** Reference to the underlying bank. */
+        BankKmers&    _ref;
+
+        /** Tells whether the iteration is finished or not. */
+        bool _isDone;
+
+        /** */
+        u_int64_t _kmer;
+        u_int64_t _kmerMax;
+
+        /** */
+        void updateSequence ()
+        {
+            /** We get the string representation of the current kmer. */
+            _kmerString = _ref._model.toString(_kmer);
+
+            /** We build the comment of the sequence. */
+            _ss.str ("");  _ss << "seq_" << _kmer;
+            _item->setComment (_ss.str().c_str());
+
+            /** We set the data for the sequence.
+             * NOTE : we use 'set' and not 'setRef' since we want a true copy.
+             * => mandatory in case this iterator is used through a parallel dispatcher. */
+            _item->getData().set ((char*)_kmerString.data(), _kmerString.size());
+        }
+
+        /** */
+        std::string       _kmerString;
+        std::stringstream _ss;
+    };
+
+    /** \copydoc tools::collections::Iterable::iterator */
+    tools::dp::Iterator<bank::Sequence>* iterator ()  { return new Iterator (*this); }
+
+private:
+    Kmer<>::ModelCanonical _model;
+    u_int64_t              _totalNumber;
+
+    friend class Iterator;
+};
+
+/********************************************************************************/
+
+/** \brief Statistics about banks.
+ *
+ * This structure allows to gather information about sequences while iterating banks.
+ * An BankStats object can be updated through the update method during such an iteration.
+ */
+struct BankStats
+{
+    /** Constructor. */
+    BankStats ()
+    : sequencesNb(0), sequencesMinLength(~0), sequencesMaxLength(0), sequencesTotalLength(0), sequencesTotalLengthSquare(0),
+      kmersNbValid(0), kmersNbInvalid(0) {}
+
+    /** Update the statistics with the information of the provided sequence
+     * \param[in] sequence : sequence used to update the statistics. */
+    void update (bank::Sequence& sequence)
+    {
+        sequencesNb++;
+        sequencesTotalLength       += sequence.getDataSize();
+        sequencesTotalLengthSquare += sequence.getDataSize() * sequence.getDataSize();
+        if (sequencesMinLength > sequence.getDataSize())  {  sequencesMinLength = sequence.getDataSize(); }
+        if (sequencesMaxLength < sequence.getDataSize())  {  sequencesMaxLength = sequence.getDataSize(); }
+    }
+
+    /** Concatenation of the current BankStats object with another one.
+     * \param[in] other : the instance used to update the current instance. */
+    BankStats& operator+= (const BankStats& other)
+    {
+        sequencesNb                += other.sequencesNb;
+        sequencesTotalLength       += other.sequencesTotalLength;
+        sequencesTotalLengthSquare += other.sequencesTotalLengthSquare;
+        kmersNbValid               += other.kmersNbValid;
+        kmersNbInvalid             += other.kmersNbInvalid;
+        sequencesMinLength          = std::min (sequencesMinLength, other.sequencesMinLength);
+        sequencesMaxLength          = std::max (sequencesMaxLength, other.sequencesMaxLength);
+        return *this;
+    }
+
+    /** Get the mean size of sequences.
+     * \return the mean size. */
+    double getSeqMean ()  {  return (sequencesNb > 0 ?  (double)sequencesTotalLength / (double)sequencesNb : 0.0);  }
+
+    /** Get the deviation size of sequences.
+     * \return the deviation size. */
+    double getSeqDeviation ()
+    {
+        double result = 0.0;
+        if (sequencesNb > 0)  {  result = sqrt ((double)sequencesTotalLengthSquare / (double)sequencesNb - pow(getSeqMean(),2));  }
+        return result;
+    }
+
+    u_int64_t sequencesNb;
+    u_int64_t sequencesMinLength;
+    u_int64_t sequencesMaxLength;
+    u_int64_t sequencesTotalLength;
+    u_int64_t sequencesTotalLengthSquare;
+    u_int64_t kmersNbValid;
+    u_int64_t kmersNbInvalid;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_BANK_KMERS_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.cpp
new file mode 100644
index 0000000..d33a098
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.cpp
@@ -0,0 +1,205 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <iostream>
+#include <map>
+#include <math.h>
+
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/tools/math/NativeInt8.hpp>
+
+#include <gatb/debruijn/impl/ContainerNode.hpp>
+
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+static const char* progressFormat1 = "Bloom: read solid kmers                ";
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+BloomAlgorithm<span>::BloomAlgorithm (
+    Storage& storage,
+    Iterable<Count>*    solidIterable,
+    size_t              kmerSize,
+    float               nbitsPerKmer,
+    size_t              nb_cores,
+    BloomKind  bloomKind,
+    IProperties*        options
+)
+    :  Algorithm("bloom", nb_cores, options),
+       _kmerSize(kmerSize), _nbitsPerKmer(nbitsPerKmer), _bloomKind(bloomKind), _storage(storage), _solidIterable(0)
+{
+    setSolidIterable (solidIterable);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+BloomAlgorithm<span>::BloomAlgorithm (tools::storage::impl::Storage& storage)
+    :  Algorithm("bloom", 0, 0),
+       _kmerSize(0), _nbitsPerKmer(0), _storage(storage), _solidIterable(0)
+{
+    /** We get the kind in the storage. */
+    string kind = _storage(this->getName()).getProperty ("kind");
+
+    /** We parse the type. */
+    parse (kind, _bloomKind);
+
+    string xmlString = _storage(this->getName()).getProperty ("xml");
+    stringstream ss; ss << xmlString;   getInfo()->readXML (ss);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+BloomAlgorithm<span>::~BloomAlgorithm ()
+{
+    setSolidIterable (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void BloomAlgorithm<span>::execute ()
+{
+
+    /** We get the number of solid kmers. */
+    u_int64_t solidKmersNb = _solidIterable->getNbItems();
+
+    float     NBITS_PER_KMER     = _nbitsPerKmer;
+    u_int64_t estimatedBloomSize = (u_int64_t) (solidKmersNb * NBITS_PER_KMER);
+    size_t    nbHash             = (int)floorf (0.7*NBITS_PER_KMER);
+
+    if (estimatedBloomSize ==0 ) { estimatedBloomSize = 1000; }
+
+    /** We create the kmers iterator from the solid file. */
+    Iterator <Count>* itKmers = createIterator<Count> (
+        _solidIterable->iterator(),
+        solidKmersNb,
+        progressFormat1
+    );
+    LOCAL (itKmers);
+
+    /** We use a bloom builder. */
+    BloomBuilder<span> builder (estimatedBloomSize, nbHash, _kmerSize, _bloomKind, getDispatcher()->getExecutionUnitsNumber());
+
+    /** We instantiate the bloom object. */
+    IBloom<Type>* bloom = 0;
+    {
+        TIME_INFO (getTimeInfo(), "build_from_kmers");
+        bloom = builder.build (itKmers);
+    }
+    LOCAL (bloom);
+
+    /** We save the bloom. */
+    StorageTools::singleton().saveBloom<Type> (_storage.getGroup(this->getName()), "bloom", bloom, _kmerSize);
+
+    /** We gather some statistics. */
+    getInfo()->add (1, "stats");
+    getInfo()->add (2, "kind",           "%s",  toString(_bloomKind));
+    getInfo()->add (2, "bitsize",        "%ld", bloom->getBitSize());
+    getInfo()->add (2, "nb_hash",        "%d",  bloom->getNbHash());
+    getInfo()->add (2, "nbits_per_kmer", "%f",  _nbitsPerKmer);
+    getInfo()->add (1, getTimeInfo().getProperties("time"));
+
+    /** We save the kind in the storage. */
+    _storage.getGroup(this->getName()).addProperty ("kind", toString(_bloomKind));
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.hpp
new file mode 100644
index 0000000..20dbfb6
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BloomAlgorithm.hpp
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BloomAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bloom algorithm, ie. compute a Bloom filter from a set of reads
+ */
+
+#ifndef _BLOOM_ALGORITHM_HPP_
+#define _BLOOM_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+template<size_t span=KMER_DEFAULT_SPAN>
+class BloomAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::Type           Type;
+    typedef typename kmer::impl::Kmer<span>::Count          Count;
+
+    /** */
+    BloomAlgorithm (
+        tools::storage::impl::Storage&       storage,
+        tools::collections::Iterable<Count>* solidIterable,
+        size_t                               kmerSize,
+        float                                nbitsPerKmer,
+        size_t                               nb_cores = 0,
+        tools::misc::BloomKind               bloomKind = tools::misc::BLOOM_DEFAULT,
+        tools::misc::IProperties*            options    = 0
+    );
+
+    /** */
+    BloomAlgorithm (tools::storage::impl::Storage& storage);
+
+    /** */
+    ~BloomAlgorithm ();
+
+    /** */
+    void execute ();
+
+private:
+
+    /** */
+    size_t _kmerSize;
+
+    /** */
+    float _nbitsPerKmer;
+
+    /** */
+    tools::misc::BloomKind _bloomKind;
+
+    /** */
+    tools::storage::impl::Storage& _storage;
+
+    /** */
+    tools::collections::Iterable<Count>* _solidIterable;
+    void setSolidIterable (tools::collections::Iterable<Count>* solidIterable)  {  SP_SETATTR(solidIterable); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _BLOOM_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/BloomBuilder.cpp b/gatb-core/src/gatb/kmer/impl/BloomBuilder.cpp
new file mode 100644
index 0000000..096bc68
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BloomBuilder.cpp
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace kmer          {
+namespace impl          {
+/********************************************************************************/
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/kmer/impl/BloomBuilder.hpp b/gatb-core/src/gatb/kmer/impl/BloomBuilder.hpp
new file mode 100644
index 0000000..8848aab
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/BloomBuilder.hpp
@@ -0,0 +1,188 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BloomBuilder.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Build bloom filter from an iterator of kmers
+ */
+
+#ifndef _GATB_CORE_KMER_IMPL_BLOOM_BUILDER_HPP_
+#define _GATB_CORE_KMER_IMPL_BLOOM_BUILDER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/misc/api/IProperty.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/math/NativeInt8.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Helper that builds a Bloom filter from an iterator of kmers.
+ *
+ * This class encapsulates the creation of a Bloom filter from a set of kmers.
+ * Such a set can be provided as an Iterator of Count objects, which likely
+ * should have been generated by DSK.
+ *
+ * Once the IBloom instance has been instantiated, the Count iterator is iterated
+ * and each item is inserted into the Bloom filter.
+ *
+ * Several parameters allows to configure the Bloom filter creation.
+ *
+ * This class also provides a load method that builds a Bloom filter by reading
+ * the raw bitset as an Iterable of NativeInt8 objects.
+ *
+ * This class has a 'span' template which determines which implementation of Type
+ * has to be used.
+ *
+ */
+template<size_t span=KMER_DEFAULT_SPAN> class BloomBuilder
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::Count Count;
+
+    /** Constructor.
+     * \param[in] bloomSize : the size (in bits) of the Bloom filter to be created
+     * \param[in] nbHash : number of hash functions of the Bloom filter.
+     * \param[in] ksize : the kmer size is needed
+     * \param[in] bloomKind : kind of Bloom filter to be created
+     * \param[in] nbCores : number of cores to be used for the iteration of items to be inserted
+     * \param[in] min_abundance : if >0, only kmers having abundance greater than that threshold are inserted into the Bloom filter.
+     *                            otherwise all items are inserted.
+     */
+    BloomBuilder (
+        u_int64_t   bloomSize,
+        size_t      nbHash,
+        size_t      ksize,
+        tools::misc::BloomKind bloomKind = tools::misc::BLOOM_DEFAULT,
+        size_t      nbCores = 0,
+		int		    min_abundance =0
+    )
+        : _bloomSize (bloomSize), _nbHash (nbHash), _nbCores(nbCores), _ksize(ksize), _min_abundance(min_abundance), _bloomKind(bloomKind)
+    {
+    }
+
+    /** Create a Bloom filter and fill it with the provided kmers iterator.
+     * \param[in] itKmers : an iterator over the kmers to be inserted; more precisely, we iterate couples [kmers,abundance]
+     * \param[in] stats : properties object to be filled by statistics gathered during the build.
+     * \return the IBloom instance. */
+    tools::collections::impl::IBloom<Type>*  build (
+        tools::dp::Iterator<Count>* itKmers,
+        tools::misc::IProperties* stats=0
+    )
+    {
+        tools::misc::impl::TimeInfo ti;
+        TIME_INFO (ti, "build_kmers_bloom");
+
+        LOCAL (itKmers);
+
+        /** We instantiate the bloom object. */
+        tools::collections::impl::IBloom<Type>* bloom =
+            tools::collections::impl::BloomFactory::singleton().createBloom<Type> (_bloomKind, _bloomSize, _nbHash, _ksize);
+
+        /** We launch the bloom fill. */
+        tools::dp::impl::Dispatcher(_nbCores).iterate (itKmers,  BuildKmerBloom (*bloom,_min_abundance));
+
+        /** We gather some statistics. */
+        if (stats != 0)
+        {
+            //stats->add (0, "bloom");
+            stats->add (0, "size",    "%lld", _bloomSize);
+            stats->add (0, "nb_hash", "%d",   _nbHash);
+        }
+
+        /** We return the created bloom filter. */
+        return bloom;
+    }
+
+    /** Load a Bloom filter from a binary stream provided as an Iterable of NativeInt8
+     * \param[in] bloomIterable : binary stream holding the bitset of the Bloom filter
+     * \param[in] stats : properties object to be filled by statistics gathered during the build. */
+    tools::collections::impl::IBloom<Type>*  load (
+        tools::collections::Iterable<tools::math::NativeInt8>* bloomIterable,
+        tools::misc::IProperties* stats = 0)
+    {
+        tools::misc::impl::TimeInfo ti;
+        TIME_INFO (ti, "load_bloom");
+
+        LOCAL (bloomIterable);
+
+        /** We instantiate the bloom object. */
+        tools::collections::impl::IBloom<Type>* bloom =
+            tools::collections::impl::BloomFactory::singleton().createBloom<Type> (_bloomKind, _bloomSize, _nbHash, _ksize);
+
+        /** We set the bloom with the provided array given as an iterable of NativeInt8 objects. */
+        bloomIterable->getItems ((tools::math::NativeInt8*&)bloom->getArray());
+
+        /** We gather some statistics. */
+        if (stats != 0)
+        {
+            stats->add (0, "bloom", "");
+            stats->add (1, "filter_size", "%lld", _bloomSize);
+            stats->add (1, "nb_hash_fct", "%d",   _nbHash);
+        }
+
+        /** We return the created bloom filter. */
+        return bloom;
+    }
+
+
+private:
+
+    u_int64_t _bloomSize;
+    size_t    _nbHash;
+    size_t    _nbCores;
+    size_t    _ksize;
+	int _min_abundance;
+	
+    tools::misc::BloomKind _bloomKind;
+
+    /********************************************************************************/
+    class BuildKmerBloom
+    {
+    public:
+        void operator() (const Count& kmer)  { if ((int)kmer.abundance >= _min_abundance)  _bloom.insert(kmer.value); }
+        BuildKmerBloom (tools::collections::impl::IBloom<Type>& bloom, int min_abundance=0)  : _bloom(bloom),_min_abundance(min_abundance)  {}
+        tools::collections::impl::IBloom<Type>& _bloom;
+		int _min_abundance;
+    };
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_BLOOM_BUILDER_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/Configuration.cpp b/gatb-core/src/gatb/kmer/impl/Configuration.cpp
new file mode 100644
index 0000000..e50f82a
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Configuration.cpp
@@ -0,0 +1,183 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/Configuration.hpp>
+#include <gatb/system/api/IMemory.hpp>
+
+/********************************************************************************/
+
+using namespace std;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace kmer          {
+namespace impl          {
+/********************************************************************************/
+
+#define DEBUG(a)  //printf a
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Properties Configuration::getProperties() const
+{
+    Properties result ("config");
+
+    result.add (1, "kmer_size",         "%ld", _kmerSize);
+    result.add (1, "mini_size",         "%ld", _minim_size);
+    result.add (1, "solidity_kind",      "%s", toString(_solidityKind).c_str());
+
+	if(_solidityKind==KMER_SOLIDITY_CUSTOM)
+	{
+		std::stringstream ss2;
+		for (size_t i=0; i<_solidVecUserNb; i++)  {  ss2 <<  " " << _solidVec[i]; }
+		result.add (1, "custom_solidity",     ss2.str());
+	}
+
+	
+    std::stringstream ss;
+    for (size_t i=0; i<_abundanceUserNb; i++)  {  ss << (i==0 ? "" : " ") << _abundance[i].getBegin(); }
+
+    result.add (1, "abundance_min",     ss.str());
+    result.add (1, "abundance_max",     "%ld", _abundance[0].getEnd());
+
+	
+
+	
+    result.add (1, "available_space",   "%ld", _available_space);
+    result.add (1, "sequence_number",   "%ld", _estimateSeqNb);
+    result.add (1, "sequence_volume",   "%ld", _estimateSeqTotalSize / system::MBYTE);
+    result.add (1, "kmers_number",      "%ld", _kmersNb);
+    result.add (1, "kmers_volume",      "%ld", _volume);
+    result.add (1, "max_disk_space",    "%ld", _max_disk_space);
+    result.add (1, "max_memory",        "%ld", _max_memory);
+    result.add (1, "nb_passes",         "%d",  _nb_passes);
+    result.add (1, "nb_partitions",     "%d",  _nb_partitions);
+    result.add (1, "nb_bits_per_kmer",  "%d",  _nb_bits_per_kmer);
+    result.add (1, "nb_cores",          "%d",  _nbCores);
+    result.add (1, "minimizer_type",    "%s",  (_minimizerType == 0) ? "lexicographic (kmc2 heuristic)" : "frequency");
+    result.add (1, "repartition_type",  "%s",  (_repartitionType == 0) ? "unordered" : "ordered");
+
+    result.add (1, "nb_cores_per_partition",     "%d",  _nbCores_per_partition);
+    result.add (1, "nb_partitions_in_parallel",  "%d",  _nb_partitions_in_parallel);
+    result.add (1, "nb_cached_items_per_core_per_part",  "%d",  _nb_cached_items_per_core_per_part);
+
+    result.add (1, "nb_banks",  "%d",  _nb_banks);
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Configuration::load (tools::storage::impl::Group& group)
+{
+
+	_isComputed = true;
+
+    tools::storage::impl::Storage::istream is (group, "config");
+
+    is.read ((char*)&_kmerSize,                    sizeof(_kmerSize));
+    is.read ((char*)&_minim_size,                    sizeof(_minim_size));
+    is.read ((char*)&_repartitionType,                    sizeof(_repartitionType));
+    is.read ((char*)&_minimizerType,                    sizeof(_minimizerType));
+    is.read ((char*)&_max_disk_space,                    sizeof(_max_disk_space));
+    is.read ((char*)&_max_memory,                    sizeof(_max_memory));
+    is.read ((char*)&_nbCores,                    sizeof(_nbCores));
+    is.read ((char*)&_nb_partitions_in_parallel,                    sizeof(_nb_partitions_in_parallel));
+    is.read ((char*)&_abundanceUserNb,                    sizeof(_abundanceUserNb));
+    _abundance.resize (_abundanceUserNb);
+    //is.read ((char*)_abundance.data(),    sizeof(tools::misc::CountRange)*_abundance.size());
+
+    is.read ((char*)&_nbCores_per_partition,                sizeof(_nbCores_per_partition));
+    is.read ((char*)&_estimateSeqNb,                    sizeof(_estimateSeqNb));
+    is.read ((char*)&_estimateSeqTotalSize,             sizeof(_estimateSeqTotalSize));
+    is.read ((char*)&_estimateSeqMaxSize,                sizeof(_estimateSeqMaxSize));
+    is.read ((char*)&_available_space,    sizeof(_available_space));
+    is.read ((char*)&_volume, sizeof(_volume));
+    is.read ((char*)&_kmersNb,           sizeof(_kmersNb));
+    is.read ((char*)&_nb_passes,           sizeof(_nb_passes));
+    is.read ((char*)&_nb_partitions,           sizeof(_nb_partitions));
+    is.read ((char*)&_nb_bits_per_kmer,           sizeof(_nb_bits_per_kmer));
+    is.read ((char*)&_nb_banks,           sizeof(_nb_banks));
+    is.read ((char*)&_nb_cached_items_per_core_per_part,           sizeof(_nb_cached_items_per_core_per_part));
+
+
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Configuration::save (tools::storage::impl::Group& group)
+{
+    DEBUG (("[Config::save]\n"));
+
+    tools::storage::impl::Storage::ostream os (group, "config");
+
+    os.write ((const char*)&_kmerSize,                    sizeof(_kmerSize));
+    os.write ((const char*)&_minim_size,                    sizeof(_minim_size));
+    os.write ((const char*)&_repartitionType,                    sizeof(_repartitionType));
+    os.write ((const char*)&_minimizerType,                    sizeof(_minimizerType));
+    os.write ((const char*)&_max_disk_space,                    sizeof(_max_disk_space));
+    os.write ((const char*)&_max_memory,                    sizeof(_max_memory));
+    os.write ((const char*)&_nbCores,                    sizeof(_nbCores));
+    os.write ((const char*)&_nb_partitions_in_parallel,                    sizeof(_nb_partitions_in_parallel));
+    os.write ((const char*)&_abundanceUserNb,                    sizeof(_abundanceUserNb));
+    //os.write ((const char*)_abundance.data(),    sizeof(tools::misc::CountRange)*_abundance.size());
+
+
+    os.write ((const char*)&_nbCores_per_partition,                sizeof(_nbCores_per_partition));
+    os.write ((const char*)&_estimateSeqNb,                    sizeof(_estimateSeqNb));
+    os.write ((const char*)&_estimateSeqTotalSize,             sizeof(_estimateSeqTotalSize));
+    os.write ((const char*)&_estimateSeqMaxSize,                sizeof(_estimateSeqMaxSize));
+    os.write ((const char*)&_available_space,    sizeof(_available_space));
+    os.write ((const char*)&_volume, sizeof(_volume));
+    os.write ((const char*)&_kmersNb,           sizeof(_kmersNb));
+    os.write ((const char*)&_nb_passes,           sizeof(_nb_passes));
+    os.write ((const char*)&_nb_partitions,           sizeof(_nb_partitions));
+    os.write ((const char*)&_nb_bits_per_kmer,           sizeof(_nb_bits_per_kmer));
+    os.write ((const char*)&_nb_banks,           sizeof(_nb_banks));
+    os.write ((const char*)&_nb_cached_items_per_core_per_part,           sizeof(_nb_cached_items_per_core_per_part));
+
+    os.flush();
+
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/kmer/impl/Configuration.hpp b/gatb-core/src/gatb/kmer/impl/Configuration.hpp
new file mode 100644
index 0000000..1136334
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Configuration.hpp
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _CONFIGURATION_HPP_
+#define _CONFIGURATION_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/api/Range.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+class Configuration
+{
+public:
+
+    /** */
+    Configuration ()
+    : _kmerSize(0), _minim_size(0), _repartitionType(0), _minimizerType(0),
+      _solidityKind(tools::misc::KMER_SOLIDITY_SUM),
+      _max_disk_space(0), _max_memory(0),
+      _nbCores(0), _nb_partitions_in_parallel(0), _abundanceUserNb(0), _storage_type(tools::storage::impl::STORAGE_HDF5) ,
+      _isComputed(false), _nbCores_per_partition(0),
+      _estimateSeqNb(0), _estimateSeqTotalSize(0), _estimateSeqMaxSize(0),
+      _available_space(0), _volume(0), _kmersNb(0), _nb_passes(0), _nb_partitions(0), _nb_bits_per_kmer(0), _nb_banks(0) {}
+
+    /****************************************/
+    /**             PROVIDED                */
+    /****************************************/
+
+    size_t      _kmerSize;
+    size_t      _minim_size;
+    size_t      _repartitionType;
+    size_t      _minimizerType;
+
+    tools::misc::KmerSolidityKind _solidityKind;
+
+    u_int64_t   _max_disk_space;
+    u_int32_t   _max_memory;
+
+    size_t      _nbCores;
+    size_t      _nb_partitions_in_parallel;
+
+    std::vector<tools::misc::CountRange>  _abundance;
+    size_t _abundanceUserNb;
+
+    tools::storage::impl::StorageMode_e _storage_type;
+	
+	std::vector<bool> _solidVec;
+	size_t _solidVecUserNb;
+
+    /****************************************/
+    /**             COMPUTED                */
+    /****************************************/
+
+    bool        _isComputed;
+
+    size_t      _nbCores_per_partition;
+
+    u_int64_t   _estimateSeqNb;
+    u_int64_t   _estimateSeqTotalSize;
+    u_int64_t   _estimateSeqMaxSize;
+
+    u_int64_t   _available_space;
+    u_int64_t   _volume;
+    u_int64_t   _kmersNb;
+
+    u_int32_t   _nb_passes;
+    u_int32_t   _nb_partitions;
+
+    u_int16_t   _nb_bits_per_kmer;
+
+    u_int16_t   _nb_banks;
+    
+    u_int32_t   _nb_cached_items_per_core_per_part;
+
+
+    /****************************************/
+    /**               MISC                  */
+    /****************************************/
+    tools::misc::impl::Properties getProperties() const;
+
+    /** Load config properties from a storage object.
+     * \param[in] group : group where the repartition table has to be loaded */
+    void load (tools::storage::impl::Group& group);
+
+    /** Save config properties into a storage object.
+     * \param[in] group : group where the repartition table has to be saved */
+    void save (tools::storage::impl::Group& group);
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _CONFIGURATION_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.cpp
new file mode 100644
index 0000000..e55c062
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.cpp
@@ -0,0 +1,517 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/ConfigurationAlgorithm.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/collections/impl/OAHash.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+#include <gatb/kmer/impl/LinearCounter.hpp>
+
+#include <cmath>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace kmer          {
+namespace impl          {
+/********************************************************************************/
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+/********************************************************************************/
+
+#define DEBUG(a)  //printf a
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+// estimated the number of distinct kmers in a dataset
+// wrapper around a Linear Counter. Adapted from Kmergenie code.
+// why not a hyperloglog? it seems that the transition from the 32bit-hash initial implementation to 64bits, and supporting billions of elements, is nontrivial, so i didn't bother
+// probably deserves to be in its own file
+template<size_t span>
+class EstimateNbDistinctKmers
+{
+public:
+
+    /** Shortcut. */
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::ModelDirect     ModelDirect;
+    typedef typename Kmer<span>::ModelCanonical  ModelCanonical;
+#ifdef NONCANONICAL 
+    typedef typename Kmer<span>::template ModelMinimizer <ModelDirect>   Model;
+#else
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   Model;
+#endif
+    typedef typename Model::Kmer                        KmerType;
+
+    /** */
+    void estimate()
+    {
+        nb_distinct_kmers =(unsigned long)( (float)(linearCounter->count( )) * ((float)nbKmersTotal / (float)nbProcessedKmers)); // dubious linear extrapolation, that's all I got
+
+        abs_error = abs((long)(nb_distinct_kmers-previous_nb_distinct_kmers));
+
+        previous_nb_distinct_kmers = nb_distinct_kmers;
+    }
+
+    /** */
+    void operator() (Sequence& sequence)
+    {
+        /** We build the kmers from the current sequence. */
+        if (model.build (sequence.getData(), kmers) == false)  {  throw "reached EOF"; return; }
+
+        /** We loop over the kmers. */
+        for (size_t i=0; i<kmers.size(); i++)
+        {
+            linearCounter->add((kmers[i].value()));
+
+
+            // heuristics to stop early, i found that it's inaccurate with low coverage (e.g. on dsk/test/FiftyK.fastq)
+            /*
+            if (nbProcessedReads % eval_every_N_reads == 0 )
+            {
+
+                // let's see if the estimation converges..
+                // the following stopping condition will grossly over-estimate the number of distinct kmers
+                // but I expect the correct result to be in the same order of magnitude
+                // and better to overestimate than underestimate (for both dsk and kmergenie)
+                   estimate();
+                   bool debug = true;
+                   if (debug)
+                       printf("linear estimator at %ld kmers, number of distinct kmers estimated now: %ld, abs error: %ld\n",nbProcessedKmers, nb_distinct_kmers, abs_error);
+                   if (abs_error < previous_nb_distinct_kmers/20) // 5% error
+                   {
+                       throw "LinearCounter converged"; // well, "converged" is a big word
+                       return;
+                   }
+                   if (!linearCounter->is_accurate())
+                   {
+                   printf("LinearCounter is inaccurate";
+                   return;
+                   }
+
+            }*/
+
+        }
+        nbProcessedKmers += kmers.size();
+        nbProcessedReads++;
+        //if (nbProcessedReads % 100000 == 0) printf("nb: %ld\n",nbProcessedReads);
+
+        // disabled progress
+        //if (nbCurProgressKmers > 500000)   {  _progress.inc (nbCurProgressKmers);  nbCurProgressKmers = 0;  }
+    }
+
+    EstimateNbDistinctKmers (Model& model, u_int32_t max_memory, unsigned long nb_kmers_total, tools::dp::IteratorListener* progress)
+        : model(model),  eval_every_N_reads(10000000),   nbKmersTotal(nb_kmers_total),
+        nbProcessedKmers(0), nbCurProgressKmers(0), previous_nb_distinct_kmers(0), nbProcessedReads(0), abs_error(0)
+        //, _progress  (progress,System::thread().newSynchronizer())
+    {
+        unsigned long size_linearCounter; // (in bits)
+        /* let's set it to just use half of all memory available at most, ok? this isn't very robust for huge dataset, so to be tested*/
+        /* if it's a tiny dataset, let's set it to total number of kmers */
+        size_linearCounter = std::min( nb_kmers_total, (unsigned long) (max_memory*8*1024*1024/2) );
+        linearCounter =  new LinearCounter<span>(size_linearCounter);
+    }
+
+    unsigned long getEstimation()
+    {
+        estimate();
+        // soo.. if it's not accurate, let's assume we have a hugeload of kmers, and let's be safe, we return the total number of kmers
+        if (!linearCounter->is_accurate())
+        {
+            cout << "Warning: linear counter was not accurate, returning worst-case estimation of number of distinct kmers";
+            return nbKmersTotal;
+        }
+        return nb_distinct_kmers;
+    }
+
+private:
+
+    /** Local resources. */
+    Model&    model;
+    unsigned long nbProcessedReads, nbProcessedKmers;
+    unsigned long nbCurProgressKmers;
+    unsigned long nbKmersTotal;
+    unsigned long abs_error;
+    vector<KmerType> kmers;
+    LinearCounter<span> *linearCounter;
+    int eval_every_N_reads;
+    unsigned long previous_nb_distinct_kmers, nb_distinct_kmers;
+};
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+ConfigurationAlgorithm<span>::ConfigurationAlgorithm (bank::IBank* bank, IProperties* input)
+    : Algorithm("configuration", -1, input), _bank(0), _input (0)
+{
+    setBank  (bank);
+    setInput (input);
+
+    _config._kmerSize           = input->getInt (STR_KMER_SIZE);
+    _config._minim_size         = input->getInt (STR_MINIMIZER_SIZE);
+    _config._repartitionType    = input->getInt (STR_REPARTITION_TYPE);
+    _config._minimizerType      = input->getInt (STR_MINIMIZER_TYPE);
+
+    parse (input->getStr (STR_SOLIDITY_KIND), _config._solidityKind);
+
+    _config._max_disk_space     = input->getInt (STR_MAX_DISK);
+    _config._max_memory         = input->getInt (STR_MAX_MEMORY);
+    _config._nbCores            = input->get(STR_NB_CORES) ? input->getInt(STR_NB_CORES) : 0;
+
+    _config._abundance = getSolidityThresholds(input);
+	
+	if( _config._solidityKind == KMER_SOLIDITY_CUSTOM )
+		_config._solidVec = getSolidityCustomVector(input);
+
+    if (_config._nbCores == 0)  { _config._nbCores = system::impl::System::info().getNbCores(); }
+
+    _config._nb_partitions_in_parallel = _config._nbCores;
+
+    _config._nb_bits_per_kmer = Type::getSize();
+    
+    std::string storage_type = input->getStr(STR_STORAGE_TYPE);
+    _config._storage_type = (storage_type == "hdf5") ? tools::storage::impl::STORAGE_HDF5 : tools::storage::impl::STORAGE_FILE;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+ConfigurationAlgorithm<span>::~ConfigurationAlgorithm ()
+{
+    setBank  (0);
+    setInput (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void ConfigurationAlgorithm<span>::execute ()
+{
+    /** By default, we want to have mmers of size 8. However (for unit tests for instance),
+     * we may need to have kmer sizes less than 8; in such a case, we set by convention m=k-1. */
+    if (_config._minim_size == 0)  {   _config._minim_size = 8;  }
+
+    _config._minim_size = std::min ((int)_config._kmerSize-1, (int)_config._minim_size);
+
+    /** We get some information about the bank. */
+    _bank->estimate (_config._estimateSeqNb, _config._estimateSeqTotalSize, _config._estimateSeqMaxSize);
+
+    /** We get the number of sub banks. */
+    _config._nb_banks = _bank->getCompositionNb();
+
+    /** We memorize the number of abundance min values set by the user.
+     * Note that it can be lower than the number of banks. */
+    _config._abundanceUserNb = _config._abundance.size();
+
+    if (_config._abundanceUserNb == 0)  {  throw system::Exception("Kmer solidity has no defined value");  }
+
+    if (_config._abundanceUserNb > _config._nb_banks)
+    {
+        throw system::Exception ("Kmer solidity has more thresholds (%d) than banks (%d)",  _config._abundanceUserNb, _config._nb_banks);
+    }
+
+	_config._solidVecUserNb = _config._solidVec.size();
+
+	if (_config._solidityKind == KMER_SOLIDITY_CUSTOM &&  _config._solidVecUserNb != _config._nb_banks)
+	{
+		throw system::Exception ("Kmer solidity custom has different number of values  (%d) than banks (%d)",  _config._solidVecUserNb, _config._nb_banks);
+	}
+	
+	if (_config._solidityKind != KMER_SOLIDITY_CUSTOM )
+	{
+		_config._solidVec = std::vector<bool> (_config._nb_banks,true);
+	}
+	
+    /** We complete missing thresholds with the value of the last one. */
+    if (_config._abundanceUserNb < _config._nb_banks)
+    {
+        CountNumber lastValueMin = _config._abundance[_config._abundanceUserNb-1].getBegin();
+        CountNumber lastValueMax = _config._abundance[_config._abundanceUserNb-1].getEnd();
+
+        for (size_t i=_config._abundanceUserNb; i<_config._nb_banks; i++)
+        {
+            _config._abundance.push_back (tools::misc::CountRange (lastValueMin, lastValueMax));
+        }
+    }
+
+    /** Some checks. */
+    if (_config._estimateSeqNb==0)  { throw Exception ("Empty bank"); }
+
+    // We get the available space (in MBytes) of the current directory.
+    u_int64_t available_space_min = 2000;
+    _config._available_space = System::file().getAvailableSpace (System::file().getCurrentDirectory()) / 1024;
+
+    size_t meanSeqLen = (size_t) ( (double) _config._estimateSeqTotalSize / (double) _config._estimateSeqNb);
+    size_t usedSeqLen = meanSeqLen > _config._kmerSize ? meanSeqLen : _config._kmerSize; // the latter used to be estimated max seq size, but that was too big of an overestimation in some cases (think one large sequence and plenty of sequences of length k-1). Let's see if setting to kmerSize works.
+
+    int64_t kmersNb = (usedSeqLen - _config._kmerSize + 1) * _config._estimateSeqNb;
+
+    /** We have to be sure that the kmers number is ok. */
+    if (kmersNb <= 0)  {  throw Exception ("Configuration failed : estimated that longest sequence is %ld nt but kmer size is %ld", _config._estimateSeqMaxSize, _config._kmerSize);     }
+
+    /** The estimated kmers number is ok. */
+    _config._kmersNb  = kmersNb;
+
+    _config._volume =  _config._kmersNb * sizeof(Type) / MBYTE;  // in MBytes
+
+    if (_config._volume == 0)   { _config._volume = 1; }    // tiny files fix
+
+    u_int64_t volume_minim = _config._volume * 0.5 *1.2  ; //0.5 for using kxmers   1.2 if bad repartition of minimizers ( todo sampling to assert ram usage)
+
+    if (volume_minim == 0)   { volume_minim = 1; }    // tiny files fix
+
+    /** We get max(75%, 100% - X GB) */
+    if (_config._max_disk_space == 0)  { _config._max_disk_space = std::max ((75*_config._available_space)/100, _config._available_space-available_space_min);  }
+    if (_config._max_disk_space == 0)  { _config._max_disk_space = 10000; }
+
+    if (_config._max_memory == 0)  {  _config._max_memory = System::info().getMemoryProject(); }
+    if (_config._max_memory == 0)  {  _config._max_memory = 5000; }
+
+    /* make sure to not use more mem than system, when max_memory has default value (useful for docker images) */
+    if (_config._max_memory == 5000)  {
+        unsigned long system_mem = System::info().getMemoryPhysicalTotal() / MBYTE;
+        if (_config._max_memory > (system_mem * 2) / 3)
+        {
+            _config._max_memory = (system_mem * 2) / 3;
+            if (_config._max_memory < 4500) // don't print a message if we were close to 5 GB anyway
+                cout << "Warning: default memory usage (5000 MB) is close or above system max, setting memory to: " << _config._max_memory << " MB" << endl;
+        }
+    }
+
+    assert (_config._max_disk_space > 0);
+
+    _config._nb_passes = ( (_config._volume/4) / _config._max_disk_space ) + 1; //minim, approx volume /switched to approx /4 (was/3) because of more efficient superk storage
+    //_nb_passes = 1; //do not constrain nb passes on disk space anymore (anyway with minim, not very big)
+    //increase it only if ram issue
+
+    //printf("_volume  %lli volume_minim %lli _max_disk_space %lli  _nb_passes init %i  \n", _volume,volume_minim,_max_disk_space,_nb_passes);
+    size_t max_open_files = System::file().getMaxFilesNumber() / 2;
+
+
+    if (_config._storage_type == tools::storage::impl::STORAGE_FILE)
+    {
+        std::cout << "using less max_open_open files (" << max_open_files << "), by 3x, due to storage file setting" << std::endl;
+        max_open_files /= 3; // will need to open twice in STORAGE_FILE instead of HDF5, so this adjustment is needed. needs to be fixed later by putting partitions inside the same file. but i'd rather not do it in the current messy collection/group/partition hdf5-inspired system. overall, that's a FIXME
+    }
+
+#if 0
+    /* disabled by default; this was an experiment */
+    float est_volume_distinct_ratio;
+    if (_flagEstimateNbDistinctKmers)
+    {
+        /* we estimate the volume of distinct kmers vs total number of kmers.
+         * we store it in the variable "est_volume_distinct_ratio"
+         * to compute it, we need a linear counter, let's call it now */
+
+        TIME_INFO (getTimeInfo(), "estimate_distinct_kmers");
+        Iterator<Sequence>* itSeq = _bank->iterator();
+        LOCAL (itSeq);
+
+        //_progress->setMessage (progressFormat0); // not touching progress here anymore
+        Model model (_kmerSize, _minim_size);
+        EstimateNbDistinctKmers<span> estimate_nb_distinct_kmers_function(model, _max_memory, kmersNb, _progress);
+
+        /** We launch the iteration of the sequences iterator with the created functors. */
+        try {
+            itSeq->iterate (estimate_nb_distinct_kmers_function);
+        }
+        catch (const char* except)
+        {
+
+        }
+        _estimatedDistinctKmerNb = estimate_nb_distinct_kmers_function.getEstimation();
+        est_volume_distinct_ratio = (float) _estimatedDistinctKmerNb / (float)kmersNb;
+        //est_volume_distinct_ratio = 1; // for debug
+        /* est_volume_distinct_ratio == 1 mean that we guarantee worst case the memory usage,
+           the value mean that, on average, a k-mer will be seen 'est_volume_distinct_ratio' times */
+        // if wrongly estimated, the error 'OAHash: max rehashes..' can happen
+        printf ("LinearCounter done, estimated %ld number of distinct kmers, ratio to total number of kmers: %.2f\n", (long)_estimatedDistinctKmerNb, est_volume_distinct_ratio);
+    }
+#endif
+    u_int64_t volume_per_pass;
+    do  {
+
+        assert (_config._nb_passes > 0);
+        volume_per_pass = volume_minim / _config._nb_passes;
+
+        assert (_config._max_memory > 0);
+        //printf("volume_per_pass %lli  _nbCores %zu _max_memory %i \n",volume_per_pass, _nbCores,_max_memory);
+
+        // _nb_partitions  = ( (volume_per_pass*_nbCores) / _max_memory ) + 1;
+        _config._nb_partitions  = ( ( volume_per_pass* _config._nb_partitions_in_parallel) / _config._max_memory ) + 1;
+
+        //printf("nb passes  %i  (nb part %i / %zu)\n",_nb_passes,_nb_partitions,max_open_files);
+        //_nb_partitions = max_open_files; break;
+
+        if (_config._nb_partitions >= max_open_files && _config._nb_partitions_in_parallel >1)     { _config._nb_partitions_in_parallel  = _config._nb_partitions_in_parallel /2;  }
+        else if (_config._nb_partitions >= max_open_files && _config._nb_partitions_in_parallel == 1)   { _config._nb_passes++;  }
+        else                                                                            { break;         }
+
+        //printf("update nb passes  %i  (nb part %i / %zu)\n",_nb_passes,_nb_partitions,max_open_files);
+    } while (1);
+
+    //if (_config._nb_partitions < 50 &&  (max_open_files - _config._nb_partitions  > 30) ) _config._nb_partitions += 30; //a hack to have more partitions than 30
+
+    //round nb parti to upper multiple of _nb_partitions_in_parallel if possible
+    int  incpart = _config._nb_partitions_in_parallel - _config._nb_partitions % _config._nb_partitions_in_parallel;
+    incpart = incpart % _config._nb_partitions_in_parallel;
+    if(((int)max_open_files - (int)_config._nb_partitions  > incpart)) _config._nb_partitions+= incpart ;
+
+    //_nb_partitions_in_parallel = 1 ;
+
+    //then put _nbCores_per_partition
+
+    _config._nbCores_per_partition =  _config._nbCores / _config._nb_partitions_in_parallel ; //how to best distrib available cores ?
+
+    // with this formula we'll sometimes use less than _nbCores (maybe enforce _nb_partitions_in_parallel is power of two ?)
+    DEBUG (("ConfigurationAlgorithm<span>::execute  _nbCores %zu  _nb_partitions_in_parallel %zu   _nbCores_per_partition %zu  nb part %u nb passes %i\n",
+        _config._nbCores, _config._nb_partitions_in_parallel, _config._nbCores_per_partition, _config._nb_partitions, _config._nb_passes
+    ));
+
+    assert(_config._nbCores_per_partition > 0);
+
+    /* optimize the number of cached items per partition per core */
+    /* add more items to partition cache as long as the total memory of cached items 
+     * don't use more than a 10th of the requested memory (accepatble overhead) 
+     * detail of the memory usage of items in partitions cache:
+     * number of cached items * number of partition * number of cores * size of a kmer
+     * e.g. (4096 kmers * 8 bytes = 32 KB per partion) * 6000 partitions * 32 cores = 6 GB of buffer */
+
+    uint64_t memoryUsageCachedItems;
+    _config._nb_cached_items_per_core_per_part = 1 << 8; // cache at least 256 items (128 here, then * 2 in the next while loop)
+
+    do
+    {
+        _config._nb_cached_items_per_core_per_part *= 2;
+        memoryUsageCachedItems = 1LL * _config._nb_cached_items_per_core_per_part *_config._nb_partitions * _config._nbCores * sizeof(Type); 
+    }
+    while (memoryUsageCachedItems < _config._max_memory * MBYTE / 10);
+        
+    DEBUG (("ConfigurationAlgorithm<span>::execute  _config._nb_cached_items_per_core_per_part : %zu ; total memory usage of cached items : %lld MB \n",
+        _config._nb_cached_items_per_core_per_part, memoryUsageCachedItems / MBYTE
+    ));
+
+
+    /** We set the config as set. */
+    _config._isComputed = true;
+
+    /** We collect some statistics. */
+    getInfo()->add (1, _config.getProperties());
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+vector<CountRange> ConfigurationAlgorithm<span>::getSolidityThresholds (IProperties* params)
+{
+    vector<CountRange> thresholds;
+
+    /** We get the abundance max value. */
+    u_int64_t abundanceMax = params->getInt(STR_KMER_ABUNDANCE_MAX);
+
+    /** We split the abundance min string. */
+    TokenizerIterator it (params->getStr(STR_KMER_ABUNDANCE_MIN).c_str(), ",");
+    for (it.first(); !it.isDone(); it.next())
+    {
+        CountNumber val = 0;
+
+        if (strcmp(it.item(),"auto")==0)  { val = -1; }
+        else                              { val = atoll (it.item());  }
+
+        thresholds.push_back (CountRange(val, abundanceMax));
+    }
+
+    return thresholds;
+}
+
+	
+	/*********************************************************************
+	 ** METHOD  :
+	 ** PURPOSE :
+	 ** INPUT   :
+	 ** OUTPUT  :
+	 ** RETURN  :
+	 ** REMARKS :
+	 *********************************************************************/
+	
+template<size_t span>
+	std::vector<bool> ConfigurationAlgorithm<span>::getSolidityCustomVector (IProperties* params)
+	{
+		std::vector<bool> solidVec;
+
+		std::string solidList = params->getStr (STR_SOLIDITY_CUSTOM);
+		for ( std::string::iterator it=solidList.begin(); it!=solidList.end(); ++it)
+		{
+			solidVec.push_back(*it =='1');
+		}
+		return solidVec;
+	}
+	
+	
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.hpp
new file mode 100644
index 0000000..4bb589a
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/ConfigurationAlgorithm.hpp
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _CONFIGURATION_ALGORITHM_HPP_
+#define _CONFIGURATION_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+
+#include <gatb/bank/api/IBank.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+template<size_t span>
+class ConfigurationAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** */
+    ConfigurationAlgorithm (bank::IBank* bank, tools::misc::IProperties* input);
+
+    /** */
+    ~ConfigurationAlgorithm ();
+
+    /** */
+    void execute ();
+
+    /** */
+    const Configuration&  getConfiguration() const { return _config; }
+
+private:
+    /** */
+    static std::vector<tools::misc::CountRange> getSolidityThresholds (tools::misc::IProperties* params);
+
+	static std::vector<bool> getSolidityCustomVector (tools::misc::IProperties* params);
+
+    /** Shortcut. */
+    typedef typename Kmer<span>::Type Type;
+
+    Configuration _config;
+
+    bank::IBank* _bank;
+    void setBank (bank::IBank* bank) { SP_SETATTR(bank); }
+
+    tools::misc::IProperties* _input;
+    void setInput (tools::misc::IProperties* input)  { SP_SETATTR(input); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _CONFIGURATION_ALGORITHM_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessor.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessor.hpp
new file mode 100644
index 0000000..6c6eaae
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessor.hpp
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_HPP_
+#define _COUNT_PROCESSOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/CountProcessorChain.hpp>
+#include <gatb/kmer/impl/CountProcessorProxy.hpp>
+#include <gatb/kmer/impl/CountProcessorHistogram.hpp>
+#include <gatb/kmer/impl/CountProcessorDump.hpp>
+#include <gatb/kmer/impl/CountProcessorSolidity.hpp>
+#include <gatb/kmer/impl/CountProcessorCutoff.hpp>
+
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorAbstract.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorAbstract.hpp
new file mode 100644
index 0000000..a68a6ed
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorAbstract.hpp
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_ABSTRACT_HPP_
+#define _COUNT_PROCESSOR_ABSTRACT_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/api/ICountProcessor.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** Abstract implementation of ICountProcessor interface.
+ */
+template<size_t span>
+class CountProcessorAbstract : public ICountProcessor<span>
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor. */
+    CountProcessorAbstract (const std::string& name="processor") : _name(name)  {}
+
+    /** Destructor. */
+    virtual ~CountProcessorAbstract ()  {}
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::begin */
+    virtual void begin(const Configuration& config) {}
+
+    /** \copydoc ICountProcessor<span>::end */
+    virtual void end  () {}
+
+    /** \copydoc ICountProcessor<span>::end */
+    virtual void beginPass (size_t passId) {}
+
+    /** \copydoc ICountProcessor<span>::end */
+    virtual void endPass   (size_t passId) {}
+
+    /** \copydoc ICountProcessor<span>::finishClones */
+    virtual void finishClones (std::vector<ICountProcessor<span>*>& clones)  {}
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::beginPart */
+    virtual void beginPart (size_t passId, size_t partId, size_t cacheSize, const char* name) {}
+
+    /** \copydoc ICountProcessor<span>::endPart */
+    virtual void endPart   (size_t passId, size_t partId) {}
+
+    /** \copydoc ICountProcessor<span>::process */
+    virtual bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum=0)  {  return true;  }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getName */
+    virtual std::string getName() const  { return _name; }
+
+    /** \copydoc ICountProcessor<span>::setName */
+    virtual void setName (const std::string& name) { _name = name; }
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    virtual tools::misc::impl::Properties getProperties() const { return tools::misc::impl::Properties(); }
+
+    /** \copydoc ICountProcessor<span>::getInstances */
+    virtual std::vector<ICountProcessor<span>*> getInstances () const
+    {
+        std::vector<ICountProcessor<span>*> res;
+        res.push_back((CountProcessorAbstract*)this);
+        return res;
+    }
+
+private:
+
+    std::string _name;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_ABSTRACT_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorChain.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorChain.hpp
new file mode 100644
index 0000000..9153927
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorChain.hpp
@@ -0,0 +1,180 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_CHAIN_HPP_
+#define _COUNT_PROCESSOR_CHAIN_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/CountProcessorAbstract.hpp>
+#include <cstdarg>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** The CountProcessorChain implementation allows to link several instances of
+ * ICountProcessor. When such an instance is called via 'process', the first item
+ * of the list is called via 'process'; if it returns true, the next item in the list
+ * is called and so on; if it returns false, the chain is stopped. This class is used
+ * for the definition of the "DSK" count processor (histogram -> solidity -> dump)
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class CountProcessorChain : public CountProcessorAbstract<span>
+{
+public:
+
+    typedef ICountProcessor<span> CountProcessor;
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor. */
+    CountProcessorChain (const std::vector<CountProcessor*> items , std::vector<bool>& solidVec) : _items(items) , _solidVec(solidVec) {}
+
+    /** Constructor. */
+    CountProcessorChain (CountProcessor* first, ...)
+    {
+        va_list ap;
+        va_start (ap, first);
+        for (CountProcessor* loop = first; loop != 0; loop = va_arg(ap, CountProcessor*))
+        {
+            _items.push_back (loop);  loop->use();
+        }
+        va_end (ap);
+    }
+
+    /** Destructor. */
+    virtual ~CountProcessorChain()  {  for (size_t i=0; i<_items.size(); i++)  {  _items[i]->forget(); }  }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::begin */
+    void begin (const Configuration& config)  {
+  		for (size_t i=0; i<_items.size(); i++)  {  _items[i]->begin (config);  }
+		this->_solidVec = config._solidVec;
+
+	}
+
+    /** \copydoc ICountProcessor<span>::end */
+    void end   ()  {  for (size_t i=0; i<_items.size(); i++)  {  _items[i]->end   ();         }  }
+
+    /** \copydoc ICountProcessor<span>::clone */
+    CountProcessorAbstract<span>* clone ()
+    {
+        std::vector<CountProcessor*> clones;
+        for (size_t i=0; i<_items.size(); i++)  {  clones.push_back (_items[i]->clone());  }
+        return new CountProcessorChain (clones,_solidVec);
+    }
+
+    /** \copydoc ICountProcessor<span>::finishClones */
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        /** We transform the incoming instances in the correct type. */
+        std::vector<CountProcessorChain*> typedClones;
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            if (CountProcessorChain* c = dynamic_cast<CountProcessorChain*>(clones[i]))  { typedClones.push_back(c); }
+        }
+        if (typedClones.size() != clones.size()) { throw system::Exception("Error in CountProcessorChain::finishClones"); }
+
+        for (size_t i=0; i<_items.size(); i++)
+        {
+            std::vector<ICountProcessor<span>*> notifyClones (typedClones.size());
+            for (size_t j=0; j<typedClones.size(); j++)  {  notifyClones[j] = typedClones[j]->_items[i];  }
+
+            /** We can now notify the N clones for the current ith part in the chain. */
+            _items[i]->finishClones (notifyClones);
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::beginPart */
+    void beginPart (size_t passId, size_t partId, size_t cacheSize, const char* name)
+    {
+        for (size_t i=0; i<_items.size(); i++)  {  _items[i]->beginPart (passId, partId, cacheSize, name);  }
+    }
+
+    /** \copydoc ICountProcessor<span>::endPart */
+    void endPart   (size_t passId, size_t partId)
+    {
+        for (size_t i=0; i<_items.size(); i++)  {  _items[i]->endPart   (passId, partId);  }
+    }
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum=0)
+    {
+        if (sum==0)  { sum = this->computeSum(count); }
+        bool res = true;
+        for (size_t i=0; res && i<_items.size(); i++)  {  res = _items[i]->process (partId, kmer, count, sum);  }
+        return res;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const
+    {
+        tools::misc::impl::Properties result;
+        for (size_t i=0; i<_items.size(); i++)  {  result.add (0, _items[i]->getProperties());  }
+        return result;
+    }
+
+    /** \copydoc ICountProcessor<span>::getInstances */
+    std::vector<CountProcessor*> getInstances () const
+    {
+        std::vector<CountProcessor*> res;
+        for (size_t i=0; i<_items.size(); i++)
+        {
+            std::vector<CountProcessor*> c = _items[i]->getInstances();
+            for (size_t i=0; i<c.size(); i++)  { res.push_back(c[i]); }
+        }
+        return res;
+    }
+
+protected:
+
+    /** \copydoc ICountProcessor<span>::computeSum */
+    CountNumber computeSum (const CountVector& count) const
+    {
+        /** Optimization. */
+        if (count.size()==1)  { return count[0]; }
+        CountNumber sum=0; for (size_t k=0; k<count.size(); k++)  { if (_solidVec.at(k)) sum+=count[k]; }
+		return sum;
+    }
+
+    std::vector<CountProcessor*> _items;
+	
+	std::vector<bool> _solidVec;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_CHAIN_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorCutoff.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorCutoff.hpp
new file mode 100644
index 0000000..d5a116d
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorCutoff.hpp
@@ -0,0 +1,155 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_CUTOFF_HPP_
+#define _COUNT_PROCESSOR_CUTOFF_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/CountProcessorAbstract.hpp>
+#include <gatb/kmer/impl/CountProcessorHistogram.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/misc/impl/Histogram.hpp>
+#include <cstdarg>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** The CountProcessorCutoff implementation collects information about the
+ * kmers distribution. It feeds a IHistogram instance during the 'process' method.
+ *
+ * At the end of the algorithm, it provides information such as the best cutoff
+ * (ie a "good" abundance min parameter).
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class CountProcessorCutoff : public CountProcessorAbstract<span>
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor for the prototype instance. */
+    CountProcessorCutoff (size_t nbBanks) : CountProcessorAbstract<span>("cutoff")
+    {
+        /** We create one histogram instance per bank. */
+        for (size_t i=0; i<nbBanks; i++)  {  _histogramProcessors.push_back (new CountProcessorHistogram<span> ());  }
+    }
+
+    /** Constructor for the cloned instances. */
+    CountProcessorCutoff (const std::vector <CountProcessorHistogram<span>* >& histogramProcessors)
+        : CountProcessorAbstract<span>("cutoff"), _histogramProcessors(histogramProcessors) {}
+
+    /** Destructor. */
+    virtual ~CountProcessorCutoff ()
+    {
+        for (size_t i=0; i<_histogramProcessors.size(); i++)  {  delete _histogramProcessors[i];  }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::clone */
+    CountProcessorAbstract<span>* clone ()
+    {
+        // We clone each CountProcessorHistogram
+        std::vector <CountProcessorHistogram<span>* > clones;
+        for (size_t i=0; i<_histogramProcessors.size(); i++)  {  clones.push_back ((CountProcessorHistogram<span>*)_histogramProcessors[i]->clone());  }
+
+        // We return an instance of our custom processor with the CountProcessorHistogram clones
+        return new CountProcessorCutoff (clones);
+    }
+
+    /** \copydoc ICountProcessor<span>::end */
+    void endPass (size_t passId)
+    {
+        size_t _min_auto_threshold = 3;
+
+        _cutoffs.clear();
+
+        for (size_t i=0; i<_histogramProcessors.size(); i++)
+        {
+            /** Shortcut. */
+            gatb::core::tools::misc::IHistogram* histogram = _histogramProcessors[i]->getHistogram();
+
+            histogram->compute_threshold (_min_auto_threshold);
+
+            _cutoffs.push_back (histogram->get_solid_cutoff());
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        // In case we have only one bank, we use the sum by convention. Note that it can still
+        // be the sum of several bank counts (here the _histogramProcessors.size() value may not reflect
+        // the actual number of banks processed, see SortingCountAlgorithm<span>::getDefaultProcessorVector)
+
+        if (_histogramProcessors.size()==1)
+        {
+            sum=0; for (size_t i=0; i<count.size(); i++)  { sum += count[i]; }
+            _histogramProcessors[0]->process (partId, kmer, count, sum);
+        }
+        else
+        {
+            for (size_t i=0; i<_histogramProcessors.size(); i++)  {  _histogramProcessors[i]->process (partId, kmer, count, count[i]);  }
+        }
+        return true;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const
+    {
+        tools::misc::impl::Properties result;
+
+        std::stringstream ss;  for (size_t i=0; i<_cutoffs.size(); i++)  { ss << _cutoffs[i] << " "; }
+        result.add (0, "values", "%s", ss.str().c_str());
+
+        return result;
+    }
+
+    /** */
+    std::vector<CountNumber> getCutoffs()  {  return _cutoffs;  }
+
+private:
+
+    std::vector<CountProcessorHistogram<span>* > _histogramProcessors;
+
+    std::vector<CountNumber> _cutoffs;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_CUTOFF_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorDump.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorDump.hpp
new file mode 100644
index 0000000..9d252c0
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorDump.hpp
@@ -0,0 +1,224 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_DUMP_HPP_
+#define _COUNT_PROCESSOR_DUMP_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/CountProcessorAbstract.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** The CountProcessorDump implementation dumps kmers on file system through
+ * a Partition object.
+ *
+ * The number of partitions is not known at creation and is received through a
+ * call to the 'begin' method; there, the number of partitions is used to
+ * configure the Partition object.
+ *
+ * A clone instance is dedicated to one partition, which is configured when the
+ * method 'beginPart' is called on a cloned instance.
+ *
+ * The CountProcessorDump implementation is likely to be used in a CountProcessorChain,
+ * like this : solidity -> dump.  It allows to dump on file system only solid kmers.
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class CountProcessorDump : public CountProcessorAbstract<span>
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Count Count;
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor */
+    CountProcessorDump (
+        tools::storage::impl::Group&            group,
+        size_t                                  kmerSize,
+        system::ISynchronizer*                  synchronizer = 0,
+        tools::storage::impl::Partition<Count>* solidCounts  = 0,
+        size_t                                  nbPartsPerPass = 0
+    )
+        : _group(group), _kmerSize(kmerSize), _nbPartsPerPass(nbPartsPerPass), _synchronizer(0), _solidCounts(0), _solidKmers(0)
+    {
+        setSolidCounts  (solidCounts);
+        setSynchronizer (synchronizer);
+    }
+
+    /** Destructor */
+    virtual ~CountProcessorDump ()
+    {
+        setSolidCounts(0);
+        setSolidKmers (0);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::begin */
+    void begin (const Configuration& config)
+    {
+        /** We remember the number of partitions for one pass. */
+        _nbPartsPerPass = config._nb_partitions;
+
+        /** We compute the number of partitions. */
+        size_t nbTotalPartitions = config._nb_partitions * config._nb_passes;
+
+        // We create the partition into the dsk group
+        setSolidCounts (& _group.getPartition<Count> ("solid", nbTotalPartitions));
+
+        /** We save (as metadata) some information. */
+        _group.addProperty ("kmer_size", tools::misc::impl::Stringify::format("%d", _kmerSize));
+    }
+
+    /** \copydoc ICountProcessor<span>::clones */
+    CountProcessorAbstract<span>* clone ()
+    {
+        /** Note : we share the synchronizer for all the clones. */
+        return new CountProcessorDump (_group, _kmerSize, _synchronizer, _solidCounts, _nbPartsPerPass);
+    }
+
+    /** \copydoc ICountProcessor<span>::finishClones */
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            /** We have to recover type information. */
+            if (CountProcessorDump* clone = dynamic_cast<CountProcessorDump*> (clones[i]))
+            {
+                for (std::map<std::string,size_t>::iterator it = clone->_namesOccur.begin(); it != clone->_namesOccur.end(); ++it)
+                {
+                    this->_namesOccur[it->first] += it->second;
+                }
+            }
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::beginPart */
+    void beginPart (size_t passId, size_t partId, size_t cacheSize, const char* name)
+    {
+        /** We get the actual partition idx in function of the current partition AND pass identifiers. */
+        size_t actualPartId = partId + (passId * _nbPartsPerPass);
+
+        /** We get a handle on the current solid bag (with a cache). */
+        setSolidKmers (new tools::collections::impl::BagCache<Count> (& (*_solidCounts)[actualPartId], cacheSize, _synchronizer));
+
+        /** We update some stats (want to know how many "hash" or "vector" partitions we use). */
+        _namesOccur[name] ++;
+    }
+
+    /** \copydoc ICountProcessor<span>::endPart */
+    void endPart (size_t passId, size_t partId)
+    {
+        /** We flush the current collection for the partition just processed. */
+        _solidKmers->flush();
+    }
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        this->_solidKmers->insert (Count(kmer,sum));
+        return true;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const
+    {
+        tools::misc::impl::Properties result;
+
+        size_t smallestPartition = ~0;
+        size_t biggestPartition  = 0;
+        for (size_t i=0; i<_solidCounts->size(); i++)
+        {
+            size_t currentNb = (*_solidCounts)[i].getNbItems();
+            smallestPartition = std::min (smallestPartition, currentNb);
+            biggestPartition  = std::max (biggestPartition,  currentNb);
+        }
+
+        result.add (0, "partitions");
+        result.add (1, "nb_partitions", "%ld", _solidCounts->size());
+        result.add (1, "nb_items",      "%ld", _solidCounts->getNbItems());
+        result.add (1, "part_biggest",  "%ld", biggestPartition);
+        result.add (1, "part_smallest", "%ld", smallestPartition);
+
+        if (_solidCounts->size())
+        {
+            result.add (1, "part_mean", "%.1f", (double)_solidCounts->getNbItems() / (double)_solidCounts->size());
+        }
+
+        result.add (1, "kind");
+        for (std::map<std::string,size_t>::const_iterator it = _namesOccur.begin(); it != _namesOccur.end(); ++it)
+        {
+            result.add (2, it->first.c_str(), "%d", it->second);
+        }
+
+        return result;
+    }
+
+    /** Get the partition of counts.
+     * \return the Partition<Count> instance */
+    tools::storage::impl::Partition<Count>* getSolidCounts () { return _solidCounts; }
+
+    /** Get the number of items.
+     * \return the total number of items in the partition. */
+    u_int64_t getNbItems ()  { return _solidCounts ? _solidCounts->getNbItems() : 0; }
+
+private:
+
+    tools::storage::impl::Group& _group;
+
+    size_t _kmerSize;
+
+    size_t _nbPartsPerPass;
+
+    system::ISynchronizer* _synchronizer;
+    void setSynchronizer (system::ISynchronizer* synchronizer)  { SP_SETATTR(synchronizer); }
+
+    tools::storage::impl::Partition<Count>* _solidCounts;
+    void setSolidCounts (tools::storage::impl::Partition<Count>* solidCounts) { SP_SETATTR(solidCounts); }
+
+    tools::collections::Bag<Count>* _solidKmers;
+    void setSolidKmers (tools::collections::Bag<Count>* solidKmers)  {  SP_SETATTR(solidKmers);  }
+
+    std::map<std::string,size_t> _namesOccur;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_DUMP_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorHistogram.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorHistogram.hpp
new file mode 100644
index 0000000..d74c14c
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorHistogram.hpp
@@ -0,0 +1,168 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_HISTOGRAM_HPP_
+#define _COUNT_PROCESSOR_HISTOGRAM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/CountProcessorAbstract.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/misc/impl/Histogram.hpp>
+#include <cstdarg>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** The CountProcessorHistogram implementation collects information about the
+ * kmers distribution. It feeds a IHistogram instance during the 'process' method.
+ *
+ * At the end of the algorithm, it provides information such as the best cutoff
+ * (ie a "good" abundance min parameter).
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class CountProcessorHistogram : public CountProcessorAbstract<span>
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor. */
+    CountProcessorHistogram (
+        tools::storage::impl::Group* group = 0,
+        size_t histoMax                    = 10000,
+        size_t min_auto_threshold          = 3
+    )
+        : _group(group), _histogram(0), _min_auto_threshold(min_auto_threshold)
+    {
+        setHistogram (new tools::misc::impl::Histogram (histoMax));
+    }
+
+    /** Constructor. */
+    CountProcessorHistogram (
+        tools::storage::impl::Group* group,
+        tools::misc::IHistogram* histogram,
+        size_t min_auto_threshold = 3
+    )
+        : _group(group), _histogram(0), _min_auto_threshold(min_auto_threshold)
+    {
+        setHistogram (histogram);
+    }
+
+    /** Destructor. */
+    virtual ~CountProcessorHistogram ()
+    {
+        setHistogram(0);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::end */
+    void end ()
+    {
+        using namespace tools::math;
+
+        /** compute auto cutoff **/
+        _histogram->compute_threshold (_min_auto_threshold);
+
+        if (_group != 0)
+        {
+            /** We save the histogram if any. */
+            _histogram->save (*_group);
+
+            /** store auto cutoff and corresponding number of solid kmers **/
+            tools::collections::Collection<NativeInt64>& storecutoff = _group->getCollection<NativeInt64>("cutoff") ;
+            storecutoff.insert(_histogram->get_solid_cutoff());
+            storecutoff.flush();
+
+            tools::collections::Collection<NativeInt64>& storesolids = _group->getCollection<NativeInt64>("nbsolidsforcutoff") ;
+            storesolids.insert(_histogram->get_nbsolids_auto());
+            storesolids.flush();
+        }
+    }
+
+    /** \copydoc ICountProcessor<span>::clone */
+    CountProcessorAbstract<span>* clone ()
+    {
+        /** We encapsulate the histogram with a cache. */
+        return new CountProcessorHistogram (_group, new gatb::core::tools::misc::impl::HistogramCache (_histogram),  _min_auto_threshold);
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        _histogram->inc (sum);
+        return true;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const
+    {
+        tools::misc::impl::Properties result;
+
+        result.add (0, "histogram");
+        result.add (1, "cutoff",            "%ld",  _histogram->get_solid_cutoff());
+        result.add (1, "nb_ge_cutoff",      "%ld",  _histogram->get_nbsolids_auto());
+		result.add (1, "ratio_weak_volume",      "%.2f",  _histogram->get_ratio_weak());
+		
+		
+        // result->add (1, "percent_ge_cutoff", "%.1f", nbSolids > 0 ? 100.0 * (double)_histogram->get_nbsolids_auto() / (double)_bankStats.kmersNbValid : 0);
+        result.add (1, "first_peak",         "%ld",  _histogram->get_first_peak());
+
+        // double N = ((double)_histogram->get_first_peak() * _bankStats.getSeqMean()) / (_bankStats.getSeqMean() - _kmerSize + 1);
+        // if (N > 0)  {  getInfo()->add (3, "genome_size_estimate", "%.0f",  (double)_bankStats.sequencesTotalLength / N);  }
+
+        return result;
+    }
+
+    /** Get the histogram.
+     * \return the histogram instance. */
+    gatb::core::tools::misc::IHistogram* getHistogram() { return _histogram; }
+
+private:
+
+    tools::storage::impl::Group* _group;
+
+    gatb::core::tools::misc::IHistogram* _histogram;
+    void setHistogram (gatb::core::tools::misc::IHistogram* histogram)  { SP_SETATTR(histogram); }
+
+    size_t _min_auto_threshold;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_HISTOGRAM_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorProxy.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorProxy.hpp
new file mode 100644
index 0000000..32523b6
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorProxy.hpp
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_PROXY_HPP_
+#define _COUNT_PROCESSOR_PROXY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/api/ICountProcessor.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** */
+template<size_t span=KMER_DEFAULT_SPAN>
+class CountProcessorProxy : public ICountProcessor<span>
+{
+public:
+
+    typedef ICountProcessor<span> CountProcessor;
+    typedef typename Kmer<span>::Type Type;
+
+    /** Constructor. */
+    CountProcessorProxy (ICountProcessor<span>* ref) : _ref(0)  { setRef (ref); }
+
+    /** Destructor. */
+    virtual ~CountProcessorProxy()  {  setRef(0); }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::begin */
+    void begin (const impl::Configuration& config)  { _ref->begin (config); }
+
+    /** \copydoc ICountProcessor<span>::end */
+    void end   ()  { _ref->end (); }
+
+    /** \copydoc ICountProcessor<span>::beginPass */
+    void beginPass (size_t passId)  { _ref->beginPass (passId); }
+
+    /** \copydoc ICountProcessor<span>::endPass */
+    void endPass   (size_t passId)  {  _ref->endPass (passId); }
+
+    /** \copydoc ICountProcessor<span>::clone */
+    ICountProcessor<span>* clone ()  { return _ref->clone(); }
+
+    /** \copydoc ICountProcessor<span>::finishClones */
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)  { _ref->finishClones (clones); }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::beginPart */
+    void beginPart (size_t passId, size_t partId, size_t cacheSize, const char* name)  { _ref->beginPart (passId, partId, cacheSize, name); }
+
+    /** \copydoc ICountProcessor<span>::endPart */
+    void endPart   (size_t passId, size_t partId)  { _ref->endPart (passId, partId); }
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const Type& kmer, const CountVector& count, CountNumber sum=0)
+    {  return _ref->process (partId, kmer, count, sum);  }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getName */
+    std::string getName() const {  return _ref->getName(); }
+
+    /** \copydoc ICountProcessor<span>::setName */
+    void setName (const std::string& name)  { _ref->setName (name); }
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const  { return _ref->getProperties(); }
+
+    /** \copydoc ICountProcessor<span>::getInstances */
+    std::vector<ICountProcessor<span>*> getInstances () const  { return _ref->getInstances(); }
+
+protected:
+
+    ICountProcessor<span>* _ref;
+    void setRef (ICountProcessor<span>* ref) { SP_SETATTR(ref); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_PROXY_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/CountProcessorSolidity.hpp b/gatb-core/src/gatb/kmer/impl/CountProcessorSolidity.hpp
new file mode 100644
index 0000000..68ae4d4
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/CountProcessorSolidity.hpp
@@ -0,0 +1,343 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _COUNT_PROCESSOR_SOLIDITY_HPP_
+#define _COUNT_PROCESSOR_SOLIDITY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/CountProcessorAbstract.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <gatb/tools/misc/api/Range.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+class CountProcessorSolidityInfo
+{
+public:
+    CountProcessorSolidityInfo () {}
+	CountProcessorSolidityInfo (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool> solidVec) : _thresholds(thresholds), _solidVec(solidVec) {};
+
+    /** Update abundance min in the threshold ranges. */
+    void setAbundanceMin (const std::vector<CountNumber>& cutoffs)
+    {
+        if (cutoffs.size() > _thresholds.size())
+        {
+            throw system::Exception ("Unable to set abundance min values (%d values for %d banks)", cutoffs.size(), _thresholds.size());
+        }
+
+        std::vector<tools::misc::CountRange> newThresholds;
+        for (size_t i=0; i<cutoffs.size(); i++)
+        {
+            /** We change the value only if it is "auto". */
+            CountNumber abundanceMin = _thresholds[i].getBegin()==-1 ? cutoffs[i] :  _thresholds[i].getBegin();
+            newThresholds.push_back (tools::misc::CountRange(abundanceMin, _thresholds[i].getEnd() ) );
+        }
+
+        /** We may have less cutoffs than banks; we complete with the last cutoff value. */
+        tools::misc::CountRange lastRange (newThresholds[newThresholds.size()-1]);
+        for (size_t i=cutoffs.size(); i<_thresholds.size(); i++)  {  newThresholds.push_back (lastRange);  }
+
+        /** We update the thresholds for the current count processor. */
+        _thresholds = newThresholds;
+    }
+
+protected:
+    std::vector<tools::misc::CountRange> _thresholds;
+	std::vector<bool> _solidVec;
+};
+
+/********************************************************************************/
+
+/** The CountProcessorSolidityAbstract is an abstract class that factories stuff
+ * for telling whether a kmer is solid or not.
+ *
+ * Inherited classes provides (through the 'check' method) the way the kmer solidity is
+ * computed. There is one subclass per kind of kmer solidity.
+ *
+ * Technically, static polymorphism is used here through the 'check' method.
+ *
+ * Note that there exists a factory class CountProcessorSolidityFactory that manages
+ * the creation of the correct instance according to some user information.
+ */
+template<size_t span, class Derived>
+class CountProcessorSolidityAbstract : public CountProcessorAbstract<span>, public CountProcessorSolidityInfo
+{
+public:
+
+    /** Constructor for prototype instance. */
+    CountProcessorSolidityAbstract () : _total(0), _ok(0)   {}
+
+    /** Constructor for clone instance. */
+	CountProcessorSolidityAbstract (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityInfo(thresholds,solidVec), _total(0), _ok(0)   {}
+
+    /** Destructor. */
+    virtual ~CountProcessorSolidityAbstract()  {}
+
+    /********************************************************************/
+    /*   METHODS CALLED ON THE PROTOTYPE INSTANCE (in the main thread). */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::begin */
+    void begin(const Configuration& config)
+    {
+        /** We copy the abundance thresholds got during configuration. */
+        this->_thresholds = config._abundance;
+		this->_solidVec = config._solidVec;
+    }
+
+    /** \copydoc ICountProcessor<span>::clones */
+    CountProcessorAbstract<span>* clone ()  { return new Derived (_thresholds,_solidVec); }
+
+    /** \copydoc ICountProcessor<span>::finishClones */
+    void finishClones (std::vector<ICountProcessor<span>*>& clones)
+    {
+        for (size_t i=0; i<clones.size(); i++)
+        {
+            /** We have to recover type information. */
+            if (CountProcessorSolidityAbstract* clone = dynamic_cast<CountProcessorSolidityAbstract*> (clones[i]))
+            {
+                this->_total += clone->_total;
+                this->_ok    += clone->_ok;
+            }
+        }
+    }
+
+    /********************************************************************/
+    /*   METHODS CALLED ON ONE CLONED INSTANCE (in a separate thread).  */
+    /********************************************************************/
+
+    /** \copydoc ICountProcessor<span>::process */
+    bool process (size_t partId, const typename Kmer<span>::Type& kmer, const CountVector& count, CountNumber sum)
+    {
+        /** We use static polymorphism here. */
+        bool result = static_cast<Derived*>(this)->check (count, sum);
+
+        _total ++;
+        if (result)  { _ok++; }
+        return result;
+    }
+
+    /*****************************************************************/
+    /*                          MISCELLANEOUS.                       */
+    /*****************************************************************/
+
+    /** \copydoc ICountProcessor<span>::getProperties */
+    tools::misc::impl::Properties getProperties() const
+    {
+        tools::misc::impl::Properties result;
+        result.add (0, "kmers");
+        result.add (1, "solidity_kind",      "%s", this->getName().c_str());
+
+        std::stringstream ss;
+        for (size_t i=0; i<_thresholds.size(); i++)  {  ss << _thresholds[i].getBegin() << " "; }
+        result.add (1, "thresholds",         ss.str().c_str());
+
+        result.add (1, "kmers_nb_distinct",  "%ld", _total);
+        result.add (1, "kmers_nb_solid",     "%ld", _ok);
+        result.add (1, "kmers_nb_weak",      "%ld", _total - _ok);
+        if (_total > 0)  {  result.add (1, "kmers_percent_weak", "%.1f", 100.0 - 100.0 * (double)_ok / (double)_total  );  }
+
+        return result;
+    }
+
+protected:
+
+    u_int64_t _total;
+    u_int64_t _ok;
+};
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSoliditySum : public CountProcessorSolidityAbstract<span,CountProcessorSoliditySum<span> >
+{
+public:
+
+    CountProcessorSoliditySum () {}
+
+    CountProcessorSoliditySum (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityAbstract<span,CountProcessorSoliditySum<span> > (thresholds,solidVec)  {}
+
+    bool check (const CountVector& count, CountNumber sum)
+    {
+        return this->_thresholds[0].includes (sum);
+    }
+
+    std::string getName() const  { return std::string("sum"); }
+};
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSolidityMax : public CountProcessorSolidityAbstract<span,CountProcessorSolidityMax<span> >
+{
+public:
+
+    CountProcessorSolidityMax () {}
+
+	CountProcessorSolidityMax (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityAbstract<span,CountProcessorSolidityMax<span> > (thresholds,solidVec)  {}
+
+    bool check (const CountVector& count, CountNumber sum)
+    {
+        return this->_thresholds[0].includes (*std::max_element (count.begin(),count.end()));
+    }
+
+    std::string getName() const  { return std::string("max"); }
+};
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSolidityMin : public CountProcessorSolidityAbstract<span,CountProcessorSolidityMin<span> >
+{
+public:
+
+    CountProcessorSolidityMin () {}
+
+    CountProcessorSolidityMin (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityAbstract<span,CountProcessorSolidityMin<span> > (thresholds,solidVec)  {}
+
+    bool check (const CountVector& count, CountNumber sum)
+    {
+        return this->_thresholds[0].includes (*std::min_element (count.begin(),count.end()));
+    }
+
+    std::string getName() const  { return std::string("min"); }
+};
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSolidityAll : public CountProcessorSolidityAbstract<span,CountProcessorSolidityAll<span> >
+{
+public:
+
+    CountProcessorSolidityAll () {}
+
+    CountProcessorSolidityAll (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityAbstract<span,CountProcessorSolidityAll<span> > (thresholds,solidVec)  {}
+
+    bool check (const CountVector& count, CountNumber sum)
+    {
+        for (size_t i=0; i<count.size(); i++)  {  if (this->_thresholds[i].includes(count[i]) == false)   { return false; }  }
+        return true;
+    }
+
+    std::string getName() const  { return std::string("all"); }
+};
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSolidityOne : public CountProcessorSolidityAbstract<span, CountProcessorSolidityOne<span> >
+{
+public:
+
+    CountProcessorSolidityOne () {}
+
+    CountProcessorSolidityOne (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+        : CountProcessorSolidityAbstract<span, CountProcessorSolidityOne<span> > (thresholds,solidVec)  {}
+
+    bool check (const CountVector& count, CountNumber sum)
+    {
+        for (size_t i=0; i<count.size(); i++)  {  if (this->_thresholds[i].includes(count[i]) == true)   { return true; }  }
+        return false;
+    }
+
+    std::string getName() const  { return std::string("one"); }
+};
+	
+
+/********************************************************************************/
+
+	
+	template<size_t span>
+	class CountProcessorSolidityCustom : public CountProcessorSolidityAbstract<span, CountProcessorSolidityCustom<span> >
+	{
+	public:
+		
+		CountProcessorSolidityCustom () {}
+		
+		CountProcessorSolidityCustom (const std::vector<tools::misc::CountRange>& thresholds, std::vector<bool>& solidVec)
+		: CountProcessorSolidityAbstract<span, CountProcessorSolidityCustom<span> > (thresholds,solidVec)  {}
+		
+		
+		bool check (const CountVector& count, CountNumber sum)
+		{
+			for (size_t i=0; i<count.size(); i++)  {
+				
+				if (this->_solidVec.at(i) == false &&   this->_thresholds[i].includes(count[i]) == true   )   { return false; }
+				else if (this->_solidVec.at(i) == true &&   this->_thresholds[i].includes(count[i]) == false  ) { return false; }
+			
+			}
+			return true;
+		}
+		
+		std::string getName() const  { return std::string("custom"); }
+		
+	};
+
+	
+
+/********************************************************************************/
+
+template<size_t span>
+class CountProcessorSolidityFactory
+{
+public:
+
+    /** */
+	static ICountProcessor<span>* create (tools::misc::KmerSolidityKind kind)
+    {
+        switch (kind)
+        {
+        case tools::misc::KMER_SOLIDITY_MIN: return new CountProcessorSolidityMin<span> ();
+        case tools::misc::KMER_SOLIDITY_MAX: return new CountProcessorSolidityMax<span> ();
+        case tools::misc::KMER_SOLIDITY_ONE: return new CountProcessorSolidityOne<span> ();
+		case tools::misc::KMER_SOLIDITY_CUSTOM: return new CountProcessorSolidityCustom<span> ();
+        case tools::misc::KMER_SOLIDITY_ALL: return new CountProcessorSolidityAll<span> ();
+        case tools::misc::KMER_SOLIDITY_SUM: return new CountProcessorSoliditySum<span> ();
+        default:  throw system::Exception ("unable to create CountProcessorSolidity instance for kind %d", kind);
+        }
+    }
+
+    /** */
+    static ICountProcessor<span>* create (tools::misc::IProperties& props)
+    {
+        tools::misc::KmerSolidityKind kind;
+        parse (props.getStr (STR_SOLIDITY_KIND), kind);
+		return create (kind);
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _COUNT_PROCESSOR_SOLIDITY_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.cpp
new file mode 100644
index 0000000..7b74871
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.cpp
@@ -0,0 +1,708 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.pri>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <iostream>
+#include <map>
+#include <math.h>
+
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/tools/math/NativeInt8.hpp>
+
+#include <gatb/debruijn/impl/ContainerNode.hpp>
+
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+DebloomAlgorithm<span>::DebloomAlgorithm (
+    Group&              bloomGroup,
+    Group&              debloomGroup,
+    Partition<Count>*   solidIterable,
+    size_t              kmerSize,
+    size_t              miniSize,
+    size_t              max_memory,
+    size_t              nb_cores,
+    BloomKind           bloomKind,
+    DebloomKind         cascadingKind,
+    const std::string&  debloomUri,
+    IProperties*        options
+)
+    :  Algorithm("debloom", nb_cores, options), /*_storage(storage), _storageSolids(storageSolids),*/
+       _groupBloom  (bloomGroup),
+       _groupDebloom(debloomGroup),
+       _kmerSize(kmerSize), _miniSize(miniSize),
+       _bloomKind(bloomKind), _debloomKind(cascadingKind),
+       _max_memory(max_memory),
+       _criticalNb(0), _solidIterable(0),  _container(0)
+{
+    setSolidIterable    (solidIterable);
+
+    /** We set the max memory to a default project value if not set. */
+    if (_max_memory == 0)  {  _max_memory = System::info().getMemoryProject(); }
+
+    /** We may have to adgjust the minimizer size. */
+    if (_kmerSize <= _miniSize)  { _miniSize = std::max (_kmerSize-1, (size_t)1); }
+
+    /** We set the debloom uri (tmp file). */
+    _debloomUri  = System::file().getTemporaryFilename (debloomUri);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+DebloomAlgorithm<span>::DebloomAlgorithm (tools::storage::impl::Storage& storage)
+:  Algorithm("debloom", 0, 0),
+   _groupBloom(storage().getGroup   ("bloom")),
+   _groupDebloom(storage().getGroup ("debloom")),
+   _kmerSize(0),
+   _debloomUri("debloom"),
+   _max_memory(0),
+   _criticalNb(0), _solidIterable(0), _container(0)
+{
+    /** We retrieve the cascading kind from the storage. */
+    parse (_groupDebloom.getProperty("kind"), _debloomKind);
+
+    loadDebloomStructures();
+
+    string xmlString = _groupDebloom.getProperty ("xml");
+    stringstream ss; ss << xmlString;   getInfo()->readXML (ss);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+DebloomAlgorithm<span>::~DebloomAlgorithm ()
+{
+    setSolidIterable      (0);
+    setDebloomStructures  (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+IOptionsParser* DebloomAlgorithm<span>::getOptionsParser ()
+{
+    IOptionsParser* parser = new OptionsParser ("bloom");
+
+    parser->push_back (new OptionOneParam (STR_BLOOM_TYPE,        "bloom type ('basic', 'cache', 'neighbor')",false, "neighbor"));
+    parser->push_back (new OptionOneParam (STR_DEBLOOM_TYPE,      "debloom type ('none', 'original' or 'cascading')", false, "cascading"));
+    parser->push_back (new OptionOneParam (STR_DEBLOOM_IMPL,      "debloom impl ('basic', 'minimizer')",      false, "minimizer"));
+
+    return parser;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void DebloomAlgorithm<span>::execute ()
+{
+    DEBUG (("DebloomAlgorithm<span>::execute  bloomKind=%ld  debloomKind=%d\n", _bloomKind, _debloomKind));
+
+    IProperties* bloomProps = new Properties();  LOCAL (bloomProps);
+    u_int64_t totalSizeBloom = 0;
+
+    IProperties* cfpProps = new Properties();  LOCAL (cfpProps);
+    u_int64_t totalSizeCFP = 0;
+
+    /** We execute the debloom if needed. */
+    if (_debloomKind != DEBLOOM_NONE)
+    {
+        execute_aux (bloomProps, cfpProps, totalSizeBloom, totalSizeCFP);
+    }
+
+    /** Now, we configure the IContainerNode instance for public API. */
+    loadDebloomStructures ();
+
+    /** We gather some statistics. */
+    getInfo()->add (1, "stats");
+    getInfo()->add (2, "kind",           "%s",  toString(_debloomKind).c_str());
+    getInfo()->add (2, "impl",           "%s",  getClassName());
+    getInfo()->add (2, "bitsize",        "%ld", totalSizeBloom + totalSizeCFP);
+    getInfo()->add (2, "nbits_per_kmer", "%f",  (float)(totalSizeBloom + totalSizeCFP) / (float)_solidIterable->getNbItems());
+    getInfo()->add (2, cfpProps);
+
+    getInfo()->add (1, getTimeInfo().getProperties("time"));
+
+    /** We save the cfp kind in the "cfp" storage collection. */
+    _groupDebloom.addProperty ("kind", toString(_debloomKind));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void DebloomAlgorithm<span>::execute_aux (
+    IProperties* bloomProps,
+    IProperties* cfpProps,
+    u_int64_t&   totalSizeBloom,
+    u_int64_t&   totalSizeCFP
+)
+{
+    Model model (_kmerSize);
+
+    string cfpFilename = System::file().getTemporaryFilename("cfp");
+    Collection<Type>* criticalCollection = new CollectionFile<Type> (cfpFilename);
+    LOCAL (criticalCollection);
+
+    /***************************************************/
+    /** We create a bloom and insert solid kmers into. */
+    /***************************************************/
+#if 0
+    IBloom<Type>* bloom = createBloom (_solidIterable, bloomProps, totalSizeBloom);
+    bloom->use ();
+#else
+    IBloom<Type>* bloom = StorageTools::singleton().loadBloom<Type> (_groupBloom, "bloom");
+    bloom->use ();
+    totalSizeBloom = bloom->getBitSize();
+#endif
+
+    DEBUG (("DebloomAlgorithm<span>::execute_aux  _solidIterable->getNbItems()=%ld  totalSizeBloom=%ld \n",
+        _solidIterable->getNbItems(), totalSizeBloom
+    ));
+
+    /*************************************************/
+    /** We build the solid neighbors extension.      */
+    /*************************************************/
+    {
+        TIME_INFO (getTimeInfo(), "fill_debloom_file");
+
+        /** We create an iterator over the solid kmers. */
+        Iterator<Count>* itKmers = createIterator<Count> (
+            _solidIterable->iterator(),
+            _solidIterable->getNbItems(),
+            progressFormat2()
+        );
+        LOCAL (itKmers);
+
+        /** We create a synchronized cache on the debloom output. This cache will be cloned by the dispatcher. */
+        ThreadObject<BagCache<Type> > extendBag = BagCache<Type> (new BagFile<Type>(_debloomUri), 50*1000, System::thread().newSynchronizer());
+
+        /** We iterate the solid kmers. */
+        getDispatcher()->iterate (itKmers, [&] (const Count& kmer)
+        {
+            /** We iterate the neighbors of the current solid kmer. */
+            model.iterateNeighbors (kmer.value, [&] (const Type& k)
+            {
+                if (bloom->contains (k))  {  extendBag().insert (k);  }
+            });
+        });
+
+        /** We have to flush each bag cache used during iteration. */
+        for (size_t i=0; i<extendBag.size(); i++)  {  extendBag[i].flush();  }
+
+        DEBUG (("DebloomAlgorithm<span>::execute_aux   extendBag.size()=%ld \n", extendBag.size() ));
+    }
+
+#if 0
+    /** We save the bloom. */
+    StorageTools::singleton().saveBloom<Type> (_groupBloom, "bloom", bloom);
+#endif
+
+    /** We get rid of the bloom. */
+    bloom->forget ();
+
+    /*************************************************************/
+    /** We extract the solid kmers from the neighbors extension. */
+    /*************************************************************/
+    string inputUri  = _debloomUri;
+    string outputUri = _debloomUri + "2";
+
+    /** We need a hash table that will hold solid kmers. */
+    Hash16<Type> partition (_max_memory);
+
+    {
+        TIME_INFO (getTimeInfo(), "finalize_debloom_file");
+
+        Iterator<Count>* itKmers = createIterator<Count> (
+            _solidIterable->iterator(),
+            _solidIterable->getNbItems(),
+            progressFormat3()
+        );
+        LOCAL (itKmers);
+
+        /** We iterate the solid kmers. */
+        for (itKmers->first(); !itKmers->isDone(); itKmers->next())
+        {
+            /** We add the current kmer into the partition. */
+            partition.insert (itKmers->item().value);
+
+            /** We may have reach the maximum number of items in the partition. */
+            if (partition.size() >= partition.getMaxNbItems())
+            {
+                /** We exclude the partition content from the critical false positive file. */
+                end_debloom_partition (
+                    partition,
+                    new IteratorFile <Type> (inputUri),
+                    new BagFile      <Type> (outputUri)
+                );
+
+                /** We swap the filenames. */
+                std::swap (inputUri, outputUri);
+            }
+        }
+
+        /** We finally write into the dedicated bag. */
+        end_debloom_partition (
+            partition,
+            new IteratorFile <Type> (inputUri),
+            criticalCollection->bag()
+        );
+    }
+
+    /*************************************************************/
+    /** We build the final cFP container.                        */
+    /*************************************************************/
+    {
+        TIME_INFO (getTimeInfo(), "cascading");
+
+        /** We build the container node. */
+        createCFP (criticalCollection, cfpProps, totalSizeCFP);
+    }
+
+    /** We remove the two temporary files. */
+    System::file().remove (inputUri);
+    System::file().remove (outputUri);
+    criticalCollection->remove ();
+}
+/*********************************************************************/
+
+template<size_t span>
+void DebloomAlgorithm<span>::end_debloom_partition (
+    Hash16<Type>&    partition,
+    Iterator<Type>*  debloomInput,
+    Bag<Type>*       debloomOutput
+)
+{
+    LOCAL (debloomInput);
+    LOCAL (debloomOutput);
+
+    /** We create a synchronized cache on the debloom output. This cache will be cloned by the dispatcher. */
+    ThreadObject<BagCache<Type> > finalizeBag = BagCache<Type> (debloomOutput, 8*1024, System::thread().newSynchronizer());
+
+    /** The following functor builds the critical false positive file by excluding
+     *  kmers from a current cFP file if they are solid kmers.
+     *
+     *  It is designed to get a kmer from the current cFP file and check
+     *  whether it belongs to the solid kmers file (at least one part of it
+     *  as a partition hash table).
+     *
+     *  In case the input cFP kmer doesn't belong to the solid kmers,
+     *  we add it to the output cFP file.
+     *
+     *  This functor is supposed to be used concurrently by several thread. Therefore
+     *  we have to protect the output cFP file against concurrent access, which is
+     *  achieved by encapsulating the actual output file by a BagCache instance.
+     */
+    getDispatcher()->iterate (debloomInput, [&] (const Type& extensionKmer)
+    {
+        if (partition.contains (extensionKmer) == false)  {  finalizeBag().insert (extensionKmer);  }
+    });
+
+    /** We have to flush each bag cache used during iteration. */
+    for (size_t i=0; i<finalizeBag.size(); i++) { finalizeBag[i].flush(); }
+
+    /** We clear the set. */
+    partition.clear ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+IBloom <typename Kmer<span>::Type>* DebloomAlgorithm<span>::createBloom (
+    tools::collections::Iterable<Count>* solidIterable,
+    tools::misc::IProperties* bloomProps,
+    u_int64_t& totalSizeBloom
+)
+{
+    TIME_INFO (getTimeInfo(), "create_bloom_from_kmers");
+
+    /** We get the number of solid kmers. */
+    u_int64_t solidKmersNb = solidIterable->getNbItems();
+
+    float     NBITS_PER_KMER     = getNbBitsPerKmer(_kmerSize, _debloomKind);
+    u_int64_t estimatedBloomSize = (u_int64_t) (solidKmersNb * NBITS_PER_KMER);
+    size_t    nbHash             = (int)floorf (0.7*NBITS_PER_KMER);
+
+    if (estimatedBloomSize ==0 ) { estimatedBloomSize = 1000; }
+
+    /** We create the kmers iterator from the solid file. */
+    Iterator <Count>* itKmers = createIterator<Count> (
+        solidIterable->iterator(),
+        solidKmersNb,
+        progressFormat1()
+    );
+    LOCAL (itKmers);
+
+    /** We use a bloom builder. */
+    BloomBuilder<span> builder (estimatedBloomSize, nbHash, _kmerSize, _bloomKind, getDispatcher()->getExecutionUnitsNumber());
+
+    /** We instantiate the bloom object. */
+    IBloom<Type>* bloom = builder.build (itKmers, bloomProps);
+    bloomProps->add (0, "nbits_per_kmer", "%f", NBITS_PER_KMER);
+
+    totalSizeBloom = bloom->getBitSize();
+
+    /** We return the created bloom filter. */
+    return bloom;
+}
+
+/*********************************************************************/
+
+template<size_t span>
+void DebloomAlgorithm<span>::createCFP (
+    Collection<Type>*  criticalCollection,
+    IProperties* props,
+    u_int64_t& totalSize_bits
+)
+{
+    DEBUG (("DebloomAlgorithm<span>::createCFP   criticalCollection->size=%lld \n", criticalCollection->getNbItems() ));
+
+    _criticalChecksum.setVal(0);
+#if 0
+    Iterator<Type>* ii = criticalCollection->iterator();  LOCAL(ii);
+    for (ii->first(); !ii->isDone(); ii->next())  { _criticalChecksum += ii->item(); }
+#endif
+
+    /** We may have to change the cascading kind if we have no false positives. */
+    _criticalNb = criticalCollection->getNbItems();
+    if (_criticalNb == 0)  {  _debloomKind = DEBLOOM_ORIGINAL; }
+
+    /** Shortcut. */
+    Collection<Type>* finalCriticalCollection = getCriticalKmers();
+
+    /*************************************************************/
+    /** We code the critical FP according to the cascading type. */
+    /*************************************************************/
+    switch (_debloomKind)
+    {
+        case DEBLOOM_CASCADING:
+        {
+            /** We define an iterator for 4 tasks. */
+            size_t nbTasks = 4;
+            Iterator<int>* itTask = createIterator<int> (new Range<int>::Iterator (1,nbTasks), nbTasks, progressFormat4());
+            LOCAL (itTask);
+            itTask->first ();
+
+            /** We force a specific bloom here for having not too much false positives. */
+            tools::misc::BloomKind  bloomKind = BLOOM_CACHE;
+
+            float     nbBitsPerKmer = getNbBitsPerKmer(_kmerSize, _debloomKind);
+            u_int64_t nbKmers       = _solidIterable->getNbItems();
+
+            int64_t estimated_T2_size = std::max ((int)ceilf(nbKmers     * (double)powf((double)0.62, (double)nbBitsPerKmer)), 1);
+            int64_t estimated_T3_size = std::max ((int)ceilf(_criticalNb * (double)powf((double)0.62, (double)nbBitsPerKmer)), 1);
+
+            IBloom<Type>* bloom2 = BloomFactory::singleton().createBloom<Type> (
+                    bloomKind, (u_int64_t)(_criticalNb * nbBitsPerKmer), (int)floorf(0.7*nbBitsPerKmer), _kmerSize
+            );
+            LOCAL (bloom2);
+
+            IBloom<Type>* bloom3 = BloomFactory::singleton().createBloom<Type> (
+                    bloomKind, (u_int64_t)(estimated_T2_size * nbBitsPerKmer), (int)floorf(0.7*nbBitsPerKmer), _kmerSize
+            );
+            LOCAL (bloom3);
+
+            IBloom<Type>* bloom4 = BloomFactory::singleton().createBloom<Type> (
+                    bloomKind, (u_int64_t)(estimated_T3_size * nbBitsPerKmer), (int)floorf(0.7*nbBitsPerKmer), _kmerSize
+            );
+            LOCAL (bloom4);
+
+            // **** Insert the false positives in B2 ****
+            getDispatcher()->iterate (criticalCollection->iterator(), [&] (const Type& t) {
+                bloom2->insert (t);
+            });
+            itTask->next();
+
+            //  **** Insert false positives in B3 and write T2
+            string T2name = System::file().getTemporaryFilename("t2_kmers");
+            Collection<Type>* T2File = new CollectionFile<Type> (T2name);  LOCAL (T2File);
+
+            /** We need to protect the T2File against concurrent accesses, we use a ThreadObject for this. */
+            ThreadObject<BagCache<Type> > T2Cache = BagCache<Type> (T2File, 8*1024, System::thread().newSynchronizer());
+
+            getDispatcher()->iterate (_solidIterable->iterator(), [&] (const Count& t)
+            {
+                if (bloom2->contains(t.value))
+                {
+                    T2Cache().insert (t.value);
+                    bloom3->insert (t.value);
+                }
+            });
+
+            /** We have to flush each bag cache used during iteration. */
+            for (size_t i=0; i<T2Cache.size(); i++)  { T2Cache[i].flush(); }
+            itTask->next();
+
+            // **** Insert false positives in B4 (we could write T3, but it's not necessary)
+            getDispatcher()->iterate (criticalCollection->iterator(), [&] (const Type& t) {
+                if (bloom3->contains(t)) {
+                    bloom4->insert (t);
+                }
+            });
+            itTask->next();
+
+            /** We build the final cfp set. */
+            vector<Type> cfpItems;
+            Iterator<Type>* T2It = T2File->iterator(); LOCAL(T2It);
+            for (T2It->first(); !T2It->isDone(); T2It->next())
+            {
+                if (bloom4->contains(T2It->item()))  {  cfpItems.push_back (T2It->item());  }
+            }
+            std::sort (cfpItems.begin(), cfpItems.end());
+
+            finalCriticalCollection->insert (cfpItems.data(), cfpItems.size());
+            finalCriticalCollection->flush ();
+            itTask->next();
+            itTask->isDone(); // force to finish progress dump
+
+            /** We save the final cFP container into the storage. */
+            StorageTools::singleton().saveBloom<Type>      (_groupDebloom, "bloom2", bloom2, _kmerSize);
+            StorageTools::singleton().saveBloom<Type>      (_groupDebloom, "bloom3", bloom3, _kmerSize);
+            StorageTools::singleton().saveBloom<Type>      (_groupDebloom, "bloom4", bloom4, _kmerSize);
+
+            totalSize_bits = bloom2->getBitSize() + bloom3->getBitSize() + bloom4->getBitSize() + 8*cfpItems.size()*sizeof(Type);
+
+            /** Some statistics. */
+            props->add (0, "cfp",   "%ld", totalSize_bits);
+            props->add (1, "bloom2", "%ld", bloom2->getBitSize());
+            props->add (1, "bloom3", "%ld", bloom3->getBitSize());
+            props->add (1, "bloom4", "%ld", bloom4->getBitSize());
+            props->add (1, "set",    "%ld", 8*cfpItems.size()*sizeof(Type));
+
+            /** We remove the two temporary files. */
+            System::file().remove (T2name);
+
+            break;
+        }
+
+        case DEBLOOM_ORIGINAL:
+        case DEBLOOM_DEFAULT:
+        default:
+        {
+            Iterator<Type>* it = createIterator<Type> (
+                criticalCollection->iterator(),
+                criticalCollection->getNbItems(),
+                progressFormat5()
+            );
+            LOCAL (it);
+
+            /** We save the final cFP container into the storage. */
+            for (it->first(); !it->isDone(); it->next())  {  finalCriticalCollection->insert (it->item());  }
+            finalCriticalCollection->flush ();
+
+            totalSize_bits = 8*criticalCollection->getNbItems()*sizeof(Type);
+
+            props->add (1, "size", "%ld", totalSize_bits);
+
+            break;
+        }
+    }
+
+    props->add (1, "nb", "%ld", _criticalNb);
+    if (_criticalChecksum != 0)
+    {
+        stringstream ss;  ss << _criticalChecksum;
+        props->add (1, "checksum",   "%s", ss.str().c_str());
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+float DebloomAlgorithm<span>::getNbBitsPerKmer (size_t kmerSize, DebloomKind debloomKind)
+{
+    static double lg2 = log(2);
+    float nbitsPerKmer = 0;
+
+    if (kmerSize > 128 && debloomKind==DEBLOOM_CASCADING)  {  throw Exception ("kmer size %d too big for cascading bloom filters", kmerSize); }
+
+    switch (debloomKind)
+    {
+    case DEBLOOM_CASCADING:
+        nbitsPerKmer = rvalues[kmerSize][1];
+        break;
+
+    case DEBLOOM_ORIGINAL:
+    case DEBLOOM_DEFAULT:
+    default:
+        nbitsPerKmer = log (16*kmerSize*(lg2*lg2))/(lg2*lg2);
+        break;
+    }
+    return nbitsPerKmer;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : used to be named loadContainer but I renamed it for clarity, also conficting name with actual loadContainer for a container
+*********************************************************************/
+template<size_t span>
+void DebloomAlgorithm<span>::loadDebloomStructures ()
+{
+    DEBUG (("DebloomAlgorithm<span>::loadContainer  _debloomKind=%d \n", _debloomKind));
+
+    switch (_debloomKind)
+    {
+        case DEBLOOM_NONE:
+        {
+            IBloom<Type>* bloom = StorageTools::singleton().loadBloom<Type> (_groupBloom, "bloom");
+
+            /** We build the set of critical false positive kmers. */
+            setDebloomStructures (new debruijn::impl::ContainerNodeNoCFP<Type> (bloom));
+            break;
+        }
+
+        case DEBLOOM_ORIGINAL:
+        case DEBLOOM_DEFAULT:
+        default:
+        {
+            IBloom<Type>*      bloom    = StorageTools::singleton().loadBloom<Type>     (_groupBloom,   "bloom");
+            Container<Type>*   cFP      = StorageTools::singleton().loadContainer<Type> (_groupDebloom, "cfp");
+
+            /** We build the set of critical false positive kmers. */
+            setDebloomStructures (new debruijn::impl::ContainerNode<Type> (bloom, cFP));
+
+            break;
+        }
+
+        case DEBLOOM_CASCADING:
+        {
+            IBloom<Type>*     bloom   = StorageTools::singleton().loadBloom<Type>     (_groupBloom,   "bloom");
+            IBloom<Type>*     bloom2  = StorageTools::singleton().loadBloom<Type>     (_groupDebloom, "bloom2");
+            IBloom<Type>*     bloom3  = StorageTools::singleton().loadBloom<Type>     (_groupDebloom, "bloom3");
+            IBloom<Type>*     bloom4  = StorageTools::singleton().loadBloom<Type>     (_groupDebloom, "bloom4");
+            Container<Type>*  cFP     = StorageTools::singleton().loadContainer<Type> (_groupDebloom, "cfp");
+
+            /** We build the set of critical false positive kmers. */
+            setDebloomStructures (new debruijn::impl::ContainerNodeCascading<Type> (bloom, bloom2, bloom3, bloom4, cFP));
+
+            break;
+        }
+    }
+}
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.hpp
new file mode 100644
index 0000000..461b323
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.hpp
@@ -0,0 +1,211 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file DebloomAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Debloom algorithm, ie. compute false positive sets for a Bloom filter
+ */
+
+#ifndef _DEBLOOM_HPP_
+#define _DEBLOOM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/OptionsParser.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+#include <gatb/tools/collections/impl/Hash16.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/debruijn/api/IContainerNode.hpp>
+
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Construction of the set of critical false positives nodes.
+ *
+ * GATB uses Bloom filters for encoding de Bruijn graphs. Since Bloom filters are
+ * probalistic data structure having false positives, we need extra information
+ * for disambiguate the graph, otherwise we would have false positive nodes in
+ * our de Bruijn graphs.
+ *
+ * It is possible to build this extra information as a set of critical false positives nodes
+ * and the DebloomAlgorithm class provides a way to build such cFP set.
+ *
+ * Actually, this class is mainly used in the debruijn::impl::Graph class as a third step for
+ * the de Bruijn graph creation.
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class DebloomAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::Type           Type;
+    typedef typename kmer::impl::Kmer<span>::Count          Count;
+
+    /** Constructor
+     * \param[in] storage : storage object where the cFP will be stored.
+     * \param[in] storageSolids : obsolete (should be removed)
+     * \param[in] solidIterable : partition holding the solid kmers
+     * \param[in] kmerSize : size of the kmers
+     * \param[in] max_memory : max memory (in MBytes) to be used
+     * \param[in] nb_cores : number of cores to be used; 0 means all available cores
+     * \param[in] bloomKind : kind of Bloom filter implementation to be used
+     * \param[in] debloomKind : kind of algorithm to be used for storing the cFP
+     * \param[in] debloomUri : prefix name for temporary files
+     * \param[in] options : extra options
+     */
+    DebloomAlgorithm (
+        tools::storage::impl::Group&    bloomGroup,
+        tools::storage::impl::Group&    debloomGroup,
+        tools::storage::impl::Partition<Count>* solidIterable,
+        size_t                      kmerSize,
+        size_t                      miniSize,
+        size_t                      max_memory = 0,
+        size_t                      nb_cores   = 0,
+        tools::misc::BloomKind      bloomKind     = tools::misc::BLOOM_DEFAULT,
+        tools::misc::DebloomKind    debloomKind = tools::misc::DEBLOOM_DEFAULT,
+        const std::string&          debloomUri = "debloom",
+        tools::misc::IProperties*   options    = 0
+    );
+
+    /** Constructor
+     * \param[in] storage : storage object from which the cFP can be loaded.
+     */
+    DebloomAlgorithm (tools::storage::impl::Storage& storage);
+
+    /** Destructor */
+    virtual ~DebloomAlgorithm ();
+
+    /** Get an option parser for bloom/debloom parameters. Dynamic allocation, so must be released when no more used.
+     * \return an instance of IOptionsParser. */
+    static tools::misc::IOptionsParser* getOptionsParser ();
+
+    /** Execute the debloom algorithm. */
+    void execute ();
+
+    /** Get the collection for the computed critical FP kmers.
+     * \return the cFP  kmers collection. */
+    tools::collections::Collection<Type>* getCriticalKmers ()
+    {
+        return & _groupDebloom.getCollection <Type> ("cfp");
+    }
+
+    /** Get the bloom/cFP container.
+     * \return the container. */
+    debruijn::IContainerNode<Type>* getContainerNode ()  { return _container; }
+
+    /** Get the number of bits per kmer
+     * \param[in] kmerSize : kmer size
+     * \param[in] debloomKind : kind of debloom
+     * \return number of bits per kmer. */
+    static float getNbBitsPerKmer (size_t kmerSize, tools::misc::DebloomKind debloomKind);
+
+    /** Get the class name (for statistics output).
+     * \return the class name. */
+    virtual const char* getClassName() const { return "DebloomAlgorithm"; }
+
+protected:
+
+    /** */
+    virtual void execute_aux (
+        tools::misc::IProperties* bloomProps,
+        tools::misc::IProperties* cfpProps,
+        u_int64_t& totalSizeBloom,
+        u_int64_t& totalSizeCFP
+    );
+
+    /** */
+    virtual gatb::core::tools::collections::impl::IBloom<Type>* createBloom (
+        tools::collections::Iterable<Count>* solidIterable,
+        tools::misc::IProperties* props,
+        u_int64_t& totalSizeBloom
+    );
+
+    void end_debloom_partition (
+        gatb::core::tools::collections::impl::Hash16<Type>& set,
+        gatb::core::tools::dp::Iterator<Type>*              inputIterator,
+        gatb::core::tools::collections::Bag<Type>*          outputBag
+    );
+
+    /** */
+    tools::storage::impl::Group& _groupBloom;
+    tools::storage::impl::Group& _groupDebloom;
+
+    size_t       _kmerSize;
+    size_t       _miniSize;
+
+    tools::misc::BloomKind   _bloomKind;
+    tools::misc::DebloomKind _debloomKind;
+
+    std::string  _debloomUri;
+    size_t       _max_memory;
+
+    u_int64_t _criticalNb;
+    Type      _criticalChecksum;
+
+    tools::storage::impl::Partition<Count>* _solidIterable;
+    void setSolidIterable (tools::storage::impl::Partition<Count>* solidIterable)  {  SP_SETATTR(solidIterable); }
+
+    debruijn::IContainerNode<Type>* _container;
+
+    /* used to be named setContainer, I can see why (input is a IContainerNode, whatever that is). But I renamed it for disambiguation, as there
+     * already exists an object named Container, and it's certainly not a Debloom structure */
+    void setDebloomStructures (debruijn::IContainerNode<Type>* container)  { SP_SETATTR(container); }
+
+    void createCFP (
+        gatb::core::tools::collections::Collection<Type>*  criticalCollection,
+        tools::misc::IProperties* props,
+        u_int64_t& totalSize
+    );
+
+    void loadDebloomStructures ();
+
+    static const char* progressFormat1() { return "Debloom: read solid kmers              "; }
+    static const char* progressFormat2() { return "Debloom: build extension               "; }
+    static const char* progressFormat3() { return "Debloom: finalization                  "; }
+    static const char* progressFormat4() { return "Debloom: cascading                     "; }
+    static const char* progressFormat5() { return "Debloom: save                          "; }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _DEBLOOM_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.pri b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.pri
new file mode 100644
index 0000000..988eb36
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithm.pri
@@ -0,0 +1,163 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _DEBLOOM_PRI_ 
+#define _DEBLOOM_PRI_
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+static double rvalues[129][2] = {
+    { 0.00000, 5.29625 },
+    { 0.00000, 0.00000 },
+    { 0.00000, 0.00000 },
+    { 0.00000, 0.00000 },
+    { 0.00000, 0.00000 },
+    { 5.64856, 5.49117 },
+    { 5.85164, 5.52333 },
+    { 6.02772, 5.55385 },
+    { 6.18398, 5.58291 },
+    { 6.32492, 5.61065 },
+    { 6.45362, 5.63721 },
+    { 6.57225, 5.66268 },
+    { 6.68244, 5.68717 },
+    { 6.78544, 5.71075 },
+    { 6.88221, 5.73350 },
+    { 6.97353, 5.75548 },
+    { 7.06004, 5.77674 },
+    { 7.14227, 5.79733 },
+    { 7.22066, 5.81730 },
+    { 7.29558, 5.83669 },
+    { 7.36734, 5.85553 },
+    { 7.43623, 5.87386 },
+    { 7.50248, 5.89171 },
+    { 7.56630, 5.90910 },
+    { 7.62788, 5.92605 },
+    { 7.68737, 5.94260 },
+    { 7.74494, 5.95876 },
+    { 7.80069, 5.97455 },
+    { 7.85477, 5.98999 },
+    { 7.90726, 6.00510 },
+    { 7.95826, 6.01989 },
+    { 8.00786, 6.03437 },
+    { 8.05615, 6.04856 },
+    { 8.10319, 6.06247 },
+    { 8.14904, 6.07611 },
+    { 8.19378, 6.08950 },
+    { 8.23745, 6.10264 },
+    { 8.28012, 6.11555 },
+    { 8.32181, 6.12822 },
+    { 8.36260, 6.14068 },
+    { 8.40250, 6.15293 },
+    { 8.44157, 6.16497 },
+    { 8.47983, 6.17682 },
+    { 8.51733, 6.18848 },
+    { 8.55409, 6.19995 },
+    { 8.59015, 6.21125 },
+    { 8.62553, 6.22238 },
+    { 8.66025, 6.23334 },
+    { 8.69435, 6.24413 },
+    { 8.72784, 6.25478 },
+    { 8.76075, 6.26527 },
+    { 8.79310, 6.27562 },
+    { 8.82490, 6.28582 },
+    { 8.85619, 6.29589 },
+    { 8.88697, 6.30582 },
+    { 8.91725, 6.31562 },
+    { 8.94707, 6.32530 },
+    { 8.97643, 6.33485 },
+    { 9.00534, 6.34428 },
+    { 9.03383, 6.35360 },
+    { 9.06189, 6.36280 },
+    { 9.08956, 6.37189 },
+    { 9.11683, 6.38088 },
+    { 9.14372, 6.38975 },
+    { 9.17024, 6.39853 },
+    { 9.19640, 6.40721 },
+    { 9.22221, 6.41578 },
+    { 9.24768, 6.42427 },
+    { 9.27282, 6.43265 },
+    { 9.29764, 6.44095 },
+    { 9.32214, 6.44916 },
+    { 9.34634, 6.45728 },
+    { 9.37024, 6.46532 },
+    { 9.39385, 6.47328 },
+    { 9.41717, 6.48115 },
+    { 9.44023, 6.48894 },
+    { 9.46301, 6.49666 },
+    { 9.48552, 6.50430 },
+    { 9.50778, 6.51186 },
+    { 9.52979, 6.51935 },
+    { 9.55156, 6.52677 },
+    { 9.57308, 6.53412 },
+    { 9.59437, 6.54140 },
+    { 9.61543, 6.54861 },
+    { 9.63627, 6.55576 },
+    { 9.65688, 6.56284 },
+    { 9.67729, 6.56986 },
+    { 9.69748, 6.57682 },
+    { 9.71747, 6.58371 },
+    { 9.73725, 6.59055 },
+    { 9.75684, 6.59732 },
+    { 9.77624, 6.60404 },
+    { 9.79544, 6.61070 },
+    { 9.81446, 6.61731 },
+    { 9.83330, 6.62386 },
+    { 9.85196, 6.63035 },
+    { 9.87045, 6.63680 },
+    { 9.88876, 6.64319 },
+    { 9.90691, 6.64953 },
+    { 9.92489, 6.65582 },
+    { 9.94271, 6.66206 },
+    { 9.96037, 6.66825 },
+    { 9.97787, 6.67439 },
+    { 9.99522, 6.68049 },
+    { 10.01241, 6.68654 },
+    { 10.02946, 6.69254 },
+    { 10.04637, 6.69850 },
+    { 10.06313, 6.70441 },
+    { 10.07975, 6.71029 },
+    { 10.09623, 6.71611 },
+    { 10.11258, 6.72190 },
+    { 10.12879, 6.72764 },
+    { 10.14488, 6.73335 },
+    { 10.16083, 6.73901 },
+    { 10.17665, 6.74463 },
+    { 10.19235, 6.75022 },
+    { 10.20793, 6.75577 },
+    { 10.22339, 6.76127 },
+    { 10.23873, 6.76674 },
+    { 10.25394, 6.77218 },
+    { 10.26905, 6.77757 },
+    { 10.28404, 6.78293 },
+    { 10.29892, 6.78826 },
+    { 10.31369, 6.79355 },
+    { 10.32835, 6.79881 },
+    { 10.34290, 6.80403 },
+    { 10.35735, 6.80922 },
+    { 10.37169, 6.81437 },
+    { 10.38593, 6.81950 }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomAlgorithmFactory.hpp b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithmFactory.hpp
new file mode 100644
index 0000000..501ffbc
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomAlgorithmFactory.hpp
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file DebloomAlgorithmFactory.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Factory for Debloom algorithms
+ */
+
+#ifndef _DEBLOOM_ALGORITHM_FACTORY_HPP_
+#define _DEBLOOM_ALGORITHM_FACTORY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+template<size_t span=KMER_DEFAULT_SPAN>
+class DebloomAlgorithmFactory
+{
+public:
+
+    typedef typename kmer::impl::Kmer<span>::Count Count;
+
+    static DebloomAlgorithm<span>* create (
+        tools::misc::DebloomImpl impl,
+        tools::storage::impl::Group&    bloomGroup,
+        tools::storage::impl::Group&    debloomGroup,
+        tools::storage::impl::Partition<Count>* solidIterable,
+        size_t                      kmerSize,
+        size_t                      miniSize,
+        size_t                      max_memory = 0,
+        size_t                      nb_cores   = 0,
+        tools::misc::BloomKind      bloomKind     = tools::misc::BLOOM_DEFAULT,
+        tools::misc::DebloomKind    cascadingKind = tools::misc::DEBLOOM_DEFAULT,
+        const std::string&          debloomUri = "debloom",
+        tools::misc::IProperties*   options    = 0,
+        tools::storage::impl::Group*    minimizersGroup = 0
+    )
+    {
+        switch (impl)
+        {
+            case tools::misc::DEBLOOM_IMPL_BASIC:
+                return new DebloomAlgorithm<span> (
+                    bloomGroup, debloomGroup, solidIterable, kmerSize, miniSize, max_memory, nb_cores,
+                    bloomKind, cascadingKind, debloomUri, options
+                );
+
+            case tools::misc::DEBLOOM_IMPL_MINIMIZER:
+            case tools::misc::DEBLOOM_IMPL_DEFAULT:
+            default:
+                return new DebloomMinimizerAlgorithm<span> (
+                    bloomGroup, debloomGroup, solidIterable, kmerSize, miniSize, max_memory, nb_cores,
+                    bloomKind, cascadingKind, debloomUri, options, minimizersGroup
+                );
+        }
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _DEBLOOM_ALGORITHM_FACTORY_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.cpp
new file mode 100644
index 0000000..0a3f7aa
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.cpp
@@ -0,0 +1,453 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp>
+
+#include <gatb/kmer/impl/PartiInfo.hpp>
+//
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+DebloomMinimizerAlgorithm<span>::DebloomMinimizerAlgorithm (
+    Group&              bloomGroup,
+    Group&              debloomGroup,
+    Partition<Count>*    solidIterable,
+    size_t              kmerSize,
+    size_t              miniSize,
+    size_t              max_memory,
+    size_t              nb_cores,
+    BloomKind           bloomKind,
+    DebloomKind         cascadingKind,
+    const std::string&  debloomUri,
+    IProperties*        options,
+    tools::storage::impl::Group* minimizersGroup
+)
+    :  DebloomAlgorithm<span>(bloomGroup, debloomGroup, solidIterable, kmerSize, miniSize, max_memory, nb_cores, bloomKind, cascadingKind, debloomUri, options),
+       _groupMinimizers(minimizersGroup)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+DebloomMinimizerAlgorithm<span>::DebloomMinimizerAlgorithm (tools::storage::impl::Storage& storage)
+:  DebloomAlgorithm<span>(storage)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<typename Model, typename ModelMini, typename Count, typename Type>
+struct FunctorKmersExtensionMinimizer
+{
+    struct FunctorNeighbors
+    {
+        IBloom<Type>*         bloom;
+        ModelMini&           _modelMini;
+        vector<Type>&        _solids;
+        Repartitor&          _repart;
+        size_t               _nbPass;
+        size_t               _nbPartsPerPass;
+        int                  _currentThreadIndex;
+		vector<PartitionCache<Type>*>& _partCacheVec;
+
+        FunctorNeighbors (
+            IBloom<Type>*       bloom,
+            ModelMini&          modelMini,
+            vector<Type>&       solids,
+            Partition<Type>*    extentParts,
+            Repartitor&         repart,
+			vector<PartitionCache<Type>*>& partCacheVec
+        )
+            : bloom(bloom), _modelMini(modelMini), _solids(solids),
+			  _repart(repart), _currentThreadIndex(-1),
+			  _partCacheVec(partCacheVec)
+        {
+            _nbPass = _repart.getNbPasses();
+
+            if (_nbPass==0)  { throw Exception("0 parts in debloom"); }
+            _nbPartsPerPass = extentParts->size() / _nbPass;
+        }
+
+        void operator() (const Type& neighbor)//  const
+        {
+            /** We can already get rid of neighbors that are in the current solid kmers partition. */
+            if (std::binary_search (_solids.begin(), _solids.end(), neighbor)==false)
+            {
+                /** We get the minimizer value of the current kmer.
+                 * Note : we have here to compute minimizers from scratch, which may be time expensive;
+                 * maybe a better way could be found. */
+                u_int64_t mini = _modelMini.getMinimizerValue(neighbor);
+
+                /** We get the partition index of the neighbor from its minimizer value and the
+                 * minimizer repartition table. */
+                u_int64_t mm = _repart (mini);
+
+                /** We need to shift this index according to the way the input bank has been cut into
+                 * several passes (see FillPartitions in SortingCountAlgorithm). */
+                mm += (mini % _nbPass) * _nbPartsPerPass;
+
+                /** We retrieve the partition of interest. Note that we have a lazy accessor for the thread index
+                 * within the ThreadGroup, because this value wouldn't be known during the constructor of the functor. */
+                PartitionCache<Type>* partition = _partCacheVec[getThreadIndex()];
+
+                /** We add the neighbor to the correct debloom partition. */
+                (*partition)[mm].insert (neighbor);
+            }
+        }
+
+        int getThreadIndex()
+        {
+        	if (_currentThreadIndex < 0)
+        	{
+				std::pair<IThread*,size_t> info;
+				if (ThreadGroup::findThreadInfo (System::thread().getThreadSelf(), info) == true)
+				{
+					_currentThreadIndex = info.second;
+				}
+				else
+				{
+					throw Exception("Unable to find thread index during debloom(minimizer)");
+				}
+        	}
+        	return _currentThreadIndex;
+        }
+
+    } functorNeighbors;
+
+    Model&        model;
+    IBloom<Type>* bloom;
+
+    FunctorKmersExtensionMinimizer (
+        Model&              model,
+        ModelMini&          modelMini,
+        IBloom<Type>*       bloom,
+        Partition<Type>*    extentParts,
+        vector<Type>&       solids,
+        Repartitor&         repart,
+		vector<PartitionCache<Type>*>& partCacheVec
+    )
+        : functorNeighbors(bloom,modelMini, solids, extentParts, repart, partCacheVec),  model(model),  bloom(bloom)
+    {
+    }
+
+    void operator() (const Count& kmer) const
+    {
+        /** We want to know which neighbors of the current kmer are in the Bloom filter.
+         * Note that, according to the Bloom filter implementation, we can have optimized
+         * way to get 8 answers in one shot. */
+        bitset<8> mask =  bloom->contains8 (kmer.value);
+
+        /** We iterate the neighbors (only those found in the Bloom filter). */
+        model.iterateNeighbors (kmer.value, functorNeighbors, mask);
+    }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+struct FinalizeCmd : public ICommand, public SmartPointer
+{
+    typedef typename kmer::impl::Kmer<span>::Type   Type;
+    typedef typename kmer::impl::Kmer<span>::Count  Count;
+
+    size_t currentIdx;
+    Iterable<Count>& solids;
+    Iterable<Type>& cfp;
+    BagCache<Type> result;
+
+    FinalizeCmd (size_t currentIdx, Collection<Count>& solids, Collection<Type>& cfp, Bag<Type>* bag, ISynchronizer* synchro)
+        : currentIdx(currentIdx), solids(solids), cfp(cfp), result(bag,8*1024, synchro)
+    {}
+
+    void execute ()
+    {
+        size_t k=0;
+
+        vector<Type> vecCFP (cfp.getNbItems());
+
+        /** We insert all the cfp items into a vector. */
+        Iterator<Type>*  itCFP   = cfp.iterator();   LOCAL(itCFP);
+        for (itCFP->first(); !itCFP->isDone(); itCFP->next())  { vecCFP[k++] = itCFP->item(); }
+
+        /** We sort this cfp vector. */
+        std::sort (vecCFP.begin(), vecCFP.end());
+
+        /** We need two iterators on the two sets (supposed to be ordered). */
+        typename vector<Type>::iterator itVecCFP;
+        Iterator<Count>* itKmers = solids.iterator();   LOCAL(itKmers);
+
+        /** We initialize the two iterators. */
+        itVecCFP = vecCFP.begin();
+        itKmers->first();
+
+        /** We compute the difference between the cfp and the solid kmers.
+         *  (see http://www.cplusplus.com/reference/algorithm/set_difference)
+         */
+        while (itVecCFP != vecCFP.end() && !itKmers->isDone())
+        {
+            if (*itVecCFP < itKmers->item().value)
+            {
+                result.insert (*itVecCFP);
+
+                Type tmp = *itVecCFP;  while (++itVecCFP != vecCFP.end() && *(itVecCFP)==tmp) { }
+            }
+            else if (itKmers->item().value < *itVecCFP)
+            {
+                itKmers->next();
+            }
+            else
+            {
+                Type tmp = *itVecCFP;  while (++itVecCFP != vecCFP.end()  && *(itVecCFP)==tmp) { }
+                itKmers->next();
+            }
+        }
+
+        /** We complete the remaining potential cFP items. */
+        for ( ;  itVecCFP != vecCFP.end(); ++itVecCFP)  {  result.insert (*itVecCFP);  }
+    }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void DebloomMinimizerAlgorithm<span>::execute_aux (
+    IProperties* bloomProps,
+    IProperties* cfpProps,
+    u_int64_t&   totalSizeBloom,
+    u_int64_t&   totalSizeCFP
+)
+{
+    /** We retrieve the minimizers distribution from the solid kmers storage. */
+    Repartitor repart;
+    repart.load (*_groupMinimizers);
+
+    /** We need two kmer models : one canonical, the other minimizers. */
+    typedef typename Kmer<span>::template ModelMinimizer<Model>  ModelMini;
+    Model      model     (this->_kmerSize);
+    ModelMini  modelMini (this->_kmerSize, this->_miniSize,
+        typename Kmer<span>::ComparatorMinimizerFrequencyOrLex(), repart.getMinimizerFrequencies()
+    );
+
+    /** We create the collection that will hold the critical false positive kmers. */
+    string cfpFilename = System::file().getTemporaryFilename("cfp");
+    Collection<Type>* criticalCollection = new CollectionFile<Type> (cfpFilename);
+    LOCAL (criticalCollection);
+
+    /***************************************************/
+    /** We create a bloom and insert solid kmers into. */
+    /***************************************************/
+    IBloom<Type>* bloom = StorageTools::singleton().loadBloom<Type> (this->_groupBloom, "bloom");
+    bloom->use ();
+    totalSizeBloom = bloom->getBitSize();
+
+    DEBUG (("DebloomMinimizerAlgorithm<span>::execute_aux  totalSizeBloom=%lld \n", totalSizeBloom));
+
+    /** We get the number of partitions in the solid kmers set. */
+    size_t nbPartitions = this->_solidIterable->size();
+
+    /** We use a temporary partition that will hold the neighbors extension of the solid kmers. */
+    string partitionsFilename = System::file().getTemporaryFilename("debloom_partitions");
+    Storage* cfpPartitions = StorageFactory(STORAGE_HDF5).create (partitionsFilename, true, false);
+    LOCAL (cfpPartitions);
+    Partition<Type>* debloomParts = & (*cfpPartitions)().getPartition<Type> ("parts", nbPartitions);
+
+    /*************************************************/
+    /** We build the solid neighbors extension.      */
+    /*************************************************/
+    {
+    	/** We create a vector of PartitionCache available for the process of all solid kmers partition.
+    	 *  We have one item per thread.
+    	 */
+    	vector<PartitionCache<Type>*> partCacheVec (this->getDispatcher()->getExecutionUnitsNumber());
+    	for (size_t i=0; i<this->getDispatcher()->getExecutionUnitsNumber(); i++)
+    	{
+    		partCacheVec[i] = new PartitionCache<Type> (*debloomParts,1<<12,0);
+    	}
+
+        TIME_INFO (this->getTimeInfo(), "fill_debloom_file");
+
+        DEBUG (("DebloomMinimizerAlgorithm<span>::execute_aux   fill_debloom_file BEGIN   nbParts=%ld\n", nbPartitions));
+
+        /** We create an iterator for progress information. */
+        Iterator<int>* itParts = this->createIterator (
+            new Range<int>::Iterator (0,nbPartitions-1), nbPartitions, DebloomAlgorithm<span>::progressFormat2()
+        );
+        LOCAL (itParts);
+
+        /** We iterate the [kmer,count] objects partitions*/
+        for (itParts->first (); !itParts->isDone(); itParts->next())
+        {
+            /** Shortcut. */
+            size_t p = itParts->item();
+
+            /** We retrieve an iterator on the Count objects of the pth partition. */
+            Iterator<Count>* itKmers = (*this->_solidIterable)[p].iterator();
+            LOCAL (itKmers);
+
+            /** We fill a vector with kmers only (don't care about counts here).
+             * The items in the partition are supposed to be sorted, so will be this vector.
+             * THIS IS IMPORTANT BECAUSE we will use a binary search on that vector. */
+            vector<Type> solids ( ((*this->_solidIterable)[p]).getNbItems());
+            size_t k=0;  for (itKmers->first(); !itKmers->isDone(); itKmers->next()) { solids[k++] = itKmers->item().value; }
+
+            /** We create functor that computes the neighbors extension of the solid kmers. */
+            FunctorKmersExtensionMinimizer<Model,ModelMini,Count,Type> functorKmers (model, modelMini, bloom, debloomParts, solids, repart, partCacheVec);
+
+            /** We iterate the solid kmers. */
+            this->getDispatcher()->iterate (itKmers, functorKmers);
+
+        }  /* for (itParts->first (); ...) */
+
+        /** We get rid of the PartitionCache objets. */
+        for (size_t i=0; i<this->getDispatcher()->getExecutionUnitsNumber(); i++)
+        {
+        	delete partCacheVec[i];
+        }
+
+        /** We flush the built partition. */
+        debloomParts->flush();
+
+        DEBUG (("DebloomMinimizerAlgorithm<span>::execute_aux   fill_debloom_file END \n"));
+    }
+
+    /** We get rid of the bloom. */
+    bloom->forget ();
+
+    /*************************************************************/
+    /** We extract the solid kmers from the neighbors extension. */
+    /*************************************************************/
+    {
+        TIME_INFO (this->getTimeInfo(), "finalize_debloom_file");
+
+        DEBUG (("DebloomMinimizerAlgorithm<span>::execute_aux   finalize_debloom_file BEGIN \n"));
+
+        ISynchronizer* synchro = System::thread().newSynchronizer();  LOCAL (synchro);
+
+        /** We create an iterator for progress information. */
+        Iterator<int>* itParts = this->createIterator (new Range<int>::Iterator (0,nbPartitions-1), nbPartitions, DebloomAlgorithm<span>::progressFormat3());
+        LOCAL (itParts);
+
+        size_t nbCoresMax = this->getDispatcher()->getExecutionUnitsNumber();
+
+        for (itParts->first (); !itParts->isDone(); )
+        {
+            vector<ICommand*> cmd;
+
+            size_t cfpSize = 0;
+            size_t nbCores = 0;
+
+            for ( ;  !itParts->isDone() && (nbCores<nbCoresMax && cfpSize < this->_max_memory*MBYTE);  itParts->next())
+            {
+                /** Shortcut. */
+                size_t p = itParts->item();
+
+                nbCores ++;
+                cfpSize += (*debloomParts)[p].getNbItems() * sizeof(Type);
+
+                cmd.push_back (new FinalizeCmd<span> (p, (*this->_solidIterable)[p], (*debloomParts)[p], criticalCollection, synchro));
+            }
+
+            this->getDispatcher()->dispatchCommands (cmd);
+        }
+
+        /** We flush the critical false positive collection. */
+        criticalCollection->flush();
+
+        /** We can remove the temporary partition. */
+        cfpPartitions->remove();
+
+        DEBUG (("DebloomMinimizerAlgorithm<span>::execute_aux   finalize_debloom_file END \n"));
+    }
+
+    /*************************************************************/
+    /** We build the final cFP container.                        */
+    /*************************************************************/
+    {
+        TIME_INFO (this->getTimeInfo(), "cascading");
+
+        /** We build the container node. */
+        this->createCFP (criticalCollection, cfpProps, totalSizeCFP);
+    }
+
+    /** We remove the two temporary files. */
+    criticalCollection->remove ();
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp
new file mode 100644
index 0000000..ad8db31
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/DebloomMinimizerAlgorithm.hpp
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file DebloomMinimizerAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Debloom algorithm, ie. compute false positive sets for a Bloom filter
+ */
+
+#ifndef _DEBLOOM_MINIMIZER_ALGORITHM_HPP_
+#define _DEBLOOM_MINIMIZER_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+template<size_t span=KMER_DEFAULT_SPAN>
+class DebloomMinimizerAlgorithm : public DebloomAlgorithm<span>
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical Model;
+    typedef typename kmer::impl::Kmer<span>::Type           Type;
+    typedef typename kmer::impl::Kmer<span>::Count          Count;
+
+    /** */
+    DebloomMinimizerAlgorithm (
+        tools::storage::impl::Group&    bloomGroup,
+        tools::storage::impl::Group&    debloomGroup,
+        tools::storage::impl::Partition<Count>* solidIterable,
+        size_t                      kmerSize,
+        size_t                      miniSize,
+        size_t                      max_memory = 0,
+        size_t                      nb_cores   = 0,
+        tools::misc::BloomKind      bloomKind     = tools::misc::BLOOM_DEFAULT,
+        tools::misc::DebloomKind    cascadingKind = tools::misc::DEBLOOM_DEFAULT,
+        const std::string&          debloomUri = "debloom",
+        tools::misc::IProperties*   options    = 0,
+        tools::storage::impl::Group* minimizersGroup = 0
+    );
+
+    /** */
+    DebloomMinimizerAlgorithm (tools::storage::impl::Storage& storage);
+
+    /** */
+    const char* getClassName() const { return "DebloomMinimizerAlgorithm"; }
+
+private:
+
+    /** */
+    void execute_aux (
+        tools::misc::IProperties* bloomProps,
+        tools::misc::IProperties* cfpProps,
+        u_int64_t& totalSizeBloom,
+        u_int64_t& totalSizeCFP
+    );
+
+    tools::storage::impl::Group* _groupMinimizers;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _DEBLOOM_MINIMIZER_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/LinearCounter.cpp b/gatb-core/src/gatb/kmer/impl/LinearCounter.cpp
new file mode 100644
index 0000000..cd4c89f
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/LinearCounter.cpp
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "LinearCounter.hpp"
+#include <cmath> // for log2f
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::kmer::impl;
+
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace kmer          {
+namespace impl          {
+/********************************************************************************/
+
+    template<size_t span>
+    LinearCounter<span>:: LinearCounter (
+        u_int64_t   bloom_size
+    )
+        : _bloomSize (bloom_size) 
+    {
+        tools::misc::BloomKind bloomKind = tools::misc::BLOOM_BASIC;
+        bloom = tools::collections::impl::BloomFactory::singleton().createBloom<Type> (
+                                bloomKind, (u_int64_t)(bloom_size), 1, 31
+                                                        );
+    }
+
+    template<size_t span>
+    void LinearCounter<span>::add(const Type &kmer)
+    {
+        bloom->insert(kmer);
+    }
+
+    template<size_t span>
+    long LinearCounter<span>::count()
+    {
+        long weight = bloom->weight();
+        long count =  ( (-1.0*_bloomSize) * logf( (1.0*_bloomSize - weight) / _bloomSize ) );  // linear counter cardinality estimation
+
+        bool debug=false;
+        if (debug)
+        {
+            printf("linear counter load factor: %0.2f\n",(1.0*weight/_bloomSize));
+            printf("weight: %ld bloomsize: %ld count: %ld\n",weight,(long)_bloomSize, count);
+        }
+        return count;
+    }
+
+    template<size_t span>
+    bool LinearCounter<span>::is_accurate()
+    {
+        long weight = bloom->weight();
+        float load_factor = (1.0*weight/_bloomSize);
+        return load_factor < 0.99;
+    }
+
+    template<size_t span>
+    LinearCounter<span>::~LinearCounter()
+    {
+        delete bloom;
+    }
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+
diff --git a/gatb-core/src/gatb/kmer/impl/LinearCounter.hpp b/gatb-core/src/gatb/kmer/impl/LinearCounter.hpp
new file mode 100644
index 0000000..1434f82
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/LinearCounter.hpp
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file LinearCounter.hpp
+ *  \brief Linear counter for kmers using a bloom
+ */
+
+#ifndef _GATB_CORE_KMER_IMPL_BLOOM_BUILDER_HPP_
+#define _GATB_CORE_KMER_IMPL_BLOOM_BUILDER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/misc/api/IProperty.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/math/NativeInt8.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/*
+ * This class is a linear counter
+ */
+template<size_t span=KMER_DEFAULT_SPAN> class LinearCounter
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::Count Count;
+    typedef typename Kmer<span>::ModelCanonical::Kmer  Kmer;
+
+    /** */
+    LinearCounter (u_int64_t   bloom_size);
+
+    void add (const Type& kmer);
+    long count();
+    bool is_accurate();
+
+    ~LinearCounter();
+
+private:
+
+    gatb::core::tools::collections::impl::IBloom<Type>* bloom;
+
+    u_int64_t _bloomSize;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_LINEARCOUNTER_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.cpp
new file mode 100644
index 0000000..82190d6
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.cpp
@@ -0,0 +1,367 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/MPHFAlgorithm.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <iostream>
+#include <limits>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+static const char* messages[] = {
+    "MPHF: initialization                   ",
+    "MPHF: build hash function              ",
+    "MPHF: assign values                    ",
+    "MPHF: populate                         "
+};
+
+/** First tried to set the constant in the hpp file but got the following error:
+ *  "error: a function call cannot appear in a constant-expression"
+ *  Solved by putting it in the cpp...
+ *      => http://stackoverflow.com/questions/2738435/using-numeric-limitsmax-in-constant-expressions
+ */
+template<size_t span, typename Abundance_t, typename NodeState_t>
+	const Abundance_t MPHFAlgorithm<span,Abundance_t,NodeState_t>::MAX_ABUNDANCE =  std::numeric_limits<Abundance_t>::max();
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Abundance_t, typename NodeState_t>
+MPHFAlgorithm<span,Abundance_t,NodeState_t>::MPHFAlgorithm (
+    Group&              group,
+    const std::string&  name,
+    Iterable<Count>*    solidCounts,
+    Iterable<Type>*     solidKmers,
+    unsigned int        nbCores,
+    bool                buildOrLoad,
+    IProperties*        options
+)
+    :  Algorithm("mphf", nbCores, options), _group(group), _name(name), _buildOrLoad(buildOrLoad),
+       _dataSize(0), _nb_abundances_above_precision(0), _solidCounts(0), _solidKmers(0), _abundanceMap(0), _nodeStateMap(0), _adjacencyMap(0), _progress(0)
+{
+    /** We keep a reference on the solid kmers. */
+    setSolidCounts (solidCounts);
+
+    /** We keep a reference on the solid kmers. */
+    setSolidKmers (solidKmers);
+
+    /** We build the hash object. */
+    setAbundanceMap (new AbundanceMap());
+    setNodeStateMap (new NodeStateMap());
+    setAdjacencyMap (new AdjacencyMap());
+
+    /** In case of load, we load the mphf and populate right now. */
+    if (buildOrLoad == false)
+    {
+        /** We load the hash object from the dedicated storage group. */
+        {   TIME_INFO (getTimeInfo(), "load");
+            _abundanceMap->load (_group, _name);
+        }
+
+        /** We populate the abundance hash table. */
+        populate ();
+
+        /** init a clean node state map */
+        initNodeStates ();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t,typename NodeState_t>
+MPHFAlgorithm<span,Abundance_t,NodeState_t>::~MPHFAlgorithm ()
+{
+    /** Cleanup */
+    setSolidCounts (0);
+    setSolidKmers  (0);
+    setAbundanceMap(0);
+    setNodeStateMap(0);
+    setAdjacencyMap(0);
+    setProgress    (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span, typename Abundance_t, typename NodeState_t>
+void MPHFAlgorithm<span,Abundance_t,NodeState_t>::execute ()
+{
+    /** We check whether we can use such a type. */
+    if (_buildOrLoad == true)
+    {
+        /** We need a progress object. */
+        tools::dp::IteratorListener* delegate = createIteratorListener(0,"");  LOCAL (delegate);
+        setProgress (new ProgressCustom(delegate));
+
+		
+
+		//if MPHF_BOOPHF and verbose 0,  give a null progress to the builder, make it understand the internal progress bar of boophf needs to be removed
+		if((typeid(*delegate) == typeid(tools::dp::IteratorListener)))
+			setProgress    (0);
+
+
+        // get number of threads from dispatcher
+        unsigned int nbThreads = this->getDispatcher()->getExecutionUnitsNumber();
+
+        /** We build the hash. */
+        {   TIME_INFO (getTimeInfo(), "build");
+            _abundanceMap->build (*_solidKmers, nbThreads, _progress);
+        }
+
+        /** We save the hash object in the dedicated storage group. */
+        {   TIME_INFO (getTimeInfo(), "save");
+            _dataSize = _abundanceMap->save (_group, _name);
+        }
+
+        /** We populate the hash table. */
+        populate ();
+        
+        /** init a clean node state map */
+        initNodeStates ();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t, typename NodeState_t>
+float MPHFAlgorithm<span,Abundance_t,NodeState_t>::getNbBitsPerKmer () const
+{
+    float nbitsPerKmer = sizeof(Abundance_t)*8 + sizeof(NodeState_t) * 4 + sizeof(Adjacency_t) * 8 ;
+    return nbitsPerKmer;
+}
+
+/********************************************************************/
+
+template<size_t span,typename Abundance_t,typename NodeState_t>
+void MPHFAlgorithm<span,Abundance_t,NodeState_t>::initNodeStates()
+{
+    _nodeStateMap->useHashFrom(_abundanceMap, 2); // use abundancemap's MPHF, and allocate n/2 bytes
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t,typename NodeState_t>
+void MPHFAlgorithm<span,Abundance_t,NodeState_t>::populate ()
+{
+    size_t nb_iterated = 0;
+    size_t n = _abundanceMap->size();
+
+    _nb_abundances_above_precision = 0;
+
+    /** We need a progress object. */
+    tools::dp::IteratorListener* delegate = createIteratorListener(_solidCounts->getNbItems(),messages[3]);  LOCAL (delegate);
+    setProgress (new ProgressCustom(delegate));
+
+    SubjectIterator<Count>* itKmers = new SubjectIterator<Count> (_solidCounts->iterator(), _solidCounts->getNbItems()/100);
+    itKmers->addObserver (_progress);
+    LOCAL (itKmers);
+
+    // TODO parallize that
+
+	std::vector<int> & _abundanceDiscretization =  _abundanceMap->_abundanceDiscretization ;
+	int max_abundance_discrete = _abundanceDiscretization[_abundanceDiscretization.size()-2];
+    // set counts and at the same time, test the mphf
+    for (itKmers->first(); !itKmers->isDone(); itKmers->next())
+    {
+        //cout << "kmer: " << itKmers->item().value.toString(21) << std::endl;
+        
+        /** We get the hash code of the current item. */
+        typename AbundanceMap::Hash::Code h = _abundanceMap->getCode (itKmers->item().value);
+
+        /** Little check. */
+        if (h >= n) {  throw Exception ("MPHF check: value out of bounds"); }
+
+        /** We get the abundance of the current kmer. */
+        int abundance = itKmers->item().abundance;
+
+        if (abundance > max_abundance_discrete)
+        {
+            _nb_abundances_above_precision++;
+            abundance = max_abundance_discrete;
+        }
+
+		//get first cell strictly greater than abundance
+		std::vector<int>::iterator  up = std::upper_bound(_abundanceDiscretization.begin(), _abundanceDiscretization.end(), abundance);
+		up--; // get previous cell
+		int idx = up- _abundanceDiscretization.begin() ;
+        /** We set the abundance of the current kmer. */
+        _abundanceMap->at (h) = idx;
+
+        nb_iterated ++;
+    }
+
+    if (nb_iterated != n && n > 3)
+    {
+        throw Exception ("ERROR during abundance population: itKmers iterated over %d/%d kmers only", nb_iterated, n);
+    }
+
+#if 1
+    // you know what? let's always test if the MPHF does not have collisions, it won't hurt.
+    check ();
+#endif
+
+    /** We gather some statistics. */
+    getInfo()->add (1, "stats");
+    getInfo()->add (2, "nb_keys",               "%ld",  _abundanceMap->size());
+    getInfo()->add (2, "data_size",             "%ld",  _dataSize);
+    getInfo()->add (2, "bits_per_key",          "%.3f", (float)(_dataSize*8)/(float)_abundanceMap->size());
+    getInfo()->add (2, "prec",                  "%d",   MAX_ABUNDANCE);
+    getInfo()->add (2, "nb_abund_above_prec",   "%d",   _nb_abundances_above_precision);
+    getInfo()->add (1, getTimeInfo().getProperties("time"));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t, typename NodeState_t>
+void MPHFAlgorithm<span,Abundance_t,NodeState_t>::check ()
+{
+    size_t nb_iterated = 0;
+
+    Iterator<Count>* itKmers = _solidCounts->iterator();  LOCAL (itKmers);
+    
+    // TODO parallize that too
+
+    for (itKmers->first(); !itKmers->isDone(); itKmers->next())
+    {
+        Count& count = itKmers->item();
+
+        /** We get the current abundance. */
+        Abundance_t abundance = (*_abundanceMap)[count.value];
+
+        // sanity check (thank god i wrote this, was useful for spruce) //todo change this now that abundance is discretized
+       /* if (abundance!=count.abundance && abundance<MAX_ABUNDANCE)
+        {  
+            std::cout << "debug info: " << (int)abundance << " " << (int)count.abundance << std::endl;
+            typename AbundanceMap::Hash::Code h = _abundanceMap->getCode (count.value);
+            size_t n = _abundanceMap->size();
+            std::cout << "debug info: " << h << " / " << n << std::endl;
+            throw Exception ("ERROR: MPHF isn't injective (abundance population failed)");  
+        }*/
+
+        nb_iterated ++;
+    }
+
+    if (nb_iterated != _abundanceMap->size() && _abundanceMap->size() > 3)
+    {
+        throw Exception ("ERROR during abundance population: itKmers iterated over %d/%d kmers only", nb_iterated, _abundanceMap->size());
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t, typename NodeState_t>
+MPHFAlgorithm<span,Abundance_t,NodeState_t>::ProgressCustom::ProgressCustom (tools::dp::IteratorListener* ref)
+  : tools::misc::impl::ProgressProxy (ref), nbReset(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span,typename Abundance_t, typename NodeState_t>
+void MPHFAlgorithm<span,Abundance_t,NodeState_t>::ProgressCustom::reset (u_int64_t ntasks)
+{
+    const char* label = nbReset < sizeof(messages)/sizeof(messages[0]) ? messages[nbReset++] : "other";
+
+    getRef()->reset(ntasks);
+    getRef()->setMessage (label);
+    getRef()->init();
+}
+
+/********************************************************************************/
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.hpp
new file mode 100644
index 0000000..8d7aae9
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/MPHFAlgorithm.hpp
@@ -0,0 +1,190 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _GATB_CORE_KMER_IMPL_MPHF_ALGORITHM_HPP_
+#define _GATB_CORE_KMER_IMPL_MPHF_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/impl/MapMPHF.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Algorithm that builds a hash table whose keys are kmers and values are
+ *  kmer abundances.
+ *
+ *  This class uses a [kmer,abundance] mapping by using a minimal perfect hash function (MPHF).
+ *  For N kmers (ie. the keys), the hash function gives a unique integer value between
+ *  0 and N-1.
+ *
+ *  It uses two template parameters:
+ *      1) span : gives the max usable size for kmers
+ *      2) Abundance_t : type of the abundance values (on 1 byte by default)
+ *      2) NodeState_t : type of the node states values (on half a byte by default, grouped by two per byte)
+ *
+ *  Storing the values (ie. the abundances) is done by creating a vector of size N. Asking
+ *  the abundance of a kmer consists in:
+ *      * getting the hash code H of the kmer
+ *      * getting the object at index H in the vector of values.
+ *
+ * The MPHF function is built from a list of kmers values of type Kmer<span>::Type. Since
+ * the building of the MPHF may take a while, it is saved in a Storage object; more precisely,
+ * it is saved in a collection given by a couple [group,name]. Such a couple is likely to be
+ * the group of the SortingCount algorithm, with a name being by convention "mphf".
+ *
+ * Once the MPHF is built, it is populated by the kmers abundance values, which means that we
+ * set each value of each key of the hash table. The abundances are clipped to a maximum value
+ * in order not to exceed the Abundance_t type capacity (provided as a template of the
+ * MPHFAlgorithm class). The maximum value is computed through the std::numeric_limits traits.
+ *
+ * Once the abundance map is built and populated, it is available through the 'getAbundanceMap' method. It may
+ * be used for instance by the Graph class in order to get the abundance of any node (ie. kmer)
+ * of the de Bruijn graph.
+ *
+ * Note: the keys of the hash table are of type Kmer<span>::Type, but we need however to have
+ * the abundance information through the Kmer<span>::Count type. That's why we need to use
+ * 2 Iterable instances, one of type Kmer<span>::Count and one of type Kmer<span>::Type.
+ *
+ * Some statistics about the MPHF building are gathered and put into the Properties 'info'.
+ */
+template<size_t span=KMER_DEFAULT_SPAN, typename Abundance_t=u_int8_t, typename NodeState_t=u_int8_t>
+class MPHFAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    /** Shortcuts. */
+    typedef typename kmer::impl::Kmer<span>::Type  Type;
+    typedef typename kmer::impl::Kmer<span>::Count Count;
+
+    /** We define the maximum abundance according to the provided type (value set in the cpp file). */
+    static const Abundance_t MAX_ABUNDANCE;
+
+    /** We define the type of the hash table of couples [kmer/abundance]. */
+    typedef tools::collections::impl::MapMPHF<Type,Abundance_t>  AbundanceMap;
+    
+    /** We define the type of the hash table of couples [kmer/node state]. */
+    typedef tools::collections::impl::MapMPHF<Type,NodeState_t>  NodeStateMap;
+
+    /** We define the type of the hash table of couples [kmer/graph adjacency information]. */
+    typedef u_int8_t Adjacency_t;
+    typedef tools::collections::impl::MapMPHF<Type,Adjacency_t>  AdjacencyMap;
+
+
+    /** Constructor.
+     * \param[in] group : storage group where to save the MPHF once built
+     * \param[in] name : name of the collection in the group where the MPHF will be saved
+     * \param[in] solidCounts : iterable on couples [kmers/abundance]
+     * \param[in] solidKmers  : iterable on kmers
+     * \param[in] buildOrLoad : true for build/save the MPHF, false for load only
+     * \param[in] options : extra options for configuration (may be empty) */
+    MPHFAlgorithm (
+        tools::storage::impl::Group&          group,
+        const std::string&                    name,
+        tools::collections::Iterable<Count>*  solidCounts,
+        tools::collections::Iterable<Type>*   solidKmers,
+        unsigned int                          nbCores,
+        bool                                  buildOrLoad,
+        tools::misc::IProperties*   options    = 0
+    );
+
+    /** Destructor. */
+    ~MPHFAlgorithm ();
+
+    /** Implementation of the Algorithm::execute method. */
+    void execute ();
+
+    /** Get the number of bits of a value.
+     * \return the number of bits per kmer. */
+    float getNbBitsPerKmer () const;
+
+    /** Accessor to the map. Note : if clients get this map and use it (as a SmartPointer),
+     * the map instance will be still alive (ie. not deleted) even if the MPHFAlgorithm
+     * instance that built it is deleted first.
+     * \return the map instance. */
+    AbundanceMap* getAbundanceMap () const  { return _abundanceMap; }
+    NodeStateMap* getNodeStateMap () const  { return _nodeStateMap; }
+    NodeStateMap* getAdjacencyMap () const  { return _adjacencyMap; }
+
+private:
+
+    tools::storage::impl::Group& _group;
+    std::string                  _name;
+    bool                         _buildOrLoad;
+    size_t                       _dataSize;
+    size_t                       _nb_abundances_above_precision;
+
+    /** Iterable on the couples [kmer,abundance] */
+    tools::collections::Iterable<Count>* _solidCounts;
+    void setSolidCounts (tools::collections::Iterable<Count>* solidCounts)  {  SP_SETATTR(solidCounts); }
+
+    /** Iterable on the kmers */
+    tools::collections::Iterable<Type>* _solidKmers;
+    void setSolidKmers (tools::collections::Iterable<Type>* solidKmers)  {  SP_SETATTR(solidKmers); }
+
+    /** Hash table instance. */
+    AbundanceMap* _abundanceMap;
+    NodeStateMap* _nodeStateMap;
+    AdjacencyMap* _adjacencyMap;
+    void setAbundanceMap (AbundanceMap* abundanceMap)  { SP_SETATTR(abundanceMap); }
+    void setNodeStateMap (NodeStateMap* nodeStateMap)  { SP_SETATTR(nodeStateMap); }
+    void setAdjacencyMap (AdjacencyMap* adjacencyMap)  { SP_SETATTR(adjacencyMap); }
+
+    /** Set the abundance for each entry in the hash table. */
+    void populate ();
+    
+    /** Initialize the node state for each entry in the hash table. */
+    void initNodeStates ();
+
+    /** Check the content of the map once built. */
+    void check ();
+
+    /** We define a specific Progress class for progress feedback during hash function building.
+     * We need a special implementation here because of emphf (we can't modify too much code in
+     * emphf, so we have to hack it some stuff here). */
+    class ProgressCustom : public tools::misc::impl::ProgressProxy
+    {
+    public:
+        ProgressCustom (tools::dp::IteratorListener* ref);  void reset (u_int64_t ntasks);
+    private:
+        size_t nbReset;
+    };
+
+    /** Progress instance. */
+    tools::dp::IteratorListener* _progress;
+    void setProgress (tools::dp::IteratorListener* progress)  { SP_SETATTR(progress); }
+	
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_MPHF_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/Model.cpp b/gatb-core/src/gatb/kmer/impl/Model.cpp
new file mode 100644
index 0000000..d68cc89
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Model.cpp
@@ -0,0 +1,28 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {  namespace kmer  {  namespace impl  {
+/********************************************************************************/
+ 
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/Model.hpp b/gatb-core/src/gatb/kmer/impl/Model.hpp
new file mode 100644
index 0000000..d40e8e9
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Model.hpp
@@ -0,0 +1,1598 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Model.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Kmer management
+ */
+
+#ifndef _GATB_CORE_KMER_IMPL_MODEL_HPP_
+#define _GATB_CORE_KMER_IMPL_MODEL_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/Exception.hpp>
+
+#include <gatb/kmer/api/IModel.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/misc/api/Data.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+
+#include <gatb/tools/math/Integer.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <vector>
+#include <algorithm>
+#include <iostream>
+#include <bitset>
+
+extern const char bin2NT[] ;
+extern const char binrev[] ;
+extern const unsigned char revcomp_4NT[];
+extern const unsigned char comp_NT    [];
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace kmer      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/** We get the nth defined kmer size. */
+#define KMER_SPAN(n)  (boost::mpl::at<gatb::core::tools::math::IntegerList, boost::mpl::int_<n> >::type::value)
+
+/** We get the first value in the kmer size list. */
+#define KMER_DEFAULT_SPAN  KMER_SPAN(0)
+
+/********************************************************************************/
+
+/** \brief Entry point for kmer management.
+ *
+ * This structure is only a container for other types defined inside. The specificity is
+ * that this structure is templated by a 'span' integer that represents the maximal kmer
+ * size supported (actually, the max value is 'span-1').
+ *
+ * Inside this structure, we have the following main elements:
+ *      - 'Type'  : this is the integer type representing kmer values
+ *      - 'Model' : provides many services for managing kmers
+ *      - 'Count' : roughly speaking, this a kmer value with an associated abundance
+ *
+ * This structure must be used only with for 4 values (32,64,96,128 for instance, see Model.cpp), otherwise
+ * a compilation error occurs (more values could be added in the future).
+ *
+ * A default value of 32 is defined for the template parameter, so writing 'Kmer<>::Model'
+ * represents a model that supports kmers of size up to 31 (included).
+ */
+template <size_t span=KMER_DEFAULT_SPAN>
+struct Kmer
+{
+    /************************************************************/
+    /***********************     TYPE     ***********************/
+    /************************************************************/
+
+    /** Alias type for the integer value of a kmer. We use the LargeInt class for supporting big integers.
+     * Note that the template parameter 'span' represents the maximal kmer size supported by the Kmer class.
+     * A conversion to the template parameter of LargeInt is done.
+     */
+    typedef tools::math::LargeInt<(span+31)/32> Type;
+
+
+    /************************************************************/
+    /***********************     MODEL    ***********************/
+    /************************************************************/
+
+    /** Forward declarations. */
+    class ModelDirect;
+    class ModelCanonical;
+    template<class Model, class Comparator> class ModelMinimizer;
+
+    /** Now, we need to define what is a kmer for each kind of model.
+     *
+     * The simple case is KmerDirect, where only the value of the kmer is available
+     * as a method 'value' returning a Type object.
+     *
+     * The second case is KmerCanonical, which is the same as KmerDirect, but with
+     * two other methods 'forward' and 'revcomp'
+     *
+     * The third case is KmerMinimizer<Model> which allows to handle minimizers associated
+     * to a kmer. This class inherits from the Model::Kmer type and adds methods specific
+     * to minimizers, such as 'minimizer' itself (ie the Model::Kmer object holding the
+     * minimizer), 'position' giving the position of the minimizer whithin the kmer and
+     * 'hasChanged' telling whether a minimizer has changed during iteration of kmers from
+     * some data source (a sequence data for instance).
+     */
+
+    /** \brief Kmer type for the ModelDirect class.
+     *
+     * This class represent direct kmers, ie. a mere Type value.
+     *
+     *  NOTE: this class is not intended to be used directly by end users. Instead, the typedef definition
+     *  \ref ModelDirect::Kmer should be preferred.
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_direct
+     */
+    class KmerDirect
+    {
+    public:
+        /** Returns the value of the kmer.
+         * \return the kmer value as a Type object. */
+        const Type& value  () const { return _value;   }
+
+        /** This is a dummy function that always returns the value of the kmer in the forward direction, even when "which" is 1.
+         * it's provided for API compatibility with KmerCanonical
+         * We could compute revcomp(_value) when which=1, but KmerDirect doesn't know about its k-mer size.
+         * \param[in] which: dummy parameter
+         * \return the kmer value as a Type object. */
+        const Type& value  (int which) const { if (which==1){ std::cout << "unsupported call to value(which) for KmerDirect" << std::endl; exit(1); } 
+                                               return _value;   }
+
+        /*_ Comparison operator between two instances.
+         * \param[in] t : object to be compared to
+         * \return true if the values are the same, false otherwise. */
+        bool operator< (const KmerDirect& t) const  { return this->_value < t._value; };
+
+        /** Set the value of the kmer
+         * \param[in] val : value to be set. */
+        void set (const Type& val) { _value=val; }
+
+        /** Tells whether the kmer is valid or not. It may be invalid if some unwanted
+         * nucleotides characters (like N) have been used to build it.
+         * \return true if valid, false otherwise. */
+        bool isValid () const { return _isValid; }
+
+        /* compatibility with KmerCanonical API */
+        bool which () const { return true; }
+
+        /* compatibility with KmerCanonical API */
+        Strand strand() const { return STRAND_FORWARD;  }
+
+        /* compatibility with KmerCanonical API */
+        const Type& forward() const { return value(); }
+
+        /** Returns the reverse complement value of this canonical kmer.
+         * \return the reverse complement value */
+//        const Type& revcomp() const { return  }
+
+
+    protected:
+        Type _value;
+        bool _isValid;
+        friend class ModelDirect;
+
+        /** Extract a mmer from a kmer. This is done by using a mask on the kmer.
+         * \param[in] mask : mask to be applied to the current kmer
+         * \param[in] size : shift size (needed for some kmer classes but not all)
+         * \param[in] mmer_lut : lookup table of minimizers
+         * \return the extracted kmer.
+         */
+
+        KmerDirect extract      (const Type& mask, size_t size, Type * mmer_lut)  {  KmerDirect output;  output.set (mmer_lut[(this->value() & mask).getVal()]);  return output;  }
+        KmerDirect extractShift (const Type& mask, size_t size, Type * mmer_lut)  {  KmerDirect output = extract(mask,size,mmer_lut);  _value = _value >> 2;  return output;  }
+    };
+
+    /** \brief Kmer type for the ModelCanonical class.
+     *
+     * This class represent canonical kmers, ie. a value that is the minimal value of the forward kmer
+     * and its reverse complement.
+     *
+     * The implementation maintains a table of two Type objects, the first one for the forward kmer and
+     * the second one for the reverse complement.
+     *
+     * We can know which object is the canonical one (ie. the minimum) by using the
+     *  method \ref value.*  One can also retrieve the strand used for the canonical form with the method
+     *  \ref strand.
+     *
+     * It is still possible to get the forward kmer with \ref forward and the reverse complement with \ref
+     *  revcomp.
+     *
+     *  NOTE: this class is not intended to be used directly by end users. Instead, the typedef definition
+     *  \ref ModelCanonical::Kmer should be preferred.
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_canonical
+     */
+    class KmerCanonical
+    {
+    public:
+
+        /** Returns the value of the kmer.
+         * \return the kmer value as a Type object. */
+        const Type& value  () const { return table[(int)choice];   }
+
+        /** Returns the value of the kmer.
+         * \param[in] which: forward or reverse strand
+         * \return the kmer value as a Type object. */
+        const Type& value  (int which) const { return table[which];   }
+
+        /** Comparison operator between two instances.
+         * \param[in] t : object to be compared to
+         * \return true if the values are the same, false otherwise. */
+        bool operator< (const KmerDirect& t) const  { return this->value() < t.value(); };
+
+        /** Set the value of the kmer. IMPORTANT: Not really a forward/revcomp couple,
+         * but may be useful for the minimizer default value.
+         * \param[in] val : value to be set (set to both forward and reverse complement). */
+        void set (const Type& val)
+        {
+            table[0]=val;
+            table[1]=val;
+            choice = 0;
+        }
+
+        void set (const u_int64_t& val)
+        {
+            table[0].setVal(val);
+            table[1].setVal(val);
+            choice = 0;
+        }
+
+
+        /** Set the forward/revcomp attributes. The canonical form is computed here.
+         * \param[in] forward : forward value
+         * \param[in] revcomp : reverse complement value.
+         */
+        void set (const Type& forward, const Type& revcomp)
+        {
+            table[0]=forward;
+            table[1]=revcomp;
+            updateChoice ();
+        }
+		
+        /** Tells whether the kmer is valid or not. It may be invalid if some unwanted
+         * nucleotides characters (like N) have been used to build it.
+         * \return true if valid, false otherwise. */
+        bool isValid () const { return _isValid; }
+
+        /** Returns the forward value of this canonical kmer.
+         * \return the forward value */
+        const Type& forward() const { return table[0]; }
+
+        /** Returns the reverse complement value of this canonical kmer.
+         * \return the reverse complement value */
+        const Type& revcomp() const { return table[1]; }
+
+        /** Tells which strand is used for the kmer.
+         * \return true if the kmer value is the forward value, false if it is the reverse complement value
+         */
+        bool which () const { return choice==0 ? true : false; }
+
+        /** Tells which strand is used.
+         * \return the used strand. */
+        Strand strand() const { return which() ? STRAND_FORWARD : STRAND_REVCOMP; }
+
+        /* tells whether a kmer and its revcomp are identical */
+        bool isPalindrome () const { return table[0] == table[1]; }
+
+    protected:
+        Type table[2];  char choice;
+		
+        bool _isValid;
+        void updateChoice () { choice = (table[0] < table[1]) ? 0 : 1; }
+        friend class ModelCanonical;
+
+        /** Extract a mmer from a kmer. This is done by using a mask on the kmer.
+         * \param[in] mask : mask to be applied to the current kmer
+         * \param[in] size : shift size (needed for some kmer classes but not all)
+         * \param[in] mmer_lut : lookup table of minimizers
+         * \return the extracted kmer.
+         */
+        KmerCanonical extract (const Type& mask, size_t size, Type* mmer_lut)
+        {
+
+            KmerCanonical output;
+			
+			output.set(mmer_lut[(this->table[0] & mask).getVal()]); //no need to recomp updateChoice with this
+			//mmer_lut takes care of revcomp and forbidden mmers
+			//output.set (this->table[0] & mask, (this->table[1] >> size) & mask);
+            //output.updateChoice();
+            return output;
+        }
+
+
+        KmerCanonical extractShift (const Type& mask, size_t size, Type * mmer_lut)
+        {
+            KmerCanonical output = extract (mask, size,mmer_lut);
+            table[0] = table[0] >> 2;   table[1] = table[1] << 2;  updateChoice();
+            return output;
+        }
+       
+     };
+
+    /** \brief Kmer type for the ModelMinimizer class.
+     *
+     * This class associates a kmer and its minimizer. It inherits from the Model::Kmer type
+     * and adds methods specific to minimizers, such as \ref minimizer itself
+     * (ie the Model::Kmer object holding the minimizer),
+     * \ref position giving the position of the minimizer whithin the kmer and
+     * \ref hasChanged telling whether a minimizer has changed during iteration of kmers from
+     * some data source (a sequence data for instance).
+     *
+     * NOTE: this class is not intended to be used directly by end users. Instead, the typedef definition
+     * \ref ModelMinimizer::Kmer should be preferred.
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_minimizer
+     */
+    template<class Model, class Comparator>
+    class KmerMinimizer : public Model::Kmer
+    {
+    public:
+
+        /** Returns the minimizer of the current kmer as a Model::Kmer object
+         * \return the Model::Kmer instance */
+        const typename Model::Kmer& minimizer() const  {  return _minimizer; }
+
+        /** Returns the position of the minimizer within the kmer. By convention,
+         * a negative value means that there is no minimizer inside the kmer.
+         * \return the position of the minimizer. */
+        int position () const  {  return _position;  }
+
+        /** Tells whether the minimizer has changed; useful while iterating kmers
+         * \return true if changed, false otherwise */
+        bool hasChanged () const  {  return _changed;  }
+
+    protected:
+
+        typename Model::Kmer _minimizer;
+        int16_t              _position;
+        bool                 _changed;
+        friend class ModelMinimizer<Model,Comparator>;
+    };
+
+    /** Abstract class that provides kmer management.
+     *
+     * This class is the base class for kmer management. It provides several services on this purpose
+     * like getting kmer information from some nucleotides sequence, or iterate kmers through such
+     * a sequence.
+     *
+     * This class has two templates types :
+     *
+     *      1) ModelImpl : ModelAbstract is design for static polymorphism and ModelImpl is the implementation
+     *                     that must be provided to it
+     *
+     *      2) T : type of kmers handled by the class (ie KmerDirect, KmerCanonical...); I was not successful
+     *             in trying to hide KmerXXX classes in the dedicated ModelXXX classes because of mutual
+     *             dependencies while template specializations (maybe a solution one day)
+     *
+     * End user will be given instances of Kmer class, delivering more or less information according to the
+     * specific type of ModelImpl
+     */
+    template <class ModelImpl, typename T>
+    class ModelAbstract : public system::SmartPointer
+    {
+    public:
+
+        /** Type of kmers provided by the class. It can be KmerDirect, KmerCanonical or KmerMinimizer.
+         *
+         * The simple way to get the value of the kmer is done with the 'value' method.
+         *
+         * Note that, according to the true type of T, this Kmer typedef may have more or less methods. */
+        typedef T Kmer;
+
+        /** (default) Constructor. The provided (runtime) kmer size must be coherent with the span (static) value.
+         * \param[in] sizeKmer : size of kmers handled by the instance.*/
+        ModelAbstract (size_t sizeKmer=span-1) : _kmerSize(sizeKmer)
+        {
+            /** We check that the Type precision is enough for the required kmers span. */
+            if (sizeKmer >= span)
+            {
+                throw system::Exception ("Type '%s' has too low precision (%d bits) for the required %d kmer size",
+                    Type().getName(), Type().getSize(), sizeKmer
+                );
+            }
+
+            /** We compute the mask of the kmer. Useful for computing kmers in a recursive way. */
+            Type un;
+            un.setVal(1);
+            _kmerMask = (un << (_kmerSize*2)) - un;
+
+            size_t shift = 2*(_kmerSize-1);
+
+            /** The _revcompTable is a shortcut used while computing revcomp recursively. */
+            /** Important: don't forget the Type cast, otherwise the result in only on 32 bits. */
+            for (size_t i=0; i<4; i++)   {  Type tmp; tmp.setVal(comp_NT[i]);  _revcompTable[i] = tmp << shift;  }
+        }
+
+        /** Returns the span of the model
+         * \return the model span. */
+        size_t getSpan () const { return span; }
+
+        /** Get the memory size (in bytes) of a Kmer<span>::Type object.
+         * \return the memory size of a kmer. */
+        size_t getMemorySize ()  const  { return sizeof (Type); }
+
+        /** Gives the kmer size for this model.
+         * \return the kmer size. */
+        size_t getKmerSize () const { return _kmerSize; }
+
+        /** Gives the maximum value of a kmer for the instance.
+         * \return the maximum kmer value. */
+        const Type& getKmerMax () const { return _kmerMask; }
+
+        /** Returns an ascii representation of the kmer value.
+         * \param[in] kmer : the kmer we want an ascii representation for
+         * \return a string instance holding the ascii representation. */
+        std::string toString (const Type& kmer) const  {  return kmer.toString(_kmerSize);  }
+        std::string toString (u_int64_t kmer) const  {  tools::math::LargeInt<1> km; km.setVal(kmer); return km.toString(_kmerSize);  }
+
+        /** Compute the reverse complement of a kmer.
+         * \param[in] kmer : the kmer to be reverse-completed.
+         * \return the reverse complement. */
+        Type reverse (const Type& kmer)  const  { return revcomp (kmer, this->_kmerSize); }
+
+        /** Build a kmer from a Data object (ie a sequence of nucleotides), starting at an index in the nucleotides sequence.
+         * The result is a pair holding the built kmer and a boolean set to yes if the built kmer has to be understood in
+         * the forward sense, false otherwise.
+         * \param[in] data : the data from which we extract a kmer
+         * \param[in] startIndex : start index in the data object (default to 0)
+         * \return a pair with the built kmer and a boolean set to yes if the kmer is understood in the forward strand
+         */
+        Kmer getKmer (const tools::misc::Data& data, size_t startIndex=0)  const
+        {
+            return codeSeed (data.getBuffer(), data.getEncoding(), startIndex);
+        }
+
+        /** Iteration of the kmers from a data object through a functor (so lambda expressions can be used).
+         * Note that the functor takes the currently iterated Kmer object and its index during the iteration.
+         *
+         *  Example of use:
+         * \snippet kmer8.cpp  snippet1_iterate
+         * \param[in] data : the sequence of nucleotides as a Data object.
+         * \param[in] callback  : functor that handles one kmer */
+        template<typename Callback>
+        bool iterate (tools::misc::Data& data, Callback callback) const
+        {
+            return execute <Functor_iterate<Callback> > (data.getEncoding(), Functor_iterate<Callback>(data,callback));
+        }
+
+        /** Compute the kmer given some nucleotide data.
+         *  Note that we don't check if we have enough nucleotides in the provided data.
+         * \param[in] seq : the sequence
+         * \param[in] encoding : encoding mode of the sequence
+         * \param[in] startIndex : index of the first nucleotide in the seq buffer
+         * \return the kmer for the given nucleotides. */
+        Kmer codeSeed (const char* seq, tools::misc::Data::Encoding_e encoding, size_t startIndex=0) const
+        {
+            return execute<Functor_codeSeed> (encoding, Functor_codeSeed(seq, startIndex));
+        }
+
+        /** Compute the next right kmer given a current kmer and a nucleotide.
+         * \param[in] kmer : the current kmer as a starting point
+         * \param[in] nucl : the next nucleotide
+         * \param[in] encoding : encoding mode of the sequence
+         * \return the kmer on the right of the given kmer. */
+        Kmer codeSeedRight (const Kmer& kmer, char nucl, tools::misc::Data::Encoding_e encoding)  const
+        {
+            return execute<Functor_codeSeedRight> (encoding, Functor_codeSeedRight(kmer,nucl));
+        }
+
+        /** Build a vector of successive kmers from a given sequence of nucleotides provided as a Data object.
+         * \param[in] data : the sequence of nucleotides.
+         * \param[out] kmersBuffer : the successive kmers built from the data object.
+         * \return true if kmers have been extracted, false otherwise. */
+		//GR : est ce quon pourrait passer un pointeur (de taille suffisante) au lieu  vector, pour pas avoir a faire resize dessus dans tas
+		// si taille pas suffisante,
+        bool build (tools::misc::Data& data, std::vector<Kmer>& kmersBuffer)  const
+        {
+            /** We compute the number of kmers for the provided data. Note that we have to check that we have
+             * enough nucleotides according to the current kmer size. */
+            int32_t nbKmers = data.size() - this->getKmerSize() + 1;
+            if (nbKmers <= 0)  { return false; }
+
+            /** We resize the resulting kmers vector. */
+            kmersBuffer.resize (nbKmers);
+
+            /** We fill the vector through a functor. */
+            this->iterate (data, BuildFunctor<Kmer>(kmersBuffer));
+
+            return true;
+        }
+
+        /** Iterate the neighbors of a given kmer; these neighbors are:
+         *  - 4 outgoing neighbors (with nt A,C,T,G)
+         *  - 4 incoming neighbors (with nt A,C,T,G)
+         *  This method uses a functor that will be called for each possible neighbor of the source kmer.
+         *  \param[in] source : the kmer from which we want neighbors.
+         *  \param[in] fct : a functor called for each neighbor.
+         *  \param[in] mask : holds 8 bits for each possible neighbor (1 means that the neighbor is computed)
+         */
+        template<typename Functor>
+        void iterateNeighbors (const Type& source, const Functor& fct, const std::bitset<8>& mask = 0xFF)  const
+        {
+            // hacky to cast Functor& instead of const Functor&, but don't wanna break API yet want non-const functor
+            iterateOutgoingNeighbors(source, (Functor&) fct, std::bitset<4> ( (mask.to_ulong() >> 0) & 15));
+            iterateIncomingNeighbors(source, (Functor&) fct, std::bitset<4> ( (mask.to_ulong() >> 4) & 15));
+        }
+
+        /** Iterate the neighbors of a given kmer; these neighbors are:
+         *  - 4 outcoming neighbors
+         *  This method uses a functor that will be called for each possible neighbor of the source kmer.
+         *  \param[in] source : the kmer from which we want neighbors.
+         *  \param[in] fct : a functor called for each neighbor.
+         *  \param[in] mask : mask of the neighbors to be used
+         */
+        template<typename Functor>
+        void iterateOutgoingNeighbors (const Type& source, Functor& fct, const std::bitset<4>& mask = 0x0F)  const
+        {
+            /** We compute the 4 possible neighbors. */
+            for (size_t nt=0; nt<4; nt++)
+            {
+                if (mask[nt] == true)
+                {
+                    Type next1 = (((source) * 4 )  + nt) & getKmerMax();
+                    Type next2 = revcomp (next1, getKmerSize());
+                    fct (std::min (next1, next2));
+                }
+            }
+        }
+
+        /** Iterate the neighbors of a given kmer; these neighbors are:
+         *  - 4 incoming neighbors
+         *  This method uses a functor that will be called for each possible neighbor of the source kmer.
+         *  \param[in] source : the kmer from which we want neighbors.
+         *  \param[in] fct : a functor called for each neighbor.
+         *  \param[in] mask : mask of the neighbors to be used
+         */
+        template<typename Functor>
+        void iterateIncomingNeighbors (const Type& source, Functor& fct, const std::bitset<4>& mask = 0x0F)  const
+        {
+            Type rev = core::tools::math::revcomp (source, getKmerSize());
+
+            /** We compute the 4 possible neighbors. */
+            for (size_t nt=0; nt<4; nt++)
+            {
+                /** Here, we use the complement of the current nucleotide 'nt', the idea is to have the same
+                 * nucleotide iteration than the iterateOutgoingNeighbors method.
+                 * Remember : A=0, C=1, T=2, G=3  (each coded on 2 bits)
+                 * => we can get the complement by negating the most significant bit (ie "nt^2") */
+
+                if (mask[nt] == true)
+                {
+                    Type next1 = (((rev) * 4 )  + (nt^2)) & getKmerMax();
+                    Type next2 = revcomp (next1, getKmerSize());
+                    fct (std::min (next1, next2));
+                }
+            }
+        }
+
+        /************************************************************/
+        /* \brief Iterator on successive kmers
+         *
+         * This class will iterate successive kmers extracted from a Data object.
+         * It is similar to the Model::build, except that here we don't have a container
+         * holding all the successive kmers (ie. we have here only sequential access and
+         * not direct access).
+         *
+         * To be used, such an iterator must be initialized with some sequence of nucleotides,
+         * which is done with the 'setData' method.
+         */
+        class Iterator : public tools::dp::impl::VectorIterator<Kmer>
+        {
+        public:
+            /** Constructor.
+             * \param[in] ref : the associated model instance.
+             */
+            Iterator (ModelAbstract& ref)  : _ref(ref)   {}
+
+            /** Set the data to be iterated.
+             * \param[in] d : the data as information source for the iterator
+             */
+            void setData (tools::misc::Data& d) // TODO: should this be const? I feel like it should
+            {
+                /** We fill the vector with the items to be iterated. */
+                _ref.build (d, this->_items);
+
+                /** We set the vector size. */
+                this->_nb = this->_items.size();
+            }
+
+        private:
+            /** Reference on the underlying model; called for its 'build' method. */
+            ModelAbstract& _ref;
+        };
+
+    protected:
+
+        /* Shortcuts. */
+        typedef tools::misc::Data::ConvertChar      ConvertChar;
+        typedef tools::misc::Data::ConvertASCII     ConvertASCII;
+        typedef tools::misc::Data::ConvertInteger   ConvertInteger;
+        typedef tools::misc::Data::ConvertBinary    ConvertBinary;
+
+        /* Size of a kmer for this model. */
+        size_t  _kmerSize;
+
+        /* Mask for the kmer. Used for computing recursively kmers. */
+        Type  _kmerMask;
+
+        /* Shortcut for easing/speeding up the recursive revcomp computation. */
+        Type _revcompTable[4];
+
+        /* \return -1 if valid, otherwise index of the last found bad character. */
+        template<class Convert>
+        int polynom (const char* seq, Type& kmer, size_t startIndex)  const
+        {
+            ConvertChar c;
+            int badIndex = -1;
+
+            /** We iterate 'kmersize" nucleotide to build the first kmer as a polynomial evaluation. */
+            kmer.setVal(0);
+            for (size_t i=0; i<_kmerSize; ++i)
+            {
+                /** We get the current nucleotide (and its invalid status). */
+                c = Convert::get(seq,i+startIndex);
+
+                /** We update the polynome value. */
+                kmer = (kmer<<2) + c.first;
+
+                /** We update the 'invalid' status: a single bad character makes the result invalid. */
+                if (c.second)  { badIndex = i; }
+            }
+
+            return badIndex;
+        }
+
+        /* Generic function that switches to the correct implementation according to the encoding scheme
+         * of the provided Data parameter; the provided functor class is specialized with the correct data conversion type
+         * and the called.
+         */
+        template<class Functor>
+        typename Functor::Result execute (tools::misc::Data::Encoding_e encoding, Functor action) const
+        {
+            switch (encoding)
+            {
+                case  tools::misc::Data::ASCII:    return action.template operator()<ConvertASCII  > (this);
+                case  tools::misc::Data::INTEGER:  return action.template operator()<ConvertInteger> (this);
+                case  tools::misc::Data::BINARY:   return action.template operator()<ConvertBinary>  (this);
+                default:  throw system::Exception ("BAD FORMAT IN 'execute'");
+            }
+        }
+
+        /* Adaptor between the 'execute' method and the 'codeSeed' method. */
+        struct Functor_codeSeed
+        {
+            typedef typename ModelImpl::Kmer Result;
+            const char* buffer;
+            size_t startIndex;
+            Functor_codeSeed (const char* buffer, size_t startIndex) : buffer(buffer), startIndex(startIndex) {}
+            template<class Convert>  Result operator() (const ModelAbstract* model)
+            {
+                Result result;
+                static_cast<const ModelImpl*>(model)->template first <Convert> (buffer, result, startIndex);
+                return result;
+            }
+        };
+
+        /* Adaptor between the 'execute' method and the 'codeSeedRight' method. */
+        struct Functor_codeSeedRight
+        {
+            typedef typename ModelImpl::Kmer Result;
+            const Kmer& kmer; char nucl;
+            Functor_codeSeedRight (const Kmer& kmer, char nucl) : kmer(kmer), nucl(nucl) {}
+            template<class Convert>  Result operator() (const ModelAbstract* model)
+            {
+                ConvertChar c = Convert::get(&nucl,0);
+                Result result=kmer;
+                static_cast<const ModelImpl*>(model)->template next <Convert> (c.first, result, c.second==0);
+                return result;
+            }
+        };
+
+        /* Adaptor between the 'execute' method and the 'iterate' method. */
+        template<class Callback>
+        struct Functor_iterate
+        {
+            typedef bool Result;
+            tools::misc::Data& data; Callback callback;
+            Functor_iterate (tools::misc::Data& data, Callback callback) : data(data), callback(callback) {}
+            template<class Convert>  Result operator() (const ModelAbstract* model)
+            {
+                return static_cast<const ModelImpl*>(model)->template iterate<Callback, Convert> (data.getBuffer(), data.size(), callback);
+            }
+        };
+
+        /** Template method that iterates the kmer of a given sequence (provided as a buffer and its length).
+         *  Note : we use static polymorphism here (http://en.wikipedia.org/wiki/Template_metaprogramming)
+         *  \param[in] seq : the sequence to be iterated
+         *  \param[in] length : length of the sequence
+         *  \param[in] callback : functor called on each found kmer in the sequence
+         *  \return true if kmers have been found, false otherwise.
+         */
+        template<typename Callback, typename Convert>
+        bool iterate (const char* seq, size_t length, Callback callback) const
+        {
+            /** We compute the number of kmers for the provided data. Note that we have to check that we have
+             * enough nucleotides according to the current kmer size. */
+            int32_t nbKmers = length - _kmerSize + 1;
+            if (nbKmers <= 0)  { return false; }
+
+            /** We create a result instance. */
+            typename ModelImpl::Kmer result;
+
+            /** We compute the initial seed from the provided buffer. */
+            int indexBadChar = static_cast<const ModelImpl*>(this)->template first<Convert> (seq, result, 0);
+
+            /** We need to keep track of the computed kmers. */
+            size_t idxComputed = 0;
+
+            /** We notify the result. */
+            this->notification<Callback> (result, idxComputed, callback);
+
+            /** We compute the following kmers from the first one.
+             * We have consumed 'kmerSize' nucleotides so far for computing the first kmer,
+             * so we start the loop with idx=_kmerSize.
+             */
+            for (size_t idx=_kmerSize; idx<length; idx++)
+            {
+                /** We get the current nucleotide. */
+                ConvertChar c = Convert::get (seq, idx);
+
+                if (c.second)  { indexBadChar = _kmerSize-1; }
+                else           { indexBadChar--;     }
+
+                /** We compute the next kmer from the previous one. */
+                static_cast<const ModelImpl*>(this)->template next<Convert> (c.first, result, indexBadChar<0);
+
+                /** We notify the result. */
+                this->notification<Callback> (result, ++idxComputed, callback);
+            }
+
+            return true;
+        }
+
+        template <class Callcack>
+        void  notification (const Kmer& value, size_t idx, Callcack callback) const {  callback (value, idx);  }
+
+        /** */
+        template<typename Type>
+        struct BuildFunctor
+        {
+            std::vector<Type>& kmersBuffer;
+            BuildFunctor (std::vector<Type>& kmersBuffer) : kmersBuffer(kmersBuffer) {}
+            void operator() (const Type& kmer, size_t idx)  {  kmersBuffer[idx] = kmer;  }
+        };
+		
+    };
+
+    /********************************************************************************/
+
+    /** \brief Model that handles "direct" kmers, ie sequences of nucleotides.
+     * The associated value of such a kmer is computed as a polynom P(X) with X=4
+     * and where the coefficients are in [0..3].
+     * By convention, we use A=0, C=1, T=2 and G=3
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_direct
+     */
+    class ModelDirect :  public ModelAbstract<ModelDirect, Kmer<span>::KmerDirect>
+    {
+    public:
+
+        /** Kmer type for this kind of model.  */
+        typedef Kmer<span>::KmerDirect Kmer;
+
+        /** Constructor.
+         * \param[in] kmerSize : size of the kmers handled by the model. */
+        ModelDirect (size_t kmerSize=span-1) : ModelAbstract<ModelDirect, Kmer> (kmerSize) {}
+
+        /** Computes a kmer from a buffer holding nucleotides encoded in some format.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] buffer : holds the nucleotides sequence from which the kmer has to be computed
+         * \param[out] value : kmer as a result
+         * \param[in] startIndex : index of the first nucleotide of the kmer to retrieve in the buffer
+         */
+        template <class Convert>
+        int first (const char* buffer, Kmer& value, size_t startIndex)   const
+        {
+           int result = this->template polynom<Convert> (buffer, value._value, startIndex);
+            value._isValid = result < 0;
+            return result;
+        }
+
+        /** Computes a kmer in a recursive way, ie. from a kmer and the next
+         * nucleotide. The next nucleotide is computed from a buffer and the
+         * index of the nucleotide within the buffer.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] c : next nucleotide
+         * \param[out] value : kmer to be updated with the provided next nucleotide
+         * \param[in] isValid : tells whether the updated kmer is valid or not
+         */
+        template <class Convert>
+        void  next (char c, Kmer& value, bool isValid)   const
+        {
+            value._value   = ( (value._value << 2) +  c) & this->_kmerMask;
+            value._isValid = isValid;
+        }
+	};
+
+    /********************************************************************************/
+
+    /** \brief Model that handles "canonical" kmers, ie the minimum value of the
+     * direct kmer and its reverse complement.
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_canonical
+     */
+    class ModelCanonical :  public ModelAbstract<ModelCanonical, Kmer<span>::KmerCanonical>
+    {
+    public:
+
+        /** Kmer type for this kind of model.  */
+        typedef Kmer<span>::KmerCanonical Kmer;
+
+        /** Constructor.
+         * \param[in] kmerSize : size of the kmers handled by the model. */
+        ModelCanonical (size_t kmerSize=span-1) : ModelAbstract<ModelCanonical, Kmer> (kmerSize) {}
+
+        /** Computes a kmer from a buffer holding nucleotides encoded in some format.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] seq : holds the nucleotides sequence from which the kmer has to be computed
+         * \param[out] value : kmer as a result
+         * \param[in] startIndex : index of the first nucleotide of the kmer to retrieve in the buffer
+         */
+        template <class Convert>
+        int first (const char* seq, Kmer& value, size_t startIndex)   const
+        {
+
+            int result = this->template polynom<Convert> (seq, value.table[0], startIndex);
+            value._isValid = result < 0;
+            value.table[1] = this->reverse (value.table[0]);
+            value.updateChoice();
+            return result;
+        }
+
+        /** Computes a kmer in a recursive way, ie. from a kmer and the next
+         * nucleotide. The next nucleotide is computed from a buffer and the
+         * index of the nucleotide within the buffer.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] c : next nucleotide
+         * \param[out] value : kmer to be updated with the provided next nucleotide
+         * \param[in] isValid : tells whether the updated kmer is valid or not
+         */
+        template <class Convert>
+        void  next (char c, Kmer& value, bool isValid)   const
+        {
+            value.table[0] = ( (value.table[0] << 2) +  c                          ) & this->_kmerMask;
+            value.table[1] = ( (value.table[1] >> 2) +  this->_revcompTable[(int)c]) & this->_kmerMask;
+            value._isValid = isValid;
+
+            value.updateChoice();
+        }
+
+        /* compute kmer hash */
+        uint64_t getHash(const Type &k) const
+        {
+            return hash1(k, 0);
+        }
+
+        /* for profiling only, compute kmer hash using hash2 */
+        void getHash2(const Type &k) const
+        {
+            hash2(k, 1LL);
+        }
+
+    };
+
+    /********************************************************************************/
+
+    struct ComparatorMinimizer
+    {
+        template<class Model>  void init (const Model& model, Type& best) const { best = model.getKmerMax(); }
+        bool operator() (const Type& current, const Type& best) const { return current < best; }
+    };
+
+    /* compare the minimizers by frequency, if information is available, else lexicographical */
+    /* maybe this code can be factorized with ComparatorMinimizer or also one can say that it subsumes it 
+     * (at the cost of accessing has_frequency for each comparison) */
+    struct ComparatorMinimizerFrequencyOrLex
+    {
+        template<class Model>  void init (const Model& model, Type& best) 
+        {   
+            best = model.getKmerMax(); 
+            has_frequency = false;
+        }
+
+        void include_frequency (uint32_t *freq_order)
+        { 
+            _freq_order = freq_order;
+            has_frequency = true;
+        }
+
+		template<class Model>   Type computeLargest (const Model& model,int mmersize)
+		{
+			Type largest;
+			if(has_frequency)
+			{
+				u_int64_t nbminims_total = ((u_int64_t)1 << (2*mmersize));
+
+				Type  mmer_max;
+				mmer_max.setVal(0);
+				uint32_t _freq_max = _freq_order[mmer_max.getVal()];
+				for(uint32_t ii=0; ii< nbminims_total; ii++)
+				{
+					Type Tii;
+					Tii.setVal(ii);
+					
+					if( ! (*this)(Tii,mmer_max ))
+					{
+						mmer_max.setVal(ii);
+						_freq_max = _freq_order[ii];
+					}
+				}
+				printf("largest freq is %i   for %s\n",_freq_max,mmer_max.toString(mmersize).c_str());
+				largest = mmer_max;
+			}
+			else
+			{
+				largest = model.getKmerMax();
+			}
+			
+			return largest;
+		}
+		
+        bool operator() (const Type& a_t, const Type& b_t) const {
+            u_int64_t a = a_t.getVal();
+            u_int64_t b = b_t.getVal();
+
+            if (has_frequency)
+            {
+                //printf("testing freq order of %d %d: %d %d, min is gonna be: %d\n",a,b,_freq_order[a], _freq_order[b], (_freq_order[a] < _freq_order[b]) ? a : b);
+				//printf("freq order %llu %llu        %i %i  %i\n",a,b,_freq_order[a],_freq_order[b], _freq_order[a] > _freq_order[b]);
+                if (_freq_order[a] == _freq_order[b])
+                    return a < b;
+                return _freq_order[a] < _freq_order[b];
+            }
+            else
+            {
+                return a < b; 
+            }
+        }
+
+        private:
+        uint32_t* _freq_order;
+        bool has_frequency;
+    };
+
+
+    /** \brief Model that handles kmers of the Model type + a minimizer
+     *
+     * This model supports the concept of minimizer. It acts as a Model instance (given as a
+     * template class) and add minimizer information to the Kmer type.
+     *
+     * Example of use:
+     * \snippet kmer2.cpp  snippet1_minimizer
+     */
+    template<class ModelType, class Comparator=Kmer<span>::ComparatorMinimizerFrequencyOrLex> 
+    class ModelMinimizer :  public ModelAbstract <ModelMinimizer<ModelType,Comparator>, KmerMinimizer<ModelType,Comparator> >
+    {
+    public:
+
+        /** Type of the model for kmer and mmers.  */
+        typedef ModelType Model;
+
+        /** Kmer type for this kind of model.  */
+        typedef KmerMinimizer<ModelType,Comparator> Kmer;
+
+        /** Return a reference on the model used for managing mmers.
+         * \return the minimizer model. */
+        const ModelType& getMmersModel() const { return _miniModel; }
+
+        /** Constructor.
+         * \param[in] kmerSize      : size of the kmers handled by the model.
+         * \param[in] minimizerSize : size of the mmers handled by the model.
+         * \param[in] cmp : functor that compares two minizers
+         * \param[in] freq_order : a 4^m table containing the frequency of each minimizer 
+         */
+        ModelMinimizer (size_t kmerSize, size_t minimizerSize, Comparator cmp=Comparator(), uint32_t *freq_order=NULL)
+            : ModelAbstract <ModelMinimizer<ModelType,Comparator>, Kmer > (kmerSize),
+              _kmerModel(kmerSize), _miniModel(minimizerSize), _cmp(cmp), _freq_order(freq_order)
+        {
+            if (kmerSize < minimizerSize)  { throw system::Exception ("Bad values for kmer %d and minimizer %d", kmerSize, minimizerSize); }
+
+            _minimizerSize = minimizerSize;
+			
+            /** We compute the number of mmers found in a kmer. */
+            _nbMinimizers = _kmerModel.getKmerSize() - minimizerSize + 1;
+
+            /** We need a mask to extract a mmer from a kmer. */
+
+            _mask.setVal(((u_int64_t)1 << (2*_minimizerSize)) - 1);
+            _shift = 2*(_nbMinimizers-1);
+
+            /** We initialize the default value of the minimizer.
+             * The value is actually set by the Comparator instance provided as a template of the class. */
+            Type tmp;
+            _cmp.template init<ModelType> (getMmersModel(), tmp);
+            _minimizerDefault.set (tmp); //////////max value of minim
+			
+			u_int64_t nbminims_total = ((u_int64_t)1 << (2*_minimizerSize));
+			_mmer_lut = (Type *) MALLOC(sizeof(Type) * nbminims_total ); //free that in destructor
+                
+            /* if it's ModelDirect, don't do a revcomp; also, use slow method */
+            ModelCanonical* isModelCanonical_p = dynamic_cast<ModelCanonical*>(&_kmerModel);
+            bool isModelCanonical = isModelCanonical_p != NULL;
+            _defaultFast = isModelCanonical;
+
+			for(u_int64_t ii=0; ii< nbminims_total; ii++)
+			{
+				Type mmer;
+				mmer.setVal(ii);
+				
+				// if(!is_allowed(mmer.getVal(),minimizerSize)) mmer = _mask;
+				// if(!is_allowed(rev_mmer.getVal(),minimizerSize)) rev_mmer = _mask;
+				
+				if (isModelCanonical)
+				{
+					Type rev_mmer = revcomp(mmer, minimizerSize);
+					if(rev_mmer < mmer) mmer = rev_mmer;
+					
+					//may be cleaner with this
+					//if (_cmp (rev_mmer, mmer ) == true)
+					//	mmer = rev_mmer;
+				}
+				
+				//std:: cout << "ii " << ii << " is allowed " << is_allowed(mmer.getVal(),minimizerSize) <<  " mmer getval " << mmer.getVal() << " is model canonical " << isModelCanonical << std::endl;
+				
+				if (!is_allowed(mmer.getVal(),minimizerSize))
+					mmer = _mask;
+				
+				_mmer_lut[ii] = mmer;
+			}
+
+            if (freq_order)
+                setMinimizersFrequency(freq_order);
+
+			
+        }
+
+
+
+        /** Destructor */
+        ~ModelMinimizer ()
+        {
+            if (_mmer_lut != 0)  { FREE (_mmer_lut); }
+        }
+
+        /** Computes a kmer from a buffer holding nucleotides encoded in some format.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] seq : holds the nucleotides sequence from which the kmer has to be computed
+         * \param[out] kmer : kmer as a result
+         * \param[in] startIndex : index of the first nucleotide of the kmer to retrieve in the buffer
+         */
+        template <class Convert>
+        int first (const char* seq, Kmer& kmer, size_t startIndex) const 
+        {
+            /** We compute the first kmer. */
+            int result = _kmerModel.template first<Convert> (seq, kmer, startIndex);
+
+            /** We compute the minimizer of the kmer. */
+            computeNewMinimizer (kmer, _defaultFast);
+
+            return result;
+        }
+
+        /** Computes a kmer in a recursive way, ie. from a kmer and the next
+         * nucleotide. The next nucleotide is computed from a buffer and the
+         * index of the nucleotide within the buffer.
+         * The way to interpret the buffer is done through the provided Convert template class.
+         * \param[in] c : next nucleotide
+         * \param[out] kmer : kmer to be updated with the provided next nucleotide
+         * \param[in] isValid : tells whether the updated kmer is valid or not
+         */
+        template <class Convert>
+        void  next (char c, Kmer& kmer, bool isValid) const
+        {
+            /** We compute the next kmer. */
+            _kmerModel.template next<Convert> (c, kmer, isValid);
+
+            /** We set the valid status according to the Convert result. */
+            kmer._isValid = isValid;
+
+            /** We extract the new mmer from the kmer. also applies the mmer_lut */
+            typename ModelType::Kmer mmer = kmer.extract (this->_mask, this->_shift,_mmer_lut);
+
+            /** We update the position of the previous minimizer. */
+            kmer._position--;
+
+            /** By default, we consider that the minimizer is still the same. */
+            kmer._changed  = false;
+                
+            /** We have to update the minimizer in the following case:
+             *      1) the new mmer is the new minimizer
+             *      2) the previous minimizer is invalid or out from the new kmer window.
+             */
+            if (_cmp (mmer.value(), kmer._minimizer.value()) == true) // .value()
+            {
+                kmer._minimizer = mmer; // extract() above has already done the job of querying mmer_lut for revcomp / forbidden kmers
+                kmer._position  = _nbMinimizers - 1;
+                kmer._changed   = true;
+            }
+
+            else if (kmer._position < 0)
+            {
+                computeNewMinimizer (kmer, _defaultFast);
+            }
+        }
+
+        /** Get the minimizer value of the provided kmer. Note that minimizers are supposed to be
+         * of small sizes, so their values can fit a u_int64_t type.
+         * \return the miminizer value as an integer. */
+        u_int64_t getMinimizerValue (const Type& k, bool fastMethod = true) const
+        {
+            Kmer km; km.set(k);  this->computeNewMinimizer (km, fastMethod);
+            return km.minimizer().value().getVal();
+        }
+
+
+        /* for profiling purpose only */ 
+        u_int64_t getMinimizerValueDummy (const Type& k) 
+        {
+            Kmer km; km.set(k);  /* don't execute anything, this function is here to get a baseline time */
+            km._minimizer = this->_minimizerDefault;
+            km._position = 0;
+            return km.minimizer().value().getVal();
+        }
+        
+        /** Get the minimizer string of the provided kmer. (used for debugging purposes only)
+            \return the miminizer as a nucleotide string. */
+        std::string getMinimizerString (const Type& k, bool fastMethod = true) const
+        {
+            Kmer km; km.set(k);  this->computeNewMinimizer (km, fastMethod);
+            return _miniModel.toString(km.minimizer().value());
+        }
+
+         /** Get the minimizer position of the provided kmer. (used for debugging purposes only)
+            \return the miminizer position */
+        int getMinimizerPosition (const Type& k, bool fastMethod = true) const
+        {
+            Kmer km; km.set(k);  this->computeNewMinimizer(km, fastMethod);
+            return km.position();
+        }
+
+        /* for profiling only, sweep the kmer to count the number of AA's */
+        void sweepForAA(const Type &k) const
+        {
+            unsigned int dummy;
+            Kmer km; km.set(k);
+            justSweepForAA(km.value(0), _nbMinimizers, dummy);
+        }
+
+		//return value of larger mmer in the freq order
+        void setMinimizersFrequency (uint32_t *freq_order)
+        {
+            _cmp.include_frequency(freq_order);
+			
+			//Type tmp =_cmp.template computeLargest<ModelType>(getMmersModel(),_minimizerSize);
+			//_minimizerDefault.set (tmp);
+        }
+
+        // hack to access compare int's, for bcalm, needs to be made cleaner later
+        bool compareIntMinimizers( size_t a, size_t b)
+        {
+            if (!_freq_order) return a <= b;
+            if (_freq_order[a] == _freq_order[b])
+                return a <= b;
+            return _freq_order[a] <= _freq_order[b];
+        }
+
+    private:
+        ModelType  _kmerModel;
+        ModelType  _miniModel;
+        size_t     _minimizerSize;
+        Comparator _cmp;
+        size_t     _nbMinimizers;
+        Type       _mask;
+
+		Type * _mmer_lut;
+        size_t     _shift;
+        typename ModelType::Kmer _minimizerDefault;
+        bool       _defaultFast;
+
+        uint32_t *_freq_order;
+		
+
+        /** Tells whether a minimizer is valid or not, in order to skip minimizers
+         *  that are too frequent. */
+        bool is_allowed (uint32_t mmer, uint32_t len)
+		{
+			if (_freq_order) return true; // every minimizer is allowed in freq order
+			
+			u_int64_t  _mmask_m1  ;
+			u_int64_t  _mask_0101 ;
+			u_int64_t  _mask_ma1 ;
+			
+			//code to ban mmer with AA inside except if at the beginnning
+			// A C T G        00   01   10   11
+			_mmask_m1  = (1 << ((len-2)*2)) -1 ; //vire 2 premieres lettres m = 8  donne    00 00 11 11 11 11 11 11
+			_mask_0101 = 0x5555555555555555  ; //         01 01 01 01 01 01 01 01
+			_mask_ma1  = _mask_0101 & _mmask_m1;//        00 00 01 01 01 01 01 01
+			
+			u_int64_t a1 = mmer; //
+			a1 =   ~(( a1 )   | (  a1 >>2 ));  //
+			a1 =((a1 >>1) & a1) & _mask_ma1 ;  //
+			
+			if(a1 != 0) return false;
+			
+			// if ((mmer & 0x3f) == 0x2a)   return false;   // TTT suffix
+			// if ((mmer & 0x3f) == 0x2e)   return false;   // TGT suffix
+			// if ((mmer & 0x3c) == 0x28)   return false;   // TT* suffix
+			// for (uint32_t j = 0; j < len - 3; ++j)       // AA inside
+			//      if ((mmer & 0xf) == 0)  return false;
+			//      else                    mmer >>= 2;
+			// if (mmer == 0)               return false;   // AAA prefix
+			// if (mmer == 0x04)            return false;   // ACA prefix
+			// if ((mmer & 0xf) == 0)   return false;       // *AA prefix
+			
+			return true;
+		}
+		
+        /** Returns the minimizer of the provided vector of mmers. */
+        void computeNewMinimizerOriginal(Kmer& kmer) const
+        {
+            /** We update the attributes of the provided kmer. Note that an invalid minimizer is
+             * memorized by convention by a negative minimizer position. */
+            kmer._minimizer = this->_minimizerDefault;
+            kmer._position  = -1;
+            kmer._changed   = true;
+
+            typename ModelType::Kmer mmer;
+
+            /** We compute each mmer and memorize the minimizer among them. */
+
+            Type kmer_minimizer_value = kmer._minimizer.value();
+            Type val = kmer.value(0);
+
+            for (int16_t idx=_nbMinimizers-1; idx>=0; idx--)
+            {
+
+                /** We extract the most left mmer in the kmer. */
+                Type candidate_minim = _mmer_lut[(val & _mask).getVal()];
+				
+
+                /** We check whether this mmer is the new minimizer. */
+                if (_cmp (candidate_minim, kmer_minimizer_value ) == true)  
+                {
+                    mmer.set(candidate_minim);
+                    kmer._minimizer = mmer;   
+                    kmer._position = idx; 
+                    kmer_minimizer_value = candidate_minim; 
+                }
+            
+                val >>= 2;    
+            }
+        }
+   
+        /** Returns the minimizer of the provided vector of mmers, fast method (may fallback to normal method)
+         * Note: only used for KmerCanonicals */
+        void computeNewMinimizer(KmerMinimizer<ModelCanonical, Comparator>& kmer, bool fastMethod = true) const 
+        {
+            //if (!fastMethod || _freq_order) // fast method doesn't work with frequency order
+			//temporarily desactivate fastmode, seem to returns wrong minimizer and leads to duplicated kmer output
+            {
+                computeNewMinimizerOriginal(kmer);
+                return;
+            }
+
+            bool validResult;
+            size_t position = -1;
+            u_int32_t minim;
+            fastLexiMinimizer(kmer.value(0), _nbMinimizers, _minimizerSize, minim, position, validResult);
+
+            if (!validResult)
+            {
+                computeNewMinimizerOriginal(kmer);
+                //_invalidMinimizersCounter++; // have to get rid of this metric else that function isn't "const" anymore, and it's a cascade (next() uses it for instance)
+            }
+            else
+            {
+                kmer._minimizer.set(minim);
+                kmer._changed = true;
+                kmer._position = position; 
+                // _minimizersCounter++; // have to get rid of this metric else that function isn't "const" anymore, and it's a cascade
+            }
+        }
+
+        /* direct model cannot use the speed-up version because it handles reverse complements in a hardcoded way */
+        void computeNewMinimizer(KmerMinimizer<ModelDirect, Comparator>  &kmer, bool fastMethod = true) const
+        {
+            computeNewMinimizerOriginal(kmer);
+            //std::cout << "specialized kmer minimizer " << _miniModel.toString(kmer.minimizer().value()) << std::endl;
+        }
+
+
+
+    };
+
+
+    /************************************************************/
+    /*********************  SUPER KMER    ***********************/
+    /************************************************************/
+	
+	//now with  vector containing the overlapping kmers of the superkmers (instead of reference to large external vector buffer)
+    class SuperKmer
+    {
+    public:
+
+        //typedef Type SType[2];
+
+#ifdef NONCANONICAL
+        typedef ModelMinimizer<ModelDirect> Model;
+#else
+        typedef ModelMinimizer<ModelCanonical> Model;
+#endif
+        typedef typename Model::Kmer           Kmer;
+
+        static const u_int64_t DEFAULT_MINIMIZER = 1000000000 ;
+
+        SuperKmer (size_t kmerSize, size_t miniSize)
+            : minimizer(DEFAULT_MINIMIZER), kmerSize(kmerSize), miniSize(miniSize)
+        {
+			_max_size_sk = 1000;
+			kmers.clear();
+			_sk_buffer = (u_int8_t *) malloc(_max_size_sk);
+			_sk_buffer_idx=0;
+          //  if (kmers.empty())  { kmers.resize(kmerSize); range.second = kmers.size()-1; }
+        }
+
+        u_int64_t                minimizer;
+
+        Kmer& operator[] (size_t idx)  {
+			return kmers[idx];
+		}
+
+		size_t size() const {
+			return kmers.size();
+		}
+
+        bool isValid() const { return minimizer != DEFAULT_MINIMIZER; }
+
+		void addKmer(Kmer newkmer)
+		{
+			kmers.push_back(newkmer);
+		}
+		
+		void reset()
+		{
+			kmers.clear();
+			//binrep.clear();
+			_sk_buffer_idx =0;
+		}
+		
+		//save superkmer to CacheSuperKmerBinFiles
+		void save(tools::storage::impl::CacheSuperKmerBinFiles  & cacheSuperkFile, int file_id)
+		{
+//			printf("saving superk to file %i \n",file_id);
+//			//debug
+//			for (size_t ii=0 ; ii < kmers.size(); ii++)
+//			{
+//			
+//				printf("%s\n",	(((*this)[ii].forward()).toString(kmerSize)).c_str());
+//
+//			}
+//			//
+			size_t superKmerLen = size();
+
+			
+			int required_bytes = (superKmerLen + kmerSize +3) /4 ;
+			if(required_bytes > _max_size_sk)
+			{
+				_sk_buffer = (u_int8_t *) realloc(_sk_buffer, _max_size_sk);
+				_max_size_sk = required_bytes;
+			}
+			
+			
+			//binrep.clear();
+			_sk_buffer_idx =0;
+			
+			Type basekmer = (*this)[0].forward();
+			
+			int rem_size = kmerSize;
+			u_int8_t newbyte=0;
+			u_int64_t mask4nt  = 255;
+			u_int64_t mask1nt  = 3;
+			
+			while(rem_size>=4)
+			{
+				newbyte = basekmer.getVal() & mask4nt ; // ptet un getVal et cast to u_int8_t
+				rem_size -= 4;
+				basekmer = basekmer >> 8;
+				_sk_buffer[_sk_buffer_idx++]= newbyte;
+				//binrep.push_back(newbyte);
+//				//debug pushing
+//				Type dd; dd.setVal(newbyte);
+//				printf("pushing %s\n",	(dd.toString(4)).c_str());
+//				//
+			}
+			
+			//reste du kmer
+			newbyte = basekmer.getVal() & mask4nt;
+			int uid = rem_size; //uid = nb nt used in this newbyte
+
+			//reste du newbyte avec le superk
+
+			int skid =1;
+			
+			while(true)
+			{
+
+				while(uid<4 && skid < superKmerLen)
+				{
+					
+					u_int8_t newnt = ((*this)[skid].forward()).getVal() & mask1nt ;
+					
+					newbyte |=  newnt << (uid*2);
+					uid++; skid++;
+				}
+				
+				if(uid > 0)
+					_sk_buffer[_sk_buffer_idx++]= newbyte;
+				
+				//binrep.push_back(newbyte);
+//				//debug pushing
+//				Type dd; dd.setVal(newbyte);
+//				printf("pushing %s\n",	(dd.toString(4)).c_str());
+//				//
+				
+				if(skid >= superKmerLen) break;
+
+				newbyte=0; uid=0;
+			}
+			
+			
+			//printf("insert superK %i  _sk_buffer_idx %i \n",kmers.size(),_sk_buffer_idx);
+			
+		//	cacheSuperkFile.insertSuperkmer(binrep.data(), binrep.size(), kmers.size(),  file_id);
+			cacheSuperkFile.insertSuperkmer(_sk_buffer, _sk_buffer_idx, kmers.size(),  file_id);
+			
+		}
+		
+		
+        /** */
+        void save (tools::collections::Bag<Type>& bag)
+        {
+            size_t superKmerLen = size();
+
+            int64_t zero = 0;
+            Type masknt;
+            masknt.setVal((int64_t) 3);
+            Type nbK;
+            nbK.setVal((int64_t) size());
+            Type compactedK;
+            compactedK.setVal(zero);
+
+            for (size_t ii=1 ; ii < superKmerLen; ii++)
+            {
+                compactedK = compactedK << 2  ;
+                compactedK = compactedK | ( ((*this)[ii].forward()) & masknt) ;
+            }
+
+            int maxs = (compactedK.getSize() - 8 ) ;
+
+            compactedK = compactedK | (  nbK << maxs ) ;
+
+            bag.insert (compactedK);
+            bag.insert ((*this)[0].forward());
+        }
+
+        /** NOT USED YET. */
+#if 0
+        void load (tools::dp::Iterator<Type>& iter)
+        {
+            Type superk = iter.item(); iter.next();
+            Type seedk = iter.item();
+
+            u_int8_t        nbK, rem ;
+            Type compactedK;
+            int ks = kmerSize;
+            Type un ; un.setVal( 1);
+            size_t _shift_val = Type::getSize() -8;
+            Type kmerMask = (un << (ks*2)) - un;
+            size_t shift = 2*(ks-1);
+
+            compactedK =  superk;
+            nbK = (compactedK >> _shift_val).getVal() & 255; // 8 bits poids fort = cpt //todo for large k values
+            rem = nbK;
+
+            Type temp = seedk;
+            Type rev_temp = revcomp(temp,ks);
+            Type newnt ;
+            Type mink;
+
+            /** We loop over each kmer of the current superkmer. */
+            for (int ii=0; ii<nbK; ii++,rem--)
+            {
+                mink = std::min (rev_temp, temp);
+
+                /** We set the current (canonical) kmer. */
+                kmers[ii].set (rev_temp, temp);
+
+                if(rem < 2) break;
+                newnt =  ( superk >> ( 2*(rem-2)) ) & 3 ;
+
+                temp = ((temp << 2 ) |  newnt   ) & kmerMask;
+                newnt .setVal(comp_NT[newnt.getVal()]) ;
+                rev_temp = ((rev_temp >> 2 ) |  (newnt << shift) ) & kmerMask;
+            }
+        }
+#endif
+
+		~SuperKmer()
+		{
+			free(_sk_buffer);
+		}
+		
+    private:
+        size_t              kmerSize;
+        size_t              miniSize;
+        std::vector<Kmer>  kmers;
+		//std::vector<u_int8_t> binrep;
+		u_int8_t * _sk_buffer;
+		int _sk_buffer_idx;
+		int _max_size_sk;
+    };
+
+    /************************************************************/
+    /***********************     COUNT    ***********************/
+    /************************************************************/
+    /** \brief Structure associating a kmer value with an abundance value.
+     *
+     * This structure is useful for methods that counts kmer, such as the SortingCount algorithm.
+     * It is also interesting to save [kmer,abundance] in a HDF5 format.
+     *
+     * By default, the abundance value is coded on 32 bits, so abundance up to 1<<32 can be used.
+     */
+    struct Count : tools::misc::Abundance<Type,CountNumber>
+    {
+        /** Constructor.
+         * \param[in] val : integer value of the kmer
+         * \param[in] abund : abundance for the kmer */
+        Count(const Type& val, const CountNumber& abund) : tools::misc::Abundance<Type,CountNumber>(val, abund) {}
+
+        /** Default constructor. */
+        Count() : tools::misc::Abundance<Type,CountNumber>() {}
+
+        /** Copy constructor. */
+        Count(const Count& val) : tools::misc::Abundance<Type,CountNumber>(val.value, val.abundance) {}
+
+        /** Comparison operator
+         * \param[in] other : object to be compared to
+         * \return true if the provided kmer value is greater than the current one. */
+        bool operator< (const Count& other) const {  return this->value < other.value; }
+        
+        /** Equal operator
+         * \param[in] other : object to be compared to
+         * \return true if the provided kmer value is greater than the current one. */
+        bool operator== (const Count& other) const {  return (this->value == other.value && this->abundance == other.abundance); }
+    };
+
+};  // struct Kmer
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_KMER_IMPL_MODEL_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/Model.pri b/gatb-core/src/gatb/kmer/impl/Model.pri
new file mode 100644
index 0000000..dd326ba
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Model.pri
@@ -0,0 +1,542 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+//complement of one NT
+const unsigned char comp_NT[4] = {  2,3,0,1  };
+const char bin2NT[4] = {'A','C','T','G'};
+const char binrev[4] = {2,3,0,1};
+
+//reverse complement of 4NT,  ie one byte
+const unsigned char revcomp_4NT[256] = {
+ 0xaa,
+ 0xea,
+ 0x2a,
+ 0x6a,
+ 0xba,
+ 0xfa,
+ 0x3a,
+ 0x7a,
+ 0x8a,
+ 0xca,
+ 0xa,
+ 0x4a,
+ 0x9a,
+ 0xda,
+ 0x1a,
+ 0x5a,
+ 0xae,
+ 0xee,
+ 0x2e,
+ 0x6e,
+ 0xbe,
+ 0xfe,
+ 0x3e,
+ 0x7e,
+ 0x8e,
+ 0xce,
+ 0xe,
+ 0x4e,
+ 0x9e,
+ 0xde,
+ 0x1e,
+ 0x5e,
+ 0xa2,
+ 0xe2,
+ 0x22,
+ 0x62,
+ 0xb2,
+ 0xf2,
+ 0x32,
+ 0x72,
+ 0x82,
+ 0xc2,
+ 0x2,
+ 0x42,
+ 0x92,
+ 0xd2,
+ 0x12,
+ 0x52,
+ 0xa6,
+ 0xe6,
+ 0x26,
+ 0x66,
+ 0xb6,
+ 0xf6,
+ 0x36,
+ 0x76,
+ 0x86,
+ 0xc6,
+ 0x6,
+ 0x46,
+ 0x96,
+ 0xd6,
+ 0x16,
+ 0x56,
+ 0xab,
+ 0xeb,
+ 0x2b,
+ 0x6b,
+ 0xbb,
+ 0xfb,
+ 0x3b,
+ 0x7b,
+ 0x8b,
+ 0xcb,
+ 0xb,
+ 0x4b,
+ 0x9b,
+ 0xdb,
+ 0x1b,
+ 0x5b,
+ 0xaf,
+ 0xef,
+ 0x2f,
+ 0x6f,
+ 0xbf,
+ 0xff,
+ 0x3f,
+ 0x7f,
+ 0x8f,
+ 0xcf,
+ 0xf,
+ 0x4f,
+ 0x9f,
+ 0xdf,
+ 0x1f,
+ 0x5f,
+ 0xa3,
+ 0xe3,
+ 0x23,
+ 0x63,
+ 0xb3,
+ 0xf3,
+ 0x33,
+ 0x73,
+ 0x83,
+ 0xc3,
+ 0x3,
+ 0x43,
+ 0x93,
+ 0xd3,
+ 0x13,
+ 0x53,
+ 0xa7,
+ 0xe7,
+ 0x27,
+ 0x67,
+ 0xb7,
+ 0xf7,
+ 0x37,
+ 0x77,
+ 0x87,
+ 0xc7,
+ 0x7,
+ 0x47,
+ 0x97,
+ 0xd7,
+ 0x17,
+ 0x57,
+ 0xa8,
+ 0xe8,
+ 0x28,
+ 0x68,
+ 0xb8,
+ 0xf8,
+ 0x38,
+ 0x78,
+ 0x88,
+ 0xc8,
+ 0x8,
+ 0x48,
+ 0x98,
+ 0xd8,
+ 0x18,
+ 0x58,
+ 0xac,
+ 0xec,
+ 0x2c,
+ 0x6c,
+ 0xbc,
+ 0xfc,
+ 0x3c,
+ 0x7c,
+ 0x8c,
+ 0xcc,
+ 0xc,
+ 0x4c,
+ 0x9c,
+ 0xdc,
+ 0x1c,
+ 0x5c,
+ 0xa0,
+ 0xe0,
+ 0x20,
+ 0x60,
+ 0xb0,
+ 0xf0,
+ 0x30,
+ 0x70,
+ 0x80,
+ 0xc0,
+ 0x0,
+ 0x40,
+ 0x90,
+ 0xd0,
+ 0x10,
+ 0x50,
+ 0xa4,
+ 0xe4,
+ 0x24,
+ 0x64,
+ 0xb4,
+ 0xf4,
+ 0x34,
+ 0x74,
+ 0x84,
+ 0xc4,
+ 0x4,
+ 0x44,
+ 0x94,
+ 0xd4,
+ 0x14,
+ 0x54,
+ 0xa9,
+ 0xe9,
+ 0x29,
+ 0x69,
+ 0xb9,
+ 0xf9,
+ 0x39,
+ 0x79,
+ 0x89,
+ 0xc9,
+ 0x9,
+ 0x49,
+ 0x99,
+ 0xd9,
+ 0x19,
+ 0x59,
+ 0xad,
+ 0xed,
+ 0x2d,
+ 0x6d,
+ 0xbd,
+ 0xfd,
+ 0x3d,
+ 0x7d,
+ 0x8d,
+ 0xcd,
+ 0xd,
+ 0x4d,
+ 0x9d,
+ 0xdd,
+ 0x1d,
+ 0x5d,
+ 0xa1,
+ 0xe1,
+ 0x21,
+ 0x61,
+ 0xb1,
+ 0xf1,
+ 0x31,
+ 0x71,
+ 0x81,
+ 0xc1,
+ 0x1,
+ 0x41,
+ 0x91,
+ 0xd1,
+ 0x11,
+ 0x51,
+ 0xa5,
+ 0xe5,
+ 0x25,
+ 0x65,
+ 0xb5,
+ 0xf5,
+ 0x35,
+ 0x75,
+ 0x85,
+ 0xc5,
+ 0x5,
+ 0x45,
+ 0x95,
+ 0xd5,
+ 0x15,
+ 0x55
+};
+
+const u_int64_t random_values [256] = {
+    0x538575f4081ef4b3,
+    0x2a1a2d81200db95f,
+    0x74550fef64e6d8c0,
+    0x1860da0858251228,
+    0x265c279c01a74823,
+    0x3c6519531e4b842a,
+    0x146ce1b5070acb6b,
+    0x79399c6f7bc20e90,
+    0x4b188fbb41cb1b68,
+    0x6cc63b214c5a9a40,
+    0x31368cb70ed8bb27,
+    0x4f3592242b740007,
+    0x23aee88a11d34fc3,
+    0x7bf9a27f206b660c,
+    0x2aa2471c41998ed6,
+    0x5f503dfd7e27bd11,
+    0x49b88389096a6b7f,
+    0x1e3576703e0d9379,
+    0x6e51443f36965078,
+    0x1632a5a114ad6bdb,
+    0x383d989b5297bef4,
+    0x32f8f0054caa7a51,
+    0x59a28a602c328c74,
+    0x486c88e124bb1a1b,
+    0x6dfda7dd3532c403,
+    0x7115b45b1f343494,
+    0x440b7f2a404b467f,
+    0x4aa8349c67ba67b5,
+    0x521e964246a1d71b,
+    0x825cdc17cc0dd5f,
+    0x83b65f167760bbf,
+    0x7ae89a7051f3e97b,
+    0x70e0773e191e10e0,
+    0x10017cf45f31bb7d,
+    0x4fb4615926342295,
+    0x73df275907f1f9f4,
+    0x78cbe18926d8175e,
+    0x549c7445526e6be9,
+    0x530aa3d31d08fd27,
+    0x7729860441084bb0,
+    0x523bc12a683f3a5f,
+    0x603c804416474054,
+    0x288a80de2ae4b4e0,
+    0x7e01a8097aa91721,
+    0x71868bfc062775cb,
+    0x7769f48079c1f1ed,
+    0x6d9d818a72528ef0,
+    0x4bb5db685e7df8c8,
+    0xb709fd05bb7585c,
+    0x3dafb4455b250129,
+    0x1eb7af1318edb9e,
+    0x6316fb1e7ab75c7b,
+    0x5866f2fd37b36f63,
+    0x4d25c8642b7196d0,
+    0x54bc6c8a444f4e69,
+    0x6c79e28026f82db4,
+    0x2c8e88c84cb662c4,
+    0x3d3f6e09551909a7,
+    0x779b17a53b411612,
+    0x4fc220c86921a3a1,
+    0x41688bdd472c1548,
+    0x62e3958e2f060d67,
+    0x397ea4382e9970f7,
+    0xd84062f44ef4408,
+    0xa50c9534b33ba75,
+    0x201445320c3c4445,
+    0x7cc29613032b4050,
+    0x6f3a0c055298910,
+    0x3adeafb354196924,
+    0x9b1fe00f9b1c3e,
+    0x1868b78d6d150260,
+    0x369349f244f74056,
+    0x39cb652573d2b7fb,
+    0x1a1049fd31667cca,
+    0x2f13ce0e69d26ac5,
+    0x1a88206b707c59eb,
+    0x30fe800d7d6bb5f9,
+    0x1f8267536a7d2445,
+    0x2c0526f02d066d82,
+    0x2f6c684d3655f044,
+    0x783a27f74f80ad7f,
+    0x4292348974fcbe0b,
+    0x52abedcf4985d549,
+    0x4a26471b0d8a9d83,
+    0x1d9f3e6d4ac166fc,
+    0x1d25b9c13607f5fb,
+    0x37d6695c53b903b3,
+    0x7aff365171a1ce81,
+    0x478bbbaf150f804e,
+    0x23084b4b769f89bd,
+    0x7ee1eb133d906bb6,
+    0x671be3a82fe06b20,
+    0x3afc21b0069e4afb,
+    0x1a5d8f65670148a0,
+    0x33a4b87e49c9f7b2,
+    0x1d5738e42bdee075,
+    0x194aa5325fe96d6d,
+    0x20db9e806bf69301,
+    0x296f42b66b01e59c,
+    0x79813084470e8124,
+    0x35c34c9816a6ea45,
+    0x7d16771f6d99b5f4,
+    0x6a5fedf97815ad70,
+    0x5f3b847631eba9a8,
+    0xd252dbe0243cfc1,
+    0x288b33650c0718d1,
+    0x3fd43b780fa7170d,
+    0x3be783f17ad05d28,
+    0x1645620956451356,
+    0x61d1a5c849ea1a87,
+    0x200f0b087f28dead,
+    0x75c8fafc3959b03a,
+    0x5f124c1a16a4997d,
+    0x2550433c08818ed1,
+    0x1a67f191ed173c0,
+    0x4f900ff53769cbb1,
+    0x35785e064ca68714,
+    0x250381a51fd84bff,
+    0x44bc3484043f061b,
+    0x51c3f5a751e16242,
+    0x682d5dd7a4f290c,
+    0x5de87b1346571155,
+    0x9f6401919cfff04,
+    0x41276e7d203ba222,
+    0x7015125a22f91445,
+    0x6a25bca910241d62,
+    0x2221f2f25feeb7a6,
+    0x497dcd9d01343f0d,
+    0x769351236ece10d9,
+    0x9b5cdde7839d03c,
+    0xd9f84995945ddd3,
+    0x2fa39bed4317e29f,
+    0x25ec64e754a71d92,
+    0x62f02e9e6aa8996b,
+    0x58e623ae34b42445,
+    0x3c89fbad5f68f98b,
+    0x2f034d511a7276c0,
+    0x25c00ae038f98d6b,
+    0x344275c466e7795d,
+    0x59352f8d2457881e,
+    0x9e08da2435aec37,
+    0x347ba5802c028095,
+    0x2349a3dd7df9731d,
+    0x2d36bfa219dcf500,
+    0x6cc783f636ec8d80,
+    0x1216c53c7a670890,
+    0x10326b5341ba6129,
+    0x3d7eeb2f361ed03a,
+    0x16617ebb206f19ce,
+    0x20c769a56f47a269,
+    0x55233e135d516552,
+    0x4eb09bf404268b65,
+    0x77c3dc127470a6d4,
+    0x3d2018d02c0651d6,
+    0x5b5820311655485d,
+    0x505dd9f46538add4,
+    0x59b0349404d97f74,
+    0x113b2e697cf9d871,
+    0x2d2f2923e71ee0b,
+    0x16d6cd716f9a7688,
+    0x755e7b8b28ed92ad,
+    0x6a017f180590e6de,
+    0x6aa7f3d627806a48,
+    0x3bafb71801097292,
+    0x47ef84165c7720bd,
+    0x705114fb1d12c229,
+    0x39c8860f3f01b0f0,
+    0x21394d8e318c6221,
+    0x337257c45e59665e,
+    0x5d92b3f70eca77f6,
+    0x74aeaebc2df08deb,
+    0x740325ca4e5ee350,
+    0x32ca0d5f053e5433,
+    0x4b58bbc2359cfff1,
+    0x43b0423e622f8933,
+    0x2537767a390ebdc9,
+    0xb1d1be10f38f592,
+    0x3e9fa4a775c50fb7,
+    0x36b95fda7a4f5bbf,
+    0x76ce82497ea8e3f0,
+    0x56c67c7c671f9745,
+    0x1bbba61a108f028b,
+    0x262148353cf4f3a8,
+    0x421b64ac59939ff9,
+    0x1b4e5a071fae18a3,
+    0x685e17ef0ffd08c3,
+    0x4d9ea68e5c613db9,
+    0x5e5bec130068b3ed,
+    0x619f91ec29b4a7d5,
+    0x3605b3df254fd42a,
+    0xbe431095b3d2a59,
+    0x5e5e91f317014cea,
+    0x6a761feb1cfe369a,
+    0xcc65ca1212f7fc6,
+    0x174d92590394deeb,
+    0x1fd863b66e140ed5,
+    0x6ab476303b9409d0,
+    0x7ea3116010d5be65,
+    0x7888fd7940be760c,
+    0x6a695e5e13d75780,
+    0x606c8eaf52c7764e,
+    0x23d460432e0b353d,
+    0x2f28b40702304c56,
+    0x2e73e92b10c845f4,
+    0x2be4f42c64799d0a,
+    0x36181a1e37c92535,
+    0x3fb6c7631476ac12,
+    0x4eca721f2a2ce74e,
+    0x3174e2ac5b90cec0,
+    0x4b5c671448c27506,
+    0x5f25adab6b34cacb,
+    0x36d683db49da23db,
+    0x26c8d49b3579953c,
+    0x5aafe2401f51d214,
+    0x76380b484519409f,
+    0x3329299456a499f8,
+    0x17e0b6ed56fd89d7,
+    0x4afcf3547096af4,
+    0x592dd62e3323b860,
+    0x57d1b0e80512ca5a,
+    0x179d556a0de9cb07,
+    0x3cdbef8f57541ccd,
+    0x226077190ba661ae,
+    0x181041c53d559c5,
+    0x6737306e4cdd6b30,
+    0x1c97cecb465cde1a,
+    0x381235fb536e52a7,
+    0x103701f55edb0a97,
+    0x8e7e7e36ae6e436,
+    0x7e2cdcab7f1ff32b,
+    0x300024d531560640,
+    0x55c48d2347e0dbc2,
+    0x85390175a745c59,
+    0xeea46b661816645,
+    0xd9814b966bbf79f,
+    0x6694309f25356a24,
+    0x74a5c2a62370202e,
+    0x7c8986f1170639bf,
+    0x2f1681dc7e0a8b0d,
+    0x6adb9384164db24b,
+    0x4ae7f63e07736250,
+    0x5caa906502fa2c39,
+    0x5ae1b4f76ce1925a,
+    0x61d536d063c99cda,
+    0x57c876906002137c,
+    0x62e9900507c89b65,
+    0x115819bc38ae1d29,
+    0x4fa9772719aba9d3,
+    0x132279825e93bdde,
+    0x7b2d101920ba8e3b,
+    0x454fb57d61c140b8,
+    0x45eff85f39f57823,
+    0x53160e742797f51,
+    0x50fbb1e23447e2c3,
+    0x40840a5e3bd74566,
+    0x4a95950e0b6c009c
+};
diff --git a/gatb-core/src/gatb/kmer/impl/ModelData.cpp b/gatb-core/src/gatb/kmer/impl/ModelData.cpp
new file mode 100644
index 0000000..1f79717
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/ModelData.cpp
@@ -0,0 +1,559 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+// NOTE : this file should be compiled only once, although used by different template specializations
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+
+/********************************************************************************/
+
+/** We need to declare them as extern, otherwise one may have some link issues... */
+extern const unsigned char comp_NT[4];
+extern const char          bin2NT[4];
+extern const char          binrev[4];
+extern const unsigned char revcomp_4NT[256];
+extern const u_int64_t     random_values[256];
+
+/********************************************************************************/
+
+//complement of one NT
+const unsigned char comp_NT[4] = {  2,3,0,1  };
+const char bin2NT[4] = {'A','C','T','G'};
+const char binrev[4] = {2,3,0,1};
+
+//reverse complement of 4NT,  ie one byte
+const unsigned char revcomp_4NT[256] = {
+ 0xaa,
+ 0xea,
+ 0x2a,
+ 0x6a,
+ 0xba,
+ 0xfa,
+ 0x3a,
+ 0x7a,
+ 0x8a,
+ 0xca,
+ 0xa,
+ 0x4a,
+ 0x9a,
+ 0xda,
+ 0x1a,
+ 0x5a,
+ 0xae,
+ 0xee,
+ 0x2e,
+ 0x6e,
+ 0xbe,
+ 0xfe,
+ 0x3e,
+ 0x7e,
+ 0x8e,
+ 0xce,
+ 0xe,
+ 0x4e,
+ 0x9e,
+ 0xde,
+ 0x1e,
+ 0x5e,
+ 0xa2,
+ 0xe2,
+ 0x22,
+ 0x62,
+ 0xb2,
+ 0xf2,
+ 0x32,
+ 0x72,
+ 0x82,
+ 0xc2,
+ 0x2,
+ 0x42,
+ 0x92,
+ 0xd2,
+ 0x12,
+ 0x52,
+ 0xa6,
+ 0xe6,
+ 0x26,
+ 0x66,
+ 0xb6,
+ 0xf6,
+ 0x36,
+ 0x76,
+ 0x86,
+ 0xc6,
+ 0x6,
+ 0x46,
+ 0x96,
+ 0xd6,
+ 0x16,
+ 0x56,
+ 0xab,
+ 0xeb,
+ 0x2b,
+ 0x6b,
+ 0xbb,
+ 0xfb,
+ 0x3b,
+ 0x7b,
+ 0x8b,
+ 0xcb,
+ 0xb,
+ 0x4b,
+ 0x9b,
+ 0xdb,
+ 0x1b,
+ 0x5b,
+ 0xaf,
+ 0xef,
+ 0x2f,
+ 0x6f,
+ 0xbf,
+ 0xff,
+ 0x3f,
+ 0x7f,
+ 0x8f,
+ 0xcf,
+ 0xf,
+ 0x4f,
+ 0x9f,
+ 0xdf,
+ 0x1f,
+ 0x5f,
+ 0xa3,
+ 0xe3,
+ 0x23,
+ 0x63,
+ 0xb3,
+ 0xf3,
+ 0x33,
+ 0x73,
+ 0x83,
+ 0xc3,
+ 0x3,
+ 0x43,
+ 0x93,
+ 0xd3,
+ 0x13,
+ 0x53,
+ 0xa7,
+ 0xe7,
+ 0x27,
+ 0x67,
+ 0xb7,
+ 0xf7,
+ 0x37,
+ 0x77,
+ 0x87,
+ 0xc7,
+ 0x7,
+ 0x47,
+ 0x97,
+ 0xd7,
+ 0x17,
+ 0x57,
+ 0xa8,
+ 0xe8,
+ 0x28,
+ 0x68,
+ 0xb8,
+ 0xf8,
+ 0x38,
+ 0x78,
+ 0x88,
+ 0xc8,
+ 0x8,
+ 0x48,
+ 0x98,
+ 0xd8,
+ 0x18,
+ 0x58,
+ 0xac,
+ 0xec,
+ 0x2c,
+ 0x6c,
+ 0xbc,
+ 0xfc,
+ 0x3c,
+ 0x7c,
+ 0x8c,
+ 0xcc,
+ 0xc,
+ 0x4c,
+ 0x9c,
+ 0xdc,
+ 0x1c,
+ 0x5c,
+ 0xa0,
+ 0xe0,
+ 0x20,
+ 0x60,
+ 0xb0,
+ 0xf0,
+ 0x30,
+ 0x70,
+ 0x80,
+ 0xc0,
+ 0x0,
+ 0x40,
+ 0x90,
+ 0xd0,
+ 0x10,
+ 0x50,
+ 0xa4,
+ 0xe4,
+ 0x24,
+ 0x64,
+ 0xb4,
+ 0xf4,
+ 0x34,
+ 0x74,
+ 0x84,
+ 0xc4,
+ 0x4,
+ 0x44,
+ 0x94,
+ 0xd4,
+ 0x14,
+ 0x54,
+ 0xa9,
+ 0xe9,
+ 0x29,
+ 0x69,
+ 0xb9,
+ 0xf9,
+ 0x39,
+ 0x79,
+ 0x89,
+ 0xc9,
+ 0x9,
+ 0x49,
+ 0x99,
+ 0xd9,
+ 0x19,
+ 0x59,
+ 0xad,
+ 0xed,
+ 0x2d,
+ 0x6d,
+ 0xbd,
+ 0xfd,
+ 0x3d,
+ 0x7d,
+ 0x8d,
+ 0xcd,
+ 0xd,
+ 0x4d,
+ 0x9d,
+ 0xdd,
+ 0x1d,
+ 0x5d,
+ 0xa1,
+ 0xe1,
+ 0x21,
+ 0x61,
+ 0xb1,
+ 0xf1,
+ 0x31,
+ 0x71,
+ 0x81,
+ 0xc1,
+ 0x1,
+ 0x41,
+ 0x91,
+ 0xd1,
+ 0x11,
+ 0x51,
+ 0xa5,
+ 0xe5,
+ 0x25,
+ 0x65,
+ 0xb5,
+ 0xf5,
+ 0x35,
+ 0x75,
+ 0x85,
+ 0xc5,
+ 0x5,
+ 0x45,
+ 0x95,
+ 0xd5,
+ 0x15,
+ 0x55
+};
+
+const u_int64_t random_values [256] = {
+    0x538575f4081ef4b3,
+    0x2a1a2d81200db95f,
+    0x74550fef64e6d8c0,
+    0x1860da0858251228,
+    0x265c279c01a74823,
+    0x3c6519531e4b842a,
+    0x146ce1b5070acb6b,
+    0x79399c6f7bc20e90,
+    0x4b188fbb41cb1b68,
+    0x6cc63b214c5a9a40,
+    0x31368cb70ed8bb27,
+    0x4f3592242b740007,
+    0x23aee88a11d34fc3,
+    0x7bf9a27f206b660c,
+    0x2aa2471c41998ed6,
+    0x5f503dfd7e27bd11,
+    0x49b88389096a6b7f,
+    0x1e3576703e0d9379,
+    0x6e51443f36965078,
+    0x1632a5a114ad6bdb,
+    0x383d989b5297bef4,
+    0x32f8f0054caa7a51,
+    0x59a28a602c328c74,
+    0x486c88e124bb1a1b,
+    0x6dfda7dd3532c403,
+    0x7115b45b1f343494,
+    0x440b7f2a404b467f,
+    0x4aa8349c67ba67b5,
+    0x521e964246a1d71b,
+    0x825cdc17cc0dd5f,
+    0x83b65f167760bbf,
+    0x7ae89a7051f3e97b,
+    0x70e0773e191e10e0,
+    0x10017cf45f31bb7d,
+    0x4fb4615926342295,
+    0x73df275907f1f9f4,
+    0x78cbe18926d8175e,
+    0x549c7445526e6be9,
+    0x530aa3d31d08fd27,
+    0x7729860441084bb0,
+    0x523bc12a683f3a5f,
+    0x603c804416474054,
+    0x288a80de2ae4b4e0,
+    0x7e01a8097aa91721,
+    0x71868bfc062775cb,
+    0x7769f48079c1f1ed,
+    0x6d9d818a72528ef0,
+    0x4bb5db685e7df8c8,
+    0xb709fd05bb7585c,
+    0x3dafb4455b250129,
+    0x1eb7af1318edb9e,
+    0x6316fb1e7ab75c7b,
+    0x5866f2fd37b36f63,
+    0x4d25c8642b7196d0,
+    0x54bc6c8a444f4e69,
+    0x6c79e28026f82db4,
+    0x2c8e88c84cb662c4,
+    0x3d3f6e09551909a7,
+    0x779b17a53b411612,
+    0x4fc220c86921a3a1,
+    0x41688bdd472c1548,
+    0x62e3958e2f060d67,
+    0x397ea4382e9970f7,
+    0xd84062f44ef4408,
+    0xa50c9534b33ba75,
+    0x201445320c3c4445,
+    0x7cc29613032b4050,
+    0x6f3a0c055298910,
+    0x3adeafb354196924,
+    0x9b1fe00f9b1c3e,
+    0x1868b78d6d150260,
+    0x369349f244f74056,
+    0x39cb652573d2b7fb,
+    0x1a1049fd31667cca,
+    0x2f13ce0e69d26ac5,
+    0x1a88206b707c59eb,
+    0x30fe800d7d6bb5f9,
+    0x1f8267536a7d2445,
+    0x2c0526f02d066d82,
+    0x2f6c684d3655f044,
+    0x783a27f74f80ad7f,
+    0x4292348974fcbe0b,
+    0x52abedcf4985d549,
+    0x4a26471b0d8a9d83,
+    0x1d9f3e6d4ac166fc,
+    0x1d25b9c13607f5fb,
+    0x37d6695c53b903b3,
+    0x7aff365171a1ce81,
+    0x478bbbaf150f804e,
+    0x23084b4b769f89bd,
+    0x7ee1eb133d906bb6,
+    0x671be3a82fe06b20,
+    0x3afc21b0069e4afb,
+    0x1a5d8f65670148a0,
+    0x33a4b87e49c9f7b2,
+    0x1d5738e42bdee075,
+    0x194aa5325fe96d6d,
+    0x20db9e806bf69301,
+    0x296f42b66b01e59c,
+    0x79813084470e8124,
+    0x35c34c9816a6ea45,
+    0x7d16771f6d99b5f4,
+    0x6a5fedf97815ad70,
+    0x5f3b847631eba9a8,
+    0xd252dbe0243cfc1,
+    0x288b33650c0718d1,
+    0x3fd43b780fa7170d,
+    0x3be783f17ad05d28,
+    0x1645620956451356,
+    0x61d1a5c849ea1a87,
+    0x200f0b087f28dead,
+    0x75c8fafc3959b03a,
+    0x5f124c1a16a4997d,
+    0x2550433c08818ed1,
+    0x1a67f191ed173c0,
+    0x4f900ff53769cbb1,
+    0x35785e064ca68714,
+    0x250381a51fd84bff,
+    0x44bc3484043f061b,
+    0x51c3f5a751e16242,
+    0x682d5dd7a4f290c,
+    0x5de87b1346571155,
+    0x9f6401919cfff04,
+    0x41276e7d203ba222,
+    0x7015125a22f91445,
+    0x6a25bca910241d62,
+    0x2221f2f25feeb7a6,
+    0x497dcd9d01343f0d,
+    0x769351236ece10d9,
+    0x9b5cdde7839d03c,
+    0xd9f84995945ddd3,
+    0x2fa39bed4317e29f,
+    0x25ec64e754a71d92,
+    0x62f02e9e6aa8996b,
+    0x58e623ae34b42445,
+    0x3c89fbad5f68f98b,
+    0x2f034d511a7276c0,
+    0x25c00ae038f98d6b,
+    0x344275c466e7795d,
+    0x59352f8d2457881e,
+    0x9e08da2435aec37,
+    0x347ba5802c028095,
+    0x2349a3dd7df9731d,
+    0x2d36bfa219dcf500,
+    0x6cc783f636ec8d80,
+    0x1216c53c7a670890,
+    0x10326b5341ba6129,
+    0x3d7eeb2f361ed03a,
+    0x16617ebb206f19ce,
+    0x20c769a56f47a269,
+    0x55233e135d516552,
+    0x4eb09bf404268b65,
+    0x77c3dc127470a6d4,
+    0x3d2018d02c0651d6,
+    0x5b5820311655485d,
+    0x505dd9f46538add4,
+    0x59b0349404d97f74,
+    0x113b2e697cf9d871,
+    0x2d2f2923e71ee0b,
+    0x16d6cd716f9a7688,
+    0x755e7b8b28ed92ad,
+    0x6a017f180590e6de,
+    0x6aa7f3d627806a48,
+    0x3bafb71801097292,
+    0x47ef84165c7720bd,
+    0x705114fb1d12c229,
+    0x39c8860f3f01b0f0,
+    0x21394d8e318c6221,
+    0x337257c45e59665e,
+    0x5d92b3f70eca77f6,
+    0x74aeaebc2df08deb,
+    0x740325ca4e5ee350,
+    0x32ca0d5f053e5433,
+    0x4b58bbc2359cfff1,
+    0x43b0423e622f8933,
+    0x2537767a390ebdc9,
+    0xb1d1be10f38f592,
+    0x3e9fa4a775c50fb7,
+    0x36b95fda7a4f5bbf,
+    0x76ce82497ea8e3f0,
+    0x56c67c7c671f9745,
+    0x1bbba61a108f028b,
+    0x262148353cf4f3a8,
+    0x421b64ac59939ff9,
+    0x1b4e5a071fae18a3,
+    0x685e17ef0ffd08c3,
+    0x4d9ea68e5c613db9,
+    0x5e5bec130068b3ed,
+    0x619f91ec29b4a7d5,
+    0x3605b3df254fd42a,
+    0xbe431095b3d2a59,
+    0x5e5e91f317014cea,
+    0x6a761feb1cfe369a,
+    0xcc65ca1212f7fc6,
+    0x174d92590394deeb,
+    0x1fd863b66e140ed5,
+    0x6ab476303b9409d0,
+    0x7ea3116010d5be65,
+    0x7888fd7940be760c,
+    0x6a695e5e13d75780,
+    0x606c8eaf52c7764e,
+    0x23d460432e0b353d,
+    0x2f28b40702304c56,
+    0x2e73e92b10c845f4,
+    0x2be4f42c64799d0a,
+    0x36181a1e37c92535,
+    0x3fb6c7631476ac12,
+    0x4eca721f2a2ce74e,
+    0x3174e2ac5b90cec0,
+    0x4b5c671448c27506,
+    0x5f25adab6b34cacb,
+    0x36d683db49da23db,
+    0x26c8d49b3579953c,
+    0x5aafe2401f51d214,
+    0x76380b484519409f,
+    0x3329299456a499f8,
+    0x17e0b6ed56fd89d7,
+    0x4afcf3547096af4,
+    0x592dd62e3323b860,
+    0x57d1b0e80512ca5a,
+    0x179d556a0de9cb07,
+    0x3cdbef8f57541ccd,
+    0x226077190ba661ae,
+    0x181041c53d559c5,
+    0x6737306e4cdd6b30,
+    0x1c97cecb465cde1a,
+    0x381235fb536e52a7,
+    0x103701f55edb0a97,
+    0x8e7e7e36ae6e436,
+    0x7e2cdcab7f1ff32b,
+    0x300024d531560640,
+    0x55c48d2347e0dbc2,
+    0x85390175a745c59,
+    0xeea46b661816645,
+    0xd9814b966bbf79f,
+    0x6694309f25356a24,
+    0x74a5c2a62370202e,
+    0x7c8986f1170639bf,
+    0x2f1681dc7e0a8b0d,
+    0x6adb9384164db24b,
+    0x4ae7f63e07736250,
+    0x5caa906502fa2c39,
+    0x5ae1b4f76ce1925a,
+    0x61d536d063c99cda,
+    0x57c876906002137c,
+    0x62e9900507c89b65,
+    0x115819bc38ae1d29,
+    0x4fa9772719aba9d3,
+    0x132279825e93bdde,
+    0x7b2d101920ba8e3b,
+    0x454fb57d61c140b8,
+    0x45eff85f39f57823,
+    0x53160e742797f51,
+    0x50fbb1e23447e2c3,
+    0x40840a5e3bd74566,
+    0x4a95950e0b6c009c
+};
diff --git a/gatb-core/src/gatb/kmer/impl/PartiInfo.cpp b/gatb-core/src/gatb/kmer/impl/PartiInfo.cpp
new file mode 100644
index 0000000..9764ac4
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/PartiInfo.cpp
@@ -0,0 +1,314 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <algorithm>
+
+// We use the required packages
+using namespace std;
+
+#define DEBUG(a) //printf a
+// wanted to debug separately, DEBUG has more output than debug2
+// to see top20 repartitions of bins, uncomment IFDEBUG and DEBUG2
+#define IFDEBUG(a)  //a
+#define DEBUG2(a) //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+static const u_int32_t MAGIC_NUMBER = 0x12345678;
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Repartitor::computeDistrib (const PartiInfo<5>& extern_pInfo)
+{
+    /** We allocate a table whose size is the number of possible minimizers. */
+    _repart_table.resize (_nb_minims);
+
+    std::vector<ipair> bin_size_vec;
+    std::priority_queue< itriple, std::vector<itriple>,compSpaceTriple > pq;
+
+    //sum total bins size
+    IFDEBUG(u_int64_t sumsizes =0);
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+    {
+        // sumsizes +=   extern_pInfo.getNbSuperKmer_per_minim(ii); // _binsize[ii];
+        // bin_size_vec.push_back(ipair( extern_pInfo.getNbSuperKmer_per_minim(ii) ,ii));
+        IFDEBUG(sumsizes += extern_pInfo.getNbKxmer_per_minim(ii)); // _binsize[ii];
+        bin_size_vec.push_back(ipair( extern_pInfo.getNbKxmer_per_minim(ii) ,ii));
+    }
+
+    DEBUG(("Repartitor : mean size per parti should be :  %lli  (total %lli )\n", sumsizes / _nbpart, sumsizes));
+
+    //init space left
+    for (int jj = 0; jj < _nbpart; jj++)  {  pq.push (itriple(jj,0,0));  }
+
+    //sort minim bins per size
+    std::sort (bin_size_vec.begin (), bin_size_vec.end (), comp_bins);
+
+    DEBUG2(("Repartitor : 20 largest estimated bin sizes \n"));
+    for (size_t ii=0; ii<20 &&  ii< bin_size_vec.size(); ii++ )
+    {
+        DEBUG2 (("binsize [%llu] = %llu \n",bin_size_vec[ii].second,bin_size_vec[ii].first));
+    }
+
+    //GC suggestion : put the largest in the emptiest (la plus grosse dans la plus grosse)
+
+    itriple smallest_parti;
+
+    u_int64_t cur_minim = 0;
+    while (cur_minim < _nb_minims)
+    {
+        //get emptiest parti
+        smallest_parti = pq.top(); pq.pop();
+
+        //put largest bin in it
+        _repart_table[bin_size_vec[cur_minim].second] = smallest_parti.first;
+
+        //update space used in this bin, push it back in the pq
+        smallest_parti.second += bin_size_vec[cur_minim].first;
+        smallest_parti.third ++; // how many minimizers are in this bin (just for info)
+
+        pq.push (smallest_parti);
+
+        DEBUG (("Repartitor : affected minim %llu to part %llu  space used %llu  (msize %llu) \n",
+            bin_size_vec[cur_minim].second,smallest_parti.first,
+            smallest_parti.second , bin_size_vec[cur_minim].first
+        ));
+
+        cur_minim++;
+    }
+}
+
+// simple version of the code above in the case where we use frequency-based minimizers, and we just want to group minimizers according to their ordering
+void Repartitor::justGroupNaive (const PartiInfo<5>& extern_pInfo, std::vector <std::pair<int,int> > &counts)
+{
+    /** We allocate a table whose size is the number of possible minimizers. */
+    _repart_table.resize (_nb_minims);
+
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+    {
+        _repart_table[ii] = 0; // important to have a consistent repartition for unseen (in the sample approximation) minimizers
+    }
+
+    int step = counts.size() / _nbpart;
+    
+    for (unsigned int i = 0; i < counts.size(); i++)
+    {
+        _repart_table[counts[i].second] = std::min((int)(i / step), _nbpart-1);
+    }
+    
+}
+
+
+// much more effective version of the function above, using estimation of number of kmers per bucket
+void Repartitor::justGroup (const PartiInfo<5>& extern_pInfo, std::vector <std::pair<int,int> > &counts)
+{
+    /** We allocate a table whose size is the number of possible minimizers. */
+    _repart_table.resize (_nb_minims);
+
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+    {
+        _repart_table[ii] = _nbpart - 1; 
+        // important to have a consistent repartition for unseen (in the sample approximation) minimizers
+        // and since any minimizer is potentially unseen, for bcalm, we have to put them into the last partition
+    }
+
+
+    IFDEBUG(
+            {// same debugging as computeDistrib() 
+            std::vector<ipair> bin_size_vec;
+            //sum total bins size
+            u_int64_t sumsizes =0;
+            for (u_int64_t ii=0; ii< _nb_minims; ii++)
+            {
+            sumsizes += extern_pInfo.getNbKxmer_per_minim(ii);
+            bin_size_vec.push_back(ipair( extern_pInfo.getNbKxmer_per_minim(ii) ,ii));
+            }
+            DEBUG2(("Repartitor(justGroup): mean size per parti should be :  %lli  (total %lli )\n", sumsizes / _nbpart, sumsizes));
+            //sort minim bins per size
+            std::sort (bin_size_vec.begin (), bin_size_vec.end (), comp_bins);
+            DEBUG2(("Repartitor(justGroup): 20 largest estimated bin sizes \n"));
+            for (size_t ii=0; ii<20 &&  ii< bin_size_vec.size(); ii++ )
+            DEBUG2 (("binsize [%llu] = %llu \n",bin_size_vec[ii].second,bin_size_vec[ii].first));
+            })
+
+    //sum total count size
+    u_int64_t total_counts =0;
+    for (unsigned int i = 0; i < counts.size(); i++)
+        total_counts += counts[i].first;
+
+    u_int64_t sumsizes =0;
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+        sumsizes += extern_pInfo.getNbKmer_per_minim(ii);
+ 
+    u_int64_t mean_size = sumsizes / _nbpart;
+    
+    u_int64_t acc = 0, j = 0;
+    for (unsigned int i = 0; i < counts.size(); i++)
+    {
+        _repart_table[counts[i].second] = j;
+
+        acc += extern_pInfo.getNbKmer_per_minim(counts[i].second);
+        if (acc > mean_size)
+        {
+            acc = 0;
+            if (j < _nbpart)
+                j++;
+        }
+    }
+}
+
+// lexi case
+void Repartitor::justGroupLexi (const PartiInfo<5>& extern_pInfo)
+{
+    /** We allocate a table whose size is the number of possible minimizers. */
+    _repart_table.resize (_nb_minims);
+
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+    {
+        _repart_table[ii] = _nbpart-1; 
+        // important to have a consistent repartition for unseen (in the sample approximation) minimizers
+        // and since any minimizer is potentially unseen, for bcalm, we have to put them into the last partition
+    }
+
+    u_int64_t sumsizes =0;
+    for (u_int64_t ii=0; ii< _nb_minims; ii++)
+        sumsizes += extern_pInfo.getNbKmer_per_minim(ii);
+ 
+    u_int64_t mean_size = sumsizes / _nbpart;
+    
+    u_int64_t acc = 0, j = 0;
+    for (unsigned int i = 0; i < _nb_minims; i++)
+    {
+        _repart_table[i] = j;
+        acc += extern_pInfo.getNbKmer_per_minim(i);
+        if (acc > mean_size)
+        {
+            acc = 0;
+            if (j < _nbpart)
+                j++;
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Repartitor::load (tools::storage::impl::Group& group)
+{
+    bool hasMinimizerFrequencies = false;
+
+    tools::storage::impl::Storage::istream is (group, "minimRepart");
+    is.read ((char*)&_nbpart,     sizeof(_nbpart));
+    is.read ((char*)&_mm,         sizeof(_mm));
+    is.read ((char*)&_nb_minims,  sizeof(_nb_minims));
+    is.read ((char*)&_nbPass,     sizeof(_nbPass));
+
+    DEBUG (("[Repartitor::load] :  _nbpart=%d  _mm=%d  _nb_minims=%d  _nbPass=%d \n",
+        _nbpart, _mm, _nb_minims, _nbPass
+    ));
+
+    /** We allocate a table whose size is the number of possible minimizers. */
+    _repart_table.resize (_nb_minims);
+
+    is.read ((char*)_repart_table.data(), sizeof(Value) * _nb_minims);
+
+    is.read ((char*)&hasMinimizerFrequencies, sizeof(bool));
+
+    u_int32_t magic = 0;
+    is.read ((char*)&magic,  sizeof(magic));
+    if (magic != MAGIC_NUMBER)  { throw system::Exception("Unable to load Repartitor (minimRepart), possibly due to bad format."); }
+
+    if (hasMinimizerFrequencies)
+    {
+        tools::storage::impl::Storage::istream is2 (group, "minimFrequency");
+        _freq_order = new uint32_t [_nb_minims];
+        is2.read ((char*)_freq_order,     sizeof(uint32_t)*_nb_minims);
+
+        is2.read ((char*)&magic,  sizeof(magic));
+        if (magic != MAGIC_NUMBER)  { throw system::Exception("Unable to load Repartitor (minimFrequency), possibly due to bad format."); }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Repartitor::save (tools::storage::impl::Group& group)
+{
+    DEBUG (("[Repartitor::save] :  _nbpart=%d  _mm=%d  _nb_minims=%d  _nbPass=%d \n",
+        _nbpart, _mm, _nb_minims, _nbPass
+    ));
+
+    bool hasMinimizerFrequencies = _freq_order != NULL;
+
+    tools::storage::impl::Storage::ostream os (group, "minimRepart");
+    os.write ((const char*)&_nbpart,                sizeof(_nbpart));
+    os.write ((const char*)&_mm,                    sizeof(_mm));
+    os.write ((const char*)&_nb_minims,             sizeof(_nb_minims));
+    os.write ((const char*)&_nbPass,                sizeof(_nbPass));
+    os.write ((const char*)_repart_table.data(),    sizeof(Value) * _nb_minims);
+    os.write ((const char*)&hasMinimizerFrequencies,sizeof(bool));
+    os.write ((const char*)&MAGIC_NUMBER,           sizeof(MAGIC_NUMBER));
+    os.flush();
+
+    if (hasMinimizerFrequencies)
+    {
+        tools::storage::impl::Storage::ostream os2 (group, "minimFrequency");
+        os2.write ((const char*)_freq_order,    sizeof(uint32_t) * _nb_minims);
+        os2.write ((const char*)&MAGIC_NUMBER,  sizeof(MAGIC_NUMBER));
+        os2.flush();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Repartitor::printInfo ()
+{
+    size_t nbMinimizers = 1 << (_mm*2);
+    printf("Repartitor : nbMinimizers=%ld\n", nbMinimizers);
+    for (u_int64_t ii=0; ii<nbMinimizers; ii++ )  {  printf("   table[%ld] = %d \n",ii,_repart_table[ii]); }
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/PartiInfo.hpp b/gatb-core/src/gatb/kmer/impl/PartiInfo.hpp
new file mode 100644
index 0000000..8331daf
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/PartiInfo.hpp
@@ -0,0 +1,426 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _PARTI_INFO_HPP_
+#define _PARTI_INFO_HPP_
+
+/********************************************************************************/
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <queue>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** class containing info of each parti : exact number of kmers per parti
+ *
+ * will be computed by fillparti, then used by fillsolids
+ * needed beacause the exact number of kmers per parti can no longer be inferred from partition file size
+ * xmer ==1 -->  only k0 mer    (xmer == nb max of kmers in kx mer, not the x   k1 mer == 2 kmers max in k1 mer)
+ */
+template <size_t xmer>
+class PartiInfo
+{
+public:
+
+    inline void incKmer (int numpart, u_int64_t val=1)
+    {
+        _nb_kmers_per_parti[numpart]+=val;
+    }
+
+    inline void incKxmer(int numpart, u_int64_t val=1)
+    {
+        _nb_kxmers_per_parti[numpart]+=val; //now used to store number of kxmers per parti
+    }
+
+    //superksize in number of kmer inside this superk
+    //increases both superk and kmer count
+    inline void incSuperKmer_per_minimBin(int numbin, int superksize, u_int64_t val=1)
+    {
+		_nb_superk_total+=val;
+		_nb_kmer_total += val*superksize;
+        _superk_per_mmer_bin[numbin]+= val ;
+        _kmer_per_mmer_bin[numbin]+= val *superksize;
+    }
+
+    //kxmer count (regardless of x size), used for ram
+    inline void incKxmer_per_minimBin(int numbin, u_int64_t val=1)
+    {
+        _kxmer_per_mmer_bin[numbin]+= val ;
+    }
+
+    //numaprt, radix, size of kx mer
+    inline void incKmer_and_rad(int numpart, int radix,int x,  u_int64_t val=1) //appele ds vrai loop
+    {
+        _nb_kxmers_per_parti[numpart] += val;            // now used to store number of kxmers per parti
+        _nb_kmers_per_parti [numpart] += (val * (x+1));  // number of  'real' kmers
+        _nbk_per_radix_per_part[x][radix][numpart]+=val; // contains number of kx mer per part per radix per x
+    }
+
+    /** */
+    PartiInfo& operator+=  (const PartiInfo& other)
+    {
+        //add other parti info , synced
+
+        for (int np=0; np<_nbpart; np++)
+        {
+            for (size_t xx=0; xx<xmer; xx++)
+            {
+                for (int rad=0; rad<256; rad++)
+                {
+                    __sync_fetch_and_add( & (_nbk_per_radix_per_part[xx][rad][np]),   other.getNbKmer(np,rad,xx) );
+                }
+            }
+
+            __sync_fetch_and_add (_nb_kmers_per_parti  + np, other.getNbKmer      (np));
+            __sync_fetch_and_add (_nb_kxmers_per_parti + np, other.getNbSuperKmer (np));
+        }
+
+        for (u_int64_t ii=0; ii< _num_mm_bins; ii++)
+        {
+            __sync_fetch_and_add (_superk_per_mmer_bin + ii, other.getNbSuperKmer_per_minim (ii));
+            __sync_fetch_and_add (_kmer_per_mmer_bin   + ii, other.getNbKmer_per_minim      (ii));
+            __sync_fetch_and_add (_kxmer_per_mmer_bin  + ii, other.getNbKxmer_per_minim     (ii));
+        }
+
+		__sync_fetch_and_add(&_nb_superk_total , other._nb_superk_total);
+		__sync_fetch_and_add(&_nb_kmer_total , other._nb_kmer_total);
+		
+		
+        return *this;
+    }
+
+    /** */
+    inline  u_int64_t getNbKmer(int numpart) const
+    {
+        return _nb_kmers_per_parti[numpart];
+    }
+
+    /** Get nbk in bin radix of parti numpart */
+    inline  u_int64_t getNbKmer(int numpart, int radix, int xx) const
+    {
+        return _nbk_per_radix_per_part[xx][radix][numpart];
+    }
+
+    /** */
+    inline  u_int64_t   getNbSuperKmer(int numpart) const //now used for number of kxmers (indistinctive of xsize)
+    {
+        return _nb_kxmers_per_parti[numpart];
+    }
+	
+	inline  u_int64_t   getNbSuperKmerTotal() const
+	{
+		return _nb_superk_total;
+	}
+
+	inline  u_int64_t   getNbKmerTotal() const
+	{
+		return _nb_kmer_total;
+	}
+    /** */
+    inline  u_int64_t   getNbSuperKmer_per_minim(int numbin) const
+    {
+        return _superk_per_mmer_bin[numbin];
+    }
+
+    /** */
+    inline  u_int64_t   getNbKmer_per_minim(int numbin) const
+    {
+        return _kmer_per_mmer_bin[numbin];
+    }
+
+    /** */
+    inline  u_int64_t   getNbKxmer_per_minim(int numbin) const
+    {
+        return _kxmer_per_mmer_bin[numbin];
+    }
+
+    /** */
+    void clear()
+    {
+        memset (_nb_kmers_per_parti,  0, _nbpart      * sizeof(u_int64_t));
+        memset (_nb_kxmers_per_parti, 0, _nbpart      * sizeof(u_int64_t));
+        memset (_superk_per_mmer_bin, 0, _num_mm_bins * sizeof(u_int64_t));
+        memset (_kmer_per_mmer_bin,   0, _num_mm_bins * sizeof(u_int64_t));
+        memset (_kxmer_per_mmer_bin,  0, _num_mm_bins * sizeof(u_int64_t));
+
+        for (size_t xx=0; xx<xmer; xx++)
+        {
+            for(int ii=0; ii<256; ii++)
+            {
+                memset(_nbk_per_radix_per_part[xx][ii], 0, _nbpart*sizeof(u_int64_t));
+            }
+        }
+    }
+
+    /** */
+    void printInfo() const
+    {
+        printf("------------------\n");
+        printf("Nb kmers per parti\n");
+
+        for (int np=0; np<_nbpart; np++)  {  printf("Parti[%i]= %lli\n",np,this->getNbKmer(np));  }
+
+        printf("------------------------\n");
+        printf("Nb kxmers per parti\n");
+
+        for (int np=0; np<_nbpart; np++)  {  printf("Parti[%i]= %lli\n",np,this->getNbSuperKmer(np));  }
+
+        //			printf("----------------------------\n");
+        //			printf("Nb kmers per parti per radix\n");
+        //
+        //			for (int np=0; np<_nbpart; np++) {
+        //				printf("___ Parti %i ___\n",np);
+        //
+        //				for (int rad=0; rad<256; rad++) {
+        //					printf("%10lli  ",this->getNbKmer(np,rad,0));
+        //					if((rad & 7) == 7) printf("\n");
+        //				}
+        //				printf("\n");
+        //
+        //			}
+
+        printf("----------------------------\n");
+        printf("Nb Super kmers , nb kmers per minim bin\n");
+
+        u_int64_t sumk = 0;
+        u_int64_t sumsuperk = 0;
+
+        for (int np=0; np<_num_mm_bins; np++)
+        {
+            typedef typename Kmer<31>::Type           Typem; //should be kmer size
+            Typem cur;
+            cur.setVal(np);
+
+			if(this->getNbSuperKmer_per_minim(np)!=0 || this->getNbKmer_per_minim(np)  !=0 )
+			   	printf("Bin[%5i (%s) ]= %lli    %lli\n",np,cur.toString(_mm).c_str(), this->getNbSuperKmer_per_minim(np),this->getNbKmer_per_minim(np)    );
+
+            sumk += this->getNbKmer_per_minim(np);
+            sumsuperk +=  this->getNbSuperKmer_per_minim(np);
+        }
+
+        printf("total number of kmers %lli  total number of superkmers %lli \n",sumk,sumsuperk);
+        printf("Average size of superkmers :  %f \n",(double)sumk / (double)sumsuperk );
+    }
+
+    /** Constructor. */
+    PartiInfo(int nbpart, int minimsize) : _nbpart(nbpart), _mm(minimsize)
+    {
+		_nb_superk_total =0;
+		_nb_kmer_total =0;
+        _nb_kmers_per_parti  = (u_int64_t*) CALLOC (nbpart, sizeof(u_int64_t));
+        _nb_kxmers_per_parti = (u_int64_t*) CALLOC (nbpart, sizeof(u_int64_t));
+        _num_mm_bins =   1 << (2*_mm);
+        _superk_per_mmer_bin = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+        _kmer_per_mmer_bin   = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+        _kxmer_per_mmer_bin  = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+
+        for(size_t xx=0; xx<xmer; xx++)
+        {
+            for(int ii=0; ii<256; ii++)
+            {
+                _nbk_per_radix_per_part[xx][ii] = (u_int64_t*) CALLOC (nbpart, sizeof(u_int64_t));
+            }
+        }
+    }
+
+    /** Constructor (copy). Needed for fillparti class. */
+    PartiInfo(const PartiInfo& cr)
+    //the copy contr realloc its own  arrays, zero init
+    {
+        _num_mm_bins = cr._num_mm_bins;
+        _nbpart      = cr._nbpart;
+        _mm          = cr._mm;
+		_nb_superk_total = cr._nb_superk_total;
+		_nb_kmer_total = cr._nb_kmer_total;
+		
+        _nb_kmers_per_parti  = (u_int64_t*) CALLOC (_nbpart,      sizeof(u_int64_t));
+        _nb_kxmers_per_parti = (u_int64_t*) CALLOC (_nbpart,      sizeof(u_int64_t));
+        _superk_per_mmer_bin = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+        _kmer_per_mmer_bin   = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+        _kxmer_per_mmer_bin  = (u_int64_t*) CALLOC (_num_mm_bins, sizeof(u_int64_t));
+
+        for(size_t xx=0; xx<xmer; xx++)
+        {
+            for(int ii=0; ii<256; ii++)
+            {
+                _nbk_per_radix_per_part[xx][ii] = (u_int64_t  *) CALLOC(_nbpart,sizeof(u_int64_t));
+            }
+        }
+
+        //	printf("PartiInfo copy constr %p  _nb_kmers_per_parti %p \n",this,_nb_kmers_per_parti);
+
+    }
+
+    /** Destructor. */
+    ~PartiInfo()
+    {
+        FREE (_nb_kmers_per_parti);
+        FREE (_nb_kxmers_per_parti);
+        FREE (_superk_per_mmer_bin);
+        FREE (_kmer_per_mmer_bin);
+        FREE (_kxmer_per_mmer_bin);
+
+        for(size_t xx=0; xx<xmer; xx++)  {  for(int ii=0; ii<256; ii++)  {  FREE(_nbk_per_radix_per_part[xx][ii]);  }  }
+
+        //	printf("print info destroyed %p  _nb_kmers_per_parti %p \n",this,_nb_kmers_per_parti);
+    }
+
+private:
+
+    u_int64_t* _nb_kmers_per_parti;
+    u_int64_t* _nb_kxmers_per_parti; //now used to store number of kxmers per parti
+    u_int64_t* _superk_per_mmer_bin;
+	u_int64_t  _nb_superk_total;
+	u_int64_t  _nb_kmer_total;
+    u_int64_t* _kmer_per_mmer_bin;
+    u_int64_t* _kxmer_per_mmer_bin;
+
+    u_int64_t* _nbk_per_radix_per_part[xmer][256];//number of kxmer per parti per rad
+    u_int64_t _num_mm_bins;
+
+    int _nbpart;
+    int _mm;
+};
+
+/********************************************************************************/
+
+/** Class providing hash values for minimizers.
+ *
+ * Minimizer (of size m) values are gathered in N partitions, so a function from 4^m values
+ * to N values is built. This function is built thanks to a PartiInfo object that is built
+ * while scanning a part of the input bank (ie. information about minimizers distribution
+ * is built then).
+ *
+ * The hash value is got through the operator() method.
+ *
+ * It is possible to save/load an instance of this class; this may be useful for having the
+ * same partition as the solid kmers for other purpose (like debloom for instance).
+ *
+ * Note: this class could be renamed in the future to emphasize it essentially provides a
+ * hash function service.
+ */
+class Repartitor : public system::SmartPointer
+{
+public:
+
+    /** Hash value type. */
+    typedef u_int16_t Value;
+
+    /** Constructor
+     * \param[in] nbpart : hash value will be in range [0..nbpart-1]
+     * \param[in] minimsize : size of the minimizers. */
+    Repartitor (int nbpart=0, int minimsize=0, int nbPass=1)  : _nbpart(nbpart), _mm(minimsize), _nb_minims(1 << (_mm*2)), _nbPass(nbPass), _freq_order(0)
+    {
+        if (nbpart <= 0)  { system::Exception("Repartitor: nbpart (%d) should be > 0", nbpart); }
+    }
+
+    /** Constructor */
+    Repartitor (tools::storage::impl::Group& group)  : _nbpart(0), _mm(0), _nb_minims(0), _nbPass(0), _freq_order(0)   { this->load (group);  }
+
+    /** Destructor */
+    ~Repartitor ()  {  if (_freq_order)  { delete[] _freq_order; } }
+
+    /** Compute the hash function for the minimizer.
+     * \param[in] pInfo : information about the distribution of the minimizers. */
+    void computeDistrib (const PartiInfo<5>& pInfo);
+    void justGroupNaive (const PartiInfo<5>& pInfo,  std::vector <std::pair<int,int> > &counts);
+    void justGroup      (const PartiInfo<5>& pInfo,  std::vector <std::pair<int,int> > &counts);
+    void justGroupLexi  (const PartiInfo<5>& extern_pInfo);
+
+    /** Returns the hash value for the given minimizer value.
+     * \param[in] minimizerValue : minimizer value as an integer.
+     * \return hash value for the given minimizer. */
+    Value operator() (u_int64_t minimizerValue)  { return getRepartTable() [minimizerValue]; }
+
+    /** Load the repartition table from a storage object.
+     * \param[in] group : group where the repartition table has to be loaded */
+    void load (tools::storage::impl::Group& group);
+
+    /** Save the repartition table into a storage object.
+     * \param[in] group : group where the repartition table has to be saved */
+    void save (tools::storage::impl::Group& group);
+
+    /** For debug purpose. */
+    void printInfo ();
+
+    /** Get the number of passes used to split the input bank. */
+    size_t getNbPasses() const { return _nbPass; }
+
+    /** Get a buffer on minimizer frequencies. */
+    uint32_t* getMinimizerFrequencies () { return _freq_order; }
+
+    /** Set the minimizer frequencies. */
+    void setMinimizerFrequencies (uint32_t* freq) { _freq_order = freq; }
+
+private:
+
+    typedef std::pair<u_int64_t,u_int64_t> ipair; //taille bin, numero bin
+
+    class itriple
+    {
+        public:
+            u_int64_t first;
+            u_int64_t second;
+            u_int64_t third;
+
+            itriple( u_int64_t first,  u_int64_t second,  u_int64_t third) : first(first), second(second), third(third) {}
+            itriple() : first(0), second(0), third(0) {}
+    };
+
+    struct compBin {
+        bool operator() (ipair l,ipair r) { return l.first > r.first; }
+    } comp_bins;
+
+    struct compSpace {
+        bool operator() (ipair l,ipair r) { return l.second > r.second; } //for partition, pair is parti number, space ued
+    } ;
+
+    struct compSpaceTriple {
+        bool operator() (itriple l, itriple r) { return l.second > r.second; } // same as compSpace
+    } ;
+
+    typedef std::vector<Value> Table;
+
+    /** Get the repartition table. It is built at first call. */
+    const Table& getRepartTable()
+    {
+		// if (_repart_table.empty()) { throw system::Exception ("Repartitor : table has not been initialized"); }
+        return _repart_table;
+    }
+
+    u_int16_t          _nbpart;
+    u_int16_t          _mm;
+    u_int64_t          _nb_minims;
+    u_int16_t          _nbPass;
+    std::vector<Value> _repart_table ;
+
+    uint32_t* _freq_order;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _PARTI_INFO_HPP_ */
diff --git a/gatb-core/src/gatb/kmer/impl/PartitionsCommand.cpp b/gatb-core/src/gatb/kmer/impl/PartitionsCommand.cpp
new file mode 100644
index 0000000..18ab0e8
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/PartitionsCommand.cpp
@@ -0,0 +1,2243 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/PartitionsCommand.hpp>
+#include <gatb/tools/collections/impl/OAHash.hpp>
+#include <gatb/tools/collections/impl/Hash16.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::kmer::impl;
+
+#define DEBUG(a)  // printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+#define IX(x,rad) ((rad)+(256)*(x))
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+PartitionsCommand<span>:: PartitionsCommand (
+   // Iterable<Type>&     partition,
+    CountProcessor*     processor,
+    size_t              cacheSize,
+    IteratorListener*   progress,
+    TimeInfo&           timeInfo,
+    PartiInfo<5>&       pInfo,
+    int                 passi,
+    int                 parti,
+    size_t              nbCores,
+    size_t              kmerSize,
+    MemAllocator&       pool,
+	tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+
+)
+    :
+     // _partition(partition),
+      _progress(progress),
+      _pInfo(pInfo),
+      _pass_num(passi),
+      _parti_num(parti),
+      _nbCores(nbCores),
+      _kmerSize(kmerSize),
+      _cacheSize(cacheSize),
+      _pool(pool),
+      _globalTimeInfo(timeInfo),
+      _processor(0),
+	  _superKstorage(superKstorage)
+{
+    setProcessor      (processor);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+PartitionsCommand<span>::~PartitionsCommand()
+{
+    _globalTimeInfo += _timeInfo;
+
+    setProcessor (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void PartitionsCommand<span>::insert (const Type& kmer, const CounterBuilder& counter)
+{
+    /** We call the count processor instance with the information collected for the current kmer. */
+    _processor->process (_parti_num, kmer, counter.get());
+}
+
+	
+
+/////////   multibank version  with old partition system//////////////
+template<size_t span>
+PartitionsCommand_multibank<span>:: PartitionsCommand_multibank (
+											 Iterable<Type>&     partition,
+											 CountProcessor*     processor,
+											 size_t              cacheSize,
+											 IteratorListener*   progress,
+											 TimeInfo&           timeInfo,
+											 PartiInfo<5>&       pInfo,
+											 int                 passi,
+											 int                 parti,
+											 size_t              nbCores,
+											 size_t              kmerSize,
+											 MemAllocator&       pool
+											 )
+:
+_partition(partition),
+_progress(progress),
+_pInfo(pInfo),
+_pass_num(passi),
+_parti_num(parti),
+_nbCores(nbCores),
+_kmerSize(kmerSize),
+_cacheSize(cacheSize),
+_pool(pool),
+_globalTimeInfo(timeInfo),
+_processor(0)
+{
+	setProcessor      (processor);
+}
+
+template<size_t span>
+PartitionsCommand_multibank<span>::~PartitionsCommand_multibank()
+{
+	_globalTimeInfo += _timeInfo;
+	
+	setProcessor (0);
+}
+
+template<size_t span>
+void PartitionsCommand_multibank<span>::insert (const Type& kmer, const CounterBuilder& counter)
+{
+	/** We call the count processor instance with the information collected for the current kmer. */
+	_processor->process (_parti_num, kmer, counter.get());
+}
+/////////////////
+	
+	
+	
+/*********************************************************************
+                #     #     #      #####   #     #
+                #     #    # #    #     #  #     #
+                #     #   #   #   #        #     #
+                #######  #     #   #####   #######
+                #     #  #######        #  #     #
+                #     #  #     #  #     #  #     #
+                #     #  #     #   #####   #     #
+*********************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+/** in this scheme we count k-mers inside a partition by a hash table */
+template<size_t span>
+PartitionsByHashCommand<span>:: PartitionsByHashCommand (
+   // Iterable<Type>&         partition,
+    CountProcessor*         processor,
+    size_t                  cacheSize,
+    IteratorListener*       progress,
+    TimeInfo&               timeInfo,
+    PartiInfo<5>&           pInfo,
+    int                     passi,
+    int                     parti,
+    size_t                  nbCores,
+    size_t                  kmerSize,
+    MemAllocator&           pool,
+    u_int64_t               hashMemory,
+	tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+
+)
+    : PartitionsCommand<span> (/*partition,*/ processor, cacheSize, progress, timeInfo, pInfo, passi, parti,nbCores,kmerSize,pool,superKstorage),
+     _hashMemory(hashMemory)
+{
+}
+
+	
+//will take N sorted files, will merge them to M files, by chunks of T files at a time
+	
+	template<size_t span>
+	class TempCountFileMerger
+	{
+		typedef typename Kmer<span>::Type  Type;
+		typedef tools::misc::Abundance<Type> abundance_t;
+		typedef std::pair< int , Type> ptcf; //  id pointer , kmer value
+		struct ptcfcomp { bool operator() (ptcf l,ptcf r) { return ((r.second) < (l.second)); } } ;
+		
+	public:
+		TempCountFileMerger(int reduceTarget, int chunksize) :_reduceTarget(reduceTarget), _chunksize(chunksize),_idx(0)
+		{
+		}
+		
+		std::vector<string>  mergeFiles(std::vector<string> filenames)
+		{
+			ptcf best_elem;
+			int best_p;
+			int current_ab = 0;
+			int previous_ab = 0;
+			Type current_kmer,previous_kmer;
+			
+			
+			while(filenames.size() > _reduceTarget)
+			{
+				
+				std::vector<string> currentFiles;
+				for(int ii=0; ii<_chunksize; ii++)
+				{
+					currentFiles.push_back(filenames.back()); filenames.pop_back();
+				}
+				
+				//the new file containing the merged counts
+				std::string newfname = currentFiles[0]  + Stringify::format ("_merged_%i", _idx++) ;
+				BagFile<abundance_t> * bagf = new BagFile<abundance_t>(newfname); LOCAL(bagf);
+				Bag<abundance_t> * currentbag =  new BagCache<abundance_t> (  bagf, 10000 ); LOCAL(currentbag);
+				
+				filenames.push_back(newfname);
+				
+				std::vector<Iterator<abundance_t>*> _tmpCountIterators;
+				
+				for(int ii=0; ii< currentFiles.size(); ii++)
+				{
+					_tmpCountIterators.push_back( new IteratorFile<abundance_t> (currentFiles[ii])  );
+				}
+				std::priority_queue< ptcf, std::vector<ptcf>,ptcfcomp > pq;
+				
+				
+				//// init all iterators  ////
+				for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+				{
+					_tmpCountIterators[ii]->first();
+				}
+				
+				//////   init pq ////
+				for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+				{
+					if( ! _tmpCountIterators[ii]->isDone())  {
+						pq.push(ptcf(ii,_tmpCountIterators[ii]->item().value) );
+					}
+				}
+				
+				//now merge the n sorted iterators and merge their kmer counts.
+				if(pq.size() != 0)
+				{
+					//get first pointer
+					best_elem = pq.top() ; pq.pop();
+					best_p = best_elem.first;
+					previous_ab = _tmpCountIterators[best_p]->item().abundance;
+					previous_kmer = best_elem.second;
+					
+					//go forward in this list
+					_tmpCountIterators[best_p]->next();
+					if (! _tmpCountIterators[best_p]->isDone())
+					{
+						pq.push(ptcf( best_p,_tmpCountIterators[best_p]->item().value) );
+					}
+					
+					while (pq.size() != 0)
+					{
+						
+						//get  first pointer
+						best_elem = pq.top() ; pq.pop();
+						best_p = best_elem.first;
+						current_ab = _tmpCountIterators[best_p]->item().abundance;
+						current_kmer = best_elem.second;
+						
+						//go forward in this list
+						_tmpCountIterators[best_p]->next();
+						if (! _tmpCountIterators[best_p]->isDone())
+						{
+							pq.push(ptcf( best_p,_tmpCountIterators[best_p]->item().value) );
+						}
+						
+						
+						if(current_kmer != previous_kmer)
+						{
+							//output previous kmer
+							currentbag->insert( abundance_t(previous_kmer,previous_ab) );
+							previous_kmer = current_kmer;
+							previous_ab = current_ab;
+						}
+						else
+						{
+							//merge counter
+							previous_ab += current_ab;
+						}
+					}
+					
+					//output last one
+					currentbag->insert( abundance_t(previous_kmer,previous_ab) );
+				}
+				
+
+				currentbag->flush();
+
+				
+				//cleanup
+				
+				for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+				{
+					delete _tmpCountIterators[ii];
+				}
+				
+				
+				//erase used files
+				for(int ii=0; ii< currentFiles.size(); ii++)
+				{
+					std::string fname = currentFiles[ii];
+					system::impl::System::file().remove(fname);
+				}
+				
+			}
+			
+			
+			return filenames;
+		}
+		
+		private :
+		
+		int _reduceTarget;
+		int _chunksize;
+		int _idx;
+		
+	};
+	
+	
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void PartitionsByHashCommand<span>:: execute ()
+{
+	typedef typename tools::collections::impl::Hash16<Type>::cell cell_t;
+
+		this->_superKstorage->openFile("r",this->_parti_num);
+	
+	this->_processor->beginPart (this->_pass_num, this->_parti_num, this->_cacheSize, this->getName());
+	
+	CounterBuilder solidCounter;
+		
+	/** We need a map for storing part of solid kmers. */
+	//OAHash<Type> hash (_hashMemory);
+	
+	Hash16<Type> hash16 (_hashMemory/MBYTE); // now use hash 16 to ensure always finish. needs more ram than OAHash but seems faster
+	
+
+	
+	
+	// If the partition holds kmers (and not superkmers), it would be :
+	//      for (it->first(); !it->isDone(); it->next())   {  hash.increment (it->item());  }
+	
+	DEBUG (("PartitionsByHashCommand::execute:  fillsolid parti num %i  by oahash --- mem %llu  MB\n",
+			this->_parti_num,_hashMemory/MBYTE
+));
+	
+	
+	typedef tools::misc::Abundance<Type> abundance_t;
+	std::vector<string> _tmpCountFileNames;
+	
+
+		//with decompactage
+		//superk
+		int ks = this->_kmerSize;
+		Type un; un.setVal(1);
+		//size_t _shift_val = Type::getSize() -8;
+		Type kmerMask = (un << (ks*2)) - un;
+		size_t shift = 2*(ks-1);
+		
+		Type _seedk;
+		
+		int _fileId = this->_parti_num;
+		unsigned char * _buffer = 0 ;
+		unsigned int _buffer_size = 0;
+		
+		
+
+		
+		unsigned int nb_bytes_read;
+		while(this->_superKstorage->readBlock(&_buffer, &_buffer_size, &nb_bytes_read, _fileId))
+		{
+			unsigned char * ptr = _buffer;
+			u_int8_t nbK; //number of kmers in the superkmer
+			u_int8_t newbyte=0;
+			
+			while(ptr < (_buffer+nb_bytes_read)) //decode whole block
+			{
+				//decode a superkmer
+				nbK = *ptr; ptr++;
+				//int nb_bytes_superk = (this->_kmerSize + nbK -1 +3) /4  ;
+				
+				int rem_size = this->_kmerSize;
+				
+				Type Tnewbyte;
+				int nbr=0;
+				_seedk.setVal(0);
+				while(rem_size>=4)
+				{
+					newbyte = *ptr ; ptr++;
+					Tnewbyte.setVal(newbyte);
+					_seedk =  _seedk  |  (Tnewbyte  << (8*nbr)) ;
+					rem_size -= 4; nbr++;
+				}
+				
+				int uid = 4; //uid = nb nt used in current newbyte
+				
+				//reste du seed kmer
+				if(rem_size>0)
+				{
+					newbyte = *ptr ; ptr++;
+					Tnewbyte.setVal(newbyte);
+					
+					_seedk = ( _seedk  |  (Tnewbyte  << (8*nbr)) ) ;
+					uid = rem_size;
+				}
+				_seedk = _seedk & kmerMask;
+				
+				
+				
+				u_int8_t rem = nbK;
+				Type temp = _seedk;
+				Type rev_temp = revcomp(temp,this->_kmerSize);
+				Type newnt ;
+				Type mink;
+				
+				
+				//iterate over kmers of this superk
+				for (int ii=0; ii< nbK; ii++,rem--)
+				{
+					
+#ifdef NONCANONICAL
+					mink = temp;
+#else
+					mink = std::min (rev_temp, temp);
+#endif
+					
+					
+					/** We insert the kmer into the hash. */
+					hash16.insert(mink);
+					
+					
+					if(rem < 2) break; //no more kmers in this superkmer, the last one has just been eaten
+					
+					////////now decode next kmer of this superkmer ///////
+					
+					if(uid>=4) //read next byte
+					{
+						newbyte = *ptr ; ptr++;
+						Tnewbyte.setVal(newbyte);
+						uid =0;
+					}
+					
+					newnt = (Tnewbyte >> (2*uid))& 3; uid++;
+					temp = ((temp << 2 ) |  newnt   ) & kmerMask;
+					
+					newnt.setVal(comp_NT[newnt.getVal()]) ;
+					rev_temp = ((rev_temp >> 2 ) |  (newnt << shift) ) & kmerMask;
+				}
+				
+				//now go to next superk of this block, ptr should point to beginning of next superk
+			}
+			
+			//check if hashtable is getting too big : in that case dump it disk and resume with the emptied hashtable
+			//at the end merge-sort all the dumped files with the content of hash table
+			if(hash16.getByteSize() > _hashMemory) // to be improved (can be slightly larger than maxmemory by a block size)
+				//if(_tmpCountFileNames.size()<20) //force  dumps for testing
+			{
+				//printf("splitting into subparts %lli KB / %lli KB  parti %i subpart %i \n",hash16.getByteSize()/1024,_hashMemory/1024 ,this->_parti_num,_tmpCountFiles.size()  );
+				//dump partial count to disk file
+				
+				
+				Iterator < cell_t >* itKmerAbundancePartial = hash16.iterator(true);
+				LOCAL (itKmerAbundancePartial);
+				
+				
+				std::string fname = this->_superKstorage->getFileName(this->_parti_num) + Stringify::format ("_subpart_%i", _tmpCountFileNames.size()) ;
+				_tmpCountFileNames.push_back(fname);
+				
+				BagFile<abundance_t> * bagf = new BagFile<abundance_t>(fname); LOCAL(bagf);
+				Bag<abundance_t> * currentbag =  new BagCache<abundance_t> (  bagf, 10000 ); LOCAL(currentbag);
+				
+				
+				for (itKmerAbundancePartial->first(); !itKmerAbundancePartial->isDone(); itKmerAbundancePartial->next())
+				{
+					cell_t & cell = itKmerAbundancePartial->item();
+					currentbag->insert( abundance_t(cell.graine,cell.val) );
+				}
+				
+				currentbag->flush();			
+				hash16.clear();
+			}
+		}
+		
+		
+		if(_buffer!=0)
+			free(_buffer);
+	
+	
+
+	/** We loop over the solid kmers map.
+	 * NOTE !!! we want the items to be sorted by kmer values (see finalize part of debloom). */
+	//Iterator < Abundance<Type> >* itKmerAbundance = hash.iterator(true);
+	//shortcut
+	Iterator < cell_t >* itKmerAbundance = hash16.iterator(true);
+	LOCAL (itKmerAbundance);
+	
+	
+	//now merge sort over current hash and over the sorted _tmpCountFiles
+	// : simple merge sort of n sorted iterators
+	
+	if(_tmpCountFileNames.size()!=0)
+	{
+		
+		TempCountFileMerger<span> tempCountFileMerger (10,10);
+		//will merge by chunk of 10 files at a time, until reach less than 10 files
+		_tmpCountFileNames = tempCountFileMerger.mergeFiles(_tmpCountFileNames);
+		//then will use code below to merge remaining files with the contents of the hash table
+
+		std::vector<Iterator<abundance_t>*> _tmpCountIterators;
+
+		//how to make sure there are not too many subpart files ?  and that we'll not reach the max open files limit ?
+		//we *could* merge  only some of them at a time ..  todo ?  --> done with TempCountFileMerger above
+		for(int ii=0; ii< _tmpCountFileNames.size(); ii++)
+		{
+			std::string fname = _tmpCountFileNames[ii];
+			_tmpCountIterators.push_back( new IteratorFile<abundance_t> (fname)  );
+		}
+	
+		// Note (guillaume) : code below is ugly because I have to manage itKmerAbundance (iterator over cell_t)
+		// and _tmpCountIterators (iterators over abundance_t) differently since they have different types
+		// I would have liked to transform  Iterator<cell_t>  to an Iterator<abundance_t>   with the following adaptor :
+		//
+		// 		struct cell2AbAdaptor  {  abundance_t operator() (cell_t& c)  { return abundance_t(c.graine,c.val) ; }  };
+		//Iterator<abundance_t>*   hashAbundance  = new IteratorAdaptor<cell_t,abundance_t,cell2AbAdaptor> (itKmerAbundance);
+	    //	but it turns out to be impossible because of the return by reference of the   item()  function.
+		//  Another solution would be to dump contents of hash to a file then read it, but inefficient
+		//  So, ugly code it is.  (see all the if(best_p==-1) below)
+		
+		
+		//setup the priority queue for merge sorting
+		typedef std::pair< int , Type> ptcf; //  id pointer , kmer value
+		struct ptcfcomp { bool operator() (ptcf l,ptcf r) { return ((r.second) < (l.second)); } } ;
+		std::priority_queue< ptcf, std::vector<ptcf>,ptcfcomp > pq;
+
+		//// init all iterators  ////
+		itKmerAbundance->first();
+		for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+		{
+			_tmpCountIterators[ii]->first();
+		}
+		
+		//////   init pq ////
+
+		if(!itKmerAbundance->isDone())
+		{
+			pq.push(ptcf(-1,itKmerAbundance->item().graine) ); // -1  will mean in the  itKmerAbundance
+		}
+		
+		for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+		{
+			if( ! _tmpCountIterators[ii]->isDone())  {
+				abundance_t &ab = _tmpCountIterators[ii]->item();
+				pq.push(ptcf(ii,ab.value) );
+			}
+		}
+		
+		ptcf best_elem;
+		int best_p;
+		int current_ab = 0;
+		int previous_ab = 0;
+		Type current_kmer,previous_kmer;
+		
+	
+	    //now merge the n sorted iterators and merge their kmer counts.
+		if(pq.size() != 0)
+		{
+			//get first pointer
+			best_elem = pq.top() ; pq.pop();
+			best_p = best_elem.first;
+			if(best_p==-1)
+			{
+				previous_ab = itKmerAbundance->item().val;
+			}
+			else
+			{
+				previous_ab = _tmpCountIterators[best_p]->item().abundance;
+			}
+			
+			previous_kmer = best_elem.second;
+
+			//go forward in this list
+
+			if(best_p==-1)
+			{
+				itKmerAbundance->next();
+				if (! itKmerAbundance->isDone())
+				{
+					pq.push(ptcf(-1,itKmerAbundance->item().graine) );
+				}
+			}
+			else
+			{
+				_tmpCountIterators[best_p]->next();
+				if (! _tmpCountIterators[best_p]->isDone())
+				{
+					pq.push(ptcf( best_p,_tmpCountIterators[best_p]->item().value) );
+				}
+			}
+			
+			while (pq.size() != 0)
+			{
+				
+				//get  first pointer
+				best_elem = pq.top() ; pq.pop();
+				best_p = best_elem.first;
+				
+				if(best_p==-1)
+				{
+					current_ab = itKmerAbundance->item().val;
+				}
+				else
+				{
+					current_ab = _tmpCountIterators[best_p]->item().abundance;
+				}
+				current_kmer = best_elem.second;
+				
+				//go forward in this list
+				if(best_p==-1)
+				{
+					itKmerAbundance->next();
+					if (! itKmerAbundance->isDone())
+					{
+						pq.push(ptcf(-1,itKmerAbundance->item().graine) );
+					}
+				}
+				else
+				{
+					_tmpCountIterators[best_p]->next();
+					if (! _tmpCountIterators[best_p]->isDone())
+					{
+						pq.push(ptcf( best_p,_tmpCountIterators[best_p]->item().value) );
+					}
+				}
+
+				if(current_kmer != previous_kmer)
+				{
+					//output previous kmer
+					solidCounter.set (previous_ab);
+					this->insert (previous_kmer, solidCounter);
+					previous_kmer = current_kmer;
+					previous_ab = current_ab;
+				}
+				else
+				{
+					//merge counter
+					previous_ab += current_ab;
+				}
+				
+			}
+
+			//output last one
+			solidCounter.set (previous_ab);
+			this->insert (previous_kmer, solidCounter);
+		}
+		
+
+		//cleanup
+		for(int ii=0; ii< _tmpCountIterators.size(); ii++)
+		{
+			delete _tmpCountIterators[ii];
+		}
+		
+		
+		//erase sub files
+		for(int ii=0; ii< _tmpCountFileNames.size(); ii++)
+		{
+			std::string fname = _tmpCountFileNames[ii];
+			system::impl::System::file().remove(fname);
+		}
+		
+	}
+	else // in that case no merging needed, just iterate the hash table and output kmer counts
+	{
+		for (itKmerAbundance->first(); !itKmerAbundance->isDone(); itKmerAbundance->next())
+		{
+			
+			cell_t & cell = itKmerAbundance->item();
+			solidCounter.set (cell.val);
+			this->insert (cell.graine, solidCounter);
+		}
+	}
+
+	
+	this->_superKstorage->closeFile(this->_parti_num);
+	
+	this->_progress->inc (this->_pInfo.getNbKmer(this->_parti_num) ); // this->_pInfo->getNbKmer(this->_parti_num)  kmers.size()
+	
+	this->_processor->endPart (this->_pass_num, this->_parti_num);
+};
+
+/*********************************************************************
+        #     #  #######   #####   #######  #######  ######
+        #     #  #        #     #     #     #     #  #     #
+        #     #  #        #           #     #     #  #     #
+        #     #  #####    #           #     #     #  ######
+         #   #   #        #           #     #     #  #   #
+          # #    #        #     #     #     #     #  #    #
+           #     #######   #####      #     #######  #     #
+*********************************************************************/
+
+template<size_t span>
+class SuperKReader
+{
+	typedef typename Kmer<span>::Type  Type;
+public:
+
+	void operator() (Type& elem)
+	{
+		//reading elems by pairs
+		if(_first)
+		{
+			_superk = elem;
+			_first = false;
+		}
+		else
+		{
+			_seedk = elem;
+			
+			Type compactedK;
+			
+			compactedK =  _superk;
+			u_int8_t nbK = (compactedK >> _shift_val).getVal()  & 255; // 8 bits poids fort = cpt
+			u_int8_t rem = nbK;
+			
+			Type temp = _seedk;
+			Type rev_temp = revcomp(temp,_kmerSize);
+			Type newnt ;
+			Type mink, prev_mink; prev_mink.setVal(0);
+			uint64_t idx;
+			
+#ifdef NONCANONICAL
+            bool prev_which = true;
+#else
+			bool prev_which =  (temp < rev_temp );
+#endif
+            
+			int kx_size = -1; //next loop start at ii=0, first kmer will put it at 0
+			Type radix_kxmer_forward =  (temp & _mask_radix) >> ((_kmerSize - 4)*2);
+			Type  first_revk, kinsert,radix_kxmer;
+            first_revk.setVal(0);
+			
+			if(!prev_which) first_revk = rev_temp;
+			
+			u_int8_t rid;
+
+			for (int ii=0; ii< nbK; ii++,rem--)
+			{
+#ifdef NONCANONICAL
+                bool which = true;
+                mink = temp;
+#else
+				bool which =  (temp < rev_temp );
+				mink = which ? temp : rev_temp;
+#endif
+
+				if (which != prev_which || kx_size >= _kx) // kxmer_size = 1
+				{
+					//output kxmer size kx_size,radix_kxmer
+					//kx mer is composed of superKp[ii-1] superKp[ii-2] .. superKp[ii-n] with nb elems  n  == kxmer_size +1  (un seul kmer ==k+0)
+					
+					if(prev_which)
+					{
+						radix_kxmer = radix_kxmer_forward;
+						kinsert = prev_mink;
+					}
+					else // si revcomp, le radix du kxmer est le debut du dernier kmer
+					{
+						//previous mink
+						radix_kxmer =  (prev_mink & _mask_radix) >> _shift_radix;
+						kinsert = first_revk;
+					}
+					
+					//record kxmer
+					rid = radix_kxmer.getVal();
+					//idx = _r_idx[IX(kx_size,rid)]++;
+					idx = __sync_fetch_and_add( _r_idx +  IX(kx_size,rid) ,1); // si le sync fetch est couteux, faire un mini buffer par thread
+					
+					_radix_kmers [IX(kx_size,rid)][ idx] = kinsert << ((4-kx_size)*2);  //[kx_size][rid]
+					if (_bankIdMatrix)  { _bankIdMatrix[IX(kx_size,rid)][ idx] = _bankId; }
+					
+					radix_kxmer_forward =  (mink & _mask_radix) >> _shift_radix;
+					kx_size =0;
+					
+					if(!which) first_revk = rev_temp;
+				}
+				else
+				{
+					kx_size++;
+				}
+			
+				prev_which = which ;
+				prev_mink = mink;
+				
+				if(rem < 2) break; //no more kmers in this superkmer, the last one has just been eaten
+				newnt =  ( _superk >> ( 2*(rem-2)) ) & 3 ;
+				
+				temp = ((temp << 2 ) |  newnt   ) & _kmerMask;
+				newnt.setVal(comp_NT[newnt.getVal()]) ;
+				rev_temp = ((rev_temp >> 2 ) |  (newnt << _shift) ) & _kmerMask;
+			}
+			
+			//record last kxmer prev_mink et monk ?
+			if(prev_which)
+			{
+				radix_kxmer = radix_kxmer_forward;
+				kinsert = prev_mink;
+			}
+			else // si revcomp, le radix du kxmer est le debut du dernier kmer
+			{
+				//previous mink
+				radix_kxmer =  (prev_mink & _mask_radix) >> _shift_radix;
+				kinsert = first_revk;
+			}
+			
+			//record kxmer
+			rid = radix_kxmer.getVal();
+			//idx = _r_idx[IX(kx_size,rid)]++;
+			idx = __sync_fetch_and_add( _r_idx +  IX(kx_size,rid) ,1); // si le sync fetch est couteux, faire un mini buffer par thread
+					
+
+            
+//                        if (idx >= _radix_sizes[IX(kx_size,rid)] ||  _radix_sizes[IX(kx_size,rid)]  == 0)
+//                        {  cout << "error, accessing _radix_kmers beyond bound" << endl; exit(1); }
+//                    cout << "tbl ref " << IX(kx_size,rid) << " idx " << idx << " radix sizes " <<   _radix_sizes[IX(kx_size,rid)]   << endl;
+            
+                        _radix_kmers [IX(kx_size,rid)][ idx] = kinsert << ((4-kx_size)*2);   // [kx_size][rid]
+                    //cout << "went okay " << idx << endl;
+
+			if (_bankIdMatrix)  { _bankIdMatrix[IX(kx_size,rid)][ idx] = _bankId; }
+
+			_first = true;
+		}
+	}
+	
+	SuperKReader (size_t kmerSize,  uint64_t * r_idx, Type** radix_kmers, uint64_t* radix_sizes, bank::BankIdType** bankIdMatrix, size_t bankId=0)
+	: _kmerSize (kmerSize), _kx(4), _radix_kmers(radix_kmers), _radix_sizes(radix_sizes), _bankIdMatrix(bankIdMatrix), _r_idx (r_idx), _first(true), _bankId(bankId)
+	 {
+		 Type un;
+         un.setVal(1);
+		 _kmerMask    = (un << (kmerSize*2)) - 1;
+		 _mask_radix.setVal((int64_t) 255);
+		 _mask_radix  = _mask_radix << ((_kmerSize - 4)*2);
+		 _shift       = 2*(kmerSize-1);
+		 _shift_val   = un.getSize() -8;
+		 _shift_radix = ((kmerSize - 4)*2); // radix is 4 nt long
+	}
+	
+private :
+
+	size_t _kmerSize;
+	size_t _shift ;
+	size_t _shift_val ;
+	size_t _shift_radix ;
+	int    _kx;
+	Type** _radix_kmers;
+      uint64_t*          _radix_sizes;
+
+	bank::BankIdType** _bankIdMatrix;
+	uint64_t* _r_idx ;
+	bool _first;
+	Type _superk, _seedk;
+	Type _radix, _mask_radix ;
+	Type _kmerMask;
+	size_t _bankId;
+};
+
+	
+	
+
+//pour l'instant marchera que en mode comptage simple, pas en multi jeu separes
+//car le jeu separe necessite de passer un cpt de separation des banques, a verifier, et il faut que les buffer conservent l'ordre d'entree, a verifier aussi
+//readcommand pour lecture parallele des parti superkmers
+template<size_t span>
+class ReadSuperKCommand : public gatb::core::tools::dp::ICommand, public system::SmartPointer
+{
+	typedef typename Kmer<span>::Type  Type;
+	
+public:
+	ReadSuperKCommand(tools::storage::impl::SuperKmerBinFiles* superKstorage, int fileId, int kmerSize,
+					  uint64_t * r_idx, Type** radix_kmers, uint64_t* radix_sizes, bank::BankIdType** bankIdMatrix)
+	: _superKstorage(superKstorage), _fileId(fileId),_buffer(0),_buffer_size(0), _kmerSize(kmerSize),_radix_kmers(radix_kmers), _radix_sizes(radix_sizes), _bankIdMatrix(bankIdMatrix), _r_idx (r_idx)
+	{
+		_kx=4;
+		Type un;
+		un.setVal(1);
+		_kmerMask    = (un << (_kmerSize*2)) - 1;
+		_mask_radix.setVal((int64_t) 255);
+		_mask_radix  = _mask_radix << ((_kmerSize - 4)*2);
+		_shift       = 2*(_kmerSize-1);
+		_shift_val   = un.getSize() -8;
+		_shift_radix = ((_kmerSize - 4)*2); // radix is 4 nt long
+	}
+	
+	void execute ()
+	{
+		unsigned int nb_bytes_read;
+		while(_superKstorage->readBlock(&_buffer, &_buffer_size, &nb_bytes_read, _fileId))
+		{
+			//decode block and iterate through its superkmers
+			unsigned char * ptr = _buffer;
+			u_int8_t nbK; //number of kmers in the superkmer
+			int nbsuperkmer_read =0;
+			u_int8_t newbyte=0;
+			
+			while(ptr < (_buffer+nb_bytes_read)) //decode whole block
+			{
+				//decode a superkmer
+				nbK = *ptr; ptr++;
+				//int nb_bytes_superk = (_kmerSize + nbK -1 +3) /4  ;
+				
+				int rem_size = _kmerSize;
+				
+				Type Tnewbyte;
+				int nbr=0;
+				_seedk.setVal(0);
+				while(rem_size>=4)
+				{
+					newbyte = *ptr ; ptr++;
+					Tnewbyte.setVal(newbyte);
+					
+					
+					_seedk =  _seedk  |  (Tnewbyte  << (8*nbr)) ;
+					rem_size -= 4; nbr++;
+				}
+				
+				int uid = 4; //uid = nb nt used in current newbyte
+				
+				//reste du seed kmer
+				if(rem_size>0)
+				{
+					newbyte = *ptr ; ptr++;
+					Tnewbyte.setVal(newbyte);
+					
+					_seedk = ( _seedk  |  (Tnewbyte  << (8*nbr)) ) ;
+					uid = rem_size;
+				}
+				_seedk = _seedk & _kmerMask;
+				
+				
+				//std::string pt = _seedk.toString(_kmerSize);
+				//printf("seedk \n%s \n",pt.c_str());
+				
+				///////////////////////// seedk should be ready here , now parse kx-mers ////////////////////////////////
+				
+				u_int8_t rem = nbK;
+				Type temp = _seedk;
+				Type rev_temp = revcomp(temp,_kmerSize);
+				Type newnt ;
+				Type mink, prev_mink; prev_mink.setVal(0);
+				uint64_t idx;
+				
+#ifdef NONCANONICAL
+				bool prev_which = true;
+#else
+				bool prev_which =  (temp < rev_temp );
+#endif
+				
+				int kx_size = -1; //next loop start at ii=0, first kmer will put it at 0
+				Type radix_kxmer_forward =  (temp & _mask_radix) >> ((_kmerSize - 4)*2);
+				Type  first_revk, kinsert,radix_kxmer;
+				first_revk.setVal(0);
+				
+				if(!prev_which) first_revk = rev_temp;
+				
+				u_int8_t rid;
+				
+				for (int ii=0; ii< nbK; ii++,rem--)
+				{
+#ifdef NONCANONICAL
+					bool which = true;
+					mink = temp;
+#else
+					bool which =  (temp < rev_temp );
+					mink = which ? temp : rev_temp;
+#endif
+					
+					if (which != prev_which || kx_size >= _kx) // kxmer_size = 1
+					{
+						//output kxmer size kx_size,radix_kxmer
+						//kx mer is composed of superKp[ii-1] superKp[ii-2] .. superKp[ii-n] with nb elems  n  == kxmer_size +1  (un seul kmer ==k+0)
+						
+						if(prev_which)
+						{
+							radix_kxmer = radix_kxmer_forward;
+							kinsert = prev_mink;
+						}
+						else // si revcomp, le radix du kxmer est le debut du dernier kmer
+						{
+							//previous mink
+							radix_kxmer =  (prev_mink & _mask_radix) >> _shift_radix;
+							kinsert = first_revk;
+						}
+						
+						//record kxmer
+						rid = radix_kxmer.getVal();
+						//idx = _r_idx[IX(kx_size,rid)]++;
+						idx = __sync_fetch_and_add( _r_idx +  IX(kx_size,rid) ,1); // si le sync fetch est couteux, faire un mini buffer par thread
+						
+						_radix_kmers [IX(kx_size,rid)][ idx] = kinsert << ((4-kx_size)*2);  //[kx_size][rid]
+						if (_bankIdMatrix)  { _bankIdMatrix[IX(kx_size,rid)][ idx] = _bankId; }
+						
+						radix_kxmer_forward =  (mink & _mask_radix) >> _shift_radix;
+						kx_size =0;
+						
+						if(!which) first_revk = rev_temp;
+					}
+					else
+					{
+						kx_size++;
+					}
+					
+					prev_which = which ;
+					prev_mink = mink;
+					
+					if(rem < 2) break; //no more kmers in this superkmer, the last one has just been eaten
+					
+					//////////////////////////////now decode next kmer of this superkmer //////////////////////////////////////////////
+					
+					if(uid>=4) //read next byte
+					{
+						newbyte = *ptr ; ptr++;
+						Tnewbyte.setVal(newbyte);
+						uid =0;
+					}
+					
+					newnt = (Tnewbyte >> (2*uid))& 3; uid++;
+					
+					temp = ((temp << 2 ) |  newnt   ) & _kmerMask;
+					
+					newnt.setVal(comp_NT[newnt.getVal()]) ;
+					rev_temp = ((rev_temp >> 2 ) |  (newnt << _shift) ) & _kmerMask;
+					
+					///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+				}
+				
+				//record last kxmer prev_mink et monk ?
+				if(prev_which)
+				{
+					radix_kxmer = radix_kxmer_forward;
+					kinsert = prev_mink;
+				}
+				else // si revcomp, le radix du kxmer est le debut du dernier kmer
+				{
+					//previous mink
+					radix_kxmer =  (prev_mink & _mask_radix) >> _shift_radix;
+					kinsert = first_revk;
+				}
+				
+				//record kxmer
+				rid = radix_kxmer.getVal();
+				//idx = _r_idx[IX(kx_size,rid)]++;
+				idx = __sync_fetch_and_add( _r_idx +  IX(kx_size,rid) ,1); // si le sync fetch est couteux, faire un mini buffer par thread
+				
+				
+				_radix_kmers [IX(kx_size,rid)][ idx] = kinsert << ((4-kx_size)*2);   // [kx_size][rid]
+				//cout << "went okay " << idx << endl;
+				
+				if (_bankIdMatrix)  { _bankIdMatrix[IX(kx_size,rid)][ idx] = _bankId; }
+				
+				
+				
+				
+				//////////////////////////////////////////////////////////
+				//ptr+=nb_bytes_superk;
+				
+				//now go to next superk of this block, ptr should point to beginning of next superk
+				nbsuperkmer_read++;
+				/////////
+			}
+			
+			//printf("nb superk in this block %i parti %i\n",nbsuperkmer_read,_fileId);
+			
+			
+		}
+		
+		if(_buffer!=0)
+			free(_buffer);
+	}
+private:
+	tools::storage::impl::SuperKmerBinFiles* _superKstorage;
+	int _fileId;
+	unsigned char * _buffer;
+	unsigned int _buffer_size;
+	int _kmerSize;
+	int    _kx;
+	
+	Type** _radix_kmers;
+	uint64_t*          _radix_sizes;
+	bank::BankIdType** _bankIdMatrix;
+	uint64_t* _r_idx ;
+	
+	Type _superk, _seedk;
+	Type _radix, _mask_radix ;
+	Type _kmerMask;
+	size_t _shift ;
+	size_t _shift_val ;
+	size_t _shift_radix ;
+	size_t _bankId;
+	
+};
+	
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+/** in this scheme we count k-mers in a partition by sorting a vector*/
+template<size_t span>
+PartitionsByVectorCommand<span>:: PartitionsByVectorCommand (
+  //  Iterable<Type>&     partition,
+    CountProcessor*     processor,
+    size_t              cacheSize,
+    IteratorListener*   progress,
+    TimeInfo&           timeInfo,
+    PartiInfo<5>&       pInfo,
+    int                 passi,
+    int                 parti,
+    size_t              nbCores,
+    size_t              kmerSize,
+    MemAllocator&       pool,
+    vector<size_t>&     offsets,
+	tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+)
+    : PartitionsCommand<span> (/*partition,*/ processor, cacheSize,  progress, timeInfo, pInfo, passi, parti,nbCores,kmerSize,pool,superKstorage),
+        _radix_kmers (0), _bankIdMatrix(0), _radix_sizes(0), _r_idx(0), _nbItemsPerBankPerPart(offsets)
+{
+    _dispatcher = new Dispatcher (this->_nbCores);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+PartitionsByVectorCommand<span>:: ~PartitionsByVectorCommand ()
+{
+    if (_dispatcher)  { delete _dispatcher; }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void PartitionsByVectorCommand<span>::execute ()
+{
+    this->_processor->beginPart (this->_pass_num, this->_parti_num, this->_cacheSize, this->getName());
+
+    /** We check that we got something. */
+
+	if (this->_superKstorage->getNbItems(this->_parti_num) == 0)  {  return;  }
+
+
+    /** We configure tables. */
+    _radix_kmers  = (Type**)     MALLOC (256*(KX+1)*sizeof(Type*)); //make the first dims static ?  5*256
+    _radix_sizes  = (uint64_t*)  MALLOC (256*(KX+1)*sizeof(uint64_t));
+    _r_idx        = (uint64_t*)  CALLOC (256*(KX+1),sizeof(uint64_t));
+
+    /** We need extra information for kmers counting in case of several input banks. */
+    if (_nbItemsPerBankPerPart.size() > 1) { _bankIdMatrix = (bank::BankIdType**) MALLOC (256*(KX+1)*sizeof(bank::BankIdType*)); }
+    else                                   { _bankIdMatrix = 0; }
+
+    /** We have 3 phases here: read, sort and dump. */
+    executeRead ();
+    executeSort ();
+    executeDump ();
+
+    /** We cleanup tables. */
+    FREE (_radix_sizes) ;
+    FREE (_radix_kmers);
+    FREE (_r_idx);
+    if (_bankIdMatrix)  { FREE (_bankIdMatrix); }
+
+    /** We update the progress bar. */
+    this->_progress->inc (this->_pInfo.getNbKmer(this->_parti_num) );
+
+    this->_processor->endPart (this->_pass_num, this->_parti_num);
+};
+
+
+	
+	
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void PartitionsByVectorCommand<span>::executeRead ()
+{
+    TIME_INFO (this->_timeInfo, "1.read");
+
+	this->_superKstorage->openFile("r",this->_parti_num);
+
+    /** Recall that the attribute _offsets has a size equals to the number of banks + 1 as input
+     * and for each bank, it holds the number of items found for the currently processed partition.
+     *
+     *               bank0   bank1   ...   bankI
+     *   offsets :    xxx     xxx           xxx
+     *               <------------------------->
+     *                current partition content
+     */
+
+	 DEBUG (("_offsets.size=%d  OFFSETS: ", _nbItemsPerBankPerPart.size() ));
+	 for (size_t j=0; j<_nbItemsPerBankPerPart.size(); j++)  {  DEBUG (("%6d ", _nbItemsPerBankPerPart[j]));  }  DEBUG (("\n"));
+
+    uint64_t sum_nbxmer =0;
+
+    /** We synchronize this statements block because of threads concurrent access. */
+    {
+        LocalSynchronizer synchro (this->_pool.getSynchro());
+
+        /** We align the pool with a big alignment constraint (see below macos issue with uint128) */
+        this->_pool.align (16);
+
+        /** FIRST: allocation for the kmers. */
+        for (size_t xx=0; xx< (KX+1); xx++)
+        {
+            for (int ii=0; ii< 256; ii++)
+            {
+                /** Shortcut. */
+                size_t nbKmers = this->_pInfo.getNbKmer(this->_parti_num,ii,xx);
+
+                //use memory pool here to avoid memory fragmentation
+                _radix_kmers  [IX(xx,ii)] = (Type*)     this->_pool.pool_malloc (nbKmers * sizeof(Type),     "kmers alloc");
+                _radix_sizes  [IX(xx,ii)] = nbKmers;
+
+                sum_nbxmer +=  nbKmers;
+            }
+        }
+
+        /** SECOND: allocation for the bank ids if needed.
+         * => NEED TO BE DONE AFTER THE KMERS BECAUSE OF MEMORY ALIGNMENT CONCERNS.
+         * On MacOs, we got some crashes with uint128 that were not aligned on 16 bytes
+         */
+        if (_bankIdMatrix)
+		{
+			throw Exception ("PartitionsByVectorCommand: multi-bank unsupported with new superk storage");
+
+			/*
+			for (size_t xx=0; xx< (KX+1); xx++)
+			{
+				for (int ii=0; ii< 256; ii++)
+				{
+					size_t nbKmers = this->_pInfo.getNbKmer(this->_parti_num,ii,xx);
+					_bankIdMatrix [IX(xx,ii)] = (bank::BankIdType*) this->_pool.pool_malloc (nbKmers * sizeof(bank::BankIdType), "bank ids alloc");
+				}
+			}
+			 */
+		}
+    }
+
+    DEBUG (("PartitionsByVectorCommand<span>::executeRead:  fillsolid parti num %i  by vector  nb kxmer / nbkmers      %lli / %lli     %f   with %zu nbcores \n",
+        this->_parti_num, sum_nbxmer, this->_pInfo.getNbKmer(this->_parti_num),
+        (double) sum_nbxmer /  this->_pInfo.getNbKmer(this->_parti_num),this->_nbCores
+    ));
+
+    /** HOW TO COUNT KMERS BY SET OF READS ?
+     * Now, we are going to read the temporary partition built during the previous phase and fill
+     * the _radix_kmers attribute. We also need to know in _radix_kmers what is the contribution of
+     * each bank. We therefore need to iterate the current partition by bank (using the information
+     * of _offsets). */
+
+    if (_bankIdMatrix)
+	{
+		throw Exception ("PartitionsByVectorCommand: multi-bank unsupported with new superk storage");
+//		/** We create an iterator over all the items. */
+//		Iterator<Type>* itGlobal = this->_partition.iterator();
+//		LOCAL (itGlobal);
+//		
+//		/** We iterate the banks. */
+//		for (size_t b=0; b<_nbItemsPerBankPerPart.size(); b++)
+//		{
+//			/** We truncate the global iterator.
+//			 * NB : we initialize (ie call 'first') the global iterator only at first call (for b==0). */
+//			Iterator<Type>* itLocal = new TruncateIterator<Type> (*itGlobal, _nbItemsPerBankPerPart[b], b==0 ? true : false);
+//			LOCAL (itLocal);
+//			
+//			/** We iterate this local iterator. */
+//			_dispatcher->iterate (itLocal, SuperKReader<span>  (this->_kmerSize, _r_idx, _radix_kmers, _radix_sizes, _bankIdMatrix, b), 10000); //must be even , reading by pairs
+//		}
+//		
+//		/** We check that the global iterator is finished. */
+//		if (itGlobal->isDone() == false)  { throw Exception ("PartitionsByVectorCommand: iteration should be finished"); }
+		
+	}
+    else
+    {
+        /** We iterate the superkmers. */
+
+			vector<ICommand*> cmds;
+			for (size_t tid=0; tid < this->_nbCores; tid++)
+			{
+				cmds.push_back(new ReadSuperKCommand<span> (
+															this->_superKstorage,
+															this->_parti_num,
+															this->_kmerSize,
+															_r_idx, _radix_kmers, _radix_sizes, 0
+															)
+							   );
+			}
+			
+			_dispatcher->dispatchCommands (cmds, 0);
+
+		
+		
+
+//		printf("-----done ReadSuperKCommand ---\n");
+
+    }
+	
+		this->_superKstorage->closeFile(this->_parti_num);
+
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+class SortCommand : public gatb::core::tools::dp::ICommand, public system::SmartPointer
+{
+public:
+    typedef typename Kmer<span>::Type  Type;
+
+    /** Constructor. */
+    SortCommand (Type** kmervec, bank::BankIdType** bankIdMatrix, int begin, int end, uint64_t* radix_sizes)
+        : _deb(begin), _fin(end), _radix_kmers(kmervec), _bankIdMatrix(bankIdMatrix), _radix_sizes(radix_sizes) {}
+
+    /** */
+    void execute ()
+    {
+        vector<size_t> idx;
+        vector<Tmp>    tmp;
+
+        for (int ii=_deb; ii <=_fin; ii++)
+        {
+            if (_radix_sizes[ii] > 0)
+            {
+                /** Shortcuts. */
+                Type* kmers = _radix_kmers  [ii];
+
+                if (_bankIdMatrix)
+                {
+                    /** NOT OPTIMAL AT ALL... in particular we have to use 'idx' and 'tmp' vectors
+                     * which may use (a lot of ?) memory. */
+
+                    /** Shortcut. */
+                    bank::BankIdType* banksId = _bankIdMatrix [ii];
+
+                    /** NOTE: we sort the indexes, not the items. */
+                    idx.resize (_radix_sizes[ii]);
+                    for (size_t i=0; i<idx.size(); i++)  { idx[i]=i; }
+
+                    std::sort (idx.begin(), idx.end(), Cmp(kmers));
+
+                    /** Now, we have to reorder the two provided vectors with the same order. */
+                    tmp.resize (idx.size());
+                    for (size_t i=0; i<idx.size(); i++)
+                    {
+                        tmp[i].kmer = kmers  [idx[i]];
+                        tmp[i].id   = banksId[idx[i]];
+                    }
+                    for (size_t i=0; i<idx.size(); i++)
+                    {
+                        kmers  [i] = tmp[i].kmer;
+                        banksId[i] = tmp[i].id;
+                    }
+                }
+                else
+                {
+                    std::sort (&kmers[0] , &kmers[ _radix_sizes[ii]]);
+                }
+            }
+        }
+    }
+
+private :
+
+    struct Tmp { Type kmer;  bank::BankIdType id;};
+
+    struct Cmp
+    {
+        Type* _kmers;
+        Cmp (Type* kmers) : _kmers(kmers) {}
+        bool operator() (size_t a, size_t b)  { return _kmers[a] < _kmers[b]; }
+    };
+
+    int        _deb;
+    int        _fin;
+    Type**     _radix_kmers;
+    bank::BankIdType** _bankIdMatrix;
+    uint64_t*  _radix_sizes;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void PartitionsByVectorCommand<span>::executeSort ()
+{
+    TIME_INFO (this->_timeInfo, "2.sort");
+
+    vector<ICommand*> cmds;
+
+    int nwork = 256 / this->_nbCores;
+
+    for (size_t xx=0; xx < (KX+1); xx++)
+    {
+        cmds.clear();
+
+        //fill cmd work vector
+        for (size_t tid=0; tid < this->_nbCores; tid++)
+        {
+            int deb = 0 + tid * nwork;
+            int fin = (tid+1) * nwork -1; // thread will do inclusive range [begin -- end ]
+            if(tid == this->_nbCores-1)  { fin = 255; }
+
+            // mettre dans le  SortCommand le master radix_kmers et range a traiter
+            cmds.push_back (new SortCommand<span> (
+                _radix_kmers+ IX(xx,0),
+                (_bankIdMatrix ? _bankIdMatrix+ IX(xx,0) : 0),
+                deb, fin,
+                _radix_sizes + IX(xx,0)
+            ));
+        }
+
+        _dispatcher->dispatchCommands (cmds, 0);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+class KxmerPointer
+{
+public:
+    typedef typename Kmer<span>::Type  Type;
+
+    //on lui passe le vector dun kxmer //std::vector<vector<Type> >  & kmervec
+    KxmerPointer (
+        Type**      kmervec,
+        int         prefix_size,
+        int         x_size,
+        int         min_radix,
+        int         max_radix,
+        int         kmerSize,
+        uint64_t*   radix_sizes,
+        bank::BankIdType**  bankIdMatrix
+    )
+        : _kxmers(kmervec), _bankIdMatrix(0), _radix_sizes(radix_sizes), _cur_idx(-1),
+          _low_radix(min_radix),_high_radix(max_radix),
+          _prefix_size(prefix_size), _kmerSize(kmerSize),  _x_size(x_size)
+    {
+        _idx_radix = min_radix;
+        Type un; un.setVal( 1);
+        _kmerMask = (un << (_kmerSize*2)) - un;
+
+        _shift_size = ( (4 - _prefix_size) *2) ;
+        _radixMask.setVal(_idx_radix) ;
+        _radixMask = _radixMask << ((_kmerSize-4)*2);
+        _radixMask = _radixMask  << (2*_prefix_size)  ;
+
+        if (bankIdMatrix) { _bankIdMatrix = bankIdMatrix + IX(x_size,0); }
+    }
+
+    /** */
+    inline bool next ()
+    {
+        _cur_idx++;
+
+        // go to next non empty radix
+        while(_idx_radix<= _high_radix && (uint64_t)_cur_idx >=   _radix_sizes[_idx_radix])
+        {
+            _idx_radix++;
+            _cur_idx = 0;
+            //update radix mask does not happen often
+            _radixMask.setVal(_idx_radix) ;
+            _radixMask = _radixMask << ((_kmerSize-4)*2);
+            _radixMask = _radixMask  << (2*_prefix_size)  ;
+        }
+
+        return (_idx_radix <= _high_radix);
+    }
+
+    /** */
+    inline Type    value   () const  {  return ( ((_kxmers[_idx_radix][_cur_idx]) >> _shift_size)  |  _radixMask  ) & _kmerMask ;  }
+
+    /** */
+    inline bank::BankIdType getBankId () const  {  return _bankIdMatrix ? _bankIdMatrix [_idx_radix][_cur_idx] : 0;  }
+
+private :
+
+    Type**      _kxmers;
+    bank::BankIdType**  _bankIdMatrix;
+    uint64_t*   _radix_sizes;
+    int64_t     _cur_idx;
+    Type        _cur_radix;
+    Type        _kmerMask;
+    Type        _radixMask;
+    int         _idx_radix;
+    int         _low_radix;
+    int         _high_radix;
+    int         _shift_size;
+    int         _prefix_size;
+    int         _kmerSize;
+    int         _x_size; //x size of the _kxmersarray
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+template<size_t span>
+void PartitionsByVectorCommand<span>::executeDump ()
+{
+    TIME_INFO (this->_timeInfo, "3.dump");
+
+    int nbkxpointers = 453; //6 for k1 mer, 27 for k2mer, 112 for k3mer  453 for k4mer
+    vector< KxmerPointer<span>*> vec_pointer (nbkxpointers);
+    int best_p;
+
+    std::priority_queue< kxp, std::vector<kxp>,kxpcomp > pq;
+
+    size_t nbBanks = _nbItemsPerBankPerPart.size();
+    if (nbBanks == 0) nbBanks = 1;
+
+    CounterBuilder solidCounter (nbBanks);
+
+    Type previous_kmer ;
+
+    //init the pointers to the 6 arrays
+    int pidx =0;
+
+    ////////////////////////////////////////////////
+    ////-------------k0 pointers-----------/////////
+    ////////////////////////////////////////////////
+
+    vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(0,0) ,0,0,0,255,this->_kmerSize, _radix_sizes + IX(0,0), _bankIdMatrix); // vec, prefix size, kxsize , radix min, radix max ,ksize
+
+    ////////////////////////////////////////////////
+    ////-------------k1 pointers-----------/////////
+    ////////////////////////////////////////////////
+
+    //prefix0
+    vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(1,0) ,0,1,0,255,this->_kmerSize, _radix_sizes + IX(1, 0), _bankIdMatrix);
+    int lowr = 0;
+    int maxr = 63;
+
+    //prefix1
+    for(unsigned int ii=0; ii<4; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(1,0) ,1,1,lowr,maxr,this->_kmerSize, _radix_sizes + IX(1, 0), _bankIdMatrix);
+        lowr += 64;
+        maxr += 64;
+    }
+
+    ////////////////////////////////////////////////
+    ////-------------k2 pointers-----------/////////
+    ////////////////////////////////////////////////
+
+    //prefix0
+    vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),0,2,0,255,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+
+    //prefix1
+    lowr = 0; maxr = 63;
+    for(unsigned int ii=0; ii<4; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),1,2,lowr,maxr,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+        lowr += 64;
+        maxr += 64;
+    }
+
+    //prefix2
+    lowr = 0; maxr = 15;
+    for(unsigned int ii=0; ii<16; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),2,2,lowr,maxr,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+        lowr += 16;
+        maxr += 16;
+    }
+
+    ////////////////////////////////////////////////
+    ////-------------k3 pointers-----------/////////
+    ////////////////////////////////////////////////
+
+    //prefix0
+    vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),0,3,0,255,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+
+    //prefix1
+    lowr = 0; maxr = 63;
+    for(unsigned int ii=0; ii<4; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),1,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+        lowr += 64;
+        maxr += 64;
+    }
+
+    //prefix2
+    lowr = 0; maxr = 15;
+    for(unsigned int ii=0; ii<16; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),2,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+        lowr += 16;
+        maxr += 16;
+    }
+
+    //prefix3
+    lowr = 0; maxr = 3;
+    for(unsigned int ii=0; ii<64; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),3,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+        lowr += 4;
+        maxr += 4;
+    }
+
+    ////////////////////////////////////////////////
+    ////-------------k4 pointers-----------/////////
+    ////////////////////////////////////////////////
+
+    //prefix0
+    vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),0,4,0,255,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+
+    //prefix1
+    lowr = 0; maxr = 63;
+    for(unsigned int ii=0; ii<4; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),1,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+        lowr += 64;
+        maxr += 64;
+    }
+
+    //prefix2
+    lowr = 0; maxr = 15;
+    for(unsigned int ii=0; ii<16; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),2,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+        lowr += 16;
+        maxr += 16;
+    }
+
+    //prefix3
+    lowr = 0; maxr = 3;
+    for(unsigned int ii=0; ii<64; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),3,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+        lowr += 4;
+        maxr += 4;
+    }
+
+    //prefix4
+    lowr = 0; maxr = 0;
+    for(unsigned int ii=0; ii<256; ii++)
+    {
+        vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),4,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+        lowr += 1;
+        maxr += 1;
+    }
+
+    //fill the  priority queue with the first elems
+    for (int ii=0; ii<nbkxpointers; ii++)
+    {
+        if(vec_pointer[ii]->next())  {  pq.push(kxp(ii,vec_pointer[ii]->value()));  }
+    }
+
+    if (pq.size() != 0) // everything empty, no kmer at all
+    {
+        //get first pointer
+        best_p = pq.top().first ; pq.pop();
+
+        previous_kmer = vec_pointer[best_p]->value();
+
+        solidCounter.init (vec_pointer[best_p]->getBankId());
+
+        //merge-scan all 'virtual' arrays and output counts
+        while (1)
+        {
+            //go forward in this array or in new array if reaches end of this one
+            if (! vec_pointer[best_p]->next())
+            {
+                //reaches end of one array
+                if(pq.size() == 0) break; //everything done
+
+                //otherwise get new best
+                best_p = pq.top().first ; pq.pop();
+            }
+
+            if (vec_pointer[best_p]->value() != previous_kmer )
+            {
+                //if diff, changes to new array, get new min pointer
+                pq.push(kxp(best_p,vec_pointer[best_p]->value())); //push new val of this pointer in pq, will be counted later
+
+                best_p = pq.top().first ; pq.pop();
+
+                //if new best is diff, this is the end of this kmer
+                if(vec_pointer[best_p]->value()!=previous_kmer )
+                {
+                    this->insert (previous_kmer, solidCounter);
+
+                    solidCounter.init (vec_pointer[best_p]->getBankId());
+                    previous_kmer = vec_pointer[best_p]->value();
+                }
+                else
+                {
+                    solidCounter.increase (vec_pointer[best_p]->getBankId());
+                }
+            }
+            else
+            {
+                solidCounter.increase (vec_pointer[best_p]->getBankId());
+            }
+        }
+
+        //last elem
+        this->insert (previous_kmer, solidCounter);
+    }
+
+    /** Cleanup. */
+    for (int ii=0; ii<nbkxpointers; ii++)  {  delete vec_pointer[ii];  }
+}
+
+	
+	
+//////////////////Multi bank version of partitionbyvectorcommand //////////////////
+	
+template<size_t span>
+PartitionsByVectorCommand_multibank<span>:: PartitionsByVectorCommand_multibank (
+																				 Iterable<Type>&     partition,
+																				 CountProcessor*     processor,
+																				 size_t              cacheSize,
+																				 IteratorListener*   progress,
+																				 TimeInfo&           timeInfo,
+																				 PartiInfo<5>&       pInfo,
+																				 int                 passi,
+																				 int                 parti,
+																				 size_t              nbCores,
+																				 size_t              kmerSize,
+																				 MemAllocator&       pool,
+																				 vector<size_t>&     offsets
+																				 )
+: PartitionsCommand_multibank<span> (partition, processor, cacheSize,  progress, timeInfo, pInfo, passi, parti,nbCores,kmerSize,pool),
+_radix_kmers (0), _bankIdMatrix(0), _radix_sizes(0), _r_idx(0), _nbItemsPerBankPerPart(offsets)
+{
+	_dispatcher = new Dispatcher (this->_nbCores);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+template<size_t span>
+PartitionsByVectorCommand_multibank<span>:: ~PartitionsByVectorCommand_multibank ()
+{
+	if (_dispatcher)  { delete _dispatcher; }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+template<size_t span>
+void PartitionsByVectorCommand_multibank<span>::execute ()
+{
+	this->_processor->beginPart (this->_pass_num, this->_parti_num, this->_cacheSize, this->getName());
+	
+	/** We check that we got something. */
+
+		if (this->_partition.getNbItems() == 0)  {  return;  }
+	
+	/** We configure tables. */
+	_radix_kmers  = (Type**)     MALLOC (256*(KX+1)*sizeof(Type*)); //make the first dims static ?  5*256
+	_radix_sizes  = (uint64_t*)  MALLOC (256*(KX+1)*sizeof(uint64_t));
+	_r_idx        = (uint64_t*)  CALLOC (256*(KX+1),sizeof(uint64_t));
+	
+	/** We need extra information for kmers counting in case of several input banks. */
+	if (_nbItemsPerBankPerPart.size() > 1) { _bankIdMatrix = (bank::BankIdType**) MALLOC (256*(KX+1)*sizeof(bank::BankIdType*)); }
+	else                                   { _bankIdMatrix = 0; }
+	
+	/** We have 3 phases here: read, sort and dump. */
+	executeRead ();
+	executeSort ();
+	executeDump ();
+	
+	/** We cleanup tables. */
+	FREE (_radix_sizes) ;
+	FREE (_radix_kmers);
+	FREE (_r_idx);
+	if (_bankIdMatrix)  { FREE (_bankIdMatrix); }
+	
+	/** We update the progress bar. */
+	this->_progress->inc (this->_pInfo.getNbKmer(this->_parti_num) );
+	
+	this->_processor->endPart (this->_pass_num, this->_parti_num);
+};
+
+template<size_t span>
+void PartitionsByVectorCommand_multibank<span>::executeRead ()
+{
+	TIME_INFO (this->_timeInfo, "1.read");
+	
+
+	
+	/** Recall that the attribute _offsets has a size equals to the number of banks + 1 as input
+	 * and for each bank, it holds the number of items found for the currently processed partition.
+	 *
+	 *               bank0   bank1   ...   bankI
+	 *   offsets :    xxx     xxx           xxx
+	 *               <------------------------->
+	 *                current partition content
+	 */
+	
+ DEBUG (("_offsets.size=%d  OFFSETS: ", _nbItemsPerBankPerPart.size() ));
+ for (size_t j=0; j<_nbItemsPerBankPerPart.size(); j++)  {  DEBUG (("%6d ", _nbItemsPerBankPerPart[j]));  }  DEBUG (("\n"));
+	
+	uint64_t sum_nbxmer =0;
+	
+	/** We synchronize this statements block because of threads concurrent access. */
+	{
+		LocalSynchronizer synchro (this->_pool.getSynchro());
+		
+		/** We align the pool with a big alignment constraint (see below macos issue with uint128) */
+		this->_pool.align (16);
+		
+		/** FIRST: allocation for the kmers. */
+		for (size_t xx=0; xx< (KX+1); xx++)
+		{
+			for (int ii=0; ii< 256; ii++)
+			{
+				/** Shortcut. */
+				size_t nbKmers = this->_pInfo.getNbKmer(this->_parti_num,ii,xx);
+				
+				//use memory pool here to avoid memory fragmentation
+				_radix_kmers  [IX(xx,ii)] = (Type*)     this->_pool.pool_malloc (nbKmers * sizeof(Type),     "kmers alloc");
+				_radix_sizes  [IX(xx,ii)] = nbKmers;
+				
+				sum_nbxmer +=  nbKmers;
+			}
+		}
+		
+		/** SECOND: allocation for the bank ids if needed.
+		 * => NEED TO BE DONE AFTER THE KMERS BECAUSE OF MEMORY ALIGNMENT CONCERNS.
+		 * On MacOs, we got some crashes with uint128 that were not aligned on 16 bytes
+		 */
+		if (_bankIdMatrix)
+		{
+			
+			for (size_t xx=0; xx< (KX+1); xx++)
+			{
+				for (int ii=0; ii< 256; ii++)
+				{
+					size_t nbKmers = this->_pInfo.getNbKmer(this->_parti_num,ii,xx);
+					_bankIdMatrix [IX(xx,ii)] = (bank::BankIdType*) this->_pool.pool_malloc (nbKmers * sizeof(bank::BankIdType), "bank ids alloc");
+				}
+			}
+		}
+	}
+	
+	DEBUG (("PartitionsByVectorCommand<span>::executeRead:  fillsolid parti num %i  by vector  nb kxmer / nbkmers      %lli / %lli     %f   with %zu nbcores \n",
+			this->_parti_num, sum_nbxmer, this->_pInfo.getNbKmer(this->_parti_num),
+			(double) sum_nbxmer /  this->_pInfo.getNbKmer(this->_parti_num),this->_nbCores
+));
+	
+	/** HOW TO COUNT KMERS BY SET OF READS ?
+	 * Now, we are going to read the temporary partition built during the previous phase and fill
+	 * the _radix_kmers attribute. We also need to know in _radix_kmers what is the contribution of
+	 * each bank. We therefore need to iterate the current partition by bank (using the information
+	 * of _offsets). */
+	
+	if (_bankIdMatrix)
+	{
+		/** We create an iterator over all the items. */
+		Iterator<Type>* itGlobal = this->_partition.iterator();
+		LOCAL (itGlobal);
+		
+		/** We iterate the banks. */
+		for (size_t b=0; b<_nbItemsPerBankPerPart.size(); b++)
+		{
+			/** We truncate the global iterator.
+			 * NB : we initialize (ie call 'first') the global iterator only at first call (for b==0). */
+			Iterator<Type>* itLocal = new TruncateIterator<Type> (*itGlobal, _nbItemsPerBankPerPart[b], b==0 ? true : false);
+			LOCAL (itLocal);
+			
+			/** We iterate this local iterator. */
+			_dispatcher->iterate (itLocal, SuperKReader<span>  (this->_kmerSize, _r_idx, _radix_kmers, _radix_sizes, _bankIdMatrix, b), 10000); //must be even , reading by pairs
+		}
+		
+		/** We check that the global iterator is finished. */
+		if (itGlobal->isDone() == false)  { throw Exception ("PartitionsByVectorCommand: iteration should be finished"); }
+	}
+	else
+	{
+		/** We iterate the superkmers. */
+
+			_dispatcher->iterate (this->_partition.iterator(), SuperKReader<span>  (this->_kmerSize, _r_idx, _radix_kmers, _radix_sizes, 0, 0), 10000); //must be even , reading by pairs
+		
+		
+		
+		//		printf("-----done ReadSuperKCommand ---\n");
+		
+	}
+	
+
+	
+}
+
+template<size_t span>
+void PartitionsByVectorCommand_multibank<span>::executeSort ()
+{
+	TIME_INFO (this->_timeInfo, "2.sort");
+	
+	vector<ICommand*> cmds;
+	
+	int nwork = 256 / this->_nbCores;
+	
+	for (size_t xx=0; xx < (KX+1); xx++)
+	{
+		cmds.clear();
+		
+		//fill cmd work vector
+		for (size_t tid=0; tid < this->_nbCores; tid++)
+		{
+			int deb = 0 + tid * nwork;
+			int fin = (tid+1) * nwork -1; // thread will do inclusive range [begin -- end ]
+			if(tid == this->_nbCores-1)  { fin = 255; }
+			
+			// mettre dans le  SortCommand le master radix_kmers et range a traiter
+			cmds.push_back (new SortCommand<span> (
+			_radix_kmers+ IX(xx,0),
+			(_bankIdMatrix ? _bankIdMatrix+ IX(xx,0) : 0),
+			deb, fin,
+			_radix_sizes + IX(xx,0)
+												   ));
+		}
+		
+		_dispatcher->dispatchCommands (cmds, 0);
+	}
+}
+
+template<size_t span>
+void PartitionsByVectorCommand_multibank<span>::executeDump ()
+{
+	TIME_INFO (this->_timeInfo, "3.dump");
+	
+	int nbkxpointers = 453; //6 for k1 mer, 27 for k2mer, 112 for k3mer  453 for k4mer
+	vector< KxmerPointer<span>*> vec_pointer (nbkxpointers);
+	int best_p;
+	
+	std::priority_queue< kxp, std::vector<kxp>,kxpcomp > pq;
+	
+	size_t nbBanks = _nbItemsPerBankPerPart.size();
+	if (nbBanks == 0) nbBanks = 1;
+	
+	CounterBuilder solidCounter (nbBanks);
+	
+	Type previous_kmer ;
+	
+	//init the pointers to the 6 arrays
+	int pidx =0;
+	
+	////////////////////////////////////////////////
+	////-------------k0 pointers-----------/////////
+	////////////////////////////////////////////////
+	
+	vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(0,0) ,0,0,0,255,this->_kmerSize, _radix_sizes + IX(0,0), _bankIdMatrix); // vec, prefix size, kxsize , radix min, radix max ,ksize
+	
+	////////////////////////////////////////////////
+	////-------------k1 pointers-----------/////////
+	////////////////////////////////////////////////
+	
+	//prefix0
+	vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(1,0) ,0,1,0,255,this->_kmerSize, _radix_sizes + IX(1, 0), _bankIdMatrix);
+	int lowr = 0;
+	int maxr = 63;
+	
+	//prefix1
+	for(unsigned int ii=0; ii<4; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(1,0) ,1,1,lowr,maxr,this->_kmerSize, _radix_sizes + IX(1, 0), _bankIdMatrix);
+		lowr += 64;
+		maxr += 64;
+	}
+	
+	////////////////////////////////////////////////
+	////-------------k2 pointers-----------/////////
+	////////////////////////////////////////////////
+	
+	//prefix0
+	vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),0,2,0,255,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+	
+	//prefix1
+	lowr = 0; maxr = 63;
+	for(unsigned int ii=0; ii<4; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),1,2,lowr,maxr,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+		lowr += 64;
+		maxr += 64;
+	}
+	
+	//prefix2
+	lowr = 0; maxr = 15;
+	for(unsigned int ii=0; ii<16; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(2,0),2,2,lowr,maxr,this->_kmerSize, _radix_sizes + IX(2, 0), _bankIdMatrix);
+		lowr += 16;
+		maxr += 16;
+	}
+	
+	////////////////////////////////////////////////
+	////-------------k3 pointers-----------/////////
+	////////////////////////////////////////////////
+	
+	//prefix0
+	vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),0,3,0,255,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+	
+	//prefix1
+	lowr = 0; maxr = 63;
+	for(unsigned int ii=0; ii<4; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),1,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+		lowr += 64;
+		maxr += 64;
+	}
+	
+	//prefix2
+	lowr = 0; maxr = 15;
+	for(unsigned int ii=0; ii<16; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),2,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+		lowr += 16;
+		maxr += 16;
+	}
+	
+	//prefix3
+	lowr = 0; maxr = 3;
+	for(unsigned int ii=0; ii<64; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(3,0),3,3,lowr,maxr,this->_kmerSize, _radix_sizes + IX(3, 0), _bankIdMatrix);
+		lowr += 4;
+		maxr += 4;
+	}
+	
+	////////////////////////////////////////////////
+	////-------------k4 pointers-----------/////////
+	////////////////////////////////////////////////
+	
+	//prefix0
+	vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),0,4,0,255,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+	
+	//prefix1
+	lowr = 0; maxr = 63;
+	for(unsigned int ii=0; ii<4; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),1,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+		lowr += 64;
+		maxr += 64;
+	}
+	
+	//prefix2
+	lowr = 0; maxr = 15;
+	for(unsigned int ii=0; ii<16; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),2,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+		lowr += 16;
+		maxr += 16;
+	}
+	
+	//prefix3
+	lowr = 0; maxr = 3;
+	for(unsigned int ii=0; ii<64; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),3,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+		lowr += 4;
+		maxr += 4;
+	}
+	
+	//prefix4
+	lowr = 0; maxr = 0;
+	for(unsigned int ii=0; ii<256; ii++)
+	{
+		vec_pointer[pidx++] = new KxmerPointer<span> (_radix_kmers+ IX(4,0),4,4,lowr,maxr,this->_kmerSize, _radix_sizes + IX(4, 0), _bankIdMatrix);
+		lowr += 1;
+		maxr += 1;
+	}
+	
+	//fill the  priority queue with the first elems
+	for (int ii=0; ii<nbkxpointers; ii++)
+	{
+		if(vec_pointer[ii]->next())  {  pq.push(kxp(ii,vec_pointer[ii]->value()));  }
+	}
+	
+	if (pq.size() != 0) // everything empty, no kmer at all
+	{
+		//get first pointer
+		best_p = pq.top().first ; pq.pop();
+		
+		previous_kmer = vec_pointer[best_p]->value();
+		
+		solidCounter.init (vec_pointer[best_p]->getBankId());
+		
+		//merge-scan all 'virtual' arrays and output counts
+		while (1)
+		{
+			//go forward in this array or in new array if reaches end of this one
+			if (! vec_pointer[best_p]->next())
+			{
+				//reaches end of one array
+				if(pq.size() == 0) break; //everything done
+				
+				//otherwise get new best
+				best_p = pq.top().first ; pq.pop();
+			}
+			
+			if (vec_pointer[best_p]->value() != previous_kmer )
+			{
+				//if diff, changes to new array, get new min pointer
+				pq.push(kxp(best_p,vec_pointer[best_p]->value())); //push new val of this pointer in pq, will be counted later
+				
+				best_p = pq.top().first ; pq.pop();
+				
+				//if new best is diff, this is the end of this kmer
+				if(vec_pointer[best_p]->value()!=previous_kmer )
+				{
+					this->insert (previous_kmer, solidCounter);
+					
+					solidCounter.init (vec_pointer[best_p]->getBankId());
+					previous_kmer = vec_pointer[best_p]->value();
+				}
+				else
+				{
+					solidCounter.increase (vec_pointer[best_p]->getBankId());
+				}
+			}
+			else
+			{
+				solidCounter.increase (vec_pointer[best_p]->getBankId());
+			}
+		}
+		
+		//last elem
+		this->insert (previous_kmer, solidCounter);
+	}
+	
+	/** Cleanup. */
+	for (int ii=0; ii<nbkxpointers; ii++)  {  delete vec_pointer[ii];  }
+}
+	
+	
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/PartitionsCommand.hpp b/gatb-core/src/gatb/kmer/impl/PartitionsCommand.hpp
new file mode 100644
index 0000000..c7bc178
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/PartitionsCommand.hpp
@@ -0,0 +1,394 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef _PARTITIONSCOMMAND__HPP_
+#define _PARTITIONSCOMMAND__HPP_
+
+/********************************************************************************/
+
+#include <gatb/bank/api/IBank.hpp>
+
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <gatb/kmer/api/ICountProcessor.hpp>
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/tools/misc/impl/Pool.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+
+#include <queue>
+#include <limits>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Class that counts the number of occurrences of a kmer in several banks.
+ *
+ * This class manages a vector of occurrences for a kmer, each index of the vector
+ * holding the occurrences number for a bank.
+ *
+ * It is used during the process of kmers counting and eases the work for counting
+ * kmers per bank.
+ */
+class CounterBuilder
+{
+public:
+
+    /** Constructor.
+     * \param[in] nbBanks : number of banks parsed during kmer counting.
+     */
+    CounterBuilder (size_t nbBanks=1)  :  _abundancePerBank(nbBanks)  {}
+
+    /** Get the number of banks.
+     * \return the number of banks. */
+    size_t size() const  { return _abundancePerBank.size(); }
+
+    /** Initialization of the counting for the current kmer. This method should be called
+     * when a kmer is seen for the first time.
+     * \param[in] idxBank : bank index where the new current kmer has been found. */
+    void init (size_t idxBank=0)
+    {
+        for (size_t k=0; k<_abundancePerBank.size(); k++)  { _abundancePerBank[k]=0; }
+        _abundancePerBank [idxBank]= 1;
+    }
+
+    /** Increase the abundance of the current kmer for the provided bank index.
+     * \param[in] idxBank : index of the bank */
+    void increase (size_t idxBank=0)  {  _abundancePerBank [idxBank] ++;  }
+
+    /** Set the abundance of the current kmer for the provided bank index.
+     * \param[in] idxBank : index of the bank */
+    void set (CountNumber val, size_t idxBank=0)  {  _abundancePerBank [idxBank] = val;  }
+
+    /** Get the abundance of the current kmer for the provided bank index.
+     * \param[in] idxBank : index of the bank
+     * \return the abundance of the current kmer for the given bank. */
+    CountNumber operator[] (size_t idxBank) const  { return _abundancePerBank[idxBank]; }
+
+    /** */
+    const CountVector& get () const { return _abundancePerBank; }
+
+private:
+    CountVector _abundancePerBank;
+};
+
+	
+	                // not really nice, but right now two implems co-exists, old one with multi-bank support, new one with more efficient disk usage
+	
+	//not really nice but temporary solution :
+	// -- one implem with the new efficient superkmer storage
+	// -- another implem with the old storage (2 kmer per superKmer) that supports multi-bank counting
+	//todo : multi bank kmer counting with new storage or do multi-bank couting externally (merge results like in simka)
+	
+/********************************************************************************/
+template<size_t span>
+class PartitionsCommand : public gatb::core::tools::dp::ICommand, public system::SmartPointer
+{
+public:
+
+    /** Shortcut. */
+    typedef typename Kmer<span>::Type           Type;
+    typedef typename Kmer<span>::Count          Count;
+    typedef ICountProcessor<span> CountProcessor;
+
+    /** Constructor. */
+    PartitionsCommand (
+      //  gatb::core::tools::collections::Iterable<Type>& partition,
+        CountProcessor*                                 processor,
+        size_t                                          cacheSize,
+        gatb::core::tools::dp::IteratorListener*        progress,
+        tools::misc::impl::TimeInfo&                    timeInfo,
+        PartiInfo<5>&                                   pInfo,
+        int                                             passi,
+		int                                             parti,
+		size_t                                          nbCores,
+		size_t                                          kmerSize,
+		gatb::core::tools::misc::impl::MemAllocator&    pool,
+		tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+    );
+
+    /** Destructor. */
+    ~PartitionsCommand();
+
+    /** Get the class name (for statistics). */
+    virtual const char* getName() const = 0;
+
+protected:
+ //   gatb::core::tools::collections::Iterable<Type>&         _partition;
+    gatb::core::tools::dp::IteratorListener*                _progress;
+	PartiInfo<5>&                                           _pInfo;
+    int                                                     _pass_num;
+	int                                                     _parti_num;
+    size_t                                                  _nbCores;
+	size_t                                                  _kmerSize;
+    size_t                                                  _cacheSize;
+	gatb::core::tools::misc::impl::MemAllocator&            _pool;
+	
+    void insert (const Type& kmer, const CounterBuilder& count);
+
+    tools::misc::impl::TimeInfo& _globalTimeInfo;
+    tools::misc::impl::TimeInfo  _timeInfo;
+
+    CountProcessor* _processor;
+    void setProcessor (CountProcessor* processor)  { SP_SETATTR(processor); }
+	
+	tools::storage::impl::SuperKmerBinFiles* 				_superKstorage;
+
+};
+
+/********************************************************************************/
+/** */
+template<size_t span>
+class PartitionsByHashCommand : public PartitionsCommand<span>
+{
+public:
+
+    /** Shortcut. */ /* R: don't know how to avoid this code duplication => R1: I'm afraid it's not possible. */
+    typedef typename Kmer<span>::Type           Type;
+    typedef typename Kmer<span>::Count          Count;
+    typedef ICountProcessor<span> CountProcessor;
+
+    /** Constructor. */
+    PartitionsByHashCommand (
+    //    gatb::core::tools::collections::Iterable<Type>& partition,
+        CountProcessor*                                 processor,
+        size_t                                          cacheSize,
+        gatb::core::tools::dp::IteratorListener*        progress,
+        tools::misc::impl::TimeInfo&                    timeInfo,
+        PartiInfo<5>&                                   pInfo,
+        int                                             passi,
+        int                                             parti,
+        size_t                                          nbCores,
+        size_t                                          kmerSize,
+        gatb::core::tools::misc::impl::MemAllocator&    pool,
+        u_int64_t                                       hashMemory,
+		tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+    );
+
+    /** Get the class name (for statistics). */
+    const char* getName() const { return "hash"; }
+
+    /** */
+    void execute ();
+
+private:
+    u_int64_t _hashMemory;
+};
+		
+/********************************************************************************/
+/** */
+	
+	
+	
+	
+	
+
+template<size_t span>
+class PartitionsByVectorCommand : public PartitionsCommand<span>
+{
+public:
+	
+	/** Shortcut. */ /* R: don't know how to avoid this code duplication */
+	typedef typename Kmer<span>::Type           Type;
+	typedef typename Kmer<span>::Count          Count;
+	typedef ICountProcessor<span> CountProcessor;
+	
+	static const size_t KX = 4 ;
+	
+private:
+	//used for the priority queue
+	typedef std::pair<int, Type> kxp; //id pointer in vec_pointer , value
+	struct kxpcomp { bool operator() (kxp l,kxp r) { return ((r.second) < (l.second)); } } ;
+	
+public:
+	/** Constructor. */
+	PartitionsByVectorCommand (
+							//   gatb::core::tools::collections::Iterable<Type>& partition,
+							   CountProcessor*                                 processor,
+							   size_t                                          cacheSize,
+							   gatb::core::tools::dp::IteratorListener*        progress,
+							   tools::misc::impl::TimeInfo&                    timeInfo,
+							   PartiInfo<5>&                                   pInfo,
+							   int                                             passi,
+							   int                                             parti,
+							   size_t                                          nbCores,
+							   size_t                                          kmerSize,
+							   gatb::core::tools::misc::impl::MemAllocator&    pool,
+							   std::vector<size_t>&                            offsets,
+							   tools::storage::impl::SuperKmerBinFiles* 		superKstorage
+							   
+							   );
+	
+	/** Destructor. */
+	~PartitionsByVectorCommand ();
+	
+	/** Get the class name (for statistics). */
+	const char* getName() const { return "vector"; }
+	
+	/** */
+	void execute ();
+	
+private:
+	
+	Type**     	       _radix_kmers;
+	bank::BankIdType** _bankIdMatrix;
+	uint64_t*          _radix_sizes;
+	uint64_t*          _r_idx;
+	
+	tools::dp::IDispatcher* _dispatcher;
+	
+	void executeRead   ();
+	void executeSort   ();
+	void executeDump   ();
+	
+	std::vector<size_t> _nbItemsPerBankPerPart;
+};
+
+
+	
+////// ugly duplicated code below  to keep support for multi-bank counting
+// it is a temporary solution
+// todo : support multi-bank with either
+// -- multi-bank support within the new efficient superkmer storage
+// -- "external" multi-bank support through result merging (a la simka)
+
+
+template<size_t span>
+class PartitionsCommand_multibank : public gatb::core::tools::dp::ICommand, public system::SmartPointer
+{
+public:
+	
+	/** Shortcut. */
+	typedef typename Kmer<span>::Type           Type;
+	typedef typename Kmer<span>::Count          Count;
+	typedef ICountProcessor<span> CountProcessor;
+	
+	/** Constructor. */
+	PartitionsCommand_multibank (
+								 gatb::core::tools::collections::Iterable<Type>& partition,
+								 CountProcessor*                                 processor,
+								 size_t                                          cacheSize,
+								 gatb::core::tools::dp::IteratorListener*        progress,
+								 tools::misc::impl::TimeInfo&                    timeInfo,
+								 PartiInfo<5>&                                   pInfo,
+								 int                                             passi,
+								 int                                             parti,
+								 size_t                                          nbCores,
+								 size_t                                          kmerSize,
+								 gatb::core::tools::misc::impl::MemAllocator&    pool
+								 );
+	
+	/** Destructor. */
+	~PartitionsCommand_multibank();
+	
+	/** Get the class name (for statistics). */
+	virtual const char* getName() const = 0;
+	
+protected:
+	gatb::core::tools::collections::Iterable<Type>&         _partition;
+	gatb::core::tools::dp::IteratorListener*                _progress;
+	PartiInfo<5>&                                           _pInfo;
+	int                                                     _pass_num;
+	int                                                     _parti_num;
+	size_t                                                  _nbCores;
+	size_t                                                  _kmerSize;
+	size_t                                                  _cacheSize;
+	gatb::core::tools::misc::impl::MemAllocator&            _pool;
+	
+	void insert (const Type& kmer, const CounterBuilder& count);
+	
+	tools::misc::impl::TimeInfo& _globalTimeInfo;
+	tools::misc::impl::TimeInfo  _timeInfo;
+	
+	CountProcessor* _processor;
+	void setProcessor (CountProcessor* processor)  { SP_SETATTR(processor); }
+};
+
+
+template<size_t span>
+class PartitionsByVectorCommand_multibank : public PartitionsCommand_multibank<span>
+{
+public:
+	
+	/** Shortcut. */ /* R: don't know how to avoid this code duplication */
+	typedef typename Kmer<span>::Type           Type;
+	typedef typename Kmer<span>::Count          Count;
+	typedef ICountProcessor<span> CountProcessor;
+	
+	static const size_t KX = 4 ;
+	
+private:
+	//used for the priority queue
+	typedef std::pair<int, Type> kxp; //id pointer in vec_pointer , value
+	struct kxpcomp { bool operator() (kxp l,kxp r) { return ((r.second) < (l.second)); } } ;
+	
+public:
+	/** Constructor. */
+	PartitionsByVectorCommand_multibank (
+										 gatb::core::tools::collections::Iterable<Type>& partition,
+										 CountProcessor*                                 processor,
+										 size_t                                          cacheSize,
+										 gatb::core::tools::dp::IteratorListener*        progress,
+										 tools::misc::impl::TimeInfo&                    timeInfo,
+										 PartiInfo<5>&                                   pInfo,
+										 int                                             passi,
+										 int                                             parti,
+										 size_t                                          nbCores,
+										 size_t                                          kmerSize,
+										 gatb::core::tools::misc::impl::MemAllocator&    pool,
+										 std::vector<size_t>&                            offsets
+										 );
+	
+	/** Destructor. */
+	~PartitionsByVectorCommand_multibank ();
+	
+	/** Get the class name (for statistics). */
+	const char* getName() const { return "vector"; }
+	
+	/** */
+	void execute ();
+	
+private:
+	
+	Type**     	       _radix_kmers;
+	bank::BankIdType** _bankIdMatrix;
+	uint64_t*          _radix_sizes;
+	uint64_t*          _r_idx;
+	
+	tools::dp::IDispatcher* _dispatcher;
+	
+	void executeRead   ();
+	void executeSort   ();
+	void executeDump   ();
+	
+	std::vector<size_t> _nbItemsPerBankPerPart;
+};
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif
diff --git a/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.cpp
new file mode 100644
index 0000000..631bb70
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.cpp
@@ -0,0 +1,547 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/kmer/impl/RepartitionAlgorithm.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BloomBuilder.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+#include <gatb/kmer/impl/Sequence2SuperKmer.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+#include <iostream>
+#include <map>
+#include <math.h>
+
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/tools/math/NativeInt8.hpp>
+
+#include <gatb/debruijn/impl/ContainerNode.hpp>
+
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+// We use the required packages
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+static const char* progressFormat0 = "DSK: Collecting stats on %s ";
+
+
+/********************************************************************************/
+
+template<size_t span>
+class MmersFrequency
+{
+public:
+    /** Shortcut. */
+    typedef typename RepartitorAlgorithm<span>::ModelCanonical ModelCanonical;
+    typedef typename ModelCanonical::Kmer                       KmerTypeCanonical;
+    typedef typename RepartitorAlgorithm<span>::ModelDirect    ModelDirect;
+    typedef typename ModelDirect::Kmer                       KmerTypeDirect;
+
+    void operator() (Sequence& sequence)
+    {
+        /** We first check whether we got mmers from the sequence or not. */
+        if (_minimodel.build (sequence.getData(), _mmers) == false)  { return; }
+
+        /** We loop over the mmers of the sequence. */
+        for (size_t i=0; i<_mmers.size(); i++)
+        {
+            if (_mmers[i].isValid() == false)
+                continue;
+
+            /** increment m-mer count */
+            _m_mer_counts[_mmers[i].value().getVal()] ++;
+        }
+
+        if (_nbProcessedMmers > 500000)   {  _progress.inc (_nbProcessedMmers);  _nbProcessedMmers = 0;  }
+
+        // see if we need to stop. 
+        // mimics SampleRepart below. but actually, as TruncatedIterator would have worked too, since all seqs are at least larger than a mmer. oh well. using CancellableIterator anyway.
+        _nbSeqsSeenSoFar ++;
+        if (_nbSeqsSeenSoFar > _nbSeqsToSee)
+        {
+            *_cancelIterator = true;
+        }
+
+    }
+
+    /** Constructor. */
+    MmersFrequency (int mmerSize,  IteratorListener* progress,  uint32_t* m_mer_counts, size_t nbSeqsToSee /* for when to stop estimation*/, bool* cancelIterator)
+    :
+        _minimodel(mmerSize), _progress (progress,System::thread().newSynchronizer()),
+      _m_mer_counts(m_mer_counts),  _nbProcessedMmers(0), _nbSeqsToSee(nbSeqsToSee), _nbSeqsSeenSoFar(0), _cancelIterator(cancelIterator)
+    {
+        u_int64_t nbminim = (uint64_t)pow(4.0,mmerSize);
+
+        for (u_int64_t i = 0; i < nbminim; i++)  {   _m_mer_counts[i] = 0;  }
+    }
+
+protected:
+
+    ModelCanonical           _minimodel;
+    //ModelDirect                _minimodel;
+    vector<KmerTypeCanonical>  _mmers;
+    //vector<KmerTypeDirect>  _mmers;
+    ProgressSynchro         _progress;
+    uint32_t*               _m_mer_counts;
+    size_t                  _nbProcessedMmers;
+    size_t        _nbSeqsToSee;
+    size_t        _nbSeqsSeenSoFar;
+    bool *            _cancelIterator;
+};
+
+/********************************************************************************/
+/* This functor class takes a Sequence as input, splits it into super kmers and
+ * get information about the distribution of minimizers.
+ */
+template<size_t span>
+class SampleRepart  : public Sequence2SuperKmer<span>
+{
+    //ie ce sera posible d avoir plus dinfo , estim ram max par exemple ?
+public:
+
+    /** Shortcut. */
+    typedef typename Sequence2SuperKmer<span>::Type             Type;
+    typedef typename Sequence2SuperKmer<span>::Model            Model;
+    typedef typename Model::Kmer                           KmerType;
+    typedef typename Kmer<span>::SuperKmer                 SuperKmer;
+
+    /** */
+    void processSuperkmer (SuperKmer& superKmer)
+    {
+        DEBUG (("SampleRepart: should count superk %i \n", superKmer.size()));
+
+        if ((superKmer.minimizer % this->_nbPass) == this->_pass && superKmer.isValid() ) //check if falls into pass
+        {
+            bool prev_which = superKmer[0].which();
+            size_t kx_size = 0;
+
+            /** Shortcut. */
+            size_t superKmerLen = superKmer.size();
+
+            /** We increase superkmer counter the current minimizer. */
+            _local_pInfo.incSuperKmer_per_minimBin (superKmer.minimizer, superKmerLen);
+
+            /** We loop over the kmer of the superkmer (except the first one).
+             *  We update the pInfo each time we find a kxmer in the superkmer. */
+            for (size_t ii=1 ; ii < superKmerLen; ii++)
+            {
+                /** A kxmer is defined by having successive canonical kmers. Here, we just care that
+                 * successive kmer values are on the same strand. */
+                if (superKmer[ii].which() != prev_which || kx_size >= _kx) // kxmer_size = 1 //cost should diminish with larger kxmer
+                {
+                    /** We increase the number of kxmer found for the current minimizer. */
+                    _local_pInfo.incKxmer_per_minimBin (superKmer.minimizer);
+                    kx_size = 0;
+                }
+                else
+                {
+                    kx_size++;
+                }
+
+                prev_which = superKmer[ii].which() ;
+            }
+
+            /** We add the pending kxmer to the bin. */
+            _local_pInfo.incKxmer_per_minimBin (superKmer.minimizer);
+        
+            // see if we need to stop
+            _nbSuperKmersSeenSoFar ++;
+            if (_nbSuperKmersSeenSoFar > _nbSeqsToSee) // it's a bit of an approximation here (comparing # of superkmers to # of seqs)
+            {
+                //cout << _nbSuperKmersSeenSoFar << "  " <<  _nbSeqsToSee << endl;
+                *_cancelIterator = true;
+            }
+        }
+    }
+
+    /** Constructor. */
+    SampleRepart (
+        Model&            model,
+        Configuration&    config,
+        size_t            nbPasses,
+        size_t            currentPass,
+        size_t            nbPartitions,
+        IteratorListener* progress,
+        bool *            cancelIterator,
+        size_t            nbSeqsToSee,
+        BankStats&        bankStats,
+        PartiInfo<5>&     pInfo
+    )
+    :   Sequence2SuperKmer<span> (model, nbPasses, currentPass, nbPartitions, progress, bankStats)
+        ,_kx(4), _extern_pInfo(pInfo), _local_pInfo(config._nb_partitions, model.getMmersModel().getKmerSize()),
+        _cancelIterator(cancelIterator), _nbSeqsToSee(nbSeqsToSee), _nbSuperKmersSeenSoFar(0)
+    {
+    }
+
+    /** Destructor. */
+    ~SampleRepart ()
+    {
+        //add to global parti_info
+        _extern_pInfo += _local_pInfo;
+    }
+
+
+private:
+    size_t        _kx;
+    PartiInfo<5>& _extern_pInfo;
+    PartiInfo<5>  _local_pInfo;
+    bool*         _cancelIterator;
+    size_t        _nbSeqsToSee;
+    size_t        _nbSuperKmersSeenSoFar;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+RepartitorAlgorithm<span>::RepartitorAlgorithm (
+    IBank* bank,
+    Group& group,
+    const Configuration& config,
+    unsigned int nb_cores,
+    tools::misc::IProperties*   options
+)
+    :  Algorithm("repartition", nb_cores, options), _config(config), _bank(bank), _group(group), _freq_order(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+RepartitorAlgorithm<span>::~RepartitorAlgorithm ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void RepartitorAlgorithm<span>::execute ()
+{
+    /** We compute the distribution of the minimizers. As a result, we will have a hash function
+     * that gives a hash code for a minimizer value.
+     * IMPORTANT ! we have to give the passes number because it has impact on the computation. */
+    Repartitor repartitor (_config._nb_partitions, _config._minim_size, _config._nb_passes);
+
+    /* now is a good time to switch to frequency-based minimizers if required:
+      because right after we'll start using minimizers to compute the distribution
+      of superkmers in bins */
+    if (_config._minimizerType == 1)  {  computeFrequencies (repartitor);  }
+
+    computeRepartition (repartitor);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void RepartitorAlgorithm<span>::computeFrequencies (Repartitor& repartitor)
+{
+    DEBUG (("RepartitorAlgorithm<span>::computeFrequencies\n"));
+
+    u_int64_t estimateSeqNb;
+    u_int64_t estimateSeqTotalSize;
+    u_int64_t estimateSeqMaxSize;
+
+    _bank->estimate (estimateSeqNb, estimateSeqTotalSize, estimateSeqMaxSize);
+
+    u_int64_t nbseq_sample = std::min ( u_int64_t (estimateSeqNb * 0.05) ,u_int64_t( 50000000ULL) ) ;
+    // TODO would be better to just stop estimating minimizer frequency when it becomes stable. not after a fixed number of reads
+
+    u_int64_t rg = ((u_int64_t)1 << (2*_config._minim_size));
+    //cout << "\nAllocating " << ((rg*sizeof(uint32_t))/1024) << " KB for " << _minim_size <<"-mers frequency counting (" << rg << " elements total)" << endl;
+    uint32_t *m_mer_counts = new uint32_t[rg];
+
+    Model model (_config._kmerSize, _config._minim_size);
+
+    Iterator<Sequence>* bank_it = _bank->iterator();
+    LOCAL(bank_it);
+    CancellableIterator<Sequence>* cancellable_it = new CancellableIterator<Sequence> (*bank_it);
+    LOCAL(cancellable_it);
+
+    /** We create a sequence iterator and give it a progress message */
+    Iterator<Sequence>* it_all_reads = createIterator<Sequence> (
+            cancellable_it,
+            _bank->getNbItems(),
+             "Approximating frequencies of minimizers"
+            );
+    LOCAL (it_all_reads);
+
+    /** We compute an estimation of minimizers frequencies from a part of the bank. */
+    
+    SerialDispatcher serialDispatcher;
+    serialDispatcher.iterate (it_all_reads,  MmersFrequency<span> (
+        _config._minim_size, 0 /*_progress*/, m_mer_counts, 
+        nbseq_sample,
+        &(cancellable_it->_cancel))// will be set to true when iteration needs to be stopped
+    );
+
+    // single threaded, for debugging
+    /*MmersFrequency<span> mmersfrequency(model, _progress, bstatsDummy, m_mer_counts);
+    it_sample->iterate(mmersfrequency);*/
+
+    /* sort frequencies */
+    for (u_int64_t i(0); i < rg; i++)
+    {
+        if (m_mer_counts[i] > 0)
+            _counts.push_back(make_pair(m_mer_counts[i],i));
+    }
+    delete[] m_mer_counts;
+
+    sort (_counts.begin(), _counts.end());
+
+    /* assign frequency to minimizers */
+    _freq_order = new uint32_t[rg];
+
+    for (u_int64_t i = 0; i < rg ; i++)
+        _freq_order[i] = rg; // set everything not seen to highest value (not a minimizer)
+
+    for (unsigned int i = 0; i < _counts.size(); i++)
+    {
+        _freq_order[_counts[i].second] = i;
+    }
+
+    // small but necessary trick: the largest minimizer has to have largest rank, as it's used as the default "largest" value
+    _freq_order[rg-1] = rg-1;
+
+    repartitor.setMinimizerFrequencies (_freq_order);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void RepartitorAlgorithm<span>::computeRepartition (Repartitor& repartitor)
+{
+    DEBUG (("RepartitorAlgorithm<span>::computeRepartition\n"));
+
+    /** We create a kmer model; using the frequency order if we're in that mode */
+    Model model (_config._kmerSize, _config._minim_size, typename Kmer<span>::ComparatorMinimizerFrequencyOrLex(), _freq_order);
+
+    int mmsize = model.getMmersModel().getKmerSize();
+
+    PartiInfo<5> sample_info (_config._nb_partitions, mmsize);
+
+    string bankShortName = System::file().getBaseName(_bank->getId());
+
+    // In case of multi bank counting, we get a sample from each bank
+    if(_bank->getCompositionNb() > 1){
+
+    	//cout << _bank->getCompositionNb() << endl;
+    	SerialDispatcher serialDispatcher;
+        BankStats bstatsDummy;
+
+        u_int64_t nbseq_sample = (_config._estimateSeqNb / _config._nb_banks) * 0.01;
+        nbseq_sample = max((u_int64_t)nbseq_sample, (u_int64_t)100000);
+
+        Iterator<Sequence>* it = _bank->iterator(); LOCAL (it);
+        std::vector<Iterator<Sequence>*> itBanks =  it->getComposition(); 
+
+        /*
+        bool dummyBoolean = false;
+        SampleRepart<span> sampleRepart (
+            	        model,
+            	        _config,
+            	        1, // we don't care about the actual number of passes, we just use 1
+            	        0, // we don't care about the actual number of passes, the current one is 0
+            	        _config._nb_partitions,
+            	        NULL,
+            	        &dummyBoolean, // will be set to true when iteration needs to be stopped
+            	        nbseq_sample, // how many sequences we need to see
+            	        bstatsDummy,
+            	        sample_info
+            	    );*/
+
+		//SerialDispatcher serialDispatcher;
+		//BankStats bstatsDummy;
+
+        for(size_t i=0; i<_config._nb_banks; i++){
+        	//cout << i << endl;
+        	//u_int64_t nbseq_sample_ = min(nbseq_sample, u_int64_t (500000));
+        	//TruncateIterator<Sequence>* it = new TruncateIterator<Sequence> (*(itBanks[i]), nbseq_sample_);
+        	//LOCAL(it);
+    	    //serialDispatcher.iterate (it, sampleRepart);
+        	//Iterator<Sequence>* bankit = itBanks[i];
+        	//LOCAL(bankit);
+            CancellableIterator<Sequence>* cancellable_it = new CancellableIterator<Sequence> (*itBanks[i]);
+            LOCAL(cancellable_it);
+
+        	//cout << nbseq_sample << endl;
+    		/** We create a sequence iterator and give it a progress message */
+    		//Iterator<Sequence>* it_all_reads = createIterator<Sequence> (
+            //		cancellable_it,
+            //		_bank->getNbItems(),
+            //		Stringify::format (progressFormat0, bankShortName.c_str()).c_str()
+            //		);
+            //LOCAL (it_all_reads);
+
+
+
+    		/** We compute a distribution of Superkmers from a part of the bank. */
+    		serialDispatcher.iterate (cancellable_it, SampleRepart<span> (
+    			model,
+    			_config,
+    			1, // we don't care about the actual number of passes, we just use 1
+    			0, // we don't care about the actual number of passes, the current one is 0
+    			_config._nb_partitions,
+    			NULL,
+    			&(cancellable_it->_cancel), // will be set to true when iteration needs to be stopped
+    			nbseq_sample, // how many sequences we need to see
+    			bstatsDummy,
+    			sample_info
+    		));
+
+    		//cout << "end" << endl;
+    		//it_all_reads->finalize() ;
+    		//cancellable_it->finalize() ;
+    		itBanks[i]->finalize();
+    		//delete cancellable_it;
+        }
+    }
+    else{
+
+        Iterator<Sequence>* it = _bank->iterator();      LOCAL (it);
+        CancellableIterator<Sequence>* cancellable_it = new CancellableIterator<Sequence> (*(it));
+        LOCAL(cancellable_it);
+
+
+		// how many seqs we need to see
+		u_int64_t nbseq_sample = std::max ( u_int64_t (_config._estimateSeqNb * 0.05) ,u_int64_t( 1000000ULL) ) ;
+
+    	//cout << nbseq_sample << endl;
+		/** We create a sequence iterator and give it a progress message */
+		Iterator<Sequence>* it_all_reads = createIterator<Sequence> (
+				cancellable_it,
+				_bank->getNbItems(),
+				Stringify::format (progressFormat0, bankShortName.c_str()).c_str()
+				);
+		LOCAL (it_all_reads);
+
+
+		BankStats bstatsDummy;
+
+		/** We compute a distribution of Superkmers from a part of the bank. */
+		SerialDispatcher serialDispatcher;
+		serialDispatcher.iterate (it_all_reads, SampleRepart<span> (
+			model,
+			_config,
+			1, // we don't care about the actual number of passes, we just use 1
+			0, // we don't care about the actual number of passes, the current one is 0
+			_config._nb_partitions,
+			NULL,
+			&(cancellable_it->_cancel), // will be set to true when iteration needs to be stopped
+			nbseq_sample, // how many sequences we need to see
+			bstatsDummy,
+			sample_info
+		));
+    }
+
+    if (_config._minimizerType == 1)
+    {
+        repartitor.justGroup (sample_info, _counts);
+    }
+    else
+    {
+        repartitor.computeDistrib (sample_info);
+        if (_config._repartitionType == 1)
+        {
+            repartitor.justGroupLexi (sample_info); // For bcalm, i need the minimizers to remain in order. so using this suboptimal but okay repartition
+        }
+    }
+
+    /** We save the distribution (may be useful for debloom for instance). */
+    repartitor.save (getGroup());
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.hpp
new file mode 100644
index 0000000..d00693c
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/RepartitionAlgorithm.hpp
@@ -0,0 +1,96 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file RepartitionAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Repartition algorithm, ie. compute statistics on kmers
+ */
+
+#ifndef _REPARTITOR_ALGORITHM_HPP_
+#define _REPARTITOR_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace kmer      {
+namespace impl      {
+/********************************************************************************/
+
+template<size_t span=KMER_DEFAULT_SPAN>
+class RepartitorAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+    typedef typename kmer::impl::Kmer<span>::ModelDirect                                ModelDirect;
+    typedef typename kmer::impl::Kmer<span>::ModelCanonical                             ModelCanonical;
+#ifdef NONCANONICAL
+    typedef typename kmer::impl::Kmer<span>::template ModelMinimizer <ModelDirect>   Model;
+#else
+    typedef typename kmer::impl::Kmer<span>::template ModelMinimizer <ModelCanonical>   Model;
+#endif
+
+    /** */
+    RepartitorAlgorithm (
+        gatb::core::bank::IBank*        bank,
+        tools::storage::impl::Group&    group,
+        const Configuration&            config,
+        unsigned int                    nb_cores = 0,
+        tools::misc::IProperties*   options    = 0
+    );
+
+    /** */
+    ~RepartitorAlgorithm ();
+
+    /** */
+    void execute ();
+
+private:
+
+    void computeFrequencies (Repartitor& repartitor);
+    void computeRepartition (Repartitor& repartitor);
+
+    Configuration _config;
+
+    gatb::core::bank::IBank*      _bank;
+    tools::storage::impl::Group&  _group;
+
+    uint32_t* _freq_order;
+
+    tools::storage::impl::Group& getGroup() { return  _group; }
+
+    std::vector<std::pair<int, int> > _counts;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _REPARTITOR_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/Sequence2SuperKmer.hpp b/gatb-core/src/gatb/kmer/impl/Sequence2SuperKmer.hpp
new file mode 100644
index 0000000..0311876
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/Sequence2SuperKmer.hpp
@@ -0,0 +1,209 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Sequence2SuperKmer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief
+ */
+
+#ifndef _SEQUENCE_2_SUPERKMER_HPP_
+#define _SEQUENCE_2_SUPERKMER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace kmer      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/* This functor class takes a Sequence as input and split it into super kmers.
+ * Each time a new superkmer is found, the 'processSuperkmer' method is called.
+ *
+ * NOTE : 'processSuperkmer' is pure virtual and so Sequence2SuperKmer class has to be
+ * inherited for providing actual implementation of 'processSuperkmer'.
+ *
+ * NOTE : 'processSuperkmer' is virtual and called many times, which implies a
+ * time overhead. Preliminary tests seem to show that this overhead is acceptable;
+ * otherwise a template based approach could be used instead (ie Sequence2SuperKmer is
+ * templated by a functor that does the job done in 'processSuperkmer').
+ */
+template<size_t span>
+class Sequence2SuperKmer
+{
+public:
+    /** Shortcut. */
+    typedef typename Kmer<span>::Type                                       Type;
+    typedef typename Kmer<span>::ModelDirect                                ModelDirect;
+    typedef typename Kmer<span>::ModelCanonical                             ModelCanonical;
+#ifdef NONCANONICAL
+    typedef typename Kmer<span>::template ModelMinimizer <ModelDirect>   Model;
+#else
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   Model;
+#endif
+    typedef typename Model::Kmer                                            KmerType;
+    typedef typename Kmer<span>::Count                                      Count;
+    typedef typename Kmer<span>::SuperKmer                                  SuperKmer;
+
+    static const u_int64_t DEFAULT_MINIMIZER = 1000000000 ;
+
+
+	template<typename KType>
+	struct KmerFunctor
+	{
+		
+		Sequence2SuperKmer * caller;
+		SuperKmer& superKmer;
+		int maxs;
+		KmerFunctor (Sequence2SuperKmer * Seq2SupCaller,SuperKmer& superKmer,int maxs) :
+		caller(Seq2SupCaller),superKmer(superKmer), maxs(maxs) {}
+		
+		void operator() (const KType& kmer, size_t idx)  {
+			
+			//kmer.toString(_kmerSize)
+		 if (kmer.isValid() == false)
+		 {
+			// printf("non valid kmer %s \n", kmer.value().toString(31).c_str());
+			 //caller->_model.toString(kmer)
+			 // on invalid kmer : output previous superk utput prev
+			 caller->processSuperkmer (superKmer);
+			 superKmer.reset();
+			 
+			 superKmer.minimizer = DEFAULT_MINIMIZER;  //marking will have to restart 'from new'
+			 
+			 caller->_bankStatsLocal.kmersNbInvalid ++;
+			 
+			 return;
+		 }
+			
+			caller->_bankStatsLocal.kmersNbValid ++;
+			
+			/** We get the value of the current minimizer. */
+			u_int64_t h = kmer.minimizer().value().getVal();
+			
+			if(DEFAULT_MINIMIZER == h)
+			{
+				printf("__ non valid kmer %s \n", kmer.value().toString(31).c_str());
+
+			}
+			
+			/** We have to set minimizer value if not defined. */
+			if (superKmer.isValid() == false)  {  superKmer.minimizer = h;  }
+			
+			/** If the current super kmer is finished (or max size reached), we dump it. */
+			if (h != superKmer.minimizer || superKmer.size() >= (size_t)maxs)
+			{
+				caller->processSuperkmer (superKmer);
+				superKmer.reset();
+			}
+			
+			/** We update the superkmer properties (minimizer value and kmers range). */
+			superKmer.minimizer    = h;
+			superKmer.addKmer(kmer);
+			
+		}
+	};
+	
+	
+	
+    void operator() (bank::Sequence& sequence)
+    {
+        /** We update statistics about the bank. */
+        _bankStatsLocal.update (sequence);
+
+        /** We first check whether we got kmers from the sequence or not. */
+		int32_t nbKmers = sequence.getData().size() - _model.getKmerSize() + 1;
+		if (nbKmers <= 0)  { return ; }
+		
+		int maxs = std::min((int)((Type::getSize() - 8 )/2),255) ;  // 8 is because  8 bit used for size of superkmers, not mini size and 255 : max superk size on 8 bits
+
+        /** We create a superkmer object. */
+        SuperKmer superKmer (_kmersize, _miniSize);
+
+		//iteration et traitement au fil de l'eau, without large kmer buffer (only small buffer for superkmer now )
+		_model.iterate(sequence.getData(), KmerFunctor<KmerType>(this,superKmer,maxs));
+		
+        //output last superK
+        processSuperkmer (superKmer);
+
+        if (_nbWrittenKmers > 500000)   {  _progress->inc (_nbWrittenKmers);  _nbWrittenKmers = 0;  }
+    }
+
+    /** Constructor. */
+    Sequence2SuperKmer (
+        Model&                       model,
+        size_t                       nbPasses,
+        size_t                       currentPass,
+        size_t                       nbPartitions,
+        tools::dp::IteratorListener* progress,
+        BankStats&                   bankStats
+    )
+    : _model(model), _pass(currentPass), _nbPass(nbPasses), _nbPartitions(nbPartitions),
+      _progress (progress), _nbWrittenKmers(0), _nbSuperKmers(0),
+      _bankStatsGlobal(bankStats)
+    {
+        /** Shortcuts. */
+        _kmersize = model.getKmerSize();
+        _miniSize = model.getMmersModel().getKmerSize();
+    }
+
+    /** Destructor (virtual). */
+    virtual ~Sequence2SuperKmer ()
+    {
+        /** In case we have several passes, we must update sequence information only for first pass. */
+        if (_pass==0)  { _bankStatsGlobal += _bankStatsLocal;  }
+    }
+
+protected:
+
+    Model&           _model;
+    size_t           _pass;
+    size_t           _nbPass;
+    size_t           _nbPartitions;
+    size_t           _kmersize;
+    size_t           _miniSize;
+    tools::dp::IteratorListener* _progress;
+    size_t           _nbWrittenKmers;
+    size_t           _nbSuperKmers;
+    BankStats&       _bankStatsGlobal;
+    BankStats        _bankStatsLocal;
+
+    /** Primitive of the template method operator() */
+    virtual void processSuperkmer (SuperKmer& superKmer) { _nbSuperKmers++; }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _SEQUENCE_2_SUPERKMER_HPP_ */
+
diff --git a/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.cpp b/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.cpp
new file mode 100644
index 0000000..b12e5f1
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.cpp
@@ -0,0 +1,1500 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+// We include required definitions
+/********************************************************************************/
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/CountProcessor.hpp>
+#include <gatb/kmer/impl/Sequence2SuperKmer.hpp>
+#include <gatb/kmer/impl/ConfigurationAlgorithm.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/kmer/impl/PartitionsCommand.hpp>
+#include <gatb/kmer/impl/RepartitionAlgorithm.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+#include <cmath>
+
+#define DEBUG(a)  //printf a
+
+/********************************************************************************/
+// We use the required packages
+/********************************************************************************/
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+
+//#define PROTO_COMP
+
+#ifdef PROTO_COMP
+    #define PartitionCacheType  PartitionCacheSorted
+    #define STORAGE_TYPE  STORAGE_COMPRESSED_FILE
+#else
+    #define PartitionCacheType  PartitionCache
+    #define STORAGE_TYPE  STORAGE_FILE
+#endif
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {   namespace kmer  {   namespace impl {
+/********************************************************************************/
+
+/********************************************************************************/
+static const char* progressFormat0 = "DSK: counting kmers                    ";
+static const char* progressFormat1 = "DSK: Pass %d/%d, Step 1: partitioning    ";
+static const char* progressFormat2 = "DSK: Pass %d/%d, Step 2: counting kmers  ";
+static const char* progressFormat4 = "DSK: nb solid kmers found : %-9ld  ";
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+SortingCountAlgorithm<span>::SortingCountAlgorithm (IProperties* params)
+  : Algorithm("dsk", -1, params),
+    _bank(0), _repartitor(0),
+    _progress (0), _tmpPartitionsStorage(0), _tmpPartitions(0), _storage(0),_superKstorage(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+SortingCountAlgorithm<span>::SortingCountAlgorithm (IBank* bank, IProperties* params)
+  : Algorithm("dsk", -1, params),
+    _bank(0), _repartitor(0),
+    _progress (0),_tmpPartitionsStorage(0), _tmpPartitions(0), _storage(0),_superKstorage(0)
+{
+    setBank (bank);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+SortingCountAlgorithm<span>::SortingCountAlgorithm (
+    IBank*                  bank,
+    const Configuration&    config,
+    Repartitor*             repartitor,
+    vector<CountProcessor*> processors,
+	tools::misc::IProperties* params
+
+)
+  : Algorithm("dsk", config._nbCores, params),
+    _config(config), _bank(0), _repartitor(0),
+    _progress (0),_tmpPartitionsStorage(0), _tmpPartitions(0), _storage(0),_superKstorage(0)
+{
+    setBank       (bank);
+    setRepartitor (repartitor);
+
+    for (size_t i=0; i<processors.size(); i++)  {  addProcessor  (processors[i]); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+SortingCountAlgorithm<span>::~SortingCountAlgorithm ()
+{
+    setBank                 (0);
+    setRepartitor           (0);
+    setProgress             (0);
+ //   setPartitionsStorage    (0);
+ //   setPartitions           (0);
+    setStorage              (0);
+
+    for (size_t i=0; i<_processors.size(); i++)  { _processors[i]->forget(); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+SortingCountAlgorithm<span>& SortingCountAlgorithm<span>::operator= (const SortingCountAlgorithm& s)
+{
+    if (this != &s)
+    {
+        _config = s._config;
+
+        setBank                 (s._bank);
+        setRepartitor           (s._repartitor);
+        setProgress             (s._progress);
+        setPartitionsStorage    (s._tmpPartitionsStorage);
+	    setPartitions           (s._tmpPartitions);
+		_superKstorage = s._superKstorage;
+        setStorage              (s._storage);
+    }
+    return *this;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+IOptionsParser* SortingCountAlgorithm<span>::getOptionsParser (bool mandatory)
+{
+    IOptionsParser* parser = new OptionsParser ("kmer count");
+
+    string abundanceMax = Stringify::format("%ld", std::numeric_limits<CountNumber>::max());
+
+    parser->push_back (new OptionOneParam (STR_URI_INPUT,         "reads file", mandatory ));
+    parser->push_back (new OptionOneParam (STR_KMER_SIZE,         "size of a kmer",                                 false, "31"    ));
+    parser->push_back (new OptionOneParam (STR_KMER_ABUNDANCE_MIN,"min abundance threshold for solid kmers",        false, "2"     ));
+    parser->push_back (new OptionOneParam (STR_KMER_ABUNDANCE_MAX,"max abundance threshold for solid kmers",        false, abundanceMax));
+    parser->push_back (new OptionOneParam (STR_KMER_ABUNDANCE_MIN_THRESHOLD,"min abundance hard threshold (only used when min abundance is \"auto\")",false, "2"));
+    parser->push_back (new OptionOneParam (STR_HISTOGRAM_MAX,     "max number of values in kmers histogram",        false, "10000"));
+    parser->push_back (new OptionOneParam (STR_SOLIDITY_KIND,     "way to compute counts of several files (sum, min, max, one, all, custom)",false, "sum"));
+	parser->push_back (new OptionOneParam (STR_SOLIDITY_CUSTOM,   "when solidity-kind is cutom, specifies list of files where kmer must be present",false, ""));
+    parser->push_back (new OptionOneParam (STR_MAX_MEMORY,        "max memory (in MBytes)",                         false, "5000"));
+    parser->push_back (new OptionOneParam (STR_MAX_DISK,          "max disk   (in MBytes)",                         false, "0"));
+    parser->push_back (new OptionOneParam (STR_URI_SOLID_KMERS,   "output file for solid kmers (only when constructing a graph)", false));
+    parser->push_back (new OptionOneParam (STR_URI_OUTPUT,        "output file",                                    false));
+    parser->push_back (new OptionOneParam (STR_URI_OUTPUT_DIR,    "output directory",                               false, "."));
+    parser->push_back (new OptionOneParam (STR_URI_OUTPUT_TMP,    "output directory for temporary files",           false, "."));
+    parser->push_back (new OptionOneParam (STR_COMPRESS_LEVEL,    "h5 compression level (0:none, 9:best)",          false, "0"));
+    parser->push_back (new OptionOneParam (STR_STORAGE_TYPE,      "storage type of kmer counts ('hdf5' or 'file')", false, "hdf5"  ));
+
+    IOptionsParser* devParser = new OptionsParser ("kmer count, algorithmic options");
+
+    devParser->push_back (new OptionOneParam (STR_MINIMIZER_TYPE,    "minimizer type (0=lexi, 1=freq)",                false, "0"));
+    devParser->push_back (new OptionOneParam (STR_MINIMIZER_SIZE,    "size of a minimizer",                            false, "10"));
+    devParser->push_back (new OptionOneParam (STR_REPARTITION_TYPE,  "minimizer repartition (0=unordered, 1=ordered)", false, "0"));
+    parser->push_back (devParser);
+
+    return parser;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+IProperties* SortingCountAlgorithm<span>::getDefaultProperties ()
+{
+    IOptionsParser* parser = getOptionsParser (true);
+    LOCAL (parser);
+    return parser->getDefaultProperties();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+ICountProcessor<span>* SortingCountAlgorithm<span>::getDefaultProcessor (
+    tools::misc::IProperties*       params,
+    tools::storage::impl::Storage*  dskStorage,
+    tools::storage::impl::Storage*  otherStorage
+)
+{
+    CountProcessor* result = 0;
+
+    if (otherStorage == 0)  { otherStorage = dskStorage; }
+
+    if (params==0 || dskStorage==0 || otherStorage==0)  { throw Exception ("Bad parameters in SortingCountAlgorithm<span>::getDefaultProcessor"); }
+
+    /** The default count processor is defined as the following chain :
+     *      1) histogram
+     *      2) solidity filter
+     *      3) if solidity filter passed, dump to file system
+     */
+    result = new CountProcessorChain<span> (
+
+        new CountProcessorHistogram<span> (
+            & otherStorage->getGroup("histogram"),
+            params->getInt(STR_HISTOGRAM_MAX),
+            params->getInt(STR_KMER_ABUNDANCE_MIN_THRESHOLD)
+        ),
+
+        CountProcessorSolidityFactory<span>::create (*params),
+
+        new CountProcessorDump     <span> (
+            dskStorage->getGroup("dsk"),
+            params->getInt(STR_KMER_SIZE)
+        ),
+        NULL
+    );
+
+    /** We set some name. */
+    result->setName ("dsk");
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+/** We need a specific count processor proxy. */
+template<size_t span>
+class CountProcessorCustomProxy : public CountProcessorProxy<span>
+{
+    public:
+    CountProcessorCustomProxy (ICountProcessor<span>* cutoffProcessor, ICountProcessor<span>* dskProcessor)
+        : CountProcessorProxy<span>(cutoffProcessor), _cutoffProcessor(cutoffProcessor), _dskProcessor(dskProcessor) {}
+
+    /** \copydoc ICountProcessor<span>::end */
+    void endPass (size_t passId)
+    {
+        /** We call the parent method. */
+        CountProcessorProxy<span>::endPass (passId);
+
+        /** Now, we have the cutoffs information, and we can put it as abundance min of the dsk processor. */
+        if (CountProcessorCutoff<span>* cutoffProc = dynamic_cast<CountProcessorCutoff<span>*> (_cutoffProcessor))
+        {
+            if (CountProcessorSolidityInfo* info = _dskProcessor->template get<CountProcessorSolidityInfo> ())
+            {
+                info->setAbundanceMin (cutoffProc->getCutoffs());
+            }
+        }
+    }
+
+    private:
+        ICountProcessor<span>* _cutoffProcessor;
+        ICountProcessor<span>* _dskProcessor;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+vector<ICountProcessor<span>*> SortingCountAlgorithm<span>::getDefaultProcessorVector (
+    Configuration&  config,
+    IProperties*    params,
+    Storage*        dskStorage,
+    Storage*        otherStorage
+)
+{
+    vector<ICountProcessor<span>*> result;
+
+    ICountProcessor<span>* dskProcessor = getDefaultProcessor (params, dskStorage, otherStorage);
+
+    /** Now, we define the vector of count processors to be given to the SortingCountAlgorithm.
+     * The choice depends on the presence of "auto" min abundance in the configuration. */
+    bool foundAuto = false;
+    for (size_t i=0; !foundAuto && i<config._abundance.size(); i++) {  foundAuto = config._abundance[i].getBegin() == -1;  }
+
+    if (foundAuto)
+    {
+        /** We create a cutoff count processor to compute cutoffs. */
+        ICountProcessor<span>* cutoffProcessor = 0;
+
+        /** We look what kind of solidity is required. If it is in [sum,min,max], we consider that we have only one bank
+         * to compute the histogram for, even if N banks are provided. In such a case, the histogram is computed for the
+         * concatenation of the N banks. */
+        switch (config._solidityKind)
+        {
+        case KMER_SOLIDITY_MIN:
+        case KMER_SOLIDITY_MAX:
+        case KMER_SOLIDITY_SUM:
+            cutoffProcessor = new CountProcessorCutoff<span> (1);
+            break;
+
+        case KMER_SOLIDITY_ONE:
+		case KMER_SOLIDITY_CUSTOM:
+        case KMER_SOLIDITY_ALL:
+            /** We create a cutoff count processor to compute cutoffs of the N banks. */
+            cutoffProcessor = new CountProcessorCutoff<span> (config._nb_banks);
+            break;
+
+        default:
+            break;
+        }
+
+        if (cutoffProcessor == 0)  { throw Exception ("Unable to configure count processor due to bad solidity kind %d", config._solidityKind); }
+
+        /** We encapsulate both cutoff and dsk processors in a single one that link them. */
+        ICountProcessor<span>* proxyCutoff = new CountProcessorCustomProxy<span> (cutoffProcessor, dskProcessor);
+        proxyCutoff->setName("cutoffs_auto");
+
+        result.push_back (proxyCutoff);
+        result.push_back (dskProcessor);
+    }
+    else
+    {
+        result.push_back (dskProcessor);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void SortingCountAlgorithm<span>::configure ()
+{
+    DEBUG (("SortingCountAlgorithm<span>::configure  BEGIN  _bank=%p  _config.isComputed=%d  _repartitor=%p  \n",
+        _bank, _config._isComputed, _repartitor
+    ));
+
+    /** We check that the bank is ok, otherwise we build one. */
+    if (_bank == 0)    {  setBank (Bank::open (getInput()->getStr(STR_URI_INPUT)));  }
+
+    /** We may have to create a default storage. */
+    Storage* storage = 0;
+    if (_repartitor==0 || _processors.size() == 0)
+    {
+        string output = getInput()->get(STR_URI_OUTPUT) ?
+            getInput()->getStr(STR_URI_OUTPUT)   :
+            (getInput()->getStr(STR_URI_OUTPUT_DIR) + "/" + system::impl::System::file().getBaseName (_bank->getId()));
+
+        /* create output dir if it doesn't exist */
+        if(!System::file().doesExist(getInput()->getStr(STR_URI_OUTPUT_DIR))){
+            int ok = System::file().mkdir(getInput()->getStr(STR_URI_OUTPUT_DIR), 0755);
+            if(ok != 0){
+                throw Exception ("Error: can't create output directory");
+            }
+        }
+
+        string storage_type = getInput()->getStr(STR_STORAGE_TYPE);
+        if (storage_type == "hdf5")
+            _storage_type = tools::storage::impl::STORAGE_HDF5;
+        else
+        {
+            if (storage_type == "file")
+                _storage_type = tools::storage::impl::STORAGE_FILE;
+            else
+            {std::cout << "Error: unknown storage type specified: " << storage_type << std::endl; exit(1); }
+        }
+
+        storage = StorageFactory(_storage_type).create (output, true, false); //// this is the storage for the output (kmer counts), formerly fixed to HDF5
+    }
+
+    /** In case the storage is created in this method, we need to keep an eye on it. */
+    setStorage (storage);
+
+    /** We check that the configuration is ok, otherwise we build one. */
+    if (_config._isComputed == false)
+    {
+        ConfigurationAlgorithm<span> configAlgo (_bank, getInput());
+        configAlgo.execute();
+        _config = configAlgo.getConfiguration();
+ 
+        /* remember configuration details (e.g. number of passes, partitions). useful for bcalm. */
+        storage->getGroup(configAlgo.getName()).setProperty("xml", string("\n") + configAlgo.getInfo()->getXML());
+   }
+
+    /** We check that the minimizers hash function is ok, otherwise we build one. */
+    if (_repartitor == 0)
+    {
+        RepartitorAlgorithm<span> repart (
+                _bank, 
+                storage->getGroup("minimizers"), 
+                _config,
+                getInput()->get(STR_NB_CORES) ? getInput()->getInt(STR_NB_CORES) : 0
+                );
+        repart.execute ();
+        setRepartitor (new Repartitor(storage->getGroup("minimizers")));
+    }
+
+	/** We check that the processor is ok, otherwise we build one. */
+    if (_processors.size() == 0)  {  addProcessor (getDefaultProcessor(getInput(), storage));  };
+
+    DEBUG (("SortingCountAlgorithm<span>::configure  END  _bank=%p  _config.isComputed=%d  _repartitor=%p  storage=%p\n",
+        _bank, _config._isComputed, _repartitor, storage
+    ));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void SortingCountAlgorithm<span>::execute ()
+{
+    /*************************************************************/
+    /*                       CONFIGURATION                       */
+    /*************************************************************/
+
+    /** We configure all required objects (bank, configuration, repartitor, count processor). */
+    configure ();
+
+    /** We create the sequences iterator. */
+    Iterator<Sequence>* itSeq = _bank->iterator();
+    LOCAL (itSeq);
+
+    /** We configure the progress bar. Note that we create a ProgressSynchro since this progress bar
+     * may me modified by several threads at the same time. */
+    size_t nbIterations = (1 + _processors.size()) * _config._volume * MBYTE / sizeof(Type);
+    setProgress (new ProgressSynchro (
+        createIteratorListener (nbIterations, progressFormat0),
+        System::thread().newSynchronizer())
+    );
+    _progress->init ();
+
+#ifdef NONCANONICAL
+    std::cerr << std::endl << "NOTICE: This version was compiled to perform non-canonical kmer counting." << std::endl;
+#endif
+
+    if (_config._kmerSize <= 2)
+    {
+        std::cout << "k-mer counting with k<=2 is not supported" << std::endl; // it's buggy. try it with https://github.com/GATB/dsk/blob/master/test/shortread.fasta, you will see only 5 kmers returned
+        exit(1);
+    }
+
+    /** We create the PartiInfo instance. */
+    PartiInfo<5> pInfo (_config._nb_partitions, _config._minim_size);
+
+    /** We notify the count processor about the start of the main loop. */
+    for (size_t i=0; i<_processors.size(); i++)  {  _processors[i]->begin (_config); }
+
+    /*************************************************************/
+    /*                         MAIN LOOP                         */
+    /*************************************************************/
+    /** We loop N times the bank. For each pass, we will consider a subset of the whole kmers set of the bank. */
+    for (size_t current_pass=0; current_pass < _config._nb_passes; current_pass++)
+    {
+        DEBUG (("SortingCountAlgorithm<span>::execute  pass [%ld,%d] \n", current_pass+1, _config._nb_passes));
+
+        pInfo.clear();
+
+        /** 1) We fill the partition files. */
+        fillPartitions (current_pass, itSeq, pInfo);
+
+        /** 2) We fill the kmers solid file from the partition files. */
+        fillSolidKmers (current_pass, pInfo);
+    }
+
+    /** We notify the count processor about the stop of the main loop. */
+    for (size_t i=0; i<_processors.size(); i++)  {  _processors[i]->end (); }
+
+    /** We update the progress information. */
+    for (size_t i=0; i<_processors.size(); i++)
+    {
+        CountProcessorDump<span>* processorDump = _processors[i]->template get <CountProcessorDump<span> > ();
+        if (processorDump != 0) {  _progress->setMessage (Stringify::format(progressFormat4, processorDump->getNbItems())); }
+    }
+
+    _progress->finish ();
+
+	
+//	pInfo.printInfo();
+	
+
+    /** We want to remove physically the partitions. */
+	if(_config._solidityKind != KMER_SOLIDITY_SUM)
+     _tmpPartitions->remove ();
+
+	u_int64_t totaltmp, biggesttmp, smallesttmp;
+	float meantmp;
+	if(_config._solidityKind == KMER_SOLIDITY_SUM)
+		_superKstorage->getFilesStats(totaltmp,biggesttmp,smallesttmp, meantmp);
+
+
+	if(_superKstorage!=0)
+	{
+		delete _superKstorage; //delete files and containing dir
+		_superKstorage =0;
+	}
+	
+    /*************************************************************/
+    /*                         STATISTICS                        */
+    /*************************************************************/
+
+    /** We gather some statistics. */
+    if (_bankStats.sequencesNb > 0)
+    {
+        getInfo()->add (1, "bank");
+        getInfo()->add (2, "bank_uri",          "%s",   _bank->getId().c_str());
+        getInfo()->add (2, "bank_size",         "%lld", _bank->getSize());
+        getInfo()->add (2, "bank_total_nt",     "%lld", _bankStats.sequencesTotalLength);
+        getInfo()->add (2, "sequences");
+        getInfo()->add (3, "seq_number",        "%ld",  _bankStats.sequencesNb);
+        getInfo()->add (3, "seq_size_min",      "%ld",  _bankStats.sequencesMinLength);
+        getInfo()->add (3, "seq_size_max",      "%ld",  _bankStats.sequencesMaxLength);
+        getInfo()->add (3, "seq_size_mean",     "%.1f", _bankStats.getSeqMean());
+        getInfo()->add (3, "seq_size_deviation","%.1f", _bankStats.getSeqDeviation());
+        getInfo()->add (2, "kmers");
+        getInfo()->add (3, "kmers_nb_valid",   "%lld", _bankStats.kmersNbValid);
+        getInfo()->add (3, "kmers_nb_invalid", "%lld", _bankStats.kmersNbInvalid);
+		
+		
+    }
+
+
+	
+	u_int64_t nbtotalsuperk = pInfo.getNbSuperKmerTotal();
+	u_int64_t nbtotalk = pInfo.getNbKmerTotal();
+	
+    getInfo()->add (1, "stats");
+	
+	getInfo()->add (2, "temp files");
+	getInfo()->add (3, "nb superkmers ","%lld",nbtotalsuperk);
+	getInfo()->add (3, "avg superk length ","%.2f",(nbtotalk/(float) nbtotalsuperk));
+	getInfo()->add (3, "minimizer density ","%.2f",(nbtotalsuperk/(float)nbtotalk)*(_config._kmerSize - _config._minim_size +2));
+	
+	if(_config._solidityKind == KMER_SOLIDITY_SUM)
+	{
+		getInfo()->add (3, "total size (MB)","%lld",totaltmp/1024LL/1024LL);
+		getInfo()->add (3, "tmp file biggest (MB)","%lld",biggesttmp/1024LL/1024LL);
+		getInfo()->add (3, "tmp file smallest (MB)","%lld",smallesttmp/1024LL/1024LL);
+		getInfo()->add (3, "tmp file mean (MB)","%.1f",meantmp/1024LL/1024LL);
+	}
+    /** We dump information about count processors. */
+    if (_processors.size()==1)  {  getInfo()->add (2, _processors[0]->getProperties()); }
+    else
+    {
+        for (size_t i=0; i<_processors.size(); i++)
+        {
+            getInfo()->add (2, _processors[i]->getName());
+            getInfo()->add (3, _processors[i]->getProperties());
+        }
+    }
+
+    _fillTimeInfo /= getDispatcher()->getExecutionUnitsNumber();
+    getInfo()->add (2, _fillTimeInfo.getProperties("fillsolid_time"));
+
+    getInfo()->add (1, getTimeInfo().getProperties("time"));
+}
+
+/********************************************************************************/
+/* This functor class takes a Sequence as input, splits it into super kmers and
+ * serialize them into partitions.
+ *
+ * A superkmer is dumped into a partition 'p' chosen by some hash code of the minimizer
+ * of the superkmer. Such a hash code can be computed in several way; actually, we use
+ * a lookup table that has computed the minimizers distribution on a subset of the
+ * processed bank.
+ */
+	
+template<size_t span, bool newSuperKmerStorage=true> //
+class FillPartitions : public Sequence2SuperKmer<span>
+{
+public:
+	/** Shortcut. */
+	typedef typename Sequence2SuperKmer<span>::Type            Type;
+	typedef typename Sequence2SuperKmer<span>::Model           Model;
+	typedef typename Model::Kmer                          KmerType;
+	typedef typename Kmer<span>::SuperKmer                SuperKmer;
+	
+	/** */
+	void processSuperkmer (SuperKmer& superKmer)
+	{
+		if ((superKmer.minimizer % this->_nbPass) == this->_pass && superKmer.isValid()) //check if falls into pass
+		{
+			/** We get the hash code for the current miminizer.
+			 * => this will give us the partition where to dump the superkmer. */
+			size_t p = this->_repartition (superKmer.minimizer);
+			
+			/** We save the superkmer into the right partition. */
+			if(newSuperKmerStorage)
+				superKmer.save (_superkmerFiles,p);
+			else
+				superKmer.save ((this->_partition)[p]);
+			
+			
+			//for debug purposes
+			_local_pInfo.incSuperKmer_per_minimBin (superKmer.minimizer, superKmer.size()); //tocheck
+			
+			/*********************************************/
+			/** Now, we compute statistics about kxmers. */
+			/*********************************************/
+			
+			Type radix_kxmer_forward ,radix_kxmer ;
+			bool prev_which = superKmer[0].which();
+			size_t kx_size =0;
+			
+			radix_kxmer_forward = getHeavyWeight (superKmer[0].value());
+			
+			for (size_t ii=1 ; ii < superKmer.size(); ii++)
+			{
+				//compute here stats on  kx mer
+				//tant que tai <= xmer et which kmer[ii] == which kmer [ii-1] --> cest un kxmer
+				//do the same in sampling : gives ram estimation
+				if (superKmer[ii].which() != prev_which || kx_size >= this->_kx) // kxmer_size = 1 //cost should diminish with larger kxmer
+				{
+					//output kxmer size kx_size,radix_kxmer
+					//kx mer is composed of _superKp[ii-1] _superKp[ii-2] .. _superKp[ii-n] with nb elems  n  == kxmer_size +1  (un seul kmer ==k+0)
+					if(prev_which)
+					{
+						radix_kxmer = radix_kxmer_forward;
+					}
+					else // si revcomp, le radix du kxmer est le debut du dernier kmer
+					{
+						radix_kxmer = getHeavyWeight (superKmer[ii-1].value());
+					}
+					
+					this->_local_pInfo.incKmer_and_rad (p, radix_kxmer.getVal(), kx_size); //nb of superkmer per x per parti per radix
+					
+					radix_kxmer_forward =  getHeavyWeight (superKmer[ii].value());
+					kx_size =0;
+				}
+				else
+				{
+					kx_size++;
+				}
+				
+				prev_which = superKmer[ii].which() ;
+			}
+			
+			//record last kx mer
+			if(prev_which)
+			{
+				radix_kxmer = radix_kxmer_forward;
+			}
+			else // si revcomp, le radix du kxmer est le debut du dernier kmer
+			{
+				radix_kxmer =  getHeavyWeight (superKmer[superKmer.size()-1].value());
+			}
+			
+			this->_local_pInfo.incKmer_and_rad(p, radix_kxmer.getVal(),kx_size );
+			
+			/** We update progression information. */
+			this->_nbWrittenKmers += superKmer.size();
+		}
+	}
+	
+	/** Constructor. */
+	FillPartitions (
+					Model&             model,
+					size_t             nbPasses,
+					size_t             currentPass,
+					size_t             nbPartitions,
+					size_t             nbCacheItems,
+					IteratorListener*  progress,
+					BankStats&         bankStats,
+					Partition<Type>*   partition,
+					Repartitor&        repartition,
+					PartiInfo<5>&      pInfo,
+					SuperKmerBinFiles* superKstorage
+					)
+	:   Sequence2SuperKmer<span> (model, nbPasses, currentPass, nbPartitions, progress, bankStats),
+	_kx(4),
+	_extern_pInfo(pInfo) , _local_pInfo(nbPartitions,model.getMmersModel().getKmerSize()),
+	_repartition (repartition)
+	,_partition (*partition, nbCacheItems, 0), _superkmerFiles(superKstorage,nbCacheItems* sizeof(Type))
+	{
+		_mask_radix.setVal((int64_t) 255);
+		_mask_radix = _mask_radix << ((this->_kmersize - 4)*2); //get first 4 nt  of the kmers (heavy weight)
+	}
+	
+	
+	/** Destructor. */
+	~FillPartitions ()
+	{
+		//printf("destruc fillparti _superkmerFiles %p \n",_superkmerFiles);
+		
+		//add to global parti_info
+		_extern_pInfo += _local_pInfo;
+	}
+	
+private:
+	
+	size_t        _kx;
+	PartiInfo<5>& _extern_pInfo;
+	PartiInfo<5>  _local_pInfo;
+	Type          _mask_radix;
+	Repartitor&   _repartition;
+	
+	/** Shared resources (must support concurrent accesses). */
+	PartitionCacheType <Type> _partition;
+		CacheSuperKmerBinFiles _superkmerFiles;
+	
+	
+	
+	Type getHeavyWeight (const Type& kmer) const  {  return (kmer & this->_mask_radix) >> ((this->_kmersize - 4)*2);  }
+};
+	
+	
+//specialization when newSuperKmerStorage = false
+template<size_t span>
+class FillPartitions <span, false>: public Sequence2SuperKmer<span>
+{
+public:
+    /** Shortcut. */
+    typedef typename Sequence2SuperKmer<span>::Type            Type;
+    typedef typename Sequence2SuperKmer<span>::Model           Model;
+    typedef typename Model::Kmer                          KmerType;
+    typedef typename Kmer<span>::SuperKmer                SuperKmer;
+
+    /** */
+    void processSuperkmer (SuperKmer& superKmer)
+    {
+        if ((superKmer.minimizer % this->_nbPass) == this->_pass && superKmer.isValid()) //check if falls into pass
+        {
+            /** We get the hash code for the current miminizer.
+             * => this will give us the partition where to dump the superkmer. */
+            size_t p = this->_repartition (superKmer.minimizer);
+
+            /** We save the superkmer into the right partition. */
+//			if(newSuperKmerStorage)
+//				superKmer.save (_superkmerFiles,p);
+//			else
+				superKmer.save ((this->_partition)[p]);
+
+	
+			//for debug purposes
+			_local_pInfo.incSuperKmer_per_minimBin (superKmer.minimizer, superKmer.size()); //tocheck
+
+            /*********************************************/
+            /** Now, we compute statistics about kxmers. */
+            /*********************************************/
+
+            Type radix_kxmer_forward ,radix_kxmer ;
+            bool prev_which = superKmer[0].which();
+            size_t kx_size =0;
+
+            radix_kxmer_forward = getHeavyWeight (superKmer[0].value());
+
+            for (size_t ii=1 ; ii < superKmer.size(); ii++)
+            {
+                //compute here stats on  kx mer
+                //tant que tai <= xmer et which kmer[ii] == which kmer [ii-1] --> cest un kxmer
+                //do the same in sampling : gives ram estimation
+                if (superKmer[ii].which() != prev_which || kx_size >= this->_kx) // kxmer_size = 1 //cost should diminish with larger kxmer
+                {
+                    //output kxmer size kx_size,radix_kxmer
+                    //kx mer is composed of _superKp[ii-1] _superKp[ii-2] .. _superKp[ii-n] with nb elems  n  == kxmer_size +1  (un seul kmer ==k+0)
+                    if(prev_which)
+                    {
+                        radix_kxmer = radix_kxmer_forward;
+                    }
+                    else // si revcomp, le radix du kxmer est le debut du dernier kmer
+                    {
+                        radix_kxmer = getHeavyWeight (superKmer[ii-1].value());
+                    }
+
+                    this->_local_pInfo.incKmer_and_rad (p, radix_kxmer.getVal(), kx_size); //nb of superkmer per x per parti per radix
+
+                    radix_kxmer_forward =  getHeavyWeight (superKmer[ii].value());
+                    kx_size =0;
+                }
+                else
+                {
+                    kx_size++;
+                }
+
+                prev_which = superKmer[ii].which() ;
+            }
+
+            //record last kx mer
+            if(prev_which)
+            {
+                radix_kxmer = radix_kxmer_forward;
+            }
+            else // si revcomp, le radix du kxmer est le debut du dernier kmer
+            {
+                radix_kxmer =  getHeavyWeight (superKmer[superKmer.size()-1].value());
+            }
+
+            this->_local_pInfo.incKmer_and_rad(p, radix_kxmer.getVal(),kx_size );
+
+            /** We update progression information. */
+            this->_nbWrittenKmers += superKmer.size();
+        }
+    }
+
+    /** Constructor. */
+    FillPartitions (
+        Model&             model,
+        size_t             nbPasses,
+        size_t             currentPass,
+        size_t             nbPartitions,
+        size_t             nbCacheItems,
+        IteratorListener*  progress,
+        BankStats&         bankStats,
+        Partition<Type>*   partition,
+        Repartitor&        repartition,
+        PartiInfo<5>&      pInfo,
+		SuperKmerBinFiles* superKstorage
+    )
+    :   Sequence2SuperKmer<span> (model, nbPasses, currentPass, nbPartitions, progress, bankStats),
+        _kx(4),
+        _extern_pInfo(pInfo) , _local_pInfo(nbPartitions,model.getMmersModel().getKmerSize()),
+        _repartition (repartition)
+	    ,_partition (*partition, nbCacheItems, 0)/*, _superkmerFiles(superKstorage,nbCacheItems* sizeof(Type))*/
+    {
+        _mask_radix.setVal((int64_t) 255);
+        _mask_radix = _mask_radix << ((this->_kmersize - 4)*2); //get first 4 nt  of the kmers (heavy weight)
+    }
+
+
+    /** Destructor. */
+    ~FillPartitions ()
+    {
+		//printf("destruc fillparti _superkmerFiles %p \n",_superkmerFiles);
+
+        //add to global parti_info
+        _extern_pInfo += _local_pInfo;
+    }
+
+private:
+
+    size_t        _kx;
+    PartiInfo<5>& _extern_pInfo;
+    PartiInfo<5>  _local_pInfo;
+    Type          _mask_radix;
+    Repartitor&   _repartition;
+	
+    /** Shared resources (must support concurrent accesses). */
+    PartitionCacheType <Type> _partition;
+//	CacheSuperKmerBinFiles _superkmerFiles;
+	
+	
+
+    Type getHeavyWeight (const Type& kmer) const  {  return (kmer & this->_mask_radix) >> ((this->_kmersize - 4)*2);  }
+};
+
+	
+	//specialization when newSuperKmerStorage = true
+	template<size_t span>
+	class FillPartitions<span, true> : public Sequence2SuperKmer<span>
+	{
+	public:
+		/** Shortcut. */
+		typedef typename Sequence2SuperKmer<span>::Type            Type;
+		typedef typename Sequence2SuperKmer<span>::Model           Model;
+		typedef typename Model::Kmer                          KmerType;
+		typedef typename Kmer<span>::SuperKmer                SuperKmer;
+		
+		/** */
+		void processSuperkmer (SuperKmer& superKmer)
+		{
+			if ((superKmer.minimizer % this->_nbPass) == this->_pass && superKmer.isValid()) //check if falls into pass
+			{
+				/** We get the hash code for the current miminizer.
+				 * => this will give us the partition where to dump the superkmer. */
+				size_t p = this->_repartition (superKmer.minimizer);
+				
+				/** We save the superkmer into the right partition. */
+				superKmer.save (_superkmerFiles,p);
+
+				//for debug purposes
+				_local_pInfo.incSuperKmer_per_minimBin (superKmer.minimizer, superKmer.size()); //tocheck
+				
+				/*********************************************/
+				/** Now, we compute statistics about kxmers. */
+				/*********************************************/
+				
+				Type radix_kxmer_forward ,radix_kxmer ;
+				bool prev_which = superKmer[0].which();
+				size_t kx_size =0;
+				
+				radix_kxmer_forward = getHeavyWeight (superKmer[0].value());
+				
+				for (size_t ii=1 ; ii < superKmer.size(); ii++)
+				{
+					//compute here stats on  kx mer
+					//tant que tai <= xmer et which kmer[ii] == which kmer [ii-1] --> cest un kxmer
+					//do the same in sampling : gives ram estimation
+					if (superKmer[ii].which() != prev_which || kx_size >= this->_kx) // kxmer_size = 1 //cost should diminish with larger kxmer
+					{
+						//output kxmer size kx_size,radix_kxmer
+						//kx mer is composed of _superKp[ii-1] _superKp[ii-2] .. _superKp[ii-n] with nb elems  n  == kxmer_size +1  (un seul kmer ==k+0)
+						if(prev_which)
+						{
+							radix_kxmer = radix_kxmer_forward;
+						}
+						else // si revcomp, le radix du kxmer est le debut du dernier kmer
+						{
+							radix_kxmer = getHeavyWeight (superKmer[ii-1].value());
+						}
+						
+						this->_local_pInfo.incKmer_and_rad (p, radix_kxmer.getVal(), kx_size); //nb of superkmer per x per parti per radix
+						
+						radix_kxmer_forward =  getHeavyWeight (superKmer[ii].value());
+						kx_size =0;
+					}
+					else
+					{
+						kx_size++;
+					}
+					
+					prev_which = superKmer[ii].which() ;
+				}
+				
+				//record last kx mer
+				if(prev_which)
+				{
+					radix_kxmer = radix_kxmer_forward;
+				}
+				else // si revcomp, le radix du kxmer est le debut du dernier kmer
+				{
+					radix_kxmer =  getHeavyWeight (superKmer[superKmer.size()-1].value());
+				}
+				
+				this->_local_pInfo.incKmer_and_rad(p, radix_kxmer.getVal(),kx_size );
+				
+				/** We update progression information. */
+				this->_nbWrittenKmers += superKmer.size();
+			}
+		}
+		
+		/** Constructor. */
+		FillPartitions (
+						Model&             model,
+						size_t             nbPasses,
+						size_t             currentPass,
+						size_t             nbPartitions,
+						size_t             nbCacheItems,
+						IteratorListener*  progress,
+						BankStats&         bankStats,
+						Partition<Type>*   partition,
+						Repartitor&        repartition,
+						PartiInfo<5>&      pInfo,
+						SuperKmerBinFiles* superKstorage
+						)
+		:   Sequence2SuperKmer<span> (model, nbPasses, currentPass, nbPartitions, progress, bankStats),
+		_kx(4),
+		_extern_pInfo(pInfo) , _local_pInfo(nbPartitions,model.getMmersModel().getKmerSize()),
+		_repartition (repartition)
+		,/*_partition (*partition, nbCacheItems, 0),*/ _superkmerFiles(superKstorage,nbCacheItems* sizeof(Type))
+		{
+			_mask_radix.setVal((int64_t) 255);
+			_mask_radix = _mask_radix << ((this->_kmersize - 4)*2); //get first 4 nt  of the kmers (heavy weight)
+		}
+		
+		
+		/** Destructor. */
+		~FillPartitions ()
+		{
+			//printf("destruc fillparti _superkmerFiles %p \n",_superkmerFiles);
+			
+			//add to global parti_info
+			_extern_pInfo += _local_pInfo;
+		}
+		
+	private:
+		
+		size_t        _kx;
+		PartiInfo<5>& _extern_pInfo;
+		PartiInfo<5>  _local_pInfo;
+		Type          _mask_radix;
+		Repartitor&   _repartition;
+		
+		/** Shared resources (must support concurrent accesses). */
+		//PartitionCacheType <Type> _partition;
+		CacheSuperKmerBinFiles _superkmerFiles;
+		
+		
+		
+		Type getHeavyWeight (const Type& kmer) const  {  return (kmer & this->_mask_radix) >> ((this->_kmersize - 4)*2);  }
+	};
+	
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void SortingCountAlgorithm<span>::fillPartitions (size_t pass, Iterator<Sequence>* itSeq, PartiInfo<5>& pInfo)
+	{
+		TIME_INFO (getTimeInfo(), "fill_partitions");
+		
+		DEBUG (("SortingCountAlgorithm<span>::fillPartitions  _kmerSize=%d _minim_size=%d \n", _config._kmerSize, _config._minim_size));
+		
+		if(_config._solidityKind != KMER_SOLIDITY_SUM)
+		{
+			/** We delete the previous partitions storage. */
+			if (_tmpPartitionsStorage)  { _tmpPartitionsStorage->remove (); }
+			
+			/** We build the temporary storage name from the output storage name. */
+			string tmpStorageName = getInput()->getStr(STR_URI_OUTPUT_TMP) + "/" + System::file().getTemporaryFilename("dsk_partitions");
+			
+			/** We create the partition files for the current pass. */
+			setPartitionsStorage (StorageFactory(STORAGE_TYPE).create (tmpStorageName, true, false));
+			setPartitions        (0); // close the partitions first, otherwise new files are opened before  closing parti from previous pass
+			setPartitions        ( & (*_tmpPartitionsStorage)().getPartition<Type> ("parts", _config._nb_partitions));
+			
+		}
+		else
+		{
+			/** We build the temporary storage name from the output storage name. */
+			_tmpStorageName_superK = getInput()->getStr(STR_URI_OUTPUT_TMP) + "/" + System::file().getTemporaryFilename("superK_partitions");
+			
+			
+			if(_superKstorage!=0)
+			{
+				delete _superKstorage;
+				_superKstorage =0;
+			}
+			
+			_superKstorage = new SuperKmerBinFiles(_tmpStorageName_superK,"superKparts", _config._nb_partitions) ;
+			
+		}
+		/** We update the message of the progress bar. */
+		_progress->setMessage (Stringify::format(progressFormat1, pass+1, _config._nb_passes));
+		
+		/** We create a kmer model; using the frequency order if we're in that mode */
+		uint32_t* freq_order = NULL;
+		
+		/** We may have to retrieve the minimizers frequencies computed in the RepartitorAlgorithm. */
+		if (_config._minimizerType == 1)  {  freq_order = _repartitor->getMinimizerFrequencies ();  }
+		
+		Model model( _config._kmerSize, _config._minim_size, typename kmer::impl::Kmer<span>::ComparatorMinimizerFrequencyOrLex(), freq_order);
+		
+		/** We have to reinit the progress instance since it may have been used by SampleRepart before. */
+		_progress->init();
+		
+		/** We may have several input banks instead of a single one. */
+		std::vector<Iterator<Sequence>*> itBanks =  itSeq->getComposition();
+		
+		/** We first reset the vector holding the kmers number for each partition and for each bank.
+		 * It can be seen as the following matrix:
+		 *
+		 *           part0  part1  part2 ... partJ
+		 *   bank0    xxx    xxx    xxx       xxx
+		 *   bank1    xxx    xxx    xxx       xxx
+		 *    ...
+		 *   bankI    xxx    xxx    xxx       xxx
+		 *
+		 *   Here xxx is the number of items found for the bank I in the partition J
+		 */
+		_nbKmersPerPartitionPerBank.clear();
+		
+		/** We launch the iteration of the sequences iterator with the created functors. */
+		for (size_t i=0; i<itBanks.size(); i++)
+		{
+			size_t groupSize   = 1000;
+			bool deleteSynchro = true;
+			
+			/** We fill the partitions. Each thread will read synchronously and will call FillPartitions
+			 * in a synchronous way (in order to have global BanksStats correctly computed). */
+			
+			if(_config._solidityKind == KMER_SOLIDITY_SUM)
+			{
+				getDispatcher()->iterate (itBanks[i], FillPartitions<span,true> (
+																			model, _config._nb_passes, pass, _config._nb_partitions, _config._nb_cached_items_per_core_per_part, _progress, _bankStats, _tmpPartitions, *_repartitor, pInfo,_superKstorage
+																			), groupSize, deleteSynchro);
+			}
+			else
+			{
+				getDispatcher()->iterate (itBanks[i], FillPartitions<span,false> (
+																				 model, _config._nb_passes, pass, _config._nb_partitions, _config._nb_cached_items_per_core_per_part, _progress, _bankStats, _tmpPartitions, *_repartitor, pInfo,_superKstorage
+																				 ), groupSize, deleteSynchro);
+			}
+			
+			
+			/** We flush the partitions in order to be sure to have the exact number of items per partition. */
+			if(_config._solidityKind != KMER_SOLIDITY_SUM)
+			{
+				_tmpPartitions->flush();
+				
+				/** We get a snapshot of items number in each partition. */
+				vector<size_t> nbItems;
+				for (size_t p=0; p<_config._nb_partitions; p++)
+				{
+				 nbItems.push_back ((*_tmpPartitions)[p].getNbItems()); //todo for multi count
+				}
+				
+				/** We add the current number of kmers in each partition for the reached ith bank. */
+				_nbKmersPerPartitionPerBank.push_back (nbItems);
+			}
+			
+			//GR: close the input bank here with call to finalize
+			itBanks[i]->finalize();
+		}
+		
+		if(_config._solidityKind == KMER_SOLIDITY_SUM)
+		{
+			_superKstorage->flushFiles();
+			_superKstorage->closeFiles();
+		}
+		
+		
+	}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+std::vector<size_t> SortingCountAlgorithm<span>::getNbCoresList (PartiInfo<5>& pInfo)
+{
+    std::vector<size_t> result;
+
+    for (size_t p=0; p<_config._nb_partitions; )
+    {
+        u_int64_t ram_total = 0;
+        size_t i=0;
+        for (i=0; i< _config._nb_partitions_in_parallel && p<_config._nb_partitions
+            && (ram_total ==0  || ((ram_total+(pInfo.getNbSuperKmer(p)*getSizeofPerItem()))  <= _config._max_memory*MBYTE)) ; i++, p++)
+        {
+            ram_total += pInfo.getNbSuperKmer(p)*getSizeofPerItem();
+        }
+
+        result.push_back (i);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void SortingCountAlgorithm<span>::fillSolidKmers (size_t pass, PartiInfo<5>& pInfo)
+{
+    TIME_INFO (getTimeInfo(), "fill_solid_kmers");
+
+    for (size_t i=0; i<_processors.size(); i++)
+    {
+        /** We notify the count processor about the start of the pass. */
+        _processors[i]->beginPass (pass);
+
+        fillSolidKmers_aux (_processors[i], pass, pInfo);
+
+        /** We notify the count processor about the end of the pass. */
+        _processors[i]->endPass (pass);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+void SortingCountAlgorithm<span>::fillSolidKmers_aux (ICountProcessor<span>* processor, size_t pass, PartiInfo<5>& pInfo)
+{
+    DEBUG (("SortingCountAlgorithm<span>::fillSolidKmers\n"));
+
+    /** We update the message of the progress bar. */
+    _progress->setMessage (Stringify::format (progressFormat2, pass+1, _config._nb_passes));
+
+
+    /** We retrieve the list of cores number for dispatching N partitions in N threads.
+     *  We need to know these numbers for allocating the N maps according to the maximum allowed memory.
+     */
+    vector<size_t> coreList = getNbCoresList(pInfo); //uses _nb_partitions_in_parallel
+
+    /** We need a memory allocator. We give the cores number in order to compute an extra memory
+     * allocation for alignment constraints. */
+    MemAllocator pool (_config._nbCores);
+
+    size_t p = 0;
+    for (size_t i=0; i<coreList.size(); i++)
+    {
+        vector<ICommand*> cmds;
+
+        /** We use a vector to hold all the current CountProcessor clones. */
+        vector<CountProcessor*> clones;
+
+        size_t currentNbCores = coreList[i];
+        assert (currentNbCores > 0);
+
+        /** We correct the number of memory per map according to the max allowed memory.
+         * Note that _max_memory has initially been divided by the user provided cores number. */
+        u_int64_t mem = (_config._max_memory*MBYTE)/currentNbCores;
+
+        /** We need to cache the solid kmers partitions.
+         *  NOTE : it is important to save solid kmers by big chunks (ie cache size) in each partition.
+         *  Indeed, if we directly iterate the solid kmers through a Partition::iterator() object,
+         *  one partition is iterated after another one, which doesn't reflect the way they are in filesystem,
+         *  (ie by chunks of solid kmers) which may lead to many moves into the global HDF5 file.
+         *  One solution is to make sure that the written chunks of solid kmers are big enough: here
+         *  we accept to provide at most 2% of the max memory, or chunks of 200.000 items.
+         */
+        size_t cacheSize = std::min ((u_int64_t)(200*1000), mem/(50*sizeof(Count)));
+
+        DEBUG (("SortingCountAlgorithm::fillSolidKmers:  mem=%d  computing %zu partitions simultaneously , parti : ",
+            mem/MBYTE, currentNbCores
+        ));
+
+        /** We build a list of 'currentNbCores' commands to be dispatched each one in one thread. */
+        for (size_t j=0; j<currentNbCores; j++, p++)
+        {
+            ISynchronizer* synchro = System::thread().newSynchronizer();
+            LOCAL (synchro);
+
+            /** We clone the prototype count processor instance for the current 'p' kmers partition. */
+            CountProcessor* processorClone = processor->clone ();
+
+            /** We use and put the clone into a vector. */
+            processorClone->use();
+            clones.push_back (processorClone);
+
+            DEBUG ((" %zu ", p));
+
+            /* Get the memory taken by this partition if loaded for sorting */
+            uint64_t memoryPartition = (pInfo.getNbSuperKmer(p)*getSizeofPerItem()); //in bytes
+            DEBUG (("  (%llu  MB) ",memoryPartition/MBYTE));
+
+            /** If we have several input banks, we may have to compute kmer solidity for each bank, which
+             * can be currently done only with sorted vector. */
+            bool forceVector  = _nbKmersPerPartitionPerBank.size() > 1 && \
+                                ( _config._solidityKind != KMER_SOLIDITY_SUM);
+
+            ICommand* cmd = 0;
+
+            //still use hash if by vector would be too large even with single part at a time
+			//I thought it was not possible to have memoryPartition > _max_memory  && currentNbCores>1 , but inf fact it is possible when
+			// some partitions are of size 0 (see getNbCoresList)
+			if ( ((memoryPartition > mem && currentNbCores==1) || ( memoryPartition > (_config._max_memory*MBYTE) ) )  && !forceVector)
+            {
+                if (pool.getCapacity() != 0)  {  pool.reserve(0);  }
+
+
+					cmd = new PartitionsByHashCommand<span>   (
+															   processorClone, cacheSize, _progress, _fillTimeInfo,
+															   pInfo, pass, p, _config._nbCores_per_partition, _config._kmerSize, pool, mem,_superKstorage
+															   );
+            }
+            else
+            {
+                u_int64_t memoryPoolSize = _config._max_memory*MBYTE;
+
+                /** In case of forcing sorted vector (multiple banks counting for instance), we may have a
+                 * partition bigger than the max memory. */
+                if (forceVector  &&  memoryPartition >= memoryPoolSize)
+                {
+                    static const int EXCEED_FACTOR = 2;
+
+                    if (memoryPartition  < EXCEED_FACTOR*memoryPoolSize)
+                    {						
+                        /** We accept in this case to exceed the allowed memory. */
+                        memoryPoolSize = memoryPartition;
+                    }
+                    else
+                    {
+                        bool strict = false;
+
+                        if (strict)
+                        {
+                            /** We launch an exception. */
+                            throw Exception ("memory issue: %lld bytes required and %lld bytes available",
+                                memoryPartition, memoryPoolSize
+                            );
+                        }
+                        else
+                        {
+                            unsigned long system_mem = System::info().getMemoryPhysicalTotal();
+                            memoryPoolSize = memoryPartition; 
+
+                            if (memoryPoolSize > system_mem*0.95)
+                            {
+                                throw Exception ("memory issue: %lld bytes required, %lld bytes set by command-line limit, %lld bytes in system memory",
+                                    memoryPartition, memoryPoolSize, system_mem
+                                );
+                            }
+                            else
+                                cout << "Warning: memory was initially restricted to " << _config._max_memory << " MB, but we actually need to allocate " << memoryPoolSize / MBYTE << " MB due to a partition with " << pInfo.getNbSuperKmer(p) << " superkmers." << endl;
+                        }
+                    }
+                }
+
+               //if capa pool ==0, reserve max memo , pass pool to partibyvec, will be used  for vec kmers
+                if (pool.getCapacity() == 0)  {  pool.reserve (memoryPoolSize); }
+				else if (memoryPoolSize > pool.getCapacity()) { pool.reserve(0); pool.reserve (memoryPoolSize); }
+
+                /** Recall that we got the following matrix in _nbKmersPerPartitionPerBank
+                 *
+                 *           part0  part1  part2 ... partJ
+                 *   bank0    xxx    xxx    xxx       xxx
+                 *   bank1    xxx    xxx    xxx       xxx
+                 *    ...
+                 *   bankI    xxx    xxx    xxx       xxx
+                 *
+                 *   Now, for the current partition p, we want the number of items found for each bank.
+                 *
+                 *              bank0   bank1   ...   bankI
+                 *   offsets :   xxx     xxx           xxx
+                 */
+                vector<size_t> nbItemsPerBankPerPart;
+                if ( _config._solidityKind != KMER_SOLIDITY_SUM)
+                {
+                    for (size_t i=0; i<_nbKmersPerPartitionPerBank.size(); i++)
+                    {
+                        nbItemsPerBankPerPart.push_back (_nbKmersPerPartitionPerBank[i][p] - (i==0 ? 0 : _nbKmersPerPartitionPerBank[i-1][p]) );
+                    }
+                }
+
+				if ( _config._solidityKind == KMER_SOLIDITY_SUM)
+				{
+					cmd = new PartitionsByVectorCommand<span> (
+															   processorClone, cacheSize, _progress, _fillTimeInfo,
+															   pInfo, pass, p, _config._nbCores_per_partition, _config._kmerSize, pool, nbItemsPerBankPerPart,_superKstorage
+															   );
+				}
+				else
+				{
+					cmd = new PartitionsByVectorCommand_multibank<span> (
+															   (*_tmpPartitions)[p], processorClone, cacheSize, _progress, _fillTimeInfo,
+															   pInfo, pass, p, _config._nbCores_per_partition, _config._kmerSize, pool, nbItemsPerBankPerPart
+															   );
+				}
+
+            }
+
+            cmds.push_back (cmd);
+
+        } /* end of for (size_t j=0; j<currentNbCores... */
+
+        DEBUG (("\n"));
+
+        /** We launch the commands through a dispatcher. */
+        getDispatcher()->dispatchCommands (cmds, 0);
+
+        /** The N CountProcessor clones should have done their job during the 'dispatchCommands'
+         * We can send a notification about it and get rid of them. */
+        processor->finishClones (clones);
+        for (size_t i=0; i<clones.size(); i++)  { clones[i]->forget(); }  clones.clear();
+
+        // free internal memory of pool here
+        pool.free_all();
+    }
+	
+	
+	if(_config._solidityKind == KMER_SOLIDITY_SUM)
+		_superKstorage->closeFiles();
+
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+Partition<typename SortingCountAlgorithm<span>::Count>* SortingCountAlgorithm<span>::getSolidCounts  ()
+{
+    /** We look in the count processor a potential CountProcessorDump instance. */
+    for (size_t i=0; i<_processors.size(); i++)
+    {
+        CountProcessorDump<span>* p = _processors[i]->template get <CountProcessorDump<span> > ();
+        if (p != 0)  {  return p->getSolidCounts();  }
+    }
+
+    throw Exception ("SortingCountAlgorithm not configured with a CountProcessorDump instance");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+template<size_t span>
+struct Count2TypeAdaptor  {  typename Kmer<span>::Type& operator() (typename Kmer<span>::Count& c)  { return c.value; }  };
+
+template<size_t span>
+Iterable<typename SortingCountAlgorithm<span>::Type>* SortingCountAlgorithm<span>::getSolidKmers ()
+{
+    Iterable<Type>* result = 0;
+
+    tools::storage::impl::Partition<Count>* counts = getSolidCounts();
+
+    if (counts != 0) { result = new IterableAdaptor<Count,Type,Count2TypeAdaptor<span> > (*counts); }
+
+    return result;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.hpp b/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.hpp
new file mode 100644
index 0000000..b6937f8
--- /dev/null
+++ b/gatb-core/src/gatb/kmer/impl/SortingCountAlgorithm.hpp
@@ -0,0 +1,270 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file SortingCountAlgorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Counting kmers from a set of sequences
+ */
+
+#ifndef _SORTING_COUNT_ALGORITHM_HPP_
+#define _SORTING_COUNT_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/bank/api/IBank.hpp>
+#include <gatb/kmer/api/ICountProcessor.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+#include <gatb/kmer/impl/Configuration.hpp>
+#include <gatb/kmer/impl/PartiInfo.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Package for genomic databases management. */
+namespace kmer      {
+/** \brief Implementation for genomic databases management. */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Class performing the kmer counting (also known as 'DSK')
+ *
+ * This class does the real job of counting the kmers from a reads database.
+ *
+ * This is a template class whose template argument is the kind of integer used for
+ * kmers (integers on 64 bits, 128 bits, etc...)
+ *
+ * We define some template instantiations of this SortingCountAlgorithm; such an instantiation
+ * does the real job of kmers counting. By defining several instantiations, we allow
+ * to choose dynamically the correct class according to the user choice for kmer size
+ * (remember that initial Minia version had to be re-compiled for different kmer size).
+ *
+ * Actually, this class is mainly used in the debruijn::impl::Graph class as a first step for
+ * the de Bruijn graph creation.
+ */
+template<size_t span=KMER_DEFAULT_SPAN>
+class SortingCountAlgorithm : public gatb::core::tools::misc::impl::Algorithm
+{
+public:
+
+	/* Shortcuts. */
+    typedef typename Kmer<span>::Type                                       Type;
+    typedef typename Kmer<span>::ModelDirect                            ModelDirect;
+    typedef typename Kmer<span>::ModelCanonical                         ModelCanonical;
+#ifdef NONCANONICAL
+    typedef typename Kmer<span>::template ModelMinimizer <ModelDirect>   Model;
+#else
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   Model;
+#endif
+    typedef typename Kmer<span>::Count                                      Count;
+    typedef ICountProcessor<span> CountProcessor;
+
+    /** Constructor. Can be used as default constructor in no parameters are provided
+     * \param[in] params : parameters to be used for configuring the algorithm
+     */
+    SortingCountAlgorithm (tools::misc::IProperties* params = 0);
+
+    /** Constructor.
+     * \param[in] bank : input bank from which solid kmers are counted
+     * \param[in] params : parameters to be used for configuring the algorithm
+     */
+    SortingCountAlgorithm (
+        gatb::core::bank::IBank*  bank,
+        tools::misc::IProperties* params
+    );
+
+    /** Constructor.
+     * \param[in] bank : input bank from which solid kmers are counted
+     * \param[in] config : configuration information
+     * \param[in] repartitor : hash function for minimizers
+     * \param[in] processor : object that processes counts
+     */
+    SortingCountAlgorithm (
+        gatb::core::bank::IBank*     bank,
+        const Configuration&         config,
+        Repartitor*                  repartitor,
+        std::vector<CountProcessor*> processors,
+		tools::misc::IProperties* params
+
+    );
+
+    /** Destructor */
+    virtual ~SortingCountAlgorithm ();
+
+    /** operator=
+     * \param[in] s : object to be copied. */
+    SortingCountAlgorithm& operator= (const SortingCountAlgorithm& s);
+
+    /** Get an option parser for kmers counting parameters. Dynamic allocation, so must be released when no more used.
+     * \param[in] mandatory : tells whether an argument has to be mandatory
+     * \return an instance of IOptionsParser. */
+    static tools::misc::IOptionsParser* getOptionsParser (bool mandatory=true);
+
+    /** Get the default values defined in the default option parser.
+     * \return default properties. */
+    static tools::misc::IProperties* getDefaultProperties ();
+
+    /** Creates a default CountProcessor instance (ie. the default one used by DSK)
+     * \param[in] params : used for configuring the processor
+     * \param[in] dskStorage : storage for dumping [kmer,count] couples
+     * \param[in] otherStorage : used for histogram for instance
+     * \return a CountProcessor instance
+     */
+    static CountProcessor* getDefaultProcessor (
+        tools::misc::IProperties*       params,
+        tools::storage::impl::Storage*  dskStorage,
+        tools::storage::impl::Storage*  otherStorage = 0
+    );
+
+    /** Creates a vector holding the default CountProcessor configuration
+     * \param[in] params : used for configuring the processor
+     * \param[in] dskStorage : storage for dumping [kmer,count] couples
+     * \param[in] otherStorage : used for histogram for instance
+     * \return a vector of CountProcessor instances
+     */
+    static std::vector<ICountProcessor<span>*> getDefaultProcessorVector (
+        Configuration&                  config,
+        tools::misc::IProperties*       params,
+        tools::storage::impl::Storage*  dskStorage,
+        tools::storage::impl::Storage*  otherStorage = 0
+    );
+
+    /** Process the kmers counting. It is mainly composed of a loop over the passes, and for each pass :
+     *      1) we build the partition files then
+     *      2) we fill the solid kmers file from the partitions.
+     */
+    void  execute ();
+
+    /** Get the number of count processors associated to the object.
+     * \return number of processors. */
+    size_t getProcessorNumber() const { return _processors.size(); }
+
+    /** Getter for the CountProcessor to be used by the algorithm.
+     * \param[in] idx : index of the processor to be retrieved
+     * \return the processor
+     */
+    CountProcessor* getProcessor (size_t idx)  { return _processors[idx]; }
+
+    /** Setter for the CountProcessor to be used by the algorithm.
+     * \param[in] processor : the count processor to be used.
+     */
+    void addProcessor (CountProcessor* processor)  { processor->use(); _processors.push_back (processor); }
+
+    /** Get the iterable over the computed solid kmers.
+     * \return the solid kmers iterable. */
+    tools::storage::impl::Partition<Count>* getSolidCounts ();
+
+    /** Get the iterable over the computed solid kmers.
+     * \return the solid kmers iterable. */
+    tools::collections::Iterable<Type>* getSolidKmers   ();
+
+    /** Get the configuration object for the algorithm.
+     * \return the Configuration object. */
+    const kmer::impl::Configuration& getConfig() const { return _config; }
+
+    /* Get the storage instance (if any).
+     * \return the Storage instance. */
+    tools::storage::impl::Storage* getStorage () { return _storage; }
+
+    /** Get the repartitor instance, ie. the hash function built on minimizer information.
+     * \return the Repartitor instance
+     */
+    Repartitor* getRepartitor() { return _repartitor; }
+
+private:
+
+    /** Configuration of the objects used by the algorithm. */
+    void configure ();
+
+    /** Fill partition files (for a given pass) from a sequence iterator.
+     * \param[in] pass  : current pass whose value is used for choosing the partition file
+     * \param[in] itSeq : sequences iterator whose sequence are cut into kmers to be split.
+     */
+    void fillPartitions (size_t pass, gatb::core::tools::dp::Iterator<gatb::core::bank::Sequence>* itSeq, PartiInfo<5>& pInfo);
+
+    /** Fill the solid kmers bag from the partition files (one partition after another one).
+     * \param[in] solidKmers : bag to put the solid kmers into.
+     */
+    void fillSolidKmers (size_t pass, PartiInfo<5>& pInfo);
+
+    /** Fill the solid kmers bag from the partition files (one partition after another one).
+     * \param[in] solidKmers : bag to put the solid kmers into.
+     */
+    void fillSolidKmers_aux (ICountProcessor<span>* processor, size_t pass, PartiInfo<5>& pInfo);
+
+    /** */
+    std::vector <size_t> getNbCoresList (PartiInfo<5>& pInfo);
+
+    /** Handle on the configuration information. */
+    kmer::impl::Configuration _config;
+
+    /** Handle on the input bank. */
+    gatb::core::bank::IBank* _bank;
+    void setBank (gatb::core::bank::IBank* bank)  { SP_SETATTR(bank); }
+
+    /** Handle on the mininimizers hash function. */
+    Repartitor* _repartitor;
+    void setRepartitor (Repartitor* repartitor)  { SP_SETATTR(repartitor); }
+
+    /** Handle on the count processor object. */
+    std::vector<CountProcessor*> _processors;
+
+	
+    /** Handle on the progress information. */
+    gatb::core::tools::dp::IteratorListener* _progress;
+    void setProgress (gatb::core::tools::dp::IteratorListener* progress)  { SP_SETATTR(progress); }
+
+    /** Temporary partitions management. */
+    tools::storage::impl::Storage* _tmpPartitionsStorage;
+    void setPartitionsStorage (tools::storage::impl::Storage* tmpPartitionsStorage)  {  SP_SETATTR(tmpPartitionsStorage);  }
+
+    /** Temporary partitions management. */
+    tools::storage::impl::Partition<Type>* _tmpPartitions;
+    void setPartitions (tools::storage::impl::Partition<Type>* tmpPartitions)  {  SP_SETATTR(tmpPartitions);  }
+
+    /** Get the memory size (in bytes) to be used by each item.
+     * IMPORTANT : we may have to count both the size of Type and the size for the bank id. */
+    int getSizeofPerItem () const { return Type::getSize()/8 + ((_nbKmersPerPartitionPerBank.size()>1 && _config._solidityKind != tools::misc::KMER_SOLIDITY_SUM) ? sizeof(bank::BankIdType) : 0); }
+
+    tools::misc::impl::TimeInfo _fillTimeInfo;
+
+    BankStats _bankStats;
+
+    std::vector <std::vector<size_t> > _nbKmersPerPartitionPerBank;
+
+    tools::storage::impl::StorageMode_e _storage_type;
+    tools::storage::impl::Storage* _storage;
+    void setStorage (tools::storage::impl::Storage* storage)  { SP_SETATTR(storage); }
+	
+	
+	//superkmer efficient storage
+	tools::storage::impl::SuperKmerBinFiles* _superKstorage;
+	std::string _tmpStorageName_superK;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _SORTING_COUNT_ALGORITHM_HPP_ */
+
diff --git a/gatb-core/src/gatb/system/api/Exception.hpp b/gatb-core/src/gatb/system/api/Exception.hpp
new file mode 100644
index 0000000..4fdbdee
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/Exception.hpp
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Exception.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Operating System common abstraction.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IRESOURCE_HPP_
+#define _GATB_CORE_SYSTEM_IRESOURCE_HPP_
+
+/********************************************************************************/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <string>
+#include <sstream>
+#include <list>
+
+/********************************************************************************/
+namespace gatb      {
+/** \brief Core package of the GATP project.
+ *
+ * The gatb::core package holds all the fundamental packages needed for writing
+ * assembly algorithms.
+ *
+ * It holds some generic tools, like operating system abstraction, collections management or design patterns
+ * concerns. It also holds recurrent needs as reading genomic banks, handling kmers and so on.
+ */
+namespace core      {
+/** \brief Operating System abstraction layer */
+namespace system    {
+/********************************************************************************/
+
+ /** \brief Exception class for operating system failures
+  *
+  * This class is used in GATB-CORE for throwing typed exceptions.
+  */
+ class Exception
+ {
+ public:
+
+     /** Default constructor. */
+     Exception ()  {}
+
+     /** Constructor with some information in a "printf" way.
+      * \param[in] format : format of the message
+      * \param[in] ... : arguments for the format parameter
+      */
+     Exception (const char* format, ...)
+     {
+         va_list args;  va_start (args, format);  init (format, args);  va_end (args);
+     }
+
+     /** Returns the description message.
+      * \return the message
+      */
+     const char* getMessage () const  { return _message.c_str(); }
+
+ protected:
+
+     /** */
+     void init (const char* format, va_list args)
+     {
+         char buffer[256];
+         vsnprintf (buffer, sizeof(buffer), format, args);
+         _message.assign (buffer);
+     }
+
+     /** The informative message. */
+     std::string _message;
+ };
+
+ /********************************************************************************/
+
+ /** \brief Composite exception
+  *
+  * This class allows to build one exception message from the messages of several
+  * exceptions.
+  *
+  * It may be used for instance by the ThreadGroup class.
+  */
+ class ExceptionComposite : public Exception
+ {
+ public:
+
+	 /** Constructor
+	  * \param[in] exceptions : list of exceptions from which the composite message is built. */
+     ExceptionComposite (const std::list<Exception>& exceptions)
+     {
+         std::stringstream ss;
+         for (std::list<Exception>::const_iterator it = exceptions.begin(); it != exceptions.end(); it++)
+         {
+             ss << it->getMessage() << std::endl;
+         }
+         _message = ss.str();
+     }
+ };
+
+ /********************************************************************************/
+
+ /** \brief Exception class with information got from strerror_r
+  */
+ class ExceptionErrno : public Exception
+ {
+ public:
+
+    /** Constructor. The error message is built by calling strerror function.
+     * \param[in] format : printf-like prototype
+     */
+    ExceptionErrno (const char* format, ...)
+    {
+        va_list args;  va_start (args, format);  init (format, args);  va_end (args);
+
+        char* buffer = (char*) malloc (BUFSIZ);
+        if (buffer != NULL)
+        {
+            *buffer = 0;
+
+#ifdef __CYGWIN__
+            // strerror_r doesnt seem to be declared in cygwin
+            // "The strerror_r() function is similar to strerror(), but is thread safe."
+            strerror (errno, buffer, BUFSIZ);
+#else
+
+#if !defined(__linux__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE)) || !defined(__GLIBC__) // XSI-Compliant strerror_r
+            int ret_code = strerror_r (errno, buffer, BUFSIZ);
+            const char* ret_buffer = buffer;
+            if (ret_code == 0)
+#else // GNU's strerror_r might return a static string instead of filling buffer
+                const char* ret_buffer = strerror_r (errno, buffer, BUFSIZ);
+            if (ret_buffer != NULL)
+#endif
+#endif
+
+            {  _message += std::string(" (") + std::string(ret_buffer) + std::string(")");  }
+            free(buffer);
+        }
+    }
+ };
+
+ /********************************************************************************/
+
+ /** \brief Exception class for lack of implementation
+  */
+ class ExceptionNotImplemented : public Exception
+ {
+ public:
+
+     /** Constructor. */
+     ExceptionNotImplemented ()  {  _message = "NOT IMPLEMENTED";  }
+ };
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IRESOURCE_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/IFileSystem.hpp b/gatb-core/src/gatb/system/api/IFileSystem.hpp
new file mode 100644
index 0000000..2b42027
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/IFileSystem.hpp
@@ -0,0 +1,284 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IFileSystem.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Operating System abstraction for file system management.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IFILE_HPP_
+#define _GATB_CORE_SYSTEM_IFILE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+ namespace system   {
+/********************************************************************************/
+
+/** \brief Abstraction of what we need about file
+ *
+ *  We define here a few methods we need for handling files.
+ *
+ *  NOTE: deleting a IFile instance won't delete the file on the file system; one
+ *  should see IFile as a logical handle on a physical file.
+ */
+class IFile
+{
+public:
+
+    /** Tells whether the file is opened or not.
+     * \return open status.
+     */
+    virtual bool isOpen () = 0;
+
+    /** Tells whether or not we are at the end of a file.
+     *  \return true if we are at the end of the file, false otherwise.
+     */
+    virtual bool isEOF () = 0;
+
+    /** Locates the cursor into the file (similar to 'fseeko' functions)
+     * \param[in] offset : bytes number we want to go, relatively from the 'whence' paramater
+     * \param[in] whence : SEEK_SET, SEEK_END, or SEEK_CUR
+     * \return 0 if successful, -1 otherwise
+     */
+    virtual int seeko (u_int64_t offset, int whence) = 0;
+
+    /** Get the position in a file.
+     * \return the current position
+     */
+    virtual u_int64_t tell () = 0;
+
+    /** Get the currently pointed character in the file.
+     * \return the current character.
+     */
+    virtual int get () = 0;
+
+    /** Unget the currently pointed character in the file.
+     * \param[in] c : the current character.
+     * \return c on success, EOF on error
+     */
+    virtual int unget (int c) = 0;
+
+    /** Reads a line in the file.
+     *  \param[in] s : buffer where to put the read line.
+     *  \param[in] size : maximum number of characters to be read
+     *  \return the actual size of the read buffer (0 if nothing read)
+     */
+    virtual int gets (char* s, int size) = 0;
+
+    /** Writes a buffer (0 terminated) into the file with a new line.
+     *  \param[in] format : format of the data to be dumped into the file.
+     *  \param[in] ...    : arguments (as an ellipsis) to b dumped
+     */
+    virtual void print (const char* format, ...) = 0;
+
+    /** Reads a buffer from the file.
+     * \param[in] ptr : the buffer to be read
+     * \param[in] size : size of the buffer
+     * \param[in] nmemb : number of elements to be written
+     * \return number of  items successfully written */
+    virtual size_t fread (void* ptr, size_t size, size_t nmemb) = 0;
+
+    /** Writes a buffer into the file.
+     * \param[in] ptr : the buffer to be written
+     * \param[in] size : size of the buffer
+     * \param[in] nmemb : number of elements to be written
+     * \return number of  items successfully written */
+    virtual size_t fwrite (const void* ptr, size_t size, size_t nmemb) = 0;
+
+    /** Flush the file.
+     */
+    virtual void flush () = 0;
+
+    /** Get the size of a file.
+     * \return the size of the file.
+     */
+    virtual u_int64_t getSize () = 0;
+
+    /** Get the file URI
+     * \return the URI of the file */
+    virtual const std::string& getPath () const = 0;
+
+    /** Destructor. */
+    virtual ~IFile () {}
+};
+
+/********************************************************************************/
+
+/** \brief interface for some operations at file system level.
+ *
+ * This interface define a few operations like creating/deleting directories.
+ *
+ * It can provide information like the max number of files that can be used at the
+ * same time, or the available space at some location in the FFS.
+ *
+ * It also acts as a factory that creates IFile instances.
+ *
+ * \see IFile
+ */
+ class IFileSystem
+ {
+ public:
+
+     /** Alias type for a file system path. */
+     typedef std::string Path;
+
+     /** Return the maximum number of files that can be used at the same time.
+      * \return the max number of files. */
+     virtual size_t getMaxFilesNumber () = 0;
+
+     /** Return the available space at the location given by the provided path.
+      * \param[in] path : the location from where the space size is computed.
+      * \return the available size (in KBytes). */
+     virtual u_int64_t  getAvailableSpace (const Path& path) = 0;
+
+     /** Retrieve the current directory absolute path.
+      * \return the current directory to be retrieved.
+      */
+     virtual Path getCurrentDirectory () = 0;
+
+     /** Retrieve the directory of the provided name.
+      * \return the directory
+      */
+     virtual Path getDirectory (const Path& path) = 0;
+
+     /** Retrieve the default temporary directory absolute path.
+      * \return the temporary directory to be retrieved.
+      */
+     virtual Path getTemporaryDirectory () = 0;
+
+     /** Return the base of the URI
+      * \param[in] path : uri from which we want to extract the base name.
+      * \param[in] cutToFirstDot : by default, getBaseName("a.b.c.fq") = "a.b.c". If cutToFirstDot is true, will return just "a"
+      * \return the base name of the uri
+      */
+     virtual Path getBaseName (const Path& path, bool cutToFirstDot = false) = 0;
+
+     /** Return the canonical path to the given file, ie replace symbolic links or relative path.
+      * \param[in] file : the file we want the canonical path.
+      * \return the real path. */
+     virtual Path getRealPath (const Path& file) = 0;
+
+     /** Return the extension to the given file,
+      * \param[in] file : file
+      * \return extension */
+     virtual std::string getExtension (const Path& file) = 0;
+ 
+     /** Get a temporary file name. One may provide an argument; in such a case some prefix/suffix will
+      * be appended to this name in order to make it unique.
+      * \param[in] filename : file name (may be empty)
+      * \return a unique file name. */
+     virtual std::string getTemporaryFilename (const std::string& filename="") = 0;
+
+     /** Tells whether a file exists or not.
+      * \return true if file exists, false otherwise
+      */
+     virtual bool doesExist (const Path& path) = 0;
+
+     /** Tells whether a folder exists or not.
+      * \return true if folder exists, false otherwise
+      */
+     virtual bool doesExistDirectory (const Path& path) = 0;
+ 
+     /** Tells whether path is a folder that ends with a certain string
+      * \return true if folder ends with string, false otherwise
+      */
+     virtual bool isFolderEndingWith (const Path& path, const std::string &ending) = 0;
+
+     /** Return the size of the file given by the provided path.
+      * \param[in] path : the location from where the space size is computed.
+      * \return the available size (in Bytes). */
+     virtual u_int64_t  getSize (const Path& path) = 0;
+
+     /** Clear the file system cache. */
+     virtual int clearCache () = 0;
+
+     /** Create a directory for the provided path and mode.
+      * \param[in] path : path of the directory to be created.
+      * \param[in] mode : mode of creation (see 'mkdir' system function documentation). */
+     virtual int mkdir (const Path& path, u_int64_t mode) = 0;
+
+     /** Delete the entry given its path.
+      * \param[in] path : path of the entry to be removed from the file system. */
+     virtual int rmdir (const Path& path) = 0;
+
+     /** Delete the file given its path.
+      * \param[in] path : path of the file to be removed from the file system. */
+     virtual int remove (const Path& path) = 0;
+
+     /** Rename the provided uri
+      * \param[in] from : initial name.
+      * \param[in] to : final name. */
+     virtual int rename (const Path& from, const Path& to) = 0;
+
+     /** Iterates entries of a directory.
+      * \param[in] path : path of the directory to be iterated
+      * \param[in] callback : callback called for each found entry
+      * \param[in] data : private data given to the callback. */
+     virtual void iterate (const Path& path, void (*callback) (const Path& entry, void* data), void* data) = 0;
+
+     /** Get entries of a directory.
+      * \param[in] path : path of the explored directory */
+     virtual std::vector<Path> listdir(const Path& path) = 0;
+
+     /** Creates a new IFile instance (equivalent to 'fopen' function)
+      * \param[in] path : uri of the file to be opened.
+      * \param[in] mode : mode of the file (like fopen)
+      * \return instance of IFile, 0 otherwise.
+      */
+     virtual IFile* newFile (const Path& path, const char* mode) = 0;
+
+     /** Creates a new IFile instance (equivalent to 'fopen' function)
+      * \param[in] dirpath  : uri of the directory where the file is meant to be.
+      * \param[in] filename : name of the file
+      * \param[in] mode : mode of the file (like fopen)
+      * \return instance of IFile, 0 otherwise.
+      */
+     virtual IFile* newFile (const Path& dirpath, const Path& filename, const char* mode) = 0;
+
+     /** Get metadata associated with the file for a given key.
+      * \param[in] filename : name of the file.
+      * \param[in] key : key for which we want the value
+      * \param[in] value : value associated to the key
+      * \return -1 if KO, 0 otherwise, otherwise length of the retrieved value. */
+     virtual ssize_t getAttribute (const Path& filename, const char* key, std::string& value) = 0;
+
+     /** Set metadata associated with the file for a given key.
+      * \param[in] filename : name of the file.
+      * \param[in] key : key for which we want the value
+      * \param[in] fmt : format of the string (in the 'printf' way)
+      * \param[in] ... : paramters for the format parameter
+      * \return -1 if error, 0 otherwise. */
+     virtual ssize_t setAttribute (const Path& filename, const char* key, const char* fmt, ...) = 0;
+
+     /** Destructor. */
+     virtual ~IFileSystem () {}
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IFILE_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/IMemory.hpp b/gatb-core/src/gatb/system/api/IMemory.hpp
new file mode 100644
index 0000000..633021d
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/IMemory.hpp
@@ -0,0 +1,169 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IMemory.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation of an abstraction for dynamic memory allocation.
+ *
+ * We define abstraction for malloc,realloc... functions. Note that failures
+ * during execution of the methods should throw a specific exception.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMEMORY_HPP_
+#define _GATB_CORE_SYSTEM_IMEMORY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/********************************************************************************/
+
+//GR : enum type is int (caused dsk bug) , switching to u_int64_t
+
+/** Constant of 2^10 for KByte */
+const u_int64_t  KBYTE = (1ULL << 10);
+
+/** Constant of 2^20 for MByte */
+const u_int64_t  MBYTE = (1ULL << 20);
+
+/** Constant of 2^30 for GByte */
+const u_int64_t  GBYTE = (1ULL << 30);
+
+/********************************************************************************/
+
+/** \brief Interface providing methods for dynamic allocation.
+ *
+ *  This interface provides most common methods for creating/deleting dynamic allocation buffers.
+ */
+class IMemoryAllocator
+{
+public:
+
+    /************************************************************/
+    /** Alias for the size of memory blocks handled by the interface.  */
+    typedef u_int64_t BlockSize_t;
+
+    /** Alias for the size of memory handled by the interface.  */
+    typedef u_int64_t TotalSize_t;
+
+    /************************************************************/
+    /** See malloc documentation. */
+    virtual void* malloc  (BlockSize_t size) = 0;
+
+    /** See calloc documentation. */
+    virtual void* calloc  (size_t nmemb, BlockSize_t size) = 0;
+
+    /** See realloc documentation. */
+    virtual void* realloc (void *ptr, BlockSize_t size) = 0;
+
+    /** See free documentation. */
+    virtual void  free    (void *ptr) = 0;
+
+    /************************************************************/
+    /** Destructor. */
+    virtual ~IMemoryAllocator () {}
+};
+
+/********************************************************************************/
+
+/** \brief Interface providing methods for manipulating memory blocks
+ *
+ *  This interface provides most common methods for setting/copying/comparing buffers.
+ */
+class IMemoryOperations
+{
+public:
+
+    /** Same as memset from <string.h> */
+    virtual void* memset (void* s, int c, size_t n) = 0;
+
+    /** Same as memcpy from <string.h> */
+    virtual void* memcpy (void* dest, const void* src, size_t n) = 0;
+
+    /** Same as memcpy from <string.h> */
+    virtual int memcmp (const void* s1, const void* s2, size_t n) = 0;
+
+    /************************************************************/
+    /** Destructor. */
+    virtual ~IMemoryOperations () {}
+};
+
+/********************************************************************************/
+
+/** \brief Interface providing methods for dynamic allocation and memory statistics
+ *
+ *  This interface provides most common methods for creating/deleting dynamic allocation buffers.
+ *
+ *  It also provides information about its inner state (current memory usage, maximum reached).
+ *
+ *  Specific implementations could be:
+ *      - system allocator (ie. functions from stdlib.h)
+ *      - allocator with a maximum allowed total size
+ *      - etc...
+ */
+class IMemory : public IMemoryAllocator, public IMemoryOperations
+{
+public:
+
+    /** Get the number of currently allocated memory blocks.
+     * \return the number of allocated blocks. */
+    virtual size_t getNbBlocks () = 0;
+
+    /** Get the memory usage by the current process.
+     * \return the memory usage (in bytes). */
+    virtual TotalSize_t getCurrentUsage () = 0;
+
+    /** Get the maximum reached size.
+     * \return the maximum used memory (in bytes). */
+    virtual TotalSize_t getMaximumUsage () = 0;
+
+    /************************************************************/
+    /** Destructor. */
+    virtual ~IMemory () {}
+};
+
+/********************************************************************************/
+
+/** \brief Interface providing methods for getting memory usage by a component
+ *
+ *  This interface provides getters to know the amount of memory used by some object.*/
+class IMemoryComponent
+{
+public:
+
+    /** Get the number of bytes used by the component.
+     * \return the memory size in bytes. */
+    virtual u_int64_t getMemorySize () = 0;
+
+    /************************************************************/
+    /** Destructor. */
+    virtual ~IMemoryComponent () {}
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMEMORY_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/ISmartPointer.hpp b/gatb-core/src/gatb/system/api/ISmartPointer.hpp
new file mode 100644
index 0000000..0e70033
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/ISmartPointer.hpp
@@ -0,0 +1,270 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ISmartPointer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Smart Pointer Design Pattern interface
+ *
+ *  Define tools for easing life cycle of objects. Also known as smart pointer.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_SMART_POINTER_HPP_
+#define _GATB_CORE_SYSTEM_SMART_POINTER_HPP_
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/********************************************************************************/
+
+/** \brief Tool for managing instances life cycle
+ *
+ *  The goal of this class is to share easily objects between clients.
+ *
+ *  This class has an integer attribute that acts as a reference counter, i.e. a
+ *  token counting how many clients are interested by the instance.
+ *
+ *  This is useful for sharing instances; if a client is interested by using an
+ *  instance 'obj', she/he may call 'obj->use()' which will increase the internal
+ *  token number. When the client is no more interested by using the instance 'obj',
+ *  she/he may call 'obj->forget()', which will decrease the internal token.
+ *
+ *  When the token becomes 0, the instance is automatically destroyed.
+ *
+ *  Note that use() and forget() are virtual; it may happen (for singleton management
+ *  for instance) that some subclass needs to refine them.
+ *
+ *  This pattern is often known as Smart Pointer.
+ *
+ *  Note that the STL provides its own smart pointer mechanism, known as auto_ptr.
+ *  Here, our approach relies on subclassing instead of template use. The interest of our
+ *  approach is to ease methods prototypes writing; with STL approach, one needs to uses
+ *  every time auto_ptr<T> instead of only T, which can lower the readability.
+ *
+ *  On the other hand, our approach may be a little more dangerous than the STL approach
+ *  since one has to be sure to forget an instance when needed. In our case, we use Smart
+ *  Pointers mainly for attributes in class, so only have to be careful in constructors
+ *  and destructors. Moreover, one can use the SP_SETATTR macro which eases this process.
+ *  Note also the LOCAL macro that eases the local usage of an instance.
+ *
+ *  \see SP_SETATTR
+ *  \see LOCAL
+ */
+class ISmartPointer
+{
+public:
+
+    /** Destructor. */
+    virtual ~ISmartPointer () {}
+
+    /** Use an instance by taking a token on it */
+    virtual void use () = 0;
+
+    /** Forget an instance by releasing a token on it */
+    virtual void forget () = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of the ISmartPointer interface
+ *
+ * This class implements also a security against concurrent access by several clients acting
+ * from different threads. This is achieved by using intrinsics __sync_fetch_and_add and
+ * __sync_fetch_and_sub in use and forget respectively.
+ *
+ * This class can't be instantiated since its default constructor is protected.
+ *
+ *  \see SP_SETATTR
+ *  \see LOCAL
+ */
+class SmartPointer : public virtual ISmartPointer
+{
+public:
+    /** \copydoc ISmartPointer::use */
+    void use    ()
+    {
+        __sync_fetch_and_add (&_counterRef, 1 );
+        // DON'T DO _counterRef++  because possible real time issues...
+    }
+
+    /** \copydoc ISmartPointer::forget */
+    void forget ()
+    {
+        __sync_fetch_and_sub (&_counterRef, 1 );
+        // DON'T DO _counterRef--  because possible real time issues...
+
+        if (_counterRef<=0)  { delete this; }
+    }
+
+protected:
+
+    /** Constructor. */
+    SmartPointer () : _counterRef(0)  {}
+
+    /** Destruction of the instance will be automatically called when the reference counter becomes null.
+     *  The destructor is private in order to avoid to directly delete the instance without using the
+     *  'use/forget' mechanism.
+     */
+    virtual ~SmartPointer ()  {}
+
+private:
+    /** Counts the number of references of the instance.*/
+    int _counterRef;
+};
+
+/********************************************************************************/
+
+/** \brief Local usage of SmartPointer instance.
+ *
+ * Small utility for locally getting a reference on a smart pointer. It creates
+ *  a local (ie created in the execution stack) object that takes a reference on
+ *  a smart pointer and get rid of it when the execution is out of the statements
+ *  block holding the local object.
+ *
+ *  Note that the LocalObject class is very close to the std::auto_ptr. The first
+ *  one uses inheritance, the second uses templates.
+ *
+ *  Sample:
+ *  \code
+ *  void foo ()
+ *  {
+ *     {
+ *        // we create an instance of a class that inherits from SmartPointer and link it to a LocalObject
+ *        LocalObject object (new MyClass ());
+ *
+ *        // we can access the referenced instance
+ *        object.getPtr ();
+ *     }
+ *
+ *     // Here, the MyClass instance should have been automatically deleted.
+ *  }
+ *  \endcode
+ *
+ *  \see LOCAL
+ */
+class LocalObject
+{
+public:
+    /** Constructor.
+     * \param[in] ptr : the instance we want locally manage.
+     */
+    LocalObject (ISmartPointer* ptr) : _ptr(ptr)  { if (_ptr)  {  _ptr->use();  } }
+
+    /** Destructor. */
+    ~LocalObject () { if (_ptr)  {  _ptr->forget ();  } }
+
+    /** Getter on the referenced instance.
+     * \return the referenced SmartPointer instance. */
+    ISmartPointer* getPtr ()  { return _ptr; }
+
+private:
+    /** The SmartPointer instance we want local life cycle management. */
+    ISmartPointer* _ptr;
+};
+
+/********************************************************************************/
+
+/** Macro that creates an instance of type LocalObject whose name is the prefix '__' followed by the provided argument.
+ *
+ *  Sample:
+ *  \code
+ *  void foo ()
+ *  {
+ *     {
+ *        // we create an instance of a class that inherits from SmartPointer
+ *        MyClass* object = new MyClass ();
+ *
+ *        // we want that this object lives only inside the including statements block.
+ *        // note that we use the LOCAL macro
+ *        LOCAL (object);
+ *     }
+ *
+ *     // Here, the object should have been automatically deleted.
+ *  }
+ *  \endcode
+ *
+ *  \see LocalObject
+ */
+#define LOCAL(object)  gatb::core::system::LocalObject __##object (object)
+
+/** Macro that generates an instructions block that manages life cycle of a class attributes.
+ *  It is dedicated to simply write clever setter methods.
+ *
+ * As a convention, the attribute name must begin by an underscore. Then the provided argument here
+ * is the attribute name without this leading underscore.
+ *
+ * A typical use of this macro is the following:
+ * \li in the constructor, use the default initialization of the attribute as 0
+ * \li in the constructor body, use the smart setter with a provided argument
+ * \li in the destructor body, use the smart setter with null argument.
+ * \li in the private (or protected) part, defines a smart setter for the attribute by using the SP_SETATTR macro
+ *
+ * Sample of code:
+ *  \code
+ *  class MyClass
+ *  {
+ *  public:
+ *       MyClass (SomeSmartPointerClass* ptr) : _ptr(0)  { setPtr (ptr); }
+ *      ~MyClass ()  { setPtr (0); }
+ *  private:
+ *      SomeSmartPointerClass* _ptr;
+ *      void setPtr (SomeSmartPointerClass* ptr)  { SP_SETATTR(ptr); }
+ *  };
+ *  \endcode
+ *
+ *  \see SmartPointer
+ */
+#define SP_SETATTR(a)  \
+{  \
+    if (_##a == a)  { return;  }   /* just to be sure that we don't reuse the same object */  \
+    if (_##a != 0)  {  _##a->forget (); } \
+    _##a = a; \
+    if (_##a != 0)  {  _##a->use    (); } \
+}
+
+/********************************************************************************/
+
+class SmartObject
+{
+public:
+
+    SmartObject (ISmartPointer* ref=0) : _ref(0)  { setRef(ref); }
+
+    virtual ~SmartObject ()  { setRef(0); }
+
+    SmartObject (const SmartObject& o) : _ref(0)  { setRef(o._ref); }
+
+    SmartObject& operator= (const SmartObject& o)  {  if (this != &o)  {  setRef (o._ref);  }  return *this; }
+
+    void setRef (ISmartPointer* ref)  {  SP_SETATTR(ref); }
+    ISmartPointer* getRef ()  {  return _ref; }
+
+    bool hasRef () const { return _ref != 0; }
+
+private:
+
+    ISmartPointer* _ref;
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_SMART_POINTER_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/ISystemInfo.hpp b/gatb-core/src/gatb/system/api/ISystemInfo.hpp
new file mode 100644
index 0000000..7979681
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/ISystemInfo.hpp
@@ -0,0 +1,136 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ISystemInfo.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface providing information about the operating system
+ */
+
+#ifndef _GATB_CORE_SYSTEM_ISYSTEM_INFO_HPP_
+#define _GATB_CORE_SYSTEM_ISYSTEM_INFO_HPP_
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/********************************************************************************/
+
+/** \brief Interface providing some general information about the system.
+ */
+class ISystemInfo
+{
+public:
+
+    /** Returns the version of the library.
+     * \return the version. */
+    virtual std::string getVersion () const = 0;
+
+    /** Returns the date of the library generation.
+     * \return the generation date. */
+    virtual std::string getBuildDate () const = 0;
+
+    /** Returns the compiler name
+     * \return the compiler name. */
+    virtual std::string getBuildCompiler () const = 0;
+
+    /** Returns the compilation options
+     * \return the compilation options. */
+    virtual std::string getBuildOptions () const = 0;
+
+    /** Returns the operating system name used for the library generation
+     * \return the os name. */
+    virtual std::string getBuildSystem () const = 0;
+
+    /** Returns the number of available cores.
+     * \return the number of cores. */
+    virtual size_t getNbCores () const = 0;
+
+    /** Returns the host name.
+     * \return the host name. */
+    virtual std::string getHostName () const = 0;
+
+    /** Returns home directory.
+     * \return the home directory uri. */
+    virtual std::string getHomeDirectory () const = 0;
+
+    /** Get the size (in bytes) of the physical memory
+     * \return the physical memory size */
+    virtual u_int64_t getMemoryPhysicalTotal () const = 0;
+
+    /** Get the size (in bytes) of the used physical memory
+     * \return the used physical memory size */
+    virtual u_int64_t getMemoryPhysicalUsed () const = 0;
+
+    /** Get the size (in bytes) of the free physical memory
+     * \return the free physical memory size */
+    virtual u_int64_t getMemoryPhysicalFree () const = 0;
+
+    /** Get a memory size (NOTE: in MBytes) for executing a program.
+     * It may be the whole physical memory, some part of it or a constant size.
+     * \return the project memory size */
+    virtual u_int64_t getMemoryProject () const = 0;
+
+    /** Get the size (in bytes) of the buffers memory
+     * \return the buffers memory size */
+    virtual u_int64_t getMemoryBuffers () const = 0;
+
+    /** Get the size (in KBytes) of the memory used by the current process
+     * \return the memory value */
+    virtual u_int64_t getMemorySelfUsed() const = 0;
+
+    /** Get the size (in KBytes) of the max memory used by the current process
+     * \return the memory value */
+    virtual u_int64_t getMemorySelfMaxUsed() const = 0;
+
+    /** Destructor. */
+    virtual ~ISystemInfo ()  {}
+
+    /********************************************************************************/
+
+    /** \brief Interface providing a way to get CPU usage information
+     */
+    class CpuInfo : public SmartPointer
+    {
+    public:
+
+        /** Start CPU information acquisition. */
+        virtual void start () = 0;
+
+        /** Stop CPU information acquisition. */
+        virtual void stop () = 0;
+
+        /** Get the CPU usage between start and stop. */
+        virtual double getUsage() = 0;
+    };
+
+    /** Create a CpuInfo object
+     * \return the created object. */
+    virtual CpuInfo* createCpuInfo () = 0;
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_ISYSTEM_INFO_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/IThread.hpp b/gatb-core/src/gatb/system/api/IThread.hpp
new file mode 100644
index 0000000..04fc2cf
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/IThread.hpp
@@ -0,0 +1,235 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IThread.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface for threads
+ */
+
+#ifndef _GATB_CORE_SYSTEM_ITHREAD_HPP_
+#define _GATB_CORE_SYSTEM_ITHREAD_HPP_
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/api/Exception.hpp>
+#include <string>
+#include <list>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/********************************************************************************/
+
+/** Forward declarations. */
+class ISynchronizer;
+
+/********************************************************************************/
+
+/** \brief Define what a thread is.
+ *
+ * Definition of a thread in an OS independent fashion. See below how to create a thread through a factory.
+ */
+class IThread : virtual public ISmartPointer
+{
+public:
+
+    /** We define a Id type. */
+    typedef long long Id;
+
+    /** Wait the end of the thread. */
+    virtual Id getId () const = 0;
+
+    /** Wait the end of the thread. */
+    virtual void join () = 0;
+
+    /** Destructor. */
+    virtual ~IThread () {}
+};
+
+/********************************************************************************/
+
+/** \brief Interface that defines a group of threads
+ *
+ * This interface allows to manage a group of threads; it may be
+ * used to access a shared object by different threads.
+ *
+ * This class is not intended to be used by end users; instead, the
+ * ThreadObject class can be used.
+ */
+class IThreadGroup : virtual public ISmartPointer
+{
+public:
+
+    struct Info : public SmartPointer
+    {
+        Info (IThreadGroup* group, void* data, size_t idx) : group(group), data(data), idx(idx) {}
+        IThreadGroup* group;
+        void*         data;
+        size_t        idx;
+    };
+
+    /** Destructor */
+    virtual ~IThreadGroup () {}
+
+    /** Add a thread to the group. A thread is created and the provided
+     * mainloop is launched as the main function of this thread.
+     * \param[in] mainloop : mainloop of the added thread.
+     * \param[in] data : data to be given to the main loop
+     */
+    virtual void add (void* (*mainloop) (void*), void* data) = 0;
+
+    /** Start all the threads of the group at the same time. Implementations
+     * should ensure this by some synchronization mechanism. */
+    virtual void start () = 0;
+
+    /** Get the synchronizer associated to this threads group.
+     * \return the ISynchronizer instance. */
+    virtual ISynchronizer* getSynchro() = 0;
+
+    /** Get the number of threads in the group.
+     * \return the number of threads */
+    virtual size_t size() const = 0;
+
+    /** Get the ith thread of the group.
+     * \param[in] idx : index of the thread in the group
+     * \return the thread */
+    virtual IThread* operator[] (size_t idx) = 0;
+
+    /** This method is used to gather exceptions occurring during the
+     * execution of the threads of the group. By doing this, we can
+     * launch an ExceptionComposite when all the threads of the group
+     * are finished.
+     * \param[in] e : exception thrown by one of the thread. */
+    virtual void addException (system::Exception e) = 0;
+
+    /** Tells whether or not exceptions have been added to the thread group.
+     * \return true if some exception has been added, false otherwise */
+    virtual bool hasExceptions() const = 0;
+
+    /** Get an exception that holds all the information of exceptions that have
+     * occurred during the execution of the threads of the group.
+     * \return the gathering exception. */
+    virtual Exception getException () const = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Define a synchronization abstraction
+ *
+ *  This is an abstraction layer of what we need for handling synchronization.
+ *  Actual implementations may use mutex for instance.
+ */
+class ISynchronizer : virtual public ISmartPointer
+{
+public:
+
+    /** Lock the synchronizer. */
+    virtual void   lock () = 0;
+
+    /** Unlock the synchronizer. */
+    virtual void unlock () = 0;
+
+    /** Destructor. */
+    virtual ~ISynchronizer () {}
+};
+
+/********************************************************************************/
+
+/** \brief Factory that creates IThread instances.
+ *
+ *  Thread creation needs merely the main loop function that will be called.
+ *
+ *  Note the method that can return the number of cores in case a multi-cores
+ *  architecture is used. This is useful for automatically configure tools for
+ *  using the maximum number of available cores for speeding up the algorithm.
+ */
+class IThreadFactory
+{
+public:
+
+    /** Creates a new thread.
+     * \param[in] mainloop : the function the thread shall execute
+     * \param[in] data :  data provided to the mainloop when launched
+     * \return the created thread.
+     */
+    virtual IThread* newThread (void* (*mainloop) (void*), void* data) = 0;
+
+    /** Creates a new synchronization object.
+     * \return the created ISynchronizer instance
+     */
+    virtual ISynchronizer* newSynchronizer (void) = 0;
+
+    /** Return the id of the calling thread. */
+    virtual IThread::Id getThreadSelf() = 0;
+
+    /** Return the id of the current process. */
+    virtual u_int64_t getProcess () = 0;
+
+    /** Destructor. */
+    virtual ~IThreadFactory ()  {}
+};
+
+/********************************************************************************/
+
+/** \brief Tool for locally managing synchronization.
+ *
+ *  Instances of this class reference a ISynchronizer instance. When created, they lock
+ *  their referred ISynchronizer and when destroyed, they unlock it.
+ *
+ *  For instance, it is a convenient way to lock/unlock a ISynchronizer instance in the scope
+ *  of a statements block (where the LocalSynchronizer instance lives), a particular case being
+ *  the statements block of a method.
+ *
+ *  Code sample:
+ *  \code
+ *  void sample (ISynchronizer* synchronizer)
+ *  {
+ *      // we create a local synchronizer from the provided argument
+ *      LocalSynchronizer localsynchro (synchronizer);
+ *
+ *      // now, all the statements block is locked for the provided synchronizer
+ *      // in other word, this sample function is protected against concurrent accesses.
+ *  }
+ *  \endcode
+ */
+class LocalSynchronizer
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : the ISynchronizer instance to be controlled.
+     */
+    LocalSynchronizer (ISynchronizer* ref) : _ref(ref)  {  if (_ref)  { _ref->lock (); }  }
+
+    /** Destructor. */
+    ~LocalSynchronizer ()  {  if (_ref)  {  _ref->unlock (); } }
+
+private:
+
+    /** The referred ISynchronizer instance. */
+    ISynchronizer* _ref;
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_ITHREAD_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/ITime.hpp b/gatb-core/src/gatb/system/api/ITime.hpp
new file mode 100644
index 0000000..8571c19
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/ITime.hpp
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ITime.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface for time retrieval.
+ *
+ * This is mainly used for debug/statistical information.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_ITIME_HPP_
+#define _GATB_CORE_SYSTEM_ITIME_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/********************************************************************************/
+
+/** \brief Interface that provides methods returning time information.
+ *
+ * This interface mainly defines an operation that returns a time stamp, according to
+ * the beginning of the current process.
+ *
+ * The unit of the returned value may depend on the implementation. It could be second,
+ * millisecond and so on, or we can also use a unit independent of time, like the number
+ * of CPU cycles, which may be interesting for comparing the same test on different machines
+ * with different clock frequencies.
+ */
+class ITime
+{
+public:
+
+    /** \brief enumeration defining time units */
+    enum Unit
+    {
+        USEC      = 1000000, // 10-6 second
+        MSEC      = 1000,    // 10-3 second
+        SEC       = 1,       // 10-0 second
+        UNDEFINED = ~0
+    };
+
+    /** Alias for the possible values for time stamping. Note that we use a large integer because we may have huge values
+     * in case we use the CPUCLOCK unit (for instance, value=2000000000 for one second with CPU frequency of 2 GHz). */
+    typedef u_int64_t Value;
+
+    /** Returns a time stamp, ie the number of time atoms (depending on chosen time unit) since some define T0 time. Such
+     * a starting time can be the 01.01.1970 for instance, or the beginning of the process. It implies that clients should
+     * be interested not in the absolute value returned by the method but by the distance between two such values.
+     * \return elapsed time atoms number.
+     */
+    virtual Value getTimeStamp() = 0;
+
+    /** \return the time unit used by getTimeStamp. */
+    virtual Unit getUnit () = 0;
+
+    /** Get a string holding information about the current date.
+     * \return the formatted date string. */
+    virtual std::string getDateString () = 0;
+
+    /** Destructor. */
+    virtual ~ITime () {}
+};
+
+/********************************************************************************/
+} } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_ITIME_HPP_ */
diff --git a/gatb-core/src/gatb/system/api/build_info.hpp.in b/gatb-core/src/gatb/system/api/build_info.hpp.in
new file mode 100644
index 0000000..51e5946
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/build_info.hpp.in
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/* WARNING:
+ * Every source file including this header will be recompiled unconditionally
+ */
+#define STR_LIBRARY_VERSION     "${gatb-core-version}"
+#define STR_COMPILATION_DATE    "${gatb-core-date}"
+#define STR_COMPILATION_FLAGS   "${gatb-core-flags}"
+#define STR_COMPILER            "${CMAKE_C_COMPILER}  (${CMAKE_CXX_COMPILER_VERSION})"
+#define STR_OPERATING_SYSTEM    "${CMAKE_SYSTEM}"
diff --git a/gatb-core/src/gatb/system/api/config.hpp.in b/gatb-core/src/gatb/system/api/config.hpp.in
new file mode 100644
index 0000000..dd2724c
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/config.hpp.in
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#define INT128_FOUND            ${INT128_FOUND}
+
+#define KSIZE_LIST    ${KSIZE_STRING_COMMA}
+#define KSIZE_STRING "${KSIZE_STRING_SPACE}"
+
+#define KSIZE_LIST_TYPE  ${KSIZE_STRING_TYPE}
+
+#ifdef GATB_USE_CUSTOM_ALLOCATOR
+    #define CUSTOM_MEM_ALLOC  1
+#else
+    #define CUSTOM_MEM_ALLOC  0
+#endif
+
+#define GATB_HDF5_NB_ITEMS_PER_BLOCK (4*1024)
+#define GATB_HDF5_CLEANUP_WORKAROUND 4
diff --git a/gatb-core/src/gatb/system/api/config_sha1.hpp b/gatb-core/src/gatb/system/api/config_sha1.hpp
new file mode 100644
index 0000000..53b6591
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/config_sha1.hpp
@@ -0,0 +1 @@
+#define STR_GIT_SHA1 "notset"
diff --git a/gatb-core/src/gatb/system/api/types.hpp b/gatb-core/src/gatb/system/api/types.hpp
new file mode 100644
index 0000000..fbbeb70
--- /dev/null
+++ b/gatb-core/src/gatb/system/api/types.hpp
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file types.hpp
+ *  \brief types definition for GATB.
+ *  \date 01/03/2013
+ *  \author edrezen
+ *
+ *   We define here some types used throughout the code.
+ *
+ *   Important: we define typedefs such as int16_t or u_int64_t. It is a good idea to use such typedefs
+ *   instead of direct 'unsigned long' or 'short' for instance, because the actual number of used bytes
+ *   may depend on the operating system/architecture. Using u_int32_t for instance ensure that we get
+ *   an unsigned integer on 4 bytes.
+ *
+ *   Note that we use the <sys/types.h> file on Linux and MacOs. Such file may not exist on Windows (on Mingw
+ *   to be more precise), so we propose here a definition. This is not perfect and should be improved.
+ */
+
+/********************************************************************************/
+
+#ifndef _GATB_CORE_SYSTEM_TYPES_HPP_
+#define _GATB_CORE_SYSTEM_TYPES_HPP_
+
+/********************************************************************************/
+
+#include <sys/types.h>
+#include <vector>
+
+/********************************************************************************/
+
+/** We define a type for counting kmer occurrence. */
+typedef int32_t CountNumber;
+
+/** We define a type for a vector holding kmer counts. */
+typedef std::vector<CountNumber> CountVector;
+
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_TYPES_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/FileSystemCommon.cpp b/gatb-core/src/gatb/system/impl/FileSystemCommon.cpp
new file mode 100644
index 0000000..0596566
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemCommon.cpp
@@ -0,0 +1,341 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/FileSystemCommon.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <sys/resource.h>
+#include <sys/statvfs.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <libgen.h>
+
+#include <string>
+#include <sstream>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int64_t  FileSystemCommon::getAvailableSpace (const Path& path)
+{
+    struct statvfs buffer;
+
+    statvfs (path.c_str(), &buffer);
+
+    u_int64_t available = (buffer.f_bavail * buffer.f_bsize) / 1024;
+
+    return available;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFileSystem::Path FileSystemCommon::getCurrentDirectory ()
+{
+    char path[1000];
+    char* buffer = getcwd (path, sizeof(path));
+
+    if (buffer == 0)  {  throw ExceptionErrno ("unable to get current directory");  }
+
+    return path;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFileSystem::Path FileSystemCommon::getDirectory (const Path& path)
+{
+     size_t pos = path.find_last_of("\\/");
+     return (std::string::npos == pos)  ? "."  : path.substr(0, pos);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFileSystem::Path FileSystemCommon::getTemporaryDirectory ()
+{
+    const char* dir = 0;
+
+         if ( (dir = getenv ("TMPDIR"))  != 0)  {  return dir;    }
+    else if ( (dir = getenv ("TMP"))     != 0)  {  return dir;    }
+    else if ( (dir = getenv ("TEMPDIR")) != 0)  {  return dir;    }
+    else                                        {  return "/tmp"; }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : Warning! this method isn't exactly basename() as you'd expect in C++. It returns the base name but cuts everything after the last dot.
+*********************************************************************/
+IFileSystem::Path FileSystemCommon::getBaseName (const Path& path, bool cutToFirstDot)
+{
+    /** We duplicate the provided path. */
+    char* reads_path = strdup (path.c_str());
+
+    /** We build the basename; it still may have a suffix. */
+    std::string reads_name (basename(reads_path)); // posix basename() may alter reads_path
+
+    /** We release the duplicated path. */
+    free (reads_path);
+
+	//string prefix = System::file().getBaseName(_inputFilename);;
+	while (reads_name.find('.') != string::npos){ // make sure there is a dot in the file, else the basename is the file itself
+
+	    /** We look for the beginnin of the suffix. */
+		int lastindex = reads_name.find_last_of(".");
+
+	    /** We build the result. */
+		reads_name = reads_name.substr(0, lastindex);
+
+        if (cutToFirstDot == false)
+            break;
+	}
+
+    //int lastindex = reads_name.find_last_of (".");
+    //Path result = reads_name.substr(0, lastindex);
+
+    /** We return the base name, without suffix. */
+    return reads_name;
+}
+
+
+std::string FileSystemCommon::getExtension(const Path &path)
+{
+    std::string spath = string(path.c_str());
+    return spath.substr(spath.find_last_of(".") + 1);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFileSystem::Path FileSystemCommon::getRealPath (const Path& file)
+{
+    /** We must use a big buffer. Previously was 1024 but we got crashes on
+     * the CI server with this value... */
+    char buf [4*1024];
+
+    if (realpath (file.c_str(), buf) != 0)
+    {
+        return buf;
+    }
+    throw Exception ("Unable to get the real path for '%s'", file.c_str());
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+string FileSystemCommon::getTemporaryFilename (const std::string& filename)
+{
+    stringstream ss;
+    ss << tmp_prefix() << "_" << System::thread().getProcess();
+    if (filename.empty()==false)  { ss << "_" << filename; }
+    return ss.str();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool FileSystemCommon::doesExist (const Path& path)
+{
+    FILE* fp = fopen (path.c_str(), "rb");
+
+   if (fp != NULL)
+   {
+       fclose (fp);
+       return true;
+   }
+   else
+   {
+       return false;
+   }
+}
+
+bool FileSystemCommon::doesExistDirectory (const Path& path)
+{
+   DIR* dir = opendir(path.c_str());
+   if (dir)
+   {
+           /* Directory exists. */
+           closedir(dir);
+           return true;
+   }
+   return false;
+}
+
+
+bool FileSystemCommon::isFolderEndingWith (const Path& path, const std::string &ending)
+{
+    if (!doesExistDirectory(path))
+        return false;
+
+    // strip '/' at end of path
+    std::string path_without_slashes = path;
+   if (path_without_slashes.length() > 0)
+   {
+       std::string::iterator it = path_without_slashes.end() - 1;
+       if (*it == '/')
+           path_without_slashes.erase(it);
+   }
+
+    // http://stackoverflow.com/questions/874134/find-if-string-ends-with-another-string-in-c
+    if (path_without_slashes.length() >= ending.length()) {
+        if (0 == path_without_slashes.compare (path_without_slashes.length() - ending.length(), ending.length(), ending))
+            return true;
+    }
+    return false;
+}
+
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int64_t  FileSystemCommon::getSize (const Path& path)
+{
+    struct stat st;
+
+    if (stat (path.c_str(), &st) == 0) return st.st_size;
+
+    return 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void FileSystemCommon::iterate (const Path& path, void (*callback) (const Path&, void* data), void* data)
+{
+    DIR* dp = opendir (path.c_str());
+
+    if (dp)
+    {
+        struct dirent* dirp = 0;
+
+        while ( (dirp = readdir(dp)) != 0)
+        {
+            callback (dirp->d_name, data);
+        }
+
+        closedir (dp);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+std::vector<std::string> FileSystemCommon::listdir (const Path& path)
+{
+	std::vector<std::string> filenames;
+    DIR* dp = opendir (path.c_str());
+
+    if (dp)
+    {
+        struct dirent* dirp = 0;
+
+        while ( (dirp = readdir(dp)) != 0)
+        {
+        	filenames.push_back(std::string(dirp->d_name));
+        }
+
+        closedir (dp);
+    }
+
+    return filenames;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+#if 0
+IFile* FileSystemCommon::newFile (const Path& dirpath, const Path& filename, const char* mode)
+{
+    /** We build the full file path. */
+    stringstream ss;
+    ss << dirpath << "/" << filename;
+
+    /** We create the file handle. */
+    return newFile (ss.str(), mode);
+}
+#endif
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/system/impl/FileSystemCommon.hpp b/gatb-core/src/gatb/system/impl/FileSystemCommon.hpp
new file mode 100644
index 0000000..a48b27f
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemCommon.hpp
@@ -0,0 +1,235 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file FileSystemCommon.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementations common to various OS.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_COMMON_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_COMMON_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/IFileSystem.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Default implementation of IFile interface
+ *
+ *  This implementation uses standard C functions (stdio.h).
+ */
+class CommonFile : public IFile
+{
+public:
+
+    /** Constructor.
+     * \param[in] path : full path of the file
+     * \param[in] mode : read/write mode (same as fopen function) */
+    CommonFile (const char* path, const char* mode) : _path(path), _handle(0), _isStdout(false)
+    {
+        _isStdout = path && strcmp(path,"stdout")==0;
+        _handle   = _isStdout ? stdout : fopen (path, mode);
+		if(_handle == 0)
+		{
+			throw Exception ("cannot open %s %s",path,strerror(errno));
+		}
+    }
+
+    /** Destructor. */
+    virtual ~CommonFile ()  {  if (_handle && !_isStdout)  {  fclose (_handle);  }  }
+
+    /** \copydoc IFile::isOpen */
+    bool isOpen ()  { return getHandle() != 0; }
+
+    /** \copydoc IFile::isEOF */
+    bool isEOF ()  {  return (isOpen() ? feof (getHandle()) : true); }
+
+    /** \copydoc IFile::get */
+    int get ()   {  return (isOpen() ? fgetc (getHandle()) : 0); }
+
+    /** \copydoc IFile::unget */
+    int unget (int c)   {  return (isOpen() ? ungetc (c, getHandle()) : 0); }
+
+    /** \copydoc IFile::gets */
+    int gets (char *s, int size)
+    {
+        int result = 0;
+
+        /** We read the current line, up to 'size' characters. */
+        char* tmp = (isOpen() ? fgets (s, size, getHandle()) : 0);
+
+        /** Note: it may happen that the line is longer than the 'size' parameter.
+         * Since this function is intended to read a line, we have to skip characters until the end of the line. */
+        if (tmp != 0)
+        {
+            result = strlen (tmp);
+
+            /** we skip all characters until we reach the next '\n'. */
+            if (result > 0)  {  for (char c = tmp[result-1];  c !='\n' &&  c!=EOF;  c = fgetc (getHandle()))  {}  }
+        }
+
+        /** We return the result. */
+        return result;
+    }
+
+    /** \copydoc IFile::print */
+    void print (const char* format, ...)
+    {
+        if (isOpen())
+        {
+              va_list args;
+              va_start (args, format);
+              vfprintf (getHandle(), format, args);
+              va_end (args);
+        }
+    }
+
+    /** \copydoc IFile::fread */
+    size_t fread (void* ptr, size_t size, size_t nmemb)
+    {
+        return ::fread (ptr, size, nmemb, getHandle());
+    }
+
+    /** \copydoc IFile::fwrite */
+    size_t fwrite (const void* ptr, size_t size, size_t nmemb)
+    {
+        return ::fwrite (ptr, size, nmemb, getHandle());
+    }
+
+    /** \copydoc IFile::flush */
+    void flush ()  { if (isOpen())  {  fflush (getHandle()); } }
+
+    /** \copydoc IFile::getSize */
+    u_int64_t getSize ()
+    {
+        /** Note: we have first to flush the buffer. */
+        flush();
+
+        struct stat st;
+        return (stat (_path.c_str(), &st) == 0) ? st.st_size : 1000;
+    }
+
+    /** \copydoc IFile::getPath */
+    const std::string& getPath () const  {  return _path;  }
+
+protected:
+    std::string _path;
+    FILE*       _handle;
+    bool        _isStdout;
+
+    FILE* getHandle()
+    {
+        if (_handle == 0)  { throw Exception ("Bad handle"); }
+        return _handle;
+    }
+};
+
+/********************************************************************************/
+
+/** \brief default implementation
+ */
+class FileSystemCommon : public IFileSystem
+{
+public:
+
+    /** \copydoc IFileSystem::getAvailableSpace */
+    u_int64_t  getAvailableSpace (const Path& path);
+
+    /** \copydoc IFileSystem::getCurrentDirectory */
+    Path getCurrentDirectory ();
+
+    /** \copydoc IFileSystem::getDirectory */
+    Path getDirectory (const Path& path);
+
+    /** \copydoc IFileSystem::getTemporaryDirectory */
+    Path getTemporaryDirectory ();
+
+    /** \copydoc IFileSystem::getBaseName */
+    Path getBaseName (const Path& path, bool cutToFirstDot = false);
+
+    /** \copydoc IFileSystem::getRealPath */
+    Path getRealPath (const Path& file);
+
+    /** \copydoc IFileSystem::getExtension */
+    std::string getExtension (const Path& path);
+
+    /** \copydoc IFileSystem::getTemporaryFilename */
+    std::string getTemporaryFilename (const std::string& filename="");
+
+    /** \copydoc IFileSystem::doesExist */
+    bool doesExist (const Path& path);
+    
+    /** \copydoc IFileSystem::doesExistDirectory */
+    bool doesExistDirectory (const Path& path);
+    
+    /** \copydoc IFileSystem::isFolderEndingWith*/
+    bool isFolderEndingWith (const Path& path, const std::string &ending);
+
+    /** \copydoc IFileSystem::getSize */
+    u_int64_t  getSize (const Path& path);
+
+    /** \copydoc IFileSystem::mkdir */
+    int mkdir (const Path& path, u_int64_t mode)  {  return ::mkdir (path.c_str(), mode);  }
+
+    /** \copydoc IFileSystem::rmdir */
+    int rmdir (const Path& path)  { return ::rmdir (path.c_str()); }
+
+    /** \copydoc IFileSystem::remove */
+    int remove (const Path& path)  { return ::remove (path.c_str()); }
+
+    /** \copydoc IFileSystem::rename */
+    int rename (const Path& from, const Path& to)  { return ::rename (from.c_str(), to.c_str()); }
+
+    /** \copydoc IFileSystem::iterate */
+    void iterate (const Path& path, void (*callback) (const Path& entry, void* data), void* data);
+
+    /** \copydoc IFileSystem::listFilenames */
+    std::vector<std::string> listdir (const Path& path);
+
+    /** \copydoc IFileSystem::getAttribute */
+    ssize_t getAttribute (const Path& filename, const char* key, std::string& value)  { return -1; }
+
+    /** \copydoc IFileSystem::setAttribute */
+    ssize_t setAttribute (const Path& filename, const char* key, const char* fmt, ...)   { return -1; }
+
+private:
+
+    static const char* tmp_prefix()  { return "trashme"; }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_COMMON_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/FileSystemLinux.cpp b/gatb-core/src/gatb/system/impl/FileSystemLinux.cpp
new file mode 100644
index 0000000..a53e909
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemLinux.cpp
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifdef __linux__
+
+#include <gatb/system/impl/FileSystemLinux.hpp>
+
+#include <sys/resource.h>
+#include <sys/statvfs.h>
+#include <stdlib.h>
+#include <dirent.h>
+
+#include <sys/xattr.h>
+
+#include <string>
+#include <sstream>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+class FileLinux : public CommonFile
+{
+public:
+
+    /** Constructor. */
+    FileLinux (const char* path, const char* mode) : CommonFile(path,mode)  { }
+
+    /** \copydoc IFile::tell */
+    u_int64_t tell ()  { return (isOpen() ? ftello64 (_handle) : 0); }
+
+	/** \copydoc IFile::seeko */
+    int seeko (u_int64_t offset, int whence)  {  return (isOpen() ?  fseek /* cygwin doesnt like fseeko and fseek/fseeko seems similar */(_handle, offset, whence) : -1);  }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+size_t FileSystemLinux::getMaxFilesNumber ()
+{
+    size_t result = 0;
+
+    struct rlimit64 lim;
+
+    if (getrlimit64 (RLIMIT_NOFILE, &lim) == 0)   {  result = lim.rlim_cur;  }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFile* FileSystemLinux::newFile (const Path& path, const char* mode)
+{
+    return new FileLinux (path.c_str(), mode);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFile* FileSystemLinux::newFile (const Path& dirpath, const Path& filename, const char* mode)
+{
+    /** We build the full file path. */
+    stringstream ss;
+    ss << dirpath << "/" << filename;
+
+    /** We create the file handle. */
+    return newFile (ss.str(), mode);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+int FileSystemLinux::clearCache ()
+{
+    int result = EXIT_FAILURE;
+
+    //result = ::system ("echo 3 > /proc/sys/vm/drop_caches");
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ssize_t FileSystemLinux::getAttribute (const Path& filename, const char* key, string& value)
+{
+    char buffer[4*1024];
+
+    value.clear();
+
+    ssize_t res = ::getxattr (filename.c_str(), (string("user.") + key).c_str(), buffer, sizeof(buffer));
+
+    if (res >= 0)   { value.assign (buffer, res); }
+
+    return res;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ssize_t FileSystemLinux::setAttribute (const Path& filename, const char* key, const char* fmt, ...)
+{
+    char buffer[4*1024];
+
+    va_list ap;
+    va_start (ap, fmt);
+    vsnprintf (buffer, sizeof(buffer), fmt, ap);
+    va_end (ap);
+
+    return ::setxattr (filename.c_str(), (string("user.") + key).c_str(), buffer, strlen(buffer), XATTR_CREATE);
+}
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* __LINUX__ */
diff --git a/gatb-core/src/gatb/system/impl/FileSystemLinux.hpp b/gatb-core/src/gatb/system/impl/FileSystemLinux.hpp
new file mode 100644
index 0000000..d8d27f6
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemLinux.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file FileSystemLinux.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation for Linux.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_LINUX_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_LINUX_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/FileSystemCommon.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief default implementation
+ */
+class FileSystemLinux : public FileSystemCommon
+{
+public:
+
+    /** \copydoc IFileSystem::getMaxFilesNumber */
+    size_t getMaxFilesNumber ();
+
+    /** \copydoc IFileSystem::getAttribute */
+    ssize_t getAttribute (const Path& filename, const char* key, std::string& value);
+
+    /** \copydoc IFileSystem::setAttribute */
+    ssize_t setAttribute (const Path& filename, const char* key, const char* fmt, ...);
+
+    /** \copydoc IFileSystem::newFile */
+    IFile* newFile (const Path& path, const char* mode);
+
+    /** \copydoc IFileSystem::newFile(const Path&, const Path&, const char*) */
+    IFile* newFile (const Path& dirpath, const Path& filename, const char* mode);
+
+    /** \copydoc IFileSystem::clearCache */
+    int clearCache ();
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_LINUX_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/FileSystemMacos.cpp b/gatb-core/src/gatb/system/impl/FileSystemMacos.cpp
new file mode 100644
index 0000000..ac806b3
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemMacos.cpp
@@ -0,0 +1,170 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifdef __APPLE__
+
+#include <gatb/system/impl/FileSystemMacos.hpp>
+
+#include <sys/resource.h>
+#include <sys/statvfs.h>
+#include <stdlib.h>
+#include <dirent.h>
+
+#include <string>
+#include <sstream>
+
+#include <sys/xattr.h>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+
+class MacosFile : public CommonFile
+{
+public:
+
+    /** Constructor. */
+	MacosFile (const char* path, const char* mode) : CommonFile(path,mode)  { }
+
+    /** \copydoc IFile::tell */
+    u_int64_t tell ()  { return (isOpen() ? ftello (_handle) : 0); }
+
+	/** \copydoc IFile::seeko */
+    int seeko (u_int64_t offset, int whence)  {  return (isOpen() ? fseek /* cygwin doesnt like fseeko and fseek/fseeko seems similar */ (_handle, offset, whence) : -1);  }
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+size_t FileSystemMacos::getMaxFilesNumber ()
+{
+    size_t result = 0;
+
+    struct rlimit lim;
+
+    if (getrlimit (RLIMIT_NOFILE, &lim) == 0)   {  result = lim.rlim_cur;  }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFile* FileSystemMacos::newFile (const Path& path, const char* mode)
+{
+    return new MacosFile (path.c_str(), mode);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IFile* FileSystemMacos::newFile (const Path& dirpath, const Path& filename, const char* mode)
+{
+    /** We build the full file path. */
+    stringstream ss;
+    ss << dirpath << "/" << filename;
+
+    /** We create the file handle. */
+    return newFile (ss.str(), mode);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+int FileSystemMacos::clearCache ()
+{
+    return ::system("purge");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ssize_t FileSystemMacos::getAttribute (const Path& filename, const char* key, string& value)
+{
+    char buffer[4*1024];
+
+    value.clear();
+
+    ssize_t res = ::getxattr (filename.c_str(), (string("user.") + key).c_str(), buffer, sizeof(buffer), 0, XATTR_NOFOLLOW);
+
+    if (res >= 0)   { value.assign (buffer, res); }
+
+    return res;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ssize_t FileSystemMacos::setAttribute (const Path& filename, const char* key, const char* fmt, ...)
+{
+    char buffer[4*1024];
+
+    va_list ap;
+    va_start (ap, fmt);
+    vsnprintf (buffer, sizeof(buffer), fmt, ap);
+    va_end (ap);
+
+    return ::setxattr (filename.c_str(), (string("user.") + key).c_str(), buffer, strlen(buffer), 0, XATTR_CREATE);
+}
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* __MACOS__ */
diff --git a/gatb-core/src/gatb/system/impl/FileSystemMacos.hpp b/gatb-core/src/gatb/system/impl/FileSystemMacos.hpp
new file mode 100644
index 0000000..f1f3151
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/FileSystemMacos.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file FileSystemMacos.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation for MacOs.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_MACOS_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_MACOS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/FileSystemCommon.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief default implementation
+ */
+class FileSystemMacos : public FileSystemCommon
+{
+public:
+
+	/** \copydoc IFileSystem::getMaxFilesNumber */
+    size_t getMaxFilesNumber ();
+
+    /** \copydoc IFileSystem::getAttribute */
+    ssize_t getAttribute (const Path& filename, const char* key, std::string& value);
+
+    /** \copydoc IFileSystem::setAttribute */
+    ssize_t setAttribute (const Path& filename, const char* key, const char* fmt, ...);
+
+    /** \copydoc IFileSystem::newFile */
+    IFile* newFile (const Path& path, const char* mode);
+
+    /** \copydoc IFileSystem::newFile(const Path&, const Path&, const char*) */
+    IFile* newFile (const Path& dirpath, const Path& filename, const char* mode);
+
+    /** \copydoc IFileSystem::clearCache */
+    int clearCache ();
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_FILE_SYSTEM_MACOS_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/MemoryCommon.hpp b/gatb-core/src/gatb/system/impl/MemoryCommon.hpp
new file mode 100644
index 0000000..1881e6e
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/MemoryCommon.hpp
@@ -0,0 +1,415 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file MemoryCommon.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementations common to various OS.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_MEMORY_COMMON_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_MEMORY_COMMON_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/IMemory.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+#include <stdlib.h>
+#include <string.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of IMemoryAllocator interface using standard system functions.
+ *
+ *  This implementation provides a few methods common to all operating systems.
+ *  It uses functions from stdlib.h
+ */
+class MemoryAllocatorStdlib : public IMemoryAllocator
+{
+public:
+
+    /** Singleton. */
+    static IMemoryAllocator& singleton()  { static MemoryAllocatorStdlib instance; return instance; }
+
+    /** \copydoc IMemoryAllocator::malloc */
+     void* malloc  (BlockSize_t size)
+     {
+         void* res = ::malloc (size);
+         if (!res)  {  throw Exception ("no memory for malloc"); }
+         return res;
+     }
+
+     /** \copydoc IMemoryAllocator::calloc */
+     void* calloc  (size_t nmemb, BlockSize_t size)
+     {
+         void* res = ::calloc (nmemb, size);
+         if (!res)  {  throw Exception ("no memory for calloc"); }
+         return res;
+     }
+
+     /** \copydoc IMemoryAllocator::realloc */
+     void* realloc (void *ptr, BlockSize_t size)
+     {
+         void* res = ::realloc (ptr, size);
+         if (!res)  {  throw Exception ("no memory for realloc"); }
+         return res;
+     }
+
+     /** \copydoc IMemoryAllocator::free */
+     void  free (void *ptr)
+     {
+         if (ptr != 0)  {  ::free (ptr);  }
+     }
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of IMemory interface with Proxy design pattern
+ *
+ * This implementation is a Proxy design pattern: it references a memory allocator
+ * and uses this reference for creating memory blocks.
+ *
+ * Statistics operations are provided through the IMemory interface. Providing such
+ * services implies that we have some management of the allocated blocks. In particular
+ * we need to store the size of block which is done by allocating some extra space for
+ * each block (this space being used for storing the block size).
+ *
+ * Note that such an implementation requires a little bit more memory than clients
+ * actually ask for: for instance, if a client calls malloc with 100, the final allocated
+ * block size will be 100+4=104 bytes (if sizeof(BlockSize_t)==4).
+ *
+ * It is mandatory that blocks created through this implementation are also deleted by the
+ * same implementation.
+ */
+class MemorySizeStore : public IMemoryAllocator
+{
+public:
+
+    /** Constructor.
+     * \param[in] alloc : the referred memory allocator.
+     */
+    MemorySizeStore (IMemoryAllocator& alloc)
+        :  _alloc(alloc), _nbBlocks(0), _currentMemory(0), _peakMemory(0) {}
+
+    /** \copydoc IMemoryAllocator::malloc */
+     void* malloc  (BlockSize_t size)
+     {
+         /** We add the size for storing the size of the pointer to be allocated. */
+         BlockSize_t actualSize = size + sizeof(BlockSize_t);
+
+         /** We allocate the block in a classical way. Note the cast due to the fact
+          * that we need to do some arithmetic on the pointer. */
+         u_int8_t* res = (u_int8_t*) _alloc.malloc (actualSize);
+
+         /** We store the required size. */
+         storeBlockSize (res, actualSize);
+
+         /** We update the statistics information. Note that we force synchronization since
+          * we could have concurrent access on the instance. */
+         __sync_fetch_and_add (&_nbBlocks,      1);
+         __sync_fetch_and_add (&_currentMemory, actualSize);
+
+         /** we return the result. */
+         return res + sizeof(BlockSize_t);
+     }
+
+     /** \copydoc IMemoryAllocator::calloc */
+     void* calloc  (size_t nmemb, BlockSize_t size)
+     {
+         /** We rely on the malloc to emulate the calloc operation. */
+         void* res = malloc (nmemb * size);
+
+         /** We reset the allocated memory. */
+         ::memset (res, 0, nmemb * size);
+
+         /** We return the result. */
+         return res;
+     }
+
+     /** \copydoc IMemoryAllocator::realloc */
+     void* realloc (void* ptr, BlockSize_t size)
+     {
+         u_int8_t*   actualPtr    = 0;
+         BlockSize_t previousSize = 0;
+
+         /** We retrieve the actual block pointer and the previous block size. */
+         if (ptr != 0)
+         {
+             actualPtr    = (u_int8_t*)ptr - sizeof(BlockSize_t);
+             previousSize = *((BlockSize_t*)actualPtr);
+         }
+
+         /** We add the size for storing the size of the pointer to be allocated. */
+         BlockSize_t actualSize = size + sizeof(BlockSize_t);
+
+         /** We reallocate the actual block. */
+         u_int8_t* res = (u_int8_t*)_alloc.realloc (actualPtr, actualSize);
+
+         /** We store the required size. */
+         storeBlockSize (res, size);
+
+         /** We update the statistics information. Note that we force synchronization since
+          * we could have concurrent access on the instance. */
+         if (size > previousSize)  // The size of the block is going to increase.
+         {
+             __sync_fetch_and_add (&_currentMemory, size - previousSize);
+         }
+         else  // The size of the block is going to decrease.
+         {
+             __sync_fetch_and_sub (&_currentMemory, previousSize - size);
+         }
+
+         /** We return the result. */
+         return res + sizeof(BlockSize_t);
+     }
+
+     /** \copydoc IMemoryAllocator::free */
+     void  free (void* ptr)
+     {
+         if (ptr != 0)
+         {
+             /** We retrieve the actual block pointer. */
+             u_int8_t* actualPtr = (u_int8_t*)ptr - sizeof(BlockSize_t);
+
+             /** We retrieve the block size. */
+             BlockSize_t actualSize = *((BlockSize_t*)actualPtr);
+
+             /** We release the actual allocated block. */
+             _alloc.free (actualPtr);
+
+             /** We update the current blocks number. */
+             __sync_fetch_and_sub (&_nbBlocks,      1);
+             __sync_fetch_and_sub (&_currentMemory, actualSize);
+         }
+     }
+
+     /** \copydoc IMemory::getNbBlocks */
+     size_t getNbBlocks () { return _nbBlocks; }
+
+     /** \copydoc IMemory::getCurrentUsage */
+     TotalSize_t getCurrentUsage () { return _currentMemory; }
+
+     /** \copydoc IMemory::getMaximumUsage */
+     TotalSize_t getMaximumUsage () { return _peakMemory; }
+
+protected:
+
+     IMemoryAllocator&  _alloc;
+
+     size_t      _nbBlocks;
+     TotalSize_t _currentMemory;
+     TotalSize_t _peakMemory;
+
+     /** */
+     void storeBlockSize (void* ptr, BlockSize_t size)  {  *((BlockSize_t*)ptr) = size;  }
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of IMemory interface with bounded memory usage
+ *
+ * This implementation is a Proxy design pattern: it references a memory allocator
+ * and checks that client requests doesn't exceed this kind of specifications.
+ * If the client request is allowed, the request is done by the referred allocator.
+ *
+ * Two thresholds can be parameterize such an allocator at construction:
+ *      - maximum total size allowed
+ *      - maximum block size allowed
+ *
+ * Implementation note: in order to ensure that the thresholds are not exceeded, we need
+ * to know the size of each allocated pointer. Therefore, when allocating some block of
+ * size N, we actually allocate N+d bytes, where d is the size of an integer big enough
+ * to represent the requested block size. This size is provided through the class template T.
+ *
+ */
+class MemoryBounded : public MemorySizeStore
+{
+public:
+
+    /** Constructor.
+     * \param[in] alloc : the referred IMemoryAllocator instance
+     * \param[in] maxBlockSize : maximum size allowed for one block allocation
+     * \param[in] maxTotalSize : maximum size allowed for the sum of blocks allocation
+     * */
+    MemoryBounded (IMemoryAllocator& alloc, BlockSize_t maxBlockSize, TotalSize_t maxTotalSize)
+    : MemorySizeStore(alloc), _maxBlockSize(maxBlockSize), _maxTotalSize(maxTotalSize) {}
+
+    /** \copydoc IMemoryAllocator::malloc */
+     void* malloc  (BlockSize_t size)
+     {
+         /** We check that the required block size is not too big. */
+         if (size > _maxBlockSize)
+         {
+             throw Exception ("block size too big for malloc: %d required but %d allowed", size, _maxBlockSize);
+         }
+
+         /** We check that we don't reach the maximum size allowed. */
+         if (_currentMemory + size >= _maxTotalSize)
+         {
+             throw Exception ("memory maximum reached for malloc: required %d, current %d, max %d", size, _currentMemory, _maxTotalSize);
+         }
+
+         /** we return the result. */
+         return MemorySizeStore::malloc (size);
+     }
+
+     /** \copydoc IMemoryAllocator::calloc */
+     void* calloc  (size_t nmemb, BlockSize_t size)
+     {
+         /** We check that the required block size is not too big. */
+         if (nmemb*size > _maxBlockSize)
+         {
+             throw Exception ("block size too big for calloc: %d required but %d allowed", size, _maxBlockSize);
+         }
+
+         /** We check that we don't reach the maximum size allowed. */
+         if (_currentMemory + nmemb*size >= _maxTotalSize)
+         {
+             throw Exception ("memory maximum reached for calloc: required %d, current %d, max %d", size, _currentMemory, _maxTotalSize);
+         }
+
+         /** we return the result. */
+         return MemorySizeStore::calloc (nmemb, size);
+     }
+
+     /** \copydoc IMemoryAllocator::realloc */
+     void* realloc (void* ptr, BlockSize_t size)
+     {
+         /** We check that the required block size is not too big. */
+         if (size > _maxBlockSize)
+         {
+             throw Exception ("block size too big for realloc: %d required but %d allowed", size, _maxBlockSize);
+         }
+
+         /** We check that we don't reach the maximum size allowed. */
+         if (_currentMemory + size >= _maxTotalSize)
+         {
+             throw Exception ("memory maximum reached for realloc: required %d, current %d, max %d", size, _currentMemory, _maxTotalSize);
+         }
+
+         /** we return the result. */
+         return MemorySizeStore::realloc (ptr, size);
+     }
+
+     /** \copydoc IMemoryAllocator::free */
+     void  free (void* ptr)
+     {
+         /** We release the actual allocated block. */
+         MemorySizeStore::free (ptr);
+     }
+
+protected:
+
+     BlockSize_t _maxBlockSize;
+     TotalSize_t _maxTotalSize;
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of IMemoryOperations interface using standard system functions.
+ *
+ *  This implementation provides a few methods common to all operating systems.
+ *  It uses functions from string.h
+ */
+class MemoryOperationsCommon : public IMemoryOperations
+{
+public:
+
+    /** Singleton. */
+    static IMemoryOperations& singleton()  { static MemoryOperationsCommon instance; return instance; }
+
+    /** \copydoc IMemoryOperations::memset */
+    void* memset (void* s, int c, size_t n)                 { return ::memset (s, c, n);      }
+
+    /** \copydoc IMemoryOperations::memcpy */
+    void* memcpy (void* dest, const void* src, size_t n)    { return ::memcpy (dest, src, n); }
+
+    /** \copydoc IMemoryOperations::memcmp */
+    int   memcmp (const void* s1, const void* s2, size_t n) { return ::memcmp (s1, s2, n);    }
+};
+
+/********************************************************************************/
+
+/** \brief common implementation of IMemory interface
+ *
+ * This implementation delegates the allocation part to a referred IMemoryAllocator instance.
+ *
+ * It is not abstract since it implements the statistics methods but with dummy return values.
+ * It could have sense in case we want fast allocators without statistic information.
+ *
+ * Its main purpose is to factorize some code for concrete implementations.
+ */
+class MemoryCommon : public IMemory
+{
+public:
+
+    /** Constructor.
+     * \param[in] alloc : the referred memory allocator.
+     * \param[in] ope   : the referred memory operations.
+     */
+    MemoryCommon (IMemoryAllocator& alloc, IMemoryOperations& ope) : _alloc(alloc), _ope(ope)  {}
+
+    /** \copydoc IMemoryAllocator::malloc */
+     void* malloc  (BlockSize_t size)                { return _alloc.malloc (size);         }
+
+     /** \copydoc IMemoryAllocator::calloc */
+     void* calloc  (size_t nmemb, BlockSize_t size)  { return _alloc.calloc (nmemb, size);  }
+
+     /** \copydoc IMemoryAllocator::realloc */
+     void* realloc (void *ptr, BlockSize_t size)     { return _alloc.realloc (ptr, size);   }
+
+     /** \copydoc IMemoryAllocator::free */
+     void  free (void *ptr)                          { _alloc.free (ptr);                   }
+
+     /** \copydoc IMemoryOperations::memset */
+     void* memset (void* s, int c, size_t n)                 { return _ope.memset (s, c, n);      }
+
+     /** \copydoc IMemoryOperations::memcpy */
+     void* memcpy (void* dest, const void* src, size_t n)    { return _ope.memcpy (dest, src, n); }
+
+     /** \copydoc IMemoryOperations::memcmp */
+     int   memcmp (const void* s1, const void* s2, size_t n) { return _ope.memcmp (s1, s2, n);    }
+
+     /** \copydoc IMemory::getNbBlocks */
+     size_t getNbBlocks () { return 0; }
+
+     /** \copydoc IMemory::getCurrentUsage */
+     TotalSize_t getCurrentUsage () { return 0; }
+
+     /** \copydoc IMemory::getMaximumUsage */
+     TotalSize_t getMaximumUsage () { return 0; }
+
+protected:
+
+     IMemoryAllocator&  _alloc;
+     IMemoryOperations& _ope;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_MEMORY_COMMON_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/System.cpp b/gatb-core/src/gatb/system/impl/System.cpp
new file mode 100644
index 0000000..4a6d9b6
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/System.cpp
@@ -0,0 +1,247 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+	
+std::list<ThreadGroup*> ThreadGroup::_groups;
+
+static pthread_mutex_t groupsMutex;
+static int mutex_inited = 0;
+
+#define LOCK()      pthread_mutex_lock   (&groupsMutex);
+#define UNLOCK()    pthread_mutex_unlock (&groupsMutex);
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ThreadGroup::ThreadGroup()
+:  _startSynchro(0)
+{
+	init_mutex_if_needed();
+	
+    _startSynchro = System::thread().newSynchronizer();
+    if (_startSynchro)  { _startSynchro->lock(); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ThreadGroup::~ThreadGroup()
+{
+    if (_startSynchro)  { delete _startSynchro; }
+
+    /** We delete each thread. */
+    for (std::vector<system::IThread*>::iterator it = _threads.begin(); it != _threads.end(); it++)
+    {
+        delete (*it);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ThreadGroup::add (void* (*mainloop) (void*), void* data)
+{
+    IThread* thr = System::thread().newThread (mainloop, data);
+
+    _threads.push_back (thr);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ThreadGroup::start ()
+{
+    /** We unlock the synchronizer => all threads of the group begin at the same time. */
+    if (_startSynchro)  { _startSynchro->unlock(); }
+
+    /** We join each thread. */
+    for (std::vector<system::IThread*>::iterator it = _threads.begin(); it != _threads.end(); it++)
+    {
+        (*it)->join ();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ThreadGroup::init_mutex_if_needed()
+{
+	int  already_inited = __sync_fetch_and_add(&mutex_inited, 1);
+	if(! already_inited)
+	{
+		pthread_mutex_init(&groupsMutex, NULL);
+	}
+	else
+	{
+        __sync_fetch_and_add(&mutex_inited, -1);
+	}
+}
+	
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThreadGroup* ThreadGroup::create ()
+{
+	init_mutex_if_needed();
+
+    LOCK();
+
+    ThreadGroup* tg = new ThreadGroup;
+
+    _groups.push_back(tg);
+
+    UNLOCK();
+
+    return tg;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ThreadGroup::destroy (IThreadGroup* thr)
+{
+	init_mutex_if_needed();
+	
+    LOCK();
+
+    /** We look for the provided thread group. */
+    for (std::list<ThreadGroup*>::iterator it = _groups.begin(); it != _groups.end(); it++)
+    {
+        if (*it == thr)
+        {
+            _groups.erase (it);
+            delete thr;
+            break;
+        }
+    }
+	
+    UNLOCK();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThreadGroup* ThreadGroup::find (IThread::Id id)
+{
+	init_mutex_if_needed();
+
+	LOCK();
+
+    /** We look for the provided thread group. */
+    for (std::list<ThreadGroup*>::iterator it = _groups.begin(); it != _groups.end(); it++)
+    {
+        ThreadGroup* group = *it;
+
+        for (std::vector<IThread*>::iterator itThread = group->_threads.begin();  itThread != group->_threads.end(); itThread++)
+        {
+            if ((*itThread)->getId() == id)  {  UNLOCK();  return group;   }
+        }
+    }
+	
+	UNLOCK();
+
+    return 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+bool ThreadGroup::findThreadInfo (IThread::Id id, std::pair<IThread*,size_t>& info)
+{
+	init_mutex_if_needed();
+
+	LOCK();
+
+    /** We look for the provided thread group. */
+    for (std::list<ThreadGroup*>::iterator it = _groups.begin(); it != _groups.end(); it++)
+    {
+        ThreadGroup* group = *it;
+
+    	size_t idx=0;
+        for (std::vector<IThread*>::iterator itThread = group->_threads.begin();  itThread != group->_threads.end(); itThread++, idx++)
+        {
+            if ((*itThread)->getId() == id)
+            {
+            	info.first  = *itThread;
+            	info.second = idx;
+
+            	UNLOCK();
+            	return true;
+            }
+        }
+    }
+
+	UNLOCK();
+
+    return false;
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/system/impl/System.hpp b/gatb-core/src/gatb/system/impl/System.hpp
new file mode 100644
index 0000000..0b43b7a
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/System.hpp
@@ -0,0 +1,372 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file System.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Entry point class for accessing operating system operations
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_SYSTEM_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_SYSTEM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/config.hpp>
+#include <gatb/system/impl/MemoryCommon.hpp>
+#include <gatb/system/impl/TimeCommon.hpp>
+#include <gatb/system/impl/SystemInfoCommon.hpp>
+#include <gatb/system/impl/FileSystemLinux.hpp>
+#include <gatb/system/impl/FileSystemMacos.hpp>
+#include <gatb/system/impl/ThreadLinux.hpp>
+#include <gatb/system/impl/ThreadMacos.hpp>
+#include <map>
+#include <functional>
+#include <list>
+#include <vector>
+#include <iostream>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+
+/********************************************************************************/
+
+ /** \brief Entry point providing access to operating system resources.
+  *
+  *  The IResource class provides a unique entry point for accessing different kinds
+  *  of operating system resources (threads, time, file, etc...).
+  *
+  *  Normally, the client should use such an instance for getting OS resources
+  *  instead of directly call system defendant functions. This is important because it
+  *  will ease the build of client tools for different OS/architecture; the only thing
+  *  to do is to use a specific instance of IResource for matching the correct OS.
+  */
+class System
+ {
+ public:
+
+    /********************************************************************************/
+    /** Access for info methods. */
+    static ISystemInfo&  info  ()
+    {
+#ifdef __linux__
+        static SystemInfoLinux instance;  return instance;
+#endif
+
+#ifdef __APPLE__
+        static SystemInfoMacos instance;  return instance;
+#endif
+
+#ifdef __WINDOWS__
+        #warning "TO BE DONE..."
+#endif
+    }
+
+    /********************************************************************************/
+     /** Access for time methods. */
+     static ITime&  time ()
+     {
+#ifdef __linux__
+        static TimeSystem instance (ITime::MSEC);  return instance;
+#endif
+
+#ifdef __APPLE__
+        static TimeSystem instance (ITime::MSEC);  return instance;
+#endif
+
+#ifdef __WINDOWS__
+        #warning "TO BE DONE..."
+#endif
+     }
+
+     /********************************************************************************/
+     /** Access for file methods. */
+     static IFileSystem&     file    ()
+     {
+#ifdef __linux__
+        static FileSystemLinux instance;  return instance;
+#endif
+
+#ifdef __APPLE__
+        static FileSystemMacos instance;  return instance;
+#endif
+
+#ifdef __WINDOWS__
+        #warning "TO BE DONE..."
+#endif
+     }
+
+     /********************************************************************************/
+     /** Access for memory methods. */
+     static IMemory&         memory  ()
+     {
+#ifdef __linux__
+        static MemoryCommon instance (allocator(), MemoryOperationsCommon::singleton());  return instance;
+#endif
+
+#ifdef __APPLE__
+        static MemoryCommon instance (allocator(), MemoryOperationsCommon::singleton());  return instance;
+#endif
+
+#ifdef __WINDOWS__
+        #warning "TO BE DONE..."
+#endif
+     }
+
+     /********************************************************************************/
+     /** Access for thread methods. */
+     static IThreadFactory&  thread  ()
+     {
+#ifdef __linux__
+        static ThreadFactoryLinux instance;  return instance;
+#endif
+
+#ifdef __APPLE__
+        static ThreadFactoryMacos instance;  return instance;
+#endif
+
+#ifdef __WINDOWS__
+        #warning "TO BE DONE..."
+#endif
+     }
+
+ private:
+
+     static IMemoryAllocator& allocator()
+     {
+#ifdef GATB_USE_CUSTOM_ALLOCATOR
+         static MemorySizeStore instance (MemoryAllocatorStdlib::singleton());  return instance;
+#else
+         return MemoryAllocatorStdlib::singleton();
+#endif
+     }
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of IThreadGroup
+ *
+ */
+class ThreadGroup : public IThreadGroup, public system::SmartPointer
+{
+public:
+
+	/** Create a IThreadGroup instance
+	 * \return the IThreadGroup instance */
+    static IThreadGroup* create ();
+	
+	/** Destroy a IThreadGroup */
+    static void destroy (IThreadGroup* thr);
+
+    /** Get a thread of the group from one id
+     * \param[in] id : the thread id
+     * \return the IThreadGroup instance if found, NULL otherwise */
+    static IThreadGroup* find (IThread::Id id);
+
+    /** Get thread information (IThread and index within the group);
+     * \param[in] id : the thread id
+     * \return true if found */
+    static bool findThreadInfo (IThread::Id id, std::pair<IThread*,size_t>& info);
+
+    /** \copydoc IThreadGroup::add */
+    void add (void* (*mainloop) (void*), void* data);
+
+    /** \copydoc IThreadGroup::start */
+    void start ();
+
+    /** \copydoc IThreadGroup::getSynchro */
+    ISynchronizer* getSynchro()  { return _startSynchro; }
+
+    /** \copydoc IThreadGroup::size */
+    size_t size() const { return _threads.size(); }
+
+    /** \copydoc IThreadGroup::operator[] */
+    IThread* operator[] (size_t idx)  { return _threads[idx]; }
+
+    /** \copydoc IThreadGroup::addException */
+    void addException (system::Exception e)
+    {
+        LocalSynchronizer synchro (_startSynchro);
+        _exceptions.push_back (e);
+    }
+
+    /** \copydoc IThreadGroup::hasExceptions */
+    bool hasExceptions() const { return _exceptions.empty() == false; }
+
+    /** \copydoc IThreadGroup::getException */
+    Exception getException () const  { return ExceptionComposite(_exceptions); }
+
+private:
+
+    ThreadGroup ();
+    ~ThreadGroup();
+
+    /** Initialize a synchronizer at first call. */
+	static void init_mutex_if_needed ();
+
+    std::vector<IThread*>  _threads;
+    system::ISynchronizer* _startSynchro;
+
+    static std::list<ThreadGroup*> _groups;
+
+    std::list<system::Exception> _exceptions;
+};
+
+/********************************************************************************/
+
+/** \brief Facility to share a common resource between several threads.
+ *
+ * When using multithreading, one has to take care about reads/writes on a resource T
+ * by several threads at the same time.
+ *
+ * There are two ways to cope with this:
+ * 	- using some synchronization mechanism (see ISynchronizer); each time the resource T
+ * 	is accessed, one has to lock the synchronizer before the access and unlock the
+ * 	synchronizer after the access
+ * 	- using local information in each thread instead of accessing the T shared resource;
+ * 	at the end of the threads, one has to use all the gathered local information to update
+ * 	the T resource in a serial way.
+ *
+ * 	The ThreadObject class provides a generic way to follow the second approach. One provides
+ * 	the shared resource to it, then the resource is cloned in N threads and each cloned resource
+ * 	can be locally accessed within its thread without needing synchronization process.
+ * 	At the end of the threads, the ThreadObject provides a way to get each cloned local resource
+ * 	and so the user can update the original resource with the gathered information.
+ *
+ * 	It is possible to give no initial resource to a ThreadObject instance; in such a case,
+ * 	a default original resource is created by using the default constructor of the type of
+ * 	the resource.
+ *
+ * 	Sample of use:
+ * \snippet multithreading5.cpp  snippet5_threadobject
+ *
+ */
+template<typename T> class ThreadObject
+{
+public:
+
+	/** Constructor
+	 * \param[in] object : object to be shared by several threads.
+	 * 		If none, default constructor of type T is used. */
+    ThreadObject (const T& object = T()) : _object(object), _isInit(false), _synchro(0)
+    {
+        _synchro = system::impl::System::thread().newSynchronizer();
+    }
+
+    /** Destructor. */
+    ~ThreadObject()
+    {
+        if (_synchro)  { delete _synchro; }
+
+        for (typename std::map<IThread::Id,T*>::iterator it = _map.begin(); it != _map.end(); it++)  { delete it->second; }
+    }
+
+    /** Get the local T object for the current calling thread.
+     * \return the local T object. */
+    T& operator () ()
+    {
+        if (_isInit == false)
+        {
+            LocalSynchronizer ls (_synchro);
+            if (_isInit == false)
+            {
+                /** We look for the TreadGroup if any. */
+                IThreadGroup* group = ThreadGroup::find (System::thread().getThreadSelf());
+
+                if (group)
+                {
+                    for (size_t i=0; i<group->size(); i++)
+                    {
+                        IThread* thread = (*group)[i];
+                        T* newObject = new T(this->_object);
+                        this->_map[thread->getId()] = newObject;
+                        this->_vec.push_back(newObject);
+                    }
+                }
+                else
+                {
+                	throw Exception ("ThreadObject::operator() : no defined group");
+                }
+                _isInit = true;
+            }
+        }
+
+        return *(_map[System::thread().getThreadSelf()]);
+    }
+
+    /** Iterate all the local objects through a functor.
+     * \param[in] fct : functor called for each local object. The functor must take a T or a const T& argument
+     */
+    template<typename Functor> void foreach (const Functor& fct)
+    {  for (typename std::map<IThread::Id,T*>::iterator it = _map.begin(); it != _map.end(); it++)  { fct (*(it->second)); } }
+
+    /** Get a pointer on the shared object.
+     * \return a pointer on the shared object. */
+    T* operator-> ()  { return &_object; }
+
+    /** Get a reference on the shared object.
+     * \return a reference on the shared object. */
+    T& operator* ()  { return _object; }
+
+    /** Get the number of local T objects
+     * \return the number of local objects */
+    size_t size() const { return _vec.size(); }
+
+    /** Get the ith local T object
+     * \param[in] idx : index of the local object to be returned
+     * \return a reference on the wanted local object*/
+    T& operator[] (size_t idx) { return *(_vec[idx]); }
+
+private:
+    std::map<IThread::Id,T*> _map;
+    T _object;
+
+    std::vector<T*> _vec;
+
+    bool _isInit;
+    system::ISynchronizer* _synchro;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#ifdef GATB_USE_CUSTOM_ALLOCATOR
+    #define MALLOC      gatb::core::system::impl::System::memory().malloc
+    #define CALLOC      gatb::core::system::impl::System::memory().calloc
+    #define REALLOC     gatb::core::system::impl::System::memory().realloc
+    #define FREE        gatb::core::system::impl::System::memory().free
+
+    inline void* operator new      (size_t s)   { return MALLOC(s); }
+    inline void* operator new[]    (size_t s)   { return MALLOC(s); }
+    inline void  operator delete   (void* ptr)  { FREE(ptr); }
+    inline void  operator delete[] (void* ptr ) { FREE(ptr); }
+
+#else
+    #define MALLOC      malloc
+    #define CALLOC      calloc
+    #define REALLOC     realloc
+    #define FREE        free
+#endif
+
+#endif /* _GATB_SYSTEM_IMPL_SYSTEM_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/SystemInfoCommon.cpp b/gatb-core/src/gatb/system/impl/SystemInfoCommon.cpp
new file mode 100644
index 0000000..64b4b49
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/SystemInfoCommon.cpp
@@ -0,0 +1,395 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/SystemInfoCommon.hpp>
+#include <gatb/system/api/build_info.hpp>
+
+#include <string.h>
+#include <unistd.h>
+#include <sys/times.h>
+#include <iostream>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+         #####   #######  #     #  #     #  #######  #     #
+        #     #  #     #  ##   ##  ##   ##  #     #  ##    #
+        #        #     #  # # # #  # # # #  #     #  # #   #
+        #        #     #  #  #  #  #  #  #  #     #  #  #  #
+        #        #     #  #     #  #     #  #     #  #   # #
+        #     #  #     #  #     #  #     #  #     #  #    ##
+         #####   #######  #     #  #     #  #######  #     #
+*********************************************************************/
+
+/********************************************************************************/
+/** \brief Interface providing a way to get CPU usage information
+ */
+class CpuInfoCommon : public ISystemInfo::CpuInfo
+{
+public:
+
+    /** Start CPU information acquisition. */
+    virtual void start ()
+    {
+        struct tms timeSample;
+        CPU0     = times (&timeSample);
+        SysCPU0  = timeSample.tms_stime;
+        UserCPU0 = timeSample.tms_utime;
+    }
+
+    /** Stop CPU information acquisition. */
+    virtual void stop ()
+    {
+        struct tms timeSample;
+        CPU1     = times (&timeSample);
+        SysCPU1  = timeSample.tms_stime;
+        UserCPU1 = timeSample.tms_utime;
+    }
+
+    /** Get the CPU usage between start and stop. */
+    virtual double getUsage()
+    {
+        stop ();
+
+        double percent = 0;
+
+        if (CPU1 <= CPU0 || SysCPU1 < SysCPU0 ||  UserCPU1 < UserCPU0)
+        {
+            percent = -1.0;
+        }
+        else
+        {
+            percent = (SysCPU1 - SysCPU0) +  (UserCPU1 - UserCPU0);
+            percent /= (CPU1 - CPU0);
+            percent *= 100;
+        }
+        return percent;
+    }
+
+private:
+
+    clock_t CPU0, SysCPU0, UserCPU0;
+    clock_t CPU1, SysCPU1, UserCPU1;
+};
+
+/** */
+ISystemInfo::CpuInfo* SystemInfoCommon::createCpuInfo ()  {  return new CpuInfoCommon (); }
+
+std::string SystemInfoCommon::getVersion () const  { return STR_LIBRARY_VERSION; }
+
+std::string SystemInfoCommon::getBuildDate () const { return STR_COMPILATION_DATE; }
+
+std::string SystemInfoCommon::getBuildCompiler () const  { return STR_COMPILER; }
+
+std::string SystemInfoCommon::getBuildOptions () const { return STR_COMPILATION_FLAGS; }
+
+std::string SystemInfoCommon::getBuildSystem () const { return STR_OPERATING_SYSTEM; }
+
+/*********************************************************************
+                #        ###  #     #  #     #  #     #
+                #         #   ##    #  #     #   #   #
+                #         #   # #   #  #     #    # #
+                #         #   #  #  #  #     #     #
+                #         #   #   # #  #     #    # #
+                #         #   #    ##  #     #   #   #
+                #######  ###  #     #   #####   #     #
+*********************************************************************/
+
+#ifdef __linux__
+
+#include "sys/sysinfo.h"
+#include <unistd.h>
+#include <sys/resource.h>
+#include <sys/times.h>
+
+/********************************************************************************/
+size_t SystemInfoLinux::getNbCores () const
+{
+    size_t result = 0;
+
+    /** We open the "/proc/cpuinfo" file. */
+    FILE* file = fopen ("/proc/cpuinfo", "r");
+    if (file)
+    {
+        char buffer[256];
+        while (fgets(buffer, sizeof(buffer), file))  {  if (strstr(buffer, "processor") != NULL)  { result ++;  }  }
+        fclose (file);
+    }
+
+    if (result==0)  { result = 1; }
+
+    return result;
+}
+
+/********************************************************************************/
+string SystemInfoLinux::getHostName () const
+{
+    string result;
+
+    char hostname[1024];
+    hostname[1023] = '\0';
+    gethostname (hostname, sizeof(hostname)-1);
+    result.assign (hostname, strlen(hostname));
+
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoLinux::getMemoryPhysicalTotal () const
+{
+    struct sysinfo memInfo;
+    sysinfo (&memInfo);
+    u_int64_t result = memInfo.totalram;
+    result *= memInfo.mem_unit;
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoLinux::getMemoryPhysicalUsed () const
+{
+    struct sysinfo memInfo;
+    sysinfo (&memInfo);
+    u_int64_t result = memInfo.totalram - memInfo.freeram;
+    result *= memInfo.mem_unit;
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoLinux::getMemoryBuffers () const
+{
+    struct sysinfo memInfo;
+    sysinfo (&memInfo);
+    u_int64_t result = memInfo.bufferram;
+    result *= memInfo.mem_unit;
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoLinux::getMemorySelfUsed () const
+{
+    u_int64_t result = 0;
+    FILE* file = fopen("/proc/self/status", "r");
+    if (file)
+    {
+        char line[128];
+
+        while (fgets(line, 128, file) != NULL)
+        {
+            if (strncmp(line, "VmRSS:", 6) == 0)
+            {
+                char* loop = line;
+                result = strlen(line);
+                while (*loop < '0' || *loop > '9') loop++;
+                loop[result-3] = '\0';
+                result = atoi(loop);
+                break;
+            }
+        }
+        fclose(file);
+    }
+    else
+        std::cout << "warning: could not fopen /proc/self/status" << std::endl;
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoLinux::getMemorySelfMaxUsed () const
+{
+    u_int64_t result = 0;
+    struct rusage usage;
+    if (getrusage(RUSAGE_SELF, &usage)==0)  {  result = usage.ru_maxrss;  }
+    return result;
+}
+#endif
+
+/*********************************************************************
+            #     #     #      #####   #######   #####
+            ##   ##    # #    #     #  #     #  #     #
+            # # # #   #   #   #        #     #  #
+            #  #  #  #     #  #        #     #   #####
+            #     #  #######  #        #     #        #
+            #     #  #     #  #     #  #     #  #     #
+            #     #  #     #   #####   #######   #####
+*********************************************************************/
+
+#ifdef __APPLE__
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#include <mach/vm_statistics.h>
+#include <mach/mach_types.h>
+#include <mach/mach_init.h>
+#include <mach/mach_host.h>
+#include <mach/mach.h>
+
+/********************************************************************************/
+size_t SystemInfoMacos::getNbCores () const
+{
+    int numCPU = 0;
+
+    int mib[4];
+    size_t len = sizeof(numCPU);
+
+    /* set the mib for hw.ncpu */
+    mib[0] = CTL_HW;
+    mib[1] = HW_AVAILCPU;  // alternatively, try HW_NCPU;
+
+    /* get the number of CPUs from the system */
+    sysctl (mib, 2, &numCPU, &len, NULL, 0);
+
+    if (numCPU < 1)
+    {
+        mib[1] = HW_NCPU;
+        sysctl (mib, 2, &numCPU, &len, NULL, 0 );
+    }
+
+    if (numCPU < 1)  {  numCPU = 1;  }
+
+    return numCPU;
+}
+
+/********************************************************************************/
+string SystemInfoMacos::getHostName () const
+{
+    string result;
+
+    char hostname[1024];
+    hostname[1023] = '\0';
+    gethostname (hostname, sizeof(hostname)-1);
+    result.assign (hostname, strlen(hostname));
+
+    return result;
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoMacos::getMemoryPhysicalTotal () const
+{
+	int mib[2] = { CTL_HW, HW_MEMSIZE };
+	size_t namelen = sizeof(mib) / sizeof(mib[0]);
+	u_int64_t size;
+	size_t len = sizeof(size);
+
+	if (sysctl(mib, namelen, &size, &len, NULL, 0) < 0)
+	{
+		throw Exception ("Unable to get physical memory");
+	}
+	else
+	{
+		return size;
+	}
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoMacos::getMemoryPhysicalUsed () const
+{
+	// see http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process
+	vm_size_t page_size;
+	mach_port_t mach_port;
+	mach_msg_type_number_t count;
+	vm_statistics_data_t vm_stats;
+
+	mach_port = mach_host_self();
+	count = sizeof(vm_stats) / sizeof(natural_t);
+	if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
+	    KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO,
+	                                    (host_info_t)&vm_stats, &count))
+	{
+		int64_t myFreeMemory = (int64_t)vm_stats.free_count * (int64_t)page_size;
+
+		int64_t used_memory = ((int64_t)vm_stats.active_count +
+	                   (int64_t)vm_stats.inactive_count +
+	                   (int64_t)vm_stats.wire_count) *  (int64_t)page_size;
+		return myFreeMemory + used_memory;
+	}
+	else
+	{
+		throw Exception ("Unable to get free memory");
+	}
+}
+
+/********************************************************************************/
+u_int64_t SystemInfoMacos::getMemorySelfUsed () const
+{
+    struct task_basic_info t_info;
+    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+
+    if (KERN_SUCCESS != task_info (mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
+    {
+        return -1;
+    }
+
+    return t_info.resident_size / 1024;
+}
+
+#endif
+
+/*********************************************************************
+        #     #  ###  #     #  ######   #######  #     #   #####
+        #  #  #   #   ##    #  #     #  #     #  #  #  #  #     #
+        #  #  #   #   # #   #  #     #  #     #  #  #  #  #
+        #  #  #   #   #  #  #  #     #  #     #  #  #  #   #####
+        #  #  #   #   #   # #  #     #  #     #  #  #  #        #
+        #  #  #   #   #    ##  #     #  #     #  #  #  #  #     #
+         ## ##   ###  #     #  ######   #######   ## ##    #####
+*********************************************************************/
+
+#ifdef __WINDOWS__
+
+#include <windows.h>
+
+/********************************************************************************/
+size_t SystemInfoWindows::getNbCores () const
+{
+    size_t result = 0;
+
+    SYSTEM_INFO sysinfo;
+    GetSystemInfo (&sysinfo);
+    result = sysinfo.dwNumberOfProcessors;
+
+    if (result==0)  { result = 1; }
+
+    return result;
+}
+
+/********************************************************************************/
+string SystemInfoWindows::getHostName () const
+{
+    string result;
+
+    TCHAR  infoBuf[1024];
+    DWORD  bufCharCount = sizeof(infoBuf)/sizeof(infoBuf[0]);
+
+    if (GetComputerName( infoBuf, &bufCharCount ) )
+    {
+        result.assign (infoBuf, strlen(infoBuf));
+    }
+
+    return result;
+}
+
+#endif
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/system/impl/SystemInfoCommon.hpp b/gatb-core/src/gatb/system/impl/SystemInfoCommon.hpp
new file mode 100644
index 0000000..fe17d2b
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/SystemInfoCommon.hpp
@@ -0,0 +1,177 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file SystemInfoCommon.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementations common to various OS.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_SYSTEM_COMMON_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_SYSTEM_COMMON_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISystemInfo.hpp>
+#include <gatb/system/api/IMemory.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Abstract class for ISystemInfo interface.
+ *
+ * This class factorizes some methods with implementations common to
+ * several operating systems.
+ *
+ * It is still abstract since it doesn't implement all methods of
+ * ISystemInfo
+ */
+class SystemInfoCommon : public ISystemInfo
+{
+public:
+
+    /** \copydoc ISystemInfo::getVersion */
+    std::string getVersion () const;
+
+    /** \copydoc ISystemInfo::getBuildDate */
+    std::string getBuildDate () const;
+
+    /** \copydoc ISystemInfo::getBuildCompiler */
+    std::string getBuildCompiler () const;
+
+    /** \copydoc ISystemInfo::getBuildOptions */
+    std::string getBuildOptions () const;
+
+    /** \copydoc ISystemInfo::getBuildSystem */
+    std::string getBuildSystem () const;
+
+    /** \copydoc ISystemInfo::getHomeDirectory */
+    std::string getHomeDirectory ()  const {  return getenv("HOME") ? getenv("HOME") : ".";  }
+    
+    /** \copydoc ISystemInfo::getMemoryPhysicalFree */
+    u_int64_t getMemoryPhysicalFree () const  { return getMemoryPhysicalTotal()-getMemoryPhysicalUsed(); }
+
+    /** \copydoc ISystemInfo::getMemoryProject */
+    u_int64_t getMemoryProject () const  {  return std::min (getMemoryPhysicalFree() / (2*MBYTE), (u_int64_t)(5*1024)); }
+
+    /** \copydoc ISystemInfo::getMemorySelfUsed */
+    u_int64_t getMemorySelfUsed() const  { return 0; }
+
+    /** \copydoc ISystemInfo::getMemorySelfUsed */
+    u_int64_t getMemorySelfMaxUsed() const  { return 0; }
+
+    /** \copydoc ISystemInfo::createCpuInfo */
+    virtual CpuInfo* createCpuInfo (); //  { return new CpuInfoCommon(); }
+};
+
+/********************************************************************************/
+
+/** \brief Linux implementation for ISystemInfo interface.
+ */
+class SystemInfoLinux : public SystemInfoCommon
+{
+public:
+
+    /** \copydoc ISystemInfo::getNbCores */
+    size_t getNbCores () const ;
+
+    /** \copydoc ISystemInfo::getHostName */
+    std::string getHostName () const ;
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalTotal */
+    u_int64_t getMemoryPhysicalTotal () const ;
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalUsed */
+    u_int64_t getMemoryPhysicalUsed () const ;
+
+    /** \copydoc ISystemInfo::getMemoryBuffers */
+    u_int64_t getMemoryBuffers () const ;
+
+    /** \copydoc ISystemInfo::getMemorySelfUsed */
+    u_int64_t getMemorySelfUsed() const;
+
+    /** \copydoc ISystemInfo::getMemorySelfUsed */
+    u_int64_t getMemorySelfMaxUsed() const;
+};
+
+/********************************************************************************/
+
+/** \brief MacOs implementation for ISystemInfo interface.
+ */
+class SystemInfoMacos : public SystemInfoCommon
+{
+public:
+
+    /** \copydoc ISystemInfo::getNbCores */
+    size_t getNbCores () const ;
+
+    /** \copydoc ISystemInfo::getHostName */
+    std::string getHostName () const ;
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalTotal */
+    u_int64_t getMemoryPhysicalTotal () const;
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalUsed */
+    u_int64_t getMemoryPhysicalUsed () const;
+
+    /** \copydoc ISystemInfo::getMemoryBuffers */
+    u_int64_t getMemoryBuffers () const        { throw ExceptionNotImplemented(); }
+
+    /** \copydoc ISystemInfo::getMemorySelfUsed */
+    u_int64_t getMemorySelfUsed() const;
+};
+
+/********************************************************************************/
+
+/** \brief Windows implementation for ISystemInfo interface.
+ *
+ * IMPORTANT ! Windows implementation is not fully done. Using it may lead to
+ * ExceptionNotImplemented exception.
+ */
+class SystemInfoWindows : public SystemInfoCommon
+{
+public:
+
+    /** \copydoc ISystemInfo::getNbCores */
+    size_t getNbCores () const;
+
+    /** \copydoc ISystemInfo::getHostName */
+    std::string getHostName () const;
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalTotal */
+    u_int64_t getMemoryPhysicalTotal () const  { throw ExceptionNotImplemented(); }
+
+    /** \copydoc ISystemInfo::getMemoryPhysicalUsed */
+    u_int64_t getMemoryPhysicalUsed ()  const   { throw ExceptionNotImplemented(); }
+
+    /** \copydoc ISystemInfo::getMemoryBuffers */
+    u_int64_t getMemoryBuffers ()       const  { throw ExceptionNotImplemented(); }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_SYSTEM_IMPL_SYSTEM_COMMON_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/ThreadLinux.cpp b/gatb-core/src/gatb/system/impl/ThreadLinux.cpp
new file mode 100644
index 0000000..544a3ab
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/ThreadLinux.cpp
@@ -0,0 +1,146 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifdef __linux__
+
+#include <gatb/system/impl/ThreadLinux.hpp>
+#include <memory>
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+
+#include <unistd.h>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+class ThreadLinux : public IThread, public system::SmartPointer
+{
+public:
+	ThreadLinux (void* (mainloop) (void*), void* data)  {
+		
+		//set stack size to 8 MB
+		pthread_attr_t tattr;
+		int ret = pthread_attr_init ( &tattr ) ;
+		size_t size = 4096*2000 ; // must be multiple of page size
+		ret = pthread_attr_setstacksize(&tattr, size);
+		
+		pthread_create (&_thread, NULL,  mainloop, data);
+		
+		pthread_attr_destroy(&tattr);
+		
+	}
+	
+    ~ThreadLinux ()  { /* pthread_detach (_thread); */  }
+    void join ()     { pthread_join   (_thread, NULL);  }
+    Id getId () const { return (Id) _thread; }
+
+private:
+    pthread_t  _thread;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+class SynchronizerLinux : public ISynchronizer, public system::SmartPointer
+{
+public:
+    SynchronizerLinux ()             {  pthread_mutex_init (&_mutex, NULL);  }
+    virtual ~SynchronizerLinux ()    {  pthread_mutex_destroy (&_mutex);     }
+
+    void   lock ()  { pthread_mutex_lock   (&_mutex); }
+    void unlock ()  { pthread_mutex_unlock (&_mutex); }
+
+private:
+    pthread_mutex_t  _mutex;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThread* ThreadFactoryLinux::newThread (void* (*mainloop) (void*), void* data)
+{
+    return new ThreadLinux (mainloop, data);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ISynchronizer* ThreadFactoryLinux::newSynchronizer (void)
+{
+    return new SynchronizerLinux ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThread::Id ThreadFactoryLinux::getThreadSelf()
+{
+    return (IThread::Id) pthread_self();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int64_t ThreadFactoryLinux::getProcess ()
+{
+    return getpid ();
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* __LINUX__ */
diff --git a/gatb-core/src/gatb/system/impl/ThreadLinux.hpp b/gatb-core/src/gatb/system/impl/ThreadLinux.hpp
new file mode 100644
index 0000000..00f4f75
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/ThreadLinux.hpp
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ThreadLinux.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Thread management for Linux
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_LINUX_THREAD_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_LINUX_THREAD_HPP_
+
+#include <gatb/system/api/IThread.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Factory that creates IThread instances.
+ *
+ *  Thread creation needs merely the main loop function that will be called.
+ */
+class ThreadFactoryLinux : public IThreadFactory
+{
+public:
+    /** \copydoc IThreadFactory::newThread */
+    IThread* newThread (void* (*mainloop) (void*), void* data);
+
+    /** \copydoc IThreadFactory::newSynchronizer */
+    ISynchronizer* newSynchronizer (void);
+
+    /** \copydoc IThreadFactory::getThreadSelf */
+    IThread::Id getThreadSelf();
+
+    /** \copydoc IThreadFactory::getProcess */
+    u_int64_t getProcess ();
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_LINUX_THREAD_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/ThreadMacos.cpp b/gatb-core/src/gatb/system/impl/ThreadMacos.cpp
new file mode 100644
index 0000000..2d770ed
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/ThreadMacos.cpp
@@ -0,0 +1,147 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifdef __APPLE__
+
+#include <gatb/system/impl/ThreadMacos.hpp>
+#include <memory>
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+
+#include <unistd.h>
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace system { namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+class ThreadMacos : public IThread, public system::SmartPointer
+{
+public:
+	ThreadMacos (void* (mainloop) (void*), void* data)  {
+		
+		
+		//set stack size to 8 MB
+		pthread_attr_t tattr;
+		int ret = pthread_attr_init ( &tattr ) ;
+		size_t size = 4096*2000 ; // must be multiple of page size
+		ret = pthread_attr_setstacksize(&tattr, size);
+		
+		pthread_create (&_thread,&tattr,  mainloop, data);
+		
+		pthread_attr_destroy(&tattr);
+		
+	}
+	
+    ~ThreadMacos ()  { /* pthread_detach (_thread); */  }
+    void join ()     { pthread_join   (_thread, NULL);  }
+    Id getId ()  const { return (Id) _thread; }
+
+private:
+    pthread_t  _thread;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+class SynchronizerMacos : public ISynchronizer, public system::SmartPointer
+{
+public:
+	SynchronizerMacos ()            {  pthread_mutex_init (&_mutex, NULL);  }
+    virtual ~SynchronizerMacos()    {  pthread_mutex_destroy (&_mutex);     }
+
+    void   lock ()  { pthread_mutex_lock   (&_mutex); }
+    void unlock ()  { pthread_mutex_unlock (&_mutex); }
+
+private:
+    pthread_mutex_t  _mutex;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThread* ThreadFactoryMacos::newThread (void* (*mainloop) (void*), void* data)
+{
+    return new ThreadMacos (mainloop, data);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ISynchronizer* ThreadFactoryMacos::newSynchronizer (void)
+{
+    return new SynchronizerMacos ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IThread::Id ThreadFactoryMacos::getThreadSelf()
+{
+    return (IThread::Id) pthread_self();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int64_t ThreadFactoryMacos::getProcess ()
+{
+    return getpid ();
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* __LINUX__ */
diff --git a/gatb-core/src/gatb/system/impl/ThreadMacos.hpp b/gatb-core/src/gatb/system/impl/ThreadMacos.hpp
new file mode 100644
index 0000000..64b0088
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/ThreadMacos.hpp
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ThreadMacos.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Thread management for Macos
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_MACOS_THREAD_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_MACOS_THREAD_HPP_
+
+#include <gatb/system/api/IThread.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Factory that creates IThread instances.
+ *
+ *  Thread creation needs merely the main loop function that will be called.
+ */
+class ThreadFactoryMacos : public IThreadFactory
+{
+public:
+    /** \copydoc IThreadFactory::newThread */
+    IThread* newThread (void* (*mainloop) (void*), void* data);
+
+    /** \copydoc IThreadFactory::newSynchronizer */
+    ISynchronizer* newSynchronizer (void);
+
+    /** \copydoc IThreadFactory::getThreadSelf */
+    IThread::Id getThreadSelf();
+
+    /** \copydoc IThreadFactory::getProcess */
+    u_int64_t getProcess ();
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_SYSTEM_IMPL_MACOS_THREAD_HPP_ */
diff --git a/gatb-core/src/gatb/system/impl/TimeCommon.hpp b/gatb-core/src/gatb/system/impl/TimeCommon.hpp
new file mode 100644
index 0000000..7384abe
--- /dev/null
+++ b/gatb-core/src/gatb/system/impl/TimeCommon.hpp
@@ -0,0 +1,173 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file TimeCommon.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementations common to various OS.
+ */
+
+#ifndef _GATB_CORE_SYSTEM_IMPL_TIME_COMMON_HPP_
+#define _GATB_CORE_SYSTEM_IMPL_TIME_COMMON_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ITime.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+#include <assert.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace system    {
+/** \brief Implementation of Operating System abstraction layer */
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Abstract implementation of ITime interface.
+ *
+ * This implementation provides a default getDateString method.
+ */
+class TimeAbstract : public ITime
+{
+public:
+
+    /** Constructor.
+     * \param[in] unit : unit used for this instance */
+    TimeAbstract (Unit unit) : _unit (unit)  {}
+
+    /** \copydoc ITime::getUnit */
+    Unit getUnit ()   { return _unit; }
+
+    /** \copydoc ITime::getUnit */
+    std::string getDateString ()
+    {
+        char buffer[256];
+
+        const char* format = "%4.4d%2.2d%2.2d_%2.2d%2.2d%2.2d";
+
+        time_t now;       time (&now);
+        struct tm today;  today = * localtime (&now);
+
+        snprintf (buffer, sizeof(buffer), format,
+            today.tm_year + 1900, today.tm_mon  + 1, today.tm_mday, today.tm_hour, today.tm_min, today.tm_sec
+        );
+
+        return buffer;
+    }
+
+protected:
+    Unit _unit;
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of ITime interface.
+ *
+ * This class inherits from TimeAbstract class and add the getTimeStamp() method by using the
+ * system gettimeofday function.
+ */
+class TimeSystem : public TimeAbstract
+{
+public:
+
+    /** \copydoc TimeAbstract::TimeAbstract */
+    TimeSystem (Unit unit) : TimeAbstract (unit)
+    {
+        /** We have to check that the provided unit is ok. */
+        if (unit!=ITime::USEC  &&  unit!=ITime::MSEC  &&  unit!=ITime::SEC)
+        {
+            throw Exception ("bad time unit for TimeSystem");
+        }
+    }
+
+    /** \copydoc ITime::getTimeStamp */
+    Value getTimeStamp ()
+    {
+        timeval t;
+        int err = gettimeofday (&t, NULL);
+
+        if (err == 0)
+        {
+            switch (_unit)
+            {
+                case USEC:   return 1000000*t.tv_sec +  t.tv_usec;
+                case MSEC:   return 1000*t.tv_sec +  t.tv_usec / 1000;
+                case SEC:    return        t.tv_sec +  t.tv_usec / 1000000;
+                default:     return 0;
+            }
+        }
+        return 0;
+    }
+};
+
+/********************************************************************************/
+
+/** From Agner Fog's library. */
+extern "C" u_int64_t ReadTSC ();
+
+/**  \brief Implementation of ITime interface.
+ *
+ * This implementation tries to use a precise hardware time counter, known as
+ * the Time Stamp Counter. It is then possible to get time stamps as number
+ * of clock cycles which provides a great accuracy.
+ *
+ * Note that we use a third party library for this (see Agner Fog's work) providing
+ * a assembler coded function that returns the time stamp counter value.
+ */
+class TimeCycle : public TimeAbstract
+{
+public:
+
+    /** Constructor */
+    TimeCycle () : TimeAbstract (UNDEFINED)  {}
+
+    /** \copydoc ITime::getTimeStamp */
+    Value getTimeStamp ()
+    {
+#if 0
+        return ReadTSC();
+#else
+        return 0;
+#endif
+    }
+
+    /** \return an estimation of the CPU clock frequency in GHz.*/
+    double getClockFrequency ()
+    {
+        static double freq = 0;
+
+        /** We compute the clock frequency at the first call. */
+        if (freq == 0)
+        {
+            ITime::Value t0 = getTimeStamp();  sleep (1);  ITime::Value t1 = getTimeStamp();
+            freq = (double) ((t1 - t0) / 1000000) / 1000.0;
+        }
+        return freq;
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_SYSTEM_IMPL_TIME_COMMON_HPP_ */
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization1.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization1.cpp.in
new file mode 100644
index 0000000..54ad5d2
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization1.cpp.in
@@ -0,0 +1,19 @@
+
+// since we didn't define the functions in a .h file, that trick removes linker errors,
+// see http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html
+
+#include <gatb/kmer/impl/Model.cpp>
+#include <gatb/kmer/impl/ConfigurationAlgorithm.cpp>
+#include <gatb/kmer/impl/RepartitionAlgorithm.cpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace kmer { namespace impl  {
+/********************************************************************************/
+
+template struct Kmer                        <${KSIZE}>;
+template class ConfigurationAlgorithm       <${KSIZE}>;
+template class RepartitorAlgorithm          <${KSIZE}>;
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization10.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization10.cpp.in
new file mode 100644
index 0000000..30c249f
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization10.cpp.in
@@ -0,0 +1,40 @@
+#include <gatb/bcalm2/bcalm_algo.cpp>
+#include <gatb/bcalm2/bglue_algo.cpp>
+#include <gatb/bcalm2/ograph.cpp>
+#include <gatb/debruijn/impl/LinkTigs.cpp>
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+
+template void bcalm2<${KSIZE}>(Storage* storage, 
+        std::string prefix,
+        int kmerSize, 
+        int abundance, 
+        int minSize, 
+        int nb_threads, 
+        int minimizer_type, 
+        bool verbose
+        );
+template void bglue<${KSIZE}>(Storage* storage, 
+        std::string prefix,
+        int kmerSize, 
+        int nb_threads, 
+        bool verbose
+        );
+
+template class graph3<${KSIZE}>; // graph3<span> switch  
+
+template void link_tigs<${KSIZE}>
+    (std::string unitigs_filename, int kmerSize, int nb_threads, uint64_t &nb_unitigs, bool verbose);
+
+template void link_unitigs_pass<${KSIZE}>(const std::string unitigs_filename, bool verbose, const int pass, const int kmerSize);
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization2.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization2.cpp.in
new file mode 100644
index 0000000..2a7e6ce
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization2.cpp.in
@@ -0,0 +1,19 @@
+
+// since we didn't define the functions in a .h file, that trick removes linker errors,
+// see http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.cpp>
+#include <gatb/kmer/impl/PartitionsCommand.cpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace kmer { namespace impl  {
+/********************************************************************************/
+
+template class SortingCountAlgorithm        <${KSIZE}>;
+template class PartitionsCommand            <${KSIZE}>;
+template class PartitionsByHashCommand      <${KSIZE}>;
+template class PartitionsByVectorCommand    <${KSIZE}>;
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization3.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization3.cpp.in
new file mode 100644
index 0000000..f1d0140
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization3.cpp.in
@@ -0,0 +1,19 @@
+
+// since we didn't define the functions in a .h file, that trick removes linker errors,
+// see http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html
+
+#include <gatb/kmer/impl/BloomAlgorithm.cpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.cpp>
+#include <gatb/kmer/impl/DebloomMinimizerAlgorithm.cpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace kmer { namespace impl  {
+/********************************************************************************/
+
+template class BloomAlgorithm               <${KSIZE}>;
+template class DebloomAlgorithm             <${KSIZE}>;
+template class DebloomMinimizerAlgorithm    <${KSIZE}>;
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization4.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization4.cpp.in
new file mode 100644
index 0000000..8edde89
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization4.cpp.in
@@ -0,0 +1,17 @@
+
+// since we didn't define the functions in a .h file, that trick removes linker errors,
+// see http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html
+
+#include <gatb/kmer/impl/LinearCounter.cpp>
+#include <gatb/kmer/impl/MPHFAlgorithm.cpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace kmer { namespace impl  {
+/********************************************************************************/
+
+template class LinearCounter                <${KSIZE}>;
+template class MPHFAlgorithm                <${KSIZE}>;
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization5.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization5.cpp.in
new file mode 100644
index 0000000..d1f9749
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization5.cpp.in
@@ -0,0 +1,28 @@
+
+// since we didn't define the functions in a .h file, that trick removes linker errors,
+// see http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html
+
+#include <gatb/debruijn/impl/BranchingAlgorithm.cpp>
+#include <gatb/debruijn/impl/IterativeExtensions.cpp>
+#include <gatb/debruijn/impl/Graph.cpp>
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+template class BranchingAlgorithm   <${KSIZE}, Node, Edge, Graph>;
+
+typedef boost::variant<GraphData<${KSIZE}> > GraphDataVariantT; // same as GraphDataVariantFast in Graph.hpp
+
+template class BranchingAlgorithm <${KSIZE},Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >,GraphDataVariantT>>;
+//template class BranchingAlgorithm <${KSIZE}, NodeGU, EdgeGU, GraphUnitigsTemplate<${KSIZE}>>; // same as below
+
+template class IterativeExtensions  <${KSIZE}, Node, Edge, Graph>;
+
+template class IterativeExtensions  <${KSIZE}, Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >,GraphDataVariantT>>;
+//template class IterativeExtensions  <${KSIZE}, NodeGU, EdgeGU, GraphUnitigsTemplate<${KSIZE}>>; // IterativeExtensinos isn't ready for GraphU, because it asks for Node::Value then queries node.kmer
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization6.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization6.cpp.in
new file mode 100644
index 0000000..e4a5f43
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization6.cpp.in
@@ -0,0 +1,33 @@
+
+#include <gatb/debruijn/impl/Traversal.cpp>
+#include <gatb/debruijn/impl/Terminator.cpp>
+#include <gatb/debruijn/impl/Frontline.cpp>
+#include <gatb/tools/math/Integer.hpp>
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+typedef boost::variant<GraphData<${KSIZE}> > GraphDataVariantT;
+
+template class TraversalTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class MonumentTraversalTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class TerminatorTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class MPHFTerminatorTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class BranchingTerminatorTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class FrontlineTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+template class FrontlineBranchingTemplate <Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, 
+         GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type >>, GraphDataVariantT>>; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization7.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization7.cpp.in
new file mode 100644
index 0000000..fcaec87
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization7.cpp.in
@@ -0,0 +1,34 @@
+#include <gatb/debruijn/impl/Simplifications.cpp>
+#include <gatb/debruijn/impl/Graph.cpp>
+
+#include <gatb/tools/math/Integer.hpp>
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+typedef boost::variant<GraphData<${KSIZE}> > GraphDataVariantT;
+
+template struct Node_t<Kmer<${KSIZE}>::Type >; 
+template struct Edge_t<Node_t<Kmer<${KSIZE}>::Type > >; 
+template class GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, GraphDataVariantT>; 
+
+template class Simplifications <GraphTemplate<Node_t<Kmer<${KSIZE}>::Type>,Edge_t<Node_t<Kmer<${KSIZE}>::Type > >, GraphDataVariantT>, Node_t<Kmer<${KSIZE}>::Type>, Edge_t<Node_t<Kmer<${KSIZE}>::Type > >>; 
+
+// special instantiation (or specialization, i never know what's the difference)
+// actually not sure if it's ever used
+template <> template <> const Kmer<${KSIZE}>::Type& Node_t<Kmer<${KSIZE}>::Type>::getKmer() const
+{
+    return kmer;
+}
+
+
+
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization8.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization8.cpp.in
new file mode 100644
index 0000000..d824644
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization8.cpp.in
@@ -0,0 +1,27 @@
+#include <gatb/debruijn/impl/Simplifications.cpp>
+#include <gatb/debruijn/impl/UnitigsConstructionAlgorithm.cpp>
+#include <gatb/debruijn/impl/GraphUnitigs.cpp>
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+typedef boost::variant<GraphData<${KSIZE}> > GraphDataVariantT;
+
+template struct Node_t<Kmer<${KSIZE}>::Type >; 
+template struct Edge_t<Node_t<Kmer<${KSIZE}>::Type > >; 
+template class GraphUnitigsTemplate<${KSIZE}>; 
+template class UnitigsConstructionAlgorithm<${KSIZE}>; 
+
+
+template class Simplifications <GraphUnitigsTemplate<${KSIZE}>, NodeGU, EdgeGU >; 
+
+
+
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/template/TemplateSpecialization9.cpp.in b/gatb-core/src/gatb/template/TemplateSpecialization9.cpp.in
new file mode 100644
index 0000000..2be4388
--- /dev/null
+++ b/gatb-core/src/gatb/template/TemplateSpecialization9.cpp.in
@@ -0,0 +1,35 @@
+// has Node::Value all over, plus minia doesn't need them anymore.
+#if 0
+
+#include <gatb/debruijn/impl/Traversal.cpp>
+#include <gatb/debruijn/impl/Terminator.cpp>
+#include <gatb/debruijn/impl/Frontline.cpp>
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+namespace gatb { namespace core { namespace debruijn { namespace impl  {
+/********************************************************************************/
+
+template class TraversalTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class MonumentTraversalTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class TerminatorTemplate <NodeGU,EdgeGU,  
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class MPHFTerminatorTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class BranchingTerminatorTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class FrontlineTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+template class FrontlineBranchingTemplate <NodeGU,EdgeGU, 
+         GraphUnitigsTemplate<${KSIZE}>>; 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+#endif
diff --git a/gatb-core/src/gatb/tools/collections/api/Bag.hpp b/gatb-core/src/gatb/tools/collections/api/Bag.hpp
new file mode 100644
index 0000000..2b1951b
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/api/Bag.hpp
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Bag.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bag interface
+ *
+ *  This file holds interfaces related to the Bag interface, ie something we can put items into.
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_BAG_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_BAG_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/********************************************************************************/
+
+/** \brief Bag interface
+ *
+ * A bag is something we can put items into. Such items are typed and the type is
+ * provided as a template.
+ *
+ * Several ways for inserting items exist. There is also a flush method that makes
+ * sure that all the inserted items are actually in the bag.
+ */
+template <class Item> class Bag : public virtual  system::ISmartPointer
+{
+public:
+
+    /** Insert an item into the bag.
+     * \param[in] item : the item to be inserted. */
+    virtual void insert (const Item& item) = 0;
+
+    /** Insert items into the bag.
+     * \param[in] items : items to be inserted.
+     * \param[in] length : the number of items to be inserted. If 0 (default value),
+     *                     all the items of the vector are inserted. */
+    virtual void insert (const std::vector<Item>& items, size_t length=0)
+    {
+        size_t n = length==0 ? items.size() : length;
+        for (size_t i=0; i<n; i++)  {  insert (items[i]); }
+    }
+
+    /** Insert items into the bag.
+     * \param[in] items : items to be inserted.
+     * \param[in] length : number of items to be inserted. */
+    virtual void insert (const Item* items, size_t length)
+    {
+        for (size_t i=0; i<length; i++)  {  insert (items[i]); }
+    }
+
+    /** Flush the current content. May be useful for implementation that uses a cache. */
+    virtual void flush () = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_BAG_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/api/Collection.hpp b/gatb-core/src/gatb/tools/collections/api/Collection.hpp
new file mode 100644
index 0000000..152b83d
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/api/Collection.hpp
@@ -0,0 +1,86 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Collection.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_COLLECTION_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_COLLECTION_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/********************************************************************************/
+
+/** \brief Collection interface
+ *
+ * The Collection interface is the union of a Bag and an Iterable interfaces
+ *
+ * It is also to get/set properties (as [key,value]) to collections.
+ */
+template <class Item> class Collection : public Bag<Item>, public Iterable<Item>
+{
+public:
+
+    /** Destructor. */
+    virtual ~Collection () {}
+
+    /** \return the bag instance. */
+    virtual Bag<Item>* bag() = 0;
+
+    /** \return the iterable instance. */
+    virtual Iterable<Item>* iterable() = 0;
+
+    /** Remove physically the collection. */
+    virtual void remove () = 0;
+
+    /** Add a property to the collection.
+     * \param[in] key : key of the property
+     * \param[in] value  : value of the property. */
+    virtual void addProperty (const std::string& key, const std::string value) = 0;
+
+    /** Add a property to the collection.
+     * \param[in] key : key of the property
+     * \param[in] format  : printf like arguments
+     * \param[in] ... : variable arguments. */
+    virtual void addProperty (const std::string& key, const char* format, ...) = 0;
+
+    /** Retrieve a property for a given key
+     * \param[in] key : key of the property to be retrieved
+     * \return the value of the property. */
+    virtual std::string getProperty (const std::string& key) = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_COLLECTION_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/api/Container.hpp b/gatb-core/src/gatb/tools/collections/api/Container.hpp
new file mode 100644
index 0000000..cdb205d
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/api/Container.hpp
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Container.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Container interface
+ *
+ *  This file holds interfaces related to the Container interface, ie something we can ask for items.
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_CONTAINER_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_CONTAINER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/********************************************************************************/
+
+/** \brief Container interface
+ *
+ * The Container interface provides an operation that ask for a given item
+ */
+template <class Item> class Container : public virtual system::ISmartPointer
+{
+public:
+
+    /** Destructor. */
+    virtual ~Container() {}
+
+    /** Tells whether an item exists or not
+     * \return true if the item exists, false otherwise */
+    virtual bool contains (const Item& item) = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_CONTAINER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/api/Iterable.hpp b/gatb-core/src/gatb/tools/collections/api/Iterable.hpp
new file mode 100644
index 0000000..c11e8d1
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/api/Iterable.hpp
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Iterable.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Iterable interface
+ *
+ *  This file holds interfaces related to the Iterable interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_ITERABLE_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_ITERABLE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+/** \brief Tools package */
+namespace tools         {
+/** \brief Collections interfaces */
+namespace collections   {
+/********************************************************************************/
+
+/** \brief Iterable interface
+ *
+ * The Iterable interface provides an operation that creates an iterator. It also
+ * provides other methods that give the exact number (or an estimation) of items.
+ *
+ * Note that one Iterable instance can create several iterators.
+ */
+template <class Item> class Iterable : public virtual system::ISmartPointer
+{
+public:
+
+    virtual ~Iterable() {}
+
+    /** Create an iterator for the given Iterable instance.
+     * \return the new iterator. */
+    virtual dp::Iterator<Item>* iterator () = 0;
+
+    /** Direct iteration through a functor.
+     * \param[in] f : the functor to be applied on each sequence of the bank. */
+    template<typename Functor> void iterate (Functor f)
+    {
+        tools::dp::Iterator<Item>* it = this->iterator();  LOCAL (it);
+        for (it->first(); !it->isDone(); it->next())  { f((*it).item()); }
+    }
+
+    /** Return the number of items. If a specific implementation doesn't know the value,
+     * it should return -1 by convention.
+     * \return the number of items if known, -1 otherwise. */
+    virtual int64_t getNbItems () = 0;
+
+    /** Return the (approximate) number of items. If a specific implementation doesn't know the value,
+     * it should return -1 by convention.
+     * \return the number of items if known, -1 otherwise. */
+    virtual int64_t estimateNbItems () = 0;
+
+    /** Return a buffer of items.
+     * \param[out] buffer : the buffer
+     * \return the buffer */
+    virtual Item* getItems (Item*& buffer)
+    {
+        std::cout << "ERROR" << std::endl; exit(1);
+        //throw "Iterable::getItems... SHOULD NOT BE HERE..."; // this throw wasn't caught by the unit test. so i'm doing an exit now.
+        return buffer;
+    }
+
+    /** Return a buffer of items.
+     * \param[out] buffer : the buffer
+     * \param[in] start : index where to start in the buffer
+     * \param[in] nb : number of items to be retrieved
+     * \return the number of items retrieved */
+    virtual size_t getItems (Item*& buffer, size_t start, size_t nb)
+    {
+        std::cout << "ERROR" << std::endl; exit(1);
+        //throw "Iterable::getItems... SHOULD NOT BE HERE...";
+        return 0;
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_ITERABLE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/BagCache.hpp b/gatb-core/src/gatb/tools/collections/impl/BagCache.hpp
new file mode 100644
index 0000000..08f9a94
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/BagCache.hpp
@@ -0,0 +1,293 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BagCache.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bag implementation as a cache for a referred Bag
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_CACHE_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_CACHE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <vector>
+#include <algorithm>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/** Implementation of API from collections */
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Bag implementation as a cache to a referred Bag instance
+ *
+ * This implementation is a proxy to a Bag instance. One can insert items into such
+ * a bag, it will just put them into a cache. When the cache is full, all the cached
+ * items are inserted into the delegate; this operation may be protected by a
+ * synchronizer in case several threads use different BagCache on the same delegate.
+ */
+template <typename Item> class BagCache : public Bag<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor */
+    BagCache () : _ref(0), _synchro(0), _items(0), _nbMax(0), _idx(0)  {}
+
+    /** Constructor. Cache size is in terms of number of items (I think) */
+    BagCache (Bag<Item>* ref, size_t cacheSize, system::ISynchronizer* synchro=0)
+        : _ref(0), _synchro(0), _items(0), _nbMax(cacheSize), _idx(0)
+    {
+        setRef     (ref);
+        setSynchro (synchro);
+        _items = (Item*) CALLOC (_nbMax, sizeof(Item));
+        system::impl::System::memory().memset (_items, 0, _nbMax*sizeof(Item));
+    }
+
+    BagCache (const BagCache<Item>& b)
+        : _ref(0), _synchro(0), _items (0), _nbMax(b._nbMax), _idx(0)
+    {
+        setRef     (b._ref);
+        setSynchro (b._synchro);
+
+        _items = (Item*) CALLOC (_nbMax, sizeof(Item));
+        system::impl::System::memory().memset (_items, 0, _nbMax*sizeof(Item));
+    }
+
+    /** Destructor. */
+    virtual ~BagCache ()
+    {
+        /** We flush the potential remaining stuf. */
+        flush ();
+
+        /** We clean resources. */
+        setRef     (0);
+        setSynchro (0);
+
+        FREE (_items);
+    }
+
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)
+    {
+        if (_idx+1 > _nbMax)
+        {
+            if (_synchro)  {  _synchro->lock();    }
+            flushCache ();
+            if (_synchro)  {  _synchro->unlock();  }
+        }
+
+        _items[_idx++] = item;
+    }
+
+    /**  \copydoc Bag::flush */
+    void flush ()
+    {
+        if (_synchro)  {  _synchro->lock();    }
+        flushCache ();
+        _ref->flush();
+        if (_synchro)  {  _synchro->unlock();  }
+    }
+
+protected:
+
+    Bag<Item>*             _ref;
+    void setRef (Bag<Item>* ref)  { SP_SETATTR(ref); }
+
+    system::ISynchronizer* _synchro;
+    void setSynchro (system::ISynchronizer* synchro)  { SP_SETATTR(synchro); }
+
+    Item*                  _items;
+    size_t                 _nbMax;
+    size_t                 _idx;
+
+    void flushCache ()
+    {
+        if (_idx > 0)  { _ref->insert (_items, _idx);  }
+        _idx = 0;
+    }
+};
+    
+/********************************************************************************/
+
+/** \brief Bag implementation as a cache to a referred Bag instance.
+ *
+ * The cache is sorted before sent to the reference
+ */
+template <typename Item> class BagCacheSortedBuffered : public BagCache<Item>
+{
+public:
+    
+    /** Constructor. */
+    BagCacheSortedBuffered (Bag<Item>* ref, size_t cacheSize, Item* sharedBuffer, size_t sharedCacheSize,  size_t * idxShared,  system::ISynchronizer* outsynchro=0, system::ISynchronizer* synchro=0
+)
+    : BagCache<Item>(ref, cacheSize, synchro), _outsynchro(0),_idxShared(idxShared)  {
+        _sharedBuffer = sharedBuffer;
+        setOutSynchro (outsynchro);
+        _sharedCacheSize = sharedCacheSize;
+      //  printf("BagCacheSortedBuffered created with _idxShared %p : %zu \n",_idxShared,*_idxShared);
+    }
+
+    
+    /** Destructor. */
+    virtual ~BagCacheSortedBuffered ()
+    {
+        /** We flush the potential remaining stuf. */
+        //flush ();
+        
+        /** We clean resources. */
+        setOutSynchro (0);
+    }
+    
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)
+    {
+        if (this->_idx+1 > this->_nbMax)
+        {
+            if (this->_synchro)  {  this->_synchro->lock();    }
+            flushLocalCache ();
+            if (this->_synchro)  {  this->_synchro->unlock();  }
+        }
+        this->_items[this->_idx++] = item;
+    }
+    
+    /**  \copydoc Bag::flush */
+    void flush ()
+    {
+        //printf("main flush \n");
+        if (this->_synchro)  {  this->_synchro->lock();    }
+        
+        flushLocalCache ();
+
+        flushCache ();
+        if (this->_synchro)  {  this->_synchro->unlock();  }
+
+        if (this->_outsynchro)  {  this->_outsynchro->lock();    }
+        this->_ref->flush();
+        if (this->_outsynchro)  {  this->_outsynchro->unlock();  }
+    }
+    
+private:
+    Item * _sharedBuffer; // shared buffer for sorting, allocated from outside
+    system::ISynchronizer* _outsynchro;
+    void setOutSynchro (system::ISynchronizer* outsynchro)  { SP_SETATTR(outsynchro); }
+    size_t _sharedCacheSize;
+    size_t * _idxShared;
+
+    void flushLocalCache () //flush local cache to shared buffer
+    {
+      //  printf("flush local cache to %p  from %p  %zu \n",_sharedBuffer + *_idxShared,this->_items,this->_idx);
+        if (this->_idx > 0)  {
+            
+            while(*_idxShared + this->_idx > _sharedCacheSize)
+            // must be a while, not an 'if' : flushCache may release temporarily the lock, so must re-check when exiting flushcache
+            {
+                //sort and flush shared buffer to ref bag
+                flushCache ();
+            }
+
+            system::impl::System::memory().memcpy (_sharedBuffer + *_idxShared, this->_items, this->_idx*sizeof(Item));
+            *_idxShared += this->_idx;
+            
+            //this->_ref->insert (this->_items, this->_idx);
+
+        }
+        
+        this->_idx = 0;
+    }
+    
+    void flushCache () //flush shared buffer to ref bag
+    {
+     //   printf("flush  shared cache %zu  from  %p this %p\n",*_idxShared,_sharedBuffer,this);
+
+        if (*_idxShared > 0)
+        {
+            //first duplicate into temp vector
+            std::vector<Item> tempArray(_sharedBuffer, _sharedBuffer + *_idxShared);
+            *_idxShared = 0;
+            //here shared buffer is effectively flushed to temp array, safe to unlock
+
+            if (this->_synchro)  {  this->_synchro->unlock();    }
+            std::sort (tempArray.begin(), tempArray.end());
+
+            //flush to file using outsynchro
+            if (this->_outsynchro)  {  this->_outsynchro->lock();    }
+            this->_ref->insert (tempArray, tempArray.size());
+            if (this->_outsynchro)  {  this->_outsynchro->unlock();  }
+
+            if (this->_synchro)  {  this->_synchro->lock();    }
+        }
+        //  if (*_idxShared > 0)  { this->_ref->insert (_sharedBuffer, *_idxShared);  }
+        //  *_idxShared = 0;
+    }
+};
+    
+/********************************************************************************/
+
+/** \brief Bag implementation as a cache to a referred Bag instance.
+ *
+ * The cache is sorted before sent to the reference
+ */
+template <typename Item> class BagCacheSorted : public BagCache<Item>
+{
+public:
+
+    /** Constructor. */
+    BagCacheSorted (Bag<Item>* ref, size_t cacheSize, system::ISynchronizer* synchro=0)
+        : BagCache<Item>(ref, cacheSize, synchro)  { }
+
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)
+    {
+        if (this->_idx+1 > this->_nbMax)
+        {
+            std::sort (this->_items.begin (), this->_items.end ());
+
+            if (this->_synchro)  {  this->_synchro->lock();      }
+            this->flushCache ();
+            if (this->_synchro)  {  this->_synchro->unlock();    }
+        }
+
+        this->_items[this->_idx++] = item;
+    }
+
+    /**  \copydoc Bag::flush */
+    void flush ()
+    {
+        this->_items.resize (this->_idx);
+        std::sort (this->_items.begin (), this->_items.end ());
+
+        if (this->_synchro)  {  this->_synchro->lock();    }
+        this->flushCache ();
+        this->_ref->flush();
+        if (this->_synchro)  {  this->_synchro->unlock();  }
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_CACHE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/BagFile.hpp b/gatb-core/src/gatb/tools/collections/impl/BagFile.hpp
new file mode 100644
index 0000000..f004c79
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/BagFile.hpp
@@ -0,0 +1,303 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BagFile.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bag implementation for file
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_FILE_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_FILE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+
+#include <zlib.h>
+
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/** Implementation of API from collections */
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Bag implementation for file
+ */
+template <typename Item> class BagFile : public Bag<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    BagFile (const std::string& filename) : _filename(filename), _file(0)
+    {
+        /** We first erase the file. */
+        //system::impl::System::file().remove (filename); // NOTE: before, the file was erased. Not anymore now, because GraphUnitigs sometimes reopens the same file (through this function) and wants to read it. I checked with minia, it's fine to not remove the file, there is no endless appending going on. But, some unit tests assumed that the file was deleted, so I had to modify them.
+
+        //std::cout << "BagFile created: " << _filename << ", size: " << system::impl::System::file().getSize(filename) << std::endl;
+
+        /** We get a handle on the file. */
+        if (system::impl::System::file().doesExist(filename))
+            _file = system::impl::System::file().newFile (filename, "rb+");
+        else
+            _file = system::impl::System::file().newFile (filename, "wb");
+    }
+
+    /** Destructor. */
+    ~BagFile ()
+    {
+        if (_file)  { delete _file; }
+    }
+
+    /** Get the name of the file.
+     * \return the file name.  */
+    const std::string& getName () const { return _filename; }
+
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)  {  _file->fwrite (&item, sizeof(Item), 1);  
+        //std::cout << "inserted(Item) to " << _filename << std::endl;
+    }
+
+    /**  \copydoc Bag::insert(const std::vector<Item>& items, size_t length) */
+    void insert (const std::vector<Item>& items, size_t length)
+    {
+        if (length == 0)  { length = items.size(); }
+        _file->fwrite (items.data(), sizeof(Item), length);
+        //std::cout << "inserted(vector<Items>,length) to " << _filename << std::endl;
+    }
+
+    /**  \copydoc Bag::insert(const Item* items, size_t length) */
+    void insert (const Item* items, size_t length)
+    {
+        _file->fwrite (items, sizeof(Item), length);
+        //std::cout << "inserted(Items*,length) to " << _filename << " " << length << std::endl;
+    }
+
+    /**  \copydoc Bag::flush */
+    void flush ()  { _file->flush(); }
+
+private:
+    std::string _filename;
+    system::IFile* _file;
+};
+
+    
+
+/* \brief Bag implementation for file
+ */
+template <typename Item> class BagGzFile : public Bag<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor. */
+    BagGzFile (const std::string& filename) : _filename(filename), _gzfile(0)
+    {
+        /** We first erase the file. */
+        system::impl::System::file().remove (filename);
+        
+        /** We get a handle on the file. */
+        _gzfile =   gzopen(filename.c_str(),"wb1"); // (gzFile *)
+    }
+    
+    /** Destructor. */
+    ~BagGzFile ()
+    {
+        if (_gzfile)  {  gzclose(_gzfile); }
+    }
+    
+    /** */
+    const std::string& getName () const { return _filename; }
+    
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)  { gzwrite(_gzfile,&item,sizeof(Item)); }
+    
+    void insert (const std::vector<Item>& items, size_t length)
+    {
+        if (length == 0)  { length = items.size(); }
+        //_file->fwrite (items.data(), sizeof(Item), length);
+        gzwrite(_gzfile,items.data(),sizeof(Item)*length);
+    }
+    
+    /** */
+    void insert (const Item* items, size_t length)
+    {
+        gzwrite(_gzfile,items,sizeof(Item)*length);
+    }
+    
+    /**  \copydoc Bag::flush */
+    void flush ()  {
+        gzflush(_gzfile,Z_FINISH); // not sure if necessary
+    }
+    
+private:
+    std::string _filename;
+    system::IFile* _file;
+    gzFile  _gzfile;
+};
+
+    
+//stores items in a file, compressed by storing count, and only diff with previous item
+// todo writing is not yet cached
+    //todo implem codage diff
+template <typename Item> class BagCountCompressedFile : public Bag<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor. */
+    BagCountCompressedFile (const std::string& filename) : _filename(filename), _file(0),_previous()
+    {
+        /** We first erase the file. */
+        system::impl::System::file().remove (filename);
+        _buffer_size = 16384;
+        /** We get a handle on the file. */
+        _file = system::impl::System::file().newFile (filename, "wb+");
+        _bufferOut  = (u_int8_t*) MALLOC (sizeof(u_int8_t) * _buffer_size);
+        _idx=0;
+        _size_item = sizeof(Item);
+        _sizeOutput =0;
+        _sizeInput =0;
+
+    }
+    
+    /** Destructor. */
+    ~BagCountCompressedFile ()
+    {
+        //printf("In %llu B  (%llu MB ) Out %llu  B  (%llu MB ) ratio  %f \n",_sizeInput,_sizeInput/(1024LL*1024LL), _sizeOutput,_sizeOutput/(1024LL*1024LL), _sizeInput / (float) _sizeOutput);
+
+        if (_file)  { delete _file; }
+        free( _bufferOut );
+    }
+    
+    /** */
+    const std::string& getName () const { return _filename; }
+    
+    /**  \copydoc Bag::insert */
+    void insert (const Item& item)  {
+        printf("insert single element not supported in BagCountCompressedFile\n");
+
+    }
+    
+    void insert (const std::vector<Item>& items, size_t length)
+    {
+        if (length == 0)  { length = items.size(); }
+        
+        this->insert(items.data(), length);
+        
+    }
+    
+    /** */
+    void insert (const Item* items, size_t length)
+    {
+      //  Item diff_to_prev ;
+
+//        u_int64_t cpt = 0;
+//        u_int64_t diffmoy = 0;
+        
+        _previous = items[0];
+        u_int8_t abundance = 0;
+
+        for (size_t ii=0; ii< length; ii++) {
+            //diff_to_prev =  items[i] - _previous;
+            if (items[ii] == _previous)  {
+                
+                abundance++;
+
+                if(abundance == (u_int8_t)(~0) )
+                {
+                    write(abundance,_previous);
+                    abundance     = 0;
+                }
+                
+            }
+            else
+            {
+                //diffmoy =  (diffmoy * cpt +  *((u_int64_t *) (&(items[ii]))) -  *((u_int64_t *) &_previous)   )/ (cpt+1) ;
+                //cpt++;
+                
+                write(abundance,_previous);
+                abundance     = 1;
+                _previous = items[ii];
+            }
+        }
+        //last item
+        write(abundance,_previous);
+
+
+        _sizeInput += length*sizeof(Item);
+        //printf("Cpt %lli diffmoy %lli \n",cpt,diffmoy);
+        
+    }
+    
+    /**  \copydoc Bag::flush */
+    void flush ()  {
+        //printf("--- flush  BagCountCompressedFile %d this %p ---\n",_idx,this);
+        flushBuffer ();
+        _file->flush();
+    }
+    
+    //maybe use a bagfile encapsulated in a bagcache to write big chunks to file..
+    //or internal small buffer  16KB
+private:
+    void write (u_int8_t  abundance,Item  elem)  {
+        // printf("writing abundance %i \n",abundance);
+        
+        if( (_idx + (1+_size_item)) >= _buffer_size )
+        {
+            flushBuffer ();
+        }
+        memcpy(_bufferOut+_idx,&abundance, 1 ); _idx+= 1;
+        memcpy(_bufferOut+_idx,&elem, _size_item ); _idx+= _size_item;
+        
+//        _file->fwrite (&abundance, sizeof(u_int8_t), 1);
+//        _file->fwrite (&elem, sizeof(Item), 1);
+        _sizeOutput += 1+ sizeof(Item);
+    }
+
+    void flushBuffer ()  {
+        _file->fwrite (_bufferOut, sizeof(u_int8_t), _idx);
+        _idx =0;
+
+    }
+    
+
+    
+    std::string _filename;
+    system::IFile* _file;
+    Item _previous;
+    u_int64_t _sizeOutput;
+    u_int64_t _sizeInput;
+    u_int8_t*           _bufferOut;
+    int             _idx;
+    size_t _size_item;
+    size_t _buffer_size;
+};
+    
+    
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_FILE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/BagPartition.hpp b/gatb-core/src/gatb/tools/collections/impl/BagPartition.hpp
new file mode 100644
index 0000000..4f3179b
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/BagPartition.hpp
@@ -0,0 +1,150 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BagPartition.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bag partition implementation for file
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_PARTITION_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_PARTITION_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+#include <vector>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+template<typename Item> class BagFilePartition
+{
+public:
+    BagFilePartition (size_t nbPartitions, const std::string& format) : _partitions(nbPartitions), _uriFormat(format)
+    {
+        /** We delete physically the partition files. */
+        for (size_t i=0; i<_partitions.size(); i++)  {  system::impl::System::file().remove (getFilename(i));  }
+
+        /** We create the partition files. */
+        for (size_t i=0; i<_partitions.size(); i++)
+        {
+            _partitions[i] = new BagFile<Item> (getFilename(i));
+            _partitions[i]->use ();
+        }
+    }
+
+    /** */
+    virtual ~BagFilePartition ()
+    {
+        /** We logically delete the partition files. */
+        for (size_t i=0; i<_partitions.size(); i++)
+        {
+            _partitions[i]->forget();
+        }
+    }
+
+    /** */
+    Bag<Item>*& operator[] (size_t idx)  { return _partitions[idx]; }
+
+    /** */
+    size_t size () const  { return _partitions.size(); }
+
+private:
+
+    std::string getFilename (size_t idx)
+    {
+        char filename[128];  snprintf (filename, sizeof(filename), _uriFormat.c_str(), idx);
+        return std::string(filename);
+    }
+
+    std::vector<Bag<Item>*> _partitions;
+    std::string             _uriFormat;
+};
+
+/********************************************************************************/
+
+template<typename Item> class BagCachePartition
+{
+public:
+    BagCachePartition (BagFilePartition<Item>& partition, system::ISynchronizer* synchro)
+        : _ref(partition), cache(partition.size()), _synchro(synchro), _cacheNbItems(1<<12)
+    {
+        /** We create the partition files. */
+        for (size_t i=0; i<cache.size(); i++)
+        {
+            cache[i] = createBag ((partition[i]), _cacheNbItems, synchro);
+            cache[i]->use ();
+        }
+    }
+
+    BagCachePartition (const BagCachePartition<Item>& p)
+        : _ref(p._ref), cache(p.cache.size()), _synchro(p._synchro), _cacheNbItems(p._cacheNbItems)
+    {
+        /** We create the partition files. */
+        for (size_t i=0; i<cache.size(); i++)
+        {
+            cache[i] = createBag ((p._ref[i]), _cacheNbItems, _synchro);
+            cache[i]->use ();
+        }
+    }
+
+    virtual ~BagCachePartition ()
+    {
+        for (size_t i=0; i<cache.size(); i++)
+        {
+            cache[i]->flush();
+            cache[i]->forget ();
+        }
+    }
+
+    /** */
+    Bag<Item>*& operator[] (size_t idx)  { return cache[idx]; }
+
+    /** */
+    size_t size () const  { return cache.size(); }
+
+private:
+
+    virtual BagCache<Item>* createBag (Bag<Item>*& b, size_t cacheSize, system::ISynchronizer* synchro)
+    {
+        return new BagCache<Item> (b, cacheSize, synchro);
+        //return new BagCacheSorted<Item> (b, cacheSize, synchro);  // don't use when using OAHash for DSK solid kmers filling.
+    }
+
+    BagFilePartition<Item>&  _ref;
+    std::vector <Bag<Item>*>  cache;
+    system::ISynchronizer*   _synchro;
+    size_t                   _cacheNbItems;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BAG_PARTITION_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/Bloom.cpp b/gatb-core/src/gatb/tools/collections/impl/Bloom.cpp
new file mode 100644
index 0000000..ac60623
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/Bloom.cpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+u_int8_t bit_mask [] = {
+    0x01,  //00000001
+    0x02,  //00000010
+    0x04,  //00000100
+    0x08,  //00001000
+    0x10,  //00010000
+    0x20,  //00100000
+    0x40,  //01000000
+    0x80   //10000000
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/tools/collections/impl/Bloom.hpp b/gatb-core/src/gatb/tools/collections/impl/Bloom.hpp
new file mode 100644
index 0000000..bae6993
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/Bloom.hpp
@@ -0,0 +1,1289 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Bloom.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bloom implementation
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Container.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Enums.hpp>
+#include <bitset>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+extern u_int8_t bit_mask [];
+
+/********************************************************************************/
+/** \brief Define a set of hash functions
+ *
+ * This class defines a set of hash functions for a given (template) type.
+ *
+ * One can get a hash code for a given [function,item] through the operator()
+ *
+ * Note: this class is mainly used by Bloom filters implementations. It is not
+ * primarly targeted for end users but they could nevertheless use it.
+ */
+template <typename Item> class HashFunctors
+{
+public:
+
+    /** Constructor.
+     * \param[in] nbFct : number of hash functions to be used
+     * \param[in] seed : some initialization code for defining the hash functions. */
+    HashFunctors (size_t nbFct, u_int64_t seed=0) : _nbFct(nbFct), user_seed(seed)
+    {
+        generate_hash_seed ();
+    }
+
+    /** Get a hash code for a hash function and a given item.
+     * \param[in] key : item for which we want a hash code
+     * \param[in] idx : index of the hash function to be used
+     * \return the hash code for the item. */
+    u_int64_t operator ()  (const Item& key, size_t idx)  {  return hash1 (key, seed_tab[idx]);  }
+
+private:
+
+    /* */
+    void generate_hash_seed ()
+    {
+        static const u_int64_t rbase[NSEEDSBLOOM] =
+        {
+            0xAAAAAAAA55555555ULL,  0x33333333CCCCCCCCULL,  0x6666666699999999ULL,  0xB5B5B5B54B4B4B4BULL,
+            0xAA55AA5555335533ULL,  0x33CC33CCCC66CC66ULL,  0x6699669999B599B5ULL,  0xB54BB54B4BAA4BAAULL,
+            0xAA33AA3355CC55CCULL,  0x33663366CC99CC99ULL
+        };
+
+        for (size_t i=0; i<NSEEDSBLOOM; ++i)  {  seed_tab[i] = rbase[i];  }
+        for (size_t i=0; i<NSEEDSBLOOM; ++i)  {  seed_tab[i] = seed_tab[i] * seed_tab[(i+3) % NSEEDSBLOOM] + user_seed ;  }
+    }
+
+    size_t _nbFct;
+
+    static const size_t NSEEDSBLOOM = 10;
+    u_int64_t seed_tab[NSEEDSBLOOM];
+    u_int64_t user_seed;
+};
+
+/********************************************************************************/
+
+/** \brief Bloom interface
+ *
+ * We define a Bloom filter has a container (something that tells whether an item is here or not) and
+ * a bag (something we can put items into).
+ *
+ * This interface has a template argument corresponding to the type of items to be inserted in the filter.
+ * Note that implementations should provide hash functions supporting the template type.
+ *
+ * As expected, there is no Iterable interface here because it is not possible to enumerate the items
+ * inserted in a Bloom filter only with the Bloom filter information.
+ */
+template <typename Item> class IBloom : public Container<Item>, public Bag<Item>, public system::SmartPointer
+{
+public:
+
+    /** Destructor. */
+    virtual ~IBloom() {}
+
+    /** Get the raw bit set of the Bloom filter.
+     * \return Bloom filter's bit set. */
+    virtual u_int8_t*& getArray    () = 0;
+
+    /** Get the size of the Bloom filter (in bytes).
+     * \return the size of the bit set of the Bloom filter */
+    virtual u_int64_t  getSize     () = 0;
+
+    /** Get the size of the Bloom filter (in bits).
+     * \return the size of the bit set of the Bloom filter */
+    virtual u_int64_t  getBitSize  () = 0;
+
+    /** Get the number of hash functions used for the Bloom filter.
+     * \return the number of hash functions. */
+    virtual size_t     getNbHash   () const = 0;
+
+    /** Tells whether an item is in the Bloom filter
+     * \param[in] item : item to test.
+     * \return the presence or not of the item
+     */
+	virtual bool contains (const Item& item) = 0;
+
+    /** Tells whether the 4 neighbors of the given item are in the Bloom filter.
+     * The 4 neighbors are computed from the given item by adding successively
+     * nucleotides 'A', 'C', 'T' and 'G'
+     * Note: some implementation may not provide this service.
+     * \param[in] item : starting item from which neighbors are computed.
+     * \param[in] right : if true, successors are computed, otherwise predecessors are computed.
+     * \return a bitset with a boolean for the 'contains' status of each neighbor
+     */
+	virtual std::bitset<4> contains4 (const Item& item, bool right) = 0;
+
+    /** Tells whether the 8 neighbors of the given item are in the Bloom filter.
+     * A default implementation may be two calls to contains4 with right==true and
+     * right==left and by concatenating the two bitsets.
+     * Note: some implementation may not provide this service.
+     * \param[in] item : starting item from which neighbors are computed.
+     * \return a bitset with a boolean for the 'contains' status of each neighbor
+     */
+    virtual std::bitset<8> contains8 (const Item& item) = 0;
+
+    /** Get the name of the implementation class.
+     * \return the class name. */
+    virtual std::string  getName   () const  = 0;
+
+    /** Return the number of 1's in the Bloom (nibble by nibble)
+     * \return the weight of the Bloom filter */
+    virtual unsigned long  weight () = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Bloom filter implementation
+ *
+ * This implementation is an abstract factorization for subclasses. It factorizes
+ * a few methods and attributes.
+ */
+template <typename Item> class BloomContainer : public IBloom<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] tai_bloom : size (in bits) of the bloom filter.
+     * \param[in] nbHash : number of hash functions to use */
+    BloomContainer (u_int64_t tai_bloom, size_t nbHash = 4)
+        : _hash(nbHash), n_hash_func(nbHash), blooma(0), tai(tai_bloom), nchar(0), isSizePowOf2(false)
+    {
+        nchar  = (1+tai/8LL);
+        blooma = (unsigned char *) MALLOC (nchar*sizeof(unsigned char)); // 1 bit per elem
+        system::impl::System::memory().memset (blooma, 0, nchar*sizeof(unsigned char));
+
+        /** We look whether the provided size is a power of 2 or not.
+         *   => if we have a power of two, we can optimize the modulo operations. */
+        isSizePowOf2 = (tai && !(tai & (tai - 1)));
+
+        /** In case we have a power of 2^N, we set the size to 2^N-1 and use the classical trick:
+         *     a % 2^N  <=>  a & (2^N-1)
+         * */
+        if (isSizePowOf2)  {  tai --;  }
+    }
+
+    /** Destructor. */
+    virtual ~BloomContainer ()
+    {
+        system::impl::System::memory().free (blooma);
+    }
+
+    /** \copydoc IBloom::getNbHash */
+    size_t getNbHash () const { return n_hash_func; }
+
+    /** \copydoc Container::contains. */
+    bool contains (const Item& item)
+    {
+        if (isSizePowOf2)
+        {
+            for (size_t i=0; i<n_hash_func; i++)
+            {
+                u_int64_t h1 = _hash (item,i) & tai;
+               // if ((blooma[h1 >> 3 ] & bit_mask[h1 & 7]) != bit_mask[h1 & 7])  {  return false;  }
+				if ((blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0)  {  return false;  }
+
+            }
+        }
+        else
+        {
+            for (size_t i=0; i<n_hash_func; i++)
+            {
+                u_int64_t h1 = _hash (item,i) % tai;
+               // if ((blooma[h1 >> 3 ] & bit_mask[h1 & 7]) != bit_mask[h1 & 7])  {  return false;  }
+				if ((blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0)  {  return false;  }
+
+            }
+        }
+        return true;
+    }
+
+    /** \copydoc IBloom::contains4. */
+	virtual std::bitset<4> contains4 (const Item& item, bool right)
+    {   throw system::ExceptionNotImplemented ();  }
+
+    /** \copydoc IBloom::contains8. */
+    virtual std::bitset<8> contains8 (const Item& item)
+    {   throw system::ExceptionNotImplemented ();  }
+
+    /** \copydoc IBloom::getArray. */
+    virtual u_int8_t*& getArray     ()  { return blooma; }
+
+    /** \copydoc IBloom::getSize. */
+    virtual u_int64_t  getSize      ()  { return nchar;  }
+
+    /** \copydoc IBloom::getBitSize. */
+    virtual u_int64_t  getBitSize   ()  { return tai;    }
+
+    /** \copydoc IBloom::getName. */
+    virtual std::string  getName    () const  = 0;
+
+protected:
+
+    HashFunctors<Item> _hash;
+    size_t n_hash_func;
+
+    u_int8_t* blooma;
+    u_int64_t tai;
+    u_int64_t nchar;
+    bool      isSizePowOf2;
+};
+
+/********************************************************************************/
+/** \brief Bloom filter implementation
+ */
+template <typename Item> class Bloom : public BloomContainer<Item>
+{
+public:
+
+    /** \copydoc BloomContainer::BloomContainer */
+    Bloom (u_int64_t tai_bloom, size_t nbHash = 4)  : BloomContainer<Item> (tai_bloom, nbHash)  {}
+
+    /** \copydoc Bag::insert. */
+    void insert (const Item& item)
+    {
+        if (this->isSizePowOf2)
+        {
+            for (size_t i=0; i<this->n_hash_func; i++)
+            {
+                u_int64_t h1 = this->_hash (item,i) & this->tai;
+                this->blooma [h1 >> 3] |= bit_mask[h1 & 7];
+            }
+        }
+        else
+        {
+            for (size_t i=0; i<this->n_hash_func; i++)
+            {
+                u_int64_t h1 = this->_hash (item,i) % this->tai;
+                this->blooma [h1 >> 3] |= bit_mask[h1 & 7];
+            }
+        }
+    }
+
+    /** \copydoc Bag::flush */
+    void flush ()  {}
+
+    /** \copydoc IBloom::getName */
+    std::string  getName () const { return "Bloom"; }
+
+    /** Dump the Bloom filter bitset into a file.
+     * OBSOLETE
+     * \param[in] filename : file where to dump the bitset. */
+    void dump (const char* filename)
+    {
+        FILE* file = fopen(filename,"wb");
+        fwrite (this->blooma, sizeof(unsigned char), this->nchar, file);
+        fclose (file);
+    }
+
+    /** \copydoc IBloom::weight */
+    unsigned long weight()
+    {
+        const unsigned char oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
+        long weight = 0;
+        for(uint64_t index = 0; index < this->nchar; index++)
+        {
+            unsigned char current_char = this->blooma[index];
+            weight += oneBits[current_char&0x0f];
+            weight += oneBits[current_char>>4];
+        }
+        return weight;
+    }
+};
+
+/********************************************************************************/
+/** \brief Bloom filter null implementation
+ *
+ * This is a "null" implementation of the IBloom interface. It means that all
+ * the contains-like requests will return false.
+ */
+template <typename Item> class BloomNull : public IBloom<Item>
+{
+public:
+
+    /** Destructor. */
+    virtual ~BloomNull() {}
+
+    /** \copydoc IBloom::getArray */
+    u_int8_t*& getArray    () { return a; }
+
+    /** \copydoc IBloom::getSize */
+    u_int64_t  getSize     () { return 0; }
+
+    /** \copydoc IBloom::getBitSize */
+    u_int64_t  getBitSize  () { return 0; }
+
+    /** \copydoc IBloom::getNbHash */
+    size_t     getNbHash   () const { return 0; }
+
+    /** \copydoc IBloom::getName */
+    virtual std::string  getName   () const  { return "BloomNull"; }
+
+    /** \copydoc IBloom::contains4 */
+    std::bitset<4> contains4 (const Item& item, bool right)  {return std::bitset<4>();}
+
+    /** \copydoc IBloom::contains8 */
+	std::bitset<8> contains8 (const Item& item)  { return std::bitset<8>(); }
+
+    /** \copydoc IBloom::contains */
+    bool contains (const Item& item) { return false; }
+
+    /** \copydoc IBloom::insert */
+    void insert (const Item& item) {}
+
+    /** \copydoc IBloom::flush  */
+    void flush ()  {}
+
+    /** \copydoc IBloom::weight*/
+    unsigned long weight ()  { return 0;}
+
+private:
+    u_int8_t* a;
+};
+
+/********************************************************************************/
+/** \brief Bloom filter implementation with synchronization
+ *
+ * This implementation allows to insert items in the same Bloom filter by
+ * different threads at the same time. It uses low level synchronization
+ * mechanism like __sync_fetch_and_or
+ */
+template <typename Item> class BloomSynchronized : public Bloom<Item>
+{
+public:
+
+    /** \copydoc Bloom::Bloom */
+    BloomSynchronized (u_int64_t tai_bloom, size_t nbHash = 4)  : Bloom<Item> (tai_bloom, nbHash)  {}
+
+    /** \copydoc Bag::insert. */
+    void insert (const Item& item)
+    {
+        if (this->isSizePowOf2)
+        {
+            for (size_t i=0; i<this->n_hash_func; i++)
+            {
+                u_int64_t h1 = this->_hash (item,i) & this->tai;
+                __sync_fetch_and_or (this->blooma + (h1 >> 3), bit_mask[h1 & 7]);
+            }
+        }
+        else
+        {
+            for (size_t i=0; i<this->n_hash_func; i++)
+            {
+                u_int64_t h1 = this->_hash (item,i) % this->tai;
+                __sync_fetch_and_or (this->blooma + (h1 >> 3), bit_mask[h1 & 7]);
+            }
+        }
+    }
+
+    /** \copydoc IBloom::getName*/
+    std::string  getName () const { return "basic"; }
+};
+
+/********************************************************************************/
+/** \brief Bloom filter implementation with CPU cache consideration
+ *
+ * This implementation tries to avoid CPU cache misses by improving memory locality.
+ *
+ * The idea is to compute the first hash function as usual. Then the other hash
+ * functions are computed in order to return values near to the first value.
+ *
+ * The proximity is defined by a block size. Note that a too small block will
+ * produce more false positive than usual.
+ */
+template <typename Item> class BloomCacheCoherent : public Bloom<Item>
+{
+public:
+    
+    /** Constructor.
+     * \param[in] tai_bloom : size (in bits) of the bloom filter.
+     * \param[in] nbHash : number of hash functions to use
+     * \param[in] block_nbits : size of the block (actual 2^nbits) */
+    BloomCacheCoherent (u_int64_t tai_bloom, size_t nbHash = 4,size_t block_nbits = 12)
+        : Bloom<Item> (tai_bloom + 2*(1<<block_nbits), nbHash),_nbits_BlockSize(block_nbits)
+    {
+        _mask_block = (1<<_nbits_BlockSize) - 1;
+        _reduced_tai = this->tai -  2*(1<<_nbits_BlockSize) ;//2* for neighbor coherent
+    }
+    
+     /** \copydoc Bag::insert. */
+    void insert (const Item& item)
+    {
+        //for insert, no prefetch, perf is not important
+        u_int64_t h0;
+
+        h0 = this->_hash (item,0) % _reduced_tai;
+
+        __sync_fetch_and_or (this->blooma + (h0 >> 3), bit_mask[h0 & 7]);
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = h0  + (simplehash16( item, i) & _mask_block )   ;
+            __sync_fetch_and_or (this->blooma + (h1 >> 3), bit_mask[h1 & 7]);
+        }
+    }
+    
+    /** \copydoc IBloom::getName*/
+    std::string  getName () const { return "cache"; }
+
+    /** \copydoc IBloom::getBitSize*/
+    u_int64_t  getBitSize   ()  { return _reduced_tai;    }
+        
+    /** \copydoc Container::contains. */
+    bool contains (const Item& item)
+    {
+        u_int64_t tab_keys [20];
+        u_int64_t h0;
+
+        h0 = this->_hash (item,0) % _reduced_tai;
+        __builtin_prefetch(&(this->blooma [h0 >> 3] ), 0, 3); //preparing for read
+
+        //compute all hashes during prefetch
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+           tab_keys[i] =  h0  + (simplehash16( item, i) & _mask_block );// with simplest hash
+        }
+
+        if ((this->blooma[h0 >> 3 ] & bit_mask[h0 & 7]) ==0 )  {  return false;  }
+        
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = tab_keys[i];
+			if ((this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0)  {  return false;  }
+        }
+        return true;
+    }
+    
+    /** \copydoc IBloom::weight*/
+    unsigned long weight()
+    {
+        throw system::ExceptionNotImplemented();
+    }
+    
+protected:
+    u_int64_t _mask_block;
+    size_t    _nbits_BlockSize;
+    u_int64_t _reduced_tai;
+};
+	
+/********************************************************************************/
+
+/** \brief Bloom filter implementation with cache consideration
+ *
+ * This implementation improve memory locality in the Bloom filter between a kmer
+ * and its neighbors. This means that this implementation should be used only
+ * with Item being a kmer.
+ *
+ * In particular, it implements contains4 and contains8 in a clever way.
+ */
+template <typename Item> class BloomNeighborCoherent : public BloomCacheCoherent<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] tai_bloom : size (in bits) of the bloom filter.
+     * \param[in] kmersize : kmer size
+     * \param[in] nbHash : number of hash functions to use
+     * \param[in] block_nbits : size of the block (actual 2^nbits) */
+    BloomNeighborCoherent (u_int64_t tai_bloom, size_t kmersize , size_t nbHash = 4,size_t block_nbits = 12 )  :
+    BloomCacheCoherent<Item> (tai_bloom , nbHash,block_nbits), _kmerSize(kmersize)
+    {
+        cano2[ 0] = 0;
+        cano2[ 1] = 1;
+        cano2[ 2] = 2;
+        cano2[ 3] = 3;
+        cano2[ 4] = 4;
+        cano2[ 5] = 5;
+        cano2[ 6] = 3;
+        cano2[ 7] = 7;
+        cano2[ 8] = 8;
+        cano2[ 9] = 9;
+        cano2[10] = 0;
+        cano2[11] = 4;
+        cano2[12] = 9;
+        cano2[13] = 13;
+        cano2[14] = 1;
+        cano2[15] = 5;
+
+        Item un;
+        un.setVal(1);
+        _maskkm2  = (un << ((_kmerSize-2)*2)) - un;
+        _kmerMask = (un << (_kmerSize*2))     - un;
+
+        Item trois;
+        trois.setVal(3);
+
+        _prefmask = trois << ((_kmerSize-1)*2); //bug was here 3 instead of item trois
+    }
+
+    /** \copydoc Bag::insert. */
+    void insert (const Item& item)
+    {
+        u_int64_t h0;
+        u_int64_t racine;
+
+        Item suffix = item & 3 ;
+        Item prefix = (item & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        prefix = prefix  & 15 ;
+
+        u_int64_t pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        Item hashpart = ( item >> 2 ) & _maskkm2 ;  // delete 1 nt at each side
+        Item rev =  revcomp(hashpart,_kmerSize-2);
+        if(rev<hashpart) hashpart = rev; //transform to canonical
+
+        // Item km = item;
+        // rev =  revcomp(km,_kmerSize);
+        // if(rev < km) km = rev; //transform to canonical
+        
+        racine = ((this->_hash (hashpart,0) ) % this->_reduced_tai) ;
+        //h0 = ((this->_hash (item >> 2,0) ) % this->_reduced_tai)  + (suffix_val & this->_mask_block);
+        //h0 = racine + (this->_hash (km,0)  & this->_mask_block);
+        h0 = racine + (pref_val );
+        __sync_fetch_and_or (this->blooma + (h0 >> 3), bit_mask[h0 & 7]);
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = h0  + ( (simplehash16( hashpart, i))  & this->_mask_block )   ;
+            //	u_int64_t h1 = racine  + ( (simplehash16( km, i))  & this->_mask_block )   ; //ceci avec simplehash+8  semble ok
+            //	u_int64_t h1 = h0  +  ( (this->_hash (item>>2,i)+ suffix_val)  & _mask_block );
+            __sync_fetch_and_or (this->blooma + (h1 >> 3), bit_mask[h1 & 7]);
+        }
+    }
+
+    /** \copydoc IBloom::getName*/
+    std::string  getName () const { return "neighbor"; }
+
+    /** \copydoc IBloom::getBitSize*/
+    u_int64_t  getBitSize   ()  { return this->_reduced_tai;    }
+
+    /** \copydoc Container::contains. */
+    bool contains (const Item& item)
+    {
+        u_int64_t racine;
+
+        Item suffix = item & 3 ;
+        Item prefix = (item & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        prefix = prefix  & 15 ;
+
+        u_int64_t pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        Item hashpart = ( item >> 2 ) & _maskkm2 ;  // delete 1 nt at each side
+        Item rev =  revcomp(hashpart,_kmerSize-2);
+        if(rev<hashpart) hashpart = rev; //transform to canonical
+
+        // Item km = item;
+        // rev =  revcomp(km,_kmerSize);
+        // if(rev < km) km = rev; //transform to canonical
+
+        u_int64_t tab_keys [20];
+        u_int64_t h0;
+
+        racine = ((this->_hash (hashpart,0) ) % this->_reduced_tai) ;
+        //h0 = racine + (this->_hash (km,0)  & this->_mask_block);
+        h0 = racine + (pref_val  );
+        //printf("h0 %llu\n",h0);
+
+        __builtin_prefetch(&(this->blooma [h0 >> 3] ), 0, 3); //preparing for read
+
+        //compute all hashes during prefetch
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            tab_keys[i] =  h0  + (  (simplehash16( hashpart, i)  ) & this->_mask_block );// with simplest hash
+            // tab_keys[i] =  racine  + (  (simplehash16( km, i)  ) & this->_mask_block );
+            // tab_keys[i] =  h0  + (  (this->_hash (item>>2,i) + suffix_val ) & _mask_block );// with simplest hash
+        }
+
+        if ((this->blooma[h0 >> 3 ] & bit_mask[h0 & 7]) == 0 )  {  return false;  } //was != bit_mask[h0 & 7]
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = tab_keys[i];
+            if ((this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0 )  {  return false;  } //was != bit_mask[h0 & 7]
+        }
+        return true;
+    }
+
+    /** \copydoc IBloom::contains4*/
+    std::bitset<4> contains4 (const Item& item, bool right)
+    {
+        //ask for all 4 neighbors of item in one call
+        // give it CAAA
+        // if right == true  it wil test the 4 neighbors AAAA, AAAC, AAAT, AAAG
+        // if right == false : left extension   ACAA, CCAA , TCAA  , GCAA
+
+        u_int64_t h0, i0, j0, k0;
+        Item elem,hashpart,rev ;
+        Item un ; un.setVal(1);
+        Item deux ; deux.setVal(2);
+        Item trois ; trois.setVal(3);
+
+        size_t shifts = (_kmerSize -1)*2;
+
+        if (right)  {  elem = (item << 2) & _kmerMask ;  }
+        else        {  elem = (item >> 2) ;              }
+
+        //get the canonical of middle part
+        hashpart = ( elem >> 2 ) & _maskkm2 ;
+        rev =  revcomp(hashpart,_kmerSize-2);
+        if(rev<hashpart) hashpart = rev;
+
+        u_int64_t racine = ((this->_hash (hashpart,0) ) % this->_reduced_tai) ;
+
+        __builtin_prefetch(&(this->blooma [racine >> 3] ), 0, 3); //preparing for read
+
+        Item tmp,suffix,prefix;
+        u_int64_t pref_val;
+
+        //with val of prefix+suffix  for neighbor shift
+
+        tmp = elem;
+        suffix = tmp & 3 ;
+        prefix = (tmp & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        h0 = racine + (pref_val  & this->_mask_block);
+
+        if(right) tmp = elem+un;
+        else tmp = elem + (un<<shifts) ;
+        suffix = tmp & 3 ;
+        prefix = (tmp & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        i0 = racine + (pref_val  & this->_mask_block);
+
+        if(right) tmp = elem+deux;
+        else tmp = elem + (deux<<shifts) ;
+        suffix = tmp & 3 ;
+        prefix = (tmp & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        j0 = racine + (pref_val  & this->_mask_block);
+
+        if(right) tmp = elem+trois;
+        else tmp = elem + (trois<<shifts) ;
+        suffix = tmp & 3 ;
+        prefix = (tmp & _prefmask)  >> ((_kmerSize-2)*2);
+        prefix += suffix;
+        pref_val = cano2[prefix.getVal()]; //get canonical of pref+suffix
+
+        k0 = racine + (pref_val  & this->_mask_block);
+
+        /*
+         //with full hash of kmer for neighbor shift
+        tmp = elem;
+        rev =  revcomp(tmp,_kmerSize);
+        if(rev < tmp) tmp = rev;
+        h0 = racine + (this->_hash (tmp,0)  & this->_mask_block);
+
+        if(right) tmp = elem+un;
+        else tmp = elem + (un<<shifts) ;
+        rev =  revcomp(tmp,_kmerSize); // many revcomp, optim possible
+        if(rev < tmp) tmp = rev;
+        i0 = racine + (this->_hash (tmp,0)  & this->_mask_block);
+
+        if(right) tmp = elem+deux;
+        else tmp = elem + (deux<<shifts) ;
+        rev =  revcomp(tmp,_kmerSize);
+        if(rev < tmp) tmp = rev;
+        j0 = racine + (this->_hash (tmp,0)  & this->_mask_block);
+
+        if(right) tmp = elem+trois;
+        else tmp = elem + (trois<<shifts) ;
+        rev =  revcomp(tmp,_kmerSize);
+        if(rev < tmp) tmp = rev;
+        k0 = racine + (this->_hash (tmp,0)  & this->_mask_block);
+         */
+
+        u_int64_t tab_hashes [20];
+
+        //compute all hashes during prefetch
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            tab_hashes[i] = simplehash16( hashpart, i) & this->_mask_block ;
+        }
+
+        std::bitset<4> resu;
+        resu.set (0, true);
+        resu.set (1, true);
+        resu.set (2, true);
+        resu.set (3, true);
+
+        if ((this->blooma[h0 >> 3 ] & bit_mask[h0 & 7]) == 0)  {  resu.set (0, false);  }
+        if ((this->blooma[i0 >> 3 ] & bit_mask[i0 & 7]) == 0)  {  resu.set (1, false);  }
+        if ((this->blooma[j0 >> 3 ] & bit_mask[j0 & 7]) == 0)  {  resu.set (2, false);  }
+        if ((this->blooma[k0 >> 3 ] & bit_mask[k0 & 7]) == 0)  {  resu.set (3, false);  }
+
+        //plus rapide avec 4 boucles separees que une ci dessous avec test pour break
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  h0 +  tab_hashes[i]   ;
+            if ( (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu.set (0, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  i0 +  tab_hashes[i]   ;
+            if ( (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu.set (1, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  j0 +  tab_hashes[i]   ;
+            if ( (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu.set (2, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  k0 +  tab_hashes[i]   ;
+            if ( (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu.set (3, false); break; }
+        }
+
+        /*
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  h0 +  tab_hashes[i]   ;
+            u_int64_t i1 =  i0 +  tab_hashes[i]   ;
+            u_int64_t j1 =  j0 +  tab_hashes[i]   ;
+            u_int64_t k1 =  k0 +  tab_hashes[i]   ;
+
+            if (resu[0] && (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu[0]=false;  }  //test  resu[0] &&
+            if (resu[1] &&(this->blooma[i1 >> 3 ] & bit_mask[i1 & 7]) == 0  )  {  resu[1]=false;  }
+            if (resu[2] &&(this->blooma[j1 >> 3 ] & bit_mask[j1 & 7]) == 0  )  {  resu[2]=false;  }
+            if (resu[3] &&(this->blooma[k1 >> 3 ] & bit_mask[k1 & 7]) == 0  )  {  resu[3]=false;  }
+
+            if(resu[0]== false &&  resu[1]== false && resu[2]== false && resu[3]== false)
+                break;
+        }
+         */
+
+        return resu;
+    }
+
+    /** \copydoc IBloom::contains8*/
+    std::bitset<8> contains8 (const Item& item)
+    {
+        std::bitset<4> resultRight = this->contains4 (item, true);
+        std::bitset<4> resultLeft  = this->contains4 (item, false);
+        std::bitset<8> result;
+        size_t i=0;
+        for (size_t j=0; j<4; j++)  { result.set (i++, resultRight[j]); }
+        for (size_t j=0; j<4; j++)  { result.set (i++, resultLeft [j]); }
+        return result;
+    }
+
+private:
+    unsigned int cano2[16];
+    Item _maskkm2;
+    Item _prefmask;
+    Item _kmerMask;
+    size_t _kmerSize;
+};
+    
+/********************************************************************************/
+
+/** \brief Bloom filter implementation with cache consideration
+ *
+ * This implementation improve memory locality in the Bloom filter between a kmer
+ * and its neighbors. This means that this implementation should be used only
+ * with Item being a kmer.
+ *
+ * In particular, it implements contains4 and contains8 in a clever way.
+ */
+template <typename Item> class BloomExtendedNeighborCoherent : public BloomCacheCoherent<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] tai_bloom : size (in bits) of the bloom filter.
+     * \param[in] kmersize : kmer size
+     * \param[in] hmersize : hashpart size
+     * \param[in] nbHash : number of hash functions to use
+     * \param[in] block_nbits : size of the block (actual 2^nbits) */
+    BloomExtendedNeighborCoherent (u_int64_t tai_bloom, size_t kmersize, size_t nbHash = 7, size_t block_nbits = 12)
+        : BloomCacheCoherent<Item> (tai_bloom, nbHash,block_nbits), _kmerSize(kmersize)
+    {
+        _smerSize = _kmerSize - 2;
+        _hmerSize = _smerSize - 8;
+
+        cano6 = (unsigned short int *) MALLOC (0x1000 * sizeof(unsigned short int));
+        system::impl::System::memory().memset (cano6, 0, 0x1000 * sizeof(unsigned short int));
+
+        hpos = (unsigned char *) MALLOC (0x40000 * sizeof(unsigned char));
+        system::impl::System::memory().memset (hpos, 0, 0x40000 * sizeof(unsigned char));
+
+        precomputeCano6();
+        precomputeHpos();
+
+        Item un = 1;
+        _kmerMask = (un << (_kmerSize*2))   - un;
+        _smerMask = (un << (_smerSize*2))   - un;
+        _hmerMask = (un << (_hmerSize*2))   - un;
+
+        Item trois = 3;
+        _kmerPrefMask = ((Item)0x3f) << ((_kmerSize-3)*2);
+        _smerPrefMask = trois << ((_smerSize-1)*2);
+
+        _hmerCount = _smerSize - _hmerSize + 1;
+
+        _sharedpart = _smerMask + un; // > max value
+        _hashpartFwd = _hmerMask + un; // > max value
+        _hashpartRev = _hmerMask + un; // > max value
+
+        _hashpartHits = 0;
+    }
+
+    ~BloomExtendedNeighborCoherent() {
+        system::impl::System::memory().free (cano6);
+        system::impl::System::memory().free (hpos);
+    }
+
+    /** \copydoc Bag::insert. */
+    void insert (const Item& item)
+    {
+        u_int64_t h0;
+        u_int64_t racine;
+
+        Item suffix = item & ((Item)0x3f);
+        Item limits = (item & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        u_int64_t delta = cano6[limits.getVal()];
+
+        Item sharedpart = (item >> 2) & _smerMask;  // delete 1 nt at each side
+        Item rev =  revcomp(sharedpart, _smerSize);
+        if(rev < sharedpart) sharedpart = rev; //transform to canonical
+
+        _hpart = extractHashpart(sharedpart);
+        _hpartHash = this->_hash (_hpart, 0);
+        
+        racine = _hpartHash % this->_reduced_tai;
+        h0 = racine + delta;
+        __sync_fetch_and_or(this->blooma + (h0 >> 3), bit_mask[h0 & 7]);
+
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = h0 + ((simplehash16( _hpart, i)) & this->_mask_block);
+            __sync_fetch_and_or(this->blooma + (h1 >> 3), bit_mask[h1 & 7]);
+        }
+    }
+
+    /** \copydoc IBloom::getName*/
+    std::string  getName () const { return "neighbor2"; }
+
+    /** \copydoc IBloom::getBitSize*/
+    u_int64_t  getBitSize   ()  { return this->_reduced_tai;    }
+
+    /** \copydoc Container::contains. */
+    bool contains (const Item& item, const Item& next = 0)
+    {
+        Item suffix = item & ((Item)0x3f);
+        Item limits = (item & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        u_int64_t delta = cano6[limits.getVal()];
+
+        bool reverse = false;
+        Item sharedpart = (item >> 2) & _smerMask ;  // delete 1 nt at each side
+        Item rev =  revcomp(sharedpart, _smerSize);
+        if(rev < sharedpart) {
+            sharedpart = rev; //transform to canonical
+            reverse = true;
+        }
+
+        if (_sharedpart != sharedpart)
+        {
+            Item hpart = extractHashpart(sharedpart);
+
+            if (reverse)
+            {
+                if (hpart != _hashpartRev) {
+                    _hashpartRev = hpart;
+                    _hashpartRevHash = this->_hash(_hashpartRev, 0);
+                    prepareTabHashes(_tabHashesRev, _hashpartRev);
+                }
+                else
+                {
+                    _hashpartHits++;
+                }
+
+                _hpart = reverse ? _hashpartRev : _hashpartFwd;
+                _hpartHash = _hashpartRevHash;
+                _tabHashes = _tabHashesRev;
+            }
+            else
+            {
+                 if (hpart != _hashpartFwd) {
+                    _hashpartFwd = hpart;
+                    _hashpartFwdHash = this->_hash(_hashpartFwd, 0);
+                    prepareTabHashes(_tabHashesFwd, _hashpartFwd);
+                }
+                else
+                {
+                    _hashpartHits++;
+                }
+
+                _hpart = _hashpartFwd;
+                _hpartHash = _hashpartFwdHash;
+                _tabHashes = _tabHashesFwd;
+            }
+
+            _sharedpart = sharedpart;
+        }
+        
+        u_int64_t racine, h0;
+
+        racine = _hpartHash % this->_reduced_tai;
+        h0 = racine + delta;
+
+        __builtin_prefetch(&(this->blooma [racine >> 3] ), 0, 3); // preparing for read
+
+        // compute all hashes during prefetch
+        u_int64_t tab_keys [20];
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            tab_keys[i] =  h0 + _tabHashes[i]; // with simplest hash
+        }
+
+        if ((this->blooma[h0 >> 3 ] & bit_mask[h0 & 7]) == 0 )  {  return false;  } // was != bit_mask[h0 & 7]
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 = tab_keys[i];
+            if ((this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0 )  {  return false;  } // was != bit_mask[h1 & 7]
+        }
+
+        return true;
+    }
+
+    /** \copydoc IBloom::contains4*/
+    std::bitset<4> contains4 (const Item& item, bool right)
+    {
+        //ask for all 4 neighbors of item in one call
+        // give it CAAA
+        // if right == true  it wil test the 4 neighbors AAAA, AAAC, AAAT, AAAG
+        // if right == false : left extension   ACAA, CCAA , TCAA  , GCAA
+
+        u_int64_t h0, i0, j0, k0;
+        Item elem,sharedpart,rev ;
+        Item un = 1;
+        Item deux = 2;
+        Item trois = 3;
+        // soleil !
+        bool reverse = false;
+
+        size_t shifts = (_kmerSize -1)*2;
+
+        if (right)  {  elem = (item << 2) & _kmerMask ;  }
+        else        {  elem = (item >> 2) ;              }
+
+        //get the canonical of middle part
+        sharedpart = ( elem >> 2 ) & _smerMask ;
+        rev =  revcomp(sharedpart,_smerSize);
+        if(rev<sharedpart) {
+            sharedpart = rev;
+            reverse = true;
+        }
+
+
+            Item hpart = extractHashpart(sharedpart);
+
+            if (reverse)
+            {
+                if (hpart != _hashpartRev) {
+                    _hashpartRev = hpart;
+                    _hashpartRevHash = this->_hash(_hashpartRev, 0);
+                    prepareTabHashes(_tabHashesRev, _hashpartRev);
+                }
+                else
+                {
+                    _hashpartHits++;
+                }
+
+                _hpart = reverse ? _hashpartRev : _hashpartFwd;
+                _hpartHash = _hashpartRevHash;
+                _tabHashes = _tabHashesRev;
+            }
+            else
+            {
+                 if (hpart != _hashpartFwd) {
+                    _hashpartFwd = hpart;
+                    _hashpartFwdHash = this->_hash(_hashpartFwd, 0);
+                    prepareTabHashes(_tabHashesFwd, _hashpartFwd);
+                }
+                else
+                {
+                    _hashpartHits++;
+                }
+
+                _hpart = _hashpartFwd;
+                _hpartHash = _hashpartFwdHash;
+                _tabHashes = _tabHashesFwd;
+            }
+
+            _sharedpart = sharedpart;
+
+
+        u_int64_t racine = _hpartHash % this->_reduced_tai;
+
+        __builtin_prefetch(&(this->blooma [racine >> 3] ), 0, 3); //preparing for read
+
+        Item tmp,suffix,limits;
+        u_int64_t delta;
+
+        //with val of prefix+suffix  for neighbor shift
+
+        tmp = elem;
+        suffix = tmp & ((Item)0x3f) ;
+        limits = (tmp & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        delta = cano6[limits.getVal()]; //get canonical of pref+suffix
+
+        h0 = racine + delta;
+
+        if(right) tmp = elem+un;
+        else tmp = elem + (un<<shifts) ;
+        suffix = tmp & ((Item)0x3f) ;
+        limits = (tmp & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        delta = cano6[limits.getVal()]; //get canonical of pref+suffix
+
+        i0 = racine + delta;
+
+        if(right) tmp = elem+deux;
+        else tmp = elem + (deux<<shifts) ;
+        suffix = tmp & ((Item)0x3f) ;
+        limits = (tmp & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        delta = cano6[limits.getVal()]; //get canonical of pref+suffix
+
+        j0 = racine + delta;
+
+        if(right) tmp = elem+trois;
+        else tmp = elem + (trois<<shifts) ;
+        suffix = tmp & ((Item)0x3f) ;
+        limits = (tmp & _kmerPrefMask)  >> ((_kmerSize-6)*2);
+        limits += suffix;
+        delta = cano6[limits.getVal()]; //get canonical of pref+suffix
+
+        k0 = racine + delta;
+
+
+        std::bitset<4> resu;
+        resu.set (0, true);
+        resu.set (1, true);
+        resu.set (2, true);
+        resu.set (3, true);
+
+        if ((this->blooma[h0 >> 3 ] & bit_mask[h0 & 7]) == 0)  {  resu.set (0, false);  }
+        if ((this->blooma[i0 >> 3 ] & bit_mask[i0 & 7]) == 0)  {  resu.set (1, false);  }
+        if ((this->blooma[j0 >> 3 ] & bit_mask[j0 & 7]) == 0)  {  resu.set (2, false);  }
+        if ((this->blooma[k0 >> 3 ] & bit_mask[k0 & 7]) == 0)  {  resu.set (3, false);  }
+
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t h1 =  h0 +  _tabHashes[i]   ;
+            if ( (this->blooma[h1 >> 3 ] & bit_mask[h1 & 7]) == 0  )  {  resu.set (0, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t i1 =  i0 +  _tabHashes[i]   ;
+            if ( (this->blooma[i1 >> 3 ] & bit_mask[i1 & 7]) == 0  )  {  resu.set (1, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t j1 =  j0 +  _tabHashes[i]   ;
+            if ( (this->blooma[j1 >> 3 ] & bit_mask[j1 & 7]) == 0  )  {  resu.set (2, false); break; }
+        }
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            u_int64_t k1 =  k0 +  _tabHashes[i]   ;
+            if ( (this->blooma[k1 >> 3 ] & bit_mask[k1 & 7]) == 0  )  {  resu.set (3, false); break; }
+        }
+
+        return resu;
+    }
+
+    u_int64_t getHashpartHits() const {
+        return _hashpartHits;
+    }
+
+
+private:
+    unsigned short int *cano6;
+    unsigned char *hpos;
+
+    Item _kmerMask;
+    Item _smerMask;
+    Item _hmerMask;
+    Item _kmerPrefMask;
+    Item _smerPrefMask;
+    size_t _kmerSize;
+    size_t _smerSize;
+    size_t _hmerSize;
+    int16_t _hmerCount;
+
+    Item _sharedpart;
+
+    Item _hpart;
+    u_int64_t _hpartHash;
+    u_int64_t* _tabHashes;
+
+    Item _hashpartFwd;
+    u_int64_t _hashpartFwdHash;
+    u_int64_t _tabHashesFwd[20];
+
+    Item _hashpartRev;
+    u_int64_t _hashpartRevHash;
+    bool _hpartRevHashComputed;
+    u_int64_t _tabHashesRev[20];
+
+    u_int64_t _hashpartHits;
+
+
+    inline void prepareTabHashes(u_int64_t* tab, const Item& toHash)
+    {
+        for (size_t i=1; i<this->n_hash_func; i++)
+        {
+            tab[i] = simplehash16(toHash, i) & this->_mask_block ;
+        }
+    }
+
+    Item extractHashpart(const Item& sharedpart)
+    {
+        Item posPart = sharedpart >> (_smerSize*2 - 18);
+        unsigned char pos = hpos[posPart.getVal()];
+
+        Item hpart = (sharedpart >> ((_hmerCount - pos - 1)*2)) & _hmerMask;
+        return hpart;
+    }
+
+    void precomputeCano6()
+    {
+        for (uint64_t i=0; i<0x1000; i++) {
+            Item cur = (Item)i;
+            Item rev = revcomp(cur, 6);
+            Item cano = (cur < rev) ? cur : rev;
+            cano6[i] = cano.getVal();
+        }
+    }
+
+    unsigned char minpos(const u_int64_t& nmer, size_t n)
+    {
+        static const size_t MINIMIZER_SIZE = 2;
+        static const uint64_t minMask = (1 << (MINIMIZER_SIZE*2)) - 1;
+
+        uint64_t min = nmer & minMask;
+        unsigned char pos = n - MINIMIZER_SIZE;
+
+        for (size_t i=1; i <= n - MINIMIZER_SIZE; i++) {
+            uint64_t cur = (nmer >> (i*2)) & minMask;
+
+            if (cur < min) {
+                min = cur;
+                pos = n - MINIMIZER_SIZE - i;
+            }
+        }
+
+        return pos;
+    }
+
+    void precomputeHpos()
+    {
+        for (uint64_t i=0; i<0x40000; i++) {
+            hpos[i] = minpos(i, 9);
+        }
+    }
+};
+	
+/********************************************************************************/
+
+/** \brief Factory that creates IBloom instances
+ *
+ */
+class BloomFactory
+{
+public:
+
+    /** Singleton method
+     * \return the singleton. */
+    static BloomFactory& singleton()  { static BloomFactory instance; return instance; }
+
+    /** Create a IBloom instance
+     * \param[in] kind : kind of the IBloom instance to be created
+     * \param[in] tai_bloom : size of the Bloom filter (in bits)
+     * \param[in] nbHash : number of hash functions for the Bloom filter
+     * \param[in] kmersize : kmer size (used only for some implementations).
+     */
+    template<typename T> IBloom<T>* createBloom (tools::misc::BloomKind kind, u_int64_t tai_bloom, size_t nbHash, size_t kmersize)
+    {
+        switch (kind)
+        {
+            case tools::misc::BLOOM_NONE:      return new BloomNull<T>             ();
+            case tools::misc::BLOOM_BASIC:     return new BloomSynchronized<T>     (tai_bloom, nbHash);
+            case tools::misc::BLOOM_CACHE:     return new BloomCacheCoherent<T>    (tai_bloom, nbHash);
+			case tools::misc::BLOOM_NEIGHBOR:  return new BloomNeighborCoherent<T> (tai_bloom, kmersize, nbHash);
+            case tools::misc::BLOOM_DEFAULT:   return new BloomCacheCoherent<T>    (tai_bloom, nbHash);
+            default:        throw system::Exception ("bad Bloom kind %d in createBloom", kind);
+        }
+    }
+
+    /** Create a IBloom instance
+     * \param[in] name : kind name of the IBloom instance to be created
+     * \param[in] sizeStr : size of the Bloom filter (in bits) as a string
+     * \param[in] nbHashStr : number of hash functions for the Bloom filter as a string
+     * \param[in] kmerSizeStr : kmer size (used only for some implementations) as a string.
+     */
+    template<typename T> IBloom<T>* createBloom (
+        const std::string& name,
+        const std::string& sizeStr,
+        const std::string& nbHashStr,
+        const std::string& kmerSizeStr
+    )
+    {
+        tools::misc::BloomKind kind;  parse (name, kind);
+        return createBloom<T> (kind, (u_int64_t)atol (sizeStr.c_str()), (size_t)atol (nbHashStr.c_str()), atol (kmerSizeStr.c_str()));
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/BloomGroup.hpp b/gatb-core/src/gatb/tools/collections/impl/BloomGroup.hpp
new file mode 100644
index 0000000..0b0aa58
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/BloomGroup.hpp
@@ -0,0 +1,499 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BloomGroup.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Bloom Group implementation
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_GROUP_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_GROUP_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/* EXPERIMENTAL (not documented). */
+template <typename Item, size_t prec=1> class BloomGroupOld : public system::SmartPointer
+{
+public:
+
+    typedef tools::math::LargeInt<prec> Result;
+
+    /** */
+    BloomGroupOld (u_int64_t size, size_t nbHash=4)
+        : _hash(nbHash), _nbHash(nbHash), _size(size), _blooma(0)
+    {
+        _blooma = (Result*) MALLOC (_size*sizeof(Result));
+        system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+    }
+
+    /** */
+    BloomGroupOld (const std::string& uri)
+        : _hash(0), _nbHash(0), _size(0), _blooma(0)
+    {
+        load (uri);
+    }
+
+    /** */
+    ~BloomGroupOld ()  {  FREE (_blooma); }
+
+    /** */
+    std::string getName () const { return "BloomGroupOld"; }
+
+    /** */
+    void insert (const Item& item, size_t idx)
+    {
+        static const Result ONE (1);
+
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+#if 1
+            this->_blooma[h1] |= (ONE << idx);
+#else
+            this->_blooma[h1].sync_fetch_and_or (ONE << idx);
+#endif
+        }
+    }
+
+    /** Return the size (in bytes). */
+    u_int64_t getMemSize () const { return _size*sizeof(Result); }
+
+    /** */
+    void save (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "wb+");
+        if (file != 0)
+        {
+            /** We write the nb of hash functions. */
+            file->fwrite (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We write the size of the blooms. */
+            file->fwrite (&_size, sizeof(_size), 1);
+
+            /** We write the blooms info. */
+            file->fwrite (_blooma, _size*sizeof(Result), 1);
+
+#if 1
+for (size_t i=0; i<10; i++)
+{
+    for (size_t j=0; j<prec; j++)
+    {
+        printf ("%8x ", _blooma[i].value[j]);
+    }
+    printf ("\n");
+}
+#endif
+
+            delete file;
+        }
+    }
+
+    /** */
+    void load (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "rb+");
+        if (file != 0)
+        {
+            /** We read the nb of hash functions. */
+            file->fread (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We read the size of the blooms. */
+            file->fread (&_size, sizeof(_size), 1);
+
+            /** We allocate the array. */
+            _blooma = (Result*) MALLOC (_size*sizeof(Result));
+            system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+
+            /** We read the blooms info. */
+            file->fread (_blooma, _size*sizeof(Result), 1);
+
+            delete file;
+        }
+    }
+
+    /** */
+    bool contains (const Item& item, size_t idx)
+    {
+        static const Result ONE (1);
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+            if ( (_blooma[h1] & (ONE << idx)) != (ONE << idx) )  {  return false;  }
+        }
+        return true;
+    }
+
+    /** */
+    Result contains (const Item& item)
+    {
+        static const Result ZERO (0);
+        Result res = ~ZERO;
+
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+            res &= _blooma [h1];
+        }
+        return res;
+    }
+
+private:
+
+    HashFunctors<Item> _hash;
+    size_t             _nbHash;
+    u_int64_t          _size;
+    Result*            _blooma;
+};
+
+/********************************************************************************/
+
+/* EXPERIMENTAL (not documented). */
+template <typename Item, size_t prec=1> class BloomGroup : public system::SmartPointer
+{
+public:
+
+    class Result
+    {
+    public:
+        Result (u_int64_t v=0)  { memset (v); }
+
+              u_int64_t& operator[] (size_t idx)       { return value[idx]; }
+        const u_int64_t& operator[] (size_t idx) const { return value[idx]; }
+
+        const u_int64_t* array () const { return value; }
+
+        Result& operator&= (const Result& r)
+        {
+            for (size_t j=0; j<prec; j++)  { (*this)[j] &=  r[j]; }
+            return *this;
+        }
+
+    private:
+        u_int64_t value[prec];
+        void memset (u_int64_t v)  {  system::impl::System::memory().memset (value, v, prec*sizeof(u_int64_t));  }
+
+        friend class BloomGroup<Item,prec>;
+    };
+
+    /** */
+    BloomGroup (u_int64_t size, u_int64_t maxMemory, size_t nbHash=4)
+        : _hash(nbHash), _nbHash(nbHash), _size(size), _blooma(0)
+    {
+        printf ("BloomGroup:  size=%ld   sizeof(Result)=%d  maxMemory=%ld\n", size, sizeof(Result), maxMemory);
+        if (_size*sizeof(Result) > maxMemory)
+        {
+            _size = maxMemory /sizeof (Result);
+        }
+        else
+        {
+            maxMemory = _size*sizeof(Result);
+        }
+        printf ("===> size=%ld   allocMemory=%ld\n", _size, sizeof(Result)*_size);
+
+        _blooma = (Result*) MALLOC (_size*sizeof(Result));
+        system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+    }
+
+    /** */
+    BloomGroup (const std::string& uri)
+        : _hash(0), _nbHash(0), _size(0), _blooma(0)
+    {
+        load (uri);
+    }
+
+    /** */
+    ~BloomGroup ()  {  FREE (_blooma); }
+
+    /** */
+    std::string getName () const { return "BloomGroup"; }
+
+    /** Return the size (in bytes). */
+    u_int64_t getMemSize () const { return _size*sizeof(Result); }
+
+    /** */
+    void save (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "wb+");
+        if (file != 0)
+        {
+            /** We write the nb of hash functions. */
+            file->fwrite (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We write the size of the blooms. */
+            file->fwrite (&_size, sizeof(_size), 1);
+
+            /** We write the blooms info. */
+            file->fwrite (_blooma, _size*sizeof(Result), 1);
+
+            delete file;
+        }
+    }
+
+    /** */
+    void load (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "rb+");
+        if (file != 0)
+        {
+            /** We read the nb of hash functions. */
+            file->fread (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We read the size of the blooms. */
+            file->fread (&_size, sizeof(_size), 1);
+
+            /** We allocate the array. */
+            _blooma = (Result*) MALLOC (_size*sizeof(Result));
+            system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+
+            /** We read the blooms info. */
+            file->fread (_blooma, _size*sizeof(Result), 1);
+
+            delete file;
+        }
+    }
+
+    /** Insert an item in the 'idx'th Bloom filter
+     * \param[in] item : item to be inserted into the filter
+     * \param[in] idx : index of the filter */
+    void insert (const Item& item, size_t idx)
+    {
+        u_int64_t q,mask;  euclidian(idx,q,mask);
+
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+
+#if 1
+            this->_blooma[h1][q] |= mask;
+#else
+            __sync_fetch_and_or (this->_blooma[h1].value + q, mask);
+#endif
+        }
+    }
+
+    /** */
+    bool contains (const Item& item, size_t idx)
+    {
+        u_int64_t q,mask;  euclidian(idx,q,mask);
+
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+            if ( (_blooma[h1][q] & mask) != mask )  {  return false;  }
+        }
+        return true;
+    }
+
+    /** */
+    Result contains (const Item& item)
+    {
+        Result res (~0);
+
+        for (size_t i=0; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = this->_hash (item, i) % this->_size;
+            res &=  _blooma [h1];
+        }
+        return res;
+    }
+
+private:
+
+    HashFunctors<Item> _hash;
+    size_t             _nbHash;
+    u_int64_t          _size;
+    Result*            _blooma;
+
+    void euclidian (size_t idx, u_int64_t& dividend, u_int64_t& mask) const
+    {
+        dividend = idx / (8*sizeof(u_int64_t));
+        mask     = ((u_int64_t) 1) << (idx % (8*sizeof(u_int64_t)));
+    }
+};
+
+
+/********************************************************************************/
+
+/* EXPERIMENTAL (not documented). */
+template <typename Item, size_t prec=1> class BloomGroupCacheCoherent : public system::SmartPointer
+{
+public:
+
+    typedef tools::math::LargeInt<prec> Result;
+
+    /** */
+    BloomGroupCacheCoherent (u_int64_t size, size_t nbHash=4, size_t block_nbits=12)
+        : _hash(nbHash), _nbHash(nbHash), _size(size), _blooma(0), _nbits_BlockSize(block_nbits)
+    {
+        _size += (1<<_nbits_BlockSize);
+
+        _blooma = (Result*) MALLOC (_size*sizeof(Result));
+        system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+
+        _mask_block   = (1<<_nbits_BlockSize) - 1;
+        _reduced_size = this->_size -  (1<<_nbits_BlockSize) ;
+    }
+
+    /** */
+    BloomGroupCacheCoherent (const std::string& uri)
+        : _hash(0), _nbHash(0), _size(0), _blooma(0)
+    {
+        load (uri);
+
+        _mask_block   = (1<<_nbits_BlockSize) - 1;
+        _reduced_size = this->_size -  (1<<_nbits_BlockSize) ;
+    }
+
+    /** */
+    ~BloomGroupCacheCoherent ()  {  system::impl::System::memory().free (_blooma); }
+
+    /** */
+    std::string getName () const { return "BloomGroupCacheCoherent"; }
+
+    /** Return the size (in bytes). */
+    u_int64_t getMemSize () const { return _size*sizeof(Result); }
+
+    /** */
+    void save (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "wb+");
+        if (file != 0)
+        {
+            /** We write the nb of hash functions. */
+            file->fwrite (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We write the size of the blooms. */
+            file->fwrite (&_size, sizeof(_size), 1);
+
+            /** We write block size information. */
+            file->fwrite (&_nbits_BlockSize, sizeof(_nbits_BlockSize), 1);
+
+            /** We write the blooms info. */
+            file->fwrite (_blooma, _size*sizeof(Result), 1);
+
+            delete file;
+        }
+    }
+
+    /** */
+    void load (const std::string& uri)
+    {
+        system::IFile* file = system::impl::System::file().newFile (uri, "rb+");
+        if (file != 0)
+        {
+            /** We read the nb of hash functions. */
+            file->fread (&_nbHash, sizeof(_nbHash), 1);
+
+            /** We read the size of the blooms. */
+            file->fread (&_size, sizeof(_size), 1);
+
+            /** We read block size information. */
+            file->fread (&_nbits_BlockSize, sizeof(_nbits_BlockSize), 1);
+
+            /** We allocate the array. */
+            _blooma = (Result*) MALLOC (_size*sizeof(Result));
+            system::impl::System::memory().memset (_blooma, 0, _size*sizeof(Result));
+
+            /** We read the blooms info. */
+            file->fread (_blooma, _size*sizeof(Result), 1);
+
+            delete file;
+        }
+    }
+
+    /** */
+    void insert (const Item& item, size_t idx)
+    {
+        static const Result ONE (1);
+
+        /** First hash. */
+        u_int64_t h0 = this->_hash (item,0) % _reduced_size;
+        this->_blooma[h0] |= (ONE << idx);
+
+        for (size_t i=1; i<this->_nbHash; i++)
+        {
+            /** Other hash. */
+            u_int64_t h1 = h0  + (simplehash16 (item,i) & _mask_block);
+            this->_blooma[h1] |= (ONE << idx);
+        }
+    }
+
+    /** */
+    bool contains (const Item& item, size_t idx)
+    {
+        static const Result ONE  (1);
+
+        /** First hash. */
+        u_int64_t h0 = this->_hash (item,0) % _reduced_size;
+        if ((this->_blooma[h0] & (ONE << idx)) != (ONE << idx))  {  return false;  }
+
+        for (size_t i=1; i<this->_nbHash; i++)
+        {
+            /** Other hash. */
+            u_int64_t h1 = h0  + (simplehash16 (item,i) & _mask_block);
+            if ((this->_blooma[h1] & (ONE << idx)) != (ONE << idx))  {  return false;  }
+        }
+        return true;
+    }
+
+    /** */
+    Result contains (const Item& item)
+    {
+        static const Result ZERO (0);
+        Result res = ~ZERO;
+
+        u_int64_t h0 = this->_hash (item,0) % _reduced_size;
+        res &= _blooma [h0];
+
+        for (size_t i=1; i<this->_nbHash; i++)
+        {
+            u_int64_t h1 = h0 + (simplehash16(item,i) & _mask_block);
+            res &= _blooma [h1];
+        }
+        return res;
+    }
+
+private:
+
+    HashFunctors<Item> _hash;
+    size_t             _nbHash;
+    u_int64_t          _size;
+    Result*            _blooma;
+
+    u_int64_t  _mask_block;
+    size_t     _nbits_BlockSize;
+    u_int64_t  _reduced_size;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_BLOOM_GROUP_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/BooPHF.hpp b/gatb-core/src/gatb/tools/collections/impl/BooPHF.hpp
new file mode 100644
index 0000000..e69bdca
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/BooPHF.hpp
@@ -0,0 +1,395 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file BooPHF.hpp
+ *  \brief Minimal Perfect Hash Function from Guillaume
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_BOOPHF_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_BOOPHF_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+
+#include <BooPHF/BooPHF.h>
+
+#include <random> // for mt19937_64
+
+/********************************************************************************/
+namespace gatb        {
+namespace core        {
+namespace tools       {
+namespace collections {
+namespace impl        {
+/********************************************************************************/
+
+
+typedef std::pair<u_int8_t const*, u_int8_t const*> byte_range_t;
+
+/** For some specialization (see below), we need to adapt the key type to some
+ * range of raw data in memory. We provide here a default adaptor that can
+ * be used as default template type for the MPHF class.
+ */
+template<typename T>
+struct AdaptatorDefault
+{
+    byte_range_t operator() (const T& t) const
+    {
+        const u_int8_t* buf = reinterpret_cast <u_int8_t const*> (&t);
+        const u_int8_t* end = buf + sizeof(T);
+        return byte_range_t(buf, end);
+    }
+};
+
+// from emphf, https://github.com/ot/emphf/blob/master/base_hash.hpp
+// Apache License 2
+// itself was adapted from http://www.burtleburtle.net/bob/c/lookup8.c
+inline uint64_t unaligned_load64(uint8_t const* from)
+{
+    uint64_t tmp;
+    memcpy(reinterpret_cast<char*>(&tmp), from, 8);
+          //(ot): reverse bytes in big-endian architectures
+         return tmp;
+    }
+struct jenkins64_hasher {
+
+	typedef uint64_t seed_t;
+	typedef uint64_t hash_t;
+	typedef std::tuple<hash_t, hash_t, hash_t> hash_triple_t;
+
+	jenkins64_hasher()
+	{}
+
+	jenkins64_hasher(uint64_t seed)
+		: m_seed(seed)
+	{}
+
+	template <typename Rng>
+		static jenkins64_hasher generate(Rng& rng)
+		{
+			return jenkins64_hasher(rng());
+		}
+
+	// Adapted from http://www.burtleburtle.net/bob/c/lookup8.c
+	hash_triple_t operator()(byte_range_t s) const
+	{
+		using std::get;
+		hash_triple_t h(m_seed, m_seed, 0x9e3779b97f4a7c13ULL);
+
+		size_t len = (size_t)(s.second - s.first);
+		uint8_t const* cur = s.first;
+		uint8_t const* end = s.second;
+
+		while (end - cur >= 24) {
+			get<0>(h) += unaligned_load64(cur);
+			cur += 8;
+			get<1>(h) += unaligned_load64(cur);
+			cur += 8;
+			get<2>(h) += unaligned_load64(cur);
+			cur += 8;
+
+			mix(h);
+		}
+
+		get<2>(h) += len;
+
+		switch (end - cur) {
+			case 23: get<2>(h) += (uint64_t(cur[22]) << 56);
+			case 22: get<2>(h) += (uint64_t(cur[21]) << 48);
+			case 21: get<2>(h) += (uint64_t(cur[20]) << 40);
+			case 20: get<2>(h) += (uint64_t(cur[19]) << 32);
+			case 19: get<2>(h) += (uint64_t(cur[18]) << 24);
+			case 18: get<2>(h) += (uint64_t(cur[17]) << 16);
+			case 17: get<2>(h) += (uint64_t(cur[16]) << 8);
+					 // the first byte of c is reserved for the length
+			case 16: get<1>(h) += (uint64_t(cur[15]) << 56);
+			case 15: get<1>(h) += (uint64_t(cur[14]) << 48);
+			case 14: get<1>(h) += (uint64_t(cur[13]) << 40);
+			case 13: get<1>(h) += (uint64_t(cur[12]) << 32);
+			case 12: get<1>(h) += (uint64_t(cur[11]) << 24);
+			case 11: get<1>(h) += (uint64_t(cur[10]) << 16);
+			case 10: get<1>(h) += (uint64_t(cur[ 9]) << 8);
+			case  9: get<1>(h) += (uint64_t(cur[ 8]));
+			case  8: get<0>(h) += (uint64_t(cur[ 7]) << 56);
+			case  7: get<0>(h) += (uint64_t(cur[ 6]) << 48);
+			case  6: get<0>(h) += (uint64_t(cur[ 5]) << 40);
+			case  5: get<0>(h) += (uint64_t(cur[ 4]) << 32);
+			case  4: get<0>(h) += (uint64_t(cur[ 3]) << 24);
+			case  3: get<0>(h) += (uint64_t(cur[ 2]) << 16);
+			case  2: get<0>(h) += (uint64_t(cur[ 1]) << 8);
+			case  1: get<0>(h) += (uint64_t(cur[ 0]));
+			case 0: break; // nothing to add
+			default: assert(false);
+		}
+
+		mix(h);
+
+		return h;
+	}
+
+	// rehash a hash triple
+	hash_triple_t operator()(hash_triple_t h) const
+	{
+		std::get<0>(h) += m_seed;
+		std::get<1>(h) += m_seed;
+		std::get<2>(h) += 0x9e3779b97f4a7c13ULL;
+
+		mix(h);
+
+		return h;
+	}
+
+	void swap(jenkins64_hasher& other)
+	{
+		std::swap(m_seed, other.m_seed);
+	}
+
+	void save(std::ostream& os) const
+	{
+		os.write(reinterpret_cast<char const*>(&m_seed), sizeof(m_seed));
+	}
+
+	void load(std::istream& is)
+	{
+		is.read(reinterpret_cast<char*>(&m_seed), sizeof(m_seed));
+	}
+
+	seed_t seed() const
+	{
+		return m_seed;
+	}
+
+	protected:
+
+	static void mix(hash_triple_t& h)
+	{
+		uint64_t& a = std::get<0>(h);
+		uint64_t& b = std::get<1>(h);
+		uint64_t& c = std::get<2>(h);
+
+		a -= b; a -= c; a ^= (c >> 43);
+		b -= c; b -= a; b ^= (a << 9);
+		c -= a; c -= b; c ^= (b >> 8);
+		a -= b; a -= c; a ^= (c >> 38);
+		b -= c; b -= a; b ^= (a << 23);
+		c -= a; c -= b; c ^= (b >> 5);
+		a -= b; a -= c; a ^= (c >> 35);
+		b -= c; b -= a; b ^= (a << 49);
+		c -= a; c -= b; c ^= (b >> 11);
+		a -= b; a -= c; a ^= (c >> 12);
+		b -= c; b -= a; b ^= (a << 18);
+		c -= a; c -= b; c ^= (b >> 22);
+	}
+
+	seed_t m_seed;
+};
+
+
+
+/** \brief Minimal Perfect Hash Function
+ *
+ * This is a specialization of the MPHF<Key,Adaptor,exist> class for exist=true.
+ * It uses BooPHF for the implementation and is most a wrapper between BooPHF and
+ * GATB-CORE concepts.
+ */
+/** \brief Perfect minimal hash function for a given kind of key
+ *
+ * This class provides an interface for getting hash codes for some key type T, which
+ * can be done through the operator() method
+ *
+ * This class is not a classic hash feature because it hashes only a given set of T items
+ * (provided as a T iterator) through its 'build' method. Once building is done, hash code
+ * can be accessed through the operator()
+ *
+ * We propose here a default implementation that doesn't do much. The idea behind is that
+ * we can specialize the class for the 'exist' template argument in order to provide a true
+ * implementation (through EMPHF library for instance). If such an implementation exists,
+ * the constant 'enabled' will be true, which allows to test it in the code (it is a little
+ * bit better than using compilation flag).
+ */
+
+template<typename Key,typename Adaptator=AdaptatorDefault<Key>, class Progress=tools::misc::impl::ProgressNone>
+class BooPHF : public system::SmartPointer
+{
+private:
+
+    // a hash wrapper that calls emphf's hasher to produce, given an element, a single hash value for BooPHF
+    class hasher_t
+    {
+        typedef jenkins64_hasher BaseHasher;
+        BaseHasher emphf_hasher;
+        Adaptator adaptor;
+            
+       public:
+        hasher_t(){
+            std::mt19937_64 rng(37); // deterministic seed
+            emphf_hasher = BaseHasher::generate(rng);
+        }
+
+ 
+
+        uint64_t operator ()  (const Key& key, uint64_t seed = 0) const  {  
+                if (seed != 0x33333333CCCCCCCCULL)
+                    return std::get<0>(emphf_hasher(adaptor(key)));  
+                return std::get<2>(emphf_hasher(adaptor(key)));   
+                // this is a big hack, because I'm lazy. 
+                // I wanted to return two different hashes depending on how boophf calls it
+                // since I contrl BooPHF code's, I know it calls this function with 0x33333333CCCCCCCCULL as the second seed.
+                }
+    };
+
+    typedef boomphf::mphf<  Key, hasher_t  > boophf_t;
+
+public:
+
+    /** Definition of a hash value. */
+    typedef u_int64_t Code;
+
+    /** Constructor. */
+    BooPHF () : isBuilt(false), nbKeys(0)  {}
+
+    /** Build the hash function from a set of items.
+     * \param[in] iterable : keys iterator
+     * \param[in] progress : object that listens to the event of the algorithm */
+    void build (tools::collections::Iterable<Key>* iterable, int nbThreads = 1, tools::dp::IteratorListener* progress=0)
+    {
+        if (isBuilt==true) { throw system::Exception ("MFHP: built already done"); }
+
+        /** We create an iterator from the iterable. */
+        tools::dp::Iterator<Key>* iter = iterable->iterator();
+        LOCAL (iter);
+
+        size_t nbElts = iterable->getNbItems();
+
+        iterator_wrapper kmers (iter); 
+
+		bool withprogress = true;
+
+		if (progress==0)
+			withprogress = false;
+		
+
+        bphf =  boophf_t(nbElts, kmers, nbThreads, 3.0 /*much faster construction than gamma=1*/, withprogress);
+
+        isBuilt = true;
+        nbKeys  = iterable->getNbItems();
+    }
+
+    /** Returns the hash code for the given key. WARNING : default implementation here will
+     * throw an exception.
+     * \param[in] key : the key to be hashed
+     * \return the hash value. */
+    Code operator () (const Key& key)
+    {
+        return bphf.lookup (key);
+    }
+
+    /** Returns the number of keys.
+     * \return keys number */
+    size_t size() const { return bphf.nbKeys(); }
+
+    /** Load hash function from a collection*/
+    size_t load (tools::storage::impl::Group& group, const std::string& name)
+    {
+        /** We need an input stream for the given collection given by group/name. */
+        tools::storage::impl::Storage::istream is (group, name);
+		bphf =  boophf_t();
+        bphf.load (is);
+        return size();
+    }
+
+    /** Save hash function to a collection
+     * \return the number of bytes of the saved data. */
+    size_t save (tools::storage::impl::Group& group, const std::string& name)
+    {
+        /** We need an output stream for the given collection given by group/name. */
+        tools::storage::impl::Storage::ostream os (group, name);
+        bphf.save (os);
+        /** We set the number of keys as an attribute of the group. */
+        group.addProperty ("nb_keys", misc::impl::Stringify().format("%d",nbKeys)); // FIXME: maybe overflow here
+        return os.tellp();
+    }
+
+private:
+
+    boophf_t  bphf;
+    bool      isBuilt;
+    size_t    nbKeys;
+
+private:
+
+    class iterator_adaptator : public std::iterator<std::forward_iterator_tag, const Key>
+    {
+    public:
+        iterator_adaptator()  : iterator(0), pos(0) {}
+
+        iterator_adaptator(tools::dp::Iterator<Key>* iterator)  : iterator(iterator), pos(0)  {  iterator->first();  }
+
+        Key const& operator*()  {  return iterator->item();  }
+
+        iterator_adaptator& operator++()
+        {
+            iterator->next();
+            pos++;
+            if (iterator->isDone())
+            {
+                iterator = nullptr;
+                pos = 0;
+            }
+            return *this;
+        }
+
+        friend bool operator==(iterator_adaptator const& lhs, iterator_adaptator const& rhs)
+        {
+            if (!lhs.iterator || !rhs.iterator)  {  if (!lhs.iterator && !rhs.iterator) {  return true; } else {  return false;  } }
+            return rhs.pos == lhs.pos;
+        }
+
+        friend bool operator!=(iterator_adaptator const& lhs, iterator_adaptator const& rhs)  {  return !(lhs == rhs);  }
+
+    private:
+        tools::dp::Iterator<Key>* iterator;
+        unsigned long pos;
+    };
+
+    class iterator_wrapper
+    {
+    public:
+        iterator_wrapper (tools::dp::Iterator<Key>* iterator) : iterator(iterator) {}
+
+        iterator_adaptator begin() const  {  return iterator_adaptator (iterator); }
+        iterator_adaptator end  () const  {  return iterator_adaptator ();         }
+        size_t        size () const  {  return 0;                        }
+
+    private:
+        // noncopyble // FIXME: made it copyable because boophf needed it; need to see if it's correct
+        //iterator_wrapper(iterator_wrapper const&);
+        //iterator_wrapper& operator=(iterator_wrapper const&);
+        tools::dp::Iterator<Key>* iterator;
+    };
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_BOOPHF_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/CollectionAbstract.hpp b/gatb-core/src/gatb/tools/collections/impl/CollectionAbstract.hpp
new file mode 100644
index 0000000..7dc5f6b
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/CollectionAbstract.hpp
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file CollectionAbstract.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_ABSTRACT_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_ABSTRACT_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Abstract implementation of the Collection interface.
+ *
+ * This class implements the Collection interface by delegating the job to an instance
+ * of Bag and an instance of Iterable.
+ *
+ * All the methods are delegated to one of these two instances.
+ */
+template <class Item>
+class CollectionAbstract : public Collection<Item>
+{
+public:
+
+    /** Constructor.
+     * \param bag      : reference on the bag delegate.
+     * \param iterable : reference on the iterable delegate
+     */
+    CollectionAbstract (Bag<Item>* bag, Iterable<Item>* iterable)
+        : _bag(0), _iterable(0)
+    {
+        setBag      (bag);
+        setIterable (iterable);
+    }
+
+    /** Destructor. */
+    virtual ~CollectionAbstract()
+    {
+        setBag      (0);
+        setIterable (0);
+    }
+
+    /** \copydoc Collection::bag */
+    Bag<Item>* bag() { return _bag; }
+
+    /** \copydoc Collection::iterable */
+    Iterable<Item>* iterable()  { return _iterable; }
+
+    /** \copydoc Iterable::iterator */
+    dp::Iterator<Item>* iterator ()  { return _iterable->iterator(); }
+
+    /** \copydoc Iterable::getNbItems */
+    int64_t getNbItems ()  { return _iterable->getNbItems(); }
+
+    /** \copydoc Iterable::estimateNbItems */
+    int64_t estimateNbItems () { return _iterable->estimateNbItems(); }
+
+    /** \copydoc Iterable::getItems */
+    Item* getItems (Item*& buffer)  { 
+        //std::cout << "CollectionAsbtract getItems called" << std::endl;
+        return _iterable->getItems(buffer); }
+
+    /** \copydoc Iterable::getItems(Item*& buffer, size_t start, size_t nb) */
+    size_t getItems (Item*& buffer, size_t start, size_t nb)  { 
+        //std::cout << "CollectionAsbtract getItems called" << std::endl;
+        return _iterable->getItems (buffer, start, nb); }
+
+    /** \copydoc Bag::insert */
+    void insert (const Item& item)  { _bag->insert (item); }
+
+    /** \copydoc Bag::insert(const std::vector<Item>& items, size_t length) */
+    void insert (const std::vector<Item>& items, size_t length)  { _bag->insert (items, length); }
+
+    /** \copydoc Bag::insert(const Item* items, size_t length) */
+    void insert (const Item* items, size_t length)  { _bag->insert (items, length); }
+
+    /** \copydoc Bag::flush */
+    void flush ()  { _bag->flush(); }
+
+    /** \copydoc Collection::addProperty */
+    void addProperty (const std::string& key, const std::string value)  {}
+
+    /** \copydoc Collection::addProperty */
+    void addProperty (const std::string& key, const char* format ...)
+    {
+        va_list args;
+        va_start (args, format);
+        this->addProperty (key, misc::impl::Stringify::format(format, args));
+        va_end (args);
+    }
+
+    /** \copydoc Collection::getProperty */
+    std::string getProperty (const std::string& key)  {  return std::string("");  }
+
+protected:
+
+    Bag<Item>* _bag;
+    void setBag (Bag<Item>* bag)  { SP_SETATTR(bag); }
+
+    Iterable<Item>* _iterable;
+    void setIterable (Iterable<Item>* iterable)  { SP_SETATTR(iterable); }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_ABSTRACT_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/CollectionCache.hpp b/gatb-core/src/gatb/tools/collections/impl/CollectionCache.hpp
new file mode 100644
index 0000000..e77041e
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/CollectionCache.hpp
@@ -0,0 +1,127 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file CollectionCache.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_CACHE_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_CACHE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/system/impl/System.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Cache implementation of the Collection interface
+ *
+ * This implementations allows to add items into the collection through a cache. It
+ * means that a memory block for inserting the items and when the memory is full,
+ * all its items are flushed into the delegate Collection (provided at construction).
+ *
+ * A synchronizer can be provided to be sure that the delegate can't suffer concurrent
+ * accesses by several threads. This allows to encapsulate a single Collection into several
+ * CollectionCache instances, each one used in a thread.
+ */
+template <class Item> class CollectionCache : public CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    CollectionCache (Collection<Item>& ref,  size_t cacheSize, system::ISynchronizer* synchro)
+        : CollectionAbstract<Item> (
+            new BagCache<Item> (ref.bag(), cacheSize, synchro),
+            ref.iterable()
+        ), _ref(ref)  {}
+
+    /** Destructor. */
+    virtual ~CollectionCache() {}
+
+    /** \copydoc Collection::remove */
+    void remove ()  { _ref.remove(); }
+
+    /** Accessor to the delegate Collection.
+     * \return the delegate Collection instance. */
+    Collection<Item>& getRef ()  { return _ref; }
+
+private:
+    Collection<Item>& _ref;
+};
+
+/********************************************************************************/
+    
+/** \brief Cache implementation of the Collection interface
+ *
+ * This implementations is like CollectionCache. The difference is that
+ * the items are first sorted before inserting them into the delegate
+ * Collection instance.
+ *
+ * Remark : maybe could be inherited from CollectionCache ?
+ */
+template <class Item> class CollectionCacheSorted : public CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor. */
+    CollectionCacheSorted (Collection<Item>& ref,  size_t cacheSize, size_t sharedCacheSize,  system::ISynchronizer* synchro, system::ISynchronizer* outsynchro, Item* sharedBuffer, size_t * idxShared) //
+    : CollectionAbstract<Item> (
+            new BagCacheSortedBuffered<Item> (
+                ref.bag(),
+                cacheSize,
+                sharedBuffer,
+                sharedCacheSize,
+                idxShared,
+                outsynchro,synchro
+            ),
+            ref.iterable()
+        ),
+        _ref(ref)  {}
+    
+    /** Destructor. */
+    virtual ~CollectionCacheSorted() {}
+    
+    /** \copydoc Collection::remove */
+    void remove ()  { _ref.remove(); }
+    
+    /** Accessor to the delegate Collection.
+     * \return the delegate Collection instance. */
+    Collection<Item>& getRef ()  { return _ref; }
+    
+private:
+    Collection<Item>& _ref;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_COLLECTION_CACHE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/ContainerSet.hpp b/gatb-core/src/gatb/tools/collections/impl/ContainerSet.hpp
new file mode 100644
index 0000000..9b4cf23
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/ContainerSet.hpp
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ContainerSet.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Container implementation
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_CONTAINER_SET_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_CONTAINER_SET_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Container.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/api/types.hpp>
+
+#include <vector>
+#include <algorithm>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+/** \brief Implementation of the Container interface
+ *
+ * This implementation uses a sorted vector for the 'contains' method. It implies
+ * a binary_search (log(N) complexity)
+ */
+template <typename Item> class ContainerSet : public Container<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor.
+     * \param[in] it : iterator over the items of the container. They are all inserted in the vector
+     * and the vector is then sorted. */
+    ContainerSet (dp::Iterator<Item>* it)
+    {
+        LOCAL (it);
+        for (it->first(); !it->isDone(); it->next())  {  _items.push_back (it->item());  }
+
+        std::sort (_items.begin(), _items.end());
+    }
+    
+    /** \copydoc Container::contains */
+    bool contains (const Item& item)
+    {
+        return std::binary_search (_items.begin(), _items.end(), item);
+    }
+
+private:
+    
+    std::vector<Item> _items;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_CONTAINER_SET_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/Hash16.hpp b/gatb-core/src/gatb/tools/collections/impl/Hash16.hpp
new file mode 100644
index 0000000..e2792a7
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/Hash16.hpp
@@ -0,0 +1,343 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Hash16.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Hash function
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_HASH16_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_HASH16_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Container.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/tools/misc/impl/Pool.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <set>
+#include <algorithm>
+#include <cmath> // for log2f
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Class providing hash table service with a given memory max usage.
+ */
+template <typename Item, typename value_type=int> class Hash16
+{
+	
+public :
+	
+	//shortcut
+	typedef misc::impl::cell_ptr_t cell_ptr_t;
+	
+	typedef struct
+	{
+		Item graine;
+		cell_ptr_t  suiv;
+		value_type val;
+	} cell;
+	
+protected:
+
+
+	
+    cell_ptr_t * datah;
+
+    misc::impl::Pool<cell> storage;  // was Item,value_type
+    u_int64_t mask ;
+
+    u_int64_t tai;
+    u_int64_t nb_elem;
+    u_int64_t max_nb_elem;
+
+    /** Shortcut */
+    system::IMemory& _memory;
+
+public:
+
+
+	
+    /** Constructor.
+     * \param[in] sizeMB : approx max memory to be used by the hash table
+     */
+    Hash16 (size_t sizeMB) : datah(0), mask(0), tai(0), nb_elem(0), max_nb_elem(0), _memory(system::impl::System::memory())
+    {
+        int tai_Hash16 = std::max (
+            (size_t) ceilf (log2f ((0.1*sizeMB*1024L*1024L)/sizeof(cell_ptr_t))),
+            (size_t)1
+        );
+
+        /** We check that the provided size is ok. */
+        if (tai_Hash16 > 32)  {  throw system::Exception ("Hash16: max size for this hash is 2^32, but ask for %d", tai_Hash16);   }
+
+        tai         = (1LL << tai_Hash16);
+        mask        = tai-1 ;
+        max_nb_elem = (u_int64_t) (0.8*sizeMB*1024LL*1024LL /sizeof(cell)); // indicative , irrelevant
+        //datah       = (cell_ptr_t *) _memory.malloc( tai * sizeof(cell_ptr_t));
+		//GR: bug for large values because malloc takes  BlockSize_t (u_int32_t)
+		//switching to calloc to avoid problem temporarily, but BlockSize_t should be changed to u_int64_t ?
+ 		datah       = (cell_ptr_t *) _memory.calloc( tai , sizeof(cell_ptr_t));  //create hashtable
+
+		//printf("Hash16 size asked in MB %zu  tai_Hash16 %i  nb entries %llu \n",sizeMB,tai_Hash16,tai);
+		//cell pcell;
+		//printf("Hash 16 cell %lli   graine %i suiv %i val %i\n",sizeof(cell),sizeof(pcell.graine),sizeof(pcell.suiv),sizeof(pcell.val));
+
+        _memory.memset (datah,0, tai * sizeof(cell_ptr_t));
+    }
+
+	/** Constructor with directly number of entries wished, return really created in nb_created
+	 * \param[in] nb_entries : number of entries.
+     * \param[in] nb_created : number of created items.
+	 */
+	Hash16 (u_int64_t nb_entries, u_int64_t * nb_created) : datah(0), mask(0), tai(0), nb_elem(0), max_nb_elem(0), _memory(system::impl::System::memory())
+    {
+        int tai_Hash16 = std::max (
+								   (size_t) ceilf (log2f (nb_entries)),
+								   (size_t)1
+								   );
+		
+        /** We check that the provided size is ok. */
+        if (tai_Hash16 > 32)  {  throw system::Exception ("Hash16: max size for this hash is 2^32, but ask for %d", tai_Hash16);   }
+		
+        tai         = (1LL << tai_Hash16);
+        mask        = tai-1 ;
+        max_nb_elem = (u_int64_t) (10 * tai); // indicative
+
+		if(nb_created!= NULL)
+			*nb_created = tai;
+ 		datah       = (cell_ptr_t *) _memory.calloc( tai , sizeof(cell_ptr_t));  //create hashtable
+		
+		//printf("Hash16 size asked in MB %zu  tai_Hash16 %i  nb entries %llu \n",sizeMB,tai_Hash16,tai);
+		
+        _memory.memset (datah,0, tai * sizeof(cell_ptr_t));
+    }
+	
+	u_int64_t getByteSize()
+	{
+		return storage.getByteSize();
+	}
+	
+    /** Destructor */
+    ~Hash16()
+    {
+        _memory.free(datah);
+    }
+
+    /** Clear the content of the hash table. */
+    void clear ()
+    {
+        storage.clear ();
+        nb_elem=0;
+        _memory.memset (datah,0, tai * sizeof(cell_ptr_t));
+    }
+
+    /** Insert an item into the hash table
+     * \param[in] graine : key
+     * \param[in] value : value
+     */
+    void insert (Item graine, value_type value)
+    {
+        unsigned int clef ;
+        cell* cell_ptr    = 0;
+        cell* newcell_ptr = 0;
+
+        cell_ptr_t  newcell_internal_ptr;
+
+        clef = (unsigned int) (hash1(graine,0) & mask);
+
+        cell_ptr = storage.internal_ptr_to_cell_pointer (datah[clef]);
+
+        while(cell_ptr != NULL &&  cell_ptr->graine != graine)
+        {
+            cell_ptr = storage.internal_ptr_to_cell_pointer (cell_ptr->suiv);
+        }
+        if (cell_ptr==NULL) //graine non trouvee , insertion au debut
+        {
+            newcell_internal_ptr = storage.allocate_cell();
+            newcell_ptr          = storage.internal_ptr_to_cell_pointer(newcell_internal_ptr);
+            newcell_ptr->val     = value;
+            newcell_ptr->graine  = graine;
+            newcell_ptr->suiv    = datah[clef];
+            datah[clef]          = newcell_internal_ptr;
+            nb_elem++;
+        }
+        else
+        {
+            cell_ptr->val=value;  // graine trouvee
+        }
+    }
+
+    /** Insert an item into the hash table
+     * \param[in] graine : key
+     */
+    void insert (Item graine)
+    {
+        unsigned int clef ;
+        cell* cell_ptr, *newcell_ptr;
+        cell_ptr_t  newcell_internal_ptr;
+
+        clef = (unsigned int) hash1(graine,0) & mask;
+
+        cell_ptr = storage.internal_ptr_to_cell_pointer(datah[clef]);
+
+        while(cell_ptr != NULL &&  cell_ptr->graine != graine)
+        {
+            cell_ptr = storage.internal_ptr_to_cell_pointer (cell_ptr->suiv);
+        }
+
+        if (cell_ptr==NULL) //graine non trouvee , insertion au debut
+        {
+            newcell_internal_ptr = storage.allocate_cell();
+
+            newcell_ptr         = storage.internal_ptr_to_cell_pointer(newcell_internal_ptr);
+            newcell_ptr->val    = 1;
+            newcell_ptr->graine = graine;
+            newcell_ptr->suiv   = datah[clef];
+
+            datah[clef] = newcell_internal_ptr;
+
+            nb_elem++;
+        }
+        else
+        {
+            (cell_ptr->val)++;  // graine trouvee
+        }
+    }
+
+	
+	static bool sortByKey(const cell &lhs, const cell &rhs) { return lhs.graine < rhs.graine; }
+	
+	/** Get an iterator for the hash table.
+	 * \param[in] sorted : if true, items are iterated in a sorted way (warning: reorder in place so cant acces hash after that !)
+	 * \return an iterator over the items of the hash table.
+	 */
+	//dp::Iterator < std::pair<Item,value_type> >* iterator (bool sorted=false)
+	//just get the underlying pool iterator which is simply iteration over multiple arrays, no need to traverse linked list
+	dp::Iterator < cell >* iterator (bool sorted=false)
+	{
+		if(sorted)
+		{
+			return storage.iteratorsorted(sortByKey);
+		}
+		else
+		{
+			return storage.iterator();
+		}
+	}
+
+	
+    /** Get the value for a given key
+     * \param[in] graine : key
+     * \param[out] val : value to be retrieved
+     * \return 1 if the key exists, 0 otherwise.
+     */
+    int get (Item graine, value_type * val)
+    {
+        unsigned int clef ;
+        cell* cell_ptr;
+
+        clef = (unsigned int) hash1 (graine,0) & mask;
+
+        cell_ptr = storage.internal_ptr_to_cell_pointer(datah[clef]);
+        while(cell_ptr != NULL &&  cell_ptr->graine != graine)
+        {
+            cell_ptr = storage.internal_ptr_to_cell_pointer(cell_ptr->suiv);
+        }
+
+        if (cell_ptr==NULL)
+        {
+            return 0;
+        }
+        else
+        {
+            if (val != NULL)  {  *val = cell_ptr->val;  }
+            return 1;
+        }
+    }
+
+    /** Tells whether or not the given key exists in the hash table.
+     * \param[in] graine : key
+     * \return true if the key exists, 0 otherwise.
+     */
+    bool contains (Item graine)
+    {
+        return get (graine,NULL);
+    }
+
+    /** Remove a key from the hash table.
+     * \param[in] graine : key to be removed from the hash table
+     * \param[out] val : value of the key
+     * \return true if the key was found, 0 otherwise
+     */
+    int remove (Item graine, value_type * val)
+    {
+        unsigned int clef ;
+        cell* cell_ptr;
+        cell_ptr_t * cellprec_ptr;
+
+        clef = (unsigned int) hash1 (graine,0) & mask;
+
+        cell_ptr = storage.internal_ptr_to_cell_pointer(datah[clef]);
+        cellprec_ptr = & (datah[clef]);
+
+        while(cell_ptr != NULL &&  cell_ptr->graine != graine)
+        {
+            cellprec_ptr = & (cell_ptr->suiv);
+            cell_ptr = storage.internal_ptr_to_cell_pointer(cell_ptr->suiv);
+        }
+
+        if (cell_ptr==NULL)
+        {
+            if (val != NULL)  {   *val = 0;  }
+            return 0;
+
+        }
+        else
+        {
+            if (val != NULL)  {    *val = cell_ptr->val;  }
+            //delete the cell :
+            *cellprec_ptr = cell_ptr->suiv ;
+
+            return 1;
+        }
+    }
+
+    /** Get the number of items in the hash table
+     * \return the number of items. */
+    u_int64_t size ()  { return nb_elem; }
+
+    /** Get the max number of items allowed by the hash table
+     * \return the max number of items. */
+    u_int64_t getMaxNbItems ()  { return max_nb_elem; }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_HASH16_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/IterableHelpers.hpp b/gatb-core/src/gatb/tools/collections/impl/IterableHelpers.hpp
new file mode 100644
index 0000000..9df895a
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/IterableHelpers.hpp
@@ -0,0 +1,155 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IterableHelpers.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Helpers class for iterable concept
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERABLE_HELPERS_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERABLE_HELPERS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Iterator with progress information.
+ *
+ * This Iterator implementation encapsulates a given iterator and shows progress
+ * information to end users.
+ *
+ * The way the progress information is displayed is set through the second template
+ * argument of the class which is some IteratorListener implementation class. There
+ * is a default argument for this template, so one has often have only to give the
+ * first template type (ie the kind of items to be iterated).
+ *
+ * This is an example of the Decorator design pattern.
+ */
+template<class Type, class Listener=tools::misc::impl::ProgressDefault>
+class ProgressIterator : public tools::dp::impl::SubjectIterator<Type>
+{
+public:
+
+    /** Constructor. It uses the provided Iterable object to build the delegate Iterator
+     * instance.
+     * \param[in] iterable : used to create the delegate iterator
+     * \param[in] msg : message displayed at each progression notification
+     * \param[in] divide : number of notifications to be send
+     */
+    ProgressIterator (Iterable<Type>& iterable, const char* msg = "progress", size_t divide=100)
+        : tools::dp::impl::SubjectIterator<Type> (
+            iterable.iterator(),
+            (iterable.getNbItems() >= 0 ? iterable.getNbItems() : iterable.estimateNbItems()) / divide,
+            new Listener ((iterable.getNbItems() >= 0 ? iterable.getNbItems() : iterable.estimateNbItems()), msg)
+    ) {}
+
+    /** Constructor. It uses the provided Iterator object as the delegate iterator
+     * \param[in] iterator : delegate iterator
+     * \param[in] msg : message displayed at each progression notification
+     * \param[in] nbItems : number of items to be iterated
+     */
+    ProgressIterator (tools::dp::Iterator<Type>* iterator, const char* msg, size_t nbItems)
+        : tools::dp::impl::SubjectIterator<Type> (
+            iterator,
+            nbItems / 100,
+            new Listener (nbItems, msg)
+    ) {}
+};
+
+/********************************************************************************/
+
+/** \brief Adaptor of an Iterable<T1> into an Iterable<T2>
+ *
+ * This class converts the type T1 of an iterable into another iterable of type T2.
+ *
+ * A functor must be provided in order to convert one item of T1 into T2.
+ */
+template <class T1, class T2, class Adaptor>
+class IterableAdaptor : public Iterable<T2>, public system::SmartPointer
+{
+public:
+    /** */
+    IterableAdaptor (Iterable<T1>& ref)  : _ref(ref) {}
+
+    /** Create an iterator for the given Iterable instance.
+     * \return the new iterator. */
+    dp::Iterator<T2>* iterator ()  { return new tools::dp::impl::IteratorAdaptor<T1,T2,Adaptor> (_ref.iterator()); }
+
+    /** Return the number of items. If a specific implementation doesn't know the value,
+     * it should return -1 by convention.
+     * \return the number of items if known, -1 otherwise. */
+    int64_t getNbItems () { return _ref.getNbItems(); }
+
+    /** Return the (approximate) number of items. If a specific implementation doesn't know the value,
+     * it should return -1 by convention.
+     * \return the number of items if known, -1 otherwise. */
+    int64_t estimateNbItems ()  { return _ref.estimateNbItems(); }
+
+    /** Return a buffer of items.
+     * \param[out] buffer : the buffer
+     * \return the buffer */
+    T2* getItems (T2*& buffer) { std::cout << "IterableAdaptor::getItems() called (but it's not implemented)" << std::endl; exit(1); return 0; }
+
+    /** */
+    size_t getItems (T2*& buffer, size_t start, size_t nb) { std::cout << "IterableAdaptor::getItems() called (but that function isn't implemented)" << std::endl; exit(1); return 0; }
+
+private:
+    Iterable<T1>& _ref;
+};
+
+/********************************************************************************/
+
+/** \brief some helper methods for Iterable objects. */
+class IterableHelpers
+{
+public:
+
+    /** Retrieve in a vector items from an Iterable instance.
+     * \param[in] iterable : the instance we want to get items from
+     * \param[out] items : vector of items to be retrieved. This vector must be sized to
+     * the number of items that one wants to retrieve. */
+    template<typename T>
+    static bool getItems (Iterable<T>& iterable, std::vector<T>& items)
+    {
+        std::cout << "IterableHelper::getItems() called" << std::endl; 
+        size_t nbItems = items.size();
+
+        dp::Iterator<T>* it = iterable.iterator();  LOCAL (it);
+        it->get (items);
+
+        return items.size() == nbItems;
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERABLE_HELPERS_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/IteratorFile.hpp b/gatb-core/src/gatb/tools/collections/impl/IteratorFile.hpp
new file mode 100644
index 0000000..cab31e5
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/IteratorFile.hpp
@@ -0,0 +1,534 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IteratorFile.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Iterator implementation for file
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERATOR_FILE_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERATOR_FILE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+#include <vector>
+#include <zlib.h>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+/** Implementation of API from collections */
+namespace impl          {
+/********************************************************************************/
+
+#define DEBUG_ITERATORFILE(x) {}//{x}
+
+#define BUFFER_SIZE (128*1024)
+
+/** \brief Iterator implementation for file
+ */
+template <class Item> class IteratorFile : public dp::Iterator<Item>
+{
+public:
+
+    /** Constructor. */
+    IteratorFile () : _file(0), _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(0), _isDone(true) {}
+
+    IteratorFile (const IteratorFile& it):
+        _filename(it._filename), _file(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(it._cacheItemsNb), _isDone(true)
+    {
+        _file    = system::impl::System::file().newFile (_filename, "rb");
+        _buffer  = (Item*) MALLOC (sizeof(Item) * _cacheItemsNb);
+        DEBUG_ITERATORFILE(std::cout << "iteratorfile constructed" << std::endl;)
+    }
+
+    /** Constructor. */
+    IteratorFile (const std::string& filename, size_t cacheItemsNb=10000) :
+        _filename(filename), _file(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(cacheItemsNb), _isDone(true)
+
+    {
+        _file    = system::impl::System::file().newFile (filename, "rb");
+        _buffer  = (Item*) MALLOC (sizeof(Item) * _cacheItemsNb);
+    }
+
+    /** Destructor. */
+    ~IteratorFile ()
+    {
+        if (_file)  { delete _file;  }
+        if (_buffer) { FREE (_buffer); }
+    }
+
+    /** Affectation. */
+    IteratorFile& operator= (const IteratorFile& it)
+    {
+        if (this != &it)
+        {
+            if (_file)    { delete _file; }
+            if (_buffer)  { FREE(_buffer); }
+
+            _filename     = it._filename;
+            _cpt_buffer   = it._cpt_buffer;
+            _idx          = it._idx;
+            _cacheItemsNb = it._cacheItemsNb;
+            _isDone       = it._isDone;
+
+            _file    = system::impl::System::file().newFile (it._filename, "rb");
+            _buffer  = (Item*) MALLOC (sizeof(Item) * it._cacheItemsNb);
+        }
+        return *this;
+    }
+
+    /** \copydoc dp::Iterator::first */
+    void first()
+    {
+        _file->seeko (0, SEEK_SET);
+        _cpt_buffer = 0;
+        _idx        = 0;
+        _isDone     = false;
+        next ();
+    }
+
+    /** \copydoc dp::Iterator::next */
+    void next()
+    {
+        if (_cpt_buffer==0)
+        {
+            _idx = 0;
+            DEBUG_ITERATORFILE(std::cout << "(next) doing a fread of " << _cacheItemsNb << " items at position " << _file->tell() << " file size " << _file->getSize() << std::endl;)
+            _cpt_buffer = _file->fread (_buffer, sizeof(Item), _cacheItemsNb);
+            if (_cpt_buffer==0)  { _isDone = true;  return; }
+        }
+
+        *(this->_item) =  _buffer[_idx];
+        _cpt_buffer --;
+        _idx ++;
+    }
+
+    /** \copydoc dp::Iterator::isDone */
+    bool isDone()  { return _isDone; }
+
+    /** \copydoc dp::Iterator::item */
+    Item& item ()  { return *(this->_item); }
+
+    /** */
+    size_t fill (std::vector<Item>& vec, size_t len=0)
+    {
+        if (len==0)  { len = vec.size(); }
+        DEBUG_ITERATORFILE(std::cout << "(fill) doing a fread of " << len << " items at position " << _file->tell() << " file size " << _file->getSize() << std::endl;)
+        return _file->fread (vec.data(), sizeof(Item), len);
+    }
+
+private:
+    std::string     _filename;
+    system::IFile*  _file;
+    Item*           _buffer;
+    int             _cpt_buffer;
+    int             _idx;
+    size_t          _cacheItemsNb;
+    bool            _isDone;
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of the Iterable interface as a file
+ *
+ * This implementation uses a file as the source of the items that can be iterated.
+ *
+ */
+template <class Item> class IterableFile : public tools::collections::Iterable<Item>, public virtual system::SmartPointer
+{
+public:
+
+    /** Constructor
+     * \param[in] filename : name of the file to be iterated.
+     * \param[in] cacheItemsNb : number of items in the cache memory
+     */
+    IterableFile (const std::string& filename, size_t cacheItemsNb=10000)
+        :   _filename(filename), _cacheItemsNb (cacheItemsNb), 
+        _file(0)  // hacking my own iterator, for getItems, separate from IteratorFile. dirty, but nothing used to work at all. _file is used in getItems() only
+    {
+        // if the file doesn't exist (meaning that BagFile hasn't created it yet), let's create it just for the sake of it. but then we'll open it just for reading
+        if (!system::impl::System::file().doesExist(filename))
+            {
+                auto   _file2 = system::impl::System::file().newFile (filename, "wb");
+                delete _file2;
+            }
+        /* _file should be initialized here but actually, the iterator() method will also create its own file.
+         * so, instead of opening _file here, let's wait until getItems() is actually called (sometimes it won't).
+         */
+    }
+
+    /** Destructor. */
+    ~IterableFile () {
+        if (_file)  { delete _file;  }
+    }
+
+    /** \copydoc Iterable::iterator */
+    dp::Iterator<Item>* iterator ()  { return new IteratorFile<Item> (_filename, _cacheItemsNb); }
+
+    /** \copydoc Iterable::getNbItems */
+    int64_t getNbItems ()   {  
+        DEBUG_ITERATORFILE(std::cout << "IteratorFile::getNbItems called (file size: "<< system::impl::System::file().getSize(_filename) << "), returning " << system::impl::System::file().getSize(_filename) / sizeof(Item) << std::endl;)
+        return system::impl::System::file().getSize(_filename) / sizeof(Item); }
+
+    /** \copydoc Iterable::estimateNbItems */
+    int64_t estimateNbItems ()   {  return getNbItems(); }
+    
+    Item* getItems (Item*& buffer)
+    {
+        std::cout << "IteratorFile::getItems(buffer) not implemented" << std::endl; exit(1);
+    }
+    
+    /* from ../src/gatb/tools/collections/api/Iterable.hpp:
+       Return a buffer of items.
+        * \param[out] buffer : the buffer
+        * \param[in] start : index where to start in the buffer --> NOTE: it is ignored here because we're not buffering anything (this ties in with a different behavior in istream of Storage with CurrentIdx, depending on STORAGE_FILE or STORAGE_HDF5, currentIdx should be set to 0 when calling getItems, which in turns calls this function)
+        * \param[in] nb : number of items to be retrieved
+        * \return the number of items retrieved 
+    */
+    size_t getItems (Item*& buffer, size_t start, size_t nb)
+    {
+        if (_file == 0) 
+            _file = system::impl::System::file().newFile (_filename, "rb"); 
+        DEBUG_ITERATORFILE(std::cout << "want to read " << nb << " elements of size " << sizeof(Item) << " at position " << _file->tell() << " file size " << _file->getSize() /*<< " then write them to buffer at position " << (sizeof(Item) * start) << std::endl*/;)
+        size_t n = _file->fread (buffer /*+ sizeof(Item) * start*/, sizeof(Item), nb);
+        DEBUG_ITERATORFILE(std::cout << "read " << n << " elements" << std::endl;)
+        return n;
+    }
+
+private:
+    std::string     _filename;
+    size_t          _cacheItemsNb;
+    system::IFile*  _file;
+};
+    
+/********************************************************************************/
+/* EXPERIMENTAL (not documented). */
+template <class Item> class IteratorGzFile : public dp::Iterator<Item>
+{
+public:
+    
+    /** Constructor. */
+    IteratorGzFile () : _gzfile(0), _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(0), _isDone(true) {}
+    
+    IteratorGzFile (const IteratorGzFile& it):
+    _filename(it._filename), _gzfile(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(it._cacheItemsNb), _isDone(true)
+    {
+        _gzfile =   gzopen(_filename.c_str(),"rb");
+        _buffer  = (Item*) MALLOC (sizeof(Item) * _cacheItemsNb);
+    }
+    
+    /** Constructor. */
+    IteratorGzFile (const std::string& filename, size_t cacheItemsNb=10000) :
+    _filename(filename), _gzfile(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(cacheItemsNb), _isDone(true)
+    
+    {
+        _gzfile =   gzopen(_filename.c_str(),"rb");
+        _buffer  = (Item*) MALLOC (sizeof(Item) * _cacheItemsNb);
+    }
+    
+    /** Destructor. */
+    ~IteratorGzFile ()
+    {
+        if (_gzfile)  { gzclose(_gzfile);   }
+        if (_buffer) { FREE (_buffer); }
+    }
+    
+    /** Affectation. */
+    IteratorGzFile& operator= (const IteratorGzFile& it)
+    {
+        if (this != &it)
+        {
+            if (_gzfile)    {  gzclose(_gzfile);  }
+            if (_buffer)  { FREE(_buffer); }
+            
+            _filename     = it._filename;
+            _cpt_buffer   = it._cpt_buffer;
+            _idx          = it._idx;
+            _cacheItemsNb = it._cacheItemsNb;
+            _isDone       = it._isDone;
+            
+            _gzfile =   gzopen(_filename.c_str(),"r");
+            _buffer  = (Item*) MALLOC (sizeof(Item) * it._cacheItemsNb);
+        }
+        return *this;
+    }
+    
+    /** \copydoc dp::Iterator::first */
+    void first()
+    {
+        gzseek(_gzfile,0,SEEK_SET);
+        _cpt_buffer = 0;
+        _idx        = 0;
+        _isDone     = false;
+        next ();
+    }
+    
+    /** \copydoc dp::Iterator::next */
+    void next()
+    {
+        if (_cpt_buffer==0)
+        {
+            _idx = 0;
+            _cpt_buffer = (gzread(_gzfile, _buffer, sizeof(Item)*_cacheItemsNb)  /  sizeof(Item))  ;  // gzread returns number of bytes uncompressed returned in _buffer
+            //printf("refreshing buffer from gzread(), cptbuffer now: %d\n",_cpt_buffer);
+            if (_cpt_buffer < 0)
+            { // On other errors, gzread() shall return a value less than 0 and and applications may examine the cause using gzerror().
+                // FIXME: more tests are needed but on my system (R: linux64), gzread returns the fixed number of items, then a lower number of items (as it reaches the end), then it returns -1 instead of 0 and prints a "data error" but at this point it's fine to just return
+                int err;
+                fprintf(stderr, "gzread error: %s\n", gzerror(_gzfile, &err));
+            }
+            if (_cpt_buffer<=0)  { _isDone = true;  return; }
+        }
+        *(this->_item) =  _buffer[_idx];
+        _cpt_buffer --;
+        _idx ++;
+    }
+    
+    /** \copydoc dp::Iterator::isDone */
+    bool isDone()  { return _isDone; }
+    
+    /** \copydoc dp::Iterator::item */
+    Item& item ()  { return *(this->_item); }
+    
+    /** */
+    size_t fill (std::vector<Item>& vec, size_t len=0)
+    {
+        if (len==0)  { len = vec.size(); }
+        
+        return (gzread(_gzfile,vec.data(), sizeof(Item)*len)  /  sizeof(Item));
+ 
+    }
+    
+private:
+    std::string     _filename;
+    gzFile  _gzfile;
+    Item*           _buffer;
+    int             _cpt_buffer;
+    int             _idx;
+    size_t          _cacheItemsNb;
+    bool            _isDone;
+};
+
+/********************************************************************************/
+/* EXPERIMENTAL (not documented).
+ * reading from a  sorted compressed file, read is buffered
+ */
+template <class Item> class IteratorCountCompressedFile : public dp::Iterator<Item>
+{
+public:
+    
+    /** Constructor. */
+    IteratorCountCompressedFile () : _file(0), _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(0), _isDone(true),_abundance(0) {}
+    
+    IteratorCountCompressedFile (const IteratorCountCompressedFile& it):
+    _filename(it._filename), _file(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(it._cacheItemsNb), _isDone(true),_abundance(0)
+    {
+        _file    = system::impl::System::file().newFile (_filename, "rb");
+        _buffer  = (u_int8_t*) MALLOC (sizeof(u_int8_t) * _cacheItemsNb);
+    }
+    
+    /** Constructor. */
+    IteratorCountCompressedFile (const std::string& filename, size_t cacheItemsNb=10000) :
+    _filename(filename), _file(0),  _buffer(0), _cpt_buffer(0), _idx(0), _cacheItemsNb(cacheItemsNb), _isDone(true),_abundance(0)
+    
+    {
+        _file    = system::impl::System::file().newFile (filename, "rb");
+        _buffer  = (u_int8_t*) MALLOC (sizeof(u_int8_t) * _cacheItemsNb);
+    }
+    
+    /** Destructor. */
+    ~IteratorCountCompressedFile ()
+    {
+        if (_file)  { delete _file;  }
+        if (_buffer) { FREE (_buffer); }
+    }
+    
+    /** Affectation. */
+    IteratorCountCompressedFile& operator= (const IteratorCountCompressedFile& it)
+    {
+        if (this != &it)
+        {
+            if (_file)    { delete _file; }
+            if (_buffer)  { FREE(_buffer); }
+            
+            _filename     = it._filename;
+            _cpt_buffer   = it._cpt_buffer;
+            _idx          = it._idx;
+            _cacheItemsNb = it._cacheItemsNb;
+            _isDone       = it._isDone;
+            _abundance    = it._abundance;
+            _file    = system::impl::System::file().newFile (it._filename, "rb");
+            _buffer  = (u_int8_t*) MALLOC (sizeof(u_int8_t) * it._cacheItemsNb);
+        }
+        return *this;
+    }
+    
+    /** \copydoc dp::Iterator::first */
+    void first()
+    {
+        _file->seeko (0, SEEK_SET);
+        _cpt_buffer = 0;
+        _idx        = 0;
+        _abundance  = 0;
+        _isDone     = false;
+        next ();
+    }
+    
+    /** \copydoc dp::Iterator::next */
+    void next()
+    {
+        if(_abundance)
+        {
+            *(this->_item) =  _previous;
+            _abundance--;
+        }
+        else
+        {
+            if (!readChunkIfNeeded (1)) return;
+
+            //read a couple (byte, Item)
+            _abundance =  _buffer[_idx];
+            _cpt_buffer --;  _idx ++;
+
+            if (!readChunkIfNeeded (sizeof(Item))) return; // this one should succeed (ie, in the file always a couple  (byte, elem))
+            _previous =  *((Item *) (_buffer + _idx ));
+            _cpt_buffer -= sizeof(Item); _idx += sizeof(Item);
+            
+
+            *(this->_item) =  _previous;
+            _abundance--;
+        }
+    }
+    
+    /** \copydoc dp::Iterator::isDone */
+    bool isDone()  { return _isDone; }
+    
+    /** \copydoc dp::Iterator::item */
+    Item& item ()  { return *(this->_item); }
+    
+    /** */
+    size_t fill (std::vector<Item>& vec, size_t len=0)
+    {
+        printf("Not yet implemented \n");
+        return 0;
+    }
+    
+private:
+    std::string     _filename;
+    system::IFile*  _file;
+    u_int8_t*       _buffer;
+    int             _cpt_buffer; // how many unread bytes are remaining in the buffer
+    int             _idx; // where we should read the next elem in the buffer
+    size_t          _cacheItemsNb; //in bytes for this  compressed type file
+    bool            _isDone;
+    u_int8_t        _abundance ;
+    Item            _previous;
+
+    bool readChunkIfNeeded (size_t needNBytes)
+    {
+        if (_cpt_buffer < (int)needNBytes)
+        {
+            // printf("Read new chunk  _cacheItemsNb %zu B nedd %zu have %i  \n",_cacheItemsNb,needNBytes,_cpt_buffer);
+            // _idx = 0;
+            // printf(" A new pos in file %p  %llu  \n",_file, _file->tell());
+
+            //deplacer ce quil reste au debut avant
+            memcpy (_buffer,_buffer + _idx,_cpt_buffer ); _idx = 0;
+            int remaining = _cpt_buffer;
+            //std::cout << "(readChunkIfNeeded) doing a fread of " << (_cacheItemsNb - remaining) << " items at position " << _file->tell() << std::endl;
+            _cpt_buffer += _file->fread (_buffer+ remaining , sizeof(u_int8_t), _cacheItemsNb - remaining  );
+            // printf(" B new pos in file %p  %llu  \n",_file, _file->tell());
+
+            if (_cpt_buffer==0)  {
+                _isDone = true;
+                //printf("should end iterating file \n");
+            }
+            // printf("end read have %i \n",_cpt_buffer);
+        }
+        return !_isDone;
+    }
+};
+
+/********************************************************************************/
+/* EXPERIMENTAL (not documented). */
+template <class Item> class IterableGzFile : public tools::collections::Iterable<Item>, public virtual system::SmartPointer
+{
+public:
+    
+    /** */
+    IterableGzFile (const std::string& filename, size_t cacheItemsNb=10000)
+    :   _filename(filename), _cacheItemsNb (cacheItemsNb)  {}
+    
+    /** */
+    ~IterableGzFile () {}
+    
+    /** */
+    dp::Iterator<Item>* iterator ()  { return new IteratorGzFile<Item> (_filename, _cacheItemsNb); }
+    
+    /** */
+    int64_t getNbItems ()   {  return -1; } // does not know value
+    
+    int64_t estimateNbItems ()   {  return 3* (system::impl::System::file().getSize(_filename) / sizeof(Item)); }
+
+private:
+    std::string     _filename;
+    size_t          _cacheItemsNb;
+};
+
+/********************************************************************************/
+/* EXPERIMENTAL (not documented). */
+template <class Item> class IterableCountCompressedFile : public tools::collections::Iterable<Item>, public virtual system::SmartPointer
+{
+public:
+    
+    /** */
+    IterableCountCompressedFile (const std::string& filename, size_t cacheItemsNb=10000)
+    :   _filename(filename), _cacheItemsNb (cacheItemsNb)  {}
+    
+    /** */
+    ~IterableCountCompressedFile () {}
+    
+    /** */
+    dp::Iterator<Item>* iterator ()  { return new IteratorCountCompressedFile<Item> (_filename, _cacheItemsNb); }
+    
+    /** */
+    int64_t getNbItems ()   {  return -1; } // does not know value
+    
+    int64_t estimateNbItems ()   {  return 2* (system::impl::System::file().getSize(_filename) / sizeof(Item)); }
+    
+private:
+    std::string     _filename;
+    size_t          _cacheItemsNb;
+};
+
+    
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_ITERATOR_FILE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/MapMPHF.hpp b/gatb-core/src/gatb/tools/collections/impl/MapMPHF.hpp
new file mode 100644
index 0000000..69a7a10
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/MapMPHF.hpp
@@ -0,0 +1,242 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+/** \file MapMPHF.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Minimal Perfect Hash Function
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTION_MAP_MPHF_HPP_
+#define _GATB_CORE_TOOLS_COLLECTION_MAP_MPHF_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/collections/impl/BooPHF.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <vector>
+
+/********************************************************************************/
+namespace gatb        {
+	namespace core        {
+		namespace tools       {
+			namespace collections {
+				namespace impl        {
+					/********************************************************************************/
+					
+					/** \brief hash table implementation
+					 *
+					 * This hash table implementation uses a minimal perfect hash function (MPHF) for
+					 * identifying the keys with a unique number in [0..N-1] where N is the number of items.
+					 *
+					 * Using BooPHF, the memory usage is about 3-4 bits per key.
+					 *
+					 * The values can be stored in a simple vector. The keys are not stored in memory, only
+					 * the mphf is needed.
+					 *
+					 * Note that such an implementation can't afford to add items into the map (it's static).
+					 */
+					template <class Key, class Value, class Adaptator=AdaptatorDefault<Key> >
+					class MapMPHF : public system::SmartPointer
+					{
+					public:
+						
+						/** Hash type. */
+						typedef BooPHF<Key, Adaptator> Hash;
+						
+						/** Default constructor. */
+						MapMPHF () : hash() {}
+						
+						/** Build the hash function from a set of items.
+						 * \param[in] keys : iterable over the keys of the hash table
+						 * \param[in] progress : listener called during the building of the MPHF
+						 */
+						void build (tools::collections::Iterable<Key>& keys, int nbThreads = 1, tools::dp::IteratorListener* progress=0)
+						{
+							/** We build the hash function. */
+							hash.build (&keys, nbThreads, progress);
+							
+							/** We resize the vector of Value objects. */
+							data.resize (keys.getNbItems());
+							clearData();
+							initDiscretizationScheme();
+						}
+						
+						
+						
+						// discretization scheme to store abundance values from 0 to 50000 on 8 bits
+						// with  5% error maximum
+						// from 0     to 70     :   step = 1              (70 buckets)
+						// from 70    to 100    :   step = 2              (15 buckets)
+						// from 100   to 500    :   step = 10             (40 buckets)
+						// from 500   to 1000   :   step = 20             (25 buckets)
+						// from 1000  to 5000   :   step = 100            (40 buckets)
+						// from 5000  to 10000  :   step = 200            (25 buckets)
+						// from 10000 to 50000  :   step = 1000           (40 buckets)
+						//
+						//to change discretization scheme, change the values in _abundanceDiscretization below
+					
+						void initDiscretizationScheme()
+						{
+							_abundanceDiscretization.resize(257);
+							
+							int total =0;
+							_abundanceDiscretization[0] = 0;
+							int idx=1;
+							for(int ii=1; ii<= 70; ii++,idx++ )
+							{
+								total += 1;
+								_abundanceDiscretization[idx] = total ;
+							}
+							
+							for(int ii=1; ii<= 15; ii++,idx++ )
+							{
+								total += 2;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							
+							for(int ii=1; ii<= 40; ii++,idx++ )
+							{
+								total += 10;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							for(int ii=1; ii<= 25; ii++,idx++ )
+							{
+								total += 20;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							for(int ii=1; ii<= 40; ii++,idx++ )
+							{
+								total += 100;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							for(int ii=1; ii<= 25; ii++,idx++ )
+							{
+								total += 200;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							for(int ii=1; ii<= 40; ii++,idx++ )
+							{
+								total += 1000;
+								_abundanceDiscretization[idx] = total  ;
+							}
+							//
+							
+							
+							
+							_abundanceDiscretization[256] = UINT_MAX;
+							
+							
+							
+							
+							
+							/*
+							for(int ii=0; ii<_abundanceDiscretization.size(); ii++ )
+							{
+								printf("disc[%i] = %i \n", ii,_abundanceDiscretization[ii] );
+							}
+							*/
+							
+						}
+						
+						/* use the hash from another MapMPHF class. hmm is this smartpointer legit?
+						 * also allocate n/x data elements
+						 */
+						void useHashFrom (MapMPHF *other, int x = 1)
+						{
+							hash = other->hash;
+							
+							/** We resize the vector of Value objects. */
+							data.resize ((unsigned long)((hash.size()) / (unsigned long)x) + 1LL); // that +1 and not (hash.size+x-1) / x
+							
+							clearData();
+						}
+						
+						/** Save the hash function into a Group object.
+						 * \param[out] group : group where to save the MPHF
+						 * \param[in] name : name of the saved MPHF
+						 * \return the number of bytes of the saved data.
+						 */
+						size_t save (tools::storage::impl::Group& group, const std::string& name)  {  return hash.save (group, name);  }
+						
+						/** Load hash function from a Group
+						 * \param[in] group : group where to load the MPHF from
+						 * \param[in] name : name of the MPHF
+						 */
+						void load (tools::storage::impl::Group& group, const std::string& name)
+						{
+							/** We load the hash function. */
+							size_t nbKeys = hash.load (group, name);
+							
+							/** We resize the vector of Value objects. */
+							data.resize (nbKeys);
+							clearData();
+							initDiscretizationScheme();
+						}
+						
+						/** Get the value for a given key
+						 * \param[in] key : the key
+						 * \return the value associated to the key. */
+						int operator[] (const Key& key)  {
+							return floorf((_abundanceDiscretization [data[hash(key)]]  +  _abundanceDiscretization [data[hash(key)]+1])/2.0);
+							//return data[hash(key)];
+						}
+						
+						/** Get the value for a given index
+						 * \param[in] code : the key
+						 * \return the value associated to the key. */
+						Value& at (typename Hash::Code code)  {
+							return data[code];
+						
+						}
+						
+						
+						Value& at (const Key& key)  {
+							return data[hash(key)];
+						}
+						
+						
+						/** Get the hash code of the given key. */
+						typename Hash::Code getCode (const Key& key) { return hash(key); }
+						
+						/** Get the number of keys.
+						 * \return keys number. */
+						size_t size() const { return hash.size(); }
+						
+						void clearData() { 
+							for (unsigned long i = 0; i < data.size(); i ++)
+								data[i] = 0;
+						}
+						
+						std::vector<int>   _abundanceDiscretization;
+
+					private:
+						
+						Hash               hash;
+						std::vector<Value> data;
+						
+						
+					};
+					
+					/********************************************************************************/
+				} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTION_MAP_MPHF_HPP_ */
diff --git a/gatb-core/src/gatb/tools/collections/impl/OAHash.hpp b/gatb-core/src/gatb/tools/collections/impl/OAHash.hpp
new file mode 100644
index 0000000..1bba152
--- /dev/null
+++ b/gatb-core/src/gatb/tools/collections/impl/OAHash.hpp
@@ -0,0 +1,287 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file OAHash.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Container implementation
+ */
+
+#ifndef _GATB_CORE_TOOLS_COLLECTIONS_IMPL_OAHASH_HPP_
+#define _GATB_CORE_TOOLS_COLLECTIONS_IMPL_OAHASH_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Container.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <algorithm>
+
+/********************************************************************************/
+namespace gatb          {
+namespace core          {
+namespace tools         {
+namespace collections   {
+namespace impl          {
+/********************************************************************************/
+
+/** \brief Hash table implementation
+ */
+template <typename Item> class OAHash
+{
+    typedef misc::Abundance<Item> element_pair;
+
+public:
+
+    /** Get the size (in byte) of an item.
+     * \return the item size.
+     */
+    static int size_entry ()  {  return sizeof(element_pair); }
+
+    /** Get the max number of items for the hash table
+     * \return the max items number.
+     */
+    int getMaxNbItems ()  { return hash_size; }
+
+    /** Constructor.
+     * \param[in] max_memory : max memory for the hash table.
+     */
+    OAHash (u_int64_t max_memory)
+    {
+        hash_size = max_memory / sizeof(element_pair);
+        if (hash_size == 0)  {  throw system::Exception ("empty OAHash allocated");  }
+        data = (element_pair *) CALLOC ( hash_size, sizeof(element_pair));  //create hashtable
+    }
+
+    /** Destructor. */
+    ~OAHash()  {  FREE (data);  }
+
+    /** Insert an item with its value into the hash table.
+     * \param[in] graine : key
+     * \param[in] value : value
+     */
+    void insert (const Item& graine, int value)
+    {
+        element_pair *element = find_slot(graine);
+        if (!is_occupied(element))
+            element->value = graine;
+        element->abundance = value;
+    }
+
+    /** Increment the value for a given key.
+     * \param[in] graine : key
+     */
+    void increment (const Item& graine)
+    {
+        element_pair *element = find_slot(graine);
+
+        if (!is_occupied(element))
+            element->value = graine;
+        element->abundance = element->abundance + 1;
+    }
+
+    /** Get the value for a given key
+     * \param[in] graine : key
+     * \param[out] val : value to be retrieved
+     * \return true if the key is found, false otherwise.
+     */
+    bool get (const Item& graine, int * val=0)
+    {
+        element_pair *element = find_slot(graine, false);
+        if (element == 0)  { return 0; }
+
+        if (!is_occupied(element))
+            return false;
+        if (element->value == graine)
+            if (val != NULL)
+                *val = element->abundance;
+        return true;
+    }
+
+    /** Tells whether or not the given key is in the table
+     * \param[in] graine : key to be checked
+     * \return true if present, false otherwise.
+     */
+    bool has_key (const Item& graine)  {     return get(graine,NULL) == 1;  }
+
+    /** Get the memory usage of the hash table
+     * \return the memory usage (in bits).
+     */
+    u_int64_t memory_usage() {     return hash_size* sizeof(element_pair); /* in bits */ }
+
+    /** Get the load factor of the hash table
+     * \return the load factor.
+     */
+    float load_factor()
+    {
+        u_int64_t ptr = 0;
+        u_int64_t nbKeys = 0;
+        while (ptr < hash_size)
+        {
+            while ((ptr < hash_size) &&  ((data+ptr)->abundance == 0)  )
+                ptr++;
+
+            if (ptr == hash_size)
+                break;
+
+            nbKeys++;
+            ptr++;
+        }
+        return (float)nbKeys/(float)hash_size;
+    }
+
+    /** Get an iterator for the hash table.
+     * \param[in] sorted : if true, items are iterated in a sorted way
+     * \return an iterator over the items of the hash table.
+     */
+    dp::Iterator <misc::Abundance<Item> >* iterator (bool sorted=false)
+    {  if (sorted==false) { return new Iterator(*this); } else { return new IteratorSorted (*this);  } }
+
+
+    /************************************************************/
+    class Iterator : public tools::dp::Iterator <misc::Abundance<Item> >
+    {
+    public:
+
+        Iterator (OAHash<Item>& aRef) : ref(aRef), iterator(0), iteratorMax(0), done(true)  {}
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first()
+        {
+            iterator    = ref.data - 1;
+            iteratorMax = ref.data + ref.hash_size;
+            done        = false;
+
+            next ();
+        }
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next()
+        {
+            while (!done)
+            {
+                ++iterator;
+                done = (iterator >= iteratorMax);
+                if (!done && iterator->abundance != 0)
+                {
+                    *this->_item = *iterator;  break;
+                }
+            }
+        }
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()   {  return done; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        misc::Abundance<Item>& item ()     { return *this->_item; }
+
+    private:
+        OAHash<Item>&  ref;
+        element_pair*  iterator;
+        element_pair*  iteratorMax;
+        bool           done;
+    };
+
+    /************************************************************/
+    class IteratorSorted : public tools::dp::Iterator <misc::Abundance<Item> >
+    {
+    public:
+
+        IteratorSorted (OAHash<Item>& aRef) : _ref(aRef), _idx(0), _nb(0)
+        {
+            if (_ref.hash_size > (1ULL<<32))  { throw system::Exception ("OAHash::sort  too many items..."); }
+
+            for (u_int64_t idx=0; idx<_ref.hash_size; idx++)
+            {
+                if (_ref.data[idx].abundance != 0)  { _offsets.push_back (idx); }
+            }
+
+            _nb = _offsets.size();
+
+            std::sort (_offsets.begin(), _offsets.end(), CmpPair(_ref,_offsets));
+        }
+
+        /** \copydoc tools::dp::Iterator::first */
+        void first()  {  _idx = -1;  next ();  }
+
+        /** \copydoc tools::dp::Iterator::next */
+        void next()  {  ++_idx;  if (_idx < _nb ) { *(this->_item) = (_ref.data[_offsets[_idx]]); }
+        }
+
+        /** \copydoc tools::dp::Iterator::isDone */
+        bool isDone ()   {  return _idx >= _nb; }
+
+        /** \copydoc tools::dp::Iterator::item */
+        misc::Abundance<Item>& item ()     { return *this->_item; }
+
+    private:
+        OAHash<Item>&           _ref;
+        std::vector<u_int32_t>  _offsets;
+        int64_t                 _idx;
+        int64_t                 _nb;
+
+        struct CmpPair
+        {
+            element_pair*           _data;
+            std::vector<u_int32_t>& _offsets;
+            CmpPair (OAHash<Item>& ref, std::vector<u_int32_t>& offsets) : _data(ref.data), _offsets(offsets) {}
+            bool operator() (u_int32_t i1, u_int32_t i2)  {  return _data[i1].value < _data[i2].value;  }
+        };
+    };
+
+protected:
+
+    u_int64_t      hash_size;
+    element_pair*  data;
+
+    /** */
+    element_pair * find_slot (const Item& key, bool exceptionOnBadKey = true)
+    {
+        u_int64_t ptr = oahash (key) % hash_size;
+        element_pair* element = data+ptr;
+        u_int64_t retries = 0;
+
+        // search until we either find the key, or find an empty slot.
+        while ( ( is_occupied(element)) && ( element->value != key ) && (retries < hash_size))
+        {
+            ptr = (ptr + 1) % hash_size;
+            element = data+ptr;
+            retries++;
+        }
+
+        if (retries == hash_size)
+        {
+            if (exceptionOnBadKey)  {  throw system::Exception ("OAHash: max rehashes reached: %lld (notify a developer)", hash_size);  }
+            return 0;
+        }
+
+        return element;
+    }
+
+
+    bool is_occupied (element_pair *element)   {  return (element->abundance != 0); }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_COLLECTIONS_IMPL_OAHASH_HPP_ */
diff --git a/gatb-core/src/gatb/tools/compression/CompressionUtils.hpp b/gatb-core/src/gatb/tools/compression/CompressionUtils.hpp
new file mode 100644
index 0000000..e9d012d
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/CompressionUtils.hpp
@@ -0,0 +1,226 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _COMPRESSIONUTILS_HPP_
+#define _COMPRESSIONUTILS_HPP_
+
+using namespace std;
+
+
+//namespace gatb          {
+//namespace core          {
+//namespace tools         {
+//namespace compression   {
+
+
+//====================================================================================
+// ** COMPRESSIONUTILS
+//====================================================================================
+
+class CompressionUtils
+{
+	public:
+	
+		//For better compression rate, each byte outputted when processing numerics is encoded using distinct models
+		static const u_int8_t NB_MODELS_PER_NUMERIC = 20;
+		
+		
+		//Take a value and return its number of byte
+		static int getByteCount(u_int64_t n){
+			if(n < 0x100){
+				return 1;
+			}
+			else if(n >= 0x100 && n < 0x10000){
+				return 2;
+			}
+			else if(n >= 0x10000 && n < 0x1000000){
+				return 3;
+			}
+			else if(n >= 0x1000000 && n < 0x100000000){
+				return 4;
+			}
+			else if(n >= 0x100000000 && n < 0x10000000000){
+				return 5;
+			}
+			else if(n >= 0x10000000000 && n < 0x1000000000000){
+				return 6;
+			}
+			else if(n >= 0x1000000000000 && n < 0x100000000000000){
+				return 7;
+			}
+			else{
+				return 8;
+			}
+
+		}
+
+		//Variable byte enconding (VBE) http://nlp.stanford.edu/IR-book/html/htmledition/variable-byte-codes-1.html
+		static void encodeNumeric(RangeEncoder& rangeEncoder, vector<Order0Model>& numericModels, u_int64_t value){
+
+			int i=0;
+			do
+			{
+				u_int8_t byteCode = (u_int8_t) (value & 127);
+				value = value >> 7;
+				if (value != 0)
+				{
+					byteCode |= 128;
+					rangeEncoder.encode(numericModels[i], byteCode);
+				}
+				else
+					rangeEncoder.encode(numericModels[i], byteCode);
+
+				i += 1;
+			}
+			while (value != 0);
+
+
+			//int valueByteCount = getByteCount(value);
+			//cout << "Utils: " << (int)valueByteCount << endl;
+			//rangeEncoder.encode(byteCountModel, valueByteCount);
+				
+			//for(int i=0; i<valueByteCount; i++){
+				//cout << "Utils: " << ((value >> i*8) & 0xff) << endl;
+				//rangeEncoder.encode(numericModels[i], (value >> i*8) & 0xff);
+			//}
+		}
+
+		static void encodeFixedNumeric(RangeEncoder& rangeEncoder, vector<Order0Model>& numericModels, u_int64_t value, int byteCount){
+			//cout << "sdf" << value << " " << byteCount << endl;
+			for(int i=0; i<byteCount; i++){
+				//cout << ((value >> i*8) & 0xff) << endl;
+				rangeEncoder.encode(numericModels[i], (value >> i*8) & 0xff);
+			}
+		}
+
+		//Variable byte enconding (VBE) http://nlp.stanford.edu/IR-book/html/htmledition/variable-byte-codes-1.html
+		static u_int64_t decodeNumeric(RangeDecoder& rangeDecoder, vector<Order0Model>& numericModels){
+			//u_int8_t byteCount = rangeDecoder.nextByte(byteCountModel);
+			//cout << (int)byteCount << endl;
+			//u_int64_t value = 0;
+			//for(int i=0; i<byteCount; i++){
+			//	u_int8_t byteValue = rangeDecoder.nextByte(numericModels[i]);
+				//cout << "Utils: " << (byteValue << i*8) << endl;
+			//	value |= ((u_int64_t)byteValue << i*8);
+			//}
+			int i = 0;
+			u_int64_t value = 0;
+			u_int64_t byteCode = 0;
+			int shift = 0;
+			do
+			{
+				byteCode = rangeDecoder.nextByte(numericModels[i]);
+				value += (byteCode & 127) << shift;
+				shift += 7;
+				i += 1;
+			}
+			while (byteCode > 127);
+			
+			return value;
+		}
+		
+		static u_int64_t decodeFixedNumeric(RangeDecoder& rangeDecoder, vector<Order0Model>& numericModels, int byteCount){
+			
+			u_int64_t value = 0;
+			for(int i=0; i<byteCount; i++){
+				
+				u_int8_t byteValue = rangeDecoder.nextByte(numericModels[i]);
+				value |= (byteValue << i*8);
+			}
+			
+			return value;
+		}
+		
+		/*
+		static stringstream _convert;
+		
+		static string numberToString(u_int64_t number){
+			_convert << number;
+			string result(_convert.str());
+			//cout << result << endl;
+			return result;
+		}*/
+		
+		
+		static u_int8_t getDeltaValue(u_int64_t value, u_int64_t prevValue, u_int64_t* resultDeltaValue){
+			
+			bool isDelta1Valid = false;
+			bool isDelta2Valid = false;
+
+			u_int64_t deltaValue1 = value - prevValue;
+			u_int64_t deltaValue2 = prevValue - value;
+			
+			
+			if( deltaValue1 < value){ //deltaValue1 >= 0 &&
+				isDelta1Valid = true;
+			}
+			if( deltaValue2 < value){ //deltaValue2 >= 0 &&
+				isDelta2Valid = true;
+			}
+			
+			if(isDelta1Valid && isDelta2Valid){
+				if(deltaValue1 <= deltaValue2){
+					*resultDeltaValue = deltaValue1;
+					return 1;
+				}
+				else{
+					*resultDeltaValue = deltaValue2;
+					return 2;
+				}
+			}
+			else if(isDelta1Valid){
+				*resultDeltaValue = deltaValue1;
+				return 1;
+			}
+			else if(isDelta2Valid){
+				*resultDeltaValue = deltaValue2;
+				return 2;
+			}
+			
+			*resultDeltaValue = value;
+			return 0;	
+		}
+	
+	
+	
+		static u_int64_t getValueFromDelta(u_int8_t deltaType, u_int64_t prevValue, u_int64_t deltaValue){
+			
+			if(deltaType == 0){
+				return deltaValue;
+			}
+			if(deltaType == 1){
+				return prevValue + deltaValue;	
+			}
+			else if(deltaType == 2){
+				return prevValue - deltaValue;
+			}
+			return deltaValue; //avoid warning;
+		}
+};
+
+	
+
+/********************************************************************************/
+//}}}};
+/********************************************************************************/
+	
+
+#endif /* _COMPRESSIONUTILS_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/compression/DnaCoder.cpp b/gatb-core/src/gatb/tools/compression/DnaCoder.cpp
new file mode 100644
index 0000000..07ee663
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/DnaCoder.cpp
@@ -0,0 +1,1784 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#include "DnaCoder.hpp"
+
+/*
+#define PRINT_DEBUG_EXTMUTA
+#define PRINT_DEBUG_ENCODER
+#define PRINT_DEBUG_DECODER
+*/
+
+
+char bin2NTrev[4] = {'T','G','A','C'};
+//char bin2NT[4] = {'A','C','T','G'};
+
+/*
+GACGCGCCGATATAACGCGCTTTCCCGGCTTTTACCACGTCGTTGAGGGCTTCCAGCGTCTCTTCGATCGGCGTGTTGTAATCCCAGCGATGAATTTG6:2308q
+			Anchor pos: 8
+			Anchor: GATATAACGCGCTTTCCCGGCTTTTACCACG
+			§ Anchor: 8
+*/
+
+//====================================================================================
+// ** AbstractDnaCoder
+//====================================================================================
+AbstractDnaCoder::AbstractDnaCoder(Leon* leon) :
+_kmerModel(leon->_kmerSize),
+_readTypeModel(2), //only 2 value in this model: read with anchor or without anchor
+//_isPrevReadAnchorableModel(2),
+_noAnchorReadModel(5), _bifurcationModel(5), //5value: A, C, G, T, N
+_bifurcationBinaryModel(2), //0 or 1 (lowest or highest bifurcation by alphabetical order)
+_readAnchorRevcompModel(2),
+_readSizeDeltaTypeModel(3),
+_anchorPosDeltaTypeModel(3),
+_anchorAddressDeltaTypeModel(3),
+_NposDeltaTypeModel(3),
+_errorPosDeltaTypeModel(3),_seqId(0)
+{
+	_leon = leon;
+	_bloom = _leon->_bloom;
+	_kmerSize = _leon->_kmerSize;
+	
+	
+	for(int i=0; i<CompressionUtils::NB_MODELS_PER_NUMERIC; i++){
+		_anchorAddressModel.push_back(Order0Model(256));
+		//_isPrevReadAnchorablePosModel.push_back(Order0Model(256));
+		_anchorPosModel.push_back(Order0Model(256));
+		_noAnchorReadSizeValueModel.push_back(Order0Model(256));
+		_readSizeValueModel.push_back(Order0Model(256));
+		_NposModel.push_back(Order0Model(256));
+		_leftErrorPosModel.push_back(Order0Model(256));
+		//_rightErrorPosModel.push_back(Order0Model(256));
+		_numericModel.push_back(Order0Model(256));
+		_leftErrorModel.push_back(Order0Model(256));
+		//_rightErrorModel.push_back(Order0Model(256));
+	}
+	
+	
+}
+
+void AbstractDnaCoder::startBlock(){
+	//_prevSequences = NULL;
+
+	for(int i=0; i<CompressionUtils::NB_MODELS_PER_NUMERIC; i++){
+		_anchorAddressModel[i].clear();
+		//_isPrevReadAnchorablePosModel[i].clear();
+		_anchorPosModel[i].clear();
+		_noAnchorReadSizeValueModel[i].clear();
+		_readSizeValueModel[i].clear();
+		_NposModel[i].clear();
+		_leftErrorPosModel[i].clear();
+		//_rightErrorPosModel[i].clear();
+		_numericModel[i].clear();
+		_leftErrorModel[i].clear();
+		//_rightErrorModel[i].clear();
+	}
+	_readTypeModel.clear();
+	//_isPrevReadAnchorableModel.clear();
+	_noAnchorReadModel.clear();
+	_bifurcationModel.clear();
+	_bifurcationBinaryModel.clear();
+	_readAnchorRevcompModel.clear();
+	_readSizeDeltaTypeModel.clear();
+	_anchorPosDeltaTypeModel.clear();
+	_anchorAddressDeltaTypeModel.clear();
+	_NposDeltaTypeModel.clear();
+	_errorPosDeltaTypeModel.clear();
+	_prevReadSize = 0;
+	_prevAnchorPos = 0;
+	_prevAnchorAddress = 0;
+	_prevNpos = 0;
+	_prevErrorPos = 0;
+	
+	_processedSequenceCount = 0;
+}
+
+void AbstractDnaCoder::endRead(){
+	_processedSequenceCount += 1;
+}
+
+void AbstractDnaCoder::codeSeedBin(KmerModel* model, kmer_type* kmer, int nt, bool right){
+
+	
+	if(right)
+	{
+        /** We initialize the kmer. */
+        KmerModel::Kmer tmp;  tmp.set (*kmer);
+
+		*kmer = model->codeSeedRight (tmp, nt, Data::INTEGER).value();
+	}
+	else
+	{
+        /** We initialize the canonical kmer. */
+        KmerModel::Kmer tmp;  tmp.set (revcomp(*kmer, _kmerSize));
+
+		*kmer = model->codeSeedRight (tmp, binrev[nt], Data::INTEGER).value();
+		*kmer = revcomp(*kmer, _kmerSize);
+	}
+}
+
+void AbstractDnaCoder::codeSeedNT(KmerModel* model, kmer_type* kmer, char nt, bool right){
+	//if(nt == 'N') nt = 'A';
+	return codeSeedBin(model, kmer, Leon::nt2bin(nt), right);
+}
+
+
+void AbstractDnaCoder::addErrorPos(int pos, bool rightExtend){
+
+		_leftErrorPos.push_back(pos);
+}
+
+//====================================================================================
+// ** DnaEncoder
+//====================================================================================
+DnaEncoder::DnaEncoder(Leon* leon) :
+AbstractDnaCoder(leon), _itKmer(_kmerModel), _totalDnaSize(0), _readCount(0), _MCtotal(0), _readWithoutAnchorCount(0),
+_MCuniqSolid (0), _MCuniqNoSolid(0), _MCnoAternative(0), _MCmultipleSolid(0)//, _MCmultipleNoSolid(0)
+{
+	_maxSequenceSize = 0;
+	_minSequenceSize = INT_MAX;
+	
+	_thread_id = __sync_fetch_and_add (&_leon->_nb_thread_living, 1);
+
+#ifdef PRINT_DISTRIB
+	_distrib.resize(maxSequences);
+	_outDistrib = 0;
+#endif
+
+	//pour quals
+	if(! leon->_isFasta)
+	{
+	_max_read_size = 10000;
+	_nb_solids = (int *) malloc(_max_read_size * sizeof(int) );
+	_qualseq = (char *) malloc(_max_read_size*sizeof(char ));
+	_bufferQuals_size = _leon->getReadPerBlock()* 200;
+	_bufferQuals = (char *) malloc(_bufferQuals_size * sizeof(char ));
+	_bufferQuals_idx=0;
+	
+	_trunc_mode = true;
+	_smoothing_threshold = 2;
+		
+	}
+}
+
+DnaEncoder::DnaEncoder(const DnaEncoder& copy) :
+AbstractDnaCoder(copy._leon), _itKmer(_kmerModel),
+ _totalDnaSize(0), _readCount(0), _MCtotal(0), _readWithoutAnchorCount(0),
+_MCuniqSolid (0), _MCuniqNoSolid(0), _MCnoAternative(0), _MCmultipleSolid(0)//, _MCmultipleNoSolid(0)
+{
+	_maxSequenceSize = 0;
+	_minSequenceSize = INT_MAX;
+	
+#ifdef PRINT_DISTRIB
+	_distrib.resize(maxSequences);
+	_outDistrib = 0;
+#endif
+
+	_thread_id = __sync_fetch_and_add (&_leon->_nb_thread_living, 1);
+
+	startBlock();
+
+	
+	//for quals
+	if(! _leon->_isFasta)
+	{
+	_max_read_size = 10000;
+	_nb_solids = (int *) malloc(_max_read_size * sizeof(int) );
+	_qualseq = (char *) malloc(_max_read_size*sizeof(char ));
+	_bufferQuals_size = _leon->getReadPerBlock()* 200;
+	_bufferQuals = (char *) malloc(_bufferQuals_size * sizeof(char ));
+	//printf("initial buffer qual size %i \n",_bufferQuals_size );
+
+	_bufferQuals_idx =0;
+	
+	_trunc_mode = true;
+	_smoothing_threshold = 2;
+	}
+	
+	///
+	
+	#ifdef LEON_PRINT_STAT
+		_rangeEncoder1.updateModel = false;
+		_rangeEncoder2.updateModel = false;
+		_rangeEncoder3.updateModel = false;
+		_rangeEncoder4.updateModel = false;
+		_rangeEncoder5.updateModel = false;
+		_rangeEncoder6.updateModel = false;
+	#endif
+
+}
+
+DnaEncoder::~DnaEncoder(){
+
+	if(_thread_id!=0 && (_seqId+1) % _leon->getReadPerBlock() != 0 ){
+		writeBlock();
+	}
+	//int nb_remaining =
+	__sync_fetch_and_add (&_leon->_nb_thread_living, -1);
+
+	//printf("\~ this decoder %lli seq  %lli  mctotal   %lli mltnos %p   tid %i \n",_readCount,_MCtotal,_MCmultipleNoSolid,this,_thread_id);
+	__sync_fetch_and_add(&_leon->_readCount, _readCount);
+	__sync_fetch_and_add(&_leon->_MCtotal, _MCtotal);
+	__sync_fetch_and_add(&_leon->_readWithoutAnchorCount, _readWithoutAnchorCount);
+	__sync_fetch_and_add(&_leon->_totalDnaSize, _totalDnaSize);
+	__sync_fetch_and_add(&_leon->_MCuniqSolid, _MCuniqSolid);
+	__sync_fetch_and_add(&_leon->_MCuniqNoSolid, _MCuniqNoSolid);
+	__sync_fetch_and_add(&_leon->_MCnoAternative, _MCnoAternative);
+	__sync_fetch_and_add(&_leon->_MCmultipleSolid, _MCmultipleSolid);
+	
+	_leon->updateMinMaxSequenceSize(_minSequenceSize,_maxSequenceSize);
+	
+	
+	//__sync_fetch_and_add(&_leon->_MCmultipleNoSolid, _MCmultipleNoSolid);
+	
+	#ifdef LEON_PRINT_STAT
+		__sync_fetch_and_add(&_leon->_anchorAdressSize, _rangeEncoder3.getBufferSize());
+		__sync_fetch_and_add(&_leon->_anchorPosSize, _rangeEncoder2.getBufferSize());
+		__sync_fetch_and_add(&_leon->_readSizeSize, _rangeEncoder1.getBufferSize());
+		__sync_fetch_and_add(&_leon->_bifurcationSize, _rangeEncoder4.getBufferSize());
+		__sync_fetch_and_add(&_leon->_otherSize, _rangeEncoder6.getBufferSize());
+		__sync_fetch_and_add(&_leon->_noAnchorSize, _rangeEncoder5.getBufferSize());
+
+		
+		_rangeEncoder1.clear();
+		_rangeEncoder2.clear();
+		_rangeEncoder3.clear();
+		_rangeEncoder4.clear();
+		_rangeEncoder5.clear();
+		_rangeEncoder6.clear();
+	#endif
+	
+	
+	//pour quals
+	if(! _leon->_isFasta)
+	{
+		free(_nb_solids);
+		free(_qualseq);
+		free(_bufferQuals);
+	}
+}
+
+void DnaEncoder::operator()(Sequence& sequence){
+
+#ifdef PRINT_DISTRIB
+	if(_sequences.size() > maxSequences){
+		_sequences.pop_back();
+	}
+#endif
+
+	_sequence = &sequence;
+	//cout << _sequence->getIndex() << endl;
+	_seqId = _sequence->getIndex() ;
+	_readSize = _sequence->getDataSize();
+	_readseq = _sequence->getDataBuffer();
+		
+	_totalDnaSize += _readSize ;
+	
+	
+	_minSequenceSize = std::min(_minSequenceSize, (int) _readSize);
+	_maxSequenceSize = std::max(_maxSequenceSize, (int)_readSize);
+	
+	
+	//_lastSequenceIndex = sequence->getIndex();
+	
+//	if(_sequence->getIndex() % Leon::READ_PER_BLOCK == 0){
+
+	execute();
+
+	//_prevSequences = _sequence;
+#ifdef PRINT_DISTRIB
+	_sequences.insert(_sequences.begin(), _sequence);
+#endif
+
+	if(_processedSequenceCount >= _leon->getReadPerBlock() ){
+		
+		writeBlock();
+		startBlock();
+	}
+
+}
+
+void DnaEncoder::writeBlock(){
+	if(_processedSequenceCount == 0) return;
+	
+	if(_rangeEncoder.getBufferSize() > 0){
+		_rangeEncoder.flush();
+	}
+	
+	int blockId = (  _seqId / _leon->getReadPerBlock())   ;
+	//printf("\nTid %i  WB :  blockid %i sid %llu     size: %llu  _processedSequenceCount %i\n",_thread_id, blockId, _seqId, _rangeEncoder.getBufferSize(),_processedSequenceCount );
+
+	//_leon->_realDnaCompressedSize += _rangeEncoder.getBufferSize();
+	_leon->writeBlock(_rangeEncoder.getBuffer(), _rangeEncoder.getBufferSize(), _processedSequenceCount,blockId,false);
+	_rangeEncoder.clear();
+	
+	if(! _leon->_isFasta)
+	{
+		_leon->writeBlockLena((u_int8_t*) _bufferQuals, _bufferQuals_idx ,_processedSequenceCount, blockId);
+		_bufferQuals_idx = 0;
+	}
+	
+#ifdef PRINT_DISTRIB
+	cout << "----------------------------------------------------" << endl;
+	for(int i=0; i<_distrib.size(); i++){
+		cout << i << "    " << _distrib[i] << endl;
+	}
+	cout << "Adressed:    " << _outDistrib << endl;
+#endif
+
+	
+}
+
+void DnaEncoder::execute(){
+
+
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << endl << "\tEncoding seq " << _sequence->getIndex() << endl;
+		cout << "\t\t" << _readseq << endl;
+	#endif
+	
+	//cout << _readseq << endl;
+	
+	_readCount +=1;
+	_Npos.clear();
+	
+	if(_readSize < _kmerSize){
+		encodeNoAnchorRead();
+		smoothQuals();
+		endRead();
+		return;
+	}
+
+
+	 
+	//cout << _leon->_readCount << endl;
+	//kmer_type anchorKmer = 0;
+	u_int32_t anchorAddress;
+	
+	buildKmers(); // en profiter ici pour faire la compression des qual ?
+	
+	if(! _leon->_isFasta)
+	{
+		storeSolidCoverageInfo();
+		smoothQuals();
+	}
+	
+
+	//_isPrevReadAnchorable = false;
+	int anchorPos = findExistingAnchor(&anchorAddress); //unsynch
+
+	if(anchorPos == -1)
+		anchorPos = _leon->findAndInsertAnchor(_kmers, &anchorAddress);  //unsynch
+
+	//cout << anchorPos << endl;
+
+	if(anchorPos == -1)
+		encodeNoAnchorRead();
+	else{
+		encodeAnchorRead(anchorPos, anchorAddress);
+	}
+	//}
+	
+	endRead();
+
+}
+
+
+
+
+double DnaEncoder::char2proba(char c)
+{
+	int phred = c -33;
+	
+	double proba =  exp(-phred* log(10)/10);
+	return proba;
+	//Q 10 : 10% err
+	//Q 20 : 1% err
+	//Q 30  0.1% err ..
+}
+
+
+char DnaEncoder::char2phred(char c)
+{
+	return c -33;
+}
+
+
+void DnaEncoder::smoothQuals()
+{
+	strcpy (_qualseq, _sequence->getQuality().c_str());  // copy the qual sequence of this read in _qualseq
+
+	if(! _leon->_lossless && _readSize >= _kmerSize)
+	{
+		for (unsigned int ii=0; ii< _readSize; ii++)
+		{
+			if ((_nb_solids[ii]>= _smoothing_threshold) || (((int) _qualseq[ii] > (int) '@') && _trunc_mode ))
+			{
+				apply_smoothing_at_pos (ii);
+			}
+		}
+	}
+	
+	_qualseq[_readSize]='\n';
+	_qualseq[_readSize+1]='\0';
+	
+	if( (_bufferQuals_idx+ _readSize+1 ) >= _bufferQuals_size)
+	{
+		//printf("_bufferQuals_size %i  _bufferQuals_idx %i  seqid %zu \n",_bufferQuals_size,_bufferQuals_idx,_sequence->getIndex()  );
+		_bufferQuals_size = _bufferQuals_size * 2;
+		_bufferQuals = (char *) realloc(_bufferQuals,_bufferQuals_size * sizeof(char) );
+	}
+	
+	strcpy(_bufferQuals + _bufferQuals_idx, _qualseq);
+
+	_bufferQuals_idx += _readSize+1 ; // with last '\n'
+
+	//fprintf(_leon->_testQual,"%s",_qualseq); //st_qualseq.c_str()
+
+}
+
+
+
+bool DnaEncoder::apply_smoothing_at_pos(int pos)
+{
+	if(char2phred(_qualseq[pos])==0 || char2phred(_qualseq[pos])==2 )
+		return false;
+	
+	bool ok_to_smooth= true;
+	
+	int diff = ('@' -  _qualseq[pos]);
+	if(  diff > 10   )
+	{
+		if(_nb_solids[pos]>(diff-5))
+			ok_to_smooth =true;
+		else
+			ok_to_smooth = false;
+	}
+	
+	if(ok_to_smooth)
+	{
+		_qualseq[pos] = '@'; //smooth qual
+		return true;
+	}
+	else return false;
+	
+}
+
+
+
+void DnaEncoder::storeSolidCoverageInfo()
+{
+	kmer_type kmer, kmerMin;
+	
+	if(_readSize >= _max_read_size)
+	{
+		_max_read_size = _readSize + 1000;
+		_nb_solids = (int *) realloc(_nb_solids,_max_read_size * sizeof(int) );
+		_qualseq = (char *) realloc(_qualseq,_max_read_size*sizeof(char ));
+
+	}
+	memset(_nb_solids,0,_max_read_size * sizeof(int) );
+
+	for(unsigned int ii=0; ii<_kmers.size(); ii++){
+		kmer = _kmers[ii];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+		if(_bloom->contains(kmerMin))
+		{
+			//increments all pos covered by the solid kmer
+			for (unsigned int jj=0; jj< _kmerSize ; jj++)
+			{
+				_nb_solids[ii+jj] ++ ;
+			}
+		}
+	}
+}
+
+
+void DnaEncoder::buildKmers(){
+
+	
+	
+	for(unsigned int i=0; i<_readSize; i++){
+		if(_readseq[i] == 'N'){
+			_Npos.push_back(i);
+			_readseq[i] = 'A';
+		}
+	}
+	_itKmer.setData(_sequence->getData());
+	
+	_kmers.clear();
+	for (_itKmer.first(); !_itKmer.isDone(); _itKmer.next()){
+		//cout << (*_itKmer).toString(_kmerSize) << endl;
+		_kmers.push_back(_itKmer->value());
+	}
+	
+
+#ifdef PRINT_DISTRIB
+	unordered_set<u_int64_t> H;
+	for(kmer_type kmer : _kmers){
+		kmer_type kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+		H.insert(kmerMin.getVal());
+	}
+
+	for(int i=0; i<_sequences.size(); i++){
+		Sequence* sequence = _sequences[i];
+
+		_itKmer.setData(sequence->getData());
+		for (_itKmer.first(); !_itKmer.isDone(); _itKmer.next()){
+			kmer_type kmerMin2 = min(_itKmer->value(), revcomp(_itKmer->value(), _kmerSize));
+			if(H.find(kmerMin2.getVal()) != H.end()){
+				_distrib[i] += 1;
+				return;
+			}
+		}
+	}
+
+	_outDistrib += 1;
+#endif
+
+}
+
+int DnaEncoder::findExistingAnchor(u_int32_t* anchorAddress){
+
+	kmer_type kmer, kmerMin;
+
+	
+	for(unsigned int i=0; i<_kmers.size(); i++){
+		kmer = _kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+		if(_leon->anchorExist(kmerMin, anchorAddress)){
+			return i;
+		}
+	}
+	return -1;
+}
+
+bool DnaEncoder::isReadAnchorable(){
+	int nbKmerSolid = 0;
+	kmer_type kmer, kmerMin;
+
+	for(unsigned int i=0; i<_kmers.size(); i++){
+
+		kmer = _kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+		if(_bloom->contains(kmerMin)){
+			nbKmerSolid += 1;
+			i += _kmerSize;
+		}
+
+		if(nbKmerSolid >= 2) return true;
+	}
+
+	return nbKmerSolid >= 2;
+
+}
+
+void DnaEncoder::encodeAnchorRead(int anchorPos, u_int32_t anchorAddress){
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\t\tEncode anchor read" << endl;
+	#endif
+	//printf("encode  anchor read \n");
+
+	//encode read type (0: read with anchor, 1: read without anchor)
+	#ifdef LEON_PRINT_STAT
+		_rangeEncoder6.encode(_readTypeModel, 0);
+	#endif
+	_rangeEncoder.encode(_readTypeModel, 0);
+	
+	//u_int64_t deltaValue;
+	//u_int8_t deltaType;
+	
+	//Encode read size
+	//deltaType = CompressionUtils::getDeltaValue(_readSize, _prevReadSize, &deltaValue);
+	#ifdef LEON_PRINT_STAT
+		//_rangeEncoder1.encode(_readSizeDeltaTypeModel, deltaType);
+		CompressionUtils::encodeNumeric(_rangeEncoder1, _readSizeValueModel, _readSize);
+	#endif
+	//_rangeEncoder.encode(_readSizeDeltaTypeModel, deltaType);
+	CompressionUtils::encodeNumeric(_rangeEncoder, _readSizeValueModel, _readSize);
+	//_prevReadSize = _readSize;
+	//printf("read size %i  deltaValue %i\n",_readSize,deltaValue);
+
+	//Encode anchor pos
+	//deltaType = CompressionUtils::getDeltaValue(anchorPos, _prevAnchorPos, &deltaValue);
+	#ifdef LEON_PRINT_STAT
+		//_rangeEncoder2.encode(_anchorPosDeltaTypeModel, deltaType);
+		CompressionUtils::encodeNumeric(_rangeEncoder2, _anchorPosModel, anchorPos);
+	#endif
+	//_rangeEncoder.encode(_anchorPosDeltaTypeModel, deltaType);
+	CompressionUtils::encodeNumeric(_rangeEncoder, _anchorPosModel, anchorPos);
+	//_prevAnchorPos = anchorPos;
+	//printf("anchor pos %i \n",anchorPos);
+
+	//Encode anchor address
+	//deltaType = CompressionUtils::getDeltaValue(anchorAddress, _prevAnchorAddress, &deltaValue);
+	#ifdef LEON_PRINT_STAT
+		//_rangeEncoder3.encode(_anchorAddressDeltaTypeModel, deltaType);
+		CompressionUtils::encodeNumeric(_rangeEncoder3, _anchorAddressModel, anchorAddress);
+	#endif
+	//_rangeEncoder.encode(_anchorAddressDeltaTypeModel, deltaType);
+	//if(_isPrevReadAnchorable){
+		//	_rangeEncoder.encode(_isPrevReadAnchorableModel, 0);
+		//	CompressionUtils::encodeNumeric(_rangeEncoder, _isPrevReadAnchorablePosModel, _isPrevReadAnchorablePos);
+		//}
+		//else{
+		//_rangeEncoder.encode(_isPrevReadAnchorableModel, 1);
+	CompressionUtils::encodeNumeric(_rangeEncoder, _anchorAddressModel, anchorAddress);
+		//CompressionUtils::encodeNumeric(_rangeEncoder, _isPrevReadAnchorablePosModel, _isPrevReadAnchorablePos);
+		//}
+	//_prevAnchorAddress = anchorAddress;
+	//printf("anchor adress %i \n",anchorAddress);
+
+	
+	kmer_type anchor = _kmers[anchorPos];
+	
+	//Encode a bit that says if the anchor is normal or revcomp
+	if(anchor == min(anchor, revcomp(anchor, _kmerSize))){
+		#ifdef LEON_PRINT_STAT
+			_rangeEncoder6.encode(_readAnchorRevcompModel, 0);
+		#endif
+		_rangeEncoder.encode(_readAnchorRevcompModel, 0);
+	}
+	else{
+		#ifdef LEON_PRINT_STAT
+			_rangeEncoder6.encode(_readAnchorRevcompModel, 1);
+		#endif
+		_rangeEncoder.encode(_readAnchorRevcompModel, 1);
+	}
+
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\t\t\tAnchor pos: " << anchorPos << endl;
+		cout << "\t\t\tAnchor: " << _kmers[anchorPos].toString(_kmerSize) << endl;
+	#endif
+
+	_bifurcations.clear();
+	_binaryBifurcations.clear();
+	_bifurcationTypes.clear();
+	_leftErrorPos.clear();
+	//_rightErrorPos.clear();
+
+	
+	kmer_type kmer = anchor;
+	for(int i=anchorPos-1; i>=0; i--){
+		kmer = buildBifurcationList(i, kmer, false);
+		//i = buildBifurcationList(i, false);
+		//cout << kmer.toString(_kmerSize) << endl;
+	}
+
+	kmer = anchor;
+	for(unsigned int i=anchorPos+_kmerSize; i<_readSize; i++){
+		//cout << "Pos: " << i << endl;
+		kmer = buildBifurcationList(i, kmer, true);
+		//i = buildBifurcationList(i, true);
+	//for(int i=anchorPos; i<_kmers.size()-1; i++)
+		//cout << kmer.toString(_kmerSize) << endl;
+	}
+		
+
+	//Encode N positions
+	_prevNpos = 0;
+	#ifdef LEON_PRINT_STAT
+		CompressionUtils::encodeNumeric(_rangeEncoder6, _numericModel, _Npos.size());
+	#endif
+	CompressionUtils::encodeNumeric(_rangeEncoder, _numericModel, _Npos.size());
+	for(unsigned int i=0; i<_Npos.size(); i++){
+		//deltaType = CompressionUtils::getDeltaValue(_Npos[i], _prevNpos, &deltaValue);
+		//_rangeEncoder.encode(_NposDeltaTypeModel, deltaType);
+		#ifdef LEON_PRINT_STAT
+			CompressionUtils::encodeNumeric(_rangeEncoder6, _NposModel, _Npos[i]-_prevNpos);
+		#endif
+		CompressionUtils::encodeNumeric(_rangeEncoder, _NposModel, _Npos[i]-_prevNpos);
+		_prevNpos = _Npos[i];
+	}
+	
+	#ifdef LEON_PRINT_STAT
+		CompressionUtils::encodeNumeric(_rangeEncoder6, _leftErrorModel, _leftErrorPos.size());
+	#endif
+	CompressionUtils::encodeNumeric(_rangeEncoder, _leftErrorModel, _leftErrorPos.size());
+	sort(_leftErrorPos.begin(), _leftErrorPos.end());
+	_prevErrorPos = 0;
+	for(unsigned int i=0; i<_leftErrorPos.size(); i++){
+		#ifdef LEON_PRINT_STAT
+			CompressionUtils::encodeNumeric(_rangeEncoder6, _leftErrorPosModel, _leftErrorPos[i]-_prevErrorPos);
+		#endif
+		CompressionUtils::encodeNumeric(_rangeEncoder, _leftErrorPosModel, _leftErrorPos[i]-_prevErrorPos);
+		_prevErrorPos = _leftErrorPos[i];
+	}
+
+	
+	u_int64_t bifType0 = 0;
+	u_int64_t bifType1 = 0;
+	//cout << _bifurcationTypes.size() << " " << _bifurcations.size() << " " << _binaryBifurcations.size() << endl;
+	for(unsigned int i=0; i<_bifurcationTypes.size(); i++){
+		u_int8_t type = _bifurcationTypes[i];
+		if(type == 0){
+			#ifdef LEON_PRINT_STAT
+				_rangeEncoder4.encode(_bifurcationModel, _bifurcations[bifType0]);
+			#endif
+			//cout << Leon::nt2bin(_bifurcations[i]) << " ";
+			_rangeEncoder.encode(_bifurcationModel, _bifurcations[bifType0]);
+			bifType0 += 1;
+		}
+		else{
+			#ifdef LEON_PRINT_STAT
+				_rangeEncoder4.encode(_bifurcationBinaryModel, _binaryBifurcations[bifType1]);
+			#endif
+			//cout << Leon::nt2bin(_bifurcations[i]) << " ";
+			_rangeEncoder.encode(_bifurcationBinaryModel, _binaryBifurcations[bifType1]);
+			bifType1 += 1;
+		}
+	}
+
+	
+	
+}
+	
+kmer_type DnaEncoder::buildBifurcationList(int pos, kmer_type kmer, bool rightExtend){
+		
+	char nextNt = _readseq[pos];
+	int nextNtBin = Leon::nt2bin(nextNt);
+
+	if(std::find(_Npos.begin(), _Npos.end(), pos) != _Npos.end()){
+		codeSeedNT(&_kmerModel, &kmer, nextNt, rightExtend);
+		return kmer;
+		//return pos;
+	}
+	
+	//kmer_type kmerMin;
+	kmer_type uniqKmer;
+	bool firstSolidKmer = false;
+	//int uniqNt;
+	//u_int8_t binNt2;
+	bool isKmerSolid = false;
+	
+	int indexedKmerCount = 0;
+	
+	
+	
+	
+	std::bitset<4> res4  = _bloom->contains4(kmer,rightExtend);
+	for(int nt=0; nt<4; nt++){
+		
+		//mutatedKmer.printASCII(_kmerSize);
+		
+		if(res4[nt]){
+
+			indexedKmerCount += 1;
+
+			if(!firstSolidKmer){
+				firstSolidKmer = true;
+				uniqKmer = kmer;
+				codeSeedBin(&_kmerModel, &uniqKmer, nt, rightExtend);
+			}
+			/*
+			
+			//uniqNt = nt;
+			uniqKmer = mutatedKmer;
+			*/
+			
+			if(nt == nextNtBin){
+				isKmerSolid = true;
+			}
+		}
+		
+	}
+	
+	
+	_MCtotal +=1;
+	
+
+	if(isKmerSolid){
+
+		if(indexedKmerCount == 1){
+			_MCuniqSolid += 1;
+			return uniqKmer;
+		}
+		else if(indexedKmerCount == 2){
+
+			char nt1 = -1;
+			char nt2 = -1;
+
+			for(int nt=0; nt<4; nt++){
+				if(res4[nt]){
+					//cout << "\t" << nt << endl;
+					if(nt1 == -1)
+						nt1 = nt;
+					else if(nt2 == -1)
+						nt2 = nt;
+					else break;
+				}
+			}
+
+
+			if(nt1 == nextNtBin){
+				//cout << "\t0" << endl;
+				_binaryBifurcations.push_back(0);
+				_bifurcationTypes.push_back(1);
+				_MCmultipleSolid += 1;
+			}
+			else if(nt2 == nextNtBin){
+				//cout << "\t1" << endl;
+				_binaryBifurcations.push_back(1);
+				_bifurcationTypes.push_back(1);
+				_MCmultipleSolid += 1;
+			}
+			else{
+
+				//if(_sequence->getIndex() < 20)
+				//	cout << "\tallo" << endl;
+				//_MCuniqNoSolid += 1;
+				//nextNt = Leon::bin2nt(nt1);
+				//_bifurcations.push_back(nextNtBin);
+				//_errorPos.push_back(pos);
+				//_bifurcationTypes.push_back(0);
+				//return uniqKmer;
+
+				/*
+				_MCuniqNoSolid += 1;
+				//nextNt = Leon::bin2nt(nt1);
+
+				_bifurcationTypes.push_back(0);
+				_bifurcations.push_back(nextNtBin);
+				_errorPos.push_back(pos);
+
+				nextNtBin = getBestPath(pos, kmer, res4, rightExtend);
+				//cout << (int)nextNtBin << endl;
+				if(nextNtBin == -1){
+					nextNtBin = nt1;
+				}
+				nextNt = Leon::bin2nt(nextNtBin);
+				_bifurcations.push_back(nextNtBin);
+				_bifurcationTypes.push_back(0);*/
+
+			}
+			//cout << "PROBLEME IN BUILD BINARY BIFURCATION (DnaEncoder - buildBifurcationList)" << endl;
+
+			//if(_sequence->getIndex() < 10)
+			//	cout << (char) Leon::bin2nt(nextNtBin) << endl;;
+
+			codeSeedNT(&_kmerModel, &kmer, nextNt, rightExtend);
+			return kmer;
+
+
+
+		}
+		else{
+
+			_bifurcations.push_back(nextNtBin);
+			_bifurcationTypes.push_back(0);
+			codeSeedNT(&_kmerModel, &kmer, nextNt, rightExtend);
+			return kmer;
+		}
+
+	}
+	else{
+
+
+		if(indexedKmerCount == 0){
+			//cout << "PAF_BREAK    " << pos << endl;
+			_MCnoAternative += 1;
+		}
+		else if(indexedKmerCount == 1){
+			//cout << "PAF_UNIQ    " << pos << endl;
+			_MCuniqNoSolid += 1;
+
+			//_leon->_readWithAnchorMutationChoicesSize += 0.25;
+
+			_bifurcations.push_back(nextNtBin);
+			_bifurcationTypes.push_back(0);
+			addErrorPos(pos, rightExtend);
+			//_errorPos.push_back(pos);
+			return uniqKmer;
+		}
+		else if(indexedKmerCount == 2){
+			//cout << "PAF_MULTIPLE    " << pos << endl;
+			_MCuniqNoSolid += 1;
+
+		
+			//encode error
+			_bifurcations.push_back(nextNtBin);
+			_bifurcationTypes.push_back(0);
+			addErrorPos(pos, rightExtend);
+
+			//get the first path in bufurcation
+			for(int nt=0; nt<4; nt++){
+				if(res4[nt]){
+					nextNtBin = nt;
+					nextNt = Leon::bin2nt(nt);
+					break;
+				}
+			}
+
+			codeSeedNT(&_kmerModel, &kmer, nextNt, rightExtend);
+			return kmer;
+			//return uniqKmer;
+			//_bifurcationTypes.push_back(0);
+
+			/*_bifurcations.push_back(nextNtBin);
+			_bifurcationTypes.push_back(0);
+
+			return uniqKmer;*/
+		}
+		else{
+			_MCuniqNoSolid += 1;
+			//cout << "PAF_MULTIPLE    " << pos << endl;
+			/*
+			_errorPos.push_back(pos);
+			_bifurcations.push_back(nextNtBin);
+			_bifurcationTypes.push_back(0);
+			_errorPos.push_back(pos);
+			return uniqKmer;*/
+
+		}
+
+		
+
+		//_leon->_readWithAnchorMutationChoicesSize += 0.25;
+		_bifurcations.push_back(nextNtBin);
+		_bifurcationTypes.push_back(0);
+		codeSeedNT(&_kmerModel, &kmer, nextNt, rightExtend);
+		return kmer;
+
+	}
+
+
+	
+}
+
+
+int DnaEncoder::getBestPath(int pos, kmer_type& kmer, bitset<4>& initRes4, bool rightExtend){
+
+
+	char ntInRead = 0;
+	if(rightExtend){
+		if((unsigned)(pos+1) < _readSize){
+			ntInRead = _readseq[pos+1];
+		}
+	}
+	else{
+		if(pos-1 >= 0){
+			ntInRead = _readseq[pos-1];
+		}
+	}
+
+	int ntInReadBin = Leon::nt2bin(ntInRead);
+
+	//int depth = 2;
+	int bestNt = -1;
+	bool isValid[4];
+	for(int i=0; i<4; i++){
+		isValid[i] = true;
+	}
+
+	//for(int j=0; j<depth; j++){
+
+	for(int nt=0; nt<4; nt++){
+
+		if(initRes4[nt]){
+
+			kmer_type mutatedKmer = kmer;
+			codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+
+			bitset<4> res4  = _bloom->contains4(mutatedKmer, rightExtend);
+			int nbSolidKmer = 0;
+
+			for(int nt2=0; nt2<4; nt2++){
+
+				if(res4[nt2]){
+					nbSolidKmer += 1;
+
+					if(nt2 == ntInReadBin){
+						bestNt = nt;
+					}
+				}
+
+			}
+
+			if(nbSolidKmer != 1){
+				isValid[nt] = false;
+			}
+		}
+		else{
+			isValid[nt] = false;
+		}
+	}
+
+	//}
+
+	int nbAlternative = 0;
+	int uniqAlternative = -1;
+
+	for(int nt=0; nt<4; nt++){
+		if(isValid[nt]){
+			nbAlternative += 1;
+			uniqAlternative = nt;
+		}
+	}
+
+	if(nbAlternative == 1){
+		return uniqAlternative;
+	}
+
+	return bestNt;
+}
+
+int DnaEncoder::voteMutations(int pos, int depth, bool rightExtend){
+	//kmer_type kmer;
+	//int maxScore = 0;
+	//int votes[4];
+	
+	int bestNt = 0;
+	//bool isValid[4];
+	
+	//kmer_type mutatedKmers[4];
+	//vector<int> mutations;
+	//bool isMutateChoice[4];
+	//kmer = _kmers[pos];
+	/*
+	for(int nt=0; nt<4; nt++){
+		
+		kmer_type mutatedKmer = kmer;
+		codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+		kmer_type mutatedKmerMin = min(mutatedKmer, revcomp(mutatedKmer, _kmerSize));
+		
+		//mutated_kmer.printASCII(_kmerSize);
+		
+		if(_bloom->contains(mutatedKmerMin)){
+			mutations.push_back(nt);
+			mutatedKmers[nt] = mutatedKmer;
+			votes[nt] = 0;
+			//isMutateChoice[nt] = true;
+		}
+	}
+	*/
+	//kmer_type currentKmer;
+	//cout << _readseq << endl;
+	//cout << pos << ": " << kmer.toString(_kmerSize) << endl;
+	
+	/*
+	for(int nt=0; nt<4; nt++){
+
+		//mutatedKmer.printASCII(_kmerSize);
+
+		if(res4[nt]){
+
+			kmer_type mutatedKmer = kmer;
+			codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+
+			indexedKmerCount += 1;
+			uniqNt = nt;
+			uniqKmer = mutatedKmer;
+
+
+			if(Leon::bin2nt(nt) == nextNt){
+				isKmerSolid = true;
+			}
+		}
+
+	}
+
+
+	//for(int nt=0; nt<4; nt++){
+		
+		kmer_type mutatedKmer = kmer;
+		codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+		kmer_type mutatedKmerMin = min(mutatedKmer, revcomp(mutatedKmer, _kmerSize));
+		
+	for(int j=0; j<depth; j++){
+		//char nextNt;
+		//int kmerPos;
+		if(rightExtend){
+			if(pos+1+_kmerSize+j >= _readSize) break;
+			nextNt = _readseq[pos+1+_kmerSize+j];
+		}
+		else{
+			if(pos-2-j < 0) break;
+			nextNt = _readseq[pos-2-j];
+		}
+
+		std::bitset<4> res4  = _bloom->contains4(kmer,rightExtend);
+
+		for(int nt=0; nt<4; nt++){
+
+			if(res4[nt]){
+
+			}
+		}
+
+		//cout << j << ": " << nextNt << endl;
+		codeSeedNT(&_kmerModel, &mutatedKmer, nextNt, rightExtend);
+		kmer_type mutatedKmerMin = min(mutatedKmer, revcomp(mutatedKmer, _kmerSize));
+
+		if(_bloom->contains(mutatedKmerMin)){
+			votes[nt] += 1;
+			if(votes[nt] > maxScore){
+				maxScore = votes[nt];
+				bestNt = nt;
+			}
+		}
+	}
+	//}
+	
+	
+	if(maxScore == 0){
+		//cout << "No best NT" << endl;
+		bestNt = -1;
+	}
+	//else
+		//cout << "Best nt: " << bin2NT[bestNt] << endl;
+	*/
+	return bestNt;
+	
+	
+}
+
+void DnaEncoder::encodeNoAnchorRead(){
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\t\tEncode no anchor read" << endl;
+	#endif
+
+	//printf("encode no anchor read \n");
+	//Reinsert N because they can be encoded by the coder
+	for(unsigned int i=0; i<_Npos.size(); i++){
+		_readseq[_Npos[i]] = 'N';
+	}
+	
+	#ifdef LEON_PRINT_STAT
+		_rangeEncoder6.encode(_readTypeModel, 1);
+	#endif
+	_rangeEncoder.encode(_readTypeModel, 1);
+	
+	//_leon->_readWithoutAnchorSize += _readSize*0.375;
+	_readWithoutAnchorCount +=1;
+	
+	/*
+	for(int i=0; i<_readSize; i++){
+		if(_readseq[i] == 'N'){
+			_leon->_noAnchor_with_N_kmer_count += 1;
+			break;
+		}
+	}
+	
+	bool full_N = true;
+	for(int i=0; i<_readSize; i++){
+		if(_readseq[i] != 'N'){
+			full_N = false;
+			break;
+		}
+	}
+	if(full_N){
+		_leon->_noAnchor_full_N_kmer_count += 1;
+	}*/
+	
+	#ifdef LEON_PRINT_STAT
+		CompressionUtils::encodeNumeric(_rangeEncoder5, _noAnchorReadSizeValueModel, _readSize);
+	#endif
+	CompressionUtils::encodeNumeric(_rangeEncoder, _noAnchorReadSizeValueModel, _readSize);
+	
+			
+	for(unsigned int i=0; i<_readSize; i++){
+		
+		#ifdef LEON_PRINT_STAT
+			_rangeEncoder5.encode(_noAnchorReadModel, Leon::nt2bin(_readseq[i]));
+		#endif
+		_rangeEncoder.encode(_noAnchorReadModel, Leon::nt2bin(_readseq[i]));
+		
+	}
+	
+}
+
+
+
+
+QualDecoder::QualDecoder(Leon* leon, const string& inputFilename,tools::storage::impl::Group *  group)
+//QualDecoder::QualDecoder(Leon* leon, const string& inputFilename)
+{
+	_group = group;
+	_inputStream =0;
+	_finished = false;
+	_leon = leon;
+	_inbuffer = NULL;
+}
+
+
+QualDecoder::~QualDecoder(){
+
+	free(_inbuffer);
+	if(_inputStream !=0) delete _inputStream;
+
+}
+
+
+
+void QualDecoder::setup( int blockID){
+	
+	_processedSequenceCount = 0;
+	
+	if(_inputStream !=0) delete _inputStream;
+	
+	std::string datasetname = Stringify::format ("qual_%i",blockID);
+
+	_inputStream = new tools::storage::impl::Storage::istream  (*_group, datasetname);
+
+	
+	auto _tempcollec = & _group->getCollection<math::NativeInt8> (datasetname);
+	std::string dsize = _tempcollec->getProperty ("size");
+	
+	_blockSize =  std::stoi(dsize); // blockSize;
+	
+	_inbuffer = (char * ) realloc(_inbuffer, _blockSize* sizeof(char));
+	
+}
+
+
+
+void QualDecoder::setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount){
+	
+	_processedSequenceCount = 0;
+
+	
+	_inputStream->seekg(blockStartPos, _inputStream->beg);
+	
+	_blockStartPos = blockStartPos;
+	_blockSize = blockSize;
+
+	
+
+
+	
+	
+	
+	_inbuffer = (char * ) realloc(_inbuffer, blockSize* sizeof(char));
+	
+	_sequenceCount = sequenceCount;
+}
+
+
+
+void QualDecoder::execute(){
+	
+
+//	printf("execute qual decoder _blockStartPos %llu  _blockSize %llu \n",_blockStartPos,_blockSize);
+
+	_inputStream->read(_inbuffer,_blockSize );
+	
+	if(!_inputStream->good()) printf("inputstream E bad \n");
+
+	//_inputFile->read(_inbuffer,_blockSize );
+	
+	//printf("----Begin decomp of Block     ----\n");
+
+	z_stream zs;
+	memset(&zs, 0, sizeof(zs));
+	
+	//deflateinit2 to be able to gunzip it fro mterminal
+	
+	//if (inflateInit2(&zs, (15+32)) != Z_OK)
+	if (inflateInit (&zs) != Z_OK)
+		throw    Exception ("inflate Init failed while decompressing.");
+	
+	zs.next_in = (Bytef*) _inbuffer ;
+	zs.avail_in = _blockSize ;    // set the z_stream's input
+	
+	int ret;
+	char outbuffer[32768];
+	
+	// retrieve the compressed bytes blockwise
+	do {
+		zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
+		zs.avail_out = sizeof(outbuffer);
+		
+		ret = inflate (&zs, Z_SYNC_FLUSH); //ou Z_FINISH ? Z_SYNC_FLUSH
+		
+		if (_buffer.size() < zs.total_out) {
+			// append the block to the output string
+			_buffer.append(outbuffer,
+							 zs.total_out - _buffer.size());
+		}
+		if (ret != Z_OK)
+		{
+			//printf("ret val %i  _blockStartPos %llu \n",ret,_blockStartPos);
+			break;
+		}
+		else
+		{
+			//printf("-----block ret ok  _blockStartPos %llu  ----\n",_blockStartPos);
+		}
+	} while (ret == Z_OK);
+	
+	inflateEnd(&zs);
+
+	_finished = true;
+	
+	//printf("Should be done decompressing block, in size   %llu   out size    %lu  \n",_blockSize,_buffer.size() );
+
+}
+
+
+//====================================================================================
+// ** DnaDecoder
+//====================================================================================
+DnaDecoder::DnaDecoder(Leon* leon, const string& inputFilename,tools::storage::impl::Group *  group) :
+AbstractDnaCoder(leon)
+{
+	_group = group;
+	_inputStream =0;
+	
+	//_inputFile = new ifstream(inputFilename.c_str(), ios::in|ios::binary);
+	_finished = false;
+	
+	//_anchorDictFile = new ifstream(_leon->_anchorDictFilename.c_str(), ios::in);
+	
+}
+
+DnaDecoder::~DnaDecoder(){
+	//delete _rangeDecoder;
+	//delete _outputFile;
+//	delete _inputFile;
+//	delete _anchorDictFile;
+	
+	if(_inputStream !=0) delete _inputStream;
+
+}
+
+void DnaDecoder::setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount,int blockID){
+	startBlock();
+	_rangeDecoder.clear();
+	
+	//_inputFile->seekg(blockStartPos, _inputFile->beg);
+	//_rangeDecoder.setInputFile(_inputFile);
+	
+	if(_inputStream !=0) delete _inputStream;
+	std::string datasetname = Stringify::format ("dna_%i",blockID);
+	
+	_inputStream = new tools::storage::impl::Storage::istream  (*_group, datasetname);
+	
+	auto _tempcollec = & _group->getCollection<math::NativeInt8> (datasetname);
+	std::string dsize = _tempcollec->getProperty ("size");
+	
+	_blockSize =  std::stoi(dsize); // blockSize;
+	_rangeDecoder.setInputFile(_inputStream);
+
+	
+	
+	_blockStartPos = blockStartPos;
+	_blockSize = blockSize;
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t-----------------------" << endl;
+		cout << "\tDecoding Dna block " << _blockStartPos << " - " << _blockStartPos+_blockSize << endl;
+	#else
+		;//_leon->_progress_decode->inc(1);
+	#endif
+	
+	_sequenceCount = sequenceCount;
+}
+
+void DnaDecoder::execute(){
+	
+	//decodeFirstHeader();
+		
+	while(_processedSequenceCount < _sequenceCount){
+		
+		//cout << "lala" << endl;
+	//int i=0;
+	//while(i < Leon::READ_PER_BLOCK){
+	//while(_inputFile->tellg() <= _blockStartPos+_blockSize){
+		//if(_leon->_readCount > 1) return;
+	
+	
+		u_int8_t readType = _rangeDecoder.nextByte(_readTypeModel);
+		//cout << "Read type: " << (int)readType << endl;
+
+		if(readType == 0)
+			decodeAnchorRead(); //ici
+		else if(readType == 1)
+			decodeNoAnchorRead();
+			
+		endRead();
+		//cout << _inputFile->tellg() << " " << _blockStartPos+_blockSize << endl;
+		/*
+		string trueSeq = string((*_leon->_testBankIt)->getDataBuffer());
+		trueSeq = trueSeq.substr(0, _readSize);
+		//cout << trueSeq << endl;
+		//cout << _currentSeq << endl;
+		if(trueSeq != _currentSeq){
+			cout << (*_leon->_testBankIt)->getIndex() << "\t\tseq different !!" << endl;
+			cout << "\t\t" << trueSeq << endl;
+			cout << "\t\t" << _currentSeq << endl;
+			_leon->_readCount += 1;
+			return;
+		}
+		_leon->_testBankIt->next();
+		*/
+		#ifdef PRINT_DEBUG_DECODER
+			_readCount += 1;
+			cout << _leon->_readCount << ": " << _currentSeq << endl;
+		#endif
+		
+		//i++;
+		//_leon->_readCount += 1;
+		//if(i == 1) return;
+		//_currentSeq.clear();
+		
+		//cout << (int)(_inputFile->tellg() < _blockStartPos+_blockSize) << endl;
+		
+	}
+	
+	//cout << "endooo" << endl;
+	_finished = true;
+	
+}
+
+void DnaDecoder::decodeAnchorRead(){
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecode anchor read" << endl;
+	#endif
+
+	//u_int8_t deltaType;
+	//u_int64_t deltaValue;
+	
+	//printf("Decode anchor read \n");
+
+	//Decode read size
+	//deltaType = _rangeDecoder.nextByte(_readSizeDeltaTypeModel);
+	//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _readSizeValueModel);
+//	printf("read deltaValue %llu \n",deltaValue);
+	//_readSize = CompressionUtils::getValueFromDelta(deltaType, _prevReadSize, deltaValue);
+	//_prevReadSize = _readSize;
+	_readSize = CompressionUtils::decodeNumeric(_rangeDecoder, _readSizeValueModel);
+	
+//	printf("read size %i \n",_readSize);
+	
+	//Decode anchor pos
+	//deltaType = _rangeDecoder.nextByte(_anchorPosDeltaTypeModel);
+	//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _anchorPosModel);
+	//int anchorPos = CompressionUtils::getValueFromDelta(deltaType, _prevAnchorPos, deltaValue);
+	//_prevAnchorPos = anchorPos;
+//	printf("anchor pos %i \n",anchorPos);
+	int anchorPos = CompressionUtils::decodeNumeric(_rangeDecoder, _anchorPosModel);
+
+	
+	//Decode anchor address
+	//deltaType = _rangeDecoder.nextByte(_anchorAddressDeltaTypeModel);
+	//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _anchorAddressModel);
+	//u_int64_t anchorAddress = CompressionUtils::getValueFromDelta(deltaType, _prevAnchorAddress, deltaValue);
+	//_prevAnchorAddress = anchorAddress;
+	u_int64_t anchorAddress = CompressionUtils::decodeNumeric(_rangeDecoder, _anchorAddressModel);
+	
+	kmer_type anchor = _leon->getAnchor(_anchorDictFile, anchorAddress); //laa
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\t\tRead size: " << _readSize << endl;
+		cout << "\t\t\tAnchor pos: " << anchorPos << endl;
+		cout << "\t\t\tAnchor adress: " << anchorAddress << endl;
+		cout << "\t\t\tAnchor: " << anchor.toString(_kmerSize) << endl;
+	#endif
+	
+	//Decode the bit that says if the anchor is revcomp or not
+	if(_rangeDecoder.nextByte(_readAnchorRevcompModel) == 1)
+		anchor = revcomp(anchor, _kmerSize);
+		
+	_currentSeq = anchor.toString(_kmerSize);	
+	_leftErrorPos.clear();
+	//_rightErrorPos.clear();
+	_Npos.clear();
+	
+	//cout << _readSize << " " << anchorPos << " " << anchorAddress << endl;
+	//Decode N pos
+	_prevNpos = 0;
+	u_int64_t NposCount = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+	for(unsigned int i=0; i<NposCount; i++){
+		//deltaType = _rangeDecoder.nextByte(_NposDeltaTypeModel);
+		//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _NposModel);
+		//u_int64_t nPos = CompressionUtils::getValueFromDelta(deltaType, _prevNpos, deltaValue);
+		u_int64_t nPos = CompressionUtils::decodeNumeric(_rangeDecoder, _NposModel) + _prevNpos;
+		_Npos.push_back(nPos);
+		//cout << nPos << endl;
+		_prevNpos = nPos;
+		//_Npos.push_back(CompressionUtils::decodeNumeric(_rangeDecoder, _anchorPosSizeModel, _anchorPosModel));
+	}
+	
+	//Decode error pos
+	u_int64_t nbLeftError = CompressionUtils::decodeNumeric(_rangeDecoder, _leftErrorModel);
+	_prevErrorPos = 0;
+	for(unsigned int i=0; i<nbLeftError; i++){
+		u_int64_t errorPos = CompressionUtils::decodeNumeric(_rangeDecoder, _leftErrorPosModel) + _prevErrorPos;
+		addErrorPos(errorPos, true);
+		_prevErrorPos = errorPos;
+	}
+
+	/*
+	u_int64_t nbRightError = CompressionUtils::decodeNumeric(_rangeDecoder, _rightErrorModel);
+	_prevErrorPos = anchorPos-1;
+	for(int i=0; i<nbLeftError; i++){
+		int deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _leftErrorPosModel);
+		int errorPos = _prevErrorPos-deltaValue;
+		//deltaType = _rangeDecoder.nextByte(_errorPosDeltaTypeModel);
+		//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _errorPosModel); //reprise
+		//u_int64_t errorPos = CompressionUtils::getValueFromDelta(deltaType, _prevErrorPos, deltaValue);
+		addErrorPos(errorPos, false);
+		//_errorPos.push_back(errorPos);
+		_prevErrorPos = errorPos;
+		//_errorPos.push_back(CompressionUtils::decodeNumeric(_rangeDecoder, _anchorPosSizeModel, _anchorPosModel));
+	}
+	_prevErrorPos = anchorPos+_kmerSize;
+	for(int i=0; i<nbRightError; i++){
+		int deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _rightErrorPosModel);
+		int errorPos = _prevErrorPos+deltaValue;
+		//deltaType = _rangeDecoder.nextByte(_errorPosDeltaTypeModel);
+		//deltaValue = CompressionUtils::decodeNumeric(_rangeDecoder, _errorPosModel); //reprise
+		//u_int64_t errorPos = CompressionUtils::getValueFromDelta(deltaType, _prevErrorPos, deltaValue);
+		addErrorPos(errorPos, true);
+		//_errorPos.push_back(errorPos);
+		_prevErrorPos = errorPos;
+		//_errorPos.push_back(CompressionUtils::decodeNumeric(_rangeDecoder, _anchorPosSizeModel, _anchorPosModel));
+	}*/
+
+	
+	//Extend anchor to the left
+	kmer_type kmer = anchor;
+	for(int i=anchorPos-1; i>=0; i--){
+		kmer = extendAnchor(kmer, i, false);
+	}
+	
+	//Extend anchor to the right
+	kmer = anchor;
+	for(unsigned int i=anchorPos+_kmerSize; i<_readSize; i++){
+		kmer = extendAnchor(kmer, i, true);
+		//cout << "\t" << kmer.toString(_kmerSize) << endl;
+	}
+	
+	//Inject N in the decoded read sequence
+	//printf("npos s %i currseq %s \n",_Npos.size(),_currentSeq.c_str());
+	for(unsigned int i=0; i<_Npos.size(); i++){
+		_currentSeq[_Npos[i]] = 'N';
+	}
+}
+
+kmer_type DnaDecoder::extendAnchor(kmer_type kmer, int pos, bool rightExtend){
+	
+	u_int8_t nextNt;
+	//int nextNtBin;
+	kmer_type resultKmer;
+		
+	if(std::find(_Npos.begin(), _Npos.end(), pos) != _Npos.end()){
+		nextNt = 'A';
+		if(rightExtend){
+			_currentSeq += nextNt;
+		}
+		else{
+			_currentSeq.insert(_currentSeq.begin(), nextNt);
+		}
+		//cout << _currentSeq << endl;
+		//if(nextNt == 'N') nextN
+		
+		resultKmer = kmer;
+		codeSeedNT(&_kmerModel, &resultKmer, nextNt, rightExtend);
+		//cout << kmer.toString(_kmerSize) << endl;
+		//cout << resultKmer.toString(_kmerSize) << endl;
+		return resultKmer;
+	}
+	
+	/*
+	if(rightExtend){
+		if(std::find(_rightErrorPos.begin(), _rightErrorPos.end(), pos) != _rightErrorPos.end()){
+			nextNt = Leon::bin2nt(_rangeDecoder.nextByte(_bifurcationModel));
+
+			if(rightExtend)
+				_currentSeq += nextNt;
+			else
+				_currentSeq.insert(_currentSeq.begin(), nextNt);
+
+			std::bitset<4> res4  = _bloom->contains4(kmer,rightExtend);
+
+			for(int nt=0; nt<4; nt++){
+
+				if(res4[nt]){
+					kmer_type mutatedKmer = kmer;
+					codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+					return mutatedKmer;
+				}
+			}
+		}
+	}
+	else{*/
+		if(std::find(_leftErrorPos.begin(), _leftErrorPos.end(), pos) != _leftErrorPos.end()){
+			nextNt = Leon::bin2nt(_rangeDecoder.nextByte(_bifurcationModel));
+
+			if(rightExtend)
+				_currentSeq += nextNt;
+			else
+				_currentSeq.insert(_currentSeq.begin(), nextNt);
+
+			std::bitset<4> res4  = _bloom->contains4(kmer,rightExtend);
+
+			for(int nt=0; nt<4; nt++){
+
+				if(res4[nt]){
+					kmer_type mutatedKmer = kmer;
+					codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+					return mutatedKmer;
+				}
+			}
+		}
+	//}
+
+	
+		
+	//cout << kmer.toString(_kmerSize) << endl;
+	kmer_type uniqKmer;
+	//, mutatedSolidKmer;
+	int uniqNt;
+	//bool isKmerSolid = false;
+	
+
+	//kmer = _kmers[pos];
+
+	int indexedKmerCount = 0;
+	
+	//cout << kmer.toString(_kmerSize) << endl;
+	
+	
+	
+	std::bitset<4> res4  = _bloom->contains4(kmer,rightExtend);
+	for(int nt=0; nt<4; nt++){
+		if(res4[nt]){
+			kmer_type mutatedKmer = kmer;
+			codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+			
+			indexedKmerCount += 1;
+			uniqNt = nt;
+			uniqKmer = mutatedKmer;
+		}
+	}
+		
+
+	
+	/*
+	for(int nt=0; nt<4; nt++){
+		//if(nt == original_nt){
+		//	continue;
+		//}
+		
+		kmer_type mutatedKmer = kmer;
+		codeSeedBin(&_kmerModel, &mutatedKmer, nt, rightExtend);
+		kmer_type mutatedKmerMin = min(mutatedKmer, revcomp(mutatedKmer, _kmerSize));
+		
+		//mutatedKmer.printASCII(_kmerSize);
+		
+		if(_bloom->contains(mutatedKmerMin)){
+			indexedKmerCount += 1;
+			uniqNt = nt;
+			uniqKmer = mutatedKmer;
+		}
+		
+	}
+ */
+	
+	if(indexedKmerCount == 1){
+		nextNt = Leon::bin2nt(uniqNt);
+		//cout << "case 1         " << nextNt << endl;
+		resultKmer = uniqKmer;
+	}
+	else if(indexedKmerCount == 2){
+
+		char nt1 = -1;
+		char nt2 = -1;
+
+		for(int nt=0; nt<4; nt++){
+			if(res4[nt]){
+				if(nt1 == -1)
+					nt1 = nt;
+				else if(nt2 == -1)
+					nt2 = nt;
+				else break;
+			}
+		}
+
+		u_int8_t nextBinaryNt = _rangeDecoder.nextByte(_bifurcationBinaryModel);
+
+		//cout << (int)nextBinaryNt << endl;
+		if(nextBinaryNt == 0)
+			nextNt = Leon::bin2nt(nt1);
+		else
+			nextNt = Leon::bin2nt(nt2);
+
+		//cout << nextNt << endl;
+		resultKmer = kmer;
+		codeSeedNT(&_kmerModel, &resultKmer, nextNt, rightExtend);
+
+
+	}
+	else{
+		nextNt = Leon::bin2nt(_rangeDecoder.nextByte(_bifurcationModel));
+		//cout << "case 2          "<< nextNt << endl;
+		resultKmer = kmer;
+		codeSeedNT(&_kmerModel, &resultKmer, nextNt, rightExtend);
+	}
+	
+	//cout << nextNt << endl;
+	
+	//if(nextNt == 'N') cout << "lala" << endl;
+	
+	if(rightExtend){
+		_currentSeq += nextNt;
+	}
+	else{
+		_currentSeq.insert(_currentSeq.begin(), nextNt);
+	}
+	
+	//cout << _currentSeq << endl;
+	//cout << resultKmer.toString(_kmerSize) << endl;
+	return resultKmer;
+		
+}
+
+void DnaDecoder::decodeNoAnchorRead(){
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecode no anchor read" << endl;
+	#endif
+	
+	_readSize = CompressionUtils::decodeNumeric(_rangeDecoder, _noAnchorReadSizeValueModel);
+	//cout << "\tRead size: " << _readSize << endl;
+	for(unsigned int i=0; i<_readSize; i++){
+		_currentSeq += Leon::bin2nt(_rangeDecoder.nextByte(_noAnchorReadModel));
+	}
+	//endSeq();
+	//cout << read << endl;
+}
+	
+void DnaDecoder::endRead(){
+	AbstractDnaCoder::endRead();
+	
+	_buffer += _currentSeq + '\n';
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\t\tRead: " << _currentSeq << endl;
+	#endif
+	//_outputFile->write(_currentSeq.c_str(), _currentSeq.size());
+	_currentSeq.clear();
+}
+
+
+
+
diff --git a/gatb-core/src/gatb/tools/compression/DnaCoder.hpp b/gatb-core/src/gatb/tools/compression/DnaCoder.hpp
new file mode 100644
index 0000000..6fcdc7c
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/DnaCoder.hpp
@@ -0,0 +1,307 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _DNACODER_HPP_
+#define _DNACODER_HPP_
+
+
+#include <gatb/gatb_core.hpp>
+//#include "RangeCoder.hpp"
+#include "Leon.hpp"
+//#include "CompressionUtils.hpp"
+
+//#define PRINT_DISTRIB
+
+#ifdef PRINT_DISTRIB
+#include <unordered_set>
+#include <unordered_map>
+#endif
+
+
+using namespace std;
+class Leon;
+
+//====================================================================================
+// ** AbstractDnaCoder
+//====================================================================================
+class AbstractDnaCoder
+{
+	public:
+		AbstractDnaCoder(Leon* leon);
+		
+	protected:
+		KmerModel _kmerModel;
+
+		Order0Model _readTypeModel; //only 2 value in this model: with anchor or without anchor
+
+		Order0Model _noAnchorReadModel;
+
+		Order0Model _bifurcationModel;
+		Order0Model _bifurcationBinaryModel;
+		Order0Model _readAnchorRevcompModel;
+	
+		Leon* _leon;
+		collections::impl::IBloom<kmer_type>* _bloom; // the bloom containing the solid kmers
+		
+		Order0Model _readSizeDeltaTypeModel;
+		Order0Model _anchorPosDeltaTypeModel;
+		Order0Model _anchorAddressDeltaTypeModel;
+		Order0Model _NposDeltaTypeModel;
+		Order0Model _errorPosDeltaTypeModel;
+		
+
+		//Sequence* _prevSequences;
+		//Order0Model _isPrevReadAnchorableModel;
+		//vector<Order0Model> _isPrevReadAnchorablePosModel;
+		
+		vector<Order0Model> _anchorAddressModel;
+		
+		vector<Order0Model> _anchorPosModel;
+		
+		vector<Order0Model> _numericModel;
+		vector<Order0Model> _leftErrorModel;
+		vector<Order0Model> _rightErrorModel;
+		
+		vector<Order0Model> _NposModel;
+		vector<Order0Model> _leftErrorPosModel;
+		vector<Order0Model> _rightErrorPosModel;
+		
+		vector<Order0Model> _readSizeValueModel;
+
+
+		vector<Order0Model> _noAnchorReadSizeValueModel;
+		
+		size_t _kmerSize;
+		unsigned int _readSize;
+	
+		vector<int> _leftErrorPos;
+		vector<int> _rightErrorPos;
+		vector<int> _Npos;
+		
+		void startBlock();
+		void endRead();
+		void codeSeedBin(KmerModel* model, kmer_type* kmer, int nt, bool right);
+		void codeSeedNT(KmerModel* model, kmer_type* kmer, char nt, bool right);
+
+		void addErrorPos(int pos, bool rightExtend);
+		
+		u_int64_t _seqId;
+		
+
+	
+		u_int64_t _prevReadSize;
+		u_int64_t _prevAnchorPos;
+		u_int64_t _prevAnchorAddress;
+		u_int64_t _prevNpos;
+		u_int64_t _prevErrorPos;
+		u_int64_t _prevNbLeftError;
+	
+		int _processedSequenceCount;
+};
+
+//====================================================================================
+// ** DnaEncoder
+//====================================================================================
+class DnaEncoder : AbstractDnaCoder
+{
+		
+	public:
+		
+		DnaEncoder(Leon* leon);
+		DnaEncoder(const DnaEncoder& copy);
+		~DnaEncoder();
+
+		void operator()(Sequence& sequence);
+		
+	private:
+	
+	
+	//pour quals
+	char * _qualseq;
+	int * _nb_solids;
+	int _smoothing_threshold;
+	unsigned int _max_read_size;
+	bool _trunc_mode;
+	
+	void storeSolidCoverageInfo();
+	void smoothQuals();
+	bool apply_smoothing_at_pos(int pos);
+
+	double char2proba(char c);
+	char char2phred(char c);
+
+	char * _bufferQuals;
+	unsigned int _bufferQuals_idx;
+	unsigned int _bufferQuals_size;
+	
+#ifdef PRINT_DISTRIB
+	vector<Sequence*> _sequences;
+	const int maxSequences = 100;
+	vector<u_int32_t> _distrib;
+	u_int64_t _outDistrib;
+#endif
+	
+	
+	
+	
+		RangeEncoder _rangeEncoder;
+		
+		#ifdef LEON_PRINT_STAT
+			RangeEncoder _rangeEncoder1;
+			RangeEncoder _rangeEncoder2;
+			RangeEncoder _rangeEncoder3;
+			RangeEncoder _rangeEncoder4;
+			RangeEncoder _rangeEncoder5;
+			RangeEncoder _rangeEncoder6;
+		#endif
+		
+		//static void encodeFirstHeader();
+		void writeBlock();
+		void execute();
+		
+		void buildKmers();
+		bool isReadAnchorable();
+		int findExistingAnchor(u_int32_t* anchorAddress);
+		
+		void encodeAnchorRead(int anchorPos, u_int32_t anchorAddress);
+		kmer_type buildBifurcationList(int pos, kmer_type kmer, bool rightExtend);
+		//int buildBifurcationList(int pos, bool rightExtend);
+		int voteMutations(int pos, int depth, bool rightExtend);
+		
+		void encodeNoAnchorRead();
+
+		int getBestPath(int pos, kmer_type& kmer, bitset<4>& initRes4, bool rightExtend);
+		
+		Sequence* _sequence;
+		char* _readseq;
+		vector<kmer_type> _kmers;
+		KmerModel::Iterator _itKmer;
+		vector<u_int8_t> _bifurcations;
+		vector<u_int8_t> _binaryBifurcations;
+		vector<u_int8_t> _bifurcationTypes;
+		
+		//bool _isPrevReadAnchorable;
+		//u_int64_t _isPrevReadAnchorablePos;
+
+		vector<int> _solidMutaChain;
+		//int _solidMutaChainPos;
+		u_int64_t _totalDnaSize;
+		u_int64_t _readCount;
+		u_int64_t _MCtotal;
+		u_int64_t _readWithoutAnchorCount;
+		u_int64_t _MCuniqSolid;
+		u_int64_t _MCuniqNoSolid;
+		u_int64_t _MCnoAternative;
+		u_int64_t _MCmultipleSolid;
+	
+		int _minSequenceSize;
+		int _maxSequenceSize;
+		//u_int64_t _MCmultipleNoSolid;
+	
+		int _thread_id;
+
+	//	int _solidMutaChainStartPos;
+	//	int _solidMutaChainSize;
+	//	int _solidMutaChainLockTime;
+};
+
+//====================================================================================
+// ** DnaDecoder
+//====================================================================================
+class DnaDecoder : AbstractDnaCoder
+{
+		
+	public:
+		
+		DnaDecoder(Leon* leon, const string& inputFilename,tools::storage::impl::Group *  group);
+		~DnaDecoder();
+		
+		void setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount, int blockID);
+		void execute();
+	
+		string _buffer;
+		bool _finished;
+		
+	private:
+	
+
+	
+	
+		RangeDecoder _rangeDecoder;
+	//	ifstream* _inputFile;
+		//ofstream* _outputFile;
+		u_int64_t _blockStartPos;
+		u_int64_t _blockSize;
+	//	int _decodedSequenceCount;
+		string _currentSeq;
+		ifstream* _anchorDictFile;
+		
+		void decodeAnchorRead();
+		kmer_type extendAnchor(kmer_type kmer, int pos, bool rightExtend);
+		
+		void decodeNoAnchorRead();
+		void endRead();
+		
+		int _sequenceCount;
+	
+	tools::storage::impl::Group *  _group;
+	tools::storage::impl::Storage::istream *_inputStream;
+
+};
+
+class QualDecoder
+{
+public:
+	//QualDecoder(Leon* leon, const string& inputFilename);
+	QualDecoder(Leon* leon, const string& inputFilename,tools::storage::impl::Group *  group);
+
+	~QualDecoder();
+	
+	void setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount);
+	void setup( int blockID);
+
+	void execute();
+	
+	string _buffer;
+	bool _finished;
+	
+	
+private:
+	Leon* _leon;
+
+	tools::storage::impl::Group *  _group;
+	
+	char * _inbuffer;
+	//ifstream* _inputFile;
+	
+	tools::storage::impl::Storage::istream *_inputStream;
+
+	
+	//ofstream* _outputFile;
+	u_int64_t _blockStartPos;
+	u_int64_t _blockSize;
+	//int _decodedSequenceCount;
+	string _currentSeq;
+	int _sequenceCount;
+	int _processedSequenceCount;
+
+};
+#endif /* _DNACODER_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/compression/HeaderCoder.cpp b/gatb-core/src/gatb/tools/compression/HeaderCoder.cpp
new file mode 100644
index 0000000..2bc38ad
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/HeaderCoder.cpp
@@ -0,0 +1,789 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#include "HeaderCoder.hpp"
+
+#include <bitset> //////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! delete
+/*
+#define PRINT_DEBUG_ENCODER
+#define PRINT_DEBUG_DECODER
+*/
+		
+
+//====================================================================================
+// ** AbstractHeaderCoder
+//====================================================================================
+AbstractHeaderCoder::AbstractHeaderCoder(Leon* leon) :
+_headerSizeModel(256)
+{
+	_leon = leon;
+	_prevHeader = "";
+	_currentHeader = "";
+}
+	
+void AbstractHeaderCoder::addFieldColumn(){
+	
+	_typeModel.push_back(Order0Model(HEADER_TYPE_COUNT+1));
+	_fieldIndexModel.push_back(Order0Model(256));
+	_fieldColumnModel.push_back(Order0Model(256));
+	_misSizeModel.push_back(Order0Model(256));
+	_asciiModel.push_back(Order0Model(128));
+	_zeroModel.push_back(Order0Model(256));
+	
+	_numericModels.push_back(vector<Order0Model>());
+	for(int j=0; j<CompressionUtils::NB_MODELS_PER_NUMERIC; j++)
+		_numericModels[_numericModels.size()-1].push_back( Order0Model(256) );
+		
+	_prevFieldPos.push_back(0);
+	_currentFieldPos.push_back(0);
+	_prevFieldValues.push_back(0);
+	_currentFieldValues.push_back(0);
+	_prevFieldTypes.push_back(FIELD_ASCII);
+	_currentFieldTypes.push_back(FIELD_ASCII);
+	_prevFieldZeroValues.push_back(0);
+	_currentFieldZeroValues.push_back(0);
+}
+
+int AbstractHeaderCoder::typeOfChar(u_int8_t c, bool* isDigit){
+	if(isdigit(c)){
+		*isDigit = true;
+		return 1;
+	}
+	else if(isalpha(c)){
+		*isDigit = false;
+		return 1;
+	}
+	else{
+		*isDigit = false;
+		return 2;
+	}
+}
+
+void AbstractHeaderCoder::splitHeader(){
+	_fieldIndex = 0;
+	_fieldStartPos = 0;
+	_currentPos = 0;
+	_isCurrentFieldNumeric = true;
+	
+	u_int8_t c;
+	int charType;
+	bool digitOnly;
+	int lastCharType = typeOfChar(_currentHeader[0], &digitOnly);
+	
+	for(_currentPos=0; (unsigned)_currentPos<_currentHeader.size(); _currentPos++){
+		c = _currentHeader[_currentPos];
+		
+		digitOnly = true;
+		charType = typeOfChar(c, &digitOnly);
+		
+		if(charType != lastCharType){
+			lastCharType = charType;
+			makeField();
+		}
+		
+		if(_isCurrentFieldNumeric){
+			_isCurrentFieldNumeric = digitOnly;
+		}
+	}
+	
+	makeField();
+	
+	_currentFieldCount = _fieldIndex;
+}
+
+void AbstractHeaderCoder::makeField(){
+	if(_fieldStartPos == _currentPos) return;
+	
+	//Adjust the maximum number fo field column
+	int currentFieldColumn = _currentFieldPos.size();
+	while(currentFieldColumn <= _fieldIndex+1){
+		addFieldColumn();
+		currentFieldColumn = _currentFieldPos.size();
+	}
+	
+	_currentFieldPos[_fieldIndex] = _fieldStartPos;
+	_currentFieldPos[_fieldIndex+1] = _currentPos;
+	
+	if(_isCurrentFieldNumeric){
+		string field = _currentHeader.substr(_currentFieldPos[_fieldIndex], _currentFieldPos[_fieldIndex+1]-_currentFieldPos[_fieldIndex]);
+		
+		int zeroCount = 0;
+		if(field[0] == '0'){
+			while(field[0] == '0'){
+				zeroCount += 1;
+				field.erase(field.begin());
+			}
+		}
+		
+		//cout << " HAHAHAHAAHAHHAHA    " << field << endl; 
+		_currentFieldZeroValues[_fieldIndex] = zeroCount;
+		
+		u_int64_t value = strtoul(field.c_str(), NULL, 0);
+		_currentFieldValues[_fieldIndex] = value;
+		
+		if(zeroCount > 0){
+			if(value == 0){
+				_currentFieldTypes[_fieldIndex] = FIELD_ZERO_ONLY;
+			}
+			else{
+				_currentFieldTypes[_fieldIndex] = FIELD_ZERO_AND_NUMERIC;
+			}
+		}
+		else {
+			_currentFieldTypes[_fieldIndex] = FIELD_NUMERIC;
+		}
+		//cout << "OOOOOOOOOOOOoo   " << strtoul("15313", NULL, 0) << endl;
+	}
+	else{
+		_currentFieldTypes[_fieldIndex] = FIELD_ASCII;
+	}
+	
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\tField "<< _fieldIndex << ": " << _currentHeader.substr(_currentFieldPos[_fieldIndex], _currentFieldPos[_fieldIndex+1]-_currentFieldPos[_fieldIndex]) << "  Digit only? " << _isCurrentFieldNumeric << endl;
+	#endif
+	_fieldIndex += 1;
+	_fieldStartPos = _currentPos;
+	_isCurrentFieldNumeric = true;
+}
+
+void AbstractHeaderCoder::endHeader(){
+	_prevFieldCount = _currentFieldCount;
+	
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\tField count: " << _prevFieldCount << endl;
+	#endif
+	
+	for(int i=0; i<_prevFieldCount+1; i++){
+		_prevFieldPos[i] = _currentFieldPos[i];
+		_prevFieldValues[i] = _currentFieldValues[i];
+		_prevFieldTypes[i] = _currentFieldTypes[i];
+		_prevFieldZeroValues[i] = _currentFieldZeroValues[i];
+		
+		_currentFieldZeroValues[i] = 0;
+	}
+	_prevHeader = _currentHeader;
+	_misIndex = 0;
+	_fieldIndex = 0;
+	
+	_processedSequenceCount += 1;
+}
+
+void AbstractHeaderCoder::startBlock(){
+
+	_currentHeader = _leon->_firstHeader;
+	
+	for(int i=0; (unsigned)i<_typeModel.size(); i++){
+		_typeModel[i].clear();
+		_fieldIndexModel[i].clear();
+		_fieldColumnModel[i].clear();
+		_misSizeModel[i].clear();
+		_asciiModel[i].clear();
+		_zeroModel[i].clear();
+		
+		for(int j=0; j<8; j++)
+			_numericModels[i][j].clear();
+			
+	}
+	_headerSizeModel.clear();
+	
+	splitHeader();
+	endHeader();
+	
+	_processedSequenceCount = 0;
+}
+
+//====================================================================================
+// ** HeaderEncoder
+//====================================================================================
+HeaderEncoder::HeaderEncoder(Leon* leon) :
+AbstractHeaderCoder(leon) , _totalHeaderSize(0) ,_seqId(0)
+{
+	_thread_id = __sync_fetch_and_add (&_leon->_nb_thread_living, 1);
+
+	
+	//_firstHeader = firstHeader;
+	//_rangeEncoder = new RangeEncoder();
+}
+
+HeaderEncoder::HeaderEncoder(const HeaderEncoder& copy) :
+AbstractHeaderCoder(NULL), _totalHeaderSize(0),_seqId(0)
+{
+
+	
+	_leon = copy._leon;
+	
+	_thread_id = __sync_fetch_and_add (&_leon->_nb_thread_living, 1);
+	startBlock();
+
+	//_firstHeader = copy._firstHeader;
+	//_rangeEncoder = new RangeEncoder();
+}
+
+HeaderEncoder::~HeaderEncoder(){
+	
+	
+	if( _thread_id!=0 && (_seqId+1) % _leon->getReadPerBlock() != 0 ){
+		writeBlock();
+	}
+//	int nb_remaining =
+ 	__sync_fetch_and_add (&_leon->_nb_thread_living, -1);
+	
+	__sync_fetch_and_add(&_leon->_totalHeaderSize, _totalHeaderSize);
+
+}
+
+
+//int HeaderEncoder::getId(){
+//	return ((_lastSequenceIndex / Leon::READ_PER_BLOCK) % _leon->_nb_cores);
+//}
+
+void HeaderEncoder::operator()(Sequence& sequence){
+	_lastSequenceIndex = sequence.getIndex();
+	_seqId = sequence.getIndex() ;
+
+
+	_currentHeader = sequence.getComment();
+	
+	_totalHeaderSize += _currentHeader.size();
+	
+	processNextHeader();
+	
+	
+	if(_processedSequenceCount >= _leon->getReadPerBlock() ){
+		
+		writeBlock();
+		startBlock();
+	}
+	
+}
+
+void HeaderEncoder::writeBlock(){
+	if(_rangeEncoder.getBufferSize() > 0){
+		_rangeEncoder.flush();
+	}
+	
+	int blockId = (  _seqId / _leon->getReadPerBlock())   ;
+
+	//printf("\nheader coder writeblock   bid %i   tid %i \n",blockId, _thread_id);
+	
+	_leon->writeBlock(_rangeEncoder.getBuffer(), _rangeEncoder.getBufferSize(), _processedSequenceCount,blockId,true);
+	_rangeEncoder.clear();
+}
+
+void HeaderEncoder::processNextHeader(){
+	
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << _prevHeader << endl;
+		cout << _currentHeader << endl;
+	#endif
+	splitHeader();
+	compareHeader();
+	endHeader();
+}
+
+void HeaderEncoder::compareHeader(){
+	_fieldPos = 0;
+	_misCurrentStartPos = -1;
+	
+	for(_fieldIndex=0; _fieldIndex<_currentFieldCount; _fieldIndex++){
+		
+		_currentFieldSize = _currentFieldPos[_fieldIndex+1] - _currentFieldPos[_fieldIndex];
+		_prevFieldSize = _prevFieldPos[_fieldIndex+1]-_prevFieldPos[_fieldIndex];
+		_misCurrentStartPos = -1;
+		
+		HeaderType prevFieldType = _prevFieldTypes[_fieldIndex];
+		HeaderType currentFieldType = _currentFieldTypes[_fieldIndex];
+		
+		//Comparing numeric field
+		if(prevFieldType == FIELD_NUMERIC && currentFieldType == FIELD_NUMERIC){
+			#ifdef PRINT_DEBUG_ENCODER
+				cout << "\t\tComparing numeric fields: " <<_prevFieldValues[_fieldIndex] << " " << _currentFieldValues[_fieldIndex] << endl;
+			#endif
+			if(_prevFieldValues[_fieldIndex] == _currentFieldValues[_fieldIndex]){ //match
+				_lastMatchFieldIndex = _fieldIndex;
+				continue;
+			}
+			//encodeNumeric();
+		}
+		//Comparing field with zero only
+		else if(prevFieldType == FIELD_ZERO_ONLY && currentFieldType == FIELD_ZERO_ONLY){
+			#ifdef PRINT_DEBUG_ENCODER
+				cout << "\t\tComparing fields with zero only: "  << endl;
+			#endif
+			if(_prevFieldZeroValues[_fieldIndex] == _currentFieldZeroValues[_fieldIndex]){ //match
+				_lastMatchFieldIndex = _fieldIndex;
+				continue;
+			}
+			//encodeNumeric();
+		}
+		//Comparing field with zero at begining and numeric
+		else if(prevFieldType == FIELD_ZERO_AND_NUMERIC && currentFieldType == FIELD_ZERO_AND_NUMERIC){
+			#ifdef PRINT_DEBUG_ENCODER
+				cout << "\t\tComparing fields with zero at begining and numeric: "  << endl;
+			#endif
+			if(_prevFieldZeroValues[_fieldIndex] == _currentFieldZeroValues[_fieldIndex] && _prevFieldValues[_fieldIndex] == _currentFieldValues[_fieldIndex]){ //match
+				_lastMatchFieldIndex = _fieldIndex;
+				continue;
+			}
+			//encodeNumeric();
+		}
+		
+		
+		//Encoding numeric field
+		if(currentFieldType == FIELD_NUMERIC || currentFieldType == FIELD_ZERO_ONLY || currentFieldType == FIELD_ZERO_AND_NUMERIC){
+			encodeNumeric();
+		}
+		//Comparing ascii fields
+		else{
+			for(_fieldPos=0; _fieldPos<_currentFieldSize; _fieldPos++){
+			
+				if(_fieldIndex >= _prevFieldCount){
+					_misCurrentStartPos = _fieldPos;
+					break;
+				}
+					
+				if(_fieldPos >= _prevFieldSize){
+					_misCurrentStartPos = _fieldPos;
+					break;
+				}
+
+				u_int8_t c = _currentHeader[_currentFieldPos[_fieldIndex]+_fieldPos];
+				
+				#ifdef PRINT_DEBUG_ENCODER
+					cout << "\t\tComparing: " << _prevHeader[_prevFieldPos[_fieldIndex]+_fieldPos] << " " << c << "  ";
+				#endif
+				if(c == _prevHeader[_prevFieldPos[_fieldIndex]+_fieldPos]){
+					#ifdef PRINT_DEBUG_ENCODER
+						cout << "match" << endl;
+					#endif
+				}
+				else{
+					#ifdef PRINT_DEBUG_ENCODER
+						cout << "mismatch" << endl;
+					#endif
+					_misCurrentStartPos = _fieldPos;
+					break;
+				}
+			}
+			
+			if(_misCurrentStartPos != -1){
+				encodeAscii();
+			}
+			else if(_fieldPos != _prevFieldSize){ //All the character of the current field match but there are always character in the current field of the prev header
+				_misCurrentStartPos = _fieldPos;
+				encodeAscii();
+			}
+			else{
+				_lastMatchFieldIndex = _fieldIndex;
+			}
+			
+		}
+		
+	}
+	
+	//if(_currentFieldPos[_fieldIndex]+_fieldPos == _currentHeader.size()){
+	//	_misCurrentStartPos = _fieldPos;
+	//	encodeMismatch();
+	//}
+	
+	//cout << _lastMatchFieldIndex << " " << _fieldIndex << endl;
+	
+	//if the last field match, we have to signal to the decoder to add the last matching field of the prev header
+	
+	if(_lastMatchFieldIndex == _fieldIndex-1){
+		_rangeEncoder.encode(_typeModel[_misIndex], HEADER_END_MATCH);
+		_rangeEncoder.encode(_headerSizeModel, _currentHeader.size());
+		//_misCurrentStartPos = _currentFieldSize;
+		//encodeAscii();
+	}
+	else{
+		_rangeEncoder.encode(_typeModel[_misIndex], HEADER_END);
+	}
+	//_misIndex += 1;
+	
+	//end of header
+	//_rangeEncoder.encode(_typeModel[_misIndex], HEADER_END);
+	//_rangeEncoder.encode(_headerSizeModel, _currentHeader.size());
+	
+}
+
+
+void HeaderEncoder::encodeNumeric(){
+	u_int64_t zeroCount = _currentFieldZeroValues[_fieldIndex];
+	u_int64_t fieldValue = _currentFieldValues[_fieldIndex];
+	
+	HeaderType currentFieldType = _currentFieldTypes[_fieldIndex];
+	
+	if(currentFieldType == FIELD_ZERO_ONLY){
+		#ifdef PRINT_DEBUG_ENCODER
+			cout << "\t\t\tField with zero only" << endl;
+			cout << "\t\t\tEnconding zero count: " << zeroCount << endl;
+		#endif
+		_rangeEncoder.encode(_typeModel[_misIndex], FIELD_ZERO_ONLY);
+		_rangeEncoder.encode(_fieldIndexModel[_misIndex], _fieldIndex);
+		_rangeEncoder.encode(_zeroModel[_misIndex], zeroCount);
+		_misIndex += 1;
+		return;
+	}
+	else if(currentFieldType == FIELD_ZERO_AND_NUMERIC){
+		#ifdef PRINT_DEBUG_ENCODER
+			cout << "\t\t\tField with zero and numeric" << endl;
+			cout << "\t\t\tEnconding zero count: " << zeroCount << endl;
+		#endif
+		_rangeEncoder.encode(_typeModel[_misIndex], FIELD_ZERO_AND_NUMERIC);
+		_rangeEncoder.encode(_fieldIndexModel[_misIndex], _fieldIndex);
+		_rangeEncoder.encode(_zeroModel[_misIndex], zeroCount);
+		_misIndex += 1;
+	}
+
+	u_int64_t value = fieldValue;
+	u_int64_t prevValue = _prevFieldValues[_fieldIndex];
+
+
+	//int valueByteCount = CompressionUtils::getByteCount(value);
+	
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\t\t\tPrev value: " << prevValue << endl;
+		cout << "\t\t\tField value: " << value << "    Byte: " << valueByteCount << endl;
+	#endif
+	
+	u_int64_t deltaValue;
+	int deltaType = CompressionUtils::getDeltaValue(value, prevValue, &deltaValue);
+	
+	if(deltaType == 0){
+		_rangeEncoder.encode(_typeModel[_misIndex], FIELD_NUMERIC);
+	}
+	else if(deltaType == 1){
+		_rangeEncoder.encode(_typeModel[_misIndex], FIELD_DELTA);
+		value = deltaValue;
+	}
+	else if(deltaType == 2){
+		_rangeEncoder.encode(_typeModel[_misIndex], FIELD_DELTA_2);
+		value = deltaValue;
+	}
+	
+	  
+	_rangeEncoder.encode(_fieldIndexModel[_misIndex], _fieldIndex);
+	CompressionUtils::encodeNumeric(_rangeEncoder, _numericModels[_misIndex], value);
+	//_rangeEncoder->encode(&_fieldColumnModel[_misIndex], 0);
+	//_prevFieldValues[_fieldIndex] = fieldValue;
+	
+	_misIndex += 1;
+}
+
+void HeaderEncoder::encodeAscii(){
+	int missSize = _currentFieldSize - _misCurrentStartPos;//_currentPos - _misCurrentStartPos;
+	//cout << _currentFieldSize <<  " " << _fieldPos << endl;
+	_rangeEncoder.encode(_typeModel[_misIndex], FIELD_ASCII);
+	_rangeEncoder.encode(_fieldIndexModel[_misIndex], _fieldIndex);
+	_rangeEncoder.encode(_fieldColumnModel[_misIndex], _misCurrentStartPos);
+	_rangeEncoder.encode(_misSizeModel[_misIndex], missSize);
+	#ifdef PRINT_DEBUG_ENCODER
+		cout << "\t\t\t<Mismatch> " << "    Type: " << "ASCII" << "    Field: " << _fieldIndex << "    Column: " << _misCurrentStartPos << "    Size: " << missSize << endl;
+	#endif
+	//for(int j=_misCurrentStartPos; j<_currentPos; j++){
+	for(int i=_misCurrentStartPos; i < _misCurrentStartPos+missSize; i++){
+		#ifdef PRINT_DEBUG_ENCODER
+			cout << "\t\t\tEncoding: " << _currentHeader[_currentFieldPos[_fieldIndex]+i] << endl;
+		#endif
+		//cout << _currentHeader[j] << flush;
+		_rangeEncoder.encode(_asciiModel[_misIndex], _currentHeader[_currentFieldPos[_fieldIndex]+i]);
+	}
+	//cout << endl;
+	_misIndex += 1;
+}
+
+
+
+
+
+
+
+
+
+
+
+//====================================================================================
+// ** HeaderDecoder
+//====================================================================================
+HeaderDecoder::HeaderDecoder(Leon* leon,std::string & inputFilename, tools::storage::impl::Group *  group) :
+AbstractHeaderCoder(leon)
+//, _rangeDecoder(inputFile)
+{
+	_group = group;
+	_inputStream =0;
+	_finished = false;
+
+}
+
+HeaderDecoder::~HeaderDecoder(){
+
+	if(_inputStream !=0) delete _inputStream;
+
+}
+
+void HeaderDecoder::setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount,int blockID){
+	startBlock();
+	_rangeDecoder.clear();
+	
+	
+		if(_inputStream !=0) delete _inputStream;
+	std::string datasetname = Stringify::format ("header_%i",blockID);
+	
+	_inputStream = new tools::storage::impl::Storage::istream  (*_group, datasetname);
+	
+	auto _tempcollec = & _group->getCollection<math::NativeInt8> (datasetname);
+	std::string dsize = _tempcollec->getProperty ("size");
+	
+	_blockSize =  std::stoi(dsize); // blockSize;
+	
+	
+	
+	_rangeDecoder.setInputFile(_inputStream);
+
+	
+	
+	
+	_blockStartPos = blockStartPos;
+	//_blockSize = blockSize;
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t-----------------------" << endl;
+		cout << "\tDecoding block " << _blockStartPos << " - " << _blockStartPos+_blockSize << endl;
+	#else
+		//_leon->_progress_decode->inc(1);
+
+	#endif
+
+	_currentHeader.clear();
+	_misIndex = 0;
+	
+	_sequenceCount = sequenceCount;
+}
+
+void HeaderDecoder::execute(){
+	//cout << "executing" << endl;
+	//decodeFirstHeader();
+	
+	while(_processedSequenceCount < _sequenceCount){
+
+		u_int8_t type = _rangeDecoder.nextByte(_typeModel[_misIndex]);
+		#ifdef PRINT_DEBUG_DECODER
+			cout << "\t\tNext type is: " << (int)type << endl;
+		#endif
+
+		
+		if(type == HEADER_END){
+
+			endHeader();
+			//i+=1;
+		}
+		else if(type == HEADER_END_MATCH){
+			//decodeMatch();
+			u_int8_t headerSize = _rangeDecoder.nextByte(_headerSizeModel);
+
+			for(/*_fieldIndex*/; _fieldIndex < _prevFieldCount; _fieldIndex++){
+				#ifdef PRINT_DEBUG_DECODER
+					cout << "\t\t\tAdding from prev header: " << _prevHeader.substr(_prevFieldPos[_fieldIndex], _prevFieldPos[_fieldIndex+1]-_prevFieldPos[_fieldIndex]) << endl;
+				#endif
+				_currentHeader += _prevHeader.substr(_prevFieldPos[_fieldIndex], _prevFieldPos[_fieldIndex+1]-_prevFieldPos[_fieldIndex]);
+				if(_currentHeader.size() >= headerSize) break;
+			}
+			
+			endHeader();
+		}
+		else{
+			
+			decodeMatch();
+			
+			if(type == FIELD_ASCII){
+				decodeAscii();
+				_fieldIndex += 1;
+				_misIndex += 1;
+			}
+			else if(type == FIELD_NUMERIC){
+				decodeNumeric();
+				_fieldIndex += 1;
+				_misIndex += 1;
+			}
+			else if(type == FIELD_DELTA){
+				decodeDelta();
+				_fieldIndex += 1;
+				_misIndex += 1;
+			}
+			else if(type == FIELD_DELTA_2){
+				decodeDelta2();
+				_fieldIndex += 1;
+				_misIndex += 1;
+			}
+			else if(type == FIELD_ZERO_ONLY){
+				decodeZero();
+				_fieldIndex += 1;
+				_misIndex += 1;
+			}
+			else if(type == FIELD_ZERO_AND_NUMERIC){
+				decodeZero();
+				_misIndex += 1;
+				//decodeNumeric();
+				//_fieldIndex += 1;
+			}
+			//_prevPos = _prevFieldPos[_fieldIndex+1];
+
+		}
+		
+		//cout << "lala" << endl;
+	}
+	
+	_finished = true;
+}
+
+
+void HeaderDecoder::decodeMatch(){
+	u_int8_t misFieldIndex = _rangeDecoder.nextByte(_fieldIndexModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tMatch to field: " << (int)misFieldIndex << endl;
+	#endif
+	for(/*_fieldIndex*/; _fieldIndex < misFieldIndex; _fieldIndex++){
+		#ifdef PRINT_DEBUG_DECODER
+			cout << "\t\t\tAdding from prev header: " << _prevHeader.substr(_prevFieldPos[_fieldIndex], _prevFieldPos[_fieldIndex+1]-_prevFieldPos[_fieldIndex]) << endl;
+		#endif
+		_currentHeader += _prevHeader.substr(_prevFieldPos[_fieldIndex], _prevFieldPos[_fieldIndex+1]-_prevFieldPos[_fieldIndex]);
+	}
+}
+
+void HeaderDecoder::decodeAscii(){
+	u_int8_t misColumn = _rangeDecoder.nextByte(_fieldColumnModel[_misIndex]);
+	u_int8_t misSize = _rangeDecoder.nextByte(_misSizeModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecoding   Type: ASCII     Column: " << (int)misColumn << "    Size: " << (int)misSize << endl;
+	#endif
+	
+	if(_fieldIndex < _prevFieldCount){
+		for(int fieldPos=0; fieldPos<misColumn; fieldPos++){
+			_currentHeader += _prevHeader[_prevFieldPos[_fieldIndex]+fieldPos];
+		}
+	}
+	
+	for(int i=0; i<misSize; i++){
+		u_int8_t c = _rangeDecoder.nextByte(_asciiModel[_misIndex]);
+		
+		#ifdef PRINT_DEBUG_DECODER
+			cout << "\t\t\tAdding: " << c << " (" << (int)c << ")"<< endl;
+		#endif
+		//_currentHeader2[_currentPos] = c;
+		_currentHeader += c;
+		//_currentPos += 1;
+	}
+	
+}	
+
+void HeaderDecoder::decodeNumeric(){
+	//u_int8_t misSize = _rangeDecoder.nextByte(_misSizeModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecoding   Type: NUMERIC" << endl; //"    Size: " << (int)misSize << endl;
+	#endif
+	
+	u_int64_t value = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModels[_misIndex]);
+	//_currentHeader += CompressionUtils::numberToString(value);
+	
+	char temp[200];
+	snprintf(temp,200,"%llu",value);
+	_currentHeader += string(temp);
+	//_currentHeader += to_string(value); // C++11
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\t\tAdding: " << string(temp) << endl;
+	#endif
+}
+
+void HeaderDecoder::decodeDelta(){
+	//u_int8_t misSize = _rangeDecoder.nextByte(_misSizeModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecoding   Type: DELTA" << endl;//"    Size: " << (int)misSize << endl;
+	#endif
+	
+	u_int64_t value = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModels[_misIndex]);
+
+	value = CompressionUtils::getValueFromDelta(1, _prevFieldValues[_fieldIndex], value);
+	
+	char temp[200];
+	snprintf(temp,200,"%llu",value);
+	_currentHeader += string(temp);
+	//_currentHeader += to_string(value);
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\t\tAdding: " << string(temp) << endl;
+	#endif
+}
+
+void HeaderDecoder::decodeDelta2(){
+	//u_int8_t misSize = _rangeDecoder.nextByte(_misSizeModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecoding   Type: DELTA 2" << endl;//"    Size: " << (int)misSize << endl;
+	#endif
+	
+	u_int64_t value = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModels[_misIndex]);
+
+	value = CompressionUtils::getValueFromDelta(2, _prevFieldValues[_fieldIndex], value);
+	char temp[200];
+	snprintf(temp,200,"%llu",value);
+	_currentHeader += string(temp);
+	//_currentHeader += to_string(value);
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\t\tAdding: " << string(temp) << endl;
+	#endif
+}
+
+void HeaderDecoder::decodeZero(){
+	u_int8_t zeroCount = _rangeDecoder.nextByte(_zeroModel[_misIndex]);
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tDecoding   Type: ZERO     Size: " << (int)zeroCount << endl;
+	#endif
+	
+	for(int i=0; i<zeroCount; i++){
+		
+		#ifdef PRINT_DEBUG_DECODER
+			cout << "\t\t\tAdding: 0"<< endl;
+		#endif
+		
+		_currentHeader += '0';
+	}
+}
+
+void HeaderDecoder::endHeader(){
+	_buffer += _currentHeader + '\n';
+
+	#ifdef PRINT_DEBUG_DECODER
+		cout << _currentHeader << endl;
+		//for(int i=0; i<_currentPos; i++){
+		//	cout << _currentHeader2[i];
+		//}
+		//cout << endl;
+	#endif
+	
+	
+	splitHeader();
+	AbstractHeaderCoder::endHeader();
+	_currentHeader.clear();
+	_misIndex = 0;
+}
+
+
diff --git a/gatb-core/src/gatb/tools/compression/HeaderCoder.hpp b/gatb-core/src/gatb/tools/compression/HeaderCoder.hpp
new file mode 100644
index 0000000..231e91f
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/HeaderCoder.hpp
@@ -0,0 +1,186 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef _HEADERCODER_HPP_
+#define _HEADERCODER_HPP_
+
+/*
+#include <string>
+#include <vector>
+#include <ctype.h>
+#include <cstdio>
+#include <fstream>
+#include <iostream>
+#include <stdlib.h>
+#include <math.h>*/
+
+//#include "RangeCoder.hpp"
+#include <gatb/gatb_core.hpp>
+#include "Leon.hpp"
+//#include "CompressionUtils.hpp"
+
+using namespace std;
+class Leon;
+//====================================================================================
+// ** AbstractHeaderCoder
+//====================================================================================
+class AbstractHeaderCoder
+{
+	public:
+		AbstractHeaderCoder(Leon* leon);
+		
+	protected:
+		void addFieldColumn();
+	
+		enum HeaderType{HEADER_END=1, HEADER_END_MATCH, FIELD_ASCII, FIELD_NUMERIC, FIELD_DELTA, FIELD_DELTA_2, FIELD_ZERO_ONLY, FIELD_ZERO_AND_NUMERIC, HEADER_TYPE_COUNT};
+		//static const int MAX_FIELD_COUNT = 200;
+		
+		vector<Order0Model> _typeModel;
+		vector<Order0Model> _fieldIndexModel;
+		vector<Order0Model> _fieldColumnModel;
+		vector<Order0Model> _misSizeModel;
+		vector<Order0Model> _asciiModel;
+		vector< vector<Order0Model> > _numericModels;
+		vector<Order0Model> _zeroModel;
+		
+		Order0Model _headerSizeModel;
+		
+		int typeOfChar(u_int8_t c, bool* isDigit);
+		void splitHeader();
+		void makeField();
+		void endHeader();
+		
+		string _prevHeader;
+		string _currentHeader;
+		vector<unsigned int> _prevFieldPos;
+		vector<unsigned int> _currentFieldPos;
+		int _currentPos;
+		int _fieldStartPos;
+		int _prevFieldCount;
+		int _fieldIndex;
+		int _misIndex;
+	
+		vector<u_int64_t> _prevFieldValues;
+		vector<u_int64_t> _currentFieldValues;
+		vector<u_int64_t> _prevFieldZeroValues;
+		vector<u_int64_t> _currentFieldZeroValues;
+		vector<HeaderType> _prevFieldTypes;
+		vector<HeaderType> _currentFieldTypes;
+		
+		
+		bool _isCurrentFieldNumeric;
+		int _currentFieldCount;
+		
+		Leon* _leon;
+		
+		void startBlock();
+		
+		int _processedSequenceCount;
+};
+
+//====================================================================================
+// ** HeaderEncoder
+//====================================================================================
+class HeaderEncoder : AbstractHeaderCoder
+{
+		
+	public:
+		
+		HeaderEncoder(Leon* leon);
+		HeaderEncoder(const HeaderEncoder& copy);
+		~HeaderEncoder();
+
+		void operator()(Sequence& sequence);
+		//int getId();
+		u_int64_t _lastSequenceIndex;
+		
+	private:
+		
+		RangeEncoder _rangeEncoder;
+		
+		u_int64_t _totalHeaderSize;
+	
+		int _fieldPos;
+		//int _misPrevStartPos, _misCurrentStartPos;
+		int _misCurrentStartPos;
+		//int _encoderFieldIndex;
+		int _prevFieldSize, _currentFieldSize;
+		int _lastMatchFieldIndex;
+		u_int64_t _seqId;
+		int _thread_id;
+
+		//static void encodeFirstHeader();
+		void writeBlock();
+		
+		void processNextHeader();
+		void compareHeader();
+		//void encode();
+		//void encodeMismatch();
+		void encodeNumeric();
+		void encodeAscii();
+		
+};
+
+//====================================================================================
+// ** HeaderDecoder
+//====================================================================================
+class HeaderDecoder : AbstractHeaderCoder
+{
+		
+	public:
+		
+		HeaderDecoder(Leon* leon, std::string & inputFilename, tools::storage::impl::Group *  group);
+		~HeaderDecoder();
+		
+		//void processNextByte(u_int8_t byte);
+		void setup(u_int64_t blockStartPos, u_int64_t blockSize, int sequenceCount, int blockID);
+		void execute();
+	
+		string _buffer;
+		bool _finished;
+		
+	private:
+	tools::storage::impl::Group *  _group;
+
+		RangeDecoder _rangeDecoder;
+		//ifstream* _inputFile;
+	tools::storage::impl::Storage::istream *_inputStream;
+
+		//ofstream* _outputFile;
+		u_int64_t _blockStartPos;
+		u_int64_t _blockSize;
+		
+		//int _prevPos;
+		void endHeader();
+		//void decodeFirstHeader();
+		void decodeMatch();
+		void decodeAscii();
+		void decodeNumeric();
+		void decodeDelta();
+		void decodeDelta2();
+		void decodeZero();
+		
+
+		int _sequenceCount;
+		
+};
+
+#endif /* _HEADERCODER_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/compression/Leon.cpp b/gatb-core/src/gatb/tools/compression/Leon.cpp
new file mode 100644
index 0000000..5c5dd3c
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/Leon.cpp
@@ -0,0 +1,2434 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+
+ 
+#include "Leon.hpp"
+
+
+using namespace std;
+
+//#define PRINT_DEBUG
+//#define PRINT_DEBUG_DECODER
+
+
+
+//const u_int64_t ANCHOR_KMERS_HASH_SIZE = 500000000;
+const char* Leon::STR_COMPRESS = "-c";
+const char* Leon::STR_DECOMPRESS = "-d";
+const char* Leon::STR_TEST_DECOMPRESSED_FILE = "-test-file";
+const char* Leon::STR_DNA_ONLY = "-seq-only";
+const char* Leon::STR_NOHEADER = "-noheader";
+const char* Leon::STR_NOQUAL = "-noqual";
+
+const char* Leon::STR_DATA_INFO = "Info";
+const char* Leon::STR_INIT_ITER = "-init-iterator";
+
+const int Leon::nt2binTab[128] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 1, 0, 0, //69
+	0, 3, 0, 0, 0, 0, 0, 0, 4, 0, //79
+	0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	};
+const int Leon::bin2ntTab[5] = {'A', 'C', 'T', 'G', 'N'};
+
+
+template<typename T>
+void createDataset(tools::storage::impl::Group *  group, std::string datasetname, T data)
+{
+	tools::storage::impl::Storage::ostream os (*group, datasetname);
+	os.write (reinterpret_cast<char const*>(&data), sizeof(data));
+	os.flush();
+}
+
+
+
+template<typename T>
+void readDataset(tools::storage::impl::Group *  group, std::string datasetname, T & data)
+{
+	tools::storage::impl::Storage::istream is (*group, datasetname);
+	is.read (reinterpret_cast<char*> (&data),sizeof(data));
+}
+
+
+
+
+
+//Leon::Leon ( bool compress, bool decompress) :
+Leon::Leon () :
+Tool("leon"),
+_progress_decode(0),_generalModel(256),_inputBank(0),_anchorDictModel(5)
+{
+	_MCnoAternative = _MCuniqSolid = _MCuniqNoSolid = _totalDnaSize =  _compressedSize = _readCount = _MCtotal = _nb_thread_living = 0;
+	_compressed_qualSize = _anchorDictSize = _MCmultipleSolid = _anchorAdressSize = _readWithoutAnchorCount = _anchorPosSize = 0;
+	_input_qualSize = _total_nb_quals_smoothed = _otherSize =  _readSizeSize =  _bifurcationSize =  _noAnchorSize = 0;
+	_lossless = false;
+	_storageH5file = 0;
+	_bloom = 0;
+	
+	_isFasta = true;
+	_maxSequenceSize = 0;
+	_minSequenceSize = INT_MAX;
+	std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+
+    //_kmerSize(27)
+	//_compress = compress;
+	//_decompress = decompress;
+
+	/** We don't want default options of Tool (or we want to put them at a specific location). */
+	setParser (new OptionsParser ("leon"));
+
+    getParser()->push_back (new OptionOneParam (STR_URI_FILE, "input file (e.g. FASTA/FASTQ for compress or .leon file for decompress)",   true));
+    getParser()->push_back (new OptionNoParam  ("-c", "compression",   false));
+    getParser()->push_back (new OptionNoParam  ("-d", "decompression", false));
+    getParser()->push_back (new OptionOneParam (STR_NB_CORES, "number of cores (default is the available number of cores)", false, "0"));
+    getParser()->push_back (new OptionOneParam (STR_VERBOSE,  "verbosity level",                                            false, "1", false),0,false);
+
+    getParser()->push_back (new OptionOneParam ("-reads",     "number of reads per block (default is 50000)",               false, "50000", false),0,false);
+	
+	getParser()->push_back (new OptionNoParam  ("-lossless", "switch to lossless compression for qualities (default is lossy. lossy has much higher compression rate, and the loss is in fact a gain. lossy is better!)",   false));
+
+	
+    IOptionsParser* compressionParser = new OptionsParser ("compression");
+
+    /** We add the sorting count options and hide all of them by default and display one some of them. */
+    compressionParser->push_back (SortingCountAlgorithm<>::getOptionsParser(), 1, false);
+
+    if (IOptionsParser* input = compressionParser->getParser (STR_URI_INPUT))  {  input->setName (STR_URI_FILE);  }
+    if (IOptionsParser* input = compressionParser->getParser (STR_KMER_SIZE))  {  input->setVisible (true);  }
+
+    compressionParser->push_back (new OptionOneParam(STR_KMER_ABUNDANCE, "abundance threshold for solid kmers (default inferred)", false));
+	compressionParser->push_back (new OptionNoParam  (STR_INIT_ITER, "init iterator for ibank mode", false));
+
+	compressionParser->push_back (new OptionNoParam (Leon::STR_DNA_ONLY, "store dna seq only, header and quals are discarded, will decompress to fasta (same as -noheader -noqual)", false));
+
+	compressionParser->push_back (new OptionNoParam (Leon::STR_NOHEADER, "discard header", false));
+	compressionParser->push_back (new OptionNoParam (Leon::STR_NOQUAL, "discard quality scores", false));
+
+    IOptionsParser* decompressionParser = new OptionsParser ("decompression");
+    decompressionParser->push_back (new OptionNoParam (Leon::STR_TEST_DECOMPRESSED_FILE, "check if decompressed file is the same as original file (both files must be in the same folder)", false));
+	
+
+	_subgroupInfoCollection = NULL;
+	 _groupLeon = _subgroupQual = _subgroupInfo = _subgroupDict = _subgroupDNA =  _subgroupHeader = NULL;
+
+	
+    getParser()->push_back (compressionParser);
+    getParser()->push_back (decompressionParser, 0, false);
+
+	pthread_mutex_init(&findAndInsert_mutex, NULL);
+	pthread_mutex_init(&writeblock_mutex, NULL);
+	pthread_mutex_init(&minmax_mutex, NULL);
+
+	
+}
+
+Leon::~Leon ()
+{
+	setInputBank (0);
+	
+	if(_storageH5file !=0)
+		delete _storageH5file;
+	
+	if (_progress_decode)  { delete _progress_decode; }
+}
+
+void Leon::execute()
+{
+	_time = clock(); //Used to calculate time taken by decompression
+	
+	gettimeofday(&_tim, NULL);
+	 _wdebut_leon = _tim.tv_sec +(_tim.tv_usec/1000000.0);
+	
+	_iterator_mode=false;
+	if(getParser()->saw (STR_INIT_ITER))
+		_iterator_mode = true;
+	
+	if(getParser()->saw ("-lossless"))
+		_lossless = true;
+		
+    _compress = false;
+    _decompress = false;
+    if(getParser()->saw (Leon::STR_COMPRESS)) _compress = true;
+    if(getParser()->saw (Leon::STR_DECOMPRESS)) _decompress = true;
+	if((_compress && _decompress) || (!_compress && !_decompress)){
+		cout << "Choose one option among -c (compress) or -d (decompress)" << endl << endl;
+		return;
+	}
+
+	//getParser()->displayWarnings(); //pb si ici, affiche warnings apres exec dsk ,et prob option -c -d qui sont pas dans le parser car 'globales'
+	
+   // u_int64_t total_nb_solid_kmers_in_reads = 0;
+   // int nb_threads_living;
+    _nb_cores = getInput()->getInt(STR_NB_CORES);
+    
+    setReadPerBlock(getInput()->getInt("-reads"));
+    
+	//setup global
+	for(int i=0; i<CompressionUtils::NB_MODELS_PER_NUMERIC; i++){
+		_numericModel.push_back(Order0Model(256));
+	}
+	
+	if(_compress){
+		//#define SERIAL
+		executeCompression();
+	}
+	else{
+		executeDecompression();
+	}
+	
+
+        
+    
+    //outputFile->flush();
+
+    /*************************************************/
+    // We gather some statistics.
+    /*************************************************/
+    //getInfo()->add (1, "result");
+    //getInfo()->add (2, "nb solid kmers in reads", "%ld", total_nb_solid_kmers_in_reads);
+    
+    if(_decompress){
+	//	delete _inputFile;
+		if(! _iterator_mode)
+		{
+			delete _outputFile;
+		}
+		//if(! _isFasta) delete _inputFileQual;
+		delete _bloom;
+	}
+    
+}
+
+void Leon::createBloom (){
+    TIME_INFO (getTimeInfo(), "fill bloom filter");
+	
+	//u_int64_t solidFileSize
+	
+	int _auto_cutoff = 0 ;
+	u_int64_t nbs = 0 ;
+	u_int64_t nb_kmers_infile;
+	
+	//cout << _dskOutputFilename << endl;
+	Storage* storage = StorageFactory(STORAGE_HDF5).load (_dskOutputFilename);
+	LOCAL (storage);
+	
+	Partition<kmer_count> & solidCollection = storage->root().getGroup("dsk").getPartition<kmer_count> ("solid");
+	
+	/** We get the number of solid kmers. */
+   // u_int64_t solidFileSize = solidCollection.getNbItems();
+	
+	nb_kmers_infile = solidCollection.getNbItems();
+	//(System::file().getSize(_dskOutputFilename) / sizeof (kmer_count)); //approx total number of kmer
+
+	if( ! getParser()->saw(STR_KMER_ABUNDANCE)){
+		
+		//retrieve cutoff
+		
+		Collection<NativeInt64>& cutoff  = storage->getGroup("histogram").getCollection<NativeInt64> ("cutoff");
+		Iterator<NativeInt64>* iter = cutoff.iterator();
+		LOCAL (iter);
+		for (iter->first(); !iter->isDone(); iter->next())  {
+			_auto_cutoff = iter->item().toInt();
+		}
+		//////
+		
+		//retrieve nb solids
+		
+		Collection<NativeInt64>& storagesolid  = storage->getGroup("histogram").getCollection<NativeInt64> ("nbsolidsforcutoff");
+		Iterator<NativeInt64>* iter2 = storagesolid.iterator();
+		LOCAL (iter2);
+		for (iter2->first(); !iter2->isDone(); iter2->next())  {
+			nbs = iter2->item().toInt();
+		}
+		//////
+		
+		_nks = _auto_cutoff;
+
+		//printf("\tcutoff auto: %i  \n",_nks);
+
+	}
+	else
+	{
+		_auto_cutoff =0;
+		nbs  = nb_kmers_infile;
+	//	printf("\tcutoff user: %i (total solids %lli) \n",_nks,nbs);
+	}
+	
+	
+	
+
+
+	
+	
+    //double lg2 = log(2);
+    //float NBITS_PER_KMER = log (16*_kmerSize*(lg2*lg2))/(lg2*lg2);
+    int NBITS_PER_KMER = 12;
+    
+	
+    u_int64_t estimatedBloomSize = (u_int64_t) ((double)nbs * NBITS_PER_KMER);
+    if (estimatedBloomSize ==0 ) { estimatedBloomSize = 1000; }
+    
+    
+    //printf("raw solidFileSize %llu fsize %llu    %lu %lu \n",System::file().getSize(_solidFile), solidFileSize,sizeof (kmer_type),sizeof (kmer_count));
+    
+    /** We create the kmers iterator from the solid file. */
+//    Iterator<kmer_count>* itKmers = createIterator<kmer_count> (
+//                                                                new IteratorFile<kmer_count>(_dskOutputFilename),
+//                                                                nb_kmers_infile,
+//                                                                "fill bloom filter"
+//                                                                );
+	
+	/** We create the kmers iterator from the solid file. */
+    Iterator<kmer_count>* itKmers = createIterator<kmer_count> (
+																solidCollection.iterator(),
+																nb_kmers_infile,
+																"fill bloom filter"
+																);
+    LOCAL (itKmers);
+
+	
+	
+
+	
+    /** We instantiate the bloom object. */
+    //BloomBuilder<> builder (estimatedBloomSize, 7,tools::collections::impl::BloomFactory::CACHE,getInput()->getInt(STR_NB_CORES));
+    //cout << "ESTIMATED:" << estimatedBloomSize << endl;
+    //_bloomSize = estimatedBloomSize;
+	
+    if(_auto_cutoff){
+		    getInfo()->add (0, "Abundance threshold");
+        getInfo()->add (1, "cut-off (auto)", "%d", _auto_cutoff);
+        getInfo()->add (1, "nb solid kmers", "%d", nbs);
+    }
+    else{
+        getInfo()->add (0, "Abundance threshold");
+        getInfo()->add (1, "cut-off", "%d", _nks);
+        getInfo()->add (1, "nb solid kmers", "%d", nbs);
+    }
+    	
+	//modif ici pour virer les kmers < auto cutoff
+    BloomBuilder<> builder (estimatedBloomSize, 7,_kmerSize,tools::misc::BLOOM_NEIGHBOR,getInput()->getInt(STR_NB_CORES),_auto_cutoff);
+    _bloom = builder.build (itKmers); // BLOOM_NEIGHBOR // BLOOM_CACHE
+
+
+}
+
+
+
+void Leon::executeCompression(){
+	
+	
+	
+	
+	#ifdef PRINT_DEBUG
+		cout << "Start compression" << endl;
+	#endif
+
+    _kmerSize      = getInput()->getInt (STR_KMER_SIZE);
+    _nks      = getInput()->get(STR_KMER_ABUNDANCE) ? getInput()->getInt(STR_KMER_ABUNDANCE) : 3;
+	//_nks           = getInput()->getInt (STR_KMER_ABUNDANCE);
+    _inputFilename = getInput()->getStr (STR_URI_FILE);
+    
+	#ifdef PRINT_DEBUG
+		cout << "\tInput filename: " << _inputFilename << endl;
+	#endif
+	
+	u_int8_t infoByte = 0;
+	
+	
+	/** We look for the beginnin of the suffix. */
+	int lastindex = _inputFilename.find_last_of (".");
+	
+	/** We build the result. */
+	string extension = _inputFilename.substr(lastindex+1);
+	
+	_noHeader =false;
+
+	
+	if(getParser()->saw (Leon::STR_NOHEADER))
+	{
+		_noHeader = true;
+		infoByte |= 0x02; //no header
+	}
+	
+	if(getParser()->saw (Leon::STR_NOQUAL))
+	{
+		_isFasta = true;
+		infoByte |= 0x01; //fasta mode == no quals
+	}
+	
+	
+	if(getParser()->saw (Leon::STR_DNA_ONLY))
+	{
+		_noHeader = true;
+		_isFasta = true;
+
+		infoByte |= 0x02; //no header
+		infoByte |= 0x01; //fasta mode == no quals
+
+	}
+
+
+    //_inputBank = Bank::singleton().createBank(_inputFilename);
+	setInputBank (Bank::open(_inputFilename));
+	
+	//cout << Bank::getType(_inputFilename) << endl;
+	
+	
+      if(_inputFilename.find(".fq") !=  string::npos || _inputFilename.find(".fastq") !=  string::npos)
+	{
+		getInfo()->add (0, "Input format: FastQ");
+		
+		if(! getParser()->saw (Leon::STR_DNA_ONLY) && ! getParser()->saw (Leon::STR_NOQUAL))
+		{
+			
+			if (_lossless)
+          getInfo()->add (0, "Quality compression: LOSSLESS mode");
+       else
+          getInfo()->add (0, "Quality compression: lossy mode (use '-lossless' for lossless compression)");
+			
+			_isFasta = false;
+			
+		}
+		
+		
+	}
+	//attentio a l ordre, ".fa" est aussi present dans .fastq
+	else if (_inputFilename.find(".fa") !=  string::npos || _inputFilename.find(".fasta") !=  string::npos) {
+		getInfo()->add (0, "Input format: FastA");
+		infoByte |= 0x01;
+		_isFasta = true;
+		
+	}
+	else
+	{
+		getInfo()->add (0, "Input format: unknown. Input extension must be one among fasta (.fa, .fasta) or fastq (.fq, .fastq)");
+		return;
+	}
+	
+
+	
+	std::string leonversion = Stringify::format ("%i.%i.%i", LEON_VERSION_MAJOR, LEON_VERSION_MINOR,LEON_VERSION_PATCH);
+	
+	
+    //Redundant from dsk solid file !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    _dskOutputFilename = getInput()->get(STR_URI_OUTPUT) ?
+        getInput()->getStr(STR_URI_OUTPUT) + ".h5"  :
+        System::file().getBaseName (_inputFilename) + ".h5"; //_inputFilename instead of prefix GR
+
+#if 1
+
+    /*************************************************/
+    // Sorting count part
+    /*************************************************/
+
+    {
+        /** We create a DSK instance and execute it. */
+        SortingCountAlgorithm<> sortingCount (_inputBank, getInput());
+
+        sortingCount.getInput()->add (0, STR_VERBOSE, getInput()->getStr(STR_VERBOSE));
+
+        // best compression ratio if min-abundance never below 4 (ie. each kmer of the graph is used by at least 4 reads)
+        getInput()->setInt (STR_KMER_ABUNDANCE_MIN_THRESHOLD, 4);
+
+        sortingCount.execute();
+    }
+
+#endif
+
+    /*************************************************/
+    // We create the modified file
+    /*************************************************/
+    
+    string dir = System::file().getDirectory(_inputFilename);
+    string prefix = System::file().getBaseName(_inputFilename);
+    //_outputFilename = dir + "/" + System::file().getBaseName(prefix) + ".leon";
+	string baseOutputname;
+	if(extension.find("gz") !=string::npos)
+	{
+		baseOutputname = dir + "/" + System::file().getBaseName(_inputFilename) ;
+	}
+	else
+	{
+		baseOutputname = _inputFilename;
+	}
+	_outputFilename = baseOutputname + ".leon";
+
+//	_outputFile = System::file().newFile(_outputFilename, "wb");
+	
+	_storageH5file = StorageFactory(STORAGE_HDF5).create (_outputFilename, true, false,true);
+
+	_groupLeon    = new tools::storage::impl::Group((*_storageH5file)().getGroup      ("leon"));
+	_subgroupInfo = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("metadata"));
+	_subgroupDict = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("leon/anchors"));
+	_subgroupDNA  = new tools::storage::impl::Group((*_storageH5file)().getGroup    ("leon/dna"));
+
+	if(! _isFasta)
+		_subgroupQual  = new tools::storage::impl::Group((*_storageH5file)().getGroup    ("leon/qual"));
+
+	
+	_subgroupHeader  = new tools::storage::impl::Group((*_storageH5file)().getGroup    ("leon/header"));
+
+	
+	
+	
+	
+	_subgroupInfoCollection = & _subgroupInfo->getCollection<math::NativeInt8> ("infobyte");
+
+	
+	
+	if(_isFasta)
+		_subgroupInfoCollection->addProperty ("type","fasta");
+	else
+		_subgroupInfoCollection->addProperty ("type","fastq");
+	
+	
+	if(_noHeader)
+		_subgroupInfoCollection->addProperty ("header","false");
+	else
+		_subgroupInfoCollection->addProperty ("header","true");
+
+
+	_subgroupInfoCollection->addProperty ("version",leonversion);
+
+	
+	//making a block here so that ostream is immediately destroyed
+	//otherwise bug since the referred to _subgroupInfo is destroyed in endcommpression
+	//(I do not want to destroy _subgroupInfo in leon destructor, otherwise  compression will not be flushed until leon object is destroyed, bad behavior whan compression used within code)
+	{
+		tools::storage::impl::Storage::ostream osInfo (*_subgroupInfo, "infobyte");
+		osInfo.write (reinterpret_cast<char const*>(&infoByte), sizeof(infoByte));
+		osInfo.flush();
+		
+		tools::storage::impl::Storage::ostream osk (*_subgroupInfo, "kmerSize");
+		osk.write (reinterpret_cast<char const*>(&_kmerSize), sizeof(_kmerSize));
+		osk.flush();
+	}
+	
+	
+	if(! _isFasta)
+	{
+		//_FileQualname = baseOutputname + ".qual";
+		//_FileQual = System::file().newFile(_FileQualname, "wb");
+		//_Qual_outstream  =  new tools::storage::impl::Storage::ostream  (*_groupLeon, "qualities");
+	}
+
+
+	
+
+	
+#ifdef PRINT_DEBUG
+	cout << "\tOutput filename: " << _outputFilename << endl;
+	cout << "prefix " << prefix << endl;
+	cout << "dir " << dir << endl;
+	cout << "dskout  " << _dskOutputFilename << endl;
+#endif
+
+	
+	
+    //Compression
+	if(! _noHeader)
+	{
+		startHeaderCompression();
+	}
+	
+	
+
+
+
+	startDnaCompression();
+	
+
+	
+	
+	endCompression();
+}
+
+
+void Leon::endQualCompression(){
+
+
+	_qualCompRate = ((double)_compressed_qualSize / _input_qualSize);
+
+	
+}
+
+
+void Leon::writeBlockLena(u_int8_t* data, u_int64_t size, int encodedSequenceCount,u_int64_t blockID){
+
+
+	z_stream zs;
+	memset(&zs, 0, sizeof(zs));
+	
+	//deflateinit2 to be able to gunzip it fro mterminal
+	
+	//if(deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
+		//			(15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK)
+	
+	
+			if (deflateInit(&zs, Z_BEST_COMPRESSION) != Z_OK)
+		throw Exception ("deflateInit failed while compressing.");
+	
+	zs.next_in = (Bytef*) data ;
+	zs.avail_in = size ;           // set the z_stream's input
+	
+	int ret;
+	char outbuffer[32768];
+	std::string outstring;
+	
+	// retrieve the compressed bytes blockwise
+	do {
+		zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
+		zs.avail_out = sizeof(outbuffer);
+		
+		ret = deflate(&zs, Z_FINISH);
+		
+		if (outstring.size() < zs.total_out) {
+			// append the block to the output string
+			outstring.append(outbuffer,
+							 zs.total_out - outstring.size());
+		}
+	} while (ret == Z_OK);
+	
+	deflateEnd(&zs);
+	
+	/////////////////
+
+	
+	pthread_mutex_lock(&writeblock_mutex);
+	
+	std::string datasetname = Stringify::format ("qual_%i",blockID);
+	
+	tools::storage::impl::Storage::ostream os (*_subgroupQual, datasetname);
+	os.write (reinterpret_cast<char const*>( outstring.data()), outstring.size());
+	os.flush();
+
+	std::string dsize = Stringify::format ("%i",outstring.size());
+	auto _tempcollec = & _subgroupQual->getCollection<math::NativeInt8> (datasetname);
+	_tempcollec->addProperty ("size",dsize);
+
+	
+	_input_qualSize += size;
+	_compressed_qualSize +=  outstring.size();
+	
+//	if ((2*(blockID+1)) > _qualBlockSizes.size() )
+//	{
+//		_qualBlockSizes.resize(2*(blockID+1));
+//	}
+//	
+//	_qualBlockSizes[2*blockID] =  outstring.size();
+//	_qualBlockSizes[2*blockID+1] = encodedSequenceCount;
+	
+	
+	pthread_mutex_unlock(&writeblock_mutex);
+
+	
+	
+}
+
+void Leon::writeBlock(u_int8_t* data, u_int64_t size, int encodedSequenceCount,u_int64_t blockID, bool Header){
+	if(size <= 0) return;
+	
+	
+	//cout << "\t-----------------------" << endl;
+	//printf("____ write block %i ____ \n",blockID);
+	//cout << "\tWrite block " << _blockSizes.size() << endl;
+	//cout << "\tSequence " << encoder->_lastSequenceIndex-READ_PER_BLOCK << " - " << encoder->_lastSequenceIndex << endl;
+	//cout << "Thread id: " << thread_id << endl;
+	//cout << "\tEncoded size (byte): " << size << endl;
+	
+	
+	
+	pthread_mutex_lock(&writeblock_mutex);
+
+	if(Header)
+	{
+		std::string datasetname = Stringify::format ("header_%i",blockID);
+		
+		tools::storage::impl::Storage::ostream os (*_subgroupHeader, datasetname);
+		os.write (reinterpret_cast<char const*>( data), size);
+		os.flush();
+		
+		std::string dsize = Stringify::format ("%i",size);
+		auto _tempcollec = & _subgroupHeader->getCollection<math::NativeInt8> (datasetname);
+		_tempcollec->addProperty ("size",dsize);
+	}
+	
+	
+	if(!Header)
+	{
+		std::string datasetname = Stringify::format ("dna_%i",blockID);
+		
+		tools::storage::impl::Storage::ostream os (*_subgroupDNA, datasetname);
+		os.write (reinterpret_cast<char const*>( data), size);
+		os.flush();
+		
+		std::string dsize = Stringify::format ("%i",size);
+		auto _tempcollec = & _subgroupDNA->getCollection<math::NativeInt8> (datasetname);
+		_tempcollec->addProperty ("size",dsize);
+	}
+	
+	_compressedSize += size;
+
+	//int thread_id = encoder->getId();
+
+	if ((2*(blockID+1)) > _blockSizes.size() )
+	{
+		_blockSizes.resize(2*(blockID+1));
+	}
+	
+	_blockSizes[2*blockID] = size ;
+	_blockSizes[2*blockID+1] = encodedSequenceCount;
+	
+	
+	pthread_mutex_unlock(&writeblock_mutex);
+	
+}
+		
+void Leon::endCompression(){
+	//_rangeEncoder.flush();
+	//_outputFile->fwrite(_rangeEncoder.getBuffer(true), _rangeEncoder.getBufferSize(), 1);
+	
+	//tools::storage::impl::Storage::ostream osInfo (*_groupLeon, STR_DATA_INFO);
+
+	//osInfo.write (reinterpret_cast<char const*>(_rangeEncoder.getBuffer(true)), _rangeEncoder.getBufferSize()*sizeof(char));
+	//osInfo.flush();
+
+	
+	
+//	printf("_rangeEncoder buffer size %i B \n",_rangeEncoder.getBufferSize());
+//	_outputFile->flush();
+	
+	u_int64_t inputFileSize = System::file().getSize(_inputFilename.c_str());
+    getInfo()->add(0, "End compression");
+    getInfo()->add(1, "Input file");
+    getInfo()->add(2, "name", "%s", _inputFilename.c_str());
+    getInfo()->add(2, "size", "%d bytes (%ld Mb)", inputFileSize, inputFileSize/1024LL/1024LL);
+	
+	u_int64_t outputFileSize = System::file().getSize(_outputFilename.c_str());
+	
+    getInfo()->add(1, "Output file");
+	getInfo()->add(2, "name", "%s", _outputFilename.c_str());
+    getInfo()->add(2, "size", "%d bytes (%ld Mb)", outputFileSize, outputFileSize/1024LL/1024LL);
+	
+    getInfo()->add(1, "Compression");
+    gettimeofday(&_tim, NULL);
+    _wfin_leon  = _tim.tv_sec +(_tim.tv_usec/1000000.0);
+    
+    getInfo()->add(2, "Time:",  "%.2f seconds", (  _wfin_leon - _wdebut_leon) );
+    getInfo()->add(2, "Speed:",  "%.2f Mb/seconds", (System::file().getSize(_inputFilename)/1000000.0) / (  _wfin_leon - _wdebut_leon) );
+    getInfo()->add(2, "Rates");
+    getInfo()->add(3, "overall", "%.4f (%.4f)",
+                   (float)((double)outputFileSize / (double)inputFileSize),
+                   (float)((double)inputFileSize / (double)outputFileSize ));
+	if(! _noHeader)
+	{
+        getInfo()->add(3, "header only", "%.4f (%.4f)",
+                       (float)_headerCompRate,
+                       (float) ((double)1/_headerCompRate));
+	}
+	else
+	{
+		getInfo()->add(3, "header completely discarded in '-seq-only' mode");
+	}
+    getInfo()->add(3, "Sequence only", "%.4f (%.4f)",
+                   (float)_dnaCompRate,
+                   (float)((double)1/_dnaCompRate));
+	if( ! _isFasta)
+	{
+        getInfo()->add(3, "Quality only", "%.4f (%.4f) [%s mode]",
+                       (float)_qualCompRate,
+                       (float)((double)1/_qualCompRate),
+                       _lossless?"lossless":"lossy");
+	}
+	
+	delete  _groupLeon;
+	delete  _subgroupInfo;
+	delete _subgroupDict;
+	delete _subgroupDNA;
+	if(! _isFasta)
+		delete _subgroupQual;
+	delete _subgroupHeader;
+	
+	if(_storageH5file !=0)
+	{
+		delete _storageH5file;
+		_storageH5file =0;
+	}
+	
+
+	
+	
+	
+	//printf("\tTime: %.2fs\n", (double)(clock() - _time)/CLOCKS_PER_SEC);
+	//printf("\tSpeed: %.2f mo/s\n", (System::file().getSize(_inputFilename)/1000000.0) / ((double)(clock() - _time)/CLOCKS_PER_SEC));
+}
+		
+		
+
+
+
+
+void Leon::startHeaderCompression(){
+    Iterator<Sequence>* itSeq = createIterator<Sequence> (
+                                                          _inputBank->iterator(),
+                                                          _inputBank->estimateNbItems(),
+                                                          "Compressing headers"
+                                                          );
+    LOCAL(itSeq);
+    
+    
+	_totalHeaderSize = 0;
+	_compressedSize = 0;
+	
+	#ifdef PRINT_DEBUG
+		cout << endl << "Start header compression" << endl;
+    #endif
+    
+    //write first header to file and store it in _firstHeader variable
+	//ifstream inputFileTemp(getInput()->getStr(STR_URI_FILE).c_str(), ios::in);
+	//getline(inputFileTemp, _firstHeader);   //should be get comment from itseq
+	//inputFileTemp.close();
+	itSeq->first();
+	_firstHeader = itSeq->item().getComment();
+	_firstHeader.erase(_firstHeader.begin());
+	itSeq->reset();
+
+	#ifdef PRINT_DEBUG
+		cout << "\tFirst Header: " << _firstHeader << endl;
+		cout << "\tSize: " << _firstHeader.size() << endl;
+	#endif
+	
+	_totalHeaderSize += _firstHeader.size();
+	
+	//encode the size of the first header on 2 byte and the header itself
+	//CompressionUtils::encodeNumeric(_rangeEncoder, _numericModel, _firstHeader.size());
+	
+	//for(int i=0; i < _firstHeader.size(); i++){
+	//	_rangeEncoder.encode(_generalModel, _firstHeader[i]);
+	//}
+	
+	
+	createDataset(_subgroupHeader,"firstheadersize",_firstHeader.size());
+	
+	tools::storage::impl::Storage::ostream osH (*_subgroupHeader, "firstheader");
+	osH.write (reinterpret_cast<char const*>(_firstHeader.data()), _firstHeader.size());
+	osH.flush();
+	
+	
+	
+	//_rangeEncoder.flush();
+	//_totalHeaderCompressedSize += _rangeEncoder.getBufferSize();
+	//_outputFile->fwrite(_rangeEncoder.getBuffer(), _rangeEncoder.getBufferSize(), 1);
+	//_rangeEncoder.clear();
+	
+	//cout << "Block start pos: " << _outputFile->tell() << endl;
+	
+	//iterate on read sequences and compress headers
+	TIME_INFO (getTimeInfo(), "header compression");
+
+	//int nb_threads_living = 0 ;
+	
+	#ifdef SERIAL
+		setDispatcher (new SerialDispatcher());
+	#else
+		setDispatcher (  new Dispatcher (_nb_cores) );
+	#endif
+
+	//getDispatcher()->iterate (itSeq,  HeaderEncoder(this, &nb_threads_living), 10000);
+	getDispatcher()->iterate (itSeq,  HeaderEncoder(this), this->getReadPerBlock());
+	endHeaderCompression();
+}
+
+
+
+
+void Leon::endHeaderCompression(){
+	//u_int64_t descriptionStartPos = _outputFile->tell();
+	//cout << "Description start pos: " << descriptionStartPos << endl;
+	
+	//CompressionUtils::encodeNumeric(_rangeEncoder, _numericModel, _blockSizes.size());
+	//for(int i=0; i<_blockSizes.size(); i++){
+		//cout << "block size: " << _blockSizes[i] << endl;
+	//	CompressionUtils::encodeNumeric(_rangeEncoder, _numericModel, _blockSizes[i]);
+	//}
+	
+
+	createDataset(_subgroupHeader,"nb_blocks",_blockSizes.size());
+
+	getInfo()->add(0, "End Header compression");
+  getInfo()->add(1, "# blocks", "%i", _blockSizes.size());
+	tools::storage::impl::Storage::ostream os (*_subgroupHeader, "blocksizes");
+	os.write (reinterpret_cast<char const*>(_blockSizes.data()), _blockSizes.size()*sizeof(u_int64_t));
+	os.flush();
+	
+
+		
+	_headerCompRate = ((double)_compressedSize / _totalHeaderSize);
+	
+	//cout << "\t\tData blocks count: " << _blockSizes.size() << endl;
+	//cout << "\tBlock data size: " << _rangeEncoder.getBufferSize() << endl;
+  getInfo()->add(1, "headers size", "%u", _totalHeaderSize);
+  getInfo()->add(1, "headers compressed size", "%u", _compressedSize);
+  getInfo()->add(1, "compression rate", "%.4f", (float)(_headerCompRate));
+	//_rangeEncoder.clear();
+	_blockSizes.clear();
+}
+
+
+void Leon::startDnaCompression(){
+	#ifdef PRINT_DEBUG
+		cout << endl << "Start reads compression" << endl;
+    #endif
+    
+	
+
+	//Create and fill bloom
+    createBloom ();
+   // LOCAL (_bloom); //now we need it later
+    
+	int64_t nbestimated = _inputBank->estimateNbItems();
+	
+
+
+//	_anchorKmers = new Hash16<kmer_type, u_int32_t > ( (nbestimated/10) *  sizeof(u_int32_t)  *10LL /1024LL / 1024LL ); // hmm  Hash16 would need a constructor with sizeof main entry //maybe *2 for low coverage dataset
+	u_int64_t nbcreated ;
+	_anchorKmers = new Hash16<kmer_type, u_int32_t > ( nbestimated/10 , &nbcreated ); //creator with nb entries given
+//	printf("asked %lli entries, got %llu \n",nbestimated/10 ,nbcreated);
+	
+    Iterator<Sequence>* itSeq = createIterator<Sequence> (
+                                                          _inputBank->iterator(),
+                                                          nbestimated,
+                                                          "Compressing dna"
+                                                          );
+    LOCAL(itSeq);
+    
+	//create a temporary output file to store the anchors dict
+	//_dictAnchorFile = System::file().newFile(_outputFilename + ".adtemp", "wb"); 
+	_dictAnchorFile = new ofstream((_outputFilename + ".adtemp").c_str(), ios::out|ios::binary);
+	
+	_lastAnchorValue = 0;
+	_anchorAdress = 0;
+	_totalDnaSize = 0;
+	//_totalDnaCompressedSize = 0;
+	_compressedSize = 0;
+	
+	//createKmerAbundanceHash();
+    
+	//iterate on read sequences and compress headers
+	TIME_INFO (getTimeInfo(), "DNA compression");
+
+	//int nb_threads_living = 0 ;
+	
+	#ifdef SERIAL
+		setDispatcher (new SerialDispatcher());
+	#else
+		setDispatcher (  new Dispatcher (_nb_cores) );
+	#endif
+
+	//getDispatcher()->iterate (itSeq,  HeaderEncoder(this, &nb_threads_living), 10000);
+	getDispatcher()->iterate (itSeq,  DnaEncoder(this), this->getReadPerBlock());
+	
+	endDnaCompression();
+	
+	if(! _isFasta)
+	{
+		endQualCompression();
+	}
+}
+
+
+void Leon::endDnaCompression(){
+	
+	
+	createDataset(_subgroupDNA,"nb_blocks",_blockSizes.size());
+	
+  getInfo()->add(0, "End Sequence compression");
+  getInfo()->add(1, "# blocks", "%u", _blockSizes.size());
+	tools::storage::impl::Storage::ostream os (*_subgroupDNA, "blocksizes");
+	os.write (reinterpret_cast<char const*>(_blockSizes.data()), _blockSizes.size()*sizeof(u_int64_t));
+	os.flush();
+
+	_blockSizes.clear();
+	
+	writeBloom();
+	writeAnchorDict();
+	
+	_dnaCompRate = ((double)_compressedSize / _totalDnaSize);
+	
+  getInfo()->add(1, "# sequences", "%u", _readCount);
+  getInfo()->add(1, "# nucleotides", "%u", _totalDnaSize);
+
+	createDataset(_subgroupInfo,"readcount",_readCount);
+	createDataset(_subgroupInfo,"totalDnaSize",_totalDnaSize);
+	createDataset(_subgroupInfo,"minSequenceSize",_minSequenceSize);
+	createDataset(_subgroupInfo,"maxSequenceSize",_maxSequenceSize);
+	
+  getInfo()->add(1, "Compression rates");
+  getInfo()->add(2, "overall", "%.4f (%u)", (float)_dnaCompRate, _compressedSize);
+
+  getInfo()->add(2, "Bloom", "%.2f (%u)", ((_bloom->getSize()*100) / (double)_compressedSize), _bloom->getSize());
+  getInfo()->add(2, "Anchors dict", "%.2f (%u) (%u entries)", ((_anchorDictSize*100) / (double)_compressedSize), _anchorDictSize, _anchorAdress);
+
+  u_int64_t readsSize = _anchorAdressSize+_anchorPosSize+_readSizeSize+_bifurcationSize+_otherSize;
+  getInfo()->add(2, "Reads", "%.2f (%u)", ((readsSize*100) / (double)_compressedSize), readsSize);
+  getInfo()->add(3, "Anchor adress", "%.2f (%u)", ((_anchorAdressSize*100) / (double)_compressedSize), _anchorAdressSize);
+  getInfo()->add(3, "Anchor pos", "%.2f (%u)", ((_anchorPosSize*100) / (double)_compressedSize), _anchorPosSize);
+  getInfo()->add(3, "Read size", "%.2f (%u)", ((_readSizeSize*100) / (double)_compressedSize), _readSizeSize);
+  getInfo()->add(3, "Bifurcation", "%.2f (%u)", ((_bifurcationSize*100) / (double)_compressedSize), _bifurcationSize);
+  getInfo()->add(3, "Other (N, error, infoBits)", "%.2f (%u)", ((_otherSize*100) / (double)_compressedSize), _otherSize);
+  getInfo()->add(2, "Read without anchor", "%.2f (%u)", ((_noAnchorSize*100) / (double)_compressedSize), _noAnchorSize);
+  
+  if(_anchorAdress!=0){
+  getInfo()->add(1, "Reads per anchor", "%u",  _readCount / _anchorAdress);
+  }
+  getInfo()->add(1, "Read without anchor", "%.2f", ((double)_readWithoutAnchorCount*100) / _readCount);
+  getInfo()->add(1, "De Bruijn graph");
+	
+	getInfo()->add(2, "Simple path", "%.2f", ((_MCuniqSolid*100)/ (double)_MCtotal));
+	getInfo()->add(2, "Bifurcation", "%.2f", ((_MCmultipleSolid*100)/(double)_MCtotal));
+	getInfo()->add(2, "Break", "%.2f", ((_MCnoAternative*100)/(double)_MCtotal));
+	getInfo()->add(2, "Error", "%.2f", ((_MCuniqNoSolid*100)/(double)_MCtotal));
+	
+
+	delete _anchorKmers;
+	System::file().remove(_dskOutputFilename);
+
+
+}
+
+void Leon::writeBloom(){
+	_compressedSize += _bloom->getSize();
+	
+
+	StorageTools::singleton().saveBloom<kmer_type> (_storageH5file->getGroup(this->getName()), "bloom", _bloom, _kmerSize);
+
+}
+
+
+
+void Leon::writeAnchorDict(){
+
+	_anchorRangeEncoder.flush();
+	
+	//todo check if the tempfile _dictAnchorFile may be avoided (with the use of hdf5 ?)
+	_dictAnchorFile->write( (const char*) _anchorRangeEncoder.getBuffer(), _anchorRangeEncoder.getBufferSize());
+	_dictAnchorFile->flush();
+	_dictAnchorFile->close();
+	_anchorRangeEncoder.clear();
+	
+	
+	u_int64_t size = System::file().getSize(_outputFilename + ".adtemp");
+	_anchorDictSize = size;
+	//u_int64_t size = _anchorRangeEncoder.getBufferSize();
+	_compressedSize += size;
+	
+
+	
+	createDataset(_subgroupDict,"size",size);
+	createDataset(_subgroupDict,"anchorAdress",_anchorAdress);
+
+	
+	//_dictAnchorFile->seeko(0, SEEK_SET);
+	//_outputFile->fwrite(_dictAnchorFile, size, 1);
+	ifstream tempFile((_outputFilename + ".adtemp").c_str(), ios::in|ios::binary);
+	
+	
+	
+	
+	int bufsize = 4096*8;
+	char * buffer = new char [bufsize];
+	
+	tools::storage::impl::Storage::ostream osD (*_subgroupDict, "anchorsDict");
+
+    while (tempFile.good()) {
+		tempFile.read(buffer, bufsize);
+       // _outputFile->fwrite(buffer, tempFile.gcount(), 1);
+		osD.write (reinterpret_cast<char const*>(buffer), tempFile.gcount());
+
+    }
+	
+	osD.flush();
+
+	tempFile.close();
+	remove((_outputFilename + ".adtemp").c_str());
+	delete [] buffer;
+
+}
+
+bool Leon::anchorExist(const kmer_type& kmer, u_int32_t* anchorAdress){
+	
+	if (_anchorKmers->get(kmer,anchorAdress)) //avec Hash16
+	{
+		return true;
+	}
+
+	return false;
+
+}
+
+
+
+void Leon::updateMinMaxSequenceSize(int newMin, int newMax)
+{
+	pthread_mutex_lock(&minmax_mutex);
+	_minSequenceSize = std::min(_minSequenceSize, newMin);
+	_maxSequenceSize = std::max(_maxSequenceSize, newMax);
+	pthread_mutex_unlock(&minmax_mutex);
+
+}
+
+int Leon::findAndInsertAnchor(const vector<kmer_type>& kmers, u_int32_t* anchorAdress){
+	
+	pthread_mutex_lock(&findAndInsert_mutex);
+
+		
+	//cout << "\tSearching and insert anchor" << endl;
+	int maxAbundance = -1;
+	int bestPos;
+	kmer_type bestKmer;
+	//int bestPos = -1;
+	
+
+	kmer_type kmer, kmerMin;
+	
+	/*
+	////////////
+	for(int i=0; i<kmers.size(); i++){
+		kmer = kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+		if(_bloom->contains(kmerMin)){
+			encodeInsertedAnchor(kmerMin);
+			_anchorKmers.insert(kmerMin, _anchorAdress);
+			*anchorAdress = _anchorAdress;
+			_anchorKmerCount += 1;
+			_anchorAdress += 1;
+			return i;
+		}
+	}
+	return -1;
+	/////////////////////*/
+
+
+	//int iMin = 40;
+	//int iMax = 60;
+	int iMin = kmers.size()/2;
+	int iMax = kmers.size()/2 + 10;
+	//cout << iMin << "  " << iMax << endl;
+	iMin = std::max(iMin, 0);
+	iMax = std::min(iMax, (int) kmers.size());
+
+	for(int i=iMin; i<iMax; i++){
+
+		kmer = kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+		if(_bloom->contains(kmerMin)){
+			maxAbundance = 0;
+			bestPos = i;
+			bestKmer = kmerMin;
+			break;
+		}
+	}
+
+	if(maxAbundance == -1){
+
+		for(int i=0; i<iMin; i++){
+			kmer = kmers[i];
+			kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+
+			if(_bloom->contains(kmerMin)){
+				maxAbundance = 0;
+				bestPos = i;
+				bestKmer = kmerMin;
+				break;
+			}
+		}
+
+
+		if(maxAbundance == -1){
+			for(unsigned int i=iMax; i<kmers.size(); i++){
+				kmer = kmers[i];
+				kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+				if(_bloom->contains(kmerMin)){
+					maxAbundance = 0;
+					bestPos = i;
+					bestKmer = kmerMin;
+					break;
+				}
+			}
+		}
+	}
+
+
+	/*
+	for(int i=0; i<kmers.size(); i++){
+
+		kmer = kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+
+		int abundance;
+		if(_kmerAbundance->get(kmerMin, &abundance)){
+			if(abundance > maxAbundance){
+				maxAbundance = abundance;// + ((kmers.size()-i)*2);
+				bestKmer = kmerMin;
+				bestPos = i;
+				//cout << maxAbundance << endl;
+				//cout << bestPos << " " << abundance << " " << kmer.toString(_kmerSize) << " " << revcomp(kmer, _kmerSize).toString(_kmerSize) << endl;
+			}
+			//cout << abundance << endl;
+		}
+		else if(maxAbundance == -1 && _bloom->contains(kmerMin)){
+			maxAbundance = _nks;
+			bestKmer = kmerMin;
+			bestPos = i;
+			//cout << maxAbundance << endl;
+		}
+	}*/
+	
+	if(maxAbundance == -1)
+	{
+		pthread_mutex_unlock(&findAndInsert_mutex);
+		return -1;
+	}
+
+	encodeInsertedAnchor(bestKmer);
+	
+	_anchorKmers->insert(bestKmer,_anchorAdress); //with Hash16
+	//_anchorKmers[bestKmer] = _anchorAdress;
+	//_anchorKmers.insert(bestKmer, _anchorAdress);
+		
+	
+	*anchorAdress = _anchorAdress;
+	//_anchorKmerCount += 1;
+	_anchorAdress += 1;
+	
+	/*
+	int val;
+	for(int i=0; i<kmers.size(); i++){
+		kmer = kmers[i];
+		kmerMin = min(kmer, revcomp(kmer, _kmerSize));
+		_kmerAbundance->remove(kmerMin, &val);
+		//_kmerAbundance->insert(kmerMin, val-1);
+	}*/
+
+	pthread_mutex_unlock(&findAndInsert_mutex);
+	return bestPos;
+}
+
+void Leon::encodeInsertedAnchor(const kmer_type& kmer){
+
+	//static int i = 0;
+	
+	string kmerStr = kmer.toString(_kmerSize);
+
+	for(unsigned int i=0; i<kmerStr.size(); i++){
+		_anchorRangeEncoder.encode(_anchorDictModel, Leon::nt2bin(kmerStr[i]));
+	}
+	//i+= 1;
+	//cout << i << endl;
+	if(_anchorRangeEncoder.getBufferSize() >= 4096){
+		_dictAnchorFile->write((const char*) _anchorRangeEncoder.getBuffer(), _anchorRangeEncoder.getBufferSize());
+		_anchorRangeEncoder.clearBuffer();
+	}
+}
+
+
+
+
+
+
+
+
+
+
+
+void * decoder_all_thread(void * args)
+{
+	
+	thread_arg_decoder * targ = (thread_arg_decoder*) args;
+	QualDecoder * qual_decoder = targ->qual_decoder;
+	DnaDecoder * dna_decoder = targ->dna_decoder;
+	HeaderDecoder * header_decoder = targ->header_decoder;
+	
+	if(qual_decoder!=NULL)
+		qual_decoder->execute();
+	
+	if(header_decoder!=NULL)
+		header_decoder->execute();
+
+	dna_decoder->execute();
+	
+	pthread_exit(0);
+}
+
+
+
+void * decoder_dna_thread(void * args)
+{
+	DnaDecoder * dna_decoder = (DnaDecoder*) args;
+	dna_decoder->execute();
+ 	pthread_exit(0);
+}
+
+void * decoder_qual_thread(void * args)
+{
+	QualDecoder * qual_decoder = (QualDecoder*) args;
+	qual_decoder->execute();
+	pthread_exit(0);
+}
+
+void Leon::executeDecompression(){
+	
+
+	_filePos = 0;
+	
+	#ifdef PRINT_DEBUG
+    if(!_iterator_mode){
+	  cout << "Start decompression" << endl;
+    }
+    #endif
+    
+    _inputFilename = getInput()->getStr(STR_URI_FILE);
+	//string inputFilename = prefix + ".txt"; //".leon"
+	//_outputFile = System::file().newFile(outputFilename, "wb");
+    
+    #ifdef PRINT_DEBUG
+    if(!_iterator_mode){
+	  cout << "\tInput filename: " << _inputFilename << endl;
+    }
+    #endif
+
+    if (!System::file().doesExist(_inputFilename)){
+        std::stringstream ss;
+        ss << "File not found: " << _inputFilename;
+        throw Exception (ss.str().c_str());
+    }
+    _storageH5file = StorageFactory(STORAGE_HDF5).create (_inputFilename,false,false,true); //open without adding extension h5
+	_groupLeon = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("leon"));
+	_subgroupInfo = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("metadata"));
+	_subgroupDict = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("leon/anchors"));
+	_subgroupDNA = new tools::storage::impl::Group((*_storageH5file)().getGroup   ("leon/dna"));
+	
+	
+
+	
+	_subgroupInfoCollection = & _subgroupInfo->getCollection<math::NativeInt8> ("infobyte");
+
+	
+	tools::storage::impl::Storage::istream isInfo (*_subgroupInfo, "infobyte");
+	
+	
+	
+	
+	
+	string dir = System::file().getDirectory(_inputFilename);
+	
+	//_inputFile = new ifstream(_inputFilename.c_str(), ios::in|ios::binary);
+	
+
+	
+	//remove .leon at the end :
+	string inputFilename_leon_removed = System::file().getBaseName(_inputFilename);
+
+	
+	//Go to the end of the file to decode blocks informations, data are read in reversed order (from right to left in the file)
+	//The first number is the number of data blocks
+
+	
+	
+	//Output file
+	string prefix = System::file().getBaseName(inputFilename_leon_removed); // for prefix need to remove two dots : .fastq.leon , but not all of them if another dot in the filename (it happened, mail from angry users)
+
+	_outputFilename = dir + "/" + prefix;
+	
+	//printf("_outputFilename %s \n",_outputFilename.c_str());
+
+	//Decode the first byte of the compressed file which is an info byte
+	u_int8_t infoByte;
+	//infoByte = _rangeDecoder.nextByte(_generalModel);
+	
+	
+	isInfo.read (reinterpret_cast<char*> (&infoByte),sizeof(infoByte));
+
+	
+
+
+
+	
+	//the first bit holds the file format. 0: fastq, 1: fasta
+	//_isFasta = ((infoByte & 0x01) == 0x01);
+	
+	
+	
+	//Second bit : option no header
+	//_noHeader = ((infoByte & 0x02) == 0x02);
+	
+	
+	
+	std::string  filetype = _subgroupInfoCollection->getProperty("type");
+	if(filetype == "fasta")
+		_isFasta = true;
+	else
+		_isFasta = false;
+	
+	std::string  headerinfo = _subgroupInfoCollection->getProperty("header");
+	if(headerinfo == "true")
+		_noHeader = false;
+	else
+		_noHeader = true;
+
+	//printf("%s %s \n",filetype.c_str(),headerinfo.c_str() );
+
+	
+	if(! _isFasta)
+		_subgroupQual  = new tools::storage::impl::Group((*_storageH5file)().getGroup    ("leon/qual"));
+	
+
+	_subgroupHeader  = new tools::storage::impl::Group((*_storageH5file)().getGroup    ("leon/header"));
+
+	
+	
+	//printf("info byte %i  _noHeader %i  _isFasta %i \n",infoByte,_noHeader,_isFasta);
+	
+	if(! _isFasta)
+	{
+		
+	//	_FileQualname =    dir + "/" +  System::file().getBaseName(inputFilename_leon_removed) + ".fastq.qual";
+	//	_inputFileQual = new ifstream(_FileQualname.c_str(), ios::in|ios::binary);
+	//	cout << "\tQual filename: " << _FileQualname << endl;
+	}
+	
+  if(!_iterator_mode){
+    getInfo()->add(0, "Decompression");
+    getInfo()->add(1, "Input filename", "%s", _inputFilename.c_str());
+  }
+
+	if(_noHeader)
+	{
+		if(!_iterator_mode)
+        getInfo()->add(1, "Headers were not stored, will number reads.");
+	}
+	
+	if(_isFasta){
+		if(!_iterator_mode)
+        getInfo()->add(1, "Output format", "FastA");
+		_outputFilename += ".fasta.d";
+	}
+	else{
+		if(!_iterator_mode)
+        getInfo()->add(1, "Output format", "FastQ");
+		_outputFilename += ".fastq.d";
+	}
+	
+	if(!_iterator_mode)
+		_outputFile = System::file().newFile(_outputFilename, "wb");
+	
+	
+	//Get kmer size
+	//_kmerSize = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+	
+	tools::storage::impl::Storage::istream isk (*_subgroupInfo, "kmerSize");
+	isk.read (reinterpret_cast<char*> (&_kmerSize),sizeof(_kmerSize));
+	
+	if(!_iterator_mode)
+	{
+  	getInfo()->add(1, "Kmer size", "%i", _kmerSize);
+	}
+
+	std::string  leonversion =  _subgroupInfoCollection->getProperty ("version");
+
+	if(!_iterator_mode)
+	  getInfo()->add(1, "Input File compressed with Leon", "%s", leonversion.c_str());
+
+	//cout << "\tInput File was compressed with leon version " << version_major << "."  << version_minor << "."  << version_patch  << endl;
+	
+	
+	//	if(version_major != LEON_VERSION_MAJOR || version_minor != LEON_VERSION_MINOR  || version_patch != LEON_VERSION_PATCH )
+	//	{
+	//		cout << "\tWarning diff version "   << endl;
+	//	}
+	
+	if(! _iterator_mode)
+	{
+		startDecompressionAllStreams();
+
+		endDecompression();
+	}
+
+	
+}
+
+void Leon::testing_iter(){
+	//printf("testing iterator \n");
+	
+	tools::dp::Iterator<Sequence>* iterl = new LeonIterator(*this);
+	
+	/*
+	iterl->first();
+	
+	std::cout << "[" << (*iterl)->getDataSize() << "] " << (*iterl)->getComment()  << std::endl;
+	std::cout << (*iterl)->toString() << std::endl;
+	
+	iterl->next();
+	std::cout << "[" << (*iterl)->getDataSize() << "] " << (*iterl)->getComment()  << std::endl;
+	std::cout << (*iterl)->toString() << std::endl;*/
+
+	for(iterl->first();!iterl->isDone();iterl->next())
+	{
+		//std::cout << "[" << (*iterl)->getDataSize() << "] " << (*iterl)->getComment()  << std::endl;
+		std::cout << (*iterl)->getComment() << std::endl;
+		std::cout << (*iterl)->toString() << std::endl;
+		std::cout << (*iterl)->getQuality() << std::endl;
+
+	}
+
+}
+
+void Leon::startDecompression_setup(){
+	
+	_filePosHeader = 0;
+	_filePosDna = 0;
+	
+	if(! _noHeader)
+	{
+		///////// header setup  /////////
+		
+		size_t firstHeaderSize;
+		readDataset(_subgroupHeader,"firstheadersize",firstHeaderSize);
+		
+		
+		char * tempS = (char * ) malloc(firstHeaderSize+1);
+		tools::storage::impl::Storage::istream isH (*_subgroupHeader, "firstheader");
+		isH.read (reinterpret_cast<char *>(tempS), firstHeaderSize);
+		
+		tempS[firstHeaderSize] = '\0';
+		_firstHeader = std::string(tempS);
+		free(tempS);
+		
+		
+		//setup header block sizes
+		size_t nb_blocks;
+		readDataset(_subgroupHeader,"nb_blocks",nb_blocks);
+		_headerBlockSizes.resize(nb_blocks,0);
+		
+		tools::storage::impl::Storage::istream is (*_subgroupHeader, "blocksizes");
+		is.read (reinterpret_cast<char *>(_headerBlockSizes.data()), _headerBlockSizes.size()*sizeof(u_int64_t));
+		////
+		
+	}
+	
+	
+	/////// dna setup ////////////
+	
+	//need to init _filePosDna here
+	for(unsigned int ii=0; ii<_headerBlockSizes.size(); ii+=2 )
+	{
+		_filePosDna += _headerBlockSizes[ii];
+	}
+	
+	//setup dna block sizes
+	size_t nb_blocks;
+	readDataset(_subgroupDNA,"nb_blocks",nb_blocks);
+	_blockCount = nb_blocks;
+	_dnaBlockSizes.resize(nb_blocks,0);
+	
+	tools::storage::impl::Storage::istream is (*_subgroupDNA, "blocksizes");
+	is.read (reinterpret_cast<char *>(_dnaBlockSizes.data()), _dnaBlockSizes.size()*sizeof(u_int64_t));
+	////
+	
+	_kmerModel = new KmerModel(_kmerSize);
+	
+	decodeBloom();
+	decodeAnchorDict();
+	
+	/////////// qualities setup //////////
+	if(! _isFasta)
+	{
+		_filePosQual =0;
+	}
+	///////////////
+	
+}
+
+
+void Leon::decoders_setup(){
+
+
+	
+	for(int i=0; i<_nb_cores; i++){
+		
+		if(! _isFasta)
+		{
+			//QualDecoder* qd = new QualDecoder(this, _FileQualname,_groupLeon);
+			QualDecoder* qd = new QualDecoder(this, "qualities",_subgroupQual);
+			
+			_qualdecoders.push_back(qd);
+		}
+		
+		DnaDecoder* dd = new DnaDecoder(this, _inputFilename, _subgroupDNA);
+		_dnadecoders.push_back(dd);
+		
+		if(! _noHeader)
+		{
+			//HeaderDecoder* hd = new HeaderDecoder(this, _inputFilename);
+			HeaderDecoder* hd = new HeaderDecoder(this, _inputFilename, _subgroupHeader);
+			
+			_headerdecoders.push_back(hd);
+		}
+	}
+	
+	
+	_tab_threads = new pthread_t [_nb_cores];
+	_targ = new thread_arg_decoder [_nb_cores];
+	
+}
+
+void Leon::decoders_cleanup(){
+	
+	for(unsigned int i=0; i<_dnadecoders.size(); i++){
+		delete _dnadecoders[i];
+	}
+	_dnadecoders.clear();
+	
+	for(unsigned int i=0; i<_headerdecoders.size(); i++){
+		delete _headerdecoders[i];
+	}
+	_headerdecoders.clear();
+	
+	for(unsigned int i=0; i<_qualdecoders.size(); i++){
+		delete _qualdecoders[i];
+	}
+	_qualdecoders.clear();
+}
+
+void Leon::decompressionDecodeBlocks(unsigned int & idx, int & livingThreadCount){
+
+
+	for(int j=0; j<_nb_cores; j++){
+		
+
+		if(idx >= _dnaBlockSizes.size()) break;
+		
+		int blockId = idx/2 ;
+
+		
+		u_int64_t blockSize;
+		int sequenceCount;
+		
+		livingThreadCount = j+1;
+		
+		QualDecoder* qdecoder;
+		HeaderDecoder* hdecoder;
+		DnaDecoder* ddecoder;
+		
+		//header decoder
+		if(! _noHeader)
+		{
+			blockSize = _headerBlockSizes[idx];
+			sequenceCount = _headerBlockSizes[idx+1];
+			hdecoder = _headerdecoders[j];
+			hdecoder->setup(_filePosHeader, blockSize, sequenceCount,blockId);
+			_filePosHeader += blockSize;
+		}
+		else
+		{
+			hdecoder= NULL;
+		}
+		
+		//dna decoder
+		blockSize = _dnaBlockSizes[idx];
+		sequenceCount = _dnaBlockSizes[idx+1];
+		ddecoder = _dnadecoders[j];
+		ddecoder->setup(_filePosDna, blockSize, sequenceCount,blockId);
+		_filePosDna += blockSize;
+		
+		//qual decoder setup
+		//here test if in fastq mode, put null pointer otherwise
+		if(! _isFasta)
+		{
+			qdecoder = _qualdecoders[j];
+			qdecoder->setup( blockId);
+		}
+		else
+		{
+			qdecoder= NULL;
+		}
+		
+		
+		_targ[j].qual_decoder = qdecoder;
+		_targ[j].dna_decoder = ddecoder;
+		_targ[j].header_decoder = hdecoder;
+		
+		pthread_create(&_tab_threads[j], NULL, decoder_all_thread, _targ + j);
+		
+		idx += 2;
+		
+		if(! _iterator_mode)
+			this->_progress_decode->inc(1);
+	}
+}
+void Leon::startDecompressionAllStreams(){
+	
+
+	startDecompression_setup();
+	
+	switch (getInput()->getInt(STR_VERBOSE))
+	{
+		case 0: default:    _progress_decode =  new IteratorListener ();break;
+		case 1:             _progress_decode = new ProgressSynchro ( new ProgressTimer ( _blockCount/2, "Decompressing all streams"), System::thread().newSynchronizer()   );break;
+			
+		case 2:             _progress_decode = new ProgressSynchro ( new Progress ( _blockCount/2, "Decompressing all streams"), System::thread().newSynchronizer()   );break;
+	}
+	
+	
+	getInfo()->add(1, "Block count", "%u", _blockCount/2);
+
+
+//	delete _progress_decode;
+//	_progress_decode = new ProgressSynchro ( new ProgressTimer ( _blockCount/2, "Decompressing all streams"), System::thread().newSynchronizer()   );
+//	_progress_decode = new ProgressSynchro ( new Progress ( _blockCount/2, "Decompressing all streams"), System::thread().newSynchronizer()   );
+
+	_progress_decode->init();
+	
+	
+	decoders_setup();
+	
+
+	unsigned int i = 0;
+	int livingThreadCount = 0;
+	
+	
+	
+	while(i < _dnaBlockSizes.size()){
+		
+		//decode blocks
+
+		decompressionDecodeBlocks(i,livingThreadCount); //this will increment i
+
+		for(int j=0; j < livingThreadCount; j++){
+			
+			pthread_join(_tab_threads[j], NULL);
+			
+			HeaderDecoder* hdecoder = NULL;
+			QualDecoder* qdecoder = NULL;
+			DnaDecoder* ddecoder = _dnadecoders[j];
+			
+
+			std::istringstream  * stream_qual = NULL;
+			std::istringstream  * stream_header = NULL;
+			std::istringstream  * stream_dna = NULL;
+
+			if(! _isFasta)
+			{
+				qdecoder = _qualdecoders[j];
+				stream_qual = new std::istringstream (qdecoder->_buffer);
+				qdecoder->_buffer.clear();
+			}
+			
+			if(! _noHeader)
+			{
+				hdecoder = _headerdecoders[j];
+				stream_header = new std::istringstream (hdecoder->_buffer);
+				hdecoder->_buffer.clear();
+			}
+			
+			stream_dna = new std::istringstream (ddecoder->_buffer);
+
+			ddecoder->_buffer.clear();
+
+			
+			std::string line;
+			std::string output_buff;
+
+			output_buff.reserve(this->getReadPerBlock() * 500);
+			
+			bool reading = true;
+			
+			
+			
+			u_int64_t readid=0;
+			while(reading){
+				
+				stringstream sint;
+				sint << readid;
+				
+				if( ! _noHeader)
+				{
+					if(getline(*stream_header, line)){
+						if(_isFasta)
+							output_buff += ">";
+						else
+							output_buff += "@";
+						
+						output_buff +=  line + '\n';
+					}
+					else
+						reading = false;
+				}
+				else
+				{
+					if(_isFasta)
+						output_buff += "> " + sint.str() + '\n';
+					else
+						output_buff += "@ " + sint.str() + '\n';
+					
+					readid++;
+				}
+				 
+				
+				
+				if(getline(*stream_dna, line)){
+					output_buff +=  line + '\n';
+				}
+				else
+					reading = false;
+				
+				
+				if( ! _isFasta)
+				{
+					if(getline(*stream_qual, line)){
+						output_buff += "+\n";
+						output_buff +=  line + '\n';
+					}
+					else
+						reading = false;
+				}
+				 
+			}
+			
+			 
+			_outputFile->fwrite(output_buff.c_str(), output_buff.size(), 1);
+
+			if(stream_qual!= NULL) delete  stream_qual;
+			if(stream_header!= NULL) delete  stream_header;
+			if(stream_dna!= NULL) delete  stream_dna;
+			
+			
+		}
+		
+		livingThreadCount = 0;
+	}
+	
+	
+	
+	_outputFile->flush();
+
+	for(unsigned int i=0; i<_dnadecoders.size(); i++){
+		delete _dnadecoders[i];
+	}
+	_dnadecoders.clear();
+	
+	for(unsigned int i=0; i<_headerdecoders.size(); i++){
+		delete _headerdecoders[i];
+	}
+	_headerdecoders.clear();
+	
+	for(unsigned int i=0; i<_qualdecoders.size(); i++){
+		delete _qualdecoders[i];
+	}
+	_qualdecoders.clear();
+	
+	
+	
+	delete [] _tab_threads;
+	delete [] _targ;
+	cout << endl;
+	
+	
+	_progress_decode->finish();
+	
+	delete _kmerModel;
+
+}
+
+
+
+
+void Leon::setupNextComponent( 		vector<u_int64_t>   & blockSizes    ){
+	//Go to the data block position (position 0 for headers, position |headers data| for reads)
+	_inputFile->seekg(_filePos, _inputFile->beg);
+	
+	blockSizes.clear();
+	//u_int64_t size = 0;
+	
+	_blockCount = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+	for(unsigned int i=0; i<_blockCount; i++){
+		u_int64_t blockSize = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+		blockSizes.push_back(blockSize);
+		//size += blockSize;
+	}
+	
+	
+
+	
+	//cout << "\tBlock count: " << _blockCount/2 << endl;
+	/*
+	for(int i=0; i<_blockSizes.size(); i++){
+		cout << _blockSizes[i] << " ";
+	}
+	cout << endl;*/
+	
+}
+
+
+
+void Leon::decodeBloom(){
+
+	//to be removed
+	////////
+	//pos = tous les block sizes des header
+	
+	/*
+	u_int64_t total_header_block_size = 0 ;
+	
+	for(int ii=0; ii<_headerBlockSizes.size(); ii+=2 )
+	{
+		total_header_block_size  += _headerBlockSizes[ii];
+	}
+	
+	u_int64_t bloomPos =  total_header_block_size ;  
+
+	for(int i=0; i<_dnaBlockSizes.size(); i++){
+		bloomPos += _dnaBlockSizes[i];
+		i += 1;
+	}
+
+	_inputFile->seekg(bloomPos, _inputFile->beg);
+	*/
+
+    
+	//u_int64_t bloomBitSize = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+	//u_int64_t bloomHashCount = CompressionUtils::decodeNumeric(_rangeDecoder, _numericModel);
+	
+
+	//_bloom   =  new BloomNeighborCoherent<kmer_type> (bloomBitSize,_kmerSize,bloomHashCount);
+	
+
+//	_inputFile->read((char*)_bloom->getArray(), _bloom->getSize());
+//////
+	
+	_bloom   = StorageTools::singleton().loadBloom<kmer_type>     (*_groupLeon,   "bloom");
+
+
+#ifdef PRINT_DEBUG_DECODER
+//		cout << "Bloom size: " << _bloom->getSize() << endl;
+//		cout << "Anchor dict pos: " << _inputFile->tellg() << endl;
+	#endif
+	
+
+}
+
+void Leon::decodeAnchorDict(){
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\tDecode anchor dict" << endl;
+	#endif
+	
+	
+	u_int64_t anchorDictSize;
+	u_int32_t anchorCount;
+	readDataset(_subgroupDict,"size",anchorDictSize);
+	readDataset(_subgroupDict,"anchorAdress",anchorCount);
+	
+	
+	tools::storage::impl::Storage::istream isD (*_subgroupDict, "anchorsDict");
+	
+	//_anchorRangeDecoder.setInputFile(_inputFile);
+	_anchorRangeDecoder.setInputFile(&isD); //seems to be working ok
+	
+	string anchorKmer = "";
+	
+//	u_int64_t dictPos = _inputFile->tellg();
+	
+	//KmerModel model(_kmerSize, KMER_DIRECT);
+
+	u_int64_t currentAnchorCount = 0;
+	
+	while(currentAnchorCount < anchorCount){
+
+
+		u_int8_t c = _anchorRangeDecoder.nextByte(_anchorDictModel);
+		anchorKmer += Leon::bin2nt(c); //convert to char
+		if(anchorKmer.size() == _kmerSize){
+			
+
+			//cout << anchorKmer << endl;
+			//if(i<=10) cout << anchorKmer << endl;
+			//cout << "1: " << anchorKmer << endl;
+			
+			kmer_type kmer = _kmerModel->codeSeed(anchorKmer.c_str(), Data::ASCII).value() ; //then convert to bin
+			
+
+			//could be optimized if needed
+			//cout << "2: " << model.toString(kmer) << endl;
+			//lala += 1;
+			_vecAnchorKmers.push_back(kmer);
+			
+			anchorKmer.clear();
+			
+			currentAnchorCount += 1;
+
+		}
+	}
+	
+	#ifdef PRINT_DEBUG_DECODER
+		cout << "\t\tAnchor count: " << _vecAnchorKmers.size() << endl;
+	#endif
+	
+
+}
+
+
+
+kmer_type Leon::getAnchor(ifstream* anchorDictFile, u_int32_t adress){
+	
+	return _vecAnchorKmers[adress];  //icii
+	
+	//anchorDictFile->seekg(_kmerSize*adress);
+	
+	//char buffer[_kmerSize];
+	
+	//anchorDictFile->read(buffer, _kmerSize);
+	//kmer_type kmer = model.codeSeed(anchorKmer.c_str(), Data::ASCII);
+	//return _vecAnchorKmers[adress];
+	//return _kmerModel->codeSeed(buffer, Data::ASCII);
+}
+
+void Leon::endDecompression(){
+	
+	getInfo()->add(1, "Output filename", "%s", _outputFile->getPath().c_str());
+
+	gettimeofday(&_tim, NULL);
+	_wfin_leon  = _tim.tv_sec +(_tim.tv_usec/1000000.0);
+	
+	getInfo()->add(1, "Time", "%.2f seconds", (  _wfin_leon - _wdebut_leon) );
+	getInfo()->add(1, "Speed", "%.2f Mo/seconds", (System::file().getSize(_outputFilename)/1000000.0) / (  _wfin_leon - _wdebut_leon) );
+	
+	
+	//Test decompressed file against original reads file (decompressed and original read file must be in the same dir)
+	if(getParser()->saw (Leon::STR_TEST_DECOMPRESSED_FILE)){
+		
+		getInfo()->add(1, "Checking decompressed file");
+		
+		string dir = System::file().getDirectory(_inputFilename);
+
+		string prefix = System::file().getBaseName(_inputFilename);;
+		//while(prefix.find('.') != string::npos){
+		//	int lastindex = prefix.find_last_of(".");
+		//	prefix = prefix.substr(0, lastindex);
+		//}
+		//string prefix = System::file().getBaseName(_inputFilename);
+		
+		string originalFilename;
+		IBank* originalBank;
+		IBank* newBank;
+		Iterator<Sequence>* originalBankIt;
+		Iterator<Sequence>* newBankIt;
+		
+		if(_isFasta)
+			originalFilename = dir + "/" + prefix + ".fasta";
+		else
+			originalFilename = dir + "/" + prefix + ".fastq";
+		
+		
+		getInfo()->add(2, "Original file", "%s", originalFilename.c_str());
+		getInfo()->add(2, "New file", "%s",  _outputFile->getPath().c_str());
+		
+		originalBank = Bank::open(originalFilename);
+		originalBankIt = originalBank->iterator();
+		originalBankIt->first();
+		newBank = Bank::open(_outputFile->getPath());
+		newBankIt = newBank->iterator();
+		newBankIt->first();
+		
+		//int i=0;
+		
+		while(true){
+			if(newBankIt->isDone()){
+				if(originalBankIt->isDone())
+					getInfo()->add(1, "OK");
+				else
+					getInfo()->add(1, "Decompressed file end but not the original file");
+				break;
+			}
+			if(originalBankIt->isDone()){
+				if(newBankIt->isDone())
+					getInfo()->add(1, "OK");
+				else
+					getInfo()->add(1, "Original file end but not the decomrpessed file");
+				break;
+			}
+			
+			string originalHeader = (*originalBankIt)->getComment();
+			string originalDna = (string((*originalBankIt)->getDataBuffer())).substr(0, (*originalBankIt)->getDataSize());
+			
+			
+			string newHeader = (*newBankIt)->getComment();
+			string newDna = (string((*newBankIt)->getDataBuffer())).substr(0, (*newBankIt)->getDataSize());
+			
+			if(originalHeader != newHeader){
+				getInfo()->add(1, "Sequence with a different header", "%i", (*newBankIt)->getIndex());
+                getInfo()->add(2, "original", "%s", originalHeader.c_str());
+                getInfo()->add(2, "new", "%s", newHeader.c_str());
+				break;
+			}
+			
+			if(originalDna != newDna){
+                getInfo()->add(1, "Sequence with a different DNA", "%i", (*newBankIt)->getIndex());
+                getInfo()->add(2, "original", "%s", originalDna.c_str());
+                getInfo()->add(2, "new", "%s", newDna.c_str());
+				break;
+			}
+			
+			originalBankIt->next();
+			newBankIt->next();
+			
+			//i ++;
+			//cout << i << endl;
+			//if(i > 20) return;
+		}
+	}
+}
+
+
+
+Leon::LeonIterator::LeonIterator( Leon& refl)
+: _leon(refl), _isDone(true) , _isInitialized(false)
+{
+	_stream_qual = _stream_header = _stream_dna = NULL ;
+
+}
+
+void Leon::LeonIterator::first()
+{
+	//printf("iter first\n");
+	init  ();
+
+	_idxB=0;
+	_livingThreadCount=0;
+	_currentTID=0;
+	_isDone = false;
+	_readingThreadBlock = false;
+	_readid=0;
+	if(_stream_qual!= NULL) delete  _stream_qual;
+	if(_stream_header!= NULL) delete  _stream_header;
+	if(_stream_dna!= NULL) delete  _stream_dna;
+	
+	next();
+
+}
+
+void Leon::LeonIterator::next()
+{
+//	printf("---------- iter next ------------\n");
+
+	if(_livingThreadCount==0 ||
+	   (( _currentTID>= _livingThreadCount) && !_readingThreadBlock )
+	   )
+	{
+		readNextBlocks();
+		if(_isDone) return;
+	}
+	
+	if(!_readingThreadBlock)
+	{
+		//  assert (_currentTID < _livingThreadCount)
+		readNextThreadBock();
+	}
+	
+	assert(_readingThreadBlock);
+
+	//try to get nex tseq from this thread block
+	
+	std::string line;
+	stringstream sint;
+	sint << _readid;
+	std::string current_comment;
+	std::string current_dna;
+	std::string current_qual;
+	
+	
+	if( ! _leon._noHeader)
+	{
+		if(getline(*_stream_header, line)){
+			current_comment +=  line ;
+		}
+		else
+			_readingThreadBlock = false;
+	}
+	else
+	{
+		current_comment += sint.str() ;
+		
+		_readid++;
+	}
+	
+	
+	
+	if(getline(*_stream_dna, line)){
+		current_dna +=  line ;
+	}
+	else
+		_readingThreadBlock = false;
+	
+	
+	if( ! _leon._isFasta)
+	{
+		if(getline(*_stream_qual, line)){
+			current_qual +=  line ;
+		}
+		else
+			_readingThreadBlock = false;
+	}
+	
+	if(_readingThreadBlock)
+	{
+		Sequence *currentSeq = _item;
+		currentSeq->setComment(current_comment);
+		currentSeq->setQuality(current_qual);
+		
+		//currData.set ((char *)current_dna.c_str(), current_dna.size()  );
+		
+		// huum casting const char * to char *; not nice, could be fixed with strdup but want to avoid unnecessary copy,
+		//the set() method *should* take a const anyway
+		currentSeq->getData().set((char *)current_dna.c_str(), current_dna.size()  );
+	}
+	else  //reached end of current thread block, try to advance to next block
+	{
+		next();
+	
+	}
+
+	
+}
+
+
+void Leon::LeonIterator::readNextBlocks()
+{
+//	printf("--- iter readNextBlocks  %i / %i ---\n",_idxB,_leon._dnaBlockSizes.size());
+
+	if(_idxB >= _leon._dnaBlockSizes.size()){
+		_isDone= true;
+	}
+	if(!_isDone)
+	{
+		_leon.decompressionDecodeBlocks(_idxB,_livingThreadCount); //this will update _idxB and _livingThreadCount
+		_currentTID =0;
+	}
+	
+//	printf("___ done iter readNextBlocks  %i / %i ---\n",_idxB,_leon._dnaBlockSizes.size());
+
+	
+}
+
+
+//put next chunk in stream_qual,stream_header and _stream_dna
+void Leon::LeonIterator::readNextThreadBock()
+{
+//	printf("--- iter readNextThreadBock  %i %i ---\n",_currentTID,_livingThreadCount);
+
+	pthread_join(_leon._tab_threads[_currentTID], NULL);
+	
+ 	_hdecoder = NULL;
+	_qdecoder = NULL;
+	_ddecoder = _leon._dnadecoders[_currentTID];
+	
+	
+	if(_stream_qual!= NULL) delete  _stream_qual;
+	if(_stream_header!= NULL) delete  _stream_header;
+	if(_stream_dna!= NULL) delete  _stream_dna;
+	
+	_stream_qual = NULL;
+	_stream_header = NULL;
+	_stream_dna = NULL;
+	
+	if(! _leon._isFasta)
+	{
+		_qdecoder = _leon._qualdecoders[_currentTID];
+		_stream_qual = new std::istringstream (_qdecoder->_buffer);
+		_qdecoder->_buffer.clear();
+	}
+	
+	if(! _leon._noHeader)
+	{
+		_hdecoder = _leon._headerdecoders[_currentTID];
+		_stream_header = new std::istringstream (_hdecoder->_buffer);
+		_hdecoder->_buffer.clear();
+	}
+	
+	_stream_dna = new std::istringstream (_ddecoder->_buffer);
+	_ddecoder->_buffer.clear();
+	
+	
+	//std::string output_buff;
+	//output_buff.reserve(READ_PER_BLOCK * 500);
+	
+	_readingThreadBlock = true;
+	_currentTID++;
+
+	
+//	printf("___ done iter readNextThreadBock  %i %i ---\n",_currentTID,_livingThreadCount);
+
+
+///	u_int64_t readid=0;
+}
+
+Leon::LeonIterator::~LeonIterator ()
+{
+	_leon.decoders_cleanup();
+}
+
+
+void Leon::LeonIterator::estimate(u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+	readDataset(_leon._subgroupInfo,"readcount",number);
+	readDataset(_leon._subgroupInfo,"totalDnaSize",totalSize);
+	
+	int maxsizei ;
+
+	readDataset(_leon._subgroupInfo,"maxSequenceSize",maxsizei);
+	maxSize = maxsizei;
+
+}
+
+void Leon::LeonIterator::init()
+{
+	if (_isInitialized == true)  { return ;}
+
+	///printf("iter init\n");
+
+	_leon.startDecompression_setup();
+	_leon.decoders_setup();
+	
+	
+	_isInitialized = true;
+}
+
+
+void Leon::LeonIterator::finalize()
+{
+	
+	
+}
+
+//////////////////////////////////////////////////
+//////////////////// BankLeon ////////////////////
+//////////////////////////////////////////////////
+
+BankLeon::BankLeon (const std::string& filename)
+{
+	_fname = filename;
+	_leon = NULL;
+	
+	_leon = new Leon();
+
+	
+	std::vector<std::string> arguments;
+	arguments.push_back("leon");
+	arguments.push_back("-file");
+	arguments.push_back(_fname);
+	arguments.push_back("-d");
+	arguments.push_back(Leon::STR_INIT_ITER);
+	
+	std::vector<char*> argv;
+	for (const auto& arg : arguments)
+		argv.push_back((char*)arg.data());
+	argv.push_back(nullptr);
+	int argc = argv.size() - 1;
+
+	_leon->run (argc, argv.data());
+
+}
+
+BankLeon::~BankLeon ()
+{
+	if(_leon!=NULL)
+		delete _leon;
+	
+}
+
+u_int64_t BankLeon::getSize ()
+{
+	return System::file().getSize (_fname);
+}
+
+int64_t BankLeon::getNbItems () {
+	u_int64_t number;
+	readDataset(_leon->_subgroupInfo,"readcount",number);
+	return number;
+}
+
+
+
+void BankLeon::estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize)
+{
+	readDataset(_leon->_subgroupInfo,"readcount",number);
+	readDataset(_leon->_subgroupInfo,"totalDnaSize",totalSize);
+	
+	int maxsizei ;
+	
+	readDataset(_leon->_subgroupInfo,"maxSequenceSize",maxsizei);
+	maxSize = maxsizei;
+	
+}
+
+
+
+
+/// BankLeonFactory : test hdf5  storage opening, if leon version can be found, this is a leon file
+
+IBank* BankLeonFactory::createBank (const std::string& uri)
+{
+	//printf("create bank factory  Leon  %s \n",uri.c_str());
+	bool isLEON = false;
+
+	try {
+		isLEON = true;
+		
+		auto storageH5file = StorageFactory(STORAGE_HDF5).create (uri,false,false,true); //open without adding extension h5
+
+		
+		//auto groupLeon = new tools::storage::impl::Group((*storageH5file)().getGroup   ("leon"));
+		
+		auto _subgroupInfo = new tools::storage::impl::Group((*storageH5file)().getGroup   ("metadata"));
+
+		auto _subgroupInfoCollection = & _subgroupInfo->getCollection<math::NativeInt8> ("infobyte");
+
+		std::string  leonversion =  _subgroupInfoCollection->getProperty ("version");
+	//	std::cout << "leon file version : "<< leonversion << std::endl;
+
+	} catch (system::Exception& e) {
+//		 std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
+		isLEON = false;
+	}
+	
+	return (isLEON ? new BankLeon (uri) : NULL);
+	
+}
+
diff --git a/gatb-core/src/gatb/tools/compression/Leon.hpp b/gatb-core/src/gatb/tools/compression/Leon.hpp
new file mode 100644
index 0000000..887e8c5
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/Leon.hpp
@@ -0,0 +1,490 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#ifndef __leon__Leon__
+#define __leon__Leon__
+
+
+#define LEON_VERSION_MAJOR 1
+#define LEON_VERSION_MINOR 1
+#define LEON_VERSION_PATCH 0
+
+
+//#define LEON_PRINT_STAT
+
+#include <iostream>
+#include <gatb/gatb_core.hpp>
+#include <sys/time.h>
+
+/** NOTE: we should not include namespaces here => only to make user life easier... */
+using namespace gatb::core;
+using namespace gatb::core::tools;
+using namespace gatb::core::bank;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+
+typedef kmer::impl::Kmer<>::ModelDirect KmerModel;
+typedef kmer::impl::Kmer<>::Type        kmer_type;
+typedef kmer::impl::Kmer<>::Count       kmer_count;
+
+
+
+
+
+
+
+#include <string>
+#include <sstream>
+#include "HeaderCoder.hpp"
+#include "DnaCoder.hpp"
+
+//#include "RangeCoder.hpp"
+
+#include <time.h> //Used to calculate time taken by decompression
+#include <zlib.h> //Test bloom compression
+//char char2phred(char c);
+//double char2proba(char c);
+
+
+#include <pthread.h>
+
+
+class HeaderEncoder;
+class HeaderDecoder;
+class DnaEncoder;
+class QualDecoder;
+class DnaDecoder;
+
+typedef struct
+{
+	QualDecoder * qual_decoder;
+	HeaderDecoder * header_decoder;
+	DnaDecoder * dna_decoder;
+} thread_arg_decoder;
+
+
+class Leon : public misc::impl::Tool
+{
+	friend class BankLeon;
+	public:
+		
+		//Leon( bool compress, bool decompress);
+		Leon();
+		~Leon();
+	
+		static const char* STR_COMPRESS;
+		static const char* STR_DECOMPRESS;
+		static const char* STR_TEST_DECOMPRESSED_FILE;
+		static const char* STR_DNA_ONLY;
+		static const char* STR_NOHEADER;
+		static const char* STR_NOQUAL;
+		static const char* STR_INIT_ITER;
+
+	static const char* STR_DATA_INFO;
+
+	
+		size_t          _kmerSize;
+		string     _dskOutputFilename;
+		//static const int READ_PER_BLOCK = 50000;
+		int _nb_cores;
+		
+		bool _compress, _decompress;
+		bool _iterator_mode;
+
+		clock_t _time; //Used to calculate time taken by decompression
+		
+		//Global compression
+		void writeBlock(u_int8_t* data, u_int64_t size, int encodedSequenceCount,u_int64_t blockID, bool Header);
+	
+		void writeBlockLena(u_int8_t* data, u_int64_t size, int encodedSequenceCount,u_int64_t blockID);
+
+		//Header compression
+		string _firstHeader;
+		u_int64_t _totalHeaderSize;
+		//u_int64_t _totalHeaderCompressedSize;
+		
+		//Dna compression
+		u_int32_t _anchorAdress;
+		
+		bool anchorExist(const kmer_type& kmer, u_int32_t* anchorAdress);
+		int findAndInsertAnchor(const vector<kmer_type>& kmers, u_int32_t* anchorAdress);
+		void updateMinMaxSequenceSize(int newMin, int newMax);
+
+		int _minSequenceSize;
+		int _maxSequenceSize;
+	
+		u_int64_t _totalDnaSize;
+		u_int64_t _anchorDictSize;
+		u_int64_t _anchorAdressSize;
+		u_int64_t _anchorPosSize;
+		u_int64_t _otherSize;
+		u_int64_t _readSizeSize;
+		u_int64_t _bifurcationSize;
+		u_int64_t _noAnchorSize;
+		
+		//u_int64_t _totalDnaCompressedSize;
+		//u_int64_t _realDnaCompressedSize;
+		u_int64_t _compressedSize;
+		IBloom<kmer_type>* _bloom;
+	
+		bool _isFasta;
+		bool _noHeader;
+
+	bool _lossless;
+	//for qual compression
+		u_int64_t _total_nb_quals_smoothed ;
+		u_int64_t _input_qualSize;
+		u_int64_t _compressed_qualSize;
+	
+	
+		//test dna compression
+		u_int64_t _MCtotal;
+		u_int64_t _MCnoAternative;
+		u_int64_t _MCuniqSolid;
+		u_int64_t _MCuniqNoSolid;
+		u_int64_t _MCmultipleSolid;
+		//u_int64_t _MCmultipleNoSolid;
+	
+		u_int64_t _blockCount;
+		//u_int64_t _noAnchor_full_N_kmer_count;
+		//u_int64_t _noAnchor_with_N_kmer_count;
+		//double _anchorKmerCount;
+		u_int64_t _readCount;
+		u_int64_t _readWithoutAnchorCount;
+		//double _total_kmer_indexed;
+		//double _uniq_mutated_kmer;
+		//u_int64_t _total_kmer;
+		//u_int64_t _readWithoutAnchorSize;
+		//u_int64_t _readWithAnchorSize;
+		//double _readWithAnchorMutationChoicesSize;
+		//Hash16<kmer_type>* _kmerAbundance;
+		
+		int   _nb_thread_living;
+
+		// ProgressSynchro *
+		dp::IteratorListener * _progress_decode;
+	
+
+		//DNA decompression
+		kmer_type getAnchor(ifstream* anchorDictFile, u_int32_t adress);
+		string _anchorDictFilename;
+		
+		
+		static const int nt2binTab[128];
+		static const int bin2ntTab[5];
+		//static const vector<int> bin2ntTab(5;
+		
+		
+
+		//Utils
+		static int nt2bin(char nt){
+			return nt2binTab[(unsigned char)nt];
+			
+		}
+		static int bin2nt(int nt){
+			return bin2ntTab[nt];
+		}
+		
+		void setReadPerBlock(int value){
+			_read_per_block = value;
+		}
+	
+		int getReadPerBlock(){
+			return _read_per_block;
+		}
+
+	private:
+
+    int _read_per_block;
+
+	//hdf5 stuff
+	Storage* _storageH5file;
+
+	
+	tools::storage::impl::Group *  _groupLeon;
+	tools::storage::impl::Group *  _subgroupInfo;
+	tools::storage::impl::Group * _subgroupDict;
+	tools::storage::impl::Group * _subgroupDNA;
+	tools::storage::impl::Group * _subgroupQual;
+	tools::storage::impl::Group * _subgroupHeader;
+
+	collections::Collection<math::NativeInt8>* _subgroupInfoCollection;
+
+		u_int64_t _lastAnchorValue;
+		
+		 struct timeval _tim;
+		double _wdebut_leon, _wfin_leon;
+		//static const char* STR_GZ;
+		IFile* _outputFile;
+	
+	
+	
+		ofstream* _dictAnchorFile;
+		int _nks;
+		
+		void execute ();
+		void createBloom ();
+		//void createKmerAbundanceHash();
+		
+		//Global compression
+		string _inputFilename;
+		string _outputFilename;
+	
+
+	//quals
+	//string _FileQualname;
+	//IFile* _FileQual;
+	//tools::storage::impl::Storage::ostream * _Qual_outstream ;
+
+	string _qualOutputFilename; //temp file
+
+		Order0Model _generalModel;
+		vector<Order0Model> _numericModel;
+		RangeEncoder _rangeEncoder;
+		vector<u_int64_t> _blockSizes;
+	
+	//	vector<u_int64_t> _qualBlockSizes;
+		vector<u_int64_t> _headerBlockSizes;
+		vector<u_int64_t> _dnaBlockSizes;
+
+		IBank* _inputBank;
+		void setInputBank (IBank* inputBank) { SP_SETATTR(inputBank); }
+
+		//u_int64_t _bloomSize;
+		
+		void executeCompression();
+		void executeDecompression();
+		void endCompression();
+		void endQualCompression();
+	
+		//Global decompression
+		void setupNextComponent(vector<u_int64_t>   & blockSizes  );
+		
+		RangeDecoder _rangeDecoder;
+		//ifstream* _inputFile;
+		ifstream* _inputFile;
+		//ifstream* _inputFileQual;
+
+		u_int64_t _filePos;
+	
+	u_int64_t _filePosHeader;
+	u_int64_t _filePosDna;
+
+		double _headerCompRate, _dnaCompRate, _qualCompRate;
+		
+		//Quals
+		u_int64_t _filePosQual;
+
+	
+		void startDecompressionAllStreams();
+
+		
+	
+		//Header compression
+		void startHeaderCompression();
+		void endHeaderCompression();
+	
+
+		//DNA Compression
+		void startDnaCompression();
+		void endDnaCompression();
+		void writeBloom();
+		void writeAnchorDict();
+		void encodeInsertedAnchor(const kmer_type& kmer);
+			
+		RangeEncoder _anchorRangeEncoder;
+		Order0Model _anchorDictModel;
+		
+		//map<kmer_type, u_int32_t> _anchorKmers; //uses 46 B per elem inserted
+		//OAHash<kmer_type> _anchorKmers;
+		Hash16<kmer_type, u_int32_t >  * _anchorKmers ; //will  use approx 20B per elem inserted
+
+		//Header decompression
+	
+		string _headerOutputFilename;
+	
+	  // 	int _auto_cutoff;
+		pthread_mutex_t findAndInsert_mutex;
+		pthread_mutex_t writeblock_mutex;
+		pthread_mutex_t minmax_mutex;
+
+		//DNA Decompression
+		void decodeBloom();
+		void decodeAnchorDict();
+		
+		KmerModel* _kmerModel;
+		string _dnaOutputFilename;
+		RangeDecoder _anchorRangeDecoder;
+		vector<kmer_type> _vecAnchorKmers;
+		
+		//Global decompression
+		void endDecompression();
+		
+		//IFile* _outputFile;
+	
+	void startDecompression_setup();
+	void decoders_setup();
+	void decoders_cleanup();
+
+	vector<QualDecoder*> _qualdecoders;
+	vector<DnaDecoder*> _dnadecoders;
+	vector<HeaderDecoder*> _headerdecoders;
+	
+	pthread_t * _tab_threads;
+	
+	thread_arg_decoder *  _targ;
+	void decompressionDecodeBlocks(unsigned int & idx, int & livingThreadCount);
+	
+	void testing_iter();
+	
+	
+	class LeonIterator : public tools::dp::Iterator<Sequence>
+	{
+	public:
+		
+		
+		LeonIterator (Leon& ref);
+		
+		/** Destructor */
+		~LeonIterator ();
+		
+		/** \copydoc tools::dp::Iterator::first */
+		void first();
+		
+		/** \copydoc tools::dp::Iterator::next */
+		void next();
+		
+		/** \copydoc tools::dp::Iterator::isDone */
+		bool isDone ()  { return _isDone; }
+		
+		/** \copydoc tools::dp::Iterator::item */
+		Sequence& item ()     { return *_item; }
+		
+		/** Estimation of the sequences information */
+		void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+		
+	private:
+		
+		/** Reference to the underlying Leon instance. */
+		Leon&    _leon;
+		
+		/** Tells whether the iteration is finished or not. */
+		bool _isDone;
+		
+		/** Tells whether the instance is initialized. */
+		bool _isInitialized;
+		
+		
+		/** Initialization method. */
+		void init ();
+		
+		/** Finish method. */
+		void finalize ();
+		
+		void readNextBlocks();
+
+		void readNextThreadBock();
+		
+		unsigned int _idxB;
+		int _livingThreadCount;
+		int _currentTID;
+		
+		HeaderDecoder* _hdecoder ;
+		QualDecoder* _qdecoder;
+		DnaDecoder* _ddecoder ;
+		
+		
+		std::istringstream  * _stream_qual ;
+		std::istringstream  * _stream_header ;
+		std::istringstream  * _stream_dna;
+		
+		bool _readingThreadBlock;
+		u_int64_t _readid;
+
+	};
+};
+
+
+class BankLeon : public AbstractBank
+{
+public:
+	
+	/** Returns the name of the bank format. */
+	static const char* name()  { return "Leon"; }
+	
+	/** Constructor.
+	 * \param[in] nbSequences : number of sequences of the random bank
+	 * \param[in] length : length of a sequence. */
+	BankLeon (const std::string& filename);
+	
+	/** Destructor. */
+	~BankLeon ();
+	
+	/** \copydoc IBank::getId. */
+	std::string getId ()  { return _fname; }
+	
+	/** \copydoc IBank::iterator */
+	tools::dp::Iterator<Sequence>* iterator ()  { return new Leon::LeonIterator (*_leon); }
+	
+	/** */
+	int64_t getNbItems () ;
+	
+	/** \copydoc IBank::insert */
+	void insert (const Sequence& item) {}
+	
+	/** \copydoc IBank::flush */
+	void flush ()  {}
+	
+	/** \copydoc IBank::getSize */
+	u_int64_t getSize ();
+	
+	/** \copydoc IBank::estimate */
+	void estimate (u_int64_t& number, u_int64_t& totalSize, u_int64_t& maxSize);
+	
+	/** \return maximum number of files. */
+	static const size_t getMaxNbFiles ()  { return 0; }
+	
+	/************************************************************/
+	
+
+protected:
+	
+	std::string _fname;
+	Leon *_leon;
+	
+};
+
+/* \brief Factory for the BankFasta class. */
+class BankLeonFactory : public IBankFactory
+{
+public:
+	
+	/** \copydoc IBankFactory::createBank */
+	IBank* createBank (const std::string& uri);
+};
+
+
+
+
+
+#endif /* defined(__leon__Leon__) */
diff --git a/gatb-core/src/gatb/tools/compression/RangeCoder.cpp b/gatb-core/src/gatb/tools/compression/RangeCoder.cpp
new file mode 100644
index 0000000..f9d08a1
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/RangeCoder.cpp
@@ -0,0 +1,250 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+#include "RangeCoder.hpp"
+#include <algorithm>    // std::reverse
+
+//#define PRINT_DEBUG_RANGE_CODER
+
+//====================================================================================
+// ** Order0Model
+//====================================================================================
+Order0Model::Order0Model(int charCount){
+	_charCount = charCount+1;
+	
+	for(int i=0; i<_charCount; i++){
+		_charRanges.push_back(i);
+	}
+}
+
+Order0Model::~Order0Model(){
+}
+
+void Order0Model::clear(){
+	for(int i=0; i<_charCount; i++){
+		_charRanges[i] = i;
+	}
+	
+}
+
+void Order0Model::update(uint8_t c){
+	//cout << rangeLow(c) <<  " " << rangeHigh(c) << " " << totalRange()<< endl;
+	for(int i=c+1; i<_charCount; i++){
+		_charRanges[i] += 1;
+	}
+	if(_charRanges[_charCount-1] >= MAX_RANGE){
+		rescale();
+	}
+}
+
+void Order0Model::rescale(){
+	for(int i=1; i<_charCount; i++) {
+		_charRanges[i] /= 2;
+		if(_charRanges[i] <= _charRanges[i-1]){
+			_charRanges[i] = _charRanges[i-1] + 1;
+		}
+	}
+}
+
+u_int64_t Order0Model::rangeLow(uint8_t c){
+	return _charRanges[c];
+}
+
+u_int64_t Order0Model::rangeHigh(uint8_t c){
+	return _charRanges[c+1];
+}
+
+u_int64_t Order0Model::totalRange(){
+	return _charRanges[_charRanges.size()-1];
+	//return _charRanges[_charCount-1];
+}
+
+unsigned int Order0Model::charCount(){
+	return _charCount;
+}
+
+//====================================================================================
+// ** AbstractRangeCoder
+//====================================================================================
+AbstractRangeCoder::AbstractRangeCoder(){
+	_low = 0;
+	_range = -1;
+}
+
+
+//====================================================================================
+// ** RangeEncoder
+//====================================================================================
+RangeEncoder::RangeEncoder()//(ofstream& outputFile)
+{	
+	updateModel = true;
+	//_outputFile = new OutputFile(outputFile);
+}
+
+RangeEncoder::~RangeEncoder(){
+	//flush(); //ATTENTION PTET PB DE SYNCHRO ICI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+	//delete _outputFile;
+}
+
+void RangeEncoder::encode(Order0Model& model, uint8_t c){
+	#ifdef PRINT_DEBUG_RANGE_CODER
+		printf("\t\t\tencoding char: %c\n", c);
+	#endif
+	
+	//cout << model->rangeHigh(c) -model->rangeLow(c) << endl;
+	_range /= model.totalRange();
+	_low += model.rangeLow(c) * _range;
+	_range *= model.rangeHigh(c) - model.rangeLow(c);
+
+	while((_low ^ (_low + _range)) < TOP || _range < BOTTOM){
+		if(_range < BOTTOM && (_low ^ (_low+_range)) >= TOP){
+			_range = -_low & (BOTTOM-1);
+		}
+		
+		_buffer.push_back(_low>>56);
+		//cout << "RangeEncoder Output: " << (_low>>56) << endl;
+		//_outputFile->writeByte(_low>>56);
+		_range <<= 8;
+		_low <<= 8;
+	}
+	
+	#ifdef LEON_PRINT_STAT
+		if(updateModel) model.update(c);
+	#else
+		model.update(c);
+	#endif
+
+}
+
+void RangeEncoder::flush(){
+	for(int i=0; i<8; i++){
+		//cout << "RangeEncoder Output: " << (_low>>56) << endl;
+		_buffer.push_back(_low>>56);
+		//_outputFile->writeByte(_low>>56);
+		_low <<= 8;
+	}
+	_low = 0;
+	_range = -1;
+}
+
+void RangeEncoder::clear(){
+	_low = 0;
+	_range = -1;
+	clearBuffer();
+}
+
+void RangeEncoder::clearBuffer(){
+	_buffer.clear();
+}
+
+u_int8_t* RangeEncoder::getBuffer(bool reversed){
+	if(reversed){
+		_reversedBuffer.clear();
+		_reversedBuffer.assign(_buffer.begin(), _buffer.end());
+		reverse(_reversedBuffer.begin(), _reversedBuffer.end());
+		return &_reversedBuffer[0];
+	}
+	else{
+		return &_buffer[0];
+	}
+}
+
+		
+u_int64_t RangeEncoder::getBufferSize(){
+	return _buffer.size();
+}
+
+
+
+//====================================================================================
+// ** RangeDecoder
+//====================================================================================
+RangeDecoder::RangeDecoder()
+{
+}
+
+RangeDecoder::~RangeDecoder(){
+}
+	
+	
+void RangeDecoder::setInputFile(istream* inputFile, bool reversed){
+	_reversed = reversed;
+	clear();
+	_inputFile = inputFile;
+	
+	for(int i=0; i<8; i++){
+		_code = (_code << 8) | getNextByte();
+	}
+}
+
+uint8_t RangeDecoder::nextByte(Order0Model& model){
+	u_int64_t count = getCurrentCount(model);
+	uint8_t c;
+	for(c=model.charCount()-2; model.rangeLow(c) > count; c--);
+
+	removeRange(model, c);
+
+	model.update(c);
+	//cout << "RangeDecoder output: " << (int)c << endl;
+	return c;
+}
+	
+u_int64_t RangeDecoder::getCurrentCount(Order0Model& model){
+	_range /= model.totalRange();
+	return (_code-_low) / _range;
+}
+
+void RangeDecoder::removeRange(Order0Model& model, uint8_t c){
+	_low += model.rangeLow(c) * _range;
+	_range *= model.rangeHigh(c) - model.rangeLow(c);
+
+	while((_low ^ (_low + _range)) < TOP || _range < BOTTOM ){
+		if(_range < BOTTOM && (_low ^ (_low + _range)) >= TOP){
+			_range = -_low & (BOTTOM-1);
+		}
+		
+		_code = _code << 8 | getNextByte();
+		_range <<= 8; 
+		_low <<= 8;
+	}
+}
+
+void RangeDecoder::clear(){
+	_low = 0;
+	_range = -1;
+	_code = 0;
+}
+
+u_int8_t RangeDecoder::getNextByte(){
+	u_int8_t byte;
+	
+	if(_reversed){
+		_inputFile->seekg(-1, _inputFile->cur);
+	}
+	
+	byte = _inputFile->get();
+	
+	if(_reversed){
+		_inputFile->seekg(-1, _inputFile->cur);
+	}
+	
+	return byte;
+}
+
diff --git a/gatb-core/src/gatb/tools/compression/RangeCoder.hpp b/gatb-core/src/gatb/tools/compression/RangeCoder.hpp
new file mode 100644
index 0000000..465e30c
--- /dev/null
+++ b/gatb-core/src/gatb/tools/compression/RangeCoder.hpp
@@ -0,0 +1,135 @@
+/*****************************************************************************
+ *   Leon: reference free compression for NGS reads
+ *   A tool from the GATB (Genome Assembly Tool Box)
+ *   Copyright (C) 2014  INRIA
+ *   Authors: G.Benoit, G.Rizk, C.Lemaitre
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+
+
+#ifndef _RANGECODER_HPP_
+#define _RANGECODER_HPP_
+
+#include <string>
+#include <vector>
+#include <ctype.h>
+#include <cstdio>
+#include <fstream>
+#include <iostream>
+#include <stdint.h>
+#include <sys/types.h>
+//#include "File.hpp"
+
+using namespace std;
+
+const u_int64_t TOP = (u_int64_t) 1<<56;
+const u_int64_t BOTTOM = (u_int64_t) 1<<48;
+const u_int64_t MAX_RANGE = BOTTOM;
+
+
+
+class Order0Model
+{
+	
+	public:
+		Order0Model(int charCount);
+		~Order0Model();
+		
+		void clear();
+		void update(uint8_t c);
+		
+		u_int64_t rangeLow(uint8_t c);
+		u_int64_t rangeHigh(uint8_t c);
+		u_int64_t totalRange();
+		unsigned int charCount();
+	
+	private:
+		vector<u_int64_t> _charRanges;
+		int _charCount;
+		
+		void rescale();
+		
+};
+
+//====================================================================================
+// ** AbstractRangeCoder
+//====================================================================================
+class AbstractRangeCoder
+{
+	
+	public:
+		AbstractRangeCoder();
+		//~AbstractRangeCoder();
+
+	protected:
+		u_int64_t _low;
+		u_int64_t _range;
+		
+};
+
+
+//====================================================================================
+// ** RangeEncoder
+//====================================================================================
+class RangeEncoder : AbstractRangeCoder
+{
+	public:
+		
+		RangeEncoder();//(ofstream& outputFile);
+		~RangeEncoder();
+		
+		void encode(Order0Model& model, uint8_t c);
+		void flush();
+		void clear();
+		void clearBuffer();
+		u_int8_t* getBuffer(bool reversed=false);
+		u_int64_t getBufferSize();
+		
+		bool updateModel; //Used by leon when PRINT_STAT macro is defined
+		
+	private:
+		vector<u_int8_t> _buffer;
+		vector<u_int8_t> _reversedBuffer;
+};
+
+//====================================================================================
+// ** RangeDecoder
+//====================================================================================
+class RangeDecoder : AbstractRangeCoder
+{
+	public:
+		
+		RangeDecoder();
+		~RangeDecoder();
+		
+		void setInputFile(istream* inputFile, bool reversed=false);
+		u_int8_t nextByte(Order0Model& model);
+		void clear();
+		
+	private:
+		
+		istream* _inputFile;
+		u_int64_t _code;
+		bool _reversed;
+		
+		u_int64_t getCurrentCount(Order0Model& model);
+		void removeRange(Order0Model& model, uint8_t c);
+		u_int8_t getNextByte();
+};
+
+
+
+#endif /* _RANGECODER_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/designpattern/api/ICommand.hpp b/gatb-core/src/gatb/tools/designpattern/api/ICommand.hpp
new file mode 100644
index 0000000..a70abe0
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/api/ICommand.hpp
@@ -0,0 +1,346 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ICommand.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface for command concept
+ */
+
+#ifndef _GATB_CORE_TOOLS_DP_ICOMMAND_HPP_
+#define _GATB_CORE_TOOLS_DP_ICOMMAND_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/api/IThread.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+
+#include <vector>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+/** \brief Tools package */
+namespace tools {
+/** \brief Design Patterns concepts */
+namespace dp    {
+/********************************************************************************/
+
+/** \brief Interface of what a command is.
+ *
+ *  This class represents the Design Pattern Command whose purpose is to encapsulate
+ *  some processing into a uniform calling procedure, a 'execute' method.
+ *
+ *  The command concept provides a uniform way for running some work.
+ *  This is achieved by refining the execute() method of the ICommand interface.
+ *  Doing so makes the actual job encapsulated inside the execute() body; clients
+ *  that want to use commands only have to know how to launch them: calling execute().
+ *
+ *  The further step is to introduce an interface that can manage a list of commands.
+ *  For instance, in a dual core architecture, it is possible to launch
+ *  two instances of commands in two separated threads, which means we got a parallelization
+ *  scheme. It is therefore interesting to define an interface that takes a list of commands
+ *  an dispatch them in different threads; we call such an interface a command dispatcher.
+ *  Note that an implementation of such a dispatcher can parallelize the commands, but another
+ *  implementation can only serialize the commands; so, job parallelization or serialization
+ *  is just a matter of choice in the actual implementation of the dispatcher interface.
+ *
+ *  Sample of use:
+ * \code
+ * class MyCommand : public ICommand
+ * {
+ * public:
+ *     void execute ()  { printf ("I am doing something there\n"); }
+ * };
+ * \endcode
+ *
+ * \see IDispatcher
+ */
+class ICommand : virtual public system::ISmartPointer
+{
+public:
+    /** Method that executes some job. */
+    virtual void execute () = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Dispatching of commands.
+ *
+ *  Interface that launches several commands.
+ *
+ *  According to the implementation, the dispatching can be done in a serial or in
+ *  a parallelized way.
+ *
+ *  Note that a post treatment command can be provided and will be launched when all
+ *  the commands have finished.
+ *
+ *  Note that this interface could also be implemented for dispatching commands over a network in order
+ *  to use a grid of computers. We could imagine that the commands dispatching consists in
+ *  launching some RCP calls, or creating some web services calls. The important point is that, from the
+ *  client point of view, her/his code should not change, except the actual kind of IDispatcher instance
+ *  provided to the algorithm.
+ *
+ *  Sample of use:
+ *  \code
+ *  // We define a command class
+ *  class MyCommand : public ICommand, public SmartPointer
+ *  {
+ *  public:
+ *      MyCommand (int i) : _i(i) {}
+ *      void execute ()  { printf ("Going to sleep %d...\n", _i);  sleep (_i);  }
+ *  private:
+ *      int _i;
+ *  };
+ *
+ *  int main (int argc, char* argv[])
+ *  {
+ *      // We create a list of commands
+ *      std::vector<ICommand*> commands;
+ *      commands.push_back (new MyCommand(2));
+ *      commands.push_back (new MyCommand(5));
+ *      commands.push_back (new MyCommand(3));
+ *
+ *      // We create a commands dispatcher that parallelizes the execution of the commands.
+ *      IDispatcher* dispatcher = new Dispatcher ();
+ *
+ *      // We launch the 3 commands.
+ *      dispatcher->dispatchCommands (commands, 0);
+ *
+ *      // Here, we should be waiting until the second command (that waits for 5 seconds) is finished.
+ *
+ *      return 0;
+ *  }
+ *  \endcode
+ *
+ *  \see ICommand
+ */
+class IDispatcher : public system::SmartPointer
+{
+public:
+
+    struct Status
+    {
+        size_t nbCores;
+        size_t time;
+        size_t groupSize;
+    };
+
+    /** Dispatch commands execution in some separate contexts (threads for instance).
+     *  Once the commands are launched, this dispatcher waits for the commands finish.
+     *  Then, it may have to execute a post treatment command (if any).
+     * \param[in] commands      : commands to be executed
+     * \param[in] postTreatment : command to be executed after all the commands are done
+     * \return time elapsed in msec
+     */
+    virtual size_t dispatchCommands (std::vector<ICommand*>& commands, ICommand* postTreatment=0) = 0;
+
+    /** Returns the number of execution units for this dispatcher.
+     *  For instance, it could be the number of cores in a multi cores architecture.
+     *  \return the number of execution units.
+     */
+    virtual size_t getExecutionUnitsNumber () = 0;
+
+    /** Iterate a provided instance. The provided functor is cloned N times, where N is the number of threads to
+     * be created; each thread will use its own instance of functor.
+     *
+     * One has to be aware that the copy constructor of the Functor type has to be well defined. For instance, if
+     * one wants to share a resource hold by the 'functor' argument, the copied Functor object may have a direct
+     * access to the shared resource, which potential issues with concurrent accesses on it. A way to avoid this
+     * kind of issue is to define a copy constructor that will create an instance of Functor with specific
+     * synchronization process (see ISynchronizer for that).
+     *
+     * \param[in] iterator : the iterator to be iterated
+     * \param[in] functor : functor object to be cloned N times, one per thread
+     * \param[in] groupSize : number of items to be retrieved in a single lock/unlock block
+     *  \param[in] deleteSynchro : if false, destructor of functors are called in each thread; if true, destructor of functors are called synchronously
+     */
+    template <typename Item, typename Functor>
+    Status iterate (Iterator<Item>* iterator, const Functor& functor, size_t groupSize = 1000, bool deleteSynchro = false)
+    {
+        bool localIterator=true;
+
+        Status status;
+        if (localIterator) { iterator->use(); }
+
+        /** We create N functors that are copies of the provided one. */
+        std::vector<Functor*> functors (getExecutionUnitsNumber());
+        for (size_t i=0; i<functors.size(); i++)  {  functors[i] = new Functor (functor);  } // will be deleted by IteratorCommand
+
+        /** We iterate the iterator. */
+        status = iterate (iterator, functors, groupSize, deleteSynchro);
+
+        if (localIterator) { iterator->forget(); }
+        
+        /** We return the status. */
+        return status;
+    }
+
+    /** Iterate a provided instance. The provided functor is cloned N times, where N is the number of threads to
+     * be created; each thread will use its own instance of functor.
+     *
+     * One has to be aware that the copy constructor of the Functor type has to be well defined. For instance, if
+     * one wants to share a resource hold by the 'functor' argument, the copied Functor object may have a direct
+     * access to the shared resource, which potential issues with concurrent accesses on it. A way to avoid this
+     * kind of issue is to define a copy constructor that will create an instance of Functor with specific
+     * synchronization process (see ISynchronizer for that).
+     *
+     * \param[in] iterator : the iterator to be iterated
+     * \param[in] functor : functor object to be cloned N times, one per thread
+     * \param[in] groupSize : number of items to be retrieved in a single lock/unlock block
+     *  \param[in] deleteSynchro : if false, destructor of functors are called in each thread; if true, destructor of functors are called synchronously
+     */
+    template <typename Item, typename Functor>
+    Status iterate (const Iterator<Item>& iterator, const Functor& functor, size_t groupSize = 1000, bool deleteSynchro = false)
+    {
+        /** We create N functors that are copies of the provided one. */
+        std::vector<Functor*> functors (getExecutionUnitsNumber());
+        for (size_t i=0; i<functors.size(); i++)  {  functors[i] = new Functor (functor);  } // will be deleted by IteratorCommand
+
+        /** We iterate the iterator. */
+        Status status = iterate ((Iterator<Item>*)&iterator, functors, groupSize, deleteSynchro);
+
+        return status;
+    }
+
+    /** Set the number of items to be retrieved from the iterator by one thread in a synchronized way.
+     * \param[in] groupSize : number of items to be retrieved. */
+    virtual void   setGroupSize (size_t groupSize) = 0;
+
+    /** Get the number of items to be retrieved from the iterator by one thread in a synchronized way.
+     * \return the number of items. */
+    virtual size_t getGroupSize () const = 0;
+
+protected:
+
+    /** Factory method for synchronizer instantiation.
+     * \return the created synchronizer. */
+    virtual system::ISynchronizer* newSynchro () = 0;
+
+    /** Iterate a provided Iterator instance; each iterated items are processed through some functors.
+     *  According to the dispatcher implementation, we can hence iterate in a parallel way on several cores.
+     *  Since we can have concurrent access, the iteration is protected by a synchronizer. Note that it is possible
+     *  to group items to be given to one functor; grouping may be important for performance issues since we reduce
+     *  the number of synchronizer lock/unlock calls and so use in an optimal way the available cores.
+     *  \param[in] iterator : the iterator to be iterated
+     *  \param[in] functors : vector of functors that are fed with iterated items
+     *  \param[in] groupSize : number of items to be retrieved in a single lock/unlock block
+     *  \param[in] deleteSynchro : if false, destructor of functors are called in each thread; if true, destructor of functors are called synchronously
+     */
+    template <typename Item, typename Functor> Status iterate (
+        Iterator<Item>*         iterator,
+        std::vector<Functor*>&  functors,
+        size_t                  groupSize = 1000,
+        bool                    deleteSynchro = false
+    )
+    {
+        /** If the dispatcher has a defined group size, we overwrite the one provided by the caller. */
+        if (getGroupSize() > 0)  { groupSize = getGroupSize(); }
+
+        Status status;
+
+        /** We create a common synchronizer. */
+        system::ISynchronizer* synchro = newSynchro();
+
+        /** We create N IteratorCommand instances. */
+        std::vector<ICommand*> commands;
+        for (typename std::vector<Functor*>::iterator it = functors.begin(); it != functors.end(); it++)
+        {
+            commands.push_back (new IteratorCommand<Item,Functor> (iterator, *it, *synchro, groupSize, deleteSynchro));
+        }
+
+        /** We dispatch the commands. */
+        status.time = dispatchCommands (commands);
+
+        /** We reset the iterator (in case it would be used again). */
+        iterator->reset();
+
+        /** We get rid of the synchronizer. */
+        delete synchro;
+
+        /** We set the status. */
+        status.nbCores = commands.size();
+
+        /** We set the group size. */
+        status.groupSize = groupSize;
+        
+        /** We return the status. */
+        return status;
+    }
+
+    /* We need some inner class for iterate some iterator in one thread. */
+    template <typename Item, typename Functor> class IteratorCommand : public ICommand, public system::SmartPointer
+    {
+    public:
+        /** Constructor.
+         * \param[in] it : iterator to be used (shared by several IteratorCommand instances)
+         * \param[in] fct : functor fed with the iterated items
+         * \param[in] synchro : shared synchronizer for accessing several items
+         * \param[in] groupSize : number of items got from the iterator in one synchronized block.
+         */
+        IteratorCommand (Iterator<Item>* it, Functor*& fct, system::ISynchronizer& synchro, size_t groupSize, bool deleteSynchro)
+            : _it(it), _fct(fct), _synchro(synchro), _groupSize(groupSize), _deleteSynchro(deleteSynchro)  {}
+
+        /** Implementation of the ICommand interface.*/
+        void execute ()
+        {
+            /** Vector of items to be retrieved from the iterator. */
+            std::vector<Item> items (_groupSize);
+
+            /** We begin the iteration. */
+            for (bool isRunning=true;  isRunning ; )
+            {
+                /** We lock the shared synchronizer before accessing the iterator. */
+                 _synchro.lock ();
+
+                 /** We retrieve some items from the iterator. */
+                 isRunning = _it->get (items);
+
+                 /** We unlock the shared synchronizer after accessing the iterator. */
+                 _synchro.unlock ();
+
+                 /** We have retrieved some items from the iterator.
+                  * Now, we don't need any more to be synchronized, so we can call the current functor
+                  * with the retrieved items. */
+                 for (size_t i=0; i<items.size(); i++)  {   (*_fct) (items[i]); }
+            }
+
+            /** We do not need the functor after that, delete it here to have parallel delete */
+            if (_deleteSynchro)  { _synchro.lock (); }
+            delete _fct;
+            if (_deleteSynchro)  { _synchro.unlock (); }
+        }
+
+    private:
+        Iterator<Item>*        _it;
+        Functor*&              _fct;
+        system::ISynchronizer& _synchro;
+        size_t                 _groupSize;
+        bool                   _deleteSynchro;
+    };
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_DP_ICOMMAND_HPP_ */
diff --git a/gatb-core/src/gatb/tools/designpattern/api/IObserver.hpp b/gatb-core/src/gatb/tools/designpattern/api/IObserver.hpp
new file mode 100644
index 0000000..65510be
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/api/IObserver.hpp
@@ -0,0 +1,175 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IObserver.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Smart Pointer Design Pattern definition
+ *
+ *  This file holds interfaces related to the Design Pattern Observer.
+ */
+
+#ifndef _GATB_CORE_TOOLS_DP_IOBSERVER_HPP_
+#define _GATB_CORE_TOOLS_DP_IOBSERVER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/api/types.hpp>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+/** \brief Tools package */
+namespace tools {
+/** \brief Design Patterns concepts */
+namespace dp    {
+/********************************************************************************/
+
+/* Forward declarations. */
+class ISubject;
+
+/********************************************************************************/
+
+/* We define a type for identifying an interface. */
+typedef u_int32_t InterfaceId;
+
+/********************************************************************************/
+
+/** \brief Piece of information linked to a notification.
+ *
+ *  The EventInfo class is intended to be received by clients during a notification.
+ *  Subclasses are meant to provide specific information related to specific notifications.
+ *
+ *  Defined as a SmartPointer for easing the EventInfo instances life cycle management.
+ */
+class EventInfo : public system::SmartPointer
+{
+public:
+
+    /** Returns the identifier of the group the EventInfo belongs to.
+     *  \return the identifier
+     */
+    InterfaceId getInterface ()  const { return _interface; }
+
+protected:
+
+    /** Constructor.
+     * \param[in] interface : identifier of the interface this EventInfo instance belongs to.
+     */
+    EventInfo (const InterfaceId& interface) : _interface(interface) {}
+
+    /** Destructor. */
+    virtual ~EventInfo() {}
+
+    /** Id of the group the EventInfo is related. This allows to group several EventInfo
+     *  subclasses with a common identifier. */
+    InterfaceId _interface;
+};
+
+/********************************************************************************/
+
+/** \brief Interface of the Observer Design Pattern.
+ *
+ *  The Observer Design Pattern is an object oriented way for managing a notification
+ *  system in a software. This is an extremely useful pattern because it allows
+ *  the communication between software components without having strong dependencies
+ *  between them.
+ *
+ *  For instance, a tool sends notifications about its progression. This is useful for
+ *  potential clients that want to know whether they have to wait a long time before
+ *  the algorithm finishes. The important point is that a tool is not polluted by clients
+ *  concerns, it just notifies some information, without even know who in particular will
+ *  receive the information.
+ *
+ *  This interface merely defines an 'update' method that can be called by some subjects
+ *  for telling that some notification is occurring. Some information can be provided to
+ *  the IObserver instance through an EventInfo instance.
+ *
+ *  Note that the subject that initiated the notification is also provided to the observer.
+ *  This may be useful for discriminating some unwanted behavior, for instance the IObserver
+ *  being itself the subject.
+ *
+ *  \see ISubject
+ *  \see EventInfo
+ *  \see IterationStatusEvent
+ */
+class IObserver
+{
+public:
+
+    /** Destructor. */
+    virtual ~IObserver() {}
+
+    /** Method called by Subject for some notification.
+     *  \param[in] evt     : specific information related to the notification.
+     *  \param[in] subject : the subject (ie. the caller of the 'update' method).
+     */
+    virtual void update (EventInfo* evt, ISubject* subject) = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Interface of the Subject in the Observer Design Pattern.
+ *
+ *   This class provides methods for adding/removing observers to the subject.
+ *
+ *   There is also a 'notify' method that should be called when a notification has to be sent.
+ *
+ * Example:
+ * \snippet observer1.cpp  snippet1
+ *
+ *  \see IObserver
+ */
+class ISubject
+{
+public:
+
+    /** Destructor. */
+    virtual ~ISubject() {}
+
+    /** Returns the identifier the subject knows about.
+     * \return identifier
+     */
+    virtual InterfaceId getInterface () = 0;
+
+    /** Add an observer to the subject.
+     * \param[in] observer : the observer to be added.
+     */
+    virtual void addObserver    (IObserver* observer) = 0;
+
+    /** Remove an observer from the subject.
+     * \param[in] observer : the observer to be removed.
+     */
+    virtual void removeObserver (IObserver* observer) = 0;
+
+    /** Notify some piece of information to potential observer instances.
+     * Actual implementations are likely to loop over all attached observer instances
+     * and call the 'update' method on each of them.
+     *
+     * \param[in] event : information related to the notification
+     */
+    virtual void notify (EventInfo* event) = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_DP_IOBSERVER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/designpattern/api/Iterator.hpp b/gatb-core/src/gatb/tools/designpattern/api/Iterator.hpp
new file mode 100644
index 0000000..995ab76
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/api/Iterator.hpp
@@ -0,0 +1,273 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Iterator.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Smart Pointer Design Pattern definition
+ *
+ *  This file holds interfaces related to the Design Pattern Observer.
+ */
+
+#ifndef _GATB_CORE_DP_ITERATOR_HPP_
+#define _GATB_CORE_DP_ITERATOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/api/ISmartPointer.hpp>
+
+#include <vector>
+#include <iostream>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+/** \brief Tools package */
+namespace tools {
+/** \brief Design Patterns concepts */
+namespace dp    {
+/********************************************************************************/
+
+/** \brief  Definition of the Design Pattern Iterator interface.
+ *
+ *    The Iterator concept is here reified as a template class that knows how to iterate some set of objects.
+ *
+ *  Actually, the interface has two ways for iterating instances:
+ *    1- the 'classic' one in terms of Iterator Design Pattern (see first/next/isDone methods)
+ *    2- a callback way (see 'iterate' methods) where some client provides a callback that will be called for each object
+ *
+ *  There may be good reasons for using one way or another. For instance, the first one may be easier to use by clients
+ *  (no extra method to be defined) but may be less efficient because more methods calls will be carried out.
+ *
+ *  Note that 'iterate' has great subclassing potentiality; by default, its implementation relies on first/isDone/next/currentItem
+ *  methods and so can't be faster that the 'classic' way. But specific implementations of Iterator may implement 'iterate'
+ *  directly by using inner state of the class, and so without call to  first/isDone/next/currentItem methods.
+ *
+ *  Note that for optimization point of view, an algorithm prefers to use the 'iterate' way with optimized implementations.
+ *
+ *  Sample of use:
+ *  \code
+ *   dp::Iterator<MyType*>* it = new MyIterator ();
+ *   for (it->first(); ! it->isDone(); it->next() )
+ *   {
+ *      // retrieve the current item of some type
+ *      MyType* item = it->item ();
+ *   }
+ *  \endcode
+ *
+ *
+ *  A remark on the STL: the Standard Template Library provides also the iterator concept. For instance, one could write:
+ *  \code
+ *   std::list<MyType*> l;
+ *
+ *   // we suppose here that we add some items to the list.
+ *
+ *   for (std::list<MyType*>::iterator it = l.begin(); it != l.end(); it++)
+ *   {
+ *      // retrieve the current item of some type
+ *      MyType* item = *it;
+ *   }
+ *  \endcode
+ *
+ *  We can see the following differences with our own iterator.
+ *   \li the iteration loop with the STL needs to know the iterated list, through the beginning iterator 'l.begin()'
+ *   and the ending iterator 'l.end()'. In our case, we don't have any reference of the iterated container, we can see
+ *   only a reference on the iterator itself.
+ *   \li the iteration loop with the STL makes apparent the actual type of the container ('list' in the example), which
+ *   is not the case for our iterator, where we can see only the type of the iterated items.
+ *   \li the STL iterators can only iterate contents of containers, ie. some items already in memory. Our iterator concept
+ *   is more general because it can iterate items that it builds on the fly, without having the whole items mounted in memory.
+ *   A typical use is the parsing of a huge FASTA database (say 8 GBytes for instance). With a STL iterator, we should have
+ *   the whole sequences lying in some containers before iterating them; with our iterator, it is enough to know a sequence
+ *   at a given time. Note however that clients of such iterators must not reference a sequence that is transient by nature.
+ *   In such a case, clients have to copy, if needed, the iterated sequence for some local work.
+ *
+ *  In brief, our iterator encapsulates more information that the STL iterator, allows to iterate potential containers (versus
+ *  actual containers) and may be easier to use.
+ *
+ *  Moreover, we can use our iterator as a basis for other ways for iteration.
+ *
+ *
+ *  note (GR): this iterator system looks like the range of C++11, now that we use C++11, we could switch to range:
+ *
+ *  for ( MyType elem : range )
+ *   {
+ *      // use elem
+ *   }
+ *
+ *   it has the same benefits as the listed benefits of the Iterator class, IMHO
+ */
+template <class Item> class Iterator : public system::SmartPointer
+{
+public:
+
+    /** */
+    Iterator () : _item(&_default), _isRunning(IDDLE) {}
+
+    /** Method that initializes the iteration. */
+    virtual void first() = 0;
+
+    /** Method that goes to the next item in the iteration.
+     * \return status of the iteration
+     */
+    virtual void next()  = 0;
+
+    /** Method telling whether the iteration is finished or not.
+     * \return true if iteration is finished, false otherwise.
+     */
+    virtual bool isDone() = 0;
+
+    /** Method that returns the current iterated item. Note that the returned type is the template type.
+        \return the current item in the iteration.
+    */
+    virtual Item& item () = 0;
+
+    /** Operator overload as a shortcut for the 'item' method. */
+    Item* operator-> ()  { return &item(); }
+
+    /** Operator overload as a shortcut for the 'item' method. */
+    Item& operator*  ()  { return item();  }
+
+    /** Another way to iterate: push model, ie a functor is called for each item. */
+    template <typename Functor> void iterate (const Functor& f)   {  for (first(); !isDone(); next())  { f (item()); }  }
+
+    /** Get a reference on the object to be configured as the currently iterated item.
+     * \param[in] i : object to be referred. */
+    virtual void setItem (Item& i)  {  _item = &i;  }
+
+    /** Retrieve some iterated items in a vector.
+     * NOTE: In general, this method should be protected against concurrent accesses (IteratorCommand::execute)
+     * \param[in] current : vector to be filled with iterated items. May be resized if not enough items available
+     * \return true if the iteration is not finished, false otherwise. */
+    bool get (std::vector<Item>& current)
+    {
+        /** We must check first that the iterator is not already finished.
+         * This is important when several threads are calling at the same time this method; if one thread consumes
+         * all the items, the other threads should not go into the 'for' loop below (otherwise, 'first' or 'next'
+         * would be called, which must not be)
+         */
+        if (_isRunning==FINISHED)  {  current.clear(); return false; }
+
+        size_t i=0;
+        for (i=0; i<current.size(); i++)
+        {
+            setItem (current[i]);
+
+            if (_isRunning == IDDLE)  { first ();  _isRunning=STARTED; }
+            else                      { next  ();                      }
+
+            if (isDone())
+            {
+                _isRunning=FINISHED;
+                current.resize (i);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /** Reset the iterator. */
+    virtual void reset ()
+    {
+        _isRunning = IDDLE;
+        _item      = &_default;
+    }
+
+    /** Method that may be called when an iteration is done. Does nothing by default. */
+    virtual void finalize () {}
+
+    /** Get a vector holding the composite structure of the iterator. */
+    virtual std::vector<Iterator<Item>*> getComposition()   {   std::vector<Iterator<Item>*> res;  res.push_back (this);  return res;    }
+
+protected:
+    Item* _item;
+
+private:
+    Item  _default;
+
+    enum Status { IDDLE, STARTED, FINISHED };
+    Status  _isRunning;
+};
+
+/********************************************************************************/
+
+template<typename T>
+class ISmartIterator : public Iterator<T>
+{
+public:
+    virtual ~ISmartIterator() {}
+    virtual u_int64_t size () const = 0;
+    virtual u_int64_t rank () const = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Interface for listening to iteration progress.
+ *
+ * This interface is intended to be notified by some progress job, and in particular
+ * to the progression of an iteration with an Iterator instance.
+ *
+ * It defines 3 methods:
+ *      - init   : method called just before the beginning of the iteration
+ *      - finish : method called just after the end of the iteration
+ *      - inc    : method called during the iteration; the provided arguments
+ *                 represents the number of iterations before the previous call
+ *
+ * Actually, this is a little more than just an interface since it provides empty
+ * implementations for the 3 methods; this will ease the development to clients who
+ * wants only to get 'inc' notifications but are not interested to do specific actions
+ * at the beginning and the end of the iteration.
+ *
+ * \see SubjectIterator
+ */
+class IteratorListener : public system::SmartPointer
+{
+public:
+
+    /** Destructor. */
+    virtual ~IteratorListener ()  {}
+
+    /** Initialization of the object. */
+    virtual void init () {}
+
+    /** Finish the progress information. */
+    virtual void finish () {}
+
+    /** Increase the number of currently done tasks. */
+    virtual void inc (u_int64_t ntasks_done) {}
+
+    /** Associate a message to the listener.
+     * \param[in] msg : message to be set. */
+    virtual void setMessage (const std::string& msg)  {}
+
+    /** Set the current number of tasks done.
+     * \param[in] ntasks_done :  sets the current number of job done. */
+    virtual void set (u_int64_t ntasks_done) {}
+
+    /** Set the total number of tasks done.
+     * \param[in] ntasks :  sets the total number of job. */
+    virtual void reset (u_int64_t ntasks) {}
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DP_ITERATOR_HPP_ */
diff --git a/gatb-core/src/gatb/tools/designpattern/impl/Command.cpp b/gatb-core/src/gatb/tools/designpattern/impl/Command.cpp
new file mode 100644
index 0000000..1b71ebf
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/impl/Command.cpp
@@ -0,0 +1,233 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+using namespace std;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::system;
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+namespace dp    {
+namespace impl  {
+/********************************************************************************/
+
+/** */
+class CommandStartSynchro : public ICommand, public system::SmartPointer
+{
+public:
+
+    CommandStartSynchro (ICommand* ref, system::ISynchronizer* synchro) : _ref(0), _synchro(synchro)  { setRef(ref); }
+    ~CommandStartSynchro ()  { setRef(0); }
+
+    void execute ()
+    {
+        if (_ref && _synchro)
+        {
+            /** We lock/unlock the synchronizer. */
+            _synchro->lock();  _synchro->unlock ();
+
+            /** We execute the delegate command. */
+            _ref->execute();
+        }
+    }
+
+private:
+    ICommand* _ref;
+    void setRef (ICommand* ref)  { SP_SETATTR(ref); }
+
+    system::ISynchronizer* _synchro;
+};
+
+/********************************************************************************/
+class SynchronizerNull : public system::ISynchronizer, public system::SmartPointer
+{
+public:
+    void   lock ()  {}
+    void unlock ()  {}
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+size_t SerialDispatcher::dispatchCommands (std::vector<ICommand*>& commands, ICommand* post)
+{
+    TIME_START (ti, "compute");
+
+    for (std::vector<ICommand*>::iterator it = commands.begin(); it != commands.end(); it++)
+    {
+        if (*it != 0)  {  (*it)->use ();  (*it)->execute ();  (*it)->forget ();  }
+    }
+
+    /** We may have to do some post treatment. Note that we do it in the current thread. */
+    if (post != 0)  {  post->use ();  post->execute ();  post->forget ();  }
+
+    TIME_STOP (ti, "compute");
+
+    return ti.getEntryByKey("compute");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+system::ISynchronizer* SerialDispatcher::newSynchro ()
+{
+    return new SynchronizerNull();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Dispatcher::Dispatcher (size_t nbUnits, size_t groupSize) : _nbUnits(nbUnits), _groupSize(groupSize)
+{
+    if (_nbUnits==0)  { _nbUnits = system::impl::System::info().getNbCores(); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+size_t Dispatcher::dispatchCommands (std::vector<ICommand*>& commands, ICommand* postTreatment)
+{
+    TIME_START (ti, "compute");
+
+    system::IThreadGroup* threadGroup = system::impl::ThreadGroup::create ();
+
+    size_t idx = 0;
+
+    /** We create threads and add them to the thread group. */
+    for (std::vector<ICommand*>::iterator it = commands.begin(); it != commands.end(); it++, idx++)
+    {
+        /** We add the thread to the group. Note that we have to set two things:
+         *  - the main loop function to be called by the thread
+         *  - the information to be provided to the main loop.
+         *
+         *  Note that we provide here a IThreadGroup::Info instance as data for the main loop
+         *  => it is important that at the beginning of the main loop we retrieved the correct
+         *  type from the void* data. */
+        threadGroup->add (
+            mainloop,
+            new IThreadGroup::Info (threadGroup,  new CommandStartSynchro (*it, threadGroup->getSynchro()), idx )
+        );
+    }
+
+    /** We start the group. */
+    threadGroup->start ();
+
+    /** We may have to forward exceptions got in threads. */
+    if (threadGroup->hasExceptions())  { throw threadGroup->getException(); }
+
+    /** Some cleanup. */
+    system::impl::ThreadGroup::destroy (threadGroup);
+
+    TIME_STOP (ti, "compute");
+
+    /** We return the result. */
+    return ti.getEntryByKey("compute");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+system::ISynchronizer* Dispatcher::newSynchro ()
+{
+    return system::impl::System::thread().newSynchronizer();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+system::IThread* Dispatcher::newThread (ICommand* command)
+{
+    return system::impl::System::thread().newThread (mainloop, command);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void* Dispatcher::mainloop (void* data)
+{
+    IThreadGroup::Info* info = (IThreadGroup::Info*) data;
+    LOCAL (info);
+
+    IThreadGroup* threadGroup = info->group;
+    ICommand*    cmd          = (ICommand*) info->data;
+
+    assert (threadGroup != 0);
+    assert (cmd         != 0);
+
+    /** Here, we should catch any exception thrown locally in a thread
+     * and keep it to re-throw it in the main thread. */
+    try
+    {
+        cmd->use ();
+        cmd->execute();
+        cmd->forget ();
+    }
+    catch (system::Exception& e)
+    {
+    	/** We copy the exception in the list of received exceptions of the thread group. */
+        threadGroup->addException (e);
+    }
+
+    return 0;
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/designpattern/impl/Command.hpp b/gatb-core/src/gatb/tools/designpattern/impl/Command.hpp
new file mode 100644
index 0000000..ab63966
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/impl/Command.hpp
@@ -0,0 +1,139 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Command.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation of ICommand and IDispatcher
+ */
+
+#ifndef _GATB_CORE_DP_ITERATOR_IMPL_COMMAND_HPP_
+#define _GATB_CORE_DP_ITERATOR_IMPL_COMMAND_HPP_
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/api/ICommand.hpp>
+#include <gatb/tools/misc/api/Macros.hpp>
+
+#include <list>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+namespace dp    {
+namespace impl  {
+/********************************************************************************/
+
+/** \brief Launches commands in current thread
+ *
+ * A dispatcher that uses the calling thread, so no parallelization.
+ *
+ * This implementation can be useful to process ICommand instances in an serial way
+ * when it is required, while keeping an uniform API (ie. call dispatchCommands)
+ * for running ICommand instances.
+ */
+class SerialDispatcher : public IDispatcher
+{
+public:
+
+    /** Destructor (defined because of presence of virtual methods). */
+    virtual ~SerialDispatcher() {}
+
+    /** \copydoc IDispatcher::dispatchCommands */
+    size_t dispatchCommands (std::vector<ICommand*>& commands, ICommand* postTreatment=0);
+
+    /** \copydoc IDispatcher::getExecutionUnitsNumber */
+    size_t getExecutionUnitsNumber () { return 1; }
+
+    /** \copydoc IDispatcher::setGroupSize */
+    void setGroupSize (size_t groupSize)  { }
+
+    /** \copydoc IDispatcher::getGroupSize */
+    size_t getGroupSize () const  { return 1; }
+
+private:
+
+    /** */
+    system::ISynchronizer* newSynchro ();
+};
+
+/********************************************************************************/
+
+/** \brief Launches commands in different threads
+ *
+ *  This implementation launches commands through different threads => parallelization.
+ *
+ *  This implementation of IDispatcher is central in a tool design because it allows
+ *  to uses all available cores. If one knows the number N of available cores on the computer,
+ *  one has just to split some job by creating N ICommand instances and then just dispatch these
+ *  commands through a Dispatcher: each command will be launched in a separated
+ *  thread, and, thanks to the operating system architecture, each thread should be processed
+ *  on an available core.
+ *
+ *  Note: it wouldn't be reasonable to use more ICommand instances than available cores.
+ *  By default, if the number of dispatching units is not provided in the constructor of
+ *  Dispatcher, it retrieves the number of available cores through the
+ *  a call to system functions, and uses it as default value. This means
+ *  that default constructor will use by default the whole CPU multicore power.
+ */
+class Dispatcher : public IDispatcher
+{
+public:
+
+    /** Constructor.
+     * \param[in] nbUnits : number of threads to be used. If 0 is provided, one tries to guess the number of available cores.
+     * \param[in] groupSize : number of items to be retrieved from the iterator by one thread in a synchronized way
+     */
+    Dispatcher (size_t nbUnits=0, size_t groupSize=0);
+
+    /** \copydoc IDispatcher::dispatchCommands */
+    size_t dispatchCommands (std::vector<ICommand*>& commands, ICommand* postTreatment=0);
+
+    /** \copydoc IDispatcher::getExecutionUnitsNumber */
+    size_t getExecutionUnitsNumber () { return _nbUnits; }
+
+    /** \copydoc IDispatcher::setGroupSize */
+    void setGroupSize (size_t groupSize)  { _groupSize = groupSize; }
+
+    /** \copydoc IDispatcher::getGroupSize */
+    size_t getGroupSize () const  { return _groupSize; }
+
+private:
+
+    /** */
+    system::ISynchronizer* newSynchro ();
+
+    /** */
+    system::IThread* newThread (ICommand* command);
+
+    /** */
+    static void* mainloop (void* data);
+
+    /** Number of execution units to be used for command dispatching. */
+    size_t _nbUnits;
+
+    /** Group size */
+    size_t _groupSize;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DP_ITERATOR_IMPL_COMMAND_HPP_ */
diff --git a/gatb-core/src/gatb/tools/designpattern/impl/IteratorHelpers.hpp b/gatb-core/src/gatb/tools/designpattern/impl/IteratorHelpers.hpp
new file mode 100644
index 0000000..df17628
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/impl/IteratorHelpers.hpp
@@ -0,0 +1,1023 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IteratorHelpers.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Some helper classes for iteration
+ */
+
+#ifndef _GATB_CORE_DP_ITERATOR_IMPL_ITERATOR_HELPERS_HPP_
+#define _GATB_CORE_DP_ITERATOR_IMPL_ITERATOR_HELPERS_HPP_
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <set>
+#include <list>
+#include <boost/variant.hpp>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+namespace dp    {
+namespace impl  {
+/********************************************************************************/
+
+/** \brief Null implementation of the Iterator interface.
+ *
+ * This implementation merely iterates over nothing. It may be useful to use such
+ * an instance when we have to provide an Iterator instance but with nothing to iterate.
+ */
+template <class Item> class NullIterator : public Iterator<Item>
+{
+public:
+
+    /** \copydoc  Iterator::first */
+    void first() {}
+
+    /** \copydoc  Iterator::next */
+    void next()  {}
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone() { return true; }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  { static Item item;  return item; }
+
+    /** Destructor. */
+    ~NullIterator() {}
+};
+
+/********************************************************************************/
+
+/** \brief Iterator over two iterators.
+ *
+ * We define a "product" iterator for two iterators, i.e. it will loop each possible
+ * couple of the two provided iterators.
+ *
+ *  It is useful for having only one loop instead of two loops. Note however that it
+ *  may still be more efficient to have two loops. The CartesianIterator is just here
+ *  for easing the product iteration on small sets.
+ *
+ * Example:
+ * \snippet iterators2.cpp  snippet1
+ */
+template <class T1, class T2> class ProductIterator : public Iterator < std::pair<T1,T2> >
+{
+public:
+
+    /** Constructor.
+     * \param[in] it1 : first iterator.
+     * \param[in] it2 : second iterator.
+     */
+    ProductIterator (Iterator<T1>& it1, Iterator<T2>& it2)  : _it1(it1), _it2(it2), _isDone(false)  {  first(); }
+
+    /** Destructor. */
+    virtual ~ProductIterator ()  {}
+
+    /** \copydoc Iterator::first */
+    void first()
+    {
+        /** We go to the beginning of the two iterators. */
+        _it1.first();
+        _it2.first();
+
+        /** We use a specific attribute to keep track of the finish status of the iterator.
+         *  This is merely an optimization in order not to call too often the "isDone" method
+         *  on the two iterators.  */
+        _isDone = false;
+    }
+
+    /** \copydoc Iterator::next */
+    void next()
+    {
+        /** We go to the next item of the second iterator. */
+        _it2.next ();
+
+        /** We check that it is not done. */
+        if (_it2.isDone())
+        {
+            /** We go to the next item of the first iterator. */
+            _it1.next ();
+
+            if (! _it1.isDone() )
+            {
+                /** The first iterator is not done, we can reset the second to its beginning. */
+                _it2.first ();
+            }
+            else
+            {
+                /** The first iterator is also done, the product iterator is therefore done. */
+                _isDone = true;
+            }
+        }
+    }
+
+    /** \copydoc Iterator::isDone */
+    bool isDone() { return _isDone; }
+
+    /** \copydoc Iterator::item */
+    std::pair<T1,T2>& item ()
+    {
+        _current.first  = _it1.item();
+        _current.second = _it2.item();
+
+        return _current;
+    }
+
+private:
+
+    /** First iterator. */
+    Iterator<T1>& _it1;
+
+    /** Second iterator. */
+    Iterator<T2>& _it2;
+
+    /** Current item in the iteration. */
+    std::pair<T1,T2> _current;
+
+    /** Tells whether the iteration is finished or not. */
+    bool _isDone;
+};
+
+/********************************************************************************/
+
+/** \brief Iterator over two iterators.
+ *
+ * We define a an iterator for two iterators, by iterating each of the two iterators
+ * and providing a pair of the two currently iterated items.
+ *
+ *  Example:
+ * \snippet iterators7.cpp  snippet1
+ *
+ */
+template <class T1, class T2=T1>
+class PairedIterator : public Iterator < std::pair<T1,T2> >
+{
+public:
+
+    /** Constructor.
+     * \param[in] it1 : first iterator.
+     * \param[in] it2 : second iterator.
+     */
+    PairedIterator (Iterator<T1>* it1, Iterator<T2>* it2)  : _it1(0), _it2(0), _isDone(true)
+    {
+        setIt1 (it1);   setIt2 (it2);
+    }
+
+    /** Destructor. */
+    virtual ~PairedIterator ()  {  setIt1 (0);   setIt2 (0);  }
+
+    /** \copydoc Iterator::first */
+    void first()
+    {
+        _it1->first();
+        _it2->first();
+
+        _isDone = _it1->isDone() || _it2->isDone();
+
+        if (_isDone==false)
+        {
+            _current.first  = _it1->item();
+            _current.second = _it2->item();
+        }
+    }
+
+    /** \copydoc Iterator::next */
+    void next()
+    {
+        _it1->next ();  _it2->next ();
+
+        _isDone = _it1->isDone() || _it2->isDone();
+        if (_isDone==false)
+        {
+            _current.first  = _it1->item();
+            _current.second = _it2->item();
+        }
+    }
+
+    /** \copydoc Iterator::isDone */
+    bool isDone() { return _isDone;  }
+
+    /** \copydoc Iterator::item */
+    std::pair<T1,T2>& item () { return _current; }
+
+private:
+
+    /** First iterator. */
+    Iterator<T1>* _it1;
+    void setIt1 (Iterator<T1>* it1)  { SP_SETATTR(it1); }
+
+    /** Second iterator. */
+    Iterator<T2>* _it2;
+    void setIt2 (Iterator<T2>* it2)  { SP_SETATTR(it2); }
+
+    /** Finish status. */
+    bool _isDone;
+
+    /** Current item in the iteration. */
+    std::pair<T1,T2> _current;
+};
+
+/********************************************************************************/
+
+/** \brief Factorization of code for the subject part of the Observer pattern.
+ */
+class AbstractSubjectIterator
+{
+public:
+
+    /** Constructor. */
+    AbstractSubjectIterator () : _hasListeners(false), _isStarted(false) {}
+
+    /** Destructor. */
+    ~AbstractSubjectIterator ()
+    {
+        /** We remove all observers. */
+        for (std::set<IteratorListener*>::iterator it = _listeners.begin(); it != _listeners.end(); it++)
+        {
+            (*it)->forget();
+        }
+    }
+
+    /** Add an observer to the iterator. Such an observer is provided as a functor.
+     * \param[in] f : functor to be subscribed to the iterator notifications.
+     */
+    void addObserver    (IteratorListener* f)
+    {
+        if (f != 0)
+        {
+            f->use ();
+            _listeners.insert (f);
+            _hasListeners=true;
+        }
+    }
+
+    /** Remove an observer from the iterator. Such an observer is provided as a functor.
+     * \param[in] f : functor to be unsubscribed from the iterator notifications.
+     */
+    void removeObserver (IteratorListener* f)
+    {
+        /** We look whether the given functor is already known. */
+        std::set<IteratorListener*>::iterator lookup = _listeners.find (f);
+        if (lookup != _listeners.end())
+        {
+            (*lookup)->forget();
+            _listeners.erase (lookup);
+            _hasListeners = _listeners.empty() == false;
+        }
+    }
+
+    /** Set a message to the observers. */
+    void setMessage (const std::string& message)
+    {
+        /** We remove all observers. */
+        for (std::set<IteratorListener*>::iterator it = _listeners.begin(); it != _listeners.end(); it++)
+        {
+            (*it)->setMessage (message);
+        }
+    }
+
+protected:
+
+    /** Notify all the subscribed functors.
+     * \param[in] current : number of currently iterated items during the iteration. */
+    void notifyInc (u_int64_t current)
+    {
+        if (_isStarted == true)
+        {
+            /** We call each subscribing functor. */
+            for (std::set<IteratorListener*>::iterator it = _listeners.begin(); it != _listeners.end(); it++)
+            {
+                /** Not very pretty syntax, but that works. */
+               (*it)->inc (current);
+            }
+        }
+    }
+
+    /** Notify all the subscribed functors about the start of the iteration. */
+    void notifyInit ()
+    {
+        if (_isStarted == false)
+        {
+            _isStarted = true;
+
+            /** We call each subscribing functor. */
+            for (std::set<IteratorListener*>::iterator it = _listeners.begin(); it != _listeners.end(); it++)
+            {
+                (*it)->init ();
+            }
+        }
+    }
+
+    /** Notify all the subscribed functors about the start of the iteration. */
+    void notifyFinish ()
+    {
+        if (_isStarted == true)
+        {
+            _isStarted = false;
+
+            /** We call each subscribing functor. */
+            for (std::set<IteratorListener*>::iterator it = _listeners.begin(); it != _listeners.end(); it++)
+            {
+                (*it)->finish ();
+            }
+        }
+    }
+
+private:
+
+    std::set<IteratorListener*> _listeners;
+    bool                        _hasListeners;
+    bool                        _isStarted;
+};
+
+/********************************************************************************/
+
+/** \brief Iterator that notifies some listener during iteration.
+ *
+ * Implementation note: we have to keep reference (through pointers) on functors
+ * because we want them to be notified and not a copy of them.
+ *
+ * Note also that we don't allow to have twice the same observer (we use a set as
+ * observers container).
+ *
+ * \snippet iterators4.cpp  snippet1_SubjectIterator
+ */
+template <class Item> class SubjectIterator : public Iterator<Item>, public AbstractSubjectIterator
+{
+public:
+
+    /** Constructor
+     * \param[in] ref : the referred iterator
+     * \param[in] modulo : notifies every 'modulo' time
+     * \param[in] listener : default listener attached to this subject (default value is 0)
+     */
+    SubjectIterator (Iterator<Item>* ref, u_int32_t modulo, IteratorListener* listener=0)
+        : _ref(0), _current(0), _modulo(modulo==0 ? 1 : modulo)
+    {
+        /** We set the reference. */
+        setRef (ref);
+
+        /** We may have a listener. */
+        if (listener != 0)  { this->addObserver (listener); }
+    }
+
+    /** Destructor. */
+    ~SubjectIterator ()
+    {
+        /** We release the reference. */
+        setRef (0);
+    }
+
+    /* \copydoc Iterator::first */
+    void first ()
+    {
+        notifyInit ();
+        _current = 0;
+        _ref->first ();
+    }
+
+    /* \copydoc Iterator::isDone */
+    bool isDone ()
+    {
+        bool res = _ref->isDone();  if (res)  { notifyFinish(); }  return res;
+    }
+
+    /* \copydoc Iterator::next */
+    void next ()
+    {
+        _ref->next ();
+        if ((_current % _modulo) == 0)  { notifyInc (_current);  _current=0; }
+        _current++;
+    }
+
+    /* \copydoc Iterator::item */
+    Item& item ()  { return _ref->item(); }
+
+    /* */
+    void setItem (Item& current)  { _ref->setItem(current); }
+
+    /* */
+    void reset ()  { _ref->reset(); }
+	
+	/* GR : this func was missing, previously caused subject iterator to return false composition*/
+	std::vector<Iterator<Item>*> getComposition()  { return _ref->getComposition(); }
+	
+
+
+private:
+
+    Iterator<Item>* _ref;
+    void setRef (Iterator<Item>* ref)  { SP_SETATTR(ref); }
+
+    u_int64_t _current;
+    u_int64_t _modulo;
+};
+
+/********************************************************************************/
+/** \brief Iterator that gather two iterators in a single loop.
+ *
+ * This iterator is equivalent to two iterators with one outer loop and one inner loop.
+ */
+template <typename T1, typename T2, typename Update> class CompoundIterator : public Iterator<T2>
+{
+public:
+    /** Constructor.
+     * \param[in] it1 : iterator for the outer loop.
+     * \param[in] it2 : iterator for the inner loop.
+     * \param[in] update : functor for updating inner loop with new item from outer loop
+     */
+    CompoundIterator (Iterator<T1>&  it1, Iterator<T2>& it2, const Update& update)  : _it1(it1), _it2(it2), _update(update) {}
+
+    /** \copydoc Iterator::first */
+    void first ()
+    {
+        _it1.first();
+        if (!_it1.isDone())
+        {
+            _update (&_it2, &_it1.item());
+            _it2.first ();
+        }
+    }
+
+    /** \copydoc Iterator::next */
+    void next ()
+    {
+        _it2.next ();
+        if (_it2.isDone())
+        {
+            _it1.next();
+            if (!_it1.isDone())
+            {
+                _update (&_it2, &_it1.item());
+                _it2.first ();
+            }
+        }
+    }
+
+    /** \copydoc Iterator::isDone */
+    bool isDone() { return _it1.isDone(); }
+
+    /** \copydoc Iterator::item */
+    T2& item()  { return _it2.item(); }
+
+private:
+    Iterator<T1>&  _it1;
+    Iterator<T2>&  _it2;
+    Update         _update;
+};
+
+/********************************************************************************/
+/** \brief Iterator that truncate the number of iterations if needed.
+ *
+ * This iterator iterates a referred iterator and will finish:
+ *      - when the referred iterator is over
+ *   or - when a limit number of iterations is reached.
+ *
+ *  Example:
+ * \snippet iterators3.cpp  snippet1
+ */
+template <class Item> class TruncateIterator : public Iterator<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : the referred iterator
+     * \param[in] limit : the maximal number of iterations.
+     * \param[in] initRef : will call 'first' on the reference if true
+     */
+    TruncateIterator (Iterator<Item>& ref, u_int64_t limit, bool initRef=true)
+        : _ref(ref), _limit(limit), _currentIdx(0), _initRef(initRef), _isDone(true)  {}
+
+    /** \copydoc  Iterator::first */
+    void first()
+    {
+        _currentIdx=0;
+        if (_initRef)  { _ref.first(); }
+
+        /** We check whether the iteration is finished or not. */
+        _isDone = _ref.isDone() || _currentIdx >= _limit;
+
+        /** IMPORTANT : we need to copy the referred item => we just can't rely on a simple
+         * pointer (in case of usage of Dispatcher for instance where a buffer of items is kept
+         * and could be wrong if the referred items doesn't exist any more when accessing the
+         * buffer). */
+        if (!_isDone)  { *(this->_item) = _ref.item(); }
+    }
+
+    /** \copydoc  Iterator::next */
+    void next()
+    {
+        _currentIdx++;
+        _ref.next();
+
+        /** We check whether the iteration is finished or not. */
+        _isDone = _ref.isDone() || _currentIdx >= _limit;
+
+        /** IMPORTANT : we need to copy the referred item => we just can't rely on a simple
+         * pointer (in case of usage of Dispatcher for instance where a buffer of items is kept
+         * and could be wrong if the referred items doesn't exist any more when accessing the
+         * buffer). */
+        if (!_isDone)  { *(this->_item) = _ref.item(); }
+    }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone()  {  return _isDone;  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  {  return *(this->_item);  }
+
+private:
+
+    Iterator<Item>& _ref;
+    u_int64_t       _limit;
+    u_int64_t       _currentIdx;
+    bool            _initRef;
+    bool            _isDone;
+};
+
+
+/********************************************************************************/
+/** \brief Iterator that can be cancelled at some point during iteration
+ *
+ * This iterator iterates a referred iterator and will finish:
+ *      - when the referred iterator is over
+ *   or - when the cancel member variable is set to true
+ *
+ */
+template <class Item> class CancellableIterator : public Iterator<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : the referred iterator
+     * \param[in] initRef : will call 'first' on the reference if true
+     */
+    CancellableIterator (Iterator<Item>& ref, bool initRef=true)
+        : _cancel(true),  _ref(ref),  _initRef(initRef), _isDone(true) {}
+
+    /** \copydoc  Iterator::first */
+    void first()
+    {
+        _cancel = false;
+
+        if (_initRef)  { _ref.first(); }
+
+        /** We check whether the iteration is finished or not. */
+        _isDone = _ref.isDone();
+
+        /** IMPORTANT : we need to copy the referred item => we just can't rely on a simple
+         * pointer (in case of usage of Dispatcher for instance where a buffer of items is kept
+         * and could be wrong if the referred items doesn't exist any more when accessing the
+         * buffer).
+         * TODO doc: I get it, but why is it done only in this iterator and not other iterators like FilterIterator?*/
+        if (!_isDone)  { *(this->_item) = _ref.item(); }
+    }
+
+    /** \copydoc  Iterator::next */
+    void next()
+    {
+        _ref.next();
+
+        /** We check whether the iteration is finished or not. */
+        _isDone = _ref.isDone() || _cancel;
+
+        /** IMPORTANT : we need to copy the referred item => we just can't rely on a simple
+         * pointer (in case of usage of Dispatcher for instance where a buffer of items is kept
+         * and could be wrong if the referred items doesn't exist any more when accessing the
+         * buffer). */
+        if (!_isDone)  { *(this->_item) = _ref.item(); }
+    }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone()  {  return _isDone || _cancel;  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  {  return *(this->_item);  }
+
+    bool        _cancel;
+
+private:
+
+    Iterator<Item>& _ref;
+    bool            _initRef;
+    bool            _isDone;
+};
+
+/********************************************************************************/
+/** \brief Iterator that filters out some iterated items
+ *
+ * This iterator iterates a referred iterator and will filter out some items according
+ * to a functor provided at construction.
+ *
+ * Example:
+ * \snippet iterators6.cpp  snippet1
+ */
+template <class Item, typename Filter> class FilterIterator : public ISmartIterator<Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : the referred iterator
+     * \param[in] filter : the filter on items. Returns true if item is kept, false otherwise. */
+    FilterIterator (Iterator<Item>* ref, Filter filter) : _ref(0), _filter(filter), _rank(0)  { setRef(ref); }
+
+    /** Destructor. */
+    ~FilterIterator ()  { setRef(0); }
+
+    /** \copydoc  Iterator::first */
+    void first() { _rank=0; _ref->first(); while (!isDone() && _filter(item())==false) { _ref->next(); }  }
+
+    /** \copydoc  Iterator::next */
+    void next()  { _rank++; _ref->next();  while (!isDone() && _filter(item())==false) { _ref->next(); }  }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone() { return _ref->isDone();  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  { return _ref->item(); }
+
+    /** \copydoc  Iterator::setItem */
+    void setItem (Item& i)  { _ref->setItem(i); }
+
+    u_int64_t size () const  { return 0; }
+    u_int64_t rank () const  { return _rank; }
+
+private:
+
+    Iterator<Item>* _ref;
+    void setRef (Iterator<Item>* ref)  { SP_SETATTR(ref); }
+
+    Filter      _filter;
+    u_int64_t  _rank;
+};
+
+/********************************************************************************/
+
+template <class Item> class VectorIterator : public Iterator<Item>
+{
+public:
+    /** */
+    VectorIterator (const std::vector<Item>& items) : _items(items), _idx(0), _nb (items.size())   {}
+
+    /** */
+    VectorIterator () : _idx(0), _nb (0)  {}
+
+    /** */
+    virtual ~VectorIterator () {}
+
+    /** \copydoc  Iterator::first */
+    void first()  {  _idx = -1;  next ();  }
+
+    /** \copydoc  Iterator::next */
+    void next()  { ++_idx;  if (_idx < _nb ) { this->_item = &(_items[_idx]); }  }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone() {   return _idx >= _nb;  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  { return *(this->_item); }
+
+protected:
+    std::vector<Item> _items;
+    int32_t           _idx;
+    int32_t           _nb;
+};
+
+/********************************************************************************/
+
+template <class Item> class VectorIterator2 : public Iterator<Item>
+{
+public:
+
+    VectorIterator2 (std::vector<Item>& items) : _items(items), _idx(0), _nb (items.size())  {}
+
+    /** */
+    virtual ~VectorIterator2 () {}
+
+    /** \copydoc  Iterator::first */
+    void first()  {  _idx = -1;  next ();  }
+
+    /** \copydoc  Iterator::next */
+    void next()  { ++_idx;  if (_idx < _nb ) { *(this->_item) = (_items[_idx]); }  }
+
+    /** \copydoc  Iterator::isDone */
+    bool isDone() {   return _idx >= _nb;  }
+
+    /** \copydoc  Iterator::item */
+    Item& item ()  { return *(this->_item); }
+
+protected:
+    std::vector<Item>& _items;
+    int32_t            _idx;
+    int32_t            _nb;
+};
+
+/********************************************************************************/
+
+template <template <class> class IteratorType , typename T1, typename T2=T1, typename T3=T2, typename T4=T3>
+class IteratorVariant : public IteratorType <boost::variant<T1,T2,T3,T4> >
+{
+private:
+
+    typedef boost::variant < IteratorType<T1>, IteratorType<T2>, IteratorType<T3>, IteratorType<T4> > Type;
+
+    Type var;
+
+    struct fct_first  : public boost::static_visitor<>     {  template<typename T>  void operator() (T& a) const { a.first();          }};
+    struct fct_next   : public boost::static_visitor<>     {  template<typename T>  void operator() (T& a) const { a.next ();          }};
+    struct fct_isDone : public boost::static_visitor<bool> {  template<typename T>  bool operator() (T& a) const { return a.isDone();  }};
+
+    struct fct_set : public boost::static_visitor<>
+    {
+        boost::variant<T1,T2,T3,T4>& val;
+        fct_set (boost::variant<T1,T2,T3,T4>& val) : val(val) {}
+        template<typename T>  void operator() (T& a) const { val = a.item();  }
+    };
+
+    bool _isDone;
+
+public:
+
+    virtual ~IteratorVariant() {}
+
+    template<typename T>
+    IteratorVariant& operator=(const T& t)  {  var = t;  return *this;  }
+
+    /**  */
+    void first()
+    {
+        boost::apply_visitor (fct_first(), var);
+        _isDone = boost::apply_visitor (fct_isDone(), var);
+        if (!_isDone)  {  boost::apply_visitor (fct_set(*(this->_item)), var);  }
+    }
+
+    /** */
+    void next()
+    {
+        boost::apply_visitor (fct_next(), var);
+        _isDone = boost::apply_visitor (fct_isDone(), var);
+        if (!_isDone)  {  boost::apply_visitor (fct_set(*(this->_item)), var);  }
+    }
+
+    /** */
+    bool isDone() { return _isDone; }
+
+    /** */
+    boost::variant<T1,T2,T3,T4>& item ()  {  return *(this->_item);  }
+
+    /** Get a reference on the object to be configured as the currently iterated item.
+     * \param[in] i : object to be referred. */
+    virtual void setItem (boost::variant<T1,T2,T3,T4>& i)  {  this->_item = &i;  }
+};
+
+/********************************************************************************/
+
+/** \brief TO BE DONE...
+ */
+template <class Container, typename Type> class STLIterator : public Iterator<Type>
+{
+public:
+    /** Constructor.
+     * \param[in]  l : the list to be iterated
+     */
+    STLIterator (const Container& l)  : _l(l),_isDone(true) {}
+
+    /** Destructor (here because of virtual methods). */
+    virtual ~STLIterator ()  {}
+
+    /** */
+    void first()
+    {
+        _iter = _l.begin();
+        _isDone = _iter == _l.end ();
+        if (!_isDone)  { * this->_item = *_iter; }
+    }
+
+    /** */
+    void next()
+    {
+        _iter++;
+        _isDone = _iter == _l.end ();
+        if (!_isDone)  { * this->_item = *_iter; }
+    }
+
+    /** */
+    bool isDone() { return _isDone; }
+
+    /** */
+    Type& item()  { return * this->_item; }
+
+private:
+
+    /** List to be iterated. */
+    Container _l;
+
+    /** STL iterator we are going to wrap. */
+    typename Container::iterator _iter;
+
+    bool _isDone;
+};
+
+/********************************************************************************/
+
+/** \brief Iterator that loops over std::list
+ *
+ *  This class is a wrapper between the STL list implementation and our own Iterator
+ *  abstraction.
+ *
+ *  Note that the class is still a template one since we can iterate on list of anything.
+ *
+ *  \code
+ *  void foo ()
+ *  {
+ *      list<int> l;
+ *      l.push_back (1);
+ *      l.push_back (2);
+ *      l.push_back (4);
+ *
+ *      ListIterator<int> it (l);
+ *      for (it.first(); !it.isDone(); it.next())       {   cout << it.currentItem() << endl;   }
+ *  }
+ *  \endcode
+ */
+template <class Type> class ListIterator : public STLIterator<std::list<Type>, Type>
+{
+public:
+    ListIterator (const std::list<Type>& l)  :  STLIterator<std::list<Type>, Type> (l)  {}
+};
+
+/********************************************************************************/
+
+template <class Type> class VecIterator : public STLIterator<std::vector<Type>, Type>
+{
+public:
+    VecIterator (const std::vector<Type>& l)  :  STLIterator<std::vector<Type>, Type> (l)  {}
+};
+
+/********************************************************************************/
+
+/** \brief Composite iterator
+ *
+ * This iterator takes a list of iterators as input and iterates each one of these
+ * iterators.
+ *
+ *  Example:
+ * \snippet iterators9.cpp  snippet1
+ */
+template <class Item>
+class CompositeIterator : public Iterator <Item>
+{
+public:
+
+    /** Constructor.
+     * \param[in] iterators : the iterators vector
+     */
+    CompositeIterator (std::vector <Iterator<Item>*>&  iterators)
+        : _iterators(iterators), _currentIdx(0), _currentIt(0), _isDone(true)
+    {
+        for (size_t i=0; i<_iterators.size(); i++)  { _iterators[i]->use(); }
+
+        _currentIt = _iterators[_currentIdx];
+    }
+
+    /** Destructor. */
+    virtual ~CompositeIterator ()
+    {
+        for (size_t i=0; i<_iterators.size(); i++)  { _iterators[i]->forget(); }
+    }
+
+    /** \copydoc Iterator::first */
+    void first()
+    {
+        /** We initialize attributes. */
+        _currentIdx = 0;
+        _isDone     = true;
+
+        /** We look for the first non finished iterator. */
+        update (true);
+    }
+
+    /** \copydoc Iterator::next */
+    void next()
+    {
+        _currentIt->next();
+        _isDone = _currentIt->isDone();
+
+        if (_isDone == true)  {  update (false);  }
+    }
+
+    /** \copydoc Iterator::isDone */
+    bool isDone() { return _isDone; }
+
+    /** \copydoc Iterator::item */
+    Item& item ()  {  return _currentIt->item(); }
+
+    /** IMPORTANT : the Item argument provided to 'setItem' must be the object to be modified by
+     * one of the delegate iterator AND NOT the current item of CompositeIterator. Therefore,
+     * we make point the delegate current item to this provided Item argument. */
+    void setItem (Item& i)  {  _currentIt->setItem (i);  }
+
+    /** Get a vector holding the composite structure of the iterator. */
+    virtual std::vector<Iterator<Item>*> getComposition() { return _iterators; }
+
+private:
+
+    std::vector <Iterator<Item>*>  _iterators;
+
+    size_t          _currentIdx;
+    Iterator<Item>* _currentIt;
+
+    bool _isDone;
+
+    void update (bool isFirst)
+    {
+        if (_currentIdx >= _iterators.size()) { _isDone=true;  return; }
+
+        if (!isFirst)  { _currentIdx++; }
+
+        while ((int)_currentIdx<(int)_iterators.size() && _isDone == true)
+        {
+            Iterator<Item>* previous = _currentIt;
+
+            /** We get the next iterator. */
+            _currentIt = _iterators[_currentIdx];
+            assert (_currentIt != 0);
+
+            /** We have to take the reference of the previous iterator. */
+            _currentIt->setItem (previous->item());
+
+            /** We have to "first" this iterator. */
+            _currentIt->first();
+
+            /** We update the 'isDone' status. */
+            _isDone = _currentIt->isDone();
+
+            if (_isDone==true) { _currentIdx++; }
+
+            /** We can finish the previous item (only if not first call). */
+            if (!isFirst) { previous->finalize(); }
+        }
+    }
+};
+
+	
+/********************************************************************************/
+/** \brief Iterator adaptation from one type to another one
+ */
+template <class T1, class T2, class Adaptor>
+class IteratorAdaptor : public Iterator <T2>
+{
+public:
+
+    /** Constructor. */
+    IteratorAdaptor (Iterator<T1>* ref) : _ref(0) { setRef(ref); }
+
+    /** Destructor. */
+    ~IteratorAdaptor ()  { setRef(0); }
+
+    /** Method that initializes the iteration. */
+    void first() {  _ref->first(); }
+
+    /** Method that goes to the next item in the iteration.
+     * \return status of the iteration
+     */
+    void next()  { _ref->next(); }
+
+    /** Method telling whether the iteration is finished or not.
+     * \return true if iteration is finished, false otherwise.
+     */
+    bool isDone()  { return _ref->isDone(); }
+
+    /** */
+    T2& item ()  { return Adaptor() (_ref->item()); }
+
+private:
+
+    Iterator<T1>* _ref;
+    void setRef (Iterator<T1>* ref)  { SP_SETATTR(ref); }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DP_ITERATOR_IMPL_ITERATOR_HELPERS_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/designpattern/impl/Observer.cpp b/gatb-core/src/gatb/tools/designpattern/impl/Observer.cpp
new file mode 100644
index 0000000..587596a
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/impl/Observer.cpp
@@ -0,0 +1,146 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/designpattern/impl/Observer.hpp>
+#include <gatb/system/impl/System.hpp>
+
+using namespace std;
+using namespace gatb::core::tools::dp;
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+namespace dp    {
+namespace impl  {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Subject::Subject ()
+:   _interface(0), _singleObserver(0), _observers(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Subject::Subject (const InterfaceId& interface)
+:   _interface(interface), _singleObserver(0), _observers(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Subject::~Subject()
+{
+    if (_observers != 0)  { delete _observers; }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Subject::notify (EventInfo* event)
+{
+    if (event != 0)
+    {
+        /** We locally use the event. */
+        LOCAL (event);
+
+        if (_observers != 0)
+        {
+            /** Optimization in case we have only one observer. */
+            if (_singleObserver != 0)  {  _singleObserver->update (event, this);  }
+
+            else
+            {
+                for (std::list<IObserver*>::iterator it=_observers->begin(); it!=_observers->end(); it++)
+                {
+                    (*it)->update (event, this);
+                }
+            }
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Subject::addObserver (IObserver* observer)
+{
+    /** We check the list. */
+    if (_observers==0)  { _observers = new std::list<IObserver*> () ; }
+
+    /** We add the observer into the list. */
+    _observers->push_back (observer);
+
+    /** We may use the 'single observer' optimization. */
+    _singleObserver = (_observers->size() == 1  ? _observers->front() : 0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Subject::removeObserver (IObserver* observer)
+{
+    /** We check the list. */
+    if (_observers==0)  { _observers = new std::list<IObserver*> () ; }
+
+    /** We remove the observer from the list. */
+    _observers->remove (observer);
+
+    /** We may use the 'single observer' optimization. */
+    _singleObserver = (_observers->size() == 1  ? _observers->front() : 0);
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/designpattern/impl/Observer.hpp b/gatb-core/src/gatb/tools/designpattern/impl/Observer.hpp
new file mode 100644
index 0000000..7b98250
--- /dev/null
+++ b/gatb-core/src/gatb/tools/designpattern/impl/Observer.hpp
@@ -0,0 +1,101 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Observer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation of INode interface
+ */
+
+#ifndef _GATB_CORE_DP_ITERATOR_IMPL_OBSERVER_HPP_
+#define _GATB_CORE_DP_ITERATOR_IMPL_OBSERVER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/api/IObserver.hpp>
+#include <list>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+namespace dp    {
+namespace impl  {
+/********************************************************************************/
+
+
+/** \brief Class that notifies potential observers.
+ *
+ * The main purpose of this class is to manage the set of IObservers attached to the subject.
+ *
+ * Then, classes that want subject-like behavior can inherit from Subject or have a Subject
+ * attribute.
+ *
+ * \see ISubject
+ */
+class Subject : public ISubject
+{
+public:
+
+    /** Constructor. */
+    Subject ();
+
+    /** Constructor.
+     * \param[in] interface : the identifier of the subject. */
+    Subject (const InterfaceId& interface);
+
+    /** Destructor. */
+    virtual ~Subject();
+
+    /** Returns the identifier of the subject. */
+    InterfaceId getInterface ()  { return _interface; }
+
+    /** Attach an observer to this subject.
+     * \param[in] observer : the observer to be attached.
+     */
+    void addObserver    (IObserver* observer);
+
+    /** Detach an observer from this subject.
+     * \param[in] observer : the observer to be detached.
+     */
+    void removeObserver (IObserver* observer);
+
+    /** Notify observers by sending a EventInfo instance.
+     * \param[in]  event : the information to be sent to the observers.
+     */
+    void notify (EventInfo* event);
+
+private:
+
+    /** Identifier of the subject. */
+    InterfaceId             _interface;
+
+    /** Optimization attribute. */
+    IObserver*              _singleObserver;
+
+    /** List of observers attached to the subject. */
+    std::list<IObserver*>*  _observers;
+};
+
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_DP_ITERATOR_IMPL_CELL_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/FastMinimizer.hpp b/gatb-core/src/gatb/tools/math/FastMinimizer.hpp
new file mode 100644
index 0000000..ad96922
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/FastMinimizer.hpp
@@ -0,0 +1,154 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file FastMinimizer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Fast computation of lexicographical minimizers wtih no-AA-inside constraint
+ */
+
+
+#ifndef _GATB_CORE_TOOLS_MATH_FASTMINIMIZER_HPP_
+#define _GATB_CORE_TOOLS_MATH_FASTMINIMIZER_HPP_
+
+
+#include <stdint.h>
+
+extern const unsigned char revcomp_4NT[];
+
+template<typename T, typename minimizer_type> inline void fastLexiMinimizerChunk (T val, const unsigned int _nbMinimizers, const unsigned int m, const minimizer_type high_bits, minimizer_type &minimizer, size_t &position, size_t position_offset, bool &AA_found) 
+{
+    // FIXME: useless for minimizer size larger than 16 just because of the 0x55555555 mask 
+    if (m > 16) {AA_found = false; return;}
+    
+    /* those require only a single AND operation, rest are constants */
+    #define BINARY_MMER_STARTS_WITH_2MER(val,m,binnucl) ((val & (15 << (2*(m-2)))) == (binnucl << (2*(m-2))) )
+    #define BINARY_MMER_ENDS_WITH_2MER(val,binnucl)  ((val & 15) == binnucl)
+    unsigned int j = 0;
+    bool adjusted_near_end = (high_bits == 0); /* will adjust only if there are bits */
+    const unsigned int nb_minim_in_chunk = sizeof(T)*4;
+    const minimizer_type m_mask = (1 << (2*m)) - 1;
+    
+    //int next_TT_in_shifts = -1;
+ 
+    /* numbers of minimizers to examine in this chunk
+     * we assume that each nucleotide of a chunk is the start of a minimizer
+     * because we add missing (m-1) nucl as high bits later */
+    const unsigned int it = std::min((unsigned int)nb_minim_in_chunk, _nbMinimizers - (unsigned int)position_offset); 
+
+    while (j < it)
+    {
+        if ((j >= nb_minim_in_chunk - m) && (! adjusted_near_end))
+        { 
+            /* append the next m-1 (or less) characters to "val", in order 
+             * to keep iterating minimizers smoothly across the boundary of our representation*/
+            val |= high_bits << ((nb_minim_in_chunk - j)*2);
+            adjusted_near_end = true;
+        }
+
+        //bool mmer_starts_with_TT = (BINARY_MMER_STARTS_WITH_2MER(val,m,10));
+        bool mmer_starts_with_AA = (BINARY_MMER_STARTS_WITH_2MER(val,m,0  /* (AA=0b) */));
+        bool mmer_ends_with_TT = (BINARY_MMER_ENDS_WITH_2MER(val,10 /* (TT = 1010b = 10)*/));
+
+        minimizer_type candidate = val & m_mask; 
+
+        if (mmer_ends_with_TT)
+        {
+            minimizer_type candidate_revcomp = ((revcomp_4NT [val&0xFF] << 8) | revcomp_4NT [(val>>8)&0xFF]) & m_mask; 
+            if (mmer_starts_with_AA) 
+                candidate = std::min(candidate, candidate_revcomp);
+            else
+                candidate = candidate_revcomp;
+        }
+
+        if (mmer_starts_with_AA || mmer_ends_with_TT)
+        {
+            AA_found = true;
+
+            if (candidate < minimizer)
+            {
+                /* check if it's allowed
+                   for comments of that code, see the is_allowed function */
+                minimizer_type a1 = candidate & m_mask; //
+                a1 =   ~(( a1 )   | (  a1 >>2 ));  //
+                a1 =((a1 >>1) & a1) & ((1 << ((m-2)*2)) -1 ) & 0x55555555;  //
+                
+                if (a1 == 0)
+                {
+                    /* set new minimizer */
+                    minimizer = candidate;
+
+                    /* last minimizer has position k - m 
+                     * nbminimizers is k - m 
+                     * position_offset is here because k is divided by chunks of 32 nucleotides */
+                    position = (_nbMinimizers - 1) - position_offset - j;
+                }
+            }
+
+        } // end if (TT last or AA first)
+        // commented, because turns out this was slower in practice (k=51, e.coli).
+        /*
+
+         * let's call AA-type a m-mer of the form AA......
+         * and TT-type a m-mer of the form ......TT
+         * (it is the reverse-complement of a possible minimizer of the kmer)
+         * m-mers which are both AA-type and TT-type are corner cases.
+         *
+         * furthermore, we only care about AA-type or TT-type m-mers ("candidates"). 
+         * other m-mers are ignored.
+         *
+         * we make the hypothesis (see above) that the minimizer is either a candidate 
+         * (if it's AA-type) or the reverse complement of a candidate (if it's TT-type).
+         *
+         * idea: a minimizer can never be of the form AA...AA....
+         * or ....TT....TT, so, when we see AA......, we know that we can right shift
+         * (since we read the binary kmer from end to beginning) m-1 positions before *
+         * getting another AA-type candidate.
+         * however, doing so, we might miss a TT-type candidate.
+         *
+         * so let's keep track of the TT...... m-mers. whenever we haven't seen one for a while, 
+         * means that we can skip safely.
+
+         if (mmer_starts_with_TT)
+         {
+             if (next_TT_in_shifts == -1)
+                 next_TT_in_shifts = m-2;
+             else
+                 next_TT_in_shifts = std::min(next_TT_in_shifts,m-2);
+         }
+
+         if (mmer_starts_with_AA && next_TT_in_shifts != -1 && j >= m)
+         {
+             val >>= 12;
+             j += 6;
+             next_TT_in_shifts = -1;
+             continue;
+         }
+
+         next_TT_in_shifts = std::max(next_TT_in_shifts-1,-1);
+         */
+
+
+        val >>= 2;
+        j++;
+
+    } // end while (minimizers)
+}
+
+#endif
diff --git a/gatb-core/src/gatb/tools/math/Integer.hpp b/gatb-core/src/gatb/tools/math/Integer.hpp
new file mode 100644
index 0000000..0df83e7
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/Integer.hpp
@@ -0,0 +1,526 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Integer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Entry point class for large integer usage
+ */
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_HPP_
+
+/********************************************************************************/
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+#include <boost/variant.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/at.hpp>
+
+/********************************************************************************/
+namespace gatb  {  namespace core  { namespace tools {  namespace math  {
+/********************************************************************************/
+
+/** \brief Class for large integers calculus
+ *
+ * The IntegerTemplate is implemented as a boost variant, which means that it can act like T1, T2, T3 or T4, etc.. type
+ * according to the configuration.
+ *
+ * All the methods are implemented through a boost variant visitor.
+ *
+ *  Note that we have 2 possible native implementations (NativeInt64 and NativeInt128)
+ *  that rely on native types uint64_t and __uint128_t.
+ *
+ *  For larger integer, a multi-precision LargeInt is used.
+ *
+ *  From the user point of view, [s]he has just to include this file and use the Integer
+ *  class.
+ *
+ */
+template <typename IntegerList>
+class IntegerTemplate
+{
+private:
+
+    /** We define a transformation of the provided integer list in order to get a LargeInt type list. */
+    template<typename T>  struct ToLargeInt  {  typedef LargeInt<((T::value+31)/32)> type;  };
+    typedef typename boost::mpl::transform<IntegerList, ToLargeInt<boost::mpl::_> >::type transfolist;
+
+public:
+
+    /** We define a boost variant from this type list. */
+    typedef typename boost::make_variant_over<transfolist>::type Type;
+    /* so, before, Type was defined as a plain boost::variant like this: 
+     typedef typename boost::variant<LargeInt<1>, LargeInt<2>, LargeInt<3>, LargeInt<4> > Type;
+     I checked: the new make_variant_over has no impact on runtime performance. Probably not surprising, as this code is probably purely compile-time.
+     */
+
+    /** Apply a functor with the best template specialization according to the provided kmer size. */
+    template <template<size_t> class Functor, typename Parameter>
+    static void apply (size_t kmerSize, Parameter params)
+    {
+        typedef typename boost::mpl::empty<IntegerList>::type empty;
+
+        /** We delegate the execution to the Apply structure, defined with two template specializations
+         * that allows recursion. */
+        Apply<Functor, Parameter, IntegerList, empty::value>::execute (kmerSize, params);
+    }
+
+    /** Constructor. Note that the type (see getType and setType) has to be first initialized
+     * otherwise no instance can be created (exception thrown).
+     * \param[in] n : value for initialization of the integer.
+     */
+    IntegerTemplate (int64_t n=0)  {}
+
+    /** Copy constructor. Relies on the copy constructor of boost variant
+     * \param[in] t : the object to be used for initialization
+     */
+    template<typename T>  explicit IntegerTemplate (const T& t) : v (t)  {}
+
+    /** Affectation operator. Relies on the affectation operator of boost variant
+     * \param[in] t : object to be copied
+     * \return the current object.
+     */
+    template<typename T>
+    IntegerTemplate& operator=(const T& t)
+    {
+        v = t;
+        return *this;
+    }
+
+    /** Get the name of the class used by the variant (ie. one of the Ti template class parameters)
+     * \return the class name.
+     */
+    const char*  getName ()         { return boost::apply_visitor (Integer_name(),  *(*this)); }
+
+    /** Get the size of an instance of the class used by the variant  (ie. one of the Ti template class parameters)
+     * \return the size of an object (in bits).
+     */
+    const size_t getSize ()         { return boost::apply_visitor (Integer_size(),  *(*this)); }
+
+    /** Get the HDF5 type for the the class used by the variant  (ie. one of the Ti template class parameters)
+     * \param[in] isCompound : tells whether the type is composed or not
+     * \return a HDF5 identifier for the type.
+     */
+    hid_t hdf5 (bool& isCompound)   { return boost::apply_visitor (Integer_hdf5(isCompound),  *(*this)); }
+
+    /** Operator +
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return sum of the two operands.
+     */
+    inline friend IntegerTemplate   operator+  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_plus(),  *a, *b);  }
+
+    /** Operator -
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return substraction of the two operands.
+     */
+    inline friend IntegerTemplate   operator-  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_minus(), *a, *b);  }
+
+    /** Operator |
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return 'or' of the two operands.
+     */
+    inline friend IntegerTemplate   operator|  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_or(),    *a, *b);  }
+
+    /** Operator ^
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return 'xor' of the two operands.
+     */
+    inline friend IntegerTemplate   operator^  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_xor(),   *a, *b);  }
+
+    /** Operator &
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return 'and' of the two operands.
+     */
+    inline friend IntegerTemplate   operator&  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_and(),   *a, *b);  }
+
+    /** Operator ~
+     * \param[in] a : operand
+     * \return negation of the operand
+     */
+    inline friend IntegerTemplate   operator~  (const IntegerTemplate& a)                    {  Integer_compl v; return  boost::apply_visitor (v, *a);  }
+
+    /** Operator ==
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return equality of the two operands.
+     */
+    inline friend bool      operator== (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_equals(), *a, *b);  }
+
+    /** Operator !=
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return inequality of the two operands.
+     */
+    inline friend bool      operator!= (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  ! (*a==*b);  }
+
+    /** Operator <
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return '<' of the two operands.
+     */
+    inline friend bool      operator<  (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_less(),   *a, *b);  }
+
+    /** Operator <=
+     * \param[in] a : first operand
+     * \param[in] b : second operand
+     * \return '<=' of the two operands.
+     */
+    inline friend bool      operator<= (const IntegerTemplate& a, const IntegerTemplate& b)  {  return  boost::apply_visitor (Integer_lesseq(), *a, *b);  }
+
+    /** Operator *
+     * \param[in] a : first operand
+     * \param[in] c : second operand
+     * \return multiplication of the two operands.
+     */
+    inline friend IntegerTemplate   operator*  (const IntegerTemplate& a, const int&       c)  {  return  boost::apply_visitor (Integer_mult(c), *a);  }
+
+    /** Operator /
+     * \param[in] a : first operand
+     * \param[in] c : second operand
+     * \return division of the two operands.
+     */
+    inline friend IntegerTemplate   operator/  (const IntegerTemplate& a, const u_int32_t& c)  {  return  boost::apply_visitor (Integer_div(c),  *a);  }
+
+    /** Operator %
+     * \param[in] a : first operand
+     * \param[in] c : second operand
+     * \return modulo of the two operands.
+     */
+    inline friend u_int32_t operator%  (const IntegerTemplate& a, const u_int32_t& c)  {  return  boost::apply_visitor (Integer_mod(c),  *a);  }
+
+    /** Operator >>
+     * \param[in] a : first operand
+     * \param[in] c : second operand
+     * \return right shift of the two operands.
+     */
+    inline friend IntegerTemplate   operator>> (const IntegerTemplate& a, const int& c)  {  return  boost::apply_visitor (Integer_shiftLeft(c),   *a);  }
+
+    /** Operator <<
+     * \param[in] a : first operand
+     * \param[in] c : second operand
+     * \return left shift of the two operands.
+     */
+    inline friend IntegerTemplate   operator<< (const IntegerTemplate& a, const int& c)  {  return  boost::apply_visitor (Integer_shiftRight(c),  *a);  }
+
+    /** Operator +=
+     * \param[in] a : first operand
+     * \return addition and affectation.
+     */
+    void operator+= (const IntegerTemplate& a)  {  boost::apply_visitor (Integer_plusaffect(),  *(*this), *a);  }
+
+    /** Operator ^=
+     * \param[in] a : first operand
+     * \return xor and affectation.
+     */
+    void operator^= (const IntegerTemplate& a)  {  boost::apply_visitor (Integer_xoraffect(),   *(*this), *a);  }
+
+    /** Operator[] access the ith nucleotide in the given integer. For instance a[4] get the 5th nucleotide of
+     * a kmer encoded as an Integer object.
+     * \param[in] idx : index of the nucleotide to be retrieved
+     * \return the nucleotide value as follow: A=0, C=1, T=2 and G=3
+     */
+    u_int8_t  operator[]  (size_t idx) const   { return  boost::apply_visitor (Integer_value_at(idx), *(*this)); }
+
+    /** Get the reverse complement of a kmer encoded as an IntegerTemplate object. Note that the kmer size must be known.
+     * \param[in] a : kmer value to be reversed-complemented
+     * \param[in] sizeKmer : size of the kmer
+     * \return the reverse complement kmer as a IntegerTemplate value
+     */
+    friend IntegerTemplate revcomp (const IntegerTemplate& a,  size_t sizeKmer)  {  return  boost::apply_visitor (Integer_revcomp(sizeKmer),  *a);  }
+
+    /** Get a hash value on 64 bits for a given IntegerTemplate object.
+     * \param[in] a : the integer value
+     * \param[in] seed : some seed value used for the hash computation.
+     * \return the hash value on 64 bits.
+     */
+    friend u_int64_t hash1        (const IntegerTemplate& a,  u_int64_t seed)  {  return  boost::apply_visitor (Integer_hash1(seed),  *a);          }
+
+    /** Get a hash value on 64 bits for a given IntegerTemplate object.
+     * \param[in] a : the integer value
+     * \return the hash value on 64 bits.
+     */
+    friend u_int64_t oahash       (const IntegerTemplate& a)                   {  return  boost::apply_visitor (Integer_oahash(), *a);              }
+
+    /** Get a hash value on 64 bits for a given IntegerTemplate object.
+     * Note: although we return 64 bits, only the first 16 bits are set
+     * \param[in] a : the integer value
+     * \param[in] shift : some value used for the hash computation.
+     * \return the hash value on 64 bits.
+     */
+    friend u_int64_t simplehash16 (const IntegerTemplate& a,  int shift)       {  return  boost::apply_visitor (Integer_simplehash16(shift),  *a);  }
+
+    /** Get the lexicographical minimizer of the k-mer, quickly, using bit tricks. 
+     * minimizers containing 'AA' are forbidden. might not return a valid result sometimes.
+     * \param[in] nbminimizers: number of minimizers inside this kmer
+     * \param[in] &validResult: whether the returned result should be considered valid (if not, compute minimizer with another approach please)
+     * \return the reverse complement kmer as a IntegerTemplate value
+     */
+    friend u_int32_t fastLexiMinimizer (const IntegerTemplate& a, int _nbMinimizers, bool &validResult) {  return  boost::apply_visitor (Integer_fastLexiMinimizer(_nbMinimizers, validResult),  *a);  }
+
+
+
+    /** Get an ASCII string representation of a kmer encoded as a IntegerTemplate object
+     * \param[in] sizeKmer : size of the kmer
+     * \return the ASCII representation of the kmer.
+     */
+    std::string toString (size_t sizeKmer) const  {  return boost::apply_visitor (Integer_toString(sizeKmer), *(*this)); }
+
+    /** Output stream operator for the IntegerTemplate class
+     * \param[in] s : the output stream to be used.
+     * \param[in] a : the object to output
+     * \return the modified output stream.
+     */
+    friend std::ostream & operator<<(std::ostream & s, const IntegerTemplate& a)  {  s << *a;  return s;  }
+
+    /** Get the value of the IntegerTemplate object as a U type, U being one of the T1,T2,T3,T4
+     * template class parameters. This method can be seen as a converter from the IntegerTemplate class
+     * to a specific U type (given as a template parameter of this method).
+     * \return  the converted value as a U type.
+     */
+    template<typename U>
+    const U& get ()  const  {  return * boost::get<U>(&v);  }
+
+private:
+
+    struct Integer_name : public boost::static_visitor<const char*>    {
+        template<typename T>  const char* operator() (const T& a) const { return a.getName();  }};
+
+    struct Integer_size : public boost::static_visitor<const size_t>    {
+        template<typename T>  const size_t operator() (const T& a) const  { return a.getSize();  }};
+
+    struct Integer_plus : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>              IntegerTemplate operator() (const T& a, const T& b) const  { return IntegerTemplate(a + b);  }
+        template<typename T, typename U>  IntegerTemplate operator() (const T& a, const U& b) const  { return IntegerTemplate();       }
+    };
+
+    struct Integer_minus : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>              IntegerTemplate operator() (const T& a, const T& b) const  { return IntegerTemplate(a - b);  }
+        template<typename T, typename U>  IntegerTemplate operator() (const T& a, const U& b) const  { return IntegerTemplate();  }
+    };
+
+    struct Integer_or : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>              IntegerTemplate operator() (const T& a, const T& b) const  { return IntegerTemplate(a | b);  }
+        template<typename T, typename U>  IntegerTemplate operator() (const T& a, const U& b) const  { return IntegerTemplate();  }
+    };
+
+    struct Integer_xor : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>              IntegerTemplate operator() (const T& a, const T& b) const  { return IntegerTemplate(a ^ b);  }
+        template<typename T, typename U>  IntegerTemplate operator() (const T& a, const U& b) const  { return IntegerTemplate();  }
+    };
+
+    struct Integer_and : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>              IntegerTemplate operator() (const T& a, const T& b) const  { return IntegerTemplate(a & b);  }
+        template<typename T, typename U>  IntegerTemplate operator() (const T& a, const U& b) const  { return IntegerTemplate();  }
+    };
+
+    struct Integer_less : public boost::static_visitor<bool>    {
+        template<typename T>              bool operator() (const T& a, const T& b) const  { return a < b;  }
+        template<typename T, typename U>  bool operator() (const T& a, const U& b) const  { return false;  }
+    };
+
+    struct Integer_lesseq : public boost::static_visitor<bool>    {
+        template<typename T>              bool operator() (const T& a, const T& b) const  { return a <= b;  }
+        template<typename T, typename U>  bool operator() (const T& a, const U& b) const  { return false;   }
+    };
+
+    struct Integer_equals : public boost::static_visitor<bool>    {
+        template<typename T>              bool operator() (const T& a, const T& b) const  { return a == b;  }
+        template<typename T, typename U>  bool operator() (const T& a, const U& b) const  { return false;   }
+    };
+
+    struct Integer_plusaffect : public boost::static_visitor<>    {
+        template<typename T>              void operator() ( T& a, const T& b) const  { a += b;  }
+        template<typename T, typename U>  void operator() ( T& a, const U& b) const  {   }
+    };
+
+    struct Integer_xoraffect : public boost::static_visitor<>    {
+        template<typename T>              void operator() ( T& a, const T& b) const  { a ^= b;  }
+        template<typename T, typename U>  void operator() ( T& a, const U& b) const  {   }
+    };
+
+    struct Integer_compl : public boost::static_visitor<IntegerTemplate>    {
+        template<typename T>  IntegerTemplate operator() (const T& a)  { return IntegerTemplate(~a);  }};
+
+    template<typename Result, typename Arg>
+    struct Visitor : public boost::static_visitor<Result>
+    {
+        Visitor (Arg a=Arg()) : arg(a) {}
+        Arg arg;
+    };
+	
+    template<typename Result, typename Arg1, typename Arg2>
+    struct Visitor2Args : public boost::static_visitor<Result>
+    {
+        Visitor2Args (Arg1 a1=Arg1(), Arg2 a2=Arg2()) : arg1(a1), arg2(a2) {}
+        Arg1 arg1;
+        Arg2 arg2;
+    };
+
+    struct Integer_hdf5 : public Visitor<hid_t,bool&>   {
+        Integer_hdf5 (bool& c) : Visitor<IntegerTemplate,bool&>(c) {}
+        template<typename T>  hid_t operator() (const T& a)  { return a.hdf5 (this->arg);  }};
+
+    struct Integer_mult : public Visitor<IntegerTemplate,const int>    {
+        Integer_mult (const int& c) : Visitor<IntegerTemplate,const int>(c) {}
+        template<typename T>  IntegerTemplate operator() (const T& a) const  { return IntegerTemplate(a*this->arg);  }};
+
+    struct Integer_div : public Visitor<IntegerTemplate,const u_int32_t>    {
+        Integer_div (const u_int32_t& c) : Visitor<IntegerTemplate,const u_int32_t>(c) {}
+        template<typename T>  IntegerTemplate operator() (const T& a) const  { return IntegerTemplate(a/this->arg);  }};
+
+    struct Integer_mod : public Visitor<u_int32_t,const u_int32_t>    {
+        Integer_mod (const u_int32_t& c) : Visitor<u_int32_t,const u_int32_t>(c) {}
+        template<typename T>  u_int32_t operator() (const T& a) const  { return (a%this->arg);  }};
+
+    struct Integer_shiftLeft : public Visitor<IntegerTemplate,const int>    {
+        Integer_shiftLeft (const int& c) : Visitor<IntegerTemplate,const int>(c) {}
+        template<typename T>  IntegerTemplate operator() (const T& a) const  { return IntegerTemplate (a >> this->arg);  }};
+
+    struct Integer_shiftRight : public Visitor<IntegerTemplate,const int>    {
+        Integer_shiftRight (const int& c) : Visitor<IntegerTemplate,const int>(c) {}
+        template<typename T>  IntegerTemplate operator() (const T& a) const  { return IntegerTemplate (a << this->arg);  }};
+
+    struct Integer_revcomp : public Visitor<IntegerTemplate,size_t>    {
+        Integer_revcomp (const size_t& c) : Visitor<IntegerTemplate,size_t>(c) {}
+        template<typename T>  IntegerTemplate operator() (const T& a) const  { return IntegerTemplate (revcomp(a,this->arg));  }};
+
+    struct Integer_hash1 : public Visitor<u_int64_t,u_int64_t>    {
+        Integer_hash1 (const u_int64_t& c) : Visitor<u_int64_t,u_int64_t>(c) {}
+        template<typename T>  u_int64_t operator() (const T& a) const  { return (hash1(a,this->arg));  }};
+
+    struct Integer_oahash : public boost::static_visitor<u_int64_t>    {
+        template<typename T>  u_int64_t operator() (const T& a) const  { return (oahash(a));  }};
+
+    struct Integer_simplehash16 : public Visitor<u_int64_t,int>    {
+        Integer_simplehash16 (const int& c) : Visitor<u_int64_t,int>(c) {}
+        template<typename T>  u_int64_t operator() (const T& a) const  { return (simplehash16(a,this->arg));  }};
+
+    struct Integer_fastLexiMinimizer : public Visitor2Args<u_int32_t, int, bool&>    {
+        Integer_fastLexiMinimizer (int b, bool& c) : Visitor2Args<u_int32_t,int, bool&>(b,c) {}
+        template<typename T>  u_int32_t operator() (const T& a) const  { return (fastLexiMinimizer (a,this->arg1, this->arg2));  }};
+	
+    struct Integer_value_at : public Visitor<u_int8_t,size_t>   {
+        Integer_value_at (size_t idx) : Visitor<u_int8_t,size_t>(idx) {}
+        template<typename T>  u_int8_t operator() (const T& a) const { return a[this->arg];  }};
+
+    struct Integer_toString : public Visitor<std::string,size_t>   {
+        Integer_toString (size_t c) : Visitor<std::string,size_t>(c) {}
+        template<typename T>  std::string operator() (const T& a) const  { return a.toString(this->arg);  }};
+
+private:
+
+    /** We instantiate the boost variant. */
+    Type v;
+
+          Type& operator *()       { return v; }
+    const Type& operator *() const { return v; }
+
+
+    /** Now, we define the Apply structure that allows to find the correct implementation of LargeInt
+     * according to the given kmerSize (at runtime). */
+
+    /** My initial guess didn't work, although it should have (pb with boost::mpl ?)... I went back on an implementation
+     * similar to http://www.developpez.net/forums/d1193120/c-cpp/cpp/bibliotheques/boost/vecteur-vide-boost-mpl */
+
+    /** Template definition. */
+    template<template<size_t> class Functor, class Parameter, class T, bool empty> struct Apply  {};
+
+    /** Template specialization for a vector of types. */
+    template<template<size_t> class Functor, class Parameter, class T>
+    struct Apply<Functor, Parameter, T, false>
+    {
+        static void execute (size_t kmerSize, Parameter params)
+        {
+            /** Shortcut : we get the current kmer size threshold. */
+            static const size_t K = boost::mpl::front<T>::type::value;
+
+            /** We check whether the kmerSize parameter falls into the current K threshold.
+             * If yes, we run the functor and leave. */
+            if (kmerSize < K)  { Functor<K>() (params);  return; }
+
+            typedef typename boost::mpl::pop_front<T>::type tail;
+            typedef typename boost::mpl::empty<tail>::type  empty;
+
+            /** The current K threshold doesn't work, try the next kmer value. */
+            Apply<Functor, Parameter, tail, empty::value>::execute (kmerSize, params);
+        }
+    };
+
+    /** Template specialization for an empty type. */
+    template<template<size_t> class Functor, class Parameter, class T>
+    struct Apply<Functor, Parameter, T, true>
+    {
+        static void execute (size_t kmerSize, Parameter params)
+        {
+            throw system::Exception ("Failure because of unhandled kmer size %d", kmerSize);
+        }
+    };
+};
+
+
+// this is just for benchmarking. It helped me see that indeed, instantiating a class that constains a boost::variant takes significant run-time :(
+template <typename IntegerList>
+class IntegerTemplateDummy
+{
+public:
+
+    typedef typename boost::variant<LargeInt<1>, LargeInt<2>, LargeInt<3>, LargeInt<4> > Type;
+
+private:
+    /** We instantiate the boost variant. */
+    Type v;
+};
+
+/********************************************************************************/
+
+/** We define a mpl::vector holding the int_<K> types, one per kmer size value chosen by the user. */
+typedef boost::mpl::vector<KSIZE_LIST_TYPE>::type  IntegerList;
+
+/** We specialize IntegerTemplate class based on the list of kmer size values chosen by the user. */
+typedef  IntegerTemplate <IntegerList> Integer;
+typedef  IntegerTemplateDummy<IntegerList> IntegerDummy;
+
+/********************************************************************************/
+}}}};
+/********************************************************************************/
+
+/* would enable an Integer to be hashed in a unordered_map */
+/* well, for some reason this didn't work with unordered_map, i still got the compile error:
+ /usr/include/c++/6.1.1/bits/hashtable_policy.h:85:34: error: no match for call to ‘(const std::hash<const gatb::core::tools::math::IntegerTemplate<boost::mpl::vector1<mpl_::int_<32> > > >) (const gatb::core::tools::math::IntegerTemplate<boost::mpl::vector1<mpl_::int_<32> > >&)’ */
+/*namespace std {
+  template <typename IntegerList>
+  struct hash< gatb::core::tools::math::IntegerTemplate<IntegerList>>
+  {
+    std::size_t operator()(const gatb::core::tools::math::IntegerTemplate<IntegerList>& k) const
+    {
+        return oahash(k);
+    }
+  };
+};
+*/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/LargeInt.hpp b/gatb-core/src/gatb/tools/math/LargeInt.hpp
new file mode 100644
index 0000000..dfeee1c
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/LargeInt.hpp
@@ -0,0 +1,898 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file LargeInt.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Class that manages large integers
+ *
+ * arbitrary-precision integer library
+ * very limited: only does what minia needs (but not what minia deserves)
+ * This file holds interfaces related to the Design Pattern Observer.
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_LARGEINT_HPP_
+#define _GATB_CORE_TOOLS_MATH_LARGEINT_HPP_
+
+/********************************************************************************/
+
+#include <stdint.h>
+#include <algorithm>
+#include <iostream>
+#include <hdf5/hdf5.h>
+
+#include <gatb/system/api/Exception.hpp>
+#include <gatb/system/api/config.hpp>
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/FastMinimizer.hpp>
+
+#ifndef ASSERTS
+#define assertLI(x) {} // disable asserts for large int; those asserts make sure that with PRECISION == [1 or 2], all is correct
+#else
+#define assertLI(x) assert(x)
+#endif
+
+#include <assert.h>
+
+// some 64-bit assert macros
+#if defined(_LP64)
+#define assert128(x) assertLI(precision != 2 || (x));
+#else
+#define assert128(x) ;
+#endif
+
+extern const unsigned char revcomp_4NT[];
+extern const unsigned char comp_NT    [];
+#include <gatb/system/api/IMemory.hpp>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+/** \brief Large integer class
+ *
+ * The LargeInt class provides methods for integer calculus. It has a template parameter
+ * 'precision' giving the number of bits used the integer representation. For instance:
+ *  - LargeInt<1>  : representation of integers up to 2^64
+ *  - LargeInt<2>  : representation of integers up to 2^128
+ *  - etc
+ *
+ *  This template class has a specialization for precision=1. In this case, native 64 bits
+ *  integers are used.
+ *
+ *  This template class may have a specialization for precision=2. If the used operating
+ *  system allows it, native 128 bits integers are used.
+ *
+ *  In the other cases, the LargeInt provides a generic integer calculus class. Note that
+ *  such an implementation could be optimized in several ways, including direct assembly
+ *  code for maximum speed.
+ *
+ *  The LargeInt class is hugely used throughout the GATB project since it encodes kmers values.
+ *
+ *  The LargeInt class is mainly used with the IntegerTemplate class, where 4 specializations
+ *  of LargeInt are used as template types of IntegerTemplate.
+ *
+ *  \see IntegerTemplate
+ */
+
+template<int precision>  class LargeIntDummy 
+{
+    public:
+
+};
+
+template<int precision>  class LargeInt
+{
+public:
+
+    /********************************************************************************/
+    /** Constructor.
+     * \param[in] val : initial value of the large integer. */
+
+#ifdef USE_LARGEINT_CONSTRUCTOR // normally this isn't enabled; only in unit tests for convenience.
+        LargeInt(const u_int64_t& val = 0)
+        {
+            this->value[0] = val;   for (int i = 1; i < precision; i++)  {  this->value[i] = 0;  }
+        }
+#endif
+
+    /** Get the name of the class used by the variant (ie. one of the Ti template class parameters)
+     * \return the class name.
+     */
+    static const char* getName ()
+    {
+        static char buffer[256];
+        static bool first = true;
+        if (first)  {  first = false;  snprintf (buffer, sizeof(buffer), "LargeInt<%d>", precision);  }
+        return buffer;
+    }
+
+    /** Get the 64 less significant bits of the LargeInt object as a native integer type.
+     * \return (part of) the LargeInt object as a native integer type.
+     */
+    u_int64_t getVal() const  { return this->value[0]; }
+    inline void      setVal(u_int64_t val) { this->value[0] = val; for (int i = 1; i < precision; i++)  {  this->value[i] = 0;}  }
+    inline void      setVal(const LargeInt& other) { for (int i = 0; i < precision; i++)  {  this->value[i] = other.value[i];}  }
+
+    /** Get the size of an instance of the class
+     * \return the size of an object (in bits).
+     */
+    static const size_t getSize ()  { return 8*sizeof(u_int64_t)*precision; }
+
+    /********************************************************************************/
+    /** Returns lower 64 bits */
+    u_int64_t toInt () const  {  throw system::Exception ("LargeInt<%d> no support of toInt", precision);  }
+
+    /********************************************************************************/
+    /** Operator +
+     * \param[in] other : operand
+     * \return sum of object and the operand.
+     */
+    LargeInt operator+ (const LargeInt& other) const
+    {
+        LargeInt result;
+        int carry = 0;
+        for (int i = 0 ; i < precision ; i++)
+        {
+            result.value[i] = this->value[i] + other.value[i] + carry;
+            carry = (result.value[i] < this->value[i]) ? 1 : 0;
+        }
+
+        assertLI(precision != 1 || (result == other.value[0] + this->value[0]));
+        assert128 (result.toInt128() == other.toInt128() + toInt128());
+        return result;
+    }
+
+    LargeInt operator+ (const u_int64_t& other) const
+    {
+        LargeInt result;
+        int carry = 0;
+        result.value[0] = this->value[0] + other;
+        carry = (result.value[0] < this->value[0]) ? 1 : 0;
+        for (int i = 1 ; i < precision ; i++)
+        {
+            result.value[i] = this->value[i] + carry;
+            carry = (result.value[i] < this->value[i]) ? 1 : 0;
+        }
+
+        assertLI(precision != 1 || (result == other.value[0] + this->value[0]));
+        assert128 (result.toInt128() == other.toInt128() + toInt128());
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator -
+     * \param[in] other : operand
+     * \return subtraction of object and the operand.
+     */
+    LargeInt operator- (const LargeInt& other) const
+    {
+        LargeInt result;
+        int carry = 0;
+        for (int i = 0 ; i < precision ; i++)
+        {
+            result.value[i] = this->value[i] - other.value[i] - carry;
+            carry = (result.value[i] > this->value[i]) ? 1 : 0;
+        }
+
+        assertLI(precision != 1 || (result == this->value[0] - other.value[0]));
+        assert128(result.toInt128() == toInt128() - other.toInt128());
+        return result;
+    }
+
+    LargeInt operator- (const u_int64_t& other) const
+    {
+        LargeInt result;
+        int carry = 0;
+        result.value[0] = this->value[0] - other;
+        carry = (result.value[0] > this->value[0]) ? 1 : 0;
+        for (int i = 1 ; i < precision ; i++)
+        {
+            result.value[i] = this->value[i] - carry;
+            carry = (result.value[i] > this->value[i]) ? 1 : 0;
+        }
+
+        assertLI(precision != 1 || (result == this->value[0] - other));
+        return result;
+    }
+
+
+    /********************************************************************************/
+    /** Operator *
+     * \param[in] coeff : operand
+     * \return multiplication of the object by the coeff.
+     */
+    LargeInt operator*(const int& coeff) const
+    {
+        LargeInt result;
+        for (int i = 0; i < precision ; i++)
+            result.value[i] = this->value[i];
+
+        // minia doesn't have that many multiplications cases
+
+        if (coeff == 2 || coeff == 4)
+        {
+            result = result << (coeff / 2);
+        }
+        else
+        {
+            if (coeff == 21)
+            {
+                result = (result << 4) + (result << 2) + result;
+            }
+            else
+            {
+                printf("unsupported LargeInt multiplication: %d\n",coeff);
+                exit(1);
+            }
+        }
+
+        assertLI(precision != 1 || (result == this->value[0] * coeff));
+        assert128(result.toInt128() == toInt128() * coeff);
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator /
+     * \param[in] divisor : operand
+     * \return division of the object by the divisor.
+     */
+    LargeInt operator/(const uint32_t& divisor) const
+    {
+        LargeInt result;
+        result.setVal(0);
+
+        // inspired by Divide32() from http://subversion.assembla.com/svn/pxcode/RakNet/Source/BigInt.cpp
+
+        u_int64_t r = 0;
+        uint32_t mask32bits = ~0;
+        for (int i = precision-1; i >= 0; --i)
+        {
+            for (int j = 1; j >= 0; --j) // [j=1: high-32 bits, j=0: low-32 bits] of array[i]
+            {
+                u_int64_t n = (r << 32) | ((this->value[i] >> (32*j)) & mask32bits );
+                result.value[i] = result.value[i] | (((n / divisor) & mask32bits) << (32*j));
+                r = n % divisor;
+            }
+        }
+        assertLI(precision != 1 || (result == this->value[0] / divisor));
+        assert128(result.toInt128() == toInt128() / divisor);
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator %
+     * \param[in] divisor: operand
+     * \return modulo of the object by the operand.
+     */
+    uint32_t operator%(const uint32_t& divisor) const
+    {
+        u_int64_t r = 0;
+        uint32_t mask32bits = ~0;
+        for (int i = precision-1; i >= 0; --i)
+        {
+            for (int j = 1; j >= 0; --j) // [j=1: high-32 bits, j=0: low-32 bits] of array[i]
+            {
+                u_int64_t n = (r << 32) | ((this->value[i] >> (32*j)) & mask32bits );
+                r = n % divisor;
+            }
+        }
+
+        assertLI(precision != 1 || (r == this->value[0] % divisor));
+        assert128(r == toInt128() % divisor);
+        return (uint32_t)r;
+    }
+
+    /********************************************************************************/
+    /** Operator ^
+     * \param[in] other : operand
+     * \return operator^ of the object by the operand.
+     */
+    LargeInt operator^(const LargeInt& other) const
+    {
+        LargeInt result;
+        for (int i=0 ; i < precision ; i++)
+            result.value[i] = this->value[i] ^ other.value[i];
+
+        assertLI(precision != 1 || (result == (this->value[0] ^ other.value[0])));
+        assert128(result.toInt128() == (toInt128() ^ other.toInt128()));
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator |
+     * \param[in] other : operand
+     * \return operator| of the object by the operand.
+     */
+    LargeInt operator|(const LargeInt& other) const
+    {
+        LargeInt result;
+        for (int i=0 ; i < precision ; i++)
+            result.value[i] = this->value[i] | other.value[i];
+        
+        assertLI(precision != 1 || (result == (this->value[0] | other.value[0])));
+        assert128(result.toInt128() == (toInt128() | other.toInt128()));
+        return result;
+    }
+    
+    /********************************************************************************/
+    /** Operator &
+     * \param[in] other : operand
+     * \return operator& of the object by the operand.
+     */
+    LargeInt operator&(const LargeInt& other) const
+    {
+        LargeInt result;
+        for (int i=0 ; i < precision ; i++)
+            result.value[i] = this->value[i] & other.value[i];
+
+        assertLI(precision != 1 || (result == (this->value[0] & other.value[0])));
+        assert128(result.toInt128() == (toInt128() & other.toInt128()));
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator &
+     * \param[in] other : operand
+     * \return operator& of the object by the operand.
+     */
+    LargeInt operator&(const char& other) const
+    {
+        LargeInt result;
+        result.setVal(0);
+        result.value[0] = this->value[0] & other;
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator ~
+     * \return negation of the object
+     */
+    LargeInt operator~() const
+    {
+        LargeInt result;
+        for (int i=0 ; i < precision ; i++)
+            result.value[i] = ~this->value[i];
+
+        assertLI(precision != 1 || (result == ~this->value[0]));
+        assert128(result.toInt128() == ~toInt128());
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator <<. Note: this method is likely to be hugely used when we want to get
+     * neighbors of a given kmer encoded as a LargeInt object.
+     * \param[in] coeff : operand
+     * \return left shift of the object
+     */
+    LargeInt operator<<(const int& coeff) const
+    {
+        LargeInt result;
+        result.setVal(0);
+
+        int large_shift = coeff / 64;
+        int small_shift = coeff % 64;
+
+        for (int i = large_shift ; i < precision-1; i++)
+        {
+            result.value[i] = result.value[i] | (this->value[i-large_shift] << small_shift);
+
+            if (small_shift == 0) // gcc "bug".. u_int64_t x; x>>64 == 1<<63, x<<64 == 1
+            {
+                result.value[i+1] = 0;
+            }
+            else
+            {
+                result.value[i+1] = this->value[i-large_shift] >> (64 - small_shift);
+            }
+
+        }
+        result.value[precision-1] = result.value[precision-1] | (this->value[precision-1-large_shift] << small_shift);
+
+        assertLI(precision != 1 || (result == (this->value[0] << coeff)));
+        assert128(result.toInt128() == (toInt128() << coeff));
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator >>. Note: this method is likely to be hugely used when we want to get
+     * neighbors of a given kmer encoded as a LargeInt object.
+     * \param[in] coeff : operand
+     * \return right shift of the object
+     */
+    LargeInt operator>>(const int& coeff) const
+    {
+        LargeInt result;
+        result.setVal(0);
+
+        int large_shift = coeff / 64;
+        int small_shift = coeff % 64;
+
+        result.value[0] = (this->value[large_shift] >> small_shift);
+
+        for (int i = 1 ; i < precision - large_shift ; i++)
+        {
+            result.value[i] = (this->value[i+large_shift] >> small_shift);
+            if (small_shift == 0) // gcc "bug".. u_int64_t x; x>>64 == 1<<63, x<<64 == 1
+            {
+                result.value[i-1] =  result.value[i-1];
+            }
+            else
+            {
+                result.value[i-1] =  result.value[i-1] | (this->value[i+large_shift] << (64 - small_shift));
+            }
+        }
+
+        assertLI(precision != 1 || ( small_shift == 0 || (result == this->value[0] >> coeff)));
+        assert128(small_shift == 0 || (result.toInt128() == (toInt128() >> coeff)));
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Operator !=
+     * \param[in] c: operand
+     * \return inequality
+     */
+    bool operator!=(const LargeInt& c) const
+    {
+        for (int i = 0 ; i < precision ; i++)
+            if( this->value[i] != c.value[i] )
+                return true;
+        return false;
+    }
+
+    bool operator!=(const u_int64_t& c) const
+    {
+        if (this->value[0] != c)
+            return true;
+        for (int i = 1 ; i < precision ; i++)
+            if( this->value[i] != 0 )
+                return true;
+        return false;
+    }
+
+    /********************************************************************************/
+    /** Operator ==
+     * \param[in] c: operand
+     * \return equality
+     */
+    bool operator==(const LargeInt& c) const
+    {
+        for (int i = 0 ; i < precision ; i++)
+            if( this->value[i] != c.value[i] )
+                return false;
+        return true;
+    }
+
+    bool operator==(const u_int64_t& c) const
+    {
+        if (this->value[0] != c)
+            return false;
+        for (int i = 1 ; i < precision ; i++)
+            if( this->value[i] != 0 )
+                return false;
+        return true;
+    }
+
+
+    /********************************************************************************/
+    /** Operator <
+     * \param[in] c: operand
+     */
+    bool operator<(const LargeInt& c) const
+    {
+        for (int i = precision-1 ; i>=0 ; --i)
+            if( this->value[i] != c.value[i] )
+                return this->value[i] < c.value[i];
+
+        return false;
+    }
+
+    /********************************************************************************/
+    /** Operator <=
+     * \param[in] c: operand
+     */
+    bool operator<=(const LargeInt& c) const
+    {
+        return operator==(c) || operator<(c);
+    }
+
+    /********************************************************************************/
+    /** Operator +=
+     * \param[in] other : operand
+     * \return addition and affectation
+     */
+    LargeInt& operator+=  (const LargeInt& other)
+    {
+        // NOT so easy to optimize because of the carry
+        *this = *this + other;
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Operator ^=
+     * \param[in] other : operand
+     * \return xor and affectation
+     */
+    LargeInt& operator^=  (const LargeInt& other)
+    {
+        for (int i=0 ; i < precision ; i++)  {  this->value[i] ^= other.value[i];  }
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Operator &=
+     * \param[in] other : operand
+     * \return and and affectation
+     */
+    LargeInt& operator&=  (const LargeInt& other)
+    {
+        for (int i=0 ; i < precision ; i++)  {  this->value[i] &= other.value[i];  }
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Operator |=
+     * \param[in] other : operand
+     * \return or and affectation
+     */
+    LargeInt& operator|=  (const LargeInt& other)
+    {
+        for (int i=0 ; i < precision ; i++)  {  this->value[i] |= other.value[i];  }
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Operator <<=
+     * \param[in] coeff : operand
+     * \return left shift and affectation
+     */
+    LargeInt& operator<<=  (const int& coeff)
+    {
+        *(this) = (*this) << coeff;  return *this;
+    }
+
+    /********************************************************************************/
+    /** Operator >>=
+     * \param[in] coeff : operand
+     * \return right shift and affectation
+     */
+    LargeInt& operator>>=  (const int& coeff)
+    {
+        *(this) = (*this) >> coeff;  return *this;
+    }
+
+#if 0
+    // operator=
+    LargeInt& operator=  (const uint64_t& c)
+    {
+        setVal(c);
+        return *this;
+    }
+
+    // operator=
+    LargeInt& operator=  (const LargeInt& other)
+    {
+        for (int i =       0; i < precision; i++)  {  this->value[i] = other.value[i];}  
+        return *this;
+    }
+#endif
+
+
+
+
+    /********************************************************************************/
+    /** Synchronized atomic operation
+     * \param[in] other : operand
+     */
+    LargeInt& sync_fetch_and_or (const LargeInt& other)
+    {
+        for (int i=0 ; i < precision ; i++)  {  __sync_fetch_and_or (this->value + i, other.value[i]); }
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Synchronized atomic operation
+     * \param[in] other : operand
+     */
+    LargeInt& sync_fetch_and_and (const LargeInt& other)
+    {
+        for (int i=0 ; i < precision ; i++)  {  __sync_fetch_and_and (this->value + i, other.value[i]); }
+        return *this;
+    }
+
+    /********************************************************************************/
+    /** Output stream operator for the IntegerTemplate class
+     * \param[in] s : the output stream to be used.
+     * \param[in] l : the object to output
+     * \return the modified output stream.
+     */
+    friend std::ostream & operator<<(std::ostream & s, const LargeInt<precision> & l)
+    {
+        int i=0;
+
+        /** We want to display the number in hexa (easier to do...) */
+        s << std::hex;
+
+        /** We skip leading 0. */
+        for (i=precision-1; i>=0 && l.value[i]==0; i--)  {}
+
+        /** We dump the different parts of the large integer. */
+        for (  ; i>=0 ; i--)  { s << l.value[i];   if (i>=1) { s << ".";  }  }
+
+        /** We go back to decimal format. */
+        s << std::dec;
+
+        /** We return the output stream. */
+        return s;
+    }
+
+    /********************************************************************************/
+    /** Get the HDF5 type for the the class used by the variant  (ie. one of the Ti template class parameters)
+     * \param[in] isCompound : tells whether the type is composed or not
+     * \return a HDF5 identifier for the type.
+     */
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        hid_t result = H5Tcopy (H5T_NATIVE_INT);
+        H5Tset_precision (result, 64*precision);
+        return result;
+    }
+
+    /********************************************************************************/
+    /** Computes a kmer value as polynom. We may have conversion from the data buffer to
+     * a nucleotide code. This is done through the provided functor.
+     * \param[in] data : kmer given as a buffer of nucleotides
+     * \param[in] size : size of the kmer
+     * \param[in] fct : convert the ith entry in the buffer into a nucleotide code  (A=0, C=1, T=2 and G=3)
+     */
+    template<typename Map>
+    static LargeInt polynom (const char* data, size_t size, Map fct)
+    {
+        LargeInt res;
+        res.setVal(0);
+        for (size_t i=0; i<size; ++i)  {  res = res * 4 + fct(data[i]);  }
+        return res;
+    }
+
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[in] sizeKmer : kmer size (def=32).
+     * \return the ASCII string
+     */
+    std::string toString (size_t sizeKmer) const
+    {
+        char seq[sizeKmer+1];
+        char bin2NT[4] = {'A','C','T','G'};
+
+        for (size_t i=0; i<sizeKmer; i++)  {  seq[sizeKmer-i-1] = bin2NT [(*this)[i]];  }
+        seq[sizeKmer]='\0';
+        return seq;
+    }
+
+    /********************************************************************************/
+    /** Operator[] access the ith nucleotide in the given integer. For instance a[4] get the 5th nucleotide of
+     * a kmer encoded as an Integer object.
+     * \param[in] idx : index of the nucleotide to be retrieved
+     * \return the nucleotide value as follow: A=0, C=1, T=2 and G=3
+     */
+    u_int8_t  operator[]  (size_t idx) const    {  
+        return (this->value[idx/32] >> (2*(idx % 32))) & 3; }
+
+private:
+    u_int64_t value[precision];
+   
+    // hum, why do we template these and not just include them in the class? the whole class is already templated by precision. i'm maybe missing something but i don't understand the merits of that scheme. -r
+    template<int T>  friend LargeInt<T> revcomp (const LargeInt<T>& i, size_t sizeKmer);
+    template<int T>  friend u_int64_t   hash1    (const LargeInt<T>& key, u_int64_t  seed);
+    template<int T>  friend u_int64_t   hash2    (const LargeInt<T>& key, u_int64_t  seed);
+    template<int T>  friend u_int64_t   oahash  (const LargeInt<T>& key);
+    template<int T>  friend u_int64_t   simplehash16    (const LargeInt<T>& key, int  shift);
+    template<int T, typename m_T>  \
+                     friend void fastLexiMinimizer (const LargeInt<T>& key, const unsigned int _nbMinimizers, \
+                             const unsigned int m, m_T &minimizer, size_t &position, bool &validResult);
+    template<int T>  friend void justSweepForAA(const LargeInt<T>& x, const unsigned int _nbMinimizers, unsigned int &dummy);
+    
+    // c++ fun fact:
+    // "const" will ban the function from being anything which can attempt to alter any member variables in the object.
+    // 2 months later: I don't understand this fun fact anymore. thanks c++.
+};
+
+/********************************************************************************/
+template<int precision>  inline LargeInt<precision> revcomp (const LargeInt<precision>& x, size_t sizeKmer)
+{
+    LargeInt<precision> res;
+    res.setVal(0);
+    unsigned char* kmerrev  = (unsigned char *) (&(res.value[0]));
+    unsigned char* kmer     = (unsigned char *) (&(x.value[0]));
+
+    for (size_t i=0; i<8*precision; ++i)
+    {
+        kmerrev[8*precision-1-i] = revcomp_4NT [kmer[i]];
+    }
+
+    return (res >> (2*( 32*precision - sizeKmer))  ) ;
+}
+
+/********************************************************************************/
+template<int precision>  inline u_int64_t hash1 (const LargeInt<precision>& elem, u_int64_t seed=0)
+{
+    // hash = XOR_of_series[hash(i-th chunk iof 64 bits)]
+    u_int64_t result = 0;
+
+    for (size_t i=0;i<precision;i++)
+    {
+        result ^= NativeInt64::hash64 (elem.value[i],seed);
+    }
+    return result;
+}
+
+template<int precision>  inline u_int64_t hash2 (const LargeInt<precision>& elem, u_int64_t seed=0)
+{
+    // hash = XOR_of_series[hash(i-th chunk of 64 bits)]
+    u_int64_t result = 0, key;
+
+    for (size_t i=0;i<precision;i++)
+    {
+        // from inline uint64_t twang_mix64(uint64_t key) taken from https://github.com/facebook/folly/blob/master/folly/Hash.h
+        key = elem.value[i];
+        key = (~key) + (key << 21);  // key *= (1 << 21) - 1; key -= 1;
+        key = key ^ (key >> 24);
+        key = key + (key << 3) + (key << 8);  // key *= 1 + (1 << 3) + (1 << 8)
+        key = key ^ (key >> 14);
+        key = key + (key << 2) + (key << 4);  // key *= 1 + (1 << 2) + (1 << 4)
+        key = key ^ (key >> 28);
+        key = key + (key << 31);  // key *= 1 + (1 << 31)
+
+        result ^= key;
+    }
+    return result;
+}
+
+
+/********************************************************************************/
+template<int precision>  u_int64_t oahash (const LargeInt<precision>& elem)
+{
+    // hash = XOR_of_series[hash(i-th chunk iof 64 bits)]
+    u_int64_t result = 0, chunk, mask = ~0;
+
+    LargeInt<precision> intermediate = elem;
+    for (size_t i=0;i<precision;i++)
+    {
+        chunk = (intermediate & mask).value[0];
+        intermediate = intermediate >> 64;
+        result ^= NativeInt64::oahash64 (chunk);
+    }
+    return result;
+}
+
+	
+
+/********************************************************************************/
+template<int precision> inline u_int64_t simplehash16 (const LargeInt<precision>& elem, int  shift)
+{
+    u_int64_t result = 0, chunk, mask = ~0;
+    LargeInt<precision> intermediate = elem;
+    
+    chunk = (intermediate & mask).value[0];
+    result ^= NativeInt64::simplehash16_64 (chunk,shift);
+
+    return result;
+}
+
+/*
+ * fast computation of minimizer 
+ * assumes lexicographic ordering and a constraint: no 'AA' inside except as prefix
+ *
+ * this function works by hypothesizing that the kmer contains AA or TT (even though it may not),
+ * and when it does, then this function is guaranteed to return the correct result.
+ * if the k-mer doesn't contain AA or TT, then the function will return garbage with validResult=false
+ * (then one shall use the classical minimizer computation procedure)
+ * 
+ * NOTE: iteration is from last m-mer to first m-mer due to GATB binary kmer representation.. it's a bit confusing.
+ *
+ * I've set a template for the minimizer type, but actually u_int32_t seems to be as fast (if not faster?!) than u_int16_t
+ */
+
+template<int precision, typename minimizer_type> inline void fastLexiMinimizer (const LargeInt<precision>& x, const unsigned int _nbMinimizers, const unsigned int m,  minimizer_type &minimizer, size_t &position, bool &validResult)
+{
+    if (m > sizeof(minimizer_type)*4) {std::cout << "wrong minimizer size for fastLeximinimizer :" << m; exit(1);}
+
+    const minimizer_type default_minimizer = ~0 & ((1 << (2*m)) - 1); 
+    minimizer = default_minimizer; 
+
+    validResult = false;
+    bool AA_found = false;
+
+    u_int64_t val;
+    minimizer_type high_bits;
+
+    for (int i=0 ; i < precision ; i++)
+    {
+        val = x.value[i];
+
+        if (i < precision - 1)
+          high_bits = x.value[i+1] & ((1 << 16) - 1);
+        else
+          high_bits = 0;
+
+        // could even possibly use something like https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
+        // to do a prefilter to see if that whole chunk has AA or TT, like "if (haszerobyte(val & (val << 2))"
+
+        const int position_offset = i*32;
+   
+        fastLexiMinimizerChunk<u_int64_t,minimizer_type>(val, _nbMinimizers, m, high_bits, minimizer, position, position_offset, AA_found);
+
+    } // end for (precision)
+
+    validResult = AA_found && (minimizer != default_minimizer) /* might happen that AA was found but resulted in forbidden minimizers */;
+}
+
+/* debug function, for profiling only; counts the AA's in a kmer */
+template<int precision> inline void justSweepForAA(const LargeInt<precision>& x, const unsigned int _nbMinimizers, unsigned int &dummy) 
+{
+    for (int i=0 ; i < precision ; i++)
+    {
+        u_int64_t val = x.value[i];
+
+        const int it = std::min((unsigned int)sizeof(u_int64_t)*4,(unsigned int) _nbMinimizers); 
+        int j = 0;
+        while (j < it)
+        {
+            if ((val & 15) == 0) // val starts with AA
+                dummy++;
+
+            val >>= 2;
+            j++;
+        }
+
+    } // end for (precision)
+}
+
+/********************************************************************************/
+/********************     SPECIALIZATION FOR precision=1     ********************/
+/********************************************************************************/
+#include <gatb/tools/math/LargeInt1.pri>
+
+/********************************************************************************/
+/********************     SPECIALIZATION FOR precision=2     ********************/
+/********************************************************************************/
+#include <gatb/tools/math/LargeInt2.pri> 
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+/* enables a largeint<> to be hashed in a unordered_map */
+namespace std {
+  template <int precision>
+  struct hash< gatb::core::tools::math::LargeInt<precision> >
+  {
+    std::size_t operator()(const gatb::core::tools::math::LargeInt<precision>& k) const
+    {
+        return oahash(k);
+    }
+  };
+}
+
+#endif /* _GATB_CORE_TOOLS_MATH_LARGEINT_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/LargeInt1.pri b/gatb-core/src/gatb/tools/math/LargeInt1.pri
new file mode 100644
index 0000000..7b718b2
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/LargeInt1.pri
@@ -0,0 +1,319 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+/** \file LargeInt<1>.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int64_t type
+ */
+
+
+template<>  class LargeInt<1> 
+{
+public:
+
+#ifdef USE_LARGEINT_CONSTRUCTOR
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    LargeInt<1> (const u_int64_t& c=0)  {  value = c;  }
+#endif
+
+// due to a bug in ograph, reintroducing constructors provided a quick fix. here they are. I think the problem was caused because i added the operator=()'s 
+#if 0
+    LargeInt<1> ()  {  value = 0; }
+    LargeInt<1> (const u_int64_t& c)  {  value = c;  }
+    LargeInt<1> (const LargeInt<1>& other)  {  value = other.value;  }
+#endif
+
+     u_int64_t getVal () const   { return value; }
+     inline void setVal (u_int64_t val) { value = val; }
+     inline void setVal (const LargeInt<1>& other) { value = other.value; }
+
+    static const char* getName ()  { return "LargeInt<1>"; }
+
+    static const size_t getSize ()  { return 8*sizeof(u_int64_t); }
+
+    /** Returns lower 64 bits */
+    u_int64_t toInt () const  {  return value;  }
+
+    LargeInt<1> operator+  (const LargeInt<1>& other)   const   {  LargeInt<1> res; res.value = value + other.value; return res; }
+    LargeInt<1> operator+  (const u_int64_t& other)     const   {  LargeInt<1> res; res.value = value + other; return res; }
+    LargeInt<1> operator-  (const LargeInt<1>& other)   const   {  LargeInt<1> res; res.value = value - other.value; return res; }
+    LargeInt<1> operator-  (const u_int64_t& other)     const   {  LargeInt<1> res; res.value = value - other; return res; }
+    LargeInt<1> operator|  (const LargeInt<1>& other)   const   {   LargeInt<1> res; res.value = value | other.value; return res; }
+    LargeInt<1> operator*  (const int& coeff)           const   {   LargeInt<1> res; res.value = value * coeff;       return res; }
+    LargeInt<1> operator/  (const u_int32_t& divisor)   const   {   LargeInt<1> res; res.value = value / divisor;     return res; }
+    u_int32_t   operator%  (const u_int32_t& divisor)   const   {   return value % divisor;  }
+    LargeInt<1> operator^  (const LargeInt<1>& other)   const   {   LargeInt<1> res; res.value = value ^ other.value; return res; }
+    LargeInt<1> operator&  (const LargeInt<1>& other)   const   {   LargeInt<1> res; res.value = value & other.value; return res; }
+    LargeInt<1> operator&  (const char& other)          const   {   LargeInt<1> res; res.value = value & other;       return res; }
+    LargeInt<1> operator~  ()                           const   {   LargeInt<1> res; res.value = ~value;              return res; }
+    LargeInt<1> operator<< (const int& coeff)           const   {   LargeInt<1> res; res.value = value << coeff;      return res; }
+    LargeInt<1> operator>> (const int& coeff)           const   {   LargeInt<1> res; res.value = value >> coeff;      return res; }
+#if 0  // last time i defined those copy operators, i ran into troubles, so let's not do that and let's use setVal instead!
+    LargeInt<1> operator=  (const uint64_t& c)          const   {   res.value = c;  return res; }
+    LargeInt<1> operator=  (const LargeInt<1>& other)   const   {   if (this == &other) return *this; res.value = other.value;  return *this; }
+#endif
+    bool        operator!= (const LargeInt<1>& c)       const   {   return value != c.value; }
+    bool        operator!= (const u_int64_t& c)         const   {   return value != c; }
+    bool        operator== (const LargeInt<1>& c)       const   {   return value == c.value; }
+    bool        operator== (const u_int64_t& c)         const   {   return value == c; }
+    bool        operator<  (const LargeInt<1>& c)       const   {   return value < c.value; }
+    bool        operator<= (const LargeInt<1>& c)       const   {   return value <= c.value; }
+
+    LargeInt<1>& operator+=  (const LargeInt<1>& other)    {  value += other.value; return *this; }
+    LargeInt<1>& operator^=  (const LargeInt<1>& other)    {  value ^= other.value; return *this; }
+
+    LargeInt<1>& operator<<=  (const int& coeff)  { value <<= coeff; return *this; } 
+    LargeInt<1>& operator>>=  (const int& coeff)  { value >>= coeff; return *this; }
+
+    u_int8_t  operator[]  (size_t idx) const   {  return (value >> (2*idx)) & 3; }
+
+    /********************************************************************************/
+    friend std::ostream & operator<<(std::ostream & s, const LargeInt<1> & l)
+    {
+        s << std::hex << l.value << std::dec;  return s;
+    }
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[sizeKmer] in : kmer size (def=32).
+     */
+    inline void printASCII ( size_t sizeKmer = 32)
+    {
+        int i;
+        u_int64_t temp = value;
+
+        
+        char seq[33];
+        char bin2NT[4] = {'A','C','T','G'};
+        
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+            seq[sizeKmer]='\0';
+        
+        std::cout << seq << std::endl;
+    }
+
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[sizeKmer] in : kmer size (def=32).
+     */
+    std::string toString (size_t sizeKmer) const
+    {
+        int i;
+        u_int64_t temp = value;
+
+        char seq[33];
+        char bin2NT[4] = {'A','C','T','G'};
+
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+        seq[sizeKmer]='\0';
+        return seq;
+    }
+
+    /********************************************************************************/
+    inline static u_int64_t revcomp64 (const u_int64_t& x, size_t sizeKmer)
+    {
+        u_int64_t res = x;
+
+        // OLD VERSION (with lookup table)
+        // unsigned char* kmerrev  = (unsigned char *) (&(res));
+        // unsigned char* kmer     = (unsigned char *) (&(x));
+        // for (size_t i=0; i<8; ++i)  {  kmerrev[8-1-i] = revcomp_4NT [kmer[i]];  }
+
+        res = ((res>> 2 & 0x3333333333333333) | (res & 0x3333333333333333) <<  2);
+        res = ((res>> 4 & 0x0F0F0F0F0F0F0F0F) | (res & 0x0F0F0F0F0F0F0F0F) <<  4);
+        res = ((res>> 8 & 0x00FF00FF00FF00FF) | (res & 0x00FF00FF00FF00FF) <<  8);
+        res = ((res>>16 & 0x0000FFFF0000FFFF) | (res & 0x0000FFFF0000FFFF) << 16);
+        res = ((res>>32 & 0x00000000FFFFFFFF) | (res & 0x00000000FFFFFFFF) << 32);
+        res = res ^ 0xAAAAAAAAAAAAAAAA;
+        
+        return (res >> (2*(32-sizeKmer))) ;
+    }
+
+    /********************************************************************************/
+    inline static u_int64_t hash64 (u_int64_t key, u_int64_t seed)
+    {
+        u_int64_t hash = seed;
+        hash ^= (hash <<  7) ^  key * (hash >> 3) ^ (~((hash << 11) + (key ^ (hash >> 5))));
+        hash = (~hash) + (hash << 21); // hash = (hash << 21) - hash - 1;
+        hash = hash ^ (hash >> 24);
+        hash = (hash + (hash << 3)) + (hash << 8); // hash * 265
+        hash = hash ^ (hash >> 14);
+        hash = (hash + (hash << 2)) + (hash << 4); // hash * 21
+        hash = hash ^ (hash >> 28);
+        hash = hash + (hash << 31);
+		
+		return hash;
+    }
+
+    /********************************************************************************/
+    inline static u_int64_t oahash64 (u_int64_t elem)
+    {
+        u_int64_t code = elem;
+        code = code ^ (code >> 14); //supp
+        code = (~code) + (code << 18);
+        code = code ^ (code >> 31);
+        code = code * 21;
+        code = code ^ (code >> 11);
+        code = code + (code << 6);
+        code = code ^ (code >> 22);
+        return code;
+    }
+
+    /********************************************************************************/
+    /** computes a simple, naive hash using only 16 bits from input key
+     * \param[shift] in : selects which of the input byte will be used for hash computation
+     */
+    inline static  u_int64_t    simplehash16_64   (u_int64_t key, int  shift)
+    {
+        u_int64_t input = key >> shift;
+        u_int64_t res = random_values[input & 255]   ;
+        
+        input = input  >> 8;
+        res  ^= random_values[input & 255] ;
+
+        
+        res  ^= random_values[key & 255] ;//also always add 8 first bits
+//		
+//		input = input  >> 8;
+//        res  ^= random_values[input & 255] ;
+//		
+//		
+//		input = input  >> 8;
+//        res  ^= random_values[input & 255] ;
+		
+		
+        return res;
+        //could be improved by xor'ing result of multiple bytes
+    }
+
+    /********************************************************************************/
+    static hid_t hdf5 (bool& isCompound)
+    {
+        return H5Tcopy (H5T_NATIVE_UINT64);
+    }
+
+    /********************************************************************************/
+    template<typename Map>
+    static LargeInt<1> polynom (const char* data, size_t size, Map fct)
+    {
+        LargeInt<1> res;
+        res.value = 0;
+        for (size_t i=0; i<size; ++i)  {  res.value = 4 * res.value + fct(data[i]);  }
+        return res;
+    }
+
+    u_int64_t value; // not ArrayData anymore
+
+private:
+
+    friend LargeInt<1> revcomp (const LargeInt<1>& i,   size_t sizeKmer);
+    friend u_int64_t    hash1    (const LargeInt<1>& key, u_int64_t  seed);
+    friend u_int64_t    hash2    (const LargeInt<1>& key, u_int64_t  seed);
+    friend u_int64_t    oahash  (const LargeInt<1>& key);
+    friend u_int64_t    simplehash16    (const LargeInt<1>& key, int  shift);
+    friend void fastLexiMinimizer (const LargeInt<1>& x, const unsigned int _nbMinimizers, const unsigned int m,  u_int32_t &minimizer, size_t &position, bool &validResult);
+
+};
+
+/********************************************************************************/
+inline LargeInt<1> revcomp (const LargeInt<1>& x, size_t sizeKmer)
+{
+    LargeInt<1> res;
+    res.value = LargeInt<1>::revcomp64 (x.value, sizeKmer);
+    return res;
+}
+
+/********************************************************************************/
+inline u_int64_t hash1 (const LargeInt<1>& key, u_int64_t seed=0)
+{
+
+    return LargeInt<1>::hash64 (key.value, seed);
+}
+
+
+inline u_int64_t hash2 (const LargeInt<1>& x, u_int64_t seed=0)
+{
+// from inline uint64_t twang_mix64(uint64_t key) taken from https://github.com/facebook/folly/blob/master/folly/Hash.h
+  u_int64_t key = x.value;
+  key = (~key) + (key << 21);  // key *= (1 << 21) - 1; key -= 1;
+  key = key ^ (key >> 24);
+  key = key + (key << 3) + (key << 8);  // key *= 1 + (1 << 3) + (1 << 8)
+  key = key ^ (key >> 14);
+  key = key + (key << 2) + (key << 4);  // key *= 1 + (1 << 2) + (1 << 4)
+  key = key ^ (key >> 28);
+  key = key + (key << 31);  // key *= 1 + (1 << 31)
+  return key;
+}
+
+/********************************************************************************/
+inline u_int64_t oahash (const LargeInt<1>& key)
+{
+    return LargeInt<1>::oahash64 (key.value);
+}
+
+/********************************************************************************/
+inline u_int64_t simplehash16 (const LargeInt<1>& key, int  shift)
+{
+    return LargeInt<1>::simplehash16_64 (key.value, shift);
+}
+
+inline void fastLexiMinimizer (const LargeInt<1>& x, const unsigned int _nbMinimizers, const unsigned int m,  u_int32_t &minimizer, size_t &position, bool &validResult) 
+{
+    if (m > sizeof(u_int32_t)*4) {std::cout << "wrong minimizer size for fastLeximinimizer :" << m; exit(1);}
+
+    const u_int32_t default_minimizer = ~0 & ((1 << (2*m)) - 1); 
+    minimizer = default_minimizer; 
+
+    validResult = false;
+    bool AA_found = false;
+
+    u_int64_t val = x.value;
+    const u_int32_t high_bits = 0;
+    const int position_offset = 0;
+
+    fastLexiMinimizerChunk<u_int64_t,u_int32_t>(val, _nbMinimizers, m, high_bits, minimizer, position, position_offset, AA_found);
+
+    validResult = AA_found && (minimizer != default_minimizer) /* might happen that AA was found but resulted in forbidden minimizers */;
+}
+
+/* debug function, for profiling only; counts the AA's in a kmer */
+inline void justSweepForAA(const LargeInt<1>& x, const unsigned int _nbMinimizers, unsigned int &dummy) 
+{
+    u_int64_t val = x.value;
+
+    const int it = std::min((unsigned int)sizeof(u_int64_t)*4,(unsigned int) _nbMinimizers); 
+    int j = 0;
+    while (j < it)
+    {
+        if ((val & 15) == 0) // val starts with AA
+            dummy++;
+
+        val >>= 2;
+        j++;
+    }
+}
+
diff --git a/gatb-core/src/gatb/tools/math/LargeInt2.pri b/gatb-core/src/gatb/tools/math/LargeInt2.pri
new file mode 100644
index 0000000..25274cf
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/LargeInt2.pri
@@ -0,0 +1,285 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file LargeInt<2>.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int64_t type
+ */
+
+/********************************************************************************/
+#if  INT128_FOUND == 1
+/********************************************************************************/
+
+template<>  class LargeInt<2> 
+{
+public:
+
+#ifdef USE_LARGEINT_CONSTRUCTOR 
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    LargeInt<2> (const __uint128_t& c=0)  {  value = c;  }
+#endif
+
+     u_int64_t getVal () const  { return value; }
+     inline void setVal (const u_int64_t &c) { value = c; }
+     inline void setVal (const LargeInt<2>& c) { value = c.value; }
+
+    static const char* getName ()  { return "LargeInt<2>"; }
+
+    static const size_t getSize ()  { return 8*sizeof(__uint128_t); }
+
+    LargeInt<2> operator+  (const LargeInt<2>& other)   const   {  LargeInt<2> res; res.value = value + other.value; return res; }
+    LargeInt<2> operator+  (const u_int64_t& other)     const   {  LargeInt<2> res; res.value = value + other; return res; }
+    LargeInt<2> operator-  (const LargeInt<2>& other)   const   {  LargeInt<2> res; res.value = value - other.value; return res; }
+    LargeInt<2> operator-  (const u_int64_t& other)     const   {  LargeInt<2> res; res.value = value - other; return res; }
+    LargeInt<2> operator|  (const LargeInt<2>& other)   const   {   LargeInt<2> res; res.value = value | other.value; return res; }
+    LargeInt<2> operator*  (const int& coeff)           const   {   LargeInt<2> res; res.value = value * coeff;       return res; }
+    LargeInt<2> operator/  (const u_int32_t& divisor)   const   {   LargeInt<2> res; res.value = value / divisor;     return res; }
+    u_int32_t   operator%  (const u_int32_t& divisor)   const   {   return value % divisor;  }
+    LargeInt<2> operator^  (const LargeInt<2>& other)   const   {   LargeInt<2> res; res.value = value ^ other.value; return res; }
+    LargeInt<2> operator&  (const LargeInt<2>& other)   const   {   LargeInt<2> res; res.value = value & other.value; return res; }
+    LargeInt<2> operator&  (const char& other)          const   {   LargeInt<2> res; res.value = value & other;       return res; }
+    LargeInt<2> operator~  ()                           const   {   LargeInt<2> res; res.value = ~value;              return res; }
+    LargeInt<2> operator<< (const int& coeff)           const   {   LargeInt<2> res; res.value = value << coeff;      return res; }
+    LargeInt<2> operator>> (const int& coeff)           const   {   LargeInt<2> res; res.value = value >> coeff;      return res; }
+    /*    LargeInt<2> operator=  (const u_int64_t& other)     const   {   LargeInt<2> res; res.value = other; return res; }
+    LargeInt<2> operator=  (const LargeInt<2>& other)   const   {   LargeInt<2> res; res.value = other.value; return res; }*/ // that code is wrong. see LargeInt1.pri for a fix for operator=(const LargeInt&), haven't figured out for operator=(uint64), decided to use setVal instead
+
+    bool         operator!= (const LargeInt<2>& c)         const   {  return value != c.value;     }
+    bool         operator!= (const u_int64_t  & c)         const   {  return value != c;           }
+    bool         operator== (const LargeInt<2>& c)         const   {  return value == c.value;     }
+    bool         operator== (const u_int64_t  & c)         const   {  return value == c;           }
+    bool         operator<  (const LargeInt<2>& c)         const   {  return value < c.value;      }
+    bool         operator<= (const LargeInt<2>& c)         const   {  return value <= c.value;     }
+
+    LargeInt<2>& operator+=  (const LargeInt<2>& other)    {  value += other.value; return *this; }
+    LargeInt<2>& operator+=  (const u_int64_t& other)      {  value += other; return *this; }
+    LargeInt<2>& operator^=  (const LargeInt<2>& other)    {  value ^= other.value; return *this; }
+
+    LargeInt<2>& operator<<=  (const int& coeff)  { value <<= coeff; return *this; } 
+    LargeInt<2>& operator>>=  (const int& coeff)  { value >>= coeff; return *this; }
+
+    u_int8_t  operator[]  (size_t idx) const   {  return (value >> (2*idx)) & 3; }
+
+    /** Output stream overload. NOTE: for easier process, dump the value in hexadecimal.
+     * \param[in] os : the output stream
+     * \param[in] in : the integer value to be output.
+     * \return the output stream.
+     */
+    friend std::ostream & operator<<(std::ostream & os, const LargeInt<2> & in)
+    {
+        __uint128_t x = in.value;
+
+        u_int64_t high_nucl = (u_int64_t) (x>>64);
+        u_int64_t low_nucl  = (u_int64_t)(x&((((__uint128_t)1)<<64)-1));
+
+        if (high_nucl == 0) {   os << std::hex <<                     low_nucl << std::dec;  }
+        else                {   os << std::hex << high_nucl << "." << low_nucl << std::dec;  }
+        return os;
+    }
+
+    /********************************************************************************/
+    
+    /** Print corresponding kmer in ASCII
+     * \param[sizeKmer] in : kmer size (def=64).
+     */
+    inline void printASCII ( size_t sizeKmer = 64)
+    {
+        int i;
+        u_int64_t temp = value;
+        
+        
+        char seq[65];
+        char bin2NT[4] = {'A','C','T','G'};
+        
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+        seq[sizeKmer]='\0';
+        
+        std::cout << seq << std::endl;
+    }
+    
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[sizeKmer] in : kmer size (def=32).
+     */
+    std::string toString (size_t sizeKmer) const
+    {
+        char seq[65];
+        char bin2NT[4] = {'A','C','T','G'};
+
+        for (size_t i=0; i<sizeKmer; i++)  {  seq[sizeKmer-i-1] = bin2NT [(*this)[i]];  }
+        seq[sizeKmer]='\0';
+        return seq;
+    }
+
+    /********************************************************************************/
+    static hid_t hdf5 (bool& isCompound)
+    {
+        hid_t result = H5Tcopy (H5T_NATIVE_INT);
+        H5Tset_precision (result, 128);
+        return result;
+    }
+    
+    /********************************************************************************/
+    template<typename Map>
+    static LargeInt<2> polynom (const char* data, size_t size, Map fct)
+    {
+        LargeInt<2> res;
+        res.setVal(0);
+        for (size_t i=0; i<size; ++i)  {  res.value = res.value * 4 + fct(data[i]);  }
+        return res;
+    }
+
+private:
+    __uint128_t value;
+    friend LargeInt<2> revcomp (const LargeInt<2>& i,   size_t sizeKmer);
+    friend u_int64_t    hash1    (const LargeInt<2>& key, u_int64_t  seed);
+    friend u_int64_t    hash2    (const LargeInt<2>& key, u_int64_t  seed);
+    friend u_int64_t    oahash  (const LargeInt<2>& key);
+    friend u_int64_t    simplehash16    (const LargeInt<2>& key, int  shift);
+    template<typename m_T> friend void fastLexiMinimizer (const LargeInt<2>& x, const unsigned int _nbMinimizers, \
+                             const unsigned int m, m_T &minimizer, size_t &position, bool &validResult);
+    friend void justSweepForAA(const LargeInt<2>& x, const unsigned int _nbMinimizers, unsigned int &dummy);
+
+};
+
+/********************************************************************************/
+inline LargeInt<2> revcomp (const LargeInt<2>& in, size_t sizeKmer)
+{
+    //                  ---64bits--   ---64bits--
+    // original kmer: [__high_nucl__|__low_nucl___]
+    //
+    // ex:            [         AC  | .......TG   ]
+    //
+    //revcomp:        [         CA  | .......GT   ]
+    //                 \_low_nucl__/\high_nucl/
+
+    const __uint128_t& x = in.value;
+
+    u_int64_t high_nucl = (u_int64_t)(x>>64);
+    int nb_high_nucl = sizeKmer>32?sizeKmer - 32:0;
+
+    u_int64_t revcomp_high_nucl = NativeInt64::revcomp64 (high_nucl, nb_high_nucl);
+
+    if (sizeKmer<=32) revcomp_high_nucl = 0; // srsly dunno why this is needed. gcc bug? u_int64_t x ---> (x>>64) != 0
+
+    u_int64_t low_nucl = (u_int64_t)(x&((((__uint128_t)1)<<64)-1));
+    int nb_low_nucl = sizeKmer>32?32:sizeKmer;
+
+    u_int64_t revcomp_low_nucl = NativeInt64::revcomp64 (low_nucl, nb_low_nucl);
+
+    LargeInt<2> res;
+    res.setVal(revcomp_low_nucl);
+    res <<= 2* nb_high_nucl;
+    res += revcomp_high_nucl;
+    return res;
+}
+
+/********************************************************************************/
+inline u_int64_t hash1 (const LargeInt<2>& item, u_int64_t seed=0)
+{
+    const __uint128_t& elem = item.value;
+
+    return NativeInt64::hash64 ((u_int64_t)(elem>>64),seed) ^
+           NativeInt64::hash64 ((u_int64_t)(elem&((((__uint128_t)1)<<64)-1)),seed);
+}
+
+inline u_int64_t hash2 (const LargeInt<2>& item, u_int64_t seed=0)
+{
+    const __uint128_t& elem = item.value;
+
+        // from inline uint64_t twang_mix64(uint64_t key) taken from https://github.com/facebook/folly/blob/master/folly/Hash.h
+        u_int64_t key = (u_int64_t)(elem>>64);
+        key = (~key) + (key << 21);  // key *= (1 << 21) - 1; key -= 1;
+        key = key ^ (key >> 24);
+        key = key + (key << 3) + (key << 8);  // key *= 1 + (1 << 3) + (1 << 8)
+        key = key ^ (key >> 14);
+        key = key + (key << 2) + (key << 4);  // key *= 1 + (1 << 2) + (1 << 4)
+        key = key ^ (key >> 28);
+        key = key + (key << 31);  // key *= 1 + (1 << 31)
+        u_int64_t res = key;
+
+        key = (u_int64_t)(elem&((((__uint128_t)1)<<64)-1));
+        key = (~key) + (key << 21);  // key *= (1 << 21) - 1; key -= 1;
+        key = key ^ (key >> 24);
+        key = key + (key << 3) + (key << 8);  // key *= 1 + (1 << 3) + (1 << 8)
+        key = key ^ (key >> 14);
+        key = key + (key << 2) + (key << 4);  // key *= 1 + (1 << 2) + (1 << 4)
+        key = key ^ (key >> 28);
+        key = key + (key << 31);  // key *= 1 + (1 << 31)
+
+    return res ^ key;
+}
+
+
+/********************************************************************************/
+inline u_int64_t oahash (const LargeInt<2>& item)
+{
+    const __uint128_t& elem = item.value;
+
+    return NativeInt64::oahash64 ((u_int64_t)(elem>>64)) ^
+           NativeInt64::oahash64 ((u_int64_t)(elem&((((__uint128_t)1)<<64)-1)));
+}
+
+
+
+/********************************************************************************/
+inline u_int64_t simplehash16 (const LargeInt<2>& key, int  shift)
+{
+    return NativeInt64::simplehash16_64 ((u_int64_t)key.value, shift);
+}
+
+/********************************************************************************/
+template<typename minimizer_type> void fastLexiMinimizer (const LargeInt<2>& x, const unsigned int _nbMinimizers, \
+                             const unsigned int m, minimizer_type &minimizer, size_t &position, bool &validResult)
+{
+    const minimizer_type default_minimizer = ~0 & ((1 << (2*m)) - 1); 
+    minimizer = default_minimizer; 
+    validResult = false;
+
+    fastLexiMinimizerChunk<__uint128_t,minimizer_type>(x.value, _nbMinimizers, m, 0,  minimizer, position, 0, validResult);
+
+    validResult = validResult && (minimizer != default_minimizer) /* might happen that AA was found but resulted in forbidden minimizers */;
+}
+
+/* debug function, for profiling only; counts the AA's in a kmer */
+inline void justSweepForAA(const LargeInt<2>& x, const unsigned int _nbMinimizers, unsigned int &dummy) 
+{
+        __uint128_t val = x.value;
+
+        const int it = std::min((unsigned int)sizeof(__uint128_t)*4, _nbMinimizers); 
+        int j = 0;
+        while (j < it)
+        {
+            if ((val & 15) == 0) // val starts with AA
+                dummy++;
+
+            val >>= 2;
+        }
+}
+
+
+/********************************************************************************/
+#endif //INT128_FOUND
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/math/NativeInt128.hpp b/gatb-core/src/gatb/tools/math/NativeInt128.hpp
new file mode 100644
index 0000000..60be5d5
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/NativeInt128.hpp
@@ -0,0 +1,225 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file NativeInt128.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native 128 bits integer type
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_128_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_128_HPP_
+
+#include <gatb/system/api/config.hpp>
+
+/********************************************************************************/
+#if  INT128_FOUND == 1
+/********************************************************************************/
+
+#include <iostream>
+#include <hdf5/hdf5.h>
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <gatb/tools/math/NativeInt64.hpp>
+
+extern const unsigned char revcomp_4NT[];
+extern const unsigned char comp_NT    [];
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+class NativeInt128
+{
+public:
+
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    NativeInt128 (const __uint128_t& c=0)  {  value[0] = c;  value[1] = 0;}
+
+    static const char* getName ()  { return "NativeInt128"; }
+
+    u_int64_t getVal ()  { return value[0]; }
+    void setVal (u_int64_t c)  { value[0] = c; value[1] = 0; }
+
+    static const size_t getSize ()  { return 8*sizeof(__uint128_t); }
+
+    NativeInt128 operator+  (const NativeInt128& other)     const   {  return value[0] + other.value[0];  }
+    NativeInt128 operator-  (const NativeInt128& other)     const   {  return value[0] - other.value[0];  }
+    NativeInt128 operator|  (const NativeInt128& other)     const   {  return value[0] | other.value[0];  }
+    NativeInt128 operator*  (const int& coeff)              const   {  return value[0] * coeff;        }
+    NativeInt128 operator/  (const u_int32_t& divisor)      const   {  return value[0] / divisor;      }
+    u_int32_t    operator%  (const u_int32_t& divisor)      const   {  return value[0] % divisor;      }
+    NativeInt128 operator^  (const NativeInt128& other)     const   {  return value[0] ^ other.value[0];  }
+    NativeInt128 operator&  (const NativeInt128& other)     const   {  return value[0] & other.value[0];  }
+    NativeInt128 operator&  (const char& other)             const   {  return value[0] & other;        }
+    NativeInt128 operator~  ()                              const   {  return ~value[0];               }
+    NativeInt128 operator<< (const int& coeff)              const   {  return value[0] << coeff;       }
+    NativeInt128 operator>> (const int& coeff)              const   {  return value[0] >> coeff;       }
+    bool         operator!= (const NativeInt128& c)         const   {  return value[0] != c.value[0];     }
+    bool         operator== (const NativeInt128& c)         const   {  return value[0] == c.value[0];     }
+    bool         operator<  (const NativeInt128& c)         const   {  return value[0] < c.value[0];      }
+    bool         operator<= (const NativeInt128& c)         const   {  return value[0] <= c.value[0];     }
+
+    NativeInt128& operator+=  (const NativeInt128& other)    {  value[0] += other.value[0]; return *this; }
+    NativeInt128& operator^=  (const NativeInt128& other)    {  value[0] ^= other.value[0]; return *this; }
+    NativeInt128& operator&=  (const NativeInt128& other)    {  value[0] &= other.value[0]; return *this; }
+    NativeInt128& operator|=  (const NativeInt128& other)    {  value[0] |= other.value[0]; return *this; }
+    NativeInt128& operator<<= (const int& coeff)             {  value[0] <<= coeff;         return *this; }
+    NativeInt128& operator>>= (const int& coeff)             {  value[0] >>= coeff;         return *this; }
+
+    /********************************************************************************/
+    NativeInt128& sync_fetch_and_or (const NativeInt128& other)
+    {
+        for (int i=0 ; i < 2 ; i++)  {  __sync_fetch_and_or ((u_int64_t*)(value + i), other.value[i]); }
+        return *this;
+    }
+
+    /********************************************************************************/
+    NativeInt128& sync_fetch_and_and (const NativeInt128& other)
+    {
+        for (int i=0 ; i < 2 ; i++)  {  __sync_fetch_and_and (this->value + i, other.value[i]); }
+        return *this;
+    }
+
+    /** Output stream overload. NOTE: for easier process, dump the value in hexadecimal.
+     * \param[in] os : the output stream
+     * \param[in] in : the integer value to be output.
+     * \return the output stream.
+     */
+    friend std::ostream & operator<<(std::ostream & os, const NativeInt128 & in)
+    {
+        __uint128_t x = in.value[0];
+
+        u_int64_t high_nucl = (u_int64_t) (x>>64);
+        u_int64_t low_nucl  = (u_int64_t)(x&((((__uint128_t)1)<<64)-1));
+
+        if (high_nucl == 0) {   os << std::hex <<                     low_nucl << std::dec;  }
+        else                {   os << std::hex << high_nucl << "." << low_nucl << std::dec;  }
+        return os;
+    }
+
+    /********************************************************************************/
+
+    /** Print corresponding kmer in ASCII
+     * \param[sizeKmer] in : kmer size (def=64).
+     */
+    inline void printASCII ( size_t sizeKmer = 64)
+    {
+        int i;
+        u_int64_t temp = value[0];
+
+
+        char seq[65];
+        char bin2NT[4] = {'A','C','T','G'};
+
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+        seq[sizeKmer]='\0';
+
+        std::cout << seq << std::endl;
+    }
+
+    /********************************************************************************/
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        hid_t result = H5Tcopy (H5T_NATIVE_INT);
+        H5Tset_precision (result, 128);
+        return result;
+    }
+
+private:
+    __uint128_t value[2];
+
+    friend NativeInt128 revcomp (const NativeInt128& i,   size_t sizeKmer);
+    friend u_int64_t    hash1    (const NativeInt128& key, u_int64_t  seed);
+    friend u_int64_t    oahash  (const NativeInt128& key);
+    friend u_int64_t    simplehash16    (const NativeInt128& key, int  shift);
+
+};
+
+/********************************************************************************/
+inline NativeInt128 revcomp (const NativeInt128& in, size_t sizeKmer)
+{
+    //                  ---64bits--   ---64bits--
+    // original kmer: [__high_nucl__|__low_nucl___]
+    //
+    // ex:            [         AC  | .......TG   ]
+    //
+    //revcomp:        [         CA  | .......GT   ]
+    //                 \_low_nucl__/\high_nucl/
+
+    const __uint128_t& x = in.value[0];
+
+    u_int64_t high_nucl = (u_int64_t)(x>>64);
+    int nb_high_nucl = sizeKmer>32?sizeKmer - 32:0;
+
+    __uint128_t revcomp_high_nucl = NativeInt64::revcomp64 (high_nucl, nb_high_nucl);
+
+    if (sizeKmer<=32) revcomp_high_nucl = 0; // srsly dunno why this is needed. gcc bug? u_int64_t x ---> (x>>64) != 0
+
+    u_int64_t low_nucl = (u_int64_t)(x&((((__uint128_t)1)<<64)-1));
+    int nb_low_nucl = sizeKmer>32?32:sizeKmer;
+
+    __uint128_t revcomp_low_nucl = NativeInt64::revcomp64 (low_nucl, nb_low_nucl);
+
+    return (revcomp_low_nucl<<(2*nb_high_nucl)) + revcomp_high_nucl;
+}
+
+/********************************************************************************/
+inline u_int64_t hash1 (const NativeInt128& item, u_int64_t seed=0)
+{
+    const __uint128_t& elem = item.value[0];
+
+    return NativeInt64::hash64 ((u_int64_t)(elem>>64),seed) ^
+           NativeInt64::hash64 ((u_int64_t)(elem&((((__uint128_t)1)<<64)-1)),seed);
+}
+
+/********************************************************************************/
+inline u_int64_t oahash (const NativeInt128& item)
+{
+    const __uint128_t& elem = item.value[0];
+
+    return NativeInt64::oahash64 ((u_int64_t)(elem>>64)) ^
+           NativeInt64::oahash64 ((u_int64_t)(elem&((((__uint128_t)1)<<64)-1)));
+}
+
+/********************************************************************************/
+inline u_int64_t simplehash16 (const NativeInt128& key, int  shift)
+{
+    return NativeInt64::simplehash16_64 ((u_int64_t)key.value[0], shift);
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+/********************************************************************************/
+#endif //INT128_FOUND
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_128_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/NativeInt16.hpp b/gatb-core/src/gatb/tools/math/NativeInt16.hpp
new file mode 100644
index 0000000..6a71bb0
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/NativeInt16.hpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file NativeInt16.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int16_t type
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_16_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_16_HPP_
+
+/********************************************************************************/
+
+#include <iostream>
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+class NativeInt16 : private misc::ArrayData<u_int16_t, 1>
+{
+public:
+
+    typedef ArrayData<u_int16_t, 1> POD;
+
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    NativeInt16 (const u_int8_t& c=0)  {  value[0] = c;  }
+
+    static const char* getName ()  { return "NativeInt16"; }
+
+    static const size_t getSize ()  { return 8*sizeof(u_int16_t); }
+
+    NativeInt16 operator+  (const NativeInt16& other)   const   {  return value[0] + other.value[0];  }
+    NativeInt16 operator-  (const NativeInt16& other)   const   {  return value[0] - other.value[0];  }
+    NativeInt16 operator|  (const NativeInt16& other)   const   {  return value[0] | other.value[0];  }
+    NativeInt16 operator^  (const NativeInt16& other)   const   {  return value[0] ^ other.value[0];  }
+    NativeInt16 operator&  (const NativeInt16& other)   const   {  return value[0] & other.value[0];  }
+    NativeInt16 operator&  (const char& other)          const   {  return value[0] & other;        }
+    NativeInt16 operator~  ()                           const   {  return ~value[0];               }
+    NativeInt16 operator<< (const int& coeff)           const   {  return value[0] << coeff;       }
+    NativeInt16 operator>> (const int& coeff)           const   {  return value[0] >> coeff;       }
+    bool        operator!= (const NativeInt16& c)       const   {  return value[0] != c.value[0];     }
+    bool        operator== (const NativeInt16& c)       const   {  return value[0] == c.value[0];     }
+    bool        operator<  (const NativeInt16& c)       const   {  return value[0] < c.value[0];      }
+    bool        operator<= (const NativeInt16& c)       const   {  return value[0] <= c.value[0];     }
+    bool        operator>= (const NativeInt16& c)       const   {  return value[0] >= c.value[0];     }
+    NativeInt16& operator+=  (const NativeInt16& other)    {  value[0] += other.value[0]; return *this; }
+    NativeInt16& operator^=  (const NativeInt16& other)    {  value[0] ^= other.value[0]; return *this; }
+
+    /********************************************************************************/
+    friend std::ostream & operator<<(std::ostream & s, const NativeInt16 & l)
+    {
+        s << std::hex << l.value[0] << std::dec;  return s;
+    }
+
+    /********************************************************************************/
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        return H5Tcopy (H5T_NATIVE_UINT16);
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_16_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/NativeInt32.hpp b/gatb-core/src/gatb/tools/math/NativeInt32.hpp
new file mode 100644
index 0000000..c22b892
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/NativeInt32.hpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file NativeInt32.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int32_t type
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_32_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_32_HPP_
+
+/********************************************************************************/
+
+#include <iostream>
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+class NativeInt32 : private misc::ArrayData<u_int16_t, 1>
+{
+public:
+
+    typedef ArrayData<u_int16_t, 1> POD;
+
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    NativeInt32 (const u_int8_t& c=0)  {  value[0] = c;  }
+
+    static const char* getName ()  { return "NativeInt32"; }
+
+    static const size_t getSize ()  { return 8*sizeof(u_int16_t); }
+
+    NativeInt32 operator+  (const NativeInt32& other)   const   {  return value[0] + other.value[0];  }
+    NativeInt32 operator-  (const NativeInt32& other)   const   {  return value[0] - other.value[0];  }
+    NativeInt32 operator|  (const NativeInt32& other)   const   {  return value[0] | other.value[0];  }
+    NativeInt32 operator^  (const NativeInt32& other)   const   {  return value[0] ^ other.value[0];  }
+    NativeInt32 operator&  (const NativeInt32& other)   const   {  return value[0] & other.value[0];  }
+    NativeInt32 operator&  (const char& other)          const   {  return value[0] & other;        }
+    NativeInt32 operator~  ()                           const   {  return ~value[0];               }
+    NativeInt32 operator<< (const int& coeff)           const   {  return value[0] << coeff;       }
+    NativeInt32 operator>> (const int& coeff)           const   {  return value[0] >> coeff;       }
+    bool        operator!= (const NativeInt32& c)       const   {  return value[0] != c.value[0];     }
+    bool        operator== (const NativeInt32& c)       const   {  return value[0] == c.value[0];     }
+    bool        operator<  (const NativeInt32& c)       const   {  return value[0] < c.value[0];      }
+    bool        operator<= (const NativeInt32& c)       const   {  return value[0] <= c.value[0];     }
+    bool        operator>= (const NativeInt32& c)       const   {  return value[0] >= c.value[0];     }
+    NativeInt32& operator+=  (const NativeInt32& other)    {  value[0] += other.value[0]; return *this; }
+    NativeInt32& operator^=  (const NativeInt32& other)    {  value[0] ^= other.value[0]; return *this; }
+
+    /********************************************************************************/
+    friend std::ostream & operator<<(std::ostream & s, const NativeInt32 & l)
+    {
+        s << std::hex << l.value[0] << std::dec;  return s;
+    }
+
+    /********************************************************************************/
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        return H5Tcopy (H5T_NATIVE_UINT32);
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_16_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/NativeInt64.hpp b/gatb-core/src/gatb/tools/math/NativeInt64.hpp
new file mode 100644
index 0000000..c06aaab
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/NativeInt64.hpp
@@ -0,0 +1,269 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file NativeInt64.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int64_t type
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_64_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_64_HPP_
+
+/********************************************************************************/
+
+#include <iostream>
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <hdf5/hdf5.h>
+
+extern const unsigned char revcomp_4NT[];
+extern const unsigned char comp_NT    [];
+extern const u_int64_t random_values    [256];
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+class NativeInt64 
+{
+public:
+
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    NativeInt64 (const u_int64_t& c=0)  {  value = c;  }
+
+    static const char* getName ()  { return "NativeInt64"; }
+
+     u_int64_t getVal ()  { return value; }
+     void setVal (u_int64_t c)  { value = c; }
+
+    
+    static const size_t getSize ()  { return 8*sizeof(u_int64_t); }
+
+    NativeInt64 operator+  (const NativeInt64& other)   const   {  return value + other.value;  }
+    NativeInt64 operator-  (const NativeInt64& other)   const   {  return value - other.value;  }
+    NativeInt64 operator|  (const NativeInt64& other)   const   {  return value | other.value;  }
+    NativeInt64 operator*  (const int& coeff)           const   {  return value * coeff;        }
+    NativeInt64 operator/  (const u_int32_t& divisor)   const   {  return value / divisor;      }
+    u_int32_t   operator%  (const u_int32_t& divisor)   const   {  return value % divisor;      }
+    NativeInt64 operator^  (const NativeInt64& other)   const   {  return value ^ other.value;  }
+    NativeInt64 operator&  (const NativeInt64& other)   const   {  return value & other.value;  }
+    NativeInt64 operator&  (const char& other)          const   {  return value & other;        }
+    NativeInt64 operator~  ()                           const   {  return ~value;               }
+    NativeInt64 operator<< (const int& coeff)           const   {  return value << coeff;       }
+    NativeInt64 operator>> (const int& coeff)           const   {  return value >> coeff;       }
+    bool        operator!= (const NativeInt64& c)       const   {  return value != c.value;     }
+    bool        operator== (const NativeInt64& c)       const   {  return value == c.value;     }
+    bool        operator<  (const NativeInt64& c)       const   {  return value < c.value;      }
+    bool        operator<= (const NativeInt64& c)       const   {  return value <= c.value;     }
+
+    NativeInt64& operator+=  (const NativeInt64& other)    {  value += other.value; return *this; }
+    NativeInt64& operator^=  (const NativeInt64& other)    {  value ^= other.value; return *this; }
+    NativeInt64& operator&=  (const NativeInt64& other)    {  value &= other.value; return *this; }
+    NativeInt64& operator|=  (const NativeInt64& other)    {  value |= other.value; return *this; }
+    NativeInt64& operator<<= (const int& coeff)            {  value <<= coeff;         return *this; }
+    NativeInt64& operator>>= (const int& coeff)            {  value >>= coeff;         return *this; }
+
+    NativeInt64& sync_fetch_and_or  (const NativeInt64& other)  { __sync_fetch_and_or  (&(value), other.value); return *this; }
+    NativeInt64& sync_fetch_and_and (const NativeInt64& other)  { __sync_fetch_and_and (&(value), other.value); return *this; }
+
+    u_int8_t  operator[]  (size_t idx)    {  return (value >> (2*idx)) & 3; }
+
+    u_int64_t toInt () const  {  return value; }
+
+    /********************************************************************************/
+    friend std::ostream & operator<<(std::ostream & s, const NativeInt64 & l)
+    {
+        s << std::hex << l.value << std::dec;  return s;
+    }
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[in] sizeKmer : kmer size (def=32).
+     */
+    inline void printASCII ( size_t sizeKmer = 32)
+    {
+        int i;
+        u_int64_t temp = value;
+
+        
+        char seq[33];
+        char bin2NT[4] = {'A','C','T','G'};
+        
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+            seq[sizeKmer]='\0';
+        
+        std::cout << seq << std::endl;
+    }
+
+    /********************************************************************************/
+    /** Print corresponding kmer in ASCII
+     * \param[in] sizeKmer : kmer size (def=32).
+     */
+    std::string toString (size_t sizeKmer) const
+    {
+        int i;
+        u_int64_t temp = value;
+
+        char seq[33];
+        char bin2NT[4] = {'A','C','T','G'};
+
+        for (i=sizeKmer-1; i>=0; i--)
+        {
+            seq[i] = bin2NT[ temp&3 ];
+            temp = temp>>2;
+        }
+        seq[sizeKmer]='\0';
+        return seq;
+    }
+
+    
+    /********************************************************************************/
+    inline static u_int64_t revcomp64 (const u_int64_t& x, size_t sizeKmer)
+    {
+        u_int64_t res = x;
+
+        unsigned char* kmerrev  = (unsigned char *) (&(res));
+        unsigned char* kmer     = (unsigned char *) (&(x));
+
+        for (size_t i=0; i<8; ++i)  {  kmerrev[8-1-i] = revcomp_4NT [kmer[i]];  }
+
+        return (res >> (2*( 32 - sizeKmer))) ;
+    }
+
+	
+	/********************************************************************************/
+    inline static u_int64_t revcomp8 (const u_int64_t& x, size_t sizeKmer)
+    {
+        u_int64_t res = x;
+		
+        unsigned char* kmerrev  = (unsigned char *) (&(res));
+        unsigned char* kmer     = (unsigned char *) (&(x));
+		
+        for (size_t i=0; i<2; ++i)  {  kmerrev[8-1-i] = revcomp_4NT [kmer[i]];  }
+		
+        return (res >> (2*( 32 - sizeKmer))) ;
+    }
+
+	
+	
+    /********************************************************************************/
+    inline static u_int64_t hash64 (u_int64_t key, u_int64_t seed)
+    {
+        u_int64_t hash = seed;
+        hash ^= (hash <<  7) ^  key * (hash >> 3) ^ (~((hash << 11) + (key ^ (hash >> 5))));
+        hash = (~hash) + (hash << 21); // hash = (hash << 21) - hash - 1;
+        hash = hash ^ (hash >> 24);
+        hash = (hash + (hash << 3)) + (hash << 8); // hash * 265
+        hash = hash ^ (hash >> 14);
+        hash = (hash + (hash << 2)) + (hash << 4); // hash * 21
+        hash = hash ^ (hash >> 28);
+        hash = hash + (hash << 31);
+
+        return hash;
+    }
+
+    /********************************************************************************/
+    inline static u_int64_t oahash64 (u_int64_t elem)
+    {
+        u_int64_t code = elem;
+        code = code ^ (code >> 14); //supp
+        code = (~code) + (code << 18);
+        code = code ^ (code >> 31);
+        code = code * 21;
+        code = code ^ (code >> 11);
+        code = code + (code << 6);
+        code = code ^ (code >> 22);
+		
+        return code;
+    }
+
+
+    /********************************************************************************/
+    /** computes a simple, naive hash using only 16 bits from input key
+     * \param[in] key : key of the hash
+     * \param[in] shift : selects which of the input byte will be used for hash computation
+     */
+    inline static  u_int64_t    simplehash16_64   (u_int64_t key, int  shift)
+    {
+        u_int64_t input = key >> shift;
+        u_int64_t res = random_values[input & 255]   ;
+        
+        input = input  >> 8;
+        res  ^= random_values[input & 255] ;
+        
+        return res;
+        //could be improved by xor'ing result of multiple bytes
+    }
+
+    /********************************************************************************/
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        return H5Tcopy (H5T_NATIVE_UINT64);
+    }
+
+private:
+    u_int64_t value;
+
+    friend NativeInt64 revcomp (const NativeInt64& i,   size_t sizeKmer);
+    friend u_int64_t    hash1    (const NativeInt64& key, u_int64_t  seed);
+    friend u_int64_t    oahash  (const NativeInt64& key);
+    friend u_int64_t    simplehash16    (const NativeInt64& key, int  shift);
+
+};
+
+/********************************************************************************/
+inline NativeInt64 revcomp (const NativeInt64& x, size_t sizeKmer)
+{
+    return NativeInt64::revcomp64 (x.value, sizeKmer);
+}
+
+/********************************************************************************/
+inline u_int64_t hash1 (const NativeInt64& key, u_int64_t seed=0)
+{
+
+    return NativeInt64::hash64 (key.value, seed);
+}
+
+/********************************************************************************/
+inline u_int64_t oahash (const NativeInt64& key)
+{
+    return NativeInt64::oahash64 (key.value);
+}
+   
+	
+/********************************************************************************/
+inline u_int64_t simplehash16 (const NativeInt64& key, int  shift)
+{
+    return NativeInt64::simplehash16_64 (key.value, shift);
+}
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_64_HPP_ */
diff --git a/gatb-core/src/gatb/tools/math/NativeInt8.hpp b/gatb-core/src/gatb/tools/math/NativeInt8.hpp
new file mode 100644
index 0000000..9659874
--- /dev/null
+++ b/gatb-core/src/gatb/tools/math/NativeInt8.hpp
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file NativeInt8.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Integer class relying on native u_int8_t type
+ */
+
+#ifndef _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_8_HPP_
+#define _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_8_HPP_
+
+/********************************************************************************/
+
+#include <iostream>
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb  {
+namespace core  {
+namespace tools {
+/** \brief Math package */
+namespace math  {
+/********************************************************************************/
+
+class NativeInt8 : private misc::ArrayData<u_int8_t, 1>
+{
+public:
+
+    /** Constructor.
+     * \param[in] c : initial value of the large integer. */
+    NativeInt8 (const u_int8_t& c=0)  {  value[0] = c;  }
+
+    static const char* getName ()  { return "NativeInt8"; }
+
+    static const size_t getSize ()  { return 8*sizeof(u_int8_t); }
+
+    operator char ()  const {  return (char) value[0];  }
+
+    NativeInt8 operator+  (const NativeInt8& other)   const   {  return value[0] + other.value[0];  }
+    NativeInt8 operator-  (const NativeInt8& other)   const   {  return value[0] - other.value[0];  }
+    NativeInt8 operator|  (const NativeInt8& other)   const   {  return value[0] | other.value[0];  }
+    NativeInt8 operator^  (const NativeInt8& other)   const   {  return value[0] ^ other.value[0];  }
+    NativeInt8 operator&  (const NativeInt8& other)   const   {  return value[0] & other.value[0];  }
+    NativeInt8 operator&  (const char& other)          const   {  return value[0] & other;        }
+    NativeInt8 operator~  ()                           const   {  return ~value[0];               }
+    NativeInt8 operator<< (const int& coeff)           const   {  return value[0] << coeff;       }
+    NativeInt8 operator>> (const int& coeff)           const   {  return value[0] >> coeff;       }
+    bool        operator!= (const NativeInt8& c)       const   {  return value[0] != c.value[0];     }
+    bool        operator== (const NativeInt8& c)       const   {  return value[0] == c.value[0];     }
+    bool        operator<  (const NativeInt8& c)       const   {  return value[0] < c.value[0];      }
+    bool        operator<= (const NativeInt8& c)       const   {  return value[0] <= c.value[0];     }
+    NativeInt8& operator+=  (const NativeInt8& other)    {  value[0] += other.value[0]; return *this; }
+    NativeInt8& operator^=  (const NativeInt8& other)    {  value[0] ^= other.value[0]; return *this; }
+
+    /********************************************************************************/
+    friend std::ostream & operator<<(std::ostream & s, const NativeInt8 & l)
+    {
+        s << std::hex << l.value[0] << std::dec;  return s;
+    }
+
+    /********************************************************************************/
+    inline static hid_t hdf5 (bool& isCompound)
+    {
+        return H5Tcopy (H5T_NATIVE_UINT8);
+    }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MATH_INTEGER_NATIVE_8_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Abundance.hpp b/gatb-core/src/gatb/tools/misc/api/Abundance.hpp
new file mode 100644
index 0000000..3cb84f8
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Abundance.hpp
@@ -0,0 +1,135 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Abundance.hpp
+ *  \brief Abundance definition
+ *  \date 01/03/2013
+ *  \author edrezen
+ */
+
+/********************************************************************************/
+
+#ifndef _GATB_CORE_TOOLS_MISC_ABUNDANCE_HPP_
+#define _GATB_CORE_TOOLS_MISC_ABUNDANCE_HPP_
+
+/********************************************************************************/
+
+#include <sys/types.h>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** \brief Define a specific kind of array.
+ *
+ * This structure provides an array definition as an array attribute 'value' of type 'Type',
+ * holding 'precision' items.
+ *
+ * This structure is used as a basis for the LargeInt implementation.
+ *
+ * \see math::LargeInt
+ */
+template<typename Type, int precision>
+struct ArrayData
+{
+    Type value[precision];
+};
+
+/********************************************************************************/
+
+/** \brief Define a type that associates a value and an abundance.
+ *
+ * We have often to count kmers, so we define a specific structure for this.
+ *
+ * The structure has two templates types:
+ *  - Type : the type of items (likely kmer type)
+ *  - Number : abundance associated to the item
+ */
+template<typename Type, typename Number=u_int16_t> struct Abundance
+{
+    /** Constructor.
+     * \param[in] val : value of the item
+     * \param[in] abund : abundance of the item.
+     */
+    Abundance (const Type& val, const Number& abund) : value(val), abundance(abund) {}
+    Abundance (const Type& val) : value(val), abundance(0) {}
+    Abundance () :  abundance(0) { Type zero; zero.setVal(0); value = zero;}
+
+    /** Affectation operator.
+     * \param[in] a : object to be copied.
+     * \return the copied instance.
+     */
+    Abundance& operator=(const Abundance& a)
+    {
+        if (&a != this)  {  value = a.value;  abundance=a.abundance;  }
+        return *this;
+    }
+
+    /** Get the abundance of the object
+     * \return the abundance.
+     */
+    const Number& getAbundance() const { return abundance; }
+
+    /** Get the value of the item
+     * \return the value.
+     */
+    const Type&   getValue()     const { return value;     }
+
+    /** Equality operator. alues and abundances must be equals
+     * \param[in] other : object to be compared to
+     * \return true if values and abundances are the same
+     */
+    bool operator== (const Abundance& other) const  {  return value == other.value && abundance == other.abundance;  }
+
+    /** Creates a HDF5 type identifier for the [kmer,abundance] structure. This type will be used
+     * for dumping Count instances in a HDF5 file (like SortingCount algorithm does).
+     * \param[in] isCompound : tells whether the structure is compound (SHOULD BE OBSOLETE IN THE FUTURE)
+     * \return the HDF5 identifier for the type. */
+    static hid_t hdf5 (bool& isCompound)
+    {
+        hid_t abundanceType = H5T_NATIVE_UINT16;
+
+             if (sizeof(Number)==1) { abundanceType = H5T_NATIVE_UINT8;  }
+        else if (sizeof(Number)==2) { abundanceType = H5T_NATIVE_UINT16; }
+        else if (sizeof(Number)==4) { abundanceType = H5T_NATIVE_UINT32; }
+        else if (sizeof(Number)==8) { abundanceType = H5T_NATIVE_UINT64; }
+        else { throw "Bad type size for Abundance HDF5 serialization";   }
+
+        hid_t result = H5Tcreate (H5T_COMPOUND, sizeof(Abundance));
+        H5Tinsert (result, "value",      HOFFSET(Abundance, value),     Type::hdf5(isCompound));
+        H5Tinsert (result, "abundance",  HOFFSET(Abundance, abundance), abundanceType);
+
+        isCompound = true;
+
+        return result;
+    }
+
+    Type    value;
+    Number  abundance;
+};
+
+/********************************************************************************/
+}}}}
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_ABUNDANCE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Data.hpp b/gatb-core/src/gatb/tools/misc/api/Data.hpp
new file mode 100644
index 0000000..0c39e72
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Data.hpp
@@ -0,0 +1,190 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Data.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Data structure
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_DATA_HPP_
+#define _GATB_CORE_TOOLS_MISC_DATA_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/Range.hpp>
+#include <gatb/tools/misc/api/Vector.hpp>
+
+#include <iostream>
+#include <string.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** \brief Definition of a data chunk
+ *
+ * A data is defined by:
+ *      - an encoding format
+ *      - a buffer holding the actual data
+ *      - the size of the data
+ *
+ * It is implemented as a subclass of the Vector class, which allows to define Data
+ * as a sub part of a referred Data instance.
+ *
+ * For instance, Data is used for storing nucleotides sequences inside the Sequence
+ * structure.
+ *
+ * \note
+ * In contrast to Vector, the size() represents the number of data elements,
+ * not the number of bytes (see Data::getBufferLength() for length in bytes).
+ */
+class Data : public Vector<char>
+{
+public:
+
+    /** Define how data is encoded. */
+    enum Encoding_e
+    {
+        /** data encoded as ASCII codes (so one byte per data unit) */
+        ASCII,
+        /** one byte per data as integer value (for instance: A=0, C=1, T=2, G=3) */
+        INTEGER,
+        /** 4 nucleotides compressed in one byte */
+        BINARY
+    };
+
+    /** Default constructor. */
+    Data (Encoding_e encode = BINARY)  : encoding(encode) {}
+
+    /** Default constructor. */
+    Data (char* buffer)  : encoding(ASCII) { setRef(buffer,strlen(buffer)); }
+
+    /** Constructor. */
+    Data (size_t len, Encoding_e encode = BINARY)  : Vector<char>(len), encoding(encode)  {}
+
+    /** Number of bytes required  for representing the data
+     * \returns size in bytes
+     */
+    inline size_t getBufferLength() const { return (size() + 3) / 4; }
+
+    /** Affectation operator.
+     * \param[in] d : object to be copied.
+     * \return the instance
+     */
+    Data& operator= (const Data& d)
+    {
+        if (this != &d)
+        {
+            /** Special case for binary encoding => we have 4 nucleotides in one byte. */
+            if (d.getEncoding() == BINARY)
+            {
+                this->set (d.getBuffer(), d.getBufferLength());
+                this->setSize(d.size());
+                this->encoding = BINARY;
+            }
+            else
+            {
+                this->set (d.getBuffer(), d.size());
+                this->encoding = d.getEncoding();
+            }
+        }
+        return *this;
+    }
+
+    /** Set the content of this data as a referenced of another Data object.
+     * \param[in] ref : referred data
+     * \param[in] offset : position to be used in the referred data
+     * \param[in] length : length of the data
+     */
+    void setRef (Data* ref, size_t offset, size_t length)
+    {
+        /** We call the parent method. */
+        Vector<char>::setRef (ref, offset, length);
+
+        /** We set the encoding. */
+        encoding = ref->getEncoding();
+    }
+
+    /** \copydoc Vector<char>::setRef(char*,size_t) */
+    void setRef (char* buffer, size_t length)
+    {
+        /** We call the parent method. */
+        Vector<char>::setRef (buffer, length);
+    }
+
+    /** Get the encoding scheme of the data.
+     * \return format of the data. */
+    Encoding_e getEncoding ()  const  { return encoding; }
+
+    /** Set the encoding scheme of the data.
+     * \param[in] encoding : encoding scheme to be used.
+     */
+    void setEncoding (Encoding_e encoding)  { this->encoding = encoding; }
+
+    /** Conversion from one encoding scheme to another.
+     *  TO BE IMPROVED (support only one kind of conversion, from binary to integer)
+     * \param[in] in  : input data
+     * \param[in] out : output data */
+    static void convert (Data& in, Data& out)
+    {
+        size_t nchar = in.getBufferLength();
+        size_t j=0;
+        for (size_t i=0; i<nchar; i++)
+        {
+            char fournt = in[i];
+            out[j+3] = fournt & 3; fournt = fournt >> 2;
+            out[j+2] = fournt & 3; fournt = fournt >> 2;
+            out[j+1] = fournt & 3; fournt = fournt >> 2;
+            out[j+0] = fournt & 3;
+            j+=4;
+        }
+
+        out.encoding = Data::INTEGER;
+        out.setSize (in.size());
+    }
+
+    /** Shortcut.
+     *  - first  : the nucleotide value (A=0, C=1, T=2, G=3)
+     *  - second : 0 if valid, 1 if invalid (in case of N character for instance) */
+    typedef std::pair<char,char> ConvertChar;
+
+    /** Note for the ASCII conversion: the 4th bit is used to tell whether it is invalid or not.
+     * => it finds out that 'N' character has this 4th bit equals to 1, which is not the case
+     * for 'A', 'C', 'G' and 'T'. */
+    struct ConvertASCII    { static ConvertChar get (const char* buffer, size_t idx)  { return ConvertChar((buffer[idx]>>1) & 3, (buffer[idx]>>3) & 1); }};
+    struct ConvertInteger  { static ConvertChar get (const char* buffer, size_t idx)  { return ConvertChar(buffer[idx],0); }         };
+    struct ConvertBinary   { static ConvertChar get (const char* buffer, size_t idx)  { return ConvertChar(((buffer[idx>>2] >> ((3-(idx&3))*2)) & 3),0); } };
+
+private:
+
+    /** Encoding scheme of the data instance. */
+    Encoding_e  encoding;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_DATA_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Enums.hpp b/gatb-core/src/gatb/tools/misc/api/Enums.hpp
new file mode 100644
index 0000000..9649a8b
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Enums.hpp
@@ -0,0 +1,340 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Enums.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Enumerations
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_ENUMS_HPP_
+#define _GATB_CORE_TOOLS_MISC_ENUMS_HPP_
+
+#include <gatb/system/api/Exception.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** Enumeration for the different kinds of bank conversions supported in GATB. */
+enum BankConvertKind  {  BANK_CONVERT_NONE, BANK_CONVERT_TMP, BANK_CONVERT_KEEP };
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, BankConvertKind& kind)
+{
+         if (s == "none")   { kind = BANK_CONVERT_NONE;  }
+    else if (s == "tmp")    { kind = BANK_CONVERT_TMP;  }
+    else if (s == "keep")   { kind = BANK_CONVERT_KEEP;  }
+    else   { throw system::Exception ("bad bank convert kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static const char* toString (BankConvertKind kind)
+{
+    switch (kind)
+    {
+        case BANK_CONVERT_NONE:     return "none";
+        case BANK_CONVERT_TMP:      return "tmp";
+        case BANK_CONVERT_KEEP:     return "keep";
+        default:        throw system::Exception ("bad bank convert kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration for the different kinds of Bloom filters supported in GATB. */
+enum BloomKind
+{
+    /** No Bloom filter */
+    BLOOM_NONE,
+    /** Trivial implementation of Bloom filters */
+    BLOOM_BASIC,
+    /** Implementation of Bloom filters improving CPU cache management. */
+    BLOOM_CACHE,
+    /** Implementation of Bloom filters improving CPU cache management. */
+    BLOOM_NEIGHBOR,
+    BLOOM_DEFAULT
+};
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, BloomKind& kind)
+{
+         if (s == "none")        { kind = BLOOM_NONE;  }
+    else if (s == "basic")       { kind = BLOOM_BASIC;  }
+    else if (s == "cache")       { kind = BLOOM_CACHE; }
+	else if (s == "neighbor")    { kind = BLOOM_NEIGHBOR; }
+    else if (s == "default")     { kind = BLOOM_CACHE; }
+    else   { throw system::Exception ("bad Bloom kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static const char* toString (BloomKind kind)
+{
+    switch (kind)
+    {
+        case BLOOM_NONE:      return "none";
+        case BLOOM_BASIC:     return "basic";
+        case BLOOM_CACHE:     return "cache";
+		case BLOOM_NEIGHBOR:  return "neighbor";
+        case BLOOM_DEFAULT:   return "cache";
+        default:        throw system::Exception ("bad Bloom kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration for the different kinds of cFP storage mechanisms supported in GATB. */
+enum DebloomKind
+{
+    /** No cFP */
+    DEBLOOM_NONE,
+    /** Save cFP in the original way (a sorted vector) */
+    DEBLOOM_ORIGINAL,
+    /** Save cFP with cascading Bloom filters. */
+    DEBLOOM_CASCADING,
+    DEBLOOM_DEFAULT
+};
+
+/** Get the debloom kind from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : the debloom kind to be set from the string parsing. */
+static void parse (const std::string& s, DebloomKind& kind)
+{
+         if (s == "none")       { kind = DEBLOOM_NONE;      }
+    else if (s == "original")   { kind = DEBLOOM_ORIGINAL;  }
+    else if (s == "cascading")  { kind = DEBLOOM_CASCADING; }
+    else if (s == "default")    { kind = DEBLOOM_CASCADING; }
+    else   { throw system::Exception ("bad debloom kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static std::string toString (DebloomKind kind)
+{
+    switch (kind)
+    {
+        case DEBLOOM_NONE:      return "none";
+        case DEBLOOM_ORIGINAL:  return "original";
+        case DEBLOOM_CASCADING: return "cascading";
+        case DEBLOOM_DEFAULT:   return "cascading";
+        default:        throw system::Exception ("bad debloom kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration for the different kinds of debloom algorithms supported in GATB. */
+enum DebloomImpl
+{
+    /** Initial debloom algorithm */
+    DEBLOOM_IMPL_BASIC,
+    /** Debloom algorithm based on minimizers. */
+    DEBLOOM_IMPL_MINIMIZER,
+    DEBLOOM_IMPL_DEFAULT
+};
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, DebloomImpl& kind)
+{
+         if (s == "basic")       { kind = DEBLOOM_IMPL_BASIC;      }
+    else if (s == "minimizer")   { kind = DEBLOOM_IMPL_MINIMIZER;  }
+    else if (s == "default")     { kind = DEBLOOM_IMPL_MINIMIZER; }
+    else   { throw system::Exception ("bad debloom impl '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static std::string toString (DebloomImpl kind)
+{
+    switch (kind)
+    {
+        case DEBLOOM_IMPL_BASIC:      return "basic";
+        case DEBLOOM_IMPL_MINIMIZER:  return "minimizer";
+        case DEBLOOM_IMPL_DEFAULT:    return "minimizer";
+        default:        throw system::Exception ("bad debloom impl %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration for the different kinds of branching storages supported in GATB. */
+enum BranchingKind
+{
+    /** Don't save branching nodes. */
+    BRANCHING_NONE,
+    /** Save branching nodes within the graph file. */
+    BRANCHING_STORED
+};
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, BranchingKind& kind)
+{
+         if (s == "none")     { kind = BRANCHING_NONE;  }
+    else if (s == "stored")   { kind = BRANCHING_STORED;  }
+    else   { throw system::Exception ("bad branching kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static std::string toString (BranchingKind kind)
+{
+    switch (kind)
+    {
+        case BRANCHING_NONE:     return "none";
+        case BRANCHING_STORED:   return "stored";
+        default:        throw system::Exception ("bad branching kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration for the different kinds of kmer solidity criteria supported in GATB. */
+enum KmerSolidityKind
+{
+    /** min criteria */
+    KMER_SOLIDITY_MIN,
+    /** max criteria */
+    KMER_SOLIDITY_MAX,
+    /** on criteria */
+    KMER_SOLIDITY_ONE,
+	/** custom criteria */
+	KMER_SOLIDITY_CUSTOM,
+    /** all criteria */
+    KMER_SOLIDITY_ALL,
+    /** sum criteria */
+    KMER_SOLIDITY_SUM,
+    KMER_SOLIDITY_DEFAULT
+};
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, KmerSolidityKind& kind)
+{
+         if (s == "min")    { kind = KMER_SOLIDITY_MIN;  }
+    else if (s == "max")    { kind = KMER_SOLIDITY_MAX;  }
+    else if (s == "one")    { kind = KMER_SOLIDITY_ONE;  }
+    else if (s == "all")    { kind = KMER_SOLIDITY_ALL;  }
+    else if (s == "sum")    { kind = KMER_SOLIDITY_SUM;  }
+	else if ( s.find("custom") != std::string::npos ) { kind = KMER_SOLIDITY_CUSTOM; }
+    else   { throw system::Exception ("bad kmer solidity kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static std::string toString (KmerSolidityKind kind)
+{
+    switch (kind)
+    {
+        case KMER_SOLIDITY_MIN:     return "min";
+        case KMER_SOLIDITY_MAX:     return "max";
+        case KMER_SOLIDITY_ONE:     return "one";
+		case	KMER_SOLIDITY_CUSTOM: return "custom";
+        case KMER_SOLIDITY_ALL:     return "all";
+        case KMER_SOLIDITY_SUM:     return "sum";
+        case KMER_SOLIDITY_DEFAULT: return "sum";
+        default:    throw system::Exception ("bad kmer solidity kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Enumeration of different kinds of graph traversal. */
+enum TraversalKind
+{
+    /** Undefined */
+    TRAVERSAL_NONE=0,
+    /** Path are unitigs */
+    TRAVERSAL_UNITIG=1,
+    /** Path are contigs */
+    TRAVERSAL_CONTIG=2
+};
+
+/** Get the enum from a string.
+ * \param[in] s : string to be parsed
+ * \param[out] kind : enum to be set from the string parsing. */
+static void parse (const std::string& s, TraversalKind& kind)
+{
+         if (s == "none")      { kind = TRAVERSAL_NONE;  }
+    else if (s == "unitig")    { kind = TRAVERSAL_UNITIG;  }
+    else if (s == "contig")    { kind = TRAVERSAL_CONTIG;  }
+    else   { throw system::Exception ("bad traversal kind '%s'", s.c_str()); }
+}
+
+/** Get the string associated to an enum
+ * \param[in] kind : the enum value
+ * \return the associated string */
+static std::string toString (TraversalKind kind)
+{
+    switch (kind)
+    {
+        case TRAVERSAL_NONE:    return "none";
+        case TRAVERSAL_UNITIG:  return "unitig";
+        case TRAVERSAL_CONTIG:  return "contig";
+        default:    throw system::Exception ("bad traversal kind %d", kind);
+    }
+}
+
+/********************************************************************************/
+
+/** Provide different modes for graph traversal stop criteria. */
+enum ExtendStopMode_e
+{
+    /** Stop traversal after the first unitig/contig. */
+    ExtendStopMode_after_first_contig,
+    /** Stop traversal when the maximum depth is reached. */
+    ExtendStopMode_until_max_depth
+};
+
+/********************************************************************************/
+
+/** Provide different modes of graph traversal for building extensions. */
+enum SearchMode_e
+{
+    /** Breadth first traversal. */
+    SearchMode_Breadth,
+    /** Depth first traversal. */
+    SearchMode_Depth
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_ENUMS_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/IHistogram.hpp b/gatb-core/src/gatb/tools/misc/api/IHistogram.hpp
new file mode 100644
index 0000000..60b4718
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/IHistogram.hpp
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IHistogram.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface for histogram (something counting abundances).
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IHISTOGRAM_HPP_
+#define _GATB_CORE_TOOLS_MISC_IHISTOGRAM_HPP_
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** \brief Interface for kmers distribution management
+ *
+ * This interface allows to have an idea of the function y(x), where x is the occurrence number of a kmer
+ * and y is the number of kmers occurring x times.
+ *
+ * It is often interesting to have a graphical display of this kind of distribution; for instance, it may
+ * give an estimation of the coverage of NGS data.
+ *
+ * We can also find x0 at the first minimum of y(x) : for x<x0, we are likely to have sequencing errors.
+ * The first maximum at x1 (x1>x0) is also interesting because it provides an estimation of the reads
+ * coverage.
+ *
+ * This interface is mainly used by the SortingCountAlgorithm.
+ *
+ * Here is a command line for showing the histogram with gnuplot from the hdf5 file 'graph.h5'
+ *  * h5dump -y -d dsk/histogram graph.h5 | grep [0-9] | grep -v [A-Z].* | paste - - | gnuplot -p -e 'plot [][0:100] "-" with lines'
+ *
+ *  For the sum of the distribution, you can use:
+ *  * h5dump -y -d dsk/histogram graph.h5 | grep [0-9] | grep -v [A-Z].* | paste - - | gawk 'BEGIN{s=0; i=0} { s=s+$2; i=i+1; print i,"  ", s}' | gnuplot -p -e 'plot [0:10][0:] "-" with lines'
+*/
+class IHistogram : virtual public system::ISmartPointer
+{
+public:
+
+    /********************************************************************************/
+    struct Entry
+    {
+        u_int16_t index;
+        u_int64_t abundance;
+
+        inline static hid_t hdf5 (bool& compound)
+        {
+            hid_t result = H5Tcreate (H5T_COMPOUND, sizeof(Entry));
+            H5Tinsert (result, "index",      HOFFSET(Entry, index),     H5T_NATIVE_UINT16);
+            H5Tinsert (result, "abundance",  HOFFSET(Entry, abundance), H5T_NATIVE_UINT64);
+            compound = true;
+            return result;
+        }
+        
+        /** Comparison operator
+         * \param[in] other : object to be compared to
+         * \return true if the provided kmer value is greater than the current one. */
+        bool operator< (const Entry& other) const {  return this->index < other.index; }
+        
+        /** Equal operator
+         * \param[in] other : object to be compared to
+         * \return true if the provided kmer value is greater than the current one. */
+        bool operator== (const Entry& other) const {  return (this->index == other.index && this->abundance == other.abundance); }
+    };
+
+    /** Destructor. */
+    virtual ~IHistogram() {}
+
+    /** Return the maximum allowed for X.
+     * \return the max X value. */
+    virtual size_t getLength() = 0;
+
+    /** Increase the number of kmers occurring X time
+     * \param[in] index : the X value. */
+    virtual void inc (u_int16_t index) = 0;
+
+    /** Save the distribution. It is saved into the bag provided at construction. */
+    virtual void save (tools::storage::impl::Group& group) = 0;
+
+	/** Compute first minimum at x0 and firt maximum at x1 (x1>x0). */
+    virtual void compute_threshold (int min_auto_threshold) = 0;  //min_auto_threshold = prevents the auto_cutoff from being below this value. Default =3)
+	
+    /** Get the solid cutoff, ie the x0 at first minimum.
+     * \return x0 */
+	virtual u_int16_t get_solid_cutoff () = 0;
+
+    /** Get the number of kmers for x>x0, aka solid kmers for x0 threshold
+     * \return number of kmers. */
+	virtual u_int64_t get_nbsolids_auto () = 0;
+
+	
+	/** Get the ratio of weak kmers in total volume
+	 * \return ratio */
+	virtual float get_ratio_weak () = 0;
+	
+	/** Get the x1 value at the first maximum after x0. */
+    virtual u_int16_t get_first_peak () = 0;
+
+    /** Retrieve the value for x.
+     * \param[in] idx : x value.
+     * \return y(x). */
+    virtual u_int64_t& get (u_int16_t idx) = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IHISTOGRAM_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/IOptionsParser.hpp b/gatb-core/src/gatb/tools/misc/api/IOptionsParser.hpp
new file mode 100644
index 0000000..39b5484
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/IOptionsParser.hpp
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IOptionsParser.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool for parsing command line arguments
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IOPTION_PARSER_HPP_
+#define _GATB_CORE_TOOLS_MISC_IOPTION_PARSER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/system/api/Exception.hpp>
+
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** Forward declarations for the Visitor definition. */
+namespace impl      {
+    class OptionsParser;
+    class Option;
+}
+
+/** Visitor design pattern for IOptionsParser. */
+class IOptionsParserVisitor
+{
+public:
+    /** Destructor. */
+    virtual ~IOptionsParserVisitor() {}
+
+    /** Visit a instance of OptionsParser
+     * \param[in] object : the object to be visited
+     * \param[in] depth : level of the visit */
+    virtual void visitOptionsParser (impl::OptionsParser& object, size_t depth) = 0;
+
+    /** Visit a instance of Option
+     * \param[in] object : the object to be visited
+     * \param[in] depth : level of the visit */
+    virtual void visitOption (impl::Option& object, size_t depth) = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Parser interface that analyzes command line options.
+ *
+ * Client can use this class for registering command line options specifications
+ * and then can use it for parsing some command line options, typically given
+ * as arguments of the 'main' function.
+ *
+ * This interface is intended to be implemented as a Composite design pattern,
+ * so we will have a 'leaf' implementation (see Option) and a 'composite'
+ * implementation (see OptionsParser)
+ */
+class IOptionsParser : public system::SmartPointer
+{
+public:
+
+    /*************************************************************/
+    /*******************    General  methods   *******************/
+    /*************************************************************/
+
+    /** Get name. */
+    virtual const std::string& getName () const = 0;
+
+    /** Associate a name to the parser.
+     * \param[in] name : the name of the parser. */
+    virtual void setName (const std::string& name) = 0;
+
+    /** Set visibility status. */
+    virtual void setVisible (bool status) = 0;
+
+    /** Get visibility status. */
+    virtual bool isVisible() const = 0;
+
+    /** Get help. */
+    virtual const std::string& getHelp () const = 0;
+
+    /** Set help
+     * \param[in] help : the help string */
+    virtual void setHelp (const std::string& help) = 0;
+
+    /*************************************************************/
+    /*******************    Parsing  methods   *******************/
+    /*************************************************************/
+
+    /** Perform the analyze of the arguments.
+     * \param[in] argc : number of command line arguments.
+     * \param[in] argv : table of arguments
+     * \return object with information about the parsing.
+     */
+    virtual misc::IProperties* parse (int argc, char** argv) = 0;
+
+    /** Perform the analyze of the arguments.
+     * \param[in] s : string containing the options to be parsed
+     * \return object with information about the parsing.
+     */
+    virtual misc::IProperties* parseString (const std::string& s) = 0;
+
+    /** Return the properties found during parsing.
+     * \return the parsed properties. */
+    virtual misc::IProperties* getProperties ()  = 0;
+
+    /** Tells whether an option has been seen during parsing.
+     * \param[in] name : name of the option to be checked
+     * \return true if option was found during parsing, false otherwise. */
+    virtual bool saw (const std::string& name) const = 0;
+
+    /*************************************************************/
+    /*******************   Composite methods   *******************/
+    /*************************************************************/
+
+    /** Add a parser child at the back of known parsers.
+     * \param[in] parser : the child parser
+     * \param[in] expandDepth : while depth is less than expandDepth, put all the children and not the 'parser' itself.
+     * \param[in] visibility : visibility status.
+     */
+    virtual void push_back (IOptionsParser* parser, size_t expandDepth=0, bool visibility=true) = 0;
+
+    /** Add a parser child at the front of known parsers.
+     * \param[in] parser : the child parser
+     * \param[in] expandDepth : while depth is less than expandDepth, put all the children and not the 'parser' itself.
+     * \param[in] visibility : visibility status.
+     */
+    virtual void push_front (IOptionsParser* parser, size_t expandDepth=0, bool visibility=true) = 0;
+
+    /** Get a parser given its name.
+     * \param[in] name : name of the parser to be retrieved
+     * \return the parser instance if found, 0 otherwise. */
+    virtual IOptionsParser* getParser (const std::string& name) = 0;
+
+    /** Get the children parsers.
+     * \return a list of parsers.*/
+    virtual std::list<IOptionsParser*>& getParsers () = 0;
+
+    /*************************************************************/
+    /*********************   Miscellaneous   *********************/
+    /*************************************************************/
+
+    /** Return the default properties
+     * \return the default properties. */
+    virtual misc::IProperties* getDefaultProperties ()  = 0;
+
+    /** Visitor design pattern. */
+    virtual void accept (IOptionsParserVisitor& visitor, size_t depth=0) = 0;
+
+    /** Structure that provides parsing results. */
+    struct Result
+    {
+        /** Provides the properties found during parsing. */
+        misc::impl::Properties properties;
+
+        /** Provides the errors found during parsing. */
+        std::list<std::string> errors;
+    };
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IOPTION_PARSER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/IProperty.hpp b/gatb-core/src/gatb/tools/misc/api/IProperty.hpp
new file mode 100644
index 0000000..28054fb
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/IProperty.hpp
@@ -0,0 +1,300 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file IProperty.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Interface for properties, ie. list of tag values with hierarchical feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IPROPERTY_HPP_
+#define _GATB_CORE_TOOLS_MISC_IPROPERTY_HPP_
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <list>
+#include <set>
+#include <iostream>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** \brief  Definition of a property as a [key,value] entry with a given depth.
+ *
+ * Define what a property can be. This is an extension of the [key,value] concept
+ * since we add a notion a depth to this couple, which makes possible to have a tree
+ * vision of a simple list of [depth,key,value] entries.
+ *
+ * Such instances are managed by the IProperties class, that acts as a container of IProperty
+ * instances.
+ *
+ *  \see IProperties
+ */
+class IProperty : public system::SmartPointer
+{
+public:
+    /** Constructor.
+     * \param[in] aDepth : depth of the [key,value]
+     * \param[in] aKey   : the key
+     * \param[in] aValue : the value
+     */
+    IProperty (size_t aDepth, const std::string& aKey, const std::string& aValue)
+        : depth(aDepth), key(aKey), value(aValue)  {}
+
+    /** Constructor.
+     * \param[in] aKey   : the key
+     * \param[in] aValue : the value
+     */
+    IProperty (const std::string& aKey="", const std::string& aValue="")
+        : depth(0), key(aKey), value(aValue)  {}
+
+    /** Depth of the property. 0 should mean root property. */
+    size_t      depth;
+
+    /** Key of the property as a string. */
+    std::string key;
+
+    /** Value of the property as a string. */
+    std::string value;
+
+    /** Returns the value of the property as a C++ string.
+     * \return the value
+     */
+    const std::string&  getValue  ()  { return value;                }
+
+    /** Returns the value of the property as an integer (it supposes that the string represents an integer).
+     * \return the value
+     */
+    long                getInt    ()  { return atol (value.c_str()); }
+
+    /** Returns the value of the property as a float (it supposes that the string represents an float).
+     * \return the value
+     */
+    double              getDouble    ()  { return atof (value.c_str()); }
+
+    /** Returns the value of the property as a C string.
+     * \return the value
+     */
+    const char*         getString ()  { return value.c_str();        }
+};
+
+/** An alias here... In the future, we should replace IProperty by Property. */
+typedef IProperty  Property;
+
+/********************************************************************************/
+
+/** Visitor for a IProperty instance.
+ *
+ *  Define a Design Pattern Visitor for the IProperty instance.
+ *
+ *  In this case, we have only the IProperty class to visit (not a true classes hierarchy like one can
+ *  find more classically for the Visitor DP), but we add two methods, one called before the IProperty
+ *  visit, and one called after.
+ *
+ *  This can be seen as a improved way to iterate the IProperty items of a IProperties instance.
+ *
+ *  It is defined as a SmartPointer for easing instance life cycle management.
+ */
+class IPropertiesVisitor : public system::SmartPointer
+{
+public:
+
+    /** Called before the true visit of the IProperty instance. */
+    virtual void visitBegin    () = 0;
+
+    /** Visit of the IProperty instance.
+     * \param[in] prop : the instance to be visited.
+     */
+    virtual void visitProperty (IProperty* prop) = 0;
+
+    /** Called after the true visit of the IProperty instance. */
+    virtual void visitEnd      () = 0;
+};
+
+/********************************************************************************/
+
+/** \brief Container of IProperty instances with DP Visitor capability.
+ *
+ *  This interface merely defines a container of IProperty instances; it contains
+ *  several 'add' methods for adding IProperty instances into the container.
+ *
+ *  It is possible to retrieve a specific IProperty instance given a key.
+ *
+ *  The main method is 'accept'; its purpose is to visit each contained IProperty instance.
+ *  Note that the only way to iterate the whole IProperty set is to define its own IPropertiesVisitor
+ *  class and make it accepted by the IProperties instance; the 'visitProperty' method should be then
+ *  called for each IProperty instance.
+ *
+ *  It is defined as a SmartPointer for easing instance life cycle management.
+ *
+ *  \see IProperty
+ *  \see IPropertiesVisitor
+ */
+class IProperties : public system::SmartPointer
+{
+public:
+
+    /** Accept a visitor (should loop over all IProperty instances).
+     * \param[in] visitor : visitor to be accepted
+     */
+    virtual void accept (IPropertiesVisitor* visitor) = 0;
+
+    /** Add a IProperty instance given a depth, a key and a value provided in a printf way.
+     * \param[in] depth  : depth of the property to be added
+     * \param[in] aKey   : key of the property to be added
+     * \param[in] format : define the format of the value of the property, the actual value being defined by the ellipsis
+     * \return a IProperty instance is created and returned as result of the method.
+     *
+     */
+    virtual IProperty* add (size_t depth, const std::string& aKey, const char* format=0, ...) = 0;
+
+    /** Add a IProperty instance given a depth, a key and a value.
+     * \param[in] depth  : depth of the property to be added
+     * \param[in] aKey   : key of the property to be added
+     * \param[in] aValue : value (as a string) of the property to be added
+     * \return a IProperty instance is created and returned as result of the method.
+     */
+    virtual IProperty* add (size_t depth, const std::string& aKey, const std::string& aValue) = 0;
+
+    /** Add all the IProperty instances contained in the provided IProperties instance. Note that a depth is provided
+     *  and is added to the depth of each added IProperty instance.
+     * \param[in] depth : depth to be added to each depth of added instances.
+     * \param[in] prop  : instance holding IProperty instances to be added
+     */
+    virtual void       add (size_t depth, IProperties* prop) = 0;
+
+    /** Add all the IProperty instances contained in the provided IProperties instance. Note that a depth is provided
+     *  and is added to the depth of each added IProperty instance.
+     * \param[in] depth : depth to be added to each depth of added instances.
+     * \param[in] prop  : instance holding IProperty instances to be added
+     */
+    virtual void       add (size_t depth, const IProperties& prop) = 0;
+
+    /** */
+    virtual void add (IProperty* prop, va_list args) = 0;
+
+    /** Merge the IProperty instances contained in the provided IProperties instance.
+     * \param[in] prop  : instance holding IProperty instances to be added
+     */
+    virtual void  merge (IProperties* prop) = 0;
+
+    /** Returns the IProperty instance given a key.
+     * \param[in] key : the key
+     * \return the IProperty instance if found, 0 otherwise.
+     */
+    virtual IProperty* operator[] (const std::string& key) = 0;
+
+    /** Returns the IProperty instance given a key.
+     * \param[in] key : the key
+     * \return the IProperty instance if found, 0 otherwise.
+     */
+    virtual IProperty* get (const std::string& key) const = 0;
+
+    /** Get the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \return the value of the key as a string.
+     */
+    virtual std::string getStr    (const std::string& key) const  = 0;
+
+    /** Get the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \return the value of the key as an integer
+     */
+    virtual int64_t     getInt    (const std::string& key) const = 0;
+
+    /** Get the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \return the value of the key as a double.
+     */
+    virtual double      getDouble (const std::string& key) const = 0;
+
+    /** Set the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \param[in] value : value to be set.
+     */
+    virtual void setStr    (const std::string& key, const std::string& value) = 0;
+
+    /** Set the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \param[in] value : value to be set.
+     */
+    virtual void setInt    (const std::string& key, const int64_t& value) = 0;
+
+    /** Set the value of a property given its key.
+     * \param[in] key : the key of the property
+     * \param[in] value : value to be set.
+     */
+    virtual void setDouble (const std::string& key, const double& value) = 0;
+
+    /** Clone the instance
+     * \return the cloned instance.
+     */
+    virtual IProperties* clone () = 0;
+
+    /** Distribute arguments that are comma separated list.
+     * \return the list of distributed IProperties instances.
+     */
+    virtual std::list<IProperties*> map (const char* separator) = 0;
+
+    /** Get the known keys.
+     * \return the set of keys
+     */
+    virtual std::set<std::string> getKeys () = 0;
+
+    /** Move the item (given its key) to the front of the container.
+     * \param[in] key : the key of the item to be moved.
+     */
+    virtual void setToFront (const std::string& key) = 0;
+
+    /** Output the properties object through an output stream
+     * \param[in] s : the output stream
+     * \param[in] p : the properties object to output
+     * \return the modified output stream
+     */
+    friend std::ostream & operator<<(std::ostream & s, const IProperties& p)  {  p.dump(s);  return s;  }
+
+    /** Get the properties as an XML string
+     * \return the XML string.
+     */
+    virtual std::string getXML () = 0;
+
+    /** Fill a Properties instance from an XML stream.
+     * \param[in] stream: the stream to be read (file, string...) */
+    virtual void readXML (std::istream& stream) = 0;
+
+protected:
+
+    /** */
+    virtual void dump (std::ostream& s) const  = 0;
+};
+
+/********************************************************************************/
+
+#define PROP_END  ((IProperty*)0)
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IPROPERTY_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Macros.hpp b/gatb-core/src/gatb/tools/misc/api/Macros.hpp
new file mode 100644
index 0000000..d8bd9ea
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Macros.hpp
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Macros.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Several macros for every day work
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_MACROS_HPP_
+#define _GATB_CORE_TOOLS_MISC_MACROS_HPP_
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+#define ARRAY_SIZE(a)  (sizeof(a)/sizeof(a[0]))
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_MACROS_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Range.hpp b/gatb-core/src/gatb/tools/misc/api/Range.hpp
new file mode 100644
index 0000000..df4a81b
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Range.hpp
@@ -0,0 +1,159 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Range.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Iterable interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_RANGE_HPP_
+#define _GATB_CORE_TOOLS_MISC_RANGE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/collections/api/Iterable.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Tools package */
+namespace tools     {
+/** \brief Misc interfaces */
+namespace misc      {
+/********************************************************************************/
+
+/* \brief Definition of an interval (inspired by std::pair). It is possible to define
+ * 'reversed' range, ie. with a beginning greater than the end.
+ */
+template <class T> class Range : public collections::Iterable<T>, public system::SmartPointer
+{
+public:
+
+    /** Default constructor. */
+    Range() : begin(T()), end(T()) {}
+
+    /** Constructor taking the [begin,end] couple as arguments.
+     * \param[in] x : beginning of the range.
+     * \param[in] y : end of the range.
+     */
+    Range(const T& x, const T& y) : begin(x), end(y) {}
+
+    /** Copy constructor. */
+    template <class U>  Range (const Range<U> &p) : begin(p.begin), end(p.end) { }
+
+    /** \return the begin bound of the range. */
+    T getBegin() const { return begin; }
+
+    /** \return the end bound of the range. */
+    T getEnd  () const { return end; }
+
+    /** Returns the length of the range. */
+    T getLength ()  const  { return (end >= begin ? end - begin + 1 : begin - end + 1); }
+
+    /** Tells whether the provided value is included into the 'this' instance.
+     * \param[in] val : value to be tested
+     * \return true if the provided value is inside the current range, false otherwise.
+     */
+    bool includes (const T& val) const   {   return (this->begin <= val)  &&  (val <= this->end);  }
+
+    /** Equality operator.
+     * \param[in] r : the range to be compared to.
+     * \return true if the ranges are the same (same beginning, same end), false otherwise. */
+    bool operator== (const Range& r) const
+    {
+        return begin==r.begin && end==r.end;
+    }
+
+    /** InEquality operator.
+     * \param[in] r : the range to be compared to.
+     * \return false if the ranges are the same (same beginning, same end), true otherwise. */
+    bool operator!= (const Range& r) const
+    {
+        return begin!=r.begin || end!=r.end;
+    }
+
+    /** */
+    dp::Iterator<T>* iterator ()  { return new Iterator(*this); }
+
+    /** */
+    int64_t getNbItems ()       { return getLength(); }
+
+    /** */
+    int64_t estimateNbItems ()  { return getLength(); }
+
+    /* */
+    class Iterator : public dp::Iterator<T>
+    {
+    public:
+
+        Iterator (const T& x, const T& y) : _begin(x), _end(y), _value(0), _isDone(true) {}
+
+        Iterator (Range& ref) : _begin(ref.getBegin()), _end(ref.getEnd()), _value(0), _isDone(true)  {}
+
+        void first()
+        {
+            _value = _begin;
+            _isDone = _value > _end;
+            if (!_isDone)  { *this->_item = _value; }
+        }
+
+        void next()
+        {
+            _value ++;
+            _isDone = _value > _end;
+            if (!_isDone)  { *this->_item = _value; }
+
+        }
+
+        bool isDone() { return _isDone; }
+
+        T& item ()     { return (*this->_item); }
+
+    private:
+        T      _begin;
+        T      _end;
+        T      _value;
+        bool   _isDone;
+    };
+
+    friend class Iterator;
+
+private:
+    /** The template (integer) type. */
+    typedef T type;
+
+    /** Beginning of the range. */
+    T begin;
+
+    /** End of the range. */
+    T end;
+};
+
+/********************************************************************************/
+
+/** We define a type for a range of kmer counts. */
+typedef tools::misc::Range<CountNumber>  CountRange;
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_TOOLS_MISC_RANGE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/StringsRepository.hpp b/gatb-core/src/gatb/tools/misc/api/StringsRepository.hpp
new file mode 100644
index 0000000..802e35d
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/StringsRepository.hpp
@@ -0,0 +1,195 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file StringsRepository.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Pool of strings providing information to end users
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_STRINGS_REPOSITORY_HPP_
+#define _GATB_CORE_TOOLS_MISC_STRINGS_REPOSITORY_HPP_
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+/** \brief Tools package */
+namespace tools     {
+/** \brief Misc interfaces */
+namespace misc      {
+/********************************************************************************/
+
+/* \brief Pool of strings
+ *
+ * This class provides constant strings used throughout the code. It may be interesting
+ * in order to have a central point for constant strings management:
+ *      - ease translation in different languages
+ *      - entry point for strings obfuscation if needed
+ *
+ * // rayan's remark: I respectfully disagree, this is not useful: we won't translate and we won't obfuscate
+ *
+ * It could also be possible to read the strings from a configuration file.
+ *
+ * The class defines one (static) method per constant string to be used. Note that we
+ * also (see below) define a macro definition that eases the use of such a facility.
+ */
+
+class MessageRepository
+{
+public:
+
+    /** \brief Singleton method.
+     *
+     * This method could return different types for the string repository, for translation
+     * for instance.
+     *
+     * \return the singleton instance.
+     */
+    static MessageRepository& singleton()  { static MessageRepository instance; return instance; }
+
+    const char* BANK_bad_file_number    () { return "bank files number is %d but should be in [1..%d]"; }
+    const char* BANK_bad_file_path      () { return "unable to find file '%s'"; }
+    const char* BANK_unable_open_file   () { return "error opening file: %s"; }
+    const char* BANK_unable_write_file  () { return "unable to write into file"; }
+};
+
+/********************************************************************************/
+
+/* \brief Pool of strings
+ */
+class StringRepository
+{
+public:
+    static StringRepository& singleton()  { static StringRepository instance; return instance; }
+
+    const char* db             ()  { return "-db";             }
+    const char* file           ()  { return "-file";           }
+    const char* graph          ()  { return "-graph";          }
+    const char* kmer_size      ()  { return "-kmer-size";      }
+    const char* minimizer_size ()  { return "-minimizer-size"; }
+    const char* kmer_abundance ()  { return "-abundance"; }
+    const char* kmer_abundance_min ()  { return "-abundance-min"; }
+    const char* kmer_abundance_min_threshold ()  { return "-abundance-min-threshold"; }
+    const char* kmer_abundance_max ()  { return "-abundance-max"; }
+    const char* max_memory     ()  { return "-max-memory";     }
+    const char* max_disk       ()  { return "-max-disk";       }
+    const char* kmer_solid     ()  { return "-kmer-solid";     }
+    const char* kmer_cFP       ()  { return "-kmer-cFP";       }
+    const char* prefix         ()  { return "-prefix";         }
+    const char* progress_bar   ()  { return "-bargraph";       }
+    const char* nb_cores       ()  { return "-nb-cores";       }
+    const char* partition_type ()  { return "-partition-type"; }
+    const char* histogram_max  ()  { return "-histo-max";      }
+    const char* uri_debloom    ()  { return "-debloom";        }
+    const char* uri_input      ()  { return "-in";             }
+    const char* uri_output     ()  { return "-out";            }
+    const char* uri_output_dir ()  { return "-out-dir";        }
+    const char* uri_output_tmp ()  { return "-out-tmp";        }
+    const char* verbose        ()  { return "-verbose";        }
+    const char* help           ()  { return "-help";           }
+    const char* version        ()  { return "-version";        }
+    const char* bloom_type     ()  { return "-bloom";          }
+    const char* debloom_type   ()  { return "-debloom";        }
+    const char* debloom_impl   ()  { return "-debloom-impl";   }
+    const char* branching_type ()  { return "-branching-nodes";}
+    const char* topology_stats ()  { return "-topology-stats";}
+    const char* uri_solid_kmers()  { return "-solid-kmers-out";    }
+    const char* bank_convert_type ()  { return "-bank-convert";   }
+    const char* integer_precision ()  { return "-integer-precision";}
+    const char* solidity_kind  ()  { return "-solidity-kind"; }
+	const char* solidity_custom  ()  { return "-solidity-custom"; }
+    const char* minimizer_type ()  { return "-minimizer-type"; }
+    const char* repartition_type() { return "-repartition-type"; }
+    const char* compress_level()   { return "-out-compress"; }
+    const char* config_only()      { return "-config-only"; }
+    const char* storage_type()     { return "-storage-type"; }
+
+    const char* attr_uri_input      ()  { return "input";           }
+    const char* attr_kmer_size      ()  { return "kmer_size";       }
+    const char* attr_kmer_abundance ()  { return "abundance";       }
+    const char* attr_bloom_type     ()  { return "bloom_kind";      }
+    const char* attr_debloom_type   ()  { return "debloom_kind";    }
+};
+
+/********************************************************************************/
+
+/** Shortcuts. */
+#define STR_URI_DB              gatb::core::tools::misc::StringRepository::singleton().db ()
+#define STR_URI_FILE            gatb::core::tools::misc::StringRepository::singleton().file ()
+#define STR_URI_GRAPH           gatb::core::tools::misc::StringRepository::singleton().graph ()
+#define STR_KMER_SIZE           gatb::core::tools::misc::StringRepository::singleton().kmer_size ()
+#define STR_MINIMIZER_SIZE      gatb::core::tools::misc::StringRepository::singleton().minimizer_size ()
+#define STR_INTEGER_PRECISION   gatb::core::tools::misc::StringRepository::singleton().integer_precision ()
+#define STR_KMER_ABUNDANCE      gatb::core::tools::misc::StringRepository::singleton().kmer_abundance ()
+#define STR_KMER_ABUNDANCE_MIN  gatb::core::tools::misc::StringRepository::singleton().kmer_abundance_min ()
+#define STR_KMER_ABUNDANCE_MIN_THRESHOLD  gatb::core::tools::misc::StringRepository::singleton().kmer_abundance_min_threshold ()
+#define STR_KMER_ABUNDANCE_MAX  gatb::core::tools::misc::StringRepository::singleton().kmer_abundance_max ()
+#define STR_MAX_MEMORY          gatb::core::tools::misc::StringRepository::singleton().max_memory ()
+#define STR_MAX_DISK            gatb::core::tools::misc::StringRepository::singleton().max_disk ()
+#define STR_KMER_SOLID          gatb::core::tools::misc::StringRepository::singleton().kmer_solid ()
+#define STR_KMER_CFP            gatb::core::tools::misc::StringRepository::singleton().kmer_cFP ()
+#define STR_PREFIX              gatb::core::tools::misc::StringRepository::singleton().prefix ()
+#define STR_PROGRESS_BAR        gatb::core::tools::misc::StringRepository::singleton().progress_bar ()
+#define STR_NB_CORES            gatb::core::tools::misc::StringRepository::singleton().nb_cores ()
+#define STR_PARTITION_TYPE      gatb::core::tools::misc::StringRepository::singleton().partition_type ()
+#define STR_HISTOGRAM_MAX       gatb::core::tools::misc::StringRepository::singleton().histogram_max ()
+#define STR_URI_DEBLOOM         gatb::core::tools::misc::StringRepository::singleton().uri_debloom ()
+#define STR_URI_INPUT           gatb::core::tools::misc::StringRepository::singleton().uri_input ()
+#define STR_URI_OUTPUT          gatb::core::tools::misc::StringRepository::singleton().uri_output ()
+#define STR_URI_OUTPUT_DIR      gatb::core::tools::misc::StringRepository::singleton().uri_output_dir ()
+#define STR_URI_OUTPUT_TMP      gatb::core::tools::misc::StringRepository::singleton().uri_output_tmp ()
+#define STR_VERBOSE             gatb::core::tools::misc::StringRepository::singleton().verbose ()
+#define STR_HELP                gatb::core::tools::misc::StringRepository::singleton().help ()
+#define STR_VERSION             gatb::core::tools::misc::StringRepository::singleton().version ()
+#define STR_BLOOM_TYPE          gatb::core::tools::misc::StringRepository::singleton().bloom_type()
+#define STR_DEBLOOM_TYPE        gatb::core::tools::misc::StringRepository::singleton().debloom_type()
+#define STR_DEBLOOM_IMPL        gatb::core::tools::misc::StringRepository::singleton().debloom_impl()
+#define STR_BRANCHING_TYPE      gatb::core::tools::misc::StringRepository::singleton().branching_type()
+#define STR_TOPOLOGY_STATS      gatb::core::tools::misc::StringRepository::singleton().topology_stats()
+#define STR_URI_SOLID_KMERS     gatb::core::tools::misc::StringRepository::singleton().uri_solid_kmers()
+#define STR_BANK_CONVERT_TYPE   gatb::core::tools::misc::StringRepository::singleton().bank_convert_type()
+#define STR_SOLIDITY_KIND       gatb::core::tools::misc::StringRepository::singleton().solidity_kind()
+#define STR_SOLIDITY_CUSTOM       gatb::core::tools::misc::StringRepository::singleton().solidity_custom()
+#define STR_MINIMIZER_TYPE      gatb::core::tools::misc::StringRepository::singleton().minimizer_type()
+#define STR_REPARTITION_TYPE    gatb::core::tools::misc::StringRepository::singleton().repartition_type()
+#define STR_COMPRESS_LEVEL      gatb::core::tools::misc::StringRepository::singleton().compress_level()
+#define STR_CONFIG_ONLY         gatb::core::tools::misc::StringRepository::singleton().config_only()
+#define STR_STORAGE_TYPE        gatb::core::tools::misc::StringRepository::singleton().storage_type ()
+
+/********************************************************************************/
+
+#define ATTR_URI_INPUT          gatb::core::tools::misc::StringRepository::singleton().attr_uri_input()
+#define ATTR_KMER_SIZE          gatb::core::tools::misc::StringRepository::singleton().attr_kmer_size()
+#define ATTR_KMER_ABUNDANCE     gatb::core::tools::misc::StringRepository::singleton().attr_kmer_abundance()
+#define ATTR_BLOOM_TYPE         gatb::core::tools::misc::StringRepository::singleton().attr_bloom_type()
+#define ATTR_DEBLOOM_TYPE       gatb::core::tools::misc::StringRepository::singleton().attr_debloom_type()
+
+/********************************************************************************/
+
+/** Shortcuts. */
+#define STR_BANK_bad_file_number    gatb::core::tools::misc::MessageRepository::singleton().BANK_bad_file_number ()
+#define STR_BANK_bad_file_path      gatb::core::tools::misc::MessageRepository::singleton().BANK_bad_file_path ()
+#define STR_BANK_unable_open_file   gatb::core::tools::misc::MessageRepository::singleton().BANK_unable_open_file ()
+#define STR_BANK_unable_write_file  gatb::core::tools::misc::MessageRepository::singleton().BANK_unable_write_file ()
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_STRINGS_REPOSITORY_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/api/Vector.hpp b/gatb-core/src/gatb/tools/misc/api/Vector.hpp
new file mode 100644
index 0000000..0abf715
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/api/Vector.hpp
@@ -0,0 +1,150 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Vector.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Vector implementation
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_VECTOR_HPP_
+#define _GATB_CORE_TOOLS_MISC_VECTOR_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/impl/System.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+/********************************************************************************/
+
+/** \brief Vector class allowing to define vectors as sub parts of referred vectors.
+ *
+ * This vector implementation supports two kind of memory management:
+ *      - dynamic allocation: the data buffer is allocated
+ *      - reference : the data buffer is a reference to some existing buffer in memory
+ */
+template<typename T> class Vector : public system::SmartPointer
+{
+public:
+
+    /** Default constructor. */
+    Vector () : _buffer(0), _size(0), _isAllocated(false), _ref(0)  {}
+
+    /** Constructor with initial size.
+     * \param aSize : initial size of the vector. */
+    Vector (size_t aSize) :  _buffer(0), _size(0), _isAllocated(false), _ref(0)   {  resize (aSize);  }
+
+    /** assign operator */
+    Vector& operator=(const Vector& vect)
+    {
+        if (&vect != this)
+        {
+            this->set(vect._buffer,vect._size);
+        }
+        return *this;
+    }
+    
+    /** Destructor. */
+    ~Vector ()
+    {
+        if (_isAllocated && _buffer) {  FREE (_buffer); }
+
+        /** We get rid of the referred data if any. */
+        setRef (0);
+    }
+
+    /** \return buffer holding the actual data. */
+    char* getBuffer () const  { return _buffer; }
+
+    /** \return buffer size (in bytes). */
+    size_t size ()  const  { return _size; }
+
+    /** Data access
+     * \param[in] idx : index of the character to be retrieved
+     * \return the retrieved character. */
+    T& operator[]  (size_t idx)  { return _buffer[idx]; }
+
+    /** Resize the current vector.
+     * \param[in] aSize : new size of the vector. */
+    void resize (size_t aSize)
+    {
+        _size        = aSize;
+        _buffer      = (char*) REALLOC (_buffer, _size*sizeof(char));
+        _isAllocated = true;
+    }
+
+    /** Set the size of the vector.
+     * \param[in] size : new size of the vector. */
+    void setSize (size_t size)  {  _size = size;  }
+
+    /** Set the current data as a part of a referenced another data.
+     * \param[in] ref : data referred by the current instance.
+     * \param[in] offset : the current data will begin 'offset' bytes from the beginning of the referred data.
+     * \param[in] length : size of the data */
+    void setRef (Vector* ref, size_t offset, size_t length)
+    {
+        setRef (ref);
+        _buffer      = _ref->_buffer + offset;
+        _size        = length;
+        _isAllocated = false;
+    }
+
+    /** Set the current data as a part of a referenced another data.
+     * \param[in] buffer : pointer to the buffer to be referred
+     * \param[in] length : size of the data */
+    void setRef (T* buffer, size_t length)
+    {
+        _buffer      = buffer;
+        _size        = length;
+        _isAllocated = false;
+    }
+
+    /** Set the current data. Copy is done.
+     * \param[in] buffer : data referred by the current instance.
+     * \param[in] length : size of the data */
+    void set (T* buffer, size_t length)
+    {
+        _size        = length;
+        if (_isAllocated == false)  { _buffer = 0; }
+        _buffer      = (char*) REALLOC (_buffer, _size*sizeof(char));
+        _isAllocated = true;
+        memcpy (_buffer, buffer, _size*sizeof(char));
+    }
+    
+
+private:
+
+    char*  _buffer;
+    int    _size;
+    bool   _isAllocated;
+
+    Vector* _ref;
+    void setRef (Vector* ref)  {  SP_SETATTR(ref);  }
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_VECTOR_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Algorithm.cpp b/gatb-core/src/gatb/tools/misc/impl/Algorithm.cpp
new file mode 100644
index 0000000..39776d6
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Algorithm.cpp
@@ -0,0 +1,126 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Algorithm.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#define DEBUG(a)  printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Algorithm::Algorithm (const std::string& name, int nbCores, gatb::core::tools::misc::IProperties* input)
+    : _name(name), _input(0), _output(0), _info(0), _systemInfo(0), _dispatcher(0)
+{
+    setInput      (input ? input : new Properties());
+    setOutput     (new Properties());
+    setInfo       (new Properties());
+    setSystemInfo (new Properties());
+
+    if (nbCores < 0)  {  nbCores = _input->get(STR_NB_CORES)  ? _input->getInt(STR_NB_CORES) : 0;  }
+    setDispatcher (new Dispatcher (nbCores) );
+
+    _info->add (0, _name);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Algorithm::~Algorithm ()
+{
+    setInput      (0);
+    setOutput     (0);
+    setInfo       (0);
+    setSystemInfo (0);
+    setDispatcher (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Algorithm::run ()
+{
+    ISystemInfo::CpuInfo* cpuinfo = System::info().createCpuInfo();
+    LOCAL (cpuinfo);
+
+    cpuinfo->start();
+
+    /** We execute the algorithm. */
+    this->execute ();
+
+    cpuinfo->stop();
+
+    /** We gather some system information. */
+    getSystemInfo()->add (1, "system");
+    getSystemInfo()->add (2, "cpu",         "%.1f", cpuinfo->getUsage());
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+dp::IteratorListener* Algorithm::createIteratorListener (size_t nbIterations, const char* message)
+{
+    if (getInput()->get(STR_VERBOSE)==0)  { return new IteratorListener(); }
+
+    switch (getInput()->getInt(STR_VERBOSE))
+    {
+        case 0: default:    return new IteratorListener ();
+        case 1:             return new ProgressTimerAndSystem   (nbIterations, message);
+        case 2:             return new ProgressTimer            (nbIterations, message);
+        case 3:             return new Progress                 (nbIterations, message);
+    }
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Algorithm.hpp b/gatb-core/src/gatb/tools/misc/impl/Algorithm.hpp
new file mode 100644
index 0000000..3f854e3
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Algorithm.hpp
@@ -0,0 +1,213 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Algorithm.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool framework
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_ALGORITHM_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_ALGORITHM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/api/ICommand.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/misc/api/IProperty.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/OptionsParser.hpp>
+#include <gatb/tools/math/Integer.hpp>
+#include <gatb/system/api/config.hpp>
+
+#include <string>
+#include <list>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Framework class for implementing algorithm
+ *
+ * \see Tool
+ */
+class Algorithm : public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] name: name of the algorithm.
+     * \param[in] nbCores : number of cores to be used for this algorithm.
+     * \param[in] input : extra options for configuring the algorithm. */
+    Algorithm (const std::string& name, int nbCores=-1, gatb::core::tools::misc::IProperties* input=0);
+
+    /** Destructor. */
+    virtual ~Algorithm ();
+
+    /** Get tool name
+     * \return the algorithm name. */
+    std::string getName () const  { return _name; }
+
+    /** Run the algorithm, ie. call 'execute'. */
+    void run ();
+
+    /** Execution of the algorithm. Abstract method, must be refined in subclasses. */
+    virtual void execute () = 0;
+
+    /** Get the parsed options as a properties instance
+     * \return the parsed options.
+     */
+    virtual IProperties*            getInput      ()  { return _input;      }
+
+    /** Get output results as a properties instance
+     * \return the output results
+     */
+    virtual IProperties*            getOutput     ()  { return _output;     }
+
+    /** Get statistics information about the execution of the tool
+     * \return the statistics
+     */
+    virtual IProperties*            getInfo       ()  { return _info;       }
+
+    /** Get an option parser configured with recognized options for the tool
+     * \return the options parser instance
+     */
+    virtual dp::IDispatcher*        getDispatcher ()  { return _dispatcher; }
+
+    /** Get a TimeInfo instance for the tool. This object can be used for gathering
+     * execution times of some parts of the \ref execute method.
+     * \return the time info instance.
+     */
+    virtual TimeInfo&               getTimeInfo   ()  { return _timeInfo;   }
+
+    /** Get information about operating system resources used during the execution.
+     * \return operating system information.
+     */
+    virtual IProperties*            getSystemInfo ()  { return _systemInfo; }
+
+    /** Create an iterator for the given iterator. If the verbosity is enough, progress bar information
+     * can be displayed.
+     * \param[in] iter : object to be encapsulated by a potential progress information
+     * \param[in] nbIterations : number of iterations to be done.
+     * \param[in] message : message used if progress information has to be displayed
+     * \param[in] listener : listener to be used; if null, a new one is created
+     * \return the created iterator.
+     */
+    template<typename Item> 
+    dp::Iterator<Item>* createIterator (
+        dp::Iterator<Item>* iter,
+        size_t nbIterations=0,
+        const char* message=0,
+        dp::IteratorListener* listener = 0
+    )
+    {
+        if (nbIterations > 0 && message != 0)
+        {
+            //  We create some listener to be notified every 1000 iterations and attach it to the iterator.
+            if (listener == 0)  { listener = createIteratorListener (nbIterations, message); }
+
+            dp::impl::SubjectIterator<Item>* iterSubject = new dp::impl::SubjectIterator<Item> (iter, nbIterations/100);
+            iterSubject->addObserver (listener);
+
+            /** We assign the used iterator to be the subject iterator. */
+            iter = iterSubject;
+        }
+
+        /** We return the result. */
+        return iter;
+    }
+
+    /** Creates an iterator listener according to the verbosity level.
+     * \param[in] nbIterations : number of iterations to be done
+     * \param[in] message : progression message
+     * \return an iterator listener.
+     */
+    virtual dp::IteratorListener* createIteratorListener (size_t nbIterations, const char* message);
+
+
+    /********************************************************************************/
+
+    /** Utility function for easily running a kmers based algorithms.
+     * It ensures that the correct instance of the provided functor is launched,
+     * according to the kmer size (known at runtime). */
+    template <template<size_t> class Functor>
+    static int mainloop (tools::misc::IOptionsParser* parser, int argc, char* argv[])
+    {
+        // We get a handle on the provided parser.
+        LOCAL (parser);
+
+        try {
+            // We parse the user options.
+            tools::misc::IProperties* options = parser->parse (argc, argv);
+
+            // We apply the functor that calls the correct implementation of the functor
+            // according to the kmer size value.
+            tools::math::Integer::apply<Functor> (options->getInt (STR_KMER_SIZE), options);
+        }
+
+        catch (tools::misc::impl::OptionFailure& e)  {  return e.displayErrors (std::cerr);                         }
+        catch (system::Exception& e)                 {  std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;  }
+
+        return EXIT_SUCCESS;
+    }
+
+protected:
+
+    /** Computes the uri from an uri (ie add a prefix if any). */
+    std::string getUriByKey (const std::string& key)  { return getUri (getInput()->getStr(key)); }
+
+    /** Computes the uri from an uri (ie add a prefix if any). */
+    std::string getUri (const std::string& str)  { return getInput()->getStr(STR_PREFIX) + str; }
+
+    /** Setters. */
+    void setInput      (IProperties*            input)       { SP_SETATTR (input);      }
+    void setOutput     (IProperties*            output)      { SP_SETATTR (output);     }
+    void setInfo       (IProperties*            info)        { SP_SETATTR (info);       }
+    void setSystemInfo (IProperties*            systemInfo)  { SP_SETATTR (systemInfo); }
+    void setDispatcher (dp::IDispatcher*        dispatcher)  { SP_SETATTR (dispatcher); }
+
+private:
+
+    /** Name of the tool (set at construction). */
+    std::string _name;
+
+    IProperties* _input;
+
+    IProperties* _output;
+
+    IProperties* _info;
+
+    IProperties* _systemInfo;
+
+    dp::IDispatcher* _dispatcher;
+
+    /** */
+    TimeInfo _timeInfo;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_ALGORITHM_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Histogram.cpp b/gatb-core/src/gatb/tools/misc/impl/Histogram.cpp
new file mode 100644
index 0000000..6de8536
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Histogram.cpp
@@ -0,0 +1,194 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Histogram.hpp>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Histogram::save (tools::storage::impl::Group& group)
+{
+    DEBUG (("Histogram::save  size=%ld\n", _length+1));
+
+    tools::collections::Collection<Entry>& collection = group.getCollection<Entry> ("histogram");
+
+    size_t offset = 1;
+    collection.insert (_histogram + offset, (_length+1) - offset);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Histogram::compute_threshold (int min_auto_threshold)
+{
+	//printf("compute threshold \n");
+	u_int64_t sum_allk = 0 ;
+
+	if (_length >= 2)
+	{
+		_histogram_smoothed [1 ].abundance = (u_int64_t) (  0.6 * (double)  _histogram[1].abundance + 0.4 * (double) _histogram[2].abundance) ;
+		sum_allk += _histogram[1].abundance * 1 ;
+
+	}
+	
+	int index_first_increase = -1;
+	int index_maxval_after_first_increase = -1;
+	u_int64_t max_val = 0 ;
+
+	//smoothing and detection of first increase
+	for (size_t i=2; i<_length  ; i++) // && i < 100
+	{
+		//printf("idx %i     %i \n",_histogram[i].index ,_histogram[i].abundance );
+
+		sum_allk += _histogram[i].abundance * i  ;
+		_histogram_smoothed [i].abundance = // _histogram[i].abundance ;
+		(u_int64_t) (
+		0.2 * (double) _histogram[i-1].abundance
+		+0.6 * (double) _histogram[i].abundance
+												+ 0.2 * (double) _histogram[i+1].abundance);
+	
+		if( index_first_increase==-1 && (_histogram_smoothed[i-1].abundance < _histogram_smoothed[i].abundance) )
+		{
+			index_first_increase = i-1;
+		}
+		if(index_first_increase>0 &&  (_histogram_smoothed[i].abundance > max_val))
+		{
+			max_val = _histogram_smoothed[i].abundance ;
+			index_maxval_after_first_increase= i;
+		}
+	}
+	
+	sum_allk += _histogram[_length].abundance  *  _length ;
+
+	if(index_first_increase ==-1 )
+	{
+		_cutoff = min_auto_threshold; //def val
+		return;
+	}
+	
+	_firstPeak = index_maxval_after_first_increase;
+
+	DEBUG (("index first increase %i  idx maxval %i \n",index_first_increase,index_maxval_after_first_increase));
+	
+	u_int64_t min_val = 10000000000LL;
+	
+	int index_minval = -1;
+	
+	for (int i=index_first_increase; i<= index_maxval_after_first_increase   ; i++)
+	{
+		if(_histogram_smoothed[i].abundance < min_val)
+		{
+			min_val = _histogram_smoothed[i].abundance;
+			index_minval = i;
+		}
+	}
+	
+	if(index_minval !=-1)
+		_cutoff = index_minval;
+
+	u_int64_t sum_elim = 0 ;
+	double ratio = 0.0;
+	int max_cutoff=0;
+	for (size_t i=0; i<_length+1; i++)
+	{
+		sum_elim +=  _histogram[i].abundance * i ;
+		ratio = (double)sum_elim / sum_allk; // ratio elim for cutoff i+1
+
+		DEBUG (("thre %i : %lli elim / %lli   : ratio %f \n",i,sum_elim,sum_allk,ratio ));
+
+		if(ratio >= 0.25)
+		{
+			max_cutoff = i+1;
+			break;
+		}
+	}
+	
+	if (_cutoff > max_cutoff)
+		_cutoff = max_cutoff;
+	
+	if (_cutoff< min_auto_threshold)
+		_cutoff = min_auto_threshold;
+
+	DEBUG (("cutoff  %i  maxcutoff %i \n",index_minval,max_cutoff));
+
+	/*
+	printf("raw values \n");
+	for (size_t i=1; i<_length  && i < 100 ; i++)
+	{
+		printf("idx %i     %i \n",_histogram[i].index ,_histogram[i].abundance );
+	}
+	
+	printf("smoothed values \n");
+
+	for (size_t i=1; i<_length  && i < 100 ; i++)
+	{
+		printf("idx %i     %i \n",_histogram_smoothed[i].index ,_histogram_smoothed[i].abundance );
+		
+	}
+	*/
+	
+	_nbsolids =0;
+	for (size_t i=_cutoff; i<_length+1   ; i++)
+	{
+		_nbsolids += _histogram[i].abundance;
+		
+	}
+	
+	u_int64_t vol_weak=0;
+	u_int64_t volume_total=0;
+	
+	for (size_t i=0; i<_cutoff ; i++)
+	{
+		vol_weak += _histogram[i].abundance *i;
+	}
+	
+	for (size_t i=0; i<_length+1   ; i++)
+	{
+		volume_total += _histogram[i].abundance *i;
+	}
+	_ratio_weak_volume = (float)vol_weak / (float)volume_total;
+
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Histogram.hpp b/gatb-core/src/gatb/tools/misc/impl/Histogram.hpp
new file mode 100644
index 0000000..9f5ff17
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Histogram.hpp
@@ -0,0 +1,229 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Histogram.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Histogram feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_HISTOGRAM_HPP_
+#define _GATB_CORE_TOOLS_MISC_HISTOGRAM_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/collections/api/Bag.hpp>
+#include <gatb/tools/misc/api/IHistogram.hpp>
+#include <string>
+#include <iostream>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Basic implementation of the IHistogram interface.
+ *
+ * This implementation is the one actually used by SortingCountAlgorithm.
+ */
+class Histogram : public IHistogram, public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] length : maximum value for the X axis
+     * \param[in] bag : bag where the values can be saved. */
+    Histogram (size_t length)
+        : _length(length), _cutoff(0), _nbsolids(0), _ratio_weak_volume(0), _firstPeak(0),
+          _histogram(0), _histogram_smoothed(0)
+    {
+        _histogram = (Entry*) CALLOC (_length + 1, sizeof (Entry));
+        memset (_histogram, 0, sizeof(Entry)*(_length + 1));
+
+		_histogram_smoothed = (Entry*) CALLOC (_length + 1, sizeof (Entry));
+        memset (_histogram_smoothed, 0, sizeof(Entry)*(_length + 1));
+		
+        for (size_t i=0; i<_length+1; i++)
+        {
+            _histogram[i].index     = i;
+			_histogram_smoothed[i].index     = i;
+
+            _histogram[i].abundance = 0;
+        }
+    }
+
+    /** Destructor */
+    virtual ~Histogram ()
+    {
+        FREE (_histogram);
+        FREE (_histogram_smoothed);
+    }
+
+    /** \copydoc IHistogram::inc */
+    void inc (u_int16_t index)  { _histogram [(index >= _length) ? _length : index].abundance ++; }
+
+    /** \copydoc IHistogram::save */
+    void save (tools::storage::impl::Group& group);
+
+    /** \copydoc IHistogram::compute_threshold */
+	void compute_threshold (int min_auto_threshold) ;  //min_auto_threshold = prevents the auto_cutoff from being below this value. Default =3
+	
+    /** \copydoc IHistogram::get_solid_cutoff */
+	u_int16_t get_solid_cutoff ()  { return _cutoff; }
+
+    /** \copydoc IHistogram::get_nbsolids_auto */
+	u_int64_t get_nbsolids_auto ()  { return _nbsolids; }
+
+    /** \copydoc IHistogram::get_first_peak */
+	u_int16_t get_first_peak ()  { return _firstPeak; }
+
+	
+	/** \copydoc IHistogram::get_ratio_weak */
+	 float get_ratio_weak () { return _ratio_weak_volume; }
+
+	
+	
+    /** \copydoc IHistogram::getLength */
+    size_t getLength() { return _length; }
+
+    /** \copydoc IHistogram::get */
+    u_int64_t& get (u_int16_t idx)  { return _histogram[idx].abundance; }
+
+private:
+
+    size_t    _length;
+	u_int16_t _cutoff;
+	u_int64_t _nbsolids;
+	float _ratio_weak_volume;
+    u_int16_t _firstPeak;
+	
+    Entry*  _histogram;
+	Entry*  _histogram_smoothed;
+};
+
+/********************************************************************************/
+
+/** \brief Null implementation of the IHistogram interface.
+ */
+class HistogramNull : public IHistogram, public system::SmartPointer
+{
+public:
+
+    /** \copydoc IHistogram::inc */
+    void inc (u_int16_t index) {}
+
+    /** \copydoc IHistogram::save */
+    void save (tools::storage::impl::Group& group)  {}
+	
+    /** \copydoc IHistogram::get_solid_cutoff */
+	u_int16_t get_solid_cutoff  () { return 0; }
+
+    /** \copydoc IHistogram::get_nbsolids_auto */
+	u_int64_t get_nbsolids_auto () { return 0; }
+
+	/** \copydoc IHistogram::get_ratio_weak */
+	float get_ratio_weak () { return 0; }
+
+    /** \copydoc IHistogram::get_first_peak */
+	u_int16_t get_first_peak    () { return 0; }
+
+    /** \copydoc IHistogram::compute_threshold */
+	void compute_threshold (int min_auto_threshold) { }
+
+    /** \copydoc IHistogram::getLength */
+    size_t getLength() { return 0; }
+
+    /** \copydoc IHistogram::get */
+    u_int64_t& get (u_int16_t idx)  { static u_int64_t foo; return foo; }
+};
+
+/********************************************************************************/
+
+/** \brief Cached implementation of the IHistogram interface.
+ *
+ * This implementation is a Proxy design pattern. It allows to modify a IHistogram instance
+ * by several threads at the same time. Actually, each thread has a local copy and at
+ * the end, all the local copies are merged into the referred instance.
+ * */
+class HistogramCache : public IHistogram, public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] ref : the referred instance.
+     * \param[in] synchro : used for synchronization */
+    HistogramCache (IHistogram* ref, system::ISynchronizer* synchro=0)
+        : _ref(0), _synchro(synchro), _localHisto(ref ? ref->getLength() : 0) {  setRef(ref); }
+
+    /** Destructor. */
+    ~HistogramCache()
+    {
+        system::LocalSynchronizer ls (_synchro);
+        for (size_t cc=1; cc<_localHisto.getLength(); cc++)  {  _ref->get(cc) += _localHisto.get(cc);  }
+        setRef (0);
+    }
+
+    /** \copydoc IHistogram::inc */
+    void inc (u_int16_t index)  { _localHisto.inc (index); }
+
+    /** \copydoc IHistogram::save */
+    void save (tools::storage::impl::Group& group)  { return _ref->save(group); }
+
+    /** \copydoc IHistogram::compute_threshold */
+	void compute_threshold (int min_auto_threshold) { return _ref->compute_threshold(min_auto_threshold); }
+
+    /** \copydoc IHistogram::get_solid_cutoff */
+	u_int16_t get_solid_cutoff () {return _ref->get_solid_cutoff();}
+	
+    /** \copydoc IHistogram::get_nbsolids_auto */
+	u_int64_t get_nbsolids_auto () {return _ref->get_nbsolids_auto();}
+
+	/** \copydoc IHistogram::get_ratio_weak */
+	float get_ratio_weak()  { return _ref->get_ratio_weak(); }
+	
+	
+    /** \copydoc IHistogram::get_first_peak */
+    u_int16_t get_first_peak () { return _ref->get_first_peak(); }
+
+    /** \copydoc IHistogram::getLength */
+    size_t getLength() { return _localHisto.getLength(); }
+
+    /** \copydoc IHistogram::get */
+    u_int64_t& get (u_int16_t idx)  { return _localHisto.get(idx); }
+
+private:
+
+    IHistogram* _ref;
+    void setRef (IHistogram* ref)  { SP_SETATTR(ref); }
+
+    system::ISynchronizer* _synchro;
+    Histogram              _localHisto;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_HISTOGRAM_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/HostInfo.hpp b/gatb-core/src/gatb/tools/misc/impl/HostInfo.hpp
new file mode 100644
index 0000000..5e908cd
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/HostInfo.hpp
@@ -0,0 +1,78 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file HostInfo.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_HOST_INFO_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_HOST_INFO_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Host information
+ */
+class HostInfo
+{
+public:
+
+    /** Get information about host
+     * \return information as a IProperties instance
+     */
+    static IProperties& getInfo()
+    {
+        static system::SmartObject singleton;
+
+        if (singleton.hasRef() == false)
+        {
+            IProperties* props = new Properties();
+
+            props->add (0, "host");
+            props->add (1, "name",             "%s",   system::impl::System::info().getHostName().c_str());
+            props->add (1, "nb_cores",         "%d",   system::impl::System::info().getNbCores());
+            props->add (1, "memory",           "%.1f", (double)system::impl::System::info().getMemoryPhysicalTotal() / (double)system::GBYTE);
+            props->add (1, "disk_current_dir", "%.1f", (double)system::impl::System::file().getAvailableSpace(system::impl::System::file().getCurrentDirectory()) / (double)system::MBYTE);
+            props->add (1, "max_file_nb",      "%lld", system::impl::System::file().getMaxFilesNumber());
+            props->add (1, "pid",              "%d",   system::impl::System::thread().getProcess());
+
+            singleton.setRef (props);
+        }
+        return * (dynamic_cast<IProperties*>(singleton.getRef()));
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_HOST_INFO_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/LibraryInfo.hpp b/gatb-core/src/gatb/tools/misc/impl/LibraryInfo.hpp
new file mode 100644
index 0000000..2be942f
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/LibraryInfo.hpp
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file LibraryInfo.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_LIBRARY_INFO_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_LIBRARY_INFO_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/api/config_sha1.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Framework class for implementing tools (ie. binary tools).
+ */
+class LibraryInfo
+{
+public:
+
+    /** Get information about the GATB-CORE library
+     * \return information as a IProperties instance
+     */
+    static IProperties& getInfo()
+    {
+        static system::SmartObject singleton;
+
+        if (singleton.hasRef() == false)
+        {
+            IProperties* props = new Properties();
+
+            props->add (0, "gatb-core-library", "");
+            props->add (1, "version",        "%s", system::impl::System::info().getVersion().c_str());
+            props->add (1, "git_sha1",       "%s", STR_GIT_SHA1);
+            props->add (1, "build_date",     "%s", system::impl::System::info().getBuildDate().c_str());
+            props->add (1, "build_system",   "%s", system::impl::System::info().getBuildSystem().c_str());
+            props->add (1, "build_compiler", "%s", system::impl::System::info().getBuildCompiler().c_str());
+            //props->add (1, "build_options",  "%s", system::impl::System::info().getBuildOptions().c_str());
+            props->add (1, "build_kmer_size", "%s", KSIZE_STRING);
+            //props->add (1, "custom_memalloc", "%d", CUSTOM_MEM_ALLOC);
+
+            singleton.setRef (props);
+        }
+        return * (dynamic_cast<IProperties*>(singleton.getRef()));
+    }
+
+    /** Display information about the GATB-CORE library
+     * \param[in] os : output stream used for dumping library information
+     */
+    static void displayVersion (std::ostream& os)
+    {
+        os << Stringify::format ("* version %s (%s)\n* built on %s with compiler '%s'\n* optimized kmer sizes %s",
+            system::impl::System::info().getVersion().c_str(),
+            system::impl::System::info().getBuildDate().c_str(),
+            system::impl::System::info().getBuildSystem().c_str(),
+            system::impl::System::info().getBuildCompiler().c_str(),
+            KSIZE_STRING
+        ) << std::endl;
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_LIBRARY_INFO_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/OptionsParser.cpp b/gatb-core/src/gatb/tools/misc/impl/OptionsParser.cpp
new file mode 100644
index 0000000..afa1187
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/OptionsParser.cpp
@@ -0,0 +1,587 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/OptionsParser.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <cstdarg>
+#include <cstdio>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+struct PostParserVisitor : public HierarchyParserVisitor
+{
+    PostParserVisitor (const set<string>& foundParsers, IOptionsParser::Result& result)
+        : foundParsers(foundParsers), result(result) {}
+
+    void visitOption (Option& object, size_t depth)
+    {
+        /** The current Option may have been not seen during the parsing. */
+        if (foundParsers.find(object.getName()) == foundParsers.end())
+        {
+            /** This option is mandatory, so this is an error. */
+            if (object.isMandatory()==true)
+            {
+                result.errors.push_back (Stringify::format ("Option '%s' is mandatory", object.getName().c_str()));
+            }
+            /** This option is not mandatory, so we use its default value. */
+            else if (object.getDefaultValue().empty()==false)
+            {
+                result.properties.add (0, object.getName(), object.getDefaultValue());
+            }
+        }
+    }
+
+    const set<string>&      foundParsers;
+    IOptionsParser::Result& result;
+};
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+struct PropertiesParserVisitor : public HierarchyParserVisitor
+{
+    IProperties* _props;
+    PropertiesParserVisitor (IProperties* props) : _props(props) {}
+    void visitOption (Option& object, size_t depth)  {  _props->add (0, object.getName(), object.getDefaultValue());  }
+};
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+struct ParserVisitor : public IOptionsParserVisitor
+{
+    int argc; char** argv;  int idx;
+    IOptionsParser::Result result;
+
+    ParserVisitor (int argc, char** argv) : argc(argc), argv(argv), idx(0)  {}
+
+    IOptionsParser::Result& getResult () { return result; }
+
+    void visitOptionsParser (OptionsParser& object, size_t depth)
+    {
+        set<string> foundParsers;
+
+        /** We loop the arguments. */
+        for ( ; idx<argc; )
+        {
+            char* txt = argv[idx];
+
+            IOptionsParser* match = object.getParser (txt);
+
+            if (match != 0)
+            {
+                /** We parse recursively with the found parser. */
+                match->accept (*this, depth+1);
+
+                /** We keep a track of found parsers. */
+                foundParsers.insert (match->getName());
+            }
+            else
+            {
+                result.errors.push_back (Stringify::format("Unknown parameter '%s'", txt));
+
+                /** We had no match, so we skip the current argument and go the next one. */
+                idx++;
+            }
+        }
+
+        PostParserVisitor visitor (foundParsers, result);
+        object.accept (visitor);
+    }
+
+    void visitOption (Option& object, size_t depth)
+    {
+        DEBUG (("ParserVisitor::visitOption  '%s' nbArgs=%ld  idx=%ld  \n",
+            object.getName().c_str(), object.getNbArgs(), idx
+        ));
+
+        /** We go to the first argument of the current Option. */
+        idx ++;
+
+        /** We check that we have enough arguments for the current option. */
+        if (idx + (int)object.getNbArgs() >  argc)
+        {
+            char buffer [128];
+            snprintf (buffer, sizeof(buffer), "Too few arguments for the %s option...", object.getName().c_str());
+            result.errors.push_back (buffer);
+        }
+        else
+        {
+            list<string> optionArgs;
+            for (size_t i=0; i < object.getNbArgs(); i++, idx++)   {  optionArgs.push_back (argv[idx+i]);  }
+            object.proceed (optionArgs, result.properties);
+        }
+    }
+};
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+OptionsParser::OptionsParser (const std::string& name, const std::string& help)
+    : _name(name), _visible(true), _help(help), _properties(0)
+{
+    setProperties (new Properties());
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+OptionsParser::~OptionsParser ()
+{
+    for (list<IOptionsParser*>::const_iterator it = _parsers.begin(); it != _parsers.end(); ++it)
+    {
+        (*it)->forget();
+    }
+
+    setProperties (0);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+misc::IProperties* OptionsParser::parse (int argc, char** argv)
+{
+    /** We parse the arguments through a visitor. Note that we skip the first
+     * item which should be the binary name. */
+    ParserVisitor visitor (argc-1, argv+1);
+    this->accept (visitor);
+
+	
+	//if saw help ou version, throw specific exception
+	if(visitor.getResult().properties.get(STR_HELP) != 0)
+	{
+		throw ExceptionHelp(this);
+	}
+	
+	if(visitor.getResult().properties.get(STR_VERSION) != 0)
+	{
+		throw ExceptionVersion();
+	}
+	
+    /** We launch an exception in case we got errors during the parsing. */
+    if (!visitor.getResult().errors.empty())  {  throw OptionFailure (this, visitor.getResult());  }
+
+    /** We set the properties. */
+    setProperties (new Properties (visitor.getResult().properties));
+
+    return _properties;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+
+/** We need a structure that manages heap alloc/dealloc through a local object (on stack).
+ * => sure to deallocate all the stuff even if an exception is thrown. */
+struct ArgData
+{
+    int    argc;
+    char** argv;
+
+     ArgData() : argc(0), argv(0) { }
+
+     ~ArgData()
+     {
+         for (int i=0; i<argc; i++)  {  if (argv[i])  free (argv[i]);  }
+         if (argv)  { free (argv); }
+     }
+};
+
+misc::IProperties* OptionsParser::parseString (const std::string& s)
+{
+    ArgData args;
+
+    size_t idx    = 0;
+
+    /** We tokenize the string and count the number of tokens. */
+    TokenizerIterator it1 (s.c_str(), " ");
+    for (it1.first(); !it1.isDone(); it1.next())  { args.argc++; }
+
+    args.argc++;
+
+    /** We allocate a table of char* */
+    args.argv = (char**) calloc (args.argc, sizeof(char*));
+
+    args.argv[idx++] = strdup (getName().c_str());
+
+    /** We fill the table with the tokens. */
+    TokenizerIterator it2 (s.c_str(), " ");
+    for (it2.first(); !it2.isDone(); it2.next())
+    {
+        args.argv[idx++] = strdup (it2.item());
+    }
+
+    for (int i=0; i<args.argc; i++)  {  DEBUG (("   item='%s' \n", argv[i]));  }
+
+    /** We parse the arguments. */
+    misc::IProperties* result = this->parse (args.argc, args.argv);
+
+    DEBUG (("OptionsParser::parseString  argc=%d => idx=%ld\n", argc, idx));
+
+    /** We return the result. */
+    return result;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+bool OptionsParser::saw (const std::string& name) const
+{
+    return (_properties != 0  && _properties->get(name) != 0);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+struct PushParserVisitor : public HierarchyParserVisitor
+{
+    bool   front;
+    size_t expandDepth;
+    std::list<IOptionsParser*>& parsers;
+    bool visibility;
+
+    PushParserVisitor (bool front, size_t depth, std::list<IOptionsParser*>& parsers, bool visibility)
+        : front(front), expandDepth(depth), parsers(parsers), visibility(visibility) {}
+
+    void visitOptionsParser (impl::OptionsParser& object, size_t depth)
+    {
+        if (depth < expandDepth)  { HierarchyParserVisitor::visitOptionsParser (object, depth);  }
+        else                      { add (object); }
+    }
+
+    void visitOption (impl::Option& object, size_t depth)   {  add (object); }
+
+    void add (IOptionsParser& object)
+    {
+        if (front)  {  object.use();  parsers.push_front (&object); }
+        else        {  object.use();  parsers.push_back  (&object); }
+
+        object.setVisible(visibility);
+    }
+};
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void OptionsParser::push_back (IOptionsParser* parser, size_t expandDepth, bool visibility)
+{
+    LOCAL (parser);
+    PushParserVisitor visitor (false, expandDepth, _parsers, visibility);
+    parser->accept (visitor);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void OptionsParser::push_front (IOptionsParser* parser, size_t expandDepth, bool visibility)
+{
+    LOCAL (parser);
+    PushParserVisitor visitor (true, expandDepth, _parsers, visibility);
+    parser->accept (visitor);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+IOptionsParser* OptionsParser::getParser (const std::string& name)
+{
+    DEBUG (("OptionsParser::getParser  '%s'  look for '%s'  parsers.size=%ld   equal=%d\n",
+        getName().c_str(), name.c_str(), _parsers.size(), name == getName()
+    ));
+
+    if (name == getName()) { return  this; }
+
+    IOptionsParser* result = 0;
+    for (list<IOptionsParser*>::iterator it = _parsers.begin(); result==0 && it != _parsers.end(); ++it)
+    {
+        result = (*it)->getParser(name);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+IProperties* OptionsParser::getDefaultProperties ()
+{
+    IProperties* result = new Properties();
+
+    PropertiesParserVisitor v (result);
+    this->accept (v);
+    return result;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void HierarchyParserVisitor::visitOptionsParser (OptionsParser& object, size_t depth)
+{
+    for (std::list<IOptionsParser*>::const_iterator it = object.getParsers().begin(); it != object.getParsers().end(); ++it)
+    {
+        (*it)->accept (*this, depth+1);
+    }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void OptionsHelpVisitor::visitOptionsParser (OptionsParser& object, size_t depth)
+{
+    if (object.isVisible() == true)
+    {
+        /** We first look for the longest option name. */
+        nameMaxLen=0;
+        for (list<IOptionsParser*>::const_iterator it = object.getParsers().begin(); it != object.getParsers().end(); ++it)
+        {
+            if (!(*it)->getName().empty())  {  nameMaxLen = std::max (nameMaxLen, (*it)->getName().size());  }
+        }
+
+        os << endl;
+        indent(os,depth) <<  "[" << object.getName() << " options]" << endl;
+
+        /** We loop over each known parser. */
+        for (list<IOptionsParser*>::const_iterator it = object.getParsers().begin(); it != object.getParsers().end(); ++it)
+        {
+            if ((*it)->isVisible())  {  (*it)->accept (*this, depth+1); }
+        }
+    }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void OptionsHelpVisitor::visitOption (Option& object, size_t depth)
+{
+    if (!object.getName().empty() && object.isVisible())
+    {
+        if (object.getNbArgs() > 0)
+        {
+            indent(os,depth) << Stringify::format ("    %-*s (%d arg) :    %s",
+                (int)nameMaxLen,
+                object.getName().c_str(),
+                (int)object.getNbArgs(),
+                object.getHelp().c_str(),
+                object.getDefaultValue().c_str()
+            );
+
+            if (object.isMandatory()==false)  {  os << Stringify::format ("  [default '%s']", object.getDefaultValue().c_str());  }
+
+            os << endl;
+        }
+        else
+        {
+            indent(os,depth) << Stringify::format ("    %-*s (%d arg) :    %s\n",
+                (int)nameMaxLen,
+                object.getName().c_str(),
+                (int)object.getNbArgs(),
+                object.getHelp().c_str()
+            );
+        }
+    }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+std::ostream& OptionsHelpVisitor::indent (std::ostream& os, size_t level)  const
+{
+    for (size_t i=0; i<level; i++)  { os << "   "; }
+    return os;
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+VisibilityOptionsVisitor::VisibilityOptionsVisitor (bool visibility, ...)
+    : _visibility(visibility)
+{
+    /** We build the list of names from the ellipsis. */
+    va_list ap;
+
+    va_start(ap, visibility);
+    for (const char* s = va_arg(ap,const char*); s != 0; s = va_arg(ap,const char*))
+    {
+        _names.insert (s);
+    }
+    va_end(ap);
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void VisibilityOptionsVisitor::visitOptionsParser (OptionsParser& object, size_t depth)
+{
+    if (_names.find(object.getName()) != _names.end())  { object.setVisible(_visibility); }
+
+    for (std::list<IOptionsParser*>::const_iterator it = object.getParsers().begin(); it != object.getParsers().end(); ++it)
+    {
+        (*it)->accept (*this, depth+1);
+    }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+void VisibilityOptionsVisitor::visitOption (Option& object, size_t depth)
+{
+    if (_names.find(object.getName()) != _names.end())  { object.setVisible(_visibility); }
+}
+
+/*********************************************************************
+ ** METHOD  :
+ ** PURPOSE :
+ ** INPUT   :
+ ** OUTPUT  :
+ ** RETURN  :
+ ** REMARKS :
+ *********************************************************************/
+int OptionFailure::displayErrors (std::ostream& os) const
+{
+    for (std::list<std::string>::const_iterator it = _result.errors.begin(); it != _result.errors.end(); ++it)
+    {
+        os << "ERROR: " << *it << std::endl;
+    }
+
+    if (_msg.empty() == false)  { os << _msg << endl; }
+
+    OptionsHelpVisitor visitor (os);
+    _parser->accept (visitor, 0);
+
+    return EXIT_FAILURE;
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/OptionsParser.hpp b/gatb-core/src/gatb/tools/misc/impl/OptionsParser.hpp
new file mode 100644
index 0000000..976e1a6
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/OptionsParser.hpp
@@ -0,0 +1,394 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file OptionsParser.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool for parsing command line arguments
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_OPTION_PARSER_HPP_
+#define _GATB_CORE_TOOLS_MISC_OPTION_PARSER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/api/IOptionsParser.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+
+#include <list>
+#include <set>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of the IOptionsParser interface.
+ *
+ * This implementation represents the 'composite' part of the Composite design pattern.
+ *
+ * Example:
+ * \snippet optionsparser1.cpp  snippet1
+ */
+class OptionsParser : public IOptionsParser
+{
+public:
+
+    /** Constructor. */
+    OptionsParser (const std::string& name="", const std::string& help="");
+
+    /** Destructor. */
+    virtual ~OptionsParser ();
+
+    /*************************************************************/
+    /*******************    General  methods   *******************/
+    /*************************************************************/
+
+    /** \copydoc IOptionsParser::getName */
+    const std::string& getName () const  { return _name; }
+
+    /** \copydoc IOptionsParser::setName */
+    void setName (const std::string& name)  { _name=name; }
+
+    /** \copydoc IOptionsParser::setVisible */
+    void setVisible (bool status)  { _visible=status; }
+
+    /** \copydoc IOptionsParser::isVisible */
+    bool isVisible() const  { return _visible; }
+
+    /** \copydoc IOptionsParser::getHelp */
+    const std::string& getHelp () const  { return _help; }
+
+    /** \copydoc IOptionsParser::setHelp */
+    void setHelp (const std::string& help)  { _help = help; }
+
+    /*************************************************************/
+    /*******************    Parsing  methods   *******************/
+    /*************************************************************/
+
+    /** \copydoc IOptionsParser::parse */
+    misc::IProperties* parse (int argc, char** argv);
+
+    /** \copydoc IOptionsParser::parseString */
+    misc::IProperties* parseString (const std::string& s);
+
+    /** \copydoc IOptionsParser::getProperties */
+    misc::IProperties* getProperties ()  { return _properties; }
+
+    /** \copydoc IOptionsParser::saw */
+    bool saw (const std::string& name) const;
+
+    /*************************************************************/
+    /*******************   Composite methods   *******************/
+    /*************************************************************/
+
+    /** \copydoc IOptionsParser::push_back */
+    void push_back (IOptionsParser* parser, size_t expandDepth=0, bool visibility=true);
+
+    /** \copydoc IOptionsParser::push_front */
+    void push_front (IOptionsParser* parser, size_t expandDepth=0, bool visibility=true);
+
+    /** \copydoc IOptionsParser::getParser */
+    IOptionsParser* getParser (const std::string& name);
+
+    /** \copydoc IOptionsParser::getParsers */
+    std::list<IOptionsParser*>& getParsers ()  { return _parsers; }
+
+    /*************************************************************/
+    /*********************   Miscellaneous   *********************/
+    /*************************************************************/
+
+    /** \copydoc IOptionsParser::getDefaultProperties */
+    misc::IProperties* getDefaultProperties ();
+
+    /** \copydoc IOptionsParser::accept */
+    void accept (IOptionsParserVisitor& visitor, size_t depth=0)  { visitor.visitOptionsParser(*this, depth); }
+
+protected:
+
+    std::string _name;
+    bool        _visible;
+    std::string _help;
+
+    std::list<IOptionsParser*> _parsers;
+
+    misc::IProperties* _properties;
+    void setProperties (misc::IProperties* properties)  { SP_SETATTR(properties); }
+
+    std::ostream& indent (std::ostream& os, size_t level)  const { for (size_t i=0; i<level; i++)  { os << "   "; }  return os; }
+};
+
+/********************************************************************************/
+
+/** \brief Implementation of the IOptionsParser interface.
+ *
+ * This implementation represents the 'leaf' part of the Composite design pattern.
+ */
+class Option : public OptionsParser
+{
+public:
+
+    /** Constructor.
+     * \param[in] name : name of the option
+     * \param[in] nbArgs : number of arguments for this option
+     * \param[in] mandatory : tells whether this option is mandatory or not
+     * \param[in] defaultValue : default value for the option
+     * \param[in] visible : tells whether this option may be shown in help
+     * \param[in] help : textual help for this option
+     */
+    Option (
+        const std::string&  name,
+        int                 nbArgs,
+        bool                mandatory,
+        const std::string&  defaultValue,
+        bool                visible,
+        const std::string&  help
+    )
+        : OptionsParser(name, help), _nbArgs(nbArgs), _mandatory(mandatory), _defaultParam(defaultValue)
+    {
+        setVisible(visible);
+    }
+
+    /** Desctructor. */
+    virtual ~Option() {}
+
+    /** Get the default value for the option
+     * \return the default value (may be empty) */
+    std::string getDefaultValue () const { return _defaultParam; }
+
+    /** Set the default value for the option
+     * \param[in] value : the default value (may be empty) */
+    void setDefaultValue (const std::string& value)  { _defaultParam = value; }
+
+    /** Tells whether the option is mandatory or not.
+     * \return the mandatory status.
+     */
+    bool isMandatory () const { return _mandatory; }
+
+    /** \copydoc IOptionsParser::getParser */
+    IOptionsParser* getParser (const std::string& name) { return name==getName() ? this : 0; }
+
+    /** \copydoc IOptionsParser::accept */
+    void accept (IOptionsParserVisitor& visitor, size_t depth=0)  { visitor.visitOption(*this, depth); }
+
+protected:
+
+    /** Gives the number of arguments that must follow the option.
+     * \return the arguments number.
+     */
+    size_t getNbArgs () const   { return _nbArgs; }
+
+    /** When an option is recognized in the arguments list, we look the number of waited args and put
+     * them in a list of string objects. This is this list that is given as argument of the proceed() method
+     * that mainly will affect the given args to the variable given to the instantiation of the
+     * (derived class) Option.
+     */
+    virtual void proceed (const std::list<std::string>& args, IProperties& props) = 0;
+
+    size_t          _nbArgs;
+    bool            _mandatory;
+    std::string     _defaultParam;
+
+    friend struct ParserVisitor;
+    friend class OptionsHelpVisitor;
+};
+
+/********************************************************************************/
+
+/** \brief Option that has no argument.
+ *
+ * This is a special option (with no name) that memorize the arguments that are not
+ * involved with a known option.
+ */
+class OptionNoParam : public Option
+{
+public:
+
+    /** Constructor.
+     * \param[in] name : name of the option
+     * \param[in] help : textual help for this option
+     * \param[in] mandatory : tells whether this option is mandatory or not
+     * \param[in] visible : tells whether this option may be shown in help
+     */
+    OptionNoParam (
+        const std::string&  name,
+        const std::string&  help,
+        bool                mandatory = false,
+        bool                visible   = true
+    )
+        : Option (name, 0, mandatory, "", visible, help)
+    {
+    }
+
+    /** \copydoc Option::proceed */
+    void proceed (const std::list<std::string>& args, IProperties& props)
+    {
+        props.add (0, getName(), "");
+    }
+};
+
+/********************************************************************************/
+
+/** \brief Option that has one argument.
+ *
+ * This is a special option with only one argument.
+ */
+class OptionOneParam : public Option
+{
+public:
+
+    /** Constructor.
+     * \param[in] name : name of the option
+     * \param[in] help : textual help for this option
+     * \param[in] mandatory : tells whether this option is mandatory or not
+     * \param[in] defaultValue : default value for the option
+     * \param[in] visible : tells whether this option may be shown in help
+     */
+    OptionOneParam (
+        const std::string&  name,
+        const std::string&  help,
+        bool                mandatory    = false,
+        const std::string&  defaultValue = "",
+        bool                visible      = true
+    )
+        : Option (name, 1, mandatory, defaultValue, visible, help)
+    {
+    }
+
+    /** \copydoc Option::proceed */
+    void proceed (const std::list<std::string>& args, IProperties& props)
+    {
+        props.add (0, getName(), args.front());
+    }
+};
+
+/********************************************************************************/
+/**************************           VISITORS         **************************/
+/********************************************************************************/
+
+/** \brief Visitor that iterates children of an OptionsParser instance. */
+struct HierarchyParserVisitor : public IOptionsParserVisitor
+{
+    /** \copydoc IOptionsParserVisitor::visitOptionsParser */
+    void visitOptionsParser (OptionsParser& object, size_t depth);
+};
+
+/** \brief Visitor that display help. */
+class OptionsHelpVisitor : public IOptionsParserVisitor
+{
+public:
+
+    /** Constructor.
+     * \param[out] os : output stream where the output must be put. */
+    OptionsHelpVisitor (std::ostream& os) : os(os),nameMaxLen(0) {}
+
+    /** \copydoc IOptionsParserVisitor::visitOptionsParser */
+    void visitOptionsParser (OptionsParser& object, size_t depth);
+
+    /** \copydoc IOptionsParserVisitor::visitOption */
+    void visitOption (Option& object, size_t depth);
+
+private:
+
+    std::ostream& os;
+    size_t        nameMaxLen;
+    std::ostream& indent (std::ostream& os, size_t level) const;
+};
+
+/** \brief Visitor that sets the visibility for a list of options. */
+struct VisibilityOptionsVisitor : public IOptionsParserVisitor
+{
+    /** Constructor.
+     * \param[in] visibility : status to be set.
+     * \param[in] ... : list of labels of options to be modified; MUST BE terminated by a 0. */
+    VisibilityOptionsVisitor (bool visibility, ...);
+
+    /** \copydoc IOptionsParserVisitor::visitOptionsParser */
+    void visitOptionsParser (OptionsParser& object, size_t depth);
+
+    /** \copydoc IOptionsParserVisitor::visitOption */
+    void visitOption (Option& object, size_t depth);
+
+    bool                  _visibility;
+    std::set<std::string> _names;
+};
+
+/********************************************************************************/
+
+/** \brief Exception class to be used for option management error.
+ *
+ * This class should be thrown when something went wrong during options parsing.
+ */
+class OptionFailure
+{
+public:
+
+    /** Constructor.
+     * \param[in] parser : the parser that threw the exception.
+     * \param[in] result : information gathered during the parsing. */
+    OptionFailure (IOptionsParser* parser, IOptionsParser::Result result) :_parser(parser), _result(result)  {}
+
+    /** Constructor.
+     * \param[in] parser : the parser that threw the exception.
+     * \param[in] msg : message to be displayed */
+    OptionFailure (IOptionsParser* parser, const std::string& msg) :_parser(parser), _msg(msg)  {}
+
+    /** Display information about the failure on the provided output stream
+     * \param[out] os : output stream to be used
+     * \return EXIT_FAILURE */
+    int displayErrors (std::ostream& os) const;
+
+protected:
+    IOptionsParser*        _parser;
+    IOptionsParser::Result _result;
+    std::string            _msg;
+};
+	
+
+	//specific exception to handle help and version
+class ExceptionHelp
+	{
+	public:
+
+		ExceptionHelp(IOptionsParser* parser) :_parser(parser) {}
+		
+		int displayDefaultHelp (std::ostream& os) const
+		{
+			OptionsHelpVisitor visitor (os);
+			_parser->accept (visitor, 0);
+			return EXIT_FAILURE;
+		}
+	protected:
+		IOptionsParser*        _parser;
+	};
+	
+class ExceptionVersion
+	{
+	};
+
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_OPTION_PARSER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Pool.hpp b/gatb-core/src/gatb/tools/misc/impl/Pool.hpp
new file mode 100644
index 0000000..2c671f0
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Pool.hpp
@@ -0,0 +1,439 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Pool.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool for pooling objects
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_POOL_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_POOL_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <queue>          // std::priority_queue
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/* Cette class dÈfinit une pool memoire pour allocation rapide de la table de hachage
+ * utilisee quand seed >14 */
+	
+//now pass as template the cell type
+	
+//had to move this outside the class (otherwise recursive def of cell template that may contain cell_ptr_t ... )
+typedef u_int32_t  cell_ptr_t;
+
+	
+template <typename cell>  class Pool
+//template <typename graine_type, typename value_type=int>  class Pool
+{
+public:
+
+	/** Default constructor.
+     * \param[in] tai :  2^20  1 M cells *16 o    blocs de 16 Mo
+     * \param[in] N : 2^12  soit 4 G cells max
+     * */
+    Pool (size_t tai=1048576, size_t N=4096) : TAI_POOL(tai), N_POOL(N)
+    {
+        n_pools = 0; n_cells=0;
+        //allocation table de pool :
+        tab_pool = (cell**)  MALLOC (N_POOL*sizeof(cell*) );
+
+        tab_pool[0]=0; n_pools++; // la premiere pool est NULL, pour conversion null_internal -> null
+
+        //allocation de la premiere pool :
+        pool_courante =(cell*)  MALLOC (TAI_POOL*sizeof(cell) );
+        tab_pool[n_pools] = pool_courante;
+        n_pools++;
+    }
+
+    /**  Destructeur  */
+    ~Pool()
+    {
+        // la pool 0 est NULL
+        for(size_t i=1;i<n_pools;i++)  {  FREE ( tab_pool[i] );  }
+
+        FREE (tab_pool);
+    }
+
+	
+	u_int64_t getByteSize()
+	{
+		return ((n_pools-2) * TAI_POOL*sizeof(cell)); // I do not want to count the firs tdefault allocated pool
+	}
+	
+	
+    /**  allocate cell, return internal pointer type ( 32bits) */
+    cell_ptr_t  allocate_cell()
+    {
+        cell_ptr_t internal_adress = 0;
+        // ncells = nb de cells deja utilisees
+        if (n_cells <TAI_POOL)
+        {
+            internal_adress  = n_pools -1;    // low 12 bits  : pool number
+            internal_adress |= n_cells << 12; // 20 high bits : cell number in pool
+            n_cells ++;
+
+            return internal_adress;
+        }
+        else // la piscine est pleine, on en alloue une nouvelle
+        {
+            if (n_pools>= N_POOL)
+            {
+                // will happen when  4G cells are allocated, representing 64 Go
+                throw system::Exception ("Internal memory allocator is full!");
+            }
+            pool_courante =(cell*)  MALLOC (TAI_POOL*sizeof(cell) );
+            tab_pool[n_pools] = pool_courante;
+            n_pools++;
+            n_cells = 1;
+
+            internal_adress = n_pools -1;
+            // 20 high bits are 0
+
+            return internal_adress;
+        }
+    }
+
+    /** */
+    cell*  internal_ptr_to_cell_pointer(cell_ptr_t internal_ptr)
+    {
+        unsigned int numpool =  internal_ptr & 4095;
+        unsigned int numcell =  internal_ptr >> 12;
+
+        return (tab_pool[numpool] + numcell);
+    }
+
+    /** vide toutes piscines (garde juste une pool vide)  */
+    void  clear ()
+    {
+        for(size_t i=2;i<n_pools;i++) // garde la premiere pool pour usage futur
+        {
+            FREE ( tab_pool[i] );
+        }
+		memset(tab_pool[1],0,TAI_POOL*sizeof(cell));
+		
+        //on repasse sur premiere pool
+        pool_courante = tab_pool[1];
+        n_cells=0;
+        n_pools=2;
+    }
+
+
+	
+	//sort the pools according to some comparator
+	//warning this will reorder cells and thus  making existing pointers to cells irrelevant
+	//but useful for  e.g. sirted iterator of cells
+	template <typename Comparator>
+	void sortPools(Comparator comparator)
+	{
+		// les pool pleines
+		for(size_t i=1;i<(n_pools-1);i++)
+		{
+			std::sort( tab_pool[i],  tab_pool[i]  + TAI_POOL, comparator);
+		}
+		
+		// la pool en cours de remplissage
+		std::sort( tab_pool[n_pools-1],  tab_pool[n_pools-1]  + n_cells, comparator);
+
+	}
+	
+	
+	////////simple iterator over all cells
+	template <typename Comparator>
+	dp::Iterator < cell >* iteratorsorted (Comparator comparator)
+	{
+		//first sort each pool with std sort
+		 this->sortPools(comparator);
+
+		//then iterate with a merge sort
+		return new IteratorSorted(*this);
+	}
+	
+	
+	//todo template also this with a comparator
+	class IteratorSorted : public tools::dp::Iterator < cell >
+	{
+	
+	public:
+		typedef std::pair<int, cell *> cellpair_t; //id pointer of pool , cell *
+
+		struct sortcellpair { bool operator() (cellpair_t &l,cellpair_t &r) { return !(  (* l.second).graine <=  (* r.second).graine );  }  } ;
+
+		IteratorSorted (Pool<cell>& aRef) : ref(aRef), done(true)  {}
+		
+		/** \copydoc tools::dp::Iterator::first */
+		void first()
+		{
+
+			for(size_t i=1;i< ref.n_pools;i++)
+			{
+				pq.push( cellpair_t(i,  (cell *)  &(ref.tab_pool[i][0])  )   );
+			}
+			next();
+		}
+		
+		/** \copydoc tools::dp::Iterator::next */
+		void next()
+		{
+			
+			done =  (pq.size() == 0);
+			
+			if(!done)
+			{
+				cellpair_t current_pair = pq.top() ; pq.pop();
+				*this->_item = * (current_pair.second);
+				
+
+				
+				//push the next cell of this list  if any
+				unsigned int cell_number =  current_pair.second   -  ref.tab_pool[current_pair.first] ;
+				unsigned int current_pool = current_pair.first;
+				if( (current_pool < (ref.n_pools -1)) &&  ((cell_number+1)  < ref.TAI_POOL)  ) // inside a full pool, and cells remaining
+				{
+					pq.push( cellpair_t(current_pool, & (ref.tab_pool[current_pool][cell_number+1])  )   );
+				}
+				else if ( (current_pool == (ref.n_pools -1)) && ((cell_number+1) < ref.n_cells) ) // inside last pool, and cells remaining
+				{
+					pq.push( cellpair_t(current_pool, & (ref.tab_pool[current_pool][cell_number+1])  )   );
+				}
+				//otherwise at end of array, dont push anything
+			}
+		}
+		
+		/** \copydoc tools::dp::Iterator::isDone */
+		bool isDone ()   {  return done; }
+		
+		/** \copydoc tools::dp::Iterator::item */
+		cell& item ()     { return *this->_item; }
+		
+	private:
+		std::priority_queue< cellpair_t, std::vector<cellpair_t>,   sortcellpair > pq;
+		Pool<cell>&  ref;
+		bool         done;
+		
+	};
+	
+	//////
+	
+	
+	
+	
+	
+	
+	////////simple iterator over all cells
+	dp::Iterator < cell >* iterator ()
+	{
+		return new Iterator(*this);
+	}
+	
+	
+	/************************************************************/
+	//avec std::pair ? pour avoir Item, value_type
+	class Iterator : public tools::dp::Iterator <  cell  >
+	{
+	public:
+		
+		Iterator (Pool<cell>& aRef) : ref(aRef), done(true)  {}
+		
+		/** \copydoc tools::dp::Iterator::first */
+		void first()
+		{
+			_current_pool = 1; // first pool
+			_current_cell = 0;
+			done        = ref.n_cells < 1;
+			if(!done)
+				*this->_item = ref.tab_pool[_current_pool][_current_cell];
+			
+			_current_cell++; // next cell that should be read
+		}
+		
+		/** \copydoc tools::dp::Iterator::next */
+		void next()
+		{
+
+			if(_current_pool < (ref.n_pools -1) && _current_cell  < ref.TAI_POOL ) // inside a full pool, and cells remaining
+			{
+				*this->_item = ref.tab_pool[_current_pool][_current_cell];
+				_current_cell++;
+				return;
+			}
+			else if (_current_pool < (ref.n_pools -1) && _current_cell == ref.TAI_POOL ) // inside a full pool but no cells remaining
+			{
+				//go to next pool
+				_current_pool++;
+				_current_cell = 0;
+				*this->_item = ref.tab_pool[_current_pool][_current_cell];
+				_current_cell++;
+			}
+			else if (_current_pool == (ref.n_pools -1) && _current_cell < ref.n_cells) // in last pool and cells remaining
+			{
+				*this->_item = ref.tab_pool[_current_pool][_current_cell];
+				_current_cell++;
+			}
+			else // last pools and no cells left, done
+			{
+				done = true;
+			}
+		}
+		
+		/** \copydoc tools::dp::Iterator::isDone */
+		bool isDone ()   {  return done; }
+		
+		/** \copydoc tools::dp::Iterator::item */
+		cell& item ()     { return *this->_item; }
+		
+	private:
+		
+		unsigned int _current_pool;
+		unsigned int _current_cell;
+
+		Pool<cell>&  ref;
+		
+		bool         done;
+	};
+	
+
+	
+private:
+
+    /** table de cell, pour usage courant */
+    cell* pool_courante;
+
+    /** stockage de tous les pointeurs pool */
+    cell** tab_pool;
+
+    /** nombre de piscines remplies */
+    unsigned int n_pools;
+
+    /**  niveau de remplissage de la piscine courante */
+    unsigned int n_cells;
+
+    size_t TAI_POOL;
+    size_t N_POOL;
+};
+
+/********************************************************************************/
+
+//make it an allocator usable by std vector ?
+class MemAllocator
+{
+public:
+
+    //clear all previous allocs, and alloc pool capacity
+    void reserve(u_int64_t size)
+    {
+        if(size ==0 && mainbuffer !=NULL)
+        {
+            FREE (mainbuffer);
+            capacity = used_space = 0;
+            mainbuffer = NULL ;
+        }
+
+        /** We add a little bit of memory in case "align" method is called often.
+         * We allow max alignment of 16 bytes per core, plus some extra memory. */
+        size_t extraMem = 16*_nbCores + 1024;
+
+        capacity   = size+extraMem;
+        mainbuffer = (char*) CALLOC(capacity,1);
+        used_space = 0;
+    }
+
+    //should be thread safe
+    char* pool_malloc(u_int64_t requested_size, const char* message="")
+    {
+        u_int64_t synced_used_space = __sync_fetch_and_add(&used_space, requested_size);
+
+        if (requested_size > (capacity - synced_used_space))
+        {
+            __sync_fetch_and_add(&used_space, -requested_size);
+
+            throw system::Exception ("Pool allocation failed for %lld bytes (%s). Current usage is %lld and capacity is %lld",
+                requested_size, message, used_space, capacity
+            );
+
+            return NULL;
+        }
+    
+        if (mainbuffer == NULL)
+            throw system::Exception ("Pool allocation failed for %lld bytes (%s), mainbuffer is null?. Current usage is %lld and capacity is %lld",
+                requested_size, message, used_space, capacity
+                );
+
+        return mainbuffer + synced_used_space;
+    }
+
+    /** Force alignment. */
+    void align (u_int8_t alignBytes)
+    {
+        size_t offset = alignBytes-1 + sizeof(char*);
+        char* current = mainbuffer + used_space;
+        char* buffer  =  (char*)(((size_t)(current)+offset)&~(alignBytes-1));
+
+        /** We update the used space. */
+        used_space = (u_int64_t)(buffer-mainbuffer);
+    }
+
+    u_int64_t getCapacity ()  {  return capacity;   }
+
+    u_int64_t getUsedSpace()  {  return used_space; }
+
+
+    void free_all()
+    {
+        used_space = 0;
+    }
+
+    MemAllocator(size_t nbCores=0) : mainbuffer(NULL),capacity(0),used_space(0), _nbCores(nbCores), _synchro(0)
+    {
+        setSynchro (system::impl::System::thread().newSynchronizer());
+    }
+
+    ~MemAllocator()
+    {
+        if (mainbuffer != NULL)  {  FREE (mainbuffer);  }
+        setSynchro (0);
+    }
+
+    system::ISynchronizer* getSynchro()  { return _synchro; }
+
+private :
+    char*     mainbuffer;
+    u_int64_t capacity; //in bytes
+    u_int64_t used_space;
+
+    size_t _nbCores;
+
+    system::ISynchronizer* _synchro;
+    void setSynchro (system::ISynchronizer* synchro) { SP_SETATTR(synchro); }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_POOL_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Progress.cpp b/gatb-core/src/gatb/tools/misc/impl/Progress.cpp
new file mode 100644
index 0000000..327c125
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Progress.cpp
@@ -0,0 +1,380 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/StringLine.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Progress::Progress (u_int64_t ntasks, const char * msg, std::ostream& output)
+    : os(output)
+{
+    message = StringLine::format (msg != NULL ? msg : "?");
+    reset (ntasks);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::reset (u_int64_t ntasks)
+{
+    todo    = ntasks;
+    done    = 0;
+    partial = 0;
+    subdiv  = 100;
+    steps   = (double)(ntasks>0 ? ntasks : 1) / (double)subdiv;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::init ()
+{
+    /** We format the string to be displayed. */
+    snprintf (buffer, 256, "| %-*s |\n",101, message.c_str());
+
+    /** We dump the message.*/
+    os << buffer;
+
+    /** We forward the remaining of the init to postInit method. */
+    postInit ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::finish ()
+{
+    /** We set the total done. */
+    set (todo);
+
+    /** We forward the remaining of the finish to postFinish method. */
+    postFinish ();
+
+    /** We reset all progression variables. */
+    todo    = 0;
+    done    = 0;
+    partial = 0;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::inc (u_int64_t ntasks_done)
+{
+    done    += ntasks_done;
+    partial += ntasks_done;
+
+    while (partial >= steps)
+    {
+        update (false);
+        partial -= steps;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::set (u_int64_t ntasks_done)
+{
+    if (ntasks_done > done)
+    {
+        inc (ntasks_done-done);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::setMessage (const std::string& msg)
+{
+    message = StringLine::format (msg);
+
+    update (false);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::postInit ()
+{
+    os << "[";
+    os.flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::postFinish ()
+{
+    os << "]" << endl;
+    os.flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Progress::update (bool first)
+{
+    os << "-";
+    os.flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ProgressTimer::ProgressTimer (u_int64_t ntasks, const char* msg, std::ostream& os)
+    : Progress (ntasks, msg, os), heure_debut(0), heure_actuelle(0)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimer::postInit ()
+{
+    // os << endl;
+
+    /** We get the current hour (in msec) */
+    heure_debut = System::time().getTimeStamp();
+
+    update (true);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimer::postFinish ()
+{
+    os << endl;
+    os.flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimer::update (bool force)
+{
+    /** We get the current hour (in msec) */
+    heure_actuelle = System::time().getTimeStamp();
+
+    /** We compute the difference between the current time and the starting time. */
+    double elapsed = (heure_actuelle - heure_debut) / 1000.0;
+
+    /** A little check. */
+    if (force || (done > 0))
+    {
+        fillBuffer (elapsed);
+
+        /** We dump the string. */
+        os << buffer;
+        os.flush();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimer::fillBuffer (double elapsed)
+{
+    double speed  = elapsed > 0 ?  done / elapsed     : 0;
+    double rem    = elapsed > 0 ? (todo-done) / speed : 0;
+
+    if (done>todo) rem=0;
+
+    int min_e  = (int)(elapsed / 60) ;
+    elapsed -= min_e*60;
+    int min_r  = (int)(rem / 60) ;
+    rem -= min_r*60;
+
+    /** We format the string to be displayed. */
+    snprintf (buffer, sizeof(buffer), "%c[%s]  %-5.3g%%   elapsed: %3i min %-2.0f sec   remaining: %3i min %-2.0f sec",
+        13,
+        message.c_str(),
+        100*(double)done/todo,
+        min_e,elapsed,min_r,rem
+    );
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ProgressTimerAndSystem::ProgressTimerAndSystem (u_int64_t ntasks, const char* msg, std::ostream& os)
+    : ProgressTimer (ntasks, msg, os), _cpuinfo(0), _memMax(0)
+{
+    setCpuInfo(System::info().createCpuInfo());
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ProgressTimerAndSystem::~ProgressTimerAndSystem ()
+{
+    setCpuInfo (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimerAndSystem::fillBuffer (double elapsed)
+{
+    /** We get the memory used by the current process. */
+    u_int64_t mem = System::info().getMemorySelfUsed() / 1024;
+    if (_memMax<mem)  { _memMax=mem; }
+
+    u_int64_t memMaxProcess = System::info().getMemorySelfMaxUsed() / 1024;
+
+    /** We format the string to be displayed. */
+    char tmp[128];
+    snprintf (tmp, sizeof(tmp), "   cpu: %5.1f %%   mem: [%4lu, %4lu, %4lu] MB ",
+        _cpuinfo->getUsage(),
+        mem, _memMax, memMaxProcess
+    );
+
+    /** We call the parent method. */
+    ProgressTimer::fillBuffer (elapsed);
+
+    /** We concat to the final buffer. */
+    strcat (buffer, tmp);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ProgressTimerAndSystem::postInit ()
+{
+    _cpuinfo->start();
+    _memMax = 0;
+
+    ProgressTimer::postInit ();
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Progress.hpp b/gatb-core/src/gatb/tools/misc/impl/Progress.hpp
new file mode 100644
index 0000000..8946016
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Progress.hpp
@@ -0,0 +1,279 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Progress.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Progress feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_PROGRESS_HPP_
+#define _GATB_CORE_TOOLS_MISC_PROGRESS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <string>
+#include <iostream>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Null implementation of IteratorListener.
+ */
+class ProgressNone : public dp::IteratorListener
+{
+public:
+    /** Constructor. */
+    ProgressNone (u_int64_t ntasks=0, const char* msg=0) {}
+};
+
+/********************************************************************************/
+
+/** \brief Progress information display feature.
+ *
+ * This class is used to display some progression information, for instance during
+ * the iteration of an iterator.
+ *
+ * It provides 3 methods that are supposed to be called by the progressing job:
+ *      - init   : called at the beginning of the job
+ *      - finish : called at the end of the job
+ *      - inc    : called to notify some amount of job being done
+ *
+ * It can be used as this by the SubjectIterator class that encapsulates an iterator
+ * and calls some functor for notifying progress information.
+ *
+ * This implementation merely dumps '-' characters as progression goes on.
+ *
+ * \see gatb::tools::dp::impl::SubjectIterator
+ */
+class Progress : public dp::IteratorListener
+{
+public:
+
+    /** Constructor.
+     * \param[in] ntasks : nb of items to be processed
+     * \param[in] msg : message to be displayed
+     * \param[in] os  : output stream where progress information is to be displayed
+     */
+    Progress (u_int64_t ntasks, const char * msg, std::ostream& os=std::cerr);
+
+    /** Destructor. */
+    virtual ~Progress () {}
+
+    /** Initialization of the object. */
+    void init ();
+
+    /** Finish the progress information. */
+    void finish ();
+
+    /** Increase the number of currently done tasks.
+     * \param[in] ntasks_done : amount of job done before previous call. */
+    void inc (u_int64_t ntasks_done);
+
+    /** Set the current number of tasks done.
+     * \param[in] ntasks_done :  sets the current number of job done. */
+    void set (u_int64_t ntasks_done);
+
+    /** We reinitialize the progress object. */
+    void reset (u_int64_t ntasks);
+
+    /** \copydoc dp::IteratorListener::setMessage*/
+    void setMessage (const std::string& msg);
+
+protected:
+
+    virtual void update     (bool force);
+    virtual void postInit   ();
+    virtual void postFinish ();
+
+    std::string   message;
+    u_int64_t     done;
+    u_int64_t     todo;
+    int           subdiv ; // progress printed every 1/subdiv of total to do
+    double        partial;
+    double        steps ; //steps = _todo/subidv
+    std::ostream& os;
+    char          buffer[512];
+
+    friend class ProgressProxy;
+};
+
+/********************************************************************************/
+
+/** \brief Progress information display feature with timing information
+ *
+ * This is another way of dumping information progressing, that provides information
+ * such as the elapsed time and an estimation of the remaining time.
+ */
+class  ProgressTimer : public Progress
+{
+public:
+
+    /** Constructor.
+     * \param[in] ntasks : nb of items to be processed
+     * \param[in] msg : message to be displayed
+     * \param[in] os  : output stream where progress information is to be displayed
+     */
+    ProgressTimer (u_int64_t ntasks, const char* msg, std::ostream& os=std::cerr);
+
+    /** Initialization of the object. */
+    void init ()  { postInit (); }
+
+protected:
+
+    void update (bool force);
+    void postInit ();
+    void postFinish ();
+
+    virtual void fillBuffer (double elapsed);
+
+    system::ITime::Value  heure_debut;
+    system::ITime::Value  heure_actuelle;
+};
+
+/********************************************************************************/
+
+/** \brief Progress information display feature with timing and system information
+ */
+class  ProgressTimerAndSystem : public ProgressTimer
+{
+public:
+
+    /** Constructor.
+     * \param[in] ntasks : nb of items to be processed
+     * \param[in] msg : message to be displayed
+     * \param[in] os  : output stream where progress information is to be displayed
+     */
+    ProgressTimerAndSystem (u_int64_t ntasks, const char* msg, std::ostream& os=std::cerr);
+
+    /** Destructor. */
+    ~ProgressTimerAndSystem ();
+
+protected:
+
+    void postInit ();
+
+    virtual void fillBuffer (double elapsed);
+
+    system::ISystemInfo::CpuInfo* _cpuinfo;
+    void setCpuInfo (system::ISystemInfo::CpuInfo* cpuinfo)  { SP_SETATTR(cpuinfo); }
+
+    u_int64_t _memMax;
+};
+
+/********************************************************************************/
+
+/* \brief Proxy for Progress class  */
+class ProgressProxy : public dp::IteratorListener
+{
+public:
+
+    ProgressProxy ()  : _ref(0) {}
+
+    ProgressProxy (dp::IteratorListener* ref)  : _ref(0) { setRef(ref); }
+
+    ProgressProxy (const ProgressProxy& p) : _ref(0) { setRef(p._ref); }
+
+    ~ProgressProxy ()  { setRef(0); }
+
+    /** Initialization of the object. */
+    void init ()  { _ref->init(); }
+
+    /** Finish the progress information. */
+    void finish () { _ref->finish (); }
+
+    /** Increase the number of currently done tasks.
+     * \param[in] ntasks_done : amount of job done before previous call. */
+    void inc (u_int64_t ntasks_done)  { _ref->inc (ntasks_done); }
+
+    /** Set the current number of tasks done.
+     * \param[in] ntasks_done :  sets the current number of job done. */
+    void set (u_int64_t ntasks_done)  { _ref->set (ntasks_done); }
+
+    /** */
+    void reset (u_int64_t ntasks) { _ref->reset(ntasks); }
+
+    /** \copydoc dp::IteratorListener::setMessage*/
+    void setMessage (const std::string& msg)  { _ref->setMessage (msg); }
+
+    dp::IteratorListener* getRef() const  { return _ref; }
+
+private:
+    dp::IteratorListener* _ref;
+    void setRef (dp::IteratorListener* ref)  { SP_SETATTR(ref); }
+};
+
+/********************************************************************************/
+
+/* \brief Synchro for Progress class  */
+class ProgressSynchro : public ProgressProxy
+{
+public:
+
+    ProgressSynchro () : _synchro(0)  {}
+
+    ProgressSynchro (dp::IteratorListener* ref, system::ISynchronizer* synchro)
+        : ProgressProxy (ref), _synchro(0)  { setSynchro(synchro); }
+
+    ProgressSynchro (const ProgressSynchro& p) : ProgressProxy(p.getRef()), _synchro(0)  {  setSynchro(p._synchro); }
+
+    ~ProgressSynchro ()  { setSynchro (0); }
+
+    /** \copydoc dp::IteratorListener::init */
+    void init ()  { system::LocalSynchronizer l(_synchro); ProgressProxy::init(); }
+
+    /** \copydoc dp::IteratorListener::finish */
+    void finish () { system::LocalSynchronizer l(_synchro); ProgressProxy::finish ();  }
+
+    /** \copydoc dp::IteratorListener::inc*/
+    void inc (u_int64_t ntasks_done)  { system::LocalSynchronizer l(_synchro);  ProgressProxy::inc (ntasks_done); }
+
+    /** \copydoc dp::IteratorListener::set*/
+    void set (u_int64_t ntasks_done)  { system::LocalSynchronizer l(_synchro);  ProgressProxy::set (ntasks_done); }
+
+    /** */
+    void reset (u_int64_t ntasks) { system::LocalSynchronizer l(_synchro);  ProgressProxy::reset(ntasks); }
+
+    /** \copydoc dp::IteratorListener::setMessage*/
+    void setMessage (const std::string& msg)  { system::LocalSynchronizer l(_synchro);  ProgressProxy::setMessage (msg); }
+
+private:
+
+    system::ISynchronizer* _synchro;
+    void setSynchro (system::ISynchronizer* synchro)  { SP_SETATTR(synchro); }
+};
+
+/********************************************************************************/
+
+/** We define a default class for progress information. */
+typedef ProgressTimerAndSystem  ProgressDefault;
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_PROGRESS_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Property.cpp b/gatb-core/src/gatb/tools/misc/impl/Property.cpp
new file mode 100644
index 0000000..d1f8687
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Property.cpp
@@ -0,0 +1,1024 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/XmlReader.hpp>
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <sstream>
+#include <fstream>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::dp;
+
+#define PROP_BUFFER_SIZE (2*1024)
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+class InsertionVisitor : public IPropertiesVisitor
+{
+public:
+    InsertionVisitor (size_t depth, IProperties* ref, set<string> keys) : _depth(depth), _ref(ref), _keys (keys) {}
+    virtual ~InsertionVisitor() {}
+
+    void visitBegin () {}
+    void visitEnd   () {}
+
+    void visitProperty (IProperty* prop)
+    {
+        if (_ref &&  prop)
+        {
+            /** We add the prop only if there is not already an existing identical prop. */
+            if (_keys.find (prop->key) == _keys.end())
+            {
+                _ref->add ( prop->depth + _depth, prop->key, prop->value);
+            }
+        }
+    }
+private:
+    size_t       _depth;
+    IProperties* _ref;
+    set<string>  _keys;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Properties::Properties (const std::string& rootname)
+{
+    if (rootname.empty()==false)  { this->add (0, rootname); }
+    // if (!initfile.empty())  {   readFile (initfile);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Properties::Properties (const Properties& p)
+{
+    for (std::list<IProperty*>::const_iterator it = p._properties.begin(); it != p._properties.end(); it++)
+    {
+        this->add ((*it)->depth, (*it)->key, (*it)->value);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Properties::~Properties ()
+{
+    for (std::list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        delete *it;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Properties& Properties::operator= (const Properties& p)
+{
+    if (this != &p)
+    {
+        for (std::list<IProperty*>::const_iterator it = p._properties.begin(); it != p._properties.end(); it++)
+        {
+            this->add ((*it)->depth, (*it)->key, (*it)->value);
+        }
+    }
+    return *this;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperties* Properties::clone ()
+{
+    IProperties* result = new Properties ();
+
+    for (std::list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        result->add ((*it)->depth, (*it)->key, (*it)->value);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::accept (IPropertiesVisitor* visitor)
+{
+    visitor->visitBegin ();
+
+    for (std::list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        visitor->visitProperty (*it);
+    }
+
+    visitor->visitEnd ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperty* Properties::add (size_t depth, const std::string& aKey, const char* format, ...)
+{
+    IProperty* result = 0;
+
+    if (format != 0)
+    {
+        char buffer[PROP_BUFFER_SIZE];
+        va_list ap;
+        va_start (ap, format);
+        vsnprintf (buffer, sizeof(buffer), format, ap);
+        va_end (ap);
+
+        result = new IProperty (depth, aKey, buffer);
+        _properties.push_back (result);
+    }
+    else
+    {
+        result = new IProperty (depth, aKey, "");
+        _properties.push_back (result);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperty* Properties::add (size_t depth, const std::string& aKey, const std::string& aValue)
+{
+    IProperty* result = new IProperty (depth, aKey, aValue);
+    _properties.push_back (result);
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::add (size_t depth, IProperties* properties)
+{
+    if (properties)
+    {
+        LOCAL (properties);
+
+        /** We accept a visitor. */
+        set<string>  nokeys;
+        InsertionVisitor v (depth, this, nokeys);
+        properties->accept (&v);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::add (size_t depth, const IProperties& properties)
+{
+    /** We accept a visitor. */
+    set<string>  nokeys;
+    InsertionVisitor v (depth, this, nokeys);
+    ((IProperties&)properties).accept (&v);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::add (IProperty* prop, va_list args)
+{
+    if (prop != 0)
+    {
+        LOCAL (prop);
+        this->add (0, prop->key, prop->value);
+
+        for (IProperty* p = 0;  (p = va_arg(args, IProperty*)) != 0; )
+        {
+            LOCAL (p);
+            this->add (0, p->key, p->value);
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::merge (IProperties* properties)
+{
+    if (properties)
+    {
+        LOCAL (properties);
+
+        /** We accept a visitor. */
+        set<string>  nokeys;
+        InsertionVisitor v (0, this, this->getKeys());
+        properties->accept (&v);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperty* Properties::operator[] (const std::string& key)
+{
+    return get (key);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperty* Properties::get (const std::string& key) const
+{
+    IProperty* result = 0;
+
+    list<IProperty*>::const_iterator it = _properties.begin();
+
+    TokenizerIterator token (key.c_str(), ".");
+    for (token.first(); !token.isDone(); token.next())
+    {
+        result = getRecursive (token.item(), it);
+        if (!result) { break; }
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperty* Properties::getRecursive (const std::string& key, std::list<IProperty*>::const_iterator& it) const
+{
+    IProperty* result = 0;
+    for (; !result  &&  it != _properties.end(); it++)
+    {
+        if (key.compare ((*it)->key)==0)    { result = *it; }
+    }
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+std::string Properties::getStr (const std::string& key) const
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    return prop->getValue();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+int64_t Properties::getInt (const std::string& key) const
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    return prop->getInt();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+double Properties::getDouble (const std::string& key) const
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    return prop->getDouble();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::setStr (const std::string& key, const std::string& value)
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    prop->value = value;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::setInt (const std::string& key, const int64_t& value)
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    char buffer[64];
+    snprintf (buffer, sizeof(buffer), "%ld", value);
+
+    prop->value = buffer;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::setDouble (const std::string& key, const double& value)
+{
+    IProperty* prop = get (key);
+
+    if (prop == 0)  {  throw Exception ("Empty property '%s'", key.c_str());  }
+
+    char buffer[64];
+    snprintf (buffer, sizeof(buffer), "%f", value);
+
+    prop->value = buffer;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::readFile (const string& filename)
+{
+    /** We first check that the file exists. */
+    if (System::file().doesExist(filename) == true)
+    {
+        IFile* file = System::file().newFile (filename, "r");
+        if (file != 0)
+        {
+            char buffer[256];
+
+            while (file->gets (buffer, sizeof(buffer) ) != 0)
+            {
+                char* key = strtok (buffer, " \t\n");
+                if (key != 0  &&  isgraph(key[0]))
+                {
+                    char* value = key + strlen (key) + 1;
+
+                    for ( ;  value; ++value)  {  if (*value != ' '  &&  *value != '\t')  { break; }  }
+
+                    /** We remove the end of line. */
+                    value[strlen(value)-1] = 0;
+
+                    add (0, key, (value ? value : ""));
+                }
+            }
+
+            delete file;
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::dump (std::ostream& s) const
+{
+    /** We dump some execution information. */
+    RawDumpPropertiesVisitor visit (s);
+    ((Properties*)this)->accept (&visit);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::readXML (std::istream& stream)
+{
+    /** We create an XML reader. */
+    XmlReader reader (stream);
+
+    /** We create some specific observer class. */
+    class XmlObserver : public IObserver
+    {
+    public:
+        XmlObserver (Properties* ref) : _ref(ref), _depth(-1), _currentProperty(0)  {}
+
+        void update (EventInfo* evt, ISubject* subject)
+        {
+            XmlTagOpenEvent* e1 = dynamic_cast<XmlTagOpenEvent*> (evt);
+            if (e1)
+            {
+                /** We open a tag => increase the depth. */
+                _depth ++;
+
+                /** We add a property and keep a reference on it. */
+                _currentProperty = _ref->add (_depth, e1->_name.c_str(), _txt.c_str());
+
+                DEBUG (("XmlTagOpenEvent (%d): name=%s\n", _depth, e1->_name.c_str()));
+                return;
+            }
+
+            XmlTagCloseEvent* e2 = dynamic_cast<XmlTagCloseEvent*> (evt);
+            if (e2)
+            {
+                /** We close a tag => decrease the depth. */
+                _depth --;
+
+                DEBUG (("XmlTagCloseEvent(%d) : name=%s\n", _depth, e2->_name.c_str()));
+                return;
+            }
+
+            XmlTagTextEvent* e3 = dynamic_cast<XmlTagTextEvent*> (evt);
+            if (e3)
+            {
+                /** We find a text => set it to the current property.  */
+                if (_currentProperty)
+                {
+                    _currentProperty->value = e3->_txt;
+
+                    /** We don't want to bother with dummy text tag. */
+                    _currentProperty = NULL;
+                }
+
+                DEBUG (("XmlTagTextEvent (%d) : txt=%s\n", _depth, e3->_txt.c_str()));
+                return;
+            }
+        }
+
+    private:
+        Properties* _ref;
+        string      _name;
+        string      _txt;
+        int         _depth;
+        IProperty*  _currentProperty;
+    };
+
+    /** We remove all existing properties. */
+    for (std::list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)  {  delete *it;  }
+    _properties.clear ();
+
+    /** We attach this kind of observer to the reader. */
+    XmlObserver observer (this);
+    reader.addObserver (&observer);
+
+    /** We read the stream. */
+    reader.read ();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+std::list<IProperties*> Properties::map (const char* separator)
+{
+    list<IProperties*> result;
+#if 0
+    list <Iterator<char*>* > itList;
+
+    for (list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        itList.push_back (new TokenizerIterator ((*it)->getString(), separator));
+    }
+    DEBUG (("Properties::map : nbIt=%ld\n", itList.size() ));
+
+    CartesianIterator <char*> p (itList);
+
+    for (p.first(); ! p.isDone(); p.next())
+    {
+        list<char*>& current = p.currentItem();
+
+        IProperties* dup = this->clone();
+        result.push_back (dup);
+
+        list<char*>::iterator      itStr;
+        list<IProperty*>::iterator itProps;
+
+        for (itStr=current.begin(), itProps=_properties.begin();
+             itStr!=current.end() && itProps!=_properties.end();
+             itStr++, itProps++
+        )
+        {
+            if (*itStr != 0 && (*itProps)->value.compare(*itStr) != 0)
+            {
+                DEBUG (("key='%s'  current='%s'  new='%s'\n", (*itProps)->key.c_str(), (*itProps)->value.c_str(), (*itStr)));
+                dup->getProperty ((*itProps)->key)->value = *itStr;
+            }
+        }
+    }
+
+    /** Some cleanup. */
+    for (list<Iterator<char*>*>::iterator it = itList.begin(); it != itList.end(); it++)
+    {
+        delete *it;
+    }
+#endif
+    /** We return the result. */
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+set<string> Properties::getKeys ()
+{
+    set<string> result;
+
+    for (list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        result.insert (result.end(), (*it)->key);
+    }
+
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Properties::setToFront (const std::string& key)
+{
+    for (list<IProperty*>::iterator it = _properties.begin(); it != _properties.end(); it++)
+    {
+        if (key.compare ((*it)->key)==0)
+        {
+            /** We move the found key to the beginning of the container. */
+            _properties.splice (_properties.begin(), _properties, it);
+            break;
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+string Properties::getXML ()
+{
+    stringstream ss;
+    XmlDumpPropertiesVisitor v(ss, false);
+    this->accept (&v);
+    return ss.str();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+AbstractOutputPropertiesVisitor::AbstractOutputPropertiesVisitor (std::ostream& aStream)
+    : _stream(0)
+{
+    /** A stream is provided, we keep a reference on it. */
+    _stream = &aStream;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+AbstractOutputPropertiesVisitor::AbstractOutputPropertiesVisitor (const std::string& filename)
+    : _stream(0), _filename(filename)
+{
+    if (_filename.empty() == false)
+    {
+        /** We create a file. */
+        _stream = new fstream (_filename.c_str(), ios::out);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+AbstractOutputPropertiesVisitor::~AbstractOutputPropertiesVisitor ()
+{
+    if (_filename.empty() == false)
+    {
+        delete _stream;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XmlDumpPropertiesVisitor::XmlDumpPropertiesVisitor (
+    const std::string& filename,
+    bool propertiesAsRoot,
+    bool shouldIndent
+)
+    : AbstractOutputPropertiesVisitor (filename),
+      _name (propertiesAsRoot ? "properties" : ""), _deltaDepth(0), _firstIndent(true), _shouldIndent(shouldIndent)
+{
+    /** We add the initial tag. */
+    if (_name.empty() == false)
+    {
+        indent (0);
+        safeprintf ("<%s>", _name.c_str());
+    }
+
+    _deltaDepth = _name.empty() == false ? 0 : 1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XmlDumpPropertiesVisitor::XmlDumpPropertiesVisitor (
+    std::ostream& aStream,
+    bool propertiesAsRoot,
+    bool shouldIndent
+)
+    : AbstractOutputPropertiesVisitor (aStream),
+      _name (propertiesAsRoot ? "properties" : ""), _deltaDepth(0), _firstIndent(true), _shouldIndent(shouldIndent)
+{
+    /** We add the initial tag. */
+    if (_name.empty() == false)
+    {
+        indent (0);
+        safeprintf ("<%s>", _name.c_str());
+    }
+
+    _deltaDepth = _name.empty() == false ? 0 : 1;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XmlDumpPropertiesVisitor::~XmlDumpPropertiesVisitor ()
+{
+    /** We add the final tag. */
+    if (_name.empty() == false)
+    {
+        indent (0);
+        safeprintf ("</%s>", _name.c_str());
+    }
+
+    safeprintf ("\n");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::visitBegin ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::visitEnd ()
+{
+    /** We dump the remaining tags. */
+    pop (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::visitProperty (IProperty* prop)
+{
+    if (prop != 0)
+    {
+        size_t actualDepth = prop->depth + 1;
+
+        DEBUG (("XmlDumpPropertiesVisitor::visitProperty:  actualDepth=%ld stack.size=%ld '%s' \n",
+            actualDepth, _stack.size(), prop->key.c_str()
+        ));
+
+        if (actualDepth > _stack.size())
+        {
+            indent (actualDepth);
+            safeprintf ("<%s>%s", prop->key.c_str(), prop->value.c_str());
+            _stack.push (prop->key);
+        }
+
+        else if (actualDepth == _stack.size())
+        {
+            safeprintf ("</%s>", _stack.top().c_str());
+            _stack.pop();
+
+            indent (actualDepth);
+            safeprintf ("<%s>%s",  prop->key.c_str(),  prop->value.c_str() );
+            _stack.push (prop->key);
+        }
+
+        else
+        {
+            pop (actualDepth);
+
+            indent (actualDepth);
+            safeprintf ("<%s>%s",  prop->key.c_str(),  prop->value.c_str() );
+            _stack.push (prop->key);
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::pop (size_t depth)
+{
+    safeprintf ("</%s>", _stack.top().c_str());
+    _stack.pop();
+
+    while (_stack.size() >= depth && !_stack.empty())
+    {
+        indent (_stack.size());
+        safeprintf ("</%s>", _stack.top().c_str());
+        _stack.pop();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::indent (size_t n)
+{
+    if (!_shouldIndent)  { return; }
+
+    if (!_firstIndent)  {  safeprintf ("\n");  }
+
+    for (size_t i=1; i<=(n-_deltaDepth); i++)  {  safeprintf ("   ");  }
+
+    _firstIndent = false;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlDumpPropertiesVisitor::safeprintf (const char* format, ...)
+{
+    /** A safe printf method that check that the output file is ok. */
+    if (_stream != 0)
+    {
+        char buffer[PROP_BUFFER_SIZE];
+
+        va_list ap;
+        va_start (ap, format);
+        vsnprintf (buffer, sizeof(buffer), format, ap);
+        va_end (ap);
+
+        (*_stream) << buffer;
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+RawDumpPropertiesVisitor::RawDumpPropertiesVisitor (std::ostream& os, int width, char sep)
+    : _os(os), _width(width), _sep(sep)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+RawDumpPropertiesVisitor::~RawDumpPropertiesVisitor ()
+{
+    _os.flush();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void RawDumpPropertiesVisitor::visitProperty (IProperty* prop)
+{
+    int width = _width;
+
+    char buffer[1024];
+
+    string indent;
+    for (size_t i=0; i<prop->depth; i++)  { indent += "    "; }
+
+    if (prop->getValue().empty() == false)
+    {
+        snprintf (buffer, sizeof(buffer), "%s%-*s %c %s\n", indent.c_str(), width, prop->key.c_str(), _sep, prop->value.c_str());
+    }
+    else
+    {
+        snprintf (buffer, sizeof(buffer), "%s%-*s\n", indent.c_str(), width, prop->key.c_str());
+    }
+
+    _os << buffer;
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Property.hpp b/gatb-core/src/gatb/tools/misc/impl/Property.hpp
new file mode 100644
index 0000000..417528e
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Property.hpp
@@ -0,0 +1,299 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Property.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Progress feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_PROPERTY_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_PROPERTY_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/api/IProperty.hpp>
+
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stack>
+#include <cstdio>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of IProperties interface.
+ *
+ *   This class provides a constructor that can read a file holding properties as [key,value] entries
+ *   (one per line). This is useful for instance for managing a configuration file.
+ *
+ * Sample of use:
+ * \code
+ * void sample ()
+ * {
+ *      // we create a IProperties instance.
+ *      IProperties* props = new Properties ();
+ *
+ *      // we add some entries. Note the different depth used: we have a root property having 3 children properties.
+ *      props->add (0, "root", "");
+ *      props->add (1, "loud",   "len=%d", 3);
+ *      props->add (1, "louder", "great");
+ *      props->add (1, "stop",   "[x,y]=[%f,%f]", 3.14, 2.71);
+ *
+ *      // we create some visitor for dumping the props into a XML file
+ *      IPropertiesVisitor* v = new XmlDumpPropertiesVisitor ("/tmp/test.xml");
+ *
+ *      // we accept the visitor; after that, the output file should have been created.
+ *      props->accept (v);
+ * }
+ * \endcode
+ */
+class Properties : public IProperties
+{
+public:
+
+    /** Constructor. If a file path is provided, it tries to read [key,value] entries from this file.
+     * \param[in] rootname : the file (if any) to be read
+     */
+    Properties (const std::string& rootname = "");
+
+    /** Copy constructor. */
+    Properties (const Properties& p);
+
+    /** Destructor. */
+    virtual ~Properties ();
+
+    /** Affectation operator. */
+    Properties& operator= (const Properties& p);
+
+    /** \copydoc IProperties::accept */
+    void accept (IPropertiesVisitor* visitor);
+
+    /** \copydoc IProperties::add */
+    IProperty* add (size_t depth, const std::string& aKey, const char* format=0, ...);
+
+    /** \copydoc IProperties::add(size_t,const std::string&,const std::string&)  */
+    IProperty* add (size_t depth, const std::string& aKey, const std::string& aValue);
+
+    /** \copydoc IProperties::add(size_t,IProperties*)  */
+    void add (size_t depth, IProperties* prop);
+
+    /** \copydoc IProperties::add(size_t,IProperties*)  */
+    void  add (size_t depth, const IProperties& prop);
+
+    /**  */
+    void add (IProperty* p, va_list args);
+
+    /** \copydoc IProperties::merge  */
+    void  merge (IProperties* prop);
+
+    /** \copydoc IProperties::operator[]  */
+    IProperty* operator[] (const std::string& key);
+
+    /** \copydoc IProperties::get */
+    IProperty* get (const std::string& key) const ;
+
+    /** \copydoc IProperties::getStr */
+    std::string getStr    (const std::string& key) const ;
+
+    /** \copydoc IProperties::getInt */
+    int64_t     getInt    (const std::string& key) const ;
+
+    /** \copydoc IProperties::getDouble */
+    double      getDouble (const std::string& key) const ;
+
+    /** \copydoc IProperties::setStr */
+    void setStr    (const std::string& key, const std::string& value);
+
+    /** \copydoc IProperties::setInt */
+    void setInt    (const std::string& key, const int64_t& value);
+
+    /** \copydoc IProperties::setDouble */
+    void setDouble (const std::string& key, const double& value);
+
+    /** \copydoc IProperties::clone  */
+    IProperties* clone ();
+
+    /** \copydoc IProperties::map  */
+    std::list<IProperties*> map (const char* separator);
+
+    /** \copydoc IProperties::getKeys  */
+    std::set<std::string> getKeys ();
+
+    /** \copydoc IProperties::setToFront  */
+    void setToFront (const std::string& key);
+
+    /** Fill a Properties instance from an XML stream.
+     * \param[in] stream: the stream to be read (file, string...) */
+    void readXML (std::istream& stream);
+
+    /** Fill a Properties instance from an XML string.
+     * \param[in] xmlString: the XML string to be read (file, string...) */
+    void readXML (const std::string& xmlString)  {  std::stringstream ss;  ss << xmlString; readXML (ss);  }
+
+    /** \copydoc IProperties::getXML  */
+    std::string getXML ();
+
+    /* */
+    void dump (std::ostream& s) const;
+
+    /** Read a file holding [key,value] entries and add them through 'add' method.
+     * \param[in] file : the file to be read
+     */
+    void readFile (const std::string& file);
+
+private:
+
+    /** List of IProperty instances. */
+    std::list<IProperty*> _properties;
+
+    /* */
+    IProperty* getRecursive (const std::string& key, std::list<IProperty*>::const_iterator& it) const ;
+};
+
+/** Overload output stream operator. */
+inline std::ostream& operator<< (std::ostream& os, const Properties& props)  { props.dump(os); return os; }
+
+/********************************************************************************/
+
+/* Factorization of common stuf for IPropertiesVisitor implementations. */
+class AbstractOutputPropertiesVisitor : public IPropertiesVisitor
+{
+public:
+
+     AbstractOutputPropertiesVisitor (std::ostream& aStream);
+     AbstractOutputPropertiesVisitor (const std::string& filename);
+    ~AbstractOutputPropertiesVisitor ();
+
+protected:
+
+    std::ostream* _stream;
+    std::string   _filename;
+};
+
+/********************************************************************************/
+
+/** \brief XML serialization of a IProperties instance.
+ *
+ *  This kind of visitor serializes into a file the content of a IProperties instance.
+ *
+ *  The output format is XML; the 'depth' attribute of each IProperty instance is used
+ *  as a basis for building the XML tree.
+ */
+class XmlDumpPropertiesVisitor : public AbstractOutputPropertiesVisitor
+{
+public:
+
+    /** Constructor.
+     * \param[in] filename : uri of the file where to serialize the instance.
+     * \param[in] propertiesAsRoot
+     * \param[in] shouldIndent : tells whether we should use indentation
+     */
+    XmlDumpPropertiesVisitor (const std::string& filename, bool propertiesAsRoot=true, bool shouldIndent = true);
+
+    /** Constructor.
+     * \param[in] aStream : output stream
+     * \param[in] propertiesAsRoot
+     * \param[in] shouldIndent : tells whether we should use indentation
+     */
+    XmlDumpPropertiesVisitor (std::ostream& aStream, bool propertiesAsRoot=true, bool shouldIndent = true);
+
+    /** Desctructor. */
+    virtual ~XmlDumpPropertiesVisitor ();
+
+    /** \copydoc IPropertiesVisitor::visitBegin */
+    void visitBegin ();
+
+    /** \copydoc IPropertiesVisitor::visitEnd */
+    void visitEnd   ();
+
+    /** \copydoc IPropertiesVisitor::visitProperty */
+    void visitProperty (IProperty* prop);
+
+private:
+
+    /** The name of the serialization file. */
+    std::string             _name;
+
+    /** Some stack for XML production. */
+    std::stack<std::string> _stack;
+
+    /** */
+    int _deltaDepth;
+
+    /** Internals. */
+    void pop    (size_t depth);
+
+    /** Indentation of the XML file. */
+    void indent (size_t n);
+
+    bool _firstIndent;
+    bool _shouldIndent;
+
+    /** Method for writing into the file. */
+    void safeprintf (const char* format, ...);
+};
+
+/********************************************************************************/
+
+/** \brief Raw dump of a IProperties instance.
+ *
+ * This file format is simply a list of lines, with each line holding the key and the value
+ * (separated by a space character). Note that the depth information is lost.
+ *
+ * This kind of output is perfect for keeping properties in a configuration file for instance.
+ * This is used by a tool for its configuration file '.toolrc'
+ */
+class RawDumpPropertiesVisitor : public IPropertiesVisitor
+{
+public:
+
+    /** Constructor.
+     * \param os : output stream where the visitor can dump information. */
+    RawDumpPropertiesVisitor (std::ostream& os = std::cout, int width=40, char sep=':');
+
+    /** Desctructor. */
+    virtual ~RawDumpPropertiesVisitor ();
+
+    /** \copydoc IPropertiesVisitor::visitBegin */
+    void visitBegin () {}
+
+    /** \copydoc IPropertiesVisitor::visitEnd */
+    void visitEnd   () {}
+
+    /** \copydoc IPropertiesVisitor::visitProperty */
+    void visitProperty (IProperty* prop);
+
+private:
+    std::ostream& _os;
+    int _width;
+    char _sep;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_PROPERTY_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/StringLine.hpp b/gatb-core/src/gatb/tools/misc/impl/StringLine.hpp
new file mode 100644
index 0000000..35cdaac
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/StringLine.hpp
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file StringLine.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool framework
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_STRINGLINE_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_STRINGLINE_HPP_
+
+/********************************************************************************/
+
+#include <string>
+#include <gatb/tools/misc/impl/Stringify.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief String line formatter
+ */
+class StringLine
+{
+public:
+
+    static std::string format (const std::string& str)
+    {
+        using namespace std;
+        string spaces (getDefaultWidth(), ' ');
+        string result;
+
+        if (str.size() > spaces.size())  { result = str.substr (0,spaces.size()-getSplitWidth()) + string(getSplitWidth(),'.'); }
+        else                             { result = (str + spaces).substr (0,getDefaultWidth());  }
+
+        return result;
+    }
+
+    static std::string format (const char* fmt, ...)
+    {
+        /** We get the buffer from the ellipsis argument. */
+        va_list args;
+        va_start (args, fmt);
+        std::string result = StringLine::format(Stringify::format(fmt, args));
+        va_end (args);
+
+        /** We return the result. */
+        return result;
+    }
+
+    static size_t& getDefaultWidth () { static size_t value=40; return value; }
+    static void setDefaultWidth (size_t value) { getDefaultWidth() = value; }
+
+    static size_t& getSplitWidth () { static size_t value=3; return value; }
+    static void setSplitWidth (size_t value) { getDefaultWidth() = value; }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_STRINGLINE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Stringify.hpp b/gatb-core/src/gatb/tools/misc/impl/Stringify.hpp
new file mode 100644
index 0000000..9e00264
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Stringify.hpp
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Stringify.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool framework
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_STRINGIFY_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_STRINGIFY_HPP_
+
+/********************************************************************************/
+
+#if !defined(__CYGWIN__) && !defined(_GNU_SOURCE) // following https://github.com/cliffordwolf/icestorm/issues/50
+#define _GNU_SOURCE // for vasprintf
+#endif
+
+#include <string>
+#include <iostream>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gatb/system/api/Exception.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief String helper for using printf-like formats
+ *
+ * The Stringify class provides the \ref format method. Its prototype is the same
+ * as the printf function. As a result, it gives a string object holding the same
+ * text that the printf function would have produced.
+ *
+ * \code
+ *  cout << Stringify::format ("we got %d items which represents %f percent", 123, 57.3) << endl;
+ * \endcode
+ */
+class Stringify
+{
+public:
+
+    /** Generates a string object with a printf-like prototype.
+     * \param[in] fmt : the format of the string
+     * \param[in] ... : variable number of arguments
+     * \return the string
+     */
+    static std::string format (const char* fmt, ...)
+    {
+        va_list args;
+        va_start (args, fmt);
+        std::string res = Stringify::format(fmt, args);
+        va_end (args);
+
+        return res;
+    }
+
+    /** Generates a string object with a printf-like prototype.
+     * \param[in] fmt : the format of the string
+     * \param[in] args. : list of arguments
+     * \return the string
+     */
+    static std::string format (const char* fmt, va_list args)
+    {
+        char* buffer = 0;
+        int ret = vasprintf (&buffer, fmt, args);
+
+        if (ret > -1 && buffer != NULL)
+        {
+            std::string result (buffer);
+            free (buffer);
+            return result;
+        }
+        else
+        {
+            // Exception is not using Stringify::format or anything allocating memory
+            throw gatb::core::system::Exception("Stringify::format could not allocate memory");
+        }
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_STRINGIFY_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/TimeInfo.cpp b/gatb-core/src/gatb/tools/misc/impl/TimeInfo.cpp
new file mode 100644
index 0000000..561b700
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/TimeInfo.cpp
@@ -0,0 +1,181 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TimeInfo::TimeInfo () : _time(system::impl::System::time())
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TimeInfo::TimeInfo (system::ITime& aTime) : _time(aTime)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void TimeInfo::start (const char* name)
+{
+    _entriesT0 [name] = _time.getTimeStamp();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void TimeInfo::stop (const char* name)
+{
+    _entries [name] += _time.getTimeStamp() - _entriesT0 [name];
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TimeInfo& TimeInfo::operator+= (TimeInfo& ti)
+{
+    const std::map <std::string, u_int32_t>& entries = ti.getEntries();
+
+    for (map <string, u_int32_t>::const_iterator it = entries.begin(); it != ti.getEntries().end(); ++it)
+    {
+        _entries[it->first] += it->second;
+    }
+
+    return *this;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TimeInfo& TimeInfo::operator/= (size_t nb)
+{
+    for (map <string, u_int32_t>::const_iterator it = _entries.begin(); it != _entries.end(); ++it)
+    {
+        _entries[it->first] = (u_int32_t)  ((float)it->second / (float)nb);
+    }
+
+    return *this;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+const std::map <std::string, u_int32_t>& TimeInfo::getEntries ()
+{
+    return _entries;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+u_int32_t TimeInfo::getEntryByKey (const std::string& key)
+{
+    u_int32_t result = 0;
+    std::map <std::string, u_int32_t>::iterator  it = _entries.find (key);
+    if (it != _entries.end())  { result = it->second; }
+    return result;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+tools::misc::IProperties* TimeInfo::getProperties (const std::string& root)
+{
+    u_int32_t total = 0;
+
+    /** We first compute the aggregated time. */
+    std::map <std::string, u_int32_t>::const_iterator  it;
+    for (it = getEntries().begin(); it != getEntries().end();  it++)   {  total += it->second;  }
+
+    tools::misc::IProperties* props = new tools::misc::impl::Properties();
+
+    props->add (0, root, "%.3f", (double)total/1000.0);
+
+    for (it = getEntries().begin(); it != getEntries().end();  it++)
+    {
+        props->add (1, it->first.c_str(), "%.3f", (double)(it->second) / 1000.0);
+    }
+
+    return props;
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/TimeInfo.hpp b/gatb-core/src/gatb/tools/misc/impl/TimeInfo.hpp
new file mode 100644
index 0000000..149af79
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/TimeInfo.hpp
@@ -0,0 +1,185 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file TimeInfo.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool for time measurement feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_TIMETOOLS_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_TIMETOOLS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/misc/api/IProperty.hpp>
+#include <gatb/system/api/ITime.hpp>
+
+#include <map>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Tool for time statistics.
+ *
+ * This class provides methods for getting time information between two execution points.
+ *
+ * One can use a label for getting a specific time duration; it is possible later to get
+ * this duration by giving the label.
+ *
+ * Example of use:
+ * \code
+ void foo ()
+ {
+     TimeInfo t;
+
+     t.addEntry ("part1");
+     // do something here
+     t.stopEntry ("part1");
+
+     t.addEntry ("part2");
+     // do something here
+     t.stopEntry ("part2");
+
+     // now, we dump the duration of part1 and part2:
+     cout << "part1: " << t.getEntryByKey("part1") << "  "
+          << "part2: " << t.getEntryByKey("part2") << endl;
+ }
+ * \endcode
+  */
+class TimeInfo : public system::SmartPointer
+{
+public:
+
+    /** Default constructor. */
+    TimeInfo ();
+
+    /** Constructor taking a time factory.
+     * \param[in] aTime : the time factory to be used.
+     */
+    TimeInfo (system::ITime& aTime);
+
+    /** Get the start time for a given label.
+     * \param[in] name : the label
+     */
+    virtual void start (const char* name);
+
+    /** Get the stop time for a given label.
+     * \param[in] name : the label
+     */
+    virtual void stop (const char* name);
+
+    /** Merge the content of the current time info with the provided one.
+     * \param[in] ti : info to merged. */
+    TimeInfo& operator+= (TimeInfo& ti);
+
+    /** Didive the time (useful when gathered times from several threads).
+     * \param[in] nb : divisor. */
+    TimeInfo& operator/= (size_t nb );
+
+    /** Provides (as a map) all got durations for each known label/
+     * \return a map holding all retrieved timing information.
+     */
+    const std::map <std::string, u_int32_t>& getEntries ();
+
+    /** Retrieve the duration for a given label.
+     * \param[in] key : the label we want the duration for.
+     * \return the duration.
+     */
+    u_int32_t getEntryByKey (const std::string& key);
+
+    /** Retrieve the duration for a given label in seconds
+     * \param[in] key : the label we want the duration for.
+     * \return the duration.
+     */
+    double get (const std::string& key) { return (double)getEntryByKey(key) / 1000.0; }
+
+    /** Creates and return as a IProperties instance the whole timing information.
+     * \param[in] root : root name of the properties to be returned.
+     * \return the created IProperties instance.
+     */
+    virtual tools::misc::IProperties* getProperties (const std::string& root);
+
+private:
+
+    system::ITime&  _time;
+    std::map <std::string, u_int32_t>  _entriesT0;
+    std::map <std::string, u_int32_t>  _entries;
+};
+
+/********************************************************************************/
+
+/** \brief Helper for time info statistics.
+ *
+ * This class allows to get the execution time within an instruction block.
+ *
+ * See also the TIME_INFO macro that eases its usage.
+ *
+ * Example:
+ * \code
+ void foo ()
+ {
+     TimeInfo t;
+
+     {
+         LocalTimeInfo local (t, "part1");
+
+         // do something here
+     }
+
+     // now, we dump the exec time of the instruction block enclosing the LocalTimeInfo instance
+     cout << "part1: " << t.getEntryByKey("part1") << "  " endl;
+ }
+ * \endcode
+ *
+ * */
+class LocalTimeInfo
+{
+public:
+
+    /** Constuctor
+     * \param[in] ti : time info object to be used
+     * \param[in] txt : key of the exec time to be got
+     */
+    LocalTimeInfo (TimeInfo& ti, const std::string& txt) : _ti(ti), _txt(txt)  {  _ti.start (_txt.c_str());  }
+
+    /** Destructor. */
+    ~LocalTimeInfo ()   {  _ti.stop (_txt.c_str());   }
+
+private:
+    TimeInfo&   _ti;
+    std::string _txt;
+};
+
+#define  TIME_INFO(ti,txt)  gatb::core::tools::misc::impl::LocalTimeInfo TimeInfoTmp##__LINE__(ti,txt)
+
+#define  TIME_START(ti,txt) gatb::core::tools::misc::impl::TimeInfo ti;  { ti.start (txt);
+#define  TIME_STOP(ti,txt)   ti.stop(txt); }
+
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_TIMETOOLS_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Tokenizer.cpp b/gatb-core/src/gatb/tools/misc/impl/Tokenizer.cpp
new file mode 100644
index 0000000..4dd0c01
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Tokenizer.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Tokenizer.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TokenizerIterator::TokenizerIterator (const char* text, const char* separator)
+    : _sep(separator), _text(0), _str(0), _loop(0), _save(0)
+{
+    DEBUG (("TokenizerIterator::TokenizerIterator: text='%s'  sep='%s'\n", text, separator));
+
+    if (text != 0)  { _text = strdup (text); }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+TokenizerIterator::~TokenizerIterator ()
+{
+    free (_text);
+    free (_str);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void TokenizerIterator::first()
+{
+    DEBUG (("TokenizerIterator::first\n"));
+
+    /** We init the _str attribute. */
+    if (_str  != 0)  { free (_str); }
+    if (_text != 0)  {  _str = strdup (_text);  }
+
+    if (_str)  {  _loop = tok_r (_str, _sep.c_str(), &_save);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void TokenizerIterator::next()
+{
+    _loop = tok_r (NULL, _sep.c_str(), &_save);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS : Here because of lack of strtok_r in mingw32 distributions
+*********************************************************************/
+char* TokenizerIterator::tok_r (char* s, const char* delim, char** lasts)
+{
+    char* spanp = 0;
+    int c, sc;
+    char* tok = 0;
+
+    if (s == NULL && (s = *lasts) == NULL)  {  return (NULL);  }
+
+cont:
+    c = *s++;
+    for (spanp = (char *)delim; (sc = *spanp++) != 0;)  {  if (c == sc)  {  goto cont;  }  }
+
+    /* no non-delimiter characters */
+    if (c == 0)
+    {
+        *lasts = NULL;
+        return (NULL);
+    }
+
+    tok = s - 1;
+
+    /* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
+     * Note that delim must have one NUL; we stop if we see that, too.
+     */
+    for (;;)
+    {
+        c = *s++;
+        spanp = (char *)delim;
+        do
+        {
+            if ((sc = *spanp++) == c)
+            {
+                if (c == 0)
+                    s = NULL;
+                else
+                    s[-1] = 0;
+                *lasts = s;
+                return (tok);
+            }
+        } while (sc != 0);
+    }
+
+    return (NULL); /* NOTREACHED */
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Tokenizer.hpp b/gatb-core/src/gatb/tools/misc/impl/Tokenizer.hpp
new file mode 100644
index 0000000..326c2fc
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Tokenizer.hpp
@@ -0,0 +1,116 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Tokenizer.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief String Tokenizer
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_TOKENIZER_HPP_
+#define _GATB_CORE_TOOLS_MISC_TOKENIZER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/types.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief  String tokenizer as an Iterator.
+ *
+ *  Tool for tokenizing strings (like strtok) that follows our Iterator concept.
+ *
+ *  One should provide both the string to be tokenized and a string holding
+ *  characters to be considered as separators.
+ *
+ *  Code sample:
+ *  \code
+ *  void sample ()
+ *  {
+ *      // We create a tokenizer with spaces as separators.
+ *      TokenizerIterator it ("this is the text to tokenize", " ");
+ *
+ *      // We loop the iterator
+ *      for (it.first(); !it.isDone(); it.next())
+ *      {
+ *          // We get the current token
+ *          char* token = it.currentItem ();
+ *      }
+ *  }
+ *  \endcode
+ */
+class TokenizerIterator : public tools::dp::Iterator<char*>
+{
+public:
+
+    /** Constructors.
+     * \param text : the string to be tokenized.
+     * \param separator : the separator characters.
+     */
+    TokenizerIterator (const char* text, const char* separator);
+
+    /** Destructor. */
+    virtual ~TokenizerIterator ();
+
+    /** \copydoc tools::dp::Iterator::first */
+    void first();
+
+    /** \copydoc tools::dp::Iterator::next */
+    void next();
+
+    /** \copydoc tools::dp::Iterator::isDone */
+    bool isDone()  { return _loop == 0;  }
+
+    /** \copydoc tools::dp::Iterator::item */
+    char*& item()  {  return _loop;  }
+
+private:
+
+    /** String holding separator characters. */
+    std::string _sep;
+
+    /** Internal string. */
+    char* _text;
+
+    /** Internal string. */
+    char* _str;
+
+    /** Internal string. */
+    char* _loop;
+
+    /** Internal string. */
+    char* _save;
+
+    /** */
+    char* tok_r (char* s, const char* delim, char** lasts);
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_TOKENIZER_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/Tool.cpp b/gatb-core/src/gatb/tools/misc/impl/Tool.cpp
new file mode 100644
index 0000000..b9b8a74
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Tool.cpp
@@ -0,0 +1,431 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/Tool.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/LibraryInfo.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#define DEBUG(a)  //printf a
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Tool::Tool (const std::string& name) : userDisplayHelp(0), _helpTarget(0),userDisplayVersion(0), _versionTarget(0), _name(name), _input(0), _output(0), _info(0), _parser(0), _dispatcher(0)
+{
+    setOutput (new Properties());
+
+    setInfo  (new Properties());
+   // _info->add (0, _name);
+
+    /** We create an options parser. */
+    setParser (new OptionsParser(name));
+
+    getParser()->push_back (new OptionOneParam (STR_NB_CORES,    "number of cores",      false, "0"  ));
+    getParser()->push_back (new OptionOneParam (STR_VERBOSE,     "verbosity level",      false, "1"  ));
+	
+	getParser()->push_back (new OptionNoParam (STR_VERSION, "version", false));
+	getParser()->push_back (new OptionNoParam (STR_HELP, "help", false));
+
+	
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Tool::~Tool ()
+{
+    setInput      (0);
+    setOutput     (0);
+    setInfo       (0);
+    setParser     (0);
+    setDispatcher (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Tool::displayVersion(std::ostream& os){
+	LibraryInfo::displayVersion (os);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperties* Tool::run (int argc, char* argv[])
+{
+    DEBUG (("Tool::run(argc,argv) => tool='%s'  \n", getName().c_str() ));
+    try
+    {
+        /** We parse the user parameters. */
+        IProperties* props = getParser()->parse (argc, argv);
+
+        /** We run the tool. */
+        return run (props);
+    }
+    catch (OptionFailure& e)
+    {
+        e.displayErrors (std::cout);
+        return NULL;
+    }
+	catch (ExceptionHelp& h)
+	{
+		if(userDisplayHelp!=NULL)
+		{
+			this->userDisplayHelp(_helpTarget);
+		}
+		else
+		{
+			h.displayDefaultHelp (std::cout);
+		}
+		return NULL;
+	}
+	catch (ExceptionVersion& v)
+	{
+		if(userDisplayVersion!=NULL)
+		{
+			this->userDisplayVersion(_versionTarget);
+		}
+		return NULL;
+	}
+	
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperties* Tool::run (IProperties* input)
+{
+    /** We keep the input parameters. */
+    setInput (input);
+
+    if (getInput()->get(STR_VERSION) != 0)
+    {
+    	displayVersion(cout);
+        return _output;
+    }
+
+    /** We define one dispatcher. */
+    if (_input->getInt(STR_NB_CORES) == 1)
+    {
+        setDispatcher (new SerialDispatcher ());
+    }
+    else
+    {
+        setDispatcher (new Dispatcher (_input->getInt(STR_NB_CORES)) );
+    }
+
+    /** We may have some pre processing. */
+    preExecute ();
+
+    /** We execute the actual job. */
+    {
+        //TIME_INFO (_timeInfo, _name);
+        execute ();
+    }
+
+    /** We may have some post processing. */
+    postExecute ();
+
+    /** We return the output properties. */
+    return _output;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Tool::preExecute ()
+{
+    /** We add a potential config file to the input properties. */
+    _input->add (1, new Properties (/*System::info().getHomeDirectory() + "/." + getName() */));
+
+    /** We may have to add a default prefix for temporary files. */
+//    if (_input->get(STR_PREFIX)==0)  { _input->add (1, STR_PREFIX, "tmp.");  }
+
+    /** set nb cores to be actual number of free cores, if was 0. */
+    if (_input->getInt(STR_NB_CORES)<=0)  { _input->setInt (STR_NB_CORES, System::info().getNbCores());  }
+
+//    /** We add the input properties to the statistics result. */
+//    _info->add (1, _input);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Tool::postExecute ()
+{
+//    /** We add the time properties to the output result. */
+//    _info->add (1, _timeInfo.getProperties ("time"));
+//
+//    /** We add the output properties to the output result. */
+//    _info->add (1, "output");
+//    _info->add (2, _output);
+
+    /** We may have to dump execution information into a stats file. */
+//    if (_input->get(STR_STATS_XML) != 0)
+//    {
+//        XmlDumpPropertiesVisitor visit (_info->getStr (STR_STATS_XML));
+//        _info->accept (&visit);
+//    }
+
+    /** We may have to dump execution information to stdout. */
+    if (_input->get(STR_VERBOSE) && _input->getInt(STR_VERBOSE) > 0)
+    {
+        RawDumpPropertiesVisitor visit;
+        _info->accept (&visit);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+dp::IteratorListener* Tool::createIteratorListener (size_t nbIterations, const char* message)
+{
+    switch (getInput()->getInt(STR_VERBOSE))
+    {
+        case 0: default:    return new IteratorListener ();
+        case 1:             return new ProgressTimer (nbIterations, message);
+        case 2:             return new Progress      (nbIterations, message);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ToolComposite::ToolComposite (const std::string& name) : Tool(name)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+ToolComposite::~ToolComposite ()
+{
+    for (list<Tool*>::iterator it = _tools.begin(); it != _tools.end(); it++)
+    {
+        (*it)->forget ();
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+IProperties* ToolComposite::run (int argc, char* argv[])
+{
+    vector<IProperties*> inputs;
+
+    /** We first parse the options for all tools. */
+    for (list<Tool*>::iterator it = _tools.begin(); it != _tools.end(); it++)
+    {
+#if 0
+        /** We get the parameters from the current parser. */
+        IProperties* input = (*it)->getParser()->parse (argc, argv);
+
+        /** We add the input into the vector that gather the tools inputs. */
+        inputs.push_back (input);
+#else
+
+        try
+        {
+            /** We parse the user parameters. */
+            (*it)->getParser()->parse (argc, argv);
+
+
+			IProperties* input =  (*it)->getParser()->getProperties() ;
+            /** We add the input into the vector that gather the tools inputs. */
+            inputs.push_back (input);
+        }
+        catch (OptionFailure& e)
+        {
+			IProperties* input =  (*it)->getParser()->getProperties() ;
+
+			/** We add the input into the vector that gather the tools inputs. */
+			inputs.push_back (input);
+			
+//            e.getParser().displayErrors (stdout);
+//            e.getParser().displayHelp   (stdout);
+//            return NULL;
+        }
+#endif
+    }
+
+    IProperties* output = 0;
+    size_t idx = 0;
+    for (list<Tool*>::iterator it = _tools.begin(); it != _tools.end(); it++, idx++)
+    {
+        /** We get the parameters from the current inputs entry. */
+        IProperties* input = inputs[idx];
+
+        /** We may have to add the output of the previous tool to the input of the current tool.
+         *  WARNING! The output of the previous tool should have a bigger priority than the
+         *  user parameters of the current tool.
+         */
+        IProperties* actualInput = 0;
+        if (output != 0)
+        {
+            actualInput = new Properties();
+            actualInput->add (1, output);   // output of the previous tool
+            actualInput->add (1, input);    // input  of the previous tool
+        }
+        else
+        {
+            actualInput = input;
+        }
+
+        /** We run the tool and get a reference on its output. */
+        output = (*it)->run (actualInput);
+
+        /** We add the current tool info to the global properties. */
+        _info->add (1, (*it)->getInfo());
+    }
+
+    /** We return the output properties. */
+    return _output;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ToolComposite::add (Tool* tool)
+{
+    if (tool)
+    {
+        tool->use ();
+        _tools.push_back(tool);
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ToolComposite::execute ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ToolComposite::preExecute ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void ToolComposite::postExecute ()
+{
+    /** We may have to dump execution information into a stats file. */
+//    if (_input->get(Tool::STR_STATS_XML) != 0)
+//    {
+//        XmlDumpPropertiesVisitor visit (_info->getStr (Tool::STR_STATS_XML), false);
+//        _info->accept (&visit);
+//    }
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/Tool.hpp b/gatb-core/src/gatb/tools/misc/impl/Tool.hpp
new file mode 100644
index 0000000..4714245
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/Tool.hpp
@@ -0,0 +1,319 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Tool.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Tool framework
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_TOOL_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_TOOL_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/api/ICommand.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/collections/api/Iterable.hpp>
+#include <gatb/tools/misc/api/IProperty.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+#include <gatb/tools/misc/impl/OptionsParser.hpp>
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+
+#include <string>
+#include <list>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Framework abstract class for implementing tools (ie. binary tools).
+ *
+ * This class provides facilities for:
+ *  - parsing command line
+ *  - dispatching work on several threads
+ *  - getting execution times
+ *  - gathering statistics information
+ *
+ * The Tool sub classes must implement the execute method; this is the place where
+ * the actual job of the tool has to be done.
+ *
+ * If the tool is launch with the run method and the famous [argc,argv] couple,
+ * the command line [argc,argv] is parsed through an options parser and the recognized
+ * options are available through the getInput method.
+ *
+ * The option parser should be configured (ie. adding specific options) during the constructor
+ * of the Tool sub class. By default, some default options are attached to the Tool options
+ * parser; for instance :
+ *      - "-nb-cores" is available and enables to set the number of cores that can be used by the tool.
+ *      - "-verbose" is available and can be used for having progress bar while iterating iterators.
+ *
+ * A dispatcher is available with the getDispatcher method. This dispatcher may have been
+ * configured (ie. set the number of available cores) during the constructor.
+ *
+ * Example:
+ * \snippet ToyTool.cpp  snippet1
+ *
+ * \see Algorithm
+ */
+class Tool : public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] name: name of the tool. */
+    Tool (const std::string& name);
+
+    /** Destructor. */
+    virtual ~Tool ();
+
+    /** Get tool name
+     * \return the tool name. */
+    std::string getName () const  { return _name; }
+
+    /** Run the tool with input parameters provided as a IProperties instance
+     * \param[in] input : input parameters
+     * \return the parsed options as a IProperties instance
+     */
+    virtual IProperties* run (IProperties* input);
+
+    /** Run the tool with input parameters provided as a couple [argc,argv]
+     * \param[in] argc : number of arguments
+     * \param[in] argv : array of arguments
+     * \return the parsed options as a IProperties instance
+     */
+    virtual IProperties* run (int argc, char* argv[]);
+
+    /** Subclasses must implement this method; this is where the actual job of
+     * the tool has to be done.
+     */
+    virtual void execute () = 0;
+
+    /** Get the parsed options as a properties instance
+     * \return the parsed options.
+     */
+    virtual IProperties*            getInput      ()  { return _input;      }
+
+    /** Get output results as a properties instance
+     * \return the output results
+     */
+    virtual IProperties*            getOutput     ()  { return _output;     }
+
+    /** Get statistics information about the execution of the tool
+     * \return the statistics
+     */
+    virtual IProperties*            getInfo       ()  { return _info;       }
+
+    /** Get an option parser configured with recognized options for the tool
+     * \return the options parser instance
+     */
+    virtual IOptionsParser*         getParser     ()  { return _parser;     }
+
+    /** Get a dispatched that can be used for parallelization. The option "-nb-cores" can
+     * be used, and thus the provided number is used for configuring the dispatcher.
+     * \return the dispatcher for the tool
+     */
+    virtual dp::IDispatcher*        getDispatcher ()  { return _dispatcher; }
+
+    /** Get a TimeInfo instance for the tool. This object can be used for gathering
+     * execution times of some parts of the \ref execute method.
+     * \return the time info instance.
+     */
+    virtual TimeInfo&               getTimeInfo   ()  { return _timeInfo;   }
+
+    /** Create an iterator for the given iterable. If the verbosity is enough, progress bar information
+     * can be displayed.
+     * \param[in] iterable : object that creates the iterator.
+     * \param[in] message : message used if progress information has to be displayed
+     * \return the created iterator.
+     */
+    template<typename Item> dp::Iterator<Item>* createIterator (collections::Iterable<Item>& iterable, const char* message=0)
+    {
+        int64_t nbItems = (iterable.getNbItems() >= 0 ? iterable.getNbItems() : iterable.estimateNbItems());
+        return createIterator (iterable.iterator(), nbItems, message);
+    }
+
+    /** Create an iterator for the given iterator. If the verbosity is enough, progress bar information
+     * can be displayed.
+     * \param[in] iter : object to be encapsulated by a potential progress information
+     * \param[in] nbIterations : number of iterations to be done.
+     * \param[in] message : message used if progress information has to be displayed
+     * \return the created iterator.
+     */
+    template<typename Item> dp::Iterator<Item>* createIterator (dp::Iterator<Item>* iter, size_t nbIterations=0, const char* message=0)
+    {
+        if (nbIterations > 0 && message != 0)
+        {
+            //  We create some listener to be notified every 1000 iterations and attach it to the iterator.
+            dp::impl::SubjectIterator<Item>* iterSubject = new dp::impl::SubjectIterator<Item> (iter, nbIterations/100);
+            iterSubject->addObserver (createIteratorListener (nbIterations, message));
+
+            /** We assign the used iterator to be the subject iterator. */
+            iter = iterSubject;
+        }
+
+        /** We return the result. */
+        return iter;
+    }
+
+    /** Creates an iterator listener according to the verbosity level.
+     * \param[in] nbIterations : number of iterations to be done
+     * \param[in] message : progression message
+     * \return an iterator listener.
+     */
+    virtual dp::IteratorListener* createIteratorListener (size_t nbIterations, const char* message);
+
+    /** Displays information about the GATB library
+     * \param[in] os : output stream used for dumping library information
+     */
+    virtual void displayVersion(std::ostream& os);
+
+	
+	
+	/* let the user provide its own function to display Help
+	 */
+	void setHelp(void (*user_Help)(void * target)) {     if(user_Help != NULL) userDisplayHelp = user_Help; }
+	void setHelpTarget(void * helpTarget) { _helpTarget = helpTarget;}
+
+	/* let the user provide its own function to display Version
+	 */
+	void setVersion(void (*user_Version)(void * target)) {     if(user_Version != NULL) userDisplayVersion = user_Version; }
+	void setVersionTarget(void * versionTarget) { _versionTarget = versionTarget;}
+
+	
+protected:
+
+    /** */
+    virtual void preExecute  ();
+    virtual void postExecute ();
+
+    /** Computes the uri from an uri (ie add a prefix if any). */
+    std::string getUriByKey (const std::string& key)  { return getUri (getInput()->getStr(key)); }
+
+    /** Computes the uri from an uri (ie add a prefix if any). */
+    std::string getUri (const std::string& str)  { return getInput()->getStr(STR_PREFIX) + str; }
+
+    /** Setters. */
+    void setInput      (IProperties*            input)       { SP_SETATTR (input);      }
+    void setOutput     (IProperties*            output)      { SP_SETATTR (output);     }
+    void setInfo       (IProperties*            info)        { SP_SETATTR (info);       }
+    void setParser     (IOptionsParser*         parser)      { SP_SETATTR (parser);     }
+    void setDispatcher (dp::IDispatcher*        dispatcher)  { SP_SETATTR (dispatcher); }
+
+protected:
+
+	
+	//pointer to function to display help
+	void (*userDisplayHelp)(void * target);
+	void * _helpTarget;
+	
+	//pointer to function to display help
+	void (*userDisplayVersion)(void * target);
+	void * _versionTarget;
+
+	
+    /** Name of the tool (set at construction). */
+    std::string _name;
+
+    IProperties* _input;
+
+    IProperties* _output;
+
+    IProperties* _info;
+
+    IOptionsParser* _parser;
+
+    dp::IDispatcher* _dispatcher;
+
+    /** */
+    TimeInfo _timeInfo;
+
+    friend class ToolComposite;
+};
+
+/********************************************************************************/
+
+/* DEPRECATED. */
+class ToolComposite : public Tool
+{
+public:
+
+    /** Constructor.
+     * \param[in] name: name of the tool. */
+    ToolComposite (const std::string& name = "tool");
+
+    /** */
+    ~ToolComposite ();
+
+    /** */
+    IProperties* run (int argc, char* argv[]);
+
+    /** */
+    void add (Tool* tool);
+
+private:
+
+    std::list<Tool*> _tools;
+
+    /** */
+    void execute ();
+    void preExecute  ();
+    void postExecute ();
+};
+
+/********************************************************************************/
+
+/* DEPRECATED. */
+class ToolProxy : public Tool
+{
+public:
+
+    /** */
+    ToolProxy (Tool* ref) : Tool("proxy"), _ref (ref)  {}
+
+    /** */
+    virtual IOptionsParser* getParser ()  {  return _ref->getParser();  }
+
+    /** */
+    virtual IProperties* getInput  ()  { return _ref->getInput();     }
+    virtual IProperties* getOutput ()  { return _ref->getOutput();    }
+    virtual IProperties* getInfo   ()  { return _ref->getInfo();      }
+
+    /** */
+    virtual dp::IDispatcher*    getDispatcher ()   { return _ref->getDispatcher(); }
+
+    /** */
+    virtual TimeInfo&    getTimeInfo ()   { return _ref->getTimeInfo (); }
+
+    /** */
+    Tool* getRef ()  { return _ref; }
+
+private:
+    Tool* _ref;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_TOOL_HPP_ */
diff --git a/gatb-core/src/gatb/tools/misc/impl/XmlReader.cpp b/gatb-core/src/gatb/tools/misc/impl/XmlReader.cpp
new file mode 100644
index 0000000..f85ee15
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/XmlReader.cpp
@@ -0,0 +1,302 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/misc/impl/XmlReader.hpp>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <algorithm>
+#include <iostream>
+#include <string>
+
+#define DEBUG(a)  printf a
+
+using namespace std;
+
+/********************************************************************************/
+namespace gatb {  namespace core { namespace tools {  namespace misc {  namespace impl {
+/********************************************************************************/
+
+enum State_e { TEXT, OPENING_TAG, TAG_NAME, ATTRIBUTE_NAME, ATTRIBUTE_VALUE };
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XmlReader::XmlReader (istream& is) : _is(is)
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+XmlReader::~XmlReader ()
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlReader::read ()
+{
+    processMainState (_is);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlReader::processMainState (std::istream& is)
+{
+    State_e s  = TEXT;
+
+    string text;
+
+    for (char c=is.get(); is.good(); c=is.get())
+    {
+        switch (s)
+        {
+            /************************************************************/
+            case TEXT:
+            {
+                switch (c)
+                {
+                    case '<':
+                    {
+                        s = OPENING_TAG;
+
+                        if (text.empty() == false)
+                        {
+                            /** We first normalize the text. */
+                            normalizeText (text);
+
+                            /** We send a notification. */
+                            notify (new XmlTagTextEvent (text));
+
+                            /** We clear the text. */
+                            text.clear ();
+                        }
+                        break;
+                    }
+
+                    default:
+                    {
+                        text.append (1, c);
+                        break;
+                    }
+                }
+                break;
+            }
+
+            /************************************************************/
+            case OPENING_TAG:
+            {
+                is.putback (c);
+                processTagState (is);
+                s = TEXT;
+                break;
+            }
+
+            /************************************************************/
+            default:
+            {
+                break;
+            }
+        };
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlReader::processTagState (std::istream& is)
+{
+    string tagName;
+    string attrName;
+    string attrValue;
+
+    bool isClosingTag = false;
+
+    State_e s = TAG_NAME;
+
+    for (char c=is.get(); is.good(); c=is.get())
+    {
+             if (c == '/')  {  isClosingTag = true;  }
+        else if (c == '>')
+        {
+            if (attrValue.empty() == false)
+            {
+                notify (new XmlTagAttributeEvent (attrName, attrValue));
+                attrValue.clear ();
+            }
+
+            if (tagName.empty() == false)
+            {
+                if (isClosingTag)   { notify (new XmlTagCloseEvent (tagName)); }
+                else                { notify (new XmlTagOpenEvent  (tagName)); }
+                tagName.clear ();
+            }
+            break;
+        }
+
+        else switch (s)
+        {
+            /************************************************************/
+            case TAG_NAME:
+            {
+                switch (c)
+                {
+                    case ' ':
+                    {
+                        s = ATTRIBUTE_NAME;
+                        if (tagName.empty() == false)
+                        {
+                            notify (new XmlTagOpenEvent (tagName));
+                            tagName.clear ();
+                        }
+                        break;
+                    }
+
+                    default:
+                    {
+                        tagName.append (1, c);
+                        break;
+                    }
+                }
+                break;
+            }
+
+            /************************************************************/
+            case ATTRIBUTE_NAME:
+            {
+                switch (c)
+                {
+                    case '=':
+                    {
+                        s = ATTRIBUTE_VALUE;
+                        break;
+                    }
+
+                    default:
+                    {
+                        attrName.append (1, c);
+                        break;
+                    }
+                }
+                break;
+            }
+
+            /************************************************************/
+            case ATTRIBUTE_VALUE:
+            {
+                switch (c)
+                {
+                    case ' ':
+                    {
+                        s = ATTRIBUTE_NAME;
+                        if (attrValue.empty() == false)
+                        {
+                            notify (new XmlTagAttributeEvent (attrName, attrValue));
+                            attrName.clear  ();
+                            attrValue.clear ();
+                        }
+                        break;
+                    }
+
+                    default:
+                    {
+                        if (c != '"')  {   attrValue.append (1, c);  }
+                        break;
+                    }
+                }
+                break;
+            }
+
+            default:
+            {
+                break;
+            }
+        }
+    }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlReader::normalizeText (std::string& s)
+{
+    std::replace (s.begin(), s.end(), '\n', ' ');
+
+    replace (s, "&",   "&");
+    replace (s, "<",    "<");
+    replace (s, ">",    ">");
+    replace (s, """,  "\"");
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void XmlReader::replace (std::string& str, const std::string& oldStr, const std::string& newStr)
+{
+  size_t pos = 0;
+  while((pos = str.find(oldStr, pos)) != std::string::npos)
+  {
+     str.replace(pos, oldStr.length(), newStr);
+     pos += newStr.length();
+  }
+}
+
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/misc/impl/XmlReader.hpp b/gatb-core/src/gatb/tools/misc/impl/XmlReader.hpp
new file mode 100644
index 0000000..a8ae656
--- /dev/null
+++ b/gatb-core/src/gatb/tools/misc/impl/XmlReader.hpp
@@ -0,0 +1,204 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file XmlReader.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief XML parsing
+ */
+
+#ifndef _GATB_CORE_TOOLS_MISC_IMPL_XML_READER_HPP_
+#define _GATB_CORE_TOOLS_MISC_IMPL_XML_READER_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/designpattern/impl/Observer.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace misc      {
+namespace impl      {
+/********************************************************************************/
+
+/* Root class for all XML events. Inherits from dp::EventInfo.
+ */
+class XmlEvent : public dp::EventInfo
+{
+public:
+    /** Constructor. */
+    XmlEvent () : dp::EventInfo(0) {}
+};
+
+/* XML event corresponding to a tag opening.
+ */
+class XmlTagOpenEvent : public XmlEvent
+{
+public:
+    /** Constructor.
+     * \param[in] name : name of the tag. */
+    XmlTagOpenEvent (const std::string& name) : _name(name) {}
+
+    /** Tag name*/
+    std::string _name;
+};
+
+/* XML event corresponding to a tag closing.
+ */
+class XmlTagCloseEvent : public XmlEvent
+{
+public:
+    /** Constructor.
+     * \param[in] name : name of the tag. */
+    XmlTagCloseEvent (const std::string& name) : _name(name) {}
+
+    /** Tag name*/
+    std::string _name;
+};
+
+/* XML event corresponding to a text
+ */
+class XmlTagTextEvent : public XmlEvent
+{
+public:
+    /** Constructor.
+     * \param[in] txt : found text. */
+    XmlTagTextEvent (const std::string& txt) : _txt(txt) {}
+
+    /** The found text. */
+    std::string _txt;
+};
+
+/* XML event corresponding to an attribute
+ */
+class XmlTagAttributeEvent : public XmlEvent
+{
+public:
+    /** Constructor.
+     * \param[in] name : name of the attribute
+     * \param[in] value : value of the attribute
+     */
+    XmlTagAttributeEvent (const std::string& name, const std::string& value)
+        : _name(name), _value(value) {}
+
+    /** Name of the attribute. */
+    std::string _name;
+
+    /** Value of the attribute. */
+    std::string _value;
+};
+
+/********************************************************************************/
+
+/** \brief Simple implementation of an XML (SAX) parser
+ *
+ * This implementation considers that the reader is mainly a Subject, and therefore
+ * sends notification to potential listeners as its parsing goes on.
+ *
+ * Any attached observer is likely to receive instances of subclasses of XMLEvent, and
+ * has to do something in reaction.
+ *
+ * \code
+ * // We create some XML listener class
+ * class XmlListener : public IObserver
+ * {
+ * public:
+ *      void update (EventInfo* evt, ISubject* subject)
+ *      {
+ *          XmlTagOpenEvent* open = dynamic_cast<XmlTagOpenEvent*> (evt);
+ *          if (open)  {  cout << "open '" << open->_name << "'" << endl;  return;  }
+ *
+ *          XmlTagCloseEvent* close = dynamic_cast<XmlTagCloseEvent*> (evt);
+ *          if (close)  {  cout << "close '" << close->_name << "'" << endl;  return;  }
+ *
+ *          XmlTagTextEvent* text = dynamic_cast<XmlTagTextEvent*> (evt);
+ *          if (text)  {  cout << "text '" << text->_txt << "'" << endl;  return;  }
+ *
+ *          XmlTagAttributeEvent* attribute = dynamic_cast<XmlTagAttributeEvent*> (evt);
+ *          if (attribute)  {  cout << "attribute: name='" << attribute->_name << "'  value='" << attribute->_value << "'" << endl;  return;  }
+ *     }
+ * };
+ *
+ * void foo ()
+ * {
+ *      // We define some input stream holding an XML string
+ *      stringstream is (stringstream::in | stringstream::out);
+ *      is << "<properties><progression><exec_percentage>100</exec_percentage><nb_alignments>4257</nb_alignments></progression>properties>";
+ *
+ *      // We create a reader with our input stream.
+ *      XmlReader reader (is);
+ *
+ *      // We instantiate one observer
+ *       IObserver* listener = new XmlListener();
+ *
+ *      // We attach the listener to the reader
+ *      reader.addObserver (listener);
+ *
+ *      // We read the XML stream
+ *      reader.read();
+ *
+ *      // We detach the listener from the reader.
+ *      reader.removeObserver (listener);
+ *  }
+ * \endcode
+ *
+ * \see XmlTagOpenEvent
+ * \see XmlTagCloseEvent
+ * \see XmlTagTextEvent
+ * \see XmlTagAttributeEvent
+ */
+class XmlReader : public dp::impl::Subject
+{
+public:
+
+    /** Constructor.
+     * \param[in] is : the input stream containing the XML stream. */
+    XmlReader (std::istream& is);
+
+    /** Destructor. */
+    virtual ~XmlReader();
+
+    /** Parse the input stream and possibly sends notifications to potential observers.
+     */
+    void read ();
+
+private:
+
+    /** */
+    std::istream& _is;
+
+    /** */
+    void processMainState (std::istream& is);
+    void processTagState  (std::istream& is);
+
+    /** */
+    void normalizeText (std::string& s);
+
+    /** */
+    void replace (std::string& str, const std::string& oldStr, const std::string& newStr);
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_MISC_IMPL_XML_READER_HPP_ */
+
diff --git a/gatb-core/src/gatb/tools/storage/api/ICell.hpp b/gatb-core/src/gatb/tools/storage/api/ICell.hpp
new file mode 100644
index 0000000..d9bdfcf
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/api/ICell.hpp
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file ICell.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Node
+ */
+
+#ifndef _GATB_CORE_STORAGE_ICELL_HPP_
+#define _GATB_CORE_STORAGE_ICELL_HPP_
+
+/********************************************************************************/
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <string>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+/********************************************************************************/
+
+/** \brief Interface to be used for storage feature.
+ *
+ * This interface defines a few methods for hierarchical management of entities
+ * that can be stored (likely in file system).
+ */
+class ICell : public virtual system::ISmartPointer
+{
+public:
+
+    /** Destructor. */
+    virtual ~ICell() {}
+
+    /** Get the parent node (if any).
+     * \return the parent node. */
+    virtual ICell* getParent () const = 0;
+
+    /** Return the identifier of the node.
+     * \return the id of the node. */
+    virtual const std::string& getId () const = 0;
+
+    /** Return the full identifier (like a path "x.y.z")
+     * \param[in] sep : separator character for the path string
+     * \return the full identifier. */
+    virtual std::string getFullId (char sep='.') const = 0;
+
+    /** Physically remove the node. */
+    virtual void remove () = 0;
+
+    /** Get the root of the given cell
+     * \param[in] cell : the cell we want to get the root
+     * \return the root of the given cell  */
+    static ICell* getRoot (ICell* cell)
+    {
+        ICell* loop=0;  for (loop=cell ; loop && loop->getParent() != 0;  loop=loop->getParent())  {}
+        return loop;
+    }
+
+    /** Set the compression level (if supported)
+     * \param[in] level : from 0 (no compression) to 9 (best compression). */
+    virtual void setCompressLevel (int level) = 0;
+
+    /** Get the compression level
+     * \return the compression level. */
+    virtual int getCompressLevel () const = 0;
+};
+
+/********************************************************************************/
+} } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_STORAGE_ICELL_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/Cell.hpp b/gatb-core/src/gatb/tools/storage/impl/Cell.hpp
new file mode 100644
index 0000000..d3ed041
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/Cell.hpp
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Cell.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Implementation of INode interface
+ */
+
+#ifndef _GATB_CORE_STORAGE_CELL_HPP_
+#define _GATB_CORE_STORAGE_CELL_HPP_
+
+#include <gatb/tools/storage/api/ICell.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Partial implementation of the INode interface
+ *
+ * The 'remove' method is still abstract.
+ */
+class Cell : public virtual ICell, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    Cell (ICell* parent, const std::string& id)  : _parent(0), _id(id), _compressLevel(0)
+	{
+    	setParent(parent);
+    	if (_parent != 0)  { _compressLevel = _parent->getCompressLevel(); }
+	}
+
+    /** Destructor. */
+    ~Cell ()   {  setParent(0);  }
+
+    /** \copydoc ICell::getParent  */
+    ICell* getParent () const { return _parent; }
+
+    /** \copydoc ICell::getId  */
+    const std::string& getId ()  const { return _id; }
+
+    /** \copydoc ICell::getFullId  */
+    std::string getFullId (char sep='.') const
+    {
+        if (_parent != 0)   {  return _parent->getId().empty()==false ? _parent->getId() + sep + getId() : getId();  }
+        else                {  return getId();  }
+    }
+
+    /** \copydoc ICell::setCompressLevel  */
+    void setCompressLevel (int level)  { _compressLevel = level; }
+
+    /** \copydoc ICell::getCompressLevel  */
+    int getCompressLevel () const  { return _compressLevel; }
+
+private:
+
+    ICell* _parent;
+    void setParent (ICell* parent)  {  _parent = parent;  }
+
+    std::string _id;
+
+    int _compressLevel;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_STORAGE_CELL_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/CollectionFile.hpp b/gatb-core/src/gatb/tools/storage/impl/CollectionFile.hpp
new file mode 100644
index 0000000..dbebbb0
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/CollectionFile.hpp
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file CollectionFile.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_FILE_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_FILE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/CollectionAbstract.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+#include <vector>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of the Collection interface with a file.
+ *
+ * This implementation reads/writes Item objects in a file.
+ */
+template <class Item> class CollectionFile : public collections::impl::CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    CollectionFile (const std::string& filename, size_t cacheItemsNb=10000)
+        : collections::impl::CollectionAbstract<Item> (
+             new collections::impl::BagFile<Item>(filename),
+             new collections::impl::IterableFile<Item>(filename, cacheItemsNb)
+             /* Note (Rayan): this isn't very clean. Two files objectss are opened, one by BagFile (in write mode) and one in IterableFile (in read mode).
+              * With Clang/OSX, turns out the IterableFile was created before BagFile, causing some troubles.
+              * Also this is opening the file twice, not nice. Anyway until I think of a better system, it's kept as it is, and IterableFile does a small hack*/
+          ),  _name(filename)
+    {}
+
+    /** Destructor. */
+    virtual ~CollectionFile() {}
+
+    /** \copydoc tools::collections::Collection::remove */
+    void remove ()  {  gatb::core::system::impl::System::file().remove (_name);  }
+
+private:
+
+    std::string _name;
+};
+
+/********************************************************************************/
+/* Experimental (not documented). */
+template <class Item> class CollectionGzFile : public collections::impl::CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor. */
+    CollectionGzFile (const std::string& filename, size_t cacheItemsNb=10000)
+    : collections::impl::CollectionAbstract<Item> (
+                                                   new collections::impl::BagGzFile<Item>(filename),
+                                                   new collections::impl::IterableGzFile<Item>(filename, cacheItemsNb)
+                                                   ),  _name(filename)
+    {}
+    
+    /** Destructor. */
+    virtual ~CollectionGzFile() {}
+    
+    /** \copydoc tools::collections::Collection::remove */
+    void remove ()  {  gatb::core::system::impl::System::file().remove (_name);  }
+    
+private:
+    
+    std::string _name;
+};
+  
+/********************************************************************************/
+/* Experimental (not documented). */
+template <class Item> class CollectionCountFile : public collections::impl::CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+    
+    /** Constructor. */
+    CollectionCountFile (const std::string& filename, size_t cacheItemsNb=10000)
+    : collections::impl::CollectionAbstract<Item> (
+                                                   new collections::impl::BagCountCompressedFile<Item>(filename),
+                                                   new collections::impl::IterableCountCompressedFile<Item>(filename, cacheItemsNb)                                                    ),  _name(filename)
+    {}
+    
+    /** Destructor. */
+    virtual ~CollectionCountFile() {}
+    
+    /** \copydoc tools::collections::Collection::remove */
+    void remove ()  {  gatb::core::system::impl::System::file().remove (_name);  }
+    
+private:
+    
+    std::string _name;
+};
+    
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_FILE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5.hpp b/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5.hpp
new file mode 100644
index 0000000..2645abd
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5.hpp
@@ -0,0 +1,486 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file CollectionHDF5.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/CollectionAbstract.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+#include <vector>
+#include <stdarg.h>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Implementation of the Bag interface with a HDF5 file.
+ *
+ * This implementation writes Item objects in a HDF5 file.
+ */
+template <class Item> class BagHDF5 : public collections::Bag<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor.
+     * \param[in] datasetId : HDF5 identifier of the dataset acting as a Bag.
+     * \param[in] typeId : HDF5 type identifier for the Item type
+     * \param[in] nbItems : number of items
+     * \param[in] synchro : used to serialize concurrent read/write HDF5 operations.
+     */
+    BagHDF5 (hid_t datasetId, hid_t typeId, u_int64_t& nbItems, system::ISynchronizer* synchro)
+        : _datasetId(datasetId), _typeId(typeId), _nbInserted(0), _nbItems(nbItems), _synchro(synchro)
+    {
+    }
+
+    /** \copydoc collections::Bag::insert */
+    void insert (const Item& item) {  insert (&item, 1);  }
+
+    /** \copydoc collections::Bag::insert(const std::vector<Item>& items, size_t length) */
+    void insert (const std::vector<Item>& items, size_t length=0)  {  insert (items.data(), length==0 ? items.size() : length); }
+
+    /** \copydoc collections::Bag::insert(const Item* items, size_t length) */
+    void insert (const Item* items, size_t length)
+    {
+        if (items==0 || length==0)  { return; }
+        
+        herr_t status = 0;
+
+        system::LocalSynchronizer localsynchro (_synchro);
+
+        /** Resize the memory dataspace to indicate the new size of our buffer. */
+        hsize_t memDim = length;
+        hid_t memspaceId = H5Screate_simple (1, &memDim, NULL);
+
+        /** Extend dataset. */
+        hsize_t newDim = _nbInserted + length;
+        status = H5Dset_extent (_datasetId, &newDim);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dset_extent), status %d", status);  }
+
+        /** Select hyperslab on file dataset. */
+        hid_t filespaceId = H5Dget_space(_datasetId);
+        hsize_t start = _nbInserted;
+        hsize_t count = length;
+        status = H5Sselect_hyperslab (filespaceId, H5S_SELECT_SET, &start, NULL, &count, NULL);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sselect_hyperslab), status %d", status);  }
+
+        /** Append buffer to dataset */
+        status = H5Dwrite (_datasetId, _typeId, memspaceId, filespaceId, H5P_DEFAULT, items);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dwrite), status %d", status);  }
+
+        /** We increase the number of inserted items. */
+        _nbInserted += length;
+
+        __sync_fetch_and_add (&_nbItems, length);
+
+        /** Close resources. */
+        status = H5Sclose (filespaceId);
+        status = H5Sclose (memspaceId);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sclose), status %d", status);  }
+
+    }
+
+    /** \copydoc collections::Bag::flush */
+    void flush ()  {}
+
+private:
+
+    hid_t     _datasetId;
+    hid_t     _typeId;
+    u_int64_t _nbInserted;
+    u_int64_t& _nbItems;
+    system::ISynchronizer* _synchro;
+
+};
+
+/********************************************************************************/
+
+template<typename Item> class HDF5Iterator;
+
+template <class Item> class IterableHDF5 : public collections::Iterable<Item>, public system::SmartPointer
+{
+public:
+
+    /** */
+    IterableHDF5 (hid_t datasetId, hid_t typeId, u_int64_t& nbItems,     system::ISynchronizer* synchro)
+        :  _datasetId(datasetId), _typeId(typeId), _nbItems(nbItems), _synchro(synchro)  {}
+
+    /** */
+    ~IterableHDF5 ()  {}
+
+    /** */
+    dp::Iterator<Item>* iterator ()  {  return new HDF5Iterator<Item> (this);  }
+
+    /** */
+    int64_t getNbItems ()
+    {
+        return _nbItems;
+    }
+
+    /** */
+    int64_t estimateNbItems ()
+    {
+        return getNbItems();
+    }
+
+    /** */
+    Item* getItems (Item*& buffer)
+    {
+        //std::cout << "collectionHDF5 getItems called" << std::endl;
+        retrieveCache (buffer, 0, getNbItems());
+        return buffer;
+    }
+
+    size_t getItems (Item*& buffer, size_t start, size_t count)  { 
+        //std::cout << "collectionHDF5 getItems called" << std::endl;
+        return retrieveCache (buffer, start, count); }
+
+
+private:
+
+    hid_t _datasetId;
+    hid_t _typeId;
+    u_int64_t& _nbItems;
+    system::ISynchronizer* _synchro;
+
+
+    /** */
+    u_int64_t retrieveCache (Item* data, hsize_t start, hsize_t count)
+    {
+        herr_t status = 0;
+
+        if (start       > _nbItems)  { return 0;               }
+        if (start+count > _nbItems)  { count = _nbItems-start; }
+
+        system::LocalSynchronizer localsynchro (_synchro);
+
+        hid_t memspaceId = H5Screate_simple (1, &count, NULL);
+
+        /** Select hyperslab on file dataset. */
+        hid_t filespaceId = H5Dget_space(_datasetId);
+        status = H5Sselect_hyperslab (filespaceId, H5S_SELECT_SET, &start, NULL, &count, NULL);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sselect_hyperslab), status %d", status);  }
+
+        /** Read buffer from dataset */
+        status = H5Dread (_datasetId, _typeId, memspaceId, filespaceId, H5P_DEFAULT, data);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dread), status %d", status);  }
+
+        /** Close resources. */
+        status = H5Sclose (filespaceId);
+        status = H5Sclose (memspaceId);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sclose), status %d", status);  }
+
+        return count;
+    }
+
+    template<typename U>
+    friend class HDF5Iterator;
+};
+
+/********************************************************************************/
+
+/** */
+template<typename Item>
+class HDF5Iterator : public dp::Iterator<Item>
+{
+public:
+
+    /** */
+    HDF5Iterator ()  : _ref(0), _blockSize(0),
+         _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+         _nbRead(0), _memspaceId(0), _total(0)
+    {}
+
+    /** */
+    HDF5Iterator (const HDF5Iterator& it)
+    : _ref(it._ref), _blockSize(it._blockSize),
+        _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+        _nbRead(0), _memspaceId(0), _total(0)
+    {
+        _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+        memset (_data, 0, _blockSize*sizeof(Item));
+        _total = _ref->_nbItems;
+    }
+
+    /** */
+    HDF5Iterator (IterableHDF5<Item>* ref, size_t blockSize=4096)
+        : _ref(ref), _blockSize(blockSize),
+          _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+          _nbRead(0), _total(0), _memspaceId(0)
+    {
+        _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+        memset (_data, 0, _blockSize*sizeof(Item));
+
+        _total = _ref->_nbItems;
+    }
+
+    HDF5Iterator& operator= (const HDF5Iterator& it)
+    {
+        if (this != &it)
+        {
+            _ref        = it._ref;
+            _blockSize  = it._blockSize;
+            _dataSize   = it._dataSize;
+            _dataIdx    = it._dataIdx;
+            _isDone     = it._isDone;
+            _nbRead     = it._nbRead;
+            _memspaceId = it._memspaceId;
+            _total      = it._total;
+
+            if (_data)  { FREE (_data); }
+            _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+            memcpy (_data, it._data, _blockSize*sizeof(Item));
+        }
+        return *this;
+    }
+
+
+    /** */
+    ~HDF5Iterator()
+    {
+        if (_data)  { FREE (_data); }
+    }
+
+    void first()
+    {
+        _nbRead   = 0;
+        _dataIdx  = 0;
+        _dataSize = retrieveNextCache();
+        _isDone   = _dataIdx >= _dataSize;
+
+        if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+    }
+
+    void next()
+    {
+        _dataIdx++;
+        _isDone = _dataIdx >= _dataSize;
+        if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+        else
+        {
+            _dataIdx  = 0;
+            _dataSize = retrieveNextCache();
+            _isDone = _dataIdx >= _dataSize;
+            if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+        }
+    }
+
+    bool isDone()
+    {
+        return _isDone;
+    }
+
+    Item& item ()  { return *this->_item; }
+
+private:
+    IterableHDF5<Item>* _ref;
+    size_t        _blockSize;
+
+    Item*     _data;
+    u_int64_t _dataSize;
+    u_int64_t _dataIdx;
+
+    bool _isDone;
+
+    u_int64_t     _nbRead;
+    u_int64_t     _total;
+
+    hid_t _memspaceId;
+
+    u_int64_t retrieveNextCache ()
+    {
+        if (_total <= _nbRead)  {  return 0;   }
+        hsize_t nbToRead = std::min ((u_int64_t)_blockSize, _total - _nbRead);
+
+        _nbRead += _ref->retrieveCache (_data, _nbRead, nbToRead);
+
+        return nbToRead;
+    }
+};
+
+/********************************************************************************/
+
+/** \brief Collection interface
+ */
+template <class Item> class CollectionHDF5 : public collections::impl::CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    CollectionHDF5 (hid_t fileId, const std::string& filename, system::ISynchronizer* synchro)
+        : collections::impl::CollectionAbstract<Item> (0,0), _datasetId(0), _typeId(0), _nbItems(0)
+    {
+        herr_t status;
+
+        system::LocalSynchronizer localsynchro (synchro);
+
+        /** We get the HDF5 type of the item. */
+        bool isCompound=false;
+        _typeId = Item().hdf5(isCompound);
+
+        /** We pack the type. */
+        hid_t actualType = H5Tcopy (_typeId);
+        //if (isCompound)  {  status = H5Tpack(actualType);  }
+
+        std::string actualName = filename;
+
+        /** We look whether the object exists or not. */
+        htri_t doesExist = H5Lexists (fileId, actualName.c_str(), H5P_DEFAULT);
+
+        if (doesExist > 0)
+        {
+            _datasetId = H5Dopen2 (fileId, actualName.c_str(), H5P_DEFAULT);
+
+            hid_t filespaceId = H5Dget_space (_datasetId);
+
+            hsize_t dims;
+            H5Sget_simple_extent_dims (filespaceId, &dims, NULL);
+
+            _nbItems = dims;
+            status = H5Sclose (filespaceId);
+        }
+        else
+        {
+            /** We create the dataspace. */
+            hsize_t dims      = 0;
+            hsize_t maxdims   = H5S_UNLIMITED;
+            hid_t dataspaceId = H5Screate_simple (1, &dims, &maxdims);
+
+            /* Modify dataset creation properties, i.e. enable chunking  */
+            hsize_t chunk_dims = 4096;
+            hid_t propId = H5Pcreate     (H5P_DATASET_CREATE);
+            status       = H5Pset_layout (propId, H5D_CHUNKED);
+            status       = H5Pset_chunk  (propId, 1, &chunk_dims);
+
+            /** We create the dataset. */
+            _datasetId = H5Dcreate2 (fileId, filename.c_str(),  actualType, dataspaceId, H5P_DEFAULT, propId, H5P_DEFAULT);
+
+            /** Some cleanup. */
+            H5Pclose (propId);
+            H5Sclose (dataspaceId);
+            H5Tclose (actualType);
+        }
+
+        /** We create the bag and the iterable instances. */
+        this->setBag      (new BagHDF5<Item>      (_datasetId, _typeId, _nbItems, synchro));
+        this->setIterable (new IterableHDF5<Item> (_datasetId, _typeId, _nbItems, synchro));
+
+        (void)status; // to remove compiler warning that status is set but not used
+    }
+
+    /** Destructor. */
+    virtual ~CollectionHDF5()
+    {
+        herr_t status;
+        status = H5Dclose (_datasetId);
+        status = H5Tclose (_typeId);
+        (void)status; // to avoid compiler claiming status is unused. well it is, but i don't care.
+    }
+
+    /** \copydoc tools::collections::Collection::remove */
+    void remove ()  {}
+
+    /** \copydoc tools::collections::Collection::addProperty */
+    void addProperty (const std::string& key, const std::string value)
+    {
+        hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+        hsize_t dims = 1;
+        hid_t space_id = H5Screate_simple (1, &dims, NULL);
+
+        /** We create the attribute. */
+        hid_t attrId = H5Acreate2 (_datasetId, key.c_str(), datatype,  space_id, H5P_DEFAULT, H5P_DEFAULT);
+
+        /** We write the data. */
+        const char* array[] = { value.c_str() };
+        H5Awrite (attrId, datatype, &array);
+
+        /** We close resources. */
+        H5Aclose (attrId);
+        H5Tclose (datatype);
+        H5Sclose (space_id);
+    }
+
+    /** \copydoc tools::collections::Collection::getProperty */
+    std::string getProperty (const std::string& key)
+    {
+        std::string result;
+        herr_t status;
+
+        hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+        hid_t attrId = H5Aopen (_datasetId, key.c_str(), H5P_DEFAULT);
+
+        hid_t space_id = H5Aget_space (attrId);
+
+        hsize_t dims = 1;
+        H5Sget_simple_extent_dims (space_id, &dims, NULL);
+        char** rdata = (char **) MALLOC (dims * sizeof (char *));
+
+        status = H5Aread (attrId, datatype, rdata);
+
+        /** We set the result. */
+        result.assign (rdata[0]);
+
+        /** We release buffers. */
+        status = H5Dvlen_reclaim (datatype, space_id, H5P_DEFAULT, rdata);
+        free (rdata);
+
+        /** We close resources. */
+        H5Aclose (attrId);
+        H5Tclose (datatype);
+        H5Sclose (space_id);
+        
+        (void)status; // to remove compiler warning that status is set but not used
+
+        return result;
+    }
+
+private:
+
+    hid_t _datasetId;
+    hid_t _typeId;
+    u_int64_t _nbItems;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5Patch.hpp b/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5Patch.hpp
new file mode 100644
index 0000000..a92b729
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/CollectionHDF5Patch.hpp
@@ -0,0 +1,575 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file CollectionHDF5Patch.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_PATCH_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_PATCH_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/CollectionAbstract.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <string>
+#include <vector>
+#include <stdarg.h>
+#include <hdf5/hdf5.h>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/* This class holds information to be shared by classes BagHDF5Patch and IterableHDF5Patch.
+ *
+ * IMPORTANT: HDF5 may suffer from kind of resources leaks when one uses H5Dread
+ * several times; if no H5Dclose is done, some internal memory may be kept, looking
+ * like memory leaks. See also:
+ * http://stackoverflow.com/questions/18466691/excessive-memory-use-with-hdf5-h5dread
+ *
+ * Now, we use H5Dclose when the collection apparently doesn't look to be accessed
+ * any more. If the datasetId is needed again, a request to get it again is needed.
+ *
+ * -- R: nice find, Erwan!
+ */
+template <class Item> struct  CollectionDataHDF5Patch : public system::SmartPointer
+{
+//public:
+
+    /** */
+    CollectionDataHDF5Patch (hid_t fileId, const std::string& filename, system::ISynchronizer* synchro, int compress)
+     : _fileId(fileId), _datasetId(0), _typeId(0), _nbItems(0), _name(filename), _synchro(synchro), _nbCalls(0), _compress(compress)
+    {
+        /** We get the HDF5 type of the item. */
+        bool isCompound=false;
+        _typeId = Item().hdf5(isCompound);
+
+        /** We get the number of items in the data set.
+         * NOTE: calling the (lazy) accessor 'getDatasetId' should also configure the dataset id. */
+        hid_t filespaceId = H5Dget_space (this->getDatasetId());
+        H5Sget_simple_extent_dims (filespaceId, &_nbItems, NULL);
+        H5Sclose (filespaceId);
+    }
+
+    /** Destructor */
+    ~CollectionDataHDF5Patch ()
+    {
+        herr_t status = H5Tclose (_typeId);
+        if (status < 0)  { 
+            std::cout << "HDF5 error (H5Tclose), status " <<  status << std::endl; exit(1); /* used to be an exception, but recent gcc's complain when in destructor*/  }
+
+        if (_datasetId != 0) {  H5Dclose (_datasetId);   _datasetId=0; }
+    }
+
+    /**  */
+    void addProperty (const std::string& key, const std::string value)
+    {
+        system::LocalSynchronizer localsynchro (_synchro);
+
+        hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+        hsize_t dims = 1;
+        hid_t space_id = H5Screate_simple (1, &dims, NULL);
+
+        /** We create the attribute. */
+        hid_t attrId = H5Acreate2 (getDatasetId(), key.c_str(), datatype,  space_id, H5P_DEFAULT, H5P_DEFAULT);
+
+        /** We write the data. */
+        const char* array[] = { value.c_str() };
+        H5Awrite (attrId, datatype, &array);
+
+        /** We close resources. */
+        H5Aclose (attrId);
+        H5Tclose (datatype);
+        H5Sclose (space_id);
+    }
+
+    /** \copydoc tools::collections::Collection::getProperty */
+    std::string getProperty (const std::string& key)
+    {
+        system::LocalSynchronizer localsynchro (_synchro);
+
+        std::string result;
+
+        herr_t status;
+
+        hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+        hid_t attrId = H5Aopen (getDatasetId(), key.c_str(), H5P_DEFAULT);
+
+        hid_t space_id = H5Aget_space (attrId);
+
+        hsize_t dims = 1;
+        H5Sget_simple_extent_dims (space_id, &dims, NULL);
+        char** rdata = (char **) MALLOC (dims * sizeof (char *));
+
+        status = H5Aread (attrId, datatype, rdata);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Aread), status %d", status);  }
+
+        /** We set the result. */
+        result.assign (rdata[0]);
+
+        /** We release buffers. */
+        status = H5Dvlen_reclaim (datatype, space_id, H5P_DEFAULT, rdata);
+        if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dvlen_reclaim), status %d", status);  }
+        FREE (rdata);
+
+        /** We close resources. */
+        H5Aclose (attrId);
+        H5Tclose (datatype);
+        H5Sclose (space_id);
+
+        return result;
+    }
+
+//protected:
+
+    /** */
+    hid_t retrieveDatasetId ()
+    {
+        hid_t result = 0;
+        herr_t status;
+
+        /** We look whether the object exists or not. */
+        htri_t doesExist = H5Lexists (_fileId, _name.c_str(), H5P_DEFAULT);
+
+        if (doesExist > 0)
+        {
+            result = H5Dopen2 (_fileId, _name.c_str(), H5P_DEFAULT);
+        }
+        else
+        {
+            /** We pack the type. */
+            hid_t actualType = H5Tcopy (_typeId);
+
+            /** We create the dataspace. */
+            hsize_t dims      = 0;
+            hsize_t maxdims   = H5S_UNLIMITED;
+            hid_t dataspaceId = H5Screate_simple (1, &dims, &maxdims);
+
+            /* Modify dataset creation properties, i.e. enable chunking  */
+            hsize_t chunk_dims = GATB_HDF5_NB_ITEMS_PER_BLOCK;
+            hid_t propId = H5Pcreate     (H5P_DATASET_CREATE);
+
+            if (_compress > 0)
+            {
+            	status = H5Pset_shuffle (propId);
+            	status = H5Pset_deflate (propId, _compress);
+            }
+
+            status       = H5Pset_layout (propId, H5D_CHUNKED);
+            status       = H5Pset_chunk  (propId, 1, &chunk_dims);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Pset_chunk), status %d", status);  }
+
+            /** We create the dataset. */
+            result = H5Dcreate2 (_fileId, _name.c_str(),  actualType, dataspaceId, H5P_DEFAULT, propId, H5P_DEFAULT);
+
+            /** Some cleanup. */
+            H5Pclose (propId);
+            H5Sclose (dataspaceId);
+            H5Tclose (actualType);
+        }
+
+        return result;
+    }
+
+    hid_t getDatasetId ()
+    {
+        if (this->_datasetId == 0)  {  this->_datasetId = this->retrieveDatasetId ();  }
+        return this->_datasetId;
+    }
+
+    /** */
+    void clean ()
+    {
+        if (_datasetId == 0)  { return; }
+        {
+            system::LocalSynchronizer localsynchro (_synchro);
+            if (_datasetId != 0) {  H5Dclose (_datasetId);   _datasetId=0; }
+        }
+    }
+
+    hid_t                   _fileId;
+    hid_t                   _datasetId;
+    hid_t                   _typeId;
+    hsize_t                 _nbItems;
+    std::string             _name;
+    system::ISynchronizer*  _synchro;
+    u_int64_t               _nbCalls;
+    int                     _compress;
+
+    void checkCleanup ()
+    {
+        static u_int64_t MASK = ( (1<<GATB_HDF5_CLEANUP_WORKAROUND) - 1);
+
+        u_int64_t newValue = __sync_add_and_fetch (&_nbCalls, 1);
+
+        /** We periodically clean up some HDF5 resources. */
+        if ( (newValue & MASK) == MASK) {  clean();  }
+    }
+};
+
+/********************************************************************************/
+
+template <class Item> class BagHDF5Patch : public collections::Bag<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor */
+    BagHDF5Patch (CollectionDataHDF5Patch<Item>* common)  : _common (0), _nbInserted(0)  { setCommon(common); }
+
+    /** Destructor. */
+    ~BagHDF5Patch ()  { setCommon(0); }
+
+    /** Insert an item into the bag.
+     * \param[in] item : the item to be inserted. */
+    void insert (const Item& item) {  insert (&item, 1);  }
+
+    void insert (const std::vector<Item>& items, size_t length=0)  {  insert (items.data(), length==0 ? items.size() : length); }
+
+    /** Insert items into the bag.
+     * \param[in] items : items to be inserted. */
+    void insert (const Item* items, size_t length)
+    {
+        if (items==0 || length==0)  { return; }
+        
+        herr_t status = 0;
+
+        {
+            system::LocalSynchronizer localsynchro (_common->_synchro);
+
+            /** We get the dataset id. */
+            hid_t datasetId = _common->getDatasetId();
+
+            /** Resize the memory dataspace to indicate the new size of our buffer. */
+            hsize_t memDim = length;
+            hid_t memspaceId = H5Screate_simple (1, &memDim, NULL);
+
+            /** Extend dataset. */
+            hsize_t newDim = _nbInserted + length;
+            status = H5Dset_extent (datasetId, &newDim);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dset_extent), status %d", status);  }
+
+            /** Select hyperslab on file dataset. */
+            hid_t filespaceId = H5Dget_space(datasetId);
+            hsize_t start = _nbInserted;
+            hsize_t count = length;
+            status = H5Sselect_hyperslab (filespaceId, H5S_SELECT_SET, &start, NULL, &count, NULL);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sselect_hyperslab), status %d", status);  }
+
+            /** Append buffer to dataset */
+            status = H5Dwrite (datasetId, _common->_typeId, memspaceId, filespaceId, H5P_DEFAULT, items);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dwrite), status %d", status);  }
+
+            /** We increase the number of inserted items. */
+            _nbInserted += length;
+
+            __sync_fetch_and_add (&_common->_nbItems, length);
+
+            /** Close resources. */
+            status = H5Sclose (filespaceId);
+            status = H5Sclose (memspaceId);
+            if (status != 0)  { std::cout << "err H5Sclose" << std::endl; }
+        }
+
+        /** We periodically clean up some HDF5 resources. */
+        _common->checkCleanup ();
+    }
+
+    /** */
+    void flush ()  {  }
+
+    CollectionDataHDF5Patch<Item>* _common;
+    void setCommon (CollectionDataHDF5Patch<Item>* common)  { SP_SETATTR(common); }
+
+private:
+
+    u_int64_t _nbInserted;
+};
+
+/********************************************************************************/
+
+template<typename Item> class HDF5IteratorPatch;
+
+template <class Item> class IterableHDF5Patch : public collections::Iterable<Item>,  public system::SmartPointer
+{
+public:
+
+    /** */
+    IterableHDF5Patch (CollectionDataHDF5Patch<Item>* common)  : _common (0) { setCommon(common); }
+
+    /** */
+    ~IterableHDF5Patch ()  { setCommon(0);}
+
+    /** */
+    dp::Iterator<Item>* iterator ()  {  return new HDF5IteratorPatch<Item> (this);  }
+
+    /** */
+    int64_t getNbItems ()  {  
+        return _common->_nbItems;  }
+
+    /** */
+    int64_t estimateNbItems ()  {  return getNbItems();  }
+
+    /** */
+    Item* getItems (Item*& buffer)
+    {
+        //std::cout << "collectionHDF5Patch getItems called" << std::endl;
+        retrieveCache (buffer, 0, getNbItems());
+        return buffer;
+    }
+
+    /** */
+    size_t getItems (Item*& buffer, size_t start, size_t count)
+    {
+        //std::cout << "collectionHDF5Patch getItems called" << std::endl;
+        return retrieveCache (buffer, start, count);
+    }
+
+private:
+
+    CollectionDataHDF5Patch<Item>* _common;
+    void setCommon (CollectionDataHDF5Patch<Item>* common)  { SP_SETATTR(common); }
+
+    /** */
+    u_int64_t retrieveCache (Item* data, hsize_t start, hsize_t count)
+    {
+        herr_t status = 0;
+
+        if (start       > _common->_nbItems)  { return 0;                          }
+        if (start+count > _common->_nbItems)  { count = _common->_nbItems - start; }
+
+        /** We use a synchronizer instruction block.
+         * NOTE !!!  the 'clean' method called after this block is also synchronized,
+         * and therefore must not be in the same instruction block. */
+        {
+            system::LocalSynchronizer localsynchro (_common->_synchro);
+
+            hid_t memspaceId = H5Screate_simple (1, &count, NULL);
+
+            /** Select hyperslab on file dataset. */
+            hid_t filespaceId = H5Dget_space(_common->getDatasetId());
+            status = H5Sselect_hyperslab (filespaceId, H5S_SELECT_SET, &start, NULL, &count, NULL);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sselect_hyperslab), status %d", status);  }
+
+            /** Read buffer from dataset */
+            status = H5Dread (_common->getDatasetId(), _common->_typeId, memspaceId, filespaceId, H5P_DEFAULT, data);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dread), status %d", status);  }
+
+            /** Close resources. */
+            status = H5Sclose (filespaceId);
+            status = H5Sclose (memspaceId);
+            if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Sclose), status %d", status);  }
+        }
+
+        /** We periodically clean up some HDF5 resources. */
+        _common->checkCleanup ();
+
+        return count;
+    }
+
+    template<typename U>
+    friend class HDF5IteratorPatch;
+};
+
+/********************************************************************************/
+
+template<typename Item>
+class HDF5IteratorPatch : public dp::Iterator<Item>
+{
+public:
+
+    /** */
+    HDF5IteratorPatch ()  : _ref(0), _blockSize(0),
+         _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+         _nbRead(0), _total(0), _memspaceId(0)
+    {}
+
+    /** */
+    HDF5IteratorPatch (const HDF5IteratorPatch& it)
+    : _ref(it._ref), _blockSize(it._blockSize),
+        _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+        _nbRead(0), _total(0), _memspaceId(0)
+    {
+        _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+        memset (_data, 0, _blockSize*sizeof(Item));
+        _total = _ref->_nbItems;
+    }
+
+    /** */
+    HDF5IteratorPatch (IterableHDF5Patch<Item>* ref, size_t blockSize=GATB_HDF5_NB_ITEMS_PER_BLOCK)
+        : _ref(ref), _blockSize(blockSize),
+          _data(0), _dataSize(0), _dataIdx(0), _isDone (true),
+          _nbRead(0), _total(0), _memspaceId(0)
+    {
+        _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+        memset (_data, 0, _blockSize*sizeof(Item));
+
+        _total = _ref->_common->_nbItems;
+    }
+
+    HDF5IteratorPatch& operator= (const HDF5IteratorPatch& it)
+    {
+        if (this != &it)
+        {
+            _ref        = it._ref;
+            _blockSize  = it._blockSize;
+            _dataSize   = it._dataSize;
+            _dataIdx    = it._dataIdx;
+            _isDone     = it._isDone;
+            _nbRead     = it._nbRead;
+            _memspaceId = it._memspaceId;
+            _total      = it._total;
+
+            if (_data)  { FREE (_data); }
+            _data = (Item*) MALLOC (_blockSize*sizeof(Item));
+            memcpy (_data, it._data, _blockSize*sizeof(Item));
+        }
+        return *this;
+    }
+
+    /** */
+    ~HDF5IteratorPatch()
+    {
+        if (_data)  { FREE (_data); }
+
+        /** We clean the reference instance. */
+        _ref->_common->clean();
+    }
+
+    void first()
+    {
+        _nbRead   = 0;
+        _dataIdx  = 0;
+        _dataSize = retrieveNextCache();
+        _isDone   = _dataIdx >= _dataSize;
+
+        if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+    }
+
+    void next()
+    {
+        _dataIdx++;
+        _isDone = _dataIdx >= _dataSize;
+        if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+        else
+        {
+            _dataIdx  = 0;
+            _dataSize = retrieveNextCache();
+            _isDone = _dataIdx >= _dataSize;
+            if (!_isDone)  {  *this->_item = _data[_dataIdx];  }
+        }
+    }
+
+    bool isDone()
+    {
+        return _isDone;
+    }
+
+    Item& item ()  { return *this->_item; }
+
+private:
+    IterableHDF5Patch<Item>* _ref;
+    size_t        _blockSize;
+
+    Item*     _data;
+    u_int64_t _dataSize;
+    u_int64_t _dataIdx;
+
+    bool _isDone;
+
+    u_int64_t     _nbRead;
+    u_int64_t     _total;
+
+    hid_t _memspaceId;
+
+    u_int64_t retrieveNextCache ()
+    {
+        if (_total <= _nbRead)  {  return 0;   }
+        hsize_t nbToRead = std::min ((u_int64_t)_blockSize, _total - _nbRead);
+
+        _nbRead += _ref->retrieveCache (_data, _nbRead, nbToRead);
+
+        return nbToRead;
+    }
+};
+
+/********************************************************************************/
+
+template <class Item> class CollectionHDF5Patch : public collections::impl::CollectionAbstract<Item>, public system::SmartPointer
+{
+public:
+
+    /** Constructor. */
+    CollectionHDF5Patch (hid_t fileId, const std::string& name, system::ISynchronizer* synchro, int compressLevel)
+        : collections::impl::CollectionAbstract<Item> (0,0), _common(0)
+    {
+        system::LocalSynchronizer localsynchro (synchro);
+
+        CollectionDataHDF5Patch<Item>* common = new CollectionDataHDF5Patch<Item> (fileId, name, synchro, compressLevel);
+
+        /** We create the bag and the iterable instances. */
+        this->setBag      (new BagHDF5Patch<Item>      (common));
+        this->setIterable (new IterableHDF5Patch<Item> (common));
+    }
+
+    /** \copydoc tools::collections::Collection::remove */
+    void remove ()  {}
+
+    /** \copydoc tools::collections::Collection::addProperty */
+    void addProperty (const std::string& key, const std::string value)
+    {
+        BagHDF5Patch<Item>* theBag = dynamic_cast<BagHDF5Patch<Item>*> (this->bag());
+        if (theBag != 0)  {  theBag->_common->addProperty (key, value);  }
+    }
+
+    /** \copydoc tools::collections::Collection::getProperty */
+    std::string getProperty (const std::string& key)
+    {
+        std::string result;
+
+        BagHDF5Patch<Item>* theBag = dynamic_cast<BagHDF5Patch<Item>*> (this->bag());
+        if (theBag != 0)  {  result = theBag->_common->getProperty (key);  }
+
+        return result;
+    }
+
+private:
+    CollectionDataHDF5Patch<Item>* _common;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_COLLECTION_HDF5_PATCH_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/Storage.cpp b/gatb-core/src/gatb/tools/storage/impl/Storage.cpp
new file mode 100644
index 0000000..3d800e9
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/Storage.cpp
@@ -0,0 +1,593 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+/********************************************************************************/
+namespace gatb { namespace core {  namespace tools {  namespace storage {  namespace impl {
+/********************************************************************************/
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::Storage (StorageMode_e mode, const std::string& name, bool autoRemove)
+    : Cell(0, ""), _name(name), _factory(0), _root(0), _autoRemove(autoRemove)
+{
+    setFactory (new StorageFactory (mode));
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::~Storage ()
+{
+    setRoot    (0);
+    setFactory (0);
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Group* Storage::getRoot ()
+{
+    if (_root == 0)  { setRoot    (_factory->createGroup (this, ""));   _root->setCompressLevel (this->getCompressLevel()); }
+    return _root;
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Group& Storage::operator() (const std::string name)
+{
+    if (name.empty())  { return *getRoot(); }
+    else               { return getRoot ()->getGroup (name);  }
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Storage::remove ()
+{
+    getRoot()->remove();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+void Storage::setFactory (StorageFactory* factory)
+{
+    SP_SETATTR(factory);
+}
+
+/********************************************************************************
+             #####   #######  ######   #######     #     #     #
+            #     #     #     #     #  #          # #    ##   ##
+            #           #     #     #  #         #   #   # # # #
+             #####      #     ######   #####    #     #  #  #  #
+                  #     #     #   #    #        #######  #     #
+            #     #     #     #    #   #        #     #  #     #
+             #####      #     #     #  #######  #     #  #     #
+********************************************************************************/
+
+/* WRAPPERS BETWEEN STORAGE AND C++ STREAMS
+ *
+ * Got inspiration from :
+ *      http://savingyoutime.wordpress.com/2009/04/21/using-c-stl-streambufostream-to-create-time-stamped-logging-class/
+ *      http://www.mr-edd.co.uk/blog/beginners_guide_streambuf
+ */
+
+/* Output stream buffer implementation. */
+class Storage_ostreambuf : public std::streambuf
+{
+protected:
+
+    static const int bufferSize = 4*1024;   // size of data buffer
+    char buffer[bufferSize];                // data buffer
+
+public:
+    Storage_ostreambuf (Group& group, const std::string& name) : _nbWritten(0)
+    {
+        setp (buffer, buffer+(bufferSize-1));
+        _collection = & group.getCollection<math::NativeInt8> (name);
+    }
+
+    virtual ~Storage_ostreambuf() { 
+        sync(); 
+        //std::cout << "ostream destructor" << std::endl; 
+        }
+
+protected:
+
+    collections::Collection<math::NativeInt8>* _collection;
+
+    // flush the characters in the buffer
+    int flushBuffer ()
+    {
+        int num = pptr()-pbase();
+        _collection->insert ((math::NativeInt8*)buffer, num);
+        _collection->flush(); // important!
+        _nbWritten += num;
+        pbump(-num); // reset put pointer accordingly
+        return num;
+    }
+
+    virtual int overflow ( int c = EOF )
+    {
+        if (c != EOF) {
+            *pptr() = c;    // insert character into the buffer
+            pbump(1);
+        }
+        if (flushBuffer() == EOF)
+            return EOF;
+        return c;
+    }
+
+    virtual int sync()
+    {
+        if (flushBuffer() == EOF) {  return -1; }  // ERROR
+        return 0;
+    }
+
+    virtual pos_type  seekoff (off_type off, std::ios_base::seekdir dir,  std::ios_base::openmode mode)
+    {
+        sync ();  // We may have to flush the current buffer first
+        return _nbWritten;
+    }
+
+    pos_type _nbWritten;
+};
+
+/*********************************************************************
+*********************************************************************/
+
+/* Input stream buffer implementation. */
+class Storage_istreambuf : public std::streambuf
+{
+    public:
+    Storage_istreambuf (Group& group, const std::string& name, std::size_t buff_sz = 1024, std::size_t put_back = 64) :
+            put_back_(std::max(put_back, size_t(1))),
+            buffer_(std::max(buff_sz, put_back_) + put_back_), currentIdx(0)
+        {
+            char *end = &buffer_.front() + buffer_.size();
+            setg(end, end, end);
+            _collection = & group.getCollection<math::NativeInt8> (name);
+        }
+
+    private:
+        // overrides base class underflow()
+        int_type underflow()
+        {
+            if (gptr() < egptr()) // buffer not exhausted
+                return traits_type::to_int_type(*gptr());
+
+            char *base = &buffer_.front();
+            char *start = base;
+
+            if (eback() == base) // true when this isn't the first fill
+            {
+                // Make arrangements for putback characters
+                std::memmove(base, egptr() - put_back_, put_back_);
+                start += put_back_;
+            }
+            // start is now the start of the buffer, proper.
+            // Read from fptr_ in to the provided buffer
+            math::NativeInt8* start2 = (math::NativeInt8*) start;
+            //std::cout << "(storage) istream calling getItems with params: start2=" << start2 << " currentIdx=" << currentIdx << " buffer.size()-start+base=" << (buffer_.size() - (start - base)) << ", total buffer size " << buffer_.size()  << std::endl;
+            if ( ((int64_t)base > (int64_t)start) || (((int64_t)start - (int64_t)base) > (int64_t)buffer_.size()))
+            {
+                std::cout << "Error: trying to read more elements " << (start - base) << " = (" << start << " - " << base << ") than the buffer size" << std::endl; exit(1);
+            }
+            size_t offset = currentIdx ; // in hdf5: needs to be currentIdx; in file: needs to be 0 (but it will be fixed in IteratorFile, ok, not here)
+            size_t n = _collection->getItems (start2, offset, buffer_.size() - (start - base));
+            currentIdx += n;
+
+            if (n == 0)  {   return traits_type::eof();  }
+
+            // Set buffer pointers
+            setg(base, start, start + n);
+
+            return traits_type::to_int_type(*gptr());
+        }
+
+        // copy ctor and assignment not implemented;
+        // copying not allowed
+        Storage_istreambuf(const Storage_istreambuf &);
+        Storage_istreambuf &operator= (const Storage_istreambuf &);
+
+    private:
+        collections::Collection<math::NativeInt8>* _collection;
+
+        const std::size_t put_back_;
+        std::vector<char> buffer_;
+        size_t currentIdx;
+};
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::ostream::ostream (Group& group, const std::string& name)
+    : std::ios(0), std::ostream(new Storage_ostreambuf(group,name))
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::ostream::~ostream()
+{
+    delete rdbuf();
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::istream::istream (Group& group, const std::string& name)
+    : std::ios(0), std::istream(new Storage_istreambuf(group,name))
+{
+}
+
+/*********************************************************************
+** METHOD  :
+** PURPOSE :
+** INPUT   :
+** OUTPUT  :
+** RETURN  :
+** REMARKS :
+*********************************************************************/
+Storage::istream::~istream ()
+{
+    delete rdbuf();
+}
+	
+	
+///////////////////////////////////////
+////////// SuperKmerBinFiles //////////
+///////////////////////////////////////
+	
+SuperKmerBinFiles::SuperKmerBinFiles(const std::string& path,const std::string& name, size_t nb_files) : _basefilename(name), _path(path),_nb_files(nb_files)
+{
+	_nbKmerperFile.resize(_nb_files,0);
+	_FileSize.resize(_nb_files,0);
+	
+	openFiles("wb"); //at construction will open file for writing
+	// then use close() and openFiles() to open for reading
+	
+}
+
+void SuperKmerBinFiles::openFile( const char* mode, int fileId)
+{
+	std::stringstream ss;
+	ss << _basefilename << "." << fileId;
+		
+	_files[fileId] = system::impl::System::file().newFile (_path, ss.str(), mode);
+	_synchros[fileId] = system::impl::System::thread().newSynchronizer();
+	_synchros[fileId]->use();
+}
+	
+void SuperKmerBinFiles::openFiles( const char* mode)
+{
+	_files.resize(_nb_files,0);
+	_synchros.resize(_nb_files,0);
+	
+	system::impl::System::file().mkdir(_path, 0755);
+
+	for(unsigned int ii=0;ii<_files.size();ii++)
+	{
+		std::stringstream ss;
+		ss << _basefilename << "." << ii;
+		
+		_files[ii] = system::impl::System::file().newFile (_path, ss.str(), mode);
+		_synchros[ii] = system::impl::System::thread().newSynchronizer();
+		_synchros[ii]->use();
+
+	}
+}
+
+	
+std::string SuperKmerBinFiles::getFileName(int fileId)
+{
+	
+	std::stringstream ss;
+	ss << _path << "/" <<_basefilename << "." << fileId;
+	
+	return ss.str();
+}
+
+	
+int SuperKmerBinFiles::readBlock(unsigned char ** block, unsigned int* max_block_size, unsigned int* nb_bytes_read, int file_id)
+{
+	_synchros[file_id]->lock();
+	
+	//block header
+	int nbr = _files[file_id]->fread(nb_bytes_read, sizeof(*max_block_size),1);
+
+	if(nbr == 0)
+	{
+		//printf("__ end of file %i __\n",file_id);
+		_synchros[file_id]->unlock();
+		return 0;
+	}
+	
+	if(*nb_bytes_read > *max_block_size)
+	{
+		*block = (unsigned char *) realloc(*block, *nb_bytes_read);
+		*max_block_size = *nb_bytes_read;
+	}
+	
+	//block
+	_files[file_id]->fread(*block, sizeof(unsigned char),*nb_bytes_read);
+	
+	_synchros[file_id]->unlock();
+	
+	return *nb_bytes_read;
+}
+
+int SuperKmerBinFiles::getNbItems(int fileId)
+{
+	return _nbKmerperFile[fileId];
+}
+	
+	
+u_int64_t SuperKmerBinFiles::getFileSize(int fileId)
+{
+
+	return _FileSize[fileId];
+}
+
+void SuperKmerBinFiles::getFilesStats(u_int64_t & total, u_int64_t & biggest, u_int64_t & smallest, float & mean)
+{
+	total =0;
+	smallest = ~0;
+	biggest  = 0;
+	mean=0;
+	for(unsigned int ii=0;ii<_FileSize.size();ii++)
+	{
+		smallest = std::min (smallest, _FileSize[ii]);
+		biggest  = std::max (biggest,  _FileSize[ii]);
+		total+=_FileSize[ii];
+	}
+	if(_FileSize.size()!=0)
+		mean= total/_FileSize.size();
+	
+}
+	
+	
+void SuperKmerBinFiles::writeBlock(unsigned char * block, unsigned int block_size, int file_id, int nbkmers)
+{
+
+	_synchros[file_id]->lock();
+	
+	_nbKmerperFile[file_id]+=nbkmers;
+	_FileSize[file_id] += block_size+sizeof(block_size);
+	//block header
+	_files[file_id]->fwrite(&block_size, sizeof(block_size),1);
+
+	//block
+	_files[file_id]->fwrite(block, sizeof(unsigned char),block_size);
+	
+	_synchros[file_id]->unlock();
+
+}
+	
+void SuperKmerBinFiles::flushFiles()
+{
+	for(unsigned int ii=0;ii<_files.size();ii++)
+	{
+		_synchros[ii]->lock();
+
+		if(_files[ii]!=0)
+		{
+			_files[ii]->flush();
+		}
+		
+		_synchros[ii]->unlock();
+
+	}
+}
+
+void SuperKmerBinFiles::eraseFiles()
+{
+	for(unsigned int ii=0;ii<_files.size();ii++)
+	{
+		std::stringstream ss;
+		ss << _path << "/" <<_basefilename << "." << ii;
+		system::impl::System::file().remove(ss.str());
+	}
+	system::impl::System::file().rmdir(_path);
+
+}
+
+void SuperKmerBinFiles::closeFile(  int fileId)
+{
+	if(_files[fileId]!=0)
+	{
+		delete _files[fileId];
+		_files[fileId] = 0;
+		_synchros[fileId]->forget();
+	}
+}
+
+	
+void SuperKmerBinFiles::closeFiles()
+{
+	for(unsigned int ii=0;ii<_files.size();ii++)
+	{
+		if(_files[ii]!=0)
+		{
+			delete _files[ii];
+			_files[ii] = 0;
+			_synchros[ii]->forget();
+		}
+	}
+}
+	
+SuperKmerBinFiles::~SuperKmerBinFiles()
+{
+	this->closeFiles();
+	this->eraseFiles();
+}
+	
+int SuperKmerBinFiles::nbFiles()
+{
+	return _files.size();
+}
+
+////////////////////////////////////////////
+//////////  CacheSuperKmerBinFiles /////////
+////////////////////////////////////////////
+
+
+
+	
+CacheSuperKmerBinFiles::CacheSuperKmerBinFiles(SuperKmerBinFiles * ref, int buffsize )
+{
+	_ref = ref;
+
+	_nb_files = _ref->nbFiles();
+	_nbKmerperFile.resize(_nb_files,0);
+
+	_buffer_max_capacity = buffsize; // this is per file, per thread
+	//printf("buffsize %i per file per thread \n",_buffer_max_capacity);
+
+	_max_superksize= 255; // this is extra size from regular kmer; ie total max superksize is kmersize +  _max_superksize
+	
+	_buffers.resize(_nb_files);
+	_buffers_idx.resize(_nb_files,0);
+	
+	for(unsigned int ii=0; ii<_buffers.size();ii++ )
+	{
+		_buffers[ii] = (u_int8_t*) MALLOC (sizeof(u_int8_t) * _buffer_max_capacity);
+	}
+	
+}
+	
+//copy construc : alloc own buffer for new object
+CacheSuperKmerBinFiles::CacheSuperKmerBinFiles (const CacheSuperKmerBinFiles& p)
+{
+	_ref = p._ref;
+	_nb_files= p._nb_files;
+	_buffer_max_capacity= p._buffer_max_capacity;
+	_max_superksize= p._max_superksize;
+	_nbKmerperFile.resize(_nb_files,0);
+
+	_buffers.resize(_nb_files);
+	_buffers_idx.resize(_nb_files,0);
+	
+	for(unsigned int ii=0; ii<_buffers.size();ii++ )
+	{
+		_buffers[ii] = (u_int8_t*) MALLOC (sizeof(u_int8_t) * _buffer_max_capacity);
+	}
+}
+	
+void CacheSuperKmerBinFiles::flushAll()
+{
+	//printf("flush all buffers\n");
+	for(unsigned int ii=0; ii<_buffers.size();ii++ )
+	{
+		flush(ii);
+	}
+}
+	
+	
+void CacheSuperKmerBinFiles::flush(int file_id)
+{
+	if(_buffers_idx[file_id]!=0)
+	{
+		_ref->writeBlock(_buffers[file_id],_buffers_idx[file_id],file_id,_nbKmerperFile[file_id]);
+		
+		_buffers_idx[file_id]=0;
+		_nbKmerperFile[file_id] = 0;
+	}
+}
+	
+	
+void CacheSuperKmerBinFiles::insertSuperkmer(u_int8_t* superk, int nb_bytes, u_int8_t nbk, int file_id)
+{
+	if( (_buffers_idx[file_id]+nb_bytes+1) > _buffer_max_capacity)
+	{
+		flush(file_id);
+	}
+	
+	_buffers[file_id][_buffers_idx[file_id]++] = nbk;
+	
+	memcpy(_buffers[file_id] + _buffers_idx[file_id]  , superk,nb_bytes);
+	_buffers_idx[file_id] += nb_bytes;
+	_nbKmerperFile[file_id]+=nbk;
+	
+}
+	
+CacheSuperKmerBinFiles::~CacheSuperKmerBinFiles()
+{
+	this->flushAll();
+	for(unsigned int ii=0; ii<_buffers.size();ii++ )
+	{
+		FREE (_buffers[ii]);
+	}
+}
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/src/gatb/tools/storage/impl/Storage.hpp b/gatb-core/src/gatb/tools/storage/impl/Storage.hpp
new file mode 100644
index 0000000..39e5c2a
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/Storage.hpp
@@ -0,0 +1,669 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file Storage.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Storage interface
+ *
+ *  This file holds interfaces related to the Collection, Group, Partition, Factory interfaces.
+ *
+ *  I believe this deals with both on-disk and in-memory structures.. (from discussions with Erwan)
+ *  So if you're looking at this file to figure out whether a Collection/Group/Partition is stored on
+ *  disk or on memory, look elsewhere!
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/storage/impl/Cell.hpp>
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/collections/impl/CollectionAbstract.hpp>
+#include <gatb/tools/collections/impl/CollectionCache.hpp>
+
+#include <gatb/tools/misc/api/IProperty.hpp>
+
+#include <gatb/tools/math/NativeInt8.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <string>
+#include <sstream>
+#include <list>
+#include <vector>
+#include <map>
+#include <cstring>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+/** File system storage for collections. */
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** Enumeration of the supported storage mechanisms.*/
+enum StorageMode_e
+{
+    /** Simple file. */
+    STORAGE_FILE,
+    /** HDF5 file. */
+    STORAGE_HDF5,
+    /** Experimental. */
+    STORAGE_GZFILE,
+    /** Experimental. */
+    STORAGE_COMPRESSED_FILE
+};
+
+/********************************************************************************/
+
+/** Forward declarations. */
+class Group;
+template <typename Type>  class Partition;
+template <typename Type>  class CollectionNode;
+
+class StorageFactory;
+
+/********************************************************************************
+     #####   #######  #        #        #######   #####   #######
+    #     #  #     #  #        #        #        #     #     #
+    #        #     #  #        #        #        #           #
+    #        #     #  #        #        #####    #           #
+    #        #     #  #        #        #        #           #
+    #     #  #     #  #        #        #        #     #     #      ##
+     #####   #######  #######  #######  #######   #####      #      ##
+********************************************************************************/
+/** \brief Class that add some features to the Collection interface
+ *
+ * The CollectionNode has two aspects:
+ *      - this is a Collection
+ *      - this is a Node
+ *
+ * The idea was not to have a Collection interface extending the INode interface
+ * => we introduce the CollectionNode for this.
+ */
+template <class Item>
+class CollectionNode : public Cell, public collections::impl::CollectionAbstract<Item>
+{
+public:
+
+    /** Constructor.
+     *  The idea is to use a referred collection for:
+     *      - its bag part
+     *      - its iterable part
+     *      - its remove part
+     * \param[in] factory : factory to be used
+     * \param[in] parent : parent node
+     * \param[in] id  : identifier of the collection to be created
+     * \param[in] ref : referred collection.
+     */
+    CollectionNode (StorageFactory* factory, ICell* parent, const std::string& id, collections::Collection<Item>* ref);
+
+    /** Destructor. */
+    virtual ~CollectionNode();
+
+    /** \copydoc tools::storage::ICell::remove */
+    void remove ();
+
+    /** \copydoc collections::impl::CollectionAbstract::addProperty */
+    void addProperty (const std::string& key, const std::string value);
+
+    /** \copydoc collections::impl::CollectionAbstract::getProperty */
+    std::string getProperty (const std::string& key);
+
+    /** Get a pointer to the delegate Collection instance
+     * \return the delegate instance.
+     */
+    collections::Collection<Item>* getRef ();
+
+private:
+
+    StorageFactory* _factory;
+
+    collections::Collection<Item>* _ref;
+    void setRef (collections::Collection<Item>* ref)  { SP_SETATTR(ref); }
+};
+
+/**********************************************************************
+             #####   ######   #######  #     #  ######
+            #     #  #     #  #     #  #     #  #     #
+            #        #     #  #     #  #     #  #     #
+            #  ####  ######   #     #  #     #  ######
+            #     #  #   #    #     #  #     #  #
+            #     #  #    #   #     #  #     #  #
+             #####   #     #  #######   #####   #
+**********************************************************************/
+
+/** \brief Group concept.
+ *
+ * This class define a container concept for other items that can be stored
+ * in a storage (like groups, partitions, collections).
+ *
+ * In a regular implementation, a Group could be a directory.
+ *
+ * In a HDF5 implementation, a group could be a HDF5 group.
+ */
+class Group : public Cell
+{
+public:
+
+    /** Constructor. */
+    Group (StorageFactory* factory, ICell* parent, const std::string& name);
+
+    /** Destructor. */
+    ~Group();
+
+    /** Get a child group from its name. Created if not already exists.
+     * \param[in] name : name of the child group to be retrieved.
+     * \return the child group.
+     */
+    Group& getGroup (const std::string& name);
+
+    /** Get a child partition from its name. Created if not already exists.
+     * \param[in] name : name of the child partition to be retrieved.
+     * \param[in] nb : in case of creation, tells how many collection belong to the partition.
+     * \return the child partition.
+     */
+    template <class Type>  Partition<Type>& getPartition (const std::string& name, size_t nb=0);
+
+    /** Get a child collection from its name. Created if not already exists.
+     * \param[in] name : name of the child collection to be retrieved.
+     * \return the child collection .
+     */
+    template <class Type>  CollectionNode<Type>& getCollection (const std::string& name);
+
+    /** \copydoc Cell::remove */
+    void remove ();
+
+    /** Associate a [key,value] to the group. Note: according to the kind of storage,
+     * this feature may be not supported (looks like it's only supported in HDF5).
+     * \param[in] key : key
+     * \param[in] value : value
+     */
+    virtual void addProperty (const std::string& key, const std::string value) { throw system::ExceptionNotImplemented (); }
+
+    /** Get a [key,value] from the group. Note: according to the kind of storage,
+     * this feature may be not supported (looks like it's only supported in HDF5).
+     * \param[in] key : key
+     * \return the value associated to the string.
+     */
+    virtual std::string getProperty (const std::string& key)  { return "?"; throw system::ExceptionNotImplemented ();  }
+    
+    /* same as addProperty but sets the value if it already exists */
+    virtual void setProperty (const std::string& key, const std::string value) { throw system::ExceptionNotImplemented (); }
+
+protected:
+
+    StorageFactory* _factory;
+    std::vector<ICell*> _collections;
+    std::vector<ICell*> _partitions;
+    std::vector<Group*> _groups;
+};
+
+	
+	
+	////////////////////////////////////////////////////////////
+	////////////////// superkmer storage ///////////////////////
+	////////////////////////////////////////////////////////////
+	
+//this class manages the set of temporary files needed to store superkmers
+//to be used in conjunction with the CacheSuperKmerBinFiles below for buffered IO
+
+	
+// Note (guillaume) :  not very GATB-friendly  since it completely ignores GATB bag, bagcache, collection, partition, iterableFile,   etc ..
+// but I do not know how to use gatb classes with a variable size type (the superkmer)
+// and anyway the gatb storage complex hierarchy is error-prone (personal opinion)
+// so, hell, just recreate an adhoc buffered storage here for superkmers
+// it does need to be templated for kmer size, superkmers are inserted as u_int8_t*
+
+	
+	
+//block header = 4B = block size
+//puis block = liste de couple  < superk length = 1B  , superkmer = nB  >
+//the  block structure makes it easier for buffered read,
+//otherwise we would not know how to read a big chunk without stopping in the middle of superkmer
+
+class SuperKmerBinFiles
+{
+	
+public:
+	
+	//construtor will open the files for writing
+	//use closeFiles to close them all then openFiles to open in different mode
+	SuperKmerBinFiles(const std::string& path,const std::string& name, size_t nb_files);
+	
+	~SuperKmerBinFiles();
+
+	void closeFiles();
+	void flushFiles();
+	void eraseFiles();
+	void openFiles(const char* mode);
+	void openFile( const char* mode, int fileId);
+	void closeFile(  int fileId);
+
+	//read/write block of superkmers to filefile_id
+	//readBlock will re-allocate the block buffer if needed (current size passed by max_block_size)
+	int readBlock(unsigned char ** block, unsigned int* max_block_size, unsigned int* nb_bytes_read, int file_id);
+	void writeBlock(unsigned char * block, unsigned int block_size, int file_id, int nbkmers);
+
+	int nbFiles();
+	int getNbItems(int fileId);
+	
+	void getFilesStats(u_int64_t & total, u_int64_t & biggest, u_int64_t & smallest, float & mean);
+	u_int64_t getFileSize(int fileId);
+
+	
+	std::string getFileName(int fileId);
+private:
+
+	std::string _basefilename;
+	std::string _path;
+	
+	std::vector<int> _nbKmerperFile;
+	std::vector<u_int64_t> _FileSize;
+
+	std::vector<system::IFile* > _files;
+	std::vector <system::ISynchronizer*> _synchros;
+	int _nb_files;
+};
+
+
+
+//encapsulate SuperKmerBinFiles I/O with a buffer
+class CacheSuperKmerBinFiles
+{
+	public:
+	CacheSuperKmerBinFiles(SuperKmerBinFiles * ref, int buffsize);
+	
+	CacheSuperKmerBinFiles (const CacheSuperKmerBinFiles& p);
+
+	void insertSuperkmer(u_int8_t* superk, int nb_bytes, u_int8_t nbk, int file_id);
+	void flushAll();
+	void flush(int file_id);
+	~CacheSuperKmerBinFiles();
+
+private:
+	SuperKmerBinFiles * _ref;
+	int _max_superksize;
+	int _buffer_max_capacity;
+	int _nb_files;
+	
+	std::vector< u_int8_t* > _buffers;
+	std::vector<int> _buffers_idx;
+	std::vector<int> _nbKmerperFile;
+
+};
+	
+	
+	
+/**********************************************************************
+######      #     ######   #######  ###  #######  ###  #######  #     #
+#     #    # #    #     #     #      #      #      #   #     #  ##    #
+#     #   #   #   #     #     #      #      #      #   #     #  # #   #
+######   #     #  ######      #      #      #      #   #     #  #  #  #
+#        #######  #   #       #      #      #      #   #     #  #   # #
+#        #     #  #    #      #      #      #      #   #     #  #    ##
+#        #     #  #     #     #     ###     #     ###  #######  #     #
+**********************************************************************/
+
+/** \brief Define a set of Collection instances having the same type.
+ *
+ * The Partition class groups several Collections that share the same kind
+ * of items.
+ *
+ * It is defined as a subclass of Group.
+ */
+template<typename Type>
+class Partition : public Group, public tools::collections::Iterable<Type>
+{
+public:
+
+    /** Constructor.
+     * \param[in] factory : factory to be used
+     * \param[in] parent : the parent node
+     * \param[in] id : the identifier of the instance to be created
+     * \param[in] nbCollections : number of collections for this partition
+     */
+    Partition (StorageFactory* factory, ICell* parent, const std::string& id, size_t nbCollections);
+
+    /** Destructor. */
+    ~Partition ();
+
+    /** Return the number of collections for this partition.
+     * \return the number of collections. */
+    size_t size()  const;
+
+    /** Get the ith collection
+     * \param[in] idx : index of the collection to be retrieved
+     * \return the wanted collection.
+     */
+    collections::Collection<Type>& operator[] (size_t idx);
+
+    /** \copydoc tools::collections::Iterable::iterator */
+    dp::Iterator<Type>* iterator ();
+
+    /** \copydoc tools::collections::Iterable::getNbItems */
+    int64_t getNbItems ();
+
+    /** \copydoc tools::collections::Iterable::estimateNbItems */
+    int64_t estimateNbItems ();
+
+    /** Return the sum of the items size.
+     * \return the total size. */
+    u_int64_t getSizeItems ();
+
+    /** Flush the whole partition (ie flush each collection). */
+    void flush ();
+
+    /** Remove physically the partition (ie. remove each collection). */
+    void remove ();
+
+protected:
+
+    StorageFactory* _factory;
+    std::vector <CollectionNode<Type>* > _typedCollections;
+    system::ISynchronizer* _synchro;
+};
+
+/********************************************************************************/
+
+/** \brief Cache (with potential synchronization) of a Partition.
+ *
+ * This class implements a cache for a Partition instance:
+ *  -> an 'insert' is first cached in memory; when the cache is full, all the items are inserted in the
+ *  real partition
+ *  -> flushing the cache in the real partition is protected with a synchronizer
+ *
+ *  A typical use case is to create several PartitionCache referring the same Partition, and use them
+ *  independently in different threads => in each thread, we will work on the local (cached) partition
+ *  like a normal partition (ie. use 'insert'), but without taking care to the concurrent accesses to
+ *  the referred partition (it is checked by the PartitionCache class).
+ */
+template<typename Type>
+class PartitionCache
+{
+public:
+
+    /** Constructor */
+    PartitionCache (Partition<Type>& ref, size_t nbItemsCache, system::ISynchronizer* synchro=0);
+
+    /** Copy constructor. */
+    PartitionCache (const PartitionCache<Type>& p);
+
+    /** Destructor. */
+    ~PartitionCache ();
+
+    /** Return the number of collections for this partition.
+     * \return the number of collections. */
+    size_t size() const;
+
+    /** Get the ith collection
+     * \param[in] idx : index of the collection to be retrieved
+     * \return the wanted collection.
+     */
+    collections::impl::CollectionCache<Type>& operator[] (size_t idx);
+
+    /** Flush the whole partition (ie flush each collection). */
+    void flush ();
+
+    /** Remove physically the partition (ie. remove each collection). */
+    void remove ();
+
+protected:
+    Partition<Type>& _ref;
+    size_t                     _nbItemsCache;
+    system::ISynchronizer*     _synchro;
+    std::vector <system::ISynchronizer*> _synchros;
+    std::vector <collections::impl::CollectionCache<Type>* > _cachedCollections;
+};
+
+/********************************************************************************/
+template<typename Type>
+class PartitionCacheSorted
+{
+public:
+    
+    /** Constructor */
+    PartitionCacheSorted (Partition<Type>& ref, size_t nbItemsCache, u_int32_t max_memory, system::ISynchronizer* synchro=0);
+    
+    /** Copy constructor. */
+    PartitionCacheSorted (const PartitionCacheSorted<Type>& p);
+    
+    /** Destructor. */
+    ~PartitionCacheSorted ();
+    
+    /** Return the number of collections for this partition.
+     * \return the number of collections. */
+    size_t size() const;
+    
+    /** Get the ith collection
+     * \param[in] idx : index of the collection to be retrieved
+     * \return the wanted collection.
+     */
+    collections::impl::CollectionCacheSorted<Type>& operator[] (size_t idx);
+    
+    /** Flush the whole partition (ie flush each collection). */
+    void flush ();
+    
+    /** Remove physically the partition (ie. remove each collection). */
+    void remove ();
+    
+protected:
+    Partition<Type>& _ref;
+    size_t                     _nbItemsCache;
+    system::ISynchronizer*     _synchro;
+    size_t _sharedBuffersSize;
+    u_int32_t _max_memory;
+    //only the model "parent" will have them, objects created with copy construc wont
+    std::vector <system::ISynchronizer*> _synchros;
+    std::vector <system::ISynchronizer*> _outsynchros;
+    std::vector <Type*> _sharedBuffers;
+    std::vector <size_t> _idxShared;
+    int  _numthread;
+    int  _nbliving;
+    bool _own_synchros;
+    bool _own_outsynchros;
+
+    std::vector <collections::impl::CollectionCacheSorted<Type>* > _cachedCollections;
+};
+    
+/********************************************************************************
+         #####   #######  #######  ######      #      #####   #######
+        #     #     #     #     #  #     #    # #    #     #  #
+        #           #     #     #  #     #   #   #   #        #
+         #####      #     #     #  ######   #     #  #  ####  #####
+              #     #     #     #  #   #    #######  #     #  #
+        #     #     #     #     #  #    #   #     #  #     #  #
+         #####      #     #######  #     #  #     #   #####   #######
+********************************************************************************/
+
+/** \brief Storage class
+ *
+ * The Storage class is the entry point for managing collections and groups.
+ *
+ * It delegates all the actions to a root group (retrievable through an operator overload).
+ *
+ * Such a storage is supposed to gather several information sets in a single environment,
+ * with possible hierarchical composition.
+ *
+ * It is a template class: one should provide the actual type of the collections containers.
+ * Possible template types could be designed for:
+ *   - classical file system
+ *   - HDF5 files
+ *   - memory
+ */
+class Storage : public Cell
+{
+public:
+
+    /** Constructor.
+     * \param[in] mode : storage mode
+     * \param[in] name : name of the storage.
+     * \param[in] autoRemove : tells whether the storage has to be physically deleted when this object is deleted. */
+    Storage (StorageMode_e mode, const std::string& name, bool autoRemove=false);
+
+    /** Destructor */
+    ~Storage ();
+
+    /** Get the name of the storage. */
+    std::string getName() const { return _name; }
+
+    Group& root () { return *getRoot(); }
+
+    /** Facility for retrieving the root group.
+     * \return the root group. */
+    Group& getGroup (const std::string name) { return this->operator() (name); }
+
+    /** Facility for retrieving the root group.
+     * \return the root group. */
+    Group& operator() (const std::string name="");
+
+    /** Remove physically the storage. */
+    virtual void remove ();
+
+    /** */
+    StorageFactory* getFactory() const { return _factory; }
+
+    /** WRAPPER C++ OUTPUT STREAM */
+    class ostream : public std::ostream
+    {
+    public:
+        ostream (Group& group, const std::string& name);
+        ~ostream ();
+    };
+
+    /** WRAPPER C++ INPUT STREAM */
+    class istream : public std::istream
+    {
+    public:
+        istream (Group& group, const std::string& name);
+        ~istream();
+    };
+
+protected:
+
+    std::string _name;
+
+    StorageFactory* _factory;
+    void setFactory (StorageFactory* factory);
+
+    /** Root group. */
+    Group* _root;
+    Group* getRoot ();
+    void setRoot (Group* root)  { SP_SETATTR(root); }
+
+    bool _autoRemove;
+};
+
+/********************************************************************************
+                #######     #      #####   #######  #######  ######   #     #
+                #          # #    #     #     #     #     #  #     #   #   #
+                #         #   #   #           #     #     #  #     #    # #
+   storage -    #####    #     #  #           #     #     #  ######      #
+                #        #######  #           #     #     #  #   #       #
+                #        #     #  #     #     #     #     #  #    #      #
+                #        #     #   #####      #     #######  #     #     #
+********************************************************************************/
+
+/** \brief Factory that creates instances related to the storage feature.
+ *
+ * This class provides some createXXX methods for instantiations.
+ *
+ * It also provides a few general methods like exists and load, so the name 'factory'
+ * may be not well choosen...
+ *
+ * Example 1:
+ * \snippet storage1.cpp  snippet1_storage
+ *
+ * Example 2:
+ * \snippet storage3.cpp  snippet1_storage
+ */
+class StorageFactory : public system::SmartPointer
+{
+public:
+
+    /** Constructor
+     * \param[in] mode : kind of storage to be used (HDF5 for instance)
+     */
+    StorageFactory (StorageMode_e mode) : _mode(mode)  {}
+
+    /** Create a Storage instance. This function is a bit of a misnomer: it can create a new storage instance and is also used to load an existing one.
+     * \param[in] name : name of the instance to be created
+     * \param[in] deleteIfExist : if the storage exits in file system, delete it if true.
+     * \param[in] autoRemove : auto delete the storage from file system during Storage destructor.
+     * \return the created Storage instance
+     */
+    Storage* create (const std::string& name, bool deleteIfExist, bool autoRemove, bool dont_add_extension = false, bool append = false);
+
+    /** Tells whether or not a Storage exists in file system given a name
+     * \param[in] name : name of the storage to be checked
+     * \return true if the storage exists in file system, false otherwise.
+     */
+    bool exists (const std::string& name);
+
+    /** Create a Storage instance from an existing storage in file system.
+     * \param[in] name : name of the file in file system
+     * \return the created Storage instance
+     */
+    Storage* load (const std::string& name) { return create (name, false, false); }
+
+    /** Create a Group instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the group to be created
+     * \param[in] name : name of the group to be created
+     * \return the created Group instance.
+     */
+    Group* createGroup (ICell* parent, const std::string& name);
+
+    /** Create a Partition instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the partition to be created
+     * \param[in] name : name of the partition to be created
+     * \param[in] nb : number of collections of the partition
+     * \return the created Partition instance.
+     */
+    template<typename Type>
+    Partition<Type>* createPartition (ICell* parent, const std::string& name, size_t nb);
+
+    /** Create a Collection instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the collection to be created
+     * \param[in] name : name of the collection to be created
+     * \param[in] synchro : synchronizer instance if needed
+     * \return the created Collection instance.
+     */
+    template<typename Type>
+    CollectionNode<Type>* createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro);
+
+private:
+
+    StorageMode_e _mode;
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+/********************************************************************************/
+/** WE INCLUDE THE 'IMPLEMENTATION' of the templates. */
+#include <gatb/tools/storage/impl/Storage.tpp>
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/Storage.tpp b/gatb-core/src/gatb/tools/storage/impl/Storage.tpp
new file mode 100644
index 0000000..b011425
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/Storage.tpp
@@ -0,0 +1,603 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {  namespace tools  {  namespace storage  {  namespace impl {
+/********************************************************************************/
+
+/********************************************************************************
+     #####   #######  #        #        #######   #####   #######
+    #     #  #     #  #        #        #        #     #     #
+    #        #     #  #        #        #        #           #
+    #        #     #  #        #        #####    #           #
+    #        #     #  #        #        #        #           #
+    #     #  #     #  #        #        #        #     #     #      ##
+     #####   #######  #######  #######  #######   #####      #      ##
+********************************************************************************/
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline CollectionNode<Item>::CollectionNode (
+    StorageFactory* factory, 
+    ICell* parent, 
+    const std::string& id, 
+    collections::Collection<Item>* ref
+)
+    : Cell(parent,id), collections::impl::CollectionAbstract<Item> (ref->bag(), ref->iterable()), _factory(factory), _ref(0)
+{
+    /** We get a token on the referred Collection instance. */
+    setRef(ref);
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline CollectionNode<Item>::~CollectionNode()
+{
+    /** We release the token of the Collection instance. */
+    setRef(0);
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline void CollectionNode<Item>::remove ()
+{
+    /** We delegate the job to the referred Collection instance. */
+    _ref->remove();
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline void CollectionNode<Item>::addProperty (const std::string& key, const std::string value)  
+{  
+    _ref->addProperty (key, value); 
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline std::string  CollectionNode<Item>::getProperty (const std::string& key) 
+{  
+    return _ref->getProperty (key); 
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Item>
+inline collections::Collection<Item>* CollectionNode<Item>::getRef ()  
+{ 
+    return _ref; 
+}
+
+/**********************************************************************
+             #####   ######   #######  #     #  ######
+            #     #  #     #  #     #  #     #  #     #
+            #        #     #  #     #  #     #  #     #
+            #  ####  ######   #     #  #     #  ######
+            #     #  #   #    #     #  #     #  #
+            #     #  #    #   #     #  #     #  #
+             #####   #     #  #######   #####   #
+**********************************************************************/
+
+/*********************************************************************
+*********************************************************************/
+inline Group::Group (StorageFactory* factory, ICell* parent, const std::string& name) 
+    : Cell(parent, name), _factory(factory) 
+{
+}
+
+/*********************************************************************
+*********************************************************************/
+inline Group::~Group()
+{
+    /** We release the collections. */
+    for (size_t i=0; i<_collections.size(); i++)  {  _collections[i]->forget();  }
+
+    /** We release the partitions. */
+    for (size_t i=0; i<_partitions.size(); i++)  { _partitions[i]->forget(); }
+
+    /** We release the groups. */
+    for (size_t i=0; i<_groups.size(); i++)  { _groups[i]->forget(); }
+}
+
+/*********************************************************************
+*********************************************************************/
+inline Group& Group::getGroup (const std::string& name)
+{
+    Group* group=0;  for (size_t i=0; !group && i<_groups.size(); i++)  {  if (_groups[i]->getId() == name)  { group = _groups[i]; }  }
+
+    if (group == 0)
+    {
+        group = _factory->createGroup (this, name);
+        _groups.push_back (group);
+        group->use ();
+    }
+    return *group;
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Type>  
+inline Partition<Type>&  Group::getPartition (const std::string& name, size_t nb)
+{
+    Partition<Type>* result = _factory->createPartition<Type> (this, name, nb);
+    _partitions.push_back(result);
+    result->use();
+    return *result;
+}
+
+/*********************************************************************
+*********************************************************************/
+template <class Type>  
+inline CollectionNode<Type>&  Group::getCollection (const std::string& name)
+{
+    CollectionNode<Type>* result = _factory->createCollection<Type> (this, name, 0);
+    _collections.push_back (result);
+    result->use ();
+    return *result;
+}
+
+/*********************************************************************
+*********************************************************************/
+inline void Group::remove ()
+{
+    /** We remove the collections. */
+    for (size_t i=0; i<_collections.size(); i++)  {  _collections[i]->remove ();  }
+
+    /** We remove the partitions. */
+    for (size_t i=0; i<_partitions.size(); i++)   { _partitions[i]->remove(); }
+
+    /** We remove the children groups. */
+    for (size_t i=0; i<_groups.size(); i++)       { _groups[i]->remove(); }
+}
+
+/**********************************************************************
+######      #     ######   #######  ###  #######  ###  #######  #     #
+#     #    # #    #     #     #      #      #      #   #     #  ##    #
+#     #   #   #   #     #     #      #      #      #   #     #  # #   #
+######   #     #  ######      #      #      #      #   #     #  #  #  #
+#        #######  #   #       #      #      #      #   #     #  #   # #
+#        #     #  #    #      #      #      #      #   #     #  #    ##
+#        #     #  #     #     #     ###     #     ###  #######  #     #
+**********************************************************************/
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline Partition<Type>::Partition (StorageFactory* factory, ICell* parent, const std::string& id, size_t nbCollections)
+    : Group (factory, parent, id), _factory(factory), _typedCollections(nbCollections), _synchro(0)
+{
+    /** We create a synchronizer to be shared by the collections. */
+    _synchro = system::impl::System::thread().newSynchronizer();
+
+    /** We want to instantiate the wanted number of collections. */
+    for (size_t i=0; i<_typedCollections.size(); i++)
+    {
+        /** We define the name of the current partition as a mere number. */
+        std::stringstream ss;  ss << i;
+
+        CollectionNode<Type>* result = _factory->createCollection<Type> (this, ss.str(), _synchro);
+
+        /** We add the collection node to the dedicated vector and take a token for it. */
+        (_typedCollections [i] = result)->use ();
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline Partition<Type>::~Partition ()
+{
+    /** We release the token for each collection node. */
+    for (size_t i=0; i<_typedCollections.size(); i++)  { _typedCollections[i]->forget ();  }
+
+    delete _synchro;
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline size_t Partition<Type>::size()  const  
+{ 
+    return _typedCollections.size(); 
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline collections::Collection<Type>& Partition<Type>::operator[] (size_t idx)  
+{  
+    return  * _typedCollections[idx]->getRef();  
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline dp::Iterator<Type>* Partition<Type>::iterator ()
+{
+    std::vector <dp::Iterator<Type>*> iterators;
+    for (size_t i=0; i<this->size(); i++) { iterators.push_back ((*this)[i].iterator()); }
+    return new dp::impl::CompositeIterator<Type> (iterators);
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline int64_t Partition<Type>::getNbItems ()
+{
+    int64_t result = 0;   for (size_t i=0; i<this->size(); i++) { result += (*this)[i].getNbItems(); }
+    //std::cout << "returning getNbItems from " << this->size() << " partitions: " << result << std::endl;
+    return result;
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline u_int64_t Partition<Type>::getSizeItems ()
+{
+    u_int64_t result = 0;   for (size_t i=0; i<this->size(); i++) { result += (*this)[i].getNbItems() * sizeof(Type); }
+    return result;
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline int64_t Partition<Type>::estimateNbItems ()
+{
+    int64_t result = 0;   for (size_t i=0; i<this->size(); i++) { result += (*this)[i].estimateNbItems(); }
+    return result;
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline void Partition<Type>::flush ()
+{
+    for (size_t i=0; i<_typedCollections.size(); i++)  { _typedCollections[i]->flush();  }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline void Partition<Type>::remove ()
+{
+    /** We remove each collection of this partition. */
+    for (size_t i=0; i<_typedCollections.size(); i++)  { _typedCollections[i]->remove ();  }
+
+    /** We call the remove of the parent class. */
+    Group::remove ();
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline PartitionCache<Type>::PartitionCache (Partition<Type>& ref, size_t nbItemsCache, system::ISynchronizer* synchro)
+    :  _ref(ref), _nbItemsCache(nbItemsCache), _synchro(synchro), _synchros(ref.size()), _cachedCollections(ref.size())
+{
+    /** We create the partition files. */
+    for (size_t i=0; i<_cachedCollections.size(); i++)
+    {
+        if(synchro==0)
+        {
+            _synchros[i] = system::impl::System::thread().newSynchronizer();
+        }
+        else
+        {
+            _synchros[i] = synchro;
+        }
+        _synchros[i]->use();
+
+        _cachedCollections[i] = new collections::impl::CollectionCache<Type> (ref[i], nbItemsCache, _synchros[i]);
+        _cachedCollections[i]->use ();
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline PartitionCache<Type>::PartitionCache (const PartitionCache<Type>& p)
+    : _ref(p._ref), _nbItemsCache(p._nbItemsCache), _synchro(p._synchro) , _synchros(p._synchros), _cachedCollections(p.size())
+{
+    /** We create the partition files. */
+    for (size_t i=0; i<_cachedCollections.size(); i++)
+    {
+        PartitionCache<Type>& pp = (PartitionCache<Type>&)p;
+
+        _cachedCollections[i] = new collections::impl::CollectionCache<Type> (pp[i].getRef(), p._nbItemsCache, p._synchros[i]);
+        _cachedCollections[i]->use ();
+        _synchros[i]->use();
+
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline PartitionCache<Type>::~PartitionCache ()
+{
+    flush ();
+    for (size_t i=0; i<_cachedCollections.size(); i++)  {
+        _cachedCollections[i]->forget ();
+        _synchros[i]->forget();
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline size_t  PartitionCache<Type>::size() const 
+{ 
+    return _cachedCollections.size(); 
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline collections::impl::CollectionCache<Type>&   PartitionCache<Type>::operator[] (size_t idx)  
+{  
+    return * _cachedCollections[idx];  
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline void PartitionCache<Type>::flush ()   
+{  
+    for (size_t i=0; i<_cachedCollections.size(); i++)  { _cachedCollections[i]->flush();  }  
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline void PartitionCache<Type>::remove ()  
+{  
+    for (size_t i=0; i<_cachedCollections.size(); i++)  { _cachedCollections[i]->remove ();  } 
+}
+    
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline PartitionCacheSorted<Type>::PartitionCacheSorted (Partition<Type>& ref, size_t nbItemsCache, u_int32_t max_memory, system::ISynchronizer* synchro)
+:  _ref(ref), _nbItemsCache(nbItemsCache), _synchro(synchro), _cachedCollections(ref.size()) , _synchros(ref.size()) , _outsynchros(ref.size()), _sharedBuffers(ref.size()), _idxShared(ref.size()), _max_memory(max_memory),_numthread(-1),_nbliving(0)
+{
+
+    //todo should also take into account the temp buffer used for sorting, ie max nb threads * buffer, so should be
+   // _sharedBuffersSize = (_max_memory*system::MBYTE / (_cachedCollections.size()  + nbthreads) ) / sizeof(Type); //in nb elems
+    
+    _sharedBuffersSize = (_max_memory*system::MBYTE / _cachedCollections.size()  ) / sizeof(Type); //in nb elems
+    _sharedBuffersSize = std::max(2*nbItemsCache,_sharedBuffersSize);
+   // _sharedBuffersSize = 1*system::MBYTE  / sizeof(Type);
+
+    printf("sort cache of %zu elems \n",_sharedBuffersSize);
+    /** We create the partition files. */
+    for (size_t i=0; i<_cachedCollections.size(); i++)
+    {
+
+        if(synchro==0)
+        {
+            _synchros[i] = system::impl::System::thread().newSynchronizer();
+        }
+        else
+        {
+            _synchros[i] = synchro;
+        }
+        
+        _outsynchros[i] = system::impl::System::thread().newSynchronizer();
+        
+        _synchros[i]->use();
+        _outsynchros[i]->use();
+        
+       // printf("Creating outsync %p   \n",_outsynchros[i] );
+
+        _sharedBuffers[i] = (Type*) system::impl::System::memory().calloc (_sharedBuffersSize, sizeof(Type));
+        //system::impl::System::memory().memset (_sharedBuffers[i], 0, _sharedBuffersSize*sizeof(Type));
+       // printf("Creating shared buffer %p   \n",_sharedBuffers[i] );
+
+
+        
+        _cachedCollections[i] = new collections::impl::CollectionCacheSorted<Type> (ref[i], nbItemsCache,_sharedBuffersSize, _synchros[i],_outsynchros[i],_sharedBuffers[i],&_idxShared[i]);
+        //
+        _cachedCollections[i]->use ();
+    }
+}
+
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline PartitionCacheSorted<Type>::PartitionCacheSorted (const PartitionCacheSorted<Type>& p)
+: _ref(p._ref), _nbItemsCache(p._nbItemsCache), _synchro(p._synchro), _cachedCollections(p.size()) , _synchros(p._synchros), _outsynchros(p._outsynchros), _sharedBuffers(0),_idxShared(0)
+{
+
+   //_numthread =  __sync_fetch_and_add (&p._nbliving, 1);
+
+    /** We create the partition files. */
+    for (size_t i=0; i<_cachedCollections.size(); i++)
+    {
+
+        _synchros[i]->use();
+        _outsynchros[i]->use();
+        
+        PartitionCacheSorted<Type>& pp = (PartitionCacheSorted<Type>&)p;
+        
+        _cachedCollections[i] = new collections::impl::CollectionCacheSorted<Type> (pp[i].getRef(), p._nbItemsCache,p._sharedBuffersSize, p._synchros[i],p._outsynchros[i],p._sharedBuffers[i],&(pp._idxShared[i]) ); //
+        _cachedCollections[i]->use ();
+    }
+}
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline PartitionCacheSorted<Type>::~PartitionCacheSorted ()
+{
+    //printf("destruc parti cache sorted tid %i \n",_numthread);
+    flush ();
+
+    for (size_t i=0; i<_cachedCollections.size(); i++)  {
+        //destruction of collection will also flush the output bag (which is shared between all threads) , so need to lock it also
+        _outsynchros[i]->lock();
+        _cachedCollections[i]->forget ();
+        _outsynchros[i]->unlock();
+
+        
+        _synchros[i]->forget();
+        _outsynchros[i]->forget();
+    }
+    
+    for (typename std::vector<Type*>::iterator it = _sharedBuffers.begin() ; it != _sharedBuffers.end(); ++it)
+    {
+        //printf("destroying shared buffer %p \n",*it);
+        system::impl::System::memory().free (*it);
+    }
+
+}
+
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline size_t  PartitionCacheSorted<Type>::size() const
+{
+    return _cachedCollections.size();
+}
+
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline collections::impl::CollectionCacheSorted<Type>&   PartitionCacheSorted<Type>::operator[] (size_t idx)
+{
+    return * _cachedCollections[idx];
+}
+
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline void PartitionCacheSorted<Type>::flush ()
+{
+    //printf("PartitionCacheSorted flush  this %p \n",this);
+    for (size_t i=0; i<_cachedCollections.size(); i++)  { _cachedCollections[i]->flush();  }
+}
+
+/*********************************************************************
+ *********************************************************************/
+template<typename Type>
+inline void PartitionCacheSorted<Type>::remove ()
+{  
+    for (size_t i=0; i<_cachedCollections.size(); i++)  { _cachedCollections[i]->remove ();  } 
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#include <gatb/tools/storage/impl/StorageHDF5.hpp>
+#include <gatb/tools/storage/impl/StorageFile.hpp>
+
+/********************************************************************************/
+namespace gatb  {  namespace core  {  namespace tools  {  namespace storage  {  namespace impl {
+/********************************************************************************/
+
+/********************************************************************************
+        #######     #      #####   #######  #######  ######   #     #
+        #          # #    #     #     #     #     #  #     #   #   #
+        #         #   #   #           #     #     #  #     #    # #
+        #####    #     #  #           #     #     #  ######      #
+        #        #######  #           #     #     #  #   #       #
+        #        #     #  #     #     #     #     #  #    #      #
+        #        #     #   #####      #     #######  #     #     #
+********************************************************************************/
+
+/*********************************************************************
+*********************************************************************/
+inline Storage* StorageFactory::create (const std::string& name, bool deleteIfExist, bool autoRemove, bool dont_add_extension, bool append)
+{
+    switch (_mode)
+    {
+        case STORAGE_HDF5:  return StorageHDF5Factory::createStorage (name, deleteIfExist, autoRemove, dont_add_extension, append);
+        case STORAGE_FILE:  return StorageFileFactory::createStorage (name, deleteIfExist, autoRemove);
+        case STORAGE_GZFILE:  return StorageGzFileFactory::createStorage (name, deleteIfExist, autoRemove);
+        case STORAGE_COMPRESSED_FILE:  return StorageSortedFactory::createStorage (name, deleteIfExist, autoRemove);
+        default:            throw system::Exception ("Unknown mode in StorageFactory::createStorage");
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+inline bool StorageFactory::exists (const std::string& name)
+{
+    switch (_mode)
+    {
+        case STORAGE_HDF5:              return StorageHDF5Factory::exists (name);
+        case STORAGE_FILE:              return StorageFileFactory::exists (name);
+        case STORAGE_GZFILE:            return StorageGzFileFactory::exists (name);
+        case STORAGE_COMPRESSED_FILE:   return StorageSortedFactory::exists (name);
+        default:            throw system::Exception ("Unknown mode in StorageFactory::exists");
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+inline Group* StorageFactory::createGroup (ICell* parent, const std::string& name)
+{
+    switch (_mode)
+    {
+        case STORAGE_HDF5:  return StorageHDF5Factory::createGroup (parent, name);
+        case STORAGE_FILE:  return StorageFileFactory::createGroup (parent, name);
+        case STORAGE_GZFILE:  return StorageGzFileFactory::createGroup (parent, name);
+        case STORAGE_COMPRESSED_FILE:  return StorageSortedFactory::createGroup (parent, name);
+
+        default:            throw system::Exception ("Unknown mode in StorageFactory::createGroup");
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline Partition<Type>* StorageFactory::createPartition (ICell* parent, const std::string& name, size_t nb)
+{
+    switch (_mode)
+    {
+        case STORAGE_HDF5:  return StorageHDF5Factory::createPartition<Type> (parent, name, nb);
+        case STORAGE_FILE:  return StorageFileFactory::createPartition<Type> (parent, name, nb);
+        case STORAGE_GZFILE:  return StorageGzFileFactory::createPartition<Type> (parent, name, nb);
+        case STORAGE_COMPRESSED_FILE:  return StorageSortedFactory::createPartition<Type> (parent, name, nb);
+
+        default:            throw system::Exception ("Unknown mode in StorageFactory::createPartition");
+    }
+}
+
+/*********************************************************************
+*********************************************************************/
+template<typename Type>
+inline CollectionNode<Type>* StorageFactory::createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro)
+{
+    switch (_mode)
+    {
+        case STORAGE_HDF5:  return StorageHDF5Factory::createCollection<Type> (parent, name, synchro);
+        case STORAGE_FILE:  return StorageFileFactory::createCollection<Type> (parent, name, synchro);
+        case STORAGE_GZFILE:  return StorageGzFileFactory::createCollection<Type> (parent, name, synchro);
+        case STORAGE_COMPRESSED_FILE:  return StorageSortedFactory::createCollection<Type> (parent, name, synchro);
+
+        default:            throw system::Exception ("Unknown mode in StorageFactory::createCollection");
+    }
+}
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/storage/impl/StorageFile.hpp b/gatb-core/src/gatb/tools/storage/impl/StorageFile.hpp
new file mode 100644
index 0000000..7004a97
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/StorageFile.hpp
@@ -0,0 +1,414 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file StorageFile.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_FILE_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_FILE_HPP_
+
+/********************************************************************************/
+
+#include <cassert>
+#include <gatb/tools/storage/impl/CollectionFile.hpp>
+#include <json/json.hpp>
+#include <iostream>
+#include <fstream>
+
+#define DEBUG_STORAGE(a)  //printf a
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+    class GroupFile : public Group
+    {
+        public:
+            GroupFile (Storage* storage, ICell* parent, const std::string& name)
+                : Group(storage->getFactory(),parent,name), filename("")
+            {
+
+                std::string prefix = storage->getName();
+                folder = prefix;
+                if (!system::impl::System::file().isFolderEndingWith(prefix,"_gatb"))
+				    folder += "_gatb/";
+
+				// create folder if it doesn't exist
+				if(!system::impl::System::file().doesExistDirectory(folder)){
+					int ok = system::impl::System::file().mkdir(folder, 0755);
+					if(ok != 0){  
+                        std::cout << "Error: can't create output directory (" << folder<< ")\n" << " debug, doesexist:" << system::impl::System::file().doesExistDirectory(folder);
+                    std::cout << "created directory " << folder << std::endl;
+					}   
+				}
+				/** We may need to create the HDF5 group. Empty name means root group, which is constructed by default. */
+                if (name.empty() == false)
+                {
+                    filename = folder + parent->getFullId('.') + std::string(".") + name;
+                }
+                else
+                {
+                    filename = folder + parent->getFullId('.') + std::string(".") + "json" /* i chose this name arbitrarily*/;
+                }
+
+                std::ifstream myfile (filename);
+                std::string data, line;
+                if (myfile.is_open())
+                {
+                    while ( getline (myfile,line) )
+                    {
+                        data += line;
+                    }
+                    myfile.close();
+                }
+                //std::cout << "data:" << data<< std::endl;
+                if (data.size() > 0)
+                    j = json::LoadJson(data); // populate json array;
+
+                //std::cout << "GroupFile initialized" << std::endl;
+            }
+
+            /** */
+            ~GroupFile()
+            {
+				system::impl::System::file().rmdir(folder); // hack to remove the trashme folers. I'd have liked to make that call in remove() but for some reason remove() isn't called
+            }
+
+            /** */
+            void addProperty (const std::string& key, const std::string value)
+            {
+                //std::cout << "GRoupFile addProperty called with: " << key << " / " << value << std::endl;
+                j[key] = value;
+                flushJson();               
+            }
+
+            /** */
+            std::string getProperty (const std::string& key)
+            {
+                //std::cout << "GroupFile getProperty called with: " << key << std::endl;
+                std::string result;
+
+                if (j.hasKey(key)) {
+                    return j[key].ToString();
+                }
+                return "";
+            }
+
+            /* this is unused - also the json api we're using doesn't support it - hdf5 needed it for stupid reasons */
+            void delProperty (const std::string& key)
+            {
+                j[key]="";
+                flushJson();
+            }
+
+            void setProperty (const std::string& key, const std::string value)
+            {
+                //std::cout << "GRoupFile setProperty called with: " << key << " / " << value << std::endl;
+                j[key] = value;
+                flushJson(); 
+            }
+
+            void flushJson()
+            {
+                std::string s = j.dump();
+                std::ofstream myfile;
+                myfile.open (filename);
+                myfile << s;
+                myfile.close();
+            }
+
+            // for some reason this isn't called. let me know if it is
+            void remove ()
+            {
+                std::cout << "GroupFile remove called" << std::endl;
+            }
+
+        private:
+            json::JSON j;
+            std::string filename;
+            std::string folder;
+    };
+
+
+/** \brief Factory used for storage of kind STORAGE_FILE
+ */
+class StorageFileFactory
+{
+public:
+
+    /** Create a Storage instance.
+     * \param[in] name : name of the instance to be created
+     * \param[in] deleteIfExist : if the storage exits in file system, delete it if true.
+     * \param[in] autoRemove : auto delete the storage from file system during Storage destructor.
+     * \return the created Storage instance
+     */
+    static Storage* createStorage (const std::string& name, bool deleteIfExist, bool autoRemove)
+    {
+        DEBUG_STORAGE (("StorageFileFactory::createStorage  name='%s'\n", name.c_str()));
+        return new Storage (STORAGE_FILE, name, autoRemove);
+    }
+
+    /** Tells whether or not a Storage exists in file system given a name
+     * \param[in] name : name of the storage to be checked
+     * \return true if the storage exists in file system, false otherwise.
+     */
+    static bool exists (const std::string& name)
+    {
+        return false;
+    }
+
+    /** Create a Group instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the group to be created
+     * \param[in] name : name of the group to be created
+     * \return the created Group instance.
+     */
+    static Group* createGroup (ICell* parent, const std::string& name)
+    {
+        DEBUG_STORAGE (("StorageFileFactory::createGroup  name='%s'\n", name.c_str()));
+
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+
+        return new GroupFile (storage, parent, name);
+    }
+
+    /** Create a Partition instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the partition to be created
+     * \param[in] name : name of the partition to be created
+     * \param[in] nb : number of collections of the partition
+     * \return the created Partition instance.
+     */
+    template<typename Type>
+    static Partition<Type>* createPartition (ICell* parent, const std::string& name, size_t nb)
+    {
+        DEBUG_STORAGE (("StorageFileFactory::createPartition  name='%s'\n", name.c_str()));
+
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+
+        // get the partitions folder and prefix
+        std::string storage_prefix = storage->getName();
+        std::string file_folder = storage_prefix;
+        if (!system::impl::System::file().isFolderEndingWith(storage_prefix,"_gatb"))
+            file_folder += "_gatb/";
+
+        std::string filename = file_folder + parent->getFullId('.') + std::string(".") + name;
+        std::string folder = system::impl::System::file().getDirectory(filename);
+        std::string prefix = system::impl::System::file().getBaseName(filename);
+
+        if (nb == 0)
+        {   // if nb is 0, it means we're opening partitions and not creating them, thus we need to get the number of partitions.
+
+           int nb_partitions=0;
+           for (auto filename : system::impl::System::file().listdir(folder))
+            {
+                if (!filename.compare(0, prefix.size(), prefix)) // startswith
+                {
+                    nb_partitions++;
+                }
+			}
+            nb = nb_partitions;
+            if (nb == 0)
+            {
+                std::cout << "error: could not get number of partition for " << name << " using StorageFile" << std::endl;
+                exit(1);
+            }
+		}
+        else
+        {
+            // else, if nb is set, means we're creating some partitions. let's delete all the previous ones to avoid wrongly counting 
+            for (auto filename : system::impl::System::file().listdir(folder))
+            {
+                //std::cout <<"name: " << name << " comparing " << filename << " with prefix " << prefix << std::endl;
+                if (!filename.compare(0, prefix.size(), prefix)) // startswith
+                {
+                    // some additional guard:
+                    if (filename == "." ||filename == "..") continue;
+                    system::impl::System::file().remove(folder + "/" + filename);
+                    //std::cout << "deleting" << folder << "/" << filename << std::endl;
+                }
+            }
+        }
+
+        Partition<Type>* result = new Partition<Type> (storage->getFactory(), parent, name, nb);
+        return result;
+    }
+
+    /** Create a Collection instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the collection to be created
+     * \param[in] name : name of the collection to be created
+     * \param[in] synchro : synchronizer instance if needed
+     * \return the created Collection instance.
+     */
+    template<typename Type>
+    static CollectionNode<Type>* createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro)
+    {
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+
+        std::string storage_prefix = storage->getName();
+        std::string folder = storage_prefix;
+        if (!system::impl::System::file().isFolderEndingWith(storage_prefix,"_gatb"))
+            folder += "_gatb/";
+
+		// create folder if it doesn't exist
+		if(!system::impl::System::file().doesExistDirectory(folder)){
+			int ok = system::impl::System::file().mkdir(folder, 0755);
+			if(ok != 0){  
+                std::cout << "Error: can't create output directory (" << folder<< ")\n" << " debug, doesexist:" << system::impl::System::file().doesExistDirectory(folder);
+			}   
+                    std::cout << "created directory " << folder << std::endl;
+		}
+
+        /** We define the full qualified id of the current collection to be created. */
+        std::string actualName = folder + parent->getFullId('.') + std::string(".") + name;
+
+		DEBUG_STORAGE (("StorageFileFactory::createCollection  name='%s'  actualName='%s' \n", name.c_str(), actualName.c_str() ));
+
+        return new CollectionNode<Type> (storage->getFactory(), parent, name, new CollectionFile<Type>(actualName));
+    }
+};
+
+/********************************************************************************/
+/* Experimental (not documented). */
+class StorageGzFileFactory
+{
+public:
+    
+    /** */
+    static Storage* createStorage (const std::string& name, bool deleteIfExist, bool autoRemove)
+    {
+        return new Storage (STORAGE_GZFILE, name, autoRemove);
+    }
+    
+    /** */
+    static bool exists (const std::string& name)
+    {
+        return false;
+    }
+
+    /** */
+    static Group* createGroup (ICell* parent, const std::string& name)
+    {
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        return new Group (storage->getFactory(), parent, name);
+    }
+    
+    /** */
+    template<typename Type>
+    static Partition<Type>* createPartition (ICell* parent, const std::string& name, size_t nb)
+    {
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        Partition<Type>* result = new Partition<Type> (storage->getFactory(), parent, name, nb);
+        return result;
+    }
+    
+    /** */
+    template<typename Type>
+    static CollectionNode<Type>* createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro)
+    {
+        /** We define the full qualified id of the current collection to be created. */
+        std::string actualName = std::string("tmp.") + name;
+        
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        return new CollectionNode<Type> (storage->getFactory(), parent, name, new CollectionGzFile<Type>(actualName));
+    }
+};
+
+/********************************************************************************/
+/* Experimental (not documented). */
+class StorageSortedFactory
+{
+public:
+    
+    /** */
+    static Storage* createStorage (const std::string& name, bool deleteIfExist, bool autoRemove)
+    {
+        return new Storage (STORAGE_COMPRESSED_FILE, name, autoRemove);
+    }
+    
+    /** */
+    static bool exists (const std::string& name)
+    {
+        return false;
+    }
+
+    /** */
+    static Group* createGroup (ICell* parent, const std::string& name)
+    {
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        return new Group (storage->getFactory(), parent, name);
+    }
+    
+    /** */
+    template<typename Type>
+    static Partition<Type>* createPartition (ICell* parent, const std::string& name, size_t nb)
+    {
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        Partition<Type>* result = new Partition<Type> (storage->getFactory(), parent, name, nb);
+        return result;
+    }
+    
+    /** */
+    template<typename Type>
+    static CollectionNode<Type>* createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro)
+    {
+        /** We define the full qualified id of the current collection to be created. */
+        std::string actualName = std::string("tmp.") + name;
+        
+        ICell* root = ICell::getRoot (parent);
+        Storage* storage = dynamic_cast<Storage*> (root);
+        assert (storage != 0);
+        
+        return new CollectionNode<Type> (storage->getFactory(), parent, name, new CollectionCountFile<Type>(actualName));
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_FILE_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/StorageHDF5.hpp b/gatb-core/src/gatb/tools/storage/impl/StorageHDF5.hpp
new file mode 100644
index 0000000..29e0949
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/StorageHDF5.hpp
@@ -0,0 +1,406 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file StorageHDF5.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds interfaces related to the Collection interface
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HDF5_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HDF5_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/storage/impl/CollectionHDF5.hpp>
+#include <gatb/tools/storage/impl/CollectionHDF5Patch.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <hdf5/hdf5.h>
+#include <sstream>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief Factory used for storage of kind STORAGE_HDF5
+ */
+class StorageHDF5Factory
+{
+public:
+
+    /** Create a Storage instance.
+     * \param[in] name : name of the instance to be created
+     * \param[in] deleteIfExist : if the storage exits in file system, delete it if true.
+     * \param[in] autoRemove : auto delete the storage from file system during Storage destructor.
+     * \return the created Storage instance
+     */
+    static Storage* createStorage (const std::string& name, bool deleteIfExist, bool autoRemove, bool dont_add_extension = false, bool append = false)
+    {
+        return new StorageHDF5 (STORAGE_HDF5, name, deleteIfExist, autoRemove, dont_add_extension, append);
+    }
+
+    /** Tells whether or not a Storage exists in file system given a name
+     * \param[in] name : name of the storage to be checked
+     * \return true if the storage exists in file system, false otherwise.
+     */
+    static bool exists (const std::string& name)
+    {
+        H5Eset_auto (0, NULL, NULL);
+
+        bool result = false;
+        {
+            hid_t id = H5Fopen (name.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+            if (id > 0)  {  H5Fclose(id);  result = true;  }
+        }
+        {
+            hid_t id = H5Fopen ((name+".h5").c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+            if (id > 0)  {  H5Fclose(id);  result = true;  }
+        }
+        return result;
+    }
+
+    /** Create a Group instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the group to be created
+     * \param[in] name : name of the group to be created
+     * \return the created Group instance.
+     */
+    static Group* createGroup (ICell* parent, const std::string& name)
+    {
+        StorageHDF5* storage = dynamic_cast<StorageHDF5*> (ICell::getRoot (parent));
+        assert (storage != 0);
+
+        return new GroupHDF5 (storage, parent, name);
+    }
+
+    /** Create a Partition instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the partition to be created
+     * \param[in] name : name of the partition to be created
+     * \param[in] nb : number of collections of the partition
+     * \return the created Partition instance.
+     */
+    template<typename Type>
+    static Partition<Type>* createPartition (ICell* parent, const std::string& name, size_t nb)
+    {
+        StorageHDF5* storage = dynamic_cast<StorageHDF5*> (ICell::getRoot (parent));
+        assert (storage != 0);
+
+        std::string actualName = parent->getFullId('/') + "/" + name;
+
+        /** We create the HDF5 group if needed. This will just create the entry if not already existing. */
+        GroupHDF5 group (storage, parent, name);
+
+        /** If the nb of partitions is null, we try to get it from a property. */
+        if (nb==0)
+        {
+            nb = StorageHDF5Factory::getPartitionsNb (&group);
+
+            /** For backward compatibility only (ugly) : we look for the attribute in the parent object. */
+            if (nb==0)  {  nb = StorageHDF5Factory::getPartitionsNb (dynamic_cast<Group*> (parent));  }
+
+            /** Ok, we can't find any value. */
+            if (nb==0)  {  throw system::Exception ("Partition '%s' has 0 items", name.c_str());      }
+        }
+        else
+        {
+            std::stringstream ss; ss << nb;
+            group.addProperty (StorageHDF5Factory::getNbPartitionsName(), ss.str());
+        }
+
+        return new Partition<Type> (storage->getFactory(), parent, name, nb);
+    }
+
+    /** Create a Collection instance and attach it to a cell in a storage.
+     * \param[in] parent : parent of the collection to be created
+     * \param[in] name : name of the collection to be created
+     * \param[in] synchro : synchronizer instance if needed
+     * \return the created Collection instance.
+     */
+    template<typename Type>
+    static CollectionNode<Type>* createCollection (ICell* parent, const std::string& name, system::ISynchronizer* synchro)
+    {
+#if 1
+        synchro = GlobalSynchro::singleton();
+#endif
+
+        StorageHDF5* storage = dynamic_cast<StorageHDF5*> (ICell::getRoot (parent));
+        assert (storage != 0);
+
+        std::string actualName = parent->getFullId('/') + "/" + name;
+
+        /** NOTE: we use here CollectionHDF5Patch and not CollectionHDF5 in order to reduce resources leaks due to HDF5.
+         * (see also comments in CollectionHDF5Patch). */
+        return new CollectionNode<Type> (storage->getFactory(), parent, name, new CollectionHDF5Patch<Type>(storage->getFileId(), actualName, synchro, parent->getCompressLevel()));
+        //return new CollectionNode<Type> (storage->getFactory(), parent, name, new CollectionHDF5<Type>(storage->getFileId(), actualName, synchro /*, parent->getCompressLevel()*/)); // tried the old way
+    }
+
+private:
+
+    class GlobalSynchro
+    {
+    public:
+        static system::ISynchronizer* singleton()
+        {
+            static GlobalSynchro instance;
+            return instance.synchro;
+        }
+
+    private:
+        GlobalSynchro ()  { synchro = system::impl::System::thread().newSynchronizer(); }
+        ~GlobalSynchro () { if (synchro)  { delete synchro; } }
+        system::ISynchronizer* synchro;
+    };
+
+    /* */
+    static const char* getNbPartitionsName()  { return "nb_partitions"; }
+
+    /** Get the number of partitions (if any).
+     * \param[in] group : check the attribute in this group
+     * \return 0 if no attribute, otherwise the number of partitions */
+    static size_t getPartitionsNb (Group* group)
+    {
+        size_t result = 0;
+        if (group != 0)
+        {
+            std::string nbPartStr = group->getProperty (getNbPartitionsName());
+            if (nbPartStr.empty()==false)  { result = atoi (nbPartStr.c_str()); }
+        }
+        return result;
+    }
+
+    /************************************************************/
+    class StorageHDF5 : public Storage
+    {
+    public:
+        StorageHDF5 (StorageMode_e mode, const std::string& name, bool deleteIfExist, bool autoRemove, bool dont_add_extension = false, bool append = false)
+            : Storage (mode, name, autoRemove), _fileId(0), _name(name), _dont_add_extension(dont_add_extension)
+        {
+            if (deleteIfExist)  {  system::impl::System::file().remove (getActualName());  }
+
+            /** We test the actual name exists in filesystem. */
+            bool exists = system::impl::System::file().doesExist(getActualName());
+			
+            if (exists==true)
+            {
+                /** We open the existing file. */
+                if (append)
+                    _fileId = H5Fopen (getActualName().c_str(), H5F_ACC_RDWR, H5P_DEFAULT); /* opened as read/write. Used in Graph.cpp, for opening exiting h5 files (e.g. created by DSK) and adding graph stuff to them (eg bloom, mphf) */
+                else
+                    _fileId = H5Fopen (getActualName().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+            }
+            else
+            {
+                /** We create a new file using default properties. */
+                _fileId = H5Fcreate (getActualName().c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+            }
+        }
+
+        virtual ~StorageHDF5 ()
+        {
+            if (_autoRemove)  { remove(); }
+            H5Fclose(_fileId);
+        }
+
+        hid_t getFileId ()  { return _fileId; }
+
+        void remove ()
+        {
+            system::impl::System::file().remove (getActualName());
+        }
+
+
+    private:
+        hid_t       _fileId;
+        std::string _name;
+        std::string _actualName;
+		bool _dont_add_extension;
+		
+        /** */
+        std::string getActualName ()
+        {
+            /** We set the actual name at first call. */
+            if (_actualName.empty())
+            {
+                _actualName = _name;
+                /** We check whether the given name has a ".h5" suffix. */
+                if ((_name.rfind(".h5") == std::string::npos) && !_dont_add_extension )  {  _actualName += ".h5";  }
+
+            }
+            return _actualName;
+        }
+
+        /** */
+        std::string getName       () const  { return _name;         }
+
+    };
+
+    /************************************************************/
+    class GroupHDF5 : public Group
+    {
+    public:
+        GroupHDF5 (StorageHDF5* storage, ICell* parent, const std::string& name)
+        : Group(storage->getFactory(),parent,name), _groupId(0)
+        {
+            /** We may need to create the HDF5 group. Empty name means root group, which is constructed by default. */
+            if (name.empty() == false)
+            {
+                std::string actualName = this->getFullId('/');
+
+                /** We create the HDF5 group if needed. */
+                htri_t doesExist = H5Lexists (storage->getFileId(), actualName.c_str(), H5P_DEFAULT);
+
+                if (doesExist <= 0)
+                {
+                    _groupId = H5Gcreate (storage->getFileId(), actualName.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                }
+                else
+                {
+                    _groupId = H5Gopen2 (storage->getFileId(), actualName.c_str(), H5P_DEFAULT);
+                }
+            }
+            else
+            {
+                _groupId = H5Gopen2 (storage->getFileId(), "/", H5P_DEFAULT);
+            }
+        }
+
+        /** */
+        ~GroupHDF5()
+        {
+            /** We release the group handle. */
+            H5Gclose(_groupId);
+        }
+
+        /** */
+        void addProperty (const std::string& key, const std::string value)
+        {
+            hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+            hsize_t dims = 1;
+            hid_t space_id = H5Screate_simple (1, &dims, NULL);
+
+            /** We create the attribute. */
+            hid_t attrId = H5Acreate2 (_groupId, key.c_str(), datatype,  space_id, H5P_DEFAULT, H5P_DEFAULT);
+            if (attrId >= 0)
+            {
+                /** We write the data. */
+                const char* array[] = { value.c_str() };
+                H5Awrite (attrId, datatype, &array);
+
+                /** We close resources. */
+                H5Aclose (attrId);
+                H5Tclose (datatype);
+                H5Sclose (space_id);
+            }
+        }
+
+        /** */
+        std::string getProperty (const std::string& key)
+        {
+            std::string result;
+
+            /** We first check that the attribute exitst. */
+            if ( H5Aexists(_groupId, key.c_str()) > 0)
+            {
+                hid_t datatype = H5Tcopy (H5T_C_S1);  H5Tset_size (datatype, H5T_VARIABLE);
+
+                hid_t attrId = H5Aopen (_groupId, key.c_str(), H5P_DEFAULT);
+                if (attrId >= 0)
+                {
+                    herr_t status;
+                    hid_t space_id = H5Aget_space (attrId);
+
+                    hsize_t dims = 1;
+                    H5Sget_simple_extent_dims (space_id, &dims, NULL);
+                    char** rdata = (char **) MALLOC (dims * sizeof (char *));
+
+                    status = H5Aread (attrId, datatype, rdata);
+                    if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Aread), status %d key", status); }
+
+                    /** We set the result. */
+                    result.assign (rdata[0]);
+
+                    /** We release buffers. */
+                    status = H5Dvlen_reclaim (datatype, space_id, H5P_DEFAULT, rdata);
+                    if (status < 0)  { throw gatb::core::system::Exception ("HDF5 error (H5Dvlen_reclaim), status %d", status); }
+                    FREE (rdata);
+
+                    /** We close resources. */
+                    H5Aclose (attrId);
+                    H5Tclose (datatype);
+                    H5Sclose (space_id);
+                }
+            }
+
+            return result;
+        }
+        
+        void delProperty (const std::string& key)
+        {
+            H5Adelete(_groupId, key.c_str());
+        }
+
+        /** hack to set the attribute if it already exists: so i'm deleting and inserting again.
+         * I had cleaner code based on H5Aopen / H5Awrite but I didn't know if it was the cause of 
+         * a bug or not, so I opted for this failsafe solution */
+        void setProperty (const std::string& key, const std::string value)
+        {
+            if ( H5Aexists(_groupId, key.c_str()) > 0)
+            {
+                delProperty(key);
+            }
+            addProperty(key, value);
+        }
+
+    private:
+        hid_t _groupId;
+    };
+};
+
+/********************************************************************************/
+
+template<typename T1, typename T2=T1>
+struct HDF5Pair : std::pair<T1,T2>
+{
+    HDF5Pair ()  {}
+
+    HDF5Pair (const T1& a, const T2& b) : std::pair<T1,T2>(a,b) {}
+
+    static hid_t hdf5 (bool& isCompound)
+    {
+        hid_t result = H5Tcreate (H5T_COMPOUND, sizeof(HDF5Pair));
+        H5Tinsert (result, "first",   HOFFSET(HDF5Pair, first),  T1::hdf5(isCompound));
+        H5Tinsert (result, "second",  HOFFSET(HDF5Pair, second), T2::hdf5(isCompound));
+
+        isCompound = true;
+
+        return result;
+    }
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_HDF5_HPP_ */
diff --git a/gatb-core/src/gatb/tools/storage/impl/StorageTools.cpp b/gatb-core/src/gatb/tools/storage/impl/StorageTools.cpp
new file mode 100644
index 0000000..9cb9dc4
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/StorageTools.cpp
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/tools/storage/impl/StorageTools.hpp>
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/src/gatb/tools/storage/impl/StorageTools.hpp b/gatb-core/src/gatb/tools/storage/impl/StorageTools.hpp
new file mode 100644
index 0000000..460273c
--- /dev/null
+++ b/gatb-core/src/gatb/tools/storage/impl/StorageTools.hpp
@@ -0,0 +1,172 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+/** \file StorageTools.hpp
+ *  \date 01/03/2013
+ *  \author edrezen
+ *  \brief Collection interface
+ *
+ *  This file holds tools about the storage feature
+ */
+
+#ifndef _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_TOOLS_HPP_
+#define _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_TOOLS_HPP_
+
+/********************************************************************************/
+
+#include <gatb/tools/collections/api/Collection.hpp>
+#include <gatb/tools/math/NativeInt8.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+#include <gatb/tools/collections/impl/ContainerSet.hpp>
+
+
+/********************************************************************************/
+namespace gatb      {
+namespace core      {
+namespace tools     {
+namespace storage   {
+namespace impl      {
+/********************************************************************************/
+
+/** \brief  Helper class for the storage feature.
+ */
+class StorageTools
+{
+public:
+
+    /* why is there code in headers? because else we'd have to instantiate the template, see http://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructor */
+
+    /** Singleton method.
+     * \return the singleton.
+     */
+    static StorageTools& singleton() { static StorageTools instance; return instance; }
+
+    /** Save a Collection instance into a group
+     * \param[in] group : group where the collection has to be saved
+     * \param[in] name : name of the collection saved in the group
+     * \param[in] collection : Collection instance to be saved.
+     */
+    template<typename T>  void saveContainer (Group& group, const std::string& name, collections::Collection<T>* collection)
+    {
+        collections::Collection<T>* storageCollection = & group.getCollection<T> (name);
+
+        tools::dp::Iterator<T>* it = collection->iterator();   LOCAL(it);
+        for (it->first(); !it->isDone(); it->next())  {  storageCollection->insert (it->item());  }
+        storageCollection->flush ();
+    }
+
+    /** Load a Collection instance from a group
+     * \param[in] group : group where the collection has to be load
+     * \param[in] name : name of the collection the group
+     * \return a Collection instance, loaded from the group
+     */
+    template<typename T>  collections::Container<T>*  loadContainer (Group& group, const std::string& name)
+    {
+        collections::Collection<T>*  storageCollection = & group.getCollection<T> (name);
+        return new collections::impl::ContainerSet<T> (storageCollection->iterator());
+    }
+
+    /** Save a Bloom filter into a group
+     * \param[in] group : group where the IBloom instance has to be saved
+     * \param[in] name : name of the Bloom filter in the group
+     * \param[in] bloom : Bloom filter to be saved
+     * \param[in] kmerSize : kmer size (uggly but needed...)
+     */
+    template<typename T>  void saveBloom (Group& group, const std::string& name, collections::impl::IBloom<T>* bloom, size_t kmerSize)
+    {
+        collections::Collection<math::NativeInt8>* bloomCollection = & group.getCollection<math::NativeInt8> (name);
+
+        if (bloomMode == 0)
+        {
+            bloomCollection->insert ((math::NativeInt8*)bloom->getArray(), bloom->getSize());
+        }
+        else
+        {
+            // Now we declare an input stream on the collection
+            tools::storage::impl::Storage::ostream os (group, name);
+
+            // We write some information in this stream
+            os.write (reinterpret_cast<char const*>(bloom->getArray()), bloom->getSize()*sizeof(char));
+
+            // We have to flush the stream in order to be sure everything is ok
+            os.flush();
+        }
+
+        std::stringstream ss1;  ss1 <<  bloom->getBitSize();
+        std::stringstream ss2;  ss2 <<  bloom->getNbHash();
+        std::stringstream ss3;  ss3 <<  kmerSize;
+
+        bloomCollection->addProperty ("size",      ss1.str());
+        bloomCollection->addProperty ("nb_hash",   ss2.str());
+        bloomCollection->addProperty ("type",      bloom->getName());
+        bloomCollection->addProperty ("kmer_size", ss3.str());
+    }
+
+    /** Load a Bloom filter from a group
+     * \param[in] group : group where the Bloom filter is
+     * \param[in] name : name of the Bloom filter in the group
+     * \return the Bloom filter as an instance of IBloom
+     */
+    template<typename T>  collections::impl::IBloom<T>*  loadBloom (Group& group, const std::string& name)
+    {
+        /** We retrieve the raw data buffer for the Bloom filter. */
+        tools::collections::Collection<tools::math::NativeInt8>* bloomArray = & group.getCollection<tools::math::NativeInt8> (name);
+
+        /** We create the Bloom fiter. */
+        tools::collections::impl::IBloom<T>* bloom = tools::collections::impl::BloomFactory::singleton().createBloom<T> (
+            bloomArray->getProperty("type"),
+            bloomArray->getProperty("size"),
+            bloomArray->getProperty("nb_hash"),
+            bloomArray->getProperty("kmer_size")
+        );
+
+        if (bloomMode == 0)
+        {
+            /** We set the bloom with the provided array given as an iterable of NativeInt8 objects. */
+            bloomArray->getItems ((tools::math::NativeInt8*&)bloom->getArray());
+        }
+        else
+        {
+            tools::storage::impl::Storage::istream is (group, name);
+
+            // We read the data from the input stream
+            is.read (reinterpret_cast<char*>(bloom->getArray()), bloom->getSize()*sizeof(char));
+        }
+
+        /** We return the result. */
+        return bloom;
+    }
+
+private:
+
+    /** We keep the possibility to load/save Bloom filters in two different ways.
+     * The old one (with 'insert') has the drawback that the Bloom filter was read/written in
+     * one shot, which made big memory usage by HDF5 (one buffer for memory, one buffer for file).
+     * The new way uses io streams for HDF5 (splits the read/write operations in chunks), which
+     * may use less memory. */
+    static const int bloomMode = 1;  // 0: uses insert    1: uses Storage:[oi]stream
+};
+
+/********************************************************************************/
+} } } } } /* end of namespaces. */
+/********************************************************************************/
+
+#endif /* _GATB_CORE_TOOLS_STORAGE_IMPL_STORAGE_TOOLS_HPP_ */
diff --git a/gatb-core/test/CMakeLists.txt b/gatb-core/test/CMakeLists.txt
new file mode 100644
index 0000000..17ec23e
--- /dev/null
+++ b/gatb-core/test/CMakeLists.txt
@@ -0,0 +1,13 @@
+################################################################################
+message ("--  ---------- GATB TESTS ----------")
+################################################################################
+
+################################################################################
+#  UNIT TESTS GENERATION 
+################################################################################
+ADD_SUBDIRECTORY (unit)
+
+################################################################################
+#  BENCHMARK TESTS GENERATION 
+################################################################################
+ADD_SUBDIRECTORY (benchmark EXCLUDE_FROM_ALL)
diff --git a/gatb-core/test/benchmark/CMakeLists.txt b/gatb-core/test/benchmark/CMakeLists.txt
new file mode 100644
index 0000000..4ae6488
--- /dev/null
+++ b/gatb-core/test/benchmark/CMakeLists.txt
@@ -0,0 +1,15 @@
+################################################################################
+#  EXAMPLES 
+################################################################################
+
+include_directories (${gatb-core-includes})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # needed for bench_mphf
+
+
+list (APPEND PROGRAMS bench1 bench_bloom bench_mphf bench_minim bench_graph)
+
+FOREACH (program ${PROGRAMS})
+  add_executable(${program} ${program}.cpp)
+  target_link_libraries(${program} ${gatb-core-libraries})
+ENDFOREACH (program)
diff --git a/gatb-core/test/benchmark/bench1.cpp b/gatb-core/test/benchmark/bench1.cpp
new file mode 100644
index 0000000..7558f04
--- /dev/null
+++ b/gatb-core/test/benchmark/bench1.cpp
@@ -0,0 +1,363 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankBinary.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BankKmerIterator.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/tools/math/Integer.hpp>
+#include <iostream>
+#include <string.h>
+
+// We use the required packages
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc::impl;
+
+/********************************************************************************/
+
+struct Hash  {   kmer_type operator () (kmer_type& lkmer)
+{
+    kmer_type kmer_hash;
+
+    kmer_hash = lkmer ^ (lkmer >> 14);
+    kmer_hash = (~kmer_hash) + (kmer_hash << 18);
+    kmer_hash = kmer_hash ^ (kmer_hash >> 31);
+    kmer_hash = kmer_hash * 21;
+    kmer_hash = kmer_hash ^ (kmer_hash >> 11);
+    kmer_hash = kmer_hash + (kmer_hash << 6);
+    kmer_hash = kmer_hash ^ (kmer_hash >> 22);
+
+    return kmer_hash;
+}};
+
+Hash theHash;
+
+/********************************************************************************/
+
+struct FunctorIter1
+{
+    void operator() (Sequence& sequence)
+    {
+        nbSeq++;
+        dataSeq += sequence.getData().size();
+
+        model->build (sequence.getData(), kmers);
+
+        size_t size = kmers.size();
+
+        for (size_t i=0; i<size; i++)
+        {
+            kmer_type h = theHash(kmers[i]);
+
+            if ((h % nbPass) != pass)  { continue; }
+
+            nbKmers ++;
+            checksumKmers = checksumKmers + h;
+        }
+    }
+
+    FunctorIter1 () : nbSeq(0), dataSeq(0), nbKmers(0), checksumKmers(0), pass(0), nbPass(0), model(0) {}
+
+    vector<kmer_type> kmers;
+
+    u_int64_t nbSeq;
+    u_int64_t dataSeq;
+    u_int64_t nbKmers;
+    kmer_type checksumKmers;
+
+    size_t pass;
+    size_t nbPass;
+    KmerModel* model;
+};
+
+template <typename Functor> void iter1 (
+    IDispatcher& dispatcher,
+    IBank& bank,
+    KmerModel& model,
+    Functor& hash,
+    IteratorListener* progress=0
+)
+{
+    // We use the provided listener if any
+    LOCAL (progress);
+
+    // We need an iterator on the FASTA bank.
+    Iterator<Sequence>* itBank = bank.iterator();
+    LOCAL (itBank);
+
+    // We declare two kmer iterators for the two banks and a paired one that links them.
+    KmerModel::Iterator itKmer (model);
+
+    // We create an iterator over the paired iterator on sequences
+    SubjectIterator<Sequence> itSeq (itBank, 5*1000);
+
+    if (progress)  {  itSeq.addObserver (progress);  }
+
+    u_int64_t total_nbKmers       = 0;
+    kmer_type total_checksumKmers = 0;
+
+    size_t nbPasses = 10;
+
+    // We get some information about the kmers.
+    u_int64_t nbSeq[nbPasses];
+    u_int64_t dataSeq[nbPasses];
+    u_int64_t nbKmers[nbPasses];
+    kmer_type checksumKmers[nbPasses];
+
+    for (size_t p=0; p<nbPasses; p++)
+    {
+        // We get current time stamp
+        ITime::Value t0 = System::time().getTimeStamp();
+
+        vector<FunctorIter1> functors (dispatcher.getExecutionUnitsNumber());
+
+        for (size_t i=0; i<functors.size(); i++)
+        {
+            functors[i].pass   = p;
+            functors[i].nbPass = nbPasses;
+            functors[i].model  = &model;
+        }
+
+        nbSeq[p]         = 0;
+        dataSeq[p]       = 0;
+        nbKmers[p]       = 0;
+        checksumKmers[p] = 0;
+
+#if 0
+        dispatcher.iterate (itSeq, functors);
+#endif
+
+        for (size_t i=0; i<functors.size(); i++)
+        {
+            nbSeq[p]         += functors[i].nbSeq;
+            dataSeq[p]       += functors[i].dataSeq;
+            nbKmers[p]       += functors[i].nbKmers;
+            checksumKmers[p] = checksumKmers[p] + functors[i].checksumKmers;
+
+            total_nbKmers       += functors[i].nbKmers;
+            total_checksumKmers = total_checksumKmers + functors[i].checksumKmers;
+        }
+
+        // We get current time stamp
+        ITime::Value t1 = System::time().getTimeStamp();
+
+        // We dump some information about the iterated kmers;
+        cout << "FOUND " << nbKmers[p] << " kmers  for " << nbSeq[p] << " sequences  (" << dataSeq[p] << " bytes)  "
+            << "in " << (t1-t0) << " msec (rate " << (double)nbKmers[p] / (double) (t1>t0 ? t1-t0 : 1) << " kmers/msec),  "
+            << "checksum is " << checksumKmers[p]
+            << endl;
+    }
+    cout << endl;
+    cout << "TOTAL KMERS " << total_nbKmers << "  WITH CHECKSUM " << hex << total_checksumKmers << "  WITH " << Integer::getName()  <<  endl;
+
+    for (size_t p=0; p<nbPasses; p++)
+    {
+        cout << "   [" << p << "]  " << 100.0 * (double)nbKmers[p] / (double) total_nbKmers << endl;
+    }
+}
+
+/********************************************************************************/
+
+template <typename Functor> void iter2 (IBank& bank, KmerModel& model, Functor& hash, IteratorListener* progress=0)
+{
+#if 1
+    // We use the provided listener if any
+    LOCAL (progress);
+
+    BankKmerIterator itKmerBank (bank, model);
+
+    // We get some information about the kmers.
+    u_int64_t nbKmers       = 0;
+    kmer_type checksumKmers = 0;
+
+    // We get current time stamp
+    ITime::Value t0 = System::time().getTimeStamp();
+
+    if (progress)  {  itKmerBank.addObserver (progress);  }
+
+    for (itKmerBank.first(); !itKmerBank.isDone();  itKmerBank.next())
+    {
+        nbKmers      += 1;
+        checksumKmers = checksumKmers + hash (*itKmerBank);
+    }
+
+    // We get current time stamp
+    ITime::Value t1 = System::time().getTimeStamp();
+
+    // We dump some information about the iterated kmers;
+    cout << "FOUND " << nbKmers << " kmers "
+         << "in " << (t1-t0) << " msec (rate " << (double)nbKmers / (double) (t1-t0) << " kmers/msec),  "
+         << "checksum is " << checksumKmers
+         << endl;
+#endif
+}
+
+/********************************************************************************/
+
+struct FunctorIter3
+{
+    void operator() (std::vector<kmer_type>& kmers)
+    {
+        Hash hash;
+
+        size_t size = kmers.size();
+
+        for (size_t i=0; i<size; i++)
+        {
+            nbKmers ++;
+            checksumKmers = checksumKmers + hash (kmers[i]);
+        }
+    }
+
+    u_int64_t nbKmers;
+    kmer_type checksumKmers;
+};
+
+template <typename Functor> void iter3 (IBank& bank, KmerModel& model, Functor& hash, IteratorListener* progress=0)
+{
+    // We use the provided listener if any
+    LOCAL (progress);
+
+    BankVectorKmerIterator<kmer_type> itKmerBank (bank, model);
+
+    // We get some information about the kmers.
+    u_int64_t nbKmers       = 0;
+    kmer_type checksumKmers = 0;
+
+    // We get current time stamp
+    ITime::Value t0 = System::time().getTimeStamp();
+
+    if (progress)  {  itKmerBank.addObserver (progress);  }
+
+    ParallelCommandDispatcher dispatcher (8);
+
+    vector<FunctorIter3> functors (dispatcher.getExecutionUnitsNumber());
+
+#if 0
+    dispatcher.iterate (itKmerBank, functors, 1);
+#endif
+
+    for (size_t i=0; i<functors.size(); i++)
+    {
+        nbKmers       += functors[i].nbKmers;
+        checksumKmers = checksumKmers + functors[i].checksumKmers;
+    }
+
+    // We get current time stamp
+    ITime::Value t1 = System::time().getTimeStamp();
+
+    // We dump some information about the iterated kmers;
+    cout << "FOUND " << nbKmers << " kmers "
+         << "in " << (t1-t0) << " msec (rate " << (double)nbKmers / (double) (t1-t0) << " kmers/msec),  "
+         << "checksum is " << checksumKmers
+         << endl;
+}
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+    if (argc < 3)
+    {
+        cerr << "you must provide at least 2 arguments. Arguments are:" << endl;
+        cerr << "   1) kmer size"  << endl;
+        cerr << "   2) FASTA  bank" << endl;
+        cerr << "   3) binary bank" << endl;
+        return EXIT_FAILURE;
+    }
+
+    // We define the max size of a data line in the FASTA output file
+    size_t kmerSize = atoi(argv[1]);
+
+    // We get the URI of the FASTA bank
+    string filename (argv[2]);
+    string filenameBin = argc <=3 ? (filename + ".bin") : argv[3];
+
+#if 1
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+        ParallelCommandDispatcher dispatcher (8);
+
+        // We declare a kmer model with a given span size.
+        KmerModel model (kmerSize);
+
+        // We declare the FASTA bank
+        BankFasta bank (filename);
+
+        // We declare a binary bank
+        BankBinary bankBin (filenameBin);
+
+        if (System::file().doesExist(filenameBin) == false)
+        {
+            // We declare some job listener.
+            Progress progress (bank.estimateNbSequences(), "FASTA to binary conversion");
+
+            // We convert the FASTA bank in binary format
+            IProperties* props = BankHelper::singleton().convert (bank, bankBin, &progress);
+            LOCAL (props);
+        }
+
+        //HashNull hash;
+        Hash hash;
+
+        // TEST 1
+        iter1 (dispatcher, bankBin, model, hash, new Progress (bank.estimateNbSequences(), "Iterating 1"));
+
+        // TEST 2
+        //iter2 (bankBin, model, hash, new Progress (bank.estimateNbSequences(), "Iterating 2"));
+
+        // TEST 3
+        //iter3 (bankBin, model, hash, new Progress (bank.estimateNbSequences(), "Iterating 3"));
+
+        // We remove the binary bank
+        //System::file().remove (filename + ".bin");
+    }
+
+    catch (gatb::core::system::Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+#endif
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/test/benchmark/bench_bloom.cpp b/gatb-core/test/benchmark/bench_bloom.cpp
new file mode 100644
index 0000000..a087bc8
--- /dev/null
+++ b/gatb-core/test/benchmark/bench_bloom.cpp
@@ -0,0 +1,279 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+//
+//  bench_bloom.cpp
+//  gatb_xcode
+//
+//  Created by Guillaume Rizk on 20/06/13.
+//  Copyright (c) 2013 Guillaume Rizk. All rights reserved.
+//
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankBinary.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <iostream>
+#include <map>
+#include <math.h>
+#include <libgen.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gatb/tools/math/Integer.hpp>
+
+
+// We use the required packages
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc::impl;
+
+
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::math;
+
+#define MAX_RANDOM 2147483648
+#define srandomdev() srand((unsigned) time(NULL))
+
+uint64_t random64 ()
+{
+    uint64_t low, high,res;
+    low = random();
+    high = random();
+    
+    res = (high << 32) + low;
+    return res;
+}
+
+int main (int argc, char* argv[])
+{
+    if (argc < 4)
+    {
+        cerr << "you must provide at least 2 arguments. Arguments are:" << endl;
+        cerr << "   1) bloom size"  << endl;
+        cerr << "   2) nb elems inserted"  << endl;
+        cerr << "   3) nb hash funcs"  << endl;
+
+        return EXIT_FAILURE;
+    }
+    
+    TimeInfo            _timeInfo;
+
+    Properties res;
+    
+
+
+    
+    // We define the max size of a data line in the FASTA output file
+    uint64_t bloomsize = atoll(argv[1]);
+    uint64_t nelems = atoll(argv[2]);
+    uint64_t nhash = atoll(argv[3]);
+    uint64_t resu =0;
+    double  ratio  = bloomsize / (double) nelems ;
+    double  expected_FP  = pow(0.6185,ratio);
+    double  measured_FP  = 0;
+
+    
+    double  expected_F_k  =  pow (1.0 - exp(- (double )(nhash *nelems) / (double)bloomsize),nhash);
+
+    
+    int ideal_nb_hash =   (int)floorf (0.7*ratio);
+    
+     srandomdev(); 
+    
+
+    kmer_type start = random();
+    kmer_type kmer_random, kmer_current;
+    kmer_current = start;
+    // We define a try/catch block in case some method fails (bad filename for instance)
+    try
+    {
+
+        
+        //    8589934592   bits for 1GB   //1 = 780903144
+        /** We create a bloom with inserted solid kmers. */
+        kmer_type kmertemp;
+      //  Bloom<kmer_type>* bloom =  new Bloom<kmer_type> (bloomsize,nhash);
+        BloomCacheCoherent<kmer_type>* bloomcc =  new BloomCacheCoherent<kmer_type> (bloomsize,nhash,12);
+        Bloom<kmer_type>*    bloom_std =  new Bloom<kmer_type> (bloomsize,nhash);
+
+        //testing bloom cache coherent
+        _timeInfo.start ("Inserting N elements cache_coherent");
+
+        for(int ii =0; ii<nelems; ii++)
+        {
+            bloomcc->insert(kmer_current);
+            kmer_current = kmer_current +1;
+        }
+        _timeInfo.stop ("Inserting N elements cache_coherent");
+        
+
+        
+        
+        //we query the elements just inserted, ie only positive elements
+        _timeInfo.start ("Query N elements cache_coherent");
+        kmer_current = start ;
+        for(int ii =0; ii<nelems; ii++)
+        {
+            
+            resu+=bloomcc->contains(kmer_current);
+            kmer_current = kmer_current +1;
+
+        }
+        _timeInfo.stop ("Query N elements cache_coherent");
+        
+        
+        //testing bloom std
+        _timeInfo.start ("Inserting N elements std");
+        kmer_current = start;
+        for(int ii =0; ii<nelems; ii++)
+        {
+            bloom_std->insert(kmer_current);
+            kmer_current = kmer_current +1;
+        }
+        _timeInfo.stop ("Inserting N elements std");
+        
+        
+        
+        
+        //we query the elements just inserted, ie only positive elements
+        _timeInfo.start ("Query N elements std");
+        kmer_current = start;
+        for(int ii =0; ii<nelems; ii++)
+        {
+            
+            resu+=bloom_std->contains(kmer_current);
+            kmer_current = kmer_current +1;
+            
+        }
+        _timeInfo.stop ("Query N elements std");
+        
+        
+        
+        
+        uint64_t ntrue = 0;
+        uint64_t ntruecc = 0;
+        uint64_t ntested = 10000000;
+
+        //////////////////////// testing fp rate with random elements
+      
+        delete bloom_std;
+       bloom_std =  new Bloom<kmer_type> (bloomsize,nhash);
+
+        delete bloomcc;
+        bloomcc =  new BloomCacheCoherent<kmer_type> (bloomsize,nhash,12);
+
+        //insert n randoms
+        for(int ii = 0; ii<nelems; ii++)
+        {
+            kmer_random = random64();
+            bloom_std->insert(kmer_random);
+            bloomcc->insert(kmer_random);
+        }
+        
+
+
+
+        for(int ii = 0; ii<ntested; ii++)
+        {
+            kmer_random = random64(); // we expect it not be in the bloom
+            
+            if (bloom_std->contains(kmer_random)) // FP
+            {
+                ntrue++;
+            }
+            
+            if (bloomcc->contains(kmer_random)) 
+            {
+                ntruecc++;
+            }
+        }
+        
+        measured_FP =  ntrue / (double) ntested ;
+        
+        //printf("expected FP rate : %g \n",expected_FP);
+        //printf("measured FP rate : %g \n",measured_FP);
+        
+        char temp[250];
+        
+        res.add (0, "Bloom tested", "");
+        res.add (1, "Size T in bits ", "%lli",bloomsize);
+        res.add (1, "Size T in MB ", "%lli",bloomsize/8LL/1024LL/1024LL);
+
+        res.add (1, "N elems inserted  ", "%lli",nelems);
+        res.add (1, "nb  hash funcs", "%i",nhash);
+        res.add (1, "ratio bits/elem", "%g",bloomsize/(double) nelems);
+
+        
+        res.add (0, "Bloom perf", "");
+        res.add (1, _timeInfo.getProperties("time"));
+        
+        res.add (0, "False positive rate", "");
+        res.add (1, "ideal nb hash func would be ", "%i", ideal_nb_hash);
+        
+        sprintf(temp,"expected theoretical with %i hash",ideal_nb_hash);
+        res.add (1, temp, "%g", expected_FP);
+        
+        sprintf(temp,"expected theoretical with %lli hash",nhash);
+        res.add (1, temp, "%g", expected_F_k);
+
+        res.add (1, "measured FP, standard bloom", "%g", measured_FP);
+        res.add (1, "measured FP, bloomCacheCoherent", "%g",  ntruecc / (double) ntested);
+
+        
+        RawDumpPropertiesVisitor visit;
+        res.accept (&visit);
+    }
+    
+    catch (gatb::core::system::Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+    
+    return EXIT_SUCCESS;
+}
+
diff --git a/gatb-core/test/benchmark/bench_graph.cpp b/gatb-core/test/benchmark/bench_graph.cpp
new file mode 100644
index 0000000..f482b5f
--- /dev/null
+++ b/gatb-core/test/benchmark/bench_graph.cpp
@@ -0,0 +1,432 @@
+/* this is the most advanced benchmark i've coded (more recent than bench_mphf, and some benchmarks overlap) 
+ * */
+
+#include <chrono>
+#define get_wtime() chrono::system_clock::now()
+#define diff_wtime(x,y) chrono::duration_cast<chrono::nanoseconds>(y - x).count()
+
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/bank/api/IBank.hpp>
+
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+
+/* inspired by debruijn_test3 from unit tests*/
+
+// for some reason it didn't recall those definition (yet in Minia.cpp, it did)
+template <size_t span>
+using NodeFast = Node_t<typename gatb::core::kmer::impl::Kmer<span>::Type >;
+template <size_t span>
+using EdgeFast = Edge_t<NodeFast<span> >;
+template <size_t span>
+using GraphDataVariantFast = boost::variant<GraphData<span>>;
+
+struct Parameter
+{
+    Parameter (size_t k, string args, string seq="") : k(k), args(args), seq(seq){}
+    size_t k; 
+    string args;
+    string seq;
+};
+
+
+template<size_t span> struct debruijn_mphf_bench {  void operator ()  (Parameter params)
+{
+    typedef NodeFast<span> NodeFastT;
+    typedef GraphTemplate<NodeFastT,EdgeFast<span>,GraphDataVariantFast<span>> GraphFast;
+
+    size_t kmerSize = params.k;
+    
+    Graph graph; 
+    GraphFast graphFast;
+  
+    if (params.seq == "") 
+    {
+        graph = Graph::create (params.args.c_str());
+        graphFast = GraphFast::create (params.args.c_str());
+    }
+    else
+    {
+        graph = Graph::create (new BankStrings (params.seq.c_str(), 0), params.args.c_str());
+        graphFast = GraphFast::create (new BankStrings (params.seq.c_str(), 0), params.args.c_str());
+
+    }
+
+    cout << "graph built, benchmarking.." << endl;
+
+    
+    int miniSize = 8;
+    int NB_REPETITIONS = 2000000;
+
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(3);
+
+    Graph::Iterator<Node> nodes = graph.iterator();
+    typename GraphFast::template Iterator<NodeFastT> nodesFast = graphFast.iterator();
+    nodes.first ();
+
+    /** We get the first node. */
+    Node node = nodes.item();
+
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::ModelCanonical  ModelCanonical;
+    typedef typename Kmer<span>::ModelDirect     ModelDirect;
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   ModelMini;
+    typedef typename ModelMini::Kmer                        KmerType;
+
+    ModelMini  modelMini (kmerSize, miniSize);
+    ModelCanonical  modelCanonical (kmerSize);
+
+     // for some reason.. if *compiled*, this code confuses makes later MPHF queries 3x slower. really? yes. try to replace "if (confuse_mphf)" by "if (confuse_mphf && 0)" and re-run, you will see.
+    {
+        bool confuse_mphf = false;
+        if (confuse_mphf)
+        {
+            //Type b; b.setVal(0); 
+            //modelCanonical.emphf_hasher(modelCanonical.adaptor(b)); 
+            //typedef std::pair<u_int8_t const*, u_int8_t const*> byte_range_t;
+
+            //int c = 0; 
+            //byte_range_t brange( reinterpret_cast <u_int8_t const*> (&c), reinterpret_cast <u_int8_t const*> (&c) + 2 );
+            //byte_range_t brange( (u_int8_t const*) 1,(u_int8_t const*)33);
+            //auto hashes = modelCanonical.empfh_hasher(brange);
+        }
+
+
+        for (int i = 0; i < 0; i++)
+        {
+            auto start_tt=chrono::system_clock::now();
+            for (nodes.first(); !nodes.isDone(); nodes.next())
+                modelCanonical.EMPHFhash(nodes.item().kmer.get<Type>());
+            auto end_tt=chrono::system_clock::now();
+            cout << "time to do " << nodes.size() << " computing EMPHFhash of kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_tt, end_tt) / unit) << " seconds" << endl;
+        }
+        // it's slow. i don't understand why. see above for the "confuse mphf" part
+        //return; //FIXME
+    }
+
+
+    /** We get the value of the first node (just an example, it's not used later). */
+    Type kmer = node.kmer.get<Type>();
+    
+    auto start_t=chrono::system_clock::now();
+    auto end_t=chrono::system_clock::now();
+			
+   cout << "----\non all nodes of the graph\n-----\n";
+
+    /* disable node state (because we don't want to pay the price for overhea of checking whether a node is deleted or not in contain() */
+   std::cout<< "PAY ATTENTION: this neighbor() benchmark, in the Bloom flavor, is without performing a MPHF query for each found node" << std::endl; 
+
+   graph.disableNodeState(); 
+   graphFast.disableNodeState(); 
+
+   /* compute baseline times (= overheads we're not interested in) */
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+    {}
+    end_t=chrono::system_clock::now();
+    auto baseline_graph_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration (" << nodes.size() << " nodes) : " << baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+    {}
+    end_t=chrono::system_clock::now();
+    auto baseline_graphfast_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph NodeFast enumeration (" << nodes.size() << " nodes) : " << baseline_graphfast_time << " seconds" << endl;
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.getMinimizerValueDummy(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+    auto baseline_minim_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration and minimizer computation setup (" << nodes.size() << " nodes) : " << baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        nodes.item().getKmer<Type>();
+    end_t=chrono::system_clock::now();
+    auto baseline_hash_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration and hash computation setup (" << nodes.size() << " nodes) : " << baseline_hash_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+       nodesFast.item().kmer;
+    end_t=chrono::system_clock::now();
+    auto baseline_hashfast_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph NodeFast enumeration and hash computation setup (" << nodes.size() << " nodes) : " << baseline_hashfast_time << " seconds" << endl;
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.nodeMPHFIndexDummy(nodes.item());
+    end_t=chrono::system_clock::now();
+    auto baseline_mphf_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration and mphf query setup (" << nodes.size() << " nodes) : " << baseline_mphf_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.nodeMPHFIndexDummy(nodesFast.item());
+    end_t=chrono::system_clock::now();
+    auto baseline_mphffast_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph NodeFast enumeration and mphf query setup (" << nodes.size() << " nodes) : " << baseline_mphffast_time << " seconds" << endl;
+
+
+    /* do actual benchmark */
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), true);
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of minimizers (fast method) of length " << miniSize << " on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.nodeMPHFIndex(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of MPHF index on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_mphf_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.nodeMPHFIndex(nodesFast.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of MPHF index on all NodeFast (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_mphffast_time << " seconds" << endl;
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelCanonical.getHash(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computing hash1 of kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_hash_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelCanonical.getHash2(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computing hash2 of kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_hash_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        modelCanonical.getHash2(nodesFast.item().kmer);
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computing hash2 of kmers on all NodeFast (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_hashfast_time << " seconds" << endl;
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelCanonical.EMPHFhash(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computing EMPHFhash of kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_hash_time << " seconds" << endl;
+    // it's slow. i don't understand why. see above for the "confuse mphf" part
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.neighborsDummy(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " dummy neighbors() query on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.neighbors(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " neighbors() query on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.neighbors(nodesFast.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " neighbors() query on all NodeFast (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graphfast_time << " seconds" << endl;
+
+
+/* isBranching */
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.isBranching(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " isBranching() query on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.isBranching(nodesFast.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " isBranching() query on all NodeFast (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graphfast_time << " seconds" << endl;
+
+
+
+    
+    /* now, compute adjacency! */
+
+
+
+    graph.precomputeAdjacency();
+    graphFast.precomputeAdjacency();
+
+    cout << "adjacency precomputed" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.neighbors(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " neighbors() query on all nodes (" << kmerSize << "-mers) using adjacency : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.neighbors(nodesFast.item());
+    end_t=chrono::system_clock::now();
+    cout << "time to do " << nodes.size() << " fast neighbors() query on all NodeFast (" << kmerSize << "-mers) using adjacency : " << (diff_wtime(start_t, end_t) / unit) - baseline_graphfast_time << " seconds" << endl;
+    
+    /* isBranching */
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.isBranching(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " isBranching() query on all nodes (" << kmerSize << "-mers) using adjacency : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodesFast.first(); !nodesFast.isDone(); nodesFast.next())
+        graphFast.isBranching(nodesFast.item());
+    end_t=chrono::system_clock::now();
+    cout << "time to do " << nodes.size() << " fast isBranching() query on all NodeFast (" << kmerSize << "-mers) using adjacency : " << (diff_wtime(start_t, end_t) / unit) - baseline_graphfast_time << " seconds" << endl;
+    
+
+
+    /** We remove the graph. */
+    //graph.remove ();
+    //graphFast.remove (); // no actually, I want to keep the .h5 file
+
+
+}
+};
+
+void debruijn_mphf ()
+{
+    const char* sequences [] =
+    {
+//        "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+//        "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+        "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+    };
+
+    //        size_t kmerSizes[] = { 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
+    size_t kmerSizes[] = {31};
+
+    for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+    {
+        for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+        {
+            string args = "-kmer-size " + std::to_string(kmerSizes[j]) + "  -abundance-min 1  -verbose 0  -max-memory 500";
+
+            Integer::apply<debruijn_mphf_bench, Parameter> (kmerSizes[j], Parameter( kmerSizes[j], args, sequences[i]) );
+        }
+    }
+}
+
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // if no arg provided, just run the basic test on a single node
+        if (argc == 1)
+            debruijn_mphf();
+        else
+            // else, use a real file! 
+        {
+            cout << "building graph" << endl;
+            int k = 31;
+            if (argc > 2)
+                k = stoi(argv[2]);
+
+            string args = "-in " + string(argv[1]) + " -kmer-size " + std::to_string(k) + " -abundance-min 1  -verbose 0  -max-memory 500";
+            Integer::apply<debruijn_mphf_bench, Parameter> (k, Parameter( k, args) );
+        }
+
+
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+        return EXIT_FAILURE;
+    }
+
+
+
+}
diff --git a/gatb-core/test/benchmark/bench_minim.cpp b/gatb-core/test/benchmark/bench_minim.cpp
new file mode 100644
index 0000000..b3d7f6c
--- /dev/null
+++ b/gatb-core/test/benchmark/bench_minim.cpp
@@ -0,0 +1,239 @@
+/* apart from te agreement part, it's becoming less and less useful given bench_mphf */
+
+#include <chrono>
+#define get_wtime() chrono::system_clock::now()
+#define diff_wtime(x,y) chrono::duration_cast<chrono::nanoseconds>(y - x).count()
+
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+
+/* inspired by debruijn_test3 from unit tests*/
+
+struct Parameter
+{
+    Parameter (size_t k, const Graph& graph) : graph(graph), k(k) {}
+    const Graph& graph;
+    size_t k;    
+};
+
+
+template<size_t span> struct debruijn_minim_bench {  void operator ()  (Parameter params)
+{
+    size_t kmerSize = params.k;
+    const Graph& graph = params.graph;
+
+    int miniSize = 8;
+    int NB_REPETITIONS = 2000000;
+
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(3);
+
+    Graph::Iterator<Node> nodes = graph.iterator<Node> ();
+
+    cout << "graph has " << nodes.size() << " nodes" << endl;
+
+    if (nodes.size() == 0)
+        exit(1);
+
+    nodes.first ();
+
+    /** We get the first node. */
+    Node node = nodes.item();
+
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::ModelCanonical  ModelCanonical;
+    typedef typename Kmer<span>::ModelDirect     ModelDirect;
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   ModelMini;
+    typedef typename ModelMini::Kmer                        KmerType;
+
+    ModelMini  modelMini (kmerSize, miniSize);
+    
+    /** We get the value of the current minimizer. */
+    
+    Type kmer = node.kmer.get<Type>();
+    
+    auto start_t=chrono::system_clock::now();
+    for (unsigned int i = 0 ; i < NB_REPETITIONS ; i++)
+        modelMini.getMinimizerValue(kmer, false);
+    auto end_t=chrono::system_clock::now();
+			
+    cout << NB_REPETITIONS << " minimizers of length " << miniSize << " on a " << kmerSize << "-mer : " << diff_wtime(start_t, end_t) / unit << " seconds" << endl;
+	
+    cout << "---- now on all nodes of the graph -----\n";
+    int times = max((int)(NB_REPETITIONS / nodes.size()), 1);
+
+
+    /* compute a baseline */
+
+    start_t=chrono::system_clock::now();
+     for (int i=0; i < times; i++)
+        for (nodes.first(); !nodes.isDone(); nodes.next())
+            modelMini.getMinimizerValueDummy(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+    auto baseline_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead (" << nodes.size() << " nodes, " << times << " times) : " << baseline_time << " seconds" << endl;
+
+    /* existing code */
+
+    start_t=chrono::system_clock::now();
+    for (int i=0; i < times; i++)
+        for (nodes.first(); !nodes.isDone(); nodes.next())
+            modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), false);
+    end_t=chrono::system_clock::now();
+    cout << nodes.size() << " minimizers of length " << miniSize << " on all nodes (" << kmerSize << "-mers), " << to_string(times) << " times, with existing code : " << (diff_wtime(start_t, end_t) / unit) - baseline_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (int i=0; i < times; i++)
+        for (nodes.first(); !nodes.isDone(); nodes.next())
+            modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), true);
+    end_t=chrono::system_clock::now();
+    cout << nodes.size() << " minimizers of length " << miniSize << " on all nodes (" << kmerSize << "-mers), " << to_string(times) << " times, with new method    : " << (diff_wtime(start_t, end_t) / unit) - baseline_time << " seconds" << endl;
+    //cout << modelMini._invalidMinimizersCounter << "/" << modelMini._minimizersCounter << " normal/fast minimizer computations" << endl,
+
+   /* checking agreement between old and new method*/
+    
+    cout << "checking agreement... ";
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+    {
+        if (modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), false) != modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), true))
+        {
+            cout << "FAIL! problem with kmer " << graph.toString(nodes.item()) << " : (old) " << modelMini.getMinimizerString(nodes.item().kmer.get<Type>(), false) << " vs (new) " << modelMini.getMinimizerString(nodes.item().kmer.get<Type>(), true) << endl;
+            cout << "debug: integer representation of new minimizer: " << modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), true) << endl;
+
+            exit(1);
+        }
+
+        if (modelMini.getMinimizerPosition(nodes.item().kmer.get<Type>(), false) != modelMini.getMinimizerPosition(nodes.item().kmer.get<Type>(), true))
+        {
+            cout << "FAIL! problem with minimizer positions of kmer " << graph.toString(nodes.item()) << " : (old position) " << modelMini.getMinimizerPosition(nodes.item().kmer.get<Type>(), false) << " vs (new position) " << modelMini.getMinimizerPosition(nodes.item().kmer.get<Type>(), true) << endl;
+            cout << " minimizer: " << modelMini.getMinimizerString(nodes.item().kmer.get<Type>()) << endl;
+
+            exit(1);
+        }
+
+    }
+    cout << "all good." << endl;
+}
+}; // end functor debruijn_minim_bench
+
+void debruijn_minim ()
+{
+    const char* sequences [] =
+    {
+//        "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+//        "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+        "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+    };
+
+    //        size_t kmerSizes[] = { 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
+    size_t kmerSizes[] = {21, 31};
+
+
+    for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+    {
+        for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+        {
+            /** We create the graph. */
+            Graph graph = Graph::create (
+                    new BankStrings (sequences[i], 0),
+                    "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d -mphf emphf", kmerSizes[j], 500 
+                    );
+
+            Integer::apply<debruijn_minim_bench, Parameter> (kmerSizes[j], Parameter( kmerSizes[j], graph) );
+
+            /** We remove the graph. */
+            graph.remove ();
+        }
+    }
+}
+
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // if no arg provided, just run the basic test on a single node
+        if (argc == 1)
+            debruijn_minim();
+        else
+            // else, use a real file! 
+        {
+            int k = 31; 
+            if (argc > 2)
+                k = stoi(argv[2]);
+            cout << "building graph with k=" + to_string(k) + " for " + string(argv[1]) << endl;
+            string args = "-in " + string(argv[1]) + " -kmer-size " + to_string(k) + " -abundance-min 1  -verbose 0  -max-memory 500 -mphf emphf";
+            Graph graph = Graph::create (args.c_str());
+            cout << "graph built, benchmarking.." << endl;
+            Integer::apply<debruijn_minim_bench,Parameter> (k, Parameter(k, graph));
+        }
+
+
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+        return EXIT_FAILURE;
+    }
+
+
+
+}
diff --git a/gatb-core/test/benchmark/bench_mphf.cpp b/gatb-core/test/benchmark/bench_mphf.cpp
new file mode 100644
index 0000000..b2ec627
--- /dev/null
+++ b/gatb-core/test/benchmark/bench_mphf.cpp
@@ -0,0 +1,258 @@
+
+#include <chrono>
+#define get_wtime() chrono::system_clock::now()
+#define diff_wtime(x,y) chrono::duration_cast<chrono::nanoseconds>(y - x).count()
+
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/kmer/impl/Model.hpp>
+
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+
+/* inspired by debruijn_test3 from unit tests*/
+
+struct Parameter
+{
+    Parameter (size_t k, const Graph& graph) : graph(graph), k(k) {}
+    const Graph& graph;
+    size_t k;    
+};
+
+
+template<size_t span> struct debruijn_mphf_bench {  void operator ()  (Parameter params)
+{
+    size_t kmerSize = params.k;
+    const Graph& graph = params.graph;
+    
+    int miniSize = 8;
+    int NB_REPETITIONS = 2000000;
+
+    double unit = 1000000000;
+    cout.setf(ios_base::fixed);
+    cout.precision(3);
+
+    Graph::Iterator<Node> nodes = graph.iterator<Node> ();
+    nodes.first ();
+
+    /** We get the first node. */
+    Node node = nodes.item();
+
+    typedef typename Kmer<span>::Type  Type;
+    typedef typename Kmer<span>::ModelCanonical  ModelCanonical;
+    typedef typename Kmer<span>::ModelDirect     ModelDirect;
+    typedef typename Kmer<span>::template ModelMinimizer <ModelCanonical>   ModelMini;
+    typedef typename ModelMini::Kmer                        KmerType;
+
+    ModelMini  modelMini (kmerSize, miniSize);
+    ModelCanonical  modelCanonical (kmerSize);
+
+    /** We get the value of the current minimizer. */
+    Type kmer = node.kmer.get<Type>();
+    
+    auto start_t=chrono::system_clock::now();
+    for (unsigned int i = 0 ; i < NB_REPETITIONS ; i++)
+        modelMini.getMinimizerValue(kmer);
+    auto end_t=chrono::system_clock::now();
+			
+    cout << "time to do " << NB_REPETITIONS << " computations of minimizers of length " << miniSize << " on a " << kmerSize << "-mer : " << diff_wtime(start_t, end_t) / unit << " seconds" << endl;
+	
+    start_t=chrono::system_clock::now();
+    for (unsigned int i = 0 ; i < NB_REPETITIONS ; i++)
+         graph.nodeMPHFIndex(node);
+    end_t=chrono::system_clock::now();
+    //cout << "mphf index of node " << graph.toString(node) << " is " << graph.nodeMPHFIndex(node) << endl;
+
+    cout << "time to do " << NB_REPETITIONS << " computations of MPHF index on a " << kmerSize << "-mer : " << diff_wtime(start_t, end_t) / unit << " seconds" << endl;
+		
+    cout << "----\nnow on all nodes of the graph\n-----\n";
+
+    /* compute baseline times (= overheads we're not interested in) */
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+    {}
+    end_t=chrono::system_clock::now();
+    auto baseline_graph_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration (" << nodes.size() << " nodes) : " << baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.getMinimizerValueDummy(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+    auto baseline_minim_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration and minimizer computation setup (" << nodes.size() << " nodes) : " << baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.nodeMPHFIndexDummy(nodes.item());
+    end_t=chrono::system_clock::now();
+    auto baseline_mphf_time = diff_wtime(start_t, end_t) / unit;
+    cout << "baseline overhead for graph nodes enumeration and mphf query setup (" << nodes.size() << " nodes) : " << baseline_mphf_time << " seconds" << endl;
+
+    /* do actual benchmark */
+
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), false);
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of minimizers of length " << miniSize << " on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.getMinimizerValue(nodes.item().kmer.get<Type>(), true);
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of minimizers (fast method) of length " << miniSize << " on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        graph.nodeMPHFIndex(nodes.item());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computations of MPHF index on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_mphf_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelCanonical.reverse(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " revcomps of all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_graph_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelMini.sweepForAA(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " just sweepings for AA's across kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_minim_time << " seconds" << endl;
+
+    start_t=chrono::system_clock::now();
+    for (nodes.first(); !nodes.isDone(); nodes.next())
+        modelCanonical.getHash(nodes.item().kmer.get<Type>());
+    end_t=chrono::system_clock::now();
+
+    cout << "time to do " << nodes.size() << " computing hash1 of kmers on all nodes (" << kmerSize << "-mers) : " << (diff_wtime(start_t, end_t) / unit) - baseline_minim_time << " seconds" << endl;
+
+
+
+}
+};
+
+void debruijn_mphf ()
+{
+    const char* sequences [] =
+    {
+//        "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+//        "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+        "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+    };
+
+    //        size_t kmerSizes[] = { 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
+    size_t kmerSizes[] = {81};
+
+    for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+    {
+        for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+        {
+            /** We create the graph. */
+            Graph graph = Graph::create (
+                    new BankStrings (sequences[i], 0),
+                    "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSizes[j], 500 
+                    );
+
+            Integer::apply<debruijn_mphf_bench, Parameter> (kmerSizes[j], Parameter( kmerSizes[j], graph) );
+
+            /** We remove the graph. */
+            graph.remove ();
+        }
+    }
+}
+
+int main (int argc, char* argv[])
+{
+    try
+    {
+        // if no arg provided, just run the basic test on a single node
+        if (argc == 1)
+            debruijn_mphf();
+        else
+            // else, use a real file! 
+        {
+            cout << "building graph" << endl;
+            int k = 31;
+            if (argc > 2)
+                k = stoi(argv[2]);
+
+            string args = "-in " + string(argv[1]) + " -kmer-size " + std::to_string(k) + " -abundance-min 1  -verbose 0  -max-memory 500";
+            Graph graph = Graph::create (args.c_str());
+            cout << "graph built, benchmarking.." << endl;
+            Integer::apply<debruijn_mphf_bench, Parameter> (k, Parameter( k, graph) );
+        }
+
+
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+
+    catch (Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+        return EXIT_FAILURE;
+    }
+
+
+
+}
diff --git a/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.gz b/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.gz
new file mode 100644
index 0000000..34dc1b7
Binary files /dev/null and b/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.gz differ
diff --git a/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.leon-ref b/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.leon-ref
new file mode 100644
index 0000000..04232d4
Binary files /dev/null and b/gatb-core/test/db/NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.leon-ref differ
diff --git a/gatb-core/test/db/README.md b/gatb-core/test/db/README.md
new file mode 100644
index 0000000..9b380f0
--- /dev/null
+++ b/gatb-core/test/db/README.md
@@ -0,0 +1,22 @@
+This folder contains data set used by GATB-Core CPPUnit test codes.
+
+## Leon files
+
+* Leon*.fastq: DO NOT modify
+
+* leon1.fastq.leon-ref
+  and leon2.fastq.leon-ref created as follows
+
+    leon -c -file ./gatb-core/gatb-core/test/db/leon1.fastq -lossless -verbose 0 -kmer-size 31 -abundance 1
+
+* NIST7035* files from: 
+
+    ftp://ftp-trace.ncbi.nih.gov/giab/ftp/data/NA12878/Garvan_NA12878_HG001_HiSeq_Exome/NIST7035_TAAGGCGA_L001_R1_001.fastq.gz 
+
+* giab.hg002* files from:
+
+    ftp://ftp-trace.ncbi.nih.gov/giab/ftp/data/AshkenazimTrio/HG002_NA24385_son/CORNELL_Oxford_Nanopore/giab.hg002.2D.fastq
+
+* Note: loading files from ftp server can be none as follows:
+
+    curl --user anonymous:YOUR-EMAIL ftp://ftp-trace.../.../NIST7035.fastq.gz -o NIST7035.fastq.gz
diff --git a/gatb-core/test/db/album.txt b/gatb-core/test/db/album.txt
new file mode 100644
index 0000000..a813faf
--- /dev/null
+++ b/gatb-core/test/db/album.txt
@@ -0,0 +1,2 @@
+reads1.fa
+reads2.fa
\ No newline at end of file
diff --git a/gatb-core/test/db/celegans_reads.h5 b/gatb-core/test/db/celegans_reads.h5
new file mode 100644
index 0000000..99f765a
Binary files /dev/null and b/gatb-core/test/db/celegans_reads.h5 differ
diff --git a/gatb-core/test/db/giab.hg002.2D_6K.fastq.gz b/gatb-core/test/db/giab.hg002.2D_6K.fastq.gz
new file mode 100644
index 0000000..2f5f5ff
Binary files /dev/null and b/gatb-core/test/db/giab.hg002.2D_6K.fastq.gz differ
diff --git a/gatb-core/test/db/leon1.fastq b/gatb-core/test/db/leon1.fastq
new file mode 100644
index 0000000..9aaf53b
--- /dev/null
+++ b/gatb-core/test/db/leon1.fastq
@@ -0,0 +1,28 @@
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+TGAANACCTCGAAACTTTTTCAGCGGNNTCNTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+0000!<:<;:@AAA=@:@@@A at AA@#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+NNNNNNNNNNNNTGAATAAATACTTTTTGCAGATGCTAAAACAATTTCCAAGTAAAAAAATTATNNNNNNNNTNGGCNAGCAGNNGTGAANNNGGNNNAT
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#####!!#####!!!##!!!##
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+CAGTNAATTTTCGTCGATTTTTCCAANNTTNCGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+0000!8;9;;BBBB@<95?;BABAA#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+NNNNNNNNNNNNAATGAGCTGAAAAATGTCAAAATTTCGAAAAATTGGCCGGAAAATGACCGAANNNNNNNNNNNNTNGNCGANNATTGANNNNGNNNGN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!!!!!#!#!###!!#####!!!!#!!!#!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+ATATNATATCTATTAAACGTCTAGCTNNACNAANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+00//!;9<<:CCCCCCCCCCCCCBC#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+NNNNNNNNNNNNTTTTATTACTGTAGAAAATTATCTCGTTTTTTCTTTAGTTCAAACAATTTATNNNNNNNNANAATNANGAGNNACATGNNNNANNNTA
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#!###!!#####!!!!#!!!##
+ at SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+TTTGNCAATCGACTTTAGTGTTAACCGNATNTTTCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+00//!00000BAB<AB>BBABAB<B##!##!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/gatb-core/test/db/leon1.fastq.leon-ref b/gatb-core/test/db/leon1.fastq.leon-ref
new file mode 100644
index 0000000..742c7b0
Binary files /dev/null and b/gatb-core/test/db/leon1.fastq.leon-ref differ
diff --git a/gatb-core/test/db/leon2.fastq b/gatb-core/test/db/leon2.fastq
new file mode 100644
index 0000000..9aaf53b
--- /dev/null
+++ b/gatb-core/test/db/leon2.fastq
@@ -0,0 +1,28 @@
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+TGAANACCTCGAAACTTTTTCAGCGGNNTCNTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+0000!<:<;:@AAA=@:@@@A at AA@#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+NNNNNNNNNNNNTGAATAAATACTTTTTGCAGATGCTAAAACAATTTCCAAGTAAAAAAATTATNNNNNNNNTNGGCNAGCAGNNGTGAANNNGGNNNAT
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#####!!#####!!!##!!!##
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+CAGTNAATTTTCGTCGATTTTTCCAANNTTNCGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+0000!8;9;;BBBB@<95?;BABAA#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+NNNNNNNNNNNNAATGAGCTGAAAAATGTCAAAATTTCGAAAAATTGGCCGGAAAATGACCGAANNNNNNNNNNNNTNGNCGANNATTGANNNNGNNNGN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!!!!!#!#!###!!#####!!!!#!!!#!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+ATATNATATCTATTAAACGTCTAGCTNNACNAANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+00//!;9<<:CCCCCCCCCCCCCBC#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+NNNNNNNNNNNNTTTTATTACTGTAGAAAATTATCTCGTTTTTTCTTTAGTTCAAACAATTTATNNNNNNNNANAATNANGAGNNACATGNNNNANNNTA
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#!###!!#####!!!!#!!!##
+ at SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+TTTGNCAATCGACTTTAGTGTTAACCGNATNTTTCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+00//!00000BAB<AB>BBABAB<B##!##!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/gatb-core/test/db/leon2.fastq.leon-ref b/gatb-core/test/db/leon2.fastq.leon-ref
new file mode 100644
index 0000000..ccd3d02
Binary files /dev/null and b/gatb-core/test/db/leon2.fastq.leon-ref differ
diff --git a/gatb-core/test/db/microsnp.fa b/gatb-core/test/db/microsnp.fa
new file mode 100644
index 0000000..b923792
--- /dev/null
+++ b/gatb-core/test/db/microsnp.fa
@@ -0,0 +1,4 @@
+>read_1
+TACACGTCGGCACATCG
+>read_2
+TACACGTCTGCACATCG
diff --git a/gatb-core/test/db/query.fa b/gatb-core/test/db/query.fa
new file mode 100644
index 0000000..4741ee0
--- /dev/null
+++ b/gatb-core/test/db/query.fa
@@ -0,0 +1,766 @@
+>ENSTTRP00000007202 pep:novel scaffold:turTru1:scaffold_113855:32105:37173:1 gene:ENSTTRG00000007615 transcript:ENSTTRT00000007614
+MTMDKSELVQKAKLAEQAERYDDMAAAMKAVTEQGHELSNEERNLLSVAYKNVVGARRSS
+WRVISSIEQKTERNEKKQQMGKEYREKIEAELQDICNDVLELLDKYLIPNATQPESKVFY
+LKMKGDYFRYLSEVASGDNKQTTVSNSQQAYQEAFEISKKEMQPTHPIRLGLALNFSVFY
+YEILNSPEKACSLAKTAFDEAIAELDTLNEESYKDSTLIMQLLRDNLTLWTSENQGDEGD
+AGEGEN
+>ENSTTRP00000007204 pep:novel scaffold:turTru1:scaffold_113855:40787:62938:1 gene:ENSTTRG00000007618 transcript:ENSTTRT00000007616
+MNSSGPGYPLASLYAGDLHPDVTEAMLYEKFSPAGPILSIRVCRDVATRRSLGYAYINFQ
+QPADAERALDTMNFEVIKGQPIRIMWSQRDPGLRKSGVGNIFIKNLEDSIDNKALYDTFS
+TFGNILSCKVVCDDHGSRGFGFVHFETHEAAQNAISTMNGMLLNDRKVFVGHFKPRRERD
+AELGARAMEFTNIYVKNLHVDVDEQCLQDLFSQFGKILSVKVMDDSHPRFGFVNFETHEA
+QAVTDMNGREVSGRLLYVGRAQKRVERQNELKRRFEQMKQDRLTRYQGVNLYVKNLDDSI
+DDEKLRKEFSPYGVITSAKVMTEGGHSKGFGFVCFSSPEEATKAVTEMNGRIVGTKPLYV
+ALAQRKEERKAILTNQYMQRLSTMRALGSPLLGSFQQPASYFLPATPQPPAQAPYYGSGP
+PVQPASRWTAQLPRPSSASVVQPAAVSRRPSFPIGSARQISTHVPRLVPHAQGVANIGTQ
+TTGPGMAGCSSPRGPLLTHRCSLATHNTHRVQEPAVRVPGQEPLTASMLAAAPLHEQKQM
+IGERLYPLIYNVHTQLAGKITGMLLEIDNSELLLLLESPESLSAK
+>ENSTTRP00000007206 pep:novel scaffold:turTru1:scaffold_113855:72268:86716:-1 gene:ENSTTRG00000007619 transcript:ENSTTRT00000007618
+MAPKLPDSVEELRAAGNLSFRNGQFAEAATLYSRALRMLQAQGSSDPEKESVLYSNRAAC
+HLKDGNCIDCIKDCTSALALVPFGMKPLLRRASAYEALEKYTLAYMDYLTVLQIDDRVTS
+ALEGSSRMTRALMDSFGPEWRQKLPSIPLVPVSAQKRWECLPSGDCKETAKSKSKETTAT
+KSRVPSAGDVERARVLKEEGNELVKKGNHKQAIEKYNESLWFSNLESATYSN
+>ENSTTRP00000007207 pep:novel scaffold:turTru1:scaffold_113855:91611:143259:1 gene:ENSTTRG00000007620 transcript:ENSTTRT00000007619
+METVQLRNPPRRQLKKLDEDSLTKQPEEVFDVLEKLGEGSYGSVYKAIHKETGQIVAIKQ
+VPVESDLQEIIKEISIMQQCDSPHVVKYYGSYFKNTDLWIVMEYCGAGSVSDIIRLRNKT
+LTEDEIATILQSTLKGLEYLHFMRKIHRDIKAGNILLNTEGHAKLADFGVAGQLTDTMAK
+RNTVIGTPFWMAPEVIQEIGYNCVADIWSLGITAIEMAEGKPPYADIHPMRAIFMIPTNP
+PPTFRKPELWSDSFMDFVKQCLIKSPEQRATATQLLQHPFVKSAKGVSILRDLINEAMDV
+KLKRQEAQQREVDQDDEENSEEDEMDSGTMVRAAGDEMGTVRVASTMSDGANTMIEHDDT
+LPSQLGTMVINSEEEEEEGTMKRRDETMQPARPSFLEYFEQKEKENQINSFGKSVPGPLK
+NSSDWKVPQDGDYEF
+>ENSTTRP00000007208 pep:novel scaffold:turTru1:scaffold_113855:187589:191897:-1 gene:ENSTTRG00000007621 transcript:ENSTTRT00000007620
+TVKLLIQGTHLKNFWSRRILSTTLDSQRAAAMVSECPGPGARVPWRRSDEALRVNVGGVR
+RRLSARALARFPGTRLGRLQAAASEEQARRLCDDYDAAAREFYFDRHPGFFLSLLHFYRT
+GRLHVLDEQCVFAFGQEADYWGLGESALATCCRARYLERRVARPRVWDEDSDTLSSVGPC
+PEEISDVQRELAHYRAVRCGRLRRRLWLTMENPGYSLPSKLFSCVSIGVVLASIAAMCIH
+SLPEYQAREAAAAVAAVAAGRRAEGLRDDPVLRHLEYFCIAWFSFEVSSRLLLAPSTRNF
+FCHPLNLIDIVSVLPFYLTLLAGVALQDRGGAGGEELGDLGKVVQVFRLMRIFRVLKLAR
+HSTGLRSLGATLKHSYREVGILLLYLAVGVSVFSCVAYTAEKEEDVGFDTIPACWWWGTV
+SMTTVGYGDVVPVTVAGKLAASGCILGGILVVALPITIIFNKFSHFYRRQKALEAAVRNS
+DHWEFEDLLSSVDGVSEASLETSRETSQEGRSEDLEAQATSGPPNSQVY
+>ENSTTRP00000000008 pep:novel genescaffold:turTru1:GeneScaffold_102:21248:103915:-1 gene:ENSTTRG00000000009 transcript:ENSTTRT00000000009
+MEHRIVGPGPYRATRLWNETVELFRTKMPLRKHRCRFKSYERCFTAAEAVDWLHELLRRS
+QNFGPEVTRKQTVQLLKKFLKNHVIEDIKGKWGQEDFEDNRHLYRFPPSSPLRPYPKRPP
+YQKDVIKFPEWDDPLPGTSQENIPVRPVVMNSEMWYKRHSIAIGEVPACRLVHRRQLTEA
+NVEELWKTMTLSYLQKILGLDSLEEVLDVNLVNSKFIIHNVYSVSNQGVVILDDKSKELP
+HWVLSAMKCLANWPNCSDLKQPMYLGFEKDVFKTIADYYGHLKEPLLTFHLFDAFVSVLG
+LLQKEKMAIEAFQVCCLLLPPENRRKLQLLMRMMARICLNKEMPPLCDGFGTRTLMVQTF
+SHCILCSKDEVDLDDLLAARLVTFLMDNYQEILKVPLALQTSIEERVAHLRRVQIKYPGA
+DMDITLSAPSFCRQISPEEFEYQRVYGSQEPLAALLEEVITDAKLSSKEKKKKLKQFQKS
+YPEVYQERFPTPESEALLFPEKPKAKPQLLMWTLKNPFQPFQRTRSFRM
+>ENSTTRP00000000009 pep:novel genescaffold:turTru1:GeneScaffold_102:137736:159361:-1 gene:ENSTTRG00000000010 transcript:ENSTTRT00000000010
+MAFSDLTSRTVRLYGNWIKDADPRVEDWLLMSSPLPQTVILGLYVYFVTSLGPKLMENRK
+PFELKKAMITYNFFIVLFSVYMCYEFVMSGWGTGYSFRCEIVDYSRSPTALRMARTCWLY
+YFSKFIELLDTIFFVLRKKNSQVTFLHVFHHTIMPWTWWFGVKFAAGGLGTFHAFLNTAV
+HVVMYSYYGLCALGPAYQKYLWWKKYLTSLQLVQFVIVTIHIGQFFFMEDCKYQFPVFLY
+IIMSYGCIFLLLFLHFWYRAYTKGQRLPKTVKNGICKNKDHNS
+>ENSTTRP00000001033 pep:novel genescaffold:turTru1:GeneScaffold_2278:60769:65122:-1 gene:ENSTTRG00000001100 transcript:ENSTTRT00000001100
+MEEQQPEPKSQRDSGLGAAAAVAAAAAPGSLSLSLSPGASGSSGSDGDSVPVSPQPAPPS
+PPAAPCLPPLAHHPHLPPHPPPPPPQHLAAPAHQPQPAAQLHRTTNFFIDNILRPDFGCK
+KEQPPPQLLVAAAAAAGGGAGGGRVERDRGQTGAGRDPVHPLGTRAPGAASLLCAPDANC
+GPPDGSPPATAGGAGASKAGNPAAAAAAAAAAAAAAVAAAAAAAAAAKPSDSGGGSGGGV
+GSPGAQGAKYPEHSNPAILLMGSANGGPVVKTDSQQPLVWPAWVYCTRYSDRPSSGPRTR
+KLKKKKNEKEDKRPRTAFTAEQLQRLKAEFQANRYITEQRRQTLAQELSLNESQIKIWFQ
+NKRAKIKKATGIKNGLALHLMAQGLYNHSTTTVQDKDESE
+>ENSTTRP00000001034 pep:novel genescaffold:turTru1:GeneScaffold_2278:165049:198106:1 gene:ENSTTRG00000001101 transcript:ENSTTRT00000001101
+MENEEILKEKELSASARERTTLDQTMLSTMETFELNDPKPKKRNGINCFTVLLFIYLILL
+TAGAGLLVVQVLNLQKRLQALETPYNNQTLVPALQAQLIRVRTRQEHLLRLVDNFTRIPX
+XXXXXXXXXXXXLGKGTRLPRLPGPPAETGTGRDGAAGPPGPQGPPGIKGEAGRKGDIGM
+KGDMGVMGPPGARGQKGDSGMPGSPGVAGIPGLKGDQGQPGAKGLPGFPGAAGSPGAKGE
+PGSAGPTGPIGPSGRPGSPGAEGVKGSKGDTGLQGQKGTKGESGVPGPAGMKGEMGSPGL
+VGLKGAPGPDGRKGEPGAKGSSGTKGAKGEKGQKGESMVSVRIAGSRNRGRAEIYYNGAW
+GTICDDDWDNSDATVFCRMLGFSSGTAVFNVEAGTGTIWLDNVACQGSESSLWSCSKNSW
+GSHNCNHSEDAGVDCR
+>ENSTTRP00000001035 pep:novel genescaffold:turTru1:GeneScaffold_2278:334924:336201:-1 gene:ENSTTRG00000001102 transcript:ENSTTRT00000001102
+IQGTTRDHGRPWQAGPPRIPEEKQQSPGRSKPRGKKGDSRPTRSHGLQMTAGAADGVGGG
+EGGTGGGGDSEGEVTGALNAAFSGPKISFYVGVKSPYEGYEEIRLAEVVTNLDNHYDPHT
+GKISCQVRGIYFFTYHILMRGGDGTSMWADLCKNGQVRASAIAQDADQNYDYASNSVVLH
+LDSGDEVYVKLDGGKAHGGNNNKYSTFSGFLLYPD
+>ENSTTRP00000000046 pep:novel genescaffold:turTru1:GeneScaffold_1119:67956:108970:1 gene:ENSTTRG00000000051 transcript:ENSTTRT00000000051
+DSSGFIFDLQSNTVLAQGGVFENMKEKINAVRAIVPNKSNNEIILVLQHFDNCVDKTVQA
+FMEGSASEVLKEWTVTGKKKNKKKKSKPKPAAEPSNSIPDSNKLVSIQEEQSAPSSEKGG
+INGYHVNGAINDTESVDSLSEGMEALSIDARELEDPESATQDMLDRTGSMLENGVSDFES
+RPLTVHSAQNSQQNRNAAKSLSRPAIGPQLSNLGMEGVPLSSTNKKLGSNIEKSVKDLQR
+CTVSLARYRVVVKEEMDASIKKMKQAFAELQSCLMDREVALLAEMDKVKAEAMEILLSRQ
+KKAELLKKMTDVAVRMSEEQLVELRADIKHFVSERKYDEDLGRVARFTCDVETLKKNIDS
+FGQVSHPKNSYSTRSRCSSVTSVSLSSLCDASAASSSTCASAPSHTSANKKNSAPGETLA
+TTANSSGRPYQPHREVLPGNRRGGQGYRPQGPKSNDPTNQGRHDSGGRYRNSSWYSSGSR
+YQSAPSQAPGNTSERGQTHSAGTNGIGASMEPGPPKPSFKKGLPQRKPRTSQPEAVNS
+>ENSTTRP00000000047 pep:novel genescaffold:turTru1:GeneScaffold_1119:119091:139301:1 gene:ENSTTRG00000000052 transcript:ENSTTRT00000000052
+MPAMRGLLAPQNFLDTIVTRFDGTHSNFVLGNAQVAGLFPVVYCSDGFCDLTGFSRAEVM
+QRGCACSFLYGPDTSELVRQQIRKALDEHKEFKAELILYRKSGLPFWCLLDVIPIKNEKG
+EVALFLVSHKDISDTKNRGGPDSWKETGGGRRRYGRAGSKGFNANRRRSRAVLYHLSGHL
+QKQPKGKHKLNKGVFGEKPNLPEYKVAAIRKSPFILLHCGALRATWDGFILLATLYVAVT
+VPYSVCVSTAREPSAARGPPSVCDLAVEVLFILXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWLQELARRLETPYYLVGRSPAIGN
+SSGQSDNCSSSSSEANRTGPELLGGPSLRSAYITSLYFALSSLTSVGFGNVSANTDTEKI
+FSICTMLIGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRIPKPLKQRMLE
+YFQATWAVNNGIDTTELLQSLPDELRADIAMHLHKEVLQLPLFEAASRGCLRALSLALRP
+AFCTPGEYLIHQGDALQALYFVCSGSMEVLKGGTVLAILGKGDLIGCELPRREQVVKANA
+DVKGLTYCVLQCLQLAGLHESLALYPEFAPRFSRGLRGELSYNLGAGGGPAEVDTSSLSG
+DNTLMSTLEEKETDGEQGPTASPAPADEPSSPLLSPSCTSSSSAAKLLSPRRPAPRHPLG
+GRGRPGRAGALQAEAGPSAHPQSLEGLRLPSVPWNVPPDLSPRVVDGIEDGCGSDQPKFS
+FRVRRSGPECSSSPSPGPENSLLTVPLGPSEVRNTDMLDKLRQAVMELSEQVLQMREGLQ
+SLRQAVQLILAPHGEGPSPRASGEGPCPASASGLLQPLCVDTGTSSYCLQPPAGSVLSGT
+RPHPRPGPPPLVAPWPWGPPASQSSPWPQATAFWTSTSDSEPPGSGELCPEPSTPGPPPP
+EEGARTGPPEPMNQAEAASTGEPPPGAGGLALPWEPQSLEMVLIGCHGSGTVQWTQEEGT
+GV
+>ENSTTRP00000000048 pep:novel genescaffold:turTru1:GeneScaffold_1119:140015:148043:-1 gene:ENSTTRG00000000053 transcript:ENSTTRT00000000053
+MTRGTGRTAQRGRSSQGLLDSSLMASGTASRSEDEESLAGQKRASSQALGTIPKRRSSSR
+FIKRKKFDDELVESSLAKSSTRAKGASGVEPGRCSGSEPSSSEKKKVSKAPSTPVPPSPA
+PAPGLTKRVKKSKQPLQVTKDLGRWKPADDLLLINAVLQTNDLTSVHLGVKFSCRFTLRE
+VQERWYALLYDPVISKLACQAMRQLHPEAIAAIQSKALFSKAEEQLLSKVGSTSQPTLET
+FQDLLHRHPDAFYLARTAKALQAHWQLMKQYYLLEDQTVQPLPKGDQVLNFSDAEDLIDD
+SKLKEMRDEVLEHELTVADRRQKREIRQLEQELHKWQVLVDSITGMSSPDFDNQTLAVLR
+GRMVRYLMRSREITLGRATKDNQIDVDLSLEGPAWKISRKQGVIKLKSNGDFFIANEGRR
+PIYIDGRPVLCGSKWRLSNNSVVEIASLRFVFLINQDLIALIRAEAAKITPQ
+>ENSTTRP00000000049 pep:novel genescaffold:turTru1:GeneScaffold_1119:166217:179622:-1 gene:ENSTTRG00000000054 transcript:ENSTTRT00000000054
+MEKDEPLLLVTPVSVKAIISRIEAAQLTRAQEDISSQLSDILDNVNCVISRFQEELGYDL
+KKKAKSHQTEQKGKNRFILLEKITSFSNDAKTKEKHLYEILHWLGDWGDSLYEIRNRKSE
+EEEEALDEWIEVMEKGLPLSLIATKGGIESLISLCSTLIEGQRKGAQMSKHTFWQGWREQ
+SPQKVTSCPQPLSPEQMLQDKHTTCIRVSEVKSMLQELLDSTMFNQGEVRAIRYMSAVVE
+NLNKALMLQHKENRSLEAKYRHLKIEMTKELSSQRLYFQKSLQVLKSKRDALLKQVEILG
+GKYHDLLLRKRALEFQLNKASARGQAEYSVKILVDSPAPAKKEALRKKETVIEETQQEPK
+KEEQFSPLSPSHLAMTWESSARPSTCQPLSTMTVHSRTADVYSSKDTENLQPVLPSSVDH
+KFPKKWERPSAESPGHKVKDQKDFFQEVTQEKEGLQMKSDFQKQLSPESSRKVALESKAE
+HWEEELSWERRRQQWLEEEMWLQWQEKWALLERHREKQQQWEQGEAARGWQRRLAQEQGG
+PWRGPERTGEDVERMGFMPTSRWRDLEEASLAPPSSQAQSAHQGRRPHLPRSPKTQQPAP
+GNQRTMSSFTQKPRARCVPTKPKKTASLPVTGTSLREVAQPPLHTSPVTLKGKVYHVDVE
+AQRKNLQLLTEEDQLGLPHYLRNKVRELTTTAVELNALELWCLCHEYILYRHFQSLRQEV
+INHVQVVREAGAAYKAQNLYLFLENVDRLQNLQLQAWTDKQRDLEEKRRECLSSMMTMFP
+KLQQEWNINLNTPVVTSPKSRKSKPPPSLLRNIHSSSPSCKRHLELFMTKHQQCVPLRMA
+HQQGNQLEAIWKTDVASSSHPVEKKTPTSLSWDQLGYPDIPRLLALDVH
+>ENSTTRP00000000292 pep:novel scaffold:turTru1:scaffold_105900:4:31868:1 gene:ENSTTRG00000000311 transcript:ENSTTRT00000000311
+SSQTLTHRSNVSLLEPYQKCGLKRKSEEVDSNGSVQIIEEHPPLMLQNRTVVGAAATTTT
+VTTKSSSSSGEGDYQLVQHEILCSMTNSYEVLEFLGRGTFGQVAKCWKRSTKEIVAIKIL
+KNHPSYARQGQIEVSILSRLSSENADEYNFVRSYECFQHKNHTCLVFEMLEQNLYDFLKQ
+NKFSPLPLKYIRPILQQVATALMKLKSLGLIHADLKPENIMLVDPVRQPYRVKVIDFGSA
+SHVSKAVCSTYLQSRYYRAPEIILGLPFCEAIDMWSLGCVIAELFLGWPLYPGASEYDQI
+RYISQTQGLPAEYLLSAGTKTTRFFNRDPNLGYPLWRLKTPEEHELETGIKSKEARKYIF
+NCLDDMAQVNMSTDLEGTDMLAEKADRREYIDLLKKMLTIDADKRITPLKTLNHQFVTMT
+HLLDFPHSNHVKSCFQNMEICKRRVHMYDTVNQIKSPFTTHVAPNTSTNLTMSFSNQLNT
+VHNQASVLASSSTAAAATLSLANSDVSLLNYQSALYPSSAAPVPGVAQQGVSLQPGTTQI
+CTQTDPFQQTFIVCPPAFQTGLQATTKHSGFPVRMDNAVPIVPQAPAAQPLQIQSGVLTQ
+GSCTPLMVATLHPQVATITPQYAVPFTLSCAAGRPALVEQTAAVLQAWPGGTQQILLPST
+WQQLPGVALHNSVQPTAVIPEAMGSGQQLTDWRNAHSHGNQYSTIMQQPSLLTNHVTLAT
+AQPLNVGVAHVVRQQQSSSLPSKKNKQSAPVSSKSSLDVLPSQVYSLVGSSPLRTTSSYN
+SLVPVQDQHQPIIIPDTPSPPVSVITIRSDTDEEEDNKYKPNSSGLKARSNVISYVTVND
+SPDSDSSLSSPYSTDTLSALRGNSGPLPEGPGRVVGDGAGTRTIIVPPLKTQLGDCTVAT
+QASGLLSSKTKPVASVSGQSSGCCITPTGYRAQRGGTSAAQPLNLSQNQQSSSAPTSQER
+SSNPAPRRQQAFVAPLSQAPYAFQHGSPLHSTGHPHLAPAPAHLPSQPHLYTYAAPTSAA
+ALGSTSSIAHLFSPQGSSRHAAAYTTHPSTLVHQVPVSVGPSLLTSASVAPAQYQHQFAT
+QSYIGSSRGSTIYTGYPLSPTKISQYSYL
+>ENSTTRP00000000293 pep:novel scaffold:turTru1:scaffold_105900:38206:40444:1 gene:ENSTTRG00000000312 transcript:ENSTTRT00000000312
+MGPRTPLLILFLLSWSGPLRGQQHHLVEYMERRLAALEERLAQCQDQSSRHAAELRDFKN
+KMLPLLEVAEKEREALRTEADTISGRVDRLEREVDYLETQNPALPCVEVDEKVTGGPGAK
+GKGRRNEKYDMVTDCGYTISQVRSMKILKRFGGPAGLWTKDPLGPAEKIYVLDGTQNDTA
+FVFPRLRDFTLAMAARKASRVRVPFPWVGTGQLVYGGFLYYARRPPGGPGGGGELENTLQ
+LIKFHLANRTVVDSSVFPAEGLIPPYGLTADTYIDLAADEEGLWAVYATREDDRHLCLAK
+LDPQTLDTEQQWDTPCPRENAEAAFVICGTLYVVYNTRPASRARIQCSFDASGTLTPERA
+ALPYFPRRYGAHASLRYNPRERQLYAWDDGYQIVYKLEMRKKEEEV
+>ENSTTRP00000000093 pep:novel genescaffold:turTru1:GeneScaffold_628:673:25859:1 gene:ENSTTRG00000000101 transcript:ENSTTRT00000000101
+MASRGVVGVFLLAALPLLCLELPRGIPDLXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXEEEKNEKRQKLVRKKQQEAQGEKASRYIENVLKPQEMKLKKLEERFYRM
+TGETWKLSHGHKLGGDKDLVLESESQTSSETSNREAAKRRNLPKPVTKVSPPAEQPTQKE
+VLDLPEEPPEIAEEVVTVALRCPSGRVLRRSFKSCSSQVLFDWMMKIGYHTSLYSLSTSF
+PRRALEVERGWSLQDVGITVDTVLNVEEKEQSN
+>ENSTTRP00000007440 pep:novel genescaffold:turTru1:GeneScaffold_805:289797:398243:-1 gene:ENSTTRG00000007773 transcript:ENSTTRT00000007865
+MRTRLPPALAALGAALLLSSIEAEVDPPSDLNFKIIDENTVHMSWARPPDPIVGFKITVD
+STTDGPTREFTLAASTTETLLTELIPEIEYVVTITSYDEVEESVPVIGQLTIQTGGPIKP
+GEKKPGKTEIQKCSVSAWTDLVFLVDGSWSVGRNNFKYILDFIAALVSAFDVGEEKTRVG
+VVQYSSDTRTEFNLNQYYQRDELLAAIKKIPYKGGNTMTGEAIDYLIKNTFTESAGSRVG
+FPKVAIIITDGKSQDEVEIPARELRSIGVEVFSLGIKAADAKELKQIASTPSLNHVFNVA
+NFDAIVDIQNEIISQVCSGVDDQLGELVSGEEVVEPPSNLIATEVSSKYVKLSWNPSPSP
+VTGYKVLLTPMTAGSRQHALSVGPQTTTLNVRDLSADTEYQISVSAMKGLTSSEPVSIME
+KTQPMKIQVECSRGVDIKADIVFLVDGSYSIGIANFVKVRAFLEVLVKSFEISPNRVQIS
+LVQYSRDPHTEFTLKKFTKVEDIIEAINTFPYRGGSTNTGKAMTYVREKIFVPSKGSRSD
+VPKVMILITDGKSSDAFRDPAIKLRNSDVEIFAVGVKDAVRSELEAIASPPAETHVFTVE
+DFDAFQRISFELTQSICLRIEQELAAIKKKAYVPPKDLSFSEVTSYSLKTSWSPSGENVF
+SYHITYKEATGDGEVTVVEPASSTSVVLSNLKPETLYLVNVTAEYEDGFSTPLAGEETTA
+EVKGAPRNLKVTDETTDSFKITWTQAPGRVLRYRIIYRPVAGGESKEVTSPANQRRRTLE
+NLTPDTKYEVSVIPEYFSGSGSPLTGNAATEEVRGNPRDLRVSDPTTSTMKLSWTGAPGK
+VKRYLVTYTPVAGGETQEVTVKGDTANTVLRGLNEGTQYALSVTALYASGAGDALFGEGA
+TLEERGSPQHLITKDITDTSIGAYWTSAPGMVRGYRVSWKSMYDDIEAGEKSLPGDAIHT
+IIENLQPETKYRVSVFAIYSSGEGEPLSGEATTELSDDSKTLKVDEETENTMRVTWKPAP
+GKVVNYRVVYRPRVGGRQMVAKVSPTVTSTMLKRLQPQTTYDITVLPVYKTGEGKLRQGS
+GTTASRFKSPRNLKTSDPTMSSFRVTWEPAPGEVKGYKVTFHPTGDDRRLGELVVGPYDN
+TVVLEELRAGTTYKVNVFGMFDGGESSPLVGQEMTTLSDTTVMPVLSSGMECLTRADADI
+VLLVDGSWSIGRANFRTVRSFISRIVEVFEIGPKRVQIALAQYSGDPRTEWQLNAHKDKK
+SLLQAVANLPYKGGNTLTGMALNFIRQQSFKTQAGMRPRARKIGVLITDGKSQDDVEAPS
+KKLKDEGVELFAVGIKNADEVELKMIATDPDDTHAYNVADFESLSRIVDDLIVNLCNSVK
+GPGDLEAPSNLVISEQTHRSMRVSWTPPSDSVDRYKVEYYPVSGGKRQEFYVSRLESSAV
+LKDLKPETEYVVNVYSVVEDEYSEPLKGTEKTLPVPVVSLTIYDIGSTTMHVKWQPVEGA
+TGYALSYEPINATEPTKPKEMRMEPTVTDVQLSDLFPNTEYAVTVQAALHDLTSDPFTAR
+EVTLPLPSPRDLKLRDVTHSTMNVLWEPAPGKVRKYIVRYKTPEEDAKEVEVDRSWASTP
+LKDLFSQTRYTVSVSAVYDEGESPPATAQETTRTVPAPANLQITEVTPESFRGTWDHGAS
+DVSLYRITWAPSGSTDKMETILNGDENTLVFENLNPNTLYEVSITAIYPDESESDDLTGS
+ERTMRLIPLTTQAPKSGPRNLQVYNATSNSLTVKWDPASGRVQKYRITYQPSAGEGNEQT
+TMVGRNSVLLQKLKPDTPYTITGSSLYPDGEGGRMTGRGKTKPLNTVRNLRVYDPSTSTL
+NVRWDHAEGSPRQYKLFYAPTAGGPEELVPIPGNTNYAILRNLQPDTAYTVTVVPVYSEG
+DGGRTSDTGRTLVRGLARNVQVYNPTPNSLDVRWGSAPGPVQQYRVVYSPLTGQRPSESI
+VVPGNTRTVHLERLIPDTPYSVNIIALYSDAEGTPSPAQGRTLPRSGPRNLRVFGETTNS
+LSVAWDHADGPVQQYRIIYSPTVGDPIDEYTTVPGRRNNVMLQPLQSDTPYKITVIAVYE
+DGDGTHLTGNGRTVGLLPPQNIHISDEWYTRFRVSWDPSPSPVLGYKIVYKPVGSNEPME
+VFVGEMTSYTLHNLSPSTTYDVNVYAQYDSGLSVPLTDQGTTLYLNVTDLTHQVGWDTFC
+VRWSAHRAATSYRLKLSPADGTRGQEITVRGSETSHCFTGLSPDTDYGVTVFVQTPNLEG
+PGVSVKEHTTVKPTEAPTEPPTPPPPPTIPPAREVCKGAKADIVFLTDASWSIGDDNFNK
+VVKFIFNTVGAFDEISPAGIQVSFVQYSDEVKSEFKLNTYNDKALALGALQNIRYRGGNT
+RTGQAFTIKKKVLTESGMKNVPKVVVTDGRSDEVKKAALVIQQSGFSVFVVGVADVDYNE
+LANIASKPSERHVFIVDDFESFEKIEDNLITFVCETATSXXXXXXXDGTSPRFKMLEPYH
+LTEKNFAFVQGVSLESGSFPSHSSYRLQKNAFVNQPTPDLHPNGLPTSYTIILLFRLLPE
+TPNDPFAIWQITDRDYKPQVGVIADPSSKTLSFFNKDTRGEVQTITFDTEEVKTLFYGSF
+HKVHIVVTSKSVKIYIDCYEIIEKDIREAGNITTDGYEILGKLLKGERKSATFQIQNFDI
+VCSPVWTSRDRCCDIPSRRDEAKCPSLPNACTCTQDSIGPPGPPGPAGGPGAKGPRGERG
+ISGAIGPPGPRGDSGPPGPQGPPGPQGPNGLSIPGEQGRQGMKGDAGEPGLPGRTGTPGL
+PGPPGPMGPPGDRGFTGKDGAMGPRGPPGPPGSPGSPGVTGPSGKPGKPGDHGRPGPSGL
+KGEKGDRGDIASQNMMRAVARQVCEQLISGQMSRFNQMLNQIPNDYHSNRNQPGPPGPPG
+PPGSAGARGEPGPGGRPGFPGTPGMQGPPGERGLPGEKGERGIGSPGPRGLPGPSGPQGE
+SRTGPPGSTGSRGPPGPPGRPGNSGIRGPPGPPGYCDSSQCASIPYNGQGYPGSG
+>ENSTTRP00000000094 pep:novel genescaffold:turTru1:GeneScaffold_628:47388:73064:-1 gene:ENSTTRG00000000102 transcript:ENSTTRT00000000102
+MDDKAFTKELDQWVEQLNECKQLNENQVRTLCEKAKEILTKESNVQEVRCPVTVCGDVHG
+QFHDLMELFRIGGKSPDTNYLFMGDYVDRGYYSVETVTLLVALKVRYPERITILRGNHES
+RQITQVYGFYDECLRKYGNANVWKYFTDLFDYLPLTALVDGQIFCLHGGLSPSIDTLDHI
+RALDRLQEVPHEGPMCDLLWSDPDDRGGWGISPRGAGYTFGQDISETFNHANGLTLVSRA
+HQLVMEGYNWCHDRNVVTIFSAPNYCYRCGNQAAIMELDDTLKYS
+>ENSTTRP00000000095 pep:novel genescaffold:turTru1:GeneScaffold_628:89292:104379:-1 gene:ENSTTRG00000000103 transcript:ENSTTRT00000000103
+IPSDTRESVNNDDLLNLTHLKDVLSGFAPAFPLHNNIGSSTVITSKLIKDPRLMKREESM
+GKHNTITGLNEILPLEKSLDFANSEINLSSMPTNPASSSEVMPGDQTVLTNYLDAPCFKI
+SLNESQTQAHNMGCKTYDCTAPSKITTAEQCKSHDNFSFPMCVSNVVSEVEIQEHSGEKA
+QRSQQESVNTCTKVYNSHISPEPQSSNFKTVYQTGHQMPTLFPLESKESIHENIQDIGKM
+RNFTGPEDNSKHEEKQNVWKESDNSFTNKTKISPVDSYISLHQDNKENENLDYLVENCDQ
+ILITQGLEKPKSFSSTTEEKYELDHLALEKITPRLENLSQKHPQHSLEYKDNVHTSFTIS
+QKRMELKLEKPDQNCVSVMTDALQEAKDIPQAKQLPAVTSSHDIKTAHNANCSMARENIC
+VKRRNGNDPVSLANSERDCKENSQVNSKGQDHTQFCNSQLNSDVHLNVDCREQRENDKEN
+QNEAEVEDIALSTENNIGNIHGDEKQSFHANKNFTTVDERRENKDYNSIEILSSEEFSTT
+FNLTWGKKYVSTESTLLENEGTVTAXXXXXXXXXXXXXEHLVSTTFPQVAGSSGHVASHA
+VVQVADAPVPALGTNLEDHPRYQFKETCSSEGPDFGLLVKYRVSDCETDMDKNQLHNSFH
+QSVSDNSVLQSIKLDNEIEVGSERSDSAFLFQQDAHSHGNVLYEDFGASYETLKSRIGWE
+GLLGSTNGKTEVLKSTTRRENSDQHYSEESSFYFSTAKNKAELFNPILLPDLEITITNVF
+MQGFSPAVESLALKDNSCKYRTEAIKSEIKEEEEEVPRFEIHSQCSGENSHHPSEGEFGN
+VRQVSGLVSKSETSLSEKQNKGPLVTEPSNVTTVNNESRCSFTKSKTDCNDTGSKKDTES
+SISQRKPHTPFRDQNIPHKDLRHHELCGNRRRLTSQDLLERFSSLSQGRIETSSRSEKHI
+RSVPDILTSEASLCKSRCLSRKLDRAVRHLKKAHRRVHTSLQLIAKVGEKRKGPLPKAYA
+VICDNFWESCDLQGYSSVSERRYYSTKQFLSKRKYDKPGEKRALGFEVDKSLTHVSNHKS
+YKTSGERVTKCLSEKNVSDVSRSPTTIRVRGYCDGEYPESQLALCSRSQSTGQSAYSTSS
+LRNPRSSELQPFSRKTGCLSSPDCPDEKLIKRENQIDAEFLSNVSKYEKLKNHSAHGNIK
+GTTKENNSEANEVISKRNSVSLTCIKESNVNFSVDKNHDATCIAHTKVKTDAVISVLESG
+VTHVFNIDINKPNNLILSGYTRNLEVNFPIEKWTAPNESSKPGIITGNFLMDPLNLTLIK
+SKKCNSIPQLLSATLVTDSEGESSQSYLNKQSIFAVDSSAVSTIVPHCQQGCAGKELLKT
+EHCSSSNSFRIDGNGTNVIENSELDFTSVSEESKDNMMKKLFSHDSFLLLKDNIKGSSSP
+KCIAKKDIQDRKMWKDKQAEKAKDSFHKTMAEGSSVKTEYKNQKNKTLEESSYLSEKTVK
+GNLVDSHLSIKGATEAVSLSNTASNELNKRKKEEGKVSHDSQSDSAVHSGRACNSKPGIK
+GMNHMPLLHAHSETSNVSPPPKMPTSYVNELKEEHCLTNNLAPIAKIAQILKRADEASSL
+QILQEETKVCQNILPLFVEAFERKQECSFKQILISRDLLVEQNLWYNCRCKLKPCALDSF
+VELQMMMETIQFIENKTRLLGGEPTFRSLLWYDETLYSELLGRPRGFQQQSNFYPAFQGR
+LKYDAFCELQNYRDQLVEVFEETKREISSYYMFLKYKRQINECEAVMKHCSDCFDFSLSV
+PFTCGVNFGDSLGDLESLRKSTLNLISIYGDSPQKDSCPGKQDHLWIIIEMISSKVNFIK
+SNEAVSIKISLYGLEHIFFDAAKSLVWKEKRESFCKKYSGKNSKEILLKINEHAFSKLQK
+IHDTLSKGLSSERISSTGLENTMIASRKSNALVNKATISIENSRFNSTLLSYPDICCISE
+ILDQAEFADFKKLQELTLRCTDHLEILKKYFQLLQEDNIDNIFITQENVLDMVKNHNHEA
+VILKPAAIETYIEIVMLSETVHFLKNSMAKKLDKQRFRGMLWFDLSLLPELVQCQEEMTS
+FSFLKDNSTDCLWKVIETAISELKNDLDIIYKYNEAVNCSYALHLLSRELEELSEIKTLL
+KKSKYSLSTYIDFVPCIASINYGSTVTELEYNYTQFSTLLKNVMAAPRKDLGKMAHVMKV
+MKTIEDMKIICAKNAKLTISFVLCQMRHNRKKTLHLERKEEMNIHVKPRKNINKSSTCVK
+VPSVSQCIMKNVSNSSKKRPFTVDECEDPQEQDENTTVSSCKKQKVNMKDVTKINREKAT
+FKHLRTMRSHPESENEIGPSSSDNLKRNHVSPKKVEIQLSLPGSLLPLKNLKDTCMSKLE
+GKIDGSLNNMKERNVNFSVAETKSDKCSPLAISDQKRVDGTLSKDQEITSQKFLKNSSDP
+AEKSCLSDIKPETDASLLPAASVLSKPVFFVRDINANLEMHDTDFEPQDNEILNSSIKNS
+KCTSSPEPIHVQNKIPVLNKTQPAKTESEEKHRKDTLNSSTTPVEASENMTLNVNQTVEY
+SFSEQNSKVLTQNAATYWNEIPQSACTPVYNSSEQSFGTSYPHSASCVYRYSSSNGSSIT
+PTYQGITSYEVQPPPFGMLTAVTSQNTHSNLLYSPYFGYFAGERQANDFVPVSGHFQTQM
+PVYNFQQPIFSQYVYYQPVTAYPCSPDLKVLPEVPWTYVSRYQEPFQPGH
+>ENSTTRP00000000096 pep:novel genescaffold:turTru1:GeneScaffold_628:224680:259042:-1 gene:ENSTTRG00000000104 transcript:ENSTTRT00000000104
+SATPKQDGGAAEIQELASIRVDIQKKRFYLDVKQSSRGRFLKIAEVWIGRGRQDNIRKSK
+LTLSLSVAAELKDCLGDFIEHYAHLGLKGHRQEHGHGKEQSSRRRQKHAAPSPPVSVGSE
+EHPHSVLKTDYIERDNRKYYLDLKENQRGRFLRIRQTMIRGTGMIGYFGHTLGQEQTIVL
+PAQGMIEFRDALVQLIEDYGEGDIEERRGGDDDPVELPEGTSFRVDNKRFYFDVGSNKYG
+IFLKLTNYPKSRGNIHPFHCCQIQHKEQTYDTTKTVEE
+>ENSTTRP00000007447 pep:novel genescaffold:turTru1:GeneScaffold_805:436128:441650:-1 gene:ENSTTRG00000007874 transcript:ENSTTRT00000007873
+ALAQGQKVVPIPACGSSFLVFSCRGWWAATAKMLRSLLALRQIAQRTISTASRRQFENKV
+SEKQKLFQEDNGIPVHLKGGIADALLYRATMILTVGGTAYGMYLLAVASFPKKQ
+>ENSTTRP00000007452 pep:novel genescaffold:turTru1:GeneScaffold_805:449604:462797:-1 gene:ENSTTRG00000007878 transcript:ENSTTRT00000007878
+IDYTGTDPSSPCNKCLSPNVTPCICTINFTLEQSFEGNVFMYYGLSNFYQNHRRYVKSRD
+DSQLNGDPSALLNPSKECEPYRRNEDKPIAPCGAIANSMFNDTLDLFLVGNESDPTPIHL
+IKKGIAWWTDKNVKFRNPPGADIPLEERFKGTTKPVNWVKPVYMLDPDEDNSGFINEDFI
+VWMRTAALPTFRKLYRLIERKSDLHPTLPAGRYYLNITYNYPVHSFDGRKRMILSTISWM
+GGKNPFLGIAYITIGSISFLLGVVLLVINHKYRNSSNTADITI
+>ENSTTRP00000007457 pep:novel genescaffold:turTru1:GeneScaffold_805:514235:608459:-1 gene:ENSTTRG00000007882 transcript:ENSTTRT00000007883
+MRSRNQGGESSSNGHVSCPKSSIISNADDKSLSEDTKKKNKSNRKEEDVMASGTVKRHLK
+PSGESERKNKKSLELSKEDLIQLLSIMEGELQAREDVIHMLKTEKTKPEVLEAHYGSAEP
+EKVLRVLHRDAILAQEKSIGEDVYEKPISELDRLEEKQKETYRRMLEQLLLAEKCHRRTV
+YELENEKHKHTDYMHKSDDFTTLLEQERERLKKLLEQEKAYQARKEKENAKRLNKLRDEL
+VKLKSFALMLVDERQMHIEQLGLQSQKVQDLTQRLREEEEKLKAITSKSKEDRQKLLKLE
+VDFEHKASRFSQEHEEMSAKLANQESHNRQLRLRLVGLTQRIEELEETNKNLQKAEVELQ
+ELRDKIAKGECGNSSLMAEVEKLRKRVLEMEGKDEEITKTESQCRGLRKKLQEEEHHSRE
+LRLEVEKLQVRMSELEKLEEAFSKSKSECTQLHLNLEKEKNLTKDLLNELEVVKSRVKEL
+ECSESRLEKAELSLKDDLTKLKSFTVMLVDERKNMMEKIKEEKVDGLNKNFKGQAVMDVK
+LIESKLLKLKSEMEEKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRLQQLEVVEGDLMKTEDEYGQLEQKFR
+SEQDKANFLSQQLEEIKHQIAKNKAIEKGEAVSQEAELRHRFRLEEAKSRDLKAEVQALK
+EKIHELMNKEDQLSQLQVDYSVLQQRFMEEENKNKNMGQEVLNLTKELELSKRYSRALRP
+SVNGRRMVDVPVTSTGVQTDAVGSEAAEEDTPAVFIRKSFQEENHIMSNLRQVGLKKPVE
+RSSVLDRYPPAANELTMRKSWIPWMRKRENGPPVTQEKGPRAGSSPGHPGELVLSPKQGQ
+PLHIRVTPDHENSTATLEITSPTAEEFFSSTTVIPTLGNQKPRITIIPSPNVMSQKQKSG
+DATLSAERAMSPVTITTFSREKTPESGRGPFADRPTSPIQIMTVSTSAAPADITVPSESQ
+EMPVGRTVLKVTPEKQTVPAPVRKYNSNANIITTEDNKIHIHLGSQFKRAPGTAAEGVSP
+VITVRPVSVAAEKEVSTGTVLRSPRSHVSPRPGASKVTSTITITPVTTSSARGTQSVSGQ
+DGSSQRPTPTRIPMSKGMKAGKAVVAAPGAGNLTKFEPRAETQSMKIELKKSAAGSATSP
+GGGKG
+>ENSTTRP00000011673 pep:novel genescaffold:turTru1:GeneScaffold_685:40496:47007:1 gene:ENSTTRG00000012308 transcript:ENSTTRT00000012306
+MMTAESREATGLSPHAAQEKDGIVIVKVEEEDEEEHVWGQDASLQESPPPDPEIFRQRFR
+HFCYQNTFGPREALSRLKELCHQWLRPEINTKEQILELLVLEQFLSILPKELQVWLQEYR
+PDSGEEAVTLLEDLELDLSGQQVPGQVHGPEMLARGMVPLDPVQESSSFDLPHEATQSHF
+KHSSRKPRLLQPRALPATHVPAPQHEGGPRDQAMASALFSADSQAMVKIEDMAVSLILEE
+WGCQNLARRNLNRDTRQENYGNVISQGCEKNEESTSKAEIAEDSASHGETTGKFQKDFGE
+KRDQQGRVVERQQRNPEEKTGKEKRDPGPATVKEKKNPSTGERGPREKGKGLGRSFSLSS
+NFNTPEEVPTGAKSHRCDECGKCFTRSSSLIRHKIIHTGEKPYECSECGKAFSLNSNLVL
+HQRIHTGEKPHECNECGKAFSHSSNLILHQRIHSGEKPYECNECGKAFSQSSDLTKHQRI
+HTGEKPYECSECGKAFNRNSYLILHRRIHTREKPYKCTKCGKAFTRSSTLTLHHRIHTRE
+RASEYSPASLDAFGAFLKSCV
+>ENSTTRP00000011675 pep:novel genescaffold:turTru1:GeneScaffold_685:66919:70275:1 gene:ENSTTRG00000012309 transcript:ENSTTRT00000012308
+MMTKVLGMATVLGPRTPQEQGPVIVKVEEEEKGKRLPSLETFRQRFRQFGYHDTPGPREA
+LSQLRVLCCEWLRPEIHTKEQILELLVLEQFLTILPQELQAWVQEHCPESAEEAVTLLED
+LERELDEPAQQASPPPSEQKQWWEKMASSGTVEESLSSPQPRSVETSYKYESWGPLYIQE
+TGEEEDFTPELRKVQDRKSNTQNEESTDKQESSEEFHAEGFRRDSIPMIIANKCEARLER
+QWVNLEKGRGTKIPLQDKGPSKGREVMTKPAPAERRYICAECGKAFSNSSNLTKHRRTHT
+GEKPYVCTKCGKAFSHSSNLTLHYRTHLVDRPYDCKCGKAFGQSSDLLKHQRMHTEEAPY
+QCKDCGKAFSGKGSLIRHYRIHTGEKPYQCNECGKSFSQHAGLSSHQRLHTGEKPYKCKE
+CGKAFNHSSNFNKHHRIHTGEKPYWCNNCGKTFCSKSNLSKHQRVHTAEGEGP
+>ENSTTRP00000011677 pep:novel genescaffold:turTru1:GeneScaffold_685:83841:88107:-1 gene:ENSTTRG00000012311 transcript:ENSTTRT00000012310
+METQADRVSQEPQALLESALPSSKVPAFSDKDSLGDEMLAAALLKAKAQELVTFEDVAVY
+FIRKEWKRLEPAQRDLYRDVMLENYGNVFSLDGETRTEHDPEISEDTGSHGVLLGRFQKD
+ISQGLKFEEAYEQEVSLKRQLGSSSGERLNRKIQDFGQVTVEEKRTPVGGRSEKYSDLGN
+SFTVSSNLISQQRLPVGDRPHKCDECSKSFNRTSDLIQHQRIHTGEKPYECSECGKAFSQ
+SSHLIQHQRIHTGEKPYECNDCGKTFSCSSALILHRRIHTGEKPYECNECGKTFSWSSTL
+THHQRIHTGEKPYACNECGKAFSRSSTLIHHQRIHTGEKPYECNECGKAFSQSSHLYQHQ
+RIHTGEKPYECMECGGKFTYSSGLIQHQRIHTGENPYECSECGKAFRYSSALVRHQRIHT
+GEKPLNVMGVSKSSLRVTAELNIREST
+>ENSTTRP00000011678 pep:novel genescaffold:turTru1:GeneScaffold_685:107504:109769:1 gene:ENSTTRG00000012312 transcript:ENSTTRT00000012311
+VPSVMASGVTGSVSVALHPLVILNISDHWIRMRSQEGRPMQVIGALIGKQEGRNIEVMNS
+FELLSHTVEEKIIIDKEYYYTKEEQGWYTTGGPPDPSDIHVHKQVCEIIESPLFLKLNPM
+TKHTDLPVSVFESVIDIINGEATMLFAELTYTLATEEAERIGVDHVARMTATGSGENSTV
+AEHLIAQHSAIKMLHSRVKLILEYVKASEAGEVPFNHEILREAYALCHCLPVLSTDKFKT
+DFYDQCNDVGLMAYLGTITKTCNTMNQFVNKFNVLYDRQGIGRRMRGLFF
+>ENSTTRP00000011680 pep:novel genescaffold:turTru1:GeneScaffold_685:110403:117758:-1 gene:ENSTTRG00000012313 transcript:ENSTTRT00000012313
+MALKDYALEKEKVKKFLQEFYQDDEFGKKQFKYGNQLVRLAHREQVAVYIDLDDVAEDDP
+ELVDSICENTKRYAKLFADAIQELLPQYKEREVVNKDVLDVYIEHRLMMEQRTRDPGAAR
+SPQNQYPPELMRRFELYFQGPSSNKPRVIREVRADSVGKLVTVRGVTRVSEVKLRMVVAT
+YTCDQCGAETYQPIQSPTFMPLIMCPSQECQTNRSGGRLYLQTRGSKFIKFQDMKMQEHS
+DQVPVGNIPRSITVLVEGENTRIAQPGDHVSVTGIFLPVLRAGFRQMVQGLLSETYLEAH
+RIVKMSKSEDDESGAGELSREELRQIAEEDFYEKLAASIAPEIYGHEDVKKALLLLLVGG
+VDQSPRGMKIRGNINICLMGDPGVAKSQLLSYIDRLAPRSQYTTGRGSSGVGLTAAVLRD
+SMSGELTLEGGALVLADQGVCCIDEFDKMAEADRTAIHEVMEQQTISIAKAGILTTLNAR
+CSILAAANPAYGRYNPRRSLEQNIQLPAALLSRFDLLWLIQDRPDRDNDLRLAQHITYVH
+QHSRQPPAQFEPLDMKLMRRYIAMCQEKQPTVPESLADYITAAYVEMRREAWASKDATYT
+SARTLLAILRLSTALARLRMVETVEKDDVNEATRLMETSXXXXXXXXXXXXXTQRPADVI
+FATVRELASEGRSVRYSEAEQRCVSRGFTPAQFQAALDEYEELNVWQVNAARTRVTFV
+>ENSTTRP00000016541 pep:novel genescaffold:turTru1:GeneScaffold_685:118176:120515:1 gene:ENSTTRG00000021386 transcript:ENSTTRT00000021406
+MISQFFILSSKGDPLIYKDFRGDSGGRDVAELFYRKLTGLPGDESPVVMHHDDRHFIHIR
+HSGLYLVATTSENISPFSLLELLSRLATLLGDYCGSLGEGTISRNVALVYELLDEVLDYG
+YVQTTSTEMLRNFIQTEAVVSKPFSLFDLSSVGLFGAETQQSKVAPSSAASRPVLSSRSD
+QSQKNEVFLDVVERLSVLIASNGSLLKVDVQGEIRLKSFLPSGSEMRIGLTEEFCVGKSE
+LRGYGPGIRVDEVSFHSSVQLDEFESHRILRLQPPQGELTVMRYQLSDDLPSPLPFRLFP
+SVHWDRGSG
+>ENSTTRP00000011683 pep:novel genescaffold:turTru1:GeneScaffold_685:121986:126559:-1 gene:ENSTTRG00000012315 transcript:ENSTTRT00000012316
+MAEEKKLKLSNTVLPSESMKVVAESMGIAQIQEETCQLLTDEVSYRIKEIAQDALKFMHM
+GKRQKLTTSDIDYALKLKNVEPLYGFHAQEFIPFRFASGGGRELYFYEEKEVDLSDIINT
+PLPRVPLDVCLKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXKEKKAPPLLEGAPLRLKPRSIHELSVEQQLYYKEITEACVGSCEAKRA
+EALQSIATDPGLYQMLPRFSTFISEGVRVNVVQNNLALLIYLMRMVKALMDNPTLYLEKY
+VHELIPAVMTCIVSRQLCLRPDVDNHCALRDFAARLVAQICKHFSTTTNNIQSRITKTFT
+KSWVDEKTPWTTRYGSIAGLAELGHDVIKTLILPRLQQEGERIRGVLDGPVLSNIDRIGA
+DHVQSLLLKHCAPVLAKLRPPPDNQDAYRAEFGSLGPLLCSHVVKARAQAALQAQQVNRT
+TLTITQPRPTLTLSQAPQPGPRTPGLLKVPGSIALPVQTLVSARAAAPPQPSPPPTKFIV
+MSSSSSASSTQQVLSLSTSAPGSGSTTTSPVTTTVPSVQPIVKLVSTATSAPPSTAPSGP
+GSVQKYIVVSLPPTGEGKGGPTSHPSPAPPPTSAPSPLGVSALCGGKPEAGESPPPAPGT
+PKANGSQPPGCGSPPPAP
+>ENSTTRP00000007010 pep:novel genescaffold:turTru1:GeneScaffold_3248:66662:120670:-1 gene:ENSTTRG00000007409 transcript:ENSTTRT00000007409
+MLLNCLHNNLCAGATLHCGAWASHFLLRSPGSRHVLWALVVFPEPESKGPCLTFSHLSLK
+DSFRDLFNPKMEIFLILYTRNNPSCAESLFEQDNSLNVNFNTRKKTVWLIHGYRPTGSTP
+PWLQNFVRILLDQDDINIIVVDWNRGATTFLYSRAVKNTRKVAVSLSRYIQNLLGHGASL
+DNFHFIGVSLGAHISGFVGKIFHGQVGRITGLDPAGPQFSGKPSNGKLDYTDAHIVDVIH
+TDTNGLGIKEPLRHIDFYPNGGKKQPGCPKSIFSGLEFIKCDHQRAVYLFMAALETSCNF
+ISFPCHSYKDYKTGSCVDCADFKEKSCPKLGYQTELWXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXYYFVLSIIVLDKTMKDGCITFKLLNQLGMVEEPRLFEPPLCTYNFVLKENEEIF
+LSPNTCTPDEI
+>ENSTTRP00000007011 pep:novel genescaffold:turTru1:GeneScaffold_3248:127606:139754:1 gene:ENSTTRG00000007410 transcript:ENSTTRT00000007410
+MFPAQEEADRTVFVGNLEARVREEILYELFLQAGPLTKVTICKDREGKPKSFGFVCFKHP
+ESVSYAIALLNGIRLYGRPINVQYRFGSSRSCDPANQSFESCVKINSHSYRNEEVVGRTS
+FPMQFSPINNAALPQEYLFFPKMQWHAYNPALQLPYYEMTAPLPNSTSVSSSLNCVPDLE
+AGPSSYEWAHQQPSDSDLYQMNKRKRQKQTSDSDSSTENNRGNEYSQNFRKCKKKRH
+>ENSTTRP00000007012 pep:novel genescaffold:turTru1:GeneScaffold_3248:172461:211219:1 gene:ENSTTRG00000007411 transcript:ENSTTRT00000007411
+MFSSLGRWSASGSYQRLPRGPEAQKCSPEKSASFFSKMTYSWFSRIIILGYKKPLEREDL
+FELNESDSSYIVCPMFEKQWRKEVLKNQERQKVKSSFHKEAHTRKPSLLRALWNTFKFVL
+IQVALFKVFADVLSFTSPLIMKQMIIFCEHRPDFGWSGYGYALALFVVVFLQTLILQQYQ
+RFNMLTSAKIKTAVIGLIYKKVSLATFGVYFLLDEGNILTATKVFTSLSLFNILRLPLFD
+LPMVISAVVQTRISLVRLEDFLNTEDFHPRSIETKYIGXXXXXXXXXXXXXXXXXXXXXX
+XALWLMFSRLGFRIAFCKKTFFLALSC
+>ENSTTRP00000007013 pep:novel genescaffold:turTru1:GeneScaffold_3248:260810:267611:-1 gene:ENSTTRG00000007412 transcript:ENSTTRT00000007412
+SAVLTLLLAGYFAQQYLPLPTPKVIGIDLGTTYCSVGVFFPGTGKVKVIPDENGHVSLPS
+MVSFTDNDVYVGYESLELADSNPQNTIYDAKRFIGKIFTPEELEAEIGRYPFKVLNKNGM
+VEFSVTSNETITVSPEYVGSRLLLKLKEMAEEYLGMPVANAVISVPAEFDLKQRNSTIQA
+ANLAGLKILRVINEPTAAAMAYGLHKADVFHVLVIDLGGGTLDVSLLNKQGGMFLTRAMS
+GNNKLGGQDFNQRLLQYLYKQIYQTYGFLPSRKEEIHRLRQAVEMVKLNLTLHQTAQMSV
+LLTVEKKDGKEPQSSDTELPKDELSPADSPHVNSMFGASLPEKKNGESQVLFETEISRKL
+FDTLNEDLFQKILVPIQQVLEEGHLEKTEIDEVVLVGGSTRIPRIRQVIQEFFGKDPNTS
+VDPDLAVVTGVAIQAGIDGGSWPLQVSALEIPSKHLQKTNFN
+>ENSTTRP00000007014 pep:novel genescaffold:turTru1:GeneScaffold_3248:365202:447721:-1 gene:ENSTTRG00000007413 transcript:ENSTTRT00000007413
+AIKSGDDPAESVGTLKRLQKLVWTKKARVPSLNEMKPTSINLDEDETLISCMKVAKSQEK
+RVNNVSTRRKEEMEIRLDSISASLVRPSTSTGCSLAKILSPSGGEVQMWKSWKPFPENPL
+WTYVDFQIDRVGPWDNCFHCTHHPHLKSSCTDMDLPHSWRSSSFGNFDRFRNNSISKPDD
+STGVHEGERINESEEQNKTSNNGGSLGKKMRVISWTMKKKVGKKYIKALSEEKDGEDGED
+ALPYQNSDPTIGTHTEKSSLKASDSMDSLYSGRSSSSGITSCSDGTSNRDSFRLDDDGPY
+SGPFCGRARVHTSFTPSPYDTDSLKIKKGDIIDIICKTPMGMWTGMLNNKVGNFKFIYVD
+VISEEEAAPKKIKAHRRSGKEKPKTLHEFLERIHLQEYTSTLLLNGYETLEDLKDIKESH
+LIELNIKNPEDRMRLLSAAENLLDEESKYAHLLFSLSLFLSPDISLNKSQLDDCPRDSGC
+YISSENSDNGKEDLESENLSDMVQKITITEPSG
+>ENSTTRP00000000455 pep:novel genescaffold:turTru1:GeneScaffold_1131:5488:34439:1 gene:ENSTTRG00000000485 transcript:ENSTTRT00000000485
+MLNNLTDCEDGDGGANPGDGNPKESSPFINSTDTEKGKEYDGKNMALFEEEMDTSPMVSS
+LLSGLANYTNLPQGSREHEEAENNEGGKKKPVQXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXTMLTAISMSAIATNGVVPAGGSYYMISRSLGPEFGGAV
+GLCFYLGTTFAGAMYILGTIEILLAYLFPAMAIFKAEDASGEAAAMLNNMRVYGTCVLTC
+MATVVFVGVKYVNKFALVFLGCVILSILAIYAGVIKSAFDPPNFPICLLGNRTLSRHGFD
+VCAKLAWEGNETVTTRLWGLFCSSRFLNATCDEYFTRNNVTEIQGIPGAASGLIKENLWS
+SYLTKGVIVERRGMPSVGLGDGTPVDMDHPYVFSDMTSYFTLLVGIYFPSVTGIMAGSNR
+SGDLRDAQKSIPTGTILAIATTSAVYISSVVLFGACIEGVVLRDKFGEAVNGNLVVGTLA
+WPSPWVIVIGSFFSTCGAGLQSLTGAPRLLQAISRDGIVPFLQVFGHGKANGEPTWALLL
+TACICEIGILIASLDEVAPILSMFFLMCYMFVNLACAVQTLLRTPNWRPRFRYYHWTLSF
+LGMSLCLALMFICSWYYALVAMLIAGLIYKYIEYRGAEKEWGDGIRGLSLSAARYALLRL
+EEGPPHTKNWRPQLLVLVRVDQDQNVAHPQLLSLTSQLKAGKGLTIVGSVLEGTFLDNHP
+QAQRAEESIRRLMEAEKVKGFCQVVISSNLRDGVSHLIQSGGLGGLQHNTVLVGWPRNWR
+QKEAHQTWRNFIELVRETTAGHLALLVTKNVSMFPGNPERFSEGSIDVWWIVHDGGMLML
+LPFLLRHHKVWRKCKMRIFTVAQMDDNSIQMKKDLTTFLYHLRITAEVEVVEMHESDISA
+YTYEKTLVMEQRSQILKQMHLTKNEREREIQSITDESRGSIRRKNPANTRLRLNVPEETA
+GDSEEKPEEEVQLIHDQSAPSCPSSSPSPGEEPEREGEADPEKVHLTWTKDKSVAEKNKG
+PSPVSSEGIKDFFSMKPEWENLNQSNVRRMHTAVRLNEVIVKKSRDAKLVLLNMPGPPRN
+RNGDENYMEFLEVLTEHLDRVMLVRGGGREVITIYS
+>ENSTTRP00000007015 pep:novel genescaffold:turTru1:GeneScaffold_3248:457530:498588:-1 gene:ENSTTRG00000007414 transcript:ENSTTRT00000007414
+MNLFCFSLEGSMDSLYEPVPEQQPHQGGTSGRTDSLFSPSGENGDLHNNLFMEVSHFENA
+KPERKSIRRSMSESKVFXXXXXXXXTWQEPSKPENDSHIRRLCQLKDLNEDDFLLSNNRH
+TLQGKKLQGISYQVTFECSSSHSQHIKPTHI
+>ENSTTRP00000000456 pep:novel genescaffold:turTru1:GeneScaffold_1131:38925:56241:-1 gene:ENSTTRG00000000487 transcript:ENSTTRT00000000486
+MNTAPSRPSPTRRDPYGFGDSRDTRRDRSPIRGSPRREPRDGRNGRDARDSRDMRDPRDL
+RDHRESRDIRDHRDSRSMRDARDMRDPRDFRDLRDSRDFRDHRDPMYDRYRDMRDSRDPM
+YRREGSYDRYLRMDDYCRRKDDSYFDRYRDSFDGRGPPGPESQSRAKERLKREERRREEL
+YRQYFEEIQRRFDAERPVDCSVIVVNKQTKDYAESVGRKVRDLGMVVDLIFLNTEVSLSQ
+ALEDVSRGGSPFAIVITQQHQIHRSCTVNIMFGTPQEHRNMPQADAMVLVARNYERYKNE
+CREKEREEIARQAAKMADEALLQERERGGPEEGLRGGHPPAIQSLINLLADNRYLTAEET
+DKIINYLRERKERLMRSSADSLPGPISRQPLGATSGASLKTQPSSQTLQSGQVLPSATPT
+PAAPPTSQQELQAKILSLFNSGTVVANSSSASPSVAAGNTQNQNFSIAANSQPQQRSQAS
+GNQPPNILGQAGSARNMGPRPGAPSQGLFGQPSTRLAPASNLASQRPVSSTGINFDNPSV
+QKALDTLIQSGPALSHLVSQTTAQVGRPQAPMGSYQRHY
+>ENSTTRP00000000458 pep:novel genescaffold:turTru1:GeneScaffold_1131:90058:99930:1 gene:ENSTTRG00000000488 transcript:ENSTTRT00000000488
+MVRLPLQCLLWGCFLTAVHAEPPTSCRENQYQTNSRCCNLCPPGQKLKNDCTEVTETECL
+PCSKGEFLATRNSEKYCHQHRYCNPNLGLQIQTEGTSITDTICTCDEGHHCTSHTCESCT
+PHSLCLPGFGVKQMATGVSDTICERCPVGFFSSVSSAFEKCHPWTSCESKGLVEQHAGTN
+KTDVVCGFQNRMRALVVIPITMVILFTVLLVSACIRKMVKKQETKALHPKAERQDPVETI
+DPEDFLGPHSTPPVQETLHWCQPVAQEDGKESRISVQERE
+>ENSTTRP00000000460 pep:novel genescaffold:turTru1:GeneScaffold_1131:139671:209554:-1 gene:ENSTTRG00000000491 transcript:ENSTTRT00000000490
+MRPRPDGRGLRVGAALSPAMLLLLLLMPPPPPGPLWAAGTPAPSAYGAAQNGAPGAGRVK
+RGWVWNQFFVVEEYTGTEPLYVGKIHSDSDEGDGAIKYTISGEGAGTIFLIDELTGDIHA
+MERLDREQKTFYTLRAQARDRATNRLLEPESEFIIKVQDINDSEPRFLHGPYIGSVAELS
+PTGTSVMQVMASDADDPTYGSSARLVYSVLDGERHFTVDPKTGVIRTAVPDLDRESQERY
+EVVIQATDMAGQLGGLSGSTTVTIVVTDVNDNPPRFPQKMYQFSIQESAPIGTAVGRVKA
+EDSDVGENTDMTYHLREESGSGGHVFKVTTDSDTQEAIIVVQKRLDFESQPVHTVVLEAL
+NKFVDPRFADLGTFRDQAIVRVAVTDVDEPPEFQQPSGLLEVQEDAQVGSLVVVVTARDP
+DAANRPVRYAIDRDSDLDQIFDIDADTGAIVTGKGLDRETAGWHNITVLAMEAXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGTLTIRICG
+CDSSCAIQSCNTTAFVVATSLSPGALIALLVCVLILVVLVLLILTLRRHHKSHLSSDEDE
+DMRDNVIKYNDEGGGEQDTEAYDMSALRSLYDFGELKGGGDGGGGGGGGGGGPGGGPGSP
+PQARLPSEHHSLPQGPPSPEPDFSVFRDFISRKVALADGDLSVPPYDAFQTYAFEGADSP
+AASLSSLHSGSSGSEQDFAYLSSWGPRFRPLAALYAGHRPEGEAPAS
+>ENSTTRP00000015678 pep:novel scaffold:turTru1:scaffold_91385:90750:162001:-1 gene:ENSTTRG00000016537 transcript:ENSTTRT00000016537
+MAPGRAVAGLLLLAAAGLGGEAAGPALAFSEDVLSVFGANLSLSAAQLGRLLEQLGAAPV
+EGDPEPGQLHFNQCLSAEEIFSLHGFSNATQITSSDFSVICPAVLQQLNFHPCDDRPKHK
+TKPSLSEVWGYGFLSVTVINLASLLGLILTPLIKKSYFPKILTYFVGLAIGTLFSNAIFQ
+LIPEAFGFNPKIDNYVEKAVAVFGGFYILFFFERTLKMLLKTYGQDGHTHFGNDDFGSSR
+EKTHQPKTLPAINGVTCYANPAVTEPNGHIHFDNVSVVSLQDGKKESTSCTCMKGPKLSE
+IGTIAWMITLSDALHNFIDGLAIGASCTLSLLQGLSTSIAILCEEFPHELGDFVILLNAG
+MSTRQALLFNFLSACSCYVGLAFGILVGNNFAPNIIFALAGGMFLYISLADMFPEMNDML
+REKVTGRQTDFTFFVIQNAGVLTGFTAILLITLYAGEIELE
+>ENSTTRP00000015278 pep:novel scaffold:turTru1:scaffold_98738:7732:15765:1 gene:ENSTTRG00000016125 transcript:ENSTTRT00000016119
+MNHSMKQKQEGIQENVKSSPVPRRTLKMIQPSTAGSLVGRENELVKSLSKRKHWNDQLIS
+KTSSSGVVTDPEHSENKNLGGVTQEAFDLMITENPSSQYWKEVAEKRRKALYEALNENEK
+LHKEIEQKDNEIARLKKENKELAEVAEHVQYMAEIIERLNQEPLDNSESPDSQEFDSEEE
+TGEDSEVEDSEIGTCAEEVVSSSTDAKPCV
+>ENSTTRP00000005068 pep:novel genescaffold:turTru1:GeneScaffold_2851:220370:316543:1 gene:ENSTTRG00000005372 transcript:ENSTTRT00000005376
+MQPGCQALPPGQMDLSVPKPRAETNSKDIWHPGERCLAPSPDNEKLCEASIKSITVDENG
+KSFAVILYSDFQERKVPLKRLQEVKSVKDCSRNFIFDDEDLEKPYFPDRKFPSSAVAFQL
+SENGDSIPYTINRYLRDYQREGALFLYEHFIQGRGCILGDDMGLGKTVQVISFLAAVLGK
+KGTREDIENNMPEFLLRSMKKEPLSSTAKKMFLIVAPLSVLYNWRDELDTWGYFRVTILH
+GNKKDSELTRVKQRKCEIALTTYETLRLCLDELNSLEWSAVIVDEAHRIKNPKARVTEIM
+KALKCNVRIGLTGTILQNNMKELWCVMDWAVPGLLGSMIHFKKQFSDQLEHGQRHTATKR
+ELATGRKAMQRLAKKMSGWFLRRTKTLIKDQLPKKEDRMVYCSLTDFQKAVYQTVLETED
+VSLILQSSKPCTCSSGRKRRNCCYKTNSHGETVKTLYFSYLAVQNVANHVALLQAASTSK
+QXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVLQQLLNHCRQNKDKVLL
+FSFSTKLLDVLQQYCMASGLDYRRLDGNTKSEERIKIVKEFNSTQDVNICLVSTMAGGLG
+LNFVGANVVILFDPTWNPANDLQAIDRAYRIGQCRDVKVLRLISLGTVEEIMYLRQVYKQ
+QLHCVVVGSENAKRYFEAVQGSKEHRGELFGVYNLFKLRSQGSCLTRDILEV
+>ENSTTRP00000015288 pep:novel scaffold:turTru1:scaffold_98738:30320:86204:-1 gene:ENSTTRG00000016128 transcript:ENSTTRT00000016129
+MLVGSQSFSPGGPNGIIRSQSFAGFSGLQERRSRQNSFIENPSALKKPQAKLKKMHNLGY
+KNSSPPKEPQPKRVEEVYRALKNGLDEYLEVHQTELDKLTAQLKDMRRNSRLGVLYDLDK
+QIKTIERYVRRLEFHISKVDELYEAYCIQRRLQDGASKMKQAFAASPASRAARESLSEIH
+RSYKEYTENMCTIEAELEKQLGEFSIKMKGLAGFARLCPGDQYEIFMKYGRQRWKLKGRI
+EVNGKQTWDGEEMVFLPLIIGLISIKVTELKGLATHLLVGSVTCETKELFAARPQVVAVD
+INDLGTIKLNLEITWYPFDVEDMTPSSGAGNKAAALQRRMSMYSQGTPETPTFKDHSFFR
+WLHPSPDKPRLSVLSALQESFFAKLHRSRSFSDLPSLRLRPKAVLEFYSNLPDDVLENGK
+AAGEKMPLSLSFSDLPNGDCTLSHNPGRPLPSTCSANPEITITPAELNRDSPSSQNEGLD
+DSSSSSSKSSLGEEGSEPRPHREEETEGLGKPEACRASAGARTERLFLEKGVAEALLQES
+DEASELKPVELDTFEGNITKQLVKRLTSSEVPAATERLLFEGSVSGESEGCRSFLDGSLE
+DAFNGLFLALEPHKEQYKEFQDLNQEVMHLDDILKCKPAVSRSRSSSLSLTVESALESFD
+FLNTSDFDEEEEDGDEVCNVGGGADSVFSDTETEKNSYRSVHPEVRGHLSEALTEDTGVG
+TSVAGSPLSLTTGNESLDLSIIRHLQYCTQLVQQIVFSSKTPFVARNLLEKLSRQIQVME
+KLSAVSDENIGSISSVIEAIPEFHKKLSLLSFWTKCCSPAGVYHSSADRVIKQLEASFAR
+TVNRDYPGLADPVFRTLVSQILDRAEPLLTSSLSSEVITVFQYYSYFTSHGVSDLESYLN
+QLAKQVSMVQTLQSLRDEKLLQVMSDLAPSSLLAQQEILRTLALLLTGDDSGVSEAVMLY
+LAAASRNEHFREKALLYYCEALTKTDLWLQKGACLALKSLKATESTKMLVTLCQSDTEEI
+RNVASETLLSLGEDGRLAYEQLDKFPRDCVKVGGRHASEVATAF
+>ENSTTRP00000005081 pep:novel genescaffold:turTru1:GeneScaffold_2851:320861:325646:1 gene:ENSTTRG00000005401 transcript:ENSTTRT00000005389
+MTATTWLKEEPPVHKLETDREPDCQEHKGPEQPAEPLAKEACDLCSDFSEDESVGNSIIK
+TAKNKASDSSKASGSPGQLTLLQCGFSKLFETKCEAVEDSDGNITSDDESSDEQPTCLST
+EAKDVGCRKSQDSLGTSKHQKFTNILNPNGKYIFDKTEXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKNNGDNRKTN
+VRGNGLISKQLNPENKTLKSNT
+>ENSTTRP00000005096 pep:novel genescaffold:turTru1:GeneScaffold_2851:325890:357384:1 gene:ENSTTRG00000005412 transcript:ENSTTRT00000005405
+SHISVSKQSHRPKTIKDRISFSSKLPSHEKNSTFIPRKRMKFPNKSIVNQDQMCESMDKF
+LGVEVAYIHSNQVIGSSKANHMRWAARDVFELKQSQLPANIAVCTSKTXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKQFEEMASYFKL
+SSVKEFAKHITNATSEERQKMLRDFYASHYPEVKEFFVDSPSEFIKSANEEGERVRNLSE
+KRESLIKERVSDSVTLAFKNCTKKLSQICSPKRYKEKSIKFRNHSFHREEVLCNDVETKK
+LPVSSTQETNNGKNSQASKDTVASCFLNSKSGAYELEKLENTMKNRQDLTGLGVSRNGPF
+FKVENKKIENPVLENTSVVSLLGDTSILDDLFKSHGNSPTRLPKKVLSGPMEKAKQRPKG
+FWDILNEQNDESLSKLTDLAVIETLCEKVPSAASSKRKEGLEAPLWKSNEKFLWKKFNSS
+DTDESTTNTQSNT
+>ENSTTRP00000009609 pep:novel genescaffold:turTru1:GeneScaffold_1659:22307:39820:1 gene:ENSTTRG00000010131 transcript:ENSTTRT00000010132
+MASPTLSPDSSSQEALSAPTCSPTSDSENLSPDELELLAKLEEQNRLLEADSKSMRSMNG
+SRRNSGSSLVSSSSASSNLSHLEEDTWILWGRIANEWEEWRRRKEKLLKELIRKGIPHHF
+RAIVWQLLCSATDMPVKNQYSELLKMSSPCEKLIRRDIARTYPEHEFFKGQDSLGQEVLF
+NVMKAYSLVDREVGYCQGSAFIVGLLLMQMPEEEAFCVFVRLMQEYRLRELFKPSMAELG
+LCIYQFEYMLQEQLPDLNTHFRSQSFHTSMYASSWFLTLFLTTFPLPVATRVFDIFMYEG
+LEIVFRVGLALLQVNQMELMQXXXXXXXXYFQRVIPHQFDSCPDKLILKAYQVKYNPKKM
+KRLEKEYAAMKSKEMEEQIEIKRLRTENRLLKQRIETLEKGQVTRAQEAEENYVIKRELA
+VVRQQCSSAAQDLQKAQSTIRQLQEQQDNPRLTEDFVAHLETELEQSRLRETETLGALRE
+MQDKVLDMEKRNSSLPDENNVAQLQEELKALKVREGEAVASARELKMQLQELSDTWQAHL
+SRGGRWKESPRKLVLGELQDELMSVRLREAQAVAEGRELRQRVMELETQDHIHRNLLNRV
+EAERAALQEKLQYLAAQNKGLQTQLSESRRKQAEAECKSKEEVMAVRLREADSMAAVAEM
+RQRIAELEIQREEGRIQGQLNHSDSSQYIRELKDQIEELKAEVRLLKGPPPFEDPLAFDG
+LGLARHLDEDSLPSSDEELLSVGVGAALQDALYPLSPRDARFFRRLERPAKDSEGSSDSD
+ADELAAPYSQGLDN
+>ENSTTRP00000009619 pep:novel genescaffold:turTru1:GeneScaffold_1659:44380:45853:-1 gene:ENSTTRG00000010149 transcript:ENSTTRT00000010142
+PPPLAVPLTHTPPSLATPPFQAAASPQSLPPLQAPPPLASLPLQAPLSPPASPPLQDPPS
+PLATPPPRAPPSLASPLLQAPPSPPSSPPLQVPPSPPASPPLQDPPLPLASPPPRAPPSL
+ALPALQTPPSPPASPPLQAPRRPPTPGPDAPISGPRLTLALAPGPPPPPSRSPSSTLSGP
+DLAGHSSSATSTPEELRGYDSGPEGGAATSPPADAELAACHPAAWSRGSAPPLAIRGTSA
+PLPWSPAAGSGSADGLCTIYEAEGPESATPATGALDPGPGSGAGGKAAAGAGAGLGALQA
+SVVQHLLSRTLLLAATEGAAGGTGGSGDAGGAGSAGGARTALSDAELGRWAELLSPLDES
+RASITSVTSFSPDDVTSPQGDWTVVEVETFH
+>ENSTTRP00000009623 pep:novel genescaffold:turTru1:GeneScaffold_1659:56206:59261:1 gene:ENSTTRG00000010156 transcript:ENSTTRT00000010146
+MIPVAEFKQFAEHQPNFKVLKPWWDVLAEYLTVAMLMIGVFGCTLQVTQDKIICLPSHGP
+RENLSEASCWQLLLRGVSEHVGDLQELSGLRNNLDLQQYSFINQLCYETALHWYAKYFPY
+LVVIHTLNFMVCTSFWFKFPGTSSKIEHFISILGKCFDSPWTTRALSEVSGENHKDPAAA
+GRATVTMAAAAAGPGKAGEGEKEKMLAEPEKVVTEPPAVTLLDKKEGEQAKALFEKVKKF
+RMHVEEGDILYTMYIRQTVLKVCKFLAILVYNLVYVGKISFLVACTVDTSEVTGYASFCC
+SHTKAHLFSKLAFCYICFVCVYGIICFYTLFWLFHRPLKEYSFRSVREETGMGDIPDVKN
+DFAFMLHLIDQYDSLYSKRFAVFLSEVSESRLKQLNLNHEWTTEKLRQKLQRNACGRLEL
+ALCMLPGLPDTVFELSEVEALRLEAICDVTFPPGLSQLVHLQEISLLHSPARLPFSSQIF
+LRDHLKVIWVKCEELREVPLWVFGLRSLEELHLEGVFPPELARAANLESLRELKQLKVLS
+LRSNAGKVPASVTDVAGHLQRLSLHNDGARLLALNSLKKLAVLRELELVACGLERIPHAI
+FSLSALQELDLKDNHLRSIEEILSFQHCRKLVTLRLWHNQIAYVPEHIRKLRGLEQLYLS
+HNKLETLPTQLGMCSGLRLLDISHNGLHSLPAELGLLQNLQHLAVSYNALELLPDELFFC
+RKLRTLLLGYNNLSQLSPQVGALGALSRLELKGNRLEALPEELGNCGGLKKSGLLVEDTL
+YEGLPAEVRDRMEVE
+>ENSTTRP00000009634 pep:novel genescaffold:turTru1:GeneScaffold_1659:61933:70706:1 gene:ENSTTRG00000010158 transcript:ENSTTRT00000010158
+MAASSLEQKLSRLEAKLKQENREARRRIDLNLDISPQRPRPIIVITLSPAPAPSQRAXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XIVKALYYLKEKHGVIHRDVKPSNILLDERGQIKLCDFGISGRLVDSKAKTRSAGCAAYM
+APERIDPPDPTKPDYDIRADVWSLGISLVELATGQFPYKNCKTDFEVLTKVLQEEPPLLP
+GHMGFSGDFQSFVKDCLTKDHRKRPKYNKLLEHSFIKRYETLEVDVASWFKDVMAKTESP
+RASGVLSQHHLPFFR
+>ENSTTRP00000009639 pep:novel genescaffold:turTru1:GeneScaffold_1659:77095:79321:1 gene:ENSTTRG00000010165 transcript:ENSTTRT00000010163
+MKPPQRRRAAPARYLGEVTGPAAWSAREKRQLLRLLQARRGKPEPDAAELARQLSGRSEV
+EIQDFLRQLKGRVLRKATRRMHPGGPQGPRRRETQTPAPIEVWMDLAEKITGPLEEALTV
+AFSQVLTIAATEPISLLYSQPPKPTQARGKLLLLSAPGRQEDLGPEAPGPAPKTQGPAPE
+ASSESLAGPSAEEDFSVDFEKIYKYLSSISRGGQGPELSPAESAVVLDLLMALPEELSRL
+PCAALVEHMSDTYLRLMAPQPDPASGGLGSGAEDDGTGSRGQEEAGQATPQAPENAGPSE
+PISTWQAAGICPLNPFLVPLELLGQVATPAR
+>ENSTTRP00000009645 pep:novel genescaffold:turTru1:GeneScaffold_1659:82734:97678:-1 gene:ENSTTRG00000010168 transcript:ENSTTRT00000010169
+MAAAAALRGCWCRCPRRCLGGGVRFLSSHNLVPLPHGTYQMPRPSGELTLSRSYSSGNRK
+GFLSGLLDNIKQELAKNKEMKESIKKFRDEARKLEESDALQEARRKYRTIESETMRTGEV
+IRKKLGEITGTVKESLDEVSKSDLGRKIKEGVEEAAKTAKQSAESVSKGGEKLGRTAAFK
+ALSQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXFFEMKMKYDESDNAFIRASRLLTDKVTDLLGGLFSKTEMSE
+VLTEILRVDPAFDKDRFLQQCENDIIPNVLEAMISGELDILKDWCYEAXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXLAMGKMMEQGPVLIIFQAQLVMVIKNPKGEVVEGDPDKVLRM
+LCVWALCRDQGELNPYAAWRLLDISASSTEQVL
+>ENSTTRP00000009650 pep:novel genescaffold:turTru1:GeneScaffold_1659:122565:142695:-1 gene:ENSTTRG00000010180 transcript:ENSTTRT00000010175
+MSNGYEDHMAEDCRDDIGRTNLIVNYLPQNMTQDELRSLFSSIGEVESAKLIRDKVAXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVSYARPSSEVIKDANLYISGLPRNMTQK
+DVEDMFSRFGRIINSRVLVDQTTGLSRGVAFIRFDKRSEAEEAITSFNGHKPPGSSEPIT
+VKFAANPNQNKNVALLSQLYHSPARRFGGPVHHQAQRFRFSPMGVDHMSGLSGVNVPGNA
+SSGWCIFIYNLGQDADEGILWQMFGPFGAVTNVKVIRDFNTNKCKGFGFVTMTNYEEAAM
+AIASLNGYRLGDKILQVSFKTNKSHK
+>ENSTTRP00000010162 pep:novel scaffold:turTru1:scaffold_99752:10875:16505:1 gene:ENSTTRG00000010726 transcript:ENSTTRT00000010717
+MNSEDCSATETSSLHLKRAQQNNATRLHFAAYHEGSIQVPIPCAVVNVVFITTLIIALVA
+LSVGQYNCPGQYMSSVSPNTHVSSCSDDWIVYQGKCYLISKKTRNWTLAQNFCSKHGATL
+AVIDSEEDMIFLKQHVGRTEHWIGLKNEADQMWKWSNGKKFNN
+>ENSTTRP00000010186 pep:novel scaffold:turTru1:scaffold_99752:35969:44880:1 gene:ENSTTRG00000010751 transcript:ENSTTRT00000010744
+MDSSFFHIMHVFKSIALIDKAEHIALIFYSQGKPTKLERGRKSSISIYLQEVQKYGSFSR
+LLLVFSLFLIYAMAGDIIYADIKHSSSEHSSSRQRSGCFNSSTASKSCPSEDWKLHGGKC
+YWVAKSEKSWNESKNDCVMKNSHLMVIQDFIDMVRNKIW
+>ENSTTRP00000008039 pep:novel scaffold:turTru1:scaffold_114581:86767:185448:1 gene:ENSTTRG00000008491 transcript:ENSTTRT00000008483
+MALNVAPVRDTKWLTLEVCRQFQRGTCSRSDEECKFAHPPKSCQVENGRVIACFDSLKGR
+CSRENCKYLHPPTHLKTQLEINGRNNLIQQKTAAAMLAQQMQFMFPGTPLHPVPTFPVGP
+AIGTNTAISFAPYLAPVTPGVGLVPTEILPTTPVIVPGSPPVTVPGSTATQKLLRTDKLE
+VCREFQRGNCARGETDCRFAHPADSTMIDTNDNTVTVCMDYIKGRCMREKCKYFHPPAHL
+QAKIKAAQHQANQAAVAAQAAAAAATVMAFPPGALHPLPKRQALEKSNGASTVFNPSVLH
+YQQALTSAQLQQHTAFIPTGSVLCMTPATSIDNSEIISRNGMECQESALRITKHCYCTYY
+PVSSSIELPQTAC
+>ENSTTRP00000008046 pep:novel scaffold:turTru1:scaffold_114581:236691:273831:1 gene:ENSTTRG00000008517 transcript:ENSTTRT00000008490
+MREYKVVVLGSGGVGKSALTVQFVTGTFIEKYDPTIEDFYRKEIEVDSSPSVLEILDTAG
+TEQFASMRDLYIKNGQGFILVYSLVNQQSFQDIKPMRDQIIRVKRYEKVPVILVGNKVDL
+ESEREVSSSEGRALAEEWGCPFMETSAKSKTMVDELFAEIVRQMNYAAQPDKDDPCCSAC
+NIQ
+>ENSTTRP00000002457 pep:novel scaffold:turTru1:scaffold_99719:32153:34244:-1 gene:ENSTTRG00000002619 transcript:ENSTTRT00000002619
+MGFWKLPPFLVLSILVLNQAGTLQAAPFRWALENGFDPATLTNKEMRLLLAAMMNDYVQM
+KACELKQETEGFSLDRSRTKQCKNLSTCVLGTYTDLNKFYTFPLTKTGVRMPGKKWVMAR
+VLEKDHDPHIGMPQGAYS
+>ENSTTRP00000014320 pep:novel scaffold:turTru1:scaffold_102216:2882:10755:-1 gene:ENSTTRG00000015104 transcript:ENSTTRT00000015105
+MELAQQARELGCWAAEEMEAPVAARAPESTLRRLCLGQGADIWAYVLRHVHSQRNVKXXX
+XXXXXXXXXXSPEARRKLKLEAAVAHLRAEILELDQSLELLERETEAQDMAMEQALQSVQ
+DTQRRALLLRAQAGAMQRQQRGLQGPMQQLQNQLKHLQDIERKAKVDINFGPLTSAALSL
+EPVVLGDVRTACSLRTQFLQKLLMPRAKGGSIPTPRDDLFGTSYQQWLSSVESLLTNHPP
+GHILAALEHLAAEREAEIQSLCTVDELQDTELARPQAPDQPNSSQALPSMVHLIQEGWQS
+VAALVTQRGPLLEDHQILTRHLQGLMEQMERCTMGSSERQALLLGLRSSALRAELKALHA
+MSQELEEAAGQRQLLLQELQAKQQRILHWRQLVEETQEQVRLLIKGNSASKTSLCQSPGE
+VLALVRQKVVPTSEMVAPQSQELLRCLEEGAQHLPHLLLGTLLRHSPGGLQPLRTVLPSI
+HQLHPASPRGSSLIVLSHTLGLPAGKAPELLLPKAASLRQDLLFLQDQRSLRCWYLLHMK
+TSLPPGPSTRELLQIWASQEEEQKENLGQALKRLENLLKQALKRIPELQGVVGDWWEQPG
+QAALSGELCQGLSLPQWQLRWIQAQGALQQLCR
+>ENSTTRP00000014325 pep:novel scaffold:turTru1:scaffold_102216:32694:46325:1 gene:ENSTTRG00000015108 transcript:ENSTTRT00000015110
+MGKAENYELYQVELGPGPSGDMAAKMSKKKAGSGGGKRKEKLENMKKEMEINDHQLSVPE
+LEQKYRTSATKGLSASLAAELLLRDGPNALRPPRGTPEYVKFARQLAGGLQCLMWVAAAI
+CLIAFAIQASEGDLTTDDNLYLALALIAVVVVTGCFGYYQEFKSTNIIASFKNLVPQQAT
+VIRDGDKFQINADQLVVGDLVEMKGGDRVPADIRILQAQGCKVDNSSLTGESEPQTRSPE
+CTHESPLETRNIAFFSTMCLEGTAQGLVVSTGDRTIIGRIASLASGVENEKTPIAIEIEH
+FVDIIAGLAILFGATFFIVAMCIGYTFLRAMVFFMAIVVAYVPEGLLATVTVCLSLTAKR
+LASKNCVVKNLEAVETLGSTSVICSDKTGTLTQNRMTVSHLWFDNHIHTADTTEDQSGQT
+FDQSSETWRALCRVLTLCNRAAFKSGQDAVPVPKRIVIGDASETALLKFSELTLGNAMGY
+RERFPKVCEIPFNSTNKFQLSIHTLEDPRDPRHVLVMKGAPERVLERCSSILIKGQELPL
+DEQWREAFQTAYLSLGGLGERVLGFCQLYLSEKDYPHGYAFNVEDMNFPTSGLCFAGLVS
+MIDPPRATVPDAVLKCRTAGIRVIMVTGDHPITAKAIAASVGIISEGSETVEDIASRLRV
+PVEQVNRKDARACVINGMQLKDMDPSELVEALRTHPEMVFARTSPQQKLVIVESCQRLGA
+IVAVTGDGVNDSPALKKADIGVAMGIAGSDAAKNAADMILLDDNFASIVTGVEQGRLIFD
+NLKKSIAYTLTKNIPELTPYLIYITVSVPLPLGCITILFIELCTDIFPSVSLAYEKAESD
+IMHLRPRNPKRDRLVNEPLAAYSYFQIGAIQSFAGFTDYFTAMAQEGWFPLLCVGLRPYW
+ENHHLQDLQDSYGQEWTFGQRLYQQYTCYTVFFISIEMCQIADVLIRKTRRLSAFQQGFF
+RNRILVIAIVFQVCIGCFLCYCPGMPNIFNFMPIRFQWWLVPMPFGLLIFVYDEIRKLGV
+RCCPGSWWDQELYY
+>ENSTTRP00000014330 pep:novel scaffold:turTru1:scaffold_102216:49884:51526:-1 gene:ENSTTRG00000015114 transcript:ENSTTRT00000015115
+MTLFHFGNCFALAYFPYFITYKCSGLSEYNAFWKCVQAGVTYLFVQLCKMLFLATFFPTW
+EGGIYDFIGEFMKASVDVADLIGLNLVMSRNAGKGEYKIMVAALGWATAELIMSRCIPLW
+VGARGIEFDWKYIQMSIDSNISLVHYIVASAQVWMITRYDLYHTFRPAVLLLMFLSVYKA
+FVMETFVHLCSLGSWTALLARALVTGLLALSTLALYVAVVNVHS
+>ENSTTRP00000004634 pep:novel genescaffold:turTru1:GeneScaffold_556:9622:117376:-1 gene:ENSTTRG00000004908 transcript:ENSTTRT00000004915
+MGSPALRPALLPLLPLLLLLLLLLLLRVPPSRGFPGSGDSPLEDDEVAYSHARYKDTPWC
+SPIKVKYGDVYCRAPQGGYYKTALGTRCDIRCQKGYELHGSSQLICQSNRRWSDKVICKX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRPASCVDI
+EPPRIKCPSVKERIAEPNKLTVRVSWETPEGRDTADGILTDVILKGLPPGSHFPEGDHKI
+QYTVYDRAENKGICKFRVKVRVRRCGKLNAPENGYMKCSSDGDNYGATCEFSCIGGYELQ
+GSPARVCQSNLAWSGTEPTCAAMNVNVGVRTAAALLDQFYEKRRLLIVSTPTARNLLYRL
+QLGMLQQAQCGLDLRHITVVELVGVFPTLIGRIGAKIMPPALALQLRLLLRIPLYSFSMV
+LVDKHGMDRERYVSLVTPVALFTLIDTFPLRKEEMVLQAEMGQTCNT
+>ENSTTRP00000014338 pep:novel scaffold:turTru1:scaffold_102216:52000:61583:-1 gene:ENSTTRG00000015124 transcript:ENSTTRT00000015124
+MSKRDVTLTNVTVVQLPRQPCPVTRAPPPPEPQPIKEQVPSPPPPAPKKVSVVRELTVGI
+NGFGRTGRLVRRACMEKGVKVVAVNDPFIDPEYMVYMFKYDSTHGQYKGSVEYRNGRLAV
+GNNEISVFQRKQPKEIPKSVGSPFVMVEATGVHLSLEETTAHIEAGALRVVICAPSPEAP
+MFVMGVNEKDYNPGSVKIVSNASCTTNCLAPLAKVIHEFGIVEGLMTTVHSYTATQKTVD
+GPSEKAWRDGRGAHQNIIPAPTGAAKAVGKVIQDLQGKLTGMAFRVPTPVVSAVDLTCRL
+AQPTPSSGIEEAIKAEAKGPTAGILAYTEDEVVSTDFVGDTHLSIFDAKGGITLNDNFVK
+LISWYDNEYGYSHRVVDLLRYMFSRDK
+>ENSTTRP00000001233 pep:novel genescaffold:turTru1:GeneScaffold_3311:22282:46837:1 gene:ENSTTRG00000001314 transcript:ENSTTRT00000001313
+MPKNSKVTQREHSSEHVTESVADLLALEEPVDYKQSILNVAGEAGGKQKVADVEDRPAWN
+SKLQYILAQIGFSVGLGNIWRFPYLCQKNGGGAYLVPYLVLLIIIGIPLFFLELAVGQRI
+RRGSIGVWHYVCPRLGGIGFSSCIVCLFVGLYYNVIIGWSIFYFFKSFQYPLPWSECPVA
+RNGTAAVVEPECEKSSATTYFWYREALDISNSISESGGLNWKMTLCLLVAWGIVGMAVVK
+GIQSSGKVMYFSSLFPYVVLACFLVRGLLLRGAVDGILHMFTPKLDKMLDPQVWREAATQ
+VFFALGLGFGGVIAFSSYNKQDNNCHFDAALVSFINFFTSVLATLVVFAVLGFKANIMNE
+KCVVENAEKILGYLNTDVLSRALIPPHVNFSHLTTKDYAEMYKVIKTVKEDHFSALGLDP
+CLLEDELDKSVQGTGLAFIAFTEAMTHFPASPFWSVMFFLMLINLGLGSMIGTMAGITTP
+IIDTFKVPKEMFTVGCCVFAFFVGLLFVQRSGNYFVTMFDDYSATLPLTVIVILENVAVA
+WIYGTKKFMQELTEMLGFQPYRFYFYMWKFVSPLCMAVLTTASIIQLGVTPPGYSAWIKE
+EAAERYLYFPNWAMALLITLIVVAVLPIPVVFVLRHFHLLSDGSNTLSVSYKKGRMMKDI
+SNLEENDETRFILSKVPSEAPSPMPTHRSYLGPGSTSPLETSGNPNGRYGSGYLLASTPE
+SEL
+>ENSTTRP00000004658 pep:novel genescaffold:turTru1:GeneScaffold_556:177084:212978:-1 gene:ENSTTRG00000004931 transcript:ENSTTRT00000004942
+MREPEEVVPDSGAVFTFGKTKFAENNPSKFWFKNDIPIYLSCGDEHTAIITGNNKLFMFG
+SNNWGQLGLGSKSTVNKPTCVKALKLEKMKFAACGRNHTLVSTEGGKVYAAGGNTEGQLG
+LGDTEERNTFHLISFFTSQHKIKQLSAGSNTSAALTEDGELFMWGDNSEGQIGLQNITSI
+CVPHQVTIGKPISWISCGYYHSAFVTTEGELYTFGEPEYGKLGLPEKLLINHKVPQLVPG
+IPQKVIQVACGGGHTVALTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKISYV
+CCGENHTALITDLGLMYTFGDSRHGKLGLGLESFANQFVPTLCSNFLKFIVQLVACGGCH
+MLVLATPRLDGAEDVELDEIDDCCLPSATSLPISDLTSGNVLQRSLSARVRRREREKSPD
+CIQTTGTLPPIAGSLIPPVCFPPRSVPFCMSTTNLQEDAKEGPMLPMEPDYFQRKITKGK
+ETDNFSAEDSESLGETTDVLNMTHMMSLNSNEKSLKLSPVQKQKKQETIEKLKQHTAHTE
+NGGSNEYESEEMSKKMKEGKAYKQLLAKGMYMMQAAVTMEAFSDEDVDTPEEQEGEDDSE
+GSGIEEQEIDINEEVPGEKEEEEAKFLSDDLTDRAEVSEGEGKPGGEAEHVPEGGGEGIG
+KEGNSGVEQRQEVRREEEKDKGGGEMESLGKGEEDLKEEEEREQKEREQGHQEERNKGLE
+EGEGSEQAGGEGEEEEGKEEEGGEDREGEEKREGKEEEEKGEGEEVEEGEGQEGEEEGQE
+EEGGEEEGDEQEGEGGAEEGGEEGEEEEGDGDGEGEREGEEEGGEGEGEEEEGEGEREEG
+EEEEGEGEGQEADREGEEEGEEGGEEEEGEGEEEGGEEEGEGQGEGEEEEGEEEGQEADR
+EGDEEVEEGGEEEEGEGEEVEGEGEEEVGEEGEGQEAEGEGEKEGEEGGEEEEGEGEEGE
+GEEEGEGEGKERKEGGGSEGEEEENSRKEGEKEEEEDDEEEEGKYQERGNEESGRQGRQG
+GGRESSKGSKMRGSVKYDKDKTYPKKFITNREGKGKEHEVQRFKMPVQSKQLLENGPSGS
+KTFWNNVLPHYLELK
+>ENSTTRP00000014346 pep:novel scaffold:turTru1:scaffold_102216:66191:70152:1 gene:ENSTTRG00000015130 transcript:ENSTTRT00000015131
+MHLASLLSSCFLLLLLGPLPGWAAGADPVKKVTEGISKGLSNTEREVGKALEGINNGIPQ
+AGRDKDFSGLNSVGSQAGKELDKGVQGLNHNLDKVTHGINNVAGQAGKGAEKFVPGVNSA
+TGQAGKEGEKIVQGVHHGVNQAGKEVGKFGQGVSHAAGQAGKEVEKLGQGVPHAAGEAGK
+EEDGLHQTVHDGTNQAGKEANQLLNGSPQGRFNHQNGGGATTTLTSGDLVNKPFIDLSVL
+WKSLTNIIL
+>ENSTTRP00000001235 pep:novel genescaffold:turTru1:GeneScaffold_3311:59898:83518:1 gene:ENSTTRG00000001315 transcript:ENSTTRT00000001315
+MISSVCVSSYRGRKSGNKPPSKTCLKEEMAKGEASEKIIINVGGTRHETYRSTLRTLPGT
+RLAWLADPDGGGRPASDGGGAGSSGGGGCEFFFDRHPGVFAYVLNYYRTGKLHCPADVCG
+PLFEEELTFWGIDETDVEPCCWMTYRQHRDAEEALDIFESPDGGGGGAGPGDEAGDDERE
+LALQRLGPHEGGAGPGAGSGGCRGWQPRMWALFEDPYSSRAARVVAFASLFFILVSITTF
+CLETHEAFNIDRNVTEIHRVGNTTSVRFRREVETEPILTYIEGVCVLWFTLEFLVRIVCC
+PDTLDFVKNLLNIIDFVAILPFYLEVGLSGLSSKAARDVLGFLRVVRFVRILRIFKLTRH
+FVGLRVLGHTLRASTNEFLLLIIFLALGVLIFATMIYYAERIGARPSDPRGNDHTDFKNI
+PIGFWWAVVTMTTLGYGDMYPKTWSGMLVGALCALAGVLTIAMPVPVIVNNFGMYYSLAM
+AKQKLPKKRKKHVPRPPQLESPIYCKSQETSPRDSTYSDASPPAPEEGVVERKRADSKQN
+GDASAVLSDEEGAGLTQPLASARTPEERRALRRSGTRDRNKKAAACFLLSAGDFACADGS
+VRKGTVVLPDPAAGTLFLPD
+>ENSTTRP00000016570 pep:novel scaffold:turTru1:scaffold_102216:85183:88552:1 gene:ENSTTRG00000015144 transcript:ENSTTRT00000021354
+KIMKPATVSLLLFRLGVAWLGGSHSCIRALSDQRRVGAAGQNYDYNQQKYPTASGGQHSA
+QIPTKCGVTVSSSXXXXXXXXXXXXKFW
+>ENSTTRP00000014358 pep:novel scaffold:turTru1:scaffold_102216:76565:88552:1 gene:ENSTTRG00000015144 transcript:ENSTTRT00000015144
+MKLQGCLACLLLALCLGSGEAGLLLSGGESSGAGAMETTGHGAGEAIGQEVGEAIKHGVG
+EATGGGDGEAAGSGVKETMGPGVGDALARGVEEAAHALGNTGSEAGRQAENVIQHGVDAA
+HSSSQGMPGGNGALGTNGQPPSGGHGSSGSPGNPGGPGIPWDQVYSGGSGGSFGTNSRGG
+SWGHEGYGGAFNLGTNTQADVAQPPYGSRRSSDNPNAECTNRPPSGSGGSSSNSGGSSSD
+GRNSGGSISGGSSGGSNSSSGGSSELHWGYNTSSSLGSRGGSGGNKPECDNPRSEVHVSG
+ESGQNSQLFPGLFGLDTFWKNLKSKLGFMNWDTISKNQIPDLRTRIFLYFCRLWEKFKQS
+TPFLNWNAITEIRALSDQRRVGAAGQNYDYNQQKYPTASGGQHSAQIPTKCGVTVSSSXX
+XXXXXXXXXXKFW
+>ENSTTRP00000001236 pep:novel genescaffold:turTru1:GeneScaffold_3311:182575:189152:1 gene:ENSTTRG00000001317 transcript:ENSTTRT00000001316
+MKTAGREPLPRRSPRWRRAVPLCETSAGRRVSQFRGEDLRRPATMKGKERSPVKPKRSRG
+GEDSTPRGERSKKLGGSGGSNGSSSGKTDGGGGSRRSLHLDKSSSRGGSREYDTGGGSSS
+SRLHSYSSPSTKNSSGGGESRSSSRGGGGESRSSGAASSAPGGGDGGEYKTLKISELGSQ
+LSDEAVEDGLFHEFKRFGDVSVKISHLSGSGSGDERVAFVNFRRPEDARAAKHARGRLVL
+YDRPLKIEAVYVSRRRSRSPLDKDSYPPSASVVGSSVGGHRHPPGGGGGGQRSLSPGGAA
+LGYRDYRLQQLALGRLPPPPPPPLPRDLERERDYSFYERVRPAYSLEPRVGAGAGAAPFR
+EVDEISPEDDQRANRTLFLGNLDITVTESDLRRAFDRFGVITEVDIKRPSRGQTSTYGFL
+KFENLDMSHRAKLAMSGKIIIRNPIKIGYGKATPTTRLWVGGLGPWVPLAALAREFDRFG
+TIRTIDYRKGDSWAYIQYESLDAAHAAWTHMRGFPLGGPDRRLRVDFADTEHRYQQQYLQ
+PLPLTHYELVTDAFGHRAPDPLRGARDRTPPLLYRDRDRDLYPDSDWVPPPPPVRERSTR
+TAATAVPAYEPLDSLDRRRDGWSLDRDRGDRDLPSSRDQPRKRRLPEESGGRHLDRSPES
+DRPRKRHCAPSPDRSPELSSSRDRYNSDNDRSSRLLLERPSPIRDRRGSLEKSQGDKRDR
+KNSASAERDRKHRTAASTEGKSPLKKEDRSDGSAPSTSTASSKLKSPSQKQDGGTAPAAA
+ASPKLCLAWQGMLLLKNSNFPSNMHLLQGDLQVASSLLVEGSTGGKVAQLKITQRLRLDQ
+PKLDEVTRRIKVAGPNGYAILLAVPGSSDSRSSSSSATSDTATSTQRPLRNLVSYLKQKQ
+AAGVISLPVGGNKDKENTGVLHAFPPCEFSQKFLDSPAKALAKSEEDYLVMIIVRVFGLE
+IGVRYENKRELTLLH
\ No newline at end of file
diff --git a/gatb-core/test/db/query.fa.gz b/gatb-core/test/db/query.fa.gz
new file mode 100644
index 0000000..d0e2058
Binary files /dev/null and b/gatb-core/test/db/query.fa.gz differ
diff --git a/gatb-core/test/db/reads1.fa b/gatb-core/test/db/reads1.fa
new file mode 100644
index 0000000..2f94a85
--- /dev/null
+++ b/gatb-core/test/db/reads1.fa
@@ -0,0 +1,1498 @@
+>gnl|ti|1361533816
+CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA
+ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG
+ACTTAGATGTAAGATTTCGAAGACTTGGATGTAAACAACAAATAAGATAATAACCATAAAAATAGAAATG
+AACGATATTAAAATTAAAAAATACGAAAAAACTAACACGTATTGTGTCCAATAAATTCGATTTGATAATT
+AGGTAACAATTTAACGTTAAAACCTATTCTTTTATTATCCGAAAATCCGTCGTGGAATTTGTATTAGCTT
+TTTTTCTACATTACCCGTTTGCGAGACAGGTGGGGTCAGACGTAGACGTAGTCTCTGGAGTCAAGACGAA
+ATTTTACATTTCACAATTTCCTATAGGCCGAGCAAAATTTATTAAGAACCCACAGGCATCATTACGTTTT
+CTTGCACAGAAGACTTCACGCTGAAGTCATTGGGCTATATTTCAACGAGACGTCTGTTGGTTTATAAAGG
+GCTATATTTATACAAGAATAGGAGTATGGCAGTATGCTAGGCTGGTATGTAGTACGTATACCTCCTAAGC
+CGAAAGGCAGTAAGTGACGATGTAATAGTTTTGAGGAAAATTACTTTTTCTGAATAATATTTTTATTTTT
+GTTTGCATTTTGTTAAAATTATTTACTAAATTAATGATTCTCATATGTTTTTTCATAGATTTGATGAACT
+ACTGTACCATCTGATTAGCGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCA
+CACAACATACGAGCCGGAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTACTCACATAATTG
+CGTGCGCTCACTGCCCGCTTTCCAGTCGGAAACCTGTCGTGCCAGCTGCATTATTGATCCGCCACGCCCC
+GGGGAAAGT
+>gnl|ti|1361533817
+GTCTTCATTCAGCTGTTCTCATGATAACTAGTAATTCCTTGCTAACAATTTTTACTGAGTAGCAACCAAT
+TAATGTTGCCAGAATTTCATAATTGAATTTGAATTTTTTATTTTTTCCTTGATTATGCTTCAAACTCTAT
+GTAGTTATTTAGAGTCAATAATATTAAAGCAATCTTAATATTAACTCATTTATTTCTGATTGGCCATATT
+TATTTAATTCTCAACAATAATAATGATAAGTATAATAATATATTTAACTTAATAACATTTTAATCATTTT
+ATTTTTGTTTGTTGTGATTTTTGGACGTTGTGGTAAATAAGAAGTTTTAAGCTTATATTAATATGTTTTA
+CTTTTTATTTCTTAATACGAATTTAATTACCTACCCATTATATTAAGTATATGTTTTGGAATTCTTTCTG
+TAAAAATGTGTTTTAAATATTTTACACTTAATTATGTAGGTACCTATACATTTTTAAACTTATCGTATAA
+TTCTTTTAATGGTTAAATCATACAAATTAATGTGTAGAGAATAGTTTTTATAAGACTCGTTGTCAATACG
+TACGCATAATATAAAAAAACTGACATGTTTTAGTAAGTCGTTTTGATGCATAATAGGATTTTTACCTTTT
+AAAGTCTCAAGTTTTCATACAGTGGTACCTCTATATAGAACACGTTAGGCTTTACGGGGTCATTATTTCT
+GTTCCGATATTTTTAATGGCATAAAACTATAAACAATAACCGGTATGTATAAATGGTAC
+>gnl|ti|1361533818
+ACCTGAAGCAGTAGTTCATCATATTGCGACTGCAGAATCGATGATAAAGTGGCTTTTAGATCTAAAAGCC
+AATACAAAACTGAAGGAATTTGATTTGATGGATTTTAATTTTGAAAATGGATTATGATTGTCGATTGATT
+AACAAGTTTACTAGGTTTGAATAGAGGTGATTCTTAATATTTCAAATATTTGAATGTCATGATGAATATT
+ATAATTTATAATTAAAAAATATCATATTTTATTCATGGATATCAAAGCTGAAAAAATAGATATTCAAAAT
+CGCCTTTATAATAACCTATCATAAACTAATTAATCAATTAAATTCAGTTTTAAAAATTTAAATCCGACAA
+ATAAAATTCCTTCAGCTCTGTCTGGGATTTTGGTCGAAAAATTTTAAATCGAAAAAAGTTTATCTTATTC
+ATAATATCATTGCCAATGATATTAAAATTAATTAACAACGAATACAAATAACGTCCGACCTGTATATTGC
+GGGCCAACTGTTTTTATAGGAAATGTTGACCGAAAACTATTACAGATTAGATGTGTGTGTGTTTACCCTG
+TACAAAAATACAAGTACTATTACAACACATCATTATGTTAAATTGCCTCTATATTAATTTCTTTAAAACA
+CGACCAACTGCACATTAAAGTAGTTTATTTAGTACTACAGTAGATTAAATTCATTTTTGACGAAAAATTG
+CATTTGAAAATGGCCATTGTGTGTATAAATATTGTATACTAATATAACTCTAAATAAAGGTTTCCAGTAC
+CAAAGAACCAAATTTTTAATTACAACCAAAATAACTAAATCGTATTCTTTGTTAAATAGTTAAGTTTTTC
+GCCGATTGCTGTGCTTGACAGTCTCCTCAATTCAGAATTTCATGTAAAATAAAAATAGCGTACATATAAT
+GGATTGCTGTGGCATTTGGTTTGATTAATCCCAAATATTGATTCCAAATATCTATTAGCCTATTGTACCC
+CGGAGTACCG
+>gnl|ti|1361533819
+TGACTAAGCAGTAGTTCATCAGTATACATAAATATTTATTGTATTTTTAAAGCACGCCCCCTCCCCTCAC
+CGCCCATTCACATTGGAATTTTCTGTGTACGCTACTATAATGTTTAATGTACAAGAAAAAAAAACAATTA
+ATTAATTATTGATCAATACATAGGTGAAAGGTATAATATTATAATACCTATATAGATTTCGGACAGTTCT
+TACTAAAATTAGGTACCTACTTTTTTTTATTAAATATATAGACTATAGAGTCGTATTTGAACATAATTTT
+ACATAGTAAAAATTAGATTCAAATAATACATCTTAAATTCAATTGTTCTAACTTACTGTACCTATTTATA
+ATTTATAATATTGAATAGTATAATTAATTACTTTAATAATAATAATATCATAAAATATGCTTAGTAATAC
+GTTAAGCGGACAGACCATCATTGCTCAGAATCGTGTTTTTATACAATTGTTTGTATATCATTGAATTCAA
+ATTTAACACATTCGTTACAGGAAACCCTCTAGACCAGCGTGTATCAGGCCTGTGGTACGCGTACCACTAG
+TGGTATGTGTAAGGCTCATATGAGGTACGCTGAGAAAATCTTCTTTCATAAAATAATGGAATGAATATTT
+ACAATAAATATTATTTGGTTTATTTCGCTAGTTGAGATAGTAATAATATAAAGAACAGTGGAAAAATTTT
+AATGTAGTGAACGGAAAAGTTCCTTAATGCATAATAGATGTCTTGTTATGCTATATTATCATAATTTGGA
+GGTGCGGAGCGAATAGATGGTTAATAATTTTAATTACGCATTCGTTATTGATAAGGAAAAAACGTTACTT
+GGTCAGGTAGGTACTTGAAATTTTCAAACTGGGTAGGTAGTACGCGGGAATAACGGTGGAGAACCGGCTC
+TATGACCTCTACTGGGGAGAGAAGCTTACGTGCCACCTTTTTGTAAAAAATACTGTA
+>gnl|ti|1361533820
+TGACCCTGCAGTAGTTCATCACGTATCAAATTAATTAGCACGTTTATATGTATCAATATGTTACCATATC
+CATTGCGTGTGTTAGAGTTACCTGATAGGTTTCAATAGTAATTTTTAATTTTTTTTATTTTAATTTAAAA
+ATCAAACAAATAGCAGATCGGGATAAATATTTTAGGGAGCGATTTTTTATTCAAAATATGATTTTTATAA
+TTATTTTCAACATCCAAGGTTTTAATACCACACACCTGTACCTTCTTTTATATTTTTATGACTTTTGACA
+AAATAGAATTTAATAACCTTAGACAATTTTAAATTATTAATTATCCCAGACATTTAATTTATTCCTATTA
+TTGAAGTATTTAGAAATGGTATGTATAAAATTTAATAATGTATTTTAAATTATATATAAAATATTTAATG
+TTGCTAATAGATAGGATGTCAATCAAAAGTACCGATACCACAAATTACTAACAATGATTAATAAAATATC
+TTATAGCAATATTGTTTAGTTTCCAGTGCAATTAAATATTTTTACGTAGATAATTTTTAATAAAAGTTAT
+ATAACTAATAAACAAAATTTTATCCGATGTATATAACTACTCTTGATTTTTATATAGAAGTTTTAAAATT
+ATATAGAATATATAAGTTAAATACGTATTTTCTAATCCAATATTATTCACCATAAGACTATTTTTTATTT
+TTAATGGCATTGTACTGTAGAATTACCTATCTAAAACATAATGGGTATTTTTAAACCAATTATTAGTATA
+CGTACCTAGGTGCATACAATTATGTTATTAAATTTTGTAATAAAAATAATGTATATTTCCAGATGTTTAC
+CTAGGTGGCCTAAATACACTTTTGGCTTCAACAATCATATAGTTTAGAAATGTATCATATCCCACGAGTA
+GTTTATATGTCATATTTGACTATTTGGATTATATTATTCCTTGTACATACCATAT
+>gnl|ti|1361533821
+TCTTATGCAGTAGTTCATCAAGATAAGCGGAGTGGAGTTGTACGGGGTTACCCCGCGAAATGTTTGTCCA
+CATTACTCGGCTCATCTAAACTTTGAATATTTATAACTCATAAACTACTCACCCAAAATTCGATTTTCAT
+GTATCAAAATACTAAGAAAAATATTCTGCTTGTATAACGCAATCCTTTTATGATCTAAAGTCAAATGATG
+AATATTATATTTAACTCTTTCATCTATACCTTTTGAGAGTTCTGGTTTTAATTTACGACACTGGAATGCT
+TTCATTTGATAATAGTATCAACCATTATTATTCAACTTTATATTCGACATTCAAACATTCAGGACACTAT
+GCCTTCCAGTAGCCTTATACACTCAGACTAGACAATATTGTTCGTCCATGCCAGAGGTTTAAGACAGGGA
+CTGGAACCGAACCTAAAAGAACCGGTTCTGGAACCGGAACCTTTATCCATGAAAACCCATAGGTATAAGT
+AAAAGTATTTATCAAGTTAGATAATAATATTTTAGTCAACAATCTACAAAAAAATTATAATTTTCTTCTC
+ATTATATATGAGTAAGATATTAAAATTAAATAGTAGAATACTTAGATTGATGAACTACTGTACCATCTGA
+TTACGCGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAG
+CCGGAAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTC
+ACTGCCCGCTTTCCAGTCGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGA
+GGCGGTTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGC
+GGCGAGCGGTATCAGCTTCCTCCAAAGCGGGTAAATACGGTTATCCACAGAAATCCAGGGGATATAACCC
+ATGA
+>gnl|ti|1361533822
+GCGCAAAGAGGAGAGCAGTAGTTCTCAGAGTTCATCATTAATTATAAATATAAACAGTTTTATTGCATTT
+TTTTTTATATTTTTTATGCCAACAAAAATATCAAGCAAGTTGATGTACCATCTTTCAGTGGTTCATTTGG
+TATCTTACCAAATCATGTACCCACATTGGCTGTTCTCCGCCCTGGAATTGTAACGGTATATGAAGATGAA
+GGAACATCAAAAAAAATATTTGTTTCTAGTGGAACGGTAATTAAATACCTTTGTGGCTTTACCTAATACT
+TATGTAATAATTAAATATGTTGATTTTTAGATAACTGTAAATGAAGATTCTAGTGTTCAAGTTTTGGCTG
+AAGAAGCTCACCCGATTGAAAATATTGATGGATCAGCCGCACGTCAAGTACTACCAGAGGCTCAAAGTCA
+ACTCTCAACTGCATCACGTGATGTTTGATGAACTACTGTACCATCTGATTACGCGCATGGTCATAGCTGT
+TTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGAAGCATAAAGTGTAAAGC
+CTGAGGTGCCTAATGAGTGAGCTAACTCACATTGATTGCGTTGCGCTCACTGCCCGCTTTCCAGTCGGGA
+AACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGTCTGCGTATTGAGCGCTC
+TTCCGCTTCCTCGCTCACTGACTCGATGCGCTCGATCGTTCGGCTGTGGCGAGAGATATCGCTCACTCAC
+AGGCGGTAATACCGGTTATCTACAGAAGTCACGGAGATAGCCGCATGAAAAGAACATGTGAGCAAAATGT
+CCAGCTACAGAAACGAGCCGTAAAATCACAGCGTTGCTGGCGTTTTCCATAGGCTCCGCACGCCTGAACG
+AGCATCACCAAGAGTCGACGCTCCA
+>gnl|ti|1361533823
+GACCTAATGCAGTAGTTCATCATTTTTACATTTAATAATTTACTTGCTACTTATTACCTACCTAATTATG
+ACTATATAAGAGATAATTTTGACAACTTTTTTTTTGTTCGGCACTGCTTTTTATTTGCTTGATTTTGCAT
+AAAGGTATATTGCCTCATGCGCATTGTAATGTAGTAAGAAAATATATATTTTGTTAGTATTTCTTTTTGG
+TGTTCACGAATGGTGCAGTTGAATTTAATATTTAAATTCCTTGTGACTTACTCGTTACAGGTATTTTCAA
+AGACATCATTTGAACTTGCATGTAAAGCAAAACATTCTTCAAGTTGCTTTATAATTTTATACAAGTGGCT
+ATCTGGGTAAGTAAGATATCCCTTTGTTTTAGCTTGTATTAAATTTGCATCTAAAAATATGGCAAATAAC
+AATATGGCCTTCTGATGTGTTCAGGCATGTAGTCAGAAAATATTCACTAGGTGGGCCAATGTTAGATGGG
+CAAGGTAATTGCATTTAGAGTCACTACAACAAATAAGCGCTAGAGCGTAATGGAGATTCATTTCGGTAGA
+CACTATTCTAGATTCGTTGGGCAACCATACTATCTTTAATCGTGGCGTTGACTCAATTTTAGCTTCAAAT
+ATTAATTTTATCGGTATAGGTCGATGTGTAACCTGTATACATAGACCTATTAACTAAGTTAATAGGTTAA
+TAGGTCTATGCGACTATGCCTTTATATCTTAAATCGTGATTTTTGATTAGACAGCCGTCTTGTTGTGTTA
+TATTAGTAATAATAATAGCATATTTTAATACTCCGGATGACGGCCGTTGTGTATATAAATACAACATAAA
+TATATTACCTCGAGTAACTAAGTATATTTATTATATGGTAACTAATAGCAATTAGTATGCTTATAATATA
+AATAGTGAAGACATATATATGTAAAATCTCGAAACCAATATGTACATTC
+>gnl|ti|1361533824
+CGCCAACGCAGTAGTTCATCATTATGATGTTATTCAGGAGCCCCAGCCTCACCTGAGTACCCTTGAGCCT
+TCATATAGCCATCAAGAACTTTGCGTATGAAACCAATTAATTTGTCGATTAACAATTTTAACGCCAGTGA
+CGCGTTTACGCGCCGATTTAATATATATTTCAATGTTATCTAATTTTTGTAGCATTTATTGTGAATATCT
+CAAATGTAAGGTGGCTATAAAAAACAAATATCAAAAAAAAAAAATTGCTTTTTGAAATCGGTTGAACATT
+TTTATTTAGTAGAATATAGTTAACAGAATGTGATCAAAACTACGTTATCTGAACTTCCTTAAATATTTAT
+TTTTTACAATTATTCAGTTCTTGAAAAATTGAGCTGTCCATAGAAAATGTATTTATATTTTATAACTTGA
+CCCAATAATTTCAAAATTGTACCAACTACCCAGGAAAATATTGTAAAACATATTGTGAAAATAATAATAT
+AAATTATACAATCTAAAAATAATCATTTTTTAGCTTAATCTATACTTTTTTTTTTAAATAAACTCCATCT
+CTGTCCTCCTTAAATCTAATTGGATGTATATTTCGTTTTTTATTTTTCAATTGATGAACTACTGTACCAT
+CTGATTAGCGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATAC
+GAGCCGGAAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCAACATTAATTGCGTTGC
+GCTCACTGCCCGCTTTCCAGTCGGGAAACCTGTCGTGGCCAGCTGCATTAATGAATTCGGCCACCGCGCG
+GGGAGAAGGCGGTTTGCGTATTGGGGGCTCTTCGCTTTCTTCGCTCACTGAACTCGCTTGCGCTCGGTCG
+TTCGGCTGCGGGCGAGCGTTATCAGCTCCCATTCAAGGCGGTAATACGTTTATCCCAGAAATACAGGGAT
+AACGCCAGGA
+>gnl|ti|1361533825
+TGCTTGCTGCAGCTAGTTCATCATAATATCTAATAATAAAATCCTTTATCAAATGTGTGATCATTTTACT
+ACAATTATTATTATAGTAATAAGTAATAACTAATAACTAATAAGTAATAATAATATTTTATTTTTAACAG
+TCTGTTAGGAGTGTTAGGACTTAATATAAACTAAATCTTAAAACTTAATTATAAATACCAATTTATTATA
+TTCCCGAGTAAATTAAAAATTAAAAAATTAACATTTTCATATTTAATGTAATATACTAGTTAAGTAAATT
+AATCTTATATAAGCTAAAACAATGTAATACCTAATGACCTTAAACACTTCTCAAACGGGTTCCTTGCTTT
+GTTTTAATTAAGACAATAAATAACAAGAAAAAGCTCTGGTCAGATTGGGAAAAAAATAAGTGATTCTTAT
+AATATACAGAGGGTGGACAGTTACGTGCTACGATCGGGTACTTGGGTACCTAACCTACCAAATTTTGTGA
+CTGCTGTGACATCTCGGTAATTGCGAGAAAAATATTGAACAGCTTTTTTTTTTTTTACTTAACGGTGACG
+GCTTGTTGTACACGCGCAGACGTTATATTATGTTAACATAATGTCTCGATCGAACTGCCGTATTTTTTAT
+TCTATAATATTGCAGTTCTCGTGCTGCAGTATTCCCATAATATTATACATTTATACCACCGACTCGATGC
+GCAATTACCACCACCGTGGTGCGCCATCGATTGCCTTATTGCGTGTATTAATAGGTACATGTATTATAAG
+TACGTCTCATCTGTGTGGAAAAGTGTAATACAGTATAATAATATTGGGGGTCCAGTATGTGATAAACGTG
+CGCTCTCCATGTAATGTGCACTACAAAAAAAAAAAAAGTTAATATAAAGTAAAATATCCTCGTCGAATCG
+AGTTGTCCACAGACCGATTGGCTTACGTACCCTAGTATTGCATAAACTTATGTTTATACCACCCTAGACA
+>gnl|ti|1361533826
+GTGAGCAGTAGTTCATCAGGTCTTTTGATTCTCTCTTACAGGACGAGGCTGCAGTGGAAATTGCCATCGC
+ATCAATCGGCTCAGTCGTGTAGAAAATGTTTCAATATCAAACGCGCTCGGCTTATATTCGATTTGATAAA
+TTCTAATGCAGCGGAAATAATTTTACAGGCTTAAAGGTTATTCTGATCGCTACACGTCCTTAAATTTCCA
+TGTATTCATCGGCAATCCGTATGTTAAAAAAGTCGATGAAAAACGCGACGTTCTGCGTTTTTTTTGTATT
+AGGCTGTTGTAAAATGTCCCGTTGAAAAATGTCAGTATTTATGCAATATACCAACCGAGATACTGACGGC
+GATTCAAAAATGAAAAATTCTAATCAGAGACATAATAAGACGTGTTATTCAATGTCTATAAAAATGTGTA
+TAATTATTGTTACATAAAATATGGTTCTCTATAACTACAGCATTACAAACATTATTTGGCGTTAATAAAT
+CAATGTTACAGGTTTGAAGTACACAATACCTACATTGTATTATAAAATATCAAAAGAACTCATATTATAC
+AAAGGCAACAACAAATCAGTAAATACTTTGGAATGGATAATAGTCTTGGAACCATTTTAATATTAAATTC
+ATTCTGGTGATTCCTTGGGTTTGTGAGGATGAAATAAAAAACAATAAAGCGGTACCTACGTAGCAAAGAT
+AAATTTGAAAAGTGTCTAATTTATTTATACATTCCAAAATACACAATGGCCTTATAGCTATACTAAACTA
+CATGGATGATATTATGATAAATAATAAATATTCACGTGTAAAATCTTATTTCTACAATATGTCAATAGTT
+GCAGCAGCACTTGACGTAATGATTGTAGCTCGACTACTATTCTCGTGGACATACCGCAGCTATATTTTAG
+GTTTCTGACTTAAAAATAAAGATATTTATATACAATATTGTCATAGCTATCACGGGAGTTTACTGAACGC
+TA
+>gnl|ti|1361533827
+AACCGATGCAGTAGTTCATCATTTTGCGTTGCACTGTAATTTTGTCGAACCGCGCAGACTATAATTTACC
+AGTGAGATGTCAGTCTTCTCTCCGGTCTCGGGCCGCAGCAGCAGTATTGCGCCCGAGAAGACTTTGGGGC
+GAATGCGGCGGGGTTATTCGAGCACTTAATAGCGGTCGGTCGTGATGAACTACTGTACCATCTGATTAGG
+CGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGA
+AGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTCACTGC
+CCGCTTTCCAGTCGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGG
+TTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGA
+GCGGTATCAGCTCACTCAAAGGCGGTAATACGGTTATCCACAGAATCAGGGGATAACGCAGGAAAGAACA
+TGTGAGCAAAAGGCCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGCGTTTTTCCATAGGCT
+CCGCCCCCCTGACGAGCATCACAAAAATCGACGCTCAAGTCAGATGTGGCGAAACCCGACAGGACTATAA
+AGATACCAGGCGTTTCCCCCTGGAAGCTCCCTCGTGCGCTCTCCTGTTCCGACCCTGCCGCTTACCGGAT
+ACCTGTCCGCCTTTCTCCCTTCGGGAAGCGTGACGCTTTCTCATAGCTCACGCTGTAGTATCTCAGTTCG
+TGTAGTCGTTCGCTCCAAGCTGGCTGTGTGCACGAACCCCCGTTCAGCCCGACCGCTGCGCCTTATCCGG
+TAACTATCGTCTGGAGTCAACCCGGGTAGACCCGACTTATCGCCACTTGCCAGCCAGCCACTGGTACCGT
+>gnl|ti|1361533828
+GTCTCAGTAGTTCATCAAGAGAGCACTACAGAGTTCAGTTATGCAAGAGTTACGAGAGGAATATGCAGAT
+ACACCAGTTGAACTGCAAATTAATACAGTTGGGTTAAAAAATAAACAGTCCAAGTATGATTATGAAAGGC
+AGAAGTATGAAGAAGACTATTTTACAAGGTATAAATTAAAATTGTCTCACTTAAAAAATAAATTCTTTTC
+TATTACTTAGTTTTATCTCTACTTATAAAAAAAAATTGTCTAGGTTGCCAGTTACCAAGAAGGACAAGCA
+TAGAGCTAAGCAATTATCATCAGTTACTCTTGGGAAATTAGGGAAAGAAGTGACACATTTCGAAGACATT
+TCAGCTCTTGGAGGAAATTTTAGTGAAAAAAGCGGTAATAAAAGAAAGAAGAAGTTCAAAGGAAAAAATT
+TAAAAAAGAAAAGGAAATTTTAAGCTATGTTTTAAAATATTATAATTATTTGAATTATGTTTCATTACAT
+TGAAATGAATTAATATTAAAAGTTAAAATTTCTTTGTTCTATATAATATTCTAATATTCATAATGATCTT
+TTATCATAACATTTGGTTAAAAAATGACATGTATTTATATTTTACATATTATTTAATCATTTTGGAACAT
+TTATCATAGAAAATTATTGAGTTTATGTCTTGAAATGCAGATTGTTTATTTTCTAAATAAAAATTTAAAA
+AAATATAAAACTACTAGGTACGCCTCCAAAATCTTAAAAGTAATACCACAGACTATATTATAAAATATAT
+TTCATAGACTCGTAATATCATAGAACCTTGTAAATAACTCATGCATATATAACGTTTTAGTATTTATACT
+GTACTCCATCAAGCAGTGACAATTGCCTCTGAGATTTATTTTAAATAGAGTGGTGGGTGGCTAGCCGGTG
+GGTCCCCTAGTATATTGTAGTATGATAATTCTTAATAGGTAGTCAGTCAACCGATCCTGCAATGTATAAA
+TCTACGTCATA
+>gnl|ti|1361533829
+AACCCCTGCAGTAGTTCATCACCAATGCATGTTGGTACAAACTTCACGAAGACTCGGTCTGTGGACAACC
+TGCTTAAAGTTCAGTGTTTCATCGGTTTCTAATAGCATAATATGGCCGAAATAAATATACTCAATAGTAC
+CTACATGAATTTTAATGATTGTTATTTATGATAATATGTGAAGTCCAAGAGCAAAAATAGAGCAATATTG
+TCGTATCCAAAGTATATAATATCTCTGCAAACGTTGAATCATTATAAACTATAACGTCTTATAAGCAGCC
+GTACAAACTACAGAATAATATATGCATATCGTTACGATATTACAGTATAAAATGTAAACAATACTGATAA
+ACATAATTATTATACATTATCGTATTACTATTGATAATAATTAATAATACAGATCGTGAGAAATTGCATA
+ATTTTTAATTAAGTGTTTTATACCTACCCAATGTACGGGCATAGGCTATATACTGGTGACTGTGTAATCT
+ATCTATATACAATATACATATAAAAATGAACTGCTTTTGGTTAGCTAAAACTCAATAACGCAGCTTGAAG
+AATAATTTCTTTTTTTGTTTTGTTCGCTTTTATACAGGGGTGGGTTAAAAATATAATAGGAATAATCCCC
+AAGAAAAGCAAAAAAAAAAAATTCAAAATTTGTAATTTAGTACTATTTTGGAAAATTGTCTAGCTTAAAG
+CGATTGTATATCCGATTGCGATGAACCTTTGGGAAGTGCAGTTGAGTAAACTCCAGTGGTGGATTTCTGC
+AGCATATTACATTCTAGCGCATTACATTCTCAACTGGGTTACACCAATATAAGCCCCGTATTTTGTATTA
+ATTGATCATTTTTCCCAGCGATGTCAGTTGTTAAACAGCTATATCAAAATTACCGATGATATATTGTATC
+ATCGTTGTAGTGGATTAGTAAACGACAACCTTGCTA
+>gnl|ti|1361533830
+AGACCAAGCAGTAGTTCATCATTTCGGTTTCGGTTATCGGTATTGATTTTTTCCGATTTCGGTTTTGGTA
+TATCCAGGTATTGATTTTTTCCGATTTCGATTTCAGTTTCAATATCGGTTTCAAACCCAAGATTATTATT
+ATATTATTATAATAATTAATAATTTATAATGACATATATACTCGCGTACTCGCCAATCAACACTCATCTC
+GTGGCGTACGATTTAGCGTCTGGTTGTCCCACAAGTAGATAGAATAATAATATAATTGATTACAAATACT
+ATAATATCAATGACAATATTTTCACTAGTATGATTATATAGTTATGAGTCATAACTTATGACGTATATAG
+TTAGCCACTCCACTTCATAACACAATTTCCAAATGATTTGTAACCTATTTTTTTTTGATTTGTAACCAAT
+TTTTCAGAATTTGTAACTTCATCGTTTATAAGTTAAAACTGTTTTGTAATTATTTGAAAAATATACTCAA
+CAGTAGGCAGGATTTTACATTTAATTCGAAAATGTCGATGGCTTAGTGCACACGACTTGTTATAAGTCTA
+TTTCAAAATCTAGATAATTATGTTACGATTTATCTAATGTTTATCTTAGATAAAAAATGGGCTTATCTAG
+ATAAATATTATAGTGCTTCTACAAAATTATAAAACCAATGTTACTAAAATTCTAATATAATATAAATTAT
+TTATAAAATTAGAAGAATATATTTCTTGTTATTATTGCCAACGACGGTGTTACGATAATAAGAGAACCTG
+CATACGGGTTTGCGCTATACATCGTTCTCTACTAGCCATAATAATGAGCATATTAAAATTAATTAGTATA
+GTTTATTTCAGATCATTTTAAAATAAATTAAAATTGACTTCGTAGACTGTATTTCAAAGGCTCAATCCGT
+TGTTATTTTAAAAATTATGTCATTATATT
+>gnl|ti|1361533831
+AGCTTAAGCAGTAGTTCATCAACTTCAAAAAAAATCTAAAATTTCAATTTCACTGGTTTGAACGTTTTCC
+GTGAGCTTGTTTACTCTACAATTGATAATGGTGGTGCCCTATGTAAATACTGTGTAATATTTGGTCAAGA
+ATTCGGAGGCAAAGGCAATAATCAAAAACTTTCCTCTTTAGTATTCAAAATTTTTAATAATTGGAAACAT
+GCAATTGAAGTATTTAGTGAACATTCTAAAAAAGATTTTCATAAAACCAATGTTTTACGAGGTGATCATT
+TTATAGCTATCTATTCTAAAAATCAGCAAAATATTGCGCAAAAATTAGATTCAGCGCGTGCTGCACAAAT
+AAGTTTAAATCGAAAAAGATTAATACCTATAATTGAAACTATAATTTTATGTGGCCGGCAAGAAATAGCT
+TTTCGTGGTACTAATGATTCCGGACCACTTTCATCAAAAGATGTCGAACCCGAACAAAATGATGGAAATT
+TTCGTGCTTTATTGCGAATGCGTGTTTCATGTGGCGATAAAAACTTAATTGACCACTTTGAAAATAATAA
+ATTAAATGCTTTTTATTTAAGTCCTCTAATACAAAATAATTTTATTGAAATTTGCGGAAAAATTATACAG
+GAACAAATAGTAGAAAAAATAAACAAATCAAAGTGTTTTTCCGTATTGGTTGATGAGACAACTGATATAT
+CTTGCTTTGAACAGTTATCATTATGTGTGCGGTATTTGGAGCAAAGTATAGATGCTAAAAATGATATTAC
+ATATGTACTAAAAGAAGATTTTTTACAATTTATACCAGTATATTCTACAACAGGACAAATTTGGCAACAG
+TAATTTTAGAAAATTTAAAAAGGCTCGGTGTTAATAGTCGGTACATGTTAGGACAAGGTATGACGGCGCA
+GTCATCTATGATGAAATTTCAAGCGTACATCTGTGATACGTGAAAAAACACCCTTGCCGCCTGTTACGTC
+CATGTA
+>gnl|ti|1361533832
+ACTTAAGGCAGTAGTTCATCATTAACGATTTAGTACGTGTACATTCACGATTCGCCTGTGGATAGAGTGC
+CTTGTATTCGTTTTATATTATTCGTTCAATATGTTGAGTAAAAAACGCAAAATCGACAGCGAAAATAAGA
+AGTTTATGAACAAGTGGAATGAACTATATTGTTTTGTATTGCCTGAAAGGGTTGGAGCCATTCCAGTCTG
+TTTAATTTGCAATTCAACTGTTGCTATTATTAAAAGTGGAAATTTAAAACGGCATTATGAAAATACTCAT
+AAAGATTTTCATACAAAATTTCCTCCAGGCAGTGAAGTGCGTAAAAATAAGCTCCATGCATGTATGTTAT
+CTTACAAAAATAGTACGACTACACTTATACGGTGTATGAGTGAACAAGAGAAATCAACTAAAGCAGCGTT
+GCGTGTTTGCTGGGTTCTTAATAAGCACCAAAAACCGTTTTCCGATTCCGAAATAGTAAAAGAGTGTATG
+TTGGAAGTGGTCACTGCACTTTTTCAAGAAAATAAAAAAATCGTTACCTCTATCCAAGATATTCCTTTGT
+TGGCAAGGAGTAACACAAGAAGGGCGGAAATGTTGGCAGCCGAAAACAAAAAAGCTTATTTGAATTTTTC
+CATAAGTCACCGTGCTACTGCATTGCGCTTGATGAATCTTGTGACTTAGTTGATTCTGACAATGTCAATT
+TTCGTACGATTCTTTGACATTGAAAATAAAGTGTTTAGAGAGAGTTACTAGGTAGGAAAAGATGCATTTT
+TCGCATTAAATATTTACTGTAATAGATATTTTTTTTCTACTTTATATTGCATTTTAATATAAAAATTAAT
+ATCATCATTATTTAATACCTTTTTTTTTTTTTTTAATTTAAAGAAATATAACATCTGTACCGGAACCATA
+GAATGGCTATACAAGGCTGATGATGTGAAAGCCACCAGTATGGACCCTCCAAG
+>gnl|ti|1361533833
+ACTTAAGCAGTAGTTCATCACAAAATAGCAATAAAAACAGTAAATATGCAAAAAATAGCAAAATAAAATT
+TCGTATGATATGACATCAGAGAAGTGTGATACATATTTGTATCTTACTTTGGATGTTCTAGGACGAACCA
+AGAAAAATATGCATTTGCTACAACTTCCGAGCCCTGGTGATGAATGAAAAATTAAATTAAACAACTGTCA
+ACTGATAATTTGATAAAATTTATCAAATAGGTAGACAATAACCTTAATTTCTTGATATATCAGTCATTAG
+AATACAATAAAATAAGAAATTGAATCATTCAATAAATGAAAAAATTAACTACAAAAGTAACTAGTTACTT
+ATTATTTTTAACGAGTTAGATTAGATTATTTTATACATTAAATCCAACTAATTAAGTAACAAAATTAATA
+TGAATTAAAACTAACTAGTTAGTGCCCATCTTTGTCCAATTTATTACAAAGGCATTTAGAATAAAGGAAA
+AAGATATATCGCAAAAATATTGATTATATTTCAGTCAACTCGCGATATAACGAAAATCTTGATATAACGA
+ATAAAACTACCGGTCCCTTGAAAATATCGCGGTATAATATAATTTCGATGTAACGAACTTTCGATATAAC
+GAATTTTTTTCTCGGTCCCTTGAAATTCGTTATATCGCGAGTTGACTGTATTATCATTTTGTTTTTTTTC
+TATATACCTACTATACATGGCAAATGTCCATTACCTAATCTAAAAATGATAGGTTTCATTAAACAATAAA
+ATAACCTTTTAGTTTTGTACTTCAGCAGTATAATTCAAAATAAAAAATAGGATTTAATAAATAATCGCTG
+TAACTTGTACCTATATAATGTGAATAATTAGATACATCAGTTTAACCAATCACAAACATCTTGGTACTAG
+TGCCATTATGTTTGAAAATTATTATCGTTTCGTGGCCAAGTTGTACATTCAGTATATTTGTTAG
+>gnl|ti|1361533834
+CTTAAAGCAGTAGTTCATCATCAGATTTACAGGTAAAAACGTAAAATTATAAAATACCTTTTATGCTATG
+CTGTTCAAACGTTGTGTCTATTTGTACCCAAACGTGTTGGCTTTTAGGTCCATGTGCGATGTGCTACACG
+TCCATCACTTAAAATAATATGGCCAATGGTAAAAGCAGTTTTACTGCTCCAAACAATGGTGACAGACACA
+TGAATTCAAAAATTCAAAAATTAAAATAAATACACATCATTGTAAAATTAATACATCCATAAGAATCTAA
+AATATGCATTTGTGAATGATATTTTAATATCTCAATAAGGGAAAGCATGTGGTAATCCGCATAGCCGCCG
+CCGTCGGGACACGAGACAGTGGTCAATGACGACCGCGACGCAGAAAACGGTTCATTCTGCATGAGACCCT
+GGTACCGTAAACGCGGTTATCGTCCATCCGCGGTCACTTGTGTTGGCGCAATGAACGGCGATCGCGTCGG
+GTGGTAAAGCGTCAAAGGGTCCGCCAAGTCAAGATCGTGGATCAACAAAAACCGCGTTTACGGTATCAGG
+TTCTCATGCAAAAGGAACCGTATTTGTATTATTCTTAGAAACGAAATATTTACAAATTTAACGCTGATAT
+GTAACGTCAAGAATAAAAATAACTATACTCGCTTTAAAACTGAAATTATACAAAAAGTCTATGAGATTCC
+CTAGGTAATAATCTTAACCTCCAAATTTTATGAAAGGTAACTCACTCCTTTTTTTAAGTATCGTAGTTAA
+ACGTATCTGCTGAGGTAAATTTGTATGTTACCCCCTGTAAGACGAAACAGCAAAAATTGTCTGGTAACTT
+TACTATTAACACCTAAGCTTTCTTAACATAA
+>gnl|ti|1361533835
+ACTCCGCAGTAGTTCATCAGTAGGTTTTCTTACGAGTTCTACAACAGATTTGCCAATTATGCTCTGCTCT
+GAGATGGAAAGACGAACGCGAAAGCTTATGGCGTTCTAATGGTAAAGTACAATTAAATGACACGATGATA
+CCACCAAAACCATTAAATTCCCCCCCCCCCTTAGGTAATGGAACCCAAAACGAACGGAATTCACACGCAA
+TATTTGGTATTACAATATTGGCCTAATTGCCATCGATGCTTGTCCTTACAACTTCGGTTATAATCCTTCC
+GGGAATCCATTAAGGTATTATGCCCACTTTTAAAGTGCAGACACGTAATCGTTCTGATGACCGTACTTTT
+TCCCAGACTTGTTTTATTGCCGACGCTGATACACAGTCCGTATCTAGACGATGTAACATAAATTCTAGAG
+AGCCTCTTGACAGCGTATTAATGAAATCGATACGTCAAGACATGTGACACACTCAAAACAGACATGTTCA
+GTTTTTGTCGAACAGCTACTGAAAGCGTTCCTTCTAATGTTCCATACTATAGAGGGCTAATGTCACGCTA
+ACGAATTCCGATTGGTGAACATCGCGATCGTTACATGCTCCGTCTACGAGGACGTATACTCCACGACCCT
+GTCCACACCGTTCTATGGTAGTCGGTTGACCTGCTGAACGTTGTATTGCCGATCAACATTGTCTTTTTTG
+GCGGCGACTGAGCCTAGCCATATGAAGACCTATGGATGCGTAACCGAACTTAGATATTTGATATGGCTAC
+GATACCTATTATGGATACGAGATATCGAGAGTAGTATATGACTACATACGTCGATATTTTACGGTACGCT
+CCGTCCACACTCCACTGGACTGAATTATTCATCTACGTACATCGCTGCACTGTCGTTCGAAGCTTACTAG
+CATATCATCAGAACGTCCATGACTTCGTCACTACGAATTCTTAGCTGA
+>gnl|ti|1361533836
+AATAAGCAGTAGTTCATCACTCATCCGGGAGCCAGGATATTGTTGTCCATTGTGGCGAGCAGACGCGCGG
+TAGAGATCACGGAAGAGCCACCAACGAGCCAGTCTACCACAGCCATTACGTGAGTTTCATGTCGGATTCC
+CACCCATTATATGTTATCCCGTTAAACTATTTTAAATGTACACTCTTTGAGTTAAAAAAGTCTTATATAA
+AAGAAAATACTGTAAATTCAACAAACAATATTGTAAAATTTAAAGTTGACGAAAATAAATGAATTATTCA
+ATTATACACACAACACGACTATCGTCTGTTTTCGTTACATGATCACAATTTGATGAATTCAACAAAAAAC
+TGGACGCGGCTTTACTGGAAATGAATCACCTACGAACAGAAAATAATAAATTAAAAATTGAAAATACTAG
+ATTAGCGAACGATATACTAGATATAAAACAAAAACTTGATACATTTGAACAAGCTAACATGGGTATCGGT
+ATTGAAATAACGGGCATACCAAAAATGGAAAATGAAAACTGTATTAATACAGTTAAACAAATTGCTGAAA
+AACTAAATATTTCTATAACTGTAACAGAAGCTTCAAGATTAAACTCAACTAATAACAAACCGTCAATAAT
+AATTGCAAAACTAGAAACTTCGGAAATGAGAAAAACCTAATAAAAATAAATAAACTACAGAAACTAATGC
+AAACATGCTATCAGAAAATTGGAATAAAGAAAATAAAATCTACATCAATGAACGTTTGACGAAAGAAAAA
+CGTATACTTCACTCAAAAACAAGGCTGCTGGTAAAGAACGCAACTACAAATTTATATGGATTTCAAATGC
+AGATTATCTTAATAAGAAAGGATGAAAACTCTAAAATAACTCGATAAGATCAATCACGACATTGAACGCA
+TGTAACTACTAACTTCAAGCACGTAAGTCTAATACCTCTTCCAACTTTCCATTTTTACCTATGTTAATAT
+AA
+>gnl|ti|1361533837
+AATAAGCAGTAGTTCATCAAATTCTGATTTATGAATTTTTAATTATACTCACTGACCATTTACTTAAATT
+CTTGAATTTTTTAGGAGTACATAAGGAGTGTTCTGCGGTTATTCAATCTTCTGTTTTTCAAACGAGAAGC
+TCCTTTTTGAATGTAATTTATTTACCATATAATTTTTCTGAAAATGTTGACTATCAAAATTCAAATTTAA
+ACAAGTATAGTTATATAGTTTTTGAGTTATTTAACTTTGTGTACCTACTAGATATGGTAGATAGGATATG
+GTCCACGATAATGGGTTTGAAAGATATGGGAGCTATGGTGATTTAAAAATCTTGGTGATTATTAATAATT
+TATCAACATTATCAATTTGTAAACATTTTAAAAAAAAGTCTTTGAGTATATTTAACAATTTCTAATACCA
+GAACTTGAATAATTTCATTATTAAAAGAAAGATGGGAATGAACATGCTTGGTGAATTACCCTGTATATAA
+ATAATTATAATTGTTTAGATTTTAGAACAATATTGAGTTTAGACACACAGTCAGATCACTATTATTATAG
+ATACCTACTTGCTATATTACTATAACTAAATAATAATTTGCATATTAATTCCATCGAGACGTTTATTGAT
+CCACGCAAATAAAAAATAAATTTTATTCTCATGGAAAATACATATGCATAAATATATAACATTTTTATTT
+TCTGCTATTATCAAACATTGAACAAAAATATTAATATGGGTTATTAAAATTGGCAAGAGTGACATTTTAT
+CGAAAATTTAATTGTATTCAATTTAGTGTGTACATTAAACATCCCACAGGGATTGGATACGATAAATAAT
+TTATTATGTACATAAACTGGCATCACTATAAACATGTGGTATCCGTGGATTAGCTATGTAGCTATAGGTA
+CGTTATAGAAATTATTTAATGCAGA
+>gnl|ti|1361533838
+ACTTACCGCAGTAGTTCATCACACCTTGCGAGTTGCAAGAATATGTATTAATGTTTTCTTTTACGACCAT
+CCTTTAAATTGTGTTGCGACATAATATTATTATTATTTAATGCGTTATGAGTACGTCGTCAAATTATTGA
+CATGTTTTAGTACCTATCCTATTCCATTACATTTTTAGTTTTTTGCCTAATAAAACGCATTTTTCAAACA
+AAAATGGATAGAAATTATTAATCTCGTCCTAATAAAATATTTTAAAACCGGCCGAGACTCTATCGTCATC
+CGGCACAGGATATGGTGACTTGCGGAGTGACATTAAATCCGAATGTTAACCACAAGAAAATATAACAAAT
+TTTATTGTTTTCAACGGTGCTGGTGGTCGGCAGTAATTAGTTAATTATTCAGCTTTAAAGAACTACCCAT
+CCGGTTAGGTACGTCTGTGTCATCGGGCAAAGGGAAACACCTTATGGCTTATACAGAAAATGCACTGCGG
+GCGATTTGAAATATTCCACAGTCACTGCATAGATTGTGCAACATGCAACTATTATGCAACTATCGACTAT
+TACAATAAGTATCATGTATCATTAGTTATTCTTTTTCTGTGACGTGTATATTAGTAAATTTTTTATACAT
+AAGTAGCTATTATTTTATGTCCTCCATCTTTTTAGCTATACTATATTATATATTTTATATGCATACAACT
+TGTACTCTACCATGTTTCAATCTTTTGATCGGGTGGTTGAATTTAGTATTTTACATTATCATCAAATTAT
+CAGTATTACGGGGATGTCTCTTCTATGATCATACGAAGTACCACTATTTCTCGGTCGATTCCTCGGACTT
+ATACTTTTATTAGTACGAGCTGGCTCGTGATGATTAATTGACGTTTATTCAATCGACTATCTGTAATAGT
+TATCTCATGAAACGACTGCTCGTCCGATAGTGATCAACACGATGGACATGTCATTCGTACATCAATTATT
+GTATCTCAAACTGATACTGAACACTGCAGTGGTGAA
+>gnl|ti|1361533839
+TCTAAGCAGTAGTTCATCACGGGGAGGTGCACACATTTATTTTTGGTCGAACATAATTGTACAAAATCCA
+ATTACATAATACTGAATAATTTTGATATCAAACATGGAAGTGCTGGTGTAGTAACGACGTTTCGACAATT
+TGATCATTTTGATTTAAGATAGATAGGATAATAAATTGTTGTATACGCGCATTGATTAAAACGCCGTTTG
+TACAATAAAACATTTTCTAAACGAGGGAAGATAAGACACGAGCATAAATACATAAAAAAAAATGTGTATT
+GAATCCTTTTTGCATTATATATATATAATATATATACAATGGGGATGATATAACGATTTGGTTTGTTTCC
+GCGATGACTATATTATTATAATATGTGAGCTTGGGATGGCTGAACGCGCGGGCGGCGTGCGCGTTTTATA
+CTTACTCGACGCGACGTGGCGTAAAAAGCTTGCGTGAAAATGATACTGCACAAGACTTCGGGTACGAAAG
+GGTTGTAAATTATAGGGGTGTGGGTATATCTCATGATTTTGTCATTAAGACGCGCGTCGGATTACGTTCG
+CGTTGATATTGATTTATCACTTTTGCTGTCCAGAACCGACGGATTTCCACACAGAGTAAATTCGTAACCC
+AAATGCTGTATGGGGAGAAAGGGTTAGGCTACGACTTCATTCGATTTGCATAAAAAGAACGCGTCTCCTG
+CTCCCGCGGCACACCAGCGGTATTAATATAATTAATCGTTCGTCGGCGACTGCTCCGAGATAAATATGCC
+AAGTCGACTATACGATGCTGCATTGGGGTTATATGATATTATTGTAGTTTTTTTTTCGTTGGATCGATAC
+GTCGGCGGCGTGCGATTGAACATTCGATACCATTCAGCCTAGTTTTGTTAAATTCGGTATATGTAGGTAT
+ATACACCGGCCTCGTGAACCGGATGACTGCATATAAAATTAAGTACTCCTCACGTGGATGCAATGGATTC
+A
+>gnl|ti|1361533840
+GTGAAGCAGTAGTTCATCAAGGGTACGGCCGCGGCGGGCGATGCTTCTCTCCCCCTTATTTCGTGCGGTA
+TAGATTTTTGTTTTTTTCGCGCAAACAATAAACGATAATGCGCCATCGTTACGTATTGTTTGACTAATTA
+AAAACAAACCCTGGCTCGAATATCTCGGGGGTATTAAAAGAGCGAACACTGCTCCCCGCCATTTTTTATG
+ATAGTCGTTACTCGTGTGCATATATATATATATATATATATATAATATTAAATATTCCTTTTTCATCCGT
+TCTCCTAAAGACAATAAACGTATAATAATACAATATGTCCCGCCGATACGGTAGGTATATATTATTATAT
+AGTGTTTGGTGTGTGCGGGGGTTCTCCTTTATTTAACGCTCCGCTGCGTTTCGCAATCGGCTCCGCAAAC
+ATTTAGAATATCAGACCACAACTATAATTATATATATAGGTACGTATATAGTGTATACATAATAATATAT
+AGGTAACTTATATACTATGGTTATCCTGAACACTATACTATGGGTTACGCCGTGTGTCATCATTGTACAA
+ATTCGGTATTTTCTTTGTTTGTTTACCGATGTTTTTTTTTTAATTCAAGATATTGTGTGAAAGTATGATA
+AAATATAATTTGAAGTACACAAATTACTTATATAAATATAAAACAAACATTAGTATACTAGCTGGTAGGT
+AGGTGTATCGTGTTTCATCAGCATTTATCTGTCAGACCAGCTTTTAGACTTTTAAGTCCTGCCGCAGATC
+GACTATTTAAACTTTATTAAATGTTCTTTATTACAAAATTGGAAATGAAAAGCGGGCCTGCATAAAAATG
+CTAGCACGATTCGCAGTTCGATCCTGACGTACAACCGTTTAACCGTCCTATACGATTTAGATATTATAAT
+ATTATGAACGTAGCAGTTGCACCCTGCTCGCCTAACCAGTTTATAAATTTGAAGGTAAAAGT
+>gnl|ti|1361533841
+ACGAGCAGTAGTTCTCATCATATTTAGGATACATATTATAATGATATATTATTTGAATATTATACCCTAG
+GGCAGTTACACAGTTTTTTATTATATAGTTTGCAATTACCAAAAAAAATTACAAGTGGGTAGGACACTTT
+TGTTGGATACATGAACTTTCAAAATGTCTGTATCCTGTCAGCCACTGTTTATGTCTTAAGTAAATATAAT
+AAATTTCAGGAGGGCTAACATTTTATACATCAATGTGAGAAAAGGGCTTGGTTACCACATAACCAAAATA
+ACTTTATATTTATTTATTTTTTCCGCCAATGCCTCAGTAAGAACTAAAAGGGCCTCTAAAATTGTTTTGA
+ACCGGGGCCTCAAAATTGTAATTGCGGCACTGAGTATATTTCTATATTCTACATTATCTAGGGAACTAGT
+CAGATGTTTTCTGTAATACTGTTTTATTTTTAGATATAAACTGAAATTTATTCCAAACATGAACTTATAT
+GATACTTATTGAGTTAATTGTAAAACATAAAAGAACGTGCTAGATACACGTAAACCGCATGGAAATTAAA
+TTATTGAAAAACAAATTACATAATATTTTGTGATAATTAGGTATACACAGGGACCGGATTAGTTATGCGA
+AATACCCGAGAAAATCTTATGGGCCCATACTGTGAGTGTAAGTGAAAATAAATTCATGTTTATAATACGA
+TTGACCACATATAAGCTATTAATATTGATAGACGTAGTTTTGGGACACTAAAGATGTAAATGGGCCCGCT
+TATAAACGTAAAATCTCGATGGACTTAACCATCCAGTCTTGTCTAGCACCGTACGTATTATTACGTTGAT
+TATCTATTAGCTATACTAGTATTATACTACTTAATAACAATGTGTTCTACTAACCTTTTGAATGACTAGT
+TAATCGGATTTCGAGTGTACATACTACGTACAGATTAGACTGACAATATAATGCAATATCTATTTTCCAG
+CCGA
+>gnl|ti|1361533842
+GAATGCAGTAGTTCATCAACGCCTTATGATACGATAAATAGTAAGGACTAAAGACAATAATAATTTATCA
+AATCGACATGTGGCGTTGGCTTTTTTCTTTCGCTCTAATGACGGGATATTTATATTACGCTAAAAATAAT
+AAAAAAATTAAACAAAAATAGTATAAATTTTTTTTTAAATTTTTAGAATAAGAAGCTAAAAAAAATGGAG
+AAATTTGCGAGATCAATTTCTGAAAGAAATAAAAAAAATACCAAAACGTGCATCTGGTAGTGGTCAGGAG
+TTTGCAGCACATTATAATAGAAGATGGTCATATTTCCAATTATTACTTTTTTTGAGAGACTCTGTACAAT
+CTAGAACTACAAGTGGTAATATTTCGGAGAGCGATAAATTAAATGACGATTTAATTCATAATGATGAGGT
+TGAGTTTGATACAGACGATCATAATATTTCAAATATTTGGGTTGATGAAAATATAAGTTCTTTAACTCCA
+AATCGTCCACCAAAAAAAAAAAACAAAAAATTGACACAAAATATTTATTTGAAAATGAACTATTAAAGTT
+GGAAGCTAAAAATACAGACGATACTAATATTTCAAGTATTTGCGTCAGTGAAAATATAAGCACTTTAACT
+CCAAATCGTCCACTAAAAACAAATCAAAAAATTGACACAAGATCTTCATTTGAAAATGAACTATTGAAGT
+TGGAAGCTAAACAAGTTGCTGCTATATTAGAACCACAGCCCCTGAGATGAAGATCTATTATTTTTTAAAT
+CATTGATTCCGTACACGAAACAGTTACATCCGATGCAAAATTACGATTTAGAGTACTACGATGCAGATAC
+ATTATGACGAGAATATCCTCAGCAGCGATTTTCTGATGATCGAATATGACGAATAATATACAAATCACAT
+CCTCATCTCGTACGTCTGAATCGAATCATCAGACATATATTATTTTAAATTATACAATAGAATGTACGGA
+CTTA
+>gnl|ti|1361533843
+GTCAGCAGTAGTTCATCACTCGTCGCCCATTAAAATACCTACTCCATATGTATTAATCTCTAAACGTCTA
+TATATAACATAATCAAAAAGGGATTATTATTCCGAAAGGGATCCATTATTCCGATGGCCACGCTTGGGTG
+TGTGCTGTAATTAATATCGGCATCATAGTGTAGTGCACAAAGGTTCAATTCGGTGGTTCGTCTGGATCGA
+GCACCCATTACTCGCATGGTCCCCAATCTTGCTTCTCGGTGCTCGTCTGTCTCGTGACTGACATTCACGG
+TTTGTCCTCACTCTGGTTTCTCTTTGCTCGTCTGTCCCGGATGAGCGGGCCCGGGACCGCCGTTCTCGGT
+CGGTACTCAACCTGGCTTCTCTTTGCTCGTCTGGCTCGGATAAGCGGGCCAGGGACTGACGTTCTCGGTT
+GGTCCTCAACCTGGCTTCTCTTTGCTCGTCTGTTTCCGCGGCTCGTGTTTCCCGCTTCTTGCGTGCTAGA
+ACTGCGGGACTATTTATCGATCGTTTGTTGTTGGGCATAATAAATTAACTAATAATAGTAGAAATTCTTA
+TAATAGTTGCAATTGAATTCGGTTATAAATATGAATCGTTGGGCACTATAATAAATAACAAACATTTTAA
+ACCATTGGCAACCAATAATTATTATTATTATAGCTTTGAAACCCACGGTAACTATTTAAAAACAAAAAGG
+TCCATAAGTTTCAAAATATTATATAATTGATTGCCGTACTATATCTGATCCTGTGCAATTCGTTGCCCAT
+TAAAGACCTATAATTATAAACAACACTCATGGTAACCTTGGTACCATAGTAACCATGGATCATGGTAACC
+TTATAGCCATGAAATCTTGGTAACCTTAGTAACCATGGCACTTGTAACATGATAACATGTAACTTATAGC
+ATGAAATCTTGGTAACCTTAGTACCATGGCAACCTTGGTTAACCATG
+>gnl|ti|1361533844
+AATTCATGCAGTAGTTCATCATTTTCTATACATTGTGTTTATTCCTATTTATAGTTTATACATATAGACA
+AAACAAATTAAATAATATGTTTATATATATTATGATTTTATTCGTATTACATATTATAACAATTCATAAT
+GAATATCAATAAATTTAAGTGTCAGAATTGAATGGTCGCTGATAAAATAAAAATTATTATTTTAATAACT
+ATCAAATTCAAAGACGAAAATATTATCTGAAACAGCTGCGATAATGCTGCATAAATGCATAATAATGTAA
+CATTGCAGTTTTATGCTTAAACATAAATATATACGTATAAGATCAGTCTGTTAGTCCAAACTAAAGTTAT
+AGTCACGAAAAAAAATCAACACTAGCTGGTAGCTGTGTGATTTATCATAAACAATGTTGACAGAAACCAA
+CTATCTATATCGTTAGAATTTCGAGCTCCTGCAAAGATTTAGATGAAACGAAAGATATCACCACTCCAGT
+TGAGACTTCCGTGTGAATTGTTAGGAATGTGGAAGGAAGCCAACGGATTTTATTCAAAAACGTCTTCACG
+CATAAAATATGAGTGTTTCTGATGGGCACATGTTAAATGAAATACTGCATTTCATGGTTTAATTCTGTAA
+AACATAATTTTTCTCATACTACTGCATTATGATTGTTAGTTGTTTGGATTCTGAACGGAGCGATGAATAT
+GAATTGATTTTACAATGATGTATGTTTTTTTTTGTGTTTGTTATTTGTATACACGATATTATTATAGTAG
+ACAAAAATACTTGGATTATAAACTATGAGTGGTGGTTTATGATAAAAAAAAATGTGAATCTAGTACGTAA
+ATTTAGATGTCTAAATAAAAATTCGCAGTAATTTTCAAGATATCGGACATTAGAGAAAACTATGAAAACT
+TGATGTTTATGTAAGCTAGTTTTTGAGAAAATCAATTTTTTTGGTGTAAATCAAAAAACAAATAAAATG
+>gnl|ti|1361533845
+AATTCTCAGTAGTTCATCAATTATATAATATTACAACACTATCGCAATGTTGATAAGTCTACAATAATAA
+TATTGTGTGCATAGGTTATATCGTGTGATATAATAATGTGGTACGCTCCTAATGCCCATTGTCGGTTTAG
+AGTGGCCGAACAATAAAAATAAAACCGACGAATTACACCCAACGACTTAACACGAAGAGTAATCTCGCGC
+GTCTCGTTCGGTTATATCATACGCGTCGGATAAACGTCGGATAAATATTTATGAATTATTCTCTGCACTC
+GAAAAAGAAAAGAACCATTAGACCGATTTTAATAAATAAAAGGACACCTCGTGATGCGAACCCGTGTTCG
+AACAATACGGTTAATGGTTTATCGCCGATCGGCAATCTTGTGGGTAATAATGAGCATCGCGTTTAACAAT
+TTTTTTTAATTCAATCCGTTTTTTGCGTCGTGAGTCGATTACGTTTTGTAGTTTATCACGAAAATATTAT
+GTGCCACTGGTCTAACATATTATTATATATTAGTCTTACATTGTGTGCGATGATATTATTACAGAAGAGA
+GTTCTTGTATTATACAGTGATATAAAATTGGCTTATACGAATATTTCTTTTTTTTTTTTCTTTTATCAAA
+GTCAAAGCCTCGATAACAGGACCATTATTTGCTTGTATTGCATACTTATATTACTTAAATTGAGGTATTG
+TTTATTATACAAGGTCATCGTATAACATTTTTTCTTACATGTTGATAGGTCTACATATTAATATTGTGTG
+CATAGGTTATCTTGTGTGGTATAATAATGTGAAAACTCCTAATGCCCATTGTCGGTCCTACGGTGACAAC
+ATAAAATAAACCCACGAATTACACCCATAGACTATGACTTGAGAGTATCTCGAGCGTCTCGTCTGATTAT
+ATCATACGCGTCGAATAACGTCGGATAGAGATATTTATTTTTATGAAATAGTCCATTC
+>gnl|ti|1361533846
+GTTACGCAGTAGTCTCACCATGGACAAATAATTTCACAGTTAACTTTTATTTTAATACTACATAATTTAT
+AAATTTTGAACTTTGAAATGCTGGTAATAAAAACTATATTTCATAACATTAATATAGGATTGTTTTTATT
+CTGTGGTTTTTAAGCAAATTGTACTTTATGAAATAAATACAAAGTAAGGGGTTATGATTTCATTGTGAAT
+AGTGTAAACAACTTCTTCACAATTCACAAGACATTAGGCGCCCCAAACGCCTGAAGGAATACAACTTTGT
+TTGAGTGATTTAGGCTAATGAAAAGGGTGATCTCGTTGGAAGTAAAACCCCGAACACCCAAACATGTTCA
+TGTATAATATATATTAAAGTAATTATTATTATTATATATAACTTATAAAATTATCATATTGTATTCATCC
+ATGGTTAATTTGTTGAAAGTGAATCTTGACGGACTAATGATTTTAGTATTAACATAAATGAATAACACGA
+CAATAGGATTATGTATAAGTATAATATATAATAACGTACAACTGGACAATTTAACGTGACTGTACACACA
+CACCGTATACGCACTGTACGACGGTGTCTGCGCAAGTGAGTATTACTACTTCAAAAGGCCCTATATATAT
+GCTAGAGCTCTGCACGGTCTGGTCTAGACCGGTCCGGACTGGACCGGACCGGACCACGGTCCGGTCTTTT
+TCGGTCTTTGTGTATGTAATTTAATGTGATTCGGTCCGGTTCGGTCCCTTTGTCTACAAAAAAAAATGGT
+CCGGTCGTTCGTCTTCAAATCATATTAGTCATATGTCGGTCTAAAGATCTGCATTTGACGTCGATAATAT
+AATTTCCATTATTTATTACGTAGTAATTAATAACATCTGCCTTAATTTGCACTTAACCTTTCAATCGTTG
+AAATAAACGGAACCGTCATTTCGGTCTTATTTTATTTTTTATCG
+>gnl|ti|1361533847
+TCTGATGCAGTAGTTCATCAGACCGTTTCTTCAGTATCTCCTAATATCGCTATATCATCCGCATAAGCCA
+ATTGATATTTATGTTCGAGTTTCCCAATACTATTCCATTGTTACAATTTGTTTCTCTGATTACCTTTTCT
+AATATTAGGTTGAACAATATTGGTGATAGCGCATCTCCTTGTCTTAGGCCTGTCCTAACCGTTGCTGGCT
+CTGACAATTCCGATGCTACCTTTATCTTGATTTCTGTGTTTTGCAGAGTAGCCTCAATTAATTTTATTAG
+TTTGTTTGGGAACTTAAACTCTTTAAATATGTTTATTAGACTATGTCGGTGGACAGAATCGTATGCTTTT
+TTGAAATCTACAAATAGTATACATATGCTTTTATTGAATTCCCATGATTTTTCTATGATCTGTCTTAAGC
+TGAAGATTTGATCTGTTGTTGATCTGTTGGGTCTAAAACCACCTTGATAATCTCCCAGCACCTCTTCCGC
+AATGGGTTTAATCCTATCTAAAATGCAATAGGAGAATATCTTGTAGACCACATTCAATAAGGCTATTCCT
+CTGTAATTATTACATATTTGTGGGTCACCTTTTTTATGGATTGGACATACGACTGCAACATTCCAACCTT
+GCGTAGTACTTCTTGCTCCCAGATGTGGGTAGTAACCTTATATATATATGTTAATGAATTTCGTTCAAGC
+ATTTTGCATGATCTCACCTTGTATACCGTCCTCCACAAGGTGATTATAGTCTTAATCGCCTTATTTGAAT
+CAACTTCTTCTTCGACGATTGTGCATCGTTAAGTGGGTTCCGTCTTGTCAGTAATGTTTCTACGGGTCGT
+GGCAGTAGAAAATGTTCGATACGTTCATCCTCCTACAATATTGATCCGGCAGAATAGTTTTCTTCGACTT
+TCGTACTTTTGGAACCTCCCTAATA
+>gnl|ti|1361533848
+AATCTCAGTAGTTCATCACAAAATATAATAGTATACCATTCATAAAAGTATCTACCTATAAATTAAACCT
+TTTAATAAAAAATGTTTCGGGGCTTGAGCCCCCCCTAAACATTTTTCCTATTTGCGCCACAATTAAAAAC
+CACACAATGTTCTAATAAGTTGCTGTGGGTTAATTATAAAAAAAAAAAAATACTTTGATACTTTAATAGC
+TTATAAGTTATAACTTATAATTAATGATGAAATCAAAAAAATAATTGAAATATTTATATGTATTTGTTAA
+CCTGATGATCCACAACTAAATTATAACAATCAAATTCATTATTAGAATATAATACTACACACATAATATG
+AAAAATTATTCGATTCAGCAGTAATTCTATGAATTAATAAAAATATGATATAAATATTATAAAGTACCTA
+ATAACTATTAATAAAATATAATAATTAATATTTTGTGTAATACCAACATCAAACATGCGTGGGATACAGT
+TTTTCTGTCTAACCTTTTATATAAAATGAGTCAATACAGAATATTTATTTGTAAATACAATGGTCTCTCA
+TTTGGTTTACAGGTCTCATCCCAGTTCAGTGATTTTCCCCATGAAAAATATACTGGTTCTTATAAATCTA
+CATTTATATATTATAATAATACAAATGTTTGCATAATGTTGTTTAGTAATAATTATCATACAAAGTATAT
+ATGTAGAATGTCATGTTTTAATAATAAAATAATGTTGCAAATGTTTTTCATAGCCATAATAATTATAAAA
+ATGATGCGTACTATTTTAACTTTGGTCACTGGAACATCATATGGATTATTTTCCAGCAGTTCGAATTACG
+ACGGACCGCTATCGACCACTGTTAAACTTTGGTCATGTGACATGATAAAGATTCTGGAATCGATCTTATT
+ATTCCTCTTACGTACAGTAACCAGGTCATGACCTAATGTCGTAATA
+>gnl|ti|1361533849
+ACTAAGCAGTAGTTCATCAGTTCATTATATAGTTATCCGTACGTAACAAGATACTTCAGAAATTGATCAA
+TGATATGCTTGGATTGCTGAATATTGATGATCATGTTTGCGCTATTATATATAGGTACCTGTTGAATTCA
+GAATTATACACTCTTTATGTATATTGTATATTCGTATGCACCTATAGATGTTTAAGTAACAATTCAAAAA
+GATTCGAAAAATTATTATAACTCATAACGTAAATAGTTAGCGAAATTAAAGGGGAAACAAAGAGCGTAAT
+ATTTTAGAGAACAATCACAAGTAGATATAATAAAACCCATTTATTTCATAAAAAAATTACTTTAACGTAC
+AATTTTTAAAAATGTTTTATTATATTTTATAATTTGATATACACATAAGGACAAAATGTTCTTAGTTATT
+TTCAAGCCTAAATAGTTATTGTATGTTTTCAATGCATTATATGTAATGCATTTAAAAGTAACTTATAACT
+TTAGAGTGCTTATAAAATAACAAACAAGTGACAACACATATTTTATCTAAATACAGAAAACAAGGATTGA
+TGTCTGATGATACCTAATGTCAACATGGTAACTGTAAGTATAATATTTCAATTCTTAATTTTAATAATAT
+ATTGTTGAAATATTTTTAATTCCTTATGCATTTAATTCAATTTAAGAAATTATTATAATAATTCTCATTT
+ATTTATTATACCAATTCATGTATAATTGTATTATACACTGGCGGTACACGTGGATAATTCTCAGTACTAT
+GTCTCAGCTCAATATTTCCCACCTTCCCAGGTTAATTAGGTCAATTTTAAAAGGGTTCCGAAAAATTCCA
+ATGTGATATAAAAAAAGACCGAATAAATATAATAATTCTCACTTAGGTATTGTAGGTACCCGCTAATAAA
+ATCTAACCATAAAAAGAGGGTTAAACGCCATCCAATAATACGAATTATGACAATTCAGATTATTTACTTT
+ACCTCCTGTATTCAGACAGGTGAAAGTACCG
+>gnl|ti|1361533850
+TGCCTGCCGCAGTAGTTCATCAATTAAGACACTATTAATATTATAAAAATACTGATGATGTTAAAGAATC
+TAATAATTAGTATAAAAATATACTTAAAAATATGATTAAAGACACTATCGAATATTATAAAAATACTGAT
+GATGTTAAAGAATTAAAATTGCATGAAGATGATCTTAAAATAATTAATGATAATATTAAATATTATAAAA
+ATACTGATGATGTTAAAAAATTAAAATTGTATGAAGATAAGCTTAAAAATGAATTAGAAAATAAAAATAA
+AAATATGAGAAAAGTTCGGGATCATGACCACTTAACTGGAGAATATAGAGGAGCAGCACATTCTATATGT
+AATCTTAATTACCAAAATCCTCGTTTTATTCCAATTGTTTTTCATAATCTTTCAGGTTATGATGCCCATC
+TATTTATAAAAGAATTTGGAAACGATAATGAAAGAATAAAATTGCTCGCAAATAATGAGGAAAAATATAT
+TTCTTTTTCAAAAATTATACCACGTGTAGTAACTAGGAATGGCAAAGACATAAAAATATCTACAGAATTA
+AGATTTATAGATTCATTCAAATTTTTACCCAGTTCTTTAGACAAGTTAACAAATAATTTAAGAAATGATT
+CGAAATTAAATTTAAAAAATAAATTTAAAGAACTTAGTAAATATTTTCCTGAAGAACATTTAGATTTAGT
+TACTAGAAAGTAGCTTATCCCTATGAGTATATGGATTGTGAAGAAAATTTAATGAAACATGTTTACCTCC
+TATGAAAATTTTATTGTCTCTCATGATAAAATATAACTAAAGAGGATATGAAAACTCCGCGAAATTTGGA
+AGTGTTAATATACAAGATATGCGTGAATCACAAGTTAATAATACGATGATGTTTTATTGTACGATTTATA
+AGATTCTAGAGAATATTCTTTAAAAGATTATAAATTAAGATCCTTATGCTGGTAAT
+>gnl|ti|1361533851
+TGCCTAGCAGTAGTTCATCATTTTTTTTAGAAGTCAGAGACTTTCATCTTAGAGGGGAGGGATGTAGTCA
+AATCACCAAAAGCTATAATATTGTTTTAAATAAAATAATATAGAATAAATAAATTATACATACAGTATAA
+TTTATTTGTAGTAATGTAGGTATTAATACGGAATATAAAGTAAGCCTAAATAACAGGAAACGCAGGCCAA
+AGGCGAAAACAACAAGTTGTTATAGCTAGTCACACATTAATGAAATTCAGCAATATTAGGGATGTATTAA
+TACCCACAGCTATAATATGATATTACCCAATCGGAAATTCACAACAGGCGCAGTACTGAGTCAGTATCGA
+CTGATACTGGTGCGCTACTGGCAGCCAGTATTGGCCATGTACTGGCGTATGTCTGGGATGATAACGCTAT
+TCCAGTATTGGATTTTTAGTACTGAGCCAGTACTGGTATTTGGTTAAGGTGTAGTACTGACTTTAACTGG
+TACCAGTTTAATACTGGTATATATATATTAGGGTGGTTTAAAAAATCAAAGCTCATCAATATTTACCTCC
+TACCAGTATATATGTATATAAACTATCTACAAATGTATGTGCAGTACATCACTGTACCAGTAGAGTATAT
+GAGCTCATACACGGGAGAGATGGTATAAATTGCAACATACTTGCAAGATATCCTGAGGAGTTCCGCATCA
+CAAAAAAAAAAAAACATAACCACTAGTAATAATTACATGAACTTAGTAACTTTATTCATTATTTTTTAAA
+TAAAAATAATAACATTATTATTTAGTACTAATCAGAGTATATGTTCTCGGGATTCAGACTGCGTTTTTAT
+CAGTCTCTCCCTCTTCCACCATCTCTATCCTCGCGCAGAGATCAGCGCTAAGTGACTAGAATTTCTTTAT
+TGTCAACATTTGTAGTTGGTGGAAAGCCACTTCTAAATTCAG
+>gnl|ti|1361533852
+GTACTATGCAGTAGTTCATCAGCAGCTGAAAAATATCATGTGTGAACTACCCTTTAGCTAACGGGTCGCT
+ATAGTAAAAAATAAGCTATAAACACCCTCCAAGTCTCAAGCATTCTTTTGATATAGCTTTTATTGAAAAT
+GGTTCAGTAGTTTTTGAGTTTATTAACCTTCAACCAGCATCCATTTTTAGTTGTATAACTCGACTTCACC
+CTTGAAAAAATGGAATAATATAAAATAAGCGCTATATAGGTGTATTTTAGTTTTGGTGTACCACTACCTC
+AGTTCACGGGAAAATTTGAGTCTGTCTACCCCGATTTGTGATCTAATTCGGCCGAGATTGACAATTCACC
+CACGATCTGCCCGGGTAACAAATGACAACAAAATATACCCAGGCAGCATTTTTTTGTTTAATAATATTAT
+TATAACATTATAATAACGAATAATATTAGTATAACGTTATTATAATACTCTTATAATATTATCATTACAA
+AATGCTGTCTGGGTAGGTACTAATTTGTCCTATTAATATTATAATCTGTACATTTTAAATGATAGAAACA
+AACATTTTAAAGGTAAATGTCAAAATGTTATCTTTAATTTGCAATAAAAAAATTAAGGAAAACTTATCGA
+GATAACTCAACTCCCATCTCCTACCCTAACTCCAATCATCTCTCAAGTTAGACCAAGTAAGAGATATTTA
+CAACATTTCATTAAAATCTGTTAAGCTGTTTCTGAGATTAGCGTGATCGAACATGGTGATACGAGATTTA
+TACAATATATAAAATATATTCGACACTGATTCTCGTGACTTTTAGTGTACTTTTAAATTACAATCGGTAC
+AATACATTTATACGAGTTATTATTATAAATTATAATCTATAATCAAAAATATCAAAACAAACAAATTAAT
+GCATAATAATGGCAACGTTGGCGATTGGATGAACTACTGTACCATTCTGAATTAGGC
+>gnl|ti|1361533853
+TGCCTCTGCAGTAGTTCATCAAATAATGAAATAACACTTAATCTTAACCTTAACTAAATTAAATTAAATA
+CTATATGGAGTGTGCACAATAGAATTAATAAGCCTAAATATGTATCATAAAATTACAATTAAATATCATA
+TTATGTAAATATTTTTATATTAAATAATACTGTTATGTTTCTAATAATACTGCTTGACAACATAGCTATT
+CTTAAAATTAATCAAGTAAAATAATATTACATTTATATTTTAGACTCAATTTATTAATGGCAAATTATTA
+TCATGCAAACAAATGCAACATATTATTATTATTATTATATACATTGAGTTTAAATATTAAGTAATCTATA
+ATTATTGTAATGGGGAGAAAAAAAACAATTCACCACTAGCCATTTTGTATACACTATTAACAGGGAATGT
+ATAATATGTATTGTTATTGTATAATATTGCAATACAATAAAAAAAAAAATGTATTTTAAAAACACTAAAA
+TTAAATTGAAATGCGTAGACATTTATATAGATGAAATTATAACAGTCGTTATTATTAGGCAGTTCTTGAA
+ATGTGATATAACTAATTAAAAATGTTCTAGGAAGGATGTGTAATATGTACACAAATACAAAATAAGTAGT
+AACAATTTTTGATAAATCAATACGCATACAGTAAATTATTGAAGTAATAGATACCTAAGTATACATAGGT
+TGGAATGTACTAAGTATTATAATATATATTGTATAGGTATGTTGTAGATATCTATTTTAAAACTGATTAA
+ATTTAAAATACCTAACCATTAAGTAGAATCCATTACCAAATGATAGCTGTGTAAACTTATCACTATCATG
+AGTATTATTTGCATCACAGAGTTTGTAGTATATGATGACGGTGGTTATTAAATTGTTTCTTCTGTATTTC
+ATCGGAATTTTATCCAATATACATGGCATGGCTCGGGCTGCTGACCACATGATCCACGCTTTTTGTCGAT
+C
+>gnl|ti|1361533854
+TGTCTAGCGCAGTAGTTCATCATATGCATCTACGGTGCTCCTTTACTATAACATTGACATCTCACAAGTC
+ACTATTACTGCCTACGTATATATATTAAATTATAGTCTATACTATAAATATGGCGTAACACAGTTGTCAG
+TTCCAAACACAAATTTGAACATAAAATTAATAATTTAATATTATATATTAGCATATCATACGACGAATCG
+TCATTTATTCTCTTAAAATACATTTTTATTATAATTAAAATGTATAGGTGTATACATTATTAGGAGTTCT
+TAAATCATCTATATAGTTTGATAGCTAATGATTTTATTTAAGTTCTAGATACCTACCTACTGAATAATTG
+CAAATATGACACAAAAATAATTTTTTGTGGATATAAAAATAGGTACAACAATTTTAAATAATAATGCGGA
+TGCTCCAAAATATTTAAATATTTTTTTGCATCCGATAATTTTGTTTCTTGTATTTCGCAATAGACTAGAG
+TGTATTCAAATTCTAAGTAATACCAAGTCATATATACTATATAGGCATGGACATATATAGGGTCCTCAAA
+TTCATAGGGCTTGAGCCCAAAAGGTTTCAAGAACAAAAAGAGTGGGAGACTTATATTCCACCCACTACTT
+ACACACAATTGTATTTGATCTATATAATACAATTCAAACTATCACAAATTAAATGTAAATTAATGTATTT
+AAGTATATTTAATGTAATTAATTAATGTCTAGTCCAAGATATGTATTTTTAATAAATATTTTTGTACAAA
+ATGTATATTGTCACATTTCTTTCTATTATATAATACAAATATGTCCAGTCGATAAACGAAAATATGCTTC
+AGTCGAAAATTCCCATCAGCTGATTGCATAATCTTTATACTCGTCTAAACAATGGTAAAGTCGACAAGAA
+ATCCTTGCCGCTCAGTTTTCAAGGTCAAGGGCTGGAAT
+>gnl|ti|1361533855
+ATATGCAGTAGTTCATCAGCCGAGTATAACCGAATTATCAATTGTATATTATGGCGTGCCGATAGTCTGT
+CTGCAGGAATCAATTGCGGCCAACTCTAAACTCAGTTAAGTTCAGCAATCAAGTCGGGGTGGCTCACCTT
+TATGCTGGAAACTAATGACTGTTGCAAGTTGATTGGGTTGATTCTGTACACGTCGATGATAACCACCGAG
+TTGTCGATGACCACGTCCAACCGTCTCTTATACACCCACAAGATTGCTTTGGTGATCCGATAATGTTGAG
+TTTGCTCGGAAAACGTGAAGTAGAGTGGATACTGATCCTGTAGAATCTGCACCGTGGGATCTGTGTCGGT
+ATTTATGATCATTATTATTTTCATTTCACCATATGTTACACCATATTAATCTTGCGTTTATTCCATTAAT
+ACTTATTATTAAGAGTGGAATTTTGTTGCTGTTTTTATCATTATTAATCATGACTACCTAACAGCAGTCT
+TCGGGGGACGAGATTATCATCAATCCCAGACCCAGTGCCAAAGTCCCTCTCGCGTCATCATCACGTGCAT
+TGATAGTTTATATTATACAACGACTGCGGGCCTAAAATATTTCTTCAAAATTTGACTCACTATTTTTGAT
+TCCACTAAGATACAAAAACCTACCTATGTTTGTATGGTAGACATGCAGAATAATATTGATTATTCAGAAA
+TTATTTTAGCAGTGATATTTATAGAATCTGCTTTATAAAATTACCATAGATACGTTGCAGAACTATTTTT
+TTTTATAGAAAATATTAAGTTTAGTAGTCATACTATTCACAACATAAAGTATTCAGAATATGTACGTAGT
+ACTATTTTCATGACTTTAGATTTACGAAGATGACATCTGTGGAAGTTATTATACGTATGCGTATTTTTTA
+TTTATGCGTATTAATCGAGCAGTGGTGTCGTTTTGCCGTACGT
+>gnl|ti|1361533856
+AACCAAGCAGTAGTTCATCAGTTCAGTGTTTTTGCTCATTTCTGATTATTGTCGTTCGTCGTGTGTCTTA
+GTAGACACTTCTACTTCGTGCGTTTTTCCTGGACTTTCATCTCGGTGCCGTCCTCGCTGGTGCGTGTTTT
+CCTGCTCTGGTTCGACCTACATTTGAAGTTTTTCTGGATTTCACTGTGGAGTACCGTGACTCGTGAGTAC
+AGCCTGCACTTGCTTATCTCCACTAATACCGTTTAGCGATTATCGCTACTAACTTCATACTAGTAGGTGT
+GTATGTTTGGTTGCCTACAAGGGCCCCTATCGTAAATACTGCACTTCGCCTGTTCGGTCTGTTGCTTCAC
+CATCTTCTGTCTCTTAAGCTGCCTACCCTTCAACCCGTCTCCTGACATATTGTTATTTTTTGCTTCACAA
+TGAGTAACCGCACTAGTACTAAGATCGCTGATAACTCCAATGCGTCATCTTCCCGTCCAAATACACGCCT
+TCAAGCCTCCAAGCCTACTTCTTTCGCCGTCTCGAGCCCTACCAAATCTACTAATGCTGACATAATGTGC
+GCGCTTACTGATTTTCGCGCTGAGTTCTTATCCACTAGTAAGGGCCCAATCAGATGCTTCTTCGTCCCAA
+TTTAGGGAATTGAAAGGCGAACTTGGGCGGCTGGTATCTCAAATTGCTGCTCTGAAGTCAGAAAACTCTC
+TATTACGGAACGAGGTTGATATTCTTAAACGAAAAATCGCTACTATTGAATCATCTGGAACCATCATCTT
+CACCCTCCGAGTTCATCCCTCAGTATTGCAGAAACTCTTGATCGGAAAAATGTGGTTTCACGTATTGCTT
+ATGGAGTACGGATTCATCTTTCTACTCACCACCTCTGAGCGTAGTCTCTGATGACATGCGTCTATTTTTC
+ACTGTGTTTGCGTCTTTGGATCTACCTCCCTCCTTACTTCTAAATGTATCAAGCTGTGAC
+>gnl|ti|1361533857
+AAAAGCAGTAGTTCATCATTCTGCGTGCTGGGACCGTGTTCGTGTGGTTCCTGGTGCCGGAGACCAATTA
+ACAAGACGCTGCAGGAGATCCAAAACGAGCTCAGTGGCAAGAAGAAGTCGAACAACCGGAAGGACAACCC
+GAAGGGCAGCAAGAAGCATCACATGATGGATTCGCTGACCGGCGACCAGACGCACGCCGCGATCGTCTGA
+ACACAAATCAAAAATAAAATGCACAACACCGTCGCGCACTCGCACACGCACACACGTGGTATAACTTCGT
+TATATACGGCATGAGTGACATGAATAATAATGTACAATAAAATTGTGTGAGTGGGTGTGTGGTGCGTGTG
+CGGGTGTGCGATAGAGTTTGACGAACTGGGTGGGCGGGGTTTTGAGGAAAACGATATTTTTTACAATTTT
+TTAACCCCACACATTTTTTTTTATTTTTATCAAAAAACTGTTTGAATATCAAATACACTGAGAAAAAAAA
+ACGTTTTCTTGTTTTAAAAATGCATTTGTGATTTATTAATTTTTTTTTTGTTTTTTGTTTTTATTTTCGA
+ATCAAGTGACTCGTTTTGCCAATATATTCTTCACATATTGAGGATATTATATACACTGTTATATATGTTT
+TCGAGTATTTATATACACACGCACATATATATATATATATATAGGTACCGACCTATGTATTTCATTTTTT
+TTATTTATCGTAACATTTACACTGTCTGTTGATATACATATATATATATTGCATTCCATTTTATTGTCAA
+CTCTCGAAAGGACGCAAGTACCCCATTAAAATATATACATAGTATATTATATTCACTCCAACGAGATTTT
+GGGATTTTTAATTTTTGTGACACTTTTACACGCAAATCATATATTTCATTTATTTTCTACGGTTGTATTT
+ATCCATAAATTGTTTTTCTTCTGAACGAACGCCAATTTGTTTATAATTTGGGCGATGCTTGGCTTAC
+>gnl|ti|1361533858
+AGCTCTCAGTAGTTCTCACGCGGCACAATATAATTATTATTTTGTTTTCGTACGCACTCTCCTTCTCCGC
+GGCTGCATACGTGCATTTACCGTCGTTTTCTACGCGGACACATAATATATTTATTTTAGCAAAACATCTC
+ATAGCCTCGTGTACTCAGACCCGTCGCGATTTCACGTCGACTCGCGTTATGTTACACACCGTTTTCGAAC
+CGTTTTCCGTGTACGCGGCAAATCGTTTTTCACTCGTGGGTCCTGATTGAACCGACCGTTAGTTATGCGC
+GGTATACAATAATAGGTAGGTATATACCATGATATTATTTTATTACCTGTAGTTATAATCGTTGCGACGC
+GCGACGGGACGTCTCGAGACATCCAAAACCACCGAAAAACAATTATATAATATATAAATCGTGCACCACG
+CGGGTACGCGGTCACGTCGTCTGTCGTGTCGTGTCCAAAAGCTACCGTGGGAATTTCCCGGTAGCTTCTG
+GTTATAGTGATAATGTGATGCCACGATTACGACAACCAATACGATAACTGGCACACGACACAACCGCGGA
+CGACGGAGTTGTGAACCCGGGTTCGCCGTGTATTTATATGAGCTACGAGGTTTCATTTGCATATTATTAT
+AATATATATATTGTATATATAGGTACACAAAATCATCATGGCACGCGTGGAATATTATTAAACCGTACAG
+AATTTAAACGAGTCGTGTCGGCGCCGAAGCAAAAATATATTATTTTTCATATCTCGTCACATTGATTTTA
+ACTCTAAATAATGTGTTATTTTGCTTATATTTTTTTGCATTCGTCGTACGTACATATTTATTAGATACTA
+CACCTGAATACTTCTATAAACATAATCGTCATTTATGTAGCTACTCGAGTATGTACGAGCTGCACAGTGA
+ATTCGATGTCGAACGAAACTATATTTATACAAATCGGAAAATATCTACCACGCG
+>gnl|ti|1361533859
+GGAATTAAGCAGTAGTTCATCACCCTAGCAGCTGTTCTACTCCACTCCATACTTATAAGCTTTAAATAAT
+TATATTCTAATTAATTACTCGTTTGAAATTAAATATTTTTACATCGAAATATTCAGATAAATATTGTGCT
+TTGGTAATATGAAATTAAAAATGCATTGTCCTTTAGAAATGTAAAAATTTCAAAAATGATATCAATGAAA
+AATGTTGTTTTGTAATGACTTAACATTATTAAAAAAAAATCATATTAAAATCGAAAATAATTTGGGGTAT
+GAAATTTTTCCAATTAATTCAGCTGGTATGTAGGTACTTGGGGGTATACGTATAATATTGGAGGACGCGC
+ACGGTGCACTTGAAATATAGATTATTAATTTTTGTTCGGATGGGTATAGTTTTATGCTGTTGATTTCGTA
+TATTTTTGACGTCAACGTCAGGATATACGAAGATACCATAAAGACATAAACGGTACAATAATTTCACTAT
+TTTAGTGTCATCATAATAATATGTTAATATATTACAATATTATTTATTATAGGCAGGTATAGCTATAATT
+GTTATTTTTTAGAAGGAGTATATAATATTATTATCTTGTGACCGAACGATATTTTGTCCCTTATGTCGAA
+AAATGAGACTTTTAAAGTTTAAAAACGGCGGCACACTTCTGAATAATTGGTATTTCAAGTATTTGTCCAG
+ACACTTATTTATATCGTACACAAATTGTAATTATATATAATATTATTATGTAGGTTAGGTACCCCTGTCG
+ACTTTGAGCAAGAAAAGTCAACAGAGCGGGCTGCGTTTTGCGTATCGATGCATCGAGCGAAATATAGACA
+ACAATTATAATTGTAGTTATATTAGCGGAAACACAACATACGTACTATATGCACTAAAATATGCATATTG
+CATAATATTATAATATCATTGTTATCATCTAATTGCCAACGACCATCCCGGGAC
+>gnl|ti|1361533860
+TGGGTTAAGCAGTAGTTCATCATGAAATAGATATAATAATATATTATATTTGAATTAAATTGTATTACAA
+CTTTGAATAATATACCTAGGTACTATTTAATTAAAAAAAAGCCAAAATTGCAAAAAGTTAGACTTAGATT
+TTAACTTGAACCGTATCATTTTGTGATTTAGTTTCATTATATATTTACACAATACAATTGTAGATATATT
+ATTTCCATTGTGTGGACGGACTGATTCATAAAGAAGAATATGGCCGCCAGATTTTTGTGTGATGAGTATG
+TTATAATGTTTAAGTGTCTACCCCTTTTTATTACTGTCCAAGTTTGGGACATTTTCGAAACTTTTTTGTA
+ATTCTTAAGAGAATTTCAAATTTACCATGTGGCAACGCTGGTCGGCGGCCATCGTCAAACAAGGACATTT
+AGTATATTAAAAAAGACATTCAAGTTTTCAAAATTGATAAATCTAGTTAATCGAATTTTTCAGGACCGTA
+GTCAGCTGCCTAGCGTAAGGATATATTAGTATCACAACAGAAGCCCTAACAATGTGTAAAAAATGGCTAA
+GTAAAAAAAAATATAAGATCTTTAAGCACTATAAAGATGTCATATCATGAATAAACGCTAAGTATATTGA
+ATTTAAGTAAACTTATTTTGTTTCAATAATTAATTTATTTGGTGAGGAATTATTTCTTAAAAGAAACAAA
+GTGTGACGAAAAAAATAATAAATGGCAAAGACTATTAAATATAACTTATTATTATTTTAAAATATTATTA
+TTAATATTTACATACTATTCTAAATATTCCTCACGAATAAATAAATAATTTAAACAAAATAGTTTAAAAT
+AGTAAATAGATATACTTAGCATTTATCCATGATATTGATAACCAGTTGTAAAACTGTAGATATTTTTTAT
+AAAGAATGGCCTTGACTTAACTATTGTTATTTTTTC
+>gnl|ti|1361533861
+CGCGAGCAGTAGTTCATCATGTTACTGCACGTAACAATCGAAAAAATCCACGGTGGTTATTATATCTCCT
+GTTAATAGAATATTTATTGTGGTTTCTTGGTAAACACGCAAACAAAAAGTACTTTTTTCAAATCGCAATG
+TTTCATTAATTCTTGTTTTCATACTCGCCAAATATGTCATTGTTTCCTCAACTATTTTTATCTACGAATA
+CCTAGATGATCATAATTTTTAAATTAAAACTGAAGCTATTACACTATATTCATGTGATTAATAGAAACAA
+ACTATCATCCATAATATAGTTATATTTTTAACAGTGTTCAACCACATTTTTCGAAACCTTAATAATGTAT
+TCAATTCATAAGTAAAAAATCAATATGCACTTTAAAATATTATTTATATAGGTATAAACTTTATGAAACA
+TAATTGTAACGCGTCATAATATATATATCGTATATAAGCTTTTTCAAACAAAAATGATTAAACAAATTTG
+TATTAAATTTAAATATTTTTCTGGTAATATAAGAGACCTGTCAAAAATAGTACTAAAACTGTAAGAGGTC
+GATGTTCGACTTTAAATAGTTTATATTATATTATAAAATATATTTTATGTATTTACTATTCTGTATGTTT
+ATTATGTGTTTTCTATTTTCAATGATGTTCATACTATTATTTACCTAGGTTTAATATTTCATTATATAGG
+ATAGGACATCGATGTATCTCGATTTTATATTGCCATATACCAGCGTAAAAAATATTTTATTATTGCTAAA
+ACATAATAATAATTTTTCTTATTTATTGTAAGGAAGTAAAAAAACACAAATGTTTTTACTCGTTGTAAAC
+TTCGAGCGAGCTTATGAGCTCAAAGAGGCGCGTTTTAAGTGAATGTGTGTGAGGTTCATACAATATGTAT
+AAGAAATAGCACCCTTCGAGAACAATTCGCAGTCGCGAATCGATATTTTAGATTGCGGTTTATACGTGGT
+TCAAAAAGCGAATGGC
+>gnl|ti|1361533862
+ACTAAAGCAGTAGTCATCATAGTACGACTTCACTTTTCGCATCTATAGACCCCATTGATCAAATACTCGC
+TCTCAAGTTTTCTCGACAGGCGGATAGTCAGTATATAGTACATCTACAATGTCTCCTATTGGAGAATCAT
+ACTATCTAGCCCAAAAACGTCTCATACATCTGGAATCTAGGCACTCAAAATCCACGGAATACAGACAGTA
+TTATAACGGGACTATGCAAGATTATTTAGATTTAAGCCACATGAGTTATGTAGACACCACTAAGGTAATT
+GATAATACATCATTTTACATACCACACCACAGTGTAGTGAAACCAGAAAGTATGACTACCAAGCTCCATG
+TTGTTTACGATGCGTCAGCCCGATCTTCAAATGGGAAATCGCTAAATGATTACTTATTTATGAGGCCCAA
+ACTCCAACAGGATCCACCAGGAATCATTTTACGGTTTCGTTGGCACGCAATGTGTTTAGGCCGATATCAA
+GCAGAAGTTCCGGCAGATTGTTGTCACTCCGAAACATAGACCATACCAACGCCTTCTTTTCCGATTCCAG
+CCCTAAGGACCGGTGCGAAATGTTCACTGTTACATTTGGCCAACGATCATCTCCCTTTCTTGCAATTAGA
+ACATTACATCAATCAGCTGAGATGAGGCAAAAGCCTAAAGTCCAAAAGGTCATACATCAAGACCTCTGCG
+TGACGACGTCGTTACCGAAGCCGACTCTGAGAGAGATCTTCAACTCCAGAGTAAACAGAGGTTATAAAAG
+TATTTGAGCATGGAAAGTTGAGCTCCAAAGTGGTCCAGCATGCACCCGCATTATTAGAGGCCGTTCTGCT
+TGACATCGTAAAACCGATAATTTACTTTGATGACCACAGGTCTGAATAACCTAGGTACTCGTCTAAATGC
+ACTACCGATTGTTATCTTACTATACGACAATCAGCGCATTTACAAACGAG
+>gnl|ti|1361533863
+AGGTCTATGCAGTAGTTCATCATACACATCTATTAGAGTGAATCTCTAGACACCTAATGTACAGGCGTAC
+AGCCAGATAGTAGCGCAGCATTACCCACTTTTGTGTTATTAATTTTTTGATCATTTTTATTTATATTTTT
+TTTTGTATAAAATATATTAAATTTGAATTATTGATAACACTATAAAAGCTTCTTGAACTCGCTGGAGTTT
+GTCTGCGTATTTACATCACATAGTCACATTTAGTAAACTACTTGTCACATATTCGTATACCACACGCCTA
+CGGCATTTCACCCATGTGCGTCCACCGATGATCCATCAATGTGCCACTTTTAGTATACATCTTGTCGCAG
+ATATCGCATGCGTACGGGTTTTCATCAGTATGGGTCGGCCAATGAACCGTTAATTGGCTACTTTG
+>gnl|ti|1361533864
+AGCTTAAGCAGTAGTTCATCACCAATTATACGATCAATATAACACGCGTCATAATAACGTCTGTACTCGG
+CGGATATACTATATATTATGATATATTATATATCTATTTCTATACTTATTACTACGCGAGCACCTATCTC
+AGAGTTAATCGATAATAGATTGGTAGAATATAATGTTACGTAAAATCGTAAACACAATAATATAATATCC
+TATTTTGTACGCTTTCTCGGCGTCAAAAACCTACGACTAGCGGTATGTAAAAGTACGAAGGCGTCTCGCT
+GAACACAATAGAAATAAATTTGTAGGAGATAAATACAATATATTATATTATGAATTATGATGTATAAAAG
+AAATATCTTTGCAAATTTAATACGACCGACAAATTTATTGGTCGTGTTAAAAAAAATTCAAACTCAAATT
+CAACTTTTTTTTTAATTCTACACGTCTATGCCGTCAACCTAGTACCAATAACTTTAAGCTAACCATTTTC
+GATGAATTAAATTACATTCCATAAGTAAATATACAGTACAACTAGTTGATGTATACTCGATACTCGTGTC
+CTGGAAAATGCTATTTATCTACATACTTAAGGGAAATTTAAGTACTCGCACCTTTACGAGCAAATCGAAG
+TCGTCTGCATTTTGACTATATAGTAACTAGTAAGAGACGTGTAAATTTACTCACTATTTACAGACCAGGC
+ATTTTTCGTACTATCGGATTTGCACATTTATCGATATCGATGCTGCCCATTTGATCGAACGTTTACTCGA
+TTAAACAAAAATATAAAATATGTAAATACCAAATTGAACGGCTATATTTATAGTCACTCTTCTCGCTCTT
+TATTAAATGCAATTATATGGCAATTCGTATACTACGTATTTGTGGTACTAACGTAGACAATACCTCCATT
+GACGATTTATTTTCTATTCAGTAATAATTTTTCTCAATGGAAGACAACCTTTCGGGAGTGGATGATTCGA
+ACTGGCAGAACCAGGCGTTACGGCA
+>gnl|ti|1361533865
+GTGCTGCAGTAGTTCATCACGGGGAACAGACGGGATCGACTGACCTAGAACACGACAGACTTAGATCTAA
+TCATACGCTTGCACAATATAAATTAAAATAATATGTATACCTACCTATCCTATTAATTCTTATCTTCATA
+AATAATTTTTATTAATAATTTTATCTAATAATATTCTAATGTACCACTTGTCCGTTTATTGAAAATGCAT
+TTTAAAACATATATATTAATATAAAAAAAATCATATTATTAGTTATTATAATATGTTAAGTCTATAGTTC
+TCGTACAAAGCGTCAATGGTCAAATGCTAAAATTATAAAAACATTTTTTCGCTGTTTGTATAATATACCA
+AAAGGCAAAAACTATACAATTGGGATTTTGTGCGCAGTGTATGCCAGATATAGACGTCGAGAGGTTTTAG
+ACTGTTCACGTTCAATACTACCTTACTATAAACGCGCAGCTTTAGCACACGAAAATATTATATTGTATAT
+AGTGTCGTGTTTATATTAATATAATCTTTATGTCGTCCGTTTAGCGTTATTATAAGTAGGTACCTACTCA
+TATAGTTAGATCCATGCACAAGTAATTTATTATTAAGTTTCCCGCAAACACGTCAAACAAGTTTTTTTTC
+TCTTTGACGAAGTCCAAGTTGCTCCGGCTTCGTTAATATCACGACGACGTTTGGGTATCTACTACCTAGA
+ATAAGACGTGTACACGTGTATTACTTTTAAGCTCGTAAGTATAGTGTATGTATTTGAGGCTTCCGAGTCC
+AGCACTCTTACAGTGGGATTAAAAAAGTTTTCCCGGGAAAGTCTCTGTTACAGATCCCATGATATAGGAT
+ACATATCGTTTGATGTTTGGAAGTAGATAGTATTTATTATTTATTTTTAGACATTTAGCGTTGACGTAAA
+CTATTATTCATATCATTGTTGTTGGTTTATTTTTGATATAACATTATTAGTGATTTATAAACCTCCAACT
+GTTAATAG
+>gnl|ti|1361533866
+TACTGAGCAGTAGTTCATCATAATATATACTATAGGTAGGTTTAATCATGAACAATAAATTGACAATTGC
+ATATAATAATAATATTTAATTGACATCCACTGCTATTTTTGCTTTAATAATATGCTTTATTGAGCAATGC
+TTTTAAATCGTTAGACATAGGCTCGATTGTATGGTTAACAATTAAATATTTCACATACCATGTAGTAGGT
+ACTTGGTATATATTTCAGTTTTTATGTGAGTCTTTATATAAATTTAGTGTAGCATACAAATACTGCTACA
+GATTCTAAATAGTACAATATTAATAAACAAAATAGAACTTTATGTATTGTGTATTTATGTATTATGTTAT
+GTCAGTTACACACATACCAATATACATACTATAACTATATAATACATAATATACTAATATTTTTTTTTAC
+TATCACGTAGGTACCTACACATTGCATTCTATTACCTTGATTTACACGTGCTCGAACATAAACTAACTAA
+ACAGTTAGGCATTTGTTCATTTGATTATTATTTTTGTTGAGGATCATGACTTATACCTAATACCTCAACA
+GAACACTTTTATTTTTACTTAACTATTTAATGTGTAACTGTTAATTACTACTTATGGACTGTGATTATGT
+ACCTATTTATTTTAACCCATTCATTGATTATGGCTCGACATAGAGTCAGACTTTAAACGTTAAACTTACG
+TGTTATGATTTTTAATGATTGCCTTAAACTAATATTTTGTTTTACTTTCACTCACAAACAAATGTTTGAT
+ATATGTGTACATGTCTCTCTACACAACACTATATTTCACTTATTCGTTTCCCGTTTGTCATTTGACTTAC
+TGTTTATTGTATACTGTGATCACTGCTTCAGACCATTCTTATGCTACGACTAACTTATTTTAAGCTGCGC
+TCCTATTGTTTTAATTAATATCTGGTTTGACAAATATGCTTACCATA
+>gnl|ti|1361533867
+AGCGAAGCAGTAGTTCATCATACCAAGAATCTCAAAATATAAAGACACAGTTTTTTTTTATAGTTATCTT
+TATGTTCAAATTTGGATGAATTACATAAATAAGAAAAACGATTTTAGTTATTTTCAGGTCGTAGAAGTTA
+TAACACGAGAGTTGAAGCAGCGGTGATTTCATTCAATTTGAACCAGTTTTTACGAAAAATACATAAGAAA
+ATGGCAAATAATAATAGTCCAGATTTGTTTGTTCACTTGTATATATGATAAATACATAATGTTTAGGCAG
+ACTTGGATAGTGTTCCGAATATTTAACTACTTTTTAGTTTTTACAAATATTTTAATACAGTATTTTTTGA
+ATAGGTACCTATTTTTTTAACGTTCAGTCAATTTTATAAACTATTTCATTATTATTCCGTATAAATTGCA
+TTTAGGTTTATTTGGAATACTTTTTTTTGAAGTATTCCAAATACTTAGGGAATCCGCAATACTATCATCA
+TAAAGTATTCGAATATATATTTTGAATATATTTTTTTTAATTATCCGAAATATGTATTGGACATACTTTT
+AAACAGTATCTTATCCAAGTCTGTGTGAGGGTGCCTACTACTTGTGCATTTTTCTTATATTATACTTTAT
+ACTAATCGTTAGATTACGAAAAAGATAGGCCGTTTCTACTCAGAGTTGTTTTTTTATTGTATATAATGAT
+TTATTGTTGAATTAAAATTTTGCTTTTTATCGCAGTGACATATTCTCAATGACAAATTACGAGATACAAT
+TGACACCTACTTTGCATCAGAGCATTTGCCTACTTGCCCACTTTTTTATTATATCATTTTATAGGGATGT
+TTGGAAAAAATGTATGAAAATATTGATAGGATTCGAAAAACACGAAAAATAAAAGACATTATTTCAGATG
+ATCGGAGGTACAAAAGTCGTGTTCGTATGGACCAGAATGCCGAATATGGTTAGCCTGAACTCCA
+>gnl|ti|1361533868
+CGGATAAGCAGTAGTTCATCATATGACATTATATCGTACATTAATTTCACAATAATATTGAGTTAAAAAA
+TCTATATGATAGACGAAAAGACAAACAAACAATTTTTTTTAATTTAAATATAATAATACCTATATACTGA
+ACTATATATTATTTTGGTAAATTTAAAATTTAAAATTTTGTGTCTTGTGCAATGTGCAGTTACATTTTTT
+CAATGGCATGGAATGTGTTTTAACTGTCAAAGATAGTTTTGGGTAGACCAAAAGAGTTACAAAAGTGCTT
+ACATTTATTAATTATGACGTCTTGAACATTGAGTGGCTTTTATACGAACATTTTTTTGTTAATTATTAAA
+ATAAATTAAAAACAATAATAAGTATTGGATAAAACAATTCAATTTTTTCCTAGTTTATTTTTTTTGGTAT
+AAAATAATTAAATACTTCTATTAAAAATTAACGTTGAGTTAAGTTCAATGAAAATTATTCTTGTAAAAAA
+ATTATAATAATAATGTCGATTCTATCAACCCAAAGTATTTTTTCAAAAACAAATGTATATAAAGGAAACA
+AAATAAAAATAAAAACTTTTATATTTATATATATAGTGATTAATTAAAGTTTAGAATAACTTTTATTTTT
+TGGTTTAATAATATAATTTTAACATGAAAATACTTTTAATACTAGTTTGTTTATAAATTCTAAAAACTAA
+TCAATCTAATATTTCTAATATGTGTGATTTATATAATTATTAACTTGCATATAACACTCGGGGGCGGATT
+GCCAGGGTTTTCTAGAAGTATAACTCTAACACATTGGGGCTGATTCGACGTGCAGTCTGTCATGTCTGCT
+GATATTTGACAATATTACTATACTATTAGTAGTCATGATTATAATTCTGGCATGACACATACTCGTAGTC
+TTTTTCTAATGACCGGATAAATAAAATTAAATGTCGTAATTCGAAAACC
+>gnl|ti|1361533869
+GATAATGCAGTAGTTCATCATCCCGGTGGGCCGCTGCTCGTATAAATATATATATATATTAATATTATCT
+ATCTATAGTAGAAATTATAAATTAAAATATTATCTAATAAGTAATTAGTATGTAATATTATTAAGGGGGC
+TGGAGCGTAATCCATTCTAAGGAGTAAAAACTAGGAATTTTATATTTCAGTTTATATGACGGGGTCTTGT
+GAATGTGTTGAAAGCAAATGAACATTAGTGTGTGTAATTCATAGTACCGATCACGTTGTATATAAGGACA
+TCATAGTGACCGGATATGTAAGTCTGTAATTTTACCTACGCGCATGTACAAGTCAAGATAATATGTTACT
+TTATAAAATTACATTAAATTTTTCTTTTTAAATACTGCCAGTGACTTTAATCACTACGCTCAGTAGGATG
+TTCCGATTTAAATGTTGAAAGCAGATTTTTTTGAAATTATGATTTTCCCGGGCTGTTTTCTTCTCCCAGT
+CCGCCACTGTTTATAGTTTGTTAAATATTCCAATGTATATGTAAATCACGTAAAAGCATGTATTAAGTCT
+TAAAACAAAATTTCAAATTCAGATTTTCTATCCAAAAATCCTGAAATATTCTGAAATGGAAAAAATTATC
+TTAAGATCGTGCAACAATGCAAAACATGCAAAATAAAAACCTCGTATTCATAGTAAATATATGAACGCGT
+ATGCAGTGTCGCATTTAGACATTTTGCGCCGCGATGCAAAAAAAAATTTGCGCCCCCTAAGCTCCGTGAA
+AAAAATTGCTCCCTCCTATGGGGCCTATCACGGAAAATATGGGAGATAGATCCTCATTACCTTTTAGATT
+TTGAGCACAGAAAAGAATATTTGTTTTACATGTGTGCTTTTTTAAAATATCGTTTAGTAGTATGCTGATC
+CTCTCTACGCAAAGATACATTTGATTTATGTCACCTAACCTTGGCTGAT
+>gnl|ti|1361533870
+GCTCTCAGTAGTTCTCAAGCACGTCTATTGCTTAAGTATCGCAAACGTTGTGCTAATTAAATTTCCGAAA
+ACAACGACGGGTACGCGTTGGTAAATCGCACAGGTACTGGAATTAATGCGCACGAGCATAATGTTATTTA
+ATATTATTCCGATTGCATGGTATTATGATATTATTATACTTTGTGCGTATTGACTATATTGTTATAACGT
+TACGATGAATACGACTGGAACAAGCCTGCAACAAACGAGGACAATTAATCAACGTCAATGTGTGAAATTC
+CGTTAAAACGTTTGTAAAAATATTACAATGCACGCGAGGTTTGAAAAATAAATAAAATAATTTAACACAA
+TTGTATAATTATGAGTACCACACGAAATCGTGTAAAATACACAATATTAAACCGCGTGTGCATTATTTAT
+GCGGTTATTTTTAAAATTTTTTTTTTTAAATATTAACAAGAGCCATTAGTCTAAAAAACCAAAGCCTCGG
+ACATCCTACGTAGATTTTATTTAATGGAGATTATATATTTGTGTATATAAAAGTTAAATATTAAAACACA
+GAATACAAAAGGTTGATGAAAATTAGATAAATCTATGACTACATATCTTTTTGAAGTTATTATCTGTTTG
+TGTATAACATATATATATATATATATACCTACTGCGTGATTCAGCAGACATACTCAACCCTATTATTTAG
+TTTAATGAATGAATCTATTTGAATTCTGATTTTGTGAGACTCTACATTTTTTCGACTATTCAAATACTTT
+CAGATACGTATAATTTGTTTAAAGCAGTTGAAGCAGTATTCTGGACAAGTACATAAGCTACTCTTTTTTT
+TCAAATCAGACCCTTCATCTCTTTAGTTTACTGAACAATCGCTAATGCAGAATAATAACTTTTAAAATTT
+TCGATGTACATGAAATCGAAATTCTAAGCGAGCAGAATTCCCGGAATCTAATTTTAACCTCTAAAGTTCG
+>gnl|ti|1361533871
+TGACAATGCAGTAGTTCATCATACGAGTTATTCATACAAATTAACCGTATAGTAACATAATATACACAAA
+CCTGTGAGATATCGTCTTTTCTAACCACGGCTATATTGTTCTCGCCGTCCATTCTAAACGGGTGTTTTCT
+TGTCTGATGTGATTCTATTTTTGAACGATCATAATGTATGTAATCACAGTACTGACAAATGTATAAATTA
+CTGCCATGAAAATCATAATGATGAGCCAATTCATGGAAAGTGTCGAACGTATAAATGAATGGCCTACAAT
+GTGGACATCTAGAAACGTATATATATATATTTAAAAATAAAACATATATTATGATGAAATATAAACAACG
+TTAATAAAGGAATATCGTGGTGCTGCAGTGCTGCTGCTTATAGCAACATATTTATACTTACATAAAATAC
+GAATACTTGGAATGATTTTTGGTTATATGCTGATGCAGATCTTCCAATTTCTCAAAAAAGTTATAACATC
+TGGGTAATGCACATTTAAAACGTTCTGGTTGTGGAACGAACTTGGGAATAGGATTTACCCGCTTGAACGG
+TGGAGGCTTATTAGTATTAATAGTTGATCCATCTATACTATTTTCAACTGTTTGGACCTGATAATATACA
+CGTTTAGAGAACAATCATTAGAAATAAATAGTTTTCAAGTGGAAGTACTACATTTTTATTTTGTTTTGCT
+TTAGATGAACTGCAGAGGGAATTACTCACAGGCTCGGACACAGTTGCCGCAGGCTTGAGTTTACTTATTA
+CAGTTTTAGATATGTGATTATTCCAGATCCGTCCATTTTTATGACTCTTCAGTGCGACACTAGATTAGAT
+CGCACTTTAGTGTGGTAATTGCACAGTAAACATCCTACCGTATTCGTGAGGATGGGTGCTAGCGGGATTT
+TTGTCAATATTGGCGAGGTGAAAAATACATGCATATTTGTAATGGCCCG
+>gnl|ti|1361533872
+CTACGCGTGTCTCAATCATTTGATATGTGTACCATCGACGTAGTCAGTGATAACGATGAAGGAGTCGACG
+TGAATCGAAGAGTGGGCGTATATAGTATATACTCATATATGAGTAATAAATAGATCGTAGGTAGTTACAG
+TTATTATACCTATGTAAGTATGTTAATAGCGCTGAATCTTTATAACTTCTATGGAAATAATAAAATGCAC
+GAGCAAATCATATCTTAATAGTTAGAAATTATTTGAATAACCTAATAACTGGAATGTTACTAGACACTTG
+GAAAAAATTAAATATTAATATAATAAGTATATATGCAGTCTGAACATACGGTGAACATTGAAAACAATTC
+CATTATCGAACATTTTGCTGAGGTTCTGAGGTCAATAT
+>gnl|ti|1361533873
+GTGAGCAGTAGTTCATCATCTGTTTTTCCGACAACACGACCCGCGCAGAGATAATACCAAAAGTTTACGA
+TTATACGGTTTGGATCCGGGGCACTATCGATATTACTGATATAAGTGAATAATAAAATATCATGGCTATC
+TGCCCTAGGTTTTTTAGTTGCGATTGGAAATCTTCGAGTCAAACATACCCGGTTACACATTCGCATACAA
+CATCGATAAAATCAATAGCTTAAATCAATTAACTCGGATAATAAGATTAACTTTGAAGTTAAGCTATCAG
+TATGTGTTGTTTATTTTCTACGAATATTCTTCAAATAACACTGTATCGCACTCGCGCGGGCGTATGAACA
+GTTTATCCCTTTGAACTTTACTCGGAAATTAAATTACGAAAATAAAAACCAAACAAATTGTATTACTCAC
+AAGACAACAAAAACGCGTAGTAATCTGAAACAAACGTGTAAAACATTTGCGTTTCCATAAAAAATACCAT
+TCACATTATTATTTCCATTGGGCTATATCGTTTGGGCAATTTAGCGAGTGGTCGACTTTTCATCCATCAT
+TTGTATTATATTATATAATCATGCGCGGGTACCTACTACACAGTTTTATTAAAATGTAGGTATAATTAAT
+AAAAATTAAATTCGTGTACATAATAATATTATATGCTCTCTAAATTATCAATTATTATTATGTTACCTAT
+GGGCTATGGCTCTGTAGAATATAACAGAATCGGGTGGACTACAATCTTAACTTCTTATTTTTATTTCGAG
+AGGGGTACACCACAAAATCTGCATAGGTTGTATAACGTAACTTAGATACTATTATAACTTTTGTGTCTTC
+GCAGGACTCACGAGTATTACATTTTCCAACGAGCTGTAGTAGAATGTAGATGGCAGTTTAATAGACATCG
+TCCTGTAATTAATAAAAAATAGACATCGTTCAATAAAGTAATTTAATTTTTTAACCGGTTTTCCTCCCCG
+CACGGAA
+>gnl|ti|1361533874
+AATCAGCAGTAGTTCATCACCAAGGATTCACAGGAACGGGGCGGGCGGACTGTAGAAACGGAGCGGCTGA
+CTTCTTTTTTTACGCCACGGTTTCACCATAGCCGGCGTTTTCCGTTCCATGGGTTAACCTAACCCTGAGT
+CAGCTGTTCTAATTCTTCATTTTATAGTATTAGATATGAACTAGATATTAATTATTAAAATTTTTGAGGT
+TACGTTGTTGAATGTTGGCATTAACGCGTCAACAAACACGTCAGCCTCACTTATTAAAACGAACTAGTTT
+TCAACATTTTAAAGTTATTTGTCTTTTTCATTATTACGGTTTCAAAAATTGAGTACCTTAATGGTAAGTG
+TAGTTTGTATTTTATTTGTTGTAAGGCACTAATTTCAGTGTAAAAGTTATGATTTACATGCTAACATGCT
+AATGTTAACAATATAGTATGTATTATTTTAGTACAGATTAATAAAAACAATTTTAAAAATAATTCGTCTT
+AATTTAACATTTACTTATCTTACTAAATAATGTGAATATATTACAGCTTACCCACTTAATACTTATCCTA
+ATAAAATGTGCTTAATTTCTGTATTATTCTCTATATAAAAACCACTTCATTATACATACTAAAAATGTAG
+TCTAGATTAAAATTAATAGTCTTATATTATAAATAACATACAACATTTTTTTTTGTAGTATAAATCATTT
+AATATTATAGCAAGATTGTTTAATATGATAAATTAAAAATAAGAAGTTATAACTTTTAATTTGTTATTTT
+TAGAATACCAATAAACCAGAACAACATTTTATTGGATTTATATGATGATGTATTGATAATTATTGATATA
+GGAAAAATTTAAGTTTTGTCATTGACATCTTTACACAGCTTTTTGTATTTACTTAAATGAAATATGTACC
+AACTTAAATTTTATCAGTTTTTTTTTGTTTATGACCACGTTCAGGTGGCTAGA
+>gnl|ti|1361533875
+AGACCAAGCAGTAGTTCATCACACGATTCAAGCCTAATATCAAATATACAGTTTATATTTCATGTACCAA
+TGAGAGCTAGTTATACTTGCTATGCTGAACAGCTTATTTTTAAGAACAAACTATATGAGAATTTCCCTGA
+GGATCAATTTCTAAAATTTTGCGTTAGCCGTTGGGCACCTGTAAAATATCCTAAATCATAGTAAAATCCA
+AATAAGACGTTGATAAAAAAAATAGTTGCGTGCACGCTAAACGCCATCACTGTGTAATTTATAATTTTAT
+TATTTATATCAGGCTAAGGAAAAAAATAAAAAAGATTAAATTAGGTATCTAAAATTTGCTAGCATGCTTA
+CACGCACATTGTTCGAAATAATGTTATATGACGTATTTGTCGTTATATTCATTTAAAAAAAAATGTTAAT
+GAAAATTCAAATATTAACACTTTTTTGCCTCATCAGAATTCATTATAACGATGATGATGTGTAGGCCTTA
+TCGAATCGATATAATTTTTCCCATTTTTTTTGATGAGTTCATGATATCCAATATCATATAATATATTGTA
+CAAAAAAATATAATATTTCATATATACATTTATACGACACATTACGTTTATATAGAATGGCCTTTTGTTC
+CTTCGCTCCTCGTTACGGTGGCCATCAGTTGCGTGTAGGTAAGTGTTTTTTTATATTATTTTTCCACGAA
+AATGTACTCTTATATAATAATAATAATATATATATTTCTTTATCGTATACATATAATATAACTCGTTTGC
+CACCAATTATGGCATTGAACAGCCCGTGCAGTACCCGCGACCTTTTTTTTGTACCATTATACTCGTATGT
+GTCGTAGATACCTATATATTAATACATATTACCTATATATATATATTGATAGGTACTTATAATAATAATA
+CCTAATATATAGGCACTTTTATATATAATATAATACGGATTCACGTTTTATTCCCCGAA
+>gnl|ti|1361533876
+GACCCTGCAGTAGTTCTCAAGACATATTTGTCACTTATAACAAATCTTCGAAAATTTGCGCAACACCATA
+TACACCATCAACAGAAAAAAGTCACAATTTCTGAAAAAACAAGTGATTTTTCTGGGACACATAATAAGTG
+AAAAAGGAATATCTATGGACCCAGATAAAATACAAACTGTAATGAATTTCCAGCCGCCCAAAACGAAAAA
+ACAGGTACAAGCATTCATTGGGTTCATCAATTTTTACAGAAAATTTATCACAGACCTGTCACAAGACACG
+GGACAACTCAGCAAGCTAACCAAAAAAGACGCAAAATGGACATGGGGTACCAGCCAACAGCAAGCGTTTG
+ACAACATAAAACGAAGATTTCTAGAGGACATAATAATTCAATTCCCAGATTTCAAGAGAGAGTTTCACCT
+GAACACCGATGCCTCAACGACACACCTCGGGGCGGAACTTTATCATATTACCGAAGATGGGCAACACCAG
+ACCCTCAGCTTTGCCAGTAGAACACTTAACGCAGCGGAGCAAAACTATAACACCACTGAACTGGAACTGC
+TCGCAATAGTTTTTGCATGTAAAGAATTTAGAAACTACTTGCTTCATACAGGACGAGATATTAATCCGAC
+CACCATGCACTTACATTCTTAAATACGTGTCAACTACTCAATGCTCGATTATCCAGATGGGTCTACATAT
+CCTCCAGGAATTTCAGCTGGAGATGACGCACCATACCAAGTAACGAAAATGTCGGTGCTGACACATTGAC
+TAGGTATCCGGCAAGTTCCCTAACAGTGACGCAACAACCAAGCACTAAGATATCGTTATTGACGGCTTAT
+CACTGTTGAGATACAGTAGTGTATTAATGACATGTCAAGATCCTGAATGATGCACAACTAGATGATCATG
+TCAAAATACTCCAAACAGGAGATTCGCCGCAAATAATCGAAT
+>gnl|ti|1361533877
+TGTCTCAGCAGTAGTTCATCATGCAGGGGTTGCGGGGTAGAAAACGACTCCTACCTACCTAAATACGCAC
+CCTGACGGTAGCAAGCGAATCATAATATTATTATACACGCGTCCTTCGTCCTTCGCCTGCCCCCCCCCCC
+CGCACACACACACATAATGCGAGATGGACAATGCTGTACGCATAATATACGCACGTTTTTCTTGATAATA
+ATTATCATTATATCCCGCTCCTTGGCCCGGTGTCCGGCCCTGCCGAGATGTCTGGGAGAGACGTACGAGG
+GGACTTCTATATAGGTCCAACGTGTAGGTACCTATATATTATATCATACAATAATATGTATACATAAAAC
+TGCGGCGCGCAGTCTTTGTGCAGCGCGTCCCCTCCTAAACACAATATCCAGTGAAGACAATCATGCGTGA
+AGTAACTGTAGGCGTTATGCATGGACGAAACGAGAATCTGTTTACTATATACCCAGGTATATCTGGTATA
+TAATATATATATATATGATATAATAATACACATAATATTATATACATAACACTGCGCTATATGCAGTGCG
+TTTCCGTTGGATGACTCGACTATGGAATGCTGCGCGAGTGTCTCGCGTGATTTCGATTAATCTTCAACGC
+GTTATATACCTACCACTTTATTCCCTCCTCCCTCGCGCGGACAGCCGTACAAGGTACACGTACGTATAAT
+AATATTCCCATCTCGCACACAACACATATATAGGTACACCCGCGCGCGTACATAATACGAGTATTTATGT
+TACTCGCTCGTATTTTTTATTATAATATAATGTATAACGCACACGCGTTTGAGATCAACAACACACACAC
+AACACACTATACAAACACTGCTGCACGTGTGCACGTACGCGGACATAATTTTTTTTACGAACTTTTTTTT
+TCTCACACCGCCGCCGGTTCCAGCGCTGT
+>gnl|ti|1361533878
+GAATAAAGCAGTAGTTCATCATCATTGAATTTAATCAATAATGTAAAACAAATAACAATATTAAACTATC
+CATATATACTTTATAGTCAATAGAACATCTTTGGGGTGTAAGGACCACAATCAGAAAAAGGGGCGTAAGT
+GATTTTTTTTTTTTTAATTGGCTTTAAATACACAAATATGTTATGATTATGAACAATTAATCATAACATA
+ATACCTAAAAACTCATTATAAATCATATTAAGTCTCAAATCGAAGTGTTATACGATGTTCTAAGGTTGTA
+ACACAGTTATTATGAAAATATCTGTTTTTCGGCTCTCCAGAACAGTTTGGATATTGGCGTGTACGCCCTT
+TTACCTCCTAAACATCGATAATATTATTTTTTAACACTAAACCTTATATAATCATTTTAGAACTACATAC
+TTCTATCCAGCATGGAGTCTCTTTAATGGTACTTCGTGGATAGTCAGGACCCCAGCCTTTTACAAAACTT
+AATCTTAATATGCACAATCTTGTTAAATCGTCTACTCCAATACCTGCTGTAGCACTCAATCCTTTAACAA
+AAGTTTAAAAATGTAATTATAAATTCTATGATAGGCTATAATATATTTAGTGAATAACAGAATCACATAC
+TTATAGCTGGAGCAACACCTCCCACACATTAGATCCTGCTAGTGTCCTGCAACTGCTGCTGCTTGTGCAG
+CAACTGCATTTTGAGCTGTTTAGCTTGTTGACACATTTGCTTGTGATGAACTACTGTACCATCTGATTAC
+GCGCATGATCATAGCTGTTTCCTGATGTGAAATTGTAATCCGCTCACAATTCCACACACATACGAGCGGA
+GCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATATGCGTGCGCTCACTGTCGCTT
+ACCAGTCCGGGAACCTGTTTGGCCAGCTGCT
+>gnl|ti|1361533879
+TGTATAAGCAGTAGTTCATCAGTCGATATCATAATAAAATATTATTCCGAGCGTGACGACAATAACGTCA
+TATAAGGCGGCGTGCGGATTGTAGTAATAATAATAATAATAATAATACACACGTACGATTGAAATATATT
+AAGTCTGCACGGTACACGGAACACGCGGATATAAATGTGCGGAAGTATGCGGAAATGCCTACATAATAAT
+AATATTAATATTATATAGAGCGTACAGGAAATTTTATTTAAAATCAAACTGCGTTGCCGCACACGGGCAT
+AATGTTATATAATATTATAAGCGCGACGTGCCGATGAAAATCGACGACGTATCGACGACGTAGCCGGGAA
+TTTTTTTTTCCTCTCCTAGAAAGGGTGAGGGGGGGCAGTAGGCTTAAAATTGTGTTATGGCCAGTTGAGA
+TTTTTGAGTTATTAATATGATAACGAGTATATTAATCCGCGGTTACTGCAATAGCCGTTATAATATTACA
+AGAGAAAACACGTTTTACTGTTCCTATTGATAATTCAAAATCTTAGTATATACGAGAAATTGATAAATAT
+ATCGTGTGATCAACTGACCATATAATGTATCGATTTACAACTACGACAAGCATTCATATACTGAGTATGA
+TATTAATATAATATCTATGCTATCACCGCCGCGTCTACAACTCTTGATCCATATGTGAAGACGAAGTGAC
+AGGACAGACGCTGCAGTTGGTATATCTCGATAAATTTATGTTTAATTGATATTTTGACGATTGATTTGAC
+ATTTTTGTGTTTTGATGTGGAGAATAACTCAGGCATACATAGTCAACTCCTCCCTGCATCCCCCATAAAA
+ACATGTTACTGACACTTGACATCTGAATTCCATCTCGTCGCCTCGTGCATAACTTCTTCTCACCCTTCCG
+GAGATTGTCCTATCCTTAAACATAATTCCTGATGTATCCATG
+>gnl|ti|1361533880
+GACTGAGCAGTAGTTCATCAGCACTCCAAATTTTCATCGTCGGCCAACGTCGACTGGTCCTTCGTCGAAC
+ATCCCTCCATATTCTCGTACAGAAACATTGTTTACGGAGAATTTTTCAGTTGTTTTTCTATAACAATATA
+TAATATCAATAAAATTGTATATGTTGGGTAAAATTGCGTCAATATTTAATACAAGGCTGATGAATGATGA
+TATATGTTTAAATTATCGGTTGAAAAATATTAATAATATGGCGACATTTTTTTCTATAAACATTTAATAT
+TTGAATTTAAAATTTTAAACAAATTTCTGTGGAGAAATATCAATTAGAATATGTTGTATAATACGTTGTG
+TTTAATATTATAAGATTATAACTAAGTAGATATATTATGTATGTATGAATGCAGTCAGTTTTTTTAACAT
+TCAAAAAATCACTTAAAATTAGCTTATTTCAACATTTTTACATCGAATTTTGATATTTTTACATCGGATT
+TTGAGTACTTTTTTGTATACAATTTATATACAAATACAATGATATTTCACATATTTTATATAAAATTTCA
+TACATTTTAGAAAACATTTGGAAACATTAAAGATATTTAGAAAAATACAGAATTTAGAAATATTCCAAGA
+AAATTATTTAAACAATTTATACATATTTTAAACATTACAATATTTAGACACAACAGCCAAGCAGCTTCCG
+CCATATATTTGCTTATCTTTATAGGAAATATAATATATATGACATTATTCCAATACGTTTTCATAGTAAA
+ATATATGACGTCAATCAGAATAATGAGCAGACCCATGTCCCTAAAGCAGAATACAGCCGATGAGATCCGA
+TTGTATGACACACCTATCACCCCAGAAACTACTAGAGATAATTTAGTTAATAAATACAGGCCACGCAGTG
+CAGTTTTTGTCATTCGCAGTATGCCTATAAACCGG
+>gnl|ti|1361533881
+GACTAAGCAGTAGTTCATCAAATCTTCATAAATTCATTATAAATATCCATTTTTTGAAGTTCTTCAGCTA
+TTTTTGTTCAGCGGTTAAATGTAAACTTTTGTCTTTTAGTTCTTCCATATTTTAGGTATTAATATTACCT
+AGGTACAATTAACCAATCGAGTATAATAGTTTACAATCATGATGAACTACTGTACCATCTGATTAGGCGC
+ATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGAAGC
+ATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTCACTGCCCG
+CTTTCCAGTCGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGGTTT
+GCGTATTGAGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTCGGCTGCGGCGAGCGT
+ATCAGCTCACTCAAGCAGTATACAGTATCACAGATCATGGATACGCAGAAGACATGTGAGCAATGCAGCA
+ACGCAGATCGTAAAGCGCGTGCTGCGTATCATAGCTCGCCCTGACGAGCATCACAGATCGACGCTCAGTC
+AGAGTGCGAGCCGACAGACTATAGATACAGCGTTCTCTGAGCTCTCGTGCGCTCTCTGTCGACTGCGCTA
+CGATACTGTCGCATTCTCGTCAGAGCGTGCGCTTCTCATAGCTCACGCTGTAGTATCTCAGTCGTGTAAG
+TCGTCGCTCAGCTGACTGTGTGCACGATCCCCGTCAGCCGACGCTGCGCTATCTGTACTATCGGTCTGAT
+CAATTGTAAGAACCGACTTATCGC
+>gnl|ti|1361533882
+CGAATTAAGCAGTAGTTCTCATGTAAGTGGATCTAGGCAAACTCGGAAGATCTGGATCCTCATCAATACC
+ATTGACAATTTTATTTAAAGTTGGGATTTCACCTCTAAACCAAAACCCATGAATTTTTTGACGAATTGCG
+GTTTTATCAAAATCGTCAATTTTATCATTGATTTTTGGGCGGTTTTTTGTTTTACATGGCGACTTCAAGT
+GTCCTGTATTTTTGTACTCACTTATTGTGTTTATCACTGTACGCTTTCCAATCCCAATTTCTTTTGAAAT
+AGATGTTATCATGTCTTTGTACTTCATGTCTGGTTGTTGATGTTTTTTCGACTTGTATAAATTAACAATA
+TTCTGTTTTTGCCCTCTTCCAACAAACTGAAACAATAATTATTACATTATTTAAATACTATAATACGGCG
+TTTAAATATAAAAATGATTTCGATTCGTTCATAATTTAGAATTTACAAATAAAGTAACACATATACAATA
+GTTGTAACAGATAGACCTGACCAAAAAAAAAAAATAAATAACTAAACCTAACGTAGGACAACAATTTTAA
+CATTATATGAGTATTAAAAAAAATAGTAAATAATTTAAAAAAAATACTCATGTCAGCAAATTTCCTAAAA
+TTTTATTTAAAAAAAAGTTTTTACGTTCCAAATGAATTTAATCAAAAAAAAAATTGATATTTTAAATATT
+TAATATTTTATATTTAACCCTTTATATAATATATATAAAAGATATTTTTACGAATAAAATATTAAGATAA
+ATTAATAAGACTATAAATTCAATAAATAAAAAAAAATTTAAAATTCTTACCTGTCCTTTTCGATTTTTTT
+TAATAGGTGAAAGATTTCTGCAACATCGATGCTTGTTTCAGCACATCTAGCAGAGGCATGTTTTGATTGA
+CATTCCTCCTTGAAAATTATTCCATTTTTAAGAAAAAAATTAAGCAGA
+>gnl|ti|1361533883
+GCTAAGCAGTAGTTCTCAAGACTGATAGTCATCTATGGTGAATTGTTACTTCCGACGAAATACGACTCGA
+GAAATCGTTTTCGGACGCGCATTTGACCCACACACACTCACACAGTTGTATTCACGTATAGATACCTACT
+ATAGTAATATACTCTCAGTTTTCCCGTCGATTCGTTAAACGATAAGTGCGCAGTATAATTAATACGCACC
+GCGCTCGTTTTAATCAGTTTTAATTAAATGCCGCAACTGTTTGTAGTAAATATTATGCCACGCTAATGAC
+CGATGGGAGGTAGAGGGGCCTCCCTAGACGTCTTCGTCCTCACCGCGCGTATAATAATTAGACGACAACC
+CTCTCGCGCCGCCGAGTAATTGAACCGGAAAACCCCATACAAAATTTTCGCATCAATCGAGGTCCACGGG
+TACATGTACCTATTGGGCAGTGGCAGGTAGAGGTGGGTACCTATATATAGCTGTGCAGGTTGGGCACATA
+TATGTATATGGGGGTATAGTCTCGGTGAATTGTCAACAAAGAAAATATATCAATCTTCAAATTAAATATA
+TTTTTGTTCACAATAGGTTTTTCTTCAGTAATGATATATTTTTTTTGAGACTTACTAGCCTGAGACTACA
+GATATACTTACATACAACATTTTTATGTTAAACCGTCATGGATCCATGTGATCCACCGGGCGTTATTGGC
+CATTGAAGTACCCTAATCCTTAGGGATCCGTATATCTGGGTACTTCATGGACAGTTGAGTAATTGACTGT
+TCACTGTGAGAGAAGTTCGACACCTCCACGTGGTTCTCTCTGGATGCGAATCTGCTGCAAGCTGGTTCGT
+ACGAATGTCGAACGGGGTTTTTTTAAATTTTAATAAATACAATTTTACTGGTATGAAAATTTTTAACTAC
+TAAAATTTTTGTACCCATTA
+>gnl|ti|1361533884
+AAGTTTGAGCAGTAGTTCATCAATATCTTACTATATTATAAGAGAATGTGAGACAGGACAGGATAAGTAA
+CGATATGATGATGTTGACTAATTAATCAATATTTATGTGAATAATTGAATAATATGTGCAGCTAGTAGGA
+CGTCTCCGTGTGTGGTGCAAAACATAGGAGACCAAAACATATGAATTTAACCTTTAACTTTATGAGTCTT
+AACTGAATTTTCAAAACACCATATTATATTAATAAACACATTCTGCTATAGAATACATAATTCAAGTTTC
+AAATCAAAATTATATTAACTTTTGAGTTATTCATAGTTTCTAAGTTCTGACACCATAGCTTCCCCCCTTC
+TTCTACTAAATAACTATTGATAAAAACTATAAGTTTATCTCTTAATTTTGTAAATGTTCAATTTTAATAA
+GCACTAATCTCTTAATCTATATTAAATAATAAATACTACACAATTATAATGATCCACAGGATGATTCACC
+ACTAACCTGATATGCTTACCCCCATTGATTCATTTATCAATAAATTATTTAAAATTCAAACTAGGAGTTT
+GCGCACAATCGTGGCTGGGTTTTCTACAAAACACACGTAATCGTTACCTATGAAAATTGTGTCCTTCGTA
+TCGCACTATCGCAATATCGCAAAAAATAATATAACTAGGTACCTATTATTGTTTTATAATTTGAACAAAT
+TGTCCAAGAATAACTGAGTAGGCACCGGAATAAAATGTATATTATTTTGTATTTTATTCAAGGATTAGCG
+ATAATTTAGTTACGTTAGATTTAAATGATTTAATAACTCATAGCTACTCGTTTGAATTTTAGATGGACGT
+ACACAGTTTCAGTATCGTCTGTTTGACCATATTTATAGTTACAACGATAAGTATTCATATCGAGGATAGG
+TTTGTCTTCGTTTCCATA
+>gnl|ti|1361533885
+CGAATCAGCAGTAGTTCATCATATACTTATTGATATTTATAGAAAAAAAAACTAAAAAAATTGAAAACCT
+GTAAAATGTCCGTAAACAGCTCAAAAAGAGTCAAAATATTTTCAAAATTGTATGGTGTATAGGAAATGCT
+AATATAAACATTCAGTAAAATCTGCAGTTATTCGTTTTTGAATTACAACAAAATAAGGAAATCGCTACAT
+GAGAAATCGAGTGAATATCCAATGTTGTAAAAATTTGAATTTCAAACGATCATAAAAATTTAATTTGACT
+TTCTTATAGATATTTTTTGTTTGATAAAGGTAGATAATCTTATAAGGAATCTTGTATTACATTTTCATAT
+CTTAGATTTAAAAAGAAAAATTTTTATGAATTTCTAACTCGAAATAATTTGCAAATTTTCGTGATTTTTC
+CATATTTTGTAATTTTTTGAACTTTAAATGCTTATAAAAAAAAACTTTGACTAACGATTTTTAATATTTT
+TCATCTGCCTTTGAAACAATATACTAGGAGCCTTCTATTAAATTTTCAAGCTTTTTTATCCAACAAATAA
+AATTTAATTGATATTTTTAGAAAAAAAACTAAAAAAAAATGGAAAATGAAAATGTCCGTAAAGAGCTCAA
+AATAAATCAAAATATTTTGAAAATGTTATGGTGTATAGAAAATGCCAAGATAAACATTCAGTCAAAATTT
+CATGTATCTACGGTCATTTTTTTTCAAAGTTACACCAAAAACCAAATTCAATTTTGAGAAAAACGATTTT
+GCGTAAAAATTCCCGTTTTTCCTTAATTTTTCTTTGTTTTCAGGCGCTTTTGAAAACTACTGGGAAATTT
+AAATTTGACTCCCCATGCACACGATATTCACTTTCTGATCGACAGATACTGAGTGAAAATCGTAG
+>gnl|ti|1361533886
+CAGGACCAGCAGTAGTTCATCAATATAGCTGTCCACTTGTTAACGAAGGACACCAGGAAGAACTTTGACC
+TCGGTAGACAATTTGGAGCGTAGGAGAAAAGTTTGATTCCCACCTGAACAGGCCAGTGGATTCGTTGGTC
+ACGTTATTGAACGAACATTCGTTTAGCTTAGACAATTTAGAACCGGTTGATTTCGAACATGAAAAAATCC
+ATTAACTCGTTGGCGTACGATTTTACTCGAGTCAACTGTAAATATCCTTTGAATATTCTGTTTTATTTTT
+TTATTGTATGTAATTTAAAAATTAAATCACTGTTTTTATTTCAAAAATTAAAAAAGAATAATAATAATTG
+ACTTGCGTGTGCTTCTATTTTTTCACGTAATCTGAACATATTTAATATTTTAAAACGAGTGTACAATATA
+TAGGTATACATTCTCGGTAAATAATTATATGTCTACTTAGTATACTTGCCTACTTCGTTTCTAACACACA
+GTGGCAATGTTTAAATTGTCAGTAAATCAACAAAACCAACAATTCATCGTATAGTAGGTATTGTGTGATT
+AGTTGATTTATGCGAGGTAAATGAATAACGACGTTTACGATTTCTGTAAAGAGGACCGGTACTCAAAATT
+AAAATAAACGACGTACCTATCATTATAGTAAACAATTCTGAAAAAATAATCTTTCATTAACATTTATTTA
+TATATAATATAAATTATAGTTGTAGTGTTGTACACATCAGTACACAAAGATTATTCGTTGTAATTTTCAT
+TTTTTTAGTATCTGTATCGGCAATAAAAAAATACTGAGTGTTATAAATGTTTTAATTAAAATTGTATTTA
+TTGCTAACGCCTACGCCCTAGATATATTACTTCGCCCGGATTAAAATAATCTATCTTTCTATCGTTTTCG
+TTTTGTTTCAGCTA
+>gnl|ti|1361533887
+GAAGGGCCACGACATAGCAGTGTTCTCATCATCACTTTGATATTAGAACAGTCTTAAACAAATTAGGTAT
+GTCTGTATTCATTTATATAAATTTGGTTGAAAATATAATCAAACGTTATTAGTTTTTTTTCTTAACTTTA
+CTATGATTGAACATTATATTCCAATTATTTGAAAGACATTAGGTTGTATAATATTATATAATATATTATT
+ATAATGCACGCGTGTTGTGTGTAAAAAGTATTTATTATAAAAACTTCTTTCTGAAACCATCAAGGTGTTA
+TTCCTGCCCCTATAAGCTTGAGTGTCATACAGTCGTACAACAGGCAACATATAGAAACAAAAGAGGAAGA
+AACGAGCAAAAATAAGAACAATCCGAAATGATATTGGGGGATTTGGTGTCGAATATATTGAACGCATACG
+GTGAATTGTTCGACACTAACCGTTAGGAATTGAAGCACTATAACGACGGTGGCAATTTCAGTTTCTTGCG
+ATTTCGGTAGTATATACACAACTATATTATATAAATATATATATATGTATATATATATTGGGGTGTGTGT
+ATCGATAGGATTAAGGATTCTCCTCCGTCGTGTGGTAAAACATCAGAGACTCCACTCGTAAAAGACGTCA
+CGGTGAACCGGGGGGTATAATCCAGTGCGTGTCGAAAACAGTACTCTGAAAAGCGATCGGCAACCGCGTT
+GTAAGGGTGGTGGAACGGGATTATGGAGTGATAACCATGAAAAAGTGAAATAAAACGAACCGATAAATGT
+ATATATATAATATATATATATATATTCAACGGTTAGCGTGCGAAATTAGACACGTGATGTGTTTCGTCTG
+GCGCGCTGCACAAGCGATATCGTCTAAGTTCGACAAGTGGAATATTATAATAATATAAATACCTAGTAAT
+TT
+>gnl|ti|1361533888
+CGAATCGAGCAGTAGTTCATCATTATTTATGCGACACAAGGCTTCCGGAACTTTTTTGAAGTTTTTCCGC
+TCGTCCGAGTTTTCGGCGTGAAGAGAAACTTTACTCTTGGACGCCAAAACCACCACCACCATCACCCATT
+GTAATCCCCACTTGAAAAAAAGGGATGACTTGGACCGTGAAAATTTAAGAGGGTGTTTCGAGGAATTTAG
+CATTACGACATGCGAAATCAAAATGCATGCCCGTACTTTTATTAATATCATGATTTTTTAATGCCCGTAT
+AAGTATAATATGATAAACTTAAAACCTGTATATACATTATATAATAGTGCTAGTGCAGATGCGTATTCGA
+CTATTCAGTCTATTATTATAGGTAGTCATCGAAAGTATTTATTTGAAAACAATTTAACAATAAACAATGT
+TATTCTGTGTACGTGCAATAACTTGTAAATTGATGAACTACTGTACCATCTGATTAGGCGCATGGTCATA
+GCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGAAGCATAAAGTGT
+AAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTCACTGCCCGCTTTCCAGT
+CGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGGTTTGCGTATTGG
+GCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGAGCGGTATCAGCT
+CACTCAAAGGCGGTAATACGGTTATCCACAGAATCACGGGATAACGCAGGAAGAACATGTGAGCAAAAGG
+CCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGGCGTTTTTCCATAGGCTCCCGCCCCCCCT
+GACGAAGCAT
+>gnl|ti|1361533889
+GAATCAGCAGTAGTTCATCAGTTTTGTCTCTCTGGCCCACGTACAACATAGGCAATACGCATTTACGCAC
+GATATAATTTTTTTTATGTTTTTGAGTAATTTTTGAGTAAAATCACTTACCTATTACCAAAATTATAGAG
+AATAATATTTTTGAGGGTAAGACGTATCGATTTGTCTAAATATTGTTTTACATCAATTTAATATTGCAAA
+ATGTTTCTAAAATGCTCGTCTTGTCACAAATTTGTTTTATGTACATTTGAATGAGAATAAGAAAGTTTAT
+TTTGCATTTTTTGAGTTTTTGGAGGTCTATCTAGCTTTGTGTACAACTTTTTTTTTAGATTTATACTAAA
+ACTATGTATTTACAGTTTACACTTGTAATAGATTTTTATAATGCATTTTTTTAAACTTTTTATTGTAATT
+TATACTAAAATTAATAAAAATAAAAAAATTTTAGATCATAAAAGCATTTTTTTAGGACATTTTTCGGGGT
+TTTTTAGGGCATTAAAATCCCAGCCCTAGTAATAATTATAATAAAAATCTTAATTATTAGAATTAGAGTT
+ATTCGAATATAATATATGAAAATATTTACTTTTTATTTGTTTCCAATACGTTGTTTTTAATGTTCAATAA
+ATTATTATTTTTTTAGTTTGTTGGTTCTCGGCAGAAATTGATGATCGTCAACCTGTACAAGGCTAAAATG
+GCTCAGCAAGACAATGCAGACGGCCCAAAATTAAAAGCGAAAGAGATTATTAAGCAAATATCAGAAGAAA
+TTGGTATAGGGCAAAGGACAGTGAGTGTTACTCTATCAGATACAGAAATAAAGGCAGTGTATCATCCTCT
+AACAAAACCAAAATCCGACCAACTGTTACGGAAAAAGTTGATGATTTTGACCAAAATGCAATTAGGCAAA
+AAGTTCACGGAGTTTTGGCACAA
+>gnl|ti|1361533890
+AGACTCAGCAGTAGTTCATCATAGATTCGATTATTCATTTTTGTTATTCACCATTGATACAGTGGCGTCA
+TATATAGAGATAGGGGGGGGGCAGTTTGGGCATTCCCCCCTTGTCATTTTCTGGCCGCTAATGGGTTAAT
+TTTGGGCCTCCATATAGTAGCTAATAGCCAATAAACAGTATATTTAAGTATCCCTCTATATATGTATTAA
+TTATTTAGTAATTGTTATCTCCCGAAAAAACGTGTTACTTATGCCTATGATACTAATCTTTGATACTAAC
+TAGTAAGTATAAAATTATATGTAAAAAGGCTATTTGTATTGAGATAAAAATACAAATGTAATGTAATTGT
+TAGCGATCGGTTTTTTTTCAGTTTTATTTTTGGCTGGTCAAAAATGTTGACCCCCTCTCAAAAAATGAAA
+TGACGCCACTGCATTGATAAACAAATCAATTCTGTTTTCATAGTAATTTCTCATTACTTATAAGTTTATA
+AATCATAGGTATTTTCTCACATGTTAATACCTACTTTAATAGGCAATAGCGTGCAACTGTTGAAATCGGT
+CGTTTGTGTTTCGTGCAGTAGGTATAGTGAAAACTGCTTTTCATACACTCAAGATTATTATTACACGTTT
+AAAATTATGGTATCATAACCCTATAGTAAAAGTTATTGAACAATTTTGTCCACGTCTTGACACTGGATAT
+TGATTTTTTTTAAAAGTTATTATTTCTTAATAATAATAATAAAAAAGGCAGGTAAGTGGATGTCGCTCTG
+CTGTACAGTAGGTTACAAGGTAAGGTCAATTGTATAATGGGTTGTATTAGACTTGAATTCCAATGATAAA
+ATATCATTGTAATAAGAAAAAACGATTCTGAGCGGAGAACGCTTTGTCAGTCTGGATATTTTTATATTGT
+ATTATTTTAATTTTTATCATGTAAGTGAACTAATATTTATAAATATTATAATTTTTTTTAATTCGTTTTC
+CTATTGGGTGAATAATACCAAG
+>gnl|ti|1361533891
+GTTACCGCAGTAGTTCTCATGATAAGCCAAAGTTACTTTTTATGTAAGCTAAATCATTTTGTATAGTCCT
+TTTTTCAAATAAAGCTATAGCATTCTTTATGGATTTTGCAGTATTTTCGTCTAAAGACAAAAGCACCGAT
+TTTATGGAATTGAAATTATCAGCATAATATGATGTGGCTTCTAGCCAAGTTCCCCATCGGGTAAGTATTG
+GCTGTGGAGGTAAAGGTAATTCTGGAAATAATTCTCGAAATTTCAACACACGACTCGGAGCTTTTAAAAA
+TACTTTTTTCACACAACTTATCATATTATCGATATTTGGATACTCAAGTCTTATTGTTTCACACACTCTG
+TGTAAACCATGGGCTACACATGTCACATGTATCATATTTGGAAATAATACAGTCAATGTATTAGCCGTTT
+TCACCATGTATGGTGCAGCGTCAGTTAAAAATAAAAAAACTTTATTATATTTAATGTCGTTAGGCCAAAG
+TATATTTAAAGCATCGTGAAATAATTTCCCTACTGTTTGATAATTGCACTTTGAAAGTTCCTCGCAAGTC
+AATAAATACGACTTAGAACATTTATCTTCATGCATAAGACCAACTACAACATTAGCTACGTACCTTCCTT
+CAACGTCTGTAGTTTCATCAATTGAAACATAAATGGGGTCTTCACCAATTTCTTTACGAATACGGTCAAT
+TACTTCATTATAAAGAACTGATACACATTTTTTTCGTATTGTAGATTGATCAGGATATGTTTACCAGTAT
+ACTTTTTGCAAAAATGTATTAAAAGTTGTATTGTGCAATTTCCATAAAGGGATATCAGAGCTAAAATGCA
+CGACATAAATCGAGCGAAATTCTGAGTCTGATCTTCAATGAGTCTTTAATAAATATTTGCTTCATTTTTT
+TCTTTTTCTTGCTGATTACTGGAGGTGTTTTTGGCTGTACCTTAATTGCCTGA
+>gnl|ti|1361533892
+GCTAAGCAGTAGTTCTCATGGTAAGAATTTAATTTATCTTACATTATAACTTATAGATTAGTACCTGTAC
+GAAAATATCTACAATCTACATTCTAAATTGTATACAGTTCCAAAATAATAACAACCCGGTTGTCTATTTG
+ACATCTTGAACTATAAAATCAAATTATATTAAAAAAAACTAACCAAATGGAATATAACTTTTCTTTCAAA
+TTATTTTAGTATAATATGTAAAACATAATATTCAATCTGAATTGGGCTATTAATCAATATGATAATTGTA
+CGCGCCCCACAATAGGGACTACCCGAAGGACCACTCGGTGACAACCGAGACGAGATTTCGTACGTTGATG
+GTGGCCAATATCACCACTAAACGACGAATATTTTTGGGTAGGCAACCAAATGTGCTCTCGCCTGATATTG
+TGGTGGGTAGGCAACTAAATTTAAACGGCGACGACAACGACGAGGGCGGGAGAGACCTGAATGATGGTGC
+AAGCTAGTTATGGGTGATGAATCTCTGTGGTTGAGTCAGTGCAATGATCACAGAGCTCACAGACACAGTG
+ACAATACTTAGACGCATACTACAACCACGTTCCCAGGCTTGATGGCGAGATATACTACCACCATGACTCA
+AAGACTTACGTTTGCATGATTGAGATCGTAGTGTTAGTGAAATAGTTCAAGTATGGTAGTGACGCACAGT
+ATATAATATTATTGATGTTACGACTGGTCGATTTTCGAACCGAACCGAACCGAACTCGGGGTGACCGGTC
+GGTTCGTAATCGAACTCAAATGCTGATAGTCGAACCGACTAATACCTTATTACTCCGGTTCGACATCGAT
+GCTGACTCAGAAGATTGAAAACAGGCCACGATCGGACGATCCAATTATTATGTACTATGATATTTATAGT
+ATTATTCAAAATCTATTGCTGGTCTAAGGCAGGCTAGCGA
+>gnl|ti|1361533893
+ATTCCTGCAGTAGTTCATCAGATTAAATTATTACTATTCAAACTATCGTTGTCGTTTTCACTACTACTAA
+TATTTTTTTTTCGTCAGTAATATATGACTGTTTGTGATACATAATTATTATTTTTAATTTGACATTGTTC
+ATATTGATCATTTAATTCTAATTGTCGACTTCTAGACACCTTCTTATTCCTTTCTATAGCTTGCAAATGA
+GATGCTACAAATCGATCATCAGTGAGTGGTTTACCTTTAAATTGTCTTTTAATTTCGGCAATAGACCCTT
+CGGCTGGTGCTGAACTTGCTGTCTTAAATACGCTGTTGTAATTTGGCAACATGACGTTACTCCATAACGG
+AAAATCTTTTGCGATTCTAAAAACATTTCTTCGAAGTTCTGGTACATAATATGCATTAAGCCTATCACCA
+TCTATCACACTATTTTTGTCAATTTGATTAGATAAGTTTTTTAAAAATACTGACAGCCTATCATTGGATT
+CATTTCCAGTATAATTGTTTTCGTTAATGTCATTACAATTATCGATGTATTCTTGTGTCATTTCGTCTGT
+TTCATTGTAAAGTATATTATTATATTTTATTAGACAAACCAAATCATAGCGAAATATTTCTGCGGGTGTT
+TTTATATTAGAATTTAATATCATACCAACAGTTTCTGAACAAGCCACTACTAAGGCTTCACAAAAATAGT
+TTCAAAAATTGTCAGTGATTTACATTAAGCTAAAAGTAATGAAGCTCGAACGAAAAATTATTTTAATTTG
+TTACGAAACATTTCCATCTACATATCATTTTTGTGACATGCGAACTATCTAAGCCTGATCACAGACATTA
+GTAATGCGAGCTGGTCATTTATTATTTATATAAACTGCATTACAATAAGTTGTTTTGTCATATCAATTTC
+CAATGACGTATGACTAACCCCTATGATTGCCATAGAATAATCAGTACTTATTTTCAT
+>gnl|ti|1361533894
+ACGAGCAGTAGTTCATCATATTTCATTGGATTATCTCAATATATTCATAAACAAATAATTTACTTTACAA
+ATCTGTATAACTAAAAACATATTTAACAATAACTTGTAAGTTATAAGAATATTGTTTCAAATTTAGACAC
+AATATAAAAATATACAGTTAGTCCGCTATACAAAATAGATTATACCTAATTATGTTTATTAAATTATTTT
+AACTTGGTCTATAATTTAATGAAACTGTGGTGTAATATTAATTTGATGTACAACCTTAATTTTAAATAAA
+GTAAGACTATCAATAATGATAGCGTTTAAGCTATACCAAAATAGATTCTATATGGCGAAGTAGGGACCCA
+TTCGGCCTACAATTATGATAAATAAATCAGCAATATGCTATTACTACCTTCACTTTTAGAACTTAATTTT
+TTACTTTTGGTTAATCACTATAATAAATAAGTTGTTTGGAGTGACAACACTGATGTAGTGTCCAACTAAA
+TAATAATATTATTCATGAAGACTTCGGGACCCTTAGATCATATTATACATGGCTCTATCCGTTTTATATG
+ATCTAAGAAGTGACCAAACTCCGCTTCTGACGTAGACCTTAAACCACGGTCCACGATTTAAGATATATCT
+ATATTCATAGACAGAACATATTATTATAGTAGTTACCCATGTTGAAGATATGCTGCATCCCACGAAGCAC
+ACGGCACATGCGCACTAGCGACACACGATAAAATCTATATCATAGTATTTGTACACATATTTGTACGATC
+TATGATAGCGAAGCCAGTGCGTGACGAAAACTTTATTAAGCACGTCAGGGCGTATTTACGGAGCGATATG
+GGACAATCGCCCCATGGCTCTTAATACATGTCTATTATTATATTAAATATACATCGTATCTGTAGCTGAA
+GTTCTTGGTCATCCGCCCCCTACAAAAATACTATTACGCAACCTGATA
+>gnl|ti|1361533895
+GCTCTCAGTAGTCATCAAAGTATATGATATAAATTTAACAATTACATACTATAAATGTCGTATACACTTT
+AGTTTCAAAGAACATAATTGTAATATAAATGCATTCTTCACTTCACATGGAATTTAAAATAAAAGCAATA
+GCGCAGTGGCGTAGCTGTGAAACTTTTTTTTTTTTTTTGGGGGGGGGGGGGGTATTAAAAACCTCACTTT
+AAAATTATTGAAATGTAAAAGTATAATATGATCAAAAGTAAATATCCATTAAGCAAAATAATAAAAAGCG
+CATTGGTGATGGGAGGCAAGTGCCCCCACTCAGCCACTGTAATTGCGTAATGCATTGTGATTTCACGTGA
+ACCTAATAGTGATAACTGACAATACAGTATTATGTGGTATGAATTGATTTTAGTCTTCAACTTCAAACTT
+CGCAGTTATTAAATTTTTCCATATAACATAAGGATTAAGAACTAGAAATCATTCCTGGTTACGATTAATT
+ACATCTTTAACAGGTAATTCCAATCATATTTCGTATATGTGTTCTTAAGATTCTATCAAAATAATGTTAT
+CCTAAAAAGATATTTGCTAGTTGTTAATTTGTTTTTTTACCGACTTACTTTTTACAGTCACTATTCCTCC
+AACATTATGCGTAATCCTTAAATATTTATTGCTAAAGTCTTCTGACGTAAACAGAATGAATGACACGGCA
+CTTATCATTACACCCATTACTTGACCCATTGCAGCGCAAGTAGACGCATAGCCTACATTTTTTCTATATA
+GAACCATAATAAACACACATATATATTATATATAAAATAACTTTGTATCATAGAATAATTGAACATAATC
+TGCCAAGATATAGTATACGTAAGGTAACAAAGTAAAACACACTTCTGTAGCAAAGTCAATGCCATCATCA
+CTACTATATTCTGGGTGGCGGCATGAAAGTAGATGTGAAAAAACCCCGATAC
+>gnl|ti|1361533896
+AGATCCAGCAGTAGTTCATCATGATAACGTTTTTATTATTATTACTGCTTCTTAGTGCTTAGAAAATACA
+CTATCTTGTTTTTCAATATTTTTATTAAGACGACGTGACGTGTTTTATGAAAAAGTTATAATTTCTTAAC
+AATTCTTGTCCCATAGTTAAACACATAGATCGTACCTACCTACAAATGTTGTTATTTTTTCTTTCTAAAA
+TGTGTAAATTTTGGAATTTGTTCGTATATCGTATTATGCCCTCTAAAAAAAGTTTCTTTACTCAGACCGC
+GAGGTATGCGGTCGCACGCCTATATATAATATTTTATATTATTACTCAAACTTTTTAATTTTACCTATTC
+GAAAACATTGTCGATCGACGGACCGACGAGACTTCTATAGTCCTATTACTTAATGTTTATTAACCTTCTA
+CTATTATAATATATTATATAGGTATGGTGTTTATCTATTTTCTGTTCCTTCGTCGGCCACCGCGCAATGT
+ACCTATACCTACCTAATACAGTAATACATCCCAACTCCATCATTCACGCGTTCTCTGTATAAATATAAAT
+TACGACGAGACAAGCATACTTATCAAGACTTGAGATTATATACTTGTGTGTATGTGTGTGTGCCTGCAGT
+GTATGTTTAGTACATGTTCACGTATAATAATAATATTCGTAAGATATTTCCATCACGTACGAACGAAAGT
+GTGCTGCGCCGCGACCGGAATGATATGAGATCCTCCGCCGCGCGTCATATTACGCGTACACGATTCACGG
+GAACCTGTTTCCGCGCCGGACGGACGGACGACGCCATTGTAAACATTTTTTTTCCACTGGCCGTCGGCGG
+CGTCGACGACGACGACGGATGGATGAGATTTATGCCGCTCACCACCGGGCACACCTTGCGTCGTCGCGAG
+TCGTGTCATTAATCTATCTCCTCGACTCACTCACTGTGGTATAAATCCTATAAAGTTATGCCCC
+>gnl|ti|1361533897
+TGCTCAGCAGTAGTTCATCAAGACATATTTGTCACTTAGAACAAATCTTCGAAAAATTTGCACAACACCA
+ATATTAGCAGCCATCAACAGAAAAAAGTCACAATTTCTGAAAAAACAAGTGATTTTTCTGGGACACATAA
+TAAGTGAAAAAGGAATATCTATGGACCCAGATAAAATACAAACAGTAATGAATTTCCAGCCGCCCAAAAC
+GAAAAAACAGGTACAAGCATTCATTGGGTTCATCAATTTTTACAGAAAATTTATCAGAGACCTGTCACAA
+GACACGGGACAACTCAGCAAGCTAACCAAAAAAGACGCAAAATGGACATGGGGTACCAGCCAACAGCAAG
+CGTTTGACAACATAAAACGAAAATTTCTAGAGGACATAATAATTCAATTCCCAGATTTCAAGAGAGAGTT
+TCACCTGAACACCGATGCCTCAACGACACACCTCGGGGCGGAACTTTATCAAATTACCGAAGAAGGGCAA
+CACCAAACCCTCAGTTTTGCCAGTAGAACACTTAACGCAGCGGAGCAAAACTATAACACCACTGAACTGG
+AACTGCTCGCAATAGTTTTTGCATGTAAAAAATTTAGAAACTACTTGCTTGGAAACAGGACGAAAATATT
+AACCGACCACCATGCACTTACATTCCTAAATACGTGTCAACTACTCAATGCTCGATTGGTCAGATGGGCC
+ACATATCTCCAGGAATTTCAGCTGGAGATAACGCACATTCCAGGGAAAGAAAATGTCGTGCTGACACATT
+GACTAGGTATCCGCAAGTCCCTACCAGTGACGCACAACCAGCAATAAAATAATCGTTATTACAAGTTATC
+ACTGTTAGAATAACAGTAAGGAATTAAAAGAACAGTTCAAAACCTTGAATGTTGCAACACAGGATGACAT
+GTCAAAAACTCAAACAGAGGATCGCGCAAATCATTCATATCTATGATGCATCGGATTTTGATGAACTACT
+GTTACCATCTCTGAATAAGGCCCCCAATGGGG
+>gnl|ti|1361533898
+GAACTGATGCAGTAGTTCATCAGTAATACAAGATTTCTTATAGGTTAATCTACCTTTATCAAAAAAAAAA
+TCGCTCTATAAGAAACTCAAATTAAATTTTTATGAGCGTTTGAAATTCATATTTTTATAACATTTGATAT
+TTGCTCGATTTCTCATGAGACGATTTTCTTATTTTGTTGTAATTAAAAAACGAATGACTGTAGAAACTTG
+AAAATTTCACTGAATGTTTATATTAGCATTTTATGTATACGATAAAATTTTGAAAATAATTTGACTCTTT
+TGAGCTGTTTACGGACAAAGTAAGTTTTCAATTTTTTTAGTTTTTTTTTCTATAAATATCAATAAAGTTT
+TATCTATTGGGCCAAAAAGTGTAAAAAATTAATACAGGGCTCCTGATACATTGTTAAAATAGCAGTTGAA
+AAATATTAAAAATACATATGCACAATTTTTTTTAAACATTTTTAAAATGTTCAACTTTTCATGGTTTACT
+TTTATTTCACTCATCTAAGGATTGAAAATTTAAAACAAGATTCCACGTAAATATTTAATTCTGTTACCAA
+AAATTCTAAGAATACATAAGCACAGTTTATTTTTATAGTCATTTTAAGTTCAAATTTGGACGAGTTACAT
+ATTAAAAAACCAAGTATACTATTTTAATTATTTTGTGTGATGTATAATACTATTCGTGGGTAGTACTTGA
+ACCTTATAAAGTATACTATTATATATTCTATGAAGCATCACGGTTTTTTGTTGATGATAACACCGTATAA
+GGTACCTTATTAGGTATGTGAAATTGATAATTGACTATGGATCGGATCCTATTAAGGTATTTTTTTACCA
+AAAATAATGGTAAAATAGTCTTATCCAGAACTGACACCGTCCCGTCGATCGTTTCTTAACGAATTATACT
+GGATCATAAACATCGTTTACCGTGAACCA
+>gnl|ti|1361533899
+TTGAAAGCAGTAGTTCATCATTCATTTTTATTTACATTGTAACAAGTATAATATCAGAGTCAAACAAAAC
+ACATTATAATAATAAAAAATATAATTTGGGTAAAATTGAAGAAGTGACTCAAACAATAAATTACCTCCAT
+TAAAAATTGAAAAATCAATAATTGTAACAAAATGATTATACACTCATAATTTATACTGAAGTAAAAATAC
+AACATTTTTAATAAAAGTTAAAAATGCACATTTATTACAGAGTTAAATATTATATATTGATATATGTAGG
+TATATATTATATATATATTTAATGATTTGTATTTTGAATTTACTATATTATGTTCATTAGAATAATACCA
+ACATTATATTAAAATAGGTAAATGGTAATAAAAGTACATATTTTAAAATATAATAATTATGAAGGTTAAA
+TATACTACAACTATATAATATCAAAAGATTTATTTGATAAGAAATTAATATGACAAATTATAAAATTTTC
+AAAATTTTCACCAAAAAAAATATTCATGAAAATTTACATCACTATCCATTACCATCAACCGAACACTCAG
+AAACTGTTAGTTTTGTATCAACTTTTTAGTATTTTTCAATATTAATTATTTTATAAAATATAATAGCTTA
+AAATATAAATAAATAATATTTTTATTATGTTCATGTACAACAGAATTTTAAAAAGAAGTACTTTACAGGC
+TATCATTCTAAAATATGAATTTAAACGAGCTGTTAATAATCAATGGGAAATGGCCCAAAGGGCAAAGATT
+GTCGATCATAGAAAGTTTAGGACTCAGAGCTGTATTTAATATTTTGTCATCATGGCAACATACCCAGTTA
+TGGCGCCACTGCACTAGCTATTCTATTTAGTATTATACTCATATTAATACTATCACACAAAATAAAAATA
+TCTCTTATGATATCTTATGATCACTAATCATTTATAATGATTGTAATAATAATATATAT
+>gnl|ti|1361533900
+GCGAGCAGTAGTTCATCACCGTCGCGTATTATAATATACAGCCAATAATTACATAATAATATCTATATAC
+AATTATTTTGAATTTAATGTGCGTATACGCACGCTGTAGACGTTTGCTGAGAAAATTCGTTCATAAACTG
+CACTGTAAAAACCAAAATTAATAAATTGCTATATAACTTGATACACGTCACAGCACTTGTATACAGTGTA
+CATGGGCGATATAAGGCATTTAGTGCGAGAGTGCGACACCAAATTCTCTTGGTCTAAAAAATGGGGTTGA
+ACATCATTGGAAATTTGTAATTAAAATGTTGGCAGTGCCACCTAACCGCGACGGCCACGGGAGCGATTAG
+ACGGCGAGCGGCTAGTGCGCGATGTTGTGCGCATCGACGATGTGCAGGTACTGAAGACGACTGATGCGTG
+GCGACAGCGACGGAAATCTAAAACACTGAGCGAGCAGAGGCAGCTGTTGGTGCTACGGAATCGGCCGGCG
+ACCGGCGACCGATGAGACGTGACACGACCGATTGCCACTGGGCGAAAACGGGAGAGGATCATCGGACCAC
+GCCGCATAGGTCCTGATCTTCTCCCGGGCCGTCCTGTAGTCGCGCATCGCCGTACCATGAAACGTTATCA
+GTTTCCACGAGTTCGGCGATGCTGACTTCCATGTTCCTAGCTCAACTGCATCGCCCGCCCGTTGTGTGTT
+GCAGTCTCCACCGCCGCCGCCTTTGCGAGTCGTCTTCGTGCACCATGCCATCGCCGTGGTACCGTATATA
+TGGTCGTGCGAGGTCGTTTGTTCTATCATCAATCGTAGATTTCAGGGCCCGATTATTTTTCCAGACATAT
+ATGATATATACTACGCGTAGTATAAAAATAACGTATAATACTGGACAGAATTGTGTTCCGATCCTATCCG
+AACTGCAGGCTCATTTATACT
+>gnl|ti|1361533901
+AGATTACGCAGTAGTTCATCATCAAGGTAATATATATTTTATTCTTCTATCTAAATATTACTTGATTATC
+TATTTTACATAGAAAAATGTATATTCACAGCTTATATCTATCTAGTAGTTCAGTTATTGGCAAAGAAAAT
+CTTAACAGTGTGCCGTTAAAAAATGAGGATTATTTCATATTGACTTATTTTAAAGATTTTACTTGTTTGT
+ATGTTGGAAAAGCTATACAATGTGGCAACAGTGGTAGTTACAATTTTGTTGATTGCTGATGAACTACTGT
+ACCATCTGATTAGGCGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACA
+ACATACGAGCCGGAAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGC
+GTTGCGCTCACTGCCCGCTTTCCAGTCGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGC
+GCGGGGAGAGGCGGTTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCG
+TTCGGCTGCGGCGAGCGGTATCAGCTCACTCAAAGGCGGTAATACGGTTATCCACAGAATCAGGGGATAA
+CGCAGAAAGAACATGTGAGCAAAAGGCCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGCGT
+TTTTCCATAGGCTCCGCCCCCCTGACGAGCATCACAAAAAATCGACGCTCAAGTCAGAGGTGGCGAAACC
+CGACAGGACTATAAAGGATACCAGGCGTTTCCCCTGAAGCTCCCTCGTGCGCTCTCCTGTTCCGACCCTG
+CCGCTTACCGGATACCTGTCCGCCTTTCTCCCTTCGGGAAGCGTGGCCGCTTTCTCATAGCTCACGCTGT
+AGTATCTCAGTTCGGTGTAAGGTCGGTCCGCTCCAAGCTGGGCTTGTGTGCACGAAACCCCCCGTTTCAC
+CCCCGAACCGCCTGGCGCCTTATCCCCGAAAAATATTCGTCTTTTGAGGCCAAACG
+>gnl|ti|1361533902
+ACCAAGCAGTAGTTCATCAGAGTTCATCATTAATTAGAAATATAAAACAGTTTTATTGCATTTTTTTCTA
+TATAATATTTTTATGCCAACAAAAATATCAAGCAAGTTGATGTACCATCTTTCAGTGGTTCATTTGGTAT
+CTTACCAAATCATGTACCCACATTGGCTGTTCTCCGCCCTGGAATTGTAACGGTATATGAAGATGAAGGA
+ACATCAAAAAAAATATTTGTTTCTAGTGGAACGGTAATTAAATACCTTTGTGGCTTTACCTAATACTTAT
+GTAATAATTAAATATGTTGATTTTTAGATAACTGTAAATGAGGATTCTAGTGTTCAAGTTTTGGCTGAAG
+AAGCTCACCCGATTGAAGATATTGATGGATCAGCCGCACGTCAAGTACTACAAGAGGCTCAAAGTCAACT
+CTCAACTGCATCAGGTGATGTTTGATGAACTACTGTACCATCTGATTAGGCGCATGGTCATAGCTGTTTC
+CTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGAAGCATAAAGTGTAAAGCCTG
+GGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTCACTGCCCGCTTTCCAGTCGGGAAAC
+CTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGGTTTGCGTATTGGGCGCTCTT
+CCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGAGCGGTATCAGCTCACTCAAG
+GCGGTAATACGGTTATCCACAGAATCTGGGGATACGCATGAAGACATGTGAGCAAAAGGCCAGCAAAGGC
+CAGGACCGTAAAAGCCGCGTTGCTGGCGTTTTCCATAGGCTCCGCCCCCCTGACGAGCATCACAAAATTC
+GACGCTCAGTCAGAGGTGGCGAATCCGACAGGACTATAAAGAATACCAGCCGTTTCCCCCTGGAAGCTTC
+CCTCTCGTGT
+>gnl|ti|1361533903
+AGTTCTGCAGTAGTTCATCATGGAAATATCTACTACCCCAAATATATGAAAGTAACTGTAATGGTGCGCA
+TATGAACAGTATGAAAGTTGAATTTAACTCTGTGTCAACTTTGACAATTTGTTAAACGGCAAAGTATTAG
+GTAAGCAATATCATTGAAAATTACTTGGCATGAGTAAAAACATATTATACAAATCAATATTACTTTCAAA
+AAAGGGATATGTCCACATTTTATAGTACCTATTGTTAAAATGTTCACAGGGCCTAACCTAACCTATCGAT
+CATATTCAAACAGATAATGTACGATGCATTCAGTCACATGCCAACAAAACTGTGGCTATAAGATGATTAG
+TTGACTTATTATATTACTGTTCAGTCTTACTCACGTTTTATCATTCCTTGCCCCATTTTTATAATATCTA
+TAATTCAGGTTATCCATAATGACTGTAGAATTTAACCTAACACCAGGTAAAATTATAAATGTATCGGCTC
+GCCGATGCTGGATATTTGCCAGTTGACCTGGTACAAAAATAATATAAAACTAATTACATTACAGTATAGA
+GTTGTCCGTATCTGCTTTAATAAAACAGTTTGAATCGGTTCTACTATTGATAATTATAAAGAACTGTGTG
+TATTTTCTTTAAATTTCCTATATATAATTTACATTAAAAAATCATGTATTTTCCAATTACTAACAATTTT
+TGTTTGTAAGAACCAGTCATATTAAACGTTACAAGAATTGTGAGTCGCTCTTTAGATAATTTACCACCAC
+TGCATGTTTCCCCTTTAAAACGTAATGTTTGAGACGGTGTTAGACGATAAAACAATCCAGTTTCATCAGC
+GTTATAAATGTCACAATCTGCATAATTTTTACGCAAATTAAGCCAAACGTATTCCAGCCATTTTCGAAAC
+ACCAACAGGACGCTTGACGATTCTCCCGCTTATTTTCCAAAAACGATTATTTGTGTCTTTGAC
+>gnl|ti|1361533904
+GGATGCTCAGTAGTTCATCAATCTATTGAGAAAACATATGAGAATCATTAATTTAGTAAATAATTTTCAA
+CTAAAATGCAAACAAAAATAAAAATATTATTCAGAAAAAGTAATTTTCCTCAAAACTATTACATCGTCAC
+TTACTGCCTTTCGGCTTAGGAGGTATACCTACTACATACCAGCCTAGCATACTGCCATACTCCTATTCTT
+GTATAAATATAGCCCTTTATAAACCAACAGACGTCTCGTTGAAATATAGCCCAATGACTTCAGCGTGAAG
+TCTTCTGTGCAAGAAAACGTAATGATGCCTGTGGGTTCTTAATAAATTTTGCTCGGCCTATAGGAAATTG
+TGAAATGTAAAATTTCGTCTTGACTCCAGAGACTACGTCTACGTCTGACCCCACCTGTCTCGCAAACGGG
+TAATGTAGAAAAAAAGCTAATACAAATTCCACGACGGATTTTCGGATAATAAAAGAATAGGTTTTAACGT
+TAAATTGTTACCTAATTATCAAATCGAATTTATTGGACACAATACGTGTTAGTTTTTTCGTATTTTTTAA
+TTTTAATATCGTTCATTTCTATTTTTATGGTTATTATCTTATTTGTTGTTTACATCCAAGTCTTCGAAAT
+CTTACATCTAAGTCTTTGCCTATATAATATTGAATTTCAGTTTAAAATAAAAAAATAGGTACCTACTTAT
+AATTATCATTTATTTATAGTTTCCTTTTAGCTTATTATATTTTATCATTGATTAAACAATGATGAACTAC
+TTGCAGTCGAACTCGAATCATCACTGGCCGTCGTTTTACACGTCGTGACTGGGAAAACCCTGCGTTACCC
+AACTTAATCGCTTGCAGCACATTCCCCTTTCGCCAGCTGGCGTAATAGCGAGAGCCCGCACCGATCGCCT
+TCCCACCAGTGCGCAGCTGATGACGATGACGCTGATGCGAATTTTTCTCCTTTACGCATCTTGGGCGTAT
+TTGA
+>gnl|ti|1361533905
+TAAATCTAAAGTTAGTTATCAATATAACCGTACATTTATCCCCATGGCTACCCATCCATCTGATGGTAAC
+GTTTTATGATACATCCAAATATGTATATTGTATACTATTTTATACTTTCTTCGAGTCCCAAAACAGATAG
+GTATTAGGTATTTATCAAATACCAACAAGATAAATGATCGAAAACCAGATGAATACATAAATGGACATAT
+TTTTTTATTTTTTTTTTTAAACACATGCATGAATTACGGCTATTATGATAGGTAATCTATGTATTAAAAA
+AATGTTATACCTACCTCAAAAAAAAAAAAAAGGAGAGACATGTAGGGCATGGCTATTTACTATTGTTTAA
+TGTTTACTATACGCTATTTGCTAATAAACTATTGTCATGTAAAGCAAAAGAAATGTGTATTTTTCAAACA
+ATAAAAATTGTGTACCTACTTATTCCATCCGACGTATTACAATTCACAGGGTATCAAGCAAGCAAACACG
+AAAAACGTGTTATATATTAATGATAATAATTCAAAACAATTTTTTTTCCTTTTTGAAAACGCGTATTATA
+TACAACGTATCACTAAAATTTTATATAGGTATTGGACCATTTATACA
+>gnl|ti|1361533906
+CATGGCAAGTAGTTCATCACGAGTTTGTACATGTTTATGATGGCGTTGACTACTTTGCGTGTACGCGATA
+ATTTTAAATTCGACTAAACTCTGATCAAAAACTAAAATAAATACTAAAATTCTAAATATTTTTTACCGAC
+TACTTAAAAGACTGACGCCCACGGGTAACTTATCTATATTCCAACGACAGTTAACGCGAGTTAAATAACG
+TTTTATTAAAATATAAAGATACCTGTAGTTAAGAAAATATAAAATTTTTAATTTTCCAAACTAAGGATTA
+AAATTTAGAACGAAGATTCTCATAAATAGTTGACCCTATAACAAAAAAAATCTAAATAGTATGTACACAG
+AGTTCTTTTTTACATATATTTTAAGTTAAAATTTGGATGAAATTACTTAACTATTTTTTTTTTTTTTATT
+TTGAATTAAGAACATTTAACAATCTGTACTCGTGGTACAATAAGCTTAATAGATATTTGAATTACAATAT
+TTGTGAATTAATACAAACACAAACGCAACAGCATTCAATTTATATGTAACGCTATTTTTATTTTACATGA
+AAATCTTGAATTGAAGAGACTGTCCAGCAACAGCACTTCGGCGAAAAACTTAACTATTTAAACAAAGAAT
+ACCGATTTTAGTTATTTTGTTGTAATTTAAAATTTTGTTCTTTGGTTACTTGAAACTTTATTTAGAGTAT
+ATTAGTATACATATTTATAACCACAATGCCATTTTCAAATGCAATTTTTTCGTCAAAATGAATTTAATCT
+ACTGTAGTACTAAATAAATTACTTTAATGTGCAGTTGGTCGTGTTTTAAAGAATTAATAATAAAGCCATT
+TAACATAATGATTGTTTGTATAGTACCTTGTATTTTTTGTACAGGTAAAACCACCCACATCTATCTGTAT
+AAGTTTCCGGTCAACATTTCTTAAAAAACAGTGCCCGCAATATACAGTTCGACGTTATTTTGTATCGTTG
+TTATA
+>gnl|ti|1361533907
+GGAGGGTAAGTAGTTCATCAGCCATGTAACACAATATGATAAAATACCTAGTCTCGCAGTCAGCGGGTGT
+CTTATGCGTCTAAATAACACAATATCATATAGGTACCATTAAAAAGGCGAATTCGGTGAAATTATATTAT
+ACTTCTCACATTAAAAACTTTTTAGAACATTAGAGTCGTGCATTACTATAGCAAACACTTGCTTATACGT
+GTATAAATTACGCGCTGCAGTATAATATAATGTAATATTATAACATTGGCCTCTGTGAATCTCGGTCCAA
+AAGCGACCAAGACGTAAAGTACGTGTCTGATATCCCCGAAAATATTTTATTAATTGCTTAAAATATGTTG
+GTAAAACTACTTAAAACCGTTCAGAGACACCTGCAGCTATTCATATATAGGTACCTACGCGTTTTATTCG
+AAATTCATGAAACAGCGGTATGAAAATTATTGTGATCAAATAATATAAATTGATTCTAAATTAAATTGAA
+ATCTAAAGAACCAAAAAGTATATATGAATGTGGCCATCCATTTGGAGTACCTATGTGACCGACATCATCT
+ATTCATCTTCGCTAACGACCTCTTTAATTAGATTGGCGGGCTAATTTACACTTTCCGTAAAAAACTGTAT
+AGGGGCCGCCAAAGGAAAAATCTCCCACCACAAGATTTGGATTTGCGGTGCCTGCTATCATATACGCACA
+TACAACACGATACCTACCTGTGTACGTAGTGAGCTGAGTTAATCATGGCCTTTGTACGTTACTCATTGCA
+CGTATACCTACGTTTTGAATAATATTACATTTTTTCTAAACAAGTTGTTTTTTTTATATAGTTTCTACGA
+GAGTTGTAAAAAAAGATCCATTTCCCGAGGATCTTTTGCCGTTCAATGCGCTCCCTATTGTGCCTTTATC
+CGCGTAGATTGAACTCCGACACAAATATTTAAAGCCGTTTTTTTATTGATCTCA
+>gnl|ti|1361533908
+GAAATGGTAGTAGTTCATCAACAGCAAGACGTTTCATTGTCGCGTACGACTATTATACGAGGATTGGTCA
+TTTACATAAGCACGATTTTAATTATAATTTAGAAGTATTGGGCGGATTTTTAAGTAATTACCTCCATACA
+TTTTCCGTTTTGATTTCTTTGAATTTTTGTGAGTTATCTTTACAAATCGTAATATTTTCAAACTTAAGTA
+CTTTGTTTCAATTTCGAACACAATAGCATTTAGTATATTATATTGTATATTTTTATAGAGAAACAATGTT
+CCAATGTTCGATATTTTATGCTGCGCGCCTACGCTACATTAGTTTATTGTCGCTGGCAACAGCACGCTAC
+CGGTAATTAACAGGATGTCAGCGCACTGTTTGTTTTCTCTCTCTGGCCTACGTGCAACATAGACAAAACG
+AATTTACATATAATCATTTTTTCTATCTTGTTGTAAAATAATGTATTAATTATTACTCGTATATTATTGT
+TTGATATAATAATATTTACTTTCCGCGCTAGACGTAATTGCTCATCGCTCAACGTTGCCAAATCCAGCGA
+TAACATTTTGCCATATAACGTCTTATAACACAATTTACATTTTCAAATAAATTACATTTTTAATGATTAC
+TTAATAATAATATGCAATTTTTAAAATTAAATTTTGTTTTCGATTTTAACACCTATTTAAACACATTTAT
+TTTTGGTTAGGTAACTGTCCCAAAAACTGAAAACCATCATTATTTAAACATTATTTTAATTTAATGATGA
+TCTTATTGAAATGATATGACTCTTATGTGAGTTTGATGTAGTACATTATGTAATAAAACAGCGTTAGTTT
+TTTTTGACAGGTCATTTCAAAATATTTTATGATTAAAAAATCTATTTTTGATCTTATCCCGTATAAATAT
+ATTTATATTCAATTTCAATGCATTTTTTTTTGGGTGGGTGAC
+>gnl|ti|1361533909
+GATGCTAGTAGTTCATCAATCTAAGTATTCTACTATTTAATTTTAATTTCTTACTCATATATAATGCAGA
+TAAGAGAGAATTATAATTTTTTTGTAGATTGTTGACTAAAATATTATTATCTAACTTGATAAATACTTTT
+ACTTATACCTATGGGTTTTCATGGATAAAGGTTCCGGTTCCAGAACCGGTTCTTTTAGGTTCGGTTCCAG
+TCCCTGTCTTAAACCTCTGGCATGGACGAACAATATTGTCTAGTCTGAGTGTATAAGGCTACTGGAAGGC
+ATAGTGTCCTGAATGTTTGAATGTCGAATATAAAGTTGAATAATAATGGTTGATACTATTATCAAATGAA
+AGCATTCCAGTGTCGTAAATTAAAACCAGAACTCTCAAAAGGTATAGATGAAAGAGTTAAATATAATATT
+CATCATTTGACTTTAGATCATAAAAGGATTGCGTTATACAAGCAGAATATTTTTCTTAGTATTTTGATAC
+ATGAAAATCGAATTTTGGGTGAGTAGTTTATGAGTTATAAATATTCAAAGTTTAGATGAGCGGAGAAGTG
+GACAAACATTTCGCGGGGTAACCCCGTACAACTCCACTCCGCTTATCTTGATGAACTACTTGCAGTCGAA
+CTCGAATCATCACTGGCCGTCGTTTTACAACGTCGTGACTGGGAAAACCCTGACGTTACCCAACTTAATC
+GCCTTGCAGCACATCCCCCTTTCGCCAGCTGGCGTAATAGCGAGAGGCCCGCACCGATCGCCCTTCCCAC
+AGTTGCGCAGCCTGAATGGCGAATGGCGCCTGATGCGGTATTTTCTCTTACGCATCTGTGCGGTATTCAC
+ACCGCATATGGTGCACTCTCAGTACAATCTGCTCTGATGCCGCATAGTTAAGCCAGCCCCCGACACCCGG
+CCAACACCCGCTGACGGCGCCCTTGAACCGGACTTTGTTCTGGCTCCCGGCATCCGCGCTTAC
+>gnl|ti|1361533910
+GGGGCCGCAAGGCTGAGGTAGTAGTTCTCAACATCACCTGATGCAGTTGAGAGTTGACTTTGAGCCTCTT
+GTAATACTTTACGTGCGGCTGATCCATCAATATCTTCAATCGGGTGAGCTTCTTCAGCCAAAACTTGAAC
+ACTATAATCCTCATTTACAGTTATCTAAAAATCAACATATTTAATTATTACATAAGTATTAAGTAAAGCC
+ACAAAGGTATTTAATTACCGTTCCACTATAAACAAATATTTTTTTTGATGTTCCTTCATCTTCATATACC
+GTTACAATTCCAGGGCGGAGAACAGCCAATGTGGGTACATGATTTGGTAAGATACCAAATGAACCACTGA
+AAGATGGTACATCAACTTGCTTGATATTTTTGTTGGCATAAAAAATCTAAAAAAAAATGCAATAAAACTG
+TTTTATATTTCTAATTTAATGATGAACTCTGATGAACTACTTGCAGTCGAACTCGAATCATCACTGGCCG
+TCGTTTTACAACGTCGTGACTGGGAAAACCCTGGCGTTACCCAACTTAATCGCCTTGCAGCACATACCCC
+TTTCGCCAGCTGGCGTAGTACCGAAGAGGCCCGCACCGATCGCCTCTTCACCAACAGTTGCGCAGCCTGA
+GTGGCGAATGTCGCCTGATGCGGTATTTTCTCCTTACGCATCTGTGCGGTATTTCACACCGCATATGGTG
+CACTCTCAGTACAATCTGCTCTGATGCCGCATAGTTAAGCCAGCCCCGACACCCGCCAACACCCGCTGAC
+GCCGCCCTGACGGATTGTCTGCTCCCGGCATCCGCTTACTGACAGCTGTGACCGTCTCCGGGAGCTGCAT
+GTGTCTGAGGTTTCACGTCATCACCGGAACGCGCGAGACTAACGGGCCTCCTGATACCCCTATTTTTATA
+GGTTAATGTCATGATGATTAT
+>gnl|ti|1361533911
+GCATGGTAAGTAGTTCATCAGCACTGTTGCTACAATAAGGGCAACGGCGACGACGTCTCGTACATAGCGT
+CACGAGAGACCAAAACGCACTGTCATATTCAATTTTATCTGTCGGTGAATAAGAGCCAACCGCCACACAC
+TGGCGAGAGAAGGGAGAACGCTGGTGGACCCCCACGGATTTATCGTGGGCAAAGGTCACAAGCTCCGGGC
+GCGAGATACCCGAGCCGGTGGATAATATATCTTGAACATTATGTGAATATCATCAGGCCACTGCCAAATA
+TGGACAATGGTACCATTAGTATAAATAAATAAGAAAATACATGTTGTGGACTGTATAAATGTAATATTTT
+TTGATGCATACAAAAAATATATAAAAAAATCACAGCAATGCTTGATAAAAAATTAAATTAAATGATTGTT
+AAGATGACAGATACCAAGGTTTATAAACCTTGGACAGATACAATGTACTTAACAATTTAGTTGTAGCCTT
+AGATGCATAGATAAGTATAATGTGATGGCAGCAGCTGCTGCTACTGGACAGTAGCTGCTACTGGACAGCA
+CAGATTTACAATACACTCAAACATTAATTATACAATTGACACAACAAATGATAATGACGATAATGGATAA
+TGATAACGATAATGGATCATGAAATTTACATTGAACGATATTTGAAAAATGAAGTGTCATAAAACAGTGT
+GATCATAGACTAAACCACGGTCTTAGACGGACTAAACATTACGTGTATGTGATAATGGTTCCAGATTATC
+CAGAGCCAAAAAAAAATAAAAAATACCCGTATACATGGGTATCGAATAATGATTTCTGACGTGATGATGC
+CTATGGTCTATGATTTGGATTTGATTGTGGTGTTGTTATATTTTGCTGTTTACGTCAGATATCTGGAACA
+TATATAATAATACACTATATATAGGTTCTATATCGCCTG
+>gnl|ti|1361533912
+GGGAAGGTAGTAGTTCATCATTGATAATAAAAACGAAATATACATCCAATTAGATTTAAGGAGGACACGA
+TTATGGAGTTTATTTAAAAAAAAAAGTATAGATTAAGCTAAAAAATGATTATTTTTAGATTGTATAATTT
+ATATTATTATTTTCACAATATGTTTTACAATATTTTCCTGGGTAGTTGGTACAATTTTGAAATTATTGGG
+TCAAGTTATAAAATATAAATACATTTTCTATGGACAGCTCAATTTTTCAAGAACTGAATAATTGTAAAAA
+ATAAATATTTAAGGAAGTTCAGATAACGTAGTTTTGATCACATTCTGTTAACTATATTCTACTAAATAAA
+AATGTTCAACCGATTTCAAAAAGCAATTTTTTTTTTTTGATATTTGTTTTTTATAGCCACCTTACATTTG
+AGATATTCACAATAAATGCTACAAAAATTAGATAACATTGAAATATATATTAAATCGGCGCGTAAACGCG
+TCACTGGCGTTAAAATTGTTAATCGACAAATTAATTGGTTTCATACGCAAAGTTCTTGATGGCTAAGAAG
+GCTCAAGGGTACTCACGTGAGGCTGGGGCTCCTGAATAACATTCATAATTGATGAACTACTTGCAGTCGA
+ACTCGAATCATCACTGGCCGTCGTTTTACAACGTCGTGACTGGGAAAACCCTGCGTTACCCAACTTAATC
+GCCTTTGCAGCACATCCCCCTTTCGCCAGCTGGCGTAATAGCGGAGAGGCCCGCACCGATCGCCCATCCC
+ACAGTTGCGCAGCCTGATGGCGAATGCGCCTGATGCGATTTTCTCCTTACGCATCTGTGGCGTATTTCCC
+ACCGCATATGTGCACTCTCAGTACATTCTGCTCTGATGGCGCATAGTAAGCAGGCCTGACCCCGGCCAAC
+CCGCTTGACCGCCCTGACGGCTTGTCTGCTCCCGGTATCGGCTACAGAACAGCTGA
+>gnl|ti|1361533913
+GGAGGCTAAGTAGTTCTCATTAATTTCTCATTTGCGTGTTCGGAACAACGAAAATTATATATAATATCTA
+TTTAGGTAGTTCATTTTTTCGTGCCATGGTAGATACGTATTTTTTTTACATTTATAATTTTTTCACCTTT
+TTAGATAAAGTCTAGCCAAACTACAACGTTTTGTTAATCATATTGTATAATAAATAATAATATACGTAGT
+AATAAGGTTAAGTACATTTACTATATAGGGTGTAACGGGACTATTTGACAAATAAAGTAACGTTTGTAAT
+GGCAATTTGTTAAATAGGCTTGTTACACCTTATATATTCCATAATACATCACCCTTTTGTTTAACGGGGG
+AATATAAATATATAATATGACATCGATCGTGCACGCGTTACTGTGGTAGTATGGGTACCTACCTAGCTTA
+GCTAGCCGGGCTAGCTATAAATAATATACACCACATCCCAAAAAAAACTTAAATGTTTTGAATTATCATT
+ATCGATTATGCGTTTGGCAGAGCAATAAACTAACAAACCGGCAGTACACAATTCAATAACATATCACTAC
+ATTTATCAGTTTTTAGAAAAAGGAAATCCGTTAAAGACCCAACAAACTATAAAATAATAAACAAATCGTA
+AAATATAGTACCACACTAAATGTACGTATCCATGAATATATTGATAAGTGATCCTCGGGTAATCATTTTG
+TAGAAAATATGTACGTCAAACAAGTAGACCTCCCCCCCCTTATACTATATCATCACATTATATTGTATAT
+GTTATAATAAGTATAACATAACCAATAGTATTGACTTTACTGCTATAACCTACTTTAATGATGCATGGCT
+TGCGACTAAACCATTTTCTACGCCAGGTACAATTCAGATGATGCTAGATGGATAATTAAATACCTATTTA
+ATTTGGATCTATTGCAACTATGGATTAGCAGTTACCT
+>gnl|ti|1361533914
+GCTGGTTAGTAGTTCATCATCCGTTATTATTCCCGGTAGATAAATTTAGTAATAATTGTCGATATTCAGT
+AAATATTATTTATTGTCCGTAGTTACTATACATAAATCATAAATGAAATTATAGTTTATTGCTTGTATTA
+ATAAATACCTATACAATTAAAAATTTAGCACGCTCACCTAGTGTAAATTGTATTTTTAGTTCGTTTTTGT
+AACTTAGGCTCATGATTATTTAATGTTCGGAAAACTTTAGTTTATGTTTCAAATGTTTTCTTACACCCTA
+TTCGACGAGTTAAGATTTCGCTACGGATCATAAAGATGGCTTCACTATACTTAATTCTTTGCTTATCCAT
+AAGATACCTTTACCCGCTAAATCCTTTTATGAAATTTACCAGTACTTCACTATTTTGTCATCTTATCTCC
+GCTCTCTCCCTCCCTTTGAACAATTACTAAGATAACGCCGGGAACAGATATATCCTTCATCTTTTTCTTC
+CATACCGTATATCCCACTGGGCATCTATAAATCGCAGTCCCGACCGTACTTAGTAATCGTTTTTTGCAGT
+GCAGAAGCCCCAATTATAATCTCCATGACACCTTTCCATTCTATGTAATCCCGTTAGATTGTATTAATTT
+TGTGTTTTACTATACCTACAGTATTTTACCCTTACCACGGCTAGTGACGTTCACTCAACGACCATTATTT
+TCGACTTAATGTTAATTATTCATACATATTCTAGACTCGAGTGTATTGTGTTTTGTTTTAAAGTCAGTAA
+CTCCTATAGCTATACAATTAATTGTTATATAATATCTTTATTTTTAAAGTCAAGAAATTTAAAATATAGT
+TCGTATGTTAAAACAAAAGAAAATAATAGTCAACTAAATCATTACGTTCAGTGCTGCTCATTATTGACAT
+ATTTTTAGATAGATTTAACCGTGAATATTTATTATTTTATCATAATATCATCCATTGT
+>gnl|ti|1361533915
+GATGGTAGTAGTTCATCACGACCGACCGCTATTAAGTGCTCGAATAACCCCGCCGCATTCGCCCCAAAGT
+CTTCTCGGGCGCAATACTGCTGCTGCGGCCCGAGACCGGAGAGAAGACGAACCCGCTAAATTATAGTCTG
+CGCGGTTCGACAAAATTACAGTGCAACGCAAAATTGATGAACTACTTGCAGTCGAACTCGAATCATCACT
+GGCCGTCGTTTTACAACGTCGTGACTGGGAAAACCCTGGCGTTACCCAACTTAATCGCCTTGCAGCACAT
+CCCCCTTTCGCCAGCTGGCGTAATAGCGAAGAGGCCCGCACCGATCGCCCTTCCCAACAGTTGCGCAGCC
+TGAATGGCGAATGGCGCCTGATGCGGTATTTTCTCCTTACGCATCTGTGCGGTATTTCACACCGCATATG
+GTGCACTCTCAGTACAATCTGCTCTGATGCCGCATAGTTAAGCCAGCCCCGACACCCGCCAACACCCGCT
+GACGCGCCCTGACGGGCTTGTCTGCTCCCGGCATCCGCTTACAGACAAGCTGTGACCGTCTCCGGGAGCT
+GCATGTGTCAGAGGTTTTCACCGTCATCACCGAAACGCGCGAGACGAAAGGGCCTCGTGATACGCCTATT
+TTTATAGGTTAATGTCATGATAATAATGGTTTCTTAGACGTCAGGTGGCACTTTTCGGGGAAATGTGCGC
+GGAACCCCTATTTGTTTATTTTTCTAAATACATTCAAATATGTATCCGCTCATGAGACAATAACCCTGAT
+AAATGCTTCAATAATATTGAAAAAGGAGAGTATGAGTATTCAACATTTCCGTGTCGCCCTTATTCCCTTT
+TTTGCGGCATTTTGCCTTCCTGATTTTGCTCACCCAGAAACGCTGGGTGAAAGTAAAAGATGCTGACGAT
+CAGCTTGGGGTTGCACGGAGTGGGTTACATCGAAACTGGGATTCTCAACAGGCGGATAGGAATCCCTTTG
+AAAAGAATTCG
\ No newline at end of file
diff --git a/gatb-core/test/db/reads1.fa.gz b/gatb-core/test/db/reads1.fa.gz
new file mode 100644
index 0000000..31fd851
Binary files /dev/null and b/gatb-core/test/db/reads1.fa.gz differ
diff --git a/gatb-core/test/db/reads1_list_ids.txt b/gatb-core/test/db/reads1_list_ids.txt
new file mode 100644
index 0000000..da7f847
--- /dev/null
+++ b/gatb-core/test/db/reads1_list_ids.txt
@@ -0,0 +1,2 @@
+2
+4
diff --git a/gatb-core/test/db/reads2.fa b/gatb-core/test/db/reads2.fa
new file mode 100644
index 0000000..c27e184
--- /dev/null
+++ b/gatb-core/test/db/reads2.fa
@@ -0,0 +1,7252 @@
+>generic1
+GCCGAACAGGTCAGTTTCGGTCTCTTCTTTAAAGTCGTTTCCAGCACGCCCGCGCGCGTCGCGCCGATGCCCTTGGCATA
+GGCCAGCGCCAGCTCCTTCGCTTTTCCGGAGGCGTTCTGGGACACAGCGATCAAAGCCGGCGTTCCACCGCCTTCTTCAA
+AGGTGCGGCGCACGAGATGTCCCGGCCCTTCGGTGCGATCATCACCACGTCCAGATGGGACGGCGGACGATCGTCTTAAA
+ATGAATGTTAAATCCATGCGAGAAACTGAGACGAGTGGTGT
+>generic2
+CATTGATAGTGGTATCGGTATTCCTGAAATAGTAGTCGGGAAATTGAAGTGGTTAGGAAACGTTTAAAACTAACGGAAAC
+GGGTACGGTTTTCCGGTAGGGGTTAACGGTTCGGTAACCGTCCGTCCTAAAGGTTTCCTACGACCTAACGGGGGTAACGG
+TACGGATTATTTTCCCAATCAAATGTTAAATTACTATCGGAAATAGCACCCAATTTACCTATAGTAACGATTGATAAAGA
+TCGCTTTATTCAAGTTATTATTAACTTAATTTCAAATGCTTCCAAATTTACTGAACAAGGCTCCGTTAAATGCGTCGCCT
+ATTTTGATAAACAGGCTCAAGAAATTGTATTGCAAGTCATTGATAGTGGTATCGGTATTCCTGAAAAATATGTGGATGAA
+GTGTTTGAAAAGTTTAAACACGAGTGGTGT
+>generic3
+CCAGCGCCGCCGCCTCGCCAAGCGCGGCCGTCAGCAGCATCTTGCGCACATCGGGGTGGACGATGATCGGATCGGCCGGC
+TTGTCCGGTGCTTTCGGGCCGGTCAGCGCGCGCATCTGAAGCCGGTCGCGGGCGTAGGCCACCGCGTTTTGATAGGCCAC
+TTCGGTCAGGCCAAGCGACTGGCAACCGACACCAAGGCGCGCGGCGATTCATCATCACGAACATCGCCTGCAAGCCCTTG
+TGCGGCTCACCCACCAAAGTGCCGAGCGCGTCTTCCAGCACCATGCGGGCGGTGGCGTTGCCGTGGATGCCCATCTTGTG
+CTCCAAGCCCCCGCAGAAGATGCCGTTCTTGGCACCGATCCCACCAGCGGCGGCGGCGTCGGTCAAAAACTTCGGCACCA
+CAAAGAGCGAAATGCCTTTGGAGCCCGCGGCGCATCCGGCAAGCGCGCCAACACCAAATGCACGATGTTGGCCGCAAGAT
+TCGT
+>generic4
+GTCGCCGGGCGAGCAGCCCAAATGGGTGCAGATGCCCACGGCAATAAATTCTGGCTTGATGGAGCGCGTCGGGTTCTTGG
+CGTAGGCGGGCGTCGGGTACTGATTGCGCGCCGAGGCCGGATCAACAAGCTGCGGCTCAACGGTTTGAGCGCGGCCAGTT
+GTTCCGGCGTGCGACGCACGATCCAGACCGGCTTGCCGCGCCATTCAACCGTGAGCTTTTCACCGGGCTGCAGCGCACCG
+ATATCCACTTCCACCGGCGCACCGGCAGCACGGGCCCGTTCGGACGGCGTCAAGGTGCTGACAAACGGCACGGCAGCCGC
+TACACCACCGGCAACACCGGCGCAGCTGGATGCAATCAGCCACGTCCGCTTGGCCTGATCGACTTGCTGGTCACTCATGG
+AATTCCTCAGAAAGGTGGGGTTCGAATCGAATCGGGAGACTTCGTCGATATCTCGGGACAACGCGTGATTTTATACGAGT
+GGTGT
+>generic5
+GCTGCGCGTGCCAAGTATCGTCTTCGCGATCAACAAGCTCGACGCCATTGAGGTGGGCACCGAGGGAGCGTTCAACGCCG
+TGGCCAAGGCACTACGACGGGAAGTTTAGGCTGTCGAAGCTGGCATCACGGTCAAAGGCATCGTGCCGGTGTCGGCACTG
+CGCGGCGATAACGTCGCCACACCATCCTCCAACTGGCCTTGGTACAGCGGCCCAACACTGTTGCAAATTTTGGAGGGCTT
+GCCGGTCACCGATGAAGCGCACGACGGTAATCTGCTGGTACCCGTGCAATATGTCGCCCGCGACGACGGCGAAGGCACGG
+GTCATCAACATCGCGTGATGTGGGGTCGTATTGCCCACGGCAGCGTCAAGGCGGGCGACACAGTCGCCAATCTTTCCGAG
+CGGCGAAAACAGCCATCGTCGCGGGTGTGCGCCA
+>generic6
+CTTCGCCGCAGCGGCATGGAAGAAATGATCGCCTCAGGCATCGTCATTACCGGCGGCAGCAGCCTGATGCGCGGCATGGT
+CGAGCTGGGCGAGGAAATCTTCCACATGCCGGTACGCCTGGGCATGCCGCGCTATGTGGGCGGCCTGTCCGAAGTGGTGA
+GCAATCCGCGCTACGCCACCGGCGTGGGCTGGTGCTGATGGCAAGCAGCAGATCGAGCGGCATATCCAGGGACAGCTCGA
+GTCGAGTTCGTTCGAGCGCGTCTGGGAAAGATGAAGAGTTGGTTTCAGGGGAATTTTAGCAGTCACAAGGCACACAGGGG
+ATA
+>generic7
+GCGAGCGTGCCCTTCCCGTCGCGCCTGGGCACGCCTGCGGACTACGCCAAGCTGGTCAAGCACATCATCGAAACGACATG
+CTCAACGGCGAAGTCATTCGCCTGGACGGCGCCATTCGGCTGGCTCCACGCTAGGGCCAAACCGCCGCGCCGAACACGTT
+CTTCGCAACCAGGAGCCTTCCATGCGTCTCCCGTTTCACCTGGTCGGCTTGCTGCTTGTCACTGTACAGGGCGGTGCCTG
+GGCCCAAAGCGTGGCCGACGCCCCGCC
+>generic8
+GCGTGGTCGTCATTCCTCAGATCAAGCCCGCCATTGAGGCCAAACTCGGCAAGACGCTGGCGCTCTCCAGTGTGTACCGC
+ATGCTGGCGCGTCAGGGTTGGCGCAAACTGGCCCCAGACACCCAGCACCCCCAAGGCAACCCACAGGCACGCGAAGACTG
+GAAAAAAACTCCCCGGCGCGCTGGGCGAAATCCTAGCGGGCTTCGACGCACAGCGCCCACTGCGCCTGATGTTCCAGGAC
+GAGGCCCGCTTTGGTCGCATCAGCGATACGCGCTACTGCTGGGCGCGCCGGCCCATGCGCCCGATGGTCAAGACGAGTGG
+TGT
+>generic9
+TCCGGTTTTCACCGAATTAAATAGGTCTGTCCCGAGCTCTGGAGCTCCTCCTGGATCTTCCCAATGTCGTGCCCCAGATC
+GATCTTGTTGACCACCGACCACGCTCGGGAGTCTGCCGGTAGGCCGCATCATGCTCATAAACGAATCCGCTGTAAGACAT
+TCAACCCATCGGTGGCGGTATGGGAGAACTTCAGGGTCGCATCGATCATGAACACGATCAGCTTGGCACGAGCCAAGTGT
+CTCAAAAAATACAGTCCCCAA
+>generic10
+CTTCCATTCCCTCCCTCTTCTCCTCGTCCTAGTCTTCTCTTCTTCTCCATTTCTTCCATTCCCTCCCTCTTCTCCTCGTC
+CTAGTCTTCTCTTCTTCTCCATTTCTTTCATTCCCTCCTTCTTCTCTTCTTTCCAGTCTTCTCTTATCTTCCGTTCCCTT
+CCCTCTTCTCGTCTCCTCTTTTAAGTCTCCTCTTTTCTCCATTTCTTTCATTCATCCCTCTTCTCTTCCAGTCTTCTCTT
+CTTCTCTTCTGCCAGCCTTCTCTCTTTTTCTTCCAGTCATCTCTTCTTCTCCATTTCTCTCCTTCTCTTCCAGTCTTCTC
+TTCTTCCAGTCTTCTCTTCTTCTCTTCTTCCTAATCTTCTCTTCTTCTCCTTCTCCCAATCTTCTAGCCGTATCCTTTTC
+TTAGTCTTCTCCTCTCTCCATTTTTCACGAGTGGTGT
+>generic11
+CAGTCTTTCACGTCGGAATCAAATTCAGAGATCGCCGCCAATCTTCGGTACTATCCTCTCCCCAATTATTTATTGAGGGA
+GGATATGCCCATGAATCTGGTGATTATGCTTACGGCAAGGGCAATACCCTGTCCGCAGGTGCTGGTTATGCCTTTACACC
+TTATGTCAATGTCCTGCTGTCGGCATCGAAATTCAACGCCGATGACCGAACTCTAGACGCCGGAGGCCATACAGTGGGTC
+TCAACGCCAATCTTCGTTTCTGACGAACTACTGAGTCAACCTCACACGAGTGGTGT
+>generic12
+GGAAATGTCATGAGAGCTTGAGTGCAGCGAAACTGCTACTGCTGCTGCTGATGTTGCATGAAACTGTCCGAGTAGTGAGA
+CTATTTCGAGGGAATAATTGCGGTTGCAGGCGTGAGAAACCCTTTGAGTTTCGATACAAAAGTGCAGCGATCGTTCTTCA
+ATGTTTAAGGGCTTGCGGTGCATAGCAGGTGGCTTGATTGTTCAGGATGTTAGAAGAACCAGAAGAAGAATCTTTCCCGA
+TGACAGCTACCTAAAGGATAAATTGGCAAGGGATTAGAGGGGTAAGCATGTGGGTCATCTTTACTGTCTGATTGAGGTGT
+GTAGAGGGCTAGCTCTTTTGCCACGAGTGGTGT
+>generic13
+CGGTCAAGAGCAACATGCGTTCAAGCAATGGGGCAAAGGACGAACCATGCGGCCCGTTCGCGCCGGAGCCGCCGGTGGCG
+GATCCCTGATCACTGTTATGACAATCACCGCAATTGATAAGGCTGGAGGTCGTCAGCGGCGGAATAAGGCTGGGCGAGTT
+GAAATTTTTCCCAAATGCTTCCACTGGATGAAATGATGTGTTGCCGGGATTGAATTCCAACCGGGTGTTGGTCTGCACAA
+ACTGGCGCGGAACCTTGGCCGGACCGCGATCAGCACTGTTCCCGTGACAGCGAAAGCATAATTCATATTCGTGCGTGACA
+GCTGAAAGAATACCGCCCCGGCACTGACACCGGCAACTCCGGCCAAAGCGCCGGGAATCTGAGTCTTTGCATTTGGAGTG
+CTGCTGGCAGCATGAGGATTATGGCAGTCCGCGCAGGTGACGTGGCGAATCGGCGGATTTACCAGATCTTCGCACGAGTG
+GTG
+>generic14
+CTGGTAATAGGTCACGCCATTCGATACCCGGGTGTTGGGATTGCAAGGCAGGCTGGCGTAACCAGAATTGACTGGCTGTT
+GTACAACCGTTGTCGTTGTTGTGGCAGGCGCAGAATTCTGCCCCGCCGCGTAGCCACCGATTGCGCCGATCGCTGCCGCG
+CCGAGCGCCACGGCTGCAACTGAGCCGCCGTCCCAGTTATTACTGTTGTTATTGTTAATATAGGCATTAGTCACCGCATA
+CGCCTGCGCTTGACTGTATCCACGGTTGCCGTAGCCACCGCTATTGTTGACATTGTTGACAGTCTTTGAGTTGTTTACAT
+AGACATTTTTATTGCCACTGTTGCCATTGTTGATGTAGGCATTAGTCGCGGCATACTTCTGGTTAGAAGTGTATCCCCCA
+CGAGTGGTGT
+>generic15
+TCGTTCAATCAGCCATCTGTCAATCAATGGGATGCTCCCCGCGCTACGCTTCCCGTCGGAAGAGTTCGGTCGTTGCAGTC
+CTGCCGGGCGTGTGGTTTAATTCCGTTGGTGCCCCTCGAAACGACCGCGCAACGCAAACTACGCCGCCATCCTTTTCTAA
+CCCTAACCAAAGACAGCCACCCATGCATCTGACACACCGAACACAAATACTCCTTCTGCTCGCCAGCACCTTGGTCAGCC
+TCGCCGCAAACAACGCGCACGCGGCCGACGCCCCACGTCGTGCTCAAAGTAGGACGCGCGCGACGTCAGCCGCCGCGTCC
+TACACGCCACGCTCCATATTCCGGCCCAGCCCGGTCCGCTCACTCTGGTGTATCCCAACGTGGATTCCCGGCGAGCACGG
+CCCCACCGGTCCCATCACTGACCTCGCCGGCCTCAAACTGACCGCTAATGGCCAGCCTATCGTCTGGCAGCGCGGCCGCT
+CGACAACTACGCTTTCCAAGTCCAAGTCCCGACCGGCGC
+>generic16
+GGACCGCGCAGCAGAGGTCATTGCAGGATTTACCATTGCTAACGATGTGTCGGTGCGTGACTGGCAAGTTCGTTCGCCCA
+CCATGATGATAGGCAAGTCATTTGACACCTGTGGTCCGTTGGGTCCATGGTTGGTGACTTCTGATGAAATAATGGATCCG
+CATAATTTAAGCCTTAGAACCTGGGTGGATGATACTGTGCGTCAGGACGCCAACACCAGTCAGATGCTGTTTAACTGCTA
+TGAAATGGTGGCTTATTTATCGCAAGCCATGACCCTGGAGCCAGGTGATGTGATTAGCACAGGCACACCCAGCGGGGTGG
+GTGTAAAGATGCAGCCACGGGGTTATTTAAAACCCGGGCAAACCGTGCGCGTGGAGATTG
+>generic17
+ATGGCGACAAGCTCCACCTCGAACAACAGGGTTTCATTCGGTCCGATGTCACTGCCCACCCCACGGTCGCCGTAGGCCAA
+GTTGGCCGGAATCACGAGTTCCCAGCGCGCGCCTTGCGGCATCAGTTTGAGTGCTTCTTTCCATCCAGAGATGAGCGCAG
+CCACCTTCAGGGTGGCCGGTTTGCCGGCCTCAGTGGCGTCAAATTCCGTCCCGTCCAGCAACGTCCCACGGTAGTGACAT
+TCCACCAGATCACTGTCCAGGGGTTTGCGCCCGGAGCCTGCCTTAAGCACGCGGTACTGCAAGCCGCTGGGCAAAGTCAC
+CACACCCGGTTTGCTCTTGTTTGTTCGAGGTAAGCGACCCCCAATCGCCGATTTTCGTCGGAAGCCAGACGTCGGTTCAG
+CGCTGACGAGTGGTGT
+>generic18
+CAGAATGCCGGGTCCGTTGTCGGCCACCTGAACTCGACATGATCGGTCTGAACTTGCAGCGAGACACGGATCAACTGCTG
+CTCAGGCTCGCCGGGTGGCCATGGCGTAGCGCGTTGTCAATCAGGTTGTGCAAGGCAATGCCCAGCAGGCGGCGTCTGCG
+GTGATATGCACCGGCTCTGCGCCCAAGTCGGCCACCACCTCGGGGTTGGCGCCATAGCGCGCCATCACCTCAGCGGCCAA
+CTGGCGCAGGTCCAGCGCCGCCATATGGGGTTTGAGGGCCAGCTCGTGCAAGCGATCTTCATTGATCAAATCGTTGGCCA
+GCCCGATCATGCGCAAACTGGCCTGGCGCATGTTCGTGAGGCGCTTTGCAATCTCCGGGCGGAATCTGGTCTTCAGAATC
+ACCAGAGAATCGAGCGAGGACTTGATCCAGGCCG
+>generic19
+GCCAAGACTACGCTGAAGAGCCTGATGACCACCTTCATCGACCGGCTAGGCAACCCTGACGGAAAGCACCGGAGAATACC
+ATCAGAAGATTGAGGGTTACAGCCAGAAGATCAGCAAGACTGACAATTTGACTGATCTCAGCCATTTGCTCGATGACATC
+ATGCAGGACACCCGCGTCATTCAGGCCAGTGCACTCCGCTCCCACGAAGAACTGTTGGTCACCAAGAAACAGGCCGATGA
+GGCAGAAACTCGCATCAAAGAGCTGGAGAAAGAATTGATCCAAGTCAGTGAACTGGTGCGTGAAGACCAACTCACCGGCG
+CACTCAACCGTCGCGGCTTGGACGAGGCCATGGATCGGGAACTGAAACGCGCCGACCGCAACAATGCTCAACTCAGTATA
+GCCTTGCTGGACATCGATAATTACAAGAAGTTGAACGACAACCCTTGGTCACCAGGCCGGTGACCGCGCCCTCACCC
+>generic20
+GCCGAAGTCAATATAATGGTAAATATACATTACGTGATGCATATACATAGAGACCCGTATACATCGCTTTAGCGAAAAGC
+GAAATATGAGAAGTTGTTGTACCCCATTTGAAACGTGAAAAACGTTAGAATGGAGTTCTGAACATATGTAGTTTCCGAGA
+TATCGTGGAGCGAAGTTTAGCGAAGTGCCAATATTGCGCGAAAACGCGAAACGCCGCGAAATTTCGCTCGTCGAAGCGAA
+ACGTAGCGAAATTTAGTGCAGAAGTGCAAAAATCTGATTGATTCGCTTAAAAAACTTTAATCGCAGATATATATACCGTA
+CTCTGACTACCATCGTATGTACTATCCGCTACACCATAGCGCGGATAACATTATTCGAATCTAGCAACTACATAACATAC
+GGATTGTATTCGAAAAATTTTACGA
+>generic21
+GTTGTCCGCGACCATTAAATTTAAAGGCTCGATGATTCTGCAAGCGCAAGGTGATGGCGATATTACTACGCTGGTGGCGC
+AGTCCAGCGATGAGCGCAAAATTCGCGGTTTGGTGCGCAGTCGTGGCGAGGTGGCAGCAGGATCATTAGAATCCATGTTC
+GGGCAGGGACGCTTGGTTTAACGGTTGATTCAGGCAAAGCGCAACCTTATCAGGGCGTTGTGCCTTTACAAGGAGCTAAC
+TTAGCCGAAGCCTTGGAAAGCTATTTGTGCAATCCGAGCAGTTGAATACCCGTTTATGGTTGTTTGCTAATGAACACGTT
+GCGGCGGGATTGTTATTACAGGAATTGCCCGCCCACGACGGCGATAAAGCCGACTGGCAACGCATAGCCATGTTGGCGAA
+TACCATCACCGAACAGGAATTATTAACCTTGGATTGTGAAACGCTGACGAGTGGTGT
+>generic22
+ATCACCGCCGAGACCAGCGCCACGGCCAGGGCCTGTCCGCGCTCGCCGAAGCGCTCGGTCAGCGCGACGGTCATCAGGGC
+ACTGAAGGCGACGTTCACGAGGTTCGTGCCGACCAGGCAGGTCAGCACGGGATCCTCGAGGTCGCGCAGCAGGCGGCGCA
+AGCGACGGCCGCCCGGCGTGTCGCCCGCCGGCGAGCGACGCAGGCGCACGCGGCTGACGCTCATCAGCCCGGTCTCGATA
+CCGGCGAAGAACGCCGTGGCCAGGACGCAGGCAAGGCTGGCCAGCGCGATGAACACCCAGTTGTCGGCCCAGGCCGGCAT
+CATGTCGCGCCCCCAGCGCCGGACGCCGGCGGCCCGAACCGCGTCACCTGGATGCTCTCGACGCGCAGCCCCTCCATCTC
+CAGCACGGTCAGGCGCGCCTGGGGCAGCGTGACGCGATCGCCGGGCACCAGCACGCGACCGAGCGTGGTCATCAGGAA
+>generic23
+GGCGGCTCGCTGTCTGCGACCAGCGCCACCCGGCCCAAAGCCGTGCGCTGAGTCTCATTGAGCTCACGAGGAGGCGCATC
+CGACCCTTTGGGGGCCGAGCCACATCCCGTCAATCCCACCAAGCCGAGCGTCATCGCCAAAGCGCTATATCGAATCGATG
+TTTTCATAAGCTATCCCGCTTGAAGCCTTCCTTGCAGCAAGGATACTGGAGGCATGAACACATCCCTGCGCTTTTCACTG
+GCTCTTTCGCTGGCTCTTGCCAGCCTGCTACCCGCCACTGCCATGGCAGCCCCTCCAGCCCCTTACCCACCGTGATGCAG
+GTGGACTTGGGCCGTTATGCTGGTGATTGGTATGAAGTGGCCAAGCTACCGAATCGTTTTCAAGCCATGTGTACCGCCGA
+CACCTTGGCCCGCTACCGACTTGAGGGCGACAAGGTGCGCGTCGAAAACCGTTGCCGCAACAAAACGGTGACCTTGAAAC
+CGCCCAAGGCACACA
+>generic24
+AAGTAACAAAGAGGGTTGGCGCGTTAAACTGTGCAGCATTGAGTGAAACCTGATCGAGAGTGAATTGTTTGGTCATGAAA
+AGGTTCGTTTACAGGAGCTTTAAGTAACAAAGAGGGTTGGTTTGAAATGGCCAACAAAGGCAGTCTGTTTCTTGATGAAG
+TCGGTGACTTGCCTTTGGGTATGCAAGCTAAATTACTACGGGTATTACAAGAGCGCGAAGTGGTGAAAGTAGGTTCAAGA
+CACCCTGTGCCAGTCGATGTCAGAATTATTGCCGCACGAGTGGTGT
+>generic25
+CTTGGATATCGATCCGGCCAAGATCCGGATTCTCCAAGAAGGCGGTATACCGATTCATGAGCCGGGTCTGCTTGAAGTTG
+TTCAACGCAACGTGCAAGCGGGTCGCTTGGAATTCACCACCAACGTGGATCATGCGGTGGCCCATGGAACGATCCAGTTC
+ATCGCCGTCGGTACGCCTCCGGATGAGGATGGTTCCGCTGATTTGCAATATGTGGTGGCCGCTGCCCGCAGCATTGGTCA
+GCGGATGACCGACTTCAAGGTGGTGGTGGACAAGAGCACGGTGCCGGTCGGTACAGGTGACAAGGTCAAAGCTGCTATTG
+CTGATGAATTGGCCAAGCGCCAGATTAAGCTTGATTTTGCGGTGTGCTCGAATCCTGACGAGTGGTGT
+>generic26
+GCCGCCGATAGCGAGATGAAGGCTGAATTGGATAAGGCTAAAACGGCGGCGATAGATAGCCAAGAAACAGCTGATTTAGA
+GCGGGTCAAGATTGCCGAAACCGATGCCCAACAACAGCTGGAACTGGGCGAATTGTCCAATGGCAAGTTTCTTGGAGAAA
+CAACAGCAGTTTGTAAGACCAGCGGTATCAGATTGCCTTAAAAGACCGCGCAGGATAGACGGGCGTTGCTGGATGACGGC
+GATACGTCGGGCAAGGCGAAAG
+>generic27
+GGCGGCCAAGCCTTGTCCAACGACACGGTGCTGGTGAACGGGGCCGAGCGGCTCAGACCCGATCTGTGGGAGCTTGCGCG
+CTCGATGCAGCAAGGCCCGGGGCTGAGTGCGCTCAGGCCAAAGTGGCTTGCGCTGAGGTGGAGTTGGTGCATGCCGGTAA
+CGAGTTTCGTCAGCAGCAATGGCGTCACGCCAAGCCCTACATCCAGATCGCCGAAGACCTGATCACCGAAGCGCAGGCGC
+AGGCTATGGCGTGTCCGAAGCCCGTGATCGCCCCCGTGGCAGCCGAAGAGTCGGTGGTGCCCCCGCCGCAGCCTTGACGT
+GCCCCCAGATCCGCTGCCGCCCCGCCCGCCGAGCAGCTGCGTCTAGGCTTGAAGGTTTACTACCCGACGGATCGCCACGC
+CGAGCGCGAGATCAACCCGCCGGGCACGGCGGAACTGAATGCCTTGGTCAAAGCTC
+>generic28
+GGTCGATGAAGGTCCGCACGGCGTCGCCGATCGGCTCGTTCCCCGTGTAGTAGGCGTAGAACGTGAGCGAGAGCTCGAAG
+AGCTTCGCCGCGTTCATGACCGCGCGCTCGGTGGGCGGCGTCTTGCCGCTCTGCTGGACGAACCCGACCGCCGTCTCCCA
+CCAGAACCTCCGCAGCGCCAGCGCGCGCTGGTAGGAGACCGTCGGGTTCGCGCCGAGGCGCCAGGGCGCGTCCTTCACGA
+ACGCCACGGCCGCGGCCGGTCGCGCGATGTCGCCCGTCGCCCTCGAACCAGAGCTCGTTCTCGACGCCCGGGTGCCACGA
+GCCGAGGGTGCTCGGGTCCTCGGTCGGCTCGACGCCGAGGTCGCCGCAGTGGAGGCACTGCACGCGCTCGGGGATCTGGA
+CGACCTGCACGTACTTGTCCTGCATGACGTGCGCGAGGTTGCCGAGCGCGAACGCGCGCTGTAGCGGTCGCCGCTCGCCT
+CGGCGTGCTCGACGAGCACGA
+>generic29
+GTCAAAGCAGACCACATTGATGAGGTTGCCGCCCAAGCAACTCGGCACCGTGTGGGTGTGGCCCGCGCGACTGGCCGCTG
+CCAGCGTGCCCCGGGCTTGGGGCTCAAGCCAAGCGCCAAAGCCGTCGAGCAGCCATTCGCCCCAGCTGCTTTGGGCGTGC
+AGGACTGGCGCGCGCGCGCCGGCTGGGCCCCCTGGAAAGGTGCGTCCGCCCCACAACCCCACGTCCACGCTTTGCAAGCC
+TTCGGCCATGCCCCGTTGCCAGTTCAGATTCAGCCCGTTGTCGATCCAGTCGTCGTTCAAGATGACGCTCTTGACCAGCG
+GCACTTGGGCAAAGCGGTCGAAGTGGCCGGCGCGGGTCAGAACTGCACCCATGGGCACCCGGTCGCGGCCGAGCTTCATG
+TTGAGGCGATCCCCCCGATGTCTTGACGCCAACTCAGCTTGGCCGCTTCCACGTGGATGGGATCGTTACCGTGGCGGCCC
+CAAGCGACGTAGGCACGAG
+>generic30
+GTCACACTGATGCGCTGGCCAATCTGGACCTTGCGTGAAGGCATGTTGACGACCACGCCATTCACACTGACATGCCCATC
+ACGGATCAATTGCTGCATGTGATTGCGAGAGAACTCGGTCGCCATACGGCTCAGCCACCGATCTAAGCGTTCGCCATGTC
+CAGCGGCATCCACGGATTCAACACGGGTCTCAGCATCCCAGATGGGGACACTGCCCTCATCCGTGGCCGATACTTCAGCC
+CATTCCAGAGGGTCATTCATATAATTCGCGCTCTCTTCGGACCAACTTGACAATGAAAAACACGGCCCCATGAGACCGAC
+CACCCTACGACTGACCTTCTTGGGCCAGAGCGCGCGCGGCTTGCGCATGGCCTTGCTTGGCTTCGGCTTCGGGCTT
+>generic31
+GCCCAGATTTCGGGGCCGGTGGTCTCGTAATGGATACGCGGATTGTCGGCATTGGAAACTGGTCCAGCACACGTCCTTTG
+CCGTCACGCTGCATCTGCTCAGACAGATCGCGGGCGTACTCCATGCCGGCGCTTTTGGGTGTGAGAATCAACTCTGCACC
+AAACGCCTTCATGGTCTGCGCACGCTCGATGGACAGGTCTTCCGGCATGATCAAAATCATGCGGTAGCCCTTGATGGCAG
+CCGCCATCGCCAGCGCAATGCCGGTATTGCCCGAGGTGGCCTCAATCAGTGTGTCACCGGGTTTTATTTCACCGCGCTCC
+TGGGCGCGCTGGATCATGGACAAAGCCGGCACGAGTGGTGT
+>generic32
+ATTTGTTTTAGATTCGAAACCCAATCGTCGACAGGTACCTCTGTCTTGGGGACCAGCGTGTTGGCATCTCGATTATTAGG
+CCAAAAAGTACAGGATTGGGCACAGTAACCTCAATTAAGAATCGATTTCACTTTTACAGTCGCTAGAGTGCCATTGTCGA
+GAGTCACTGCATCCAATGGTTCCAGACTGCACCAAAGAGTCGTAGCCTGACACGCATAAGGCAGAGGGAACTGACCAGCA
+TAGACCTCTTGGGACCGTGAAACATCCGAGCCTGCCACGTCTGCTGGTGTTGCCATAGCCACTAAGTCCACATAGCCAAC
+CATGTAGCCTACATCTGCATAGAGTTCTTTTCTAGCGACATTATCAGCCACTAACTGAGTTGGTATAGGACCTGTGGCTG
+AGTAATGAGAATAGAAATGGACTCTCATCCTGGGAGTAATGCTTTTCTTATTCAGAATCACCTGGACCATGCCGATGGT
+>generic33
+AAGGCACCAACGGGACCGTGATCGACGTGCAGGTCTTCACCCGTGAAGGCATCCAGCGCGACAAGCGTGCTCAGCAGATC
+ATCGACGATGAACTCAAGCGCTTCCGCCTCGACCTGAACGATCAGCTGCGCATCGTCGAAGCCGATGCTTTCGACCGGAT
+CGAGAAGATCTTGATCGGCAAGCTGGCCAATGGCGGTCCCTCACGTCTGGCTCGTGGCACCGCCATCACCAAGGACTATC
+TGGCCAGCGTGGAGCATTTCCACTGGTTCGACATTCGTCCGGCGGATGATGAAGTGGCCAATCAGCTCGAATCGGTCAAG
+AACTCGCTGGAGCAAACCCGCCACAGCTTCGACTTGGCTTTTGAAGAAAAAGCGCAAGAAGCTGACCCAAAGGCGACGAG
+TTGCCCGCAGGCGTGCTGAAGATGGTCAAGGTCTACTTGGCTGTGAAGCGTCGCTTGCAGCCTGGC
+>generic34
+GACGAGGTATAGAGCATTTCCAGAGCTCCGAGGGGCCCGTTCCGGGACAGGAAAAGGTAGACCACGGTTCCGACAATAAC
+GGTGGGAACCGCAAGAAGAGCCTGGAGAATCAGCGACAGAACCGTCCGCACCCAGAACCGGGAATTATGAATAAGCCAGG
+CCAGCGGAAGACTGACAACCATGCTGGAAAACGTTGCCAGGATTCCGATTTTTAAGGAAAACAGGAAAATCGCGAAGGTT
+TCCCGGTCCAGGGAAATCAGACGATGAAAAGCTCCGTGAAACGCCGAAATCAGATATTCAGAAAACATTTCTTCTTCGTC
+ATTCCAGCCAAAGCTGGAATCCAGAAAATATCACATATGGGATTCATTGATGAAATCAGCGTTTCAGGGAACAAATACCT
+GGCCTGAGGATGATGGATAAAGATTCCTGAAACAGACTGTTCAGGCACCATTTGAAAGGTTTCAGACGAGTGGTGT
+>generic35
+GCCGACGTGGATGCGGTTGCTCGGCGCAGCGGCGCCGAAGACCGTTGCGGGCACGATCGACGGCAGGGCGGCCGCGCCCA
+GCGCGGCGCCCGCGCATTTCAGGAATCGACGGCGCGAGGACCGTCCGGCGGTGGTCCGATTTCGGTGTGCGTTCATTCTC
+TCGACCTCCTAACGCGGCATCCGCCGCAGTCAAAGCGTTTATTGGCCCTCAGAAGAACCCATGCAATCGCCGTGAACGCC
+CCAGGACTGCGGTCCCGGGGAGGAACCGCGGGAGGACGCCACCGCGACCCCACACCATGCTAGTGTGCCGGACGAGTGGT
+GT
+>generic36
+GCCATGAACTGATGTTGATGTGGCACGGAGGCTTCAAGGCCTCTGTGAACGCATATTCAAGGGCGCTTCGGCGCCCTTGT
+TCTTGTGGGCTTCGGCAGTGACCGCCTTGCGCCCGCATAATCCCCGCCGTTGTCTGGAATCCTGGAAAGAAACATGAGCG
+CCATCGATACACAGAATCTGGGCCTGGTGCCCATGGTCATTGAGCAGTCCGGTCGTGGTGAACGGGCTTATGACATCTAC
+TCGCGCTTGTTGCGTGAACGGGTGGTGTTTTGGTTCGGCCCGGTCAATGACCAATCGGCCAACCTTGTGGTGGCTCAGCT
+GCTGTTCCTTG
+>generic37
+TTTCTGGACATCACGCTGGATTTTGTGTTTTACGCCAGCATTCCGCTGGCCTTTGCCATCGCTGCACCGGCGCAAAACGC
+CTTGCCTGCCGCCGTGCTGCTGGCCGCGTTCATGGGCACCAGTTCCAGCTTTCTGGCTTTTGCCACACTGGCCGCTAAGC
+GGGGCATGCAGAGCACCGCCTACCCGGACAAGTCGTTTACTTTTGGGCGGTTTGACAGAGGCCACGGAAACCTTGGCCGT
+GTTTATGGCCATGTGCCTGTGGCCGCAACACTTTGCCTGGCTGGCCTATGGCTTTGCGGGCTTGTGTGCCCTCACCACGG
+CCACGCGCATCGCCTGGGGATGGAGGGCGTTTCAATGAAGGCCTCACGCTGGCTGGTGGTAGTGGGCTTGTTGGCCGCGC
+TCTCGGCATTCTTCGCACTGGACCTGGGCCAATACCTCACGCTGCACGAGTGGTGT
+>generic38
+GCAAGTATCTTTGCCCTTATGCACGATTCCAAGGGGCCATGTTTGATCATGATACCTTGATCATCACGTATGACACGCAA
+CGAGGTGATCCTCGTGGTTCACGGGGTAAGAAAGTGGATCCCAAAGCGGCTGGTTTGGGTGATTGCATCGATTGTGGTTT
+GTGTGTGCATGTTTGTCCCACGGGCATCGATATTCGTGAGGGTCAACAGTATGAGTGCATCGGTTGCGCCGCTTGCATTG
+ATGTCTGCAATGGTGTGATGGACAAGATGGGCTATGCACAAGGTTTGGTGCGTTATGCCACTCAACATGGTATGGAACAG
+CATCTCACCGATAAGCAATCGCTGATGCGGATTTTTAGACCTCGCGTCTTGATCTATAGCGTTATCTTGGTCGTGATTGT
+GATGGCACTGGGTTACGCTGTCTGGACGCGTGAACCGTTNAAGGTGGATGTTG
+>generic39
+GTCAAGAAAGCTTGCACCACCGGCGTGGCGGGCTCGGCCACAAGGTAAGGTGCCAGCTCCTGCTTCAGATCGGCCTCGTA
+GCTGAAGGGGAACGTCTCAGCGCCCGGCTCCAAGAAGAAGTCGAACGGGTTGTAGACCGACATCTCGGCCACCAGATCGA
+CGCTGACCTTGAACTCGGTGGTGGTTTCCGGAAAAACCAGCCGCGCTTGGTAGTTGGCGAACGGATCTTGTTGCCAGTTG
+ACGAAATGACCTTCGACGAGTGGTGT
+>generic40
+AAATCTTGCCGTCACCGATCTTGCCGGTCTTGGCCGCCTTGACGATGGCCTCCAAGCAACGATCCACATCGACGGTTTTG
+ACCACCACTTCGATCTTCACCTTGGGCAAAAAGTCCACCACATATTCAGCACCGCGATAGAGCTCCGTGTGGCCCTTTTG
+ACGGCCAAAGCCCTTGACTTCCGTCACGGTCAGGCCGGTGACGCCAACATCAGCGAGCGCCTCGCGAACTTCTTCGAGCT
+TGAACGGTTTGATGATGGCAGTGATTTGCTTCATGGCAATTGCTCCAGATGGGGTTATTTGAGGGCCTTGTAACGCACAC
+GCTTGGGCCGCGCGCCTTCTTCACCCAAACGCTTCTTCTTGTCGGCCTCGTACTCTTGATAGTTGCCTTGATAGAAGAAC
+CATTGCGACTCGCCTTCACAGGCCAAGATGTGGGTCGCAATCCGATACGAGTGGTGT
+>generic41
+TAAGTGATTATAAATAATTTGATCGACGATCTCGAACTGAGATTATGTTTATGGCCGTTGGTGGTACACGACTTCTAAGA
+GTCCGTAGTCTTAGCTTTACAGTTGCGTCTGACGACGAAGGACGGCGTACAAGTGGCTGAGGCAGTACACAAAGGAAGCG
+GTGTGTTCTCGTTTCGCGAATAGCACTGGATGTTTATTGTAGAAATCATACAGGTCCTGTAAACCGTAGCTGAATGCTTC
+ATGGTGCTCGTACGCGAGGTCATCGGTAGATTGCATCACATTGTACTTGAAGAACAGGCCTTCGAGGGCTTTTTCAATTG
+GGAGGAGGTAGGCTGATGAGTCCTGGACTTCGAACTGCTGCAACTATTGCTTGGTGTCATCTTATTGCCCTGTTGCGAAG
+GCTCCTTTGCCAGTGACGGTATGGCGGATCTGCAAGATCTCGGGTACATTTAACTTGAGATTCGCATTGATCGCTGCGAA
+GACATCTT
+>generic42
+GGAAGGCACAGACCCGTCAATAGACCTGTTAAATCAACGGGTTGATGAAGTTGTCGAGCAGTTGAATGAAGTCACCGCCC
+ATCAAAACAAAACATCTGGCTCAGAAAAAACCACCAAACAAGCGGCGAATACAATAGCGACTACACCTGTAGAAAAATCG
+GCTATCACTGCCAAACCAACCACCAGCGTAACCCCTGAACCGACAGAGAAACCAGCCATTACCGCCAAAGCAGAAACCGC
+TAAACATCCGAGTAATACGCCTGTCACGGTTGCCGAGAAAAAAGCTGCACCCGAAACAGTCGCTAAAGCCGCACCTGCCA
+GCAAAACGGTTAAAATACAGCGGCTGAACCAGTCGAACCAATAGTAAAGTAACCACAGGCAAGCCAGAAGACACGACAAA
+AGTGGC
+>generic43
+GCCGCGTCTTGTGCGAGCCGTCGCGCTGATAAGGGACCTCCGGCACTCCATGAGGAATCACCCGCACCTTCGCCCCTGAC
+ACGTGGTAGACCCGCTCCAGCAGCCTCGCCGCGACTTTCGTCATCACGATAATGCCTTGGCTGTGGGCCGCCAGGTTTTG
+GATGATGCGCCGTGGCAGCCCCGCGGGCTCGGTCAAGAGCGTGTGGAACGTGGTGACGATGGGCTTGCGGCATTCACGCA
+CAAAGCCTAACACGTCGGATCCCCATTCCCCGGGGTAGAGGCCGAATTCGTGCTGCAAGCTAACCACGTCGCATGGGCCG
+TCGTTGACCGCCTCCGCGGCCCGGAAGTAGGCGCCCGGGCGGCTGTTGTCGATGACGTGAACCACGCGCGGGTCGTCGTA
+GCGAAGCTCGCGCGTCTTCTGGATGGCTGCGACCGAGGACAACGGCTCCGGCGCCGCCATGTCCACAGCGTCCGCCGAGT
+CACGGGTGAACGTTGACGAGTGGTGT
+>generic44
+AATAGATCGAGCTCACGCGCATTTCCTGATCGGCCGTGTACGGCTCGATGGACAGGTCGATGCCGGCCGAGGGAATGACC
+ACCCGCCAGCGCGCCGGGTAGTCGGCGCCCGTGGCCGGACTATGCCAGGTCTGGTCGGAGGTGATGTGTGCATCGCCGGC
+CCTTAGGTAGCGGGCGCTGCCGTCGGCTTCCACCAGAGCGCCGGCCGAGAGTGGCCCGGTCGCGCCGTCCGCCATGCGGA
+ACTGGTAGAACATGATGTCACGGCCGTCGCTCAACTGCAGGCTGAACCAATTCCAGCCGATCACCGACTGGCCTAAGGCG
+CTGGTGCTCCACTCGTGGTCGAACCAGCTCTCGCCGTGCGCCTGGACGGGCTGGCCGTCGATCGTCACCCGGCCCTGAGT
+GGCCATGCGCGTATAGCTGACGTAATAGGAGGCGTTGCCGCTGTCCGGACTTTTCTGGCTCAACACGAGTGGTGT
+>generic45
+GTCTTGTTCAGGTTCGCCTTGGCATGACCCGAGACGGCGTACCACAGACAGTCACCCGCGGCGTCGTGCAAGGGCTCCAG
+CCCCAGCGTGTTCCAAGGGCACGACTACGGGTAGTACGGACGTGACGTCGCGACCTGCGCATGCTGTATCCAGCGCGTCC
+GCCTGCCCCGGCGCAAGCGCAGCACGACCCATGTCCGGGCAGGGCAGATAACCGAACATTTCCCGAGGTCCGTTCTTATC
+GCGGTAAGTGGCAGCGTATCCCAGCAAGGCATCTTTGGCTTGTGCCAGCGCCGCAGCGGTGCGCCGCTCGCGCTCCTGAC
+CCGCGTCACCCAGGCACGCATCGCCAGGAATGCACCCAGAACACCCACACCATCAG
+>generic46
+GAACCGCATGCACCAAAACACCCGCCTTTTCAAGTCCATCAATAGCGCCCAATGTACGCCTGGCGCGCTCGTTCGATGCT
+TTCTTGTCTTCCGTAATTCCCGGCCCCACCACAACAGCCTCATCCTTACTCCCCAGATTAAAACGCTTTACCAACCCCGA
+CCCGAGCGTTAATCCCGATGAATAAACATCCTGCCCCACATAGCCCAACCCCTTATCCATGTAATTCCTGCGAATCGTCT
+GCAGATCCACATTCTGCAATGTCACAATAATCCCCGCGCGCTCCGCTTCATCAATCAGCGGCGCCAGAACATTTGCCCCC
+GGATGCCCCATCATGCAAATTGCATCCGGTTTTTTCCGATGGCCTCTTTAAATTGCACAGCCATCTTTGATGTATCCCAA
+TCTGACCACACAAATTCAATCGATGGACCCAAATCATTCATTGCCGCAACCGCACCTTTATGCACCGTCT
+>generic47
+CGGTGATGAAGGACGGCGTGGTGCAGCAGTTTGGCCGCCCGGATGACATCTACCGCCGCCCGGCCACCCGTTTGTGGCCG
+AGTTCATCGGCTCACCCGCCATGAACCTGATCGACGGCAGCGTGGGCCTTGACCGGGCCTTGATGCATGTGTTGGTGCAT
+GGCACACCCGTGGCCCTGCAAGACGGTGCCCAGCGCGTCGTGCGGGTCGGCCAAGCGCTGAGTTACGGCCTGCGGCCGGA
+AGATGTGGTGGTGAACCCCGAGTAACGGCCCGGGCTTGGCGGGTGAGATCACCTTGGTCGAGCCCACCGGCCCAGAAACC
+TATGTCAGCGTCGATACCGCCGTGGGCGTGCTCGTCGCCCGCATCCCCGGA
+>generic48
+GAGCGGCGAAGTGCAAGAGTTTGTCGGCGGTTATAGCGGCTGGTTACGTTATGATAATGAAAATAAACAACAACTTACTG
+CGGCTGAGAAAAAACAGAAAGCCGCTGAAGTTGAAAAAATCTACCGCCTCCCCTGCTACTTATTCGACTAAAAAAGGAAG
+TTAAGTTACAAAGAACAAAAAGAACTGGAAACTTTGCCTGATGTAATTGCGAAGTTAGAAGCAGCTCAAACCCACATTAC
+TGAACAAATTGGCAACCCCGCTTTTTATCAACAAGCTCCAGCAGTCACAGCAAAAGTGTTGGATGAATTAAAAGTAATTG
+AAGAAAAACTAGGAGCAAGCGTTTGATCGTTGGAACGAATTAGAATCTTTAACTGAAGAAATAGGATAAATCTTGCAAAA
+AAGCGTAAGTTTCACTATGATGGTGGGCTGTTCTTTGACGAGTGGTGT
+>generic49
+GCAATATTTGGATGACCGTTTTGTTGCAGCAATGGATTTGCAGGAAATAACCACTCAAAATACGAAGCTTTTAAATTTAG
+GTACGGAGGACTATTGAGGAGTATTCAAAACAGCACCGTCACGCCAGTGCATGTGCAATATTTGGAGTGACCGTTTTGTT
+GCAGCAATGGATTTGCGAGGAAAATACTCCGCAACATGCGTTTTATTTGGTGCGGGCAGTGACTAAAGGGGTTTTCACCA
+ATCCACCGCCTTATGCTGAAGATATGTATCGCCACGAGTGGTGT
+>generic50
+GGAAGCAGCGCTCCGCGATCGGACGATGGGCTTGGTCCGCGCGGAGGGCGAGGCGACTGCGTTGGACGCTAACGAGCGCG
+ACGCCGTGGCGAGCCTCTCCGGCGGGCAGGCGAGATTGGGGCACCAGCTTCGTGAACTAAGTGGGCGGTTGGATGAGTTG
+AAAGGAAAAATGGAGCGTAATCATGCCGGAGATGCGGAGTCGGCGTCGCGCCTCGCCGCGTCGGGCGACACGCTTCGTCG
+GATTGCCGCCGGACCGATGGGCGAGGCCGTCGTACGCCTCGGTCGTATCCATGAGCACGCGGACGTGTCGTCGCAGCAGG
+CCGACCTTACATCCGCGGCGCGGGCGGAGGAAGAGGCCTACGATCAACTCAACGCCCTCTTCGTGACGAGTGGTGT
+>generic51
+GGAAATGTCATGAGAGCTTGAGTGCAGCGAAAACTGCTACTGCTGCTGCTGATGTTGCATGAAACTGTCCGAGTAGTGAG
+ACTATTTCGAGGGAATAATTGCGGTTGCAGGCGTGAGAAACCCTTTGAGTTTCGATACAAAAGTGCAGCGATCGTTCTTC
+AATGTTTAAGGGGCTTGCGGTGCATAGCAGGTGGCTTGATTGTTCAGGATGTTAGAAGAACCAGAAGAAGAATCTTTCCC
+GATGACAGCTACCTAAAGGATAAATTGGCAAGGGATTAGAGGGGTAAGGCATGTGGGTCATCTTTACTGTCTGATTGAGG
+TGTGTAGAGGGCTAGCTC
+>generic52
+AGCATCAAAACGCGGCGGCTATTCAGCTTTGCCAGTGTGGGCATTGAGGCCCGTGGCCGCACCCATTGGTTGCGGACCAA
+CTACCGCAACACGTCTGAGGTTCTGGCCGTAGCGATGCGTTTGGCACAAGCATTGCTCGCGATGCCCGACCCATCCCAAG
+GCGGCGGCGGGGCGGCGATGGAGGCGGGCTCCGACGACAGCGTGCAGCGCATCCTTCCTGCCAGTGGTGGTCGGCGGGGT
+GCCTTGCCGCAATTCATCGAAGCGCGTGATGCCGATACCGAGGCCATGCTGATTGCGGATCGCCTTGCCCGTGCCCATGC
+CGATGGCCATGCTTTGCAAGACATGGCCGTGTTGTGCCGGGCCAAGTTCCTGATGCCGCCGATCGAAGCGGCCTTGGAGC
+GCAAGGGGTTGGCGGTGCAGTCGATGGGGCAGCGCGGTTTTCAGCACATCGATTGGCACCAGCCCAGC
+>generic53
+CACCAACGATGCGCCCACAACGCTGACCCGGCTGCAAAACATGGGTGTGGCCCCGTTCAACATTGCCTCCAGCATCATCT
+TGATCACCGCCCAGCGGCTGACACGGCGGCTGTGTGAAAGCTGCAAAGTCCCTGCCGACTACCCTAAGGAAGCCATGATA
+CGGGCCGGTTTCAAAGCCGAAGAGCTCGATGGTTCGTGGAAGCCCTACAAGGCCATCGGCTGCTCCTCGTGCAACAACGG
+CTACCGGGGCCGGGTCGGTATTTACCAAGTCATGCCGATCTCTGAAGATATCCAGCGCATC
+>generic54
+CGGCCGAGATTTTGGCCACGCTGCGTTATCGGGCTGAAACCTGAATGGGGAAAACCGTAAACAAGCATTTCAAATGGAAT
+GCGTTTTATTTATCTGGATACCCAGAACATTACCGGAGGTAAACTGTGGCACTCAATTTAGATGGCAAAAAAGTCGTCGT
+AGAAGAAGTTGCTCAATACGCCGCTAAAGCCCATTCTGCTGTTGCGGCAGAATATCGTGGTTTAACAGTAACGGAATTGA
+CCGAACTGCGTAAAACGGCGAGAGAAACAGGCGTTTATTTGCGCGTGGTAAAAAATACTCTGGCGAAACGTGCAATAGCA
+GGTACTGAATTTGAATGTATGCAGGACAGACGAGTGGTGT
+>generic55
+CCACGCCGTGGGCCCGGCCCTCCCGCACGAGCTGGGCCGCCACGCGCATGGAGCTGTCCTTCTTCTCCTTCAGGACGCTG
+GTGGCCTTGTCCTCCATGGTCACCACGGAGGCCGCATGCACCAGTTCGACGCGCTGCGACAGTTCGCCGGCGAGGCCGTG
+TTCAGGCAGCGACGCCTTCAGCCGGGCCTCGTCCCCCACCAGGAGGAGGACGAGGTCCGGCCAGGCTTCCAGGGCGAGCT
+TCGCGCCAAGCAGCGTGGACTGGGGGGCGTGGTCGCCCCCATCACGTCCAGCGCGATCCGGGCTGAGGCCAAGCGTCGCG
+GCCCTTAGACCGTGGCGACGTTGACGGCCTTCTTGCCGCGGTAGAAGCCGCAGGAAGGGCACACCCGATGGGGCAGCTTG
+GCGACGCCGCAGTTCGGGCAGCTGGAGGCGCTGAGGACCTCCAGGCTGTCGTGGGTGCGGCGGCGGTCGCGGCGGGCTTT
+GGAATGGCGGCGCTTGGGATTCGGCAT
+>generic56
+GCGAGCGTGCCCTTCCCGTCGCGCCTGGGCACGCCTGCGGACTACGCCAAGCTGGTCAAGCACATCATCGAAACGACATG
+CTCAACGGCGAAGTCATTCGCCTGGACGGCGCCATTCGGCTGGCTCCACGCTAGGGCCAAACCGCCGCGCCGAACACGTT
+CTTCGCAACCAGGAGCCTTCCATGCGTCTCCCGTTTCACCTGGTCGGCTTGCTGCTTGTCACTGTACAGGGCGGTGCCTG
+GGCCCAAAGCGTGGCCGACGCCCCCGCATTGCCCGAGAGTTCCACCGCCTACGTCAGCAAGGCCGGGCAGGCCACCCATT
+CGTTTGCCGTGGCCGCCGCCAACCCACTGGCCACCGAGGCTGGCTACGAGTGGTGT
+>generic57
+TCGACGACCACCTCATGGGCATCTCCCATGTCATCAGGGCCGAGGAATGGCTGAAAAGCATGCCCAAGCACATCTGGATC
+AATGAGCACCTAGGCTTCACCGCGCCGGAATATGTCCACGTCGGCCTGTTACGGAATGCCGACAAATCGAAAATATCCAA
+ACGCAAGAATCCCACCAGCCTGCTGTGGTACCGTCGCCAGGGTTTCCTGCCCGAGGCGCTCTTGAACTTCCTCGCCCTTT
+TGGGCCATTCGCATCCTCAGGGTCTGGAAAAATTCACCGTCGCCGAGATGGCGGCATTCTTCGATCTCGATCGCATCAAC
+GTCGCCGGCCCGGTGTTCGACCTGGCGAAACTCCGCCACCTCCAGGGCCTCTATTTCCGTGAACTGTCGCCGGAACGGGT
+GCGTGCCGAGGTCCACCGCGCCATCGACGAACGCTTCGACGAATTATTCCCGTTGCTGCAGAAGCGCATGAGCACCGGTG
+GCGATCTGCTCGCCCAGGCAC
+>generic58
+TGGCGAGCAGTTCTGCCTCGCTCATGTCTCTGCCGGACTTGGTCTTGGAAGAGGTCGCAGTCTTGGTGTCAGGCTTGTTC
+ACGGCGCGTTGATGAATTGGAGGTTAGAGGGGCTGTACACAATGTACCGAAGTCTTTCGGGATGGGTCATCCCGTGGGGC
+GCGCGGATTGTAGCGATCTCGCTTTCAGGCTTGCTTGATCCCGCCGGGTTTAGGCCAAACACTGTGTAAGACCTTGTTCA
+AACAAATCGCGTGGCAAGTTGATGCCGATAAACACCATCTTGCTGACCTTGGGCTCGCCTGCGGGCCAAGCTGGGCCGAG
+GTCGCTGCCCATCAATTGATGCACGCCTTGGAAGATCACCTTGCGCGCTGTGCCCTTCATATTGAGCACGCCCTTGTAGC
+GCAGCATGCGCGGCCCGTAAACCTGCACGATGCCGCCCAAGAAATCCTCTAGCTTGGCGGGCACAAAAAGCGCGCTCCGA
+GCGGAA
+>generic59
+CGGCAATCTTCGTGGCTGGGCGGCGCATCCATCACGATGAAGGATTTCGCCGGGGTCGGCCAGCAGAGATCGGCGTTTTG
+ATCAATGCGCAAATAGCGCCGGAAGCTGGCGTCCGCACTGGCCAGCCGTAGCGAGGTCGGATCAAGGCGGTAGATGGGCG
+CTATCTCGGTCAGCCAAGCCTCAAAAGCAGCATGGCGATCCGGATCGGTCCAAGACACCGCCAGCGGCGAGGTGACTAGG
+CAGTCAGCAGAGACATCGGGGAGGAGCGTCGGATTCAGGTTCACGGTAGATAGCCCGGCGGAGTGGGCGACCGGGCGCAT
+GAAATAATCGAAGGATTCTAGCGAGCGCTCCCTGTGTGGCCGCTCCGCCCTTCCGCCATCCCCGCCCCACGCGCCCACGT
+CGATCTGGATCTGTGTTGTTCCCTCCGCTTCGCTCTTGGCTACGCGCCCTTTTCTGGCCTGCTGGGCTCCATGCCGCCAC
+AACGCC
+>generic60
+AATACAGCCAAAGCATGAAAGAGAAAGAGGAATTATTAAGAGAAATCTTGATTTAAGTGTAAAATGTAAAACTTGATTCT
+AGTTCGAATCCATCCTCTCATGACTTGGATGAAAAGAGTGAAGAACACAATCAGAATGCGCTTGCAACGCAGTATGGTAA
+TTAGCGTTTCCTCCAAAGGAAAAGGGTGCAGCAAATCATCTTGAAGGAGAGTTTGTTCTTGATAAGGTTATGAGTAAAAA
+CTTTGAAGCGAATTAATAGATATACACGATATGCATCACAGGTGGTCCATGTGCAGGTAAGACCTCTGGATTAGTATTGT
+TATCTGAGAAATTACGAGATGAAGGCTTTACAGTTTTTACTGTTCCAGAAGCAGCCACTATGATTGCTAATGGCGGCACG
+AGTGGTGT
+>generic61
+CTCGATCACGCGGTCAATGTGATCCACCGCCACCACGAGGCCCAGCAAGAGGTTGAACCGCTCCTCCGCCTGCCGCAGCT
+CAAACCGCGTGCGCCGGCCCACCACTTCCCGTCGGTGCGAGATGAAGTGGCTCAACAGATCCCGCAGCGGCAAAACCTTG
+GGTTGCCCGCCCACAATGGCCAGGTTGATGACGCCAAACGTGGTCTGCAGAGGCGTGTGCTTGTAGATCTGGTTCAGCAC
+CACCTCACCCATGGCGTCACGCTTGAGCTCCACCACCACGCGCATGCCGGTGCGGTCGCTCTCGTCACGGATGTCACTGA
+TGCCTTCCAGCTTCTTCTCCCGCACCAGCTCCGCCATGCGCTCAATCAGCTTGGCCTTGTTCACCTGGTAGGGGATCTCG
+TCGATAATGATCTGTCCCTTGCCCTTGGCATTTTCCTCGACGAGTGGTGT
+>generic62
+CTGCCGATTCCCGTTGCGCGAATGTTTTTATTGCAGCTGCTGCGATGGTTACACAGGAGAATCATTGAAGTTCGAGCTGC
+TACAGTCGTAATTATTAGACTACCCTTGGCCCTCAATATTGTTTGTCTCCAATCTATAGGGTGAGTTCGGTCTTGCTGCG
+GAGGTGGTGGATGCTGTCGAAGGAGATTTCGATCCATTATGATTATTTTCGTATTATTGTACCGCAATGATTGCTAGTGC
+TGCTGCGGAAACGAAGATGACGACTACTGCTACTGCTGTTTGCGGCTATTACGATTGTTTCGAGAACGTGTAGATGAGTT
+CGATGGAGATCGGCGACGGAGATTACTGCTGCTGCTGCTGCTACTTGGTGAGGACATGTCATTTTAATTCCTCGAGTTGT
+AACTATTCTGGTTATTGTTGTGAAAGTTCCACGAGTGGTGT
+>generic63
+GTGCTGCGCCAAGCCTGTGCCGAAGCGGTGCGCTGGCAGCGTGCCGGTCAAACGTCGATCTCCTTGGCGGTGAATTTGTC
+GGCCTACCAGTTTCGACATCAGAACTTGTGCCAAGTGGTCGCGGCGGTTTTGGAGGAAACCGGCTTCCCACCCGAGCTGT
+TGGAGCTGGAACTGACCGAGAGCATCTTGCTTCAGGACGACGCTGGCATTGAAGCGGCCATGCAGTGCTTGCGCCAATTG
+GGGGTGCATTTCACGGTCGATGATTTCGGCACCGGCTATTCGAGCCTGAGCTATATCCGCCGTTTTCCACGAGTGGTGT
+>generic64
+CTGCTCCTTCGCCTCCTTGAACAGGCCGTCGTCGAGCTGCCGGCGCGCGGCGACGCAGCTCCTTCTGGTACCGGCGCTCC
+TTCGTCATCGCGTCGAGCAGCGCCGCCGCGTCGGCCCGCACGTGCCCGTCCGCCGAGGTGCACGCCCGTGAGCTGCGCCG
+TCGCCGCCTCCCAGTCGAGTCCCTGGATGAGCTCCTTGCCCCGCGCGACGTCACACCCTTGAGCGGGAGTCGGCTGCGGG
+TCCGGTGGCGGCGCGGCCGGCTTCGTCGGCTCCACGGCTCCACCTGCACCACTCACCGCTGGCCGCCCCAGGGCCCGGAG
+CTCGTCGAGCGCCTCGACGGCCTTCGGACACGGCGTCGCGCGGATCCGGCACAGCCCGGCGAGCTGCTCCGCGCGCGTGT
+AGTCGTGCGCTCCCATCGCGGCGCGCACCTGCGGCATGATCCTGTCCTCGAGGTCGTCCATCGGCGTCGAGGCCGCCTTC
+TTCTCGTCGGTCTCCC
+>generic65
+GCCAAACATTGGGGCTAGACGTACTTCGTAGCTAGCAAGGCGGAAATCCACCAACTCCTGCAATAGCGCTGCCAGCTGCT
+CAGTCAGCACAGTCGGTACGTCCTGTGCGAGGCGGAACACATCACCCGCATCTCCTCGTTCAACACGGAAAGCACGTTTG
+CACCCGCTGCCCGGTTACCACCGATCCAGGCGTTGACCGGGTTCTTGCGCCAATAGGTCGCCCAGGCGGTCGAATCGCCC
+GCCACACCGGCACGAGTGGTGT
+>generic66
+GTCGGCGATCATGTTCTTCATCAGCACGACATTGCTGGTGAGGTATTCCTTGATCGGAGCCGGGTTCAGCTTGACGGTGC
+AACCAGCGGCCGAGCGTTCGGCCGAAGCGTCACTCAGCTCAAAGGCTTGCTCGACCTTCAGATCGGGCAGACCTTCGATT
+TCGTAGGATGCGGCCTGAGAAGACGTTTTCTTTGCCGGCCTTGGCGACGGTCAGCAGACCGGCCTTGATGGCGTAGAGCG
+GAATGGCGTGCACCAAGTCGCGTAGGGTGATGCCCGGTTGCATCTCGCCCTTGAAGCGCACCAGCACCGATTCAGGCATA
+TCCAGCGGCATCACGCCGGTGGCCGCACCGAAGGCCACCAGACCGGAGCCAGCGGGGAAGGGAAATCCCGATCGGGAAAC
+GGGTGTGCGAGTCGCCGCCGGTGCCCACGGTGTCAGGCAGCAGCAAACGACGAGTGGTGT
+>generic67
+CGGCGAGCGTCTGCTGCCAGCCGCGCACCCGCGGCGCGACGATCAACTCGTCGACTGCGGGCAGCCCTCGGACGACCTCG
+GCCGCGGCGGGTTCGACGACGTAGGCGAGGTGGGCGTGGGGAAAGTGATGCTTGAGGGCCGCGACAGCGGGCGTGGTGAA
+CACGACATCGCCGATGAGCCGCAGGCGAACGACGAGGATGCGCCGGATGGCGGCGCTGGCCGGGCCCGCCAGCGCAGGGC
+TGGGCGGGCCCGAGGCGCTACGGCTCAACCGTGGCCTCGTCGATGAGCATGACCGGAATGTCGTCCTTGATCGGGTACAC
+CCGGTTGCAGGCGTGGCACTTGAGCGCCGTGTTGTCCTTGACGAGCACGACCGGGGTCTTGCACTGCGGGCACGCCAGAA
+TTTCGAGCACGAGTGGTGT
+>generic68
+GGCGAGGTAAACTTTTCTTAGCCGGTCAAGTTCCTTCACGCCTTGGATGCCGGGACGGGACTTGACCGGCGAGGTAAACT
+TTTCTTAGCCGGGGCTATCCCCGCGGAGGCAGCTTGAACTCGATGATGAAGAGCGCGCTGGTGTGGATCGGGATCATCGC
+CCTGGTCCTCCTCGCGCTGCGTCAGATCCCCCAGAACAATCACACCCAGGAGATCCCCTTCTCCACCTTCTACACCGAAG
+ACGAGTGGTGT
+>generic69
+GGTTCAACAAGTTTAATGTCCGAACTAGGAAAAAGATTGGATCGCTAGGTTTGGCTAATAAAGAAATTGAAAACAATTCA
+AAGATTTATGTAAGACTGCTAATATTGTTGGTAACATAAAAGTCCATATTAGATTAGAAGTTTTCGCGGATAAAACCTTT
+AAACTAAGCATACATAAATGCTCAGGAGCTTCGGCTTTAATTTTACAAGAATTGGGTTTAAAATCTGGTTCAAAAAAGTT
+GGACACGATGCCTCGATAGCTATATTAAGCGACGAACAGTTAACAAATATCGCTATAAAAAAATAGGCCGATATGGGTAA
+AAATGAAAATCAAGACTCAATTTCGTATTTAAAAGATTTAAATGCCGCTAAAAGAACCATTGCCGGTACCGCAAAATCAA
+TGGGTATAGATGTGTCATCAGTAATGGAGACACAAAAATAGATGAAAAATAAAACGAAGT
+>generic70
+AGGAGGCCGAAGACGACCCGCAAAGCCGACTCATCAACGAGCGCAGCCACGCCAACATCCAAAAAGAACGGCACCTATTC
+GGTGGTGCCGCGCATGTGGGGCGGCGGAAACCAACGCGGCCGATCTGCGCCGCATCGCCGATGTGGCCGACAAATACGCC
+ATCCCGACCGTCAAGGTCACCGGCGGTCAGCGCATCGACTTGCTCGGCGTCAAGAAAGAGGATTTGCCCGGCGTCTGGGC
+GGACCTTGGCATGCCCTCAGGCTTTGCTTACGGCAAGTCCACCCGCACCGTCAAAACCTGCGTCGGCAGCGAGTGGTGCC
+GTTTCGGCACCCAGGATTCGACCGCGATGGGCCAGCGGCTGGAGCGCGCGCTCTGGGCGATGTACGCCCCGCACCAAGGT
+CAAGCTGGCGGTCTCGGGCTGCCCGCGCAACTGCGCCGAAGCCGGCATCAAGGATGTCGGCGTGATCGGCGTCGATTCGG
+GC
+>generic71
+CTGAGTTGACGCCAAGTCGGGCGACCGTGGTTGCACTGGTCCGCCCGCAGCGTGGTTTCCATATCACGCAGTAGGGCATC
+CATCTCGGGCAGCGTGAGATGGCGATGCGCCCGAATAGCGCCGTGGCAAGCCATGCCGGCCAAGATGTCGTCGTGGGCGC
+GCTGAATGTGCTGACTGGAGGCGTGATCCATGAGATCACTCAGGACCGAGCGCGCCAAGGCCACGGGGTCCGCCTGTGAT
+AGTGCTGCTGGGCTGGCCCGCACGGCCAAGCGTCCCGGGCCGATGGCGGCAATATCTAACCCCAGCTGTTGCAAGGTCTC
+GGTCTCAGTCTCGGCGCATGTGATTTCGGTGGGAGTTGCCGCAAAAACCG
+>generic72
+CGCGTGGCTGGCGGTCCTCCTCGCGCCACGGCTCTGGACGGCGGGGCGATGGCTCACAGAGAGGGCGAAGGTGAAGGCGT
+TCTTCGACGCGCACCCGGCGTGGCGACCCACGCGGGCGCTGGCGGAGACGGTCTGGCCGTGGGCGGCGCTCGCGATCGTC
+GTCGGGTTCTTCTGCCTGCCCCTGTTCCACAACCTCGGCGAGCCGGAAGCGCGCAACGACGAGTCGATCTATTTCTACGC
+GGTGGACAAGATCCTGGAAACCGGCGAGTGGCTCACGCCGCGCTCGGTCGCGGACGACACGCCGTTCCTGATGAAGCCGC
+CGCTGAAGTTCTGGATTGTCGCCGGGGGCATGCGCTCAGGGCTGCTGCCGCGGGACGAGCGGGGCCAGCGGTGGTTCGAC
+GCGTTGTTCGGCGCCATCGGATTCGGGTACGTCTACTTCCTGGGTCGGCGGCTGGCGGGAGTCGATCTGTGGCGTGACCG
+CCGTGTTCGTCTTGTTCACGCTCGACCCGTTGCTCTTC
+>generic73
+GTCAACACCCACGGCATGGCTGCTGAGACGGGCTTGGGACTGGTTGGCTTGCAAGCTGGGATGGACTGATCAGTCTGTCG
+TTTGCCGCGCTAGACCCGTTCTACATCCGAAATCTGCCGCCGAGTTCGGCTGGTTGATACCGACGGCCAGATCGTGGCCT
+TCTGTACAGGGACCAAAGCCGCTCGCATTGCTGGCAAAGAGCGCAACGGCATGACTGGCGATGCTTGGACGCCCATTGAC
+ACCGCAGCAGCCAAGGCCTTGACGATCACGGGATCGAGGGTTTGACGTACAAGCTAGCGACCGAACTGATGCTGGGCGGC
+AAGTACCAAAAGACAATCACCCAGCAATTGCTCGACGACGATGGCGATGAAGGTGTTGTCGTCCTTGCCCAAGGCGTGAC
+ACGCGGTCAAGGCAAGACGGAGGGTAGTCACGAGCGCCGCATTCCGATTTCCAGAACCATGCGCGTTGCGTTACGAGTGG
+T
+>generic74
+GGGGGTATCTTTAGTCTAAATTCTCTAATTTGAATAAACTACAGCCATGTAATTTAAGTTTTAAATACTACTTAAAATAG
+AAGAATACAGGGGTACTAATCCCTTTTAATGAAAGTTAAAATTATAATTATAAAAGATTAGATTGAACTTGGAATTTTTA
+ATTTATTCTAAAAAGATTATGTGTTTCTAAAAGTCTAACCGCAGTTGCTGGCACTTTTTTACTTAGATAATAAGTTCTTA
+TTGTTTAAAATAAATACGAGTGGTGT
+>generic75
+CTGGTGTATCAACCTACGCCAAATCGTGTGGCGGTGGGCGGTACGGAAACGACTGTTTTACTATCAGTTTGAGTGACGGT
+ATTGCGCCCGCAGTGAGCGATAACAGCACTACGGTAGTATCAACTTCAATGAATGATGCTCCTGTAGCATTCAATGATAG
+TTTAACTAGCATTGAAGATACTGTTGTAATTTATAGCGCGGTGCAGTTGTTAGGCAATGACAGGGATGCGGATGGTAATC
+TGTTGACTATTGCTTCCGTTACCAGTGGTTCAGGTGGTGCGGTGGCATTGAATGCTGATGGTAGTGTTATTTTATTCCCT
+ATAGTAATTTTAATGGCGCGGCAGTGACGAGTGGTGT
+>generic76
+CCAGGCTCTATGCCAAGAAGTTCTATTCCCTGGTGGTTCATCAGGTGCTGAATCGCTGGATCGGACAACGAAGTGAAAAG
+CTCACCGGACGGCCCTGTTTCAAACTCTGCCGCTGCCGGCCGATCTGGAGCCGATCTGGAACTGGATGGGATTGGCATGA
+GTTCAGACAAGCGACTCACCGAAGCGCTGGCAGCGGCATTTACCAATCAGCAAGCGGTTTTCTGGCACGACGTTGATCAA
+GCGTTCACGGCGATGCTGCCCCATATGGATCTGGGCGAGCAGGTCGAAATCGTGCAACTCGATAAGCGCGCGGCGCTGCA
+CGTCAAGCTCGATGTCGAGGCCGACTTGGCCGCCGGTGGCCAGCGGCGCTGGCTGTTCTATAGCAACCAGCCCGAGCCCG
+AACCCGCCAAGGACTGGTTGCTGGATATCCACGAGTGGTGT
+>generic77
+GCCGGATTCATCCCGCTCTTCTCGTTCGGGCTTCCCACCGCGCCTTCGATGGCGGTGATGCTCGGGGGTTGATGATGTAT
+GGCCTCCAGCCCGGACCGATGCTCTTCGCCCAGAATCCGCAGTTCGTCTGGGCGGTGATCGCCAGCATGTATATCGGCAA
+TGTGATGCTGCTGGTCCTCAATCTGCCGCTGGTCGGGATGTGGGCCAAGATCTGCAGAATCCCCTTCTATATCCTGGGGC
+CGATGATCGTCTTTTGCGCGATGATCGGGACCTACAGCATCCGGTTTCAGGGATTCGATGTGTGGGTAATGCTCCTCTTC
+GGGGTGATCGGGTACTTCATGCGGAAGCTCGGCTACCCCGTAGCCCCGATGGTGCTGGCGAGCGTGCTGGCGCAGATGCT
+GGAGACCTCCATGGGGCAGGCCCTGCTCATCTCGCAGGGCTCTCCGCTGATCTTCTTCATCCGTCC
+>generic78
+GTAGCGGCGAGTCGTCGTCCAGCAGTGCGCCCAAGGAATAGAACGGCAGCAGCGGTGTCTGTCGATGGGACGCTTGCCTC
+GGCCCCTGGCGCAGAAATTCCTGCCAGTCGAAGCCCTCGGCGATGGCATCGGCCGCATCCCATTTCTCCGGCTTGTCGGC
+CGGCGGCTCCAGGATCTGGCAACTCGCCGCGCCTGCGTCCAAGACCGCCCTGGCGACCCGTTCGGCATAGTCCCAGCCCG
+GTTTATCCTTGTCCGGCCAGATCAGCACATGCTACGAGTGGTGT
+>generic79
+AGCGGCGTTGCAAGGATCATCCTATCTGCGGCTGCCACGGATCATGCACTGGTTCACCGGCAATATTGGATTTCACCATT
+TGCATCATTTGGCACCACGCATCCCCAACTATCGTCTCGCTGACAGTCAGAATGCGTGCGCGCCCCTGCTGCCGACCGGC
+AACGCCATCGCGTTCTGGCAGGCCTTTCGCGCCTACCGCTTCACGCTGTGGGATGAGGAACGCAAAAGAATGGTGGGATT
+TCGCGAGATTGGCGCCAACCCGCCTAAATGATCCGGGCTGGCGGTGACCTTGGGATTGAGAGGGCGCGTTTTTCACCACC
+AAGTTAGCCGGCGGCCGGGGCAATTTTTCAAAGGCCATCGTGAACTTCGTGGCTCGGTGGTAAACAAATGCGGAATTGCG
+GGCGCCGCCGGTATTGGTTCGAGGCACCCCACTGTTCACCACGAAGGCACGAAAACCACGAAGCCCACTGCCGGCCGTGC
+AGCTCTTCTCGGGACCTTCTTCACGAGT
+>generic80
+GCCAACATCACGGCCTTCAAGCCTGAGCCGCAGACCTTGTTGATGGTCATGGCTGGCACGCCTTGCGAGAAGCCGGCCTT
+GATCACGGTTTGGCGCGCCGGGTTTTGACCCGAACCCGCTTGCAGCACTTGGCCGAAGATCACTTCGCCAATTTGTTCGC
+TGCTCAGCTGGCTGCGCTTGAGCAGCTCACGCAACACCACAGCGCCCAAATCAGGCGCGGCCACCTTGGCCAAGGAACCA
+CCGAAACGACCCACGGCTGTGCGGGTTGCGGCAACGATCACGATATCTGTCATGGAAAGTCTCCTCTTGATGGGTCATCA
+AACTTTGTGTTTGACATACCGACCCGGCGCTGGTTCGATCGGCCGATATTGGGCCGTGCCGGGTGTCTTGGGTGCCGGCT
+CCAGAGGGCCGGCGTGCTTGGCAAGCCAGTCAGACCAATCGGTCCACCAGCTGCCGGGATGCTCGGTGGCGCTGTCCAGC
+CAGTCC
+>generic81
+GTTTCGCATTTTGTCATTTCTTCCGCATATTCAAAAATATCCAATTAGGCAAAAAAATATGGTCCGGTGTTGCACTTGTA
+TTTTTATCTGGCACTTTTTTCTGACTGTTGTCACCCGGATTGTGTTTTTTCTATTTACGTGAGTTTTGTTCCAGCATACC
+CCTCTGGGAAACTGTCACCCCCCTCCCCCTGCAGCCCCGCCTAAGTTGTCACCCCCGAAGTTGTCACCCCTTGCGTCCCC
+GCCAAGTTGTCACGTGTTAGTTTCCCGGGGGGGACACTTTTTTGACTGTGCTTTTTCCCCCAACTTCACACTTTTTGTAC
+ATTAATTAAAATAGAAGTCCCCGGGGCTCTTTTGCATCTTGTAGCGACCTCGATGGAGCTCTTTTGGGGTTTTTGTCCTA
+TATTTTCCCATGCATTTTGGGTATCATTTTTTGCACTTCGCTTTTAGACCCGGGGGCTTCTATTTTCGGGGCCCTTTTGG
+GGGTGGGGCTCTATTTGGGGGCTAGGGTGTGGTATTCCACGAGTGGTGT
+>generic82
+GTGGGCCTCGCTGAGCCTCTTCGAGACGCGTGATGGGATCGTGCAGTCCGACCGGGTGGCGGCCGAGTGGGTCAAGACCA
+ACGCCCCGGGCATGGTCTCCGGCTCGCCCGAGATCACCGAAGGCCTCGTCGTCGTGAAGTGAGGGCCAGGACCCCCCGTG
+CCCGAAATCCACTCGACAGAGCAGCTCCTCCAGGTCATCGCGCTCGCCTGCGCGGTGCTCTCCCTCCTCATCGGCGCCTG
+GTACCTGGTCCGCCGCCCCACCTCAACCAGGTGACCAAGTCGATGCTGCTGCTCGGCCTGGGCGTCTTCCCGCTCATCGT
+CTCGCTGACCGGCAACATCGCCAGCTTCGAGTACACGCTGACGCGCCCGTTCTGCGGCTCCTGCCACGTCATGGGCCCGT
+ACCTGCGCGACGCCGAGGACCCCAAGTCGAACAGCCTGGCGGCGCTCCACAGCCGCAACCACAAGTTCGGCGAGACCAGC
+TGCTACACCTGCC
+>generic83
+TTCGGCGATGTCGAGATTGCCCGCCCGGGCCTCGCAAACCCCTTGAGCCAGCAGCGTCTTGGCCGGCTCACGCCACTGGG
+GCAAGGCCAAAACGGTATTGAACTGCACGGCGGCTTCCGGGTAACGCTTGAAGCGGCACAAGGTCCAGCCGTAGTTCTGC
+AAGGTGTCACCGTCTTGTGGGTTGATCTGCAAGGCACGCCGAAGGGCTACGTCATCGGCCAAGCCGGGCTCACCCAAGCT
+GGCGTAGATCAGACCGCGCAAGTTGTAGGCGGGCACGTTGTTCGGATTGGCCTGCAAGGCGCGCTTGACTTCATCCAGCG
+CCGTGGCCGTTTGGCCTTGAGAAAAATAAGCTGAGGCCAACTCTAGGCGAATGCGCGAACGCTTATCCACATCGGTCTCA
+TCCGACGATGTGACCAGATCAGCATGCTGACCGCCGTTGCCATCCGCCGAAGATCCGGAACCCGAGACGAGTGGTGT
+>generic84
+CCGGTGCTTAAAGCATTGGATGACATCGGTTATGAGACACCCTCGCCTATTCAAGCGAAAATCATCCCTTTCATGCTCCA
+AGGCAAAGATGTACTGGGGCAAGCCCAAACCGGAACAGGTAAAACTGCGGCATTTGCGTTGCCGATTCTGTCCCGTATCG
+ATTTAAAACTTAAAGACCCGCAAGTGTTGGTGTTAGCTCCTACGCGCGAACTGGCGATTCAGGTCGCCGAAGCGTTTCAA
+GGCTACGCGGCGCGGATGAAAACTTTCATGTTCTGCCAATTTATGGCGGACAAGATTACAACGTGCAGTTGCGGCAATTT
+AACACGCGGTGTGCATGTAGTTGTAGGTACACCCGGTCGTGTGATGGATCACATGCGGCGCGGTACGTTAAACTCGATTC
+CTTAACAACACTGGTTCTGGATGAAGCCGATGAAATGTTGCGGATGGGTTTTATTGATGACGTGGAATGGATTCTGGAGC
+AAACGCCAAAACAACGCCAAATTGCACTC
+>generic85
+GCTGCATTTGGGTCATTAGCGCATCAATATCAGCGTCAGGCATGCCCATGTCGTGGGTAACCTGATGGTAATCAATAATG
+GTTTGTTGTAGCGACCCCAAACCTTCTGCTACTGCTTCAAATATGGTGTGTGTTGTATCAAGTTCAGGTTCTTGTGGCAC
+ATACACCACTCGGGCGTTGGGGGCGACGCCATACCGTACCTTCATCTAACTTAATCGTACCGGCGATAGCTTTTAGTTAA
+GCTTGATTTACCGGTCACCATTGCGGCCAATTAATCCTACACGCTCGCCAGCATCTAGCTGAAAAGCAGCATGGTCGAGT
+AGGGCATGGTGGCCAAAAGCTAATGAAGCGTTATCTAAGGTAATAAAAGGCATATTTGTTTATTTGGTTTCTAAAGGCAA
+TTTTTTAAAGGAGTTGGATTTTTAAAGCGATATGTCAGCAGATGTCTTCTACCATAAGGCCTGGTACTTGCTTAGAATGT
+GACGAGTGGTGT
+>generic86
+GCGTGGCTTGCTGGCAGCGCTGCCCAACGAAGTGCTGTTCGACATCGTGATCGGGGCCTTCCTGACCGTGATGGCCTACT
+CCAGCTTGGCCATCGTTTTGCTCACCGCCACGCTGGCGGTCTCAGGGATGGTGCCCGAAACCGTTGCGCTGGGCTTGGTG
+GTGGGAGCCAATCTCGGCAGCGGCATCTTGGCAATCTTGACCACGGCCAAGGCCCCGGTTGAGGCTCGCCGGCTGCCGGT
+CGGCAATTTGCTGTTCAAAGTGGTTGGGGCGATGGTGGCCATCCCCTTCCTGCCCCATGTCCACGATCTGCTCTCGGAAT
+GGGTGGGCGGTGTTGATCAGCAAGTCGTCATCTTTCACCTCTGCTTCAACCTCGTCTTGGCCGCCTTGTTCGTCGG
+>generic87
+CTGGACGCGGGCATGGACGACTATGTGTCCAAGCCCTTGAACAGCGAGCGTCTGCGCGCTGCCCTGGCGGGCGTGACTGG
+CGCGGGCACGGCTTCGGCACATCAGGCATTTGACTACGCCCACGCGCTGAGCAGCGCCGACGCCTGGGTGATAGACACCA
+TAGGACAGGATTATCTGGATGACTGTCCGCGCCTCATGGGGAGGTTGGAGCAGGCCCTGCACGGTGCTGATTTCTCGGCA
+TTGCGCCGTGCGGCGCACACCTTGCGTGGTCTTGTGGGCCACTTCAACGCCAGCCGCATCGAGCAATTGGCGCGCGAACT
+TGAGGCCGACGACACGAGTGGTGT
+>generic88
+CTTGGGTTTTATTGTCAGCTTATAAAAATTACGTGATGGCGGTTACGGTGATGGCGGTAATGCTGATTTGGCGACATAGA
+ACTAATATTCAAAAGCTGCTGGCTGGTACTGAGGCAGGATTTGGTAAGAAATAAGCAGCTAATTATTTAACTACTAGGTT
+TTTGTAACTCAGCTAAATCCCACCGTGGTTTCACGCTGAAACTGTAATTTGTATTACCCTTGCCACGCATTGCCTTTAGT
+CGCATCGCGCCTGCAAAGGCAATCATCGCGCCATTGTCGGTGCAAAATTCTAAGCGCGGATAGCTTACCTTGCATAGCTT
+ACGTTTTGTCGCAGCGTTTAACTTCTCACGTAATTTAGAATTCGCACCCACACCACCAGACACGATCAGGTTGTCTAAGC
+CAGTTTCACGCAAGGCACTCATGCATTTAGTGGTTACGAGTGGTGT
+>generic89
+GTCACACCGGCTTGGGTGAACAGCACGGCTGCTGCCACGCCGCTGCCGTGTAGCCATTCGATCCAAGCCGAACCCAGCAA
+GATCAGCGTCACGGCAGCGGCGACTGCCATGGCGGCACGGCGGCGCGCCAGCACGGCAGCCATCAGCACCGGCATGGCGA
+ACATCGCGGCAATGTTCTGGCCGCTACCCACCACTTGGAGGAGCACCGAAAAAGCCAGCAGATCCACGCCCACTGTCCAT
+AGCCACCAACGTCTAGGCGGTGTCGCGGCGCTGTGTGGCAGCTTTCGCAGGGTGCGGCGTTGCCAGTGCAGCAAACCCAC
+CGCCGCGCCCACATAGGCCGAGCAAAATCCCAAGCGAGCAACGAAATACCTGTGTGGGCGTAAAGCTCCAACAGGACTTC
+GACCAGCAGCAGCAGCAAGCCCAGCAACACGCGGCCAA
+>generic90
+GCGCTAGCGATGGCGGCCGATGTGCGCACATCGGCGATGGTGATGGCTGCTTTCTCCAGCAGCGTGGAGGCGATTACGGC
+GATGGTTGTCATGGTGGATGGCTCCAGCAGAGTGAGTTCAGGCAGCGCTGCGGTCGTAGGCGTCGCTTCCAAGCTTTACA
+AGCTTGGCGAGCGAGATACTCGGGTTTGGTAGATGGCGTTGCGTATGGTGTACACAACGTCCAGATCCCACTTGCCCATC
+AGGCTCAGCGCCACATCAGCGCGCGCCGTGCGCACGATGCACAGCGCGGCTTGGCGGCTTGTTGTGCGGCTGTGGACACA
+AGGCCCTTGGGGCCGGTCCGAATAGACCGGAATGCTGGCGTACCAGTCGGTCCCTTTGCCCCACACCTGCACGGTGATTA
+GGTGGGCGGCGGTCTTGATGGCGGCGGTGGCACGAGTGGTGT
+>generic91
+GGCCGGGTGGCCCTGGTGACCGGCGCTTCGAGTGGCTTAGGCACCCAGTTCGCGTGGGCCCTGAGCCGCGCTGGCGCTGC
+CGTGGTTTTGGCCGGTCGGCGGCCTGAGCGGCTCAAGGATTTGCGTGCCGCCATCGAAGGCGAAGGCGGCAGCGCGCACG
+TGGTGACGCTGGATGTGACCGACATTGCCAGCATCAAGTCAGGTGTCGCCCACGCCGAAACCGAAGTCGGCACGCTCGAC
+TTGATGCTGGCAATGTCGGTCACATCCAGACGAGTGGTGT
+>generic92
+ATCTGGGTCAGGTCGCCGCGTTCCAGGCGGGCTTGCACCCGAAAGGGGACGTCGCCGTCGAACTCCAAGCCGGCATCCGC
+CGAGAGGAGGCCGCCGAAGACCTGGGCCGTCAGAGGGCGTGGCGGCTGGTCTTTCCGCCCGCGTTCCGCTTCGGCGCCGA
+ACACCAGATGGTTCGCATCGATCCACAGCGGCCCCCGGATTTGGGTCAGTTGGACATCCTTGAAAACCGCCGAATCCAGG
+TTCAATTCGCCGCGGCTGTAAAAGCTGTCCTGATCGCTCTCGCCGAACAAGCGCACGTCGCCGTGGATGTGATCTACCTG
+CAGGCCGCTGCGCAAGCCGCCGTTTTCCACGTCGACCACGAAATCCCACCGCGCCGCCGGCCGGCCTTCCGCGCGCGCGA
+CGCCGCCACGAGTGGTGT
+>generic93
+GGCCGCCGTTGGGCGCGGTCAGCGTCAATGAGCCGCGTATCGTGAAGTCGGCGTTCGAATCATCGCTTACCGTGGAATCC
+GATGCGTCGGATACCTTCACCCGGACTTGCGTCCCGATCGCGTCGGGTATCGTCCACGAATAGGCTCGAGCGCCGTGGCC
+GTCGGTCGAAGCGACGATCACTGCCGGATACGGACGATCCGCTGTTGACGGAGTACTCGACGTTTGACACTTCGCGATAC
+TGCCGCTCTTCGTCCACGTGACGCTCTCGCTCGAACCAACCGATCCGACGTCTGGCCGCCGTTCGGCGCGCCGAGAGTCA
+CGCTGCCGCGTATCTTGAAGTTGTTGTTCGATATGTCGGACGCGTTGGCGTTCGAAGCATCGGATATCCTCACCCTCACC
+GTTGTGGATATCGCGTCGGGTATCGTCCAGGAATAGGGGCTGGAATTGACTACCGAACCCGTTATGACCGTCGTCTGAAG
+TTCATCCGAGAACCCGTTCTTCGAGTATTCGAGCTTCAC
+>generic94
+GCAAACACTGGCCCAGCAGGCACTGAGCCAAACCCAGTTGATTGGCAAGGACGTGGTTGAAACCATTCAAGCCATGGTCG
+CTGAGATTGACAAGAAGTTGACCGAGCAAATCAATCTCATCCTGCACAACGCTGAGTTCCAAAAGCTCGAAGGCGCCTGG
+CGTGGTCTGCATTACATGGTCAACAACACCGAGTCCGATGCCCATCTGAAGATTCGCGTGATGGACATCTCCAAGCAGGA
+GTTGGGCAAGAACCTCAAGCGCTTCAAGGGCGCGGCCTGGGACCAGAGCCCGCTGTTCAAGAAGGTGTACGAAGAGGAAT
+ATGGACAATTCGGGGGTGAGCCCTTTGGCGCCATGGTGGGGGACTACCACTTCGACCAGAGCCCGCCAGACGTGGAGTTG
+CTGGGCGAAATGGCCAAGATTGCAGCGGCGGCCCATGCTCCCTTCATTACGGGTGCCAGCCCATCCCTGATGCAGATGG
+>generic95
+GTGACAGACGACATCGGCGTGGTAAGCGTCAACGCCGTATCGCCGCTGCGCTTGCTCTTCGCGTTGGCTTGGTTCAACAG
+CGTGCCGACCGATTGGCTGGGTCGATTCATGGTTCAGATCCATGTCAGCCTGACCTACCTCTACCGCTTGCCCGTGCCGC
+AGCCCACGGACGAAGAGATTCGCGCCAACGCCGATTACGCCCAGCTCGCCAAAAACGCCTTGCGGCTGAGCTTGGCCGCG
+AGCTGGGACGACTTTGCTGAACTGGCACCACTGTTCCACATCACACGCCCCGACGTGCCCGTCACCGCCAAGGCGAAGGA
+TCACTTGCGAGCCGAGAACGACATGATCGTGGCACGCCTGTATGGCATCACCGACGCCGAATTCGCGCACCTGCTGCGCA
+GCTTCAAGGGCATGGCTACCAAACGGCCAGAGTACTTGGCGTTGCTTCAGTGTCAGTGAGTGAGCGCCTC
+>generic96
+GGCCTCCAGTCATTGCCGTTTGGAGGCGTTGCCGGGATGGTCCTTCCTGGGCTGTGCGGTGGAATCAGCCGCCGCATCCG
+ACTGCTGCGCCGACAGCGCCTGTCAGACGGTTGAATCCGCCGGGTATAAGGCCGAAGATAGCCAGCTCCAAGTGCCAGCC
+TTGTTTGCCGCGTGTGATCTCCGGGAATTTATCCTGTCCGCCAAAGCTCCCTTGCCCGCTGACATTTTCTCCACCGGTTG
+CGGCGCTGCGCCGCCAGAATTTCCTCAACGCTGGCAGTTTGTCTTCCGTACGGCCTCGCCGCCACGCGCTCCTTCGTTCG
+CTTCATAAATAGTTCCGCTCGGAACTCCGCTTACTTGTTTCAAGGCGCATTGTCGCGCCCGTATTTTCCCGTTGGTTGTC
+CGTTGAACACGAGTGGTGT
+>generic97
+GGTCGAGGCTCCTCGAGCAGCTTCAGGAGAAACATAACCGCGAGATTTCACAGGACCGCAAAACCAGGTCGGGACCGGGG
+ATCGCAGCGAAAAGATCCGCACGTACAACTTTCCGCAAGACCGCATCACCGATCACCGTATCAATTTCAATCTCCACAAC
+CTGCCAGCGGTGATGGAGGGGAAACTCGACCCGCTCATCCAGGAACTTCAGAAGGACGAGCAGACTCGGCAGCTGGCCGC
+CGTTTCAGAATCAGGGAGTCAAGCGTGATCATCCAGGAAGCTCTCACGAGTGGTGT
+>generic98
+AACACATTCAGCCCCAGCATGAGCGCTTGGTGCGCTGCTTGGGCCGCCACGTGGGTGCGCCCGCTGAGACCCCCGCCTTG
+CGCCAACTCGCCTTTGCCATCGTGGCCTTGGCCCATGACCAGCTCTCGCGCAGCTTTCTGCCGTGCCACGCGGCAGAGCT
+CACGCTCAACGACAACGCCGCCCATCTAGAACGGCTGGTCGATTGGGCCATGGTCTTGGTCGAGCACGAGAAACACCGCC
+ATCACCTCGCTTCAAGCCTTTCTAGGAATTCGACATGACCGGCTTCACCTCCATGCCCCACCGCCATCGCTACGCCCTTG
+TCTTGACCGCTCTTGTGGGCCTCGGGCTGGGCGGCTCTGCCTTGTGGGTCCATGCTGCAAGCGATGCAGCCACAGATAAG
+ACGACGGCACCTGCCGCTCTCAAAACGAGGCTCGCCCGGCATTGACTGTCACCGTCACCAGCCTGC
+>generic99
+CGTCGAACCTGAGCCGTTTGGCTCAAGGCTACAGGGACCACCACGTCTTGGCTGCTGCCCTTGATGCTCAGCTTGCCACC
+AATGTCATACCGACCGGGGCCTGTGGCTTTGATGGAACTGGACTGAAACGTGGCCTGCGGGAAGGCGGTAGCGTTGAACC
+ATGTTTCTTGGGCATCTCGCCATCGGCCTCAGGTGTACCCAAGGTGGCGCTGGCCGTGTCGATGTTCAGGCTGATCTTGC
+CGGTTGCGGGCTTCTTAGGATCAAAGTTGATTTGGGCGTCGAACTTACGAAAGTGACCCTCGACCGGCACGCCCATTTGC
+TTGCTGACGAAGAGCACGTCGCTTTTGGCGGTGTCAAGTTTGACGCCTGTGCTGGCTTGGGCATGAGCCAAGCTGGGAAG
+CGTCAGGGCAAGGCCCACGAGTGGTGT
+>generic100
+GGCATTTTCTTGCCGGACAACCATTGGTCAAAGCGTGAATTTGGCGTGACCAAGGTTTCTTCAAAAGCTGCAATCGCCTT
+GGTGACTTCTTCCATATGGATGGCGTCTTGGTGAAAGACTTTCTTGAAATCGGCCTGATAAGCCGGAATCGAGGTCAAGA
+CATGGATAGCAAGTTCATGGGTGAAACCCATTTCACCCGGATTGGCAATCGGACCACCAGCCTGCTCTTGCAAATTCTTG
+GCCCGGCCATCCCAGAACTGGGCAACATTAAACTTGGCATTGAGCACGGTCGGTGAATTGATCGGTCCTTGATGCCATTG
+ATGCCCAATCGAGGACTTCAAATTATCCGTGCCGCCCATACTAAGGTTATGACGAGTGGTGT
+>generic101
+GTCTGATGCCAAACAGATATGGGTTGCGTTACTGCTGCTATCGCAGCGGGCACTACTTCATTCAAAATCTGCGCTCCCTG
+ACTTCCGCCTACAACCAACAGATGCAATTCTTCTGAGCTATGTCGGTCACCGGCATGCAGTTTTTGCAGAAATTGCTGCC
+TTAATGGATTGCCGGTACATTTGGCATTCAGCTGTTTTTAAAACTGCCGGGGAAAGCTTCCAATACTTGATTGGCTATTT
+TTGCCAGTAATCGATTGGTCGTGCCCGGCACCCGATTTTGCTCATGAATAATCAGAGGTATCCCTAGCAGCTTTGCCATT
+AGTCCGCCGGGGCCGGCAACAAACCACCCATTCCTAACACCACATCGGGTTTGCGTCGCCGTAATACTTTCCATGCCTGC
+CAGCACGCTTTGAATAAAGTCGCCAACGCGGTCAGTTTGGACAAAACGCCCTTACCGCGTAAGCCTGAAACAGACAACCA
+ATCGATGTCTATGTTGTTACGAGT
+>generic102
+ATGAATCTCTCGGGGTTCAGGAGCGGCATTTCGACGACTTCCTATGTGATAATATCAAAGGAATAATTGTCTTTTCGCTC
+CGTGAAAAGAACAATGGAGTTACCTTCAGGCGGTCGAGCTATTCAGTGACACCTCCAATATCTGCATAGGTGACATCTGG
+CTTTTCCTCGACGGTCATCATCGTGACTGAGGGGTCGATTTTAGGAGGAAGCGGAAGCTAGATGGAGTATTTTTGTTCTC
+TACTCCGACTCTCATGCCTTCGTCGATATCAGTAGGGGCAAGCTTGTCTCCAAGGCCCACGACGAATTTAGCCATCTGTT
+GATGCTGATCATGTACTTATTCTCGCTGGGAGTCGCGCCAGGGATAATTTATTGCAGCGCGCAACTTGCAGAGAATGCTG
+CTACTGGAGACGCATCTCGTCACCCTTGAGATCCCATTAGGAGGGCAGTGCAAGTCCTGTGTCGCTTTCTTTGA
+>generic103
+CACAAGGGCTGGAGCCTTCCAGACTTGGGTGGCTGGACAACAGCCTGCTGGACGAGAGCTTTCTGCGCCAGAAACAGCGC
+GAGCTCGCGGGCAAGCCGCTACCTTTCGGCTTGGCTGAATGGCTGGAAACACACTTTCAGCCGACCCAACTCGCAGCAGG
+CAACGAGGCCCAGCTCGAAGCGCGCCTCATCGCACCCCTGCTTGCGCAGTTGGGCTGGTTTGCCGTGCCGCAGCAGGCCT
+TCACCGTGCAAGGCACACAGGGGATA
+>generic104
+GACCTGGCTCCCCTCTGGATTGGCTGAAGCTCGCCGACGCATTTCATGCGGCGGCTCTGGCGCGCCCGGCGCCCGTATCC
+CGCTTCTCTGGGGCATCGACGCGGTTCACGGCCACAACAATATTCCGGGCGCCACCCTCTTTCCGCAGAATATCGGTCTT
+GGCGCGGCGCATGATCCAGACCTAGTGCGCCGCATCGGCGTTGCGACCGCGGAGGAAGTGCGGGTCACAGGTCAGGATTG
+GACTTTCGCGCCATGCATCGCGGTGGCGCGGGATCCGCGCTGGGGACGCACATATGAGAGCTACGGCCAGGACCCGCAAT
+TGGTTCGCCAATATGGCGCTGCGTTGGTCGAAGGGTTGCAAGGCAAGGTCAATACAAAGGAATTCCTGTCGCCAAATCAT
+GTTCTGGCGACGGCCAAGCATTTTCTTGGCGATGGCGGCACCATGAACGGAACGGACGAGGGCGATACGCGCGTCGGGGA
+GGCCGAGCTGC
+>generic105
+GCCAGTTGTGTCGCAGAGAAAGCAGATGCAGGACCACGCAATAACGCGGCCCTTCCCACACTTGATCTTTGTAGGTGCTG
+TAGTCAACGCCACACAAATCAATCAATTGCTCAAAAGCCAATTCATGGTCTTCTTGCAAAACCAGCGCTGTGGTCTGGTA
+ATCCTCTGCACTGACTGTGATCGTGATCTCACCGCGCGCGCAAACTTGCTTCACGATACGATCACCGAGCACATTTTCAA
+GGGCCGCCAGCAGGTTTTGGAGTTTTTGAGTCATGCCGCTATTCCCTCAACTCAACGAGCAATGGTGTTTTCACGCCGGA
+TCTTGGCTTGCAATTGCAAAATGCCATAGAGCAACGCTTCCGCCGTGGGCGGACAACCCGGGACATAGACATCCACCGGC
+ACAATCCGATCACAACCCCGAACCACTGAATAGCTGTAGTGGTAATAACCACCGCCATTGGCACACGACCCCATCGACAA
+AAC
+>generic106
+CGAACCGGTGCTCGATTTCGGCGACAATCCCGCGGACGTGAGCTTTGCGCGGAGCACCATCGCAGGCGCGCTGACCTGGA
+CCCGTCCGCCCGTGGAACTCTTCCCGTTCGATCACACGACCTACGACGTGGAGGTCAGCGGCATGGTCGGCGAGGGCGAC
+GTGGTGGCCGACGTGCCGGCCTATTCGGCCCACGATGCGGCCGGGAACCCGAACCCGGACTCCACCAGCACCGACAACAG
+GGTGCGGGTCGATCTCAGCCCGCCGTACGTGCTCAGCGTCGTGCCCGGCGATTTGCTCATCACCGACGCTGACGTGGGCA
+AGCCGTTACGAGTGGTGT
+>generic107
+ACGCGATGGTCTGCAGGTTGTTCTTCACCCGGTGATGGACTTCTCGGATGGTGGCGTCTTTGACCTTGATCTCTTGCTCG
+CGACGACGTGCCTCCGTGAGGTCTTGCACCAGCACGAGTGCGCCAGCCGGAAGGCCGATCGAGCGATAGCCCAAGACGCG
+CTCGGCGATCTCGGTGTCAACGGCGATGGCCGCGCGCGTGCCGAGCACCGGCGCCACGCCAAACCCGCCGCCCGGCAGTC
+CGGACGCCTGCATGCCGCCGAGTGAGCGCTCCACGCCTGCGAGCCGCATGATGTTGACCGCGTTAGGCGACGCGTAGCTG
+ATCTGGCCTGTCGCGCCCACGCGCATGACGCCGTCGCCCGCGGTTCGCACGGTCGCGAACGGCTCCCCGTGCGCACATCG
+GTCAAAGGTCCGCTGCCGAGAAGATCGAGCAGCTCCTCGGCAACGTCCATGAATGCGGCTTCCATCGCGCC
+>generic108
+TTGAAATCACTTCAAATTATCTCGACAAAAAGAAGTCCCACGGGAGAAAGATCGAACTTCTTCCTTTGATAGGCCAGCAC
+ACATACTCACCCGCACATCCGCATTCGCCCGTAACCACCAGCCAATTAATAATAAATGCACACTGAAGTTATGACTGACT
+TCAGACTAACCGCCTCTTCAATGGCAGGCCCGTTCATTGAGCAGATCAACATGAAGCAACCCTCTGGTAGCTTAGCCTCT
+GCGAACACACAAGGGAACTAAGCGAAGAGACTAATGAATACCACTGCAGCACTGACCGCTCCTTTTCTTCGAAGCTGACG
+ACTGAGAAGGAGAATTTCCACCACATTGATGCCGAACCATGCAAGCCTGGGCAACCTGCGATGAGACTGTAAAATTATGC
+TGAAGACGAAGCGTGGTTTGGGAAGCAGGCTCAGCAGTTGCAGTAGCAAGCGGTGTTCAGCC
+>generic109
+GGGCGGGCGGACGGGCGTGTGTAAATAGATCAAAGCTCGTCTCTTGGGGTGGCGGCATCTTCATTATCTTCATTCGAAGA
+GGAGGTTTCAGTCTTTGGGGCTTCTTCCTCATCATCTTCGATGTCAACTTCGTATTCTTCGATTGGGGCATCCTTTGGGA
+TTCCGAGTGCACCGTTGAGTAAGCGGTAGAATCTCTGCGCGAACGAAGCTGGATCTTTCAGAGTGTATCCTGAGTTGACC
+AAGGCACCTTCGTAGAGGATTCTCGCGATTTCTTCAGTCTACGCATCTGGATCATCCTTGACTCGTTCAAGGAGTTCTTT
+GACAGCGGGATGACTTGAGTTAATCTCGAGGATCTTCTTCTGGTTCATTTGCGGGTTGGCTCGATCTTAGTTCGAGTAAG
+CCTATGCTTTCGAGATTCTCTCCATCTGAGCGGAGTAGCCGTTCTCGTTCGACACGATAACGCAGGGATCGTCGTGGAGT
+CGCTGAGAAATTCTC
+>generic110
+ATCGGGAGCCTCGATGACGACCTCTTCCATGTGAAAGGCACCATTACCGTTGTCCCGCCCGCCCGTCAGTCCTTCTCAAG
+GCACNCTGGATGAATTAATCATCGCCACGCCGCATCCTCCCGCGTGGGGTAGGGCCCGGCTATGCCTTCGCGCGCAGTGA
+AATACCATTCTTCCTTGTCGTAATAAAAACCGAAAATTCGCTCTACTTGGGGTAAACATGGCTAGTGCCCTAGATTGTCT
+TAAAGTGTTTGAGGGATGTAGCCTTGCCCGATTGGGCGAGTCCGTAATCGGTTGCCACAAAAAAGTCAGAAGCACGGCAA
+TGGCTTTCTGCGTTATAGTATCACTCGGCCTGTTGGCCCAAATCAAGCACTAAAAACATT
+>generic111
+CTGAAATCAGCTGGGGTACAGACCGTAAGGTTGACTGGTGTGCGCTCGTACGTCAATCGTGCAGCAGTTCGTTCAGGCTG
+GTTTTGGCACGTGTTTGTGCATCCACACGCTTCACGATGATGGCGGCGTACAGACTGTATTTGCCGTTGTTCTTGGGCAG
+CGTGCCGCTGATGACCACCGAGCCGCTGGGGATCCGGCCATAACTGACACTGTCGGTTGCACGGTCGTAAATAGGGGTGC
+TTTGACCCAGGTAAACGCCCATAGAGATGACCGAATTTTCCTCGACGATGACGCCCTCCACCACTTCGGAGCGGGCTCCG
+ATGAAGCAGTTGTCTTCTATGATGGTGGGCCGGCCTGCATTGGCTCCAGCACGCCGCCAATGCCGACACCGCCACTTAAA
+TGGACATTCTTTCCGATCTGGGCGCACGAACCAACCGTGGCCCAGGTGTCAACCGTGCTGCCCTCATCGACATAAGC
+>generic112
+TGAGGCCACCCCCATGATTGGACACCTTGGCGTCTTGTTGATGACGTTTCGAGAAGCATTCCCCAGAGGCGCAACCTTCC
+ACTGGTTTGTGGTTGCCATCTTCGGGTTCATGATTCGCCTCGATCACCATGGGGTGTCGTCGAACATTCGATGGCTGGGA
+GTCCAACCCGATCTGTACGAGACGTTTCTGGCATTTTTCCGCTCCAGCGCAGTGAAGCTCGGGACCATCCTCCGAAAGTG
+GCAACTCATGGTGGCCGAACACTATGCCGTACGGACCCACAACGGGGCGCTGGTCCTGTTGGGAGACGGCGTGAAGACGG
+CCAAGGAGGCCGAGTACATGCCCGGCGTCAAAAAGACGAGTGGTGT
+>generic113
+GCAATGCAGCATCAAACTGTCGCGTTCTCGCCACCCCAAAGTACCACGCAAACTAGGGACGGCGGCCAGCGCGGCGCCGC
+CAAAACAAGGGGCGAGATCGCCCTTGGCACAACGCTTCTTGATAGGCCCGCACAGCCGCTTCGGGATCAGCGGCAGCGGT
+GATACCGCTCAAGACCGCCAAACCATCCACCCCGGTGCGGGCAGCGGCTTCAAGGCGCCCGGGTGTGAAGCCGCCAATGC
+CCACCACCGGTAGCGTGGGCACCATCTGCCGCCACCAGCCCAAGTTGTGCAAACCTTGAGGCTGCCAAGGCATGTCTTTG
+GTGGTGGTGGCATGCACCGGGCCGCAAGCAATGTAGCTTGGCCGCAGCGCCCAAGCTCGGGCCAGCTCCCACAGGCTGTG
+GGTCGAAAGCCCCAGTCGCAGACCGGCATGGCGAATCGCCGCCACATCGACCTGATCCAGATCTTCTTGACCAACATGCA
+CCCCGTAGGCCCC
+>generic114
+GTCGATCGTGGTCGCGACCGGGAGGGGCGCCGGCGCCGGCATCCTCATCCGCGACGCGGAGGCCATCGAAACGCTGGATA
+AAGTAGACGTGCTGGTGGTGGATAAGACCGGGACCCTCACGGTGGGTAAGCCGCGCCTGGTGACGGTAGAGGCTGCGAAC
+GGGTACGACGAGGGTCAGATGCTCGCCCTGGCGGCGGCGCTCGAGCAGCGGAGCGAGCACCCCCTCGGCGCCGCCATCGT
+GGCGGGCGCTTTGGAGCGTGGGCTGAAACTGCCGGCGGTACAGAACTTCGCCTCGCTCACCGGCAAGGGCGTGGTGGGGA
+CGCTGCCGCCGCACCAGGTAGCGGTGGGCAACGGGCGCCTGCTGGCCGATCTTTCGCTCGACGGCGGCGGCCTTCTGGCG
+CGCGCGGAGGCGCTGCACCGCGCCGGCGAGACGGTGGTCTTCGTGGCGGTGGACGGCAAACTGGCCGGCCTGCTCGGTAT
+CATCGACCCCGTGAAAGAGTCGGCCGCCGAGTCAGTGC
+>generic115
+AAGCGTTCTACATGGTCGGCACCATCGACGAAGCCTTCGAAAAGGCCAAGAAGATTCAGTAAGCAAAGCGGTACGTTAGG
+CGCTTTGGACTTTGGCAAAAGAAGTCCGAGCGCCGACTACATTTGCTTGTTGAACCTCCTTGTGAAGGAATAGAACTATG
+GCAACCATCCACGTTGACGTCGTTTCTGCAGAAGAGTTGATCTTCTCAGGCGAAGCCAAGTTCGTCGCGCTGCCGGGCGA
+GGCCGGTGAGTTGGGCATCTTGCCCCGCCACGTGCCGCTGATCACCAAGATCAAACCGGGTACGGTGCGCATCCAGCGTG
+CTGACAACGGCCAAGAAGAGTTCATCTTCGTGGCCGGTGGCATTCTGGAAGTGCAACCGCACGGCGTGACCGTGCTGGCT
+GACACCGCCATTCGGGGTCACGACCTCGATGAAGCTAAAGCGGAAGAAGCCAAGCGCGTGGCCGAAGAGTCGATCAAGAA
+CGCCAAAAGCGATATCGACTTGGCAC
+>generic116
+GTCGGGCTGTCCTTGAGGCCCTTGGGCAACGGGAATTGGATCGTCTCTTCGACGCCCGGTAGGGTGCGCAGACTCACCGC
+ACCCAGCTTCCTGAGCTGAGCGATGACTTGCTGCACCAAGATTTCTGGGGCTGAGGCCCCGGCGGTCAAACCGACACGTG
+GCCGGCCTTGGAACCAAGCTGCGTGGAGATCCTCGGCGCGATCCACCATATAAGCCGGCAGGCCTCGGCGCTCAGCGAGT
+TCGCGCAGACGGTTGCTGTTCGAGCTGGTCGGGCTGCCCACCACCACCACCACATCGACTTCGGTCGAAAGAACTTTGAC
+GGCGTCTTGGCGGTTTTGGGTGGCGTAGCAAATGTCTTGTTTCTTGGGCTCGCGCAAGGCGGGAAAGCGCGCGCGTAGGG
+CGTCCATGATCTCGCGGGCGTCGTCCACCGACAGGGTCGTTTGGGTGACCACCGCCAGATGGTGCGGCTGCTTGGGCTGG
+ACCTGAGCCACGTCTTCGACTGACTCGACC
+>generic117
+AGCGCGTCAGCGTGATGTCGCGGAGCTCGGCGCGGTAGCGCGTGCCGTCGCAGTCGGGGCAACGCAGGTAGACGTCGCTC
+AAGAACTGCATTTCGACATGCTCAAAGCCGGTGCCACCGCAGGTGGGGCAGCGGCCGTCGCCGGCGTTGAAGCTGAACAT
+GCCGGCGCTGTAGCCGCGTTGCTGGGCGGCGGGCAGGTGGGCGAACAGCTCGCGGATGGCGTCAAAAGCGCCGACAAAAC
+TGGCCGGATTGGAGCGCGCCGTCTTGCCAATCGGGCTTTGATCGACCATCACGGCGGCACTCAGGGCTTCGGTGCCGAGC
+AAACGGTCGTGCAGGCCGGGCGACTCAGTGGCTTGACCAAAATGGCGCGCCAAGGCCGGGTAAAGCACGTCTTGGATCAG
+GGTCGATTTGCCCGAGCCGCTCACGCCGGTGATGCAGACCAGCCGTTGCACGAGTGGTGT
+>generic118
+CGTAGGTCTTCTGAAGGTGTTCGATCTGGGATACCAGTCGCTCGGCCGATAAATAAACCTAACGAGCCTTTGTTGAAAGA
+TTCGTTGTAGCAGAAAGCGCAGTGAAAGGCGCAGCCCCGGCTGGTGTTGAGGTCAAGTTCGCGGTACTTAGCGGCGTCCA
+CCAGGTGCCAGGCCGGGTACCGGCAGCTCGTCCATGTTCTTGGTGAGGTAACGATGCTCATTGATAATTGATTTTAGCCG
+TTTGGACTTGAAGGCGAAGCCCCTTGAGTGTCTTCGATTTTCGGCGAGCCGGTTTGGCAGGTGGTCGGCTAGTTCGGCCA
+TGGTATATTCGCCCGCCCCAATGATGGCATAATCTACGTAATATTCAGCAAGGGTCTGTTCGGTAAGGACGCTCGGGCTG
+ACGTTGCCCCAGGCGATCCTGGCAATTGGGCAAGAGAAGCCCTGAATTCCTTGGACTGCTGGATGGCG
+>generic119
+GCCATGGGCAAATGGGTGAAGGGGTCGATGGTCACCGTTGTTGGCGTGGGTACTGCGCTGTTGACATAGGCAAAGGCACT
+GATGTTGAGGCCCGCCACACCACTGAGGGTGGTGATCGGCAGCGCGGCACCTGCGCCGTTGCCATCGGCATCCCACGACA
+AGAGGCCGGTGGTGGTATCAAACAGCAGCACCGTGGTGGCACTGGTGGCCACGGCACCCGCTGCACTCACCAACTGGTTG
+GCGTTGGGTGCAAGGCCATTCAGTGCCGTAAAGACGGCCGTATCCAACACCAGATGATCCGTTCCCGCCACAAAGTCGGT
+CACGGTGTCGGCGTTGGCCACTGAAGGGGCGGTATTGAACACAAACTGATCAGCACCCGCGCCACCCGTCAAGGTGTCGT
+GGCCCAGCCCGCCGCCGAGCGCGTTGTTGGCTGCATTGCCCACCAAAACGTTGTCCAGCTCATTGCCTGCGCCATTGATC
+GTCGAGGCCTTGGCC
+>generic120
+GTTCGCCAACTCCCCCGGTTCTTCGTTGCTGGCAATGATATGCACCTCGATTTTGGGCGACTCGGCCATGCGAACCAGCG
+GGTAGCTGTCAAAATTGCCCTGCTCGACCCGGCCGTTTTTGAGGGTAATAGAACCGTACAGGGCTGCAGACAGGCCGAAG
+ATAATACCCGATTCCATCTGGGCCTTTACGGTATCCGGATTGACAATACGCCCACAGTCGACCGCACAGACGACCCTGTG
+GACTTTGACATTACCGCCCTTATCCAGCGAAACTTCGGCTACCTGAGCAATGTGGCTGCCAAAGCACTCGTGCACTGCGA
+TTCCCCTGGCGTGCCCCTGCGGTAGTGATTTTCCCCAGCCGGCTTTTTTAGCGGCGGTTTGTAGTACCTTCAGCTTTCGA
+GGATGTTTGGCCAGCAGGACGCGACGGTAGCGATAGGGGTCAAGGCCGGCTTTGTGGGCCAGTTCACGAGTGGTGT
+>generic121
+TGGCGTTCATGGGCGTGCGGATCTCGTGGCTCATGTTGGCCAAGAAAGAGCTCTTGGCTTGGTTGGCGGCCTCGGCTTGG
+GCGTTGGCATCGACCAACTCGCGGGTGCGTTGGCTCACCAGCTTTTCAAGGTGATGGCGGTATTGCTCCAACTCACTTGC
+GAGTTGTTTGCGCCGGGTGATGTCTTCTTTGACGGCCACGTAGTGCGTGATGCGGCCATCGGGCTGGCGAATCGGGGCGA
+TGTGCGCCACCTCGAAGTAGATTTCGCCGTTCTTCTTCCGATTGCTGAACTCGCCGCGCCACACCTCGCCCCGTACCAAG
+GTGGCCCACATGTCGTTATGGGTCTCTTTAGCGGTTTGACCGGACTGGAGGATGCGCGGATTTTGACGAGTGGTGT
+>generic122
+TGCCGATAAAACCACTGGCAAGCCCTTTTCCAAACCCACCCCACCGGCTGGATCGACGGATCACTGCGCTCACAAACGAT
+GCATGGCACGCCCGTAAAAGCGGTCGCAGCCAAGGCAGCGATATTCACATTCGGCAAAAACGAAACCACCACATCCGGTT
+TTTTCTCTTTCACCATATGCCGCAGCGCACTCAACCGCGCCCCATACCTTTTGCCCCCACCCTGCACAACCCCAACCCGC
+TCCGACAAATAGACTCAAATCAATATCAGGATGCAACTGATAGAACGGCTTCCCGCCCCCGAAAACGTCGGCACCAACGT
+CACCTCATCCCCCCTATGCGCCCACGCATTACAAAGCGTAGTCGCCACACGTTCGGCACCACCGGAGCCAAGAGAACTTA
+TAAGAAAAGAATATCATTTCATCTATGAGATCAATCAGATTAAATGCCGAAGGC
+>generic123
+GCGAAGGCCCGGACGCCGCGCCACTGGGCGGCTTAGAGGCGGCCCTCAAACTCGGTCGCACTGATTTCAAGCGTTTGGTG
+CTGCTGACCAGCTTGTCCAAGCGCTCGAACGTGCCGGGTTTGCGCTCGGGCTTCGTGGCCGGTGACGCCGAGCTCATGAA
+AGCCTTTTGCTCTATCGCACCTACCACGGTAGCGCCATGAGCCCGACCGTTCAGCAAGCCAGCATCGCCGCTTGGAACGA
+TGAAACCCACGTCACCGAAACCGGGCTTTGTATCGGCAAAATTTGCCCAAGTCACGCCGATTTTGGCCGAAGTCATGTCG
+GTCGCTCTGCCAGATGCCGGTTTCTACCTTTGGGCTCAAGTACCCAAGCACATCTGTGGCGGATCAGATACCGCGTTCGC
+CAGCGCCTTGCTGGCTCAATACAATGTGACGGTGCTCCCCGGCAGCTACTTGGCGCGTGAGGCCCATGGGCTCAATCCCG
+GT
+>generic124
+CCGCGCTCATGGCGGCCGCTTCCGTGGCGGTGAAGACGCCGGAGTAGATACCGCCGACGATGATTACCACCAGCATCAGT
+CCCCAAACGCTTTTCTTGAAGGCCACAAAGCGCTGGCCCCAGGTGGCTTTGGGCATACGGGGATAATTACGTTTCTTGGC
+CAGATACCAGGTTACGACGCCCAGCATGATTGATAGCAGGATGCCAGGTATCAGACCAGCCACGAAGAGCGCGCCGATGG
+AGGTATTGGTGGATACGGCGTACACGACCTTCGGTATGGACGGCGAGCATCAAGATGCCCAACCGAACCGGCACAGACGA
+TTACCCCGGCCCCGAACGCGCATGGGATAACCGTTTTGTAACCATGGCCGGCAGGACGATGGAGCCGATGGCAACTACGG
+TGGCAACACTGGAGCCGCACACAAGGCAAACATGGCGCAGGCTATGATCCCGGCCAATGCCAGACCGCCGTGGAAATGGC
+CGATGACGCTGATGGCAAAGTC
+>generic125
+ATCAGACTGACGGTGCAGTTGCCGCCGATGAAATCCTTCTGACCATTGGCCAGGGCCTTGTCGATCACATCACGGTTAAC
+CGGGTCGAGGATAATGACCGCATTATTCTCCATGCGCAGGGTGCTGGCGGCGTCAATCCAGTAGCCGTTCCAGCCCTGCT
+TGCGCAGTTCGGGTGGATGGCCTTGGTGTAGTCGCCACCCTCGACAGGTCAGGATGATGTCGAGTTTTTTCTAGCTCGGC
+GATATCATCGGCATTTTTGTAGGGTACC
+>generic126
+GTTGAAGGTCCAGACCCCGGGCATCCACGTTTTGCTGCGGATCACGATGGGCGAGAGCACCGAGCCATAGCCCTGTACGT
+TGATGTGTGCGCCGCGCTCCAGCAAGGGCAGAAAGCGCTGGTTGATCTCATTGACCGTGGCTTGGGCGTCACTGGCCGTG
+TTGGCACTGCGCGCCGTATCCACCTTGAGTTTCATGGCATCGACTTCTTGCTGAAGGTTGTCGAGCGCACCCATTTCAGC
+GCGCAAGCCCAAGTCCATCAAACCGAAGCGCACGGTGCTGTTGGTATCGATCAAGCGCTCGGCGTTGGCCGGGTTGAACA
+CGGCCGAGCCGAGGTTGGAGCGGTTGAAGCCGGGGCCGACCGTTATGCTGTAGCCCGGGCTGGCGAGGGACTGATTGGCG
+CTGGCCGCTTGTGCAAGCAGCAAGAGGACGGGCACCAACGGTGCAAAAGG
+>generic127
+CAATCCGGTCACAGAAGCCGCACTGCGCGAGGCCTCGCAGGAAGAAACCGAACACCTCGCCTGGTGCGAGAAGCGCATCC
+ACGAGCTCGGCAGCCACAAAAGCCTGCTCAACCCGGTCTGGTATGCCGGCTCCTTTGCGCTGGGCGCACTGGCCGGCGCA
+CTGGGCGACAAGTGGAACCTGGGATTTCTCGCCGAAACCGAAAACCAGGTCGGCAAGCATATCGAAGGCCATTTGCAGCA
+GCTGCCGCAGCAGGATGCCAAAAGCCGCGCAGTCCTCGAGCAGATGAAGATAGACGAGGCCAAACACGCCACCACCGCGA
+TCACCCATGGCGGCGCAGAGCTGCCGCTGCCGGTCAAGCTGGCAATGAAACTCTCTTCAAAAATTATGACAAAGACCGTT
+TACTGGATATGACCACCTTTCAGGAAAACCTTGCCGGCCTGGCCGGCATCGAAGGCATCGCCCGACTCGAACTGCTTGAT
+>generic128
+TGTTTTGTATATAACGAAAAATAAATTTATTAAGTAAAATGGTCCAGAAATGTTTTATGTTGTTATATGTGTTTTATTGT
+TTTTTAGTTTTAGGTTTTTTATTTATTGTGTTAGGTTTTAGGGTTTTTCTGAGGAATGCGACTAAATCTTATGACTTCTT
+ATTTTTGCAGATCCCTTCGGAAACTAAAGTGTCTTCGTTGAAGTTTGCTGCTTCGGGCAGTAAGTATTTTTGCAATGCTT
+TTAAATTTGCTTTTGTCAGATTTTCACTTTGCTTATAATTACTTGAAAGAGTTCGTAATATCATTAATGATAAGTTTAAT
+AGAAATTGGAGGATATTTAGTATTACAGAAATGAACAAACCTACAGGAGGTTCAAATTTACAAAATCTTTAACCAATCAT
+TTATTGGCTTGCTGATAAGATTGCCTATAAA
+>generic129
+ATTTGGATTTGTAATTGTGCAATCTCGCCACCGAATACGTTCACATCCGCAATCCCGGGCACAGCTAATAAACGCGGCAC
+GAGCGTCCAATCCACCAAGCTGCGTAATTCCATTAAAGAGTTGGAACGGGAGCTTAAGCCCAAAGTCAAAACTGTTGCTG
+ATGAGGATGACATCGGCAACGGCACAGGCGCGGCGACACCTGCCGGTAATTGGGTCGCCAATGTCGCCAGCCGTTCGCTG
+ACCAATTGCCGATTGCGGTACACATCGCTGTTTTCATTGAAAATTACGGTGACTATGGATAAACCTTGAATGGATTCGGA
+GCGAATCGTTTTTAACCCAATTACGCCGCTTAGATGCGCTTCAATTTTATGCGTCACCAAAATTTCAACCTGTTCGGCGG
+AAAAATCCCGTTGCTTCTGTTTGAATCACGACTTGTTTTGGGGAAAATTCGGGAAAAATATCTAAACCCTGCGGTAGAAA
+AACGATAAGCTGCCATAGCAGAGTAATACACGAGTGGTGT
+>generic130
+GCGCGATGCCGCTAAGGCTCGCGAGCTGGGTGCGGGCGGGATCGGGCTGTGCCGGACCGAGCACATGTTCATGGCCGAGG
+ATCGCCAGCCGAAGATGCGGGCGATGATCATGGCGGACGACACCGACGGCCGGCGCGCCGCCCTCGGCGAGTTGCTCCCG
+CTCCAGGAAAAGGACTTCACCGGGATCTTCGAGGCGATGCGGGGCCTGCCGGTGACCATCCGGTTGCTGGACCCGCCGCT
+ACACGAGTTCCTGCCCAACCTGCCCGATCTCCGCGCCAGGGTCGAGCGCGCCCGGATGGACGAGGACGACGACCTCGACG
+AGCTCGAGCGGCTGCTCGCACGAGTGGTGT
+>generic131
+CCGTAGCGCAACCGTCGAGGCGGGCGTGCCGCGACAGCCATGCGTTGCGATTGGCTCATCGCCCCAGAGCTCATTCAATG
+TTCCTGCCCTCCGGCAAGTCTCTCCTTTTACACTCTCAAAGCGCCGCCGAAGGTGTCGGGCGGGAAGGTTGACAGGGTGG
+ATGATAAAGGACCTCGGTGTCTCAGTGAGGAACGCGCCGGCTCAGGAAGGCAGGTATGTCCCGCGAGCCCTGGGTAACGG
+CAACGATCTCAATGGGGCGGCGTTCGGCGCGATAGATGATGAGGTAAGCGCCAAGCGGCCAGAACCAGACCGGATAGGGA
+GTGAGGTCTTCGCGCCGGTAGCCCATGCCCGGTGTTTGCCCGAGCGTTTCAAATGCATACGAGTGGTGT
+>generic132
+AAAACACACGGCGGTCAAAAACGCACCTTGGGTTAATGAACGTCGTCCAACGATGGCGGCTGCATTGGTGGCGTGTCCTA
+ATTCAGGACGGGCTTGGGAAAAATCGGTGGCACGCTCCTGAATGTGCTGCAAAGCGGTTTCAAGGCTGGGATTGCGCGGT
+GCGGACGCTAAACGCCGACACCGTTCATGTGCCGATAAATACCGTGCGTGGTTTAAATCACCTTGCAGTTTGTTAAACGC
+AGGTTGCAGGGCGGGCGGTAATTCACTCAAATCATACCAGTCAATATTTTCATTACAGGTATTGTGTTCTGCGCCGATAA
+ACCAGCTATCAGCGGGAATGTGAATGCCACGCTCTGCCAGTAGTTTACGAATCTCAGGACGATTTGCCATAGCGGCAAAC
+ACCCGCGCATTCGGGCCGCCGTGCCGACCACTGCACGCACCACAATTGTATGCGGCACGGTGGGGATATTTGGCTGATTG
+AGCCGTGTCCAAACAGCACCACCAAGGGCGC
+>generic133
+AAACCGCCTGCCAAACGTGCCGATGTCGTCGATCCGGCGGCCTTCGATCTCAAAGACTGCTGCTCGCCCCAAGCGCCGGG
+CGGCGATCAAAAAACCAACCGACGCACCACCACCACCCGCCCTTAGCGTCATTGCCCCAGTGATCCCACCCGCCGCACCG
+GCCACCAGCGCGGCAACGGCAACGGCAACAGCCAGAAAATCCAACCGAGGTGCTTTGCGACCACACAGCTCGGGGCCGGC
+CAAGATCTTCGTGCTCGACACCAATGTGCTCATGCATGACCCGATGTCGCTGTTTCGCTTTGAAGAACACGACGTCTACT
+TGCCCATGATCACGCTCGAAGAGCTCGACGGCCACAAAAAGGGCATGAGCGAGGTCTCGCGCAATGTGCGCCAAGTCAGC
+CGCGAACTCGATGCCTTGGCCGCCAGCGCGGGCGACAGTGCGACGACTTTTGACGTCACAGCGGGCATTGCGCTGGCCAA
+AACGGGCCACCGT
+>generic134
+ATCGTGGATCCGTACTGCATTTTCCTGGCCTATAGGATCAAGGACCGTGCCGCCGCGGAGGCGATGCTGCCCAGGGGCTA
+TGAGCTCGCGGATACAAGCGTTTTCAAGGATCAATCGGCGTGTCCGATGGTGGTCATCAGCGCTTTCTCGGCGTTCGTAC
+CTCCGCGTTCATCGGAAATCGGTTGGAGTTCTACATAATCGCCCGCCGCAAAGACACGGGCAGGATATCCTGGTTAATCA
+CGGATTACGAGACGAATACGAATAGCTATGATCCGAAAAACTGTTTTCCGGCTATACCAGCGATCCGGCTGTCTTCACCA
+CGACTCCATACGGAGAATTGCTCGCCGATTTCGCCGGAAAGAAGAACGGAAAACGATTTTCACTGTCGGCCGATGTGGAG
+AAAGGGGAATGGAGGGATCGTCAATGGGGAACTCTGGGTCGAAGGCAATCTGTCGATTGATTACGGCACGAGTGGTGT
+>generic135
+TGAAATCTATCGGCGGCAACTTGTTTTGTCTATGAAGACCCGGGAAATCATACCCCAAAAGCTGATGCCATCCTGGATTA
+AATTCAATAGCGAGCAACTTACCTTCAATGGCATCTCCGAATACTGATTCACCGTCATAATTTTCTACCCAAGACATATA
+TTCACCAGTTGATCCTTCGCGAAACATAAGCTCAAGATCAATACCACTGCCACCGCTGAAAGTAGTCGCTTTACCACGGT
+CATGCGTGACGCTCATCAAAAATGAGACCTTTGCTTGGATTTTTTGTATATCGTAGTTCGGGGCAACATTCTTTACCGTC
+CCACATCCAGCCAAAATAACGATACATGACAACAAAAATAAACAGCAGAATCGGCGCATACAAACTACCTCCCAGCATCA
+ACACATTTCGAGATTACATCCAAAAAAATGCACATCCTTGACATACATCATCCTTATCCAACCTCATGA
+>generic136
+GTCGGGTTGGGCGGACGGGATATCCCGCTGGATATACTTCACCGAACCCTGGCCGCCATAAAAGAGCCCAGAAACCGCCG
+CTTCCGCATTCTAGACTTGAACCTCGAAAAATTGCCGGAAGAAGATCGCTGATTCTATTGAGGAGACCCTAAGGCCATGA
+GCACTGAAACCCTGATCCCGGTGTCCGAACTACGTAAAAGCAGCCCCGCTTTCGCGGCCTGGAATCCGGTCACCGGGCCT
+GTCTGGGTTGCGGTGAGGCGCTCGCCGCACGATTGGTGACTGAAGCCGCTGGCCCCGATGTCATCCTCACCAATGCCACC
+GGCTGTTTGGAGGTGTTCACCACGCCTTGGCCGGAAAGCGCTTGGCGCTTACCCTGGCTGCACTCCCTGTTTGAAAATTC
+CGGGGCTATCGCCTCCGGTGTGGAAGCCGCACTTAAGGCCCAAGGGAAATCCACCAAGGTTATCGCCATGGGCGGCGACG
+GTGGCACGTTCGACATCGGTTTACGAGTGGTGT
+>generic137
+GACTGAGTTGCCGCCGGGCACCAGCTCGCAAAAATTCTGGAAGAAATCGAGGCCCTGACCAACCCCAAGATCAAGCTGGG
+TAAGAAAGCGCTCACGCCCGATCAGTTGCAGCTCAAGGCCTTGGTGCTGAACGTGCTCGACGCGGTGCGCGATGAGTCGG
+GCAAAAACGGCAGCGGTGCGCTTGGTGCTGGAGCCCCGCAGCCGCACCACCGACGTCCAAGAGCTGATCGCGTTGCTGTT
+GGCGCACACCAGCTTGGAAACCTCGGTGCCGATCAACATGACCATGATCGGGTCTGGACGGTCGGCCGGTGCAAAAAGGG
+CTTGCGCACCAATCGTGCAAGAGTGGCTCGACTTCCGCCAAGTCACGCTGCGGCGGCGCAGCCAGCACCGCTTGGATCGG
+CTGCTGGA
+>generic138
+GTGCGGCACCCGCCACCAAACCACGCACCTTGCCAAGGCCCACGCGCAACTCAGTTGGCGCGTTGATCAACAAACTGTGA
+ACAATGGGCGCTGCGCAATAGTGATCCACCTTGTGGTCGGCCATCGCCTCCAAGATGAGCTTGGCATCGACCTTTGCGCA
+GGCACACATGGGTGCCGCCCAGCATGGCAAGGGTCCACGGGAAGCACCAGCCGTTGCAGTGAAACATCGGCAGCGTCCAC
+AGATAGACCGGGAAGTGCGGCATGGTCCACGTCGCCGCATTGCTCACCGCGTTCAAGTACGCCCCTCGGTGATGGGTGAC
+CACACCCTTTGGGATCGCCGGTGGTGCCGCTGGTGTAGCTCACCGCAATCGCATCCCACTCGTCCGCCGGGCCGTTCAAG
+TCGAACCAAGGGCGCGGTATTCGGCCAACTAGCCTCTTCGTATTCATTGCTGGCCCAAGCAGGC
+>generic139
+CGTCGCGCCGGCGCTGCTGCTCACAGGCCCCCAAATCGCTTGGGGGCCAGCATTTTGGCAGTACGGGTCTGGCCAGCCAA
+CGAATACACCCGCGTCACCATCGAATCAGATCAACCCTTGGTGGGGACGCAATTCATGATGGATAACCCGCCTCGGTTGG
+TCATCGATGTGACCGGCTTAGAGCTGAGCGCACAGCTGCGCGAGCTGGTTGGCAAAGTGGGACGCGAGGATCCGCATATC
+GCAGGTGTGCGTCTGGGCCAACATCGGCCTGGCCGGGTGCGTATGGTCTTTGATCTCAAGCAAGCCAGCCGGCCCCAAGT
+GTTCTCACTGGCTCCGGCAGAGCCTTATCACCACCGGCTGGTGTTTGACCTCTACCCGGAACAAGCGGCTGAACCACCTT
+TGGCCAAGTTGCCAGAAAATCCACCACCACTCGCGCCACCCCTCACCGATGCACGAGTGGT
+>generic140
+AAAACACACGGCGGTCAAAAACGCACCTTGGGTTAATGAACGTCGTCCAACGATGGCGGCTGCATTGGTGGCGTGTCCTA
+ATTCAGGACGGGCTTGGGAAAAATCGGTGGCACGCTCCTGAATGTGCTGCAAAGCGGTTTCAAGGCTGGGATTGCGCGGT
+GCGGACGCTAAACGCCGACACCGTTCATGTGCCGATAAATACCGTGCGTGGTTTAAATCACCTTGCAGTTTGTTAAACGC
+AGGTTGCAGGGCGGGCGGTAATTCACTCAAATCATACCAGTCAATATTTTCATTACAGGTATTGTGTTCTGCGCCGATAA
+ACCAGCTATCAGCGGGAATGTGAATGCCACGCTCTGCCAGTAGTTTACGAATCTCAGGACGATTTGCCATAGCGGCAACA
+CCCGCGCATTCGGGCCGCCGTGCCGACCACTGCACGCACCACAATTGTATGCGGCACGGTGGGGATTATTTTGGCTGATT
+GAGCCGTGTCCAAACAGCACCACCAAGGGCGC
+>generic141
+TTGAATTCTTCGTAAATCACTTCGTCCATGCGTGAGCCAGTATCGACCAACGCAGTGGCGATAATAGTTAAACTGCCGCC
+TTCTTCAATGTTTCTTGCCGCACCAAAAAAGCGTTTGGGTTTTTCCAGCGCATTCGCATCGACACCACCTGTTAGAATTT
+TGCCTGATGATGGCACAACGGTGTTGTACGCTCTGGCTAAACGGGTGATGGAGTCTAATAAAATCACTACGTCGTGTTTA
+TGTTCGACTAAACGGCGGGCTTTTTCGATAACCATTTCCGCGACTTGGACGTGGCGGGTAGCGGGTTCATCAAAGACGAG
+TGGTGT
+>generic142
+GGCCGATCTAGATATCGTACTAGACTCTATCGGGGACAAGATCAAAATCATGCTAGAAGAACAACGCAGCAAACGTTTGA
+CCGAGGGAAAACGTCGAACGAAGCGAAGCGTCGTATAGACCATCGAAGCGGTGGCGCCGAAGGAGCGCCACCCGCACCTG
+CCGCACCACCTGTTCCTCACCCAACTGTCTCGGGAGCAGCGCCAGGCCCCGAAACTGCTCCAGGAAACAGCCTCTTTGGA
+CACAGTTCCAACGTAAGAGCCTGCGAATACAATTTCGGATCGTTTTCTACGAGTGGTGT
+>generic143
+GGCAGACCAGGAAATCGCCTTGGACGAACTGAAGTGGATAGTCCTGATGGTGCTGTTGAGCAAGGCGGACGACGCAGTGG
+CATTCTCACGCATGGAAGATTTCGTTTACGACCTGACTCCCGCTTATTTACATTAATCCTTACCCCCCTACCTACACAAT
+GAGCAAAACCTAGGTTATTGTAGAATCCCCTCGCAAAAGACGAAGACCATCGAAAAATAACCTGGGCAAAGACTTCAAGG
+TCTTGGCCTCTTACGGCCACGTCCGGGACTTGGTGCCCAAAGAAGGTGCGGTAGACCCTGAACATGACTTTGCGATGAAA
+TACCAAGTCATCGACCGCAACCAGCGCCACGTCCAAGAAATCAGCAAAGCCCTGAAAGAGGCTGATGTTCTTTACCTGGC
+GACCGACCCGGACTCGGAAGGCGAGGCGAGTTTCCTGGCACTTGCTGGAGTTGCTGAAGGGCAAAAACTACCTGAAAGAC
+AAGCCCGTGCATCGGGTGGTGTTCCATGAAATCACCAAAAAAGCCGTCACTGAAG
+>generic144
+ATCCGAAGCATCATGGAGATTTTTATTTTAGAAAGCCGAATACTGATTATTGGTTTGTAATGGAATCTAAAGGTGTAAAA
+TCCAACTCAGAAAAATGGCACAAGCTATATAATTTTGATAATTTAGTCATCGGGAGGAGACCCAAATCATTTACAACGGA
+ACTACATTATGGGTTTTGTCTTTACTGATGATCAGGAACAATTATTGAGTCTTACTGAGGAATGGTATGATAACTTTATG
+GATATTTATGAAACTTTAAATGCAGAAGACAGCATAGATGAGAAAGATATGCAAATTGACAATAGGATTCTATTTTCCGA
+TGATCAGGATTAAGGGCATTCATTATGAATAATGCACTAAACAGCACGTCAAAAGATAAACAATTATCACTGTTTACGGA
+AGATCGTCTATTTCCAAATCAACTGCCAACTTTTGACAAATTACAGCCATCACATAATTTATTAGCAATTTTTGACACGA
+GTGGTGT
+>generic145
+AACAAATATCTCGAACCCTCGGCATCATCCCTCGCAAATGGCTAAGAGAACTCAGAAGGTTGGTATCACCAGAAAGTACG
+GAACAAGATATGGCGCGTCACTGAGAAAGGTCGTGAAGAAATTCGAAATTACCCAGCACGCGAAGTACGGCTGCCCGTTC
+TGCGGAAAGGTCGCAGTCAGAAGATCCGCTGTCGGCATCTGGAAATGCAAGCCATGCAAGAAGGTCATCGCCGGAGGTGC
+GTGGGAGCTCACGACCGCGCCTGCCGTCACCGCCAAGACCACCATGAACCGTCTTAAGAAACTCAAAGAAGAGCAAGCTG
+CCGCGGCTGCCTTGGAGAAGAAGAACTGAGCACTGTTAATGTATGAATGCAACTTGAAGGGAAATTAATCGATCCACATC
+ATGCGTTCATCCTGCTGCTGCGGGTAATCATCTGCCTATCAGTATTGGTAGTGGTGGTGGTGGC
+>generic146
+GTTGGTTTGTCTTCCAGCATTATGCCCTTTTCAAGCACATGACCGTATTCGATAATGTGGCTTTCGGTCTGAATGTCCGC
+GCCAAATTGACGCGCCCCTCCAAAGAGCGAGATCAAGGATAAGGTGCATGAACTGCTGCGGCTGGTGCAGCTGGATGGGA
+TGGCTAATCGCTATCCGGCGCAGCTCTCCGGTGGTCAGCGCCAGCGCATCGCCCTGGCACGCGCCCTGGCGGTGGAGCCG
+CAGGTGCTGCTGCTGGATGAACCCTTCGGTGCCCTGGATGCCCAGGTGCGGGCTGAGCTGCGTCGCTGGCTGCGTCGTCT
+GCATGATGAGATCCATGTTACCAGCGTCTTTGTTACCCACGATCAAGAGAAGCACTGGAAGTTGCCGACCGGATCGTTGT
+CATGAACAAAGGCAGGATTGAACAGGCCGGCA
+>generic147
+CTGACACTTTGGAATACGGCGTGATGAATCATAATTTAGCTATATCGCGTCGTCTGGCGGTTAATACCGCCGTGGTTGCC
+GGAGTGCATTTGGCATGGCAAAACTACACCAACTCGGTTAATCGTCTGGAACAGTCAAAATATCTGACCAAAATTGATGA
+CGAAATAGCTGCGCTCACCCGAAATGCCCAGCAAAATCGTTCCGGTTCTGAAGTTGAGGCCATTCAAAATGAATTTAAGG
+CTTTTGGTTCACAAATGAGCCATTTATTGGCGTATACCAAAATGCAGGATTCTTTTGGGGCTTTTCTGGTCAGTTTGGGA
+TCCAGTCCAGTGCCTGATGAGTATCAGACTTTATCCGTTGGGGATTTGGCTAAAGTGTTAAGCAATAAATATCAATATTG
+GGAGAAAGGCGAGTTAGATATTGTAAAACTTGAGGAGCTTAAAAAACGACATTGCAGAACGAGCCAAGCTGGAAGAGGAT
+AAGTCTGTGGTTGCC
+>generic148
+GGCGATTTCGCGTGGACGTATGACCGCAGGCGGTACGGTTGATGAGCCTATCGGCAGACACCCGCAAGACCGTTTACGTT
+ATGTGGTGCGCGATGCGGGCAAAGAAGCCATCACCCATTACCGCGTAGTGCATCGTTTTACCCGTCATACCCTGATTCGC
+GTCAAATTAGAAACAGGACGCACCCATCAAATCCGTGTTCACATGACGCATATTCGCTTCCCTTTATTGGGCGATCCGAT
+GTACGGCGGACGTTTTCAAATGCCCGCCAATTGCAGTGAGCAACTGGAAAAAGAACTGCGCAGTTTCAAACGCCAAGCCT
+TACACGCTGAAAAACTTGGGCTAAAGCACCCTGTCACCGATGAGTATATGGAATGGGTACAACCCATGCCCGATGATATG
+GTGCGTTTGCTCGCCGCCCTCGCTGACGAGTGGTGT
+>generic149
+GGCGTCTCCGACGGAAACTTCACGATGGACGCCGACCTGCTCAAGAATTTCGACCAGATCCTGCCGCGCAAGGTCCCCGG
+CTACCGCATGCCGCTGTACGCCGGGCTGGGGCTGAAGTTCAAGACGGAGTCGGACGCCTTCGTCGGCATCCGATTCGTCG
+GCGGCGTGTCGATGTTCCATTCGACCAAGCCCATCGAGTTCTTCGCCGAGGTGGCTCCCGTCCTGCGCCTGGCGCCCAGC
+GAGGGCGGAACCTTCGACGGGGCCGTGGGCGTGCGCCGCTACTTCTAGACGGCCGTTGGGCCTTGACGCTCGACGGGGGC
+GGGGCTACACTGCAGGAACGGCCGCGCCCACACCGAGATGATCAAGACGAGCCGCTCCCGCCTCGAAATCCGGCAGGAAC
+CCGACGCGACCGCGTCCATGGCGGGCCTCGCCCTGGCATGCTTCGGCATGGTCGAGATGGTCTTCACGTTCGGAACCGTG
+GCCGCCTCCTACGCGCTGTCCCAT
+>generic150
+CATCTCTGTTGCTCAATTTGTAAAATCATGATAAATCACAGTCTGACTACTTATTTTTGAGTAGTCTAGGTAATTTATGG
+TGGATATCCGATGAGAGCTTTAACCACTAGAATCTGATGTGAAACGAAGGAGGGGTTTTATTCGACTCATTTAAGAGATT
+GAAGGCCTGTGCAGTCGATCTGGCGTTCAGTTGAGGGGGATTTCTTGCTTGTAAAAGCTAGAGAGGAAAAAGGGGAGGGG
+GGAGGGGGTAAACGTAAC
+>generic151
+GTACGACCGCGTCGTCAGCGACAGCCGCCAGCCCGAGGCGCGGGGCTTGCCGATGCGCCATGTGCGCCGACTCTTCCCCG
+ACGCTCAGCTCGAAAGTCGCCGCGTCACCTTGGCCCCGAACGTCGCGCGCACGGCATGCCGCATTTCGCCGCACCTCTAC
+CCCCTTCTCAACGCCATCCCGCAGCTGCGTACCCACGCGCTGGTGTGGGTGGGCAAGGCTCTCTAGTCCCCGACAATACC
+GCCCATGAGCAACGCACCGACCCCCGCCCTGCCCTTCATGCCCTTTGCCTTACCCGAGTTGGGCGAGGAAGAAATCGCCG
+AAGTCGTCGATACCCTGCGCTCCGGCTGGGTCACCACCGGCCCCAAAACCCGGCGCTTTGAACAAGATTTCGCACGAGTG
+GTGT
+>generic152
+TTTTCTTTTGCGCCGCAGTTTCCAAGGCTTTGGCTGCAATTTCCAGGTTTTTGGCGGCAACCTCTTTTGATCTGGCACTT
+TCGGGTACGCCTAAGCTTTGCCATTTATCATAATCTTGCCAAATGGGGTATTTGCCTTGCCAAAATTCTTTGGTGAAATA
+CGGTGATAAATCCATGCCGTGCAAACTGGGAATCCCTTGTTCGTTCAAGAATTTTTTATACACCACCAAACTAATATCGC
+CACCTTCGCCAATCCCGTTGGTGGTAAAAGCTTTTTCAACGTGGTCATGGAACATCCACACCCCTTCGCCGAAACTGTGC
+AAGCCGTCATCTGTGCCGTTTAATGATAAATCCAGCCGTTGTGCAGGAGCTAAACTATGCACGTCACGGATAATATGTGA
+ATTAGCCCCGTTATCAACACCGTCATAATGTGTCACGGTCGGTTTATGTCCATGTATGTGCAACGCAAGCGTTTCTGTAT
+GACCATTTAACACCCGTAATTTAACATTTTCCCCCATTTG
+>generic153
+GCTGAAGAGAGTTTCATTATGACGTATAACAAATTTGAATCTAAATCAGCTGGAGAGTTTGCTCAACTCTGATTATTTCA
+AGCTGCATCCCATTGATTTATTGACCTTAAGCGCGTGTCAAACCGCTGAAGGTGATGACAGATCACCTTTTAGGCATTAG
+TGGCGTGGCAATCAAAGCCAAAGTTCACAGTGCATTGGGGTCGTTGTGGCCGGTAGCGGATGAATCCACTGCGCAATTGA
+TGGGAACTTTTACAAATCCTTGAATGAACTTCATCAAACC
+>generic154
+GACCGCCGTGCGCGATGCGGTGATGCAAACGCTGCGTTCGCATGGCCTCTCGAAGCACAGCCACGTTGTCGGCAAGACCA
+ACGACCGCGCTGCGGTCGAAGTCTGGCGCGACGCGAAGTCGGTGTTTGCCGCACCGCTGCAACAGCTCCACCAAGCTTGG
+GACGATGTCAGCGCGCGCATCAGCGCCTTGCGTGACAACCCGAGCTGCGCGGCCAGCGAACACGCCGCCGCCGGTGCGCC
+GGACAACACCGGCTTGCATGTACACCTGAGCTTCGATCCGACCGAGGACGTGGCCGCGCCGTTCCTCAATCTGACGCGCC
+CCAAGGTGGCGATCCTGCGCGAGCAGGGCGTCAACTCGCACGTCGAGATGAGCTACGCCATGGCCCGAGCGGGCTTCGAT
+ACCTTCGACGTCCACATGAGTGATCTGCAAGCCGGTCGGGCTCGCTTGGATCAGTTCCAGGGCTTC
+>generic155
+GCACTTGGGTCACTCATACACCATGACTAAAGTTGACTTCACTGCTCGTTACAAGCGTCTCTAAGGCTTCAATGTCCTAT
+TCCCCTTCGGCTTCCATTGCACTGGATAACCTATCTCTGCCGCAGCGAATAAACTCACCCGAGAAACTGAGGTTTTCGGA
+CTGCCTCCCGGTTTTCCCCAAGGATAAGTAGGAATCAAGACAATGGAACATTCTCAAGAAAATGGGAATCAAAGAGGAAG
+AACTCCCTCAATTCCATGGATGCAAAGTTCTGGACTGGATACTTCCACCCGTACGCGACGAAGGACTTGAAGAGCTTTGG
+TGTTGCAGTCGACCACAGAAGGTCATTCATCACTACAGACGTTGAATCCTTATTACGATTCATTCATCCAATGGCAATTC
+ACTCTGCTCAAGGAACGCAATTACATCCCTCTTCGGCAAGAGAACCTTCAATCTACTCTAATTGCTTGACTAGTAAATCT
+GCGCCACGAGTGGTGT
+>generic156
+GACGTCGTGAACCGTGAGATGGAGGAGATCACCCGCTTGGGCATCTGCCGGCAGGCTGAGGTTGAGGGTGGTGGCCTTGT
+TGGCGGGCTGTAGCTGGGCGCGCCCAAGGTCGGGCTGCCGACGAAGTTGTCGAGTGTGTAGCTCAGCGAAGCGCTGGGCG
+AAGCGTTGCCGGCCGCATCCAGTTGGCGCGCTTCGACCGTGTAGTTTTGCGGGCCGGTGCTTTGGGTCGAGGCACTGGGC
+AGGGGAGCCATCGCCGACCACGCGCTGAAGCTGCCGGTGGCGGGATCGGTGATGCGGTACTCCATCTGGATGGCATCCGC
+ATCGGGGCTGATCGCGGCCAACGTGGCATCGCGGGTGGCTGCCCCA
+>generic157
+GTTTTTTCGCGCTTCACGAGCAGAAGCTAATGCGGCTTTGAGTTGTTCATCATCGGGAAAACGAATCGCATTAATCCGTT
+TTTGAGCGAAAACAGCAAACTGGACGGCGTTAAAATCGACAACAAATGATAATTTTCCTCATCAATCGGAAAGTAAACCT
+GTTTGACTTTCGCGCTGGTCGTGAAGCGCGAAAAAACGATAAACCTTACGAAGGTGACTATGCGGAAATTTACAATTTAA
+GCCTGATTGGTTTTGGTGGTACAAAGCCGCAAAATATCAGCGTTTTGAATAATCAAAATTATGGTGAAGCGTATCTTTTG
+GAATCGTTGCCGCCGATATTTAAAAAACGAAAATTAATCCACCACGCACCAATTTTTTTAGTGAAAGTTTGCGCCTCGAT
+AAGTTTCAAGATTCTTTCGATAAGTTGCATAAGCAATTAGAAACGTTAAATAACGACCGTAATAATAAACCTGCGCGAGA
+TAAAACGCGATTGG
+>generic158
+CAAACAGGTGGTGGCCTGGTACCACGACAACATGCAGAGCTTTGAAGGAGTCAAGCCGCCCTACATCGGCGAGGGCGTGG
+ACGAGATCCACTGGATGCTCTACGTGGTGCACCTGGGCAAGCGGTTCTCGGGTAGTGCCCGCGCGCAGATGATCGACGAC
+CTGCTGTCCTGCGGCATTGAGACCGCGCCTTACAGCCACCCGCTGCACCAGCAGTTTTATACATGCAGGCCGGCGAAGCC
+ATTGGCCGCCAGCGCGGCGTGCTGCTGGACACCGATCGCATCGGCGACCGCGCGCTGGCGCTGCCACTGCACACGCTGCT
+GGATGAGGAACACGTCCAGTACATCATCAAAAACGCTCAAAGACACCGCCACGAATGTGGGCGCAGGCGCCGCCATTTAC
+TAAGGAAAAACCATGACCGATTTGATTCAAAACCATTGCCCATCGCCTTGACACGGGCGCGGTCATTCCC
+>generic159
+GCGTCAACCGCGCCTGGACCGTCACCAGCTCCCCGACCAGGTCCACCAGCTTGTCGAGCCTGTCGGACTGGACGCGAATG
+CTCGTAAGCTCCTCGGATTTCTGGCGGTTCTTCCGCAGATCGCGCGCGTGCTGCTGTTCGGTGAGCGCCGCCTCCACCCG
+GTCATGATCGACCATGCCCTTTTCCACCAGGATCTCGCCGAACCGTTTCTGTTCCGACGTGATCTCCTGGATGTCGGCGG
+GGGAAAGATAGCCTCGCTCCACGAGGATCTCACCCAGTTTTTTATAATCATCCTCTTCCGTAAGCGCGCCTTCTATCTCA
+ATAGGCTCGATCGAAAGTTCGCTCGTATCCTGCACAAAGATAAATACATCCCTGATCGCATTTATTCCCCTGGTGGTCGT
+CAGGATCACGTCCCAGTAGACATAGCAAAGCTCAGGGTCAAGAGCTTCCAGGGGTGGACATCGCCGAGCTGGGCCACCAC
+CCGGCACGTGCCGA
+>generic160
+GCAAAATGTGCTCGGTGGAGGTGTATTCATCCTGCATGCCTTTGGCCAGCCGTTCGGCGCCGTTGAGCACGTCTGAGGCC
+GGGCGCGATAAATCGACGCGCAGGTTGCTGCCATAGACCTTGGGGCGTTTTTCCAGGTCGGCTTTGAGATCGGCAACCAG
+TCCCTGGGTGCCGCCAGCCACCTGGGTGACCAGGGTGGGCACGATGCCGTCTTCCTGGCGAAGTAAGGCGATTAGCAGAT
+GGACAGGTTCAATACTCTGGTGATTGAGGGCCTGGGCCAATTCCTGGGCCGCCATGACGGCTTCCTGTGCTTTTTGGGTG
+AAACGTTCAAGATTCATAACTACCTCCCGCGCCCCTCATAATAGGGGATGGTATTAAAGTAATCGTAACAGGATAATCTT
+AATTCCTGACGAGTGGTGT
+>generic161
+CAGCCCTCGGCCATTGAGCCCAAGCCCGCCAAGTGGGGGTGACAGCTGAGGCGCAAGGTGTGGGTTTCTTCGGCCAAGGC
+GAAGAGCTGACGCTCGATGGCCCGCACCGAGGTGCGCACCAGACCCAAGGTGTGCGGATGGTGGCTGCGCTGGTCGGAGG
+AAATGTCCAGCACGCCCAGCGTGCGGCCGTCTGGCCCCCGGATCGGCGCGGCGGCACAGGTGAGAAAGCCGTTTTCCTCG
+AAGAAATGTTCGGCCCCGTTGACCGCCACCGACTGGCTTTCATGCAAGGCGGTGCCGATGGCGTTGGTGCCTCGGTGGCG
+CTCTAGCCACGACGCGCCGGGGCGCAGCAAGATGCGGTCAGCGCGTTGCAAGAAGTCGGCGTCGCCCACCGAATGCACGA
+TCACGCCGTGATGGTCGGCCAGCACCACCACGCCGCCGGAACCGGCGATCAGGGCGTAGAGGTATTCCATGGTCGGGATG
+GCGGACGAGTGGTGT
+>generic162
+AGCATATCAAGGCGTTCGATCTGGCGGCCCACGCTCAGCAAGCGCCAGCCGTCGTCGCGCGTCATGCGGTCGGTCTGCGC
+CCCGGTGATCGCCGCCAAATAGGTCCCGACTTGATCGAGCACACCCAGCACCTCGCTGACCGGCTCGCCCTCTTCGCTGC
+CCATGACGGTGCGCAAGTCAGTGTCAAAGCGATCCGCGATTTCATGGATCAAGGTCCAGTGCTCGGGCGAGAGCCGCTCA
+CGCAGGGCCTCGGCACAGCCGCGCAAAGCTTTGAGGTTATAGCCCACGCTGGCCACCGGACCGGAGCCGGGCGCTTGCAG
+CATGGCTTGGAGCAAGGCGTGCTCAAAGGCCCGTGACGAGTGGTGT
+>generic163
+CATTGGGTGACTCCACCTGAAAGGGGCGTTGGAAAGCCACAGGCTGCTGCCCCTGCGCTGCGGCACACACCCATACCAGC
+ATGAGACACTGAAAGAAAAAAGACCGCAGCAAATGCATTTTCGAATGGGAAAGTCCAAAAGAGTCGAACAAGTACGGGGT
+CAACTTTTCAGTCTGCACCGCTCAAACGAGGAATTGATGATAGGCGATGAAATCGACCTATCGTGGCATTCGACCCACTC
+TGGTAGTCGAGATTCGTGCTCACAGTAGACGCTGCACATGTCCGGGGATAGTATCAACAGACAGTGGCTTCAAGACAGGT
+GATGCTCGATGCATGCCGGTCAAATCAAGCCCTTCCAACCGAATGAAACCCTCAACCCTGAACGAGACAGAGTCCAGCAT
+CCGACTCCTGGATCATTTTTACCGCATC
+>generic164
+CGGCGATCTGGCAGGTGCCTAGGGTGATGGCCGTGATCACCCCGGCGGTACTCCCCGTGTTGCTGCCGACGCTACAGACG
+GCTGGTGTGAGGCTGGTGTAGCTGACCGGCAGCCCTGAGCTGGCGGTCGCTGCGACCGTGGCGCTGCCACCGAGTTGGAG
+TGTGGGCGTGGGTTGCTGGAAAGCGATGGACTGCGGCACGGCGTCCAGCGCTGGACCGTCCCACGCCGCAGCCGCTTATC
+AGGCTGCCGATGGCCCCGCAAGGCCAGAAGCAGGGCGCGGTTCGATGAGGATGGTGCTTGACGAGATGGCAGGGGGCGCA
+TGCGTGGTCTTCGGATCGGGTTCTTGCAAAGCGCTTGGCGTTCACAGGCGACGAGTGGTGT
+>generic165
+AAAATACCATGAATCGGTTTGCTGAACTCACAGGGCGACAGTATCGGTTGTTTGAGTATATTGGTGCAGAGAATGCCGAG
+CGGGTGATAGTCATCATGGGGTCAGGCGCGGAAACGGTGACGGAAACCCTGAATTATTTGAATGCCCACGGTGAATCAGT
+CGGCGTGTTAATCGTGCGTTTATATCGCCCGTTGGATGCCCCTGCATTGTTAGCCGCGTTACCTGCCTCGGTACAAAAAA
+TTGCCGTGTTGGATAGAACCAAAGAAGTCGGTGCAGACGGCGAACCGTTATATAAAGATGTACTAGGTGCGATTGCCCAA
+GATTTCATCAGCGGTGGGGTGAAGTTTCCGACACTGCCGAAAATAGTCGGTGGGCGTT
+>generic166
+GTCGCATGTGCCACCACAGCTGCAGCCGCCCGTTTCGGATTCTGCCTCTCCTTGGGTGCCGGAGCCGCACGAGCAAGATG
+AACTGTTTTTCACAGGACTATCGACGGTGAAGCCTCCACCGCGAACAGGGTCATTGACAAAATCAATTTTGGCGCCGCGC
+AAATAAGCGATGGATTGGTCATCTACGACAACTTGCACACCCTGTGAATTGAAGGTCACATCGTTGGCGCGAACATTGTT
+ATCCAGTGCCATGCCAAAATTCACTCCACAACATCCGCCTCCGGCAACGTATACCCGTAAAGCATAGCCTTCAAGTTTGC
+GTTCGGTCAGAATTCGGTTGACAGCCTGTGCTGCTGCTGAACTCATCATGATTGTTTCGGTGTCTTGTTCTGTGATAGTT
+TCGATTTCGTTTAACATAGGATCTCTCCTTGATTTGGCTAAAGTGGATAAATCTTATCAGATATGTTCTTGCCTGTCAAC
+AC
+>generic167
+CACTCATTGCCTGCGATGAGAGGCGGGCTATCGCGCCAATGATGACTTCCTGAGATCAGGATAGGTTATTAAAAGACCGC
+TGAAAAGCCCCTTGGGCCAATTTTTGGGGATGGTATCAGCGTGATAGGTGGCGATTAAAAACCCGTGTGTTTGCTTGACG
+GGGCGTCGGATGCGTCCACTGTGTTGGCTTCGACAAGCTCAGCCCGAACGTGGGTGGTGGGTGGGACAGTGAGAACAGGC
+CCTTCGACAGGCTCAGGGCGAACGGATAAAAGATGCCCCTCGACCGCGTGGCGGCAGAGGGGCTGGGGGGAGGGTTTAGA
+CCACGTCGTGCAGGTAGCGTACTTTGACTTTGCGGCCCTTGAGTTTGCCGGCGTCCAAGCGTTTGAGGGCTTCGTCGGCG
+TGGGTGCGGGCGATGGCGACGTGGGCGACGAGTGGTGT
+>generic168
+TGGAAGGCAGGGTAAGCCAACTGCGCAGATCAGCGCTTTCGCTGACAAGATTCCACACATTCGCGGCAAACTGGCCAAGA
+TCTCCCATTTTTTCTTTGCTTCCGCCGCCGCAATCCCTTTGGCAACCGCCCGGATAATCTGGCGAGTGGCAATCACCGGC
+ACCTTTTCCTTAAGCGCCTTGACTGCCAGCGCCCGGACATCACAAATAGGGCTCTGTACTACCGACCAGTTCGCTCTTGT
+TGAGAATCCGCAGCGGTACCTGGGTCGACCATTTTTCCTGATAGACCGGGAATGCGATTGAAACAAGCCCGGCCCTGCTG
+ACCGGAATCGGAATTTTTACTTCGTGTTTCCGGGGGACAAAACCGTCCTCAAAAAGCACCAGAAGCTCGCCGGTTCCCGC
+GCCCTCTTCATCGACGAGTGGTGT
+>generic169
+CAATCATAAGGCTTGCCGTCCCTGAGCCAACTTTAGTCTCGCGTTTGACGCAGGAAATCAGAGTCATAAAAACAATATGA
+TCGTGAGGGATTTCATCACCTGAGAATTTTATCTGATCCGTTGCCAGCTTTGTCCATCTTCACCGTGTTCGTTAGAATTG
+CCGCGATGTTGCCACAGAATGCCCGTCAGTGGACAAGTAAACCCTGGGTGCCGCTGGTTGTTGCACTCCTACCCGCGCTG
+GTCATGGGTCTGCACCTGTTCTTCACTGCCAATTACGCGCTTATTGACGACGGCGTCACGATTCTCTCAGCACAAAGCAA
+CCCAAGCTGGTTCTTTAAAATTGGCGGTGGCGGTCGATACATGCCGGGGTATTGGCTGTATTTCTGGTCAATTTTGAAAC
+TGCTGCCCGAATCTCCAAAATCACTTGCACTGGGCAATGTCATTGCACTGAGCGCTGGCGCCTATCTGTGTTACCGGTTG
+GCGAAAACGC
+>generic170
+CGGAGTGGCTCCTCGGCGCGCGCGCGCTGCGCGAGAAGGGGACGCCGCTGCCGGAGGACACGCTCGCCGCGTGCCGCGAC
+GCCGACGCCGTTCTCATGGGCGCGGTGGGCGACCCCGCGTACGACCTCGCGCCGTACGACCAGCGGCCCGAGTACGGCCT
+CCTCCAGCTTCGGAAGTCGCTCGGCGTCTACGCGAACATCCGCCCCGCGCGCCTCTACAAGGCGCTCGCCGACGCGGGCC
+CGCTCAAGCCCGAGGTGGCGCGCGGCCTCGACCTCGTCGTCGTGCGCGAGCTGACGGGCGGCCTCTACTTCGGCACGCCG
+CGCTCGATCGACCTTGCGGCGGGCACCGCGGTCAACACGCTCCCGTACACGCGGCCCGAGATCGAGCGCATCGCCGAGAT
+GGCCTTCCGCCTCGCGGCGACGCGCCGGAACAAGGTCACGTCGGTCGACAAGTCGAACGTCCTCGAGACGTCGCGCCTCT
+GGCGCGCCGTCACGACGGAGGTCGGGAAGCGCCA
+>generic171
+AGCGCACTTGCTGCAATTCGCGGCCATGGGCAGCGCACTTGTGGCCGCTGTCGATGGCAAGGACAACCCCAGCGTGGGCC
+TGCTCAACATCGGCGAAGAGATGATAAAAGGCAACGAAGTCATCAAGCGTGCGGGCGAGTTGTTGCGCACGGCTGGGGCG
+GCGGGGCATTTGAACTTCTACGGCAACGTCGAAGGCAATGACATCTTCAAAGGCACCGTCGATGTGGTGGTCTGCGACGG
+TTTGTCGGCAATGTCGCCCTCAAAACCGCTGAAGGTCTCGCCAGCATGGTGTCGAACCTGCTCAAGCACGAGTGGTGT
+>generic172
+CGGAGCCCGAGCGCCCCGAGCCGCGCCTCAAGGGCAAGCTGGTGACGCTGCTCAAGCAGACCTTGCCGCTTGAGGTGATG
+ACCTTGCTGCGCCGCGCCAGCATTCGTCTGGCCGAGCGTCATTTGGACGTGATGGACACCTTGCCCGAAGCGACGCTTGA
+CGCTTTTGTGGCCGATGTCGATTGCGCGATCCAAGTGGCGCAGCGTCACGGTGCGCGGGTGGTGCTGAGTACGCATCCGA
+ACTTCTTTGGCTCTGAGCTGGCAGCGGGCGACGGTGCGGCGCTCACGGCGTGGCGCTCGTTCTACCCTGAGCTGCGCGAG
+GCGGGCTTTCTCGACATGGAGCGCCGGGCCAACGTGCGGCTGCGTCAGCTGGCGGCGCAGCGCGGTGTGCCGTTGGTGGA
+TGCGGCGGCGCAGATCCCCGGGGGGGCACAGACCTTTGCGGATTTCGTGCAC
+>generic173
+GCCACCGCTGCTTGGCGCTTTTCGCTGGCGGTTTGCACCAGCGCCGACAAATCATCGACGGTGTAGAGGTACACGTCATC
+CAGCCGCGCCACCTCGGGCTCGATATCGCGTGGCACGGCCAAATCGACCATGAAGATAGGCCGCCGACGTCGGGCCTTGA
+GCGCGCGCTCAACCGCACCCAAACCGATGATCGGCACTGGGCTGGCGGTGCAAGAGATCACTGCATCAAATTCATGCAAG
+CGAGCCGGCACATCTTCGAGCCGCATGGCTTCAGCACCAAAGTGAGACGCCAGCTTTTCGCCGCGCTCCAGCGTGCGGTT
+CGCCACCGACATGTGCTCGGGGTTGCGGCCGCAAAGTGCGTCGCCGCCAGTTCAATCATTTTCACCCGCGCCCACAAAGA
+GGATGCGGATCCGGCTCAAGTCTTCAAAAAGCTGAGCCGCCAAACGCACCGCTGCGGCCGCCATACTGA
+>generic174
+GCAATTTGAAGGGATTTTCTGTGAACCGGCTTCAGCGGCTTCCTTAGCGGGCGCAATCCGTGACATTCAAAACGGTAAAA
+TTCCTGAAGGCAGCCGTATCGTTTGCACTTTAACCGGTAACGGCTTGAAAGACCCTGATACCGCAATTAGTCAATGTGCC
+GATGCACATCCTGTCACGATTGATGCGTCATTGGATGCGGTTAAACGCGCGATTTTGGATAATATGTAATCACCAAAACC
+TTCCAGGTCTTTAAGACCTGGAAGGTTTATTTTTCCTGTTCATTTGAGATTGTGCCATGACCTCTTCCCTTGTATTAAAG
+CAAATATTTATTTATCCGGTTAAATCGCTGGCGGGAATTGCGGTTGAGAAATGGCAAGTGAACGAAAAGGGCTGCTTTAT
+GATAGAAAATGGATGTTGATTGACGAGGAACAACAATTTCTATCACAACGCCGCTTGCCAAAAATGGCGTTAATC
+>generic175
+CTTGAAAATATCCGTCTTATGCGAGAACACGTTCGTCATGAGCTTTGCGTCAGTGCCTCTGTTCATCATAATGTTTGAGG
+AGCAGCAATCCCATCCGAAGGCATCGCAGAGTGATTCTTCAATCGTTTTGCAATTTAATCGACTGTTGGAACCGCAATTG
+TAAAAATCTACTGTCGCACATTTGCTCTCTGGCCAGGAGTGGAAACTCATATGGGATTCGCTTAATAAGAAAAGCAGCGA
+GACTTGCCCGTTAGGGAATACCTTCACTCGCTTGTCACAGACATTGCAATCTGTCTTTTTGATCGCATCTTCGAAAATAA
+CCTAAATCCGTTTCGCATCGCCCAAATCAATTTGCGTGACGCCGTGGAAGTCCAACATAATGTGCGCTCCCATATTCTAG
+ATACTTTAATGGTGAATCATGCTCATTCCTTTTCAATAATAATGCTATCTATCGTTCGTTCG
+>generic176
+GACGACTCGGCATGCATGTTGATGAGGCGGTCTCCGGTGTTCTCCGGATAGCTGCTATGGAGGGGCTCGAGATTGCAGGC
+CTGATGAGTCATTTTTCAGAAGCGGATCTCGCAGACCGCTCATATGCAGAGAAACAGACCGTTGTTTTTCCAGAATACGG
+GATGAGATTGCGGCGAAGCTTGGGCGTGCCCCTGTCTGCCACATGGCGAACAGTGCCGCTGCACTCTCCCCTGATCTTTC
+CCTGCCGAAGAACGCCTTCGATGCGGTCAGGCCCGGAATTTCTCTTTATGGATACTCACCTTTTGAGGAGCAGTTCGGCC
+TCAGGCCGTTAATGAAGCTGAGCACAAAGATCCTTGCGGTTCGGACAATGGCTGCCGGGTCTCCGGTCAGTTATGGCAGG
+ACACGAGTGGTGT
+>generic177
+ATCACGTCCTCGCTGTCCGCAACGGTCGCGTTGAGTCGTGGGGAAGCGGTACGCTGGGCCAAACGGGGCAGGACAAGACT
+AACGGCAACATTCGCGCAGAGTGGAATATCGGGGTACCGACGCCCATCCTGGCGCTTGCCGATGTCGAGATCGCACAAAT
+CAGCGCTGGCTTCAAGCACAGCCTCGTCCTCGACACCTGCGGTAACGTGTACGCCTTCGGATCCGATGCCTTTGGGCAAC
+TTGGGCAGAACTTCCTCGGCTCGCAATATGAATTCCGCGCGTACTACCCCATGCTCATCCGTGACATTGCCACATGGCAA
+CTGAAGGTCTTGGGCATTAGCGCCGGATCGTTCCACAGCTTCGTTTTCGCGCAGCCATAATTACAACCCAACGAAGAAAA
+GCAAGTGAGTGTTATCCATTACGGTCTCTCTCCCACTTCGAACAACAGAAGAATACTGCCGCCGGTATAAACTATTATGT
+CGTGTTGGTTGTCGAAGAATGGCGC
+>generic178
+CCATTGTCAAACGCACATCGTCTTCCTGTAGGCGTTTATCGACAAACTGACCCAAGGCATCAATGTGATACCACTGCTCA
+TCGGTGTATGGTTTAGTGACGCGCGGGTCTTCGTGCAAACGGTCTACCGTATTGCTGAATTCAAATTCCACTTCACATTT
+ATCGGTACCGCCTGTGACGGGTGCGGCACTGGCTGGATCAGGCGTACACGCCAGTGGAATATGCCCCTCGCCTGCCAATA
+ATCCTGAGGTGGGATCCAGTCCTATCCAACCTGCCCCCGGAATATAGACTTCTGTCCATGCGTGTAAATCGGTGAATCCT
+GTTCAGGCCCCGAAGGCCCATCCAGTGATTTTATATCGGCTGTCAACTGCACCAGATAACCTGAACAAACCGCGCCGCCA
+AACCCAGATGACGCAACGCCATCACTAATAACCATGCGGAATCCCGACATGAACCGCTG
+>generic179
+GGCATGGCCACCCACATGTTGAGCAGTCCCAGCCCGCTGGGAGCCGGCAGGTACAGGTAGAGACCCGCGATGGCCGGGAC
+GAAAGCCAGCGTGTAAAGCCAGGTAATCTTGATGAATGCGACGAGGGTGCCGCCAATATCGGACGAGATGGTCAGCAGAT
+TATTCATGCCGAACCAGCACAGGATCGCCAGGGGCACCAGCGACAGCACCCAGGCAAATCCGGCGTTCTGGATGAAGGTT
+GGGGTGCCGGCATGTATCTTGCCGAAAATCCAGCCGCTGTCCTTGACCAGCATCATCGGTTCACCGCCCAGCGCGCCGAA
+TACGCTGACGGTCATCAGCAGCGGGATCAGTATCTGCATGGTCGTCACGCCAAAGTTTCCCAACCGGCGTTGATACCCAG
+CGCCGTGCCCTGCAGGCGCTTGGGAAAGAAGGTGCTGATGTTCGACATGGAACTGGCGAAGTTGCCGCCGCCCACACCC
+>generic180
+CGAACCCATTCGACGGTGCCGTCCGAGGATGGAGCACCGAGCGTTGCCAGCATCCCGTTGACCGACACCTGCGACACCGC
+GTGTCCTCCGCCGGAGGCGTCGGAGGCCGTGCCCGACAGGACGGCCGTCGCGCCCGTAACGACCTGACCGGACGAATGGG
+AGGCAATGGTCAGGTCCGGGCCGAAGGTGTCGCGTCCTCCCGGCAGGAACTCTTCCGGCTCAAGGGCGCGCCGCGTAATC
+CGCAACTCGTCGATGACGCTGGGACGTTGTCCATTGCCAAATGCGATCTGCAGTGCCCCCGAGACCGGACCGGGAAAGGA
+GGCCGCAGCAGAGGCGACAAGATTCCGGTCCACGTACATTCGTGCGGTTGTGCCGTCTACTGTCACGGCGAGATGGATCC
+AATCACGCGCGGTGTAGCGGTAAGGCACGGGCTGTGACTGCCGACACCGAGAAGGCTGAGGCCTGAAAGATGGCAGTGTT
+TCTGACGAGTGGTGT
+>generic181
+GGCCCTACTTGTCGTGCACTCAGTTCCACCATCAAACTTTTTCTTACTAACGGTACCGGTAACTTACTACCCAACCCCTA
+ACTTAGGTTCGGTACGACGGTTTCCCGTTTAACCGAACGTCGTTTTTGGTTTTAGTAAAAGTTAACGGTACGTAGGTCGG
+TAAAACGTAAAAAGGACGACCAAACGGACGGTCCTTTCCCGTTACCGTTTACGTTTCCGTCCGTCCCGACCCTAAACCTT
+TTACCGGTTTAACGGTAACTTCCGGTTTCGGGTTAGTTTACTTTTTTTCCCTTTTTCCCGTACGGACGTACCTTACGTAG
+G
+>generic182
+GGAGGCTATTCGGCAGCTGACGCCGCAGAAATTTCCCAAATTCTCGGACTGGAACTACGGCCGCCGCAGGAAGAAATAAT
+CAGTAGCCCCGAACGATTTGTCTGTTTTCGAGGTCTTGCCCGCTGAAGGTCATGAATTTTATGGTTTCAGTTGATCGTTT
+TGATGTGTTATGTTGAGGTTCTTAGAACATGTTCCAATCGGGTGCGGAGTCTACGCTTCGAAAGTTGTTAGGTTTTCTGG
+CAGTTAAGATATACTCGTTTCTGGACTTGCTCCACGCTACCTTTGCTGTGGTTTCCAACAATCTTGCGAATTTTTGAGGA
+TACTTGAAGCGGTATTAGCCACTCCTTCCAAGCAGGTAGCCAACAATACTCTTAGCGAGTCCTTTGAGGATATTCGCTTG
+TACTTAAATCCAGCATCTCGTCAAGAAGCCCAAAATTATATTTAAACTCCCGATTCAAAGAATACCTAGCTCTTGGTTGA
+CCTCCACAGCCAACCAACAATATTACGAATTGAGTTTACCATGGAAAAAGTTAGTGCT
+>generic183
+ATTATTTTTAAAACCAAGAGGTATCAAGGTGAAAACAGAAGTTTTAGTATTAGGCGGCGGCCCTGGCGGTTACACAGCAG
+CATTTCGGGCTGCGGACTTGGGCAAAAAAGTCACGCTGGTTGAACGTTATCCCGTGTTGGGTGGCGTGTGTTTAAACGTG
+GGCTGCATTCCATCGAAAGCATTGCTGCACGTCGCGCACACAATTAACGAAGCCAAAGAATCCAGCCATACGGGTGTGAC
+TTTTGCCGAGCCGCAAATAGATTTGGATAAACTGCGGGCGCATAAAACCAAAATCAGCAACGGCTTAAGCACAGGTTTAG
+CGGGGCTTGCTAAACAGCGTGGCGTGACAGTTGTGCAAGGATTAGGGCAATTTGTTTCTTGCGAATAACTTGCAAGTCAC
+CAACGGCGAAAAGCAAGAACAAATCGAATTTGAACAAGCCATTATCGCGGTCGGTTCACAAGCGGTGAAAATTCCATCCT
+TTCCAAATGATGACAAACGTTTGATGGATTCAACAGGCGCGTTAGCATTGGAAAG
+>generic184
+CACAAAGCCGACAAACAAGCCCGAGACCACGATGATGGCCAAGGAGTGGTTGCCGAGGAAATGAACCTGATCCGCCACCA
+AACCGGGGCGCTTCAAGGCCTGCGGACACAAGGCCAGCAAGCGAAAGAACAAGCGGGTGCCATAGCCGATGTTGCCCAGC
+CAGCGCCGAACCCCACGACCCACCCACAACGACGGCCAACGCCAACTCATGCTGACCTCCCGCCTTGGGCGCAGTTCAAA
+TCTTCCGCAATCGAGCGTGCGGGGTAATGGAAGCACACCGGGCCATCGGGCGAAGCCGTCACAAATTGGCGCACCAAGGG
+ATCCTCGCTGTGGCGCAATTCGTCGGGCGTGCCCTGGGCAGCGATGCGCCCATTGGCGATGAAGATGACGTGATCGGCGA
+TAGAGAAGGTTTCCTCGACATCGTGAGACACAACGATGGAGGTCACACCGAGAGCATCGTTGAGTTCACGGATGAGCCGG
+GCTGAAATA
+>generic185
+GAATTCCTTAAGCCCGGCGTGCGCGCGAGCCATGAAGTCCATCATCTTGATGCTGCTCGTCACGGGTCTGTTCAACAGTG
+TGCTGTACGATGGGGAGATCGGAGACTATTTTGCCTGATGTTGGGTCTGCTGATGGCGCTAGGGAGGGTTGGCCCGATTG
+AAACCCTAATAGCACAATTACCCCCAAACGCGACCGCCAGAACCCGTTCCAACTGACGATGCCCTCTAAACCCGATGCCG
+CCCCACGTTTCGCCGTCGATTGGCGCGTCTGCGCCCGTATTTCGGCGACCCCGTCGGGGTTGGTGGCTTCTCGCAGCGCT
+GACCACCCTCATCGGCGCAGCCACCGAACCCACCATTCCACGAGTGGTGT
+>generic186
+GTCACACTGATGCGCTGGCCAATCTGGACCTTGCGTGAAGGCATGTTGACGACCACGCCATTCACACTGACATGCCCATC
+ACGGATCAATTGCTGCATGTGATTGCGAGAGAACTCGGTCGCCATACGGCTCAGCCACCGATCTAAGCGTTCGCCATGTC
+CAGCGGCATCCACGGATTCAACACGGGTCTCAGCATCCCAGATGGGGACACTGCCCTCATCCGTGGCCGATACTTCAGCC
+CATTCCAGAGGGTCATTCATATAATTCGCGCTCTCTTCGGACCAACTTGACAATGAAAACACGGCCCCATGAGACCGACC
+ACCCTACGACTGACCTTCTTGGGCCAGAGCGCGCGCGGCTTGCGCATGGCCTTGCTTGGCTTCGGCTTCGGGCTTGCACG
+AGTGGTGT
+>generic187
+GTTTTGTGGTGCTTTGTGGGCAGTATCCCCTTCAGCTCGGACTTCGGTCAACGCTATCTGCATGTTGGATGAGGTGGCTC
+AAGTACGATGCCACCTTCTTTGGAGGCATGCCATGAACGTGAGAAAACAACTTTTTGCATCCCTGTCTTGGCGGGCTTGG
+TTTCTGGTTTGAAAGATGTTCGATCAAGTTGGCTAAAGGCATCATCTTGATGGGCTGGATCGTTATTCTTTCTGCCATCA
+TCTTGGTATGCGCTTTATTTTGGAATCGCCAACATTATTTCTCGGATGTCTGTAAATCAGATCATATCCAGCGATGCCCA
+TAGTTTGGAAGCCTGTCGATCCAGTGTCGGCAGTCGCTTGCATTGTTTCATTGTTGAAAACGATTTGAATTCACGTGGTA
+GTCCGCCACGAGTGGTGT
+>generic188
+CGGAGATCATCGACGGCGACAACAAGGATCAGCGGGCCGTCCACCCCTTCATCGATTTCACCGTGCTCTGCCACGAGTGC
+CATGACGCGAAGAGCTACTGACCCGTGCGAGAGGGATGACAAAACCTCCCCTCGATGACGCCGCGATCGTCCGCCAGGTC
+CTCAGGGGCAAGCGGGAGCAGTTCGGCCTGCTCCTGGAGCGCTACCAGAGGCCCATATTCAACTTCGTCTACCGGTTCTA
+CGGCAACTACGACCTGGCCCAGGAGCTGACCCAGGAAACCTTCCTCCGCTGCTACCAGTTTCTCAAGAGCTATGATCCCA
+AACGGAAATTTCGACCTGGCTCTATACGGTCGCGAAAAACCTCTGCATCGACGAGTTGAAGAAGCGCAAGTCCGCTCACG
+AAGTTCCCCTCGACGACGCCATCGAATTCTTCGAGAGGAAAGACCCGGACGGCGGCCCGGAGAAGGACCAGACGAGTGGT
+GT
+>generic189
+GGCCGCACCATGGTGCGAGCGTGAACGACGTCAACGCTACTGGCATGCAGCAATGCAGGGTGAACCCGAATAAAGTGGCC
+CCGAACTTGCTAGTTAAAGCGCACGTTGAGGGTGTCCATTCAAATCGAAACCATAAAGAACCGATGTTCGATGAAATGTA
+TGCGGGCCCAGCGGCCGCTCAGGACCTGCGGGATGCACGGGATCATTACGTGGCCTATGCCCGCTGGCTTGATCAACAGC
+CCCAAGAAGTCATGCGTGACCGCCGGGAGGAGGCGGAGATGATCTTCCGCCGGGTCGGCATCACCTTTGCGGTGTATGGC
+GACAAAGACTCGGGTGAGGGGACCGAGCGTCTGATTCCCTTTGATCTCATCCCACGCGTCATCCCGGCGCATGAGTGGCG
+TGAGATGGAAAAAGGCTG
+>generic190
+CCTTCGCCGTGACCGGCATCAGCGTGCAGGGCAATCAAGCCGGCACCGGCTTCAACTTTGTCTGAGCTGCCCGCCGAGCG
+CAGTTTGGCCGGGCGGATCTACACCGATCTGGCGGGTGACGGCGTGTTCAACGCGGGCGATGTGGGTTTGGCGGGTTTGA
+CGGTGACGCTCAGCGGCACCGATCTGAACGCTCTACCTCTGACGCGTACCGCTTTGAGCGATGCGCTGGGGCGATACAGT
+TTTGCCCCTCTGCCTGAGGGCAGCTATGCCTTGAGCTACGTCGCCAGCGGCCCTGCTGCGACCACCAGCATGGCTGCGCA
+AGCTTGGGTGGGCACGGCCGGCGGTGTGGGCGGCGGCACGGCTTCAGCCGGTGCGGCCTTGCAAACCAGCGCCATCAGCC
+TGACCGGCATGGTCACAGCCGGCAGCAATTACGACTTCACCCGCGCCCCAGCTTCCAGCTTGTCGGGTC
+>generic191
+GGACGAAGCGCGTCGCAACATGACGAAGATCAGCCTGAACAATGGCACCCTGTATCACGCTGTCGTGGGTGAGCATGGCG
+CGGCCAAGGTGTTCATGCAGCCGGCTTCCGAAGGTACCGGGATTATCGCCGGCGGTGCGATGCGTGCGGTGTTCGAGGTG
+ATGGGCGTGACCAATGTGCTGGCAAAGTGCATCGGCTCCACCAATCCCTACAACGTCGTCCGTGCCACGCTGAACGGTCT
+TAAATCCATGAATACACCTGCGGAAGTTGCTGCCAAGCGCGGCAAGTCCGTAGAAGACATCAGGGGCTAATCATGGCGAA
+AGCAAAGAAAGCTGCAGCGAGCACCGTCAAGGTGACGCTGGTCAAGAGTGTAATCGGTCGTATCGAATCCTACCGCGCCT
+GTGTGCGTGGCTTGGGGCTGCGTCACCTGAATGATTCCGTCGAAGTGCAGGATACCCCTGCCAATCGCGGC
+>generic192
+CAGACCGCTGAAATGCTGTGCCGCTTCTTGCGCCTGCGTGGCCAAAAAGTCGGCCATTTGCTGCTGCAACTCGGCTTGCG
+CCTGCGCCCGGCCCTGCGCCACACCGTCGGCATAACCGGCCCGAAAGCTTTCTTGTCGCTCAGCCTCATGGTCTGCGTTG
+CCCTGCACGGCCTCGCGGGCCTTGACCTGTGCCTCAAGCAACTGAGCGGCGGTGTCAATGGTGCCAAAGTGCCATTGCTC
+CACGGCCTCAATTTCTTCACCCGGGATAAAGCGTGCGTAATTTCGCATGGTCACACCATCGCGTCGTCAGTGCCACCGCC
+AATCACAATGGTGCCTTCGTCGGCCAGACGGCGCACCACCTTCAGAATCTCTTTCTGCCTGCGCTTCCACTTTTGACAAA
+CGCATCGGCCCACGTGATTCCAGGTCTTCGCGCAGGGTTTCTGCGGCGCGGGTGGACATGTTGGCCA
+>generic193
+GCCTTGGGCGCGGCGGCCTGCTGGGCCGGCGCAAGCCTTATTTCAGTGTCACCGTCACGGTATCTGGGCGCCTTTGCGTT
+CACGCGCTGGCGCATGCTGATGGTCGCCTTGATGCTGTGGGCTGTTTCGCTCGCCACTGGCGGTTGGCGCAGTCTTCAGC
+CGGCGTCCTGGAGCGTGATGGCCCTGAGCGGCCTGATTGGCATCTTCGTCGGCGACACCGCCTTGTTTGCCGCCATGAAC
+CGGCTCGGGCCGAGGCGCTCGGGCGTGCTGTTTGCCACCCATGCCATGTTCGGTGCGCTGCTGGGTTTCTGGTTGCTGGG
+CGAACGCATGAGTCTGCAGGCCAGCTGGGGTAGCGCCCTGACCATGGCTGGCGTCATCAGCGCCATCCTGCTGGGCCGCG
+ACAAGGACGACCAGCATGCATGGGAAGCAGATCGC
+>generic194
+CGCAGGGAGGCTGGACTTTACCGCCCCGGCGACGGTGGAATAAGCGGCGACGCCGTTTTTGTTAAAGACCGTCAGTTCCT
+GCAGGCCCTGCACCTCTTTCTGCGCGGCCAGCAGGCGGCGAAACTTGTCCATCTCACCCTCGAACATCGCGTCCGAAAGC
+GCCACATTGCAGGCATATTGGAGATTCTCGATGGCGCGCCACTGATTTTGCTCTTCCGCGCGCAGATTGTTCTCGGCGAT
+CCGGTGTACCAGGGAGCGCATCCGCTCGTATTGGAACGTCAACGATGCTGCGAACACGACGCCGAGGCACGCGATGATGG
+AGACGAGCAGCTTGTTGTGAAGTTTCATGGCAACGACGAAAGCGGCGTGCCGTGGCATCACGCTGAATGCGGGAAACCCC
+GCCCGGTTTCTATCGGTACAAACGGCGGGAGCTTTACCGCGGGCGCGGAAAAACGAAACGCGGCGCCCGAAGGAGCGCCG
+CGGTACTTGCACGAGTGGTGT
+>generic195
+CGTCGCGCCGGCGCTGCTGCTCACAGGCCCCCAAATCGCTTGGGGGGCCAGCATTTTGGCAGTACGGGTCTGGCCAGCCA
+ACGAATACACCCGCGTCACCATCGAATCAGATCAACCCTTGGTGGGGACGCAATTCATGATGGATAACCCGCCTCGGTTG
+GTCATCGATGTGACCGGCTTAGAGCTGAGCGCACAGCTGCGCGAGCTGGTTGGCAAAGTGGGACGCGAGGATCCGCATAT
+CGCAGGTGTGCGTCTGGGCCAACATCGGCCTGGCCGGGTGCGTATGGTCTTTGATCTCAAGCAAGCCAGCCGGCCCCAAG
+TGTTCTCACTGGCTCCGGCAGAGCCTTATCACCACCGGCTGGTGTTTGACCTCTACCCGGAACAAGCGGCTGAACCACCT
+TTGGCCAAGTTGCCAGAAAATCCACCACCACTCGCGCCACCCCTCA
+>generic196
+AAAAATCTTAAACACGGTAGACTACGCGGGTATTTCCTGCCGCGTTCGAGAGTGTGCTGGGTGTTTCCTGAACCTATATT
+GACCCCGGGAACGCATATTTGTTATGGCGTGTATGCCCATTCATTTGGGAAACCCGATTAACAAAAAGCGTTCCCACTTG
+AACCTTCGGTTCAAGGACGAAAGTACATAACGGCGCAGGCGGGTCATACTTTTCTATTCAGTCTTCATCTTGCACTTTGT
+GTAGCGCGACAGCTTGAGCTTGCAGCTCGTTCATGGTTTGTTCCAGCGTATCCATAAACAACGGCCGACCGCCTCCCCAG
+TGTAGCGGCTCAGCAATATACACATCGACGAAAAACGGTACTAATATCATCTCGCCTTTCGGCAAACACTTCCCCAGCCC
+ATAAAAGAACACAGGAATCACCGGCACATCGGGGCGTTCGCTTAATAAATGTCCGATACCGTTTTTCATTCTGTCCATTA
+TTTCTGGTTCGCCGCGCGTACCTTCGGGAAAAAT
+>generic197
+CTCACGCGAGACCCGCACCACGCCGTCTGAGGGCTTCACCGCCGCCGCTGCGGCCACCGCCTTGCAGCGGCATTGCGCCA
+CCGGCTGCCGACACACCGGGCACATGCGCCCGCTCTCGGTGGAATAGACCAGCCCACCGCCGCTGAATTTGGCATTTTCA
+TGGGGCGTGATTGTGCGGCGCGCGGGGAGTCATCCGCTACGATCACGCGCTTTCCCTCGATCAATCCCTTTTTTCAAGGA
+CATTCCATGTCATTCAAACGCCTCTTGACCCCGTTGGTCATCGTCTCTGCTCTGGCTACTGCTCTCACCGCTTGTGGCAG
+CAGCGCTCTGTCTACGGCTGCTGCTGTGGTCGGCATGGTGGATCCGGCGCAGTTGGATCAGTTGAAGCCGGGCTTGAGCA
+CCCTTGCGGACGTGATCAAGCTGCTCGGCCCGGCTTCGGCACAAACCACCCAGCCGGACGGCAACCAGTTGGTGC
+>generic198
+CCGGGGTTCGTTTTCGTCCTTCCCTTCCACGGTACGTGGTTCGTACTATCGGTCGAGTAAGGAGGTATTTAGTCCTTCGG
+TAGGGAGTGGTCCCCCCGACCCCTAGTTTCGGTTAACCGAAACGGTTTAACGGTTTACCGTACGGTCCGTCCCGTTCCCG
+TTACCCTTACCGTACGTTTACTTTACCTTAACTTTAACTAACGGTTTTACGGGTTTTTCGGTTACGGGGGTACCGGGGTA
+CTTACTACCCCTACCCGTTAGTTACGTCCCGACCGTACGTTTTCCCTTTACCGAAACGTAACGTTTCCGTTACCCTAAAC
+CTAAACCTACGTTAGTTAAAGTAACGTTAACGGGTTAACGGGTAACTTAACCCCGTTTCCCCCGGTTCCGTCCGTCCCGG
+CCCGTACCTTAAACGGGTAAAGGGTAACTTCCGGTTTCGGGTTAGTTTACTTTTTTTCCCTTTTTCCCTTCGGGTTACGG
+GTTTAACGTTAAGTAGTTTTCGTTTACGTTACGTTTCCCTACCGGTTACGGGTTCCGTTCCTTACGGTACGGTACCTAAC
+TTAGTTAGTTTACTTACTAGTACGAAACGAAAGTAACCTTAACC
+>generic199
+GTTTTGGAGGTTGTAGTAAATCTGCGTGCTGTCACGCCGCCGGCCGAGCACACCCGCGCGGTACAAGGTGGCCAAGTGCT
+GCGACATGTTGGGCTGGGTGGTGTCGATCTCGCACAGGAGCTGCGACACGTTCTTCTCGCCATTGCACAAGGCACNAGGT
+NAGCTGAGCGATGGGGTCGAGAGGATGGAAAACAACTCGGCGACCGAGTCGAACACCACGTCCTCAGCGGTCTTTGATTT
+CATGGGTAAACCTTTGGTGCGTCATCGGACGCTGTGTGGCCCCAATTTTATGCGCAGCAACTGATAAACATCTTAGGAAG
+CCTAAGCCCGCCAAATTAGGCTTGGGTCCCAAGGGGGATATTGCAGCCAGCCCTGATCCGCATCAATCCTTGAAGC
+>generic200
+AGGTTGTAGAGCGTCGCGCCCAACTGGTAGTTGTCGTGGTGCCAAGCCAAACCGGCATCCAAGCCGATGGCACTGGCCTG
+ACTGCGCAGCGCCGGATCGTTGCCATTGCCGTTGAGCGTGGTGGCATTGCCATCGGCGTCCACCACGGCTGCAAGCTGAC
+GGTAGAGCTGAGCGTTGTAACTGCTCAAGCGCAGGCCCACATCGAGCTGCGCGGCCAGCGCGGCGGGGATCAGGTCTTTG
+TAGCCTGCTGGGGTGATCTGTGAAATGCGGGTCGCATAACCCAAGCTGATTTGTTGCACCACGGCGGCCTTGATGTCAAA
+GCCGGAAGCGGTGGTGACGGCATAGCTGGTGACGAGTGGTGT
+>generic201
+CACGCTTCAGCGGTCGGGAGCGTGAGCTGGCTTTGATTCGCGGTGTCTGGGCCGAGGCCTGTACCCGATCACGCCGCGTG
+CTGTTGATCCGTGGTGAGGCCGGCATCGGCAAGTCCCGCCTGATGGGCATGGCCCGCGAGATCGCCAAGGACCAGCTCCA
+TGAGGTGTTCGAGGTTGAATGTTCGCCCTACGACATGAGCAGTGCGTTCTTTCCCATCGTGACGATGCTGCGGCGGCGCT
+TGGGACTCGATGCGGCGGCGCAGTCGCCGGAACAAATGTTGGAGGTGCTTGAACGCTTTGCTGCGGGGCGTCAAGCCCCG
+CTTGAAGAAGCGCTACCGCTGTTGGCCGATTTGTTTCCATCCCCACCGGCGACCGCTATCCACCCCTTGAGATGGCGGCT
+ACGCGCAGACGTCAGCGCACGCTGGCGATCTTGGCCGACTTGTTGCAGCACGCCCCCGATGGCCTGCCGGTGCTGATCC
+>generic202
+GGACAAACTGGCCCGGAGCGGCCCAGCCCAGATCTCCGCCGTCCTTGGCACTGCCATCCTGCGACACTTCCTTGGCCATC
+GCAGCGAATTCAGCCTGCCCCGACTGAATGCGCTTCTTGGCATCTGCCAATTGCGCGACTGCAGCAGCCTGCGTCAACTG
+CGGTCCAGTGCGCAGCAAGATGTGGCGCGCATGGTTCTGCGCGACGGTACTGGGTGGTAGACCTGCACTGCGCCTGTCCA
+CCAGTTTGAGAATATGAAAGCCTGCCGCAGAACGCAGAGGTCCGGCAACGGCGCCCTTGTCCAGGCCCTGAATCGCCTGA
+ACAAACAGGGTTGGATACCGGTCGGCGCTGCGAAGTCCCATCGATTTGCCGCTTGCGCGCTCCATACCATCCGAGAAATC
+CCTGATCAACCCACTGAAATCCTCGCCCGCCCGGGCACGTTCCAATACCTTCTGCGCGCGCTCCAGCAAC
+>generic203
+GCCCAACCGCTGAAATGATGGAGCGGCCGGACCAGGATCGCATAGACGAAAGCGCCGACAACAATGGAAGGAACGCTGAC
+CATAATGTCGGATATAATGCTGATGATCCGGGCAATGGCTTTTCCCCGTGCATACTCGGCCAGGAACGTCCCTCCCAGAA
+CGCCGACGGGAACCCCGATCAACGTGGCAGCCAGGGTGATCATCAACTGGCCGACAAAGGCATTCCTGAGACCGCCGCCT
+TCGACGCCGGCAGGCGCAGGATCGTTAAAGAACAGGCTGATGTGCAGCGCTCCAAGGCCATGGATCAGGACATCGGCCAG
+GATATACACCAGCCAGAAGAGTCCGATCGCGGCTGCCAGTCCGCTCAGGCTGAGTGCGATGATGCTTTCTATTTTTCGTT
+TTTGTTCCGTGGTCATATATATGTCCGAACCTTTTTTGACAGGATTACAGGATAACATCTGATTTAAAGACAAAGATGTT
+GACCGGATTT
+>generic204
+CGCTGTCGCGCTCAACGATGTTGTAGTGGATGTTGGGCCGATCGAAGCTGGCCACAAAGCGGCGCGCCTCGTTCAATTGC
+AAGCGCTCCAAGATGTCGGCTTGGGTCTGGGCGTCGGCGGTGGCGGTCAGGGCCAAACGCGGCACCTGCGGGAACTGCTC
+GTGCAACACCGAGAGTTGCAAGTAGTCAGCGCGGAAGTCATGGCCCCACTGACTGACGCAATGCGCCTCGTCGATAGCAA
+ACAGCGCCAACAAGCCGCGCTCGGCCAGCGAAGTCAAGATGCCCAAAAAACGCGGCGAGATGACGCGCTCAGGGGCGGCG
+TAAAGCAAGGTCAAACGCCCAGCAAGCAAATCGCGCTCCACGGTTTGGGTCTGGACGGCATTCAAGGACGAGTTGAGAAA
+GGCCGAAGCCACGCCCGCTTCATCGAGCGCGCCACGAGTGGTGT
+>generic205
+ATCAGGCGTGGCCACAGCTGCGACCGTGACCGCCGGCTGGACCAAGCCGTTCAAGGTGTAGGTGTAGGTCAGGCTGCCGA
+GGTTCGGATCGACGTTGCTGACGGTGATGCTGCCGTTACGGGTCAGGGCATCGGCGGCACCTGTACCGTTCGGATCGTTG
+AGCGGGTTGACGGTGTCCACCGTCAAGGCCGCCGTGATCAAGGTGGTGGCTGTGTCTTGGATGAACGTCACTTGGGCATT
+GTTGGAGGCCACGGCGGTGACGGGCTCCAAGGAGTGAACCAAGACGGTGTAGGTGCCGTCGCCGGCGGTCGGGATGGCGA
+TGGGGCCGCCCGTCATGGGCAAGCCCACTACCGAGGTCCACGTGGCACCGTTGTCTAGGCTGTAGGCGTAATCGGTGCTA
+CCCGCTACGCCCGGGGTGACGTTGATCGTGGCGGTTTGGGTGACCACGGTGGGGGTATCGACTGAGCCGGTGTCGGCAAC
+ACGAGTGGTGT
+>generic206
+AATGCAGGTGCAGATAAATCCATACCTGCAATAGGTGATTACGCAATGATAACCTTAAAAAGTCACTTCAACACCACCAA
+AGAAAGACACTGGCGCACCCGAATTCAGGAGTTGACTGGCTGCCGTGCCTCTTTCAACGACGGAATTACTGGAGACAAAG
+TTTTTGTCGAGTAAATTACGTCCTTCAAAAACACTTTGTAACGCTCGTTGGACCAGCCAGTACGCACGCCCAGCAAACCG
+TAACCTGACACTTTATAAGTATTGGCAAAATCGGCATAACGCTTGCCCGCCGCATCAAACGTAGGTCCTACGAAAAAGCC
+GCTGGCATGACGATATAACACTTCACCTTTAAGGAAATAACTGGGTGCAGAAGGCAAGCGGTTGTTGCCATAAAGGGTGT
+TGTTATCAAAATTGAAATGATTGTAAGTGACCGTCACCATCGGTGCGATAGAGTGTGTGCC
+>generic207
+GTGCTGAAAGCGGGCGCATTCGACTATCTGGCCAAGCCGGTCGCACTCGATCAGTTGCGCAGTCTGGTCAAGGCCGCACT
+CAGCTTGCCGCAGACCGCACCGGCTGGCGACAAGGCTCTGTTGGGTCATTCGCCGGCGATGCAAAAGGTGCGCGATCTGA
+TCGAGCGCGTCTCGCGCAGCCAGGCTCCGGTACATATCAGCGGCGAGTCCGGTAGCGGCAAGGAATTGGCGGCAAGACTC
+ATTGTGCAAAGTGGTTCGCGCCGCGATCAGCCGCTGATCGCGGTGAACTGCGGAGCGATCCCGGAGAATTTGATGGAGAG
+CGAATTCTTCGGTTACAAGAAAGGCGCGTTCACCGGCGCGGACAAGGATAGAGACGGGTTCTTCCAGGCTGCACACGGCG
+GCACTCTATTCCTGGACGAGGTGGCCGACCTGCCGTTGGCGATGCAGGTGAAGCTGCTGCGCGTC
+>generic208
+CTGACAATGATTTCTTCAGAAATGATAGTGGAGAACCTCAATCAGTCCTCCCGAAGATTTGAAATTGCAGTGAAATGCTA
+CCGAAAGAGAAACAAACAGTTCACTGCTTCAATTTGATACAAATAAGACGCATCAAAAAATCGTTCTTAGAGCACAAACT
+CAGGAAATTTTTGTTAACAAAAAATACAAAAGTAACAAATATCTGAGAATGTGAGTTTTGACCCCATAAAACAAGAATAA
+TTAAATTATTTAATTTGTATTAAACCAACACAGCGGCAGCGCACGGCTGAGCATGTATGCCGCAAGCCCATACAGCATCA
+AAGCAAAGATTTTTTTCTAATTGAGCCACGTCCAGCGCATGCGCAGCACGGGCACCCCAAGGCGCTGTCAAAACACTTGC
+CAAGGCCACCACCATCAGTCCAGGTAGCCAGAGGTAGCCCAAGCTGCCCGACGAGTGGTGT
+>generic209
+CGGTCGGACACCGCCGCCTCGATGAATGCGACCACCAGCCCTTGCCAATCGAGACCGGACTGCGTGATGTAGGTGCGGAA
+GCGCGGCCAACTCGAAAAGCCCTGCTCGCGTGCGACAGCCCGTTGAGCGTCGTGCAGGCGCGGCAGCCCCTGATCGAACT
+TCGCCGGCTGGCGCTCGATCCGTTCGAGCGCGTCTGGCTCCCCGGCCTGCGCGGCTTTGAGCAGGGACTTCGCCTGCTTG
+CGGTAATACTCGAGGTTGAGGCGAACCGCCTCGGAATGGGTCTGCATGCGACCTCCTTTCAATTTGCGCCCATCGTCCGC
+ATAACGGGCTGAAAGAAGGTTCGTCCAACGGAGAACGACCAGATGGTGGGAAACTCCCTTTCCGCGGACCGGCAGCGCCC
+ATGACGAGTGGTGT
+>generic210
+CAGCAGCTCTCTTCTGGACGTTATCTTCAGCATCAACTCGCTCCAAAACCAAAAGCCCGTGCAAGAAGCACAGGCTTTTG
+ATCATACCGACCGAACTCGGCGTGAATACCGCGTTTATTGTCCCGGTTCAACCTGCTCGTTCAACTCAGCCGCAGAGATG
+AAGTAACGCCCGGCCGTGTTGTAGTTGATGTGCTCTTCATTGCGAAACATATCCGCCAGCGCCAAAAACTCTTGGGGCCG
+GGAGTAGAGCTGATGGACCGTGCTTGTCATCAAAAAACTTAGTAGTAAAGATAAAACTAGGTTTTTCTTCGACGCTGTAG
+CCGAGCCAGTAGTTTTCTAACGCGCTTCCAAGCCATGTTTGTCTCCTTGCAAGATAAGCCCACGCCGCTCAGGCTGCTGC
+TCTGGCTAGATCCTACCTTGTGAGACCGAAGATTGCTGCACTAACGCAGGGCGTCAAAAGCGCTAAAACCACTCGGGACG
+AGTGGTGT
+>generic211
+ACCACCCAAAGTTTTGCCGCGCGGATAACGCAGCGTGCGCCCGTTCAGTCCCGCGTCGGGCTCGGTGTTGTACAGCCAGT
+CGGTGCGCGGATTGCCGATGCACTTGAGGTAGCCCACCGGGATGTGAATCCAGTGGTAGTCGTCCTTGCGGCCGGCCTCG
+ATCAGCAAGACGCGTTTGCTGGCGTCAGCACTCAACCGGTTCGCCAGCAGGCAACCGGCGGTGCCGGCACCAATGATGAT
+GTAGTCGAAGGTGGTGTCGCTCATGGCAAGTGTCCGAAAAGAGCCGAGTTTGCCTTAAATCTTTCACAGACTGCAGTGGC
+GCAGGTACGATAGTGCGCATATGGCATCGACCAGCAATTCAGGCATCGACGAGTCCGAGCCACGACTGCAGCGTGAGGAC
+ACGTCGCAGGGTCCGCTCGTGCGGCTCACGGGCCGCTGGACACGAGTGG
+>generic212
+CGCCAGCGCCAGCCGGGCAGCGCAGGGTTCATCAATGCCGTGCTGCGCCGCTTCCTGCGCGAACGTCACCTCTTGGTTGA
+ACAACTCCAAGCCACGGACCCGGTGGCGCGCTACCAACATCCCAAGTGGTGGATCGACAAGGTGCGTCAAGACTGGCCTG
+AGCAAGCTTCGGCGCTGCTCGAAGCCGCCAACGTGCAGCCACCCATGACGCTGCGCGTCAATGCCCGCCACAGCAACGCC
+CTTCGCTACGCTGAAGCGCTGGCCCAAGTGGGTATCGACGCCAAGGTGCTGGGCTCGCACGCCTTGGTGTTGGCGCAGGC
+CGTGGCCGTGCATCGCCTGCCGGGCTTCGAGCAGGGTCATGTCTCGGTGCAAGACGAGTCCGCCCAACTCGCTGCCCCTT
+ACTGCTTGGGGAAGGGCCGATGCCCTGCCCGCCAAGTCGCGGGTGCTAGACGCTTGCGCCGCGCCCGGGGGCAAAACT
+>generic213
+GTCGGAGAAGAGCGCGTCGACGACTTCCTCCGCCTTGGGGAGCGGCGCGGAGAGCGGCGAGGTTTGCCCATCGGTGACAA
+ACGAGAAGCCGCCGCCGCCGCTGGTAGCGCTTGCGTGCTGCGCAGCGCCAGCGTCGGACGGCAGAACGAAGGAGAAACCG
+CCGCCAGCGTCACCGCCGCTGCCGCCGCCTCCAAAACTCGACGGCACATGAGCAGCGGCAGCCGCCGCGAAGGCAGGGGC
+GGCCGCGGCAACTTCGGTTCGTTGCTGCGCGGCGGCGATTGCGCCATCAGCGCTTCCTGCTGCTTCTGCAGCTCCTCCAT
+CAGCGACGACGCCGTTGTGCTTTCTGCGGAGGCACCGGCCACGCCGCCTCCGTCGGAGACGAAGGCAAACCCCGCGCCGC
+CGCCGCTCGATGCGGCAACCGGTGCTGATGCCTCACCGCCAAAGTTGAAGCCGCCGCCGCCTGCTCCGCTCGAGAATCCA
+CCGCCG
+>generic214
+CGAGATCATTTACGGTCATGCCTTCAAGCCCGAGCCGCGCGTCAAGGTGCAATCTGAAACCACCATCACGCTCGACACCT
+TTCGTGGCATGACCCGCAACACGACCCGCAAGAACTCGCCATGACCCGTCCAGCCCGCCTTGATCGCCGTGCCTTGCTGA
+CGCTGCTGATGGGGGGAGCGATGGGATCGATCAGCGCGGCCCTGCTCAGCGGCTGTGAAGAGCGTCAGCACTTCAACGCA
+CTCAACATCACCGGGGCCAATTACGCCCAAGGTTTTGATCTGCTGGACCAGCACGGCCAGCGCCGGACTTTGGCTGACTT
+TCGCGGCAAAGCGGTGTTGGTGTTCTTCGGCTACACCCAATGCCGGACATCTGCCCGACCACCTTGAACGAGATGGTCGA
+GCTCAAACGGCTGCTCGGCCCTGACGGGATGCGCTTGCAAACCGTCTTCATCAGCGTGGACCCCCGAGCGCGATA
+>generic215
+GTGCTGGCGGGCGCTGCCGCGCTGGTGGTGGACAGCAACCTGCGCCCCGATCTGTTGGCGTGGCTGTGCACCCCGGGGCG
+CGTGGTCTTTGCCGAGGCCGTGTCGGTGGCCAAGTGCAGCAAACTGCTGCCGGTGCTGCACCTTCTGCATACCTTGAAGG
+CCAACCGCATGGAGGCGCAGGCCCTGTGCGGTCAGCCCATCACCTCGGTGGCCTCGGCGCAGGCCGCAGCGCTGCAACTG
+CACCAGCGCGGTGTCCAGCAAGTGGTGATTAGCCTGGGCGCCGAGGGCGCGGCTTGGTGCGATGCCCAAGGCACCACCGG
+CCACCGCAGGGCGCAGACCATCCGCATGGCCAGCGCCACCGGCGCGGGCGACGCCCTGCTCAGCGGCCTGGTCTACGGCC
+ATTTGGGGGACATGCCACTGGACCTGTCGGTGCGCTTTGCAATGGCCTGCGCCGAGCTCACCTTA
+>generic216
+TGCCGATAAAACCACTGGCAAGCCCTTTTCCAAACCCACCCCACCGGCTGGATCGACGGATCACTGCGCTCACAAACGAT
+GCATGGCACGCCCGTAAAAGCGGTCGCAGCCAAGGCAGCGATATTCACATTCGGCAAAAACGAAACCACCACATCCGGTT
+TTTTCTCTTTCACCATATGCCGCAGCGCACTCAACCGCGCCCCATACCTTTTGCCCCCACCCTGCACAACCCCAACCCGC
+TCCGACAAATAGATCAAATCAATATCAGGATGCAACTGATAGAACGGCTTCCCGCCCCCCGAAAACGTCGGCACCAACGT
+CACCTCATCCCCCCTATGCGCCCACGCATTACAAAGCGTAGTCGCCACACGTTCGGCACCACCGGAGCCAAGAGAACTTA
+TAAGAAAAAGAATAATTCATTTCATCTATGAGATCAATCAGATTAAAATGCCGAAAGGCTTTATTTACAGGCTGACAAAA
+C
+>generic217
+CGGTGACCACCGGCAGCAGCGTGACCACCTTCAGCGGATTCGCTTCCGCCACCGGGCCGGTCCAGGCCGGACAGAAGGTC
+TCCGTCCGCGGTCTGCTCTTTAAATCCACGCCCAGCGGGCGTGCAACTCATCGCCGGCAACGTGCTTCTGCGTCCGTAAG
+TGCGGACGCAGAGGGCACACGTTCATCGCAGAGTGAAGTCCAATGAATAGAAGTCTATTGCCCCTGCTCCTTCTGCTTCG
+TCATTGCAGCCATTGCGGTCCCCAGCCATGCGGCCACTTTGCAGGGTTGGCCCCGGTAAGCCGTTCGCCAAGCCTTGCGC
+CGCCATTGCCGCGGCTGCGGCAGGCGACATTATCGAGATTGACTCCAGCGTCACCTACGTGGGCGATGTCTGCGCAT
+>generic218
+AACCACGCAGAGTGGCAAAAGCAAAACCTGCAACCAGCGCGTCACCGCAACCGACATGGCTGATAATTTCACTATCATTG
+CAAATCACCGAAGCAGCCAGCGCAGATTTATCACTGACCAGCAACGCGCCTTGTTTTGCCCTGGAAACAAGAACCTGTTT
+GACACCGCTTGCAACAATATCACGGGCGGCGGCGAACAGGGATTTTTCATCATTTAGACTGCAACCGGTCAACAATTCAA
+ACTCTGCCTGGTTTGGTTTGATTAAATCAGGCTTCGCTTGCAGTCCGTGTTTTAAACTTTCGCCGCTGCTGTCCAAAAAT
+GCCAGTGCCGATTTGGCGTGACAAATCTCAATCACAGCAGCATAAAAATCAGCTGGCGCACCTTCAGGCAAGCTGCCAGA
+TAACACCACAATGTCGTTTTGATTAATGCAGGCTGCAAGCTTGCTGTATTAAACTTTGGCAATCAGCAGCTGTCAC
+>generic219
+CCGGCGTTGTTCTTCGAGTAGGCGAAGTTCTCGCCGGCCGTGTACGCAGCCAGGCAGTACTGCGTAGCGCTGGAGGAGCC
+GCAGGAGTTGGGCACCGGCAGGCCGCCGGCCGCGTAATTGATCGCCGTCGATTCGTTGTTGAGGTCGTAGTAGTTGTAGT
+AGACCTTGCTCTCGAGGTTCGGCGTCAGCGTCGAGTTCAGCGCGGCGAAGATCGTGTTGGTCTTGTGCTCGCCGTTGTAC
+GAGCTCGACGGCGTCGTGACGAGGTAGCCCGCGCCGTTGGGCGGCGCTGCGTTGTTCGTCGGCTTCAGGCCGCTGGCGGC
+CGGGTTGAAGTCGCTGGTCAGCTTGCTCTGGGTCGCGCGCAGGAGCAGCGCCGAGTCGTATGGCAGGTCGCGCCACGACA
+GGTTGAGCGCCCATTTCTGCAGGTCGTTGTTCATCGGCCCCAGCGAGGTGTCGAGCGCGCTCGCCAGGTAGAAGTTCGTC
+CAGTTCG
+>generic220
+CAGGTGCTCGACAGCTACGGCATCGGCGGGCAGCGCGTGCAGGGTGCGCCGGGGATCTATGTGCGCATCAAGGATGCATG
+CGATCCGACGGACCCGCTCTCTGGGATGGGCAAGATCGCCGCCTTGGGCGTCAAAGTCAGCAACCACTGCACGTATCACG
+GTTTAGCGCTGAACGTCGCCATGGACTTAGCCCCTTACCAAGGCATCAACCCGTGCGGCTACGCCGGCCTGCCCACCCTC
+GACTTGGCAAGCCTAGGTGTCAACACCACGTGGGACGAGGCCGCCCAACGCCTCGGCCAACGCCTCTCTGCCCTGCTTCG
+CCCTTGAGCCAAGACATCCAACCCTTGCACACCATGAGCACTGAACACACCCCCTACGACCCCAGCGTCAAGCAAAAGGA
+CCGAGGCCAAGACCGCACGCATCCCCA
+>generic221
+CCAGTGCCAAGCGCAATGCCCACGCTTGGGCGTTCCACGCCATGGTGACCACCGCCAGCGGTGCGGCGACGAAATGCACG
+CCGATGTAGAGCGCCAAGGCTTGGGCCAGCAGACCGGCTTCGTGCCAAGCGCTGCCAAAAAACCACTCAAACAGCCATGC
+GCCCAGCGCCCAGAGCAGCGCGACCAAGGGCAGGGCCAAGGCGGTGAGGATCAGCATCACCCGGCGCACGGCTTGGCGTG
+CTTCGAGGCTGACCGCACCACCAAGGGGCACCTCACCCGCAGCCGCCAGCTTCGTGACGAGTGGTGT
+>generic222
+TGTCATGATTGCCCGTGCAATCAGTGGAGTGGAACCGCTCTAAACTCTGTTCTTGTCAGCCGGACGCAACCGGTCGGTCA
+TGCATCCGCCACTACCGGTGCGTAGCTGGCCTGGTATTCTCGATCGTGCGCCAACAAGGCCCAGACAATGCGGGCGTTCT
+TGTTGGCCAGCGCCACGGCAACCACGTTCTTGTTCCGTCGGCCCAAAAGCCGCTCGATCCATCCATCGGCCTGTTCAGAT
+TTGTGTTCCGCCACCCGGATCACCGCCCGTGCGCCATGGATCAGTAGTTTTCTGAGATAGCCGTCGCCGCGCTTGCTGAT
+CCCCAGCAAATTTTGCCGACCCCCAGTGGAGTGCTGCCGGGGTACCAGCCCCAACCAGGCCGCGAACTGCCGCCCGTCCT
+CGAATGCCTTGGCGTCGCCGATGGCGGCCACCAAGGCGCTGGCGGTGATCGGCCCGATACCCGGAATCGCGGCCAGTTTG
+CGGCTGGCCGCA
+>generic223
+CCCGAACGTGAACAAGGCGAATATATTTTATTCTGCCGTGAGTTTGACGAGAAAAAGCCTTATGGGAAGGGGCGCACGCG
+GGGCTTGAAGGTGCGACTAATGTTTATGAAGCGGATGATTCTTTTCCGATTGACGATTTAAACGACATTTTGCCGGGTAT
+GTTGGAAAATAAATCCAAAGTGTTTTATCCCATGGGGCGTGATTCGGATTTAGACCATAAATTATTGGATTGGATTAATC
+ACATACGGCGACAATCTCGCACAGGTATAACTGCTCCTGGGGAATTAGTTTCTTTAGAACATATTCTGCATGAAATGCGT
+TTATTCAAAAAGCGCGGCAGAGTTTAAAAACTCATGCGCCAACGCGGCGCAAGGTGTCCGCTAAACGCGCACATCAAAAG
+CCATGCAGAAATGCAAAAGCTGGCTTGTAATGAA
+>generic224
+GTCAAAGCAGACCACATTGATGAGGTTGCCGCCCAAGCAACTCGGCACCGTGTGGGTGTGGCCCGCGCGACTGGCCGCTG
+CCAGCGTGCCCCGGGCTTGGGGCTCAAGCCAAGCGCCAAAGCCGTCGAGCAGCCATTCGCCCCAGCTGCTTTGGGCGTGC
+AGGACTGGCGCGCGCGCGCCGGCTGGGCCCCCTGGAAAGGTGCGTCCGCCCCACAACCCACGTCCACGCTTTGCAAGCCT
+TCGGCCATGCCCCGTTGCCAGTTCAGATTCAGCCCGTTGTCGATCCAGTCGTCGTTCAAGATGACGCTCTTGACCAGCGG
+CACTTGGGCAAAGCGGTCGAAGTGGCCGGCCGCGGGTCAGAACTGCACCCATGGGCACCCGGTCGCGGCCGAGCTTCATG
+TTGAGGCGATCCCCCCGATGTCTTGACGCCAACTCAGCTTGGCCGCTTCCACGTGGATGGGATCGTTACCGTGGCGGCCC
+CAAGCGACGTAGGCACGAGTGGT
+>generic225
+GCCGCGCTTCTCGGCGCAGTCCCGCTCGCGATCGGCTTCGGCAGCGGTGCGGAGCTGCGCAGGCCGCTCGGCATCTCGAT
+ACTCGGCGGACTGGTGGTAAGCCAGTTGCTCACGCTTTACACGACCCCGGTCGTGTATCTGTATCTTGACCGCTTCCGCA
+TGTGGTGCGCGACGTTGCGCGTGCGCCGTGCGCGGGGTGGCGAACCGTTGGCAGTGGAGGCTCGATGAATCGCGGGTGGA
+AAAGACTTACTCAGGAGTTGGCAACTTGGACGACTGCATTTATTTTTTCAATTGAGAATTTCCTATTTACAAGATTTTCA
+GCGGTTAACATCCCCCTCATCCCACCTCTCCGGGTGGTTCCGCGCTTCGGGCTCCTATCGTCCCTCTCCCCCGTTTCCGG
+GCGCGAGGGAGTCCTCCACATTCCTCACCTGCACGGAAGGAGTTCACCCCCTCGCCCGCCTGGG
+>generic226
+CTGACTTGAACCACCGGTAACTGCACACCGTAGAGGCCGGCGTGGCGTTGGGACTCGTCGGACGGCATCGGCTGGGGCAT
+CAGCGAGTGGTCGCATAGCTCTTCGCGATGAGGCGAGAGAGCACCGCGGGGACGACGTCAGTAGTTGCGCCCACATTCTG
+GGGCTTTTCCGGTGGCCTTGCGGATGAAGGCGGAGAGTGCGCGAGCGTCCTTCCGGCGGTCCGGATCGCTGATGGCGGAG
+AGAAAGGCCGTCACACCGGCATTGGTCCGCCGGGTCTTGAGTTCGGCCTTCGTCTGCAGCATCGGTCGGCTAGATCGTCA
+GTAGATCGCCAACGGGTTCAGCAGTGAACCTGAGCCGCCTCGCATCCGCAGCGGCGCCGCCACGAAGAGAAACGTCCAGC
+GGTTGAGTTTTGACGCGACACGGGCAAGTTCCTCAAAGTCCAGATTGTCCATCAGGGGCATGCCCATCGCGACGAGCGAC
+AGTTCATGAATC
+>generic227
+GACGACTCGGCATGCATGTTGATGAGGCGGTCTCCGGTGTTCTCCGGATAGCTGCTATGGAGGGGCTCGAGATTGCAGGC
+CTGATGAGTCATTTTTCAGAAGCGGATCTCGCAGACCGCTCATATGCAGAGAAACAGACCGTTGTTTTTCCAGAATACGG
+GATGAGATTGCGGCGAAGCTTGGGCGTGCCCCTGTCTGCCACATGGCGAACAGTGCCGCTGCACTCTCCCCTGATCTTTC
+CCTGCCGAAGAACGCCTTCGATGCGGTCAGGCCCGGAATTTCTCTTTATGGATACTCACCTTTTGAGGAGCAGTTCGGCC
+TCAGGCCGTTAATGAAGCTGAGCACAAAGATCCTTGCGGTTCGGACAATGGCTGCCGGGTCTCCGGTCA
+>generic228
+ATCGGTGACATCGCCCCACCCTCCGCCGAGCTGCCAGGCGCCGAGGCCAATCTCACCGTTGAGCCGCCCCGTCTTGCCGA
+AAATGCGTGAATTCATCGCGGACAGTGTTGGTGGAATGGGCACCGACGACAAGCCTGCGCCGCGTGTCCTCCTTTGTAGG
+GGCGTGGCTTGACCACACCCGAGCGCCGTCAAGCGGCACCCCAACATTGTAGCGGCAGGCGTCCCGGCCTGCCGGATCGA
+GCCAAGTTCCACAGGCACGGAGGCCTGTGGCTACTCAAGTCTTCCGGATCAATTATCCGGGATCAGCAGGTCGGTCAGCT
+TGCCGGCGGCGAGCCGCGTGAAGTAGGCCGTCGGATCGGGCCGCAGGAGCGTGCCGCCGAACGTGACCGCCTCCTTCGTC
+TTCGCGTAGTCCAACTCGTCGCGGGCCCCGTTGAGGGCACGCAGCTTGCCGAGCTGTTCCACGAGTGGTGT
+>generic229
+GCCTGAGCCAGCCCACCCTCGTCACGCCGCATTGCGGCCCTGGAAAGTGCCGTCGGCTTGGCCTTGTTTGAGCGCACCGC
+GCGCGGCCTGGCACCCACCGCCGCCGGGCAAGCGCTGGTCGAGCCCGCCTTGCACATGCGCTCAGCCGTGCAGGCGCTGG
+GCTTGGCGGCGCAGCAAAGTCAGAGCGTGGCCGGCACCGTGCGCCTCACGGCCAGCGAGATCGTCTCCGCGTGGGTGCTG
+CCACCACTGCTGCGCGCATTGGCCGAAAGGCATCCCGACATCGAGGTGGAACTGGTGGCGAGCAATCGCCTCGATAACCT
+GTTGGAGCGTGAAGCCGACATCGCCATCCGCATGGTTCGCCCCACGCAAAGCGCGGTGATCACCCGCCATCTGGCCGACT
+GGCCGCTGGGGTTTTATGCGCACCGCGATCACTTGACCCGCCAAGGCGTGATCGATGGCCGCCTA
+>generic230
+GGAGCGTGGTCGCCGTCCATGGAAAAGACGGACTCGGTAACGATGAGAACCGACGGTTTGTTTTTCCGCCCTCCGCGTTC
+CGCCCTCCGTGTTTTATCCGCCCATTTTAGAATCGCTTCGAGATCGTTGAGATCGTTGTGGGCGAAGATGCGCCGTTTTG
+CGCCACAAAGTTTCGCCGCGTCCACCATGCTGGCGTGAATGAGTTTGTCGGTGATGATGAGGTCGTCCTTGCCCAGCAAC
+GCGGTGATGGTGCCAAGGGCGGCGGCGTAGCCGGTGGCAAAGGTGAGGGCGGCGGCCGTGGCTTTGAAGGCGGCGAGCGC
+TGCTTCCAGTTCATGAAACGGCGCGAGCGAGCCGCAGACCAGCCGCGAGGCGCCCGCGCCCGCGCCGAATTGTTCCACGG
+CCCGAATGGCCGCGGCCTTGAGCGCCGGATGATTCGCACGAGTGGTGT
+>generic231
+GCAGAAATAAACCTAACCCAACCTACAGTAAATGACTGTCTGGTTCTTTTCGAATTGTATGATTGTATTCGTGACGGAAT
+AGGGAAATGGCTTGATAAATTATTTTCCGCGCTCGGTTCACACCGCCTAATGGGCGGTGTTCGGGTAAAGCGTGCCAAGG
+GGTGAAGGATAAATTGTCACCGAATTGCCGCTGTTCTTCGCTGTCAAATTCCTGCGGGAAAATTCGGATGGTTGCCACTT
+TGCGAAATGGCGATAGGGCTTCCGACCATTCATGACCGGGATCTTCAATCGGCATGGTCTTAGAGTCAGTTTGTAACTGC
+ACGGTAAAATCAAATACGGCTTCACCGCTCTTCAATTGATTGACCATTGCCAGCCGCAGATAATCATCGTCGGGGTAGTC
+GACGAGTGGTGT
+>generic232
+TTACGATAAAGCCCATGCTTTAGCGGCGCAATTTAACGGCTATGCAATTGCCCTGTCGGAATTGCCGATTCATTTAGCCG
+AAGCCGATATTATTGTCTCTTCCACTGCCAGCACCTTGCCGATTTTGGGCAAAGGCATGTTGGAAAGTGCGATTAAAAAG
+CGCAAACACAAACCGGTTTTCATGCTGGATTTAGCCGTGCCGCGTGATATTGAACCGGAAGTCGCGCAATTGCCGGACGT
+TTATTATACACGGTTGATGATTTGCAAAAATACCATCGACCAAAACATGAATTCGCGCCGTCAAGCAGCTGAACAGGCGG
+AAGAAATTATTGATACACAAGTTGAACATTTTCTGGACTGGCTACGTTCGCAAGGCGCACAAGGCACCATTAAGGATATC
+GCCAGCAAGCGGAAATATGCGCGATGACATGCTGCAAAAAGCCTTGTCGCAACTGAATAACGGCATCTCAGCAGAAGAAG
+CACGAGTGG
+>generic233
+GTCTTGGCTGAGGCGTCGCCGGGATTTCTCAGCGAGGAGACGCCCAGATCGACCAAGCCGCTTAACTTGACACTGGTTTG
+GGCCTGCGCCACCGCAGGCAAGGCGGCGATGCTCGCAAGAACAGCAGTGGCGATCAGGGTGTGGATGGCAGTGGTTTTCA
+TAGGACCTCTTGGGTTGAGAAGGATGCGGTGTGGGCTTGCGTGGTGGTGTCGCTGTTGTCGCTGTTGCGGCTGCTGCCGT
+TGAACACCACGTTGAGCAGCACGGCTGAGAAGGAAGCCAGCAAAATGCCGGACTCCATGAGCGGGTGCAGGGGCAGCGCC
+ATTTGCTGCATCCAGCGCGGAGCTACCAGCGGAATCAGGCCGAAACCGATCGAGATGGCGACGATGCTCAGGTTGTGGCG
+GTTGGTTTTGAAGTCCACGCCCGAGAGGATGCGGATGCCGGTGGCGGCCACCATGCCGAACATCACCA
+>generic234
+CTGGGTGGGGCGATGGCGGCGGCCACCGATGAGAGCGGCATTCAGTTCCGCATCCTCAACGCCTCCAAAGGTCCAGCGGT
+GCGCGCCACCCGGGCGCAAGCGGACCGGATTCTCTACAAGGCCGCGATTCGGCGTCGGCTGGAGAACCAGCCGCACTTGT
+GGCTCTTTCAGCAAGCGGTCGATGATCTGATGCTCGAAGGTGATCGTGTCGCCGGCGTCATCACCCAAGTCGGGATTCGT
+TTCGAGGCGCGTACCGTGGTGTTGACCGCCGGTACCTTCTTGGATGGCAAGGTCCACGTTGGCTTGAACAATTACCCGGC
+AGGCCGTGCAGGCGATCCGGCGGCGGTGACTTTGTCGGCGCGGCTCAAAGAATTGCCGATGCCCCAAGGGCGACTCAAGA
+CCGGCACGCCGCCGCGCATTGACGGCCGCTCGATCGATTTCAGCAAGCTTGTCGAGCAGCCCGGTGATCTGGATCCGGTG
+CCGGTGTTCAGTTTTCTCGGCAC
+>generic235
+CTTGAGCCGTTCATGTGCAGCAGCACGACTTGCCCAGGCCGGGCTGTGCTTCTAGGCTGATCAGGTAGGCCGCCATGGCT
+TTGAAATCGGTGGCCTCACCCGTCACGCGCAGCAGCCCGGAACCGGCATCGGGTTCTAGGCGTTTCAAGGTGATGCCGTT
+GCGGTTTTGCTCAAAGATCGTCATCAACTCTTCCCAAGGGGCCGCCAGATAGCCCGCCACCGCGTCGATCTGGGCATGCC
+GGTGGCGATCTTCGGCACTCATGGTGGCCGTGGCTGCGCCGCGAGCGCCCTTGGCGGGTGCAAACAGGGTCGATAAGTTC
+TGGCGTTCGGCTTGGACACGGGTGTGAAGTTCGTACCAGAGCCCACCCTGCCAAACCACCAAACCCACCCCACCGCAGCC
+AAAGCCCAACCTGCACGGTAATAGCCCCCACCTCCTTGGCGGACAAAGTCAAGACGCGGCCAGTTCATGAGGCGGCTCCC
+AGCATCAACCAACCCTGATCACGGGCTT
+>generic236
+GCAAGCTTGGGCATCAAACCTGAAATCGGACGCTCATCGGAGCACTGCCTTCATGTGACCGATAAGTCACCCGACCTTGA
+TAAACGAATGGCGCACTTTTTCCAGCTGAAAGTTTGCTGTCGCGCACGAATAGATGAATAGCGACACCCAGTTCCTCGTG
+ATGAATGAGTGTCTGACCACGCTTGCTGGCGGGCGTTGTGGCGTTTTGGCTCTGCCAGTGGAAGGTGTGCGCGTCGAGCC
+AGTGGTCGTGATAGCGATGAGCTTGAGCCTTGCCTTGCTTGTTCAATGTCACCAACAAGATGTGCGCTTTCTTATCGTGC
+AGCACCACATGACCAACATTCCAGTTGCCGACATTGAACGCTTCACCGAACAACGGCGGAATGTCTTCTCGGGCGAAGGA
+TTCACCCACA
+>generic237
+ATCGGGTTTTTTATGCCTGAAATAAATATTTTCTACAGACAATTGGTAGCTAATAAGGTTTTAATACTTTCAAGTCAGGT
+AACATTTTGAAATCCTTGATGTTATCAGTCATTAATTCTAACTGTTCAACATTTGCTGTTGCGGCAATTAACGCATCAGG
+AATTAATAGACCATGACTTTTGCTGTAAGTTATTAGCCATTGATATGCTTGATTTGAAATAGCGGCAGAAAGTAGTAGCA
+AAGAGAATTCAGCGATTAACAGTTGTGCTAAATTAACTTCACGTTTATTGCGACAGCCTACAATCAATTCCATTGCTGAA
+ATAGCAGAAATCGCCAGGTAAGTGTCGGTTTGCCTTTGTTGTTCAATAAAATCGGCTGCCTGTTCATTTCCGCGTGACAA
+ATCAATCAGCAAATGTGGTGTCTAAAAGCAAGCTCTTCATATTTACGCCCATTGTTGTTGTCTAATGCGTTGTAAATAGT
+CGCGCGAATTTTCTTCTATATCTTGCAC
+>generic238
+GGCGCGGTCGCGGACGCGGTTGAGGAGGTCGGCGGGCAGGCGGCAGGCCACGGGGATGAGCTTGGGCGCGGCGGGGCGCT
+GCTCACGTTTGTCGGCCGATGGGGCTGCTGCTTGGGCTGAGCCTTGGGCGAAGCGGTGGGGCACGCCCGTGGCCTTCATC
+TTGCCCTCAAGTTTTTGGCGAGGTTCTTGACGAGGCCGGTGTTTTTAAGCTCATGCGCTATCTCTTGAAGTTTTTGAAAC
+GTGGCGCGCATTGTCCGCTTTATCCCCCACGCTATCCCCCACCCATCGCCTTCCACAGCGTCAAGCGGTTGAGCTGTTCG
+GCCAAACGGGTCTGAACGAGCGCTTGTTCGGCGGCCAGGAGGTTGCGCTGGGCGTCTTGGCGTTCGAGCTCGCTGGCTGC
+GCCCCGGCTGGCGCGCAGGTCGGTCAGGCGGGCGATCTCACGGGTGCGCGCAGTTGCAGCTCTTGGGCACGGCGCTGATC
+ACGCCAGCTGGCTTGGGCGCC
+>generic239
+GTCACGGGCGTCTACGCTGCGGCGTATGACTCGGCCGAAGGCTGGGACAAGCTCAAGGAAGAAATTGCCGCCTTCGCCGA
+CGAACAAGGCCGCCGGCCGCGCGTCATGATCGCCAAGCTCGGCCAAGACGGTCACGACCGGGGTGCCAAAGTGGTCGCCA
+CCGCCTACGCCGACTTGGGCTTTGACGTGGACATGGGTCCGCTGTTCCAAACCCCCGAAGAGTGCGCCCGCCAAGCGATT
+GAAAACGACGTGCACGCCGTCGGTGTTTCAACCCTGGCGGCCGGTCACAAGACCTTGGTGCCGGCCATCATTGCCGAGCT
+CAAAAAGCAAGGCGCCGACGACATCATCGTCTTCGCAGGCGGCGTGATCCCGGCGCAGGACTACGGCTTCCTCTATGACG
+CCGGCGTCAAGGGCATCTTCGGCCCCGGCACCCCCGATCCCAGCCTCGGCCAAGACGGTGCTGGATCAGATCAGGGCCAG
+CATCGCTGCGGTCTAAAACGGGTAAGGCGCTGTGCCCACC
+>generic240
+GACGACGGTCGGTGAAATCGTGGATGAGGTGAACGAGCGTGTGTTCGGGACAGAGGCGAGGCCCTGGTTGTCGATGGCCT
+TGATGACGAACGTGTGGGTCTGCACCGACATCCTGGGCGTGCCAAGCTTGCCCGGCGGCAGCGGATCGCGCGAGCTGAAG
+CGCTCCTCCAGCTGGTTCGCGGTGGTCTCCACCCACGTCGTGTCGTTGTCCTTCGGGTCCAGCGCGTACACGAAGTGATC
+GACCCGGCCGTCCGGGTCGTCCGCCGACCAGCGGAGGGCGATGCTGAAGGACACGGTATCGCTGGCGTAGATGGGCCCCG
+ACGTGAGGATCACCGACGGACGCTGGTTCGGGATCGAGGCTGTGCAGGCCGGCCTTCTTGCTGCAGCCGTACACCGCGAA
+CGCGATCAGGACCGCAAGGGCGAGACCGGCGAGCCTGGCAAGAAACGTGGTCTTCGATGGCTGCTTTCTCCTGCCGTNAG
+TGGCGGTGGATCCCGGGTGGAGAT
+>generic241
+GCCGGTTCTATCGCTTTTAACCGTGCCTTCGTTAAGGATTTTTCTAGAAGCTGTAAGTATTGTTTCTATGTGGCTATGAT
+TGTGAAATTTTAAACGTTTTGTAAAAGAATGACATTTTATTCACGATGAAAAACTAAACTTTTACTTGCTACACTGTGAT
+AATCGCCAGACTGTTCAATATTGTCCTAAAATAGCCTAATACCATCAAACCACCTTATTTTTATTCTGCGGGTCAGCATT
+TATACCTTGCTTGTTTTATGCGTACTGTTATTTGTCACTGATTAAGCAGCCG
+>generic242
+AAACGACTTGAATCCAGGCCCAGTCGTGGGGCGATGGTGCAGCGGGTGTGGGCGTGGCAGTGGGGGTGAGGCTGCGGTTT
+CTCGGTCCTTGGGCAAGGCATGTACGGCCTGGGTCAACGCCGTCTGGGCGACTTCGAAAGCCGCCACTTTGGCCAGCAGA
+TCCGCCGTTGGGGCTTGCTCACGGATGGCGTGGTTCAAATCGGTGGTGAGTTGGTACAGCTGCGTCAATGCCAAGGTGCC
+GGTGGCCCCTTTGAGGCTATGCGCGACCCGTTCGGCGCTGTGCAAGTTGCCCTCAGCCAGATAGCCCCGCAGTCGGCCAC
+TGTCGCCAGCGTGGTGATCGACATACAGGCGCAACAAGGCGGCGTAACGCTCGGGTTTGCCCCGCGTGACCTTGAGCCCA
+GCGTTCAAATCCAGACCCGGCAGGGTGGTGAGTTGTTCGCGTAAGAGGTCCATATCACTGAGGTCGGTGGTCGTGGCACG
+GCGGGGACGGTGTGTCGGTGCCGGTTGCAGCCAA
+>generic243
+GTCTGGCTAATTCTGCATTTTTATCAATCAAACCCGCCATTGGAATTAAAATTTTCATATCGCCAACCAAAGGCAATCGC
+TGATTCTGGCGTGACATCATCGGGATTTACCCAAGTGATAGACTCCAAACGTGCCAGTTTTTGCAGATAGCTTTGATTAT
+TCGTCAAGCTCTGTTGGTCAGACTCGCTACCGTCCTGCAATAATACAGGCAATGGCTTACTGGGGGCAATGTTCATTTCC
+CCACGAATACGGCGCACACCCAGAATAAACTGCATCAACCATTGCGTTTCGGCAATGGCAACAGCGTCTATTTGTGCGTC
+ATCGGCGACAGGATAGGCTTTCAACATAATGGTATCACCTTCAATCCCCGCTAATGGCGCGACCCGTTGCCAAATCTCTT
+CGGTAATAAACGGCATAATAGGATGCGCTAAACGTAAAATGCTTACGAGTGGTGT
+>generic244
+ACACGCCAGGCGGTACAATTAACGCCATTTAGCACAGCCAAACTTTAACAGTAGGTAATAACTCAGTCTTGAATTTAGAT
+GCGGGTTCAACGTTAAATTATGCTGTGCTAAATGGCGGTAATATAAACACGCCAGGCGGTACAATTAACGCGCTTAATTT
+CAATAATCAGATGGGGTCTACCGTAAAAGGCTTTTTAACCTTTGTTGGTAATTTCGTGAACAATGGCACTTTAGCACCTG
+GTAATTCACGAGTGGTGT
+>generic245
+GCCGCGACGGCGTGCCGCTCGAGATCCGCCGCCGCGCCCTGGCCAAGGCGCTCCCAGGAGCCGCGGGGAGGGTGCTCATC
+CTCATCCACGGATCGTGCATGAACGACCTGCTCTGGACGCGCAACGGGCACGACCACGGTGCCGCGCTCTCCCGCGACCT
+CGGCTTCACCACCCTCTACCTCCACCACGACAGCGGCCTGCACGTCTCCACCAACGGGCGCGAGCTGTCGGCGCTCCTCG
+AGCGGCTCGTCGAGGAGTGGCCGGTGCCGGTCGAGGAGCTCGTCCTCCTCGGCCACAGCATGGGCGGGCTCCTGGCGCGG
+AGCGCCTGCCACCAGGCGGCCCGGGACGGGCGCTCCTGGCCGCGGCGCCTCCGCCGGATGGTGTTCCTGGGAACCCCCCA
+CCACGGCGCACCCGCGGAGCGGATCGGGAACTGGGTGCACCGGGTGGTGGCCGCGGCGCCGTTCACCGGACCCCTGGCGC
+GCCTCCCCCGGATCCGCAGCGCCGACGAGTGGTGT
+>generic246
+GGCGGCACAGGTGCAGGCTAGCCTGCTGCAGGATAGAGCGGCCGAATTCGAAATGCAGGGCGCGAAGGCGCGTGCTGTTC
+TGGCGCGCTGGACGGGGGAGGCGGCCGCGCAGCGCGAACTCGCCGAGTTACTTCCCTTCGCCAAGATTCAGCAGGAGCCC
+CAGCCGTTGGCTGCACATCCGCAAATCGCCACCCTGGACAAGGCCATTGCCGTGCTGGAGCGTGAACTGGCGCTGGCACG
+CGAGGCGGTCAAACCGGACTGGAGCATGGAGGTGGGCTACGGTGCGCGCGGCGCCGGCCAGTCCGACATGCTGTCGCTAC
+AGGTCGGCTTCGAGTTGCCGGTGGCGCCCGGCCCAACGCCAGGATCGCCAGACCGCCGCCAAACAGGCGGAGTTGGAAGC
+CCTGCAGGCGCAGCGCGAGGACCGGTTGCGCATCCTGCAAG
+>generic247
+CTCCGGTAGCCGATACGTGGACGCTGAAGATGATCACTGAGATCCCCTTCTCGCTTTAAGCCTTAAGCAACTCCATCCGC
+TCGCCCAGCCAGCGCAGCATGTGCGCCCGCGCTTTGGCGGGTTGGCGCTTTAGAAGCGTGGTGGCAGCTTGGCGGGCTTT
+GACCAGCAACGGCTCGTCTTGCTGCAAATCCGCAAAGCGCAGCAAGTTGTCGCCTGATTGGCGCTCACCCATCAACTCGC
+CGGGTCCGCGAATCTCTAAGTCGCGCCGCGCAATCTCAAAACCATCTTGGGTCTCCACCATGGCCCGCAGGCGATCTCGC
+CCTGTGGCCGACACCGCCGCACCGTGCAGCAGCATGCACACACTGGCCGTGGCACCGCGCCCCACTCGGCCGCGCAGCTG
+GTGCAATTGCGCCAAGCCAAAACGATCAGCGTGCTCGATCACCATCACGCTGGCGTTGGGC
+>generic248
+GCGTGGTCGTCATTCCTCAGATCAAGCCCGCCATTGAGGCCAAACTCGGCAAGACGCTGGCGCTCTCCAGTGTGTACCGC
+ATGCTGGCGCGTCAGGGTTGGCGCAAACTGGCCCCAGACACCCAGCACCCCCAAGGCAACCCACAGGCACGCGAAGACTG
+GAAAAAACGTAACCCCGGCCGCGCTGGGCGGAAATACCTAGCGGGCGTTCGACGCACAGCGCCCACTGCGCCTGATGTTC
+CAGGACGAGGCCCGCTTTGGTCGCATCAGCGATACGCGCTACTGCTGGGCGCGCCGGCCC
+>generic249
+GTTTTGGGGTGCATTCAAATCTTGCACCCGCACTTGGCCGGGCCTCAAGGTCAAGTTGGGTGCGTAAAAGCAATTCAAGT
+GGCACCGGCTGGGCCCAGAGAAAGCCGCGGAATCTCGAACTCAATGACGTTGTGGCTATCGAGCATGCCGCTGGTTTCAA
+CTGCCTGGACCGAGAGCCCTTGCTCCAGCAAGCGCGGCTCGAAACGCAGCAACGCTTCACGCAAGTCGTGCTCGATGTGG
+TGGATGTCGATCTTGGACGCCAGCTGACCCGAGATCGGTGCCAAGCCGTAGTTCAGCACCGAATGGGCCACGTGGGGATA
+AAGCGCCAGCTGCCCGGGCAGTGGGCTGCACCGCGTTGAGCAGCCAGCCCAAGTCACGCAACACCGCTGCGCGCAACTGG
+CCTCGGGATAGGCTGCGCTGATCGGTGCCACCGTCCCCATTG
+>generic250
+GAAAAACCCCGTGCCTGTAATCGCTGTGTCAAATTAAGTAGAAAAGCTGCTAAGCGCTCCTCGGCTCGCATGCTACCTAG
+AAGCAACATGACCCCATGGTCACGGACAATTTCACGGCTCATGATTTTGTGAAACTGATGCTGTAACAGCGTGAATTCTC
+TAGATAGCGCCTCAAGTTGGGCGTAAGGAATCATGCAGACTTGGGCATCTTCCAGTGCAACCGCATCGCAAGAATGGCGG
+TCTGTGCTGATGCCATCGAGGCCAATCAATTCTCCGGCCATTTGAAAACCCGTGACTTGCTCACGTCCATCAATCGCTGA
+GACGATGGTTTTGAAAAAGCCAGTTCGAACGGCGTAAAGCGCTGAAAAAGAGTCTCCAGCGTGAAAGAGAACCTCCCCAC
+GACGCACAACCCGTCGGTTACTGACCAGGCTATCCAAGGTCGCTAGCTCTTGCTCAGACATGCCAACAGGCAGACACA
+>generic251
+CAACATCGAGGTTCGCGGTTTCGGGACCTTCAAGATCCGCCGTCGCAAGACGCGGATGGCGCGCAATCCGAGGACGGGTG
+ATCCGGTCGAAGTCGCAGCGCGTCCGGTGCCTGTGTTCAAGCCCAGCAAGGAGTTGCGTGCGCTTGTGGCACACGAGGAG
+TACATCCCGGATGACTCCGATCTCGATGATGATGATGAATCGTGACGCGATTCCGAGTGCTCCTCTTCGCGCGGTACGCG
+GAGCTGTTCGGCGCCCCTGACGTCGCCATCACGCTTGCCGATGGCGCCACTGTCGCTGACGTGATCACCGCCCTCCGGGA
+TATCCCGGGGGGCGAGTTGCTTCCCGTGGCCCCGTTCGTCGCCGTGAACCTCGAGCAGAGCAACGCGACACGCAGGCTGA
+TGCCAGGAGATGAGTTAGCTCTCCTGCCTCCGCTCGCGGGTGGTTGAACGATGCCCTTTCTGAGCCAGCAACCGATCGAC
+CT
+>generic252
+GCAGCGTCTGGGTCAGCTGCAGGTGGCCGTTCTTCAGCGCCTTGAACGACAGGTAGGCCGTCATCAGCTTGGTCAGCGAG
+GCCGGTTCGATACGCTCATTCGCACCTTGCTGGGCGAGTAGTGCGTCGCTGTTGTAGTCCTTCAGCAGGAAGGCCTTGCC
+GGCGATGGTGGGGGGTGGTGGGACGTCTTCTGCCTGTGCGGCAAAGGCAATGAGCAGGCTCAGGAGAGAAAGCAGAATAT
+TCATGGGAGTCTTTACTGGATGATCACGAGGGTGGAAACGCCGAGCGTCCGCTTGATATCGCCGGCGGCGTGTTCGGCTT
+CGTCGCGGCTGGCATAGGGGCCGAGCCGGACGGCGATAAAGGCCGTCATTATACCAGTTCTCGATTGCGACATTCTGCGC
+C
+>generic253
+GTCAGCACTTTGGAGTCGGCCAAGCCAAGGATGGGTTGCAGCTCGTCAAGAATCACCGCTGCGGCCACCACCGGGCCGGC
+CAGCGGACCGCGCCCGGCTTCGTCCACGCCCGCCACCAAACCCATGGTGTCAAAGCTGAACGTCAGTTGAGCTGGGGGCG
+CTTCAGCGCTGGAGGATTTGCGCGATCGCATCGGTGGCTCGGCGTGCCGTGTCTTGGCGCAACAGGCGGTGAAGGTCGTC
+GAAACGGGCGGAACGCGGGCGCAGGCCGCTGGATCATCCAGCCAGCGCAGCGCCTCACGGGCCAGCGCTTCGGGCGTGGC
+GGCGTCTTGAATCAGTTCAGGCACCACAAAGTCGCGCAGCAAGATGTTGGGCAACCCCACCCACGGCTGCAAACGCATGC
+GCTTCATGAGCTGCCAGCTTAAAAATGCATGTGATAGGCGATCACCATCGGCCACGAGTGGTGT
+>generic254
+CGGTTATGGCGGTCGTGATGCCCCCGATTTTCATTTGCCGTTTAAAGATGCCGCGCTGTTGTTTCCCTGTTTTCGCGGTT
+TAGGACTCAGTGCCGCACCCACTATTTCTTCCGAACCGCATTGGCACGTTTTACATGATATTCATCAGAGCGACCGTTAC
+ATTTTAGGCGGTTGTGTTGAAGATGTCTGGTTGGGCGTGAGTGTTTTATTACAGTTGTTTCCCAAGTTGGCAGGGCATCT
+GGGGTATTTGGGGATTAGTTTTTCAGGCGGTATCGGTGCGTTGGCGTTGGCATGGGAGCGGCGTATTGCACGCGGTCATC
+TTAATATACCTACCTTCGGGCATCATCCGCTACGCTTACGCTTACCCACGCGCGGCAGTACGCACAGCTTACAGCAGTTT
+TATCGCACGCATTAAAAAACAAACCCTTAAATGTGCTGCGTTATTACGATGCCCGCTCTCGCAGCAAAGCGAAATCACTA
+TGCCGATACATTGTGCCTGCGCGTTGTTTGATCCTTTCGTTGC
+>generic255
+AGGCGCCAGGCGATGTAGTACCGCGCGTTCGCTTCCCACTTCCCTCACCAGTCCGAATTCCAGTTGCTTGAGATACCGGA
+GTCCACCGTGAATCAGTTTGGTAGAGCGGCTGCTGGTACCACAGGCAAAATCATTCTTCTCTACCAGGGCAACCTTCAAT
+CCTCGGGAAGACGCATCGAGTGCGATACCCGCACCTGTAATTCCCCCACCGATGATGAGCAGATCAAATTGCTCTGACCT
+CAGTTCCTGGAGAAATTTATCGCGCGCGGGTGAAGATTTCATTTCCTAGTTGTCAATCCATTTCATGGTCCGCTCAACAG
+CTTTCTGCCAGCCCTTGTACAATTTGACCCGGGTACCTTCATCCATTTGAGGTGAGAAGCGTTTCTGGATTCTCCGG
+>generic256
+GCTTTGGCGAGGTCGGTTTTCGTCACTTTACCAGCGGCAAAACCCGATCCACTCGCCGAAAGACATGGCGGGTCTGAAAA
+TCCGTGTCCAGGAAACGCCTCTGTACATCACCGAAATGAAGGCCCTGGGCGCCCAGCCAACGCCGATCGCCTTCCCGGAA
+CTCTACACGGCCCTGCAGACTGGTGTCGTCGACGGGCAAGAGAATCCCATCCCAACGATTATCTTCGCCAAGATCTACGA
+GGTTCAAAAGCACGTGACGCCTTGACGGACACAATTACGGCATCGACTGGTTCCTGCTAAGCGACAAGTTTATAAATCCC
+TGCCTGCCGACCTGCAGAAGATCACCACCGACGCTGCCAAGTATGCTTGCGGGGAAGAGCGTCGCATCAACCGGGTTTTC
+GCCGCCAACGGCATCAATACCCTGAAGGAAAAAGGCGTCACTGTCTACTACGCCGACCGCAGCCGAGATAGCCCAATTCC
+GCAGCGCCACCCACGCAACCCGTGACCGACTGGCTAAAGACCAAGATC
+>generic257
+GATCGGCATCGACGCCGATGACGCCATTCCCTGCTCGGCCAAGACCGGTATGGGCATCGACGAGATCATTGAGGCCGTCA
+TCAGCCGCATGCCGCCGCCCAAGGGCAACCCGGAAGGCCCGCCGCGCGCCATGATCGTTGACTCGTGGTTCGACAACTAC
+GTCGGCGTGGTGATGCTGGTGCGCGTGGTCGATGGCTGCCTCAAAAAAGGGGNGCGTATCCGCATGATGGCCTCCAACGC
+CATCTATCCGATCGAACACATGGGCGTGTTCACACCGAAGTCGGAAAACCGCGACATCCTCAAAGCCGGTGAAGTGGGTT
+TCATCATCGCTGGCATCAAAGAGCTGCAAGCCGCCAAGGTGGGCGACACGGTCACGCTGGAAAAGAAGCTGCCCAACAAC
+GCTGGCCCCGCCCTTGAAGCCCTGCCCGGTTTCAAGGAAATTCAGCCGCAGGTTTTTGCCGGTCTCTACCCGACCAAAGC
+CAGCGAATACGACCAGCT
+>generic258
+GCCGGCTAAACCATGATGACAGCGGAAGAAAAGCGCGAACAGTTTCTAAAACGTTTATTGCCAGGGTTGGCGATTACCGT
+GATTTATTTTGTTTTATCAGTGGCATCGTGGCAGAAAAATGAAAAAGCCGAAACCGATTATAAAAATTATTGACCAGCGG
+CGTATCAAAAAGTGCGCTGCCTGGGGTTTTAGGTCAACAACAGCAAGTTCAGCAACAGCTCACAGAGGTAAAGAAAACGT
+CAACGAGCTTCAGGAAAAACTTAAAAAATAGGCAGGTTTCCTCTCCAATACCGGCAATTCAAGCAATGCGGCAATGGGGA
+AGTCACCCGCATTCTGGATAAGTACCAGATTAAACTGCGCAAAGACGAAAATCGCAGCTTCCAGAAGCGCAATTAAGCCT
+CGCCTTAAAAGAAGTCTGGGAAGCAATGAAGCCACCTGCACCCGTTGCTGCGGAACATAAAACGCCTGCACCTCCCACGA
+GTGGTGT
+>generic259
+GCTGCCCGCTGGCACAACCACCATTTGCGGGCATAAAGCGCAGTCGTGGAACACCGTCCCTGGGGGTGTGCTTTGGCGAA
+TCAGGTCGTCAGGCACGGAAGGTGGGGCAGCCAAGGCCGGCAGCATCGCTGTCAGCCCTGCCGCCACGATGGCCAGCTTC
+ATCATGGGCGTGACACCCCCGTGCGCAAAGCGTGCGATGCCCGTGCCAGCTCCGTGATGCGTGCCCAATCGCCGCTCTTG
+ACCGCATCGGCCGGCGTCAGCCACGAGCCACCGCAGACTTTGACGTTGGGCAGCGCGAGGAACTGCGGCGCGTTCTCGGG
+CGTCAAGCCGCCGGTGGGGCAAACGACACGTCGTGAAACGGGCTGGCAAAAGCTTTGAGCAGGTTCAAGCCCCGACTGCT
+GTGGCGGGGAACAGCTTCAAAAAGTGATAACCGTCGGCGTTGGCCGTCATGACTTCGCTGGCCGTAGATACCCCCGGCAG
+CAAGGGCAGATCC
+>generic260
+TCCGCCCCGGTGGCTGCCAGCGAGATGCCGAGTAGCAGGGTGAGGCAGAACCCGTGGGTCAAGATCTTCACCGTACCTCG
+ACCCGTGTCCAGCGACTGCCGTTGCTATCGCCGCCTTCTACCGCCCGCGCTTCGGGTTCGTACATGCGGTAGAGCTGCGC
+CGGGGGCAAGACGTAGCTGCCGCGCTGAGCAAAGCGCAGCAAGTGCCTGAAGACCAAGGGCTTGCCGACTTGGAGGCGCT
+CGATCGGCACGGCGTAGCCTCGGGGGGTGTTTGATGCACGGCGCGCTCCAAGGCGGTGGTCTTGCCGTCGCTGCCGAGCA
+GATCCAGGCCCCAAGTGCTGGCTTCGACCGCTGCACCCGGCGGCAGGGCGGCTTCCAGCAAGGCCCAGCGCATGCGTCGT
+TCAGGCCGCACGCGCAACTCATCCAAATAAAGCGTGTTGGTGTCGAGCGCTGTGCCGTTGGGCACGGCCTCAAGACGCAC
+GCTCA
+>generic261
+ATCGCGGCGGCATTGCTGACCGCAAGATTCCGGCTTGCGCAGGCTGCCACAGCCCGAACGCTGCTGGCATCCCGGCGCAA
+TACCCGCGTCTGGCTGGTCAACATGCTGACTACACCGAAGCTCAGTTGAAGGCTTTCCGTGACGGTCTGCGCAAGAACAG
+CATCCCGATGACCGGGGTGGCTGCCAAGCTCAACGACCGTGAAATCCAGGCGTTGGCCGATTACGTTGCTGGCTTGTAAA
+CCCCGCACGTTCCGACCCCCTCACTCAAAGGCCGGCATTTGTCCGGCCTTTGTTGCATTCAGATAATCGCCCCCCATGTC
+GTCCGATTTCCCAGCTGCTTCTCCCGACGGTGCTGCGCCCGTCCGTCCTGCGCCCACCACGCGCGGGCATCACGCGGTCG
+AGTTGCTCGCGTCGATGCGTTTTGCCATCGCCTTGTTGACCCTGATTTGTATCACCTCCGTGATCGGCACGGTGGTGCAG
+CAGCACCA
+>generic262
+TGCACCTCCGTTGACCGCATTGCACGAGATATAACTCTCATTGCCGCCAACCCGCCGTCAGACTAAGGTCCTATATCCGC
+CGTCGCCCGTCCGACAGGCTGTTTTGTGCGCAGGATTAATTGGTTTACACTTGAGCCCCTTTTTAGTGGAACGGCCTGAA
+TTCATGGCACAAACGCACGACAAACGGATAGTCCTCGGCATCACCGGCGGCATCGCTGCCTATAAGGCGGCCGAACTCGT
+GCGCCTGCTGGTCAAGGACGGCACCGAGGCGCAGGTGGTGATGACACAGGCGGCGTGCGGTTTCATCACGCCGGCAACGC
+TGCAGGCGCTGTCCGGCAAGCCGGTGTTCACCGACATGTGGGACGGCCGCATTGCCGACAACATGGCGCATATCGCGCTG
+TCGCGCGGCGCCGCTGCGATCGTGGTCGCACCGGCCTCGGCGGATTTCTGGCCAAGCTTGCAAATGGTCTCGCCGACGAC
+CTGCTTTCC
+>generic263
+GTTTCAACCTCCTATAAACTCATTGTATACCCTGCGAAGATGAAATAAAAGGTTGCCAATGGCAAAGACTGCATGTGCAG
+TTCCGCAAAGGAAAAGGCCTGCGTAAACAGGCCTTCCCTAAGCTGCCTCATACCTGCGTTGCTCACTACTTTTTTATCTC
+AAGTAGTTCTACCTCGAAAACAAGAGTCGCATTGGGGAGAATGATGTCTCCAGCGCCCGCCTCTCCATAAGCAATAGACG
+GTGGGCACACCAGCTTGGCCTTGCCACCGGTTTTCATCTTCTGTAGTCCCTCAGTCCAGCACTTTATGACGTTGTTCAAT
+TTGAATTCGGCCGGTTCGCCACGCTTGTAAGAACTGTCGAATTCTTTCCCATCGGGCAATGTACCCCGGTAGTTGACTTT
+CACCGTGTCGGTTGCAACAGGATTAGCTCCGTTGCCCTCTTTAAGCGAGAGGTATATCAGGCCGGATTCGGTCTTAACCG
+CATCC
+>generic264
+ATCGCCGATATCGCGGCCTTCCTCGAAATAGGCCTTGAAGAGCTGGTCGACGATCTGGTCCTGGCGTTCGTTCCTGGCGC
+CCCAATGGACCAGCCGGTGGGACAGGACCGTGTTGGGCGTGCGCTTGATCCTGGCGAACTCGAATTCGATGCCGGCTTCG
+CGGCCGCTCTCGGCGATCGCTTGGTAGATTTGCCGCGGCCGGTCGCCGCCGCCGAACTTGGCGCGGACATAGTCGTCGCG
+CGTCATGCCTTCGGTCGGCATGTCGGGATTGAGCTGGAAGGGCCGCCAGGAAATCGCGATGTCGTTGCGGCCGCTGAGAT
+CGAGCGCGCGCTCGAAGCGGCGCTTGCCGATATAGCACCAGGGACAGATCGTGTCGGAGACGATGTCGACATAGATCATT
+GCGCGGCTCCTCTCGCTCTGCCGTCCATGGTACGCCGTTCGCGCCAATGCAGGAAGACGCCGGCTGCGGCCGCGACGGCG
+>generic265
+CACTGCGCGCATGAAGTTTTCCTTCAAGTCCATCTTGCGCACCATGTAGTTGGCGGCGTAGAGCACGATGGCCAACTTGA
+CGAATTCGCTGGGCTGAAAGTTCATGATGCCCAAGGGGATCCATCGCCGCGACTTGTTCACCACCTTGCCGATGAAGGGC
+AAGAGCACCAGCACCAGCAGCACCAAGGAAGCAATGAATATCCACGGGGCCCAGCGTTCCCAAAACTTGATCGGCGTGGC
+CAATACCACCCCCGCACCGATGCAAGCCAAGGCGATGGACACCAAATGGCGCGTAAAGAAGTGCGTCGGCGCATAGAGCG
+CAAAGCGCGGGTTGTCCGGCAACTGGATCGAGGCCGAATAGACCATCACCAAGCCCAGCGCCAGCAAGCCGATGATCACC
+CACGTCAGGGCCATGTCGAAGCCGACCCAGCGCGAAGGCGTATCGAGCGGCGCGCCTGGCCAAGCAGCCTCGCCGCC
+>generic266
+AAAGTGAATCGAAAACAGTAAGTCAACAGGAAAGAATGAGCGTTAAGCCCCAGTTAGTGCAGACCTTCGGTCGCAAGAAG
+AACGCCGTCGCAGTCGCGTCCGTCCGCCCCGGCAAGGGCCTTCTCAAGGTCAACGGATCTCCCGTCGACTTGGTTAACCC
+TCAATTGATGCAGGCGAAGATCTACGAGCCTATCCTTCTGCTCGGCCAGCACAGATTCGCGAACCTCGACATCAGAATCC
+GAGTCAGAGGATCCGGATACACCTCGCAAGTCTACGCTATCAGACAGGCTCTCGCCAAGGGTGTCGTCGCATACCACCAG
+AAATACGTCGACGAGAACTCGAAGAGAGAAATCAAAGAATAAGCTTATGCAGTACGACAGATCGCTCCTCGTCGCCGA
+>generic267
+CCGAAAGTCAGACACGGTTTATTCACAAATCGTGTAAATTGTCTCCTAATCTGATGAAATTAGTCCTTCAATTTCCGAAG
+AGGAATCCCCGAATAAAACACCAGCGTATTCGCTGCCTTGCATTTCATCAAGATCATTTTCGATCACACCAGAATCTCAT
+CGTATTTCAGATTCTCGCCGACCAAGAGTAAAGATTTTCAGCGAACGTTCAATGACTCCAATTCTGCATTCAAGCAGATC
+AACAACTTTCATAGAGTAGAAAAAGGAACCACTAATCCTTTCACACGAGAATTCTACTGAGCCATCTTCACTGCTTGCGA
+TAATATAGTAGATGCAAGCAGAAAAATCAGAAGATTAATTGAAATTGAACTTCTCGAATATTAGTCGTGCTCCGAACCAC
+GTTGAAGAGGCGGTAAATCAAACATTACCATTGCAAAGATCGATCTCACCGACGCCAGGAA
+>generic268
+CCGGGTGTTAGAACACTGTCTTTGTAAGCTTGGTCTTGACGGTCAAATACATTTGTTGAAGGCATAGAAACAACGCGGGC
+TTGAATACCTTTTTCTGCTAATGCAGCCTGAGACTTTAAAGCTAAATCAACTTCCGAGCCTGTTGCAATCAAGATAACGT
+TAGCATTACCTTTTGACTCAGAGATTACATAAGCTCCTTTACGGATTGCTGTAATCTGTTCGTCAGTACGCGCGATGAAA
+GGTAACCCTTGGCGGCTTAATACTAAACTGGTTGGACCATTACTACGCTCTACGGCTGCTACCCAGGCCACTGCTGTTTC
+TGTGGTATCCGCAGGTCGCCATACATCCATATTAGGGATGTAACGCATTGCAGAAGTATTCTCAATCGGTTGGTGGGTAG
+GACCATCTTCGCCTTGACCGATAGAGTCATGAGTTAATACAGCAATGGTACAGATTTTCATCAGTGCTGACATACGCAAA
+GCACTTTTTGCGTAATCAGAGAC
+>generic269
+CGTTGCTTTTGCCACGATCTTCGGTAGCGTGAGATCGCAGGCGCCGATCATCCAAGCTTGGGCAGTCGAGGACAGTGCCC
+ATGGACTGGTGCTGCCGTATCGCTGTAGTGAGGCGCTCTCGACCGATGTGGGTCGGGCGTTTGTGAAGCCATAAAAAAAG
+CGCCGAGAACGGTCTCGGCGCTTTTCTGATGCTGTGCCGCATCAAGCTCTTGAAAGAGCAGCGCATCAAGGGGTGATGTG
+CTGCGGGACTTGTCTCCTCGGGCCCCACCAAGATCAACAGCCCTTGCGGGCGCTGACGACGAGAGGCACTTTACGGGGAT
+CAAGACAAAAAGAATCGGGGCTTGCCCGAATCATTTAATACCCACACCCTTGACATGGATTACGTTTACAGGCAAAATCT
+CGTTTCTCTGCTGATCACTGACTGATTAGCGACTCGCAAAACAGCGAGAAGTTCTTTAAAAATTTGCAGCCGATAAGTGT
+GGGGCGAGT
+>generic270
+CTCAACTTCTTCATCTACGACACCTTGAAAATCTTCCTGCTGCTCACCACGATCATTTACGTCGTCGCCATCATCCGCAC
+CTCGTTCCCACCGGAGAAGACCAAGCGGATTCTCTCCCACAAACGTGAATACGTGGGGAATGTCATGGCCGCTCTCCTTG
+GCATCGTCACACCGTTCTGCTCCTGTTCGGCTGTGCCCCTGTTCATCGGTTTCGTCGAATCGGGCGTTCCTCTGGGTGTC
+ACCTTTTCGTTCCTGATCTCCTCTCCCATGGTCAACGAGGTTGCGCTGATCATGCTCTGGGGGCTGTTCGGCTGGAAGAT
+AGCGCTGATCTACATCGGCACCGGGCTGCTTGTCGCGATCTTTGCCGGGATCGTCATCGGGAAGCTGAAGATGGAGAAGT
+ATGTACAGGACTATGTCTGGGAGATGCAGGTCGGCCACAGCGAGATCAAGGTGTTGACGAGT
+>generic271
+GCTGGCCGCCGACAGCGCCCCACGGTTGATGGCGTTGCAGTAGCACAGGATGGGGGTTTGTAGATCAGGGATCAGGCCCT
+CGACGTTCATCTCCAGCTTGCCACGGCTGAGGTGCAGCGAACCGGCGATGTGATCGACGTCGTGCTCTTCCTTGTCACGG
+ATATCCAGGGCCACAGCCCCTGCGGCCATCAGAGCATCGACCTGATCGGGCTGGACTTCCTCGACTTGGGCACGAGCGCG
+GTCGGCGAGCTGCTGGAATTTGGAGGTGTAGTTCATAAATACGGCGAGTGTAGGGTTGAAAGGTCGGTACACGAGTGGTG
+T
+>generic272
+GGGGCATTTGGGCGGATTCAAAAATGAATCGCCCGGGTTGTACTGAAGCTGGTTGGTTGAACCCCCACCACCAAGCTCAG
+CACCCGCTCAACCAAGGTGGAGCGAATCGCCGGATACGTGATGCGTAGGTTCGTTCCTGTTTCGATGGGGCATCTGCGGG
+AGTGGTTGATATGAGTACGATAAAGCGCACCCAGTGCCGTGCTCCTTGCTGCGGAAGACTGGCAAGCCATCCAGGAAACG
+CTCTACCTGCTGGCCGTTCCCGGCATGCGCGAGTCCATCAAGGAAGCCATGGCTGAGCCCCTCAACGTCAGTGCGACGGA
+GCTTGACTGGTGAGCTGGCAGGTTGTCTTTTCCAAGCACGCACAGCAGACGCACAGAAGTTGGCTGCTGCCGGCCTCAAG
+TCAAATGCCTAGGCACTTCTGGCCATCCTGGCGGTCGATCCCTTCCAGAACCCGCCCTCCTACGAAAAACTGGTCGGAGA
+CTTGGCCGGGGCCTATTCGC
+>generic273
+CGAAGCCGCTGAAGCGTTCTTGGTGGGCGGTACGTTGCCCGCCAAGAACGGTGCGGCGGTCGAAGCCGCTGAAGCGTTAC
+CGGCTTGATCAGTCAATTGCGCCGTGGCGCTGTAAGTGCCGTTGACCAAAGCGGGTACGGTGAAGTTGACACTGCCGCCC
+AGATTGGCTTGGGTCAGCATGACCGATCCCGTGGGCGTGATCGGGGCATTGGCCGCATCGGTCACGGCCAAGCTCAGGAC
+ATCACCCGCCACGGCATTGGCCGGTACGAGCACGCTGAGGGTGGTGGGGTTGGTGCCCAGTGCGGGTGTGACGCTTGGTG
+CTGCCGGTGTCACGAGTGGTGT
+>generic274
+ATCGGTTTGAGGCGTGAACAGGTGCTGGGCAAGACGGTCTACGACGTCGCCCCAGCACACTTGGCCCGGATCTACGAAGA
+AGCGGATCGCACCTTGCTGGCCAGCGGTGGGCGGCAGGTCTATGACGCCCAAGTGCGTTACGCCGACGGCGAGCTGCGGG
+ACGTGACCTTCCACAAAGGAGTGTTTCGTGACGCCTTCGGCCAAGTCGCCGGTCAAGCCGGGGCCATCTTTGACATCACT
+GAGCGCAAGCGCTTGGAACGCTCCTTGCGCGAGATGGCCGAACACGACTCACTCACCGGCATCCTCAACCGGGGCACCTT
+CTTCTCGCTAGGTGATCAACGCGTCTTGCATGCCATGGCTGATCTGGCCGATTTAGCCGTGATCGTGATGGACGTGGACC
+ACTTCAAGGCCATCAACGACACGCGCGGCCACGCCATGGGCGACGCAGTGCTGCAACATCTCACGCGGCTGATCAAGTC
+>generic275
+TGGATATCCCGGTAGGCGATCACGCCTTCCAAGGTGTTGCCGGGGATGGGCAGGATGAAGGGTGTCGAGCCGGTGGCGAT
+CAGCAGCCGGTCGTAGTCGGCGCTTAAGGGTTGGCCTTGGCTGTTGACGGCATGAACGACGCGCTGCTTGCGATCCACCT
+TGACCACTTGGGTGCCCAAGTGCAGCTCGATGCCGTGCTCGGCGTACCAGCTCAAGGGGTTCAGGATGATCTGATCAAGG
+GTCTGCTCGCCCGCCAGCACGGGGCTCAGGAGGATGCGGTTGTAGTTTGGGTGCGGCTCGGCACCGAACACAGTGATGTC
+GTAGCGCTCAGGGGCCAGTTTGAGCAGCTCTTCGAGCGTGCGCACGCCGGCCATGCCGTTGCCGATGAGCACAAGTTTTT
+GGGGCTTCGTGATCGCCATGACAGATCAGTCCTTTTTGGAGGGCGGCAGCCCGCCTAGCACGCCGGGGGTCAGCGGGAC
+>generic276
+AATCGATAAATCATTGATATTATTCGATATTAACTTTTCTGAAATGCCTGTTGCTGTGCATTCTTCTCAGCTTCCATCAA
+GCGATCGCGTGCTTGCCTGAGGGCATGTTCAGCCTGCTGTCGCGCCTGGCCCGCCTGCTCGCGCTGCTGGCGCAAAGAAA
+TGATGTTTTCCTGGAAATGACGTACCGCCTGATCTCGCATTTCAAGTTGAGATTCGACCTCAACCCTTTGCTCCGAAATG
+CGTTTCTTCTCATCCGCAAGCACCTTCTGGCGGTCGAGTGCATGCTGCAGTTGCTGTTGGAGGCGCTGGATTTCCATCCG
+CGCGGCATGGTGTGACGAAAGCCCCTGGCGTTGCTGCTGCTGCTGCTCGCTGATGCCATGGCGCAGCGCCTGCAGTTCCT
+GCTCGGCCTCGCGCAGCGCGGATAGCTTCTGCGC
+>generic277
+GGTGGTCGGGTGTGCCACCACCAGGAACGGCTGGTCGGTCGCCAGGGCCGGGGCCGCGCCGCCGGCGAGGGCGGTCAGCA
+GGGCCAGGAGTGCGAGGGGCCGGCGCATCGGGTCAGAAGGAGAACTGCAGGCCGGCCAGGAACTTGGTGGTCCGCTCGGC
+CGGGAGGTGGTCGACGAGCGACTGGTAGGTCGAGGCGTCGGGGAAGACGAAGTGGTTGCCGACGATCTGGTGGACCGAGG
+CCTTGGCGACCAGCGTCGGCGTGAACCAGTGGTTGAGGGCCAGCGCCACCTCGGTGTGGCGGAGCAGCCGCGACTCGACG
+CTGATCGACTCGACCTTGGAGCGGTAGGCCTCGCCTCGTGCCGCCACCTGCCAGTGCTCGTCGAAGGACCAGGAGGCGGT
+GAGGGCCGCCCCCAGCGCCTGCTCGATGCCGACCTCCTTGCTCAGG
+>generic278
+ATTTTGTATTTATTTTAGAAAATAAAGAGATAAAGTCATAAAATTAAATAATTCGTTGGCGCTTCTGATAAAACTTCTAT
+CCATCTATCATAATTCTCGAGTCGTTGTGCTTATTGATGAATACGATTATCTGATCATAAATTCTTTTGGGTAAAATAAT
+AAAGAAAAGTAGAAGCAGTAAATACCTTTGGAGAAATTTTAAGATGTGGCTTAAAAGATAATAATTACCTATTCCGTTCT
+GTTTAACTGGAATAAACCATATAGCTAAGTCGAGTATCTTCTCAGGATTAAATAACTTTAAACATTTTTCCTATACTTGA
+TGAAATATATTCTAAACATTATGGTTTTACAGAAACTGAGATAAAAATAATAGTAGAAATTGCGAACGAACGAACAACTT
+CCCAACAATAATAAACTTTAGTCCTCAATGAAATAAAGAAATAGGTATAATTCTTATCTAAT
+>generic279
+GCCATGCCGATGCTTTCGCCCAGCGTCGGGTGCGGGTGGATGGTTTTGCCGATGTCCACCGCATCCGCGCCCATTTCAAT
+CGCCAAGGCGATCTCACCGATCATGTCGCCGGCGTGGGTGCCGACGATGCCGCCGCCCAAGATGCGACCGTGGCCGTGCG
+CTTCGGGAGAGTCATCGAAGAGCAGCTTGGTGAAGCCTTCGTCGCGGCCGTTGGCAATCGCTCGGCCTGAGGCGGTCCAG
+GGGAACAAGCCTTTCTTGACCTTGATGCCTTGGGCCTTGGCTTGGTCTTCGGTCAGGCCCACCCATGCCACTTCGGGGTC
+GGTGTAGGCCACGCTGGGGATGACACGGGCGTCAAAGGCGCTCTTGGCCAGCTTGTCGTCGCCCTTCAAGGTGCCAGCGA
+TGACTTCGGCGGCCACGTGCGCTTCATGCACCGCCTTGTGCGCCAGCATCGGCTGGCCGACGATGTCGCCGATGGCGAAG
+ATGT
+>generic280
+CTTTTTTGGCGGCTTCCGTCGCGGAAATCGCATATTTCTTCGGAATGAGAAAATTGAGCGCGTATCCGTCGGAAATCGTT
+ACCTCCTCATGAGCGCGTCCCACTCCCTTCACGTCTTTAATCAATATAACTTTCATATCCTTTTATCTTACTCTACCTTT
+CAGTATTAATCAACTTCTTCTCACTTTTCCTTATCATTCACTATAGACGATAGTAAGGAAAATCTATTTTCGCTAAAATT
+TCGTTCAGAGATGAAAATGTTCTCTGAGCACTTTATCGGATTCAAGAGCCTCTGCGACAAAGGAACGGACTTCGCCAACG
+CCGCTCTTGAGATGCGCACGCATAAGCACAACGAATTCATCACATGGATACGGATATACCCAGACGCTATCTTGAATCCG
+AATGAATCCGGCGCCTTGTAAAGACGCCTCGAGTTGATCGCGCACGCGCCGTCGCCGTTCATTAATATCGAAACAA
+>generic281
+GCGTGACGTCTGCATCGTCGCGCGCGATGCGCAGCGGCGCAGACAGACCGGGCACCGATAGCGTACCGTCCATGAGGGCA
+AGCGTGCGACGCGCGTACCAACCCGCAAGTGCCAACGCGATAACCAGCAGGCCCAGAACTCCCAAGCCCAATCGTTTAAA
+CCACAGCATGAAAACCCTTTGCGAATTTGAAGCAGCCACAGGTGCAGGCGGATCGATTACCGCCAGGTGAATGCCGCGCC
+ATTATCTCGCCATCGCGCACCGGATTCGGCCCAAAGGCGCGAAAAGCGCGCGCGTTGAATCCGTAACGATGTGGGGCCCG
+CGTCGTAGCGCCAAGTCCTGCCTGGCGCTACAGGACTGTGTGCCAGTCGAGAAAGGCGCCTACTTGCGCGCAGGCGGCAG
+GTCTGTGCAGCTACCGTGTGCCACTTCTGCGGCCATGCCGATGCTCTCGCCCAAGGTGGGGTGCGCATGGAT
+>generic282
+CTGAGAACCAGCAAAGCTTATGCTTGAAACTAAAGTTCCAAAACATATAAGCAAACCAATTTGCAGATTTTTAAGCATAC
+GTAGCCCTCACGTGATGATTTATCTTAAGCTAGTTTTTGCGCAAGTTCAAGCACCGCCACAGCTAGATTTTCCAAAGGTA
+GCGATTGTGCTTCAGCGGCTGTTCTGGCTTTATATTCTACCAAGCCCTCAGCTAAGCCACGCTCACCAATCACTAAAACG
+ATGCGAGATGCCCATTAAAATCAGCCTCGGCAAAACATCACGCCGGGACGCTCGCCTCTGTCATCCAACAACACATCAAT
+ACCAGCCGCTAACAGATCATCGTGCAGTTGATTAGCCGCAGATTTAACCGCATCTAGATTTAATCAATAGCCAAATTGGG
+CAAATGACAACCGCAAATGGCGCCATGCTACTTGGAAATATAATGCCGCGATCATCATTGCCCTGCTCGATCGCC
+>generic283
+CGGTCAAGAGCAACATGCGTTCAAGCAATGGGGCAAAGGACGAACCATGCGGCCCGTTCGCGCCGGAGCCGCCGGTGGCG
+GATCCCTGATCACTGTTATGACAATCACCGCAATTGATAAGGCTGGAGGTCGTCAGCGGCGGAATAAGGCTGGGCGAGTT
+GAAATTTTTCCCAAATGCTTCCACTGGATGAAATGATGTGTTGCCGGGATTGAATTCCAACCGGGTGTTGGTCTGCACAA
+ACTGGCGCGGAACCTTGGCCGGACCGCGATCAGCACTGTTCCCGTGACAGCGAAAGCATAATTCATATTCGTGCGTGACA
+GCTGAAAGAATACCGCCCCCGGCACTGACACCGGCAACTCCGGCCAAAGCGCCGGGAATCTGAGTCTTTGCATTTGGAGT
+GCTGCTGGCAGCATGAGGATTATGGCAGTCCGCGCAGGTGACGTGGCGAATCGGCGGATTTACCAGATCTTCGCACGAGT
+GGTN
+>generic284
+GCCACCCCAGGCACACCAGCGAGGGTTTCGGCCAAGGTAGCCCCCCGTCGCAAGACCAACGCATCACCACTCAGACTTTC
+AGTGGCTGCGCCTGCGGTCGGTGACGCTGGCTGAGCGGTGATCACCACGGTATCCAAGGACGGCGTACTTTGCGCCCACA
+AAGCCGGAGAAACGGCCGCCCAAGCCAAGCCCGCAACCCAGGGCCGAGAAGTTTTTTTCATCATAGAAATCCACGCTAAC
+AACACACCAACGACACACCGACCTTCGCGCGGCGTCACCACAGGCGAAGAGTCTTCAACGAGCGTGGGAAGTGCGTGGGG
+GTGCGCGAGCTTGAGCGTGATGGCTAGGCGCTCCGCAGCGCCCAGCCCTTGAAAAACCCTGCGGTGCATAGAAGCCGAGG
+CGCAACAAGCCAAACAACACGGGAATCGTCCAAACCCCCAACGGCTGCGGTGGTCAAGGCGTCGAACAGCCGGCAATCGC
+TGCCGTCCTCGTGGTGATCATCAAACGGG
+>generic285
+GCGAAATTTCTGGCGCGTCGATGCGTGACAATCTGACGGTGATGGTTTTGTGTTTTGATTTCACGGTTAAGGTGTCGCCG
+TCGCTTACTTTCGTGACTGTTCCGCCGATTGTGTGAATGCTGTAAAACTCCGCCTTTGCAACGGTGCAAGCGGTCAACAT
+AGCCGCGATTAAAATTACTTTTTCTATTGTGTTACCTCGTTAAGTTAATAAATTTCGTTCAAAATAGAAATTAGTTTCAA
+ACGTTCAACATCTTCACTTTTGTCATTGGTGAATAAGTGCAAGCTGTGAGCCTTCAATGGTGGCGTTTGCCGCGTCTAAC
+TCGCCCTGCGTCGTGGCTACTTTTTCGTAGTGCGTTTATTTGTTCGTCAACCGCCACAATGCCATCAGCTACGCGCTTTT
+GGCTTCGCTTTTCGTAGTGACAAATACAGTCCCAACATTCGCTCGGCGCGTCGTTTCGTGCTTAACGCCGTCAACATTTG
+CGCGACGGCTTCAACGGTTTTGAGTTTTCTATCAATCGCCAATTTTTGCTCTTTGTCGA
+>generic286
+TTCCTGTTCGGTCTGTGTGCCTGTCCACATGGCTTTGTTGAAGCGTTTGATGTGTACGCCGTACATGTGCCAGATGATGA
+TGGCGAGCACCGCCAGAACGGCTTCGCCTCCGTGCGCAGCTTTGGCGGCGGGGATGAATTGGCCCGGCAGGTATTTTGTG
+GCGGTAATGGGGTTCCACATGAGGAAGCCTGTAGCGCCCATTACAGCGGCTCCCCATACAAATGCCCAATACTCCATTTT
+TTCTTCAAAGGTGTAGCGTCCCATTTGGGGATAGGCTTTTGCAAAGCCAATATTGTAAAGCAGGGCTTGTATGCCATCTT
+TCGCATCCTGTAAGGATGGGAGCATGGACATTTGATCACGCAGGACAAATACGCTGTATCCCATGACGAGGATGTGCCAG
+GCTGTGCCAAACATCATGACGATGGCGGCAGTGTGGTGAATAAGGCGCAGGTTCTCAATCCCCCCCAACA
+>generic287
+GGTGCGTCAAGCGTCGTACCACGGGGTAAGAACCCGCAGCAATCGCGATAAACAACAGCGCTAAGCCGCCCAAAACCACC
+GAAGCACGCTCTTCGGTCGAGGGGGCGATGGAGCGGGCGCAGACCACCCCCTCCGAACCACCCACAGAACCCGGCCATCC
+GAAAGGGCAAACCGCCTGCTTGGGCGGCTGTTCATACAGGGCCGATGTCGCCAAGCGCTGTCCGGCCGAATCATCCAGTG
+CCATCCCCACCCGCAAGCGCTGCGCCCAAGCCAAGAGGGCCTTGGCTTGTTCTTCAGCGGGAGCCTCGGCGGGTGGGCAG
+GCTGTGCTCCAGCAACTCACCCCAGGCGGACATGCGCTCATTGACCACGGCGCGTTCGATCTGTCCATGCTGCTCGGCGG
+TGTGGTGGCGCACGATCAACATCGCGACCAGCGCAAACACCATCAACACCGCCACCACGGTGAAGTAAATGTTGAGATAG
+AGATGGTGAATGCGC
+>generic288
+GGTGCTGCTTGACCACCATAGTGCAAAATCAGTATTTTGAAAAACATTTATAGAAGTAGGTTTTAGCCGGTCGATTGCGT
+AAAATTCATCCTGAAATAGTTCGCTTTTTTAAGTTATTATACCCGCCCTTTTGAATTTTCAGTTTTACCATGCAGATAGG
+TTCGCACATTCTTAATAACAAGCTGGTGCTTGCACCGATGGCGGGAATTACTGACCAGCCGTTCCGGGTTTGTGCCGGCA
+ATTGGGTGCAGGATTGGCGGTTTCGGAAATGCTCACTTCCAATCCGGCTTTGCGTGAGAATCATCGCACTTTGCTAAAAA
+GCCAATCACACGGGTGAAAACGGTTTGCGCAGCGTGCAGATTTAGGCACAAATCCAGAGCAAATGGCAGAAGCGGCACGG
+TTTAATCAGGAGCGCGGTGCAGATATTATTGATATTAATATGGGCTGTCCGGCAAAAAAAAGTCTGTGCGGTGGCGGCGG
+GTTCGGCTTTAATTAAAG
+>generic289
+CGGCTCGCCAGCCACGGCGTGATCGAAAAGGCAATGGCCAGCGAGATCGCCATGCCGAGGCTGGCGTTGATCGGGATCGG
+GCTCATGTACGGGCCCATCAGCCCCGAGACAAAAGCCATCGGCAGCAAGGCCGCGATCACGGTCAGCGTGGCCAAGATGG
+TGGGGCCGCCGACTTCATCGACCGCCCCGGGGATCAGCTCTTTCAAGGAGCGCCCCGGGTAGAGCTGCTGATGGCGGTGG
+ATGTTTTCCACCACCACGATGGCGTCATCGACCAAGATGCCGATGGAAAAGATCAGCGCAAAGAGCGAGACGCGGTTGAG
+CGTGAAACCCCAGGCCCAGCTGGCAAAGAGTGTGGCCATCAGGGTCAGGATCACGGCAGCACCGACGATCACGGCTTCGC
+GCCGGCCCAAGGCCAAGCCGACCAAGAGGATCACCGAGCCGGTGGCAAAGGCCAGCTTGCTGATGAGCTTGTTGGC
+>generic290
+GCGTGTTCTACGACGCCTACGTGGTTCACAACCCTGCCGAGGCCGCTTACCGCTTCCACCACATCGCCAAAACCTGGGGT
+TACCCCGTGCTGGTGCAAGCGTTTGTCGCCGGTGAGGAGGTCAATCTGACCGCTTTGGGTGACGGCACGGGCGCGCTGAT
+CGGCCCGGTGATGATGCGCAAACAAGCCCTCACCGACAAAGGCAAAGCCTGGGCGGGCGTGGTCATTGACGATCAAACCT
+TACTGCTTGCCGCTCAGCAACTGATGCAGACCTTGAAGTGGCGCGGGCCGCTGGAACTGGAGATGCTGCGCGACGCCAAC
+GGCACCTTGCACCTGATCGAGATCAATCCCCGTTTTCCAGCTTGGATCTACCTCTCGCACGGCGTGGGACGCAACCTACC
+GGCCGCCCTGCTGGCCCTGATGCGGGGTACCGCAGTGGCCGATCTCGCCTTGGCCGCACCGCAGCCCGGTGTGAGCTTCA
+TCCGCCATGCCCGCGAGC
+>generic291
+CGGTGAACCAGATGCCGTCTTCTTGTTCGATGCGCTGGTGGGTTTCTGGGTCGGAGGTGAAGGGTTCGGTACTGATAATG
+AGCTTTGTTAATTTGCTGAAACTAAAGGCTTTAAGTTGTTCATCAGCAATGGCGGCGAGATACCATATTCCTGTGTGATT
+CACTAATTTATAGGGTTGGGCGCGGTAGGTTTTGTCTTTATAGTTAAACTGAATGCACTGGCGTTTGACAATGGCTTGCT
+CTAGCTGTTTGAACTGGTCGGTTTTTTGCGAAAGGTCTTCATAATTCTGCCCTTTAACCAGATAGGCTTGGGTGATATGC
+GCATCAAATAATTCGCGTAGAAAATCATCTTTCAGTACAGGAAACAGGGCTTTAACACCCGTCAAGCAGGCAAAACGTTC
+AATATCATGGCTGGTGAGTTTACCTAAATAATAGGCTTCCAGATGTAAATAAGCCGTTGTCTTTGATGAGCGGCAAAAAG
+GCGAAACGCTCAAGTAAGTCGCGCTGAATGGTGCGTTTGGTGACTTT
+>generic292
+GCCACGTCCGCGTTTTCGAAAGCGGTTTTTGGGTTGGTGTCAAACGCAATGCCCTCCGCACTTCCTGCTCTGCTCTCGAG
+AATCGAAACAACTTTTATTTCCGGGTCCGTCCCTGCGGCTGCAAGCACTTCCCTTCCCATCTTCCCGAACCCGCAAATGC
+AAATCTTGATTACCATTTGAAACCCTGCCCCCGGTTCTTCCGCGCCTCAAAGCCAATAGCTTTTCCAGTACGCCTTGTTT
+TCCAGCCTCTCGTCAATGTCAACGTCGTAGAACCTTGCGACCGGCTCCAGGACTTCAGGGTTTTCCTTCCAAGTCTTTTC
+AAGCGCCGTTCTTACGAACTCCGTGCCGTCGCGCGTCATCATCCCAAGCGGCTTTCTGCCTGCGTATTCGATCATCCCCA
+ACCCGGCCATCGCGGTCTTGATCGGGACGGGGTTGCGGAACTTATGGCCGCTCGCCTTTACCGTTATGATTGAAAAAGCG
+GCGATAGGGCCTGGGCGAGTTGGGCCGCTTTCGGGTTGTCCGCCGCGCAGGCGGTGCTCAGTTTCTCCACCG
+>generic293
+AAACACACGGCGGTCAAAACGCACCTTGGGTTAATGAACGTCGTCCAACGATGGCGGCTGCATTGGTGGCGTGTCCTAAC
+TTCAGGACGGGCTTGGGAAAATCGGTGGCACGCTCCTGAATGTGCTGCAAAGCGGTTTCAAGGCTGGGACTTGCGACGGT
+GCGGACGCTAAACGCCCGACACCGTTCATGTGCCGATAAATACCGTGCGTGGTTTAAATCACCTTGCAGTTTGTTAAACG
+CAGGTTGCAGGGCGGCGGTAATTCACTCAAATCATACCAGTCAATATTTTCATTACACGGTATTGTGTTCTGCGCCGATA
+AACCAGCTATCAGCGGGAATGTGAATGCCACGCTCTGCCAGTAGTTTACGAATCTCAGGACGATTTGCCATAGCGGCAAC
+ACCGCGCATTCGGGCGCCGTGCCGACCACTGCACGCACC
+>generic294
+CAGGAAAGGCACCTTGCTGACTTGATCACGCTCGGTCACTTCGAAAATACCGCCGATCACCACCGTACCGCCGTTTTCAA
+CCAACACCTGCGTCTTGACGTGCTTGGTGTTGATGGCAAAACCGGCTGAGGTTTGTTGGCCCACGCTGTCCTTGTTCACA
+TCCACATCCAAGATGATGTTGCCTTCGGGTGTGATCTGCGGCGTGACTTCCAGCTTGAGATTGGCTTTGCGGAATTGCAC
+CGAAGTGGCACCGCTGGACGTGGCAGCCTGATACGGCAGCTCGGTTCCTTGCTCAATCAAGGCTTTGACTTGGTCAGCAG
+TGATCACGCGGGGGCTGGAAACCACTTTGCCCTTGCTCTCGGCTTCCAAGGCCGACAGCTCAAGATTCAAGAAACGGTTG
+GCCGTGGCACTGAAGAGCGACAAAGCAAAGGTGCCCGCTGCTGAACCGCCAAAGTTGGCATTGGCCACGTTGGCCGGCAA
+ATTCACAAACT
+>generic295
+CGAGCGATAGCCTGAATCGACCCGTTCGACCTCGCGCGCTGCCAGCCCGTAGCAGACCTGATTGAGCCCGCCACCGCCGT
+ATTCAGGCGGCAGCGTCGAGCCCAAAAGCCCGAGCGCGCCGAACTCCTTGAACAAGCCGGGATCGGTTTGCTCGTGGCGA
+AAGGCGGCGCAGACCCCGGGGGGCGAGGGCTTCTTGGCAAAAGCGCCGGGTCGCGTCGCGCACTTGGCGTTCGACCTCCT
+CAAGCTGCGTTTCAAGGTGCAGCGGGTCGTCCCAGAGAAAGCGTTGGGGTGATGCGTAGCCATGGCGGGTTCAGGCGGTC
+GCTTCGAGGCTGGCCCCGAGGATGGCCAAGCCGTTCGTCGAGTTGGGCGTCGGAAGCGGTCAGGGGCACCATCAAGCGGA
+TGACGTTGGCGTCTGCGCCGCATGACAGCAGGATCAAACCGCGCCGGGCGGCTTCGGCAATCACGCGGCGGGTGCGGTCG
+GCGTCGGGCAGCAGCAAGTTGCCGTCGGCGGCCGA
+>generic296
+GGCCAATTACCTATTATTGCAGAGCGGAGAAACAAATCGATTCTAATTTGGCGCAATCTCTTCTACCTCCTCCTCCTCCT
+CCACCCTGGCTGAATTGCCCTGCCCCTCATCACTCTTTCCAGAATGTTGCCTCCTTCAAATTTAATTCCTTTATTCCAGG
+CAGGCCAGAAACCCACCTTCGCTGTAAATAAACGAGTCGTCCCCTTTCCTTATTTTACCACGAAATCATCGAGATCACTT
+TCGAACACAACCATCTTCTCAGCAGCAAGCCCTGATTACGATTCCTTCACTATATTTTCCATCGATACAAGGCACCTAGA
+TTTCTTCGACGAGGTACATCGAAGGTCTGCCAGATGTGGCATTTTCCCACGAACTGAATTCAAGTCTACAGTTCTGATCA
+CCTCAACCTGCCGATTCCTTCACTATATTTTCCATCGATACAAGGCACACGAGTGGTGT
+>generic297
+GCTGTATGGCATCGTGCATCTCTTTAAGACGATTCCGACCAGCTTCGTGCCGAACGAGGACCAGGGTTACACGTTCGCGC
+AGATCATCATGCCGGATGCCGCCAGCATGAAGCGCACGATCGAGACGGCGGACAGGATCGACGCGCTGTTCGCGAAGAAT
+ACAGCAGTCGCCGACCGCACGATCATCAACGGCTACAGCTTCATCGACGGGCAGTACAAGTCCAACGTCGCGGCGATGTT
+CGTCACGTTCACGGATTTCAAGGAGCGCTACAAGTCGATCGATGTCGCCAAAAAAGAAACGTCAAGGCCATACTGACCGG
+AGTCTATGCCGGATCGCAGCAGATCGACACCGGCGTGTTCCTGCCGATCGCGCCGCCGGCGATTCCCGGCATCGGCACCG
+GCAGCGGTTTCGAATTCTGGATTCAGGACAAGACCAGCGGCGACCCATTGCGCCTTAACGAAGTCACGCAGCAA
+>generic298
+GCGAGGCGCTGCGATCAGCCACGGCCAGCATGGCCTCAAGACGGCGCAGCACGCGGTCGGTGCGCCAGTCGCGGGTCAGC
+TCAACAGCGGCGCGCACCAAGTTGCCTTGGTGTTTTTCAAGCTTGGCTTCAAAACGCTCAAACAGCGTGAAAGCATCGGC
+CGTGGCACCGGCAAAACCAGCCAGCACTTGGTCGTGATAGAGCTTGCGGACCTTGCGTGCGCTGGCTTTGACGACGATAT
+TGCCGAGCGTGACCTGACCATCACCACCGATGGCCACTTGCTGGCCCCGGCGCACGCTGATGATCGTTGTGCCGTGATAA
+GACTCCATGATGTGTTCTTTTGAAGACTAAAAAGCAAAAAGGGCACGGATATCTATCGCTATCGTGCCCATGGCTCACGA
+ATCGGGCATGCCGGCCCGATTCAGATGTGACGAATTTTGATGC
+>generic299
+CAGCGATCCCAGCTTGGCAATAACGGGCAGCTTCTTCGGCGGATTTCTGCGACCAAGATCCAGTCACAACGAAATCAACT
+TCACCACCACGCGATAAGTTCATGGGGACAATCGCGTTCTGCCCCAAGCCCCCACCTTGCATAAACAGGATGCGGAAGTG
+GGATGGCACCGCCAGCAACTCGCGCAAGTCAGATTCAGCCTGCTCGCAAATCGAGAGGAACTCTCGACCCCGATGGCTCA
+TCTCCATCACGCTCATGCCAGCCCCGTGCCAATCGAGCATTTCGTCGGCCGCCTGGCGCAGCACTTCTTCCGGCAAAACA
+GCCGGGCCGGCAGAAAAGTTATACGGGCGATTCGCCATGATCTTTATGCGCTCAATGGCCCTCTTATTTACTCGCCGGAC
+CGGCGGCTGAGGCCGCCGAGGCAGCCTGTGCCGGCGGCACACCCAAATGCTCACCCATGGCCTGATGCAAAGCCAT
+>generic300
+GTTCAGGCGAATGAACAGCGCCGCCCGCTTGACCGGGTCGAGTTCCTGCTCGCCAGCGCGGTAGGTCTTGTCGTATTCCT
+CGCTGCGGTAACGGCAAATGTTGCGACCCAGCCACTTGTTGGCCTTGCTCGACACCTCCCAGGAGGTGTACTGGTCCATG
+AAGCGTTCGGCATCGGGTTGCGTCATCGTCGTGGTGTACATCTGCATGTCGCACCAGAACTTGCCGTAGGTATCCGGGTT
+CGCCACATCCGACGAGAAGAACACAGCACCAGTGACCGACTTGAGCTCCAGATCAATGCCGGCTTTCTGGCAAGCCTGCT
+TGATCACGGCCTGTTCCTTCTGGCGGATCGAATTGACGGAGGTCTGGAAGACAAACTTCATCTTCTTGCCGCCCTTCTCA
+CGCACGCCGTCGCTGCCACGCTTCCAGCCGGCGCCATCCAGAATCTGGTTCGCCTTGTCGATGTTGAATTCCCACTTCGT
+ATTCGGCG
+>generic301
+CCCAGCCAGCCCTTGATGCGTTGATTGGTGCGGCCGCTGGGGCAGGGGCCGGGCAGGATGGCGGAGAGATCGCCGGTGCC
+GAAACGGATCAGCGGGTAATCGGGGTTGAGCACCGTCACCACCACTTCGCCGACCTCGCCGTCGGGCACGGGGTTGTGGG
+TGCCGGGGCGAACGATTTCGAGGATGACGTGTTCATCGACCACCAAACCTTGGCGGGCCGAGGTTTCGAAGGCGATCAGG
+CCGACATCGGCGGTGGCGTAGCACTGGTACGCCTGCACGCCGCGCTCGATCAGCCAGTCGCGCAGCGAGGGTGGGAAGGC
+TTCACCGCTGACCAGCGCTTTGCAGATCTGGCCCAAGCCCCCACCCCCGTGGGGGCCTCGCTGGCTTTCTCGACCAAGAT
+CTTCAAAAAGCTCGGGGTGCCGATGTAGCCGTGCGGTCGCAGTTCCTGAATGGCTTGGAGTTGCAGTTCGGTGTTGCCGA
+CCCGCCCGGAAACACCGTGCAGCCAAGGGCGTGCGCGCCGGTTCC
+>generic302
+CCGATGGTGAGCATGTCGATGCCGTGGGCACGCATGTCGCGCATGACGTCCAAGATCTCTTCGTCGGTTTCACCCAGGCC
+GACCATCAGGCCGCTCTTGGTGGGCACGTTGGGGTGCAGAGCCTTGAATTTTTTGAGCAGGTTCAGGCTGAAGGCGTAGT
+CGGAGCCGGGCCGGGCTTCCTTGTAGAGGCGCGGGGCGGTTTCCAGGTTGTGGTTCATCACATCGGGCGGCGCAGCCTTG
+AGGATCTCCAGCGCGCGCTCGTCGCGGCCCCGGAAGTCGGGCACCAGGATCTCGATGCGGGTCTGGGGCGAGAGTTCGCG
+GATTCTTTGGATGCAGGCCACGAAGTGAGCAGCACCGCCGTCGCGCAGATCGTCGCGGTCCACGCTGGTGATGACGACGT
+ATTTGAGTTTCAGCGCCGCGATGGTTTTGGCGAGGTTCTCGGGCTCGCTCGCGTCCAGCGGATCCGGGCGGCCGTGGCCG
+ACGTCGCAGAACGGGC
+>generic303
+CTGGAAGCCAACGATGTGCTTTTCATCGACGAGATCCATCGCCTCTCGCCCGTGGTCGAGGAAATCCTCTACCCGGCGTT
+GGAGGACTATCAGATCGACATCATGATCGGCGAGGGGCCGGCAGCGCGCTCCATCAAGCTCGACTTGCAGCCCTTCACGC
+TGGTGGGTGCCACCACCCGCGCCGGCATGTTGACCAATCCGCTGCGCGACCGCTTCGGCATCGTGGCGCGACTGGAGTTC
+TACACGCCTGAGGAGCTCTGCCGCATCGTCACCCGCTCGGCCAAGCTGCTGAGCACGCCCATCGACTTGGACGGCGCGAT
+GGAAGTGGCGCGCCGCGCGCGTGGCACGCCGCGCATCGCCAACCGGCTCTTGCGCCGGGTGCGCGACTACGCCGAAGTCA
+AAGGCGACGGCCGCATCGGCAAATCCATCGCCGACCGTGCCTTGGCGATGCTGGACGTGGACCCGCT
+>generic304
+TGCACGAGCGCGCCCAGCTGGAACGGGCGGTGGCCGCGTTTGGCCTGGCGGCCCAGGAACTGGGTCTGGCCCGATGAGCC
+GGCCGCGCAGCCTGATCATCGGCGCCAATGGCCAGCTCGGTTCGGAACTGGCGCGCGCGATCGCCGTCGCCGAGGGGACC
+GATGGCCTTGTAACCGCCGACCTGGCGCCCCAGGGTCCCGTCGCGGGGCTGGTGCACGAGCGGCTGGATGTGGGGCGGGC
+GCAGGACCTGGCGGCGCTTGTGCAGCGCCACGCCATCACGCGCATCTACCATCTGGCTGCCGTGCTGTCGGCCACCGGCG
+AAGTGCAGCCGCGGCACACTTGGGATCTGAACATGGACGGGCTGCTCAACGTGCTGGAGCTGGCGCGCACGGGCCAGGTG
+CAAAGCGTCTTTTGGCCGAGTTCCATTGCGGTCTTCGGGCCGCGCGCACCGGCCGATCACACGCCGCAATACACCGTGAC
+CGATCCC
+>generic305
+CCTCGGCCTCGGCCCAAGAACTCAAGTTGGGGTACGTCAACAGCGAGCGGGTTTTGCGCGAAGCTGCACCGGCCAAGGCC
+GCCCAAGCCAAGCTTGAAACCGAGTTTGGCAAACGGGACCGTGAGCTGCGTGAGGCTGAGCAACGTCGCAAGGGCGCGGA
+AGAAAAGCTCGACAAAGATGCACCGACCCTGTCGGAAGCCGAGCGCACCAAGCGTCAGCGCGATTTGCTGGAGCAAGACC
+GCGATTTGCAACGCAAGCGGCGCGAGTTTCAAGAAGACTTGAACCAGCGGCGCAATGAAGAGTTGTCGGCGGTGGTTGAG
+CGCGCCAATCGGGTGATTCGCCAGATCTACGAGCAAGACAAATACGACCTGATCGTGCAAGAAGCGGTGTTCGCGTCTGC
+CAAGGTGGACATCACCGAGAAGGTGATCAAGGCGCTCAACGCGGCTTCTGTGACGGCCAAGTACGAGTGGTGT
+>generic306
+GTCCGGAACAGCCCGAAGCACCACTCGGCGAAGGCGCCGCGCGACGCCCAGGTCTTCTGCCCGCTCAGGACCCAGCCGCC
+CTCGTCGTCCGAGCGCCGGGCCCGGCTGCGGATGCCGGCGAGGTCGGAGCCGGCGTCGGGCTCGGACCACCCCTGGCACC
+AGATCTCCTCGGCCGAGGCCATCGGGGGGAGGAAGCGCGCCTTCTGGGCGTCGGTGCCGAACTCGAACATGGTGGGGGCG
+AGCAGGAACACCCCGTTCTGGCTGACCCGCAGCGGCGCCTGGGCCCGCCAGTACTCCTCTCGAACACCAGCCACTCCAGG
+ATGCCCACCCCGCGGCCGCCGTA
+>generic307
+GCCGACCACCGTGGCCCCATGGCCTTGAACTGGGGCAATAACTCGGCAAAGGCATGGGCCTCCATGGTGCAACCGTTGGT
+GAAGGCTTCGGGGTAGAAATACAACACCACCGGGCCTTTCTTCAGCGCCTTGTTCAACGAGAACGTGAAGGCCTTGCCGG
+CATGCGCGGCCGGGGCGCTTGAAGTCGGGGGCTTGGGCACCCACATCCAAGGCGGCCCATGCCGGGCTAGCCGTCAACAT
+CAAAGCAAAGACGCCGCCCAGAAGGCATCGGCTGGGGACTGAATTTCATTGCGGGTCTCCTCCAACATGGTGAACACCGC
+TATCGTGACACGAGCAGCCGACCAAGATCAAAAGCCTTTGCCAGCCGACACACCTCAGCACAAGTAGCGCAGGCAAGGCA
+AGATGC
+>generic308
+CCGTGGTGGCCACGGGCAAGGGAGGCGTCATCCTCTACTGGAACCGGTTCGCGGAGTGGATGTTCGGTTGGACCGAGGAT
+GAGGTGCGCGACCAGACCCTTGCCAAGGTGACTGGGTTCACTCCAGAGGCGGCCCGGACTGGCCTTTCCGGGTTCGGCGC
+GGCCAAGGGATGGACCGGGGAGGTGAAAGACGATCCGGCGCGACGGGTCGATCCTTCCCCACCCTACCTGACCTGCTCGC
+CGATCTGGCGCTCGGAAGGATCCATCGCCGGATTCGTTCTATACCTTCATTGACGTCTCGGACCGGAAATACAGCTGAGG
+CAGCCATCCGGGACTCGGAAGAGAAATACAGCACCGTGGTGGAGAATTCCCCCACCGGGAATCTTCATCTACCGGAACGG
+CAACCTGGATTCGCCAACCAGCGGTTCTTCCAGATGGTGGGCCGTTCCCAGCGGGAACTCATCGGCGTGGACATTGCGAA
+CCTCATCCATCCGGAGGATTGGCCCACGGTTCGGGAGTTGTGGCGCAGACGGATGGCAGGCACA
+>generic309
+AAAGCCTCCGCCAAAGAGGCCATCGTGCTTGCGGTTCCCATCACCGCACAGGTACCAGCCGTAGTCGACAAGCGTTGTTC
+AACTGCGGTAATTTCTGCCTCAGTTATCTCGCCGGCGCGAAAACGTCCCCAAAATCTTCGGCAGTCTGTGCATGCGCCGA
+GTCGCTCACCTCGATGTTTACTGGTTGACATGGGGCCGGCAACGAGTTGGATCGATGGAATATCTGCCGAAGCTGCACCC
+ATCAATTGCGCCGGAACGGTCTTGTCGCACCCGCCCAGCAGCACCACCGCGTCCATCGGTTGCGCACGGATCATCTCCTC
+AACATCCATCGCCATCAAATTGCGAAACTTCAAACTGGTGGGGCTCAGGAATACCTCACCCAAAGAAATCGTTGGAAACT
+CAATTGGCAAGCCGCCCGCAGCCAATACGCCACGCTTGACTGCCTCGATCATTTCTGGAAAGTGGCGATGGCACGAGTGG
+TGT
+>generic310
+CCACCGCCGAGCTGGCGCTGGCCGATGTGGACGCGGTCTTGATGCGCAAAGACCCGCCCTTCGACAGCGAATATTTCTAC
+GCCACGCACCTGTTGCAGCAAGCCGAGCGCGAGGGCGCCCAAGTGTTCAACAAGCCCTCGGCCCTGCGCGATCACCCGGA
+AAAGCTGGCGATCCTTGAGTTCCCGCAGTTCATCCCGCCGACGCTGGTGACGCGCTCTGCTGCTGCGGTGCGGGCCTTTC
+ACGCCGAGCACGGCGACATCATCTTGAAGCCCTTGGACGGCATGGGCGGCATGGGTATCTTCCGGGTCGGCGCGGATGGC
+TTGAATTTGGGCGCGATCATCGAAACCCTCAACCAAGACGGTGCTCAAACCCTGATGGTGCAGCGCTACTTGCCCGCCAC
+TCGCCCAAGGTGACAAGCGCATCTTGGTGATCGGCGGCGAGCCGGTGCCG
+>generic311
+TTTCGAGCGATTCGATGATCGGAAAATAGCGGTCCACCACCGCATCCATCAGCGCATACAGCACAAAACCCGCCCCTTGA
+CGCAGCAGATGCGGTTCACGCTCGCAGCGCTGGCGCACCCCGAGAAAACTCTGCGCCGTGCGGTTGCGCACCGAGAGCAC
+AAAGTTGCGGCCCACAAAGACGTGAACTTCACCCACGTTCAGCTCATCGGTCGGACTGATTTCGACCAGATGCATCACCG
+CAAAGAGAATGTCGCCGTACTCCTCGATCTTCGGCCGCTGATGGCCGTGCCGAGCATCCTCGATGGCCAGATCGTGCAGA
+CCAAATTCATCCTGCATCTCGATCAGCTCAGCATCCGTGGCATCACGCAGTGCGACCCAGACAAAATGCCCCGGCAAAGC
+CAGGTGATCGCTGATTTCGCTGACGGCGATATCGGCCAGCTTGGCCCCCTCTT
+>generic312
+TCCATACTTAAAAGCACTTATTATTATACCTATAATCTCAGATAATGGCAATCCCTTGTTTCTTTGATGAAACCAAATCA
+AGTTTAAAATATGTTTAGATTGGGAAAAATAAAAAGAACAGTCTACGCAAACGAGTCATCTTTTTGCCTCAAAAGTTTTG
+TTGTTTTAAGAGATACTGCAACTTTTATGACTGCTGATTGAATTTGTTGTCTCACAAACTCACTGCAGACAAACTCATCT
+CATCAAAGAGACGAAGTGATGGATATAAAAACAAACATGAAACAACTTAAATCTTTTTTTTCTAGGAGAAAACAACACTT
+TTTTACTTGTTTTAACTAAGAAACTTTTAGTAGGTCATCTGTGAGACTGTTTTTTA
+>generic313
+GCACAGGGCCGTCGCGGTGACCGTGAGGGTGTGGCTATGGTCGTGGCGAGTGAAGTAGGCGGTGTGGCAGCCGGTGCAGA
+TGGCGCCGCGGATAATGGCGGTGACATGGGGTCGCGTGGCCGGGGTCGCCAAAACCGGCGGCGCAGTGTGACAGTTGGTG
+CAGCGGTTCTTGTGGACAGCCATCGGGCTGTTGGCCGGGTGGCAGATGGCGACGCAGGTCGGGGCGTCGAGGATGATGCC
+TTTGCCGGCCGCCGAATGATTGACGGCGCCATGGGCGGTGCTGATTCCCTTATTCTGATGGCAATCGAGGCAGTGGACGG
+TGCCGGTGCCGTGGCTGGCAATGACATACTGCACCGTGACCCCGCTTGGGGTTATCGGATTGACATCCCGGGTGGCGTCG
+TGGCAGGTGGTGCAGACGTTGAAGTGGGTAGTCAGGATATTGTCCAACTCTGCACCGAGTGGCAGTTGGAGCAGGGCTGG
+CTGTC
+>generic314
+GCAAATGCCACGCGCCGCGTTGTCATCCATTGGCGGTTTTTTATCCATCATCATGGGCTTTATGATTTGGATGGGCTGGC
+CGTCAACCGCTGGCTGGTTTCTGTCGTTGTGTTTGAATGTTGAAATTGCGGTACGCGGCTGGGCAATTATTATTTTCGCG
+CTGTGGGTAAAAAACCAAACTGACACCGAGTTGTTACGCGCCCGATAATGTATCGGGACGCACTTTAAGCGCATCCCGAT
+ATAGACTGATTATTCCTGAGGACTCTCAGGCTCAGTCACACTTTCAGCTTCTGGTTCAGCTTCAACTGGCTGTTCATCTG
+TCTCGTTTATTGCTTCCTCATTGTCCGCACCATCACTTGCCGATACTTCCTCCAATGTCTTCATAAACATCACAAACCAG
+AGTTGGTTTTTAGCTTTATCAAGGTCTGGATCTGCCATAATGTCTTCGGCTTCGGGTAAGTAGCCGCTGTTTTTGGCATT
+TTCCAACGCGTCTAAACAGGCTTC
+>generic315
+GCTCGATACTCCGGGTCATGAAGACTTTTCCGAAGATACTTATCGCACCCTGACCGCCGTCGATTCCGCGTTGATGGTCA
+TCGACGTAGCCAAAGGCGTAGAAGAACGTACCATTAATTTAATGGAAGTCTGCCGCTTGCGCACCACGCCGATTCTCACC
+TTCATCAATAAATTAGACCGCGAAGGACGCGAACCGATTGAACTGCTGGATGAAGTGGAAAGCGTGTTACATATCAAATG
+CGCACCAATGACGTGGCCTATCGGTATGGGCAAACGCTTCAAAGGCGTTTATCACTTATATAAAGATGAAATTCATTTAT
+TCAGCGCACAACATGGCGGCAAAATCGCTGAAGCCACGGTGATTAAAAGGTTTGAACAATCCGCAACTGGATCAATTGCT
+GTTATTGCAAGCAGATGAATTACGCGATGAAATTGAGCTGGTCACGAGTGGTGT
+>generic316
+GCATCAGAAACCTCCGGGTCCGGGGACTTGCACGCCCCCTTCGTTCCAGTGCAACTTGCGGCGCAAGGTGGCGTAGTAGC
+TCCAGCCGCGTGGATGAAGGAAGCGCACGCGGTGAGTCGAGCGGCGCACGATCACTTGGTCTTGCAAGATCAAGTTGGCG
+ATCGACTGCATATCAAAGTTTGCGCTCATCTCACGCCCGGCCACGATCTCGATGCTGATGCGGCCCGAGTCGGGCAGCAC
+GATGGTGCGGTTGGACAGGGTGTGCGGGGCGATGGGCACCAGCACCAAGCCGGCAATGCCCGGATGCACGATCGGTCCAC
+CCGCCGAAAGCGCGTAGGCGGTCGAGCCGGTGGGCGAGGCCAAGATCAAACCGTCGGCGCGGAAGTTGGTGACGAATTGA
+TCGTCCACACTCACGCTCAGCTCAATCATGCCGGTGCCGCTGCACCGCACGACCACATCGTTCATGGCGGTGGCC
+>generic317
+ATCGGCTTGCGGGGCTCACGCATCTGCGCCATCGGCAAAGCGGGCAACCCGGACGTGCAACCGGGTGTGGGCATCGTCAT
+CGGCCCCGGCCACCGAAGTGATCGCCGCCGAAGGCATGATCGTCACCGCAGGCGCCATTGACACCCACATCCACTTCATC
+TGCCCGCAGCAGATCGAAGAAGCCCTGAGCAGCGGTGTCACCACCATGATCGGCGGCGGCACCGGCCCGGCCACCGGCAC
+CTTTGCCACCACCTGCACGCCCGGCCCCGAGAACCTCGCCCGCATGCTGCAAGCCGCCGACGCTTTTGCGATGAATCTGG
+GCTTTCTCGGCAAAGGCAACGCCAGCCGCCCCGAAGCCCTGCGCCAGCAGGTTGATGCCGGGGCCATCGGCCACGAGTGG
+TGT
+>generic318
+CGTCGGCTCGGCGAACACGGGGCGTGGTGACCAAGACGACGTACAGCTTCCGGTATCGTGCCGTTGATCGGTACGGTGGC
+GGGTACGCCGAGCGCCATCGTGACAGCCACCATGCCTTGATGGATGGTTTGAGGGACCGTCAAGGGTGACGTCCCTCGCG
+TGATCGCGCACAATCGGGGCTGCGCTGACTTCAACAGTCGGCGCGGCCCCGATCTCATTTCACAACCTGTTTTGTACCTT
+CGCCGAGTTCCAAGATGTTTCGTCACCCTCGTTGAACG
+>generic319
+CCGCAACAGGGACGAAGCAATCGAGCGCATGAGGCGGGCCCTCTACGAATACGTAATAGTGGGAGTGAAGACCAACATAC
+CTTTCCACAAGGCGGTCATGGAGAACGCGCGCTTCCGCAGTGGGGAACTGGGCACGCATTTTATCACCCAGGAGACGACG
+CTGATCGAAGATATGCAGGCCATCATGGCAAGGGAAAAGCCGCTGGAGGAGAAGCTGTCGCAGGTATTCGACGACAGCAA
+ACGGGCGGCGGCCGTAGCAGCGGCCGTGGCCTATACCCAGATGATCCAGAAAAACCCCAGGGGCGGGCTGACTCATAATA
+TTTTCNGTTGTCATTGCCATGCAGCAGATTGCCACGGGCCTGCGGCCCTCGCAATGACATAATCATCATTTATCAGCCGG
+TTTACCGGCGGCACTATCCCGGCTTTTATCATCCACAAATATTCCCGCCACGTTTTGCCGAATGCCTGTGCGGCCTTCCC
+AACGTCCTTGAA
+>generic320
+AACCCAATCTTCGAGACCGTGTGATTGTCATGCCATTGATGGATAGCCCTTACAATGATGATACCTGGATTATCAATGTC
+CAAACTATCGTTAAAGGTGTTGTTCAAGCGTATTCAACTGTTCCACACAGGCAGGCGAGAGTTGCGCTAATCGGCCATGA
+TAAAGACCACTCATCCTTTTACCTTTCAAAGTTTCCACAATGGGGTTTCATTGATATGGGTAAAGGTATTGACATGGACT
+CGACCATCATTCGTAATAAGTACTTTAGTGATTTAGAATACTTTTTAGACCCTTCACACTTACAACTTCCTTTGGCAGAA
+GGCACCCTCAACTTTTTGCACAACACTTATACCCGTGAAGAATACTTACATATCTACGAAGAAAATCAGTTCATTCAAAA
+GTACAAACAACACCCAATTTCAATTAAAAATAACCAAACTAAACCGTTTGAAAATTGAATAATTGATATTTAAACCATCA
+TTCAGTCATTAGGTTGAATTGAGAGAAGGAGGTTGGTGAAGCGGTGGCTGATATTAAATTACCCCCCC
+>generic321
+CCGGCCATCGCGGCGCCCACGGGCGCGTCGCCGGCGGCTTCACCCGCGGCGTCGCTCTCCGCCACCCGCTCCACCTTGCG
+CGTAAGCCCGACGGCGATGCGCGACTGCTGGTACTGGATCAGGTCGTTGGCGTCGCGCCAGGCCGCGGCCGCGGATTTGA
+TTCCGTCCGGGTCGTTGGGAAGCGCGTACTTCACGCTCATGGCCCGGTACTCGGCGTCGCCCAGCGAGCGGGCCAGGCCC
+AGCGGCACCACCACCACGTCCACCGGGCGGGCGATCTCCGGGCTCACCTCGCCCTCGCCCAGGTTGCTGTTGGGGTCGGG
+CACGGCCTCCTGCGGCGAGCCGGTCTGCGTCGCCTTGGTCAGGTAGGGCAGGATCGGCTGGTCGGCCAGGTCGCGCATGG
+CCGCGAACTCCTGCTGCTTGAGCAGGCCCACGACCTTGAGCCGCAACCCCGCGACATTGACCCACCGGCCCGCCAAAGTT
+CTCCGGCGTGATCCCCAGGTAGCCGGCCGCGTCTTCGCTCAGC
+>generic322
+GTACGCCAGAGCTGGCCGGCGGCCACGGCCAGGGACGCGGCGCGTGTCGCACCGGCCACTTCGTTCCAGCGCAGGTCGTT
+CTCCGACCACTCGAAGACCTTGCCGTCCGGGTCGACGATGACCACGTTGCCGAGCGCATCGGCCGCGATGTCGCGGGCGC
+TGCCCGGCACGCCGATCCACGCGCCGCCGAGGCGGCGGGCGATGCCGCCGTTGGCATTGACGGCCCATACCAGGCCGCGC
+GCATCGACTGCCACGCGCGTGCCCGAGCCGTTGAGGGCGGTCCAGGCCGATTTGGCCGGGTCGTATTGCGGCCAGCGTGC
+CGTTGTTGGTGGCCACCACGATGCTGCCGTCCGGCGCGCCCCCAGCGCGACGGCGCCCGCGCCCACTGCACGCCAGTTGC
+TTCCTTCAAGACGCTGCAGGGTGCCTTGCGTGTCGATTGCCCAG
+>generic323
+CTCGAATTTCTTGTCCGAGCTGGTGAACAGGTTCAGGACGATACCGCCGTCCTGGGTGCGGTAGTACACCTTCTGCGGCA
+GTTCGGCGACCGCGCGTCGGAAGTTGCCATTGCAGCAGAAGGTATCGCCGCTTTGAAAACTCCGCTTCCCGGTAAACGGC
+GTGAAGTAGCAAATATGGCGGCCGTCCGGGGACTGCGCCCCGAACAGGGCGTTGTAAATCGTCCGTTCCATAATATCCCC
+ATACCGCAGATCGCCTTCCAATCGCATGAGGCTGTCGATCCAGCGGAGAAAATAGGCCGTAACGCAGGATTCTTCGATGC
+TCCCCGAACCCTTTTGATTGTAGGTGAAATGCTCCCCTTCGGAGGTTGAACCGGTCACCAGCAGGCCGCCACGTCCCCGT
+TCGAGCAATTCCTGTTTCATCCACAGGCTCTTTTTGAGGTAATCCTCGCCGCCGAGCAAACGATACAGTTCCGTGTCGGG
+GTACATGTGCGACAGCATCACGTAGACGTGGTAGAATGATTTGGAGATG
+>generic324
+GTCCAACGCGGTGGCACAAAGAAGAAATTCAGGGTTGTGACGGCCAGCACCGCGGTGACTGCCGACTGCACCCAGTCGAG
+CTTGTAGGCAGCGATCACGATGGCCAGCAGGTAGATCATGGCCTGGCTGGTGAGCGACACATAGGGGTCCAACAGCGCAC
+CACCGGCAGTGGCAAACGCCAACAGCAGCGCCACCGCCAGCCAGCTGCGCAGTGAGTGATTGCCCGTGGTTTGAACCGGA
+GAAACGTTAACGTAACTGTCCATGACTTCAGCGTACCACCGTCGGTATCAGGATGGCATTAGGAATGTCGGACAATTTGC
+GCATTTGCACCTCTGCTGCCAGCGCCATGAACAATTCCGAGCCTCTTTCCAAGTCCCTGCCCTTGACCGGCTTGCGGGTG
+GTTGAATTCACGCACATGGTGATGGGCCCGACCTGCGGCATGGTGCTGGCCGACATGGGCGCCGAGGT
+>generic325
+GCGCGGGCCCGGACCACGCCACCCACGTCGGGTGAAACCACCACCAAGTTCTCGTAGCGCTTGCTTTGCAAGTCAGAAAG
+CAGCACCGGCGAGGCGTAGATGTTATCGACCGGGATGTCGAAAAAGCCTTGGATCTGATCTGCGTGCAAATCCATGGTCA
+GCACGCGGTTCACACCTGCGGCTTCGAGCATGTTGGCGACCACGCGAGCACTGATCGGTACCCGCGTTGAGCGCGGCCTG
+CGATCTTGGCGGGCGTAGCCGAAGTAGGGGATCACGGCGGTGATGCGGCGAGCCGAGGCGCGCTTCAAGGCATCCACCAT
+GAACAACAATTCCATCAAGTTGTCGTTCGTGGGCGCGCAGGTCGGCTGAATGACGAAGGCGTCGCGGGTACGAACGTTTT
+GCTGGATTTCGATGGTGACTTCACCATCTGAGAAGCGCCCAACGCTGGCTTGACCCATGTCAACGCGCAGTTCGGTGGCG
+ATTTCTTGGG
+>generic326
+GTTAAAGACACGGATGCGAGGCACGTCCTTCGCACCGATCTCGCCAAGCACCGCGTCGGTTACCGCAATCTGCCGTTCAA
+ACCCGGGACGTCGCTCGCGTCAATGACATGGAGAAGCAGCGACGCATCAAGCGCCTCTTCAAGCGTTGACTTGAACGATG
+CAACGAGCCCGTGCGGCAGGTTCTTGATAAAGCCGACCGTGTCGCTGACGAGCACGCGTGGCATGCACTCGGGTGGAGGG
+CGCGTACGGTAGTGTCGAGCGTAGCGAAGAGTTTGTCTTCGACCAGCACCTCGCTTCCCGTGAGTGCGCGCATCAAGGTG
+GATTTTCCCGAGTTCGTGTAGCCGACGAGCGTCGCGTTAGCGCGGCCCTCGCGCTCTTGCCGCCGCGAGCGCTGCGTCTT
+GCGCTCGACCTCCATCGCGGCTATTTCCTGCTGCAGTTCGGCAATACGGTCACGGATCTTGCGCCTGTCCATCTCACGA
+>generic327
+GTCGGCAACACCTTCGGGGAGTCGTTCAGCGGAACACTCTGGAAACTGGTGTACGCGGAAGGATGCGGGCAGACGCCGGA
+GGCGTGCGACGCGGCCAAGGAACAGGCCGCACCGCAGATCCGCTCCTTGCGGAATGCGCTCAACGCCAACCTGACGTTCA
+TGAAGAAGCATCCCGCGGCGAAGTGCTTCCTCGACGCCTACGCCGCCGACAGGGCCGTCGTGTCGGCCTACCTGTCGTGG
+CTCGCAAACTGGGAGCCGTGGGGAGTCGACACTCCGGACGGGAGGCAGAGCGTCTACGACCTGCAGGACGCGGACGCACG
+CCTGACAAGTTTCCTGGGACGGCAGACGAGGTACTTCGCGGACTGCAAACCCTAGGGCACTCAGCTTCGCCTGGTTCGCT
+TCTTCGGCTTCCTCGCCTTCGTCTTCTTGCCGCCGCTCCTGCCGGGTGCTGACGGCGATACCCAGACATAGCCGTCGTCC
+AGGGGCGGACCGAACATCGGGCTTTCGTCACGAGTGGTG
+>generic328
+CTGGGCCGGTTTTGTGCCGCTGTGGCGCGAGGTGGTCGCGCTGGCCCGCGAGGAAGCTCAGCACTTGGCCCAAGCCAGCG
+GTCTGTCGCCCTATGACGCGCTGCTGGATCGCTTTGAGCCTGGCATGCGCGCCGAGCGGGTTGAGGCGCTGTTTGCCGAT
+CTCAGAACGTGGTTGCCCGCGCTGATTCCCCGGGTGATGGCGCGCCAAGCCAGCGCTGGGCCGCTGCCGCCCCGGCCGCA
+TATGGCTCTTGGGGCACAGCGCCTGATGCATCGGGCGGTAATGGCGTGGTTAGGTTTTGAGGGCGCGCGCGGGCGGCTCG
+ACGAAAGCACCCATCCGTTCACCGGCGGCGTGCCCGAGGATGTGCGGCTCACCACCCGGTTGGACGAAGACCGGGTGCTG
+GAAGGCCTGCTGGCCACCATCCACGAAACCGGCCACGCCTGTTATGAACAGCACCTGCCGCGCGCTTGGCTGGGCCAGCC
+>generic329
+CTCAAGTCGGGGCGCGTCCGCGCGCTCGCGGTGACGAGCAAGCAGCGCACCCCGCTCGCGCCGGACATTCCCTCCGCCAC
+CGAGGCCGGACTCCCCGGACTGGGTGGCGTTCGGCTGGTTCGGACTGGCCGCTCCCGCCGGCACGCCGAGCGCCGTAATC
+GGCCGCTTGAACGCCGAGACCACCGCGATCCTGCGCCAGAGCGACGTTCGCGAACGGATCCTTGCGACCTACAACGAGCC
+ATCGCCGACTACACCGGAGGAATTCGGCGACTTCATTCGCGCCGAGATCGCGAACTGGTCGAAGGTGATCAGGGAGGCCG
+GGGTGCAAATCGAGCAGTGAGGCATAACGCGGTATTATTGCCACGATGCCCCGTCCGGCGCGCCGAGTGCGCGCGGAAGT
+GATCGAGGCTGGCCTTGTCGAATAATGAGATAGTGTCACCATGAATGAACCGCGACCGATTTCCCCTCGACAACGCCTGC
+AAGCGCTGCTGGCGGTCCCGGACAGA
+>generic330
+ATGCGTCGGGCGTTGCCACGCTTAATTTTTGGTCACTGAATCAAGTCAGCACGGTCGCTTTGAAATCGCTACTGACTGAC
+ATAACCATCGCGCCCGTTGATATGGTGACATTCAGAACGCCAGCCGCGCCGATTAAACAAGGTTCGTTTCAAATTCGTGC
+AACCACGCTGGAAGGCAATGCCATCAATGCCACGGCTGATATGGACGGCGTTCTCAATACTGCTTCAATAACAGGTTCAA
+TCAATTACGACACAGGCGTTGCTAAAATCCGTTTTGGTGCGTGGATTGACGCAGCGGGACATGAATCCGAAAGTTGGTTA
+ATCCTGAAGCTGTGATGCAAACCAATGCCACGCCGCCTGTTGCTAAAGTTTTCAAACCTGCACACGTTTTAGCTGAATCA
+ATTGTCTACAACGCGGTGTCGTACACCTACATTCCACTCTCAAGTTCAATTTTAGGACTTGACCCAGTGCGCTTGCCGCC
+CGACGGACGTGTGCCGATTTA
+>generic331
+GTTGAAGGTCCAGACCCCGGGCATCCACGTTTTGCTGCGGATCACGATGGGCGAGAGCACCGAGCCATAGCCCTGTACGT
+TGATGTGTGCGCCGCGCTCCAGCAAGGGCAGAAAGCGCTGGTTGATCTCATTGACCGTGGCTTGGGCGTCACTGGCCGTG
+TTGGCACTGCGCGCCGTATCCACCTTGAGTTTCATGGCATCGACTTCTTGCTGAAGGTTGTCGAGCGCACCCATTTCAGC
+GCGCAAGCCCAAGTCCATCAAACCGAAGCGCACGGTGCTGTTGGTATCGATCAAGCGCTCGGCGTTGGCCGGGTTGAACA
+CGGCCGAGCCGAGGTTGGAGCGGTTGAAGCCGGGGCCGACCGTTATGCTGTAGCCCGGGCTGGCGAGGGACTGATTGGCG
+CTGGCCGCTTGTGCAAGCAGCAAGAGGACGGGCACCAACGGTGCAAAAGGCCCAGACGAGTGGTGT
+>generic332
+CGCCAGCGCCAGCCGGGCAGCGCAGGGTTCATCAATGCCGTGCTGCGCCGCTTCCTGCGCGAACGTCACCTCTTGGTTGA
+ACAACTCCAAGCCACGGACCCGGTGGCGCGCTACCAACATCCCAAGTGGTGGATCGACAAGGTGCGTCAAGACTGGCCTG
+AGCAAGCTTCGGCGCTGCTCGAAGCCGCCAACGTGCAGCCACCCATGACGCTGCGCGTCAATGCCCGCCACAGCAACGCC
+CTTCGCTACGCTGAAGCGCTGGCCCAAGTGGGTATCGACGCCAAGGTGCTGGGCTCGCACGCCTTGGTGTTGGCGCAGGC
+CGTGGCCGTGCATCGCCTGCCGGGCTTCGAGCAGGGTCATGTCTCGGTGCAAGACGAGTCCGCCCAACTCGCTGCCCCTT
+TACTGCTTGGGGAAGGGGCCGGATGCCCTGCCCGCCAAGTCGCGGGTGCTAGACGCTTGCGCCGCGCCCGGGGGCAAAAC
+TGCCCAC
+>generic333
+CCGAGCGTCTTGGGTCTGCCGGAAGCGCCACCCGCGCGAGCCGTCGATGCAGCCAAGAGTCCTGTCACCGGTCCCGCCGC
+TGGCGCAGCCGCCACCGTGGCCTGGGTTTCCGCACCCGGGGCCGGCGCATCGGGCGCGGGGCTGCGGGTGAACCCCGCGA
+CCTTTAGGCCCAGGTGAGGGTGGGCGGCGAGGCGGGCGGCAAATGCCCGCGCCTCAGCCCCGTCGCCGATGATGAGGATG
+AAGGATGCGTTGAAACCGGTCGTCCGGACGGCGATATACAGCCGGCGAACGAGGAGGCGCGAGGCCACCGTGACGATTGC
+CTGCGCGGCGAAGAGTTCACCCAGGAACACACGGCTGACGTTTGGGAGCTTGGCGATGAACAGGATCGCGAAGGTCAGCA
+CGGCGAGCAGCAGCACGCCGCGCAGGATGTCCAGCCACTCCCGACGCCACGACCAGCGGACCCGAAGCCGGTAGAGGCCG
+AGCAGCCACAGCGTCGCCACGAGCGAT
+>generic334
+GGCCTCTGGCCGTTTGTGCGCACCTTGGTAGCCCGCGTCAGCAAAGGCATCGGTTTCTTCACCGTGCAGCAGCTTGTGCG
+CCAGGGTCACGTCATTGACGTTGGCCGCCGTGCCTTCGACGCTGTGCACCAAGCCAGAGTCGGCGTCCACACCGATGTGC
+GCCTTCATGCCGAAGTACCACTGGTTGCCCTTCTTGGTCTGATGCATCTCAGGATCACGTTTGCCTTCGACGTTCTTGGT
+CGAACTCGGTGCCGAGATCAGCGTGGCATCCACCGCCGTGCCCGACTTCAGCAGCAGCCCTTTGTAGGCCAGCAGGTCGT
+TGACCATGCGCAGCATGTCGGTGGCCAGGTCGTGCTTCTCCAGCAGATGCCGGAAACGAAGAATCGTGCTCTCGTCAGGC
+AAGACGAGTGGTGT
+>generic335
+GCCGTATTTCGACGCCTTGCGTAGCGACTACCGCTTGCGCCATCTGCCTGACGTGCAGCGCAGCCCGGAGGGCCGCATAG
+AGAACTTGGCGTTGTTTTTGCACGAAGCGGCCCACGAGTACGTGCCCGATTTGGTGCTTGCGAGCGGTGAGTTGCTGATT
+TATCAACGTCGCCTGCGCTTGGATCCACCCTTGGCGCGGCCCCTGACCGAGCCCCCGTTGAGTTTCTGCCGCCGGATGCC
+ATGCGCGCTAGCGGCCAGAACGCGCGCTATCACACGCTCTACGTCGCCCAAGCGCAGCCTGATCGGCGACCGTTTGTGGT
+GCTGCTCAACGAGCTGGACGCCTACACCCTCGACTTCGCCTACGAGCTCAGCAGTTTTGAAGTCCTGCGCCGGGGCGCGC
+TGCTCAGCACCGAAGTGACCACGGGGTTNCCGTATTTCTTCCATGCCATCGCCCGCTACCTTGATCAGGCCGAGCATGC
+>generic336
+TTCGCGCTTTATCCTTGACTGCTCCACTTTCCTATTGTTAAATGAGAAACCTGCAACAGGATCGTGCATCTGATCCAGCC
+TTGCTATACCAAAACAGTGGACGCAGCGCGCTCTCAACCGAAGATCGGGTATGGCCATGCTACACAACTTTCTCGACATA
+CTCCCCACGCTCCATTTCAGGCAGATGCGACCATTCCTGATCTCCCTCTGCGTCATTATCACCCTTCTGTTTTCCTCTGT
+TTTCATCTATATCGACAAGAGCACCTCCAAGCTTATGCTGCAGCGGGTTCGCGAACAGGCGATAACCTACATCGATCTGA
+TCAATCATGCTAAAACGTGGAATTTCAACTATGGCGGCGTTATGTCGAGAAGAAGGGCAGCGTTCAGTCCAATAAATACC
+TGATGAAACTCGGCATGAATCCCGATGTAACCTGCGGAGATGGGCGGG
+>generic337
+GTTTGCTCGGTAATCGGCATTTCAATATTGTATTTTTGTGCCAGCAGATATGTTTCGCGGGCGGCTGAAATGCCTTCAAT
+TTCCTGTCCGATTTCCTGTGTTGCCTGATGCCGGTTTTTGCCTTGCCCTAAAGCCAAACCCAATCGCCGGTTACGCGATT
+GATTGTCGGTACAGGTTAAAATCAAATCGCCCAATCCTGCCAACCCCATAAAAGTTTCCTGCTTGCCGCCCAATTGCGTT
+CCCAGCCGGATAATTTCGGTCAATCCGCGCGTGATTAAAGCCGCACGGGTATTGGCGCCAAATCCCAAACCATCGGCAAT
+TCCGGCAGCAATCGCCAGTACGTTTTTTATTGCCCCGCCCACTTGTACGCCAATCATATCGGTGCTGGTTATAACTGCGA
+AAACGTGAGCCGCTGAACGCTCCGGCAAGTTGGTTGGCAAAGGGCAAGGTCCGTGGCGGCAATGGTCATTGCAGTAGGCA
+AATTGGCTGCTA
+>generic338
+CGCTCGGTCAGCCCTCACCGACGCTCTCAGGCGGCGAAGCGCAACGCATCAAGCTCGTCACCGAACTGAGCAAGGTGCGC
+GACGACGTGACACGCCGGGGCCAGAAAGCACCGCACACGCTTTACGTGCTCGATGAACCCACCGTGGGCCTGCACATGGC
+CGACGTTGAAAAGCTCATCCGCGTGCTGCACCGCTTGGTCGATGGCGGTCACAGCGTGGTGGTGATCGAACACGATCTCG
+ACGTCATCGCCGAAGCCGACTGGATCATCGACCTCGGCCCCGACGGCGGCTCCGGCGGCGGCCGCGTGGTCGTGGCCGGC
+ACCCCCGAAGCCGTGGTCAAAAAGAAAGCCCAACGGGAGTGGCGTTGAAGGCGGTGCTGGAGCGCTGAGATTCAGCGCCT
+TTTCAACCTCCGCCGCATCCAGAGCAAGAAGAGCTGCGGCTATTTATCTTTGAGATAATTCAGGCCGGCAGGTTTCATGA
+TTTATTTCTTAGAAA
+>generic339
+CCGAGATGCGCGTCAAATCCATGGCTGCGGACTTCGAGCCCAAGGTGTTAGCCTCGCGGTGCAGTTCTTGGATCAGGAAG
+TCAAGTCGCTTGCCAACCTCGCCGCCCACCCGCAAGAGTCGGTCGATTTCGTCAAGATGGACCTCCAGCCGCGACAGCTC
+TTCGGCGACATCGATGCGCAAGGCAAAGGCCGCTGCCTCAGCCATGGCCCGTTCGGCCAAAGTTGCTGCGAAGCCGGAGC
+CACGCTAGCTGCCCCAGCCGACTGCAAGGCCTGCGCCCAGCGCTCCAAGAAACGTTCCTGCTGACGTGCCACCACCTGCG
+GCAACAGCGGTGCAGCCTCACGGGTCAAGGGTACGCAGCTTGGTCACACAGACCTGCAAAAACCTCTGCCAACCGAACGC
+G
+>generic340
+GAAATCATGCGCGCTGAAGATGTCGGCTGGAGCGCCAACAAGATCGTGTTAGGCAAGCTGTCGGGCCGCAACGCTTTCAA
+GCAGCGTTTGCAGGATCTGGGTATCGAGATGAGCTCGGAAGCCGAAATCAACACGACCTTCATGAAGTTCAAGGACTTAG
+CCGATCGCAAGAGCGAGATCTTTGACGAGGATATTTGGCCTTGGTGAACGACGATGGTGCGCGCAGCGACGACGAGCATT
+TCAGACTGCTTGCCTTGTCCCAGAGCTCCGAGATGGGTGAGCGGCCCAAGCCAAGGTGGTTTTTGCCGCTGGGGACGGAA
+GAGCATCACTCTGAATCCGAAGGCAATGGCGTCGATGCCAGCATCAAGGCCATTGAGAGCAAGGTGCGCAGCGGTGCTGA
+ATTGCTGCTTTATTCGG
+>generic341
+CACGGCAGCCCTCGGGTGGGCGGCGGTATTGTCGGCGATCCCGCCTGACGCACCGCGATTACGCTCAGTCGGTCGACGTT
+TGTTCACCGGCCATCTGCAAGATGGGTCGATGGATCTGGACTGGATCGCCTTGGCGCGGCCGCGTCAAACGGTGGTGATC
+TACATGGGCCTGCTGGGCTTGCCGGTGCTGTGCGAGCAGCTCATCGCCCACGGCCGCTCAGCCCAGACGCCCGCAGCGGT
+GATCCAGCAAGGCACGACA
+>generic342
+TGTGCCTATATCCATCCCCGTCCGCATCCCCGCTGCAAACGCTTCTTCAAACACCGAGTAACCCGCCAAGTCGGCGTGCG
+CCAAGTGGATCCGACCCGTTCGACCCGCCAAATGGGGCAGGGCTTGATGGGCGGCGGCGCTGCGGGTGCCGGGCAGGGGG
+ATGCGCATGGCGTGGCCGTAGCGCATCAGGTCGATGCGTTGCAGTTTGGCGGGCAAATCAGGATGCAAGGGGCTCAAGTC
+GCGGATCACCCGCTGCGCCCAGAAGGACCAGTCGGCATGGAGCAAGGCGGCGCGCTCGGTTTGGTTCAAGGCGACGTAGC
+TGGTCAGCACCGTGGCCCGCGTGGGTTGAGGCGCTGATGGCCCGCATCGACATAGCCCAGCGAGGTTGAACCGTAGGCAA
+CGTTGTCCCACGCT
+>generic343
+GGACGAACCCTCGCCCCGGATCACGGGCCGGTGCTGGATCTGCAATGGGCGGGCGCAAGCAGAATGGGATTTCACCTTGC
+TGCTACCCCGGCCGTTTGCGTTGCGCGAGGAGATTGACTGGGCCTCGCTTCTTCCGCCCTCGAAGGTGACCCGCTGGATA
+GCTTTCGATGAGCGCCGGCGATACCTGGAGATCGAGCCGGCGGTCGCGGTCCCGGACCTGGAAGCCGGGTAAAACGGCAT
+AGCTGAATCGTCCAAGCCGAACAATCGGCTGAAGCTGACCGGGGCCGCATTTCGGCGTTTCGTGGTTTTTAGGTTTCCGA
+GCGGCCCCGGCAGCTTAGCCTGGGCGTTCGCCGGCGGAGATTCCTGATGCCCAAAAAAGCACTGCTGATTCCTCCGGCTG
+CACTGGCAGACGACAAGGCGCGTGAACTGATTCGTGTATGGGTGGCTTCCCGGCAAACAACACATATCGTTGGTAACCGG
+ACGAGTGGTGT
+>generic344
+GTAGTAATAATCATCAAGAAGAATAGTTCTAACCTGATTTGAGAAAAATTCTTAATAATAAAATAATTAATAGTTTTAAG
+AATATATAGATGATTCTATAGAAATTAAATAAATTTAAAGAAATATAAACTATAACAGGCAAAAGAAGAGAATGATAGGT
+TATAATAAAAATGATATATTAAGATGATTAAGAATTTAAAAAGTAATTTATTAATAGGAAAGAAATAATATGGCTAATTA
+AACAAAATAATAAGATGATTTATAATAGAAAAATATAATTAGGAATTTCTATTATGAAAGAAGAACATAGAAGGAAAGAT
+AATAAACATATTAATAGAAAATAGTTATTAGGAGAAATAATGCAACAATATGACAGAATCAAAAGAATTTAAGTTTTGTA
+ATCAGAAGAATTAGAAGAAAATATAAATTAATATAAATATACTTAAGTAAAAATAAAAAGAAACAAGATTTAATCAAGAT
+TCTTCTGATCGTTAAGCTTCTTTGATGAAATATATAGAAAAACTCAAAAAATAGACGAGT
+>generic345
+TGCTTAACCTGGGTGAAATTTTGTTGCTGTGCTTGTGTTTCTACTATTTCTAACACGCTTTCCAACAGAGAGATTTCATG
+CACGGCACAGTTCCTGCCACACTTCTAAACTTGGATTTTCTAACAATTGACTTACAAAATCGGATGCTTGTTTTAAACTG
+ATTTCGGCTGTGCGGCTTAAACCCGAACCGAGTTCAAATTCAATGCCCTGCAAGGTCAATAAAAACACGGCGGCGGCGTA
+GCTTTCAAAGTCTCTTGATAAACCTGCATGACCGCCGCAGGATTCATGGCGTGAGAGGTGTAGCTATTATCATACGCAGA
+TTGCAATTGGCTAAATTCCACCGGTTGTTGATTAGCAATTGAGGCATCAGCAAATAAAACCAATTCACGGTTTGCAAGTC
+CAACGCATGTTCAATCTGCAATTGAAAGTCGGTCAAACATTCGACTTTTTCCAATAACGCGGTAGGTAAGTTCTGCACAT
+ATTCCACGAGTGGTGT
+>generic346
+GTTGGGGGCGGAGCAACTTGCAGCCATACATGAACCTCAATTTCGATCCGAATGAGGCCTACACCTTGGGGGCAGGTATG
+CGCAGCAAAGCATCATCCTTGGCCCTGTTCATGGTGAAGGATGACCGGCTGCATACCGATCAAATCATCCACCACTTGGT
+CTGGCGCTATACCCCCGAAGAAGGCCGACGTTGGACAGTCGATCTTTCCAGCAAACGAGGCCGGCCCACTGAAAATGACC
+CCAGCCTGAGCGGCACCGGCGTGGCACTCACCTACGACCACCACGCCTTTTTTGTACGCTTGGCGCAGGAGCAAAAGGTC
+AATTTCACGCCCGATGAGCAGACCCGTATTGCCCTGGGGATACGCTTTTGACCGGGGTCGAGGCAAAGATGTGGACATCC
+ACAATCGACACCCCTGATCCGAGCCGTTACGGTCACGCCCATACGTGTCAACCGCCCACTGGATACCTCGCACCATGAAA
+CGCCTCACGGGTCACCTCTACTTCTGGGTTCTCC
+>generic347
+ATCATCCGTTCGTTATCCCGACATTGGTTGATACGCTTTCAGCAACCAGAGCGGACGGGCATACTATTTTATATGTGTTA
+AAAAACTGGGGAAGGAGATGGAGCATGCGTCGTCTGTCATCTCTACAGATGGCAAGACTCTGACCAGCACTAGAAGAAGA
+ATCAACGAAAAAGGAGAGGAACTCACAACTATTGCCATTTACGACAAGCAATAGCCCCAGGCCTGCACGGCATCACATCC
+AAATCTAAGGG
+>generic348
+ATGAACTGCAGGTACAGCAGATCGAGCTGGAGATGCAGAACGCGGAGCTGCGCCAGTCCCGTGCCGAGACCGAGGCGGCA
+CTCAGCCGCTACACCGAACTTTACGACTTTGCACCGGTCGGCTATCTCACCCTGAAGTCCGACGGACTGATCCAGCAGAT
+CAACCTGACCGGTGCCAAGCTGCTTGGGCTTGAGCGCCGCAATCTGGTGAAGCAGCGCTTGAGCGATTTCATTGTTGCCA
+AGGATCAGGAGCACTGGGTCCGCTTCCTCGCAAACGTCATGAGCCACGCCGGGCACGAGAGTGTGGAACTGCTGCTGCAA
+CGCCCCGAGGCATGGTTTTTTCNGCACAGCTGGACTGCGTCCGCCACAGAGCCGGCACTGACGACACGCTGGAGGAAAAG
+GCTCCTGGGCTTACCGTGGCGTCCACTGCGGTCGCCGTCATGGAGGTAAGCATCGCCCTGACCGA
+>generic349
+GCCGCCGGTAATGAAATCGCCCGTTCCGGTGATACTGGAAGCCGGGCCCGAGCCGAAGTTTCCCAGCAGGAGGGTCGTGG
+CGGCGGCCAGGTGCATGTCGCCGCCGTTATAGCCGCCGGTGTTGAAATAGAGCGCTCCCGTCTGGAGGTCCACCGTTCCA
+TAATTGTTGAATAGGAACGCGTATGAGGTCCCAAACGCGGTGCCACCGGGGTTGACGGATTTGCGGAAGGTGCCGGCGTT
+ATCGAAGCGCGGAACCGTTCCCGGCGAGCCCAGGAAGCTGGCGGAGTTCAGGACGTTGAACAGCGCACCCGGGCGGTTGG
+TGATGACCGCCCCGGCCGACCCAAAGATACTTGCTGTGCCGGCCCAATTTACCGTTCCCGCATTTTCAAGACGAGTGGTG
+T
+>generic350
+GTGAAGGATCATGGCGGTGAAATAGAGGTGACAAGCCAGCCAGGGTGTGGCGCTCTGTTTGTGGTGACTCTGCCATTGGC
+AGGGCTTTGAAAAACTACTGCGGAGACCGCCTGCTGCGTTACGCGGTACTCTCAACCTCGGCTAACTAACTGTTATGCCT
+CGGCTGCTCCGTTCCGTGCGCCTTGCATCCGGTCTTACCTCGTGACGTTTTTCAAAGCCCTGTTAGCGATTTGATTCAAC
+AGTGGAATTAGTTGTTTCACCTCTTCTTGCTTCATGTTGATTTACATGGTATTTAGGATAAGTCATTGTTTAGTAATAAT
+TCAAAAACAGGGGGGTTCAGATGGAAAAGCAGATGGTTCACTATAGCGAGCTTGGATTGTCCAANACCAAAGATAATGTT
+TGCCAAAGGCAAATGGCGGGAAAATATAGCGATTCC
+>generic351
+GCTGGGCCTGGCGCGCTATCGCGGGGCCAACGTGCCGCTGTTCGCGGGACAGTACTCGCTGCGCTCCGTGGTGGAGGAGA
+ACAAGGTCGGACAGAAGTACTACGTGTACCAGTTCGAAAACTCGGGCTGGGCCGCGGAGGACCTGTACCCCGGGCTCAAG
+GCCCTGTACCAGACCATCGCGAAGGCGCACTCCATCACCACCAATCTCGGGGACCAGGACGAGGACACCCCAGCCGCCGG
+GGAGAAGGAATTTTAGTGTCCTGCGTGATCGGCAAGTGTGACAACCCGGGGCGCCGGTGGCGCAACTGTCCCTCCTGCGT
+ACACTGGCAGCCGAGCCGCACCAGTCGCTATCGGCGCTGCGGGTTGTACATGAGCACGCGAACGCTGTGCAACGAGCCTA
+AAGAGGCGTGCAGCATCTGTGCTCATCATATTAAGGGCATTAAATAATAGGTGGTGTTCTGGTGTATGTTTGGATAATGG
+TATATGGGGTATTTGGAATAGTAGTATAA
+>generic352
+GTTGTCGCTAGCCGCCACGGCGGCTCGGCCGAGGAGCGCGGTCGTGATTCGAGTCGAGGGTGCCGGCGCACTGAGGCGGG
+TACCCACATCGCCCTGCACCCTCTCCCGAGTCGCCGCGTGATGCGCTGTCCTAGCGCCTACTGCGGTGTTGAATGTCCAG
+TCAACGCATCGCCGGTATGTGTCATCAGGGAGTTTGTCGCAACACCGTGTTGGAAGCAAGATTCGATGTTTCATTGGCGA
+ATCAAAAGGAAAATAGGCCCTTTAGTAATAATTGACCGCGCCCGTGGCCAAACTGTCGGCTGCCCGCAACACCCTTGAAC
+GTGCATTCAGCGCGAGTCACGATCCCGGCCCCGGCTGGATTCCGATGCTGCGGTGCGGCATCACTGGCGACGATCCTGGC
+GTGCCCGATTGCAACGGCCTCGCCGTTACGTACATTTTCTTCGACGGCGGCGGTGACACGCCGCTATGATCGCCGCTTCG
+CGTGAAGACATGTCC
+>generic353
+GGCGTTCAGTACATCGAGCTCGCTGACCAACGCGGGCAAGCGCAGCAGCGCCCGGGTGCCCAAGGCGGCCAGCCCAGCGG
+CGAGGCCGAGTCCACCGATGCTGGGCTCTATCAAGGTCGCCAGCAGCACCAGCGCGCCCACCCAAGGCCGCCGCGCCATG
+AAGGGCGCGCCATAGGCGACCAGAAGTTCAGGCATGGTGGGCAGGGCCAAGGGCGTAGATGCACGTTCAGTCTCCCAATG
+AACCGATGTTGCGCAGGTGCTCGGGCAACTGGTCGTGGGCACACATCGTGTCCAGATCCTCGGCGCGGCGGATCACGCTG
+ACGCTGCGATCTGTGTGGATCATCACCACCGCTGGGCGGTATTCGATGAACTGCATCCACTGGGTGTTGGTTGTAGGCCC
+CGACTGGCGAGATGACCAGCTGATCGCCGGGTTCGAGCGGCGGCAACTGCACGCTGTTGC
+>generic354
+CACGATTCGGGCGTGGTGGTTTCGTCGCCATACGCCCCTGTGGGGAGCATGTAGAGCGCTGGGAACACGGGCCAGAACCA
+TGGGCCGTAGTGCCAGCGACCGACCGGGTTCCAGCTGTTGAGCTGACCGGGGTCTTGAACGGTTTCGTAAACGTGGGGGA
+ACCAGAAACTGCCGTAGTCACCCCAAGCCGTGGTGCTCCAACGGGCATCTTGCAGGGCGATGTCCTTGGGCACAAAGCAC
+TTGTCTTGCACCACCAAGGGCAGGGTGTCGGTGAGGGCCGGAATCACGCCGCTGCTGATCAGGCGCTGCTCTTCGGTGTC
+GGTCAGCAAGTAGGGTGCGGCCATGCCTGAGTAGGCATTGAGCCGGGTGATACCGACCGCGTGGTCGTGGTACCACATCA
+TGCGGGCGCTTTGCCCATTGGTGTAGTAGAGCGTCATGGCCCCCGGACCGGGTCGTGCATGTCGGGCACGTTGGTGGCGC
+T
+>generic355
+ACCGTGTCCGGTGAAGGGCATGGCGGCCATGGCGATGGCGCCGAGGGCTAGCGAGATCAAAGCCCGGCGGCGGACGGCGG
+GGTATTCGTCGGGCGGCTCGATTGTGTTCGTTGCCGCTTCGGTGGCGTGGTACCCGGCGTCTTCGATAGCGGCTTTGAGT
+TGGGTTGCGTTTGTCTTGGCGGGGTCGAAGGTGACGCGGGCTTCGTTGGCGAGGAGGTTGACTTGTGCCGTGCTGACGCC
+GGGGTGCGGTGAGGGCGCGTTCGACATGGCCTACGCAGGCGGCGCAGGTCATGCCTTGGACGTTGAGGGTGAGGGCGGTT
+GAACGGCGCGGGTTTGGGGCTGGCCGGCAGGAGTTGCACGAGCGGGACGGCGGCCGGTTTTCCTACCTCGTAGCCAGCCT
+CCTCGATGGCGGCGGTGAACGCGGCT
+>generic356
+GGCGATCAGATCAAGTCCCGGGTTGAGTCCTCTGGCGCGCGCGCCATGCTCAATCTGCGTGGGCTGCGTCCCGGCCAAGA
+TTGGTACGAAGAAGAAGTCGCTGTGGCCAAGGCCATCGGTATCACACATCTCGACTACGGTATCTCGGCCAATGCACCCG
+TAACACTCGCGCAGATGAAAGAGATTCTTGTGCTGATCGAGCAAGCGCCCAAACCGCTGCTGATTCACTGCGAAGCGGGG
+GCCGATCGAACGGGGCTGGTCGTGGCGCTTTATTTGCTCACGCACGGTGACAGCGAAGCGCATGCCCGAGAGGCCTTGGC
+GTTGCGTTTCGGCCATTTCCCCTACCTGATGTGGGCCAGTACCCACAGCATGGATGACAGCCTCGATCTTTTCGTGGCTG
+ATTTCAATGCGCAGCGTCACGTGCCCTGACGGCCATTGCCCGTGACCGCCGGCGGGGTGGGGGTCGGTTCAATCACT
+>generic357
+CGCGTATTTTGATTTGGTATTAGTCACAGGTGATTTGGCTCAAATTCCTTGTCAGGCAAGCTACCAGCGCATTTTAAATC
+GTCTCGAAGCGTATTACACCCCGTGTGTTTGCTTGCCGGGTAATCATGATGATTTTGCACTCATGCAACGACTGTTAAAT
+ACGGACAATGTCAGTTGTCGCAAACAAACGCTACTGGGAAATTGGCAGATTATTTGTTTAAACAGCCAGATAGTGGGATC
+AGCAGGCGGGCGGTTGGCGAAGGATGAATTAGACTTGCTAGAACAGTGTTTAAACAATTATCCGACGCATCACACGCTGA
+TTGCCGTGCATCATCATTGTCTGCCTACAGACAGCGCGTGGATGGATACCATGACCATCGAAAATCATGATGAATTCCNC
+GCTATTATCCAACAACACCCGCAAGTACAAGTGATTACCACAGGGCATATCCATCAACTGATGGACAGTTACT
+>generic358
+GCCAAATCCCGATTCATAGATCGTCTTCTCAAAGCCAATAAAAGCTGTCAGCAGGATCAATGAGTTCTCATTCCTAGGAG
+CAGATGGAAAGATCCATGTCATTTACCAAGCGAAAATCGACGCATCAGAGTCCGAAGCACTGGAATTTAAGAATTTTGAT
+TTCAGAAATATCAATGAAAACACACGCAAACTTGAGGAAGTCATCACAGGAATGTTGAATCGAGAAGACTATAGTGAGGA
+AGGATCGAAAGGGAATACTGAGAAATTGAATGGTAGAATATTTTAGGAATAAAAGACAGCACTCGATAATTCGTTGGATG
+TAATACATAGAGCAATTACCATGAGACTTTCTTTCGTTCTTATCAAAGCGGCTTCGAGACTGTACTCCCCCAGTGGGTCC
+AAATCTGTTTCTCGAGAGGAGTATCGTCTAGTGATTCCGAGTGAAAATGAAAATATA
+>generic359
+ATCAAAAGGCGGTGCAGTACGCCCGGGATCGCATCCAGTCTCGGCCGGTTGATGGCTCGTTGCCGGCCGCTGGCCCGATC
+CTGCACCACCCCGATGTGCGCCGCATGCTCATGACCATGCGCGCTTACACCGAGGGTTGTCGCTCGCTGGCGCTGGTGGC
+CGGTGCCGCTTATGACACCGCGCACCAGCATCCCGACGCCGAGACGCGCAAGGCCAGCCAAGCCTTTTACGAATTCATGG
+TGCCGCTGATCAAGGGCTACAGCACCGAGATGAGCTTGGAGGTGACGTCCTTGGGCGTGCAAGTTCACGGCGGGATGGGT
+TTCATCGAGGAAACCGGCGCGGCGCAGTACTACCGCGACGCCAAGATCCTGACCATCTATGAAGGCACCACCGCCATCCA
+AGCCAACGATCTTGTCGGCCGCAAGACGGCGCGCGACGGTGGCCAAACGGCCCGNACCATCGCCGCGCAAATCGAGCTGA
+CC
+>generic360
+CGAGTGCATCGACGAAATTGCTGACGCAGTGGGCCGCAAGGCGGAAGTGGCCGAGATCACCGAAGCGACCATGCGCGGCG
+AGATCACCAACTTCAAAGACAGCCTGCGCCGCCGTGTGGCCCTGCTGGCGGGTGTGCCCGAAGCGGCGCTGGAAGCGGTC
+TACGCCGAGCGCTTGCAGCTCAACCCCGGTGCCGAAACCTTAGATCCGCACCTGCCAAGCAGCGGGCTTGAAAACGACTC
+TTGGTCTCGGCGGCTTCACCTTTTCTACCGACCGGCTCTGCGAGCGGCGTCGGGCGTGGACGTTCTAGCCGCCAGCAATA
+CAGCTTGAGGTGATCGGTGGCGTGCTCACCGGGCGGCGTGCTGGAGCAAAGCTGGGGCGGACATCTGCGACGGCGAAGAA
+AACGGACGCATGGTGCAGCTCACC
+>generic361
+GGAATGGTGGGTTCGGTGGCTGCGCCGATGAGGGTGGTCAGCGCTGCGAGAAGCCACAACCCCACGGGGTCGCCGAAATA
+CGGGCGCAGACGCGCCAATCGACGGCGAAACGTGGGGCGGCATCGGGTTTAGAGGGCATCGTCAGTTGGAACGGGTTCTG
+GCGGTCGCGTTTGGGGGTAATTGTGCTATTAGGGTTTCAATCGGGCCAACCCTCCCTAGCGCCATCAGCAGACCCAACAT
+CAGGCAAAAATAGTCTCCGATCTCCCCATCGTACAGCACACTGTTGAACAGACCCGTGACGAGCAGCATCAAGATGATGG
+ACTTCATGGCTCGCGCGCACGCCGGGCTTAAGGAATTCACGAGTGGTGT
+>generic362
+TCCAGAACAAGTTAAAATCGAATTTCTGTCATTGTCGCCAGTTGACTTTATGCGCACCATCAAAGTTAGATGATGCGGAA
+GTAAAGAAGTTTTATGATGAAAACTACAGCTAAATTACCAAGGTAATGAGCAAAGAACGTGCCAGCCATATTTTGTATTG
+GTTTTGGTCGTAAATAGCGACACCAGAACAAAAGGGACAACAAGCCAAAGACTAAAGACCGAAGAGCTTTTGGTCTGCGA
+TCAAGAAAAATACCAAAATACATTTGTAGGCTTTAGCTACTAAAACTACACAAGACCCAGGCTCTGCTGCTAAAGGCGGT
+GATTTAGGCAGCTTTGGTCGCGGTGCAATGGTGAAACCGTTTGAAGAGGCTGCTTTCAGTATGAAAGTAAATCAAATAAG
+TGACTTGGTTGAATCTGAATTTGGTTACCACATTATTAAAGTCACAGAAATTTCAGGGGCCAGCACTGATTACAATACTT
+TGAAGCCGCAAATCAAAGGCGACTTAATGTTCCAAAAGGCGCAAGAGGAATTTACCAAGC
+>generic363
+GGGTGGTTTACGGCATGAGCGAGGCGCGCTTGCTGCAACTCACCGGCAACCACGCCGAGAACCCGACGCTTGATCTGCCT
+TGCCGCGAGGTGTTTGCGCGCGGCCAAAAGGCCATCGAGGTGATCGGCCCGGTGGCGGCGATGGAAGAGGAGATCGCGGC
+GCTGCATGTTGATTTCTGGCGAAAGCACCAACCTCACTGCAAATCCGTGCGGCGGTAAGACCCGACGCCGCCCATGCTGG
+ACGTTGCAGTTTCTGAGACAGCTCGTGGGGGCGGTGCTCCAAAGTCAACCGCTACACTTGCCCGGCATGAAAACGACCCT
+CCGACTGTTCGGCGCGGTGTTGATCACCGCCATCGTCGTCGGTGCAGCTTTTGTCCATCAATGCGCTACGCAACAAAGAC
+ATTGAGGACTGGCGCCGCAACCTGCGAGGCATGACTTTCATCCTCTCGGAGCACACAGGTCAGACGGTG
+>generic364
+TAAAAAGAGGTGCCAAAAGGAAGAGAGAGGAGTGTGTGATTAAAAAGGGTTCCAATAAATTTTGGAGTAGAACGCGAGAG
+AGATAGTGTCTTGATGTGAGAGAGACAGTCGTCGTCGCCGTGGGCGAGCAGAGGTGTGCGATTGACCGAACGTTGCGCGA
+GATGATTAAGAACAGTGAGGGCGTGTGGGAGAGAGTGAAACTTTCCATAGAGATTTAAATTTCCCAAGGGATTTAATAAT
+TCTGCAGGACAGAAAACTCTGAAATTCCCAACAGCGGAGATCTGCG
+>generic365
+GTAAGAAGAACAGAGGAGGACATGGCTCGGAGACAGCGATAATCGCGCCAAAACGGCGCGCCATTTGCCACCTCGGCATA
+TGGATCGGGGCTTTGGGCCCGCGTCTTTGCCCTGATGGAAACGCTATGAACGAACCTGCCGTCACCGCTGCGGCCCTTGT
+CGAGTTGCACGACACGCTGCTTAGCCAACACACGTGGCCTCAAGCCGAACCCAGCCCAGCGCTGGCCCCGGACAACGTCT
+GGCACTGGATCAGCGCCAACCATCGCTTCAACAGCCTGCTGTGGGCGGAAGAAGATCTGGCGCGACGCACGCGGGTCAGC
+GACAGCGATATCGCCGCAAACAAGCGCGCCATCGACGGCTTCAACCAAGCCCGCAACGACGCCACCGAGCGCGTCGATGA
+GTTGCTACTGATCGAGTTGGGTTGGTCGATGCGGCCTCGGCACGCACCGATGCGCCGGTTTCTCAAGCCGCCGCGACCGC
+TC
+>generic366
+CCGGCTGCAAGACCGCGCCGGTTTGGGCCACGACGCCTTGCTGGCCGCGCGCAATCAGTTGCTCGGCATGGCCAGCCAAA
+GCAAGGTGCTGGCGGGGGTGCGACCGGACGGTCTGGAAGACGCGCCACAGCTCAAGCTTGAGATCGACCGCGAACGCGCC
+GCTGCTTTGGGCGTGCCCTTTGACGCCATTGCCGGCACGCTGGCCACCGCCTTTGGCTCGACCTACGTCAACGACTTCCC
+CAACGCCGGGCGCATGCAGCGTGTGGTGGTGCAGGCCGAAGCGACGTTGCGCAGTCAGCCCGAGGATTGCTCAAGCTGCA
+CGTGCCCAACAACCGGGGCCAGCAAGTGCCGATCTCGGCCTTTGCCAGCACGCGCTGGATGAAGGGCCCGGTGCAGACCG
+TGCGCTACAACGGCTACTCGGCCATGAAAATCGCCGGCGACGCTGCCAAGGGTTTCAGCACCGGCGACGCGATGGCCGAA
+ATGGAACGC
+>generic367
+CACGCCCTTGCGCGCAAACATCAGGTGCGGGGCGTTGCTCATGCTCTCCATGCCGCCCGCGACCAGCACCTCGGCTGAAC
+CTGCTCGGAGCATGTCGTGCGCCAGCATCACGGCGCGCATGCCCGAGCCACACATCTTGTTGAGCGTCACCGCGCCGGCT
+GAAAGCGGCAGACCGGCTTTGAGAGCGGCTTGGCGCGCCGGGGCTTGGCCTTGGCCCGCCATGAGCACACAGCCCATCAA
+GACTTCGTTCACCGCCGTCGCGGTGGCCTCGCCCCCAGCACGCTCGACGGCCGCGCGGATCGCCACCGCCCCCAGTTCCC
+ACGCCGCCAAGCCAGCGAAATCACCCAACAAGCCGCCGATGGGCGTGCGGGCGGCAGAAACAATGACCACGGGATCAAGC
+ATGGAGCACTCCTCGGGTGGCGCGGAAACGGCGGCTCGGGATCGTAGGGGAAGACGTCATGCACATGGCCTGCGGC
+>generic368
+GTCCATTTTGTTGGCGGAGGATAACCGATATGACCCAGAGTACAAGACAAGTTAATCATTGGTGGGCGGGAGTTTACTTC
+GACGCCTGATGGTGGGTAACCGGAAAGTACGCCAGTTTTGAGCAGACGGCTCAGGCACTTGAAATCTCGGGGGCGCAGAT
+TATCACCGTAGCAGTCCGGCGGGTAAATCTTGACCGCAGCAAGGAGTCGCTCCTTTGATTACATTGACCTGAAAAAATAC
+ACTCTGCTTCCGAATTACTGCTGGCTGTTACACGGCTGACGATGCGGTGCGTACCTGCCGCCTGGCGCGTGAAGCGGGTA
+TGTCGGACTTCGTCAAACTGGAAGGTTCTGGGTGACGAAAAACCCTGTTCCCGGATAACGAAGAACTGCTCAAAGCCGCA
+AAAATTCTGGTCGCGGAGGGGTTTACCGTACTTCCCGTACTGCAGTGACGATGTGATTGTCTGCAAAAAGCTGGAAGACA
+TCGGGTGCGCCGCAGTTATGCCACTGGGAGCTCCAATCGGTAGT
+>generic369
+GCACCACCCGCCGCTCCGCCGGAACCGCCGAAGCCGGCCATCCCGGTCGTCAGCGCAGAGGAGTACGACAAGTTCGTAGC
+CGCCGGCCCTTACTCCGGAGAAGGCCGTGCCCTGCTCCAGCTCCTCGGCCAGAAAGCCCCGGAACACTGCCTCCCTCTTT
+TCCGCCGCACCATCGTCTCGGCCATGCCGATGATCGTCATCGACGGAGCGCGCACCGGATCGACCCTGCGCGCGGGGCTG
+GTGGTCGACGCCGCCAGGCCCGACGCTCCGCCCGTGGCCGCCCTCAGCCCCGGCGCGGTCTATGTCGAGCGCAAGAGCGG
+GCTCTTCGGCCGCCGCCAGGCGGTCCTCATGCCGGAATCGCCCGCGTTCTACGCGGAGCTGGGAGTCCCCGTCCCCTCGT
+CTCGGCCCTGCGCAAGGCTCGCTGCCGGTCGGCACGGAGAACGGAGACTGGGGGCNCCGGCCAAGACCTACGCGGACGCC
+AGCCGGCGCGGCTCCTATTCCACGCAGGG
+>generic370
+TGCTCGAGCAGTAACCCCTCATACGCCAATACCTTTTCCGCATCAGCCGGACTGATCTCGTGCACCGGAATCACTTCGAA
+CGCGCCGGTAAAATCGCTGCGCGGCTCGATCAACTGTTTAAATTCCTTCGGGAACGTCGTCCCCACCACCGGAAACAGGT
+TATTCATGATGACCGGCATCAGCGCATCCGCTGCAGACAAAAACGCCGTGCCGGACGTGCGCACGAGATTGTGAATGTCG
+GGAATATAAAGGATAACGTTGCCTGCCATATCGATCTCCTCGACGATCCGCCGTAGGCGCAAATTAAGCTCGTCCGCCGC
+CGCACCGGCCACGAGCTCCTGCAGCTGCAACGACACGAGCCGCTTATCGAACAGCGCCCGCGGCACATCGTCGTGCACCA
+GCCGCGCGGCGAGGTGCGCGATCAGCGTCTCCTTGCCCAACACCAGCCTCGCCCACGAGCAACGCGTTCGGATCCGTC
+>generic371
+GTCGAGGACGGCGACAAGTGGGCGCGCTTCGATCCCTACGACGGTTTCAAGGTGAACTTCGAAATCGAGTTCGACCACCC
+GGTGTTCAAGCGCCGTTCGCAGGTCGCCACGATGGACTTCTCGACGACCACGTTCCTGCGCGAGGTGAGCCGCGCCCGCA
+CCTTCGGTTTCATGCGCGACCTGGAGTACATGCGTTCGCGCAACCTGGCGCTGGGCGGCAACTTCGACAACGCGATCGTG
+CTCGACGACTACCGCGTCCTGAACGAGGACGGCCTGCGCTACGAAGACGAGTTCGTGAAGCACAAGATCCTGGATGCGAT
+CGGCGACCTCTACCTGCTCGGCCACAGCCTCATCGGCGAGTTCAGCGGCTTCAAGTCCGGTCACGGCCTCAACAATCGCC
+TGTTGCGGGCCTTGATCGCAGACGTTTCAGCGTGGGAGAAGTCACGTTCGAGACGCCTCAGGACGCGCCTATCTCGTACG
+TCGCGGCGGCTGCAGCCAC
+>generic372
+GGCACACCGGCCATGCGCAGCTGGTCGGCGTATTGCACGCCTTCGTCCACCAGCGGATCGCACTCGGCCAGCCCCACCCA
+GGCCGGCGCGACATCGCTGAGGTCTGCCGTGGTGCCCGTTTCGGTGTGCCCGTCCAGTGGGGCAAAGCGCCAGTCGTCTC
+GGTCAGCCGGGGTGCGAACGTAGTGGTTAAAGAAAAAGGTGATGTGCGGCTCCTCCAGCACAAAGCCTTTGGCAAACGTG
+TGGTGTGAAGGCGTGTCCTGGTGGCCTGCCACGCCGGGGTAAAACAGCAGCTGCAGGCACAAGGGTAAACCAGCATCGCG
+GGCCTGGATGGCGCACACCGCCGCCAACGTCCCCCCCGCACTGTCGCCGCTCACGGCAATGCGGTGGCTATCGAGTTGCA
+TCTCGCCCCCCGACCGGGCTACCCACTGCACCACGTCCCAGGCGTCGTCTTGCGCGATAGGGAACTTGTGTTCCGGTGCC
+AGCCGGTAGTCCACTGACAGCACCGCGC
+>generic373
+CCCGAACGTGAACAAGGCGAATATATTTTATTCTGCCGTGAGTTTGACGAGAAAAAAGCCTTATGGGAAGGGGCGCACGC
+GGGGCTTGAAGGTGCGACTAATGTTTATGAAGCGGATGATTCTTTTCCGATTGACGATTTAAACGACATTTTGCCGGGTA
+TGTTGGAAAATAAATCCAAAGTGTTTTATCCCATGGGGCGTGATTCGGATTTAGACCATAAATTATTGGATTGGATTAAT
+CACATACGGCGACAATCTCGCACAGGTATAACTGCTCCTGGGGAATTAGTTTCTTTAGAACATATTCTGCATGAAATGCG
+TTTATTCAAAAGCGCGGCAGAGTTAAAACTCATGCGCCACGCGGCGCAGGTGTCCGCTAACGCGCACATCAAAGCCATGC
+AGAAATGCAAAGCTGGCTTGTATGAATATCAAATTGAAGCCGAAATTATT
+>generic374
+ACCGGGCGACCAGCGTAGTACTTCAGGGGAAATTTCCAACTGGGACTTGCCGCCTTCGACCTTGACTTGGTAGTCACCGA
+TATAACCTTCGTCTTTCAAGACTTGGGCAATAGCGATCTTCAACTTTGAAGAAGGCATAGCGACACTGACCTTGTCAACC
+TGCTGCGCATTGCGAATGCGAGTCAGCATGTCGGCGATGGGATCACTCATGCTCATGGGATTGCTCCTTTTTGTGTCCTC
+AAGACGCCGAATTACCAGCTCGCCTTAACGACACCAGGGATGTCGCCACGGAAAGCCAGCTCACGAATCTTGGTACGCGC
+AAGACCAAACTTGCGATACGTGCCACGGGGACGCCCCGTCAGGCCGCAACGATTACGCAGACGCGTCGGATAAGCATTAC
+GCGGCAGCTTTTGCAGCGCCAGGCGTGCCTCATAACGCTCTTGTTCCGACTTGCTGAAGTCACGAGTGGTGT
+>generic375
+ATCGTGGATCCGTACTGCATTTTCCTGGCCTATAGGATCAAGGACCGTGCCGCCGCGGAGGCGATGCTGCCCAGGGGCTA
+TGAGCTCGCGGATACAAGCGTTTTCAAGGATCAATCGGCGTGTCCGATGGTGGTCATCAGCGCTTTCTCGGCGCGTACCT
+CCGCGTTCATCGGAAATCGGTTGGAGTTCTACATAATCGCCCGCCGCAAAGACACGGGCAGGATATCCTGGTTAATCACG
+GATTACGAGACGAATACGAATAGCTATGATCCGAAAAACTGTTTTTCCGGCTATACCAGCGATCCGGCTGTCTTCACCAC
+GACTCCATACGGAGAATTGCTCGCCGATTTCGCCGGAAAGAAGAACGGAAAACGATTTTCACTGTCGGCCGATGTGGAGA
+AAGGGGAATGGAGGGATCTCAATGGGGAACTCTGGGTCGAAGGCAATCTGTCGATTGATTACGGCACGAGTGGTGT
+>generic376
+CCGCGAAAGATTGCAGGCTTTTGAAGGCATTGTCATCGCAAAACGCAATCGTGGCTTGAACTCTGCATTCACGGTAAGGA
+AAATTTCTTACGGTGAAGGCGTAGAGCGGGTTTTCCAAACCCACAGCCCTATCATTGGCGATATTACCGTTAAACGTCGT
+GGCGTTGTACGTCGTGCGAAATTGTACTATCTGCGTGATTTGACAGGCAAAGCTGCAAGAATTAAAGAAAAACTTTAATT
+TCTTCGGAAGTTCTGTTTTCGTGGTTTAAAAAAGACAGCTGATATGCTGTCTTTTTTTGCCTGGCGTTTGGGCAATGAAA
+GCAAAATCCAAAATTAAACTATGTCATGTAACCCTAAAAAACAGGTTATATAACCTGTTTTTAGGTTATTTGAATAGTTG
+GCAAAATGAAATAGCCCTTGCCAACGCTGGATTTATTAGGCTGAGAAGCGGCTGGCAGGCTATGGCACAATAACTGCTGC
+CCTATTTGGTTTTGATGCCGCTAACATTTTCATTTTGCTGCATTTAAAGCGAAAAACCCCCA
+>generic377
+GCCGAAGCGCGTTGGCGCAACTCGGCGGTCTGCTCGCGCAACTGATCGTCGCTGAGGGGCTCATAGCGCGGCTCTAGCGC
+GTTGATCTGGGCGACGACTTGCCGATATTGCTTGAGCAACCGTTCGTTGCGGCTGCCAAAGATTTTCGTGAGGAGCTTGG
+GCAACATGGAGCGCTGGCATCAGAACCCTCGGTGGTCGCATTCCACCAAGAATCACATTGAGAAGTGGAGCAAAAAGCCG
+ATCCGGGAAAAGCGAAGGCGCCGGGCCGCTTTGGCCACGACGCCCATCCGGATGACCCAAAAACAGCGGGCGAGTGTACA
+CCGCCCTCTGTGGTCAACGTGTTTTGCGTTGCTTGCCTGATTTGGCCGCAGCGGTGGGCCGCTCCGACGTCGAATCGGCT
+TTTCCCCGCGCGCCAAGAAGCGGGCTGGGTCTTGCGGCACGCCGTCATAGAGCACTTCGAAGACGAGTGGTGT
+>generic378
+GACAAATCATAGGTGTCGGCGCTGTAGAACAAACGATGGAACAAGGCTTCCACCGCATCTTCGGTCGGCGGCTCGCCGGG
+CCGCATCATGCGATAGATGGCCACACGCGCGGCCAACTGGTCGGCGGTTTCATCCGAAGCCAAGGTCTGCGAGATGTAAG
+CCCCTTGGCTCAGCTCGTTGGTGAACAAGGATTGCAGGTCGCGGATACCGGCCGAGCGCAGCTTTTTGAGCAGCGCTTCG
+GTCAGCTCTTCGTTGGCCTTGGCCACGATCTCACCCGTGTCGGGATCAACCATGTTGCGCGCCACGATCCGACCGACCAA
+GAAATCGTCCGAAACGGTGATGAATTGCGTGCCGTTTTGTTCAAGCTGACGCACGTGACGTGCGGTGATGCGCTTGTCCT
+TCTCGACCACGACTTCACCATCTTTGTTGGTGAGGTCGAAACGCGCCACTTCGCCCTTGAGGCGCTCAGGCACGAACTCC
+ATCTGGGCACC
+>generic379
+GCGCTCGTTCGGCGGCCCGCCGAAGGGGCGTAGCGGCGCCAGCATTTGCACTGCATGCGCGCCCAGCTCGTGCGCGTACT
+GCGCGAGTCCGATCGCCGTCTTGAACGAGGGGTGGGAAATCCCGACCATCACCGGGCAGCGGCCCGCGACGAACTCCAGC
+GTCTGGCGGATCAGCTCCTTGCGCTCGACCATGCCGAGGTAGGTATATTCCTGCGCCTCGACGCCCGCCGCGACCACCAT
+GGTGGCGCCGCAGTCCTCAATAACGTAGTCGATCTCGCGTTTCAGTGCGACCTCATCGACTTTCAGGTCGTCGGTAAACG
+GCGTGAGCGGCGCGACCACCAGTTCAGGTCTTAACATGCGTCATGCTCCAATCTTGCACCGCGAACTTCCACGCTGCCGG
+CCTTGTCTTAAACCGACCTCGCATGGAAAGCATCAAACAAATGCAGCCAAGCTTGTCCCAAGTATATTTCGACGGCGGCC
+GCTATGGTACAA
+>generic380
+ACCAGCTTCATCAGGAATAAATTTTTCCTTATCCAGCTGAAAAAGAACAAAGACTTCATCAGACCAATACATTTTAATAT
+TATCAACAAAATACCACTCCCAATGCCCCAACCTTGCCATGTGTTGTGCTTTTGATAAGCGCGTTTCACTTTTCTCCAGT
+TGTCGTAACACACTACTGGCGTTAACCATATAATGTAAGCGGTGTATCAGCACTTTCCAATTGACAGGCTTGACCACAAA
+ATCCGTCGCACCTGCCAAATAGGATGAAGCCACCCGTTCCGCATCTTCAGTTCCTGTCACCATTAACAGAGGGTATTTTA
+CCACTGGGTAATGCGCGTATTGCCGCACAAGTAGCAAAGCCATTGATACCTGGCATATCAATATCAACAGCACAATATCG
+GTGAATGTTGCTTAAATGCTTCAATACCTTCATAGCC
+>generic381
+CGTCAAAATCGATCAATCCGGTCACCATATCATAATTGACATTCACCTGTCCGGTGCCGATATCCTTGTCGTTAATACGC
+AGGTCCTTTACCGAACTGTTGATCAGTTTCAGATAGGGTTTACCCAGCGGATCGTACAGGATCATCTTTCCCGTTACGAT
+GCCTTCCACCCGGGGATTGTCGCCAATGATGGCGCGGATATCATTCAGGTCAAGGTTGGTGACATCGGCAATGAGATCGG
+TGGCGGTCACGTTCTCATTCAGTTCCGAATGGATCACGATCTTCTGAATGCCCTGATTGAACGTGATCTTATTGGCTTCA
+ATGAAATGTTTATGGAAGGTGAGTTCCCCATCTGATTCAATGGTCCATTTCTATCATTGATGATCAGGGATGAAGGAGCG
+AAGCGGATGTTCACGGCTTTCGGGCATGGTGGTCACGGTGGCATTCAGTTCCGCAGCATTCAATGTTTTGCTGGCACTGG
+TTC
+>generic382
+GCCTTGACCATCCCTGCTGCTGCTGCGGGTTTACTTGTTCGCCCTGATCGTTGCGCCTGCGCTGATCGTCGCCCTCAGCG
+GAAAGGCTGCGCTGTCAGCCATACGGGTACGGCGCAAGCAGCCGGTCTTTGCCTACACCGACCGTTTCAGTGGCCCCTCC
+CAGACCTACTGATTGACGCCAAATCTCGGCGTAGCACCCTTCTTTTTGCGCCAGCTTGTCAAGAAGCTGGTACCGAGACA
+AAAAATCCAGCGTCACCACAGCCGCCTCTGCAGTGAAGTGGTCGGCCTTTAAATGCGCCAAGACCGCTTGAATCGATAAC
+AAGCGATATGACGCCACTTCGCCGTCCAAGTTCTTGGGCTCAAGCTCCGGCGGCACAACCAAGTCGTACACAATGCAGAC
+TTTGCCGATGCCAACCGCCAGATTCATACCGGCTCAGTCGGATATACGTTTTGTAACGCC
+>generic383
+GTTCTCGCCATCTTCATGGGAGGCATGGCATGCGGTGCATGGTTCGCCGGGCGACGCGTGCATGCTCTTGCCGACCCGCT
+CACCGGCTACGCCGCAGCCGAGGGTTTCCTGGGACTGGCGGCCATGATCTTTCACCCCATCTTTACCTGGACCCTTGCCT
+TTTCCCACGATACTGTCCTGCCTGCGCTCCCCTCGCCTGCCGCGAGCGCCGCCTGGCAATGGGCGATCGGCGCACTGTTG
+ATCCTTCCGCAGTCCGTCGTTCTAGGGACAACCTTCCCGCTCATGGCGGCAGGAATGCTCAGACGCCACCCCGAAACACC
+CGGCTCGGATATCGGGTTGCTGTACTTCGCCAATAGTATTGGCGGTGTTGCCGGCGTCCTCTGCGCCGGGTTTGCACTCG
+TCCGGTTCTTCGGTCTGCCTGGGACCCTAGTCTTCGCCGGTTGTCTCAATCTATTGCTCTGCGCCCTAGCCTGGGCGATG
+CGAGGCAGTTTCGTGACGA
+>generic384
+GGGCGCGCCATTGATATCAAGGAGCACGGGGTGTTGCCGGCATCCAAGGTCACCGCCTCGTTGTAGGTCACCCGCATCAC
+GGCGGTGGCCAAGGTGGTGTTGGTCTGCGACAGATACAGACCTTGGAAGTCGGTGCTTGCAGGCGCGGCCCCACTGGTGA
+CGGACTGCATCGGAGCAGCCATGTCCAAGGTGAGAAGCGCCGGCACCGCTGGTGACACCGAACCCGCCGCCGAGACCTCG
+TGGACGTAGAAGGCGAAGTTTGGGAAGTTGAGATCGTTGATCAGCGGGTTACCCCGGGCCAATTCCAGCATGGTCTGGGT
+GATCAGGGCGGTCCCGGCGGTGGGGGCGACTAGCCAGCTCAAGCCACTGTCCACGCTGTAGCCGATGGTGTCGGTGGGAA
+CTGCGGGCGTAGCCGTCAGGCCGGCGTCGTTGGTGAGATGGTCGGCATTGGTGGCCGTGGTGGTCCCTGTGCTACTGACA
+CGAGTGGTGT
+>generic385
+CCGCGATGAACCCGTCCGAGACCCGGGAGAGAATACTCGTTACGCCTGCGTGTACAATTCAGCCATATGTCCGCGACACC
+AGACGCGCCGATGGCTGACCTCGTTCCCGGCCTCACGGGACGCGCCAGTTGGGACGCGACCGAGCATCATTCCGCTGAGG
+CGTGGGGCAGCGGGACCGTGCCGGTCTTCAGCACGCCGAGCCTGGTGGGCCTGATGGAGGCGGCGGCGATGGACGCGCTG
+GCCGGCCGGCTCGGTGACGACCAGACGACGGTTGGTACGCGCATCGAGGTATCGCACCTGGCGGCCACGCCGCTGGGCGA
+CCGCGTCCGGGCGGAGGCGGTGCTGGTTGAGATCGACGGGCGGAAGCTGGTCTTCGACCTGGTCGCACACGACAGCCGGC
+AGCGGATTGGCGAGGGCCGCCACGAGCGCGTGGTGGTCGCGCGTGAACGATTCCTGGCGCGGCTCGCCCGAGGCTGACGA
+TGCGCATCTACCTGGCCT
+>generic386
+TGACACCACTACTGTTGTCATCAACCGAATTTCACGAAGGCAAAGTCCATTTGTCGGTGGTAAAGATCACACCACACATG
+CACTCGCCTATCTTGGGTTGAGCGATCGGCAAGTGGCGCTCGTTTTCTGGGCGGTCACTTTGATCAGTTTGATGTTAGTG
+GTCGTGATGGAAAGATTTCTGACGGTCTGGACGCACATCTACACCATTCTTTTCTCGATTTATTTTTTCATGATGTTCCT
+TATTTTCTTTTACGCCACACGATCAGCAAGAAAAGGAAGCTGAGGAAAATAATTACACCTTGCGATCTGTGGTACCATTT
+TCAGATGATTCGATATTATTCTTTCCGGTTTGAAGATTCTCCAACGCGGCCACCAGTTTTACTAATGCGATTGCCCGGTG
+ACTGATCGAATTTTTTTCAACGTCGCTCATTTCCGCAAAAGTTTTTTCAAATTCCATGGGTTTAAAAACAGGATCGTAAC
+AAAACCATTCGTACCGCAAGGTTCGGAAGTGATCATTCCTTTGACACGAGTGGT
+>generic387
+CGGGAATTGGCAAATCACCCGGTGCCACTAGGTCGTTGCTCAACTTCGGCCAAATCACGTTCGAGGAAGAAATTAAGGAA
+GGTTCTGATTACCGCGATCGCTCCGAGGCGTCCGACTTCGTCCCAAGTTGGCGCGACGGAAGTTCCGATGATGTCAGCAG
+CGAGTTGGAAAGTTAGCCCGGCAACAAGCCATCGCGCGTATCTCAAATACGCATCGCGAAACAGTGTGCCAGCCGCAGGC
+GGGGCAAAAACGGCTTGTGCGCTTCGAAGAAATGCTTCGATGGTCCCGACGGCGATAATTATCATTCCCATTGCGTTGAT
+GACAATGACGGTGTTTTCACCAACGCCAATCATCCATTCCTTCATCAGATCCCTCCCGGACGCTAGTGCCTACGGCAGTT
+CCCGCTTCTGAGGCGCATTGTTTCCAATACAGTTGCCCGAAGGGTACGGCGCCTCGGACGTCTTTACGGTCCTTGAAAAT
+CTGATCCATGCACGGTTAGCCGTGCATGGATC
+>generic388
+CTCGGTGAACGGCCAAAATCTCAGCAGTTCTGGCGGCGTGACGCTCAGTGATCGCAACGGCAAATGCCAAGCAGCCCCCA
+CCGTCGTGGCCGGGGGCACCGACACCTCAGCGCAGTTCAAATGTGCCTTGCTGGGCAGTGGCGCTTTGGTCTTTGATGTC
+AAAGACACGAGCGGTGCGGTTCTCTTTTCCACGCCCACTTTCACCATTCCCGAGCCCAAGGTGCGCATCGCCACGTCCAA
+GGGCAACATCGACCTTCAGTTGAACCCGACGGCCGCACCGATCACGGTGCAGAACTTCTTTGGCTACGTCTACGGCACCG
+CTGCGAGCCCGAATTTCTACGCCAACACCATCTTCCACCGTGTGATCTCGAACTTCATGATCCAAGGCGGTGGGTTCACC
+ACCGGGGTCACTGGCCCCGTGCAAAAAGTACCGCTGTTCAACCCGATCACGCTCGAATCCAACAATGGTTTGAAGAACCT
+GCGCGGCACGGTGGCTAT
+>generic389
+TTTATTTTCGCGGATCAGGTTCCGAATCGCGGGCGTGCCCAACATGATTTCGTGCGCTGCGGCCCGACCACTGCCGTCAC
+GGGTCTTGCACAGCGATTGTGAAATCACCGCCACGAGCGACTCGGACACCATCGCGCGCACCATTTCTTTTCAGCCGCAG
+GGAACACATCGACGATCCGGTCCACGGTCTTGGCGGCACTGGACGTGTGCAGGGTACCGAACACCAAGTGACCCGTTTCA
+GCCGCTGACAGCGCCAGTTGGATGGTTTCCAAGTCACGCATTTCACCCACCAAGATCGCGTCCGGATCTTCCCGCAGGGC
+GGCCTTCAAGGCCGCAGCGAACGACTTGGTCTGCACGTGGACTTCACGCTGATTGACCAAGCATTTCTTCGACTCATGGA
+CGAATTCGATCGGGTCTTCGACCGTCAGGATGTGGCCGTACTCGGTTTCGTTGAGGTGGTTGACCATGGCGGCCAAGGTC
+GTGCTCTTGCCCGAGCCGGTC
+>generic390
+GAATGGCCCGCCGTTGCTACGGCCGCCGCCGGCGACGACGAGGCCGATACGGTCATCAAGGACGCCAACGGTCAAGTCTT
+GGCCGATGGCGACGCCGTGGTGCTCATCAAAGACTTGAAGGTCAAGGGCTCTTCGATCACCTTGAAGCAAGGCACCAAGG
+TCAAAAGCATCCGTTTGGTCGGTGGTGATCACGAAGTGGACTGCAAGATGGATGCTGGCAACTTCATGCTGAAGGCATGC
+TTTTGAAGAAGGTGTGAGGATCAAACGATCTTTTCGTTCGGGGTGGTGATCTTGCGCACCGTCTCGAAGCGGCCCGAGCC
+CACCATCAGTGGATGGTCAGCGTCGCCACGTCCCAGCGCGGATCATCGATGGCTTCGAAGACTTCGCGCAGGCGCTGACC
+CCAGGTGGTGTGGATCATCTTGAGTAGGGGTTGTTGTCGTCGATGCAGACCACTTGCTCGG
+>generic391
+GCAGCTTGGTAGACCTTCTGCGTGAAGAGGGTTCCCGCAAAGCAGGTCAGCATGAAGGACAGCTGGCATACCAGGCACTG
+ATCAGGATCAAGGGCGAGGCCCAATCCTTCGGGATCCCATTGGATGATATTGGCTTGGCCGATTTCAATCCGGATGATCT
+ACTTTCCACCACGATGAAGCAGGCCGCCTGATCACCCGTCCACCCGGCACCGGATCGCCAGCAGCTTGTAGGCATCGATG
+CGGTCTTCGTCGAGGATGGTCTCTTGGTAGATGACGGCGCAGTTCGGGGCCTGCTGGGCGGCGGTCAGAATGCTTGACTC
+CAGGGCCAGAAGATCGGCCCACTGCTGTTCGGTGCCGCCGCTGAAGTCATGGATGGGTTGGCCGAAGTAGATCAGGCACT
+CAATGCCACGGCGCATGATCGGAAGAGCCAAGGCGTAGTCGTCGTAGCGCTCCTGCGAATCTT
+>generic392
+AGGAAAGCGGCGCGCTGTTCGTGGACCGTTTCATGAGCACTGCCATGCACTATCCGTGCAATTACGGCTACATCCCCCAA
+ACCCTGTCGGACGACGGTGACCCGGTGGACGTGTTGGTCATCACTCCGTTCCCGCTTGTGCCGGGCGTGGTGGTGCCTTG
+CCGCGCGATCGGTGTCTTGAAGATGGACGACGAAGCCGGTGGCGACGCCAAGCTGTTGGCCGTGCCGACCGACAAGATCT
+TGCCGATCTACAAGGATTGGCAAAGCCGGAGATCTGCACGAGCTGCACCTGAACCGCATCCAGCACTTCTTCGAGCACTA
+CAAGGATCTCGAAAAGGGCAAGTGGGTCAAGGTGCAGGGCTGGGAAGGCCCGGAGTCTGCCAAGCAAGAAATCTTGAATG
+GCATCGCCAGCTACGCCAAGGCCAATCAGCCGGTTTAAGCGGTTTAAACCGGCTTGACTCGGTTACTTGAACAAGCCTTT
+GAGCTTGTTCTGGACTTGGTCTCGGGCC
+>generic393
+AATGTGCTCGGGCCGATGCAAGTGATCCCGCAGCTCATCGACGCGCTGGCTCAAGGGGGCGCTTGGTGGTGCTGTCTTCG
+GTGATGGCCTCCATCGGTGGGCGCGACAAGACCTTGGGCTGGCTCTACAGCGCCTCCAAGGCGGCGCTCAACTCCGTCTT
+GAAAGACGTCTCGCTCGCGCTGGCTGGTCGCGCCACCTGCGTCGCCGTCCATCCGGGCTGGGTACGCACCGCCATGGGCG
+GCCCCCAAGGTCAGTTGAGCGTGGAAGAAAGCGTCACCGACCTGCGCGCCCTGTTCGCCAGCCTTGGCCCGGCCGACAAC
+GGCACGTTCCGCAATCACGACGGCAGCGTTTTGCCTTGGTGACCCGACGCGGGGATGCTTCCTAGCGAAGGCAGACGACA
+CATGATCCATCGCATCAAACTCGACAAGTTCGGACCGCTCTCCGGTATCGATTGGTCGGCGCTCAGCCAGATCAACTTGG
+TTATTGGTGGC
+>generic394
+GCAAAGGCTCAAGCAAAGTCTGGACCGAGCCGGAAACAGCCTCTAGGCCCATGTCGGAAGCCCCGCTGCGCAGACCACGC
+ACGTTCTTGGTCAATGCATCAATGGATTCACGCACTTCATCAAAGGCGCGAGGCTCACCCGCCAAAGCCTGCAAGACCGA
+TTTGGAAAGTCGTTGAGATTGGGTCAAGGCCCGACCGACCGCAGACACTTGCGCAGCACTTTCACTCAGGGTCATCACTG
+CCAACACCGAGGCAAGCACCAAACCAAAGACACCGCTCGTCAGCAAACTGGCCAGCAAGCGCTGTTGACGTTCAGCAGGC
+CAATGGCCGATCAGCGGCAAAGCAAAGTCGCCTCCCAACCAGCGAGCCAACCGACCTTGACCCCAATCAGGGCGTTCTTC
+GGGGCACGCCTTGACTTGGCGCTTTCCACCGACGCTTCCGCCTCAGTAATCAGTCCACCCGCATGTCCAGTGTCCATACC
+AAGCAGGCC
+>generic395
+ATTCAAAATCCATTCAAAATCGATTGGTTTTCGAATCCAATCGATTGGGGGGTTTGTTTTCCTACGGGAATCCTCGCGGC
+ACTTTTTTCCTCGGGGTTTGTCGGGCCGAAAATAGACCCAAAATGGGGTTTTGGACCGAAATTGGGGGGAAGGGTGGAGC
+ACGTCTTTTGGGGTCCTCGATTTTTGGACTTTTTATCGATTTCCCCTTCAGGAGACTTAAATATGGTCCAAAAATCGCAT
+TTTTTCCTACGGGAATCCTAGGGCACTTTTTTTGGTCGAAAAAT
+>generic396
+GTGAAATATATTCTGTTTCAGCATCAGACAATAAATCCTTGCGACCTAAAATTGTTTCTTGATGTAGGAGTCTTTCCTGC
+CGTTTACTTCATCCCGTTCCGGGTAATCGATGGTGTAATGAAGTCCCCGCGATTCCTTCCGCTGCTGGGCGCAGGTCACG
+ATCAGCTCGGCAACCGTTGCAATGTTGCGCAGTTCCACCAGGTCTGAAGTGATGATGAAATTCCAGTAGTATTCCTCGAT
+TTCGTCCTGGATCAGCTTGATGCGGCGCATGGCACGTGCCAGGCGCTTGTCGGAGTCGGACGAGTGCCCGACGTAGTTCC
+ACATGGTGCGGCGGATCTCGTCCCAGTTCTGGGAGACGACGACCATTTCGTCGCTGTTGGTGGCCGTGCCTGAGTCCCAG
+GGGCCGGTATTTCGCTCAGGTCGTGCTGCAGGGTCTTCAGAGCTTCCGAGGAATGCTGAAAGGCCCTGGCCT
+>generic397
+CAAAAATCATCGCGATGCGCCCCTAACCCACCCTACGAATTTTGGGCGCGAAGCATCGCCATCCGATCCTCCCAAAACGC
+CAGAAACAAAACCAGCTTTCGGCGGTCTTCCTGTTAAGATAGGCCTAACCCGCATTGATCCGTCGGACGCCCATGATTCC
+ATACCGCGATACCATTCCTTGCCAGCATACGCCCTGGGTGACTTGGTCCTTGATCGTGTTGAACTTCGGCATGTTTCTGC
+TCAGCCTGATCTTGCCGGAAAAGTCGCTGACCCATTTGTTTTACCTGTATGGTCTGGTTCCCGCTCGGTTTGCCTATCCA
+CAATGGGCTGAAGCAGCCGGATTCCCGATGGGTGATTACACGCCCTTTATCACCAGCATGTTTCTTCATGGCGGCGCGAT
+GCATATCGTGATGAACATGTGGTTACTGTGGATCTTCGGTGACAATGTGGAAGATCGCATGGGGGCCGTGCGCTTTCTG
+>generic398
+GCGTCATCCAGGGTACAGTGTAGGACAACAGCCATAATAATGAAGTTTGATACCAAGGCATAAAGTCACGCGCCCACAGT
+GCCGGAGCTGCCAGAATAATCCCTTTCACTTGCGGTATTTTCATATCCGCCATCGTGACTATGATAACCGCGCCGCCCAT
+GCTTTCGCCCAATAAATAAATCGGCACGTTGGGATGTTTTTCTGCCACTAACCGGGTAAAGAGAGCTAAATCTTCGCTAT
+AGGTTTCATGTCCTGCCCACTGCCCTCGGTTTTCTGAACCGCCAAAGCCGCGTAAATCATAAGCATAAGAAGCAATATTC
+TGTTTTTGGAAATATTGCGCCGGTTTGTGAAAAAAGCACTGTAATCGTTAAATCCATGCAAAGCGATAATCACAGCCGCT
+GGCTTTTTCGAGTTCGGTTGCCACTGCCGCAGCGGCAGTTTTGCCCCATCCGCCGTGATAAATTCCCGTTCTGTGATTGC
+CCCTTGATAGGTTTTTGCCCCTTGCGGATAAGTGGCTGAC
+>generic399
+GCTTTGCTCAACTTTGGGGCAATACTTACAAACCTTGGGCGTTGAGGCGATAAAGGGTCGCCGCTCAGCTGCCGATGCCG
+CGATTCTGGAAATGGGGATAACCTTCACCGTGTACAGCGAACGCGGCAACATTGACCGCGCCTGGCCGTTTGACATTATC
+CCGCGTCTGATTGAAATTCAGGAATGGAAAACTATCGAAGCCGGACTCAAACAACGTTTGAAAGCGTTGAACTGTTTTAT
+TAACGACATTTATAACGAACAGGCGATTCTCAAAGACGGAATTGTTCCGACCGACTTAATTCAATCTTCAATCAATTTTC
+GTCCTGAATGTGTTGGCATGAAACCAAAATTCGGCAGCTGGGCAAATATCTGTGGCAGCGATTTAGTCCGCGCCGGTGAT
+GGTGAAGTCTATGTGCTGGAAGACAATCTGCGAGTGCCGTCTGGCGTTTCACGAGTGGTGT
+>generic400
+GATCGAGCATGTCTCGCTCAACATGGACTCTCCCTATTCCATATCAAAGATTATCGGCGAATTCTACTCCAGCTATTATT
+TCAGGGCTCATGGACTTCCAGCGGTGCGGGCGAGATTCCAGAATGTGTACGGCCCTGGCGAAGTGCTGGGAGCGGGGAAA
+TGGCGCGGCACCCCGGCAACAATCTGGAGAAATGTGACTCCTACCTTTCATCTACAAGGCATTGAAAAGAAATCACTCCC
+CGTGGAGAATGAGGGAATCGCCACACGCGACTTCATCTATGTCGATGATGTGGCACGGGGGCTTCTGGCCTGTGCACTGA
+AGGGTATGGCAGGAGAGCCTTACAACATAGCCTCAGGGGAGGAAACGAGCATTCTCAGGCTCGCCGAGACCATAAATACT
+CTT
+>generic401
+CAATACGCCGCCACCCCGAGGGCTGCCGTGATACCCGGCGACCACTTGGAAAGGCACGCCGTGCTCGGCCAGCGTTTCGA
+TTTCCTCGCCGCCCCGGCCAAAGACGAAGGGATCGCCCCCTTTGAGGCGCAACACCCGTCGGCCCTTTTGCGCCAACTCG
+ACCATCAACGCGTTAATCGACTGCTGACGCATGGTGTGGTTGGCGCGCTCCTTGCCCACGTAGATGCGCTCGATGCCTTC
+GGGCAACAGCGCCCGGATCGGCTCAGAGACGAGGTTGTCGTAAAGCACCACATCCGCCGCTTGCATGCAGCGCAGCGCTC
+GCAAGGTCAGCAAGTCCGGGTCGCCCGGGCCGGTACCGACCAAAAAGACTTCACCCATGCTCATGGCCGTGCATCCTTCG
+CATTCATCCACCAAGCCTGCGAGCGCGTTTGCCAGAGATACCGCACGAGTGG
+>generic402
+GGCACGCTTAAACGTCTTGCTTTCGAGCGCAAATATGAAACGACTTTTCGGCTTTGGTCGCGTTTCGACAGGGCTGTTAA
+ACAACAGGCATTGACTGATAAATATATCGTTCTGGCTTTGTGCCACTCTGCAAGAATCAACCTGAAAACAGTGGTAAGTA
+TCGATATTTTTGCCCATGAGTTTCACGCGCTCCTTGTGGAAGCGACAGAAGCAATGTTCAGCAATAAAACAGCCTTGCCT
+CAGGAATGGTTGGAAGCTTTAGCGGTTTGGGCTGAGGGTTTACTGGATCACTATTTGTTCTCTTTGGCTAACGAGACGCT
+TAATCTTGCGGAAACCGCACAGCCTCAACGCTTCCCATCGGTGCGCCAAGCTCTTATAGCAATCCGCACAAAACTGGATG
+TATTGCTCGGCAACGTGGAAAAAGCGGAATACGCTGCCTTAAATTTCGCGTTACGCCCCTATTTATTACCCAGTCGTAGC
+AATCGACCGATTCTTTATCGGCAATTCATGTCGGTATTA
+>generic403
+AGTAGCTCATGCCTTCGTCAAGCCAGCGGCGGTAGAAGGCATTGCCCAAGTCGTAGTGAGCGTGGATGTTGCGCCGGCTG
+CCGCTGCGGCTGTTGCGGTTGAAGGCGTGGCGCACTCGGTAGGCCAGCGCACCCCACCACGAGCCGTAGACCGTCTTCTC
+CAAGGCATCTCGGTTGGCGATCAGCAAGCGCAGCAAGGCTGAAACGTCCGGGCTGTGCCAATCCCCGGCGATGTAGCTTT
+CGGCCAGACCGATGTCTCCCGAGCGCAGCACGGCTGCGCAGACGTTCCAGTTCGGCCAGTGCATCACGGCGTGCGGTTCA
+TCACTGTGGCCGGGGCCGTAGCGGCGCAGGCTGCCATCCGGCAAGCGCAGCTCCAGCGAGCCGTGGGCCAGCCGCTCCAG
+CAGGCCGAGTACGGCCCGGGCGCT
+>generic404
+GCTTGAGCGCGACGAGGACGACGCATTGCCGCCTTGCGCCTCGGGCGCGCGCGCCATGCTCGGGAAGGTGCTCATGCGCG
+TGTGGCGCAGCCCCGCTGTCGTAGCCGCTTGGACCCAGTCGGCCGGAATGGGTTGATCGCTGACGATCACCAAGTCCCCG
+CCGAGCAAGGTGCCCGGCGTCGCGGCTCAGGCCTGCTTGCAGGCGTCGGCAAAGAGCTCACGGCGCTCAAGGCGGCCACG
+GCCAAGGTCAAGGCCAGCAAAAGCAAGCGCAGTTCGCCGGCACGCAGATCGCGCCGCAGTTGGCGCAAGGCTTGAGCCCA
+AAGGCTGAGGAAAGAGGTTAGAAGCACGCATATTCGAGCCATCATGCCCGAGAACATGGTTGAATCAACGCTATGCGTAC
+CTCTGCTTAT
+>generic405
+GTCCGCCTTGGTCTGGGCGGGCGATCCGCTCGGGTCTGAGCCCCTTCGGCGCGGTTGCGTGACACCGTCAGCGGCCGTGC
+CCCAGGCAACTTGGCCCCCTTCGCAACTCGACGCCGCGCCCGAAGAAGTCCGCGATTTGGTCGCGGCCCTCAACGCCTTG
+CTGGCCGCTGTGCAGGAAAGCTTGGTGCAGCAACGCCGCTTCATCAACGACGCGGCCCACCAACTCCGCACCCCACTGGC
+GGGGCTCAAAAGCCAAACCGAACTGGCACTCAAAGAACTGGAGCGCAGCGCGCATCCCGACCCCGGCCTGCACGCCCGAC
+TTGAGTTGGTGCTCGAAAGTGCGGCCCGCTCCAGTCACCTCATCACCCAGTTGCTCACCTTGGACGAGTGGTGT
+>generic406
+AATCAATATCAAAATACAAGTATCCGATTAAACGTAGAAATGTACTACCAATCATCAACATCCAGCTCGTCTGGCTTTAA
+CTCAAATGACTTGAGCAGGTATCAACTTGGTGGAGGAGCGTCAGCAACCAGTTTTGGTGCGAGCAAACCTCCAGCGTATG
+GCGGTTACACAAACACCACGACGACAACGATGAACTCGACACTTGCGAACCCTATGGCCGCCAATGTTGGAAATAATAAT
+CGAGGAGACACCTAGTCAAGCTAGTACGGGTTCCGTGACAATGACTATCGCACGAACTTCAACATTAACAGTTTGAATAC
+GAACAACCAGAGAAGTAGCTTCAGAGATACTCTCGGTGGTGGTGGCGCCAGCACGAACAATTTCGGGTAATCGAACTTCA
+ATGCTAAACCCGACTACCAGACTCAATAACCTTAAGGCGGCGGTTCTTTTGGTCAACCAATTTGGAAATTCTCAATAAAG
+TCCCCATTTGCTGCTTAGCCATAATAATCGTATCATTCGAGTTC
+>generic407
+TCACTATTTGCATTAGGTTGAAGCGAAACTAATATCGCACTGACTTGAAGCGTGGGTAATTCAGGAATGCGTGAGGCTAA
+ACCTGCGGCACGTTCCAACAAAAAAGGCTGCATTTGTGCTGTATCATCGGTTTCACTACGCGCAAAACGCGCTGCGCGTT
+CTAAACGTATGGCTTCACTTGGTTGATCAAATTGAATTGCCATTGCATCACGCACACTAAAAATGCTAATCCATCACCTG
+CAATGCCAGACATTCCTTGAGTAAGTCCGACTACTCGATAAAAATCTTTCCCGAATTTAACCTGTTCACCCAAAAGCAAG
+CCTAGCGAACGGTCGGCAATCATTTCAAAATGTGCTTGACCTAAAACACGTCCTGCAACCAAAGACACCCATTCGCCTTT
+ATCATTCGGATAATCAAGCCCTTGCACCATCAGGCGTAAATTTTTTTGATGGTGTTCACGCTGAATTGTGTGTGAAACAA
+AACGCCGAGCGCGGGAAATTTCAGACGAGT
+>generic408
+ATGGCCAGCTTTGCCGACATCCGTCACGCGGGCGATGCGGTCGCCTCGGTGATCGCCGCCGGCATCATCCCGGCGGGGTT
+GGAGATGATGGACAAGCCCATGACAGCGGCGGTCGAGGACTTTGTCCACGCCGGCTACGACTTGGACGCAGCGGCGATTT
+TGTTGTGCGAAAGCGATGGCACGACCGAAGAGGTTGAGGAAGAAATCGGCCGCATGCAAGCGGTGTTGTCGCGCTGTGGG
+GCCACGCGCATCGAGATCAGCCGCGACGAAGCGCAGCGGCTGCGTTTTTGGAGTGGCCGCAAGAACGCCTTCCCGGCCTC
+AGGCCGGATCAGCCCTGATTACCTCTGCATGGACTCGACCATCCCGCGCAAAAAGCTGGCCGAGATGCTGATCGAGATCG
+CCTTGATGGAGCGCCGCTACGGGCTGCGTTGCTGCAACGTCTTCCACGCCGGGGACGGCAATTTGCATCCGTTGATCC
+>generic409
+GTCAGGGTCGGATCGACGTGATTGCGGCTCATGCCGGCATGCACCAAGTCACTCACCCGGGCAATGAGCCAGCGGCCGAT
+GACCCAGAACGCCAAGGCGCGACGAGGTACTTGGACGAGCAGATTGATCAGCGTGTCGCCGAGAAAATGCTGAATGGTTG
+AAAAATCCATGGGAAGTGCGCTTTCAGTCAACGTGACAGGAACGTCACAGTAACTTTGAAAATAGGGGATGACAAGAAAG
+AAATTATGGCTATAATGCCGGTCTCTTGGCGCTTTAGCTCAGCCGGTTAGAGCGACGGAATCATAATCCGCAGGTCCGGG
+GTTCGAATCCCTGAAGCGCCACCAAAATAGATCGGCCCGAGACTCAACCTCTCGGGCCGTTTGCTTTGACAAGCACTCTC
+GCAGCCCCTGGATTGAAACCATGCCCCGCTGTGTTGCCCGTCTCGCCGGTTGGATTCTGAT
+>generic410
+TGAAATGGCTGTTACCGAAACGCCCCGATTTAAAGCTCATCATCACCTCGGCAACCATAGACCCTGAACGCTTTGCCACC
+CATTTTAATAACGCGCCGATTATTGAAGTCTCAGGGCGAACTTATCCTGTGGAAATGCGTTATCGTCCGATTGAACGCGA
+AACCGAAGAAGATGATGACCAATCCGCTGGGAGCGGATTGGCACGCAACGCGCCCGAAGGGTCAAGGGCAGGGACAGCCC
+TTGATGAAACAGGGGATGAATTACAACACGCCATACTCGATGCTGTTGATGAACTGTATCGAGATTTGCGTGGTGACATT
+CTGATATTTTTAAGCGGCGAGCGGGAAATAAGAGAAACCACCGATTCCTTAAAAAAACACCATCCCAATCAATACGACAT
+TCTGCCGCTGTATTCTAAAATTAAAGTGTTAGCGAACAAAGAGCGCGTATTC
+>generic411
+CCGCAAGCAAAGAGAAATATTGCGAACCCGAAGTGTGATGCTGAAAGATGCGACCCATGAAACCCCTTTATGCCTTATCG
+CTGTTGGTGACGTGAAACGGATTCTCGACACTTAAGCTGCATTCACAGAGGGCAAGTTGCACATTACCGCTGTTCTTGCG
+AACCGAAACCCGGCCAAGGTGTGCGCTTGTCACGACTCAGCATTTGAGGCCTAGATGCAAGGCCACGATGCCAGCACTGA
+GGTTGTGAACATCCACGTGACCAAATCCTGCCGTTTTCATCATGGCCTTGAGCTCCGCTTGACCAGGATGCATGCGAATC
+GACTCAGCCAAGTAACGATAGCTTTCAGCGTCACCCGCAAGAAACTGCCCCATGCGTGGTAGCAACTGAAACGAATACCA
+GTCGTAGACCTTCTCCAGCGGCTTGGCCACTTTGGAAAATTCCAGCACCAACAAGCGTCCACCCGGCTTGAGAACACGGT
+TCA
+>generic412
+GAGCAACGTATCCATCGTGTCACCAGCCTGAGTCCGGTGGCTGTGATGCAAAGTCACCGGCTGATCGGCCAAAGCCTCCA
+CTTGATCGTCGAGATCTTCGGGGGCGGCCAGTGATTCGGTCAGGATGCGCACTGTGACAGGCGCGCTGTCCGTCACCGTG
+AGTGGGGCCACGCTGAAGGCGGTGGCACCGAAGCCGAGGAGCAGGGCCAAGACGGTGGCGATGGTCGCGGTGCGTCGGGT
+GGCGGTGGCGTCAAGAGAGCAGTTGGGCGCGTTCAAGGGCGGTCCTTTGCGTTGCGGCCCCTGATCTGCCCGATGATCAG
+CGACAAAGCAATGGGCATTCCGAGCCGAAGCTCTAGAATCCGGGCCACCTTGGAAGCCGGCGCAGTATATCGGCTGTGAC
+GAAAGTCACCTTCCTGTTAACCCGTACCCGCCCGTGGCGGTTGTTGTCGCATGTCATCTCCGTTGTCTGAACTCTTGTGG
+CCCCCGTGGGCGTGGTCCC
+>generic413
+AAAAGTTTCCAGCAGTTTTTGCTGTTCGGGTAAAAACACGCGCCGTAAATTCACAGGCAATAATGCCAATACGCCCAATA
+CGCTCTCTTCTGCGTAGATAGGGAAATAAATTTCTTCTGCACCAGGTAGCGTATTTGTTCCCTGTCCAGCCATTTCATTG
+TGATCGAACACCCATTGCGCCACACTCAAATCTGCACCATGCAATGATTCAATCATGCTTTTTGCTTGGGATAAATAATA
+CGCCCGTTGCTGTCGGGAAATAAATGACATTGCGGCTGCTGAATTCCGAATGCAGATGACGCACGGCAATACGGACAACG
+TCCTCCTCGCTTTGACTGCTTGCCAACTCTCGACTCATGGCGTACAACACCGCCGCGCGACGTTCTCTATGCGCGGCAAC
+TTTGGCTTGCGAATGCACATTAATCATCAAATTACTGATAACAATCCCCACCACCAGCATGGTAAGCAAGGTAATTAAAT
+AC
+>generic414
+GCCGGTGTGATCAGGCCCAAGACTGAATAAGAAGGTGGCCTGGATACCTCGACGCTCCAACCACTGCGCCAAGGCCGGCA
+TGCCTTCGCGCGTGCCACGCCACGTATCGACATCAATCTTGAGCGCAATCCGAGCCATAAGGAGAGGAACTCTTCTGACG
+TCAGTCGTTCAGATGCGAAGCAACTTCAATCTGATCGCGGTAGTGATCGAAGATTCGCACCAAGGCCTCCGCCATCGACA
+CCTTGGGCGACCAAGCCAGATCAGCACAGGTGTTGTCGATTTTCGGTACCCGGCGCGTGACGTCTTGGTAGCCGGCACCG
+TAATAGTCCCCCGAAGATATTTCGACCAAAGCCACCCGCGCAGCTTGCTCTTGATACTCGGGACGTTGCACCGCCAAGGC
+CAGCATCATGTTCGCCAGCTCACGCACCGAATGGTTGTTGCCCGGATGACCAATGTTGTAGATCTGGGCACACGCCTTGT
+TC
+>generic415
+CTGGATTTTAGCGGTATTACTCTCGCAGATGCTGTACAACGTGTACTTTCATTTCCTGCGGTAGCCGATAAAAGTTTCCT
+GATTCACATCGGCGACCGTTCAGTGACAGGCTTAGTGGCAAGAGATCAACTCGTCGGCCCGTGGCAAGTCCCTGTTGCGG
+ATGTTGCGGTCACCGCCTCAGGTTTTCATGCACTCACAGGTGAAGCAATGGCGATGGGCGAACGCACACCGATTGCAGTC
+ATTGACGCACCTGCCTCTGGACGTATGGCAATTGCCGAAGCGATTACCAATATTGCCGCCGCGCGTATTGATTCGTTAAA
+AAAATCAAACTGTCGGCCAATTGGATGGCAGCGGCAGGGTCAGAAGGCGAAGATGCCGCGTTATTTGATACTGTCAAAAC
+TGTGGGCATGGAACTCTGCCCTGCCCTTGGTATCGCCATTCCTGTCGGCAAAGATTCC
+>generic416
+GACCCACCCGGGCCCACTCAGCACGGTCTGTTCCAAAAGACCGTCTTTGGTACATCACGACCTTGTAGCGATCGTCTTGG
+CCCAGCTCCAACGGTGGGAAGTCGAAGCTGCCAAAGCCGTCCGTTTGGGCCTCGTGGATTTGGCGGCCTTGGCGCACATC
+CAAGACGCGCACGGTGGCGTTCTCAATCTGGCCGCCGTTGCCGTCCAGCACTTGGCCGGTCACGAACAGGCGCAGCGTGG
+CGGGTTGCGGTGCTGTGGCGGGCGCGGTCGGTGCGGGGACGGGCGGCGTTGATCTGAATCCACGCTTGCAGCCCGAGCGG
+AAAACCGGCCAGCAGTGCTGAAACGATCAAAAGCGTGACCAGCGAATTGGCTTTTGAGCTTCAGACCCTTGAACTCAAGC
+TCTTGGGCGCTGCCTTCGTCCCCGGGAATGCGCTGGCCGCGAAAAACCACGGCAAACAAAACAGGCAGAGCAAGATGCCC
+AACCCGGTCACGGCGTAA
+>generic417
+AAAGACCTGTCAGGTTTTTAAAACCTGACAGGTCTAAGCGGAGTTGTTTATTTATTGATTAGTTGCGTGATTTGTATTGC
+AGTTTCCAAAGCTCTTCGCCCTGCCTCACCTGATACCAGAGGATTTTTGCCGGTGTGAATGCAGTCCACGAAATGCTTGA
+TTTCTTCCAGCAACGCATCGCTGGCTTCAAAAACCGATTCTTCGCTGACAATTTCAGGAATGCCGGGAAACATTTCTTTT
+TCGCCGGTGCGATATTTCATCAATACTTTGTTCTGAAAATCCACGCTAATATAAGCGGAGGGTTGAAACAAGCGCATTTT
+GCGTTCGGTTTTCATGCTGATGCGGCTGGCGGTGACATTGGCAACGCAGCCATTTTTAAAATTGATTCGCGCATTCGCAA
+TGTCCGTGCCTTGCGTCAGAACCGACGTGCCGCTGGCATCAATGCGTTCGACTTCAGAATCCACCAATGCCAGAATAATA
+TCAATGTCGTGAATC
+>generic418
+CCGGACGGTAGCGAAACGGTGCGCATCAGCGAACGCAAACGCGGCGCACCGCTCGATTTGATCGTGGCTGAGGCGATGAT
+TCTGGCCAACAACACGTGGGGCGGCTGGCTGGCTGAGCTGGGTGTGCCGGGTATCTACCGCAGCCAAGCCAGCATGGCCC
+CGGGCATGAAAGTGCGCATGAGCACCCGCGCGCTGCCGCACGCCGGCATGGGGGTCGCGCACTACACCTGGGCGACCTCG
+CCGCTGCGGCGCTATGTGGATCTGGTCAATCAGTGGCAGATCATTGCCTGCGCCCGCCACGGCCGTACCGCCATGCTGGC
+CGCGCCCTTCAAGCCCCAAAAGACGCCGAGCTGTTCTCGGTCATCTCCAGCTTCGAGTCGGCCTATGGGGCGTACAACGA
+CTTCCAAAACGGCGTCGAGCGCTACTGGACGCTGCGCTGGCTGGAACAAAACGGCTTGGCGGAGC
+>generic419
+CAAGGAGACCGACCGCATTGCCGCCATGGCCACCGAGCTGCGCAAGCTTGGGGCCGAGGTCGAAGAGGGTGCGGATTTCA
+TCGTCATCATTCCGCCCAAACGGCTGCAAGCGGCGGCGATTCACACCTATGACGACCATCGGATGGCGATGTGCTTGTCT
+TTGGCGGCGTTTAATCCGCTGCTCGCGGCCCAAGGCGAGTCGGTGCCGGTGCGCATCCTTGACCCGAAATGCGTGGCCAA
+GACGTTCCCGGATTATTTCGAAGCCTTCTTTGATTTGGTTGCCACGGCCCCAGCGCAGGTGCCCGTACTGACTTTGGACG
+GTCCGACCGCGTCGGGCAAGGGCACGTTGGCGGCGGCGGTGGCCCAGCGCCTCGGCTATCACACCCTCGATTCGGGCTCG
+CTGTACCGCGTGACGGCCTTGTCTGCACAGATGCAAGGCGTCTTGGCCGAGGACGAAGCGGGCCTGGCCCGTGTGGCCGA
+GGGGCTTGAGCTGCGTTTCGACGAGTGGT
+>generic420
+GTACAGTTCCTGATCAAGGATTCTCTGGCAAACGTCTTTTGTCCGGCCTGCAAGTTGTGGAACACCGGTTACGGCGCTAC
+CATGATGCGCGAAGCAGTCAGCCTAATGGGTGGATACGGCATTACCGAGGACTGCCCCGGCTTCCTTGGGCAGAAGTGGG
+CGGATGCTCAGCTGGAGGCGACATACGAAGGGCCTGAGGCGGTCCAGCGTCGTCAACTCTCGATAACCATTCTCAACGAA
+CTTTTCCTTGCTCAGTTTCGACAGTGGGTTAAGGATCTGCGAGGTATCGCTGAACGTCGTCCCGGCTTGGGCGCATGCAC
+ACTGGCGACCGCCATGGAACTCTGGTTGTGGACGCTCAGTTATCTGCAGAACAATAAAGATGCAGACGGCAAAGCTCTTT
+ATCATTCACAACGTCACGGGGTTGTATTCCCGTTTGTAGATGCGCTCTGCTGGATTTTAACATCTCGTCAG
+>generic421
+CCACTTATAGGGTCCGTCACTGCCGCTGGAGAAAGTCAAAGGAATGTCCTGGATGATGGGATCCCCTCGGCCCCACGGTC
+GCGCCGGGTTGAGTCTGATCAGAGATCCCACAACTATCATGGCCGTATCCTTCCATTGATACGCGGGTCTTTCATGCCAA
+AAGGCTCATATTCATGCATCAGTCCTGACAGACGTCACACCACCACGACGTGCGTCCGTCGGCCGTCTGTCCACCTTGAA
+TCGGATGACCCTGCGGACACATGTCGCGTCTGTACACGACGAAACCGTCCTGGTACGTCCCTCCCGGATTTCCTTCGAGG
+TTCCCGATAGTTCATGAGGTGAGCACCTCCGGCAGCGAATGAAGCCTTCGCCACCCCCGTGACGTTGCACCAGAGTTTTT
+CGAACTCCTTCGGCCGATATATCCACCACTAGTCGTGTGGGAAGAATTCCCGACAGGAAGAGCGCCTCGCTCTTGATGTA
+GTTTCCACA
+>generic422
+CTCAGGTCGAGCGTGCCTTGGCCGTGGTGATCCAGCAGGCGGCCCGGTGTGGCCACCAAGATGTCCACGCCCCGGCGCAG
+ACGCTCGACTTGCGGGCCCATGCTCACACCACCAAACATCGCCATGCTGGTGAGCTTGAGGTACTTGCCGTAGGTGCGCA
+CGCTTTCCTCGACTTGAGCGGCGAGCTCGCGCGTCGGGGTCAGGATGAGCGCGCGGATGGCCGGTCGGCCGTTCTTGCCC
+TTGACGGGTTCGCCGGCGTCGAGTTTGTGCAGCAGCGGCAGCGTGAAGCCGGCCGTCTTGCCGGTGCCGGTTTGCGCCCC
+GGCCAGGAGATCACCGCCTGCCAGCACCGCCGGAATGGCTTGTTGCTGAATCGGTGTCGGAATGGTGTAGCCCTCTTCGT
+GTACGGCACGAAGAATCGGCTGGGCCAAGCCCAGATCGTCAAATGTCATGGATGAAGCCCGTGTTTCGGGCCAGTTCGAT
+TCCGCTGAT
+>generic423
+CCACGATTTCTGCCCCATGTCTGACGGCGTGGCTTGCCTCATTTTAACCTCCAGACCCCATGATGTTCTTCTTTCCGGCG
+TCGGCAGTGCTACCGATATTCCGACTATTGCCGACCGGCTTTATTTCCACTCTTTTCCGGCTACCGTCAGAGCGGCGGCA
+GAAGCCTACGCCATGGCCGGAATCAGGGATATTCGCAGCTTTGCCGGTTCGATTCATGTGAATATGCACGACCCGTTCAA
+CGGTTTTGGCCCGGTGAATATGGTGGATCTGGGATTGGTGCCACAGTCGAAACTGCTCTCCGCACTGCTTGATGATTCAA
+TTACTGGTGAACGGGGCTTGTTCCCTACCAATCTCACCGGTGGTCTCAAGGGGCGGGGGCATCCGTTAGGGGCAACCGGC
+ATGATCCAGGTTGTAGAAAATCATCAGCTGCTCATGACTCGTCGCTTCAGGGCCGGTCTTTCCCACTCCCATTGGCGGAC
+CGATCAATAATAACGTTGTCAACGAGTGGTGT
+>generic424
+GGCCAAGTTGCTGGCCTTGCTCAAAAGCCTGCATCAGAAACCCCGGGCGCGGTTGGTGCCTTTGCCGGGTTTTGTGGCCG
+AGTTTGTTGAGCTGCACGACTTTGCCCAAGGCAACTTGATTGATGGGCTCTTGAAAATGGTGCGTGAGCGCAGCCAAGTG
+GCCGTGCAGCGCAACGACTTCAAGCCCGAGATGCTGGCACCGCATCTGTTCATGAACTTCCGCGTGGTGGATGAACACGG
+TCGCCAGCTCGGCATGGGCCGGCAGATTGCGACCTTGAAAGCCGAACTGGGCGGCCAAGCTCGTTCCGCTTTTCAGGCCT
+TGGCAGCGTTGAAGGTGGCGGCGAGTGTCTTGCCCGCCTCGTCGGCCACCTTGTCGCCCACCTTGTCGCCCCCCTCACCT
+CAGCCCTCTCCTCTAGAGGGGCGAGCGAGCAAGACCGCCGAAGTTCTCACGCCCCAGGCCTACACCGCTTGGACGTTCGG
+CGAGCTGCCTGAGCTGA
+>generic425
+CAATCACGTTGACCGCATCGAGCCGACCACCCAGCCCCACTTCCAACACCACCGCATCCAAGGAATGAGCAGCCAAGCAG
+TGCAGGATGGCCAAGGTGGTGAACTCAAAGTAAGTGAGCTCCACCGCATCACCGCCCGCTTGGCGAGCCAGCTCCACCGC
+CTTGAAGTGCGGCAACAACGTCTCGGCATTGACGATCTCGCCATTCAAGCGCAGACGCTCTTCGAAATGCACCAAGTGGG
+GCGAGGTGTACACCCCCACCCGATAGCCGGCCTGCAACAAGATAGCCTCAAGCATGGCGCAGGTTGAACCCTTGCCATTG
+GTACCCGCCACTGTAAAAACAGGCACCTCAAAATGCAAACCCAAGCGATCACGCAAACGCACCACCCGTGCGAGGGTGAG
+ATCAATTCTCGGGGATGCAGACGCTCGCAATGCGCAAGCCACTCAGCCAGACTCGAAGGAAACATGAAACTGCTTTGCC
+>generic426
+CTGCGGAGTGCGGGTGAAGGTGAGCTGCGCCACCGGGGCCGCGGTGGGGCCGGGGCCGGCGTCGAGGGCGGAGGAGCCGT
+GCACCGCCGTGTTCTCCCCGGGGCCGCCGTCGCTCACCCCGCCGTCGCGCTTGAGCACCCGAAACCCACCGTCGCCGCCG
+AAGAGCCGGGGGCGAAAGCCGGCGTCTTCGGGCAGGTGGTGGGTGGCGGTCACCACCAGGCTGCCGCCGTCGTCGCGCAC
+CTCGTAGGCGAAGGCCTCGTCTTGCGCGTGCAGGTAGTGGCCCGAGAGGTCTGCCAGGCACCCCTCCGGGCACCGCCAGC
+GGTGGGGGAGGCGGGGGTGGCGTCGGCGGCCGGGGGCGACCCCAGCAAGAAGCCCACGCACGAGTGGTGT
+>generic427
+GGCCGCGCCGTCTTCGCCGAGCGTCAGTCCGAAGACGCCGGGATACTCGTTGCCAGCGAATGAAGGAATGTTGGTGAGAC
+ACTGCATCGCCGCGTGATTGCCTGCGTCTTGCAGCCACAACATCCGCCCGCCGGGAGTCGCCACCACGCGCCGTCCGTCC
+ACGGCGATGTCTATCGGGCAACAGAACTGGTCGCGCCAGTTCACGCGGCCCTTCTTGTAAGCCAGCCAGTCGCTCGCGCT
+CCAGCGGTTGCCGGGGAACTTCAGCACCTCGCTGACATAATCCCACTTCCAGCACAACTTGCCGTCCGGCTCCACCGCGT
+AGAACTGCGAGCCGAGCGTGGCGAAATAGACCCGCCCGCCGCTGGCCACCGGCGCGCTGAAGATCGGCTCGCCGCAGTCC
+ATCTCGCGCACCAGTTT
+>generic428
+CGCTGGGTTGCGTTAGGGCTTGTTCCAGTTTGGCGTTTTTAATGTCAATGACCAGCTGGGAGTTCTGCACGAAAACCCGA
+TGTTTCGGTGATGCACTGACATCAAAGACCATGCGGGTTTGTTTTGCCGCTTGTGAATAATGTAATGAATTAATATCGAC
+CGCTTGTCCATAGCTGGGCAGTGATAATGTTAATAATCCAAAGACAAAAAACTTTTCCAATGATTTCTCATGGCTACAAT
+CCACAAAAGTAATAATCTGGATTAGATTATAGCAGTATGTTGTTGTTTTTCCAGAATAGATAAAAAATTTTTAAGCGGGT
+GACAGGGTATTAAAGTGAATATTTCGACCTAAGTCTTGGGCAGTTAAGGAAATAATCATATCGGGTTCGGGTAAAAATCC
+TGTACCGCGTTCTGCCCATTCAATAAAACACAGGCTGTTTTGGTCAAAATAATCACGAATCCCCATCCATTCCAACTCTT
+CAGGATCATTTAAGCGATATAAGTCAAAAATGAAAAATTTTGCGCTCGCCCAGC
+>generic429
+GCTGGATGCGGTTCAGGCCTTGGCTGGTGCCGTCTTGCAGCGTGGCAAAGCAAGCCTTGCCCATCACACGCTTGAGCATC
+ATCCGACCGGCCACGCTGGCTTGAATCGGCTCAGCGTCGAGGGTGGCAGCATCCTTGCCTTCGTGCAGGCGATGCAAGTC
+TCCGGCGTGGTCAGTGGGTTTGAAATCGTTCGGGAAAGCGATGCCTTGGGTTCGCAAGGCGCTCAGCTTCTCACGCCGCT
+CGGCGATGAGTTGGTTGTCGTCAAGGGAGGCGGTCTGAACAGTCTGGGATGGGGCGGGTGCAGCGGTCATCATCAACTCA
+TGGGATTTGCTGCAATTTTAGGCTGCCGATGCGGGGTGGGCCGATAAAATCAACGGTTTGCCCCCAGCGAGGCTCCCATG
+AGCGCACCGTACCCGATCACCGACCGCAAGATCCGCTTCGCCCTGGTGGGTTGCGGGCGCATCGCCAAGAA
+>generic430
+GGGCACGGTCAGGATTGATGAAGTCCTTGCCCGGTCCATTGCCAGTGACAAGGATGGCGTTAGGCTTGCTGCCGAACCGT
+TTGAGCGGGAACACTCCCTGGAAGTGCAGTTGCCGTTTCTGCAGAGTTCGCTGCAGGAGTTCACCCTGGTGCCGATCCTT
+ATCGGCAGGATGACAACCGAATCCTATCGCCACCTTGCAGACCGGCTGGCGACGATCCTTAAAAACGATGAGAAATCACT
+GCTGGTGATAAGTACTGATCTTTCCCATTACCATGACAGCAAGACCGCCGCGGGCATGGATAAAAAAGTCCTTGATGCGG
+TTGAACGGATTTCTGCCGGAGATCTGGAGCGGCTTCTGCAGAGCGGTGAAGGCGAAGCGTGCGGCGGCGGCCCGATCCTT
+TACGGCATGGCAGCGGCCCGTGGCGCCGGGGCCACCGAAGCAACGATCTACAGATACGCCGACTCCGGGGCTGTGTCCGG
+AGATACCAGGAAACGAGTGGT
+>generic431
+TTCAACTGTAAACTGACTTTGTCACGAATACCTAAGCGTTTCCACAGTCTGTCCATCAATAAAATAAGTTCAGCATCAAT
+ATCAGGTGCGGACATTCCATAAGTTTCAACGCCCAATTGGATAAATTGGCGATAACGTCCTTTTTGCGGACGTTCATGAC
+GATACATCTGCCCGTAATACCATAAACGATGCACCTGATTGTGTAGCAAGCCATGCTCTAAACAGGCGCGTAAACAGCCC
+GCTGTGCCTTCGGGACGCAAGGTAAGAGAATCACCATTGCGGTCATCGAACGTGTACATTTCTTTTTCAACGATGTCGGT
+GACTTCGCCGATAGAGCGTTTGAACAGTTCGGTTTTTTCGACAATAGGCAGACGAATTTCTGAGTAGCCGTAACAGCTCA
+ACACCTCACGGATGATAGTTTCAGCATACTGCCAAAGGGGAGTTTGATCGGGTAGCACATCGTGCATTCCGCGTATTGCT
+TGTAGTGTTTACGAGTGGTGT
+>generic432
+GTCGTTGTGGGACTGTTTTCATGGATAGTCATCCGTTCGTTTGGTATAGCTAAAGAATCCATCGCCAATGAGCGTTACTT
+TGCCGCTCTGCTCTCGCAAGGGCTTGGTGTCTGGATGGGCGTGCAAGGCATTATCAACATGGGCGTGAACATGGGTCTGT
+TACCTACCAAGGGCTTGACCTTGCCATTGTTATCGTTCGGTGGCAGTGGCATTTTGGCGAATTGTATTGCAATGGCGATT
+GTACTCAGAATTGATTTTGAGAACAGACGCTTGCAGAAAGGTCTGCCGGCATGAGTAAAACGCTAATGATTATGGCCGGC
+GGTACTGGTGGGCATGTCTACCCTGCCATGGCTGTTGCTGACCACTTGAAAAGCATGGGCTGGAACATTGTTTGGCTATG
+CACGGAAGGCGGCATGGAAAACCGTTTGATTGAAGGCAAAGGTTACCAAAAGACCATGATTACCATGCGCGGTGTACGTG
+GTAAA
+>generic433
+AAGTAATTCAGCGTTGAGATCACAAAAAGCCCCGCTTAGGCGGGGCTTTTCTTGGCGATGTCAAGCTATACCTTGCCGCA
+ATGAAGTTCACATCCGTCTTCTTTGTCTCCTTCAGCATAAGCGTGTTGACCCACGCAGCGGTAGCCAACCCAGCAGCACA
+TCAAGCGCCGCTGTTGTGGCCCCACGATCAACCCTGCGCGGTGCAGCAGCAACCCATGCCCACCCCTGTGACGCGACCCG
+GTTGCGCCTTGGCTTGGAGCCTGACACTTGAGACCACGCAACAGCTTCAGATTTGCCAAGTGGAGAGCGATCTGGGCCGA
+GTGCGGTTCAACTGATCAGCACGGACGATGATCCGCCTGCGTGGGAAGTGGCGGTGATGGGCGCGACCTTCGAGGCCGAC
+GCCGTACGCCTTCAGCGCGCGCGCCGCACCGAAGATGGCAGTGGGCCACGCTGTTGGCCGTGCGAACCGGGCAAACCC
+>generic434
+ACCGGCTATTCGGGCGGCGGCAAGTCGATGATCGAGCAATACCGCAGCAGTGGGGACGCCAAACTGGCCTCACCGCGCCC
+CTATGCGTTGGGTCTGAGCCACAAACACATCCCTGAGATGGGTGCCCATACGGGCCTGAACAGCGCCCGGTGTTCATGCC
+GGTGGTCGGCTCTTTCTATCAAGGGTTGGCCGTGAGCGTGCCGCTGCATCTGAGTAGCTTGGGCACAGGCGTGACCGCCG
+AGCACCTGCATGCCGCTCTGGCTGCGCGCTATCAAGGCGAACGCTTTGTACGGGTCTTGCCGCTGAATGGGACCGAAGCG
+CTGGAGGATGGCTTTTCGACATCCAAGCCTGTAACGACACCAACCGGGCCGATGTGTGTGTGTTTGCCAACACCAGCCAA
+GCGGTGCTGATGGCACGCATCGACAACTTGGGCAAAGGTN
+>generic435
+AAATAATTCAGTAATAGCATTGGAAGTACAAAACCAAGCCAGGCATAACGAATCGGTTTTAAGCCAAAATGTCCCATATC
+GGCATACAAGGCTTCTGCTCCAGTGATTGCTAATACGACTGAACCCATAATCAGCAACCCATTCCAGCCTAATTCCACTA
+ACAAATGCAATCCGTAATAGGGATTAATCGCCATTAATACAGGCGGGCATTTTGATAATATTGACAATACCGAGAACACC
+TAAGATGAGAAACCAAAGGCACATAATCGGTGCGTAACAGGATTCCGATTTTCCCCGTTCCTTGGGTTGGAGAAAAAACA
+AGGCTAGCAAGTACGGCAAGGGTAATGGGCAGCACATAATGTTCTTGTACATCAAACCCTACTGAGCAACCTAATCAACA
+ACCTCCACAACAGCAACCTCGT
+>generic436
+CAGCGAACGACTCAACAGCAAACTTGCGTGACTTGGCGATTTCGTCTTCGGCGCGGCGACGGATATTTTCCATTTCGGCC
+TTGGCGCGCAGATAGGCATCTGCCAACTGAATGTTCTTGGCTTCCAACTCAGCCACCCGGGCCGGCATGTCATCAATGAC
+TTCGGTGGCGGGGTTGGCAGTTTCGGTGGGATGGGTTTCAGTCGTCACGTGCGGATCCTGAAAAGCATTGAATTTTGAAA
+AAGGCATCCTGAATGTCAGGCTTGTCCAACAAGCTGGGGCTGGGTCGGTGTTTTTCAAGCAGGGGGCCGATTTTTTCAGC
+TTTGACGAAGCTTGATCACTGGCAAGCGTGATCAAATCCGTGACCTTGGATGAATTGTTACATCTTTGCCCCGATTCGGG
+GTGTCTGAAGTTTATGGGATGGGAAATAATCCCACATGGAGACTCCAGACAATGACGCTTATGACCCACACGGCGCCAGC
+CCCTTCTGAACCGCCCGCAGGCTCTGACCCCC
+>generic437
+GCCATCCCCGTCGATGGGGAGCGAGATAGGCTCGGGCGCACGGATGGCCCCGGCGGAAGCAAGGTGAAGCGGAACGGTGT
+CGCTGCCGTCGCCACTTAGACGGTAGAAATCCACCACCACTTCACGGTTTTTCCTGTCCTCTTCTCGGTCGTCTGCCGTG
+GGTGCGAGCACCAGGCGGCGCCGTTTGCGCTCGTGCGACAGCGTTTCTACAGTCAGCAGTTCGCCATCCGGAGAAAGAAA
+CACGGCGGCCGGCGTGCCTTCTCGTTCCGGAAACCGCGCGGCTTCAAACGGCTCCTTCGTGTCGAGCCGGGCCAAGGGAG
+CAATCACAGACAGCTCGCGGCCGAGCCGCAGCAGAAAGCGGCCACGCCCAAGGTTCCACAGATACTGACCGTGATCGGCG
+GTGTGCCAAACGGTGTGGGCCAGGACCTTGCCGGAAGGCAGGGAGACCAGATAGGCCCCGACCAGGCGACCATCGTCGCT
+CTCCGGTTCGGCGTCTTTCGGTTCGCCTTCTCTCTGTGGCTGGGCCCGT
+>generic438
+CAACACTATCAGTGAAAATATCGTGGCGTTTCGGAATGAAAACGGCGCGTTTACCAATCGCAGACAATTGAAAAAAGTCC
+CCCGTTTAGGTGAAAATACCTACGAGCAAGCGGCAGGATTTTTGTCGGATTATGAATGGCGACAACCCGCTTGATGCTTC
+TGCGGTGCATCCTGAAGCCTATCCTGTTGTGAATGCGATTATCGAAAAAAGACGGCAAATCCATCCGCGATATTATCGGG
+CAAAGTAGTTTTTTACGAAATTTGAATCCGAAAGATTTTACCAATGCGTTTTTTGGTCGTACCAACTGTGACGGATATTT
+TGTCTGGAGCTGGAAAAACCGGGACGTGATCCACGCCCTGATTTAAAAGTGCGCAGTTTAAAGAAGGCGTGGAAAGTATC
+AGCGATTTAAAAGTTGGGA
+>generic439
+CCGACTCACCGCTCAAATGGGGCCGAACCGAAACGGGATTCGGCAAGGGTTCGGCTCGCTAGCCCCTTAGGCGTTCACCA
+AATCGAGAAGCTCGCCGGGGAGTTTCGGAACGGAAGTTGCTTTAGCACGGCAATGGACCGCGCTCTCCCGCTGCGCTCAG
+GGAGGGCGCCAAACCGGGAACTCTCGGCATCAGAAGCATTATGGACAATCGCTTGGACAGAATGAACGAACACGAACAGT
+TCAACACCGGCAAAAGGCGGCACCCGTACGGGCAAACTCCGGTCCAAGAACTGCAAAAAGCGACCAGCGAACCTTCAGAA
+CAACTACAGCCCGAACGACAAAATGGAATGGCCGGCAAAGCCTGCAGAACCATTTAGCAGAACTCGTATGAAGCCAGCAG
+GCCAACCTGGATCCAACCCGGCGCCCCCCACGATCATGAAACAGATAACACCACTCCTC
+>generic440
+ATTTGATGATGTATAGGGATCATCTTTTGCGGCGGTAAAACTGGCATTTGCCATGCGGGTTCCATCGCCGTTTAGCCAAG
+GCAGGTAAGTGACCTCTGGATTGTAGTAAAGATATTCATCGCAGGTGATCTGATGCGCCAGTCAGGAATACTTACGGTAG
+TAAAGGCAGAGGTGGTTATGCTGCCGCCACTGCTATTATAGTTACCATCTTTTTGCAAAACGGTGTGGTCATTAGTCTGA
+CCATTGTTGGTGGTAATAGTACAGGCAGAACCTGTTGCACCGTATTTGCACGCTTCCCAGTAATATTTGGTCAATACATC
+CCAGTCCATAGAACCGGAATCATCGAGCTGAAACATAATGTTGGAAGGTACACCACCACCACTGCTGGTGGCAGTAAACA
+GGGGTGCATCGGCTATTGCGCCGGGTGCGGTATAGGAAACCGAAGTAACCAGCATTCCGCAAACGCCCGCCACGAGTGGT
+GT
+>generic441
+CGAAGATGCTCGAAGAAAATCTTGACGACTACATCGCAAACTTCGAGAAATACATGGGGCCGGCTCAATAGAAGTCGCAA
+ACCATGCGATCACTGAAGCTAGTCAAGGTCGTTGAGCGGGTTACATCGCGCGCGAGGCCTAACCCTTCCTTCAAGCGGAC
+CCGTTCCGGCCGGCTTCGCCGTCCTCCACGGTCCGCTTAAGTCAAACGTTAGCCATCAAATGAGCCTCTCGCGCCGTACC
+TTTCTTGCTCTTTCCGCTGCCTCAGTAGCGGTATCGCTGAACGGGGGCTGCACAACTTCTAATGTAAGAACAATGAAGCC
+ATCCAACTCCGTCGCCTCCTTGAATGAGTTCTTGGCCCTCCGTGGTCTCAATCTGTCAGAGCTATCCATACCTCAGTTGG
+TTGAAGGCACTTTGTCGTTCTATCAGTCGGTTCGTGCTTCTGGCCTCGCCAAAGACCCACAGGCCGACATGCTGCTGTTC
+CAATGGGGA
+>generic442
+CGGTGATGAAGGACGGCGTGGTGCAGCAGTTTGGCCGCCCGGATGACATCTACCGCCGCCCGGCCACCCGTTTTGTGGCC
+GAGTTCATCGGCTCACCCGCCATGAACCTGATCGACGGCAGCGTGGGCCTTGACCGGGCCTTGATGCATGTGTTGGTGCA
+TGGCACACCCGTGGCCCTGCAAGACGGTGCCCAGCGCGTCGTGCGGGTCGGCCAAGCGCTGAGTTACGGCCTGCGGCCGG
+AAGATGTGGTGGTGAACCCCGAGAACGGCCCGGGCTTGGCGGGTGAGATCACCTTGGTCGAGCCCACCGGCCCAGAAACC
+TATGTCAGCGTCGATACCGCCGTGGGCGTGCTCGTCGCCCGCATCCCCGGACACGAGTGGTGT
+>generic443
+GCGGGCCCGAGCGGCCAGATAAGCTGCCGAAGCTGGGCTCAAACCATCGGCAAAGACACTTTGCTCAAGAAACCGTGCGT
+CCGCAGGCGCTGCGAGATTGTGTACCGCCGCCGCAAGATGATCAGCAGCATTGACGGCCAAAGTGCGCGCGGCATTGGTG
+TCGCCCGGTTGATTGATGAAACGGTCGGTTTCAAGCAACACTTCGTCGCCCTCAAGACGCACAAAACCCAAGCGCTGCAA
+CTCTTCAAGCAGCGTGCGCGGATGCACATCGCTGGAGACCTCACGCGCCAAAGCCTCAAAGCTCGGCGGTGGGCCGTGTC
+GAGCAAGTCGGGGCAAGGGCACTGTGCGCCCGGTCGATCCGGGGGCGACACCACGATAGCCGGGATCGGTGATCCAGCGG
+GTGAACAACATGGCTGCGGGGGTGGCGCATGAACCACCGAAGCGGGTGCATCCTGCGCAAAAAGCCGGACATCCTTGCGA
+T
+>generic444
+AGACGTTCCCTGAGCCGCGCGAGCTCGTCGGCGCTCAGGTCCAGGGCCAGCCGGCGGTCCACCGGCCGCCCGTCATCGAG
+CCGCGCGCCATGGTGCAGCCACTGCCAGACCTGGGTGCGCGAGATCTCGGCCGTGGCGGCGTCCTCCATCAGGTTGTAGA
+TGGGCACGCACCCGTTGCCCGACAGCCAGGATTCCAGGTACTGGATCCCGACGTCGACGTTGGTACGCAGTCCCTTCTCC
+GTGATCGTGCCCGAGGGGACCTGGAGCAGGTCCCCGGCGCTCACGTGCACGTCGTCGCGGCGGTTCGCGATCTGGTTCGG
+CGAGTGCATGTGCTCGTCGAAGATCGCTTCGCCACCGGCACGAGGCCGGGGTGCGCGACCCAGGTACCGTCGTGGCCCGC
+GTGCACCTCGCGGAGCTTGTCGGCCCGCACCCGCTCCAGCGCAGCCTCGTTCACGAGTGGTGT
+>generic445
+ATGGCCACCAAGGCCCCGCGCCGATCCCCAAAGAGCGTCTCCACCAAGGCTTGTAAGCGGATATCGAGCGTGAGATGCAC
+GGTGTTGCCTGGCGTGGCCGAGTCGGAGCGCAGGCGTCGCACTGGCCGCCCCCCGGCGCTGGTTTCCACCTCTTCGACAC
+CCGTCAAACCGTGTAGTTCGTGCTCGTACTGCTGCTCAATACCGAGCTTGCCGATGTATTCGGTGCCCCGGTAATTGGCT
+TGATCTTCTTCTTCCCAATCCTCCATCAGCTCTTTGTCACGCTGATTGATGCGACCGATGTAGCCCAGCACATGGCTGGC
+CAGTTCACCGTAGGGGTAGTTGCGAAAGAGCCGCGCTTTGATCTCGACGCCTGGAAAGCGGAAGCGCTGCGCTGTGAAGC
+GCGCCACCTCTTCATCGCTGAGCTTGGTGCGGATCGGCACCGACTCGAAGCTCTTGCTTTCGCCCGAGAGCCGCTTAAAG
+CGCCGCC
+>generic446
+GGCGGCCAACCTCTCGAACGGCGTGCCGTTTGCGACCCCGGTGTTCGACGGGGCCAAGGAAGAAGAAATCCGCGCCATGC
+TCAAGCTGGCGTACCCGGAAGACATTGCCAAGCGCAAGGGCTTGACCGACACCCGCACGCAGGCTTGGTTGTGCGACGGT
+CGCACGGGCGATCAGTTCGAGCGTCCGGTCACCGTGGGCTACATGCACGTCTTGAAGCTGCACCACTTGGTGGACGACAA
+GATGCACGCCCGCTCAACCGGCCCGTACTCGCTCGTGACTCAGCAGCCGCTGGGTGGTAAGGCGCAGTTCGGGGGTCAGC
+GCTTCGGGGAAATGGAAGTCTGGGCCTTGGAAGCTTACGGCGCGGCTTACGTGCTGCAAGAAATGCTGACGGTCAAGTCG
+GATGACGTGAACGGTCGGACCAAGGTGTATGAGTCCATCGTCAAGGGTGAGCATTCGATCGAAGCCGGCATGCCGGAATC
+GTTCAACGTGCTGGTCAAGG
+>generic447
+CGAGGATGCGCGAGGTGGAGTCGAGCGGGTCGACGGCGGGGTAGATGCCGATCTCGGTGAGCGCGCGAGAGAGCACGGTG
+GTGGCGTCGAGGTGGGCGAAGGCCGTCGCGGGCGCCGGTCGGTGAGGTCGTCGGCGGGCACGTAGATGGCCTGCACGGAC
+GTGATGCGCCCTTCTTGGTCGAGGTGATGCGCTCCTGCACGCCGCCCATTTCCGTCGCCAGCGTGGGCTGGTAACCGACG
+GCGCTGGGGATGCGGCCGAGCAGCGGCGGACGACCTCCGAGCCGGCCTGCGTGAAGCGGAAGATGTTGTCGATGAAGAGG
+AGCATGTCGCGCCCCTCGACGTCGCGGAAGTACTCGGCGATGGTCAGCGCGGACAAGGCCACGCGGGCGCGGGCGCCAGG
+CGGCTCGTTCATCTGGCCGTACACCAGCACGGCGAGCGACTTCTCGAGGTTGTCGAGCTTGATGACGGCGTTGTCGCCGC
+CCTCCTGGAACTCCA
+>generic448
+CTCGTAGGCCCAGTCGCTGGTCTTGAGCCGTTGATAGCCGTAGGCCACGCGCACCGAGCTCGCCGCGTCCAGCTTGTACG
+CCCCACCCAGCCGCAGCGCGATCGAGTCGGTGCTGACTGTCGGCAACGCTGTGGCCGGAATGTAATAGGCCGCAATCGTC
+GGATCCACCGCCCCTGCAGCCACGCTGCCCGCGTAGGGGTTGTTGACGTAATTACCACCACTGAAGCCCGTGTCGCTGCG
+CAGCTGACTCAGAATCAGGCTGCCGCGCACATCCAGACTCCCGCCCAACAAACCGGTGCGCGCCACACTCAAGCCCAAGG
+TGTCGATGGTGTCGCGCATGTCGGCCGACCAGTTCAGACACGGATCGATCTTGTTGTTGGCGTTGCGGGTGGCGATGTCG
+GCGTAGCAGCCGCCCGAGATCGCGGTGGCCCCACCCACGTTCGCGGCAGCGCTGTTGGCGGTGTACGAGTTGCCGGCACT
+GC
+>generic449
+GCGATTTCCCAATCGAAAGAGCCGTCTTGGTGGGCTTGCTGGGCGCGCAGGGTCGATGCAATCGCGAACGCATCTTGGGC
+CTCACGGGTGAAGCCGTATTTTCGACGCACTGCTCGCCAAACACACCCATTGCTTTGCCACCACCGTTGGGCAAACGCTC
+ATAAGCGTCTTCCAGCCCATCCAGCGCCATGTGGTCGAACATGGGCGTGGTGCCGTACTTCACGCCCTTGCGCGCAAACA
+TCAGGTGCGGGGCGTTGCTCATGCTCTCCATGCCGCCCGCGACCAGCACCTCGGCTGAACCTGCTCGGAGCATGTCGTGC
+GCCAGCATCACGGCGCGCATGCCCGAGCCACACATCTTGTTGAGCGTCACCGCGCCGGCTGAAAGCGGCAGACCGGCTTT
+GAGAGCGGCTTGGCGCGCCGGGGCTTGGCCTTGGCCCGCCATGAGCACACAGCCCATCAAGACTTC
+>generic450
+GCCACGTTGCTGGCGACACCGCTGGCGCTGGCGCGGAAGGCTGAACCGCGTACCTGGATCTGGCTGTTGTAGTGAAGCGT
+GGCCGGGATGTTGTCGATCTGCGCAAACACCAAACCGCTTTGCAAGGCCCCCAAGGCTTGGCCGACATCCAGCATCCCTG
+AGCCACAGGTGTCGTTGGTGCAATGGCAACTGGGTTGTGCTGCGGGGGTGATGGCCCCGGCGCTGGCGGCACGACACAGA
+TGCCCACGGTGGGTGTGGTCGCTGTCGCTGGGAAGGCGCGACTGGTGCCTTGCAAGATGCGCTTGACCTGATCCGGGGTG
+AGCGCTGGGTTGACCGATAGCAGCAGCGCGGCCGCACCCGCCACCATCGGTGCAGAAAAGCTGGTGCCTTCGCTGACGTT
+GTTGATCAACGTGCCGTCGCTGGTGAAGTACGAGGCCCATTGGACCGCCGTGGGGTTGGC
+>generic451
+CCTGAGCACGCACAGCCTGGAAGAAAAGCTCGAAAAAGCGAAGCGCGCCGGGAAGCTCCCGAAGGTTCTGGTCCCGGTCC
+ATTTCTCGGGACAGTCCTGCGAAATGGCGCCGATTGCGGAGATGGCAAAGCGTTTCGGCTTCGCGATCATCGAGGACGCC
+TCCCACGCGATCGGCGGAGGGTATGGCGGGACGACCATCGGAAGCTGCGCTTTTTCAGACATGACCGTTTTCAGTTTTCA
+TCCCGTGAAGATCATCACGACCGGCGAAGGCGGCATGGTCCTCACCAACCGTCAGGACCTGTTCGAAAAACTGGTGCGCC
+TCCGCAGCCACGGCATCACACGCGATCCCGACCAGATGCAGGGAGAGTCCCACGGCCCCTGGTATTACGAACAGATCGAG
+CTCGGCTTCAACTACCGCATGACTGATATCCAGGCAGCTCTCGGCACAAGCCAGATGGGCAATCTGAATACGTTC
+>generic452
+CATGAACCGCGTCAGCAAGAAGGCGATGAAGCGCAGCAAGTACTCGGGCACCAGCAAGAAGATGTAAATCCCCACCAAGG
+CGTTGGCGATGCCGGTGACCAGAAAGACCTGCGGCACCGTGGCACCGGCGCTCAGCATCAAACCGGCCGCCAAGGAGCTC
+ACGATCATGAACAGCGCGTTCAAGATGTTGTTGGCCGCGATGATGCGCGCCCGGTGTGTTGGCTGGCTGCGCAGCTGGAT
+CAAGGCGTACATGGGCACGCTGTAGAGCCCCACGCACAGGCTCAAGAGCAGCAAATCAGCCATCACATGCCAGTGCGCGC
+TCTGAGCCAAAAACTGCGCCACCGTTTGCAGCGCCACCGGCGGCAGGGCGCGCGAGGAAAAATACAAGTCGAT
+>generic453
+TTCCTTCGTTGGTGCATATTTCACGCAATCCTTCAAGAAAGCCAGGGCGTGGAGGAACAGTACCCATGTTTCCGGCAACA
+GGTTCAACTATGATGCAGGCAATTTGACCCTTGTTTTCAGCAACCAGTTTTTTGACCGATTCAAGGCTGTTAAATTCACC
+GGTGAGAGTGTGCTTAGCTAAATCTGCCGGAACCCCGGGGGAATCTGGTACGCCAAAGGTTGCTGCGCCTGAACCAGCTT
+TAACCAGCAGGGAGTCGGCATGACCGTGATAACATCCTGAAAATTTGAGAATTTTGTCACGTCCGGTGTAGCCTCTGGCA
+AGACGGATTGCACTCATGGTCGCTTCTGTCCCTGAGCTCACCATGCGAACCATCTCAATGGAAGGACCGCTTCAATGACC
+ATGTTGGCGAGAGTTATCTCGCGCACGGTCGGGCGCCAAAGCTTGCTCCGCTCTCAACGGTTGATTTAACTGCAGCCACA
+ACGTCA
+>generic454
+AGCACCCCCGGCAGGCCGACGTGCTGAAGGCGCTCAGCACTCCAGCCCCCAAGCCACAAGGGGAACGGGGTGCGATCGAG
+CTGATCGCGCATCAGCCTTGCGGCTGTTGCGTCGTCGGGGATGCGCAACAAGGCTTCGGCCAGACGCATCAGGGCCAAGC
+CCTCAGGGCTGGAGATCGGGTAGCTTTGCAGCAGCGACTCCAAGGCCCAAAAAGCGGCGGGCTGAGACCGAACCGCTTCC
+ATCCAAGGCCGGGCGCGTTGGGCCACGTGTTCCCAGTCCGCCGAGGACAGTCCATGCAGCCCATGCAACGTTCGAGCTTG
+GTGGCTTTCGTCGCGCATGGTGGTTTTTGTCGCAGGGGCCTCAGCTGCGCGTGCCAAAGATCGCTGTGCCGATGCGCACC
+AAGGTGGCACCTTCAAGGATCGCGGCTTCCATGTCCGCGCTCATGCCCATGG
+>generic455
+GCGCAGTGCTGGGCAATCAAGTACGGCGCACCCGACTCGCTGTGCCGCACCACAAACATATCGGCGTGCATGGCCGAGAG
+GTTGGCGATGGTGTCGAGCAAGCTCTCGCCCTTGGCGGCACTGCTCTTGGCGATGTCGAGGTTGATGACATCCGCGCTAA
+GGCGCTTGGCAGCGATCTCGAAGGTGGTGCGGGTGCGGGTCGAGTTCTCGAAGAATAGGTTGAACACCGACTTGCCGCGC
+AACAGCGGCACCTTTTTTACTTCCCGGTCGTTGACCGAGAGAAAGGTGCCGGCGGTGTCGAGAATCTGGGTCAAGACCGC
+CTTGGGCAGGCCTTCGATGGAGAGCAGGTGAATGAGCTCACCGTGCTTGTTGAGTTGGGGGTTACGGCGCGAAAGCATCA
+AGCGGCCTCTTGGATCGAAAAAGTAAAACTACCCTCGCCCGCCCGGGCCAGCGCGAGCTTTTGGCTGGGTGGCAAGGCCA
+GTTTGGCGGCGGCAAAAGCGGGCT
+>generic456
+CTAGGGTATTCGCATACTGCCGTGTATCAACTACAGACCAAGTAACAGAGAATCAAGTGCTAGAGATTAAGAATGCAGGT
+TTTGCGTTAGAGCCTCATAGGATAGTAGAAGAAAAGATTAGTGGCTCTGTAGCTGCATATGAACGTCCTGAGTTCAAGAA
+GTTATCGGAGAAGCTTGAGGCTACAGATGTACTCATAGTAACCAAGCTAGACCGCCTAGGTCGCAATGCTATAGATGTTA
+GGTCTACAGTTGAGAAGCTAGCACAGGCAGGCGTAAAAGGTTCACTGCTTGGCACTAGGGGGCGCAGACCTCACTAGCCC
+TGCTGGTAAGATGACTATGCAAGTAATTTCTGCTGTAGCTGAGTTTGAGCGTGACTTGCTTATTGAGCGCACGCACTCTG
+GGCTTGATAGGGCTAAGGCAG
+>generic457
+ACGCTTCGCGCCCGGATGGATCTGGCTCCGGATGATGGCCTCGGCATTCGACACGGGCACGCTGGCGGTCGAGCCCTGGT
+ACTGGACGTCGCCGATGGGCACCACCTTGACGGCCTGGCCCGCGCTGGTCGAGGCCCCCCCCGTCTCGCCGCCGTGCAGC
+GACTGGAGCCCTCCCCCGCCCTTGCCCGGCTGGATCGGGCCCCCGGCACCGCCCGGCATGTTCAGACCGCTGCCGCTGCT
+GTTGCTGACGCCGCCCTGCCGGTTGGCCAAGCTGTTCAGGTCGACGGGCGCCCCGTTGTCGTCCTTCATGGCCCCGCTGA
+GGGCTGCGCCGCCGTTCAGCGCGGCAAGGATGGCGATTCGCGCGTTGTCGGCCTCGTTCAGGAGCCCTTGCACGACCTTT
+GCGCTCGGTGCCTGGCCCTGCGACGCGCTCTGGTTCTGGGCGGGCGAGGGAGTGGAAGGAGCCTTGGTGGGGGCCGGCGC
+CGTGTCCGCCGTGGTCGCGGCCTGGGTCGGC
+>generic458
+AAAATATCGATATTAAAGGCTTATATACCGCCGGCTATAAAGGCACGGTCGGACAGAACACCCATACAGTCACAGTCGAG
+GCCGATAACCTGGTGTGGGGTTCAGGCACGTTTACTGGTAGTTCGGTAGGGGATGGGTCGAAGGATGTTACATTAAACGG
+CAGCTTTACTCTATCAGGCGGCGCGTTCACTTCTACTGCAGGCATATTCACAGACTGTGGTGACTGGACCCACACTGGAG
+GCGGCACTTTCAGTGATGGCGGCGGCACTGTTAAGTTTTATGTTCCTACTGCTGGTACTTCTCGAACAATCGACGTAACT
+ACCAGTGAAACATTCTATAGTCTTACAACAGATGTAACTGGCATGGGTGGTGGTCTCAACAATATTAACATTGCCACGAA
+CGATACCTTGATCGTGTTAGGCACTTTTTACACAAACAGGAGCAAACGGTAATACCACCAGAATAAACACCGGCACTATC
+GAAGTACGCGGCAATGTGGTGGTGGGACGAA
+>generic459
+GATTTTCAGCCGGTGCCGAAGCAGAAAGCAGCGCATCAGAGGCTTTTGCATTCGCCGATAAGCCACTCGATGCCGGTGTC
+GAAACCAGAGATGGCCCCGGTTTGGCAGCAGAAGCCACGTCACCAGAAGAGGCCGCTTCGGCCCTAAGCCGCGTCAACTC
+TTTCTGAGTCCGGGCAAGTTCATCAATACGGCTTGCCGTTTCACGCTGCGTCCGCTCAGCCGCCACTTTGTCTTCGGGGG
+TTAGAGGAGCAGCGCCTCCCTTACCCACCGGCGATTTTTTGTCGATGGTCAAACGATCCGGCGTCGTGACCGCCGCCTGA
+CGTCGATCTTGAACCTCTGTCTGGACCTTACCCGTGGAGGTCGCTTGACGCGAAGTATCCACCTCGACGGGTGCCGGCAC
+GGCTGCCGCTAAGCGCTGCCGATAAGCATTGAAGTCCGCACTTTGCACATGAATCAATTGCCGTGCCTGTGCCGGATCAA
+T
+>generic460
+ATTAAATTACCCGGATGCCAGCGATAGACGCAAACAGGTCTCGGTATCACGCCCACTGAACCTTCCACAGCGAGCTTGAG
+ATAAAGCTCCGAGTCGGTGCTTAAGTTGTGCTCATTGGCCAGAAAACCCAGTCTTTGGGCGTCGCTGCGCCGGAAAAGCA
+TGTTGCACAGGATGATGTCCTGCGGTGCCACGGTCCCGCGTGAGGCAAAAACCTTTTGCCATCCACCACACCCTCAAAGG
+GCGGCGTCATGCGTGTGGCCACCCCGGTTAACGTATCCAGCACTTCACCGCCAGCGTAGATGAAGGTGGGTTGATGGGCG
+TCAATCAGGGCGCAAGCATCGCGCAGGTACTGGTGTCGGTGAAATGTCGTCGTCCGACATCAGCAGAAACCAATTCAGTC
+TGCGCCAGCTCGTAAATGGCTTTGCGCCAATTACCGACCATGCCGATGTTGTTGGTATTGCGTGAGTAGCGTATACGGGG
+GTCACCAGCATACCGC
+>generic461
+GTGTTGGAAGGATGAAACCCTATCACAGCCGCATCTCTAGCCGCAGGTTCCATGTGGTCCATGTGGTGGTGAGGGTATCG
+GCCGATTCGATCATGTTGGCGATGTTCAGGGTGCGGCTCAGACTTTGCTGCTCTGGCCCAAGGTTACCGGCACCCAAGCG
+CAGGGATACGGCGGGGCTGAAGGTCCACAGGCCATAGACGTCGATGACCCGTTTTCGGCCGGATTCGATCCGCTGGCCGT
+CCTCGGTGGTGACCGTGAAACCGGGCGTGAAGCCTAAATTGCCGCCGATCTGCAAGGGCCAGCTGTTGCGCAAGCGGTAA
+TCAGCACCGAAGTTGGTGATTTGCCGAGGCTGCTGATCAAGACGGTTGTCGGGGCCAGCGACCCCAGATACTTGCGAGAT
+GTAGCCACTGATGTTGGCGCGCAGATCAACCGCTGCTGCGCCTTCGATCATGTCGCTCAAGCGGCTCTTGGC
+>generic462
+GGTTTCCCGGAGCAAGTGAAGGACTTTATAAGGCGGAAAAGCGAGGTTCAGATTGTCTACTGAAGAATGAACGAAGACCA
+CATCTCCCGATTGAACCATCAATTCGTCACGAATTATGCGCTCAAACTCAGATTCATCAATTTTGAGCATTCTTTGCCGC
+ACATATGTCCTGTATCGATGGATGATATGACGCGCTGCGCTTCTCAGCTGCCGGGGCAACACGTTCGCAATGGCTTGCTT
+GATCATTGTCGTCAACTCCCATTCGCCACTATGAGGACGACAAGAGGTTTTTCAGATGAAGTCTATGAAATCGGGGTCAA
+TTTCTGCCGACAGACGTCTCTGACGAATTTGTAGGTCACCATCTCACTGATCTCTTCATCCGTGAATTCGATCTCGAATT
+CGTCTCCAGGGCAGTGACGAGATTGATATGTTTTTAGGGAGTCCCAATCCAACAGGCTCTTGAAGGACAGGTCTTC
+>generic463
+GACATCGAAGCAATCTACGTCGGTTCAGAATCCCACCCATACGCAGTGAAACCCTCCGCAACCATCGTTGCAGAGGCGAT
+AGAGGCGACACCGGACCTGACAGCCGCAGACTTCGAGTTCGCATGCAAGGCAGGCACAGCCGCTATACAGACATGCATGG
+GGCTCGTCAAGTCGAAGATGATAAAGTACGGCTTGGCCATAGGCGCGGACACGAGCCAGGGAAGGCCCGGCGACATCCTT
+GAGAACACCGCATCCGCGGGAGGCGCAGCATACATCATCGGCGAACACAACACGATCGCTGACATAAAATGACACCTAAC
+TCTTTCACGACGGACACGCCAGACTTCTGGA
+>generic464
+GTTTTACCAAACATGCCGAAGGTTCTGTTTTGGTTGAGTTTGGCGATACGCGGGTGCTTTGCACGGCCAGTATTGAGCAG
+GGAGTGCCGCGATTTTTAAAGGGCAAAGGCGAAGGCTGGGTCACGGCAGAATATGGCATGTTGCCACGTTCTACCCATGA
+ACGGATGCGACGGGAAGCAAGTCATGGCAAACAGGGCGGACGCACTTTGGAGATTCAGCGATTAATAGGACGCTCCTTAC
+GCGCAGCAATTGATTTGAAAGCCTTGGGCGAAAATACTATCACTATTGATTGCGATGTGTTGCAAGCAGATGGCGGCACG
+CGCACAGCTTCCATTACCGGTGGCTTTGTGGCTTTGTCTTTAGCGATAAGAAAATGCTGGAAAAAAACAGCTTAAAAAAA
+TCCGCTGCACGGGCAAATAGCTTCAGTTTCGGTCGGTATTTTTGACGGTGTGCCGGTTCTGGATTTGGATTATGCCGAAG
+ACAGCAATGCCGAAACACGAGTGGTGT
+>generic465
+GTTCGCCATTTCATATCTGCCGCGGGCCTCGGAGATCTGCGCGATGACGTCTCCCTTGATGTCGATGCTCATGACGCAGT
+CACTCTCGTTCATCTTCCGCTCCAGGTATTCCTGGATCTTTCCGTATGCCTTCGTGTCGCGGAACGTCGACATCTCGATC
+TGCAGCTGCTTCTGCTCTTCGCGCTTTTTANCGTCTTTCATTTTTTCGTCTTCCACGTCATGCCCCCGCGCCAAGAGTCG
+GGTCCTGTCCGCTTGGCAGTGGCGGCAGGCCTGTCGGTGTCATCCCGTTCGGTGCCATGTTCGGCGCCATCAATGTCGGG
+TTCAATGGAGTCGGCATTCCGCCCGGAGCCTGGCCAGGCTGCGCCGGAGCTCCGGGATTCAGTTGTATTCCCGCCTGTGC
+CGCGAGCTGTGCCTTGCCCTCGGGAGGAAGATCGCTGTACCGAATGGATGTCGCCGGT
+>generic466
+GTAGAGCACGCCGATGGAGAGGAACATCGCGCCCGACACAAAGCCGTGCGAAATCATCTGCACCAAGCCGCCCGAGATCC
+CCAGCTCGCTGAAGATGAAAAAGCCCAAGGTCACAAAACCCATGTGCGCAATGGACGAGTACGCCACCAGCTTTTTCATG
+TCGTTTTGCACCATCGCCACCAAGCCGATGTAGACCACCGCAATCAGCGACAAGGTGATCACCATCGGGGCCAAGTCATG
+GCTGGCGTCCGGCACGATCGGCAGCGAGAAGCGCAGGAAACCGTAGGCACCGAGCTTCAACATGATCGCGGCCAGCACCA
+CCGAGCCGCCGGTGGGCGCTTCAACGTGGGCGTCCGGCAACCACGTATGCACCGGCCACATCGGCACCTTGGCCGCAAAG
+GCGATAAAGAAGGCCAAGAACAGCAAGGTCTGCGCCGTCTCACCCAAGGGCAACTTGTGCCACACCAACACGTCGAAGCT
+ACCGCCCGA
+>generic467
+GAAGCCGTCGTTGTCGTGCCCCTCGTCAAAGCCTCGTTGATATGCGGCGAGAAGCTCGTTGAGTACCCTCGGACCGGCAA
+GCTCCGCGAGCGGCCACGCTGCGGCTTCGCGTACAAAGAAGTCGTTGCTCAACAGCAATTCCAGCAGGTTCGATATGTCC
+TCGGCGCTTGATTCGGTTTGAAGACGCTCTGCTGCCCTGACGCAAGTGCTGATGTCAGGATGCGAGAGTTCAGACACGAT
+GGTTGACCAAGTGGATGCGTTCATAACGCCTAACGCACAAGTTCAGCGGTGAGCGGCAGCGCACGCAGTGCGCTGTTGCG
+AGTCCGCTGGAACGACTGGTTAGGCCAATGAATTGAAACTTTAACCATGAGGACGCAACCTCAAGTAGACGTAGCCCATG
+AGGATGAGAAAACCAACGGCCGACACGAGGAGAAAGACGAGTTGGCGTTTGGCACGTGACTGGCCACCGAAGCGTTTGGC
+CGCAAC
+>generic468
+CGACAAGGTGGCGCGTTTCCGCCAAGACATGGAAGCGGCCATCAAAGCCCAAGGCCTGCGCGGCGTGCGCATCGACAGCC
+TTGAATCAGGCCGGCCCGAGATGCAGCAAACCCTCGACCGGGCGCGCTTGTTCCTGCATCTGGTGGCCGTGCTCTCGGCG
+CTGCTGGCCTCGGTGGCGGTGGCGATTGCCGCGCGCAGCTTTGCCCAGTGCCACTTGGACAGCTGCGCCTTGCTGCGCGT
+CTTGGGTCAACCCCAGCGTCAAATCGCTTGGACCTACGCGCTGGAGTTCTTTACCGTCGGTTTGCTGGGCAGCTTGGCCG
+GTGTGCTGATCGGCTTGGGGCTGCAACAGGTGTTTGTCGAATTGCTTGGCCGGTTGATGCTCAAAGATCTGCCCGCCCCA
+GGCTTTGGACCGGCCGGCTTACGAGTGGTGT
+>generic469
+AGCAGCCGTCGCGCCGAAGCGGCGCTATGGCGCGCCGCGAAGGCGGAAGGACTGGCGCAGTCCAAGACCTGGCGGAAAAT
+TCCACGCCCCTCGACCATCAGGCAGCATTCCGCCCCTATTTCAGCGCATAACGCCGCAGATATCTGACGGCCACGGTTAA
+ATCCTTGGGCCATGGGGCGGCGATGGCAATTTCGACCCGGGTCAGGGGATGGGTGAATTTCAACTCCGCCGCATGAAGCG
+CGACGCGGTCGATCAAAGGCCGCTCTGTCCGGTTCGACTTGAGGCGGTAATCTGACTTCAATCGCGATAAAAGCAGGGGA
+CTGCCGCCGTAAAGCGCATCCCCCACAATCGGCAGGCCGGCCTGGCGCAGATGGACGCGAATCTGGTGGGTGCGCCCGGT
+CACGGGATGGCAGTTCATGAGCGAATAGCCGTTGAAGGCCTCAAGCAACTCGAACGAAGTCAGGGCGCGTTTGCCGTTCT
+TCTCATCCA
+>generic470
+GCCGGCTGAGGCTTCGAGTAATTTGTCGCGATACGATGGTGTGCGCTATGGACATCGTGCCGCTGAATATACTGACTTGA
+TGGATATGTACAACAAGAGCCGCGCTGAAGGTTTTGGTGCGGAAGTGAAGCGTCGCATTTTAATAGGTACCTATGTATTA
+AGTGCGGGCTATTACGATGCGTATTACTTAAAAGCCCAGCAAATTCGCCGCTTAATTGCGCAAGATTTTGTTGAAGCGTT
+TAAACAATGCGACGTGATTATGGGTCCAGCTGCGCCGTCTACGGCCTTTAAATCAGGTGAAAAGGTTGATGATCCGGTAG
+CGATGTATCTGCAAGATATTTACACGATTTCAACCAACTTAGCCGGCTTGCCAGGTATGAGCGTGCCGGCAGGGTTCGCC
+CAAAGTGATGATGGAAAATCATTACCAGTGGGCTTACAAATTATCGGCAATTATTTTGACGAAGCGCGCATGCTGAATGT
+GGCGCATCAA
+>generic471
+GACAAAATTGCCACAGCGGTCTGGAAATAAGCCATAACCCCAAAAGACGAAAACATTGTCGGGTTGATTGATAAAATGCG
+GCTGATGCGCCAGTACGATACTCATAAACCAATTGGAATCGACCAAGGTAAACAAGCCGCCCGTCCCCGCCTCATTACCC
+GTAAAGTCTTCTATAAACTGAAAAAAGGCTGGCTCATTCAGCGTCACGGTGAACGATTGCCACTTGCTGTGTTTAATATG
+ATTGGCAAACACATCGGGATGTCCGAAACCAGGGCGACCATTGGCAATGTCTTCCCATAAACTCCATGCACCACCTGATT
+GTCTAGCGTTTGAAATGGCAGGTGTGTTCATAGAGCCAAGACTAGAGCCTTCGGTCATACAGCCCAATGTGACGAATAAC
+AAATCTCTGGGCGCTAAGGCAATGGTGTTGTGTTCACCATCGCAAGTGTAACGAACACGTTTCACTGATCGGCAACC
+>generic472
+TGTACGGGCCATCGACCGTGGTCAGGGCCGCAATGCCGGTATCGAGGACCCAGTTGATGCCATCCAAGCTGTACTGGATC
+ACGCCGCCAGGTTCAGCCCCGCCTTGCGGGTTGGGCGTCGGGTTGGAAGTGATGCCGTCTTGGGTGGTGATGATGGGGTT
+GGTGACGGTATCGCCGGTGTCGTTCAGCAAAATCACGGTGGGGGTCACCACGGTGGTATCGAGGGCGAAATTCATCGTCA
+CCGGCACGCCAAGGCTCGAATTGCCGGCCTTGTCCACTTGCCAGAAATCGACTGTGTACGCCCCATCGATCAAGCCCAAG
+GCTGGATCCTTGGCCAACAGCGTCATGGAGGTCGCACCGGCCATCGGCACCATGCTGCCGGCGATCAAGGGGCTGCCGTT
+CGAGGCCCCGCTGATGGGGTCCACGGGTTTGAAGACGTAGTAGACCCGGTCCACGTTCGGGTCAAGCCCGTTCAGGGTGA
+ACTGGCCCAAAGCGCCGACCCGGTCAAAGATCGTACGAGTGGTGT
+>generic473
+GGCTTACTGGCGCGCCCAAGACGGAAAAGTCGGCAAAGACGGGGCGCAAACCATGGTGCGGGCCAGCACCTTGCCGTTCG
+GCGCGGATCGGCTGGGGCGCGATGTCTGGGCCAAGGCGGTGCAGGGCACACGCGGATCGTCGGTCACGGTGGGTGTGTTG
+GCGGCCGTGCTGGCCACGCTGATCGGCACCACTTTGGGCGCCTTGGCCGGTTTCTGGGGGGGCCGGGTGGGGGACGTGTT
+GGAGGGCTTCTACAACGTCTTCACCGCCATCCCCGGCATCTTGCTGATTCTGGCTTGCGCAGCGGTGATGGGTCGGGGCA
+TCACCAGCGTGGTGGTGATTTTGGGCTTGACCGGCTGGACTGGCGTGTACCGCTTGGGTGCGCGCCGAGTTCATGAAGCA
+TGCCGGGCGCGATTACGTCCGGGCCGCCGAAGCCATCGGCGTGAGCCCGGGCGGGCGCATGCTGCGCCACATCCTGCCCA
+ACGTCAGCCACGGCGTGCTGGTGCAG
+>generic474
+CACACGCCCCGTTTTTTGTCCTTGGTGACAATGGCGGCGGATGGGAGTGACGGAACATCATTTTTTGTATCCGTGACGAT
+GTACACATCGGACTGCTCCCCCAGACGGAACTGTTTCAGGGGCTCGCTAAAGGCCACATCCACCACCAGCTCTTCGGTCA
+TCCGATCGCTCTGGCGCCCCAGACGGGCAACCTGGCCGGGTAGTTGTTCGCCGGACGAGGAACGTAGTGTGATCATAGCT
+TTTTTGCCGACAGCCACCCCTTTCAACTGTGATTCGTCCACGTTGGCCTTGACCCAGACGGTTTGTGGGTCTGCCAGGGT
+GAAGATCGACATTCCCGGCGAAACACGAGTGGTGT
+>generic475
+ATGATTTTTCAATCTTGCTTAAATCAGCAATAACTACAGGCACTTGTTTGCCGCCAATATTTTCTACAGCAAAAGTTTCT
+CTTCTTTGGTATTTAAATGGATTGTATGGTACCTTCTCCATCACGGTTACAGGCTTACGACTCACGACAAACGACTCACG
+ACTTGCATATCTCTTCACCAAATCCTTACACACGGGAATTTCAAACTCCGGATCTTCTGTTAATGAAACACGGATGGTAT
+CACCAATGCCATCTTCCAACAAAGTACCAATGCCAATTGACCGATTTAATTCTTCCATCTTCTCCATCCCCTGCCTTCTG
+TTACTCCCAGATGCAAAGGATAGATTTCGCCAAATTCATCAAACATTGATTTATCAATAAGCGGTAAGCCTGCACCATTA
+CCTGCGGGTTGCTGCTTTTCATACTCAGCAAAATATTATGATATGCCTCTGCCCTGGCTATCCGTAAAAATTCCATGGCG
+C
+>generic476
+GCGGCGTGTCTGTGAAGGAGCGAGACTCTAGCGGCTGGAGCCGTGGCCGGGTTCCTGCCCGGCGCACGAAGTCAGCGCAG
+CGGTAACAATGCCGCCTCCGGTGGGTCTTTTTGTTGCGGGCGCTTGAGATTGTTTCGCCCGTACAACATCAGGCCACCAG
+GGGTGGCTCGGCCATGGCGTTGATTTGTTCTTGCAGCAAGGTGGTTTGTTGCGCCCAGTAGGACGGGCTTTCGAACGCCG
+GAAAGGCGATCGGAAAAGCCGGATCCTGCCAGCGGCGGGCGATCCAGGCGCTGTGCCCGAGGATGCGCAAGGTGCGCAGC
+GGCTCGATCAGCGCCAGCTCGCGGCGATCAAAGTCACGCAGGCTCTCATAGCCGTCGAGCAAGGCCCCAAGCTGGGCTTG
+CATCTCTTGGCGCGTACCGCCCAAGAGCATCCAAAGGTCTTGCACGGCAGGGCCCATCACCGCGTCATCGAGATCAACAA
+AGTGC
+>generic477
+CGACTTGTTCCGAGCGGTAGGCTTGGCCCAAAATCATTTCGGTCGAGCGCCCGCCAATGTCCACCACCAAGCGGCGCTCA
+TTCGATTGGGGCAACAGGTGAGCCACGCCCAGATAAATCAGGCGCGCTTCTTCACGACCCGGGATGACGTCGATCGGAAA
+GCCCAGCAACTCGCCGCCGCGCGCCAAGAATTCATCGCGATTGCGTGCTTCGCGCAGGGTTTGGGTCGCCACGGCGCGCA
+CCTGCTTCTTGTCGAAGCCCGCAATGCGCTCGCCAAAGCGCGCGAGGCAGTCCCAGCCGCGCTGCATGGCCTCAGGGGTG
+AGCTGGCGTTCGGTGTCGAGCCCATTGCCAAGGCGCACGGTTTCCTTGAGGTATTCGGTGCGCTGGATTTGGCACGAGTG
+GTGT
+>generic478
+GTCGGTGGTTGACTTGACCGTCGAGCTCGACACCGCTGCTTCTTATGAAACCATCTGTGCCGCCATGAAGTCGGCTTCAG
+AAGGCTCCATGAAGGGCGTGCTGGGTTACACCACCGAGAAGGTCGTCTCGACCGACTTCCGTGGCGAGAGCTGCACCTCG
+GTGTTCGACTCTGAAGCCGGCATCGCTTTGGACGGCACCTTCGTCAAGGTCGTGTCTTGGTACGACAACGAATGGGGCTA
+CTCCAACAAGGTGTTGGAAATGGTCCGCGTGATGGCTTCGAAGTAAATCCTTCGTCCGTCCGGCTCATAAGGCCTCCTAA
+GGCCTCATAAGGGCGTGCTCTCGCAAGAGGGCACGCCCTTTGTCATGGGGCGCAGGATAATTGCCGCATGAAACTCAGAT
+TCACCAAGATGCAAGGCGCGGGCAACGATTTCGTGGTGCTTGACGCCACCCGTGCGCCACGAGTGGTGT
+>generic479
+CAAAGAGGTACGCAACATCGTCATGGCTTGCTCCCGGAAGCACGGCGCTCGATGGCGCGGATCATGGCCGTCATGAGCGC
+ACTGCTCTCCGGCCAAGCCTGCTGCTCCTTGCGGTAGTAGCTCACGGCCGTATCGCTCTTGCCCGACTGAAAGTAAAGCG
+TCCCCAGCTCGGCGTACAAGCCCGGAGCGACTTTGCCCTTGGCCTCTTCTTGGGCCGTGATGTGTTCTTCGAGCTTGAGA
+CGCATCTCGACCGCTTTTTCCGGCTGCTTGTAGCTGCGGTACAGCAAGCCTTCGTAATCGCCCCAGGCATAAAGCGGCTG
+GCGCTGCGCGCAGCCGCCGACCAAAAGCAGCGCCAATGGCAGCATCCACAGACGCGACCGACGTGACCAACGTGATAGAC
+GTGACATGAACCCTCCCCAAAAACNTCAAGGCAGGATCAAGGTGCGGCT
+>generic480
+GGAACAGTGGCTTTGTCAATCTCTTTGGGGTATTTACGCCGCACAACCAAACTATTAAAAGACATACCAGTGCGAACATG
+ATTGCCAGACCAAACCAGTCAAGCCAATCGAACCCATTAAATATCGCTATTATCGTATTCAGTATATTCATTGAAGATCC
+TGAGGCCATTTAATTACCACGTCCAAATCGGCATTTTTGACAGCATCTGGACTGATTTTTTGATCAACGCCAGTAAACAC
+CAGCTCCCCGTTGACAACACCGATAACAGCTTGCTGCTTATCGCGAAGTTCTCCTTTAAGCAAAAGTTCGGCGAGCGGAT
+CCTGAATTTTGGTTTGAATAACCCGTTTCAACGGTCGAGCACCGTACAAAGGATTGAACCCCCATTGCGCCAAGGCATTA
+ATAGCCCTCATCGCTGATATTGAGAGTAATGTCGCGCTCTTCCAAACGCTTTGCCAAACGCTTGACTTGAATATTGGCAA
+TCGGACGCATGGTTTCAAGAGTAAGCTGGCGAAAAACCN
+>generic481
+CCGGCGCCGACCTCACCGACGCGAACGTCTGGGACCACGGGGATGGCGATGTCGAGGGTCACTACGCTGCGGTCGCCCAG
+GGTGCGATGCCCTTTCGCGACGGCTCCCAGTTCTTTCTCACGTCGCAGTCGCGCAAGGACACGGGCCCGGGCGACAGCGT
+CCGTGCGCACACGTTTCAGATCACCGCGCTCTGCTCGGAGAGCGCGTTCTCCCGCTGGAGGGAGTCCGCCGCTGCGAGGG
+GCGACGAGGAGTACCAATCTCTCAAGCGCTCGCTGGCCGCGCGCGCGCTCGCCGGCGTGGAGCGTTACGTCCCGGGCGTC
+ACCCGGCACGTCGATGTCATCGAGGTCGGCACGCCGCTCACCCACGCCCGCTTCGCGAACGCGGCCCGCGGAGCACTCTA
+CGGTCCCGAACAGACGCCACGAGTGGTGT
+>generic482
+TCAAGCTCCAGCCTTCGGATACGGCGGCTTTTTCGTGTTCCCACCAGTCCATATCATTTCTCCCTAACATCAAACCCGTT
+TTCATGTTGTTTCAGGCGGAATTTCAAGCGATACGCGTCCGAGCCGCCCTTCTCTGAATTCATCCAGCAAAACAGATGCC
+ATGCGTTCGAGGTCGAGATTGTTGCCCGGCAGTAAAAACCCGCGTTTTCTTGCCGCTTCACTGAGGAGCTCATAACCGTC
+TTTGTCGGCTTGTGGAATGATTTTATAACGTTCAGCGAGCTTTGCGGGGCACATATCTCGAAGGCGCAGCATCAGATTTG
+ACGCAAGCGCCTCGCGGTCGATGACATCGTCTTTAACAGCGCCGGTGAAAGCGAGGTTTTCACCGACAATCTGGCTGTCG
+AACTTCGGCCAGAGAATTCCGGGCGTATCAAGAAGCTCCAGTCCGTTGTCGATCGTAATCCATTGCCGCCCACGTGTCAC
+ACCAGGTTTGTCTGAGGCTTCGGTTGCTTTTC
+>generic483
+GCCGCGATAGGCGAAGGCGGCCAAGTCTTTGTGCTCGACATGGGTGAGCCGGTGAAGATCGTGGACTTGGCACGCGATCT
+GATCCGCATGAGCGGCCACAGCCTTGAAGACATCCCCATCACCTTCAGCGGCCTGCGCCCCGGCGAAAAGCTCTACGAAG
+AGCTGCTAGCAGATACTGACGCGACATTGCCGACGCGTTTTGCCCGCCTGCGCATCGCCCGACTCGATCAGCGCAGCGAC
+AACGTGAGCCAACTGCTGGCGTGGGCCGGTGAGCGCTCCAGCGCCAGCGACACCGAGGTCCGGGCTCAACTGGCCCGGGT
+TGTGCCGGAATACCGGCCTGCCGCACGGCTTTGAAACGGCTTGATTCAGGGTTTACCCTTAATTTGGTCCGATACTCGGA
+GGCCAAATTCCAAGCTGTAGAGGGTTCCTCATGGACCATCATTTCCTGACCCCGCTGTTTTCGCCGTCCTCGGTGGTGGT
+CTTTGCCACGAGTGGT
+>generic484
+GACGAACAGCACGATGTCGGGCCGGCGGGTGTGATGCGGCCCTTTGAGGGTGAACTGGTTGACGGCCCAGAACTCGTTGC
+TCGCAGGATGGGCCCAGTCCACCAGCCGCACAAGATCGCCCACCGTCTCGCCATCGCGCTGAACCTGCACCGGCACGCCG
+CCCACCAGCAGCCGGTGAAAGGCCCGGTTGGCCGCCACCAGCGCCGGGATGCCCAGATCGAGCACCTGCGCCAGCGCGTC
+GTCCAGCGCCGCAGCTGGCAACCCCGGGTTGAGCCGCCCCACCGCTGAGCGCAGCCGCTCGGCCAGCACCGCTTGGCGGA
+AGTTCTCACGCTGCGGCGCTGGGCCGTCGGGGGCCATCTCTGCCCCGCTACGCACCGCATACCCCACCTCGGCCATCCAG
+CCCAAAGCTTCTTGTTCGAGATCGTTTTCGGTCATGGCTCGGCTCAATCGGCAAGCAGCGCGATGTAGGGCTGATAGCTG
+TAGA
+>generic485
+CGCGGGTGCAAGCCGATGGTCGGCTCGTCAAGCACGTAGCAGACCCCTTGCAAGGGGCGTGCCCAACCTGCGCGGCCAAG
+CGAATGCGCTGCGCCTCACCGCCTGAGAGCGTCGGTGCGGCACGGTCGAGCGTCAGGTAACCCAAGCCGACATCGCTCAA
+AAAGACTCAGGCGGCTTTTGTATCTCGCTCACCACATCGCGCGCAATCGCCGCTTCGCGGCCGTCGAGCTTTTGCCGACT
+CAACCAGCGCGCGGCCTCTTGCACCGACAACGCCGCCACCTCGGGGGCGTGAGCTGGCGCGCCAACGCACGGCGCGGGCG
+ATGGGGTTGAGGCGCGTGCCGGCGCAACTTGGGCACGGCGTGTCGCTCAAGTCCTCGACTTCGGGCTCGGCAAAACTTTG
+CTCGCGGCCCTTGTCGGCGTCGTCGCGCACGCTGTCGTCCAGCACCTTGCGCACGAGTGGTGT
+>generic486
+GTCCGGCCACCGTGCTGGTGCTGAGCACCGGCAACGGCATCGAGTTCTTCACCCTCGATCCGGTCTCCAGCAACTGGCTG
+CATACCCGCTCGGGCGTGCAGATTCGCACCACGACCAGCGAATTCGCCATCAACGCTTCCAACCAACGCTTCTGGGAAAA
+GCCCATCCAGCGTTACGTCTCGGAATGCGTGGCGGGTGATGCCGGTCCGCGTGCGCGCAACTTCAACATGCGTTGGGTCG
+CCAGCATGGTGGCTGAAGTGCATCGCATCATGACGCGCGGTGGGGTCTTCCTCTACCCGCGTGACACCAAAGAGCCGCGC
+AAGCCGGGTCGTCTGCGTTTGCTCTACGAAGCCTCGCCGATGGCGTATCTGATGGAGCAAGCCGGTGCCAAGGCGGTGAC
+CGGCACCATGGATTTGCTCGATGTGGTGCCCGATACCCTGCACCAGCGCGTGCCGGTGATCATCGGCTCC
+>generic487
+GGTGGCTGCTATCCATTTTTTCGACCAGCGGTTCATGGCCAAATCAGTCTCACAGGATTTCACATTCAATGGCAGTGATG
+GGCACGATGGGGAACCGAATGAACGGCGGCTAACGGGGGCGTTGGCTTGACCAAATGGAAATCAGACGGACGCATAAAGG
+CTTCTCAACGCTTAGAACTGAGGATCAATTCGACGAAAGTGCAGTTAAAGCAGCCTGGACTGAAATTCGCTCGAACAACA
+ATTGGCGGCAGCCATCAATGCCTGGCCCAGCGACAGGGTGCACACCGTGCTTCTTGAGGAAACTTGCAACCGCGCGGGAT
+GACCGGCCAAACTGCGTCGCTACTTCATTGCAGAATACAAATTGCTCTGCAAAACTTGCCAGATCAGCTGCACTTACGCG
+CTGTTCGCTTCTACGCCCTTGAGTGCGATCACGGACTTGCAAAAATCCTGATTTTGCCAGCGCATAGACAACTTCCTGC
+>generic488
+GAACCCGCTCAGTTTGTATCTGACATAGCTGTAGCTAGTTTATTCATGTCGAAGATTCCTATAAGAACAGCTACAAGAGA
+TATAATTACAGAAGCACCGCGAGTCGAAATAAAACCATTAAGTCCTTTATCTCAATTATCAGTTCCGGCAAGAACCATAA
+ATGTAGCAGCAGAAAATATGGTCAGATCGATGAAACCTGCGGAAATATCAGCAGCTCCATCAAGACCAATTTATAAACCA
+TCCGAAATTATTCCTCAAAAAATTACTTCTTCCGAGGCAATCTCTCCTGCGATATCTAAAATTACTACTCCAGAAATTAT
+TAAACCAGAAACTATCGAACCACCAGCGCGTAGAGTTGTTACTAACATAAGGCAACTAGGTTCATTTAAACCACCAGAAT
+TTAGATCCCCGTTCTCTAGTGAGCCAGTAATGCCTGGAGCAAGACTATCAAAAGGTGCTGGTGGATTGGGTGAATTTAAA
+TCTCCGGCACAAAGAATGACGGAAGCACGAGTGGT
+>generic489
+GGAAAGGATGCCGAGAACTGCGGCACGTACTGCACCACTATCGAAAACTTCAGACAAGGAATTATTATTCATGGTCGATT
+ATTGGTTGGTGGTTAGTGTCGTTTATTGTATCACTGGCCCTGCAAGGTCGTAAGAAGCTTCATAAGCGCCGCATGAGCCG
+GAAACGCGTCAACGTTGAGATTCGGGTCGGTCCAGTTCATGACGTTCCGATCGATGGCATCGAAGCGCAGGAGGTCCATA
+CCGTGCTTCAAGTAATACGCCGTATCGATAACACCCTCGAAACGCTCGATGGGCACGAGCGTGTAGTTGCGCTCGGCGAT
+GCCTGCCGACGAGAACAGTGTCGGGTTCACCGGCGCTCCCGAGGTCCCGCTGATGGCGGTCGTCTGTATCATGTCGAGTA
+CCGTCGATGAAGAGGTGAGTGCATAGCGGCGGACGATAATGCTGTCAGTCGTCGATGCATCGGTGTGTTCATATGCGGCA
+ATAC
+>generic490
+GTCAGCATTTCGAAGCAACGCATCGACATCGAACTAGCCGTCAACAACCCCGGCGAGACCAGCTTTGACTTCACCGCCGC
+GCTACACACCTACTTGCGCTGCGACAACGTGCTCAAGGCGCAAGTCGAAGGGCTGCAAGACTGCACTTACGAAGACAAGC
+TCCAAGGCACCACCGCGAGCGAATGGACCGATGTATGCAGCATGACCCAAGCCACCGACCGCATCTACTGGGCCGCCCCG
+CAGCCGCTGCTGCTGCGCGGTCTTGGTCAAAAGGTGCGCGTCGGCTGGGAGGGTTTTGAAGACGCCGTGATCTGGAACCC
+CGGCCCCGAGGCCTGCGCCGCATGGCCGACATGCCCCCCGAAGGCTGGCGCGACATGATCTGCATCGAAGCCGCCCGCAT
+CGCCAACCCCGTCATGCTCGCCCCCGGCGGCGAATGGGCGGCATGCAGCGATGCTCAAGGTGGGCTAAGTT
+>generic491
+AATTGCCACACTTGCAGCAATGATACTCTTGCCCACCCCACCCTTTCCGCTGGCGATGGCCATTACCATTCGAGCCCCAT
+CAGCCATATTGAGATTCAAATCGAGCTGCTGTTGGGCACTGATTAAATCGTCCTCCCCCCCATCCTTATCTTCTTCACAT
+TTCTCTTCAATTTCTACGGCTGACGCGTCCTCTGTTTTTCACGCCTGCAGCATTGCCCATTGATGATTAATTCAGGTCCA
+ATTTCGGCAGCATTCTCAGTTTTTGGCAGCCCCTCATCTTTGATCGCAACAGATTCCACTGGATCCATATGCACTCCAGT
+GGGCAGCAGCGTAACTTCTGGCGGTGAAGCGCTCTCGATTAATGACTCAATATCATCAGCAGTTTCTTGGTTCGCATTTG
+CATCATTCAAAGGCGATTCGGCTCTTTCCAAATCTGTGTTATCTAAGTCA
+>generic492
+GTCGGTGCGCAAGCTGACCGCCTGACCGATCTGCACCCGACTGATGTCTTCCTCGTCCACCTCGGCCGCCACCCGCAGCG
+GCGCGCAGCACGACAAGGTGAAGATGGTCTGGCCTGCCGCAATGAACTGGCCCTTTTCGCCGTCACGCTTCAAGACCACA
+CCATCGGCGGGCGCAGTGAGCACGCTGTAGCCGCTCAAAGCCCGGGCGCGCTCCAAGGCGGCGCGCGCAGCGTCGAGTTC
+GGTGCGGGTGCGATCGAGTTCAGCGGGCGAGAGGAACTGCTGCTGCACCAAGGTGCGGGTGCGCTCCAGCTGGGTCTGGG
+CCAACTTGGCGCGAGCTTGCATCTCTTCGACCGTGTGCTGCAAGTCGTCGGCGTCCAGCCGAGCCAGCACTTGGCCTTTG
+CGCACCACAGCCCCTTCATCGACTTCCAGCGTCAAGAGCCGCCCGCCACTGCGCGGCGACACCGGC
+>generic493
+GGCGAGCAGGAACGTCCCCGCTTCGATCCGGTCGGGGATGACCTTATGGCGCGCGCCGTGAAGCTTGGGCTTGCCTTCGA
+CGGTCACGGTCGCGGTTCCCGCGCCGTGGACCTTGGCGCCGAGGCTCTGCAGGAACACGCCGAGGTCTTCCATCTCGGGC
+TCCCGCGCCGCGTTCTTGATCGTCGTCTTGCCGGCGGTCGCCGCGGCGGCCATCATGAGGTTCTGCGTGGCGCCGACGCT
+CGGGAAACGGAGCTTGATCGTCACGGCGTTGAGCTTGGGCGCGGACATGATGATGTCGCCCTGGTCGGCGATGCGGCGCG
+CGCCCATGGCCTCGAAGCCCTTCAGGTGAATGTCGATCGGCCGCAGGCCGATCGCGCAGCCTCCGGGAATCGGCACGCGC
+ACCAGGCCGAAGCGTGCCAGGAGCGGGCCAGCGGCCAGCACCGAGGCGCGCATCTGCTTGACGATCTCGTACGGCGCCTG
+AGTTTTAAGCGA
+>generic494
+GGCAATTTTGAATCGAACGGTGCTACCAAATTAACACCGTCCGACAAATCAGTTATTTTTTCCCTTTGTCGCCATCTTCC
+TCTGGGGCTGATTCTTTGTGTGTCGCATTGGCAGTGGGAGCAACTTTCAATGCTTCTAATGCCGCGCGTCCACGAGATAT
+AAGGGCGTCAAACAGGGTGAAGGCAAATTCCACACTATAGCCCATCAAAAAAGCCCAAACTAGCGGCGAATAGCTGATTG
+CTTGAATTTCTTTCAAGTCAGGCACAATGATAACGCCGCTAATTAACCCTAGCAAAGCACCCAAATAAACCCGCATACTG
+CCACGCCGATGAGAGCTAAAGGTTAAGCTGGATTTGGCAAAGCCATCCAGAATACTGCGGATAACATAAGCCACTGACCC
+TAAAATGCCCAAAATCAACGGCAACACCAAATAATTGCAAAGATGCAGAGCAGATTTTGCCCCTTCAAAAAAGGTCGAGC
+GTTCTGCTTTGGCGCGTTGTTCCATTTCCATGGAAAATTC
+>generic495
+ACAAAATATACCGCTAGTTTATTTTTAATAATATGGTTATTTATCTTAATTTATAGTTTTTATAGTTAATAAAACTAATT
+TTTAGTAAAAATTAGTAGTTATTTACTGAAATTTTGTCGAAAAAATCCTTTTAGTGATAATTTAGATGAATATTTATTTA
+ATTTAGGGGTAAATCATGCGTATTCGAACCCACGCAGTTCGCGAGCTTGATCGTATCGACATCAAAATTTTGTCTGTGCT
+GCAAGAAAATGCACGCATTCCAATCACCGAATTAGCAGAAAAGGTCGGACTTTCTGTCACGCCATGCGGCGAGCGGGTAA
+AAACTCTGGAAAAAGAAGGCGTGATTCTAGGCTACCATGCGCGCCTTGACCCACATGCACTGGAACTTTCATTATTAGTA
+TTTGTAGAATTAAAGCTTTCTACCAAATCTGGTGCTATTTCTAGCAAATTTAAACAAGAAATTCTTAAGCTGCCCAGCGT
+ACTCGAATGTCATTTGGTACGAGTGGTGT
+>generic496
+GTTCAGCACAATGAACTTGGGCGGTTGATCCGAGCCTTGGGCCACCGCGAGGAAAGAGCCCATGCCCAATTCAGCCAAGG
+CATCGGTATCCAACACCTCCACCTTGAGTTTCTTGAACGTCTGGCCCAAGGCGATGGCCTGCTCGGCCAGATGGGTCGGC
+GTGGCATGGTTACCGGGACGATTGGCCCACTCGCGCGCCAACTCGATCCCAGCCGCAATGGCCTTGCCTTGACGCACACC
+GGCTTGCAACTCCGTCACGTTGGCTGCCGAGCCAAGTAGCTCGATGCGTGTGATCCGAGGTGCGGGTGTCGCACTGGGCT
+TGACGAGTGGTGT
+>generic497
+GCCTCTGCAAAAGCGGGTGGAAAAACGTTACGAAGGCATTTATCTCAAGACCAAGGTCAGCAAGCTGGAACCCACCAAGG
+AAGGACTGCGCGCCACCTTCGAAGGCGACGGCGCGCCGGCCCCCCAGGTCTACGACCGCGTCCTGCTCAGCGTGGGACGG
+CGCCCCAACGGCAAAACCATCGGTGCGGAGACCGCCGGTGTGAACGTGAACGAACGGGGATACATTCCCGTGGACAAGCA
+GCAGCGGACCAATGTGGCGCACATCTTCGCCATCGGAGATGTTTGCGGCGAGCCCATGCTGGCGCACAAAGCGACCCACG
+AGGGGAAGATCGCAGCCGAAGTCATCGCCGGCCACAAGGCCTCGTTCGATGCGCGCACCATTCCGTCGGTGGCATACACG
+GATCCGGAAGTGGCCTGGATGGGCCTCACTGAAACTGCAGCCAAGGATCAGGGCGTGGAATTTGAAAAGGCAGTCTT
+>generic498
+TTGCGAACAAATGCTAGTAATCAAAATTGAAAAAAGACAAACAGAGTCAATGGCGAGCAATAAAACGGAGAGAAAGAGAG
+AAGAAAGAAGTCAGAAAAAGTGGGAGGGAGAGGGGAAAAGAAAAGAGAGTATGTTATGTAGGTAAGCAAACCAGAAAAAA
+GTTTCAGAGAAAACTATAAAAGGATAGGTGAGCAAAGTTGTGATGATGCTAGAACACATACGCACCCAAAAAATAACAAA
+ACACACGAAAAAGTACTCAAACTGAATTTTAGAAAGATAAACAACGGTTTCTAGACAAGAAAAACTTTCAACATTGGAAA
+TTGCCATGGGAAAGATAATTAGTTCGGCATCTTTTTTTCATTACACCTTTCTATGCAGGAAATTTTTCTATGTTGATGCA
+TTTACCCATAAAAAATTAATTGCTTTATAAAAGATAAAAGTGTGAAACCTAAAAAGATCAAGATTTTTTGGAAAAAGAGA
+AAGACGAGTGGGTGTA
+>generic499
+GGCGTTGTGGCCTTTTATTGGGTACCTTTCTCTTATTCTTTTGTTTTATGTCATCCTTGGATAGCGGGTGCGTTGTTGGA
+TCCAGCCCCGTAAGCGCCGCTGGTGTAGATAGCCCAACGGCCGCTAGAATACCGCCACCTACACTGTGAGTTGTAGGATC
+CACGCGTGCAACCGCTTGCGAGACAGCATTAACGCGATCATTGAGCCACGACATATCACTTCCCCTTCAAGGCGCGATGC
+TTGGCCAGACCGCTAGCTGTGTAGCGATAGCCCGTGAAATGGACATCTACCACCACGTTGGGCGACGCGATATTCTGAAT
+CCACAAATATGGATCAGATACACCCTCAAGATTCCACGTATTCGACAGACGCACCTGCGATTCGCCAATACGGCAAAGAT
+CAACCGCATAATGCCCGGCATTCATAAAGATTTCGTAGTCGTAATTTTGGTACGCGGTGACAATTCGGGCGGGTACGAGT
+GGTGT
+>generic500
+TTCCTGTTCGGTCTGTGTGCCTGTCCACATGGCTTTGTTGAAGCGTTTGATGTGTACGCCGTACATGTGCCAGATGATGA
+TGGCGAGCACCGCCAGAACGGCTTCGCCTCCGTGCGCAGCTTTGGCGGCGGGGATGAATTGGCCCGGCAGGTATTTTGTG
+GCGGTAATGGGGTTCCACATGAGGAAGCCTGTAGCGCCCATTACAGCGGCTCCCCATACAAATGCCCAATACTCCATTTT
+TCTTCAAAGGTGTAGCGTCCCATTTGGGGATAGGCTTTGCAAAGCCAATATTGTAAAGCAGGGCTTGTATGCCATCTTTC
+GCATCCTGTAAGGATGGGAGCATGGACATTTGATCACGCAGGACAAATACGCTGTATCCCATGACGAGGATGTGCCAGGC
+TGTGCCAAACATCATGACGATGGCGGCAGTGTGGTGAATAAGGCGCAGGTTCTCAATCCCCCCCAA
+>generic501
+ATCCCGCTCTACGACGAGCCCTTCGTCATCGCTGTGCCCGGCGCGCACCCGCTGGCCAAGCGGACCAGCCTCTCGGCGAC
+CGAGCTCAAGCAAGAAACCATGCTGTTGCTGGGCGCGGGCCATTGCTTTCGCGATCACGTCTTGGAGGTCTGCCCCGAGT
+TCGCCCGCTTTTCGACCCCGGCGCTGCCCTCGACCGAAGGCGGCATGCAGCGCAGTTTTGAAGGCTCCTCGCTCGAAACC
+ATCAAGCACATGGTGGCCTCAGGCATGGGCATCACCGTGCTGCCGCTGCTTTCGGTGCCGCCCGCCAGCCAACAGCCGCT
+TGACACCCAAGGCCGCCCTTTGGTGCGCTACATCCCCTTCACCGAGCCCGCCCCCACGCGTCGCGTGGTGCTGGCTTGGC
+GGCGCAGTTTCACCCGCTCTGAAGCCATCACCGCGCTGCACCAAGCCATCCAAGCCTGCCCCTT
+>generic502
+GTTCTGGGCTTGGATGACGATGGAGTATTCTTCGCTGATCTTCTGGACGAGGGCTTCGTGTCTTCTGGAGATGTTCACGA
+AGTCTTCGTTTCGTTGACGAGGTCTTGTTGAGAGACGGCGAGGTTATCTCTGGAGACAACAAGGTTATTCTCAGCAACAT
+CGAGTTGGTCATTAAGGCTGGAGATTTCAGCTTCAGTTTGGGGGATGAGGGTGTCGGCGAGGAGAGTGATCTGAGATTCG
+AAGGTCGAGATTCTTGATTCAACGGACTGGAGATCGTGGTCGAAGATGGCGTCAGCGGCGGACAAAGCGCGTGAGAAGTA
+CGCATCGAGGTCGTTAAGGCCGTTAGATGGCAGCTTGGAGCGATGAGTCGTTGGAGCTGGAAGCGATTTGGTTCATGGCC
+TGGATGACGGCTTGATGATAATTGGTGGGAAGCGCGCATGCTCGAGGTGGCGGTGGCGAGTTTCTGGGCGAAAGATGACA
+C
+>generic503
+CACTCCTCCACCAGCCAAGGCCGTCGCAAGACGGCCTTGGCTTATTTGCGGGTGAGTTTTTCGAAGCCCTGCCAATCAGC
+ACTGGGGGGCGTCAGCAAGATAGCGGCGGCAGCGCTCGGCAAAAAGGGGTAGGGCACCAAATCCTCGGGATCGCGCTCGA
+TGATCGCTTGCAACAGCGCCAGCGCCCCGGCGAAATCCCGCCCGAAGTAGGCCTGCATGGCCGCCTCAAGCAGCGGCGCG
+GTGGCCAGTTTGGCGGCGCGGCGGGCGGGCTGCTCGGCGTCGATCACTTCGTAGAGTTCGACCGCCGTGTTCTTGCCCTT
+GACCGCCACCCGGTCCACCCAGCGGATCGCGAAGGCTTCGGGGTGGGCCAAGGCGCGAAAGGTACGAGTGGTGT
+>generic504
+CTTTGGGCGGCTCACAGGTGCAAATTGGCGGCCCGGCCGGCGCGTTCATCGTCATCGTTTACGGCATCGTCGAGCGCTAT
+GGGCTGGCGAACTTGCTGATTTCGACCTCGCTGGCCGGCATCCTGCTTTTCTTGATGGGCTGGTTAAAGCTCGGCGCTTT
+GGTGCGCTACATCCCCGTGTCGATCGTCATCGGTTTCACCAACGGTATTGCGGTGCTGATTGGGCTGTCGCAGGTCAAGG
+ATCTGCTCGGGCTCAAGATCGACAAACTCCCGGCCGACTTCTTCACCCAGATCGGCACTTTGGCCAAGCACGTCGATGGC
+TTGGATCCGCTCTCGCTGTTGATCGGCTTGGTCTGCTTGGCCATCGTGGTGCTGTGGCCCAAGTCCTACACCATGCCGCA
+AGCACCGATGACCCCGCGCGACCACGCACGGCGCATCGCCGCCCACGTGCCCGGCACCATCGTGGCACTCGGGCTGGCCA
+CCC
+>generic505
+GTTGATTGTTTGGATTTTCTTCTCTTCTCTGAATTGTATTTTGCGTAGTTCTGTCTTGATCATTGTTGTAGAGAGCGAGG
+AGCCTCTTACATTTAGATTGATGATTAATGCGCAGGGTGGGGACGCAACGGGAGGGGATACGGATGAGGGTCCGTAGGCT
+GAAGAAAGATGTGGGGAGAGAGAATGGAGTGATATGAAGGTCGGATTCAGTTTTGTGTATTCCCTTGCTTGCCAATGAAC
+TGGGTCGATTTTTGAAAGATTCGAACGAATTTACGTTGTCTTTTTACGTACCAGAGAAGTCGTAAGATCTTACACAGAAT
+GCGAAGGAATTTTATGAATCGATTATTTAAAAATTTGCTCGAAAATCACGAATGGATTCTCGAAATTATTCCGGGATAAG
+GTCGTGGTGATAGCAAACGAAAGGACGAACTCGTTTAAATCATAGGTTCAGATTTTGGATGAACTCCTCCTTGAAAAGGA
+TTGAATGGAGTCAAATAAGGGCGTTTGCCTTCGATGCTATCGGGGTCCTTC
+>generic506
+TGCAGCGCCGATGACGGATCTTTCTCTTTACCTTTTTGTTTCTCGAGATCTGCCAGTTTCTGCTCCCTTGTCTTCTTAGA
+GGCAAGAGTTGTCCAGTTATCGTAGTTAACACCCATACCGCCCACACCCTCGCTACCAGCTTTGTGTAGCTTGATCACCA
+CCTTGTTCTTCTTCACCGTGTAGCTGCACTTGGAGGGATCAATGTCTTTAAACAGATTTGGTTGCACAAGTCGGTAGTTC
+TTGTTCACCAGCTTGCACACAGTTAAATCAAAACCATCCCTGGTAAAGGCGCAGCGGATGTTCTGATCTTTGTTCTCTAC
+GCTACCCACGTTGTCCAGATCGGCGTAAATAGTGACCAGAGGCGAGTTATATCCTCCTTGATCCCAAGCATAATTCTCAA
+TTGGAACAAACTGTGCACTTGGATCAACTGAGATAGCAGCAGAACGAGATGATGAAGATGTAGCAACATTGACATTACTA
+TTTGATGAA
+>generic507
+CCCCTCCATACGACCGCTGCTTCAGCGTATTTTCCTGGTAGCGATCGAAGAGCGCGCCCATCTTCAGCGTATGTCTTCCC
+CTGGTCAGGGTTATGTCATCGGAGCCGCTCTCCACATTATGCGCCCATAGCTGCGGCTCGGCCACGTTGTTGCCGAAGGG
+GCTGAAACCGCCGGATTGGAAGGTGATGGAATCGAACTGCTGAGTCGGGAAGAAATTCAGCGCGTTGGGAATATTTATGA
+GCATCGTATTGGCCGTGAAAGAAACGAGCGGTTGATGCCGATACGAGCCACGTTGACCGCCCGCGGCGAGAGGATCGCCG
+TCTCCTGAAGTGTCAAATACTGGTTGCGGGCCCGGTAATCCAGGCGGTGGACCGGGCTCGCATCGTTGTTTTGCGTGTTG
+CTGTCGCTGATGGTATAGCGCGTAAAAAAGGATTGCGAACTGGAAAATTGATGGTCGATCTTGACCGTGTTGTAGTCTTC
+CCGTGTCGGCTGCGTCGGGTT
+>generic508
+CAACGGCGTGCCTTATCCCGGCAAGGTGATCGTTGCCGCCAAGGGCACCGCTACCGCGCCGGTTCGGATCTGCGGCATCC
+GTGGTCCAGCCAATCAGCGCCCAGAGATCGATGGTCGCGCCACCACCACCCGCGCTGCGCTGCTTAAGGAATACGGCAAC
+CCTGCCTTTGATCCAGCCTTAGGGATGTCCAACCAAGACCTGCAACAGTCGCGCGCGGTCATCATGGTCAACAGCCTGTA
+CACCTCGCAGGCTTCGACGAGCGTCCCGAGCGACATCCAGATCGACGGCTTGGCCATCCGCCATGCCCATCCCAGCTACA
+CCTACATCAGCGGCTCAGGCTTGGCGCAGATCTACAGCGACTTCAGCGCCGGGATTTGGATCCACAAAGGCCAGAACATC
+ACCGTCGCTGACAACGAAATCAGCGACTGCGTCCAAGCGGTTTTCAGCCGCTCGA
+>generic509
+GGCTGGCATACCCGAAGTGACCATAAAGTACTCCGTAAAGACAAGCTAGACATCGACATCAAACCACGGCATCCTGGATC
+GGTCCCCGGCCGCTCCAGCGGTCAAGGGCCAAATAGATCACCGGGGTGATGTAGAGGGTGACGAACTGCGACAACAGTAA
+GCCCCCCACCACCGCCACACCCAAGGGCTGACGCAGTTCAGCGCCAGCCCCCAGCCCCAAAGCAATCGGCAAAGCGCCCA
+TCAGTGCGGCCAAGGTGGTCATCATGATCGGGCGCAGGCGCAGCAAGCAGGCTTGGCGGATGGCATCCGCGGACTCAGGC
+CTTGGTTGCGCTGCGCGTCCAAGGCGAAGTCGATCATCATGATGGCGTTTTCTTGACGATGCCAATCAGCATCAAGATGC
+CGATGGTGGCGATCAAGGTCAGGTCCATGCCGAAGATCGTCAGACCCCAGCAAGGCACCCACCACCGCCGAAGGCAA
+>generic510
+TTTGGAAACTTCCGGGTCGCCGTAGAGCACCAAGCGGTGGCCGTCGTCCTCGATCAAAAGGTTATGCGCCTTGGCAAAGG
+CGTAGGGCAGGGGGTGACGCAGCACAGCCATGATCAGTCGGGCCCTCGCTCAGAACGGTGCGTCGGTGGGTGAGACTTCG
+GCGGCTCGGTCTTTGGCGCGCTGGATGCGGGTGGCGCGTTTCAGCGAGCTTAACATTAGCAACCCGCCAACGTCTGCAAT
+TGGAAACCAAATTACGTCAGGGTCTTATCAAGCAGGAATTGCGCGTTTTTTATCAACCCGCTTGTGATATGGTGACGGGT
+AACATCATTGGAGCTGAGGCCTTGACGAGTGGTGT
+>generic511
+GCCAACACCCTCATCTACATTCGCGGCGAGGGGATCGTCTCCAACGAGCCCTCGGTGGTGGCGGTCCAGCAGGACGCCCG
+CGGCGGGCGCAAGGTGCTGGCGGTCGGCAAGGAGGCCAAGGAGATGCTCGGCCGCACGCCGGGCAACATCGTGGCCATCC
+GGCCCATGAAGGACGGCGTGATCGCCGACTTCGAGGTGACCGCGGCCATGCTCCGCCACTTCATCCAGGGGGCNCACAAG
+CGCCGCTCCTTCGTGAAGCCGCGCATCATCATCGGCATCCCCTCGGGGATCACCGAGGTGGAGAAGCGGGCGGTGCGCGA
+GGCGGCCGAGAGCGCCGGGGCCCGCGAGGTCTACCTGATCGAGCAGCCCATGGCCGCCGCCATCGGCGCCGGGCTGCCCC
+ATCACCGAGCCGAGCGGCAACATGATCGTCGACATCGGAGGCGGCACCTCCGACGTGGCGGTGATCTCGCTGGGG
+>generic512
+TCAACAACAAGGTGAAAACCGCATTGTGATTCAATTGCCAGGTGTGCAGGACACGACTCGTGCGAAAGAGATTCTGGGTA
+CAACGGCAACACTGGAATACCGTTTAGTCGATGTTGAGCATGACGTACAACAAGCCGTCGCGGGACACGTTCCTGTTGGC
+AGTCGCTTATACGCCGATAAAACAGGTGGTCCTATTCTATTAGATAGACGGGTTATCGTGACGGGCGATCAAATTGTCGA
+TGCGGCTTCTAATGTCGATGACAACGGCAGACCCTCGGTCAGCGTAACACTCAACGGTGTCGGCGCGACTAAAATGGGTA
+ATCTGACGAAAGTCAGCGTTGGCAAACCAATGGCGGTGGTGTTCATTGAATATAAAAATGAAACCAAAGTGGTTGATGGT
+GTCAAAGTCCGTCACAAAGAAAAAGACGAGTGGTGT
+>generic513
+AATCAATCGCCGCCTGTGATGGAATTGGAAGAGTAATGTGACTAATGCACCTGTGATTATTGTCATCGAAGACGATCCGC
+CGATTCGGCGTTTTTTGCGCACGGGTTTGAGTACGCAGGGCTTTACCGTATTTGAAGCGGACACAGGCAAACAAGGCATT
+ATCGAAGCGGGCGTTCGTAAACCCGACTTAATCATACTGGATTTGGGTTTACCCGACATGGACGGCGTTGAAGTCATCAA
+AGCCATACGCAGTTGGTCAGCGATACCGATTATTATTCTTTCGGCGCGTAGCAGTGAACAACATAAAATCGATGCCTTAG
+ATGCAGGTGCAGATGATTATTTAACTAAACCGTTTGGTTTGGCGAATTACTGGCGCGTATTCGTGTGGCATTACGCCATG
+CCATCCGACCGATGGAACACATACAGGCGGATATATTTGCCACCGCGAATTTGAAAGTTGATTTTACACAATCGGGTGGT
+GACGATTGATGATGAGGAGGTTCATCTC
+>generic514
+GGCCGCCGCTCATGAGCCAAGTTTGGTTGGATCGTTGTGCTTGGCTGGACCGGATCGGCGCGCATGCTTGGCCGGTGCTG
+GGTGCGGTCTATGCCATCGAGGCGGTCAAGCGCGTGCGCGGTATGCATCTGATCCATCCACGCCGCACCACATCCTTGCG
+GCCGATCACGGCTACGGCGGCTGCCACAACCCCGCGACAATCCACCCTTTGAAGCACCTATGGACACCTTGGTATGACGA
+CCCCCGCAGCAGCACCGACTTCGCCCCCCAAGATCGCTCGCCCCGAGGTGGTGATCTACACCGACGGTGCTTGCAAGGGC
+AACCCTGGCCCGAGGCGGCTGGGGCGCTTGGCTTCAGAACGGTGCCCATCAAAAGAGCTGTTTGGCGGTGAAGCGCTCAC
+CACCAACAACCGCATGGAGCTCACCGCCGTGATCGAGGCGCTGGCCAGCTTGAAGCGCAACTGACGAGTGGTGT
+>generic515
+ATCCGGAGCAGCCGATCTTCAAGTGCGGGTTCTCGATGTTCAACACGACCTTCGAGGACATGACGGTGAACAGCTACCTC
+GTGTGGGACGTGAAGACGAAGCTCGCCGCCGCCTTCGACACCGGCGCCGACTGCACCGCCATGCTCGACACAATTTCGTC
+CGAGCGCCTCATGCTCCGGAACATCTTCCTCACCCACACGCACCCCGACCACATCGCGGACATCCACCGGCTGACCGACA
+CGGGCGCGGAGATCTGGGCGAGCGAGCTCGAGCCACTCGGCCGGCTCGGCGCGAAAACTTTTCAGGAGAACGCCCACTTC
+CACCTCGGTGAACTTTCCATCAAGACCCTTTTCACCTGGGGCCACTCGCCGGGCCAGACGACCTACTTCATCTCGGGCCT
+TTCCTGGCCGCTGGCCATCGTGGGCGACTCGCTGTTTGCCAGTTCAATGGGCGCAGCTCCACCCATTACGACATGCAACT
+GCGCAACAACCAG
+>generic516
+CGGACAACTCCCTCATCCTGACTTAGAGCGGTTTTAAATATGGATAACACTGAACAATTACACCAGCGTGTTTTATCCGC
+CATTGCCACCAAAACCCCGCTACACATTATCGGCGGTAACAGCAAAGCCTTTTATGGCAGACCAACCCAAGGCGAACCGC
+TCCATGTCGCTGAACACAGCGGCGTGATTCACTACGAACCCACTGAATTAGTCCTCACTGCCCGTTGTGGTACACCGTTG
+GCAGACATAGAAACCCTATTAGCGGCAAACGGGCAGATGCTCGCCTTTGAACCGCCGCATTTTGATAAAACTGCCACGCT
+GGGTGGTACGGTGGCAACAGGTTTATCGGGTTCAAGACGCGCGTATACTGGCGCGGTTCGGGATGTGGTGTTAGGTGCAG
+GTTTGATTAACGGGCAGGGTGAGGTGTTAAAATTCGGCGGCGAAGTGATGAAAATGTGGCGGGTTTTGATGTGTCACGGC
+TGCAAGTCGGCGCGTTAGGCACACTGGGCGTGTTATTGGATATTTCCTT
+>generic517
+CGGATCCGCCCGCGCTCGAGCGCCGTGGCGACCCGCGCGGACGCGAGGGTGAGCTGCTCGTCTCGCGGGCGAGGGGCGAG
+AGGGAGGAGACCGGCTTCGAAGGGAGACATGGGCACGCCCGCGGGTAACCCGGCGGCTCGGCGGGTTGACGAAACTCCTC
+GGCCGGGCACAGAATCGCGTGCGAGCGCGTCTGAGCAGCCTCTGGCTTCTGGTGACGGCTCCGGCCGAGTGGTCGGCGCG
+TCACTACGCGCGAAAGAATCGGATGGATTATGCCGCGCTCTACCCGAGTCGAGCGCACGGGAGAGCGGATGCGGACGTTC
+AGAAAGACGCAGGGGATGCAGGTCGCGACGCTGGCCGAGGGCGCGATTATCGGGAAGTTCGATGACTTCCAGTTCAACCT
+CGAGACCGGCGCGATCTTCGGCTACCGGCTGAAAGGGCCCCGGCGTCTTCGGCAAGAGCGGGGGCGTGCCCGCGGCGGCG
+CTGGCGCTCTTC
+>generic518
+GTTTTGATGGGCGGCACGTCCGCAGAGCGGGATGTGTCGTTGATGTCGGGCACGGGCGTCTTGCAAGCCCTGCGCAGCCA
+AGGCGTGGATGCACATGCTTTCGATCCGGCGCAGCGTCCGCTGGGGGATTTGCGCAGCGAGGGCTTCGACCGCTGCTTCA
+TCGCGCTGCACGGTCGCCACGGCGAAGACGGCTCGATGCAAGGCGCGCTGGAGTTGCTCGGCATTCCCTACACCGGCTCA
+GGCGTGATGGCCTCGGCCATCGCCATGGACAAAGTCATGACCAAGCGGGTCTGGATCGCCGAAGGTTTGCCCACGCCGGC
+TTATCGCTGGATCGGCCCGGATGATCGCAGCGATGAGCGTGTGCGCGATCTGACCGCTGATTTGGGGCTGCCGCTGATGA
+TCAAGCCGCCGCGCGAGGGCTCTTCGATTGGCATCAGCAAAGTCACCGACGAA
+>generic519
+GCCAGTGCCTGGCCGCTTGCAGGTGATGTTCTCACCGCTGAATAACTCACCTGTTCTGATGGCTTTGCTGGCCACCAACG
+ATTTACGGGCAACTAACTTATTCTTCGCTTCACTCGAGGAGAGATTCTTAATGCCATCGCCCAGCGCGATTTCGATATTT
+CGAATCGCAGCAACCATTGCTCTGAGTTCTACTGGCTCAAGGCTGGCTTTATGGTCGGGCCTGGTAGGTTACGATCCAAC
+GTGAAGTGCTTTTCGATCACGGTCGCGCCCATGGCCACCGCGGCAATCGCCACTTCGATGCCCGGTGTATGGTCAGAATA
+CCCCACCGCTACACCAAAAGCTGTATGAATGGTCTGCATGACGCGCAAATTCACTTCTTTCATGGGAGTGGGGTATTCAG
+TCGTGCAGTGCAATACGGTCATTTTGCCACGCTGTGTGCCGGCATGCTCAAGCAGGTCGATTGCTGCCTC
+>generic520
+TCAATGAGCGCCTCGAAGGGCGCAAGTCGCGCGGTGGGTCGGATTCATGAGCGTGCCGAGAGTCGAGCCCGATCGCCGGC
+AGGAAGAGTTGCTTTTCGTGTCGCCACGCTTTCTTTTTCCCGTCGACTCGGGCGGCAAGATCCGTACCACCCAGATCCTG
+CGCGGGCTTAAAGGCGGGCGCTTTTCCATTCGACTCGTATCGCCCGCCCGCCCCGAACTGGTTGGCAGGTTCGGTCCGCA
+GTTGCGTGAGGTGTGCGACGAATTCCTCTGGTGGCCGGAGCAGGAGCGTGGCTCACTGTGGCCGTTGCGCAAGGCGCTTT
+ACGCTGCGAGCAGTTTGCCGATACCGGTGAGATCGGATTGGAGCGCAGTGGCCGCCGACATCGTCGATCGTGCCTTGGCC
+>generic521
+ACGAATTCCTCGATGTCGAGTGGCGCGTTGTCGGGCAGACTCAGGCTGGCGAGCATCTGCTTGGAAAGCATATCGCGCGC
+CGTTTTCCTGACCGGCTCGGTATAGTTGCCGAGGTAATAGAGGAAAAGCGAGAGCCCATGCTCTTCTGCGAATGCGATAT
+AGAAAAAATTAAACGGAAAAATGGCATGGAAATCAGCCAGAATTTACCTGTACGAACTCTTTCCACTGCGCAACGTGTTC
+GTGCGACAGGATGACACGCTCCAGCACCCGGCTCTGGCGCTCGAGCAAATACCTTTTCGATCAGCGTGGAAGCCAGGTCG
+GTTAACGTTCCGTTGAATTCCCCCATGGTTGACCGCACGTAATTGCCGTTGCGGTACCACTGTCGCTGCCGTTCGTCGAG
+CAAGTGCCCGAGGGTGGAGTCGAGGCGTTCGCAGGTTTTCTACGGCCTGGTCGA
+>generic522
+TTTCTTTTCGCGTTAATAATATAAAAATATTAGCTATTCATAAATTTCCTATCAATGTAAAGTACTGAGTGATAGAGTTC
+TGAGGAGTGAAAGAAATCATTGTATAATAATGCTTTAAATTTTATGTATCGCGACTTCTTCGATAATAATGTAGTTTATA
+TGAGAGAGAAATGAATCAAGAAGATCAATTTGCGTCCTAATCATGAATAAAGTTGCCAATAAGAAGCAACCTTATCATTG
+GAGTAATAAATTAATCTGATCATGCAAAAATTACATTCTCAAGAGTATAATTTACGCAAAGATATCTATTAATTCGGAGA
+TGCTATGTATTTTATACCGAGTAACAATTATTTATAAGATGTTATTTTATGATATTTATTATAATTTAAGAAGTTAAGAA
+TAATTTGCCAGTATTTTTAAGATGATTTGCCAGTACTTTTAAGATAATGATTCTATAGAAAAAGGAGGACGAGTGGTGT
+>generic523
+GGCGCGCGAGGTGGTCGAGGCTTACGGCAGCGACATCGGTGCGCATCCGGTGGGCACCGGCCCCTACGTGCTCAAGGAAT
+GGCGCCGCAGCAGCCGCGTCGTGCTCGAGGCGAACCCGGGTTATCGCGAAATGGTGTTCCATGCCGAGCCCGAGGACACG
+TCCTGGGATGCCGCTATCGTAAAGGCGCTCTCCGGGCGCCGCATTCCGTTCAACGACCGCATCGAAGTCAACGTAATTGA
+GGCGGAACAGCCGCGCTGGCTGGCGTTTCTCAATGCCGAGATCGATTTGATCGAGATTCTTCCCGAGGAATATGCGAACG
+TCGCCGCCCCCGGAGGCAAGGTCGCACCGAATCTGGCGAAGCAGGGGATACGTCTGTCGCGCGAGTCCAAACCGGACGTC
+TGGTACACCTTCTTCGGTATGGAAGATCCGGTGGTCGGGGGCTATACGCCGGAGAAGATCGCCCTGCGCCGCGCGATTGC
+GCTCGCCATCGATACCCGGACCGATGTCGCC
+>generic524
+CAACACTATCAGTGAAAATATCGTGGCGTTTCGGAATGAAAACGGCGCGTTTACCAATCGCAGACAATTGAAAAAAGTCC
+CCCGTTTAGGTGAAAATACCTACGAGCAAGCGGCAGGATTTTTGTCGGATTATGAATGGCGACAACCCGCTTGATGCTTC
+TGCGGTGCATCCTGAAGCCTATCCTGTTGTGAATGCGATTATCGAAAAAAGCGGCAAATCCATCCGCGATATTATCGGGC
+AAAGTAGTTTTTTACGAAATTTGAATCCGAAAGATTTTACCAATGCGTTTTTTGGTCGTACCAACTGTGACGGATATTTT
+GCTGGAGCTGGAAAAACCGGGACGTGATCCACGCCCTGAATTTAAAAGTGCGCAGTTTAAAGAAGGCGTGGAAAGTATCA
+GCGATTTAAAAGTTGGGATGGAACTGGAAGGTCTGGTGACGAATGTGGCGAATTTCGGTGCGTTTGTCGATATTGGCGTA
+CATCAGGATGGTTTGGTGACGAGTGGTGT
+>generic525
+GTTTTCTAGATGGTGGGCGGATCTTCAACGACACCGTGGTCGAAGCGGTGCGCCGCTTGCCCAGCGGCACGGTCGATCTT
+CGCTTTGCGGGCATGGGGATTCATCCCGTGGGTGACTTGGCCAGTCGGCGCGCGCTGATCGGGCCGCTGACCCAAAACAT
+CAAATATCAAAAGCCCGAAGACCGCCATGAAAGCTGCCGCCGCCTGCAAGACTTGGCAGAAGGCGCGCTGCCCGACGACT
+TGATGATGCGGCCTGAGCATGTGCAAACCCTGCACCGCCAAGGCATCGACATCGGTGGCCATACGGTCAATCACCCCATT
+CTTGCCTTGCTCGACGAAGCCCAAGCGCGCCAAGAGATCGAAGCCAATCGGGCCTACTTGCGTGATCTGACGGGCGCAAC
+ACCGCGCACCTTTGCGTTTCCCAACGGCAAACCGAACCGCGACTACACCAAGGCGCAGGCCGACTTGGTGCGCCAAGCGG
+GCTACGAGGCA
+>generic526
+GTTCACCGACTGCGCACAAGCAGCCATTTCTTTGTCCCCATCGCCCAACCAGTTGCAGGCAATGCGCCAAGCAAGCGTCA
+CCTTTGTACGATGCAATCGCTGGCTGAGGTGATCAGGGCACGGGTGGGGCTTGCCACCAGCGCTGGCCGCTGCGTGATGG
+TGGTGGGCATGCTCTTCGGCCGCCAACACGGAAGCCGACAAGGCTGCCAAAGTCAGGCCACCCAAACCTTAGCATGAGAT
+GACGTCGTTCCATAGGTTCTCCTTGTGAATGATGTCGGTCACTATAGGCCGAATCAGGCCGTGGCTGAACCCACGAGATA
+CCCAACGATGATCAAGCGCAAAGCGCACCGCCTTGCGCCCGGACGTCTCAGATCGACTGCCCGAGGCGTGGAGACAAACC
+ACCTTGGCGGCTTGATCGCGCTGGACAAAAGCCAACCACACCGTACCGACGGGCTTGTCGGGCGTACCGCCCCCACGGC
+>generic527
+TGCTTGCTAACGTACGCGGGAAGTATACTAGCTTACCCGGACCAGGCGGCGGCTTAACATTAAATGCAAGCGAGCTACGT
+AGCGAGGGCCAACGGCTCCAAGATGACTGTGTACAACAGATGAAGGACATGATCGTGGGGCAAAACGGTCCTGACAACTT
+CTTTGCCCCGTTCGTGATCGGGTAATTGATGCGTCTAGTAGAGGTAAAAGTCCAAGCAAAAACAGCTAAGGCAGACATCA
+TCCGGCCTATGTATCAATGGATGCCTCTCTTAAAGGCACTAGAAGAGTATACCCTGCACAACATCGAGCTACGAGTGGTG
+T
+>generic528
+AGGGGAGGTCCTCGGCGCGGATGATGGGGTTGTGTTCGGAGCGGCGGAAGATCTGGTCCATGCCGGTCATCCTCGTGTCG
+TCTCGGCCGGAACGGCGCGTGCAGCATCCGCGGCAACCGCTTCGCGCAGCCCCCGCATGTGCTCCAGCGCGGTCAGCCAC
+ATGAGCGTCGACTCGGCGCCCTGGTTTACGTTCACCCCGTTGCGTTGAGGCCGTCAGCGCAGGCGCCGCGCTCGGGTTCG
+GCGAGCGGCAGGCGCAGGTCGTTCTGGCCCAGAAACCAGCCGTAGGCGGCCTCGGCTGCGGCAAGGTAGTGATCGCGCCC
+GGTGGCGCCCCAGGCGGCTTCGGCCGCCACCAGGATCGTGGCGGCCTCGATGGGCTGCTGGTCAAACTGGGCGCGCTCGC
+CTGCACGCGACCACCAGCCCGCGTTGCCGATGGGGCTCAGGTGGCCGTCGGGCGCCGTCTGGACCTTGATGAGCCAGTCC
+AGGATGCACGAGT
+>generic529
+CTTTTTAGTTTTCTAATCGCACTGCCTTTGTGTCTTGGGATTGCGATGGCATCCGGTTTCCCACCTTCTGCGGGGATTAT
+CACCGCCATTATCGGCGGCTTGGTCGTGTCACGGATTAGCGGCTCTTTCATCACCATTAACGGCCCCGCCGCTGGTTTAA
+TCGTTGTTGTATTAAGTGCCGTACAAGAATTAGGTCAAGGCGATGCAATGGCGGGTTATCGCTACACCTTAGCCGCGATT
+GTGGTTGCCAGCGTCATTCAAATTTTATTAGGTTTATTCAAAGCCGGTTCGTTAAGCTCCTTTTTTCCCGCCTCGGTGGT
+ACACGGCATGTTGGCAGCGATTGGCATCATTAACGAGT
+>generic530
+GCGCAGCCGGTGAGCGTCGCGACCACGGCGCGCCAGTTCCAGCCGCCGTCGTAGTGGTACGCGCCGCCCACGCGGTAGAG
+GTCGCCAAGCTCGAGCTTGCGGCCGCGCACCAGCCAGTAGTCGGCGATGAGCACGCCGGCGATCGAGCCGAGTCCCCCCG
+AGTAGCCCACGAGCCACGTGAAGATGTAGCCCTTCGGGTCGGCCAGCAGCCGCCATGGCTGCATGAGGATGCCGACGATT
+CCAGTGATCAGCCCGCCGGTCTTGAACGAGATGTACTTGGGAAGCGCGTTGGCGAAGTCGTTGGCGGGGAGACCACGTTC
+GCTGCGATGTTCACCGCGACGGTCGCGACGACGACGGAGAACATCGCGAAGCCCACCACCCAGGCGTTGGAGAAGTGCCC
+GACGAGCTTCACCGGGTCCCAGATCGCCTCGCCGTAGAGCAGCGCGCTGGCGCTGGTGATGAGCACGCCCATGGCCGCGA
+ACGCGAAC
+>generic531
+TTTTCGTTCGCACTCGTTCGCCTCCCCACTCCCTAGGAACAATTTTGCTTCCTGCGAGACTAATTTCTGAACGACCGACG
+GTACGAGAAAACCTGCTCCTCTTGCTTTCAATACGGCCATGAGATATACGACTGTCCGTAGATACACTACTGCGTGAACC
+GATCTGTCTTCAGCCAGCGTGTCTTCTATTCGTAGACTTAGAGCCGCGGGAACAACTCTGAAGACCGATTTATTAGGAAC
+CGCCAATCGTGGCGTAGCAGCCACAACGAGAGCCGCATGGATCTAAAGTACATCCGATGGGCGTATGTGATCGAGCAGCA
+GGACCTGTACAATCGCGTGAATATCGACGGCGAGATGAGCGTTGTAGAGAGCGATAAAAGCTTCTTCATGCGTTGTCCTC
+GTCTGCGCACTGACCGCTTATAACGCCACCATCACAACTTCCACTCGAATTTTGTCTTGAATCAGCATGATGGCAATAGT
+CCCCCTCAAC
+>generic532
+GCCAAGTTGATCCAAACCGAAGGCATGGCCGCCAAGCAGCCGATCGCGGACAACAGCACGCCGCAAGGTCAGTCCAAGAA
+CCGTCGCGTTGAATTTGACGTGACCGGCACCCGCAAGCTCTGATCAAACGCAGCGGGTTGTTTTGTTTGCCGCCACAGCC
+GATGAATAATTAGCTGTGGCGCGCACTGCGTCGATGAGATCCTGACATCGCTAGGAAGTCCTCCATGAAACGATTCAACC
+CCCTTGCTTTTCTTTGCGCGGCAGCACTGACCTCAGCCACATCGCTGGCATGGTCGGCGGATAAAGCCAACAGCCAAGCG
+GCGTCGCTAGAAGCCCAAGCGCTAGCCAATGAAAAAACGCCGGCGGGAGGCGTAGTGCAAGAAGCGCCCGTCGTACCCGA
+CGGCCCGACCACGGGTCGTAGCAGCACCGGCACCCAAGGTACGTCGCAGAAGAACAGCCAAAACCTGCTCAGTGGCGGCG
+GTGGCTCTACGCAT
+>generic533
+CGGCCGTACTCGGCGACGAACCAGCCCAACTCGCAGGCAATCCACGGCGCGGGCAACATCAACAACGCCCAGCGCAGCAG
+CCAGCGTTGTTCGCCACAGCGCATCTTCAACGTGGACCAAAACGCGGTCGCAAAGAGCAGCAGCATGGCCATCCCTAAGC
+CGACCATGGCGCGAAAGCCCCAGAACATCGGCGTGACCTTGGGGATGGTGTCGCGCGCGGCCTTGTCGATCAGCGCGGGC
+GTGACCTCATCCATCGACTTGACGTACTTGCGCAGCAGCAAACCGAAGCCCAAATCCGCTTGGTGTTGCTTGAGGATGGC
+TTCCGCCTCCCGGTGACTGCGGTCATGGCGCAGCGTATCCAGCGCCTTGACCGCTTCGATGCCCGAGATGATGCGGAGGC
+GGTTGCGCGCGATGAGCTCCTTGATACCGGGGATCTCCTTGTGGATCGAGCGCGTACCGATCAGGCCCATC
+>generic534
+GTTTCGGCAAACCCCATCACTTGGGGCCCCATCACTTTGATGGGAAAAGGACGCAAGGGTAGTTTGATCGGCGACTGTTC
+GGGGGAGGATGCAGTTCTGGGTACTCATGGGGCAACGTCAAGGGATTGTTCGATGTGGGCTTGGCGGTAAGCCTGAGCCA
+AACGGGCGTAGACCGGGCCGGGGCGACCCCGTGCCGTGCCGTGCCCCACCAGCCTCGCCGTCGAGGCGGGTGACGGCCAG
+CGGTTCGCGGTCCGGGTGGTTGAGCAAAATCTCGCTGGCGCTGTGGAGTTCAGTGGCGGTGATGGGCCGCAGATGGCAAG
+CGATGCCCGCATTTTCAGCCAGTTCACGCAGTCCATCGACCGGCGTATCTCCGGGGCGATACACCGATGTCGGGCCGCCG
+ATCAGGGCATCTTCAAACACGATCCAGACATCAGCGAGCGCGCCGCCGGTGACATCCACCCGGCCATGGCCGTGATCGCG
+CAGCAAGATCGTCTCGACCCCT
+>generic535
+CCGGTGGACGCTGAGCTGCCGGCTCAGGCAGCGGCCGAGAAGCTGCTCGGCGCGCTGCTGGGCGCTTTGCCGCTGCGCCA
+AGCGGTTGATCTGGCCGCTGAGTTGAGTGCTCAGCCGCGCAAGGCGCTCTACGCCCGCGCCCTTGAGCTGCGCCAAGCCG
+AGGATGCTGCTGCTGAGGATTAACGCTGGGCCGAGGCGGTGCCTGCGCTGCTTTGACCGATGTTGCGCGCCAAGATGTTG
+GAGAACTCTTCCATGAAGGTGTCCATCTGCATGGCGATGCGGTCGATGTCGTGGGCGAAGCGGTTGTAGGCGATCACCGC
+CGGGATAGCCGCAAACAGGCCGATGGCGGTGGCGACCAGCGCTTCGGCAATGCCCGGCGCCACAGTGGCCAAGGTAACTT
+GTTGCAGGTTCGACAGGCCCGTGAAGGCGTGCATGATGCCCCAGACGGTGCCAAAC
+>generic536
+GTCAATGCTTCGCTCAATCCCGGCAGGCGTGGCAGGCGTTCCTCGAGCGAAGTTGCTTCGGTCAGTTGTTGTTTGGCGAT
+CAAGTCCGTCAGCAGTTCGATCGGCGCGTAGGTGCGGTTGATTTCAAGCACCGTTTCGCGGCCGATGCTTTCGAACAGCG
+CATCGGAGGCCGACAGCATGAGTGAGGTATTCTGCCGGTAGTTGTGCCAGCCGATGATCGCGCCGAAGACGACGATTAGC
+AGCGTGAACAGCACCGAGATATGCACGTGCAGCGGGTGCCGTCGCCCCGTCGTGTCGAGCGGTGCGGCGGCTTGTGCAGA
+AGCGGAATGCGCAATTGTCATGGCGAATCTTCCTCCCAACCGTTTGATCGGCTGCAGACACGATTCTAAGCGCGTCCGCA
+CAAGCCGGGTAAGCTGCAACAATTGCCGCGCAGCCATGACCGCATGACGAGTGGTGT
+>generic537
+CGACGGCGCCGATGTGCCGATCATGGGCGTGAACCTCGGAAAGCTCGGATTCCTCACGAGCTGCCGCGGAAAGGACTTCG
+GCAGGATGCTTCCGCGCCTTTCGAAAGGACAGTTCCTGACCGACTCGCGGATGACGCTCGAGGCGACGCCCACCGGCACG
+GGCAAGCCGGAGGGCCGCATGCGCGCACTGAACGACGTCGTGCTGCACAAGGGCGGCTTTGCCCGCGTCCTGCGGCTGCG
+CGTGGCGGTGAACCGCGAGGAGATCGGGACGCTCGCGGCTGACGGCATCGTGATCTCCACGCCCACCGGCTCGACCGCCT
+ATTCGCTCTCCGCCGGTGGCCCGATCGTCGCGCCGACCGTGGATTCCATCCTGATCACGCCGATCTCACCGCACACGCTC
+GCGGTGCGCCCCATCCTCCTCCCGCCGGATTCCGTGATCACCGTGCAACCGGAGATGCGCCGGAGGAGGTTTTGGTGACG
+GTGGATGGGGCAGGTCGGC
+>generic538
+CAGCGGCTAGGCTCCAGGCGTGTTGGCGCCAAGCGGCGCGGATGCGGGTGAGCAGGGTCATCAGGGGTTCGACGCGGTTG
+GCCAAGGCGCGGACGACGATGATGCCTTCGTGGGGGCTGGTGGCACCGGCCACCACGGGGGAAGTTGCTTCGGTGGGCAG
+GAGGGCGCGGGCGGCTTCGAGCAGGCCTTCGCGTTGAGCTTTGGCCCAAGCGTGGCCTTGGGCGAACCAGATCATGCCGA
+GCACGCGTTGACCCGCCAAACCCAAGGGGAGGCCAAGAGAGCGTGATCGTGGGCGTCGATGCGGGCGCGTTCGAGCCAGC
+GTCCCGGCAGCTCCAGATGCTGCTCGAAGCAGCCGGTTTCAAAGGCTGCCCCAGCGGCGGGAGGCCAAGCGCCAAGCCAT
+CCCAGCCGATCATGCTGGCTTCAGGGGCGAGTTCAAAGCGCAGGTGATTGCGCGCCACGAGTGGTGT
+>generic539
+ACCGGAACACCCGCCAGCGTGCGCCCGCCGTTTAGCAGCTCGGGGACGATGCGCGTGAACACCCGGTCGGGCAGCAGGGT
+ATGCGTGACGCGTATGAACTCGGACACGCAGCGGTCCACGCCGCCAACGCGGGTCAGGATGTCGCGCAACACAAAATCCA
+GCAAACCCTCCATCGGGGCCAAAAGCAAAATCATGATAGCCCGGCGGGTAGCACAAGAAGGATTGGAGTTTCGCAGAACC
+GCGCCGTAGTTTTTGGCGTTGTACCCCTCGGCTCGCCTGCTCAAGGGGGTTTATCATCTGCACGATGAACCGGATCCCCG
+ATATGGCGCAAAATTCGTTTTGACAACGCCATGGCATTGTTTGACGAG
+>generic540
+AAAAGCCATCCACAACAAATTATTTTCAGACAACAATTTGCTACTAGTCAGTGGCGTGGCCGGAGTCGGCAAAACTTCGT
+TGGCTGCCAAATATTTCGAAGCCTTACCAGTCGGACTATGCCCACTTAGCCTGGGTAGTGAGCAACAAAAATATCACTAG
+TGTCTCTATTAAGTGCGCTGGCTGCGCCTCTGAATCTGTGGTTTCCAGATGCCATGCCTGCCTCTGTAAGGCTCGGAGCA
+AATTGCTAACGGTAATGGCGGAACTAGACAAACCTTGTTGCTCGTGATTGACAATGTGAATGAAGTCGAAGACCTTGAAA
+GCATTTGCCTGAACCTGATCCTCTG
+>generic541
+CGCTGACCACCGCCCAGCCCCCAGCGATCACCACCGCCCCAACCGAGGACGTGCGCACCTACGCCCTCAACGCCGGCTCC
+GTCGCCTTGCTGCGCTCGCTGCGCGTCTGGGATGCGTTGCCGCTGGACGCCGCCACCGCCGTGGACGCCATGCGCATCCA
+CGGTGACGCCGGCGGTGAGCTTGAGTTCTCGGCTTGGCAGCAACGTGAATCGGCTTGGCTTGGATCGTGGACGCCCAAGC
+CTTGGACGCCGGTCTGGCCCAACGCGCTGCTTTACGCCCGCATGTGCAGCGCGTGGCCCAGCCGGTGGATGCGCCCTTGC
+AAGCGATCTGCGAAGGTAAAAACTCCGCCGCCCGCGCGGCCCACGGCGTGACGTTCAAGCGCGACGCCTACGGCCACAGC
+GCTTTGGCCGCGCGCATCGTCAGCGACGCACCCCATCAAGG
+>generic542
+CTTCCGCGCCGAGGGGCTCTTCGCGCCCGGCCCGGCGCAGCGCTACCGGCGGGAGATCCTGGAGGCGGGCGGGTCGCGCC
+CCGCGGCCGAGCTCGTGGCCGCGTTCCTGGGGCGGCCGTCCTCGTTCGACGCCTTCGCCTCGTGGCTGGACGCCGGGTGA
+GCGTGCTCCGCACCGCGCGCGCCCTCCCCACCATGCTCCGCGTCGGCCTGGCCGAGGCCGTGGCCTACCGCGCCGAGTTC
+CTCGTCTGGCTGCTCTCCACCAACATGCCGCTCGTGATGCTGGCGCTGTGGAGCGCGGTCGCGCGCGACGCCCCGGTGGG
+ACGCTTCGGGCAGCCGGAGTTCGCCGCCTATTACCTCGCCGCCCTGGTGGTGCGGCTCCTGACCGGCGCCTGGGTCATCT
+GGGAGCTGAACCACGAGATCCGGGAGGGGAAGGTCGCCTTCCGGCTCCTGCGGCCGGTCCACCCGCTCGTCGCCTACGCC
+TGCGAGAACGTGGCCGCCATGCCGCTCCGGCTCGCGCTCTC
+>generic543
+GCACCAAAAGCGGCAAGCCGGCGCGCTGCATGGCTTCGAGCACGCCGTAGGTCTTGCGGATGTCGGTGACACCGGCATCG
+CTGTTGGTGGTTGCGCCAGCCGGGTAGAGCTTCAAGGCGACCACGCCAGCGGCTTTGGCGCGCGCGATTTCCTCCGGCGG
+CGTGTTGTCGGTCAGGTAGAGCGTCATCAGCGGCGTGAACGTCACGCCAGCGGGCACGCAAGCCTTGATGCGCTCACCGT
+AGGCCACGGCCTGCGCGGCGCTGGTCACGGGCGGGCGTAGGTTGGGCATGATGATCGCCCGACCAAACTGGCGTGCCGTG
+TGCGGCACCACGGTGGCCATGGCGGCACCGTCGCGCACGTGCAAATGCCAGTCATCCGGGCGAGTCAGGGTGAGCGAGGT
+GGGGGTAGGCGTCAAAGGGGTGGAGTGCTGTGCTGCGTTCATGGGGTGTGATCGTCGC
+>generic544
+AATGAAACAAGAGGAATACCGGAAACTAGGATTGATTGAAGAAAAATTATCCCCGGTCCATGGGTTGGATCAGCTCGAAT
+CTAGCCCTGTAAAAATCGCGGCAATGACCGTATATGTGACCGACATGAAATCTAAGCTTGATGTACTAGACTATCTGGCG
+CAGCGCGTATCGTTGTTGTTAGGACAGATTAACGAAAAGTTCACTGACAAACGGCTGCTCATCAATGCTCAGCATGAGCT
+GGCCATTAAAACCAGTCATGGCGATGAAATTCCCGTATCAGCCCTTTCATCCGGGGAACAACACCAAATTGTGTTGGCCT
+ACGACATGTTGTTTCGCATAGAGGCGAACTCTTTAGTGATGATTGATGAGCCTGAGTTGTCTTTGCACGTGAATTGGCAG
+GAACGTTTCTTTAGCGACCTTGAAAGTGTGATTGGTGTAGCCAATTTTGATGCACTGATCGCTACACGAGTGGTGT
+>generic545
+CCGAAGGTTGCGGTCGGGCTGGCAACTGCTCTTGTCCTTGTGACGTGCATGGGGCTAACGCGCGCGCAACTGGCCTATTG
+GAAAGACGGCGAAACCCTGCTTCAGCGCATGGTCACGGCTACGGAGGGCAACTACATGGCCCATTACAATCTGGGCAACC
+TTTATGACCGCCAAGGCAAACCGACAGGGAAGTACGAATCAACATCATGAAGCCGCCCTCGTCTTCCAGCCGAACTACGC
+CGATGCCCATAACAATCTGGGCGGCGTGTTGCTGCGCCAACGGCGGTTTGATGATGCCATCTCGCACTATTCGGCCGCCC
+>generic546
+GTCATGACTGCCAACAAATTTAACCTCGGTCTGTGAGACCTCAAAGTCAAACTGATAGTTAATGTTGGGCATGATCATGA
+CAGCCGAGGCTGTCTCGCCTGATGCGGTAAAGAAGGCGATACCTGAGTTGTTGAATCGAGGGCGAGTGACTTGGAATTTG
+TCACGGATGCTGCCTAACTCAAGGAAGCAGATTTTTGTTGTCCCAGTGAGAAAGTCGTTGCTGGTGTTTTTTTCCCAAAA
+TCAACGGTAATGCGCTGTAGCGATTTTTGTCCCACTTGTGCTGTGGCCCAACTCACCTTACGAATCGCGGTTTCAATTTC
+AATTACCAATGTGTTAGCCATGTCGATCCTCCTTTGATGTTGATGTGAATCGTAAAGGTCTTTCACTTCAATTGTGAACC
+GGGCCGGAAAAGCCTAAACGAATAGCGTTTATCTGGTGCCAGGCCGAACAAGAACGAAGGCAGAGTGAGTCATGGCACCG
+GGATAAAACCTTGTTGGACTGAACCGCCGTCATGG
+>generic547
+GGGCGATAACGCTGAAAAGTGAGAATGAAAAAGTGCCCAATTTCGTTCTTCTTACTCCATATTCAGGTAGACGGCGTACT
+CGTGGAAGTCACGGTCGAACTCGGCCTCAATCTCTGCAAACGTGAAGGCGCAGCCCTCATCGGCGGCGGGCTCGTCGGTC
+CAGTCTGGGTGCATGATCAGCCATGGGCGGTTGTGCATGTAGAAGTACTGCTCGCACATCGGGCACTGGGTCGTCTTGTA
+ACCCTTGATGTCCATCATGTAGTTCGCGTCGGGGACGTGCGGT
+>generic548
+GGAAATGTGGCAAGTGGTTAAGGATTTTGCTCAATTATCGGTAGAAGAAGCGAGAGAAAAATATAAGTTAGGTAAAGACT
+CCCAAGATTGGAAAGTCGTCAATGCACAAAAGGATATTAATGAACACGGCATTGAAAACAAAAGGTCGTATCTATTTCTT
+ATCGTCCGTTTGATAAAAAATTCACCTATTTTACGGGTAAATCTAGCGGATTTATATGTAGACCTAGACCAGAAGTAATG
+CAACATTTACTACAGGATAATTTAAGTTTATGCTTCATTCGTAGAAGTAGAGAAACGAAAACCAGTCATTTTTTCGTAGC
+TAAAAATCTAGTTGATAAATCTATTTTGTCATCTTTAGATAACGCGAACATAGCACCCCTTTACCTCTACCCCACAGAAC
+AAAGCACCCTATTTGACCACGACCCAGACCACGACACCCGCAAACCCAACTTCTCCCCCGCCTTCATCACCGACTTAGAA
+ACCCGTTTACAACTCAAATTCATACCCG
+>generic549
+GTTCAAGCTGGGGACGATCTGGGGTATTGGCTCGGGGTGGCGGGTGGCGTGATGATGCTGTTCATTTTTCTCTACCCCCT
+GAGAAAGCATGTCCGTTTTCTGCATCAACTCGGTCAGATGAAGGGCTGGTTGGTGGTTCACATGGCCTTGGGCTTGGGTG
+GGCCGCTACTTATTCTTGCGCATTCGACCTTTCATATCGGCTCGCTCAATGCAGCCGTGGCGCTCTACAGCATGTTGATC
+GTTGCCGGTAGCGGCATCATTGGTCGCTTTGTCTATGTACGGATCACCCGTGGTGTGCAAGGCGAAAAAATCAACTGCGT
+GATTGGCGTGACCGGGCAGGTTGGGACAAAGGTGATATGCGCTCTTTGTTCAAGCTCGTTCCCATTTTGGAAACCCGCCT
+TGTCGAGTTCGAATCGTTTGCTTTG
+>generic550
+CGATTAATTTATCGCGTATCAACCGCCCGTTGACATAAAAAACTGCATATCAGGTTGACTGCGGGAAAAGGTCGGCAAAC
+TCACCCAGCCTGTGAGTTGCAAGCCTGAGGCGGCAACGTCAATTTTTACCGCGTTATTGATAAACTCAGAGCCGCAAATA
+CCCGCTATACGGTATTCCTGTTCGGCTTCACTCAGAGCAGGCTTAAGTTTAAGTATGTCTTTCTGATTGTGCGTCAGGGT
+AAAGCCGATAGAAAACCGACTCAACGCCAGTTTATGCAACAGCGATTCAATATGGGCAAATTCGGTTTTTTCAGTTTTTA
+AAAATTTGCGCCGCGCAGGGGTGTTATAAAACAGGTCACGCACTTCTACCGTTGTGCCTTGTGGGTGCGGGTCGGGTTCA
+GGATCTGCGTGTTGTTCTGACCATCGGCACTGACGCGCCATGCGCATTCTGCATCGGCAATGCGTGAAATCAGCGTTAAT
+CGGGCAACCGAACTGATACTGGGCAAGGCTTCACCGCGAAA
+>generic551
+CGGTGGCCAAAGGGGCCAAGGTGGTGGTCGGGGGCAGCCGGCCTGCTGGCGCACTGGGAGAGCGTTTCTACAGCCCGACC
+GTGCTGGCCGATGTGAGCGCCGAGATGCTTTGTGCCCGTGAGGAAACCTTCGGCCCGGTGGCCCCGGTGTTTCGCTTCCA
+CACGGAAGCCGAAGCCATTCAAGCCGCCAATGCCACCGAGTTCGGCTTGGCCAGCTATTTCTACAGTCGCGACATCGGCC
+GGATCTTCCGGGTGGGTGAAGCGCTGGAGTACGGCATGGTCGGCATCAACACCGGGCTGATTTCGGTGGCCGAAGTGCCT
+TTTGGTGGGGTCAAGCAGTCCGGTTTAGGCCGGGAAGGATCGCGCCATGGCATGGAGGACTACGTCGAGATGAAGTACCT
+CTGCCTGGGCGATCTTCTGAGATGAGAAGACAAACATAAACCGAATCAGCCGGCGGTATGCTTTTCAGCGTGCCCCGGCC
+AAGGCGGCGTGCGCTTCGTGCTGGGTGTTGAACAAATCACC
+>generic552
+CTTGATCGGCGGCAACATCGCCGCTGCTGCGGCCAAAAACGGCTGGGCCGGGGTGGTGGTGGATGGCTGCGTGCGGGATG
+TGGCCGAGCTGGCCCAAGCGCACGTCGGCATCGTGGCTTTGGCCGCCATGCCGCTGCCGACCGAGCGCCGCCAAGCCGGT
+CAGGTCGATGTCGCGGTGCAGATCCAAGGGATCTGGGTGCGCCCTGGTGACCACTTGGTGGCCGACGACGATGGCATCGT
+CGTCATGGCTGCGGTTTAATCGCGCTTTTAAGAAAGATTGCTGCCTTGAATACGCCCCTTCTGAATCCCGCTGTTGCTGC
+GACCCCTTTGGCCGACTGGCCAGCCCTGCGGGCGCAGATTGAGACGATTACCGAGCTCTATCCCGAAGCGGCCATGGCGC
+AGCTCGACGCCCAGCGCGCCACCCTGGCCGAGCCGATGGTGCAGGTTTTGATCGATGTGGCCGCTGACCCCGAGCCGGCG
+T
+>generic553
+CTCACATTCACCCCGGCCGAGAGCCACAGGTTCTGCGCCATCAAGCGGCCAGCCTCCAGACCCAGCGCCGTTTCACGCGC
+CCCGAGCTGGCCCCACTGCACCGAAGCCAGCGCGGCCACATCCCATTGCTCCGTGACGTCGTAGCTCAGGCGAGAAGACA
+GCAGTTGCGACTGGAAGTGGTCCTGCACCCCGCCTTCAAAGCGATCGTCTTGCCACTTGGCGGCCATGCGGCCATAGAGC
+CACCACGGCCGCGAGGCGTGCCAATCGAGATGGGTCGAGACGATGTGGGCCCGGCTGTGCAACTCGCCCAAAGTGGCGTT
+GCTGGCATCGCGTTCGTTTTCAGCTCGTAGCGCGCCAAACCCGAGAGCCGATCCACATCGGTTTCGCGGTACGCCACACC
+GAGCTGCGCCCGGTCTTGCTGCACGGCACCCTTGGCGGCGTAGGTGGTGTTGAGCAAGTAGTTGCGCGCCAGCAAGGTCC
+>generic554
+CGGGGTCGGTGGAACGGGGCAGCACCGTCAGCGACTTCGATGCGATGGAGCAGCGCATGCAGCACTCGCTGCTCACCAGC
+GTGTTGCACCTCAGCCATCAAGACACCCGCATCCACTTGCTCGACACGCCCGGCAGCGCCGACTGCCTCGGCCAGTCGCT
+GCCCGCGCTTGAAGCGGTGGAAACCGCCGCCATCGTCATCAACGCGGCCACCGGCATCGAGCCCATGGCGCTGCGCATGA
+TGACTTGGGCGGCAGAGCGCCAGCTCGACCGCCTCATCATCGTCAACCGCATCGACACCGTCGGGGTGGATCTGCAAGCG
+CTGCTGGCCGACATCCAAGCAACCTTTGGCCGTGAATGCTTGCCGCTGAACCTGCCGGCGCGGCAAGGTCAGGAGGTGGT
+CGATAACTGGTTCGCCCCCGAGGCTACCGCCGGTCACGAGGCCGATTTCTCGTCGGTCGCT
+>generic555
+CCGCTACTAAGCCAAGGGCCAGCACCCTCCCAGACGAACCCGGCCCCGGCCGGGTTTTCTATGGCTGTGAATGAGGGATC
+ACCGACAATTCCGGCCTCTCTGCTCTTTTTCTTGCCTCATGCGACGCCTTTTCCTGCATCTGAGCCTGATTTTTCTCCTT
+GGGCTGACCCTCACAGGCCCGGCCGATGCCGGATCGAGGGTGCTGCTGCGCATCTCGACGCCGGCCGTGCCCGACGATTG
+GCACGCCAAGATGTGGGCGGTCTTCAAAGAGTCGCTCGACAAGCAGGCCCGGGCGAATTCGACGTGCAAATACCATCTGA
+ACGGCACACTGTTTTCGCCAAGGCGCTGAGCCCACCGCCATGGCGCGGGGCAATCTGGAGATGGCCTCCATCTCGGCCTT
+CGACTTGGCACGCCAGGTGCCCGATTTCTCAATCCTCACGCGGGCTACGTCATCCGCGACCCCAAGCATCAGCAAGCGTG
+CTCAACGGGCCCATC
+>generic556
+ACCACCGCTTGCACCAGCTCTAAGCCTAGCGCCACAACAATCCGACGCGGTCCGGGCAGCGCGTAGCCGAGCAACTTGGC
+GGAGGTCTCCAACTCGATGCGGGCGGTTTCCAGCTCGCCCAAGTTAAAGCTCGACAGGCCCAGATTCAGGTACCAGCGCG
+CGGAGGTTTCGGCGTCGGTGGCGATGGGTTGTTCGGAGCCTTCACCGAAACCTTGCTGCATCAGCACGATCAGGCGATGA
+AACAGCCCTTGGGCCTCGCGGTAGGCCCCGGTGCGCAGCGCGTGATCGCCGGCTTGCTCCAAAGCATGCAGGGCGCGCAC
+GGGATCATGGGCTTGGGACCAATGATTGGCGATGCGCGCCAGCAGCACATGGGTGGCGCGGGTGGCACTGGCATGGCGCT
+CGTACCACGCGCCCAGCGCAGCATGCAGGGCACGGCGCTGGCTGAACGGCAGCAGGCTGTAGACCGC
+>generic557
+CCGAAATTCTTCAGCCCGGATGGCTCGATTCGGATCCCGCCGAACTCTCGCTGCACGAACCGCCGGAAGACTCTGGCATC
+CCCGATCTTCATTCGGCTTGGCGGCAGCGGTATGCCGACCTGCAGGCGGTGTCCCACGGCCACCACGAAGTGCTGATGCG
+CTTCGCCGCGTCCGTGGCCCGACGCGAAGGCGATACTCCTCACCATATTGCGCGTATTGGTCGATTATCCGAATGCCTAG
+CCCTCGCCATGGATCAGGATGAACATTTCGCGCGACTCATGCGCCTGGCCAGTCCGCTGCACGACATCGGCAAGATCGGA
+CTGCCGGATTCCCTCATCAGAAAGCAGGGTCCGCTCAACGACGAAGAGTGGGAACTGGTGCGCCGCCATCCCCAGACCGG
+CGCGCAGATGCTGAACTCCAGCAATGTGCCAGTGCTCCGCCTGGCTGCGGAAATCGCCCTGTTCCATCAC
+>generic558
+TTTGCGTCTAAATCTACTTTAAAAACTTTTCCGTCCTTAAAAATAGGTATAGGGCTAGCTCTATAAACATTGAATAAATT
+TTCTTGTTTAATAATAGGAATTCTTAGACTGTAAGTAATACTTTTGTTTGTGTAATATGTTTGTGTATAAATATCATTTA
+AATTATCACTTAAAGGTATTAGTCTATTCCTAAAATCCGTTGCTAGGTCTTTTAATTCTTTCTTGCTTAAAAGATATGGT
+GAAGCTTTGTGCATATTAGCGTTAGTCATAACACTTGCTGTTTTTAAAATAGTTGATTGAATTACTCCAACAATATTTTG
+TAAGGCTAGTTTATGGTCTAGTTGCTGAAACATAGTAGCTGTTGAAAATTCCGATTTTCTAGCAAAATCGTCCATAATGG
+AAATTGTTTCTGCCATAGATGTATATGTGTACTGTAATTCATCTTGGTTAATAGCTAATGATTGAATAGCTACACAATGA
+TTTTTACGTAGTGGTGT
+>generic559
+CGCCTCAGGGACCCGGATCACCCGCGGTTCGACGGGAGGCTGGCGAAACAGTACGAGGCGGAGATCCTCAAGGTCTACCG
+GAACATGGACGCCACCGTCGGAAAGGCCATTCGTTACGCCGACAAGGACACGACTCTCATCGTCATGTCCGACCACGGAT
+TTCACTCCTTCCGCCGGGGAGTGAACCTCAACACCTGGCTCGTCCGCAACGGCCTGATGAAGCTCAAGGGAAAGGACGAG
+AAGAACTACAGCGTCGAGGATCTCTTCGGCCACGGCGACTTCTTTCCGAACGTCGACTGGAGTGGGACGAAGGCTTACGC
+CCTGGGCCTCGGGCAGATCTACATCAACCTGAAGGGCCGGGAGCAGATGGGGATCGTCGAGCTCGGGCAGGATTACAAGG
+AAGTGCAGGACCGGATCGTCCGGGGTCTGAAGGCCCTCCGGGACCCCCAGGGACGGAGCGGCGCCCTTCCACGACGTGTA
+CAAGCGGGAGGACATCTTCTCAGGGCCGTACTCGTCCAGGCCCCGGACCTGCAGGCGGGCTTC
+>generic560
+GAACATAAATAGTTTAAGTTTTGGTATCTATTAAAAGTAATGTCTTGTCGCTGTGGTCAAGGGGTCTAGGGTGCTGATAT
+TTGACTTAGAAAGTGGATCATTATCAGTTCGGAGGGTCATGGTTTGAATACTGGGCAAGGCTAGACCCTTAAAATAGTTT
+ATTTTCAGAACTCATGGGTCGAAAACTCATTAAAAATTAAATAATGCATTTTTGTCTGCGAGTGAAGATAATCCGATTAT
+AAAACAACTTTTGGACTATGAGGTTTTTTAACGACCACCCATCCACCCCTCTCAGTACAGTCTCAATTTTAATGACCAAA
+TAAGTTCGAATTTTTGCAACACACAGTGGAGCTGGTGTCGTGAAAAAAACATGTGTTTTGGCGGGAAAAAAAGCAAAGTA
+GTTTAGCTAAACAAAGATCACCTCATTTACAAAATAAAA
+>generic561
+GCTTTGGCGAGGTCGGTTTTCGTCACTTTACCAGCGGCAAAACCCGATCCACTCGCCGAAAGACATGGCGGGTCTGAAAA
+TCCGTGTCCAGGAAACGCCTCTGTACATCACCGAAATGAAGGCCCTGGGCGCCCAGCCAACGCCGATCGCCTTCCCGGAA
+CTCTACACGGCCCTGCAGACTGGTGTCGTCGACGGGCAAGAGAATCCCATCCCAACGATTATCTTCGCCAAGATCTACGA
+GGTTCAAAAGCACGTGACGCTTGACGGACACAATTACGGCATCGACTGGTTCCTGCTAAGCGACAAGTTTTATAAATCCC
+TGCCTGCCGACCTGCAGAAGATCACCACCGACGCTGCCAAGTATGCTTGCGGGGAAGAGCGTCGCATCAACCGGGTTTTC
+GCCGCCAACGGCATCAATACCCTGAAGGAAAAAGGCGTCACTGTCTATACGCCGACCGCAGCCGAGATAGCCCAATTCCG
+CAGCGCCACCCAGCAACCCGTGACCGACTGGCTAAAGACCAAGATC
+>generic562
+AAAAGGAAAACCAACACTCAATCAAATGTCTGAATCGAACGAATTACACGAGACTTTGGCCAAGGTCATTAAGAGCTCCC
+TCTGCTAGGACACCATCTCCAAGGGACTCCACGAAGTTCTCCGAGTCATCGAAGCCAAGCAAGCTTTGTTCGTCGTTATT
+GCCGAAGACTGCTCCGAAGCTCCGTACTTGAAGCTTGTGAAGGCTCTCTGCGCTAAAAACGAGATTAAGTATATTGCGGT
+TCCCAAGCGCGAGAATCTCGGCCAATGGCTTGGCTTCTACACTCAGGTTAAGGGTGAAATCAAGAAGATCAAGGGATGCA
+CCTCTCTTGCTATCAGAAAGTACGCACCAGAAATCACTGAAGAAGAGAAGAAAATCGTCGATGCCGCTCTTAAAGCTTGA
+TTTTGCATTTCTTTCCTAGAGACTTAACATCTCTTGAGGAATCCAATCTTGATTTGAAAACTCCGCAATCTCTCCGTACA
+TATTGTTATTCGTGATGCGCCAC
+>generic563
+TTGGCATCTTTCTTCTCCAGCCGCCAGCGATTGATGAAGTAGCGTTTGGGCGAACGCAGCACATCGTCGCTGAAATCATT
+CACATGGCTGACAAAGTGCCCCAGACGTTGATCGGCCGCCCGGGTGCGCATCGGCTCGGCCGGCAAACGAGCCAGCGAGT
+AGTTGACGCGCATGAACAAGCTGCGCACATCGGGCAGGTTGCCCGGCACCGTCGGAGTCGGGGCATTGGCGGGAGCCCCC
+GGCTGGGGCACCGCGATGCTGGCGCTGGCGTAGTGGCCATCCACTTCAAAACACCACTTCCTCAAACTTGGCGCGCGCTT
+GCAGCAAGGCCGAATGGCGCGGATCGAAGGCGTAGCTCTGGCGGTAATGGCGCTGCAATTGCACCGCCAAACCCAGCAGA
+TCGGCGGTGAACATCGGCCCGACTTCGATCAGCACGCTCTTGCGCTGCGGGTN
+>generic564
+CGCAATGCTGCTTGAAGAATCCGTTGCGCAGCCTAGTCCTCCAGCGAAGCGCCCGCGTATTCCACCTGGGCGTAGCAATT
+CCTCCTGCCGGGTGGCGTTCCAATCCTTGCCATAGGCGCGGGCGAGGAGTTCGCGCAGGCGCTCGGCGGCCGGGCCTTCG
+CCTTTGTGGGGCTGATGGGCTACGATGCCATCGTCATCCGCCAATTTTTCCAGACCATCCGGGCCGAGCGCCGGGGCAAT
+CGGGAAAACTTGAGCCGCTCTGGCCGCGGCCACTGGTAGCCGAGCAACCGCGCCACGGCCACATGCAACGGTTGTCCGCA
+CCAGCAGGGTGCCGTTGAACAGCCATTGAGTCGGGGTCGCTGGAAAAACGGCTTCGGGCAATACCCTGCGGATATTTCTC
+CGCCGCCACCTTCTGCCAGTTCGCCAAATCGAATGGAACTTTTATTC
+>generic565
+ACCGATAATGGTGCAAATCACCGGGGTTTTTAATTTCGCCATTTCTAAACAAATTTACTTGGCAATTGCTTCACTTTGTA
+CCACGCTCTTCCGCACCAATCCCACGGATATGCGCCGGGTGTGTCAATTAAACAGATAATCGGCAATTTAAACCGTCTCT
+GCCATTTTCATTATCCGCAACGCTTTACGATAGCCTTCGGGACGCGGCATTCCAAAGTTGCGATAAATTTTTTCTTTGGT
+ATCTCGTCCTTTTTGGTGTCCAATCACCATGACCGCTTGTCCTTCCAAACGTGCCAGTCCACACACAATCGCCGGATCAT
+CCGCATACGCTCTATCGCCGTG
+>generic566
+CGGTGAGGCCGCTAACCTTGCGGCACCGCTGATGCTTCGGAATCCGCCCGCCAGATGCGGTAACGCACCTCGACGCCAGT
+GGGCACATAGACCACGAGCGGCAGGCGGCTGTTGTAGCGCAAGAGGCGCGGCTCGCCGCCCAAGGTGATGAAGCGCTCGA
+CCTGTGGACGCATCGGGGTCTACCGCCATCAGCGTGCCCGCCATCGGGCCAGCTCGCGCAGGATGTAGCGAACGAACCCC
+CAGCCTTGAATGGTTTCGGTCTCGAGCGGTGCCGGCGAAGAAGTAGCGGTTGCGTGCGTCCGTCCGGACGGTCTTGCCGA
+TGATGAGTTCGACCCTGAGCGCGGTCTCGTCCGCCTGTGGCGGCAGGTTGATGACGTGGCGCGTCATGCCTTCCGCGCGG
+GCGGAAACGCCTGCAGTGTCGGCGGCACCGGCATCGGCGGCG
+>generic567
+CACTTACTGATGAATCTGCAAAGCACATTTTTTCACCTCTCTTTCCTAATATTTATTTTATCAGTATTAAGCATGATAGT
+ATTCGGTACCTGAACGATGTTGCACGGGTGAACCGCAGGGTTCCTGGCCCGGAACACCGACTGCATCTGCGCGGCACTGC
+CGGCACAACCTGAACTGGGGCAGGAATTCTTCTGCTATGGTTCTTGCAATAGTAAGTTCGTCGCATTCCGGGGGTCTTTC
+TTTTTCAAACCTGTTGAGCGGTATCAGGGGGATGATATTCATAATTATGGCGCCATTCTCTGCGGCTTTTTTCGCGACCT
+CTTTTACCTGCTCAAAATTGATCTCAGGGATCAACACCATATTTACTTTTACGTTCAATCCTGCTTCGCTTGCCTTCTTT
+ATGCCCTCGAACTGTTTCTCGATCAGGAGTTTTGCACCTTCCACGCCTTTATAGGTCTTGTACGAGTGGTGT
+>generic568
+GGCTGCGGAAATGGTGTTCTTTGGGCTGGTGGATCCGCTTGATCTTTCGGTCTATGGTGCGCCCATTGGTGAAGATCGGA
+TGCAAATTTACAGCCTTGGCTTCCTGTTTTTCTGGGTCGTTGGCTCGGCAGCGAGTGCGATGGCGGACGTTCTGAAAAAG
+ACCTCGGCTCAGGTCAATCACACCACAGACGCAGCGGTGACCGCTATCCAGACACCGACAAACCAAGCTGTGACGTCACG
+GCACACGGGTGGTCATGCCCTGCACATGTAAAAGGGTCTCCAATGCCTCCACGCCCAAGCGGGCAAGACCCCGCGCTCAA
+CCCAAAATCAACAACGCCCGCTACCATCGCGGGCGTTGCCATTTCTGGGCCCTTGCGCTTGCTGCCATGATCACTGACTC
+TCCCCTCGGTCAAGCCGTCACCTAN
+>generic569
+CAAACCTAGGTTTGTACTCCGTAACATCAACCTATCAAAAATCACTCAATGTTTAGGACTACCTAAGATTTAAAAAGCAC
+ACCTGTTTGCGCCGACGCTCAAACAGACTCCGCATTGGGAATAATAGCGACTAAGTTGGTGATACCCACGCCCCACGCCC
+ACATCTGGTTATTTTCCTTAACAGGTTCTCGAGCAATAAACACATCGCTGATTTGAATCATTGGCAAAAAATTGGCTTGA
+CAAGAATTGTAATACCTTGCGAGACTTGATCTCGTGTATTGGAATTTCCAATCACTTATCCTTAATATAACAGGAAATAA
+CCATGAAGAAGATAGTTCTCGCTGTAGCACGAGTGGTGT
+>generic570
+GTCAGAATCTGCATGGTCGCCCCGGCGCACCCGGTGCAGGGTATCCCGTTTGCCGGACAGGGGGCCAGGCAGCGGTCTAT
+CGTGACTGAGCCCATACAGGTGTACCCCTGACTCAGAAAACATTCATCGGCATTCGGAAAACCGTCGGAGTTGGATTTTA
+TCTCGCTGACATCACTTTTTTTCATCTGCCGTTTGCACTTTGCGCAGACCGAGCGCAGGTTGACCTCCGGCTGACGCCCT
+TCAACCAGTGCTGACAGGGCTTCAAAGACAAAGGCCGGATGAGGTGGGCATCCTGGCAGATACAGATCAACGTCAATCAC
+GCAATCAAGAGGAGAGACAACCGACTCCAGCGCAGAGATTCCTTGCTGGGAGGATTTGCCGAGGTTGTGGTCTTGTTCTC
+GAGATAGACCGCTTTGCCAATTTCCGCCGGAGTATGGATATTACCGGCTCCTGCCGG
+>generic571
+GGCAAGCTCTTCATTGGCACCCACTTCAACGCCCGAGATTTCTTTGCCCACCTCAAAAGCCCATAGCGCTAAAGCAGCGG
+AAAACCCGAGGACCAAGGCCGATAAAGCCCAACGCATCGGCCACGGGGTATGGGTACGGACCGAAAACCGCGATGAGTTA
+ACTGAAAGACGACGACGAAAAACTTTCCAACGCATGAGCAAACCTCGAACGCTCGACGTTGCTGTGTAGCGAACAACGCA
+CGATTTGCCGCGACGATACACGAAGGGCTGCCGATGGCAGCCCTTGGGTCTGGAACCTTGGTTCTCAGGACATCAGCGCT
+TGCTGAATTGCTTACGACGACGAGCGCCGTGCAGACCGACCTTCTTCCGTTCGACTTCACGCGCATCGCGCGTCACGAAG
+CCAGCGCGGCTCAGATCAGGCTTGAGCGTGGCATCGTATTCGATGAGGGCGCGGGTCACACCGTGGCGCACGGCACCGGC
+TTGACCGGATTCACCGCCACCGTGGACACGA
+>generic572
+GAAGATCTCTGGCTGGCCTTAGAGCCCCTTTGCCCTGGGCTCAGCATCGAGGTGCTGCCCGAAACCGCTTCCACCAACGC
+AGCGTTGCTGGAGCGGCCCCGTTTGGGCGACCTCGCACCCTGTCTGATGGTGGCTGAGCGTCAAACCGCTGGGCGCGGCC
+GCATGGGCCGCTCTTGGTGGTCCGAGCCGGGAGCCTCGCTAACCTTCTCCTTGGGCTTGCCCTACGCGCCCAAGGATTGG
+TCCGGCCTGTCGCTCGCGGTCGGCGTGGCCTTGGCCGAGGCACTGGAGCCTGCGCCCGCCACTGCGCCCCGCATCGGCCT
+GAAGTGGCCCAACGATTTGTGGCTCCAGAGCAACGATCCTGCCGATACCACCCCGCACAAACTGGGTGGCATCCTGATCG
+AAACCCTGATGCTGCCCAACGCCCAGCGTTGGCTGGTCATCGGCGTGGGCCTGAACATCGCCGCTACGCCAACCCAGATC
+AGCAACACGGCGAT
+>generic573
+CCGGAGTGGTATGTGCAGCGCCATTGCGGTGTCTCGCTGACCGAGATCCAGAGCAAGCAGCTGGAAAAGACGTTTGAGCT
+GATCCTCAAGACGTGTGAAGTCCAGCCGATGGTGCTGGTGCACCGCGACTATCACAGCCGCAATTTGATGCTCGGCACCC
+GCCCGGTGCCGAGACGGCGCTGGGCGCTGGGCGTGGACCCAACCCGGGCATGCTCGATTTCCAAGACGCCGTTTGGGGCC
+CGGTCACCTATGACGTGGTCTCGCTCTTGCGCGATGCCTACATCGAGTGGGACGAGCCGCAGCAGATCGACTGGGCGGCG
+CGTTACNGGCAGCAAGCCAAGAAGGCTGGCGTGCCGGTGCAAGACGACTTCGGCCTGTTCTGGCGCGATCTGGA
+>generic574
+GCTGCGCGTGGGCTTTGCATTGTTCATTGCGCACGTGCTGAACTTCAAACTGCGCGGCATCAATTTCTTCCGTGCCGCGT
+TTTACCTGCCTTCCATTCTCGGTGGCTCTATTGCCGTGGCCGTGCTGTGGCGGTTCATTTTTTCCAAGAACGGTCTGGTC
+AATCTACTGCTGACCCAGGTGGGGCTGGAGCCCGTTGCCTGGCTGGCCGATGAACACTACTCGATGTGGACCATCGTGCT
+GCTTTTCACATGGCAGTTTGGCTCGGCGATGGTGATTTTCCTGGCGGCGTTGCAGAACGTTCCGGTGTCGCTGTACGAGG
+CCGCTGAATGTGATGGTGCCAGCAAGTTGCAACAGTTCTGGAAGATCACGGTGCCCTTGATCACGCCGGTGATCTTCTTC
+AACCTGATCATGCAGATGGTGCACGCCTTCCAGGAGTTCAATGGCCCTTACATGATCACCGAGGGTGGCCCTTT
+>generic575
+AGAAACGGTGTGCCTCTTCGTTCTCAAGAGGCCCCCTAACGGCCCGGCGGCGACTTCCAGGCACCGCTCAAAAGCCAGCG
+CGAGAAGCTGCAGCATAACGACCGGAAAAAAACCATGCTCACCAATAGCCAAATACTGTTTTTCCCGGTATTCCCGCCGA
+ACAGCATCACCCTTCGCGCGCACCGAACGATCCTCCAAAGAGGGCGCAAAACAAAACGGAATCCTTCAGAGGTATAAATA
+TCCTGCAGCTCTTTCTCTAATTTTAATCCGTTCTCTAAGCTTTCTTTCAACCGCGCGCCAAGAAAAGCAACTTCTTGTTT
+ATGGTCCTGGAGCTCTCTTGACAGGTGATTGATTGAACCGTCTTTGCGTAACCCCGAATCATAACTCTCGCGCAGCTTTC
+CGGTGAGAAGCGCCACCTCTTCCCGATAAGACTGCAGCTGGGACTGCACTGTCTGAATGTCCCCTTGCAGCGACCCGATG
+GTGCCGTCTTTTCTA
+>generic576
+CGAGCCTGTCGCCCATCGAAGGCGGCGGTTTCCGGCTCGCCACCGCCGCCGGCGTCTCCGTCGCCGCGAAGGCCGTGATC
+GTCGCGGCCGGCGTCGGCGCCTTCGGACCGAACCGCCCGCCGCTCACGGGCATCGAGACTTATGAGGGCAAGAGCGTCTT
+TTATCTCGTCAAGCGCCGCGAGGACTTCCGCGGCAAGCGGGTAGTGATCGCGGGCGGCGGCGATACGGCGGTGGATTGGG
+CGATCTCGCTCGCCGAGGTCGCCGAGCGCGTCATGGTGGTGCACCGACGCGCGAAGTTCCGCGCCGCGCCCGAGTCGGCG
+GCGCGCCTCGAGGCGTTCGCGCAAAGCGGCCGGCTCGATCTGGTTACCCCCTACCAGCTGCACGGGCTCGAAGGCGAGAA
+CGGCCGGCTGCGCCGCGTCCTGGTGGCGGATCTCGACGGCAAGATCCGGGCGCTCGAGGCGGATTGCCTGTTGCCGTTCT
+TCGGGCTGTCGATGAACCTGGGCGCGATCGCGGAGT
+>generic577
+GGCGAAACCACTTTAAATCTTTCCAATTTCGGATTCGTGGCATGAGTTTAATGCCTAGCAAAAACGCTAATCCATAAACA
+GGCGTACTTTGCGCCTGCGTATCGCCGTGCAAAATATCGGGCTGAATGTCAGAGTGATTCTTGGTTAAGCCATCGAGAAT
+ATAAATAGCTTCCCACGTTCCACACGGAATAAAATGAGAAAACAACGCGATGTAAGCATCACTGACATGGTAATACGCTA
+TGCCTCCATAACCTCCATAACGGATATGTCCTTCTGATAAAAGGTTATTTTCATACAAATTCCATTGTGTACCATCAGCG
+GCGGCACGCTTGGTGTCGCCCCAATAGCGCGGTAACTGGAAGCGATTGTAAGCGTTGATAGTTTCTGTAATTGCCGCTTC
+CTAGTTTTTCTGTTGGAAATCTGACGCTGATTCACAAAAGAAATTTGCCGCGCACTGATGTTGCTAAN
+>generic578
+AAACACCCTCGCCAATGCGCGGATGGCGTTCGCTTCCTTGCAGCGCAACCCGTTGCAGCTGCTGAACATTCCCCTGAATG
+CCGGAATGAGCATCGGCGTGATGCTGATTTGCGTGGAACTGCTGCTGATGCTGACGATTTTGCTGCTGATGCCGGGCGAA
+CTGGCGGGCGCGTGTTTCGTCGGCTTCGCGGTTGGCGAATCGCTGGGCGCGTCGGCATTGCGGATTGCCGGTGGTATTTT
+CTACCAAAATACGCCGACATCAGTTCCGACCTGATGAAAGTGGTGTTCAAGATTGGCGAAGACGACCCACGCAACCCTGG
+CGTGATTGCCGATTGCGCTGGAGACAACGCCGGAGACAGCGTGGGCCCGACCGCAGACGGTTTTGAAACCTACGGCGTGA
+CCGGCGTGGCAATCATCTCGTTCATCCTACTGGCGGTCACGGGCGGCGAAACCTTGCAAACCGAACTGCTGGTGTGGA
+>generic579
+TGCTTAACCTGGGTGAAATTTTGTTGCTGTGCTTGTGTTTCTACTATTTCTAACACGCTTTCCAACAGAGAGATTTCATG
+CACGGCACAGTTCCTGCCACACTTCTAAACTTGGATTTTCTAACAATTGACTTACAAAATCGGATGCTTGTTTTAAACTG
+ATTTCGGCTGTGCGGCTTAAACCCGAACCGAGTTCAAATTCAATGCCCTGCAAGGTCAATAAAAACACGGCGCGGCGTAG
+CTTTCAAAGTCTCTTGATAAACCTGCATGACCGCCGCAGGATTCATGGCGTGAGAGGTGTAGCTATTATCATACGCAGAT
+TGCAATTGGCTAAATTCCACCGGTTGTTGATTAGCAATTGAGGCATCAGC
+>generic580
+CTCGCGCACAGTGCCCGCGTGGAACACCACGGCGTCGTCGGCCTCGGTGGGCAGGCCGGTGATCGCGTCGCCCTTGCGCG
+GGTTCAGGGGATACCCGTGCGCGGCCAACACCACGCCCAAAGCCGTCCGGCGGTCCCATTGCAACTCCACCCGGTCCAAC
+TGCCCCCCAGCGACCCGTTGGGGCCGGGCTCGGTCGCCGCCCACAGCACCTCCACCAGATCGCTGCGCAGCCGCGCCATG
+ATGGGCTGGGTTTCGGGGTCCCCATGCGGCAGTTGAACTCGAGGGTCTTGACCTGCCCTTGAGCATCGATCATCAGACCG
+GCGTACAGAAAGCCGGTGTAGGGAATGCCGTCTTTCTCCATGCCGCGCACCGTGGGCAAAATGATGTCCCGCATGGCGCG
+GGCATGCACCTGGGGGCGTGACCACAGGCGCGGGCGAGTAGGCCCCCATGCCGCCGTGTTGGGGCCTTCGTCCGCGTCGA
+GCAGGCGCTTGTGGTCTTGCGAGGTCGCC
+>generic581
+GCCAAAGGTCAGGCGGAAGCTCGTCTCGCCCTCGCCACCGCGGAGGCCGAGGCGATCCGTCGGATCTCCAGCGCGCTCCC
+CCGGCCGACGCCGCGATGTACCTGCTCGGTGTGAAGTACCTCGAGGCGCTGCCGCTCCTCACGCAGGGGAAGGGAGCCAC
+GGTCTTCCTCCCGGTTGAGGCGTCGGGCGTGATGGGCGCCATCGGCGGGATCAAGGAATTGCTCGCGCGCGGCGGCGCGA
+TGCCCGCGGCCGCCACTGCCGATCTCGTTCCACCCCCGGCGCTGGCACCTCCCGGCGGCGGTACTCCGCGCCCGGACGGT
+CGGTAGCCGTGGGCAAGATCACCTTCGCACGCGCCGAGCGCGTCGCGAAAGGCCACGCGTGCGAGAACTGCGGTGAGTAC
+AGCTACAAGAAGCTCATCGTCAAGCCCGCGACTCCCGCGCAGAAGAAGGAGACGGGCGAGGCGTGGCACGCGATGAAGAT
+CTGCGGGATCTGCGGCA
+>generic582
+CGCGCCTATCGGCTTTTCGCCGTCCTGCACCAAGCCGAACTTACCGACTTTGTTCGAAAGCTTTGCGATGATCTCTTTTG
+CCCTCTGCGCGCCGATGCCCGGCAGCGATTTAAGGTACTCCGCATCGCCTTCGTCTATCGCACGGGCGATAAGCGATATA
+GGCTGGTTCAATGCCCGCAGTGCCGCGCGCGGACCGATGCCGGAGACAGTGATGAATATCTCGAAAAATTCCTTTTCGAC
+TTCGTTGAGAAAACCGATGAGGACGGGAACGCTGCGCGAAGGCTCGGCATGAAGATAGTGATACGTCACCAATGTCAGCG
+ATGAATCCGCGCCGAGCGCCGTGTCGAGCCGCTGCATGACCATAGTGGGCATGAGCACTTCATAGCAGACATTGCCGGCT
+GCGATGATTACGGAATTAGTACCACGCTCGACTAGTGTTCCGGTGATCCGCGCGATCATACGGGTGACTTTCTGA
+>generic583
+CCAAATCCTCGACGCATGCCGGACGGGGCCTCCATCCAAGGTCAACAGCAGTCCGTGAGCTTGTAACGCATTAAAACGAC
+TTACAAAACGTCCCTTCCCTTTAGGGAAGGGACAGGAGGGTTAGGTCCGTGACCGACAGATGCCCCGGCCCACGCACCTC
+TGCCCTCCCCCGGAAAAAGTTGCACATGGCGTAAAAGCGTCTGCCGGTTGCCCCTACAGTGCGTCACAGCGCCTGGCCGG
+CTTTTCGGATAGCCGCCTACTCGATCAAGGCCAGAGCGTCCTCGAGGTCCCCGATGATGTCTCCGGCCGCTTCGATGCCC
+ATGCTCAGTCGAATTCCGCCTGGATCGATGCCTGCCTCGAGCTGCGCTGTCGCCGGGAGCACCGCGTGGGTCATGGACGC
+GGGGTGTTCGACGAGCGTCCGGATCTGCCCGAGAGAGACCGCCAGCGTCACGCTCAGCGCGTGTTTGGCACGAGTGGTGT
+>generic584
+CACGCGCTGACGCACTTCGCCACTGATCTGCTGCTCCAGCTCAGCGCCCAAACTGCTGCGCGGCGTGAGCGCATAACCCA
+GTCCCAACCGGGCGGTGTCACTGGCGAGCTGCGTGCCAGCCGGCACATTCAGGGCGCCGATACCCGCGTTGCCCTGCAAG
+CTGCTGCCGGGGTTGATCTGCGCCAAGCCGGTGGCCGGGTCGATCAGGTTGTTGCCATAACCCAGCGCGCCGCCACCCGC
+CCCTGCGCCCAAGCTGCTGCCCAAGCCCGAACTGCCACTCAAGGGCGTGATCGGACTGAGCTGTGCAGGCACCAACACCC
+CAGCGGTTTCGCGCACCCGGCGCAGGCCAGCGTCGAGCGTCAAGCCCTCAAGACCCGCCACCCGCCAGCGCAGCCCAGCA
+CCGGCGGCGCTGCGCAAGCCGCCACCGGGGTTGCGGTCCTCGCTGCGCAGAGCTTCGCCGTAGAGCT
+>generic585
+GCAAGATGGTGGACGAGTTTCTCGGTCTGGCATACCATCGGGAATATGGTCTGGATGTGGTTCCCTTTCGGCTGTTCAAC
+ACCGTCGGGCCACGGCAAACCGGCCGCTACGGCATGGTCATTCCCCGCTTTGTGCGGCAAGCCTTGCGGCGCGAGCCGAT
+CACCGTCTACGGGGATGGTACCCAGTCGCGCTGTTTCTGCGATGTGCGGGATGTGGTGGAGGCCTTGGCCGGTCTGGCCT
+TCCACCCGGACGCCACGGGACACGTCTTCAACATCGGAAGCACCGAGGAGATCTCCATGCTGGGTCTCGCCGAGATGGTG
+AAGAAGATGACCCGCAGTTCCTCGCCGATTGTCCTGGTACCGTATGATGAGGCCTACGCGCCCGGCTTTGAGGACATGCA
+GCGCCGGAAACCGGATATCGGCAGGATACAGAGCCTCTTGCCCTGGAACCCGGAACGCTCGCTTCAGGATGCCTTGCACG
+AGTGGTGT
+>generic586
+GGCCACTTGCGGACGGTACCTCGGGGCCTGCGACCGCTGCATGGCTTGGGGCGGCACATGGTGGGCCATGAGGCTAACCA
+CCTGTTCAGCGGCACTGAATTGCAAGCGTAAGTGGGTCTCCAGCACAAGGCTGAGATCCTCAGCACGTCCGATGGCAGCT
+GATCGGGCATGCGTCCGAGAGGCTTGTAGATTCAGGGCCAGCAGGGCCAAAAAGGGCAGACTGATCGCCAGCAGGACAAT
+GAGGTAGCGGTGTCTGTGGCCAATCGTCATCCGGCGATCCTAGCGAAGAAATCTTCGGCAAAGCCTCGCCAAGCTTCACT
+TTTTCAAATTGATGTGTGACTTGAAAACGTCAATGTCGTGCTGGCTTTCAAAACAGTGCTTCGGGAAAAGGTTGAAGTGA
+TCGTTGCTGTAGGGATAGACCAAAAATCACCGAAGGGCTTTCCTTGAATTGCTTCACATC
+>generic587
+TCCCCGTTAAATCAAATGGATATTGTTTTTATATAAGTCGCCGTTGTGTCATATCAACTACGAACAAAAGTTTTCGCTTT
+ACAGTTAGGACAGTCAGGAATTTGGCTAGTGGATTTAAACGCAATCTCTTTGCCGCATTCTTCACAGACAAACGTGCCAG
+GCCCAGTAATTTCGCCACTATGATAAGGATGATAATCTTTCGCTTGCTGTTCAATAATAGCCAGTTCCACGCGGGTTTTA
+TCTGCCAAATCCATAAACGCATCAAGCGCAAAATCTTCGATTAAATCAATATCGAATTTTAACCATTGTGAGAAAGAAGC
+TTTGCTGTTTTCGTCCAGATTTCCGGCGGCATGGTCAAGGTCGCGTTTGACATAACTTGTTACTTTATCCATGTCATCAG
+CGGTTAAACCCGTGCTGTCACCGGTTTTGTCTTTAGCTATTTCTAAAGCATCAGTCATCGAATAATCAGTGTCTCCCATG
+GTTTCGTGAAGATGCTGCAT
+>generic588
+CTCATCCGCAGCGAAGTCGCGTAAGGATGGTACAGAGAGCAGGAATCAAATTCCTCAAACTGGCTCATCAATTGCGGCCG
+GCTTTTGAAAACTGCTTGCAGATTGCCGGGGACGCGCCGAACAGGTACAGAATCAGCCAGCCCTTGCGCTGGAAATTGCG
+AATCAGGCCGAAATAGCTTTTCGCGATGAATTCATCCAAACTCAGGCCCGCTGTTTTCTTGGGCGTAGGAGAATCGGCCA
+CAAGTTGCGTTGGCACGGAGTAGTTGAAATGCACGCCGGCGATGGATTGCATGGTGCGCCCATAGCGATGCCACAAACCG
+CGCCGGTAAATATGCTTCATTTGCCCAATCGTTGGAGCTGCCGTATTCAGCACGAGTGGTGT
+>generic589
+CTCGAATCCCTTGCCCAAACTGAGCGTATCGCCCTCGATCAGGTCATCGCCATCGGCGACGGTGCCAACGACCTCGACAT
+GCTCAACCGCGCCGGCCTGGGCATTGCCTTCAACGCCAAGAAAGTGGTGCGCGAGCAGGCCCAGTACAACATCACCCAGC
+GCAACCTGAATGCAATTCTGTACTTGCTAGGCATCAACGACGACGAAGTGGCTTCGCTTATTTAGCTATTCGTAAACTAG
+CTATTTATCAAGTTGCTCGGGATGCTCGATCACGTCGCGAATAATCTTCGCCACCGTCGCGAGCTGCGTCCCATCCACAA
+ACCGGTGATCAATCGTCGCCGACAGCGTCAGCATCGGCCGCACCACCGGCACCCCATCGCGCGCCACCACCGCATCTTTC
+ACCGCGCCGACGAGCACCAGCAGCGGCACCCGCGCAAACGGCGTGTGTGGCGC
+>generic590
+GTCGAAGATATTGACAATATTTTGTGCCGCGCTGACACTGACCCGTCACCATGTGAACCTTGGCTTCCAAACGAATACCA
+GACATGCCTATCGGTTACTTTAATTCCATCCTGCTGATCTATCACAAACTCCTGCGGCAGAATATGCAGAATTTTTTGAT
+CCGCAGGAATCGCAACCGCTCTGGCAGAATCAATCACCCTGTCAATATCATATTGCCTGACTTCTTTGTCTTTAATTGCC
+ACAATGCCATGTGAA
+>generic591
+GTCGGCTTCGGCATCGTGCTGTACATGCGCTCGCAGTTCAGCACGCTGGCGCCCTTTGCCACCATCCTGGTGCCCACCAT
+CCTGCAAGGCGCGGCGATGGCCTTCTTCTTCATCCCGCTGCAGGCCATCGTCTTCAGTGGCCTGCGGCCCGAGCAGATGC
+CCTCGGCGGCGGGCCTGTCCAACTTCTGCCGCATGGTGGCGGGCGCCATGGGCACCTCGATCTTCACCACGCTCTGGGAG
+GACCGCGCCGTGCTGCACCGCGCCCACCTCACCGAGGCGCTGAACCGTGGCAACGATGCGGCGCTGCAGATGCTGGCGCA
+ATTGGCGGCTGCGGGCCAATCCCACGAGTGGTGT
+>generic592
+GCGCAATGAACATAGCGCCTGCTTTTGCAGAGTTGGCGTCCCGGTTTTCCTATGACCTTTTCCCTTACGTTTCCCCTGTC
+TATTCCGCAGCCTATGCTGCCCAGAGCGCATGCACCCGGAATCACGCAGGCGGAAGGATGCTCCAGGGCATGATCGAGAT
+GCTCACTCCGATTGTGGCAGCCTATGCGTACACTGCGCGCCGGCAAGGCATGCCTGTTTCTGCAGGCTCAGTGTGCGAAG
+AGGCGGCAAGGATAATGAAGAGCACCACGTCAGAGGATGTGGACCTCCTGAAGAAAATGAAACGCCTCGCATATGACCTT
+TCAGGATATGCGGGTAGGACAGTCCCGAACCATGCTGTCTCGAACGTATATGATTACTACTCCCAAGATCTCAAATGCAG
+CACGACTCCGACCA
+>generic593
+CATCGGCATTATGAAAATGGTACGCTCAGATCTGGAGTCCAGCGGTGTGATGTTTTCGCTGGACACGGAATCAGGTTTTT
+CCGTATGTGGTGTTTATCACAGGTGCATTCGGCTTAGGTGAAAATAGTGGTGCAAGGCGCAGTTGACCCCGACTGAGTTT
+TATTGTCCACAAACCCAACCTTTGAGCAAGGACACCGTGCCGTTTTGTCGCCGTACGTTAGGCGTGAAAAAATACAAATA
+GGTGTACAGCGATGGTAGTACCCGTGAATCCACGCGCAATATTGTCACGTCTGAAGAAGAGCGCAATCGCTTTTGTTTAA
+CCGATGCCGATGTACTGACGTTGGCTGACTACGCGATTAAAATTGAAAACACTACAGCAACAAAGCAGGGCAAGCCAAAC
+C
+>generic594
+GCCGCGCTTCTCGGCGCAGTCCCGCTCGCGATCGGCTTCGGCAGCGGTGCGGAGCTGCGCAGGCCGCTCGGCATCTCGAT
+ACTCGGCGGACTGGTGGTAAGCCAGTTGCTCACGCTTTACACGACCCCGGTCGTGTATCTGTATCTTGACCGCTTCCGCA
+TGTGGTGCGCGACGTTGCGCGTGCGCCGTGCGCGGGGTGGCGAACCGTTGGCAGTGGAGGCTCGATGAATCGCGGGTGGA
+AAAGACTTACTCAGGAGTTGGCAACTTGGACGACTGCATTTATTTTTTCAATTGAGAATTTCCTATTTACAAGATTTTCA
+GCGGTTAACATCCCCCTCATCCCACCTCTCCGGGTGGTTCCGCGCTTCGGGCTCCTATCGTCCCTCTCCCCCGTTTCCGG
+GCGCGAGGGAGTCCTCCACATTCCTCACCTGCACGGAAGGAGTTCACCCCCTCG
+>generic595
+CGGCCATCACCTGCCGCGCGGCCGGGCCTGCGTCATGGCTGCGGTTGCAGACATAGATATCGAGGGTGACAAGACCCAGC
+TCGGGCCAAGTATGCAAAGCCAGATGCGACTCGGCCAGCAAAAGCACCCCCGTGACCCCAGCGGGGGTTTCGGGATGCTC
+AGGCGCAAAGCGGTGAAACAGCTCGCCCACCACATGCAAGCCAGCGCGTTGCACCTCAGCCAAGCACAGCGACCGCAACC
+ACACCGCATCGCACAACCCCGCCACCGCACAGCCGCAGCCATGCAGCTCAGCCATCAGATGAAGTCCGTGGGCAGTGTGG
+GGCGGGGTGGGCATGGGGGCGGATTATCACGGCAGCACCTTGGCCACGCGCAAGCCGATCATGGGACCTTGGCTGTTGGG
+GGTGTCGGCGTCGCGGACGGCGGAGCGCAGGCTGGCGGGACCGAAGTCCCAACCGCCGCCTCGGAAG
+>generic596
+TGCGAATATGCGAATGAAGAGTCTTGTCATGGTAGGAGGCAAAGATGAAGGAAATTAAGCATATAAGCTGAAAATGGGCT
+GTGAATTGTTGCTCGGAACGACTGGGCGTATCAGAGATGCGTTGTAGAAAAATTATCTTTGTTTGGATTAAGTCTCGTGG
+GTTGTGCTCGACGAAGCAGATAAAATGATTGATCTCAGCTTTGAGGAGGATGTCAATTTCATCTTAGACAGGATCCGATC
+GAAATTGAAGAGCGAAGACGACACAATGGCGGAGTTGTAGGAGCAGGAGGCAAAGGCTGGAGAGAAGATTTTTAGAGTAA
+CTCATTTATTCAGCGCAACGATGCCTTCGAAATTGGAAGCCTTAGCGAAAAAGTACTTGCGTTCTTTCTGCTACATCAGC
+ATTGGTGAGCCA
+>generic597
+ACCTCATTTCGATTTCCATCGATCTGGATACGCGGGCCCCCACCGGAACCATGGCCCTTGCCACGGCATCGCTCACCGGT
+AATCCCGATGTCGGTCTCGATCTTTCTTCAACTGAAGCCAATTCGCAGGTCGAACTTTCGCTCGATCCGGGATTTGCCGG
+GGCCTTTTGGTTTCCGGTGGCGAACACGGTTTTCACCCTTACCGGCACCGACGGCCTGAAGACGGTATACGCGCGCTTCA
+TGGATGCAGCCGGCAACGTTTCAGATGTCAAGACGGTTTCTGTGACACTTGATCGCACGCCCCCTTCGCTAGGTGCGTTT
+ACGGTTACCGAGGGCGCGCTCACCAACCAGCCCACGGTGCACCTGGTACTGCAGGCCATTGATGGTGCCGAAATGCAGAT
+TGCCGAGGGGGCGTGCGGAGGTTCCTGGGCGCCGTATTCCACTGCGCAGGCATACACTTTTGCGAGCGCCGCCGATGGGG
+GCAAGACGATCGCAGTTCGTTCCGTGATACGGCTGGAAACGCAACGTCC
+>generic598
+GCCGGCGGCAACGGCGCAATTGCGATCAATGTGATGAAAGCGGTGTCTGACCACGCCGCGTACGTGCGGCAGAGTTGCGA
+AAGCGGCGCGCACGCCATCGTGATGGGCGCCGGACTGCCGCTCGACCTGCCCGACATGACCCGCAATTTTCCCGACGTCG
+CACTCATGCCGATACTGTCGGACGTGCGCGGCGTCAACATCGTGCTCAAGAAATGGCTGCGCAAGAACCGGCTGCCGGAC
+GCGATCGTGATCGAGCACCCGCGCTATGCCGGCGGGCATCTGGGCGCGACCCGCGCCGAAGAGCTCGGCGATCCGCGCTT
+TGATTTCGAGCCGGTGCTGGCCGGAATCTTCACGCTGCTGCGCGAACTGGCAATCGAGCGCGAGCGCATCCCGCTCGTCG
+TGGCCGGCGGCATCAACAGCCACGAAAAGGTCCGTGCGCTGCTCGCGCTGGGCGCGGCCGCC
+>generic599
+CTTGAAGTTTGTCACTGCGTTCATCTTTTTGGGTCAAAAATATCACTGGAATGTGGCTGGTGCGGGTACTTGTCCGCAAA
+TTGCGGCAAACCTCGTAACCATCAATATCAGGCAACATAATATCCAGCACGATCAAGTGCGGCAATGCGTGTTTGACCTT
+GTCTAAAGCATCACGGCCGCGATGCGCTACATCCACATCATATTGCATACCCGTGAAGTAGATCTTGAGCATATTGGCAA
+TATCAACATCGTCTTCCACTACCAAAAGGCGAGCATTTCCCATATAAGCCTCCTAACCGCCATGCGCGTGAACGCGCCTG
+CGGGCATTCTGTTTAACGATCTCAATTTGTTCGCTTGTCACTTCACGCTCAAAAGAGCGGAAGCCGCTCATGCGAAAGCC
+ATGCTTTTCGGCAATCGCAGTAATATCCATCACACGTTCAATTGTTATATCGCGTCCCACAGTGTAATCC
+>generic600
+GCGACAACTTGCTGCGCTTTGCGGATTTGCAGCAAGACGAGCCGTTGCTGGTCAAAGCCCGCCAAGCTGCCACCACGCTT
+CTAAAGCGCCAACCCGCCAAAGCGCGGGCGCACATGCTGCGCTGGCTGGGCGAGCGGATGGAGTTGCTTAAGGCTTAAAG
+CGAGAAGGGGATCTCAGTGATCATCTTCAGCGTCCACGTATCGGCTACCGGAGTGAGACCCCGGCCGATGCCGAAGCTGA
+ATTCCCAAGGTTTGCGATCCAGATCCAAGACGAGTGGTGT
+>generic601
+CGGCGTGATTGCCTTGGTTGCCATCAGCGCCTCGCTCCTCACCCACCCCATGGCATGGTGGCTAGCAGGCACGCTGGCCC
+CATGGGAAGTGAAACCCGGTTTACTGCTGATCGAAACCGGGGTCGTGGTGCTTGAAGCGCTGTGGTACGCCCTTTGGCTG
+CGTCTTGGCGCGTGGCGCGCTTTGGCTTGGTCACTGGCCGCCAATGGGCTGTCTTTCTGGGTGGGATCATGAATCACCGT
+GGGATCGGAATGGGGTTTGGGATGGGGCTCGGGCTGCTGGTCAGCACGGCGTTGCTGTTGCCGCTGCCGCTCTATATCTG
+CGCGCTGGCGCTTTTTGGGCTGCCCCATGTGCTGTGGGAACTGGCTTGGCTGCGACAGCGCTACGCCGAACATCAACCCC
+GCAGTTGGTGGTGGGCCGTGGGCGGCGTGCTGCTGTTGCAAGCCGGCTCACGGCTGGCGATTTGGTGGGACGTGCTCGAT
+>generic602
+ACGAAGCTGAAGGAGTTCTCCTTTACCGGACCATCCTATTCGGACCTTCCGGGAAATGGCCGAGGCCGCGAAAGCACAGG
+GCGTCAGTGTTTATCAAAAATACGGATGCCGACGCGTTCTTCGCCCGCAGTGACAACTATGCGTTTGCGCTGGCCGGAAT
+TGTGGCGCATACGGCGGTAGTCGCATACGAATACGACGGTTACCACGCGCCGGACGACGAATGGCAGAAGCTGGACTACG
+AGAACATGGCGCTGGTCGACCGCGCCCTTGCCAGCGGGATGCTGAGGCTGGCGAATGACACCATACCACCAAAGTGGAGT
+GATTCGAAGGCCACCGAACCGTATCGCGTCAACCGCCCGTAGCGGGCTATGCCACCAGGTTTTCGAGGCCGCGCAGCTCC
+TGGAGGGTGAGGACGTCCTCAATTTTCAGGAGGATTTTGACCGTCCCCTTGTACTTGGCGATGCCCAGAACGAAGGGGGT
+ATCGATGTCCTCGCCGAAGT
+>generic603
+CCCAAAACTTGGCCTTGAGGGCTCACAAGCTAGGGTGACATGAGGGGTTTTCGCTTAACGGAACCATATATGCTTTCTTT
+TTGGTTGTGGGTTACTGTCGGTTATGCGGCCACGGGGCCACCAAAACGAATGACATGGCAATCCTTCATCTTGCCATTAC
+GAGAAGGTCTTGAACTGATGGCGAATCCTTGCCCTTCACGCCCTTGGTGACTTCAAGCCCCTTGATGAAGCGATCATTCG
+CCGTAATCAGCTTGACAGTCCTCATAGTGCTATTCCAAGGCTCCTTGCTCATC
+>generic604
+CCAATGGCTTGGAATTGACACTTAAACAACAAATTGGAGAAGACTGGGAAGCATTGGCTGGGCTCACGATTCTGGACCCC
+AGCCTAGACAATCTGCCATACACCCCGCGTAGTGCATTTACTGCGGGTGTAAACGGAAGGATTGGACCACTCAAAGTTTC
+TGTGGATGGCCAATATCAATCCAAGGTATGGGCACTGAACCGAGATCGGAATATTTCAAATCCCAATATGGAACGCGTAG
+ATTCTTTTACCGTGGTGAATGCGCGAGTTTCTTATCCTGTTCCAGCCTTGGGCAAGAAAGGTGAAATATTCCTTGCCGTC
+GAGAATTTGTTTGACGCCAGCTACGAATATCGTCCGGGTTATGAGATGCCGGGAATCTCTGGTCAGCTAGGCATATCGGC
+GAGCTTTTAAAC
+>generic605
+GCACCCTTCATCGCTCCTACAAGAACTTCTTGGGTGAGAACTGCCGGGCTTGGGGCAGGCGTTCGGCGGTTTGGACCGCC
+CCCGTCATGATGCGGTCGGCATCGACGGGACCCAGGTTCTCGCACAACGCCACGTAGATCTGATGCACCACCTCAGAAAG
+CTCCTTGGCGCTTGCATCCACCTTCCACGCTTTTTCGCTTGGCTCGGCCCACGCTTGACGGATCTGCTGGCGCAGCGCTG
+CGGGTAAGCGAGAACGATCCATGGCCTGCAAGGCGTCCGCCCGCAGCGGAGCTAGATCATTCGCGTGGTAATGCGCCATA
+CGCTCGACCACGAAATGGATCAACGCAGCAAAGACTTCCACCTCCGGAGCTTTGGGAGGATCGGGCTCAATCATCGGCAC
+CACAACGGGTTCAGGAGGCAACACCGCCACCGTCGGCGCGACATACACCGGCACGGGCACCGGGGCGGGGAGTGTATGCG
+ACAGCAACGGGTGCGAC
+>generic606
+TTACGATAAAGCCCATGCTTTAGCGGCGCAATTTAACGGCTATGCAATTGCCCTGTCGGAATTGCCGATTCATTTAGCCG
+AAGCCGATATTATTGTCTCTTCCACTGCCAGCACCTTGCCGATTTTGGGCAAAGGCATGTTGGAAAGTGCGATTAAAAAG
+CGCAAACACAAACCGGTTTTCATGCTGGATTTAGCCGTGCCGCGTGATATTGAACCGGAAGTCGCGCAATTGCCGGACGT
+TTATTTATACACGGTTGATGATTTGCAAAATACCATCGACCAAACATGATTCGCGCCGTCAAGCAGCTGAACAGGCGGAA
+GAAATTATTGATACACAAGTTGAACATTTTCTGGACTGGCTACGTTCGCAAGGCGCACAAGCCACCATTAAGGATTATCG
+CCAGCAAGCGGAAATTATGCGCGATGACATGCTGCAAAAAGCCTTGTCGCAACTGAATAACGGCATCTCAGCAGAAGAAG
+CACGAGTGGTGT
+>generic607
+CTCGAAGCTGCACTGCTGAGTTGAGCGACTTCTTGTTGTAAGCTGTCCAAGTTAGCAAACTTGATTGCTCCCAGTATGAG
+CTGTCTACACTTGGTAGTCATGCTTTGCAGACCGTCGGCTGTGGCGTTCAAAACCTTAACAATGTCACGTATTTTGCCGA
+CTGCGGCATCAACTTTGAGTTTGCAAGCAGCAACTTGTGCTTCAACAGCGTTGGACTTTGCAGTGACTTCGTTATTGACA
+GCTTGTTTGAACATTTTGACATCTGCCTGCAGCTGCTGAACGCGCAGTGCACACTTATCGCGACTTTCAGAGTGCTTAAA
+AAGTTTATGTCCATTGTGTTCTAAGACGCAACTGCTGCAAACAGCTTTAACGCAGCTTTCACAGAAAAAGTCTGCCTGGT
+TATCAGCATGCTCACTGCAGGTATTTGCAGCTGTTAATGATGGTCGACTGGTACGC
+>generic608
+GCAAAATTTGATCTATCACACAATGAGCCACCAAGCTTTCTACACCGTCAAGGACGTCGCTCCTGCTGACTTCATCAGAG
+AGTACGCTTAGCACTTGAAGAAGGGCAACAAGCTTTCGGTCCCCAAGTTCACCGAATGGACTACCACCTCCGTTGCTCAC
+GAGCTCGCCCCTCAAGATGCCGACTGGGTTTACATCCGAACTGCTGCCTTAGCCAGAAAGATCTACTTGAAGCCCCACAC
+TGGTGTGTCTACCCTTAAGCACATTTTCGGCTCCAACAAGGACAGAGGTAACCTTAGAAACAAGCACTAGGCTGGCTTCG
+GAAAGATCATCAGATGGGCTCTTAAGTCCCTTGAAGATTTGAAGATCCTCAAGAAGGACAAGAATGCCGTCAATAAGAAG
+AACTCCAGAGTCATCACCGTTGAGGGACAGACTGAGCTTAACAGAATTGCAACTTAGATCGTTCAAAAGAGCTTGCTGCT
+GCCACCG
+>generic609
+GCACGACCTCCAGGGCGACACCACGACGAAGGAGTGGCGGGACTGTCTGTTTTGCCCGGACAGGCCCGGTCCGTTGAGGG
+CCTCGATCGAAAACAACAAGCGGGACAGTTCGGACCCGTTCAGGTCGACGGAGTCGAGACCTCGCCTCTGTACCATCGGC
+GCCAAGAAGGGCATCTTCACCGCCTATCGCCCCGACACGGCCTTCAAGTGGCACGGAGCCGAGCACCTGAACTTCAAGGT
+CGACACGACCAACCTGCCCAACGACTTCGCGTCGAAGAGCCTGCTTGGGCTCGAGAACAACAGCTCGGCCGGGGCGTACG
+TTGAGGTCGCGTGGAAATCGCACCAGCTGACGGTGCTTCAAGGCCTGCTGCCGTAGCCGTTTTGATGTCAGACCATGTGG
+GTAGAAGGGGGTTGAACCGAGTGCCGCCGACTCACTAACCTTCAAGGTGTCCCTTATGGCGTCGAGTGCCCCGAAGTACG
+TTACCCACGAAGAGTTCGAGCCCATGAAGCAGGGCCTTGAGCGACTGACGATTCGC
+>generic610
+GCCTCTGCAAAAGCGGGTGGAAAAACGTTACGAAGGCATTTATCTCAAGACCAAGGTCAGCAAGCTGGAACCCACCAAGG
+AAGGACTGCGCGCCACCTTCGAAGGCGACGGCGCGCCGGCCCCCCAGGTCTACGACCGCGTCCTGCTCAGCGTGGGACGG
+CGCCCCAACGGCAAAACCATCGGTGCGGAGACCGCCGGTGTGAACGTGAACGAACGGGGATACATTCCCGTGGACAAGCA
+GCAGCGGACCAATGTGGCGCACATCTTCGCCATCGGAGATGTTTGCGGCGAGCCCATGCTGGCGCACAAAGCGACCCACG
+AGGGGAAGATCGCAGCCGAAGTCATCGCCGGCCACAAGGCCTCGTTCGATGCGCGCACCATTCCGTCGGTGGCATACACG
+GATCCGGAAGTGGCCTGGATGGGCCTCACTGAAACTGCAGCCAAGGATCAGGGCGTGGAATTTGAAAAGGCAGTCTTCCC
+GTGGGCGGCCAGCGGACGTTCCCTTGCCATGGGGCGC
+>generic611
+CTGGGCCAGACGGCCCTCATCAAACTTGGGCGTGCTCATGCGAACATCTCCTGGAGCTTGTCGATCGCAGCCTTGGTCAC
+CACGATCTTCTTGTAGAAGACCAGCGACAGCGGATCGGCATAACGCGGCTCAACCACCAACACGTTGGTCAGGTTGCGCG
+CGGCAAGGAACAGGTTTTCGTCAACCGAGTCAGCGATCACCAGCACATGGTCCAAATTCATGGCCTTGAGTTTGGCAGCC
+AGCAGCTTGGTCTTGGGGGCTTCGATGCTGATCGAATCCACCACCACCAGACGGCCTTCACGAGCCAGTTGCGAGAAGAT
+CGCGGCCATACCGGCGCGGTACATCTTCTTGTTAACCTTGTGGCTGAAGTTTTCGTCCGGCAAGTTCGGGAAACACCCGA
+CCACCCCCACGCCACAGCGGCGAGGACGTCATACCCGCACG
+>generic612
+CAGACATGTTGGGTTTAACTATAGCCGTACATAATGGTCGTCAGCATGTTCCGGTTCTTATCTCTGAAAATATGGTGGGT
+CATAAATTGGGCGAGTTCGCTCCGACTCGCACATACAGAGGGCATGTAGCTGATAAGAAGTCAAGGTAAGAATTCTATGG
+AAATTTCAGCAAAATTAAGTAATGCCCCGATGTCTGCTCAAAAAGCAAGATTGGTTGGTGATCAAATTCGCGGTTTGCCG
+GTTGAAAAAGCATTGAATTTGTTAAAGTTCAGTTCAAAAAAAGCCGCTGCGATTATGCAAAAGGTTTTAGAGTCTGCGAT
+TGCAAACGCTGAGCATAACGAAAGTGCCGATATTGATGAATTAGTCGTAACGACTGTGTTTGTTAATGAAGGAACTGTGC
+TAAAAAGAATGCGTGCCAGAGCAAAAGGACGTGGCAA
+>generic613
+ATCTTCGTGTACCTGCAGGTCTTCAACGAGATCAACGCGAGGAAGCTCAAGCCATCTGAATGGAACGTGTTCGCGGGCTT
+CTTCAACAATGGCATGTTCATCTTCGTCTTGGTCGCAACCATCGTCGTGCAGCTGGCCCTCACTGAACTCGGTGGCAAGG
+CTGTCAAGTGCGCGCCACTCACACAAGACTAGAACCTCATCTGCATCGGGATCGGCGCGTCTTCCCTCGTCGTCGGATTC
+ATCATTAAGCTCCTGCCGTCCTCCATCGATTCGGTTCTCAATAAAGTCAACCCTTTCAGTAAAGATGGCAGCCCAGAAAC
+AGTGTCGTCTGAACCAGCCGGCGGAATCTTCCAACGCCCGTCTCTCCTCAAGCAACGTAAATCTTCCACACTGCAGCAGC
+AGCAGTCGTCATCGCAACAATAGCAATAGCAGCAGGCACGCAACTCGCAGAGAAAGGCACAGC
+>generic614
+CGTCTCTTACGGCACAAAATCATCAAGACGAATTCTTCTTCCTCAAGAAAACACTCCCTAAAAGGAATAAATCGATCGAA
+GCCAAATGAAATAGCAATTAATCGTCATCGACGTATGAATGTTGCGATTCGACACGGATCATCTGGATTCAGCGCAATCG
+GGCTCAAGATAGCTGTGGATTTTTGGCTCAACCGATCACTACCGATGTCCACGTTTTCCTTCCTGATTTTCTGCTTTAGT
+CAGGAGTAAATTGAGAAGAAACGGAAAAAATATCTCAAAGAAAAGTAAACTGATCGGCTCAAGCATTGCCAGATAACGTT
+GACATCCTCCTGAAACTCCGCGAGCAAGGCAACGCCACAGGGATTCCGAACT
+>generic615
+CCTAAAGCCAGTACGGTTGTGGATTTGTCCGTCAATCTCGACATGGACACGCCTGCCGATAGCTTTACGTTGGTGTTAGG
+CAATGTGGGGCGTTTTCGACCCGCACTGAAGGATGAGACGAAGATAGAGTTGGGCTATACCGATAACGGCGATTTAACGC
+AAGTGATGACGGGGAATGTGGTTCGGGTTGAACCAAATTTAACGACTATTCGCGTGCTTGGTGACAGTGTCGCCGATAAG
+TTGCTACACACTTTCGTTGAACAAACTAACGAGAGTAAAACGGCAGGGGCTATTGTTCGCGATTTGGCTGGCAAAGCGAA
+GGTTGATGTGCAAACTGCCGAGGATGGGATTAATTTTCCCGCTTATGTCATCGACGGTAGGCGGTGTGTTTACCAGCATA
+TACACGACTTGGCTGAGCTGTGCGGCTTCGATGTTTATATTAACGCCGACGGTAAATTGGTGTTTGAGAAATTTATCACG
+AGTGGTGT
+>generic616
+GTCAAATTCGGCCAAGTGCTTTCGACCCGGCGGGATTTGTTGCCCCCCGACATCGCCGATGAGTTATCCAAGCTCCAAGA
+CCAAGTGCCGCCGTTTCCGGGTGACCAAGCACGGGCACTGATCGAGAGCGCCTTTGGTCGGCCCATCGATGCGGTGTTTG
+AGCAGTTCGATGCCGAGCCGATTGCCAGCGCGTCGATTGCGCAGGTCTACTTTGCGCGGCTGCATGGTGGGCGTGAGGTC
+GCGGTCAAGGTGCTGCGCCCGGGCATGCTCAAGGTGATCGAGTCTGATCTGGGTCTGCTGCGCACGGCAGCCGGCTGGGT
+GGAGCAAGTTTCCCAAGATGGTCGGCGTCTGCGCTTGCGTGAGGTGGTGGCCGAATTTGACAAGTACCTGCACGACGAGC
+TTGATCTGGTGCGCGAAGCGGCCAACGCGGCCCAATTGCGGCGCAACATGGCCGGCCTCGATCTGGTCTTGGTGCCT
+>generic617
+AGCATCTGCGTGGCCGGCTTGCCGTCCAGGTGCACCGAGGTCTGGGGAATCATGGTCAGCTCGGCGAGCGACATCGCCAC
+GCCCTTGGTCTCGAGCGCCTGGCGCACGGCCTCGAAGCTTGCGACCGCGGTGGTGATCTCGAAGGTGCCCTCGGCCAGCT
+TCATGTCGTCGGCGCCGGCCTCCAGCGCCAGTTCCATGAGTTCGTCCTCGTTCGCCTTGGCGGCATCGACTTCGATTACG
+CCCTTCTTGTCGAACATCCAGGCGACGCAGCCGTTCTGCCCGAGGTTGCCGCCGTACACGAGTGGTGT
+>generic618
+GCCGATTCCGGTGCCGATGGCTTGGCACGGCTTTGGCGGCTGGAAGCGTAGCCTTTTTGGCGATATGCATGTCTATGGCG
+AGGAAGGCGTGCGCTTCTATACCAAGCAGAAATCGGTCATGCAGCGTTGGCCCGAAAGCACGGCCAAGGGCGCTGAATTT
+GTGATGCCCACGGCGAATTGATGTGAGGCGGCCGTTGGTGCGATGCCCTGATCAGTGTCAACCCTCGTCGGCGCGGCATA
+CTGTGCCGATGAACCATCTAAACACCCAAGGGAATACCGTGTTGCAGCGCGGTGTGGACCGAAAGATGATCCGCATTCAG
+TTGCACGTGGAGCTGAACTACGAGATTGATCCGCCCGGTGCGGACTTTGTGTTCAACATCCACGCCGCCCACACACAAAG
+CCAGCACGTCACGGCGGAGCGGCTGGTCTTGAGCCAGCCGGTGCAGCCGATCATCCACACCGACCCGGCTACCCACACCC
+>generic619
+GCGCCATTGACTTGCGTAATAGCTGCTTTGGGCTGCACATCGCCAGACGCGTCCTGTACGGACATGAGGCTGTTGCTAGC
+CGCAAGCAGTTTGTCCACGTCGCACTTCGGGATGGGAATCACCTCCATCTTAATGTTCAGCCGCTCCGGTTTGTCCCGTC
+TGATTTCGACACGACGTTTCGCAACAAGTGTTTCGTTTTGCTTCCGAACGACTTGCATGCCAAGGCGTTCCTTGAAGACT
+TTGCGCATGATAGTCGTGTCACCGGAAGTAGTGTTGACAAGCGGCGTGTTGATGAGAACGATGCGTTGCAGTAAGGGCCA
+TCCTATGAGCGATAGCAAGTCAGCATCGCGCACGATTGGGTTTCCAGCCAGACTGATTGTGGTTAATTCACAGAAAGGTG
+GTTCAATTTTTAGTAACTTGTTGCTCTATTGAAGCCATGACCTGCGCAGCAGCATGCTGTTCGGCGTCACGGTAA
+>generic620
+GTCGGGGCCTCACTCGAACCGCAGGATCGGTTGGTCCACGGTCAGGCTTTCGCCGACTTTGGCCAGGACTTCGGCGACCT
+TGCAGTCTTGGGTGGCGGTGAGGATGTTTTCCATCTTCATCGCTTCGATCACGGCCAAGCGTTCGCCGGCTTGGACGGTT
+TGACCGACTTGGACGGCGATGTTGACCAGCAGGCCCGGCATGGGCGAGAGCAGCGACTTGCTGGTGTCGGGCGGTGCCTT
+GTAGGGCATGAGCTTCATCAGCTCGCCAGCGCGCGGCGACAGCACCAAAGCGTCGATCTGTGTGCCGTTGTGCGCCACGC
+GCAGGGCCAGCGCGCGCTTGCCTTGGCCACGTTCGACTTGGGCGCTGAAGGGGGTGCCGTTGCACAGGCCAGTCATCAGG
+GCTTCGCCCAGTTTGGTGTGGCTGCGAATGGCGTAGGTCTTGTCGCCCACCAGCACGTTGGCCGAGCCGGTGCTGTGGTC
+GTAGCT
+>generic621
+TTCGGCACCAACTGGGCCTACTACTCGCATTACGTCGGTGATGTCTTCGGTGCCCCGCTGGCCATCGAAGGGCTGATGGC
+TTTCTTCCTTGAATCGACCTTTATCGGGCTGTTCTTCTTTGGCTGGGATCGCCTCTCGCGCCGCGAACATCTCTTGGTCA
+CGATCCTGATGGCGATAGGCACCAACCTGTCGGCGCTGTGGATCCTGATCGCCAACGGCTGGATGCAAAACCCGGTGGGT
+GCTGAATTCAGCTGGCAGACCATGCGCATGGAGATGGTGGATTTCTGGGCCGTGCTCTTCAACACGAGTGGTGT
+>generic622
+CCGGACACCACGTCATCCACCGGCTTGGCGAGGAAGATAGTGAACTCGTTGAAGGTCGGGGCGCTCTGCAGCACGGTCAC
+ACCCGGTATCTGAGCCAGGCGACCCTTGGCGTACTCGGCCTTGTCGCGATTGAGAGCAGCCAGGTCCTTAAGCCCCTGCT
+TGCCGACGGAGGAGAGGAAGATCAGACCGCGCAGGGCACAGAGCCCCTGGTTGCTGCAGATATTGGAGGTGGCCTTGTGG
+CGCTTGATGTGCTGTTCACGGGCCTGCAGGGTCAGCACGAATCCGCGCTTGCCGTTGCGGTCGACCGTTTCGCCGACGAT
+GCGACCCGGCATATTGCGGATCAGGCTCTTTTTGGCAGCGATGAACCGAGAGGGCCGCCGAATGAGAGCGGGTTGCCCAG
+GCTCTGGCCATCGCCGACAGCGATGTCAACACCCAGTTGGCCCGGCGAGGCCAGCATGCCCAGCGAGATCGGATAGACCG
+A
+>generic623
+GGCGAGCAGGAACGTCCCCGCTTCGATCCGGTCGGGGATGACCTTATGGCGCGCGCCGTGAAGCTTGGGCTTGCCTTCGA
+CGGTCACGGTCGCGGTTCCCGCGCCGTGGACCTTGGCGCCGAGGCTCTGCAGGAACACGCCGAGGTCTTCCATCTCGGGC
+TCCCGCGCCGCGTTCTTGATCGTCGTCTTGCCGGCGGTCGCCGCGGCGGCCATCATGAGGTTCTGCGTGGCGCCGACGCT
+CGGGAAACGGAGCTTGATCGTCACGGCGTTGAGCTTGGGCGCGGACATGATGATGTCGCCCTGGTCGGCGATGCGGCGCG
+CGCCCATGGCCTCGAAGCCCTTCAGGTGAATGTCGATCGGCCGCAGGCCGATCGCGCAGCCTCCGGGAATCGGCACGCGC
+ACCAGGCCGAAGCGTGCCAGGAGCGGGCCAGCGGCCAGCACCGAGGCGCGCATCTGCTTGACGATCTCGTACGGCG
+>generic624
+AAATAAATGACCGGGATCATTTGCCTCCCAACCCTGTTTGCGGATTTCAAGATAGGATCGCGCTGCATAAGCCGTAGCCC
+AGGCAACACAGGAACTCTGGCTTCCCTGTTTGCCGGGAACAGGAAAATTGGCAGACATATCCACTGCTTGGGGAAGATGC
+GCCCGATACCGCTTGGTTTGCGGCATGGCAGCATAAATCTCCGGTTTTTCCGGGATAAAGCCTGTCGCATAAATTTCACT
+GTCTTCTGCTATGGCACTGGCAGATAAAAACACGCTCAAGCCCAATAACCCCGCCCACTTCTTCGTTAATCCACTGACCA
+ACCGGGACAATTTAAAGTTAGAGACAGTAGTCAATGCGGTGTGTTTTGACTCATGGTAACCTTCTTTGTTTGATGAGTAG
+ATTTTATAAATTATGTGTATGAAAGTTTTCATTGAATATATTGCCACAATGAACTGCCAGAGAGATTAAATCAACATCCT
+GACCCGAACAAGTTTAGTAGATTCTTGCTCTTTCTTTGC
+>generic625
+GCGGACGGTTGCGAATGGCAGGACACAACACCCACACCGCCACAAAGACAAACAACAAAACACGGACTTGAACAAGACGG
+CGCGGGCTATGCTTGCCGCGTGTTGCTTAATGAAGACGGCGACGACTACCACGAAATAAACCCATGTTGCACACCCCCCG
+CTGGTTATCGGCAAGTGTGTATCAAGTGCGGTTTTGATGAGTTCGATACAGGCACTTTTTACCTTGATTGCCCAAAATGT
+CGTTTACAAGTGGTTCACTATTGCCGCTATGTCACAATCGCTGGGGGTGCGGCATGAATGCAACAGCCCTTATTATTCAT
+TTGGATGCGTACCGCGCCAAGTCCAAAGCCCCAACGCTAAACCCTCACAACCGCCCGCACCAACGCACGATAACCAGCAA
+GCAACAGATCATAGACCAGCTGGAATTGGTACAAATCCAATCCATTGTTTTTAGTCGCGCCCTTAAGAAAATTCCCGATG
+AAACAGGGTTTTCATTACACATTGCTGAACATTACGAAGACTTA
+>generic626
+CGGGTCGGCTGGCGTTCGCTGCGCCTGCACGATGCGTTCGGGACGCGTCTGGACATGCTGCAGCTTGTTCCACAGACGGA
+CGTTGCGGCAGAGCACCTGGTTTATGCCAAAGGCCTGACGACGCCGCTGCGGCTGGTCATTCAGCGTATGCCGGCCGAGC
+AGGCCGAACGCCAACGCAAGCGGGTGGCCCGCAAAGCCAACAAGCACGGCAACACGCTTGATCCGCGCACGGCAACAGCG
+GCTGGCTATCTGATGGTCGTGACATCGTTGTCGGCACAAGCCCAGTCAGCTGAGCGGATCATCGACATGTACCGCAACCG
+CTGGCAGATCGAACTCGGGTTCAAGCGTCTGAAAACGCTGGGAGGCCTGGACAAGCTGCCAGCATTAGACCCGGCCCTGG
+CAAGGACTTGGTTGCTGGCCCAGCTGATCGTTGCCGTCATCACCGACGAAACCGACGAGTGGTGT
+>generic627
+GACTCAACACATCGGTCTGTTGCTCGAGCCAGACCACGCGTCTTTCCTCGAAATGGAACTGGTCTGCGTTTTCGAGTGGG
+GCCGCTACCTCGGCCATGATCCGGTACAAGTCGCGCTGTGATTCGAGCAATAACGGTCCACAGCGTGGATCAAGCGTCGA
+GGCGCGCGCCAGCCCAAGGGTCGCGGACGATTCGTCCAGTGCTCCGAGTGCTTCTATGCGGGCGTGATACTTTGCGACGC
+GTCCCTGCCCAAGCAGTCCGGTCGTGCCATCATCGCCTTTGCGCGTGTAAAAAGACATGGGTGGATTATAATTTCAGAGA
+ACCCATATGCAAACCCCAATTAACCGACAATGGATCGCGCACGTGCCCTCGATTATCACGGCCAGCATTGCTGTCGTGTT
+GCTTGTGCTGACTCCGTTTTGGGCTTTGAAGTGGTATCACGCACCGTTTTTGGGGATGATGCTCGAACCGCATAACGTGG
+TCAGCCAGC
+>generic628
+ATTTCGAGGTCTTTGATTCGGATCAACAAGCCTTTGTCGACCATCTGACTGTGAAGGTATTCAACGAAAGGACTAACTTT
+GCCGAGGATATCGTTTGCGTCGACTAATTCTTCAGAAAGATCTCGTACGTCTTGGGATTCGAGTCCTCTGGCATTTTCGT
+TAAATTGATTGATGCAATTTCTCAACTGTATGGGACTGATAAATTGAGCAGGAATTAAAGTCTGAGGTCTTAGTGTGGGT
+CTCGCAGCAGGCACTGCGGACTGTTGTGATTCAAAGATTTGTTGTTGTTCTTCGACTATCATGACCTCGTCGTCTGGATC
+AGGCATAAGCCTTGGGACAGGTGGACCAAGTCTTGACTGAACTGGTGTTCTTGGGTCGAGGTCACTCGCCCTTGAAGTTG
+ATGGAGTTGGTTCAGTCTCCTTTGACTTAGATTTTGACTTAGGTCCCATCCATTTCTTTTCTGTAGACTTTTTGTTTCTT
+TTCGTCGAATTCGCGCCTGAACGTTTCGACGAGTGGTGT
+>generic629
+ACGCGCGATTTCAGCACCGTCATGGCCGAATCACCGCCGCCGCCGGCCACCGCAAAGTCCTTCCACGTGTGGCCCTTGGC
+TTGCAAGGTGCTCTTCAAGGCCGAGGCCGCCTTGGCCTCGCCGCTCGACGTCCACCAGTGCAGCACTTCGACTTCACCGG
+CGTGGGCGGCACCGCCCGTCAACGCCACCAGCACCGCCGAAGCCAGCGCGACGGGGAGCATGCGCAATGTTTTCATGATC
+AATCCTTGGTTAAACTTGGTCAAGTTTGGAAAATCGCCGCAGCACTTCAGAACCACATTTCAGCTTGCAGGCCGACACTG
+TGCCGCTGGTCTTGGTCGAGAGGGCAGGTACACCGACCAAGCCGTTGGCTCCCCGCCGCCAAGTTGGCCGCATCGTTCCA
+AGTCGCACGAGTGGTGT
+>generic630
+CCCCGGTGGGCACCGGCATGATGGCGCCCAACACCTTCTGGAACGTGGACTACGGCACCCGCAAACGGGTCGGCGTCTAC
+GGGGAATGGGAAAACCACTGGAGCGCCGACGGCACGCTGCTGCTGGGCCTGCGCCATGACCGCGTGACCGCCAACGCCGG
+GCCGGTGCAGGGCTACAACGCCACGTCGATCTGGGCTGACGATGCCGCCGCGTTCAACGCCCGGGATCGCCAGCGCAGCA
+ACCCACACTGGGACTTGAGCGCCTTGGCCACCTGGAAAGCCAGCTCGACCTTGGCACTGGAAGGCGGTCTGGCGCGCAAG
+ACCCGCTCACCCAACCTCTACGAGCTCTACCCTTGGTCCACCCAACCGATGGCCACGCTGATGAATAACTTCGTCGGCGA
+CGGCAACGGCTACATCGGCAACCCGGATCTGCGCCCCGAAGTCGCCCATACGCTGAGCCTATCTGCCGATTGGCACGACT
+CACATGACGCGCCGCAGCCGCTCT
+>generic631
+GCTTTTTTGCAATCTGTATTGCCTCATCATACCTTGTCAAAATTGATGAGCGTACTCACGCACTCTGAAATTCGCTGGTT
+TAAGAACTTGTTTATCAAACAAATTATTAAACATTACGGTGTCAATATGGACGAGGCATTGATACAGGATATTCATGCCT
+TTAAAAGTTTTAACGACTTTTTTACCCGCGAATTAAAACCCGAAGCCAGACCGTTCAGTACGGAAAAAATGCGATTGTCA
+GTCCTGCCGATGGTGTGGTCAGTCAAGCAGGCAATATTACCGCTGGGGATATTTTCCAAGCCAAAGGTAAAAGTTTTACG
+GTGACTGATTTATTGGGTGGTAGCGAGGAACGCGCCGCGCCGTTTAATGACGGCGTGTTTACCACGATTTATTTATCGCC
+GAAAGATTATCACCGTCTGCATATGCCGTTGGCGGGTACATTGACAGAAATGGTTCATGTTCCCGGTCGCTTGTTCAGTG
+TGAATACGGCAACGACGGAAGCCGTGCCTCGGTTATTCGCC
+>generic632
+ATGGCAGTAGCGCTCTAGGCCCGCAAAGTCGAGGTAACGGGTTTGGGATAAATCCATCTCGCAGCCGTCGATCACCGCGA
+GCAGGTGGTCTGCGCGGATGCCGTAGTCCTTGACGTGCGGCATCAAGGCTTGGGTGACGGGGTGACTGGGGCTGCCGCCG
+AAGGCGCGTTGCACTTCGGTGCGCCACCACGCCAGTTTGGTGGCGGCGACACCGCCATCGCTGACTTCATCGACCACGTC
+GTCCACTTCCCGGCAAAAGGCATAGAACGCCGTGATGGCGGCGCGGCGCGGCGGCGGCAGGAACAGGAAGGCGTAGTAGA
+AACTAGAACCGCTTTTGGCGGCCTTGTCCTGCACGTATTGTTCAGGGCTCATGAAGGGCGGTGCGAGAGGTTGTCGGGGC
+GCATGCGCAAGGCACGCCACGAGCGAAAAGCGGTGCGTCCACGGCTTGGATCGTTGGACGCGTGCGCAGTGTGCCATGGT
+CGAT
+>generic633
+ATCCCAGCATGATGTAACCGACCCACGTCTCCAGGTTCTCCTGCACACCCAAGCCACGCAACATCAGCGGCAGAAATGGC
+CAGGAGAGGGCGAAACCCAAGCTGCATAACAGGTTGGCAATTGGCAGCGCCTTCAGATTGCGACGCCAGTAGGGGAACTG
+CCGCATCTCCTCGGCATCGGAAATGCCAGCGGCGGGGTGCGCAATCACGTCAGCACTAGTCCACATGAACCCAAAGTGTC
+GGACATGTCCATGACACCGTACTGGTAGTCAGCCGCGCGGGAAAACAAGACATTTTTCATATTGAGTTTATGTCAAATGC
+CGATTCTCCACACGTCTTTCATGAATTCCAAGTAGGGAACGTCCGCCTTTGGGCCACGAGTTACTGCTCGACAATGACCG
+GTCGGAAAGGAAAGCAAATAATGTAACCGGTACGGTCAGAAACTGTCGCGCAGCGGGCACAGCCCGGGCACAGAGTAGAG
+TCAATCTCCAAGCGGCC
+>generic634
+GCCCCAACCAGCCATAACGCTGCATCAGGAGGCCAAAGAGGCTTGGATGCGCAGCACCGAGCTGCCCTTCCACCGCCTGC
+CAGACGCCGGCCATGACCAACACCGCCAAGGCGCCGGTATAAGCCCCCGCCCAGCTTTTGCCCGGGCTGATCGTCGGTGC
+CAACTTGCGCCGACCCCAGGCGCGCCCGCCAAAATAGGCGGCACTGTCAGCCATCCAAACGAGGCAAAAAATCGAAAAAG
+GAAGTTAAGTCCCTTGGCCCGCGCGGCCATGATCGCCAGCCACGCCAAGACCAGCAACACCATGCCGAGCAGCCAGCGCA
+GCACACGCGGCACCGCCGGCCAAGCCCCCACGCCGCCATAGAGCGCTGCCGAGCCACCGATCACCCACAACAAAGTAGCC
+GACCCACCACCAGACGCAACAAGTTCTCAGCCGGGGAGCCTTGAAGAAACACCGCTTGCAGGGCGGCCACACACAGGGCC
+>generic635
+CCGCTTTGGGGGCGACCCCAGCGGCGGTGCTGGCGGGCTCGGGCATCGAGCGCGATTTCACCTTGCAAGCCGAGCCCGAT
+CAGGACGGCGTGCAGTGGGTGCGCGCCACGCCCAAGGTGAGCGAAGGCTCGATCCGCAACCTGCGCATCGGCTTCAAAGC
+TGGGGCGTTGGTGGCGATGGATATCGCCGACGCCTTTGGGCAGCACTCGCGGCTCGACTTCAGCCGCGTCGAAACCAATC
+CAACGCTCAGCCCGCAGCGTTTCCAGTGGACACCGCCCAAGGGCGTGGACGTGCTCAAGCAGTGAACCCGGTGGCCCAGC
+CTCCAAGCGATGGTCGCCGTGGTGGTCGCCATGGTGGTCGTAGCAGTAGCGTGCCGCTGGCCGAGTGGCTGCGGCCGCAG
+TCGCTGGATGAGGTGATCGGTCAGCCTGATTTGCTCGGGCCGGCCAAGCCGCTACGGGTCGCGTTCGAGACCGGCCAGC
+>generic636
+CAACGACGGCCAACGCCAACTCATGCTGACCTCCCGCCTTGGGCGCAGTTCAAATCTTCCGCAATCGAGCGTGCGGGGTA
+ATGGAAGCACACCGGGCCATCGGGCGAAGCCGTCACAAATTGGCGCACCAAGGGATCCTCGCTGTGGCGCAATTCGTCGG
+GCGTGCCCTGGGCAGCGATGCGCCCATTGGCGATGAAGATGACGTGATCGGCGATAGAGAAGGTTTCCTCGACATCGTGA
+GACACAACGATGGAGGTCACACCGAGGGCATCGTTGAGTTCACGGATGAGCCGGGCTGAAATACCCATAGAGATCGGGTC
+CAACCCGGCAAAAGGCTCGTCGTACATGATCAGATCGGGATCCAGCGCAATGGCACGGGCCAAAGCCACCCGGCGCGCCA
+TCCCGCCTGAAATCTGGCTGGGCATCAAGTCGCGCGCACCGCGCAGTCCCACCGCATTGAGTTTCATCAGCACCAGATC
+>generic637
+GTCGTTGCACGGAACGAGATGTGGACGGTTAGCGTCTCGAGGCAGGAGAAGCGCGTATTCATTGAGTGCGAGGGTTCGCC
+AGCAAAGCCGCTGGTGATGTCGCGGAGGGAGCTCTATCGGGTCGGGAGGAGCATGGGTAAGAAGAGCCGGCGATCCCAGG
+TGCGCTGAAAGCTCGGGACACTTCTACGGAACGAGAATGTCGATTGCCTGCGCTGAGTCAGTTCATATTCCCGCCATATG
+CAGGCTGCAGAACTCAATCTATTCCCCGATCACGGTAGCGACGGCGGGCGCCATGCGGTCAGTTGCATGGCGCATGACGG
+AGCGCCCTTGCACGGGAAGGGAGGCCCCTGGGGGCCGGACGGGAGTGCGCAGGGCCGCCGTAGCTGGCGCAGGGGCGGAG
+GGAACGCAGGCCCGGGTAAAGTTTGCATAACGCGCGCGTA
+>generic638
+GTTCGTCGAGGCCTATCTGGCGCGCGGCATGCACATCGACGACTTCGCGCCCAATTTGAGCTTCTTCTTCTCCAACGGCA
+TGGACCCGGAATACACCGTGCTCGGCCGCGTGGCGCGGCGTATCTGGGCGGTGGCGATGCGCGACAAGTACGGTGCCAAC
+GAGCGCAGCCAAAAGCTGAAATATCACATCCAGACTTCGGGCCGCTCGCTGCACGCGCAAGAGATTCAGTTCAACGACAT
+CCGCACCACCTTGCAAGCGCTGATCGCGGTCTACGACAACTGCAATTCGCTGCACACCAACGCCTTTGACGAAGCCATCA
+CCACACCGACCGAAGACTCGGTGCGCCGCGCCATGGCGATTCAGCTCATCATCAACCGCGAATGGGGCCTGGCGAAAAAC
+GAGAACCCCAACCAAGGCGCGTTCATCATCGACGAGCTGACCGAATTGGTCGAAGAAATGGTGTTGCAAGAGTTC
+>generic639
+CTGCGACAAAGCGGCCATCAACCCCGCGCTGGCATACAGGGCCAAGCCCACCAGCAACGGCAAGCGCCGCCCCAAACCAT
+CGGCCAAGGGGCCGTAGATCAGTTGCCCCGCCGCCAAGCCGGTGATGTAGACCGTGATGGTCATTTGCATGGCAGCGTTG
+CTCACCCCAAAACTACGCGCAGCATCAGGCAAAGCGGGCACAAACAGGTGCATCGCCAAGGTGCCAGAGAAGGTGATCAG
+AGCCAGCAGCCAGAACGGTGCCGCCCCACCCTTAGAATGCAGCGCCCACCGCTTTTGTCCTTGATTCATGACCTATATTG
+TCCTTGCCCGTAAATACCGACCGCGCAGTTTTACTGAGATGGTGGGGCAGGAGCATGTGGTTCAGGCGCTGGGTAATGCG
+CTGACTCAGCAGCGCTTGCACCACGCCTATTTGTTCACCGGCACACGC
+>generic640
+CGCCAAACACGGTGCGAGCATCCTTACAGCTGTCGTTGGTGCAAAAGCGGCCGAAAACACGATCAGCATGATCACCGCCA
+AGGCGATCCAAAGGGGCCATCGAGCGGGATCGCCCAAAGCGTGGAGTGGCGCGGCGTCGCGTTTGAACGCGCTGCGTTGA
+TGGGCAGGGATGGCAAAAGCATCCATCAAGGTGCTGGCTTCGATCAACTCTCCGCCTGACCAAACCACCTCTTGGCCTTG
+CTGTTCGCGGCTCATGCGGTGGCGTCGCGCCTGGCCTTGGCCCTCGAAATCCATCACATGGTGTTGTTCACCTCGGCGAA
+CCTGCCAATAAAACTCGCCCAGCACACAGGTGGTTTTGGCCGGATAGCTCCAGCGTCGCTTTGTAATTTTGACCGGCCCA
+ACGGGCCAGATCGTTTTTGAGTTTGGGCGCACCCGTGAGCGGTTTCATCCAGCTCCAACCGTCTTCGGCATCGACCAGAA
+AG
+>generic641
+GAGATGCCGGGGAGAAAGCCTGACCAGCTTTTTGTATTCGGCTTTATCGTAATACTCCTTCACCCCGACTACGCTGGCAA
+AGGCCACACAGGTGCCTTCGTTACCCTGGTTACGCACCGGGGACATGCGCCGGGAATAATCGAGCTTTAGCGGTACCGGT
+ACTGCCGCCATGACCAGGCGCATGGGTATATCCCGCCTGTCCCGGGGATCCTTTTTACAGCCAAGCCTGTATGTCTTTAG
+AAGGGCAGACTTATCCCGCATTCGATCTTCAACTCCTCGCTTAATTCTTTGAGCCGTAAAAATGCCTGCGCGTCCAGGGA
+TTTCAGGAAACGATGCGTGAAGACAACGCTTGCCCCCAAAGGCTCCCCGGAGACACTTTTCAGCTCGAAAGTCACCAGGT
+CAGCTTTGCCGAAAAATACATCCGCGCCGAAGACGATCTCGCGCACCTCACCCCCGGTATAATCCATCTGGAAGGAAAGC
+CCGAGCTTACGGCTGAATTTCCAGGCACCGTAGAG
+>generic642
+GACGGCTAAAGATGAGATTCGGGTAGACACCGATGCAGGGCAGCTTGTGCTGCAACTGCGTGATGATGGATTAGTCACCG
+TAAATATGGGGATTCCTCGCCACACAGCTGCGCAAATTCCTTTGCAAACCAGTCAAGAGAGCAAACTTTATAGCCTGACT
+ATTGATAACACAGAGGTCAGCTTTGGTGCGGTATCAATGGGCAATCCTCATGCGGTATTAATTGTGGATGATGTCGCTGC
+CGCCCCCGTTAATGAACTGGGTGCGAAACTGGAGTCCCACTCTTTTTTCCCGCAACGCGCCAATATTGGTTTTATGCAGA
+TTGTTGATCGCCATACTGTTAGCCTGCGCGTGTTTGAGCGTGGTGCTGGCGAAACCCTGGCGTGTGGCAGCGGCGCATGT
+GCTGCCATTGTCATCGGCATCGAGCAAGGTTTATTAGCCGAAAATGTGCAGGTGACATTACCCGGCGGACAA
+>generic643
+GTCGCGATCGACTCGGTCGAGGACATGAAGATCCTCTTCAACGAAATCCCACTCGACAAAGTCTCGGTCTCGATGACCAT
+GAACGGCGCGGTGCTGCCGGTGCTGGCGGGCTACGTGGTGGCTGCTGAAGAACAGGGTGTCTCGCAAGACAAGCTCTCCG
+GAACCATTCAGAACGACATTCTGAAAGAGTTCATGGTGCGCAACACCTACATCTACCCACCCGAGCCGAGCATGCGCATC
+ATCGGCGACATCATCGAGTACACGGCGCAGAACATGCCCAAGTTCAACTCGATCTCGATCTCGGGCTATCACATGCAAGA
+AGCCGGCGCCAACCAAGCGCTGGAACTCGCCTTCACGCTGGCCGACGGCAAGGAATACGTCAAGACCGCGATGGCCAAGG
+GCATGGACACGAGTGGTGT
+>generic644
+CCACGATTTCTGCCCCATGTCTGACGGCGTGGCTTGCCTCATTTTAACCTCCAGACCCCATGATGTTCTTCTTTCCGGCG
+TCGGCAGTGCTACCGATATTCCGACTATTGCCGACCGGCTTTATTTCCACTCTTTCCGGCTACCGTCAGAGCGGCGGCAG
+AAGCCTACGCCATGGCCGGAATCAGGGATATTCGCAGCTTTGCCGGTTCGATTCATGTGAATATGCACGACCCGTTCAAC
+GGTTTTGGCCCGGTGAATATGGTGGATCTGGGATTGGTGCCACAGTCGAAACTGCTCTCCGCACTGCTTGATGATTCAAT
+TACTGGTGAACGGGGCTTGTTCCCTACCAATCTCACCGGTGGTCTCAAGGGGCGGGGCGATCCGTTAGGGGCAACCGGCA
+TGATCCAGGTTGTAGAAAATCATCAGCTGCTCATGACTCGTCGCTTCAGGGCCGGTCTTTCCCACTCCATTGGCGGACCG
+ATCAATAATAACGTTGTCAACGAGTGGTGT
+>generic645
+CGACAAGGTCGGAGTGATCGACATCTTGGAGAACTCCGGCGTCGGCTACCCCAAGTATTACGAATGGCGCTCACGCAGCG
+GCTGCACCTTCTGCTTCTTCCAGCAGAAGATCGAGTGGGTCCGCCTGCGCGAGAGGCACCCTGACGCCTACGAGGCCGCC
+AAAGCCCTCGAAAAGGACGCCTTGGAGCACGGATCGCCCTTCACCTGGTCCAAGGGCGAATCGCTCTCCGACATGGAGAA
+GTCCGAGCGCGTGGCGGAGATCGAGGCGGAATATGAGATACGCCGCGCCCGCATGCGCAAGGCCATCCCGATCAATCCGC
+TGCGACCTGTGAAGGCCTGCCCGGACGACATCGACGACATCTACGGGGTCGACGAGGGCAACGGCTCCTGCGCCGTTTGC
+CACAAATAGGAACTGCAGGCTTCGCCCACGATGGAGGGATAACAACAAATGTTCAGAATCACCGCCCGCACTGTCTTAGA
+GCTTGGCTCCGAAC
+>generic646
+GTGGGATGTTTGTTGAAGCGGATTTAGGGTTATGATTATGTCGCTTCTGAAGAGGGCTACTGAGGGATGACGATGGTTTA
+TTTGTGATACCTCCGAGGCTATTTGCTGCTGTGATATTAGATTGAGGGTAATGAGAGGTTTGGGAGTTCAAGGCTTGCTT
+AAGGGAAGATAGGTGTTTTTAGTGGTTAATTTGTTGAGTTTATCGACGAAATTGGATTGGATGTTCGAAAGTGTTGCAGA
+ACTGGTTAATAGAGAGGAATTTGAGTTTGATCGGAGAGTTGAGTGGCTTTCGGAGTCAGCGGGGTGTCTAGAACGAGATG
+GACCTCGAGGCGAGCCTTTATTTGGATTTGTGAAGGAAGGTTACTGGATAATTGAATCTTTTGAGAGAGAATGTAAATGG
+GATTGAATTCCGAGATTAAAACTCGGTTAACTGCTACTGTTGCTTATGCTGCTGCTATTCACACTCGAGTCAAGATTAAC
+>generic647
+AATTTATCTAGTGTTCGTTCCAATATGAATAAATTATTACATAATCCAGAACCATATCCTAAACCATTTAATTCACAAGG
+ATATGATCAATATACTAAACAAGAAAATTCATTATTAGCAAATAACAAACTGAAAAGACATCGTAGAAAGTAGATGAAAA
+AAAGAAATTAAAAAAAANAAAAAAACATATTCATATACAATCTCATCTATTACAACATATATATAATAAATAACGTCCTT
+GCATCTATGTCTTATTTCGTGCTATTTTTGTTACT
+>generic648
+CCTGCTCAAAGGCAAGGCCCACCTGGCGGCAGCCAACCTGAGCATGACACATCTGCGGCAGCATCTGGTGCGCTTTGGAC
+CGCCGTATCAAACCGTGCAGCAGCAGGTGGTCTACAACAAGGAGAAAAGCGAGGCGCCCAAATCCGCCAGCGACCTGGCC
+GACATGCACGTCACCGTGCCCGTCGGCTCCAGTTATGCGGAGCGCCTGGGCCAGATTTCCGAGGTGTTGCCCAATCTGCA
+CTGGGATGAGGTCGGCAACGCCGGCAGCGAGGAACTGCTGGAGCGGGTCGCAGACGGCGCGCTGGATACCACGATCGCCG
+ATTCACCGCTGGTTTCCGTGGTGCAGAATTACTACCCCAACCTGGCCGTCGGTTTCGATTTCGGCTTGCCGGACCAACTG
+GCGTGGGCCTTCCCCAAGACCGGCGACGAGTGGCTCTACCGCAAGGCCGGGGCATTTTTCG
+>generic649
+TATAATTCCAAAGGACATCCATCAATAATTTCCTTGCAATTAAATATGCTTTGCGAACTGTACCTGATCGCCTCCGAAGA
+GTAAGGCTTTATGCCGTGCCTCCTGGTAGAGCTTTTCCTAATCTCGCTGGCATTCAGCGGAGAACTTCGCTTCCTCTCCA
+TCCAAGTACCCTCGAAGCGAGTCTTTCACGAGATCCCTGCACTGTGCGCACCACCGATGCTTGTATGTGATGTGTGAGGC
+CTGCCAGGAGTGGTTCTTCGCACACTTGAAAGTAAGGGATTTCGCGTAGAAGGGAGAAACGACGCAGCCTTTCTTGGACT
+CCGCGTACGACTTGGCCGCTGCAAGGAGATCATCACATCGGGGACACCATTTGGACACGAGTTCCGCGGGAGTCAACTCA
+AAGGCATGCTTGAGGAAACACCGAATCAACAAGGTGCAGCAAGGAACACGACTAGTATCGTCCGCTGCGAGTCTTCCCAT
+CCGCTGCTCCAC
+>generic650
+CTCATTTACAGCTATGCCACCGGCACCTTCGGCAGCCGCCGCATCGAGCAGAGCACTTACGACAGCATCCCGGTGCGGCG
+GCTCACCGCCGACACCCATCCCGACCCCGACACCCTTTGCACCTTCCGCCGTGAAAACCAACCGTTGCTCACCGAGAGCT
+TTGTCAAAGTGTTGCAACTGGCCCAGCAACTCAAAGTGCTTAAGTTTGGCCAACTCACCGTGGCGGCCGACGGCACGAAA
+GTTCTGGCCAACGCCAGCAAGCATAGCGCCGTGAGCTACGAACGCGCCGGGGAAATGATCGCGCAACTCGAACTGGAAGT
+GCAGCAACTTCTGGCCAAGGCCGAAGCGGCCGACGCCACGCCGCACGAGTGGTGT
+>generic651
+CGACAAGTGGTTCACCTTGCAAGCCAGCGCGCCAGAATCAAACGGCCGGGTTTTTGCCCGCGTCAAGGCCTTGGCGCAGC
+ACCCCGATTTCTCGGTCAAGAACCCGAACCGGGCGCGCAGCTTGTTGATGGCGCTGGCACAAAACCCAGCCGCCTTCCAC
+CGTGCCGACGCCGCCGGCTACGTCTTCTGGGCCGAGAAAGTTGCGGAGATCGACCCGATCAACCGGCAGCTTGCGGCCCG
+TTTAGCGCGCGGTTTGGACCGTTGGCGCACCTTGGCTGAGCCGCAACGCGGCGCGGCCCAAGAAGCGCTGCAACGCGTGG
+CCGCCAAGCCTGATTTGTCGGCCGATGTGCGCGAGATCGTCTCGCGGGCTTTGGCCGATTGAGGCTCAAACGCGCAATCT
+GACGCACTTCTGACAAAACATGGGTGACAATCCTGTCCCCTGTACCCTTGTTTTGTCCCGTTTATCCCGTCCCTTCTGCT
+GAAGAGCTTTCATGACCCAGCACATCAGTCTGACCC
+>generic652
+CGGAAAACGAGATGTAAAACCCAGGTCCAGCGCCGCAAGAGCCACATCCAGCGTCTCGGTGAAGCAGTGCATCACGCCGC
+CGACCTCGCTGGCTTGCTCGTCTCGCAGGATCTGCAAGGTGTCTGGGGCCGATTGGCGCGTATGCACCACCAAAGGTTTT
+TGCACGGCCCGGGCGGCCCGAATGTGGGTGCGAAAGCGCTCGCGCTGCCAGGCCATGTCGGCCACGCTGCGACCGTTCAA
+GCGGTAGTAATCAAGGCCGGTTTCACCGATAGCCACCACCCGCTCACGGCCTGCGCGCTCCACCAGCTCATCAAAACTCG
+GCTCACGCGCATCGTCGTTGTCGGGATGAACACCCACCGTGGCCCAGAGCAAGCCGGGCTCGCTCACGACCAAGGCATGG
+AGCGCGTCAAAGGCTTCGAGCGAGGTGCCGATGCAGACGAGTGGTGT
+>generic653
+ATCGCATCGACCTTGATGCTCATGTCGTAGTGTTGGCCGTCGTGCTGCCAGTCGAGCGTGGCATCACCCGACAAAAAACC
+GCGCCGCCATTTGAACTTCACCCGCTGTGGCGGTGGGATGCGGGTGGCATAGATCGGTGTAGCCGGTGTGGTGGCCGGCG
+TTGTGGCGACCTGCGGTGCCGGGCTCACCACCGGGCTGAGCAACGCCACAGCGGGCACAGGGGCTGCCGGTGAGGCGGCC
+GAGGCCGGGAGGAGGGCAGCTGCGGCGGCGCTGATCACGGGGGAGCTTTGGCTGGCGGCAGTGGCCGATGGCGGCGTCGC
+TGGCGGGGTGACACGGTGAACGGGTTTGGGCCGTCTGACCGTGGCCGGTACCGGCGTTGTGGCCGGCGTTGGTGCCGCTT
+GGGGCGCCAGCGTGATGACCGAAGTCAGCACGGCGGGGGCGTTGTGGGGCTGGCCGGGGCGGCGGCTTGGGCGGCGGTGT
+TCCAACCGCCAAGCAAGCCGAGGTGCAGCAAGC
+>generic654
+GGCAGCTGGCGCAGGTACTGCCGCTGGGGCCAGTGGTGGCATTTTGAGCACTGTCGGTAGCGCACTTGGATATGGTGGTG
+CAGGCGTTACCGCTGGCACGGTACTTGCTGGTGTTGCAGCTGGTGGTGTCGGCACGATTGCCGGTATGGCTGGGCAATAT
+GCTGGGGATAAGCTTAAAGAAAATGGATATGAAAAGAGTGGCGGTGCTGTAAGTGCTTTAGGCACCGCCGGAAAATATGC
+GGGTATTGGAGCTATGATTGGCTCTGTTATTCCTGTTGCTGGTACTGCTGTTGGTGCTGGCATCGGCGGACTTATCGGTG
+CTGGTAAGGGTCTATACGATAACTGGGGTAGCATAACCGGTAGTAAGTCGAGCGATGCAATGGCTACTGCTGTCGATAAG
+CCAACTACTGATGATAAGCTAAAGAGCGCTGCTACAGATGGCAAGGCAATTAGCCCTGCAGTAGCT
+>generic655
+GCCACGCAAAGCCGACATAGCCCATGTACAGCATGGGCGGGTGCGCCACCATGCCGGGGTCTTGCAGCAAGGGGTTCAGG
+TCATGGCCGTCGGCGGGCACCGGGAACAGGCGATCGAAGGGGTTGGAGGTGAGCAGCATGAAGAGCAGAAAGCCCACGCT
+GACCAGGCCCATGACGGCCAGGATGCGCGCCAGTACCGGCATGGGCAGATGGCGGCTGAACAGGGCCACGGCCACCATCC
+ACACCACCAGCATCTGCACCCACAGCAGGAGCGAGCCTTCATGGCCACCCCAGAAGCCGGCAATGCGGTATTCCAGGGGC
+AGATGGGTGTTGGAATTGGAGGCCACGTAGAGCACCGAGAAGTCGCTGGTGACGAAGGACGTCATCAGGCAGACCGAGGC
+GAACGAGACCAGGACGGGTTTAATAAAACACAAATACCCTTGAAGTTTCGGCACAGCTAAAATTGCACCAGGATGCAAAG
+TAATTTTTCC
+>generic656
+GCGAAATACTCGCTAAAACGAATGGCGTAGGCTTGCTCAATCACGGCAAATGATAGTTCAAAATGACAGATTAACTGCAT
+AATCACCGCACGGCGCAATTTATCATCGTCATTCAAATCCACACCTTTAAACACGGGCAGTTTACCCTGCTTAATCAGCT
+GGTCGTAACTTTCCAAATCTTTGACATTCTGGCTATAGGCATCACCGACCTGCCCTATTGATGTGATGCCCAAGCCGATT
+AAATCACAATCAGAATGTGTCGAGTAACCTTGGAAATTACGGTGTAACAAGCCTTGTCGTTGCGCAATAGCGAGTTCATC
+ATCGGGTTTCGCAAAGTGATCCATGCCAATATACACATAACCTGCGTCGCTTAAACGCTGCCCGACACTTTGTAAAATCG
+CCAGTTTAACTTCGGGACTGGGTAAATCAGCATCATTGATTTGCCGCTGGGTTTTAAAG
+>generic657
+CCTAAACGGTCAAATAAATCAAACGTTTGATCCACAACCCATTCAGGGCGTGCGCTGGGGCGGTCAACTTTGTTAATCAC
+CACGATAGGTTTTAAGCCTAAGGCGAAAGCTTTTTGGGTCACAAAGCGGGTTTGTGGCATGGGGCCGTCAACTGCGTCAA
+CCAGTAATAATACTGAGTCCACCATCGACAAAACCCGTTCTACTTCGCCACCGAAGTCGGCGTGTCCTGGGGTGTCAACG
+ATGTTGATGTGGTAGCCGTTCCAGTCAATCGCGGCGTTTTTTGCCAAAATGGTGATGCCGCGTTCTTTTCCTGGTCGTTG
+GAGTCCATCATCCGCACGCCGAGTTTTTCGTGTGCTTCAAAGGTGCCGGATTGTTCCAACAGTTTGTCAACGAGGGTGGT
+TTTGCCATGGTCAACGTGGGCGATGATGGCGATGTTTCTAGTTTTTCAATCACAGTGTAGTTTTTAAGTTAAAGGTTAAA
+AGTAAATTATTGTGCGCCATTAATATGACGGCTTGTTTAAGGGGAAAGAGTTTCACAGAAACTAAAGAAGTTTTTTACGA
+GTGGTGT
+>generic658
+ATCGGCCTGCCCGACGAGCCCGCGAAGCTCGCGGCGGCGCTGCACAAGGCCAGCGACGTCGCAGGCAAGCTGGCGGGCGA
+CAAGCTGACGGCCGATTTCAGCAAGCTGGCGGAAGCGTACTCGGAACACGCGGACAGCGCCGGCAAGGGCGGCGACATGG
+GCTTCCTGGCAGACAACCAGCTCGCGCCCGAAGTGCTGGCCGCCGTGCGCGCGCTCAAGCCCGGCGAGACCGCTGGCCCC
+GTGCGCACGGCGCAGGGCCTGCATTCCTCAAGCTGCTCGATCGCAAGGCCGGCGCGGCGCTCGGCTACGCCGGGGCGCAC
+GACGCCCTGGCCGCGGCGCTCCGCACACGTCGCGCGAACCGAGCTCTCGCAGGCGTACCTCGCCGGCCTCGACAAGCGGC
+TCGGCATCAGCGTGAACCAGATTGCGCTGGCCAAGCTGCAGGAAGACAT
+>generic659
+CAGCGTTGCTAGCGTGTTGCTGATCACTGCCACGTGGCTTGTCGGTTGCAGTGGTGGTAACGGTGGTAACGGCGGCAATC
+CCTATCCGTCCACCGGACCAGCGTTGGTCACCGCACCCGCTGGAGCGAGTTTTCGCCCGACCTTGTTTCGGCCTGAGCCG
+CCGACGCTGCAAAGCATGTGCGCGGCTACGCCGGTCACAGGGGCGAATGCCACGCTGGCACGCGTCTGGTTGGCCCAGAC
+CCATCTGATGGAGCCGGGCTGGGCGTTTTGGAACTTGGTGCAAGACCGGGGCGTCTNTCAAGTACGNTGTGAGTGCGCCG
+ACGTGCGCCGA
+>generic660
+GCTCGTCGAGCTTGCCCTGGGGGCGAGGTATCGCCCGGCGCTCAGGATCACGCCGTCGCCGCGGATGATGAACGCGCCGT
+CGATCGCCGAGAACTCCTTGATCGTCTCCTCCAGGCGGGGGTCGAGCACGTTCCGCTCGACCTCGGGGTAGCCGTGGAAC
+GGATTGATCACGAGCTGGTGGCTCTGCGACAGGACCCGGTCGGAGTCGCCCACGACGAACAGGGTGCCCACCGGACGCCC
+CTCGCGTCCTTCCAGGCCGAGCTCGGTCGAGAGGCACAGGAGGCGCTCGAAGACGGTGGGCTTGACGTCGCCGGGGAGGG
+GGTCGGCCGTGGTGGCGGCGAACATCTCGATCTCGGTCCCCAGGTCGAGCACGAAGATCGCGTCGAGCGTCCCCGAGCCG
+TCGATGCCCGTCAGGCAGACGATCCGGTCGCCCGACCGCAGGAGCGACTCGGCGGCGGCGACCAGGA
+>generic661
+CTGGACACCATCGCCCCGGCTGCGCCCATCGTCGCCTTGGCCAACGGTGCCACCACCTTCACCAACAGCGCCGCCCTCAG
+CCCTATCACGCCTGAGTTGAATGCCACGCTGGCCTACAGCGTCGATAACGGCCCATGGTTGTCCACCTACACGGCACCGA
+CCGCCAACACAACCCACACCGTGGCGGTGCATCAAACCGACTTGGCCGGCAACGTCTCCGCCCCAGGGTCGATCACATTC
+ACCCTCGATAACCTCGCCCCGGCCCTGACCTCGGTCGCCTTGGCCTACACCCCGGCCTTCGCCCGGCGGTGGCCGGTACC
+TTCGGCCGCCGAACGTCGTCGTTGGCCGCCAGCAGCGCAGCGGGTGACGACGCTCAGCCTGACGATCCCCGGCGGCCCGG
+TCATCGCGCCCATCGTCCTCAGCGCCGCCGACATCGCGCTCGGCTCGGTGGTCGTGCCTGT
+>generic662
+ATCGTTCTTGCCTTCAAAACAAACCGTCGATGTTTTGCGGCAGCGAATCAACCACAGACTCTTCGGACACGCCCGCAACC
+ATTCTACGGCATCGCCTTCACGGTCAACGATATGGACTGGCTGTTTGTCGATGGGCTGCTTTTTCAACCACTGCACGCGC
+TGGGCAAGTTCTGCTGTCATGATTCCAATAGTTCAACACACTCCAATCATGCACGATCAGCGCGTCATCCGTACAGTACG
+CCGCAACACCCGCGCAACTCGCCGACACCAACAGCTCTGACACAAACTCAGCGTTGTTTTCTCATGCGCATAAAAACGCC
+ACGCCGCCTGTGTCGCCGCAAAACTGCTTGCCGTCCCAAGCTTGCCCTGACTGACTCGCTGTCGCCAACTGTGGGCTTCA
+ATTTTAGGTGCGATTCAACCAACATTTGGACTCTCGTTTGATGGCGTTTTTCCAACGCGGATAAATGAGTGTTTTTTCA
+>generic663
+CACTGCTTAGCCTGCCACCCCGCACGCAGGCCGTGCTCGAGTTCTTCTTCACGAGCACCGGCCGCAATAGTTTCGTTCCA
+AGCCAAGAGAGCATGGCCGATGCGGCTGTGTTTGATGTCGATACCCAGGAGTCGATGCAGCGATGGCATGATTTTCATGC
+GCGAACAGCCAAACCCGGCATTGCACTGTCGGTGACGCCTCATCAAATCGATGGTGCTGTTTGGGTGCAAAAACCGGTGA
+CACCGGCCGCATTGTTGGCTGCTTCGGCGGCCTTGAATGCAGGCAAGTGGCATCGGGCGGCACCGCCAGCGCCTCCGGTC
+GTGGTCGAGGCACCTCCGCCTCGGGCTGTTGCTCCGGTTCCGCCGGATGAGCCGTTGGTGCAGATCGAAACTCGGCGTGA
+ATCCGCAGCCCCTACGCCAACGGTTCAAGTCGAGACGGCTCGTGCCACTGTCCGACCTGACTTCGGTGGTCTTGTTCGGC
+AAG
+>generic664
+GCGTGGGGTGAGGCTGGTTGATGCTGTCGCGCACACTGAGGTTGATGCTTTGACCCACGGCGCTGGGGGTGAGCAGCGGG
+AAGGCTCCGGCGGCTTGCATCGCGCTGGTGGGGACGCCGTTGATGCTTTCCAGCACCATACCGCGCTGCAAGCCAGCGGC
+TTCGGCCGGGGAGTGGGGCGCGATGTAGCGGATGCGGATGGGGCTCGGTCTTCGGCCGCCCGGACCACCGTCACGCCGTA
+CGTTCAGAGTCTGG
+>generic665
+CGCACGGTTGCCGAGCCAGTGATGTACCCGGCCCTGTGCCGCAGCGCGGCTGTAGGCGAGCTGCCACAGCCGGTCGCGCG
+CGGTGACCCAGCCCCATGCGCAGTAGAGATCCGGCAGGTTCGCCGCGCGGATGTGAGGCACGCCCCAGGCGTCCGTCACG
+ACCCGCACTTCGGCCGACAGCCCCGGGAGCCGCGGCGAGACCGTCGCGCGAGCGCGGGGCGGGCGTCCACGAGCGAGGCG
+AGCAGGACGGCGCAGGCGATGAGCGGCAGGCGGAGTTTCACGGCGGCACTCTCGCACCGGCCGCCGCGGCTCGTCC
+>generic666
+CGCCCTCGCCCCGGGCAACACCGCGGCCAAGGCCGCCGTCGACATCGCCCTGCACGACTGGATCGGCAAAAAGCTCGGCA
+CCCCATGGCACCGGATCTGGGGCCTCGACCCCGCGAAGGCCCCGGTCACCTCCTTCACCATCGGCCTCGATACCGCCGAG
+ATCGTCCGCCAGAAGACCCGCGAGGCCGCGCCCTACAAGATCATCAAGGTGAAGCTCGGCCGCGACACTGACCGCATGAT
+GATCGAGACGATCCGCTCCGTGACGGACACCCCTATCACCGTCGACGCCAACCAGGGCTGGACCGACCGGGCCGACGCGC
+TGAAAAAGATCGAGTGGCTCGCCACCCAGGGCGTGCTCTTCATCGAGCAGCCGATGCCGAAGGCCCAACTGGACGACACC
+GCCTGGCTCCGGGAGAAAAGCCCGCTGCCGCTCATCGCCGACGAGAGCTGCCAGCGCCTTGCCGACGTGGCGCGCCTGCG
+CGGGGTTTTTGAC
+>generic667
+ATCGACTGTCACCAGTGAGTGTTGCTTCCCGGGGGCGCGCCGCGACCGGCGGGGCCCGGATTGATGCGATGGGGGATAAA
+GGTATGTTGCGCAAGACCAGCCTCACGGTGTGTGCTGTACTCGTCCTCGCGCTGCCGCTGGTCCTGATCCTGGGCGCGAC
+AGCGGTCCAAGCCGCCCACCCCACCGCATTGTCGACACCGGCCACCACGCAGCCGATGAACTGCTCCGACTGCCACAACC
+TCTCCGGCGACCCGGCGGTCGGCTACGAGCCGAATACGTACTGGATCAACCGCAACAGCCGCACGCTGATGAACATGAAG
+TTGCTCAACGGCGGCAACGCACCGGCGACCTTCGCCTGCACCTACTGCCACAACGACGCGACCCGCACCTCGAACATGAA
+GGACGCTCTGAGCGACTTCGCGAG
+>generic668
+CCTTCGTGCAAGCGCACCCGACCGGCCACCGGGGCCGATTCATAGATGTAGTCGCCCAAGAAAAGACACCAAGTCGAGGT
+CTTCTTCGGCCACATGACGCCAAGCGGCGTAGTGGCCGTGGTCCCAGCGCTGGCAAGAAGCGATGACGAAGTCCAACTCA
+GCCCGGGCGTCCGGCGCAGGGGCGGTGCGTGTGCGCCCGACCGGACTGGTCTGCCCCAAAGCATGAAAGCGATAAAAGTA
+CCAGCGCCCCGGAGCCAGCCCTCGGGGTTCGGCGTGGATGCTGTGCGCCCAAGCGGCGATGGCGTTGTCGATACCGTGGG
+CCACGCGCTGCTTGAAGGCCTCATCGGTGGCCACTTCCCACTCCACTTCGACCGCTGGCGGTAGCGCATCGCCCATCACG
+CGGGTCCAAAGCACGAGTCGATCCGGACGCGGGCTGCCCGAGGCCACGCCTAAAGCGAAAGTGATCGGTTTCGTTGTCCC
+CCCACA
+>generic669
+AGAATAATCTTTCACGGCTTTAAAATTGTTTTCGGTGTAATTCCGTGTTCCGTGTTAAACAACGTTTGTTTTCGCGCCGT
+CTTTGCGTTTCTTCTATAGCTAATGCCATCGAGTTGGTAATTTTGTCACCGTATAAAATTGCCTTGCCGCTGACATTTCG
+CGCTGCTCTTCCGATGGTTGCACCAACGACACTAACGAGCGCAAAAATCCTTCCTTGTCAGCATCCAGAATGGCAACTAA
+TGAAACTTCGGGAATATCCAAACCTTCGCGCAGCAGGTTAATCCCTACCAGCACATCAAAGATTCCCAAGCGCAAATCGC
+GGATAATTTCCACCCGTTCCACCGTATCCACGT
+>generic670
+CGGCGGAGTGACCTTCGGCGCGGCAGAAGAAAACGACAAAGGTAGTTCTTTTTGTTGGAAGACACGGGGATCGGGGTCCC
+GGCAAAACATCTCGCACGGCTGGGGGAACGGGTTCTATCGTGTGGACGCCGGCAGATCACGGAACATGGGTGGCACAGGG
+CTCGGCCTTGCAATCGTCAAACATCTGGTCAAGGCCCATGGCTGGGACATGCGCATCGAGAGCGCGCCGGGTAAAGGGAC
+AAAGGTCAGAATTTTTGTAACATAAGCTATTGCCACCTGTAAGCGAGACCCAAGAAAGCGGCCCGGTCGCTGCAGGGATC
+ATGAAAAAGATTAAAGGTTAGTGTATTGCCGCGAATGACGTATGTATAAGAGCCGCTCACGACTTGCCCGGTAGTGCTAT
+CAACGCAAGAATAGCGGCCAGCGGAATCGTCGGTTACTATAATCACATTACCGCTCACCTTAACACTTCCCAAAACAACC
+GGAATGTCATCTTGGTTGAAATCACGCGCATACGTATTGTCTGAACGA
+>generic671
+GTCGGTGAGGTAGAGCGTCATCAACGGCTCGAACGTCAGGCCCGCCGGCAAAGCCGCCAGGATACGCTCGCGATAGGCTG
+CTGCCAGAGCAGTGGTGGTGACCGGCGGGCGCAGGTTGGGCATGACGATGGCACGACCGAAACGGCGCGCGGTATCGGGC
+AACACTGCCTGCAGGGCATCGCCGTCCCGCAGGTGCAGGTGCCAATCGTCGGGGCGGGTGATGGTGAGCTTATCCATTCG
+ATTTCAATTCCAGAGCCAGTTCATAGAGCGCATTCTTTTTTGCGCCGGTGATATCGGTCGCCAATTTTACCGCCTGTTTC
+AGTGGCAGTTCATCCAGCAGCAGTTTCAATATCTGCTGGGCGTCTTCATCGACCTCGTTTTGTGGTGATGGGGGCGCACC
+GTCCACCAGCAACACGAATTCGCCGCGCTGCTGGTTGGGATCGGCCTGCAGCCAGTCAACCGCATCCCCCAAAGCACAA
+>generic672
+GTCGCTGTCTTCCAGGCCAACGTCCGGCAGATCACCCAGGGTGCTGGCGGCCGGATCAAGCTCCAAGGCGATGCGACCGT
+TCGACTTGATGCTCTTGAGGCGGTTGATCTGGGCTTTGCGCGCTTCGAGGTGGGCGGTGCGCAGTTGCAAGGCCGTTTGT
+ACATCGCTGGTCACCAAGTTGGCGGCTTGGTCAGCGCCGGCACTGGCGAGCTGGTTCTCAAGCCGGTTCACGGCTTCGTT
+CAGGGCCGCTTGCTGGGCCAGCCGGGTCGAAGCCCGATTGAACTCGGTACCGAACACATAGGCTTGGGGCGTGAGGCCGC
+CGATACGGTGGATCAGGCCGCGCAACGATTCACCGGGGCTTACTTGGTAGACCCCCGGGGCTTGCACTTCCCCTTCAACC
+CGCACCAAGCGCGTCCGGCGACTGACCGGGTTGCTGACATCGTTGATGCCAAAAATGGTGACCACATCGCCGGGCAGCAG
+CACCAAATCGTGCTCGGGATCGTACGAGT
+>generic673
+TTCCTGTTCGGTCTGTGTGCCTGTCCACATGGCTTTGTTGAAGCGTTTGATGTGTACGCCGTACATGTGCCAGATGATGA
+TGGCGAGCACCGCCAGAACGGCTTCGCCTCCGTGCGCAGCTTTGGCGGCGGGGATGAATTGGCCCGGCAGGTATTTTGTG
+GCGGTAATGGGGTTCCACATGAGGAAGCCTGTAGCGCCCATTACAGCGGCTCCCCATACAAATGCCCAATACTCCATTTT
+TTCTTCAAAGGTGTAGCGTCCCATTTGGGGATAGGCTTTTGCAAAGCCAATATTGTAAAGCAGGGCTTGTATGCCATCTT
+TCGCATCCTGTAAGGATGGGAGCATGGACATTTGATCACGCAGGACAAATACGCTGTATCCCATGACGAGGATGTGCCAG
+GCTGTGCCAAACATCATGACGATGGCGGCAGTGTGGTGAATAAGGCGCAGGGTTCTCAATCCCCCCCAACACATTAAGAA
+CGAAGGC
+>generic674
+GCTTTCTACCAGTGCGTGGGCAATGTCGGTGCTTGAGAGGTTGCGCGAGCCCGACTCCATAGCCTGGCGGATACGTGCCT
+GGTAGCTGCGTGCTGGTGATATTTGTTGCGCCAGTCGGTCGCGAAACAACCGTTGCAGCGCCGTGAAGCCGTCAAACCCG
+AAGTGCTTGGCAAACCGCACCACCGCCGAGGGCTGCACACCGCAGGTTTTGGCAACGTCTTGCACGGACTGAATGCCAAT
+GTGCGAGCGGTGCCGCTCTACATGACTGGCAATCAACTTGAGCTGGCGGCTTAAGTGGTCAAAGTCGCGCGCAATGGCCT
+GCAACAAAGCGTCTTCCGAAGCGGGCGGGGTGACAGGCAGGTTGACTGGGGGAGGTGCAGCGGCCATGGNGTTTAGAAAA
+AATATGCTGAATAAATTATAAACAGAATATTTTTTCTAAACAACCGTTGTTTCAAAGTTTTCCCTTGCGCAGGGGTACAC
+GCAGGCGGCGTCGGGCCTAGTC
+>generic675
+GCTGAAGCCCTCCGAGTTCACGCCGCTGTGCGCGGTGCAGCTGTGCGAAGCATTGCTCGAGGCCGGGCTTCCGCCGCGCA
+TGCTGTCGCTCGTTCACGGCCCGGGACCGACGGTGGGGCGCCAATTGCTGGCCGACCCGCGCATCGCCTTCTACACGTTC
+ACCGGCAGCACCCGCGTCGGCCGCGAGATCCAGCAGGCCGCCGGCCTGCGCGGGACACAACTCGAGCTCGGCAGCATCGC
+CAGCACGATCGTCTGTCACGACGCTGCGCTCGACATCGCGCTGCCCAGATCGTCGGCGCGTCGTTCCGCAAGGCCGGCCA
+GGTCCTGCACGTCGATCCAGCGCGTC
+>generic676
+TGCAGGGGTATTTAGTCGCCGATTGACCCAAGGTATGATGCTACAAACGGATCCGACGGTTATTTATGGCATGGGTGATA
+GTTATCAAGGCAATATTCGTTCACAAGATTTACACACAGAAACACCATACAACACTTATAAAATCAAAGGCTTGCCACCC
+ACACCGATTGCTATGCCTGGCCGTGAAGCGATTTATGCCGCGCTCCATCCAGATCAAAGCAATAATAGTATTTATTTGTG
+TCACGCGGTGATGGCACGCACGTTTTTTCTAGCACCTTAGACCAACACAACCAAGCAGTGAACCAATTTCAAAGGCAAAA
+ACCATGAGTCGCGGCAAATTTATCACCTTAGAAGGTGGCGAAGGCGTAGGCAAAACCACCAACCTAAGTTTTATTAACGA
+GTATTTACAGCAACA
+>generic677
+GCGCTGTTGACATAGGCAAAGGCACTGATGTTGAGGCCCGCCACACCACTGAGGGTGGTGATCGGCAGCGCGGCACCTGC
+GCCGTTGCCATCGGCATCCCACGACAAGAGGCCGGTGGTGGTATCAAACAGCAGCACCGTGGTGGCACTGGTGGCCACGG
+CACCCGCTGCACTCACCAACTGGTTGGCGTTGGGTGCAAGGCCATTCAGTGCCGTAAAGACGGCCGTATCCAACACCAAA
+TGGTCTGTGCCCGCCACAAAGTCGGTCACGGTGTCGGCGTTGGCCACTGAAGGGGCGGTATTGAACACAAACTGATCAGC
+ACCCGCGCCACCCGTCAAGGTGTCGTGGCCCAGCCCGCCGCCAAGCGCGTTGTTGGCGGCATTGCCCACCAAAACGTTGT
+CCAGCTCATTGCCTGCGCCATTGATCGTCGAGGCCTTGGCCAGAATCTGGCTCTGGATCTGGGCCGCCAACGTTACGCCC
+GCTGCCAAGGTC
+>generic678
+CACGCCGGGCATATTTTTAAGCATTAATTGAGCATCCAACGACTCAAAACACACGCCACCGGCGGTACTAATCGCCTCAT
+CTATCGGGCGAGTGGCGATTAACGTGATTGGCAAGGCTTTAATCGCTACAGCCAACACTTCAGAATTGGAAAATTCTGTG
+GCGGATAAAAATTCACGCAATAATCCGGCTTTCACCCCCTCAATTCCGGTTCGGCTGCGCAAATGATTCGCCAGCGATTT
+AGAGCCACGCGGCTTTGCCAATTCCTGCGTCAATCGAGCCAGATTTTATCAGGCGCAAGGTCAAGATAAACAGTGACCGT
+GCCGTTGGTATTGAGCGTATCGCGCAACGGTGCAGACAAGGCATAAATCAAACTGCCTTCCACGCCGGTTGCGGTGAGCA
+TCAACTCGCCCAGTTTTTGATAGTTTCTTCCGCTGGTATCGGTAAAAGAGAGGGCAATGGATTTTAACGGTTGTGCGGCA
+AAACGGGCGCGAAAACAATCACTCCAAGCGACATC
+>generic679
+GCCGAATCGGTGGGCAATGAGTTTGTGACCGACACCGGCTACAACGCTTGGGCCGACACCAACCACCTCTTGGTGCTCTA
+CCCGCAGGTCAACAAATCCTCCATGCCCTTCAACCCCAAGGCTGCTGGGACTGGTTCGGCTACACCGGCACCAACTACGC
+CACCAAGTCCAGCATGCAGATGCTGGCCATCAAGTCGATGGTGACGGCGCTGGGGAAGAAGAAATAAGCCGCTGCCGGGT
+CAGACTTGGGTGTCTGACCCGACGTCTTCATCCAAAGCGAGCTCGCTGCCAACCTTGTCCCAAGCTGCTTGGCCCAAACC
+ATCCACGTCGTAGGTGGTTTGGGCGCGGCCGTCGTGAGTTTGAAGGGCGATCACCAATAACGATGCGCTATGGCGCAGCA
+AGGTGTCGCAATTCACTTTTGAGTCTGCCCTGTGATCGACTTGGAACAGCGAGATCACGGAGAACTC
+>generic680
+GTCGCCCGCTGGAAACGTTGCTGGCCACCTGGGGCATCAGTTTGATGCTGATGCAAGGCGTGCGCAGTTTGTTTGGTGCG
+CAAAACGTGGCGGTCGAGAACCCGAGTTGGCTCTCGGGCGGCGTACACGTGCTGAGCAATCTGACGCTGCCCTACAACCG
+CTTGGCCATCATCGCCTTTGCTTTCTTGGTGCTGGGCGGCGTGGCGCTGATGATCGCCAAAACCCGCTTGGGCCTTTTTG
+TGCGCGGCGTGACTCAAAACCGCCGCATGGCCGCCTGTGTGGGCATCCCCACCGCCCGCATCGATACCTACGCCTTCAGC
+TTAGGGGCCGGGATCGCGGGCTTGGCAGGCTGTGCTTTGAGTCAGATCGGCAACGTTGGGCCGGACTTGGGTCAGAGCTA
+CATCGTTGACGCTTTCATGGTGGTGGTCACGGGCGGCGTGGGGCAGTTGGCTGGCACGGTCTACGCCGCACTGGGCTTGG
+GCGTGCTGAA
+>generic681
+GACGCGGGACCTTGGGTTACCCACGCTCGATGCAATGTTCCCGCTCGACGCGATGTACCAGATCGCGAGCTGTGCGCAGT
+TCGTAGACGGAGCCTTCTTCAAGCTCGATTCAACACCAGTCGATCTCGGGCAGCCCGTCACTCTCAACGGGGACCAACAC
+GTCAATCGCGTGCTCTTTCAGATGAACAACACGCATCGACCAGACTTTCCCAACCCGGAAGTCACGGTGCATGTGAACAT
+CTACAAGAACGGCGTGTTCTACGACACTGTGAGTGTCACGTTGTTCTCGGGGAACGGTTGGGAGAAGCAGTACGCCACAG
+GTGCGCCGGCTGGTCCTTACGACTTTCCTGATGGCTCCGTGATTCGAATCACAATCGATGCTCCTGTGGCTCTTCGCTTC
+TTCGGTGCGTCATTTCTTGTGGCACTGGGAACGTCGACGCCGTGGGTCTATGATAACGAGTGGTGT
+>generic682
+GCTGGCTTCCCATTGCCTGCGGAACAGGCTGATTCCGTCGGCCATCCAGCGCTGGACTTCGTTGAGCACGCTGGACAACG
+TGAACTCTTCCAGATTGGCTCGTAGCGATTCCAGGACACTCACGATCACGCTGCGGCGATGGGCGCCTGCCGACGTCTTG
+CTGGTCCGGCCGGCTTCCCGGTCCTGGGCCGGACTGCGTTGCAGTCGCTCCGTGAGGTTGTTCGTAGATTCCACTCCCGG
+CACCAGCACAAACGTGAACAACTCCTCATCTAACATCCGTTCCACCAGTTCGTTCAGGAGGTTGAAGAAGTCTCCCTCGT
+GCGGTTTCATCTCCGCCGGCGTCTGGTCCAAGTAGGTCTGGCATAGTTCACAGAGTCGATCTTCCAGTTGCTTCACCCGC
+TGCTGCCGCCCCGCCGCGCTCAACCGCCCATCGGCGGCCACTCGCTTCGCGTCGTAGTACAATTCCAGGATCC
+>generic683
+CGGACACCGCGCTGAACTTCATCTTGATCATCGGCTCGATCACGGCGCTCTTCATGGGCTTTCTGGGCATCATCCAGACT
+GACATCAAGCGCGTGGTGGCGTACTCGACGCTCTCGCAGCTCGGCTACATGACCGTGGCACTGGGGGCTTCGGCCTACTC
+GGTGGCGGTGTTCCACCTGATGACGCACGCGTTTTTCAAGGCGTTGCTGTTCTTGGGCGCGGGCTCGGTGATCATCGGTA
+TGCACCACGATCAAGACATCCGCAACATGGGCGGCCTGCGTAAGTACATGCCCATCACGTGGATCACCTCCTTGGTGGGT
+TCGCTCGCGTTGATCGGCACACCATTCTTCTCGGGTTTTTACTCGAAGGATTCGATCATCGAAGCCGTCCACGCCAGCCA
+TCTGCCGGCTGCGCCTTGGGCCTATGCGGCGGTGGTGATCGGCGTGTTGTCACGGCCTTCTACTCGTTCCGCA
+>generic684
+GCGGCAAAACCGCCGCCGCTTTGGCCATCGCCCGTGACTTGGCATCAAAAAATCAGCCGGTGGAGCTGATCAGCGTGGAC
+TCAGCCTTGGTCTATCGCGGCATGGACATCGGCACCGCCAAACCCAGTCGCGCTGAGCAAGCCGAAGTCCCGCACCACCT
+GATCGACATCCGCGATCCGCTGGAGAGCTATTCCGCCGCTGAATTTGCGAGCAATGCCGCCAGCCTGATCGCGGCCATCC
+ACGCCCGAGGTGCGCTGCCGGTGTTGGTCGGCGGCACCATGCTCTACCTCAAAGCGCTGTTGGAAGGCATCGACCCCCTG
+CCCGCTGCCGATGCAGCGATTCGCGCCGACCTTGATCAGCGCGCCGCCGCCCTGGGTTGGCCCGCGCTACACGCCGAATT
+GGCACGCATCGACCCGATGAGCGCCGCCCGCCTTGCACCCAACGACG
+>generic685
+GAACGCTTTGGCGCGAACGCGATTCGGCATTACATCATCAGCCACACCGAGAGCGTGAGCGATTTATTGGAAGTGCTGCT
+GCTGCAAAAAGAAGTGGGTTTGGTGCGTTACGAAAGCCCTGCGCCGCGCTGCGATTTAATCGTCGTTCCATTGTTTGAAA
+CGATTGAAGATTTGCGCAACGCCGCCCCCATCATGCGCGATTTTTACGCCATACCGGGGATTCTCTCTTTGGTACAAGCC
+AGCGGTGGCGAGCAAGACATCATGCTGGGCTACTCGGACAGCAATAAAGACGGCGGCATTTTCACCAGCAACTGGGAACT
+GTACCGTGCAGAAATCGCACTCGTCGAATTGTTCGATTCGCTGCCCCAACCGGTGCGGCTGCGGATGTTCCACGGGCGCG
+GCGGCACCGTCGGCGCGGCGGCGGGCCAAGCTATGAAGCGATTTGGC
+>generic686
+GCCGCCATCGACATCGGTGCTAACCAGTTGGTTGCGGCTCGGGTGATTGCATACAGTCCCGCACACCGCCTGCCGCTGGA
+CGACGTGAAAGACCAGCTGCGCGAACGCGTGTTGAATCACAAGGCTGCGCTGGAAGCCTCACGCGAAGGTCAAGCCAAGC
+TCAAGCAGTGGCTTGGCGGCGATTTGCGCGATGAATCTTCGGCGCTGGCAGCGACCGAACTAGTGTCACGCGCTGCGCCT
+CAAGGCAAACCATCCGTCTCGCGGGACTTGGTAGACGCGGCGCTGCGTGTTCCGGCCAGCGCCCTGCCTGCTTGGACAGG
+CGTGCAATTAGCCTCAGGCGGCTACGCCGTGGTCAAAGTGCTGAAGGTCTTGCCCGCCGATGTCGCGCTGGTCGGCGCAC
+CCGCCCAAGCCCAAAGCCAATACGCGCGCTTGTGGGGGGCGA
+>generic687
+GCGCCGTTGCAGAAGCACAGGCTTTAAAACAAAACTCTCCCTCGATACTCCCTTCCATCCAGGGTTCTTGCTTACCTTTT
+GACGCGGCTTTTACTTCGCTTACCACTGTTTTTAAAACCAACTCAATCGGTTGATTGCTCTCAAACTGCTTCAGCAATTT
+GCTGGTATAAAGTCCATTATGCCCTTCCCCGTCTGCTGCCACACTACCAGGTCGGGTAGCGTATGAAATCAACGTTCCTG
+ACGGCGCAACTACCCGCGCTAGACCTCGTGCAGCCGAGCGAAAACTTCGCGCGTAGGGATTATCGCGGCAAGCATCCAGA
+AACACCAAATTCAAGCCAGATTTGGAATCTTCCAGTACATCCATAATCTGCTTAACGGAAATGCTTTGATTGGGACATCT
+ATTTCAGAACTAATTTCAGCATCAACCGCCGGAAAATAATTTTCGCCCTTAATCTGCAAACCATGACCGGCATAAAATAC
+CAACGCCACCGAACCGGGCTTAAGTTTGCTGCTGAATTCCTTCAGTATTG
+>generic688
+ACGGATATCCAGGGCCACAGCCCCTGCGGCCATCAGAGCATCGACCTGATCGGGCTGGACTTCCTCGACTTGGGCACGAG
+CGCGGTCGGCGAGCTGCTGGAATTTGGAGGTGTAGTTCATAAATACGGCGAGTGTAGGGTTGAAAGGTCGGTACCCTACA
+CCGTATTCGGGGCAGATGCCTGCGGGGCGGGGTAACCCTGGCGGGTTCCGGGGGCGATCAGTAGTGGTAACGCAACTGGG
+CGATCAGCAGCGCATCGCCCTCGACCCGGTAAACCATCCGGTGCTCGTCGGTGATACGGCGCGACCAGTAGCCGGCCAGA
+GCATGCTTGAGCGGTTCGGGCTTGCCGACACCGGCGAACGGCTCCCGCTGCACTTCCTTGATCAACTTGTTGATGCGCTC
+AACCATGCGCCGGTCCTGCTGTTGCCAAAACACGTAGTCCGCCCAGGCGGTATCCGCAAAGATCAACTTCATTCGGCCAG
+CTCGCGGGGTGTGCCGTGGCCGGTGTTC
+>generic689
+GTCGGGCCGATGTCGGTAGCGCTCTATCGAGGCGGCTTCTTCGTGGTCGGGCTCGTGGCCGTCGGAGTGGTCGCGGCGGC
+CTCGGTCACGGGTACGGCGTTCTCCCGTGCCCTCTCGGTGCAGCCGCTGAAGTACCTCGGCGAGAGGTCGTACGGCCTCT
+ACCTCTGGCACTGGCCCATCTTCATGGTGCTACGACCAGGCATCGATCTGGACGCCGACGGTCTTCAGGTGCAGGTCCTC
+CGTTTTGCTCTGACGTTCGCTGCCGCCGAGCTCTCCTACCGATTCGTCGAGATGCCGATCCGTCGCGGTGCCCTTGGGCG
+CACGTGGGCGCGGTGGCGCGAGAGCGGCCGTTCTGGTCAGTTCGCGCGGGTCGGCGTGGCCTCGGCGACTGCCGTCGCCG
+TCGTCCTCGCCCTCGGTGTGGGACTGAGCTCGGCCACCGAGCCCACGTTGCAGGATCAGCACGAGTGGTGT
+>generic690
+GCGGACGATCTCACTGTTGGCCTGCGCGCCCGCTTCAATGCAGCCGACCCAGGAAGGAAATGTCGATCTCGATCTTTTGG
+TGGCATACATGCCGGGTCGCTACGGTGTCTGCAGCCTCGTTGACCTCCTACCTCACCGAACCGGCCTCTCGAAGGACCAG
+ACTGCAGCCCTCGACGACCGAGTGCTCCAAATCGCAGATAAATTGAAGACCCGCGTGTTCCGGTCCTCCGTCGACATGGA
+CACCCTCTACGATGATGTCAAGTCACGAGAGCCGNGAACCCAAGGGGCCGACTTCTCAACCCGTGTCTCGATTGCCTCGA
+AGCTGGTGGCCTTCACGAAGGGGCGGCCCGAACTCCTCAACTTCGTTCGTCTTCGGATCCGACGAGCGCCGACGCCCAGA
+CATCCTCCTGACACCGCGCGCCGGAAAGAAGGTTTCCAAGGGTTTCTACGCTCACGGGCGAAATCCGTCCCAGACAATGT
+TGTCCTACTTGCATCGAGTCTCTGGTC
+>generic691
+CCCTGCCATGCGTTTTTCCAGTTCTACGTGGCAGACGGCAAACTCTCCTGCCAGCTCTATCAGCGTAGCGCCGATATTTT
+TTGGGCGTGCCGCTCAACATCGCCAGCTACGCCTTGCTGACCCTGATGATGGCGCAGGTCTGCGGCCTCGAAGCCGGCGA
+TTTCGTGCATACCTTTGGCGATGCACACCTGTACCTCAATCATCTGGAACAGACACAACTGCAACTGTCCCGCGAACCAC
+ACGCGCTTGCCAACGCTGTGCATCAACCCTGAAGTCAAAGACATCCTCGGCTTCAAATATGAGGACTTCACTCCTGGAAG
+GCTACGATTCACATCCGGCGATTAAAGCCCCCGTTGCCGTATGAACAGCCTTTCCATCATTGTCGCCATGGCGAAGAACC
+GCACCATCGGCGTGAACAACACGCTGCCGTGGCGCTGCCCAGAGGACTTGAAGCACTTCAAGGCGCTGACCC
+>generic692
+GCGAGGACGACGCGCTTGATGGCTTGTGACATGGTCAGTTTTCTAGGAAGGAGAGAAAGAAATCGGAGCAGATTGTAGGT
+GCGCAAGGCCCCTAGTTGGCTTGATGCGCCTCGCTGGGCACACGCACCACCGTGACAGTGCAGTCGGCCTTGGCCACCAC
+CTGAGAAGACACACTGCCAAGATAGCGCCGCAGTGCCGAGTTGCCCCGCGCACCCATGACAATGTGGTCGATGTGGTTGC
+GCTGGGCAAAATCGACCAAAGCGGTCGCAGCATCAGGGGCTTCGAGCACATGAAAGGTGAGTCGGCCCTCGGTCAGATCC
+AAAGCCCGCTCCAGCGGACGCGCCCAGTGTTTGAGCCCCACCAGCTGCTTGACATGCACACTTTGGCCTTGGGCATCGGT
+CAGTTCGTCGATACCGATGCGGGCCGTCTTCATCACACTGACACAGGCCAAACGAGCGCCTTTTTC
+>generic693
+AAATGGGGACTTTATTGGCCGTACGACACGAGTGGCGGATTTACCAAAGCGGCCACTCCGTAACGAGCCGAAAATAGCAA
+CGAAATTCCGGCGGCCGGCATCAACGAAGACGCGGCTCTCAGGGATGCGGCATCAATCGCATCGCGGTCAGGATCACGCC
+CACGGCGACGAACATCATACCGCCCAATTTGATGATCATGTCCCGGCGCAGCAGTTCGAGCATCCCGGTCAGCCGGGCTT
+CCAGCGCAGCCAAATCGCGTTTCAACTCTGTCATATCGTTCTTCGTCGCGAGGTCGGCCCCGGTGAGGGCATCGGCCAGG
+GCAGCGGACGCGCCCGCGGCGACCGGCGGGGTCAACCCCGCCGTTTCCAGATCGCGCGCCAGCTTCAGCGTGTCGAACGG
+TACCGCGTTCATGGCCTCGATCCTACGCCGTCACATCGAGCCCAGTCCATCACGGATAGCTTAACAACCGGTTTCTCCCG
+GTGGCCGACGTTCGCTCGATTACGAGTGGTGT
+>generic694
+CATGTGCTGGCGATCAGGGGGCGTAGGCTTCTGGGCAGGGCTTGGAGCTCGAACAGGGCGTTGACGAGTTGATCGCCATC
+CGGCGCATGGAAAGCCGGTGCATTCCCTTGAGGCCAGATCCGCGCCGTGACCCGGGCATACCAAGCCATGCCTTCGGCAT
+GGACGCCGGCTTCGATGGAGCTGCTCGCCGCTTCGGGTCTGGGCACCATGCGTGCGAGATAAGCCGTCCATTCCGACCAT
+GCTTTTTTCTGATGTATGTCGAGCTTCACCACGTCTTCTTGATGTGGCAGGCGCGATGGAATATCCGTAAAAGTGTGCGG
+CTGATCATCGGCATAGGTTAGATGTCGAATCAGCAACCAGTGCAAGCGATCCAAGGGCCCCACCAGACCATCGGCGCACA
+TGATGCGGCGTGCACTCAGACGAAATTGTGAGCGGCTTTGAGCCGGCTCACTGGCCAC
+>generic695
+AACAGCTTCAACGGCAAAAAACAGTAAATGCCCACCGTCTAAAACCGGTATAGGCAATAGGTTCAACACCCCAAGACTGA
+CACTGACTATCGCCAGGAATTTTAAAAATGCACCAATCCCATGTCAGCAGATTGTCCGGCATATTGGGCAATACTAATGG
+GACCGCTCAAATTTTCTACCGATGCGTTGCCAATCAGCATTTTTCCCATCATGAACAATGAGGTTGTCGAGTAGTGCCAG
+GTTGTTTTCAGTGCGGCGACAAAAGCATCTGTAACCGGCAGCGAATAAGTGACCTCTAATAACTTCATTGACTTAATCAG
+TTCTTCAGGCACATAAACCCCTGCACCAATTTTTCCGACTGCTTTGTTTGCTTGGTCATAACCCGTTGCGGTTTAATGCT
+CAACGACAATAAAACCCCTACACGATTAATAACCAGCTTGATATTTGCCTCTGGACGTTTTTGTACATATTCCACG
+>generic696
+CTTGGTCCAAGGGTTGCGGCTGAATTCCTGCTTGAGCAGGTTCGACACCATGCTGGCGAGACCTTCAGCGGTTTTGAGGG
+CGACATTGCCGACAAAACCGTCGCAGACCACCACATCGACGGTGCCTTTGAAGATGTCATTGCCTTCGACGTTGCCGTAG
+AAGTTCAAATGCCCCGCCGCCCCAGCCGTGCGCAACAACTCGCCCGCACGCTTGATGACTTCGTTGCCTTTTATCATCTC
+TTCGCCGATGTTGAGCAGGCCCACGCTGGGGTTGTCCTTGCCATCGACAGCGGCCACAAGTGCGCTGCCCATGGCCGCGA
+ATTGCAGCAAGTGATCGGCGCTGCAATCGACGTTGGCACCCAGATCAAGCATGGTGGTGTAACCACCGCTTTGATTGGGC
+ATGACCGAAGCAATCGCCGGCCGGTCGATGCCGGGCAGCGTTTTGAGCAAATAGCGGGCGACCGCCATCAGCGCGCCGGT
+A
+>generic697
+AACAGCCCGCCTAGCGCGGGCTTTTTTGCGCCTGTGCCCTGCCTATGGCACACCCCATCCGTCACGGCCAACTGGCATGC
+TTGCGTGTCATGGCGCATTCGAGCAGTTGCTTCGCATGAGCAACCTCCGGATTGCTGCTATCAATTCTCGCAAGGCGTAG
+GTACGCTGCGCCGATGATGCTGATCAGTCGCGCCTCTTCTCCTTTGGCACCGCTTTCGAAGCAGAATTCACGCCATTTGG
+TGATCAGGGATGCCCACTCTTCAGGGGTTGTTTCCTTGTGCATGTTCACTCCCCATTACCCGTCCACCCGGCACCGGATC
+GCCAGCAGATCAGCCCACTGCTGCTGAGTGCCGCTCAAAGGCGCGTCACCCCTCAAATCGCCATCATCGCCCGCACGCCG
+TCGGCGGCCATGGTGGGGCCACGGCCTTGGG
+>generic698
+CATGGATGCAGTTTTACATGCAATCATGGGGCAATAGTGGTACCAACAATTCCCAAAACCATTGTAAGCGTTCTGGGAAT
+TGTTGGTACCACTATTGCCCCATGGATGCAGTTTTACATGCAATCATCTGTTATAGAAAAAGGCTTAAAAATAAAGCAAT
+ATAAATTTGTGATGATTGATATTGTAGTAGGTTGCGTTGCTACTGTTGTTGTTGCATTTTTATTATGGTAGCCTGTGCTT
+CCAATCTGCATGATCATGGCATTGTAATTAATGAAGCCAAAGATGCCGCACGAGTGGTGT
+>generic699
+CGTCGTCCAGCACCACCTTCAGTTCAGCCCCCGTGCCGCCCGCAGCGCCCACGCGCTTGAGCTGACCGGACTCAAAAGCG
+CGGCGCAGGCGCAGTACTTCAGAGGCCGGCTGGGTGAAGTTGACGTACATCAGGTCGGTTTGCTGGATCGTGGCCAGCAG
+CGTGGCCTCGCCCTGCCCAACCAGGGCCCCTTCGGTGACCAGCGAGCGGCCGATGCGGCCGTTGATGGGCGCTTGCACGG
+CGGCGTATTCAAGATTGAGCTTGGCGGTTTGCACCGTGGCCTTGGCAGTGGCCACGTCAGCCTCAGCCAGCTTGAGTGCG
+GTTTGCGTGCCCACCCATTCGGTCTGGCTGATGGCCTTGGCGGCGGCCAGCGGCTCGTTGCGCTCAAGGGTGGCGCGCGC
+CTGCGACAAATTCGCTTCAGCCTTGGCCTGCGCGGCTTGGGCGCACGAGTGGTGT
+>generic700
+AGCGGCCTGAATAATTTGCCCGCGCTGGACAGCGATTCTGACGGCATCCCGGACTGGTGGATGATCCAATATTTCGGACA
+TCCCACCGGGCAGGCGGGCGACTTGTCCCTCGCGCAGGATGATGCCGATGGCGACGGCATGAGCAATCTTCAGGAATATC
+TTGCCGGCACGGACCCGACGGTTCCGGCCTCCGTTCTGGCCCTCAACATTGCGCCCGTTGTCCCGGGCACCAGCGCGGTG
+TTGCACTGGACGGCGGCTCCGGGCAAAAGCTATCAGCTTCTCTCCGCCACCAATTTGAGCAATGCCGTTTGGTCGGTGGT
+TCCCGGCAGTGCCGGGGCCGGCGCGGCCGGGCGATGGGCGGCCCGCGCTCCTTCACCATCCCTGCCACCAATTCGCCAAG
+ATACTTCCGACGAGTGGTGT
+>generic701
+GAAAAAATAGAAAGTGTAGAAATCTTGAGAACAATTTACGTCTCTTAGCAGGTGCGGGGGATGTTAAAACTACTTGGGAA
+AGATAAAGCTGTGGAATTTGCGATAAGTGTGGTATTGAAGCATTTTAACTTGGAGAAAGACGTTTCAAAAGATGACTTTG
+AATAACTAAGGAAGTATGCAGATGTGATTCTTGGGTTGATGACTCAGTGAGCAGTTTTTTTTAATTCCTGCCAAGACGGC
+AGACGAGCGTAATGTGCATCGGTTTGTGCGCACCCCCACAATGCTTCTTGCTTGTGGGTTTTTTTATGTCACACGGTTTT
+CCTTGATTATCTCAAAGGGGGCCAAAAATTGTTTTCACAACGATTTAATCGCAACACAAACCCTGATCAGTCCTATAAAA
+AGAAAAACTGCTTTTACGCTCACTCAAAATGATTTTACAATCCAAGGAATACGCTCCCATCGCGCATAGTCTTTTGGACT
+GCGAATGCAATATCTGCCTTGAAATCGACG
+>generic702
+ATCCAATGCACCACGGCAGGCATCTTCTGGTTGCTTGACTTCTTCCTCACCAAACAAGGCGGCGATCAAGGCATCAGTGT
+GGTGAAGGGAGCCGTCATCGCGCAGTTCTTGCGCTGCCCGCCGCAGCACGCCCTTGACACCACTGCCCGCTAAATAAGGC
+AAGCCATAAGGTGTGAGAAAAGCAAAACCATTCTCAATGGGGTGCTTATGGCCCAATCCGGTGGCGAATGGGGCGGTGGA
+ACAGGCCAGTATGGTGAAAGCGCCAGCTTGTTGGGCGAGATCGGTTTGCCGTTGGCGTAGTTCTTGGCGCAATTCTTGGA
+TGGGTTGCGGTATGGCTGTGCATGCCTTGGCTGCTTGCCCTTTGGCATCCTTGTCGAGTGCCCAATCTGTTTTCCACATG
+GGTAAATACAACAAGAAGCGATGGCCTGGGGCTGCACCTCGGAACTGGTCGTCTACACGGCCGACTGTTGTCGGTACGGC
+CACATATCCGC
+>generic703
+TAACTTTTTCACATTTTAAGCCCTCATTTAAAAGAGTTAAATTAAATTAGAAATTTACAGCAAAATAAGTTCTCTCTCTC
+TCTCTCAATCTCTTTTCCTTGCTCCCTTTTGAAATAGTTATTAAAAAATCAAATAAAAGTTGGTATGTCCATTTTCGGTC
+CATCCTATGAAGTCTCTTTTTACATATTATATTAATTGATTAATTTCCAAAAAAACAAATATCGCTGTATACATTAAACA
+AGACATGTTGTAAACATGTTTCAAGACCTTCGAGAATATTGGCGGCCTTCGGCCGCATAGCAGACTTGGCGGCCTTTAGC
+CGCATAGCAGACTTGGCGGCCTTCGGCCGCATTTTAGAGAGAAAACATTTTCAATTTATATATGTTTTATGTAGTTATAA
+GTGTTTTATGTGGTTATATGTGCTAAGGTAAAAATAGCTAT
+>generic704
+GCCGATTACAACGCGCTTCAGGCGGATGTACACGCCATTTTTGTGGCTCTTTCACGCATCTCAAACATGCAGGGAACTGC
+CGTCATACCGAAGATCTAGGCCATGGTGATCATCAAAACCCTTTGGCTACAATGGCTCGATTACCGGAGCACATAACCAT
+GGCTGAATTGATCTACGGCCAAGAAGACAGCCTCCTGCCGTGGGCTCAGGATCGCATCGGCGTTAGCTTTCGCCGTGATG
+CGTACACGATTGGCCTTGAGCGATCCAGCAGGCTTGTTGCCGTGGTGGTATTCGACAACTTCACCGATGGCGACTGCAAC
+ATGCATATCGCCAGCGATGGCACGTCAGCTTGGCTCACCAAGTCATTTCTGGCGGCAGCCTTCGCCTACCCTTTCACCCA
+ACTCGGCCTGCGCCGTGTCACCGGCATGGTCCCGGCTGACAATGAAGCAGCCCTGCGGTTCGACAC
+>generic705
+CAGGAATGTCGTCAGGCAGATGACGAAGCCGCCCCAGAGCGTCACCAGCGCGCCGCGATAGCTCGCGCTTTTCCAGAACA
+CGCCCCAGAAAAACACCGCCGACACCGGTGGCGCGATGAAGCACAGCAGCATCGCGATGCCGTCGAAGATGGTTTTGAAG
+TTCGCCACGAGCGGCGTCCAGACGATGGCGATGACGATGCCGAACGCGGTGGCGATGCGGCCGACGTGGATGGTTTCGCG
+CTCCGAAGCCTGCGGGCGCACGCGGCGATAAAGGTCGTAGCTGAACAGCGTCGCCATCGAGTTGAGCGAGCCGGAGATCG
+GCCCCATCAACGCCGCGAGCAACGCCGCCGCGATGACGCCGCGCAGGCCGAGCGGCAGCAGGTCCTGGATCATCGTCGCA
+TACACCTCGTCACGAGTGGT
+>generic706
+GCCAGTGTTAAATTTGATGAGTTCGTGCCGCCTGTCAAACTGGTAGCATTGCTGCCAATTGTCAGACCATGTCCCGTACC
+GACATTATTCAATAACGTGACATTAGTACCGTTCGCATTGATATTCAGACCCGCCGCCGCCAAAGACGGAGACGTGAGGT
+TAGTTGTACCCTCCAATGCAATCGAACCATCGGTGTTTAAAGCCAGCCCCTGACCTGTCAGCGCATTTTGATTTTGATTG
+CCCGTAAGCGTTATACCTACCACGTTCGCAAGCAATCCACCACCCGTAGGAAGGCTGGAATTGAGCGAACTGCTGGCACC
+ACTGACACTAGCAAGACCAGTCGTCGCTTTTATTGTTGCTGTCCCACCCGTTACGTTGACACCCGTCTGCGTTGTGGTGA
+AATTACCACTTCCAATACCGCCGCCGCTGGAAAAGGTAGCGTTACTATTGGAAGTAATGTTAATACTGCTGCCACTAACA
+GTAATAGGTGCAGTAGCACCATTAA
+>generic707
+CTTCGGAGCCGGCGGAGATTTCGGCGGCTTCGGGGCAGAGGGTTTGGTTGAGGGCGGCGCGGACGGTGTGTTCGCGACTC
+AGGGCAGTGGTGTGGGGTTCGCCCAAGGCGATGAGTTGGTCGCGCAACTGGCCGACAGTGGTGCCGGGGAGACTTCAATG
+GTTTCGGTGGCACCAAGGACTTCGCGCAGCGAGGCGAAGTACATCAACTGAACGTGCATGGGTAGGGCTCTTGATCGGGG
+GCGTTGTTGTTATTGCAGAAAGCTCATCGGGATAAAGCTCACGGTCTGGCCGGGTTCAACCAAGTGCGCCAGCAGGGATA
+TCCACCAAGCCGTCGGCCCAGACCATCGAAGTCACGCACGCCGGAGCTTTGATTGGGATAGACCGTCACGTTGCCATCGG
+CATCGAGCCGTGCGCGCACAAACTCGCGCCGGGTGTCGGCCTTGGTGCGCCGGAAAGCGGCCCGCAACGGCAACCCGCGC
+GGCAGGCCCAACATCGCCACCGGCACGCCTTGCAGGC
+>generic708
+GCAATGACACGCGCACTGCCAACAGAGCCAGTGCCGATGCGATTAAAGACCAGAAAATAAGATGGCGCGTGGCGCGTTTA
+ATATGATGAATCATGAAAACAGGTTCAAGGTGCAAGGTTCAAGGTTCAAGGTTCAAGGTAAAAGATGCAAGGTAAAAGAT
+GCAAGGTAAAAGATGCAAGGTAAAAAGGCAAATTCGCAACCTTGACCTTTCGCCTTGTACCTCAAAGAAGTACCACATCA
+TACTGTTCCTGATTGTATTCTGATTCGGCTCTGACTTAATTGTACATCTAAAAATATCTCTAATTCTGCCAGCATATCGG
+CTTCTTACATCCAGTAACATATCAACTACATTATTA
+>generic709
+GGCGGTCGGGCTCTTGCGAGCGTCGATCGGACCGCCCATCATGACCATGGTGCGCGGCGTGACTTCACCGGCGCTGGCCA
+TCAAGGAGATGGCGGCCAGCACGGGCACGGTGGGTTGGCACACCGAGATCACGTTGACGTCCGGGCCGATCAGGCGGATG
+AAATCCTGCACGTAGGCGATGTAGTCGTCCAAGTGGAAGTCGCCGTGCGCCATCGAGACCATGCGGGCATCGACCCAATC
+GGTGATGTAGACCTTGTGATCTTTGAGCAGCGTGCGCACGGTGTCGCGCAGCAAGGTCGAGTGGTGACCTGACAGCGGTG
+CGACCACCAGCACAGCCGGTTGGGCGCGCATGGTGTCGAGCACTTGGCTGTTGTCGGTGTAGCGCTTGAAGCGCAGCAGA
+CGGCAGAAAGGTTGGGTCTTGATGACCTGCTCTTGTACCGCCACGTCGGTGTCACCGACTTGGATC
+>generic710
+GCAAAAACCTGTGCTGCGCTTTCACGCACGCCTGAGGTAGCGCGGGTTTCGTCGATGCGCAGCAACAATTGGCCGGCTTC
+GACTTGCATGCCCTCGCGCACCAGAATCTCCGACACCACACCGCCATCCATGGACTGCACCACTTGGAGTTGATGGGACG
+GGATGACTCTGCCGTCGCCTCGGGTGACCTCATCAATCGAGGCCCAAGCGGCCCATGCAATCAGCACGGCCACCACCACC
+ACAGAGGTACGTACGATTTTTTGGGCGCGCACGGTGCGTTGGCGCGAAAGAAGCTCCTCGGCCTCGATCTCAAAACCACG
+CACCCCGGTGGTGTCGGCCAAGGGATCCACAGTGAAGTGCAGACGGCCCCAAAAGTCCCGTAGGCGCGCAAGCGTCATTC
+GAATATTCAGCGTCATGCTGTCGCCCTCGTAATTCGGCCTGCTTGCAGGGCTTCGA
+>generic711
+CGCAAGCGTGCCGCTCACCAATGAGCATTGGATCCCTCTCGCTGAAGGTGAGGTCCTGGCCGTGAGCCGTGGTGGTTTCT
+TCCTTCCCGATAACTGCATCGAACGTGAGGTCAAGCTGGAGTCGACAGCGGTCGAGCCGCGGCTGCCGCTGAATCGGCAA
+GAGTCGCGCTCCGGACTTGCTCCATCTGACTTGGTCAAGTCGGACCGTTTACCGTTGCGGTGCTGAGCCCGCCTTGTTCT
+GAAGCGCCGTGGCATGGAGAGACGAATGAAGACCGCGGACGAGTTGCTGAATGCCTTGCTCGCTGAAGTTCGTCCTCCTC
+GCGGGGTCACGGTATCGATTGCCGAACGGCCTTCCAACGGTCCGGCGGACCCGAACTGGATCGCGGGGATCGGGGTTATC
+CCCATTACCCTCGCGGACGGATTCTCGAAATGTATTGGGTTGTTCCGTGCATCCGATCCGCAACGAGTGGTGT
+>generic712
+CAGAAAATGAACCCCGAGGCGGTACGATGTTGAACGTTACATTAAAAGAAAGAGGATAAAAATGAACGTGCTGCTCATCG
+ACGACCACCCTCTCATCCTGTCGGCCATGAAGAACATTGTGGGTGGGTTGGAGGGCGTGGAGACCGTTATGGGGGTGGAG
+ACAGCACACGAGGCGCGCGAGTTGTTGCGCACTCAAACCCATCTCGACTTGGTGTTGCTTGATCTGCAACTGGGCGATGC
+CGATGGGTTTGATCTCTTGACCGAACTGCGCCACGACCATCCCACCTTGCCGGTGGTGGTGGTTTCGGCCTCGGACCGGG
+TCAGCGATGTGATTCGGGTGCTGGATGCGGGAGCCGCTGGTTTTGTCCCCAAACGGGCCAGCAACGAGATGCTATTCGAG
+GCTTTGCATTTGGTGATGGCGGGTGGGATTTATGTGCCGCCCATGCCGGCTGGCACGCCGGGGACGTTGGATGGCACCTT
+GTCGATCGAGTCGCGTTCGGCGCGCTTGC
+>generic713
+CCATGGAATCGCAGCAATGCGCTTATCTGACGGCGCAGTTCGACGAGGCCGAGCGCGGGATCGAGCGGATGCTTGGCCAA
+GCCCACACGGCCTTGGAAAAGGCCGAGATCTTGTCGATGCGTACCCGCCAGTACGCCACCACCGGCCGGATGGTCGAGTC
+GATCGAAGCTGCGATCATGGGCTTGAACCTGCTGGGCATTCGCTTCATCGCCCATCCCGGATCGGGCCGCCGTTGCCCGT
+GAGCGCGCGAGCGTGCGCCGTGCGCTGGCCGGACGACGCATTGCCGATCTGATCCATGCGCCGCCGCTGACCGATCCGCA
+CCAGCAAGTGGCGATCCGGCTGCTGATGGAGATCTTCCCAGCAGCTTTTCTCTCCGGCAGCGGCCATCTCTTTCCGTTTC
+TGGTGCTCAAGTCGGTGGCGATTTCTCTGCGGGGCGGCAACAG
+>generic714
+GAGCCCTACAAGAAGCTGCAGCGCGCGCTCAAGGCCGAGATCGACGAGGCCGCCTGGTCAAGCCTCTACAGCACCGTGAG
+CCGCCCGTTCGAGGCGCTGTCAACCGGCAAGATCGCTGTGAAGGTCATCAACCACTACGGGGATGAGGTGCTGAAGGTGT
+ACGAGGTCAGCTCAGCTGCACACAGCTCGCAGTGATGTCGCTCCTGCCGCGACCAACGTCTTCGGCCTCCGTCGCGCTAC
+GCGGATCACGGAACCTCAGCTGGAGGCGTGGGTCGGTAGGGCCGCAAATGCCACTGTGGGCCATGGAGGGCAGGACACGC
+TGTCACCGAGCTGGCGGTGGGGGAGGAGTGTGAATTCATGGCAGGGGGCGGCAGGCAGATGAGGATCTCACGAGTCAAGA
+TCGAGAACTACCGCGTGCACCGCAGCACTCTGATGGACTTCGATGATC
+>generic715
+CAAAGGGATGCCGATGGTAGTCGAACTGGGTATTGCCTTTGACGTATTGGTCGCCGCCGTGTTGTTCGGTATTTTCTTCT
+TTCATATTCGCTCCAGCATTGATTCGCTGGATGTGGATTTGCTCAATAAATTAAACGAGGTGGACAAATGATCCCCGCCT
+ATTATTACTACTGATTGCCTTATCGGGCATTGTGTTCTTCGCCTTATCGGGACACAAAGCCAATATGGGCAAAATCAATG
+TCTGGTTTAACGCCGTCAGTTTGTTTGCCACGATGTGGCTGGCGATTAACGTGTTTAACAACGGGACGATTTTATCGGCG
+GATAAAGCCTTTTTAGTCGATTCGTTTAATGTTTATCTGATTGTCTTGACTGCGTTCATCGGTTTGACCACCTCTATCTT
+TCCAATCCCTACATGGAACATGAAAAAGAGCTGGGCAAACTCACCGCTAACCGTTTGAAACTGTATTACTCGATGTATCA
+AGGTTTCATGTTGGCAATGTA
+>generic716
+TACAAAGACGGCAAACTCCATTTCACAGGGAAATTTAAGCGCTCGAGTAGCATCCAATACAACCGACGAGATCGGAGTGC
+TTGCAAACACCTTCAACAAGATGGCATCTCAGATACAGGAATTCGTAACAACTCTGGAAAATCGCGTTGCACAACGCACC
+ACCGACCTGGAACATCGGACGAGTGAACTTGAACGGATCACAAAGCAAAGCGAAAAACGTGCAGATGAGCTTCAAACGAT
+CGCAGAAATCGCGGGATATATCTCCACCGAAAAAGACCTGGAAAACCTCCTGCCGCTCATCACCCAAATCGTAAGCGAAC
+GATTTGGCTATTATCATATCGGTATCTTTCTACTCAATGAAAATAGAAAGTTCGCCGTTCTACGGGCAGCAAACAGTCCG
+GGCGGAAAGAAAATGCTGAACCGCCAGCACAAACTTGAAGTCGGCCAGGTCGGCATTGTGGGAAATGTGACAGCAACTGG
+CAATCCACGCATCGCCTTGGATACAGGC
+>generic717
+GAAGACATGACGCCTGAGCGTTTGGAGGAAGAGCGCCGCTTGATGTATGTCGGCATCACGCGGGCGCGGCGCACCTTGAT
+GGTGAGCACGCTGCTGCGCCAAAAACGCGGCCGAGAGATCAAACGCGCCCTGCCCAGCCGCTTCATCGCCGAGATGAAAC
+TCGACGAGCGCACCGCCAAAGAAGACCCCGCGAAAAGCTCAAAGCCTTGCGGGCCGAGTTCGCTGCACGGGCCGCGCTGC
+ACAAGCCCGACAAGGTGTGAAGACGCCAGCAGGGCGTCGCGCAACCTGCTCACCTACAATCGCCCGGCTTTATCGCCTTG
+TCTTTTTGTTCTTTCTCTTGTTTTCTCCCTTTCCTGGAGCCTGCCTGTGTTCATCTCGAATGCCTACGCCCAAGCCGCTG
+AGACCGCTCAAGCGGCCAGCCCCCTGAGCCAGATCCAATCGTTCTTGCCTTTGATCATGATGTTCGTCGTGCTGTACTTC
+>generic718
+GTATCGAGGGCTTGGCCCGCACGGATGCTGGATCGGTGTTTTCTGCGTTGCCCTTTCGCACAGGCGATACCTATTCCGAC
+GAAAAAGCGGGGGTCGCGTTGCGCGCGCTGTTCGCCACAGGACATTTCAAGGATGTCCGTATCGACGTCGAAGGCCCCGT
+GGTGGTGGTGGTGGTGCAAGAGCGGCCGATCATTGCCCACGTTGATTTTGTCGGTGCCAAAGAGTTCGACCGTGACACCT
+TGATCCGCGTTCTCAAGGACATCGGGGTGGGCGATGGCTTGCCGTTTGACAAAGCTCAAGCGGATCGGGCCGAGCAAGAA
+ATCAAACGCCAATACCTGACCAAAAGCCTTTATGGCGCAGAGGTGGTGACCACCATCACGCCCATCGAGAAAAATCAGGT
+CAATGTGTCTTTCTCGGTCACGGAAGGCGGGGTGGCGCGTATCCGTGATATCCACATCACGGGCAACCGGGTTTTCCAAG
+AAAGCGAATTGGTCGATCAGCTTGAGCTGACCACCCGGGGCT
+>generic719
+TGACGATTCAGCTGAAGGTGAATGATTTTGAGAGATCCTAAGTCAGGGGAACATAAGACAGCTCGGATTCCGTGCTCGTC
+TTCATCGTTGTTTTGAATTTGGTCATGGCCCGTGTCTTCGAATCAGCTGAGCATATCTTGCAGTCGCGTTTCACACTCTC
+TGCCTCTGCAAAACAAGCTCAACTTGATATCTACTTCGTAGAAATGAAACATCCGTTTCTTCATTCATTACAAATAAGCA
+CCGAAGTAAAACGAAAAAACCCCAGTTCCGCTACACGAACCCTGACATCACAAGGATCAATCAGTTTGCCTACCCCTCCT
+CACCTGGCATCCCCCCCACCACCCCGCCCGAATGTTCGGTCTAGTGAGATAGTCACAGACCGAAGTCGTCGACTAACGAC
+TGTAAAAAAGTACAAATCCCCCCGAATGCATTTCAAAATCAAAGTCAATTATTTGCCATAAATTCAAAATTCAACTAAAA
+ACT
+>generic720
+GGTCTTGGTGCGTTTGGCCGGAGCCTTGCGAGCCGGCTTGCCAGCAGCCTTCTCGGCAATCGCCTTGAAGCCAGCCTTGT
+TGCGGCCGGTCGGACGCGGCGAGGGAGTCCGGGCCACGATGGTTTCGATGTTCGTCGGCGTGGTCTTCTTGCGACGCGGT
+GCAGCCTTCTTGGCTGCGGCCCCTTGGGCTTCAGCGGTCTTGGCGGGCGCACGCTTCTTGGGCACGGCCGGCGCAGCGGT
+GTTGGCGGCTGAGCGGCTCTTCTTCACCACGGGCGCGGCTTCAGTGTCGTCGTCCATCGCGTCGTCCGAGGCCTTGACCA
+AGCCTTGGGTGGCGCTGCCGAGCTTCATCCGCACTGCCTTACCGCCCCAGATTTCTTCCAAGTGGTAGTACTGGCGAATC
+ACCGGCTGCATCACGTGCACCACGGCTTGGCCGCAGTCCACGATGATCCATTCGCCATTGCCTTCACCTTCGGTGCTGAG
+GACTTCGCCACCCCGCG
+>generic721
+GGCCAGACGATCTGCCACAGGCAGCGTGGGATCGCTTGCTGACGCATGTACCGCAAGGCGTCGTCGTTGCCGCGGATGCG
+GCTGCGGGTAGCGCTGCAATCGCTGAAACCATTGTGTATTTGGCGGGATGCAGCCGATTTGTCAGCGGTGCGTTCCTGAC
+CGTGGACGGCGCACGCACGGCGCGCTGGTAGGTCACAACTCCGTGTTGAAATGTTGAAGCGTTTGCACACCCGGCGCGTT
+CTGGCTAACGTCCACCGCGCTTCACGCCGCGCTGTGGCACGGCTCTCCTTCCCCTAACGAGGCACAACATGTCGATTCGT
+TTGAGTTCTTGGCTGGTCTGCCTGCTCGCGTGGCCGTCTCTCGCCACGGCCGCTGATGCGCCGGCGGGTGACGCGTCCAA
+ACCGAAGCTGCTGATTGTGCCGACGGTCTACATCGGTGAAGTGCGGGCGGATTTACGAAAAGCGGATTC
+>generic722
+CAAGCAACCCGCATCAAGCACACAAAAGCGCACGTCTTTGCGAGGAGCGGCTTTTCGCGACGAAGCAATCCGTGTAAAGC
+ACGCGTTGGTTTTGATTTGATTTTAAATCCAATGTCATTCCCGCTCCAGACCTTCATGTTTTAATATTAATCATGGCGGT
+TTGCGTCGGGATATAGAGTTTGCTTCTCTCTAGTCCATCACACTCGCTTCCAGCGATAAGCCGATAACCGCGACTAAGGC
+GGAACCGGCTAAGCTCAAAATTTGGCATCCGCGATTACGGGGCAACATCGGAATGTATGATTACCGGCGATTCTTGTTTG
+AGCTTTTAACGCCCGTTCCGCCTATGTCGCGCATCCATACTTCAGGCTGAACGGTAACTCGCTCACAGCATAGAACAACA
+CGTACGCTCGCTGCAATGGACGGGCTTTTGGTAAGTCAAAGTCAAAGACAAATCCAAATACAAGTCAAGATAACCCCGAT
+ACCTGATGCGGCGCAAAAGGA
+>generic723
+GAAAAGCATCAGATCAGGCCAAAACAACTTGGCACCGAGCAACACCGTCAAACCCAGGCTGAGCGCCAAGGTGATGACGG
+CGGAGGCACGGCCGTGTTCTTTGGTGACGCTGTGGGTGGCATCCATCCACAGGTGGCGCACGCCAGCGATGAAGTGGTCG
+CAGGTAAGCCCACGTCAAAGCAAAGCAGATCAGCTTGACGAAGAAGCCCTCGAAATGGAGCGAGAACTGGGCTAAACGAC
+ACCTCGGAGGTCAAGGTGGTGTTCGAACATCCAAACGATGAACGGCATCAGCAAAAACATCAGCATGCCGCTGACCCGGT
+GCAGGATTGAGACGATGCCCGCCAACGGCAGGCGATAGTG
+>generic724
+GCCGCTGAAGGTGGCGTTCGCCTACGTTGGCCCCGTGGGCGACGGCGGCTGGACCTTTGCACACGACAACGCCCGCAAGG
+CGCTGGAGAAGGAATTTGGCGACCGGATCGTCACCAGCTTTGTGGAAAAGGTGCCCGAATCAGCCGACGCTGAGCGCGTG
+TTTCGCGACATGCTCGGCCAAGGCAACAAGCTGATTTTTGGCACCACCTTCGGCTACATGGAGCCGATGCTCAAGGTGGC
+TGCTGATGCCAAGGACGTCAAGTTCGAGCACGCCACCGGCTACAAGACCGCTGAGAACCTGCGCACCTACGACAGCCGCA
+CCTATGAAGGCGCCTACATGGCGGGGGTGGTGGCCGGCGGCATGACCAAGACCAACACGCTGGGCGTGGTCGGCTCGATC
+CCTATTCCTGAGGTGATCCGCAACATCAACGCCTTCACCTTGGGCGCGCAAAGCGTCAACCCGAAGATCAAGACCAAGGT
+GGTGTGGGTGAACGAATGGTTC
+>generic725
+CTGACGTCGCTCGCTGTCGTCGCGGGCGCGCTCGGCGTCGCGGCCGGCTACCCGCTCGCCGACCCGCTCGTCGGGCTGCT
+CATCACCGCAGTCATCCTCGTCGTCCTCAAGCAGGCGACAGGTCAGATGCTGGGGCGGCTGATGGACGCGGTCGAGCCCG
+AGCTCGTCGGGCAGGTCGAGACGATCGCCGCGTCGGTGCCCGAGGTCCAGTCGGTCGACCGGCTCCGCCTGCGCTGGGTC
+GGACACGCCCTCGAGGCATCAATGGCGATCACGGTGGACTGCGACATGACGGTCAGCCAGGGCCACCGCGCCTCCGAGGA
+CGTTCGCCACCGCCTCCTCCACGAGGTCCGGAGACTCGACACCGCGGTCATCCACGTCAACCCGTGCGACCACTCGGGCG
+AGGACCCGCACGAGCTCGTCCGGCACCACGACCCGTTTGCGGGGCACTCGGCCCCGAGTTGCAGAAGGAGGACCAGCACG
+TTGAAGTGGGTCACCCGTGAGCACCC
+>generic726
+GCCGAACCTGTTTGCGATACATCAGCAACGCGCTCAATGATTTCAGCACATTAATCCACAAAATACTTTTATATTCCCGT
+GTCAGGTTATTTCTGTCTTCTGCCAGTAATACTGTGCCAGAATCCATGATGCGCGTGGTCATATCGGCACGTTCAATATT
+ACGACCCAGACAGATAAAGCGGTAACTGTCATTGTGACTCATTGCCCCTGCCATAAAGCCCGTAAAGCGTTGACAGCCGC
+GCATGATTTCCTGCAAAAACAGCAACCGTCCGCGCCGACTCGACAGCAGTTCGATGTTATGAGTGGCGTACAAATACATT
+TCGTTGACTTGTTCCCACGCTTCGTCAGGCATCAATTCACGCGTAATGCGGCTATTTTCACGCGCAAACGACAATGAGGA
+TAATAACGAGCTGGAATTGTCCAGATCGACCAGTAAAAATGAATGATATG
+>generic727
+CGGACTTGGCGATGACCAAGGTGGCGACGGCATTGCCAATGACATTGGTCAGGGCCCGGGCTTCCGACATGAAGCGGTCG
+ATACCCAGTATCAGCGACAAGCCGGCCACCGGCACCGTCGGCACCACCGCCAAAGTCGCCGCCAGGGTGATAAAGCCGGC
+ACCGGTCACCCCGGACGCACCCTTGCTGGTCAGCATCGCCACCAGCAACAACGTCAGTTGCTGCTGAGCGTCAAATCGAT
+GTTCAAGGCCTGAGCGACGAACAAGGCCGCCAGGGTCAGATAGATATTGGTGCCGTCGAGATTGAGGATAACGGCCGGAT
+CACCAAACCCACTACCGAGCGCGAAGCGCCCAACCGCTCCAGCTTGACCATCAACGGCGCCAAAGCCGACTCCGACGAGG
+AAGTACCGA
+>generic728
+GCGTCAGCCAACCCGCCCAAGCCGGGGCGATCACCGCGCTGCCCGCCACCTTGCCCGCCACGCCGACCCTCAGTGCCCCG
+GCCGGTGCCATCCGGCGCGCCTTCAGTTTGGATGGCGGGATGGGCGGGGGTGGGATGGGCAGCGGCATGAGCTTCACGAT
+CAACGGCATGCCCTTCGACATGATGCGCACCGACTTCAGCCTGACGGCGAACGCCACCGAGGTCTGGACCTTCACCAACA
+CCACCGGCATGGGCCACCCGATCCACGTTCACGGCGTGCGCATGAGCCTGTTGAGTCGCAACGGTGCGCCGGTGGCCGCG
+CAGGAACAAGGTCAGCGCGACACCTTTGTGGTCGATGGGCCACGGCAGCGTCGAGGTGGTGGTGCAAGCCCCGGCCGCTG
+CGAGTGCCATGCCCTTCATGCTGCACTGCCACATCTTGGAGCACGAAGACGCCGGGATGATGTTGCAGTTCGTGGCGGGC
+TAA
+>generic729
+AAATTATGCAAGAACGGACGGGATTAGGCGAAACAGGCGAATCTTATCTGGTAGGTCCTGATTTATTAATGCGCTCTGAC
+TCAACTCTGCAATCAGACCACACAATGCAGGCTTCTTTTGATAAACCTGAATCAGGTTCAGTCAAGATTGCTGCCACCGA
+AAAAGATGAGGGCTTCCAAAAAGCTGATGTAAAAGTTATGCGGGGTTATATAGGTAAAGAAATTCTTGCTGCTTACATGC
+CAATTAAAGTGTATGACAATTTAACCTGGGTATTGGTTTCTAAATTAAATACTGAAGAAGCTTTTTGCTCCTGTTAACCA
+ATTTGCCCGCACCATGGGTATTGTGGGTGGGGTGGTGTTGGTTGCGGTTATTGCGATTGCGTTATGGGTTGCAGGTTCTA
+TCTCTGGCCCTATTGTCAGAATGGCGAACGTTATTACCGACGAGTGGTGT
+>generic730
+GCCGAGACGAACGCGATGATGAAGACCGCTGGTAGGCCGATCTCGGGCAAGGCCATCCAGAGCAGGAGTTGTTGGATGGC
+GTGGGCGATCCAGGCTTCCATGGTGAGCAGCGCTTCAAGGCGCTAGAGAGCGTGATCACACGAAGCTGCGAGTGTGCCCC
+AGCCCACATCGGGCCGCTATACTCCTGCCTCCTTTTTCAGCAACTTGCGATGCATATTGGCCCCTTCGAGCTGCCGAACC
+CGGTTTTCTTGGCCCCCATGGCAGGCGTGACCGACCGGCCTTTTCGCCAACTGTGTAAACGGCTGGGTACGGGCTACGCC
+GTGGGCGAGATGGTGACGGCCAAGCCCGAACTGCGCCATAGCCGCAAAACCACCACCCGCTTGAACCACGTCGGTGAAAG
+CGCGCCGATCGCAGTGCAAATCGCCGGCACCGACCCCGCGCAAATGGCTGAAGCCGCGCGCTTCAACATCGACCACGGGG
+CGCAGATCATC
+>generic731
+GAGCCAACAAGAGAACCAACAGAGGAGCCCACACTGCCAACAACCCAACCCACTTTGACACCGACAGCGCAGCCCACAGG
+AAAGCCTACAGTTTTACCCTCTTTGGCACCAACCCTTCCACCAACGAAGGCTCCATCACTCATTCCTTCCCGTGGGCCTT
+CCACGGCCTACCGCTTCCGCCATCCGTTGCTCGGCGAGGTCGTCTACGCCGATCTTCTGCCACCGCAACGGGCGCGCCTG
+CATCGCAGCATCGCCGCGACGCTGCAACAGCAGCCGGCAGATGTCCTGCGTCGAGCCGATCGAGCGGGCGAGCTGGCCTT
+CCATCTCGACCGTGCTGGCGACGTCGAGCATGCGTTCTTCGCCCTGCTCGCCGCGGCCGATGCCGCGGAGACGGTCGCCC
+CGCGCGCCGCGTTCGGTCATCTCGAGCGGGCGTTCGAGCTGTGGGATTCGGTGGGCGAACGTGCTGCGGAGGTGAACCGC
+GCCCACCGCCTGTGGC
+>generic732
+GCAGGAAGCGCGCGACCTCATCTTCGCCGGCCAGGGCGGCCGTATCGGCCCCCTGATGAACGATGCATTCGACCTGCGCG
+CCCGCCTGATCCGCATCAGCCCGGGCAACCGGGAACTCATTGAAAGAGGCCGCAAGTTGGGCGCCTACACGCAGTTCTGC
+GGCTCGGGCGGCGCCATTGTTGGCTGCTATGACGGAGATCCGGAGCGGCTCCGCCAACTCCGGGAATCCTATGCTGAGAT
+GGGCGCGACTTTGCTAGTGCCGAAAATCGAGGAGTAACACTGTTTCATGATTGTCCGTAAAGCTGTCATCCCCGCGCCGG
+CATGGGCACGCGCTTTCTGCCCGCCACCAAGAGCATGCCGAAAGAGATGTTGCCCATCGTGGACAAGCCGGTACTCCAGT
+TTGTGATTGAAGAGGCTGTGGCGAGCGGCATTGAGGACATTCTCATCGTCACCGGCCGCGGCAAGCAGGCCATTGAAAAC
+C
+>generic733
+GCGCCGATGAAGGTGAAAAGCCCCGCTTCCACATGCGGCAAAAAAGCGTCTTGCTGCGACTTGTTGAAGCGATGCACCTC
+ATCGACAAACACGATGCTGCGCCGACCTTGGGCCTGCCAAAACCGCGCCTGCTCAACCGCCTCGCGGATCTCTTTGACGC
+CACCCAGCACGGCGGAGATGGCGATCATCTCGGCCCCACAGGCTTGGGCGGTCAGGCGCGCCAAGGTGGTTTGCCCACCC
+CGGGCGGCCCCCAAAGGATCATGGAAGAAAGCTGGCCGGTCTCGAACGCGACCCGTAGCGGCTTGGCCGGCCCGAGCAAA
+TCAGGCTGACCGATCACCTCATCCAGCGACTGCGGCCGCAGCCACTCGGCCAGCGGCACGCTACTGCTACGACCACCATG
+GCGACCACCACGGCGACCATCGCTT
+>generic734
+CAACAAGGTCTTGCTCGAAGCGCCCACCGCTGGCAACAGCGCCACCTGCAAGAGCTGCGCCCATTGCCCTTGGATGGCCA
+TGAACGGTTTACAAGGGCTGGTGGACTGCCTCGAACAGGGCAGCGGAGCCGTTGAGATCGACGCTGCCATTCGGCGCGAC
+GCGCTGCGTTGCATCGACCGAATGCTGGGCTTCACAACCGCTGCGGCCGGCATGGTGGCCCACATCGGTGCGGCCTAAAC
+CGGCCTCAACCACAGAGAGATCAGCGCCCCTTGCCGAGTCGGCCAGACTGGCAAGGCATCGCCACCCTCACCGGGGCGGG
+CGCTGCGCGCTTCACGCATCAACACCGTGGGGAAACTCACCGGCAAAGTCTCGGGGAAGTCGCGGCTGAAATGCAGCCCT
+CGGCTTTCGTGGCGCATCAGGGCCGAGCGCACGATCAGCTCGGCGCATTCGAGCAAGTTGCGCAATTCCAAC
+>generic735
+CGCGTCTGCACCGACTGTCACCGTACAGGGTCAACAGCTACAAAAACAGGAACAAGCCAGTGATACTGAACCCGACTGGA
+CACGTTGGCTGTATTTGTTGCCTGTATTGTTGAGCTTATTCGCGGGTATGTTGTGGCAATTACTGTCACAAAAACCAACA
+GGGCGTGTGGCAAAAATTAGCGATTAGTTTTACACCCCTAGTTCCCACGCGCTGCGTGGGAATTCATACAGACCGCGCTG
+CGGTCTACTACAACGCGGCGTCGTTGAAACTGGCATTCCCACGCAGCGCGTGGGAACGAGAACAACTTTTTGTTAAACCT
+CATAAGAGAATTACTAAATTATGGTCATTTATCGAACTCTCCCTTTACGAAGTTCACCAAGTATTTTTTAACCCCTGTAT
+TACTGCTCATCATTGCCATGTTCATTTATGCCTTTTTTGTCTTGGGTCAGTTTTTTAATGG
+>generic736
+GGAAGCGGAAGTTGAATACGAGAATAAACATTCCCCCGCGATAGATGTGCGCTTTAAAGTTGCCGATAGCACTGCGTTTA
+TGAAATGTTGCCATCACGTTCCAGCGCATGAAGGACACGGAAAATTATATGTGGTGATTTGGACTACTACGCCTTGGACA
+TTGCCGGCTAACCAAGCGGTGGCGTTAAATCCAAAGCTGGAATATGCGATTGTGCAAGTTGAAAAAGACGGTCATCAAGA
+GCGTTTATTAATCGCTGAAGCATTATTAAAAGATGCGATGGCGCGTTATGACATTGAAAAATATCATGTGATTGCCTATT
+GCAATGGTGCGGCACTCGAAAACCAGCTTTTGCATCATCCTTTTTATGATAGACAAGTGCCGATTATTTTAGGCGACCAC
+GTTACGACCGAAGCTGGAACAGGGGCTGTTCATACCGCGCCGGGTCATGGTCAGGAAGATTATGTGGTCGGTCAACGTTA
+TGGTTTATTGGTGGACAATCCA
+>generic737
+AACCAGTCAAAATTAGGGATAGGTAAGTTATTTTTGACCTGTACATTAGACGTCATTCTTAAATCTAATTTTCACCAGTT
+TAATTTCAAGCTGCTATGTTGGGAATCGATCGGACAACCCGTTCTATTTATATAAGTCCACTATTGCACCCTGCACACTT
+TAATCAACAAATTTCTTAAAGTTAAACAGAGTAATAATAATAATAGGATTGTAATCGAATGATATCGTTGGGGAAAGGAA
+GGATAACAGATTTAGCCAATTAAAAAATCATCTGGCA
+>generic738
+CCGCAGTGGCGGGCATTGCCCTGACTGCGATTTACGCCCAGAACGGTTGGATCGGCCAGTGGTTGCCGTTCAAGGTCAGC
+TTTACCCCGGTGGGGGTGTTTGTGGCTTTGGTGTTCATCGGTTTTCCCTTTGTGGTGCGTACCTTGCAGCCCGTTTTGGA
+AGACGTGAACCGTGAGCTTGAAGAGGCCGCAGCCACTTTGGGCGCGACCCGCTGGCAAACCTTTCGCCACGTGATCTTTC
+CGGTGCTCACACCGGCCTTGCTGACCGGCTTTGCCTTGGCGTTTGCACGCGCGCTGGGCGAGTACGGTTCGGTGATTTTC
+ATCGCCGGCAACATGCCGATGGTCAGCGAGATCACGCCGCTTTTGATCATCACCAAGCTGGAGCAGTACGACGTGGCTGG
+TGCGACGGCGATTGCGGTGGTGATGTTGATCACAGCGTTTACCTTGCTGCTCTTTATCAATACGTTGCAAGCTTGGGCGC
+GCAAGCGTCAAGGCATGTAAGAGGC
+>generic739
+GGGTCAGGAGCAGTTCACGGAAGGCCGCATCCAGGCTCTCGTCGCGCAGCAAGGCTTGCATGGCATCGATGAAGGCCGCG
+TCCAGCACCGGGGTTTGTTCGCTGTTTTGTTCGCCGTTCTGATCCGCTTGCACCGCCGCGAGCAGACGTTCCAGCCCGAG
+TTGCTGGCCGGCTTCCCAGCGGTTGAAGGCGTCGCTGTCGTGGCGCAACAAGGTCAGCAGATCGTCTTGGCTAGCCTGGG
+CTTGCAAGATGACCGGGGCCGAGAAGCCGCGCAGCAGCGAAGGCACCGGCGCGCTGTCAAGGTTGATGAAGGTGAAGCTC
+TGGCTGGCTTCTTCCAGCACCAACAGGCGCTCGGTCGGGCTGGTGAGCGGGCCGCCGACGAACTGCATCGGCAAAGCGCG
+GCCTTCGCGGTCCAGCAAGCCCAAGGCCACTGGGATGAC
+>generic740
+GTCCCGCGCCGCTCTCCAGGACGCGCAGGCGCTCGCCGCCGCCGATGTCCACGAGCCGGCCGCGCAGCGGCAGCGCGCGC
+GCGTCGCTCCACTCGAGCGCGGCCTGCACGAGCGCCGCCAGCACGGCGAGCGAGACGAGGACGAGCAGGGTGCGGAGCAG
+GGCACTCACCTCGCTGGCTTGACCAGTTCCAGCGCGAGCTGCCACGGGCGGCCGCTGTCCCGCTTCCAGACGTGGACGTA
+ATAGCTCGAGTCGGGCCGGCCGTCGCGGCGCGCGACCAGGGTGCCGAACGTGTAGCCGAGATCGCCGCTGTCGGCGATGT
+ACTGCGCGGTGGACATCATGACCTCGGGCGCCGCGCGCGCGGCGATCGAGTCGCGCGCCGCCTCGCGGCCGACGACGACG
+AGTGGTGT
+>generic741
+GTAAGAAGAACAGAGGAGGACATGGCTCGGAGACAGCGATAATCGCGCCAAAACGGCGCGCCATTTTGCCACCTCGGCAT
+ATGGATCGGGGCTTTGGGCCCGCGTCTTTGCCCTGATGGAAACGCTATGAACGAACCTGCCGTCACCGCTGCGGCCCTTG
+TCGAGTTGCACGACACGCTGCTTAGCCAACACACGTGGCCTCAAGCCGAACCCAGCCCAGCGCTGGCCCCGGACAACGTC
+TGGCACTGGATCAGCGCCAACCATCGCTTCAACAGCCTGCTGTGGGCGGAAGAAGATCTGGCGCGACGCACGCGGGTCAG
+CGACAGCGATATCGCCGCAAACAAGCGCGCCATCGACGGCTTCAACCAAGCCCGCAACGACGCCACCGAGCGCGTCGATG
+AGTTGCTACTGATCGAGTTGGGTTTGGTCGATGCGGCCTCGGCACGCACCGATGCGCCGGTTTCTCAAGCCGCCGCGACC
+GCTC
+>generic742
+GTTGGCCGGCATCAGCGTCATCTCACCGGCCGAAACCCGCAACACTGCGCCCGCGATCGTAACTTCGGCTTCCCCCTCCA
+AGACATGGACCAGGGCATCAAAGGGCGCCGTGTGCTCACTCAGCCCCTGCCCTTCGTCAAATGCGAAGAGCGTGATTGTG
+GCGGCCTTGCGATTCACCAGGGTGCGGCTCACGACGGCTCCCACCTGATAGCTAGCCAGTTCCGACAGAATGACGCGTTC
+GGCGGCTGAGATTTCTGCAGACACAAAGATCCTCCTGTCGGGATCGACCACATCAGCAAGCGCGCGTGGCCAGAAAGGAG
+CGGGCTGCGTTATCCTGCGTTCTCGTCTCCATCGTACGGTTCCATGTGGACGACGATGGCCTGCGCCTGCGGAAGCGTGT
+CATGGATAGCCTTGGTGACCGCCGTCCCGAGGGTGTGCGCATCGCGAAGCGACATGCCGGCGTCCGCCTGGACAT
+>generic743
+CGCCGACTTCGGTGGTGAGGTGGAGCGCGCTCTGTCCATGGTGGACGGTGTGGTGCTGCTGATCGACGCCCAAGAAGGCC
+CGATGCCGCAAACGCGTTTCGTCACCAAGAAGGCTTTGGCCCTTGGTTTGAAGCCCATCGTCGTGGTCAACAAGGTCGAT
+AAGCCCGGTGCCAAGCCGGACGCCGTGATCAACGCTGCTTTCGACCTGTTCGACAAGCTCGGTGCGACCGACGAGCAGCT
+CGACTTCCCCGTCGTGTACGCCTCGGGCATCAACGGCTGGACGTCGCTGGTGGAAGGCAAGCCTGGTGAGCAGTGGGGCC
+CCGACATGTCGGCCCTGTTCAACACCGTCTTGAAGCACGTGCCGCCCCAAAAGGGTGACCCGGCTGCGCCGTTGCAACTG
+CAAATCTCGGCCTTGGATTACTCCACCTTCGTCGGCCGTATCGGCGTGGGCCGCATCAGCCAAGGCACGTTGAAGCCGGC
+CATGGACGTCTTGGTCATGGAAGG
+>generic744
+GTCAAGACGCCGCCGATGCTTTGGGGTTGGCCATCACCCACGCCCACGCCGCCAAATCATTTGCGGCCATCGGTCAAGCC
+ACCGAAGTCAACCGCCGCACCCACGCGCAGTATCGGGGTGGGCGGATTTACTGAGCGAGGCGAGATCCTCAGGCTGCTTT
+GTTCGGTCCTTCAACCGATATACCGCTGCCGGACTCTCGGCTGGGTCGGATGTTTTCGAGCGCTTTGGCCGCAAGGTTGG
+CAACGTACTCTTGCGAAGCGCCGTTCTTGATGGCTTCATTCAGAGCGATCAGATCCCCGGTGATGGCCATACGACTTTCG
+GAAAGACTGACGCTCCATTTTGGTAGCGCATCGCCGCTTCTTTTTGGTATCGCAGCCGATTCGCCGCCACCGCTCTTGAA
+AGACGACTCCACGGTCTCCACCAAGCGTTGCAGCACGGTATAGACCAT
+>generic745
+GCCAGCCAGAAAAAGCACGCCAACAAAGCTTTGCAGCAATTCGCAGAACGCCTGCACTGCCGGCTTGCCGGGCTTCTGGT
+TCCGCTGGAACACGAAGTGAGAAGAGGCAATCTGTCTCGCTACGTGTACGAAGAGTTGGTACAAAGGATTGAAGGGCAAA
+GGAAAGAAATGCTCTCAGCTTTGAAGAGATCGCGGCATTGGAGAAGGGCAAGGCCTTTCTCAGAGAGTGTGTTTGATGCG
+GCCAGTCTGCATTAAAAGGCGTCCCCGACTTTGTTCGGCGACGCCTGTTTTATTTGATTTTAGCCAAAGCGCTTGCTAAA
+ATGACGATATGATTGATCTTGCAACAAATATTGAGGAGTTGCCAAAAATTGGAACAGCCTACGCTAAAAACTAAAAATTA
+CGGGATTAAAACAATTCAGGATTTAATTTTTATTTTCCCGTCGCGTTTACGACGACTTTTCAGAAATAATTTCTATTGGT
+TCTGCCCGCCAAAGAATTGGCGAAACTGTTTGCATACAAGGAAG
+>generic746
+GCCGTCGGCAAAGTCAGTCAAACCGCCCGCTTGGATCATCACATCCAGCAGCGTCATGTCTTGGCGATAGGGCACCGACT
+GCGGCCGGGAAGCCTCACCAACGATACGGATCTGCTCGGCGTAGACCCCTTGAAAACTATTGACCATGACAGTCACGACC
+GGATCACGAATGACCCGGGCCAGCAAATCGCGGATTTCACGCGAGAGATCCGCCGGACTCTTGCCTGCGGCCAGCACGTC
+CTCGACCAAGGGGACGGAAACGCGACCATCCGGCCGCACCGGCACCGTGGCGGACAAATCAGGGTTGCCCCAGACCACGA
+CATTGATGGTGTCGAGGGGTCCGATTTTGTAGTGATGATCGGTGGTTGCAGCACGCTGAGGCGCGGGCGGATAAGACTGC
+ATCGCCGAACAGCCCGCCAGCAGGGATGCGGCGATCAGCACAAGGCCAACACGCGTGCTAACACGCATGCACCGCTGCTG
+A
+>generic747
+CACCAATCCGCGCCCGCGCCGATCGTCAAGCGGCCGGCTTGCGGACAATTTATTTTAGTAAACGTGTATGCTATCCGTTC
+GGCGGCGGCCTCATCCTTCGCGCCTTCGCCGCGGTAGGGGCCGGGTTTCTCGCCGGCGGCGAGCGGCTTGAAACCATAGC
+CGCCGTAGAGGTGCGTGAAATCGAGAATTCCATCAACAGCTTCCAACGCCAGCGGCGCATATTGTTTGCCGCCCGCCGTT
+ATCTCGCCAGGCAGCGCGCGCAAAGTTTCTTTCGGCAAGGGTTGCGCGTCTTTGGGCAGCGGGCCAATGACTTGCCAAGT
+GACCGGCCAATCCACATCAAGCTGCGGCGGCACGGGCTTGGCTTCTTCCCGCGCTTCTTTCGGAAACGGTAGACGGCCAG
+GGTCTGGCCGGTGGCCTGATCCAAACGCAGGCACGTCTCGCCGACGGCGGCGTAGAGGCTTTCGTATCAGCCGTGAACTG
+CCCGCGGCCCACCAGCCATTCTCCCGGCCCGCGCCGT
+>generic748
+GTGGGCATAACCGCCCAGCATGTTTTGAATCAATGAGCGGTAGGTCTGTTCACTGCGACGCAGTTCCGTCACCGTTTGAC
+GCCTTGATGCCACCAAGCCGGCCACCCGCGCTTGCAGCTCCTCGACCGAAAAGGGTTTGGCGATGTAGTCCTGCACGCCC
+GACTGCAACAGCTTCAAACGCAGCGCATCGTCGGCTTTGGCCGTGAGCATCACGATGGGGACGTCGATCAGCTCAGGATG
+TTGGCCGGATCGCCGCCACCATGGCCTCACCGCTCATCACCGGCATCATCACGTCCGACAAAATCAAGTCAGGGCGCAGG
+CTCAGCGCCTTGTCCAAACCTTGGCGGCCATCGAAAGCCGTCTCGACCCGGTAGAGCCGCACCAGCGCTTGGGCCACGTA
+GTCGTTCATGTCCGGGTTGTCTTCAACCACCAGCACACAGGGCAGCTCAGACGACGT
+>generic749
+AAAAAAGATGATCAAGACCATGCGTTCTCTGTTGTGTGCCACAGCCTTGGGGCTGGTGGTGTTTGCCGCTCAAGCCCAGG
+TGGCTGCCGATGCCTTCGTGCGCCAAATCTCGGCCGATGTGGTCGATACGGTCAAGGCGGACAAAGCCATCCAAGCCGGT
+GACTTGCGTAAGGTCATTGCGCTGGTCGATACCAAGATTTTTCCGCATGTCAATTTCCAGCGCATGACCGCCTCTGCCGT
+GGGTCGCCACTGGCGTCACGCCACGCCTGAGCAGCAAAAACGCTTGCAAGACGAGTTCAAGTTGCTCCTGATCCGGACCT
+ACGCCGGTGCGCTGTCGCAGATCAAGGATCAGAACCTCGAATTCAAGCCCTTGCGTGCCAAGCCGGAAGATACCGAGGTG
+ATCGTGCGTTCGGAATTGAAAGGCCGGGGGGATCCCTTGCAGATCGACTACCGCGTTGAGAAGTCGAGCGACACGTGGAA
+GATCTAT
+>generic750
+TACCGCTGGAGTCTTCTCGCCTCGTCTTTTTTGCCGGAAAGATCGAGGTCTTGCTGTTCAGGCAGGTCTTCTGACTTCCG
+GATCAATCTCCTTCCGCGCCTTCCCGTTTCCATGCGGTCACAGTGGCGAACATGCGGAATTTGTCCCCGGGTACAGCGGC
+GGGCCCGTTCCGGATTGTAACCGGATTCCCTTTTCATCCGTGGCGACGGACACCTGAACTTTGATGGGCCTCATCGTACC
+TGCAGGCGTCGATGAAGTCAAGTCGCAAGTCAAGGACGGGCCGGGAAAAGCGGCCGAAAGTCAAGGATGAAGGGACGGGA
+GAATGGGGGAATCGTTCAGCCGAATTTCCGGGCCGCCGATCGTCGTTGCCGTTAGAATTCGTTCTCGTCGTTCAGGTTAC
+GGGGATCCATATCCACCAGAGGCGGCAACAGGGTCTTGACCTCGGCCACTGTCCATTCCGGCTGCCCGGAAAGGGTGGCG
+GCATCGATCCGGTTCAAGGCCCGGGCGATTTCGTCGTAACTCTTGTGGTTGCGCCGTAACCGCAGGATTGAGGCGGTGAG
+TT
+>generic751
+ACTCACTGGCGCCTCCTGCGCTCGCTCGCGAACAGCGGGAGCTGGCCCGGGTTGGAGATCACCCAGACCACCGCCTGCCG
+GCCGCTGCGCGTGGCGCGGGTCCTCCCGCTGTCCCGGATCAGCCCGTCAACCGCCAGGTAGATGCGCCGCGGGCGTTCGG
+TCGAGGGGTTGAGCCCGAGCAGGTCGGCGATCTCCTCGTCCGTGAGCCCGCTGGCCCCGGCCCGGTCGATGGCGTCCAGC
+ACCCGGGCGCGGTCTGTGGCTGCGTGCGGCTCAGCAGACACCGCGGCGGCCTCGCTCGTCGCGCTGCCAGCGATATAGGG
+CAGCCCACTCATGCCTCGGCCTCGATGACCCACCCCTGCGGCGTAAGCCGTGCCCCGGGCATCTGGCGCAGCACGGGGAG
+CACCAGCCGAGCCGGCCGGCGCAGCACGCGGCAGATCTCGCGCAGCGTGGTGGGGCCACGGCCGCAGGCGACGCGGACGT
+GGTAGGCCGGC
+>generic752
+GTGGGATGCAAACCGGCGGCGGTTGGGGACGCGCAGTTGCGGTTGGCGCACTGAGCGCGTTGATCGCAGGTGTGCGACCG
+CAGAGCGCCCCGGCGCTTGTGCCGCTGGCGTTGCTGACGTTTTGGAGATTCGAGCACCAGCGGCTGAGGCATTTGCTTGT
+CGCCACGGTGGTGGTGGCGGCGCTGGTCGCGGCGTGGGTGGTGCCAATGCTGCGGTTGTCCGGGGGGCTGGCGTTGTTTC
+AACAGATTGTGCACTTACACGCACAAGCGCACGCACAGGAGACGGTCCTTGGGGGAGGAGGATGGCATGCGTTTTGCGAC
+AACGTCGTGTTGGCCACACACTTCTGCTGGTCGGGTATGTTTCTCGGTTTTGTGGCGATCGCTCTCGCGCTGTTTTACCG
+TGTGACGTCGATCGACCATAACGTTCGGCAGCGATGGAACAAGGCATACGGGTGGGCCTTCGGCACGTTGGCCGCGTGGG
+TGGTGCCGATGATT
+>generic753
+AAGTGGTGGCCGGCCAAGCCACGCTGAATCCCGTGGCCGCTGCGGCCAGTCTGGTGGTGAATCAAAGCAGCCCGCGCGCC
+ATCATCCAGTGGGACAGCTTCAACATCGGCACCCAAGCCAGCGTCACCTTTGTGCAGCCGAGCAGCAGCTCGGTCGCCCT
+GAACCGGGTGGTTGGAGCCGAACCTAGCCAGATCTTTGGCCAGCTCAAGGCCAACGGGCCAAGTCTTTCTGGTCAACCCG
+AATGGCGTCCTCTTTGCGCCGGGTGCGCAGGTCAATGTGCATGGCCTCTTGGCCACCACCATGGATACGCTCGACGCCGA
+CTTCATGGCCGGCACACCGCACTTTGCGGGCAAAGCGGGGTCGGTGCGCAACGACGGCTCGATCCACGCGGATGCTGGCG
+GCTTCGTCAGCTTGCTGGGCGGACTGGTGACCAACACAGGCGACATCGCCGTGGTCAACACCAACGGTATCTTGCCGG
+>generic754
+GTGCTTGCCTTTTAGCTTATTATTCATAAATTAAATAAGCTGTTTTGTTCAACTTTTTCTAGGATAATTGGTAAATCATC
+ACCATATTTTTCTGAAAGTTCCTTTTAAAATCATCTAGCGCATTTTCGTGATTTTGCAAAACCATTGTTGATGATTTTTC
+AAATATTCTTTGCGTATTTCACTATTTCTAAGGTCATTTGGAATACGCTCCATTCTTGGGTCAATACTATCAAAACCATT
+AAAATTAGCTTTAAGTCTAGCTTGTGTCATTTGAATATAATCAGGATTTATTTCAAAACCCAATCGCAATTCTTTTTAGT
+CTGTTGGCAAACCCGCAAAGTTGTACCACTCCCTGAAATGGGTCTAAAATAATATCTGTTTCATTACTTGAAGCTAATAC
+CATGCGCTCAATTAAG
+>generic755
+CCGCAGCCGTCGATATCCCGATGGTGCTCTACAACGTGCCAGGCCGATGCGGCGCGGACATGCTGCCCGAAACCGCCATG
+CGCTTGGCACAGATCCCAGGCATCGTGGGCATCAAGGAAGCTACGGGCAACATTGAGCGCGCTTGCTGGCTGATCCGCGA
+GGCTCCGGCTGACTTCGCGATCTATTCAGGCGACGACGGTACGGCTGTCGCGTTGATGCTCTTGGGAGGACACGGCAACA
+TCAGTGTCACCGCCAACATCGCACCACGTGCTATGGCCGATCTGTGCCGCGCAGCCTTGGCCGGTACGAGTGGTGT
+>generic756
+ATGAGCGCAGTCTCAACATCGACTTTCTGCTTGGCTATCTGCGGCAAATCTTGCCGCGCCGGCCCGATCTGAAAGTCGTG
+GTCACCTCGGCCACCATCGACGCTGACCGCTTTGCCCAGCATTTCGCGTCCGCCAAGGGGCCAGCCCCGGTGATCATGGT
+CAGCGGTCGGACTTTCCCGGTTGAGCAGCGTTGGCGGGCCTTTGAAGAAAGCCGCGAGTTTGATCTGAACGACGCCATCG
+CCGACGCGGTCGATGAACTTTGGCGCGGTCCGGGAGGTGGCGATATCTTGGTCTTTCTGCCGGGGGAGCGCGAGATCCGT
+GAGGCCGCTGACCATCTGCGCAAGCACCTCAGTCACCAGCCCCTGAACCGCAACGCCCAGATCCTGCCGCTTTTTGCCCG
+GCTCTCGCAGGCGGAGCAGGACCAAGTGTTCGAGACCGGCCACGGTCGGCGCATCGTGCTAGCGACCAACGTCGCCGAAA
+CCTCGCTCACGGTGCCCGGG
+>generic757
+GCCGACTTGTTGGCCGCCTTCCGACTGGACGCGCAAACCACCCGTTTATTCCGGGACGGTTTGAGGCAGGCGGGATTGGG
+TTGATCCCTATCGCCTCAATACCCCACCCGAATCGCCGCGTTGAAACTCAAGGGGCCCAAAGCGGTTTGGACGCTGGCCA
+GGGTGGTTAAGTCGTCGGTGAGGGGCAGGAGTTGGCCGGTGGGGCTGAGGCGGAAGCTGCGGGTGGCGGCGACGGTGGTG
+GTGTCGGGCAAGTTGAGGAACTGAGCGCTGAAGCTGTCGGCGGCCGTGGTGGTCCAGAGGATGTCGTGGGTGGTCTTGGG
+GCTGGTGCCGCCGGAGCCATCGGTGAACGTGCCGCCCAAGTAGGCCAAGGTACTCGGGTCGTAGGTGCTGACGTCGGTGT
+AGAGCTGCGGCACCGTGTTGCCCGCCACCTGTGCGGTGATGGCGTAGACGCGGGTCACTTCGAGGCTTTGCTGGGCGGTG
+GTCCGGGTGGTTTGGGTCACGGTGCCGGAGCCGGTGATCGGGTAGCTGCCCATCACCATGTTGGAAGCCGT
+>generic758
+GGCGGGTGATGTCCTGAGCTTGGCCGTGACCGATGCGGCCAATGCCCCGATCACGCCCACGGGATCGGTCATGCTGACCC
+AAGCCAATCTGGGCGGCAGTGTCAACTTCACCGTACCCGCTTTGGTCAACGGCACTTACAGCGCCACGGCGCAATTGACT
+GATCAAGCCGGTAACGCTTCAGCGGCTTCGACCGCCGCACCGTTCTTGGTGGGCGGTACGTTGCCCGCCGCCGCAACGAT
+CAGCTTGGTCAGTGATACGGGTATCTCGGCCACCGACCGCATCACCAGCAATGCAGCCCTGACCATCGTGGTCGATCCGG
+CAGCGACAGCAGCCGGCGTGAGCTATGTCTTGGATGGCGGCGTACCAACGACCGGCTACGCCGCACCGACGCTTGATGGC
+CTGCATACGTTGGTCATCAGCAGTGCCAGCGGCACCGTGCCAGCCGCACGAGTGG
+>generic759
+CAAAAACGCCGATTATTGAAACGATTAAAGCGCGTTACCCAGCCACGGTTAAATTGGCGTTGTTGGCGTTGTTAATCGGT
+ATTTCTATTGGCGTACCCATGGGTCTTTATGCGGCGCTTAAAGCAAATCACTGGCAAGATATTGTGGTTACTCTAGTATC
+CGTGCGTCTCTCAGCCATGCCAGCTTTTTGGCTTGGTCCTATGTTGATGCTGATATTTGCCGTCTGGCTAGGCTGGTTGC
+CTGTAAGTGGTATGGATTTAGGCGCGTCAATTATCTTGCCTGCTTTGACTTTAGGTTTTGGCTTAAGCGCAATACTTACC
+CGTATGACGCGTACCAGTCTGCTTGAGGTGTTAAATGATGATTATATTCGTACGGCACGTGCCAAAGGGCTGACAGAACA
+AGCAGTGATTCTGCGTCACGCTTTACGTGCTGCATTGCTGCCGATTATCACTATTGTCGGCTTGCAGATGGGCAGTTTGC
+TAGCTGGCACGGT
+>generic760
+GTTCGAGTCGAGGAGGCTGGCAGCTTTCAGCGCGGTGTGGATGGCGGTCGCGTCGGCCGCGGTAAAGGTGGCCGAGTTGA
+GGCCGAGGGCGAGGAAGCGGTTGGGGAGGACGGGCGAGGCGGCGTTGCTGGCGGTGGCGGTGGCGAGGCCGCGGCCAGCC
+ATGAGCTGGGAATTGTTGCGCGCGGTGGTGTTGCCGGTTGCGCCGAGATTTTCGTCGTTGGCGGCGAGCGCGAAGAATTG
+GGACGAGTGGTGT
+>generic761
+CTTTGCACCGCATCACTTTGATTACGTGGTGATTGACGAGTTTCATCACGCGGCTGCGGCCACCTACCGGCGCTTATTGG
+GCCACTTTGCACCCTCATTTCTGCTGGGCCTGACTGCCACCCCAGAGCGCACCGACCAGTCCGACATCCTCTCGCTGTGC
+GATGACAACCTTGTCCACACCTGCCAGCTCTTTGATGGCATCCGTGCTGGTCTGTTGGCACCGTTTCACTACTACGGCAT
+CTTGGACGAGTCGGTCGATTACGACGATGTGCCATGGCGCAACGGCCGTTTCGACCCCGATCAACTTGTCCATAAGCTGG
+CAACGTTGGCGCGTGCCCGTCATGCTCTGAAGGAGTGGCGAGAACGCGCCCAGAGCCGCACATTGGCTTTTTGTATTTCG
+CGTCGCCACGCTGACTTCATGGCGGCGCAGTTCAGATTGGCGGGGGTGAAGGCGGCGGCGGTGTATGCCGACTCCATTC
+>generic762
+CCTGCCCCTGAATCACCTTGAGACCGAGCTGCGGCCCGCCATCGTGGCCCGTCTCGGGATCCCGGACGCGCTTTTGAGCA
+CCTTCACGGTCTTCAAGCGCAGCTACGACGCGCGCAAGAAAAGCGCCATCGTCTTGATCTACACCATCGACTGCGCCCTG
+AGCACCGAGGCTGATGAGGCGGCGGTGTTGGCTCGGTGGGCCGCCGATGTGCACATTCGCCTCACCCCGGACACCGCCTA
+CCGTTTTGTCGGCCACGCGCCAGCGGACTTTCAAGCCGAGGACCGGCCGCGTCCGGTGGTGATCGGTTTTGGGCCGTGCG
+GCATCTTTGCGGCGCTGATTCTGGCGCAGATGGGACTGCGCCCGATCGTGCTGGAGCGCGGCAAACAGGTGCGCGAACGC
+ACCCAAGACACCTGGGGTTNTGGCGCAAGAAGGTGCTCAACCCGGAGTCGAACGTGCAGTTCGGCGAGGGTGGGCC
+>generic763
+ATGACCGGGGCCTACACACGCCGCGATGGCAAGGCGGCGGTGGCCGAGACGCTGGAGAAGGTTTACGCCTACTTCCCACG
+TCTCAAAACCCGCCGCACCAGCCAAGCGGCCTACACCTCGGGCGGCGAGCAGCAGATGTGCGCCATCGGCCGCGCGCTGA
+TGGCCAATCCGAAGATGGTGTTGCTCGACGAGCCCAGCATGGGCCTGGCGCCGCAGATCGTCGAAGAGGTGTTTGAGATC
+GTCAAAGACTTGAACACCAAAGAGCACGTCACCTTCTTGCTGGCCGAGCAAAACACCAACATCGCCCTGCGCTACGCCGA
+CTACGGCTACATCTTGGAAAGTGGCCGCATCGTCATGGACGGCGAAGCCAAAGCACTGCGTGAGAACGAGGACGTCAAGG
+AGTTCTATCTCGGCGTGGGCGGCGGTGATCGGAAAAGCTTCAAAGACGTCAAGAGCTACAAGCGGCGCAAGCGCTGGCTG
+GCTTG
+>generic764
+AATTGAGATTATTAGATAATTATCTTATTTTATGAGCTTTCTTTATTTGAAGAATCTAGAATTCTATACTTTGCTCGTTT
+TGGCTCACAAAAACATTAAAGATAATTCATATAGCTATCAAACGAAGATAAATGCTCTGCAGTAATTCTCTGTTAACAGA
+TTTCTTGAGTAACTGTCTACGGACTGAATCCCTGATGGGATTAGCAAGGAGAAGTAGTATTAGATTACCATTCAAAGACA
+TTTGAAGTAATATAAGGTGAAGCACTATTATTATTAGTGATTTTCTTAAAACCTAAATTGGAATTCATGGATGTTATATA
+TTTCAAGGTAGCCGATGATGATTAAGTAGAAACTGATGATGAGGCTGTAATAAGTCGGACTCTAGCTTC
+>generic765
+GGCCAGCATGGCCCCGCGCTTTTTGCCGATCACCACCAGCAACTCGGCCGCATTGAGGGCGCTCAGATCAAGCTTGCTCG
+GGTCGAGTTTGTAGCGCGCCTCAATCTGGCCTGGATAGTGCTGGCGCACGTAGCCCAACAAGGTGGCGGCCACCACATCT
+TCGTCCATGGCATTGCGGCCCACCGCGCCGCTGGCGGCAAGGTTCTCACCGCTTTCGGGCACGGTGATCTTGGGCCAGAG
+CATGCCGGGGGTGTCGTAGAGATAGAAGTCGGGCGCCAAGGCGATGCGCTGCTCCAGCTTGGTGATGCCGGGCTCATCGC
+CGGTTTTAGCGGCCCGCTTGCCGACCATGGTGTTGATCAAGGTCGATTTGCCCACATTGGGGATGCCGCAGATCAACACC
+CGCATCGGCTTGGCCATGCCGCCGCGACGAGTGGTGT
+>generic766
+TGACGCCGTGGGTGGCGCAGAGCTTGGCCAAGGTGTGCAGGGCACCGTCCCAATCGCGCCGGGGTTCGTGCGGGTAGACC
+GTGGCGGTATCAAGCACCTTGCCGGTGTCACTCACCACCGCGACCTTCACGCCGGTGCGGATGCCGGGGTCGAGTCCCAT
+CACCACCCGCTTACCCGCCGGAGCGGCCAAGAGCAGATCGCGCAGGTTTTCGGCAAACACCTTGATCGCCACGCCTTCAG
+CGGCTTCGCGCAGCCGGGTAAAGAGATCGCGCTCCAAGCTCAAAGAGAGTTTGACCTTCCACGTCCAGGCGATGGTCTTG
+CGGATCAAGTCATCGCTGGGCCGCTTGGCATGGCTCCAGCCCAAATGAATGGCGATCCGGCCTTCAGCCATCGAGATTTG
+GCCGGGCATCAAGACTTCATCGATCACCAGCTTGGCGTCCAGCATTTCCAGGGTGCGGCCCCGAAACACCGCCAAAGCGC
+GGTGCGAAGGCACCCGCTGGA
+>generic767
+AGCGTGTTGTCACCGTCATGGATTTAAAAACCCCAAGTTCTGGCGAACTCAGTAAAATCGCTATGAAAACATTACTTATT
+TACAGCTTAAAGATCAGCTCAAATTTGTGATTGGCACAGTGGAAGATTATGATTGGGCTAAACAAATGCTGGTGCAATAT
+GATTTAACTAATCGCTGTCAGGTGTTATTTTCACCCGTGATGGGGCAAATGTCGCCAACCACCCTTGCGGAAAAAATCCT
+TCAGGATCGGTTATTCGTCCGCTTTCAAATTCAACTTCACAAATACCTCTGGGATGATGCTCAAGGTAAGTAACTCATGC
+AAAAAAAGCCCTTATCTTATTGTCTGGTGGTTTAGATTCGATTACCACACTGGCATTGGCACAAAAACAAGGTTTTTTGT
+GCTATACCCTCAGTTTTAATTACGGACAGCGGCATAATGCCGAATTAATTGCTGCGCAAAAAATCGCCACAGCCTATCAA
+GTCGCTGACCATAAGATTATTCATTTAGGTTTAGATGCGATT
+>generic768
+AATTGAAGTATGAATTCGTGGACACGCTTTCGGCCATGATGGTGGGATGGGCCATCAACAGCGCCATGATCCTGGTGGCG
+GCCGCGGTCTTTTATACCCACGGAGCGGGGGTCACGGAACTCTCCCAGGCCCAGGCCACGCTCAAACCTCTCTTGGGTAA
+TGCGGCCGCGGTCATTTTTGCCCTGGCCCTGCTATTCTCCGGGTTTTCCTCTTCCATTACCGCGGGAATGGCCGGGGGAA
+GCATCTTTGCCGGGATTTATCAGGAGCCTTTCAACATGGCGGACCGGCACTCCAGGGTCGGGGTCTACCTTACGCTGTTT
+GTGGCTCTGGGAATCATCCTCTTCCTCCGGGACCCGTTCCAGGGCCTTCTGTGGAGCCAGATCATCCTGAGTATCCAGCT
+CCCGTTCACGGTTCTTCCGCTGATCCTCCTGACCTCCTCCTCCAAAGTGATGGGGAAATACGTCACGAGTGGTGT
+>generic769
+GTCAATGAAATTTAGAGTCAGCGCGGAAGCATCACCGTCCGCCTCATCATCACCCGGGAAACCAGCTTTTCGAACATTCT
+CTGCCTTGCGCAAGAGCTTAGCTTTGAAAGCCAGAAGGTCTTCGAGGCACTCGTTGGAGAAACTCGCCGGAAGCGCACCT
+TCGGCGACACGCGAGAGAAATTCATGTCGGATGGGCGTAAGGTCAAAGGCTACCGAATTGCTTTGCCCGAGTGCGAGTGA
+GATGTCGATCTGCGGACGGCTTGTTACCTCATCAAGCTTGATGGTCATACCTACCCCGCTCTGCCTGCGCGATGGCGTTT
+CGTGGTGGCAAAGCACGCTTACTCGGCTTTGTGTGAACCCACCTGAACTCGCAATGAAGATGCGATCGACATTCTCCAAA
+AGCAGCCCGGTCATAACTCGGTTGAGGCCGCGAACGATACGCCCACGCGTAGCATCGCTTACCGG
+>generic770
+GCCTCTGCAAAAGCGGGTGGAAAACGTTACGAAGGCATTTATCTCAAGACCAAGGTCAGCAAGCTGGAACCCACCAAGGA
+AGGACTGCGCGCCACCTTCGAAGGCGACGGCGCGCCGGCCCCCAGGTCTACGACCGCGTCCTGCTCAGCGTGGGACGGCG
+CCCCAACGGCAAAACCATCGGTGCGGAGACCGCCGGTGTGAACGTGAACGAACGGGGATACATTCCCGTGGACAAGCAGC
+AGCGGACCAATGTGGCGCACATCTTCGCCATCGGAGATGTTTGCGGCGAGCCCATGCTGGCGCACAAAGCGACCCACGAG
+GGGAAGATCGCAGCCGAAGTCATCGCCGGCCACAAGGCCTCGTTCGATGCGCGCACCATTCCCGTCGGTGGCATACACGG
+ATCCGGAAGTGGCCTGGATGGGCCTCACTGAAACTGCAGCCAAGGA
+>generic771
+CACGATTGAAATCGTGGCCTTGATGTTCCAGAGTTTGCTCACCGAAGAACGTATTCCGGCTCAAGTCCGGGTCTGGTTTG
+CCCGGCTGCAAATGCCGGTGTTACGCGTGGCGGTGGTCGAGCCCGACTTCTTCGCCACCATCGACCATCCGGCGCGCAAG
+CTCATCGACCGGATGGGCTCTTGCGTGATGGGTTTCGAACATGGCTCCAGCGGCACGACCGACTCCCTTGAGAAAGAAAT
+CAAGCGAGTCGTGCAAGTCGTTGAGGCTTATCCCGACACGGGCCGGCGCGTCTTCCAGACGGTGTTGACCGAGTTCGAAC
+GCTTCATCGAAGAGTATTTCAAGAACGAACATGCAGCCGCCCACAAAGGCGTGTCGCTGGCCCAGCAGATTGAGCAGCGC
+GAAACGTTGGCGATTCAGTTCACCATCGAAATGCGCAAAAGCTCAACGAAGTGCCGGTGCATGACGGCGTGCGTGAGTTT
+CTCTTCCACGTCTGGGCCG
+>generic772
+GTTTTGGTGCCTCAACTCATCGCACGCTGGGAGCCGACGCTTCGGGTTCAGGTGTCTGGCTACTTTCTGCAGCGCATGAA
+AACCAAGTGGGGCAGTTGCAACCACCGTGCCCGAAATATCCGGATCAACACGGAGCTGGTGAAGAAACCGAAGGATCTGG
+TCGAGTACGTTGTGGTTCACGAGATGCTTCACCTGCTGGAGGCCACCCACAACGAGCGCTTCTTCGCACTCCTCGACCAC
+CACTGGCCGACATGGCGAGAATCCCGCCGGGAACTCAATGCGTTGCCGCTGGGCTCATTCACTCCAACCGATAACCCGTG
+TGGCAGGCCACGCATTGTTGGGTGACGGCGGCCAAGGCGGCGAGGACGGGTTGGGGGTTGTTGCTGGCGCTGGCGTTGGC
+AGCTTCGGTGGCGAGGCGGCTGGCCGATCGGTGCATGGCGCTGCCGATGGCTTGCATGCCTTCGGGCATGTGTTGGGCCA
+CGTGGTGCGCGCC
+>generic773
+ACACAGTACAAGCGTCACAGATACGAACAGGAATGCTTGATTGACAAAGGTTACGTAGGGCTAACATCCGAGTTCCGGAA
+ATTTTACTACCACGATGATTGTTGGCGGCCTGAGCTAATTGACGTGTTCCGGCACCCCTACGTGAAGGCCAGTGGCTCTA
+TGAGCAGCTACAACTGGATGAATGCATATCTGTAAGCAATCCACACACCCCCTTTTTTTATCTTTCCGTGAAGCTGATGT
+TCATTATGCCCTCTCTCAGTAATTAACCAAATTATCCAAGTTCTTTATTTTACCCATATATAAAGAAAATATTAACGTCT
+TACTTCCCTCTCACTTCATTCCTCGTTTCA
+>generic774
+GCCGTGGCTTCCGGCGCGTCTTCGTCGATCTGCTCAGGGTTGGGAATGCGCGGCATACAGCATGCACAGGTGCTCACCGA
+TGAAGCCGAGAGCCTGAAAGCGTCTCTCCTTGTCGTCCTGGCGCAGATCTTCAACGATCAGTGCCGTGCTCCAGTCGAAG
+TCCGCTGCAAGCTCGAAGGGGAATCGGTCGGTTCATCCACGCCGTGCAGCGCAAACACGTTCTTGGCAAGATCGATTCCA
+CCAAACACAATAGCCACGGGACTCTCCTTTTTGAAACGAGCACGTATGAGATTTCGTGACCCCATCGTCTCACCCCGGAA
+CGGGGATGTCCCTTTCATTCGTTAGGCCCATGCAGCAGTCAGCTCAATTTTGCAGGCGTTGCGGCGAGAACTACGAGGCT
+CCGCTCGTGACTCTGCCCGTTCTTATGCAACTTGGGAAACTGGCCCCCCAAGATAGACCGGCCGCGTTAGCTCGACTCAA
+CAGTTCAACAC
+>generic775
+CTCGAATACGATGCCGGCTGCTGGATCGGGCGCTTCGTGGTCCAGCACCAATCCACCTTGCCCAACACCGCCACCACCCG
+GTTGCTGTTCCAGTTGGAACTGGTCGGCCTGTCGCGGCTGGGCCAGAACCCCCTTACGGTGTTGAAGGACAATATCCCCG
+GCTACCGCTTGCTGCGTGATTTCGGTACGACCCTGGGTACCCCCAGCTCAGCGCCCTCGTCCCCATCTTCCCCGTCTTCC
+TTGCCTTAGCCTGCCTTGTCCCATCCATGACGTTGCCCCTGTTTATGTCTGAGCTGCTTTGCTGCCCCCCAAAGCCCCGC
+CGACCGCTGCGGGCGTTGTTGGCACTGACCATGGCGGTGACCAGCCTCACCATGGTCATGGCCGCCGAAGCGGCCCCCGC
+CGCCAAACCGGGGGTCACACCGGTCCCCATCGTCACCGGAGCGATCCGCCAAGAAGGCGACTTCATCGTCGCCGTGGTCA
+ATCAAGAAGTGGTGACCAACGCCGAAGTCGAAACGCGTCTGTTTCGGATCTTGGAT
+>generic776
+GGGGTCCTTGAGGAGGATGCTCAAGAGCTGGCGTCGTTCGGCTTAGACTTTCACGTTCAACTGCACGTCTTCGTCAACTC
+CGGTCTATGATGATATTCGGAAATTCGATGGCGGCTTTACCTTTTCGTTCTTCCCTTTTTCTAGAAGAATTTTTTCTACT
+CCGCCACAGCGGCACCACTACCACCACCGGCGGCTGTTTTTGTCCCCGAAACCGATGTCTTCACCGATACAGCTGCTACT
+GTAGATTCAGGAACAACGACAGGCGTTGATACCTTATTTAGCTGCGCACTCGAAATCTGATGCTGCGGTGGGTGGCTCTA
+AATGTCCGACATGGCAGATTGATTGCTCAGTGAAATATTCACATTATTACCTGGCTTCATCATCTTCCCTCCCGAATTCA
+TAGGTGTCAGCTTCAAGTTGTATTGACTGTATTTCTAACGCAATGCGTCTTCAGAACTCTTAAGCCCTGGACTGCTGTTT
+TTCGGGGAGGATATCATCGCCTTCTTC
+>generic777
+AACTTCCATGCCGCCCGCTGCGGCAGCAGGCTGACAAGAATGCGTCCGCCATCAAGGGGCAGCAGCGGCAGCAGGTTGAG
+AACCATGAACATGCCGTTTACCGCAATGCCGGCCAGCGCCATCTGCCGCAAGGCCTCGGAAAACTGAAACTCTGCGCGGC
+CCATCACCAGTTTCAGCAACGTTGCCCAAGCCAGCGACCATCAGCAGATTCGCTCCCGGCCCCGCCAGCGCTACCCATAG
+CATGTCTTTTTTGGGATTGCGCAATTTGCCGAAATTGACCGGCACCGGCTTGGCCCAGCCGAACATGAAACCGCTCAACA
+GATAGGTCACTGCTGGCAGCAAGATCGTTCCCACCGGGTCGATATGGCGCAGCGGGTTGAGACTGACACGACCGAG
+>generic778
+CATCAACGGCGAGAGCTGGGGCGTGTACGTCAATTCCGAGCAGTTCAACAAGGATTTCGTCAAGGAATGGTTCGGCACCC
+GGAAAGGCGCCCGCTGGAAGGTGCCGGGCAGCCCCATGGGGCGCGGGGGCCTGGCTTACCTGGGCGACGACGTGGCCCCC
+TTACAAGCGCATCTATGAGATCAAGTCCAAGGATGATCCCAAACCCTGGGCCGACTTGATCAAGCTGTGCAAAGTCCTGA
+ACCAGACGCCGCCTGACCAACTGGAGCAGGCCCTGGCTCCGCTGCTGGATATTGATGGCGCGCTGCGATTCCTCGCCCTT
+GACAACGCCTTGATCAACGGCGACGGCTTTTGGACTCGCGCCAGCGACTACGACATTTACCAGGACGAAAAAGGCCGTTT
+TCACTTCATCCCTACGACGCCAATGAAACGTTCAGCACCCCTGGCGGGCCCGGCGGACCCGGTGGTGTTGGGCCGGGCGA
+TGATGCTGGCCGGCAGATGCTCGCCACGAGTGGTGT
+>generic779
+AACGCGGCGACGCTCGACGAAATCGTCCAGGCATTTGGCCGTGTTGCGGCTGACGGTGCTGCACGCGCCCTGCTGATGAC
+CGGCGCGGGAGAAAAAGCATTTGTCGCCGGCGCTGATATTGCGGCGATGAAACCGATGAATGCGCAGCAGGCCTTTGCTT
+TTTCCGAAGCCGGCCAGCACGCTGCACGCGTTATCGAAGAACTGCCGGTGCCGGCGATCGCGCTGGTCAACGGTTATGCG
+CTGGGCGGCGGTTGCGAACTGGCGCTCGCCTGCGACTGGATGATCGCGTCCGAACGCGCCGTGTTCGGCCAGCCCGAAGT
+GAATCTCGGCATTCCGCCGGGCTTTGGCGGCACGCAACGTCTGGCGCGTCGCGTCGGTCGCGCGCTGGCGATGGAACTCG
+TCACGACGGGCCGGCAGATCAAGGCCGACGAGGCGTTGCGCATCGGTCTGGTCAATCAAATGGTCGCTGCCGATGCGC
+>generic780
+GAACTCAATACCTTGGCCGATGCGGTTCGGGCCACCGCCCAACACCATGATCTTTTTCTTGGTCGTAGGTGCCGCTTCGC
+ATTCACCGTCCGAGTTCTCGTAGCACGAGTACAGATACGCGGTTTGCGTCGCGAATTCGGCCGCACAGGTGTCCACGCGC
+TTGTAGACCGGGCGCACACCCAGCGCATGACGCGCACGGCGCACCTCGTGCTGGTTGGTGCCCATCAGCTTGGCCAAACG
+GCGATCCGAGAAACCCTTCTTCTTCAGAAAGCGCAACTCGGCCGCCGAGAGGCTAGCGACCGAACGGTCCTTGAGCTTGG
+CTTCGGTGGCGATCAGATCTTCAATCTGCGCCAAGAACCACGGATCAATCGCGGTTTCTTCGAAAATCTCGTCCAGCGTC
+ATGCCGATGCGGAAAGCATCCCCCACGAACAAGATGCGCTCCGGGCCGGCTTCGCCGATCTCTTCGATGATCTCGTCGCG
+GTCCGATGCCTTGC
+>generic781
+GGGGGGTAGGACTAAAGGGTAGACAGGTGCTGATGGTGTATTATCATACTTTGCCAGCTCTGTTGACGTGTAGCCCATTG
+CTACCGCTTGCTGATACGCAGTACCACCATAGACCATTGCCTGTTCGGTTGGATCTTGAATGATATAACCTGCCGCCATA
+CCTGCATAAACGTTCAGACGGGTAATACCTTCGGCGTGATCATGATAGAACATCAAGCGCGCACTTTGCTGGTTGGTGAA
+GTAGTAGGTCAATGATCCGTCACCAGGATTATTGATGGCATTGGCAGGCAGCTTGGTTTGAGCTTGAGGGTTGCCTGCGG
+CATCTGGGGGCATCGAACAGCTAGCGGTAACCGTTGCGCTACACTGCGGTACAACGACTCCACTCACAAAGTACATATCT
+GGCACGTCGCGTGCGCTCTCGCCTTTGTTGGGAGCTATTTCATTCACTGGCTTAACGGTCTGACGCGGCGTACCATC
+>generic782
+GTTTGATAATACAACAAGGTATTTTTTACCGCTTTCACCACCGCTCTGGGCGTGATGGTTGCACCGCTGAACTGGTCAAA
+ATAGCCGCCGTCACGTTTAACTGTCCAACTGGATAACGCCGGAAAAGTAAGCGATTTCCCGTTGAAATTCAATAACCAAT
+CAGAGCGTTCACTTTCAATTTTATCGCCTAATCCGGGCGTTTCCTGATGCGCAACGACGCGCACACCAACCAATTCGCCA
+TTTTGTTTAATCGCCACTAATAAAGCGATTTTGCCGTTGTAACCTTCCGGCGCAGCACTGGCAATCACAACTGCCACCGG
+CTGATTTTTATACCGCGCCCGATAAACAGTGGTCGGCAAAGTATTTCCCAATTCCAGGTTCGTGACTTCAATGCGGTCAT
+TCACAATATCATTATCGTAAAACGTGGCGGGTAAAACCTGCTGCAAGTTTTGTAACAAGGCAAGGCGTTGGTTATCGGCA
+ATTTTTGCTTTGCTGACATGAAAAACCAGACTCACCAGACTAATTCCAACAAAAGATAAAAT
+>generic783
+TATTTATACACAGGGGTTTTTTTTCCATTAAGTATCGGCACCGCCGTTTTCTACGGCGGTAAATTCAATTTCCTACATCG
+GGATTGAATCCGGCTGTCGCCACACTTTTCTACCGTTCCCCTCTGCATTTCCGCCAGCAACGCCTTTTGGGAAAGCCGCC
+GCCGCCAAGCCTAAGGCCGAAGTTTGCAGGAATTGCCGCCTGTTATAATTGCTGTGTGTTGTCATAATTCCATTCCTCTC
+GATTTGTCTATAAATAAGCAAACGCTAACTTACAAGACGATACGCTTTTTTCTACTAGGGTTTCAATAAAAGTACTGTGG
+CTCACCGATGTTACGCAGCAATCAGTAATCATTTAGCGTAACGGCAGAATTTATGCGGGGTGTTTAGCCGTAAAAAACAT
+AATACGACCGGTCGTCTTGAAAAATAAAGGCAGTGACTAAAAAACTTTACGTGTTTTTCGTCGTGTTTCGTGGACAAT
+>generic784
+GCTGACTTCTGGAGGTGCGCTAGGAGATGGTGAGGCGGAATAGGACGGAGATAGGGATGATGATGGAGACAGTGATGGTG
+AGGAGGATGGGGTTAGGTCAGCTGTACCCAACCCGATCAGCGCCCCACGGCGCAGGGTGAGCAGGTTCCCCATCGGGTCG
+GCGGGAAGTTGGTTGGTCACGATCACACACCGTCCAGTACTACCCGAGTAGTAGTATATCCCGGCGATACTGAGTTCCGC
+TGCGGGCGCAATGGGTGGGATTACGTCTTGGACCAATACGGTTACGGGGTCGGAATCAGTTGCGAATACCAGCAGTTCAC
+CAAACACATAGGGCGCGGTGGTACGGACTTCGACTGAATATCGGGTGGATAGTACTGGGTCTGGGTGTACTGATATCGCC
+GTGTCCACGATAAACGTAGAGTAGTCGGTAATCGCGCCCGCCGACCCCGCATGAGTCCAGTTGACCGCGAGACCCGTAAA
+GTCCGACGAGTGGTGT
+>generic785
+AGCGGTACTCGATTCGGTCCGAGCGCTGATTCTCGTCTTGGACCGGCAAGGTCGGATCATCCAATTCAACCATGACATGT
+GAAAGAATCACGGGATATAGCTTCAAACAGGTTAGACGGCAAAAAGTTCTGGGATATCCTATTCTTGCCTGATGAAGTCA
+GGTTAGTGAAAGATATTTTTGAAAGGCCGACCTCTCGATCATTGCCGTCGACCTATGAAAATTATTGGATAACCAAGGAT
+GGCAATCGGCTGTCTTATATCATGGTCTAACACGACTTTATTGATCATAATGGTGAACTTGAATATATCAGTTATTACTG
+GCACGGATATCAGCGAGCAGAAACGAATAGAAGTAGAGTTTCATGAAAATGAACGTTTCTTGCCAATATATTCAACTGTA
+ATTCGAGATGGCATCAGCA
+>generic786
+CTCAATCCACCCTACAAGAAATCAACAGCCATTCAGCCCACCGATTGGCTTTGCGCTCTGTGGGCATTGAGACGGTCAAT
+CTGTATTCGGCTTTTGTAGCGCTGGCTGTGGCTCAGGCCGCGCCGGGCGGTCAGATCGTGGCGATCATCCCGCGTAGCTT
+CTGCAACGGACCGTACTACCGCCCTTTTCGGGACTTCATCCTTGAGCGCTCAGCCATTCGGCACATGCACCTCTTCGACT
+CACGCAGCAAGGCCTTCAAGGACGATGAGGTGCTGCAAGAGAACATCATCATCCGCCTTGAGCGTGGCGGCCAGCAGGGA
+CCGGTGACGATCACGACTTCGACCGATGACAGCTTCTCGGACATGGTGACGAACGAACACCCTTTCGAGCGGATCGTGTT
+CCCGAATGACTCCGAGCGGTTTATCCATGTCCCCACCACGACCGAGAAAAGCGTCATCGAGCGGGTTGCCGCCGTGCGTT
+ACAC
+>generic787
+CGCCAACCCGCACTGCACGTGGATTTCAGCGCCGGTCTGGCCGCCTTGCAAACCACCGACGCATCACTGGCAGGCTTGAT
+GCTGCGCGCCGACCGCGCCCTCTACCGCGCCAAAGCACTGGGACGGGGTCGGTTAAGTTGCGACGACTAACGCAGTCAGA
+GCCCCTGCGCCACAATAGCGCGCATGTCCACACCGCTTTTTCAAGTGCAGCATTTGCACAAACGCTACGGCGACAACGAG
+GTCGTCAAAGACCTCTCTTTTAACATTGCCCCCGGTGAATGCCTGGGCGTGATTGGCCCCAACGGCGCGGGCAAAACCAC
+CACCATCCGCATGTGCCTGGGTCTGACCGTGCCGGACGGCGGCAGCATCACCGCGTTTGGCCTGCAGATGCCGACGGACG
+CACTGGCCATCAAGGCGCGCCTGGGCGTGGTGAGCCAGATGGACACGCTGGACCCTGACTTTTCGTGTGCTGAAAACCTG
+CTGGTCTACGGCC
+>generic788
+CCAGCACCCGCACCCGCTCCGGCGGCAGGCGGAGCCGGCGCCGCTCGGCCTCGAGCCGCTGGGGTGGCTCGTCGAGCGGC
+TCGTCGGTGAGCTTGAACGTGCCCCAGTGCATGGCGAGGAAGGTGCCGGCGCCGAGCGCGCCGAAGGCGGCCAGGGCCTG
+CTCCGGGTTCATGTGCTGCCGCTCCATGAACCAGGCCGGATCGTAGGCCCCGATGGGCAGCAGCGCGGCGTCGATCCCGG
+GGAAGCGCCGGCCGATCTCGGTGAAGCCGTCAAACCAGGCAGTGTCCCCGGAGTGGTAGACGGTGGCCGCCCGCCCCTGG
+ATGACGAAGCCGCCCCAGAGCGTGGCGTTGCCGTCGAACGGGCCGCGCCGGCTCCAGTGCTGCGCCGGCACCAGGGTGAT
+CCGGACCTCGCCGACCCGAGTCGTCTTCCACCAGCCGAGCTCGGTGCAGCGGAGCCCCCTCGCCACGGAAGAGCGGCGCC
+AGGCCCGAGGCCGGCCACCACCGGCGCGGCCACCGCGGT
+>generic789
+CAACAGGGGGGTCGTCATCTCGCACCCCCCCGCTGGGGCTGCCTGGCCAGCACCAGGAAGAGGATCAGGGCCAGCAGGAT
+GTTGACCACGGCGTAGGGCAGGCCCTGGGTGATCTGGAGGGTATCCCCCGCCGAGGTGATGGACGGCCAGGAGGAAGGCC
+ATGAACAGGATGCCGAGAGGCCGGCCTCCGGCCAGCCAGGAAATGAGGAAGCCCGTGAACCCGAAGCCCGGCGAGAGGCT
+CTGGCGCAGGCGCCCGTGGACACCCAGCACCTCGCCCATGCCCGCCAGGCCCGCGAAGCCGCCCCCGATGGCCAGGCCGA
+TGACGATCCAGGCCGCCACGGGGATGCCCAGCCGCTGGGCGGACTCCGCATTGCCGCCGATGGCCCGCATGTCCACACCC
+CAGCGGGTCTTCTCCAGCAGGAGCCAGTAGGCAAACAGCGCCAGGAGCGACAAGAGGAAGCCCGCGTGGATCCGGGTGTC
+GAAGAAGGTGGGCAGCAGGGCCGCGTCCGGGAA
+>generic790
+GCTTTTTGAAATAATGGAATTTCCGAAGGAAGGCGTTTTCAGCACGGTGCTGGCAAAGAGTGAATATTCAAACAGTACGC
+TTATGTGCCTTGCCAAGGGGACAGATATATCCGAACATACGTCTACCCGTGAAGGTTCTGTAACTGTTCTCAAAGGCAAA
+GGCATATTTGTCCTTAACGGCAGAAAAATTGTAATGGAGCCGGGTGTCTTCATATTCATGCCGAAAAACGCCCCGCATTC
+GTTGAGCGCCGGGGAAGACCTGGCGTTCCTGTTGAGCCTTGCAGGGAAATGATTATAACATGATAAAAATATTCGAAATT
+AATAAGGCGTACGGCGATCAGGTGCTTTTTAATGATTTTAGCTTGAACATCAACCGCGGCGAAAGATCGGGCTTGTCGGA
+AGGAACGGCCACGGGAATCGACGCTGTTCCAGATGGTACTTGGAGAGGCAGAACACGAGTGGTGT
+>generic791
+GCAGCCGGCTGGGTTATTGCAACCGAACTTAAGGTTACAGAAGGCACATCGACAGGTTGGTGTGTTGACTCAACAGGAAA
+ATCAAAAGGAATTACTGCAGCGGAAGATACAGCTATCACTGCAGCAACGACTCTTTGCCCATAATAATACTTTTGTTTTT
+AAAACCACCCCGATTGGGGTGGTTTTTTGTTGTGTTTATGGCGCCTTACATCCGGATGTATGATATAATGAAAGTAATTT
+GTAATTAAAGATTAATAAATAAAATTCGCAATTATTCATGTCATTAAGAAAAAACACATCAAGCAATCCGGTTTTACGTT
+GATTGAACTTTTGGTTGTTATCTCAATTATCGGTATTTTAACGTCGGTTGTTTTAACCTCTCTCAATTCCGCTCGCGGGC
+GGGCAGCCAATGTTGCCGTTAAATCGAATCTGGCGAATATTCGCGCCCAAGCCGAACACGAGTGGTGT
+>generic792
+GCAGCTTGTCGCAGGCGTCCGAGGCGTTGGAGACCAATTCACGCAGGAAAATTTCTTTATTGGAGTAGAGCGAGTGGGTG
+ACAAGGTGCAGCAGTTGCTTGACTTCGGCTTGGAAAGAAAGAGTTTGTTTGGTCATGGTCAGAAAAAGAGGAAAGAGCTC
+TGGGCGTCTCCGCAGAACTTGGAGGCAGCCACGCGCTTTTCAAGGCAGAAAAGAAAACAGCGCGTGGCCCCAAAGCGACA
+AGATGCTACGAAACGTTCTTAAAACGGGCATAACGCCAAATTTCCAGCCTACTGATGCCCATTGAGTTAAAAAACGCTCC
+TTACATTGCGATCTCTCGTAGCGTCGTGATTTACTTCTCGGCTTGGATCAAGGATCATCCGATGCTGTCATCGTCCCCGT
+TCATTCCATTCGAGCTGCAGTGGCTGAAAACGTCATCGACCCCTCCGCCACCAATTTGGCTGGCATCGCCCCGTGTTCTT
+GTCTAACGCGGGAAAATTG
+>generic793
+CTCGATGTTGACGCCCCCGGCGCCGAGGCGGTCGGCCACATCGCCGAGCGCGCCCGGCCGGTCGGGGATGGTGACCTCGA
+CGACGTCGTCGGCGGTGGTCTCCCAGCCCTGGGCGGCGAACACCTTGCGCGCCACCGCCGGACGGTCGACCACCACCCGC
+ACGAAGCCTCGCCCGGCCATGGCCGTGGCCATGAAGGCGCGGATGTCCACCTTCTTGGCCCCGAGCGCGGCGGCCACCCG
+GCCGAGCATCCCGGGCCGATCCTCGACCCATGCGGAGAGCTGCGTCACCTTGGGCATGCTGGAAGCGTACTCCCCCGGCC
+TGCGGGCCCACAACCAGCGCGGCGGCGCTCAGCCCGCGGCGG
+>generic794
+CGAGGACCGGGACGGGGGGCTCCTGCTCTTCGATTCCGGCCTGGGCTCGCCGCAGGCTTCCGCCGCCATGGCGGACGGGC
+TCGCGCGCCTCGGCCGCTCGCCCGGCGACATCTCGCGCATCGTGGTCTCCCACGGCCACATCGACCACTACGGCGGCGCA
+GCGGCGCTGCTCGAGCAGGCGGGGCACGAGGTGCCGGTCCAGGCCCACCCGCGCGACATCCCCAAGATGGCCGAGGGATT
+CCCGCGCTGGATGGAGCAGGTCGGGCTCTACGGGGCATTCTTCCAGCGGCTCGGCGTGCCGGCCGAGGTGATGGAGGACG
+CCTGGCGCCAGGTGAAGGACGGGTTCACCAGGGCGCGCCGCATCCCGAAGGTGGAGCCGATCGAGGTGGGCGAGCCCCTC
+CGGATGAAGCACGTCACCCTCGAGGTCATGCACATGCCCGGGCACACCCCGGGGCTCCTCTGCCTGTACGACCGCGAGCA
+CCGGCTCTTCCTCTCCGACGACCACCTGC
+>generic795
+GCATGGTTTCTTCGAGCCGGGCGTGCAGCCCGCGTGCGGCGCAAATCTCGTCCAAATAACGGCGCACATCAGCCAGACAC
+GCGTCGCGTGCGGCGTCGGTGGTGGCGCGGATGTCCAGACTGAAGTGGCAGCAGCCCGGCACCACGTTGATCGAGCCGTT
+CGGCACGCTGAGCATGCCCACCGTGCCCACCACGTGCTGCACCGACGCGGCGCGTTGTTCGACAAAGAGCAGCAGCTCCG
+CCACCGCCGCTGCCGCGTCGCGCCGCCGACCCATCGGCGTGGTGCCGGCGTGGCTGGCCTGACCGCGCACTTCGCCCATC
+AGCCGCACGCTGCCGTTGATCGAGCTGACCACGCCGAGCGGCAAGTCCAGCTCGCTCAGCACCGGACCTTGCTCGATATG
+AACCTCGACAAAGCCGAGATAGCGCGCCGCGTCGCGGGCC
+>generic796
+CAAATTTCCGACGTGTAAATTGCCTAACTTTTCTGTCGTCAAAGTGAGAACACACAATCCCAAACCACCAAAAAATAACA
+TGCTGGCAGAAATAATTTGCGAAGGAAAGCCGGTTTTAACCAGCGTTTTTGTCAGCACAGTTGAAATACACAAAGTTACT
+ACACTGATGAAAATCAGTAAATCGCCTATTTTCGCCGCCCCTAATTTTCCCTCACTGCTGCTTAAGGTGAGCAATAAAAT
+CATGCTAAAGCCCAAAAAACAGCCGAGTAATTTTTTCCAGGCAAAACTTTCAACGCGAAACAACATGGAAATAAGGGCAG
+CAACCACCGGAATGGTATTCATAATTACGCCGGTATTGAGCGGTGATGAGAGTTTTAAGCCGTTCAAAAATAAAATCTGA
+TTAATGAAATAGCCAAAAAAGGCAATACTCAACAGCATTTTCAGATTTTTGAGGGTGAAATTATC
+>generic797
+GAAACATGTTCGTTCAGTTTTAAGTTACCCTTTTATTTATGAAGAAGTCACAGAATCTTACGGCGATTATCATTTTAGCC
+TTGGCCTTGCTCGGTGTTGGCGTTGTCGAAGCCCTGAATACGCCCGTCGTTTTCAATCCGCTGCAAAGCGAACAGCAACA
+GGATTTGGTCAAGCCGTTCAGTTATTTTTTGAAGCAGAGCGACCAGATTGGCTTCAAAGATTCGCCCAAGGGAGTGCAGA
+TCACATATGACGGCGATTATAACACCCAGTTTGGAAGGTTCATGCTTAGCGCCGGCACGCCGCTCAAGCCTTTAAACAGC
+CGTCTGCGCACGCTCACCCAGGGCTACCTGCCGGTCATCAACTACGCCGAACTTTGCGACGACCTCGAATATCGGGTTCA
+ATCCTTTGCCACGCCGGTCAATCTGGATCCGCTCAACAACCT
+>generic798
+CGGTAACAATCGCATAATTGGGCCCTTTCAAACCATATTTAATGGAAGGTTGCCGGAAATCATATTGATAATATTGCCGG
+GTACAAAAACGGCGATATTTTACGCGGCCCACCTGCTTTGTAAGTGGCGTAGCATTCTTCTATTCCGGTTATCCCGCCAA
+TCCCCGCGCCAATCGCAACACCAATCCGCTCTGCATTTTCTTCCGTTACTTCAATACCACAATCTTCAAAAGCCTGACAA
+CCGGCAGCAATTCCATAATGAATGAAACCATCCATCCGTCTGGCATCTTTTTCTGGAATGTATTGACTAATGTCAAAGTT
+TCGGATAACGCCGCCAAAAGTTGTAGCAAATGGCGAAATATCAAACGAATCAATGGCACTGATACCGCTTCTGGCCATTA
+ATAATGCCGTCCCAGGTTT
+>generic799
+GTTCGACCAGCAATTGTGCGGTGCTGCGTTCGCCTAGCACCCATTGTGCCTGATGCGATTCGTAGAACAGCCCGCTATTC
+GCCAGCGCGCTACGCAGAGCACCGGCGAGTTGCTTGCTGTCCGGAACGCTGCCGGTAGTCTGCCAGACAGGGCTGCTACC
+TGCTTGCCGGGTGACGGGTTTTTCCAGAGGTGCCTCGGTTAGATGGGCCAGCATGCGCGCAGCGGGGCCGATCTGCTCCT
+GTGTCGAGATCGGTGCGGTGGAAGGGATGATGCTGAAGGTGAGTTGCGGCTTGTTGGAGACGACGCGCAGGTTTGACTAC
+TGTGCCGCCGCGCAGGTCAGCCGGTAAGCGCATCTGCAGGCTTTGTCCTGCGACCAGTACCTTGTACAGTCCCGGACTGA
+CTTGGGCCTGTACCGTGCCCTGCACTTGCTGCCCGGGTTCCAGTCTGGTGGCAGATGGCGGCGGT
+>generic800
+GCGCTGTTGACATAGGCAAAGGCACTGATGTTGAGGCCCGCCACACCACTGAGGGTGGTGATCGGCAGCGCGGCACCTGC
+GCCGTTGCCATCGGCATCCCACGACAAGAGGCCGGTGGTGGTATCAAACAGCAGCACCGTGGTGGCACTGGTGGCCACGG
+CACCCGCTGCACTCACCAACTGGTTGGCGTTGGGTGCAAGGCCATTCAGTGCCGTAAAGACGGCCGTATCCAACACCAAA
+TGGTCTGTGCCCGCCACAAAGTCGGTCACGGTGTCGGCGTTGGCCACTGAAGGGGCGGTATTGAACACAAACTGATCAGC
+ACCCGCGCCACCCGTCAAGGTGTCGTGGCCCAGCCCGCCGCCAAGCGCGTTGTTGGCGGCATTGCCCACCAAAACGTTGT
+CCAGCTCATTGCCTGCGCCATTGATCGTCGAGGCCTTGGCCAGAATCTGGCTCTGGATCTGGGCCGCCAACGTTACGCCC
+GCCTGCCAAGGTC
+>generic801
+GATCGTTTGGGGCGCGGCCTCGGCCGTTGGCCTTTCGCAAGTTTTCGCACATTCGCATACGGCCTACAACGCCTTGAAGT
+ATGCCGGCGTCGCCTTTCTCATTTTTCTAAGCGTTCAAACTCTCCTAACTCTGAAGCACGAATACGGCAAATTCGATATT
+GGTGGTTCTGCGAAAATAGGCGCCGGTCCTGCTTTCCGATTGGGATTGCTCACTAATCTGACCAATGTAAAAGCCGCAGT
+CTTCGCCGTCGCCTTCATTCCGCAATTCGTTCCAAAGAGTTTCAATTTTGGAGCTGGAATTTTCATACTTGCTTGCGTTC
+AAGCCACCGTCTCGACGCTTTGGTATTCGGTGCTCATTAGCGCTGTAGATCGCGCATCCGTCGCCCTGGCAAACCCAAAG
+TTCGTCGGGCACTCACTGCATTATCAGCAGGTGGAATCCTTTTTCTTGCCTTAACTCTGCTTCTTACTTCACCGCGCTAA
+GCGGTTTTGATTCAAGATCCCATCCCAGTTCGGGAGATTTCAAAA
+>generic802
+CGACAAGCTCGCGGCCCAACCGGGGGGCGGGCATGTGCGCCAAGTGCGCAAGGATTGCGCCAGTGTCATCTTGTGGTGCG
+CTGAGAAAGCCACCTGGATGGCGGGTGAGGGCATCCAGATCTTTGGTGGCAACGGCTACATCAACGACTACCCGTTGGGG
+CGGCTGTGGCGCGACGCCAAGCTCTACGAGATCGGTGCGGGCACCAGCGAGATCCGCCGCATGCTGATTGGTCGGGAGCT
+GTTCGCCGAGACCGCCTGAGGGCCTTTGAGCCCGATCTTGTGCGTAAACTTGGGCGCTTGCGCCTTCACCCGTCTCTAGC
+CCCATGCCCACCATGCCCACGCTTGCAGGATCTTTCCAGAAAAACCGCGATTGGGCCCAAGAGAGCGAAGCCCGCGAGCC
+GGGGTTTTTCTCGCGGCTGCTCAAGCAGCAGTCTCCGCAGTACCTCTGGATCGGCTGC
+>generic803
+CTCACGTTTGTCGGCCGATGGGGCTGCTGCTTGGGCTGAGCCTTGGGCGAAGCGGTGGGGCACGCCCGTGGCCTTCATCT
+TGCCCTCAAGTTTTTGGCGAGGTTCTTGACGAGGCCGGTGTTTTTAAGCTCATGCGCTATCTCTTGAAGTTTTTGAACGT
+GGCGCGCATTGTCCGCTTTATCCCCCACGCTATCCCCCACCCATCGCCTTCCACAGCGTCAAGCGGTTGAGCTGTTCGGC
+CAAACGGGTCTGAACGAGCGCTTGTTCGGCGGCCAGGAGGTTGCGCTGGGCGTCTTGGCGTTCGAGCTCGCTGGCTGCGC
+CCCGGCTGGCGCGCAGGTCGGTCAGGCGGGCGATCTCACGGGTGGCGCGCAGTTGCAGCTCTTGGGCACGGCGCTGATCA
+CGCCAGCTGGCTTGGGCGGCCAAGGCGTCGGCCGTGTCACGGAGGCGCTTTGCACCGCTTTTTCGTACTGCGCCACCGCG
+ATCTCGCGGTTGATCTTGGCG
+>generic804
+CAGGGAATAATTGAAAATATGCTGCACCTGGATGACGGGGTTCATCACCAGCCGGCAACCGGCGCGGCGCAATCGGTGGC
+TGAACTCCACGTCTTCCAGGATCGGGCGAACATGCTCTGCAAAGCCTTGCTTGCCGCGGAAGACCGCCGCGTCCATCGCG
+AGCGCGTGCGTGGCGATGTAATCGGCCGCGGGCGCATGCCTGGTTTCGAAGTAATTTATGAAAACAGACTGAAAGCGGCT
+GAAGAAGCTCTGGTCGTATGGCGCCTGCGTGTACGTACCTCCAATGATCGCATTCGGTCCCTCGAGCGGCAGCGCACTTG
+CCGCCAGCGCCAGGGTGTCGGGCTGCAACAGGCAGTCGGCGTCGGTGAAAACAGAATCCGGCCCCGGCTGTGGCTTGCGC
+CGGTGTTTCTTGCCCGGGCCGCTCCCCCACTGTCGCGCGAGCCTCACCAGCTTGCACGGTAACGTTCGATTATCGTGACC
+GAATCGTCTTCGG
+>generic805
+CGCGCGCTGGACCGGGCCGTGCGCTTGGTTGCCGGTGCTGTTGGATGGCACCGTGATGCCGCGCTCCCATGAGTTGCCGA
+CCGCCTTGCAAGCCTTGGTGCGCCGACCGGCCATGAGTCTTCATCCGCAGCGCTTGGATGCCGATATGGGCATGCTGGTC
+AGCATGATCCGGCGCACGCTGGAGTCATCGTTTGGCTCGGTGGTGGCGTCTTCGGTGTCGGTACACGCCAAGAACGACCC
+GCCCCCGCCAGCAGGTCGTTCCGCCACTACCACCTTTACCACCCCTCACACCGCCCCCGGTTTCGCCGCTGCGCGGGCTG
+TCTGATCCCGCTGATTTGCCCGAGTTGGCGCAGTTGTTTTGCGCCCAGCCCGGCACCGGCACCCACCCCGGCACCTGCGT
+CTGCGCCTGCACAGGCCCCTGCGGTAGTGCCAGCGCCGCCGCAGGTCGCCTCCGATACTGCATCTGCATCATCGCCATTG
+>generic806
+CCAGCGAGCATGGGTAGAGGCCAACCCGTTGAGTTCGTGAGGGAGTGTGAACACCAGATGGCTGTAGGGCACATTCAGCA
+ACTCGGCCTGTCGCGCCACCCTCCACGCCTCGCGCTGCTGACTCTGGCAGCGCGGACAGTGCCGATTGCGGCACGAATGC
+CATCGCCACTGCGACACACCGCAACCATCACACTCATACCGCTGTCCACCCAGCGCGGGCGTGCGACATCTTGCAATGGC
+CCGCCACGCCTTGGCTTGCGGCGTGCTTAGGGTGTGTTCACTCAGGTACTCCCCGCCGAAGTGACTCAACACGTCGGCCA
+GCGTCGTGCCCACCTTGAAGCTTCAATGGGCCTTAGCCACCTTCGGCAGCGCCCCCAGCAAGGCCAGCGGCTTGCCTCTG
+GCTCCATCGGGTGCATCCGGCTTGGCCAGATGGATACGAGTGGTGT
+>generic807
+CCGGAGTGGTATGTGCAGCGCCATTGCGGTGTCTCGCTGACCGAGATCCAGAGCAAGCAGCTGGAAAAGACGTTTGAGCT
+GATCCTCAAGACGTGTGAAGTCCAGCCGATGGTGCTGGTGCACCGCGACTATCACAGCCGCAATTTGATGCTCGGCACCC
+GCCCCGGTGCCGAGACGGCGCTGGGCGCTGGGCGTGGACCCAACCCGGGCATGCTCGATTTCCAAGACGCCGTTTGGGGC
+CCGGTCACCTATGACGTGGTCTCGCTCTTGCGCGATGCCTACATCGAGTGGGACGAGCCGCAGCAGATCGACTGGGCGGC
+GCGTTACTGGCAGCAAGCCAAGAAGGCTGGCGTGCCGGTGCAAGACGACTTCGGCCTGTTCTGGCGCGATCTGGAGTGGA
+TGGGCTTGCAGAGGCACCTCAAGGTGTTGGGCATCTTCGCGCGGCTCAACCACCGTGACGGCAAGTCCGGC
+>generic808
+GCTGGGGCCGGTGTTGCTGTTGCCGTTGCCGTGCGCGGGGCTTCGACAGGCTCAGCCCGAACGGGCATCGGCTCAGCCGC
+CCGAACGGGTGTGGGGGCAGGCGTAAAAACCGGCTTGGCCGCGCCACTCTCGGGCCTAAACGCCAACAAGCGCAGCAGCA
+CCATCACCAAGCCGCTGTATTCGTCGGGCGCCAAGTTGAGCTCGTTGCGACCGTGCAGGCTCACGCTGTAGAGCAGTTGG
+GTTTCATCGGCAGCCAGCTGCGCGGCCAAGGCAACGTGACGGTCGTTTAGGCGGTCGTTGGCGAGCGCGCCGGGCACCGC
+TTGTTGCACCGCATGTGCTGGGCCAGCAAGGCCAGCTCTCCAGGGTGCCGGCGCCGAGAGGCCCAAAGCGCGCAGTTGAT
+CGGCGATCCGCACCAAGGCCGCGCCGTCACCCGCCACCAAGGCTTCAACGATGCGCACCA
+>generic809
+GGCTGGTCGATAGCCAGCAGTACCCCTACTTGCGCTCACACCCGCTGACGACCGAGCGCATCGGCGAAGCGAGGGCGCGG
+CTTGGCCCCACCGAGCACCTCGGAGCCACCTCGGGCGGCCGGTCCGCCACATGGCAGCATGCCTTGATGCGCGCCCGCGC
+CCAAGCGCTGATGGACCCACGCATCGATCAACAGACCCGCCTCATCAACCCGCCGACCGCGCCCACAGCCCATGGCGCGG
+CCACGGGGCCCACGGCGCTGACCCAGGCCTACAGCGCCGCAGTGGCCGCGATGAAGCAGCATCAATTCCCAGCAGCAGAG
+GCGTCATTGGCCCGCGCCCGCGCGCTCATCAAAGACGATGCCGTGGCCGAAGCCGCCATCGGTCACACCTTGGACTATTT
+GCAAGTTGAGATCCTGATCGAGGGTCAACACGGTGCTCAAGCTCAAGCGGCCATGGCGCTCT
+>generic810
+CTGCAAACCAAGTTTCGCTTTTAACTGCTGATCCCAACCTTCTGGTTTTGAAGAAGACACCAATCTATGAACACCAGATT
+GAGCCTCTTCACCAAAAGCATACTTTCCTGTAGTCCCAATTTTTAATTCCGTAACCCGAAACTCACGGCCTTTAAATGCA
+TGAGCCACAGCTCCGAAATATAAATAAGCACCCCATGGCCTATCATTTATTTGAGGTGTGGATAATTTTATATTTGCCGG
+AGTATACATTAACTGACCAATAGAATACCCGACATTTGGCTCAATATCATCCCACAACATCCATTTTGTACCCAAAGACA
+TTATATGCCTTACAGGCATAAATTGACTTTCATCACCGTCTGTTTTATACATCCATGATAAACGTATACCATTTGTATAC
+CATCTATCAGTGCCACCTTTTGCCCAAACATCATTCTCCCACTGCAACTGCCAACCAGCCAAACTATTCGAAGACGCATG
+CGAATTTGAAGCCAACAAT
+>generic811
+CAATTAGGAAATTATTGGGTTATTGGGTCGAGTCAGTGTGCGAATAAAAATATCCATCAAGCGAGGTGTCCCATGCCGCT
+ACGTGATGTTCCCGACAATGCCGTCGAACTGATCAAAAGCTTCGAAGGTATTCCGGACGGCAACCCAAAAACCGTCAATA
+TAAACCCATATCTTGATCCTATTGGTATTTGGACCATTGGATGGGGCCACGCCATTCGATGGAAAGGCTCTTTCTTGCGC
+GGTAAAGAGAATGAAGCGGTGGCTGAAAGTCTGTATCCAGGTGGTATCACCCTTGATCAAGCGACGCAGCTTTTGAAAGC
+CGATTCAATCAACACGGGTCGAGATGTTCTTTCCGTCGTGACGGTTGACCTCAACGACAACGAGTTTGGCGCTTTGGTCA
+GCTTCACCTTTAACTTGGGTATAGGCAATCTCAGCAAGTCAAACCTCTTGAAATTGCTCAACGCCAATAACCGTACTGGC
+GCTGCCGATCAGTTTGGCAAATGGGTGA
+>generic812
+ATTCATCTTGGATGACCTACAACAGGGTCTCGGTGCTTACTTGATCGTGCCCTTGGGCAGCACGGTGGTGACGGAGATGC
+GTTGACACATCACTTCGACACCGGAGGTCAATTCGAGCGAAACATAGCCATCGTTGACCTTGGTGACCTTGCCGAGCAAA
+CCACCGGCCGTGACCACTTCATCGCCCCGGGCGAGGCCTTCGACCATCGCCTTGTGTTCCTTTTGGCGCTTCATTTGCGG
+CCGGATCATGACGAAGTACAGCACGACGAACATCATGATCAAAGGCAAGAACGATTGGATCTGGCTCAGGGGGCTGGCCG
+CTTGAGCGGTCTCAGCGGCTTGGGCGTAGGCATTCGAGATGAACACAGGCAGGCTCCAGGAAAGGGAGAAAACAAGAGAA
+AGAACAAAAAGACAAGGCGATAAAGCCGGGCGATTGTAGGTGAGCAGGTTGCGCGACGCCCTGCTGGCGTCTTCACACCT
+TGTCGGGCTTGTGC
+>generic813
+GCGCGGAGTTCGAGAAGGGCATGGCGGACGCCCAGAACCGCGAGCTCCTCGAGCAGAGCAAGAAGGAGGGCCTGCGCAAC
+GGCATCGAAGGGACCCCGACGCTCTTCATCGACGGCCGGCGCTACTCGTACGACCTGGACGGGTCCGTGGTGCAGGACGC
+GCTCGAGGAGGCCTGGGAGCGCGACACCGCCGGGCAGGCGGGCGGGCGCGCGAACCGGTAGAGCCCGGGGGAAGATCCGT
+CCACCCTCTGCGCCCGCCGGCAGGCAGGGCGATGACCCGATGCTCGTTGCCTCCGGCCCCGAGGGCGGAGGTCCCTCGAC
+GGCTCGGGCCGGACGTGGGCTGCCCCTGCCCGCGGCTCCTTCCTGAGGGTGTTGCTGAAGCAACACCCTCGTGAACCGGG
+CTGGACGGCGCCCGACGGTCGGCGTCGGCCCGCGGGTACGCTCGAGGAGCGGTGGCGCCCGCTCTCTTCGCGCGCCCCCT
+CGCGCCCCGTCGACGGAGCGCGCCAGGCCGC
+>generic814
+GCCTGAGTGGGGAAATCACGTTTGCGACCGAACTGGTCCCGACCGGTAAGCCACTCGATTATAGGCCGGGAAACGCTGGG
+ATTCAAACGGTTATAAAAAAAGCCTCGGGGTTTATCTATTAGATGTAAAATATCTCCCGGCACCGACCGCAACGCATATC
+TCTTGCCATTTATTGTGGCCGCAAACGGGTGTTTCCAATCAAATTCTCCGTTGACCAAATAGTTTACGCTCTGGGCCAGA
+ACCGTCATATAAAGCGACAGCCTCAACAGAGCCGCTAATTGCTCCTTCCCATCCGGGCGTAATGCTTGTCCGGCGAACCT
+GGCGCGGGCCTCAAGGAAGTCCGGGGCCAAGGCCATAAGCCGAAATACGTCTTGGAGGGTTTTGCTGCGGCCCATCATGG
+TGTAGTTCAATTCCCCGAAAGCCGCATTGGACTGCCCCGCTGTCAACTCAAGGATTTGGTCGTCGGTGTATTTGCCAGCG
+TATCGTTTGGCGTTGCGGCCGTAAGCGTCTACAGCCATTTTCATCTTGAGCCGGGGTATGAAGTCTTGGAACA
+>generic815
+GCACGGCGGCGACCTGGGCTCGATCGAGGCGCAGTATCACGAGGAGATCTACCGCCTCACCATCATCGATGGCCTGACCC
+AGGTCTTCAACAAGCGCTACCTCATCGAGTTCATCGACCGGGAGATGGCCCGCTGCAGCCGCCACGGGCGCCCGCTGTCG
+GTGCTGATGCTCGACGTCGACCACTTCAAGAAGATCAACGACACCTACGGCCACCTGGCGGGGGACCACGTTCTGCGCGA
+CCTGGCGGCCCAGGTGCGCACGCGCATCCGGCGCGAGGAGTGCTTCGCCCGCTACGGCGGCGAGGAGTTCGTCCTCGTGC
+TGCCCGAGACGAGCCTCGAGAACGCGCACCACCTCGCCGACAGCCTCCGCGAGAAGATCGAGGCCCACAGGTTCACCTTC
+GAGGGCAAGACCATCCCGGTGACGTTCTCTGGCGGCGTGGCCGAGATGCACGCCGAGCACGACAGCCCGCTCGCCTTCCT
+CAAC
+>generic816
+ACCATAGACAAGTTAGGCGTAGATATGAGCGGCGAAGAAAATTCTGCGCAATGCAAGTAAAGATCTTGAAAATTTTGAGT
+TAATTCAAGAATCTGTTTGCGTTGATGGGCGAACATTTATCAACGGAAATGCTGGCAAAAATCGTGAGTGATTTGGAGGC
+TGTGATTGGCGTAGATGGTTTATCCGAAGATGAGGCTAACTTCTTATACGAACTGATTGAACCTTGGCAAATCGGCAATG
+GAGAGGAAGAAGCGGAAGAGCAGGAAGAAGTCGAAGAGGAGGAGGATGACGACCATGATGCCATACGGGAAGTTGACCGG
+AATACGGGAGAGTAACCTCCTGAAGAGCGACA
+>generic817
+GAAGAAGGGTGTGCGGGCACCGAGCTTGTAGCCGTGACGGATGGCGCGCCGAGCGATGCGGCGCAGCACGTAGCCGCGAC
+CTTCGTTGCCAGGGATCACGCCATCGACGATGGTGAACGAGCAGGCGCGGATGTGGTCGGCGATGACCTTCAGGCTCGGG
+CTAGCCGGATCGACATCCACACCACCCGATGACTCAACGGCGGCCTTGGCCGCCGCCAGCAGGGCGACGAACAGGTCGAT
+CTCGTAGTTGGCATGCACGTGTTGCAGCACCGCCGTGATGCGCTCCAGACCCATGCCGGTATCGACCGAGGGCTTGGGCA
+GCTTGTGCATCACACCGTCTTCGGTGCGGTTGAACTGCATGAAGACGTTGTTCCAGATCTCGATGTAGCGGTCGCCGTCT
+TCTTCTGGGCTGCCCGGCGGGCCGCC
+>generic818
+ATTGCCGTTCCGATGGGCAAGGCGCTGGGTCAGACCGTGCTGGTAGAGAACACGGTCGGTGCCGGCGGCACCATTGCCGG
+TGCCCGGGTCGCCCGCGCGGCACCCAATGGCTACACGCTCTTCCTGCATCACCTGGGCATGTCCACCGCACCGGCGCTGT
+ACAAGAAGCTGTCGTTTGACCCGTTAAAAGACTTTGAATACATCGGCCAGGTGGTCGATGTGCCGATGACACTGCTGGCG
+CGCAAGGACTTTCCGGCCACCAACTTCAAGGAACTTGAAGCCTACGTTCGGGTCAACAAGGACAAGGTCTCGCTCGCCAA
+CGCCGGGTTGGGCGCGGTGTCGCACCTGTGCGGCCTGCTGTTCATGAGCCAGATTGGTGTCGATCTCAACACCATTCCCT
+ACAAGGGTACCGGCCCGGCCATGAACGACCTGCTGGGCGGCCAAGTCGACCTGCTGTGCGATCAGACCACGACGACCGTG
+CCGATGATC
+>generic819
+CCTTGGGCTTGCAGCCAAGCATCGCGGGCTTGGTCGTAGGGCTGGTTGCAAGCATGCTGACTGCCGTCGAGTTCGATGAT
+CAGCCGGGTGGCTGGGCAGACGAAATCGACGATGTAAGGGCCGATCACTTTCTGGCGGCGGAACTTGAAGCCGCTTAAGC
+GGCCGCTACGCAGCTCCTGCCAGAGTTCTTGCTCGAACACCGTGGAGCGTTGGCGCAGCTCGCGGGCTCGGTCGCGCATG
+CTTGAAGACATCATGGTGAGCCAAGGATAGGCCCATGGCCGGGCACTTGCCTGTTTCCGAGCCCTCACCCCCAGCCCCTC
+TCCCGCAAGTCGCGGGCGAGGGGAGCAAGGCAGTGGGCGGTGTTCAAGCCCCTCGCCCGCGCTGCGGGAGAGGGGTTGGG
+GTGAGGGCTCGTGGTTAGGCTCTCACACCCCCGCTGCCTGCTCGTCGGCGTGGTAGCTGGAGCGCACACGAGTGGTGT
+>generic820
+CTTAGAGCTTGGCTCCGAACTCATTAGCTCGGACATCATTGCCTTCTATGAGTTGATCAAGAACGGATTCGACGCGGGCA
+CGAAGTCGGGCGTCGAAATCCACTTCAATATTGTTCTACGTCGTAACCACTATCTTTCGGCGCGCGAGCGCGCCCTTAAG
+CCACAGGGGTTCAGTCGAGACGTTGTCGAAGAAACGTTAGAACGACTCAATCCAGAGGCTGCAGAACGCCTCCTTGAGTC
+GGCTCGAAGCAAGCTCAGATCGGCAACGACCAGCGACCAATTCCTTGCTGTGTTGGATGACGTGTACGGCCTGAGCGACA
+TCACGATCTCGGACACCGGTAGTGGCATGTCGTTGAGCGGTCTGACGGACAACTTTCTTGTGATCGGAACGGCGTCGCGC
+AAGCGAGACGTTGAGAGCGCGCTGAAGAGAGGCGACACCAAATCACCATACTTGGGGGGAGAAAGGTATCGGCCGGCTTT
+TCTGCCATGCGGCT
+>generic821
+CGACGGCGCATGGTGGATGCGCTAGAGATGCGTGGCATGGCTCAGCGCACGCAAGAAGCGTATATCGACGCAGTCGCCAG
+ACTATCGAGGCACTACAAGTGCAGTCCGGATAAGCTCAGCGCGGAACAGGTTCAGCAGTATTTGCTGCATCTTCTACGTG
+ACAAGAAATTATCGAGATCAAGCCTGAATCAGTATGGTTGTGCTTATCGGTTTTTCTACGGCAAGGTCTTGGGGTTAGAC
+GGTTCAACGTTTTATGTCCCACTGGCCAAGGCACCACAAAAGGTTGCCGAGAGATCCTGTCACGAGATGAGTTGGCCAGA
+TTGTTCGATGCCGCCGGTCACGATAAGGCGAGTACCTTTCTGAGGGTCGCGTACGGCACAGGTCTGAGGCTGACGGAGGT
+TATGTCGCTTGCAAGTACGAGACATTGACAGTCATGCAGACCGAAT
+>generic822
+CTGGTTTTCAAAACTAAGCGCTGCCTAATTAACCGTGGCAACGCTTAACGATGACGACGAGCTCGAAGAAGAATCAGACG
+ACGATCTGTCCTATTCGGGTATGGACGCAAAATATACCACACCTGGATAGATAAGCGATAAGCCGGTCGAAGTCTAAGTC
+GGTGTTCAAAAATAGGCTTCTATCACAAATCATTGTACGTCTTCAGTCGAGGAAAAAGAATTCAAGCCCGACAACCGCAA
+TCCAGAATCTCCCAAACTACCACGAGCAATTCCATGCAAACCTACGCTTATACAGGCAGTTCCAGTCTCTAATTGTATTC
+CCGCATCAGGGCGAAGCCCTTCGGTTAACCCAAAAGTAAGGTCAAAGCTCAGGCTTGGCGCTCTCGACGACTAGTAGCTA
+ATCACTGCTCACCTTGATGAATCTAATACGCGCCTGCTGCCCTCTAAACCTCCAGCCTGCTCTGCCATGGTCCCCGTGCA
+AATCCCCACGTCAGACTCACAAAGAGCG
+>generic823
+AAAGGCCACCGCTCAAGGTTCGGCCCAAGTCAAAGAGGAGATGGATCGACACCAAGTTCCAGATCGAGGAATGGAAGCGC
+AAAGGTGATTTCAACAAGGTGGCTGAGTTGCAATACGGCAAGTTGCCTGAACTTGAAAAGCGCCTTAAGGAAGCCCAGCT
+CAAAGAAGCCTAGCAAGGCAGCAGGCGGCCAGGCAGGGCCGCAACTGCTGCGCACCATGGTGGGGCCGAAGAATCGCCGA
+AGTGGTGTCTCGCGCCACGGGTATCCCCGTGGCCAAGCTGATGCAGGGCCGAGCGCGACAAGTTGCTCAAGATGGAAGCC
+AAGCTGCACGAACGGGTGGTGGGTCAAAGTGAGGCGATCGTGGCGGTGAGCGACGCCATTCGCCGCTCGCGCGCCGGGCT
+GTCCGA
+>generic824
+GATGCTGGTTCCACTCCAGTTACATCGGCGATTCGATCATCGGCAATCATTGCTCCTTTGGAGCAGGCAGCATAACCGCC
+AACTTCCACTTTGATGAAAAGGAGATATCGATCAGGCACAAAGAAAAGCCGGTTGGAACGGGCAGGGACCATTTCGGCGC
+CATCATCGGAGACAACTGTAAGACAGGAATAAACTCGGGGATCCTTCCCGGCAGGCGCGTCGGCCCCAACTCGATAGTCG
+GCTCCCATGTGTGTCTGAACACGGACCTGGAACCAAATACCATAGCCCTATATAAGCCGGGCATCCAACTTATGAAGAAC
+GATATTAAACTAAATAAATGACGATAAACGTGAAAAAACAGGAAAAAGCTCGGGAAATAATGCCTGATAAAAAGAAAATA
+AAAGACTACCCAGGCATGTCGCCATTATCATGGATGGGAATGGCCGCTGGGCCAAAAAAACGCC
+>generic825
+GCCTCGACCTCGCCGCCCCGAGGGCACACCGGTGGTCGCCGCCGCCGACGGCGACCGTGGTCTTCGCCGGCGAGCAGCGG
+GGATATGGCCGGATCGTGCTCGTCGCTCACGCGGGCGATCTGGTGACGGTCTACGCGCACAACCGCGAGAACCAGGTGCA
+CGCCGGCGACAAGGTGGTCCGCGGCCAGCAGGTGGCCACCGTGGGCCACTCGGGGCGGGCCAGCGGTCCGCACCTGCACT
+TTCGAAGTGCGCGCGGGCACGCGGCCGGCAGGACCCGCTGGCGCTGCTGCGTTAGGGGCATCGCCGGTCAGATGGCGTGG
+AGGACGGGGCGGCCCGCATCCGTCCCCAGTCCCACTTCAAGCTCCCTCTATCGATACAGCGCCATCCGCTCGCTCACCCG
+CGTCAGGTACTTCTTGGTCTCGTCGGGCGCCTTCGCCTCGACCAGCGCGGCGGCCTTCACCGGCGTGAGCTTTGCCAGGT
+CCTGCCCGTTGACCACGC
+>generic826
+CACGATAATGGTATGATCCATCGCCCCGTGTTCTTCTAGTTTGCGTACTACGTTGGCAATCGAAGAGCGTTTTTGCCCAA
+TTGCCACATAAATACATTTAATGCCAGTGCCTTTTTGGTTGATAATCGCATCGACTGCAATGGCGGTTTTACCGGTTTGG
+CGGTCGCCGATGATTAATTCCCGTTGCCCACGACCGACCGGAATCATCGCATCGATGGATTTCAAGCCCAATTGTACCGG
+TTGGTCAACCGATTGCCGCGCGATAACGCCAGGAGCAATTTTTTCAACCGGCGAGGTCAAGGTTGTATTCACCGCACCTT
+TGCCATCAATCGGATTCCCCAACGCATCAACCACACGGCCTAACAACGCTTCGCCGACGGGTACTTCTAAAATTCTACCG
+GTACATTTGACCGTATCGCCTTCGGAAATATGCTGATACGCTCCTAGTACAACCGCCCCGACTGAATCCCTTTCGAGGTT
+AAGAGCCATCCCATAACTACCGCCAGGAAATTCCAACATTTCCCCTTGCATAGCTTCCGAGAGGCC
+>generic827
+GCTTGCGCTTTGGCTTCGAGCGCGCTGCGTAGCTTTGTTAACGCAGCCAGCAGCGGTTGCATCTGGCTGATCGCAGCGAT
+GTGCATGGCGCTGGGAAAGACATCGTTCGACGACTGGCCCCGGTTCACATCGTCGTTCGGGTGTACCGCCACGCCGTGTT
+GCTCGGCGCAGAGCCGGGCGATCACTTCGTTGACATTCATGTGGCTTTGGGTGCCCCGAGCCGGTCTGCCAGGACCGAGA
+GCGGAAAGGCGCTGTCCCACGTCCCTGCGGCGACTTGAGCCGCAGTGGCGGCGATGGCTTCGGCTTTGCGCGCATCCAGC
+AGACCAAGATCGCGGTTGACCTCGGCAGCGGCCCGTTTGATCTCGGCCATGGCGTGGATCAGGCCCAAGGGCATGCGCTG
+CTCGCCGATGGCAAAGAAATGTCGGCTGCGTTCGGTCTGGGCACCCCACAGCGCTTCAGCGGGCACC
+>generic828
+GGACGCGGTGCGGGAGGCCCTGCAGAGTGCTGGTCCCGTGGCCGTGGTGGGGCAGGGCACCTTCGGCAACGACGGCGCCC
+AGCGCCTGGGCGAACTGGCCAGCGACGAGACTTGGCGCTTCGGCAGCGGCGAGAAGCACTACGCGATCCAGCTCCCGAAA
+TTCCAGAGCAGCGCCGATGGGATCTTCAACCGACGGGGCTTCAGCGAGCGGGGCTTCCGCTTCGGCCTGCTGGACATCCT
+CCAGGGCCTCGTGGCCGCGGGCCAGGTGAAGGCCCTGGTGATCCTGCACGACCCCGAGTTCAGTTCCGTCAAGGAAACCG
+AGCAGATGCTGGCCCTGGTGAGGGCCGTGCCCTTCAGCGTGGTTCTGGAGACCGTCACCTCCGAAGTCGGCGCTGCCGCC
+ACCGCCCAGATCCCCATCGCCACCTATCTGGAAGAGAACGACTTCGTACGAGTGGTGT
+>generic829
+GGCTGGAAAATATTGGCTGAAACATACCCTGTATGGCGGTGGTTGGAGCGAAGAAATTTGCAGAGAATTATTTGTGCGTG
+GTTTGTGTGTTGCCGTACTGTTATACGATCCTTACACTGATAAAGTGGTACTAATCGAACAATTTCGTGCAGGAGCGATA
+CTTCATCCAGACAACGCGTGGCTGATTGAAATTGTGGCAGGTGCAATTGAAGAAGGCGAAACAGCGGTGGAGGTTGCCCA
+TCGTGAAGCCTTGGAAGAGGCGGGTTGCGTTATTCAGGAATTGATGCAGATTAGTGAGTTCTATACCTCACCTGGGGGTA
+CGGCTGAACGCATTACTTTATTTTGCGGCAAAGTAGACAGTACGCAAATTGTTGATGGTGTACACGGTTTAGTTGAAGAA
+CAGGAAGATATTTTAGTACGCACTGTTGATTTTGCTGAAGCGTATCGCATGGTAGAAAGTAATGAAATGATTCGGCTATT
+CCGATTCTGGCCATTCAATGGCT
+>generic830
+AAATGATGCTTTCAGGTGCGTCACCTCGCCGATCACGCCGTCCTGAAGCAGTCCGCGCAGCCGGACGATACAAGGCATAA
+AACGCGGTCCACATCGCCTCCATCAAAAAGAGTTTTTTCTTCCGCGCCAGATCAATCAGCTCCGCCGCCTGCGCGGGGCA
+TTGACGGTGAAAGCTTTTTCGCACAGCACGGGGCGGTTGTACTGCAGGCAAAGCCTGGTGTTGTCGTAATGAAAGTTGTG
+CGTGGTGGCGATGTAAACCGCGTCCAGCTTTTCGCTGGTCAGCATTTCCTCGTAATCGCCGTAAACCGCCGGCACACCGC
+AATCGGCCCCAAAAACTTTAGCCCGCTTCAGCGACTGCGAGGCCGCCGCGACCACTTGAGCGTCAGGCAGTTTTCGATGC
+CGCGCACAAAGCTCCGCGCGATCCTTCCGCAACCGATGATACCCCAGCGGAATTGTTCCTTCATAATTTTTCCGGTACGG
+ACTGGCTTCATAGGCCGCCAGCGCGGCAGGC
+>generic831
+GCCAAGGCGAGCTGCCAGCGACTGTGCTGCATGCGTGAGCGTGGGTGATGCGATGTCGGCATGAAAGAGGCGGCTCAATG
+TGTTCAGCCAGCATTCAAACACGCCGCCGCCCTCTCAACGCCCCGGCGCACGCCTACGCGCGGTGAACTTTTTGTCGTTG
+CGTTCTAAAACACGCGCTCACAGCGCCTTCGTCACCAGCTTGAAATCGGTGTCTTCGGGGAAGGGCCCGACGTGGAAGCC
+GAGGCTGCGCATCAGCCGCAGCATGTTGGGGTTGTAAGACCAAGCCCTGGCCCTTGACGGCGTCGGAGACGACCAAGGAA
+AACTCGCAGGTGGTTTGGTCGGGATTGGTGATCAGAGCCCGCTCATTCCGATCATCTAGATCCAACCGTTCGGGTTGAGC
+CTGTCGAAACCCACGCTCGGTGCTGGCCTGATTTTAACCAAACAGCCTCCGCAGAACCCGGGCGATTCAGCCGTTTGAGA
+TCACAGACGGTGACCTC
+>generic832
+GCCTCTTCGGCGGTTTCCACGAAATGGACCAAGTTCACATCGTTGGGGCTGATCATGCCGGTCTCGACCAAATGGTCGAG
+GTTGATGAGCTTTTCCCAGAAAGTGCGCCCAAAAAGATAAATGGGTCGATGGCGACACTTGCCGGTCTGGATCAACGTCA
+AGGCCTCAAAGAGCTCATCGAGCGTGCCAAAGCCACCGGGGAAACAGACCAAAGCGATGCTGCGCATCAAGAAATGCATC
+TTACGCAGCGCAAAGTAGTGAAACTGGAAGCACAACTCGGGCGTGATGTAGGGATTCGGCTCTTGCTCGTGGGGCAACAC
+GATGTTGAGACCGATGCTCTTGCCTCCCGACTCAAAAGCACCCCGATTACCGGCTTCCATCACCCCCGGGCCGCCGCCGG
+TGACGATGTGAATGGGTGAGACCAAATTCACCGAAGCCGTGGTCACCAATTCGGCAAAACGGCGTGCCTGCTCGTAGTAA
+CGCGACATCTCGACTTGTTGGCGAGC
+>generic833
+CCAGCATCGAAGTCAGCGCCAAGGTCAACCCCGACAGCCATCGCCGCCCTTCGCCCGTGCTGCTTCGGCTCTACGAGCTC
+AAAGCCGCCACAGCCTTTATCCAAGCTGACTTTGTGTCGCTGTATCAGCGCGATCAGGCTGAACTCGGCGGCGATCTGCT
+TGGGCGCGAGGACTACCTGCTCCAGCCCGGCGAGCGTCGGCCCTTGCAACGCAAGCTGCGTGCCGAGACCCGCTTCATCG
+GCGCGTTGGCAGCCTTTCGCGACATCGAGCACGCCCGTTGGCGCGCCTTGCTACCTGTGCCATCTGGCCGATCTTTTCAA
+AGCACGATTCGGGTGGCGGAACTTTCTCTGACGATGGGACACGAGTGGTGT
+>generic834
+GGAAGTCATCGTCGTGATCACGCCATGAAGGCCAGCCGGAAAAGGCCGACAAAATTCGGGTTGCTGTCTTCGGGCCGCCA
+GCGGGTGTCGCTCCATTGGCGCAGTTGGGCCACGCGCACAGCCCTTAAGCCGTTATCGCCGTTATCGCCGTTATCGCCGT
+TATCGCCGTGATCACTGTGATCGTTGGCGTGCTCCGAGCTGCCGTTGTGATACGCCACATAGGGCCCCAGCCAGAGCATC
+AGGTGCTGCTCGTCGCCCAGATCAAAAAACAGCATATCGGCCACTTGGGCTTGATGGAAGGTGCGGCTCACAAAGCGCGT
+GTTGGCCTGCACCAGCTCCAGCGCGCTGACAAAAGCGCCGCGTGTGCCGTCCACCCGCTGCCAGCGTTGGCGCAGGGCGT
+GGGCTTGGGCCGCATCGGGCTCCGGCGGCAGGGGCCGGCTGAGCAAG
+>generic835
+GGTGGTCTCTTCCTTGGCGTCGGCATCCTTGGTGAGTCCCGGGACTTCCTCATCGATCTTATCGTCGTCCAATTGGAGTC
+CGAGCTTGATCATTCTGTGGATACGGTTAGCGAAAGAGGTGGGCTCATCGAGAGAGAATCCAGAAGTAAGGAGAGAAGAA
+TCGAAGAGGAGCCAGATAAGGTCCTTAACGGTCTTGTCAGCCTTGTCCTTGTCGGATCTGGCTTTAAGCTCTTGGATGAT
+TGAGTGGTCTGGGTTGATTTCCATGGTCTTCTTGGAGATCATGTAGGTCGACATAGAGGCATCTCTGAGAGCCTGAGCTT
+TCATGATTCTCTCCATGTTAGCGGACCAACCGTACTCGCCAGTGACGAGAACGCAGGGAGATTCATCAAGACGTTGTCCG
+ACGATGACCTTCTCGACCTTATCGCCAAGGACTTCCTTGATCTGTTTGCAGAGAGGTTCGAAGGCAGCCTTCTTCTCTTC
+GTAGGACTTC
+>generic836
+GGGCCAAAAGCGCGTCATCGGCGGCTCCTTCGCCTACGCCGTAGGCACGCACACCTTGCGGTCCGCCCAAGGCGATTTTT
+TCGGAGGTGTCCAAGTTCTTGCCGGCACCCTGGCCGCTGACCTTGACGGTGATGGCGGTGGCGCGACCCACCGGCTGTTG
+ATATTCGCCCTGAAAGCTGATCTTGGCGTAGTCGCCGTTTGTTTGGTCGCCGTAGCCACTTTGCAAGCGCCCCAGGGTCA
+AGGTGACCGAGCCTTGGCTGGTGGCTCCCCACCAGGACGGGAGCATTGCCCGACAAGCCCAGCGAAAGCACTTGAATCTG
+CTTGGTGCTGGTGCTGCCCAAGGCGGTGTCATCGAAGCGTTTGATGTCCCAAGCCCCTTGCGCTTGCACGTTGAGGGTGC
+GGCTGCGCACCAAGGGCTGCAAGGCGTAGAGCGTGAAGTCACTGGCGCGGCCCGAGGCTTGCAAGCTGGCGGCCTCTTGG
+CCCAAGGTGTCGCCCATCACGGCCCCC
+>generic837
+CAAGGCCGACGCCACGCTGTTGTGGATCAAGGCGCAGGAGGACGCGGGACTGGACATCATCGGTGACGGAGAACAGTCGC
+GCCAGCATTTTGTGCACGGCTTTCTGGAGCAGGTTGAAGGCATCGACTTCGAGCACAAGGTCACCATGGGCATACGCAAC
+GGGCGCTATGACGCCCAGGTGCCGCAGGTGGTGGCTCCCTTGCGGCTCAAGGGCCGTGTCCATGCCTTTGAAGCGCAGCT
+GGCGCGAGCGCATACCCGCAAAAAGCTCAAATTCACCCTGCCCGGGCCTTTGACCATCGTGGACACCGTGGCCGATCGCT
+TCTATGGCGACAAGATCCGAATGGCTTTTGCCTTTGCTGAATTGTTGAATCAGGAGGCGCTGGCATTGCAGGCCGACGGC
+GTTGACATCATCCAGTTCGACGAACCGGCGTTCAACGTTTACATGCAGGATGCCGCTGATTGGGGTGTGAAAGCCCT
+>generic838
+CTGGCCCATGATGGGCTGGATGAATCACTTCCTAATTGGCGTAGGGGTCTGGGGCGCGGGATTTGCCGTCTTCAGTCCGC
+ATCTATGGGGTCCGCACTGGGTTCGCGGCCTGAGTTTTGGCGTTCTCACCTGGTTGCTGATGATGATCGTATTCCTGCCT
+TCCGCTGGTGTACCCATGTTTGCAATGGGCATGGGACTGTCCATCCCGTTCATTGGACTGGCGTTCAATCTGATATTTGG
+TCTCGTCATGGGCGAGACCTACCATTTGCTGCTGCATTATCTGCCTAGCGAAGTAGACGAAAACGCCTAATAAAATCAGG
+GCCCGGATGGGAAAAAGGCGCTTGCCTTTTCCATCCGGGTTCTGGGAATGTACGTGACGGTTAATTCATCGGGAGCCGTC
+ATGCCGCTCACAAAAATTGAACACGCAAATCTGCGCTGCGCCAATGTCGAACGCGTAAAAAGATTTTTACGTGATGCTCG
+GCCTCACGGTCGGCCCGCGCCCGCCA
+>generic839
+CCCAAATCCAGCCGGTACTGATCCAAGGCCTGACCGAAAGATTCGATCTGCGCCTTGGCCACCTTGGCGTTGCTCTTGCC
+GAGTTGATTGAAGTACTGCGGTGCCACGATCCCGGCCAACAAGCCAATGATCACCATCACCACCAACAACTCAAGCAAGG
+TGAACCCCCGTACACGCCGAGACTTCAAGCTCAGCATGACGGCTTGGTCGCGCGGGGACATGGGCAAGAGGAGCGGGGGC
+AGCGGCATGAAACATCCTCGGCAGGTCTGGAAAGAGCCGCGAGTTTAATGCCCACCCCCGTACAACTCAGCGTGTTACCC
+GCCGTCTCAAATCCCTTCGGGACCGAAATCGAGCACAACCGGACGACTTTTCCAGATTTCATCGGCGTACTGCGCGATGG
+TCCGGTCCGAGGAGAACGGCCCCATCGCCGCGATGTTGAGCACCGTGCGGCGGGTCCATTCGTCGCTGTTGCGATACAGC
+ACGAGTGGTGT
+>generic840
+GGTAAAGCCTTTACGGCTTTAAGAGTTGGGATCGAGCAGCTTCAATCGGTCCTCTCTAATCCTTTTACCGCGGCTCTAAC
+TGGAGCTGCCGCAACCGCCTTGGCATTCTCAGCAGGCTTGCAAAAAGCCCTCTTAGGAATCGTTGAAGGGGCTTACGCGA
+TCATGACCGGAGCGGCAGGCTCGGTCAGCGCGGCGATCAGCACGATCTTCAGAGGACTTGTAGGTGCTTTAAAGAAATTA
+CCGGTCATCGGTGCGATTCTCGCTGGCTTAGAAGGTGCTTATGAAGGCTTCCAGACCGACACATCCTCATATCGCAAGCG
+CTTGGGTATGGACGAGAAGGGAGACTCGTTTGGCGGTGATTTATTTTCTCGCACAGTCGGGGTACTTTCAGACGTTGGCA
+GCGCTGCGATCAAGGGTGTTACCTTCGGGATGTATGACCCGTCAAAGAACTTCGCCGATAAGCAAAAGCCTACTACTCCA
+GCTACATCGACGCCACAGAGCACGA
+>generic841
+AGGGGGCCGACCGACCGGGGCCGGACCTGCTCGATGCGGCCGCACTCGCGGCAGACCAGGTGCACGTGCTCGGCTTCGGC
+GGCCAGATGATAGCGGGGCGCGCCGTGCCCCACGGTGGCTGTGCGTGACCAGGCTGAGCTGCTCGAGCAGCTCGAGCGTG
+CGGTAGACCGTCGAGATGTTCACGCCCCGCGCCGTCTGCTGGACCCGGGTGCAGATCTCCTCCGGCGTGGCGTGCTCGAG
+CGCGGTCACCGCCTCGAGCACAAGCTGGCGCTGCGGCGTGACCGGTAACCGCGGGCCCGCAGCTGATCATCCCACGCCTG
+CGCCATAACCAGAGTGTAATAACGGGGCGGGTGCGCAGCGGGACGGGAAGGAG
+>generic842
+GCGCGCTGTTGTCGAAGTCGGCCAATCCGCAGGTCTACGTCGGCTATCCACTTCAAAACCTGTATGGGGCAACGCGCGAC
+TTCCGCTTGCTATTGTGCCTCGCCGATAGCATTCCGGGCCACACCGCTGGGCAGATTTACCCATACTTGCAATCGGTGCG
+CACCCTCATCGACGATATCCGCGAAGAGGCGACGGTCGATTCCGTGGTCGAACGCATCGTCGAGCTGCGCGCAAAAGCTA
+CAACGGACGTCGATCGCCGCGCCTTCGACCTTATCGAGGTAATGACCGAGCGCCGCGCCGCCGAGCTACGCAATCAGCCG
+GGACCGCATGTCGACAAGGCGGTGGCGGCCTTGCAGCGGGCATTCAAACGGCAATGGTCGCCGGGCGAGGAGCGGTTTAT
+GGCAGACTACCTCGCCTCGCTGGGCAAGATTCCCCAGGACAAGCTCGCCGCCGAACAAC
+>generic843
+CGAGCTGCGCGGTGATGGACGCGGCCTGCGGCGCGGCGGTGACGCTCGGGGCCGATGCAGGTCCCACCACAGGCCCGGTC
+TGCACGACAATACTGTTCTGCGGCTGCTGCGAGGGCTGCGCCACTCGCGGCACGTTCGGCGCTGCGCACAAGGAGCTGCC
+GCAATGAGCCTGCGCCCCTTCACCATCCTCATCATCCTCTGCGTCGCGCTCGCCGCGTGCGCAGCGCAGAGGATGATGAG
+GATGGTGAAGGGGCGCAGGCTCATTGCGGCAGCTCCTTGTGCGGGTGCTCCTTGCGCGGCGCCTCTCGCGGCGCCTCCTT
+GCGCCGCAGGATACGCACCGTCGAGCGCATCAGGATGTTCGGGATGAAGACGAGGTCGCCCGCGCCCGTGCGCAGCGTCG
+TCTCGAGGACGAGACCCTGATCACGATGCCTTCGA
+>generic844
+GCGCCCAAATCGGTCACCGCTTCGGTGGCGATGGGCATTGCCGAACACATCGGGGGCGATCCCCGCCTTGGCCGCAGCGT
+TTGTGCTGATCACCGGCATCAGCGGCGCGCTGATTGGTAAATATTTGCTCGACGCCATGCACATCCACGACTGGAGCGTG
+CGCGGTTTCGCCTTGGGCAACGCCGCCCACGGCATCGGCGCCGCCCGCGCCATGCAAGTCCACCCCCGACGCCGGTGCCT
+ACGCCGGCCTCGCCCTCAGCCTCCAAGCCCTGCTCTCCTCCATCCTGATGCCGTGGCTGGTGGCGCTGTTGATGCCCCAT
+TGAGCGTTGGTTTGAGTCACGCGTGACACAGCGCTTCAGCACATAGACTCCGCGCTTGGCTTCTGCTTTGCTCCGATGAA
+AACGCCTTCGACCGTTCCAAACATGTCTACAAAAACGATCAGTTTGATGAACTGATCAAGGATGCTGTTCGCTTTTTC
+>generic845
+CCGGTGGCGATGGCGTTCGACGAGAACGGGCGCTTGTTTGTGGTCGAAATGCGCGATTACCCGGACCGCCGGGAGGAAAT
+CCCGCATCTGGGGCGGGTGCGAGTTCTGGAGAATCGAGGCGAGGACGGGCGGTTCCAGACGGCCACGGTGTATGCGGACA
+ACCTGCAGTGGCCGTCGGCAATTGCGTGCTACGCGGGGGGCGTGTTTGTGGCAGCGACGCCGGATATTTACTTCTTCAAG
+AACAGCCCGGACGGCGGCAGCGATGTACAACAAGCGGTGCTAAACGGGTTCGGTGGCACCAATACCTTGCAGGCGGAGGC
+CTTGCTGAACAATTTCAAGTGGGGGCTGGATGACCGGCTGCATGGAGCGACGGCCGGTATGGGGGGTTCGATCACGGCCT
+CAAACTGGTCCTCGGGTTCGGTGTCGCTGGGGGGCGGAGGATTTCTCAATCGATCCGCGCTCGCTGGCGGTCTTTCCCGA
+AGCCGGGGCGGGGCAATCGGGCCTGTGCTTTGACAGCCACGAGTGGTGT
+>generic846
+GACAAATCGACATTCACAGGCGTTTTGGACACGATAAACGCGCTGTTCATGGGGGCGGTCCTCGACAGGGTGCGCCACCA
+CCATCAGCTTCAAACGCTTGAGCTCTACCGACCACTTCCACCAAACGCAAGCGCCCGTGCCGACAGTGCGGACAAACGTC
+CATGTCGATCGCGGCCACTCGGCGCATGAAGTCTTGGGCCTGCTCACGCGCTATGGGGTTGGTCTGCGGCATCGCCAGCA
+GGCGACGAACCAAAGCTAGACGCTGCACCTTGGCCGATGGGGCAAGCAATCCATAGTGGCGGATCCGTTTAAAACCCGTG
+GGCAAGACGTGCTGCATCAGCCGTTTGATAAAGAGAGCACCAGGCATGGCTAGGGTGCGTTTGCCTCCTTGCTCATCGGC
+GCGTACCCGCAACAACACGGCCCCATCCTTGATGCCCACCAGTCGTTCGTGACCAATAGCCGTGCGATGGGTATAGCGCG
+AGAGG
+>generic847
+TGCTGCCACCGGAGCGTGTCAGAGGCCGACGGCGGCCTGATCTGGCCGCACTACCACACGTGCTCGTGCCGGTTGGAGTT
+TGACGCAACCCTGCGACCCAAGGGCTGCAAACACCACAACCCCGACGGGTGCAAGATTTGCCCGATATGCATCATGTTCC
+CGTGCATGAACTTCATGCGGCGAATCGCAAACCACCTGAAGCTCCTGCAAGTCGTCGCGCCAAAACCCGTCCAAGACCCC
+GAGCAGCAGGAGCGGGCGGAGATTGAGACAGAGTTCCGCGAGCGCGTCGCCGAGCTGGCCTTTGGCGACGATGCAGACGC
+GCTAGGCGGCCTGACGCAGGACAACAACCTGGTGCGCAACAGCGACGCGAGCGCGTGCGGCAAGGTCACCGTGCTGCTGC
+GCCTGCTCGCGCTCTGGGCCGTCGACAGCAAACACGCAAACAAGGTGCTGCTCTTCTCGCACAGCAC
+>generic848
+CAAAGGCCATGGGTTCCTTGTAAACCCGGCGCGAGATCAGCGCATCGAACACATCGGCCAAGGCCATGAGGCGTGCCGGG
+ATGGGAATCGCCTCCCCGGCCAAACCATCGGGATAGCCCCGACCATCCCAGCGTTCGTGGTGCCAATGCGCAATCTGCTT
+GGCCATCAGCAAAAACTCCATCGGCTGCTCGCTGTCGCGCTCAGCCATTTCGATGGCCTCGGCCCCCAGTTGCGCATGGG
+TTTTCATGATCAGCCACTCCGAGGGGGTGAGCGGGCCGGGTTTTTGCAGGATGTAGTCCGGAATGCCCACCTTGCCGATG
+TCATGCAAAGGCGCTGACTTGGCCAAGCGTTCGATGTTCTTGGGCGTCAGCAACCAAGCAAAACGCGGATGGTGGGCCAG
+ATGCAGGGCCAACGTGCGCACATAGGCTTGGGTGCGGCGGATGTGGTTGCCGGTGTCGGAGTCACGCGTTTCGGCCAGCC
+GAGCCAAGGC
+>generic849
+GCGAATACAAAATGCCCAGCACATCATGCTGTGTTGCGCTATCAATCTGGTTCTTGGTCAATGCGCCCATGATGTCATCC
+ACGACAGCCAGATACTCTTGTTCGCTGATGTTCATGCCACGGTGGGCGGTGAGCATGTCGCGGCCGGTGTAAGCCTCAGG
+GCCTCCTGCACCCATGCAGAAGAATTCGCGTGCCAGCCGCTTGGCTTTGTCTAGATCCGCAATGTGCTCGAAGCGGGTCT
+TGATCGTCGGGTTCGCCAAATGCGCCGCCATAACATCATCGACTAGACGCCCAATGCCGTCAGCTTTGCCCAAGCGTTCG
+TAAAGGGAAGCGTTCATTTTGAATCTCCTTCTATGTCTCGGGGCGACTCCATATCGCCCCTGCTGTGATCAAAACAGTAG
+CGAGATTTTTTCAGAAGTCACATGGCTTTCCATC
+>generic850
+GGCGACCTCGCTTTGCTTGACGCCCTCGCGCAGCGGCAAGCGGATCAAGATATCCCGTGAGGTGCCGAACTTCTGCACCT
+GCACGTCACCGAACTTCATCGCTTCCACGGCCGCGCGCACCCGGCCGATGTCGGCGCTTTGGGCGTATTCGACTTCCAGC
+ACATTGCCGCCGGTGAATTCGATCGACAGATGCAAGCCCCGTGTGATCAGGAAGAACACGGCGGCCAGAAAGGTCAGCAG
+CGAAATGATGTTGAACACCAGCGCATGCCGCATGAACGGGATGTCGCGGCGGATACGGAAAAATTCCATCGTCTATCTTC
+CTCAGGCCTTGGGTTCGAGCGCGGGGCTCGGTGCTGATACTGATCCTGGTACTTGCATTGAGGAGAAGGAAGAAGGCTTA
+ATTCATTTAGTAAATTATTAAAATGCGAAGTCGGTTGGCTTCGCATTTTTATTGCAGCTGAGTGAGAACACCGAACCGCC
+GTGTAGTTTTTTGGG
+>generic851
+CCGCATCGTATTACGCTCCAAGCCATGAACGCTCCGATTCGATTCATTTTTCGCGGTCAGGTGGTTGAAGCTGCCAACAC
+CGACCCCACCCGCACCCTCTTGCAATGGCTGCGTGAGGATGCCCGCACGTTGGGCGGCATGTTGGGCGGCACCCTCGGCA
+CCAAAGAGGGCTGCAACGAAGGCGACTGCGGGGCCTGCACGGTCATCGTGGCTGAACTCGAAGACAGCAACGTTCGCCTA
+CGCACCCTCAACGCCTGCATCCGCTTTTTGCCCACCCTGCACGGCAAAGCCCTGCTGACGGTCGAGGATCTAAGCCTCAC
+CCAGCCACCCCGGCTGCATCCGGCCCAAGAAGCGCTGGTGCGCTGTCATGGCTCGCAATGCGGGTTTTGCACCCCCGGCT
+TTGCGATGTCGCTGGCGCTGAGCTTCGAGCGCCAACGCCTTCAAGGCCGCTGCGCCAGCCGGGCCGAATTGGCGGATGAC
+TTGGCCGGC
+>generic852
+GCCGTGGCCTCAGCCCTGCTGGCGACCCCATCCAACACACCCACACCCTCGGCAGGCACCGGCGTGCCTTTGCTACCACC
+GCGTGTCGAACACTTGAGCTGGTTGAAAATCGACCCCCTCGCGGTGACCAAGCTGTCACCCCATTTGGTCCTGCTGCCCC
+GGCGTACCTCCGTCAATCTCAATACCGCCAGCAAAGAAGTCATCGCCGCGATCATTCCTGACTTGGATTTGGCCAGCGCC
+CAACGCTTGGTACAGGTGCGCCAACGCACCCCCTCAAGACGCTGGATGCCCTGGTCACGATCTTGGGGCGGCCCTTGCCG
+AGCAACTTGCAAGGCTTGGATGTCCGCAGCAACTACTTCGAGATCGTCGGCTCCTTACGCTTGGATGAACTGATCGTCAG
+CCAGCGTTCCTTGGTCGAACGGGTGGGGCTGGAAGTGCGTATTCTCTCGGTCGAGCGCGTGGGCCCAGGGGTCTTGATGC
+TGGCCCCGACACCGTCGCCTTTTTGAT
+>generic853
+CGCGGGCCCAAGCAAGTTCTGCCTCAGGCACCTCAAGCACCAACTCATCATGCACTTGCATGATGAGTCGGCTAGCACGG
+CCCTCAACGTCGATGGCGTCTTGGACGGCCAGCATCGCCAGTTTGATCAGATCTGCCGCCGTACCCTGCATCGGCGCGTT
+GATGGCTTGGCGCTCAGCGGCTGCCCGACGCGGGCCACTGCCGCCACGAATATCCATCAATTCAATGCGTCGCCCGAACA
+AGGTCTCCACATAACCGTGCTCCGCCGCTTGGGCACGCGTGGCGTCCATGTAGCGCTTCACGTCGGGGTAGCGGGTGAAA
+TAGCGCTCGATATAGGCCTTGGAAGAAGCCATATCGATGCCCAAACTCTGCGCCAACCCAAAGGAGCCCATGCCGTAGAT
+CAGCCCGAAGTTGATGGTCTTGGCATAACGCCGCTGCTCGCTGGTGACTTCACCCGGTGTGAT
+>generic854
+AGGCGGCTGAGGCGCTCAGGCTATGCTGAAACGCCAACTCCGAGGTGATCAGCGCCTGCTGGTTGGGGTCAAGGAAGGGC
+AGCAGCGTCGGGATGGTTGCGTCCCACCAGCCCAGGCCACGCAGATTGGGCTGGTGCCGGGCATAGTCTCGTCCGGCCAC
+ATGCATGCGCGCCAACATGGCTCCGACTTGTTCGCAATGGGCCACGGCTGGGGCCAGTTGATGCTGCCCAGCCAGCCGGT
+TGACCACCGCTGCCGGCTTGTTGCCTACATGCAGCAGCAACTCACCCGCTGCATCGGCTTGGGGGTTGGGCACCGGGATG
+CCGCGTTCGGCCAGATGCTTCATCAAGTGCAGGTAGAAGGGCAGCTGCTCGAAGCTCAGGCGCTCGAACACCGTCAACAC
+CCACGCATGACGTTGCCCGTCGCGTTCGGT
+>generic855
+GCCGCAGCAAGGGCTCATCCATATTTTGGCGGACGAGGCGCAAGTGCGGGCGGCCTGCGGGATACCCTTCCGCAATATCG
+TCGGCGTGGATATCGATGCGTCCTTCCATCAGCAAGCGGTCAACATCAAGCCAGTGGTCGATCCGAATGATTTGGAGGAA
+ATCCTAAACTCCAAGGATTTGGTTCGGCTGGACTCTTTTTTGTGGAAAATAGCCCTGTTTACCTCCAAAGGCCGGCTGCC
+CAAAGGCGTCGATCTCGATCAGGCTTTTTTCCTCAAACGTTGGCCCGGCATGACGCGCCTGATGTTGCCGCCCCACGCCA
+TGCGCATCGCCGCGCTGCTGGTGCAAAAGCCCTATTCGGTGTTCGAGGCCGCGCGCAAGATGGGCATCCGCCAGCAATAT
+GTGTTCGCCTTCGTCAGCGCCGCCCACGCGCTGGGCCTGATCGGCCAACAACCAATCCCGGTTGAAGCGGAAGCCCCGCC
+CGAAATCGAGACACCCGCCGTCATC
+>generic856
+GGCCACCACCGCAGGCAGCACTTGGGCGGTGCAGATGTTCGAGGTGGCTTTTTCGCGGCGGATGTGCTGCTCGCGGGTTT
+GCAGCGCCAAGCGATAAGCCGGGTGGCCGTGGCTGTCCACGCTCACGCCCACCAGTCGGCCGGGCATGGAGCGCTTGTAG
+GCGTCCTGCGTGGCCAGATAAGCCGCGTGCGGGCCGCCGGCACCCATCGGCATGCCGAAACGCTGGGTCGAGCCGCAGGC
+GATGTCGGCCCCGAGTTCACCCGGCGGCACCAAGAGCGTGAGGGCCAGCAAGTCGGCCGCGACGATGGCGAGGCTGCCAG
+CGGTATGCACCGCGTCGATGATCGGGCGCAGGTCGCGCACCTGACCGTTGACACCCGGGTATTGCAGCAGCACGCCAAAG
+GCCGGTGTCGCGGTCACGCTGGCGGCGATCTCGCTGGCATGCACCTGCTCAACCCTCAGCCCCAGCGGCGC
+>generic857
+AACAATTGCTGCAAATGCCCTAACACTTCCACTTGTGCCAAATCATTGTGCAGATGATGTTTGACCACCAGTTCCTGATA
+GCGTTTTTCCAATATTTCAGGATTAAGTGCGGAATGTTTGAATTCGGCCGAATTTTTAGCGCGGTGAAACAGGGATTTAA
+ACATGGGCGAATAGCTAGACGATGAAAGTAATAGCTTACAGTTCAGCAAATAGTATGCCGCGTGAGACCTTCCAGGTTTT
+TAAAACCTGGAAGGTCTGAGGAAAAGTTACTTCACAAAACAACTGTTTTCCGCATAGTCTTCTGCTTCTTTGATGCGTTT
+TTTCAGTTTTTTTGCCTGCTCAGGGTCGCGGAATGCCCCGCCCGCTTCGCCGGCAGTTTTGCCCATAAAACCAAATGTCA
+CCGCATCTTCATAGTCTTTGAACGTGAGTTTTTCAGCCATTTTGTCAATTTTGCAACCGCAGTTATATTGATTGAC
+>generic858
+AACAAAAAGCATTGGAAACTGGATGTGATGGTGTAATGCTTGGTCGCGCGATTTTTGGAAACCCATGGCTTTTTTCTGGT
+TACATCGCAACTCGTGATGAAAAATTAAAAGTTTTGATTGAGTCACACAAAAAAGTTTGAGGAACTTGTAGAGCCAAAAC
+CTCCTGTAGGGCAGGGGAAGTCGTTTGCTGTGATGAAAAAGCACTTCAAGGCGTATGTGAACGGATTCGATGGGGCAAAG
+GAACTTCGCGTAGAACTAATGGAGGCAAAAAACTCAGTGGATGTTGAAAACACAAATAAACAATTTACTTCAAAAACAAC
+TCGCTTTAGACTCATCTTCATTTCGGCTTTGTTTAAGCCATATTTTCGGTGTATATAAAAGAATAATTGATTGTCATATA
+AAAATTGCTTGAC
+>generic859
+GCCGCAAAAAGCCGCGCCATTGATAGCGGATAATGCAGTGACCGCACTGCCTAAGATCGGCTGGCAGGCTTACGGTCCGG
+AAGTGAACGGGACTCCTGTCATGGCGCAGGCCTTGTTGACATTGGACCCGACTCGTCCCTATGCAGGTATCGCGCTGGTG
+CGCATTGATCTTTCGAAACTTCAGCTCCACATGATGCCGGGATTTCTGGAACCATCTCATACATCCAGTGTCCAGCATGC
+CTTTCCAAATTTAGGATTGATGCCAGCCTCGGATCAAATCCGTCTCATTGCCGCATTCAACGGAGGTTTTAAAGCCGTCA
+ATGGTCACTATGGAATGATGGTCAATGGCGTTACTTTATTACCGCCTACTGATGGCCTGGCAACCATAGCCATTTATGGT
+GATGGTCATATACAGATCGGCGCGTGGGGACAGGATATTCTTCCCTCATCAGACATAGTTGCCTATCGGC
+>generic860
+CGCCTAAAGCTTGCGCAAACGCTTGTCCTAAGGTAATGCCAATATCTTCAACGGTGTGATGTGCGTCAATGTCCAAATCG
+CCGACGCAATGAATGTCCATATCAATGACACCGTGTCTTGCAACTTGATCGAGCATGTGATTTAAAAAGGGAACGCCGGT
+TGTAAAATTGAAATAATCCTGATTCAACCAGAGAGAACCATCATCGAAAATCGTGACCATTTCAGCGGTTATAAGGTCGC
+GAAACCGGTCCACATCCCCAGACGATCTGTTACCGTATGGGGCGAGGCCCATCAGTTTATATTCCCCCCGAGTTTACCCT
+GAAGCCCAGAAACGNGGTAAAGGCTGAGTAGAGCAGCCCGAGCGAATGGGGTAAAGCGAAGTTTCCTTGATCAGCTCCAG
+CTGACTGTTTTTGCCCACACCGATTGTAGTGGTGGCCCACTCTCCTGCGCCATCGATGGTGAGTATGGCCG
+>generic861
+ATTCCGGTGGCCTGCACGCCGCAGCCGTCGAGCGCAGCACCCATCAGCGGCGCAGTGGATGAGTGCGAAGTCAGCTTCGC
+CCACACGATGCAAGTCACCCGCATCGTCGAAACCCCACGCGTCACCAAGCCCTACACCGAAGAGCAGTGGGCCGAGATGC
+TGGCGCTGGGTGAGGCGGTCGATGAAGAGCTGGTGGCGGGCGATGTGCGCTTGACCATGGGTGGCGAGCCGACCTTCGTT
+CGGTCGATGACCGTGATGGCGACGAATGGAACACCGAAGCGCTGGGGCCCGACCAAGCGGCTGTTTGCGCAAGACTTGGT
+GCAGCGTCTGCGCGACCATTACGGCGCGAGCGGTTTCCTGCATTACGGCCAAGGCAAGTGGTATCCGGGCGAGCAATTGC
+CGCGCTGGGCAC
+>generic862
+CCGTGCTCGTCACTCCTGTCGAACCCGGGCGAGTAGAGACCACGGTGGCGAACACGCGCGCCGGATCGGTGATGGCCTGC
+CGCCGCGCCAAGCTCGCTCCGCCGCTTGGCGGCCGCATCCAAAAGCTCGCCGTGCACAAGGGCGACCGCGTCAAGCGCGG
+GCAATTGCTGGTCGAACTGTGGAACGATGACCTGACGGCGCGCGAGCGCGTATCGGTCGAGCAGTTGCAGACGGCGCGCG
+CGCATCAGAGCGAAGCCTGCACCCTCGCCGACATCGGCCTGCGCGCCGCGGTGCGCACGCGGCAGTTGCGCGACCAGAGC
+TTCGTCTCCGAGGAGAATGTCGATCGCGCCGAAAACGNGGCCAAAGCGAAACAGGCTGTGTGCGACTCGGCGCGCGCCCA
+GGTCCAGGAAGCGGCGGCTCGCATCAGTGCCGCCAAGGCCGACACCGCGCGCACTTTCATACGCGCTCCGTTC
+>generic863
+CGCCGTCAAGGCCGATGCCGACAGCGCCCGGTTGCTGGGTTTGGTTGAGGGCGCGCCCTTATTGAGCGTCGAGCGGCTCT
+CCATGACTTATGGGGACAAGCCGGTGGAGTGGCGTCGCGGCCTATACAACACCTCGCAGCACTTTTATCGCAATGACCTC
+AGCTAAAAATGCATGATCCGTGATCCTTTCGCGGGTCAGTCTCGGGTCAGGGTTCACCCGGGTCCTTGAAATAAAATCGT
+TCGGTTTCACACCCATTACAAAGGTGCTTCATGGCAGACACAATCAAGCGGCAGCGCCCGGTTTTTCGCAACATCAACAT
+CCTTGATTTGCGGCACTATCGCCTGCCGTTGGCGGGCATCGTCTCAATCCTGCACCGGGTCAGCGGCATGCTGATGTTTT
+TGCTGATGCCGTTCATCGTTTGGATGTTCGACACCACGTTGACCTCCGAGGTGTCGTTTGCCCAGTTCTCGCTCCATTTC
+GA
+>generic864
+GATCGAAGTGCACAGCGAGCAACTCGACAGCCGCTCCATGGTCTGCGATTTTTCGGACATCAAGCGCACCGTGAAGTCCT
+GGATTGACGATCATCTCGACCACAAGATGATCCTGCGGCGCGACGACCCGTTCGTCACGCTCCTTCACGAACAGCACGAA
+CCGCTCTTCCTCGTGGACGCCAATCCCACCGCCGAACACATCGCGAAGATCATCTACGACTTCACCAAGTCGCAGGGATT
+CGCTGTTGCCGCGGTGCGAGTGTGGGAAACGCCTGCGTCGTTTGCCACCTACACCGGCGAGTAGTGTTCGACGGCCTTGC
+CGGATCTCTGTTCTGACCAGTGGGCGATCGTGGCGATAATTGGAGCCCGAAGGGTCTTTTGCAATCCGTCATTCCGGCGT
+ACGCCGGAATCCACGAATGGATCCCGGCCTGCCACCCCAACGCGGGTGCCGCGTCGGGGGCCCCGGCGTTTCGGCGGGAG
+TGACGAACGAAAGTAGAGTCACTGTGC
+>generic865
+GTGCAATCAGTGAGACCACGAAAAGATTATCGGGAACGAATGTAGCGTTGAACAGGAGTGCCGTCAACCGGGGCCCCATT
+TGTACTATACTTCCCCGCGACAGAAGCAAACTCCAGGAGGGGAAGGCATGGCACAGGTGAAAAAAGGCGACCGGGTGAAG
+TTCAATTACGCGCTCACCCTCAAGGACGGGAAGGTCTTCGAGACCAACATGGGCCAGGCGCCGCTCGAGATCACGGTCGG
+CAAGGGGAAGGCGATCAAGGGGTTGGAGAACGGGCTCGTCGGCATGACTCCGGGCCAGATCAAGACCGTGGTCGTGAAGC
+CGGCGGACGGCTACGGGGCGAAAGACCCGGCCTTCGTCTGGACGGTCCCCGCCGCGGAACTGCCCGCCGGGACCGAGCCG
+GTCGTCGGGACCGAGGTCAGCCTGGCGCGCGCCGACGGCTCGCGGGTCGAGGGCCGGGTCGCCAAGGTCGAGGGCGACC
+>generic866
+CGACGGTGGTTTTCAGTGCCCACGGCGTGAGCCAAGCGGTGCGCCGCGAGGCCGAAGCCTTGGGCCTGCGCGTGTTTGAC
+GCCACCTGCCCGCTGGTCACCAAAGTCCACATCGAAGTGGCCAAGCTGCACCGCGAGGGCTACGAGTTCGTCATGATCGG
+CCACAAGGGCCACCCGGAAGTCGAAGGCACGATGGGCCAGTTGAACGAGGGCATCCATCTGGTCGAGTCAGTCGAAGACG
+TGGCTCAGGTCCAGCCCAAGCAGCCGCACCATCTGGCGGTGGTCACCCAAACGACCCTGTCGGTGGACGACGCTCGCGAG
+ATCATGGACGCCCTACGCGCGCGCTTTCCCGCCTTGCGCGAGCCCAAGAAACAGACATTTGCTACGCCACCCAAAACCGC
+CAAGACGCCGTCAAAGTTCTTTCGACCGAAGTCGATGTGGTGGACGAGTGGTGT
+>generic867
+ATGAGAACGCCTTCGGCTTGATGCGCGCCTGTTACGCCGAACGCCAAGCAGCTTTCCCCGAATGCCGTTTCAGCAGCTGG
+CGTGACGCCTTCAAACCGGCTCCGGATGTGGCGGTGGCCGATCGCATCGGGGCGGCTGATTCGGATTGGTCGTTCTGGCG
+GGCTCATTTCAAACCGGGCAAGGGCGAGCCCGGAGATCCGCTGACCCAGGGCAGCCCTTTCACGGTTGAGTCCTATCTGC
+GCCAAGCTGTTTTGTTGGTGGTGGAGCTCATCCGCTCAGCAGGCGAGCGCGAAGCCGGTGCCGGGCCAGGGCCAGACAGT
+CCCCAACGCAGCGGGGCACAAGGCGTGGCTTCAGCCATCGACCACTTGCTCGGCTACGGTCAACTGGCCACCTTGGCCGC
+CGTGTTTGAAGCCACCGATCTGCTGCATCAGGTCATGGACAGCTTCTTGCCCCAAACACTGCGCGAGTTCAGCCAACCCT
+TGACGCGGCTG
+>generic868
+GCGCGAAGCGCAGAACAAGCGGCGTATTGGGCTGGGTTTTACGGGGTTGGGGGACGCCTTGGTGATGCTGGGCTTGCGCT
+ACGACAGCGAGGCGGCGCGCAGCATGGCGCAGCGCATCAGCGCGGTCATGCGTGACGCCGCCTATGCAGCATCGGTCGAT
+TTGGCCGAGGAGCGCGGCACCTTTCCTCTGTTCAACGCCGACTTGTACTTGAGCGGTCAAAGCTTTGCGACGCGGCTACC
+CACCGCGCTGAAAGAGCGCATCCGCACCCACGGGCTGCGCAACTCGCACCTGTTGTCGATCGCACCGACCGGCACCATCA
+GCTTGGCCTTTGCTGACAACGCCAGCAACGGCATTGAGCCGCCTTTCAGTTGGAGCTACATGCGCAAAAAGCGCGAGGCC
+GACGGCAGCTTCAAGAGCTACGCGGTCGAGGATCACGCCTGGCGGCTCTATCGCCATCTC
+>generic869
+GTCGGGGCCGTACCGGGCACCTTGATCTACTTGGTGTCGTACCAATTCGTCTCGCGCAGCATCGAGAGCTGGTTCGATGT
+CGAGATTGAGCAAGCCTTGGAATCGGGCCTGAGTCTGGGCCGCACCAGCTTGCAAGTGCTCAGCAGTGGTATCGGCAACA
+AGACACGCTTGGCCGCCGAACGCATGGCCGAGGCTCCAGAGTCGCAGCAGATCGTCTCGCTGGAGCGTCTGCGCGAACAA
+CTTGGGGCCTACAACGTTTTGCTTTTGTCTGATAGCGGCCAAATCTTGGCCTCGGCCAACAGCTCGATTGAAGACCATTT
+CCTCCCCACACGCCCCACGCCCGCCTTGATGCGTCAAGCCCGATCGCTACGGGTTCACACCAGCGTGGAAGGCTTGGAAG
+AACACGACCCAGACAGCAGCGGTATTCAGCCGGCACCCGTCAACGCCCGCATCCAAGCTTTGGCTTGGATCCCACGAGTG
+GTGT
+>generic870
+CCGATGCCGGAGCCGCCGCCGGTCACCAGAATCGACAGGTCTTCAATCGTGTGCTTCATGCAATGTCTCTCTCGTTGTGT
+GTGTGTGCAGTGCTGCGGGGAAGGTGTCAGGGCGTCAGGGCGCAGGCCCAACGGGCCGCGCGCTGGATGATTTGCTGGTG
+CACGCTGTGCGTGAGCGAGGCGCTGTCGTGGCCCAGCGCGTCATAGACCAGGCGGCCGCTGTCCAGCGTGCGCGTCCACA
+GGCAGGGCGAGAAGGCGCTTTGGCCGTCGGCGCGCACCTCCATCAGGGGCTGCACGCCGGGGGCTATCAGCATGTCGGTA
+TAGGCCTCGTCGGTGAAGCCAAAGGCCGGCAGGCCGGCCACGATGGGGTGCGCCAAACCGGTGGGCTGCACCTGCACGGC
+GCCC
+>generic871
+ATCGATATGGGGGTGGTCGACCCTAGGGCTCCTGGACGTTACCTGGTTGGTATCGAGTGTGATGGTCGCACGTACCACTC
+CGGCGCGACGGCACGGGACCGGGACCGCTTGCGTCAACATATCCTTGAGGGGCTTGGCTGGCGCATACACAGGATATGGT
+CAACCGACTGGTGGCTGAACCCTGAAGGCGAAATCCTCAAAGTAATGGCCCGACTTCAGGTGATTCTGGATGAGTCATTG
+AAAATTGATGAAGAACCTGTCGTGGAGGAGCCACCGGAAGTGGAGTCAGAGACCATCGAATCCGGCGAAGTGAGCGAGGC
+CAGATATGCTTCATCGGCGTCTCCGGAACTGGTCAAAAAAGTCAGCACTCCAATATACATTCCTGTGACATTGGTGTCCA
+ACGGTCCAGCAGACTTTTACCAACCTGGCTCGATTTGGCAGCTTACTAGGCAGCTCGAAGATGTCGTAAATGCAGAAGGT
+CCAATTTCTGAAACGGTGCTGTTTA
+>generic872
+CTGCTGTTCAGTGATCGCCTGATTGGCGGCATGTTTGAAAAGGGTCTGAGCAACCTCAAAGCGCTGGCCGAGAGTGCGGC
+ACCGGCGGTGCTGGCACCGTGAGTTGAAGGGCTCGTGGTAGATTGAATAGATTCATGAATCTATTCATTGATCTATTCAC
+TCGCCCCGACCCAGTGTGACGACCCACGACGACAACCTTCGACGATATCTGGCACAAGGGCCGACCAGCCCACGCCAACT
+CCTTGAAAAAACAGGGATCAGCCAGCCGACGCTCTCACGAGCGATATCGGCGATGGGCGATGCCGTCGTGCGCATCGGTG
+CGGCCAGATCCATTCAATACGCTCTGCGCGACCCACAACGCGGACTCAACGACATCCCCGACGAGTGGTGT
+>generic873
+GTGCGCCGTTTGATATGTGGGACAAAGATGCAAAACATGGCGTAAAACTCTATGTTAAAAAGGTCTTCACTCATGGACGA
+TGCGGAACAATTGATGCCACGTTATTTACGTTTTGTGCGTGGGATTATTGATTCAAATTCGTTGCCTTTGAACGTGTCGC
+GCGAAATTTTGCAACAAGGCAAACAACTCAACACAATCAAATCGGGTATGTGATTGGTGTTGCGAAACCCCTCTCCGTAT
+TTGTTGATACGCGCGGGACGCACAAAGTTCAGATTGAAAAAATCGAGGATGCGATCAAAAACAACTTCTCGTTCAAACCA
+GCTAGAAATGATTAAGAAACTCGACTTATTGCGACCGATTTACAAGAAAACTGCAGCATATGGGCACTTCGGACGCGAAG
+ATCCGGATTTCACTTGGGAAAAGACAGATATGGCGCAGAAACTGAGAAGTGAAGTTGGATTGT
+>generic874
+CCGGAAGGAAAATTCCAAGCGCTGGAAAAATACGGCCGCGATCTCACGGCGCTCGCCAAACAGGGAAAGATTGATCCGGT
+CATCGGCCGCGACGAGGAAATCCGCCGCGTGATGCAGGTGCTCACCCGCCGCACAAAAAATAATCCCGTGCTTATCGGCG
+AACCGGGCGTCGGCAAGACGGCCATTGCCGAAGGTCTGGCTCGGCGCATCGTGAGCGGCGATGTTCCCGAATCGTTGAAA
+ACAAGCGGCTCGTGGCGATGGATCTGAGCGCGATGATCGCCGGCGCGAAGTATCGTGGTGAATTCGAAGACCGGCTCAAG
+GCGTTTCTCAAGGAGATCACGGCGAGCGAAGGGAAAATCATTTTGTTCATTGATGAGCTGCACACCATCGTCGGCGCGGG
+CGCGGCGGAGGGCGCGACGGATGCGGCGAACATCATGAAGCCGCAGTTGGCACGTGGCGAACTCCGCTGCGTGGGCGCGA
+CCACGCTGGATGAA
+>generic875
+ATAAGGCGGCTGATTGAGAGGTCAATTGACCTAATATGGCAATTTCCTGAGCTAATTTTTCTAAGAAAACACGTCGGTTA
+AATAAATGGGTGAGGGGATCGGTGTTTGCTAATTTTTGCAACTGTTTTTCCAGTTGTTTACGTTCAGTAATGTCGTCTTT
+GATGCCGATGAAATGGGTAATGTCCCCTGCTTTATTTTTGACGGGTGCAATGCTCAGTTCTTCGTGATACAAACTGTCGT
+TTTTACGCTTGTTAATCAGTTCACCACGCCAGTATTTACCCTGCATAATATTGGTCCACATCGTTTGGTAGAAGCTCTCA
+TCCTGTACGCCAGAGTTCAGCAAGGTAGTCGGCTTATGCCCTATGGCATCTTCTGCACTGTAACCTGTGAGGCGCGTAAA
+TGCTGAATTAACCCATGTGATGATGGCGAATTTGTCAGTAATCATAATGCCGTTGGCGGCGGCTTCCAGGGCGGCAACCG
+AATAAATTATTACGCGCTTCCAGTTCGGCACGAAATAAGGC
+>generic876
+TTGGCTTTCTCGTCCGCGTCATCCAACTGGATGCGCCCATGGAACGCCTCGAACTGTTTTTGCAACTCCGCCATTCTTTT
+TTCCTCACTGTCATCCAACAACCACGCTACGGTAGCGACCAAACCGGCCCCAATCAAAGGATGCATGCCGGTTACCCCTC
+AAACGCCCGCCCAAGCAATACCTCGAACGTCGCCTGCGCTTTTGTCAGTGAGATGGCCTGTTGATAAATAATCGATCGCA
+CGGCTTCCATGTGCTTTTCAAACTGTGCTTGTAATTCAAGGTGTCGATCAACCGCGATTGCGTCGGCTGGCTCGCCAGTC
+GCTCGTCGAGCACTTTTTCGCCCTGCCGATCCCAACACGCCAACCGCATCGCGGGGTCATGCGCCAAACGATCCACGTCG
+TCCTGCGTCGCGTATCCCAAGGCCAAGCTATAGACCCGCTCACGAAGCAACTCGGGCACGAGTGGTGT
+>generic877
+TCGAGCTCTATCACGGCCTTGAGCAGCGCCGCTGTCGAGCCGACCACATCGGCCTGCGCGACCACCGCAGCCGGTGACTC
+GGGATGCACCAACACCTTGGCTAGCGGGTGTTCTTGGCGCAGCAGCTCCAGCTCGCCGCCCTTGAATTCGTCGTGGACGA
+TGCAGGCACCGTTCCACATCAGCATGTCAGCGCCGGTTTGTTCTTGGATATAGCGCCCAAGGTGACGGTCTGGGGCCCAG
+AGGATCTTTTGGCCTTGGGCATGCAAATGGCTCACGATGGCCAAGGCGCATGGAACTGGTCACCATCCAATCAGCCCGGG
+CTTTCACGGCCGCACTGGTGTTGGCGTAGACCACCACGGTGCGACCCGGGTGGGCATCGCAAAAAGCGCTGAAATCGTCG
+GTGGGGCAGCCGAGGTCCAGTGAGCAAGTGGCGTCCAGATCGGGCATCAGCACCGTTTTGTGCGGCGACAGAATTTTGGC
+>generic878
+GCCTTGCAAGTCGCACTCTCGCTCGGACTTGATGGGCCGATGACGATCGAAACACCGCTGATGTTTCTGACCAAAGCCGA
+GACTTGGGCACTGTCCGATGCGCTCGGTGGTCAGCGGTTGAATGAGCTGATCATCGAGCACACTCACACTTGCTACTTGG
+GTGATCGAAGCCATCGGCACCCTTGGGGCTGGGGTTGCGCAAACTGCCCAGCGTGCGTGCTGCGCGCCACAGGCTACCAA
+GCCTGGCACCCGAACCACCCTGTTTAAGGTGTCACCTCTGATCCTTACCCATCCATAAGCAAAAAAACCATCGGGCTGCG
+TTAAAGTCGCGCCGTTCCCGATCAAAAAGTAAAAATTAAGTTACAAGTTCACGATCCGTCACGCCGGGAGAGATCAATAC
+CCCTGACGCCAAACGGAGTGAAAAAATGAGTATTGGACTGATTGTTGTGATCACCTTTGGGGTGATCTGGGCGCTTTGGA
+CCCCTGGCCGCTTATGTCCGCCTAGT
+>generic879
+CGACACGATGGTGCTGACCTGCGGCACCAGCCCGGCCAAAGCCGACATCATGAAGCTGGTCGAGCCTTGGCAATGGATCA
+CCGCCTTGAGGCTGGACGCGCCGGTCTGGTCCAACACCGTCTGCACAGCGGCCGGATGATCGTAGTAGCGCCGCTTGCTC
+CAGCGTCCAAGCATTCGTGGGCAGGTCGATGCTGGCGCGCCAGTTTTCCAGCCAAACATCCCAGCCTTGCTCGATCAAGA
+CATCGACCAAAGAGCGCGCGACCGGTGGGCGAAAAATGTTGGCCCGCACCCCGGCACCGATGCACCAACAACACCGGGCC
+GCGCCACGCTGGGTCGGGCCACAGACATGCACCAGATTCAGCGCCATGCCATCGCCAGCACGC
+>generic880
+GATACACCCGCGTTGTAAGGGCGTCCGGCTACCGGGGGAGTCCTGCCTGTTCGTCATTCCTTGCGGTGCGGTCGCACTGC
+GCGCAACGACACAGGAGGTGATTCATGGTTGAGGGACTGGTCGAACGCCTGCGCTCAATAGTCGGCGCTGGTGGTGCGGC
+GAACGGCGGGCCGAAGCAGCTCGACAAGTGGCGCCGGCAGTTAACCGAGTGCGCCGAGGGGCGCGGCGGCGAGTTTCCGC
+GCGCACCCGGGCGGCGGCTCTGGCGCTGACCTACCTTGAACTCGACGACAGCGGCCGCCACACTTTTCTGCGCCTGATTT
+CACTGGAGTTCGGGCCGTCGCCGGCGCGTGTGGCGGACGCCCATGAGGCCTACCAGAGAGCGGTCGACACCGAGCGGCAA
+TGGGATGCCGAGGCGGAGCTTCGCGCCGCCCTGCGTTCGGCGCGGATTCGCATCCTTACCCAGTTCAACGCCATCCCGCA
+GGGCGTCAAGTTTC
+>generic881
+GAAACAACGTTTGTCCGAAAAATGCACATCCGCCCAGCGATTAAAGGAAAACACCGTCACAAAGCCCAATGCCCACGCCA
+CCAAACCCGCTCTCACACAGGCTTGATCGCGGGTCATTTCTTTACTTTCTATCAACCACGCGACTGCGGGTTCAATCAAC
+GCAATCGAAGAAGTCAACGCAGCAATCACCAACATAATAAAAAACAACACCCCAAACAACCACCCGCCCGTCATATTACC
+AAACGCAATTGGCAAGGTTTCAAACACCAAACCCGGCCCTGAATCAGGGTGTAAGCCATTGGCAAACACGATAGGAAAAA
+TACGCTATCCCCGCCAATAAAGCAACGATGGTATCAGCACTCGCCACAATAATAGTGGATTAGCAATCGACACGTTTTTA
+GGTCAAGTACGCGCCATAAATCAGCATCGTTCCCATGCCTAAATCCAGACTAAAAAACGCCTGTCCCATTGCAGTCAACA
+CCACTTTAGCCGTGA
+>generic882
+GCCCTGTTGGCCCTGATCACCCGCGCCGAAGCGGTGCTGGCACGTTTCGAAGCCACCTTGCCGGCGGCCGCCCCGTCCCC
+AGACTGGTCCACGGTGGTGGCCTGTCGCTGGCGCAAGCGCGGTCTAGTTGGGTCGTTGGAGCCGGTGCGGCACATGGCTC
+CGATCCGGCTGGCCGATCTGCAAGAAGTCGAGCCGCAAAAAGAGCGTTTAACACGCAACCTGCGCCAGTTTGTGCAGGGC
+TTGCCGGCCAACAACGTGCTGCTGACCGGCGCACGCGGCACGGGCAAAAGCTCGCTGATCAAAGCGTGCTTGAACGAATG
+GGCCGCCGAAGGGTTGCGCTTGATCGAAGTGGACAAGGCCGATCTGGTCGATCTGCCCGACATCGTCGATCAGATCGCTG
+GCTTGCCGCAGCGCTTCATCCTTTTTGCCGATGACCTCAGTTTTTGACGACGGTGAGTCGGGCTACAAGGCGCTCAAGTC
+GATCTT
+>generic883
+CGCTCACCACAACTCCTCCGTCATCGGCTGCGACCGGACGCTACCCGAGCTCGCGCGTCATCCACGAGCAGATCGAACAG
+CGCCTGCTGGTCTGGCGCTTCGTGCGCGTTGTCCTCGGGATGCCACTGCACGGCGAGCAGCGACGCAGACTCATGCTCGA
+TCACCTCGACGCAGCCGTCGGACGCGCGCCCCGTGACGCGGAGCCCGCGTCCGAGGCGATCGATCGACTGGTGGTGGTAG
+GACGACACCGACACCGACGTCGCGCCCATCGCGCGGGCAACACGCGATCCCGGCTCCAGCTCCACGGCGTGGAAACCGTT
+GCGATGGATCCCCTCGTCGTCGAGGTGCTGATGCAGAGTCCCGCCGAAGGCTACGTCGAGCACCTGCATGCCGCGACAGA
+TCGCCAGCAACGGCAGGTCAAGCCTGACTGCGGCACGCACCACCGCAAGATCGGTCTCGTCCT
+>generic884
+GCTCAAGCTGCGCCAAGTTTGCTGTGATCCCCGGCTGGTGAAGATCCCGCAGGCGCGCAAGGTCAAGGACTCGGCCAAGC
+TCGATTGGCTGATGCAGATGCTGCCCGAGATGGTCGAAGAGGGGCGGCGCATTCTGCTGTTTTCGCAGTTCACGTCCATG
+TTGGAGCTGATCGAGATGGGTCTGAAAGCTGCGGGCTGAGCTGGGTCACACTGACCGGCCAGACGCCTGGGCCGCAGCGT
+GATGCGCTGATCGCACAATTCACGGCC
+>generic885
+CTGCCGATGATCAGCACCCCTTGATTGGCCAGCGGAGCCAAGGCCGTGCCCAAAGCCCATTGTTCGGCCGGGCTGCGACT
+CGGCACCAGCGCCAGCGGCACCACCGGCACGCCAGCATCCGGCCACATACGCCGCAAGGCCGTCCACAAGCCGTGATCAA
+GCCCCGAAGTCTCAGTCACCCAACCGCCCAAGCCTGCTGCTTTGATCAGCTCGGCGGCCTCTTGGGCCACCAAGGGCTCA
+CCCGGTGCGTCATAGCGCAGCTGATACAGCTCGGCCGGAAAGCCGCCAAAGTCGTGGATGGCGCTGTGCCGGGCGGCCCC
+CAAAACCAGCGGCTGACGTGCCGGACTGTGAGGTGAACACATCAACACCGCGCGCGGTCTGCCCCAGAGTCGCTCAATGA
+CCGGGCCGAGTCGGTCCAGAAACAAGGCTGCTGGCGTGGTTTCAAGCGCGATCATGGGCGAGCCATGCGAGATAAACAGA
+C
+>generic886
+GTAAGCCACCAAGGCGTGGGGCCACGTGCCAAATTTCTGCTTGAGCATGACCAAATAGTCGAGTGCCGCACGGGTCGAAG
+CCAGCACGTCACGCCGGTCGTCGCGGAACATGTTTTGCTTCAAATCAAGGTTGCGCCCGGTATTGGCCATGAACTGCCAC
+ATGCCGGTGGCGCGCGCTGAGGAAGTGGCCTGCGGGTTGAAGGCACTCTCAATGAAAGGCAGCAGAGCCAGCTCGGTGGG
+CATGCCCCGGCTTTTGGACTTCTTCGACGATGTGAAACAGATAACGCGAACCCCGCTCTAGGGCCTGCTTCAAATGATCC
+GCTTGGGCCGTGAAGCGTTGTTCGTGCTGCTGCACCAAACCCGTCAGTCCCCCCATCGACCCCATGCCAAAGCCAGAGCG
+CACACGGGCCCACAAATCGGTGTGGATGCTCGGATCACTGAGATGCGGCAAGCGCTT
+>generic887
+CAACAACATCGCACCCCTCGCGCGCGCTCATGACGGACCAGCTGGACGAAAAGGAGCGGATGAGGATCGAGATCGAGCTG
+GAAAAGCAGCGCCAAAAGGAGGAAAAGGAGCGGGAGAAGGAGCGCAAGCGGCTCCTAGCCCTAGCCCAAGAGGAAGAGGA
+GGCTCGCCGTAAGGCCGAAGCCAAATCAAAAAAATCCCACGCCCCCGCCGCCGCCGCCGCCGCCGCCGCCGCGCCCTTCA
+CGGCCACCCTTGGCCTCTCTGGCGAAGACAGCCACCCCCTTTACAAGCAATGGCAGGCCAAAAGAAAGGAGGCCGAGGCG
+GTAAGAAGAGAGGGGGAGGTGATGCTGAAAAAGGGCCAGGACCTGCTCGAGGTCGGCCGGGAGATGTTCAAGAGGAACTC
+GAGGTCAGACTACGAGAGAAAGGACAAGCTCTTTGAGCAAAAGAAGCTGATCCAGAAGGAGATGGCAAGGCACAAG
+>generic888
+CGTAGGTCTTCTGAAGGTGTTCGATCTGGGATACCAGTCGCTCGGCCGATAAATAACCTAACGAGCCTTTGTTGAAAGAT
+TCGTTGTAGCAGAAAGCGCAGTGAAAGGCGCAGCCCCGGCTGGTGTTGAGGTCAAGTTCGCGGTACTTAGCGGCGTCCAC
+CAGGTGCCAGGCCGGGTCCGGCAGCTCGTCCATGTTCTTGGTGAGGTAACGATGCTCATTGATAATGATTTTGCCGTTGG
+ACTTGAAGGCGAGCCCCTTGATGTCTTCGATTTTCGGCGAGCCGGTTTGCAGGTGGTCGGCTAGTTCGGCCATGGTATAT
+TCGCCCGCCCCAATGATGGCATAAATCTACGTAATATTCAGCAAGGGTCTGTTCGGTAAGGACGCTCGGGCTGACGTTGC
+CCCAGGCGATCCTGGCATTGGGCAAGAGAGCCCTGAATTCCTTGGACTGCTGGATGGCGCCCTCCATGTTGGGGCCGACG
+GATGACCGAGACGAGTGGTGT
+>generic889
+CGACAACGAATGGGTCAATCGCCTCAAGATCAGGCTACCCGTGGACCCGGCCAACGACTTGATGGACGGCATGAGAAATC
+CACAAATGGGCGAGTTCAAGCAAAAACTAGAAAAGCTGCTACAAGCGCTTGAAAATGCCAATCAACTGGAGTCCACCGCC
+GAGGCCGTAAAAAAGCTGACCCAGGTATTTGGTCAAGAATTCTCCGCCTAAAAACACATTGGCCATGAACCCAACAAAAA
+ACAAGAATCATCGCGTCTCGATCTCGGATAAAGTGCGCGCCTCTCTTTGGGTTTCAGCCGGTGGGCGATGCGAGTTTTGC
+GGCTGCAACAAGCCGCTTGATAAAAACATTCTCACGCAGCAGAAAGTTTTCTTGGGACAGCATGCCCACATCATCGGCGA
+CAGCGTTGATGGCCCTCGGGGCGATTCTGAACTGTCCAAAAAGCTAGCCGATGACCCCGCCAACTTGATGCTTCTGTGCC
+AGCCCTGCCACACCACGATTGACCGAC
+>generic890
+AGGGGTTTAAATAGTTTAACTGTTTCGTACATGGCAAGAAGGGAAACAGTCGGCCTACAAATCGGATTCAAACGCAAAAC
+AGAGTGAGAAAGATGCCGCAGCGGAATCAGAGTGAGTCGATTTCCAGGGGATGGTGTCAGCACTTCGCCTCACTTCTTGC
+TCTTAGGAGCGGGAGCCTTGTTGGTCTTCTTGGCGTCGGCCTTCTTGGCGACCTTGGTGTCCTTATTCTGGATTTTACGT
+TCGGCGCGCTTCTTCTCAATATCCTAGTTCTTCTTGGTCTTGTAGTCACGGATGGCCTTCTCAGCTTCAGCCTTCTTGAC
+GTGGACGTCTTGAGATTTCTTCTTGTTGATTTCCTCGAGCGAGATACCGACGATCGCACGGGC
+>generic891
+GCGTGCTGATGATCGTCCCCTACCGGCATTTCACAAAAAGCAAATAGCGTATTTTCTCACGGACACCTGGTTCAGGTCTG
+GATCATCGCAACCTTTATATGGAAATGAACGAAAATCGGTGGGTTGCTTCGCAAGTGGTTATTTTTTCGGAGGATCATCC
+GAAAAAATAACCATAAAAATTTATTTCTTTCATTTCTGGGCTTGCATACAGACAAATCAATCAAAATGCTGACCGGCGAA
+AACTCACCGGTCAGCATTTTTGTTCCAAAACATCAGCACTTTTAACGCAAAACCGCCTCACGGCGGTTTTTGTGCCCCAC
+AGGAATTCGAATCCTGGTCATAACCTGAAAGGTTGCGTCCTAGTCCACTAGACGATGGGGCATTTCTGGAGCGGGCAGGA
+TTTTATCATTACCCCTGCCATAGGTCAAGCGTTTTCACGGCTTTTTCAAGATTGCTTTCCGGATTTCAAATTCGCATCCG
+GGCAATTTTAATCGTCAATGCGCTGGTTGCTGAGTGCCAGCAGGTCCACCTGGCGC
+>generic892
+TTCAACGATCTGGTGACGTTCATGATCTCCGGCCCGGTGATGATCCAAGTGCTGGAAGGCGAAAACGCCATCCTGAAGAA
+CCGCGAACTGATGGGCGCAACCGACCCGAAGAAGGCCGAGAAGGGCACCATCCGTGCCGATTTCGCCGATTCGATCGACG
+CTAACGCTGTCCACGGCTCAGACGCCCCGGAAACCGCCGCTGTTGAAGTGGCGTTCTTCTTCCCCGGCCTGAACGTTTAC
+AGCCGCTGATCGCTGCTTTCAATGACCGCAGTCAATCTGCTTGATTTCGACCTCGACGCGCTGGCAGCTTATTGCGAACA
+GCTCGGCGAGAAACGCTTCCGGGCGGTCCAGCTCTTTCGCTGGATCCATCAACGTGGGGCCACTGATTTCGAGCAGATGA
+CGGATCTGGCCAAGTCGCTCAGGTCCAAG
+>generic893
+ATTTTGATCAGGTCGCCGAGTCCAACATCAACCGCCAGGTGCAGGCCTTGGGCGCCACCGTCGGCATGGCCAAGGGCGAG
+GCCTTGCAACGACGCATCGCCGACATCCACCCGCAGTGCGATGTAGTGGTGGTGGACGAATTCGCAACGCCACAAAACTG
+GCCCGCGCTCTTGCCCGTGCCGGTGGACGCCGTGATCGACGCCTGCGATCAAGGCCAAGCCAAGCTGGCGATTGCAGCCT
+GGGCCATGGCGCAGCGCGTGGGCCTGGTGTGCTGTGGTGCTGCAGGCGGCAAGCAACGCGCCGAACTGATCGAGTTGGCC
+GATCTGGCCGAGGTGACGCACGATCCCCTGCTGGCCACGCTGCGCCAGCGCCTGCGCAAGGCCGGTGCCGCGCGCTCGGG
+GCCCATCGGCCTGCCCTGCGTGTTCTCGCGCGAGAGCGTGGCCCCGCCGGCCGATGCCGCGTGCAAC
+>generic894
+GCCGCACCAAAGAAGACGCCGCTGCCACCCGCGAGCAGTTGCTCGACACCGCTGAAACCCTTTTCTTGCACCAAGGCGTG
+GGCCGAACCTCGTTGCACGAAATCGCCAGCGCCGCCGGGCTGACACGCGGTGCCATCTACTGGCACTTCAAAGACAAGGC
+CGATCTGTACTGCGCCATGATGGACCGGGCTACCCTGCCCTGCGAACAAGCCGCCCAAGCCATCATCGGCCAACGCGCCC
+AGCTCCGACCCCGCCGCCGCACTGCGCGAACTCGCCCAAATGCCCCTGCAACGCCTGCGCAACGACGCACGCACCCGGCG
+CGTGTTCTGCATCGCCATGCACCGCACCGAACACAACGAAGAACTGGCCCCCTTGCGCCAACGCCAACTCAACGGCGTCA
+CCCGCTACACCCAGCGCCTGCGCCAACTGATGGCCGACATCCACCCCACCGCCCCGCCCGCAACCCT
+>generic895
+CTGACCGCGCACTTCGCCCATCAGCCGCACGCTGCCGTTGATCGAGCTGACCACGCCGAGCGGCAAGTCCAGCTCGCTCA
+GCACCGGACCTTGCTCGATATGAACCTCGACAAAGCCGAGATAGCGCGCCGCGTCGCGGGCCAGCGCGGGGATCTGCGCC
+ACATCCAAACCGGCCTCAGACAGCGCAGCGCGCATCGGGACGCCTTCGGCATCAAGCTGATCAAGCCATGCCATATTGAA
+CTGCCCCACCAACGCGCTTGAGCCGATGAAAGTGGCTTTGTAGCGCTGCCCCTCCTCTTCGGCAAAGCCAACCACCTCGA
+TGCCAAAAGGCAGCCGCCGACCGGCGCGGTGCAGCTCGCGCACCACCGCCATCGGCACCAAGATGCCCAAACGTCCGTCG
+TATTTGCCGCCGTTGCGCACGGTATCGAAGTGGCTG
+>generic896
+GCGAAATGGCCGACGAGCGTTTGGATGCCCGCGTGGTGAGCCAAGCCATTGCGCAACTGGCCTCTGAGTACCGCCGGTTC
+CTGAGGCCTGAGGACTACATCTTGTTGGCAAGCATCGACGCGGCCCCGCTCCACGGCGGCAATGACGAACGGGCGCAAGA
+ACTGCTCTACCGCTTGGCCTTGCTCGAATACAACGATGGCGGCTGGCGGCGCAGTCATCCGGTGGTGCGCACGCTGGAGG
+GCTATCGCCAAGCGGCAGCCTCACACCATGAACCACCCCGCTGATGCGGCCCAGGCCGATGCGCTAGCGCGCACGCTGGC
+GCAAACCCTGCCCGAACCCTGTCGGCCCGATTTTTTGCGCCTGACTCGCACCCTGCCTGCACGGCCCACGCTTCCAGTGG
+CTGCTGGTGGAAGCGCACAGCGACGTGCTGCGTGATCGTCTTCTGCACG
+>generic897
+GGGGTACGTTTTATTCTGATTTTAATGATGTGTTATTAAATGGCATTAAAACATTTTAATTAGAAAAATTATTACTTATG
+TTTCACTTAAAAAATTAAATAATTGGTCATAAATTAATTAGATTGTAAAAAATTTTTATATAATGACACAGTATATTCCT
+GAGAAGAAATGGAATAGAAAAAATTTTATGTGATATGGATCTTGAATTCCAATAAATTTATTTCAATCATTTTTGCTTTT
+TTGTAAAAAAATAGTTCATCTTTATGACAAGTTTTTCTTATTGCTTCCCAAAGATCAATTTTCAATCTCTCTGATCACAT
+AAGACATCACTCGCTTCGGTGTTTAGTAAAGCTTATGATGGCCTGACTGTACATTAAGCCGTCCTCAAGATGTTTGACGT
+AGGACAACCGACA
+>generic898
+ACGGGCCTGGTCGTGTTCAATGGCACTTCCATGTTGGACGGCACAGGTTCAACCATCTTTAACAACCTGCAGGTTAGCGG
+CATCTTGACCAACCTCGTGGGCGTTTCGGTCGCCGGCAATTTCACCGACATCGGCACGTTCGACGCCACCGGATCGGACC
+TCATCTTCACCGGCAGTTCCGCCTCGTTGATCTCCGGCACGACCACGCCGGTCCCCGTTGACTCGCTCGTCATCGCCAAG
+AGTTCCGCTACTGTCACCCTGGGCGCAAATGTCAACAATCTGACCGCCCTCACCGTTTCGAGTGGCACCCTGGATACGGC
+CACCTACAGCGTGACGGAACAAGCAACGGATAAGGGCGCCCTGTCCGTGGGCGCGAGTGGCACTCTCAAGCTCGGCGGCA
+GCAGTTCTTTCCCGACTTTCACCC
+>generic899
+GGACTCATAACTAGCGGGGATTTTGCCTTCCTTTTCCATACGCTTCATTAATGGCGTTAATCGCACTACGCTCGACCTGC
+TCACCCTTGTACATAATCCGTTTCACCTGATGCGGTCACCTCAACTTTCCTAAGCATTTGCCGGATGATGGCCTACAATA
+TGCTTGTCGTTAATTTTCACCCCTTGCAAGCGATAGACATCCTGTATTTCCTTAACCAGGTAATCCGCCAGCTCTTCGAT
+TCCCCTCAGGCCTCAAAATGTCATGCGGAGTCAATTACACCTTCCGCAATCGTTTCGCCTTTTTCTACGAACTCACCCTC
+AAACACCGTAATGTGCCGCCATTTTGGAACCAATGTTTACAAAACTGTTCGCCAGTGGAATCAGTGATAATAATGCGCTG
+CTTTCCTTTGGTCTCTTTGCCAAAAGAGACCGCACCCGTTGTTTCAGCAAGAATCGCAGGGTACTTTGGTTTTTCTAGCC
+TCGAACAAATCAGCAAACCGCGGCAAACCACCGGTAATGTCCCTGGTTTTGCTGGA
+>generic900
+AAGACGGTAACCGTGGGTACCAGCAGAAAAGAACCGCTCTTGAGGGGCATCATTTTCGAACTGCTGAAAAAGCTGGATTA
+TTCTCCCCAGTCCCTTACTACCAGGAATATTTTAGCCGTGACGATTCTGCAGCCGGCCATCGGAGAGCTCAAGGGCTACA
+CCCTCTACGATATCGATACGTTGGATGCAAGAGGGAAACCGACTGATATCTCGAAGAATTTCAAATCCGCCAAACGAGCA
+GGCATTGCCCTGGACATGAAATCGCGGGCGGAGACGGGGAGCGTCTTGATGGGCACCAAAGCGGACCATCGTCAGTACGG
+GCCATCTCTACGTGGGTTACGGCAAAAGCGGATGGCGCTGGCTAATCGTTATTCTGCCGTTGCAGGAAGCGCAGGTGGTG
+AAAAAATTTGCTCC
+>generic901
+CCTTGATCGCCAGTTTATTCATTTCGGCATAATGGGGAACCTGGGAATATTTCATCGCTGAAGCATCATCGCTATATTTG
+ATGTCAGGCAGGTAGATGTCGATGACGCCGTCGAGCATTTTTAATGTATCGAGTGAATCATAACCGTTGGTGTTGTAGAC
+AATTGGGATCGTCAGCCCCTGTTTTTTTGCCAAGCAGAGGCTAGTGACAATATGTGGGATGTAATGCGAAGGAGAGATCA
+GGTTGATGTTATACGAGTGGTGT
+>generic902
+GGAGTGATACATGTACCACGCTCCGACAAGAGCCAGTAGAAACACAATAATACCGATGACGCCACCGCGCCGGTTACGCA
+GGGGACCGGCCGCTTTTTCAGTTCTCTTAACCCTGTTCATGGATGTACTCCTTGTTGCCTGATTCCGCCATTGGCGACAG
+TTTATTGCCAGCCAGACTCCGCCGGACTGATCTTGATGACGCTGCTGGTGATCTGCCAGGAAGGATACTCAAATTGCGTG
+CCAGAGGATCTCTGCGGATGCTGTGAGTGTATCAGATTGATATTACAGTGTAATCCGGGGGGTGAACGTGCAGTGATGAG
+GAATGCTATTCAAAGAGGTCCATCATATCTGACATATCCGCAGTATATCACGGGCAGGCATCTGCAGAGAAAATGGCTGC
+TGCAGATGGATGGATATATCAGAGCAGGCCGGGCTAAAAATCTCTCGCCACGGTTA
+>generic903
+ACGGTGGTGTATTTCGCTGGCATCGACGGCGCGCGCTTCAAGCGTCCGGTCGAGCCAGGCGATCAGTTGGTGCTCGAATC
+GACCATCCTGCGGGCCAAGGCCGGCATCTTCAAGTATTCAGCGCGTGCGCTGGTCAACGGTGAGCTCGCCACCGAGGCCG
+AGCTGATGTGCACCATGCGCAAGATTGCCTAAAAGCGAAGGAGTCGGTCATGGCGCAGATCCATCCCACCGCCCTTGTGG
+ACCCAGCGGCTGAGCTGCACGCCTCGGTCACGGTCGGCCCGTACAGCATCGTCGGGCCGCAGGTCAAGATCGGGGCGGGG
+ACAGCTATTGGGCCGCACTGCGTCATCGAAGGCCGCACCACCATCGGCGAAGGCAACCGCATCTTTCAGTTCAGCTCCAT
+CGGCGCGTTGCCGCAGGACATGAGCCACGGCAGCGAGATCACCGAGCTGGACGAGTGGTGT
+>generic904
+GTCTTGACGAGCCTGCTGCTTGATCTCCACCACTTCGAGCAAAACCTGCCGGCTGCGCTCAATCTGGGTCACGATCACAT
+GCACGGGCAACGGTTCTTGGCTCAGCACATGGGGCTGGCGCAGGCTGGCATCAAAGCGGCCGGTGCTGTATTCGTTATCC
+ACCACCGCTTGCACCGTACTCATCAGCACCGAACGTTGAATGAACCAGTCAAACACACATTGCTGCTGCAAGTGACGCCT
+TGGCAAGCCCAAGGTGTTTTCAAACGCTGCATTGACGAAGGCGCACTGGCCCTTGGCGTCAATGACCGCCACCATGGTGG
+CCAAGTGATCGAAGGCATCAAAACTCGATGCGTCGCGCCGGGATCCTTCGCTGCTCATGGCGTGGCAAATTTGGATAGCT
+CACGCCGAATGGCCGCGATGTCAGCTTCCTTGCGGGCGATGGCAGCTTTCA
+>generic905
+AGCTTCTGTCATCTGCAGAACATCGTCTACTTCAATTATAAGGAGGCTGGCCAGTTGAGCTCACCCAGCGGCGAGTTGAC
+CGGTGAGGTGACGGACGAGACGGTTTATCTCGGTCTCGATGAACCGCGGCGACCACAGCCAAGGTCGGACAATTACCTTG
+GGACTGGCGACCGCGACGGCGACGACTATGGCGATGATCTCGACCAGGACGTCATTGCCCAGAGCGGCTACGATCCAGAC
+CAGGATTGATGAACCAGGGAGGAGAACAGCCATGGCACTAATGCAGATCAATGTGTTGCCGCTGGGCACGGCGTCCCCCA
+GCGTCGGCGAGTTTGTCGCCGCCATCGCCAAGCAGCTGCACGGGAAGGCGTGGTTTACCGCCTGAGCGACATGGGTACCG
+AGGTCGAGGGAACGGCGGCGGAGCTGCTGGCCCTGGCGGCTCGCCTCCATGAGGTGCCGTTCAGCAAGGGCTGCCGCCGG
+GTGGTGACCC
+>generic906
+CACCACTTCGGCGGTGGCAGTAAAGGTGTGGGTGGTGGTGATGACTTCATCGCCCGGGCCGATGCCCAGCGCTTCGAGCG
+CCAGATGCAAGCCCGCCGTGGCCGAGTTGACGGCGATGCAGTGCAGGCTCTCGTCGCCTAGGAAGGCGGCGAAATCTTGT
+TCAAAGCGCCGGGTTTTGGGGCCGGTGGTGACCCAGCCGGAGCGCAGGGTATCGACGACTTCGGCGATTTCTTCCTCGCC
+CAACTCGGGTAAGGCAAAGGGCATGAAGGGCAGGGCGGGGTCGGTGCGTTGCTCATGGGCGGTATTGTCGGGGACTAGAG
+AGCCTTGCCCACCCACACCAGCGCGTGGGTACGCAGCTGCGGGATGGCGTTGAGAAGGGGGTAGAGGTGCGGCGAAATGC
+GGCATGCCGTGCGCGCGACGTTCGGGGCCAAGGTGACGCGGCGACTTTCGAGCTGAGCGTCGGGGAAGAGTCGGCGCACA
+TGGCGCATCGGCAAGCCCCGCG
+>generic907
+TGAAAAAGCCGAAAAAGAAGCGAAGAAAAACGCAGTGCTCGAGAAAATTCATCAAGGACAGAAGAAGAACAAAAAAACGA
+AGAGAAAAACCCGAAGAGAAGAAAGAGGTCTCAGATCACCTATTGTCTGCATTCTCGGGCACGTCGACACAGGCAAGACA
+ACGCTACTTGATAAGCTCCGAAGAACAAATGTAAGCAGAGCTAATACGCGCTTGGTATTTTACTTGAGGTGTAATTCTTT
+CCTGGTAAATAGGTCCAAGCTGGTGAAGCGGGCGGTATCACGCAATAAATCGGAGCGACATACTTCCCTGGCGAGAACAT
+CATTGCGGAGACAACAAAATGCATGGATTTCTACCCTGTAGAGGTGAAAGCGCCAGGCTTACTCGTAATTGACACACCTG
+GACACGAGAGCTTCACGAGTGGTGT
+>generic908
+GAGACACGAAGCCCAGCAAGTGCGATAAGGTTATTGGTAGCGAGTCGTGCCACTCATTCCCACGCAGCGCGTGGGAACGA
+GACAACCAGACAATAGCATAATTGCTACTTGTGATTGATTTGGAGAGATGGCATCTACTTGCTATTTTTGGTGGACTCAA
+AACGAATTGGAATTTCAGTCAGAACAATAACAGCTTTAGCATCTCGTTTAGGTGCTTCAAAACGCCAACGAGATACTGCG
+GTTAATGCCGACCACGCAAAATCATCGTTAGTCGCCGTGACTATTTCAGGCAACTGAACTCGCCCTTCTTCATCAATAAA
+TAACTTGATAACCACTTTACCTGTTACTTTTTTGTTCCGTAAATCGTCTGGGTAAATAGGTTCAAC
+>generic909
+GGCGGGTCGGATGCGTCAGCGAAATGAACGGGCAAAAAAGAGGCGTGCCCGCCAATTGTTGGGGCACGCCTTGGATTGTA
+GTCGGCGCCGCGCTTTTTTCCCGGGAGGGGATTGTTATTTGAACAATTCCTCGCCATTGGGCCCCAGATGGGGGTCGAAG
+TCGGTTTCCGGAGCGGCCGGCTTGGGGGTGGCGGGGGCCGGCTTGGCAACGGCGGGCTTGGCCGGGGTCGCCACCGGCTG
+CTCCGGAGCCGGCGTGGCTGGCTGGGCTTGAGGCTGGGTTTGGGGGGCGGAGGGTTGGGCCGGCTGGATGACCGGTTGCG
+CCGGGGTGGCGATTTGGTTCAGTTTTTGGTCGGCTTCGTTTTGTACCGGAATGCCAACATGGCCAAGCCCCCCCGCGAGG
+GCGGCGAAAAACAGGCAGACAATGACGGCAATCAGGATGATGGATTGGTTTGAAGCGCGGCCGGGGGTGGTTTGGCCGAT
+GCGTTTTTCAAGTTTGTTGTTGGTTTCAATCGACAGGGCCGCCAAGTCGGACCATGACATCACCGGGGCGGCTTCGGCGG
+TGGTTTGG
+>generic910
+ATTGGAGCGATCATGAACGACAACCTCATCACCGTCATCGGCAATGTCTGCGCTGACCTCACGGCACGCACGACTTCGGG
+CGGTGCGCAGGTAACGAGCTTGCGGCTCGCCAGCACGCCTCGGCGCCTGCGTAACGGCGTTTGGGAAGACGGAGAAACCT
+CGTACTTCACCGTCAATTGCTGGCGCACGCTGGGACAGCACGTGTTCGCTTCCGTGCACCGTGGTGATCCGATAGTGGTG
+CAGGGCATCCTGCGCGTTCGGCAGTGGGAGAGCAACGAGAAGTCAGGCACTGCTGTGGAGATTGACGCGCAGACGGTCGG
+CTTTGACCTCGCGCGGGGGACCGCGGTGTTCAGCCGCGCTCGCCGCGAGCAGCCGATGGCGATTGATGCGCCACTGTCCG
+AAGAAGCACGTGCCGCGGGACTCCCCGAGCATTCGGCCGTCGATGCGTTGGCTTCTGCTTCTGCTGC
+>generic911
+GCTGGTGCTGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGCAGGAGC
+AGGAGCAGGAGCAGGAGCAGCCGGCGCTTCGAGCGCGCCCAGATCGGGCCAAGGCCTGCGGGGTGCGCACCGAGCGCTGG
+CCGTTGACGTCGATCTGGTAAAGCACCGGGTGCAGGCTGGCAGCCGCAGGCAAGGTCATGGCTGCATCCACCAAGCTCGA
+TTTGGCCAAAGGCAGCATGGTGCTGAGCGTGACCGGGCGGTCGCGGCGCTGATCAAGTTGGCGGTGCCGTTGAGCTGACC
+ATTGATCGGGCTGAACGTAGTCCACCCAGCCCGTGCTGGTCCAGTTACGACCGAGGTTGACGATA
+>generic912
+ATGATACTGCTGAAGACAGACTCATTCTCCAGCGTCCCGTCCGAAAGGTGGCGACGCAGACGATCCAGTTCCTGTCTGGT
+TCTGGCCCGTTCCAGACAGGCATCAAGGGTAATCTGCAGTTCATCAAGGTTCACGATCGGCTTGGACAAATAATCCCACG
+CTCCCAAACGCATGGCCCGCACCGCTTCATCCACCGCTCCGACTCCGGAAACAACCACAATCGGCGTCAATGGCGATTCC
+GCTCTTATGGCTTCCACCAGCGCAAACCCGTCCATTTCCGGCATGCGCAGATCGGTGATGACAATATCCGGATTCTCGCT
+ACCGAACAGCTCCAGCCCGGCACGGCCATTATCAGCTTCCAATACCCGGAACCCGATGTCATCCCAGATAGGCGGTCAAA
+GACTCTCTGACATAATCTTCATCTTCGACCACCAGAACCGTGGACTGGCGATTTAAGGAAATAATCCGTTCACTATCCCA
+GGACCTCCGCAACCGCCCGGC
+>generic913
+CTGAGATGTGTTTGAGGTGTGTTTGAGGGAGCCATGCAAAATAAACGTGTCGGATGTGACAGCAGACACGTGGGGGTTGC
+ATGGGTTATCGGTGGCTGAAGGGCTTGTTGTTGAGCGTGGCGCTGGGTCTGGTGGCTTGTGGTCGGGGGTTCGACCCCGA
+CCAGCAGTGAGCCGCAGCATCCCACCGCCGTGATCCAAGCGCAGGCGCAGGTGCTGGCGACGCAGGCGGGGACGTTTCAG
+GCCGCGCTGGGCAGTCAGGTCATCTTGGATGGTTCGGGCAGCAGCACACCTTCGGGCGCGATCACCTCTTACAGCTGGGT
+GCTGAGCAGCAAACCGGCGGGCAGCAATGCCACGATCAGCACCCCGACCCAAGCTTGGGCAAGCTTGGTGCCTGATCGCA
+TCGGCACCTATGAGCTGACGCTCACCATCGCTGATTCACGCGCCTTGGCGTCCACCCAGACCTTGACCC
+>generic914
+TTTTGCCAGAAGCAGAACGCTCAAGCCTCGAAATCAGCCCAGCACGTGGGAGTTTCGTAAAGACGCAAGCGGCGCAGTTG
+TAGGCCTGAACCGTAGTGATCCTGATAGAGCGGCTGCAAGATCTCAAAAGCGATGACCACGAGATTCTCAGCGGTCGGGA
+TGCGTGGCAAAACGATGGTCTTGTGACCGGGAATCTGCGTCAGCAGCGGCATGATCACGCTGTCGCCTTCGTAGACCAGA
+AAACCATGGTCCCAAAGATCCACCAAATGCGTCTTGGCGATGGTTTTGACTTCGCTGAAGTCCATCAGCATGCCGTGGTC
+GCTGTGACCGGGGCGGTTGACGGGTTCACCTTGGAGGGTGATTTCCAGCACATAGCGATGGCCATGTAGGTTACGGCACT
+GGCTCTTGTGGTCCGGAATGCGATGGCCGGCGTCGAATTCCAGTCGTCTGGTGATGGTCAGCACGCGCTTGAGCCTTTTC
+>generic915
+CGTCGCCACCTTCTACCTGCCGCCGCTCAAGGAGAGCACCTCCTATGCGGTGGTGGTCACCGACGGCGTGAAGGACATGT
+TCGGGCGCAAGCTGGTGCGCTCCACCTTCGCCCGGCTGATGCTCGACTTCACCGTCCCGCTCGCCACCGTCCCAGGCGTC
+GACGCCGGCACGGCCGCCGGCCTGACCGCCCTCGGCACCGCGCTCACGCCGGTCTGGGCCGCCCTGCCCACCGGCATCGC
+CAAGGCCAACGTGGTGGCGGCCTACACGTTCAAGACCCAGACCGTGACCCCGGCCTCGACGGCCATCCTGGCCTTCGCCG
+GCACCGGCGCGCCGACCGCGGTCAACGTCTTCGACAAGGCCACGATCGCGACCGACTACGGCATCTCGGAGACCGCCTTC
+ACCGCCGACATCGCCGAGTTCGCCGAGGCGCACCTCACCACCAACAACCTGCTCCTGTCGGGCCTCACCGGCGGCATGCT
+CGACACCGCCAATCCGACCGCCGAGCCGATCGTGGCCCT
+>generic916
+GCAGTGCATAAACCTGCTCCAATCCAAGGATTTGATCCGATGTATAGGTTAATACACAAGGCGTGGTCGAGCCACAATTA
+ACCACGCTGTCAAAACGCGAAAATACTTGAATAGCGATCAGAACAGCATCCTTGGCGATGCCCGTGAAAGTGGCATTGGT
+TCCAGCAGCGATGCCGGCGACTGCGGTACCGTGACCACATGCACCGACAGGACAAGCACCCGCATAGGGCATGGCGGAGT
+CATTGGCGGTCGATTGAGCCACACCTCCTTGGCAAAGCGAGGTTGCACCATCGGCGGCATTATTGGTTGAAAAACAGGCT
+TCTGAAACCACCTTCCCAGCCAGAAAAGGGTGCAACTTATCGACACCTGAATCCAGAATGGCAATCGACTGCGCCATACC
+GCTGAAACCCATACTCCACGCGATCGAACTCCCCGTTACGGCAACGCTTCCAGCATCAGCAA
+>generic917
+CGGCGATCTCGTTGGAGGTAGATCGTGGTCGAGTGCTGGATCGTGGCGTTCTGCGCGGTTGGCCGCGGCGACGACGTGCG
+GGTGGCAGTGACCGACGCTGATGGTCACGATGCCACCGAGGCCGTCGAGGTAGCGCTTGCCGGTGTCGTCCCACACCCAC
+TGCATCTTCCCTTCGACGATCATGATCGGCTTCTTATAGTAGAGAAAGAGGCCGGGGTTGAGGTATTGTTTGCGCAGCGC
+GAGCACTTGGTCGGCAGACGGACCGGAGTAGGCCCGCGGGCTTATGTGCGCAGGGCGGAAGCGGAATGGCTTTCATGAAT
+TGGGAAACTGAAGGATAAAAACAAATGTTGGAAATCAGGAAATCAGGAGCCAAAACCCTGTGATTTGTTCCTGATTTTCA
+GCTTTCTACATTTTGGATTTTAGGAATTTGGANCGAGCTTGCGGAGAATAAGGTAGGCGGCGAACGCGATCCCGAAGCCA
+ACGAACCACGCGTAA
+>generic918
+GGCGCTCGGCCAGCAAGGCGGCGGTGAAGATCAGCAGCTTGTCTTTTTCGCGCGGGGTCAGTTCCATGAGTGGCGTCCTT
+GCAGGATGGATGCCAGCTTGCCTGAGTCGGCGCGCAGCTGGTGCGATTCTTGAACAGGAGCGGGTATGCATCCGCAATCG
+CCCCTTGAGCCCACCCAGCACGTCATCAAAATCCGGCGCGACTACAACGCGTGGGTCGCCAGTGAAACGCTTGAAGATTA
+CGCCTTGCGCTTCACCCCGCGCTCGGCCCGCCGTTGGGGCGCTTGGCGGGTGGCGAACACGGCCTTCGGGGCGGCGGCGT
+CG
+>generic919
+GGTAGACTGAGATGGGCGCTGACGGCTTGGGTTGCGGGGTTGTACGCCAGTGTTGCCCCCGGTGCCGTTGGTGCCACGCT
+GTCAAAGACAAACGAGACGCTGGTGTCGGCTGATGCCCTGCCTAGGCCATCAAGGGAATGCACGAGCACGGTTTGCGAGC
+CTTGTGTCAAGGCACCGATGTTGATCAGGCCGTTGACCGCTGTGGCGGTAACCCATGTCCCCACTGCACCTTGTGGGGCT
+GAGCGAGTATTCGAAGGCGGTGCCACCCGGCGGGCTTGACGTGACCGCCAAGCTGTTGCTGTTGGTGATCGCCAAGGCCG
+GTGCGGTTTGGAGTGAGCCGGTATCCGTCACGGTCACTGTCGGTGCCGGGTCGGCGGCGATGAAGGTGAAGCTGGTGGCT
+GGTGTCGCCGGATCAAAGAAAGAGCTGTTACCCGCCGCATCGGTCTGGCGAATCCACACTTGATTCAGCGTCCCGGCCAC
+GCTCGATTGGGCGGTGAAGGTGGGT
+>generic920
+CGGCCAAGCGCACCTGCTCGGACCCCTGAAAAGCATCCAGCCCGCCGCTTTCAGCGCCGCCTTGGCCCAACTTCAAGCCG
+ATGAAGTCGTGGTGGTGGCCGCTGCACCGCCCCCCGAACCGCAGCCCCGCGACTACGGCCCCAACCTCACCCCCCAAACC
+TTCTTGCTGGCCGTCATGAACGACCCCACCGCCCCCTTGGCGCTGCGGATTGAGGCGGCGAAGGCGTTGCTGCCTGCGGA
+GAATACGGCCAACAATCACCGCATGAAATGCGGTGATTAAGCCTCCTGTCAGCGCAAATCCAGCGCGAGCGCACTCAAAA
+AACCTCCTTGGATGTCACCGAGTGGCTGGCTTGGGTTCACACGCTCAACGCGGTGCTTGCCAAAGTCCAGTTCTGGCAAC
+GCTGGTGACACTTGGTTCGACACCACCCTGCGCGACATCACCGATTTACTGGCCCGTGGCGTCTTGCAAAAATCAGAAGC
+AGGTGGGCGTAGCACCAGCTACGAGCT
+>generic921
+GGCGCATGGTGTCGGCCAAGGCCAAGGCGTTCATGACCGTGGCCAGCATGCCCATGTAGTCGGCGGTGGCGCGGTCCATA
+CCGACCGCACCACCAGCCACACCCCGAAAAATATTGCCGCCGCCAATCACCACCGCGACCTCGCAGCCCATGCGGGTGAC
+CTCTTGAATCTCACGCACGATGCGCACGATGGTGGCACGATTGATGCCGTAAGCATCATCCCCCATGAGGGCTTCACCGG
+AGAGCTTCAAAAGGATGCGTTTATAGGCCGACATGGGAAAGATCCTAGAAGAGAAGACGGGCAGCAAGTTTAAGGGGTTA
+AACGCCGATCACTGACCCTTGGCAGCCGCCACTTGCGCAGCCACTTCAGCAGCAAAGTCGTCTTGCTTCTTCTCAATGCC
+TTCGCCCACGATGAACATCGTGAACGATTTGGCCGTGGTGCCGACGCTCTTGAGGTACTGAGCCACCGTTTGCTTGCCGT
+CAGCC
+>generic922
+AACCGATGAAACCTATCGCAAAAGCCCGGTCGCTCTTGCCCATGGGTCCATCATAGCGTCGGCTTGCCCCGATTTGCACC
+GCCGCAACTCCTGCCAATTCACTGACGACTGCCATTACCGCAAACACCGCCGCAGCCGCCCCACTGACTCCCGGTATGAG
+ACCTAAGGGCAGATAAAGCACCGTGTCGGAAACCACATCACCCAACTCGTTGAGCATGGCACCTAAAGGCGAGCGCAAAT
+CATGCTCCCTCGCCAACATACCGTCAATGGCATTCAATGCCATGCGGATGAACATCAACACCGGAATAAGCAGGAAAGGC
+CAGCGCTCCGTGGGTTGCAGAGCAACACAAGCACCGCCCGACAACGATAACCCAAAAGCCAGCCAAGTGACTTGATTAGG
+GGTGATGCCTCTTTGCCATAGCTGCCGCACACAGGGACGAAGGAGATTTGAAAGCGGGGTTTGAGGTCGTAGATCGTCAG
+CATAATGATC
+>generic923
+CTCGGGCAGGCGCGGGAGTTCCTCCAGGGTTTGCTCAACCAAGAGCGCGGGCACTCCTCTAAATTACCCGTGCGTCCGGC
+AATCGAGGCCAGATGGCAGCGAGTGATGGCCAGTTCACGGATCAAACCATGCTGTTCCGCCAGATCCTGCGCCGAAAAAT
+AGCAGGTGGTAGCCTGTTCTGGATCTCCGCGGTTGGCCATCAGCGTACCCAGGGCGATCCACCCCAACACCTGTTGCTCA
+GGCGCAATCTCCTGGCCGGTTCAAGAACCTGGCGCAATTCGCGCTCAGCTCGAATCCCACCAGCCCAATACCAGACAGAC
+TTCCGCATATTACGCGTCGGGTTCGGGGCCCTCGCATTGCTGGGCGCTCGGATCGGGGACAACTTACGCACGGACAAGGA
+TCGCCTTCTCATAAAGAGGGGCCGCCTGAGGATAATTCAGGACCGCCACTTGTCTGGCCGCCTCCTA
+>generic924
+CCGTGAAGCGCAGGATCGCTATGGTGTCGACAGCCAGGTCAAGGCGGCCAAATCCCGCGCCGAAGGCAAGTTCAAGGACG
+AGATCGTCCCGCTGTCCACTCGCATGAAGATCGTCGACAAGAATACCGGTGCCGAGACTCACAAGGATGTGACCGCCAGC
+GAGGATGAGGGCATTCGTGCCGATACGACCTATGAGGGTGTATCCAACATCAAGCCAGCGGTGGAAGGCGGCGTCATTGC
+AGCAGGAAACGCCAGCCAATTTTCCGATGGCGCGTCAGCGCAAGTGGTGATGAGCGACAAGGAAGCCGCTGCCCGCGGAC
+TCAAGCCCATGGGCATATTTCGTGGCTTTGCGGTGGCCGGCTGCGAACCCGACGAGATGGGCATCGGCCCGGTGTTCGCC
+GTGCCCAAGCTGCTGAAGCGGACCGGCCTGAAAGTGGACGACATCGGCCTGTGGGAACTCAACGAAGCCTTCGCCGTGCA
+AGTC
+>generic925
+ATCGACGTCAATTATGACGATGTGCAGGTTATCTTCGACCTCAGTCTGCGGATAGAGGAAGGAGAGGTTGTCAGCATCAT
+CGGCGGCAACGGCAGCGGCAAGTCAACCCTGCTGCGGACCGTCTCCGGCCTGATGCAGCCGACGCGCGGCACGATCACCT
+TTGATGGTGTGCCGATTCAGACCATGCAGCCGGAAAATATCGTCGAGCAGGGGATAATCCATGTGCCGGAGGGGCGGCGG
+CTGTTCTCGCTGATGACGGTGCTGGACAACCTGATAATCGGCGCCCATAACAGCCGGGCCAGGGCGCACGCCGCCAAAAC
+CCTGGAAAAGGTGTATAGCCTGCTGCCGCGTCTGCAGGAGAGGCAGAGCCAGATCGCCATGACCCTGTCCGGCGGTGAAC
+AGCAGATGGTCGCCATCGGCCGCGGCCTGATGGCTCAACCGAAGCTGCTGATGCTTGAC
+>generic926
+GTCCACCGCCCGTTGCGCCGCCGGCGTGGCCGGCGCCGCGGTGTCGCCGCGCGCGATGATGACGGAGTCCTCGAGCAACC
+GGAACAGCGGCTGCTCCACCGGCCGGAGCTGCTTGCGGGTCCAGGTGCGCAGGTCGAGGCGCGAGATGCTGCCGCCCTGC
+GACTCGGAGTACACGATGTTGGGATCGGTCGGGTCGATACCGGCGTAGAAGCCGTCGCCGCCGCCCACGTTGAACCAGTC
+CTGGTCCACGATCCCGGCGCGGCGGTTGGTGCGGCTCGGCCCGCACCACGAGCCGTTGTCCTGGAGGCCGCCGCAGATCC
+AGAACGGCTGCTGCATGTCGAGGGTGATGGCGTAGAACTGTCCCACCGCCATCTGCATGATCGCGTCGTAGCTGCGGCCC
+CGGTCCCAGGTGATGGCCAGCCCGCCGTCCTCCCCGACCAGGTAGTGCTCCGGGTCGCTGGGATCCATCCAGAAGGCGTG
+GTAGTCCACGACGAGTGGTGT
+>generic927
+GATTTGGGGCAGCACGCGCAGCGAGCACATCGTTTTCCACAGCGAGTTGCTGCTCAACCCTTTGGTGATGTTGATGCTCA
+AGAACGCCGTGCTGACCATCATCACCATGGGCTTCTACTGGCCCTTTGCCGCCGTGGCCTTGGCGCGCATGCGTCTGGAA
+GCGATCAGCTTGGATCTGTCGATACCGCTCGAACAACTCATGGGCTCCAAGGTCGGTCAGATCGGTGCAGCGGGCGAGGC
+CGCAGCCGACTTGAACCCGCTGGGTTTGGATATCGACTTCTGAGCCGCGCAAGCAGAGCGACATGATCACGGCGCTTTAC
+TTCGACGGCCACACAGCGCTGGCGCGGCCGGTGGAGCTGCGGCTGCACGACGGTCGGCTGCGGGTGAGTGGGGAGGGCGT
+CGCACTTGACCTAGACGCGCGCCGGCTTGCTTGGCCCGAGCATCAGCGCCA
+>generic928
+GTCTGATGTTATTCGATTCCTCCCTTCGCAAAGAACTGTCACGCAGCTTCGGGGCCACACTGGCCATCGTTCTCACCACC
+GTGCTCACCATGGCGCTCATCCGTACCCTCGGTGAGGCGGCGGGCGGTAGCGTGGCACCACAGGATGTGGTCCTGATCGT
+TGGGCTATGCCACCTTCGGTTATTTGCCCACCATCCTGAGCTTGGTCGCTGTTCGTCGCCGATTGTCTCGTCGCCTGACA
+CGCATGTTCCGTGACAGCGAAATGGCGATCTGGCTCTCAAGTGGCGTGTCGCTGTTTCGTTTCGTTGAGCCCGTGCTACG
+CATGGCAACCCCCGTGGTACTGACCATCACCGT
+>generic929
+GGTTTTTAAAACCTAACCAGTCTGAGTGTTGTCGTTTGTCGCCGTCGCTTTTCAGGTTATACACTAAGCGGTCACATGAT
+TAAAAAACGAATGATGCTAAAATACCGACGCACACATTCATCTGAATTTCGGGCTAATCTGTAAAAAATCAGCCGCGACC
+ACCCGATATTATCTAGTGCATTAGAGGTTAACATCTTAGAAAATACCCCCTGTCCTTCATTCTGAGTTTTATCATGCCCG
+AACATTATTCCTCCGACATCAACACCGCCGTTCAACAACTGAAAGTGGGCAAGGTTATTGCTTATCCGACTGAAGCCGTG
+TATGGCTTGGGTTGTGATCCGCTGAATGAAGCGGCGGTGATGCACTTGCTGCATATCAAACAACGTCCGATAGAAAAAGG
+GCTGATTTTAATTGCCGCTTCATTACAACAGCTTGAACCGTATTTGCTGTTGACTGAGGCGATAGTGGCGCGGCTAACGC
+CGACGTGGCCAGGGGCGGTGACGTGGGTGA
+>generic930
+TCGCAATTACGGGCAATGACTCATCTACACTGGCAAAAGCGGCAGATATTCACTTAAGCGCCAGCGTTACAAAAGAAGCC
+TGCCCGCTGGGCTTGGCGCCCACCTCAAGCACAACGGTTGCCTTGGCGCTGGGTGATGCGCTGGCACTGTGCGTACTAGA
+CCAGCGTGACTTTACCGCTGAAGACTTTGCTCGTTCACATCCCGGTGGCAGCCTTGGACGACGCTTGCTCATTCATGTGA
+ATGACTTGATGCGCACTGGCGACAATATCCCCAAAATACCGGCCAACGCGTCGCTTTCTCAAGGCTTGCTAGAAATGTCC
+CGCAAAGGCTTAGGCTTAACAGCTATTATAGATGCTGACAACAAGCCGATTGGTATTTTTACCGATGGCGACTTACGCCG
+GGCGTTTGAGCAAAACGTCAATGTGGCAACCTCTAGTATTGAAGACGTAATGCACCGAGATCCCTTTGCGATTCATCAAG
+GTCAA
+>generic931
+CAGCAAGCTGATGTGGTGGTTTATGACCGTTTGGTGTCGACTGAAATTTTGGATTTGTCACGACGCGATGCGGAAAAATC
+TATGTTGGCAAGCAGCGTAATAATCATAGTTTGCCGCAGGAATCCATTAATGAACTGTTGGCAAATCTGGCAAAATCCGG
+CAAGCGTGTGGTGCGGTTAAAAGGTGGCGACCCTTTTATTTTTGGGCGTGGTGGCGAGGAAATTGAAACCTTGATGGAAC
+AAGGCATCCGTTTTCAAGTTGTGCCGGGCATTACCGCTGCTTCCGGTTGTGCCACTTATGCCGGAATTCCTTTAACACAT
+CGTGATCATGCGCAATCTTGCACTTTTGTCACCGGACATTTAAAAGACGGTTCGATTAACCTGAATTGGCAGCAATTAGC
+CGCCCCCAATCAAACCATTGTGATTTATATGGGACTGGCTGGCTTAGAAAAATACTGCACGGCTTTAATAGAAAATGGTA
+GTCCTGCGGATTTGCCGATTGCCCTTGTGCAAC
+>generic932
+CAGCGCCACGCTCACCAACATCGGCCGGGGTGGCTTGGTCGATGAGCTGGCACTGGCCGAGGCCTTGGGGGCAGGGCGCT
+TGGCCGCAGCAGCGCTGGACGTGTTTGAGCACGAACCTGCGGTGCCGCAGGCTCTGCTTGATCGGTCCAATGTGGTGCTC
+ACGCCCCACATTGGCAGTGCCACCCGCACGACCCGACGCGCCATGGCGCGCCTGGCCGCCGATAACCTTATCGCCCTGGC
+TGGCGGATCGGACCCCTTGACGGCCGTGAACCCCCAGGTCCTGGGCTGACGTCCTTGCGCGGACCTGGACGCGGTGTCGC
+CGCTACTGGGCCACGCGGATGCGCGGTGCTGGTGTTGGGGCCGGCCGGCTTCTTCGGGGCTTGGCCCTGAGGATGGCTTT
+GCGGGCGACGCGCGCCGTGGCTTGCGCCGGTGTTGTGCCACCGCCACCACCGCCGTTGCGGGCACCACCACCACCACCGG
+GGGCACCGTTGAGCGTGCGGCGACCAC
+>generic933
+GGCGGGCAACGCCTCGGTGCTGGGCTTTATGGTGGCGCGGCGCCATTTCGTCCATAACCACACGCCCAACCGCTGGGCCG
+CCTTCGATACCGGCAGTGCCTGGATGTCATTGACCATGCAGGCCCGGAAGTTCGGGCTATACACCCACGGCATGGGCGGG
+ATTAGGCTGGATGAGGTCTACCGACAACTAGAGATTCCCGAGGCCGAGTTCGAGGTGATCTGCGGCTTTGCCATCGGGGC
+CATCGACCGGCCGGACCTGTTGCCAACCGAGGATTTTCGGAAGATGGAAGTCCCCTCTGGCCGCAAGAGCTTGCCGGATA
+TGTGGCAGACCGGGAAGTATTCTAAATAGCTCCCGCTTCACTTTCCGACCAAATAACGGTGGCTACTCGCATCCCAGCGA
+TAGCCGCCGCCGGTCCAGAGGTGGTCGACCTCGTCACGCAAGGCGGCGAACTCCTTCACGTCGCCGAACCGGTCGTAAAC
+CAGCAGAATCTCCTCGTCGTCAATCCGGTT
+>generic934
+GCCGCCGTGATGGTCCTCTATCAACTGCTACGAACACAAAATCCAAATCGTCAAACAAATTTAGATTGCCCTTAGTAATG
+TAAAAATGATGACCGATTATTCCATCACGCATAGGGGCATAGCGTTCGATAAAGTACTCAACCTTGGTTAATTTTCGTTT
+TAGCTCATCAGAACTTGCAGCACCAGGAGCACGAAAATGCGTTATGGGTTTCAAACAAATCGCCGTCAAAAAGATGAATT
+TTTTCTACAGGTGTTTTAGCAACTAGATCAAGTATGTAGGAACCAGTTCCTCCTAAACCACAATGCCTATCTGTTCAGAA
+CGCAACTTATCTGTAACTGCCATTATGGATGCTCTAACAGATGCCATATCCTGATATTTG
+>generic935
+GGGGTACGTTTTATTCTGATTTTAATGATGTGTTATTAAATGGCATTAAAACATTTTAATTAGAAAATTATTACTTATGT
+TTCACTTAAAAATTAAATAATTGGTCATAAATTAATTAGATTGTAAAAAATTTTTTAATTATAATGACACAGTATATTCC
+TGAGAAGAAATGGAATAGAAAAATTTAATGTGATATGGATCTTGAATTCAATAAATTTATTTCAATCATTTTTGTCTTTT
+TTTGTTAAAAAAATAAGTTCATCTTTATTGACAAGTTTTTTCTTATGCTTCCCAAAGATCAATTTTCTAATCTCTCTGAT
+CACATAAGACATCACTCGCTTCGGTGTTTAGTAAAGCTTATGATGGCCTGACTGTACATTAAGCCGTCCTCAAGATGTTT
+GACGTA
+>generic936
+GCGAGTTTGAATTCGAGCCACACACCGGGGATCTGTTCTTCCACCAAGATCTGCTGCACCCGGGCGATGAAGTCCCGCTG
+CTGCCACTGGGCCGCCGAGATCGGCAGGGCGACACTGAACCAAGCGGGCATGCCAACGTGCTGCCAAGGGCGAGCGGCCC
+GGGCGGCAGCGCGGATCATCCACAGGCCCAAGGCTTGGAGCAGGCTGGGCGAGAGTCCCCCGGGATGCGCCAATGAGCCA
+GCTGCCGGGGCGGGAAGATCAAGCCAGTGATCGTCGGGGTGATGCCAGCGCAGCCGGGCATCGGCACCGATAGGCGCGCC
+GTCGCTGCAACGCAGCTGCGGCTGGAAGTGCAGCGCCAAATCGTCGTTGAGCAAAGCGGTACGGATCTGACTTTCGAGGC
+GCAAGGCCTTGAGTCCGGCGGCAGCGGTCGGCCCGGCCGAAACACTGGCCTGATCAGAGCCACCACGCAAGC
+>generic937
+TGGCCCCGCAGTTCAAACAGGCTGCCGCCTTGCTCAAGGGCCAAGCGCTGCTGGCCAAGGTCGATAGCGACGCCTGCCCG
+CAAAGCTCCGTGCGCCACCGCATCCGCTCCATTCCCACCATGGTGATGTTCAAAAACGGCGAAGAAGTGCGCCGCGTCAG
+CGGTGCGATGTCGGCGCAACAGATTGCGCAGTGGGTGACGCACGGTTGAGGCGATGCGCGACGCGACTACTCATTGGGCA
+GGTACTCCAAACGCAGGCGCACACAGCAATACGAGATCGGCAAGCCGCCCTGCGTCGGCGGGCTGAAGCGCCACAGCGGC
+AGCGCGCTGGCAGTATCCGCCAGCACCATTTCAGCCCCCACACTGAACAGCCGGCGCATCTCAACGTTGATGACATGGCC
+CTGCGAGTCGATGGCAAACCGCACCGAGACCTCGGCCGATCTGATCGGTCGAGGACGAGT
+>generic938
+GGCAACCAAGCCAAATTCAACTTTGGCGGCATGGAGTTCATCACCAAGCTGGTCGAAGGCAAGTTCCCGGACTTCAACCG
+TGTCATCCCCAAAATCACAAGAACCACGTCACCCTTGGCCGGGTGCCGCTGCTGTCGGGCCTGCAACGCGCGGCCATCCT
+GACCAGCGACCAAATTCAAGGGCGTCAAGCTCAGTTTTGAGCCCGGGACGCTGCGCATTGCCGCGAGCAACGCCGAACAA
+GAAGAGGCCAAGGAAAGAGCTCGAAATCCGACTACGCCGGCGACAGCCATCGAGATCGGCTTCAACATCACCTACCTCAT
+GGATGTGCTTGGGCAACATCAACCAAGACCGGGTGACGATTTCGC
+>generic939
+CGACGACTCTTTCTTCTTCTCCAAATACGACGGTGTGTTTGTAGGTGCTTTACAACCGGAGTAGTTGCCTTGCAGGGGCG
+GGGTAAAGCGCCAATGTTGGACTGCGCCCAATACTTGGTCGTCGAGTTCGGCGTGACCGCTAGCTTTGGCAATAGATCAA
+CGGCAACTGGCGCGGCCGTTGACATCGATAGTGGATGAGAACCACGACGATGCCCATATAGCGCTTTGCATGGCCTGTCG
+GGGGTAGATGATGGGCGGATTGATATTCAGAATTGAGCCCGGGCGCAGACCGTTATTCCCCGCACCGGGCGTGCCCGAGG
+AAGAGTGGGGCATTAT
+>generic940
+CGGAGGGCCTCTCACCCACCAGCTCCAGCAGTGCTGCCAACCACGGCTGAAGCACCACCCCAGACAAGCCCCACCAACAG
+CCGTGCTCGTCATGCACCCACAGCCGCTCCGGGGCGATGAGACCTGCCCCGAGTCCGGCCTGAGCCTGAGCTACGAGCTG
+GGGAATCCATGGCAGCAGATTGATCCGCCGATCCTCGAAACGAAACCCCATCGACAGGTGCAGCGCATCGCCAATAAAGC
+TGTCTTGCGTATGGATGTCCGACAAGTCCTCGGTCGAGCCCCCGTCCACGACGATGTCCAGTTGGTCGATCAGGCTGACG
+TGGTTGACCCAGCTGTCGCCTGCCTCGATGACAAAGCCCGCTTCCCGCCACTGGGCAAAATCGTCCGCCAGCCAGCCACC
+GAAACGCCGCTGGCGCTCTTGGCTGTCCAGTCCGCTCAGAATCCATTGGTCGTCAGGTGCACCCGGCAACAGACTCA
+>generic941
+CCGCCACCTCCTGGACATTGCGCGAGATTTCCCTGGTGGCTGCATTCTGTTCTTCCACCGCCGCGGCGATGGTCGCGGCA
+ATCTCGGAAATCTTTCTGATGGTGCCGCCAATCTGCTTGATGGCCCCCACCGAGGACTGTGTTGCCGCTTGAATACCGCC
+AATCTGCTGGCCGATATCGTCGGTGGCCTTGGCGGTCTGGGCGGCGAGCGCCTTGACCTCGGAGGCGACCACGGCAAAAC
+CGCGCCCGGCATCGCCTGCGCGCGCAGCCTCGATGGTCGCGTTCAAGGCCAGAAGGTTGGTCTGCTCGGCGATCGTCGTG
+ATGAGCTTCAGGACGTCGCCAATGCGCTCGGCCGCCTGCGAGAGTTCGCTCATGCCCGCATCGGTCTGTTCCGCCTGGCG
+CACCGCCTCTTCCGCGATCTTGGTCGACTCGGTCACCTGGCGGGCTATTTCGTGCACCGACGATGTCATACGAGTGGT
+>generic942
+CCGGGATTTTGGGATGTGGCGCGGATGCGATTGTCTTCACGAGCGGCGCGACGGAGTCTGCGAATGCGGTGCTGGCGCAG
+TTTGACGATGTGCTGGCGTCGGCGATCGAGCATCCGTGCGTGCTGGAGCCGCTGCGGAACCGCGCAGGGGATCGTGGAAA
+GTTTTTTTCGATGCAGGATCAGCCCATGCCGTTCCGAGCGCGGCTACGGGGGTGGTTGAACTTTCGCGATTCAATGGGAA
+AACCCCGCAACTTGTCGCTGTGATGGCGGCGAACAACGAGACTGGCGTGCTCCAGCCGTGGCCGGAAGTGCTTGCGGTGT
+GTCGTGCGAGCGGCGTGCCGATGTTTTGCGATGCGGCACAGTGGGTCGGGCGGCTGGCGTCGTGGGGACTCGGCGAATGT
+GATTTCGTGAGCGGGTGCGCGCACAAGTTCGGCGGGCCGCAGGGAGTCGGCTTTTTGAAATGCCCCGCGAATTTTCCGCC
+GCTTCTGCGT
+>generic943
+CTTTTTTGCAGCGCAAGAACAAGCCGGTTGAAAGCGTCAAGTCGGGAGCCGTCGATGTCGCTCAGCTTGAGCACCTAAGG
+GTGCGCGCTCGGCATCGACTGATCGGTGCTGTGGTGCTGGTCTCTGCGGCTGTTTTGGTACTGCCCCGGGTTTTGATAGT
+CAGCCTCGACCCCTGTCAGCGGGTGCGGGTGTCAAAGTCGAGATGGTGGGCCACCCTGAGTTGGCCGCTTCAGCCGCTCC
+TACGGCTGCCGCTGTGGCGGCTTCTACGGGAGCTATCCTTGCTCCGCCCCCCGTGGCTTCTTTCCCCGCCGCCTCTAAGG
+TTTCGCCACCACTAAGGGCTTTGGCGGGTGCTGCCAGTGCTACGGGTCCTAAGATAGCATCGCCGCAGCTCCCTCCACCT
+GCTACGCATCGACCGACCAAGACGGAATCTGAGCGTGCTCAAGCTTTGCTGGAGGGGCGTGCCGAGAAAAAGCTGCGAGC
+ACCCCCGAGGCTGCGGTGCGGTTC
+>generic944
+CTGGGGGATCAGGCGGCCAAGGCGGCTTCGATCTTGGCTTTGGTGGCGATCAGTTCTTGGGGCAGGTGGTAAGCCAACTG
+CTGGAACAGCTCGCCGTGCAGGGCCATTTCTTGTGTCCACGCGTCGCGGTCGATGCCGATGACGCTTTGGAACTGGGCTT
+CGCTGAAGTCGAGGCCGGACCAGTTCAGGTCGGTGTAGTTCGGGCTGACGCCGAAGATGTTTTCTGCACCACCGGCTTGG
+CCTTCGATGCGGCCGAGCATCCATTGCAAGACGCGGGCGTTGTCGCCGTAGCCTGGCCAGACGAACTTGCCGTCGGCACC
+CTTGCGGAACCAGTTGACGCAGTAGATGGCGGGCAGTTTGGCGCCTTCGGCTTCGAGCTTGGCGCCCACGTTCAGCCAGT
+GCTGGAAGTAGTCGCTCATGTTGTAGCCGGTGAAGGGCAGCATGGCGAAGGGGTCGCGGCGCACCACACCCATTTGGCCG
+ACGGCCGCAGCGGTGGTTTCCGA
+>generic945
+GAGTATAATAGGTGAGCTGTCTTGAAATTGAGTCATTTCTGTATTGATTGAGTTTTGTTGTGGGCACAGCATTTCGTCAG
+CTTCGGTTGATTCTTTTCCGAGAGCAGGAATCGTGCTTGGCTTGTCACTCGTGTTCAGGATCTAAGGAGGCTCGCCTTCC
+TTTCTGATGATCTTGAAACAGTTCTTAGGGTCGGTGCTGTCGTACTGCTCTTCGATTTCGACCTCGGGGTGATTTGTAGT
+AAACTTTCTTGAAGACTCTCTTCTCTATGGAGTTATCTTTATTGCTGTTTGCCGAGTCTGTCTTCTAACTCTCCATCGAA
+ATTGTGTCGATTTCCTTTTGCAGTTCGACCTTGTGCTTGTCGATTTATTCTTTGGTCTTCTTCAGCGATTCGATCGCTGC
+CTCGTAGTGCTTGATTTACCTGTTCACTTAGATTTCTTCACTCGACATCTTTGAAAGGGCTTTCTAAAGGTCGTGTTCTC
+CTGTAC
+>generic946
+GGCCGCCGACGCCCGGCTCGGTGAGGTGGGTGTAGGAGCCGTTGCGCAGGCCGTGCCGGTCGCTGGGGCCGAAGCTGAAG
+CCGTGGAAGGTGACGTCGGTGGTCCGCTTGAGGCCGGGCGCCGGGTGCGACGGGTCCTTCACCCGGTCGAAGGTGAGGTC
+CACGGTGCCGGTGAGCGGCTCGGTGGGATCCACGGCGCGCAGCGCGTCGTAGTCGAAGGTCATGGCGCCGGTCCTTCCGG
+TGACGACCCCGCTCGCCGAGTCGGTCAGGCTGCCGGAGAAGACCTTGGTCCAGGTCGGCGGGGCCTGGGCCGGCCGGGGG
+CGGG
+>generic947
+AGGATATCGTGTTCAGCTTTAAACATATAAATCCAATACGCAGTTTTGAAAATGCCTAACGCCAAGCCTCAGCGGACCCG
+CGCGCCTTTGGCGCGGGGTCCGCTGGAGGCGCACGTTAGCGAAAGGCTCATGGAACAATCTTTCCTGCCAGTGTCTTATA
+GAGATCGATGAAGGCTGAAAAATGCGTTTTTCCTGCCTGAATCGCTGGCTGTCCGAAGTGACTTCTTACTTTTTCCATTA
+GCAGATCACCCGGCCCATAACCTTGGGTAAGCTTTCCATTCGTTGGAGCTAGAAATAAATTGATGTTGATTTGAATTCGC
+TTCTACATTTCTCTGAGCTATGAGCGACGCGATTTCGAATTGAGGAGGCATGCCCGAGAAGTTCCGATTTAATTTTACTT
+CGGCATAACCGTGCTGGCTGAAATAGAAGTCAGTAGAATTTGTAACCCACTTAGGATCGCTAACTTTCAGACGAGTGGTG
+T
+>generic948
+TGCCCGGCGACCAACTCATTATCGAAGTTGATTTGGTCAAGGCGCGCGGCGAATATCGGTAAAGCGCGCGGCCATATCAA
+GGTCAACAGCGAAGTCGCCTGCGAGGCCGAAGTAATGTTTTCCGTCGTGGACAAGAGTTAGTTCGGGCTTTGGACAGAAT
+TAACAGAATCTGTAAGGACTGCGATTTCCGAGCACGGGCGCAATAATTCTGTGCATTCTGTTAATTTTGTCTAAAATCAA
+TCACAAAACATGACTGCAAAAATTCATCCCGCCGCCATAATCGAGACTGGCGCCAAACTCGGACAAGGCGTCGAAGTCGG
+CCCTTACGCCGTCGTCGGCCTGCACGTCACGCTGGGCGACGGCTGCAAATTGTATCCGCACGCCGTTGTCATCGGGCACA
+CCACGCTCGGGCCGCGGTGCGCCGTCTGGCCGTTCGCGACCGTGGGCGGGGACTCTCAGGACCTGAAATTCAAGGGCGAG
+GTCACGTACGTGGAAATCGGCGCCGGCACCACCATCCGCGAA
+>generic949
+GCGATGCACGTCTTGTTCGAAGCGATCCAAGAAGGTCAAGACTTGCTGGAGGAACGGCGTGGACTCGCCCTTCTCGTCGA
+TCAGCAACTCACCTTCGGTGTCATTCAGACTGGACCAAGCGGCGTCGATGCCCACACCCAGTTGTTTGTCTTCGGTTTCG
+ACAAAAGCAAAGGGGTAACGGCGCAGGAAAGCCGGGATGTAGCGCGCATTCCATTGGCCTTGCGGGCCCACGTAGGCGTT
+TTCTAGGTCACGCAAACCCAGCAGTGCCACAGGTGAGACCAAGGCCCGGCCTTGATCGGTTTTGCCAACCACGATGAAAG
+CGATCGGATATTCACGTGCGATGTCGTAGAACTCAACCACCGAAGCAAACACCGCGTTCATGCCACGGGCCATGCTCCAG
+TCGCTGACTTGCTTGACACGTTTGCCCGTGTGGAAGCGCCGATCCAGCAAGACCAGATCCTTGTAAAGCGCCGACAAGGG
+CTTCTTGACCGCAGCAGGCTGC
+>generic950
+ATCCCGCTGACCTTCACCCCGTGCCGGGCGTGGAAATCGGTATCACCCAAGCCGGTATCCGCAAGGCCAACCGCCGCGAT
+CTGAGTGTGTTCCGCCTCGTCGCCGGCTCCAGCGTGGCCGGTGTGTTCACCAAAAACCGTTTTTGTGCCGCGCCGGTGCA
+ATTGAGCCGCGCCCATCTGGCCGTAGGCGCGATCCGCGCCTTGGTGATCAATACCGGCAACGCCAATGCCGGCACCGGTG
+CCGATGGCCTCAAGCGCGCTGGCGAGGTCTGCCAAGCCGTGGCCGGTTTGCTTGGCATCCAAGCTGAGCAGGTGCTGCCG
+TTTTCGACCGGCGTGATCATGGAAACGCTGCCCAGCGAGCGCCTGATCGCCGGCTTGCCGGCTGCGGTGGCTGACCTGAA
+GGCTGATCAGTGGGCCGTGGCCGCCGAGGCCATCATGACCACCGACACGCTGCCCAAAGGCACTTCGCGCCAAGTGCAGA
+TTGGTGGCCGC
+>generic951
+AGCTGCGGCAGCGGACGCACCGCGCGGTGTCCGAAGCGACGACTGCCGTGGAGTCGTACCGCTTCAACGTCGTCATCGCA
+CGCGTTATGGCCCTGGTCAACGACGTTCGCAAGGCCATTGACTCCGGTTGTGGCGCAGCCGATCCCGCGGTGCGTGAGGC
+AGTGGAGGCGGTGGCCGTGATGCTGTCGCTGGTCGCCCCGTACACGGCGGAGGAGATGTGGGACCGTCTGGGTCACGCGC
+CGACGGTGGCGCTGGCCGGTTGGCCGGTGGTCGACCCGGCGTTGGTCGCCCGCGAGACCGTCGAGTGCTTGGTGCAGGTG
+GCCGGCAAGAAGGCTGCCGTGCTGTCCGTGGCGCCGGACGCGTCCGAGGACGACCTCCGCGTCGCGGCGTTGGCGGACGA
+GGGCGTGCAGCGGGTCCTGGGCGGGCGGGCGCCGGCCAAGGTATTCGTACGGCCGCCAAAGCTGGTCAACATCGTCCCGG
+GCTGATCGCGGCTAGGGCGTGTCTGACGGTTGATTGGTCGT
+>generic952
+GTCAAAGCAGACCACATTGATGAGGTTGCCGCCCAAGCAACTCGGCACCGTGTGGGTGTGGCCCGCGCGACTGGCCGCTG
+CCAGCGTGCCCCGGGCTTGGGGCTCAAGCCAAGCGCCAAAGCCGTCGAGCAGCCATTCGCCCCAGCTGCTTTGGGCGTGC
+AGGACTGGCGCGCGCGCGCCGGCTGGGCCCCCTGGAAAGGTGCGTCCGCCCACAACCCCACGTCCACGCTTTGCAAGCCT
+TCGGCCATGCCCCGTTGCCAGTTCAGATTCAGCCCGTTGTCGATCCAGTCGTCGTTCAAGATGACGCTCTTGACCAGCGG
+CACTTGGGCAAAGCGGTCGAAGTGGCCGGCGCGGGTCAGAACTGCACCCATCGGGCACCCGGTCGCGGCCGAGCTTCATG
+TTGAGGCGATCCCCCCGATGTCTTGACGCCAACTCAGCTTGGCCGCTTCCA
+>generic953
+GCCGCTCCATGCGGCGTTGAACTGAATGTCGGTGCATTTCTTTCCGCTCTTGCAGCCGTAGAAGTACAGCCCGTACTTCG
+TCCCTTCAATGCGGCCCACGATCTTGGGGTCGCCACTGCTGTCCGTATCGAGCGAGGCGTTGCCGAAGCCCTTGGCAATC
+TCAAAGATCTTGTCCGGATCGGCCGCGCTGATGATCTCTTGCCCAGTGGCCGCAGGGGCGCTTGAGCCTGAACTGCTGCT
+TTGGGCGACAGCACCCTGCATCAGGGCGAGGGATGCGATGAGCGGCACGCCAAAGGTGCCAAAACGTGAGAGCAAGGTCA
+TCGAAATCTCCTAGGTTTACAGAAGGTCAGTTGGAACGCTTTTGCGTCGCCAGTGTGCCCGATTCAAGGACGATGTTGAA
+AGGATTGCACCAGCATCAGCTCGCCGATGCGTCGCACCGGCACGCTGAGTGTCTGGCGTTTCTCGGCGCCAAAAAC
+>generic954
+CGCCGCCTTGTATAATTCCAGACCGAACCCTACCAACTGGCTTACGCCGGATAACTACAAGGACGGCAACATATACACAC
+GCATGGAGGTAACCAACAAGCCCAACAACAAACACATTGTCATGATGCTCGGTTTTGGGAGTATTCCAAAGGATGGTGCG
+ATGGATGTTTTTCCGAATATTGGGCTTATAATCCGAATTGCGTGGGCCCTTCGCGAACTAATTTCCGAAATGGTGTCTCT
+AAGTATGGTATCGATATCTATAATAACGGCGTATATTATGCCCAGTTCACCCAATGGGATTATATCTGGGGCCCTAATGC
+TAACTGGACCGATCCCACTACACAGATAAACTGGGGCGCCTGGTGCCAGGAGCTCAACAATTATTTGCAGACACAATATT
+TTCCTTCAGCAACGATCGCGCCATATATGCCTTTTACGCTCAAGATTCAAACAGTCTATGTTTCCAGGGAAGCACGCTTG
+CCATTCCAAGCCAATTCGGTTCCACCTGGAATGACAC
+>generic955
+CGGATCTAGCTCTTCACAGACTAGCCTTTCTCTAGAACCATCATCTAACCCCCCAAAAAATAACATGAACGTTCAGAACC
+AGATGCAGCTCTTACGAGGCGGAATTAATGTTGTAGGTCAAAATAGTAGTGCAGCAAATAGAAACGCTATGGAAACAAAA
+GATCCTAGTCAATTAGGCGGAAGCAGATATGCTCAACATTCATTAAAAGGACAAGAAGCAGATATTTCTCAAAAACATAA
+CGGTTTAGGACCTGCTAAAAAAGGAGACAAAGTTGAAATACAAGATAACGGAGATTATGTTGCAATAATAAGACGATGAA
+AGAAACTTATATCCTTTAAATATGACGACTTCTTAAAAGCAATAGCAGTAGGTAATTATACTACTTTTTATGCTATCTTA
+GACGATAGAATTCATATAGAAATGCCAATCGAAAATGCAGTATTTTTGACTCAAAAATTTCATGCAGGCATTGCAGATGA
+AGCAAAAGAAAGCGGAGATAACTATAC
+>generic956
+CTTAGCGGGTTGTGGTGGTGGCGACGGCCCAAGAATCACCGGCGTCACACCAAACACGCCCACCCACACGATCTGCGGCT
+TGGCCGAGCAAAAAAGCTGGCTGCTGGCCGATATGCAGGACGTCTATCTCTTTGCCGACCGCCTGCCCAGCGTCGATCCG
+GCACCCTTTGGCACCCTTGAGAGCTACTTCAACGCCTTGCTGGTCAAGAAGGATCTGGACGGCATCACGCCGCTGGATCA
+GTGGAGCTACGTTCAAGACAGCGCCAGCTACAACCTGAGCTTCTCGGCCGGCCAGACTCTGAACTACGGCGTGACGGTGG
+CCGGGCGGCCCGAAGACCCGAGCCCCATCCGCATCCGCTACATCGCGCCCCACTCCCGGCCGAAGCCGCTGGCTTGCAGC
+GCGGTATGGTGCTGG
+>generic957
+CAACGCTGGGCCAATCAGCCAGCCATGACGGAACAAACCGTTGATACGGACCAAGCCGTCGCGCATGTCGCGCAGCGGCA
+AGTTGTCGGGCAAGGCCGGGCGCAGATTGGCTTCCGACCAGATCACCCGCGCCTCGGAAAGCTCAGGGATCACGCTGTGC
+GCCGCCGCGAGCAGCTCGACCGTGGTGCGCAAGCTGACCACCGAGCGGTCTTCGCTCTCGATCTCGCTGGCGCCGATGAC
+GATGCGCTCACCCGGACGCGGCACCATGTAGACCCGGTGACGCGGATGCAGCAGCCGAATGGGCCGCTGCAACACCACAC
+CGGGCGCATGCAGCCAAAAGACCTCACCGCGCACGCCGCGCACCGGCAGATCAGGCCGAGCGCCCGTGCCGCGCACGTCA
+AACACCCAATCGAACACCTCGCCGTCGATGCGGCCCGGCTGCACGTCTTGGACGCTGCGG
+>generic958
+CCAATTTGGGGTGGCAGTGGCCGAGCGGGCTGCACCACAGGCCAGACAGGCAGTCGAACAGTAGACGGCCGTCTTCGGTG
+CGGTAATAAGCACCCTTGGCCGACACCACGATTTTCGGGTGCTGCTTGAAATAGCGGTTGGGCGTGAACGGCAACCAGTA
+GGATTCGAGATCGGTGGGTTGCATGCGTTATCCTTTGACTGCCACGTCCAGCGCGGCTTCCAGCAGGTCCAGTCCTTCGT
+CCAGCAAGGCGTCGCTGATGGTCAGCGGAATCATGATGCGCAGCACGTTGCCGTAGATGCCGCAGTTGAGCAGCAGCAGG
+CCGCGTTGCGCCGCCTCGGCCTTGAGGCGGTTGGCGATATCGGCGGCAGGGCGGTGCGGGTCGCCGGCATGGCAGAATTC
+CACGGCGGTCATGGCCCCCAGACCGCGCACTTCGGCGATGCAGTCATGTTTGGGTTTGAGCGCATTGAGGCGTTGCCGC
+>generic959
+GGCGCGGCTCAATGAGGACACCACACAACTTCATGAATCCACCTTGGGTGATTTGGCGATCCACCGAGCTGCGGTGCTGT
+GCCTTTGGTCTGCGGTTTTTGGCACGGCATAGACGGCTAGCGATAGAAGAATAGAGACAACGCGGATCAGTAGAGACATG
+CGTTCTAACGAATGAAATAACCATCCCCTTTCCGGGGTAAGACGACGGGCTTGATGCGGCTACTTGGCCGCAACCTTTTT
+GGACCCACGAATCACCTGGGCGGGGCGCTCGGTCAGTCGGCCGCTGACATATTTGTGAAGAACGCTGGCAATGAGTGTTT
+GATAAGGAATACCTTCTTCAAGCGCCTTGATTTGAATATCGGATAAATCGCCGGATGAAAGTCGAATATTGACGCGTCGA
+TCCTTGATCGCAGTGGCCCGAGCTGCTGCCTTGAACTTCGCCAGTTCGCCCTTGCTAGCCACGGATTTCAACTCGCCTTG
+TTCAAAGGCTTCCAGCAATTC
+>generic960
+GCGTGCAGTTCTTGGGCCGAGAGGGTGGTGAAGCGCTGGGTTTGGGCGCGGTGTTCGTCGAGCGTGTAGTACGAGTAGTG
+CAGGCAGTGGCCCGGCAGCAGTTCGGCGCTGCGGCGGTCCACGCCGATCAGGTCTTCGTGGATCAGGCCTTCCCAGCGCG
+CTTGGCGGCGGTCAAAAAGACGCACTTTGTGGTCCGGATACCAGCCACCGTGGCGCACAAAGTGGCCGCAGTAGTTGGTC
+ATGCGGTTGATGCGTGCCGGGGTGGGTGTGGGGCGGGCTTTCCAGGCCAAGACGGCTTGGCGCAGCGGTTCATCCAAGGC
+TTCGTCGGCGTCGAGGCTCAGGACCCAGTCGTGCTCGGCTTGGGCGTTGGCCAGATTTTTCTGGGCCGAATAGCCCAACC
+ACGGCTGGGCAATCACCCGCGCGCTGTAGCGGGCACAGATTGCCAAGGTCGTGTCAGTCGAGCCGGAATCCACCACCACG
+ATCTCATCGGCCACCCCTTGGAGCG
+>generic961
+CGGGAACGCAGATGGATAAGTTGTAACTGCCACATGCAAAGTTATTCTATTTCAGCGCTGAGCTGTACAAGAATCAAACC
+ATTTCTGAAAGCGAGAAGCTCAAACTCAAAGAAATGGTCATCAATGACGAGCCATAAGTATTTGAGCTTCTTGAAAGATA
+CTAAGTTTCGAATAACGAAAAGAGTTTGTTAATGGGCTGCTTGCCCTTCTCAGGCCGCACTAACGACACTTATATCAACA
+GAGCTAGCCAAAAGTGGAATAATCATCAAGAGGCCTAGTGGTGCAAGGGCACAAGGCTTAGCCAGCCATTGGGCTGCCAA
+GTTCGAATGGTTCATAGGGATTCCGCCTCTCGATGTAACAACAGTAGCCTCATCAGCAATAGTTGGCCCAAGCGGAGTTT
+TTTACAGACGATAATCCCTCTGCCAGCGAACAAGAAAAGATAAATTCTCATAATGAAGAAATCGCTTTA
+>generic962
+GTTACAAGGTGCGTTTGAAGCGGATCAACATTTCCTCAATACGCCATTTGAACAAAATATTCCTGTCTTAATGGGCTTGC
+TTGGTATTTGGTATAACAACTTTTTCGTATGCCGATTCCCACCGCTTTATTGCCTTACGACCAGTCCATGCGATATTTTG
+TCTGATTATTTCCTAACAAGGTGATATGGAAAGTAACGGTAAAAGACGTCGATATGAACGGCGAAAAAGTACGATTACAG
+CACTGGCCCGATTATCTGGGGACAACCAGGTACGAATGGTCAACACGCCTTTTTTCTAATTGATTCATCAAGGCACAAAA
+CTAGGATTCCCTGTGATTTTTTAGTCCGCCGCTAACAGCCATTATCATTTGTCCCGAACACCACGATATTTTAATTTCCA
+ACTTCCTTGCCCAGCCGCAAGCCCTTATGTTGGGTAAAACTAGCGATGAAGTGAAAGCAGAATTAACACCCGAACAACAA
+GCCGATGCAGTG
+>generic963
+CTCCCCTTTATGGAGATCATCGCGCAGGAGATTGGCCGAGCGCTTCAGTACTTCTATACCAGTACGCCGCATCACCGGGT
+CCACTACGTGATGCTGGCCGGCGGGACGGCGACCTTGCCTGGTTTGACCGATCAGGTGCGTGAGAGCACAGGGGTTGAAT
+CGAAAATCGTCAATCCCTTCGAGGGCATGGCGGTGGGTAGTGCGGTGCGTGAAAGCAAGATGCGCCGTGAGGCCCCCTGT
+ATCTGACGGCTTGCGGATTGGCTTTGCGGAGATTCAAACAATGATTCTTATCAATCTACTGCCCCATCGGGAGGAGAAGC
+GCAAACGCCGCAAACAGGTTTTCTTTATCGGGTTGGGTGTTGCTGCGCTCATCGGGGTGCTCATCGCCGCCGCTTGGATG
+ATGGTTTTGGCTGAGTTGACTTCGCAGCAGCGTGGACGCAATGAGTTTTTGAGCGTCGAAATCAAAAAGCTCGAAGATCA
+GATTCAT
+>generic964
+CCAGCGCGTGGTGCTCGGCGAGAAGTTCGGCGTTCAAACCTTCGCCAGCGCCGCAGCGGCATCGACCGCACTGGCTCAAG
+CCACGATGGTGGTCTGGGCCGTCAAGCCGCAAAGCTTTGCCGAAGCGGCGGCCCCTTGCGCGGCCTGGGTTCACCAAGCC
+GTGCAAGTCTCGGTGATGGCCGGCATCCGCAGCGACGCCATCGCCCGCGCCACCGGCTCAGACCGGGTGGTGCGCGCCAT
+GCCCAACACCCCGGCGCTGATCGGCCAAGGCATCGCCGGCCTTTTTGCCCGCGCCTCGGTGAGCAGCGCTGAGCGCCAAC
+AAGTCGAAGCCCTGCTCGCCCCCACGGCGCACTGCTTTGGGTCGCGCAAGAAAGCGATCTGGACGCCGTGACCGCACTGT
+CCGGCTCGGGCCCGGCCTACATCTTTTATTCATCGAAGCCATGATGACGGCGGCTGAGCGCATGGGCCTGAGCGCCGAGC
+AA
+>generic965
+CAATAATGCACAACATCGTGTTTTAGGTAAACAGGATGGCTGTGTGTGGTAGGCACAGAGGTTTCTACGCAGCCCCCTTG
+GTCTATGCTGACATCGACAATCACAGAGCCTTTTTGCATGGTTTTGACCATCGCCTCCGTCACTGTTTTCGGAGCTTTCG
+CCCCTCGGCAAAGCACTGCCCCCACCACGAGATCAGCATCAACAATCTGTTCAGCAATATTTTGTGGATTGGACAAAAAA
+CGCTTGCATCCGGCAAATGCTTTTGTTGCAAGTTCTGCAAACTTTCAATGCCCAAGCCCGCCAGGAAAACATTCGCCCCC
+ATCGCACCCGCAGTCCGCGCTGCATGTTGCCCGACAATGCCATCACCGATTACAACCACCTTGCCATGCCGTTTATTTAA
+AACCTGGCCTAACTGCACTCCCCCTGCCCCTGCTGATGTTTTGCCAAATAATAAGCTCCCACCGTCACGGCCATGTTACC
+GGCAATCGCGCTCATT
+>generic966
+GCGGCGGTCAAAAAGACGCACTTTGTGGTCCGGATACCAGCCACCGTGGCGCACAAAGTGGCCGCAGTAGTTGGTCATGC
+GGTTGATGCGTGCCGGGGTGGGTGTGGGGCGGGCTTTCCAGGCCAAGACGGCTTGGCGCAGCGGTTCATCCAAGGCTTCG
+TCGGCGTCGAGGCTCAGGACCCAGTCGTGCTCGGCTTGGGCGTTGGCCAGATTTTTCTGGGCCGAATAGCCCAACCACGG
+CTGGGCAATCACCCGCGCGCTGTAGCGGGCACAGATTGCCAAGGTCGTGTCAGTCGAGCCGGAATCCACCACCACGATCT
+CATCGGCCACCCCTTGGAGCGAGCGCAGGCAGCGTTCGATGTTGCGTTCTTCGTTGAGGGTGATGATGGTGGCGGAGAGC
+TTCATGGGTGCGTTTGGGGTCAGGAACAGACAGGGATGGCAGAGCGGGCGATTATCGACGGGACGGATAA
+>generic967
+GGCGAGGCGAAACCGAACTGGTGCGCGTGCCGGCCACTCTGGCGGTCGAAAGCGGAGACCTCGTCAGCATCCGTACCGGC
+GACGAGTCGCCGCTCACCATGAACCTGATACCCGAAGTCAGCCGCGTGACCGCGCTGGTTGCCAGACACGACACGATTGC
+CGCCATGACATACGGGTTCGTCAACACGGCGCCGGTGCAAAACCTGTTCGTTCAAGTGCACTCGCCATGGATGCCGGTCC
+AGGCCGCGCAGACTCCCGCAATCGGCCGGTAAGGCGGCCTCCGGAACGCGCGACACTTTCCACGACAACTGAAGGAGAAT
+AATCATGAGCGACCACCAACTTGCGCGAAGAAACCAGTGACTCGATCTACGGCTGGCGCGCCGAACTGTCTGCGCTGATT
+TCCTCGCGTCTGCACCGAGCTTTCGACCGGCCCTGCGCAAGGTCTGTCTCCGGGAGGACCCGGCGCTTCTGCGCCTGGCG
+G
+>generic968
+CGGCTCCACGTCCAGCTTCAGGCCCACGTCCAGATAACTCAGCGAGCCTGAGAAGCCGCCCAACGGCAAACCGCTGGCGG
+TGAAAACGGGCAGCTTTTCGCCAATTTGCACTTTCGCCTTCTCACGGTTGCGGACGCGAATTTTCGGGTTGGCCAGCAGG
+TTGTTGTTCCCCGCCGAACCCTTGAGCGTGGCGACCAGCGCCGGATTGGCGATGCTGCCGCGAAAGTTGCGATGTTGATT
+GAGCAACACCGTCGAGTCGCCCCCGGGGAGGCCGAACTGAATCTGCTCGGGCCAGCTCAGGCCAATTTCATTCAGCCGGT
+CGCTGGCGATCTCTATCACCTCGACCTCCAACATAACCTCGGGCTCGGGCAGGTCAATCGAGGCGATCAGGCGCTCGACC
+AGGGCCAGCACTTCGGGCGTGTCGCGCACCATGAGCGCGTTCAGGCGCTCGTCGACATGCAGATCGCGCACCTTGGCCAT
+GGTGCGCACC
+>generic969
+CTGAACCCCGCGCCGTGGCCGGCCTGCCAGAGGTTGTTGTCGCTTACGGAGGCGCTCACGCGGAGCGGCGTGGTGTTCGG
+ACCGCGGCGGTTGTTCAGCTCCACGCTCGCGTGCACCGGCGCCTTTTCCTTCACGTCGAGATCGACGTCGACCGTGTTGG
+CCTCCACGCCGGCGTGCAGCGAGGGCGTCACCTGCCGGTCCGGCAGCTGGTTCAGGGCGACAACGTCCGGCGTGACCCGG
+TTGAAATCGATCACGCCGCCCTCGGCGAGCGACGGCGCCATGGCCTTGATCTGCTTCGGCGAGGAGTAGCGCGCGCCCTT
+CACGCGCAGGCGGCCGACGGTGCGCTCGATCACCTGCAGGTGCACCACGCCCTTCGCCACCTGCTGCGGCGGGATCACGA
+CGGCGACGGTCTGGAAACCCTCGGCCGAGTACGCCTGCTCAAGCGCGGCGCGGGCGTGC
+>generic970
+GCCTGCTGCGGCAATGACAGATACAAGATGCAATTTGATCTTCATACGGGATGTGGTGGCGACCGTTTCAACTACGGCAG
+ACTGACACGGTAGAAGCGTGCCGGATTGGTTGGGGCCACACTTTCGATGAATGTGCCGGTGCCGCCGGTTAGAGAAACCG
+TCTCCAGCACCTGCCAGTTTGGCGGCGCAAGCGACGTCGCGGCCCAGATGGTGGCCTGATTGGCCACGCCGGCTCCCGCC
+GTCAGGTTGAATTGAATCCGTCCGTCCGGCAGCCGCACGACGGAGACCGGGCTGATCAATGGCGTTCCACTCATGGGAAT
+GAATGTTGCCTGCACGGCCTTGTAACTGCTCATTGTAACAGAGGCGGTGTTGTTTGTCGGATTGGCGACGCCTTGCCAAG
+CATAAAAGAAGTAGTCCGCATTCGTGTTGGCAGTCAGCGAAACTGCCTGGCCGACATCGAACCAGGGGCCTGCCGGATCC
+GCGTTGACCGTGCC
+>generic971
+AAATCGCCATCGCTGCTGGTGCGCAGACCATCAGCTTCCAGAACCAGGTTCAGGGCGTTATCATCGGTTTTCGCGGTGAT
+CTCGGCGCGTTCCCAGCCCACAATCTGCAAATACGCCACCCACCATGCAATTTCTTTTTTGGTAATATGATTCCAGGTTC
+TCTGTTGCTCTGTTTCTAAACTAGCGACCGACAGACGCCGAAACGCCTGCCAGCACGCACCTTCACTTTCCCTAACCAAA
+ACGAATACAACGTTAGTCGCTCAGCATCCGAACAACTACGTGTACGTGTGCCGTTGGCACGAAATACCTTTCCCCCGTCC
+TCCCAGCATCCAACCGTTAGTCATTTTTTGTAAATTTTTACTTTCCCGTTACG
+>generic972
+GCCGCTCAAACTCAGGATCAAGACCGCGCACCCCTTCGAGGGCAGCACACACTTCCACCGCCAAAGCGGCCAAATCACGC
+AATCCCGGGGTGAAGTCAGGGTGGGCGACACAACGATCCCAACGCAAGCGCCCCCCTCCGACTCGCCTGTGGACTCACCG
+CTGTGGCCACACTGGCCACGCTCAGGCACCAGCCCCGCACTTGGCGCTCGACGCGCCCGGACAAAACACGCCAGTCCTGC
+ATGCCCCGCCGCTTTGG
+>generic973
+GCATCTTGCGGCCTGGGGTTCCCGGTGTCAGCGACAACATCAGCGTCACGAGCATCGTCGGCCGGTTCCTCGAGCACACG
+CGCATCTACTTCTTCGAGAACAACGCTGTGCCCACAGTGCTCATCGGCAGCGCCGACCTGATGCGGCGCAACCTTGACCG
+CCGAGTCGAGGTGCTCGCACCGGTGGATGACCCCGCACTGATTGCTCGGCTGCGCGGCGAGATTCTGCAGACCTACCTCG
+ATGACAACGTCAAGGCGCGGCTCATGAGTTCCGATGGCACCTACACGCGCGTCCGTGCCGAGGAGAACGAGGAGCGCATA
+GACGCGCAGCTCCTGCTGATGGAGGCGTCCGCCAAGCGCTCAGGCTACGAGCCTGGCCACTGAGCCAGGGCGTCGAGGAG
+GGAATCGGCCTGGACTGCAGGCGAAAGGGGAGCGAGGACCGGTGAAAGCGTTGTTGCGGTGGGC
+>generic974
+GCGAGACGGTAGTCGCCGAGAAGCTCGAGGCGATCGTCAGCCTCGGGATGACGAATACCCGGATGAAGGACTTCTACGAC
+CTGTGGGTGCTCTCGAGGCGGTACGAGTTCTCAGGCGCCACCCTATCTCAGGCAATCCGCGCAACATTCGAGCGCCGCGG
+AACGGCAGTTCCCGACGGGCTGCCGCTTGGCCTCAGCGCGGAATTCGCGGCGGACGCCGCGCACCGGGCGCAGTGGACGG
+CCTTTCTCACGCGCGAGACGCGCGAAGCGAACTCGGCCACCAATCTCGATGCGGTGGTTCGGGAGGTCGGCGCGTTTGTC
+CTGCCTCCCGCGGAGGCGGCCCGGAGTTCCAGCCCGTTCGACAAATCATGGAGCGTCGCACGCGGCTGGAGTGTCTGACG
+GGCTGAACGGCTGGCTCCAGGCTGTCGAGGGGGCCTGGCGCTTCGCGCCGTCGGGCTTCCGCGGGTTCGCTGACGCTCAT
+CCGCGTGGACGCGGCGCGCGGGCGCCGGG
+>generic975
+CGCGAGGCCCCGAGCAGATTTTCGAGCACCAATCCAGCGTCGATGAAGTGGCTCAAGGTGGCGTTGGAGGCTGTGAGCCA
+CTGCTTGGCCGCGTCTGGGTCGTCGTCGGTCGAGATGCCGATCACCGTGAAACCCCGACCCGCATCGCTCCAAGTCAGGC
+GCTCCAGCGAGGCGGCTTCAGTCACGGCATGGTCCGCACCAACTGGCCCACACGTTGATGATCAGCGGCCGACCGGCATA
+ACTCGTGAGCAGGCGTGAGCGGCCATTGAGGCCAGCCATGCGCACATCGGGCAGAACTTGGCCGACGTCGATGGGTTTGG
+GGTCGCGAGGTGGGGCGGCGTATAGACCCCCGTGCAAGGCGATCAACAGACCGCAGGCAAATGGTTTCAAGGCATGCATG
+GGCTGAAGTATCGGTCCCAATCCGTATCATCCGGGCTTGGGTCAAATCCGAAACACACACGAGTTGCACCATGAAAATCA
+CCGTT
+>generic976
+GCCTGACATCAGGCCGATGAAGGAACGCGGGGCGGCTTTCATTCCATCCGGGCCATGGCGACGACCAAGCCATCGGCTTG
+TTGGGGCGCTGTCGTTGCGAGTTGTTCCATGGCTATGTTGGCGGCACGGTTGAAGGCTTTGCGCGCGGTGTTGGCCAAGG
+TGGTGAGTGGCGGGGAGCTGCGGGCGACGTTGGCTGGATCAACCTGATGGCCGTCGGTTTTGAATTCGAAATGCAGATGA
+GGCCCAGTGGCCAAGCCCGTTGAGCCCACGGCACCGATCAACTGGCCTCGGGTCACGCTTTGGCCCACTTTGACGCTGCT
+GCCGGCTCAGGTGCGCATAGACCGTCTCCAGCGTGTCGCTGTGGCGCAGGCGGATGACGTTGCCGTAGCCCTTTTGCCAA
+CCTGCAACACCACCTGACCTGTGCCCACCGCACGTACCGCGCTGCCCTTGGGGGCCTGCGTAATCGATACCGAGGTGGTT
+ATGCAGGTGATGAC
+>generic977
+GTTCGCTTCTTTTCTTCCTCCAAAACTGTCTACTCTTTGGTCTACTTATCTATGATTTCCTGCAATTTTCCCTTCTCAAG
+GGCGTCATGATCAACTCTCAATTATAATTGAGCAACTTCTGCTTCTCTTTGCTCAATCTACTTCGATACTTGGCTAGTGT
+TCTCCATGATTGCCCTTACTGCTTGGATGGTCATCTGAATGTCCTCAATTGAGTCATTAACAATAGTCTAACTGTCCCTG
+GTTTCTTCAATATCTGAAATTCGATTGTTTAACTTGAGAGTTGCTGTCAGAGTGTCAACGATTTTTACTAACTCATCAAG
+GTGAATGACTCCTTTTTCACTTTTATTTGCGTTCTCTCCAAAAAATACTGCCGTCCCCTGCTCTACTACTTCTTCTTCGA
+TTTGAGGAGCAACAACATTTACCTCTTCAATTTCATTCAAAGTGAAGCATTCGTTGATCTCGTATCTGTACTTCTTGAAC
+TCGGATTCAACGCAGCAAGA
+>generic978
+ATCGACGCGCCGCAACTTTCTGAGTTCTACGAGCTGGGCATTGGCCCGCCGCTGGCGATTTCCTCGGCCCACGGCCAAGG
+GATCCGCAGCTTGGTCGAAATCGCCTTGGAAGGCTTGGAGCCGCCCGAGGAGGAGGATGAGGCCGCCAAAGGTGCAGCGG
+GTGGCCCCAACCGGCCGATTCGTTTGGCCGTGGCTGGCCGGCCCAATGCGGGCAAGTCCACCTTGATCAACGCTTGGCTG
+GGCGAAGAGCGCTTGGTGGCTTTTGATCTGCCGGGCACGACCCGCGACACCATCCACGTGCCGTTTGAGCGCAATGGCCA
+GCATTTCGAGCTGATCGACACCGCTGGTCTGCGCCGCAAGGGCAAGGTCTTTGAAGCCATCGAGAAGTTTTCGGTGGTCA
+AAACCCTGCAAGCCATTGCCGACGCTAACGTGGTGTTGCTGGTGGTGGATGCGACCGAAGGGGTTTCCGATCAAGACGCC
+CACATCGCGGGCTACATCTTGGAGGCCGGCCGGGC
+>generic979
+GCACAACGCTTGGGTTACGCCGAAGCCGATCCGACCTTCGACATCGAAGGCGTGGACGCAGCGCACAAGGCCACCTTGAT
+GAGCGCGCTGGCCTTTGGTATTCCGGTGCAGTTTGACAAGGCCCACGTTGAGGGCATCACCAAGCTGTCGGCCACCGATA
+TCCGTTACGCCGAACAGCTCGGCTATCGCATCAAGCTGCTCGGCATCGCCAAGCGCCGCGATGATGTTGGCGGCATTGAG
+CTGCGCGTGCATCCGACGCTGGTCCCGGCCAAGCGCCTGATTGCCAACGTCGAAGGTGCCATGAACGCCGTGATGGTCCA
+TGGCGACGCGGTGGGCACGACGCTTTATTACGGCAAGGGCGCAGGCTCCGAGCCGACCGCTTCGGCCGTGATTGCTGACT
+TGGTGGACATCACCCGCTTGCACACCGCTGATCCGGATCACCGGGTGCCCTATCTGGCCTTCCAGCCCGATGC
+>generic980
+CGAACATCCCGGTTCGCTGTTGACCGCATCGCATCGGCCGTGATTCTACCGCGCACGTAACTTGGTCGAACGGTTCTTCA
+ATAAGATCAAGCAATGTCGGCGTATCGCCACCCGTTACGATAAACTCGCAGCCAACTATCTTGCCTTCATCAAGCTGGCA
+GCTATCCGCATCTGGTTGCGAGCTTATGAGTCCGCGCCCTAACCAAACAGGGGAAGACGATCATCCGCGTTCGTCCGTGA
+GCGACACGCACCCATCGGCTGCGGCAGTCGCTACAGCAGCAAACCGCTATCGCCGATGTGCTCAAAGTAATCAGTCGCTC
+GGCTTTTGATCTACGGGCAGTGCTGCAGACCCTTGTTCAGCCGCCCGGTTCTGCGCCGCCGATAAGGCCCACATTATCCG
+CGAGGAAGATGGAGGCTTCACGGCTACTCCCGCGAATTTATGGGGTGTTGGTTTTGATGCGCTCCGCGGAA
+>generic981
+GTCAAGGACGACGGCAACCAGCAACTTCGGGACGCCCAGGGCCTCAGTTTCGGTACGGTGAACTATGCCACCGGCGTCGT
+CCACTTCCTGCCCGACACCACCGTGCGCATTCCAGTCGCGCGCTATTCGGTGACTCAAATCGGCTGGACCCGCAACAGCG
+AGGGAGCGCTGATTCCGGTCTACCGCAATCTGTTCTCGCGTTGGGAGTACGTCACCGCCGGAGCCTCGATGCCGATCGAC
+GAGTCGGCATTGGTAAAAATCCGCTACCGCGCGGCGGGTTCATCCAATGCGGCCACCGACAGTTTTACCGCCAGTGGCCT
+GAAAATCGATCTGACGCCCACCTTCGCCGAACCCATCGTGCCGGACAGCATTCATTTTGCCCTGGGCGGCAAGGCTTACT
+TCGACCGGCTGGGCAGCCTGTATTACGACCTCAACCCGGCGACCGGGGCGGCAACCTTGGCGGGTTCCATCAATTATTCC
+ACCGGCGAAGCCAATCTCACCGCCTGGGTCCCTGCCGCTCGAACGCGGTCA
+>generic982
+ATGTAGGGGTGCGTCTTCGGGTCCACGTCTGGATTGACGCGCAAGCTGATGGGGGCGCGCACGCCATGCGCACGGGCGAC
+TTCGTCCAAGACGGCTAACTCAGGAATGCTCTCAACATTGAAGCAGCGCACGCCAGCTTCAAGGGCTTGGGCCATCTCGG
+CGCGGGTTTTGCCGACGCCCGAGAACACCACCTTGTCAGCTGAGCCGCCGGCTGCCAGCACCCGGGCTAACTCCACCGCC
+TGAGACGATGTCAAAACCNCAGCCGGCTTGGGCAAGGTCTGCAACACCGCCAAGTTGGCGTTGGCCTTCATGGCGTAGCA
+GATCAGATGTTGACGCCCGGCAAGGCGCGTTGGTACGCGGCCACGCAGCTTGCATGGCGCTACGGGAGTAGACGTAGAGC
+GGCGTGCCGAACGACGAGCCAGTTCGTTCAGTTCAAGCGCTTCAAGGTGGAGGTTG
+>generic983
+GGCAAGGATGCGCGCCCTCAACGTCAGGCCGGGAGGCCTGACGCCACGATTAGATCTGGAAGTTTGATTCCAGGGCGGGT
+TCACGCACCACGCCTGAACGCGCAAGGGTGGCGTTCACCAGGGAGAGCAGCTGGTTTGAATTCATCTGCTTGTGAAAAAA
+CGCCGTGGCGCCCGAGTGCAACGCCAGCCGGGTGTATTCGACCGGATCCCCGAGCGACGCCATGACCACCGGGGTGATCT
+TGAAGTCATCAAAGCGCCGCAGCCAGGACATGATGCGGAAGCCATCCCACGGCACCGATCCGCCGCTGGCCACATCCGGC
+GGGAAATTCACATCCAACACCAGGAGATTCGGCTTTTGCGCGCGGGCCACCCGGATGGCCTCCGAACCGTCCTTGGCGGT
+GATGACCGCAAAACCGTTGCTCTCAAATTTCATTACGGTGGCAAGCAGGAAAATGGGATCGTCGTCCACCACGAGAATGG
+TCTGACGAGTGGTGT
+>generic984
+AAAATTCAAATGCAAGTTAAATTATGAGAAGTAATGGAAATTAAAATAATAGATGCTTAACTTAAACCAATGAAATTTAA
+TAAGATTAGTAAGTAAAACATATATAAAATTATTTAGATGATAACTGTTAATTTTAAACATAACCAGATATGGAACCAAT
+TAATTATAATTTATAAATATAACATAATAAATAGTAAGAAATTAATAAGACTGTATTAATTAAATAAAATATATAATAAT
+AATAATAATAAAATACTTAAAATAATAGCCTTAGCATCATTAATATTAATAAATAAAACAATCAATAACAAAAACCTTAA
+GAGAAATATGATAAACTAAGTATAATCCTAATAAAATTTAATAAACTTAATATAAACTATAACAATATGGGGAAGCTCAA
+AGTAGTGAATGTTTCTACATTACGTTCTGTGAATTCCTAAACTTAGCTAGTTAATATAGATAACCATTCTATACCATAAA
+TAGAT
+>generic985
+ACATCAAACGCATTTTTGCCTTGTTGCAATATGCCGGTGACATTGGAAACAATGTGCATCACATGCGAATAACGTTCGAT
+AATCATTTTATCGGTGAGTTTCACCGTGCCGATTTTAGCCACGCGCCCCGTATCGTTGCGCCCCAAATCAATCAGCATCA
+AATGTTCAGCGATTTCTTTCGGGTCGGCGAGCAAATCTTTTTCCAGTTCCAAATCTTGCTCTGGTGTAATTCCACGCCGA
+CGAGTGCCAGCAATCGGACGCACCGTGACAGTGTTATCTTCCAGTCTTACCAGAATTTCTGGCGACGAGCCGACAATATG
+AAAATCAGCCAAATTCAGATAAAACATATACGGCGATGGATTCAAACAACGCAAGGCGCGGTATAAATTCAGCGGTGCAG
+CGGTGTAAGGAATTGACATCCGTTGTGATAACACCACCTGCATAATGTCGCCGTTGGTGATGTACTCTTTGGCTTTCACT
+ATCGCCGCTTCAAA
+>generic986
+GGCTCGACATGACGCTCTCGTTCGGCGCGGCGATGCTCGGGCATCAGCCGAAGTTTGTAACCGATGCGATCACCGCGCAG
+CTCGCGCGCGGAATGGAAATCGGTCCGACGTCGCCGCTCGCGGGAGAAGTCGCGAGGCTCGTCTGCGATCTCACCGGCAG
+CGAGCGCGCAATCTTTTGCAACACCGGCTCCGAGGCTGTGACCGGCGCAGTCCGCGCCGCGCGCACTGTGACGGGCCGCT
+CGAAGATCGTCTATTTCCACGAGAGCTACCACGGCATTGACAACGAAGTGCTCGGCCGCCGCACCGGCTCGGCGAACATC
+CCGATCTCCCCGGGCATGACGCCCGAGGCAGTGTCGAACACGATCATCCTCGACTATGGCGATCCGCGAGCGCTCGACGT
+AATCTCCGCGAATGCCGCGGACATCGCCGCCGTGCTCGTCGAGCCCGTGCAGAGCCGCCGTCCTGCGTT
+>generic987
+GCCCGCCACCAGCTCTTCATCGACCGCCTCACCCAGCGCCAGCATCTCGGCCCACTGCTCTTCGGTGTAGGGCTTGGTGA
+CGCGTGGGGTTTCGACGATGCGGGTGACTTGCATCGTGTGGGCGAAGCTGACTTCGCACTCATCCACTGCGCCGCTGATG
+GGTGCTGCGCTCGACGGCTGCGGCGTGCAGGCCACCGGAATGTGCCCTTCGCCAGCCATCAGGCCCGAAGTCGGGTCCAA
+ACCGACCCAGCCTGCACCGGGCAAGTAAACCTCGCACCAAGCGTGCAAATCGGTGAAATCGACCTCCGTACCACTCGGGC
+CGTCCAGCGCCAGCACATCGCTCTTGAGCTGGATCAGGTAGCCGGAGACAAAGCGCGCGGCCAAGCCCAAATGGCGCAGG
+GTCTCGACCAGCAGCCAGCCGGTATCGCGACACGAACCCGAAGCCTTGACCAACGTTTCCTCGGGCGTTTGCACGCCGGG
+TTCCATGCGGA
+>generic988
+GACAAAGCCTCGCTGGCGCTGGAGCCGGGCGAACGCGTCGGCCTGATCGGTCGCAACGGCACAGGCAAGTCCTCGATGCT
+GAAACTGTTGGCCGGGCTGGAAAAACCCGACGACGGTTTGGGTGCAGCTCCAGCAAGGCTTGCGGCGCTATTACGTGCCT
+CAAGAGCCGCTGTTTGCGCCGGGGGTGACGGTGTTTGATGCGGTGAGCGAAGGCGTGGCTGAAGCCAAGGCGCTGCGCGA
+GCGCTTCGAGGCTCACGGGCCGGACGACGATCTGGATGCCCTGCAAACCCGCATCGAAGCCTTGGACGGCTGGACGTGGG
+AGCAGCGCGTCACTGAAACGCTGGAGCGTTTGGGCTTGGTGGCCGAGTCCCGCGTCGAGGCCTTGTCGGGCGGCATGCGC
+AAGCGCGTCGCTTTGGCTCAAGCCTTGGTGGCTGCGCCGCAGGTGTTGCTCCTTGATGAACCAACCAACCACCTCGATCT
+CGAAGCCATCC
+>generic989
+GATAACGTTCAGCCGTACTTCATCTTTTCCCCGGGTATTCTCTCAATATCCCCACTATCTTTTGCAGCAGCGCCACATCT
+TTCTGTTCGTCTTTGGTTTGATGCAAACCGATCGTGAGACGTCGCCTGGCATTAGTCCCCACTGCCGGTATAGTCGCCAC
+AGGTTTAGTGTCCGGGGACTCTGTACGGGGGGACGCCGCGGGCTTGGCCGCCGGAACAGCCGCCGGTTTTTCTATCTGTG
+CCGTGCCTTCAGCAGGCGGTTCATAATAATCCGCATCATCACAAGCAATCGTAATTTCTTCATCACGGACCCGTACTTTA
+CCCCACACCACCCAGTTCGTTCCCCTCTTTCCAGAGTTCCTCTTTCTTGGCGTATGTCCGGGGCCAGACAATTACCTCTA
+CCTGCCCGCTGACATCCTCTAGAATGCAGATGGCAAAGATTCGCCCTTCTTGGTAAGCTGGTAACGCGCGGAATAACGCG
+CCCGGCTGTACGATAGACTGTTTATCCAGTTCGGCATTAATATTA
+>generic990
+AACGGATTTGCGGGTGGGTTTATTTACCTCTACAGCCGATTTTTGAGGACGCAACCATGAAAAGAGTGGTAGTAACAGGT
+TTAGGCATTGTTTCTAGCATAGGCAATAACCGCGATGAAGTGGTTGATTCCTTAAAACAAGGTCGCTCAGGCATTAGTTT
+TGCCGAAGATTATGCTGAATTAGGCTTCCGTAGTCAGGTGCGTGGCGCAATCAATATTGATTTAGATAGCTTTATTGACC
+GTAAAATTAAACGTTTATGGGCGATGGCGCGGCATTCAACTATATTGCCATGCAGCAAGCCATTACCGATTCTGGTTTAG
+ACGAATCGGACATTTCTAATTTTAGAACAGGCTTAGTGATGGGTTCAGGCGGGCCTTCCACATCAAAT
+>generic991
+GACGGGCTTTAGTATCGAATCGGGACACTATCAGCACAATCTCGCCATTTTCAGCCACCGCGTCAACACACCTTTAGATT
+GTTTGCAGCAGTTGGAACGCGACCGGCTGACGCAAGATAAGCACGTTTATTTGTCCGATGCGGTCACCGATTACCAGCCC
+AAGAGAACTCAACACGGCCACGACTATAATATGATGGTGATTGATAACTATGGCGCGTTAGTCCATTCCGATGAGGTCTA
+TACCAAGTTGGTTGCAGACGTTGAAAACCGCAATGCCAAACTGATGAGCCACTTTAAAGATGAATTTATCCGGCTCGCAA
+AAGAAAAGGTTATGAGGTTATTTTTGTGAAAGACACCGCCAGCTCTCCAGAAATTGCACAGGATAAAGCCGAAAAATCCG
+CCATCAAAGCAGAAAGGGAATTAGTTCGTGCTGAAAATTTGGCAAGTGCCGAACCTTTTGAAAATAATCTGGACTATGAA
+CAAGCCAAAATTAAAGG
+>generic992
+CCTCGTCTAACTGTTCCAGTTCAATTTTCGCTCCGAGGCCGTCCGACCGGAGGCCGGAGGCGCGCGCTTCACCGCCGCAA
+TCGCGGCAATGCTCGCCGCCATGCCGCCCCAGCGCCATGCGCCGCCCGCGAACCACCACGCGCGCCAGGCCTGCGGGGCC
+GCTTCGATGAGAACCTCGCTCCAGCCGCGTCCCGCCGGCACCGACCAGGTCAGAGCTCCGAGAGCCAGCAGCAGTCCGCC
+CGCCGGCGACAAGACTCGGGCCCATTGAACTTCCTCCGTGTCCGTGCCCCATAGGCCCAAATACACCGCACCGCCCGCCG
+CCGACGCGCCGAGAGCCGCGGCGATCATCGTCTCGAGCGGCGGCACGGGACTAAGTCCGACATAGCGCGCCAAGCAGGCC
+AAGGAGCCCGCCCAGAGAGCGACGCCGGCCGTCTTGCGCCAGCCCGCGCTTCGATCGCCGAACGTCAACATTATCGGGAA
+CGCCGACA
+>generic993
+GCCGTCTTCAGTGCGCCAGCCCAAGTTGACGCTCGGCAGCAAGCTGACGTTGGTCTGCATCCAAAACGGTGCCACCGGAG
+CGAGTTCGGCCACGCTCACCCCGCCATCACGCCAGCGGCGTTGGACTTCGAGCCCCAGTTGTTGGGCAATCGGTAGGTTC
+GGGTACTCGTGCAAGCGGATCACGTGGCCGCCGGTCGCGTCACCGAGCAGCAGTTGATCCTCACCCAAAAGGCCGCCAGC
+CTGGAACGAGTTGATCGTCATCGGCCCGTCGGTCAGGGCTTGGTAGCAGACGCTGTCCAAGTCATGGGTGCTGCGGAACT
+GCTTCAGATTGATCGAGTGGGTCACAAAGCCCGGGCTGTTCATCTTCAGCCCCGGGGCGATGCGCCCCAGCATTTGGGTG
+AGTAAATCCGGCTGACTGAGCGGATTGA
+>generic994
+CGCGAAGTGCGCGTGAGGCCACGCTCTTGCTTTCCGTGGCCGAAGCATCTCGCCCCCAGGACGAGACCCTTCGCCGCCGC
+TTCGCGAAACGCCGCTGCTCAGAAACAAATTCCTTATTGTCATGTTGAGCCGCGTTTTTCGCGCAGCGGGCGAAGCATCT
+CACCTCCGAAGGGCGAGACCCTTCGCTGCGCTCAGGGTGACGGGCGTCGCGGGTTTCTGCCGGCAGGCGATGGGGCACGC
+CCCATGGGGGACTCAGGGTGACAGCCCCGCGTAGCGTGTTCTTCGTTCTCGCCTGGCGCCCCGAGCCCTAGGGGCACTCA
+GGGTGACACGCTTCGCGTGTTTCTGCCGGCAGGCATAGACGCGCCCCATGAAAGACTCAGCATGACACGCGTAGCGGGGC
+GGCCTTGAGAAAGCCGATACCGGCGAGCGCCCCGGGCTAGACGTTGACTTCGGCAACCTTCAC
+>generic995
+GCAGCCACGGCCGCCTTGATCATGAAAGCCAGCATCGTCACCTTGACGCCGGACTTCTCGTTTTCCTTGTTCAACTGGAC
+ACGGAAAGCTTCGAGGTCGGTGATGTCGGCATCGTCGTGATTGGTGACGTGCGGAATCAAGACCCAGTTGCGATGCAAAT
+TCGCGCCGCTGATTTTCTTGATGCGCGACAGATCCTTGCGTTCAATCGGGCCGAACTTGGCGAAATCGACCTTCGGCCAA
+GGCAAGAGCCCCGGGAAAGCCTCACCCGTCGCCGTGGCCGCTGGGGCGGTTGCCGGTGCCTTGGCTTTTTGGGCCGCAGT
+CTGCACAGCACCCGTCATCACGCCCTTGACAAAGCCCTGCACATCGCCCTGCGTGATCCGGCCCTTCGGCCCCGAACCAC
+CCACCTCGGCCAAGGGCACGCCCAACTCACGCGCCAACTTGCGGATGCTGGGGCTGGCGTGAGGGNGAGTAGCAACGCCC
+TCACCCCGGCCGTCTCCCCCGAGGGG
+>generic996
+CCGCACGCATCCCCATCAAGATCGTGCCAGCCCAGCCCCACGAAACGCTCAAAAAGCCCGACTGGATCCGCGTCAAAGCC
+GGCTCGCCCAGCACGCGCTTTTATGAGATCAAGCAAATCCTGCGCGAGCACAAGCTGCACAGCGTCTGCGAAGAAGCCTC
+CTGCCCGAACATCGGTGAATGCTTTGGTAGCGGCACAGCGACCTTCATGATCATGGGCGACAAGTGCACCCGGCGCTGCC
+CGTTCTGCGACGTCGGCCACGGCCGCCCGGATCCGCTGGACGCGAGCGAGCCCGAGAACCTCGCCAAAACCATCGCGGCG
+CTGAAACTCAAATACGTCGTCATCACCAGCGTGGACCGCGACGATCTGCGCGACGGCGGTGCCGGGCATTTCGTCGCCTG
+CATCCAGAAGATTCGTGAGCTCTCGCCCCAGACGCGCATCGAGATCCTGGTGCCCGACTTCCGGGGCCGCGACG
+>generic997
+GGTGAGCCTGCTCTCGCCCCGGCTGATCAAACCCTTGGCGCTGCTCTTCACGCTGGTCAATGGCTTGGCGCTCTACGCCA
+TGAACACCTACCACGTGGTGCTCGACCAAGACATGATCAGCAATGTCTGGAACACCAACACCGCTGAAGCCACGGCCCTG
+TTCCACCCCAAGTTGCTGATCTACTTCGCCTTGGCGGGCGTGCTGCCGGCGTGGTTGGCATGGCAGCTGCCCTTGGCGGC
+TGAGGGCCGTCTACGGCGCTCGGCCCACTTGGGGGTGACTTGGGTGGTGGGCGGCTTGATCGTCTTCAGCCAGTCGAGCG
+CGTGGTTGTGGATCGATCAAAACGCCAAGGTCGTGGGCGGCTTGATGCTGCCGTGGTCGTATGTCATCAATTCGACCCGG
+CATCTCTCAGAACAGCACGACGCGCACCGTCAGCTGGCGCAACTGCCACCCATTGAATGGCCAAG
+>generic998
+GCGACGACAATAATCGAGATGATGATTTTGTGATCGATCCGCGGGAAACTGCAGCGCGACAGCCAACGATCAGCAGGATG
+ATGACTCGGATGTTCAATTGCTGGTCAACCAGTGCGACGATGGCGGAAAATGATCTTAAAGCCATGTTGGATTCTGAGGG
+TGGCAGGCACCACCACACGCTCAATAATTTGAACGTCCGTGCAATTCGGGTGTCTGCGGCCGCAGCGGCACGTTTGCTCA
+GAAAATTACAGCAGCATCCAGATGTAGCGTATGCCGAACCCGATTTTACAGCGATGGCGTTGGGGACGGCCAACGATCCT
+TATTTTACCGGTGGCTCGGAATGGCATCTCACGAAATTCAAGCGCCGGCTGCTTGGGACCTGACGACTGGCTCATCCAGT
+GTTGTGGTCGGCTGTCGTTGATTCCGGAGTCAACTCGTCCCATCCGGATCTTGCTGGGAAAGTTCTCTCCACGGGCTAC
+>generic999
+GCCTCGACCTCGCCGCCCCCGAGGGCACACCGGTGGTCGCCGCCGCCGACGGCACCGTGGTCTTCGCCGGCGAGCAGCGG
+GGATATGGCCGGATCGTGCTCGTCGCTCACGCGGGCGATCTGGTGACGGTCTACGCGCACAACCGCGAGAACCAGGTGCA
+CGCCGGCGACAAGGTGGTCCGCGGCCAGCAGGTGGCCACCGTGGGCCACTCGGGGCGGGCCAGCGGTCCGCACCTGCACT
+TCGAAGTGCGCGCGGGCACGCGGCCGCAGGACCCGCTGGCGCTGCTGCGTTAGGGGCATCGCCGGTCAGATGGCGTGGAG
+GACGGGGCGGCCCGCATCCGTCCCCAGTCCCACTTCAAGCTCCCTCTATCGATACAGCGCCATCCGCTCGCTCACCCGCG
+TCAGGTACTTCTTGGTCTCGTCGGGCGCCTTCGCCTCGACCAGCGCGGCGGCCTTCACCGGCGTGAGCTTTGCCAGGTCC
+TG
+>generic1000
+CGAGGATCTTACGGCGGACCGAGAGGGCGAAGCCGTACAGACTTTCGACGTCAGGGTTGTGCGCGGGATTGGTGGCAATC
+CGGCTGGCCCAGTAGGCGGCGATCGCCTCGGGGGTATCGCCAAGGAGCAGGGGATCGGAGCACTCACGGAGGGTAAGTAC
+GCGGAACTCGCCGAGGTTGGGTAGCTTCACGCTTGCCCCCTTGCCTTGCGGAGCGCGGCCCGGGCTTGATCGAGGTAGGC
+GATCGCGGTTTGAACGATGCAATGATCTTCGGGATAATCCTGGCGGAAGCCGGCAAGCTTCATTTCGAGGTAACCAACCA
+TGGCTTGGGCGAAGTCGTGAAGCTCGGGAGCGGCGGCGATCAAATCAGCGTTGGCTTGCGCCGTTGAACTATCATTGCGA
+TCCCTCCTCGAATGGCAAGCGGCGACTTCTGAGCCATCCGCCCCCACTAATAAGAGCCCAAACAGGATCAACGGACCATG
+GGCCGGGGTGGGTTGTGTGTGGAGCGTCATAGCTGGCCGGG
diff --git a/gatb-core/test/db/reads3.fa.gz b/gatb-core/test/db/reads3.fa.gz
new file mode 100644
index 0000000..5e7fe1b
Binary files /dev/null and b/gatb-core/test/db/reads3.fa.gz differ
diff --git a/gatb-core/test/db/sample.fastq b/gatb-core/test/db/sample.fastq
new file mode 100644
index 0000000..9aaf53b
--- /dev/null
+++ b/gatb-core/test/db/sample.fastq
@@ -0,0 +1,28 @@
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+TGAANACCTCGAAACTTTTTCAGCGGNNTCNTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+0000!<:<;:@AAA=@:@@@A at AA@#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+NNNNNNNNNNNNTGAATAAATACTTTTTGCAGATGCTAAAACAATTTCCAAGTAAAAAAATTATNNNNNNNNTNGGCNAGCAGNNGTGAANNNGGNNNAT
++SRR065390.1 HWUSI-EAS687_61DAJ:8:1:1055:3384 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#####!!#####!!!##!!!##
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+CAGTNAATTTTCGTCGATTTTTCCAANNTTNCGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+0000!8;9;;BBBB@<95?;BABAA#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+NNNNNNNNNNNNAATGAGCTGAAAAATGTCAAAATTTCGAAAAATTGGCCGGAAAATGACCGAANNNNNNNNNNNNTNGNCGANNATTGANNNNGNNNGN
++SRR065390.2 HWUSI-EAS687_61DAJ:8:1:1055:17846 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!!!!!#!#!###!!#####!!!!#!!!#!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+ATATNATATCTATTAAACGTCTAGCTNNACNAANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+00//!;9<<:CCCCCCCCCCCCCBC#!!##!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ at SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+NNNNNNNNNNNNTTTTATTACTGTAGAAAATTATCTCGTTTTTTCTTTAGTTCAAACAATTTATNNNNNNNNANAATNANGAGNNACATGNNNNANNNTA
++SRR065390.3 HWUSI-EAS687_61DAJ:8:1:1056:16949 length=100
+!!!!!!!!!!!!####################################################!!!!!!!!#!###!#!###!!#####!!!!#!!!##
+ at SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+TTTGNCAATCGACTTTAGTGTTAACCGNATNTTTCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
++SRR065390.4 HWUSI-EAS687_61DAJ:8:1:1056:9989 length=100
+00//!00000BAB<AB>BBABAB<B##!##!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/gatb-core/test/db/sample.fastq.gz b/gatb-core/test/db/sample.fastq.gz
new file mode 100644
index 0000000..f2af21f
Binary files /dev/null and b/gatb-core/test/db/sample.fastq.gz differ
diff --git a/gatb-core/test/db/sample1.fa b/gatb-core/test/db/sample1.fa
new file mode 100644
index 0000000..c07ac5a
--- /dev/null
+++ b/gatb-core/test/db/sample1.fa
@@ -0,0 +1,40 @@
+>seq1 generic
+ARNDCQEGHILKMFPSTWYV
+>seq2 generic
+RNDCQEGHILKMFPSTWYVA
+>seq3 generic
+NDCQEGHILKMFPSTWYVAR
+>seq4 generic
+DCQEGHILKMFPSTWYVARN
+>seq5 generic
+CQEGHILKMFPSTWYVARND
+>seq6 generic
+QEGHILKMFPSTWYVARNDC
+>seq7 generic
+EGHILKMFPSTWYVARNDCQ
+>seq8 generic
+GHILKMFPSTWYVARNDCQE
+>seq9 generic
+HILKMFPSTWYVARNDCQEG
+>seq10 generic
+ILKMFPSTWYVARNDCQEGH
+>seq11 generic
+LKMFPSTWYVARNDCQEGHI
+>seq12 generic
+KMFPSTWYVARNDCQEGHIL
+>seq13 generic
+MFPSTWYVARNDCQEGHILK
+>seq14 generic
+FPSTWYVARNDCQEGHILKM
+>seq15 generic
+PSTWYVARNDCQEGHILKMF
+>seq16 generic
+STWYVARNDCQEGHILKMFP
+>seq17 generic
+TWYVARNDCQEGHILKMFPS
+>seq18 generic
+WYVARNDCQEGHILKMFPST
+>seq19 generic
+YVARNDCQEGHILKMFPSTW
+>seq20 generic
+VARNDCQEGHILKMFPSTWY
\ No newline at end of file
diff --git a/gatb-core/test/db/sample1.fa.gz b/gatb-core/test/db/sample1.fa.gz
new file mode 100644
index 0000000..aa52ba7
Binary files /dev/null and b/gatb-core/test/db/sample1.fa.gz differ
diff --git a/gatb-core/test/db/sample2.fa b/gatb-core/test/db/sample2.fa
new file mode 100644
index 0000000..b344b81
--- /dev/null
+++ b/gatb-core/test/db/sample2.fa
@@ -0,0 +1,20 @@
+>seq1
+>seq2
+>seq3
+>seq4
+>seq5
+>seq6
+>seq7
+>seq8
+>seq9
+>seq10
+>seq11
+>seq12
+>seq13
+>seq14
+>seq15
+>seq16
+>seq17
+>seq18
+>seq19
+>seq20
diff --git a/gatb-core/test/functional/test1/check/dump.txt b/gatb-core/test/functional/test1/check/dump.txt
new file mode 100644
index 0000000..100fa0c
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/dump.txt
@@ -0,0 +1,2 @@
+bin/dbgh5 -in $1 |  | grep -E "kmer_size|solidity_kind|abundance_min|abundance_max|bank_total_nt|seq_number|seq_size_min|seq_size_max|seq_size_mean|seq_size_deviation|kmers_nb_valid|kmers_nb_invalid|kmers_nb_distinct|kmers_nb_solid|kmers_nb_weak|nb_branching|checksum_branching" | grep -v build_kmer_size | gawk '{ print $1, $3}'
+
diff --git a/gatb-core/test/functional/test1/check/k127/SRR1785130.props b/gatb-core/test/functional/test1/check/k127/SRR1785130.props
new file mode 100644
index 0000000..38f8354
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k127/SRR1785130.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              667407846
+checksum_branching                         159b062426d7e747.be2f91b14a5f8731.fc8530d1964a7878.6ecd07d6dbedfef9
+kmer_size                                  127
+kmers_nb_distinct                          92891321
+kmers_nb_invalid                           2257104
+kmers_nb_solid                             11286842
+kmers_nb_valid                             525356770
+kmers_nb_weak                              81604479
+nb_branching                               169182
+seq_number                                 1121459
+seq_size_deviation                         187.4
+seq_size_max                               1539
+seq_size_mean                              595.1
+seq_size_min                               40
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k31/ERR039477.props b/gatb-core/test/functional/test1/check/k31/ERR039477.props
new file mode 100644
index 0000000..e2c6463
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k31/ERR039477.props
@@ -0,0 +1,17 @@
+kmer_size 31
+solidity_kind sum
+abundance_min 3
+abundance_max 2147483647
+bank_total_nt 36019596
+seq_number 390976
+seq_size_min 16
+seq_size_max 107
+seq_size_mean 92.1
+seq_size_deviation 8.3
+kmers_nb_valid 24296112
+kmers_nb_invalid 0
+kmers_nb_distinct 8040763
+kmers_nb_solid 3562288
+kmers_nb_weak 4478475
+nb_branching 103243
+checksum_branching 4cd08d34b542fdd9
diff --git a/gatb-core/test/functional/test1/check/k31/ERR039477_SRR387476.props b/gatb-core/test/functional/test1/check/k31/ERR039477_SRR387476.props
new file mode 100644
index 0000000..7a0e05e
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k31/ERR039477_SRR387476.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              526835796
+checksum_branching                         31cc9229c7cb6844
+kmer_size                                  31
+kmers_nb_distinct                          37914805
+kmers_nb_invalid                           891353
+kmers_nb_solid                             6990812
+kmers_nb_valid                             366976099
+kmers_nb_weak                              30923993
+nb_branching                               241093
+seq_number                                 5299138
+seq_size_deviation                         3.1
+seq_size_max                               107
+seq_size_mean                              99.4
+seq_size_min                               16
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k31/SRR1785130.props b/gatb-core/test/functional/test1/check/k31/SRR1785130.props
new file mode 100644
index 0000000..104fdeb
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k31/SRR1785130.props
@@ -0,0 +1,17 @@
+kmer_size 31
+solidity_kind sum
+abundance_min 3
+abundance_max 2147483647
+bank_total_nt 667407846
+seq_number 1121459
+seq_size_min 40
+seq_size_max 1539
+seq_size_mean 595.1
+seq_size_deviation 187.4
+kmers_nb_valid 632766011
+kmers_nb_invalid 998065
+kmers_nb_distinct 44310396
+kmers_nb_solid 9771769
+kmers_nb_weak 34538627
+nb_branching 347180
+checksum_branching 3c1ecb473f053b94
diff --git a/gatb-core/test/functional/test1/check/k31/SRR387476.props b/gatb-core/test/functional/test1/check/k31/SRR387476.props
new file mode 100644
index 0000000..bbf796d
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k31/SRR387476.props
@@ -0,0 +1,17 @@
+kmer_size 31
+solidity_kind sum
+abundance_min 3
+abundance_max 2147483647
+bank_total_nt 490816200
+seq_number 4908162
+seq_size_min 100
+seq_size_max 100
+seq_size_mean 100.0
+seq_size_deviation 0.0
+kmers_nb_valid 342679987
+kmers_nb_invalid 891353
+kmers_nb_distinct 33048325
+kmers_nb_solid 5775308
+kmers_nb_weak 27273017
+nb_branching 155922
+checksum_branching bdeca4009199e5ed
diff --git a/gatb-core/test/functional/test1/check/k63/ERR039477.props b/gatb-core/test/functional/test1/check/k63/ERR039477.props
new file mode 100644
index 0000000..fe4e698
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k63/ERR039477.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              36019596
+checksum_branching                         447e92640982f29c.2275c8ff07f296b9
+kmer_size                                  63
+kmers_nb_distinct                          6938293
+kmers_nb_invalid                           0
+kmers_nb_solid                             1297885
+kmers_nb_valid                             11887766
+kmers_nb_weak                              5640408
+nb_branching                               140198
+seq_number                                 390976
+seq_size_deviation                         8.3
+seq_size_max                               107
+seq_size_mean                              92.1
+seq_size_min                               16
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k63/ERR039477_SRR387476.props b/gatb-core/test/functional/test1/check/k63/ERR039477_SRR387476.props
new file mode 100644
index 0000000..adaa52d
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k63/ERR039477_SRR387476.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              526835796
+checksum_branching                         dde1d0f1c26017d8.3513d6364b08566a
+kmer_size                                  63
+kmers_nb_distinct                          40079108
+kmers_nb_invalid                           882724
+kmers_nb_solid                             6191106
+kmers_nb_valid                             197515198
+kmers_nb_weak                              33888002
+nb_branching                               141242
+seq_number                                 5299138
+seq_size_deviation                         3.1
+seq_size_max                               107
+seq_size_mean                              99.4
+seq_size_min                               16
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k63/SRR1785130.props b/gatb-core/test/functional/test1/check/k63/SRR1785130.props
new file mode 100644
index 0000000..7eee618
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k63/SRR1785130.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              667407846
+checksum_branching                         87563d60a51839a3.754caf2f483ea2f8
+kmer_size                                  63
+kmers_nb_distinct                          68602456
+kmers_nb_invalid                           1674980
+kmers_nb_solid                             10827437
+kmers_nb_valid                             596285690
+kmers_nb_weak                              57775019
+nb_branching                               250831
+seq_number                                 1121459
+seq_size_deviation                         187.4
+seq_size_max                               1539
+seq_size_mean                              595.1
+seq_size_min                               40
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k63/SRR387476.props b/gatb-core/test/functional/test1/check/k63/SRR387476.props
new file mode 100644
index 0000000..4c412db
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k63/SRR387476.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              490816200
+checksum_branching                         d07e8c954ec74e35.46026d3fb4491616
+kmer_size                                  63
+kmers_nb_distinct                          35206101
+kmers_nb_invalid                           882724
+kmers_nb_solid                             5557156
+kmers_nb_valid                             185627432
+kmers_nb_weak                              29648945
+nb_branching                               61673
+seq_number                                 4908162
+seq_size_deviation                         0.0
+seq_size_max                               100
+seq_size_mean                              100.0
+seq_size_min                               100
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k95/ERR039477.props b/gatb-core/test/functional/test1/check/k95/ERR039477.props
new file mode 100644
index 0000000..343bddc
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k95/ERR039477.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              36019596
+checksum_branching                         9c8ab7564a49532a.7fc41de146d289eb.425786df4deb045c
+kmer_size                                  95
+kmers_nb_distinct                          478969
+kmers_nb_invalid                           0
+kmers_nb_solid                             1141
+kmers_nb_valid                             499208
+kmers_nb_weak                              477828
+nb_branching                               948
+seq_number                                 390976
+seq_size_deviation                         8.3
+seq_size_max                               107
+seq_size_mean                              92.1
+seq_size_min                               16
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k95/ERR039477_SRR387476.props b/gatb-core/test/functional/test1/check/k95/ERR039477_SRR387476.props
new file mode 100644
index 0000000..3664133
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k95/ERR039477_SRR387476.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              526835796
+checksum_branching                         3e26e821af168b15.d57cb31040898060.53e1940c641efa1e
+kmer_size                                  95
+kmers_nb_distinct                          12382309
+kmers_nb_invalid                           529247
+kmers_nb_solid                             3094003
+kmers_nb_valid                             29418933
+kmers_nb_weak                              9288306
+nb_branching                               685682
+seq_number                                 5299138
+seq_size_deviation                         3.1
+seq_size_max                               107
+seq_size_mean                              99.4
+seq_size_min                               16
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k95/SRR1785130.props b/gatb-core/test/functional/test1/check/k95/SRR1785130.props
new file mode 100644
index 0000000..3e485c8
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k95/SRR1785130.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              667407846
+checksum_branching                         48fcbc0a88bf53e3.3a761e303f92a08b.6538891a7033b0ad
+kmer_size                                  95
+kmers_nb_distinct                          83455772
+kmers_nb_invalid                           2048854
+kmers_nb_solid                             11211569
+kmers_nb_valid                             560513087
+kmers_nb_weak                              72244203
+nb_branching                               199818
+seq_number                                 1121459
+seq_size_deviation                         187.4
+seq_size_max                               1539
+seq_size_mean                              595.1
+seq_size_min                               40
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/check/k95/SRR387476.props b/gatb-core/test/functional/test1/check/k95/SRR387476.props
new file mode 100644
index 0000000..56ae6a9
--- /dev/null
+++ b/gatb-core/test/functional/test1/check/k95/SRR387476.props
@@ -0,0 +1,17 @@
+abundance_max                              2147483647
+abundance_min                              3
+bank_total_nt                              490816200
+checksum_branching                         91bff9b3a42da848.31d1c197db45fd1c.a5a80c50501a2b69
+kmer_size                                  95
+kmers_nb_distinct                          12032543
+kmers_nb_invalid                           529247
+kmers_nb_solid                             3070469
+kmers_nb_valid                             28919725
+kmers_nb_weak                              8962074
+nb_branching                               681571
+seq_number                                 4908162
+seq_size_deviation                         0.0
+seq_size_max                               100
+seq_size_mean                              100.0
+seq_size_min                               100
+solidity_kind                              sum
diff --git a/gatb-core/test/functional/test1/run.sh b/gatb-core/test/functional/test1/run.sh
new file mode 100755
index 0000000..03d4e9f
--- /dev/null
+++ b/gatb-core/test/functional/test1/run.sh
@@ -0,0 +1,168 @@
+#! /bin/bash
+
+################################################################################
+# ARG 1 : login on gforge INRIA
+# ARG 2 : email address to send a report 
+# ARG 3 : dbgh5 binary; if not set, we do a git clone and build the binary 
+################################################################################
+
+set -e
+
+if [ -z "$1" ]; 
+then
+    export set TEST_USER=$USER
+else
+    export set TEST_USER=$1
+fi  
+
+if [ -z "$2" ]; 
+then
+    export set TEST_MAIL=$TEST_USER at irisa.fr
+else
+    export set TEST_MAIL=$2
+fi  
+
+if [ -z "$3" ]; 
+then
+    export set TEST_BINARY=bin/dbgh5
+    export set TEST_GIT_CLONE=1
+else
+    export set TEST_BINARY=$3
+    export set TEST_GIT_CLONE=0
+fi  
+
+# we get the check directory
+TEST_CHECK_TMP=`readlink -f $0`
+export set TEST_CHECK=`dirname $TEST_CHECK_TMP`/check
+echo $TEST_CHECK
+
+################################################################################
+# we dump the configuration
+################################################################################
+
+echo "----------------------------------------------------------------------"
+echo "                  NON REGRESSION TEST FOR dbgh5                       "
+echo "----------------------------------------------------------------------"
+
+echo "TEST_USER      : " $TEST_USER
+echo "TEST_MAIL      : " $TEST_MAIL
+echo "TEST_BINARY    : " $TEST_BINARY
+echo "TEST_GIT_CLONE : " $TEST_GIT_CLONE
+echo "TEST_CHECK     : " $TEST_CHECK
+echo ""
+
+
+################################################################################
+# we may have to clone the git directory if no dbgh5 is provided
+################################################################################
+
+if [ $TEST_GIT_CLONE -eq 1 ]; then
+    ################################################################################
+    # we clone the git repository
+    ################################################################################
+    git clone git+ssh://$TEST_USER@scm.gforge.inria.fr//gitroot/gatb-core/gatb-core.git
+
+    ################################################################################
+    # we build the project
+    ################################################################################
+    cd gatb-core/gatb-core
+
+    # we build the project
+    mkdir build; cd build; cmake ..; make 
+fi
+
+
+################################################################################
+# we download some banks
+################################################################################
+wget "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR039/ERR039477/ERR039477.fastq.gz"
+wget "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR387/SRR387476/SRR387476.fastq.gz"
+wget "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR178/000/SRR1785130/SRR1785130.fastq.gz"
+
+
+################################################################################
+# we define a function that runs dbgh5 with different sets of parameters, and with a check file
+################################################################################
+launch () {
+    echo "--------------------------------------------------------- $1  $3  ---------------------------------------------------------"
+    
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2
+    
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom basic     -debloom original   -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom cache     -debloom original   -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom neighbor  -debloom original   -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom basic     -debloom cascading  -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom cache     -debloom cascading  -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom neighbor  -debloom cascading  -debloom-impl basic
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom neighbor  -debloom original   -debloom-impl minimizer
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -bloom neighbor  -debloom cascading  -debloom-impl minimizer
+    
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -nb-cores 1
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -nb-cores 2
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -nb-cores 4
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -nb-cores 8
+
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -nb-cores 1
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -nb-cores 2
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -nb-cores 4
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -nb-cores 8
+
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -max-disk 2000 
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -max-disk 2000 -nb-cores 1
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -max-disk 2000 -nb-cores 2
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -max-disk 2000 -nb-cores 4
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -max-memory 1000 -max-disk 2000 -nb-cores 8
+
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-size 6
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-size 7
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-size 8
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-size 9
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-size 10
+
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-type 0 
+    $TEST_BINARY  -kmer-size $3  -in $1 -check $2 -minimizer-type 1 
+}
+
+
+
+################################################################################
+# we run the tests
+################################################################################
+
+launch ./ERR039477.fastq.gz   $TEST_CHECK/k31/ERR039477.props     31
+launch ./ERR039477.fastq.gz   $TEST_CHECK/k63/ERR039477.props     63
+launch ./ERR039477.fastq.gz   $TEST_CHECK/k95/ERR039477.props     95
+
+launch ./SRR387476.fastq.gz   $TEST_CHECK/k31/SRR387476.props     31
+launch ./SRR387476.fastq.gz   $TEST_CHECK/k63/SRR387476.props     63
+launch ./SRR387476.fastq.gz   $TEST_CHECK/k95/SRR387476.props     95
+
+launch ./SRR1785130.fastq.gz  $TEST_CHECK/k31/SRR1785130.props    31
+launch ./SRR1785130.fastq.gz  $TEST_CHECK/k63/SRR1785130.props    63
+launch ./SRR1785130.fastq.gz  $TEST_CHECK/k95/SRR1785130.props    95
+launch ./SRR1785130.fastq.gz  $TEST_CHECK/k127/SRR1785130.props  127
+
+launch ./ERR039477.fastq.gz,./SRR387476.fastq.gz   $TEST_CHECK/k31/ERR039477_SRR387476.props     31
+launch ./ERR039477.fastq.gz,./SRR387476.fastq.gz   $TEST_CHECK/k63/ERR039477_SRR387476.props     63
+launch ./ERR039477.fastq.gz,./SRR387476.fastq.gz   $TEST_CHECK/k95/ERR039477_SRR387476.props     95
+
+################################################################################
+# clean up
+################################################################################
+
+if [ $TEST_GIT_CLONE -eq 1 ]; then
+    cd ../../..
+    \rm -rf gatb-core
+fi
+
+if [ $? -eq 0 ]; then
+
+   echo "TEST OK"
+
+   echo $0 | mail -s "[gatb] TEST OK" $TEST_MAIL
+
+else
+   echo "TEST KO"
+   echo $0 | mail -s "[gatb] TEST KO" $TEST_MAIL
+fi
\ No newline at end of file
diff --git a/gatb-core/test/jenkins/finalize-release-debian.sh b/gatb-core/test/jenkins/finalize-release-debian.sh
new file mode 100755
index 0000000..7d3d40c
--- /dev/null
+++ b/gatb-core/test/jenkins/finalize-release-debian.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+set +xv
+echo "
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+--------------------------
+Jenkins build parameters
+--------------------------
+BRANCH_TO_BUILD   : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD  : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE     : ${TEST_VARIABLE}
+"
+
+set -xv
+
+################################################################
+#       CHECKOUT $BRANCH_TO_BUILD FROM SCRATCH                 #
+################################################################
+
+gcc --version
+g++ --version
+
+[ `gcc -dumpversion` = 4.7 ] && { echo "GCC 4.7"; } || { echo "GCC version is not 4.7, we exit"; exit 1; }
+
+JENKINS_TASK=finalize-release-debian
+ROOT_DIR=/builds/workspace/$JENKINS_TASK/
+
+rm -rf $ROOT_DIR
+mkdir -p $ROOT_DIR
+
+cd $ROOT_DIR
+git clone git+ssh://${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr/gitroot/gatb-core/gatb-core.git 
+cd gatb-core
+git checkout $BRANCH_TO_BUILD
+cd gatb-core   # this level should be removed soon
+
+################################################################
+#                       MAKE DELIVERY                          #
+################################################################
+
+MAJOR="`echo $RELEASE_TO_BUILD |cut -d. -f1`"
+MINOR="`echo $RELEASE_TO_BUILD |cut -d. -f2`"
+PATCH="`echo $RELEASE_TO_BUILD |cut -d. -f3`"
+
+/bin/bash -xv ./scripts/make_official_release.sh -s -M $MAJOR -m $MINOR -p $PATCH -c delivery
diff --git a/gatb-core/test/jenkins/finalize-release-macos.sh b/gatb-core/test/jenkins/finalize-release-macos.sh
new file mode 100755
index 0000000..3a5dfba
--- /dev/null
+++ b/gatb-core/test/jenkins/finalize-release-macos.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+set +xv
+echo "
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+--------------------------
+ Jenkins build parameters
+ --------------------------
+ BRANCH_TO_BUILD   : ${BRANCH_TO_BUILD}
+ RELEASE_TO_BUILD  : ${RELEASE_TO_BUILD}
+ INRIA_FORGE_LOGIN : ${INRIA_FORGE_LOGIN}
+ TEST_VARIABLE     : ${TEST_VARIABLE}
+ "
+
+ set -xv
+
+################################################################
+#       CHECKOUT $BRANCH_TO_BUILD FROM SCRATCH                 #
+################################################################
+
+gcc --version
+g++ --version
+sw_vers -productVersion
+
+JENKINS_TASK=finalize-release-macos
+ROOT_DIR=/builds/workspace/$JENKINS_TASK/
+
+rm -rf $ROOT_DIR
+mkdir -p $ROOT_DIR
+
+cd $ROOT_DIR
+git clone git+ssh://${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr/gitroot/gatb-core/gatb-core.git 
+cd gatb-core
+git checkout $BRANCH_TO_BUILD
+cd gatb-core   # this level should be removed soon
+
+################################################################
+#                       MAKE DELIVERY                          #
+################################################################
+
+MAJOR="`echo $RELEASE_TO_BUILD |cut -d. -f1`"
+MINOR="`echo $RELEASE_TO_BUILD |cut -d. -f2`"
+PATCH="`echo $RELEASE_TO_BUILD |cut -d. -f3`"
+
+#----------
+# upload below only perform tasks 1, 2, and 5 (see make_official_release.sh -h):
+#     1 . compile the library on the hosted system using curent source code
+#     2 . package library within a tar.gz file
+#    (3). tag Inria Forge using release number
+#    (4). create a corresponding Github release
+#     5 . upload the library binary on Github
+
+/bin/bash -xv ./scripts/make_official_release.sh -s -M $MAJOR -m $MINOR -p $PATCH -c upload
+
diff --git a/gatb-core/test/jenkins/leon/README.md b/gatb-core/test/jenkins/leon/README.md
new file mode 100644
index 0000000..583a28f
--- /dev/null
+++ b/gatb-core/test/jenkins/leon/README.md
@@ -0,0 +1,62 @@
+| **Functional tests** |
+|----------------------|
+| [![Build Status](https://ci.inria.fr/gatb-core/view/Leon/job/tool-leon-functional-tests/badge/icon)](https://ci.inria.fr/gatb-core/view/Leon/job/tool-leon-functional-tests/) |
+
+# Introduction
+
+This directory contains reference material used to test Leon compressor
+by means of Jenkins tasks.
+
+It is intended to be used by Genscale team.
+
+# Scripts
+
+Tests are actually run by 'tool-leon-functional-tests' Jenkins task
+from GATB project on INRIA CI platform; please refer to:
+[https://ci.inria.fr/gatb-core/view/Leon/job/tool-leon-functional-tests/](https://ci.inria.fr/gatb-core/view/Leon/job/tool-leon-functional-tests/)
+
+this task runs in the row the following scripts:
+
+* first: ```tool-leon-functional-tests.sh``` to compile GATB-Core binaries
+* then: ```tool-leon-functional-tests-test.sh``` to run Leon on 15 SRA files
+    totalizing more than 50 Gb of gzipped reads data.
+
+# Retrieving data files
+
+NCBI SRA files have to be retrieved from Genocluster computing nodes 
+using the following script: ```download.sh```. That script can be used from 
+a terminal session or, even better, using GoDocker.
+ 
+Then, files integrity can be checked using ```test_integrity.sh``` script.
+
+# Data files
+
+Files used to test Leon are as follows:
+
+```Leon original publication, G. Benoit et al., 2015```:
+[https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0709-7](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0709-7)
+cf. Table ST1, supplementary file:
+
+* SRR065390: C. elegans WGS Illumina
+* SRR959239: E. coli WGS Illumina
+* SRR1519083: Metagenome Illumina
+* SRR1870605: E. coli WGS Illumina Miseq
+* SRR445718: Human RNA-seq Illumina
+* SRR857303: E. coli WGS Ion Torrent
+
+```Evaluation of Leon by Y. Zhang et al, 2017```:
+[http://csse.szu.edu.cn/staff/zhuzx/LWFQZip2/SupplementaryFile.pdf](http://csse.szu.edu.cn/staff/zhuzx/LWFQZip2/SupplementaryFile.pdf)
+Cf. table S10:
+
+* SRR2916693: 454 GS
+* SRR2994368: Illumina Miseq
+* SRR3211986: Pacbio RS
+* ERR739513: MiniION
+* SRR3190692: Illumina Miseq
+* ERR385912: Illumina Hiseq 2000
+* ERR386131: Ion Torrent PGM
+* SRR034509: Illumina Analyzer II
+* ERR174310: Illumina Hiseq 2000
+
+
+
diff --git a/gatb-core/test/jenkins/leon/download.sh b/gatb-core/test/jenkins/leon/download.sh
new file mode 100755
index 0000000..38d6f61
--- /dev/null
+++ b/gatb-core/test/jenkins/leon/download.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+# This script relies on the use of NCBI SRA Tools to fetch FastQ files from 
+# SRA entry IDs.
+#
+# To install SRA Tools on Genocluster, simply use conda as follows:
+#   . /local/env/envconda.sh
+#   conda config --add channels bioconda
+#   conda create -p ~/sra sra-tools=2.8.1
+#
+# The above procedure has to de bone one times.
+# Then, to activate the conda 'sra' tools, simply use:
+#   source activate ~/sra
+#
+# Patrick G. Durand, May 2017 
+#
+
+# === CONDA environment: direct use on Genocluster ===
+#. /local/env/envconda.sh
+#source activate ~/sra
+# === CONDA environment: use from GoDocker/Genocluster ===
+. /softs/local/env/envconda.sh
+source activate $GODOCKER_HOME/sra
+
+# === DATA directory ===
+cd /omaha-beach/pdurand/sra-for-leon
+
+SRA_TOOL_PATH=`which fastq-dump`
+if [ -z "$SRA_TOOL_PATH" ] ; then
+  echo "NCBI SRA Tools not found. Please activate Conda sratools..."
+  echo " use: source activate ~/sra"
+  exit 1
+fi
+
+# This list taken from http://csse.szu.edu.cn/staff/zhuzx/LWFQZip2/SupplementaryFile.pdf
+# Table S10.
+# array_ok: SRA files on which Leon is ok
+# array_nok: SRA files on which Leon is not ok 
+#   (according to article authors: lose fidelity after decompression)
+array_ok=(SRR2916693 SRR2994368 SRR3190692 ERR385912 SRR034509 ERR174310)
+# ok files should include: ERR194147, but failed to download from NCBI after several trials!
+array_nok=(SRR3211986 ERR739513 ERR386131)
+
+# data set from Leon publication
+array_leon=(SRR065390 SRR959239 SRR857303 SRR1870605 SRR445718 SRR1519083)
+
+array=("${array_ok[@]}" "${array_nok[@]}" "${array_leon[@]}")
+
+echo "Nb. SRA files to download: ${#array[*]}"
+
+echo "SRA are:"
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  if [ -e $srafile ]; then
+    echo "   ${srafile}: exists"
+  else
+    echo "   ${srafile}: will be downloaded"
+  fi  
+done
+
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  if [ ! -e $srafile ]; then
+    echo "> downloading ${item} to ${srafile} ..."
+    echo "  time fastq-dump --gzip $item"
+    time fastq-dump --gzip $item
+  fi
+done
+
+
diff --git a/gatb-core/test/jenkins/leon/test_integrity.sh b/gatb-core/test/jenkins/leon/test_integrity.sh
new file mode 100755
index 0000000..ae9758a
--- /dev/null
+++ b/gatb-core/test/jenkins/leon/test_integrity.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# This script tests integrity of gzipped files.
+# It can be used to test SRA files retrieved from NCBI
+# usind download.sh script.
+#
+# Patrick G. Durand, May 2017 
+#
+
+i=0
+while read line
+do
+    array[ $i ]="$line"
+    (( i++ ))
+done < <(ls -1 *.fastq.gz)
+
+echo "Nb. SRA files to test: ${#array[*]}"
+
+echo "SRA are:"
+for item in ${array[*]}
+do
+  echo "> Checking ${item} ..."
+  FILESIZE=$(stat -c%s "${item}")
+  FILESIZE=$(( FILESIZE/(1024*1024) ))
+  echo "  size= $FILESIZE Mb."
+  gunzip -t ${item}
+  if [ $? -ne 0 ]; then
+    echo "   ${item}: invalid"
+  fi
+done
+
diff --git a/gatb-core/test/jenkins/leon/tool-leon-functional-tests-compile.sh b/gatb-core/test/jenkins/leon/tool-leon-functional-tests-compile.sh
new file mode 100755
index 0000000..64ef92d
--- /dev/null
+++ b/gatb-core/test/jenkins/leon/tool-leon-functional-tests-compile.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# !!! This script has only been tested using Koriscale CI slave.
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+JOB_NAME             : ${JOB_NAME}
+
+"
+
+#---------------------------------------------------------------
+# quick look at resources
+free -h
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+if $DO_NOT_COMPILE; then
+  echo "SKIP COMPILE PHASE"
+  exit 0
+fi
+
+# Make sure, we use the appropriate cmake on Koriscale
+export PATH=/home/ci-gatb/cmake-3.7.2-Linux-x86_64/bin:$PATH
+
+# dump compiler information
+gcc --version
+g++ --version
+gcc -dumpversion
+cmake --version
+
+JENKINS_TASK=${JOB_NAME}
+GIT_DIR=/home/ci-gatb/workspace/$JENKINS_TASK/gatb-core
+BUILD_DIR=/home/ci-gatb/scratchdir/$JENKINS_TASK/gatb-core/build
+
+mkdir -p $BUILD_DIR
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+# compile in default mode: Release (otherwise Leon compressor will
+# be very, very slow using Debug mode)
+cmake -Wno-dev  \
+      -DCPPUNIT_INCLUDE_DIR=/usr/include/cppunit/ \
+      -DCPPUNIT_LIBRARY=/usr/lib64/libcppunit.so \
+      $GIT_DIR
+
+# we compile all GATB-Core: library, tools (including leon) and snippets
+# (snippets bank26 to bank28 are used to test leon)
+make -j8
+make -j8 examples
+
diff --git a/gatb-core/test/jenkins/leon/tool-leon-functional-tests-test.sh b/gatb-core/test/jenkins/leon/tool-leon-functional-tests-test.sh
new file mode 100755
index 0000000..e88f9d3
--- /dev/null
+++ b/gatb-core/test/jenkins/leon/tool-leon-functional-tests-test.sh
@@ -0,0 +1,266 @@
+#!/bin/bash
+
+# This script compares original SRA FastQ files with Leon compressed ones.
+#
+# Patrick G. Durand, May 2017 
+#
+
+# !!! This script only works with bash --version 4+ on Linux systems.
+#     (it uses hastable, stat -c, amon others)
+# !!! This script has only been tested using Koriscale CI slave.
+
+# ==================================================================
+# Where are the refaerence SRA files?
+DATA_DIR=/mnt/windows/ci-gatb/data/leon
+# Where are the binaries: leon and bank snippets
+JENKINS_TASK=${JOB_NAME}
+BIN_DIR=/home/ci-gatb/scratchdir/$JENKINS_TASK/gatb-core/build/bin
+# How many cores to use? 
+CORES=8
+# Do we have to use leon in verbose mode?
+VERBOSE=0
+# default k-mer size
+KMER_SIZE=31
+# Bank snippets used to test Leon generated data files
+BANK_SNIPPET_1=bank25
+BANK_SNIPPET_2=bank26
+BANK_SNIPPET_3=bank28
+
+
+# ==================================================================
+# == Control values
+# 5 data fields: nb. letters, nb. sequences, max seq size, 
+#                min seq size,  nb. sequences < k-mer size
+ERR385912_valids=(139175685 2728935 51 51 0)
+SRR2916693_valids=(204077299 405343 1201 67 0)
+SRR959239_valids=(526537536 5372832 98 98 0)
+ERR386131_valids=(544138147 3601856 371 8 14165)
+ERR739513_valids=(450281548 122240 246140 5 1235)
+SRR1870605_valids=(543194861 1119218 502 70 0)
+SRR857303_valids=(505750634 2581532 368 6 32095)
+SRR3211986_valids=(917247967 163477 62746 2 1762)
+SRR2994368_valids=(2258185851 5054526 502 70 0)
+SRR034509_valids=(2091430836 10353618 202 202 0)
+SRR445718_valids=(3294366500 32943665 100 100 0)
+SRR3190692_valids=(1300585440 9314994 602 70 0)
+SRR065390_valids=(2466741904 67617092 100 100 0)
+SRR1519083_valids=(1734577366 59698462 101 101 0)
+ERR174310_valids=(3276346670 207579467 202 202 0)
+
+declare -A control_map
+control_map[ERR385912]=${ERR385912_valids[*]}
+control_map[SRR2916693]=${SRR2916693_valids[*]}
+control_map[SRR959239]=${SRR959239_valids[*]}
+control_map[ERR386131]=${ERR386131_valids[*]}
+control_map[ERR739513]=${ERR739513_valids[*]}
+control_map[SRR1870605]=${SRR1870605_valids[*]}
+control_map[SRR857303]=${SRR857303_valids[*]}
+control_map[SRR3211986]=${SRR3211986_valids[*]}
+control_map[SRR2994368]=${SRR2994368_valids[*]}
+control_map[SRR034509]=${SRR034509_valids[*]}
+control_map[SRR445718]=${SRR445718_valids[*]}
+control_map[SRR3190692]=${SRR3190692_valids[*]}
+control_map[SRR065390]=${SRR065390_valids[*]}
+control_map[SRR1519083]=${SRR1519083_valids[*]}
+control_map[ERR174310]=${ERR174310_valids[*]}
+
+# ==================================================================
+# == Usefull variables
+# store size of SRA reference files (.fastq.gz)
+declare -A ref_file_size_map
+# use to check whether or not some tests failed
+#  (0: ok ; !=0: not ok)
+TEST_RESULT=0
+# set a dedicated time format
+TIMEFORMAT='    Time - real:%3lR | user:%3lU | sys:%3lS'
+
+# ==================================================================
+# == Usefull methods
+checkDataFile(){ 
+  # takes two argument: 
+  #  $1 : the file base name without its extension
+  #  $2 : the file name to test
+  item=$1
+  srafile=$2
+  echo "    $BIN_DIR/$BANK_SNIPPET_3 -in ${srafile} -kmer-size $KMER_SIZE"
+  RESULT=`time $BIN_DIR/$BANK_SNIPPET_3 -in ${srafile} -kmer-size $KMER_SIZE`
+  echo "    answer : $RESULT"
+  echo "    control: ${control_map[${item}]}"
+  if [ -z "${control_map[${item}]}" ]; then
+      echo "      ERROR: no control value"
+      (( TEST_RESULT++ ))
+  else
+    i=0
+    RESULT_ARRAY=($RESULT)
+    for VALUE in ${control_map[${item}]}
+    do
+      if (( VALUE != RESULT_ARRAY[i] )); then
+        echo "      ERROR on value $i: $VALUE != ${RESULT_ARRAY[$i]}"
+        (( TEST_RESULT++ ))
+      fi
+      (( i++ ))
+    done
+  fi
+}
+
+# ==================================================================
+# == Start processing
+
+echo "
+-----------------------------------------
+ Data information 
+-----------------------------------------
+slave : $NODE_NAME
+dir   : $DATA_DIR"
+
+cd $DATA_DIR
+
+# dump the full list of '*.fastq.gz' files available 
+# in working directory
+echo "> SRA FastQ files available in ${DATA_DIR}:"
+i=0
+j=0
+while read line
+do
+    FILESIZE=$(stat -c%s "${line}")
+    FILESIZE=$(( FILESIZE/(1024*1024) ))  
+    echo "  ${line}: $FILESIZE Mb"
+    fname=`echo $line | cut -d'.' -f 1`
+    ref_file_size_map[$fname]=$FILESIZE
+    if (( FILESIZE <= MAX_FILE_SIZE )); then
+      array[ $i ]="${fname}"
+      (( i++ ))
+    fi
+    allfiles[ $j ]="$fname"        
+    (( j++ ))
+done < <(ls -Sr -1 *.fastq.gz)
+
+# Filter file by size retaining only those < MAX_FILE_SIZE
+echo "> Total SRA files: ${#allfiles[*]}"
+echo "> SRA files to handle now: ${#array[*]} (size <= $MAX_FILE_SIZE Mb)"
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  echo "  ${srafile}: ${ref_file_size_map[$item]} Mb"
+done
+
+echo "-----------------------"
+echo "Running content test..."
+echo "-----------------------"
+date
+
+# Check file content with GATB Bank API
+echo "> SRA file content (using $BANK_SNIPPET_3 snippet):"
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  echo "  ${srafile}: ${ref_file_size_map[$item]} Mb"
+  checkDataFile $item $srafile
+done
+
+if (( TEST_RESULT != 0 )); then
+  echo "FAILURE: check $TEST_RESULT error(s), above"
+  exit 1
+fi
+
+echo "----------------------"
+echo "Running compression..."
+echo "----------------------"
+date
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  echo "> compress ${srafile}: ${ref_file_size_map[$item]} Mb"
+  echo "  leon -file ${srafile} -c -lossless -nb-cores $CORES -verbose $VERBOSE -kmer-size $KMER_SIZE"
+  time $BIN_DIR/leon -file ${srafile} -c -lossless -nb-cores $CORES -verbose $VERBOSE -kmer-size $KMER_SIZE
+  leonfile="${item}.fastq.leon"
+  FILESIZE=$(stat -c%s "${leonfile}")
+  FILESIZE=$(( FILESIZE/(1024*1024) ))  
+  echo "  ${leonfile}: $FILESIZE Mb"
+done
+
+echo "-----------------------------------"
+echo "Running compression content test..."
+echo "-----------------------------------"
+date
+TEST_RESULT=0
+echo "> LEON file content (using $BANK_SNIPPET_3 snippet):"
+for item in ${array[*]}
+do
+  leonfile="${item}.fastq.leon"
+  echo "  ${leonfile}:"
+  checkDataFile $item $leonfile
+done
+
+if (( TEST_RESULT != 0 )); then
+  echo "FAILURE: check $TEST_RESULT error(s), above"
+  exit 1
+fi
+
+echo "------------------------"
+echo "Running decompression..."
+echo "------------------------"
+date
+for item in ${array[*]}
+do
+  leonfile="${item}.fastq.leon"
+  echo "> decompress ${leonfile}"
+  echo "  leon -file ${leonfile} -d -nb-cores $CORES -verbose $VERBOSE"
+  time $BIN_DIR/leon -file ${leonfile} -d -nb-cores $CORES -verbose $VERBOSE
+done
+
+echo "------------------------------------"
+echo "Running decompressed content test..."
+echo "------------------------------------"
+date
+TEST_RESULT=0
+echo "> FastQ/Leon file content (using $BANK_SNIPPET_3 snippet):"
+for item in ${array[*]}
+do
+  leonfile="${item}.fastq.d"
+  echo "  ${leonfile}:"
+  checkDataFile $item $leonfile
+done
+
+if (( TEST_RESULT != 0 )); then
+  echo "FAILURE: check $TEST_RESULT error(s), above"
+  exit 1
+fi
+
+echo "----------------------------------------"
+echo "Running comparison '.gz' vs. '.leon'..."
+echo "----------------------------------------"
+date
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  leonfile="${item}.fastq.leon"
+  echo "> compare ${srafile} vs ${leonfile} ..."
+  echo "  $BANK_SNIPPET_1 ${srafile} ${leonfile}"
+  time $BIN_DIR/$BANK_SNIPPET_1 ${srafile} ${leonfile}
+done
+
+echo "------------------------------------"
+echo "Running comparison '.gz' vs. '.d'..."
+echo "------------------------------------"
+date
+for item in ${array[*]}
+do
+  srafile="${item}.fastq.gz"
+  leonfile="${item}.fastq.d"
+  echo "> compare ${srafile} vs ${leonfile} ..."
+  echo "  $BANK_SNIPPET_1 ${srafile} ${leonfile}"
+  time $BIN_DIR/$BANK_SNIPPET_1 ${srafile} ${leonfile}
+done
+
+echo "-----------"
+echo "Cleaning..."
+echo "-----------"
+for item in ${array[*]}
+do
+  rm -f ${item}.fastq.d
+  rm -f ${item}.fastq.h5
+  rm -f ${item}.fastq.leon
+done
+rm -rf trashme*
+
diff --git a/gatb-core/test/jenkins/publish-doc-api.sh b/gatb-core/test/jenkins/publish-doc-api.sh
new file mode 100755
index 0000000..490468a
--- /dev/null
+++ b/gatb-core/test/jenkins/publish-doc-api.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+JOB_NAME             : ${JOB_NAME}
+
+
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; }
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+#df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+JENKINS_TASK=${JOB_NAME}
+
+MACHINE="`hostname`"
+case $MACHINE in
+koriscale*)
+  echo $MACHINE
+  GIT_DIR=/home/ci-gatb/workspace/$JENKINS_TASK/gatb-core
+  BUILD_DIR=/home/ci-gatb/scratchdir/$JENKINS_TASK/gatb-core/build
+  ;;
+gatb-core-ubuntu16-docker)
+  echo $MACHINE
+  GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+  BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+  ;;
+*)
+  echo Erreur
+  exit 1
+  ;;
+esac
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD} -DJENKINS_GFORGE_USER=${INRIA_FORGE_LOGIN} $GIT_DIR
+
+#---------------------------------------------------------------
+make -j 2 doc || error_code
+make deploy-doc || error_code
+
+################################################################
+#                         END                                  #
+################################################################
diff --git a/gatb-core/test/jenkins/test-bin-debian7-64bits-gcc-4.7.sh b/gatb-core/test/jenkins/test-bin-debian7-64bits-gcc-4.7.sh
new file mode 100755
index 0000000..33a6298
--- /dev/null
+++ b/gatb-core/test/jenkins/test-bin-debian7-64bits-gcc-4.7.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+VERSION_TO_TEST      : ${VERSION_TO_TEST}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+
+
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; }
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       DIRECTORIES                            #
+################################################################
+
+JENKINS_TASK=test-bin-debian7-64bits-gcc-4.7
+BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+################################################################
+#                       UNPACKING                              #
+################################################################
+# Upload bin bundle to the forge; source bundle is made by OSX Jenkins task
+if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then
+   echo "Getting a binary archive... "
+   scp ${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr:/home/groups/gatb-core/htdocs/versions/bin/gatb-core-${VERSION_TO_TEST}-bin-Linux.tar.gz .
+fi
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+gcc --version
+g++ --version
+
+[ `gcc -dumpversion` = 4.7 ] && { echo "GCC 4.7"; } || { echo "GCC version is not 4.7, we exit"; exit 1; }
+
+gunzip gatb-core-${VERSION_TO_TEST}-bin-Linux.tar.gz
+tar -xf gatb-core-${VERSION_TO_TEST}-bin-Linux.tar
+cd gatb-core-${VERSION_TO_TEST}-bin-Linux
+
+code_snippets=($(find ./examples -name "*1.cpp"))
+for code_snippet in ${code_snippets[*]}
+do
+	prg_name=`echo $code_snippet | cut -d'/' -f4 | cut -d'.' -f1`
+    g++ $code_snippet -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -o $prg_name
+done
+
+# do some cleanup to save disk space
+cd ..
+rm -rf gatb-core-${VERSION_TO_TEST}-bin-Linux*
+
diff --git a/gatb-core/test/jenkins/test-bin-macos-10.9.5-gcc-4.2.1.sh b/gatb-core/test/jenkins/test-bin-macos-10.9.5-gcc-4.2.1.sh
new file mode 100755
index 0000000..a7d2b49
--- /dev/null
+++ b/gatb-core/test/jenkins/test-bin-macos-10.9.5-gcc-4.2.1.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.·
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+echo "
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+--------------------------
+Jenkins build parameters
+--------------------------
+VERSION_TO_TEST      : ${VERSION_TO_TEST}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "DEBUG mode, the script will NOT stop..." ; }
+set -xv
+
+# quick look at resources
+#-----------------------------------------------
+sw_vers -productVersion
+#-----------------------------------------------
+system_profiler SPSoftwareDataType
+#-----------------------------------------------
+lstopo
+#-----------------------------------------------
+top -l 1|head -15
+#-----------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+JENKINS_TASK=test-bin-macos-10.9.5-gcc-4.2.1
+BUILD_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+################################################################
+#                       UNPACKING                              #
+################################################################
+# Upload bin bundle to the forge; source bundle is made by OSX Jenkins task
+if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then
+   echo "Getting a binary archive... "
+   scp ${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr:/home/groups/gatb-core/htdocs/versions/bin/gatb-core-${VERSION_TO_TEST}-bin-Darwin.tar.gz .
+fi
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+gcc --version
+g++ --version
+
+[ `gcc -dumpversion` = 4.2.1 ] && { echo "GCC 4.2.1"; } || { echo "GCC version is not 4.2.1, we exit"; exit 1; }
+
+gunzip gatb-core-${VERSION_TO_TEST}-bin-Darwin.tar.gz
+tar -xf gatb-core-${VERSION_TO_TEST}-bin-Darwin.tar
+cd gatb-core-${VERSION_TO_TEST}-bin-Darwin
+
+code_snippets=($(find ./examples -name "*1.cpp"))
+for code_snippet in ${code_snippets[*]}
+do
+	prg_name=`echo $code_snippet | cut -d'/' -f4 | cut -d'.' -f1`
+    clang++ $code_snippet -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -DBOOST_NO_CXX11_RVALUE_REFERENCES=1 -o $prg_name
+done
+
+# do some cleanup to save disk space
+cd ..
+rm -rf gatb-core-${VERSION_TO_TEST}-bin-Darwin*
+
diff --git a/gatb-core/test/jenkins/test-docker-gatb-core-compile-clang36.sh b/gatb-core/test/jenkins/test-docker-gatb-core-compile-clang36.sh
new file mode 100755
index 0000000..a032011
--- /dev/null
+++ b/gatb-core/test/jenkins/test-docker-gatb-core-compile-clang36.sh
@@ -0,0 +1,42 @@
+# == GATB Compiler machine
+# must exist as a docker container on the VM!
+COMP_MACHINE=gatb_compiler_clang36
+
+# == enter working directory
+DK_WORK_DIR=/builds/workspace/${JOB_NAME}
+cd ${DK_WORK_DIR}
+
+# == we have a dedicated directory per BRANCH_TO_BUILD
+[ ! -d ${BRANCH_TO_BUILD} ] && { mkdir ${BRANCH_TO_BUILD}; }
+cd ${BRANCH_TO_BUILD}
+
+# == we do the git clone (docker container cannot do that, for now)
+[ ! -d gatb-core ] && { git clone git+ssh://gatb-ci@scm.gforge.inria.fr/gitroot/gatb-core/gatb-core.git; }
+
+# == we get the appropriate branch to build
+cd gatb-core
+git checkout ${BRANCH_TO_BUILD}
+git pull
+cd ..
+
+# == important notice
+#    do not delete build directory: it is done by 
+#    gatb-compile.sh script, below. In addition
+#    user 'ci' won't have permission to do that:
+#    build dir being created from the container
+#    perspective, it is own by root.
+
+# == we set some variables to prepare volume mount points between container and host
+# on host, gatb is here:
+DK_MOUNT=${DK_WORK_DIR}/${BRANCH_TO_BUILD}
+# from the container, we access source code here:
+G_CODE=/tmp/gatb-core-code
+# from the container, we prepare build here:
+G_BUILD=/tmp/gatb-core-build
+
+# == we run docker to *COMPILE* GATB-Core
+docker run --rm --name ${COMP_MACHINE} -e "GIT_PROVIDER=ci" -v ${DK_MOUNT}:${G_CODE} -v ${DK_MOUNT}:${G_BUILD} ${COMP_MACHINE} gatb-compile.sh
+
+# == we run docker to *TEST* GATB-Core
+docker run --rm --name ${COMP_MACHINE} -e "GIT_PROVIDER=ci" -v ${DK_MOUNT}:${G_CODE} -v ${DK_MOUNT}:${G_BUILD} ${COMP_MACHINE} gatb-test.sh
+
diff --git a/gatb-core/test/jenkins/test-snippets-debian7-64bits-gcc-4.7.sh b/gatb-core/test/jenkins/test-snippets-debian7-64bits-gcc-4.7.sh
new file mode 100755
index 0000000..55d578e
--- /dev/null
+++ b/gatb-core/test/jenkins/test-snippets-debian7-64bits-gcc-4.7.sh
@@ -0,0 +1,205 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information·
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+
+"
+
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+gcc --version
+g++ --version
+cmake --version
+
+[ `gcc -dumpversion` = 4.7 ] && { echo "GCC 4.7"; } || { echo "GCC version is not 4.7, we exit"; exit 1; }
+
+JENKINS_TASK=test-snippets-debian7-64bits-gcc-4.7
+GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+
+#>>>>>>>>>>>>>>>>>>>>>
+#if false; then 
+#>>>>>>>>>>>>>>>>>>>>>
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+cmake -DGATB_CORE_INCLUDE_EXAMPLES=True -Wno-dev $GIT_DIR
+
+#---------------------------------------------------------------
+make -j2 examples
+
+#>>>>>>>>>>>>>>>>>>>>>
+#fi
+#>>>>>>>>>>>>>>>>>>>>>
+
+################################################################
+#                      RUN SNIPPETS                            #
+################################################################
+
+cd $BUILD_DIR/bin/
+
+# list all compiled snippets
+ls -l
+
+# prepare environment
+DB_DIR=${GIT_DIR}/test/db
+TMP_DIR=${BUILD_DIR}/tmp
+[ ! -d ${TMP_DIR} ] && { mkdir ${TMP_DIR}; }
+
+# Note:
+#   we redirect stderr and stdout to dev/null to avoir poluting log
+#   with lots of data. In case of an error on a snippet:
+#   1. un-comment above 'if-then' to avoid compiling code
+#   2. remove stream redirection on the snippet of interest
+
+###################### iterator snippets ###########################
+./iterators1 > /dev/null 2>&1 # no args expected
+./iterators2 > /dev/null 2>&1 # no args expected
+./iterators3 > /dev/null 2>&1 # no args expected
+./iterators4 > /dev/null 2>&1 # no args expected
+./iterators5 > /dev/null 2>&1 # no args expected
+./iterators6 > /dev/null 2>&1 # no args expected
+./iterators7 > /dev/null 2>&1 # no args expected
+./iterators8 > /dev/null 2>&1 # no args expected
+./iterators9 > /dev/null 2>&1 # no args expected
+
+###################### bank snippets ###########################
+./bank1 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank2 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank3 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank4 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank5 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank6 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank7 ${DB_DIR}/reads1.fa 500 > /dev/null 2>&1
+./bank8 ${DB_DIR}/reads1.fa ${TMP_DIR}/reads1.fa.bin > /dev/null 2>&1
+./bank9 ${DB_DIR}/reads1.fa ${TMP_DIR}/reads1_filtered.fa 5 > /dev/null 2>&1
+./bank10 -in ${DB_DIR}/reads1.fa -out-dir ${TMP_DIR} -max-size 5000 > /dev/null 2>&1
+./bank11 -kmer-size 4 -out ${TMP_DIR}/kmer.fa > /dev/null 2>&1
+./bank12 -in ${DB_DIR}/reads1.fa -seq-ids ${DB_DIR}/reads1_list_ids.txt
+./bank13 -in ${DB_DIR}/reads1.fa -filter-ratio 0.8 > /dev/null 2>&1
+./bank14 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank15 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank16 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank17 -in ${DB_DIR}/album.txt  > /dev/null 2>&1
+./bank18 -one ${DB_DIR}/reads1.fa -two ${DB_DIR}/reads2.fa > /dev/null 2>&1
+./bank19 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./bank20 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+
+###################### kmer snippets ###########################
+./kmer1 > /dev/null 2>&1 # no args expected
+./kmer2 > /dev/null 2>&1 # no args expected
+./kmer3 > /dev/null 2>&1 # no args expected
+./kmer4 -in ${DB_DIR}/reads1.fa -kmer-size 11 > /dev/null 2>&1
+./kmer5 -in ${DB_DIR}/reads1.fa -kmer-size 11 -minimizer-size 11 > /dev/null 2>&1
+# kmer6 will report an EXCEPTION: this is the expected behavior
+./kmer6 > /dev/null 2>&1 # no args expected
+./kmer7 -in ${DB_DIR}/reads1.fa -kmer-size 11 > /dev/null 2>&1
+./kmer8 -in ${DB_DIR}/reads1.fa -kmer-size 11 -minimizer-size 11 > /dev/null 2>&1
+./kmer9 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer10 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer11 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer12 -in "${DB_DIR}/reads1.fa,${DB_DIR}/reads2.fa" > /dev/null 2>&1
+./kmer13 -in "${DB_DIR}/reads1.fa,${DB_DIR}/reads2.fa" > /dev/null 2>&1
+./kmer14 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer15 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer16 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./kmer17 -in ${DB_DIR}/reads1.fa -kmer-size 11 -minimizer-size 11 > /dev/null 2>&1
+
+###################### debruijn snippets #######################
+./debruijn1 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./debruijn2 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./debruijn3 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./debruijn4 > /dev/null 2>&1 # no args expected
+./debruijn5 ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn6 ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn7 ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn8 ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn9 > /dev/null 2>&1  # no args expected
+./debruijn10 > /dev/null 2>&1 # no args expected
+./debruijn11 > /dev/null 2>&1 # no args expected
+./debruijn12 > /dev/null 2>&1 # no args expected
+./debruijn13 > /dev/null 2>&1 # no args expected
+./debruijn14 > /dev/null 2>&1 # no args expected
+./debruijn15 > /dev/null 2>&1 # no args expected
+./debruijn16 > /dev/null 2>&1 # no args expected
+./debruijn17 > /dev/null 2>&1 # no args expected
+./debruijn18 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn19 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn20 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn21 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn22 -graph ${DB_DIR}/celegans_reads.h5 -out ${TMP_DIR}/data.h5 > /dev/null 2>&1
+./debruijn23 > /dev/null 2>&1 # no args expected
+./debruijn24 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./debruijn25 -in ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./debruijn26 > /dev/null 2>&1 # no args expected
+./debruijn27 ${DB_DIR}/celegans_reads.h5 "TTTGCCCATTTCCTGCCATTTGTC" > /dev/null 2>&1 
+
+./traversal1 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./traversal2 -traversal unitig > /dev/null 2>&1
+./traversal2 -traversal contig > /dev/null 2>&1
+
+###################### storage snippets ########################
+./storage1 > /dev/null 2>&1 # no args expected
+./storage2 > /dev/null 2>&1 # no args expected
+./storage3 > /dev/null 2>&1 # no args expected
+./storage4 > /dev/null 2>&1 # no args expected
+./storage5 > /dev/null 2>&1 # no args expected
+./storage6 -graph ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+./storage7 > /dev/null 2>&1 # no args expected
+./storage8 > /dev/null 2>&1 # no args expected
+./storage9 ${DB_DIR}/celegans_reads.h5 > /dev/null 2>&1
+
+###################### tools snippets ##########################
+./ToyTool > /dev/null 2>&1 # no args expected
+./multithreading1 > /dev/null 2>&1 # no args expected
+./multithreading2 > /dev/null 2>&1 # no args expected
+./multithreading3 > /dev/null 2>&1 # no args expected
+./multithreading4 > /dev/null 2>&1 # no args expected
+./multithreading5 > /dev/null 2>&1 # no args expected
+./multithreading6 ${DB_DIR}/reads1.fa > /dev/null 2>&1
+./observer1 > /dev/null 2>&1 # no args expected
+./optionsparser1 > /dev/null 2>&1 # no args expected
+./optionsparser2 > /dev/null 2>&1 # no args expected
+
+###################### protos snippets #########################
+./MicroSNP -in ${DB_DIR}/microsnp.fa -kmer-size 7 -abundance-min 1 > /dev/null 2>&1
+
diff --git a/gatb-core/test/jenkins/test-suite-debian7-64bits-gcc-4.7.sh b/gatb-core/test/jenkins/test-suite-debian7-64bits-gcc-4.7.sh
new file mode 100755
index 0000000..72f54e9
--- /dev/null
+++ b/gatb-core/test/jenkins/test-suite-debian7-64bits-gcc-4.7.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+
+
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; }
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+gcc --version
+g++ --version
+cmake --version
+
+[ `gcc -dumpversion` = 4.7 ] && { echo "GCC 4.7"; } || { echo "GCC version is not 4.7, we exit"; exit 1; }
+
+JENKINS_TASK=test-suite-debian7-64bits-gcc-4.7
+GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD} $GIT_DIR
+
+#---------------------------------------------------------------
+make -j 2 || error_code
+
+
+################################################################
+#                       PACKAGING                              #
+################################################################
+# Upload bin bundle to the forge; source bundle is made by OSX Jenkins task
+if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then
+   echo "Creating a binary archive... "
+   echo "N.B. this is NOT an official binary release"
+   make package
+   scp gatb-core-${BRANCH_TO_BUILD}-bin-Linux.tar.gz ${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr:/home/groups/gatb-core/htdocs/ci-inria
+   echo "Testing the distribution..."
+   gunzip gatb-core-${BRANCH_TO_BUILD}-bin-Linux.tar.gz
+   tar -xf gatb-core-${BRANCH_TO_BUILD}-bin-Linux.tar
+   cd gatb-core-${BRANCH_TO_BUILD}-bin-Linux
+
+   code_snippets=($(find ./examples -name "*1.cpp"))
+   for code_snippet in ${code_snippets[*]}
+   do
+      prg_name=`echo $code_snippet | cut -d'/' -f4 | cut -d'.' -f1`
+      g++ $code_snippet -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -o $prg_name
+   done
+
+   # do some cleanup to save disk space
+   cd ..
+   rm -rf gatb-core-${BRANCH_TO_BUILD}-bin-Linux*
+fi
+
+################################################################
+#                       UNIT TESTS                             #
+################################################################
+export CPPUNIT_VERBOSE=1
+
+# Copy database for unit tests
+cp -r $GIT_DIR/test/db $BUILD_DIR/test/
+
+# Specify single unit tests
+#$BUILD_DIR/bin/gatb-core-cppunit TestBag
+#$BUILD_DIR/bin/gatb-core-cppunit TestMap
+
+# Launch the full test suite
+cd $BUILD_DIR/bin
+ls ../test/db/           # default directory for test db
+
+#---------------------------------------------------------------
+./gatb-core-cppunit || error_code
+# end of unit tests
+
+################################################################
+#    CHECK FUNCTIONS (with precomputed reference results)      #
+################################################################
+
+# Note: if "dgbh5 -check" fails, exit code will be 1 (0 otherwise), and the Jenkins build will be reported as FAILED
+
+# $BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/aphid_662451seq.fa               -check $HOME/reference/check/aphid_662451.props
+
+# $BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/aphid_662451seq.album/album.txt  -check $HOME/reference/check/aphid_662451.props
+
+# $BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/SRR959239_clean.fastq.gz         -check $HOME/reference/check/SRR959239_clean.props
+
+
+################################################################
+#                         END                                  #
+################################################################
diff --git a/gatb-core/test/jenkins/test-suite-fedora20-gcc-4.8.sh b/gatb-core/test/jenkins/test-suite-fedora20-gcc-4.8.sh
new file mode 100755
index 0000000..6f6243a
--- /dev/null
+++ b/gatb-core/test/jenkins/test-suite-fedora20-gcc-4.8.sh
@@ -0,0 +1,137 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+JOB_NAME             : ${JOB_NAME}
+
+
+"
+
+# Make sure, we use the appropriate cmake
+
+export PATH=/home/ci-gatb/cmake-3.7.2-Linux-x86_64/bin:$PATH
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; }
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+#df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+gcc --version
+g++ --version
+
+gcc -dumpversion
+cmake --version
+
+JENKINS_TASK=${JOB_NAME}
+GIT_DIR=/home/ci-gatb/workspace/$JENKINS_TASK/gatb-core
+BUILD_DIR=/home/ci-gatb/scratchdir/$JENKINS_TASK/gatb-core/build
+
+
+#>>>>>>>>>>>>>>>
+#if false; then
+#>>>>>>>>>>>>>>>
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD}  \
+      -DCPPUNIT_INCLUDE_DIR=/usr/include/cppunit/ -DCPPUNIT_LIBRARY=/usr/lib64/libcppunit.so \
+      $GIT_DIR
+
+#---------------------------------------------------------------
+make -j 2 || error_code
+
+
+#>>>>>>>>>>>>>>>
+#fi
+#>>>>>>>>>>>>>>>
+
+################################################################
+#                       PACKAGING                              #
+################################################################
+# Upload bin bundle to the forge; source bundle is made by OSX Jenkins task
+
+# (not on koriscale slave)
+
+################################################################
+#                       UNIT TESTS                             #
+################################################################
+export CPPUNIT_VERBOSE=1
+
+# Copy database for unit tests
+cp -r $GIT_DIR/test/db $BUILD_DIR/test/
+
+# Specify single unit tests
+#$BUILD_DIR/bin/gatb-core-cppunit TestBag
+#$BUILD_DIR/bin/gatb-core-cppunit TestMap
+
+# Launch the full test suite
+cd $BUILD_DIR/bin
+ls ../test/db/           # default directory for test db
+
+#---------------------------------------------------------------
+./gatb-core-cppunit || error_code
+# end of unit tests
+
+################################################################
+#    CHECK FUNCTIONS (with precomputed reference results)      #
+################################################################
+
+# Note: if "dgbh5 -check" fails, exit code will be 1 (0 otherwise), and the Jenkins build will be reported as FAILED
+
+#$BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/aphid_662451seq.fa               -check $HOME/reference/check/aphid_662451.props
+
+#$BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/aphid_662451seq.album/album.txt  -check $HOME/reference/check/aphid_662451.props
+
+#$BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/SRR959239_clean.fastq.gz         -check $HOME/reference/check/SRR959239_clean.props
+
+
+################################################################
+#                         END                                  #
+################################################################
diff --git a/gatb-core/test/jenkins/test-suite-macos-10.9.5-clang-6.0.sh b/gatb-core/test/jenkins/test-suite-macos-10.9.5-clang-6.0.sh
new file mode 100755
index 0000000..00b8b7c
--- /dev/null
+++ b/gatb-core/test/jenkins/test-suite-macos-10.9.5-clang-6.0.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.·
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+echo "
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+--------------------------
+Jenkins build parameters
+--------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "DEBUG mode, the script will NOT stop..." ; }
+set -xv
+
+# quick look at resources
+#-----------------------------------------------
+sw_vers -productVersion
+#-----------------------------------------------
+system_profiler SPSoftwareDataType
+#-----------------------------------------------
+lstopo
+#-----------------------------------------------
+top -l 1|head -15
+#-----------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+clang --version
+clang++ --version
+cmake --version
+
+export CC=/usr/bin/clang
+export CXX=/usr/bin/clang++
+
+cd gatb-core
+
+JENKINS_TASK=${JOB_NAME}
+GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+#BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+BUILD_DIR=$GIT_DIR/build         #N.B. /scratchdir not yet mounted on the osx slave (ciosx)
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD} $GIT_DIR
+
+make -j 2 || error_code
+
+################################################################
+#                       UNIT TESTS                             #
+################################################################
+export CPPUNIT_VERBOSE=1
+
+# Copy database for unit tests
+cp -r $GIT_DIR/test/db $BUILD_DIR/test/
+
+# Specify single unit tests
+#$BUILD_DIR/bin/gatb-core-cppunit TestBag
+#$BUILD_DIR/bin/gatb-core-cppunit TestMap
+
+# Launch the full test suite
+cd $BUILD_DIR/bin
+ls ../test/db/           # default directory for test db
+./gatb-core-cppunit || error_code
+
+################################################################
+#    CHECK FUNCTIONS (with precomputed reference results)      #
+################################################################
+
+# Not ready
+
+################################################################
+#                   VALGRIND CHECK                             #
+################################################################
+
+# not ready
diff --git a/gatb-core/test/jenkins/test-suite-macos-10.9.5-gcc-4.2.1.sh b/gatb-core/test/jenkins/test-suite-macos-10.9.5-gcc-4.2.1.sh
new file mode 100755
index 0000000..7775a96
--- /dev/null
+++ b/gatb-core/test/jenkins/test-suite-macos-10.9.5-gcc-4.2.1.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.·
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+echo "
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+--------------------------
+Jenkins build parameters
+--------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "DEBUG mode, the script will NOT stop..." ; }
+set -xv
+
+# quick look at resources
+#-----------------------------------------------
+sw_vers -productVersion
+#-----------------------------------------------
+system_profiler SPSoftwareDataType
+#-----------------------------------------------
+lstopo
+#-----------------------------------------------
+top -l 1|head -15
+#-----------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+gcc --version
+g++ --version
+cmake --version
+
+[ `gcc -dumpversion` = 4.2.1 ] && { echo "GCC 4.2.1"; } || { echo "GCC version is not 4.2.1, we exit"; exit 1; }
+
+cd gatb-core
+
+JENKINS_TASK=test-suite-macos-10.9.5-gcc-4.2.1
+GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+#BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+BUILD_DIR=$GIT_DIR/build         #N.B. /scratchdir not yet mounted on the osx slave (ciosx)
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+cmake -Wno-dev -DJENKINS_TAG=${BRANCH_TO_BUILD} $GIT_DIR
+
+make -j 2 || error_code
+
+################################################################
+#                       PACKAGING                              #
+################################################################
+# Upload bin and source bundles to the forge
+if [ $? -eq 0 ] && [ "$INRIA_FORGE_LOGIN" != none ] && [ "$DO_NOT_STOP_AT_ERROR" != true ]; then
+   echo "Creating a binary archive... "
+   echo "     N.B. this is NOT an official binary release"
+   make package
+   echo "Creating a source archive... "
+   make package_source
+   scp gatb-core-${BRANCH_TO_BUILD}-bin-Darwin.tar.gz ${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr:/home/groups/gatb-core/htdocs/ci-inria
+   scp gatb-core-${BRANCH_TO_BUILD}-Source.tar.gz ${INRIA_FORGE_LOGIN}@scm.gforge.inria.fr:/home/groups/gatb-core/htdocs/ci-inria
+   echo "Testing the distribution..."
+   gunzip gatb-core-${BRANCH_TO_BUILD}-bin-Darwin.tar.gz
+   tar -xf gatb-core-${BRANCH_TO_BUILD}-bin-Darwin.tar
+   cd gatb-core-${BRANCH_TO_BUILD}-bin-Darwin
+
+   code_snippets=($(find ./examples -name "*1.cpp"))
+   for code_snippet in ${code_snippets[*]}
+   do
+      prg_name=`echo $code_snippet | cut -d'/' -f4 | cut -d'.' -f1`
+      clang++ $code_snippet -Iinclude -Llib -lgatbcore -lhdf5 -ldl -lz -lpthread  -std=c++0x -O3 -DBOOST_NO_CXX11_RVALUE_REFERENCES=1 -o $prg_name
+   done
+   # do some cleanup to save disk space
+   cd ..
+   rm -rf gatb-core-${BRANCH_TO_BUILD}-bin-Darwin*
+fi
+
+################################################################
+#                       UNIT TESTS                             #
+################################################################
+export CPPUNIT_VERBOSE=1
+
+# Copy database for unit tests
+cp -r $GIT_DIR/test/db $BUILD_DIR/test/
+
+# Specify single unit tests
+#$BUILD_DIR/bin/gatb-core-cppunit TestBag
+#$BUILD_DIR/bin/gatb-core-cppunit TestMap
+
+# Launch the full test suite
+cd $BUILD_DIR/bin
+ls ../test/db/           # default directory for test db
+./gatb-core-cppunit || error_code
+
+################################################################
+#    CHECK FUNCTIONS (with precomputed reference results)      #
+################################################################
+
+# Not ready
+
+################################################################
+#                   VALGRIND CHECK                             #
+################################################################
+
+# not ready
\ No newline at end of file
diff --git a/gatb-core/test/jenkins/test-valgrind-debian7-64bits-gcc-4.7.sh b/gatb-core/test/jenkins/test-valgrind-debian7-64bits-gcc-4.7.sh
new file mode 100755
index 0000000..e94fa25
--- /dev/null
+++ b/gatb-core/test/jenkins/test-valgrind-debian7-64bits-gcc-4.7.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+#--------------------------------------------------------------#
+#         Continuous integration script for Jenkins            #
+#--------------------------------------------------------------#
+#
+# Default mode :
+# This script will exit with error (exit code 1) if any of its steps fails.
+# To change this behaviour, choose DO_NOT_STOP_AT_ERROR in Jenkins (see below).
+#--------------------------------------------------------------#
+set +xv
+
+echo "
+-----------------------------------------
+ Miscellaneous information 
+-----------------------------------------
+date      : `date`
+hostname  : `hostname`
+pwd       : `pwd`
+
+-----------------------------------------
+ Jenkins build parameters (user defined)
+-----------------------------------------
+BRANCH_TO_BUILD      : ${BRANCH_TO_BUILD}
+RELEASE_TO_BUILD     : ${RELEASE_TO_BUILD}
+INRIA_FORGE_LOGIN    : ${INRIA_FORGE_LOGIN}
+TEST_VARIABLE        : ${TEST_VARIABLE}
+DO_NOT_STOP_AT_ERROR : ${DO_NOT_STOP_AT_ERROR}
+
+-----------------------------------------
+ Jenkins build parameters (built in)
+-----------------------------------------
+BUILD_NUMBER         : ${BUILD_NUMBER}
+
+
+"
+
+error_code () { [ "$DO_NOT_STOP_AT_ERROR" = "true" ] && { return 0 ; } }
+
+
+[ "$DO_NOT_STOP_AT_ERROR" != "true" ] && { set -e ; } || { echo "(!) DEBUG mode, the script will NOT stop..." ; echo; }
+set -xv
+
+# quick look at resources
+#---------------------------------------------------------------
+free -h
+#---------------------------------------------------------------
+lstopo
+#---------------------------------------------------------------
+df -kh
+#---------------------------------------------------------------
+
+
+################################################################
+#                       COMPILATION                            #
+################################################################
+
+gcc --version
+g++ --version
+cmake --version
+
+[ `gcc -dumpversion` = 4.7 ] && { echo "GCC 4.7"; } || { echo "GCC version is not 4.7, we exit"; exit 1; }
+
+JENKINS_TASK=test-valgrind-debian7-64bits-gcc-4.7
+GIT_DIR=/builds/workspace/$JENKINS_TASK/gatb-core
+BUILD_DIR=/scratchdir/$JENKINS_TASK/gatb-core/build
+
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------------
+cmake -Wno-dev $GIT_DIR
+
+#---------------------------------------------------------------
+make -j 2 || error_code
+
+################################################################
+#                   VALGRIND CHECKS                            #
+################################################################
+
+
+#>>>>>>>>>>>> 1. Diagnostics for TestDebruijn >>>>>>>>>>>>>>>>>>
+
+export CPPUNIT_VERBOSE=1
+
+# Copy database for unit tests
+cp -r $GIT_DIR/test/db $BUILD_DIR/test/
+
+XMLFILE=$BUILD_DIR/bin/valgrind_TestDebruijn_${BUILD_NUMBER}.xml
+cd $BUILD_DIR/bin
+
+#------------ TestDebruijn without valgrind --------------------
+./gatb-core-cppunit TestDebruijn || error_code
+
+
+#------------ TestDebruijn with valgrind -----------------------
+
+valgrind --xml=yes --xml-file=$XMLFILE \
+	./gatb-core-cppunit TestDebruijn || error_code
+
+xmllint --xpath "string(//error)" $XMLFILE
+
+xmllint --xpath "string(//errorcounts)" $XMLFILE
+
+#>>>>>>>>>>>> 2. Diagnostics for dbgh5 >>>>>>>>>>>>>>>>>>>>>>>>>
+
+# XMLFILE=$BUILD_DIR/bin/valgrind_dbgh5_${BUILD_NUMBER}.xml
+# valgrind --xml=yes --xml-file=$XMLFILE \
+# $BUILD_DIR/bin/dbgh5 -verbose 0 -in $HOME/reference/fastq/aphid_662451seq.fa -check $HOME/reference/check/aphid_662451.props || error_code
+
+# xmllint --xpath "string(//error)" $XMLFILE
+
+# xmllint --xpath "string(//errorcounts)" $XMLFILE
+
+
+################################################################
+#                         END                                  #
+################################################################
diff --git a/gatb-core/test/slaves/ubuntu16-shell-provisioner.sh b/gatb-core/test/slaves/ubuntu16-shell-provisioner.sh
new file mode 100755
index 0000000..37d0710
--- /dev/null
+++ b/gatb-core/test/slaves/ubuntu16-shell-provisioner.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+# Shell script for provisioning an Ubuntu 16.04 LTS slave on Inria cloudstack to compile GATB-CORE
+# (for use with Jenkins, ci.inria.fr)
+
+set -xv
+set -e
+
+# Configure hostname
+# ------------------
+
+#HOST_NAME=gatb-core-ubuntu16-docker
+HOST_NAME=$1
+
+[ -z "$HOST_NAME"] && { echo "Please give a HOST_NAME argument to this script..."; exit 1; } 
+
+hostnamectl set-hostname $HOST_NAME
+
+# Install necessary packages
+# --------------------------
+
+apt-get -y update
+
+apt-get install -y --no-install-recommends \
+        vim git wget make zlib1g-dev hwloc \
+        doxygen graphviz \
+        valgrind libxml2-utils cmake
+
+# Install gcc-4.7 instead of gcc-5 
+# --------------------------------
+# Note : gcc 5.4.0 is already installed
+
+apt-get install -y gcc-4.7 g++-4.7 gcc-4.7-base
+
+update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
+update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5   40 --slave /usr/bin/g++ g++ /usr/bin/g++-5
+update-alternatives  --set gcc /usr/bin/gcc-4.7
+
+
+# Install cppunit-1.12
+# --------------------
+# Note: the libcppunit-dev ubuntu package corresponds to version 1.13, which is not compatible with gatb-core
+
+cd ~/    # now in /builds
+git clone git://anongit.freedesktop.org/git/libreoffice/cppunit/ cppunit_gcc47
+cd cppunit_gcc47
+git checkout cppunit-1.12.1
+
+./autogen.sh
+
+./configure LDFLAGS=-Wl,--no-as-needed
+
+make 
+
+make check
+
+make install
+
+# mount point for external hard drive
+[ -d /scratchdir ] || { mkdir /scratchdir; chown -R ci:ci /scratchdir; }
+
+
+# Install Docker
+# --------------
+# Note: see https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ 
+
+# ... Install Docker, part 1
+
+apt-get remove docker docker-engine docker.io
+
+apt-get install \
+     apt-transport-https \
+     ca-certificates \
+     curl \
+     software-properties-common
+
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+
+apt-key fingerprint 0EBFCD88
+
+sudo add-apt-repository \
+     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+     $(lsb_release -cs) \
+     stable"
+
+apt-get -y update
+apt-get -y install docker-ce
+
+# just to check
+docker run hello-world
+
+# ... Install Docker, part 2
+
+getent group docker || groupadd docker
+usermod -aG docker ci
+
+# Some cleaning
+# -------------
+
+apt-get clean
diff --git a/gatb-core/test/unit/CMakeLists.txt b/gatb-core/test/unit/CMakeLists.txt
new file mode 100644
index 0000000..66dadd0
--- /dev/null
+++ b/gatb-core/test/unit/CMakeLists.txt
@@ -0,0 +1,30 @@
+################################################################################
+#  CPPUNIT 
+################################################################################
+
+# We add the compilation options for the library
+add_definitions (${gatb-core-flags})
+
+file (GLOB_RECURSE  GatbCoreTestFiles  src/*)
+
+include_directories (${gatb-core-includes}  ${gatb-core_SOURCE_DIR}/test/unit/src  ${CPPUNIT_INCLUDE_DIR})
+
+# We add the path for extra libraries
+link_directories (${gatb-core-extra-libraries-path})
+
+add_executable        (gatb-core-cppunit    ${GatbCoreTestFiles})
+target_link_libraries (gatb-core-cppunit    ${gatb-core-libraries} ${CPPUNIT_LIBRARIES})
+
+#################################################
+#  LAUNCH 
+#################################################
+
+# We add an optional target for launching unit tests
+add_custom_target (gatb_test gatb-core-cppunit  "All Tests"  ${gatb-core_SOURCE_DIR}/test/db  unittests.xml)
+
+#################################################
+#  INSTALL 
+#################################################
+install (TARGETS gatb-core-cppunit   DESTINATION test)
+install (DIRECTORY ${gatb-core_SOURCE_DIR}/test/db DESTINATION test/)
+    
diff --git a/gatb-core/test/unit/src/CppunitCommon.hpp b/gatb-core/test/unit/src/CppunitCommon.hpp
new file mode 100644
index 0000000..dbfb5a2
--- /dev/null
+++ b/gatb-core/test/unit/src/CppunitCommon.hpp
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef  _GATB_CPPUNIT_COMMON_H_
+#define  _GATB_CPPUNIT_COMMON_H_
+
+/********************************************************************************/
+
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestSuite.h>
+#include <cppunit/TestCaller.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/XmlOutputter.h>
+
+#include <cppunit/ui/text/TestRunner.h>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+/********************************************************************************/
+
+/* NOTE ABOUT THE MACROS ABOVE...
+ * If we use default CPPUNIT_TEST_SUITE and CPPUNIT_TEST macros, having our test classes in namespaces,
+ * we will have XML output files with mangled names, which is not fine.
+ *
+ * Note that we still want to have the test classes because we generate documentation from tests and
+ * we hope that they will be in a specific location with all the library documentation.
+ *
+ * One solution is to define specific macros for GATB that avoids to use the RTTI system used by CppUnit,
+ * which may lead in some implementation to mangled C++ names.
+ */
+
+#define CPPUNIT_TEST_SUITE_GATB(clazz)                              \
+        static std::string getClazz() { return std::string(#clazz); }  \
+        CPPUNIT_TEST_SUITE (clazz)
+
+#define CPPUNIT_TEST_GATB(testMethod )                \
+    CPPUNIT_TEST_SUITE_ADD_TEST(                            \
+        ( new CPPUNIT_NS::TestCaller<TestFixtureType>(      \
+                getClazz() + std::string("::") + std::string(#testMethod),  \
+                  &TestFixtureType::testMethod,             \
+                  context.makeFixture() ) ) )
+
+#define CPPUNIT_TEST_SUITE_GATB_END  CPPUNIT_TEST_SUITE_END
+
+
+#define CPPUNIT_TEST_SUITE_REGISTRATION_GATB(suite)         \
+    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION (suite,#suite)
+
+using namespace CppUnit;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Abstract class for unit testing.
+ *
+ * Just here for having our own factorizing name (instead of CPPUNIT TestFixture name).
+ */
+class Test : public TestFixture
+{
+};
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
+/********************************************************************************/
+
+
+#endif /* _GATB_CPPUNIT_COMMON_H_ */
diff --git a/gatb-core/test/unit/src/bank/TestBank.cpp b/gatb-core/test/unit/src/bank/TestBank.cpp
new file mode 100644
index 0000000..8b59c90
--- /dev/null
+++ b/gatb-core/test/unit/src/bank/TestBank.cpp
@@ -0,0 +1,1105 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+
+#include <list>
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestBank : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestBank);
+
+        CPPUNIT_TEST_GATB (bank_checkSample1);
+        CPPUNIT_TEST_GATB (bank_checkSample2);
+        CPPUNIT_TEST_GATB (bank_checkSample3);
+        CPPUNIT_TEST_GATB (bank_checkComments);
+        CPPUNIT_TEST_GATB (bank_checkBadUri);
+        CPPUNIT_TEST_GATB (bank_checkSize);
+        CPPUNIT_TEST_GATB (bank_checkMultipleFiles);
+        CPPUNIT_TEST_GATB (bank_checkEstimateNbSequences);
+        CPPUNIT_TEST_GATB (bank_checkProgress);
+        CPPUNIT_TEST_GATB (bank_checkConvertBinary);
+        CPPUNIT_TEST_GATB (bank_checkRegistery1);
+        CPPUNIT_TEST_GATB (bank_checkRegistery2);
+        CPPUNIT_TEST_GATB (bank_strings1);
+        CPPUNIT_TEST_GATB (bank_sequence);
+        CPPUNIT_TEST_GATB (bank_splitter_1);
+        CPPUNIT_TEST_GATB (bank_random_1);
+        CPPUNIT_TEST_GATB (bank_composite);
+        CPPUNIT_TEST_GATB (bank_album1);
+        CPPUNIT_TEST_GATB (bank_album2);
+        CPPUNIT_TEST_GATB (bank_album3);
+        CPPUNIT_TEST_GATB (bank_iteration);
+        //        CPPUNIT_TEST_GATB (bank_datalinesize); // disabled since we're printing fasta in one line now (see "#if 1" in BankFasta)
+        CPPUNIT_TEST_GATB (bank_registery_types);
+        CPPUNIT_TEST_GATB (bank_checkPower2);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    void bank_checkSample1_aux (const string& filename, BankFasta::Iterator::CommentMode_e mode)
+    {
+        const char* text = "ARNDCQEGHILKMFPSTWYV";
+
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        BankFasta b (filename);
+
+        /** We create an iterator over this bank. */
+        BankFasta::Iterator it (b, mode);
+
+        size_t i=0;
+
+        /** We loop over sequences. */
+        for (it.first(); !it.isDone(); it.next(), i++)
+        {
+            /** We prepare the sequence string to be matched according to the provided mode. */
+            char buffer[32];
+            snprintf (buffer, sizeof(buffer), "seq%ld%s", i+1,  (mode == BankFasta::Iterator::FULL ? " generic" : ""));
+
+            /** We check that we got a comment and that it is like 'seqX' where X is the
+             * index from 1 to 20. */
+            CPPUNIT_ASSERT (it->getComment().empty() == false);
+            CPPUNIT_ASSERT (it->getComment().compare(buffer) == 0);
+
+            /** We check that the data size is 20. */
+            CPPUNIT_ASSERT (it->getDataSize() == 20);
+
+            /** We check that the retrieved sequence is compliant with the sample database. */
+            for (size_t k=0; k<20; k++)  {  CPPUNIT_ASSERT (it->getData()[k] == text[ (i+k) % 20]);  }
+        }
+
+        /** We check that we read exactly 20 sequences. */
+        CPPUNIT_ASSERT (i == 20);
+    }
+
+    /********************************************************************************/
+    /** \brief check Bank class information on a specific bank.
+     *
+     * In this test, we use a specific 'sample' FASTA bank:
+     *      - it holds 20 sequences
+     *      - sequences comment are like seq1, seq2, ... seq20
+     *      - data of seq1 is ARNDCQEGHILKMFPSTWYV
+     *      - data of seq2 is RNDCQEGHILKMFPSTWYVA
+     *      - other sequences continue a cyclic left rotation of one letter
+     *
+     * We iterate this sample bank and check that iterated gatb::core::bank::Sequence
+     * instances are coherent with the specification of the sample bank.
+     *
+     * The test is done both with the uncompressed and compressed banks.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                \n
+     * Test of \ref gatb::core::bank::impl::Bank::Iterator      \n
+     * Test of \ref gatb::core::bank::Sequence                  \n
+     * Test of \ref gatb::core::bank::Sequence::getComment()    \n
+     * Test of \ref gatb::core::bank::Sequence::getDataSize()   \n
+     * Test of \ref gatb::core::bank::Sequence::getData()       \n
+     */
+    void bank_checkSample1 ()
+    {
+        /** We launch the test with uncompressed sample bank. */
+        bank_checkSample1_aux (DBPATH("sample1.fa"), BankFasta::Iterator::IDONLY);
+        bank_checkSample1_aux (DBPATH("sample1.fa"), BankFasta::Iterator::FULL);
+
+        /** We launch the test with compressed sample bank. */
+        bank_checkSample1_aux (DBPATH("sample1.fa.gz"), BankFasta::Iterator::IDONLY);
+        bank_checkSample1_aux (DBPATH("sample1.fa.gz"), BankFasta::Iterator::FULL);
+    }
+
+    /********************************************************************************/
+    void bank_checkSample2_aux (const string& filename)
+    {
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        BankFasta b (filename);
+
+        /** We create an iterator over this bank with only id comments. */
+        BankFasta::Iterator it (b, BankFasta::Iterator::IDONLY);
+
+        size_t nbSeq=0;
+
+        /** We loop over sequences. */
+        for (it.first(); !it.isDone(); it.next(), nbSeq++)
+        {
+            char buffer[32];
+            snprintf (buffer, sizeof(buffer), "seq%ld", nbSeq+1);
+
+            /** We check that we got a comment and that it is like 'seqX' where X is the
+             * index from 1 to 20. */
+            CPPUNIT_ASSERT (it->getComment().empty() == false);
+            CPPUNIT_ASSERT (it->getComment().compare (buffer) == 0);
+
+            /** We check that the data size is 0. */
+            CPPUNIT_ASSERT (it->getDataSize() == 0);
+        }
+
+        /** We check that we read exactly 20 sequences. */
+        CPPUNIT_ASSERT (nbSeq == 20);
+    }
+
+    /********************************************************************************/
+    /** \brief check Bank class information on a bank with comments but without data.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                \n
+     * Test of \ref gatb::core::bank::impl::Bank::Iterator      \n
+     * Test of \ref gatb::core::bank::Sequence                  \n
+     * Test of \ref gatb::core::bank::Sequence::getComment()    \n
+     * Test of \ref gatb::core::bank::Sequence::getDataSize()   \n
+     */
+    void bank_checkSample2 ()
+    {
+        /** We launch the test with uncompressed sample bank. */
+        bank_checkSample2_aux (DBPATH("sample2.fa"));
+    }
+
+    /********************************************************************************/
+    void bank_checkSample3_aux (const string& filename)
+    {
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        IBank* bank = Bank::open(filename);
+        CPPUNIT_ASSERT (bank != NULL);
+        LOCAL (bank);
+
+        /** We create an iterator over this bank. */
+        Iterator<Sequence>* it = bank->iterator();
+        CPPUNIT_ASSERT (it != NULL);
+        LOCAL (it);
+
+        size_t nbSeq=0;
+
+        /** We loop over sequences. */
+        for (it->first(); !it->isDone(); it->next(), nbSeq++)
+        {
+            CPPUNIT_ASSERT (it->item().getDataSize() > 0);
+        }
+
+        /** We check that we read exactly N sequences. */
+        CPPUNIT_ASSERT (nbSeq == 7);
+    }
+    /********************************************************************************/
+    void bank_checkSample3 ()
+    {
+        /** We launch the test with fastq banks. */
+        bank_checkSample3_aux (DBPATH("sample.fastq"));
+        bank_checkSample3_aux (DBPATH("sample.fastq.gz"));
+    }
+
+    /********************************************************************************/
+    void bank_checkComments_aux (const string& filename)
+    {
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        BankFasta b1 (filename);
+
+        /** We iterate without comments. */
+        {
+            BankFasta::Iterator it (b1, BankFasta::Iterator::NONE);
+            for (it.first(); !it.isDone(); it.next())
+            {
+                CPPUNIT_ASSERT (it->getComment().empty());
+            }
+        }
+
+        /** We iterate with only id comments. */
+        {
+            BankFasta::Iterator it (b1, BankFasta::Iterator::IDONLY);
+            for (it.first(); !it.isDone(); it.next())
+            {
+                CPPUNIT_ASSERT (it->getComment().empty() == false);
+                CPPUNIT_ASSERT (strstr (it->getComment().c_str(), " ") == 0);
+            }
+        }
+
+        /** We iterate with only full comments. */
+        {
+            BankFasta::Iterator it (b1, BankFasta::Iterator::FULL);
+            for (it.first(); !it.isDone(); it.next())
+            {
+                CPPUNIT_ASSERT (it->getComment().empty() == false);
+                CPPUNIT_ASSERT (strstr (it->getComment().c_str(), " ") != 0);
+            }
+        }
+
+        /** We iterate with default value (should be FULL). */
+        {
+            BankFasta::Iterator it (b1);
+            for (it.first(); !it.isDone(); it.next())
+            {
+                CPPUNIT_ASSERT (it->getComment().empty()==false);
+                CPPUNIT_ASSERT (strstr (it->getComment().c_str(), " ") != 0);
+            }
+        }
+    }
+
+    /********************************************************************************/
+    /** \brief check how Bank::Iterator class manages sequence comments
+     *
+     * A database is iterated 3 times:
+     *      1) without retrieving sequence comments
+     *      2) with retrieving only sequence id
+     *      3) with retrieving full sequence comments
+     *
+     * We check in each case the coherence of the retrieved sequence comments.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                \n
+     * Test of \ref gatb::core::bank::impl::Bank::Iterator      \n
+     * Test of \ref gatb::core::bank::Sequence                  \n
+     * Test of \ref gatb::core::bank::Sequence::getComment()    \n
+     */
+    void bank_checkComments ()
+    {
+        /** We launch the test with uncompressed bank. */
+        bank_checkComments_aux (DBPATH("query.fa"));
+
+        /** We launch the test with compressed bank. */
+        bank_checkComments_aux (DBPATH("query.fa.gz"));
+    }
+
+    /********************************************************************************/
+    /** \brief ok/ko bank uri check
+     *
+     * This test creates Bank instance with bad and good filenames:
+     *      - bad test:   check we get a gatb::core::system::Exception exception
+     *      - good test:  check we get no exception
+     *
+     * Test of \ref gatb::core::bank::impl::Bank
+     */
+    void bank_checkBadUri ()
+    {
+        BankFasta bankKO ("_dummy_bank_name_");
+        BankFasta bankOK (DBPATH("sample1.fa"));
+
+        /** We check that we can't get a valid iterator on it. */
+        CPPUNIT_ASSERT_THROW (BankFasta::Iterator it(bankKO), gatb::core::system::Exception);
+
+        /** We check that the bank does exist. */
+        CPPUNIT_ASSERT_NO_THROW (BankFasta::Iterator it(bankOK));
+    }
+
+    /********************************************************************************/
+    /** \brief Check the size of a bank file
+     *
+     * We just check that we can retrieve the correct (and known) size of one sample bank.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                \n
+     * Test of \ref gatb::core::bank::impl::Bank::getSize()     \n
+     */
+    void bank_checkSize ()
+    {
+        /** We declare a Bank instance. */
+        BankFasta b1 (DBPATH("sample1.fa"));
+
+        /** We check the size of the bank. */
+        CPPUNIT_ASSERT (b1.getSize() == 710);
+    }
+
+    /********************************************************************************/
+    /** \brief Check that we can estimate the number of sequences in a bank
+     *
+     * Since we know the number of sequences in one sample bank, we can correctly
+     * retrieve this number through the IBank API.
+     *
+     * The test is done with one simple sample, then with banks defined by several files.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                        \n
+     * Test of \ref gatb::core::bank::impl::Bank::estimateNbSequences() \n
+     */
+    void bank_checkEstimateNbSequences ()
+    {
+        string filename = DBPATH("sample1.fa");
+
+        /** We declare a Bank instance. */
+        BankFasta b1 (filename);
+
+        /** We check the estimation of sequences number. */
+        u_int64_t estim1 = b1.estimateNbItems();
+        CPPUNIT_ASSERT (estim1 == 20);
+
+        string albumName = "album.txt";
+        if (System::file().doesExist (albumName) == true)  { System::file().remove (albumName); }
+
+        /** We create the album bank. */
+        BankAlbum album (albumName);
+
+        size_t nbMaxFiles = 30;
+
+        /** We build another bank holding several time the same bank. */
+        for (size_t i=1; i<=nbMaxFiles; i++)
+        {
+            /** Add a bank to the album. */
+            album.addBank (filename);
+
+            CPPUNIT_ASSERT ((size_t)album.estimateNbItems() == i * estim1);
+        }
+
+        CPPUNIT_ASSERT (album.getNbBanks() == nbMaxFiles);
+
+        CPPUNIT_ASSERT (System::file().remove (albumName) == 0);
+    }
+
+    /********************************************************************************/
+
+    /** */
+    struct ProgressFunctor : public IteratorListener
+    {
+        size_t nbCalls;
+        size_t modulo;
+
+        ProgressFunctor (size_t mod) : nbCalls(0), modulo(mod) {}
+
+        void inc (u_int64_t current)   {  nbCalls++;  CPPUNIT_ASSERT (current % modulo == 0);  }
+    };
+
+    /** */
+    void bank_checkProgress_aux (IBank& b, size_t modulo)
+    {
+        /** We create an iterator for tha provided bank. */
+        Iterator<Sequence>* itSeq = b.iterator();
+        LOCAL (itSeq);
+
+        /** We create a progress iterator from a Sequence iterator provided by the bank. */
+        SubjectIterator<Sequence> it (itSeq, modulo);
+
+        /** We create some functor to be notified every N iteration and attach it to the iterator. */
+        ProgressFunctor* fct = new ProgressFunctor (modulo);
+        LOCAL (fct);
+        it.addObserver (fct);
+
+        /** We loop over the sequences; the functor should be called every N iterations. */
+        for (it.first(); !it.isDone(); it.next())
+        {
+            /** NOTE ! we don't spoil the inner iteration loop with progression stuff. */
+        }
+
+        /** We check that our observer has been called as much as wanted.
+         *  Note that we can rely here on the estimateNbSequences method since the bank is
+         *  a known sample
+         */
+        CPPUNIT_ASSERT (modulo > 0);
+        CPPUNIT_ASSERT (fct->nbCalls > 0);
+
+        /** We have to check if we got the correct number of notifications. */
+        CPPUNIT_ASSERT (fct->nbCalls == (b.estimateNbItems() + modulo - 1) / modulo);
+
+        /** We keep the number of functor calls. */
+        size_t keepNbCalls = fct->nbCalls;
+
+        /** We unsubscribe the functor from the iterator. */
+        it.removeObserver (fct);
+
+        /** We loop again over the sequences; the functor should not be called anymore. */
+        for (it.first(); !it.isDone(); it.next())
+        {
+        }
+
+        /** We check that the functor has not been called. */
+        CPPUNIT_ASSERT (fct->nbCalls == keepNbCalls);
+    }
+
+    /** \brief Test the bank iterator with progression facilities
+     *
+     * This test creates "progress" iterator from a bank iterator and associate a listener to it.
+     * We check that the listener is correctly called (knowing the properties of the used bank).
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                                    \n
+     * Test of \ref gatb::core::bank::impl::Bank::estimateNbSequences()             \n
+     * Test of \ref gatb::core::tools::dp::impl::SubjectIterator                    \n
+     * Test of \ref gatb::core::tools::dp::impl::SubjectIterator::addObserver       \n
+     * Test of \ref gatb::core::tools::dp::impl::SubjectIterator::removeObserver    \n
+     */
+    void bank_checkProgress ()
+    {
+        string filename = DBPATH("sample1.fa");
+
+        vector<string> filenames;
+
+        size_t tableMod[] = { 1, 2, 3, 5, 8, 13};
+
+        /** We build a bank holding x1 the same bank.*/
+        while (filenames.size() < 1)   {  filenames.push_back (filename);  }
+        BankFasta b1 (filename);
+        for (size_t i=0; i<sizeof(tableMod)/sizeof(tableMod[0]); i++)  {  bank_checkProgress_aux (b1, tableMod[i]);  }
+
+        /** We create the album bank. */
+        string albumName = "album.txt";
+        if (System::file().doesExist (albumName) == true)  { System::file().remove (albumName); }
+        BankAlbum album (albumName);
+
+        /** We build a bank holding x2 the same bank.*/
+        while (album.getNbBanks() < 2)   {  album.addBank (filename);  }
+        for (size_t i=0; i<sizeof(tableMod)/sizeof(tableMod[0]); i++)  {  bank_checkProgress_aux (album, tableMod[i]);  }
+
+        /** We build a bank holding x10 the same bank.*/
+        while (album.getNbBanks() < 10)   {  album.addBank (filename);  }
+        for (size_t i=0; i<sizeof(tableMod)/sizeof(tableMod[0]); i++)  {  bank_checkProgress_aux (album, tableMod[i]);  }
+
+        /** We build a bank holding x20 the same bank.*/
+        while (album.getNbBanks() < 20)   {  album.addBank (filename);  }
+        for (size_t i=0; i<sizeof(tableMod)/sizeof(tableMod[0]); i++)  {  bank_checkProgress_aux (album, tableMod[i]);  }
+
+        System::file().remove (albumName);
+    }
+
+    /********************************************************************************/
+    void bank_checkMultipleFiles_aux (const string& filename)
+    {
+        /** A utility structure for this test. */
+        struct Info  {  u_int32_t nbseq;  u_int64_t datasize;    Info() : nbseq(0), datasize(0) {}  };
+
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        BankFasta b1 (filename);
+
+        /** We gather some information about this (single) bank. */
+        Info i1;
+        BankFasta::Iterator it (b1);
+        for (it.first(); !it.isDone(); it.next())   {  i1.nbseq++;   i1.datasize += it->getDataSize(); }
+
+        /** We create the album bank. */
+        string albumName = "album.txt";
+        if (System::file().doesExist (albumName) == true)  { System::file().remove (albumName); }
+        BankAlbum album (albumName);
+
+        /** We build a bank holding x2 the same bank.*/
+        while (album.getNbBanks() < 2)   {  album.addBank (filename);  }
+        CPPUNIT_ASSERT (album.getNbBanks() == 2);
+
+        /** We gather some information about this x2 bank. */
+        Info i2;
+        Iterator<Sequence>* it2 = album.iterator();  LOCAL (it2);
+        for (it2->first(); !it2->isDone(); it2->next())   {  i2.nbseq++;   i2.datasize += (*it2)->getDataSize(); }
+
+        /** We build a bank holding x4 the same bank.*/
+        while (album.getNbBanks() < 4)   {  album.addBank (filename);  }
+        CPPUNIT_ASSERT (album.getNbBanks() == 4);
+
+        /** We gather some information about this x4 bank. */
+        Info i4;
+        Iterator<Sequence>* it4 = album.iterator();  LOCAL (it4);
+        for (it4->first(); !it4->isDone(); it4->next())   {  i4.nbseq++;   i4.datasize += (*it4)->getDataSize(); }
+
+        CPPUNIT_ASSERT (i1.nbseq   * 2 == i2.nbseq);
+        CPPUNIT_ASSERT (i1.datasize* 2 == i2.datasize);
+
+        CPPUNIT_ASSERT (i1.nbseq   * 4 == i4.nbseq);
+        CPPUNIT_ASSERT (i1.datasize* 4 == i4.datasize);
+
+        CPPUNIT_ASSERT (i2.nbseq   * 2 == i4.nbseq);
+        CPPUNIT_ASSERT (i2.datasize* 2 == i4.datasize);
+
+        System::file().remove (albumName);
+    }
+
+    /********************************************************************************/
+    /** \brief Check that multiple files reading works well.
+     *
+     * This test takes a list of banks and creates an iterator on it. The idea is to
+     * check that iterating N times the same bank with one iterator will provide N times
+     * the information provided by iterating the bank only once.
+     *
+     * Test of \ref gatb::core::bank::impl::Bank                \n
+     * Test of \ref gatb::core::bank::impl::Bank::Iterator      \n
+     * Test of \ref gatb::core::bank::Sequence                  \n
+     * Test of \ref gatb::core::bank::Sequence::getDataSize()   \n
+     */
+    void bank_checkMultipleFiles ()
+    {
+        /** We launch the test with uncompressed sample bank. */
+        bank_checkMultipleFiles_aux (DBPATH("query.fa"));
+
+        /** We launch the test with compressed sample bank. */
+        bank_checkMultipleFiles_aux (DBPATH("query.fa.gz"));
+    }
+
+    /********************************************************************************/
+    void bank_checkConvertBinary_aux (const string& filename, bool checkSize)
+    {
+        string filenameBin = filename + ".bin";
+
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare the two banks. */
+        BankFasta  bank1 (filename);
+        BankBinary bank2 (filenameBin);
+
+        /** We convert the fasta bank in binary format. */
+        BankFasta::Iterator itSeq1 (bank1);
+        for (itSeq1.first(); !itSeq1.isDone(); itSeq1.next())   {  bank2.insert (*itSeq1);  }   bank2.flush ();
+
+        /** We check that the binary bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filenameBin) == true);
+
+        /** We check that the binary file size is smaller than the original file (should be about 25%). */
+        if (checkSize)  {  CPPUNIT_ASSERT (System::file().getSize (filename) >= 4 * System::file().getSize (filenameBin));  }
+
+        Iterator<Sequence>* it1 = bank1.iterator();  LOCAL (it1);
+        Iterator<Sequence>* it2 = bank2.iterator();  LOCAL (it2);
+
+        /** We check that both banks have the same nucleotides. */
+        PairedIterator<Sequence> itPair (it1, it2);
+        for (itPair.first(); !itPair.isDone(); itPair.next())
+        {
+            Sequence& s1 = itPair.item().first;
+            Sequence& s2 = itPair.item().second;
+
+            CPPUNIT_ASSERT (s1.getDataSize() == s2.getDataSize());
+
+            size_t len = s1.getDataSize();
+
+            char* b1 = s1.getDataBuffer();
+            char* b2 = s2.getDataBuffer();
+
+            for (size_t i=0; i<len; i++)
+            {
+                Data::ConvertChar c1 = Data::ConvertASCII::get  (b1, i);
+                Data::ConvertChar c2 = Data::ConvertBinary::get (b2, i);
+                CPPUNIT_ASSERT (c1.first == c2.first);
+            }
+        }
+
+        /** We suppress the binary file and check that the binary bank doesn't exist any more. */
+        CPPUNIT_ASSERT (System::file().remove (filenameBin) == 0);
+        CPPUNIT_ASSERT (System::file().doesExist (filenameBin) == false);
+    }
+
+    /** \brief Check that multiple files reading works well.
+     */
+    void bank_checkConvertBinary ()
+    {
+        bank_checkConvertBinary_aux (DBPATH("reads1.fa"),     true);
+        bank_checkConvertBinary_aux (DBPATH("reads1.fa.gz"),  false);
+        bank_checkConvertBinary_aux (DBPATH("reads2.fa"),     true);
+    }
+
+    /********************************************************************************/
+    /** \brief Performance test
+     */
+    void bank_perf1 ()
+    {
+        const char* filename = "/media/GATB/users/edrezen/databases/swissprot.fa";
+        //const char* filename = "/tmp/swissprot.fa.gz";
+        //const char* filename = "/media/GATB/users/edrezen/databases/refseq_protein.00.fa";
+        //const char* filename = "/media/GATB/users/edrezen/databases/uniprot.fa";
+
+        /** We first clear the file system cache. */
+        System::file().clearCache ();
+
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a Bank instance. */
+        BankFasta b (filename);
+
+        /** We create an iterator over this bank. */
+        BankFasta::Iterator it (b);
+
+        ITime::Value t0 = System::time().getTimeStamp();
+
+        u_int64_t totalSize = 0;
+
+        /** We loop over sequences. */
+        for (it.first(); !it.isDone(); it.next())
+        {
+            totalSize += it->getDataSize();
+        }
+
+        ITime::Value t1 = System::time().getTimeStamp();
+
+        printf ("size=%ld  time=%ld => rate=%.3f MB/s \n",
+            totalSize, t1-t0,
+            (double)totalSize / (double) (t1-t0) / 1024 / 1024 * 1000
+        );
+    }
+
+    /********************************************************************************/
+    void bank_checkRegistery_aux (const string& bankformat, const string& bankuri, size_t nbCheck)
+    {
+        /** We create a bank handle. */
+        IBank* bank = Bank::open (DBPATH(bankuri));
+        LOCAL (bank);
+
+        /** We create a bank iterator. */
+        Iterator<Sequence>* itSeq = bank->iterator();
+        LOCAL (itSeq);
+
+        u_int64_t nbSeq = 0;
+
+        /** We loop over sequences. */
+        for (itSeq->first(); !itSeq->isDone(); itSeq->next())  {  nbSeq++;  }
+
+        CPPUNIT_ASSERT (nbSeq == nbCheck);
+    }
+
+    /********************************************************************************/
+    void bank_checkRegistery1 ()
+    {
+        bank_checkRegistery_aux (BankFasta::name(), "sample1.fa", 20);
+    }
+
+    /********************************************************************************/
+    // We a define a functor that will be called during iteration for filtering some items.
+    struct FilterFunctor  {  bool operator ()  (Sequence& seq)   {  return seq.getIndex() % 2 == 0; } };
+
+    void bank_checkRegistery2 ()
+    {
+        string factoryName = "customfasta";
+
+        /** We register our custom bank format. */
+        Bank::registerFactory (
+                factoryName,
+            new BankFilteredFactory<FilterFunctor> ("fasta", FilterFunctor()),
+            true  // => put this factory in first position to override fasta factory
+        );
+
+        /** We should have only half the number of sequences of the original database. */
+        bank_checkRegistery_aux (factoryName, "sample1.fa", 10);
+
+        /** We have to unregister our custom factory now (default fasta factory will be used again). */
+        CPPUNIT_ASSERT (Bank::unregisterFactory (factoryName) == true);
+    }
+
+    /********************************************************************************/
+    void bank_strings1_aux (const char* table[], size_t actualNumber)
+    {
+        u_int64_t actualTotalSize=0, actualMaxSize=0;
+        for (size_t i=0; i<actualNumber; i++)
+        {
+            actualTotalSize += strlen (table[i]);
+            if (actualMaxSize < strlen(table[i]))  { actualMaxSize = strlen(table[i]); }
+        }
+
+        /** We create the bank. */
+        BankStrings bank (table, actualNumber);
+
+        Iterator<Sequence>* it = bank.iterator();
+        LOCAL (it);
+
+        size_t idx=0;
+        for (it->first(); !it->isDone(); it->next(), idx++)
+        {
+            CPPUNIT_ASSERT ((*it)->getIndex()    == idx);
+            CPPUNIT_ASSERT ((*it)->getDataSize() == strlen(table[idx]) );
+
+            /** NOTE ! don't use strcmp since we consider buffers without ending '\0' */
+            CPPUNIT_ASSERT (memcmp ((*it)->getDataBuffer(), table[idx], (*it)->getDataSize()) == 0);
+        }
+
+        CPPUNIT_ASSERT (idx == actualNumber);
+
+        u_int64_t number, totalSize, maxSize;
+        bank.estimate (number, totalSize, maxSize);
+        CPPUNIT_ASSERT (number    == actualNumber);
+        CPPUNIT_ASSERT (totalSize == actualTotalSize);
+        CPPUNIT_ASSERT (maxSize   == actualMaxSize);
+    }
+
+    /********************************************************************************/
+    void bank_strings1 ()
+    {
+        const char* table1[] =  {  "ACTACGATCGATGTA",  "TTAGAGCAGCGAG",  "AGGGGCCCATTTCATCTATC" };
+        bank_strings1_aux (table1, ARRAY_SIZE (table1));
+
+        const char* table2[] =  {  "ACTACGATCGATGTATTAGAGCAGCGAGAGGGGCCCATTTCATCTATC" };
+        bank_strings1_aux (table2, ARRAY_SIZE (table2));
+
+        const char* table3[] =  {
+            "GATCCTCCCCAGGCCCCTACACCCAATGTGGAACCGGGGTCCCGAATGAAAATGCTGCTGTTCCCTGGAGGTGTTTTCCT",
+            "GGACGCTCTGCTTTGTTACCAATGAGAAGGGCGCTGAATCCTCGAAAATCCTGACCCTTTTAATTCATGCTCCCTTACTC",
+            "ACGAGAGATGATGATCGTTGATATTTCCCTGGACTGTGTGGGGTCTCAGAGACCACTATGGGGCACTCTCGTCAGGCTTC",
+            "CGCGACCACGTTCCCTCATGTTTCCCTATTAACGAAGGGTGATGATAGTGCTAAGACGGTCCCTGTACGGTGTTGTTTCT",
+            "GACAGACGTGTTTTGGGCCTTTTCGTTCCATTGCCGCCAGCAGTTTTGACAGGATTTCCCCAGGGAGCAAACTTTTCGAT"
+        };
+        bank_strings1_aux (table3, ARRAY_SIZE (table3));
+    }
+
+    /********************************************************************************/
+    void bank_sequence ()
+    {
+        char* buf = (char*)"ACTACGATCGATGTA";
+
+        Sequence s1 (buf);
+        CPPUNIT_ASSERT (s1.getDataSize() == 15);
+        CPPUNIT_ASSERT (strcmp (s1.getDataBuffer(), buf) == 0);
+    }
+
+    /********************************************************************************/
+    void bank_random_aux (size_t nbSequences, size_t length)
+    {
+        BankRandom bank (nbSequences, length);
+
+        Iterator<Sequence>* it = bank.iterator ();
+        LOCAL (it);
+
+        size_t foundSequences = 0;
+        for (it->first(); !it->isDone(); it->next(), foundSequences++)
+        {
+            CPPUNIT_ASSERT ((*it)->getDataSize() == length);
+        }
+
+        CPPUNIT_ASSERT (foundSequences == nbSequences);
+    }
+
+    /** */
+    void bank_random_1 ()
+    {
+        size_t nbTable[]  = {1, 5, 10, 100};
+        size_t lenTable[] = {10, 100, 1000, 10*1000, 100*1000, 1000*1000};
+
+        for (size_t i=0; i<ARRAY_SIZE(nbTable); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(lenTable); j++)
+            {
+                bank_random_aux (nbTable[i], lenTable[j]);
+            }
+        }
+    }
+
+    /********************************************************************************/
+    void bank_splitter_1 ()
+    {
+        size_t   readSize = 20;
+        u_int8_t coverage = 1;
+        size_t   overlap  = 5;
+
+        BankSplitter bank (
+            new BankStrings ("ATCCTCCCCAGGCCCCTACACCCAATGTGGAACCGGGGTCCCGAATGAAAATGCTGCTGTTCCCTGGAGGTGTTCT", NULL),
+            readSize, overlap, coverage
+        );
+
+        const char* check[] = {
+          // ATCCTCCCCAGGCCCCTACACCCAATGTGGAACCGGGGTCCCGAATGAAAATGCTGCTGTTCCCTGGAGGTGTTCT
+            "ATCCTCCCCAGGCCCCTACA",
+                           "CTACACCCAATGTGGAACCG",
+                                          "AACCGGGGTCCCGAATGAAA",
+                                                         "TGAAAATGCTGCTGTTCCCT",
+                                                                        "TCCCTGGAGGTGTTCT"
+          // 0000000000111111111122222222223333333333444444444455555555556666666666777777
+          // 0123456789012345678901234567890123456789012345678901234567890123456789012345
+        };
+
+        size_t nbIter = 0;
+        Iterator<Sequence>* it = bank.iterator();  LOCAL (it);
+        for (it->first(); !it->isDone(); it->next(), nbIter++)
+        {
+            string current = string ((*it)->getDataBuffer(), (*it)->getDataSize());
+            CPPUNIT_ASSERT (current == check[nbIter]);
+        }
+
+        CPPUNIT_ASSERT (nbIter == ARRAY_SIZE(check));
+    }
+
+    /********************************************************************************/
+    void bank_composite ()
+    {
+        const char* table[] =  {  "ACTACGATCGATGTA",  "TTAGAGCAGCGAG",  "AGGGGCCCATTTCATCTATC" };
+
+        /** We create a composite bank. */
+        vector<IBank*> banks;
+        for (size_t i=0; i<ARRAY_SIZE(table); i++)  {  banks.push_back (new BankStrings (table[i], 0));  }
+
+        /** We iterate the composite bank. */
+        BankComposite bankComposite (banks);
+        Iterator<Sequence>* it = bankComposite.iterator();
+        LOCAL (it);
+
+        size_t i=0;
+        for (it->first(); !it->isDone(); it->next())
+        {
+            string data = string ((*it)->getDataBuffer(), (*it)->getDataSize());
+            CPPUNIT_ASSERT ( data == table[i++]);
+        }
+        CPPUNIT_ASSERT (i==ARRAY_SIZE(table));
+        CPPUNIT_ASSERT (bankComposite.getNbItems()==ARRAY_SIZE(table));
+    }
+
+    /********************************************************************************/
+    void bank_album1 (void)
+    {
+        /** The idea is to create an album bank from scratch and add some banks into. */
+
+        string albumUri = System::file().getTemporaryDirectory() + "/test_album.txt";
+
+        /** We remove the album file (just to be sure). */
+        System::file().remove (albumUri);
+
+        /** We create an album. */
+        BankAlbum album (albumUri);
+
+        CPPUNIT_ASSERT (System::file().doesExist(albumUri) == true);
+
+        /** We add a few files in the album. */
+        album.addBank (System::file().getRealPath(DBPATH("reads1.fa")));
+        album.addBank (System::file().getRealPath(DBPATH("reads2.fa")));
+
+        /** We iterate the sequences. */
+        Iterator<Sequence>* itSeq = album.iterator();
+        LOCAL (itSeq);
+
+        size_t nbSeq = 0;
+        for (itSeq->first(); !itSeq->isDone(); itSeq->next())  { nbSeq++; }
+
+        CPPUNIT_ASSERT (nbSeq == (100 + 1000) );  // reads1.fa has 100 seq, reads2.fa has 1000 seq
+
+        /** We remove the album file. */
+        System::file().remove (albumUri);
+
+        CPPUNIT_ASSERT (System::file().doesExist(albumUri) == false);
+    }
+
+    /********************************************************************************/
+    void bank_album2 (void)
+    {
+        /** We get the "album.txt" uri. */
+        string albumUri = System::file().getRealPath(DBPATH("album.txt"));
+
+        /** We check that the file exists. */
+        CPPUNIT_ASSERT (System::file().doesExist(albumUri) == true);
+
+        /** We create an album. */
+        BankAlbum album (albumUri);
+
+        /** We iterate the sequences. */
+        Iterator<Sequence>* itSeq = album.iterator();
+        LOCAL (itSeq);
+
+        size_t nbSeq = 0;
+        for (itSeq->first(); !itSeq->isDone(); itSeq->next())  { nbSeq++; }
+
+        CPPUNIT_ASSERT (nbSeq == (100 + 1000) );  // reads1.fa has 100 seq, reads2.fa has 1000 seq
+    }
+
+    /********************************************************************************/
+    void bank_album3_aux (const string& filename, size_t nbBanks, size_t nbSeqCheck)
+    {
+        string albumFilename = "test.album";
+
+        ofstream albumFile (albumFilename.c_str());
+        CPPUNIT_ASSERT (albumFile.is_open());
+
+        for (size_t i=0; i<nbBanks; i++)  {  albumFile << filename << endl; }
+
+        IBank* bank = Bank::open (albumFilename);
+        LOCAL (bank);
+
+        /** We iterate the sequences. */
+        Iterator<Sequence>* itSeq = bank->iterator();
+        LOCAL (itSeq);
+
+        size_t nbSeq = 0;
+        for (itSeq->first(); !itSeq->isDone(); itSeq->next())  { nbSeq++; }
+
+        CPPUNIT_ASSERT (nbSeq == nbSeqCheck*nbBanks);
+
+        /** Cleanup. */
+        System::file().remove(albumFilename);
+    }
+
+    void bank_album3 ()
+    {
+        bank_album3_aux (DBPATH("reads1.fa"),       2000, 100);
+        bank_album3_aux (DBPATH("sample.fastq.gz"), 2000, 7);
+        bank_album3_aux (DBPATH("sample.fastq"),    2000, 7);
+    }
+
+    /********************************************************************************/
+
+    struct Fct { void operator() (Sequence& s) { cout << s.getComment() << endl;} };
+
+    /********************************************************************************/
+    void bank_iteration (void)
+    {
+        BankFasta bank (DBPATH("reads1.fa"));
+
+        size_t count = 0;
+
+        Iterator<Sequence>* it = bank.iterator();  LOCAL (it);
+        for (it->first(); !it->isDone(); it->next())  { count ++; }
+        CPPUNIT_ASSERT (count == 100);
+    }
+
+    /********************************************************************************/
+    void bank_datalinesize_aux (const char* sequence, size_t dataLineSize)
+    {
+        /** We create a fake bank. */
+        BankStrings inputBank (sequence, NULL);
+
+        string outputFilename = System::file().getTemporaryDirectory() + "/foo.fa";
+        System::file().remove (outputFilename);
+        CPPUNIT_ASSERT (System::file().doesExist(outputFilename) == false);
+
+        BankFasta::setDataLineSize (dataLineSize);
+
+        /** We want the output bank instance to be deleted before reading the generated file. */
+        {
+            /** We create a FASTA bank. */
+            BankFasta outputBank (outputFilename);
+
+            /** We iterate the sequences. */
+            Iterator<Sequence>* itSeq = inputBank.iterator();
+            LOCAL (itSeq);
+
+            for (itSeq->first(); !itSeq->isDone(); itSeq->next())  {  outputBank.insert (itSeq->item());  }
+            outputBank.flush();
+        }
+
+        const char* loop = sequence;
+
+        ifstream fbank (outputFilename.c_str());
+        if (fbank.is_open())
+        {
+            string line;
+            while (getline (fbank,line))
+            {
+                /** We skip the comment. */
+                if (line[0] == '>')  { continue; }
+
+                CPPUNIT_ASSERT (line.size() == dataLineSize);
+
+                for (size_t i=0; i<dataLineSize; i++, loop++)
+                {
+                    CPPUNIT_ASSERT (line[i] == *loop);
+                }
+            }
+            fbank.close();
+        }
+        else
+        {
+            CPPUNIT_ASSERT (false);
+        }
+
+        /** We remove the album file. */
+        System::file().remove (outputFilename);
+        CPPUNIT_ASSERT (System::file().doesExist(outputFilename) == false);
+    }
+
+    /********************************************************************************/
+    void bank_datalinesize (void)
+    {
+        // Important : sequence size power of 2 for the test
+        const char* sequence = "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACCGGGTATATGGCGCGCGATTATATACGCGCGCTATATACGCGCTATCGATCGATCGAGCGACTAAT";
+
+        size_t dataLineSizeTable[] = {1, 2, 4, 8, 16, 32, 64, 128};
+
+        for (size_t i=0; i<ARRAY_SIZE(dataLineSizeTable); i++)
+        {
+            bank_datalinesize_aux (sequence, dataLineSizeTable[i]);
+        }
+    }
+
+    /********************************************************************************/
+    void bank_registery_types (void)
+    {
+        IBank* bank1 = Bank::open (DBPATH("sample1.fa"));
+        CPPUNIT_ASSERT (bank1 != 0);
+        LOCAL (bank1);
+
+        CPPUNIT_ASSERT (Bank::getType(DBPATH("album.txt"))    == "album");
+        CPPUNIT_ASSERT (Bank::getType(DBPATH("sample1.fa"))   == "fasta");
+        CPPUNIT_ASSERT (Bank::getType(DBPATH("sample.fastq")) == "fastq");
+    }
+
+    /********************************************************************************/
+    void bank_checkPower2 ()
+    {
+        string filename = "test.fa";
+
+        /** We create a file with a specific content (ie a space at idx being a power of 2, which used make
+         * and invalid write detected by valgrind). */
+        ofstream file (filename.c_str());
+        CPPUNIT_ASSERT (file.is_open());
+
+        file << ">123456789012345 789012345678901" << endl;
+        file << "CTTGTAATAACATGCACAAATACAATGCCATTCAATTTGA";
+        file.flush ();
+
+        /** We open it as a fasta bank. */
+        BankFasta b (filename);
+
+        BankFasta::Iterator it (b);
+        for (it.first(); !it.isDone(); it.next())  {  CPPUNIT_ASSERT (it->getDataSize() == 40);  }
+
+        /** Some cleanup. */
+        System::file().remove(filename);
+        CPPUNIT_ASSERT (System::file().doesExist(filename) == false);
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestBank);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestBank);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/bank/TestLeon.cpp b/gatb-core/test/unit/src/bank/TestLeon.cpp
new file mode 100644
index 0000000..d499af7
--- /dev/null
+++ b/gatb-core/test/unit/src/bank/TestLeon.cpp
@@ -0,0 +1,434 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankHelpers.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+
+#include <gatb/tools/compression/Leon.hpp>
+
+#include <list>
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for Leon compress/decompressor
+ */
+class TestLeon : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestLeon);
+
+    CPPUNIT_TEST_GATB(bank_checkLeon1);
+    CPPUNIT_TEST_GATB(bank_checkLeon2);
+    CPPUNIT_TEST_GATB(bank_checkLeon3);
+    CPPUNIT_TEST_GATB(bank_checkLeon4);
+    CPPUNIT_TEST_GATB(bank_checkLeon5);
+    CPPUNIT_TEST_GATB(bank_checkLeon6);
+    CPPUNIT_TEST_GATB(bank_checkLeon7);
+    CPPUNIT_TEST_GATB(bank_checkLeon8);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+
+    /**
+     * Compare the content of two banks for strict equality: same number
+     * of sequences, sequences in same order, etc.
+     *
+     * */
+    void bank_compare_banks_equality(IBank* bank1, IBank* bank2){
+		// We create iterators over this bank.
+		Iterator<Sequence>* itFas = bank1->iterator();
+		Iterator<Sequence>* itLeon = bank2->iterator();
+		u_int64_t nbSeqFas = 0;
+		u_int64_t nbSeqLeon = 0;
+		{
+			LOCAL(itFas);
+			LOCAL(itLeon);
+			// We do not use estimate() methods. Instead, we count
+			// exact number of sequences in both banks
+			for (itFas->first(); !itFas->isDone(); itFas->next()){nbSeqFas++;}
+			for (itLeon->first(); !itLeon->isDone(); itLeon->next()){nbSeqLeon++;}
+			CPPUNIT_ASSERT(nbSeqFas==nbSeqLeon);
+		}
+		itFas = bank1->iterator();
+		itLeon = bank2->iterator();
+		LOCAL(itFas);
+		LOCAL(itLeon);
+		// We create a PairedIterator to go through both banks simultaneously
+		PairedIterator<Sequence,Sequence> it (itFas, itLeon);
+
+		nbSeqFas =0;
+		for (it.first(); !it.isDone(); it.next())
+		{
+			nbSeqFas++;
+			// check sequence comment for equality
+			CPPUNIT_ASSERT(it->first.getComment().compare(it->second.getComment())==0);
+			// check sequence letters for equality
+			CPPUNIT_ASSERT(it->first.toString().compare(it->second.toString())==0);
+			// check sequence quality for equality
+			CPPUNIT_ASSERT(it->first.getQuality().compare(it->second.getQuality())==0);
+		}
+		CPPUNIT_ASSERT(nbSeqFas==nbSeqLeon);
+    }
+
+    // http://stackoverflow.com/a/7026414
+    /*******************************************************************************
+     * From a fastq, generate leon compressed file, then compare that file to
+     * the Fastq reference. Allow to check that Leon compression is still ok
+     * over releases of GATB-Core.
+     *
+     * LOSSLESS version
+     * */
+    void bank_leon_compress_and_compare (const std::string& fastqFile, const std::string& leonFile)
+    {
+		// STEP 1: compress the Fastq reference file
+
+		// we prepare the Leon command-line
+    	std::vector<char*>       leon_args;
+    	std::vector<std::string> data = {
+    			"-",
+				"-c",
+				"-file", fastqFile,
+				"-lossless", // <-- LOSSLESS
+				"-verbose","0",
+				"-kmer-size", "31",
+				"-abundance", "1"
+    	};
+		for(std::vector<std::string>::iterator loop = data.begin(); loop != data.end(); ++loop){
+			leon_args.push_back(&(*loop)[0]);
+		}
+
+		// we start Leon compressor
+		Leon().run(leon_args.size(), &leon_args[0]);
+
+		// STEP 2: compare reference and compressed version
+
+		// we open the files in read mode
+        IBank* fasBank = Bank::open (fastqFile); //BankFasta
+		IBank* leonBank = Bank::open (leonFile); //BankLeon
+
+		bank_compare_banks_equality(fasBank, leonBank);
+    }
+
+    /**
+     * Run Leon compress on a FastQ file.
+     *
+     * Parameter 'mode' is one of: 0, 1, 2 (for -noqual, -noheader
+     * or -seq-only, respectively) or 3 (-reads 1000; used to test
+     * parallel compression).
+     */
+    void run_leon_compressor(std::string& fastqFile, int mode){
+		// we prepare the Leon command-line
+    	std::vector<char*>       leon_args;
+    	std::vector<std::string> data = {
+    			"-",
+				"-c",
+				"-file", fastqFile,
+				"-verbose","0",
+				"-kmer-size", "31",
+				"-abundance", "1",
+    	}; // do NOT anymore modify this list (unless you also update
+    	   // reference files). If you need to add other Leon args, see
+    	   // switch() below.
+    	switch (mode){
+    	case 0:
+    		data.push_back("-noqual");
+    		break;
+    	case 1:
+    		data.push_back("-noheader");
+    		break;
+    	case 2:
+    		data.push_back("-seq-only");
+    		break;
+    	case 3:
+    		data.push_back("-lossless");
+    		data.push_back("-reads");
+    		data.push_back("1000");
+    		break;
+    	}
+
+		for(std::vector<std::string>::iterator loop = data.begin(); loop != data.end(); ++loop){
+			leon_args.push_back(&(*loop)[0]);
+		}
+
+		// we start Leon compressor
+		Leon().run(leon_args.size(), &leon_args[0]);
+
+    }
+
+    /**
+     * Check the content of a Leon compressed file according to the use
+     * of Leon's argument -noqual, -noheader or -seq-only (mode= 0, 1 or 2,
+     * respectively).
+     */
+    void check_leon_content(std::string& leonFile, int mode){
+    	// we open the leon file in read mode
+		IBank* leonBank = Bank::open (leonFile); //BankLeon
+
+		// We create iterators over this bank.
+		Iterator<Sequence>* itLeon = leonBank->iterator();
+		itLeon = leonBank->iterator();
+		LOCAL(itLeon);
+		for (itLeon->first(); !itLeon->isDone(); itLeon->next())
+		{
+			Sequence& seq = itLeon->item();
+	    	switch (mode){
+	    	case 0://"-noqual"
+	    		CPPUNIT_ASSERT(seq.getComment().size()!=0);
+				CPPUNIT_ASSERT(seq.toString().size()!=0);
+				CPPUNIT_ASSERT(seq.getQuality().size()==0);
+	    		break;
+	    	case 1://"-noheader"
+	    		// noheader: comment contains read rank number starting from 0
+				CPPUNIT_ASSERT(std::stoi(seq.getComment())>=0);
+				CPPUNIT_ASSERT(seq.toString().size()!=0);
+				CPPUNIT_ASSERT(seq.getQuality().size()!=0);
+	    		break;
+	    	case 2://"-seq-only"
+	    		// seq-only: comment contains read rank number starting from 0
+				CPPUNIT_ASSERT(std::stoi(seq.getComment())>=0);
+				CPPUNIT_ASSERT(seq.toString().size()!=0);
+				CPPUNIT_ASSERT(seq.getQuality().size()==0);
+	    		break;
+	    	}
+		}
+    }
+
+    /********************************************************************************
+     * We compare a lossless-compressed Leon file against the original Fastq file.
+     * Allow to ensure that Leon decompression is still working over GATB-Core
+     * releases.
+     */
+    void bank_checkLeon1 ()
+    {
+    	// We open and test the reference file
+    	string fasPath=DBPATH("leon1.fastq");
+    	string btype = Bank::getType(fasPath);
+    	CPPUNIT_ASSERT(
+				btype.compare("fasta")==0 ||
+				btype.compare("fastq")==0
+		);
+		IBank* fasBank = Bank::open (fasPath);
+
+    	// We open and test the leon file
+		// Caution: this must be a LOSSLESS-compressed file
+		// (because we compare quality, see below)
+    	string leonPath=DBPATH("leon1.fastq.leon-ref");
+		btype = Bank::getType(leonPath);
+		CPPUNIT_ASSERT(btype.compare("leon")==0);
+		IBank* leonBank = Bank::open (leonPath);
+
+		bank_compare_banks_equality(fasBank, leonBank);
+    }
+
+    /*******************************************************************************
+     * From a fastq, generate leon compressed file, then compare that file to
+     * the Fastq reference. Allow to check that Leon compression is still ok
+     * over releases of GATB-Core.
+     *
+     * LOSSLESS version
+     * */
+    void bank_checkLeon2(){
+    	bank_leon_compress_and_compare(DBPATH("leon2.fastq"), DBPATH("leon2.fastq.leon"));
+    }
+
+    /*******************************************************************************
+     * From a fastq, generate leon compressed file, then compare that file to
+     * the leon compressed reference. Allow to check that still format is still ok
+     * over releases of GATB-Core.
+     *
+     * LOSSLESS version
+     * */
+    void bank_checkLeon3 ()
+    {
+    	// The existing reference file
+    	std::string fastqFile = DBPATH("leon2.fastq");
+    	// The Leon file to create
+		string leonFile=fastqFile+".leon";
+    	// The Leon file to use as a reference
+		string leonFileRef=fastqFile+".leon-ref";
+
+		// STEP 1: compress the Fasta file
+
+		// we prepare the Leon command-line
+    	std::vector<char*>       leon_args;
+    	std::vector<std::string> data = {
+    			"-",
+				"-c",
+				"-file", fastqFile,
+				"-lossless", // <-- LOSSLESS
+				"-verbose","0",
+				"-kmer-size", "31",
+				"-abundance", "1"
+    	};
+		for(std::vector<std::string>::iterator loop = data.begin(); loop != data.end(); ++loop){
+			leon_args.push_back(&(*loop)[0]);
+		}
+
+		// we start Leon compressor
+		Leon().run(leon_args.size(), &leon_args[0]);
+
+		// STEP 2: compare reference and compressed version
+
+		// we open the files in read mode
+        IBank* leonBank = Bank::open (leonFile); //BankLeon freshly created
+		IBank* leonBankRef = Bank::open (leonFileRef); //BankLeon reference
+
+		bank_compare_banks_equality(leonBank, leonBankRef);
+    }
+
+    /*******************************************************************************
+	 * Test other args of Leon:
+	 *   -noqual
+	 *
+	 * */
+	void bank_checkLeon4 ()
+	{
+    	// The existing reference file
+    	std::string fastqFile = DBPATH("leon2.fastq");
+
+    	// The Leon file to create
+		string leonFile=fastqFile+".leon";
+
+		// STEP 1: compress the Fasta file
+		run_leon_compressor(fastqFile, 0);
+
+		// STEP 2: check leon content
+		check_leon_content(leonFile, 0);
+
+	}
+
+    /*******************************************************************************
+	 * Test other args of Leon:
+	 *   -noheader
+	 *
+	 * */
+	void bank_checkLeon5 ()
+	{
+    	// The existing reference file
+    	std::string fastqFile = DBPATH("leon2.fastq");
+
+    	// The Leon file to create
+		string leonFile=fastqFile+".leon";
+
+		// STEP 1: compress the Fasta file
+		run_leon_compressor(fastqFile, 1);
+
+		// STEP 2: check leon content
+		check_leon_content(leonFile, 1);
+
+	}
+    /*******************************************************************************
+	 * Test other args of Leon:
+	 *   -seq-only
+	 *
+	 * */
+	void bank_checkLeon6 ()
+	{
+    	// The existing reference file
+    	std::string fastqFile = DBPATH("leon2.fastq");
+
+    	// The Leon file to create
+		string leonFile=fastqFile+".leon";
+
+		// STEP 1: compress the Fastq file
+		run_leon_compressor(fastqFile, 2);
+
+		// STEP 2: check leon content
+		check_leon_content(leonFile, 2);
+	}
+
+	/**
+	 * Same as bank_checkLeon2() but with a bigger file.
+	 * */
+	void bank_checkLeon7 ()
+	{
+		bank_leon_compress_and_compare(
+				DBPATH("NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.gz"),
+				DBPATH("NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq.leon")
+				);
+	}
+
+    /*******************************************************************************
+	 * Test Leon parallel compression/decompression.
+	 *
+	 * */
+	void bank_checkLeon8 ()
+	{
+    	// The existing FastQ reference file (contains 50K reads)
+		std::string fileName =  DBPATH("NIST7035_TAAGGCGA_L001_R1_001_5OK.fastq");
+		std::string fastqFile = fileName + ".gz";
+    	// The Leon file to create (WILL BE compressed NOW using -reads 1000)
+		string leonFile = fileName + ".leon";
+    	// The Leon reference file (WAS compressed using -reads 50000)
+		string leonRefFile = leonFile+"-ref";
+
+		// STEP 1: compress the Fastq file ('mode=3' means use '-reads 1000')
+		run_leon_compressor(fastqFile, 3);
+
+		// STEP 2: compare reference and compressed version
+        IBank* leonRefBank = Bank::open (leonRefFile);
+		IBank* leonBank = Bank::open (leonFile);
+		bank_compare_banks_equality(leonRefBank, leonBank);
+	}
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestLeon);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestLeon);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/debruijn/TestDebruijn.cpp b/gatb-core/test/unit/src/debruijn/TestDebruijn.cpp
new file mode 100644
index 0000000..69f634a
--- /dev/null
+++ b/gatb-core/test/unit/src/debruijn/TestDebruijn.cpp
@@ -0,0 +1,1263 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestDebruijn : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestDebruijn);
+
+        CPPUNIT_TEST_GATB (debruijn_test7); 
+        CPPUNIT_TEST_GATB (debruijn_deletenode);
+        //CPPUNIT_TEST_GATB (debruijn_checksum); // FIXME removed it because it's a damn long test
+        CPPUNIT_TEST_GATB (debruijn_test2);
+        CPPUNIT_TEST_GATB (debruijn_test3); // that one is long when compiled in debug, fast in release
+        CPPUNIT_TEST_GATB (debruijn_test4);
+        CPPUNIT_TEST_GATB (debruijn_test5);
+        CPPUNIT_TEST_GATB (debruijn_test6);
+        CPPUNIT_TEST_GATB (debruijn_test8);
+        CPPUNIT_TEST_GATB (debruijn_test9);
+        CPPUNIT_TEST_GATB (debruijn_test10);
+        CPPUNIT_TEST_GATB (debruijn_test11);
+        CPPUNIT_TEST_GATB (debruijn_test12);
+        CPPUNIT_TEST_GATB (debruijn_test13);
+//        CPPUNIT_TEST_GATB (debruijn_mutation); // has been removed due to it crashing clang, and since mutate() isn't really used in apps, i didn't bother.
+        CPPUNIT_TEST_GATB (debruijn_build);
+        CPPUNIT_TEST_GATB (debruijn_checkbranching);
+        CPPUNIT_TEST_GATB (debruijn_mphf);
+        CPPUNIT_TEST_GATB (debruijn_mphf_nodeindex);
+        CPPUNIT_TEST_GATB (debruijn_traversal1);
+        
+        CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+    static const u_int64_t MAX_MEMORY = 1000;
+
+    /********************************************************************************/
+    struct Info
+    {
+        Info() : nbNodes(0), nbNeighbors(0) {}
+        Integer checksum;
+        size_t nbNodes;
+        size_t nbNeighbors;
+
+        /** */
+        void incNodes ()      { nbNodes++;  }
+        void inc      (Integer& t)  { checksum = checksum + t; nbNeighbors++;  }
+
+        /** */
+        string toString ()
+        {
+            stringstream ss;
+            ss << "[INFO  nbNodes=" << nbNodes << "  nbNeighbors=" << nbNeighbors << "  checksum=" << checksum << "]";
+            return ss.str();
+        }
+    };
+
+    /********************************************************************************/
+    void debruijn_test2_aux (Graph& graph)
+    {
+        /** We get an iterator over all the nodes of the graph. */
+        GraphIterator<Node> itNodes = graph.iterator();
+
+        GraphVector<Edge> successors;
+        Info    info;
+
+        TimeInfo ti;
+        {
+            TIME_INFO (ti, "loop");
+
+            /** We iterate all the nodes of the graph. */
+            for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+            {
+                info.incNodes();
+
+                /** We retrieve the outcoming edges. */
+                successors = graph.successorsEdge (itNodes.item());
+
+                /** We iterate all outcoming edges. */
+                for (size_t i=0; i<successors.size(); i++)  {  info.inc (successors[i].to.kmer);  }
+            }
+        }
+
+        //cout << info.toString() <<  "  time=" << ti.getEntryByKey("loop") << endl;
+    }
+
+    /********************************************************************************/
+    void getNearestBranchingRange (const Graph& graph, Node& node, Node& begin, Node& end) const
+    {
+        begin = node;    for (GraphVector<Node> nodes ; (nodes = graph.predecessors (begin)).size() == 1;  begin = nodes[0])  {}
+        end   = node;    for (GraphVector<Node> nodes ; (nodes = graph.successors  (end  )).size() == 1;  end   = nodes[0])  {}
+    }
+
+    void debruijn_check_sequence (const Graph& graph, size_t kmerSize, const char* seq)
+    {
+        size_t seqLen = strlen (seq);
+
+        GraphIterator<Node> nodes = graph.iterator();
+        nodes.first ();
+
+        /** We get the first node. */
+        Node node = nodes.item();
+
+        /** We compute the branching range for the node. */
+        Node begin, end;     getNearestBranchingRange (graph, node, begin, end);
+
+        /** We check that the begin kmer matches the beginning of the sequence. */
+        bool check1 =
+            graph.toString (begin)        == string (seq, kmerSize)  ||
+            graph.toString (graph.reverse(end)) == string (seq, kmerSize);
+
+        /** We check that the end kmer matches the end of the sequence. */
+        bool check2 =
+            graph.toString (end)            == string (seq + seqLen - kmerSize, kmerSize)  ||
+            graph.toString (graph.reverse(begin)) == string (seq + seqLen - kmerSize, kmerSize);
+
+        if (!check1 || !check2)
+        {
+            cout << "kmerSize=" << kmerSize << endl;
+            cout << graph.debugString (node,  STRAND_FORWARD) << "  " << graph.debugString (node,  STRAND_REVCOMP) << endl;
+            cout << graph.debugString (begin, STRAND_FORWARD) << "  " << graph.debugString (end,   STRAND_FORWARD) << endl;
+            cout << graph.debugString (end,   STRAND_REVCOMP) << "  " << graph.debugString (begin, STRAND_REVCOMP) << endl;
+        }
+
+        CPPUNIT_ASSERT (check1 && check2);
+    }
+
+    /********************************************************************************/
+    void debruijn_test2_aux (StorageMode_e mode, size_t kmerSize, size_t nks, const char* seq)
+    {
+        size_t seqLen   = strlen (seq);
+
+        CPPUNIT_ASSERT (seqLen >= kmerSize);
+
+        /** We create a bank with one sequence. */
+        IBank* bank = new BankStrings (seq, 0);
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<> sortingCount (bank, params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        /** We get the storage instance. */
+        Storage* storage = sortingCount.getStorage();
+
+        /** We check that the sequence has no duplicate kmers. */
+        CPPUNIT_ASSERT ( (int64_t) (seqLen - kmerSize + 1) == sortingCount.getSolidCounts()->getNbItems());
+
+        /** We create a bloom instance. */
+        float nbitsPerKmer = DebloomAlgorithm<>::getNbBitsPerKmer (kmerSize, DEBLOOM_ORIGINAL);
+        BloomAlgorithm<> bloom (*storage, sortingCount.getSolidCounts(), kmerSize, nbitsPerKmer, 0, BLOOM_BASIC);
+        bloom.execute ();
+
+        /** We create a debloom instance. */
+        DebloomAlgorithm<> debloom (storage->getGroup("bloom"), storage->getGroup("debloom"), sortingCount.getSolidCounts(), kmerSize, 8);
+
+        /** We launch the debloom. */
+        debloom.execute();
+    }
+
+    /********************************************************************************/
+    void debruijn_test2 ()
+    {
+        const char* sequences [] =
+        {
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+            "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        };
+
+        size_t kmerSizes[] = { 15, 23, 31};
+        size_t nks=1;
+
+        for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+            {
+                debruijn_test2_aux (STORAGE_HDF5, kmerSizes[j], nks, sequences[i]);
+            }
+        }
+    }
+
+    /********************************************************************************/
+    void debruijn_test3 ()
+    {
+        const char* sequences [] =
+        {
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+            "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        };
+
+        size_t kmerSizes[] = { 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
+
+        for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+            {
+                /** We create the graph. */
+                Graph graph = Graph::create (
+                    new BankStrings (sequences[i], 0),
+                    "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSizes[j], MAX_MEMORY
+                );
+
+                debruijn_check_sequence (graph, kmerSizes[j], sequences[i]);
+
+                /** We remove the graph. */
+                graph.remove ();
+            }
+        }
+    }
+
+    /********************************************************************************/
+    void debruijn_test4 ()
+    {
+        char* seq = (char*) "ACCATGTATAATTATAAGTAGGTACCT";  // size 27
+        char* rev = (char*) "AGGTACCTACTTATAATTATACATGGT";
+
+        /** We create the graph. */
+        Graph graph = Graph::create (new BankStrings (seq, 0), "-kmer-size 27  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        GraphIterator<Node> it = graph.iterator();  it.first();
+
+        Node n1 = it.item();
+        CPPUNIT_ASSERT (n1.strand == STRAND_FORWARD);
+        CPPUNIT_ASSERT (graph.toString(n1).compare (seq) == 0);
+
+        Node n2 = graph.reverse (n1);
+        CPPUNIT_ASSERT (n2.strand == STRAND_REVCOMP);
+        CPPUNIT_ASSERT (graph.toString(n2).compare (rev) == 0);
+    }
+
+    /********************************************************************************/
+    void debruijn_test5 ()
+    {
+        /** We create an empty graph with a given kmer size. */
+        Graph graph = Graph::create (7);
+
+        /** We define a string of size equal to the kmer size. */
+        char* seq = (char*) "ACCAGTT";
+        char* rev = (char*) "AACTGGT";
+
+        Node n1 = graph.buildNode (Data(seq));
+        CPPUNIT_ASSERT (graph.toString (n1) == seq);
+
+        Node n2 = graph.reverse (n1);
+        CPPUNIT_ASSERT (graph.toString (n2) == rev);
+    }
+
+    /********************************************************************************/
+    struct debruijn_test6_fct
+    {
+        debruijn_test6_fct (const Graph& graph) : graph(graph) {}
+        const Graph& graph;
+
+        void operator() (Node& node) const
+        {
+            string snode = graph.toString (node);
+
+            Node rev = graph.reverse (node);
+            string srev = graph.toString (rev);
+
+            /** We build a node from the reverse string. */
+            Node rev2 = graph.buildNode (Data ((char*)srev.c_str()));
+            CPPUNIT_ASSERT (graph.toString(rev2) == srev);
+
+            /** We reverse the reversed node. */
+            Node node2 = graph.reverse (rev2);
+            CPPUNIT_ASSERT (graph.toString(node2) == snode);
+        }
+    };
+
+    void debruijn_test6 ()
+    {
+        char* seq = (char*) "ACCATGTATAATTATAAGTAGGTACCACGATCGATCGATCGATCGTAGCATATCGTACGATCT";
+
+        /** We create the graph. */
+        Graph graph = Graph::create (new BankStrings (seq, 0), "-kmer-size 27  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        debruijn_test6_fct fct(graph);
+        graph.iterator().iterate (fct);
+    }
+
+    /********************************************************************************/
+    struct debruijn_test7_fct
+    {
+        debruijn_test7_fct (const Graph& graph, Node& n1, Node& n2) : graph(graph), n1(n1), n2(n2) {}
+        const Graph& graph;
+        Node& n1;
+        Node& n2;
+
+        void operator() (Node& current) const
+        {
+            string currentStr = graph.toString(current);
+
+            if (!(currentStr==graph.toString(n1) || currentStr==graph.toString(n2) ))
+                return;
+            //CPPUNIT_ASSERT (currentStr==graph.toString(n1) || currentStr==graph.toString(n2) ); // restore once dummy node to address MPHF bug is resolved (see below)
+
+            /** We get all possible edges from the current node */
+            GraphVector<Edge> neighbors = graph.neighborsEdge(current);
+            
+            CPPUNIT_ASSERT (neighbors.size()>=1);
+
+            for (size_t i=0; i<neighbors.size(); i++)
+            {
+                /** Shortcut. */
+                Edge& edge = neighbors[i];
+
+                //std::cout << "curstr "  << currentStr << std::endl;
+                if (currentStr==graph.toString(n1))  // 1 neighbor
+                {
+                    if (neighbors.size() != 1) 
+                        std::cout << "anticipation of assert fail: neighbors size of n1 " << neighbors.size() << std::endl;
+                    if (graph.toString(edge.to) != "GGCGC") 
+                        std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+
+                    CPPUNIT_ASSERT (neighbors.size()==1);
+                    CPPUNIT_ASSERT (edge.nt==NUCL_C);
+                    CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+                    CPPUNIT_ASSERT (graph.toString(edge.from)=="AGGCG");
+                    CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGC");
+                }
+
+                if (currentStr==graph.toString(n2))  // 2 neighbors
+                {
+                    CPPUNIT_ASSERT (neighbors.size()==2);
+
+                    if (graph.toString(edge.to) == "CGCCT")
+                    {
+                        if (graph.toString(edge.to) != "CGCCT") 
+                            std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+                        if (edge.nt != NUCL_T) 
+                            std::cout << "anticipation of assert fail: edge.nt = " << (int)edge.nt << " and not T" << std::endl;
+                        if (edge.direction != DIR_OUTCOMING) 
+                            std::cout << "anticipation of assert fail: edge.direction = " << (int)edge.direction << std::endl;
+
+                        CPPUNIT_ASSERT (graph.toString(edge.to)=="CGCCT");
+                        CPPUNIT_ASSERT (edge.nt==NUCL_T);
+                        CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+
+                    }
+                    else
+                    { if (graph.toString(edge.to)=="GGCGC")
+                        {
+                            if (graph.toString(edge.from) != "GCGCC") 
+                                std::cout << "anticipation of assert fail: graph.toString(edge.from) = " << graph.toString(edge.from) << std::endl;
+
+                            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGCC");
+                            CPPUNIT_ASSERT (edge.nt==NUCL_G);
+                            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+                        }
+                        else
+                        {
+                            std::cout << "unknown edge found" << std::endl;
+                            std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << " graph.toString(edge.from) = " << graph.toString(edge.from) << std::endl;
+                            CPPUNIT_ASSERT (false);
+                        }
+                    }
+                }
+            }
+
+
+            GraphVector<Edge> neighborsIncoming = graph.neighborsEdge(current, DIR_INCOMING);
+
+            if (currentStr==graph.toString(n1))  // 0 incoming neighbor
+            {
+                if (neighborsIncoming.size() != 0) 
+                    std::cout << "anticipation of assert fail: incoming neighbors size of n1 " << neighbors.size() << std::endl;
+                CPPUNIT_ASSERT (neighborsIncoming.size()==0);
+            }
+
+
+            for (size_t i=0; i<neighborsIncoming.size(); i++)
+            { 
+                if (currentStr==graph.toString(n2))  // 1 incoming neighbor
+                {
+                    /** Shortcut. */
+                    Edge& edge = neighborsIncoming[i];
+                    CPPUNIT_ASSERT (neighborsIncoming.size()==1);
+                    CPPUNIT_ASSERT (graph.toString(edge.to)=="GGCGC");
+                    CPPUNIT_ASSERT (edge.nt==NUCL_G);
+                    CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+                }
+            }
+        }
+    };
+
+    void debruijn_test7 ()
+    {
+        /** We create the graph. */
+        // useless historical note:
+        // emphf had a known bug where, when there are only like a tiny amount of elements (I tested with three), it will just return mphf(elt)=0 always.
+        // so this is why I added the dummy "ACTGACTGACTGACTG" sequence, to artificially increase the amount of elements in the mphf
+        Graph graph = Graph::create (new BankStrings ("AGGCGC", "ACTGACTGACTGACTG",0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        /** We should get two kmers:
+         *      - AGGCG / CGCCT
+         *      - GCGCC / GGCGC
+         */
+        Node n1 = graph.buildNode ((char*)"AGGCG");
+        Node n2 = graph.buildNode ((char*)"GCGCC");
+
+        // We should get as neighborhood
+        // GCGCC  [GCGCC --T--> CGCCT]
+        // GCGCC  [GGCGC --C--> GCGCC]
+        // AGGCG  [AGGCG --C--> GGCGC]
+
+        debruijn_test7_fct fct (graph, n1, n2);
+        graph.iterator().iterate (fct);
+
+        /* rerun this test with adjacency information instead of bloom */
+        graph.precomputeAdjacency(1, false);
+        
+        graph.iterator().iterate (fct);
+    }
+
+    /********************************************************************************/
+    void debruijn_test8_aux (char* seq, size_t kmerSize)
+    {
+        /** We create the graph. */
+        Graph graph = Graph::create (new BankStrings (seq, NULL),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSize, MAX_MEMORY);
+
+        // We get the first node.
+        Node node = graph.buildNode (seq);
+
+        GraphIterator<Edge> path = graph.simplePathEdge (node, DIR_OUTCOMING);
+
+        for (path.first(); !path.isDone(); path.next())
+        {
+            /** We check that the current transition nucleotide matches the correct character in the sequence. */
+            CPPUNIT_ASSERT (ascii(path.item().nt) == seq [graph.getKmerSize() + path.rank()]);
+        }
+
+        /** We check that we found the correct number of nodes. */
+        CPPUNIT_ASSERT (path.rank() == strlen (seq) - kmerSize);
+    }
+
+    /** */
+    void debruijn_test8 ()
+    {
+        /** This sequence should not have branching nodes for kmer size big enough. */
+        char* seq = (char*) "AGGCGCTAGGGTAGAGGATGATGA";
+
+        size_t kmerSizes[] = {7, 9, 11, 13, 15, 17};
+
+        for (size_t i=0; i<ARRAY_SIZE(kmerSizes); i++)  { debruijn_test8_aux (seq, kmerSizes[i]); }
+    }
+
+    /********************************************************************************/
+    void debruijn_test9 ()
+    {
+        size_t kmerSize = 9;
+
+        char* seq1 = (char*) "AGGCGCTAGGGTAGAGGATGATGA";
+        char* seq2 = (char*) "AGGCGCTAGGGTATAGGATGATGA";
+        //                    000000000011111111112222
+        //                    012345678901234567890123
+        //  difference here                ^
+
+        /** We create the graph. */
+        Graph graph = Graph::create (new BankStrings (seq1, seq2, NULL),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d ", kmerSize, MAX_MEMORY);
+
+        /** We get the first node. */
+        Node node = graph.buildNode (seq1);
+
+        /** We get a simple path iterator starting from the beginning of the seq1. */
+        GraphIterator<Edge> path = graph.simplePathEdge (node, DIR_OUTCOMING);
+
+        for (path.first(); !path.isDone(); path.next())
+        {
+            CPPUNIT_ASSERT (graph.isSimple (path.item()));
+            CPPUNIT_ASSERT (ascii(path.item().nt) == seq1 [graph.getKmerSize() + path.rank()]);
+        }
+
+        /** We check that we stopped at the first difference between the two sequences. */
+        CPPUNIT_ASSERT (path.rank() == 4);   // 4 = diffOffset - kmerSize
+    }
+
+    /********************************************************************************/
+    void debruijn_test10 ()
+    {
+        size_t kmerSize = 7;
+
+        char* seq1 = (char*) "AGGCGCTAGGGAGAGGATGATGAAA";
+        char* seq2 = (char*) "AGGCGCTAGGGTGAGGATGATGAAA";
+        //  difference here              ^
+
+        /** We create the graph. */
+        Graph graph = Graph::create (new BankStrings (seq1, seq2, NULL),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSize, MAX_MEMORY);
+
+        /** We get the first node. */
+        Node node = graph.buildNode (seq1);
+        CPPUNIT_ASSERT (graph.toString(node) == "AGGCGCT");
+
+        /** We retrieve the branching neighbors for the node. */
+        GraphVector<BranchingNode> branchingNeighbors = graph.successorsBranching (node);
+
+        /** In our example, we should have only one branching neighbor. */
+        CPPUNIT_ASSERT (branchingNeighbors.size() == 1);
+
+        /** We check this branching neighbor. */
+        CPPUNIT_ASSERT (graph.toString(branchingNeighbors[0]) == "GCTAGGG");
+
+        for (size_t i=0; i<branchingNeighbors.size(); i++)
+        {
+            /** We check the in/out degree to be sure that it is indeed a branching node. */
+            CPPUNIT_ASSERT (graph.isBranching(branchingNeighbors[i]));
+        }
+    }
+
+    /********************************************************************************/
+    void debruijn_test11 ()
+    {
+        size_t kmerSize = 7;
+
+        // We define some sequences used for building our test graph.
+        // Note that the sequences have a difference at index==kmerSize
+        const char* sequences[] =
+        {
+            //      x <- difference here
+            "AGGCGCTAGGGAGAGGATGATGAAA",
+            "AGGCGCTCGGGAGAGGATGATGAAA",
+            "AGGCGCTTGGGAGAGGATGATGAAA"
+        };
+
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, ARRAY_SIZE(sequences)),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSize, MAX_MEMORY);
+
+        // We get the first node (should be AGGCGCT); this is a branching node.
+        Node node = graph.buildNode ((char*)sequences[0]);
+        CPPUNIT_ASSERT (graph.toString(node) == "AGGCGCT");
+
+        /** We retrieve the branching neighbors for the node. */
+        GraphVector<BranchingNode> branchingNeighbors = graph.successorsBranching (node);
+
+        /** In our example, we should have 3 branching neighbors. */
+        CPPUNIT_ASSERT (branchingNeighbors.size() == 3);
+
+        for (size_t i=0; i<branchingNeighbors.size(); i++)
+        {
+            /** We should close the bubble, ie all the branching neighbors are identical. */
+            CPPUNIT_ASSERT (graph.toString(branchingNeighbors[i]) == "GGGAGAG");
+
+            /** We check the in/out degree to be sure that it is indeed a branching node. */
+            CPPUNIT_ASSERT (graph.isBranching(branchingNeighbors[i]));
+        }
+    }
+
+    /********************************************************************************/
+    void debruijn_test12 ()
+    {
+        size_t kmerSize = 7;
+
+        // We define some sequences used for building our test graph.
+        // Note that the sequences have a difference at index==kmerSize
+        const char* sequences[] =
+        {
+            //      x <- difference here
+            "AGGCGCTAGGGAGAGGATGATGAAA",
+            "AGGCGCTCGGGAGAGGATGATGAAA",
+            "AGGCGCTTGGGAGAGGATGATGAAA"
+        };
+
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, ARRAY_SIZE(sequences)),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSize, MAX_MEMORY);
+
+        // We get the first node (should be AGGCGCT); this is a branching node.
+        Node node = graph.buildNode ((char*)sequences[0]);
+        CPPUNIT_ASSERT (graph.toString(node) == "AGGCGCT");
+
+        /** We retrieve the branching neighbors for the node. */
+        GraphVector<BranchingEdge> branchingNeighbors = graph.successorsBranchingEdge (node);
+
+        /** In our example, we should have 3 branching neighbors. */
+        CPPUNIT_ASSERT (branchingNeighbors.size() == 3);
+
+        for (size_t i=0; i<branchingNeighbors.size(); i++)
+        {
+            /** We should close the bubble, ie all the branching neighbors are identical. */
+            CPPUNIT_ASSERT (graph.toString(branchingNeighbors[i].to) == "GGGAGAG");
+
+            /** We check the path length. */
+            CPPUNIT_ASSERT (branchingNeighbors[i].distance == 7);
+
+            /** We check the simple path between the two branching nodes.
+             *  We need first to retrieve the first (simple) neighbor from the origin. */
+            Node simpleNeighbor = graph.successor (branchingNeighbors[i].from, branchingNeighbors[i].nt);
+
+            GraphIterator<Edge> path = graph.simplePathEdge (simpleNeighbor, branchingNeighbors[i].direction);
+            for (path.first(); !path.isDone(); path.next())
+            {
+                CPPUNIT_ASSERT (graph.toString(path->from) == string (sequences[i], path.rank()+1, kmerSize));
+                CPPUNIT_ASSERT (graph.isSimple(*path));
+            }
+        }
+    }
+
+    /********************************************************************************/
+    void debruijn_test13 ()
+    {
+        size_t   readSize = 80;
+        u_int8_t coverage = 5;
+        size_t   kmerSize = 31;
+        size_t   nks      = coverage;
+
+        const char* seq =
+            "GAATTCCAGGAGGACCAGGAGAACGTCAATCCCGAGAAGGCGGCGCCCGCCCAGCAGCCCCGGACCCGGGCTGGACTGGC"
+            "GGTACTGAGGGCCGGAAACTCGCGGGGTCCAGCTCCCCAGAGGCCTAAGACGCGACGGGTTGCACCTCTTAAGGATCTTC"
+            "CTATAAATGATGAGTATGTCCCTGTTCCTCCCTGGAAAGCAAACAATAAACAGCCTGCATTTACCATACATGTGGATGAA"
+            "GCAGAAGAAATTCAAAAGAGGCCAACTGAATCTAAAAAATCAGAAAGTGAAGATGTCTTGGCCTTTAATTCAGCTGTTAC"
+            "TTTACCAGGACCAAGAAAGCCACTGGCACCTCTTGATTACCCAATGGATGGTAGTTTTGAGTCTCCACATACTATGGAAA"
+            "TGTCAGTTGTATTGGAAGATGAAAAGCCAGTGAGTGTTAATGAAGTACCAGACTACCATGAGGACATTCACACGTACCTT"
+            "AGGGAAATGGAGGTTAAATGTAAGCCTAAAGTGGGTTACATGAAGAAACAGCCAGACATTACTAACAGTATGAGGGCTAT"
+            "CCTCGTGGACTGGTTAGTTGAAGTAGGAGAAGAATATAAACTGCAGAACGAGACCCTGCATTTGGCTGTGAACTACATTG"
+            "ATAGGTTTCTTTCATCCATGTCTGTGTTGAGAGGAAAACTTCAACTTGTGGGCACTGCTGCTATGCTTTTAGCCTCAAAG"
+            "TTTGAAGAGATATACCCGCCAGAAGTAGCAGAGTTTGTATACATTACAGATGACACTTATACCAAGAAACAAGTTCTAAG"
+            "GATGGAGCACCTAGTCTTGAAAGTCCTGGCTTTTGACTTAGCTGCACCAACAATAAATCAGTTTCTTACCCAGTACTTTT"
+            "TGCATCAGCAGCCTGCAAACTGCAAAGTTGAAAGTTTAGCAATGTTTTTGGGAGAGTTAAGTTTGATAGATGCTGACCCA"
+            "TATCTAAAGTATTTGCCGTCAGTTATCGCTGCAGCAGCCTTTCATTTAGCACTCTACACAGTCACAGGACAAAGCTGGCC"
+            "TGAATCATTAGTACAGAAGACTGGATATACTCTGGAAACTCTAAAGCCTTGTCTCCTGGACCTTCACCAGACCTACCTCA"
+            "GAGCACCACAGCACGCACAACAGTCAATAAGAGAGAAGTACAAAAATTCAAAGTATCATGGTGTTTCTCTCCTCAACCCA"
+            "CCAGAGACACTAAATGTGTAACAGTGAAAAGACTGCCTTTGTTTTCTAAGACTGTAAATCACATGCAATGTATATGGTGT"
+            "ACAGATTTTATCTTAGGTTTTAATTTTACAACATTTCTGAATAAGAAGAGTTATGGTCCAGTACAAATTATGGTATCTAT"
+            "TACTTTTTAAATGGTTTTAATTTGTATATCTTTTGTAAATGTAACTATCTTAGATATTTGGCTAATTTTAAGTGGTTTCT";
+
+        // We create a bank of reads from a given long sequence
+        IBank* bank = new BankSplitter (new BankStrings (seq, NULL), readSize, kmerSize-1, coverage);
+
+        // We create the graph.
+        Graph graph = Graph::create (bank,  "-kmer-size %d  -abundance-min %d  -verbose 0  -max-memory %d", kmerSize, nks, MAX_MEMORY);
+
+        // We check we got the correct number of solid kmers.
+        CPPUNIT_ASSERT (graph.getInfo().getInt ("kmers_nb_solid") == (int) (strlen(seq) - kmerSize + 1));
+
+        // We check that we have only two branching nodes.
+        CPPUNIT_ASSERT (graph.getInfo().getInt ("nb_branching") == 2);
+    }
+
+    /********************************************************************************/
+    void debruijn_mutation_aux (const char* sequences[], size_t len, bool reverse)
+    {
+        size_t kmerSize = strlen (sequences[0]);
+
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, len),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", kmerSize, MAX_MEMORY);
+
+        // We get the first node (should be AGGCGCT); this is a branching node.
+        Node node = graph.buildNode ((char*)sequences[0]);
+        CPPUNIT_ASSERT (graph.toString(node) == sequences[0]);
+
+        if (reverse)  { node = graph.reverse(node); }
+
+        GraphVector<Node> mutations = graph.mutate (node, kmerSize-1, 1);
+        CPPUNIT_ASSERT (mutations.size() == 3);
+
+        // We check we got the correct mutations
+        for (size_t i=0; i<mutations.size(); i++)
+        {
+            Node item = mutations[i];
+
+            if (reverse)  { item = graph.reverse (item); }
+
+            CPPUNIT_ASSERT (graph.toString(item) == sequences[i+1]);
+        }
+    }
+
+    /** */
+    void debruijn_mutation ()
+    {
+        const char* sequences1[] =
+        {
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCA",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCC",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCT",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCG"
+
+        };
+
+        const char* sequences2[] =
+        {
+            "TTTGCTCACATGTTCTTTCCTGCGTTATCCC",
+            "GTTGCTCACATGTTCTTTCCTGCGTTATCCC",
+            "ATTGCTCACATGTTCTTTCCTGCGTTATCCC",
+            "CTTGCTCACATGTTCTTTCCTGCGTTATCCC"
+        };
+
+        debruijn_mutation_aux (sequences1, ARRAY_SIZE(sequences1), false);
+        debruijn_mutation_aux (sequences2, ARRAY_SIZE(sequences2), true);
+    }
+
+    /********************************************************************************/
+    void debruijn_mphf_aux (const char* sequences[], size_t len, const int abundances[])
+    {
+        size_t kmerSize = strlen (sequences[0]);
+
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, len),  "-kmer-size %d  -abundance-min 1  -verbose 0 -max-memory %d", kmerSize, MAX_MEMORY);
+
+        GraphIterator<Node> it = graph.iterator();
+
+        // debugging
+        for (it.first(); !it.isDone(); it.next())
+        {
+            //std::cout << graph.toString (it.item()) << " test printing node abundance " << it.item().abundance << std::endl;
+        }
+
+        for (int i = len-1; i >=  0; i--)
+        {
+            // random access to nodes
+            Node node = graph.buildNode ((char*)sequences[i]);
+            CPPUNIT_ASSERT (graph.toString(node) == sequences[i]);
+            int abundance = graph.queryAbundance(node);
+            //std::cout << graph.toString(node) << " test printing node abundance " << abundance << " expected abundance:" << abundances[i] << std::endl;
+            CPPUNIT_ASSERT (abundance == abundances[i]);
+        }
+    }
+
+    /** */
+    void debruijn_mphf ()
+    {
+        const char* sequences1[] =
+        {
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCA",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCC",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCC",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCT",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCT",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCT",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCG",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCG",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCG",
+            "TTGCTCACATGTTCTTTCCTGCGTTATCCCG"
+        };
+
+        const int abundances[] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };
+
+        debruijn_mphf_aux (sequences1, ARRAY_SIZE(sequences1), abundances);
+    }
+
+
+    /** */
+    void debruijn_mphf_nodeindex ()
+    {
+        const char* sequences[] =
+        {
+            "ATTGCTCACATGTTCTTTCCTGCGTTATCCC",
+            "TTTGCTCACATGTTCTTTCCTGCGTTATCCC",
+            "GTTGCTCACATGTTCTTTCCTGCGTTATCCC"
+        };
+
+        
+        size_t kmerSize = strlen (sequences[0])-1;
+
+        // We create the graph.
+        Graph graph = Graph::create (new BankStrings (sequences, 3),  "-kmer-size %d  -abundance-min 1  -verbose 0 -max-memory %d", kmerSize, MAX_MEMORY);
+
+        GraphIterator<Node> it = graph.iterator();
+
+		std::string kmer = "TTGCTCACATGTTCTTTCCTGCGTTATCCC"; //(previously stored and here extracted for you to see what's in the variable)
+		Node node_first = graph.buildNode(kmer.c_str());
+		GraphVector<Node> pre = graph.predecessors(node_first);
+		//-------------predecessors----------------------------------------------------------------------------
+		//iterate through all predecessors
+		set<int> indices;
+		for (size_t a=0; a<pre.size(); a++) {
+			unsigned long idx = graph.nodeMPHFIndex(pre[a]);
+			indices.insert(idx);
+		}
+
+		assert(pre.size() == 3 && indices.size() == 3);
+    }
+
+
+    /********************************************************************************/
+    struct debruijn_build_entry
+    {
+        debruijn_build_entry () : nbNodes(0), nbBranchingNodes(0) {}
+        size_t  nbNodes;
+        Integer checksumNodes;
+        size_t  nbBranchingNodes;
+        Integer checksumBranchingNodes;
+    };
+
+    debruijn_build_entry debruijn_build_aux_aux (const char* name, bool checkNodes, bool checkBranching)
+    {
+        debruijn_build_entry result;
+
+        /** We load the graph. */
+        Graph graph = Graph::load (name);
+
+        if (checkNodes)
+        {
+            GraphIterator<Node> iterNodes = graph.iterator();
+            for (iterNodes.first(); !iterNodes.isDone(); iterNodes.next())
+            { result.nbNodes++; result.checksumNodes += iterNodes.item().kmer; }
+        }
+
+        if (checkBranching)
+        {
+            GraphIterator<BranchingNode> iterBranchingNodes = graph.iteratorBranching();
+            for (iterBranchingNodes.first(); !iterBranchingNodes.isDone(); iterBranchingNodes.next())
+            { result.nbBranchingNodes++; result.checksumBranchingNodes += iterBranchingNodes.item().kmer; }
+        }
+
+        return result;
+    }
+
+    /********************************************************************************/
+    void debruijn_build_aux (const char* sequences[], size_t nbSequences)
+    {
+        // We build the bank
+        IBank* inputBank = new BankStrings (sequences, nbSequences);
+        LOCAL (inputBank);
+
+        Graph::create (inputBank,  "-kmer-size 31 -out %s -abundance-min 1  -verbose 0  -max-memory %d",                        "g1", MAX_MEMORY);
+        Graph::create (inputBank,  "-kmer-size 31 -out %s -abundance-min 1  -verbose 0 -branching-nodes none  -max-memory %d",  "g2", MAX_MEMORY);
+        Graph::create (inputBank,  "-kmer-size 31 -out %s -abundance-min 1  -verbose 0 -solid-kmers-out none  -max-memory %d",  "g3", MAX_MEMORY);
+
+        debruijn_build_entry r1 = debruijn_build_aux_aux ("g1", true,  true);
+        debruijn_build_entry r2 = debruijn_build_aux_aux ("g2", true,  true);
+        debruijn_build_entry r3 = debruijn_build_aux_aux ("g3", false, true);
+
+        CPPUNIT_ASSERT (r1.nbNodes       == r2.nbNodes);
+        CPPUNIT_ASSERT (r1.checksumNodes == r2.checksumNodes);
+
+        /** Right now, we don't test Node for g3 since the Node iterator (based only on BranchingNode) is not implemented. */
+        //CPPUNIT_ASSERT (r1.nbNodes       == r3.nbNodes);
+        //CPPUNIT_ASSERT (r1.checksumNodes == r3.checksumNodes);
+
+        CPPUNIT_ASSERT (r1.nbBranchingNodes       == r2.nbBranchingNodes);
+        CPPUNIT_ASSERT (r1.checksumBranchingNodes == r2.checksumBranchingNodes);
+        CPPUNIT_ASSERT (r1.nbBranchingNodes       == r3.nbBranchingNodes);
+        CPPUNIT_ASSERT (r1.checksumBranchingNodes == r3.checksumBranchingNodes);
+    }
+
+    /********************************************************************************/
+    void debruijn_build ()
+    {
+        const char* sequences[] =
+        {
+            "GAATTCCAGGAGGACCAGGAGAACGTCAATCCCGAGAAGGCGGCGCCCGCCCAGCAGCCCCGGACCCGGGCTGGACTGGC",
+            "GGTACTGAGGGCCGGAAACTCGCGGGGTCCAGCTCCCCAGAGGCCTAAGACGCGACGGGTTGCACCTCTTAAGGATCTTC",
+            "CTATAAATGATGAGTATGTCCCTGTTCCTCCCTGGAAAGCAAACAATAAACAGCCTGCATTTACCATACATGTGGATGAA",
+            "GCAGAAGAAATTCAAAAGAGGCCAACTGAATCTAAAAAATCAGAAAGTGAAGATGTCTTGGCCTTTAATTCAGCTGTTAC",
+            "TTTACCAGGACCAAGAAAGCCACTGGCACCTCTTGATTACCCAATGGATGGTAGTTTTGAGTCTCCACATACTATGGAAA",
+            "TGTCAGTTGTATTGGAAGATGAAAAGCCAGTGAGTGTTAATGAAGTACCAGACTACCATGAGGACATTCACACGTACCTT",
+            "AGGGAAATGGAGGTTAAATGTAAGCCTAAAGTGGGTTACATGAAGAAACAGCCAGACATTACTAACAGTATGAGGGCTAT",
+            "CCTCGTGGACTGGTTAGTTGAAGTAGGAGAAGAATATAAACTGCAGAACGAGACCCTGCATTTGGCTGTGAACTACATTG",
+            "ATAGGTTTCTTTCATCCATGTCTGTGTTGAGAGGAAAACTTCAACTTGTGGGCACTGCTGCTATGCTTTTAGCCTCAAAG",
+            "TTTGAAGAGATATACCCGCCAGAAGTAGCAGAGTTTGTATACATTACAGATGACACTTATACCAAGAAACAAGTTCTAAG",
+            "GATGGAGCACCTAGTCTTGAAAGTCCTGGCTTTTGACTTAGCTGCACCAACAATAAATCAGTTTCTTACCCAGTACTTTT",
+            "TGCATCAGCAGCCTGCAAACTGCAAAGTTGAAAGTTTAGCAATGTTTTTGGGAGAGTTAAGTTTGATAGATGCTGACCCA",
+            "TATCTAAAGTATTTGCCGTCAGTTATCGCTGCAGCAGCCTTTCATTTAGCACTCTACACAGTCACAGGACAAAGCTGGCC",
+            "TGAATCATTAGTACAGAAGACTGGATATACTCTGGAAACTCTAAAGCCTTGTCTCCTGGACCTTCACCAGACCTACCTCA",
+            "GAGCACCACAGCACGCACAACAGTCAATAAGAGAGAAGTACAAAAATTCAAAGTATCATGGTGTTTCTCTCCTCAACCCA",
+            "CCAGAGACACTAAATGTGTAACAGTGAAAAGACTGCCTTTGTTTTCTAAGACTGTAAATCACATGCAATGTATATGGTGT",
+            "ACAGATTTTATCTTAGGTTTTAATTTTACAACATTTCTGAATAAGAAGAGTTATGGTCCAGTACAAATTATGGTATCTAT",
+            "TACTTTTTAAATGGTTTTAATTTGTATATCTTTTGTAAATGTAACTATCTTAGATATTTGGCTAATTTTAAGTGGTTTCT"
+        };
+
+        debruijn_build_aux (sequences, ARRAY_SIZE(sequences));
+    }
+
+    /********************************************************************************/
+    void debruijn_checksum_aux2 (
+        const string& readfile,
+        size_t kmerSize,
+        size_t integerPrecision,
+        size_t nbBranching,
+        const string& checksum,
+        const string& bloom,
+        const string& debloom,
+        const string& debloomImpl
+    )
+    {
+        size_t maxMem[]  = { 500, MAX_MEMORY };
+        size_t nbCores[] = { 1, 4 };
+
+        for (size_t i=0; i<ARRAY_SIZE(maxMem); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(nbCores); j++)
+            {
+                Graph graph = Graph::create (
+                    "-verbose 0 -in %s -kmer-size %d -integer-precision %d  -bloom %s  -debloom %s  -debloom-impl %s  -max-memory %d  -nb-cores %d  -max-memory %d -abundance-min 3",
+                    readfile.c_str(),
+                    kmerSize,
+                    integerPrecision,
+                    bloom.c_str(),
+                    debloom.c_str(),
+                    debloomImpl.c_str(),
+                    maxMem[i],
+                    nbCores[j],
+                    MAX_MEMORY
+                );
+                if (graph.getInfo().getStr ("checksum_branching") != checksum)
+                    std::cout << "in anticipation of assert fail, checksum_branching = " << graph.getInfo().getStr ("checksum_branching")  << " != " << checksum << 
+                        " for params " <<  readfile << " " << kmerSize << " " << integerPrecision << " " << bloom << " " << debloom << " " << debloomImpl << 
+                        std::endl;
+                CPPUNIT_ASSERT (graph.getInfo().getStr ("checksum_branching") == checksum);
+                if (graph.getInfo().getInt ("nb_branching") != (int)nbBranching)
+                    std::cout << "in anticipation of assert fail, nb_branching = " << graph.getInfo().getStr ("nb_branching")  << " != " << nbBranching << 
+                        " for params " <<  readfile << " " << kmerSize << " " << integerPrecision << " " << bloom << " " << debloom << " " << debloomImpl <<
+                        std::endl;
+                CPPUNIT_ASSERT (graph.getInfo().getInt ("nb_branching")       == (int)nbBranching);
+            }
+        }
+    }
+
+    void debruijn_checksum_aux (
+        const string readfile,
+        size_t kmerSize,
+        size_t integerPrecision,
+        size_t nbBranching,
+        const string& checksum,
+        bool all = false
+    )
+    {
+        if (all)
+        {
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "basic",    "original",  "basic");
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "cache",    "original",  "basic");
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "neighbor", "original",  "basic");
+
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "basic",    "cascading", "basic");
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "cache",    "cascading", "basic");
+            debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "neighbor", "cascading", "basic");
+        }
+
+        debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "neighbor", "original",  "minimizer");
+        debruijn_checksum_aux2 (readfile, kmerSize, integerPrecision, nbBranching, checksum, "neighbor", "cascading", "minimizer");
+    }
+
+    void debruijn_checksum ()
+    {
+        /** The nbBranching and checksum values have been computed with the SVN version of minia (minia-1.6906).
+         *  Now we compare to the values produced by gatb-core. */
+
+        string filepath;
+
+        /*****************************************/
+        /**          FILE reads1.fa              */
+        /*****************************************/
+        filepath = DBPATH("reads1.fa");
+
+#define KSIZE_32 (KSIZE_LIST == 32)                                                                                                                                                                               
+        debruijn_checksum_aux (filepath,  31,  1, 24,  "30eb72bc69eca0d3", true);
+
+#if KSIZE_32        
+#else
+        debruijn_checksum_aux (filepath,  31,  2, 24, "2.30eb72bc69eca0d3", true);
+        debruijn_checksum_aux (filepath,  31,  3, 24, "2.30eb72bc69eca0d3", true);
+        debruijn_checksum_aux (filepath,  31,  4, 24, "2.30eb72bc69eca0d3", true);
+
+        debruijn_checksum_aux (filepath,  63,  2,  8, "92acb8443ed65990.7b4298b762ce39ff", true);
+        debruijn_checksum_aux (filepath,  63,  3,  8, "92acb8443ed65990.7b4298b762ce39ff", true);
+        debruijn_checksum_aux (filepath,  63,  4,  8, "92acb8443ed65990.7b4298b762ce39ff", true);
+
+        debruijn_checksum_aux (filepath,  95,  3,  4, "71ed998e1b26a8e0.1a1d73f05438c413.1c6405c67a8fab0a", true);
+        debruijn_checksum_aux (filepath,  95,  4,  4, "71ed998e1b26a8e0.1a1d73f05438c413.1c6405c67a8fab0a", true);
+
+        debruijn_checksum_aux (filepath, 127,  4,  4, "5a5d5720302692fd.214182472e05744f.5c6b807cecb99db2.c5655b04b6a7b8fe", true);
+#endif
+
+        /*****************************************/
+        /**          FILE reads3.fa.gz           */
+        /*****************************************/
+        filepath = DBPATH("reads3.fa.gz");
+
+        debruijn_checksum_aux (filepath,  31,  1, 2956,    "d238698aa54e0ce2");
+#if KSIZE_32        
+#else
+        debruijn_checksum_aux (filepath,  31,  2, 2956, "cc.d238698aa54e0ce2");
+        debruijn_checksum_aux (filepath,  31,  3, 2956, "cc.d238698aa54e0ce2");
+        debruijn_checksum_aux (filepath,  31,  4, 2956, "cc.d238698aa54e0ce2");
+
+        debruijn_checksum_aux (filepath,  63,  2,  969,    "f0a5da085cc20ee8.90af6e8e523e8b96");
+        debruijn_checksum_aux (filepath,  63,  3,  969, "40.f0a5da085cc20ee8.90af6e8e523e8b96");
+        debruijn_checksum_aux (filepath,  63,  4,  969, "40.f0a5da085cc20ee8.90af6e8e523e8b96");
+
+        debruijn_checksum_aux (filepath,  95,  3,  600,    "99817bec5ebde83b.97a71a71c72636c7.4cd2353be480a3b4");
+        debruijn_checksum_aux (filepath,  95,  4,  600, "2c.99817bec5ebde83b.97a71a71c72636c7.4cd2353be480a3b4");
+
+        debruijn_checksum_aux (filepath, 127,  4,  424, "50c7d59f28890ef3.23f38c0611dc341c.525fd5f6a6fa045b.6f1255d3695f039d");
+#endif
+    }
+
+    /********************************************************************************/
+
+    /** Check that the branching are sorted. */
+    void debruijn_checkbranching ()
+    {
+        string filepath = DBPATH("reads3.fa.gz");
+
+        /** We create a graph. */
+        Graph graph = Graph::create ("-verbose 0 -in %s -max-memory %d", filepath.c_str(), MAX_MEMORY);
+
+        Node::Value previous = 0;
+        size_t i=0;
+
+        /** We iterate the branching nodes. */
+        GraphIterator<BranchingNode> it = graph.iteratorBranching ();
+        for (it.first(); !it.isDone(); it.next(), i++)
+        {
+            if (i > 0) {  CPPUNIT_ASSERT (previous < it->kmer);  }
+            previous = it->kmer;
+        }
+    }
+
+    /********************************************************************************/
+
+    void debruijn_traversal1_aux_aux (bool useCopyTerminator, size_t kmerSize, const char** seqs, size_t seqsSize,
+		TraversalKind traversalKind, const char* checkStr
+	)
+    {
+        // We create a fake bank with a SNP
+        IBank* bank = new BankStrings (seqs, seqsSize);
+
+        // We load the graph
+        Graph graph = Graph::create (bank, "-abundance-min 1  -verbose 0  -kmer-size %d  -max-memory %d",
+			kmerSize, MAX_MEMORY);
+
+        // We create a Terminator object
+        BranchingTerminator terminator (graph);
+
+		// We create a node from the start of the first sequence
+		Node node = graph.buildNode (seqs[0]);
+
+        Path path;
+
+        if (useCopyTerminator == false)
+        {
+			// We create a Traversal instance according to the chosen traversal kind
+			Traversal* traversal = Traversal::create (traversalKind, graph, terminator);
+			LOCAL (traversal);
+
+			traversal->traverse (node, DIR_OUTCOMING, path);
+        }
+        else
+        {
+            // We create a Terminator object, copy of the other one
+            BranchingTerminator terminatorCpy (terminator);
+
+			// We create a Traversal instance according to the chosen traversal kind
+			Traversal* traversal = Traversal::create (traversalKind, graph, terminator);
+			LOCAL (traversal);
+
+			traversal->traverse (node, DIR_OUTCOMING, path);
+        }
+
+        stringstream ss;  ss << graph.toString (node) << path ;
+        CPPUNIT_ASSERT (ss.str().compare(checkStr)==0);
+    }
+
+    void debruijn_traversal1_aux (bool useCopyTerminator)
+    {
+        const char* seqs[] =
+        {
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCGATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            //      SNP HERE at pos 31      x
+        };
+
+    	debruijn_traversal1_aux_aux (useCopyTerminator, 15, seqs, ARRAY_SIZE(seqs), TRAVERSAL_UNITIG,
+			"CGCTACAGCAGCTAGTTCATCATTGTTTATC"
+		);
+
+    	debruijn_traversal1_aux_aux (useCopyTerminator, 15, seqs, ARRAY_SIZE(seqs), TRAVERSAL_CONTIG,
+			"CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+		);
+    }
+
+    void debruijn_traversal1 ()
+    {
+    	debruijn_traversal1_aux (false);
+    	debruijn_traversal1_aux (true);
+    }
+
+
+
+
+    /********************************************************************************/
+    void debruijn_deletenode_fct (const Graph& graph) 
+    {
+        Node n1 = graph.buildNode ((char*)"AGGCG");
+        Node n2 = graph.buildNode ((char*)"GGCGC");
+        Node n3 = graph.buildNode ((char*)"GCGCC");
+
+        graph.deleteNode(n3);
+
+        /** We get all possible edges from the current kmer (note: not from the current node). */
+        GraphVector<Edge> neighbors = graph.neighborsEdge(n1.kmer);
+
+        CPPUNIT_ASSERT (neighbors.size()==0);
+    }
+
+    void debruijn_deletenode ()
+    {
+        Graph graph = Graph::create (new BankStrings ("AGGCGCC", "ACTGACTGACTGACTG",0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        debruijn_deletenode_fct (graph);
+
+        /* rerun this test with adjacency information instead of bloom */
+        
+        Graph graph2 = Graph::create (new BankStrings ("AGGCGCC", "ACTGACTGACTGACTG",0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+        graph2.precomputeAdjacency(1, false);
+        
+        debruijn_deletenode_fct (graph2);
+    }
+
+    void debruijn_deletenode2_fct (const Graph& graph) 
+    {
+        Node n1 = graph.buildNode ((char*)"AGGCG");
+        Node n2 = graph.buildNode ((char*)"GGCGA");
+
+        graph.deleteNode(n2);
+
+        /** We get all possible edges from the current kmer (note: not from the current node). */
+        GraphVector<Edge> neighbors = graph.neighborsEdge(n1.kmer);
+
+        std::cout<<"unfinished test" << std::endl;
+    return; // TODO: finish it;
+
+        CPPUNIT_ASSERT (neighbors.size()==0);
+
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            /** Shortcut. */
+            Edge& edge = neighbors[i];
+
+            if (neighbors.size() != 1) 
+                std::cout << "anticipation of assert fail: neighbors size of n1 " << neighbors.size() << std::endl;
+            if (graph.toString(edge.to) != "GGCGC") 
+                std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (neighbors.size()==1);
+            CPPUNIT_ASSERT (edge.nt==NUCL_C);
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="AGGCG");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGC");
+        }
+    }
+
+    void debruijn_deletenode2 ()
+    {
+        Graph graph = Graph::create (new BankStrings ("AGGCGAAGGCGT", "ACTGACTGACTGACTG",0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        debruijn_deletenode_fct (graph);
+
+        /* rerun this test with adjacency information instead of bloom */
+        
+        Graph graph2 = Graph::create (new BankStrings ("AGGCGAAGGCGT", "ACTGACTGACTGACTG",0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+        graph2.precomputeAdjacency(1, false);
+        
+        debruijn_deletenode2_fct (graph2);
+    }
+
+
+
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestDebruijn);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestDebruijn);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/debruijn/TestDebruijnUnitigs.cpp b/gatb-core/test/unit/src/debruijn/TestDebruijnUnitigs.cpp
new file mode 100644
index 0000000..500f11b
--- /dev/null
+++ b/gatb-core/test/unit/src/debruijn/TestDebruijnUnitigs.cpp
@@ -0,0 +1,984 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestDebruijnUnitigs : public Test
+{
+    typedef gatb::core::debruijn::impl::GraphUnitigsTemplate<32> GraphUnitigs;
+
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestDebruijnUnitigs);
+
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test12); // same dataset as tip simplification, just a minor check with large kmer size
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test12_normal_min); // same as above, alternate minimizer size
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test7_nocircular);
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test10); // a unitig of length k with 2 in-branching and 2 out-branching. useful to test an edge case bug
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test11); // same as test10, except 1 out-branching instead of 2, provides asymetry
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test1); // an X-shaped unitig layout
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test14); // a neighborsEdge() without dir
+        // the rest of those tests don't really test the getEdge function
+         //CPPUNIT_TEST_GATB (debruijn_unitigs_deletenode); // probably not appropriate, it's a weird case of a self-revcomp kmer inside a unitig and also at an extremity.
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test2);
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test4);
+        //CPPUNIT_TEST_GATB (debruijn_unitigs_test5); // cannot create nodes not in the graph
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test6);
+        CPPUNIT_TEST_GATB (debruijn_unitigs_test13);
+        CPPUNIT_TEST_GATB (debruijn_unitigs_build);
+        //CPPUNIT_TEST_GATB (debruijn_unitigs_traversal1); // would need to be fixed
+        
+        CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+    static const u_int64_t MAX_MEMORY = 1000;
+
+    /********************************************************************************/
+    struct Info
+    {
+        Info() : nbNodes(0), nbNeighbors(0) {}
+        Integer checksum;
+        size_t nbNodes;
+        size_t nbNeighbors;
+
+        /** */
+        void incNodes ()      { nbNodes++;  }
+        void inc      (Integer& t)  { checksum = checksum + t; nbNeighbors++;  }
+        void inc      ()  {  nbNeighbors++;  }
+
+        /** */
+        string toString ()
+        {
+            stringstream ss;
+            ss << "[INFO  nbNodes=" << nbNodes << "  nbNeighbors=" << nbNeighbors << "  checksum=" << checksum << "]";
+            return ss.str();
+        }
+    };
+
+    /********************************************************************************/
+    void debruijn_unitigs_test2_aux (GraphUnitigs& graph)
+    {
+        /** We get an iterator over all the nodes of the graph. */
+        GraphIterator<NodeGU> itNodes = graph.iterator();
+
+        GraphVector<EdgeGU> successors;
+        Info    info;
+
+        TimeInfo ti;
+        {
+            TIME_INFO (ti, "loop");
+
+            /** We iterate all the nodes of the graph. */
+            for (itNodes.first(); !itNodes.isDone(); itNodes.next())
+            {
+                info.incNodes();
+
+                /** We retrieve the outcoming edges. */
+                successors = graph.successorsEdge (itNodes.item());
+
+                /** We iterate all outcoming edges. */
+                //for (size_t i=0; i<successors.size(); i++)  {  info.inc (successors[i].to.kmer);  } // some type conflict.. cba.
+                for (size_t i=0; i<successors.size(); i++)  {  info.inc ();  } 
+            }
+        }
+
+        //cout << info.toString() <<  "  time=" << ti.getEntryByKey("loop") << endl;
+    }
+
+    /********************************************************************************/
+    void debruijn_unitigs_test2_aux (StorageMode_e mode, size_t kmerSize, size_t nks, const char* seq)
+    {
+        size_t seqLen   = strlen (seq);
+
+        CPPUNIT_ASSERT (seqLen >= kmerSize);
+
+        /** We create a bank with one sequence. */
+        IBank* bank = new BankStrings (seq, (char*)0);
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "dummy");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<> sortingCount (bank, params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        /** We get the storage instance. */
+        sortingCount.getStorage();
+
+        /** We check that the sequence has no duplicate kmers. */
+        CPPUNIT_ASSERT ( (int64_t) (seqLen - kmerSize + 1) == sortingCount.getSolidCounts()->getNbItems());
+
+        }
+
+    /********************************************************************************/
+    void debruijn_unitigs_test2 ()
+    {
+        const char* sequences [] =
+        {
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAAT",
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+            "CGCTATTCATCATTGTTTATCAATGAGCTAAAAGGAAACTATAAATAACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        };
+
+        size_t kmerSizes[] = { 15, 23, 31};
+        size_t nks=1;
+
+        for (size_t i=0; i<ARRAY_SIZE(sequences); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(kmerSizes); j++)
+            {
+                debruijn_unitigs_test2_aux (STORAGE_HDF5, kmerSizes[j], nks, sequences[i]);
+            }
+        }
+    }
+    /********************************************************************************/
+    void debruijn_unitigs_test4 ()
+    {
+        char* seq = (char*) "ACCATGTATAATTATAAGTAGGTACCT";  // size 27
+        char* rev = (char*) "AGGTACCTACTTATAATTATACATGGT";
+
+        /** We create the graph. */
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings (seq, (char*)0), "-kmer-size 27  -abundance-min 1  -verbose 0  -max-memory %d -nb-cores 1", MAX_MEMORY);
+
+        GraphIterator<NodeGU> it = graph.iterator();  it.first();
+
+        NodeGU n1 = it.item();
+        CPPUNIT_ASSERT (n1.strand == STRAND_FORWARD);
+        CPPUNIT_ASSERT (graph.toString(n1).compare (seq) == 0);
+
+        NodeGU n2 = n1;
+        n2.reverse();
+        CPPUNIT_ASSERT (n2.strand == STRAND_REVCOMP);
+        CPPUNIT_ASSERT (graph.toString(n2).compare (rev) == 0);
+    }
+
+    /********************************************************************************/
+    void debruijn_unitigs_test5 ()
+    {
+        /** We create an empty graph with a given kmer size. */
+        GraphUnitigs graph = GraphUnitigs::create (7);
+
+        /** We define a string of size equal to the kmer size. */
+        char* seq = (char*) "ACCAGTT";
+        char* rev = (char*) "AACTGGT";
+
+        NodeGU n1 = graph.debugBuildNode (seq);
+        CPPUNIT_ASSERT (graph.toString (n1) == seq);
+
+        NodeGU n2 = n1;
+        n2.reverse();
+        CPPUNIT_ASSERT (graph.toString (n2) == rev);
+    }
+
+    /********************************************************************************/
+    struct debruijn_unitigs_test6_fct
+    {
+        debruijn_unitigs_test6_fct (const GraphUnitigs& graph) : graph(graph) {}
+        const GraphUnitigs& graph;
+
+        void operator() (NodeGU& node) const
+        {
+            string snode = graph.toString (node);
+
+            NodeGU rev = node;
+            rev.reverse();
+            string srev = graph.toString (rev);
+
+            /** We build a node from the reverse string. */
+            NodeGU rev2 = graph.debugBuildNode (srev);
+            CPPUNIT_ASSERT (graph.toString(rev2) == srev);
+
+            /** We reverse the reversed node. */
+            NodeGU node2 = rev2;
+            node2.reverse();
+            CPPUNIT_ASSERT (graph.toString(node2) == snode);
+        }
+    };
+
+    void debruijn_unitigs_test6 ()
+    {
+        char* seq = (char*) "ACCATGTATAATTATAAGTAGGTACCACGATCGATCGATCGATCGTAGCATATCGTACGATCT";
+
+        /** We create the graph. */
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings (seq, (char*)0), "-kmer-size 27  -abundance-min 1  -verbose 0  -max-memory %d -nb-cores 1", MAX_MEMORY);
+
+        debruijn_unitigs_test6_fct fct(graph);
+        graph.iterator().iterate (fct);
+    }
+
+    /********************************************************************************/
+    struct debruijn_unitigs_test7_fct
+    {
+        debruijn_unitigs_test7_fct (const GraphUnitigs& graph, NodeGU& n1, NodeGU& n2) : graph(graph), n1(n1), n2(n2) {}
+        const GraphUnitigs& graph;
+        NodeGU& n1;
+        NodeGU& n2;
+
+        void operator() (NodeGU& current) const
+        {
+            string currentStr = graph.toString(current);
+            
+            if (!(currentStr==graph.toString(n1) || currentStr==graph.toString(n2) ))
+                return;
+            //CPPUNIT_ASSERT (currentStr==graph.toString(n1) || currentStr==graph.toString(n2) ); // restore once dummy node to address MPHF bug is resolved (see below)
+
+            /** We get all possible edges from the current node */
+            GraphVector<EdgeGU> neighbors = graph.neighborsEdge(current);
+            
+            CPPUNIT_ASSERT (neighbors.size()>=1);
+
+            for (size_t i=0; i<neighbors.size(); i++)
+            {
+                /** Shortcut. */
+                EdgeGU& edge = neighbors[i];
+
+                //std::cout << "curstr "  << currentStr << std::endl;
+                if (currentStr==graph.toString(n1))  // 1 neighbor
+                {
+                    if (neighbors.size() != 1) 
+                        std::cout << "anticipation of assert fail: neighbors size of n1 " << neighbors.size() << std::endl;
+                    if (graph.toString(edge.to) != "GGCGC") 
+                        std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+
+                    CPPUNIT_ASSERT (neighbors.size()==1);
+                    CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+                    CPPUNIT_ASSERT (graph.toString(edge.from)=="AGGCG");
+                    CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGC");
+                }
+
+                if (currentStr==graph.toString(n2))  // 2 neighbors
+                {
+                    if (neighbors.size() != 2) 
+                            std::cout << "anticipation of assert fail: for node " << graph.toString(n2) << ", number of neighbors = " << neighbors.size() << std::endl;
+                    CPPUNIT_ASSERT (neighbors.size()==2);
+
+                    if (graph.toString(edge.to) == "CGCCT")
+                    {
+                        if (graph.toString(edge.to) != "CGCCT") 
+                            std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+                        if (edge.direction != DIR_OUTCOMING) 
+                            std::cout << "anticipation of assert fail: edge.direction = " << (int)edge.direction << std::endl;
+
+                        CPPUNIT_ASSERT (graph.toString(edge.to)=="CGCCT");
+                        CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+
+                    }
+                    else
+                    { 
+                        if ((graph.toString(edge.to)=="GGCGC") ||
+                            /* graphunitigs doesn't report the end node of that edge correctly (because palindromic kmer), but at least it detected it, so i'll let it slide */ // that's a minor fixme.
+                            (graph.toString(edge.to)=="GCGCC"))
+                        {
+                            if (graph.toString(edge.from) != "GCGCC") 
+                                std::cout << "anticipation of assert fail: graph.toString(edge.from) = " << graph.toString(edge.from) << std::endl;
+
+                            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGCC");
+                            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+                        }
+                        else
+                        {
+                            std::cout << "unknown edge found" << std::endl;
+                            std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << " graph.toString(edge.from) = " << graph.toString(edge.from) << std::endl;
+                            CPPUNIT_ASSERT (false);
+                        }
+                    }
+                }
+            }
+
+
+            GraphVector<EdgeGU> neighborsIncoming = graph.neighborsEdge(current, DIR_INCOMING);
+
+            if (currentStr==graph.toString(n1))  // 0 incoming neighbor
+            {
+                if (neighborsIncoming.size() != 0) 
+                    std::cout << "anticipation of assert fail: incoming neighbors size of n1 " << neighbors.size() << std::endl;
+                CPPUNIT_ASSERT (neighborsIncoming.size()==0);
+            }
+
+
+            for (size_t i=0; i<neighborsIncoming.size(); i++)
+            { 
+                if (currentStr==graph.toString(n2))  // 1 incoming neighbor
+                {
+                    /** Shortcut. */
+                    EdgeGU& edge = neighborsIncoming[i];
+                    CPPUNIT_ASSERT (neighborsIncoming.size()==1);
+                    CPPUNIT_ASSERT (graph.toString(edge.to)=="GGCGC");
+                    CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+                }
+            }
+        }
+    };
+
+    void debruijn_unitigs_test7 ()
+    {
+        /** We create the graph. */
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGC", "ACTGACTGACTGACTG",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 1 -max-memory %d -out dummy -minimizer-size 3 -nb-cores 1", MAX_MEMORY);
+
+        /** We should get two kmers:
+         *      - AGGCG / CGCCT
+         *      - GCGCC / GGCGC
+         */
+        NodeGU n1 = graph.debugBuildNode ((char*)"AGGCG");
+        NodeGU n2 = graph.debugBuildNode ((char*)"GCGCC");
+
+        // We should get as neighborhood
+        // GCGCC  [GCGCC --T--> CGCCT]
+        // GCGCC  [GGCGC --C--> GCGCC]
+        // AGGCG  [AGGCG --C--> GGCGC]
+
+        debruijn_unitigs_test7_fct fct (graph, n1, n2);
+        graph.iterator().iterate (fct);
+
+        /* rerun this test with adjacency information instead of bloom */
+        graph.precomputeAdjacency(1, false);
+        
+        graph.iterator().iterate (fct);
+    }
+
+    void debruijn_unitigs_test7_nocircular ()
+    {
+        // same as test7, but without the circular contig
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGC", "ACTGACT",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -minimizer-size 3 -nb-cores 1", MAX_MEMORY);
+
+        /** We should get two kmers:
+         *      - AGGCG / CGCCT
+         *      - GCGCC / GGCGC
+         */
+        NodeGU n1 = graph.debugBuildNode ((char*)"AGGCG");
+        NodeGU n2 = graph.debugBuildNode ((char*)"GCGCC");
+
+        // We should get as neighborhood
+        // GCGCC  [GCGCC --T--> CGCCT]
+        // GCGCC  [GGCGC --C--> GCGCC]
+        // AGGCG  [AGGCG --C--> GGCGC]
+
+        debruijn_unitigs_test7_fct fct (graph, n1, n2);
+        graph.iterator().iterate (fct);
+    }
+
+
+    void debruijn_unitigs_test1()
+    {
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGA", "TTGCGA", "GCGAT", "GCGAA",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -minimizer-size 3 -nb-cores 1", MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"GGCGA");
+        NodeGU n2 = graph.debugBuildNode ((char*)"GCGAT");
+
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1, DIR_OUTCOMING);// GGCGA
+        CPPUNIT_ASSERT (neighbors.size() == 2);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "GCGAA" && graph.toString(edge.to) != "GCGAT" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GGCGA");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "GCGAA" ||  graph.toString(edge.to) == "GCGAT" );
+        }
+
+
+        GraphVector<EdgeGU> neighbors2 = graph.neighborsEdge(n2, DIR_INCOMING); //GCGAT
+        CPPUNIT_ASSERT (neighbors2.size() == 2);
+        for (size_t i=0; i<neighbors2.size(); i++)
+        {
+            EdgeGU& edge = neighbors2[i];
+
+            if (graph.toString(edge.to) != "GGCGA" && graph.toString(edge.to) != "TGCGA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGAT");
+             CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGA" || graph.toString(edge.to) == "TGCGA" );
+        }
+
+    };
+
+
+    void debruijn_unitigs_test10()
+    {
+	// the following line seems to crash at BankStrings if i dont set the last argument as char*, see http://stackoverflow.com/questions/39121792/c-function-with-any-parameters-make-segmentation-fault
+	GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGA", "TTGCGA", "GCGAT", "CGATA", "CGATT", (char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -minimizer-size 3 -nb-cores 1", MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"GCGAT");
+
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1, DIR_OUTCOMING);// GCGAT
+        CPPUNIT_ASSERT (neighbors.size() == 2);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "CGATA" && graph.toString(edge.to) != "CGATT" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGAT");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "CGATA" ||  graph.toString(edge.to) == "CGATT" );
+        }
+
+
+        GraphVector<EdgeGU> neighbors2 = graph.neighborsEdge(n1, DIR_INCOMING); //GCGAT
+        CPPUNIT_ASSERT (neighbors2.size() == 2);
+        for (size_t i=0; i<neighbors2.size(); i++)
+        {
+            EdgeGU& edge = neighbors2[i];
+
+            if (graph.toString(edge.to) != "GGCGA" && graph.toString(edge.to) != "TGCGA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGAT");
+             CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGA" ||  graph.toString(edge.to) == "TGCGA" );
+        }
+
+
+        // same as before, except on revcomp of that node
+        //
+        
+        NodeGU n1rev = graph.debugBuildNode ((char*)"ATCGC");
+
+         neighbors = graph.neighborsEdge(n1rev, DIR_OUTCOMING);
+        CPPUNIT_ASSERT (neighbors.size() == 2);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "TCGCC" && graph.toString(edge.to) != "TCGCA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="ATCGC");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "TCGCC" ||  graph.toString(edge.to) == "TCGCA" );
+        }
+
+
+        neighbors2 = graph.neighborsEdge(n1rev, DIR_INCOMING);
+        CPPUNIT_ASSERT (neighbors2.size() == 2);
+        for (size_t i=0; i<neighbors2.size(); i++)
+        {
+            EdgeGU& edge = neighbors2[i];
+
+            if (graph.toString(edge.to) != "TATCG" && graph.toString(edge.to) != "AATCG" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="ATCGC");
+             CPPUNIT_ASSERT (graph.toString(edge.to)  =="TATCG" ||  graph.toString(edge.to) == "AATCG" );
+        }
+
+
+
+    };
+
+    void debruijn_unitigs_test11()
+    {
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGA", "TTGCGA", "GCGAT", "CGATA", (char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -minimizer-size 3 -nb-cores 1", MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"GCGAT");
+
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1, DIR_OUTCOMING);// GCGAT
+        CPPUNIT_ASSERT (neighbors.size() == 1);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "CGATA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGAT");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "CGATA" );
+        }
+
+
+        GraphVector<EdgeGU> neighbors2 = graph.neighborsEdge(n1, DIR_INCOMING); //GCGAT
+        CPPUNIT_ASSERT (neighbors2.size() == 2);
+        for (size_t i=0; i<neighbors2.size(); i++)
+        {
+            EdgeGU& edge = neighbors2[i];
+
+            if (graph.toString(edge.to) != "GGCGA" && graph.toString(edge.to) != "TGCGA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="GCGAT");
+             CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGA" ||  graph.toString(edge.to) == "TGCGA" );
+        }
+
+
+        // same as before, except on revcomp of that node
+        //
+        
+        NodeGU n1rev = graph.debugBuildNode ((char*)"ATCGC");
+
+         neighbors = graph.neighborsEdge(n1rev, DIR_OUTCOMING);
+        CPPUNIT_ASSERT (neighbors.size() == 2);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "TCGCC" && graph.toString(edge.to) != "TCGCA" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="ATCGC");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "TCGCC" ||  graph.toString(edge.to) == "TCGCA" );
+        }
+
+
+        neighbors2 = graph.neighborsEdge(n1rev, DIR_INCOMING);
+        CPPUNIT_ASSERT (neighbors2.size() == 1);
+        for (size_t i=0; i<neighbors2.size(); i++)
+        {
+            EdgeGU& edge = neighbors2[i];
+
+            if (graph.toString(edge.to) != "TATCG" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="ATCGC");
+             CPPUNIT_ASSERT (graph.toString(edge.to)  =="TATCG" );
+        }
+    }
+
+
+    void debruijn_unitigs_test12() // same data as the tip simplification unitigs test, but testing for getEdges here
+    {
+        //>works well for k=21; part of genome10K.fasta
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings (
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC",
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the tip
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG" //>remaining part
+            ,(char*)0),
+                "-kmer-size 21  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -nb-cores 1 -minimizer-size 3" /* minimizer size 3 is important to reproduce the problem found in Simplifications*/, MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"TGTCATCTAGTTCAACAACCA"); // part of the tip
+
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1, DIR_INCOMING);
+        CPPUNIT_ASSERT (neighbors.size() == 1);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "GTGTCATCTAGTTCAACAACC" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="TGTCATCTAGTTCAACAACCA");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "GTGTCATCTAGTTCAACAACC" );
+        }
+
+        NodeGU n2 = graph.debugBuildNode ((char*)"TGGTTGTTGAACTAGATGACA"); // part of the tip
+
+        neighbors = graph.neighborsEdge(n2, DIR_INCOMING);
+        CPPUNIT_ASSERT (neighbors.size() == 1);
+            // disabled because GraphU cannot print an unitig inside
+            /* 
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "TTGGTTGTTGAACTAGATGAC" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="TGGTTGTTGAACTAGATGACA");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "TTGGTTGTTGAACTAGATGAC" );
+        }
+        */    
+    }
+
+    void debruijn_unitigs_test12_normal_min() // shouldn't have a problem here, but just to ensure, same as test12 but with normal minimizer size
+    {
+        //>works well for k=21; part of genome10K.fasta
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings (
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC",
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the tip
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG" //>remaining part
+            ,(char*)0),
+                "-kmer-size 21  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -nb-cores 1", MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"TGTCATCTAGTTCAACAACCA"); // part of the tip
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1, DIR_INCOMING);
+        CPPUNIT_ASSERT (neighbors.size() == 1);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "GTGTCATCTAGTTCAACAACC" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="TGTCATCTAGTTCAACAACCA");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "GTGTCATCTAGTTCAACAACC" );
+        }
+    }
+
+    void debruijn_unitigs_test14() // that neighbors without a direction may return correct degree but not correct number of nodes ?! false alert, but still, i'm keeping that test.
+    {
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings (
+        "AAGAGCCCGCTTATCCGGTGGTGATACCTAC",
+        "AGAGCCCGCTTATCCGGTGGTGATACCTACC"
+            ,(char*)0),
+                "-kmer-size 31  -abundance-min 1  -verbose 0 -max-memory %d -out dummy -nb-cores 1", MAX_MEMORY);
+
+        NodeGU n1 = graph.debugBuildNode ((char*)"AGAGCCCGCTTATCCGGTGGTGATACCTACC"); // 
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1);
+        CPPUNIT_ASSERT (neighbors.size() == 1);
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            EdgeGU& edge = neighbors[i];
+
+            if (graph.toString(edge.to) != "AAGAGCCCGCTTATCCGGTGGTGATACCTAC" ) 
+                std::cout << std::endl << "anticipation of assert fail, from: " <<  graph.toString(edge.from) << " to: " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (edge.direction==DIR_INCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="AGAGCCCGCTTATCCGGTGGTGATACCTACC");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  == "AAGAGCCCGCTTATCCGGTGGTGATACCTAC" );
+        }
+    }
+
+
+
+
+
+    /********************************************************************************/
+    void debruijn_unitigs_test13 ()
+    {
+        size_t   readSize = 80;
+        u_int8_t coverage = 5;
+        size_t   kmerSize = 31;
+        size_t   nks      = coverage;
+
+        const char* seq =
+            "GAATTCCAGGAGGACCAGGAGAACGTCAATCCCGAGAAGGCGGCGCCCGCCCAGCAGCCCCGGACCCGGGCTGGACTGGC"
+            "GGTACTGAGGGCCGGAAACTCGCGGGGTCCAGCTCCCCAGAGGCCTAAGACGCGACGGGTTGCACCTCTTAAGGATCTTC"
+            "CTATAAATGATGAGTATGTCCCTGTTCCTCCCTGGAAAGCAAACAATAAACAGCCTGCATTTACCATACATGTGGATGAA"
+            "GCAGAAGAAATTCAAAAGAGGCCAACTGAATCTAAAAAATCAGAAAGTGAAGATGTCTTGGCCTTTAATTCAGCTGTTAC"
+            "TTTACCAGGACCAAGAAAGCCACTGGCACCTCTTGATTACCCAATGGATGGTAGTTTTGAGTCTCCACATACTATGGAAA"
+            "TGTCAGTTGTATTGGAAGATGAAAAGCCAGTGAGTGTTAATGAAGTACCAGACTACCATGAGGACATTCACACGTACCTT"
+            "AGGGAAATGGAGGTTAAATGTAAGCCTAAAGTGGGTTACATGAAGAAACAGCCAGACATTACTAACAGTATGAGGGCTAT"
+            "CCTCGTGGACTGGTTAGTTGAAGTAGGAGAAGAATATAAACTGCAGAACGAGACCCTGCATTTGGCTGTGAACTACATTG"
+            "ATAGGTTTCTTTCATCCATGTCTGTGTTGAGAGGAAAACTTCAACTTGTGGGCACTGCTGCTATGCTTTTAGCCTCAAAG"
+            "TTTGAAGAGATATACCCGCCAGAAGTAGCAGAGTTTGTATACATTACAGATGACACTTATACCAAGAAACAAGTTCTAAG"
+            "GATGGAGCACCTAGTCTTGAAAGTCCTGGCTTTTGACTTAGCTGCACCAACAATAAATCAGTTTCTTACCCAGTACTTTT"
+            "TGCATCAGCAGCCTGCAAACTGCAAAGTTGAAAGTTTAGCAATGTTTTTGGGAGAGTTAAGTTTGATAGATGCTGACCCA"
+            "TATCTAAAGTATTTGCCGTCAGTTATCGCTGCAGCAGCCTTTCATTTAGCACTCTACACAGTCACAGGACAAAGCTGGCC"
+            "TGAATCATTAGTACAGAAGACTGGATATACTCTGGAAACTCTAAAGCCTTGTCTCCTGGACCTTCACCAGACCTACCTCA"
+            "GAGCACCACAGCACGCACAACAGTCAATAAGAGAGAAGTACAAAAATTCAAAGTATCATGGTGTTTCTCTCCTCAACCCA"
+            "CCAGAGACACTAAATGTGTAACAGTGAAAAGACTGCCTTTGTTTTCTAAGACTGTAAATCACATGCAATGTATATGGTGT"
+            "ACAGATTTTATCTTAGGTTTTAATTTTACAACATTTCTGAATAAGAAGAGTTATGGTCCAGTACAAATTATGGTATCTAT"
+            "TACTTTTTAAATGGTTTTAATTTGTATATCTTTTGTAAATGTAACTATCTTAGATATTTGGCTAATTTTAAGTGGTTTCT";
+
+        // We create a bank of reads from a given long sequence
+        IBank* bank = new BankSplitter (new BankStrings (seq, NULL), readSize, kmerSize-1, coverage);
+
+        // We create the graph.
+        GraphUnitigs graph = GraphUnitigs::create (bank,  "-kmer-size %d  -abundance-min %d  -verbose 0  -max-memory %d", kmerSize, nks, MAX_MEMORY);
+
+        // We check we got the correct number of solid kmers.
+        CPPUNIT_ASSERT (graph.getInfo().getInt ("kmers_nb_solid") == (int) (strlen(seq) - kmerSize + 1));
+
+    }
+
+    /********************************************************************************/
+    struct debruijn_unitigs_build_entry
+    {
+        debruijn_unitigs_build_entry () : nbNodes(0), nbBranchingNodes(0) {}
+        size_t  nbNodes;
+        Integer checksumNodes;
+        size_t  nbBranchingNodes;
+        Integer checksumBranchingNodes;
+    };
+
+    debruijn_unitigs_build_entry debruijn_unitigs_build_aux_aux (IBank* inputBank, bool checkNodes, bool checkBranching)
+    {
+        debruijn_unitigs_build_entry result;
+
+        /** We load the graph. */
+        GraphUnitigs graph = GraphUnitigs::create (inputBank,  "-kmer-size 31 -out %s -abundance-min 1  -verbose 0  -max-memory %d",                        "dummy", MAX_MEMORY);
+
+        if (checkNodes)
+        {
+            GraphIterator<NodeGU> iterNodes = graph.iterator();
+            for (iterNodes.first(); !iterNodes.isDone(); iterNodes.next())
+            { result.nbNodes++; /*result.checksumNodes = iterNodes.item().kmer + result.checksumNodes; */ /* disabled because of unsupported largeint operation apparently! */ }
+        }
+
+        if (checkBranching)
+        {
+        }
+
+        return result;
+    }
+
+    /********************************************************************************/
+    void debruijn_unitigs_build_aux (const char* sequences[], size_t nbSequences)
+    {
+        // We build the bank
+        IBank* inputBank = new BankStrings (sequences, nbSequences);
+        LOCAL (inputBank);
+
+        debruijn_unitigs_build_entry r1 = debruijn_unitigs_build_aux_aux (inputBank, true,  true);
+    }
+
+    /********************************************************************************/
+    void debruijn_unitigs_build ()
+    {
+        const char* sequences[] =
+        {
+            "GAATTCCAGGAGGACCAGGAGAACGTCAATCCCGAGAAGGCGGCGCCCGCCCAGCAGCCCCGGACCCGGGCTGGACTGGC",
+            "GGTACTGAGGGCCGGAAACTCGCGGGGTCCAGCTCCCCAGAGGCCTAAGACGCGACGGGTTGCACCTCTTAAGGATCTTC",
+            "CTATAAATGATGAGTATGTCCCTGTTCCTCCCTGGAAAGCAAACAATAAACAGCCTGCATTTACCATACATGTGGATGAA",
+            "GCAGAAGAAATTCAAAAGAGGCCAACTGAATCTAAAAAATCAGAAAGTGAAGATGTCTTGGCCTTTAATTCAGCTGTTAC",
+            "TTTACCAGGACCAAGAAAGCCACTGGCACCTCTTGATTACCCAATGGATGGTAGTTTTGAGTCTCCACATACTATGGAAA",
+            "TGTCAGTTGTATTGGAAGATGAAAAGCCAGTGAGTGTTAATGAAGTACCAGACTACCATGAGGACATTCACACGTACCTT",
+            "AGGGAAATGGAGGTTAAATGTAAGCCTAAAGTGGGTTACATGAAGAAACAGCCAGACATTACTAACAGTATGAGGGCTAT",
+            "CCTCGTGGACTGGTTAGTTGAAGTAGGAGAAGAATATAAACTGCAGAACGAGACCCTGCATTTGGCTGTGAACTACATTG",
+            "ATAGGTTTCTTTCATCCATGTCTGTGTTGAGAGGAAAACTTCAACTTGTGGGCACTGCTGCTATGCTTTTAGCCTCAAAG",
+            "TTTGAAGAGATATACCCGCCAGAAGTAGCAGAGTTTGTATACATTACAGATGACACTTATACCAAGAAACAAGTTCTAAG",
+            "GATGGAGCACCTAGTCTTGAAAGTCCTGGCTTTTGACTTAGCTGCACCAACAATAAATCAGTTTCTTACCCAGTACTTTT",
+            "TGCATCAGCAGCCTGCAAACTGCAAAGTTGAAAGTTTAGCAATGTTTTTGGGAGAGTTAAGTTTGATAGATGCTGACCCA",
+            "TATCTAAAGTATTTGCCGTCAGTTATCGCTGCAGCAGCCTTTCATTTAGCACTCTACACAGTCACAGGACAAAGCTGGCC",
+            "TGAATCATTAGTACAGAAGACTGGATATACTCTGGAAACTCTAAAGCCTTGTCTCCTGGACCTTCACCAGACCTACCTCA",
+            "GAGCACCACAGCACGCACAACAGTCAATAAGAGAGAAGTACAAAAATTCAAAGTATCATGGTGTTTCTCTCCTCAACCCA",
+            "CCAGAGACACTAAATGTGTAACAGTGAAAAGACTGCCTTTGTTTTCTAAGACTGTAAATCACATGCAATGTATATGGTGT",
+            "ACAGATTTTATCTTAGGTTTTAATTTTACAACATTTCTGAATAAGAAGAGTTATGGTCCAGTACAAATTATGGTATCTAT",
+            "TACTTTTTAAATGGTTTTAATTTGTATATCTTTTGTAAATGTAACTATCTTAGATATTTGGCTAATTTTAAGTGGTTTCT"
+        };
+
+        debruijn_unitigs_build_aux (sequences, ARRAY_SIZE(sequences));
+    }
+
+    /********************************************************************************/
+
+    void debruijn_unitigs_traversal1_aux_aux (bool useCopyTerminator, size_t kmerSize, const char** seqs, size_t seqsSize,
+		TraversalKind traversalKind, const char* checkStr
+	)
+    {
+        // We create a fake bank with a SNP
+        IBank* bank = new BankStrings (seqs, seqsSize);
+
+        // We load the graph
+        GraphUnitigs graph = GraphUnitigs::create (bank, "-abundance-min 1  -verbose 0  -kmer-size %d  -max-memory %d",
+			kmerSize, MAX_MEMORY);
+
+        // We create a Terminator object
+        MPHFTerminatorTemplate<NodeGU,EdgeGU,GraphUnitigs> terminator (graph);
+
+		// We create a node from the start of the first sequence
+		NodeGU node = graph.debugBuildNode (seqs[0]);
+
+        Path_t<NodeGU> path;
+
+        // We create a Traversal instance according to the chosen traversal kind
+        TraversalTemplate<NodeGU,EdgeGU,GraphUnitigs>* traversal = TraversalTemplate<NodeGU,EdgeGU,GraphUnitigs>::create (traversalKind, graph, terminator);
+        LOCAL (traversal);
+
+        traversal->traverse (node, DIR_OUTCOMING, path);
+
+
+        stringstream ss;  ss << graph.toString (node) << path ;
+        CPPUNIT_ASSERT (ss.str().compare(checkStr)==0);
+    }
+
+    void debruijn_unitigs_traversal1_aux (bool useCopyTerminator)
+    {
+        const char* seqs[] =
+        {
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA",
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCGATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            //      SNP HERE at pos 31      x
+        };
+
+    	debruijn_unitigs_traversal1_aux_aux (useCopyTerminator, 15, seqs, ARRAY_SIZE(seqs), TRAVERSAL_UNITIG,
+			"CGCTACAGCAGCTAGTTCATCATTGTTTATC"
+		);
+
+    	debruijn_unitigs_traversal1_aux_aux (useCopyTerminator, 15, seqs, ARRAY_SIZE(seqs), TRAVERSAL_CONTIG,
+			"CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+		);
+    }
+
+    void debruijn_unitigs_traversal1 ()
+    {
+    	debruijn_unitigs_traversal1_aux (false);
+    }
+
+
+
+
+    /********************************************************************************/
+    void debruijn_unitigs_deletenode_fct (GraphUnitigs& graph) 
+    {
+        NodeGU n1 = graph.debugBuildNode ((char*)"AGGCG");
+        //NodeGU n2 = graph.debugBuildNode ((char*)"GGCGC"); // hum it's the same as n3..
+        NodeGU n3 = graph.debugBuildNode ((char*)"GCGCC");
+
+        graph.deleteNode(n3);
+
+        /** We get all possible edges from the current kmer (note: not from the current node). */
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1);
+
+        CPPUNIT_ASSERT (neighbors.size()==0);
+    }
+
+    void debruijn_unitigs_deletenode ()
+    {
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGCC", "ACTGACTGACTGACTG",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d", MAX_MEMORY);
+
+        debruijn_unitigs_deletenode_fct (graph);
+    }
+
+    void debruijn_unitigs_deletenode2_fct (GraphUnitigs& graph) 
+    {
+        NodeGU n1 = graph.debugBuildNode ((char*)"AGGCG");
+        NodeGU n2 = graph.debugBuildNode ((char*)"GGCGA");
+
+        graph.deleteNode(n2);
+
+        /** We get all possible edges from the current kmer (note: not from the current node). */
+        GraphVector<EdgeGU> neighbors = graph.neighborsEdge(n1);
+
+        std::cout<<"unfinished test" << std::endl;
+    return; // TODO: finish it;
+
+        CPPUNIT_ASSERT (neighbors.size()==0);
+
+        for (size_t i=0; i<neighbors.size(); i++)
+        {
+            /** Shortcut. */
+            EdgeGU& edge = neighbors[i];
+
+            if (neighbors.size() != 1) 
+                std::cout << "anticipation of assert fail: neighbors size of n1 " << neighbors.size() << std::endl;
+            if (graph.toString(edge.to) != "GGCGC") 
+                std::cout << "anticipation of assert fail: graph.toString(edge.to) = " << graph.toString(edge.to) << std::endl;
+
+            CPPUNIT_ASSERT (neighbors.size()==1);
+            CPPUNIT_ASSERT (edge.direction==DIR_OUTCOMING);
+            CPPUNIT_ASSERT (graph.toString(edge.from)=="AGGCG");
+            CPPUNIT_ASSERT (graph.toString(edge.to)  =="GGCGC");
+        }
+    }
+
+    void debruijn_unitigs_deletenode2 ()
+    {
+        GraphUnitigs graph = GraphUnitigs::create (new BankStrings ("AGGCGAAGGCGT", "ACTGACTGACTGACTG",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d -nb-cores 1", MAX_MEMORY);
+
+        debruijn_unitigs_deletenode_fct (graph);
+
+        /* rerun this test with adjacency information instead of bloom */
+        
+        GraphUnitigs graph2 = GraphUnitigs::create (new BankStrings ("AGGCGAAGGCGT", "ACTGACTGACTGACTG",(char*)0),  "-kmer-size 5  -abundance-min 1  -verbose 0  -max-memory %d -nb-cores 1", MAX_MEMORY);
+        graph2.precomputeAdjacency(1, false);
+        
+        debruijn_unitigs_deletenode2_fct (graph2);
+    }
+
+
+
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestDebruijnUnitigs);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestDebruijnUnitigs);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/debruijn/TestSimplifications.cpp b/gatb-core/test/unit/src/debruijn/TestSimplifications.cpp
new file mode 100644
index 0000000..3831bc7
--- /dev/null
+++ b/gatb-core/test/unit/src/debruijn/TestSimplifications.cpp
@@ -0,0 +1,363 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/Graph.hpp>
+#include <gatb/debruijn/impl/Simplifications.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+extern std::string DBPATH (const string& a);
+
+#define DEBUGprint(a) a
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestSimplifications : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestSimplifications);
+        CPPUNIT_TEST_GATB (debruijn_simpl_X);
+        CPPUNIT_TEST_GATB (debruijn_simpl_tip);
+        CPPUNIT_TEST_GATB (debruijn_simpl_bubble);
+        CPPUNIT_TEST_GATB (debruijn_simpl_ec);
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+    static const u_int64_t MAX_MEMORY = 1000;
+
+   /********************************************************************************/
+    struct debruijn_build_entry
+    {
+        debruijn_build_entry () : nbNodes(0), nbNonDeletedNodes(0), nbBranchingNodes(0) {}
+        size_t  nbNodes;
+        size_t  nbNonDeletedNodes;
+        Integer checksumNodes;
+        size_t  nbBranchingNodes;
+        Integer checksumBranchingNodes;
+    };
+
+    debruijn_build_entry debruijn_stats (Graph& graph, bool checkNodes, bool checkBranching)
+    {
+        debruijn_build_entry result;
+
+        result.nbNodes = 0; result.nbNonDeletedNodes = 0; result.nbBranchingNodes = 0;
+
+        if (checkNodes)
+        {
+            GraphIterator<Node> iterNodes = graph.iterator();
+            for (iterNodes.first(); !iterNodes.isDone(); iterNodes.next())
+            { result.nbNodes++; result.checksumNodes += iterNodes.item().kmer; 
+            
+              if (! graph.isNodeDeleted(*iterNodes)) 
+              {
+                    result.nbNonDeletedNodes++;
+                    //std::cout << "non deleted node: " << graph.toString(*iterNodes) << std::endl;
+              }
+            }
+        }
+
+        if (checkBranching)
+        {
+            GraphIterator<BranchingNode> iterBranchingNodes = graph.iteratorBranching();
+            for (iterBranchingNodes.first(); !iterBranchingNodes.isDone(); iterBranchingNodes.next())
+            { result.nbBranchingNodes++; result.checksumBranchingNodes += iterBranchingNodes.item().kmer; }
+        }
+
+        return result;
+    }
+
+    /********************************************************************************/
+    void debruijn_build (const char* sequences[], size_t nbSequences, int k, Graph& graph, debruijn_build_entry& r)
+    {
+        // We build the bank
+        graph = Graph::create (new BankStrings (sequences, nbSequences),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d", k , MAX_MEMORY);
+
+        r = debruijn_stats (graph, true,  true);
+    }
+
+    void debruijn_traversal (Graph& graph, string startSeq ,const char* checkStr)
+    {
+        TraversalKind traversalKind=TRAVERSAL_UNITIG; /* setting traversal=CONTIG doesn't make sense anymore, it was for miniav1 */
+
+        // We create a Terminator object
+        BranchingTerminator terminator (graph);
+
+		// We create a node from the start of the first sequence
+        string startKmer = startSeq.substr(0, graph._kmerSize);
+		Node node = graph.buildNode (startKmer.c_str());
+
+        Path path;
+
+        // We create a Traversal instance according to the chosen traversal kind
+        Traversal* traversal = Traversal::create (traversalKind, graph, terminator);
+        LOCAL (traversal);
+
+        traversal->traverse (node, DIR_OUTCOMING, path);
+
+        stringstream ss;  ss << graph.toString (node) << path ;
+        //DEBUGprint(std::cout << "result of traversal: " << ss.str() << std::endl;)
+        CPPUNIT_ASSERT (ss.str().compare(checkStr)==0);
+    }
+
+    /********************************************************************************/
+
+    /********************************************************************************/
+    void debruijn_simpl_X ()
+    {
+        size_t kmerSize = 5;
+
+        const char* sequences[] =
+        {
+            // it's a classical X for k=5 (node-centric): 1 and 2 go to 3, 3 go to 4 and 5;
+            "AAAAA",
+            "CCCCAAG",
+            "AAACAAG",
+            "CAAGA",
+            "AAGAAGC",
+            "AAGACCC"
+        };
+
+        // We create the graph.
+        Graph graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        CPPUNIT_ASSERT (r.nbNodes == 14);
+        if (r.nbNonDeletedNodes != 14)
+            std::cout << "ancipating failed assert: nbNonDeletedNodes = " << r.nbNonDeletedNodes << " != 14" << std::endl;
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 14);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+        r = debruijn_stats (graph, true,  true);
+        //std::cout << "nb nodes:" << r.nbNodes << std::endl;
+        CPPUNIT_ASSERT (r.nbNodes == 14);
+        if (r.nbNonDeletedNodes != 2)
+            std::cout << "ancipating failed assert: nbNonDeletedNodes = " << r.nbNonDeletedNodes << " != 14" << std::endl;
+
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 2); // only two nodes remaining: AAAAA and CAAGA
+        
+   }
+
+    void debruijn_simpl_tip ()
+    {
+        size_t kmerSize = 21;
+
+        const char* sequences[] =
+        {
+            //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC",
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the tip
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG" //>remaining part
+        };
+
+        // We create the graph.
+        Graph graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        //std::cout << "nb nodes:" << r.nbNodes << std::endl;
+        CPPUNIT_ASSERT (r.nbNodes == 624);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 624);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+        r = debruijn_stats (graph, true,  true);
+        //std::cout << "nb nodes post simp:" << r.nbNodes << std::endl;
+        //std::cout << "nb non deleted nodes post simp:" << r.nbNonDeletedNodes << std::endl;
+        CPPUNIT_ASSERT (r.nbNodes == 624);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 617);
+
+        debruijn_traversal (graph, sequences[0], "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACA [...]
+    }
+
+
+    /********************************************************************************/
+
+
+    void debruijn_simpl_bubble ()
+    {
+        size_t kmerSize = 21;
+
+        const char* sequences[] =
+        {
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble  (highly covered)
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2, low covered
+            "CGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACAAA" // >remaining part
+        };
+
+        // We create the graph.
+        Graph graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        //DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 634);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 634);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+        r = debruijn_stats (graph, true,  true);
+        //DEBUGprint(std::cout << "nb nodes post simp:" << r.nbNodes << std::endl;)
+        //DEBUGprint(std::cout << "nb non deleted nodes post simp:" << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 634);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 613);
+
+        debruijn_traversal (graph, sequences[0], "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCT [...]
+    }
+
+
+    void debruijn_simpl_ec ()
+    {
+        size_t kmerSize = 21;
+
+        const char* sequences[] =
+        {
+            // from ec.fa in minia/tests
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the EC
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", /* >contig that  [...]
+*/
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+    
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC" // >contig that i [...]
+
+        };
+
+        // We create the graph.
+        Graph graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        //DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 1063);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 1063);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+        r = debruijn_stats (graph, true,  true);
+        //DEBUGprint(std::cout << "nb nodes post simp:" << r.nbNodes << std::endl;)
+        //DEBUGprint(std::cout << "nb non deleted nodes post simp:" << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 1063);
+        if (r.nbNonDeletedNodes != 1057)
+            std::cout << " in anticipation of assert fail, r.nbNonDeletedNodes = " << r.nbNonDeletedNodes << std::endl;
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 1057);
+
+        debruijn_traversal (graph, sequences[0], "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACA [...]
+        debruijn_traversal (graph, sequences[3], "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTG [...]
+    }
+
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestSimplifications);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestSimplifications);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/debruijn/TestSimplificationsUnitigs.cpp b/gatb-core/test/unit/src/debruijn/TestSimplificationsUnitigs.cpp
new file mode 100644
index 0000000..0b1f43f
--- /dev/null
+++ b/gatb-core/test/unit/src/debruijn/TestSimplificationsUnitigs.cpp
@@ -0,0 +1,421 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/StringsRepository.hpp>
+#include <gatb/tools/misc/impl/TimeInfo.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/debruijn/impl/GraphUnitigs.hpp>
+#include <gatb/debruijn/impl/Simplifications.hpp>
+#include <gatb/debruijn/impl/Terminator.hpp>
+#include <gatb/debruijn/impl/Traversal.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/bank/impl/BankSplitter.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <iostream>
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::debruijn;
+using namespace gatb::core::debruijn::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+extern std::string DBPATH (const string& a);
+
+#define DEBUGprint(a) //a
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestSimplificationsUnitigs : public Test
+{
+    typedef gatb::core::debruijn::impl::GraphUnitigsTemplate<32> GraphUnitigs;
+
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestSimplificationsUnitigs);
+        CPPUNIT_TEST_GATB (debruijn_simplunitigs_ec);
+        CPPUNIT_TEST_GATB (debruijn_simplunitigs_X);
+        CPPUNIT_TEST_GATB (debruijn_simplunitigs_tip);
+        CPPUNIT_TEST_GATB (debruijn_simplunitigs_bubble);
+        CPPUNIT_TEST_GATB (debruijn_simplunitigs_bubble_snp);
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+    static const u_int64_t MAX_MEMORY = 1000;
+
+   /********************************************************************************/
+    struct debruijn_build_entry
+    {
+        debruijn_build_entry () : nbNodes(0), nbNonDeletedNodes(0), nbBranchingNodes(0) {}
+        size_t  nbNodes;
+        size_t  nbNonDeletedNodes;
+        Integer checksumNodes;
+        size_t  nbBranchingNodes;
+        Integer checksumBranchingNodes;
+    };
+
+    debruijn_build_entry debruijn_stats (GraphUnitigs& graph, bool checkNodes, bool checkBranching)
+    {
+        debruijn_build_entry result;
+
+        result.nbNodes = 0; result.nbNonDeletedNodes = 0; result.nbBranchingNodes = 0;
+
+        if (checkNodes)
+        {
+            GraphIterator<NodeGU> iterNodes = graph.iterator();
+            for (iterNodes.first(); !iterNodes.isDone(); iterNodes.next())
+            { result.nbNodes++; /*result.checksumNodes += iterNodes.item().kmer; */
+            
+              if (! graph.isNodeDeleted(*iterNodes)) 
+              {
+                    result.nbNonDeletedNodes++;
+                    //std::cout << "non deleted node: " << graph.toString(*iterNodes) << std::endl;
+              }
+            }
+        }
+
+        return result;
+    }
+
+    /********************************************************************************/
+    void debruijn_build (const char* sequences[], size_t nbSequences, int k, GraphUnitigs& graph, debruijn_build_entry& r)
+    {
+        // We build the bank
+        graph = GraphUnitigs::create (new BankStrings (sequences, nbSequences),  "-kmer-size %d  -abundance-min 1  -verbose 0  -max-memory %d -nb-cores 1 -minimizer-size 3" /*because some of kmer sizes are 5*/, k , MAX_MEMORY);
+
+        r = debruijn_stats (graph, true,  true);
+    }
+
+    static 
+        char revcomp (char s) {
+            if (s == 'A') return 'T';
+            else if (s == 'C') return 'G';
+            else if (s == 'G') return 'C';
+            else if (s == 'T') return 'A';
+            else if (s == 'a') return 't';
+            else if (s == 'c') return 'g';
+            else if (s == 'g') return 'c';
+            else if (s == 't') return 'a';
+            return 'X';
+        }
+
+    static string revcomp (const string &s) {
+        string rc;
+        for (signed int i = s.length() - 1; i >= 0; i--) {rc += revcomp(s[i]);}
+        return rc;
+    }
+
+    void debruijn_traversal (GraphUnitigs& graph, string startSeq ,const char* checkStr, const char *checkStr2 = nullptr)
+    {
+
+        string startKmer = startSeq.substr(0, graph._kmerSize);
+		NodeGU node = graph.debugBuildNode(startKmer);
+
+        bool isolatedLeft, isolatedRight;
+        float coverage = 0;
+        string sequence = graph.simplePathBothDirections(node, isolatedLeft, isolatedRight, true, coverage);
+        string rev_seq = revcomp(sequence);
+
+        if ((sequence.compare(checkStr) != 0 && rev_seq.compare(checkStr) != 0 && checkStr2 == nullptr) || 
+                (checkStr2 != nullptr && (sequence.compare(checkStr2) != 0 && rev_seq.compare(checkStr2) != 0)))
+        {
+            std::cout << "anticipation of checkStr failing, sequence: " << sequence << " checkStr: " << checkStr << std::endl;
+		    graph.debugPrintAllUnitigs();
+        }
+
+        CPPUNIT_ASSERT ((sequence.compare(checkStr)==0 || rev_seq.compare(checkStr) == 0) \
+           || (checkStr2 != nullptr && (sequence.compare(checkStr2) == 0 || rev_seq.compare(checkStr2) == 0)) );
+    }
+
+    /********************************************************************************/
+
+    /********************************************************************************/
+    void debruijn_simplunitigs_X ()
+    {
+        size_t kmerSize = 5;
+
+        const char* sequences[] =
+        {
+            // it's a classical X for k=5 (node-centric): 1 and 2 go to 3, 3 go to 4 and 5;
+            "AAAAA",
+            "CCCCAAG",
+            "AAACAAG",
+            "CAAGA",
+            "AAGAAGC",
+            "AAGACCC"
+        };
+
+        // We create the graph.
+        GraphUnitigs graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+    
+        CPPUNIT_ASSERT (r.nbNodes == 10);
+        if (r.nbNonDeletedNodes != 10)
+            std::cout << "ancipating failed assert: nbNonDeletedNodes = " << r.nbNonDeletedNodes << " != 14" << std::endl;
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 10);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+        r = debruijn_stats (graph, true,  true);
+        DEBUGprint(std::cout << "post simp:" << std::endl;)
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 2);
+        if (r.nbNonDeletedNodes != 2)
+            std::cout << "ancipating failed assert: nbNonDeletedNodes = " << r.nbNonDeletedNodes << " != 14" << std::endl;
+
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 2); // only two nodes remaining: AAAAA and CAAGA
+        
+   }
+
+    void debruijn_simplunitigs_tip ()
+    {
+        size_t kmerSize = 21;
+
+        const char* sequences[] =
+        {
+            //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC",
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the tip
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG" //>remaining part
+        };
+
+        // We create the graph.
+        GraphUnitigs graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 6); // should now be identical because GraphUnitigs doesn't iterate on deleted nodes anymore
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 6);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+        r = debruijn_stats (graph, true,  true);
+        DEBUGprint(std::cout << "post simp:" << std::endl;)
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 4);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 4);
+
+        debruijn_traversal (graph, sequences[0], "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACA [...]
+    }
+
+
+    /********************************************************************************/
+
+
+    void debruijn_simplunitigs_bubble_aux (const char* sequences[], int nb_seqs, const char* sol1, const char* sol2=nullptr)
+    {
+        size_t kmerSize = 21;
+
+        // We create the graph.
+        GraphUnitigs graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, nb_seqs, kmerSize, graph, r);
+
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 8);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 8);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        r = debruijn_stats (graph, true,  true);
+        DEBUGprint(std::cout << "post simp:" << std::endl;)
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 6);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 6);
+
+        if (0) // do a useless second pass
+        {
+            // simplify it
+            graph.simplify(1, false); // one core, no verbose
+
+
+            // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+            r = debruijn_stats (graph, true,  true);
+            //
+            DEBUGprint(std::cout << "post simp-again:" << std::endl;)
+                DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+                CPPUNIT_ASSERT (r.nbNodes == 8);
+            CPPUNIT_ASSERT (r.nbNonDeletedNodes == 6);
+        }
+
+        debruijn_traversal (graph, sequences[0], sol1, sol2);
+    }
+
+    void debruijn_simplunitigs_bubble ()
+    {
+ 
+        const char* sequences[] =
+        {
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble  (highly covered)
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2, low covered
+            "CGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACAAA" // >remaining part
+        };
+        const char* sol = "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACC [...]
+    
+        debruijn_simplunitigs_bubble_aux(sequences, ARRAY_SIZE(sequences),sol);
+    }
+
+    void debruijn_simplunitigs_bubble_snp()
+    {
+        const char* sequences[] =
+        {
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGT", //>that's the bubble
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2, same coverage
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2,
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2, 
+            "TGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGT", //>that's the bubble path 2, 
+            "CGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACAAA" // >remaining part
+        };
+        const char* sol1 = "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCAAAATAACGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCAC [...]
+        const char* sol2 = "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCAAAAAAACGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCAC [...]
+
+        debruijn_simplunitigs_bubble_aux(sequences, ARRAY_SIZE(sequences), sol1, sol2);
+ 
+    }
+ 
+
+    void debruijn_simplunitigs_ec ()
+    {
+        size_t kmerSize = 21;
+
+        const char* sequences[] =
+        {
+            // from ec.fa in minia/tests
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCAAAAAAA", //>that's the EC
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", /* >contig that  [...]
+*/
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACC", //>works well for k=21; part of genome10K.fasta
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+            "TGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACACCCTTAAGTACCGAACGATAGAGCACCCGTCTAGGAGGGCGTGCAGGGTCTCCCGCTAGCTAATGGTCACGGCCTCTCTGGGAAAGCTGAACAACGGATGATACCCATACTGCCACTCCAGTACCTGGGCCGCGTGTTGTACGCTGTGTATCTTGAGAGCGTTTCCAGCAGATAGAACAGGATCACATGTACATG", // >remaining part
+    
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC", // >contig that  [...]
+            "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTGCCCATCCGAGGCTTAAGC" // >contig that i [...]
+
+        };
+
+        // We create the graph.
+        GraphUnitigs graph;
+        debruijn_build_entry r;
+        debruijn_build(sequences, ARRAY_SIZE(sequences), kmerSize, graph, r);
+
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 10);
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 10);
+
+        // simplify it
+        graph.simplify(1, false); // one core, no verbose
+
+
+        // how many nodes left? should be as many as initially. it's a negative test: graph shouldn't be simplified
+        r = debruijn_stats (graph, true,  true);
+        DEBUGprint(std::cout << "post simp:" << std::endl;)
+        DEBUGprint(std::cout << "nb nodes:" << r.nbNodes << "nb nodes non deleted " << r.nbNonDeletedNodes << std::endl;)
+        CPPUNIT_ASSERT (r.nbNodes == 8);
+        if (r.nbNonDeletedNodes != 8)
+            std::cout << " in anticipation of assert fail, r.nbNonDeletedNodes = " << r.nbNonDeletedNodes << std::endl;
+        CPPUNIT_ASSERT (r.nbNonDeletedNodes == 8);
+
+        debruijn_traversal (graph, sequences[0], "CATCGATGCGAGACGCCTGTCGCGGGGAATTGTGGGGCGGACCACGCTCTGGCTAACGAGCTACCGTTTCCTTTAACCTGCCAGACGGTGACCAGGGCCGTTCGGCGTTGCATCGAGCGGTGTCGCTAGCGCAATGCGCAAGATTTTGACATTTACAAGGCAACATTGCAGCGTCCGATGGTCCGGTGGCCTCCAGATAGTGTCCAGTCGCTCTAACTGTATGGAGACCATAGGCATTTACCTTATTCTCATCGCCACGCCCCAAGATCTTTAGGACCCAGCATTCCTTTAACCACTAACATAACGCGTGTCATCTAGTTCAACAACCGTTATGCCGTCCGACTCTTGCGCTCGGATGTCCGCAATGGGTTATCCCTATGTTCCGGTAATCTCTCATCTACTAAGCGCCCTAAAGGTCGTATGGTTGGAGGGCGGTTACACA [...]
+        debruijn_traversal (graph, sequences[3], "GGTGAACAGCACATCTTTTCGTCCTGAGGCCATATTAATTCTACTCAGATTGTCTGTAACCGGAGCTTCGGGCGTATTTTTGCGTAAGACACTGCCTAAAGGGAACATATGTGTCCAGAATAGGGTTCAACGGTGTATGAGCAAACTAGTTCAACAACCAAAAAAATTGTGTGCAAGCTACTTCTAGACCTTATTAAGTGCCCAGGAATTCCTAGGAAGGCGCGCAGCTCAAGCAATCATACATGGCGGAATGCCTGTCCACCGGGGGTTCTACTGTACCACAGTGGCCTGGATAGCTAAGCAGGTCCTGGATTGGCATGTCATCCGGAGTGATAGGCACTGCTCACGACCAGCTTGCGGACAAACGGGGTGCCCGCGCCTGCGTCCGGTAGACGAGCGATGGATTTAGACCGTTCACTGAACCCTCTAATAGGACCTCTTG [...]
+    }
+
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestSimplificationsUnitigs);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestSimplificationsUnitigs);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/kmer/TestDSK.cpp b/gatb-core/test/unit/src/kmer/TestDSK.cpp
new file mode 100644
index 0000000..cca7029
--- /dev/null
+++ b/gatb-core/test/unit/src/kmer/TestDSK.cpp
@@ -0,0 +1,716 @@
+// TODO: this unit test isn't perfect. For k=121, a bug slipped through. one day, remember to code a test that covers the case of counting with large kmers.
+//
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/bank/impl/Bank.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+#include <gatb/tools/misc/impl/Histogram.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/tools/math/Integer.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <boost/variant.hpp>
+#include <boost/mpl/for_each.hpp>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** Backward compatibility. */
+static const int KSIZE_1 = KMER_SPAN(0);
+#define KSIZE_32 (KSIZE_LIST == 32)
+#if KSIZE_32
+#else
+static const int KSIZE_2 = KMER_SPAN(1);
+static const int KSIZE_3 = KMER_SPAN(2);
+#endif
+struct Functor_getValue : public boost::static_visitor<Integer>    {
+    template<typename T>  Integer operator() (const T& a) const  { return Integer(a.getValue());  }};
+
+/** We define our variant according to the number of defined kmer spans. */
+template<typename T>  struct ToKmerVariant  {  typedef typename Kmer<T::value>::Count type;  };
+typedef boost::make_variant_over<boost::mpl::transform<IntegerList, ToKmerVariant<boost::mpl::_> >::type >::type KmerVariant;
+
+/** \brief Test class for genomic databases management
+ */
+class TestDSK : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestDSK);
+
+        CPPUNIT_TEST_GATB (DSK_check1);
+        CPPUNIT_TEST_GATB (DSK_check2);
+        CPPUNIT_TEST_GATB (DSK_check3);
+        CPPUNIT_TEST_GATB (DSK_perBank1);
+        CPPUNIT_TEST_GATB (DSK_perBank2);
+        CPPUNIT_TEST_GATB (DSK_perBankKmer);
+        CPPUNIT_TEST_GATB (DSK_multibank);
+		 
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    static const CountNumber NKS_MAX = (CountNumber)(1<<30);  // can't use std::numeric_limits not available on old gcc
+
+    /********************************************************************************/
+    void setUp    () {}
+    void tearDown () {}
+
+
+        // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+        static const u_int64_t MAX_MEMORY = 1000;
+        
+       
+    /********************************************************************************/
+    void DSK_check1_aux (const char* sequences[], size_t nbSequences, size_t kmerSize, size_t nks, size_t checkNbSolids)
+    {
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();  LOCAL (params);
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<> dsk (new BankStrings (sequences, nbSequences), params);
+
+        /** We launch DSK. */
+        dsk.execute();
+
+        if ((int) checkNbSolids != dsk.getInfo()->getInt("kmers_nb_solid"))
+        {
+            std::cout << "problem with sequences " << sequences << " kmersize " << kmerSize << " nks " << nks << " expected " << checkNbSolids << " solids, had " << dsk.getInfo()->getInt("kmers_nb_solid") <<std::endl;
+
+        }
+        CPPUNIT_ASSERT ((int) checkNbSolids == dsk.getInfo()->getInt("kmers_nb_solid"));
+    }
+
+    /********************************************************************************/
+    void DSK_check1 ()
+    {
+        const char* s1 = "GATCCTCCCCAGGCCCCTACACCCAAT" ;
+
+        const char* seqs1[] =  { s1 };
+        DSK_check1_aux (seqs1, ARRAY_SIZE(seqs1), 27, 1, 1);
+        DSK_check1_aux (seqs1, ARRAY_SIZE(seqs1), 26, 1, 2);
+        DSK_check1_aux (seqs1, ARRAY_SIZE(seqs1), 27, 2, 0);
+        DSK_check1_aux (seqs1, ARRAY_SIZE(seqs1), 26, 2, 0);
+
+        const char* seqs2[] =  { s1, s1 };
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 27, 1, 1);
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 26, 1, 2);
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 27, 2, 1);
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 26, 2, 2);
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 27, 3, 0);
+        DSK_check1_aux (seqs2, ARRAY_SIZE(seqs2), 26, 3, 0);
+
+        const char* seqs3[] =  { s1, s1, s1};
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 27, 1, 1);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 26, 1, 2);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 27, 2, 1);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 26, 2, 2);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 27, 3, 1);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 26, 3, 2);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 27, 4, 0);
+        DSK_check1_aux (seqs3, ARRAY_SIZE(seqs3), 26, 4, 0);
+
+        const char* seqs4[] = {
+
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+            "ACTTAGATGTAAGATTTCGAAGACTTGGATGTAAACAACAAATAAGATAATAACCATAAAAATAGAAATG"
+            "AACGATATTAAAATTAAAAAATACGAAAAAACTAACACGTATTGTGTCCAATAAATTCGATTTGATAATT"
+            "AGGTAACAATTTAACGTTAAAACCTATTCTTTTATTATCCGAAAATCCGTCGTGGAATTTGTATTAGCTT"
+            "TTTTTCTACATTACCCGTTTGCGAGACAGGTGGGGTCAGACGTAGACGTAGTCTCTGGAGTCAAGACGAA"
+            "ATTTTACATTTCACAATTTCCTATAGGCCGAGCAAAATTTATTAAGAACCCACAGGCATCATTACGTTTT"
+            "CTTGCACAGAAGACTTCACGCTGAAGTCATTGGGCTATATTTCAACGAGACGTCTGTTGGTTTATAAAGG"
+            "GCTATATTTATACAAGAATAGGAGTATGGCAGTATGCTAGGCTGGTATGTAGTACGTATACCTCCTAAGC"
+            "CGAAAGGCAGTAAGTGACGATGTAATAGTTTTGAGGAAAATTACTTTTTCTGAATAATATTTTTATTTTT"
+            "GTTTGCATTTTGTTAAAATTATTTACTAAATTAATGATTCTCATATGTTTTTTCATAGATTTGATGAACT"
+            "ACTGTACCATCTGATTAGCGCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCA"
+            "CACAACATACGAGCCGGAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTACTCACATAATTG"
+            "CGTGCGCTCACTGCCCGCTTTCCAGTCGGAAACCTGTCGTGCCAGCTGCATTATTGATCCGCCACGCCCC"
+            "GGGGAAAGT",
+
+            "GTCTTCATTCAGCTGTTCTCATGATAACTAGTAATTCCTTGCTAACAATTTTTACTGAGTAGCAACCAAT"
+            "TAATGTTGCCAGAATTTCATAATTGAATTTGAATTTTTTATTTTTTCCTTGATTATGCTTCAAACTCTAT"
+            "GTAGTTATTTAGAGTCAATAATATTAAAGCAATCTTAATATTAACTCATTTATTTCTGATTGGCCATATT"
+            "TATTTAATTCTCAACAATAATAATGATAAGTATAATAATATATTTAACTTAATAACATTTTAATCATTTT"
+            "ATTTTTGTTTGTTGTGATTTTTGGACGTTGTGGTAAATAAGAAGTTTTAAGCTTATATTAATATGTTTTA"
+            "CTTTTTATTTCTTAATACGAATTTAATTACCTACCCATTATATTAAGTATATGTTTTGGAATTCTTTCTG"
+            "TAAAAATGTGTTTTAAATATTTTACACTTAATTATGTAGGTACCTATACATTTTTAAACTTATCGTATAA"
+            "TTCTTTTAATGGTTAAATCATACAAATTAATGTGTAGAGAATAGTTTTTATAAGACTCGTTGTCAATACG"
+            "TACGCATAATATAAAAAAACTGACATGTTTTAGTAAGTCGTTTTGATGCATAATAGGATTTTTACCTTTT"
+            "AAAGTCTCAAGTTTTCATACAGTGGTACCTCTATATAGAACACGTTAGGCTTTACGGGGTCATTATTTCT"
+            "GTTCCGATATTTTTAATGGCATAAAACTATAAACAATAACCGGTATGTATAAATGGTAC",
+
+            "ACCTGAAGCAGTAGTTCATCATATTGCGACTGCAGAATCGATGATAAAGTGGCTTTTAGATCTAAAAGCC"
+            "AATACAAAACTGAAGGAATTTGATTTGATGGATTTTAATTTTGAAAATGGATTATGATTGTCGATTGATT"
+            "AACAAGTTTACTAGGTTTGAATAGAGGTGATTCTTAATATTTCAAATATTTGAATGTCATGATGAATATT"
+            "ATAATTTATAATTAAAAAATATCATATTTTATTCATGGATATCAAAGCTGAAAAAATAGATATTCAAAAT"
+            "CGCCTTTATAATAACCTATCATAAACTAATTAATCAATTAAATTCAGTTTTAAAAATTTAAATCCGACAA"
+            "ATAAAATTCCTTCAGCTCTGTCTGGGATTTTGGTCGAAAAATTTTAAATCGAAAAAAGTTTATCTTATTC"
+            "ATAATATCATTGCCAATGATATTAAAATTAATTAACAACGAATACAAATAACGTCCGACCTGTATATTGC"
+            "GGGCCAACTGTTTTTATAGGAAATGTTGACCGAAAACTATTACAGATTAGATGTGTGTGTGTTTACCCTG"
+            "TACAAAAATACAAGTACTATTACAACACATCATTATGTTAAATTGCCTCTATATTAATTTCTTTAAAACA"
+            "CGACCAACTGCACATTAAAGTAGTTTATTTAGTACTACAGTAGATTAAATTCATTTTTGACGAAAAATTG"
+            "CATTTGAAAATGGCCATTGTGTGTATAAATATTGTATACTAATATAACTCTAAATAAAGGTTTCCAGTAC"
+            "CAAAGAACCAAATTTTTAATTACAACCAAAATAACTAAATCGTATTCTTTGTTAAATAGTTAAGTTTTTC"
+            "GCCGATTGCTGTGCTTGACAGTCTCCTCAATTCAGAATTTCATGTAAAATAAAAATAGCGTACATATAAT"
+            "GGATTGCTGTGGCATTTGGTTTGATTAATCCCAAATATTGATTCCAAATATCTATTAGCCTATTGTACCC"
+            "CGGAGTACCG"
+        } ;
+
+        /** The following solid kmers numbers are computed with the original minia. */
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 1, 2540);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 2, 151);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 3, 18);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 4, 3);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 5, 2);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 9, 6, 0);
+
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 11, 1, 2667);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 11, 2, 41);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 11, 3, 0);
+
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 13, 1, 2690);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 13, 2, 12);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 13, 3, 0);
+
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 15, 1, 2691);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 15, 2, 5);
+        DSK_check1_aux (seqs4, ARRAY_SIZE(seqs4), 15, 3, 0);
+    }
+
+    /********************************************************************************/
+    template<size_t span>
+    void DSK_check2_aux ()
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Type  Type;
+        typedef typename Kmer<span>::Count Count;
+
+        size_t kmerSize = 31;
+        size_t nks      = 1;
+
+        const char* s1 = "GATCGATTCTTAGCACGTCCCCCCCTACACCCAAT" ;
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<span> sortingCount (new BankStrings (s1, 0), params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        /** We iterate the solid kmers. */
+        Iterator<Count>* iter = sortingCount.getSolidCounts()->iterator();
+        LOCAL (iter);
+
+        /** The following values have been computed with the original DSK.
+         *  Note: we use a set and check that the solid iterator items are in this trustful set.
+         *  -> we have to do this because we are not sure about the order of the iterated items.
+         */
+        set<Type> okValues;
+        Type v1; v1.setVal( 0x1CA68D1E55561150 );
+        okValues.insert (v1);
+        Type v2; v2.setVal( 0x09CA68D1E5556115);
+        okValues.insert (v2);
+        Type v3; v3.setVal( 0x2729A34795558454);
+        okValues.insert (v3);
+        Type v4; v4.setVal( 0x32729A3479555845); 
+        okValues.insert (v4);
+        Type v5; v5.setVal( 0x0AFEE3FFF1ED8309);
+        okValues.insert (v5);
+
+        set<Type> checkValues;
+        Type checksum;
+        checksum.setVal(0);
+
+        size_t idx=0;
+        for (iter->first(); !iter->isDone(); iter->next(), idx++)
+        {
+            typename set<Type>::iterator lookup = okValues.find (iter->item().value);
+            CPPUNIT_ASSERT (lookup != okValues.end());
+
+            checkValues.insert (iter->item().value);
+
+            checksum += iter->item().value;
+        }
+
+        CPPUNIT_ASSERT (checksum == 0x8b0c176c3b43d207);
+        CPPUNIT_ASSERT (checkValues.size() == okValues.size());
+
+        /** TO BE IMPROVED => dynamic_cast now fails because of the new storage kind of solid kmers. */
+#if 0
+        /** We check the result through the variant type. */
+        IteratorVariant <IteratorFile, Kmer<KSIZE_1>::Count, Kmer<KSIZE_2>::Count, Kmer<KSIZE_3>::Count, Kmer<KSIZE_4>::Count > itVariant;
+
+        IteratorFile<Count>* solid = dynamic_cast<IteratorFile<Count>*> (iter);
+        CPPUNIT_ASSERT (solid != 0);
+
+        /** We set the variant with the current T type. */
+        itVariant = *solid;
+
+        Integer checksumGeneric (Type(0));
+
+        for (itVariant.first(); !itVariant.isDone(); itVariant.next())
+        {
+            boost::variant<Kmer<KSIZE_1>::Count, Kmer<KSIZE_2>::Count, Kmer<KSIZE_3>::Count, Kmer<KSIZE_4>::Count> current = itVariant.item();
+
+            Integer val = boost::apply_visitor (Functor_getValue(),  current);
+
+            checksumGeneric += val;
+        }
+        CPPUNIT_ASSERT (checksumGeneric == Integer(Type(0x8b0c176c3b43d207)));
+#endif
+    }
+
+    /********************************************************************************/
+    void DSK_check2 ()
+    {
+        DSK_check2_aux<KSIZE_1> ();
+#if KSIZE_32
+#else
+        DSK_check2_aux<KSIZE_2> ();
+        DSK_check2_aux<KSIZE_3> ();
+#endif
+    }
+
+    /********************************************************************************/
+
+    template<size_t span>
+    void DSK_check3_aux (IBank* bank, size_t kmerSize, size_t nks)
+    {
+        /** Shortcut. */
+        typedef typename Kmer<span>::Count Count;
+
+        LOCAL (bank);
+
+        TimeInfo ti;
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();  LOCAL (params);
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<span> sortingCount (bank, params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        /** We iterate the solid kmers. */
+        Iterator<Count>* iter = sortingCount.getSolidCounts()->iterator();
+        LOCAL (iter);
+
+        // cout << "----------------------------------------------------------" << endl;
+
+        /** TO BE IMPROVED => dynamic_cast now fails because of the new storage kind of solid kmers. */
+#if 0
+        /** We check the result through the variant type. */
+        IteratorVariant <IteratorFile, Kmer<KSIZE_1>::Count, Kmer<KSIZE_2>::Count, Kmer<KSIZE_3>::Count, Kmer<KSIZE_4>::Count > itVar;
+
+        IteratorFile<Count>* solid = dynamic_cast<IteratorFile<Count>*> (iter);
+        CPPUNIT_ASSERT (solid != 0);
+
+        /** We set the variant with the current T type. */
+        itVar = *solid;
+
+        Type    checksum1 = 0;
+        Integer checksum2 = Integer(Type(0));
+
+        PairedIterator <IteratorFile, Count, KmerVariant> itBoth (*solid, itVar);
+        for (itBoth.first(); !itBoth.isDone(); itBoth.next())
+        {
+            Type    v1 = itBoth.item().first.getValue();
+            Integer v2 = boost::apply_visitor (Functor_getValue(),  itBoth.item().second);
+
+            checksum1 += (hash1 (v1,0) & 0x11111);
+            checksum2 += Integer(Type((hash1 (v2,0) & 0x11111)));
+
+             //cout << "["  << (Integer(v1) == v2 ? 'X' : ' ')  << "] "  << v1 << "  " <<  v2 << endl;
+        }
+
+        CPPUNIT_ASSERT (checksum2 == Integer(checksum1));
+#endif
+
+        /** Some performance tests. */
+
+        size_t idx2 = 0;
+        size_t idx1 = 0;
+
+        {   TIME_INFO(ti,"1");  for (iter->first(); !iter->isDone(); iter->next()) { idx1++; }  }
+
+        {   TIME_INFO(ti,"2");  for (iter->first(); !iter->isDone(); iter->next()) { idx2++; }  }
+    }
+
+    /** */
+    void DSK_check3 ()
+    {
+        size_t kmerSize = 15;
+        size_t nks      = 1;
+
+        IBank* bank = new BankStrings (
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+            "ACTTAGATGTAAGATTTCGAAGACTTGGATGTAAACAACAAATAAGATAATAACCATAAAAATAGAAATG"
+            "AACGATATTAAAATTAAAAAATACGAAAAAACTAACACGTATTGTGTCCAATAAATTCGATTTGATAATT"
+            "AGGTAACAATTTAACGTTAAAACCTATTCTTTTATTATCCGAAAATCCGTCGTGGAATTTGTATTAGCTT"
+            "TTTTTCTACATTACCCGTTTGCGAGACAGGTGGGGTCAGACGTAGACGTAGTCTCTGGAGTCAAGACGAA"
+            "ATTTTACATTTCACAATTTCCTATAGGCCGAGCAAAATTTATTAAGAACCCACAGGCATCATTACGTTTT"
+            "CTTGCACAGAAGACTTCACGCTGAAGTCATTGGGCTATATTTCAACGAGACGTCTGTTGGTTTATAAAGG"
+            "GCTATATTTATACAAGAATAGGAGTATGGCAGTATGCTAGGCTGGTATGTAGTACGTATACCTCCTAAGC",
+            0
+        );
+        LOCAL (bank);
+
+        DSK_check3_aux<KSIZE_1> (bank, kmerSize, nks);
+#if KSIZE_32
+#else
+        DSK_check3_aux<KSIZE_2> (bank, kmerSize, nks);
+        DSK_check3_aux<KSIZE_3> (bank, kmerSize, nks);
+#endif
+    }
+
+    /********************************************************************************/
+    template<size_t span>
+    void DSK_perBank_aux (IBank* bank, size_t kmerSize, size_t nksMin, size_t nksMax, KmerSolidityKind solidityKind, size_t checkNb)
+    {
+        size_t maxDiskSpace = 0;
+        size_t nbCores      = 1;
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nksMin);
+        params->setInt (STR_KMER_ABUNDANCE_MAX, nksMax);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_MAX_DISK,           maxDiskSpace);
+        params->setStr (STR_SOLIDITY_KIND,      toString(solidityKind));
+        params->setStr (STR_URI_OUTPUT,         "output");
+
+        params->add (0, STR_NB_CORES,  "%d", nbCores);
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<span> sortingCount (bank, params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        // cout << *sortingCount.getInfo() << endl;
+        // Group& sortingGroup = storage->getGroup("dsk");
+        // Collection<IHistogram::Entry>& histo = sortingGroup.getCollection<IHistogram::Entry>("histogram");
+        // Iterator<IHistogram::Entry>* itHisto = new TruncateIterator<IHistogram::Entry> (*histo.iterator(), 12);
+        // for (itHisto->first(); !itHisto->isDone(); itHisto->next())  { cout << itHisto->item().index << " " << itHisto->item().abundance << endl; }
+        // printf ("min=%ld  max=%ld  nb=%ld  check=%ld \n",
+        //    nksMin, nksMax, sortingCount.getSolidCounts()->getNbItems(),checkNb
+        // );
+
+        CPPUNIT_ASSERT (sortingCount.getSolidCounts()->getNbItems() == (int)checkNb);
+    }
+
+    /********************************************************************************/
+    void DSK_perBank1 ()
+    {
+        CountNumber nksMax = NKS_MAX;  // a big value here
+
+        const char* seqs[] = {      //  KMERS ARE...
+            "CGCTACAGCAGCTAGTT",    // CGCTACAGCAGCTAG  GCTACAGCAGCTAGT  CTACAGCAGCTAGTT
+            "GCTACAGCAGCTAGTTA",    //                  GCTACAGCAGCTAGT  CTACAGCAGCTAGTT  TACAGCAGCTAGTTA
+            "CTACAGCAGCTAGTTAC"     //                                   CTACAGCAGCTAGTT  TACAGCAGCTAGTTA  ACAGCAGCTAGTTAC
+        };
+
+        // CTACAGCAGCTAGTT is the only kmer to be present at least in each sequence
+        // We have 5 different kmers
+
+        BankComposite* album = new BankAlbum ("foo", true);  LOCAL (album);
+
+        for (size_t i=0; i<ARRAY_SIZE(seqs); i++) {   album->addBank (new BankStrings(seqs[i],NULL)); }
+
+        // Checks for abundance==1
+        DSK_perBank_aux<KSIZE_1> (album, 15, 1, nksMax, KMER_SOLIDITY_MIN, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 1, nksMax, KMER_SOLIDITY_MAX, 5);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 1, nksMax, KMER_SOLIDITY_SUM, 5);
+
+        // Checks for abundance==2
+        DSK_perBank_aux<KSIZE_1> (album, 15, 2, nksMax, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 2, nksMax, KMER_SOLIDITY_MAX, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 2, nksMax, KMER_SOLIDITY_SUM, 3);
+
+        // Checks for abundance==3
+        DSK_perBank_aux<KSIZE_1> (album, 15, 3, nksMax, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 3, nksMax, KMER_SOLIDITY_MAX, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 15, 3, nksMax, KMER_SOLIDITY_SUM, 1);
+    }
+
+    /********************************************************************************/
+    void DSK_perBank2 ()
+    {
+        CountNumber nksMax = NKS_MAX;
+
+        const char* seqs[] = {
+            "CGCTATCGCTA",    // CGCTA  GCTAT  CTATC  TATCG  ATCGC  TCGCT  CGCTA
+            "CGCTATAGTTA",    // CGCTA  GCTAT  CTATA  TATAG  ATAGT  TAGTT  AGTTA
+            "CGCTAACGCTA"     // CGCTA  GCTAA  CTAAC  TAACG  AACGC  ACGCT  CGCTA
+        };
+
+        //  KMERS ARE... (with revcomp)
+        // CGCTA-TAGCG  GCTAT-ATAGC  CTATC-GATAG  TATCG-CGATA  ATCGC-GCGAT  TCGCT-AGCGA  CGCTA-TAGCG
+        // CGCTA-TAGCG  GCTAT-ATAGC  CTATA-TATAG  TATAG-CTATA  ATAGT-ACTAT  TAGTT-AACTA  AGTTA-TAACT
+        // CGCTA-TAGCG  GCTAA-TTAGC  CTAAC-GTTAG  TAACG-CGTTA  AACGC-GCGTT  ACGCT-AGCGT  CGCTA-TAGCG
+
+        // CANONICAL KMERS ARE
+        // CGCTA  ATAGC  CTATC  CGATA  ATCGC  AGCGA  CGCTA
+        // CGCTA  ATAGC  CTATA  CTATA  ACTAT  AACTA  AGTTA
+        // CGCTA  TTAGC  CTAAC  CGTTA  AACGC  ACGCT  CGCTA
+
+        // UNIQUE KMERS ARE
+        // (CGCTA,5)  (ATAGC,2)  (CTATC,1)  (CGATA,1)  (ATCGC,1)  (AGCGA,1)
+        // (CTATA,2)  (ACTAT,1)  (AACTA,1)  (AGTTA,1)
+        // (TTAGC,1)  (CTAAC,1)  (CGTTA,1)  (AACGC,1)  (ACGCT,1)
+
+        // OCCURRENCES in each bank
+        // CGCTA(2) ATAGC(1) CTATC(1) CGATA(1) ATCGC(1) AGCGA(1)
+        // CGCTA(1) ATAGC(1)                                     CTATA(2) ACTAT(1) AACTA(1) AGTTA(1)
+        // CGCTA(2)                                                                                  TTAGC(1) CTAAC(1) CGTTA(1) AACGC(1) ACGCT(1)
+
+        BankComposite* album = new BankAlbum ("foo", true);  LOCAL (album);
+
+        for (size_t i=0; i<ARRAY_SIZE(seqs); i++) {   album->addBank (new BankStrings(seqs[i],NULL)); }
+
+        // Checks for abundance==1
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, nksMax, KMER_SOLIDITY_MIN, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, nksMax, KMER_SOLIDITY_MAX, 15);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, nksMax, KMER_SOLIDITY_SUM, 15);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, nksMax, KMER_SOLIDITY_ALL, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, nksMax, KMER_SOLIDITY_ONE, 15);
+
+        // Checks for abundance==2
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, nksMax, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, nksMax, KMER_SOLIDITY_MAX, 2);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, nksMax, KMER_SOLIDITY_SUM, 3);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, nksMax, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, nksMax, KMER_SOLIDITY_ONE, 2);
+
+        // Checks for abundance==3
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, nksMax, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, nksMax, KMER_SOLIDITY_MAX, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, nksMax, KMER_SOLIDITY_SUM, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, nksMax, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, nksMax, KMER_SOLIDITY_ONE, 0);
+
+        // Checks for abundance=[1,1]  => NOTE THAT EACH SOLIDITY KIND LEADS TO A DIFFERENT VALUE...
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 1, KMER_SOLIDITY_MIN, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 1, KMER_SOLIDITY_MAX, 13);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 1, KMER_SOLIDITY_SUM, 12);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 1, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 1, KMER_SOLIDITY_ONE, 14);
+
+        // Checks for abundance=[1,2]
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 2, KMER_SOLIDITY_MIN, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 2, KMER_SOLIDITY_MAX, 15);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 2, KMER_SOLIDITY_SUM, 14);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 2, KMER_SOLIDITY_ALL, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 2, KMER_SOLIDITY_ONE, 15);
+
+        // Checks for abundance=[1,3]
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 3, KMER_SOLIDITY_MIN, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 3, KMER_SOLIDITY_MAX, 15);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 3, KMER_SOLIDITY_SUM, 14);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 3, KMER_SOLIDITY_ALL, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 1, 3, KMER_SOLIDITY_ONE, 15);
+
+        // Checks for abundance=[2,2]
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, 2, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, 2, KMER_SOLIDITY_MAX, 2);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, 2, KMER_SOLIDITY_SUM, 2);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, 2, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 2, 2, KMER_SOLIDITY_ONE, 2);
+
+        // Checks for abundance=[3,3]
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 3, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 3, KMER_SOLIDITY_MAX, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 3, KMER_SOLIDITY_SUM, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 3, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 3, KMER_SOLIDITY_ONE, 0);
+
+        // Checks for abundance=[3,5]
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 5, KMER_SOLIDITY_MIN, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 5, KMER_SOLIDITY_MAX, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 5, KMER_SOLIDITY_SUM, 1);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 5, KMER_SOLIDITY_ALL, 0);
+        DSK_perBank_aux<KSIZE_1> (album, 5, 3, 5, KMER_SOLIDITY_ONE, 0);
+    }
+
+    /********************************************************************************/
+    void DSK_perBankKmer_aux (size_t kmerSize, size_t nbBanksMax)
+    {
+        /** We create a bank holding all 4^k kmers =>  we will have 4^k/2 canonical kmers with abundance==2  */
+        IBank* kmersBank = new BankKmers(kmerSize);  LOCAL (kmersBank);
+
+        u_int64_t nbKmers          = (1<<(2*kmerSize));
+        u_int64_t nbKmersCanonical = nbKmers / 2;
+
+        vector<IBank*> banks;
+        vector<IBank*> banksComposite;
+
+        for (size_t i=0; i<nbBanksMax; i++)
+        {
+            /** We add the bank into the vector of banks. */
+            banks.push_back (kmersBank);
+
+            /** We create a new album. */
+            stringstream ss;  ss << "foo" << i;
+
+            BankComposite* compo = new BankAlbum (ss.str(), true);
+            for (size_t j=0; j<banks.size(); j++)  { compo->addBank (kmersBank); }
+            banksComposite.push_back (compo);
+        }
+
+        for (size_t i=0; i<banksComposite.size(); i++)  { banksComposite[i]->use();  }
+
+        size_t abundMax = 100000;
+
+        /** Now, we should have N albums Ai (i in [1..N]), with Ai holding i times the kmers bank. */
+        for (size_t i=0; i<banksComposite.size(); i++)
+        {
+            /** Shortcut. */
+            IBank* current = banksComposite[i];
+
+            /** We check the number of items. */
+            CPPUNIT_ASSERT ((u_int64_t)current->getNbItems() == (i+1)*nbKmers);
+
+            for (size_t abundMin=1; abundMin<=nbBanksMax; abundMin++)
+            {
+                /** For mode "min" : each bank can have at most coverage==2 for each kmer. */
+                size_t checkMin = abundMin > 2 ? 0 : nbKmersCanonical;
+
+                /** For mode "max" : all bank have coverage==2 for each kmer. */
+                size_t checkMax = abundMin > 2 ? 0 : nbKmersCanonical;
+
+                /** For mode "sum" : N times composite banks have 2N coverage for each kmer. */
+                size_t checkSum = abundMin > 2*(i+1) ? 0 : nbKmersCanonical;
+
+                DSK_perBank_aux<KSIZE_1> (current, kmerSize, abundMin, abundMax, KMER_SOLIDITY_MIN, checkMin);
+                DSK_perBank_aux<KSIZE_1> (current, kmerSize, abundMin, abundMax, KMER_SOLIDITY_MAX, checkMax);
+                DSK_perBank_aux<KSIZE_1> (current, kmerSize, abundMin, abundMax, KMER_SOLIDITY_SUM, checkSum);
+            }
+        }
+
+        for (size_t i=0; i<banksComposite.size(); i++)  { banksComposite[i]->forget();  }
+    }
+
+    /********************************************************************************/
+    void DSK_perBankKmer ()
+    {
+        /** We can't use even kmer sizes because of palindroms (could have some kmers with coverage 1 instead of 2). */
+        DSK_perBankKmer_aux ( 9, 4);
+        DSK_perBankKmer_aux (11, 3);
+    }
+
+    /********************************************************************************/
+    struct DSK_multibank_aux  {  template<typename U> void operator() (U)
+    {
+        size_t kmerSize = U::value-1;
+        size_t nks      = 2;
+        string filepath = DBPATH("album.txt");
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        IBank* bank = Bank::open(filepath);
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<U::value> dsk (bank, params);
+
+        /** We launch DSK. */
+        dsk.execute();
+    }};
+
+    void DSK_multibank ()
+    {
+        // used to crash on macos because non aligned uint128 in dsk 2nd part
+
+        boost::mpl::for_each<gatb::core::tools::math::IntegerList>(DSK_multibank_aux());
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestDSK);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestDSK);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/kmer/TestDebloom.cpp b/gatb-core/test/unit/src/kmer/TestDebloom.cpp
new file mode 100644
index 0000000..94c3486
--- /dev/null
+++ b/gatb-core/test/unit/src/kmer/TestDebloom.cpp
@@ -0,0 +1,173 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/BankStrings.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/BloomAlgorithm.hpp>
+#include <gatb/kmer/impl/DebloomAlgorithm.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestDebloom : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestDebloom);
+
+        CPPUNIT_TEST_GATB (Debloom_check1);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    () {}
+    void tearDown () {}
+
+        // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+        static const u_int64_t MAX_MEMORY = 1000;
+
+    /********************************************************************************/
+    void Debloom_check1 ()
+    {
+        size_t kmerSize = 11;
+        size_t miniSize = 8;
+        size_t nks      = 1;
+
+        const char* seqs[] = {
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        } ;
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();  LOCAL (params);
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MINIMIZER_SIZE,     miniSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a SortingCountAlgorithm object. */
+        SortingCountAlgorithm<> sortingCount (new BankStrings (seqs, ARRAY_SIZE(seqs)), params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        CPPUNIT_ASSERT (sortingCount.getSolidCounts()->getNbItems() == (int64_t)(strlen(seqs[0]) - kmerSize + 1) );
+
+        /** We get the storage instance. */
+        Storage* storage = sortingCount.getStorage();
+        LOCAL (storage);
+
+        Partition<SortingCountAlgorithm<>::Count>& counts = storage->getGroup("dsk").getPartition<Kmer<>::Count> ("solid");
+
+        /** We create a bloom instance. */
+        float nbitsPerKmer = DebloomAlgorithm<>::getNbBitsPerKmer (kmerSize, DEBLOOM_ORIGINAL);
+        BloomAlgorithm<> bloom (*storage, &counts, kmerSize, nbitsPerKmer, 0, BLOOM_BASIC);
+        bloom.execute ();
+
+        /** We create a debloom instance. */
+        DebloomAlgorithm<> debloom (
+            storage->getGroup("bloom"),
+            storage->getGroup("debloom"),
+            &counts, kmerSize, miniSize, 1000, 0, BLOOM_BASIC, DEBLOOM_ORIGINAL
+        );
+
+        /** We launch the debloom. */
+        debloom.execute();
+
+        /** The following values have been computed with the original minia. */
+        u_int64_t values[] =
+        {
+            0xc0620,    0x288f40,   0x188f40,   0x2aaa29,   0x8000b,    0x200881,   0x288081,   0x820db,    0x52e23,    0x2888f,
+            0xaaa8b,    0x28838d,   0x20000,    0xa93ab,    0x2c18d,    0x2ba89,    0x183600,   0xea00b,    0x1a4ea0,   0xf8585
+        };
+        set<Kmer<>::Type> okValues;
+        
+        for (unsigned int i = 0; i < ARRAY_SIZE(values); i++)
+        {
+            Kmer<>::Type val; val.setVal(values[i]);
+            okValues.insert(val);
+        }
+
+        CPPUNIT_ASSERT (debloom.getCriticalKmers()->getNbItems() == ARRAY_SIZE(values));
+
+        /** We iterate the cFP kmers. */
+        set<Kmer<>::Type> checkValues;
+        Iterator<Kmer<>::Type>* iter = debloom.getCriticalKmers()->iterator();
+        LOCAL (iter);
+
+        for (iter->first(); !iter->isDone(); iter->next())
+        {
+            set<Kmer<>::Type>::iterator lookup = okValues.find (iter->item());
+            CPPUNIT_ASSERT (lookup != okValues.end());
+
+            checkValues.insert (iter->item());
+        }
+
+        CPPUNIT_ASSERT (checkValues.size() == okValues.size());
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestDebloom);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestDebloom);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/kmer/TestKmer.cpp b/gatb-core/test/unit/src/kmer/TestKmer.cpp
new file mode 100644
index 0000000..99e4de7
--- /dev/null
+++ b/gatb-core/test/unit/src/kmer/TestKmer.cpp
@@ -0,0 +1,599 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/Data.hpp>
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/bank/api/Sequence.hpp>
+#include <gatb/bank/impl/Alphabet.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/tools/math/Integer.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankRandom.hpp>
+#include <gatb/bank/impl/BankStrings.hpp>
+#include <gatb/tools/collections/impl/IterableHelpers.hpp>
+
+#include <gatb/system/api/Exception.hpp>
+
+#include <iostream>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestKmer : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestKmer);
+
+        CPPUNIT_TEST_GATB (kmer_tostring);
+        CPPUNIT_TEST_GATB (kmer_checkInfo);
+        CPPUNIT_TEST_GATB (kmer_checkCompute);
+        CPPUNIT_TEST_GATB (kmer_checkIterator);
+        CPPUNIT_TEST_GATB (kmer_build);
+        CPPUNIT_TEST_GATB (kmer_minimizer); // with ModelDirect
+        CPPUNIT_TEST_GATB (kmer_minimizer2); // with ModelDirect
+        CPPUNIT_TEST_GATB (kmer_minimizer3); // with ModelCanonical
+        CPPUNIT_TEST_GATB (kmer_badchar);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template<size_t span> class Check
+    {
+    public:
+
+        typedef typename Kmer<span>::ModelCanonical Model;
+        typedef typename Kmer<span>::Type           Type;
+
+        /********************************************************************************/
+        static void kmer_checkInfo ()
+        {
+            size_t aSpan = 27;
+
+            /** We declare a kmer model with a given span size. */
+            Model model (aSpan);
+
+            /** We check some information. */
+            CPPUNIT_ASSERT (model.getKmerSize()    == aSpan);
+            CPPUNIT_ASSERT (model.getMemorySize()  == sizeof(Type));
+        }
+
+        /********************************************************************************/
+        template <class ModelType>
+        static void kmer_checkCompute_aux (const char* seq, long* check, size_t len)
+        {
+            typename ModelType::Kmer kmer;
+
+            /** We declare a kmer model with a given span size. */
+            ModelType model (3);
+
+            /** We compute the kmer for a given sequence */
+            kmer = model.codeSeed (seq, Data::ASCII);
+
+            if (kmer.value() != check[0])
+                    std::cout << std::endl << "in anticipation of failed unit test, here is kmer.value(): " << (int)(kmer.value().getVal()) << " and check[0]: " << (int)(check[0]) << std::endl;
+
+            CPPUNIT_ASSERT (kmer.value() == check[0]);
+
+            /** We compute some of the next kmers. */
+            kmer = model.codeSeedRight (kmer, seq[3], Data::ASCII);
+
+            CPPUNIT_ASSERT (kmer.value() == check[1]);
+
+            kmer = model.codeSeedRight (kmer, seq[4], Data::ASCII);
+            CPPUNIT_ASSERT (kmer.value() == check[2]);
+
+            kmer = model.codeSeedRight (kmer, seq[5], Data::ASCII);
+            CPPUNIT_ASSERT (kmer.value() == check[3]);
+        }
+
+        /** */
+        static void kmer_checkCompute ()
+        {
+            const char* seq = "CATTGATAGTGG";
+            long directKmers [] = {18, 10, 43, 44, 50,  8, 35, 14, 59, 47};
+
+            kmer_checkCompute_aux <typename Kmer<span>::ModelDirect> (seq, directKmers,  ARRAY_SIZE(directKmers));
+        }
+
+        /********************************************************************************/
+        template<class ModelType>
+        static void kmer_checkIterator_aux (const char* seq, long* kmersTable, size_t lenTable)
+        {
+            /** We declare a kmer model with a given span size. */
+            ModelType model (3);
+
+            /** We declare an iterator. */
+            typename ModelType::Iterator it (model);
+
+            /** We set the data from which we want to extract kmers. */
+            Data data (Data::ASCII);
+            data.set ((char*)seq, strlen(seq));
+
+            /** We feed the iterator with the sequence data content. */
+            it.setData (data);
+
+            /** We iterate the kmers. */
+            size_t idx=0;
+            for (it.first(); !it.isDone(); it.next())
+            {
+                /** We check that the iterated kmer is the good one. */
+                CPPUNIT_ASSERT (it->value() == kmersTable[idx++]);
+            }
+            /** We check we found the correct number of kmers. */
+            CPPUNIT_ASSERT (idx == lenTable);
+        }
+
+        /********************************************************************************/
+        static void kmer_checkIterator ()
+        {
+            const char* seq = "CATTGATAGTGG";
+
+             long checkDirect []  = {18, 10, 43, 44, 50,  8, 35, 14, 59, 47};
+             kmer_checkIterator_aux <typename Kmer<span>::ModelDirect> (seq, checkDirect, ARRAY_SIZE(checkDirect));
+
+             // long checkReverse [] = {11,  2, 16, 36,  9, 34, 24,  6, 17, 20};
+             // kmer_checkIterator_aux (model, seq, KMER_REVCOMP, checkReverse, ARRAY_SIZE(checkReverse));
+
+            long checkBoth []    = {11,  2, 16, 36,  9,  8, 24,  6, 17, 20};
+            kmer_checkIterator_aux <typename Kmer<span>::ModelCanonical> (seq, checkBoth, ARRAY_SIZE(checkBoth));
+        }
+    };
+
+    /********************************************************************************/
+    void kmer_checkInfo ()
+    {
+        /** We check with the native 64 bits type. */
+        Check<32>::kmer_checkInfo();
+
+        /** We check with the native 128 bits type. */
+        Check<64>::kmer_checkInfo();
+
+        /** We check with the LargeInt type. */
+        Check<96>::kmer_checkInfo();
+    }
+
+    /********************************************************************************/
+    void kmer_checkCompute ()
+    {
+        /** We check with the native 64 bits type. */
+        Check<32>::kmer_checkCompute();
+
+        /** We check with the native 128 bits type. */
+        Check<64>::kmer_checkCompute();
+
+        /** We check with the LargeInt type. */
+        Check<96>::kmer_checkCompute();
+    }
+
+    /********************************************************************************/
+    void kmer_checkIterator ()
+    {
+        /** We check with the native 64 bits type. */
+        Check<32>::kmer_checkIterator();
+
+        /** We check with the native 128 bits type. */
+        Check<64>::kmer_checkIterator();
+
+        /** We check with the LargeInt type. */
+        Check<96>::kmer_checkIterator();
+    }
+
+    /********************************************************************************/
+    void kmer_build ()
+    {
+        char* buf = (char*)"ACTACGATCGATGTA";
+
+        Sequence s1 (buf);
+
+        Kmer<>::ModelCanonical model (5);
+
+        Kmer<>::Type check[] = {0x61, 0x187, 0x21c, 0x72, 0x1c9, 0x1c9, 0x9c, 0x9c, 0x127, 0x49, 0xb8};
+
+        vector<Kmer<>::ModelCanonical::Kmer> kmers;
+
+        model.build (s1.getData(), kmers);
+
+        CPPUNIT_ASSERT (kmers.size() == 11);
+
+        size_t i=0;
+        for (i=0; i<kmers.size(); i++)  {  CPPUNIT_ASSERT (kmers[i].value() == check[i]);  }
+        CPPUNIT_ASSERT (i==ARRAY_SIZE(check));
+
+        for (i=0; i<ARRAY_SIZE(check); i++)  {  CPPUNIT_ASSERT (model.getKmer(s1.getData(), i).value() == check[i]);  }
+        CPPUNIT_ASSERT (i==ARRAY_SIZE(check));
+
+        for (i=0; i<ARRAY_SIZE(check); i++)  {  CPPUNIT_ASSERT (model.getKmer (Data(buf), i).value() == check[i]);  }
+        CPPUNIT_ASSERT (i==ARRAY_SIZE(check));
+
+        Kmer<>::ModelCanonical::Kmer kmer = model.getKmer (Data(buf));
+        CPPUNIT_ASSERT (kmer.value() == check[0]);
+    }
+
+    /********************************************************************************/
+    template<size_t span>
+    struct kmer_minimizer_fct
+    {
+        typedef typename Kmer<span>::ModelDirect ModelDirect;
+        typedef typename Kmer<span>::template ModelMinimizer<ModelDirect> ModelMinimizer;
+
+        ModelMinimizer& model;
+        size_t& nbKmers;
+
+        kmer_minimizer_fct (ModelMinimizer& model, size_t& nbKmers)  : model(model), nbKmers(nbKmers) {}
+
+        void operator() (const typename ModelMinimizer::Kmer& kmers, size_t idx)
+        {
+            string currentKmer = model.toString(kmers.value());
+
+            
+            typename Kmer<span>::Type currentMini; // (~0 & ((1 << (model.getMmersModel().getKmerSize() * 2)) - 1));
+            currentMini.setVal(1);
+            currentMini <<= (model.getMmersModel().getKmerSize() * 2);
+            currentMini = currentMini - 1;
+
+            
+            for (size_t i=0; i<model.getKmerSize() - model.getMmersModel().getKmerSize() + 1; i++)
+            {
+                typename ModelDirect::Kmer tmp = model.getMmersModel().codeSeed (
+                    currentKmer.substr(i,model.getMmersModel().getKmerSize()).data(),
+                    Data::ASCII
+                );
+
+                string m_minus_one_suffix = currentKmer.substr(i+1,model.getMmersModel().getKmerSize()-1);
+
+                if (m_minus_one_suffix.find("AA") != m_minus_one_suffix.npos)
+                    continue; // disallowed m-mer under KMC2 lexicographic heuristic
+
+                if (tmp.value() < currentMini)  { currentMini = tmp.value(); }
+            }
+
+            if (currentMini != kmers.minimizer().value())
+                cout << endl << "ModelDirect: " << "kmer " << currentKmer <<" should be " << model.getMmersModel().toString(currentMini) << " but actually found " <<  model.getMmersModel().toString(kmers.minimizer().value()) << " raw values : " << to_string(currentMini.getVal()) << " " << to_string(kmers.minimizer().value().getVal()) <<  endl;
+
+            CPPUNIT_ASSERT (currentMini == kmers.minimizer().value() );
+
+            nbKmers++;
+        }
+    };
+
+    /** */
+    template<size_t span, class ModelType>
+    void kmer_minimizer_aux2 (IBank& bank, size_t kmerSize, size_t miniSize)
+    {
+        typename Kmer<span>::template ModelMinimizer <ModelType> minimizerModel (kmerSize, miniSize);
+
+        size_t nbKmers = 0;
+        // We loop over sequences.
+        Iterator<Sequence>* itSeq = bank.iterator();  LOCAL (itSeq);
+
+        for (itSeq->first(); !itSeq->isDone(); itSeq->next())
+        {
+            minimizerModel.iterate ((*itSeq)->getData(), kmer_minimizer_fct<span> (minimizerModel, nbKmers));
+        }
+        CPPUNIT_ASSERT (nbKmers > 0);
+    }
+
+    /** */
+    void kmer_minimizer ()
+    {
+        /** NOTE: sequences should be big enough to get kmers up to 128. */
+        vector<IBank*> banks;
+        banks.push_back (new BankStrings ("ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAGAT"
+                                          "TCCCCAGGCCCCTACACCCAATGTGGAACCGGGGTCCCGAATGAAAATGCTGCTGTTCCCTGGAGGTGTTCT", NULL));
+        banks.push_back (Bank::open (DBPATH("reads1.fa")));
+        banks.push_back (new BankRandom (500, 200));
+
+        size_t   kmerSizes[] = { 12,31, 33,63, 65,95, 97,127 };
+        size_t   miniSizes[] = {  5,  8, 10 };
+
+        static const size_t KSIZE_1 = KMER_SPAN(0);
+#define KSIZE_32 (KSIZE_LIST == 32)
+#if KSIZE_32
+        // don't run those tests when compiled with just k=32
+#else
+        static const size_t KSIZE_2 = KMER_SPAN(1);
+        static const size_t KSIZE_3 = KMER_SPAN(2);
+#endif
+        try
+        {
+            for (size_t b=0; b<banks.size(); b++)
+            {
+                IBank* bank = banks[b];   LOCAL(bank);
+
+                for (size_t i=0; i<ARRAY_SIZE(kmerSizes); i++)
+                {
+                    size_t kmerSize = kmerSizes[i];
+
+                    for (size_t j=0; j<ARRAY_SIZE(miniSizes); j++)
+                    {
+                             if (kmerSize < KSIZE_1)  {  kmer_minimizer_aux2<KSIZE_1, Kmer<KSIZE_1>::ModelDirect> (*bank, kmerSize, miniSizes[j]);  }
+#if KSIZE_32
+#else
+                        else if (kmerSize < KSIZE_2)  {  kmer_minimizer_aux2<KSIZE_2, Kmer<KSIZE_2>::ModelDirect> (*bank, kmerSize, miniSizes[j]);  }
+                        else if (kmerSize < KSIZE_3)  {  kmer_minimizer_aux2<KSIZE_3, Kmer<KSIZE_3>::ModelDirect> (*bank, kmerSize, miniSizes[j]);  }
+#endif
+                    }
+                }
+            }
+        }
+        catch (gatb::core::system::Exception& e)
+        {
+            cout << e.getMessage() << endl;
+        }
+    }
+
+    /** */
+    struct kmer_minimizer2_info
+    {
+        const char* kmer;
+        const char* minimizer;
+        int         position;
+        bool        changed;
+    };
+
+    void kmer_minimizer2 ()
+    {
+        const char* seq = "ATGTCTGAAGTGACCTAACATTGCA";
+
+        size_t kmerSize = 15;
+        size_t mmerSize = 7;
+
+        typedef Kmer<>::ModelDirect                  ModelDirect;
+        typedef Kmer<>::ModelMinimizer<ModelDirect>  ModelMinimizer;
+
+        ModelMinimizer model (kmerSize, mmerSize);
+
+        const ModelDirect& modelMini = model.getMmersModel();
+
+        kmer_minimizer2_info table[] =
+        {
+            {"ATGTCTGAAGTGACC", "AAGTGAC", 7, true },
+            {"TGTCTGAAGTGACCT", "AAGTGAC", 6, false},
+            {"GTCTGAAGTGACCTA", "AAGTGAC", 5, false},
+            {"TCTGAAGTGACCTAA", "AAGTGAC", 4, false},
+            {"CTGAAGTGACCTAAC", "AAGTGAC", 3, false},
+            {"TGAAGTGACCTAACA", "AAGTGAC", 2, false},
+            {"GAAGTGACCTAACAT", "AAGTGAC", 1, false},
+            {"AAGTGACCTAACATT", "AAGTGAC", 0, false},
+            {"AGTGACCTAACATTG", "AACATTG", 8, true },
+            {"GTGACCTAACATTGC", "AACATTG", 7, false},
+            {"TGACCTAACATTGCA", "AACATTG", 6, false}
+          };
+
+        size_t idx = 0;
+
+        #define CHECK(idx) \
+            CPPUNIT_ASSERT (  \
+                   model.toString (kmer.value()) == table[idx].kmer \
+                && modelMini.toString(kmer.minimizer().value()) == table[idx].minimizer \
+                && kmer.position()   == table[idx].position  \
+                && kmer.hasChanged() == table[idx].changed)
+
+        ModelMinimizer::Kmer kmer = model.codeSeed (seq, Data::ASCII);
+        CHECK (idx);  idx++;
+        seq += kmerSize;
+
+        for ( ; idx < ARRAY_SIZE(table); idx++)
+        {
+            kmer = model.codeSeedRight (kmer, *(seq++), Data::ASCII);
+
+            CHECK (idx);
+        }
+    }
+
+    void kmer_minimizer3 ()
+    {
+        const char* seq = "ATGTCTGAAGTGACCTAACATTGCAGTGTGTT"; 
+
+        size_t kmerSize = 15;
+        size_t mmerSize = 7;
+
+        typedef Kmer<>::ModelCanonical                  ModelCanonical;
+        typedef Kmer<>::ModelMinimizer<ModelCanonical>  ModelMinimizer;
+
+        ModelMinimizer model (kmerSize, mmerSize);
+
+        const ModelCanonical& modelMini = model.getMmersModel();
+
+        kmer_minimizer2_info table[] =
+        {
+            {"ATGTCTGAAGTGACC", "AAGTGAC", 7, true },
+            {"AGGTCACTTCAGACA", "AAGTGAC", 6, false},
+            {"TAGGTCACTTCAGAC", "AAGTGAC", 5, false},
+            {"TCTGAAGTGACCTAA", "AAGTGAC", 4, false},
+            {"CTGAAGTGACCTAAC", "AAGTGAC", 3, false},
+            {"TGAAGTGACCTAACA", "AAGTGAC", 2, false},
+            {"ATGTTAGGTCACTTC", "AAGTGAC", 1, false},
+            {"AATGTTAGGTCACTT", "AATGTTA", 8, true }, // first revcomp minimizer
+            {"AGTGACCTAACATTG", "AACATTG", 8, true },
+            {"GCAATGTTAGGTCAC", "AACATTG", 7, false},
+            {"TGACCTAACATTGCA", "AACATTG", 6, false},
+            {"CTGCAATGTTAGGTC", "AACATTG", 5, false},
+            {"ACCTAACATTGCAGT", "AACATTG", 4, false},
+            {"CACTGCAATGTTAGG", "AACATTG", 3, false},
+            {"ACACTGCAATGTTAG", "AACATTG", 2, false},
+            {"CACACTGCAATGTTA", "AACATTG", 1, false},
+            {"AACATTGCAGTGTGT", "AACATTG", 0, false},
+            {"AACACACTGCAATGT", "AACACAC", 8, true }  // revcomp minimizer
+          };
+
+        size_t idx = 0;
+
+        #define CHECK(idx) \
+            CPPUNIT_ASSERT (  \
+                   model.toString (kmer.value()) == table[idx].kmer \
+                && modelMini.toString(kmer.minimizer().value()) == table[idx].minimizer \
+                && kmer.position()   == table[idx].position  \
+                && kmer.hasChanged() == table[idx].changed)
+
+        ModelMinimizer::Kmer kmer = model.codeSeed (seq, Data::ASCII);
+        CHECK (idx);  idx++;
+        seq += kmerSize;
+
+        for ( ; idx < ARRAY_SIZE(table); idx++)
+        {
+            kmer = model.codeSeedRight (kmer, *(seq++), Data::ASCII);
+
+            if (model.toString (kmer.value()) != table[idx].kmer)
+                cout << endl << "ModelCanonical: " << "canonical kmer is " << model.toString (kmer.value()) <<" and not, in the table, " << table[idx].kmer << " (TestKmer is wrong)" <<  endl;
+
+            if (modelMini.toString(kmer.minimizer().value()) != table[idx].minimizer)
+                cout << endl << "ModelCanonical: " << "kmer " << model.toString (kmer.value()) <<", minimizer should be " << table[idx].minimizer << " but actually found " <<  modelMini.toString(kmer.minimizer().value()) <<  endl;
+
+            if (kmer.position() != table[idx].position)
+                cout << endl << "ModelCanonical: " << "kmer " << model.toString (kmer.value()) <<", minimizer should be at position " << table[idx].position << " but actually found at position " <<  kmer.position()  <<  endl;
+
+            if (kmer.hasChanged() != table[idx].changed)
+                cout << endl << "ModelCanonical: " << "kmer " << model.toString (kmer.value()) <<", minimizer should changed y/n: " << table[idx].changed << " but actually changed y/n: " <<  kmer.hasChanged()  <<  endl;
+
+            CHECK (idx);
+        }
+    }
+
+
+    /********************************************************************************/
+
+    typedef Kmer<>::ModelDirect  ModelDirect;
+
+    struct kmer_badchar_info
+    {
+        const char* kmer;
+        bool        valid;
+    };
+
+    struct kmer_badchar_functor
+    {
+        const ModelDirect& model;
+        kmer_badchar_info* table;
+        size_t             length;
+
+        kmer_badchar_functor (const ModelDirect& model, kmer_badchar_info* table, size_t length) : model(model), table(table), length(length) {}
+
+        void operator() (const ModelDirect::Kmer& kmer, size_t idx)
+        {
+            CPPUNIT_ASSERT (kmer.isValid() == table[idx].valid);
+
+            if (kmer.isValid())
+            {
+                CPPUNIT_ASSERT (model.toString(kmer.value()) == table[idx].kmer);
+            }
+            else
+            {
+                // Bad nucleotides should have replaced N by G
+                string modif (table[idx].kmer);
+                for (size_t i=0; i<modif.size(); i++)  { if (modif[i]=='N') { modif[i]='G'; }}
+                CPPUNIT_ASSERT (model.toString(kmer.value()) == modif);
+            }
+        }
+    };
+
+    /** */
+    void kmer_badchar (void)
+    {
+        typedef Kmer<>::ModelDirect  ModelDirect;
+
+        size_t kmerSize = 11;
+        ModelDirect model (kmerSize);
+
+        const char* seq = "ACGNCNTGCTAGCTATTTAGCTTTAGANAGTAGATGACGCNC";
+
+        kmer_badchar_info info[] =
+        {
+            {"ACGNCNTGCTA", false}, {"CGNCNTGCTAG", false}, {"GNCNTGCTAGC", false}, {"NCNTGCTAGCT", false},
+            {"CNTGCTAGCTA", false}, {"NTGCTAGCTAT", false}, {"TGCTAGCTATT", true }, {"GCTAGCTATTT", true },
+            {"CTAGCTATTTA", true }, {"TAGCTATTTAG", true }, {"AGCTATTTAGC", true }, {"GCTATTTAGCT", true },
+            {"CTATTTAGCTT", true }, {"TATTTAGCTTT", true }, {"ATTTAGCTTTA", true }, {"TTTAGCTTTAG", true },
+            {"TTAGCTTTAGA", true }, {"TAGCTTTAGAN", false}, {"AGCTTTAGANA", false}, {"GCTTTAGANAG", false},
+            {"CTTTAGANAGT", false}, {"TTTAGANAGTA", false}, {"TTAGANAGTAG", false}, {"TAGANAGTAGA", false},
+            {"AGANAGTAGAT", false}, {"GANAGTAGATG", false}, {"ANAGTAGATGA", false}, {"NAGTAGATGAC", false},
+            {"AGTAGATGACG", true }, {"GTAGATGACGC", true }, {"TAGATGACGCN", false}, {"AGATGACGCNC", false}
+        };
+
+        Data data (Data::ASCII);
+        data.set ((char*)seq, strlen(seq));
+
+        kmer_badchar_functor fct (model, info, ARRAY_SIZE(info));
+
+        model.iterate (data, fct);
+    }
+
+    void kmer_tostring (void)
+    {
+#if KSIZE_32
+#else
+        size_t kmerSize = 121;
+        static const size_t KSIZE_3 = KMER_SPAN(3);
+        typedef typename Kmer<KSIZE_3>::ModelCanonical Model;
+        Model model (kmerSize);
+
+        string kmer_str = "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAGATACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAA";
+ 
+        Model::Kmer kmer = model.codeSeed (kmer_str.c_str(), Data::ASCII);
+        
+        if (model.toString(kmer.value()) != kmer_str)
+             std::cout << "in anticipation of failed assert, model.toString(kmer) = " << model.toString(kmer.value()) << ", kmer = " << kmer_str << std::endl;       
+        CPPUNIT_ASSERT (model.toString(kmer.value()) == kmer_str);
+#endif
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestKmer);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestKmer);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/kmer/TestKmerBank.cpp b/gatb-core/test/unit/src/kmer/TestKmerBank.cpp
new file mode 100644
index 0000000..1fc9fb8
--- /dev/null
+++ b/gatb-core/test/unit/src/kmer/TestKmerBank.cpp
@@ -0,0 +1,167 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/Data.hpp>
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+#include <gatb/kmer/impl/BankKmers.hpp>
+#include <gatb/bank/impl/Banks.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <iostream>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+extern std::string DBPATH (const string& a);
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestKmerBank : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestKmerBank);
+
+        CPPUNIT_TEST_GATB (kmerbank_checkKmersFromBankAndBankBinary);
+        CPPUNIT_TEST_GATB (kmers_bankiterate);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template<class ModelType>
+    void kmerbank_checkKmersFromBankAndBankBinary_aux (const char* filepath, size_t span)
+    {
+        /** Shortcuts. */
+        typedef typename ModelType::Kmer     Kmer;
+        typedef typename ModelType::Iterator ModelIterator;
+
+        string filename    = DBPATH (filepath);
+        string filenameBin = filepath + string(".bin");
+
+        /** We check that the bank exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        /** We declare a kmer model with a given span size. */
+        ModelType model (span);
+
+        /** We declare the two banks.
+         *  WARNING! we don't remove the bad characters (param 'false') in the binary bank,
+         *  otherwise the two bank won't be comparable anymore. */
+        BankFasta  bank1 (filename);
+        BankBinary bank2 (filenameBin, false);
+
+        /** We convert the fasta bank in binary format. */
+        Iterator<Sequence>* itSeq1 = bank1.iterator();
+        for (itSeq1->first(); !itSeq1->isDone(); itSeq1->next())   {  bank2.insert (itSeq1->item());  }   bank2.flush ();
+
+        /** We declare two kmer iterators for the two banks and a paired one that links them. */
+        ModelIterator* itKmer1 = new ModelIterator (model);   LOCAL (itKmer1);
+        ModelIterator* itKmer2 = new ModelIterator (model);   LOCAL (itKmer2);
+
+        PairedIterator<Kmer, Kmer> itKmer (itKmer1, itKmer2);
+
+        /** We loop the two banks with a paired iterator. */
+        Iterator<Sequence>* itSeq2 = bank2.iterator();
+        PairedIterator<Sequence,Sequence> itSeq (itSeq1, itSeq2);
+
+        /** We loop the sequences of the two banks. */
+        for (itSeq.first(); !itSeq.isDone();  itSeq.next())
+        {
+            /** We set the data from which we want to extract kmers. */
+            itKmer1->setData ((*itSeq1)->getData());
+            itKmer2->setData ((*itSeq2)->getData());
+
+            /** We loop the kmers for the two datas. */
+            for (itKmer.first(); !itKmer.isDone();  itKmer.next())
+            {
+                CPPUNIT_ASSERT (itKmer->first.value() == itKmer->second.value());
+            }
+        }
+    }
+
+    /** \brief check that Bank and BankBinary provide the same set of kmers
+     *
+     * This test builds a binary bank from a fasta bank and check that the all the kmers from
+     * initial bank are the same as the binary bank.
+     */
+    void kmerbank_checkKmersFromBankAndBankBinary ()
+    {
+        const char* files[] = { "reads1.fa", "reads1.fa.gz", "reads2.fa" };
+        size_t      spans[] = { 2, 3, 5, 8, 13, 21 };
+
+        for (size_t i=0; i<ARRAY_SIZE(files); i++)
+        {
+            for (size_t j=0; j<ARRAY_SIZE(spans); j++)
+            {
+                kmerbank_checkKmersFromBankAndBankBinary_aux <Kmer<>::ModelDirect>    (files[i], spans[j]);
+                kmerbank_checkKmersFromBankAndBankBinary_aux <Kmer<>::ModelCanonical> (files[i], spans[j]);
+            }
+        }
+    }
+
+    /********************************************************************************/
+    void kmers_bankiterate ()
+    {
+        for (size_t i=0; i<12; i++)
+        {
+            u_int64_t nbKmers = 0;
+
+            Iterator<Sequence>* it = BankKmers (i).iterator();  LOCAL (it);
+
+            for (it->first(); !it->isDone(); it->next())  { nbKmers ++; }
+
+            CPPUNIT_ASSERT (nbKmers == ((u_int64_t)1<<(2*i)));
+        }
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestKmerBank);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestKmerBank);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/kmer/TestMPHF.cpp b/gatb-core/test/unit/src/kmer/TestMPHF.cpp
new file mode 100644
index 0000000..ac9dcbb
--- /dev/null
+++ b/gatb-core/test/unit/src/kmer/TestMPHF.cpp
@@ -0,0 +1,334 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/bank/impl/Bank.hpp>
+#include <gatb/bank/impl/BankStrings.hpp>
+
+#include <gatb/kmer/impl/SortingCountAlgorithm.hpp>
+#include <gatb/kmer/impl/MPHFAlgorithm.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <gatb/tools/collections/impl/BooPHF.hpp>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::bank;
+using namespace gatb::core::bank::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+using namespace gatb::core::tools::dp;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for genomic databases management
+ */
+class TestMPHF : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestMPHF);
+
+        CPPUNIT_TEST_GATB (MPHF_check1);
+        CPPUNIT_TEST_GATB (MPHF_check2);
+
+        // no mphf1 anymore
+        CPPUNIT_TEST_GATB (test_mphf2);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    () {}
+    void tearDown () {}
+
+        // SMALL VALUE NEEDED because continuous integration servers are not very powerful...
+        static const u_int64_t MAX_MEMORY = 1000;
+
+
+    /** Shortcuts. */
+    typedef Kmer<32>::Count Count;
+    typedef Kmer<32>::Type  Type;
+
+    /********************************************************************************/
+    void MPHF_check1 ()
+    {
+        size_t kmerSize = 11;
+        size_t nks      = 1;
+
+        const char* seqs[] = {
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        } ;
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<> sortingCount (new BankStrings (seqs, ARRAY_SIZE(seqs)), params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        if (sortingCount.getSolidCounts()->getNbItems() != (int)(strlen(seqs[0]) - kmerSize + 1))
+            std::cout << "problem with sortingcount nb items: " << sortingCount.getSolidCounts()->getNbItems()  << " != " << (int)(strlen(seqs[0]) - kmerSize + 1) << std::endl;
+
+
+        CPPUNIT_ASSERT (sortingCount.getSolidCounts()->getNbItems() == (int)(strlen(seqs[0]) - kmerSize + 1) );
+
+        /** We get the storage instance. */
+        Storage* storage = sortingCount.getStorage();
+
+
+        /** We create a mphf instance. */
+        MPHFAlgorithm<> mphf (storage->getGroup("dsk"), "mphf", sortingCount.getSolidCounts(), sortingCount.getSolidKmers(), 1, true);
+
+        /** We actually execute the mphf construction. */
+        mphf.execute();
+            
+
+        if (mphf.getAbundanceMap() == 0)
+            std::cout << "could not get abundance map" << std::endl;
+
+        CPPUNIT_ASSERT (mphf.getAbundanceMap() != 0);
+
+        MPHFAlgorithm<>::AbundanceMap& theMap = * mphf.getAbundanceMap();
+
+        // below are quick tests
+
+        if (theMap.size() != 130)
+            std::cout << "incorrect map size:" << theMap.size() << " != 130" << std::endl;
+
+        CPPUNIT_ASSERT (theMap.size() == 130);
+
+        typedef /*typename*/ Kmer<32>::ModelCanonical       Model;
+        typedef /*typename*/ Kmer<32>::ModelCanonical::Kmer Kmer;
+        Model model (11);
+
+        Kmer kmer = model.codeSeed ("ACCATGTATAA", Data::ASCII);
+
+		
+        theMap.at(kmer.value()) = 4;
+
+        if (theMap.at(kmer.value()) != 4)
+            std::cout << "bad map value " << theMap[kmer.value()]  << " != 4"  << std::endl;
+        CPPUNIT_ASSERT (theMap.at(kmer.value()) == 4);
+    }
+
+    /********************************************************************************/
+    void MPHF_check2 ()
+    {
+        /** We define our MPHF type for kmers. */
+        typedef BooPHF<Type> MPHF;
+
+        size_t kmerSize = 11;
+        size_t nks      = 1;
+
+        const char* seqs[] = {
+            "CGCTACAGCAGCTAGTTCATCATTGTTTATCAATGATAAAATATAATAAGCTAAAAGGAAACTATAAATA"
+            "ACCATGTATAATTATAAGTAGGTACCTATTTTTTTATTTTAAACTGAAATTCAATATTATATAGGCAAAG"
+        } ;
+
+        //////////////////////////////////////////////////
+        // PART 1 : we get solid kmers from SortingCount
+        //////////////////////////////////////////////////
+
+        /** We configure parameters for a SortingCountAlgorithm object. */
+        IProperties* params = SortingCountAlgorithm<>::getDefaultProperties();
+        params->setInt (STR_KMER_SIZE,          kmerSize);
+        params->setInt (STR_KMER_ABUNDANCE_MIN, nks);
+        params->setInt (STR_MAX_MEMORY,         MAX_MEMORY);
+        params->setStr (STR_URI_OUTPUT,         "foo");
+
+        IBank* bank = new BankStrings (seqs, ARRAY_SIZE(seqs));
+        LOCAL (bank);
+
+        /** We create a DSK instance. */
+        SortingCountAlgorithm<> sortingCount (bank, params);
+
+        /** We launch DSK. */
+        sortingCount.execute();
+
+        // Shortcut
+        Iterable<Type>* solids = sortingCount.getSolidKmers();
+        LOCAL (solids);
+
+        size_t nbSolids = solids->getNbItems();
+
+        //////////////////////////////////////////////////
+        // PART 2 : we build a hash and save it
+        //////////////////////////////////////////////////
+        TimeInfo ti;
+
+        /** We create a hash for the result of DSK. */
+        MPHF hash1;
+
+        /** We build the hash function. */
+        ti.start("build");
+        hash1.build (solids);
+        ti.stop("build");
+
+        CPPUNIT_ASSERT (hash1.size() == nbSolids);
+
+        // We save the hash object in the dedicated storage group.
+        ti.start("save");
+        hash1.save (sortingCount.getStorage()->getGroup("dsk"), "mphf");
+        ti.stop("save");
+
+        // We need a vector to check codes existence
+        vector<bool> check (nbSolids);
+        CPPUNIT_ASSERT (check.size()==nbSolids);
+
+        // We get an iterator on the solid kmers.
+        Iterator<Type>* itSolids = solids->iterator();
+        LOCAL (itSolids);
+
+        // We loop over the solid kmers
+        for (itSolids->first(); !itSolids->isDone(); itSolids->next())
+        {
+            // We get the hash code for the current key
+            MPHF::Code code = hash1 (itSolids->item());
+
+            // cout << "KEY=" << itSolids->item().value << "  VALUE=" << code << endl;
+
+            // We check we never saw that code before
+            CPPUNIT_ASSERT (check[code]==false);
+            check[code]=true;
+            CPPUNIT_ASSERT (check[code]==true);
+        }
+
+        // We check that all codes have been seen
+        for (size_t i=0; i<check.size(); i++)  { CPPUNIT_ASSERT(check[i]==true); }
+
+        typedef Kmer<32>::ModelCanonical       Model;
+        typedef Kmer<32>::ModelCanonical::Kmer Kmer;
+
+        // We create a kmer
+        Model model (kmerSize);
+        Kmer kmer = model.codeSeed ("ACCATGTATAA", Data::ASCII);
+
+        // We check that it is known by the hash function
+        hash1 (kmer.value());
+
+        //////////////////////////////////////////////////
+        // PART 3 : we read the hash from a storage
+        //////////////////////////////////////////////////
+        MPHF hash2;
+        hash2.load (sortingCount.getStorage()->getGroup("dsk"), "mphf");
+
+        CPPUNIT_ASSERT (hash1.size() == hash2.size());
+
+        // We check that both hash instances have the same content.
+        for (itSolids->first(); !itSolids->isDone(); itSolids->next())
+        {
+            // We get the hash code for the current key
+           CPPUNIT_ASSERT (hash1 (itSolids->item()) == hash2 (itSolids->item()));
+        }
+    }
+
+
+    /********************************************************************************/
+    void test_mphf2 (void)
+    {
+        /** Shortcuts. */
+        typedef int Key;
+        typedef BooPHF<Key>   Hash;
+        typedef Hash::Code HashValue;
+
+            // We create a list of keys.
+            Key values[] = {1,2,3,5,8,13,21,34,55,89};
+            std::list<Key> l (values, values + sizeof(values)/sizeof(values[0]) );
+
+            // We create a bag from this list
+            BagFile<Key> bagFile ("./keys");
+            for (list<Key>::iterator it=l.begin(); it!=l.end(); ++it)  {  bagFile.insert (*it);  }
+            bagFile.flush();
+
+            // We create an iterable from the file
+            IterableFile<Key> iterableFile ("./keys");
+
+            CPPUNIT_ASSERT (iterableFile.getNbItems() == (int)l.size());
+
+            // We create our hash function object
+            Hash hash;
+
+            // We build the hash function with the keys in the iterator
+            hash.build (&iterableFile);
+
+            CPPUNIT_ASSERT (hash.size() == l.size());
+
+            // We need a vector to check codes existence
+            vector<bool> check (l.size());
+
+            // We dump each hash code for each key
+            Iterator<Key>* itKeys = iterableFile.iterator();  LOCAL (itKeys);
+
+            for (itKeys->first(); !itKeys->isDone(); itKeys->next())
+            {
+                // We get the hash code for the current key
+                HashValue code = hash (itKeys->item());
+
+                // We check we never saw that code before
+                CPPUNIT_ASSERT (check[code]==false);
+                check[code]=true;
+                CPPUNIT_ASSERT (check[code]==true);
+            }
+
+            // We check that all codes have been seen
+            for (size_t i=0; i<check.size(); i++)  { CPPUNIT_ASSERT(check[i]==true); }
+        }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestMPHF);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestMPHF);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/main.cpp b/gatb-core/test/unit/src/main.cpp
new file mode 100644
index 0000000..9a2faa5
--- /dev/null
+++ b/gatb-core/test/unit/src/main.cpp
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "CppunitCommon.hpp"
+
+#include <iostream>
+#include <cstdlib>
+#include <cstring>
+
+using namespace std;
+
+/********************************************************************************/
+/** GATB package */
+namespace gatb    {
+/** GATB tests package */
+namespace tests   {
+} }
+/********************************************************************************/
+
+static string dbprefix;
+
+/********************************************************************************/
+std::string DBPATH (const string& a)
+{
+    return dbprefix + string("/") +  a;
+}
+
+/********************************************************************************/
+int main (int argc, char **argv)
+{
+    if (argc==2 && strcmp(argv[1], "-h")==0){
+        std::cout << "Use: gatb-core-cppunit [<test-name>] [<path-to-test/db>]\n" << std::endl;
+        std::cout << "     where: <test-name>: comma separated list of unit test names." << std::endl;
+        std::cout << "                         e.g.: 'TestLeon,TestBank'. Default: 'all'." << std::endl;
+        std::cout << "                         Test names are case sensitivie." << std::endl;
+        std::cout << "            <path-to-test/db>: path to directory containing GATB-Core test files." << std::endl;
+        std::cout << "                               Default: ../test/db \n" << std::endl;
+        std::cout << "By default, tests are executed in silent mode. Use CPPUNIT_VERBOSE=1 to switch to verbose mode."<< std::endl;
+        return 0;
+    }
+    /** We may launch only selected test(s). */
+    char* testname = strdup (argc >=2 ? argv[1] : "all");
+    if (strcmp(testname, "all")==0){//shortcut to run All tests
+        testname = strdup("All Tests");
+    }
+    
+    /** We set the directory where the db are. */
+    dbprefix = (argc >=3 ? argv[2] : "../test/db");
+
+    /** We may have an ouput xml file. */
+    char* xmloutput = (argc >=4 ? argv[3] : 0);
+
+    // informs test-listener about testresults
+    TestResult testresult;
+
+    // register listener for collecting the test-results
+    TestResultCollector collectedresults;
+    testresult.addListener (&collectedresults);
+
+    BriefTestProgressListener progress;
+    if (getenv ("CPPUNIT_VERBOSE")) {
+        testresult.addListener (&progress);
+    }
+    else {
+        std::cout << "Tests executed in silent mode.\n  -> Use CPPUNIT_VERBOSE=1 to switch to verbose mode.\n"<< std::endl;
+    }
+
+    TextTestRunner runner;
+
+    for (char* loop = strtok (testname,","); loop != 0;  loop = strtok (NULL, ","))
+    {
+        runner.addTest ( TestFactoryRegistry::getRegistry(loop).makeTest ());
+    }
+
+    runner.run (testresult);
+
+    // output results in compiler-format
+    CompilerOutputter compileroutputter (&collectedresults, std::cout);
+    compileroutputter.write ();
+
+    // Output XML
+    if (xmloutput != 0)
+    {
+        ofstream xmlFileOut (xmloutput);
+        XmlOutputter xmlOut (&collectedresults, xmlFileOut);
+        xmlOut.write();
+    }
+
+    free (testname);
+
+    // return 0 if tests were successful
+    return collectedresults.wasSuccessful() ? 0 : 1;
+}
diff --git a/gatb-core/test/unit/src/system/TestSystem.cpp b/gatb-core/test/unit/src/system/TestSystem.cpp
new file mode 100644
index 0000000..a208746
--- /dev/null
+++ b/gatb-core/test/unit/src/system/TestSystem.cpp
@@ -0,0 +1,974 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/api/Exception.hpp>
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/impl/MemoryCommon.hpp>
+#include <gatb/system/impl/TimeCommon.hpp>
+#include <gatb/system/impl/FileSystemCommon.hpp>
+
+#include <list>
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+using namespace std;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestSystem : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestSystem);
+
+        CPPUNIT_TEST_GATB (types_check);
+
+        CPPUNIT_TEST_GATB (info_get);
+
+#ifdef WITH_MEMORY_SIZE_STORE
+        CPPUNIT_TEST_GATB (memory_basicAlloc);
+        CPPUNIT_TEST_GATB (memory_getMemUsage);
+        CPPUNIT_TEST_GATB (memory_hugeAlloc);
+        CPPUNIT_TEST_GATB (memory_realloc);
+        CPPUNIT_TEST_GATB (memory_boundedAllocator);
+        CPPUNIT_TEST_GATB (memory_perfAllocator);
+#endif
+        CPPUNIT_TEST_GATB (memory_memset);
+        CPPUNIT_TEST_GATB (memory_memcpy);
+        CPPUNIT_TEST_GATB (memory_memcmp);
+        // CPPUNIT_TEST_GATB (memory_allocateAll);
+
+        CPPUNIT_TEST_GATB (time_checkSensibility);
+        CPPUNIT_TEST_GATB (time_checkException);
+        // CPPUNIT_TEST_GATB (time_clockFrequency);  TSC values may be wrong for some arch
+
+        CPPUNIT_TEST_GATB (thread_checkTime);
+        CPPUNIT_TEST_GATB (thread_checkSynchro);
+        CPPUNIT_TEST_GATB (thread_exception);
+
+        CPPUNIT_TEST_GATB (filesystem_info);
+        CPPUNIT_TEST_GATB (filesystem_create_delete);
+        CPPUNIT_TEST_GATB (filesystem_iterate);
+        CPPUNIT_TEST_GATB (file_create);
+
+//        CPPUNIT_TEST_GATB (file_attributes);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    /** \brief check the size of typedef types (u_int32_t for instance)
+     *
+     * Check types size with sizeof
+     */
+    void types_check ()
+    {
+        CPPUNIT_ASSERT (sizeof(u_int8_t)  == 1);
+        CPPUNIT_ASSERT (sizeof(u_int16_t) == 2);
+        CPPUNIT_ASSERT (sizeof(u_int32_t) == 4);
+        CPPUNIT_ASSERT (sizeof(u_int64_t) == 8);
+
+        CPPUNIT_ASSERT (sizeof(int8_t)  == 1);
+        CPPUNIT_ASSERT (sizeof(int16_t) == 2);
+        CPPUNIT_ASSERT (sizeof(int32_t) == 4);
+        CPPUNIT_ASSERT (sizeof(int64_t) == 8);
+    }
+
+    /********************************************************************************/
+    /** \brief Check that we can retrieve system information.
+     *
+     * Test of \ref gatb::core::system::ISystemInfo::getNbCores()     \n
+     * Test of \ref gatb::core::system::ISystemInfo::getHostName()    \n
+     */
+    void info_get ()
+    {
+        CPPUNIT_ASSERT (System::info().getNbCores() >= 1);
+        CPPUNIT_ASSERT (System::info().getHostName().empty() == false);
+        CPPUNIT_ASSERT (System::info().getVersion().empty() == false);
+    }
+
+    /********************************************************************************/
+    class Check
+    {
+    public:
+
+        static Check& singleton()  { static Check instance; return instance; }
+
+        /********************************************************************************/
+        void memory_basicAlloc (IMemory& mem)
+        {
+            /** We snapshot the current memory usage and block numbers. */
+            u_int32_t m0 = mem.getCurrentUsage();
+            u_int32_t n0 = mem.getNbBlocks();
+
+            void* p1=0;
+            void* p2=0;
+
+            /** We check that we have not increased memory usage. */
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+            
+            CPPUNIT_ASSERT_NO_THROW (p1 = mem.malloc (    1000));
+            CPPUNIT_ASSERT_NO_THROW (p2 = mem.calloc (10, 1000));
+
+            /** We check that we have increased memory usage. */
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 > 0);
+
+            /** We check that we have two allocated blocks. */
+            CPPUNIT_ASSERT (mem.getNbBlocks() - n0 == 2);
+
+            mem.free (p1);
+            mem.free (p2);
+
+            /** We check that the memory usage is back as it initial value. */
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+
+            /** We check that we have no more allocated blocks. */
+            CPPUNIT_ASSERT (mem.getNbBlocks() - n0  == 0);
+        }
+
+        /********************************************************************************/
+        void memory_getMemUsage_aux (IMemory& mem, size_t nbBlocks, size_t* blockSizeTable, size_t sizeTable)
+        {
+            for (size_t i=0; i<sizeTable; i++)
+            {
+                size_t blockSize = blockSizeTable[i];
+
+                /** We need a table of pointers. */
+                void* ptrs[nbBlocks];
+
+                /** We snapshot the current memory usage. */
+                u_int32_t m0 = mem.getCurrentUsage();
+
+                /** We allocate nbBlocks memory blocks. */
+                for (size_t i=0; i<nbBlocks; i++)
+                {
+                    /** We allocate (and keep a reference) a memory block. */
+                    ptrs [i] =  mem.malloc (blockSize);
+
+                    //printf ("+++ [%d]  %d  %d\n", i, mem.getCurrentUsage() - m0,  (i+1)*blockSize);
+
+                    /** We check that the current memory usage is increasing. */
+                    CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 >= (i+1)*blockSize);
+                }
+
+                for (size_t i=0; i<nbBlocks; i++)
+                {
+                    /** We deallocate the memory block. */
+                    mem.free (ptrs[i]);
+
+                    //printf ("--- [%d]  %d  %d\n", i, mem.getCurrentUsage() - m0,  (nbBlocks-i-1)*blockSize);
+
+                    /** We check that the current memory usage is decreasing. */
+                    CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 < (nbBlocks-i)*blockSize );
+                }
+
+                /** We check that the current memory usage is the same at the beginning of the test. */
+                CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+            }
+        }
+
+        /********************************************************************************/
+        void memory_hugeAlloc (IMemory& mem)
+        {
+            void* p1=0;
+            void* p2=0;
+
+            /** We snapshot the current memory usage and block numbers. */
+            u_int32_t m0 = mem.getCurrentUsage();
+            u_int32_t n0 = mem.getNbBlocks();
+
+            CPPUNIT_ASSERT_NO_THROW (p1 = mem.malloc (KBYTE+0));
+            CPPUNIT_ASSERT_THROW    (p2 = mem.malloc (KBYTE+1), gatb::core::system::Exception);
+
+            CPPUNIT_ASSERT (mem.getNbBlocks() - n0  == 1);
+
+            CPPUNIT_ASSERT (p1 != 0);
+            CPPUNIT_ASSERT (p2 == 0);
+
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 > 0);
+            mem.free (p1);
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+
+            CPPUNIT_ASSERT (mem.getNbBlocks() - n0  == 0);
+        }
+
+        /********************************************************************************/
+        void memory_realloc (IMemory& mem)
+        {
+            void* p1=0;
+
+            CPPUNIT_ASSERT (p1 == 0);
+
+            for (size_t i=1; i<=100; i++)
+            {
+                p1 = mem.realloc (p1, i*1000);
+                CPPUNIT_ASSERT (p1 != 0);
+            }
+
+            mem.free (p1);
+        }
+
+        /********************************************************************************/
+        void memory_boundedAllocator (IMemory& mem)
+        {
+            /** We snapshot the current memory usage and block numbers. */
+            u_int32_t m0 = mem.getCurrentUsage();
+            u_int32_t n0 = mem.getNbBlocks();
+
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+            CPPUNIT_ASSERT (mem.getNbBlocks()     - n0 == 0);
+
+            void* p1 = mem.malloc (130);
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 >= 130);
+            CPPUNIT_ASSERT (mem.getNbBlocks()     - n0 == 1);
+
+            mem.free (p1);
+            CPPUNIT_ASSERT (mem.getCurrentUsage() - m0 == 0);
+            CPPUNIT_ASSERT (mem.getNbBlocks()     - n0 == 0);
+        }
+
+        /********************************************************************************/
+        ITime::Value memory_perfAllocator (IMemoryAllocator& mem, size_t nb, IMemory::BlockSize_t size)
+        {
+            TimeSystem usec (ITime::MSEC);
+
+            ITime::Value t0 = usec.getTimeStamp();
+
+            for (size_t i=0; i<nb; i++)
+            {
+                void* ptr = mem.malloc (size);
+                mem.free (ptr);
+            }
+
+            ITime::Value t1 = usec.getTimeStamp();
+
+            return t1 - t0;
+        }
+    };
+
+    /********************************************************************************/
+    /********************************************************************************/
+    /********************************************************************************/
+    /** \brief Check basic allocations and check statistics accordingly
+     *
+     *  Test of \ref gatb::core::system::IMemory::getCurrentUsage()   \n
+     *  Test of \ref gatb::core::system::IMemory::getNbBlocks()       \n
+     *  Test of \ref gatb::core::system::IMemory::malloc()            \n
+     *  Test of \ref gatb::core::system::IMemory::calloc()            \n
+     *  Test of \ref gatb::core::system::IMemory::free()              \n
+     */
+    void memory_basicAlloc ()
+    {
+
+        MemoryBounded allocator (System::memory(), 2048*KBYTE, 11*2048*KBYTE);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        Check::singleton().memory_basicAlloc (System::memory());
+        Check::singleton().memory_basicAlloc (mem);
+    }
+
+    /********************************************************************************/
+    /** \brief Test of memory usage evolution
+     *
+     *  1) allocate several blocks and check that the used memory increases     \n
+     *  2) deallocate the blocks and check that the used memory decreases       \n
+     *  3) check that the final memory usage is the same as at the test start   \n
+     *
+     * Test of \ref gatb::core::system::IMemory::getCurrentUsage()    \n
+     * Test of \ref gatb::core::system::IMemory::malloc()             \n
+     * Test of \ref gatb::core::system::IMemory::free()               \n
+     */
+    void memory_getMemUsage ()
+    {
+        size_t nbBlocks = 10;
+        size_t blockSizeTable[] = { 128*KBYTE, 1024*KBYTE, 2048*KBYTE };
+        size_t blockSizeLength  = sizeof(blockSizeTable) / sizeof(blockSizeTable[0]);
+
+        /** We create a bounded memory allocator. */
+        MemoryBounded allocator (System::memory(), 2048*KBYTE, 11*2048*KBYTE);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        /** Note: since the getMemUsage is not completely accurate for the generic allocator,
+         * we use big block sizes in order not to have failed tests here. */
+
+        Check::singleton().memory_getMemUsage_aux (System::memory(), nbBlocks, blockSizeTable, blockSizeLength);
+        Check::singleton().memory_getMemUsage_aux (mem,                nbBlocks, blockSizeTable, blockSizeLength);
+    }
+
+    /********************************************************************************/
+    /** \brief Force to have an exception due to too big required size
+     *
+     * This test checks that an impossible malloc raises an exception.
+     *
+     * Test of \ref gatb::core::system::IMemory::getCurrentUsage()    \n
+     * Test of \ref gatb::core::system::IMemory::getNbBlocks()        \n
+     * Test of \ref gatb::core::system::IMemory::malloc()             \n
+     * Test of \ref gatb::core::system::IMemory::free()               \n
+     */
+    void memory_hugeAlloc ()
+    {
+        MemoryBounded allocator (System::memory(), KBYTE, 100*KBYTE);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        Check::singleton().memory_hugeAlloc (mem);
+    }
+
+    /********************************************************************************/
+    /** \brief Reallocation test
+     *
+     * Test of \ref gatb::core::system::IMemory::realloc()    \n
+     * Test of \ref gatb::core::system::IMemory::free()       \n
+     */
+    void memory_realloc ()
+    {
+        MemoryBounded allocator (System::memory(), MBYTE, 100*MBYTE);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        Check::singleton().memory_realloc (System::memory());
+        Check::singleton().memory_realloc (mem);
+    }
+
+    /********************************************************************************/
+    /** \brief Test of the \ref gatb::core::system::impl::MemoryBounded class
+     *
+     *  Test of \ref gatb::core::system::IMemory::getCurrentUsage()   \n
+     *  Test of \ref gatb::core::system::IMemory::getNbBlocks()       \n
+     *  Test of \ref gatb::core::system::IMemory::malloc()            \n
+     *  Test of \ref gatb::core::system::IMemory::free()              \n
+     */
+    void memory_boundedAllocator ()
+    {
+        MemoryBounded allocator (System::memory(), 128*KBYTE, 64*MBYTE);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        Check::singleton().memory_boundedAllocator (mem);
+    }
+
+    /********************************************************************************/
+    /** \brief Memory allocation performance test
+     *
+     * Test of \ref gatb::core::system::IMemory::malloc() \n
+     * Test of \ref gatb::core::system::IMemory::free()   \n
+     * Test of \ref gatb::core::system::impl::TimeSystem::getTimeStamp()   \n
+     */
+    void memory_perfAllocator ()
+    {
+        size_t               nb   = 10*1000;
+        IMemory::BlockSize_t size = 64*MBYTE;
+
+        Check::singleton().memory_perfAllocator (System::memory(),                   nb, size);
+        Check::singleton().memory_perfAllocator (MemoryAllocatorStdlib::singleton(), nb, size);
+    }
+
+    /********************************************************************************/
+    /** \brief Check memset operation
+     *
+     * Test of \ref gatb::core::system::IMemory::malloc() \n
+     * Test of \ref gatb::core::system::IMemory::memset() \n
+     * Test of \ref gatb::core::system::IMemory::free()   \n
+     */
+    void memory_memset ()
+    {
+        size_t nb = 10000;
+        int c = 47;
+
+        /** We allocate a block. */
+        u_int8_t* ptr = (u_int8_t*) System::memory().malloc (nb);
+        CPPUNIT_ASSERT (ptr != 0);
+
+        /** We reset all values of the block. */
+        System::memory().memset (ptr, c, nb);
+
+        /** We check that all values are ok. */
+        for (size_t i=0; i<nb; i++)  {  CPPUNIT_ASSERT (ptr[i] == c); }
+
+        /** We release the block. */
+        System::memory().free (ptr);
+    }
+
+    /********************************************************************************/
+    /** \brief Check memcpy operation
+     *
+     * Test of \ref gatb::core::system::IMemory::malloc() \n
+     * Test of \ref gatb::core::system::IMemory::memset() \n
+     * Test of \ref gatb::core::system::IMemory::memcpy() \n
+     * Test of \ref gatb::core::system::IMemory::free()   \n
+     */
+    void memory_memcpy ()
+    {
+        size_t nb = 10000;
+        int c1=11, c2=47;
+
+        /** We allocate a block. */
+        u_int8_t* ptr1 = (u_int8_t*) System::memory().malloc (nb);
+        CPPUNIT_ASSERT (ptr1 != 0);
+
+        /** We allocate a block. */
+        u_int8_t* ptr2 = (u_int8_t*) System::memory().malloc (nb);
+        CPPUNIT_ASSERT (ptr2 != 0);
+
+        /** We reset all values of the blocks. */
+        System::memory().memset (ptr1, c1, nb);
+        System::memory().memset (ptr2, c2, nb);
+
+        /** We check that all values are ok. */
+        for (size_t i=0; i<nb; i++)  {  CPPUNIT_ASSERT (ptr1[i] == c1); }
+        for (size_t i=0; i<nb; i++)  {  CPPUNIT_ASSERT (ptr2[i] == c2); }
+
+        /** We copy block 1 into block 2. */
+        System::memory().memcpy (ptr2, ptr1, nb);
+
+        /** We check that all values are ok. */
+        for (size_t i=0; i<nb; i++)  {  CPPUNIT_ASSERT (ptr2[i] == c1); }
+
+        /** We release the blocks. */
+        System::memory().free (ptr1);
+        System::memory().free (ptr2);
+    }
+
+    /********************************************************************************/
+    /** \brief Check memcmp operation
+     *
+     * Test of \ref gatb::core::system::IMemory::malloc() \n
+     * Test of \ref gatb::core::system::IMemory::memcmp() \n
+     * Test of \ref gatb::core::system::IMemory::free()   \n
+     */
+    void memory_memcmp ()
+    {
+        size_t nb = 10000;
+        int c1=11, c2=47;
+
+        /** We allocate a block. */
+        u_int8_t* ptr1 = (u_int8_t*) System::memory().malloc (nb);
+        CPPUNIT_ASSERT (ptr1 != 0);
+
+        /** We allocate a block. */
+        u_int8_t* ptr2 = (u_int8_t*) System::memory().malloc (nb);
+        CPPUNIT_ASSERT (ptr2 != 0);
+
+        /** We reset all values of the blocks. */
+        System::memory().memset (ptr1, c1, nb);
+        System::memory().memset (ptr2, c2, nb);
+
+        CPPUNIT_ASSERT (System::memory().memcmp (ptr1, ptr2, nb) != 0);
+
+        /** We copy block 1 into block 2. */
+        System::memory().memcpy (ptr2, ptr1, nb);
+
+        /** We check that all values are ok. */
+        CPPUNIT_ASSERT (System::memory().memcmp (ptr1, ptr2, nb) == 0);
+
+        /** We release the blocks. */
+        System::memory().free (ptr1);
+        System::memory().free (ptr2);
+    }
+
+    /********************************************************************************/
+    void memory_allocateAll ()
+    {
+        list<void*> ptrs;
+
+        IMemory::BlockSize_t len   =  1ull*MBYTE;
+        IMemory::TotalSize_t total =  6ull*GBYTE;
+
+        size_t nb = 0;
+
+        MemoryBounded allocator (System::memory(), 1*len, total);
+        MemoryCommon mem (allocator, MemoryOperationsCommon::singleton());
+
+        while (true)
+        {
+            try
+            {
+                void* ptr = mem.malloc (len);
+
+                if (ptr != 0)
+                {
+                    mem.memset (ptr, 0, len);
+
+                    ptrs.push_back (ptr);
+                    nb++;
+                }
+            }
+            catch (...)
+            {
+                break;
+            }
+        }
+
+        for (list<void*>::iterator it = ptrs.begin(); it != ptrs.end(); it++)
+        {
+            mem.free (*it);
+        }
+    }
+
+    /********************************************************************************/
+    /** \brief Check that ITime sensibility
+     *
+     *  This test waits for some time and checks that the elapsed time is coherent with the
+     *  retrieved values from several TimeSystem instances.
+     *
+     *  Test of \ref gatb::core::system::ITime::getTimeStamp()   \n
+     */
+    void time_checkSensibility ()
+    {
+        TimeSystem usec (ITime::USEC);
+        TimeSystem msec (ITime::MSEC);
+        TimeSystem  sec (ITime::SEC);
+
+        list<ITime*> timeList;
+        timeList.push_back (&usec);
+        timeList.push_back (&msec);
+        timeList.push_back (&sec);
+
+        size_t delayInSecond = 5;
+
+        for (list<ITime*>::iterator it = timeList.begin(); it != timeList.end(); it++)
+        {
+            ITime::Value t0 = (*it)->getTimeStamp();
+            sleep (delayInSecond);
+            ITime::Value t1 = (*it)->getTimeStamp();
+
+            CPPUNIT_ASSERT ((t1-t0) / (*it)->getUnit() == delayInSecond);
+        }
+    }
+
+    /********************************************************************************/
+    /** \brief Check that class TimeSystem is correcty constructed.
+     *
+     * Test of \ref gatb::core::system::impl::TimeSystem  \n
+     */
+    void time_checkException ()
+    {
+        CPPUNIT_ASSERT_NO_THROW (TimeSystem s (ITime::USEC));
+        CPPUNIT_ASSERT_NO_THROW (TimeSystem s (ITime::MSEC));
+        CPPUNIT_ASSERT_NO_THROW (TimeSystem s (ITime::SEC));
+        CPPUNIT_ASSERT_THROW    (TimeSystem s (ITime::UNDEFINED), gatb::core::system::Exception);
+    }
+
+    /********************************************************************************/
+    /** \brief Check that class TimeCycle retrieves correctly
+     * an estimation of the CPU frequency clock.
+     *
+     * Test of \ref gatb::core::system::impl::TimeCycle::getClockFrequency()  \n
+     */
+    void time_clockFrequency ()
+    {
+        /** We create a ITime instance with CPU cycle measures. */
+        TimeCycle ts;
+
+        CPPUNIT_ASSERT (ts.getClockFrequency() > 0);
+    }
+
+    /********************************************************************************/
+    static void* thread_checkTime_mainloop (void* data)
+    {
+        ITime::Value* totalTime = (ITime::Value*)data;
+
+        ITime::Value t0 = System::time().getTimeStamp();
+        sleep (2);
+        ITime::Value t1 = System::time().getTimeStamp();
+
+        __sync_fetch_and_add (totalTime, t1 - t0);
+
+        return 0;
+    }
+
+    /********************************************************************************/
+    /** \brief Check threads behavior
+     *
+     *  This test creates N threads and each thread waits for T seconds.
+     *  At the end, the aggregated time spent in the threads should be N.T and the
+     *  user time should be T. Note that the check is done by computing
+     *  (threadsTime - nbThreads*userTime) with some tolerance (up do 5%) because
+     *  it is unlikely that the relative error will always be 0.
+     *
+     *  The test is done each time with 1, 2, ... up to the number of available cores.
+     *
+     *  Test of \ref gatb::core::system::ISystemInfo::getNbCores()    \n
+     *  Test of \ref gatb::core::system::IThreadFactory::newThread()  \n
+     *  Test of \ref gatb::core::system::IThread::join()              \n
+     *  Test of \ref gatb::core::system::ITime::getTimeStamp()        \n
+     */
+    void thread_checkTime ()
+    {
+        /** We loop over the interval [1..nbCores] */
+        for (size_t nbCores=1; nbCores<=System::info().getNbCores(); nbCores++)
+        {
+            ITime::Value totalTime = 0;
+
+            /** We create some threads. */
+            IThread* threads [nbCores];
+            for (size_t i=0; i<nbCores; i++)   {  threads[i] = System::thread().newThread (thread_checkTime_mainloop, &totalTime);  }
+
+            ITime::Value t0 = System::time().getTimeStamp();
+
+            /** We wait the end of each thread. */
+            for (size_t i=0; i<nbCores; i++)   {  threads[i]->join();    delete threads[i];  }
+
+            ITime::Value t1 = System::time().getTimeStamp();
+
+            /** We compute the difference between threads time and user time. */
+            double err = 100.0 * ABS (1.0 - (double) (nbCores*(t1-t0)) / (double) totalTime);
+
+            //printf ("[%d]  %d  %d  %d  err=%lf \n", nbCores, totalTime, t1-t0, totalTime - nbCores*(t1-t0), err);
+
+            /** We check that the relative error is not too big. Note that 5% here allows to run the test even if
+             * the CPU is already widely used by other processes; since the threads main loop only just sleeps for
+             * a while (and is not time consuming), this 5% margin should be enough not to have false negative test
+             * report. */
+            CPPUNIT_ASSERT (err < 5.0);
+        }
+    }
+
+    /********************************************************************************/
+
+    struct Data
+    {
+        Data (size_t nb, ISynchronizer* s=0) : nbIter(nb), value(0), synchro(s)  {}
+
+        size_t         nbIter;
+        size_t         value;
+        ISynchronizer* synchro;
+    };
+
+    static void* thread_checkSynchro_mainloop (void* arg)
+    {
+        Data& data = *(Data*) arg;
+
+        for (size_t i=0; i<data.nbIter; i++)
+        {
+            if (data.synchro)  {  data.synchro->lock(); }
+
+            /** We compute the new value. */
+            data.value ++;
+
+            /** We simulate the fact that each thread takes different time for the computation. */
+            usleep (rand() % 10 + 1);
+
+            if (data.synchro)  {  data.synchro->unlock(); }
+        }
+
+        return 0;
+    }
+
+    /********************************************************************************/
+    /** \brief Check threads and synchronizers behavior
+     *
+     *  This test creates N threads and each thread increase C times a counter.
+     *  At the end, the counter value should be N.C
+     *
+     *  In order to make the test work, we need to use lock/unlock in each thread, otherwise
+     *  the final counter value would be wrong.
+     *
+     *  Test of \ref gatb::core::system::ISystemInfo::getNbCores()            \n
+     *  Test of \ref gatb::core::system::IThreadFactory::newThread()          \n
+     *  Test of \ref gatb::core::system::IThreadFactory::newSynchronizer()    \n
+     *  Test of \ref gatb::core::system::IThread::join()                      \n
+     */
+    void thread_checkSynchro ()
+    {
+        /** We create a synchronizer to be shared by the different threads. */
+        ISynchronizer* synchro = System::thread().newSynchronizer();
+
+        /** We initialize our global resource. */
+        Data data (1000, synchro);
+
+        /** We retrieve the number of cores. */
+        size_t nbCores = System::info().getNbCores();
+        CPPUNIT_ASSERT (nbCores > 0);
+
+        /** We create some threads. */
+        IThread* threads [nbCores];
+        for (size_t i=0; i<nbCores; i++)   {  threads[i] = System::thread().newThread (thread_checkSynchro_mainloop, &data);  }
+
+        /** We wait the end of each thread. */
+        for (size_t i=0; i<nbCores; i++)   {  threads[i]->join();    delete threads[i];  }
+
+        CPPUNIT_ASSERT (data.value == nbCores * data.nbIter);
+
+        /** Some cleanup. */
+        delete synchro;
+    }
+
+    /********************************************************************************/
+    static void* thread_exception_mainloop (void* arg)
+    {
+        IThreadGroup* threadGroup = (IThreadGroup*) arg;
+
+        /** We have to catch the thread local exception and forward it to the thread group. */
+        try
+        {
+            /** We launch an exception. */
+            throw core::system::Exception ("something wrong");
+        }
+        catch (core::system::Exception& e)
+        {
+            threadGroup->addException (e);
+        }
+
+        return 0;
+    }
+
+    void thread_exception ()
+    {
+        /** We create a thread group. */
+        IThreadGroup* threadGroup = ThreadGroup::create ();
+
+        /** We retrieve the number of cores. */
+        size_t nbCores = System::info().getNbCores();
+        CPPUNIT_ASSERT (nbCores > 0);
+
+        /** We add some threads to the group. */
+        for (size_t i=0; i<nbCores; i++)   {  threadGroup->add (thread_exception_mainloop, threadGroup);  }
+
+        /** We start the group. */
+        threadGroup->start ();
+
+        /** Now, the treads are all finished and joined, we check for got exceptions. */
+        CPPUNIT_ASSERT (threadGroup->hasExceptions());
+
+        try
+        {
+            throw threadGroup->getException();
+            CPPUNIT_ASSERT (false);
+        }
+        catch (core::system::Exception& e)
+        {
+            CPPUNIT_ASSERT (true);
+        }
+
+        /** We have to destroy the thread group this way. */
+        ThreadGroup::destroy(threadGroup);
+    }
+
+    /********************************************************************************/
+    /** \brief check information from the file system.
+     *
+     *  Test of \ref gatb::core::system::IFileSystem::getMaxFilesNumber()     \n
+     *  Test of \ref gatb::core::system::IFileSystem::getCurrentDirectory()   \n
+     *  Test of \ref gatb::core::system::IFileSystem::getTemporaryDirectory() \n
+     *  Test of \ref gatb::core::system::IFileSystem::doesExist()             \n
+     *  Test of \ref gatb::core::system::IFileSystem::getAvailableSpace()     \n
+     */
+    void filesystem_info ()
+    {
+        CPPUNIT_ASSERT (System::file().getMaxFilesNumber() > 0);
+
+        CPPUNIT_ASSERT (System::file().getCurrentDirectory().empty() == false);
+        CPPUNIT_ASSERT (System::file().doesExist (System::file().getCurrentDirectory()));
+
+        CPPUNIT_ASSERT (System::file().getTemporaryDirectory().empty() == false);
+        CPPUNIT_ASSERT (System::file().doesExist (System::file().getTemporaryDirectory()));
+
+        CPPUNIT_ASSERT (System::file().getAvailableSpace (System::file().getCurrentDirectory()) > 0);
+    }
+
+    /********************************************************************************/
+    /** \brief creation and deletion of directory
+     *
+     * We create a directory in the temporary directory; its name is the current date.
+     *
+     * Test of \ref gatb::core::system::IFileSystem::getTemporaryDirectory()  \n
+     * Test of \ref gatb::core::system::IFileSystem::mkdir()                  \n
+     * Test of \ref gatb::core::system::IFileSystem::doesExist()              \n
+     * Test of \ref gatb::core::system::IFileSystem::rmdir()                  \n
+     * Test of \ref gatb::core::system::ITime::getDateString()                \n
+     *
+     */
+    void filesystem_create_delete ()
+    {
+        /** We retrieve the temporary directory. */
+        string tmpdir = System::file().getTemporaryDirectory();
+        CPPUNIT_ASSERT (tmpdir.empty() == false);
+
+        /** We build a test directory path. */
+        stringstream ss;   ss << tmpdir << "/" << System::time().getDateString();
+        IFileSystem::Path dirpath = ss.str();
+
+        /** We create a directory. */
+        int res1 = System::file().mkdir (dirpath, 01777);
+        CPPUNIT_ASSERT (res1 == 0);
+
+        /** We check that the directory exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (dirpath) == true);
+
+        /** We delete the directory. */
+        int res2 = System::file().rmdir (dirpath);
+        CPPUNIT_ASSERT (res2 == 0);
+
+        /** We check that the directory exists. */
+        CPPUNIT_ASSERT (System::file().doesExist (dirpath) == false);
+    }
+
+    /********************************************************************************/
+    static void iterateAction (const IFileSystem::Path& entry, void* data)
+    {
+        size_t& nb = *(size_t*)data;
+        nb++;
+    }
+
+    /** \brief iterate some directory content
+     *
+     * Test of \ref gatb::core::system::IFileSystem::getCurrentDirectory()    \n
+     * Test of \ref gatb::core::system::IFileSystem::iterate()                \n
+     */
+    void filesystem_iterate ()
+    {
+        size_t nbEntries = 0;
+
+        /** We retrieve the current directory. */
+        string currentdir = System::file().getCurrentDirectory ();
+        CPPUNIT_ASSERT (currentdir.empty() == false);
+
+        /** We iterate the directory. */
+        System::file().iterate (currentdir, iterateAction, &nbEntries);
+
+        CPPUNIT_ASSERT (nbEntries > 0);
+    }
+
+    /********************************************************************************/
+    /** \brief Creation of a file with some content
+     *
+     * Test of \ref gatb::core::system::IFileSystem::getCurrentDirectory() \n
+     * Test of \ref gatb::core::system::IFileSystem::newFile()             \n
+     * Test of \ref gatb::core::system::IFile::isOpen()   \n
+     * Test of \ref gatb::core::system::IFile::print()    \n
+     * Test of \ref gatb::core::system::IFile::seeko()    \n
+     * Test of \ref gatb::core::system::IFile::tell()     \n
+     * Test of \ref gatb::core::system::IFile::get()      \n
+     * Test of \ref gatb::core::system::IFile::isEOF()    \n
+     */
+    void file_create ()
+    {
+        const char* info = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+        /** We retrieve the temporary directory. */
+        string tmpdir = System::file().getTemporaryDirectory();
+        CPPUNIT_ASSERT (tmpdir.empty() == false);
+
+        /** We create the file handle. We need it first for write. */
+        IFile* writer = System::file().newFile (tmpdir, "dummy", "w");
+
+        /** We check the file handle exists. Note that we will ALWAYS get an instance,
+         * even if the path is incorrect for instance. */
+        CPPUNIT_ASSERT (writer != 0);
+
+        if (writer->isOpen())
+        {
+            /** We add some information into the file. */
+            writer->print (info);
+
+            /** We check the size of the file. */
+            CPPUNIT_ASSERT (writer->getSize() == strlen (info));
+        }
+
+        /** We create the file handle. We need it for read. */
+        IFile* reader = System::file().newFile (writer->getPath(), "r");
+
+        /** We check the file handle exists. Note that we will ALWAYS get an instance,
+         * even if the path is incorrect for instance. */
+        CPPUNIT_ASSERT (reader != 0);
+
+        if (reader->isOpen())
+        {
+            /** We are supposed to be at the beginning of the file. */
+            CPPUNIT_ASSERT (reader->tell() == 0);
+
+            /** We get one character and check it is ok. */
+            const char* loop = info;
+            for (char c=reader->get();  ! reader->isEOF();  c=reader->get(), loop++)
+            {
+                CPPUNIT_ASSERT (c == *loop);
+            }
+
+            CPPUNIT_ASSERT (reader->tell() == strlen (info));
+        }
+
+        /** We check that the file exists */
+        CPPUNIT_ASSERT (System::file().doesExist (writer->getPath()));
+
+        /** We remove the file. */
+        System::file().remove (writer->getPath());
+
+        /** We check that the file doesn't exist any more */
+        CPPUNIT_ASSERT (System::file().doesExist (writer->getPath()) == false);
+
+        /** Some cleanup. */
+        delete writer;
+        delete reader;
+    }
+
+    /********************************************************************************/
+    void file_attributes ()
+    {
+        /** We create a temporary file. */
+        string filename = System::file().getTemporaryDirectory() + "/foo.txt";
+
+        IFile* file = System::file().newFile (filename, "w");
+        CPPUNIT_ASSERT (file != 0);
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == true);
+
+        const char* key = "myKey";
+        int res = 0;
+
+        /** We set some tags to the file. */
+        res = System::file().setAttribute (filename, key, "%d", 147);
+        CPPUNIT_ASSERT (res >= 0);
+
+        /** We get the attribute. */
+        string value;
+        res = System::file().getAttribute (filename, key, value);
+
+        CPPUNIT_ASSERT (res == 3);
+
+        /** We delete the temporary file. */
+        System::file().remove (filename);
+
+        CPPUNIT_ASSERT (System::file().doesExist (filename) == false);
+
+        /** Cleanup */
+        delete file;
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestSystem);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestSystem);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
+
diff --git a/gatb-core/test/unit/src/tools/collections/TestBag.cpp b/gatb-core/test/unit/src/tools/collections/TestBag.cpp
new file mode 100644
index 0000000..8dfe0bd
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/collections/TestBag.cpp
@@ -0,0 +1,204 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/tools/collections/impl/BagFile.hpp>
+#include <gatb/tools/collections/impl/BagCache.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/misc/api/Range.hpp>
+
+#include <gatb/tools/designpattern/api/ICommand.hpp>
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/system/api/ISmartPointer.hpp>
+#include <gatb/system/impl/System.hpp>
+
+#include <vector>
+
+using namespace std;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestBag : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestBag);
+
+        CPPUNIT_TEST_GATB (bag_checkFile);
+        CPPUNIT_TEST_GATB (bag_checkCache);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    void bag_checkFile ()
+    {
+        u_int32_t values[] = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+        size_t nbItems = ARRAY_SIZE(values);
+
+        /** We build the uri of the test file. */
+        string filename = System::file().getTemporaryDirectory() + string("/bagfile");
+
+        /** We instantiate a bag. */
+        BagFile<u_int32_t> bag (filename);
+
+        /** We write some values into the bag. */
+        for (u_int32_t i=0; i<nbItems; i++)  {  bag.insert (values[i]);  }
+
+        /** We flush the bag to be sure that all items are put into the file. */
+        bag.flush();
+
+        /** We check the size of the file. */
+        CPPUNIT_ASSERT (System::file().getSize(filename) == nbItems * sizeof (u_int32_t));
+
+        /** We read the file. */
+        size_t nbItemsRead = 0;
+        IteratorFile<u_int32_t> it (filename);
+        for (it.first(); !it.isDone(); it.next(), nbItemsRead++)
+        {
+            /** We check the current read item. */
+            CPPUNIT_ASSERT (*it == values[nbItemsRead]);
+        }
+
+        /** We check we read the correct number of items. */
+        CPPUNIT_ASSERT (nbItemsRead == nbItems);
+
+        /** We remove the temporary file. */
+        System::file().remove (filename);
+    }
+
+    /********************************************************************************/
+
+    template <typename Item> class BagInsertCommand : public ICommand, public SmartPointer
+    {
+    public:
+        BagInsertCommand (Bag<Item>* ref, size_t cacheSize, ISynchronizer* synchro, size_t nbIters)
+            : _ref(ref), _cache(_ref, cacheSize, synchro), _nbIters(nbIters) {}
+
+        void execute ()
+        {
+            for (u_int32_t i=1; i<=_nbIters; i++)  {  _cache.insert (i);  }
+
+            _cache.flush();
+        }
+
+    private:
+        Bag<Item>*     _ref;
+        BagCache<Item> _cache;
+        size_t         _nbIters;
+    };
+
+    /** */
+    void bag_checkCache_aux (size_t nbItersTotal, size_t nbCores, size_t cacheSize)
+    {
+        /** We build the uri of the test file. */
+        string filename = System::file().getTemporaryDirectory() + string("/bagfile");
+
+        /** We set the number of iterations to be done in each thread. */
+        u_int64_t nbItersPerThread = nbItersTotal / nbCores;
+
+        /** We instantiate a bag. */
+        BagFile<u_int32_t>* bag = new BagFile<u_int32_t>(filename);
+        LOCAL (bag);
+
+        /** We need a command dispatcher. */
+        Dispatcher dispatcher (nbCores);
+
+        /** We create several commands that will insert items into the bag file through a cache. */
+        vector<ICommand*> commands (dispatcher.getExecutionUnitsNumber());
+        for (size_t i=0; i<commands.size(); i++)  { commands[i] = new BagInsertCommand<u_int32_t> (bag, cacheSize, System::thread().newSynchronizer(), nbItersPerThread); }
+
+        /** We dispatch the commands. */
+        dispatcher.dispatchCommands (commands, 0);
+
+        /** We read the file. */
+        u_int64_t checksum = 0;
+        size_t nbItemsRead = 0;
+        IteratorFile<u_int32_t> it (filename);
+        for (it.first(); !it.isDone(); it.next(), nbItemsRead++)  {  checksum += *it;  }
+
+        /** We check the sum of items. */
+        CPPUNIT_ASSERT (nbCores*(nbItersPerThread*(nbItersPerThread+1))/2 == checksum);
+
+        //cout << "nbCores=" << nbCores << "  nbItersTotal=" << nbItersTotal << "  cacheSize=" << cacheSize << endl;
+
+        /** We check we read the correct number of items. */
+        CPPUNIT_ASSERT (nbItemsRead == nbItersTotal);
+
+        /** We remove the temporary file. */
+        System::file().remove (filename);
+    }
+
+    /** */
+    void bag_checkCache ()
+    {
+        /** WARNING: nbItersTotal has to be a multiple of nbCores. */
+
+        /** We set the total number of iterations to be done. */
+        size_t nbItersTotalTable[] = { 5*1000, 500*1000, 5*1000*1000};
+
+        size_t nbCoresTable[] = { 1, 2, 4, 8};
+
+        /** We set the size of the cache. */
+        size_t cacheSizeTable[] = { 10, 1000, 100*1000};
+
+        for (size_t h=0; h<ARRAY_SIZE(nbItersTotalTable); h++)
+        {
+            for (size_t i=0; i<ARRAY_SIZE(nbCoresTable); i++)
+            {
+                for (size_t j=0; j<ARRAY_SIZE(cacheSizeTable); j++)
+                {
+                    bag_checkCache_aux (nbItersTotalTable[h], nbCoresTable[i], cacheSizeTable[j]);
+                }
+            }
+        }
+    }
+};
+
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestBag);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestBag);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/collections/TestCollection.cpp b/gatb-core/test/unit/src/tools/collections/TestCollection.cpp
new file mode 100644
index 0000000..da0c3dc
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/collections/TestCollection.cpp
@@ -0,0 +1,139 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/collections/impl/CollectionCache.hpp>
+
+#include <gatb/tools/misc/api/Range.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#define USE_LARGEINT_CONSTRUCTOR 1 // got lazy to change the unit test to avoid construction.
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+using namespace std;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestCollection : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestCollection);
+
+        CPPUNIT_TEST_GATB (collection_check1);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template<typename T> void collection_check1_aux (T* table, size_t nb)
+    {
+        // new since STORAGE_FILE modification in october 2016: remove the file, because BagFile doesn't anymore
+         System::file().remove ("foo");
+
+        /** We create a collection. */
+        Collection<T>* c = new CollectionFile<T> ("foo");
+        LOCAL(c);
+
+        /** We insert some items. */
+        for (size_t i=0; i<nb; i++)  { c->insert (table[i]); }
+
+        /** We have to flush to be sure all items are in the collection. */
+        c->flush();
+
+        if (c->getNbItems() != (int)nb)
+        {
+            std::cout << "in anticipation of unit test failing, c->getNbItems() = " << c->getNbItems() << " , nb = " << nb << std::endl;
+        }
+
+        /** We check we have the correct number of items. */
+        CPPUNIT_ASSERT (c->getNbItems() == (int)nb);
+
+        /** We iterate the collection. */
+        Iterator<T>* it = c->iterator();
+        LOCAL(it);
+
+        /** We check we get the correct items. */
+        size_t i=0;
+        for (it->first(); !it->isDone(); it->next())  {  CPPUNIT_ASSERT (it->item() == table[i++]);  }
+
+        /** We delete physically the collection. */
+        //c->remove ();
+    }
+
+    /********************************************************************************/
+    void collection_check1 ()
+    {
+        int table1[] = { 1,2,3,5,8,13,21,34};
+        collection_check1_aux<int> (table1, ARRAY_SIZE(table1));
+
+        string table2[] = { "a", "bc", "def", "ghij"};
+        collection_check1_aux<string> (table2, ARRAY_SIZE(table2));
+
+        // Test table3[] = { Test(1, 1025, 3.14), Test(3, 298, 2.713), Test(19, 9874, 0.577)};
+        // collection_check1_aux<Test> (table3, ARRAY_SIZE(table3));
+
+        NativeInt64 table4[] = { 12354684684, 6876436549, 87654351, 6843516877, 68435434874};
+        collection_check1_aux<NativeInt64> (table4, ARRAY_SIZE(table4));
+
+        LargeInt<3> table5[] = { LargeInt<3>(413434), LargeInt<3>(987654123), LargeInt<3>(123), LargeInt<3>(1) };
+        collection_check1_aux<LargeInt<3> > (table5, ARRAY_SIZE(table5));
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestCollection);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestCollection);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/collections/TestContainer.cpp b/gatb-core/test/unit/src/tools/collections/TestContainer.cpp
new file mode 100644
index 0000000..e6311a1
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/collections/TestContainer.cpp
@@ -0,0 +1,144 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#define USE_LARGEINT_CONSTRUCTOR 1 // one of the only cases where LargeInt should be using its constructor; but got lazy to want to change the unit tests here.
+#include <gatb/tools/collections/impl/Bloom.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+
+#include <set>
+
+using namespace std;
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+using namespace gatb::core::tools::math;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestContainer : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestContainer);
+
+        CPPUNIT_TEST_GATB (bloom_checkContains);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template<typename Item> void bloom_checkContains_aux (u_int64_t* values, size_t size)
+    {
+        u_int64_t maxvalue = values [size-1];
+
+        Bloom<Item> bloom (1000*1000);
+
+        for (size_t i=0; i<size; i++)
+        {
+            Item item (values[i]);
+            bloom.insert (item);
+        }
+
+        size_t nbNotFound = 0;
+
+        for (size_t i=0; i<maxvalue; i++)
+        {
+            /** We look into the table whether the current value really exist. */
+            bool found = false;
+            for (size_t j=0; j<size && !found; j++)  {  found = (i==values[j]); }
+
+            if (!found)
+            {
+                nbNotFound++;
+
+                /** We check true negatives. */
+                Item idx;
+                idx.setVal(i);
+                CPPUNIT_ASSERT (bloom.contains(idx) == false);
+            }
+        }
+
+        /** We check we found the correct number of true negatives. */
+        CPPUNIT_ASSERT (nbNotFound == (maxvalue - size + 1));
+    }
+
+    /** */
+    void bloom_checkContains ()
+    {
+        u_int64_t values1[] = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+        u_int64_t values2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40 };
+        u_int64_t values3[] = { 1, 10, 100, 1000, 10000, 100000};
+
+        bloom_checkContains_aux<NativeInt64> (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<NativeInt64> (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<NativeInt64> (values3, ARRAY_SIZE(values3));
+
+#if INT128_FOUND == 1
+        bloom_checkContains_aux<NativeInt128> (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<NativeInt128> (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<NativeInt128> (values3, ARRAY_SIZE(values3));
+#endif
+
+        bloom_checkContains_aux<LargeInt<1> > (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<LargeInt<1> > (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<LargeInt<1> > (values3, ARRAY_SIZE(values3));
+
+        bloom_checkContains_aux<LargeInt<2> > (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<LargeInt<2> > (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<LargeInt<2> > (values3, ARRAY_SIZE(values3));
+
+        bloom_checkContains_aux<LargeInt<3> > (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<LargeInt<3> > (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<LargeInt<3> > (values3, ARRAY_SIZE(values3));
+
+        bloom_checkContains_aux<LargeInt<4> > (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<LargeInt<4> > (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<LargeInt<4> > (values3, ARRAY_SIZE(values3));
+
+        bloom_checkContains_aux<LargeInt<5> > (values1, ARRAY_SIZE(values1));
+        bloom_checkContains_aux<LargeInt<5> > (values2, ARRAY_SIZE(values2));
+        bloom_checkContains_aux<LargeInt<5> > (values3, ARRAY_SIZE(values3));
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestContainer);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestContainer);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/collections/TestIterable.cpp b/gatb-core/test/unit/src/tools/collections/TestIterable.cpp
new file mode 100644
index 0000000..08fdca7
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/collections/TestIterable.cpp
@@ -0,0 +1,59 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <list>
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+#include <memory>
+
+using namespace std;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestIterable : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestIterable);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestIterable);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestIterable);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/collections/TestMap.cpp b/gatb-core/test/unit/src/tools/collections/TestMap.cpp
new file mode 100644
index 0000000..9530f42
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/collections/TestMap.cpp
@@ -0,0 +1,237 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/designpattern/api/Iterator.hpp>
+#include <gatb/tools/collections/impl/OAHash.hpp>
+#include <gatb/tools/collections/impl/MapMPHF.hpp>
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/NativeInt128.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/misc/api/Abundance.hpp>
+#include <gatb/system/api/Exception.hpp>
+#include <gatb/tools/storage/impl/Storage.hpp>
+
+#include <list>
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+using namespace gatb::core::tools::math;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestMap : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestMap);
+
+        CPPUNIT_TEST_GATB (checkOAHash);
+        CPPUNIT_TEST_GATB (checkMapMPHF);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template<typename T>
+    void checkOAHash_aux (size_t maxMemory)
+    {
+        /** We create a hash with a maximum memory size. */
+        OAHash <T> hash (maxMemory);
+
+        T badKey;
+        badKey.setVal(hash.getMaxNbItems() + 100);
+
+        /** We insert the maximum number of items. */
+        for (int i=1; i<=hash.getMaxNbItems(); i++)  {  
+            T idx; idx.setVal(i);
+            CPPUNIT_ASSERT_NO_THROW (hash.increment (idx));  
+        }
+
+        /** We add a new key => we should get an exception. */
+        CPPUNIT_ASSERT_THROW (hash.increment (badKey), core::system::Exception);
+
+        /** We check that we have all the required keys. */
+        for (int i=1; i<=hash.getMaxNbItems(); i++)  {  
+            T idx; idx.setVal(i);
+            CPPUNIT_ASSERT (hash.get (idx) == true);  
+        }
+
+        /** We check that we don't have an non registered key. */
+        CPPUNIT_ASSERT (hash.get (badKey) == false);
+
+        /** We iterate the map. */
+        Iterator <Abundance<T> >* it = hash.iterator();
+        LOCAL (it);
+
+        size_t nbItems = 0;
+        for (it->first(); !it->isDone(); it->next(), nbItems++)
+        {
+            /** All abundances should be one. */
+            CPPUNIT_ASSERT (it->item().abundance == 1);
+        }
+
+        CPPUNIT_ASSERT ((int)nbItems == hash.getMaxNbItems());
+    }
+
+    /********************************************************************************/
+    void checkOAHash ()
+    {
+        size_t table[] = { 1024, 10*1024, 100*1024, 1000*1024};
+
+        for (size_t i=0; i<ARRAY_SIZE(table); i++)
+        {
+            checkOAHash_aux<NativeInt64>  (table[i]);
+    #if INT128_FOUND == 1
+            checkOAHash_aux<NativeInt128> (table[i]);
+    #endif
+            checkOAHash_aux<LargeInt<3> >  (table[i]);
+            checkOAHash_aux<LargeInt<4> >  (table[i]);
+            checkOAHash_aux<LargeInt<5> >  (table[i]);
+        }
+    }
+
+    /********************************************************************************/
+    static void checkMapMPHF_progress (size_t round, size_t initial, size_t remaining)
+    {
+    }
+
+    /** */
+    void checkMapMPHF ()
+    {
+        float val = 0;
+
+        u_int8_t keysValue[] = {14, 35, 1, 9, 65, 37, 12, 24, 98, 124, 32};
+
+        /** We create a file with some keys (coded as NativeInt8 values). */
+        const char* filename = "keys";
+        System::file().remove (filename); // new since october 2016 BagFile change
+        BagFile<NativeInt8> keysFile (filename);
+        for (size_t i=0; i<ARRAY_SIZE(keysValue); i++)  {  keysFile.insert (keysValue[i]); }
+        keysFile.flush();
+
+        /** We create some Iterable for our keys. */
+        IterableFile<NativeInt8> keys(filename);
+
+        CPPUNIT_ASSERT (keys.getNbItems() == ARRAY_SIZE(keysValue));
+
+        /** We create a map for our keys; the values are floats. */
+        MapMPHF <NativeInt8, float> map1;
+
+        /** We build the hash function for the given keys. */
+        map1.build (keys);
+
+        CPPUNIT_ASSERT (map1.size() == (size_t)keys.getNbItems());
+
+        /** We populate the values. */
+        Iterator<NativeInt8>* itKeys = keys.iterator();   LOCAL (itKeys);
+        for (itKeys->first(); !itKeys->isDone(); itKeys->next(), val++)
+        {
+            /** We change the value for the current key. */
+            map1.at(itKeys->item()) = val;
+        }
+
+        /** We check the values. */
+        val = 0;
+        for (itKeys->first(); !itKeys->isDone(); itKeys->next(), val++)
+        {
+            /** We check the value for the current key. */
+            CPPUNIT_ASSERT (map1.at(itKeys->item()) == val);
+        }
+
+        /** We create a storage object. */
+        Storage* storage = StorageFactory(STORAGE_HDF5).create ("map", true, false);
+        LOCAL (storage);
+
+        /** We save the map. */
+        map1.save (storage->root(), "mphf");
+
+        /** We create another map. */
+        MapMPHF <NativeInt8, float> map2;
+
+        /** We load the hash function. */
+        map2.load (storage->root(), "mphf");
+
+        CPPUNIT_ASSERT (map2.size() == (size_t)keys.getNbItems());
+
+        /** We populate the values. */
+        val = 0;
+        for (itKeys->first(); !itKeys->isDone(); itKeys->next(), val++)
+        {
+            /** We change the value for the current key. */
+            map2.at(itKeys->item()) = val;
+        }
+
+        /** We check the values. */
+        val = 0;
+        for (itKeys->first(); !itKeys->isDone(); itKeys->next(), val++)
+        {
+            /** We check the value for the current key. */
+            CPPUNIT_ASSERT (map2.at(itKeys->item()) == val);
+        }
+
+        /** We compare the values of the two maps. */
+        for (itKeys->first(); !itKeys->isDone(); itKeys->next(), val++)
+        {
+            /** We check the value for the current key. */
+            CPPUNIT_ASSERT (map1.at(itKeys->item()) == map2.at(itKeys->item()));
+        }
+
+        /** We compare the values of the two maps (index iteration) */
+        CPPUNIT_ASSERT (map1.size() == map2.size());
+        for (size_t i=0; i<map1.size(); i++)
+        {
+            /** We check the value for the current key. */
+            CPPUNIT_ASSERT (map1.at(i) == map2.at(i));
+        }
+    }
+};
+
+/********************************************************************************/
+
+//Temporary desactivate TestMap (for continuous integration purpose)
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestMap);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestMap);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/designpattern/TestIterators.cpp b/gatb-core/test/unit/src/tools/designpattern/TestIterators.cpp
new file mode 100644
index 0000000..ce80638
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/designpattern/TestIterators.cpp
@@ -0,0 +1,372 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <gatb/tools/math/Integer.hpp>
+
+#include <vector>
+#include <string>
+
+#include <typeinfo>
+
+#include <boost/variant.hpp>
+using namespace std;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+using namespace gatb::core::tools::math;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for miscellaneous operations
+ */
+class TestIterators : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestIterators);
+
+        CPPUNIT_TEST_GATB (iterators_checkNullIterator);
+        CPPUNIT_TEST_GATB (iterators_checkList);
+        CPPUNIT_TEST_GATB (iterators_checkCartesianIterator);
+        CPPUNIT_TEST_GATB (iterators_checkCompoundIterator);
+        CPPUNIT_TEST_GATB (iterators_checkTruncateIterator);
+        CPPUNIT_TEST_GATB (iterators_checkCancellableIterator);
+        CPPUNIT_TEST_GATB (iterators_checkPairedIterator);
+        CPPUNIT_TEST_GATB (iterators_checkVariant1);
+        CPPUNIT_TEST_GATB (iterators_checkVariant2);
+        CPPUNIT_TEST_GATB (iterators_adaptator);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    /** \brief check the NULL iterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::NullIterator \n
+     */
+    void iterators_checkNullIterator ()
+    {
+        size_t nbItems = 0;
+
+        /** We declare a null iterator. */
+        NullIterator<int> it;
+        for (it.first(); !it.isDone(); it.next())
+        {
+            CPPUNIT_ASSERT (false);
+        }
+        CPPUNIT_ASSERT (nbItems == 0);
+    }
+
+    /********************************************************************************/
+    /** \brief check the std::list iterator wrapper.
+     *
+     * Test of \ref gatb::core::tools::dp::impl::ListIterator \n
+     */
+    void iterators_checkList ()
+    {
+        size_t nbItems = 0;
+
+        /** We declare a STL list with some values. */
+        int values[] = {1,2,3,5,8,13,21,34};
+        list<int> l (values, values + sizeof(values)/sizeof(values[0]) );
+
+        /** We iterate the list through a ListIterator instance. */
+        ListIterator<int> it (l);
+        for (it.first(); !it.isDone(); it.next())
+        {
+            CPPUNIT_ASSERT (*it == values[nbItems++]);
+        }
+        CPPUNIT_ASSERT (nbItems == sizeof(values)/sizeof(values[0]));
+    }
+
+    /********************************************************************************/
+    /** \brief check the CartesianIterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::CartesianIterator\n
+     */
+    void iterators_checkCartesianIterator ()
+    {
+        size_t nbItems = 0;
+
+        /** We declare a STL list with some values. */
+        int values1[] = {1,2,3,5,8,13,21,34};
+        list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+        /** We declare a STL list with some values. */
+        float values2[] = {0.5, 3.1415, 2.71};
+        list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]) );
+
+        /** We build the pairs list that should be iterated by the Cartesian iterator. */
+        vector <pair<int,float> > pairsCheck;
+        for (size_t i=0; i<sizeof(values1)/sizeof(values1[0]); i++)
+        {
+            for (size_t j=0; j<sizeof(values2)/sizeof(values2[0]); j++)
+            {
+                pairsCheck.push_back (pair<int,float>(values1[i],values2[j]));
+            }
+        }
+
+        /** We declare two iterators on the two lists. */
+        ListIterator<int>   it1 (l1);
+        ListIterator<float> it2 (l2);
+
+        /** We declare a Cartesian iterator on the two iterators. */
+        ProductIterator<int,float> it (it1, it2);
+        for (it.first(); !it.isDone(); it.next())
+        {
+            CPPUNIT_ASSERT (it->first  == pairsCheck[nbItems].first);
+            CPPUNIT_ASSERT (it->second == pairsCheck[nbItems].second);
+            nbItems++;
+        }
+        CPPUNIT_ASSERT (nbItems == sizeof(values1)/sizeof(values1[0]) * sizeof(values2)/sizeof(values2[0]));
+    }
+
+    /********************************************************************************/
+    /** We define an iterator that loops every ith character of a given string */
+    class MyIterator : public Iterator<char>
+    {
+    public:
+        MyIterator (const string& s) : _str(s), _mod(1), _idx(0) {}
+        void update (int modulo)  { _mod = modulo; }
+        void first  () { _idx  = _mod; }
+        void next   () { _idx += _mod; }
+        bool isDone () { return _idx >= (int)_str.size(); }
+        char& item  () { return _str[_idx]; }
+    private:
+        string _str;
+        int    _mod;
+        int    _idx;
+    };
+
+    /** We need a functor for updating the inner loop iterator. */
+    struct Update { void operator() (Iterator<char>* it2, int* val)  {  static_cast<MyIterator*> (it2)->update (*val);  }};
+
+    /** \brief check the CompoundIterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::CompoundIterator\n
+     */
+    void iterators_checkCompoundIterator ()
+    {
+        size_t nbItems = 0;
+        const char* str = "abcdefghijklmnopqrstuvwxyz";
+
+        /** We declare a STL list with some values. */
+        int values1[] = {2, 3, 5};
+        list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+        ListIterator<int> it1 (l1);
+
+        /** We build the check table holding the items we are supposed to iterate. */
+        char checkTable[] = {
+            'c','e','g','i','k','m','o','q','s','u','w','y',    // loop modulo 2
+            'd','g','j','m','p','s','v','y',                    // loop modulo 3
+            'f','k','p','u','z'                                 // loop modulo 5
+        };
+
+        /** We declare an iterator on our custom iterator. */
+        MyIterator it2 (str);
+
+        /** We declare a Cartesian iterator on the two iterators. */
+        CompoundIterator<int,char,Update> it (it1, it2, Update());
+        for (it.first(); !it.isDone(); it.next(), nbItems++)
+        {
+            if (nbItems < sizeof(checkTable)/sizeof(checkTable[0]))
+            {
+                CPPUNIT_ASSERT (*it == checkTable[nbItems]);
+            }
+        }
+
+        /** We  check that we got the correct number of iterated items. */
+        CPPUNIT_ASSERT (nbItems == sizeof(checkTable)/sizeof(checkTable[0]));
+    }
+
+    /********************************************************************************/
+    /** \brief check the truncation of the given iterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::TruncateIterator \n
+     */
+    void iterators_checkTruncateIterator ()
+    {
+        int nbItems = 0;
+
+        /** We declare a STL list with some values. */
+        int values[] = {1,2,3,5,8,13,21,34};
+        int valuesLen = sizeof(values)/sizeof(values[0]);
+        list<int> l (values, values + valuesLen);
+
+        /** We declare an iterator on this list and loop the items. */
+        ListIterator<int> itRef (l);
+        nbItems = 0;
+        for (itRef.first(); !itRef.isDone(); itRef.next())  {  CPPUNIT_ASSERT (*itRef == values[nbItems++]);  }
+        CPPUNIT_ASSERT (nbItems == valuesLen);
+
+        /** We declare a truncated iterator for the list iterator. */
+        TruncateIterator<int> itTrunc (itRef, valuesLen/2);
+        nbItems = 0;
+        for (itTrunc.first(); !itTrunc.isDone(); itTrunc.next())  {  CPPUNIT_ASSERT (*itTrunc == values[nbItems++]);  }
+        CPPUNIT_ASSERT (nbItems == valuesLen/2);
+
+        /** We declare a truncated iterator for the list iterator. Note that we make it longer than the referred one. */
+        TruncateIterator<int> itTrunc2 (itRef, 2*valuesLen);
+        nbItems = 0;
+        for (itTrunc2.first(); !itTrunc2.isDone(); itTrunc2.next())  {  CPPUNIT_ASSERT (*itTrunc2 == values[nbItems++]);  }
+        CPPUNIT_ASSERT (nbItems == valuesLen);
+    }
+
+    /********************************************************************************/
+    /** \brief check the cancellation of the given iterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::CancellableIterator \n
+     */
+    void iterators_checkCancellableIterator ()
+    {
+        int nbItems = 0;
+
+        /** We declare a STL list with some values. */
+        int values[] = {1,2,3,5,8,13,21,34};
+        int valuesLen = sizeof(values)/sizeof(values[0]);
+        list<int> l (values, values + valuesLen);
+
+        /** We declare an iterator on this list and loop the items. */
+        ListIterator<int> itRef (l);
+        nbItems = 0;
+        for (itRef.first(); !itRef.isDone(); itRef.next())  {  CPPUNIT_ASSERT (*itRef == values[nbItems++]);  }
+        CPPUNIT_ASSERT (nbItems == valuesLen);
+
+        /** We declare a truncated iterator for the list iterator. */
+        CancellableIterator<int> itCanc (itRef);
+        nbItems = 0;
+        for (itCanc.first(); !itCanc.isDone(); itCanc.next())  {  
+            CPPUNIT_ASSERT (*itCanc == values[nbItems++]);
+            if (nbItems == valuesLen/2) itCanc._cancel = true;
+        }
+        CPPUNIT_ASSERT (nbItems == valuesLen/2 );
+    }
+
+
+    /********************************************************************************/
+    /** \brief check the PairedIterator
+     *
+     * Test of \ref gatb::core::tools::dp::impl::PairedIterator\n
+     */
+    void iterators_checkPairedIterator ()
+    {
+        size_t nbItems = 0;
+        size_t i=0;
+
+        /** We declare a STL list with some values. */
+        int values1[] = {1,2,3,5,8,13,21,34};
+        list<int> l1 (values1, values1 + sizeof(values1)/sizeof(values1[0]) );
+
+        /** We declare a STL list with some values. */
+        float values2[] = {0.5, 3.1415, 2.71, 5.87451};
+        list<float> l2 (values2, values2 + sizeof(values2)/sizeof(values2[0]) );
+
+        /** We declare a paired iterator on the two iterators. */
+        PairedIterator<int,float> it (new ListIterator<int> (l1), new ListIterator<float> (l2));
+        for (it.first(); !it.isDone(); it.next(), i++)
+        {
+            CPPUNIT_ASSERT (it->first  == values1[i]);
+            CPPUNIT_ASSERT (it->second == values2[i]);
+
+            nbItems++;
+        }
+
+        CPPUNIT_ASSERT (nbItems > 0);
+        CPPUNIT_ASSERT (nbItems == min (sizeof(values1)/sizeof(values1[0]), sizeof(values2)/sizeof(values2[0])));
+    }
+
+    /********************************************************************************/
+    void iterators_checkVariant1 ()
+    {
+        vector<int>    v1;  v1.push_back(1);                            VectorIterator<int>    it1 (v1);
+        vector<float>  v2;  v2.push_back(3.14);   v2.push_back(0.577);  VectorIterator<float>  it2 (v2);
+        vector<string> v3;  v3.push_back("foo");  v3.push_back("bar");  VectorIterator<string> it3 (v3);
+
+        IteratorVariant<VectorIterator,int,float,string> it;
+
+        it = it3;
+
+        size_t i=0;
+        for (it.first(); !it.isDone(); it.next(), i++)
+        {
+        }
+    }
+
+    /********************************************************************************/
+    void iterators_checkVariant2 ()
+    {
+		// IteratorVariant<VectorIterator,INTEGER_TYPES> it;
+		//
+		// vector<LargeInt<1> > v1;  v1.push_back(1);  VectorIterator<LargeInt<1> >  it1 (v1);
+		// vector<LargeInt<2> > v2;  v2.push_back(2);  v2.push_back(3);  VectorIterator<LargeInt<2> > it2 (v2);
+
+        //it = it1;
+        //size_t i=0;
+        //for (it.first(); !it.isDone(); it.next(), i++)  {  }
+    }
+
+    /********************************************************************************/
+    struct Entry { int n; float x; };
+
+
+    struct Adaptator  {  float& operator() (Entry& e)  { return e.x; }  };
+
+    void iterators_adaptator ()
+    {
+        size_t i=0;
+
+        Entry table[] = { {3,0.4}, {17,2.7}, {-2,3.14} };
+        list<Entry> l (table, table + sizeof(table)/sizeof(table[0]) );
+
+        Iterator<Entry>* it = new ListIterator<Entry> (l);
+        LOCAL (it);
+
+        i=0;
+        for (it->first(); !it->isDone(); it->next(), i++)
+        {
+            CPPUNIT_ASSERT (it->item().n == table[i].n);
+            CPPUNIT_ASSERT (it->item().x == table[i].x);
+        }
+
+        IteratorAdaptor<Entry,float,Adaptator> itAdapt (it);
+
+        i=0;
+        for (itAdapt.first(); !itAdapt.isDone(); itAdapt.next(), i++)
+        {
+            CPPUNIT_ASSERT (itAdapt.item() == table[i].x);
+        }
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestIterators);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestIterators);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/math/TestMath.cpp b/gatb-core/test/unit/src/tools/math/TestMath.cpp
new file mode 100644
index 0000000..6944b7a
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/math/TestMath.cpp
@@ -0,0 +1,184 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#define USE_LARGEINT_CONSTRUCTOR 1 // one of the only cases where LargeInt should be using its constructor; but really I didn't want to change the unit tests here.
+
+#include <gatb/tools/math/LargeInt.hpp>
+#include <gatb/tools/math/Integer.hpp>
+
+using namespace std;
+using namespace gatb::core::tools::math;
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+class TestMath : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestMath);
+
+        CPPUNIT_TEST_GATB (math_checkBasic);
+        CPPUNIT_TEST_GATB (math_checkFibo);
+        CPPUNIT_TEST_GATB (math_test1);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    template <typename T, typename U> void math_checkBasicTemplate ()
+    {
+#define CST(a) T(U(a))
+
+        T a (CST(3));
+        T b (CST(5));
+
+        CPPUNIT_ASSERT (a == CST(3));
+        CPPUNIT_ASSERT (b == CST(5));
+
+        CPPUNIT_ASSERT (a != b);
+        CPPUNIT_ASSERT (a <  b);
+        CPPUNIT_ASSERT (a <= b);
+
+        CPPUNIT_ASSERT (a + CST(1) == CST(4));
+        CPPUNIT_ASSERT (b + CST(1) == CST(6));
+
+        CPPUNIT_ASSERT (a - CST(1) == CST(2));
+        CPPUNIT_ASSERT (b - CST(1) == CST(4));
+
+        CPPUNIT_ASSERT (a*2 == CST(6));
+        CPPUNIT_ASSERT (b*4 == CST(20));
+
+        CPPUNIT_ASSERT (a/2 == CST(1));
+        CPPUNIT_ASSERT (b/2 == CST(2));
+
+        CPPUNIT_ASSERT (a%2 == 1);
+        CPPUNIT_ASSERT (b%2 == 1);
+
+        CPPUNIT_ASSERT ( (a ^ b) == CST(6));
+        CPPUNIT_ASSERT ( (a & b) == CST(1));
+
+        CPPUNIT_ASSERT ( (a << 4) == CST(48));
+        CPPUNIT_ASSERT ( (a >> 1) == CST(1));
+        CPPUNIT_ASSERT ( (a >> 2) == CST(0));
+
+        a  = CST(4);
+        a += CST(5);
+        CPPUNIT_ASSERT (a == CST(9));
+
+        a = CST (0xCC);
+        b = ~a  & CST(0xFF);
+        CPPUNIT_ASSERT (b == CST(0x33));
+
+        CPPUNIT_ASSERT (revcomp (CST (0x112233445566), 11) ==  CST (0xcffee));
+#if 0
+        CPPUNIT_ASSERT (simplehash16 (CST(0x11223344), 12) == 2129748964359514508);
+        CPPUNIT_ASSERT (hash1(CST(0x11223344), 5)  ==  9479217074923583263UL);   // => BUG ???
+        CPPUNIT_ASSERT (oahash(CST(0x11223344))    == 102913755990806762);       // => BUG ???
+#endif
+    }
+
+    /********************************************************************************/
+    template <typename T, typename U> void math_checkFiboTemplate ()
+    {
+        static u_int64_t table[] =
+        {
+            1, 2, 3, 5, 8, 13, 21, 34, 55,
+            89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765,
+            10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040,
+            1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155,
+            165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976u, 7778742049u, 12586269025u
+        };
+
+        T u0(CST(0)), u1(CST(1));
+
+        for (size_t i=0; i<sizeof(table)/sizeof(table[0]); i++)
+        {
+            T u2(CST(0));
+            u2 = u1 + u0;
+            CPPUNIT_ASSERT (u2 == T(CST(table[i])));
+
+            u0 = u1;
+            u1 = u2;
+        }
+    }
+
+    /********************************************************************************/
+    void math_checkBasic ()
+    {
+        math_checkBasicTemplate < LargeInt<1>, LargeInt<1> >     ();
+        math_checkBasicTemplate < LargeInt<2>, LargeInt<2> >     ();
+        math_checkBasicTemplate < LargeInt<3>, LargeInt<3> >     ();
+        math_checkBasicTemplate < LargeInt<4>, LargeInt<4> >     ();
+        math_checkBasicTemplate < LargeInt<5>, LargeInt<5> >     ();
+        math_checkBasicTemplate < LargeInt<6>, LargeInt<6> >     ();
+#if 0
+        math_checkBasicTemplate <Integer, LargeInt<PREC_1> > ();
+        math_checkBasicTemplate <Integer, LargeInt<PREC_2> > ();
+        math_checkBasicTemplate <Integer, LargeInt<PREC_3> > ();
+        math_checkBasicTemplate <Integer, LargeInt<PREC_4> > ();
+#endif
+    }
+
+    /********************************************************************************/
+    void math_checkFibo ()
+    {
+        math_checkFiboTemplate < LargeInt<1>, LargeInt<1> >     ();
+        math_checkFiboTemplate < LargeInt<2>, LargeInt<2> >     ();
+        math_checkFiboTemplate < LargeInt<3>, LargeInt<3> >     ();
+        math_checkFiboTemplate < LargeInt<4>, LargeInt<4> >     ();
+#if 0
+        math_checkFiboTemplate <Integer, LargeInt<PREC_1> > ();
+        math_checkFiboTemplate <Integer, LargeInt<PREC_2> > ();
+        math_checkFiboTemplate <Integer, LargeInt<PREC_3> > ();
+        math_checkFiboTemplate <Integer, LargeInt<PREC_4> > ();
+#endif
+    }
+
+    /********************************************************************************/
+    template <typename T> void math_test1_template ()
+    {
+        T a (1);
+        a <<= 64;
+
+        CPPUNIT_ASSERT ( (a>>0) == a);
+    }
+
+    void math_test1 ()
+    {
+        math_test1_template <LargeInt<2> >();
+        math_test1_template <LargeInt<3> >();
+        math_test1_template <LargeInt<4> >();
+        math_test1_template <LargeInt<5> >();
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestMath);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestMath);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/misc/TestMisc.cpp b/gatb-core/test/unit/src/tools/misc/TestMisc.cpp
new file mode 100644
index 0000000..7149481
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/misc/TestMisc.cpp
@@ -0,0 +1,418 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/system/impl/TimeCommon.hpp>
+
+#include <gatb/tools/misc/api/Range.hpp>
+#include <gatb/tools/misc/api/Vector.hpp>
+#include <gatb/tools/misc/api/Macros.hpp>
+
+#include <gatb/tools/misc/impl/OptionsParser.hpp>
+#include <gatb/tools/misc/impl/Property.hpp>
+
+#include <gatb/tools/misc/impl/StringLine.hpp>
+
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+#include <memory>
+
+using namespace std;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for miscellaneous operations
+ */
+class TestMisc : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestMisc);
+
+        CPPUNIT_TEST_GATB (range_checkIterator1);
+        CPPUNIT_TEST_GATB (range_checkIterator2);
+        //  NEED A GOOD TIMER ACCURACY...  CPPUNIT_TEST_GATB (range_checkPerformance);
+        // DEACTIVATED BECAUSE OF MACOS (TO BE INVESTIGATED...)  CPPUNIT_TEST_GATB (vector_check1);
+        CPPUNIT_TEST_GATB (vector_check2);
+        CPPUNIT_TEST_GATB (vector_check3);
+        CPPUNIT_TEST_GATB (parser_check1);
+        CPPUNIT_TEST_GATB (parser_check2);
+
+        CPPUNIT_TEST_GATB (stringline_check1);
+
+    CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+    /********************************************************************************/
+    void setUp    ()  {  srand (time(NULL));  }
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    /** \brief test of Range class and its associated iterator.
+     *
+     * We create an iterator for an integer range and check that each iterated item is ok.
+     */
+    void range_checkIterator1 ()
+    {
+        /** We create a range. */
+        Range<size_t> range (1, 1000);
+
+        /** We create an iterator from the range. */
+        Range<size_t>::Iterator it (range);
+
+        size_t check = range.getBegin();
+
+        /** We iterate each item of the range. */
+        for (it.first(); !it.isDone(); it.next())
+        {
+            /** We check that the current iterated item is ok. */
+            CPPUNIT_ASSERT (it.item() == check++);
+        }
+    }
+
+    /********************************************************************************/
+    /** \brief test of Range associated iterator.
+     *
+     * We create an iterator for an integer range and check that each iterated item is ok.
+     */
+    void range_checkIterator2 ()
+    {
+        size_t from=1, to=100, check=from;
+
+        /** We create an iterator from the range. */
+        Range<size_t>::Iterator it (from, to);
+
+        /** We iterate each item of the range. */
+        for (it.first(); !it.isDone(); it.next())
+        {
+            /** We check that the current iterated item is ok. */
+            CPPUNIT_ASSERT (it.item() == check++);
+        }
+    }
+
+    /********************************************************************************/
+    void range_checkPerformance ()
+    {
+        typedef u_int64_t INT;
+
+        u_int64_t sum1=0, sum2=0;
+
+        INT begin=1, end=1000*1000*1000;
+
+        /** We create a range. */
+        Range<INT> range (begin, end);
+
+        /** We create an iterator from the range (seen as an Iterable). */
+        Range<INT>::Iterator it (range);
+
+        /** We need something to measure elapsed time. */
+        ITime& ts = System::time();
+
+        /** Note that we use 'volatile' keyword in order to avoid unwanted optimizations here. */
+        volatile ITime::Value t0 = ts.getTimeStamp();
+
+        for (it.first(); !it.isDone(); it.next())   {  sum1 += it.item();  }
+
+        volatile ITime::Value t1 = ts.getTimeStamp();
+
+        for (INT i=begin; i<=end; i++)   {  sum2 += i;  }
+
+        volatile ITime::Value t2 = ts.getTimeStamp();
+
+        /** We check we got the same result with both loops. */
+        CPPUNIT_ASSERT (sum1 > 0  &&  sum1 == sum2);
+
+        /** We check that performances are of same order. */
+        double err = 100.0 * ABS (1.0 - (double)(t1-t0) / (double)(t2-t1));
+
+        /** The 'iterator' loop should be less than 100% slower than the 'direct' loop. */
+        CPPUNIT_ASSERT (err < 100);
+    }
+
+    /********************************************************************************/
+    void vector_check1 ()
+    {
+        char table[] = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+
+        Vector<char> v1;
+        CPPUNIT_ASSERT (v1.size() == 0);
+        CPPUNIT_ASSERT (v1.getBuffer() == 0);
+
+        v1.set (table, ARRAY_SIZE(table));
+        CPPUNIT_ASSERT (v1.size() == ARRAY_SIZE(table));
+        for (size_t i=0; i<ARRAY_SIZE(table); i++)  {  CPPUNIT_ASSERT (v1[i] == table[i]);  }
+
+        v1.set (0, 0);
+        CPPUNIT_ASSERT (v1.size() == 0);
+        CPPUNIT_ASSERT (v1.getBuffer() == 0);
+    }
+
+    /********************************************************************************/
+    void vector_check2 ()
+    {
+        char table[] = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+
+        /** We create a reference vector and use it locally. */
+        Vector<char>* ref = new Vector<char> (ARRAY_SIZE(table));
+        ref->use ();
+
+        /** We put some values into the vector. */
+        for (size_t i=0; i<ARRAY_SIZE(table); i++)  { (*ref)[i] = table[i]; }
+
+        /** We create other vectors referencing the previous one. */
+        Vector<char> v1;  v1.setRef (ref, 0, 2);
+        Vector<char> v2;  v2.setRef (ref, 2, 2);
+        Vector<char> v3;  v3.setRef (ref, 4, 2);
+        Vector<char> v4;  v4.setRef (ref, 6, 2);
+        Vector<char> v5;  v5.setRef (ref, 8, 2);
+
+        /** We release locally the referred vector. Since it is referred by the other vectors,
+         * it won't be deleted by the release here but when the last vector will release it. */
+        ref->forget ();
+
+        /** Now we check the content of the other vectors. */
+        CPPUNIT_ASSERT (v1.size() == 2);    for (size_t i=0; i<v1.size(); i++)  {  CPPUNIT_ASSERT (v1[i] == table[i+0]);  }
+        CPPUNIT_ASSERT (v2.size() == 2);    for (size_t i=0; i<v2.size(); i++)  {  CPPUNIT_ASSERT (v2[i] == table[i+2]);  }
+        CPPUNIT_ASSERT (v3.size() == 2);    for (size_t i=0; i<v3.size(); i++)  {  CPPUNIT_ASSERT (v3[i] == table[i+4]);  }
+        CPPUNIT_ASSERT (v4.size() == 2);    for (size_t i=0; i<v4.size(); i++)  {  CPPUNIT_ASSERT (v4[i] == table[i+6]);  }
+        CPPUNIT_ASSERT (v5.size() == 2);    for (size_t i=0; i<v5.size(); i++)  {  CPPUNIT_ASSERT (v5[i] == table[i+8]);  }
+    }
+
+    /********************************************************************************/
+
+    /** \brief Check reference of a reference.
+     *
+     * Note: we instantiate ref1 and ref2 but don't take a local reference (with 'use')
+     *  => they are referred by ref3 (directly and indirectly) and so should be deleted when needed.
+     */
+    void vector_check3 ()
+    {
+        char table[] = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
+
+        /** We create a reference vector. */
+        Vector<char>* ref1 = new Vector<char> (ARRAY_SIZE(table));
+        for (size_t i=0; i<ARRAY_SIZE(table); i++)  { (*ref1)[i] = table[i]; }
+
+        /** We create a reference vector. */
+        Vector<char>* ref2 = new Vector<char> ();
+        ref2->setRef (ref1, 3, 5);  // should hold 5, 8, 13, 21, 34
+        CPPUNIT_ASSERT (ref2->size() == 5);
+
+        /** We create a reference vector and use it locally. */
+        Vector<char> ref3;
+        ref3.setRef (ref2, 1, 3);  // should hold 8, 13, 21
+        CPPUNIT_ASSERT (ref3.size() == 3);
+        CPPUNIT_ASSERT (ref3[0] == 8);
+        CPPUNIT_ASSERT (ref3[1] == 13);
+        CPPUNIT_ASSERT (ref3[2] == 21);
+    }
+
+    /********************************************************************************/
+    void parser_check1_aux (IOptionsParser* parser, const string& str, bool ok, size_t nbProps, const string& check)
+    {
+        IProperties* props = 0;
+        try
+        {
+            props = parser->parseString (str);
+
+            /** We can't be here. */
+            CPPUNIT_ASSERT (ok);
+        }
+        catch (OptionFailure& e)
+        {
+            CPPUNIT_ASSERT (!ok);
+        }
+
+        if (ok)
+        {
+            CPPUNIT_ASSERT (props != 0);
+
+            if (props->getKeys().size() > 0)
+            {
+                stringstream ss;
+                XmlDumpPropertiesVisitor xml (ss, false, false);
+                props->accept (&xml);
+
+                CPPUNIT_ASSERT (check == ss.str());
+            }
+
+            CPPUNIT_ASSERT (props->getKeys().size() == nbProps);
+        }
+    }
+
+    void parser_check1 ()
+    {
+        OptionsParser* parser1 = new OptionsParser ("dsk");
+        parser1->push_back (new OptionOneParam ("-a",  "option a", false, "1"));
+
+        OptionsParser* parser2 = new OptionsParser ("bloom");
+        parser2->push_back (new OptionOneParam ("-b",  "option b", true));
+
+        OptionsParser* parser3 = new OptionsParser ("debloom");
+        parser3->push_back (new OptionOneParam ("-c",  "option c", false));
+
+        OptionsParser* composite = new OptionsParser ("dbgh5");
+        LOCAL (composite);
+
+        composite->push_back (parser1);
+        composite->push_back (parser2);
+        composite->push_back (parser3);
+
+        parser_check1_aux (parser1, "-a 1", true,  1, "<-a>1</-a>");
+        parser_check1_aux (parser1, "-b 2", false, 1, "<-a>1</-a>");
+
+        parser_check1_aux (parser2, "-a 3", false, 1, "");
+        parser_check1_aux (parser2, "-b 4", true,  1, "<-b>4</-b>");
+
+        parser_check1_aux (parser3, "-c 5", true, 1, "<-c>5</-c>");
+
+        parser_check1_aux (composite, "-a 5 -b 6 -c 7", true,  3, "<-a>5</-a><-b>6</-b><-c>7</-c>");
+        parser_check1_aux (composite, "-a 8 -b 9",      true,  2, "<-a>8</-a><-b>9</-b>");
+        parser_check1_aux (composite, "-a 10 -c 11",    false, 0, "");
+    }
+
+    /********************************************************************************/
+    void parser_check2 ()
+    {
+        {
+            OptionsParser parser ("test1");
+            parser.push_back (new OptionNoParam ("-a",  "option a", false));
+            parser.push_back (new OptionNoParam ("-b",  "option b", false));
+            try  {
+                parser.parseString ("-a -b");
+                CPPUNIT_ASSERT(parser.saw("-a"));
+                CPPUNIT_ASSERT(parser.saw("-b"));
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test2");
+            parser.push_back (new OptionNoParam  ("-a",  "option a", false));
+            parser.push_back (new OptionOneParam ("-b",  "option b", false));
+            try  {
+                parser.parseString ("-a -b foo");
+                CPPUNIT_ASSERT(parser.saw("-a"));
+                CPPUNIT_ASSERT(parser.saw("-b"));
+                CPPUNIT_ASSERT(parser.getProperties()->getStr("-b") == "foo");
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test3");
+            parser.push_back (new OptionOneParam ("-a",  "option a", false));
+            parser.push_back (new OptionNoParam  ("-b",  "option b", false));
+            try  {
+                parser.parseString ("-a foo -b");
+                CPPUNIT_ASSERT(parser.saw("-a"));
+                CPPUNIT_ASSERT(parser.saw("-b"));
+                CPPUNIT_ASSERT(parser.getProperties()->getStr("-a") == "foo");
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test4");
+            parser.push_back (new OptionNoParam  ("-a",  "option a", false));
+            parser.push_back (new OptionOneParam ("-b",  "option b", false));
+            parser.push_back (new OptionNoParam  ("-c",  "option c", false));
+            try  {
+                parser.parseString ("-a -b foo -c");
+                CPPUNIT_ASSERT(parser.saw("-a"));
+                CPPUNIT_ASSERT(parser.saw("-b"));
+                CPPUNIT_ASSERT(parser.getProperties()->getStr("-b") == "foo");
+                CPPUNIT_ASSERT(parser.saw("-c"));
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test5");
+            parser.push_back (new OptionOneParam ("-b",  "option b", false));
+            try  {
+                parser.parseString ("-b");
+                CPPUNIT_ASSERT(false);
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(true);  }
+        }
+        {
+            OptionsParser parser ("test6");
+            parser.push_back (new OptionNoParam ("-b",  "option b", false));
+            try  {
+                parser.parseString ("");
+                CPPUNIT_ASSERT(true);
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test7");
+            try  {
+                parser.parseString ("");
+                CPPUNIT_ASSERT(true);
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(false);  }
+        }
+        {
+            OptionsParser parser ("test7");
+            parser.push_back (new OptionNoParam ("-b",  "option b", true));
+            try  {
+                parser.parseString ("");
+                CPPUNIT_ASSERT(false);
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(true);  }
+        }
+        {
+            OptionsParser parser ("test8");
+            parser.push_back (new OptionNoParam  ("-a",  "option a", false));
+            parser.push_back (new OptionOneParam ("-b",  "option b", true));
+            try  {
+                parser.parseString ("-a");
+                CPPUNIT_ASSERT(false);
+            }
+            catch (OptionFailure& e)    {  CPPUNIT_ASSERT(true);  }
+        }
+    }
+
+    /********************************************************************************/
+    void stringline_check1 (void)
+    {
+        string s1 = "abcdefghijklmnopqrstuvwxyz";
+        string s2 = s1 + s1;
+
+        CPPUNIT_ASSERT (StringLine::format (s1).size() == StringLine::getDefaultWidth());
+        CPPUNIT_ASSERT (StringLine::format (s2).size() == StringLine::getDefaultWidth());
+    }
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestMisc);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestMisc);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/test/unit/src/tools/storage/TestStorage.cpp b/gatb-core/test/unit/src/tools/storage/TestStorage.cpp
new file mode 100644
index 0000000..2a9a1db
--- /dev/null
+++ b/gatb-core/test/unit/src/tools/storage/TestStorage.cpp
@@ -0,0 +1,460 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <CppunitCommon.hpp>
+
+#include <gatb/system/impl/System.hpp>
+
+#include <gatb/tools/storage/impl/Storage.hpp>
+#include <gatb/tools/collections/impl/CollectionCache.hpp>
+
+#include <gatb/tools/misc/api/Range.hpp>
+
+#include <gatb/tools/designpattern/impl/Command.hpp>
+
+#include <gatb/tools/misc/api/Macros.hpp>
+#include <gatb/tools/math/NativeInt64.hpp>
+#include <gatb/tools/math/LargeInt.hpp>
+
+using namespace std;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::tools::storage;
+using namespace gatb::core::tools::storage::impl;
+
+using namespace gatb::core::tools::dp;
+using namespace gatb::core::tools::dp::impl;
+
+using namespace gatb::core::tools::misc;
+
+using namespace gatb::core::tools::math;
+
+using namespace gatb::core::system;
+using namespace gatb::core::system::impl;
+
+#define ABS(a)  ((a)<0 ? -(a) : (a))
+
+/********************************************************************************/
+namespace gatb  {  namespace tests  {
+/********************************************************************************/
+
+/** \brief Test class for operating system operations
+ */
+class TestStorage : public Test
+{
+    /********************************************************************************/
+    CPPUNIT_TEST_SUITE_GATB (TestStorage);
+ 
+        CPPUNIT_TEST_GATB (storage_stream_file);
+        CPPUNIT_TEST_GATB (storage_stream_file_big);
+        CPPUNIT_TEST_GATB (storage_stream_hdf5);
+
+
+        CPPUNIT_TEST_GATB (storage_check1);
+        CPPUNIT_TEST_GATB (storage_check2);
+        CPPUNIT_TEST_GATB (storage_check3);
+        CPPUNIT_TEST_GATB (storage_check4);
+
+        CPPUNIT_TEST_GATB (storage_HDF5_check_collection);
+        CPPUNIT_TEST_GATB (storage_HDF5_check_partition);
+        
+        CPPUNIT_TEST_SUITE_GATB_END();
+
+public:
+
+    /********************************************************************************/
+    void setUp    ()  {}
+    void tearDown ()  {}
+
+    /********************************************************************************/
+    void storage_check1 ()
+    {
+        /** We create a storage. */
+        Storage storage (STORAGE_FILE, "dsk");
+
+        /** We get a collection from the storage. */
+        Collection<NativeInt64>& solidKmers = storage().getCollection<NativeInt64> ("solid");
+
+        NativeInt64 table[] = { 12354684684, 6876436549, 87654351, 6843516877, 68435434874};
+        vector<NativeInt64> items (table, table + ARRAY_SIZE(table));
+
+        /** We insert some items. */
+        solidKmers.insert (items);
+
+        /** We have to flush the bag in order to be sure all items are correctly inserted. */
+        solidKmers.flush ();
+
+        /** We check we inserted the correct number of items. */
+        CPPUNIT_ASSERT (solidKmers.getNbItems() == ARRAY_SIZE(table));
+
+        /** We delete the storage. */
+        storage.remove ();
+    }
+
+    /********************************************************************************/
+    void storage_check2 ()
+    {
+        size_t nbParts = 10;
+
+        /** We create a storage. */
+        Storage storage (STORAGE_FILE, "graph");
+
+        /** We create a partition. */
+        Partition<NativeInt64>& partition = storage().getPartition<NativeInt64> ("parts", nbParts);
+
+        CPPUNIT_ASSERT (partition.size() == nbParts);
+
+        /** We insert some items into the partition. */
+        for (size_t i=0; i<partition.size(); i++)  {  partition[i].insert (2*i);  }
+
+        /** We flush the partition. */
+        partition.flush ();
+
+        /** We check the content of what was inserted. */
+        for (size_t i=0; i<partition.size(); i++)
+        {
+            size_t nbIter = 0;
+            Iterator<NativeInt64>* it = partition[i].iterator();    LOCAL(it);
+            for (it->first(); !it->isDone(); it->next(), nbIter++)  {  CPPUNIT_ASSERT (it->item() == 2*i);  }
+            CPPUNIT_ASSERT (nbIter == 1);
+        }
+
+        /** We use a partition cache. */
+        PartitionCache<NativeInt64> cache (partition, 10000);
+
+        /** We insert some items into the partition. */
+        for (size_t i=0; i<cache.size(); i++)  {  cache[i].insert (2*i+1);  }
+
+        /** We flush the cache. */
+        cache.flush ();
+
+        /** We check the content of what was inserted. */
+        for (size_t i=0; i<partition.size(); i++)
+        {
+            size_t nbIter = 0;
+            Iterator<NativeInt64>* it = partition[i].iterator();    LOCAL(it);
+            for (it->first(); !it->isDone(); it->next(), nbIter++)
+            {
+                if (nbIter==0)  {  CPPUNIT_ASSERT (it->item() == 2*i  ); }
+                if (nbIter==1)  {  CPPUNIT_ASSERT (it->item() == 2*i+1); }
+            }
+            CPPUNIT_ASSERT (nbIter == 2);
+        }
+
+        /** We delete the storage. */
+        storage.remove ();
+    }
+
+    /********************************************************************************/
+    void storage_check3 ()
+    {
+        size_t nbParts = 10;
+        size_t nbItems = nbParts * 1000;
+
+        /** We create a storage. */
+        Storage storage (STORAGE_FILE, "graph");
+
+        /** We create a partition. */
+        Partition<NativeInt64>& partition = storage().getPartition<NativeInt64> ("parts", nbParts);
+
+        /** We add items in partitions. */
+        for (size_t i=0; i<nbItems; i++)  {  partition[i%nbParts].insert (i);  }
+
+        /** We flush the partition. */
+        partition.flush ();
+
+        /** We check the content of each partition. */
+        for (size_t i=0; i<nbParts; i++)
+        {
+            size_t nbIter = 0;
+            Iterator<NativeInt64>* it = partition[i].iterator();    LOCAL(it);
+            for (it->first(); !it->isDone(); it->next(), nbIter++)
+            {
+                // entry should be for some k : nbParts.k + i
+                CPPUNIT_ASSERT ( (it->item() - i) % nbParts == 0);
+            }
+            CPPUNIT_ASSERT (nbIter == nbItems / nbParts);
+        }
+
+        /** We delete the storage. */
+        storage.remove ();
+    }
+
+    /********************************************************************************/
+
+    class MyFunctor
+    {
+    public:
+
+        MyFunctor (Partition<NativeInt64>& partition, size_t nbRepeat)
+            : _cache (partition, 10000, System::thread().newSynchronizer()), _nbParts(partition.size()), _nbRepeat(nbRepeat)   {}
+
+        void operator() (const size_t& item)
+        {
+            /** We repeat the process => more job to do on each thread. */
+            for (size_t i=0; i<_nbRepeat; i++)   {  _cache [item % _nbParts].insert (item);  }
+        }
+
+    private:
+
+        PartitionCache<NativeInt64> _cache;
+        size_t _nbParts;
+        size_t _nbRepeat;
+    };
+
+    void storage_check4 ()
+    {
+        size_t nbParts  = 10;
+        size_t nbItems  = nbParts * 1000;
+        size_t nbRepeat = 500;
+
+        /** We create a storage. */
+        Storage storage (STORAGE_FILE, "graph");
+
+        /** We create a partition. */
+        Partition<NativeInt64>& partition = storage().getPartition<NativeInt64> ("parts", nbParts);
+
+        /** We build a Range. */
+        Range<size_t>::Iterator it (0, nbItems-1);
+
+        /** We dispatch the range iteration. */
+        Dispatcher().iterate (it, MyFunctor(partition,nbRepeat));
+
+        /** We check the content of each partition. */
+        size_t nbIterTotal = 0;
+        for (size_t i=0; i<nbParts; i++)
+        {
+            size_t nbIter = 0;
+            Iterator<NativeInt64>* it = partition[i].iterator();    LOCAL(it);
+            for (it->first(); !it->isDone(); it->next(), nbIter++)
+            {
+                // each entry should be (for some k) : nbParts.k + i
+                CPPUNIT_ASSERT ( (it->item() - i) % nbParts == 0);
+            }
+            CPPUNIT_ASSERT (nbIter == (nbRepeat * nbItems) / nbParts);
+
+            nbIterTotal += nbIter;
+        }
+
+        /** We check the total number of items. */
+        CPPUNIT_ASSERT (nbIterTotal == nbRepeat * nbItems);
+
+        /** We delete the storage. */
+        storage.remove ();
+    }
+
+    /********************************************************************************/
+    template<typename T>
+    void collection_HDF5_check_collection_aux (T* values, size_t len)
+    {
+        /** We create a storage. */
+        Storage* storage = StorageFactory(STORAGE_HDF5).create ("aStorage", true, false);
+        LOCAL (storage);
+
+        /** We get a collection from the storage. */
+        Collection<T>& collection = (*storage)().getCollection<T> ("foo");
+
+        /** We insert the values into the bag. */
+        collection.insert (values, len);
+
+        CPPUNIT_ASSERT (collection.getNbItems() == (int)len);
+
+        /** We get an iterator on the collection. */
+        size_t idx=0;
+        Iterator<T>* it = collection.iterator();  LOCAL(it);
+        for (it->first(); !it->isDone(); it->next(), idx++)
+        {
+            CPPUNIT_ASSERT (it->item() == values[idx]);
+        }
+
+        CPPUNIT_ASSERT (idx == len);
+
+        /** We remove physically the storage. */
+        storage->remove ();
+    }
+
+    /********************************************************************************/
+    void storage_HDF5_check_collection ()
+    {
+        NativeInt64 values1[] = { 1,2,3,4,5,6,7,8,9};
+        collection_HDF5_check_collection_aux (values1, ARRAY_SIZE(values1));
+
+        NativeInt64 values2[4096];  for (size_t i=0; i<ARRAY_SIZE(values2); i++)  { values2[i]=i; }
+        collection_HDF5_check_collection_aux (values2, ARRAY_SIZE(values2));
+    }
+
+    /********************************************************************************/
+    template<typename T>
+    void collection_HDF5_check_partition_aux (T* values, size_t len, size_t nbParts)
+    {
+        /** We create a storage. */
+        Storage* storage = StorageFactory(STORAGE_HDF5).create ("aStorage", true, false);
+        LOCAL (storage);
+
+        /** We create a partition. */
+        Partition<T>& partition = (*storage)().getPartition <T> ("foo", nbParts);
+
+        /** We cache the partition. */
+        PartitionCache<T> cache (partition, 1<<10, 0);
+
+        /** We insert the items. */
+        for (size_t i=0; i<len; i++)  {  cache[i%nbParts].insert (values[i]);  }
+
+        /** We flush the partition. */
+        cache.flush ();
+
+        /** We check the content of each partition. */
+        for (size_t p=0; p<nbParts; p++)
+        {
+            /** We get an iterator on the current collection. */
+            size_t idx=0;
+            Iterator<T>* it = cache[p].iterator();  LOCAL(it);
+            for (it->first(); !it->isDone(); it->next(), idx++)
+            {
+                CPPUNIT_ASSERT (it->item() == values[idx* nbParts + p]);
+            }
+
+            CPPUNIT_ASSERT (idx == len/4);
+        }
+
+        /** We remove physically the storage. */
+        storage->remove ();
+    }
+
+    /********************************************************************************/
+    void storage_HDF5_check_partition ()
+    {
+        NativeInt64 values1[1<<15];  for (size_t i=0; i<ARRAY_SIZE(values1); i++)  { values1[i]=i; }
+        collection_HDF5_check_partition_aux (values1, ARRAY_SIZE(values1), 4);
+    }
+
+    
+    template <class T>
+    void storage_stream_aux(T storage)
+    {
+
+        gatb::core::tools::storage::impl::Group& group = (*storage)().getGroup("test");
+
+	uint32_t _nbpart = 5, _mm = 1, _nb_minims = 60000, _nbPass = 100;
+	{
+		gatb::core::tools::storage::impl::Storage::ostream os (group, "minimRepart");
+		os.write ((const char*)&_nbpart,                sizeof(_nbpart));
+		os.write ((const char*)&_mm,                    sizeof(_mm));
+		os.write ((const char*)&_nb_minims,             sizeof(_nb_minims));
+		os.write ((const char*)&_nbPass,                sizeof(_nbPass));
+		os.flush();
+	}
+        
+        gatb::core::tools::storage::impl::Storage::istream is (group, "minimRepart");
+	if (is.bad() || is.fail() ||is.eof())
+	{
+		 std::cout << " in anticipation of assert fail, could not even open istream, bad/fail status: " << is.bad()  << " " << is.fail()<< std::endl;
+                  CPPUNIT_ASSERT(false);
+
+	}
+        uint32_t _nbpart2, _mm2, _nb_minims2, _nbPass2;
+        is.read ((char*)&_nbpart2,     sizeof(_nbpart));
+
+	  if ( is.bad() || is.fail() ||is.eof() )
+	  {
+                   std::cout << " in anticipation of assert fail, could open but not read from istream, bad/fail/eof status: " << is.bad()  << " " << is.fail()<< " " <<is.eof()  << std::endl;
+		   CPPUNIT_ASSERT(false);
+	  }
+
+        is.read ((char*)&_mm2,         sizeof(_mm));
+
+        is.read ((char*)&_nb_minims2,  sizeof(_nb_minims));
+        is.read ((char*)&_nbPass2,     sizeof(_nbPass));
+
+
+	if (_nbpart2 != _nbpart)
+		std::cout << " in anticipation of assert fail, _nbpart2 = "<< _nbpart2 << " and _nbpart = " << _nbpart << std::endl;
+        CPPUNIT_ASSERT (_nbpart2 == _nbpart);
+        CPPUNIT_ASSERT (_mm2 == _mm);
+        CPPUNIT_ASSERT (_nb_minims == _nb_minims2);
+        CPPUNIT_ASSERT (_nbPass == _nbPass2);
+    }
+
+    void storage_stream_hdf5()
+    {
+        /** We create a storage. */
+        Storage* storage = StorageFactory(STORAGE_HDF5).create ("aStorage", true, false);
+        LOCAL (storage);
+
+        storage_stream_aux(storage);
+
+       /** We remove physically the storage. */
+        storage->remove ();
+    }
+    
+    void storage_stream_file()
+   {
+         /** We create a storage. */
+        Storage storage (STORAGE_FILE, "test_storage_file");
+        
+        storage_stream_aux(&storage);
+        
+        storage.remove ();
+    }
+
+    void storage_stream_file_big()
+   {
+         /** We create a storage. */
+        Storage storage (STORAGE_FILE, "test_storage_file");
+        
+   
+         gatb::core::tools::storage::impl::Group& group = (storage)().getGroup("test");
+
+         // 1 MB
+         int size = 1000000;
+         unsigned char *buffer = (unsigned char*)malloc(size);
+         for (int i = 0; i < size; i ++)
+         {
+             buffer[i] = i % 255;
+         }
+
+        gatb::core::tools::storage::impl::Storage::ostream os (group, "minimRepart");
+        os.write ((const char*)buffer, size);
+        os.flush();
+        
+        
+        gatb::core::tools::storage::impl::Storage::istream is (group, "minimRepart");
+        unsigned char *buffer2 = (unsigned char*)malloc(size);
+        is.read ((char *)buffer2, size);
+
+        for (int i = 0; i < size; i ++)
+        CPPUNIT_ASSERT (buffer[i] == buffer2[i]);
+
+        storage.remove ();
+        free(buffer);
+        free(buffer2);
+    }
+
+
+};
+
+/********************************************************************************/
+
+CPPUNIT_TEST_SUITE_REGISTRATION      (TestStorage);
+CPPUNIT_TEST_SUITE_REGISTRATION_GATB (TestStorage);
+
+/********************************************************************************/
+} } /* end of namespaces. */
+/********************************************************************************/
diff --git a/gatb-core/thirdparty/BooPHF/BooPHF.h b/gatb-core/thirdparty/BooPHF/BooPHF.h
new file mode 100644
index 0000000..25bc0cc
--- /dev/null
+++ b/gatb-core/thirdparty/BooPHF/BooPHF.h
@@ -0,0 +1,1223 @@
+// BooPHF library
+// intended to be a minimal perfect hash function with fast and low memory construction, at the cost of (slightly) higher bits/elem than other state of the art libraries once built.
+// should work with arbitray large number of elements, based on a cascade of  "collision-free" bit arrays
+
+#pragma once
+#include <stdio.h>
+#include <climits>
+#include <stdlib.h>
+#include <iostream>
+#include <math.h>
+
+#include <array>
+#include <unordered_map>
+#include <vector>
+#include <assert.h>
+#include <sys/time.h>
+#include <string.h>
+#include <memory> // for make_shared
+
+
+namespace boomphf {
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark utils
+////////////////////////////////////////////////////////////////
+
+	inline unsigned int popcount_32(unsigned int x)
+	{
+		unsigned int m1 = 0x55555555;
+		unsigned int m2 = 0x33333333;
+		unsigned int m4 = 0x0f0f0f0f;
+		unsigned int h01 = 0x01010101;
+		x -= (x >> 1) & m1;               /* put count of each 2 bits into those 2 bits */
+		x = (x & m2) + ((x >> 2) & m2);   /* put count of each 4 bits in */
+		x = (x + (x >> 4)) & m4;          /* put count of each 8 bits in partie droite  4bit piece*/
+		return (x * h01) >> 24;           /* returns left 8 bits of x + (x<<8) + ... */
+	}
+
+
+	inline unsigned int popcount_64(uint64_t x)
+	{
+		unsigned int low = x & 0xffffffff ;
+		unsigned int high = ( x >> 32LL) & 0xffffffff ;
+
+		return (popcount_32(low) + popcount_32(high));
+	}
+
+
+	///// progress bar
+	class Progress
+	{
+	public:
+		int timer_mode;
+		struct timeval timestamp;
+		double heure_debut, heure_actuelle ;
+		std::string   message;
+
+		uint64_t done;
+		uint64_t todo;
+		int subdiv ; // progress printed every 1/subdiv of total to do
+		double partial;
+		int _nthreads;
+		std::vector<double > partial_threaded;
+		std::vector<uint64_t > done_threaded;
+
+		double steps ; //steps = todo/subidv
+
+		void init(uint64_t ntasks, const char * msg,int nthreads =1)
+		{
+			_nthreads = nthreads;
+			message = std::string(msg);
+			gettimeofday(&timestamp, NULL);
+			heure_debut = timestamp.tv_sec +(timestamp.tv_usec/1000000.0);
+
+			//fprintf(stderr,"| %-*s |\n",98,msg);
+
+			todo= ntasks;
+			done = 0;
+			partial =0;
+			
+			partial_threaded.resize(_nthreads);
+			done_threaded.resize(_nthreads);
+			
+			for (int ii=0; ii<_nthreads;ii++) partial_threaded[ii]=0;
+			for (int ii=0; ii<_nthreads;ii++) done_threaded[ii]=0;
+			subdiv= 1000;
+			steps = (double)todo / (double)subdiv;
+
+			if(!timer_mode)
+			{
+				 fprintf(stderr,"[");fflush(stderr);
+			}
+		}
+
+		void finish()
+		{
+			set(todo);
+			 if(timer_mode)
+			 	fprintf(stderr,"\n");
+			 else
+			 	fprintf(stderr,"]\n");
+
+			fflush(stderr);
+			todo= 0;
+			done = 0;
+			partial =0;
+
+		}
+		void finish_threaded()// called by only one of the threads
+		{
+			done = 0;
+			for (int ii=0; ii<_nthreads;ii++) done += (done_threaded[ii] );
+			for (int ii=0; ii<_nthreads;ii++) partial += (partial_threaded[ii] );
+
+			finish();
+
+		}
+		void inc(uint64_t ntasks_done)
+		{
+			done += ntasks_done;
+			partial += ntasks_done;
+
+
+			while(partial >= steps)
+			{
+				if(timer_mode)
+				{
+					gettimeofday(&timestamp, NULL);
+					heure_actuelle = timestamp.tv_sec +(timestamp.tv_usec/1000000.0);
+					double elapsed = heure_actuelle - heure_debut;
+					double speed = done / elapsed;
+					double rem = (todo-done) / speed;
+					if(done>todo) rem=0;
+					int min_e  = (int)(elapsed / 60) ;
+					elapsed -= min_e*60;
+					int min_r  = (int)(rem / 60) ;
+					rem -= min_r*60;
+
+				 fprintf(stderr,"%c[%s]  %-5.3g%%   elapsed: %3i min %-2.0f sec   remaining: %3i min %-2.0f sec",13,
+				 		message.c_str(),
+				 		100*(double)done/todo,
+				 		min_e,elapsed,min_r,rem);
+
+				}
+				else
+				{
+					 fprintf(stderr,"-");fflush(stderr);
+				}
+				partial -= steps;
+			}
+
+
+		}
+
+		void inc(uint64_t ntasks_done, int tid) //threads collaborate to this same progress bar
+		{
+			partial_threaded[tid] += ntasks_done;
+			done_threaded[tid] += ntasks_done;
+			while(partial_threaded[tid] >= steps)
+			{
+				if(timer_mode)
+				{
+					struct timeval timet;
+					double now;
+					gettimeofday(&timet, NULL);
+					now = timet.tv_sec +(timet.tv_usec/1000000.0);
+					uint64_t total_done  = 0;
+					for (int ii=0; ii<_nthreads;ii++) total_done += (done_threaded[ii] );
+					double elapsed = now - heure_debut;
+					double speed = total_done / elapsed;
+					double rem = (todo-total_done) / speed;
+					if(total_done > todo) rem =0;
+					int min_e  =  (int)(elapsed / 60) ;
+					elapsed -= min_e*60;
+					int min_r  =  (int)(rem / 60) ;
+					rem -= min_r*60;
+
+					 fprintf(stderr,"%c[%s]  %-5.3g%%   elapsed: %3i min %-2.0f sec   remaining: %3i min %-2.0f sec",13,
+					 		message.c_str(),
+					 		100*(double)total_done/todo,
+					 		min_e,elapsed,min_r,rem);
+				}
+				else
+				{
+					 fprintf(stderr,"-");fflush(stderr);
+				}
+				partial_threaded[tid] -= steps;
+
+			}
+
+		}
+
+		void set(uint64_t ntasks_done)
+		{
+			if(ntasks_done > done)
+				inc(ntasks_done-done);
+		}
+		Progress () :     timer_mode(0) {}
+		//include timer, to print ETA ?
+	};
+
+
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark hasher
+////////////////////////////////////////////////////////////////
+
+	typedef std::array<uint64_t,10> hash_set_t;
+	typedef std::array<uint64_t,2> hash_pair_t;
+
+
+
+	template <typename Item> class HashFunctors
+	{
+	public:
+
+		/** Constructor.
+		 * \param[in] nbFct : number of hash functions to be used
+		 * \param[in] seed : some initialization code for defining the hash functions. */
+		HashFunctors ()
+		{
+			_nbFct = 7; // use 7 hash func
+			_user_seed = 0;
+			generate_hash_seed ();
+		}
+
+		//return one hash
+        uint64_t operator ()  (const Item& key, size_t idx)  const {  return hash64 (key, _seed_tab[idx]);  }
+
+        uint64_t hashWithSeed(const Item& key, uint64_t seed)  const {  return hash64 (key, seed);  }
+
+		//this one returns all the 7 hashes
+		//maybe use xorshift instead, for faster hash compute
+		hash_set_t operator ()  (const Item& key)
+		{
+			hash_set_t	 hset;
+
+			for(size_t ii=0;ii<10; ii++)
+			{
+				hset[ii] =  hash64 (key, _seed_tab[ii]);
+			}
+			return hset;
+		}
+
+	private:
+
+
+		inline static uint64_t hash64 (Item key, uint64_t seed)
+		{
+			uint64_t hash = seed;
+			hash ^= (hash <<  7) ^  key * (hash >> 3) ^ (~((hash << 11) + (key ^ (hash >> 5))));
+			hash = (~hash) + (hash << 21);
+			hash = hash ^ (hash >> 24);
+			hash = (hash + (hash << 3)) + (hash << 8);
+			hash = hash ^ (hash >> 14);
+			hash = (hash + (hash << 2)) + (hash << 4);
+			hash = hash ^ (hash >> 28);
+			hash = hash + (hash << 31);
+
+			return hash;
+		}
+
+		/* */
+		void generate_hash_seed ()
+		{
+			static const uint64_t rbase[MAXNBFUNC] =
+			{
+				0xAAAAAAAA55555555ULL,  0x33333333CCCCCCCCULL,  0x6666666699999999ULL,  0xB5B5B5B54B4B4B4BULL,
+				0xAA55AA5555335533ULL,  0x33CC33CCCC66CC66ULL,  0x6699669999B599B5ULL,  0xB54BB54B4BAA4BAAULL,
+				0xAA33AA3355CC55CCULL,  0x33663366CC99CC99ULL
+			};
+
+			for (size_t i=0; i<MAXNBFUNC; ++i)  {  _seed_tab[i] = rbase[i];  }
+			for (size_t i=0; i<MAXNBFUNC; ++i)  {  _seed_tab[i] = _seed_tab[i] * _seed_tab[(i+3) % MAXNBFUNC] + _user_seed ;  }
+		}
+
+		size_t _nbFct;
+
+		static const size_t MAXNBFUNC = 10;
+		uint64_t _seed_tab[MAXNBFUNC];
+		uint64_t _user_seed;
+	};
+
+/* alternative hash functor based on xorshift, taking a single hash functor as input.
+we need this 2-functors scheme because HashFunctors won't work with unordered_map.
+(rayan)
+*/
+
+    // wrapper around HashFunctors to return only one value instead of 7
+    template <typename Item> class SingleHashFunctor
+	{
+	public:
+		uint64_t operator ()  (const Item& key, uint64_t seed=0xAAAAAAAA55555555ULL) const  {  return hashFunctors.hashWithSeed(key, seed);  }
+
+	private:
+		HashFunctors<Item> hashFunctors;
+	};
+
+
+
+    template <typename Item, class SingleHasher_t> class XorshiftHashFunctors
+    {
+        /*  Xorshift128*
+            Written in 2014 by Sebastiano Vigna (vigna at acm.org)
+
+            To the extent possible under law, the author has dedicated all copyright
+            and related and neighboring rights to this software to the public domain
+            worldwide. This software is distributed without any warranty.
+
+            See <http://creativecommons.org/publicdomain/zero/1.0/>. */
+        /* This is the fastest generator passing BigCrush without
+           systematic failures, but due to the relatively short period it is
+           acceptable only for applications with a mild amount of parallelism;
+           otherwise, use a xorshift1024* generator.
+
+           The state must be seeded so that it is not everywhere zero. If you have
+           a nonzero 64-bit seed, we suggest to pass it twice through
+           MurmurHash3's avalanching function. */
+
+      //  uint64_t s[ 2 ];
+
+        uint64_t next(uint64_t * s) {
+            uint64_t s1 = s[ 0 ];
+            const uint64_t s0 = s[ 1 ];
+            s[ 0 ] = s0;
+            s1 ^= s1 << 23; // a
+            return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c
+        }
+
+        public:
+
+
+		uint64_t h0(hash_pair_t  & s, const Item& key )
+		{
+			s[0] =  singleHasher (key, 0xAAAAAAAA55555555ULL);
+			return s[0];
+		}
+
+		uint64_t h1(hash_pair_t  & s, const Item& key )
+		{
+			s[1] =  singleHasher (key, 0x33333333CCCCCCCCULL);
+			return s[1];
+		}
+
+
+		//return next hash an update state s
+		uint64_t next(hash_pair_t  & s ) {
+			uint64_t s1 = s[ 0 ];
+			const uint64_t s0 = s[ 1 ];
+			s[ 0 ] = s0;
+            #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" // remove the "may be uninitialized" message 
+			s1 ^= s1 << 23; // a
+            #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" 
+			return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c
+		}
+
+        //this one returns all the  hashes
+        hash_set_t operator ()  (const Item& key)
+        {
+			uint64_t s[ 2 ];
+
+            hash_set_t   hset;
+
+            hset[0] =  singleHasher (key, 0xAAAAAAAA55555555ULL);
+            hset[1] =  singleHasher (key, 0x33333333CCCCCCCCULL);
+
+            s[0] = hset[0];
+            s[1] = hset[1];
+
+            for(size_t ii=2;ii< 10 /* it's much better have a constant here, for inlining; this loop is super performance critical*/; ii++)
+            {
+                hset[ii] = next(s);
+            }
+
+            return hset;
+        }
+    private:
+        SingleHasher_t singleHasher;
+    };
+
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark iterators
+////////////////////////////////////////////////////////////////
+
+	template <typename Iterator>
+	struct iter_range
+	{
+		iter_range(Iterator b, Iterator e)
+		: m_begin(b)
+		, m_end(e)
+		{}
+
+		Iterator begin() const
+		{ return m_begin; }
+
+		Iterator end() const
+		{ return m_end; }
+
+		Iterator m_begin, m_end;
+	};
+
+	template <typename Iterator>
+	iter_range<Iterator> range(Iterator begin, Iterator end)
+	{
+		return iter_range<Iterator>(begin, end);
+	}
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark BitVector
+////////////////////////////////////////////////////////////////
+
+	class bitVector {
+
+	public:
+
+		bitVector() : _size(0)
+		{
+			_bitArray = nullptr;
+		}
+
+		bitVector(uint64_t n) : _size(n)
+		{
+			_nchar  = (1ULL+n/64ULL);
+			_bitArray =  (uint64_t *) calloc (_nchar,sizeof(uint64_t));
+		}
+
+		~bitVector()
+		{
+			if(_bitArray != nullptr)
+				free(_bitArray);
+		}
+
+		 //copy constructor
+		 bitVector(bitVector const &r)
+		 {
+			 _size =  r._size;
+			 _nchar = r._nchar;
+			 _ranks = r._ranks;
+			 _bitArray = (uint64_t *) calloc (_nchar,sizeof(uint64_t));
+			 memcpy(_bitArray, r._bitArray, _nchar*sizeof(uint64_t) );
+		 }
+		
+		// Copy assignment operator
+		bitVector &operator=(bitVector const &r)
+		{
+			if (&r != this)
+			{
+				_size =  r._size;
+				_nchar = r._nchar;
+				_ranks = r._ranks;
+				if(_bitArray != nullptr)
+					free(_bitArray);
+				_bitArray = (uint64_t *) calloc (_nchar,sizeof(uint64_t));
+				memcpy(_bitArray, r._bitArray, _nchar*sizeof(uint64_t) );
+			}
+			return *this;
+		}
+	
+		// Move assignment operator
+		bitVector &operator=(bitVector &&r)
+		{
+			//printf("bitVector move assignment \n");
+			if (&r != this)
+			{
+				if(_bitArray != nullptr)
+					free(_bitArray);
+				
+				_size =  std::move (r._size);
+				_nchar = std::move (r._nchar);
+				_ranks = std::move (r._ranks);
+				_bitArray = r._bitArray;
+				r._bitArray = nullptr;
+			}
+			return *this;
+		}
+		// Move constructor
+		bitVector(bitVector &&r) : _bitArray ( nullptr),_size(0)
+		{
+			*this = std::move(r);
+		}
+		
+		
+		void resize(uint64_t newsize)
+		{
+			//printf("bitvector resize from  %llu bits to %llu \n",_size,newsize);
+			_nchar  = (1ULL+newsize/64ULL);
+			_bitArray = (uint64_t *) realloc(_bitArray,_nchar*sizeof(uint64_t));
+			_size = newsize;
+		}
+
+		size_t size() const
+		{
+			return _size;
+		}
+
+		uint64_t bitSize() const {return (_nchar*64ULL + _ranks.capacity()*64ULL );}
+
+		//clear whole array
+		void clear()
+		{
+			memset(_bitArray,0,_nchar*sizeof(uint64_t));
+		}
+
+		//clear collisions in interval, only works with start and size multiple of 64
+		void clearCollisions(uint64_t start, size_t size, bitVector * cc)
+		{
+			assert( (start & 63) ==0);
+			assert( (size & 63) ==0);
+			uint64_t ids = (start/64ULL);
+			for(uint64_t ii =0;  ii< (size/64ULL); ii++ )
+			{
+				_bitArray[ids+ii] =  _bitArray[ids+ii] & (~ (cc->get64(ii)) );
+			}
+
+			cc->clear();
+		}
+
+
+		//clear interval, only works with start and size multiple of 64
+		void clear(uint64_t start, size_t size)
+		{
+			assert( (start & 63) ==0);
+			assert( (size & 63) ==0);
+			memset(_bitArray + (start/64ULL),0,(size/64ULL)*sizeof(uint64_t));
+		}
+
+		//for debug purposes
+		void print() const
+		{
+			printf("bit array of size %lli: \n",_size);
+			for(uint64_t ii = 0; ii< _size; ii++)
+			{
+				if(ii%10==0)
+					printf(" (%llu) ",ii);
+				int val = (_bitArray[ii >> 6] >> (ii & 63 ) ) & 1;
+				printf("%i",val);
+			}
+			printf("\n");
+
+			printf("rank array : size %lu \n",_ranks.size());
+			for (uint64_t ii = 0; ii< _ranks.size(); ii++)
+			{
+				printf("%llu :  %lli,  ",ii,_ranks[ii]);
+			}
+			printf("\n");
+		}
+
+		//return value at pos
+		uint64_t operator[](uint64_t pos) const
+		{
+			return (_bitArray[pos >> 6ULL] >> (pos & 63 ) ) & 1;
+		}
+
+		//atomically   return old val and set to 1
+		uint64_t atomic_test_and_set(uint64_t pos)
+		{
+			uint64_t oldval = 	__sync_fetch_and_or (_bitArray + (pos >> 6), (uint64_t) (1ULL << (pos & 63)) );
+
+			return  ( oldval >> (pos & 63 ) ) & 1;
+		}
+
+
+		uint64_t get(uint64_t pos) const
+		{
+			return (*this)[pos];
+		}
+
+		uint64_t get64(uint64_t cell64) const
+		{
+			return _bitArray[cell64];
+		}
+
+		//set bit pos to 1
+		void set(uint64_t pos)
+		{
+			assert(pos<_size);
+			//_bitArray [pos >> 6] |=   (1ULL << (pos & 63) ) ;
+			__sync_fetch_and_or (_bitArray + (pos >> 6ULL), (1ULL << (pos & 63)) );
+		}
+
+		//set bit pos to 0
+		void reset(uint64_t pos)
+		{
+			//_bitArray [pos >> 6] &=   ~(1ULL << (pos & 63) ) ;
+			__sync_fetch_and_and (_bitArray + (pos >> 6ULL), ~(1ULL << (pos & 63) ));
+		}
+
+		//return value of  last rank
+		// add offset to  all ranks  computed
+		uint64_t build_ranks(uint64_t offset =0)
+		{
+			_ranks.reserve(2+ _size/_nb_bits_per_rank_sample);
+
+			uint64_t curent_rank = offset;
+			for (size_t ii = 0; ii < _nchar; ii++) {
+				if (((ii*64)  % _nb_bits_per_rank_sample) == 0) {
+					_ranks.push_back(curent_rank);
+				}
+				curent_rank +=  popcount_64(_bitArray[ii]);
+			}
+
+			return curent_rank;
+		}
+
+		uint64_t rank(uint64_t pos) const
+		{
+			uint64_t word_idx = pos / 64ULL;
+			uint64_t word_offset = pos % 64;
+			uint64_t block = pos / _nb_bits_per_rank_sample;
+			uint64_t r = _ranks[block];
+			for (uint64_t w = block * _nb_bits_per_rank_sample / 64; w < word_idx; ++w) {
+				r += popcount_64( _bitArray[w] );
+			}
+			uint64_t mask = (uint64_t(1) << word_offset ) - 1;
+			r += popcount_64( _bitArray[word_idx] & mask);
+
+			return r;
+		}
+
+
+		void save(std::ostream& os) const
+		{
+			os.write(reinterpret_cast<char const*>(&_size), sizeof(_size));
+			os.write(reinterpret_cast<char const*>(&_nchar), sizeof(_nchar));
+			os.write(reinterpret_cast<char const*>(_bitArray), (std::streamsize)(sizeof(uint64_t) * _nchar));
+			size_t sizer = _ranks.size();
+			os.write(reinterpret_cast<char const*>(&sizer),  sizeof(size_t));
+			os.write(reinterpret_cast<char const*>(_ranks.data()), (std::streamsize)(sizeof(_ranks[0]) * _ranks.size()));
+		}
+
+		void load(std::istream& is)
+		{
+			is.read(reinterpret_cast<char*>(&_size), sizeof(_size));
+			is.read(reinterpret_cast<char*>(&_nchar), sizeof(_nchar));
+			this->resize(_size);
+			is.read(reinterpret_cast<char *>(_bitArray), (std::streamsize)(sizeof(uint64_t) * _nchar));
+
+			size_t sizer;
+			is.read(reinterpret_cast<char *>(&sizer),  sizeof(size_t));
+			_ranks.resize(sizer);
+			is.read(reinterpret_cast<char*>(_ranks.data()), (std::streamsize)(sizeof(_ranks[0]) * _ranks.size()));
+		}
+
+
+	protected:
+		uint64_t*  _bitArray;
+		//uint64_t* _bitArray;
+		uint64_t _size;
+		uint64_t _nchar;
+
+		 // epsilon =  64 / _nb_bits_per_rank_sample   bits
+		// additional size for rank is epsilon * _size
+		static const uint64_t _nb_bits_per_rank_sample = 512; //512 seems ok
+		std::vector<uint64_t> _ranks;
+	};
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark level
+////////////////////////////////////////////////////////////////
+
+	class level{
+	public:
+		level(){ }
+
+		~level() {
+		}
+
+		uint64_t get(uint64_t hash_raw)
+		{
+			uint64_t hashi =    hash_raw %  hash_domain;
+			return bitset.get(hashi);
+		}
+		
+		uint64_t idx_begin;
+		uint64_t hash_domain;
+		bitVector  bitset;
+	};
+
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark mphf
+////////////////////////////////////////////////////////////////
+
+
+#define NBBUFF 10000
+
+	template<typename Range,typename Iterator>
+	struct thread_args
+	{
+		void * boophf;
+		Range const * range;
+		std::shared_ptr<void> it_p; /* used to be "Iterator it" but because of fastmode, iterator is polymorphic; TODO: think about whether it should be a unique_ptr actually */
+		std::shared_ptr<void> until_p; /* to cache the "until" variable */
+		int level;
+	};
+
+	//forward declaration
+
+    template <typename elem_t, typename Hasher_t, typename Range, typename it_type>
+	void * thread_processLevel(void * args);
+
+
+    /* Hasher_t returns a single hash when operator()(elem_t key) is called.
+       if used with XorshiftHashFunctors, it must have the following operator: operator()(elem_t key, uint64_t seed) */
+    template <typename elem_t, typename Hasher_t>
+	class mphf {
+
+        /* this mechanisms gets P hashes out of Hasher_t */
+        typedef XorshiftHashFunctors<elem_t,Hasher_t> MultiHasher_t ;
+       // typedef HashFunctors<elem_t> MultiHasher_t; // original code (but only works for int64 keys)  (seems to be as fast as the current xorshift)
+		//typedef IndepHashFunctors<elem_t,Hasher_t> MultiHasher_t; //faster than xorshift
+
+	public:
+		mphf() : _built(false)
+		{}
+
+
+		~mphf()
+		{
+
+		}
+
+		
+		// allow perc_elem_loaded  elements to be loaded in ram for faster construction (default 3%), set to 0 to desactivate
+		template <typename Range>
+		mphf( size_t n, Range const& input_range,int num_thread = 1,  double gamma = 2.0 , bool progress =true, float perc_elem_loaded = 0.03) :
+		_gamma(gamma), _hash_domain(size_t(ceil(double(n) * gamma))), _nelem(n), _num_thread(num_thread), _percent_elem_loaded_for_fastMode (perc_elem_loaded), _withprogress(progress)
+		{
+			if(n ==0) return;
+			
+			_fastmode = false;
+			
+			if(_percent_elem_loaded_for_fastMode > 0.0 )
+				_fastmode =true;
+
+			setup();
+
+			if(_withprogress)
+			{
+			_progressBar.timer_mode=1;
+
+			if(_fastmode)
+				_progressBar.init( _nelem * (_fastModeLevel+1) +  ( _nelem * pow(_proba_collision,_fastModeLevel)) * (_nb_levels-(_fastModeLevel+1))    ,"Building BooPHF",num_thread);
+			else
+				_progressBar.init( _nelem * _nb_levels ,"Building BooPHF",num_thread);
+			}
+
+			uint64_t offset = 0;
+			for(int ii = 0; ii< _nb_levels; ii++)
+			{
+				_tempBitset =  new bitVector(_levels[ii].hash_domain); // temp collision bitarray for this level
+
+				processLevel(input_range,ii);
+
+				_levels[ii].bitset.clearCollisions(0 , _levels[ii].hash_domain , _tempBitset);
+
+				offset = _levels[ii].bitset.build_ranks(offset);
+
+				delete _tempBitset;
+			}
+
+			if(_withprogress)
+			_progressBar.finish_threaded();
+
+
+			_lastbitsetrank = offset ;
+
+			//printf("used temp ram for construction : %lli MB \n",setLevelFastmode.capacity()* sizeof(elem_t) /1024ULL/1024ULL);
+
+			std::vector<elem_t>().swap(setLevelFastmode);   // clear setLevelFastmode reallocating
+
+
+			pthread_mutex_destroy(&_mutex);
+			
+			_built = true;
+		}
+
+
+		uint64_t lookup(elem_t elem)
+		{
+			if(! _built) return ULLONG_MAX;
+			
+			//auto hashes = _hasher(elem);
+			uint64_t non_minimal_hp,minimal_hp;
+
+
+			hash_pair_t bbhash;  int level;
+			uint64_t level_hash = getLevel(bbhash,elem,&level);
+
+			if( level == (_nb_levels-1))
+			{
+				auto in_final_map  = _final_hash.find (elem);
+				if ( in_final_map == _final_hash.end() )
+				{
+					//elem was not in orignal set of keys
+					return ULLONG_MAX; //  means elem not in set
+				}
+				else
+				{
+					minimal_hp =  in_final_map->second + _lastbitsetrank;
+					return minimal_hp;
+				}
+//				minimal_hp = _final_hash[elem] + _lastbitsetrank;
+//				return minimal_hp;
+			}
+			else
+			{
+				non_minimal_hp =  level_hash %  _levels[level].hash_domain; // in fact non minimal hp would be  + _levels[level]->idx_begin
+			}
+
+			minimal_hp = _levels[level].bitset.rank(non_minimal_hp );
+
+			return minimal_hp;
+		}
+
+		uint64_t nbKeys() const
+		{
+            return _nelem;
+        }
+
+		uint64_t totalBitSize()
+		{
+
+			uint64_t totalsizeBitset = 0;
+			for(int ii=0; ii<_nb_levels; ii++)
+			{
+				totalsizeBitset += _levels[ii].bitset.bitSize();
+			}
+
+			uint64_t totalsize =  totalsizeBitset +  _final_hash.size()*42*8 ;  // unordered map takes approx 42B per elem [personal test] (42B with uint64_t key, would be larger for other type of elem)
+
+			printf("Bitarray    %12llu  bits (%.2f %%)   (array + ranks )\n",
+				   totalsizeBitset, 100*(float)totalsizeBitset/totalsize);
+			printf("final hash  %12lu  bits (%.2f %%) (nb in final hash %lu)\n",
+				   _final_hash.size()*42*8, 100*(float)(_final_hash.size()*42*8)/totalsize,
+				   _final_hash.size() );
+			return totalsize;
+		}
+
+		template <typename Iterator>  //typename Range,
+        void pthread_processLevel( std::vector<elem_t>  & buffer , std::shared_ptr<Iterator> shared_it, std::shared_ptr<Iterator> until_p, int i)
+		{
+			uint64_t nb_done =0;
+			int tid =  __sync_fetch_and_add (&_nb_living, 1);
+			auto until = *until_p;
+			uint64_t inbuff =0;
+
+			
+			for (bool isRunning=true;  isRunning ; )
+			{
+
+				//safely copy n items into buffer
+				pthread_mutex_lock(&_mutex);
+                for(; inbuff<NBBUFF && (*shared_it)!=until;  ++(*shared_it))
+				{
+                    buffer[inbuff]= *(*shared_it); inbuff++;
+				}
+                if((*shared_it)==until) isRunning =false;
+				pthread_mutex_unlock(&_mutex);
+
+
+				//do work on the n elems of the buffer
+                for(uint64_t ii=0; ii<inbuff ; ii++)
+				{
+					elem_t val = buffer[ii];
+
+					//auto hashes = _hasher(val);
+					hash_pair_t bbhash;  int level;
+					uint64_t level_hash = getLevel(bbhash,val,&level, i);
+
+					if(level == i) //insert into lvl i
+					{
+						//	__sync_fetch_and_add(& _cptLevel,1);
+
+						if(_fastmode && i == _fastModeLevel)
+						{
+
+							uint64_t idxl2 = __sync_fetch_and_add(& _idxLevelsetLevelFastmode,1);
+							//si depasse taille attendue pour setLevelFastmode, fall back sur slow mode mais devrait pas arriver si hash ok et proba avec nous
+							if(idxl2>= setLevelFastmode.size())
+								_fastmode = false;
+							else
+								setLevelFastmode[idxl2] = val; // create set for fast mode
+						}
+
+						//insert to level i+1 : either next level of the cascade or final hash if last level reached
+						if(i == _nb_levels-1) //stop cascade here, insert into exact hash
+						{
+
+							uint64_t hashidx =  __sync_fetch_and_add (& _hashidx, 1);
+
+							pthread_mutex_lock(&_mutex); //see later if possible to avoid this, mais pas bcp item vont la
+							// calc rank de fin  precedent level qq part, puis init hashidx avec ce rank, direct minimal, pas besoin inser ds bitset et rank
+							_final_hash[val] = hashidx;
+							pthread_mutex_unlock(&_mutex);
+						}
+						else
+						{
+
+							//computes next hash
+
+							if ( level == 0)
+								level_hash = _hasher.h0(bbhash,val);
+							else if ( level == 1)
+								level_hash = _hasher.h1(bbhash,val);
+							else
+							{
+								level_hash = _hasher.next(bbhash);
+							}
+							insertIntoLevel(level_hash,i); //should be safe
+						}
+					}
+
+					nb_done++;
+					if((nb_done&1023) ==0  && _withprogress) {_progressBar.inc(nb_done,tid);nb_done=0; }
+
+				}
+
+				inbuff = 0;
+			}
+
+		}
+
+
+		void save(std::ostream& os) const
+		{
+
+			os.write(reinterpret_cast<char const*>(&_gamma), sizeof(_gamma));
+			os.write(reinterpret_cast<char const*>(&_nb_levels), sizeof(_nb_levels));
+			os.write(reinterpret_cast<char const*>(&_lastbitsetrank), sizeof(_lastbitsetrank));
+			os.write(reinterpret_cast<char const*>(&_nelem), sizeof(_nelem));
+			 for(int ii=0; ii<_nb_levels; ii++)
+			 {
+			  	_levels[ii].bitset.save(os);
+			 }
+
+			//save final hash
+			size_t final_hash_size = _final_hash.size();
+
+			os.write(reinterpret_cast<char const*>(&final_hash_size), sizeof(size_t));
+
+
+			// typename std::unordered_map<elem_t,uint64_t,Hasher_t>::iterator
+			for (auto it = _final_hash.begin(); it != _final_hash.end(); ++it )
+			{
+				os.write(reinterpret_cast<char const*>(&(it->first)), sizeof(elem_t));
+				os.write(reinterpret_cast<char const*>(&(it->second)), sizeof(uint64_t));
+			}
+
+		}
+
+		void load(std::istream& is)
+		{
+
+			is.read(reinterpret_cast<char*>(&_gamma), sizeof(_gamma));
+			is.read(reinterpret_cast<char*>(&_nb_levels), sizeof(_nb_levels));
+			is.read(reinterpret_cast<char*>(&_lastbitsetrank), sizeof(_lastbitsetrank));
+			is.read(reinterpret_cast<char*>(&_nelem), sizeof(_nelem));
+			
+			_levels.resize(_nb_levels);
+			
+
+			for(int ii=0; ii<_nb_levels; ii++)
+			{
+				//_levels[ii].bitset = new bitVector();
+				_levels[ii].bitset.load(is);
+			}
+
+
+
+			//mini setup, recompute size of each level
+			_proba_collision = 1.0 -  pow(((_gamma*(double)_nelem -1 ) / (_gamma*(double)_nelem)),_nelem-1);
+			uint64_t previous_idx =0;
+			_hash_domain = (size_t)  (ceil(double(_nelem) * _gamma)) ;
+			for(int ii=0; ii<_nb_levels; ii++)
+			{
+				//_levels[ii] = new level();
+				_levels[ii].idx_begin = previous_idx;
+				_levels[ii].hash_domain =  (( (uint64_t) (_hash_domain * pow(_proba_collision,ii)) + 63) / 64 ) * 64;
+				if(_levels[ii].hash_domain == 0 )
+					_levels[ii].hash_domain  = 64 ;
+				previous_idx += _levels[ii].hash_domain;
+			}
+
+			//restore final hash
+
+			_final_hash.clear();
+			size_t final_hash_size ;
+
+			is.read(reinterpret_cast<char *>(&final_hash_size), sizeof(size_t));
+
+			for(unsigned int ii=0; ii<final_hash_size; ii++)
+			{
+				elem_t key;
+				uint64_t value;
+
+				is.read(reinterpret_cast<char *>(&key), sizeof(elem_t));
+				is.read(reinterpret_cast<char *>(&value), sizeof(uint64_t));
+
+				_final_hash[key] = value;
+			}
+			_built = true;
+		}
+
+
+		private :
+
+		void setup()
+		{
+			pthread_mutex_init(&_mutex, NULL);
+
+
+			if(_fastmode)
+				setLevelFastmode.resize(_percent_elem_loaded_for_fastMode * (double)_nelem );
+
+			_proba_collision = 1.0 -  pow(((_gamma*(double)_nelem -1 ) / (_gamma*(double)_nelem)),_nelem-1);
+
+			// double sum_geom =_gamma * ( 1.0 +  _proba_collision / (1.0 - _proba_collision));
+			// printf("proba collision %f  sum_geom  %f   \n",_proba_collision,sum_geom);
+
+			_nb_levels = 25;
+			_levels.resize(_nb_levels);
+
+			//build levels
+			uint64_t previous_idx =0;
+			for(int ii=0; ii<_nb_levels; ii++)
+			{
+
+				_levels[ii].idx_begin = previous_idx;
+
+				// round size to nearest superior multiple of 64, makes it easier to clear a level
+				_levels[ii].hash_domain =  (( (uint64_t) (_hash_domain * pow(_proba_collision,ii)) + 63) / 64 ) * 64;
+				if(_levels[ii].hash_domain == 0 ) _levels[ii].hash_domain  = 64 ;
+				previous_idx += _levels[ii].hash_domain;
+
+				//printf("build level %i bit array : start %12llu, size %12llu  ",ii,_levels[ii]->idx_begin,_levels[ii]->hash_domain );
+				//printf(" expected elems : %.2f %% total \n",100.0*pow(_proba_collision,ii));
+
+			}
+			
+			for(int ii=0; ii<_nb_levels; ii++)
+			{
+				 if(pow(_proba_collision,ii) < _percent_elem_loaded_for_fastMode)
+				 {
+				 	_fastModeLevel = ii;
+				 	 //printf("fast mode level :  %i \n",ii);
+				 	break;
+				 }
+			}
+		}
+
+
+		//compute level and returns hash of last level reached
+		uint64_t getLevel(hash_pair_t & bbhash, elem_t val,int * res_level, int maxlevel = 100)
+		{
+			int level = 0;
+			uint64_t hash_raw=0;
+
+			for (int ii=0; ii<(_nb_levels-1) &&  ii < maxlevel ; ii++ )
+			{
+
+				//calc le hash suivant
+				 if ( ii == 0)
+					hash_raw = _hasher.h0(bbhash,val);
+				else 
+                {
+                    if ( ii == 1)
+					hash_raw = _hasher.h1(bbhash,val);
+    				else
+    				{
+    					hash_raw = _hasher.next(bbhash);
+	    			}
+                }
+
+
+				if( _levels[ii].get(hash_raw) )
+				{
+					break;
+				}
+
+				level++;
+			}
+
+			*res_level = level;
+			return hash_raw;
+		}
+
+
+		//insert into bitarray
+		void insertIntoLevel(uint64_t level_hash, int i)
+		{
+			uint64_t hashl =  level_hash % _levels[i].hash_domain;
+
+			if( _levels[i].bitset.atomic_test_and_set(hashl) )
+			{
+				_tempBitset->atomic_test_and_set(hashl);
+			}
+
+		}
+
+
+		//loop to insert into level i
+		template <typename Range>
+		void processLevel(Range const& input_range,int i)
+		{
+			////alloc the bitset for this level
+			_levels[i].bitset =  bitVector(_levels[i].hash_domain); ;
+
+			_cptLevel = 0;
+			_hashidx = 0;
+			_idxLevelsetLevelFastmode =0;
+			_nb_living =0;
+			//create  threads
+			pthread_t *tab_threads= new pthread_t [_num_thread];
+			typedef decltype(input_range.begin()) it_type;
+			thread_args<Range, it_type> t_arg; // meme arg pour tous
+			t_arg.boophf = this;
+			t_arg.range = &input_range;
+			t_arg.it_p =  std::static_pointer_cast<void>(std::make_shared<it_type>(input_range.begin()));
+			t_arg.until_p =  std::static_pointer_cast<void>(std::make_shared<it_type>(input_range.end()));
+
+			t_arg.level = i;
+			if(_fastmode && i >= (_fastModeLevel+1))
+			{
+				auto data_iterator = boomphf::range(static_cast<const elem_t*>( &setLevelFastmode[0]), static_cast<const elem_t*>( (&setLevelFastmode[0]) +setLevelFastmode.size()));
+                typedef decltype(data_iterator.begin()) fastmode_it_type;
+				t_arg.it_p =  std::static_pointer_cast<void>(std::make_shared<fastmode_it_type>(data_iterator.begin()));
+				t_arg.until_p =  std::static_pointer_cast<void>(std::make_shared<fastmode_it_type>(data_iterator.end()));
+
+                /* we'd like to do t_arg.it = data_iterator.begin() but types are different;
+                    so, casting to (void*) because of that; and we remember the type in the template */
+
+                for(int ii=0;ii<_num_thread;ii++)
+                    pthread_create (&tab_threads[ii], NULL,  thread_processLevel<elem_t, Hasher_t, Range, fastmode_it_type>, &t_arg); //&t_arg[ii]
+			}
+			else
+			{
+			    for(int ii=0;ii<_num_thread;ii++)
+                    pthread_create (&tab_threads[ii], NULL,  thread_processLevel<elem_t, Hasher_t, Range, decltype(input_range.begin())>, &t_arg); //&t_arg[ii]
+			}
+			//joining
+			for(int ii=0;ii<_num_thread;ii++)
+			{
+				pthread_join(tab_threads[ii], NULL);
+			}
+			//printf("\ngoing to level %i  : %llu elems  %.2f %%  expected : %.2f %% \n",i,_cptLevel,100.0* _cptLevel/(float)_nelem,100.0* pow(_proba_collision,i) );
+
+			if(_fastmode && i == _fastModeLevel) //shrink to actual number of elements in set
+			{
+				//printf("resize setLevelFastmode to %lli \n",_idxLevelsetLevelFastmode);
+				setLevelFastmode.resize(_idxLevelsetLevelFastmode);
+			}
+			delete [] tab_threads;
+		}
+
+	private:
+		//level ** _levels;
+		std::vector<level> _levels;
+		int _nb_levels;
+        MultiHasher_t _hasher;
+		bitVector * _tempBitset;
+
+		double _gamma;
+		uint64_t _hash_domain;
+		uint64_t _nelem;
+        std::unordered_map<elem_t,uint64_t,Hasher_t> _final_hash;
+		Progress _progressBar;
+		int _nb_living;
+		int _num_thread;
+		uint64_t _hashidx;
+		double _proba_collision;
+		uint64_t _lastbitsetrank;
+		uint64_t _idxLevelsetLevelFastmode;
+		uint64_t _cptLevel;
+
+		// fast build mode , requires  that _percent_elem_loaded_for_fastMode %   elems are loaded in ram
+		float _percent_elem_loaded_for_fastMode ;
+		bool _fastmode;
+		std::vector< elem_t > setLevelFastmode;
+		int _fastModeLevel;
+		bool _withprogress;
+		bool _built;
+	public:
+		pthread_mutex_t _mutex;
+	};
+
+////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark threading
+////////////////////////////////////////////////////////////////
+
+
+    template <typename elem_t, typename Hasher_t, typename Range, typename it_type>
+	void * thread_processLevel(void * args)
+	{
+		if(args ==NULL) return NULL;
+
+		thread_args<Range,it_type> *targ = (thread_args<Range,it_type>*) args;
+
+		mphf<elem_t, Hasher_t>  * obw = (mphf<elem_t, Hasher_t > *) targ->boophf;
+		int level = targ->level;
+		std::vector<elem_t> buffer;
+		buffer.resize(NBBUFF);
+		
+		pthread_mutex_t * mutex =  & obw->_mutex;
+
+		pthread_mutex_lock(mutex); // from comment above: "//get starting iterator for this thread, must be protected (must not be currently used by other thread to copy elems in buff)"
+        std::shared_ptr<it_type> startit = std::static_pointer_cast<it_type>(targ->it_p);
+        std::shared_ptr<it_type> until_p = std::static_pointer_cast<it_type>(targ->until_p);
+		pthread_mutex_unlock(mutex);
+
+		obw->pthread_processLevel(buffer, startit, until_p, level);
+
+		return NULL;
+	}
+}
diff --git a/gatb-core/thirdparty/CMakeLists.txt b/gatb-core/thirdparty/CMakeLists.txt
new file mode 100644
index 0000000..6e0b5c4
--- /dev/null
+++ b/gatb-core/thirdparty/CMakeLists.txt
@@ -0,0 +1,69 @@
+################################################################################
+#  HDF5 GENERATION 
+################################################################################
+
+#SET (HDF5_ENABLE_THREADSAFE       ON)
+#SET (H5_HAVE_THREADSAFE 1)
+
+##########  MOMENTARY DEACTIVATED => CRASH ON MACOS TO BE INVESTIGATED  ##########
+SET (HDF5_BUILD_TOOLS             ON CACHE BOOL "Build HDF5 Tools")
+#SET (CMAKE_EXE_LINKER_FLAGS       "-lpthread -lz")
+
+SET (HDF5_EXTERNALLY_CONFIGURED     ON)
+
+#SET (HDF5_INSTALL_BIN_DIR           ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
+#SET (HDF5_INSTALL_LIB_DIR           ${PROJECT_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})
+SET (HDF5_INSTALL_BIN_DIR           bin)
+SET (HDF5_INSTALL_LIB_DIR           lib)
+
+SET (HDF5_INSTALL_INCLUDE_DIR       ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/hdf5)
+SET (HDF5_INSTALL_DATA_DIR          ${PROJECT_BINARY_DIR}/share/${CMAKE_BUILD_TYPE})
+SET (HDF5_INSTALL_CMAKE_DIR         ${PROJECT_BINARY_DIR}/share/${CMAKE_BUILD_TYPE})
+
+IF (NOT DEFINED GATB_CORE_INSTALL_EXCLUDE)
+    SET (HDF5_EXPORTED_TARGETS          "gatb-hdf5")
+ENDIF()
+
+IF (NOT DEFINED GATB_CORE_EXCLUDE_HDF5_ZLIB)
+	OPTION (HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" ON)
+ENDIF()
+
+# We don't want warnings from HDF5 compilation
+set (COMPILE_DEFINITIONS  "${COMPILE_DEFINITIONS}  -w")
+add_definitions (${COMPILE_DEFINITIONS})
+
+# add HDF5 generation
+ADD_SUBDIRECTORY (hdf5)
+
+# We add a custom target for copying header files.
+add_custom_target (hdf5_postbuild ALL)
+
+# We build the output directory
+add_custom_command (TARGET hdf5_postbuild POST_BUILD  COMMAND ${CMAKE_COMMAND} -E make_directory ${HDF5_INSTALL_INCLUDE_DIR})
+
+# We define all the header files to be copied
+file (GLOB headerfiles ${PROJECT_SOURCE_DIR}/thirdparty/hdf5/src/*.h ${PROJECT_BINARY_DIR}/thirdparty/hdf5/H5pubconf.h)
+
+# We copy each header file
+foreach (header ${headerfiles})
+  add_custom_command (TARGET hdf5_postbuild POST_BUILD  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${header} ${HDF5_INSTALL_INCLUDE_DIR}  )
+endforeach()
+
+# include other smaller libraries (json, Boophf)
+
+add_custom_target (thirdparty_copy ALL)
+add_custom_command (TARGET thirdparty_copy COMMAND ${CMAKE_COMMAND} -E
+    make_directory ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/json)
+add_custom_command (TARGET thirdparty_copy COMMAND ${CMAKE_COMMAND} -E
+    make_directory ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/BooPHF)
+add_custom_command (TARGET thirdparty_copy  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/thirdparty/BooPHF/BooPHF.h ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/BooPHF/)
+add_custom_command (TARGET thirdparty_copy  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/thirdparty/json/json.hpp   ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/json/)
+
+################################################################################
+#  INSTALL 
+################################################################################
+IF (NOT DEFINED GATB_CORE_INSTALL_EXCLUDE)
+    INSTALL (DIRECTORY ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/hdf5 DESTINATION include)
+    INSTALL (DIRECTORY ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/json DESTINATION include)
+    INSTALL (DIRECTORY ${PROJECT_BINARY_DIR}/include/${CMAKE_BUILD_TYPE}/BooPHF DESTINATION include)
+ENDIF ()
diff --git a/gatb-core/thirdparty/boost/aligned_storage.hpp b/gatb-core/thirdparty/boost/aligned_storage.hpp
new file mode 100644
index 0000000..b5455f0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/aligned_storage.hpp
@@ -0,0 +1,143 @@
+//-----------------------------------------------------------------------------
+// boost aligned_storage.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_ALIGNED_STORAGE_HPP
+#define BOOST_ALIGNED_STORAGE_HPP
+
+#include <cstddef> // for std::size_t
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/type_traits/alignment_of.hpp"
+#include "boost/type_traits/type_with_alignment.hpp"
+#include "boost/type_traits/is_pod.hpp"
+
+#include "boost/mpl/eval_if.hpp"
+#include "boost/mpl/identity.hpp"
+
+#include "boost/type_traits/detail/bool_trait_def.hpp"
+
+namespace boost {
+
+namespace detail { namespace aligned_storage {
+
+BOOST_STATIC_CONSTANT(
+      std::size_t
+    , alignment_of_max_align = ::boost::alignment_of<max_align>::value
+    );
+
+//
+// To be TR1 conforming this must be a POD type:
+//
+template <
+      std::size_t size_
+    , std::size_t alignment_
+>
+struct aligned_storage_imp
+{
+    union data_t
+    {
+        char buf[size_];
+
+        typename ::boost::mpl::eval_if_c<
+              alignment_ == std::size_t(-1)
+            , ::boost::mpl::identity< ::boost::detail::max_align >
+            , ::boost::type_with_alignment<alignment_>
+            >::type align_;
+    } data_;
+    void* address() const { return const_cast<aligned_storage_imp*>(this); }
+};
+
+template< std::size_t alignment_ >
+struct aligned_storage_imp<0u,alignment_>
+{
+    /* intentionally empty */
+    void* address() const { return 0; }
+};
+
+}} // namespace detail::aligned_storage
+
+template <
+      std::size_t size_
+    , std::size_t alignment_ = std::size_t(-1)
+>
+class aligned_storage : 
+#ifndef __BORLANDC__
+   private 
+#else
+   public
+#endif
+   ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> 
+{
+ 
+public: // constants
+
+    typedef ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> type;
+
+    BOOST_STATIC_CONSTANT(
+          std::size_t
+        , size = size_
+        );
+    BOOST_STATIC_CONSTANT(
+          std::size_t
+        , alignment = (
+              alignment_ == std::size_t(-1)
+            ? ::boost::detail::aligned_storage::alignment_of_max_align
+            : alignment_
+            )
+        );
+
+private: // noncopyable
+
+    aligned_storage(const aligned_storage&);
+    aligned_storage& operator=(const aligned_storage&);
+
+public: // structors
+
+    aligned_storage()
+    {
+    }
+
+    ~aligned_storage()
+    {
+    }
+
+public: // accessors
+
+    void* address()
+    {
+        return static_cast<type*>(this)->address();
+    }
+
+    const void* address() const
+    {
+        return static_cast<const type*>(this)->address();
+    }
+};
+
+//
+// Make sure that is_pod recognises aligned_storage<>::type
+// as a POD (Note that aligned_storage<> itself is not a POD):
+//
+template <std::size_t size_, std::size_t alignment_>
+struct is_pod< ::boost::detail::aligned_storage::aligned_storage_imp<size_,alignment_> >
+   BOOST_TT_AUX_BOOL_C_BASE(true)
+{ 
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(true)
+}; 
+
+
+} // namespace boost
+
+#include "boost/type_traits/detail/bool_trait_undef.hpp"
+
+#endif // BOOST_ALIGNED_STORAGE_HPP
diff --git a/gatb-core/thirdparty/boost/assert.hpp b/gatb-core/thirdparty/boost/assert.hpp
new file mode 100644
index 0000000..1713d9b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/assert.hpp
@@ -0,0 +1,78 @@
+//
+//  boost/assert.hpp - BOOST_ASSERT(expr)
+//                     BOOST_ASSERT_MSG(expr, msg)
+//                     BOOST_VERIFY(expr)
+//                     BOOST_VERIFY_MSG(expr, msg)
+//
+//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
+//  Copyright (c) 2007, 2014 Peter Dimov
+//  Copyright (c) Beman Dawes 2011
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  Note: There are no include guards. This is intentional.
+//
+//  See http://www.boost.org/libs/assert/assert.html for documentation.
+//
+
+//
+// Stop inspect complaining about use of 'assert':
+//
+// boostinspect:naassert_macro
+//
+
+//
+// BOOST_ASSERT, BOOST_ASSERT_MSG
+//
+
+#undef BOOST_ASSERT
+#undef BOOST_ASSERT_MSG
+
+#if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) )
+
+# define BOOST_ASSERT(expr) ((void)0)
+# define BOOST_ASSERT_MSG(expr, msg) ((void)0)
+
+#elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) )
+
+#include <boost/config.hpp> // for BOOST_LIKELY
+#include <boost/current_function.hpp>
+
+namespace boost
+{
+    void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined
+    void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line); // user defined
+} // namespace boost
+
+#define BOOST_ASSERT(expr) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))
+#define BOOST_ASSERT_MSG(expr, msg) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed_msg(#expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))
+
+#else
+
+# include <assert.h> // .h to support old libraries w/o <cassert> - effect is the same
+
+# define BOOST_ASSERT(expr) assert(expr)
+# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
+
+#endif
+
+//
+// BOOST_VERIFY, BOOST_VERIFY_MSG
+//
+
+#undef BOOST_VERIFY
+#undef BOOST_VERIFY_MSG
+
+#if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) )
+
+# define BOOST_VERIFY(expr) ((void)(expr))
+# define BOOST_VERIFY_MSG(expr, msg) ((void)(expr))
+
+#else
+
+# define BOOST_VERIFY(expr) BOOST_ASSERT(expr)
+# define BOOST_VERIFY_MSG(expr, msg) BOOST_ASSERT_MSG(expr,msg)
+
+#endif
diff --git a/gatb-core/thirdparty/boost/blank.hpp b/gatb-core/thirdparty/boost/blank.hpp
new file mode 100644
index 0000000..d0fe5ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/blank.hpp
@@ -0,0 +1,106 @@
+//-----------------------------------------------------------------------------
+// boost blank.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_BLANK_HPP
+#define BOOST_BLANK_HPP
+
+#include "boost/blank_fwd.hpp"
+
+#if !defined(BOOST_NO_IOSTREAM)
+#include <iosfwd> // for std::basic_ostream forward declare
+#include "boost/detail/templated_streams.hpp"
+#endif // BOOST_NO_IOSTREAM
+
+#include "boost/mpl/bool.hpp"
+#include "boost/type_traits/is_empty.hpp"
+#include "boost/type_traits/is_pod.hpp"
+#include "boost/type_traits/is_stateless.hpp"
+
+namespace boost {
+
+struct blank
+{
+};
+
+// type traits specializations
+//
+
+template <>
+struct is_pod< blank >
+    : mpl::true_
+{
+};
+
+template <>
+struct is_empty< blank >
+    : mpl::true_
+{
+};
+
+template <>
+struct is_stateless< blank >
+    : mpl::true_
+{
+};
+
+// relational operators
+//
+
+inline bool operator==(const blank&, const blank&)
+{
+    return true;
+}
+
+inline bool operator<=(const blank&, const blank&)
+{
+    return true;
+}
+
+inline bool operator>=(const blank&, const blank&)
+{
+    return true;
+}
+
+inline bool operator!=(const blank&, const blank&)
+{
+    return false;
+}
+
+inline bool operator<(const blank&, const blank&)
+{
+    return false;
+}
+
+inline bool operator>(const blank&, const blank&)
+{
+    return false;
+}
+
+// streaming support
+//
+#if !defined(BOOST_NO_IOSTREAM)
+
+BOOST_TEMPLATED_STREAM_TEMPLATE(E,T)
+inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
+      BOOST_TEMPLATED_STREAM(ostream, E,T)& out
+    , const blank&
+    )
+{
+    // (output nothing)
+    return out;
+}
+
+#endif // BOOST_NO_IOSTREAM
+
+} // namespace boost
+
+#endif // BOOST_BLANK_HPP
diff --git a/gatb-core/thirdparty/boost/blank_fwd.hpp b/gatb-core/thirdparty/boost/blank_fwd.hpp
new file mode 100644
index 0000000..8bfe97c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/blank_fwd.hpp
@@ -0,0 +1,22 @@
+//-----------------------------------------------------------------------------
+// boost blank_fwd.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_BLANK_FWD_HPP
+#define BOOST_BLANK_FWD_HPP
+
+namespace boost {
+
+struct blank;
+
+} // namespace boost
+
+#endif // BOOST_BLANK_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/call_traits.hpp b/gatb-core/thirdparty/boost/call_traits.hpp
new file mode 100644
index 0000000..2c1328e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/call_traits.hpp
@@ -0,0 +1,20 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/utility for most recent version including documentation.
+
+//  See boost/detail/call_traits.hpp
+//  for full copyright notices.
+
+#ifndef BOOST_CALL_TRAITS_HPP
+#define BOOST_CALL_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
+
+#include <boost/detail/call_traits.hpp>
+
+#endif // BOOST_CALL_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/checked_delete.hpp b/gatb-core/thirdparty/boost/checked_delete.hpp
new file mode 100644
index 0000000..fb71c78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/checked_delete.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_CHECKED_DELETE_HPP
+#define BOOST_CHECKED_DELETE_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/checked_delete.hpp instead.
+
+#include <boost/core/checked_delete.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config.hpp b/gatb-core/thirdparty/boost/config.hpp
new file mode 100644
index 0000000..d49bb27
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config.hpp
@@ -0,0 +1,67 @@
+//  Boost config.hpp configuration header file  ------------------------------//
+
+//  (C) Copyright John Maddock 2002.
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/config for most recent version.
+
+//  Boost config.hpp policy and rationale documentation has been moved to
+//  http://www.boost.org/libs/config
+//
+//  CAUTION: This file is intended to be completely stable -
+//           DO NOT MODIFY THIS FILE!
+//
+
+#ifndef BOOST_CONFIG_HPP
+#define BOOST_CONFIG_HPP
+
+// if we don't have a user config, then use the default location:
+#if !defined(BOOST_USER_CONFIG) && !defined(BOOST_NO_USER_CONFIG)
+#  define BOOST_USER_CONFIG <boost/config/user.hpp>
+#if 0
+// For dependency trackers:
+#  include <boost/config/user.hpp>
+#endif
+#endif
+// include it first:
+#ifdef BOOST_USER_CONFIG
+#  include BOOST_USER_CONFIG
+#endif
+
+// if we don't have a compiler config set, try and find one:
+#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG)
+#  include <boost/config/select_compiler_config.hpp>
+#endif
+// if we have a compiler config, include it now:
+#ifdef BOOST_COMPILER_CONFIG
+#  include BOOST_COMPILER_CONFIG
+#endif
+
+// if we don't have a std library config set, try and find one:
+#if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) && defined(__cplusplus)
+#  include <boost/config/select_stdlib_config.hpp>
+#endif
+// if we have a std library config, include it now:
+#ifdef BOOST_STDLIB_CONFIG
+#  include BOOST_STDLIB_CONFIG
+#endif
+
+// if we don't have a platform config set, try and find one:
+#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG)
+#  include <boost/config/select_platform_config.hpp>
+#endif
+// if we have a platform config, include it now:
+#ifdef BOOST_PLATFORM_CONFIG
+#  include BOOST_PLATFORM_CONFIG
+#endif
+
+// get config suffix code:
+#include <boost/config/suffix.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#endif  // BOOST_CONFIG_HPP
diff --git a/gatb-core/thirdparty/boost/config/abi/borland_prefix.hpp b/gatb-core/thirdparty/boost/config/abi/borland_prefix.hpp
new file mode 100644
index 0000000..3a0e5ae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi/borland_prefix.hpp
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  for C++ Builder the following options effect the ABI:
+//
+//  -b (on or off - effect emum sizes)
+//  -Vx  (on or off - empty members)
+//  -Ve (on or off - empty base classes)
+//  -aX (alignment - 5 options).
+//  -pX (Calling convention - 4 options)
+//  -VmX (member pointer size and layout - 5 options)
+//  -VC (on or off, changes name mangling)
+//  -Vl (on or off, changes struct layout).
+
+//  In addition the following warnings are sufficiently annoying (and
+//  unfixable) to have them turned off by default:
+//
+//  8027 - functions containing [for|while] loops are not expanded inline
+//  8026 - functions taking class by value arguments are not expanded inline
+
+#pragma nopushoptwarn
+#  pragma option push -a8 -Vx- -Ve- -b- -pc -Vmv -VC- -Vl- -w-8027 -w-8026
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/abi/borland_suffix.hpp b/gatb-core/thirdparty/boost/config/abi/borland_suffix.hpp
new file mode 100644
index 0000000..940535f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi/borland_suffix.hpp
@@ -0,0 +1,12 @@
+//  (C) Copyright John Maddock 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#  pragma option pop
+#pragma nopushoptwarn
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/abi/msvc_prefix.hpp b/gatb-core/thirdparty/boost/config/abi/msvc_prefix.hpp
new file mode 100644
index 0000000..97f06cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi/msvc_prefix.hpp
@@ -0,0 +1,22 @@
+//  (C) Copyright John Maddock 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Boost binaries are built with the compiler's default ABI settings,
+// if the user changes their default alignment in the VS IDE then their
+// code will no longer be binary compatible with the bjam built binaries
+// unless this header is included to force Boost code into a consistent ABI.
+//
+// Note that inclusion of this header is only necessary for libraries with 
+// separate source, header only libraries DO NOT need this as long as all
+// translation units are built with the same options.
+//
+#if defined(_M_X64)
+#  pragma pack(push,16)
+#else
+#  pragma pack(push,8)
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/abi/msvc_suffix.hpp b/gatb-core/thirdparty/boost/config/abi/msvc_suffix.hpp
new file mode 100644
index 0000000..a64d783
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi/msvc_suffix.hpp
@@ -0,0 +1,8 @@
+//  (C) Copyright John Maddock 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#pragma pack(pop)
+
+
diff --git a/gatb-core/thirdparty/boost/config/abi_prefix.hpp b/gatb-core/thirdparty/boost/config/abi_prefix.hpp
new file mode 100644
index 0000000..3b13474
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi_prefix.hpp
@@ -0,0 +1,25 @@
+//  abi_prefix header  -------------------------------------------------------//
+
+// (c) Copyright John Maddock 2003
+   
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_CONFIG_ABI_PREFIX_HPP
+# define BOOST_CONFIG_ABI_PREFIX_HPP
+#else
+# error double inclusion of header boost/config/abi_prefix.hpp is an error
+#endif
+
+#include <boost/config.hpp>
+
+// this must occur after all other includes and before any code appears:
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/abi_suffix.hpp b/gatb-core/thirdparty/boost/config/abi_suffix.hpp
new file mode 100644
index 0000000..9391616
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/abi_suffix.hpp
@@ -0,0 +1,27 @@
+//  abi_sufffix header  -------------------------------------------------------//
+
+// (c) Copyright John Maddock 2003
+   
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+// This header should be #included AFTER code that was preceded by a #include
+// <boost/config/abi_prefix.hpp>.
+
+#ifndef BOOST_CONFIG_ABI_PREFIX_HPP
+# error Header boost/config/abi_suffix.hpp must only be used after boost/config/abi_prefix.hpp
+#else
+# undef BOOST_CONFIG_ABI_PREFIX_HPP
+#endif
+
+// the suffix header occurs after all of our code:
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/auto_link.hpp b/gatb-core/thirdparty/boost/config/auto_link.hpp
new file mode 100644
index 0000000..56a16b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/auto_link.hpp
@@ -0,0 +1,439 @@
+//  (C) Copyright John Maddock 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         auto_link.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers.
+  */
+
+/*************************************************************************
+
+USAGE:
+~~~~~~
+
+Before including this header you must define one or more of define the following macros:
+
+BOOST_LIB_NAME:           Required: A string containing the basename of the library,
+                          for example boost_regex.
+BOOST_LIB_TOOLSET:        Optional: the base name of the toolset.
+BOOST_DYN_LINK:           Optional: when set link to dll rather than static library.
+BOOST_LIB_DIAGNOSTIC:     Optional: when set the header will print out the name
+                          of the library selected (useful for debugging).
+BOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib,
+                          rather than a mangled-name version.
+BOOST_AUTO_LINK_TAGGED:   Specifies that we link to libraries built with the --layout=tagged option.
+                          This is essentially the same as the default name-mangled version, but without
+                          the compiler name and version, or the Boost version.  Just the build options.
+
+These macros will be undef'ed at the end of the header, further this header
+has no include guards - so be sure to include it only once from your library!
+
+Algorithm:
+~~~~~~~~~~
+
+Libraries for Borland and Microsoft compilers are automatically
+selected here, the name of the lib is selected according to the following
+formula:
+
+BOOST_LIB_PREFIX
+   + BOOST_LIB_NAME
+   + "_"
+   + BOOST_LIB_TOOLSET
+   + BOOST_LIB_THREAD_OPT
+   + BOOST_LIB_RT_OPT
+   "-"
+   + BOOST_LIB_VERSION
+
+These are defined as:
+
+BOOST_LIB_PREFIX:     "lib" for static libraries otherwise "".
+
+BOOST_LIB_NAME:       The base name of the lib ( for example boost_regex).
+
+BOOST_LIB_TOOLSET:    The compiler toolset name (vc6, vc7, bcb5 etc).
+
+BOOST_LIB_THREAD_OPT: "-mt" for multithread builds, otherwise nothing.
+
+BOOST_LIB_RT_OPT:     A suffix that indicates the runtime library used,
+                      contains one or more of the following letters after
+                      a hyphen:
+
+                      s      static runtime (dynamic if not present).
+                      g      debug/diagnostic runtime (release if not present).
+                      y      Python debug/diagnostic runtime (release if not present).
+                      d      debug build (release if not present).
+                      p      STLport build.
+                      n      STLport build without its IOStreams.
+
+BOOST_LIB_VERSION:    The Boost version, in the form x_y, for Boost version x.y.
+
+
+***************************************************************************/
+
+#ifdef __cplusplus
+#  ifndef BOOST_CONFIG_HPP
+#     include <boost/config.hpp>
+#  endif
+#elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__)
+//
+// C language compatability (no, honestly)
+//
+#  define BOOST_MSVC _MSC_VER
+#  define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
+#  define BOOST_DO_STRINGIZE(X) #X
+#endif
+//
+// Only include what follows for known and supported compilers:
+//
+#if defined(BOOST_MSVC) \
+    || defined(__BORLANDC__) \
+    || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \
+    || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200))
+
+#ifndef BOOST_VERSION_HPP
+#  include <boost/version.hpp>
+#endif
+
+#ifndef BOOST_LIB_NAME
+#  error "Macro BOOST_LIB_NAME not set (internal error)"
+#endif
+
+//
+// error check:
+//
+#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)
+#  pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors")
+#  pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes")
+#  error "Incompatible build options"
+#endif
+//
+// select toolset if not defined already:
+//
+#ifndef BOOST_LIB_TOOLSET
+#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1200)
+    // Note: no compilers before 1200 are supported
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+
+#    ifdef UNDER_CE
+       // eVC4:
+#      define BOOST_LIB_TOOLSET "evc4"
+#    else
+       // vc6:
+#      define BOOST_LIB_TOOLSET "vc6"
+#    endif
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1310)
+
+     // vc7:
+#    define BOOST_LIB_TOOLSET "vc7"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1400)
+
+     // vc71:
+#    define BOOST_LIB_TOOLSET "vc71"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1500)
+
+     // vc80:
+#    define BOOST_LIB_TOOLSET "vc80"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1600)
+
+     // vc90:
+#    define BOOST_LIB_TOOLSET "vc90"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1700)
+
+     // vc10:
+#    define BOOST_LIB_TOOLSET "vc100"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1800)
+
+     // vc11:
+#    define BOOST_LIB_TOOLSET "vc110"
+
+#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1900)
+
+     // vc12:
+#    define BOOST_LIB_TOOLSET "vc120"
+
+# elif defined(BOOST_MSVC)
+
+   // vc14:
+#  define BOOST_LIB_TOOLSET "vc140"
+
+#  elif defined(__BORLANDC__)
+
+     // CBuilder 6:
+#    define BOOST_LIB_TOOLSET "bcb"
+
+#  elif defined(__ICL)
+
+     // Intel C++, no version number:
+#    define BOOST_LIB_TOOLSET "iw"
+
+#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF )
+
+     // Metrowerks CodeWarrior 8.x
+#    define BOOST_LIB_TOOLSET "cw8"
+
+#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF )
+
+     // Metrowerks CodeWarrior 9.x
+#    define BOOST_LIB_TOOLSET "cw9"
+
+#  endif
+#endif // BOOST_LIB_TOOLSET
+
+//
+// select thread opt:
+//
+#if defined(_MT) || defined(__MT__)
+#  define BOOST_LIB_THREAD_OPT "-mt"
+#else
+#  define BOOST_LIB_THREAD_OPT
+#endif
+
+#if defined(_MSC_VER) || defined(__MWERKS__)
+
+#  ifdef _DLL
+
+#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))
+
+#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-gydp"
+#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
+#            define BOOST_LIB_RT_OPT "-gdp"
+#        elif defined(_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-gydp"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        elif defined(_DEBUG)
+#            define BOOST_LIB_RT_OPT "-gdp"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        else
+#            define BOOST_LIB_RT_OPT "-p"
+#        endif
+
+#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+
+#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-gydpn"
+#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
+#            define BOOST_LIB_RT_OPT "-gdpn"
+#        elif defined(_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-gydpn"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        elif defined(_DEBUG)
+#            define BOOST_LIB_RT_OPT "-gdpn"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        else
+#            define BOOST_LIB_RT_OPT "-pn"
+#        endif
+
+#     else
+
+#        if defined(_DEBUG) && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-gyd"
+#        elif defined(_DEBUG)
+#            define BOOST_LIB_RT_OPT "-gd"
+#        else
+#            define BOOST_LIB_RT_OPT
+#        endif
+
+#     endif
+
+#  else
+
+#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))
+
+#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-sgydp"
+#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
+#            define BOOST_LIB_RT_OPT "-sgdp"
+#        elif defined(_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#             define BOOST_LIB_RT_OPT "-sgydp"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        elif defined(_DEBUG)
+#             define BOOST_LIB_RT_OPT "-sgdp"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        else
+#            define BOOST_LIB_RT_OPT "-sp"
+#        endif
+
+#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+
+#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#            define BOOST_LIB_RT_OPT "-sgydpn"
+#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
+#            define BOOST_LIB_RT_OPT "-sgdpn"
+#        elif defined(_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#             define BOOST_LIB_RT_OPT "-sgydpn"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        elif defined(_DEBUG)
+#             define BOOST_LIB_RT_OPT "-sgdpn"
+#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
+#            error "Build options aren't compatible with pre-built libraries"
+#        else
+#            define BOOST_LIB_RT_OPT "-spn"
+#        endif
+
+#     else
+
+#        if defined(_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#             define BOOST_LIB_RT_OPT "-sgyd"
+#        elif defined(_DEBUG)
+#             define BOOST_LIB_RT_OPT "-sgd"
+#        else
+#            define BOOST_LIB_RT_OPT "-s"
+#        endif
+
+#     endif
+
+#  endif
+
+#elif defined(__BORLANDC__)
+
+//
+// figure out whether we want the debug builds or not:
+//
+#if __BORLANDC__ > 0x561
+#pragma defineonoption BOOST_BORLAND_DEBUG -v
+#endif
+//
+// sanity check:
+//
+#if defined(__STL_DEBUG) || defined(_STLP_DEBUG)
+#error "Pre-built versions of the Boost libraries are not provided in STLport-debug form"
+#endif
+
+#  ifdef _RTLDLL
+
+#     if defined(BOOST_BORLAND_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#         define BOOST_LIB_RT_OPT "-yd"
+#     elif defined(BOOST_BORLAND_DEBUG)
+#         define BOOST_LIB_RT_OPT "-d"
+#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#         define BOOST_LIB_RT_OPT -y
+#     else
+#         define BOOST_LIB_RT_OPT
+#     endif
+
+#  else
+
+#     if defined(BOOST_BORLAND_DEBUG)\
+               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#         define BOOST_LIB_RT_OPT "-syd"
+#     elif defined(BOOST_BORLAND_DEBUG)
+#         define BOOST_LIB_RT_OPT "-sd"
+#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
+#         define BOOST_LIB_RT_OPT "-sy"
+#     else
+#         define BOOST_LIB_RT_OPT "-s"
+#     endif
+
+#  endif
+
+#endif
+
+//
+// select linkage opt:
+//
+#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
+#  define BOOST_LIB_PREFIX
+#elif defined(BOOST_DYN_LINK)
+#  error "Mixing a dll boost library with a static runtime is a really bad idea..."
+#else
+#  define BOOST_LIB_PREFIX "lib"
+#endif
+
+//
+// now include the lib:
+//
+#if defined(BOOST_LIB_NAME) \
+      && defined(BOOST_LIB_PREFIX) \
+      && defined(BOOST_LIB_TOOLSET) \
+      && defined(BOOST_LIB_THREAD_OPT) \
+      && defined(BOOST_LIB_RT_OPT) \
+      && defined(BOOST_LIB_VERSION)
+
+#ifdef BOOST_AUTO_LINK_TAGGED
+#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT ".lib")
+#  ifdef BOOST_LIB_DIAGNOSTIC
+#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT ".lib")
+#  endif
+#elif defined(BOOST_AUTO_LINK_NOMANGLE)
+#  pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib")
+#  ifdef BOOST_LIB_DIAGNOSTIC
+#     pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib")
+#  endif
+#elif defined(BOOST_LIB_BUILDID)
+#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib")
+#  ifdef BOOST_LIB_DIAGNOSTIC
+#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib")
+#  endif
+#else
+#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")
+#  ifdef BOOST_LIB_DIAGNOSTIC
+#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")
+#  endif
+#endif
+
+#else
+#  error "some required macros where not defined (internal logic error)."
+#endif
+
+
+#endif // _MSC_VER || __BORLANDC__
+
+//
+// finally undef any macros we may have set:
+//
+#ifdef BOOST_LIB_PREFIX
+#  undef BOOST_LIB_PREFIX
+#endif
+#if defined(BOOST_LIB_NAME)
+#  undef BOOST_LIB_NAME
+#endif
+// Don't undef this one: it can be set by the user and should be the 
+// same for all libraries:
+//#if defined(BOOST_LIB_TOOLSET)
+//#  undef BOOST_LIB_TOOLSET
+//#endif
+#if defined(BOOST_LIB_THREAD_OPT)
+#  undef BOOST_LIB_THREAD_OPT
+#endif
+#if defined(BOOST_LIB_RT_OPT)
+#  undef BOOST_LIB_RT_OPT
+#endif
+#if defined(BOOST_LIB_LINK_OPT)
+#  undef BOOST_LIB_LINK_OPT
+#endif
+#if defined(BOOST_LIB_DEBUG_OPT)
+#  undef BOOST_LIB_DEBUG_OPT
+#endif
+#if defined(BOOST_DYN_LINK)
+#  undef BOOST_DYN_LINK
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/borland.hpp b/gatb-core/thirdparty/boost/config/compiler/borland.hpp
new file mode 100644
index 0000000..80dd230
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/borland.hpp
@@ -0,0 +1,318 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Borland C++ compiler setup:
+
+//
+// versions check:
+// we don't support Borland prior to version 5.4:
+#if __BORLANDC__ < 0x540
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+
+// last known compiler version:
+#if (__BORLANDC__ > 0x613)
+//#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+//#  else
+//#     pragma message( "Unknown compiler version - please run the configure tests and report the results")
+//#  endif
+#elif (__BORLANDC__ == 0x600)
+#  error "CBuilderX preview compiler is no longer supported"
+#endif
+
+//
+// Support macros to help with standard library detection
+#if (__BORLANDC__ < 0x560) || defined(_USE_OLD_RW_STL)
+#  define BOOST_BCB_WITH_ROGUE_WAVE
+#elif __BORLANDC__ < 0x570
+#  define BOOST_BCB_WITH_STLPORT
+#else
+#  define BOOST_BCB_WITH_DINKUMWARE
+#endif
+
+//
+// Version 5.0 and below:
+#   if __BORLANDC__ <= 0x0550
+// Borland C++Builder 4 and 5:
+#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#     if __BORLANDC__ == 0x0550
+// Borland C++Builder 5, command-line compiler 5.5:
+#       define BOOST_NO_OPERATORS_IN_NAMESPACE
+#     endif
+// Variadic macros do not exist for C++ Builder versions 5 and below
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#   endif
+
+// Version 5.51 and below:
+#if (__BORLANDC__ <= 0x551)
+#  define BOOST_NO_CV_SPECIALIZATIONS
+#  define BOOST_NO_CV_VOID_SPECIALIZATIONS
+#  define BOOST_NO_DEDUCED_TYPENAME
+// workaround for missing WCHAR_MAX/WCHAR_MIN:
+#ifdef __cplusplus
+#include <climits>
+#include <cwchar>
+#else
+#include <limits.h>
+#include <wchar.h>
+#endif // __cplusplus
+#ifndef WCHAR_MAX
+#  define WCHAR_MAX 0xffff
+#endif
+#ifndef WCHAR_MIN
+#  define WCHAR_MIN 0
+#endif
+#endif
+
+// Borland C++ Builder 6 and below:
+#if (__BORLANDC__ <= 0x564)
+
+#  if defined(NDEBUG) && defined(__cplusplus)
+      // fix broken <cstring> so that Boost.test works:
+#     include <cstring>
+#     undef strcmp
+#  endif
+   // fix broken errno declaration:
+#  include <errno.h>
+#  ifndef errno
+#     define errno errno
+#  endif
+
+#endif
+
+//
+// new bug in 5.61:
+#if (__BORLANDC__ >= 0x561) && (__BORLANDC__ <= 0x580)
+   // this seems to be needed by the command line compiler, but not the IDE:
+#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS
+#endif
+
+// Borland C++ Builder 2006 Update 2 and below:
+#if (__BORLANDC__ <= 0x582)
+#  define BOOST_NO_SFINAE
+#  define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
+#  define BOOST_NO_TEMPLATE_TEMPLATES
+
+#  define BOOST_NO_PRIVATE_IN_AGGREGATE
+
+#  ifdef _WIN32
+#     define BOOST_NO_SWPRINTF
+#  elif defined(linux) || defined(__linux__) || defined(__linux)
+      // we should really be able to do without this
+      // but the wcs* functions aren't imported into std::
+#     define BOOST_NO_STDC_NAMESPACE
+      // _CPPUNWIND doesn't get automatically set for some reason:
+#     pragma defineonoption BOOST_CPPUNWIND -x
+#  endif
+#endif
+
+#if (__BORLANDC__ <= 0x613)  // Beman has asked Alisdair for more info
+   // we shouldn't really need this - but too many things choke
+   // without it, this needs more investigation:
+#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#  define BOOST_NO_IS_ABSTRACT
+#  define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS
+#  define BOOST_NO_USING_TEMPLATE
+#  define BOOST_SP_NO_SP_CONVERTIBLE
+
+// Temporary workaround
+#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif
+
+// Borland C++ Builder 2008 and below:
+#  define BOOST_NO_INTEGRAL_INT64_T
+#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
+#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
+#  define BOOST_NO_NESTED_FRIENDSHIP
+#  define BOOST_NO_TYPENAME_WITH_CTOR
+#if (__BORLANDC__ < 0x600)
+#  define BOOST_ILLEGAL_CV_REFERENCES
+#endif
+
+//
+//  Positive Feature detection
+//
+// Borland C++ Builder 2008 and below:
+#if (__BORLANDC__ >= 0x599)
+#  pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax
+#endif
+//
+// C++0x Macros:
+//
+#if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610)
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#  define BOOST_NO_CXX11_DECLTYPE
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#else
+#  define BOOST_HAS_ALIGNOF
+#  define BOOST_HAS_CHAR16_T
+#  define BOOST_HAS_CHAR32_T
+#  define BOOST_HAS_DECLTYPE
+#  define BOOST_HAS_EXPLICIT_CONVERSION_OPS
+#  define BOOST_HAS_REF_QUALIFIER
+#  define BOOST_HAS_RVALUE_REFS
+#  define BOOST_HAS_STATIC_ASSERT
+#endif
+
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS    // UTF-8 still not supported
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#if __BORLANDC__ >= 0x590
+#  define BOOST_HAS_TR1_HASH
+
+#  define BOOST_HAS_MACRO_USE_FACET
+#endif
+
+//
+// Post 0x561 we have long long and stdint.h:
+#if __BORLANDC__ >= 0x561
+#  ifndef __NO_LONG_LONG
+#     define BOOST_HAS_LONG_LONG
+#  else
+#     define BOOST_NO_LONG_LONG
+#  endif
+   // On non-Win32 platforms let the platform config figure this out:
+#  ifdef _WIN32
+#      define BOOST_HAS_STDINT_H
+#  endif
+#endif
+
+// Borland C++Builder 6 defaults to using STLPort.  If _USE_OLD_RW_STL is
+// defined, then we have 0x560 or greater with the Rogue Wave implementation
+// which presumably has the std::DBL_MAX bug.
+#if defined( BOOST_BCB_WITH_ROGUE_WAVE )
+// <climits> is partly broken, some macros define symbols that are really in
+// namespace std, so you end up having to use illegal constructs like
+// std::DBL_MAX, as a fix we'll just include float.h and have done with:
+#include <float.h>
+#endif
+//
+// __int64:
+//
+#if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__)
+#  define BOOST_HAS_MS_INT64
+#endif
+//
+// check for exception handling support:
+//
+#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+//
+// all versions have a <dirent.h>:
+//
+#ifndef __STRICT_ANSI__
+#  define BOOST_HAS_DIRENT_H
+#endif
+//
+// all versions support __declspec:
+//
+#if defined(__STRICT_ANSI__)
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined
+#  define BOOST_SYMBOL_EXPORT
+#endif
+//
+// ABI fixing headers:
+//
+#if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet
+#ifndef BOOST_ABI_PREFIX
+#  define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp"
+#endif
+#ifndef BOOST_ABI_SUFFIX
+#  define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp"
+#endif
+#endif
+//
+// Disable Win32 support in ANSI mode:
+//
+#if __BORLANDC__ < 0x600
+#  pragma defineonoption BOOST_DISABLE_WIN32 -A
+#elif defined(__STRICT_ANSI__)
+#  define BOOST_DISABLE_WIN32
+#endif
+//
+// MSVC compatibility mode does some nasty things:
+// TODO: look up if this doesn't apply to the whole 12xx range
+//
+#if defined(_MSC_VER) && (_MSC_VER <= 1200)
+#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+#  define BOOST_NO_VOID_RETURNS
+#endif
+
+// Borland did not implement value-initialization completely, as I reported
+// in 2007, Borland Report 51854, "Value-initialization: POD struct should be
+// zero-initialized", http://qc.embarcadero.com/wc/qcmain.aspx?d=51854
+// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues
+// (Niels Dekker, LKEB, April 2010)
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+
+#define BOOST_COMPILER "Borland C++ version " BOOST_STRINGIZE(__BORLANDC__)
diff --git a/gatb-core/thirdparty/boost/config/compiler/clang.hpp b/gatb-core/thirdparty/boost/config/compiler/clang.hpp
new file mode 100644
index 0000000..47ea65b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/clang.hpp
@@ -0,0 +1,271 @@
+// (C) Copyright Douglas Gregor 2010
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+// Clang compiler setup.
+
+#define BOOST_HAS_PRAGMA_ONCE
+
+// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.
+#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
+#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#endif
+
+// When compiling with clang before __has_extension was defined,
+// even if one writes 'defined(__has_extension) && __has_extension(xxx)',
+// clang reports a compiler error. So the only workaround found is:
+
+#ifndef __has_extension
+#define __has_extension __has_feature
+#endif
+
+#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+
+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)
+#  define BOOST_NO_RTTI
+#endif
+
+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)
+#  define BOOST_NO_TYPEID
+#endif
+
+#if defined(__int64) && !defined(__GNUC__)
+#  define BOOST_HAS_MS_INT64
+#endif
+
+#define BOOST_HAS_NRVO
+
+// Branch prediction hints
+#if defined(__has_builtin)
+#if __has_builtin(__builtin_expect)
+#define BOOST_LIKELY(x) __builtin_expect(x, 1)
+#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
+#endif
+#endif
+
+// Clang supports "long long" in all compilation modes.
+#define BOOST_HAS_LONG_LONG
+
+//
+// We disable this if the compiler is really nvcc as it
+// doesn't actually support __int128 as of CUDA_VERSION=5000
+// even though it defines __SIZEOF_INT128__.
+// See https://svn.boost.org/trac/boost/ticket/10418
+// Only re-enable this for nvcc if you're absolutely sure
+// of the circumstances under which it's supported:
+//
+#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)
+#  define BOOST_HAS_INT128
+#endif
+
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
+#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default")))
+#  define BOOST_SYMBOL_IMPORT
+#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
+#endif
+
+//
+// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
+// between switch labels.
+//
+#if __cplusplus >= 201103L && defined(__has_warning)
+#  if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
+#    define BOOST_FALLTHROUGH [[clang::fallthrough]]
+#  endif
+#endif
+
+#if !__has_feature(cxx_auto_type)
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#endif
+
+//
+// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t
+//
+#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#endif
+
+#if !__has_feature(cxx_constexpr)
+#  define BOOST_NO_CXX11_CONSTEXPR
+#endif
+
+#if !__has_feature(cxx_decltype)
+#  define BOOST_NO_CXX11_DECLTYPE
+#endif
+
+#if !__has_feature(cxx_decltype_incomplete_return_types)
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#endif
+
+#if !__has_feature(cxx_defaulted_functions)
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#endif
+
+#if !__has_feature(cxx_deleted_functions)
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#endif
+
+#if !__has_feature(cxx_explicit_conversions)
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#endif
+
+#if !__has_feature(cxx_default_function_template_args)
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#endif
+
+#if !__has_feature(cxx_generalized_initializers)
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#endif
+
+#if !__has_feature(cxx_lambdas)
+#  define BOOST_NO_CXX11_LAMBDAS
+#endif
+
+#if !__has_feature(cxx_local_type_template_args)
+#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#endif
+
+#if !__has_feature(cxx_noexcept)
+#  define BOOST_NO_CXX11_NOEXCEPT
+#endif
+
+#if !__has_feature(cxx_nullptr)
+#  define BOOST_NO_CXX11_NULLPTR
+#endif
+
+#if !__has_feature(cxx_range_for)
+#  define BOOST_NO_CXX11_RANGE_BASED_FOR
+#endif
+
+#if !__has_feature(cxx_raw_string_literals)
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#endif
+
+#if !__has_feature(cxx_reference_qualified_functions)
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#endif
+
+#if !__has_feature(cxx_generalized_initializers)
+#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#endif
+
+#if !__has_feature(cxx_rvalue_references)
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#endif
+
+#if !__has_feature(cxx_strong_enums)
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#endif
+
+#if !__has_feature(cxx_static_assert)
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#endif
+
+#if !__has_feature(cxx_alias_templates)
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#endif
+
+#if !__has_feature(cxx_unicode_literals)
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#endif
+
+#if !__has_feature(cxx_variadic_templates)
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#endif
+
+#if !__has_feature(cxx_user_literals)
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#endif
+
+#if !__has_feature(cxx_alignas)
+#  define BOOST_NO_CXX11_ALIGNAS
+#endif
+
+#if !__has_feature(cxx_trailing_return)
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#endif
+
+#if !__has_feature(cxx_inline_namespaces)
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#endif
+
+#if !__has_feature(cxx_override_control)
+#  define BOOST_NO_CXX11_FINAL
+#endif
+
+#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+
+#if !__has_feature(__cxx_decltype_auto__)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+
+#if !__has_feature(__cxx_aggregate_nsdmi__)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+
+#if !__has_feature(__cxx_init_captures__)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+
+#if !__has_feature(__cxx_generic_lambdas__)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+
+// clang < 3.5 has a defect with dependent type, like following.
+//
+//  template <class T>
+//  constexpr typename enable_if<pred<T> >::type foo(T &)
+//  { } // error: no return statement in constexpr function
+//
+// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.
+// Therefore we don't care such case.
+//
+// Note that we can't check Clang version directly as the numbering system changes depending who's
+// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)
+// so instead verify that we have a feature that was introduced at the same time as working C++14
+// constexpr (generic lambda's in this case):
+//
+#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+
+#if !__has_feature(__cxx_return_type_deduction__)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+
+#if !__has_feature(__cxx_variable_templates__)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#if __cplusplus < 201400
+// All versions with __cplusplus above this value seem to support this:
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+
+
+// Unused attribute:
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#  define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
+#endif
+
+#ifndef BOOST_COMPILER
+#  define BOOST_COMPILER "Clang version " __clang_version__
+#endif
+
+// Macro used to identify the Clang compiler.
+#define BOOST_CLANG 1
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/codegear.hpp b/gatb-core/thirdparty/boost/config/compiler/codegear.hpp
new file mode 100644
index 0000000..02bd792
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/codegear.hpp
@@ -0,0 +1,220 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  CodeGear C++ compiler setup:
+
+#if !defined( BOOST_WITH_CODEGEAR_WARNINGS )
+// these warnings occur frequently in optimized template code
+# pragma warn -8004 // var assigned value, but never used
+# pragma warn -8008 // condition always true/false
+# pragma warn -8066 // dead code can never execute
+# pragma warn -8104 // static members with ctors not threadsafe
+# pragma warn -8105 // reference member in class without ctors
+#endif
+//
+// versions check:
+// last known and checked version is 0x621
+#if (__CODEGEARC__ > 0x621)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  else
+#     pragma message( "Unknown compiler version - please run the configure tests and report the results")
+#  endif
+#endif
+
+// CodeGear C++ Builder 2009
+#if (__CODEGEARC__ <= 0x613)
+#  define BOOST_NO_INTEGRAL_INT64_T
+#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
+#  define BOOST_NO_PRIVATE_IN_AGGREGATE
+#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
+   // we shouldn't really need this - but too many things choke
+   // without it, this needs more investigation:
+#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#  define BOOST_SP_NO_SP_CONVERTIBLE
+#endif
+
+// CodeGear C++ Builder 2010
+#if (__CODEGEARC__ <= 0x621)
+#  define BOOST_NO_TYPENAME_WITH_CTOR    // Cannot use typename keyword when making temporaries of a dependant type
+#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#  define BOOST_NO_NESTED_FRIENDSHIP     // TC1 gives nested classes access rights as any other member
+#  define BOOST_NO_USING_TEMPLATE
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+// Temporary hack, until specific MPL preprocessed headers are generated
+#  define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+// CodeGear has not yet completely implemented value-initialization, for
+// example for array types, as I reported in 2010: Embarcadero Report 83751,
+// "Value-initialization: arrays should have each element value-initialized",
+// http://qc.embarcadero.com/wc/qcmain.aspx?d=83751
+// Last checked version: Embarcadero C++ 6.21
+// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues
+// (Niels Dekker, LKEB, April 2010)
+#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+
+#  if defined(NDEBUG) && defined(__cplusplus)
+      // fix broken <cstring> so that Boost.test works:
+#     include <cstring>
+#     undef strcmp
+#  endif
+   // fix broken errno declaration:
+#  include <errno.h>
+#  ifndef errno
+#     define errno errno
+#  endif
+
+#endif
+
+// Reportedly, #pragma once is supported since C++ Builder 2010
+#if (__CODEGEARC__ >= 0x620)
+#  define BOOST_HAS_PRAGMA_ONCE
+#endif
+
+//
+// C++0x macros:
+//
+#if (__CODEGEARC__ <= 0x620)
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#else
+#define BOOST_HAS_STATIC_ASSERT
+#endif
+#define BOOST_HAS_CHAR16_T
+#define BOOST_HAS_CHAR32_T
+#define BOOST_HAS_LONG_LONG
+// #define BOOST_HAS_ALIGNOF
+#define BOOST_HAS_DECLTYPE
+#define BOOST_HAS_EXPLICIT_CONVERSION_OPS
+// #define BOOST_HAS_RVALUE_REFS
+#define BOOST_HAS_SCOPED_ENUM
+// #define BOOST_HAS_STATIC_ASSERT
+#define BOOST_HAS_STD_TYPE_TRAITS
+
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+//
+// TR1 macros:
+//
+#define BOOST_HAS_TR1_HASH
+#define BOOST_HAS_TR1_TYPE_TRAITS
+#define BOOST_HAS_TR1_UNORDERED_MAP
+#define BOOST_HAS_TR1_UNORDERED_SET
+
+#define BOOST_HAS_MACRO_USE_FACET
+
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+
+// On non-Win32 platforms let the platform config figure this out:
+#ifdef _WIN32
+#  define BOOST_HAS_STDINT_H
+#endif
+
+//
+// __int64:
+//
+#if !defined(__STRICT_ANSI__)
+#  define BOOST_HAS_MS_INT64
+#endif
+//
+// check for exception handling support:
+//
+#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+//
+// all versions have a <dirent.h>:
+//
+#if !defined(__STRICT_ANSI__)
+#  define BOOST_HAS_DIRENT_H
+#endif
+//
+// all versions support __declspec:
+//
+#if defined(__STRICT_ANSI__)
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined
+#  define BOOST_SYMBOL_EXPORT
+#endif
+//
+// ABI fixing headers:
+//
+#ifndef BOOST_ABI_PREFIX
+#  define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp"
+#endif
+#ifndef BOOST_ABI_SUFFIX
+#  define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp"
+#endif
+//
+// Disable Win32 support in ANSI mode:
+//
+#  pragma defineonoption BOOST_DISABLE_WIN32 -A
+//
+// MSVC compatibility mode does some nasty things:
+// TODO: look up if this doesn't apply to the whole 12xx range
+//
+#if defined(_MSC_VER) && (_MSC_VER <= 1200)
+#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+#  define BOOST_NO_VOID_RETURNS
+#endif
+
+#define BOOST_COMPILER "CodeGear C++ version " BOOST_STRINGIZE(__CODEGEARC__)
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/comeau.hpp b/gatb-core/thirdparty/boost/config/compiler/comeau.hpp
new file mode 100644
index 0000000..278222d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/comeau.hpp
@@ -0,0 +1,59 @@
+//  (C) Copyright John Maddock 2001. 
+//  (C) Copyright Douglas Gregor 2001. 
+//  (C) Copyright Peter Dimov 2001. 
+//  (C) Copyright Aleksey Gurtovoy 2003. 
+//  (C) Copyright Beman Dawes 2003. 
+//  (C) Copyright Jens Maurer 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Comeau C++ compiler setup:
+
+#include "boost/config/compiler/common_edg.hpp"
+
+#if (__COMO_VERSION__ <= 4245)
+
+#  if defined(_MSC_VER) && _MSC_VER <= 1300
+#     if _MSC_VER > 100
+         // only set this in non-strict mode:
+#        define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+#     endif
+#  endif
+
+// Void returns don't work when emulating VC 6 (Peter Dimov)
+// TODO: look up if this doesn't apply to the whole 12xx range
+#  if defined(_MSC_VER) && (_MSC_VER < 1300)
+#     define BOOST_NO_VOID_RETURNS
+#  endif
+
+#endif  // version 4245
+
+//
+// enable __int64 support in VC emulation mode
+//
+#  if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#     define BOOST_HAS_MS_INT64
+#  endif
+
+#define BOOST_COMPILER "Comeau compiler version " BOOST_STRINGIZE(__COMO_VERSION__)
+
+//
+// versions check:
+// we don't know Comeau prior to version 4245:
+#if __COMO_VERSION__ < 4245
+#  error "Compiler not configured - please reconfigure"
+#endif
+//
+// last known and checked version is 4245:
+#if (__COMO_VERSION__ > 4245)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/common_edg.hpp b/gatb-core/thirdparty/boost/config/compiler/common_edg.hpp
new file mode 100644
index 0000000..b92e574
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/common_edg.hpp
@@ -0,0 +1,143 @@
+//  (C) Copyright John Maddock 2001 - 2002.
+//  (C) Copyright Jens Maurer 2001.
+//  (C) Copyright David Abrahams 2002.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  (C) Copyright Markus Schoepflin 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//
+// Options common to all edg based compilers.
+//
+// This is included from within the individual compiler mini-configs.
+
+#ifndef  __EDG_VERSION__
+#  error This file requires that __EDG_VERSION__ be defined.
+#endif
+
+#if (__EDG_VERSION__ <= 238)
+#   define BOOST_NO_INTEGRAL_INT64_T
+#   define BOOST_NO_SFINAE
+#endif
+
+#if (__EDG_VERSION__ <= 240)
+#   define BOOST_NO_VOID_RETURNS
+#endif
+
+#if (__EDG_VERSION__ <= 241) && !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+#   define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+#endif
+
+#if (__EDG_VERSION__ <= 244) && !defined(BOOST_NO_TEMPLATE_TEMPLATES)
+#   define BOOST_NO_TEMPLATE_TEMPLATES
+#endif
+
+#if (__EDG_VERSION__ < 300) && !defined(BOOST_NO_IS_ABSTRACT)
+#   define BOOST_NO_IS_ABSTRACT
+#endif
+
+#if (__EDG_VERSION__ <= 303) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
+#   define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#endif
+
+// See also kai.hpp which checks a Kai-specific symbol for EH
+# if !defined(__KCC) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)
+#     define BOOST_NO_EXCEPTIONS
+# endif
+
+# if !defined(__NO_LONG_LONG)
+#     define BOOST_HAS_LONG_LONG
+# else
+#     define BOOST_NO_LONG_LONG
+# endif
+
+// Not sure what version was the first to support #pragma once, but
+// different EDG-based compilers (e.g. Intel) supported it for ages.
+// Add a proper version check if it causes problems.
+#define BOOST_HAS_PRAGMA_ONCE
+
+//
+// C++0x features
+//
+//   See above for BOOST_NO_LONG_LONG
+//
+#if (__EDG_VERSION__ < 310)
+#  define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#endif
+#if (__EDG_VERSION__ <= 310)
+// No support for initializer lists
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#endif
+#if (__EDG_VERSION__ < 400)
+#  define BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#ifdef c_plusplus
+// EDG has "long long" in non-strict mode
+// However, some libraries have insufficient "long long" support
+// #define BOOST_HAS_LONG_LONG
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/compaq_cxx.hpp b/gatb-core/thirdparty/boost/config/compiler/compaq_cxx.hpp
new file mode 100644
index 0000000..b44486c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/compaq_cxx.hpp
@@ -0,0 +1,19 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Tru64 C++ compiler setup (now HP):
+
+#define BOOST_COMPILER "HP Tru64 C++ " BOOST_STRINGIZE(__DECCXX_VER)
+
+#include "boost/config/compiler/common_edg.hpp"
+
+//
+// versions check:
+// Nothing to do here?
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/cray.hpp b/gatb-core/thirdparty/boost/config/compiler/cray.hpp
new file mode 100644
index 0000000..3f66043
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/cray.hpp
@@ -0,0 +1,92 @@
+//  (C) Copyright John Maddock 2011.
+//  (C) Copyright Cray, Inc. 2013
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Greenhills C compiler setup:
+
+#define BOOST_COMPILER "Cray C version " BOOST_STRINGIZE(_RELEASE)
+
+#if _RELEASE < 8
+#  error "Boost is not configured for Cray compilers prior to version 8, please try the configure script."
+#endif
+
+//
+// Check this is a recent EDG based compiler, otherwise we don't support it here:
+//
+#ifndef __EDG_VERSION__
+#  error "Unsupported Cray compiler, please try running the configure script."
+#endif
+
+#include "boost/config/compiler/common_edg.hpp"
+
+
+//
+//
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_HAS_NRVO
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#define BOOST_HAS_NRVO
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+
+//#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
+#define BOOST_MATH_DISABLE_STD_FPCLASSIFY
+//#define BOOST_HAS_FPCLASSIFY
+
+#define BOOST_SP_USE_PTHREADS 
+#define BOOST_AC_USE_PTHREADS 
+
+/* everything that follows is working around what are thought to be
+ * compiler shortcomings.  Revist all of these regularly.
+ */
+
+//#define BOOST_USE_ENUM_STATIC_ASSERT
+//#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define
+
+// These constants should be provided by the 
+// compiler, at least when -hgnu is asserted on the command line.
+
+#ifndef __ATOMIC_RELAXED
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_SEQ_CST 5
+#endif
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/digitalmars.hpp b/gatb-core/thirdparty/boost/config/compiler/digitalmars.hpp
new file mode 100644
index 0000000..a3d293c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/digitalmars.hpp
@@ -0,0 +1,124 @@
+//  Copyright (C) Christof Meerwald 2003
+//  Copyright (C) Dan Watkins 2003
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Digital Mars C++ compiler setup:
+#define BOOST_COMPILER __DMC_VERSION_STRING__
+
+#define BOOST_HAS_LONG_LONG
+#define BOOST_HAS_PRAGMA_ONCE
+
+#if !defined(BOOST_STRICT_CONFIG)
+#define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#define BOOST_NO_OPERATORS_IN_NAMESPACE
+#define BOOST_NO_UNREACHABLE_RETURN_DETECTION
+#define BOOST_NO_SFINAE
+#define BOOST_NO_USING_TEMPLATE
+#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#endif
+
+//
+// has macros:
+#define BOOST_HAS_DIRENT_H
+#define BOOST_HAS_STDINT_H
+#define BOOST_HAS_WINTHREADS
+
+#if (__DMC__ >= 0x847)
+#define BOOST_HAS_EXPM1
+#define BOOST_HAS_LOG1P
+#endif
+
+//
+// Is this really the best way to detect whether the std lib is in namespace std?
+//
+#ifdef __cplusplus
+#include <cstddef>
+#endif
+#if !defined(__STL_IMPORT_VENDOR_CSTD) && !defined(_STLP_IMPORT_VENDOR_CSTD)
+#  define BOOST_NO_STDC_NAMESPACE
+#endif
+
+
+// check for exception handling support:
+#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+
+//
+// C++0x features
+//
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#if (__DMC__ <= 0x840)
+#error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version is ...:
+#if (__DMC__ > 0x848)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/gcc.hpp b/gatb-core/thirdparty/boost/config/compiler/gcc.hpp
new file mode 100644
index 0000000..41705df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/gcc.hpp
@@ -0,0 +1,296 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright Darin Adler 2001 - 2002.
+//  (C) Copyright Jens Maurer 2001 - 2002.
+//  (C) Copyright Beman Dawes 2001 - 2003.
+//  (C) Copyright Douglas Gregor 2002.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Synge Todo 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  GNU C++ compiler setup.
+
+//
+// Define BOOST_GCC so we know this is "real" GCC and not some pretender:
+//
+#define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#if !defined(__CUDACC__)
+#define BOOST_GCC BOOST_GCC_VERSION
+#endif
+
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
+#  define BOOST_GCC_CXX11
+#endif
+
+#if __GNUC__ == 3
+#  if defined (__PATHSCALE__)
+#     define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#     define BOOST_NO_IS_ABSTRACT
+#  endif
+
+#  if __GNUC_MINOR__ < 4
+#     define BOOST_NO_IS_ABSTRACT
+#  endif
+#  define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#endif
+#if __GNUC__ < 4
+//
+// All problems to gcc-3.x and earlier here:
+//
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#  ifdef __OPEN64__
+#     define BOOST_NO_IS_ABSTRACT
+#  endif
+#endif
+
+// GCC prior to 3.4 had #pragma once too but it didn't work well with filesystem links
+#if BOOST_GCC_VERSION >= 30400
+#define BOOST_HAS_PRAGMA_ONCE
+#endif
+
+#if BOOST_GCC_VERSION < 40400
+// Previous versions of GCC did not completely implement value-initialization:
+// GCC Bug 30111, "Value-initialization of POD base class doesn't initialize
+// members", reported by Jonathan Wakely in 2006,
+// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 (fixed for GCC 4.4)
+// GCC Bug 33916, "Default constructor fails to initialize array members",
+// reported by Michael Elizabeth Chastain in 2007,
+// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 (fixed for GCC 4.2.4)
+// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#endif
+
+#if !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)
+# define BOOST_NO_EXCEPTIONS
+#endif
+
+
+//
+// Threading support: Turn this on unconditionally here (except for
+// those platforms where we can know for sure). It will get turned off again
+// later if no threading API is detected.
+//
+#if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__)
+# define BOOST_HAS_THREADS
+#endif
+
+//
+// gcc has "long long"
+// Except on Darwin with standard compliance enabled (-pedantic)
+// Apple gcc helpfully defines this macro we can query
+//
+#if !defined(__DARWIN_NO_LONG_LONG)
+# define BOOST_HAS_LONG_LONG
+#endif
+
+//
+// gcc implements the named return value optimization since version 3.1
+//
+#define BOOST_HAS_NRVO
+
+// Branch prediction hints
+#define BOOST_LIKELY(x) __builtin_expect(x, 1)
+#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if __GNUC__ >= 4
+#  if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && !defined(__CYGWIN__)
+     // All Win32 development environments, including 64-bit Windows and MinGW, define
+     // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment,
+     // so does not define _WIN32 or its variants.
+#    define BOOST_HAS_DECLSPEC
+#    define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__))
+#    define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__))
+#  else
+#    define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default")))
+#    define BOOST_SYMBOL_IMPORT
+#  endif
+#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
+#else
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined
+#  define BOOST_SYMBOL_EXPORT
+#endif
+
+//
+// RTTI and typeinfo detection is possible post gcc-4.3:
+//
+#if BOOST_GCC_VERSION > 40300
+#  ifndef __GXX_RTTI
+#     ifndef BOOST_NO_TYPEID
+#        define BOOST_NO_TYPEID
+#     endif
+#     ifndef BOOST_NO_RTTI
+#        define BOOST_NO_RTTI
+#     endif
+#  endif
+#endif
+
+//
+// Recent GCC versions have __int128 when in 64-bit mode.
+//
+// We disable this if the compiler is really nvcc as it
+// doesn't actually support __int128 as of CUDA_VERSION=5000
+// even though it defines __SIZEOF_INT128__.
+// See https://svn.boost.org/trac/boost/ticket/8048
+// Only re-enable this for nvcc if you're absolutely sure
+// of the circumstances under which it's supported:
+//
+#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)
+#  define BOOST_HAS_INT128
+#endif
+
+// C++0x features in 4.3.n and later
+//
+#if (BOOST_GCC_VERSION >= 40300) && defined(BOOST_GCC_CXX11)
+// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are
+// passed on the command line, which in turn defines
+// __GXX_EXPERIMENTAL_CXX0X__.
+#  define BOOST_HAS_DECLTYPE
+#  define BOOST_HAS_RVALUE_REFS
+#  define BOOST_HAS_STATIC_ASSERT
+#  define BOOST_HAS_VARIADIC_TMPL
+#else
+#  define BOOST_NO_CXX11_DECLTYPE
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#endif
+
+// C++0x features in 4.4.n and later
+//
+#if (BOOST_GCC_VERSION < 40400) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#endif
+
+#if BOOST_GCC_VERSION < 40500
+#  define BOOST_NO_SFINAE_EXPR
+#endif
+
+// GCC 4.5 forbids declaration of defaulted functions in private or protected sections
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 5) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS
+#endif
+
+// C++0x features in 4.5.0 and later
+//
+#if (BOOST_GCC_VERSION < 40500) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_LAMBDAS
+#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#endif
+
+// C++0x features in 4.5.1 and later
+//
+#if (BOOST_GCC_VERSION < 40501) || !defined(BOOST_GCC_CXX11)
+// scoped enums have a serious bug in 4.4.0, so define BOOST_NO_CXX11_SCOPED_ENUMS before 4.5.1
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#endif
+
+// C++0x features in 4.6.n and later
+//
+#if (BOOST_GCC_VERSION < 40600) || !defined(BOOST_GCC_CXX11)
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#endif
+
+// C++0x features in 4.7.n and later
+//
+#if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_FINAL
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
+#endif
+
+// C++0x features in 4.8.n and later
+//
+#if (BOOST_GCC_VERSION < 40800) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_ALIGNAS
+#endif
+
+// C++0x features in 4.8.1 and later
+//
+#if (BOOST_GCC_VERSION < 40801) || !defined(BOOST_GCC_CXX11)
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+
+// C++14 features in 4.9.0 and later
+//
+#if (BOOST_GCC_VERSION < 40900) || (__cplusplus < 201300)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#  if !((BOOST_GCC_VERSION >= 40801) && (BOOST_GCC_VERSION < 40900) && defined(BOOST_GCC_CXX11))
+#     define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#  endif
+#endif
+
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+//
+// Unused attribute:
+#if __GNUC__ >= 4
+#  define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
+#endif
+
+#ifndef BOOST_COMPILER
+#  define BOOST_COMPILER "GNU C++ version " __VERSION__
+#endif
+
+// ConceptGCC compiler:
+//   http://www.generic-programming.org/software/ConceptGCC/
+#ifdef __GXX_CONCEPTS__
+#  define BOOST_HAS_CONCEPTS
+#  define BOOST_COMPILER "ConceptGCC version " __VERSION__
+#endif
+
+// versions check:
+// we don't know gcc prior to version 3.30:
+#if (BOOST_GCC_VERSION< 30300)
+#  error "Compiler not configured - please reconfigure"
+#endif
+//
+// last known and checked version is 4.9:
+#if (BOOST_GCC_VERSION > 40900)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  else
+// we don't emit warnings here anymore since there are no defect macros defined for
+// gcc post 3.4, so any failures are gcc regressions...
+//#     warning "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/gcc_xml.hpp b/gatb-core/thirdparty/boost/config/compiler/gcc_xml.hpp
new file mode 100644
index 0000000..c11f29d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/gcc_xml.hpp
@@ -0,0 +1,95 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  GCC-XML C++ compiler setup:
+
+#  if !defined(__GCCXML_GNUC__) || ((__GCCXML_GNUC__ <= 3) && (__GCCXML_GNUC_MINOR__ <= 3))
+#     define BOOST_NO_IS_ABSTRACT
+#  endif
+
+//
+// Threading support: Turn this on unconditionally here (except for
+// those platforms where we can know for sure). It will get turned off again
+// later if no threading API is detected.
+//
+#if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(linux) && !defined(__linux) && !defined(__linux__)
+# define BOOST_HAS_THREADS
+#endif
+
+//
+// gcc has "long long"
+//
+#define BOOST_HAS_LONG_LONG
+
+// C++0x features:
+//
+#  define BOOST_NO_CXX11_CONSTEXPR
+#  define BOOST_NO_CXX11_NULLPTR
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#  define BOOST_NO_CXX11_DECLTYPE
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#  define BOOST_NO_CXX11_VARIADIC_MACROS
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#  define BOOST_NO_SFINAE_EXPR
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_LAMBDAS
+#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#  define BOOST_NO_CXX11_RANGE_BASED_FOR
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#  define BOOST_NO_CXX11_NOEXCEPT
+#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#  define BOOST_NO_CXX11_ALIGNAS
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#define BOOST_COMPILER "GCC-XML C++ version " __GCCXML__
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/greenhills.hpp b/gatb-core/thirdparty/boost/config/compiler/greenhills.hpp
new file mode 100644
index 0000000..038b6b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/greenhills.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Greenhills C++ compiler setup:
+
+#define BOOST_COMPILER "Greenhills C++ version " BOOST_STRINGIZE(__ghs)
+
+#include "boost/config/compiler/common_edg.hpp"
+
+//
+// versions check:
+// we don't support Greenhills prior to version 0:
+#if __ghs < 0
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version is 0:
+#if (__ghs > 0)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/hp_acc.hpp b/gatb-core/thirdparty/boost/config/compiler/hp_acc.hpp
new file mode 100644
index 0000000..fb63839
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/hp_acc.hpp
@@ -0,0 +1,145 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright Jens Maurer 2001 - 2003.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Toon Knapen 2003.
+//  (C) Copyright Boris Gubenko 2006 - 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  HP aCC C++ compiler setup:
+
+#if defined(__EDG__)
+#include "boost/config/compiler/common_edg.hpp"
+#endif
+
+#if (__HP_aCC <= 33100)
+#    define BOOST_NO_INTEGRAL_INT64_T
+#    define BOOST_NO_OPERATORS_IN_NAMESPACE
+#  if !defined(_NAMESPACE_STD)
+#     define BOOST_NO_STD_LOCALE
+#     define BOOST_NO_STRINGSTREAM
+#  endif
+#endif
+
+#if (__HP_aCC <= 33300)
+// member templates are sufficiently broken that we disable them for now
+#    define BOOST_NO_MEMBER_TEMPLATES
+#    define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
+#    define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
+#endif
+
+#if (__HP_aCC <= 38000)
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#endif
+
+#if (__HP_aCC > 50000) && (__HP_aCC < 60000)
+#    define BOOST_NO_UNREACHABLE_RETURN_DETECTION
+#    define BOOST_NO_TEMPLATE_TEMPLATES
+#    define BOOST_NO_SWPRINTF
+#    define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
+#    define BOOST_NO_IS_ABSTRACT
+#    define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#endif
+
+// optional features rather than defects:
+#if (__HP_aCC >= 33900)
+#    define BOOST_HAS_LONG_LONG
+#    define BOOST_HAS_PARTIAL_STD_ALLOCATOR
+#endif
+
+#if (__HP_aCC >= 50000 ) && (__HP_aCC <= 53800 ) || (__HP_aCC < 31300 )
+#    define BOOST_NO_MEMBER_TEMPLATE_KEYWORD
+#endif
+
+// This macro should not be defined when compiling in strict ansi
+// mode, but, currently, we don't have the ability to determine
+// what standard mode we are compiling with. Some future version
+// of aCC6 compiler will provide predefined macros reflecting the
+// compilation options, including the standard mode.
+#if (__HP_aCC >= 60000) || ((__HP_aCC > 38000) && defined(__hpxstd98))
+#    define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#endif
+
+#define BOOST_COMPILER "HP aCC version " BOOST_STRINGIZE(__HP_aCC)
+
+//
+// versions check:
+// we don't support HP aCC prior to version 33000:
+#if __HP_aCC < 33000
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+
+//
+// Extended checks for supporting aCC on PA-RISC
+#if __HP_aCC > 30000 && __HP_aCC < 50000
+#  if __HP_aCC < 38000
+      // versions prior to version A.03.80 not supported
+#     error "Compiler version not supported - version A.03.80 or higher is required"
+#  elif !defined(__hpxstd98)
+      // must compile using the option +hpxstd98 with version A.03.80 and above
+#     error "Compiler option '+hpxstd98' is required for proper support"
+#  endif //PA-RISC
+#endif
+
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#if !defined(__EDG__)
+
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+
+/*
+  See https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443331 and
+      https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443436
+*/
+
+#if (__HP_aCC < 62500) || !defined(HP_CXX0x_SOURCE)
+  #define BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+
+#endif
+
+//
+// last known and checked version for HP-UX/ia64 is 61300
+// last known and checked version for PA-RISC is 38000
+#if ((__HP_aCC > 61300) || ((__HP_aCC > 38000) && defined(__hpxstd98)))
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/intel.hpp b/gatb-core/thirdparty/boost/config/compiler/intel.hpp
new file mode 100644
index 0000000..ecfacc5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/intel.hpp
@@ -0,0 +1,529 @@
+//  (C) Copyright John Maddock 2001-8.
+//  (C) Copyright Peter Dimov 2001.
+//  (C) Copyright Jens Maurer 2001.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.
+//  (C) Copyright Guillaume Melquiond 2002 - 2003.
+//  (C) Copyright Beman Dawes 2003.
+//  (C) Copyright Martin Wille 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Intel compiler setup:
+
+#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__))
+
+#ifdef _MSC_VER
+
+#include <boost/config/compiler/visualc.hpp>
+
+#if (__INTEL_COMPILER >= 1500) && (_MSC_VER >= 1900)
+//
+// These appear to be supported, even though VC++ may not support them:
+//
+#define BOOST_HAS_EXPM1
+#define BOOST_HAS_LOG1P
+#undef BOOST_NO_CXX14_BINARY_LITERALS
+// This one may be a little risky to enable??
+#undef BOOST_NO_SFINAE_EXPR
+
+#endif
+
+#else
+
+#include <boost/config/compiler/gcc.hpp>
+
+#endif
+
+#undef BOOST_COMPILER
+
+#if defined(__INTEL_COMPILER)
+#if __INTEL_COMPILER == 9999
+#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.
+#else
+#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER
+#endif
+#elif defined(__ICL)
+#  define BOOST_INTEL_CXX_VERSION __ICL
+#elif defined(__ICC)
+#  define BOOST_INTEL_CXX_VERSION __ICC
+#elif defined(__ECC)
+#  define BOOST_INTEL_CXX_VERSION __ECC
+#endif
+
+// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'
+#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_INTEL_STDCXX0X
+#endif
+#if defined(_MSC_VER) && (_MSC_VER >= 1600)
+#  define BOOST_INTEL_STDCXX0X
+#endif
+
+#ifdef __GNUC__
+#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+#if !defined(BOOST_COMPILER)
+#  if defined(BOOST_INTEL_STDCXX0X)
+#    define BOOST_COMPILER "Intel C++ C++0x mode version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)
+#  else
+#    define BOOST_COMPILER "Intel C++ version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)
+#  endif
+#endif
+
+#define BOOST_INTEL BOOST_INTEL_CXX_VERSION
+
+#if defined(_WIN32) || defined(_WIN64)
+#  define BOOST_INTEL_WIN BOOST_INTEL
+#else
+#  define BOOST_INTEL_LINUX BOOST_INTEL
+#endif
+
+#else
+
+#include "boost/config/compiler/common_edg.hpp"
+
+#if defined(__INTEL_COMPILER)
+#if __INTEL_COMPILER == 9999
+#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.
+#else
+#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER
+#endif
+#elif defined(__ICL)
+#  define BOOST_INTEL_CXX_VERSION __ICL
+#elif defined(__ICC)
+#  define BOOST_INTEL_CXX_VERSION __ICC
+#elif defined(__ECC)
+#  define BOOST_INTEL_CXX_VERSION __ECC
+#endif
+
+// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'
+#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_INTEL_STDCXX0X
+#endif
+#if defined(_MSC_VER) && (_MSC_VER >= 1600)
+#  define BOOST_INTEL_STDCXX0X
+#endif
+
+#ifdef __GNUC__
+#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+#if !defined(BOOST_COMPILER)
+#  if defined(BOOST_INTEL_STDCXX0X)
+#    define BOOST_COMPILER "Intel C++ C++0x mode version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)
+#  else
+#    define BOOST_COMPILER "Intel C++ version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)
+#  endif
+#endif
+
+#define BOOST_INTEL BOOST_INTEL_CXX_VERSION
+
+#if defined(_WIN32) || defined(_WIN64)
+#  define BOOST_INTEL_WIN BOOST_INTEL
+#else
+#  define BOOST_INTEL_LINUX BOOST_INTEL
+#endif
+
+#if (BOOST_INTEL_CXX_VERSION <= 600)
+
+#  if defined(_MSC_VER) && (_MSC_VER <= 1300) // added check for <= VC 7 (Peter Dimov)
+
+// Boost libraries assume strong standard conformance unless otherwise
+// indicated by a config macro. As configured by Intel, the EDG front-end
+// requires certain compiler options be set to achieve that strong conformance.
+// Particularly /Qoption,c,--arg_dep_lookup (reported by Kirk Klobe & Thomas Witt)
+// and /Zc:wchar_t,forScope. See boost-root/tools/build/intel-win32-tools.jam for
+// details as they apply to particular versions of the compiler. When the
+// compiler does not predefine a macro indicating if an option has been set,
+// this config file simply assumes the option has been set.
+// Thus BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP will not be defined, even if
+// the compiler option is not enabled.
+
+#     define BOOST_NO_SWPRINTF
+#  endif
+
+// Void returns, 64 bit integrals don't work when emulating VC 6 (Peter Dimov)
+
+#  if defined(_MSC_VER) && (_MSC_VER <= 1200)
+#     define BOOST_NO_VOID_RETURNS
+#     define BOOST_NO_INTEGRAL_INT64_T
+#  endif
+
+#endif
+
+#if (BOOST_INTEL_CXX_VERSION <= 710) && defined(_WIN32)
+#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS
+#endif
+
+// See http://aspn.activestate.com/ASPN/Mail/Message/boost/1614864
+#if BOOST_INTEL_CXX_VERSION < 600
+#  define BOOST_NO_INTRINSIC_WCHAR_T
+#else
+// We should test the macro _WCHAR_T_DEFINED to check if the compiler
+// supports wchar_t natively. *BUT* there is a problem here: the standard
+// headers define this macro if they typedef wchar_t. Anyway, we're lucky
+// because they define it without a value, while Intel C++ defines it
+// to 1. So we can check its value to see if the macro was defined natively
+// or not.
+// Under UNIX, the situation is exactly the same, but the macro _WCHAR_T
+// is used instead.
+#  if ((_WCHAR_T_DEFINED + 0) == 0) && ((_WCHAR_T + 0) == 0)
+#    define BOOST_NO_INTRINSIC_WCHAR_T
+#  endif
+#endif
+
+#if defined(__GNUC__) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
+//
+// Figure out when Intel is emulating this gcc bug
+// (All Intel versions prior to 9.0.26, and versions
+// later than that if they are set up to emulate gcc 3.2
+// or earlier):
+//
+#  if ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) || (BOOST_INTEL < 900) || (__INTEL_COMPILER_BUILD_DATE < 20050912)
+#     define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#  endif
+#endif
+#if (defined(__GNUC__) && (__GNUC__ < 4)) || (defined(_WIN32) && (BOOST_INTEL_CXX_VERSION <= 1200)) || (BOOST_INTEL_CXX_VERSION <= 1200)
+// GCC or VC emulation:
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#endif
+//
+// Verify that we have actually got BOOST_NO_INTRINSIC_WCHAR_T
+// set correctly, if we don't do this now, we will get errors later
+// in type_traits code among other things, getting this correct
+// for the Intel compiler is actually remarkably fragile and tricky:
+//
+#ifdef __cplusplus
+#if defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#include <cwchar>
+template< typename T > struct assert_no_intrinsic_wchar_t;
+template<> struct assert_no_intrinsic_wchar_t<wchar_t> { typedef void type; };
+// if you see an error here then you need to unset BOOST_NO_INTRINSIC_WCHAR_T
+// where it is defined above:
+typedef assert_no_intrinsic_wchar_t<unsigned short>::type assert_no_intrinsic_wchar_t_;
+#else
+template< typename T > struct assert_intrinsic_wchar_t;
+template<> struct assert_intrinsic_wchar_t<wchar_t> {};
+// if you see an error here then define BOOST_NO_INTRINSIC_WCHAR_T on the command line:
+template<> struct assert_intrinsic_wchar_t<unsigned short> {};
+#endif
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER+0 >= 1000)
+#  if _MSC_VER >= 1200
+#     define BOOST_HAS_MS_INT64
+#  endif
+#  define BOOST_NO_SWPRINTF
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#elif defined(_WIN32)
+#  define BOOST_DISABLE_WIN32
+#endif
+
+// I checked version 6.0 build 020312Z, it implements the NRVO.
+// Correct this as you find out which version of the compiler
+// implemented the NRVO first.  (Daniel Frey)
+#if (BOOST_INTEL_CXX_VERSION >= 600)
+#  define BOOST_HAS_NRVO
+#endif
+
+// Branch prediction hints
+// I'm not sure 8.0 was the first version to support these builtins,
+// update the condition if the version is not accurate. (Andrey Semashev)
+#if defined(__GNUC__) && BOOST_INTEL_CXX_VERSION >= 800
+#define BOOST_LIKELY(x) __builtin_expect(x, 1)
+#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
+#endif
+
+// RTTI
+// __RTTI is the EDG macro
+// __INTEL_RTTI__ is the Intel macro
+// __GXX_RTTI is the g++ macro
+// _CPPRTTI is the MSVC++ macro
+#if !defined(__RTTI) && !defined(__INTEL_RTTI__) && !defined(__GXX_RTTI) && !defined(_CPPRTTI)
+
+#if !defined(BOOST_NO_RTTI)
+# define BOOST_NO_RTTI
+#endif
+
+// in MS mode, static typeid works even when RTTI is off
+#if !defined(_MSC_VER) && !defined(BOOST_NO_TYPEID)
+# define BOOST_NO_TYPEID
+#endif
+
+#endif
+
+//
+// versions check:
+// we don't support Intel prior to version 6.0:
+#if BOOST_INTEL_CXX_VERSION < 600
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+
+// Intel on MacOS requires
+#if defined(__APPLE__) && defined(__INTEL_COMPILER)
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#endif
+
+// Intel on Altix Itanium
+#if defined(__itanium__) && defined(__INTEL_COMPILER)
+#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#endif
+
+//
+// An attempt to value-initialize a pointer-to-member may trigger an
+// internal error on Intel <= 11.1 (last checked version), as was
+// reported by John Maddock, Intel support issue 589832, May 2010.
+// Moreover, according to test results from Huang-Vista-x86_32_intel,
+// intel-vc9-win-11.1 may leave a non-POD array uninitialized, in some
+// cases when it should be value-initialized.
+// (Niels Dekker, LKEB, May 2010)
+// Apparently Intel 12.1 (compiler version number 9999 !!) has the same issue (compiler regression).
+#if defined(__INTEL_COMPILER)
+#  if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 9999) || (defined(_WIN32) && (__INTEL_COMPILER < 1600))
+#    define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#  endif
+#endif
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#  define BOOST_SYMBOL_EXPORT __attribute__((visibility("default")))
+#  define BOOST_SYMBOL_IMPORT
+#  define BOOST_SYMBOL_VISIBLE __attribute__((visibility("default")))
+#endif
+//
+// C++0x features
+// For each feature we need to check both the Intel compiler version, 
+// and the version of MSVC or GCC that we are emulating.
+// See http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/
+// for a list of which features were implemented in which Intel releases.
+//
+#if defined(BOOST_INTEL_STDCXX0X)
+// BOOST_NO_CXX11_CONSTEXPR:
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && !defined(_MSC_VER)
+// Available in earlier Intel versions, but fail our tests:
+#  undef BOOST_NO_CXX11_CONSTEXPR
+#endif
+// BOOST_NO_CXX11_NULLPTR:
+#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_NULLPTR
+#endif
+// BOOST_NO_CXX11_TEMPLATE_ALIASES
+#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_TEMPLATE_ALIASES
+#endif
+
+// BOOST_NO_CXX11_DECLTYPE
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_DECLTYPE
+#endif
+
+// BOOST_NO_CXX11_DECLTYPE_N3276
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_DECLTYPE_N3276
+#endif
+
+// BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#endif
+
+// BOOST_NO_CXX11_RVALUE_REFERENCES
+#if (BOOST_INTEL_CXX_VERSION >= 1300) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+// This is available from earlier Intel versions, but breaks Filesystem and other libraries:
+#  undef BOOST_NO_CXX11_RVALUE_REFERENCES
+#endif
+
+// BOOST_NO_CXX11_STATIC_ASSERT
+#if (BOOST_INTEL_CXX_VERSION >= 1110) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_STATIC_ASSERT
+#endif
+
+// BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#endif
+
+// BOOST_NO_CXX11_VARIADIC_MACROS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40200)) && (!defined(_MSC_VER) || (_MSC_VER >= 1400))
+#  undef BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+
+// BOOST_NO_CXX11_AUTO_DECLARATIONS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_AUTO_DECLARATIONS
+#endif
+
+// BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#endif
+
+// BOOST_NO_CXX11_CHAR16_T
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+#  undef BOOST_NO_CXX11_CHAR16_T
+#endif
+
+// BOOST_NO_CXX11_CHAR32_T
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+#  undef BOOST_NO_CXX11_CHAR32_T
+#endif
+
+// BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#endif
+
+// BOOST_NO_CXX11_DELETED_FUNCTIONS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_DELETED_FUNCTIONS
+#endif
+
+// BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))
+#  undef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#endif
+
+// BOOST_NO_CXX11_SCOPED_ENUMS
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40501)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))
+// This is available but broken in earlier Intel releases.
+#  undef BOOST_NO_CXX11_SCOPED_ENUMS
+#endif
+
+// BOOST_NO_SFINAE_EXPR
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+#  undef BOOST_NO_SFINAE_EXPR
+#endif
+
+// BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+// This is available in earlier Intel releases, but breaks Multiprecision:
+#  undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#endif
+
+// BOOST_NO_CXX11_LAMBDAS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))
+#  undef BOOST_NO_CXX11_LAMBDAS
+#endif
+
+// BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500))
+#  undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#endif
+
+// BOOST_NO_CXX11_RANGE_BASED_FOR
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))
+#  undef BOOST_NO_CXX11_RANGE_BASED_FOR
+#endif
+
+// BOOST_NO_CXX11_RAW_LITERALS
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_RAW_LITERALS
+#endif
+
+// BOOST_NO_CXX11_UNICODE_LITERALS
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+#  undef BOOST_NO_CXX11_UNICODE_LITERALS
+#endif
+
+// BOOST_NO_CXX11_NOEXCEPT
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+// Available in earlier Intel release, but generates errors when used with 
+// conditional exception specifications, for example in multiprecision:
+#  undef BOOST_NO_CXX11_NOEXCEPT
+#endif
+
+// BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))
+#  undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#endif
+
+// BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))
+#  undef BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#endif
+
+// BOOST_NO_CXX11_ALIGNAS
+#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))
+#  undef BOOST_NO_CXX11_ALIGNAS
+#endif
+
+// BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))
+#  undef BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#endif
+
+// BOOST_NO_CXX11_INLINE_NAMESPACES
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))
+#  undef BOOST_NO_CXX11_INLINE_NAMESPACES
+#endif
+
+// BOOST_NO_CXX11_REF_QUALIFIERS
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))
+#  undef BOOST_NO_CXX11_REF_QUALIFIERS
+#endif
+
+// BOOST_NO_CXX11_FINAL
+#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))
+#  undef BOOST_NO_CXX11_FINAL
+#endif
+
+#endif
+
+//
+// Broken in all versions up to 15:
+#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
+
+#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION <= 1310)
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#endif
+
+#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION == 1400)
+// A regression in Intel's compiler means that <tuple> seems to be broken in this release as well as <future> :
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#endif
+
+#if (BOOST_INTEL_CXX_VERSION < 1200)
+//
+// fenv.h appears not to work with Intel prior to 12.0:
+//
+#  define BOOST_NO_FENV_H
+#endif
+
+// Intel 13.10 fails to access defaulted functions of a base class declared in private or protected sections,
+// producing the following errors:
+// error #453: protected function "..." (declared at ...") is not accessible through a "..." pointer or object
+#if (BOOST_INTEL_CXX_VERSION <= 1310)
+#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1600)
+#  define BOOST_HAS_STDINT_H
+#endif
+
+#if defined(__LP64__) && defined(__GNUC__) && (BOOST_INTEL_CXX_VERSION >= 1310) && !defined(__CUDACC__)
+#  define BOOST_HAS_INT128
+#endif
+
+#endif
+//
+// last known and checked version:
+#if (BOOST_INTEL_CXX_VERSION > 1500)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  elif defined(_MSC_VER)
+//
+//      We don't emit this warning any more, since we have so few
+//      defect macros set anyway (just the one).
+//
+//#     pragma message("Unknown compiler version - please run the configure tests and report the results")
+#  endif
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/kai.hpp b/gatb-core/thirdparty/boost/config/compiler/kai.hpp
new file mode 100644
index 0000000..2337e6a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/kai.hpp
@@ -0,0 +1,33 @@
+//  (C) Copyright John Maddock 2001. 
+//  (C) Copyright David Abrahams 2002. 
+//  (C) Copyright Aleksey Gurtovoy 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Kai C++ compiler setup:
+
+#include "boost/config/compiler/common_edg.hpp"
+
+#   if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG)
+      // at least on Sun, the contents of <cwchar> is not in namespace std
+#     define BOOST_NO_STDC_NAMESPACE
+#   endif
+
+// see also common_edg.hpp which needs a special check for __KCC
+# if !defined(_EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)
+#     define BOOST_NO_EXCEPTIONS
+# endif
+
+//
+// last known and checked version is 4001:
+#if (__KCC_VERSION > 4001)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/metrowerks.hpp b/gatb-core/thirdparty/boost/config/compiler/metrowerks.hpp
new file mode 100644
index 0000000..c930143
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/metrowerks.hpp
@@ -0,0 +1,179 @@
+//  (C) Copyright John Maddock 2001.
+//  (C) Copyright Darin Adler 2001.
+//  (C) Copyright Peter Dimov 2001.
+//  (C) Copyright David Abrahams 2001 - 2002.
+//  (C) Copyright Beman Dawes 2001 - 2003.
+//  (C) Copyright Stefan Slapeta 2004.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Metrowerks C++ compiler setup:
+
+// locale support is disabled when linking with the dynamic runtime
+#   ifdef _MSL_NO_LOCALE
+#     define BOOST_NO_STD_LOCALE
+#   endif
+
+#   if __MWERKS__ <= 0x2301  // 5.3
+#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+#     define BOOST_NO_POINTER_TO_MEMBER_CONST
+#     define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
+#     define BOOST_NO_MEMBER_TEMPLATE_KEYWORD
+#   endif
+
+#   if __MWERKS__ <= 0x2401  // 6.2
+//#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+#   endif
+
+#   if(__MWERKS__ <= 0x2407)  // 7.x
+#     define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS
+#     define BOOST_NO_UNREACHABLE_RETURN_DETECTION
+#   endif
+
+#   if(__MWERKS__ <= 0x3003)  // 8.x
+#     define BOOST_NO_SFINAE
+#    endif
+
+// the "|| !defined(BOOST_STRICT_CONFIG)" part should apply to the last
+// tested version *only*:
+#   if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6
+#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#     define BOOST_NO_IS_ABSTRACT
+#    endif
+
+#if !__option(wchar_type)
+#   define BOOST_NO_INTRINSIC_WCHAR_T
+#endif
+
+#if !__option(exceptions) && !defined(BOOST_NO_EXCEPTIONS)
+#   define BOOST_NO_EXCEPTIONS
+#endif
+
+#if (__INTEL__ && _WIN32) || (__POWERPC__ && macintosh)
+#   if __MWERKS__ == 0x3000
+#     define BOOST_COMPILER_VERSION 8.0
+#   elif __MWERKS__ == 0x3001
+#     define BOOST_COMPILER_VERSION 8.1
+#   elif __MWERKS__ == 0x3002
+#     define BOOST_COMPILER_VERSION 8.2
+#   elif __MWERKS__ == 0x3003
+#     define BOOST_COMPILER_VERSION 8.3
+#   elif __MWERKS__ == 0x3200
+#     define BOOST_COMPILER_VERSION 9.0
+#   elif __MWERKS__ == 0x3201
+#     define BOOST_COMPILER_VERSION 9.1
+#   elif __MWERKS__ == 0x3202
+#     define BOOST_COMPILER_VERSION 9.2
+#   elif __MWERKS__ == 0x3204
+#     define BOOST_COMPILER_VERSION 9.3
+#   elif __MWERKS__ == 0x3205
+#     define BOOST_COMPILER_VERSION 9.4
+#   elif __MWERKS__ == 0x3206
+#     define BOOST_COMPILER_VERSION 9.5
+#   elif __MWERKS__ == 0x3207
+#     define BOOST_COMPILER_VERSION 9.6
+#   else
+#     define BOOST_COMPILER_VERSION __MWERKS__
+#   endif
+#else
+#  define BOOST_COMPILER_VERSION __MWERKS__
+#endif
+
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#if __MWERKS__ > 0x3206 && __option(rvalue_refs)
+#  define BOOST_HAS_RVALUE_REFS
+#else
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#endif
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#define BOOST_COMPILER "Metrowerks CodeWarrior C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION)
+
+//
+// versions check:
+// we don't support Metrowerks prior to version 5.3:
+#if __MWERKS__ < 0x2301
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version:
+#if (__MWERKS__ > 0x3205)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/mpw.hpp b/gatb-core/thirdparty/boost/config/compiler/mpw.hpp
new file mode 100644
index 0000000..76045bc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/mpw.hpp
@@ -0,0 +1,121 @@
+//  (C) Copyright John Maddock 2001 - 2002.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  MPW C++ compilers setup:
+
+#   if    defined(__SC__)
+#     define BOOST_COMPILER "MPW SCpp version " BOOST_STRINGIZE(__SC__)
+#   elif defined(__MRC__)
+#     define BOOST_COMPILER "MPW MrCpp version " BOOST_STRINGIZE(__MRC__)
+#   else
+#     error "Using MPW compiler configuration by mistake.  Please update."
+#   endif
+
+//
+// MPW 8.90:
+//
+#if (MPW_CPLUS <= 0x890) || !defined(BOOST_STRICT_CONFIG)
+#  define BOOST_NO_CV_SPECIALIZATIONS
+#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
+#  define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
+#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+#  define BOOST_NO_INTRINSIC_WCHAR_T
+#  define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#  define BOOST_NO_USING_TEMPLATE
+
+#  define BOOST_NO_CWCHAR
+#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+
+#  define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */
+
+#endif
+
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+//
+// versions check:
+// we don't support MPW prior to version 8.9:
+#if MPW_CPLUS < 0x890
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version is 0x890:
+#if (MPW_CPLUS > 0x890)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/nvcc.hpp b/gatb-core/thirdparty/boost/config/compiler/nvcc.hpp
new file mode 100644
index 0000000..bbe81f6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/nvcc.hpp
@@ -0,0 +1,16 @@
+//  (C) Copyright Eric Jourdanneau, Joel Falcou 2010
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  NVIDIA CUDA C++ compiler setup
+
+#ifndef BOOST_COMPILER
+#  define BOOST_COMPILER "NVIDIA CUDA C++ Compiler"
+#endif
+
+// NVIDIA Specific support
+// BOOST_GPU_ENABLED : Flag a function or a method as being enabled on the host and device
+#define BOOST_GPU_ENABLED __host__ __device__
diff --git a/gatb-core/thirdparty/boost/config/compiler/pathscale.hpp b/gatb-core/thirdparty/boost/config/compiler/pathscale.hpp
new file mode 100644
index 0000000..7c211c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/pathscale.hpp
@@ -0,0 +1,114 @@
+//  (C) Copyright Bryce Lelbach 2011
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+// PathScale EKOPath C++ Compiler
+
+#ifndef BOOST_COMPILER
+#  define BOOST_COMPILER "PathScale EKOPath C++ Compiler version " __PATHSCALE__
+#endif
+
+#if __PATHCC__ >= 4
+#  define BOOST_MSVC6_MEMBER_TEMPLATES
+#  define BOOST_HAS_UNISTD_H
+#  define BOOST_HAS_STDINT_H
+#  define BOOST_HAS_SIGACTION
+#  define BOOST_HAS_SCHED_YIELD
+#  define BOOST_HAS_THREADS
+#  define BOOST_HAS_PTHREADS
+#  define BOOST_HAS_PTHREAD_YIELD
+#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR
+#  define BOOST_HAS_NRVO
+#  define BOOST_HAS_NL_TYPES_H
+#  define BOOST_HAS_NANOSLEEP
+#  define BOOST_HAS_LONG_LONG
+#  define BOOST_HAS_LOG1P
+#  define BOOST_HAS_GETTIMEOFDAY
+#  define BOOST_HAS_EXPM1
+#  define BOOST_HAS_DIRENT_H
+#  define BOOST_HAS_CLOCK_GETTIME
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#  define BOOST_NO_SFINAE_EXPR
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_RANGE_BASED_FOR
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#  define BOOST_NO_CXX11_NULLPTR
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_NOEXCEPT
+#  define BOOST_NO_CXX11_LAMBDAS
+#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#  define BOOST_NO_CXX11_DECLTYPE
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#  define BOOST_NO_CXX11_CONSTEXPR
+#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#  define BOOST_NO_CXX11_CHAR32_T
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#  define BOOST_NO_CXX11_ALIGNAS
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#  define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/pgi.hpp b/gatb-core/thirdparty/boost/config/compiler/pgi.hpp
new file mode 100644
index 0000000..e5605c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/pgi.hpp
@@ -0,0 +1,155 @@
+//  (C) Copyright Noel Belcourt 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  PGI C++ compiler setup:
+
+#define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__
+#define BOOST_COMPILER "PGI compiler version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION)
+
+//
+// Threading support:
+// Turn this on unconditionally here, it will get turned off again later
+// if no threading API is detected.
+//
+
+#if __PGIC__ >= 11
+
+// options requested by configure --enable-test
+#define BOOST_HAS_PTHREADS
+#define BOOST_HAS_THREADS
+#define BOOST_HAS_PTHREAD_YIELD
+#define BOOST_HAS_NRVO
+#define BOOST_HAS_LONG_LONG
+
+// options --enable-test wants undefined
+#undef BOOST_NO_STDC_NAMESPACE
+#undef BOOST_NO_EXCEPTION_STD_NAMESPACE
+#undef BOOST_DEDUCED_TYPENAME
+
+#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+
+#elif __PGIC__ >= 10
+
+// options requested by configure --enable-test
+#define BOOST_HAS_THREADS
+#define BOOST_HAS_NRVO
+#define BOOST_HAS_LONG_LONG
+#if defined(linux) || defined(__linux) || defined(__linux__)
+#  define BOOST_HAS_STDINT_H
+#endif
+
+// options --enable-test wants undefined
+#undef BOOST_NO_STDC_NAMESPACE
+#undef BOOST_NO_EXCEPTION_STD_NAMESPACE
+#undef BOOST_DEDUCED_TYPENAME
+
+#elif __PGIC__ >= 7
+
+#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#define BOOST_NO_SWPRINTF
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+
+#else
+
+#  error "Pgi compiler not configured - please reconfigure"
+
+#endif
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_NUMERIC_LIMITS
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_SWPRINTF
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+
+#define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#define BOOST_NO_CXX11_HDR_TYPEINDEX
+#define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#define BOOST_NO_CXX11_HDR_TUPLE
+#define BOOST_NO_CXX11_HDR_THREAD
+#define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#define BOOST_NO_CXX11_HDR_REGEX
+#define BOOST_NO_CXX11_HDR_RATIO
+#define BOOST_NO_CXX11_HDR_RANDOM
+#define BOOST_NO_CXX11_HDR_MUTEX
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_HDR_FUTURE
+#define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#define BOOST_NO_CXX11_HDR_CODECVT
+#define BOOST_NO_CXX11_HDR_CHRONO
+#define BOOST_NO_CXX11_HDR_ARRAY
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+//
+// version check:
+// probably nothing to do here?
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/sgi_mipspro.hpp b/gatb-core/thirdparty/boost/config/compiler/sgi_mipspro.hpp
new file mode 100644
index 0000000..9068831
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/sgi_mipspro.hpp
@@ -0,0 +1,29 @@
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  SGI C++ compiler setup:
+
+#define BOOST_COMPILER "SGI Irix compiler version " BOOST_STRINGIZE(_COMPILER_VERSION)
+
+#include "boost/config/compiler/common_edg.hpp"
+
+//
+// Threading support:
+// Turn this on unconditionally here, it will get turned off again later
+// if no threading API is detected.
+//
+#define BOOST_HAS_THREADS
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+
+#undef BOOST_NO_SWPRINTF
+#undef BOOST_DEDUCED_TYPENAME
+
+//
+// version check:
+// probably nothing to do here?
+
+
diff --git a/gatb-core/thirdparty/boost/config/compiler/sunpro_cc.hpp b/gatb-core/thirdparty/boost/config/compiler/sunpro_cc.hpp
new file mode 100644
index 0000000..2fd6d3e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/sunpro_cc.hpp
@@ -0,0 +1,194 @@
+//  (C) Copyright John Maddock 2001.
+//  (C) Copyright Jens Maurer 2001 - 2003.
+//  (C) Copyright Peter Dimov 2002.
+//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.
+//  (C) Copyright David Abrahams 2002.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Sun C++ compiler setup:
+
+#    if __SUNPRO_CC <= 0x500
+#      define BOOST_NO_MEMBER_TEMPLATES
+#      define BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+#    endif
+
+#    if (__SUNPRO_CC <= 0x520)
+       //
+       // Sunpro 5.2 and earler:
+       //
+       // although sunpro 5.2 supports the syntax for
+       // inline initialization it often gets the value
+       // wrong, especially where the value is computed
+       // from other constants (J Maddock 6th May 2001)
+#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+
+       // Although sunpro 5.2 supports the syntax for
+       // partial specialization, it often seems to
+       // bind to the wrong specialization.  Better
+       // to disable it until suppport becomes more stable
+       // (J Maddock 6th May 2001).
+#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#    endif
+
+#    if (__SUNPRO_CC <= 0x530)
+       // Requesting debug info (-g) with Boost.Python results
+       // in an internal compiler error for "static const"
+       // initialized in-class.
+       //    >> Assertion:   (../links/dbg_cstabs.cc, line 611)
+       //         while processing ../test.cpp at line 0.
+       // (Jens Maurer according to Gottfried Ganssauge 04 Mar 2002)
+#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+
+       // SunPro 5.3 has better support for partial specialization,
+       // but breaks when compiling std::less<shared_ptr<T> >
+       // (Jens Maurer 4 Nov 2001).
+
+       // std::less specialization fixed as reported by George
+       // Heintzelman; partial specialization re-enabled
+       // (Peter Dimov 17 Jan 2002)
+
+//#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+       // integral constant expressions with 64 bit numbers fail
+#      define BOOST_NO_INTEGRAL_INT64_T
+#    endif
+
+#    if (__SUNPRO_CC < 0x570)
+#      define BOOST_NO_TEMPLATE_TEMPLATES
+       // see http://lists.boost.org/MailArchives/boost/msg47184.php
+       // and http://lists.boost.org/MailArchives/boost/msg47220.php
+#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+#      define BOOST_NO_SFINAE
+#      define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS
+#    endif
+#    if (__SUNPRO_CC <= 0x580)
+#      define BOOST_NO_IS_ABSTRACT
+#    endif
+
+#    if (__SUNPRO_CC <= 0x5100)
+       // Sun 5.10 may not correctly value-initialize objects of
+       // some user defined types, as was reported in April 2010
+       // (CR 6947016), and confirmed by Steve Clamage.
+       // (Niels Dekker, LKEB, May 2010).
+#      define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#    endif
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if __SUNPRO_CC > 0x500
+#  define BOOST_SYMBOL_EXPORT __global
+#  define BOOST_SYMBOL_IMPORT __global
+#  define BOOST_SYMBOL_VISIBLE __global
+#endif
+
+#if (__SUNPRO_CC < 0x5130)
+// C++03 features in 12.4:
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_ADL_BARRIER
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+
+#if (__SUNPRO_CC < 0x5130) || (__cplusplus < 201100)
+// C++11 only featuires in 12.4:
+#define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CXX11_CHAR16_T
+#define BOOST_NO_CXX11_CHAR32_T
+#define BOOST_NO_CXX11_CONSTEXPR
+#define BOOST_NO_CXX11_DECLTYPE
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_NO_CXX11_SCOPED_ENUMS
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_FINAL
+#endif
+
+//
+// Issues that effect all known versions:
+//
+// Variadic templates pass our test case, but enabling this
+// causes the compiler to issue a signal 11 and bail out
+// in various libraries.  The others fail our test cases.
+//
+#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+//
+// C++0x features
+//
+#  define BOOST_HAS_LONG_LONG
+
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+//
+// Version
+//
+
+#define BOOST_COMPILER "Sun compiler version " BOOST_STRINGIZE(__SUNPRO_CC)
+
+//
+// versions check:
+// we don't support sunpro prior to version 4:
+#if __SUNPRO_CC < 0x400
+#error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version is 0x590:
+#if (__SUNPRO_CC > 0x590)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/vacpp.hpp b/gatb-core/thirdparty/boost/config/compiler/vacpp.hpp
new file mode 100644
index 0000000..6c228ea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/vacpp.hpp
@@ -0,0 +1,162 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright Toon Knapen 2001 - 2003.
+//  (C) Copyright Lie-Quan Lee 2001.
+//  (C) Copyright Markus Schoepflin 2002 - 2003.
+//  (C) Copyright Beman Dawes 2002 - 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Visual Age (IBM) C++ compiler setup:
+
+#if __IBMCPP__ <= 501
+#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS
+#endif
+
+#if (__IBMCPP__ <= 502)
+// Actually the compiler supports inclass member initialization but it
+// requires a definition for the class member and it doesn't recognize
+// it as an integral constant expression when used as a template argument.
+#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+#  define BOOST_NO_INTEGRAL_INT64_T
+#  define BOOST_NO_MEMBER_TEMPLATE_KEYWORD
+#endif
+
+#if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG)
+#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS
+#endif
+
+#if (__IBMCPP__ <= 1110)
+// XL C++ V11.1 and earlier versions may not always value-initialize
+// a temporary object T(), when T is a non-POD aggregate class type.
+// Michael Wong (IBM Canada Ltd) has confirmed this issue and gave it
+// high priority. -- Niels Dekker (LKEB), May 2010.
+#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+#endif
+
+//
+// On AIX thread support seems to be indicated by _THREAD_SAFE:
+//
+#ifdef _THREAD_SAFE
+#  define BOOST_HAS_THREADS
+#endif
+
+#define BOOST_COMPILER "IBM Visual Age version " BOOST_STRINGIZE(__IBMCPP__)
+
+//
+// versions check:
+// we don't support Visual age prior to version 5:
+#if __IBMCPP__ < 500
+#error "Compiler not supported or configured - please reconfigure"
+#endif
+//
+// last known and checked version is 1210:
+#if (__IBMCPP__ > 1210)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  endif
+#endif
+
+// Some versions of the compiler have issues with default arguments on partial specializations
+#if __IBMCPP__ <= 1010
+#define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
+#endif
+
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#if ! __IBMCPP_AUTO_TYPEDEDUCTION
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#endif
+#if ! __IBMCPP_UTF_LITERAL__
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#endif
+#if ! __IBMCPP_CONSTEXPR
+#  define BOOST_NO_CXX11_CONSTEXPR
+#endif
+#if ! __IBMCPP_DECLTYPE
+#  define BOOST_NO_CXX11_DECLTYPE
+#else
+#  define BOOST_HAS_DECLTYPE
+#endif
+#define BOOST_NO_CXX11_DECLTYPE_N3276
+#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#if ! __IBMCPP_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#endif
+#if ! __IBMCPP_EXTERN_TEMPLATE
+#  define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#endif
+#if ! __IBMCPP_VARIADIC_TEMPLATES
+// not enabled separately at this time
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#endif
+#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#define BOOST_NO_CXX11_LAMBDAS
+#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#define BOOST_NO_CXX11_NOEXCEPT
+#define BOOST_NO_CXX11_NULLPTR
+#define BOOST_NO_CXX11_RANGE_BASED_FOR
+#define BOOST_NO_CXX11_RAW_LITERALS
+#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#if ! __IBMCPP_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#endif
+#if ! __IBMCPP_SCOPED_ENUM
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#endif
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#if ! __IBMCPP_STATIC_ASSERT
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#endif
+#define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#define BOOST_NO_CXX11_UNICODE_LITERALS
+#if ! __IBMCPP_VARIADIC_TEMPLATES
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#endif
+#if ! __C99_MACRO_WITH_VA_ARGS
+#  define BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+#define BOOST_NO_CXX11_ALIGNAS
+#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#define BOOST_NO_CXX11_INLINE_NAMESPACES
+#define BOOST_NO_CXX11_REF_QUALIFIERS
+#define BOOST_NO_CXX11_FINAL
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+#if (__cplusplus < 201304) // There's no SD6 check for this....
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/visualc.hpp b/gatb-core/thirdparty/boost/config/compiler/visualc.hpp
new file mode 100644
index 0000000..93908ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/visualc.hpp
@@ -0,0 +1,297 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright Darin Adler 2001 - 2002.
+//  (C) Copyright Peter Dimov 2001.
+//  (C) Copyright Aleksey Gurtovoy 2002.
+//  (C) Copyright David Abrahams 2002 - 2003.
+//  (C) Copyright Beman Dawes 2002 - 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+//
+//  Microsoft Visual C++ compiler setup:
+//
+//  We need to be careful with the checks in this file, as contrary
+//  to popular belief there are versions with _MSC_VER with the final
+//  digit non-zero (mainly the MIPS cross compiler).
+//
+//  So we either test _MSC_VER >= XXXX or else _MSC_VER < XXXX.
+//  No other comparisons (==, >, or <=) are safe.
+//
+
+#define BOOST_MSVC _MSC_VER
+
+//
+// Helper macro BOOST_MSVC_FULL_VER for use in Boost code:
+//
+#if _MSC_FULL_VER > 100000000
+#  define BOOST_MSVC_FULL_VER _MSC_FULL_VER
+#else
+#  define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10)
+#endif
+
+// Attempt to suppress VC6 warnings about the length of decorated names (obsolete):
+#pragma warning( disable : 4503 ) // warning: decorated name length exceeded
+
+#define BOOST_HAS_PRAGMA_ONCE
+
+//
+// versions check:
+// we don't support Visual C++ prior to version 7.1:
+#if _MSC_VER < 1310
+#  error "Compiler not supported or configured - please reconfigure"
+#endif
+
+#if _MSC_FULL_VER < 180020827
+#  define BOOST_NO_FENV_H
+#endif
+
+#if _MSC_VER < 1400
+// although a conforming signature for swprint exists in VC7.1
+// it appears not to actually work:
+#  define BOOST_NO_SWPRINTF
+// Our extern template tests also fail for this compiler:
+#  define BOOST_NO_CXX11_EXTERN_TEMPLATE
+// Variadic macros do not exist for VC7.1 and lower
+#  define BOOST_NO_CXX11_VARIADIC_MACROS
+#endif
+
+#if _MSC_VER < 1500  // 140X == VC++ 8.0
+#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#endif
+
+#if _MSC_VER < 1600  // 150X == VC++ 9.0
+   // A bug in VC9:
+#  define BOOST_NO_ADL_BARRIER
+#endif
+
+
+#ifndef _NATIVE_WCHAR_T_DEFINED
+#  define BOOST_NO_INTRINSIC_WCHAR_T
+#endif
+
+//
+// check for exception handling support:
+#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+
+//
+// __int64 support:
+//
+#define BOOST_HAS_MS_INT64
+#if defined(_MSC_EXTENSIONS) || (_MSC_VER >= 1400)
+#   define BOOST_HAS_LONG_LONG
+#else
+#   define BOOST_NO_LONG_LONG
+#endif
+#if (_MSC_VER >= 1400) && !defined(_DEBUG)
+#   define BOOST_HAS_NRVO
+#endif
+#if _MSC_VER >= 1600  // 160X == VC++ 10.0
+#  define BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#endif
+//
+// disable Win32 API's if compiler extensions are
+// turned off:
+//
+#if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32)
+#  define BOOST_DISABLE_WIN32
+#endif
+#if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI)
+#  define BOOST_NO_RTTI
+#endif
+
+//
+// TR1 features:
+//
+#if _MSC_VER >= 1700
+// # define BOOST_HAS_TR1_HASH			// don't know if this is true yet.
+// # define BOOST_HAS_TR1_TYPE_TRAITS	// don't know if this is true yet.
+# define BOOST_HAS_TR1_UNORDERED_MAP
+# define BOOST_HAS_TR1_UNORDERED_SET
+#endif
+
+//
+// C++0x features
+//
+//   See above for BOOST_NO_LONG_LONG
+
+// C++ features supported by VC++ 10 (aka 2010)
+//
+#if _MSC_VER < 1600
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#  define BOOST_NO_CXX11_LAMBDAS
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#  define BOOST_NO_CXX11_NULLPTR
+#  define BOOST_NO_CXX11_DECLTYPE
+#endif // _MSC_VER < 1600
+
+#if _MSC_VER >= 1600
+#  define BOOST_HAS_STDINT_H
+#endif
+
+// C++11 features supported by VC++ 11 (aka 2012)
+//
+#if _MSC_VER < 1700
+#  define BOOST_NO_CXX11_FINAL
+#  define BOOST_NO_CXX11_RANGE_BASED_FOR
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#endif // _MSC_VER < 1700
+
+// C++11 features supported by VC++ 12 (aka 2013).
+//
+#if _MSC_FULL_VER < 180020827
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#endif
+
+// C++11 features supported by VC++ 14 (aka 2015)
+//
+#if (_MSC_FULL_VER < 190023026)
+#  define BOOST_NO_CXX11_NOEXCEPT
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#  define BOOST_NO_CXX11_ALIGNAS
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+
+// MSVC including version 14 has not yet completely
+// implemented value-initialization, as is reported:
+// "VC++ does not value-initialize members of derived classes without
+// user-declared constructor", reported in 2009 by Sylvester Hesp:
+// https://connect.microsoft.com/VisualStudio/feedback/details/484295
+// "Presence of copy constructor breaks member class initialization",
+// reported in 2009 by Alex Vakulenko:
+// https://connect.microsoft.com/VisualStudio/feedback/details/499606
+// "Value-initialization in new-expression", reported in 2005 by
+// Pavel Kuznetsov (MetaCommunications Engineering):
+// https://connect.microsoft.com/VisualStudio/feedback/details/100744
+// Reported again by John Maddock in 2015 for VC14:
+// https://connect.microsoft.com/VisualStudio/feedback/details/1582233/c-subobjects-still-not-value-initialized-correctly
+// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues
+// (Niels Dekker, LKEB, May 2010)
+#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+// C++11 features not supported by any versions
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+//
+// This is somewhat supported in VC14, but we may need to wait for
+// a service release before enabling:
+//
+#define BOOST_NO_CXX11_CONSTEXPR
+
+// C++ 14:
+#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+//
+// prefix and suffix headers:
+//
+#ifndef BOOST_ABI_PREFIX
+#  define BOOST_ABI_PREFIX "boost/config/abi/msvc_prefix.hpp"
+#endif
+#ifndef BOOST_ABI_SUFFIX
+#  define BOOST_ABI_SUFFIX "boost/config/abi/msvc_suffix.hpp"
+#endif
+
+#ifndef BOOST_COMPILER
+// TODO:
+// these things are mostly bogus. 1200 means version 12.0 of the compiler. The
+// artificial versions assigned to them only refer to the versions of some IDE
+// these compilers have been shipped with, and even that is not all of it. Some
+// were shipped with freely downloadable SDKs, others as crosscompilers in eVC.
+// IOW, you can't use these 'versions' in any sensible way. Sorry.
+# if defined(UNDER_CE)
+#   if _MSC_VER < 1400
+      // Note: I'm not aware of any CE compiler with version 13xx
+#      if defined(BOOST_ASSERT_CONFIG)
+#         error "Unknown EVC++ compiler version - please run the configure tests and report the results"
+#      else
+#         pragma message("Unknown EVC++ compiler version - please run the configure tests and report the results")
+#      endif
+#   elif _MSC_VER < 1500
+#     define BOOST_COMPILER_VERSION evc8
+#   elif _MSC_VER < 1600
+#     define BOOST_COMPILER_VERSION evc9
+#   elif _MSC_VER < 1700
+#     define BOOST_COMPILER_VERSION evc10
+#   elif _MSC_VER < 1800 
+#     define BOOST_COMPILER_VERSION evc11 
+#   elif _MSC_VER < 1900 
+#     define BOOST_COMPILER_VERSION evc12
+#   elif _MSC_VER < 2000  
+#     define BOOST_COMPILER_VERSION evc14
+#   else
+#      if defined(BOOST_ASSERT_CONFIG)
+#         error "Unknown EVC++ compiler version - please run the configure tests and report the results"
+#      else
+#         pragma message("Unknown EVC++ compiler version - please run the configure tests and report the results")
+#      endif
+#   endif
+# else
+#   if _MSC_VER < 1310
+      // Note: Versions up to 7.0 aren't supported.
+#     define BOOST_COMPILER_VERSION 5.0
+#   elif _MSC_VER < 1300
+#     define BOOST_COMPILER_VERSION 6.0
+#   elif _MSC_VER < 1310
+#     define BOOST_COMPILER_VERSION 7.0
+#   elif _MSC_VER < 1400
+#     define BOOST_COMPILER_VERSION 7.1
+#   elif _MSC_VER < 1500
+#     define BOOST_COMPILER_VERSION 8.0
+#   elif _MSC_VER < 1600
+#     define BOOST_COMPILER_VERSION 9.0
+#   elif _MSC_VER < 1700
+#     define BOOST_COMPILER_VERSION 10.0
+#   elif _MSC_VER < 1800 
+#     define BOOST_COMPILER_VERSION 11.0
+#   elif _MSC_VER < 1900
+#     define BOOST_COMPILER_VERSION 12.0
+#   elif _MSC_VER < 2000
+#     define BOOST_COMPILER_VERSION 14.0
+#   else
+#     define BOOST_COMPILER_VERSION _MSC_VER
+#   endif
+# endif
+
+#  define BOOST_COMPILER "Microsoft Visual C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION)
+#endif
+
+//
+// last known and checked version is 19.00.23026 (VC++ 2015 RTM):
+#if (_MSC_VER > 1900)
+#  if defined(BOOST_ASSERT_CONFIG)
+#     error "Unknown compiler version - please run the configure tests and report the results"
+#  else
+#     pragma message("Unknown compiler version - please run the configure tests and report the results")
+#  endif
+#endif
diff --git a/gatb-core/thirdparty/boost/config/compiler/xlcpp.hpp b/gatb-core/thirdparty/boost/config/compiler/xlcpp.hpp
new file mode 100644
index 0000000..e369ece
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/compiler/xlcpp.hpp
@@ -0,0 +1,258 @@
+// (C) Copyright Douglas Gregor 2010
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  compiler setup for IBM XL C/C++ for Linux (Little Endian) based on clang.
+
+#define BOOST_HAS_PRAGMA_ONCE
+
+// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.
+#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
+#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#endif
+
+// When compiling with clang before __has_extension was defined,
+// even if one writes 'defined(__has_extension) && __has_extension(xxx)',
+// clang reports a compiler error. So the only workaround found is:
+
+#ifndef __has_extension
+#define __has_extension __has_feature
+#endif
+
+#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)
+#  define BOOST_NO_EXCEPTIONS
+#endif
+
+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)
+#  define BOOST_NO_RTTI
+#endif
+
+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)
+#  define BOOST_NO_TYPEID
+#endif
+
+#if defined(__int64) && !defined(__GNUC__)
+#  define BOOST_HAS_MS_INT64
+#endif
+
+#define BOOST_HAS_NRVO
+
+// Branch prediction hints
+#if defined(__has_builtin)
+#if __has_builtin(__builtin_expect)
+#define BOOST_LIKELY(x) __builtin_expect(x, 1)
+#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
+#endif
+#endif
+
+// Clang supports "long long" in all compilation modes.
+#define BOOST_HAS_LONG_LONG
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
+#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default")))
+#  define BOOST_SYMBOL_IMPORT
+#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
+#endif
+
+//
+// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
+// between switch labels.
+//
+#if __cplusplus >= 201103L && defined(__has_warning)
+#  if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
+#    define BOOST_FALLTHROUGH [[clang::fallthrough]]
+#  endif
+#endif
+
+#if !__has_feature(cxx_auto_type)
+#  define BOOST_NO_CXX11_AUTO_DECLARATIONS
+#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
+#endif
+
+//
+// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t
+//
+#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
+#  define BOOST_NO_CXX11_CHAR16_T
+#  define BOOST_NO_CXX11_CHAR32_T
+#endif
+
+#if !__has_feature(cxx_constexpr)
+#  define BOOST_NO_CXX11_CONSTEXPR
+#endif
+
+#if !__has_feature(cxx_decltype)
+#  define BOOST_NO_CXX11_DECLTYPE
+#endif
+
+#if !__has_feature(cxx_decltype_incomplete_return_types)
+#  define BOOST_NO_CXX11_DECLTYPE_N3276
+#endif
+
+#if !__has_feature(cxx_defaulted_functions)
+#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#endif
+
+#if !__has_feature(cxx_deleted_functions)
+#  define BOOST_NO_CXX11_DELETED_FUNCTIONS
+#endif
+
+#if !__has_feature(cxx_explicit_conversions)
+#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#endif
+
+#if !__has_feature(cxx_default_function_template_args)
+#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#endif
+
+#if !__has_feature(cxx_generalized_initializers)
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#endif
+
+#if !__has_feature(cxx_lambdas)
+#  define BOOST_NO_CXX11_LAMBDAS
+#endif
+
+#if !__has_feature(cxx_local_type_template_args)
+#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#endif
+
+#if !__has_feature(cxx_noexcept)
+#  define BOOST_NO_CXX11_NOEXCEPT
+#endif
+
+#if !__has_feature(cxx_nullptr)
+#  define BOOST_NO_CXX11_NULLPTR
+#endif
+
+#if !__has_feature(cxx_range_for)
+#  define BOOST_NO_CXX11_RANGE_BASED_FOR
+#endif
+
+#if !__has_feature(cxx_raw_string_literals)
+#  define BOOST_NO_CXX11_RAW_LITERALS
+#endif
+
+#if !__has_feature(cxx_reference_qualified_functions)
+#  define BOOST_NO_CXX11_REF_QUALIFIERS
+#endif
+
+#if !__has_feature(cxx_generalized_initializers)
+#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
+#endif
+
+#if !__has_feature(cxx_rvalue_references)
+#  define BOOST_NO_CXX11_RVALUE_REFERENCES
+#endif
+
+#if !__has_feature(cxx_strong_enums)
+#  define BOOST_NO_CXX11_SCOPED_ENUMS
+#endif
+
+#if !__has_feature(cxx_static_assert)
+#  define BOOST_NO_CXX11_STATIC_ASSERT
+#endif
+
+#if !__has_feature(cxx_alias_templates)
+#  define BOOST_NO_CXX11_TEMPLATE_ALIASES
+#endif
+
+#if !__has_feature(cxx_unicode_literals)
+#  define BOOST_NO_CXX11_UNICODE_LITERALS
+#endif
+
+#if !__has_feature(cxx_variadic_templates)
+#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#endif
+
+#if !__has_feature(cxx_user_literals)
+#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS
+#endif
+
+#if !__has_feature(cxx_alignas)
+#  define BOOST_NO_CXX11_ALIGNAS
+#endif
+
+#if !__has_feature(cxx_trailing_return)
+#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+#endif
+
+#if !__has_feature(cxx_inline_namespaces)
+#  define BOOST_NO_CXX11_INLINE_NAMESPACES
+#endif
+
+#if !__has_feature(cxx_override_control)
+#  define BOOST_NO_CXX11_FINAL
+#endif
+
+#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))
+#  define BOOST_NO_CXX14_BINARY_LITERALS
+#endif
+
+#if !__has_feature(__cxx_decltype_auto__)
+#  define BOOST_NO_CXX14_DECLTYPE_AUTO
+#endif
+
+#if !__has_feature(__cxx_aggregate_nsdmi__)
+#  define BOOST_NO_CXX14_AGGREGATE_NSDMI
+#endif
+
+#if !__has_feature(__cxx_init_captures__)
+#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
+#endif
+
+#if !__has_feature(__cxx_generic_lambdas__)
+#  define BOOST_NO_CXX14_GENERIC_LAMBDAS
+#endif
+
+// clang < 3.5 has a defect with dependent type, like following.
+//
+//  template <class T>
+//  constexpr typename enable_if<pred<T> >::type foo(T &)
+//  { } // error: no return statement in constexpr function
+//
+// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.
+// Therefore we don't care such case.
+//
+// Note that we can't check Clang version directly as the numbering system changes depending who's
+// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)
+// so instead verify that we have a feature that was introduced at the same time as working C++14
+// constexpr (generic lambda's in this case):
+//
+#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)
+#  define BOOST_NO_CXX14_CONSTEXPR
+#endif
+
+#if !__has_feature(__cxx_return_type_deduction__)
+#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
+#endif
+
+#if !__has_feature(__cxx_variable_templates__)
+#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES
+#endif
+
+#if __cplusplus < 201400
+// All versions with __cplusplus above this value seem to support this:
+#  define BOOST_NO_CXX14_DIGIT_SEPARATORS
+#endif
+
+
+// Unused attribute:
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#  define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
+#endif
+
+#ifndef BOOST_COMPILER
+#  define BOOST_COMPILER "Clang version " __clang_version__
+#endif
+
+// Macro used to identify the Clang compiler.
+#define BOOST_CLANG 1
+
diff --git a/gatb-core/thirdparty/boost/config/no_tr1/cmath.hpp b/gatb-core/thirdparty/boost/config/no_tr1/cmath.hpp
new file mode 100644
index 0000000..d8268d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/no_tr1/cmath.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The aim of this header is just to include <cmath> but to do
+// so in a way that does not result in recursive inclusion of
+// the Boost TR1 components if boost/tr1/tr1/cmath is in the
+// include search path.  We have to do this to avoid circular
+// dependencies:
+//
+
+#ifndef BOOST_CONFIG_CMATH
+#  define BOOST_CONFIG_CMATH
+
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_CONFIG_NO_CMATH_RECURSION
+#  endif
+
+#  include <cmath>
+
+#  ifdef BOOST_CONFIG_NO_CMATH_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_CONFIG_NO_CMATH_RECURSION
+#  endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/no_tr1/complex.hpp b/gatb-core/thirdparty/boost/config/no_tr1/complex.hpp
new file mode 100644
index 0000000..ca20092
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/no_tr1/complex.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The aim of this header is just to include <complex> but to do
+// so in a way that does not result in recursive inclusion of
+// the Boost TR1 components if boost/tr1/tr1/complex is in the
+// include search path.  We have to do this to avoid circular
+// dependencies:
+//
+
+#ifndef BOOST_CONFIG_COMPLEX
+#  define BOOST_CONFIG_COMPLEX
+
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_CONFIG_NO_COMPLEX_RECURSION
+#  endif
+
+#  include <complex>
+
+#  ifdef BOOST_CONFIG_NO_COMPLEX_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_CONFIG_NO_COMPLEX_RECURSION
+#  endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/no_tr1/functional.hpp b/gatb-core/thirdparty/boost/config/no_tr1/functional.hpp
new file mode 100644
index 0000000..e395efc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/no_tr1/functional.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The aim of this header is just to include <functional> but to do
+// so in a way that does not result in recursive inclusion of
+// the Boost TR1 components if boost/tr1/tr1/functional is in the
+// include search path.  We have to do this to avoid circular
+// dependencies:
+//
+
+#ifndef BOOST_CONFIG_FUNCTIONAL
+#  define BOOST_CONFIG_FUNCTIONAL
+
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_CONFIG_NO_FUNCTIONAL_RECURSION
+#  endif
+
+#  include <functional>
+
+#  ifdef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION
+#  endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/no_tr1/memory.hpp b/gatb-core/thirdparty/boost/config/no_tr1/memory.hpp
new file mode 100644
index 0000000..2b5d208
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/no_tr1/memory.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The aim of this header is just to include <memory> but to do
+// so in a way that does not result in recursive inclusion of
+// the Boost TR1 components if boost/tr1/tr1/memory is in the
+// include search path.  We have to do this to avoid circular
+// dependencies:
+//
+
+#ifndef BOOST_CONFIG_MEMORY
+#  define BOOST_CONFIG_MEMORY
+
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_CONFIG_NO_MEMORY_RECURSION
+#  endif
+
+#  include <memory>
+
+#  ifdef BOOST_CONFIG_NO_MEMORY_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_CONFIG_NO_MEMORY_RECURSION
+#  endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/no_tr1/utility.hpp b/gatb-core/thirdparty/boost/config/no_tr1/utility.hpp
new file mode 100644
index 0000000..dea8f11
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/no_tr1/utility.hpp
@@ -0,0 +1,28 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// The aim of this header is just to include <utility> but to do
+// so in a way that does not result in recursive inclusion of
+// the Boost TR1 components if boost/tr1/tr1/utility is in the
+// include search path.  We have to do this to avoid circular
+// dependencies:
+//
+
+#ifndef BOOST_CONFIG_UTILITY
+#  define BOOST_CONFIG_UTILITY
+
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_CONFIG_NO_UTILITY_RECURSION
+#  endif
+
+#  include <utility>
+
+#  ifdef BOOST_CONFIG_NO_UTILITY_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_CONFIG_NO_UTILITY_RECURSION
+#  endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/platform/aix.hpp b/gatb-core/thirdparty/boost/config/platform/aix.hpp
new file mode 100644
index 0000000..894ef42
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/aix.hpp
@@ -0,0 +1,33 @@
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  IBM/Aix specific config options:
+
+#define BOOST_PLATFORM "IBM Aix"
+
+#define BOOST_HAS_UNISTD_H
+#define BOOST_HAS_NL_TYPES_H
+#define BOOST_HAS_NANOSLEEP
+#define BOOST_HAS_CLOCK_GETTIME
+
+// This needs support in "boost/cstdint.hpp" exactly like FreeBSD.
+// This platform has header named <inttypes.h> which includes all
+// the things needed.
+#define BOOST_HAS_STDINT_H
+
+// Threading API's:
+#define BOOST_HAS_PTHREADS
+#define BOOST_HAS_PTHREAD_DELAY_NP
+#define BOOST_HAS_SCHED_YIELD
+//#define BOOST_HAS_PTHREAD_YIELD
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/amigaos.hpp b/gatb-core/thirdparty/boost/config/platform/amigaos.hpp
new file mode 100644
index 0000000..34bcf41
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/amigaos.hpp
@@ -0,0 +1,15 @@
+//  (C) Copyright John Maddock 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+#define BOOST_PLATFORM "AmigaOS"
+
+#define BOOST_DISABLE_THREADS
+#define BOOST_NO_CWCHAR
+#define BOOST_NO_STD_WSTRING
+#define BOOST_NO_INTRINSIC_WCHAR_T
+ 
+
diff --git a/gatb-core/thirdparty/boost/config/platform/beos.hpp b/gatb-core/thirdparty/boost/config/platform/beos.hpp
new file mode 100644
index 0000000..48c3d8d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/beos.hpp
@@ -0,0 +1,26 @@
+//  (C) Copyright John Maddock 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  BeOS specific config options:
+
+#define BOOST_PLATFORM "BeOS"
+
+#define BOOST_NO_CWCHAR
+#define BOOST_NO_CWCTYPE
+#define BOOST_HAS_UNISTD_H
+
+#define BOOST_HAS_BETHREADS
+
+#ifndef BOOST_DISABLE_THREADS
+#  define BOOST_HAS_THREADS
+#endif
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
+ 
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/bsd.hpp b/gatb-core/thirdparty/boost/config/platform/bsd.hpp
new file mode 100644
index 0000000..a014297
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/bsd.hpp
@@ -0,0 +1,86 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Darin Adler 2001. 
+//  (C) Copyright Douglas Gregor 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  generic BSD config options:
+
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
+#error "This platform is not BSD"
+#endif
+
+#ifdef __FreeBSD__
+#define BOOST_PLATFORM "FreeBSD " BOOST_STRINGIZE(__FreeBSD__)
+#elif defined(__NetBSD__)
+#define BOOST_PLATFORM "NetBSD " BOOST_STRINGIZE(__NetBSD__)
+#elif defined(__OpenBSD__)
+#define BOOST_PLATFORM "OpenBSD " BOOST_STRINGIZE(__OpenBSD__)
+#elif defined(__DragonFly__)
+#define BOOST_PLATFORM "DragonFly " BOOST_STRINGIZE(__DragonFly__)
+#endif
+
+//
+// is this the correct version check?
+// FreeBSD has <nl_types.h> but does not
+// advertise the fact in <unistd.h>:
+//
+#if (defined(__FreeBSD__) && (__FreeBSD__ >= 3)) || defined(__DragonFly__)
+#  define BOOST_HAS_NL_TYPES_H
+#endif
+
+//
+// FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in <pthread.h>
+// and not in <unistd.h>
+//
+#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\
+   || defined(__OpenBSD__) || defined(__DragonFly__) 
+#  define BOOST_HAS_PTHREADS
+#endif
+
+//
+// No wide character support in the BSD header files:
+//
+#if defined(__NetBSD__)
+#define __NetBSD_GCC__ (__GNUC__         * 1000000 \
+                       + __GNUC_MINOR__ *    1000 \
+                       + __GNUC_PATCHLEVEL__)
+// XXX - the following is required until c++config.h
+//       defines _GLIBCXX_HAVE_SWPRINTF and friends
+//       or the preprocessor conditionals are removed
+//       from the cwchar header.
+#define _GLIBCXX_HAVE_SWPRINTF 1
+#endif
+
+#if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \
+      || (defined(__NetBSD_GCC__) && (__NetBSD_GCC__ >= 2095003)) || defined(__DragonFly__))
+#  define BOOST_NO_CWCHAR
+#endif
+//
+// The BSD <ctype.h> has macros only, no functions:
+//
+#if !defined(__OpenBSD__) || defined(__DragonFly__)
+#  define BOOST_NO_CTYPE_FUNCTIONS
+#endif
+
+//
+// thread API's not auto detected:
+//
+#define BOOST_HAS_SCHED_YIELD
+#define BOOST_HAS_NANOSLEEP
+#define BOOST_HAS_GETTIMEOFDAY
+#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#define BOOST_HAS_SIGACTION
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/cray.hpp b/gatb-core/thirdparty/boost/config/platform/cray.hpp
new file mode 100644
index 0000000..5c476e4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/cray.hpp
@@ -0,0 +1,18 @@
+//  (C) Copyright John Maddock 2011.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+//  See http://www.boost.org for most recent version.
+
+//  SGI Irix specific config options:
+
+#define BOOST_PLATFORM "Cray"
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/cygwin.hpp b/gatb-core/thirdparty/boost/config/platform/cygwin.hpp
new file mode 100644
index 0000000..b7ef572
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/cygwin.hpp
@@ -0,0 +1,58 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  cygwin specific config options:
+
+#define BOOST_PLATFORM "Cygwin"
+#define BOOST_HAS_DIRENT_H
+#define BOOST_HAS_LOG1P
+#define BOOST_HAS_EXPM1
+
+//
+// Threading API:
+// See if we have POSIX threads, if we do use them, otherwise
+// revert to native Win threads.
+#define BOOST_HAS_UNISTD_H
+#include <unistd.h>
+#if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS)
+#  define BOOST_HAS_PTHREADS
+#  define BOOST_HAS_SCHED_YIELD
+#  define BOOST_HAS_GETTIMEOFDAY
+#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#  define BOOST_HAS_SIGACTION
+#else
+#  if !defined(BOOST_HAS_WINTHREADS)
+#     define BOOST_HAS_WINTHREADS
+#  endif
+#  define BOOST_HAS_FTIME
+#endif
+
+//
+// find out if we have a stdint.h, there should be a better way to do this:
+//
+#include <sys/types.h>
+#ifdef _STDINT_H
+#define BOOST_HAS_STDINT_H
+#endif
+
+/// Cygwin has no fenv.h
+#define BOOST_NO_FENV_H
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
+
+//
+// Cygwin lies about XSI conformance, there is no nl_types.h:
+//
+#ifdef BOOST_HAS_NL_TYPES_H
+#  undef BOOST_HAS_NL_TYPES_H
+#endif
+ 
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/haiku.hpp b/gatb-core/thirdparty/boost/config/platform/haiku.hpp
new file mode 100644
index 0000000..750866c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/haiku.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright Jessica Hamilton 2014.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Haiku specific config options:
+
+#define BOOST_PLATFORM "Haiku"
+
+#define BOOST_HAS_UNISTD_H
+#define BOOST_HAS_STDINT_H
+
+#ifndef BOOST_DISABLE_THREADS
+#  define BOOST_HAS_THREADS
+#endif
+
+#define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+
+//
+// thread API's not auto detected:
+//
+#define BOOST_HAS_SCHED_YIELD
+#define BOOST_HAS_GETTIMEOFDAY
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
diff --git a/gatb-core/thirdparty/boost/config/platform/hpux.hpp b/gatb-core/thirdparty/boost/config/platform/hpux.hpp
new file mode 100644
index 0000000..19ce68e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/hpux.hpp
@@ -0,0 +1,87 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2001 - 2003. 
+//  (C) Copyright David Abrahams 2002. 
+//  (C) Copyright Toon Knapen 2003. 
+//  (C) Copyright Boris Gubenko 2006 - 2007.
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  hpux specific config options:
+
+#define BOOST_PLATFORM "HP-UX"
+
+// In principle, HP-UX has a nice <stdint.h> under the name <inttypes.h>
+// However, it has the following problem:
+// Use of UINT32_C(0) results in "0u l" for the preprocessed source
+// (verifyable with gcc 2.95.3)
+#if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__HP_aCC)
+#  define BOOST_HAS_STDINT_H
+#endif
+
+#if !(defined(__HP_aCC) || !defined(_INCLUDE__STDC_A1_SOURCE))
+#  define BOOST_NO_SWPRINTF
+#endif
+#if defined(__HP_aCC) && !defined(_INCLUDE__STDC_A1_SOURCE)
+#  define BOOST_NO_CWCTYPE
+#endif
+
+#if defined(__GNUC__)
+#  if (__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 3))
+      // GNU C on HP-UX does not support threads (checked up to gcc 3.3)
+#     define BOOST_DISABLE_THREADS
+#  elif !defined(BOOST_DISABLE_THREADS)
+      // threads supported from gcc-3.3 onwards:
+#     define BOOST_HAS_THREADS
+#     define BOOST_HAS_PTHREADS
+#  endif
+#elif defined(__HP_aCC) && !defined(BOOST_DISABLE_THREADS)
+#  define BOOST_HAS_PTHREADS
+#endif
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+// the following are always available:
+#ifndef BOOST_HAS_GETTIMEOFDAY
+#  define BOOST_HAS_GETTIMEOFDAY
+#endif
+#ifndef BOOST_HAS_SCHED_YIELD
+#    define BOOST_HAS_SCHED_YIELD
+#endif
+#ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#endif
+#ifndef BOOST_HAS_NL_TYPES_H
+#    define BOOST_HAS_NL_TYPES_H
+#endif
+#ifndef BOOST_HAS_NANOSLEEP
+#    define BOOST_HAS_NANOSLEEP
+#endif
+#ifndef BOOST_HAS_GETTIMEOFDAY
+#    define BOOST_HAS_GETTIMEOFDAY
+#endif
+#ifndef BOOST_HAS_DIRENT_H
+#    define BOOST_HAS_DIRENT_H
+#endif
+#ifndef BOOST_HAS_CLOCK_GETTIME
+#    define BOOST_HAS_CLOCK_GETTIME
+#endif
+#ifndef BOOST_HAS_SIGACTION
+#  define BOOST_HAS_SIGACTION
+#endif
+#ifndef BOOST_HAS_NRVO 
+#  ifndef __parisc
+#    define BOOST_HAS_NRVO
+#  endif
+#endif
+#ifndef BOOST_HAS_LOG1P 
+#  define BOOST_HAS_LOG1P
+#endif
+#ifndef BOOST_HAS_EXPM1
+#  define BOOST_HAS_EXPM1
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/platform/irix.hpp b/gatb-core/thirdparty/boost/config/platform/irix.hpp
new file mode 100644
index 0000000..aeae49c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/irix.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+//  See http://www.boost.org for most recent version.
+
+//  SGI Irix specific config options:
+
+#define BOOST_PLATFORM "SGI Irix"
+
+#define BOOST_NO_SWPRINTF 
+//
+// these are not auto detected by POSIX feature tests:
+//
+#define BOOST_HAS_GETTIMEOFDAY
+#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+
+#ifdef __GNUC__
+   // GNU C on IRIX does not support threads (checked up to gcc 3.3)
+#  define BOOST_DISABLE_THREADS
+#endif
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/linux.hpp b/gatb-core/thirdparty/boost/config/platform/linux.hpp
new file mode 100644
index 0000000..6fa5f45
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/linux.hpp
@@ -0,0 +1,105 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  linux specific config options:
+
+#define BOOST_PLATFORM "linux"
+
+// make sure we have __GLIBC_PREREQ if available at all
+#ifdef __cplusplus
+#include <cstdlib>
+#else
+#include <stdlib.h>
+#endif
+
+//
+// <stdint.h> added to glibc 2.1.1
+// We can only test for 2.1 though:
+//
+#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)))
+   // <stdint.h> defines int64_t unconditionally, but <sys/types.h> defines
+   // int64_t only if __GNUC__.  Thus, assume a fully usable <stdint.h>
+   // only when using GCC.
+#  if defined __GNUC__
+#    define BOOST_HAS_STDINT_H
+#  endif
+#endif
+
+#if defined(__LIBCOMO__)
+   //
+   // como on linux doesn't have std:: c functions:
+   // NOTE: versions of libcomo prior to beta28 have octal version numbering,
+   // e.g. version 25 is 21 (dec)
+   //
+#  if __LIBCOMO_VERSION__ <= 20
+#    define BOOST_NO_STDC_NAMESPACE
+#  endif
+
+#  if __LIBCOMO_VERSION__ <= 21
+#    define BOOST_NO_SWPRINTF
+#  endif
+
+#endif
+
+//
+// If glibc is past version 2 then we definitely have
+// gettimeofday, earlier versions may or may not have it:
+//
+#if defined(__GLIBC__) && (__GLIBC__ >= 2)
+#  define BOOST_HAS_GETTIMEOFDAY
+#endif
+
+#ifdef __USE_POSIX199309
+#  define BOOST_HAS_NANOSLEEP
+#endif
+
+#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
+// __GLIBC_PREREQ is available since 2.1.2
+
+   // swprintf is available since glibc 2.2.0
+#  if !__GLIBC_PREREQ(2,2) || (!defined(__USE_ISOC99) && !defined(__USE_UNIX98))
+#    define BOOST_NO_SWPRINTF
+#  endif
+#else
+#  define BOOST_NO_SWPRINTF
+#endif
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+#ifdef __USE_GNU
+#define BOOST_HAS_PTHREAD_YIELD
+#endif
+
+#ifndef __GNUC__
+//
+// if the compiler is not gcc we still need to be able to parse
+// the GNU system headers, some of which (mainly <stdint.h>)
+// use GNU specific extensions:
+//
+#  ifndef __extension__
+#     define __extension__
+#  endif
+#  ifndef __const__
+#     define __const__ const
+#  endif
+#  ifndef __volatile__
+#     define __volatile__ volatile
+#  endif
+#  ifndef __signed__
+#     define __signed__ signed
+#  endif
+#  ifndef __typeof__
+#     define __typeof__ typeof
+#  endif
+#  ifndef __inline__
+#     define __inline__ inline
+#  endif
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/macos.hpp b/gatb-core/thirdparty/boost/config/platform/macos.hpp
new file mode 100644
index 0000000..6d876b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/macos.hpp
@@ -0,0 +1,87 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Darin Adler 2001 - 2002. 
+//  (C) Copyright Bill Kempf 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Mac OS specific config options:
+
+#define BOOST_PLATFORM "Mac OS"
+
+#if __MACH__ && !defined(_MSL_USING_MSL_C)
+
+// Using the Mac OS X system BSD-style C library.
+
+#  ifndef BOOST_HAS_UNISTD_H
+#    define BOOST_HAS_UNISTD_H
+#  endif
+//
+// Begin by including our boilerplate code for POSIX
+// feature detection, this is safe even when using
+// the MSL as Metrowerks supply their own <unistd.h>
+// to replace the platform-native BSD one. G++ users
+// should also always be able to do this on MaxOS X.
+//
+#  include <boost/config/posix_features.hpp>
+#  ifndef BOOST_HAS_STDINT_H
+#     define BOOST_HAS_STDINT_H
+#  endif
+
+//
+// BSD runtime has pthreads, sigaction, sched_yield and gettimeofday,
+// of these only pthreads are advertised in <unistd.h>, so set the 
+// other options explicitly:
+//
+#  define BOOST_HAS_SCHED_YIELD
+#  define BOOST_HAS_GETTIMEOFDAY
+#  define BOOST_HAS_SIGACTION
+
+#  if (__GNUC__ < 3) && !defined( __APPLE_CC__)
+
+// GCC strange "ignore std" mode works better if you pretend everything
+// is in the std namespace, for the most part.
+
+#    define BOOST_NO_STDC_NAMESPACE
+#  endif
+
+#  if (__GNUC__ == 4)
+
+// Both gcc and intel require these.  
+#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#    define BOOST_HAS_NANOSLEEP
+
+#  endif
+
+#else
+
+// Using the MSL C library.
+
+// We will eventually support threads in non-Carbon builds, but we do
+// not support this yet.
+#  if ( defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON ) || ( defined(TARGET_CARBON) && TARGET_CARBON )
+
+#  if !defined(BOOST_HAS_PTHREADS)
+// MPTasks support is deprecated/removed from Boost:
+//#    define BOOST_HAS_MPTASKS
+#  elif ( __dest_os == __mac_os_x )
+// We are doing a Carbon/Mach-O/MSL build which has pthreads, but only the
+// gettimeofday and no posix.
+#  define BOOST_HAS_GETTIMEOFDAY
+#  endif
+
+#ifdef BOOST_HAS_PTHREADS
+#  define BOOST_HAS_THREADS
+#endif
+
+// The remote call manager depends on this.
+#    define BOOST_BIND_ENABLE_PASCAL
+
+#  endif
+
+#endif
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/qnxnto.hpp b/gatb-core/thirdparty/boost/config/platform/qnxnto.hpp
new file mode 100644
index 0000000..b1377c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/qnxnto.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright Jim Douglas 2005. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  QNX specific config options:
+
+#define BOOST_PLATFORM "QNX"
+
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+// QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h
+// or log1p and expm1:
+#undef  BOOST_HAS_NL_TYPES_H
+#undef  BOOST_HAS_LOG1P
+#undef  BOOST_HAS_EXPM1
+
+#define BOOST_HAS_PTHREADS
+#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+
+#define BOOST_HAS_GETTIMEOFDAY
+#define BOOST_HAS_CLOCK_GETTIME
+#define BOOST_HAS_NANOSLEEP
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/solaris.hpp b/gatb-core/thirdparty/boost/config/platform/solaris.hpp
new file mode 100644
index 0000000..6e4efc9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/solaris.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  sun specific config options:
+
+#define BOOST_PLATFORM "Sun Solaris"
+
+#define BOOST_HAS_GETTIMEOFDAY
+
+// boilerplate code:
+#define BOOST_HAS_UNISTD_H
+#include <boost/config/posix_features.hpp>
+
+//
+// pthreads don't actually work with gcc unless _PTHREADS is defined:
+//
+#if defined(__GNUC__) && defined(_POSIX_THREADS) && !defined(_PTHREADS)
+# undef BOOST_HAS_PTHREADS
+#endif
+
+#define BOOST_HAS_STDINT_H 
+#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE 
+#define BOOST_HAS_LOG1P 
+#define BOOST_HAS_EXPM1
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/symbian.hpp b/gatb-core/thirdparty/boost/config/platform/symbian.hpp
new file mode 100644
index 0000000..e02a778
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/symbian.hpp
@@ -0,0 +1,97 @@
+//  (C) Copyright Yuriy Krasnoschek 2009. 
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  symbian specific config options:
+
+
+#define BOOST_PLATFORM "Symbian"
+#define BOOST_SYMBIAN 1
+
+
+#if defined(__S60_3X__)
+// Open C / C++ plugin was introdused in this SDK, earlier versions don't have CRT / STL
+#  define BOOST_S60_3rd_EDITION_FP2_OR_LATER_SDK
+// make sure we have __GLIBC_PREREQ if available at all
+#ifdef __cplusplus
+#include <cstdlib>
+#else
+#include <stdlib.h>
+#endif// boilerplate code:
+#  define BOOST_HAS_UNISTD_H
+#  include <boost/config/posix_features.hpp>
+// S60 SDK defines _POSIX_VERSION as POSIX.1
+#  ifndef BOOST_HAS_STDINT_H
+#    define BOOST_HAS_STDINT_H
+#  endif
+#  ifndef BOOST_HAS_GETTIMEOFDAY
+#    define BOOST_HAS_GETTIMEOFDAY
+#  endif
+#  ifndef BOOST_HAS_DIRENT_H
+#    define BOOST_HAS_DIRENT_H
+#  endif
+#  ifndef BOOST_HAS_SIGACTION
+#    define BOOST_HAS_SIGACTION
+#  endif
+#  ifndef BOOST_HAS_PTHREADS
+#    define BOOST_HAS_PTHREADS
+#  endif
+#  ifndef BOOST_HAS_NANOSLEEP
+#    define BOOST_HAS_NANOSLEEP
+#  endif
+#  ifndef BOOST_HAS_SCHED_YIELD
+#    define BOOST_HAS_SCHED_YIELD
+#  endif
+#  ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#  endif
+#  ifndef BOOST_HAS_LOG1P
+#    define BOOST_HAS_LOG1P
+#  endif
+#  ifndef BOOST_HAS_EXPM1
+#    define BOOST_HAS_EXPM1
+#  endif
+#  ifndef BOOST_POSIX_API
+#    define BOOST_POSIX_API
+#  endif
+// endianess support
+#  include <sys/endian.h>
+// Symbian SDK provides _BYTE_ORDER instead of __BYTE_ORDER
+#  ifndef __LITTLE_ENDIAN
+#    ifdef _LITTLE_ENDIAN
+#      define __LITTLE_ENDIAN _LITTLE_ENDIAN
+#    else
+#      define __LITTLE_ENDIAN 1234
+#    endif
+#  endif
+#  ifndef __BIG_ENDIAN
+#    ifdef _BIG_ENDIAN
+#      define __BIG_ENDIAN _BIG_ENDIAN
+#    else
+#      define __BIG_ENDIAN 4321
+#    endif
+#  endif
+#  ifndef __BYTE_ORDER
+#    define __BYTE_ORDER __LITTLE_ENDIAN // Symbian is LE
+#  endif
+// Known limitations
+#  define BOOST_ASIO_DISABLE_SERIAL_PORT
+#  define BOOST_DATE_TIME_NO_LOCALE
+#  define BOOST_NO_STD_WSTRING
+#  define BOOST_EXCEPTION_DISABLE
+#  define BOOST_NO_EXCEPTIONS
+
+#else // TODO: More platform support e.g. UIQ
+#  error "Unsuppoted Symbian SDK"
+#endif
+
+#if defined(__WINSCW__) && !defined(BOOST_DISABLE_WIN32)
+#  define BOOST_DISABLE_WIN32 // winscw defines WIN32 macro
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/config/platform/vms.hpp b/gatb-core/thirdparty/boost/config/platform/vms.hpp
new file mode 100644
index 0000000..f70efcf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/vms.hpp
@@ -0,0 +1,25 @@
+//  (C) Copyright Artyom Beilis 2010.  
+//  Use, modification and distribution are subject to the  
+//  Boost Software License, Version 1.0. (See accompanying file  
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
+
+#ifndef BOOST_CONFIG_PLATFORM_VMS_HPP 
+#define BOOST_CONFIG_PLATFORM_VMS_HPP 
+
+#define BOOST_PLATFORM "OpenVMS" 
+
+#undef  BOOST_HAS_STDINT_H 
+#define BOOST_HAS_UNISTD_H 
+#define BOOST_HAS_NL_TYPES_H 
+#define BOOST_HAS_GETTIMEOFDAY 
+#define BOOST_HAS_DIRENT_H 
+#define BOOST_HAS_PTHREADS 
+#define BOOST_HAS_NANOSLEEP 
+#define BOOST_HAS_CLOCK_GETTIME 
+#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE 
+#define BOOST_HAS_LOG1P 
+#define BOOST_HAS_EXPM1 
+#define BOOST_HAS_THREADS 
+#undef  BOOST_HAS_SCHED_YIELD 
+
+#endif 
diff --git a/gatb-core/thirdparty/boost/config/platform/vxworks.hpp b/gatb-core/thirdparty/boost/config/platform/vxworks.hpp
new file mode 100644
index 0000000..cdda015
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/vxworks.hpp
@@ -0,0 +1,369 @@
+//  (C) Copyright Dustin Spicuzza 2009.
+//      Adapted to vxWorks 6.9 by Peter Brockamp 2012.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Since WRS does not yet properly support boost under vxWorks
+//  and this file was badly outdated, but I was keen on using it,
+//  I patched boost myself to make things work. This has been tested
+//  and adapted by me for vxWorks 6.9 *only*, as I'm lacking access
+//  to earlier 6.X versions! The only thing I know for sure is that
+//  very old versions of vxWorks (namely everything below 6.x) are
+//  absolutely unable to use boost. This is mainly due to the completely
+//  outdated libraries and ancient compiler (GCC 2.96 or worse). Do
+//  not even think of getting this to work, a miserable failure will
+//  be guaranteed!
+//  Equally, this file has been tested for RTPs (Real Time Processes)
+//  only, not for DKMs (Downloadable Kernel Modules). These two types
+//  of executables differ largely in the available functionality of
+//  the C-library, STL, and so on. A DKM uses a library similar to those
+//  of vxWorks 5.X - with all its limitations and incompatibilities
+//  with respect to ANSI C++ and STL. So probably there might be problems
+//  with the usage of boost from DKMs. WRS or any voluteers are free to
+//  prove the opposite!
+
+// ====================================================================
+//
+// Some important information regarding the usage of POSIX semaphores:
+// -------------------------------------------------------------------
+//
+// VxWorks as a real time operating system handles threads somewhat
+// different from what "normal" OSes do, regarding their scheduling!
+// This could lead to a scenario called "priority inversion" when using
+// semaphores, see http://en.wikipedia.org/wiki/Priority_inversion.
+//
+// Now, VxWorks POSIX-semaphores for DKM's default to the usage of
+// priority inverting semaphores, which is fine. On the other hand,
+// for RTP's it defaults to using non priority inverting semaphores,
+// which could easily pose a serious problem for a real time process,
+// i.e. deadlocks! To overcome this two possibilities do exist:
+//
+// a) Patch every piece of boost that uses semaphores to instanciate
+//    the proper type of semaphores. This is non-intrusive with respect
+//    to the OS and could relatively easy been done by giving all
+//    semaphores attributes deviating from the default (for in-depth
+//    information see the POSIX functions pthread_mutexattr_init()
+//    and pthread_mutexattr_setprotocol()). However this breaks all
+//    too easily, as with every new version some boost library could
+//    all in a sudden start using semaphores, resurrecting the very
+//    same, hard to locate problem over and over again!
+//
+// b) We could change the default properties for POSIX-semaphores
+//    that VxWorks uses for RTP's and this is being suggested here,
+//    as it will more or less seamlessly integrate with boost. I got
+//    the following information from WRS how to do this, compare
+//    Wind River TSR# 1209768:
+//
+// Instructions for changing the default properties of POSIX-
+// semaphores for RTP's in VxWorks 6.9:
+// - Edit the file /vxworks-6.9/target/usr/src/posix/pthreadLib.c
+//   in the root of your Workbench-installation.
+// - Around line 917 there should be the definition of the default
+//   mutex attributes:
+//
+//   LOCAL pthread_mutexattr_t defaultMutexAttr =
+//       {
+//       PTHREAD_INITIALIZED_OBJ, PTHREAD_PRIO_NONE, 0,
+//       PTHREAD_MUTEX_DEFAULT
+//       };
+//
+//   Here, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.
+// - Around line 1236 there should be a definition for the function
+//   pthread_mutexattr_init(). A couple of lines below you should
+//   find a block of code like this:
+//
+//   pAttr->mutexAttrStatus      = PTHREAD_INITIALIZED_OBJ;
+//   pAttr->mutexAttrProtocol    = PTHREAD_PRIO_NONE;
+//   pAttr->mutexAttrPrioceiling = 0;
+//   pAttr->mutexAttrType        = PTHREAD_MUTEX_DEFAULT;
+//
+//   Here again, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.
+// - Finally, rebuild your VSB. This will create a new VxWorks kernel
+//   with the changed properties. That's it! Now, using boost should
+//   no longer cause any problems with task deadlocks!
+//
+// And here's another useful piece of information concerning VxWorks'
+// POSIX-functionality in general:
+// VxWorks is not a genuine POSIX-OS in itself, rather it is using a
+// kind of compatibility layer (sort of a wrapper) to emulate the
+// POSIX-functionality by using its own resources and functions.
+// At the time a task (thread) calls it's first POSIX-function during
+// runtime it is being transformed by the OS into a POSIX-thread.
+// This transformation does include a call to malloc() to allocate the
+// memory required for the housekeeping of POSIX-threads. In a high
+// priority RTP this malloc() call may be highly undesirable, as its
+// timing is more or less unpredictable (depending on what your actual
+// heap looks like). You can circumvent this problem by calling the
+// function thread_self() at a well defined point in the code of the
+// task, e.g. shortly after the task spawns up. Thereby you are able
+// to define the time when the task-transformation will take place and
+// you could shift it to an uncritical point where a malloc() call is
+// tolerable. So, if this could pose a problem for your code, remember
+// to call thread_self() from the affected task at an early stage.
+//
+// ====================================================================
+
+// Block out all versions before vxWorks 6.x, as these don't work:
+// Include header with the vxWorks version information and query them
+#include <version.h>
+#if !defined(_WRS_VXWORKS_MAJOR) || (_WRS_VXWORKS_MAJOR < 6)
+#  error "The vxWorks version you're using is so badly outdated,\
+          it doesn't work at all with boost, sorry, no chance!"
+#endif
+
+// Handle versions above 5.X but below 6.9
+#if (_WRS_VXWORKS_MAJOR == 6) && (_WRS_VXWORKS_MINOR < 9)
+// TODO: Starting from what version does vxWorks work with boost?
+// We can't reasonably insert a #warning "" as a user hint here,
+// as this will show up with every file including some boost header,
+// badly bugging the user... So for the time being we just leave it.
+#endif
+
+// vxWorks specific config options:
+// --------------------------------
+#define BOOST_PLATFORM "vxWorks"
+
+// Special behaviour for DKMs:
+#ifdef _WRS_KERNEL
+  // DKMs do not have the <cwchar>-header,
+  // but apparently they do have an intrinsic wchar_t meanwhile!
+#  define BOOST_NO_CWCHAR
+
+  // Lots of wide-functions and -headers are unavailable for DKMs as well:
+#  define BOOST_NO_CWCTYPE
+#  define BOOST_NO_SWPRINTF
+#  define BOOST_NO_STD_WSTRING
+#  define BOOST_NO_STD_WSTREAMBUF
+#endif
+
+// Generally available headers:
+#define BOOST_HAS_UNISTD_H
+#define BOOST_HAS_STDINT_H
+#define BOOST_HAS_DIRENT_H
+#define BOOST_HAS_SLIST
+
+// vxWorks does not have installed an iconv-library by default,
+// so unfortunately no Unicode support from scratch is available!
+// Thus, instead it is suggested to switch to ICU, as this seems
+// to be the most complete and portable option...
+#define BOOST_LOCALE_WITH_ICU
+
+// Generally available functionality:
+#define BOOST_HAS_THREADS
+#define BOOST_HAS_NANOSLEEP
+#define BOOST_HAS_GETTIMEOFDAY
+#define BOOST_HAS_CLOCK_GETTIME
+#define BOOST_HAS_MACRO_USE_FACET
+
+// Generally unavailable functionality, delivered by boost's test function:
+//#define BOOST_NO_DEDUCED_TYPENAME // Commented this out, boost's test gives an errorneous result!
+#define BOOST_NO_CXX11_EXTERN_TEMPLATE
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+
+// Generally available threading API's:
+#define BOOST_HAS_PTHREADS
+#define BOOST_HAS_SCHED_YIELD
+#define BOOST_HAS_SIGACTION
+
+// Functionality available for RTPs only:
+#ifdef __RTP__
+#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#  define BOOST_HAS_LOG1P
+#  define BOOST_HAS_EXPM1
+#endif
+
+// Functionality available for DKMs only:
+#ifdef _WRS_KERNEL
+  // Luckily, at the moment there seems to be none!
+#endif
+
+// These #defines allow posix_features to work, since vxWorks doesn't
+// #define them itself for DKMs (for RTPs on the contrary it does):
+#ifdef _WRS_KERNEL
+#  ifndef _POSIX_TIMERS
+#    define _POSIX_TIMERS  1
+#  endif
+#  ifndef _POSIX_THREADS
+#    define _POSIX_THREADS 1
+#  endif
+#endif
+
+// vxWorks doesn't work with asio serial ports:
+#define BOOST_ASIO_DISABLE_SERIAL_PORT
+// TODO: The problem here seems to bee that vxWorks uses its own, very specific
+//       ways to handle serial ports, incompatible with POSIX or anything...
+//       Maybe a specific implementation would be possible, but until the
+//       straight need arises... This implementation would presumably consist
+//       of some vxWorks specific ioctl-calls, etc. Any voluteers?
+
+// vxWorks-around: <time.h> #defines CLOCKS_PER_SEC as sysClkRateGet() but
+//                 miserably fails to #include the required <sysLib.h> to make
+//                 sysClkRateGet() available! So we manually include it here.
+#ifdef __RTP__
+#  include <time.h>
+#  include <sysLib.h>
+#endif
+
+// vxWorks-around: In <stdint.h> the macros INT32_C(), UINT32_C(), INT64_C() and
+//                 UINT64_C() are defined errorneously, yielding not a signed/
+//                 unsigned long/long long type, but a signed/unsigned int/long
+//                 type. Eventually this leads to compile errors in ratio_fwd.hpp,
+//                 when trying to define several constants which do not fit into a
+//                 long type! We correct them here by redefining.
+#include <cstdint>
+
+// Some macro-magic to do the job
+#define VX_JOIN(X, Y)     VX_DO_JOIN(X, Y)
+#define VX_DO_JOIN(X, Y)  VX_DO_JOIN2(X, Y)
+#define VX_DO_JOIN2(X, Y) X##Y
+
+// Correctly setup the macros
+#undef  INT32_C
+#undef  UINT32_C
+#undef  INT64_C
+#undef  UINT64_C
+#define INT32_C(x)  VX_JOIN(x, L)
+#define UINT32_C(x) VX_JOIN(x, UL)
+#define INT64_C(x)  VX_JOIN(x, LL)
+#define UINT64_C(x) VX_JOIN(x, ULL)
+
+// #include Libraries required for the following function adaption
+#include <ioLib.h>
+#include <tickLib.h>
+#include <sys/time.h>
+
+// Use C-linkage for the following helper functions
+extern "C" {
+
+// vxWorks-around: The required functions getrlimit() and getrlimit() are missing.
+//                 But we have the similar functions getprlimit() and setprlimit(),
+//                 which may serve the purpose.
+//                 Problem: The vxWorks-documentation regarding these functions
+//                 doesn't deserve its name! It isn't documented what the first two
+//                 parameters idtype and id mean, so we must fall back to an educated
+//                 guess - null, argh... :-/
+
+// TODO: getprlimit() and setprlimit() do exist for RTPs only, for whatever reason.
+//       Thus for DKMs there would have to be another implementation.
+#ifdef __RTP__
+  inline int getrlimit(int resource, struct rlimit *rlp){
+    return getprlimit(0, 0, resource, rlp);
+  }
+
+  inline int setrlimit(int resource, const struct rlimit *rlp){
+    return setprlimit(0, 0, resource, const_cast<struct rlimit*>(rlp));
+  }
+#endif
+
+// vxWorks has ftruncate() only, so we do simulate truncate():
+inline int truncate(const char *p, off_t l){
+  int fd = open(p, O_WRONLY);
+  if (fd == -1){
+    errno = EACCES;
+    return -1;
+  }
+  if (ftruncate(fd, l) == -1){
+    close(fd);
+    errno = EACCES;
+    return -1;
+  }
+  return close(fd);
+}
+
+// Fake symlink handling by dummy functions:
+inline int symlink(const char*, const char*){
+  // vxWorks has no symlinks -> always return an error!
+  errno = EACCES;
+  return -1;
+}
+
+inline ssize_t readlink(const char*, char*, size_t){
+  // vxWorks has no symlinks -> always return an error!
+  errno = EACCES;
+  return -1;
+}
+
+// vxWorks claims to implement gettimeofday in sys/time.h
+// but nevertheless does not provide it! See
+// https://support.windriver.com/olsPortal/faces/maintenance/techtipDetail_noHeader.jspx?docId=16442&contentId=WR_TECHTIP_006256
+// We implement a surrogate version here via clock_gettime:
+inline int gettimeofday(struct timeval *tv, void * /*tzv*/) {
+  struct timespec ts;
+  clock_gettime(CLOCK_MONOTONIC, &ts);
+  tv->tv_sec  = ts.tv_sec;
+  tv->tv_usec = ts.tv_nsec / 1000;
+  return 0;
+}
+
+// vxWorks does provide neither struct tms nor function times()!
+// We implement an empty dummy-function, simply setting the user
+// and system time to the half of thew actual system ticks-value
+// and the child user and system time to 0.
+// Rather ugly but at least it suppresses compiler errors...
+// Unfortunately, this of course *does* have an severe impact on
+// dependant libraries, actually this is chrono only! Here it will
+// not be possible to correctly use user and system times! But
+// as vxWorks is lacking the ability to calculate user and system
+// process times there seems to be no other possible solution.
+struct tms{
+  clock_t tms_utime;  // User CPU time
+  clock_t tms_stime;  // System CPU time
+  clock_t tms_cutime; // User CPU time of terminated child processes
+  clock_t tms_cstime; // System CPU time of terminated child processes
+};
+
+inline clock_t times(struct tms *t){
+  struct timespec ts;
+  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
+  clock_t ticks(static_cast<clock_t>(static_cast<double>(ts.tv_sec)  * CLOCKS_PER_SEC +
+                                     static_cast<double>(ts.tv_nsec) * CLOCKS_PER_SEC / 1000000.0));
+  t->tms_utime  = ticks/2U;
+  t->tms_stime  = ticks/2U;
+  t->tms_cutime = 0; // vxWorks is lacking the concept of a child process!
+  t->tms_cstime = 0; // -> Set the wait times for childs to 0
+  return ticks;
+}
+
+} // extern "C"
+
+// Put the selfmade functions into the std-namespace, just in case
+namespace std {
+# ifdef __RTP__
+    using ::getrlimit;
+    using ::setrlimit;
+# endif
+  using ::truncate;
+  using ::symlink;
+  using ::readlink;
+  using ::times;
+  using ::gettimeofday;
+}
+
+// Some more macro-magic:
+// vxWorks-around: Some functions are not present or broken in vxWorks
+//                 but may be patched to life via helper macros...
+
+// Include signal.h which might contain a typo to be corrected here
+#include <signal.h>
+
+#define getpagesize()    sysconf(_SC_PAGESIZE)         // getpagesize is deprecated anyway!
+#ifndef S_ISSOCK
+#  define S_ISSOCK(mode) ((mode & S_IFMT) == S_IFSOCK) // Is file a socket?
+#endif
+#define lstat(p, b)      stat(p, b)                    // lstat() == stat(), as vxWorks has no symlinks!
+#ifndef FPE_FLTINV
+#  define FPE_FLTINV     (FPE_FLTSUB+1)                // vxWorks has no FPE_FLTINV, so define one as a dummy
+#endif
+#if !defined(BUS_ADRALN) && defined(BUS_ADRALNR)
+#  define BUS_ADRALN     BUS_ADRALNR                   // Correct a supposed typo in vxWorks' <signal.h>
+#endif
+//typedef int              locale_t;                     // locale_t is a POSIX-extension, currently unpresent in vxWorks!
+
+// #include boilerplate code:
+#include <boost/config/posix_features.hpp>
+
+// vxWorks lies about XSI conformance, there is no nl_types.h:
+#undef BOOST_HAS_NL_TYPES_H
diff --git a/gatb-core/thirdparty/boost/config/platform/win32.hpp b/gatb-core/thirdparty/boost/config/platform/win32.hpp
new file mode 100644
index 0000000..60a29ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/platform/win32.hpp
@@ -0,0 +1,82 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Bill Kempf 2001. 
+//  (C) Copyright Aleksey Gurtovoy 2003. 
+//  (C) Copyright Rene Rivera 2005.
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Win32 specific config options:
+
+#define BOOST_PLATFORM "Win32"
+
+//  Get the information about the MinGW runtime, i.e. __MINGW32_*VERSION.
+#if defined(__MINGW32__)
+#  include <_mingw.h>
+#endif
+
+#if defined(__GNUC__) && !defined(BOOST_NO_SWPRINTF)
+#  define BOOST_NO_SWPRINTF
+#endif
+
+//  Default defines for BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT
+//  If a compiler doesn't support __declspec(dllexport)/__declspec(dllimport),
+//  its boost/config/compiler/ file must define BOOST_SYMBOL_EXPORT and
+//  BOOST_SYMBOL_IMPORT
+#ifndef BOOST_SYMBOL_EXPORT
+#  define BOOST_HAS_DECLSPEC
+#  define BOOST_SYMBOL_EXPORT __declspec(dllexport)
+#  define BOOST_SYMBOL_IMPORT __declspec(dllimport)
+#endif
+
+#if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0)))
+#  define BOOST_HAS_STDINT_H
+#  ifndef __STDC_LIMIT_MACROS
+#     define __STDC_LIMIT_MACROS
+#  endif
+#  define BOOST_HAS_DIRENT_H
+#  define BOOST_HAS_UNISTD_H
+#endif
+
+#if defined(__MINGW32__) && (__GNUC__ >= 4)
+// Mingw has these functions but there are persistent problems
+// with calls to these crashing, so disable for now:
+//#  define BOOST_HAS_EXPM1
+//#  define BOOST_HAS_LOG1P
+#  define BOOST_HAS_GETTIMEOFDAY
+#endif
+//
+// Win32 will normally be using native Win32 threads,
+// but there is a pthread library avaliable as an option,
+// we used to disable this when BOOST_DISABLE_WIN32 was 
+// defined but no longer - this should allow some
+// files to be compiled in strict mode - while maintaining
+// a consistent setting of BOOST_HAS_THREADS across
+// all translation units (needed for shared_ptr etc).
+//
+
+#ifndef BOOST_HAS_PTHREADS
+#  define BOOST_HAS_WINTHREADS
+#endif
+
+//
+// WinCE configuration:
+//
+#if defined(_WIN32_WCE) || defined(UNDER_CE)
+#  define BOOST_NO_ANSI_APIS
+// Windows CE does not have a conforming signature for swprintf
+#  define BOOST_NO_SWPRINTF
+#else
+#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME
+#  define BOOST_HAS_THREADEX
+#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME
+#endif
+
+#ifndef BOOST_DISABLE_WIN32
+// WEK: Added
+#define BOOST_HAS_FTIME
+#define BOOST_WINDOWS 1
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/posix_features.hpp b/gatb-core/thirdparty/boost/config/posix_features.hpp
new file mode 100644
index 0000000..d129547
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/posix_features.hpp
@@ -0,0 +1,95 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+//  See http://www.boost.org for most recent version.
+
+// All POSIX feature tests go in this file,
+// Note that we test _POSIX_C_SOURCE and _XOPEN_SOURCE as well
+// _POSIX_VERSION and _XOPEN_VERSION: on some systems POSIX API's
+// may be present but none-functional unless _POSIX_C_SOURCE and
+// _XOPEN_SOURCE have been defined to the right value (it's up
+// to the user to do this *before* including any header, although
+// in most cases the compiler will do this for you).
+
+#  if defined(BOOST_HAS_UNISTD_H)
+#     include <unistd.h>
+
+      // XOpen has <nl_types.h>, but is this the correct version check?
+#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 3)
+#        define BOOST_HAS_NL_TYPES_H
+#     endif
+
+      // POSIX version 6 requires <stdint.h>
+#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200100)
+#        define BOOST_HAS_STDINT_H
+#     endif
+
+      // POSIX version 2 requires <dirent.h>
+#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199009L)
+#        define BOOST_HAS_DIRENT_H
+#     endif
+
+      // POSIX version 3 requires <signal.h> to have sigaction:
+#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199506L)
+#        define BOOST_HAS_SIGACTION
+#     endif
+      // POSIX defines _POSIX_THREADS > 0 for pthread support,
+      // however some platforms define _POSIX_THREADS without
+      // a value, hence the (_POSIX_THREADS+0 >= 0) check.
+      // Strictly speaking this may catch platforms with a
+      // non-functioning stub <pthreads.h>, but such occurrences should
+      // occur very rarely if at all.
+#     if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_MPTASKS)
+#        define BOOST_HAS_PTHREADS
+#     endif
+
+      // BOOST_HAS_NANOSLEEP:
+      // This is predicated on _POSIX_TIMERS or _XOPEN_REALTIME:
+#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) \
+             || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))
+#        define BOOST_HAS_NANOSLEEP
+#     endif
+
+      // BOOST_HAS_CLOCK_GETTIME:
+      // This is predicated on _POSIX_TIMERS (also on _XOPEN_REALTIME
+      // but at least one platform - linux - defines that flag without
+      // defining clock_gettime):
+#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0))
+#        define BOOST_HAS_CLOCK_GETTIME
+#     endif
+
+      // BOOST_HAS_SCHED_YIELD:
+      // This is predicated on _POSIX_PRIORITY_SCHEDULING or
+      // on _POSIX_THREAD_PRIORITY_SCHEDULING or on _XOPEN_REALTIME.
+#     if defined(_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING+0 > 0)\
+            || (defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING+0 > 0))\
+            || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))
+#        define BOOST_HAS_SCHED_YIELD
+#     endif
+
+      // BOOST_HAS_GETTIMEOFDAY:
+      // BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE:
+      // These are predicated on _XOPEN_VERSION, and appears to be first released
+      // in issue 4, version 2 (_XOPEN_VERSION > 500).
+      // Likewise for the functions log1p and expm1.
+#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION+0 >= 500)
+#        define BOOST_HAS_GETTIMEOFDAY
+#        if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE+0 >= 500)
+#           define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#        endif
+#        ifndef BOOST_HAS_LOG1P
+#           define BOOST_HAS_LOG1P
+#        endif
+#        ifndef BOOST_HAS_EXPM1
+#           define BOOST_HAS_EXPM1
+#        endif
+#     endif
+
+#  endif
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/requires_threads.hpp b/gatb-core/thirdparty/boost/config/requires_threads.hpp
new file mode 100644
index 0000000..cfaff23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/requires_threads.hpp
@@ -0,0 +1,92 @@
+//  (C) Copyright John Maddock 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_CONFIG_REQUIRES_THREADS_HPP
+#define BOOST_CONFIG_REQUIRES_THREADS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_DISABLE_THREADS)
+
+//
+// special case to handle versions of gcc which don't currently support threads:
+//
+#if defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC_MINOR__ <= 3) || !defined(BOOST_STRICT_CONFIG))
+//
+// this is checked up to gcc 3.3:
+//
+#if defined(__sgi) || defined(__hpux)
+#  error "Multi-threaded programs are not supported by gcc on HPUX or Irix (last checked with gcc 3.3)"
+#endif
+
+#endif
+
+#  error "Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS"
+
+#elif !defined(BOOST_HAS_THREADS)
+
+# if defined __COMO__
+//  Comeau C++
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_MT (Windows) or -D_REENTRANT (Unix)"
+
+#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)
+//  Intel
+#ifdef _WIN32
+#  error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd"
+#else
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -openmp"
+#endif
+
+# elif defined __GNUC__
+//  GNU C++:
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
+
+#elif defined __sgi
+//  SGI MIPSpro C++
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_SGI_MP_SOURCE"
+
+#elif defined __DECCXX
+//  Compaq Tru64 Unix cxx
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread"
+
+#elif defined __BORLANDC__
+//  Borland
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -tWM"
+
+#elif defined  __MWERKS__
+//  Metrowerks CodeWarrior
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: either -runtime sm, -runtime smd, -runtime dm, or -runtime dmd"
+
+#elif defined  __SUNPRO_CC
+//  Sun Workshop Compiler C++
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt"
+
+#elif defined __HP_aCC
+//  HP aCC
+#   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt"
+
+#elif defined(__IBMCPP__)
+//  IBM Visual Age
+#   error "Compiler threading support is not turned on. Please compile the code with the xlC_r compiler"
+
+#elif defined _MSC_VER
+//  Microsoft Visual C++
+//
+//  Must remain the last #elif since some other vendors (Metrowerks, for
+//  example) also #define _MSC_VER
+#  error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd"
+
+#else
+
+#  error "Compiler threading support is not turned on.  Please consult your compiler's documentation for the appropriate options to use"
+
+#endif // compilers
+
+#endif // BOOST_HAS_THREADS
+
+#endif // BOOST_CONFIG_REQUIRES_THREADS_HPP
diff --git a/gatb-core/thirdparty/boost/config/select_compiler_config.hpp b/gatb-core/thirdparty/boost/config/select_compiler_config.hpp
new file mode 100644
index 0000000..4d87093
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/select_compiler_config.hpp
@@ -0,0 +1,148 @@
+//  Boost compiler configuration selection header file
+
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Martin Wille 2003.
+//  (C) Copyright Guillaume Melquiond 2003.
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  (See accompanying file LICENSE_1_0.txt or copy at
+//   http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/ for most recent version.
+
+// locate which compiler we are using and define
+// BOOST_COMPILER_CONFIG as needed: 
+
+#if defined __CUDACC__
+//  NVIDIA CUDA C++ compiler for GPU
+#   include "boost/config/compiler/nvcc.hpp"
+
+#endif
+
+#if defined(__GCCXML__)
+// GCC-XML emulates other compilers, it has to appear first here!
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc_xml.hpp"
+
+#elif defined(_CRAYC)
+// EDG based Cray compiler:
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/cray.hpp"
+
+#elif defined __COMO__
+//  Comeau C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/comeau.hpp"
+
+#elif defined(__PATHSCALE__) && (__PATHCC__ >= 4)
+// PathScale EKOPath compiler (has to come before clang and gcc)
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/pathscale.hpp"
+
+#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)
+//  Intel
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/intel.hpp"
+
+#elif defined __clang__ && !defined(__CUDACC__) && !defined(__ibmxl__)
+// when using clang and cuda at same time, you want to appear as gcc
+//  Clang C++ emulates GCC, so it has to appear early.
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/clang.hpp"
+
+#elif defined __DMC__
+//  Digital Mars C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/digitalmars.hpp"
+
+# elif defined(__GNUC__) && !defined(__ibmxl__)
+//  GNU C++:
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc.hpp"
+
+#elif defined __KCC
+//  Kai C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/kai.hpp"
+
+#elif defined __sgi
+//  SGI MIPSpro C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/sgi_mipspro.hpp"
+
+#elif defined __DECCXX
+//  Compaq Tru64 Unix cxx
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/compaq_cxx.hpp"
+
+#elif defined __ghs
+//  Greenhills C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/greenhills.hpp"
+
+#elif defined __CODEGEARC__
+//  CodeGear - must be checked for before Borland
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/codegear.hpp"
+
+#elif defined __BORLANDC__
+//  Borland
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/borland.hpp"
+
+#elif defined  __MWERKS__
+//  Metrowerks CodeWarrior
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/metrowerks.hpp"
+
+#elif defined  __SUNPRO_CC
+//  Sun Workshop Compiler C++
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/sunpro_cc.hpp"
+
+#elif defined __HP_aCC
+//  HP aCC
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/hp_acc.hpp"
+
+#elif defined(__MRC__) || defined(__SC__)
+//  MPW MrCpp or SCpp
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/mpw.hpp"
+
+#elif defined(__ibmxl__)
+// IBM XL C/C++ for Linux (Little Endian)
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/xlcpp.hpp"
+
+#elif defined(__IBMCPP__)
+//  IBM Visual Age or IBM XL C/C++ for Linux (Big Endian)
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/vacpp.hpp"
+
+#elif defined(__PGI)
+//  Portland Group Inc.
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/pgi.hpp"
+
+#elif defined _MSC_VER
+//  Microsoft Visual C++
+//
+//  Must remain the last #elif since some other vendors (Metrowerks, for
+//  example) also #define _MSC_VER
+#   define BOOST_COMPILER_CONFIG "boost/config/compiler/visualc.hpp"
+
+#elif defined (BOOST_ASSERT_CONFIG)
+// this must come last - generate an error if we don't
+// recognise the compiler:
+#  error "Unknown compiler - please configure (http://www.boost.org/libs/config/config.htm#configuring) and report the results to the main boost mailing list (http://www.boost.org/more/mailing_lists.htm#main)"
+
+#endif
+
+#if 0
+//
+// This section allows dependency scanners to find all the headers we *might* include:
+//
+#include "boost/config/compiler/gcc_xml.hpp"
+#include "boost/config/compiler/cray.hpp"
+#include "boost/config/compiler/comeau.hpp"
+#include "boost/config/compiler/pathscale.hpp"
+#include "boost/config/compiler/intel.hpp"
+#include "boost/config/compiler/clang.hpp"
+#include "boost/config/compiler/digitalmars.hpp"
+#include "boost/config/compiler/gcc.hpp"
+#include "boost/config/compiler/kai.hpp"
+#include "boost/config/compiler/sgi_mipspro.hpp"
+#include "boost/config/compiler/compaq_cxx.hpp"
+#include "boost/config/compiler/greenhills.hpp"
+#include "boost/config/compiler/codegear.hpp"
+#include "boost/config/compiler/borland.hpp"
+#include "boost/config/compiler/metrowerks.hpp"
+#include "boost/config/compiler/sunpro_cc.hpp"
+#include "boost/config/compiler/hp_acc.hpp"
+#include "boost/config/compiler/mpw.hpp"
+#include "boost/config/compiler/vacpp.hpp"
+#include "boost/config/compiler/pgi.hpp"
+#include "boost/config/compiler/visualc.hpp"
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/select_platform_config.hpp b/gatb-core/thirdparty/boost/config/select_platform_config.hpp
new file mode 100644
index 0000000..acd1409
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/select_platform_config.hpp
@@ -0,0 +1,133 @@
+//  Boost compiler configuration selection header file
+
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  (C) Copyright Jens Maurer 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+// locate which platform we are on and define BOOST_PLATFORM_CONFIG as needed.
+// Note that we define the headers to include using "header_name" not
+// <header_name> in order to prevent macro expansion within the header
+// name (for example "linux" is a macro on linux systems).
+
+#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)
+// linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though?
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/linux.hpp"
+
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
+// BSD:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/bsd.hpp"
+
+#elif defined(sun) || defined(__sun)
+// solaris:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/solaris.hpp"
+
+#elif defined(__sgi)
+// SGI Irix:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/irix.hpp"
+
+#elif defined(__hpux)
+// hp unix:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/hpux.hpp"
+
+#elif defined(__CYGWIN__)
+// cygwin is not win32:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/cygwin.hpp"
+
+#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+// win32:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/win32.hpp"
+
+#elif defined(__HAIKU__)
+// Haiku
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/haiku.hpp"
+
+#elif defined(__BEOS__)
+// BeOS
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/beos.hpp"
+
+#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
+// MacOS
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/macos.hpp"
+
+#elif defined(__IBMCPP__) || defined(_AIX)
+// IBM
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/aix.hpp"
+
+#elif defined(__amigaos__)
+// AmigaOS
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/amigaos.hpp"
+
+#elif defined(__QNXNTO__)
+// QNX:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/qnxnto.hpp"
+
+#elif defined(__VXWORKS__)
+// vxWorks:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/vxworks.hpp"
+
+#elif defined(__SYMBIAN32__) 
+// Symbian: 
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/symbian.hpp" 
+
+#elif defined(_CRAYC)
+// Cray:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/cray.hpp" 
+
+#elif defined(__VMS) 
+// VMS:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/vms.hpp" 
+#else
+
+#  if defined(unix) \
+      || defined(__unix) \
+      || defined(_XOPEN_SOURCE) \
+      || defined(_POSIX_SOURCE)
+
+   // generic unix platform:
+
+#  ifndef BOOST_HAS_UNISTD_H
+#     define BOOST_HAS_UNISTD_H
+#  endif
+
+#  include <boost/config/posix_features.hpp>
+
+#  endif
+
+#  if defined (BOOST_ASSERT_CONFIG)
+      // this must come last - generate an error if we don't
+      // recognise the platform:
+#     error "Unknown platform - please configure and report the results to boost.org"
+#  endif
+
+#endif
+
+#if 0
+//
+// This section allows dependency scanners to find all the files we *might* include:
+//
+#  include "boost/config/platform/linux.hpp"
+#  include "boost/config/platform/bsd.hpp"
+#  include "boost/config/platform/solaris.hpp"
+#  include "boost/config/platform/irix.hpp"
+#  include "boost/config/platform/hpux.hpp"
+#  include "boost/config/platform/cygwin.hpp"
+#  include "boost/config/platform/win32.hpp"
+#  include "boost/config/platform/beos.hpp"
+#  include "boost/config/platform/macos.hpp"
+#  include "boost/config/platform/aix.hpp"
+#  include "boost/config/platform/amigaos.hpp"
+#  include "boost/config/platform/qnxnto.hpp"
+#  include "boost/config/platform/vxworks.hpp"
+#  include "boost/config/platform/symbian.hpp" 
+#  include "boost/config/platform/cray.hpp" 
+#  include "boost/config/platform/vms.hpp" 
+#  include <boost/config/posix_features.hpp>
+
+
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/select_stdlib_config.hpp b/gatb-core/thirdparty/boost/config/select_stdlib_config.hpp
new file mode 100644
index 0000000..e270a88
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/select_stdlib_config.hpp
@@ -0,0 +1,105 @@
+//  Boost compiler configuration selection header file
+
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2001 - 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+//  See http://www.boost.org for most recent version.
+
+// locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed:
+
+// First include <cstddef> to determine if some version of STLport is in use as the std lib
+// (do not rely on this header being included since users can short-circuit this header 
+//  if they know whose std lib they are using.)
+#ifdef __cplusplus
+#  include <cstddef>
+#else
+#  include <stddef.h>
+#endif
+
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+// STLPort library; this _must_ come first, otherwise since
+// STLport typically sits on top of some other library, we
+// can end up detecting that first rather than STLport:
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/stlport.hpp"
+
+#else
+
+// If our std lib was not some version of STLport, and has not otherwise
+// been detected, then include <utility> as it is about 
+// the smallest of the std lib headers that includes real C++ stuff.
+// Some std libs do not include their C++-related macros in <cstddef> 
+// so this additional include makes sure we get those definitions.
+// Note: do not rely on this header being included since users can short-circuit this 
+// #include if they know whose std lib they are using.
+#if !defined(__LIBCOMO__) && !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\
+   && !defined(_LIBCPP_VERSION) && !defined(__GLIBCPP__) && !defined(__GLIBCXX__)\
+   && !defined(__STL_CONFIG_H) && !defined(__MSL_CPP__) && !defined(__IBMCPP__)\
+   && !defined(MSIPL_COMPILE_H) && !defined(_YVALS) && !defined(_CPPLIB_VER)
+#include <utility>
+#endif
+
+#if defined(__LIBCOMO__)
+// Comeau STL:
+#define BOOST_STDLIB_CONFIG "boost/config/stdlib/libcomo.hpp"
+
+#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+// Rogue Wave library:
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/roguewave.hpp"
+
+#elif defined(_LIBCPP_VERSION)
+// libc++
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/libcpp.hpp"
+
+#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+// GNU libstdc++ 3
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/libstdcpp3.hpp"
+
+#elif defined(__STL_CONFIG_H)
+// generic SGI STL
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/sgi.hpp"
+
+#elif defined(__MSL_CPP__)
+// MSL standard lib:
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/msl.hpp"
+
+#elif defined(__IBMCPP__)
+// take the default VACPP std lib
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/vacpp.hpp"
+
+#elif defined(MSIPL_COMPILE_H)
+// Modena C++ standard library
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/modena.hpp"
+
+#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
+// Dinkumware Library (this has to appear after any possible replacement libraries):
+#  define BOOST_STDLIB_CONFIG "boost/config/stdlib/dinkumware.hpp"
+
+#elif defined (BOOST_ASSERT_CONFIG)
+// this must come last - generate an error if we don't
+// recognise the library:
+#  error "Unknown standard library - please configure and report the results to boost.org"
+
+#endif
+
+#endif
+
+#if 0
+//
+// This section allows dependency scanners to find all the files we *might* include:
+//
+#  include "boost/config/stdlib/stlport.hpp"
+#  include "boost/config/stdlib/libcomo.hpp"
+#  include "boost/config/stdlib/roguewave.hpp"
+#  include "boost/config/stdlib/libcpp.hpp"
+#  include "boost/config/stdlib/libstdcpp3.hpp"
+#  include "boost/config/stdlib/sgi.hpp"
+#  include "boost/config/stdlib/msl.hpp"
+#  include "boost/config/stdlib/vacpp.hpp"
+#  include "boost/config/stdlib/modena.hpp"
+#  include "boost/config/stdlib/dinkumware.hpp"
+#endif
+
diff --git a/gatb-core/thirdparty/boost/config/stdlib/dinkumware.hpp b/gatb-core/thirdparty/boost/config/stdlib/dinkumware.hpp
new file mode 100644
index 0000000..90c45c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/dinkumware.hpp
@@ -0,0 +1,189 @@
+//  (C) Copyright John Maddock 2001 - 2003.
+//  (C) Copyright Jens Maurer 2001.
+//  (C) Copyright Peter Dimov 2001.
+//  (C) Copyright David Abrahams 2002.
+//  (C) Copyright Guillaume Melquiond 2003.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Dinkumware standard library config:
+
+#if !defined(_YVALS) && !defined(_CPPLIB_VER)
+#include <boost/config/no_tr1/utility.hpp>
+#if !defined(_YVALS) && !defined(_CPPLIB_VER)
+#error This is not the Dinkumware lib!
+#endif
+#endif
+
+
+#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 306)
+   // full dinkumware 3.06 and above
+   // fully conforming provided the compiler supports it:
+#  if !(defined(_GLOBAL_USING) && (_GLOBAL_USING+0 > 0)) && !defined(__BORLANDC__) && !defined(_STD) && !(defined(__ICC) && (__ICC >= 700))   // can be defined in yvals.h
+#     define BOOST_NO_STDC_NAMESPACE
+#  endif
+#  if !(defined(_HAS_MEMBER_TEMPLATES_REBIND) && (_HAS_MEMBER_TEMPLATES_REBIND+0 > 0)) && !(defined(_MSC_VER) && (_MSC_VER > 1300)) && defined(BOOST_MSVC)
+#     define BOOST_NO_STD_ALLOCATOR
+#  endif
+#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR
+#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+      // if this lib version is set up for vc6 then there is no std::use_facet:
+#     define BOOST_NO_STD_USE_FACET
+#     define BOOST_HAS_TWO_ARG_USE_FACET
+      // C lib functions aren't in namespace std either:
+#     define BOOST_NO_STDC_NAMESPACE
+      // and nor is <exception>
+#     define BOOST_NO_EXCEPTION_STD_NAMESPACE
+#  endif
+// There's no numeric_limits<long long> support unless _LONGLONG is defined:
+#  if !defined(_LONGLONG) && (_CPPLIB_VER <= 310)
+#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#  endif
+// 3.06 appears to have (non-sgi versions of) <hash_set> & <hash_map>,
+// and no <slist> at all
+#else
+#  define BOOST_MSVC_STD_ITERATOR 1
+#  define BOOST_NO_STD_ITERATOR
+#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+#  define BOOST_NO_STD_ALLOCATOR
+#  define BOOST_NO_STDC_NAMESPACE
+#  define BOOST_NO_STD_USE_FACET
+#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN
+#  define BOOST_HAS_MACRO_USE_FACET
+#  ifndef _CPPLIB_VER
+      // Updated Dinkum library defines this, and provides
+      // its own min and max definitions, as does MTA version.
+#     ifndef __MTA__ 
+#        define BOOST_NO_STD_MIN_MAX
+#     endif
+#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#  endif
+#endif
+
+//
+// std extension namespace is stdext for vc7.1 and later, 
+// the same applies to other compilers that sit on top
+// of vc7.1 (Intel and Comeau):
+//
+#if defined(_MSC_VER) && (_MSC_VER >= 1310) && !defined(__BORLANDC__)
+#  define BOOST_STD_EXTENSION_NAMESPACE stdext
+#endif
+
+
+#if (defined(_MSC_VER) && (_MSC_VER <= 1300) && !defined(__BORLANDC__)) || !defined(_CPPLIB_VER) || (_CPPLIB_VER < 306)
+   // if we're using a dinkum lib that's
+   // been configured for VC6/7 then there is
+   // no iterator traits (true even for icl)
+#  define BOOST_NO_STD_ITERATOR_TRAITS
+#endif
+
+#if defined(__ICL) && (__ICL < 800) && defined(_CPPLIB_VER) && (_CPPLIB_VER <= 310)
+// Intel C++ chokes over any non-trivial use of <locale>
+// this may be an overly restrictive define, but regex fails without it:
+#  define BOOST_NO_STD_LOCALE
+#endif
+
+// Fix for VC++ 8.0 on up ( I do not have a previous version to test )
+// or clang-cl. If exceptions are off you must manually include the 
+// <exception> header before including the <typeinfo> header. Admittedly 
+// trying to use Boost libraries or the standard C++ libraries without 
+// exception support is not suggested but currently clang-cl ( v 3.4 ) 
+// does not support exceptions and must be compiled with exceptions off.
+#if !_HAS_EXCEPTIONS && ((defined(BOOST_MSVC) && BOOST_MSVC >= 1400) || (defined(__clang__) && defined(_MSC_VER)))
+#include <exception>
+#endif
+#include <typeinfo>
+#if ( (!_HAS_EXCEPTIONS && !defined(__ghs__)) || (!_HAS_NAMESPACE && defined(__ghs__)) ) && !defined(__TI_COMPILER_VERSION__) && !defined(__VISUALDSPVERSION__)
+#  define BOOST_NO_STD_TYPEINFO
+#endif  
+
+//  C++0x headers implemented in 520 (as shipped by Microsoft)
+//
+#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_SMART_PTR
+#endif
+
+#if ((!defined(_HAS_TR1_IMPORTS) || (_HAS_TR1_IMPORTS+0 == 0)) && !defined(BOOST_NO_CXX11_HDR_TUPLE)) \
+  && (!defined(_CPPLIB_VER) || _CPPLIB_VER < 610)
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#endif
+
+//  C++0x headers implemented in 540 (as shipped by Microsoft)
+//
+#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 540
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#endif
+
+//  C++0x headers implemented in 610 (as shipped by Microsoft)
+//
+#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 610
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_ALLOCATOR
+// 540 has std::align but it is not a conforming implementation
+#  define BOOST_NO_CXX11_STD_ALIGN
+#endif
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#elif !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#if defined(BOOST_INTEL) && (BOOST_INTEL <= 1400)
+// Intel's compiler can't handle this header yet:
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#endif
+
+
+//  520..610 have std::addressof, but it doesn't support functions
+//
+#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 650
+#  define BOOST_NO_CXX11_ADDRESSOF
+#endif
+
+// Bug specific to VC14, 
+// See https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t
+// and discussion here: http://blogs.msdn.com/b/vcblog/archive/2014/11/12/visual-studio-2015-preview-now-available.aspx?PageIndex=2
+#if  _CPPLIB_VER == 650
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#endif
+
+#ifdef _CPPLIB_VER
+#  define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER
+#else
+#  define BOOST_DINKUMWARE_STDLIB 1
+#endif
+
+#ifdef _CPPLIB_VER
+#  define BOOST_STDLIB "Dinkumware standard library version " BOOST_STRINGIZE(_CPPLIB_VER)
+#else
+#  define BOOST_STDLIB "Dinkumware standard library version 1.x"
+#endif
diff --git a/gatb-core/thirdparty/boost/config/stdlib/libcomo.hpp b/gatb-core/thirdparty/boost/config/stdlib/libcomo.hpp
new file mode 100644
index 0000000..941498d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/libcomo.hpp
@@ -0,0 +1,83 @@
+//  (C) Copyright John Maddock 2002 - 2003. 
+//  (C) Copyright Jens Maurer 2002 - 2003. 
+//  (C) Copyright Beman Dawes 2002 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Comeau STL:
+
+#if !defined(__LIBCOMO__)
+#  include <boost/config/no_tr1/utility.hpp>
+#  if !defined(__LIBCOMO__)
+#      error "This is not the Comeau STL!"
+#  endif
+#endif
+
+//
+// std::streambuf<wchar_t> is non-standard
+// NOTE: versions of libcomo prior to beta28 have octal version numbering,
+// e.g. version 25 is 21 (dec)
+#if __LIBCOMO_VERSION__ <= 22
+#  define BOOST_NO_STD_WSTREAMBUF
+#endif
+
+#if (__LIBCOMO_VERSION__ <= 31) && defined(_WIN32)
+#define BOOST_NO_SWPRINTF
+#endif
+
+#if __LIBCOMO_VERSION__ >= 31
+#  define BOOST_HAS_HASH
+#  define BOOST_HAS_SLIST
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+//
+// Intrinsic type_traits support.
+// The SGI STL has it's own __type_traits class, which
+// has intrinsic compiler support with SGI's compilers.
+// Whatever map SGI style type traits to boost equivalents:
+//
+#define BOOST_HAS_SGI_TYPE_TRAITS
+
+#define BOOST_STDLIB "Comeau standard library " BOOST_STRINGIZE(__LIBCOMO_VERSION__)
diff --git a/gatb-core/thirdparty/boost/config/stdlib/libcpp.hpp b/gatb-core/thirdparty/boost/config/stdlib/libcpp.hpp
new file mode 100644
index 0000000..ab5d123
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/libcpp.hpp
@@ -0,0 +1,80 @@
+//  (C) Copyright Christopher Jefferson 2011.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  config for libc++
+//  Might need more in here later.
+
+#if !defined(_LIBCPP_VERSION)
+#  include <ciso646>
+#  if !defined(_LIBCPP_VERSION)
+#      error "This is not libc++!"
+#  endif
+#endif
+
+#define BOOST_STDLIB "libc++ version " BOOST_STRINGIZE(_LIBCPP_VERSION)
+
+#define BOOST_HAS_THREADS
+
+#ifdef _LIBCPP_HAS_NO_VARIADICS
+#    define BOOST_NO_CXX11_HDR_TUPLE
+#endif
+
+// BOOST_NO_CXX11_ALLOCATOR should imply no support for the C++11
+// allocator model. The C++11 allocator model requires a conforming
+// std::allocator_traits which is only possible with C++11 template
+// aliases since members rebind_alloc and rebind_traits require it.
+#if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)
+#    define BOOST_NO_CXX11_ALLOCATOR
+#endif
+
+#if __cplusplus < 201103
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+#endif
+
+//
+// These appear to be unusable/incomplete so far:
+//
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+
+// libc++ uses a non-standard messages_base
+#define BOOST_NO_STD_MESSAGES
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus <= 201103
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+//  --- end ---
diff --git a/gatb-core/thirdparty/boost/config/stdlib/libstdcpp3.hpp b/gatb-core/thirdparty/boost/config/stdlib/libstdcpp3.hpp
new file mode 100644
index 0000000..7d27b0c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/libstdcpp3.hpp
@@ -0,0 +1,277 @@
+//  (C) Copyright John Maddock 2001.
+//  (C) Copyright Jens Maurer 2001.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  config for libstdc++ v3
+//  not much to go in here:
+
+#define BOOST_GNU_STDLIB 1
+
+#ifdef __GLIBCXX__
+#define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCXX__)
+#else
+#define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCPP__)
+#endif
+
+#if !defined(_GLIBCPP_USE_WCHAR_T) && !defined(_GLIBCXX_USE_WCHAR_T)
+#  define BOOST_NO_CWCHAR
+#  define BOOST_NO_CWCTYPE
+#  define BOOST_NO_STD_WSTRING
+#  define BOOST_NO_STD_WSTREAMBUF
+#endif
+
+#if defined(__osf__) && !defined(_REENTRANT) \
+  && ( defined(_GLIBCXX_HAVE_GTHR_DEFAULT) || defined(_GLIBCPP_HAVE_GTHR_DEFAULT) )
+// GCC 3 on Tru64 forces the definition of _REENTRANT when any std lib header
+// file is included, therefore for consistency we define it here as well.
+#  define _REENTRANT
+#endif
+
+#ifdef __GLIBCXX__ // gcc 3.4 and greater:
+#  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \
+        || defined(_GLIBCXX__PTHREADS) \
+        || defined(_GLIBCXX_HAS_GTHREADS) \
+        || defined(_WIN32) \
+        || defined(_AIX) \
+        || defined(__HAIKU__)
+      //
+      // If the std lib has thread support turned on, then turn it on in Boost
+      // as well.  We do this because some gcc-3.4 std lib headers define _REENTANT
+      // while others do not...
+      //
+#     define BOOST_HAS_THREADS
+#  else
+#     define BOOST_DISABLE_THREADS
+#  endif
+#elif defined(__GLIBCPP__) \
+        && !defined(_GLIBCPP_HAVE_GTHR_DEFAULT) \
+        && !defined(_GLIBCPP__PTHREADS)
+   // disable thread support if the std lib was built single threaded:
+#  define BOOST_DISABLE_THREADS
+#endif
+
+#if (defined(linux) || defined(__linux) || defined(__linux__)) && defined(__arm__) && defined(_GLIBCPP_HAVE_GTHR_DEFAULT)
+// linux on arm apparently doesn't define _REENTRANT
+// so just turn on threading support whenever the std lib is thread safe:
+#  define BOOST_HAS_THREADS
+#endif
+
+#if !defined(_GLIBCPP_USE_LONG_LONG) \
+    && !defined(_GLIBCXX_USE_LONG_LONG)\
+    && defined(BOOST_HAS_LONG_LONG)
+// May have been set by compiler/*.hpp, but "long long" without library
+// support is useless.
+#  undef BOOST_HAS_LONG_LONG
+#endif
+
+// Apple doesn't seem to reliably defined a *unix* macro
+#if !defined(CYGWIN) && (  defined(__unix__)  \
+                        || defined(__unix)    \
+                        || defined(unix)      \
+                        || defined(__APPLE__) \
+                        || defined(__APPLE)   \
+                        || defined(APPLE))
+#  include <unistd.h>
+#endif
+
+#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0
+#  define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx
+#  define BOOST_HAS_SLIST
+#  define BOOST_HAS_HASH
+#  define BOOST_SLIST_HEADER <ext/slist>
+# if !defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
+#   define BOOST_HASH_SET_HEADER <ext/hash_set>
+#   define BOOST_HASH_MAP_HEADER <ext/hash_map>
+# else
+#   define BOOST_HASH_SET_HEADER <backward/hash_set>
+#   define BOOST_HASH_MAP_HEADER <backward/hash_map>
+# endif
+#endif
+
+//
+// Decide whether we have C++11 support turned on:
+//
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103)
+#  define BOOST_LIBSTDCXX11
+#endif
+//
+//  Decide which version of libstdc++ we have, normally
+//  stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly
+//  __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++
+//  developers. He also commented:
+//
+//       "I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in
+//       GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305.
+//       Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support
+//       than any release in the 4.2 series."
+//
+//  Another resource for understanding stdlibc++ features is:
+//  http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x
+//
+//  However, using the GCC version number fails when the compiler is clang since this
+//  only ever claims to emulate GCC-4.2, see https://svn.boost.org/trac/boost/ticket/7473
+//  for a long discussion on this issue.  What we can do though is use clang's __has_include
+//  to detect the presence of a C++11 header that was introduced with a specific GCC release.
+//  We still have to be careful though as many such headers were buggy and/or incomplete when
+//  first introduced, so we only check for headers that were fully featured from day 1, and then
+//  use that to infer the underlying GCC version:
+//
+#ifdef __clang__
+
+#if __has_include(<experimental/any>)
+#  define BOOST_LIBSTDCXX_VERSION 50100
+#elif __has_include(<shared_mutex>)
+#  define BOOST_LIBSTDCXX_VERSION 40900
+#elif __has_include(<ext/cmath>)
+#  define BOOST_LIBSTDCXX_VERSION 40800
+#elif __has_include(<scoped_allocator>)
+#  define BOOST_LIBSTDCXX_VERSION 40700
+#elif __has_include(<typeindex>)
+#  define BOOST_LIBSTDCXX_VERSION 40600
+#elif __has_include(<future>)
+#  define BOOST_LIBSTDCXX_VERSION 40500
+#elif  __has_include(<ratio>)
+#  define BOOST_LIBSTDCXX_VERSION 40400
+#elif __has_include(<array>)
+#  define BOOST_LIBSTDCXX_VERSION 40300
+#endif
+//
+//  GCC 4.8 and 9 add working versions of <atomic> and <regex> respectively.
+//  However, we have no test for these as the headers were present but broken
+//  in early GCC versions.
+//
+#endif
+
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130) && (__cplusplus >= 201103L)
+//
+// Oracle Solaris compiler uses it's own verison of libstdc++ but doesn't 
+// set __GNUC__
+//
+#define BOOST_LIBSTDCXX_VERSION 40800
+#endif
+
+#if !defined(BOOST_LIBSTDCXX_VERSION)
+#  define BOOST_LIBSTDCXX_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+//  C++0x headers in GCC 4.3.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40300) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#endif
+
+//  C++0x headers in GCC 4.4.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40400) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_SMART_PTR
+#else
+#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG 
+#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS 
+#endif
+
+//  C++0x features in GCC 4.5.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40500) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#endif
+
+//  C++0x features in GCC 4.6.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40600) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_ADDRESSOF
+#endif
+
+//  C++0x features in GCC 4.7.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40700) || !defined(BOOST_LIBSTDCXX11)
+// Note that although <chrono> existed prior to 4.7, "steady_clock" is spelled "monotonic_clock"
+// so 4.7.0 is the first truely conforming one.
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_ALLOCATOR
+#endif
+//  C++0x features in GCC 4.8.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40800) || !defined(BOOST_LIBSTDCXX11)
+// Note that although <atomic> existed prior to gcc 4.8 it was largely unimplemented for many types:
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_HDR_THREAD
+#endif
+//  C++0x features in GCC 4.9.0 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)
+// Although <regex> is present and compilable against, the actual implementation is not functional
+// even for the simplest patterns such as "\d" or "[0-9]". This is the case at least in gcc up to 4.8, inclusively.
+#  define BOOST_NO_CXX11_HDR_REGEX
+#endif
+
+#if defined(__clang_major__) && ((__clang_major__ < 3) || ((__clang_major__ == 3) && (__clang_minor__ < 7)))
+// As of clang-3.6, libstdc++ header <atomic> throws up errors with clang:
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#endif
+//
+//  C++0x features in GCC 5.1 and later
+//
+#if (BOOST_LIBSTDCXX_VERSION < 50100) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_STD_ALIGN
+#endif
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus <= 201103
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#elif __cplusplus < 201402 || (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+//
+// Headers not present on Solaris with the Oracle compiler:
+#if defined(__SUNPRO_CC)
+#define BOOST_NO_CXX11_HDR_FUTURE
+#define BOOST_NO_CXX11_HDR_FORWARD_LIST 
+#define BOOST_NO_CXX11_HDR_ATOMIC
+#endif
+
+#if (!defined(_GLIBCXX_HAS_GTHREADS) || !defined(_GLIBCXX_USE_C99_STDINT_TR1))
+   // Headers not always available:
+#  ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#     define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  endif
+#  ifndef BOOST_NO_CXX11_HDR_MUTEX
+#     define BOOST_NO_CXX11_HDR_MUTEX
+#  endif
+#  ifndef BOOST_NO_CXX11_HDR_THREAD
+#     define BOOST_NO_CXX11_HDR_THREAD
+#  endif
+#  ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#     define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#  endif
+#endif
+
+#if (!defined(_GTHREAD_USE_MUTEX_TIMEDLOCK) || (_GTHREAD_USE_MUTEX_TIMEDLOCK == 0)) && !defined(BOOST_NO_CXX11_HDR_MUTEX)
+// Timed mutexes are not always available:
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#endif
+
+//  --- end ---
diff --git a/gatb-core/thirdparty/boost/config/stdlib/modena.hpp b/gatb-core/thirdparty/boost/config/stdlib/modena.hpp
new file mode 100644
index 0000000..7a85e0c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/modena.hpp
@@ -0,0 +1,69 @@
+//  (C) Copyright Jens Maurer 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Modena C++ standard library (comes with KAI C++)
+
+#if !defined(MSIPL_COMPILE_H)
+#  include <boost/config/no_tr1/utility.hpp>
+#  if !defined(__MSIPL_COMPILE_H)
+#      error "This is not the Modena C++ library!"
+#  endif
+#endif
+
+#ifndef MSIPL_NL_TYPES
+#define BOOST_NO_STD_MESSAGES
+#endif
+
+#ifndef MSIPL_WCHART
+#define BOOST_NO_STD_WSTRING
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#define BOOST_STDLIB "Modena C++ standard library"
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/config/stdlib/msl.hpp b/gatb-core/thirdparty/boost/config/stdlib/msl.hpp
new file mode 100644
index 0000000..dd2775e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/msl.hpp
@@ -0,0 +1,88 @@
+//  (C) Copyright John Maddock 2001. 
+//  (C) Copyright Darin Adler 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Metrowerks standard library:
+
+#ifndef __MSL_CPP__
+#  include <boost/config/no_tr1/utility.hpp>
+#  ifndef __MSL_CPP__
+#     error This is not the MSL standard library!
+#  endif
+#endif
+
+#if __MSL_CPP__ >= 0x6000  // Pro 6
+#  define BOOST_HAS_HASH
+#  define BOOST_STD_EXTENSION_NAMESPACE Metrowerks
+#endif
+#define BOOST_HAS_SLIST
+
+#if __MSL_CPP__ < 0x6209
+#  define BOOST_NO_STD_MESSAGES
+#endif
+
+// check C lib version for <stdint.h>
+#include <cstddef>
+
+#if defined(__MSL__) && (__MSL__ >= 0x5000)
+#  define BOOST_HAS_STDINT_H
+#  if !defined(__PALMOS_TRAPS__)
+#    define BOOST_HAS_UNISTD_H
+#  endif
+   // boilerplate code:
+#  include <boost/config/posix_features.hpp>
+#endif
+
+#if defined(_MWMT) || _MSL_THREADSAFE
+#  define BOOST_HAS_THREADS
+#endif
+
+#ifdef _MSL_NO_EXPLICIT_FUNC_TEMPLATE_ARG
+#  define BOOST_NO_STD_USE_FACET
+#  define BOOST_HAS_TWO_ARG_USE_FACET
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__)
diff --git a/gatb-core/thirdparty/boost/config/stdlib/roguewave.hpp b/gatb-core/thirdparty/boost/config/stdlib/roguewave.hpp
new file mode 100644
index 0000000..97a2b0b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/roguewave.hpp
@@ -0,0 +1,198 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Jens Maurer 2001. 
+//  (C) Copyright David Abrahams 2003. 
+//  (C) Copyright Boris Gubenko 2007. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Rogue Wave std lib:
+
+#define BOOST_RW_STDLIB 1 
+
+#if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)
+#  include <boost/config/no_tr1/utility.hpp>
+#  if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)
+#     error This is not the Rogue Wave standard library
+#  endif
+#endif
+//
+// figure out a consistent version number:
+//
+#ifndef _RWSTD_VER
+#  define BOOST_RWSTD_VER 0x010000
+#elif _RWSTD_VER < 0x010000
+#  define BOOST_RWSTD_VER (_RWSTD_VER << 8)
+#else
+#  define BOOST_RWSTD_VER _RWSTD_VER
+#endif
+
+#ifndef _RWSTD_VER
+#  define BOOST_STDLIB "Rogue Wave standard library version (Unknown version)"
+#elif _RWSTD_VER < 0x04010200
+ #  define BOOST_STDLIB "Rogue Wave standard library version " BOOST_STRINGIZE(_RWSTD_VER)
+#else
+#  ifdef _RWSTD_VER_STR
+#    define BOOST_STDLIB "Apache STDCXX standard library version " _RWSTD_VER_STR
+#  else
+#    define BOOST_STDLIB "Apache STDCXX standard library version " BOOST_STRINGIZE(_RWSTD_VER)
+#  endif
+#endif
+
+//
+// Prior to version 2.2.0 the primary template for std::numeric_limits
+// does not have compile time constants, even though specializations of that
+// template do:
+//
+#if BOOST_RWSTD_VER < 0x020200
+#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#endif
+
+// Sun CC 5.5 patch 113817-07 adds long long specialization, but does not change the
+// library version number (http://sunsolve6.sun.com/search/document.do?assetkey=1-21-113817):
+#if BOOST_RWSTD_VER <= 0x020101 && (!defined(__SUNPRO_CC) || (__SUNPRO_CC < 0x550))
+#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS
+# endif
+
+//
+// Borland version of numeric_limits lacks __int64 specialisation:
+//
+#ifdef __BORLANDC__
+#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#endif
+
+//
+// No std::iterator if it can't figure out default template args:
+//
+#if defined(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || defined(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || (BOOST_RWSTD_VER < 0x020000)
+#  define BOOST_NO_STD_ITERATOR
+#endif
+
+//
+// No iterator traits without partial specialization:
+//
+#if defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) || defined(RWSTD_NO_CLASS_PARTIAL_SPEC)
+#  define BOOST_NO_STD_ITERATOR_TRAITS
+#endif
+
+//
+// Prior to version 2.0, std::auto_ptr was buggy, and there were no
+// new-style iostreams, and no conformant std::allocator:
+//
+#if (BOOST_RWSTD_VER < 0x020000)
+#  define BOOST_NO_AUTO_PTR
+#  define BOOST_NO_STRINGSTREAM
+#  define BOOST_NO_STD_ALLOCATOR
+#  define BOOST_NO_STD_LOCALE
+#endif
+
+//
+// No template iterator constructors without member template support:
+//
+#if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(_RWSTD_NO_MEMBER_TEMPLATES)
+#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+#endif
+
+//
+// RW defines _RWSTD_ALLOCATOR if the allocator is conformant and in use
+// (the or _HPACC_ part is a hack - the library seems to define _RWSTD_ALLOCATOR
+// on HP aCC systems even though the allocator is in fact broken):
+//
+#if !defined(_RWSTD_ALLOCATOR) || (defined(__HP_aCC) && __HP_aCC <= 33100)
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+//
+// If we have a std::locale, we still may not have std::use_facet:
+//
+#if defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) && !defined(BOOST_NO_STD_LOCALE)
+#  define BOOST_NO_STD_USE_FACET
+#  define BOOST_HAS_TWO_ARG_USE_FACET
+#endif
+
+//
+// There's no std::distance prior to version 2, or without
+// partial specialization support:
+//
+#if (BOOST_RWSTD_VER < 0x020000) || defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
+    #define BOOST_NO_STD_DISTANCE
+#endif
+
+//
+// Some versions of the rogue wave library don't have assignable
+// OutputIterators:
+//
+#if BOOST_RWSTD_VER < 0x020100
+#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN
+#endif
+
+//
+// Disable BOOST_HAS_LONG_LONG when the library has no support for it.
+//
+#if !defined(_RWSTD_LONG_LONG) && defined(BOOST_HAS_LONG_LONG)
+#  undef BOOST_HAS_LONG_LONG
+#endif
+
+//
+// check that on HP-UX, the proper RW library is used
+//
+#if defined(__HP_aCC) && !defined(_HP_NAMESPACE_STD)
+#  error "Boost requires Standard RW library. Please compile and link with -AA"
+#endif
+
+//
+// Define macros specific to RW V2.2 on HP-UX
+//
+#if defined(__HP_aCC) && (BOOST_RWSTD_VER == 0x02020100)
+#  ifndef __HP_TC1_MAKE_PAIR
+#    define __HP_TC1_MAKE_PAIR
+#  endif
+#  ifndef _HP_INSTANTIATE_STD2_VL
+#    define _HP_INSTANTIATE_STD2_VL
+#  endif
+#endif
+
+#if _RWSTD_VER < 0x05000000
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#endif
+// type_traits header is incomplete:
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+//
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
diff --git a/gatb-core/thirdparty/boost/config/stdlib/sgi.hpp b/gatb-core/thirdparty/boost/config/stdlib/sgi.hpp
new file mode 100644
index 0000000..c805271
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/sgi.hpp
@@ -0,0 +1,158 @@
+//  (C) Copyright John Maddock 2001 - 2003. 
+//  (C) Copyright Darin Adler 2001. 
+//  (C) Copyright Jens Maurer 2001 - 2003. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  generic SGI STL:
+
+#if !defined(__STL_CONFIG_H)
+#  include <boost/config/no_tr1/utility.hpp>
+#  if !defined(__STL_CONFIG_H)
+#      error "This is not the SGI STL!"
+#  endif
+#endif
+
+//
+// No std::iterator traits without partial specialisation:
+//
+#if !defined(__STL_CLASS_PARTIAL_SPECIALIZATION)
+#  define BOOST_NO_STD_ITERATOR_TRAITS
+#endif
+
+//
+// No std::stringstream with gcc < 3
+//
+#if defined(__GNUC__) && (__GNUC__ < 3) && \
+     ((__GNUC_MINOR__ < 95) || (__GNUC_MINOR__ == 96)) && \
+     !defined(__STL_USE_NEW_IOSTREAMS) || \
+   defined(__APPLE_CC__)
+   // Note that we only set this for GNU C++ prior to 2.95 since the
+   // latest patches for that release do contain a minimal <sstream>
+   // If you are running a 2.95 release prior to 2.95.3 then this will need
+   // setting, but there is no way to detect that automatically (other
+   // than by running the configure script).
+   // Also, the unofficial GNU C++ 2.96 included in RedHat 7.1 doesn't
+   // have <sstream>.
+#  define BOOST_NO_STRINGSTREAM
+#endif
+
+// Apple doesn't seem to reliably defined a *unix* macro
+#if !defined(CYGWIN) && (  defined(__unix__)  \
+                        || defined(__unix)    \
+                        || defined(unix)      \
+                        || defined(__APPLE__) \
+                        || defined(__APPLE)   \
+                        || defined(APPLE))
+#  include <unistd.h>
+#endif
+
+
+//
+// Assume no std::locale without own iostreams (this may be an
+// incorrect assumption in some cases):
+//
+#if !defined(__SGI_STL_OWN_IOSTREAMS) && !defined(__STL_USE_NEW_IOSTREAMS)
+#  define BOOST_NO_STD_LOCALE
+#endif
+
+//
+// Original native SGI streams have non-standard std::messages facet:
+//
+#if defined(__sgi) && (_COMPILER_VERSION <= 650) && !defined(__SGI_STL_OWN_IOSTREAMS)
+#  define BOOST_NO_STD_LOCALE
+#endif
+
+//
+// SGI's new iostreams have missing "const" in messages<>::open
+//
+#if defined(__sgi) && (_COMPILER_VERSION <= 740) && defined(__STL_USE_NEW_IOSTREAMS)
+#  define BOOST_NO_STD_MESSAGES
+#endif
+
+//
+// No template iterator constructors, or std::allocator
+// without member templates:
+//
+#if !defined(__STL_MEMBER_TEMPLATES)
+#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+//
+// We always have SGI style hash_set, hash_map, and slist:
+//
+#define BOOST_HAS_HASH
+#define BOOST_HAS_SLIST
+
+//
+// If this is GNU libstdc++2, then no <limits> and no std::wstring:
+//
+#if (defined(__GNUC__) && (__GNUC__ < 3))
+#  include <string>
+#  if defined(__BASTRING__)
+#     define BOOST_NO_LIMITS
+// Note: <boost/limits.hpp> will provide compile-time constants
+#     undef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#     define BOOST_NO_STD_WSTRING
+#  endif
+#endif
+
+//
+// There is no standard iterator unless we have namespace support:
+//
+#if !defined(__STL_USE_NAMESPACES)
+#  define BOOST_NO_STD_ITERATOR
+#endif
+
+//
+// Intrinsic type_traits support.
+// The SGI STL has it's own __type_traits class, which
+// has intrinsic compiler support with SGI's compilers.
+// Whatever map SGI style type traits to boost equivalents:
+//
+#define BOOST_HAS_SGI_TYPE_TRAITS
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#define BOOST_STDLIB "SGI standard library"
\ No newline at end of file
diff --git a/gatb-core/thirdparty/boost/config/stdlib/stlport.hpp b/gatb-core/thirdparty/boost/config/stdlib/stlport.hpp
new file mode 100644
index 0000000..bbc4176
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/stlport.hpp
@@ -0,0 +1,248 @@
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  (C) Copyright Darin Adler 2001. 
+//  (C) Copyright Jens Maurer 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  STLPort standard library config:
+
+#if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+#  include <cstddef>
+#  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+#      error "This is not STLPort!"
+#  endif
+#endif
+
+// Apple doesn't seem to reliably defined a *unix* macro
+#if !defined(CYGWIN) && (  defined(__unix__)  \
+                        || defined(__unix)    \
+                        || defined(unix)      \
+                        || defined(__APPLE__) \
+                        || defined(__APPLE)   \
+                        || defined(APPLE))
+#  include <unistd.h>
+#endif
+
+//
+// __STL_STATIC_CONST_INIT_BUG implies BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+// for versions prior to 4.1(beta)
+//
+#if (defined(__STL_STATIC_CONST_INIT_BUG) || defined(_STLP_STATIC_CONST_INIT_BUG)) && (__SGI_STL_PORT <= 0x400)
+#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#endif
+
+//
+// If STLport thinks that there is no partial specialisation, then there is no
+// std::iterator traits:
+//
+#if !(defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined(__STL_CLASS_PARTIAL_SPECIALIZATION))
+#  define BOOST_NO_STD_ITERATOR_TRAITS
+#endif
+
+//
+// No new style iostreams on GCC without STLport's iostreams enabled:
+//
+#if (defined(__GNUC__) && (__GNUC__ < 3)) && !(defined(__SGI_STL_OWN_IOSTREAMS) || defined(_STLP_OWN_IOSTREAMS))
+#  define BOOST_NO_STRINGSTREAM
+#endif
+
+//
+// No new iostreams implies no std::locale, and no std::stringstream:
+//
+#if defined(__STL_NO_IOSTREAMS) || defined(__STL_NO_NEW_IOSTREAMS) || defined(_STLP_NO_IOSTREAMS) || defined(_STLP_NO_NEW_IOSTREAMS)
+#  define BOOST_NO_STD_LOCALE
+#  define BOOST_NO_STRINGSTREAM
+#endif
+
+//
+// If the streams are not native, and we have a "using ::x" compiler bug
+// then the io stream facets are not available in namespace std::
+//
+#ifdef _STLPORT_VERSION
+#  if !(_STLPORT_VERSION >= 0x500) && !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__)
+#     define BOOST_NO_STD_LOCALE
+#  endif
+#else
+#  if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__)
+#     define BOOST_NO_STD_LOCALE
+#  endif
+#endif
+
+#if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520)
+#  define BOOST_HAS_TR1_UNORDERED_SET
+#  define BOOST_HAS_TR1_UNORDERED_MAP
+#endif
+//
+// Without member template support enabled, their are no template
+// iterate constructors, and no std::allocator:
+//
+#if !(defined(__STL_MEMBER_TEMPLATES) || defined(_STLP_MEMBER_TEMPLATES))
+#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+//
+// however we always have at least a partial allocator:
+//
+#define BOOST_HAS_PARTIAL_STD_ALLOCATOR
+
+#if !defined(_STLP_MEMBER_TEMPLATE_CLASSES) || defined(_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+#if defined(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) && defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+//
+// If STLport thinks there is no wchar_t at all, then we have to disable
+// the support for the relevant specilazations of std:: templates.
+//
+#if !defined(_STLP_HAS_WCHAR_T) && !defined(_STLP_WCHAR_T_IS_USHORT)
+#  ifndef  BOOST_NO_STD_WSTRING
+#     define BOOST_NO_STD_WSTRING
+#  endif
+#  ifndef  BOOST_NO_STD_WSTREAMBUF
+#     define BOOST_NO_STD_WSTREAMBUF
+#  endif
+#endif
+
+//
+// We always have SGI style hash_set, hash_map, and slist:
+//
+#ifndef _STLP_NO_EXTENSIONS
+#define BOOST_HAS_HASH
+#define BOOST_HAS_SLIST
+#endif
+
+//
+// STLport does a good job of importing names into namespace std::,
+// but doesn't always get them all, define BOOST_NO_STDC_NAMESPACE, since our
+// workaround does not conflict with STLports:
+//
+//
+// Harold Howe says:
+// Borland switched to STLport in BCB6. Defining BOOST_NO_STDC_NAMESPACE with
+// BCB6 does cause problems. If we detect C++ Builder, then don't define 
+// BOOST_NO_STDC_NAMESPACE
+//
+#if !defined(__BORLANDC__) && !defined(__DMC__)
+//
+// If STLport is using it's own namespace, and the real names are in
+// the global namespace, then we duplicate STLport's using declarations
+// (by defining BOOST_NO_STDC_NAMESPACE), we do this because STLport doesn't
+// necessarily import all the names we need into namespace std::
+// 
+#  if (defined(__STL_IMPORT_VENDOR_CSTD) \
+         || defined(__STL_USE_OWN_NAMESPACE) \
+         || defined(_STLP_IMPORT_VENDOR_CSTD) \
+         || defined(_STLP_USE_OWN_NAMESPACE)) \
+      && (defined(__STL_VENDOR_GLOBAL_CSTD) || defined (_STLP_VENDOR_GLOBAL_CSTD))
+#     define BOOST_NO_STDC_NAMESPACE
+#     define BOOST_NO_EXCEPTION_STD_NAMESPACE
+#  endif
+#elif defined(__BORLANDC__) && __BORLANDC__ < 0x560
+// STLport doesn't import std::abs correctly:
+#include <stdlib.h>
+namespace std { using ::abs; }
+// and strcmp/strcpy don't get imported either ('cos they are macros)
+#include <string.h>
+#ifdef strcpy
+#  undef strcpy
+#endif
+#ifdef strcmp
+#  undef strcmp
+#endif
+#ifdef _STLP_VENDOR_CSTD
+namespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy; }
+#endif
+#endif
+
+//
+// std::use_facet may be non-standard, uses a class instead:
+//
+#if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) || defined(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)
+#  define BOOST_NO_STD_USE_FACET
+#  define BOOST_HAS_STLP_USE_FACET
+#endif
+
+//
+// If STLport thinks there are no wide functions, <cwchar> etc. is not working; but
+// only if BOOST_NO_STDC_NAMESPACE is not defined (if it is then we do the import 
+// into std:: ourselves).
+//
+#if defined(_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined(BOOST_NO_STDC_NAMESPACE)
+#  define BOOST_NO_CWCHAR
+#  define BOOST_NO_CWCTYPE
+#endif
+
+//
+// If STLport for some reason was configured so that it thinks that wchar_t
+// is not an intrinsic type, then we have to disable the support for it as
+// well (we would be missing required specializations otherwise).
+//
+#if !defined( _STLP_HAS_WCHAR_T) || defined(_STLP_WCHAR_T_IS_USHORT)
+#  undef  BOOST_NO_INTRINSIC_WCHAR_T
+#  define BOOST_NO_INTRINSIC_WCHAR_T
+#endif
+
+//
+// Borland ships a version of STLport with C++ Builder 6 that lacks
+// hashtables and the like:
+//
+#if defined(__BORLANDC__) && (__BORLANDC__ == 0x560)
+#  undef BOOST_HAS_HASH
+#endif
+
+//
+// gcc-2.95.3/STLPort does not like the using declarations we use to get ADL with std::min/max
+//
+#if defined(__GNUC__) && (__GNUC__ < 3)
+#  include <algorithm> // for std::min and std::max
+#  define BOOST_USING_STD_MIN() ((void)0)
+#  define BOOST_USING_STD_MAX() ((void)0)
+namespace boost { using std::min; using std::max; }
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT)
diff --git a/gatb-core/thirdparty/boost/config/stdlib/vacpp.hpp b/gatb-core/thirdparty/boost/config/stdlib/vacpp.hpp
new file mode 100644
index 0000000..4ccd0d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/stdlib/vacpp.hpp
@@ -0,0 +1,64 @@
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+#if __IBMCPP__ <= 501
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+#define BOOST_HAS_MACRO_USE_FACET
+#define BOOST_NO_STD_MESSAGES
+
+// Apple doesn't seem to reliably defined a *unix* macro
+#if !defined(CYGWIN) && (  defined(__unix__)  \
+                        || defined(__unix)    \
+                        || defined(unix)      \
+                        || defined(__APPLE__) \
+                        || defined(__APPLE)   \
+                        || defined(APPLE))
+#  include <unistd.h>
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_CXX11_HDR_ARRAY
+#  define BOOST_NO_CXX11_HDR_CHRONO
+#  define BOOST_NO_CXX11_HDR_CODECVT
+#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
+#  define BOOST_NO_CXX11_HDR_FUTURE
+#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#  define BOOST_NO_CXX11_HDR_MUTEX
+#  define BOOST_NO_CXX11_HDR_RANDOM
+#  define BOOST_NO_CXX11_HDR_RATIO
+#  define BOOST_NO_CXX11_HDR_REGEX
+#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
+#  define BOOST_NO_CXX11_HDR_THREAD
+#  define BOOST_NO_CXX11_HDR_TUPLE
+#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#  define BOOST_NO_CXX11_HDR_TYPEINDEX
+#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#  define BOOST_NO_CXX11_HDR_UNORDERED_SET
+#  define BOOST_NO_CXX11_NUMERIC_LIMITS
+#  define BOOST_NO_CXX11_ALLOCATOR
+#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#  define BOOST_NO_CXX11_SMART_PTR
+#  define BOOST_NO_CXX11_HDR_FUNCTIONAL
+#  define BOOST_NO_CXX11_HDR_ATOMIC
+#  define BOOST_NO_CXX11_STD_ALIGN
+#  define BOOST_NO_CXX11_ADDRESSOF
+
+#if defined(__has_include)
+#if !__has_include(<shared_mutex>)
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#elif __cplusplus < 201402
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+#else
+#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+#endif
+
+#define BOOST_STDLIB "Visual Age default standard library"
diff --git a/gatb-core/thirdparty/boost/config/suffix.hpp b/gatb-core/thirdparty/boost/config/suffix.hpp
new file mode 100644
index 0000000..c0ba333
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/suffix.hpp
@@ -0,0 +1,995 @@
+//  Boost config.hpp configuration header file  ------------------------------//
+//  boostinspect:ndprecated_macros -- tell the inspect tool to ignore this file
+
+//  Copyright (c) 2001-2003 John Maddock
+//  Copyright (c) 2001 Darin Adler
+//  Copyright (c) 2001 Peter Dimov
+//  Copyright (c) 2002 Bill Kempf
+//  Copyright (c) 2002 Jens Maurer
+//  Copyright (c) 2002-2003 David Abrahams
+//  Copyright (c) 2003 Gennaro Prota
+//  Copyright (c) 2003 Eric Friedman
+//  Copyright (c) 2010 Eric Jourdanneau, Joel Falcou
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/ for most recent version.
+
+//  Boost config.hpp policy and rationale documentation has been moved to
+//  http://www.boost.org/libs/config/
+//
+//  This file is intended to be stable, and relatively unchanging.
+//  It should contain boilerplate code only - no compiler specific
+//  code unless it is unavoidable - no changes unless unavoidable.
+
+#ifndef BOOST_CONFIG_SUFFIX_HPP
+#define BOOST_CONFIG_SUFFIX_HPP
+
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+//
+// Some GCC-4.x versions issue warnings even when __extension__ is used,
+// so use this as a workaround:
+//
+#pragma GCC system_header
+#endif
+
+//
+// ensure that visibility macros are always defined, thus symplifying use
+//
+#ifndef BOOST_SYMBOL_EXPORT
+# define BOOST_SYMBOL_EXPORT
+#endif
+#ifndef BOOST_SYMBOL_IMPORT
+# define BOOST_SYMBOL_IMPORT
+#endif
+#ifndef BOOST_SYMBOL_VISIBLE
+# define BOOST_SYMBOL_VISIBLE
+#endif
+
+//
+// look for long long by looking for the appropriate macros in <limits.h>.
+// Note that we use limits.h rather than climits for maximal portability,
+// remember that since these just declare a bunch of macros, there should be
+// no namespace issues from this.
+//
+#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG)                                              \
+   && !defined(BOOST_MSVC) && !defined(__BORLANDC__)
+# include <limits.h>
+# if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
+#   define BOOST_HAS_LONG_LONG
+# else
+#   define BOOST_NO_LONG_LONG
+# endif
+#endif
+
+// GCC 3.x will clean up all of those nasty macro definitions that
+// BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine
+// it under GCC 3.x.
+#if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS)
+#  undef BOOST_NO_CTYPE_FUNCTIONS
+#endif
+
+//
+// Assume any extensions are in namespace std:: unless stated otherwise:
+//
+#  ifndef BOOST_STD_EXTENSION_NAMESPACE
+#    define BOOST_STD_EXTENSION_NAMESPACE std
+#  endif
+
+//
+// If cv-qualified specializations are not allowed, then neither are cv-void ones:
+//
+#  if defined(BOOST_NO_CV_SPECIALIZATIONS) \
+      && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)
+#     define BOOST_NO_CV_VOID_SPECIALIZATIONS
+#  endif
+
+//
+// If there is no numeric_limits template, then it can't have any compile time
+// constants either!
+//
+#  if defined(BOOST_NO_LIMITS) \
+      && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
+#     define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#     define BOOST_NO_LONG_LONG_NUMERIC_LIMITS
+#  endif
+
+//
+// if there is no long long then there is no specialisation
+// for numeric_limits<long long> either:
+//
+#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)
+#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS
+#endif
+
+//
+// if there is no __int64 then there is no specialisation
+// for numeric_limits<__int64> either:
+//
+#if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)
+#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS
+#endif
+
+//
+// if member templates are supported then so is the
+// VC6 subset of member templates:
+//
+#  if !defined(BOOST_NO_MEMBER_TEMPLATES) \
+       && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
+#     define BOOST_MSVC6_MEMBER_TEMPLATES
+#  endif
+
+//
+// Without partial specialization, can't test for partial specialisation bugs:
+//
+#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+      && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG)
+#     define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
+#  endif
+
+//
+// Without partial specialization, we can't have array-type partial specialisations:
+//
+#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+      && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+#     define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS
+#  endif
+
+//
+// Without partial specialization, std::iterator_traits can't work:
+//
+#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+      && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
+#     define BOOST_NO_STD_ITERATOR_TRAITS
+#  endif
+
+//
+// Without partial specialization, partial
+// specialization with default args won't work either:
+//
+#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+      && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
+#     define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
+#  endif
+
+//
+// Without member template support, we can't have template constructors
+// in the standard library either:
+//
+#  if defined(BOOST_NO_MEMBER_TEMPLATES) \
+      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \
+      && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
+#     define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+#  endif
+
+//
+// Without member template support, we can't have a conforming
+// std::allocator template either:
+//
+#  if defined(BOOST_NO_MEMBER_TEMPLATES) \
+      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \
+      && !defined(BOOST_NO_STD_ALLOCATOR)
+#     define BOOST_NO_STD_ALLOCATOR
+#  endif
+
+//
+// without ADL support then using declarations will break ADL as well:
+//
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
+#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
+#endif
+
+//
+// Without typeid support we have no dynamic RTTI either:
+//
+#if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI)
+#  define BOOST_NO_RTTI
+#endif
+
+//
+// If we have a standard allocator, then we have a partial one as well:
+//
+#if !defined(BOOST_NO_STD_ALLOCATOR)
+#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR
+#endif
+
+//
+// We can't have a working std::use_facet if there is no std::locale:
+//
+#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET)
+#     define BOOST_NO_STD_USE_FACET
+#  endif
+
+//
+// We can't have a std::messages facet if there is no std::locale:
+//
+#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES)
+#     define BOOST_NO_STD_MESSAGES
+#  endif
+
+//
+// We can't have a working std::wstreambuf if there is no std::locale:
+//
+#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF)
+#     define BOOST_NO_STD_WSTREAMBUF
+#  endif
+
+//
+// We can't have a <cwctype> if there is no <cwchar>:
+//
+#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE)
+#     define BOOST_NO_CWCTYPE
+#  endif
+
+//
+// We can't have a swprintf if there is no <cwchar>:
+//
+#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)
+#     define BOOST_NO_SWPRINTF
+#  endif
+
+//
+// If Win32 support is turned off, then we must turn off
+// threading support also, unless there is some other
+// thread API enabled:
+//
+#if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \
+   && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS)
+#  define BOOST_DISABLE_THREADS
+#endif
+
+//
+// Turn on threading support if the compiler thinks that it's in
+// multithreaded mode.  We put this here because there are only a
+// limited number of macros that identify this (if there's any missing
+// from here then add to the appropriate compiler section):
+//
+#if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \
+    || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \
+    && !defined(BOOST_HAS_THREADS)
+#  define BOOST_HAS_THREADS
+#endif
+
+//
+// Turn threading support off if BOOST_DISABLE_THREADS is defined:
+//
+#if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS)
+#  undef BOOST_HAS_THREADS
+#endif
+
+//
+// Turn threading support off if we don't recognise the threading API:
+//
+#if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\
+      && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\
+      && !defined(BOOST_HAS_MPTASKS)
+#  undef BOOST_HAS_THREADS
+#endif
+
+//
+// Turn threading detail macros off if we don't (want to) use threading
+//
+#ifndef BOOST_HAS_THREADS
+#  undef BOOST_HAS_PTHREADS
+#  undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
+#  undef BOOST_HAS_PTHREAD_YIELD
+#  undef BOOST_HAS_PTHREAD_DELAY_NP
+#  undef BOOST_HAS_WINTHREADS
+#  undef BOOST_HAS_BETHREADS
+#  undef BOOST_HAS_MPTASKS
+#endif
+
+//
+// If the compiler claims to be C99 conformant, then it had better
+// have a <stdint.h>:
+//
+#  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
+#     define BOOST_HAS_STDINT_H
+#     ifndef BOOST_HAS_LOG1P
+#        define BOOST_HAS_LOG1P
+#     endif
+#     ifndef BOOST_HAS_EXPM1
+#        define BOOST_HAS_EXPM1
+#     endif
+#  endif
+
+//
+// Define BOOST_NO_SLIST and BOOST_NO_HASH if required.
+// Note that this is for backwards compatibility only.
+//
+#  if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST)
+#     define BOOST_NO_SLIST
+#  endif
+
+#  if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH)
+#     define BOOST_NO_HASH
+#  endif
+
+//
+// Set BOOST_SLIST_HEADER if not set already:
+//
+#if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER)
+#  define BOOST_SLIST_HEADER <slist>
+#endif
+
+//
+// Set BOOST_HASH_SET_HEADER if not set already:
+//
+#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER)
+#  define BOOST_HASH_SET_HEADER <hash_set>
+#endif
+
+//
+// Set BOOST_HASH_MAP_HEADER if not set already:
+//
+#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER)
+#  define BOOST_HASH_MAP_HEADER <hash_map>
+#endif
+
+//  BOOST_HAS_ABI_HEADERS
+//  This macro gets set if we have headers that fix the ABI,
+//  and prevent ODR violations when linking to external libraries:
+#if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS)
+#  define BOOST_HAS_ABI_HEADERS
+#endif
+
+#if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS)
+#  undef BOOST_HAS_ABI_HEADERS
+#endif
+
+//  BOOST_NO_STDC_NAMESPACE workaround  --------------------------------------//
+//  Because std::size_t usage is so common, even in boost headers which do not
+//  otherwise use the C library, the <cstddef> workaround is included here so
+//  that ugly workaround code need not appear in many other boost headers.
+//  NOTE WELL: This is a workaround for non-conforming compilers; <cstddef>
+//  must still be #included in the usual places so that <cstddef> inclusion
+//  works as expected with standard conforming compilers.  The resulting
+//  double inclusion of <cstddef> is harmless.
+
+# if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)
+#   include <cstddef>
+    namespace std { using ::ptrdiff_t; using ::size_t; }
+# endif
+
+//  Workaround for the unfortunate min/max macros defined by some platform headers
+
+#define BOOST_PREVENT_MACRO_SUBSTITUTION
+
+#ifndef BOOST_USING_STD_MIN
+#  define BOOST_USING_STD_MIN() using std::min
+#endif
+
+#ifndef BOOST_USING_STD_MAX
+#  define BOOST_USING_STD_MAX() using std::max
+#endif
+
+//  BOOST_NO_STD_MIN_MAX workaround  -----------------------------------------//
+
+#  if defined(BOOST_NO_STD_MIN_MAX) && defined(__cplusplus)
+
+namespace std {
+  template <class _Tp>
+  inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {
+    return __b < __a ? __b : __a;
+  }
+  template <class _Tp>
+  inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {
+    return  __a < __b ? __b : __a;
+  }
+}
+
+#  endif
+
+// BOOST_STATIC_CONSTANT workaround --------------------------------------- //
+// On compilers which don't allow in-class initialization of static integral
+// constant members, we must use enums as a workaround if we want the constants
+// to be available at compile-time. This macro gives us a convenient way to
+// declare such constants.
+
+#  ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+#       define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
+#  else
+#     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
+#  endif
+
+// BOOST_USE_FACET / HAS_FACET workaround ----------------------------------//
+// When the standard library does not have a conforming std::use_facet there
+// are various workarounds available, but they differ from library to library.
+// The same problem occurs with has_facet.
+// These macros provide a consistent way to access a locale's facets.
+// Usage:
+//    replace
+//       std::use_facet<Type>(loc);
+//    with
+//       BOOST_USE_FACET(Type, loc);
+//    Note do not add a std:: prefix to the front of BOOST_USE_FACET!
+//  Use for BOOST_HAS_FACET is analogous.
+
+#if defined(BOOST_NO_STD_USE_FACET)
+#  ifdef BOOST_HAS_TWO_ARG_USE_FACET
+#     define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast<Type*>(0))
+#     define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast<Type*>(0))
+#  elif defined(BOOST_HAS_MACRO_USE_FACET)
+#     define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type)
+#     define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type)
+#  elif defined(BOOST_HAS_STLP_USE_FACET)
+#     define BOOST_USE_FACET(Type, loc) (*std::_Use_facet<Type >(loc))
+#     define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)
+#  endif
+#else
+#  define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc)
+#  define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)
+#endif
+
+// BOOST_NESTED_TEMPLATE workaround ------------------------------------------//
+// Member templates are supported by some compilers even though they can't use
+// the A::template member<U> syntax, as a workaround replace:
+//
+// typedef typename A::template rebind<U> binder;
+//
+// with:
+//
+// typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;
+
+#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD
+#  define BOOST_NESTED_TEMPLATE template
+#else
+#  define BOOST_NESTED_TEMPLATE
+#endif
+
+// BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------//
+// Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION
+// is defined, in which case it evaluates to return x; Use when you have a return
+// statement that can never be reached.
+
+#ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION
+#  define BOOST_UNREACHABLE_RETURN(x) return x;
+#else
+#  define BOOST_UNREACHABLE_RETURN(x)
+#endif
+
+// BOOST_DEDUCED_TYPENAME workaround ------------------------------------------//
+//
+// Some compilers don't support the use of `typename' for dependent
+// types in deduced contexts, e.g.
+//
+//     template <class T> void f(T, typename T::type);
+//                                  ^^^^^^^^
+// Replace these declarations with:
+//
+//     template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);
+
+#ifndef BOOST_NO_DEDUCED_TYPENAME
+#  define BOOST_DEDUCED_TYPENAME typename
+#else
+#  define BOOST_DEDUCED_TYPENAME
+#endif
+
+#ifndef BOOST_NO_TYPENAME_WITH_CTOR
+#  define BOOST_CTOR_TYPENAME typename
+#else
+#  define BOOST_CTOR_TYPENAME
+#endif
+
+// long long workaround ------------------------------------------//
+// On gcc (and maybe other compilers?) long long is alway supported
+// but it's use may generate either warnings (with -ansi), or errors
+// (with -pedantic -ansi) unless it's use is prefixed by __extension__
+//
+#if defined(BOOST_HAS_LONG_LONG) && defined(__cplusplus)
+namespace boost{
+#  ifdef __GNUC__
+   __extension__ typedef long long long_long_type;
+   __extension__ typedef unsigned long long ulong_long_type;
+#  else
+   typedef long long long_long_type;
+   typedef unsigned long long ulong_long_type;
+#  endif
+}
+#endif
+// same again for __int128:
+#if defined(BOOST_HAS_INT128) && defined(__cplusplus)
+namespace boost{
+#  ifdef __GNUC__
+   __extension__ typedef __int128 int128_type;
+   __extension__ typedef unsigned __int128 uint128_type;
+#  else
+   typedef __int128 int128_type;
+   typedef unsigned __int128 uint128_type;
+#  endif
+}
+#endif
+
+// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//
+
+// These macros are obsolete. Port away and remove.
+
+#  define BOOST_EXPLICIT_TEMPLATE_TYPE(t)
+#  define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
+#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
+#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
+
+#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)
+#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
+#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
+#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
+
+// When BOOST_NO_STD_TYPEINFO is defined, we can just import
+// the global definition into std namespace:
+#if defined(BOOST_NO_STD_TYPEINFO) && defined(__cplusplus)
+#include <typeinfo>
+namespace std{ using ::type_info; }
+#endif
+
+// ---------------------------------------------------------------------------//
+
+//
+// Helper macro BOOST_STRINGIZE:
+// Converts the parameter X to a string after macro replacement
+// on X has been performed.
+//
+#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
+#define BOOST_DO_STRINGIZE(X) #X
+
+//
+// Helper macro BOOST_JOIN:
+// The following piece of macro magic joins the two
+// arguments together, even when one of the arguments is
+// itself a macro (see 16.3.1 in C++ standard).  The key
+// is that macro expansion of macro arguments does not
+// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN.
+//
+#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )
+#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)
+#define BOOST_DO_JOIN2( X, Y ) X##Y
+
+//
+// Set some default values for compiler/library/platform names.
+// These are for debugging config setup only:
+//
+#  ifndef BOOST_COMPILER
+#     define BOOST_COMPILER "Unknown ISO C++ Compiler"
+#  endif
+#  ifndef BOOST_STDLIB
+#     define BOOST_STDLIB "Unknown ISO standard library"
+#  endif
+#  ifndef BOOST_PLATFORM
+#     if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \
+         || defined(_POSIX_SOURCE)
+#        define BOOST_PLATFORM "Generic Unix"
+#     else
+#        define BOOST_PLATFORM "Unknown"
+#     endif
+#  endif
+
+//
+// Set some default values GPU support
+//
+#  ifndef BOOST_GPU_ENABLED
+#  define BOOST_GPU_ENABLED
+#  endif
+
+// BOOST_FORCEINLINE ---------------------------------------------//
+// Macro to use in place of 'inline' to force a function to be inline
+#if !defined(BOOST_FORCEINLINE)
+#  if defined(_MSC_VER)
+#    define BOOST_FORCEINLINE __forceinline
+#  elif defined(__GNUC__) && __GNUC__ > 3
+     // Clang also defines __GNUC__ (as 4)
+#    define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))
+#  else
+#    define BOOST_FORCEINLINE inline
+#  endif
+#endif
+
+// BOOST_NOINLINE ---------------------------------------------//
+// Macro to use in place of 'inline' to prevent a function to be inlined
+#if !defined(BOOST_NOINLINE)
+#  if defined(_MSC_VER)
+#    define BOOST_NOINLINE __declspec(noinline)
+#  elif defined(__GNUC__) && __GNUC__ > 3
+     // Clang also defines __GNUC__ (as 4)
+#    if defined(__CUDACC__)
+       // nvcc doesn't always parse __noinline__, 
+       // see: https://svn.boost.org/trac/boost/ticket/9392
+#      define BOOST_NOINLINE __attribute__ ((noinline))
+#    else
+#      define BOOST_NOINLINE __attribute__ ((__noinline__))
+#    endif
+#  else
+#    define BOOST_NOINLINE
+#  endif
+#endif
+
+// BOOST_NORETURN ---------------------------------------------//
+// Macro to use before a function declaration/definition to designate
+// the function as not returning normally (i.e. with a return statement
+// or by leaving the function scope, if the function return type is void).
+#if !defined(BOOST_NORETURN)
+#  if defined(_MSC_VER)
+#    define BOOST_NORETURN __declspec(noreturn)
+#  elif defined(__GNUC__)
+#    define BOOST_NORETURN __attribute__ ((__noreturn__))
+#  else
+#    define BOOST_NO_NORETURN
+#    define BOOST_NORETURN
+#  endif
+#endif
+
+// Branch prediction hints
+// These macros are intended to wrap conditional expressions that yield true or false
+//
+//  if (BOOST_LIKELY(var == 10))
+//  {
+//     // the most probable code here
+//  }
+//
+#if !defined(BOOST_LIKELY)
+#  define BOOST_LIKELY(x) x
+#endif
+#if !defined(BOOST_UNLIKELY)
+#  define BOOST_UNLIKELY(x) x
+#endif
+
+// Type and data alignment specification
+//
+#if !defined(BOOST_NO_CXX11_ALIGNAS)
+#  define BOOST_ALIGNMENT(x) alignas(x)
+#elif defined(_MSC_VER)
+#  define BOOST_ALIGNMENT(x) __declspec(align(x))
+#elif defined(__GNUC__)
+#  define BOOST_ALIGNMENT(x) __attribute__ ((__aligned__(x)))
+#else
+#  define BOOST_NO_ALIGNMENT
+#  define BOOST_ALIGNMENT(x)
+#endif
+
+// Lack of non-public defaulted functions is implied by the lack of any defaulted functions
+#if !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS) && defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
+#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS
+#endif
+
+// Defaulted and deleted function declaration helpers
+// These macros are intended to be inside a class definition.
+// BOOST_DEFAULTED_FUNCTION accepts the function declaration and its
+// body, which will be used if the compiler doesn't support defaulted functions.
+// BOOST_DELETED_FUNCTION only accepts the function declaration. It
+// will expand to a private function declaration, if the compiler doesn't support
+// deleted functions. Because of this it is recommended to use BOOST_DELETED_FUNCTION
+// in the end of the class definition.
+//
+//  class my_class
+//  {
+//  public:
+//      // Default-constructible
+//      BOOST_DEFAULTED_FUNCTION(my_class(), {})
+//      // Copying prohibited
+//      BOOST_DELETED_FUNCTION(my_class(my_class const&))
+//      BOOST_DELETED_FUNCTION(my_class& operator= (my_class const&))
+//  };
+//
+#if !(defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS))
+#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun = default;
+#else
+#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun body
+#endif
+
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+#   define BOOST_DELETED_FUNCTION(fun) fun = delete;
+#else
+#   define BOOST_DELETED_FUNCTION(fun) private: fun;
+#endif
+
+//
+// Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined
+//
+#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+#define BOOST_NO_CXX11_DECLTYPE_N3276 BOOST_NO_CXX11_DECLTYPE
+#endif
+
+//  -------------------- Deprecated macros for 1.50 ---------------------------
+//  These will go away in a future release
+
+//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET or BOOST_NO_CXX11_HDR_UNORDERED_MAP
+//           instead of BOOST_NO_STD_UNORDERED
+#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) || defined (BOOST_NO_CXX11_HDR_UNORDERED_SET)
+# ifndef BOOST_NO_CXX11_STD_UNORDERED
+#  define BOOST_NO_CXX11_STD_UNORDERED
+# endif
+#endif
+
+//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST instead of BOOST_NO_INITIALIZER_LISTS
+#if defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)
+#  define BOOST_NO_INITIALIZER_LISTS
+#endif
+
+//  Use BOOST_NO_CXX11_HDR_ARRAY instead of BOOST_NO_0X_HDR_ARRAY
+#if defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_0X_HDR_ARRAY)
+#  define BOOST_NO_0X_HDR_ARRAY
+#endif
+//  Use BOOST_NO_CXX11_HDR_CHRONO instead of BOOST_NO_0X_HDR_CHRONO
+#if defined(BOOST_NO_CXX11_HDR_CHRONO) && !defined(BOOST_NO_0X_HDR_CHRONO)
+#  define BOOST_NO_0X_HDR_CHRONO
+#endif
+//  Use BOOST_NO_CXX11_HDR_CODECVT instead of BOOST_NO_0X_HDR_CODECVT
+#if defined(BOOST_NO_CXX11_HDR_CODECVT) && !defined(BOOST_NO_0X_HDR_CODECVT)
+#  define BOOST_NO_0X_HDR_CODECVT
+#endif
+//  Use BOOST_NO_CXX11_HDR_CONDITION_VARIABLE instead of BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#if defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE) && !defined(BOOST_NO_0X_HDR_CONDITION_VARIABLE)
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#endif
+//  Use BOOST_NO_CXX11_HDR_FORWARD_LIST instead of BOOST_NO_0X_HDR_FORWARD_LIST
+#if defined(BOOST_NO_CXX11_HDR_FORWARD_LIST) && !defined(BOOST_NO_0X_HDR_FORWARD_LIST)
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#endif
+//  Use BOOST_NO_CXX11_HDR_FUTURE instead of BOOST_NO_0X_HDR_FUTURE
+#if defined(BOOST_NO_CXX11_HDR_FUTURE) && !defined(BOOST_NO_0X_HDR_FUTURE)
+#  define BOOST_NO_0X_HDR_FUTURE
+#endif
+
+//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+//  instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS
+#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+# ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+# endif
+# ifndef BOOST_NO_INITIALIZER_LISTS
+#  define BOOST_NO_INITIALIZER_LISTS
+# endif
+#endif
+
+//  Use BOOST_NO_CXX11_HDR_MUTEX instead of BOOST_NO_0X_HDR_MUTEX
+#if defined(BOOST_NO_CXX11_HDR_MUTEX) && !defined(BOOST_NO_0X_HDR_MUTEX)
+#  define BOOST_NO_0X_HDR_MUTEX
+#endif
+//  Use BOOST_NO_CXX11_HDR_RANDOM instead of BOOST_NO_0X_HDR_RANDOM
+#if defined(BOOST_NO_CXX11_HDR_RANDOM) && !defined(BOOST_NO_0X_HDR_RANDOM)
+#  define BOOST_NO_0X_HDR_RANDOM
+#endif
+//  Use BOOST_NO_CXX11_HDR_RATIO instead of BOOST_NO_0X_HDR_RATIO
+#if defined(BOOST_NO_CXX11_HDR_RATIO) && !defined(BOOST_NO_0X_HDR_RATIO)
+#  define BOOST_NO_0X_HDR_RATIO
+#endif
+//  Use BOOST_NO_CXX11_HDR_REGEX instead of BOOST_NO_0X_HDR_REGEX
+#if defined(BOOST_NO_CXX11_HDR_REGEX) && !defined(BOOST_NO_0X_HDR_REGEX)
+#  define BOOST_NO_0X_HDR_REGEX
+#endif
+//  Use BOOST_NO_CXX11_HDR_SYSTEM_ERROR instead of BOOST_NO_0X_HDR_SYSTEM_ERROR
+#if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) && !defined(BOOST_NO_0X_HDR_SYSTEM_ERROR)
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#endif
+//  Use BOOST_NO_CXX11_HDR_THREAD instead of BOOST_NO_0X_HDR_THREAD
+#if defined(BOOST_NO_CXX11_HDR_THREAD) && !defined(BOOST_NO_0X_HDR_THREAD)
+#  define BOOST_NO_0X_HDR_THREAD
+#endif
+//  Use BOOST_NO_CXX11_HDR_TUPLE instead of BOOST_NO_0X_HDR_TUPLE
+#if defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_0X_HDR_TUPLE)
+#  define BOOST_NO_0X_HDR_TUPLE
+#endif
+//  Use BOOST_NO_CXX11_HDR_TYPE_TRAITS instead of BOOST_NO_0X_HDR_TYPE_TRAITS
+#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) && !defined(BOOST_NO_0X_HDR_TYPE_TRAITS)
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#endif
+//  Use BOOST_NO_CXX11_HDR_TYPEINDEX instead of BOOST_NO_0X_HDR_TYPEINDEX
+#if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) && !defined(BOOST_NO_0X_HDR_TYPEINDEX)
+#  define BOOST_NO_0X_HDR_TYPEINDEX
+#endif
+//  Use BOOST_NO_CXX11_HDR_UNORDERED_MAP instead of BOOST_NO_0X_HDR_UNORDERED_MAP
+#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) && !defined(BOOST_NO_0X_HDR_UNORDERED_MAP)
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#endif
+//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET instead of BOOST_NO_0X_HDR_UNORDERED_SET
+#if defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) && !defined(BOOST_NO_0X_HDR_UNORDERED_SET)
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+#endif
+
+//  ------------------ End of deprecated macros for 1.50 ---------------------------
+
+//  -------------------- Deprecated macros for 1.51 ---------------------------
+//  These will go away in a future release
+
+//  Use     BOOST_NO_CXX11_AUTO_DECLARATIONS instead of   BOOST_NO_AUTO_DECLARATIONS
+#if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_AUTO_DECLARATIONS)
+#  define BOOST_NO_AUTO_DECLARATIONS
+#endif
+//  Use     BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS instead of   BOOST_NO_AUTO_MULTIDECLARATIONS
+#if defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS) && !defined(BOOST_NO_AUTO_MULTIDECLARATIONS)
+#  define BOOST_NO_AUTO_MULTIDECLARATIONS
+#endif
+//  Use     BOOST_NO_CXX11_CHAR16_T instead of   BOOST_NO_CHAR16_T
+#if defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CHAR16_T)
+#  define BOOST_NO_CHAR16_T
+#endif
+//  Use     BOOST_NO_CXX11_CHAR32_T instead of   BOOST_NO_CHAR32_T
+#if defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CHAR32_T)
+#  define BOOST_NO_CHAR32_T
+#endif
+//  Use     BOOST_NO_CXX11_TEMPLATE_ALIASES instead of   BOOST_NO_TEMPLATE_ALIASES
+#if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_TEMPLATE_ALIASES)
+#  define BOOST_NO_TEMPLATE_ALIASES
+#endif
+//  Use     BOOST_NO_CXX11_CONSTEXPR instead of   BOOST_NO_CONSTEXPR
+#if defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CONSTEXPR)
+#  define BOOST_NO_CONSTEXPR
+#endif
+//  Use     BOOST_NO_CXX11_DECLTYPE_N3276 instead of   BOOST_NO_DECLTYPE_N3276
+#if defined(BOOST_NO_CXX11_DECLTYPE_N3276) && !defined(BOOST_NO_DECLTYPE_N3276)
+#  define BOOST_NO_DECLTYPE_N3276
+#endif
+//  Use     BOOST_NO_CXX11_DECLTYPE instead of   BOOST_NO_DECLTYPE
+#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_DECLTYPE)
+#  define BOOST_NO_DECLTYPE
+#endif
+//  Use     BOOST_NO_CXX11_DEFAULTED_FUNCTIONS instead of   BOOST_NO_DEFAULTED_FUNCTIONS
+#if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_DEFAULTED_FUNCTIONS)
+#  define BOOST_NO_DEFAULTED_FUNCTIONS
+#endif
+//  Use     BOOST_NO_CXX11_DELETED_FUNCTIONS instead of   BOOST_NO_DELETED_FUNCTIONS
+#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_DELETED_FUNCTIONS)
+#  define BOOST_NO_DELETED_FUNCTIONS
+#endif
+//  Use     BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS instead of   BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_EXPLICIT_CONVERSION_OPERATORS)
+#  define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#endif
+//  Use     BOOST_NO_CXX11_EXTERN_TEMPLATE instead of   BOOST_NO_EXTERN_TEMPLATE
+#if defined(BOOST_NO_CXX11_EXTERN_TEMPLATE) && !defined(BOOST_NO_EXTERN_TEMPLATE)
+#  define BOOST_NO_EXTERN_TEMPLATE
+#endif
+//  Use     BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS instead of   BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS)
+#  define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#endif
+//  Use     BOOST_NO_CXX11_LAMBDAS instead of   BOOST_NO_LAMBDAS
+#if defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_LAMBDAS)
+#  define BOOST_NO_LAMBDAS
+#endif
+//  Use     BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS instead of   BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#if defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS) && !defined(BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS)
+#  define BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS
+#endif
+//  Use     BOOST_NO_CXX11_NOEXCEPT instead of   BOOST_NO_NOEXCEPT
+#if defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_NOEXCEPT)
+#  define BOOST_NO_NOEXCEPT
+#endif
+//  Use     BOOST_NO_CXX11_NULLPTR instead of   BOOST_NO_NULLPTR
+#if defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_NULLPTR)
+#  define BOOST_NO_NULLPTR
+#endif
+//  Use     BOOST_NO_CXX11_RAW_LITERALS instead of   BOOST_NO_RAW_LITERALS
+#if defined(BOOST_NO_CXX11_RAW_LITERALS) && !defined(BOOST_NO_RAW_LITERALS)
+#  define BOOST_NO_RAW_LITERALS
+#endif
+//  Use     BOOST_NO_CXX11_RVALUE_REFERENCES instead of   BOOST_NO_RVALUE_REFERENCES
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_RVALUE_REFERENCES)
+#  define BOOST_NO_RVALUE_REFERENCES
+#endif
+//  Use     BOOST_NO_CXX11_SCOPED_ENUMS instead of   BOOST_NO_SCOPED_ENUMS
+#if defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_NO_SCOPED_ENUMS)
+#  define BOOST_NO_SCOPED_ENUMS
+#endif
+//  Use     BOOST_NO_CXX11_STATIC_ASSERT instead of   BOOST_NO_STATIC_ASSERT
+#if defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_NO_STATIC_ASSERT)
+#  define BOOST_NO_STATIC_ASSERT
+#endif
+//  Use     BOOST_NO_CXX11_STD_UNORDERED instead of   BOOST_NO_STD_UNORDERED
+#if defined(BOOST_NO_CXX11_STD_UNORDERED) && !defined(BOOST_NO_STD_UNORDERED)
+#  define BOOST_NO_STD_UNORDERED
+#endif
+//  Use     BOOST_NO_CXX11_UNICODE_LITERALS instead of   BOOST_NO_UNICODE_LITERALS
+#if defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(BOOST_NO_UNICODE_LITERALS)
+#  define BOOST_NO_UNICODE_LITERALS
+#endif
+//  Use     BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX instead of   BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX
+#if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !defined(BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX)
+#  define BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX
+#endif
+//  Use     BOOST_NO_CXX11_VARIADIC_TEMPLATES instead of   BOOST_NO_VARIADIC_TEMPLATES
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#  define BOOST_NO_VARIADIC_TEMPLATES
+#endif
+//  Use     BOOST_NO_CXX11_VARIADIC_MACROS instead of   BOOST_NO_VARIADIC_MACROS
+#if defined(BOOST_NO_CXX11_VARIADIC_MACROS) && !defined(BOOST_NO_VARIADIC_MACROS)
+#  define BOOST_NO_VARIADIC_MACROS
+#endif
+//  Use     BOOST_NO_CXX11_NUMERIC_LIMITS instead of   BOOST_NO_NUMERIC_LIMITS_LOWEST
+#if defined(BOOST_NO_CXX11_NUMERIC_LIMITS) && !defined(BOOST_NO_NUMERIC_LIMITS_LOWEST)
+#  define BOOST_NO_NUMERIC_LIMITS_LOWEST
+#endif
+//  ------------------ End of deprecated macros for 1.51 ---------------------------
+
+
+
+//
+// Helper macros BOOST_NOEXCEPT, BOOST_NOEXCEPT_IF, BOOST_NOEXCEPT_EXPR
+// These aid the transition to C++11 while still supporting C++03 compilers
+//
+#ifdef BOOST_NO_CXX11_NOEXCEPT
+#  define BOOST_NOEXCEPT
+#  define BOOST_NOEXCEPT_OR_NOTHROW throw()
+#  define BOOST_NOEXCEPT_IF(Predicate)
+#  define BOOST_NOEXCEPT_EXPR(Expression) false
+#else
+#  define BOOST_NOEXCEPT noexcept
+#  define BOOST_NOEXCEPT_OR_NOTHROW noexcept
+#  define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate))
+#  define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression))
+#endif
+//
+// Helper macro BOOST_FALLTHROUGH
+// Fallback definition of BOOST_FALLTHROUGH macro used to mark intended
+// fall-through between case labels in a switch statement. We use a definition
+// that requires a semicolon after it to avoid at least one type of misuse even
+// on unsupported compilers.
+//
+#ifndef BOOST_FALLTHROUGH
+#  define BOOST_FALLTHROUGH ((void)0)
+#endif
+
+//
+// constexpr workarounds
+//
+#if defined(BOOST_NO_CXX11_CONSTEXPR)
+#define BOOST_CONSTEXPR
+#define BOOST_CONSTEXPR_OR_CONST const
+#else
+#define BOOST_CONSTEXPR constexpr
+#define BOOST_CONSTEXPR_OR_CONST constexpr
+#endif
+#if defined(BOOST_NO_CXX14_CONSTEXPR)
+#define BOOST_CXX14_CONSTEXPR
+#else
+#define BOOST_CXX14_CONSTEXPR constexpr
+#endif
+
+//
+// Unused variable/typedef workarounds:
+//
+#ifndef BOOST_ATTRIBUTE_UNUSED
+#  define BOOST_ATTRIBUTE_UNUSED
+#endif
+
+#define BOOST_STATIC_CONSTEXPR  static BOOST_CONSTEXPR_OR_CONST
+
+//
+// Set BOOST_HAS_STATIC_ASSERT when BOOST_NO_CXX11_STATIC_ASSERT is not defined
+//
+#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT)
+#  define BOOST_HAS_STATIC_ASSERT
+#endif
+
+//
+// Set BOOST_HAS_RVALUE_REFS when BOOST_NO_CXX11_RVALUE_REFERENCES is not defined
+//
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS)
+#define BOOST_HAS_RVALUE_REFS
+#endif
+
+//
+// Set BOOST_HAS_VARIADIC_TMPL when BOOST_NO_CXX11_VARIADIC_TEMPLATES is not defined
+//
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_HAS_VARIADIC_TMPL)
+#define BOOST_HAS_VARIADIC_TMPL
+#endif
+//
+// Set BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS when
+// BOOST_NO_CXX11_VARIADIC_TEMPLATES is set:
+//
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS)
+#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
+#endif
+
+//
+// Finish off with checks for macros that are depricated / no longer supported,
+// if any of these are set then it's very likely that much of Boost will no
+// longer work.  So stop with a #error for now, but give the user a chance
+// to continue at their own risk if they really want to:
+//
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_CONFIG_ALLOW_DEPRECATED)
+#  error "You are using a compiler which lacks features which are now a minimum requirement in order to use Boost, define BOOST_CONFIG_ALLOW_DEPRECATED if you want to continue at your own risk!!!"
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/config/user.hpp b/gatb-core/thirdparty/boost/config/user.hpp
new file mode 100644
index 0000000..28e7476
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/user.hpp
@@ -0,0 +1,133 @@
+//  boost/config/user.hpp  ---------------------------------------------------//
+
+//  (C) Copyright John Maddock 2001. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Do not check in modified versions of this file,
+//  This file may be customized by the end user, but not by boost.
+
+//
+//  Use this file to define a site and compiler specific
+//  configuration policy:
+//
+
+// define this to locate a compiler config file:
+// #define BOOST_COMPILER_CONFIG <myheader>
+
+// define this to locate a stdlib config file:
+// #define BOOST_STDLIB_CONFIG   <myheader>
+
+// define this to locate a platform config file:
+// #define BOOST_PLATFORM_CONFIG <myheader>
+
+// define this to disable compiler config,
+// use if your compiler config has nothing to set:
+// #define BOOST_NO_COMPILER_CONFIG
+
+// define this to disable stdlib config,
+// use if your stdlib config has nothing to set:
+// #define BOOST_NO_STDLIB_CONFIG
+
+// define this to disable platform config,
+// use if your platform config has nothing to set:
+// #define BOOST_NO_PLATFORM_CONFIG
+
+// define this to disable all config options,
+// excluding the user config.  Use if your
+// setup is fully ISO compliant, and has no
+// useful extensions, or for autoconf generated
+// setups:
+// #define BOOST_NO_CONFIG
+
+// define this to make the config "optimistic"
+// about unknown compiler versions.  Normally
+// unknown compiler versions are assumed to have
+// all the defects of the last known version, however
+// setting this flag, causes the config to assume
+// that unknown compiler versions are fully conformant
+// with the standard:
+// #define BOOST_STRICT_CONFIG
+
+// define this to cause the config to halt compilation
+// with an #error if it encounters anything unknown --
+// either an unknown compiler version or an unknown
+// compiler/platform/library:
+// #define BOOST_ASSERT_CONFIG
+
+
+// define if you want to disable threading support, even
+// when available:
+// #define BOOST_DISABLE_THREADS
+
+// define when you want to disable Win32 specific features
+// even when available:
+// #define BOOST_DISABLE_WIN32
+
+// BOOST_DISABLE_ABI_HEADERS: Stops boost headers from including any 
+// prefix/suffix headers that normally control things like struct 
+// packing and alignment. 
+// #define BOOST_DISABLE_ABI_HEADERS
+
+// BOOST_ABI_PREFIX: A prefix header to include in place of whatever
+// boost.config would normally select, any replacement should set up 
+// struct packing and alignment options as required. 
+// #define BOOST_ABI_PREFIX my-header-name
+
+// BOOST_ABI_SUFFIX: A suffix header to include in place of whatever 
+// boost.config would normally select, any replacement should undo 
+// the effects of the prefix header. 
+// #define BOOST_ABI_SUFFIX my-header-name
+
+// BOOST_ALL_DYN_LINK: Forces all libraries that have separate source, 
+// to be linked as dll's rather than static libraries on Microsoft Windows 
+// (this macro is used to turn on __declspec(dllimport) modifiers, so that 
+// the compiler knows which symbols to look for in a dll rather than in a 
+// static library).  Note that there may be some libraries that can only 
+// be linked in one way (statically or dynamically), in these cases this 
+// macro has no effect.
+// #define BOOST_ALL_DYN_LINK
+ 
+// BOOST_WHATEVER_DYN_LINK: Forces library "whatever" to be linked as a dll 
+// rather than a static library on Microsoft Windows: replace the WHATEVER 
+// part of the macro name with the name of the library that you want to 
+// dynamically link to, for example use BOOST_DATE_TIME_DYN_LINK or 
+// BOOST_REGEX_DYN_LINK etc (this macro is used to turn on __declspec(dllimport) 
+// modifiers, so that the compiler knows which symbols to look for in a dll 
+// rather than in a static library).  
+// Note that there may be some libraries that can only 
+// be linked in one way (statically or dynamically), 
+// in these cases this macro is unsupported.
+// #define BOOST_WHATEVER_DYN_LINK
+ 
+// BOOST_ALL_NO_LIB: Tells the config system not to automatically select 
+// which libraries to link against.  
+// Normally if a compiler supports #pragma lib, then the correct library 
+// build variant will be automatically selected and linked against, 
+// simply by the act of including one of that library's headers.  
+// This macro turns that feature off.
+// #define BOOST_ALL_NO_LIB
+ 
+// BOOST_WHATEVER_NO_LIB: Tells the config system not to automatically 
+// select which library to link against for library "whatever", 
+// replace WHATEVER in the macro name with the name of the library; 
+// for example BOOST_DATE_TIME_NO_LIB or BOOST_REGEX_NO_LIB.  
+// Normally if a compiler supports #pragma lib, then the correct library 
+// build variant will be automatically selected and linked against, simply 
+// by the act of including one of that library's headers.  This macro turns 
+// that feature off.
+// #define BOOST_WHATEVER_NO_LIB
+ 
+// BOOST_LIB_BUILDID: Set to the same value as the value passed to Boost.Build's
+// --buildid command line option.  For example if you built using:
+//
+// bjam address-model=64 --buildid=amd64
+//
+// then compile your code with:
+//
+// -DBOOST_LIB_BUILDID = amd64
+//
+// to ensure the correct libraries are selected at link time.
+// #define BOOST_LIB_BUILDID amd64
+
diff --git a/gatb-core/thirdparty/boost/config/warning_disable.hpp b/gatb-core/thirdparty/boost/config/warning_disable.hpp
new file mode 100644
index 0000000..fea8e82
--- /dev/null
+++ b/gatb-core/thirdparty/boost/config/warning_disable.hpp
@@ -0,0 +1,47 @@
+//  Copyright John Maddock 2008
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to turn off some overly-pedantic warning emitted
+//  by certain compilers.  You should include this header only in:
+//
+//  * A test case, before any other headers, or,
+//  * A library source file before any other headers.
+//
+//  IT SHOULD NOT BE INCLUDED BY ANY BOOST HEADER.
+//
+//  YOU SHOULD NOT INCLUDE IT IF YOU CAN REASONABLY FIX THE WARNING.
+//
+//  The only warnings disabled here are those that are:
+//
+//  * Quite unreasonably pedantic.
+//  * Generally only emitted by a single compiler.
+//  * Can't easily be fixed: for example if the vendors own std lib 
+//    code emits these warnings!
+//
+//  Note that THIS HEADER MUST NOT INCLUDE ANY OTHER HEADERS:
+//  not even std library ones!  Doing so may turn the warning
+//  off too late to be of any use.  For example the VC++ C4996
+//  warning can be emitted from <iosfwd> if that header is included
+//  before or by this one :-(
+//
+
+#ifndef BOOST_CONFIG_WARNING_DISABLE_HPP
+#define BOOST_CONFIG_WARNING_DISABLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) 
+   // Error 'function': was declared deprecated
+   // http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx
+   // This error is emitted when you use some perfectly conforming
+   // std lib functions in a perfectly correct way, and also by
+   // some of Microsoft's own std lib code !
+#  pragma warning(disable:4996)
+#endif
+#if defined(__INTEL_COMPILER) || defined(__ICL)
+   // As above: gives warning when a "deprecated"
+   // std library function is encountered.
+#  pragma warning(disable:1786)
+#endif
+
+#endif // BOOST_CONFIG_WARNING_DISABLE_HPP
diff --git a/gatb-core/thirdparty/boost/core/addressof.hpp b/gatb-core/thirdparty/boost/core/addressof.hpp
new file mode 100644
index 0000000..889b582
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/addressof.hpp
@@ -0,0 +1,162 @@
+// Copyright (C) 2002 Brad King (brad.king at kitware.com)
+//                    Douglas Gregor (gregod at cs.rpi.edu)
+//
+// Copyright (C) 2002, 2008, 2013 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org
+
+#ifndef BOOST_CORE_ADDRESSOF_HPP
+#define BOOST_CORE_ADDRESSOF_HPP
+
+# include <boost/config.hpp>
+# include <boost/detail/workaround.hpp>
+# include <cstddef>
+
+namespace boost
+{
+
+namespace detail
+{
+
+template<class T> struct addr_impl_ref
+{
+    T & v_;
+
+    BOOST_FORCEINLINE addr_impl_ref( T & v ): v_( v ) {}
+    BOOST_FORCEINLINE operator T& () const { return v_; }
+
+private:
+    addr_impl_ref & operator=(const addr_impl_ref &);
+};
+
+template<class T> struct addressof_impl
+{
+    static BOOST_FORCEINLINE T * f( T & v, long )
+    {
+        return reinterpret_cast<T*>(
+            &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
+    }
+
+    static BOOST_FORCEINLINE T * f( T * v, int )
+    {
+        return v;
+    }
+};
+
+#if !defined( BOOST_NO_CXX11_NULLPTR )
+
+#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
+
+    typedef decltype(nullptr) addr_nullptr_t;
+
+#else
+
+    typedef std::nullptr_t addr_nullptr_t;
+
+#endif
+
+template<> struct addressof_impl< addr_nullptr_t >
+{
+    typedef addr_nullptr_t T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t const >
+{
+    typedef addr_nullptr_t const T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t volatile >
+{
+    typedef addr_nullptr_t volatile T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t const volatile >
+{
+    typedef addr_nullptr_t const volatile T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+#endif
+
+} // namespace detail
+
+template<class T>
+BOOST_FORCEINLINE
+T * addressof( T & v )
+{
+#if (defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) ) ) || (defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5120))
+
+    return boost::detail::addressof_impl<T>::f( v, 0 );
+
+#else
+
+    return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
+
+#endif
+}
+
+#if defined( __SUNPRO_CC ) && BOOST_WORKAROUND( __SUNPRO_CC, BOOST_TESTED_AT( 0x590 ) )
+
+namespace detail
+{
+
+template<class T> struct addressof_addp
+{
+    typedef T * type;
+};
+
+} // namespace detail
+
+template< class T, std::size_t N >
+BOOST_FORCEINLINE
+typename detail::addressof_addp< T[N] >::type addressof( T (&t)[N] )
+{
+    return &t;
+}
+
+#endif
+
+// Borland doesn't like casting an array reference to a char reference
+// but these overloads work around the problem.
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template<typename T,std::size_t N>
+BOOST_FORCEINLINE
+T (*addressof(T (&t)[N]))[N]
+{
+   return reinterpret_cast<T(*)[N]>(&t);
+}
+
+template<typename T,std::size_t N>
+BOOST_FORCEINLINE
+const T (*addressof(const T (&t)[N]))[N]
+{
+   return reinterpret_cast<const T(*)[N]>(&t);
+}
+#endif
+
+} // namespace boost
+
+#endif // BOOST_CORE_ADDRESSOF_HPP
diff --git a/gatb-core/thirdparty/boost/core/checked_delete.hpp b/gatb-core/thirdparty/boost/core/checked_delete.hpp
new file mode 100644
index 0000000..b086e03
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/checked_delete.hpp
@@ -0,0 +1,69 @@
+#ifndef BOOST_CORE_CHECKED_DELETE_HPP
+#define BOOST_CORE_CHECKED_DELETE_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/checked_delete.hpp
+//
+//  Copyright (c) 2002, 2003 Peter Dimov
+//  Copyright (c) 2003 Daniel Frey
+//  Copyright (c) 2003 Howard Hinnant
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/core/doc/html/core/checked_delete.html for documentation.
+//
+
+namespace boost
+{
+
+// verify that types are complete for increased safety
+
+template<class T> inline void checked_delete(T * x)
+{
+    // intentionally complex - simplification causes regressions
+    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+    (void) sizeof(type_must_be_complete);
+    delete x;
+}
+
+template<class T> inline void checked_array_delete(T * x)
+{
+    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+    (void) sizeof(type_must_be_complete);
+    delete [] x;
+}
+
+template<class T> struct checked_deleter
+{
+    typedef void result_type;
+    typedef T * argument_type;
+
+    void operator()(T * x) const
+    {
+        // boost:: disables ADL
+        boost::checked_delete(x);
+    }
+};
+
+template<class T> struct checked_array_deleter
+{
+    typedef void result_type;
+    typedef T * argument_type;
+
+    void operator()(T * x) const
+    {
+        boost::checked_array_delete(x);
+    }
+};
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_CORE_CHECKED_DELETE_HPP
diff --git a/gatb-core/thirdparty/boost/core/demangle.hpp b/gatb-core/thirdparty/boost/core/demangle.hpp
new file mode 100644
index 0000000..eebd0ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/demangle.hpp
@@ -0,0 +1,121 @@
+#ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
+#define BOOST_CORE_DEMANGLE_HPP_INCLUDED
+
+// core::demangle
+//
+// Copyright 2014 Peter Dimov
+// Copyright 2014 Andrey Semashev
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/config.hpp>
+#include <string>
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+#if defined( __clang__ ) && defined( __has_include )
+# if __has_include(<cxxabi.h>)
+#  define BOOST_CORE_HAS_CXXABI_H
+# endif
+#elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
+# define BOOST_CORE_HAS_CXXABI_H
+#endif
+
+#if defined( BOOST_CORE_HAS_CXXABI_H )
+# include <cxxabi.h>
+# include <cstdlib>
+# include <cstddef>
+#endif
+
+namespace boost
+{
+
+namespace core
+{
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT;
+inline void demangle_free( char const * name ) BOOST_NOEXCEPT;
+
+class scoped_demangled_name
+{
+private:
+    char const * m_p;
+
+public:
+    explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT :
+        m_p( demangle_alloc( name ) )
+    {
+    }
+
+    ~scoped_demangled_name() BOOST_NOEXCEPT
+    {
+        demangle_free( m_p );
+    }
+
+    char const * get() const BOOST_NOEXCEPT
+    {
+        return m_p;
+    }
+
+    BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& ))
+    BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& ))
+};
+
+
+#if defined( BOOST_CORE_HAS_CXXABI_H )
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
+{
+    int status = 0;
+    std::size_t size = 0;
+    return abi::__cxa_demangle( name, NULL, &size, &status );
+}
+
+inline void demangle_free( char const * name ) BOOST_NOEXCEPT
+{
+    std::free( const_cast< char* >( name ) );
+}
+
+inline std::string demangle( char const * name )
+{
+    scoped_demangled_name demangled_name( name );
+    char const * const p = demangled_name.get();
+    if( p )
+    {
+        return p;
+    }
+    else
+    {
+        return name;
+    }
+}
+
+#else
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
+{
+    return name;
+}
+
+inline void demangle_free( char const * ) BOOST_NOEXCEPT
+{
+}
+
+inline std::string demangle( char const * name )
+{
+    return name;
+}
+
+#endif
+
+} // namespace core
+
+} // namespace boost
+
+#undef BOOST_CORE_HAS_CXXABI_H
+
+#endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/core/enable_if.hpp b/gatb-core/thirdparty/boost/core/enable_if.hpp
new file mode 100644
index 0000000..a3302b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/enable_if.hpp
@@ -0,0 +1,119 @@
+// Boost enable_if library
+
+// Copyright 2003 (c) The Trustees of Indiana University.
+
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
+//             Jeremiah Willcock (jewillco at osl.iu.edu)
+//             Andrew Lumsdaine (lums at osl.iu.edu)
+
+
+#ifndef BOOST_CORE_ENABLE_IF_HPP
+#define BOOST_CORE_ENABLE_IF_HPP
+
+#include "boost/config.hpp"
+
+// Even the definition of enable_if causes problems on some compilers,
+// so it's macroed out for all compilers that do not support SFINAE
+
+#ifndef BOOST_NO_SFINAE
+
+namespace boost
+{
+ 
+  template <bool B, class T = void>
+  struct enable_if_c {
+    typedef T type;
+  };
+
+  template <class T>
+  struct enable_if_c<false, T> {};
+
+  template <class Cond, class T = void> 
+  struct enable_if : public enable_if_c<Cond::value, T> {};
+
+  template <bool B, class T>
+  struct lazy_enable_if_c {
+    typedef typename T::type type;
+  };
+
+  template <class T>
+  struct lazy_enable_if_c<false, T> {};
+
+  template <class Cond, class T> 
+  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+
+
+  template <bool B, class T = void>
+  struct disable_if_c {
+    typedef T type;
+  };
+
+  template <class T>
+  struct disable_if_c<true, T> {};
+
+  template <class Cond, class T = void> 
+  struct disable_if : public disable_if_c<Cond::value, T> {};
+
+  template <bool B, class T>
+  struct lazy_disable_if_c {
+    typedef typename T::type type;
+  };
+
+  template <class T>
+  struct lazy_disable_if_c<true, T> {};
+
+  template <class Cond, class T> 
+  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+
+} // namespace boost
+
+#else
+
+namespace boost {
+
+  namespace detail { typedef void enable_if_default_T; }
+
+  template <typename T>
+  struct enable_if_does_not_work_on_this_compiler;
+
+  template <bool B, class T = detail::enable_if_default_T>
+  struct enable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct disable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct lazy_enable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct lazy_disable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct enable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct disable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct lazy_enable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct lazy_disable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+} // namespace boost
+
+#endif // BOOST_NO_SFINAE
+
+#endif
diff --git a/gatb-core/thirdparty/boost/core/explicit_operator_bool.hpp b/gatb-core/thirdparty/boost/core/explicit_operator_bool.hpp
new file mode 100644
index 0000000..a8936e2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/explicit_operator_bool.hpp
@@ -0,0 +1,154 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2013.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+/*!
+ * \file   explicit_operator_bool.hpp
+ * \author Andrey Semashev
+ * \date   08.03.2009
+ *
+ * This header defines a compatibility macro that implements an unspecified
+ * \c bool operator idiom, which is superseded with explicit conversion operators in
+ * C++11.
+ */
+
+#ifndef BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
+#define BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+/*!
+ * \brief The macro defines an explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE explicit operator bool () const\
+    {\
+        return !this->operator! ();\
+    }
+
+/*!
+ * \brief The macro defines a noexcept explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE explicit operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+/*!
+ * \brief The macro defines a constexpr explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR explicit operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#else // !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+#if (defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) && !defined(BOOST_NO_COMPILER_CONFIG)
+// Sun C++ 5.3 can't handle the safe_bool idiom, so don't use it
+#define BOOST_NO_UNSPECIFIED_BOOL
+#endif // (defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) && !defined(BOOST_NO_COMPILER_CONFIG)
+
+#if !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+namespace boost {
+
+namespace detail {
+
+#if !defined(_MSC_VER) && !defined(__IBMCPP__)
+
+    struct unspecified_bool
+    {
+        // NOTE TO THE USER: If you see this in error messages then you tried
+        // to apply an unsupported operator on the object that supports
+        // explicit conversion to bool.
+        struct OPERATORS_NOT_ALLOWED;
+        static void true_value(OPERATORS_NOT_ALLOWED*) {}
+    };
+    typedef void (*unspecified_bool_type)(unspecified_bool::OPERATORS_NOT_ALLOWED*);
+
+#else
+
+    // MSVC and VACPP are too eager to convert pointer to function to void* even though they shouldn't
+    struct unspecified_bool
+    {
+        // NOTE TO THE USER: If you see this in error messages then you tried
+        // to apply an unsupported operator on the object that supports
+        // explicit conversion to bool.
+        struct OPERATORS_NOT_ALLOWED;
+        void true_value(OPERATORS_NOT_ALLOWED*) {}
+    };
+    typedef void (unspecified_bool::*unspecified_bool_type)(unspecified_bool::OPERATORS_NOT_ALLOWED*);
+
+#endif
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE operator boost::detail::unspecified_bool_type () const\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE operator boost::detail::unspecified_bool_type () const BOOST_NOEXCEPT\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR operator boost::detail::unspecified_bool_type () const BOOST_NOEXCEPT\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#else // !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE operator bool () const\
+    {\
+        return !this->operator! ();\
+    }
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#endif // !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+#endif // !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+#endif // BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
diff --git a/gatb-core/thirdparty/boost/core/ignore_unused.hpp b/gatb-core/thirdparty/boost/core/ignore_unused.hpp
new file mode 100644
index 0000000..994e5f6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/ignore_unused.hpp
@@ -0,0 +1,70 @@
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CORE_IGNORE_UNUSED_HPP
+#define BOOST_CORE_IGNORE_UNUSED_HPP
+
+#include <boost/config.hpp>
+
+namespace boost {
+
+#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+
+template <typename... Ts>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(Ts const& ...)
+{}
+
+template <typename... Ts>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+#else
+
+template <typename T1>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&)
+{}
+
+template <typename T1, typename T2>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&)
+{}
+
+template <typename T1, typename T2, typename T3>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&)
+{}
+
+template <typename T1, typename T2, typename T3, typename T4>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&)
+{}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&, T5 const&)
+{}
+
+template <typename T1>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+template <typename T1, typename T2>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3, typename T4>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused()
+{}
+
+#endif
+
+} // namespace boost
+
+#endif // BOOST_CORE_IGNORE_UNUSED_HPP
diff --git a/gatb-core/thirdparty/boost/core/is_same.hpp b/gatb-core/thirdparty/boost/core/is_same.hpp
new file mode 100644
index 0000000..f373c65
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/is_same.hpp
@@ -0,0 +1,40 @@
+#ifndef BOOST_CORE_IS_SAME_HPP_INCLUDED
+#define BOOST_CORE_IS_SAME_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// is_same<T1,T2>::value is true when T1 == T2
+//
+// Copyright 2014 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/config.hpp>
+
+namespace boost
+{
+
+namespace core
+{
+
+template< class T1, class T2 > struct is_same
+{
+    BOOST_STATIC_CONSTANT( bool, value = false );
+};
+
+template< class T > struct is_same< T, T >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+} // namespace core
+
+} // namespace boost
+
+#endif // #ifndef BOOST_CORE_IS_SAME_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/core/lightweight_test.hpp b/gatb-core/thirdparty/boost/core/lightweight_test.hpp
new file mode 100644
index 0000000..cdc8a72
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/lightweight_test.hpp
@@ -0,0 +1,171 @@
+#ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
+#define BOOST_CORE_LIGHTWEIGHT_TEST_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+//
+//  boost/core/lightweight_test.hpp - lightweight test library
+//
+//  Copyright (c) 2002, 2009, 2014 Peter Dimov
+//  Copyright (2) Beman Dawes 2010, 2011
+//  Copyright (3) Ion Gaztanaga 2013
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/assert.hpp>
+#include <boost/current_function.hpp>
+#include <boost/core/no_exceptions_support.hpp>
+#include <iostream>
+
+//  IDE's like Visual Studio perform better if output goes to std::cout or
+//  some other stream, so allow user to configure output stream:
+#ifndef BOOST_LIGHTWEIGHT_TEST_OSTREAM
+# define BOOST_LIGHTWEIGHT_TEST_OSTREAM std::cerr
+#endif
+
+namespace boost
+{
+
+namespace detail
+{
+
+struct report_errors_reminder
+{
+    bool called_report_errors_function;
+
+    report_errors_reminder() : called_report_errors_function(false) {}
+
+    ~report_errors_reminder()
+    {
+        BOOST_ASSERT(called_report_errors_function);  // verify report_errors() was called  
+    }
+};
+
+inline report_errors_reminder& report_errors_remind()
+{
+    static report_errors_reminder r;
+    return r;
+}
+
+inline int & test_errors()
+{
+    static int x = 0;
+    report_errors_remind();
+    return x;
+}
+
+inline void test_failed_impl(char const * expr, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): test '" << expr << "' failed in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void error_impl(char const * msg, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): " << msg << " in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void throw_failed_impl(char const * excep, char const * file, int line, char const * function)
+{
+   BOOST_LIGHTWEIGHT_TEST_OSTREAM
+    << file << "(" << line << "): Exception '" << excep << "' not thrown in function '"
+    << function << "'" << std::endl;
+   ++test_errors();
+}
+
+template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t == u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " == " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' != '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+template<class T, class U> inline void test_ne_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t != u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " != " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' == '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+} // namespace detail
+
+inline int report_errors()
+{
+    boost::detail::report_errors_remind().called_report_errors_function = true;
+
+    int errors = boost::detail::test_errors();
+
+    if( errors == 0 )
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << "No errors detected." << std::endl;
+        return 0;
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl;
+        return 1;
+    }
+}
+
+} // namespace boost
+
+#define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
+
+#define BOOST_ERROR(msg) ( ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+
+#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+#define BOOST_TEST_NE(expr1,expr2) ( ::boost::detail::test_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+
+#ifndef BOOST_NO_EXCEPTIONS
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )                    \
+      try {                                                    \
+         EXPR;                                                 \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+      catch(EXCEP const&) {                                    \
+      }                                                        \
+      catch(...) {                                             \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+   //
+#else
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )
+#endif
+
+#endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
diff --git a/gatb-core/thirdparty/boost/core/lightweight_test_trait.hpp b/gatb-core/thirdparty/boost/core/lightweight_test_trait.hpp
new file mode 100644
index 0000000..0e2aab4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/lightweight_test_trait.hpp
@@ -0,0 +1,56 @@
+#ifndef BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
+#define BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+// boost/core/lightweight_test_trait.hpp
+//
+// BOOST_TEST_TRAIT_TRUE, BOOST_TEST_TRAIT_FALSE
+//
+// Copyright 2014 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+template< class T > inline void test_trait_impl( char const * trait, void (*)( T ),
+  bool expected, char const * file, int line, char const * function )
+{
+    if( T::value == expected )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): predicate '" << trait << "' ["
+            << boost::core::demangled_name( BOOST_CORE_TYPEID(T) ) << "]"
+            << " test failed in function '" << function
+            << "' (should have been " << ( expected? "true": "false" ) << ")"
+            << std::endl;
+
+        ++test_errors();
+    }
+}
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_TEST_TRAIT_TRUE(type) ( ::boost::detail::test_trait_impl(#type, (void(*)type)0, true, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+#define BOOST_TEST_TRAIT_FALSE(type) ( ::boost::detail::test_trait_impl(#type, (void(*)type)0, false, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+
+#endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
diff --git a/gatb-core/thirdparty/boost/core/no_exceptions_support.hpp b/gatb-core/thirdparty/boost/core/no_exceptions_support.hpp
new file mode 100644
index 0000000..a697f01
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/no_exceptions_support.hpp
@@ -0,0 +1,44 @@
+#ifndef BOOST_CORE_NO_EXCEPTIONS_SUPPORT_HPP
+#define BOOST_CORE_NO_EXCEPTIONS_SUPPORT_HPP
+
+#if defined(_MSC_VER)
+#  pragma once
+#endif
+
+//----------------------------------------------------------------------
+// (C) Copyright 2004 Pavel Vozenilek.
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//
+// This file contains helper macros used when exception support may be
+// disabled (as indicated by macro BOOST_NO_EXCEPTIONS).
+//
+// Before picking up these macros you may consider using RAII techniques
+// to deal with exceptions - their syntax can be always the same with 
+// or without exception support enabled.
+//----------------------------------------------------------------------
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !(defined BOOST_NO_EXCEPTIONS)
+#    define BOOST_TRY { try
+#    define BOOST_CATCH(x) catch(x)
+#    define BOOST_RETHROW throw;
+#    define BOOST_CATCH_END }
+#else
+#    if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+#        define BOOST_TRY { if ("")
+#        define BOOST_CATCH(x) else if (!"")
+#    else
+#        define BOOST_TRY { if (true)
+#        define BOOST_CATCH(x) else if (false)
+#    endif
+#    define BOOST_RETHROW
+#    define BOOST_CATCH_END }
+#endif
+
+
+#endif 
diff --git a/gatb-core/thirdparty/boost/core/noncopyable.hpp b/gatb-core/thirdparty/boost/core/noncopyable.hpp
new file mode 100644
index 0000000..6ae8c24
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/noncopyable.hpp
@@ -0,0 +1,48 @@
+//  Boost noncopyable.hpp header file  --------------------------------------//
+
+//  (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/utility for documentation.
+
+#ifndef BOOST_CORE_NONCOPYABLE_HPP
+#define BOOST_CORE_NONCOPYABLE_HPP
+
+#include <boost/config.hpp>
+
+namespace boost {
+
+//  Private copy constructor and copy assignment ensure classes derived from
+//  class noncopyable cannot be copied.
+
+//  Contributed by Dave Abrahams
+
+namespace noncopyable_  // protection from unintended ADL
+{
+  class noncopyable
+  {
+  protected:
+#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
+      BOOST_CONSTEXPR noncopyable() = default;
+      ~noncopyable() = default;
+#else
+      noncopyable() {}
+      ~noncopyable() {}
+#endif
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+      noncopyable( const noncopyable& ) = delete;
+      noncopyable& operator=( const noncopyable& ) = delete;
+#else
+  private:  // emphasize the following members are private
+      noncopyable( const noncopyable& );
+      noncopyable& operator=( const noncopyable& );
+#endif
+  };
+}
+
+typedef noncopyable_::noncopyable noncopyable;
+
+} // namespace boost
+
+#endif  // BOOST_CORE_NONCOPYABLE_HPP
diff --git a/gatb-core/thirdparty/boost/core/null_deleter.hpp b/gatb-core/thirdparty/boost/core/null_deleter.hpp
new file mode 100644
index 0000000..f0af590
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/null_deleter.hpp
@@ -0,0 +1,44 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2014.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   null_deleter.hpp
+ * \author Andrey Semashev
+ * \date   22.04.2007
+ *
+ * This header contains a \c null_deleter implementation. This is an empty
+ * function object that receives a pointer and does nothing with it.
+ * Such empty deletion strategy may be convenient, for example, when
+ * constructing <tt>shared_ptr</tt>s that point to some object that should not be
+ * deleted (i.e. a variable on the stack or some global singleton, like <tt>std::cout</tt>).
+ */
+
+#ifndef BOOST_CORE_NULL_DELETER_HPP
+#define BOOST_CORE_NULL_DELETER_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+//! A function object that does nothing and can be used as an empty deleter for \c shared_ptr
+struct null_deleter
+{
+    //! Function object result type
+    typedef void result_type;
+    /*!
+     * Does nothing
+     */
+    template< typename T >
+    void operator() (T*) const BOOST_NOEXCEPT {}
+};
+
+} // namespace boost
+
+#endif // BOOST_CORE_NULL_DELETER_HPP
diff --git a/gatb-core/thirdparty/boost/core/ref.hpp b/gatb-core/thirdparty/boost/core/ref.hpp
new file mode 100644
index 0000000..47dc858
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/ref.hpp
@@ -0,0 +1,301 @@
+#ifndef BOOST_CORE_REF_HPP
+#define BOOST_CORE_REF_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/utility/addressof.hpp>
+#include <boost/detail/workaround.hpp>
+
+//
+//  ref.hpp - ref/cref, useful helper functions
+//
+//  Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi at cs.utu.fi)
+//  Copyright (C) 2001, 2002 Peter Dimov
+//  Copyright (C) 2002 David Abrahams
+//
+//  Copyright (C) 2014 Glen Joseph Fernandes
+//  glenfe at live dot com
+//  Copyright (C) 2014 Agustin Berge
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/core/doc/html/core/ref.html for documentation.
+//
+
+/**
+ @file
+*/
+
+/**
+ Boost namespace.
+*/
+namespace boost
+{
+
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    struct ref_workaround_tag {};
+
+#endif
+
+// reference_wrapper
+
+/**
+ @brief Contains a reference to an object of type `T`.
+
+ `reference_wrapper` is primarily used to "feed" references to
+ function templates (algorithms) that take their parameter by
+ value. It provides an implicit conversion to `T&`, which
+ usually allows the function templates to work on references
+ unmodified.
+*/
+template<class T> class reference_wrapper
+{
+public:
+    /**
+     Type `T`.
+    */
+    typedef T type;
+
+    /**
+     Constructs a `reference_wrapper` object that stores a
+     reference to `t`.
+
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
+
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    BOOST_FORCEINLINE explicit reference_wrapper( T & t, ref_workaround_tag ): t_( boost::addressof( t ) ) {}
+
+#endif
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    /**
+     @remark Construction from a temporary object is disabled.
+    */
+    BOOST_DELETED_FUNCTION(reference_wrapper(T&& t))
+public:
+#endif
+
+    /**
+     @return The stored reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE operator T& () const { return *t_; }
+
+    /**
+     @return The stored reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE T& get() const { return *t_; }
+
+    /**
+     @return A pointer to the object referenced by the stored
+       reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE T* get_pointer() const { return t_; }
+
+private:
+
+    T* t_;
+};
+
+// ref
+
+/**
+ @cond
+*/
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
+#  define BOOST_REF_CONST
+#else
+#  define BOOST_REF_CONST const
+#endif
+/**
+ @endcond
+*/
+
+/**
+ @return `reference_wrapper<T>(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( T & t )
+{
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    return reference_wrapper<T>( t, ref_workaround_tag() );
+
+#else
+
+    return reference_wrapper<T>( t );
+
+#endif
+}
+
+// cref
+
+/**
+ @return `reference_wrapper<T const>(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref( T const & t )
+{
+    return reference_wrapper<T const>(t);
+}
+
+#undef BOOST_REF_CONST
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+/**
+ @cond
+*/
+#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+#  define BOOST_REF_DELETE
+#else
+#  define BOOST_REF_DELETE = delete
+#endif
+/**
+ @endcond
+*/
+
+/**
+ @remark Construction from a temporary object is disabled.
+*/
+template<class T> void ref(T const&&) BOOST_REF_DELETE;
+
+/**
+ @remark Construction from a temporary object is disabled.
+*/
+template<class T> void cref(T const&&) BOOST_REF_DELETE;
+
+#undef BOOST_REF_DELETE
+
+#endif
+
+// is_reference_wrapper
+
+/**
+ @brief Determine if a type `T` is an instantiation of
+ `reference_wrapper`.
+
+ The value static constant will be true if the type `T` is a
+ specialization of `reference_wrapper`.
+*/
+template<typename T> struct is_reference_wrapper
+{
+    BOOST_STATIC_CONSTANT( bool, value = false );
+};
+
+/**
+ @cond
+*/
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> const >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> volatile >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> const volatile >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+/**
+ @endcond
+*/
+
+
+// unwrap_reference
+
+/**
+ @brief Find the type in a `reference_wrapper`.
+
+ The `typedef` type is `T::type` if `T` is a
+ `reference_wrapper`, `T` otherwise.
+*/
+template<typename T> struct unwrap_reference
+{
+    typedef T type;
+};
+
+/**
+ @cond
+*/
+template<typename T> struct unwrap_reference< reference_wrapper<T> >
+{
+    typedef T type;
+};
+
+#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> const >
+{
+    typedef T type;
+};
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> volatile >
+{
+    typedef T type;
+};
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> const volatile >
+{
+    typedef T type;
+};
+
+#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+/**
+ @endcond
+*/
+
+// unwrap_ref
+
+/**
+ @return `unwrap_reference<T>::type&(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE typename unwrap_reference<T>::type& unwrap_ref( T & t )
+{
+    return t;
+}
+
+// get_pointer
+
+/**
+ @cond
+*/
+template<class T> BOOST_FORCEINLINE T* get_pointer( reference_wrapper<T> const & r )
+{
+    return r.get_pointer();
+}
+/**
+ @endcond
+*/
+
+} // namespace boost
+
+#endif // #ifndef BOOST_CORE_REF_HPP
diff --git a/gatb-core/thirdparty/boost/core/scoped_enum.hpp b/gatb-core/thirdparty/boost/core/scoped_enum.hpp
new file mode 100644
index 0000000..78c548b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/scoped_enum.hpp
@@ -0,0 +1,192 @@
+//  scoped_enum.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes, 2009
+//  Copyright (C) 2011-2012 Vicente J. Botet Escriba
+//  Copyright (C) 2012 Anthony Williams
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_CORE_SCOPED_ENUM_HPP
+#define BOOST_CORE_SCOPED_ENUM_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+
+#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
+
+  /**
+   * Meta-function to get the native enum type associated to an enum class or its emulation.
+   */
+  template <typename EnumType>
+  struct native_type
+  {
+    /**
+     * The member typedef type names the native enum type associated to the scoped enum,
+     * which is it self if the compiler supports scoped enums or EnumType::enum_type if it is an emulated scoped enum.
+     */
+    typedef typename EnumType::enum_type type;
+  };
+
+  /**
+   * Casts a scoped enum to its underlying type.
+   *
+   * This function is useful when working with scoped enum classes, which doens't implicitly convert to the underlying type.
+   * @param v A scoped enum.
+   * @returns The underlying type.
+   * @throws No-throws.
+   */
+  template <typename UnderlyingType, typename EnumType>
+  UnderlyingType underlying_cast(EnumType v)
+  {
+    return v.get_underlying_value_();
+  }
+
+  /**
+   * Casts a scoped enum to its native enum type.
+   *
+   * This function is useful to make programs portable when the scoped enum emulation can not be use where native enums can.
+   *
+   * EnumType the scoped enum type
+   *
+   * @param v A scoped enum.
+   * @returns The native enum value.
+   * @throws No-throws.
+   */
+  template <typename EnumType>
+  inline
+  typename EnumType::enum_type native_value(EnumType e)
+  {
+    return e.get_native_value_();
+  }
+
+#else  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+  template <typename EnumType>
+  struct native_type
+  {
+    typedef EnumType type;
+  };
+
+  template <typename UnderlyingType, typename EnumType>
+  UnderlyingType underlying_cast(EnumType v)
+  {
+    return static_cast<UnderlyingType>(v);
+  }
+
+  template <typename EnumType>
+  inline
+  EnumType native_value(EnumType e)
+  {
+    return e;
+  }
+
+#endif // BOOST_NO_CXX11_SCOPED_ENUMS
+}
+
+
+#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
+
+#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR \
+     explicit operator underlying_type() const BOOST_NOEXCEPT { return get_underlying_value_(); }
+
+#else
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR
+
+#endif
+
+/**
+ * Start a declaration of a scoped enum.
+ *
+ * @param EnumType The new scoped enum.
+ * @param UnderlyingType The underlying type.
+ */
+#define BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType, UnderlyingType)    \
+    struct EnumType {                                                   \
+        typedef void is_boost_scoped_enum_tag;                          \
+        typedef UnderlyingType underlying_type;                         \
+        EnumType() BOOST_NOEXCEPT {}                                    \
+        explicit EnumType(underlying_type v) BOOST_NOEXCEPT : v_(v) {}                 \
+        underlying_type get_underlying_value_() const BOOST_NOEXCEPT { return v_; }    \
+        BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR                \
+    private:                                                            \
+        underlying_type v_;                                             \
+        typedef EnumType self_type;                                     \
+    public:                                                             \
+        enum enum_type
+
+#define BOOST_SCOPED_ENUM_DECLARE_END2() \
+        enum_type get_native_value_() const BOOST_NOEXCEPT { return enum_type(v_); } \
+        friend bool operator ==(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)==enum_type(rhs.v_); } \
+        friend bool operator ==(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)==rhs; } \
+        friend bool operator ==(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs==enum_type(rhs.v_); } \
+        friend bool operator !=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)!=enum_type(rhs.v_); } \
+        friend bool operator !=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)!=rhs; } \
+        friend bool operator !=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs!=enum_type(rhs.v_); } \
+        friend bool operator <(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<enum_type(rhs.v_); } \
+        friend bool operator <(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<rhs; } \
+        friend bool operator <(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs<enum_type(rhs.v_); } \
+        friend bool operator <=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<=enum_type(rhs.v_); } \
+        friend bool operator <=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<=rhs; } \
+        friend bool operator <=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs<=enum_type(rhs.v_); } \
+        friend bool operator >(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>enum_type(rhs.v_); } \
+        friend bool operator >(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>rhs; } \
+        friend bool operator >(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs>enum_type(rhs.v_); } \
+        friend bool operator >=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>=enum_type(rhs.v_); } \
+        friend bool operator >=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>=rhs; } \
+        friend bool operator >=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs>=enum_type(rhs.v_); } \
+    };
+
+#define BOOST_SCOPED_ENUM_DECLARE_END(EnumType) \
+    ; \
+    EnumType(enum_type v) BOOST_NOEXCEPT : v_(v) {}                 \
+    BOOST_SCOPED_ENUM_DECLARE_END2()
+
+/**
+ * Starts a declaration of a scoped enum with the default int underlying type.
+ *
+ * @param EnumType The new scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_DECLARE_BEGIN(EnumType) \
+  BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType,int)
+
+/**
+ * Name of the native enum type.
+ *
+ * @param EnumType The new scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_NATIVE(EnumType) EnumType::enum_type
+/**
+ * Forward declares an scoped enum.
+ *
+ * @param EnumType The scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_FORWARD_DECLARE(EnumType) struct EnumType
+
+#else  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType,UnderlyingType) enum class EnumType : UnderlyingType
+#define BOOST_SCOPED_ENUM_DECLARE_BEGIN(EnumType) enum class EnumType
+#define BOOST_SCOPED_ENUM_DECLARE_END2()
+#define BOOST_SCOPED_ENUM_DECLARE_END(EnumType) ;
+
+#define BOOST_SCOPED_ENUM_NATIVE(EnumType) EnumType
+#define BOOST_SCOPED_ENUM_FORWARD_DECLARE(EnumType) enum class EnumType
+
+#endif  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+// Deprecated macros
+#define BOOST_SCOPED_ENUM_START(name) BOOST_SCOPED_ENUM_DECLARE_BEGIN(name)
+#define BOOST_SCOPED_ENUM_END BOOST_SCOPED_ENUM_DECLARE_END2()
+#define BOOST_SCOPED_ENUM(name) BOOST_SCOPED_ENUM_NATIVE(name)
+
+#endif  // BOOST_CORE_SCOPED_ENUM_HPP
diff --git a/gatb-core/thirdparty/boost/core/swap.hpp b/gatb-core/thirdparty/boost/core/swap.hpp
new file mode 100644
index 0000000..baa1be9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/swap.hpp
@@ -0,0 +1,60 @@
+// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// For more information, see http://www.boost.org
+
+
+#ifndef BOOST_CORE_SWAP_HPP
+#define BOOST_CORE_SWAP_HPP
+
+// Note: the implementation of this utility contains various workarounds:
+// - swap_impl is put outside the boost namespace, to avoid infinite
+// recursion (causing stack overflow) when swapping objects of a primitive
+// type.
+// - swap_impl has a using-directive, rather than a using-declaration,
+// because some compilers (including MSVC 7.1, Borland 5.9.3, and
+// Intel 8.1) don't do argument-dependent lookup when it has a
+// using-declaration instead.
+// - boost::swap has two template arguments, instead of one, to
+// avoid ambiguity when swapping objects of a Boost type that does
+// not have its own boost::swap overload.
+
+#include <utility> //for std::swap (C++11)
+#include <algorithm> //for std::swap (C++98)
+#include <cstddef> //for std::size_t
+#include <boost/config.hpp>
+
+namespace boost_swap_impl
+{
+  template<class T>
+  BOOST_GPU_ENABLED
+  void swap_impl(T& left, T& right)
+  {
+    using namespace std;//use std::swap if argument dependent lookup fails
+    swap(left,right);
+  }
+
+  template<class T, std::size_t N>
+  BOOST_GPU_ENABLED
+  void swap_impl(T (& left)[N], T (& right)[N])
+  {
+    for (std::size_t i = 0; i < N; ++i)
+    {
+      ::boost_swap_impl::swap_impl(left[i], right[i]);
+    }
+  }
+}
+
+namespace boost
+{
+  template<class T1, class T2>
+  BOOST_GPU_ENABLED
+  void swap(T1& left, T2& right)
+  {
+    ::boost_swap_impl::swap_impl(left, right);
+  }
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/core/typeinfo.hpp b/gatb-core/thirdparty/boost/core/typeinfo.hpp
new file mode 100644
index 0000000..e67b4a3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/typeinfo.hpp
@@ -0,0 +1,151 @@
+#ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
+#define BOOST_CORE_TYPEINFO_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  core::typeinfo, BOOST_CORE_TYPEID
+//
+//  Copyright 2007, 2014 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined( BOOST_NO_TYPEID )
+
+#include <boost/current_function.hpp>
+#include <functional>
+
+namespace boost
+{
+
+namespace core
+{
+
+class typeinfo
+{
+private:
+
+    typeinfo( typeinfo const& );
+    typeinfo& operator=( typeinfo const& );
+
+    char const * name_;
+
+public:
+
+    explicit typeinfo( char const * name ): name_( name )
+    {
+    }
+
+    bool operator==( typeinfo const& rhs ) const
+    {
+        return this == &rhs;
+    }
+
+    bool operator!=( typeinfo const& rhs ) const
+    {
+        return this != &rhs;
+    }
+
+    bool before( typeinfo const& rhs ) const
+    {
+        return std::less< typeinfo const* >()( this, &rhs );
+    }
+
+    char const* name() const
+    {
+        return name_;
+    }
+};
+
+inline char const * demangled_name( core::typeinfo const & ti )
+{
+    return ti.name();
+}
+
+} // namespace core
+
+namespace detail
+{
+
+template<class T> struct core_typeid_
+{
+    static boost::core::typeinfo ti_;
+
+    static char const * name()
+    {
+        return BOOST_CURRENT_FUNCTION;
+    }
+};
+
+#if defined(__SUNPRO_CC)
+// see #4199, the Sun Studio compiler gets confused about static initialization 
+// constructor arguments. But an assignment works just fine. 
+template<class T> boost::core::typeinfo core_typeid_< T >::ti_ = core_typeid_< T >::name();
+#else
+template<class T> boost::core::typeinfo core_typeid_< T >::ti_(core_typeid_< T >::name());
+#endif
+
+template<class T> struct core_typeid_< T & >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T const >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T volatile >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T const volatile >: core_typeid_< T >
+{
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_CORE_TYPEID(T) (boost::detail::core_typeid_<T>::ti_)
+
+#else
+
+#include <boost/core/demangle.hpp>
+#include <typeinfo>
+
+namespace boost
+{
+
+namespace core
+{
+
+#if defined( BOOST_NO_STD_TYPEINFO )
+
+typedef ::type_info typeinfo;
+
+#else
+
+typedef std::type_info typeinfo;
+
+#endif
+
+inline std::string demangled_name( core::typeinfo const & ti )
+{
+    return core::demangle( ti.name() );
+}
+
+} // namespace core
+
+} // namespace boost
+
+#define BOOST_CORE_TYPEID(T) typeid(T)
+
+#endif
+
+#endif  // #ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/core/underlying_type.hpp b/gatb-core/thirdparty/boost/core/underlying_type.hpp
new file mode 100644
index 0000000..7ecba31
--- /dev/null
+++ b/gatb-core/thirdparty/boost/core/underlying_type.hpp
@@ -0,0 +1,79 @@
+//  underlying_type.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes, 2009
+//  Copyright (C) 2011-2012 Vicente J. Botet Escriba
+//  Copyright (C) 2012 Anthony Williams
+//  Copyright (C) 2014 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_CORE_UNDERLYING_TYPE_HPP
+#define BOOST_CORE_UNDERLYING_TYPE_HPP
+
+#include <boost/config.hpp>
+
+// GCC 4.7 and later seem to provide std::underlying_type
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) || (defined(BOOST_GCC) && BOOST_GCC >= 40700 && defined(__GXX_EXPERIMENTAL_CXX0X__))
+#include <type_traits>
+#define BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+namespace detail {
+
+template< typename EnumType, typename Void = void >
+struct underlying_type_impl;
+
+#if defined(BOOST_NO_CXX11_SCOPED_ENUMS)
+
+// Support for boost/core/scoped_enum.hpp
+template< typename EnumType >
+struct underlying_type_impl< EnumType, typename EnumType::is_boost_scoped_enum_tag >
+{
+    /**
+     * The member typedef type names the underlying type of EnumType. It is EnumType::underlying_type when the EnumType is an emulated scoped enum,
+     */
+    typedef typename EnumType::underlying_type type;
+};
+
+#endif
+
+#if defined(BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE)
+
+template< typename EnumType, typename Void >
+struct underlying_type_impl
+{
+    typedef typename std::underlying_type< EnumType >::type type;
+};
+
+#endif
+
+} // namespace detail
+
+#if !defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE)
+#define BOOST_NO_UNDERLYING_TYPE
+#endif
+
+/**
+ * Meta-function to get the underlying type of a scoped enum.
+ *
+ * Requires EnumType must be an enum type or the emulation of a scoped enum.
+ * If BOOST_NO_UNDERLYING_TYPE is defined, the implementation will not be able
+ * to deduce the underlying type of enums. The user is expected to specialize
+ * this trait in this case.
+ */
+template< typename EnumType >
+struct underlying_type :
+    public detail::underlying_type_impl< EnumType >
+{
+};
+
+} // namespace boost
+
+#endif  // BOOST_CORE_UNDERLYING_TYPE_HPP
diff --git a/gatb-core/thirdparty/boost/cstdint.hpp b/gatb-core/thirdparty/boost/cstdint.hpp
new file mode 100644
index 0000000..6988835
--- /dev/null
+++ b/gatb-core/thirdparty/boost/cstdint.hpp
@@ -0,0 +1,546 @@
+//  boost cstdint.hpp header file  ------------------------------------------//
+
+//  (C) Copyright Beman Dawes 1999.
+//  (C) Copyright Jens Mauer 2001
+//  (C) Copyright John Maddock 2001
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/integer for documentation.
+
+//  Revision History
+//   31 Oct 01  use BOOST_HAS_LONG_LONG to check for "long long" (Jens M.)
+//   16 Apr 01  check LONGLONG_MAX when looking for "long long" (Jens Maurer)
+//   23 Jan 01  prefer "long" over "int" for int32_t and intmax_t (Jens Maurer)
+//   12 Nov 00  Merged <boost/stdint.h> (Jens Maurer)
+//   23 Sep 00  Added INTXX_C macro support (John Maddock).
+//   22 Sep 00  Better 64-bit support (John Maddock)
+//   29 Jun 00  Reimplement to avoid including stdint.h within namespace boost
+//    8 Aug 99  Initial version (Beman Dawes)
+
+
+#ifndef BOOST_CSTDINT_HPP
+#define BOOST_CSTDINT_HPP
+
+//
+// Since we always define the INT#_C macros as per C++0x,
+// define __STDC_CONSTANT_MACROS so that <stdint.h> does the right
+// thing if possible, and so that the user knows that the macros
+// are actually defined as per C99.
+//
+#ifndef __STDC_CONSTANT_MACROS
+#  define __STDC_CONSTANT_MACROS
+#endif
+
+#include <boost/config.hpp>
+
+//
+// Note that GLIBC is a bit inconsistent about whether int64_t is defined or not
+// depending upon what headers happen to have been included first...
+// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.
+// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990
+//
+#if defined(BOOST_HAS_STDINT_H)					\
+  && (!defined(__GLIBC__)					\
+      || defined(__GLIBC_HAVE_LONG_LONG)			\
+      || (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))
+
+// The following #include is an implementation artifact; not part of interface.
+# ifdef __hpux
+// HP-UX has a vaguely nice <stdint.h> in a non-standard location
+#   include <inttypes.h>
+#   ifdef __STDC_32_MODE__
+      // this is triggered with GCC, because it defines __cplusplus < 199707L
+#     define BOOST_NO_INT64_T
+#   endif
+# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)
+#   include <inttypes.h>
+# else
+#   include <stdint.h>
+
+// There is a bug in Cygwin two _C macros
+#   if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__)
+#     undef INTMAX_C
+#     undef UINTMAX_C
+#     define INTMAX_C(c) c##LL
+#     define UINTMAX_C(c) c##ULL
+#   endif
+
+# endif
+
+#ifdef __QNX__
+
+// QNX (Dinkumware stdlib) defines these as non-standard names.
+// Reflect to the standard names.
+
+typedef ::intleast8_t int_least8_t;
+typedef ::intfast8_t int_fast8_t;
+typedef ::uintleast8_t uint_least8_t;
+typedef ::uintfast8_t uint_fast8_t;
+
+typedef ::intleast16_t int_least16_t;
+typedef ::intfast16_t int_fast16_t;
+typedef ::uintleast16_t uint_least16_t;
+typedef ::uintfast16_t uint_fast16_t;
+
+typedef ::intleast32_t int_least32_t;
+typedef ::intfast32_t int_fast32_t;
+typedef ::uintleast32_t uint_least32_t;
+typedef ::uintfast32_t uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+typedef ::intleast64_t int_least64_t;
+typedef ::intfast64_t int_fast64_t;
+typedef ::uintleast64_t uint_least64_t;
+typedef ::uintfast64_t uint_fast64_t;
+
+# endif
+
+#endif
+
+namespace boost
+{
+
+  using ::int8_t;
+  using ::int_least8_t;
+  using ::int_fast8_t;
+  using ::uint8_t;
+  using ::uint_least8_t;
+  using ::uint_fast8_t;
+
+  using ::int16_t;
+  using ::int_least16_t;
+  using ::int_fast16_t;
+  using ::uint16_t;
+  using ::uint_least16_t;
+  using ::uint_fast16_t;
+
+  using ::int32_t;
+  using ::int_least32_t;
+  using ::int_fast32_t;
+  using ::uint32_t;
+  using ::uint_least32_t;
+  using ::uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+  using ::int64_t;
+  using ::int_least64_t;
+  using ::int_fast64_t;
+  using ::uint64_t;
+  using ::uint_least64_t;
+  using ::uint_fast64_t;
+
+# endif
+
+  using ::intmax_t;
+  using ::uintmax_t;
+
+} // namespace boost
+
+#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS) || defined(__SOLARIS9__) || defined(__NetBSD__)
+// FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need.
+# include <inttypes.h>
+
+namespace boost {
+
+  using ::int8_t;
+  typedef int8_t int_least8_t;
+  typedef int8_t int_fast8_t;
+  using ::uint8_t;
+  typedef uint8_t uint_least8_t;
+  typedef uint8_t uint_fast8_t;
+
+  using ::int16_t;
+  typedef int16_t int_least16_t;
+  typedef int16_t int_fast16_t;
+  using ::uint16_t;
+  typedef uint16_t uint_least16_t;
+  typedef uint16_t uint_fast16_t;
+
+  using ::int32_t;
+  typedef int32_t int_least32_t;
+  typedef int32_t int_fast32_t;
+  using ::uint32_t;
+  typedef uint32_t uint_least32_t;
+  typedef uint32_t uint_fast32_t;
+
+# ifndef BOOST_NO_INT64_T
+
+  using ::int64_t;
+  typedef int64_t int_least64_t;
+  typedef int64_t int_fast64_t;
+  using ::uint64_t;
+  typedef uint64_t uint_least64_t;
+  typedef uint64_t uint_fast64_t;
+
+  typedef int64_t intmax_t;
+  typedef uint64_t uintmax_t;
+
+# else
+
+  typedef int32_t intmax_t;
+  typedef uint32_t uintmax_t;
+
+# endif
+
+} // namespace boost
+
+#else  // BOOST_HAS_STDINT_H
+
+# include <boost/limits.hpp> // implementation artifact; not part of interface
+# include <limits.h>         // needed for limits macros
+
+
+namespace boost
+{
+
+//  These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit
+//  platforms.  For other systems, they will have to be hand tailored.
+//
+//  Because the fast types are assumed to be the same as the undecorated types,
+//  it may be possible to hand tailor a more efficient implementation.  Such
+//  an optimization may be illusionary; on the Intel x86-family 386 on, for
+//  example, byte arithmetic and load/stores are as fast as "int" sized ones.
+
+//  8-bit types  ------------------------------------------------------------//
+
+# if UCHAR_MAX == 0xff
+     typedef signed char     int8_t;
+     typedef signed char     int_least8_t;
+     typedef signed char     int_fast8_t;
+     typedef unsigned char   uint8_t;
+     typedef unsigned char   uint_least8_t;
+     typedef unsigned char   uint_fast8_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  16-bit types  -----------------------------------------------------------//
+
+# if USHRT_MAX == 0xffff
+#  if defined(__crayx1)
+     // The Cray X1 has a 16-bit short, however it is not recommend
+     // for use in performance critical code.
+     typedef short           int16_t;
+     typedef short           int_least16_t;
+     typedef int             int_fast16_t;
+     typedef unsigned short  uint16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned int    uint_fast16_t;
+#  else
+     typedef short           int16_t;
+     typedef short           int_least16_t;
+     typedef short           int_fast16_t;
+     typedef unsigned short  uint16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned short  uint_fast16_t;
+#  endif
+# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__)
+      // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified
+      // MTA / XMT does support the following non-standard integer types
+      typedef __short16           int16_t;
+      typedef __short16           int_least16_t;
+      typedef __short16           int_fast16_t;
+      typedef unsigned __short16  uint16_t;
+      typedef unsigned __short16  uint_least16_t;
+      typedef unsigned __short16  uint_fast16_t;
+# elif (USHRT_MAX == 0xffffffff) && defined(CRAY)
+     // no 16-bit types on Cray:
+     typedef short           int_least16_t;
+     typedef short           int_fast16_t;
+     typedef unsigned short  uint_least16_t;
+     typedef unsigned short  uint_fast16_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  32-bit types  -----------------------------------------------------------//
+
+# if UINT_MAX == 0xffffffff
+     typedef int             int32_t;
+     typedef int             int_least32_t;
+     typedef int             int_fast32_t;
+     typedef unsigned int    uint32_t;
+     typedef unsigned int    uint_least32_t;
+     typedef unsigned int    uint_fast32_t;
+# elif (USHRT_MAX == 0xffffffff)
+     typedef short             int32_t;
+     typedef short             int_least32_t;
+     typedef short             int_fast32_t;
+     typedef unsigned short    uint32_t;
+     typedef unsigned short    uint_least32_t;
+     typedef unsigned short    uint_fast32_t;
+# elif ULONG_MAX == 0xffffffff
+     typedef long            int32_t;
+     typedef long            int_least32_t;
+     typedef long            int_fast32_t;
+     typedef unsigned long   uint32_t;
+     typedef unsigned long   uint_least32_t;
+     typedef unsigned long   uint_fast32_t;
+# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__)
+      // Integers are 64 bits on the MTA / XMT
+      typedef __int32           int32_t;
+      typedef __int32           int_least32_t;
+      typedef __int32           int_fast32_t;
+      typedef unsigned __int32  uint32_t;
+      typedef unsigned __int32  uint_least32_t;
+      typedef unsigned __int32  uint_fast32_t;
+# else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+# endif
+
+//  64-bit types + intmax_t and uintmax_t  ----------------------------------//
+
+# if defined(BOOST_HAS_LONG_LONG) && \
+   !defined(BOOST_MSVC) && !defined(__BORLANDC__) && \
+   (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \
+   (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
+#    if defined(__hpux)
+     // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
+#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL)
+                                                                 // 2**64 - 1
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+
+     typedef  ::boost::long_long_type            intmax_t;
+     typedef  ::boost::ulong_long_type   uintmax_t;
+     typedef  ::boost::long_long_type            int64_t;
+     typedef  ::boost::long_long_type            int_least64_t;
+     typedef  ::boost::long_long_type            int_fast64_t;
+     typedef  ::boost::ulong_long_type   uint64_t;
+     typedef  ::boost::ulong_long_type   uint_least64_t;
+     typedef  ::boost::ulong_long_type   uint_fast64_t;
+
+# elif ULONG_MAX != 0xffffffff
+
+#    if ULONG_MAX == 18446744073709551615 // 2**64 - 1
+     typedef long                 intmax_t;
+     typedef unsigned long        uintmax_t;
+     typedef long                 int64_t;
+     typedef long                 int_least64_t;
+     typedef long                 int_fast64_t;
+     typedef unsigned long        uint64_t;
+     typedef unsigned long        uint_least64_t;
+     typedef unsigned long        uint_fast64_t;
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+# elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG)
+     __extension__ typedef long long            intmax_t;
+     __extension__ typedef unsigned long long   uintmax_t;
+     __extension__ typedef long long            int64_t;
+     __extension__ typedef long long            int_least64_t;
+     __extension__ typedef long long            int_fast64_t;
+     __extension__ typedef unsigned long long   uint64_t;
+     __extension__ typedef unsigned long long   uint_least64_t;
+     __extension__ typedef unsigned long long   uint_fast64_t;
+# elif defined(BOOST_HAS_MS_INT64)
+     //
+     // we have Borland/Intel/Microsoft __int64:
+     //
+     typedef __int64             intmax_t;
+     typedef unsigned __int64    uintmax_t;
+     typedef __int64             int64_t;
+     typedef __int64             int_least64_t;
+     typedef __int64             int_fast64_t;
+     typedef unsigned __int64    uint64_t;
+     typedef unsigned __int64    uint_least64_t;
+     typedef unsigned __int64    uint_fast64_t;
+# else // assume no 64-bit integers
+#  define BOOST_NO_INT64_T
+     typedef int32_t              intmax_t;
+     typedef uint32_t             uintmax_t;
+# endif
+
+} // namespace boost
+
+
+#endif // BOOST_HAS_STDINT_H
+
+// intptr_t/uintptr_t are defined separately because they are optional and not universally available
+#if defined(BOOST_WINDOWS) && !defined(_WIN32_WCE) && !defined(BOOST_HAS_STDINT_H)
+// Older MSVC don't have stdint.h and have intptr_t/uintptr_t defined in stddef.h
+#include <stddef.h>
+#endif
+
+// PGI seems to not support intptr_t/uintptr_t properly. BOOST_HAS_STDINT_H is not defined for this compiler by Boost.Config.
+#if !defined(__PGIC__)
+
+#if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \
+    || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \
+    || defined(__CYGWIN__) \
+    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \
+    || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun)
+
+namespace boost {
+    using ::intptr_t;
+    using ::uintptr_t;
+}
+#define BOOST_HAS_INTPTR_T
+
+// Clang pretends to be GCC, so it'll match this condition
+#elif defined(__GNUC__) && defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)
+
+namespace boost {
+    typedef __INTPTR_TYPE__ intptr_t;
+    typedef __UINTPTR_TYPE__ uintptr_t;
+}
+#define BOOST_HAS_INTPTR_T
+
+#endif
+
+#endif // !defined(__PGIC__)
+
+#endif // BOOST_CSTDINT_HPP
+
+
+/****************************************************
+
+Macro definition section:
+
+Added 23rd September 2000 (John Maddock).
+Modified 11th September 2001 to be excluded when
+BOOST_HAS_STDINT_H is defined (John Maddock).
+Modified 11th Dec 2009 to always define the
+INT#_C macros if they're not already defined (John Maddock).
+
+******************************************************/
+
+#if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \
+   (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C))
+//
+// For the following code we get several warnings along the lines of:
+//
+// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant
+//
+// So we declare this a system header to suppress these warnings.
+//
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC system_header
+#endif
+
+#include <limits.h>
+# define BOOST__STDC_CONSTANT_MACROS_DEFINED
+# if defined(BOOST_HAS_MS_INT64)
+//
+// Borland/Intel/Microsoft compilers have width specific suffixes:
+//
+#ifndef INT8_C
+#  define INT8_C(value)     value##i8
+#endif
+#ifndef INT16_C
+#  define INT16_C(value)    value##i16
+#endif
+#ifndef INT32_C
+#  define INT32_C(value)    value##i32
+#endif
+#ifndef INT64_C
+#  define INT64_C(value)    value##i64
+#endif
+#  ifdef __BORLANDC__
+    // Borland bug: appending ui8 makes the type a signed char
+#   define UINT8_C(value)    static_cast<unsigned char>(value##u)
+#  else
+#   define UINT8_C(value)    value##ui8
+#  endif
+#ifndef UINT16_C
+#  define UINT16_C(value)   value##ui16
+#endif
+#ifndef UINT32_C
+#  define UINT32_C(value)   value##ui32
+#endif
+#ifndef UINT64_C
+#  define UINT64_C(value)   value##ui64
+#endif
+#ifndef INTMAX_C
+#  define INTMAX_C(value)   value##i64
+#  define UINTMAX_C(value)  value##ui64
+#endif
+
+# else
+//  do it the old fashioned way:
+
+//  8-bit types  ------------------------------------------------------------//
+
+#  if (UCHAR_MAX == 0xff) && !defined(INT8_C)
+#   define INT8_C(value) static_cast<boost::int8_t>(value)
+#   define UINT8_C(value) static_cast<boost::uint8_t>(value##u)
+#  endif
+
+//  16-bit types  -----------------------------------------------------------//
+
+#  if (USHRT_MAX == 0xffff) && !defined(INT16_C)
+#   define INT16_C(value) static_cast<boost::int16_t>(value)
+#   define UINT16_C(value) static_cast<boost::uint16_t>(value##u)
+#  endif
+
+//  32-bit types  -----------------------------------------------------------//
+#ifndef INT32_C
+#  if (UINT_MAX == 0xffffffff)
+#   define INT32_C(value) value
+#   define UINT32_C(value) value##u
+#  elif ULONG_MAX == 0xffffffff
+#   define INT32_C(value) value##L
+#   define UINT32_C(value) value##uL
+#  endif
+#endif
+
+//  64-bit types + intmax_t and uintmax_t  ----------------------------------//
+#ifndef INT64_C
+#  if defined(BOOST_HAS_LONG_LONG) && \
+    (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_ULLONG_MAX) || defined(_LLONG_MAX))
+
+#    if defined(__hpux)
+        // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) ||  \
+        (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) ||  \
+        (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \
+        (defined(_ULLONG_MAX) && _ULLONG_MAX == 18446744073709551615ULL) || \
+        (defined(_LLONG_MAX) && _LLONG_MAX == 9223372036854775807LL)
+
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  elif ULONG_MAX != 0xffffffff
+
+#    if ULONG_MAX == 18446744073709551615U // 2**64 - 1
+#       define INT64_C(value) value##L
+#       define UINT64_C(value) value##uL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  elif defined(BOOST_HAS_LONG_LONG)
+     // Usual macros not defined, work things out for ourselves:
+#    if(~0uLL == 18446744073709551615ULL)
+#       define INT64_C(value) value##LL
+#       define UINT64_C(value) value##uLL
+#    else
+#       error defaults not correct; you must hand modify boost/cstdint.hpp
+#    endif
+#  else
+#    error defaults not correct; you must hand modify boost/cstdint.hpp
+#  endif
+
+#  ifdef BOOST_NO_INT64_T
+#   define INTMAX_C(value) INT32_C(value)
+#   define UINTMAX_C(value) UINT32_C(value)
+#  else
+#   define INTMAX_C(value) INT64_C(value)
+#   define UINTMAX_C(value) UINT64_C(value)
+#  endif
+#endif
+# endif // Borland/Microsoft specific width suffixes
+
+#endif // INT#_C macros.
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/current_function.hpp b/gatb-core/thirdparty/boost/current_function.hpp
new file mode 100644
index 0000000..5c113f8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/current_function.hpp
@@ -0,0 +1,71 @@
+#ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
+#define BOOST_CURRENT_FUNCTION_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/current_function.hpp - BOOST_CURRENT_FUNCTION
+//
+//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  http://www.boost.org/libs/assert/current_function.html
+//
+
+namespace boost
+{
+
+namespace detail
+{
+
+inline void current_function_helper()
+{
+
+#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
+
+# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
+
+#elif defined(__DMC__) && (__DMC__ >= 0x810)
+
+# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
+
+#elif defined(__FUNCSIG__)
+
+# define BOOST_CURRENT_FUNCTION __FUNCSIG__
+
+#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
+
+# define BOOST_CURRENT_FUNCTION __FUNCTION__
+
+#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
+
+# define BOOST_CURRENT_FUNCTION __FUNC__
+
+#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
+
+# define BOOST_CURRENT_FUNCTION __func__
+
+#elif defined(__cplusplus) && (__cplusplus >= 201103)
+
+# define BOOST_CURRENT_FUNCTION __func__
+
+#else
+
+# define BOOST_CURRENT_FUNCTION "(unknown)"
+
+#endif
+
+}
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/algorithm.hpp b/gatb-core/thirdparty/boost/detail/algorithm.hpp
new file mode 100644
index 0000000..3f9297b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/algorithm.hpp
@@ -0,0 +1,82 @@
+// (C) Copyright Jeremy Siek 2001.
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef BOOST_ALGORITHM_HPP
+# define BOOST_ALGORITHM_HPP
+# include <boost/detail/iterator.hpp>
+// Algorithms on sequences
+//
+// The functions in this file have not yet gone through formal
+// review, and are subject to change. This is a work in progress.
+// They have been checked into the detail directory because
+// there are some graph algorithms that use these functions.
+
+#include <algorithm>
+#include <vector>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/algorithm/copy.hpp>
+#include <boost/range/algorithm/equal.hpp>
+#include <boost/range/algorithm/sort.hpp>
+#include <boost/range/algorithm/stable_sort.hpp>
+#include <boost/range/algorithm/find_if.hpp>
+#include <boost/range/algorithm/count.hpp>
+#include <boost/range/algorithm/count_if.hpp>
+#include <boost/range/algorithm_ext/is_sorted.hpp>
+#include <boost/range/algorithm_ext/iota.hpp>
+
+namespace boost {
+
+  template <typename InputIterator, typename Predicate>
+  bool any_if(InputIterator first, InputIterator last, Predicate p)
+  {
+    return std::find_if(first, last, p) != last;
+  }
+
+  template <typename Container, typename Predicate>
+  bool any_if(const Container& c, Predicate p)
+  {
+    return any_if(boost::begin(c), boost::end(c), p);
+  }
+
+  template <typename InputIterator, typename T>
+  bool container_contains(InputIterator first, InputIterator last, T value)
+  {
+    return std::find(first, last, value) != last;
+  }
+  template <typename Container, typename T>
+  bool container_contains(const Container& c, const T& value)
+  {
+    return container_contains(boost::begin(c), boost::end(c), value);
+  }
+
+} // namespace boost
+
+#endif // BOOST_ALGORITHM_HPP
diff --git a/gatb-core/thirdparty/boost/detail/allocator_utilities.hpp b/gatb-core/thirdparty/boost/detail/allocator_utilities.hpp
new file mode 100644
index 0000000..ed3de84
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/allocator_utilities.hpp
@@ -0,0 +1,187 @@
+/* Copyright 2003-2013 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See Boost website at http://www.boost.org/
+ */
+
+#ifndef BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP
+#define BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/detail/workaround.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <cstddef>
+#include <memory>
+#include <new>
+
+namespace boost{
+
+namespace detail{
+
+/* Allocator adaption layer. Some stdlibs provide allocators without rebind
+ * and template ctors. These facilities are simulated with the external
+ * template class rebind_to and the aid of partial_std_allocator_wrapper.
+ */
+
+namespace allocator{
+
+/* partial_std_allocator_wrapper inherits the functionality of a std
+ * allocator while providing a templatized ctor and other bits missing
+ * in some stdlib implementation or another.
+ */
+
+template<typename Type>
+class partial_std_allocator_wrapper:public std::allocator<Type>
+{
+public:
+  /* Oddly enough, STLport does not define std::allocator<void>::value_type
+   * when configured to work without partial template specialization.
+   * No harm in supplying the definition here unconditionally.
+   */
+
+  typedef Type value_type;
+
+  partial_std_allocator_wrapper(){};
+
+  template<typename Other>
+  partial_std_allocator_wrapper(const partial_std_allocator_wrapper<Other>&){}
+
+  partial_std_allocator_wrapper(const std::allocator<Type>& x):
+    std::allocator<Type>(x)
+  {
+  };
+
+#if defined(BOOST_DINKUMWARE_STDLIB)
+  /* Dinkumware guys didn't provide a means to call allocate() without
+   * supplying a hint, in disagreement with the standard.
+   */
+
+  Type* allocate(std::size_t n,const void* hint=0)
+  {
+    std::allocator<Type>& a=*this;
+    return a.allocate(n,hint);
+  }
+#endif
+
+};
+
+/* Detects whether a given allocator belongs to a defective stdlib not
+ * having the required member templates.
+ * Note that it does not suffice to check the Boost.Config stdlib
+ * macros, as the user might have passed a custom, compliant allocator.
+ * The checks also considers partial_std_allocator_wrapper to be
+ * a standard defective allocator.
+ */
+
+#if defined(BOOST_NO_STD_ALLOCATOR)&&\
+  (defined(BOOST_HAS_PARTIAL_STD_ALLOCATOR)||defined(BOOST_DINKUMWARE_STDLIB))
+
+template<typename Allocator>
+struct is_partial_std_allocator
+{
+  BOOST_STATIC_CONSTANT(bool,
+    value=
+      (is_same<
+        std::allocator<BOOST_DEDUCED_TYPENAME Allocator::value_type>,
+        Allocator
+      >::value)||
+      (is_same<
+        partial_std_allocator_wrapper<
+          BOOST_DEDUCED_TYPENAME Allocator::value_type>,
+        Allocator
+      >::value));
+};
+
+#else
+
+template<typename Allocator>
+struct is_partial_std_allocator
+{
+  BOOST_STATIC_CONSTANT(bool,value=false);
+};
+
+#endif
+
+/* rebind operations for defective std allocators */
+
+template<typename Allocator,typename Type>
+struct partial_std_allocator_rebind_to
+{
+  typedef partial_std_allocator_wrapper<Type> type;
+};
+
+/* rebind operation in all other cases */
+
+template<typename Allocator>
+struct rebinder
+{
+  template<typename Type>
+  struct result
+  {
+      typedef typename Allocator::BOOST_NESTED_TEMPLATE 
+          rebind<Type>::other other;
+  };
+};
+
+template<typename Allocator,typename Type>
+struct compliant_allocator_rebind_to
+{
+  typedef typename rebinder<Allocator>::
+      BOOST_NESTED_TEMPLATE result<Type>::other type;
+};
+
+/* rebind front-end */
+
+template<typename Allocator,typename Type>
+struct rebind_to:
+  mpl::eval_if_c<
+    is_partial_std_allocator<Allocator>::value,
+    partial_std_allocator_rebind_to<Allocator,Type>,
+    compliant_allocator_rebind_to<Allocator,Type>
+  >
+{
+};
+
+/* allocator-independent versions of construct and destroy */
+
+template<typename Type>
+void construct(void* p,const Type& t)
+{
+  new (p) Type(t);
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
+/* MSVC++ issues spurious warnings about unreferencend formal parameters
+ * in destroy<Type> when Type is a class with trivial dtor.
+ */
+
+#pragma warning(push)
+#pragma warning(disable:4100)  
+#endif
+
+template<typename Type>
+void destroy(const Type* p)
+{
+
+#if BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590))
+  const_cast<Type*>(p)->~Type();
+#else
+  p->~Type();
+#endif
+
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
+#pragma warning(pop)
+#endif
+
+} /* namespace boost::detail::allocator */
+
+} /* namespace boost::detail */
+
+} /* namespace boost */
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/atomic_count.hpp b/gatb-core/thirdparty/boost/detail/atomic_count.hpp
new file mode 100644
index 0000000..5411c7a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/atomic_count.hpp
@@ -0,0 +1,21 @@
+#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
+//
+//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/smart_ptr/detail/atomic_count.hpp>
+
+#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/atomic_redef_macros.hpp b/gatb-core/thirdparty/boost/detail/atomic_redef_macros.hpp
new file mode 100644
index 0000000..dfd15f5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/atomic_redef_macros.hpp
@@ -0,0 +1,19 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if defined(BOOST_INTEL)
+
+#pragma pop_macro("atomic_compare_exchange")
+#pragma pop_macro("atomic_compare_exchange_explicit")
+#pragma pop_macro("atomic_exchange")
+#pragma pop_macro("atomic_exchange_explicit")
+#pragma pop_macro("atomic_is_lock_free")
+#pragma pop_macro("atomic_load")
+#pragma pop_macro("atomic_load_explicit")
+#pragma pop_macro("atomic_store")
+#pragma pop_macro("atomic_store_explicit")
+
+#endif // #if defined(BOOST_INTEL)
diff --git a/gatb-core/thirdparty/boost/detail/atomic_undef_macros.hpp b/gatb-core/thirdparty/boost/detail/atomic_undef_macros.hpp
new file mode 100644
index 0000000..18d840a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/atomic_undef_macros.hpp
@@ -0,0 +1,39 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if defined(BOOST_INTEL)
+
+#pragma push_macro("atomic_compare_exchange")
+#undef atomic_compare_exchange
+
+#pragma push_macro("atomic_compare_exchange_explicit")
+#undef atomic_compare_exchange_explicit
+
+#pragma push_macro("atomic_exchange")
+#undef atomic_exchange
+
+#pragma push_macro("atomic_exchange_explicit")
+#undef atomic_exchange_explicit
+
+#pragma push_macro("atomic_is_lock_free")
+#undef atomic_is_lock_free
+
+#pragma push_macro("atomic_load")
+#undef atomic_load
+
+#pragma push_macro("atomic_load_explicit")
+#undef atomic_load_explicit
+
+#pragma push_macro("atomic_store")
+#undef atomic_store
+
+#pragma push_macro("atomic_store_explicit")
+#undef atomic_store_explicit
+
+
+#endif // #if defined(BOOST_INTEL)
+
+
diff --git a/gatb-core/thirdparty/boost/detail/basic_pointerbuf.hpp b/gatb-core/thirdparty/boost/detail/basic_pointerbuf.hpp
new file mode 100644
index 0000000..1d8cf37
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/basic_pointerbuf.hpp
@@ -0,0 +1,139 @@
+//-----------------------------------------------------------------------------
+// boost detail/templated_streams.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2013 John Maddock, Antony Polukhin
+// 
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_BASIC_POINTERBUF_HPP
+#define BOOST_DETAIL_BASIC_POINTERBUF_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include "boost/config.hpp"
+#include <streambuf>
+
+namespace boost { namespace detail {
+
+//
+// class basic_pointerbuf:
+// acts as a stream buffer which wraps around a pair of pointers:
+//
+template <class charT, class BufferT >
+class basic_pointerbuf : public BufferT {
+protected:
+   typedef BufferT base_type;
+   typedef basic_pointerbuf<charT, BufferT> this_type;
+   typedef typename base_type::int_type int_type;
+   typedef typename base_type::char_type char_type;
+   typedef typename base_type::pos_type pos_type;
+   typedef ::std::streamsize streamsize;
+   typedef typename base_type::off_type off_type;
+
+public:
+   basic_pointerbuf() : base_type() { setbuf(0, 0); }
+   const charT* getnext() { return this->gptr(); }
+
+#ifndef BOOST_NO_USING_TEMPLATE
+    using base_type::pptr;
+    using base_type::pbase;
+#else
+    charT* pptr() const { return base_type::pptr(); }
+    charT* pbase() const { return base_type::pbase(); }
+#endif
+
+protected:
+   // VC mistakenly assumes that `setbuf` and other functions are not referenced.
+   // Marking those functions with `inline` suppresses the warnings.
+   // There must be no harm from marking virtual functions as inline: inline virtual
+   // call can be inlined ONLY when the compiler knows the "exact class".
+   inline base_type* setbuf(char_type* s, streamsize n);
+   inline typename this_type::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which);
+   inline typename this_type::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which);
+
+private:
+   basic_pointerbuf& operator=(const basic_pointerbuf&);
+   basic_pointerbuf(const basic_pointerbuf&);
+};
+
+template<class charT, class BufferT>
+BufferT*
+basic_pointerbuf<charT, BufferT>::setbuf(char_type* s, streamsize n)
+{
+   this->setg(s, s, s + n);
+   return this;
+}
+
+template<class charT, class BufferT>
+typename basic_pointerbuf<charT, BufferT>::pos_type
+basic_pointerbuf<charT, BufferT>::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which)
+{
+   typedef typename boost::int_t<sizeof(way) * CHAR_BIT>::least cast_type;
+
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   std::ptrdiff_t size = this->egptr() - this->eback();
+   std::ptrdiff_t pos = this->gptr() - this->eback();
+   charT* g = this->eback();
+   switch(static_cast<cast_type>(way))
+   {
+   case ::std::ios_base::beg:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + off, g + size);
+      break;
+   case ::std::ios_base::end:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + size - off, g + size);
+      break;
+   case ::std::ios_base::cur:
+   {
+      std::ptrdiff_t newpos = static_cast<std::ptrdiff_t>(pos + off);
+      if((newpos < 0) || (newpos > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + newpos, g + size);
+      break;
+   }
+   default: ;
+   }
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4244)
+#endif
+   return static_cast<pos_type>(this->gptr() - this->eback());
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template<class charT, class BufferT>
+typename basic_pointerbuf<charT, BufferT>::pos_type
+basic_pointerbuf<charT, BufferT>::seekpos(pos_type sp, ::std::ios_base::openmode which)
+{
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   off_type size = static_cast<off_type>(this->egptr() - this->eback());
+   charT* g = this->eback();
+   if(off_type(sp) <= size)
+   {
+      this->setg(g, g + off_type(sp), g + size);
+   }
+   return pos_type(off_type(-1));
+}
+
+}} // namespace boost::detail
+
+#endif // BOOST_DETAIL_BASIC_POINTERBUF_HPP
+
diff --git a/gatb-core/thirdparty/boost/detail/binary_search.hpp b/gatb-core/thirdparty/boost/detail/binary_search.hpp
new file mode 100644
index 0000000..3dca9b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/binary_search.hpp
@@ -0,0 +1,216 @@
+// Copyright (c)  2000 David Abrahams. 
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+// 
+// Copyright (c) 1994
+// Hewlett-Packard Company
+// 
+// Permission to use, copy, modify, distribute and sell this software
+// and its documentation for any purpose is hereby granted without fee,
+// provided that the above copyright notice appear in all copies and
+// that both that copyright notice and this permission notice appear
+// in supporting documentation.  Hewlett-Packard Company makes no
+// representations about the suitability of this software for any
+// purpose.  It is provided "as is" without express or implied warranty.
+// 
+// Copyright (c) 1996
+// Silicon Graphics Computer Systems, Inc.
+// 
+// Permission to use, copy, modify, distribute and sell this software
+// and its documentation for any purpose is hereby granted without fee,
+// provided that the above copyright notice appear in all copies and
+// that both that copyright notice and this permission notice appear
+// in supporting documentation.  Silicon Graphics makes no
+// representations about the suitability of this software for any
+// purpose.  It is provided "as is" without express or implied warranty.
+// 
+#ifndef BINARY_SEARCH_DWA_122600_H_
+# define BINARY_SEARCH_DWA_122600_H_
+
+# include <boost/detail/iterator.hpp>
+# include <utility>
+
+namespace boost { namespace detail {
+
+template <class ForwardIter, class Tp>
+ForwardIter lower_bound(ForwardIter first, ForwardIter last,
+                             const Tp& val) 
+{
+    typedef detail::iterator_traits<ForwardIter> traits;
+    
+    typename traits::difference_type len = boost::detail::distance(first, last);
+    typename traits::difference_type half;
+    ForwardIter middle;
+
+    while (len > 0) {
+      half = len >> 1;
+      middle = first;
+      std::advance(middle, half);
+      if (*middle < val) {
+        first = middle;
+        ++first;
+        len = len - half - 1;
+      }
+      else
+        len = half;
+    }
+    return first;
+}
+
+template <class ForwardIter, class Tp, class Compare>
+ForwardIter lower_bound(ForwardIter first, ForwardIter last,
+                              const Tp& val, Compare comp)
+{
+  typedef detail::iterator_traits<ForwardIter> traits;
+
+  typename traits::difference_type len = boost::detail::distance(first, last);
+  typename traits::difference_type half;
+  ForwardIter middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    std::advance(middle, half);
+    if (comp(*middle, val)) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else
+      len = half;
+  }
+  return first;
+}
+
+template <class ForwardIter, class Tp>
+ForwardIter upper_bound(ForwardIter first, ForwardIter last,
+                           const Tp& val)
+{
+  typedef detail::iterator_traits<ForwardIter> traits;
+
+  typename traits::difference_type len = boost::detail::distance(first, last);
+  typename traits::difference_type half;
+  ForwardIter middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    std::advance(middle, half);
+    if (val < *middle)
+      len = half;
+    else {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class ForwardIter, class Tp, class Compare>
+ForwardIter upper_bound(ForwardIter first, ForwardIter last,
+                           const Tp& val, Compare comp)
+{
+  typedef detail::iterator_traits<ForwardIter> traits;
+
+  typename traits::difference_type len = boost::detail::distance(first, last);
+  typename traits::difference_type half;
+  ForwardIter middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    std::advance(middle, half);
+    if (comp(val, *middle))
+      len = half;
+    else {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class ForwardIter, class Tp>
+std::pair<ForwardIter, ForwardIter>
+equal_range(ForwardIter first, ForwardIter last, const Tp& val)
+{
+  typedef detail::iterator_traits<ForwardIter> traits;
+
+  typename traits::difference_type len = boost::detail::distance(first, last);
+  typename traits::difference_type half;
+  ForwardIter middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    std::advance(middle, half);
+    if (*middle < val) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else if (val < *middle)
+      len = half;
+    else {
+      left = boost::detail::lower_bound(first, middle, val);
+      std::advance(first, len);
+      right = boost::detail::upper_bound(++middle, first, val);
+      return std::pair<ForwardIter, ForwardIter>(left, right);
+    }
+  }
+  return std::pair<ForwardIter, ForwardIter>(first, first);
+}
+
+template <class ForwardIter, class Tp, class Compare>
+std::pair<ForwardIter, ForwardIter>
+equal_range(ForwardIter first, ForwardIter last, const Tp& val,
+              Compare comp)
+{
+  typedef detail::iterator_traits<ForwardIter> traits;
+
+  typename traits::difference_type len = boost::detail::distance(first, last);
+  typename traits::difference_type half;
+  ForwardIter middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    std::advance(middle, half);
+    if (comp(*middle, val)) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else if (comp(val, *middle))
+      len = half;
+    else {
+      left = boost::detail::lower_bound(first, middle, val, comp);
+      std::advance(first, len);
+      right = boost::detail::upper_bound(++middle, first, val, comp);
+      return std::pair<ForwardIter, ForwardIter>(left, right);
+    }
+  }
+  return std::pair<ForwardIter, ForwardIter>(first, first);
+}           
+
+template <class ForwardIter, class Tp>
+bool binary_search(ForwardIter first, ForwardIter last,
+                   const Tp& val) {
+  ForwardIter i = boost::detail::lower_bound(first, last, val);
+  return i != last && !(val < *i);
+}
+
+template <class ForwardIter, class Tp, class Compare>
+bool binary_search(ForwardIter first, ForwardIter last,
+                   const Tp& val,
+                   Compare comp) {
+  ForwardIter i = boost::detail::lower_bound(first, last, val, comp);
+  return i != last && !comp(val, *i);
+}
+
+}} // namespace boost::detail
+
+#endif // BINARY_SEARCH_DWA_122600_H_
diff --git a/gatb-core/thirdparty/boost/detail/bitmask.hpp b/gatb-core/thirdparty/boost/detail/bitmask.hpp
new file mode 100644
index 0000000..c6714a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/bitmask.hpp
@@ -0,0 +1,47 @@
+//  boost/detail/bitmask.hpp  ------------------------------------------------//
+
+//  Copyright Beman Dawes 2006
+
+//  Distributed under the Boost Software License, Version 1.0
+//  http://www.boost.org/LICENSE_1_0.txt
+
+//  Usage:  enum foo { a=1, b=2, c=4 };
+//          BOOST_BITMASK( foo );
+//
+//          void f( foo arg );
+//          ...
+//          f( a | c );
+
+#ifndef BOOST_BITMASK_HPP
+#define BOOST_BITMASK_HPP
+
+#include <boost/cstdint.hpp>
+
+#define BOOST_BITMASK(Bitmask)                                            \
+                                                                          \
+  inline Bitmask operator| (Bitmask x , Bitmask y )                       \
+  { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
+      | static_cast<boost::int_least32_t>(y)); }                          \
+                                                                          \
+  inline Bitmask operator& (Bitmask x , Bitmask y )                       \
+  { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
+      & static_cast<boost::int_least32_t>(y)); }                          \
+                                                                          \
+  inline Bitmask operator^ (Bitmask x , Bitmask y )                       \
+  { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
+      ^ static_cast<boost::int_least32_t>(y)); }                          \
+                                                                          \
+  inline Bitmask operator~ (Bitmask x )                                   \
+  { return static_cast<Bitmask>(~static_cast<boost::int_least32_t>(x)); } \
+                                                                          \
+  inline Bitmask & operator&=(Bitmask & x , Bitmask y)                    \
+  { x = x & y ; return x ; }                                              \
+                                                                          \
+  inline Bitmask & operator|=(Bitmask & x , Bitmask y)                    \
+  { x = x | y ; return x ; }                                              \
+                                                                          \
+  inline Bitmask & operator^=(Bitmask & x , Bitmask y)                    \
+  { x = x ^ y ; return x ; }                                              
+
+#endif // BOOST_BITMASK_HPP
+
diff --git a/gatb-core/thirdparty/boost/detail/call_traits.hpp b/gatb-core/thirdparty/boost/detail/call_traits.hpp
new file mode 100644
index 0000000..36dea00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/call_traits.hpp
@@ -0,0 +1,172 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/utility for most recent version including documentation.
+
+// call_traits: defines typedefs for function usage
+// (see libs/utility/call_traits.htm)
+
+/* Release notes:
+   23rd July 2000:
+      Fixed array specialization. (JM)
+      Added Borland specific fixes for reference types
+      (issue raised by Steve Cleary).
+*/
+
+#ifndef BOOST_DETAIL_CALL_TRAITS_HPP
+#define BOOST_DETAIL_CALL_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
+#include <cstddef>
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost{
+
+namespace detail{
+
+template <typename T, bool small_>
+struct ct_imp2
+{
+   typedef const T& param_type;
+};
+
+template <typename T>
+struct ct_imp2<T, true>
+{
+   typedef const T param_type;
+};
+
+template <typename T, bool isp, bool b1, bool b2>
+struct ct_imp
+{
+   typedef const T& param_type;
+};
+
+template <typename T, bool isp, bool b2>
+struct ct_imp<T, isp, true, b2>
+{
+   typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+
+template <typename T, bool isp, bool b1>
+struct ct_imp<T, isp, b1, true>
+{
+   typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+
+template <typename T, bool b1, bool b2>
+struct ct_imp<T, true, b1, b2>
+{
+   typedef const T param_type;
+};
+
+}
+
+template <typename T>
+struct call_traits
+{
+public:
+   typedef T value_type;
+   typedef T& reference;
+   typedef const T& const_reference;
+   //
+   // C++ Builder workaround: we should be able to define a compile time
+   // constant and pass that as a single template parameter to ct_imp<T,bool>,
+   // however compiler bugs prevent this - instead pass three bool's to
+   // ct_imp<T,bool,bool,bool> and add an extra partial specialisation
+   // of ct_imp to handle the logic. (JM)
+   typedef typename boost::detail::ct_imp<
+      T,
+      ::boost::is_pointer<T>::value,
+      ::boost::is_arithmetic<T>::value,
+      ::boost::is_enum<T>::value
+   >::param_type param_type;
+};
+
+template <typename T>
+struct call_traits<T&>
+{
+   typedef T& value_type;
+   typedef T& reference;
+   typedef const T& const_reference;
+   typedef T& param_type;  // hh removed const
+};
+
+#if BOOST_WORKAROUND( __BORLANDC__,  < 0x5A0 )
+// these are illegal specialisations; cv-qualifies applied to
+// references have no effect according to [8.3.2p1],
+// C++ Builder requires them though as it treats cv-qualified
+// references as distinct types...
+template <typename T>
+struct call_traits<T&const>
+{
+   typedef T& value_type;
+   typedef T& reference;
+   typedef const T& const_reference;
+   typedef T& param_type;  // hh removed const
+};
+template <typename T>
+struct call_traits<T&volatile>
+{
+   typedef T& value_type;
+   typedef T& reference;
+   typedef const T& const_reference;
+   typedef T& param_type;  // hh removed const
+};
+template <typename T>
+struct call_traits<T&const volatile>
+{
+   typedef T& value_type;
+   typedef T& reference;
+   typedef const T& const_reference;
+   typedef T& param_type;  // hh removed const
+};
+
+template <typename T>
+struct call_traits< T * >
+{
+   typedef T * value_type;
+   typedef T * & reference;
+   typedef T * const & const_reference;
+   typedef T * const param_type;  // hh removed const
+};
+#endif
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+template <typename T, std::size_t N>
+struct call_traits<T [N]>
+{
+private:
+   typedef T array_type[N];
+public:
+   // degrades array to pointer:
+   typedef const T* value_type;
+   typedef array_type& reference;
+   typedef const array_type& const_reference;
+   typedef const T* const param_type;
+};
+
+template <typename T, std::size_t N>
+struct call_traits<const T [N]>
+{
+private:
+   typedef const T array_type[N];
+public:
+   // degrades array to pointer:
+   typedef const T* value_type;
+   typedef array_type& reference;
+   typedef const array_type& const_reference;
+   typedef const T* const param_type;
+};
+#endif
+
+}
+
+#endif // BOOST_DETAIL_CALL_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/catch_exceptions.hpp b/gatb-core/thirdparty/boost/detail/catch_exceptions.hpp
new file mode 100644
index 0000000..823ebd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/catch_exceptions.hpp
@@ -0,0 +1,142 @@
+//  boost/catch_exceptions.hpp -----------------------------------------------//
+
+//  Copyright Beman Dawes 1995-2001.  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/test for documentation.
+
+//  Revision History
+//   13 Jun 01 report_exception() made inline. (John Maddock, Jesse Jones)
+//   26 Feb 01 Numerous changes suggested during formal review. (Beman)
+//   25 Jan 01 catch_exceptions.hpp code factored out of cpp_main.cpp.
+//   22 Jan 01 Remove test_tools dependencies to reduce coupling.
+//    5 Nov 00 Initial boost version (Beman Dawes)
+
+#ifndef BOOST_CATCH_EXCEPTIONS_HPP
+#define BOOST_CATCH_EXCEPTIONS_HPP
+
+//  header dependencies are deliberately restricted to the standard library
+//  to reduce coupling to other boost libraries.
+#include <string>             // for string
+#include <new>                // for bad_alloc
+#include <typeinfo>           // for bad_cast, bad_typeid
+#include <exception>          // for exception, bad_exception
+#include <stdexcept>          // for std exception hierarchy
+#include <boost/cstdlib.hpp>  // for exit codes
+#include <ostream>         // for ostream
+
+# if defined(__BORLANDC__) && (__BORLANDC__ <= 0x0551)
+#   define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT 
+# endif
+
+#if defined(MPW_CPLUS) && (MPW_CPLUS <= 0x890)
+#   define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT 
+    namespace std { class bad_typeid { }; }
+# endif
+
+namespace boost
+{
+
+  namespace detail
+  {
+    //  A separate reporting function was requested during formal review.
+    inline void report_exception( std::ostream & os, 
+                                  const char * name, const char * info )
+      { os << "\n** uncaught exception: " << name << " " << info << std::endl; }
+  }
+
+  //  catch_exceptions  ------------------------------------------------------//
+
+  template< class Generator >  // Generator is function object returning int
+  int catch_exceptions( Generator function_object,
+                        std::ostream & out, std::ostream & err )
+  {
+    int result = 0;               // quiet compiler warnings
+    bool exception_thrown = true; // avoid setting result for each excptn type
+
+#ifndef BOOST_NO_EXCEPTIONS
+    try
+    {
+#endif
+      result = function_object();
+      exception_thrown = false;
+#ifndef BOOST_NO_EXCEPTIONS
+    }
+
+    //  As a result of hard experience with strangely interleaved output
+    //  under some compilers, there is a lot of use of endl in the code below
+    //  where a simple '\n' might appear to do.
+
+    //  The rules for catch & arguments are a bit different from function 
+    //  arguments (ISO 15.3 paragraphs 18 & 19). Apparently const isn't
+    //  required, but it doesn't hurt and some programmers ask for it.
+
+    catch ( const char * ex )
+      { detail::report_exception( out, "", ex ); }
+    catch ( const std::string & ex )
+      { detail::report_exception( out, "", ex.c_str() ); }
+
+    //  std:: exceptions
+    catch ( const std::bad_alloc & ex )
+      { detail::report_exception( out, "std::bad_alloc:", ex.what() ); }
+
+# ifndef BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT
+    catch ( const std::bad_cast & ex )
+      { detail::report_exception( out, "std::bad_cast:", ex.what() ); }
+    catch ( const std::bad_typeid & ex )
+      { detail::report_exception( out, "std::bad_typeid:", ex.what() ); }
+# else
+    catch ( const std::bad_cast & )
+      { detail::report_exception( out, "std::bad_cast", "" ); }
+    catch ( const std::bad_typeid & )
+      { detail::report_exception( out, "std::bad_typeid", "" ); }
+# endif
+
+    catch ( const std::bad_exception & ex )
+      { detail::report_exception( out, "std::bad_exception:", ex.what() ); }
+    catch ( const std::domain_error & ex )
+      { detail::report_exception( out, "std::domain_error:", ex.what() ); }
+    catch ( const std::invalid_argument & ex )
+      { detail::report_exception( out, "std::invalid_argument:", ex.what() ); }
+    catch ( const std::length_error & ex )
+      { detail::report_exception( out, "std::length_error:", ex.what() ); }
+    catch ( const std::out_of_range & ex )
+      { detail::report_exception( out, "std::out_of_range:", ex.what() ); }
+    catch ( const std::range_error & ex )
+      { detail::report_exception( out, "std::range_error:", ex.what() ); }
+    catch ( const std::overflow_error & ex )
+      { detail::report_exception( out, "std::overflow_error:", ex.what() ); }
+    catch ( const std::underflow_error & ex )
+      { detail::report_exception( out, "std::underflow_error:", ex.what() ); }
+    catch ( const std::logic_error & ex )
+      { detail::report_exception( out, "std::logic_error:", ex.what() ); }
+    catch ( const std::runtime_error & ex )
+      { detail::report_exception( out, "std::runtime_error:", ex.what() ); }
+    catch ( const std::exception & ex )
+      { detail::report_exception( out, "std::exception:", ex.what() ); }
+
+    catch ( ... )
+      { detail::report_exception( out, "unknown exception", "" ); }
+#endif // BOOST_NO_EXCEPTIONS
+
+    if ( exception_thrown ) result = boost::exit_exception_failure;
+
+    if ( result != 0 && result != exit_success )
+    {
+      out << std::endl << "**** returning with error code "
+                << result << std::endl;
+      err
+        << "**********  errors detected; see stdout for details  ***********"
+        << std::endl;
+    }
+#if !defined(BOOST_NO_CPP_MAIN_SUCCESS_MESSAGE)
+    else { out << std::flush << "no errors detected" << std::endl; }
+#endif
+    return result;
+  } // catch_exceptions
+
+} // boost
+
+#endif  // BOOST_CATCH_EXCEPTIONS_HPP
+
diff --git a/gatb-core/thirdparty/boost/detail/compressed_pair.hpp b/gatb-core/thirdparty/boost/detail/compressed_pair.hpp
new file mode 100644
index 0000000..5dc21e2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/compressed_pair.hpp
@@ -0,0 +1,443 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/utility for most recent version including documentation.
+
+// compressed_pair: pair that "compresses" empty members
+// (see libs/utility/doc/html/compressed_pair.html)
+//
+// JM changes 25 Jan 2004:
+// For the case where T1 == T2 and both are empty, then first() and second()
+// should return different objects.
+// JM changes 25 Jan 2000:
+// Removed default arguments from compressed_pair_switch to get
+// C++ Builder 4 to accept them
+// rewriten swap to get gcc and C++ builder to compile.
+// added partial specialisations for case T1 == T2 to avoid duplicate constructor defs.
+
+#ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP
+#define BOOST_DETAIL_COMPRESSED_PAIR_HPP
+
+#include <algorithm>
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_empty.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/call_traits.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable:4512)
+#endif 
+namespace boost
+{
+
+template <class T1, class T2>
+class compressed_pair;
+
+
+// compressed_pair
+
+namespace details
+{
+   // JM altered 26 Jan 2000:
+   template <class T1, class T2, bool IsSame, bool FirstEmpty, bool SecondEmpty>
+   struct compressed_pair_switch;
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, false, false, false>
+      {static const int value = 0;};
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, false, true, true>
+      {static const int value = 3;};
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, false, true, false>
+      {static const int value = 1;};
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, false, false, true>
+      {static const int value = 2;};
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, true, true, true>
+      {static const int value = 4;};
+
+   template <class T1, class T2>
+   struct compressed_pair_switch<T1, T2, true, false, false>
+      {static const int value = 5;};
+
+   template <class T1, class T2, int Version> class compressed_pair_imp;
+
+#ifdef __GNUC__
+   // workaround for GCC (JM):
+   using std::swap;
+#endif
+   //
+   // can't call unqualified swap from within classname::swap
+   // as Koenig lookup rules will find only the classname::swap
+   // member function not the global declaration, so use cp_swap
+   // as a forwarding function (JM):
+   template <typename T>
+   inline void cp_swap(T& t1, T& t2)
+   {
+#ifndef __GNUC__
+      using std::swap;
+#endif
+      swap(t1, t2);
+   }
+
+   // 0    derive from neither
+
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 0>
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {} 
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : first_(x), second_(y) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_(x) {}
+
+      compressed_pair_imp(second_param_type y)
+         : second_(y) {}
+
+      first_reference       first()       {return first_;}
+      first_const_reference first() const {return first_;}
+
+      second_reference       second()       {return second_;}
+      second_const_reference second() const {return second_;}
+
+      void swap(::boost::compressed_pair<T1, T2>& y)
+      {
+         cp_swap(first_, y.first());
+         cp_swap(second_, y.second());
+      }
+   private:
+      first_type first_;
+      second_type second_;
+   };
+
+   // 1    derive from T1
+
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 1>
+      : protected ::boost::remove_cv<T1>::type
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {}
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : first_type(x), second_(y) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_type(x) {}
+
+      compressed_pair_imp(second_param_type y)
+         : second_(y) {}
+
+      first_reference       first()       {return *this;}
+      first_const_reference first() const {return *this;}
+
+      second_reference       second()       {return second_;}
+      second_const_reference second() const {return second_;}
+
+      void swap(::boost::compressed_pair<T1,T2>& y)
+      {
+         // no need to swap empty base class:
+         cp_swap(second_, y.second());
+      }
+   private:
+      second_type second_;
+   };
+
+   // 2    derive from T2
+
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 2>
+      : protected ::boost::remove_cv<T2>::type
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {}
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : second_type(y), first_(x) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_(x) {}
+
+      compressed_pair_imp(second_param_type y)
+         : second_type(y) {}
+
+      first_reference       first()       {return first_;}
+      first_const_reference first() const {return first_;}
+
+      second_reference       second()       {return *this;}
+      second_const_reference second() const {return *this;}
+
+      void swap(::boost::compressed_pair<T1,T2>& y)
+      {
+         // no need to swap empty base class:
+         cp_swap(first_, y.first());
+      }
+
+   private:
+      first_type first_;
+   };
+
+   // 3    derive from T1 and T2
+
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 3>
+      : protected ::boost::remove_cv<T1>::type,
+        protected ::boost::remove_cv<T2>::type
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {}
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : first_type(x), second_type(y) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_type(x) {}
+
+      compressed_pair_imp(second_param_type y)
+         : second_type(y) {}
+
+      first_reference       first()       {return *this;}
+      first_const_reference first() const {return *this;}
+
+      second_reference       second()       {return *this;}
+      second_const_reference second() const {return *this;}
+      //
+      // no need to swap empty bases:
+      void swap(::boost::compressed_pair<T1,T2>&) {}
+   };
+
+   // JM
+   // 4    T1 == T2, T1 and T2 both empty
+   //      Originally this did not store an instance of T2 at all
+   //      but that led to problems beause it meant &x.first() == &x.second()
+   //      which is not true for any other kind of pair, so now we store an instance
+   //      of T2 just in case the user is relying on first() and second() returning
+   //      different objects (albeit both empty).
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 4>
+      : protected ::boost::remove_cv<T1>::type
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {}
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : first_type(x), m_second(y) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_type(x), m_second(x) {}
+
+      first_reference       first()       {return *this;}
+      first_const_reference first() const {return *this;}
+
+      second_reference       second()       {return m_second;}
+      second_const_reference second() const {return m_second;}
+
+      void swap(::boost::compressed_pair<T1,T2>&) {}
+   private:
+      T2 m_second;
+   };
+
+   // 5    T1 == T2 and are not empty:   //JM
+
+   template <class T1, class T2>
+   class compressed_pair_imp<T1, T2, 5>
+   {
+   public:
+      typedef T1                                                 first_type;
+      typedef T2                                                 second_type;
+      typedef typename call_traits<first_type>::param_type       first_param_type;
+      typedef typename call_traits<second_type>::param_type      second_param_type;
+      typedef typename call_traits<first_type>::reference        first_reference;
+      typedef typename call_traits<second_type>::reference       second_reference;
+      typedef typename call_traits<first_type>::const_reference  first_const_reference;
+      typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+      compressed_pair_imp() {}
+
+      compressed_pair_imp(first_param_type x, second_param_type y)
+         : first_(x), second_(y) {}
+
+      compressed_pair_imp(first_param_type x)
+         : first_(x), second_(x) {}
+
+      first_reference       first()       {return first_;}
+      first_const_reference first() const {return first_;}
+
+      second_reference       second()       {return second_;}
+      second_const_reference second() const {return second_;}
+
+      void swap(::boost::compressed_pair<T1, T2>& y)
+      {
+         cp_swap(first_, y.first());
+         cp_swap(second_, y.second());
+      }
+   private:
+      first_type first_;
+      second_type second_;
+   };
+
+}  // details
+
+template <class T1, class T2>
+class compressed_pair
+   : private ::boost::details::compressed_pair_imp<T1, T2,
+             ::boost::details::compressed_pair_switch<
+                    T1,
+                    T2,
+                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
+                    ::boost::is_empty<T1>::value,
+                    ::boost::is_empty<T2>::value>::value>
+{
+private:
+   typedef details::compressed_pair_imp<T1, T2,
+             ::boost::details::compressed_pair_switch<
+                    T1,
+                    T2,
+                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
+                    ::boost::is_empty<T1>::value,
+                    ::boost::is_empty<T2>::value>::value> base;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair() : base() {}
+            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
+   explicit compressed_pair(first_param_type x) : base(x) {}
+   explicit compressed_pair(second_param_type y) : base(y) {}
+
+   first_reference       first()       {return base::first();}
+   first_const_reference first() const {return base::first();}
+
+   second_reference       second()       {return base::second();}
+   second_const_reference second() const {return base::second();}
+
+   void swap(compressed_pair& y) { base::swap(y); }
+};
+
+// JM
+// Partial specialisation for case where T1 == T2:
+//
+template <class T>
+class compressed_pair<T, T>
+   : private details::compressed_pair_imp<T, T,
+             ::boost::details::compressed_pair_switch<
+                    T,
+                    T,
+                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
+                    ::boost::is_empty<T>::value,
+                    ::boost::is_empty<T>::value>::value>
+{
+private:
+   typedef details::compressed_pair_imp<T, T,
+             ::boost::details::compressed_pair_switch<
+                    T,
+                    T,
+                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
+                    ::boost::is_empty<T>::value,
+                    ::boost::is_empty<T>::value>::value> base;
+public:
+   typedef T                                                  first_type;
+   typedef T                                                  second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair() : base() {}
+            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
+#if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530))
+   explicit 
+#endif
+      compressed_pair(first_param_type x) : base(x) {}
+
+   first_reference       first()       {return base::first();}
+   first_const_reference first() const {return base::first();}
+
+   second_reference       second()       {return base::second();}
+   second_const_reference second() const {return base::second();}
+
+   void swap(::boost::compressed_pair<T,T>& y) { base::swap(y); }
+};
+
+template <class T1, class T2>
+inline
+void
+swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
+{
+   x.swap(y);
+}
+
+} // boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif 
+
+#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP
+
diff --git a/gatb-core/thirdparty/boost/detail/container_fwd.hpp b/gatb-core/thirdparty/boost/detail/container_fwd.hpp
new file mode 100644
index 0000000..04ce972
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/container_fwd.hpp
@@ -0,0 +1,157 @@
+
+// Copyright 2005-2011 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Note: if you change this include guard, you also need to change
+// container_fwd_compile_fail.cpp
+#if !defined(BOOST_DETAIL_CONTAINER_FWD_HPP)
+#define BOOST_DETAIL_CONTAINER_FWD_HPP
+
+#if defined(_MSC_VER) && \
+    !defined(BOOST_DETAIL_TEST_CONFIG_ONLY)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// Define BOOST_DETAIL_NO_CONTAINER_FWD if you don't want this header to      //
+// forward declare standard containers.                                       //
+//                                                                            //
+// BOOST_DETAIL_CONTAINER_FWD to make it foward declare containers even if it //
+// normally doesn't.                                                          //
+//                                                                            //
+// BOOST_DETAIL_NO_CONTAINER_FWD overrides BOOST_DETAIL_CONTAINER_FWD.        //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_DETAIL_NO_CONTAINER_FWD)
+#  if defined(BOOST_DETAIL_CONTAINER_FWD)
+     // Force forward declarations.
+#  elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+     // STLport
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif defined(__LIBCOMO__)
+     // Comeau STL:
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+     // Rogue Wave library:
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif defined(_LIBCPP_VERSION)
+     // libc++
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+     // GNU libstdc++ 3
+     //
+     // Disable forwarding for all recent versions, as the library has a
+     // versioned namespace mode, and I don't know how to detect it.
+#    if __GLIBCXX__ >= 20070513 \
+        || defined(_GLIBCXX_DEBUG) \
+        || defined(_GLIBCXX_PARALLEL) \
+        || defined(_GLIBCXX_PROFILE)
+#      define BOOST_DETAIL_NO_CONTAINER_FWD
+#    else
+#      if defined(__GLIBCXX__) && __GLIBCXX__ >= 20040530
+#        define BOOST_CONTAINER_FWD_COMPLEX_STRUCT
+#      endif
+#    endif
+#  elif defined(__STL_CONFIG_H)
+     // generic SGI STL
+     //
+     // Forward declaration seems to be okay, but it has a couple of odd
+     // implementations.
+#    define BOOST_CONTAINER_FWD_BAD_BITSET
+#    if !defined(__STL_NON_TYPE_TMPL_PARAM_BUG)
+#      define BOOST_CONTAINER_FWD_BAD_DEQUE
+#     endif
+#  elif defined(__MSL_CPP__)
+     // MSL standard lib:
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif defined(__IBMCPP__)
+     // The default VACPP std lib, forward declaration seems to be fine.
+#  elif defined(MSIPL_COMPILE_H)
+     // Modena C++ standard library
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
+     // Dinkumware Library (this has to appear after any possible replacement
+     // libraries)
+#  else
+#    define BOOST_DETAIL_NO_CONTAINER_FWD
+#  endif
+#endif
+
+#if !defined(BOOST_DETAIL_TEST_CONFIG_ONLY)
+
+#if defined(BOOST_DETAIL_NO_CONTAINER_FWD) && \
+    !defined(BOOST_DETAIL_TEST_FORCE_CONTAINER_FWD)
+
+#include <deque>
+#include <list>
+#include <vector>
+#include <map>
+#include <set>
+#include <bitset>
+#include <string>
+#include <complex>
+
+#else
+
+#include <cstddef>
+
+#if defined(BOOST_CONTAINER_FWD_BAD_DEQUE)
+#include <deque>
+#endif
+
+#if defined(BOOST_CONTAINER_FWD_BAD_BITSET)
+#include <bitset>
+#endif
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4099) // struct/class mismatch in fwd declarations
+#endif
+
+namespace std
+{
+    template <class T> class allocator;
+    template <class charT, class traits, class Allocator> class basic_string;
+
+    template <class charT> struct char_traits;
+
+#if defined(BOOST_CONTAINER_FWD_COMPLEX_STRUCT)
+    template <class T> struct complex;
+#else
+    template <class T> class complex;
+#endif
+
+#if !defined(BOOST_CONTAINER_FWD_BAD_DEQUE)
+    template <class T, class Allocator> class deque;
+#endif
+
+    template <class T, class Allocator> class list;
+    template <class T, class Allocator> class vector;
+    template <class Key, class T, class Compare, class Allocator> class map;
+    template <class Key, class T, class Compare, class Allocator>
+    class multimap;
+    template <class Key, class Compare, class Allocator> class set;
+    template <class Key, class Compare, class Allocator> class multiset;
+
+#if !defined(BOOST_CONTAINER_FWD_BAD_BITSET)
+    template <size_t N> class bitset;
+#endif
+    template <class T1, class T2> struct pair;
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif // BOOST_DETAIL_NO_CONTAINER_FWD &&
+       // !defined(BOOST_DETAIL_TEST_FORCE_CONTAINER_FWD)
+
+#endif // BOOST_DETAIL_TEST_CONFIG_ONLY
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/dynamic_bitset.hpp b/gatb-core/thirdparty/boost/detail/dynamic_bitset.hpp
new file mode 100644
index 0000000..e0f675d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/dynamic_bitset.hpp
@@ -0,0 +1,241 @@
+// -----------------------------------------------------------
+//
+//   Copyright (c) 2001-2002 Chuck Allison and Jeremy Siek
+//        Copyright (c) 2003-2006, 2008 Gennaro Prota
+//
+// Copyright (c) 2014 Glen Joseph Fernandes
+// glenfe at live dot com
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// -----------------------------------------------------------
+
+#ifndef BOOST_DETAIL_DYNAMIC_BITSET_HPP
+#define BOOST_DETAIL_DYNAMIC_BITSET_HPP
+
+#include <memory>
+#include <cstddef>
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+
+
+namespace boost {
+
+  namespace detail {
+  namespace dynamic_bitset_impl {
+
+    // Gives (read-)access to the object representation
+    // of an object of type T (3.9p4). CANNOT be used
+    // on a base sub-object
+    //
+    template <typename T>
+    inline const unsigned char * object_representation (T* p)
+    {
+        return static_cast<const unsigned char *>(static_cast<const void *>(p));
+    }
+
+    template<typename T, int amount, int width /* = default */>
+    struct shifter
+    {
+        static void left_shift(T & v) {
+            amount >= width ? (v = 0)
+                : (v >>= BOOST_DYNAMIC_BITSET_WRAP_CONSTANT(amount));
+        }
+    };
+
+    // ------- count function implementation --------------
+
+    typedef unsigned char byte_type;
+
+    // These two entities
+    //
+    //     enum mode { access_by_bytes, access_by_blocks };
+    //     template <mode> struct mode_to_type {};
+    //
+    // were removed, since the regression logs (as of 24 Aug 2008)
+    // showed that several compilers had troubles with recognizing
+    //
+    //   const mode m = access_by_bytes
+    //
+    // as a constant expression
+    //
+    // * So, we'll use bool, instead of enum *.
+    //
+    template <bool value>
+    struct value_to_type
+    {
+        value_to_type() {}
+    };
+    const bool access_by_bytes = true;
+    const bool access_by_blocks = false;
+
+
+    // the table: wrapped in a class template, so
+    // that it is only instantiated if/when needed
+    //
+    template <bool dummy_name = true>
+    struct count_table { static const byte_type table[]; };
+
+    template <>
+    struct count_table<false> { /* no table */ };
+
+
+     const unsigned int table_width = 8;
+     template <bool b>
+     const byte_type count_table<b>::table[] =
+     {
+       // Automatically generated by GPTableGen.exe v.1.0
+       //
+     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+     };
+
+
+     // overload for access by bytes
+     //
+
+     template <typename Iterator>
+     inline std::size_t do_count(Iterator first, std::size_t length,
+                                 int /*dummy param*/,
+                                 value_to_type<access_by_bytes>* )
+     {
+         std::size_t num = 0;
+         if (length)
+         {
+             const byte_type * p = object_representation(&*first);
+             length *= sizeof(*first);
+
+              do {
+                 num += count_table<>::table[*p];
+                 ++p;
+                 --length;
+
+             } while (length);
+         }
+
+         return num;
+     }
+
+
+     // overload for access by blocks
+     //
+     template <typename Iterator, typename ValueType>
+     inline std::size_t do_count(Iterator first, std::size_t length, ValueType,
+                                 value_to_type<access_by_blocks>*)
+     {
+         std::size_t num = 0;
+         while (length){
+
+             ValueType value = *first;
+             while (value) {
+                 num += count_table<>::table[value & ((1u<<table_width) - 1)];
+                 value >>= table_width;
+             }
+
+             ++first;
+             --length;
+         }
+
+         return num;
+     }
+
+    // -------------------------------------------------------
+
+
+    // Some library implementations simply return a dummy
+    // value such as
+    //
+    //   size_type(-1) / sizeof(T)
+    //
+    // from vector<>::max_size. This tries to get more
+    // meaningful info.
+    //
+    template <typename T>
+    inline typename T::size_type vector_max_size_workaround(const T & v)
+        BOOST_NOEXCEPT
+    {
+        typedef typename T::allocator_type allocator_type;
+
+        const allocator_type& alloc = v.get_allocator();
+
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+        typedef std::allocator_traits<allocator_type> allocator_traits;
+
+        const typename allocator_traits::size_type alloc_max =
+            allocator_traits::max_size(alloc);
+#else
+        const typename allocator_type::size_type alloc_max = alloc.max_size();
+#endif
+
+        const typename T::size_type container_max = v.max_size();
+
+        return alloc_max < container_max ? alloc_max : container_max;
+    }
+
+    // for static_asserts
+    template <typename T>
+    struct allowed_block_type {
+        enum { value = T(-1) > 0 }; // ensure T has no sign
+    };
+
+    template <>
+    struct allowed_block_type<bool> {
+        enum { value = false };
+    };
+
+
+    template <typename T>
+    struct is_numeric {
+        enum { value = false };
+    };
+
+#   define BOOST_dynamic_bitset_is_numeric(x)       \
+                template<>                          \
+                struct is_numeric< x > {            \
+                    enum { value = true };          \
+                }                                /**/
+
+    BOOST_dynamic_bitset_is_numeric(bool);
+    BOOST_dynamic_bitset_is_numeric(char);
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+    BOOST_dynamic_bitset_is_numeric(wchar_t);
+#endif
+
+    BOOST_dynamic_bitset_is_numeric(signed char);
+    BOOST_dynamic_bitset_is_numeric(short int);
+    BOOST_dynamic_bitset_is_numeric(int);
+    BOOST_dynamic_bitset_is_numeric(long int);
+
+    BOOST_dynamic_bitset_is_numeric(unsigned char);
+    BOOST_dynamic_bitset_is_numeric(unsigned short);
+    BOOST_dynamic_bitset_is_numeric(unsigned int);
+    BOOST_dynamic_bitset_is_numeric(unsigned long);
+
+#if defined(BOOST_HAS_LONG_LONG)
+    BOOST_dynamic_bitset_is_numeric(::boost::long_long_type);
+    BOOST_dynamic_bitset_is_numeric(::boost::ulong_long_type);
+#endif
+
+    // intentionally omitted
+    //BOOST_dynamic_bitset_is_numeric(float);
+    //BOOST_dynamic_bitset_is_numeric(double);
+    //BOOST_dynamic_bitset_is_numeric(long double);
+
+#undef BOOST_dynamic_bitset_is_numeric
+
+  } // dynamic_bitset_impl
+  } // namespace detail
+
+} // namespace boost
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/detail/endian.hpp b/gatb-core/thirdparty/boost/detail/endian.hpp
new file mode 100644
index 0000000..f576c26
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/endian.hpp
@@ -0,0 +1,11 @@
+// Copyright 2013 Rene Rivera
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_ENDIAN_HPP
+#define BOOST_DETAIL_ENDIAN_HPP
+
+// Use the Predef library for the detection of endianess.
+#include <boost/predef/detail/endian_compat.h>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/fenv.hpp b/gatb-core/thirdparty/boost/detail/fenv.hpp
new file mode 100644
index 0000000..b268f5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/fenv.hpp
@@ -0,0 +1,101 @@
+/*=============================================================================
+    Copyright (c) 2010      Bryce Lelbach
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_NO_FENV_H)
+  #error This platform does not have a floating point environment
+#endif
+
+#if !defined(BOOST_DETAIL_FENV_HPP)
+#define BOOST_DETAIL_FENV_HPP
+
+/* If we're using clang + glibc, we have to get hacky.
+ * See http://llvm.org/bugs/show_bug.cgi?id=6907 */
+#if defined(__clang__)       &&  (__clang_major__ < 3) &&    \
+    defined(__GNU_LIBRARY__) && /* up to version 5 */ \
+    defined(__GLIBC__) &&         /* version 6 + */ \
+    !defined(_FENV_H)
+  #define _FENV_H
+
+  #include <features.h>
+  #include <bits/fenv.h>
+
+  extern "C" {
+    extern int fegetexceptflag (fexcept_t*, int) __THROW;
+    extern int fesetexceptflag (__const fexcept_t*, int) __THROW;
+    extern int feclearexcept (int) __THROW;
+    extern int feraiseexcept (int) __THROW;
+    extern int fetestexcept (int) __THROW;
+    extern int fegetround (void) __THROW;
+    extern int fesetround (int) __THROW;
+    extern int fegetenv (fenv_t*) __THROW;
+    extern int fesetenv (__const fenv_t*) __THROW;
+    extern int feupdateenv (__const fenv_t*) __THROW;
+    extern int feholdexcept (fenv_t*) __THROW;
+
+    #ifdef __USE_GNU
+      extern int feenableexcept (int) __THROW;
+      extern int fedisableexcept (int) __THROW;
+      extern int fegetexcept (void) __THROW;
+    #endif
+  }
+
+  namespace std { namespace tr1 {
+    using ::fenv_t;
+    using ::fexcept_t;
+    using ::fegetexceptflag;
+    using ::fesetexceptflag;
+    using ::feclearexcept;
+    using ::feraiseexcept;
+    using ::fetestexcept;
+    using ::fegetround;
+    using ::fesetround;
+    using ::fegetenv;
+    using ::fesetenv;
+    using ::feupdateenv;
+    using ::feholdexcept;
+  } }
+
+#elif defined(__MINGW32__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
+
+  // MinGW (32-bit) has a bug in mingw32/bits/c++config.h, it does not define _GLIBCXX_HAVE_FENV_H,
+  // which prevents the C fenv.h header contents to be included in the C++ wrapper header fenv.h. This is at least
+  // the case with gcc 4.8.1 packages tested so far, up to 4.8.1-4. Note that there is no issue with
+  // MinGW-w64.
+  // To work around the bug we avoid including the C++ wrapper header and include the C header directly
+  // and import all relevant symbols into std:: ourselves.
+
+  #include <../include/fenv.h>
+
+  namespace std {
+    using ::fenv_t;
+    using ::fexcept_t;
+    using ::fegetexceptflag;
+    using ::fesetexceptflag;
+    using ::feclearexcept;
+    using ::feraiseexcept;
+    using ::fetestexcept;
+    using ::fegetround;
+    using ::fesetround;
+    using ::fegetenv;
+    using ::fesetenv;
+    using ::feupdateenv;
+    using ::feholdexcept;
+  }
+
+#else /* if we're not using GNU's C stdlib, fenv.h should work with clang */
+
+  #if defined(__SUNPRO_CC) /* lol suncc */
+    #include <stdio.h>
+  #endif
+
+  #include <fenv.h>
+
+#endif
+
+#endif /* BOOST_DETAIL_FENV_HPP */
diff --git a/gatb-core/thirdparty/boost/detail/has_default_constructor.hpp b/gatb-core/thirdparty/boost/detail/has_default_constructor.hpp
new file mode 100644
index 0000000..319b30a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/has_default_constructor.hpp
@@ -0,0 +1,29 @@
+
+//  (C) Copyright Matthias Troyerk 2006.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
+#define BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_constructor.hpp>
+
+namespace boost { namespace detail {
+
+/// type trait to check for a default constructor
+///
+/// The default implementation just checks for a trivial constructor.
+/// Using some compiler magic it might be possible to provide a better default
+
+template <class T>
+struct has_default_constructor
+ : public has_trivial_constructor<T>
+{};
+
+} } // namespace boost::detail
+
+
+#endif // BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/identifier.hpp b/gatb-core/thirdparty/boost/detail/identifier.hpp
new file mode 100644
index 0000000..063d238
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/identifier.hpp
@@ -0,0 +1,87 @@
+//  boost/identifier.hpp  ----------------------------------------------------//
+
+//  Copyright Beman Dawes 2006
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See documentation at http://www.boost.org/libs/utility
+
+#ifndef BOOST_IDENTIFIER_HPP
+#define BOOST_IDENTIFIER_HPP
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <iosfwd>
+
+namespace boost
+{
+  namespace detail
+  {
+    //  class template identifier  ---------------------------------------------//
+
+    //  Always used as a base class so that different instantiations result in
+    //  different class types even if instantiated with the same value type T.
+
+    //  Expected usage is that T is often an integer type, best passed by
+    //  value. There is no reason why T can't be a possibly larger class such as
+    //  std::string, best passed by const reference.
+
+    //  This implementation uses pass by value, based on expected common uses.
+
+    template <typename T, typename D>
+    class identifier
+    {
+    public:
+      typedef T value_type;
+
+      const value_type value() const           { return m_value; }
+      void  assign( value_type v )             { m_value = v; }
+
+      bool operator==( const D & rhs ) const   { return m_value == rhs.m_value; }
+      bool operator!=( const D & rhs ) const   { return m_value != rhs.m_value; }
+      bool operator< ( const D & rhs ) const   { return m_value <  rhs.m_value; }
+      bool operator<=( const D & rhs ) const   { return m_value <= rhs.m_value; }
+      bool operator> ( const D & rhs ) const   { return m_value >  rhs.m_value; }
+      bool operator>=( const D & rhs ) const   { return m_value >= rhs.m_value; }
+
+      typedef void (*unspecified_bool_type)(D); // without the D, unspecified_bool_type 
+      static void unspecified_bool_true(D){}    // conversion allows relational operators
+                                                // between different identifier types
+
+      operator unspecified_bool_type() const   { return m_value == value_type() ? 0 : unspecified_bool_true; }
+      bool operator!() const                   { return m_value == value_type(); }
+
+    // constructors are protected so that class can only be used as a base class
+    protected:
+      identifier()                             {}
+      explicit identifier( value_type v )      : m_value(v) {}
+
+    private:
+      T m_value;
+    };
+
+  //#ifndef BOOST_NO_SFINAE
+
+  //  template <class Ostream, class Id>
+  //    typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, 
+  //      Ostream & >::type operator<<( Ostream & os, const Id & id )
+  //  {
+  //    return os << id.value();
+  //  }
+
+  //  template <class Istream, class Id>
+  //    typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, 
+  //      Istream & >::type operator>>( Istream & is, Id & id )
+  //  {
+  //    typename Id::value_type v;
+  //    is >> v;
+  //    id.value( v );
+  //    return is;
+  //  }
+  //#endif
+
+  } // namespace detail
+} // namespace boost
+
+#endif // BOOST_IDENTIFIER_HPP
diff --git a/gatb-core/thirdparty/boost/detail/indirect_traits.hpp b/gatb-core/thirdparty/boost/detail/indirect_traits.hpp
new file mode 100644
index 0000000..6294e40
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/indirect_traits.hpp
@@ -0,0 +1,204 @@
+// Copyright David Abrahams 2002.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+#ifndef INDIRECT_TRAITS_DWA2002131_HPP
+# define INDIRECT_TRAITS_DWA2002131_HPP
+# include <boost/type_traits/is_function.hpp>
+# include <boost/type_traits/is_reference.hpp>
+# include <boost/type_traits/is_pointer.hpp>
+# include <boost/type_traits/is_class.hpp>
+# include <boost/type_traits/is_const.hpp>
+# include <boost/type_traits/is_volatile.hpp>
+# include <boost/type_traits/is_member_function_pointer.hpp>
+# include <boost/type_traits/is_member_pointer.hpp>
+# include <boost/type_traits/remove_cv.hpp>
+# include <boost/type_traits/remove_reference.hpp>
+# include <boost/type_traits/remove_pointer.hpp>
+
+# include <boost/detail/workaround.hpp>
+
+# include <boost/mpl/eval_if.hpp>
+# include <boost/mpl/if.hpp>
+# include <boost/mpl/bool.hpp>
+# include <boost/mpl/and.hpp>
+# include <boost/mpl/not.hpp>
+# include <boost/mpl/aux_/lambda_support.hpp>
+
+
+namespace boost { namespace detail {
+
+namespace indirect_traits {
+
+template <class T>
+struct is_reference_to_const : mpl::false_
+{
+};
+
+template <class T>
+struct is_reference_to_const<T const&> : mpl::true_
+{
+};
+
+#   if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
+template<class T>
+struct is_reference_to_const<T const volatile&> : mpl::true_
+{
+};
+#   endif 
+
+template <class T>
+struct is_reference_to_function : mpl::false_
+{
+};
+
+template <class T>
+struct is_reference_to_function<T&> : is_function<T>
+{
+};
+
+template <class T>
+struct is_pointer_to_function : mpl::false_
+{
+};
+
+// There's no such thing as a pointer-to-cv-function, so we don't need
+// specializations for those
+template <class T>
+struct is_pointer_to_function<T*> : is_function<T>
+{
+};
+
+template <class T>
+struct is_reference_to_member_function_pointer_impl : mpl::false_
+{
+};
+
+template <class T>
+struct is_reference_to_member_function_pointer_impl<T&>
+    : is_member_function_pointer<typename remove_cv<T>::type>
+{
+};
+
+
+template <class T>
+struct is_reference_to_member_function_pointer
+    : is_reference_to_member_function_pointer_impl<T>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T))
+};
+
+template <class T>
+struct is_reference_to_function_pointer_aux
+    : mpl::and_<
+          is_reference<T>
+        , is_pointer_to_function<
+              typename remove_cv<
+                  typename remove_reference<T>::type
+              >::type
+          >
+      >
+{
+    // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those
+};
+
+template <class T>
+struct is_reference_to_function_pointer
+    : mpl::if_<
+          is_reference_to_function<T>
+        , mpl::false_
+        , is_reference_to_function_pointer_aux<T>
+     >::type
+{
+};
+
+template <class T>
+struct is_reference_to_non_const
+    : mpl::and_<
+          is_reference<T>
+        , mpl::not_<
+             is_reference_to_const<T>
+          >
+      >
+{
+};
+
+template <class T>
+struct is_reference_to_volatile : mpl::false_
+{
+};
+
+template <class T>
+struct is_reference_to_volatile<T volatile&> : mpl::true_
+{
+};
+
+#   if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
+template <class T>
+struct is_reference_to_volatile<T const volatile&> : mpl::true_
+{
+};
+#   endif 
+
+
+template <class T>
+struct is_reference_to_pointer : mpl::false_
+{
+};
+
+template <class T>
+struct is_reference_to_pointer<T*&> : mpl::true_
+{
+};
+
+template <class T>
+struct is_reference_to_pointer<T* const&> : mpl::true_
+{
+};
+
+template <class T>
+struct is_reference_to_pointer<T* volatile&> : mpl::true_
+{
+};
+
+template <class T>
+struct is_reference_to_pointer<T* const volatile&> : mpl::true_
+{
+};
+
+template <class T>
+struct is_reference_to_class
+    : mpl::and_<
+          is_reference<T>
+        , is_class<
+              typename remove_cv<
+                  typename remove_reference<T>::type
+              >::type
+          >
+      >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T))
+};
+
+template <class T>
+struct is_pointer_to_class
+    : mpl::and_<
+          is_pointer<T>
+        , is_class<
+              typename remove_cv<
+                  typename remove_pointer<T>::type
+              >::type
+          >
+      >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T))
+};
+
+
+}
+
+using namespace indirect_traits;
+
+}} // namespace boost::python::detail
+
+#endif // INDIRECT_TRAITS_DWA2002131_HPP
diff --git a/gatb-core/thirdparty/boost/detail/interlocked.hpp b/gatb-core/thirdparty/boost/detail/interlocked.hpp
new file mode 100644
index 0000000..2c91ce2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/interlocked.hpp
@@ -0,0 +1,218 @@
+#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
+#define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
+
+//
+//  boost/detail/interlocked.hpp
+//
+//  Copyright 2005 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/config.hpp>
+
+// MS compatible compilers support #pragma once
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+# include <windows.h>
+
+# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer
+# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer
+
+#elif defined( BOOST_USE_INTRIN_H )
+
+#include <intrin.h>
+
+# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+# if defined(_M_IA64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__x86_64)
+
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
+
+# else
+
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
+    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
+    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
+
+# endif
+
+#elif defined(_WIN32_WCE)
+
+#if _WIN32_WCE >= 0x600
+
+extern "C" long __cdecl _InterlockedIncrement( long volatile * );
+extern "C" long __cdecl _InterlockedDecrement( long volatile * );
+extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
+extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
+extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
+
+# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+#else
+// under Windows CE we still have old-style Interlocked* functions
+
+extern "C" long __cdecl InterlockedIncrement( long* );
+extern "C" long __cdecl InterlockedDecrement( long* );
+extern "C" long __cdecl InterlockedCompareExchange( long*, long, long );
+extern "C" long __cdecl InterlockedExchange( long*, long );
+extern "C" long __cdecl InterlockedExchangeAdd( long*, long );
+
+# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
+
+#endif
+
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
+    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare)))
+# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
+    ((void*)BOOST_INTERLOCKED_EXCHANGE((long*)(dest),(long)(exchange)))
+
+#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
+
+#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1400
+
+#include <intrin.h>
+
+#else
+
+# if defined( __CLRCALL_PURE_OR_CDECL )
+#  define BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL __CLRCALL_PURE_OR_CDECL
+# else
+#  define BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL __cdecl
+# endif
+
+extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * );
+extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * );
+extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long );
+extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long );
+extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long );
+
+# undef BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL
+
+# if defined( BOOST_MSVC ) && BOOST_MSVC >= 1310
+#  pragma intrinsic( _InterlockedIncrement )
+#  pragma intrinsic( _InterlockedDecrement )
+#  pragma intrinsic( _InterlockedCompareExchange )
+#  pragma intrinsic( _InterlockedExchange )
+#  pragma intrinsic( _InterlockedExchangeAdd )
+# endif
+
+#endif
+
+# if defined(_M_IA64) || defined(_M_AMD64)
+
+extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* );
+extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* );
+
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
+
+# else
+
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
+    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
+    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
+
+# endif
+
+# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets.
+#elif defined(__MINGW64_VERSION_MAJOR)
+
+// MinGW-w64 provides intrin.h for both 32 and 64-bit targets.
+#include <intrin.h>
+
+# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+# if defined(__x86_64__) || defined(__x86_64)
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
+# else
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
+    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
+    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
+# endif
+
+#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
+
+#define BOOST_INTERLOCKED_IMPORT __declspec(dllimport)
+
+namespace boost
+{
+
+namespace detail
+{
+
+extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedIncrement( long volatile * );
+extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedDecrement( long volatile * );
+extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedCompareExchange( long volatile *, long, long );
+extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedExchange( long volatile *, long );
+extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedExchangeAdd( long volatile *, long );
+
+# if defined(_M_IA64) || defined(_M_AMD64)
+extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedCompareExchangePointer( void* volatile *, void*, void* );
+extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedExchangePointer( void* volatile *, void* );
+# endif
+
+} // namespace detail
+
+} // namespace boost
+
+# define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement
+# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
+# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
+# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
+# define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd
+
+# if defined(_M_IA64) || defined(_M_AMD64)
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER ::boost::detail::InterlockedCompareExchangePointer
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER ::boost::detail::InterlockedExchangePointer
+# else
+#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
+    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
+#  define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
+    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
+# endif
+
+#else
+
+# error "Interlocked intrinsics not available"
+
+#endif
+
+#endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/is_incrementable.hpp b/gatb-core/thirdparty/boost/detail/is_incrementable.hpp
new file mode 100644
index 0000000..88ddb14
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/is_incrementable.hpp
@@ -0,0 +1,133 @@
+// Copyright David Abrahams 2004. Use, modification and distribution is
+// subject to the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef IS_INCREMENTABLE_DWA200415_HPP
+# define IS_INCREMENTABLE_DWA200415_HPP
+
+# include <boost/type_traits/detail/template_arity_spec.hpp>
+# include <boost/type_traits/remove_cv.hpp>
+# include <boost/mpl/aux_/lambda_support.hpp>
+# include <boost/mpl/bool.hpp>
+# include <boost/detail/workaround.hpp>
+
+// Must be the last include
+# include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost { namespace detail { 
+
+// is_incrementable<T> metafunction
+//
+// Requires: Given x of type T&, if the expression ++x is well-formed
+// it must have complete type; otherwise, it must neither be ambiguous
+// nor violate access.
+
+// This namespace ensures that ADL doesn't mess things up.
+namespace is_incrementable_
+{
+  // a type returned from operator++ when no increment is found in the
+  // type's own namespace
+  struct tag {};
+  
+  // any soaks up implicit conversions and makes the following
+  // operator++ less-preferred than any other such operator that
+  // might be found via ADL.
+  struct any { template <class T> any(T const&); };
+
+  // This is a last-resort operator++ for when none other is found
+# if BOOST_WORKAROUND(__GNUC__, == 4) && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
+  
+}
+
+namespace is_incrementable_2
+{
+  is_incrementable_::tag operator++(is_incrementable_::any const&);
+  is_incrementable_::tag operator++(is_incrementable_::any const&,int);
+}
+using namespace is_incrementable_2;
+
+namespace is_incrementable_
+{
+  
+# else
+  
+  tag operator++(any const&);
+  tag operator++(any const&,int);
+  
+# endif 
+
+# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) 
+#  define BOOST_comma(a,b) (a)
+# else 
+  // In case an operator++ is found that returns void, we'll use ++x,0
+  tag operator,(tag,int);  
+#  define BOOST_comma(a,b) (a,b)
+# endif 
+
+# if defined(BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning(disable:4913) // Warning about operator,
+# endif 
+
+  // two check overloads help us identify which operator++ was picked
+  char (& check_(tag) )[2];
+  
+  template <class T>
+  char check_(T const&);
+  
+
+  template <class T>
+  struct impl
+  {
+      static typename boost::remove_cv<T>::type& x;
+
+      BOOST_STATIC_CONSTANT(
+          bool
+        , value = sizeof(is_incrementable_::check_(BOOST_comma(++x,0))) == 1
+      );
+  };
+
+  template <class T>
+  struct postfix_impl
+  {
+      static typename boost::remove_cv<T>::type& x;
+
+      BOOST_STATIC_CONSTANT(
+          bool
+        , value = sizeof(is_incrementable_::check_(BOOST_comma(x++,0))) == 1
+      );
+  };
+
+# if defined(BOOST_MSVC)
+#  pragma warning(pop)
+# endif 
+
+}
+
+# undef BOOST_comma
+
+template<typename T> 
+struct is_incrementable 
+BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl<T>::value)
+{ 
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl<T>::value)
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T))
+};
+
+template<typename T> 
+struct is_postfix_incrementable 
+BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::postfix_impl<T>::value)
+{ 
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl<T>::value)
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T))
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_incrementable)
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable)
+
+} // namespace boost
+
+# include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // IS_INCREMENTABLE_DWA200415_HPP
diff --git a/gatb-core/thirdparty/boost/detail/is_sorted.hpp b/gatb-core/thirdparty/boost/detail/is_sorted.hpp
new file mode 100644
index 0000000..5ab32e5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/is_sorted.hpp
@@ -0,0 +1,56 @@
+/*==============================================================================
+    Copyright (c) 2010-2011 Bryce Lelbach
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_DETAIL_SORTED_HPP
+#define BOOST_DETAIL_SORTED_HPP
+
+#include <boost/detail/iterator.hpp>
+
+#include <functional>
+
+namespace boost {
+namespace detail {
+
+template<class Iterator, class Comp>
+inline Iterator is_sorted_until (Iterator first, Iterator last, Comp c) {
+  if (first == last)
+    return last;
+
+  Iterator it = first; ++it;
+
+  for (; it != last; first = it, ++it)
+    if (c(*it, *first))
+      return it;
+
+  return it;
+}
+
+template<class Iterator>
+inline Iterator is_sorted_until (Iterator first, Iterator last) {
+  typedef typename boost::detail::iterator_traits<Iterator>::value_type
+    value_type;
+
+  typedef std::less<value_type> c; 
+
+  return ::boost::detail::is_sorted_until(first, last, c()); 
+}
+
+template<class Iterator, class Comp>
+inline bool is_sorted (Iterator first, Iterator last, Comp c) {
+  return ::boost::detail::is_sorted_until(first, last, c) == last;
+} 
+
+template<class Iterator>
+inline bool is_sorted (Iterator first, Iterator last) {
+  return ::boost::detail::is_sorted_until(first, last) == last;
+} 
+
+} // detail
+} // boost
+
+#endif // BOOST_DETAIL_SORTED_HPP
+
diff --git a/gatb-core/thirdparty/boost/detail/is_xxx.hpp b/gatb-core/thirdparty/boost/detail/is_xxx.hpp
new file mode 100644
index 0000000..3f9a126
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/is_xxx.hpp
@@ -0,0 +1,27 @@
+// Copyright David Abrahams 2005. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_DETAIL_IS_XXX_DWA20051011_HPP
+# define BOOST_DETAIL_IS_XXX_DWA20051011_HPP
+
+# include <boost/config.hpp>
+# include <boost/mpl/bool.hpp>
+# include <boost/preprocessor/enum_params.hpp>
+
+
+#  define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs)  \
+template <class T>                                              \
+struct is_##name : mpl::false_                                  \
+{                                                               \
+};                                                              \
+                                                                \
+template < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class T) >          \
+struct is_##name<                                               \
+   qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, T) >        \
+>                                                               \
+   : mpl::true_                                                 \
+{                                                               \
+};
+
+
+#endif // BOOST_DETAIL_IS_XXX_DWA20051011_HPP
diff --git a/gatb-core/thirdparty/boost/detail/iterator.hpp b/gatb-core/thirdparty/boost/detail/iterator.hpp
new file mode 100644
index 0000000..c2e8f1e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/iterator.hpp
@@ -0,0 +1,26 @@
+// (C) Copyright David Abrahams 2002.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef ITERATOR_DWA122600_HPP_
+#define ITERATOR_DWA122600_HPP_
+
+// This header is obsolete and will be deprecated.
+
+#include <iterator>
+
+namespace boost
+{
+
+namespace detail
+{
+
+using std::iterator_traits;
+using std::distance;
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // ITERATOR_DWA122600_HPP_
diff --git a/gatb-core/thirdparty/boost/detail/lcast_precision.hpp b/gatb-core/thirdparty/boost/detail/lcast_precision.hpp
new file mode 100644
index 0000000..93abce1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lcast_precision.hpp
@@ -0,0 +1,184 @@
+// Copyright Alexander Nasonov & Paul A. Bristow 2006.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED
+#define BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED
+
+#include <climits>
+#include <ios>
+#include <limits>
+
+#include <boost/config.hpp>
+#include <boost/integer_traits.hpp>
+
+#ifndef BOOST_NO_IS_ABSTRACT
+// Fix for SF:1358600 - lexical_cast & pure virtual functions & VC 8 STL
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_abstract.hpp>
+#endif
+
+#if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) || \
+  (defined(BOOST_MSVC) && (BOOST_MSVC<1310))
+
+#define BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+#endif
+
+#ifdef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+#include <boost/assert.hpp>
+#else
+#include <boost/static_assert.hpp>
+#endif
+
+namespace boost { namespace detail {
+
+class lcast_abstract_stub {};
+
+#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+// Calculate an argument to pass to std::ios_base::precision from
+// lexical_cast. See alternative implementation for broken standard
+// libraries in lcast_get_precision below. Keep them in sync, please.
+template<class T>
+struct lcast_precision
+{
+#ifdef BOOST_NO_IS_ABSTRACT
+    typedef std::numeric_limits<T> limits; // No fix for SF:1358600.
+#else
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+        boost::is_abstract<T>
+      , std::numeric_limits<lcast_abstract_stub>
+      , std::numeric_limits<T>
+      >::type limits;
+#endif
+
+    BOOST_STATIC_CONSTANT(bool, use_default_precision =
+            !limits::is_specialized || limits::is_exact
+        );
+
+    BOOST_STATIC_CONSTANT(bool, is_specialized_bin =
+            !use_default_precision &&
+            limits::radix == 2 && limits::digits > 0
+        );
+
+    BOOST_STATIC_CONSTANT(bool, is_specialized_dec =
+            !use_default_precision &&
+            limits::radix == 10 && limits::digits10 > 0
+        );
+
+    BOOST_STATIC_CONSTANT(std::streamsize, streamsize_max =
+            boost::integer_traits<std::streamsize>::const_max
+        );
+
+    BOOST_STATIC_CONSTANT(unsigned int, precision_dec = limits::digits10 + 1U);
+
+    BOOST_STATIC_ASSERT(!is_specialized_dec ||
+            precision_dec <= streamsize_max + 0UL
+        );
+
+    BOOST_STATIC_CONSTANT(unsigned long, precision_bin =
+            2UL + limits::digits * 30103UL / 100000UL
+        );
+
+    BOOST_STATIC_ASSERT(!is_specialized_bin ||
+            (limits::digits + 0UL < ULONG_MAX / 30103UL &&
+            precision_bin > limits::digits10 + 0UL &&
+            precision_bin <= streamsize_max + 0UL)
+        );
+
+    BOOST_STATIC_CONSTANT(std::streamsize, value =
+            is_specialized_bin ? precision_bin
+                               : is_specialized_dec ? precision_dec : 6
+        );
+};
+#endif
+
+template<class T>
+inline std::streamsize lcast_get_precision(T* = 0)
+{
+#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+    return lcast_precision<T>::value;
+#else // Follow lcast_precision algorithm at run-time:
+
+#ifdef BOOST_NO_IS_ABSTRACT
+    typedef std::numeric_limits<T> limits; // No fix for SF:1358600.
+#else
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+        boost::is_abstract<T>
+      , std::numeric_limits<lcast_abstract_stub>
+      , std::numeric_limits<T>
+      >::type limits;
+#endif
+
+    bool const use_default_precision =
+        !limits::is_specialized || limits::is_exact;
+
+    if(!use_default_precision)
+    { // Includes all built-in floating-point types, float, double ...
+      // and UDT types for which digits (significand bits) is defined (not zero)
+
+        bool const is_specialized_bin =
+            limits::radix == 2 && limits::digits > 0;
+        bool const is_specialized_dec =
+            limits::radix == 10 && limits::digits10 > 0;
+        std::streamsize const streamsize_max =
+            (boost::integer_traits<std::streamsize>::max)();
+
+        if(is_specialized_bin)
+        { // Floating-point types with
+          // limits::digits defined by the specialization.
+
+            unsigned long const digits = limits::digits;
+            unsigned long const precision = 2UL + digits * 30103UL / 100000UL;
+            // unsigned long is selected because it is at least 32-bits
+            // and thus ULONG_MAX / 30103UL is big enough for all types.
+            BOOST_ASSERT(
+                    digits < ULONG_MAX / 30103UL &&
+                    precision > limits::digits10 + 0UL &&
+                    precision <= streamsize_max + 0UL
+                );
+            return precision;
+        }
+        else if(is_specialized_dec)
+        {   // Decimal Floating-point type, most likely a User Defined Type
+            // rather than a real floating-point hardware type.
+            unsigned int const precision = limits::digits10 + 1U;
+            BOOST_ASSERT(precision <= streamsize_max + 0UL);
+            return precision;
+        }
+    }
+
+    // Integral type (for which precision has no effect)
+    // or type T for which limits is NOT specialized,
+    // so assume stream precision remains the default 6 decimal digits.
+    // Warning: if your User-defined Floating-point type T is NOT specialized,
+    // then you may lose accuracy by only using 6 decimal digits.
+    // To avoid this, you need to specialize T with either
+    // radix == 2 and digits == the number of significand bits,
+    // OR
+    // radix = 10 and digits10 == the number of decimal digits.
+
+    return 6;
+#endif
+}
+
+template<class T>
+inline void lcast_set_precision(std::ios_base& stream, T*)
+{
+    stream.precision(lcast_get_precision<T>());
+}
+
+template<class Source, class Target>
+inline void lcast_set_precision(std::ios_base& stream, Source*, Target*)
+{
+    std::streamsize const s = lcast_get_precision(static_cast<Source*>(0));
+    std::streamsize const t = lcast_get_precision(static_cast<Target*>(0));
+    stream.precision(s > t ? s : t);
+}
+
+}}
+
+#endif //  BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/detail/lightweight_main.hpp b/gatb-core/thirdparty/boost/detail/lightweight_main.hpp
new file mode 100644
index 0000000..1705309
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lightweight_main.hpp
@@ -0,0 +1,36 @@
+//  boost/detail/lightweight_main.hpp  -------------------------------------------------//
+
+//  Copyright Beman Dawes 2010
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#include <iostream>
+#include <exception>
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//                exception reporting main() that calls cpp_main()                      //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+
+int cpp_main(int argc, char* argv[]);
+
+int main(int argc, char* argv[])
+{
+  try
+  {
+    return cpp_main(argc, argv);
+  }
+
+  catch (const std::exception& ex)
+  {
+    std::cout
+    << "\nERROR  ERROR  ERROR  ERROR  ERROR  ERROR  ERROR  ERROR  ERROR  ERROR  ERROR\n"
+    << "\n****************************** std::exception *****************************\n"
+    << ex.what()
+    << "\n***************************************************************************\n"
+    << std::endl;
+  }
+  return 1;
+}
diff --git a/gatb-core/thirdparty/boost/detail/lightweight_mutex.hpp b/gatb-core/thirdparty/boost/detail/lightweight_mutex.hpp
new file mode 100644
index 0000000..b7a7f6d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lightweight_mutex.hpp
@@ -0,0 +1,22 @@
+#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/lightweight_mutex.hpp - lightweight mutex
+//
+//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
+
+#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/lightweight_test.hpp b/gatb-core/thirdparty/boost/detail/lightweight_test.hpp
new file mode 100644
index 0000000..9fece8a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lightweight_test.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP
+#define BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/lightweight_test.hpp instead.
+
+#include <boost/core/lightweight_test.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/lightweight_test_report.hpp b/gatb-core/thirdparty/boost/detail/lightweight_test_report.hpp
new file mode 100644
index 0000000..1511ba9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lightweight_test_report.hpp
@@ -0,0 +1,56 @@
+//  boost/detail/lightweight_test_reporter.hpp  ----------------------------------------//
+
+//  Copyright Beman Dawes 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//                         Configuration reporting cpp_main()                           //
+//                                                                                      //
+//  Displays configuration information, then returns test_main(argc, argv), which       //
+//  must be supplied by the user.                                                       //
+//                                                                                      //
+//  Note: cpp_main(argc, argv) is called from a try block in main(), which is           //
+//  supplied by <boost/detail/lightweight_main.hpp> as is a catch block that reports    //
+//  std::exception what().                                                              //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+
+#include <boost/config.hpp>
+#include <boost/version.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/detail/lightweight_main.hpp>
+#include <iostream>
+
+int test_main(int argc, char* argv[]);
+
+int cpp_main(int argc, char* argv[])
+{
+  std::cout << BOOST_COMPILER
+#ifdef __GNUC__
+            << ", __GXX_EXPERIMENTAL_CXX0X__ "
+# ifdef __GXX_EXPERIMENTAL_CXX0X__
+              "defined"
+# else
+              "not defined"
+# endif
+#endif
+            << "\n"
+            << BOOST_STDLIB << "\n"
+            << BOOST_PLATFORM << "\n"
+            << "Boost version " << BOOST_VERSION / 100000 << '.'
+            << BOOST_VERSION / 100 % 1000 << '.' << BOOST_VERSION % 100 << "\n";
+
+  std::cout << "Command line: ";
+  for (int a = 0; a < argc; ++a)
+  {
+    std::cout << argv[a];
+    if (a != argc - 1)
+      std::cout << ' ';
+  }
+  std::cout << std::endl;
+
+  return test_main(argc, argv);
+}
\ No newline at end of file
diff --git a/gatb-core/thirdparty/boost/detail/lightweight_thread.hpp b/gatb-core/thirdparty/boost/detail/lightweight_thread.hpp
new file mode 100644
index 0000000..6fe70a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/lightweight_thread.hpp
@@ -0,0 +1,135 @@
+#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
+#define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  boost/detail/lightweight_thread.hpp
+//
+//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//  Copyright (c) 2008 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/config.hpp>
+#include <memory>
+#include <cerrno>
+
+// pthread_create, pthread_join
+
+#if defined( BOOST_HAS_PTHREADS )
+
+#include <pthread.h>
+
+#else
+
+#include <windows.h>
+#include <process.h>
+
+typedef HANDLE pthread_t;
+
+int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg )
+{
+    HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
+
+    if( h != 0 )
+    {
+        *thread = h;
+        return 0;
+    }
+    else
+    {
+        return EAGAIN;
+    }
+}
+
+int pthread_join( pthread_t thread, void ** /*value_ptr*/ )
+{
+    ::WaitForSingleObject( thread, INFINITE );
+    ::CloseHandle( thread );
+    return 0;
+}
+
+#endif
+
+// template<class F> int lw_thread_create( pthread_t & pt, F f );
+
+namespace boost
+{
+
+namespace detail
+{
+
+class lw_abstract_thread
+{
+public:
+
+    virtual ~lw_abstract_thread() {}
+    virtual void run() = 0;
+};
+
+#if defined( BOOST_HAS_PTHREADS )
+
+extern "C" void * lw_thread_routine( void * pv )
+{
+    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
+
+    pt->run();
+
+    return 0;
+}
+
+#else
+
+unsigned __stdcall lw_thread_routine( void * pv )
+{
+    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
+
+    pt->run();
+
+    return 0;
+}
+
+#endif
+
+template<class F> class lw_thread_impl: public lw_abstract_thread
+{
+public:
+
+    explicit lw_thread_impl( F f ): f_( f )
+    {
+    }
+
+    void run()
+    {
+        f_();
+    }
+
+private:
+
+    F f_;
+};
+
+template<class F> int lw_thread_create( pthread_t & pt, F f )
+{
+    std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) );
+
+    int r = pthread_create( &pt, 0, lw_thread_routine, p.get() );
+
+    if( r == 0 )
+    {
+        p.release();
+    }
+
+    return r;
+}
+
+} // namespace detail
+} // namespace boost
+
+#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/named_template_params.hpp b/gatb-core/thirdparty/boost/detail/named_template_params.hpp
new file mode 100644
index 0000000..e7cb079
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/named_template_params.hpp
@@ -0,0 +1,177 @@
+// (C) Copyright Jeremy Siek 2001.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Revision History:
+
+// 04 Oct 2001   David Abrahams
+//      Changed name of "bind" to "select" to avoid problems with MSVC.
+
+#ifndef BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP
+#define BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP
+
+#include <boost/type_traits/conversion_traits.hpp>
+#include <boost/type_traits/composite_traits.hpp> // for is_reference
+#if defined(__BORLANDC__)
+#include <boost/type_traits/ice.hpp>
+#endif
+
+namespace boost {
+  namespace detail {
+    
+    struct default_argument { };
+
+    struct dummy_default_gen {
+      template <class Base, class Traits>
+      struct select {
+        typedef default_argument type;
+      };
+    };
+
+   // This class template is a workaround for MSVC.
+   template <class Gen> struct default_generator {
+     typedef detail::dummy_default_gen type;
+   };
+
+    template <class T> struct is_default { 
+      enum { value = false };  
+      typedef type_traits::no_type type;
+    };
+    template <> struct is_default<default_argument> { 
+      enum { value = true }; 
+      typedef type_traits::yes_type type;
+    };
+
+    struct choose_default {
+      template <class Arg, class DefaultGen, class Base, class Traits>
+      struct select {
+        typedef typename default_generator<DefaultGen>::type Gen;
+        typedef typename Gen::template select<Base,Traits>::type type;
+      };
+    };
+    struct choose_arg {
+      template <class Arg, class DefaultGen, class Base, class Traits>
+      struct select {
+        typedef Arg type;
+      };
+    };
+
+#if defined(__BORLANDC__)
+    template <class UseDefault>
+    struct choose_arg_or_default { typedef choose_arg type; };
+    template <>
+    struct choose_arg_or_default<type_traits::yes_type> {
+      typedef choose_default type;
+    };
+#else
+    template <bool UseDefault>
+    struct choose_arg_or_default { typedef choose_arg type; };
+    template <>
+    struct choose_arg_or_default<true> {
+      typedef choose_default type;
+    };
+#endif
+    
+    template <class Arg, class DefaultGen, class Base, class Traits>
+    class resolve_default {
+#if defined(__BORLANDC__)
+      typedef typename choose_arg_or_default<typename is_default<Arg>::type>::type Selector;
+#else
+      // This usually works for Borland, but I'm seeing weird errors in
+      // iterator_adaptor_test.cpp when using this method.
+      enum { is_def = is_default<Arg>::value };
+      typedef typename choose_arg_or_default<is_def>::type Selector;
+#endif
+    public:
+      typedef typename Selector
+        ::template select<Arg, DefaultGen, Base, Traits>::type type;
+    };
+
+    // To differentiate an unnamed parameter from a traits generator
+    // we use is_convertible<X, iter_traits_gen_base>.
+    struct named_template_param_base { };
+
+    template <class X>
+    struct is_named_param_list {
+      enum { value  = is_convertible<X, named_template_param_base>::value };
+    };
+    
+    struct choose_named_params {
+      template <class Prev> struct select { typedef Prev type; };
+    };
+    struct choose_default_arg {
+      template <class Prev> struct select { 
+        typedef detail::default_argument type;
+      };
+    };
+
+    template <bool Named> struct choose_default_dispatch_;
+    template <> struct choose_default_dispatch_<true> {
+      typedef choose_named_params type;
+    };
+    template <> struct choose_default_dispatch_<false> {
+      typedef choose_default_arg type;
+    };
+    // The use of inheritance here is a Solaris Forte 6 workaround.
+    template <bool Named> struct choose_default_dispatch
+      : public choose_default_dispatch_<Named> { };
+
+    template <class PreviousArg>
+    struct choose_default_argument {
+      enum { is_named = is_named_param_list<PreviousArg>::value };
+      typedef typename choose_default_dispatch<is_named>::type Selector;
+      typedef typename Selector::template select<PreviousArg>::type type;
+    };
+
+    // This macro assumes that there is a class named default_##TYPE
+    // defined before the application of the macro.  This class should
+    // have a single member class template named "select" with two
+    // template parameters: the type of the class being created (e.g.,
+    // the iterator_adaptor type when creating iterator adaptors) and
+    // a traits class. The select class should have a single typedef
+    // named "type" that produces the default for TYPE.  See
+    // boost/iterator_adaptors.hpp for an example usage.  Also,
+    // applications of this macro must be placed in namespace
+    // boost::detail.
+
+#define BOOST_NAMED_TEMPLATE_PARAM(TYPE) \
+    struct get_##TYPE##_from_named { \
+      template <class Base, class NamedParams, class Traits> \
+      struct select { \
+          typedef typename NamedParams::traits NamedTraits; \
+          typedef typename NamedTraits::TYPE TYPE; \
+          typedef typename resolve_default<TYPE, \
+            default_##TYPE, Base, NamedTraits>::type type; \
+      }; \
+    }; \
+    struct pass_thru_##TYPE { \
+      template <class Base, class Arg, class Traits> struct select { \
+          typedef typename resolve_default<Arg, \
+            default_##TYPE, Base, Traits>::type type; \
+      };\
+    }; \
+    template <int NamedParam> \
+    struct get_##TYPE##_dispatch { }; \
+    template <> struct get_##TYPE##_dispatch<1> { \
+      typedef get_##TYPE##_from_named type; \
+    }; \
+    template <> struct get_##TYPE##_dispatch<0> { \
+      typedef pass_thru_##TYPE type; \
+    }; \
+    template <class Base, class X, class Traits>  \
+    class get_##TYPE { \
+      enum { is_named = is_named_param_list<X>::value }; \
+      typedef typename get_##TYPE##_dispatch<is_named>::type Selector; \
+    public: \
+      typedef typename Selector::template select<Base, X, Traits>::type type; \
+    }; \
+    template <> struct default_generator<default_##TYPE> { \
+      typedef default_##TYPE type; \
+    }
+
+    
+  } // namespace detail
+} // namespace boost
+
+#endif // BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/no_exceptions_support.hpp b/gatb-core/thirdparty/boost/detail/no_exceptions_support.hpp
new file mode 100644
index 0000000..7d17454
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/no_exceptions_support.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP
+#define BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/no_exceptions_support.hpp instead.
+
+#include <boost/core/no_exceptions_support.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/numeric_traits.hpp b/gatb-core/thirdparty/boost/detail/numeric_traits.hpp
new file mode 100644
index 0000000..2f97ebf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/numeric_traits.hpp
@@ -0,0 +1,182 @@
+// (C) Copyright David Abrahams 2001, Howard Hinnant 2001.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// Template class numeric_traits<Number> --
+//
+//    Supplies:
+//
+//      typedef difference_type -- a type used to represent the difference
+//      between any two values of Number.
+//
+//    Support:
+//      1. Not all specializations are supplied
+//
+//      2. Use of specializations that are not supplied will cause a
+//      compile-time error
+//
+//      3. Users are free to specialize numeric_traits for any type.
+//
+//      4. Right now, specializations are only supplied for integer types.
+//
+//      5. On implementations which do not supply compile-time constants in
+//      std::numeric_limits<>, only specializations for built-in integer types
+//      are supplied.
+//
+//      6. Handling of numbers whose range of representation is at least as
+//      great as boost::intmax_t can cause some differences to be
+//      unrepresentable in difference_type:
+//
+//        Number    difference_type
+//        ------    ---------------
+//        signed    Number
+//        unsigned  intmax_t
+//
+// template <class Number> typename numeric_traits<Number>::difference_type
+// numeric_distance(Number x, Number y)
+//    computes (y - x), attempting to avoid overflows.
+//
+
+// See http://www.boost.org for most recent version including documentation.
+
+// Revision History
+// 11 Feb 2001 - Use BOOST_STATIC_CONSTANT (David Abrahams)
+// 11 Feb 2001 - Rolled back ineffective Borland-specific code
+//               (David Abrahams)
+// 10 Feb 2001 - Rolled in supposed Borland fixes from John Maddock, but
+//               not seeing any improvement yet (David Abrahams)
+// 06 Feb 2001 - Factored if_true out into boost/detail/select_type.hpp
+//               (David Abrahams)
+// 23 Jan 2001 - Fixed logic of difference_type selection, which was
+//               completely wack. In the process, added digit_traits<>
+//               to compute the number of digits in intmax_t even when
+//               not supplied by numeric_limits<>. (David Abrahams)
+// 21 Jan 2001 - Created (David Abrahams)
+
+#ifndef BOOST_NUMERIC_TRAITS_HPP_DWA20001901
+# define BOOST_NUMERIC_TRAITS_HPP_DWA20001901
+
+# include <boost/config.hpp>
+# include <boost/cstdint.hpp>
+# include <boost/static_assert.hpp>
+# include <boost/type_traits.hpp>
+# include <boost/detail/select_type.hpp>
+# include <boost/limits.hpp>
+
+namespace boost { namespace detail {
+
+  // Template class is_signed -- determine whether a numeric type is signed
+  // Requires that T is constructable from the literals -1 and 0.  Compile-time
+  // error results if that requirement is not met (and thus signedness is not
+  // likely to have meaning for that type).
+  template <class Number>
+  struct is_signed
+  {
+#if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
+    BOOST_STATIC_CONSTANT(bool, value = (Number(-1) < Number(0)));
+#else
+    BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits<Number>::is_signed);
+#endif
+  };
+
+# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+  // digit_traits - compute the number of digits in a built-in integer
+  // type. Needed for implementations on which numeric_limits is not specialized
+  // for intmax_t (e.g. VC6).
+  template <bool is_specialized> struct digit_traits_select;
+
+  // numeric_limits is specialized; just select that version of digits
+  template <> struct digit_traits_select<true>
+  {
+      template <class T> struct traits
+      {
+          BOOST_STATIC_CONSTANT(int, digits = std::numeric_limits<T>::digits);
+      };
+  };
+
+  // numeric_limits is not specialized; compute digits from sizeof(T)
+  template <> struct digit_traits_select<false>
+  {
+      template <class T> struct traits
+      {
+          BOOST_STATIC_CONSTANT(int, digits = (
+              sizeof(T) * std::numeric_limits<unsigned char>::digits
+              - (is_signed<T>::value ? 1 : 0))
+              );
+      };
+  };
+
+  // here's the "usable" template
+  template <class T> struct digit_traits
+  {
+      typedef digit_traits_select<
+                ::std::numeric_limits<T>::is_specialized> selector;
+      typedef typename selector::template traits<T> traits;
+      BOOST_STATIC_CONSTANT(int, digits = traits::digits);
+  };
+#endif
+
+  // Template class integer_traits<Integer> -- traits of various integer types
+  // This should probably be rolled into boost::integer_traits one day, but I
+  // need it to work without <limits>
+  template <class Integer>
+  struct integer_traits
+  {
+# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   private:
+      typedef Integer integer_type;
+      typedef std::numeric_limits<integer_type> x;
+   public:
+      typedef typename
+      if_true<(int(x::is_signed)
+              && (!int(x::is_bounded)
+                 // digits is the number of no-sign bits
+                  || (int(x::digits) + 1 >= digit_traits<boost::intmax_t>::digits)))>::template then<
+        Integer,
+          
+      typename if_true<(int(x::digits) + 1 < digit_traits<signed int>::digits)>::template then<
+        signed int,
+
+      typename if_true<(int(x::digits) + 1 < digit_traits<signed long>::digits)>::template then<
+        signed long,
+
+   // else
+        intmax_t
+      >::type>::type>::type difference_type;
+#else
+      BOOST_STATIC_ASSERT(boost::is_integral<Integer>::value);
+
+      typedef typename
+      if_true<(sizeof(Integer) >= sizeof(intmax_t))>::template then<
+               
+        typename if_true<(is_signed<Integer>::value)>::template then<
+          Integer,
+          intmax_t
+        >::type,
+
+        typename if_true<(sizeof(Integer) < sizeof(std::ptrdiff_t))>::template then<
+          std::ptrdiff_t,
+          intmax_t
+        >::type
+      >::type difference_type;
+# endif
+  };
+
+  // Right now, only supports integers, but should be expanded.
+  template <class Number>
+  struct numeric_traits
+  {
+      typedef typename integer_traits<Number>::difference_type difference_type;
+  };
+
+  template <class Number>
+  typename numeric_traits<Number>::difference_type numeric_distance(Number x, Number y)
+  {
+      typedef typename numeric_traits<Number>::difference_type difference_type;
+      return difference_type(y) - difference_type(x);
+  }
+}}
+
+#endif // BOOST_NUMERIC_TRAITS_HPP_DWA20001901
diff --git a/gatb-core/thirdparty/boost/detail/ob_compressed_pair.hpp b/gatb-core/thirdparty/boost/detail/ob_compressed_pair.hpp
new file mode 100644
index 0000000..326e454
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/ob_compressed_pair.hpp
@@ -0,0 +1,499 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/utility for most recent version including documentation.
+//  see libs/utility/compressed_pair.hpp
+//
+/* Release notes:
+   20 Jan 2001:
+        Fixed obvious bugs (David Abrahams)
+   07 Oct 2000:
+      Added better single argument constructor support.
+   03 Oct 2000:
+      Added VC6 support (JM).
+   23rd July 2000:
+      Additional comments added. (JM)
+   Jan 2000:
+      Original version: this version crippled for use with crippled compilers
+      - John Maddock Jan 2000.
+*/
+
+
+#ifndef BOOST_OB_COMPRESSED_PAIR_HPP
+#define BOOST_OB_COMPRESSED_PAIR_HPP
+
+#include <algorithm>
+#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP
+#include <boost/type_traits/object_traits.hpp>
+#endif
+#ifndef BOOST_SAME_TRAITS_HPP
+#include <boost/type_traits/same_traits.hpp>
+#endif
+#ifndef BOOST_CALL_TRAITS_HPP
+#include <boost/call_traits.hpp>
+#endif
+
+namespace boost
+{
+#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
+//
+// use member templates to emulate
+// partial specialisation.  Note that due to
+// problems with overload resolution with VC6
+// each of the compressed_pair versions that follow
+// have one template single-argument constructor
+// in place of two specific constructors:
+//
+
+template <class T1, class T2>
+class compressed_pair;
+
+namespace detail{
+
+template <class A, class T1, class T2>
+struct best_conversion_traits
+{
+   typedef char one;
+   typedef char (&two)[2];
+   static A a;
+   static one test(T1);
+   static two test(T2);
+
+   enum { value = sizeof(test(a)) };
+};
+
+template <int>
+struct init_one;
+
+template <>
+struct init_one<1>
+{
+   template <class A, class T1, class T2>
+   static void init(const A& a, T1* p1, T2*)
+   {
+      *p1 = a;
+   }
+};
+
+template <>
+struct init_one<2>
+{
+   template <class A, class T1, class T2>
+   static void init(const A& a, T1*, T2* p2)
+   {
+      *p2 = a;
+   }
+};
+
+
+// T1 != T2, both non-empty
+template <class T1, class T2>
+class compressed_pair_0
+{
+private:
+   T1 _first;
+   T2 _second;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_0() : _first(), _second() {}
+            compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {}
+   template <class A>
+   explicit compressed_pair_0(const A& val)
+   {
+      init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, &_second);
+   }
+   compressed_pair_0(const ::boost::compressed_pair<T1,T2>& x)
+      : _first(x.first()), _second(x.second()) {}
+
+#if 0
+  compressed_pair_0& operator=(const compressed_pair_0& x) {
+    cout << "assigning compressed pair 0" << endl;
+    _first = x._first;
+    _second = x._second;
+    cout << "finished assigning compressed pair 0" << endl;
+    return *this;
+  }
+#endif
+
+   first_reference       first()       { return _first; }
+   first_const_reference first() const { return _first; }
+
+   second_reference       second()       { return _second; }
+   second_const_reference second() const { return _second; }
+
+   void swap(compressed_pair_0& y)
+   {
+      using std::swap;
+      swap(_first, y._first);
+      swap(_second, y._second);
+   }
+};
+
+// T1 != T2, T2 empty
+template <class T1, class T2>
+class compressed_pair_1 : T2
+{
+private:
+   T1 _first;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_1() : T2(), _first() {}
+            compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {}
+
+   template <class A>
+   explicit compressed_pair_1(const A& val)
+   {
+      init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, static_cast<T2*>(this));
+   }
+
+   compressed_pair_1(const ::boost::compressed_pair<T1,T2>& x)
+      : T2(x.second()), _first(x.first()) {}
+
+   first_reference       first()       { return _first; }
+   first_const_reference first() const { return _first; }
+
+   second_reference       second()       { return *this; }
+   second_const_reference second() const { return *this; }
+
+   void swap(compressed_pair_1& y)
+   {
+      // no need to swap empty base class:
+      using std::swap;
+      swap(_first, y._first);
+   }
+};
+
+// T1 != T2, T1 empty
+template <class T1, class T2>
+class compressed_pair_2 : T1
+{
+private:
+   T2 _second;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_2() : T1(), _second() {}
+            compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {}
+   template <class A>
+   explicit compressed_pair_2(const A& val)
+   {
+      init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), &_second);
+   }
+   compressed_pair_2(const ::boost::compressed_pair<T1,T2>& x)
+      : T1(x.first()), _second(x.second()) {}
+
+#if 0
+  compressed_pair_2& operator=(const compressed_pair_2& x) {
+    cout << "assigning compressed pair 2" << endl;
+    T1::operator=(x);
+    _second = x._second;
+    cout << "finished assigning compressed pair 2" << endl;
+    return *this;
+  }
+#endif
+   first_reference       first()       { return *this; }
+   first_const_reference first() const { return *this; }
+
+   second_reference       second()       { return _second; }
+   second_const_reference second() const { return _second; }
+
+   void swap(compressed_pair_2& y)
+   {
+      // no need to swap empty base class:
+      using std::swap;
+      swap(_second, y._second);
+   }
+};
+
+// T1 != T2, both empty
+template <class T1, class T2>
+class compressed_pair_3 : T1, T2
+{
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_3() : T1(), T2() {}
+            compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {}
+   template <class A>
+   explicit compressed_pair_3(const A& val)
+   {
+      init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), static_cast<T2*>(this));
+   }
+   compressed_pair_3(const ::boost::compressed_pair<T1,T2>& x)
+      : T1(x.first()), T2(x.second()) {}
+
+   first_reference       first()       { return *this; }
+   first_const_reference first() const { return *this; }
+
+   second_reference       second()       { return *this; }
+   second_const_reference second() const { return *this; }
+
+   void swap(compressed_pair_3& y)
+   {
+      // no need to swap empty base classes:
+   }
+};
+
+// T1 == T2, and empty
+template <class T1, class T2>
+class compressed_pair_4 : T1
+{
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_4() : T1() {}
+            compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {}
+   // only one single argument constructor since T1 == T2
+   explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {}
+   compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x)
+      : T1(x.first()), m_second(x.second()) {}
+
+   first_reference       first()       { return *this; }
+   first_const_reference first() const { return *this; }
+
+   second_reference       second()       { return m_second; }
+   second_const_reference second() const { return m_second; }
+
+   void swap(compressed_pair_4& y)
+   {
+      // no need to swap empty base classes:
+   }
+private:
+   T2 m_second;
+};
+
+// T1 == T2, not empty
+template <class T1, class T2>
+class compressed_pair_5
+{
+private:
+   T1 _first;
+   T2 _second;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair_5() : _first(), _second() {}
+            compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {}
+   // only one single argument constructor since T1 == T2
+   explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {}
+   compressed_pair_5(const ::boost::compressed_pair<T1,T2>& c) 
+      : _first(c.first()), _second(c.second()) {}
+
+   first_reference       first()       { return _first; }
+   first_const_reference first() const { return _first; }
+
+   second_reference       second()       { return _second; }
+   second_const_reference second() const { return _second; }
+
+   void swap(compressed_pair_5& y)
+   {
+      using std::swap;
+      swap(_first, y._first);
+      swap(_second, y._second);
+   }
+};
+
+template <bool e1, bool e2, bool same>
+struct compressed_pair_chooser
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_0<T1, T2> type;
+   };
+};
+
+template <>
+struct compressed_pair_chooser<false, true, false>
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_1<T1, T2> type;
+   };
+};
+
+template <>
+struct compressed_pair_chooser<true, false, false>
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_2<T1, T2> type;
+   };
+};
+
+template <>
+struct compressed_pair_chooser<true, true, false>
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_3<T1, T2> type;
+   };
+};
+
+template <>
+struct compressed_pair_chooser<true, true, true>
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_4<T1, T2> type;
+   };
+};
+
+template <>
+struct compressed_pair_chooser<false, false, true>
+{
+   template <class T1, class T2>
+   struct rebind
+   {
+      typedef compressed_pair_5<T1, T2> type;
+   };
+};
+
+template <class T1, class T2>
+struct compressed_pair_traits
+{
+private:
+   typedef compressed_pair_chooser<is_empty<T1>::value, is_empty<T2>::value, is_same<T1,T2>::value> chooser;
+   typedef typename chooser::template rebind<T1, T2> bound_type;
+public:
+   typedef typename bound_type::type type;
+};
+
+} // namespace detail
+
+template <class T1, class T2>
+class compressed_pair : public detail::compressed_pair_traits<T1, T2>::type
+{
+private:
+   typedef typename detail::compressed_pair_traits<T1, T2>::type base_type;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair() : base_type() {}
+            compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {}
+   template <class A>
+   explicit compressed_pair(const A& x) : base_type(x){}
+
+   first_reference       first()       { return base_type::first(); }
+   first_const_reference first() const { return base_type::first(); }
+
+   second_reference       second()       { return base_type::second(); }
+   second_const_reference second() const { return base_type::second(); }
+};
+
+template <class T1, class T2>
+inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
+{
+   x.swap(y);
+}
+
+#else
+// no partial specialisation, no member templates:
+
+template <class T1, class T2>
+class compressed_pair
+{
+private:
+   T1 _first;
+   T2 _second;
+public:
+   typedef T1                                                 first_type;
+   typedef T2                                                 second_type;
+   typedef typename call_traits<first_type>::param_type       first_param_type;
+   typedef typename call_traits<second_type>::param_type      second_param_type;
+   typedef typename call_traits<first_type>::reference        first_reference;
+   typedef typename call_traits<second_type>::reference       second_reference;
+   typedef typename call_traits<first_type>::const_reference  first_const_reference;
+   typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+            compressed_pair() : _first(), _second() {}
+            compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {}
+   explicit compressed_pair(first_param_type x) : _first(x), _second() {}
+   // can't define this in case T1 == T2:
+   // explicit compressed_pair(second_param_type y) : _first(), _second(y) {}
+
+   first_reference       first()       { return _first; }
+   first_const_reference first() const { return _first; }
+
+   second_reference       second()       { return _second; }
+   second_const_reference second() const { return _second; }
+
+   void swap(compressed_pair& y)
+   {
+      using std::swap;
+      swap(_first, y._first);
+      swap(_second, y._second);
+   }
+};
+
+template <class T1, class T2>
+inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
+{
+   x.swap(y);
+}
+
+#endif
+
+} // boost
+
+#endif // BOOST_OB_COMPRESSED_PAIR_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/detail/quick_allocator.hpp b/gatb-core/thirdparty/boost/detail/quick_allocator.hpp
new file mode 100644
index 0000000..d54b3a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/quick_allocator.hpp
@@ -0,0 +1,23 @@
+#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  detail/quick_allocator.hpp
+//
+//  Copyright (c) 2003 David Abrahams
+//  Copyright (c) 2003 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/smart_ptr/detail/quick_allocator.hpp>
+
+#endif  // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/reference_content.hpp b/gatb-core/thirdparty/boost/detail/reference_content.hpp
new file mode 100644
index 0000000..36b80d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/reference_content.hpp
@@ -0,0 +1,120 @@
+//-----------------------------------------------------------------------------
+// boost detail/reference_content.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_REFERENCE_CONTENT_HPP
+#define BOOST_DETAIL_REFERENCE_CONTENT_HPP
+
+#include "boost/config.hpp"
+
+#   include "boost/mpl/bool.hpp"
+#   include "boost/type_traits/has_nothrow_copy.hpp"
+
+#include "boost/mpl/void.hpp"
+
+namespace boost {
+
+namespace detail {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class template reference_content
+//
+// Non-Assignable wrapper for references.
+//
+template <typename RefT>
+class reference_content
+{
+private: // representation
+
+    RefT content_;
+
+public: // structors
+
+    ~reference_content()
+    {
+    }
+
+    reference_content(RefT r)
+        : content_( r )
+    {
+    }
+
+    reference_content(const reference_content& operand)
+        : content_( operand.content_ )
+    {
+    }
+
+private: // non-Assignable
+
+    reference_content& operator=(const reference_content&);
+
+public: // queries
+
+    RefT get() const
+    {
+        return content_;
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction make_reference_content
+//
+// Wraps with reference_content if specified type is reference.
+//
+
+template <typename T = mpl::void_> struct make_reference_content;
+
+
+template <typename T>
+struct make_reference_content
+{
+    typedef T type;
+};
+
+template <typename T>
+struct make_reference_content< T& >
+{
+    typedef reference_content<T&> type;
+};
+
+
+template <>
+struct make_reference_content< mpl::void_ >
+{
+    template <typename T>
+    struct apply
+        : make_reference_content<T>
+    {
+    };
+
+    typedef mpl::void_ type;
+};
+
+} // namespace detail
+
+///////////////////////////////////////////////////////////////////////////////
+// reference_content<T&> type traits specializations
+//
+
+
+template <typename T>
+struct has_nothrow_copy<
+      ::boost::detail::reference_content< T& >
+    >
+    : mpl::true_
+{
+};
+
+
+} // namespace boost
+
+#endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP
diff --git a/gatb-core/thirdparty/boost/detail/scoped_enum_emulation.hpp b/gatb-core/thirdparty/boost/detail/scoped_enum_emulation.hpp
new file mode 100644
index 0000000..1c7bc23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/scoped_enum_emulation.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Andrey Semashev
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_DETAIL_SCOPED_ENUM_EMULATION_HPP
+#define BOOST_DETAIL_SCOPED_ENUM_EMULATION_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/scoped_enum.hpp instead.
+
+#include <boost/core/scoped_enum.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/select_type.hpp b/gatb-core/thirdparty/boost/detail/select_type.hpp
new file mode 100644
index 0000000..c13946f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/select_type.hpp
@@ -0,0 +1,36 @@
+// (C) Copyright David Abrahams 2001.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org for most recent version including documentation.
+
+// Revision History
+// 09 Feb 01  Applied John Maddock's Borland patch Moving <true>
+//            specialization to unspecialized template (David Abrahams)
+// 06 Feb 01  Created (David Abrahams)
+
+#ifndef SELECT_TYPE_DWA20010206_HPP
+# define SELECT_TYPE_DWA20010206_HPP
+
+namespace boost { namespace detail {
+
+  // Template class if_true -- select among 2 types based on a bool constant expression
+  // Usage:
+  //   typename if_true<(bool_const_expression)>::template then<true_type, false_type>::type
+
+  // HP aCC cannot deal with missing names for template value parameters
+  template <bool b> struct if_true
+  {
+      template <class T, class F>
+      struct then { typedef T type; };
+  };
+
+  template <>
+  struct if_true<false>
+  {
+      template <class T, class F>
+      struct then { typedef F type; };
+  };
+}}
+#endif // SELECT_TYPE_DWA20010206_HPP
diff --git a/gatb-core/thirdparty/boost/detail/sp_typeinfo.hpp b/gatb-core/thirdparty/boost/detail/sp_typeinfo.hpp
new file mode 100644
index 0000000..4e4de55
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/sp_typeinfo.hpp
@@ -0,0 +1,36 @@
+#ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
+#define BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  detail/sp_typeinfo.hpp
+//
+//  Deprecated, please use boost/core/typeinfo.hpp
+//
+//  Copyright 2007 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/core/typeinfo.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+typedef boost::core::typeinfo sp_typeinfo;
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_SP_TYPEID(T) BOOST_CORE_TYPEID(T)
+
+#endif  // #ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/detail/templated_streams.hpp b/gatb-core/thirdparty/boost/detail/templated_streams.hpp
new file mode 100644
index 0000000..1fa6ee3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/templated_streams.hpp
@@ -0,0 +1,74 @@
+//-----------------------------------------------------------------------------
+// boost detail/templated_streams.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_TEMPLATED_STREAMS_HPP
+#define BOOST_DETAIL_TEMPLATED_STREAMS_HPP
+
+#include "boost/config.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) BOOST_TEMPLATED_STREAM_* macros
+//
+// Provides workaround platforms without stream class templates.
+//
+
+#if !defined(BOOST_NO_STD_LOCALE)
+
+#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) \
+    template < typename E , typename T >
+
+#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) \
+    template < typename E , typename T , typename A >
+
+#define BOOST_TEMPLATED_STREAM_ARGS(E,T) \
+    typename E , typename T 
+
+#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) \
+    typename E , typename T , typename A 
+
+#define BOOST_TEMPLATED_STREAM_COMMA        ,
+
+#define BOOST_TEMPLATED_STREAM_ELEM(E)      E
+#define BOOST_TEMPLATED_STREAM_TRAITS(T)    T
+#define BOOST_TEMPLATED_STREAM_ALLOC(A)     A
+
+#define BOOST_TEMPLATED_STREAM(X,E,T) \
+    BOOST_JOIN(std::basic_,X)< E , T >
+
+#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \
+    BOOST_JOIN(std::basic_,X)< E , T , A >
+
+#else // defined(BOOST_NO_STD_LOCALE)
+
+#define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) /**/
+
+#define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) /**/
+
+#define BOOST_TEMPLATED_STREAM_ARGS(E,T) /**/
+
+#define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) /**/
+
+#define BOOST_TEMPLATED_STREAM_COMMA        /**/
+
+#define BOOST_TEMPLATED_STREAM_ELEM(E)      char
+#define BOOST_TEMPLATED_STREAM_TRAITS(T)    std::char_traits<char>
+#define BOOST_TEMPLATED_STREAM_ALLOC(A)     std::allocator<char>
+
+#define BOOST_TEMPLATED_STREAM(X,E,T) \
+    std::X
+
+#define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \
+    std::X
+
+#endif // BOOST_NO_STD_LOCALE
+
+#endif // BOOST_DETAIL_TEMPLATED_STREAMS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.hpp b/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.hpp
new file mode 100644
index 0000000..2d7ed8b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.hpp
@@ -0,0 +1,214 @@
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia at osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums at osl.iu.edu).
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UTF8_CODECVT_FACET_HPP
+#define BOOST_UTF8_CODECVT_FACET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// utf8_codecvt_facet.hpp
+
+// This header defines class utf8_codecvt_facet, derived from 
+// std::codecvt<wchar_t, char>, which can be used to convert utf8 data in
+// files into wchar_t strings in the application.
+//
+// The header is NOT STANDALONE, and is not to be included by the USER.
+// There are at least two libraries which want to use this functionality, and
+// we want to avoid code duplication. It would be possible to create utf8
+// library, but:
+// - this requires review process first
+// - in the case, when linking the a library which uses utf8 
+//   (say 'program_options'), user should also link to the utf8 library.
+//   This seems inconvenient, and asking a user to link to an unrevieved 
+//   library is strange. 
+// Until the above points are fixed, a library which wants to use utf8 must:
+// - include this header in one of it's headers or sources
+// - include the corresponding boost/detail/utf8_codecvt_facet.ipp file in one
+//   of its sources
+// - before including either file, the library must define
+//   - BOOST_UTF8_BEGIN_NAMESPACE to the namespace declaration that must be used
+//   - BOOST_UTF8_END_NAMESPACE to the code to close the previous namespace
+//     declaration.
+//   - BOOST_UTF8_DECL -- to the code which must be used for all 'exportable'
+//     symbols.
+//
+// For example, program_options library might contain:
+//    #define BOOST_UTF8_BEGIN_NAMESPACE <backslash character> 
+//             namespace boost { namespace program_options {
+//    #define BOOST_UTF8_END_NAMESPACE }}
+//    #define BOOST_UTF8_DECL BOOST_PROGRAM_OPTIONS_DECL
+//    #include <boost/detail/utf8_codecvt_facet.ipp>
+//
+// Essentially, each library will have its own copy of utf8 code, in
+// different namespaces. 
+
+// Note:(Robert Ramey).  I have made the following alterations in the original
+// code.
+// a) Rendered utf8_codecvt<wchar_t, char>  with using templates
+// b) Move longer functions outside class definition to prevent inlining
+// and make code smaller
+// c) added on a derived class to permit translation to/from current
+// locale to utf8
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as text - note these ar templated on the basic
+// stream templates to accommodate wide (and other?) kind of characters
+//
+// note the fact that on libraries without wide characters, ostream is
+// is not a specialization of basic_ostream which in fact is not defined
+// in such cases.   So we can't use basic_ostream<OStream::char_type> but rather
+// use two template parameters
+//
+// utf8_codecvt_facet
+//   This is an implementation of a std::codecvt facet for translating 
+//   from UTF-8 externally to UCS-4.  Note that this is not tied to
+//   any specific types in order to allow customization on platforms
+//   where wchar_t is not big enough.
+//
+// NOTES:  The current implementation jumps through some unpleasant hoops in
+// order to deal with signed character types.  As a std::codecvt_base::result,
+// it is necessary  for the ExternType to be convertible to unsigned  char.
+// I chose not to tie the extern_type explicitly to char. But if any combination
+// of types other than <wchar_t,char_t> is used, then std::codecvt must be
+// specialized on those types for this to work.
+
+#include <locale>
+#include <cwchar>   // for mbstate_t
+#include <cstddef>  // for std::size_t
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std {
+    using ::mbstate_t;
+    using ::size_t;
+}
+#endif
+
+// maximum lenght of a multibyte string
+#define MB_LENGTH_MAX 8
+
+BOOST_UTF8_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//                          utf8_codecvt_facet                                //
+//                                                                            //
+//            See utf8_codecvt_facet.ipp for the implementation.              //
+//----------------------------------------------------------------------------//
+
+
+struct BOOST_UTF8_DECL utf8_codecvt_facet :
+    public std::codecvt<wchar_t, char, std::mbstate_t>  
+{
+public:
+    explicit utf8_codecvt_facet(std::size_t no_locale_manage=0)
+        : std::codecvt<wchar_t, char, std::mbstate_t>(no_locale_manage) 
+    {}
+protected:
+    virtual std::codecvt_base::result do_in(
+        std::mbstate_t& state, 
+        const char * from,
+        const char * from_end, 
+        const char * & from_next,
+        wchar_t * to, 
+        wchar_t * to_end, 
+        wchar_t*& to_next
+    ) const;
+
+    virtual std::codecvt_base::result do_out(
+        std::mbstate_t & state,
+        const wchar_t * from,
+        const wchar_t * from_end,
+        const wchar_t*  & from_next,
+        char * to,
+        char * to_end,
+        char * & to_next
+    ) const;
+
+    bool invalid_continuing_octet(unsigned char octet_1) const {
+        return (octet_1 < 0x80|| 0xbf< octet_1);
+    }
+
+    bool invalid_leading_octet(unsigned char octet_1)   const {
+        return (0x7f < octet_1 && octet_1 < 0xc0) ||
+            (octet_1 > 0xfd);
+    }
+
+    // continuing octets = octets except for the leading octet
+    static unsigned int get_cont_octet_count(unsigned char lead_octet) {
+        return get_octet_count(lead_octet) - 1;
+    }
+
+    static unsigned int get_octet_count(unsigned char lead_octet);
+
+    // How many "continuing octets" will be needed for this word
+    // ==   total octets - 1.
+    int get_cont_octet_out_count(wchar_t word) const ;
+
+    virtual bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW {
+        return false;
+    }
+
+    // UTF-8 isn't really stateful since we rewind on partial conversions
+    virtual std::codecvt_base::result do_unshift(
+        std::mbstate_t&,
+        char * from,
+        char * /*to*/,
+        char * & next
+    ) const {
+        next = from;
+        return ok;
+    }
+
+    virtual int do_encoding() const BOOST_NOEXCEPT_OR_NOTHROW {
+        const int variable_byte_external_encoding=0;
+        return variable_byte_external_encoding;
+    }
+
+    // How many char objects can I process to get <= max_limit
+    // wchar_t objects?
+    virtual int do_length(
+        const std::mbstate_t &,
+        const char * from,
+        const char * from_end, 
+        std::size_t max_limit
+    ) const
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+    throw()
+#endif
+    ;
+    virtual int do_length(
+        std::mbstate_t & s,
+        const char * from,
+        const char * from_end, 
+        std::size_t max_limit
+    ) const
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+    throw()
+#endif
+    {
+        return do_length(
+            const_cast<const std::mbstate_t &>(s),
+            from,
+            from_end,
+            max_limit
+        );
+    }
+    // Largest possible value do_length(state,from,from_end,1) could return.
+    virtual int do_max_length() const BOOST_NOEXCEPT_OR_NOTHROW {
+        return 6; // largest UTF-8 encoding of a UCS-4 character
+    }
+};
+
+BOOST_UTF8_END_NAMESPACE
+
+#endif // BOOST_UTF8_CODECVT_FACET_HPP
diff --git a/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.ipp b/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.ipp
new file mode 100644
index 0000000..d39170f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/utf8_codecvt_facet.ipp
@@ -0,0 +1,283 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// utf8_codecvt_facet.ipp
+
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia at osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums at osl.iu.edu). 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to
+// learn how this file should be used.
+
+#include <boost/detail/utf8_codecvt_facet.hpp>
+
+#include <cstdlib> // for multi-byte converson routines
+#include <cassert>
+
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+
+// If we don't have wstring, then Unicode support 
+// is not available anyway, so we don't need to even
+// compiler this file. This also fixes the problem
+// with mingw, which can compile this file, but will
+// generate link error when building DLL.
+#ifndef BOOST_NO_STD_WSTRING
+
+BOOST_UTF8_BEGIN_NAMESPACE
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation for wchar_t
+
+// Translate incoming UTF-8 into UCS-4
+std::codecvt_base::result utf8_codecvt_facet::do_in(
+    std::mbstate_t& /*state*/, 
+    const char * from,
+    const char * from_end, 
+    const char * & from_next,
+    wchar_t * to, 
+    wchar_t * to_end, 
+    wchar_t * & to_next
+) const {
+    // Basic algorithm:  The first octet determines how many
+    // octets total make up the UCS-4 character.  The remaining
+    // "continuing octets" all begin with "10". To convert, subtract
+    // the amount that specifies the number of octets from the first
+    // octet.  Subtract 0x80 (1000 0000) from each continuing octet,
+    // then mash the whole lot together.  Note that each continuing
+    // octet only uses 6 bits as unique values, so only shift by
+    // multiples of 6 to combine.
+    while (from != from_end && to != to_end) {
+
+        // Error checking   on the first octet
+        if (invalid_leading_octet(*from)){
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        // The first octet is   adjusted by a value dependent upon 
+        // the number   of "continuing octets" encoding the character
+        const   int cont_octet_count = get_cont_octet_count(*from);
+        const   wchar_t octet1_modifier_table[] =   {
+            0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+        };
+
+        // The unsigned char conversion is necessary in case char is
+        // signed   (I learned this the hard way)
+        wchar_t ucs_result = 
+            (unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
+
+        // Invariants   : 
+        //   1) At the start of the loop,   'i' continuing characters have been
+        //    processed 
+        //   2) *from   points to the next continuing character to be processed.
+        int i   = 0;
+        while(i != cont_octet_count && from != from_end) {
+
+            // Error checking on continuing characters
+            if (invalid_continuing_octet(*from)) {
+                from_next   = from;
+                to_next =   to;
+                return std::codecvt_base::error;
+            }
+
+            ucs_result *= (1 << 6); 
+
+            // each continuing character has an extra (10xxxxxx)b attached to 
+            // it that must be removed.
+            ucs_result += (unsigned char)(*from++) - 0x80;
+            ++i;
+        }
+
+        // If   the buffer ends with an incomplete unicode character...
+        if (from == from_end && i   != cont_octet_count) {
+            // rewind "from" to before the current character translation
+            from_next = from - (i+1); 
+            to_next = to;
+            return std::codecvt_base::partial;
+        }
+        *to++   = ucs_result;
+    }
+    from_next = from;
+    to_next = to;
+
+    // Were we done converting or did we run out of destination space?
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+std::codecvt_base::result utf8_codecvt_facet::do_out(
+    std::mbstate_t& /*state*/, 
+    const wchar_t *   from,
+    const wchar_t * from_end, 
+    const wchar_t * & from_next,
+    char * to, 
+    char * to_end, 
+    char * & to_next
+) const
+{
+    // RG - consider merging this table with the other one
+    const wchar_t octet1_modifier_table[] = {
+        0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
+    };
+
+    wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
+    while (from != from_end && to != to_end) {
+
+        // Check for invalid UCS-4 character
+        if (*from  > max_wchar) {
+            from_next = from;
+            to_next = to;
+            return std::codecvt_base::error;
+        }
+
+        int cont_octet_count = get_cont_octet_out_count(*from);
+
+        // RG  - comment this formula better
+        int shift_exponent = (cont_octet_count) *   6;
+
+        // Process the first character
+        *to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
+            (unsigned char)(*from / (1 << shift_exponent)));
+
+        // Process the continuation characters 
+        // Invariants: At   the start of the loop:
+        //   1) 'i' continuing octets   have been generated
+        //   2) '*to'   points to the next location to place an octet
+        //   3) shift_exponent is   6 more than needed for the next octet
+        int i   = 0;
+        while   (i != cont_octet_count && to != to_end) {
+            shift_exponent -= 6;
+            *to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
+            ++i;
+        }
+        // If   we filled up the out buffer before encoding the character
+        if(to   == to_end && i != cont_octet_count) {
+            from_next = from;
+            to_next = to - (i+1);
+            return std::codecvt_base::partial;
+        }
+        ++from;
+    }
+    from_next = from;
+    to_next = to;
+    // Were we done or did we run out of destination space
+    if(from == from_end) return std::codecvt_base::ok;
+    else return std::codecvt_base::partial;
+}
+
+// How many char objects can I process to get <= max_limit
+// wchar_t objects?
+int utf8_codecvt_facet::do_length(
+    const std::mbstate_t &,
+    const char * from,
+    const char * from_end, 
+    std::size_t max_limit
+) const
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+        throw()
+#endif
+{ 
+    // RG - this code is confusing!  I need a better way to express it.
+    // and test cases.
+
+    // Invariants:
+    // 1) last_octet_count has the size of the last measured character
+    // 2) char_count holds the number of characters shown to fit
+    // within the bounds so far (no greater than max_limit)
+    // 3) from_next points to the octet 'last_octet_count' before the
+    // last measured character.  
+    int last_octet_count=0;
+    std::size_t char_count = 0;
+    const char* from_next = from;
+    // Use "<" because the buffer may represent incomplete characters
+    while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
+        from_next += last_octet_count;
+        last_octet_count = (get_octet_count(*from_next));
+        ++char_count;
+    }
+    return static_cast<int>(from_next-from_end);
+}
+
+unsigned int utf8_codecvt_facet::get_octet_count(
+    unsigned char   lead_octet
+){
+    // if the 0-bit (MSB) is 0, then 1 character
+    if (lead_octet <= 0x7f) return 1;
+
+    // Otherwise the count number of consecutive 1 bits starting at MSB
+//    assert(0xc0 <= lead_octet && lead_octet <= 0xfd);
+
+    if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2;
+    else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3;
+    else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4;
+    else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5;
+    else return 6;
+}
+
+namespace detail {
+
+template<std::size_t s>
+int get_cont_octet_out_count_impl(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+    return 2;
+}
+
+template<>
+int get_cont_octet_out_count_impl<4>(wchar_t word){
+    if (word < 0x80) {
+        return 0;
+    }
+    if (word < 0x800) {
+        return 1;
+    }
+
+    // Note that the following code will generate warnings on some platforms
+    // where wchar_t is defined as UCS2.  The warnings are superfluous as the
+    // specialization is never instantitiated with such compilers, but this
+    // can cause problems if warnings are being treated as errors, so we guard
+    // against that.  Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+    // should be enough to get WCHAR_MAX defined.
+#if !defined(WCHAR_MAX)
+#   error WCHAR_MAX not defined!
+#endif
+    // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX
+#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier
+    return 2;
+#elif WCHAR_MAX > 0x10000
+    
+   if (word < 0x10000) {
+        return 2;
+    }
+    if (word < 0x200000) {
+        return 3;
+    }
+    if (word < 0x4000000) {
+        return 4;
+    }
+    return 5;
+    
+#else
+    return 2;
+#endif
+}
+
+} // namespace detail
+
+// How many "continuing octets" will be needed for this word
+// ==   total octets - 1.
+int utf8_codecvt_facet::get_cont_octet_out_count(
+    wchar_t word
+) const {
+    return detail::get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
+}
+BOOST_UTF8_END_NAMESPACE
+
+#endif
diff --git a/gatb-core/thirdparty/boost/detail/winapi/GetCurrentProcess.hpp b/gatb-core/thirdparty/boost/detail/winapi/GetCurrentProcess.hpp
new file mode 100644
index 0000000..51206bb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/GetCurrentProcess.hpp
@@ -0,0 +1,29 @@
+//  GetCurrentProcess.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_GETCURRENTPROCESS_HPP
+#define BOOST_DETAIL_WINAPI_GETCURRENTPROCESS_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetCurrentProcess;
+#else
+    extern "C" __declspec(dllimport) HANDLE_ WINAPI GetCurrentProcess();
+#endif
+}
+}
+}
+#endif // BOOST_DETAIL_WINAPI_GETCURRENTPROCESS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/GetCurrentThread.hpp b/gatb-core/thirdparty/boost/detail/winapi/GetCurrentThread.hpp
new file mode 100644
index 0000000..595b751
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/GetCurrentThread.hpp
@@ -0,0 +1,38 @@
+//  GetCurrentThread.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_GETCURRENTTHREAD_HPP
+#define BOOST_DETAIL_WINAPI_GETCURRENTTHREAD_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( UNDER_CE )
+// Windows CE define GetCurrentThread as an inline function in kfuncs.h
+inline HANDLE_ GetCurrentThread() 
+{
+  return ::GetCurrentThread();
+}
+#else
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetCurrentThread;
+#else
+    extern "C" __declspec(dllimport) HANDLE_ WINAPI GetCurrentThread();
+#endif
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_GETCURRENTTHREAD_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/GetLastError.hpp b/gatb-core/thirdparty/boost/detail/winapi/GetLastError.hpp
new file mode 100644
index 0000000..6e9e2d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/GetLastError.hpp
@@ -0,0 +1,31 @@
+//  GetLastError.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_GETLASTERROR_HPP
+#define BOOST_DETAIL_WINAPI_GETLASTERROR_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetLastError;
+#else
+    extern "C" __declspec(dllimport) DWORD_ WINAPI
+        GetLastError();
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_GETLASTERROR_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/GetProcessTimes.hpp b/gatb-core/thirdparty/boost/detail/winapi/GetProcessTimes.hpp
new file mode 100644
index 0000000..f2860b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/GetProcessTimes.hpp
@@ -0,0 +1,39 @@
+//  GetProcessTimes.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
+#define BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
+
+#include <boost/detail/winapi/time.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if !defined(UNDER_CE)  // Windows CE does not define GetProcessTimes
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetProcessTimes;
+#else
+    extern "C" __declspec(dllimport) BOOL_ WINAPI
+        GetProcessTimes(
+            HANDLE_ hProcess,
+            LPFILETIME_ lpCreationTime,
+            LPFILETIME_ lpExitTime,
+            LPFILETIME_ lpKernelTime,
+            LPFILETIME_ lpUserTime
+        );
+#endif
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/GetThreadTimes.hpp b/gatb-core/thirdparty/boost/detail/winapi/GetThreadTimes.hpp
new file mode 100644
index 0000000..3428eda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/GetThreadTimes.hpp
@@ -0,0 +1,37 @@
+//  GetThreadTimes.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_GETTHREADTIMES_HPP
+#define BOOST_DETAIL_WINAPI_GETTHREADTIMES_HPP
+
+#include <boost/detail/winapi/time.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetThreadTimes;
+#else
+    extern "C" __declspec(dllimport) BOOL_ WINAPI
+        GetThreadTimes(
+            HANDLE_ hThread,
+            LPFILETIME_ lpCreationTime,
+            LPFILETIME_ lpExitTime,
+            LPFILETIME_ lpKernelTime,
+            LPFILETIME_ lpUserTime
+        );
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_GETTHREADTIMES_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/LocalFree.hpp b/gatb-core/thirdparty/boost/detail/winapi/LocalFree.hpp
new file mode 100644
index 0000000..697016c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/LocalFree.hpp
@@ -0,0 +1,33 @@
+//  LocalFree.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_LOCALFREE_HPP
+#define BOOST_DETAIL_WINAPI_LOCALFREE_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef HANDLE_ HLOCAL_;
+
+    using ::LocalFree;
+#else
+    extern "C" typedef HANDLE_ HLOCAL_;
+    extern "C" __declspec(dllimport) HLOCAL_ WINAPI 
+        LocalFree(HLOCAL_ hMem);
+#endif
+}
+}
+}
+#endif // BOOST_DETAIL_WINAPI_LOCALFREE_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/basic_types.hpp b/gatb-core/thirdparty/boost/detail/winapi/basic_types.hpp
new file mode 100644
index 0000000..09d907b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/basic_types.hpp
@@ -0,0 +1,134 @@
+//  basic_types.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_BASIC_TYPES_HPP
+#define BOOST_DETAIL_WINAPI_BASIC_TYPES_HPP
+
+#include <cstdarg>
+#include <boost/cstdint.hpp>
+#include <boost/detail/winapi/config.hpp>
+
+#if defined( BOOST_USE_WINDOWS_H )
+# include <windows.h>
+#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) ||  defined(__CYGWIN__)
+# include <winerror.h>
+// @FIXME Which condition must be tested
+# ifdef UNDER_CE
+#  ifndef WINAPI
+#   ifndef _WIN32_WCE_EMULATION
+#    define WINAPI  __cdecl     // Note this doesn't match the desktop definition
+#   else
+#    define WINAPI  __stdcall
+#   endif
+#  endif
+# else
+#  ifndef WINAPI
+#    define WINAPI  __stdcall
+#  endif
+# endif
+# ifndef NTAPI
+#  define NTAPI __stdcall
+# endif
+#else
+# error "Win32 functions not available"
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef ::BOOL BOOL_;
+    typedef ::BOOLEAN BOOLEAN_;
+    typedef ::PBOOLEAN PBOOLEAN_;
+    typedef ::BYTE BYTE_;
+    typedef ::WORD WORD_;
+    typedef ::DWORD DWORD_;
+    typedef ::HANDLE HANDLE_;
+    typedef ::HMODULE HMODULE_;
+    typedef ::LONG LONG_;
+    typedef ::ULONG ULONG_;
+    typedef ::LONGLONG LONGLONG_;
+    typedef ::ULONGLONG ULONGLONG_;
+    typedef ::INT_PTR INT_PTR_;
+    typedef ::UINT_PTR UINT_PTR_;
+    typedef ::LONG_PTR LONG_PTR_;
+    typedef ::ULONG_PTR ULONG_PTR_;
+    typedef ::LARGE_INTEGER LARGE_INTEGER_;
+    typedef ::PLARGE_INTEGER PLARGE_INTEGER_;
+    typedef ::PVOID PVOID_;
+    typedef ::LPVOID LPVOID_;
+    typedef ::CHAR CHAR_;
+    typedef ::LPSTR LPSTR_;
+    typedef ::LPCSTR LPCSTR_;
+    typedef ::WCHAR WCHAR_;
+    typedef ::LPWSTR LPWSTR_;
+    typedef ::LPCWSTR LPCWSTR_;
+#else
+extern "C" {
+    typedef int BOOL_;
+    typedef unsigned char BYTE_;
+    typedef BYTE_ BOOLEAN_;
+    typedef BOOLEAN_* PBOOLEAN_;
+    typedef unsigned short WORD_;
+    typedef unsigned long DWORD_;
+    typedef void* HANDLE_;
+    typedef void* HMODULE_;
+
+    typedef long LONG_;
+    typedef unsigned long ULONG_;
+
+    typedef boost::int64_t LONGLONG_;
+    typedef boost::uint64_t ULONGLONG_;
+
+// @FIXME Which condition must be tested
+# ifdef _WIN64
+#if defined(__CYGWIN__)
+    typedef long INT_PTR_;
+    typedef unsigned long UINT_PTR_;
+    typedef long LONG_PTR_;
+    typedef unsigned long ULONG_PTR_;
+#else
+    typedef __int64 INT_PTR_;
+    typedef unsigned __int64 UINT_PTR_;
+    typedef __int64 LONG_PTR_;
+    typedef unsigned __int64 ULONG_PTR_;
+#endif
+# else
+    typedef int INT_PTR_;
+    typedef unsigned int UINT_PTR_;
+    typedef long LONG_PTR_;
+    typedef unsigned long ULONG_PTR_;
+# endif
+
+    typedef struct _LARGE_INTEGER {
+        LONGLONG_ QuadPart;
+    } LARGE_INTEGER_;
+    typedef LARGE_INTEGER_ *PLARGE_INTEGER_;
+
+    typedef void *PVOID_;
+    typedef void *LPVOID_;
+    typedef const void *LPCVOID_;
+
+    typedef char CHAR_;
+    typedef CHAR_ *LPSTR_;
+    typedef const CHAR_ *LPCSTR_;
+
+    typedef wchar_t WCHAR_;
+    typedef WCHAR_ *LPWSTR_;
+    typedef const WCHAR_ *LPCWSTR_;
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_BASIC_TYPES_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/config.hpp b/gatb-core/thirdparty/boost/detail/winapi/config.hpp
new file mode 100644
index 0000000..2b0cdfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/config.hpp
@@ -0,0 +1,53 @@
+//  config.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
+#define BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+// These constants reflect _WIN32_WINNT_* macros from sdkddkver.h
+// See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx#setting_winver_or__win32_winnt
+#define BOOST_WINAPI_VERSION_NT4 0x0400
+#define BOOST_WINAPI_VERSION_WIN2K 0x0500
+#define BOOST_WINAPI_VERSION_WINXP 0x0501
+#define BOOST_WINAPI_VERSION_WS03 0x0502
+#define BOOST_WINAPI_VERSION_WIN6 0x0600
+#define BOOST_WINAPI_VERSION_VISTA 0x0600
+#define BOOST_WINAPI_VERSION_WS08 0x0600
+#define BOOST_WINAPI_VERSION_LONGHORN 0x0600
+#define BOOST_WINAPI_VERSION_WIN7 0x0601
+#define BOOST_WINAPI_VERSION_WIN8 0x0602
+#define BOOST_WINAPI_VERSION_WINBLUE 0x0603
+
+#if !defined(BOOST_USE_WINAPI_VERSION)
+#if defined(_WIN32_WINNT)
+#define BOOST_USE_WINAPI_VERSION _WIN32_WINNT
+#elif defined(WINVER)
+#define BOOST_USE_WINAPI_VERSION WINVER
+#else
+// By default use Windows XP API
+#define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WINXP
+#endif
+#endif
+
+#if defined(BOOST_USE_WINDOWS_H)
+// We have to define the version macros so that windows.h provides the necessary symbols
+#if !defined(_WIN32_WINNT)
+#define _WIN32_WINNT BOOST_USE_WINAPI_VERSION
+#endif
+#if !defined(WINVER)
+#define WINVER BOOST_USE_WINAPI_VERSION
+#endif
+#endif
+
+#endif // BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
diff --git a/gatb-core/thirdparty/boost/detail/winapi/crypt.hpp b/gatb-core/thirdparty/boost/detail/winapi/crypt.hpp
new file mode 100644
index 0000000..c9108f2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/crypt.hpp
@@ -0,0 +1,88 @@
+//  crypt.hpp  --------------------------------------------------------------//
+
+//  Copyright 2014 Antony Polukhin
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CRYPT_HPP
+#define BOOST_DETAIL_WINAPI_CRYPT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef HCRYPTPROV HCRYPTPROV_;
+
+    using ::CryptEnumProvidersA;
+    using ::CryptAcquireContextA;
+    using ::CryptGenRandom;
+    using ::CryptReleaseContext;
+
+    const DWORD_ PROV_RSA_FULL_         = PROV_RSA_FULL;
+
+    const DWORD_ CRYPT_VERIFYCONTEXT_   = CRYPT_VERIFYCONTEXT;
+    const DWORD_ CRYPT_NEWKEYSET_       = CRYPT_NEWKEYSET;
+    const DWORD_ CRYPT_DELETEKEYSET_    = CRYPT_DELETEKEYSET;
+    const DWORD_ CRYPT_MACHINE_KEYSET_  = CRYPT_MACHINE_KEYSET;
+    const DWORD_ CRYPT_SILENT_          = CRYPT_SILENT;
+#else
+extern "C" {
+    typedef ULONG_PTR_ HCRYPTPROV_;
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptEnumProvidersA(
+            DWORD_ dwIndex,
+            DWORD_ *pdwReserved,
+            DWORD_ dwFlags,
+            DWORD_ *pdwProvType,
+            LPSTR_ szProvName,
+            DWORD_ *pcbProvName
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptAcquireContextA(
+            HCRYPTPROV_ *phProv,
+            LPCSTR_ pszContainer,
+            LPCSTR_ pszProvider,
+            DWORD_ dwProvType,
+            DWORD_ dwFlags
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptGenRandom(
+            HCRYPTPROV_ hProv,
+            DWORD_ dwLen,
+            BYTE_ *pbBuffer
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptReleaseContext(
+            HCRYPTPROV_ hProv,
+            DWORD_ dwFlags
+    );
+
+    const DWORD_ PROV_RSA_FULL_         = 1;
+
+    const DWORD_ CRYPT_VERIFYCONTEXT_   = 0xF0000000;
+    const DWORD_ CRYPT_NEWKEYSET_       = 8;
+    const DWORD_ CRYPT_DELETEKEYSET_    = 16;
+    const DWORD_ CRYPT_MACHINE_KEYSET_  = 32;
+    const DWORD_ CRYPT_SILENT_          = 64;
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_CRYPT_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/directory_management.hpp b/gatb-core/thirdparty/boost/detail/winapi/directory_management.hpp
new file mode 100644
index 0000000..19af1ee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/directory_management.hpp
@@ -0,0 +1,46 @@
+//  directory_management.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_DIRECTORY_MANAGEMENT_HPP
+#define BOOST_DETAIL_WINAPI_DIRECTORY_MANAGEMENT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/security.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::CreateDirectory;
+    using ::CreateDirectoryA;
+    using ::GetTempPathA;
+    using ::RemoveDirectoryA;
+#else
+extern "C" { 
+    __declspec(dllimport) int __stdcall 
+        CreateDirectory(LPCTSTR_, LPSECURITY_ATTRIBUTES_*);
+    __declspec(dllimport) int __stdcall 
+        CreateDirectoryA(LPCTSTR_, interprocess_security_attributes*);
+    __declspec(dllimport) int __stdcall 
+        GetTempPathA(unsigned long length, char *buffer);
+    __declspec(dllimport) int __stdcall 
+        RemoveDirectoryA(LPCTSTR_);
+}    
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_THREAD_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/dll.hpp b/gatb-core/thirdparty/boost/detail/winapi/dll.hpp
new file mode 100644
index 0000000..2ec5a73
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/dll.hpp
@@ -0,0 +1,86 @@
+//  dll.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_DLL_HPP
+#define BOOST_DETAIL_WINAPI_DLL_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/security.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef ::FARPROC FARPROC_;
+    typedef ::NEARPROC NEARPROC_;
+    typedef ::PROC PROC_;
+
+# ifdef BOOST_NO_ANSI_APIS
+    using ::LoadLibraryW;
+    using ::GetModuleHandleW;
+# else
+    using ::LoadLibraryA;
+    using ::GetModuleHandleA;
+# endif
+    using ::FreeLibrary;
+    using ::GetProcAddress;
+#else
+extern "C" {
+# ifdef _WIN64
+    typedef INT_PTR_ (WINAPI *FARPROC_)();
+    typedef INT_PTR_ (WINAPI *NEARPROC_)();
+    typedef INT_PTR_ (WINAPI *PROC_)();
+# else
+    typedef int (WINAPI *FARPROC_)();
+    typedef int (WINAPI *NEARPROC_)();
+    typedef int (WINAPI *PROC_)();
+# endif // _WIN64
+
+# ifdef BOOST_NO_ANSI_APIS
+    __declspec(dllimport) HMODULE_ WINAPI
+        LoadLibraryW(
+            LPCWSTR_ lpFileName
+    );
+    __declspec(dllimport) HMODULE_ WINAPI
+        GetModuleHandleW(
+            LPCWSTR_ lpFileName
+    );
+# else
+    __declspec(dllimport) HMODULE_ WINAPI
+        LoadLibraryA(
+            LPCSTR_ lpFileName
+    );
+    __declspec(dllimport) HMODULE_ WINAPI
+        GetModuleHandleA(
+            LPCSTR_ lpFileName
+    );
+# endif
+
+    __declspec(dllimport) BOOL_ WINAPI
+        FreeLibrary(
+            HMODULE_ hModule
+    );
+    __declspec(dllimport) FARPROC_ WINAPI
+        GetProcAddress(
+            HMODULE_ hModule,
+            LPCSTR_ lpProcName
+    );
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_DLL_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/error_handling.hpp b/gatb-core/thirdparty/boost/detail/winapi/error_handling.hpp
new file mode 100644
index 0000000..fbe9924
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/error_handling.hpp
@@ -0,0 +1,93 @@
+//  error_handling.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
+#define BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/GetCurrentThread.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::FormatMessageA;
+    using ::FormatMessageW;
+
+    const int FORMAT_MESSAGE_ALLOCATE_BUFFER_= FORMAT_MESSAGE_ALLOCATE_BUFFER;
+    const int FORMAT_MESSAGE_IGNORE_INSERTS_=  FORMAT_MESSAGE_IGNORE_INSERTS;
+    const int FORMAT_MESSAGE_FROM_STRING_=     FORMAT_MESSAGE_FROM_STRING;
+    const int FORMAT_MESSAGE_FROM_HMODULE_=    FORMAT_MESSAGE_FROM_HMODULE;
+    const int FORMAT_MESSAGE_FROM_SYSTEM_=     FORMAT_MESSAGE_FROM_SYSTEM;
+    const int FORMAT_MESSAGE_ARGUMENT_ARRAY_=  FORMAT_MESSAGE_ARGUMENT_ARRAY;
+    const int FORMAT_MESSAGE_MAX_WIDTH_MASK_=  FORMAT_MESSAGE_MAX_WIDTH_MASK;
+
+    const char LANG_NEUTRAL_=                  LANG_NEUTRAL;
+    const char LANG_INVARIANT_=                LANG_INVARIANT;
+
+    const char SUBLANG_DEFAULT_=               SUBLANG_DEFAULT;    // user default
+    inline WORD_ MAKELANGID_(WORD_ p, WORD_ s) {
+        return MAKELANGID(p,s);
+    }
+#else
+extern "C" {
+    //                using ::FormatMessageA;
+    __declspec(dllimport)
+    DWORD_
+    WINAPI
+    FormatMessageA(
+        DWORD_ dwFlags,
+        LPCVOID_ lpSource,
+        DWORD_ dwMessageId,
+        DWORD_ dwLanguageId,
+        LPSTR_ lpBuffer,
+        DWORD_ nSize,
+        va_list *Arguments
+        );
+
+    //                using ::FormatMessageW;
+    __declspec(dllimport)
+    DWORD_
+    WINAPI
+    FormatMessageW(
+        DWORD_ dwFlags,
+        LPCVOID_ lpSource,
+        DWORD_ dwMessageId,
+        DWORD_ dwLanguageId,
+        LPWSTR_ lpBuffer,
+        DWORD_ nSize,
+        va_list *Arguments
+        );
+
+    const int FORMAT_MESSAGE_ALLOCATE_BUFFER_= 0x00000100;
+    const int FORMAT_MESSAGE_IGNORE_INSERTS_=  0x00000200;
+    const int FORMAT_MESSAGE_FROM_STRING_=     0x00000400;
+    const int FORMAT_MESSAGE_FROM_HMODULE_=    0x00000800;
+    const int FORMAT_MESSAGE_FROM_SYSTEM_=     0x00001000;
+    const int FORMAT_MESSAGE_ARGUMENT_ARRAY_=  0x00002000;
+    const int FORMAT_MESSAGE_MAX_WIDTH_MASK_=  0x000000FF;
+
+    const char LANG_NEUTRAL_=                  0x00;
+    const char LANG_INVARIANT_=                0x7f;
+
+    const char SUBLANG_DEFAULT_=               0x01;    // user default
+    inline WORD_ MAKELANGID_(WORD_ p, WORD_ s) {
+        return ((((WORD_  )(s)) << 10) | (WORD_  )(p));
+    }
+
+}
+#endif
+}
+}
+}
+#endif // BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/file_management.hpp b/gatb-core/thirdparty/boost/detail/winapi/file_management.hpp
new file mode 100644
index 0000000..c1d5978
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/file_management.hpp
@@ -0,0 +1,130 @@
+//  thread.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_FILE_MANAGEMENT_HPP
+#define BOOST_DETAIL_WINAPI_FILE_MANAGEMENT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/security.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::CreateFileA;
+    using ::DeleteFileA;
+    using ::FindFirstFileA;
+    using ::FindNextFileA;
+    using ::FindClose;
+    using ::GetFileSizeEx;
+    using ::MoveFileExA;
+    using ::SetFileValidData;
+#else
+extern "C" {
+    typedef struct _OVERLAPPED {
+      ULONG_PTR Internal;
+      ULONG_PTR InternalHigh;
+      union {
+        struct {
+          DWORD Offset;
+          DWORD OffsetHigh;
+        } ;
+        PVOID  Pointer;
+      } ;
+      HANDLE    hEvent;
+    } OVERLAPPED, *LPOVERLAPPED;
+
+    
+    __declspec(dllimport) void * __stdcall 
+        CreateFileA (const char *, unsigned long, unsigned long, struct SECURITY_ATTRIBUTES_*, unsigned long, unsigned long, void *);
+    __declspec(dllimport) int __stdcall    
+        DeleteFileA (const char *);
+    __declspec(dllimport) void *__stdcall 
+        FindFirstFileA(const char *lpFileName, win32_find_data_t *lpFindFileData);
+    __declspec(dllimport) int   __stdcall 
+        FindNextFileA(void *hFindFile, win32_find_data_t *lpFindFileData);
+    __declspec(dllimport) int   __stdcall 
+        FindClose(void *hFindFile);
+    __declspec(dllimport) BOOL __stdcall 
+        GetFileSizeEx(
+            HANDLE_ hFile,
+            PLARGE_INTEGER_ lpFileSize
+    );
+    __declspec(dllimport) int __stdcall    
+        MoveFileExA (const char *, const char *, unsigned long);
+    __declspec(dllimport) BOOL_ __stdcall 
+        SetFileValidData(
+            HANDLE_ hFile,
+            LONGLONG_ ValidDataLength
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        SetEndOfFile(
+            HANDLE_ hFile
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        SetFilePointerEx(
+            HANDLE_ hFile,
+            LARGE_INTEGER_ liDistanceToMove,
+            PLARGE_INTEGER_ lpNewFilePointer,
+            DWORD_ dwMoveMethod
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        LockFile(
+            HANDLE_ hFile,
+            DWORD_ dwFileOffsetLow,
+            DWORD_ dwFileOffsetHigh,
+            DWORD_ nNumberOfBytesToLockLow,
+            DWORD_ nNumberOfBytesToLockHigh
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        UnlockFile(
+            HANDLE_ hFile,
+            DWORD_ dwFileOffsetLow,
+            DWORD_ dwFileOffsetHigh,
+            DWORD_ nNumberOfBytesToUnlockLow,
+            DWORD_ nNumberOfBytesToUnlockHigh
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        LockFileEx(
+            HANDLE_ hFile,
+            DWORD_ dwFlags,
+            DWORD_ dwReserved,
+            DWORD_ nNumberOfBytesToLockLow,
+            DWORD_ nNumberOfBytesToLockHigh,
+            LPOVERLAPPED_ lpOverlapped
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        UnlockFileEx(
+            HANDLE_ hFile,
+            DWORD_ dwReserved,
+            DWORD_ nNumberOfBytesToUnlockLow,
+            DWORD_ nNumberOfBytesToUnlockHigh,
+            LPOVERLAPPED_ lpOverlapped
+    );
+    __declspec(dllimport) BOOL_ __stdcall
+        WriteFile(
+            HANDLE_ hFile,
+            LPCVOID_ lpBuffer,
+            DWORD_ nNumberOfBytesToWrite,
+            LPDWORD_ lpNumberOfBytesWritten,
+            LPOVERLAPPED_ lpOverlapped
+    );
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_THREAD_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/handles.hpp b/gatb-core/thirdparty/boost/detail/winapi/handles.hpp
new file mode 100644
index 0000000..7108daa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/handles.hpp
@@ -0,0 +1,46 @@
+//  memory.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_HANDLES_HPP
+#define BOOST_DETAIL_WINAPI_HANDLES_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::CloseHandle;
+    using ::DuplicateHandle;
+
+    const DWORD_ duplicate_close_source = DUPLICATE_CLOSE_SOURCE;
+    const DWORD_ duplicate_same_access = DUPLICATE_SAME_ACCESS;
+    const HANDLE_ invalid_handle_value = INVALID_HANDLE_VALUE;
+#else
+extern "C" {
+    __declspec(dllimport) int __stdcall
+        CloseHandle(void*);
+    __declspec(dllimport) int __stdcall
+        DuplicateHandle(void*,void*,void*,void**,unsigned long,int,unsigned long);
+}
+    const DWORD_ duplicate_close_source = 1;
+    const DWORD_ duplicate_same_access = 2;
+    const HANDLE_ invalid_handle_value = (HANDLE_)(-1);
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_HANDLES_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/memory.hpp b/gatb-core/thirdparty/boost/detail/winapi/memory.hpp
new file mode 100644
index 0000000..b5316e0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/memory.hpp
@@ -0,0 +1,60 @@
+//  memory.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_MEMORY_HPP
+#define BOOST_DETAIL_WINAPI_MEMORY_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/security.hpp>
+#include <boost/detail/winapi/LocalFree.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::CreateFileMappingA;
+    using ::FlushViewOfFile;
+    using ::GetProcessHeap;
+    using ::HeapAlloc;
+    using ::HeapFree;
+    using ::MapViewOfFileEx;
+    using ::OpenFileMappingA;
+    using ::UnmapViewOfFile;
+#else
+#undef HeapAlloc
+extern "C" {
+    __declspec(dllimport) void * __stdcall 
+        CreateFileMappingA (void *, SECURITY_ATTRIBUTES_*, unsigned long, unsigned long, unsigned long, const char *);
+    __declspec(dllimport) int __stdcall 
+        FlushViewOfFile (void *, std::size_t);
+    __declspec(dllimport) HANDLE_ __stdcall 
+        GetProcessHeap();
+    __declspec(dllimport) void* __stdcall 
+        HeapAlloc(HANDLE_,DWORD_,SIZE_T_);
+    __declspec(dllimport) BOOL_ __stdcall 
+        HeapFree(HANDLE_,DWORD_,LPVOID_);
+    __declspec(dllimport) void * __stdcall 
+        MapViewOfFileEx (void *, unsigned long, unsigned long, unsigned long, std::size_t, void*);
+    __declspec(dllimport) void * __stdcall 
+        OpenFileMappingA (unsigned long, int, const char *);
+    __declspec(dllimport) int __stdcall 
+        UnmapViewOfFile(void *);
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_MEMORY_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/process.hpp b/gatb-core/thirdparty/boost/detail/winapi/process.hpp
new file mode 100644
index 0000000..de287b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/process.hpp
@@ -0,0 +1,36 @@
+//  process.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_PROCESS_HPP
+#define BOOST_DETAIL_WINAPI_PROCESS_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/GetCurrentProcess.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetCurrentProcessId;
+#else
+# ifndef UNDER_CE
+extern "C" {
+    __declspec(dllimport) DWORD_ WINAPI GetCurrentProcessId(void);
+}
+# else
+    using ::GetCurrentProcessId;
+# endif
+#endif
+}
+}
+}
+#endif // BOOST_DETAIL_WINAPI_PROCESS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/security.hpp b/gatb-core/thirdparty/boost/detail/winapi/security.hpp
new file mode 100644
index 0000000..79925c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/security.hpp
@@ -0,0 +1,65 @@
+//  security.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_SECURITY_HPP
+#define BOOST_DETAIL_WINAPI_SECURITY_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+typedef ::SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES_;
+typedef ::PSECURITY_ATTRIBUTES PSECURITY_ATTRIBUTES_;
+typedef ::LPSECURITY_ATTRIBUTES LPSECURITY_ATTRIBUTES_;
+    
+#else
+extern "C" { 
+    struct SECURITY_DESCRIPTOR_;
+    typedef SECURITY_DESCRIPTOR_* PSECURITY_DESCRIPTOR_;
+    typedef struct _ACL {
+      BYTE_ AclRevision;
+      BYTE_ Sbz1;
+      WORD_ AclSize;
+      WORD_ AceCount;
+      WORD_ Sbz2;
+    } ACL_, *PACL_;
+
+    typedef struct _SECURITY_ATTRIBUTES {
+      DWORD_  nLength;
+      LPVOID_ lpSecurityDescriptor;
+      BOOL_   bInheritHandle;
+    } SECURITY_ATTRIBUTES_, *PSECURITY_ATTRIBUTES_, *LPSECURITY_ATTRIBUTES_;
+
+    __declspec(dllimport) BOOL_ __stdcall 
+        InitializeSecurityDescriptor(
+            PSECURITY_DESCRIPTOR_ pSecurityDescriptor,
+            DWORD_ dwRevision
+    );
+    __declspec(dllimport) BOOL_ __stdcall 
+        SetSecurityDescriptorDacl(
+            PSECURITY_DESCRIPTOR_ pSecurityDescriptor,
+            BOOL_ bDaclPresent,
+            PACL_ pDacl,
+            BOOL_ bDaclDefaulted
+    );
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_SECURITY_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/synchronization.hpp b/gatb-core/thirdparty/boost/detail/winapi/synchronization.hpp
new file mode 100644
index 0000000..b9497cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/synchronization.hpp
@@ -0,0 +1,293 @@
+//  synchronizaion.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
+#define BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef ::CRITICAL_SECTION CRITICAL_SECTION_;
+    typedef ::PAPCFUNC PAPCFUNC_;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    typedef ::INIT_ONCE INIT_ONCE_;
+    typedef ::PINIT_ONCE PINIT_ONCE_;
+    typedef ::LPINIT_ONCE LPINIT_ONCE_;
+    #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
+    typedef ::PINIT_ONCE_FN PINIT_ONCE_FN_;
+
+    typedef ::SRWLOCK SRWLOCK_;
+    typedef ::PSRWLOCK PSRWLOCK_;
+    #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
+
+    typedef ::CONDITION_VARIABLE CONDITION_VARIABLE_;
+    typedef ::PCONDITION_VARIABLE PCONDITION_VARIABLE_;
+    #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
+#endif
+
+    using ::InitializeCriticalSection;
+#if BOOST_USE_WINAPI_VERSION >= 0x0403
+    using ::InitializeCriticalSectionAndSpinCount;
+#endif
+    using ::EnterCriticalSection;
+    using ::TryEnterCriticalSection;
+    using ::LeaveCriticalSection;
+    using ::DeleteCriticalSection;
+
+# ifdef BOOST_NO_ANSI_APIS
+    using ::CreateMutexW;
+    using ::OpenMutexW;
+    using ::CreateEventW;
+    using ::OpenEventW;
+    using ::CreateSemaphoreW;
+    using ::OpenSemaphoreW;
+# else
+    using ::CreateMutexA;
+    using ::OpenMutexA;
+    using ::CreateEventA;
+    using ::OpenEventA;
+    using ::CreateSemaphoreA;
+    using ::OpenSemaphoreA;
+# endif
+    using ::ReleaseMutex;
+    using ::ReleaseSemaphore;
+    using ::SetEvent;
+    using ::ResetEvent;
+    using ::WaitForMultipleObjects;
+    using ::WaitForSingleObject;
+    using ::QueueUserAPC;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    using ::InitOnceInitialize;
+    using ::InitOnceExecuteOnce;
+    using ::InitOnceBeginInitialize;
+    using ::InitOnceComplete;
+
+    using ::InitializeSRWLock;
+    using ::AcquireSRWLockExclusive;
+    using ::TryAcquireSRWLockExclusive;
+    using ::ReleaseSRWLockExclusive;
+    using ::AcquireSRWLockShared;
+    using ::TryAcquireSRWLockShared;
+    using ::ReleaseSRWLockShared;
+
+    using ::InitializeConditionVariable;
+    using ::WakeConditionVariable;
+    using ::WakeAllConditionVariable;
+    using ::SleepConditionVariableCS;
+    using ::SleepConditionVariableSRW;
+#endif
+
+    const DWORD_ infinite       = INFINITE;
+    const DWORD_ wait_abandoned = WAIT_ABANDONED;
+    const DWORD_ wait_object_0  = WAIT_OBJECT_0;
+    const DWORD_ wait_timeout   = WAIT_TIMEOUT;
+    const DWORD_ wait_failed    = WAIT_FAILED;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    const DWORD_ init_once_async = INIT_ONCE_ASYNC;
+    const DWORD_ init_once_check_only = INIT_ONCE_CHECK_ONLY;
+    const DWORD_ init_once_init_failed = INIT_ONCE_INIT_FAILED;
+    const DWORD_ init_once_ctx_reserved_bits = INIT_ONCE_CTX_RESERVED_BITS;
+
+    const ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED;
+#endif
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+extern "C" {
+
+    typedef struct CRITICAL_SECTION_
+    {
+        struct critical_section_debug * DebugInfo;
+        long LockCount;
+        long RecursionCount;
+        void * OwningThread;
+        void * LockSemaphore;
+    #if defined(_WIN64)
+        unsigned __int64 SpinCount;
+    #else
+        unsigned long SpinCount;
+    #endif
+    }
+    *PCRITICAL_SECTION_;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    typedef union INIT_ONCE_
+    {
+        PVOID_ Ptr;
+    }
+    *PINIT_ONCE_, *LPINIT_ONCE_;
+    #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT {0}
+    typedef BOOL_ (WINAPI *PINIT_ONCE_FN_)(PINIT_ONCE_ InitOnce, PVOID_ Parameter, PVOID_ *Context);
+
+    typedef struct SRWLOCK_
+    {
+        PVOID_ Ptr;
+    }
+    * PSRWLOCK_;
+    #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT {0}
+
+    typedef struct CONDITION_VARIABLE_
+    {
+        PVOID_ Ptr;
+    }
+    * PCONDITION_VARIABLE_;
+    #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT {0}
+
+#endif
+
+    __declspec(dllimport) void WINAPI
+        InitializeCriticalSection(PCRITICAL_SECTION_);
+#if BOOST_USE_WINAPI_VERSION >= 0x0403
+    __declspec(dllimport) BOOL_ WINAPI
+        InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCS, DWORD_ dwSpinCount);
+#endif
+    __declspec(dllimport) void WINAPI
+        EnterCriticalSection(PCRITICAL_SECTION_);
+    __declspec(dllimport) BOOL_ WINAPI
+        TryEnterCriticalSection(PCRITICAL_SECTION_);
+    __declspec(dllimport) void WINAPI
+        LeaveCriticalSection(PCRITICAL_SECTION_);
+    __declspec(dllimport) void WINAPI
+        DeleteCriticalSection(PCRITICAL_SECTION_);
+
+     struct _SECURITY_ATTRIBUTES;
+# ifdef BOOST_NO_ANSI_APIS
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateMutexW(_SECURITY_ATTRIBUTES*, BOOL_, LPCWSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenMutexW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateSemaphoreW(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCWSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenSemaphoreW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateEventW(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCWSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenEventW(DWORD_, BOOL_, LPCWSTR_);
+# else
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateMutexA(_SECURITY_ATTRIBUTES*, BOOL_, LPCSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenMutexA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateSemaphoreA(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenSemaphoreA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
+    __declspec(dllimport) HANDLE_ WINAPI
+        CreateEventA(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCSTR_);
+    __declspec(dllimport) HANDLE_ WINAPI
+        OpenEventA(DWORD_, BOOL_, LPCSTR_);
+# endif
+    __declspec(dllimport) BOOL_ WINAPI
+        ReleaseMutex(HANDLE_);
+    __declspec(dllimport) DWORD_ WINAPI
+        WaitForSingleObject(HANDLE_, DWORD_);
+    __declspec(dllimport) DWORD_ WINAPI
+        WaitForMultipleObjects(DWORD_ nCount,
+                HANDLE_ const * lpHandles,
+                BOOL_ bWaitAll,
+                DWORD_ dwMilliseconds);
+    __declspec(dllimport) BOOL_ WINAPI
+        ReleaseSemaphore(HANDLE_, LONG_, LONG_*);
+    __declspec(dllimport) BOOL_ WINAPI
+        SetEvent(HANDLE_);
+    __declspec(dllimport) BOOL_ WINAPI
+        ResetEvent(HANDLE_);
+
+    typedef void (__stdcall *PAPCFUNC_)(ULONG_PTR_);
+    __declspec(dllimport) DWORD_ WINAPI
+        QueueUserAPC(PAPCFUNC_, HANDLE_, ULONG_PTR_);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    __declspec(dllimport) void WINAPI InitOnceInitialize(PINIT_ONCE_);
+    __declspec(dllimport) BOOL_ WINAPI InitOnceExecuteOnce(PINIT_ONCE_ InitOnce, PINIT_ONCE_FN_ InitFn, PVOID_ Parameter, LPVOID_* Context);
+    __declspec(dllimport) BOOL_ WINAPI InitOnceBeginInitialize(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, BOOL_* fPending, LPVOID_* lpContext);
+    __declspec(dllimport) BOOL_ WINAPI InitOnceComplete(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, LPVOID_* lpContext);
+
+
+    __declspec(dllimport) void WINAPI InitializeSRWLock(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) void WINAPI AcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) void WINAPI ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) void WINAPI AcquireSRWLockShared(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockShared(PSRWLOCK_ SRWLock);
+    __declspec(dllimport) void WINAPI ReleaseSRWLockShared(PSRWLOCK_ SRWLock);
+
+    __declspec(dllimport) void WINAPI InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
+    __declspec(dllimport) void WINAPI WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
+    __declspec(dllimport) void WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
+    __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable, PCRITICAL_SECTION_ CriticalSection, DWORD_ dwMilliseconds);
+    __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable, PSRWLOCK_ SRWLock, DWORD_ dwMilliseconds, ULONG_ Flags);
+#endif
+
+} // extern "C"
+
+const DWORD_ infinite       = (DWORD_)0xFFFFFFFF;
+const DWORD_ wait_abandoned = 0x00000080L;
+const DWORD_ wait_object_0  = 0x00000000L;
+const DWORD_ wait_timeout   = 0x00000102L;
+const DWORD_ wait_failed    = (DWORD_)0xFFFFFFFF;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ init_once_async = 0x00000002UL;
+const DWORD_ init_once_check_only = 0x00000001UL;
+const DWORD_ init_once_init_failed = 0x00000004UL;
+const DWORD_ init_once_ctx_reserved_bits = 2;
+
+const ULONG_ condition_variable_lockmode_shared = 0x00000001;
+#endif
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ max_non_infinite_wait = (DWORD_)0xFFFFFFFE;
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bInitialOwner)
+{
+#ifdef BOOST_NO_ANSI_APIS
+    return CreateMutexW(lpAttributes, bInitialOwner, 0);
+#else
+    return CreateMutexA(lpAttributes, bInitialOwner, 0);
+#endif
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(_SECURITY_ATTRIBUTES* lpAttributes, LONG_ lInitialCount, LONG_ lMaximumCount)
+{
+#ifdef BOOST_NO_ANSI_APIS
+    return CreateSemaphoreW(lpAttributes, lInitialCount, lMaximumCount, 0);
+#else
+    return CreateSemaphoreA(lpAttributes, lInitialCount, lMaximumCount, 0);
+#endif
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_event(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bManualReset, BOOL_ bInitialState)
+{
+#ifdef BOOST_NO_ANSI_APIS
+    return CreateEventW(lpAttributes, bManualReset, bInitialState, 0);
+#else
+    return CreateEventA(lpAttributes, bManualReset, bInitialState, 0);
+#endif
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/system.hpp b/gatb-core/thirdparty/boost/detail/winapi/system.hpp
new file mode 100644
index 0000000..2c2d82a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/system.hpp
@@ -0,0 +1,62 @@
+//  system.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+//  Copyright (c) Microsoft Corporation 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_SYSTEM_HPP
+#define BOOST_DETAIL_WINAPI_SYSTEM_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef ::SYSTEM_INFO SYSTEM_INFO_;
+# if BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_WINXP
+extern "C" __declspec(dllimport) void __stdcall GetSystemInfo (struct system_info *);
+# else
+extern "C" __declspec(dllimport) void __stdcall GetNativeSystemInfo (struct system_info *);
+# endif
+#else
+extern "C" {
+    typedef struct _SYSTEM_INFO {
+      union {
+        DWORD_  dwOemId;
+        struct {
+          WORD_ wProcessorArchitecture;
+          WORD_ wReserved;
+        } dummy;
+      } ;
+      DWORD_     dwPageSize;
+      LPVOID_    lpMinimumApplicationAddress;
+      LPVOID_    lpMaximumApplicationAddress;
+      DWORD_PTR_ dwActiveProcessorMask;
+      DWORD_     dwNumberOfProcessors;
+      DWORD_     dwProcessorType;
+      DWORD_     dwAllocationGranularity;
+      WORD_      wProcessorLevel;
+      WORD_      wProcessorRevision;
+    } SYSTEM_INFO_;
+
+# if BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_WINXP
+    __declspec(dllimport) void __stdcall 
+        GetSystemInfo (struct system_info *);
+# else
+    __declspec(dllimport) void __stdcall 
+        GetNativeSystemInfo (struct system_info *);
+# endif
+}    
+#endif
+}
+}
+}
+#endif // BOOST_DETAIL_WINAPI_SYSTEM_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/thread.hpp b/gatb-core/thirdparty/boost/detail/winapi/thread.hpp
new file mode 100644
index 0000000..ee0dac6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/thread.hpp
@@ -0,0 +1,49 @@
+//  thread.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_THREAD_HPP
+#define BOOST_DETAIL_WINAPI_THREAD_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/GetCurrentThread.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::GetCurrentThreadId;
+    using ::SleepEx;
+    using ::Sleep;
+    using ::SwitchToThread;
+#else
+extern "C" {
+# ifndef UNDER_CE
+    __declspec(dllimport) DWORD_ WINAPI GetCurrentThreadId(void);
+    __declspec(dllimport) DWORD_ WINAPI SleepEx(DWORD_, BOOL_);
+    __declspec(dllimport) void WINAPI Sleep(DWORD_);
+    __declspec(dllimport) BOOL_ WINAPI SwitchToThread(void);
+#else
+    using ::GetCurrentThreadId;
+    using ::SleepEx;
+    using ::Sleep;
+    using ::SwitchToThread;
+#endif
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_THREAD_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/thread_pool.hpp b/gatb-core/thirdparty/boost/detail/winapi/thread_pool.hpp
new file mode 100644
index 0000000..57059dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/thread_pool.hpp
@@ -0,0 +1,96 @@
+//  thread_pool.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
+#define BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+typedef ::WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACKFUNC_;
+typedef ::WAITORTIMERCALLBACK WAITORTIMERCALLBACK_;
+
+using ::RegisterWaitForSingleObject;
+using ::UnregisterWait;
+using ::UnregisterWaitEx;
+
+const ULONG_ wt_execute_default = WT_EXECUTEDEFAULT;
+const ULONG_ wt_execute_in_io_thread = WT_EXECUTEINIOTHREAD;
+const ULONG_ wt_execute_in_ui_thread = WT_EXECUTEINUITHREAD;
+const ULONG_ wt_execute_in_wait_thread = WT_EXECUTEINWAITTHREAD;
+const ULONG_ wt_execute_only_once = WT_EXECUTEONLYONCE;
+const ULONG_ wt_execute_in_timer_thread = WT_EXECUTEINTIMERTHREAD;
+const ULONG_ wt_execute_long_function = WT_EXECUTELONGFUNCTION;
+const ULONG_ wt_execute_in_persistent_io_thread = WT_EXECUTEINPERSISTENTIOTHREAD;
+const ULONG_ wt_execute_in_persistent_thread = WT_EXECUTEINPERSISTENTTHREAD;
+const ULONG_ wt_transfer_impersonation = WT_TRANSFER_IMPERSONATION;
+
+inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
+{
+    return WT_SET_MAX_THREADPOOL_THREADS(flags, limit);
+}
+
+#else
+
+extern "C" {
+
+typedef void (NTAPI* WAITORTIMERCALLBACKFUNC_) (PVOID_, BOOLEAN_);
+typedef WAITORTIMERCALLBACKFUNC_ WAITORTIMERCALLBACK_;
+
+__declspec(dllimport) BOOL_ WINAPI RegisterWaitForSingleObject
+(
+    HANDLE_* phNewWaitObject,
+    HANDLE_ hObject,
+    WAITORTIMERCALLBACK_ Callback,
+    PVOID_ Context,
+    ULONG_ dwMilliseconds,
+    ULONG_ dwFlags
+);
+
+__declspec(dllimport) BOOL_ WINAPI UnregisterWait(HANDLE_ WaitHandle);
+__declspec(dllimport) BOOL_ WINAPI UnregisterWaitEx(HANDLE_ WaitHandle, HANDLE_ CompletionEvent);
+
+} // extern "C"
+
+const ULONG_ wt_execute_default = 0x00000000;
+const ULONG_ wt_execute_in_io_thread = 0x00000001;
+const ULONG_ wt_execute_in_ui_thread = 0x00000002;
+const ULONG_ wt_execute_in_wait_thread = 0x00000004;
+const ULONG_ wt_execute_only_once = 0x00000008;
+const ULONG_ wt_execute_in_timer_thread = 0x00000020;
+const ULONG_ wt_execute_long_function = 0x00000010;
+const ULONG_ wt_execute_in_persistent_io_thread = 0x00000040;
+const ULONG_ wt_execute_in_persistent_thread = 0x00000080;
+const ULONG_ wt_transfer_impersonation = 0x00000100;
+
+inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
+{
+    return flags | (limit << 16);
+}
+
+#endif
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
+
+#endif // BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/time.hpp b/gatb-core/thirdparty/boost/detail/winapi/time.hpp
new file mode 100644
index 0000000..6a6b447
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/time.hpp
@@ -0,0 +1,105 @@
+//  time.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+//  Copyright (c) Microsoft Corporation 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_TIME_HPP
+#define BOOST_DETAIL_WINAPI_TIME_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/predef.h>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+    typedef FILETIME FILETIME_;
+    typedef PFILETIME PFILETIME_;
+    typedef LPFILETIME LPFILETIME_;
+
+    typedef SYSTEMTIME SYSTEMTIME_;
+    typedef SYSTEMTIME* PSYSTEMTIME_;
+
+    #ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME  // Windows CE does not define GetSystemTimeAsFileTime
+    using ::GetSystemTimeAsFileTime;
+    #endif
+    #if BOOST_PLAT_WINDOWS_DESKTOP
+    using ::FileTimeToLocalFileTime;
+    #endif
+    using ::GetSystemTime;
+    using ::SystemTimeToFileTime;
+    
+    #if BOOST_PLAT_WINDOWS_DESKTOP
+    using ::GetTickCount;
+    #endif
+    #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    using ::GetTickCount64;
+    #endif
+
+#else
+
+extern "C" {
+    typedef struct _FILETIME {
+        DWORD_ dwLowDateTime;
+        DWORD_ dwHighDateTime;
+    } FILETIME_, *PFILETIME_, *LPFILETIME_;
+
+    typedef struct _SYSTEMTIME {
+      WORD_ wYear;
+      WORD_ wMonth;
+      WORD_ wDayOfWeek;
+      WORD_ wDay;
+      WORD_ wHour;
+      WORD_ wMinute;
+      WORD_ wSecond;
+      WORD_ wMilliseconds;
+    } SYSTEMTIME_, *PSYSTEMTIME_;
+
+    #ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME  // Windows CE does not define GetSystemTimeAsFileTime
+    __declspec(dllimport) void WINAPI
+        GetSystemTimeAsFileTime(FILETIME_* lpFileTime);
+    #endif
+    __declspec(dllimport) int WINAPI
+        FileTimeToLocalFileTime(const FILETIME_* lpFileTime,
+                FILETIME_* lpLocalFileTime);
+    __declspec(dllimport) void WINAPI
+        GetSystemTime(SYSTEMTIME_* lpSystemTime);
+    __declspec(dllimport) int WINAPI
+        SystemTimeToFileTime(const SYSTEMTIME_* lpSystemTime,
+                FILETIME_* lpFileTime);
+    #if BOOST_PLAT_WINDOWS_DESKTOP
+    __declspec(dllimport) DWORD_ WINAPI
+        GetTickCount();
+    #endif
+    #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+    __declspec(dllimport) ULONGLONG_ WINAPI
+        GetTickCount64();
+    #endif
+}
+
+#endif
+
+#ifndef BOOST_HAS_GETSYSTEMTIMEASFILETIME
+inline void WINAPI GetSystemTimeAsFileTime(FILETIME_* lpFileTime)
+{
+    SYSTEMTIME_ st;
+    GetSystemTime(&st);
+    SystemTimeToFileTime(&st, lpFileTime);
+}
+#endif
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_TIME_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/timers.hpp b/gatb-core/thirdparty/boost/detail/winapi/timers.hpp
new file mode 100644
index 0000000..04c6dfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/timers.hpp
@@ -0,0 +1,44 @@
+//  timers.hpp  --------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_TIMERS_HPP
+#define BOOST_DETAIL_WINAPI_TIMERS_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    using ::QueryPerformanceCounter;
+    using ::QueryPerformanceFrequency;
+#else
+extern "C" { 
+    __declspec(dllimport) BOOL_ WINAPI
+        QueryPerformanceCounter(
+            LARGE_INTEGER_ *lpPerformanceCount
+        );
+
+    __declspec(dllimport) BOOL_ WINAPI
+        QueryPerformanceFrequency(
+            LARGE_INTEGER_ *lpFrequency
+        );
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_TIMERS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/tls.hpp b/gatb-core/thirdparty/boost/detail/winapi/tls.hpp
new file mode 100644
index 0000000..d948693
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/tls.hpp
@@ -0,0 +1,49 @@
+//  tls.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_TLS_HPP
+#define BOOST_DETAIL_WINAPI_TLS_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+using ::TlsAlloc;
+using ::TlsGetValue;
+using ::TlsSetValue;
+using ::TlsFree;
+
+const DWORD_ tls_out_of_indexes = TLS_OUT_OF_INDEXES;
+
+#else
+
+extern "C" {
+__declspec(dllimport) DWORD_ WINAPI TlsAlloc(void);
+__declspec(dllimport) LPVOID_ WINAPI TlsGetValue(DWORD_ dwTlsIndex);
+__declspec(dllimport) BOOL_ WINAPI TlsSetValue(DWORD_ dwTlsIndex, LPVOID_ lpTlsValue);
+__declspec(dllimport) BOOL_ WINAPI TlsFree(DWORD_ dwTlsIndex);
+}
+
+const DWORD_ tls_out_of_indexes = 0xFFFFFFFF;
+
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_TLS_HPP
diff --git a/gatb-core/thirdparty/boost/detail/winapi/waitable_timer.hpp b/gatb-core/thirdparty/boost/detail/winapi/waitable_timer.hpp
new file mode 100644
index 0000000..52a7338
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/winapi/waitable_timer.hpp
@@ -0,0 +1,110 @@
+//  waitable_timer.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
+#define BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+typedef ::PTIMERAPCROUTINE PTIMERAPCROUTINE_;
+
+# ifdef BOOST_NO_ANSI_APIS
+using ::CreateWaitableTimerW;
+using ::OpenWaitableTimerW;
+# else
+using ::CreateWaitableTimerA;
+using ::OpenWaitableTimerA;
+# endif
+using ::SetWaitableTimer;
+using ::CancelWaitableTimer;
+
+#else
+
+extern "C" {
+
+struct _SECURITY_ATTRIBUTES;
+
+typedef void (WINAPI* PTIMERAPCROUTINE_)
+(
+    LPVOID_ lpArgToCompletionRoutine,
+    DWORD_ dwTimerLowValue,
+    DWORD_ dwTimerHighValue
+);
+
+# ifdef BOOST_NO_ANSI_APIS
+__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerW
+(
+    _SECURITY_ATTRIBUTES* lpTimerAttributes,
+    BOOL_ bManualReset,
+    LPCWSTR_ lpTimerName
+);
+
+__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerW
+(
+    DWORD_ dwDesiredAccess,
+    BOOL_ bInheritHandle,
+    LPCWSTR_ lpTimerName
+);
+# else
+__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerA
+(
+    _SECURITY_ATTRIBUTES* lpTimerAttributes,
+    BOOL_ bManualReset,
+    LPCSTR_ lpTimerName
+);
+
+__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerA
+(
+    DWORD_ dwDesiredAccess,
+    BOOL_ bInheritHandle,
+    LPCSTR_ lpTimerName
+);
+# endif
+
+__declspec(dllimport) BOOL_ WINAPI SetWaitableTimer
+(
+    HANDLE_ hTimer,
+    const LARGE_INTEGER_ *lpDueTime,
+    LONG_ lPeriod,
+    PTIMERAPCROUTINE_ pfnCompletionRoutine,
+    LPVOID_ lpArgToCompletionRoutine,
+    BOOL_ fResume
+);
+
+__declspec(dllimport) BOOL_ WINAPI CancelWaitableTimer(HANDLE_ hTimer);
+
+}
+
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_waitable_timer(_SECURITY_ATTRIBUTES* lpTimerAttributes, BOOL_ bManualReset)
+{
+#ifdef BOOST_NO_ANSI_APIS
+    return CreateWaitableTimerW(lpTimerAttributes, bManualReset, 0);
+#else
+    return CreateWaitableTimerA(lpTimerAttributes, bManualReset, 0);
+#endif
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
diff --git a/gatb-core/thirdparty/boost/detail/workaround.hpp b/gatb-core/thirdparty/boost/detail/workaround.hpp
new file mode 100644
index 0000000..40b3423
--- /dev/null
+++ b/gatb-core/thirdparty/boost/detail/workaround.hpp
@@ -0,0 +1,267 @@
+// Copyright David Abrahams 2002.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+#ifndef WORKAROUND_DWA2002126_HPP
+# define WORKAROUND_DWA2002126_HPP
+
+// Compiler/library version workaround macro
+//
+// Usage:
+//
+//     #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+//        // workaround for eVC4 and VC6
+//        ... // workaround code here
+//     #endif
+//
+// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the
+// first argument must be undefined or expand to a numeric
+// value. The above expands to:
+//
+//     (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300
+//
+// When used for workarounds that apply to the latest known version 
+// and all earlier versions of a compiler, the following convention 
+// should be observed:
+//
+//     #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301))
+//
+// The version number in this case corresponds to the last version in
+// which the workaround was known to have been required. When
+// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro
+// BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates
+// the workaround for any version of the compiler. When
+// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or
+// error will be issued if the compiler version exceeds the argument
+// to BOOST_TESTED_AT().  This can be used to locate workarounds which
+// may be obsoleted by newer versions.
+
+# ifndef BOOST_STRICT_CONFIG
+
+#include <boost/config.hpp>
+
+#ifndef __BORLANDC__
+#define __BORLANDC___WORKAROUND_GUARD 1
+#else
+#define __BORLANDC___WORKAROUND_GUARD 0
+#endif
+#ifndef __CODEGEARC__
+#define __CODEGEARC___WORKAROUND_GUARD 1
+#else
+#define __CODEGEARC___WORKAROUND_GUARD 0
+#endif
+#ifndef _MSC_VER
+#define _MSC_VER_WORKAROUND_GUARD 1
+#else
+#define _MSC_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef _MSC_FULL_VER
+#define _MSC_FULL_VER_WORKAROUND_GUARD 1
+#else
+#define _MSC_FULL_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_MSVC
+#define BOOST_MSVC_WORKAROUND_GUARD 1
+#else
+#define BOOST_MSVC_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_MSVC_FULL_VER
+#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 1
+#else
+#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef __GNUC__
+#define __GNUC___WORKAROUND_GUARD 1
+#else
+#define __GNUC___WORKAROUND_GUARD 0
+#endif
+#ifndef __GNUC_MINOR__
+#define __GNUC_MINOR___WORKAROUND_GUARD 1
+#else
+#define __GNUC_MINOR___WORKAROUND_GUARD 0
+#endif
+#ifndef __GNUC_PATCHLEVEL__
+#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1
+#else
+#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0
+#endif
+#ifndef __IBMCPP__
+#define __IBMCPP___WORKAROUND_GUARD 1
+#else
+#define __IBMCPP___WORKAROUND_GUARD 0
+#endif
+#ifndef __SUNPRO_CC
+#define __SUNPRO_CC_WORKAROUND_GUARD 1
+#else
+#define __SUNPRO_CC_WORKAROUND_GUARD 0
+#endif
+#ifndef __DECCXX_VER
+#define __DECCXX_VER_WORKAROUND_GUARD 1
+#else
+#define __DECCXX_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef __MWERKS__
+#define __MWERKS___WORKAROUND_GUARD 1
+#else
+#define __MWERKS___WORKAROUND_GUARD 0
+#endif
+#ifndef __EDG__
+#define __EDG___WORKAROUND_GUARD 1
+#else
+#define __EDG___WORKAROUND_GUARD 0
+#endif
+#ifndef __EDG_VERSION__
+#define __EDG_VERSION___WORKAROUND_GUARD 1
+#else
+#define __EDG_VERSION___WORKAROUND_GUARD 0
+#endif
+#ifndef __HP_aCC
+#define __HP_aCC_WORKAROUND_GUARD 1
+#else
+#define __HP_aCC_WORKAROUND_GUARD 0
+#endif
+#ifndef __hpxstd98
+#define __hpxstd98_WORKAROUND_GUARD 1
+#else
+#define __hpxstd98_WORKAROUND_GUARD 0
+#endif
+#ifndef _CRAYC
+#define _CRAYC_WORKAROUND_GUARD 1
+#else
+#define _CRAYC_WORKAROUND_GUARD 0
+#endif
+#ifndef __DMC__
+#define __DMC___WORKAROUND_GUARD 1
+#else
+#define __DMC___WORKAROUND_GUARD 0
+#endif
+#ifndef MPW_CPLUS
+#define MPW_CPLUS_WORKAROUND_GUARD 1
+#else
+#define MPW_CPLUS_WORKAROUND_GUARD 0
+#endif
+#ifndef __COMO__
+#define __COMO___WORKAROUND_GUARD 1
+#else
+#define __COMO___WORKAROUND_GUARD 0
+#endif
+#ifndef __COMO_VERSION__
+#define __COMO_VERSION___WORKAROUND_GUARD 1
+#else
+#define __COMO_VERSION___WORKAROUND_GUARD 0
+#endif
+#ifndef __INTEL_COMPILER
+#define __INTEL_COMPILER_WORKAROUND_GUARD 1
+#else
+#define __INTEL_COMPILER_WORKAROUND_GUARD 0
+#endif
+#ifndef __ICL
+#define __ICL_WORKAROUND_GUARD 1
+#else
+#define __ICL_WORKAROUND_GUARD 0
+#endif
+#ifndef _COMPILER_VERSION
+#define _COMPILER_VERSION_WORKAROUND_GUARD 1
+#else
+#define _COMPILER_VERSION_WORKAROUND_GUARD 0
+#endif
+
+#ifndef _RWSTD_VER
+#define _RWSTD_VER_WORKAROUND_GUARD 1
+#else
+#define _RWSTD_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_RWSTD_VER
+#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1
+#else
+#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef __GLIBCPP__
+#define __GLIBCPP___WORKAROUND_GUARD 1
+#else
+#define __GLIBCPP___WORKAROUND_GUARD 0
+#endif
+#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
+#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1
+#else
+#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0
+#endif
+#ifndef __SGI_STL_PORT
+#define __SGI_STL_PORT_WORKAROUND_GUARD 1
+#else
+#define __SGI_STL_PORT_WORKAROUND_GUARD 0
+#endif
+#ifndef _STLPORT_VERSION
+#define _STLPORT_VERSION_WORKAROUND_GUARD 1
+#else
+#define _STLPORT_VERSION_WORKAROUND_GUARD 0
+#endif
+#ifndef __LIBCOMO_VERSION__
+#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1
+#else
+#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0
+#endif
+#ifndef _CPPLIB_VER
+#define _CPPLIB_VER_WORKAROUND_GUARD 1
+#else
+#define _CPPLIB_VER_WORKAROUND_GUARD 0
+#endif
+
+#ifndef BOOST_INTEL_CXX_VERSION
+#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1
+#else
+#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_INTEL_WIN
+#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1
+#else
+#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_DINKUMWARE_STDLIB
+#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1
+#else
+#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0
+#endif
+#ifndef BOOST_INTEL
+#define BOOST_INTEL_WORKAROUND_GUARD 1
+#else
+#define BOOST_INTEL_WORKAROUND_GUARD 0
+#endif
+// Always define to zero, if it's used it'll be defined my MPL:
+#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0
+
+#  define BOOST_WORKAROUND(symbol, test)                \
+         ((symbol ## _WORKAROUND_GUARD + 0 == 0) &&     \
+         (symbol != 0) && (1 % (( (symbol test) ) + 1)))
+//                              ^ ^           ^ ^
+// The extra level of parenthesis nesting above, along with the
+// BOOST_OPEN_PAREN indirection below, is required to satisfy the
+// broken preprocessor in MWCW 8.3 and earlier.
+//
+// The basic mechanism works as follows:
+//      (symbol test) + 1        =>   if (symbol test) then 2 else 1
+//      1 % ((symbol test) + 1)  =>   if (symbol test) then 1 else 0
+//
+// The complication with % is for cooperation with BOOST_TESTED_AT().
+// When "test" is BOOST_TESTED_AT(x) and
+// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined,
+//
+//      symbol test              =>   if (symbol <= x) then 1 else -1
+//      (symbol test) + 1        =>   if (symbol <= x) then 2 else 0
+//      1 % ((symbol test) + 1)  =>   if (symbol <= x) then 1 else divide-by-zero
+//
+
+#  ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS
+#   define BOOST_OPEN_PAREN (
+#   define BOOST_TESTED_AT(value)  > value) ?(-1): BOOST_OPEN_PAREN 1
+#  else
+#   define BOOST_TESTED_AT(value) != ((value)-(value))
+#  endif
+
+# else
+
+#  define BOOST_WORKAROUND(symbol, test) 0
+
+# endif 
+
+#endif // WORKAROUND_DWA2002126_HPP
diff --git a/gatb-core/thirdparty/boost/exception.hpp b/gatb-core/thirdparty/boost/exception.hpp
new file mode 100644
index 0000000..6424159
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception.hpp
@@ -0,0 +1,11 @@
+//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_1D94A7C6054E11DB9804B622A1EF5492
+#define UUID_1D94A7C6054E11DB9804B622A1EF5492
+
+#error The header <boost/exception.hpp> has been deprecated. Please #include <boost/exception/all.hpp> instead.
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/N3757.hpp b/gatb-core/thirdparty/boost/exception/N3757.hpp
new file mode 100644
index 0000000..23b0606
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/N3757.hpp
@@ -0,0 +1,46 @@
+//Copyright (c) 2006-2013 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_9011016A11A711E3B46CD9FA6088709B
+#define UUID_9011016A11A711E3B46CD9FA6088709B
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/info.hpp>
+#include <boost/exception/get_error_info.hpp>
+
+namespace
+boost
+    {
+    //Here we're using the boost::error_info machinery to store the info in the exception
+    //object. Within the context of N3757, this is strictly an implementation detail.
+
+    template <class Tag>
+    inline
+    void
+    exception::
+    set( typename Tag::type const & v )
+        {
+        exception_detail::set_info(*this,error_info<Tag,typename Tag::type>(v));
+        }
+
+    template <class Tag>
+    inline
+    typename Tag::type const *
+    exception::
+    get() const
+        {
+        return get_error_info<error_info<Tag,typename Tag::type> >(*this);
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/all.hpp b/gatb-core/thirdparty/boost/exception/all.hpp
new file mode 100644
index 0000000..32eb150
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/all.hpp
@@ -0,0 +1,36 @@
+//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_316FDA946C0D11DEA9CBAE5255D89593
+#define UUID_316FDA946C0D11DEA9CBAE5255D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/error_info.hpp>
+#include <boost/exception/exception.hpp>
+#include <boost/exception/get_error_info.hpp>
+#include <boost/exception/info.hpp>
+#include <boost/exception/info_tuple.hpp>
+#include <boost/exception/errinfo_api_function.hpp>
+#include <boost/exception/errinfo_at_line.hpp>
+#include <boost/exception/errinfo_errno.hpp>
+#include <boost/exception/errinfo_file_handle.hpp>
+#include <boost/exception/errinfo_file_name.hpp>
+#include <boost/exception/errinfo_file_open_mode.hpp>
+#include <boost/exception/errinfo_type_info_name.hpp>
+#ifndef BOOST_NO_EXCEPTIONS
+#include <boost/exception/errinfo_nested_exception.hpp>
+#include <boost/exception_ptr.hpp>
+#endif
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/current_exception_cast.hpp b/gatb-core/thirdparty/boost/exception/current_exception_cast.hpp
new file mode 100644
index 0000000..5d81f00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/current_exception_cast.hpp
@@ -0,0 +1,43 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_7E83C166200811DE885E826156D89593
+#define UUID_7E83C166200811DE885E826156D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+namespace
+boost
+    {
+    template <class E>
+    inline
+    E *
+    current_exception_cast()
+        {
+        try
+            {
+            throw;
+            }
+        catch(
+        E & e )
+            {
+            return &e;
+            }
+        catch(
+        ...)
+            {
+            return 0;
+            }
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/clone_current_exception.hpp b/gatb-core/thirdparty/boost/exception/detail/clone_current_exception.hpp
new file mode 100644
index 0000000..6fc1374
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/clone_current_exception.hpp
@@ -0,0 +1,56 @@
+//Copyright (c) 2006-2013 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_81522C0EB56511DFAB613DB0DFD72085
+#define UUID_81522C0EB56511DFAB613DB0DFD72085
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#ifdef BOOST_NO_EXCEPTIONS
+#    error This header requires exception handling to be enabled.
+#endif
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        class clone_base;
+
+#ifdef BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR
+        int clone_current_exception_non_intrusive( clone_base const * & cloned );
+#endif
+
+        namespace
+        clone_current_exception_result
+            {
+            int const success=0;
+            int const bad_alloc=1;
+            int const bad_exception=2;
+            int const not_supported=3;
+            }
+
+        inline
+        int
+        clone_current_exception( clone_base const * & cloned )
+            {
+#ifdef BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR
+            return clone_current_exception_non_intrusive(cloned);
+#else
+            return clone_current_exception_result::not_supported;
+#endif
+            }
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/error_info_impl.hpp b/gatb-core/thirdparty/boost/exception/detail/error_info_impl.hpp
new file mode 100644
index 0000000..12e601b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/error_info_impl.hpp
@@ -0,0 +1,74 @@
+//Copyright (c) 2006-2010 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_CE6983AC753411DDA764247956D89593
+#define UUID_CE6983AC753411DDA764247956D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <string>
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        class
+        error_info_base
+            {
+            public:
+
+            virtual std::string name_value_string() const = 0;
+
+            protected:
+
+            virtual
+            ~error_info_base() throw()
+                {
+                }
+            };
+        }
+
+    template <class Tag,class T>
+    class
+    error_info:
+        public exception_detail::error_info_base
+        {
+        public:
+
+        typedef T value_type;
+
+        error_info( value_type const & value );
+        ~error_info() throw();
+
+        value_type const &
+        value() const
+            {
+            return value_;
+            }
+
+        value_type &
+        value()
+            {
+            return value_;
+            }
+
+        private:
+
+        std::string name_value_string() const;
+
+        value_type value_;
+        };
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/exception_ptr.hpp b/gatb-core/thirdparty/boost/exception/detail/exception_ptr.hpp
new file mode 100644
index 0000000..cac64e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/exception_ptr.hpp
@@ -0,0 +1,513 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_618474C2DE1511DEB74A388C56D89593
+#define UUID_618474C2DE1511DEB74A388C56D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_EXCEPTIONS
+#error This header requires exception handling to be enabled.
+#endif
+#include <boost/exception/exception.hpp>
+#include <boost/exception/info.hpp>
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/detail/type_info.hpp>
+#include <boost/exception/detail/clone_current_exception.hpp>
+#ifndef BOOST_NO_RTTI
+#include <boost/core/demangle.hpp>
+#endif
+#include <boost/shared_ptr.hpp>
+#include <stdexcept>
+#include <new>
+#include <ios>
+#include <stdlib.h>
+
+namespace
+boost
+    {
+    class exception_ptr;
+    BOOST_NORETURN void rethrow_exception( exception_ptr const & );
+    exception_ptr current_exception();
+
+    class
+    exception_ptr
+        {
+        typedef boost::shared_ptr<exception_detail::clone_base const> impl;
+        impl ptr_;
+        friend void rethrow_exception( exception_ptr const & );
+        typedef exception_detail::clone_base const * (impl::*unspecified_bool_type)() const;
+        public:
+        exception_ptr()
+            {
+            }
+        explicit
+        exception_ptr( impl const & ptr ):
+            ptr_(ptr)
+            {
+            }
+        bool
+        operator==( exception_ptr const & other ) const
+            {
+            return ptr_==other.ptr_;
+            }
+        bool
+        operator!=( exception_ptr const & other ) const
+            {
+            return ptr_!=other.ptr_;
+            }
+        operator unspecified_bool_type() const
+            {
+            return ptr_?&impl::get:0;
+            }
+        };
+
+    template <class T>
+    inline
+    exception_ptr
+    copy_exception( T const & e )
+        {
+        try
+            {
+            throw enable_current_exception(e);
+            }
+        catch(
+        ... )
+            {
+            return current_exception();
+            }
+        }
+
+#ifndef BOOST_NO_RTTI
+    typedef error_info<struct tag_original_exception_type,std::type_info const *> original_exception_type;
+
+    inline
+    std::string
+    to_string( original_exception_type const & x )
+        {
+        return core::demangle(x.value()->name());
+        }
+#endif
+
+    namespace
+    exception_detail
+        {
+        struct
+        bad_alloc_:
+            boost::exception,
+            std::bad_alloc
+                {
+                ~bad_alloc_() throw() { }
+                };
+
+        struct
+        bad_exception_:
+            boost::exception,
+            std::bad_exception
+                {
+                ~bad_exception_() throw() { }
+                };
+
+        template <class Exception>
+        exception_ptr
+        get_static_exception_object()
+            {
+            Exception ba;
+            exception_detail::clone_impl<Exception> c(ba);
+#ifndef BOOST_EXCEPTION_DISABLE
+            c <<
+                throw_function(BOOST_CURRENT_FUNCTION) <<
+                throw_file(__FILE__) <<
+                throw_line(__LINE__);
+#endif
+            static exception_ptr ep(shared_ptr<exception_detail::clone_base const>(new exception_detail::clone_impl<Exception>(c)));
+            return ep;
+            }
+
+        template <class Exception>
+        struct
+        exception_ptr_static_exception_object
+            {
+            static exception_ptr const e;
+            };
+
+        template <class Exception>
+        exception_ptr const
+        exception_ptr_static_exception_object<Exception>::
+        e = get_static_exception_object<Exception>();
+        }
+
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility push (default)
+# endif
+#endif
+    class
+    unknown_exception:
+        public boost::exception,
+        public std::exception
+        {
+        public:
+
+        unknown_exception()
+            {
+            }
+
+        explicit
+        unknown_exception( std::exception const & e )
+            {
+            add_original_type(e);
+            }
+
+        explicit
+        unknown_exception( boost::exception const & e ):
+            boost::exception(e)
+            {
+            add_original_type(e);
+            }
+
+        ~unknown_exception() throw()
+            {
+            }
+
+        private:
+
+        template <class E>
+        void
+        add_original_type( E const & e )
+            {
+#ifndef BOOST_NO_RTTI
+            (*this) << original_exception_type(&typeid(e));
+#endif
+            }
+        };
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility pop
+# endif
+#endif
+
+    namespace
+    exception_detail
+        {
+        template <class T>
+        class
+        current_exception_std_exception_wrapper:
+            public T,
+            public boost::exception
+            {
+            public:
+
+            explicit
+            current_exception_std_exception_wrapper( T const & e1 ):
+                T(e1)
+                {
+                add_original_type(e1);
+                }
+
+            current_exception_std_exception_wrapper( T const & e1, boost::exception const & e2 ):
+                T(e1),
+                boost::exception(e2)
+                {
+                add_original_type(e1);
+                }
+
+            ~current_exception_std_exception_wrapper() throw()
+                {
+                }
+
+            private:
+
+            template <class E>
+            void
+            add_original_type( E const & e )
+                {
+#ifndef BOOST_NO_RTTI
+                (*this) << original_exception_type(&typeid(e));
+#endif
+                }
+            };
+
+#ifdef BOOST_NO_RTTI
+        template <class T>
+        boost::exception const *
+        get_boost_exception( T const * )
+            {
+            try
+                {
+                throw;
+                }
+            catch(
+            boost::exception & x )
+                {
+                return &x;
+                }
+            catch(...)
+                {
+                return 0;
+                }
+            }
+#else
+        template <class T>
+        boost::exception const *
+        get_boost_exception( T const * x )
+            {
+            return dynamic_cast<boost::exception const *>(x);
+            }
+#endif
+
+        template <class T>
+        inline
+        exception_ptr
+        current_exception_std_exception( T const & e1 )
+            {
+            if( boost::exception const * e2 = get_boost_exception(&e1) )
+                return boost::copy_exception(current_exception_std_exception_wrapper<T>(e1,*e2));
+            else
+                return boost::copy_exception(current_exception_std_exception_wrapper<T>(e1));
+            }
+
+        inline
+        exception_ptr
+        current_exception_unknown_exception()
+            {
+            return boost::copy_exception(unknown_exception());
+            }
+
+        inline
+        exception_ptr
+        current_exception_unknown_boost_exception( boost::exception const & e )
+            {
+            return boost::copy_exception(unknown_exception(e));
+            }
+
+        inline
+        exception_ptr
+        current_exception_unknown_std_exception( std::exception const & e )
+            {
+            if( boost::exception const * be = get_boost_exception(&e) )
+                return current_exception_unknown_boost_exception(*be);
+            else
+                return boost::copy_exception(unknown_exception(e));
+            }
+
+        inline
+        exception_ptr
+        current_exception_impl()
+            {
+            exception_detail::clone_base const * e=0;
+            switch(
+            exception_detail::clone_current_exception(e) )
+                {
+                case exception_detail::clone_current_exception_result::
+                success:
+                    {
+                    BOOST_ASSERT(e!=0);
+                    return exception_ptr(shared_ptr<exception_detail::clone_base const>(e));
+                    }
+                case exception_detail::clone_current_exception_result::
+                bad_alloc:
+                    {
+                    BOOST_ASSERT(!e);
+                    return exception_detail::exception_ptr_static_exception_object<bad_alloc_>::e;
+                    }
+                case exception_detail::clone_current_exception_result::
+                bad_exception:
+                    {
+                    BOOST_ASSERT(!e);
+                    return exception_detail::exception_ptr_static_exception_object<bad_exception_>::e;
+                    }
+                default:
+                    BOOST_ASSERT(0);
+                case exception_detail::clone_current_exception_result::
+                not_supported:
+                    {
+                    BOOST_ASSERT(!e);
+                    try
+                        {
+                        throw;
+                        }
+                    catch(
+                    exception_detail::clone_base & e )
+                        {
+                        return exception_ptr(shared_ptr<exception_detail::clone_base const>(e.clone()));
+                        }
+                    catch(
+                    std::domain_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::invalid_argument & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::length_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::out_of_range & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::logic_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::range_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::overflow_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::underflow_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::ios_base::failure & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::runtime_error & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::bad_alloc & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+#ifndef BOOST_NO_TYPEID
+                    catch(
+                    std::bad_cast & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::bad_typeid & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+#endif
+                    catch(
+                    std::bad_exception & e )
+                        {
+                        return exception_detail::current_exception_std_exception(e);
+                        }
+                    catch(
+                    std::exception & e )
+                        {
+                        return exception_detail::current_exception_unknown_std_exception(e);
+                        }
+                    catch(
+                    boost::exception & e )
+                        {
+                        return exception_detail::current_exception_unknown_boost_exception(e);
+                        }
+                    catch(
+                    ... )
+                        {
+                        return exception_detail::current_exception_unknown_exception();
+                        }
+                    }
+                }
+            }
+        }
+
+    inline
+    exception_ptr
+    current_exception()
+        {
+        exception_ptr ret;
+        try
+            {
+            ret=exception_detail::current_exception_impl();
+            }
+        catch(
+        std::bad_alloc & )
+            {
+            ret=exception_detail::exception_ptr_static_exception_object<exception_detail::bad_alloc_>::e;
+            }
+        catch(
+        ... )
+            {
+            ret=exception_detail::exception_ptr_static_exception_object<exception_detail::bad_exception_>::e;
+            }
+        BOOST_ASSERT(ret);
+        return ret;
+        }
+
+    BOOST_NORETURN
+    inline
+    void
+    rethrow_exception( exception_ptr const & p )
+        {
+        BOOST_ASSERT(p);
+        p.ptr_->rethrow();
+        BOOST_ASSERT(0);
+        #if defined(UNDER_CE)
+            // some CE platforms don't define ::abort()
+            exit(-1);
+        #else
+            abort();
+        #endif
+        }
+
+    inline
+    std::string
+    diagnostic_information( exception_ptr const & p, bool verbose=true )
+        {
+        if( p )
+            try
+                {
+                rethrow_exception(p);
+                }
+            catch(
+            ... )
+                {
+                return current_exception_diagnostic_information(verbose);
+                }
+        return "<empty>";
+        }
+
+    inline
+    std::string
+    to_string( exception_ptr const & p )
+        {
+        std::string s='\n'+diagnostic_information(p);
+        std::string padding("  ");
+        std::string r;
+        bool f=false;
+        for( std::string::const_iterator i=s.begin(),e=s.end(); i!=e; ++i )
+            {
+            if( f )
+                r+=padding;
+            char c=*i;
+            r+=c;
+            f=(c=='\n');
+            }
+        return r;
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/is_output_streamable.hpp b/gatb-core/thirdparty/boost/exception/detail/is_output_streamable.hpp
new file mode 100644
index 0000000..847f348
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/is_output_streamable.hpp
@@ -0,0 +1,60 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_898984B4076411DD973EDFA055D89593
+#define UUID_898984B4076411DD973EDFA055D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <ostream>
+
+namespace
+boost
+    {
+    namespace
+    to_string_detail
+        {
+        struct
+        partial_ordering_helper1
+            {
+            template <class CharT,class Traits>
+            partial_ordering_helper1( std::basic_ostream<CharT,Traits> & );
+            };
+
+        struct
+        partial_ordering_helper2
+            {
+            template <class T>
+            partial_ordering_helper2( T const & );
+            };
+
+        char operator<<( partial_ordering_helper1, partial_ordering_helper2 );
+
+        template <class T,class CharT,class Traits>
+        struct
+        is_output_streamable_impl
+            {
+            static std::basic_ostream<CharT,Traits> & f();
+            static T const & g();
+            enum e { value=1!=(sizeof(f()<<g())) };
+            };
+        }
+
+    template <class T, class CharT=char, class Traits=std::char_traits<CharT> >
+    struct
+    is_output_streamable
+        {
+        enum e { value=to_string_detail::is_output_streamable_impl<T,CharT,Traits>::value };
+        };
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/object_hex_dump.hpp b/gatb-core/thirdparty/boost/exception/detail/object_hex_dump.hpp
new file mode 100644
index 0000000..53c8bf6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/object_hex_dump.hpp
@@ -0,0 +1,50 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_6F463AC838DF11DDA3E6909F56D89593
+#define UUID_6F463AC838DF11DDA3E6909F56D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/detail/type_info.hpp>
+#include <iomanip>
+#include <ios>
+#include <string>
+#include <sstream>
+#include <cstdlib>
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        template <class T>
+        inline
+        std::string
+        object_hex_dump( T const & x, std::size_t max_size=16 )
+            {
+            std::ostringstream s;
+            s << "type: " << type_name<T>() << ", size: " << sizeof(T) << ", dump: ";
+            std::size_t n=sizeof(T)>max_size?max_size:sizeof(T);
+            s.fill('0');
+            s.width(2);
+            unsigned char const * b=reinterpret_cast<unsigned char const *>(&x);
+            s << std::setw(2) << std::hex << (unsigned int)*b;
+            for( unsigned char const * e=b+n; ++b!=e; )
+                s << " " << std::setw(2) << std::hex << (unsigned int)*b;
+            return s.str();
+            }
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/detail/type_info.hpp b/gatb-core/thirdparty/boost/exception/detail/type_info.hpp
new file mode 100644
index 0000000..b8c7d48
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/detail/type_info.hpp
@@ -0,0 +1,81 @@
+//Copyright (c) 2006-2010 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_C3E1741C754311DDB2834CCA55D89593
+#define UUID_C3E1741C754311DDB2834CCA55D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/core/typeinfo.hpp>
+#include <boost/core/demangle.hpp>
+#include <boost/current_function.hpp>
+#include <boost/config.hpp>
+#include <string>
+
+namespace
+boost
+    {
+    template <class T>
+    inline
+    std::string
+    tag_type_name()
+        {
+#ifdef BOOST_NO_TYPEID
+        return BOOST_CURRENT_FUNCTION;
+#else
+        return core::demangle(typeid(T*).name());
+#endif
+        }
+
+    template <class T>
+    inline
+    std::string
+    type_name()
+        {
+#ifdef BOOST_NO_TYPEID
+        return BOOST_CURRENT_FUNCTION;
+#else
+        return core::demangle(typeid(T).name());
+#endif
+        }
+
+    namespace
+    exception_detail
+        {
+        struct
+        type_info_
+            {
+            core::typeinfo const * type_;
+
+            explicit
+            type_info_( core::typeinfo const & type ):
+                type_(&type)
+                {
+                }
+
+            friend
+            bool
+            operator<( type_info_ const & a, type_info_ const & b )
+                {
+                return 0!=(a.type_->before(*b.type_));
+                }
+            };
+        }
+    }
+
+#define BOOST_EXCEPTION_STATIC_TYPEID(T) ::boost::exception_detail::type_info_(BOOST_CORE_TYPEID(T))
+
+#ifndef BOOST_NO_RTTI
+#define BOOST_EXCEPTION_DYNAMIC_TYPEID(x) ::boost::exception_detail::type_info_(typeid(x))
+#endif
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/diagnostic_information.hpp b/gatb-core/thirdparty/boost/exception/diagnostic_information.hpp
new file mode 100644
index 0000000..305e8ed
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/diagnostic_information.hpp
@@ -0,0 +1,201 @@
+//Copyright (c) 2006-2010 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_0552D49838DD11DD90146B8956D89593
+#define UUID_0552D49838DD11DD90146B8956D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/config.hpp>
+#include <boost/exception/get_error_info.hpp>
+#include <boost/exception/info.hpp>
+#include <boost/utility/enable_if.hpp>
+#ifndef BOOST_NO_RTTI
+#include <boost/core/demangle.hpp>
+#endif
+#include <exception>
+#include <sstream>
+#include <string>
+
+#ifndef BOOST_NO_EXCEPTIONS
+#include <boost/exception/current_exception_cast.hpp>
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        std::string diagnostic_information_impl( boost::exception const *, std::exception const *, bool, bool );
+        }
+
+    inline
+    std::string
+    current_exception_diagnostic_information( bool verbose=true)
+        {
+        boost::exception const * be=current_exception_cast<boost::exception const>();
+        std::exception const * se=current_exception_cast<std::exception const>();
+        if( be || se )
+            return exception_detail::diagnostic_information_impl(be,se,true,verbose);
+        else
+            return "No diagnostic information available.";
+        }
+    }
+#endif
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        inline
+        exception const *
+        get_boost_exception( exception const * e )
+            {
+            return e;
+            }
+
+        inline
+        exception const *
+        get_boost_exception( ... )
+            {
+            return 0;
+            }
+
+        inline
+        std::exception const *
+        get_std_exception( std::exception const * e )
+            {
+            return e;
+            }
+
+        inline
+        std::exception const *
+        get_std_exception( ... )
+            {
+            return 0;
+            }
+
+        inline
+        char const *
+        get_diagnostic_information( exception const & x, char const * header )
+            {
+#ifndef BOOST_NO_EXCEPTIONS
+            try
+                {
+#endif
+                error_info_container * c=x.data_.get();
+                if( !c )
+                    x.data_.adopt(c=new exception_detail::error_info_container_impl);
+                char const * di=c->diagnostic_information(header);
+                BOOST_ASSERT(di!=0);
+                return di;
+#ifndef BOOST_NO_EXCEPTIONS
+                }
+            catch(...)
+                {
+                return 0;
+                }
+#endif
+            }
+
+        inline
+        std::string
+        diagnostic_information_impl( boost::exception const * be, std::exception const * se, bool with_what, bool verbose )
+            {
+            if( !be && !se )
+                return "Unknown exception.";
+#ifndef BOOST_NO_RTTI
+            if( !be )
+                be=dynamic_cast<boost::exception const *>(se);
+            if( !se )
+                se=dynamic_cast<std::exception const *>(be);
+#endif
+            char const * wh=0;
+            if( with_what && se )
+                {
+                wh=se->what();
+                if( be && exception_detail::get_diagnostic_information(*be,0)==wh )
+                    return wh;
+                }
+            std::ostringstream tmp;
+            if( be && verbose )
+                {
+                char const * const * f=get_error_info<throw_file>(*be);
+                int const * l=get_error_info<throw_line>(*be);
+                char const * const * fn=get_error_info<throw_function>(*be);
+                if( !f && !l && !fn )
+                    tmp << "Throw location unknown (consider using BOOST_THROW_EXCEPTION)\n";
+                else
+                    {
+                    if( f )
+                        {
+                        tmp << *f;
+                        if( int const * l=get_error_info<throw_line>(*be) )
+                            tmp << '(' << *l << "): ";
+                        }
+                    tmp << "Throw in function ";
+                    if( char const * const * fn=get_error_info<throw_function>(*be) )
+                        tmp << *fn;
+                    else
+                        tmp << "(unknown)";
+                    tmp << '\n';
+                    }
+                }
+#ifndef BOOST_NO_RTTI
+            if ( verbose )
+                tmp << std::string("Dynamic exception type: ") <<
+                    core::demangle((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()) << '\n';
+#endif
+            if( with_what && se && verbose )
+                tmp << "std::exception::what: " << wh << '\n';
+            if( be )
+                if( char const * s=exception_detail::get_diagnostic_information(*be,tmp.str().c_str()) )
+                    if( *s )
+                        return std::string(s);
+            return tmp.str();
+            }
+        }
+
+    template <class T>
+    std::string
+    diagnostic_information( T const & e, bool verbose=true )
+        {
+        return exception_detail::diagnostic_information_impl(exception_detail::get_boost_exception(&e),exception_detail::get_std_exception(&e),true,verbose);
+        }
+
+    inline
+    char const *
+    diagnostic_information_what( exception const & e, bool verbose=true ) throw()
+        {
+        char const * w=0;
+#ifndef BOOST_NO_EXCEPTIONS
+        try
+            {
+#endif
+            (void) exception_detail::diagnostic_information_impl(&e,0,false,verbose);
+            if( char const * di=exception_detail::get_diagnostic_information(e,0) )
+                return di;
+            else
+                return "Failed to produce boost::diagnostic_information_what()";
+#ifndef BOOST_NO_EXCEPTIONS
+            }
+        catch(
+        ... )
+            {
+            }
+#endif
+        return w;
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/enable_current_exception.hpp b/gatb-core/thirdparty/boost/exception/enable_current_exception.hpp
new file mode 100644
index 0000000..9881053
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/enable_current_exception.hpp
@@ -0,0 +1,6 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/exception/exception.hpp>
diff --git a/gatb-core/thirdparty/boost/exception/enable_error_info.hpp b/gatb-core/thirdparty/boost/exception/enable_error_info.hpp
new file mode 100644
index 0000000..9881053
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/enable_error_info.hpp
@@ -0,0 +1,6 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/exception/exception.hpp>
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_api_function.hpp b/gatb-core/thirdparty/boost/exception/errinfo_api_function.hpp
new file mode 100644
index 0000000..481c613
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_api_function.hpp
@@ -0,0 +1,22 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_DDFBB4546C1211DEA4659E9055D89593
+#define UUID_DDFBB4546C1211DEA4659E9055D89593
+
+#include "boost/exception/error_info.hpp"
+
+namespace
+boost
+    {
+    //Usage hint:
+    //if( api_function(....)!=0 )
+    //    BOOST_THROW_EXCEPTION(
+    //        failure() <<
+    //        errinfo_api_function("api_function") );
+    typedef error_info<struct errinfo_api_function_,char const *> errinfo_api_function;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_at_line.hpp b/gatb-core/thirdparty/boost/exception/errinfo_at_line.hpp
new file mode 100644
index 0000000..cbd5cce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_at_line.hpp
@@ -0,0 +1,18 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_E7255CE26C1211DE85800C9155D89593
+#define UUID_E7255CE26C1211DE85800C9155D89593
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Use with parsing errors exceptions, for example in a XML file parser.
+    typedef error_info<struct errinfo_at_line_,int> errinfo_at_line;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_errno.hpp b/gatb-core/thirdparty/boost/exception/errinfo_errno.hpp
new file mode 100644
index 0000000..2cf7cab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_errno.hpp
@@ -0,0 +1,44 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_F0EE17BE6C1211DE87FF459155D89593
+#define UUID_F0EE17BE6C1211DE87FF459155D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include "boost/exception/info.hpp"
+#include <errno.h>
+#include <string.h>
+
+namespace
+boost
+    {
+    typedef error_info<struct errinfo_errno_,int> errinfo_errno;
+
+    //Usage hint:
+    //if( c_function(....)!=0 )
+    //    BOOST_THROW_EXCEPTION(
+    //        failure() <<
+    //        errinfo_errno(errno) <<
+    //        errinfo_api_function("c_function") );
+    inline
+    std::string
+    to_string( errinfo_errno const & e )
+        {
+        std::ostringstream tmp;
+        int v=e.value();
+        tmp << v << ", \"" << strerror(v) << "\"";
+        return tmp.str();
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_file_handle.hpp b/gatb-core/thirdparty/boost/exception/errinfo_file_handle.hpp
new file mode 100644
index 0000000..8e6cff8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_file_handle.hpp
@@ -0,0 +1,20 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_F79E6EE26C1211DEB26E929155D89593
+#define UUID_F79E6EE26C1211DEB26E929155D89593
+
+#include <stdio.h>
+
+namespace
+boost
+    {
+    template <class> class weak_ptr;
+    template <class Tag,class T> class error_info;
+
+    typedef error_info<struct errinfo_file_handle_,weak_ptr<FILE> > errinfo_file_handle;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_file_name.hpp b/gatb-core/thirdparty/boost/exception/errinfo_file_name.hpp
new file mode 100644
index 0000000..d3cce4d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_file_name.hpp
@@ -0,0 +1,26 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_FEE5120A6C1211DE94E8BC9155D89593
+#define UUID_FEE5120A6C1211DE94E8BC9155D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //FILE * f=fopen(name,mode);
+    //if( !f )
+    //    BOOST_THROW_EXCEPTION(
+    //        file_open_error() <<
+    //        errinfo_file_name(name) <<
+    //        errinfo_file_open_mode(mode) );
+    typedef error_info<struct errinfo_file_name_,std::string> errinfo_file_name;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_file_open_mode.hpp b/gatb-core/thirdparty/boost/exception/errinfo_file_open_mode.hpp
new file mode 100644
index 0000000..f4fba0d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_file_open_mode.hpp
@@ -0,0 +1,26 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_056F1F266C1311DE8E74299255D89593
+#define UUID_056F1F266C1311DE8E74299255D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //FILE * f=fopen(name,mode);
+    //if( !f )
+    //    BOOST_THROW_EXCEPTION(
+    //        file_open_error() <<
+    //        errinfo_file_name(name) <<
+    //        errinfo_file_open_mode(mode) );
+    typedef error_info<struct errinfo_file_open_mode_,std::string> errinfo_file_open_mode;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_nested_exception.hpp b/gatb-core/thirdparty/boost/exception/errinfo_nested_exception.hpp
new file mode 100644
index 0000000..c3299d1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_nested_exception.hpp
@@ -0,0 +1,18 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_45CC9A82B77511DEB330FC4956D89593
+#define UUID_45CC9A82B77511DEB330FC4956D89593
+
+namespace
+boost
+    {
+    namespace exception_detail { class clone_base; }
+    template <class Tag,class T> class error_info;
+    class exception_ptr;
+    typedef error_info<struct errinfo_nested_exception_,exception_ptr> errinfo_nested_exception;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/errinfo_type_info_name.hpp b/gatb-core/thirdparty/boost/exception/errinfo_type_info_name.hpp
new file mode 100644
index 0000000..0b060e2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/errinfo_type_info_name.hpp
@@ -0,0 +1,23 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_0E11109E6C1311DEB7EA649255D89593
+#define UUID_0E11109E6C1311DEB7EA649255D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //BOOST_THROW_EXCEPTION(
+    //    bad_type() <<
+    //    errinfo_type_info_name(typeid(x).name()) );
+    typedef error_info<struct errinfo_type_info_name_,std::string> errinfo_type_info_name;
+    }
+
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/error_info.hpp b/gatb-core/thirdparty/boost/exception/error_info.hpp
new file mode 100644
index 0000000..03b3da8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/error_info.hpp
@@ -0,0 +1,9 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_EE7ECCA0433B11E1923E37064924019B
+#define UUID_EE7ECCA0433B11E1923E37064924019B
+namespace boost { template <class Tag,class T> class error_info; }
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/exception.hpp b/gatb-core/thirdparty/boost/exception/exception.hpp
new file mode 100644
index 0000000..d762cf8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/exception.hpp
@@ -0,0 +1,489 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_274DA366004E11DCB1DDFE2E56D89593
+#define UUID_274DA366004E11DCB1DDFE2E56D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        template <class T>
+        class
+        refcount_ptr
+            {
+            public:
+
+            refcount_ptr():
+                px_(0)
+                {
+                }
+
+            ~refcount_ptr()
+                {
+                release();
+                }
+
+            refcount_ptr( refcount_ptr const & x ):
+                px_(x.px_)
+                {
+                add_ref();
+                }
+
+            refcount_ptr &
+            operator=( refcount_ptr const & x )
+                {
+                adopt(x.px_);
+                return *this;
+                }
+
+            void
+            adopt( T * px )
+                {
+                release();
+                px_=px;
+                add_ref();
+                }
+
+            T *
+            get() const
+                {
+                return px_;
+                }
+
+            private:
+
+            T * px_;
+
+            void
+            add_ref()
+                {
+                if( px_ )
+                    px_->add_ref();
+                }
+
+            void
+            release()
+                {
+                if( px_ && px_->release() )
+                    px_=0;
+                }
+            };
+        }
+
+    ////////////////////////////////////////////////////////////////////////
+
+    template <class Tag,class T>
+    class error_info;
+
+    typedef error_info<struct throw_function_,char const *> throw_function;
+    typedef error_info<struct throw_file_,char const *> throw_file;
+    typedef error_info<struct throw_line_,int> throw_line;
+
+    template <>
+    class
+    error_info<throw_function_,char const *>
+        {
+        public:
+        typedef char const * value_type;
+        value_type v_;
+        explicit
+        error_info( value_type v ):
+            v_(v)
+            {
+            }
+        };
+
+    template <>
+    class
+    error_info<throw_file_,char const *>
+        {
+        public:
+        typedef char const * value_type;
+        value_type v_;
+        explicit
+        error_info( value_type v ):
+            v_(v)
+            {
+            }
+        };
+
+    template <>
+    class
+    error_info<throw_line_,int>
+        {
+        public:
+        typedef int value_type;
+        value_type v_;
+        explicit
+        error_info( value_type v ):
+            v_(v)
+            {
+            }
+        };
+
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility push (default)
+# endif
+#endif
+    class exception;
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility pop
+# endif
+#endif
+
+    template <class T>
+    class shared_ptr;
+
+    namespace
+    exception_detail
+        {
+        class error_info_base;
+        struct type_info_;
+
+        struct
+        error_info_container
+            {
+            virtual char const * diagnostic_information( char const * ) const = 0;
+            virtual shared_ptr<error_info_base> get( type_info_ const & ) const = 0;
+            virtual void set( shared_ptr<error_info_base> const &, type_info_ const & ) = 0;
+            virtual void add_ref() const = 0;
+            virtual bool release() const = 0;
+            virtual refcount_ptr<exception_detail::error_info_container> clone() const = 0;
+
+            protected:
+
+            ~error_info_container() throw()
+                {
+                }
+            };
+
+        template <class>
+        struct get_info;
+
+        template <>
+        struct get_info<throw_function>;
+
+        template <>
+        struct get_info<throw_file>;
+
+        template <>
+        struct get_info<throw_line>;
+
+        char const * get_diagnostic_information( exception const &, char const * );
+
+        void copy_boost_exception( exception *, exception const * );
+
+        template <class E,class Tag,class T>
+        E const & set_info( E const &, error_info<Tag,T> const & );
+
+        template <class E>
+        E const & set_info( E const &, throw_function const & );
+
+        template <class E>
+        E const & set_info( E const &, throw_file const & );
+
+        template <class E>
+        E const & set_info( E const &, throw_line const & );
+        }
+
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility push (default)
+# endif
+#endif
+    class
+    exception
+        {
+        //<N3757>
+        public:
+        template <class Tag> void set( typename Tag::type const & );
+        template <class Tag> typename Tag::type const * get() const;
+        //</N3757>
+
+        protected:
+
+        exception():
+            throw_function_(0),
+            throw_file_(0),
+            throw_line_(-1)
+            {
+            }
+
+#ifdef __HP_aCC
+        //On HP aCC, this protected copy constructor prevents throwing boost::exception.
+        //On all other platforms, the same effect is achieved by the pure virtual destructor.
+        exception( exception const & x ) throw():
+            data_(x.data_),
+            throw_function_(x.throw_function_),
+            throw_file_(x.throw_file_),
+            throw_line_(x.throw_line_)
+            {
+            }
+#endif
+
+        virtual ~exception() throw()
+#ifndef __HP_aCC
+            = 0 //Workaround for HP aCC, =0 incorrectly leads to link errors.
+#endif
+            ;
+
+#if (defined(__MWERKS__) && __MWERKS__<=0x3207) || (defined(_MSC_VER) && _MSC_VER<=1310)
+        public:
+#else
+        private:
+
+        template <class E>
+        friend E const & exception_detail::set_info( E const &, throw_function const & );
+
+        template <class E>
+        friend E const & exception_detail::set_info( E const &, throw_file const & );
+
+        template <class E>
+        friend E const & exception_detail::set_info( E const &, throw_line const & );
+
+        template <class E,class Tag,class T>
+        friend E const & exception_detail::set_info( E const &, error_info<Tag,T> const & );
+
+        friend char const * exception_detail::get_diagnostic_information( exception const &, char const * );
+
+        template <class>
+        friend struct exception_detail::get_info;
+        friend struct exception_detail::get_info<throw_function>;
+        friend struct exception_detail::get_info<throw_file>;
+        friend struct exception_detail::get_info<throw_line>;
+        friend void exception_detail::copy_boost_exception( exception *, exception const * );
+#endif
+        mutable exception_detail::refcount_ptr<exception_detail::error_info_container> data_;
+        mutable char const * throw_function_;
+        mutable char const * throw_file_;
+        mutable int throw_line_;
+        };
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility pop
+# endif
+#endif
+
+    inline
+    exception::
+    ~exception() throw()
+        {
+        }
+
+    namespace
+    exception_detail
+        {
+        template <class E>
+        E const &
+        set_info( E const & x, throw_function const & y )
+            {
+            x.throw_function_=y.v_;
+            return x;
+            }
+
+        template <class E>
+        E const &
+        set_info( E const & x, throw_file const & y )
+            {
+            x.throw_file_=y.v_;
+            return x;
+            }
+
+        template <class E>
+        E const &
+        set_info( E const & x, throw_line const & y )
+            {
+            x.throw_line_=y.v_;
+            return x;
+            }
+        }
+
+    ////////////////////////////////////////////////////////////////////////
+
+    namespace
+    exception_detail
+        {
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility push (default)
+# endif
+#endif
+        template <class T>
+        struct
+        error_info_injector:
+            public T,
+            public exception
+            {
+            explicit
+            error_info_injector( T const & x ):
+                T(x)
+                {
+                }
+
+            ~error_info_injector() throw()
+                {
+                }
+            };
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility pop
+# endif
+#endif
+
+        struct large_size { char c[256]; };
+        large_size dispatch_boost_exception( exception const * );
+
+        struct small_size { };
+        small_size dispatch_boost_exception( void const * );
+
+        template <class,int>
+        struct enable_error_info_helper;
+
+        template <class T>
+        struct
+        enable_error_info_helper<T,sizeof(large_size)>
+            {
+            typedef T type;
+            };
+
+        template <class T>
+        struct
+        enable_error_info_helper<T,sizeof(small_size)>
+            {
+            typedef error_info_injector<T> type;
+            };
+
+        template <class T>
+        struct
+        enable_error_info_return_type
+            {
+            typedef typename enable_error_info_helper<T,sizeof(exception_detail::dispatch_boost_exception(static_cast<T *>(0)))>::type type;
+            };
+        }
+
+    template <class T>
+    inline
+    typename
+    exception_detail::enable_error_info_return_type<T>::type
+    enable_error_info( T const & x )
+        {
+        typedef typename exception_detail::enable_error_info_return_type<T>::type rt;
+        return rt(x);
+        }
+
+    ////////////////////////////////////////////////////////////////////////
+
+    namespace
+    exception_detail
+        {
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility push (default)
+# endif
+#endif
+        class
+        clone_base
+            {
+            public:
+
+            virtual clone_base const * clone() const = 0;
+            virtual void rethrow() const = 0;
+
+            virtual
+            ~clone_base() throw()
+                {
+                }
+            };
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+#  pragma GCC visibility pop
+# endif
+#endif
+
+        inline
+        void
+        copy_boost_exception( exception * a, exception const * b )
+            {
+            refcount_ptr<error_info_container> data;
+            if( error_info_container * d=b->data_.get() )
+                data = d->clone();
+            a->throw_file_ = b->throw_file_;
+            a->throw_line_ = b->throw_line_;
+            a->throw_function_ = b->throw_function_;
+            a->data_ = data;
+            }
+
+        inline
+        void
+        copy_boost_exception( void *, void const * )
+            {
+            }
+
+        template <class T>
+        class
+        clone_impl:
+            public T,
+            public virtual clone_base
+            {
+            struct clone_tag { };
+            clone_impl( clone_impl const & x, clone_tag ):
+                T(x)
+                {
+                copy_boost_exception(this,&x);
+                }
+
+            public:
+
+            explicit
+            clone_impl( T const & x ):
+                T(x)
+                {
+                copy_boost_exception(this,&x);
+                }
+
+            ~clone_impl() throw()
+                {
+                }
+
+            private:
+
+            clone_base const *
+            clone() const
+                {
+                return new clone_impl(*this,clone_tag());
+                }
+
+            void
+            rethrow() const
+                {
+                throw*this;
+                }
+            };
+        }
+
+    template <class T>
+    inline
+    exception_detail::clone_impl<T>
+    enable_current_exception( T const & x )
+        {
+        return exception_detail::clone_impl<T>(x);
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/get_error_info.hpp b/gatb-core/thirdparty/boost/exception/get_error_info.hpp
new file mode 100644
index 0000000..96be763
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/get_error_info.hpp
@@ -0,0 +1,130 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_1A590226753311DD9E4CCF6156D89593
+#define UUID_1A590226753311DD9E4CCF6156D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/exception.hpp>
+#include <boost/exception/detail/error_info_impl.hpp>
+#include <boost/exception/detail/type_info.hpp>
+#include <boost/shared_ptr.hpp>
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        template <class ErrorInfo>
+        struct
+        get_info
+            {
+            static
+            typename ErrorInfo::value_type *
+            get( exception const & x )
+                {
+                if( exception_detail::error_info_container * c=x.data_.get() )
+                    if( shared_ptr<exception_detail::error_info_base> eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) )
+                        {
+#ifndef BOOST_NO_RTTI
+                        BOOST_ASSERT( 0!=dynamic_cast<ErrorInfo *>(eib.get()) );
+#endif
+                        ErrorInfo * w = static_cast<ErrorInfo *>(eib.get());
+                        return &w->value();
+                        }
+                return 0;
+                }
+            };
+
+        template <>
+        struct
+        get_info<throw_function>
+            {
+            static
+            char const * *
+            get( exception const & x )
+                {
+                return x.throw_function_ ? &x.throw_function_ : 0;
+                }
+            };
+
+        template <>
+        struct
+        get_info<throw_file>
+            {
+            static
+            char const * *
+            get( exception const & x )
+                {
+                return x.throw_file_ ? &x.throw_file_ : 0;
+                }
+            };
+
+        template <>
+        struct
+        get_info<throw_line>
+            {
+            static
+            int *
+            get( exception const & x )
+                {
+                return x.throw_line_!=-1 ? &x.throw_line_ : 0;
+                }
+            };
+
+        template <class T,class R>
+        struct
+        get_error_info_return_type
+            {
+            typedef R * type;
+            };
+
+        template <class T,class R>
+        struct
+        get_error_info_return_type<T const,R>
+            {
+            typedef R const * type;
+            };
+        }
+
+#ifdef BOOST_NO_RTTI
+    template <class ErrorInfo>
+    inline
+    typename ErrorInfo::value_type const *
+    get_error_info( boost::exception const & x )
+        {
+        return exception_detail::get_info<ErrorInfo>::get(x);
+        }
+    template <class ErrorInfo>
+    inline
+    typename ErrorInfo::value_type *
+    get_error_info( boost::exception & x )
+        {
+        return exception_detail::get_info<ErrorInfo>::get(x);
+        }
+#else
+    template <class ErrorInfo,class E>
+    inline
+    typename exception_detail::get_error_info_return_type<E,typename ErrorInfo::value_type>::type
+    get_error_info( E & some_exception )
+        {
+        if( exception const * x = dynamic_cast<exception const *>(&some_exception) )
+            return exception_detail::get_info<ErrorInfo>::get(*x);
+        else
+            return 0;
+        }
+#endif
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/info.hpp b/gatb-core/thirdparty/boost/exception/info.hpp
new file mode 100644
index 0000000..762a950
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/info.hpp
@@ -0,0 +1,198 @@
+//Copyright (c) 2006-2010 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_8D22C4CA9CC811DCAA9133D256D89593
+#define UUID_8D22C4CA9CC811DCAA9133D256D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/exception.hpp>
+#include <boost/exception/to_string_stub.hpp>
+#include <boost/exception/detail/error_info_impl.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/config.hpp>
+#include <map>
+
+namespace
+boost
+    {
+    template <class Tag,class T>
+    inline
+    std::string
+    error_info_name( error_info<Tag,T> const & x )
+        {
+        return tag_type_name<Tag>();
+        }
+
+    template <class Tag,class T>
+    inline
+    std::string
+    to_string( error_info<Tag,T> const & x )
+        {
+        return '[' + error_info_name(x) + "] = " + to_string_stub(x.value()) + '\n';
+        }
+
+    template <class Tag,class T>
+    inline
+    error_info<Tag,T>::
+    error_info( value_type const & value ):
+        value_(value)
+        {
+        }
+
+    template <class Tag,class T>
+    inline
+    error_info<Tag,T>::
+    ~error_info() throw()
+        {
+        }
+
+    template <class Tag,class T>
+    inline
+    std::string
+    error_info<Tag,T>::
+    name_value_string() const
+        {
+        return to_string_stub(*this);
+        }
+
+    namespace
+    exception_detail
+        {
+        class
+        error_info_container_impl:
+            public error_info_container
+            {
+            public:
+
+            error_info_container_impl():
+                count_(0)
+                {
+                }
+
+            ~error_info_container_impl() throw()
+                {
+                }
+
+            void
+            set( shared_ptr<error_info_base> const & x, type_info_ const & typeid_ )
+                {
+                BOOST_ASSERT(x);
+                info_[typeid_] = x;
+                diagnostic_info_str_.clear();
+                }
+
+            shared_ptr<error_info_base>
+            get( type_info_ const & ti ) const
+                {
+                error_info_map::const_iterator i=info_.find(ti);
+                if( info_.end()!=i )
+                    {
+                    shared_ptr<error_info_base> const & p = i->second;
+#ifndef BOOST_NO_RTTI
+                    BOOST_ASSERT( *BOOST_EXCEPTION_DYNAMIC_TYPEID(*p).type_==*ti.type_ );
+#endif
+                    return p;
+                    }
+                return shared_ptr<error_info_base>();
+                }
+
+            char const *
+            diagnostic_information( char const * header ) const
+                {
+                if( header )
+                    {
+                    std::ostringstream tmp;
+                    tmp << header;
+                    for( error_info_map::const_iterator i=info_.begin(),end=info_.end(); i!=end; ++i )
+                        {
+                        error_info_base const & x = *i->second;
+                        tmp << x.name_value_string();
+                        }
+                    tmp.str().swap(diagnostic_info_str_);
+                    }
+                return diagnostic_info_str_.c_str();
+                }
+
+            private:
+
+            friend class boost::exception;
+
+            typedef std::map< type_info_, shared_ptr<error_info_base> > error_info_map;
+            error_info_map info_;
+            mutable std::string diagnostic_info_str_;
+            mutable int count_;
+
+            error_info_container_impl( error_info_container_impl const & );
+            error_info_container_impl & operator=( error_info_container const & );
+
+            void
+            add_ref() const
+                {
+                ++count_;
+                }
+
+            bool
+            release() const
+                {
+                if( --count_ )
+                    return false;
+                else
+                    {
+                    delete this;
+                    return true;
+                    }
+                }
+
+            refcount_ptr<error_info_container>
+            clone() const
+                {
+                refcount_ptr<error_info_container> p;
+                error_info_container_impl * c=new error_info_container_impl;
+                p.adopt(c);
+                c->info_ = info_;
+                return p;
+                }
+            };
+
+        template <class E,class Tag,class T>
+        inline
+        E const &
+        set_info( E const & x, error_info<Tag,T> const & v )
+            {
+            typedef error_info<Tag,T> error_info_tag_t;
+            shared_ptr<error_info_tag_t> p( new error_info_tag_t(v) );
+            exception_detail::error_info_container * c=x.data_.get();
+            if( !c )
+                x.data_.adopt(c=new exception_detail::error_info_container_impl);
+            c->set(p,BOOST_EXCEPTION_STATIC_TYPEID(error_info_tag_t));
+            return x;
+            }
+
+        template <class T>
+        struct
+        derives_boost_exception
+            {
+            enum e { value = (sizeof(dispatch_boost_exception((T*)0))==sizeof(large_size)) };
+            };
+        }
+
+    template <class E,class Tag,class T>
+    inline
+    typename enable_if<exception_detail::derives_boost_exception<E>,E const &>::type
+    operator<<( E const & x, error_info<Tag,T> const & v )
+        {
+        return exception_detail::set_info(x,v);
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/info_tuple.hpp b/gatb-core/thirdparty/boost/exception/info_tuple.hpp
new file mode 100644
index 0000000..70154fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/info_tuple.hpp
@@ -0,0 +1,100 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_63EE924290FB11DC87BB856555D89593
+#define UUID_63EE924290FB11DC87BB856555D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/info.hpp>
+#include <boost/tuple/tuple.hpp>
+
+namespace
+boost
+    {
+    template <
+        class E >
+    inline
+    E const &
+    operator<<(
+        E const & x,
+        tuple< > const & v )
+        {
+        return x;
+        }
+
+    template <
+        class E,
+        class Tag1,class T1 >
+    inline
+    E const &
+    operator<<(
+        E const & x,
+        tuple<
+            error_info<Tag1,T1> > const & v )
+        {
+        return x << v.template get<0>();
+        }
+
+    template <
+        class E,
+        class Tag1,class T1,
+        class Tag2,class T2 >
+    inline
+    E const &
+    operator<<(
+        E const & x,
+        tuple<
+            error_info<Tag1,T1>,
+            error_info<Tag2,T2> > const & v )
+        {
+        return x << v.template get<0>() << v.template get<1>();
+        }
+
+    template <
+        class E,
+        class Tag1,class T1,
+        class Tag2,class T2,
+        class Tag3,class T3 >
+    inline
+    E const &
+    operator<<(
+        E const & x,
+        tuple<
+            error_info<Tag1,T1>,
+            error_info<Tag2,T2>,
+            error_info<Tag3,T3> > const & v )
+        {
+        return x << v.template get<0>() << v.template get<1>() << v.template get<2>();
+        }
+
+    template <
+        class E,
+        class Tag1,class T1,
+        class Tag2,class T2,
+        class Tag3,class T3,
+        class Tag4,class T4 >
+    inline
+    E const &
+    operator<<(
+        E const & x,
+        tuple<
+            error_info<Tag1,T1>,
+            error_info<Tag2,T2>,
+            error_info<Tag3,T3>,
+            error_info<Tag4,T4> > const & v )
+        {
+        return x << v.template get<0>() << v.template get<1>() << v.template get<2>() << v.template get<3>();
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/to_string.hpp b/gatb-core/thirdparty/boost/exception/to_string.hpp
new file mode 100644
index 0000000..68541d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/to_string.hpp
@@ -0,0 +1,88 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_7E48761AD92811DC9011477D56D89593
+#define UUID_7E48761AD92811DC9011477D56D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/exception/detail/is_output_streamable.hpp>
+#include <sstream>
+
+namespace
+boost
+    {
+    template <class T,class U>
+    std::string to_string( std::pair<T,U> const & );
+    std::string to_string( std::exception const & );
+
+    namespace
+    to_string_detail
+        {
+        template <class T>
+        typename disable_if<is_output_streamable<T>,char>::type to_string( T const & );
+        using boost::to_string;
+
+        template <class,bool IsOutputStreamable>
+        struct has_to_string_impl;
+
+        template <class T>
+        struct
+        has_to_string_impl<T,true>
+            {
+            enum e { value=1 };
+            };
+
+        template <class T>
+        struct
+        has_to_string_impl<T,false>
+            {
+            static T const & f();
+            enum e { value=1!=sizeof(to_string(f())) };
+            };
+        }
+
+    template <class T>
+    inline
+    typename enable_if<is_output_streamable<T>,std::string>::type
+    to_string( T const & x )
+        {
+        std::ostringstream out;
+        out << x;
+        return out.str();
+        }
+
+    template <class T>
+    struct
+    has_to_string
+        {
+        enum e { value=to_string_detail::has_to_string_impl<T,is_output_streamable<T>::value>::value };
+        };
+
+    template <class T,class U>
+    inline
+    std::string
+    to_string( std::pair<T,U> const & x )
+        {
+        return std::string("(") + to_string(x.first) + ',' + to_string(x.second) + ')';
+        }
+
+    inline
+    std::string
+    to_string( std::exception const & x )
+        {
+        return x.what();
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception/to_string_stub.hpp b/gatb-core/thirdparty/boost/exception/to_string_stub.hpp
new file mode 100644
index 0000000..b6ab31c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception/to_string_stub.hpp
@@ -0,0 +1,117 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_E788439ED9F011DCB181F25B55D89593
+#define UUID_E788439ED9F011DCB181F25B55D89593
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/to_string.hpp>
+#include <boost/exception/detail/object_hex_dump.hpp>
+#include <boost/assert.hpp>
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        template <bool ToStringAvailable>
+        struct
+        to_string_dispatcher
+            {
+            template <class T,class Stub>
+            static
+            std::string
+            convert( T const & x, Stub )
+                {
+                return to_string(x);
+                }
+            };
+
+        template <>
+        struct
+        to_string_dispatcher<false>
+            {
+            template <class T,class Stub>
+            static
+            std::string
+            convert( T const & x, Stub s )
+                {
+                return s(x);
+                }
+
+            template <class T>
+            static
+            std::string
+            convert( T const & x, std::string s )
+                {
+                return s;
+                }
+
+            template <class T>
+            static
+            std::string
+            convert( T const & x, char const * s )
+                {
+                BOOST_ASSERT(s!=0);
+                return s;
+                }
+            };
+
+        namespace
+        to_string_dispatch
+            {
+            template <class T,class Stub>
+            inline
+            std::string
+            dispatch( T const & x, Stub s )
+                {
+                return to_string_dispatcher<has_to_string<T>::value>::convert(x,s);
+                }
+            }
+
+        template <class T>
+        inline
+        std::string
+        string_stub_dump( T const & x )
+            {
+            return "[ " + exception_detail::object_hex_dump(x) + " ]";
+            }
+        }
+
+    template <class T>
+    inline
+    std::string
+    to_string_stub( T const & x )
+        {
+        return exception_detail::to_string_dispatch::dispatch(x,&exception_detail::string_stub_dump<T>);
+        }
+
+    template <class T,class Stub>
+    inline
+    std::string
+    to_string_stub( T const & x, Stub s )
+        {
+        return exception_detail::to_string_dispatch::dispatch(x,s);
+        }
+
+    template <class T,class U,class Stub>
+    inline
+    std::string
+    to_string_stub( std::pair<T,U> const & x, Stub s )
+        {
+        return std::string("(") + to_string_stub(x.first,s) + ',' + to_string_stub(x.second,s) + ')';
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/exception_ptr.hpp b/gatb-core/thirdparty/boost/exception_ptr.hpp
new file mode 100644
index 0000000..d48cce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/exception_ptr.hpp
@@ -0,0 +1,11 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_FA5836A2CADA11DC8CD47C8555D89593
+#define UUID_FA5836A2CADA11DC8CD47C8555D89593
+
+#include <boost/exception/detail/exception_ptr.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional.hpp b/gatb-core/thirdparty/boost/functional.hpp
new file mode 100644
index 0000000..b618485
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional.hpp
@@ -0,0 +1,548 @@
+// ------------------------------------------------------------------------------
+// Copyright (c) 2000 Cadenza New Zealand Ltd
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+// ------------------------------------------------------------------------------
+// Boost functional.hpp header file
+// See http://www.boost.org/libs/functional for documentation.
+// ------------------------------------------------------------------------------
+// $Id$
+// ------------------------------------------------------------------------------
+
+#ifndef BOOST_FUNCTIONAL_HPP
+#define BOOST_FUNCTIONAL_HPP
+
+#include <boost/config.hpp>
+#include <boost/call_traits.hpp>
+#include <functional>
+
+namespace boost
+{
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    // --------------------------------------------------------------------------
+    // The following traits classes allow us to avoid the need for ptr_fun
+    // because the types of arguments and the result of a function can be 
+    // deduced.
+    //
+    // In addition to the standard types defined in unary_function and 
+    // binary_function, we add
+    //
+    // - function_type, the type of the function or function object itself.
+    //
+    // - param_type, the type that should be used for passing the function or
+    //   function object as an argument.
+    // --------------------------------------------------------------------------
+    namespace detail
+    {
+        template <class Operation>
+        struct unary_traits_imp;
+        
+        template <class Operation>
+        struct unary_traits_imp<Operation*>
+        {
+            typedef Operation                         function_type;
+            typedef const function_type &             param_type;
+            typedef typename Operation::result_type   result_type;
+            typedef typename Operation::argument_type argument_type;
+        };
+
+        template <class R, class A>
+        struct unary_traits_imp<R(*)(A)>
+        {
+            typedef R (*function_type)(A);
+            typedef R (*param_type)(A);
+            typedef R result_type;
+            typedef A argument_type;
+        };
+
+        template <class Operation>
+        struct binary_traits_imp;
+
+        template <class Operation>
+        struct binary_traits_imp<Operation*>
+        {
+            typedef Operation                                function_type;
+            typedef const function_type &                    param_type;
+            typedef typename Operation::result_type          result_type;
+            typedef typename Operation::first_argument_type  first_argument_type;
+            typedef typename Operation::second_argument_type second_argument_type;
+        };
+        
+        template <class R, class A1, class A2>
+        struct binary_traits_imp<R(*)(A1,A2)>
+        {
+            typedef R (*function_type)(A1,A2);
+            typedef R (*param_type)(A1,A2);
+            typedef R result_type;
+            typedef A1 first_argument_type;
+            typedef A2 second_argument_type;
+        };
+    } // namespace detail
+    
+    template <class Operation>
+    struct unary_traits
+    {
+        typedef typename detail::unary_traits_imp<Operation*>::function_type function_type;
+        typedef typename detail::unary_traits_imp<Operation*>::param_type    param_type;
+        typedef typename detail::unary_traits_imp<Operation*>::result_type   result_type;
+        typedef typename detail::unary_traits_imp<Operation*>::argument_type argument_type;
+    }; 
+
+    template <class R, class A>
+    struct unary_traits<R(*)(A)>
+    {
+        typedef R (*function_type)(A);
+        typedef R (*param_type)(A);
+        typedef R result_type;
+        typedef A argument_type;
+    };
+
+    template <class Operation>
+    struct binary_traits
+    {
+        typedef typename detail::binary_traits_imp<Operation*>::function_type        function_type;
+        typedef typename detail::binary_traits_imp<Operation*>::param_type           param_type;
+        typedef typename detail::binary_traits_imp<Operation*>::result_type          result_type;
+        typedef typename detail::binary_traits_imp<Operation*>::first_argument_type  first_argument_type;
+        typedef typename detail::binary_traits_imp<Operation*>::second_argument_type second_argument_type;
+    };
+    
+    template <class R, class A1, class A2>
+    struct binary_traits<R(*)(A1,A2)>
+    {
+        typedef R (*function_type)(A1,A2);
+        typedef R (*param_type)(A1,A2);
+        typedef R result_type;
+        typedef A1 first_argument_type;
+        typedef A2 second_argument_type;
+    };
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    // --------------------------------------------------------------------------
+    // If we have no partial specialisation available, decay to a situation
+    // that is no worse than in the Standard, i.e., ptr_fun will be required.
+    // --------------------------------------------------------------------------
+
+    template <class Operation>
+    struct unary_traits
+    {
+        typedef Operation                         function_type;
+        typedef const Operation&                  param_type;
+        typedef typename Operation::result_type   result_type;
+        typedef typename Operation::argument_type argument_type;
+    }; 
+    
+    template <class Operation>
+    struct binary_traits
+    {
+        typedef Operation                                function_type;
+        typedef const Operation &                        param_type;
+        typedef typename Operation::result_type          result_type;
+        typedef typename Operation::first_argument_type  first_argument_type;
+        typedef typename Operation::second_argument_type second_argument_type;
+    };    
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    
+    // --------------------------------------------------------------------------
+    // unary_negate, not1
+    // --------------------------------------------------------------------------
+    template <class Predicate>
+    class unary_negate
+        : public std::unary_function<typename unary_traits<Predicate>::argument_type,bool>
+    {
+      public:
+        explicit unary_negate(typename unary_traits<Predicate>::param_type x)
+            :
+            pred(x)
+        {}
+        bool operator()(typename call_traits<typename unary_traits<Predicate>::argument_type>::param_type x) const
+        {
+            return !pred(x);
+        }
+      private:
+        typename unary_traits<Predicate>::function_type pred;
+    };
+
+    template <class Predicate>
+    unary_negate<Predicate> not1(const Predicate &pred)
+    {
+        // The cast is to placate Borland C++Builder in certain circumstances.
+        // I don't think it should be necessary.
+        return unary_negate<Predicate>((typename unary_traits<Predicate>::param_type)pred);
+    }
+
+    template <class Predicate>
+    unary_negate<Predicate> not1(Predicate &pred)
+    {
+        return unary_negate<Predicate>(pred);
+    }
+
+    // --------------------------------------------------------------------------
+    // binary_negate, not2
+    // --------------------------------------------------------------------------
+    template <class Predicate>
+    class binary_negate
+        : public std::binary_function<typename binary_traits<Predicate>::first_argument_type,
+                                      typename binary_traits<Predicate>::second_argument_type,
+                                      bool>
+    {
+      public:
+        explicit binary_negate(typename binary_traits<Predicate>::param_type x)
+            :
+            pred(x)
+        {}
+        bool operator()(typename call_traits<typename binary_traits<Predicate>::first_argument_type>::param_type x,
+                        typename call_traits<typename binary_traits<Predicate>::second_argument_type>::param_type y) const
+        {
+            return !pred(x,y);
+        }
+      private:
+        typename binary_traits<Predicate>::function_type pred;
+    };
+
+    template <class Predicate>
+    binary_negate<Predicate> not2(const Predicate &pred)
+    {
+        // The cast is to placate Borland C++Builder in certain circumstances.
+        // I don't think it should be necessary.
+        return binary_negate<Predicate>((typename binary_traits<Predicate>::param_type)pred);
+    }
+
+    template <class Predicate>
+    binary_negate<Predicate> not2(Predicate &pred)
+    {
+        return binary_negate<Predicate>(pred);
+    }
+        
+    // --------------------------------------------------------------------------
+    // binder1st, bind1st
+    // --------------------------------------------------------------------------
+    template <class Operation>
+    class binder1st
+        : public std::unary_function<typename binary_traits<Operation>::second_argument_type,
+                                     typename binary_traits<Operation>::result_type>
+    {       
+      public:
+        binder1st(typename binary_traits<Operation>::param_type x,
+                  typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type y)
+            :
+            op(x), value(y)
+        {}
+        
+        typename binary_traits<Operation>::result_type
+        operator()(typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type x) const
+        {
+            return op(value, x);
+        }
+        
+      protected:
+        typename binary_traits<Operation>::function_type op;
+        typename binary_traits<Operation>::first_argument_type value;
+    };
+
+    template <class Operation>
+    inline binder1st<Operation> bind1st(const Operation &op,
+                                        typename call_traits<
+                                                    typename binary_traits<Operation>::first_argument_type
+                                        >::param_type x)
+    {
+        // The cast is to placate Borland C++Builder in certain circumstances.
+        // I don't think it should be necessary.
+        return binder1st<Operation>((typename binary_traits<Operation>::param_type)op, x);
+    }
+
+    template <class Operation>
+    inline binder1st<Operation> bind1st(Operation &op,
+                                        typename call_traits<
+                                                    typename binary_traits<Operation>::first_argument_type
+                                        >::param_type x)
+    {
+        return binder1st<Operation>(op, x);
+    }
+
+    // --------------------------------------------------------------------------
+    // binder2nd, bind2nd
+    // --------------------------------------------------------------------------
+    template <class Operation>
+    class binder2nd
+        : public std::unary_function<typename binary_traits<Operation>::first_argument_type,
+                                     typename binary_traits<Operation>::result_type>
+    {
+      public:
+        binder2nd(typename binary_traits<Operation>::param_type x,
+                  typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type y)
+            :
+            op(x), value(y)
+        {}
+        
+        typename binary_traits<Operation>::result_type
+        operator()(typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type x) const
+        {
+            return op(x, value);
+        }               
+        
+      protected:
+        typename binary_traits<Operation>::function_type op;
+        typename binary_traits<Operation>::second_argument_type value;
+    };
+
+    template <class Operation>
+    inline binder2nd<Operation> bind2nd(const Operation &op,
+                                        typename call_traits<
+                                                    typename binary_traits<Operation>::second_argument_type
+                                        >::param_type x)
+    {
+        // The cast is to placate Borland C++Builder in certain circumstances.
+        // I don't think it should be necessary.
+        return binder2nd<Operation>((typename binary_traits<Operation>::param_type)op, x);
+    }
+
+    template <class Operation>
+    inline binder2nd<Operation> bind2nd(Operation &op,
+                                        typename call_traits<
+                                                    typename binary_traits<Operation>::second_argument_type
+                                        >::param_type x)
+    {
+        return binder2nd<Operation>(op, x);
+    }
+
+    // --------------------------------------------------------------------------
+    // mem_fun, etc
+    // --------------------------------------------------------------------------
+    template <class S, class T>
+    class mem_fun_t : public std::unary_function<T*, S>
+    {
+      public:
+        explicit mem_fun_t(S (T::*p)())
+            :
+            ptr(p)
+        {}
+        S operator()(T* p) const
+        {
+            return (p->*ptr)();
+        }
+      private:
+        S (T::*ptr)();
+    };
+
+    template <class S, class T, class A>
+    class mem_fun1_t : public std::binary_function<T*, A, S>
+    {
+      public:   
+        explicit mem_fun1_t(S (T::*p)(A))
+            :
+            ptr(p)
+        {}
+        S operator()(T* p, typename call_traits<A>::param_type x) const
+        {
+            return (p->*ptr)(x);
+        }
+      private:
+        S (T::*ptr)(A);
+    };
+
+    template <class S, class T>
+    class const_mem_fun_t : public std::unary_function<const T*, S>
+    {
+      public:
+        explicit const_mem_fun_t(S (T::*p)() const)
+            :
+            ptr(p)
+        {}
+        S operator()(const T* p) const
+        {
+            return (p->*ptr)();
+        }
+      private:
+        S (T::*ptr)() const;        
+    };
+
+    template <class S, class T, class A>
+    class const_mem_fun1_t : public std::binary_function<const T*, A, S>
+    {
+      public:
+        explicit const_mem_fun1_t(S (T::*p)(A) const)
+            :
+            ptr(p)
+        {}
+        S operator()(const T* p, typename call_traits<A>::param_type x) const
+        {
+            return (p->*ptr)(x);
+        }
+      private:
+        S (T::*ptr)(A) const;
+    };
+    
+    template<class S, class T>
+    inline mem_fun_t<S,T> mem_fun(S (T::*f)())
+    {
+        return mem_fun_t<S,T>(f);
+    }
+    
+    template<class S, class T, class A>
+    inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))
+    {
+        return mem_fun1_t<S,T,A>(f);
+    }
+
+#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
+    template<class S, class T>
+    inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const)
+    {
+        return const_mem_fun_t<S,T>(f);
+    }
+    
+    template<class S, class T, class A>
+    inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const)
+    {
+        return const_mem_fun1_t<S,T,A>(f);
+    }
+#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
+
+    // --------------------------------------------------------------------------
+    // mem_fun_ref, etc
+    // --------------------------------------------------------------------------
+    template <class S, class T>
+    class mem_fun_ref_t : public std::unary_function<T&, S>
+    {
+      public:
+        explicit mem_fun_ref_t(S (T::*p)())
+            :
+            ptr(p)
+        {}
+        S operator()(T& p) const
+        {
+            return (p.*ptr)();
+        }
+      private:
+        S (T::*ptr)();
+    };
+
+    template <class S, class T, class A>
+    class mem_fun1_ref_t : public std::binary_function<T&, A, S>
+    {
+      public:
+        explicit mem_fun1_ref_t(S (T::*p)(A))
+            :
+            ptr(p)
+        {}
+        S operator()(T& p, typename call_traits<A>::param_type x) const
+        {
+            return (p.*ptr)(x);
+        }
+      private:
+        S (T::*ptr)(A);
+    };
+    
+    template <class S, class T>
+    class const_mem_fun_ref_t : public std::unary_function<const T&, S>
+    {
+      public:
+        explicit const_mem_fun_ref_t(S (T::*p)() const)
+            :
+            ptr(p)
+        {}
+        
+        S operator()(const T &p) const
+        {
+            return (p.*ptr)();
+        }
+      private:
+        S (T::*ptr)() const;
+    };
+
+    template <class S, class T, class A>
+    class const_mem_fun1_ref_t : public std::binary_function<const T&, A, S>
+    {
+      public:
+        explicit const_mem_fun1_ref_t(S (T::*p)(A) const)
+            :
+            ptr(p)
+        {}
+
+        S operator()(const T& p, typename call_traits<A>::param_type x) const
+        {
+            return (p.*ptr)(x);
+        }
+      private:
+        S (T::*ptr)(A) const;
+    };
+    
+    template<class S, class T>
+    inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())
+    {
+        return mem_fun_ref_t<S,T>(f);
+    }
+
+    template<class S, class T, class A>
+    inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))
+    {
+        return mem_fun1_ref_t<S,T,A>(f);
+    }
+
+#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
+    template<class S, class T>
+    inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const)
+    {
+        return const_mem_fun_ref_t<S,T>(f);
+    }
+
+    template<class S, class T, class A>
+    inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const)
+    {
+        return const_mem_fun1_ref_t<S,T,A>(f);
+    }   
+#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
+
+    // --------------------------------------------------------------------------
+    // ptr_fun
+    // --------------------------------------------------------------------------
+    template <class Arg, class Result>
+    class pointer_to_unary_function : public std::unary_function<Arg,Result>
+    {
+      public:
+        explicit pointer_to_unary_function(Result (*f)(Arg))
+            :
+            func(f)
+        {}
+
+        Result operator()(typename call_traits<Arg>::param_type x) const
+        {
+            return func(x);
+        }
+        
+      private:
+        Result (*func)(Arg);
+    };
+
+    template <class Arg, class Result>
+    inline pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg))
+    {
+        return pointer_to_unary_function<Arg,Result>(f);
+    }
+
+    template <class Arg1, class Arg2, class Result>
+    class pointer_to_binary_function : public std::binary_function<Arg1,Arg2,Result>
+    {
+      public:
+        explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2))
+            :
+            func(f)
+        {}
+        
+        Result operator()(typename call_traits<Arg1>::param_type x, typename call_traits<Arg2>::param_type y) const
+        {
+            return func(x,y);
+        }
+        
+      private:
+        Result (*func)(Arg1, Arg2);
+    };
+
+    template <class Arg1, class Arg2, class Result>
+    inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
+    {
+        return pointer_to_binary_function<Arg1,Arg2,Result>(f);
+    }
+} // namespace boost
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/factory.hpp b/gatb-core/thirdparty/boost/functional/factory.hpp
new file mode 100644
index 0000000..67fee71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/factory.hpp
@@ -0,0 +1,179 @@
+/*=============================================================================
+    Copyright (c) 2007 Tobias Schwinger
+  
+    Use modification and distribution are subject to the Boost Software 
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_FACTORY_HPP_INCLUDED
+#   ifndef BOOST_PP_IS_ITERATING
+
+#     include <boost/preprocessor/iteration/iterate.hpp>
+#     include <boost/preprocessor/repetition/enum_params.hpp>
+#     include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#     include <new>
+#     include <boost/pointee.hpp>
+#     include <boost/get_pointer.hpp>
+#     include <boost/non_type.hpp>
+#     include <boost/type_traits/remove_cv.hpp>
+
+#     if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+#       include <boost/none_t.hpp>
+#     endif
+
+#     ifndef BOOST_FUNCTIONAL_FACTORY_MAX_ARITY
+#       define BOOST_FUNCTIONAL_FACTORY_MAX_ARITY 10
+#     elif BOOST_FUNCTIONAL_FACTORY_MAX_ARITY < 3
+#       undef  BOOST_FUNCTIONAL_FACTORY_MAX_ARITY
+#       define BOOST_FUNCTIONAL_FACTORY_MAX_ARITY 3
+#     endif
+
+namespace boost
+{
+    enum factory_alloc_propagation
+    {
+        factory_alloc_for_pointee_and_deleter,
+        factory_passes_alloc_to_smart_pointer
+    };
+
+#if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+    template< typename Pointer, class Allocator = boost::none_t,
+        factory_alloc_propagation AP = factory_alloc_for_pointee_and_deleter >
+    class factory;
+#else
+    template< typename Pointer, class Allocator = void,
+        factory_alloc_propagation AP = factory_alloc_for_pointee_and_deleter >
+    class factory;
+#endif
+
+    //----- ---- --- -- - -  -   -
+
+    template< typename Pointer, factory_alloc_propagation AP >
+    class factory<Pointer, void, AP>
+    {
+      public:
+        typedef typename boost::remove_cv<Pointer>::type result_type;
+        typedef typename boost::pointee<result_type>::type value_type;
+
+        factory()
+        { }
+
+#     define BOOST_PP_FILENAME_1 <boost/functional/factory.hpp>
+#     define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_FACTORY_MAX_ARITY)
+#     include BOOST_PP_ITERATE()
+    };
+
+#if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+    template< typename Pointer, factory_alloc_propagation AP >
+    class factory<Pointer, boost::none_t, AP>
+        : public factory<Pointer, void, AP>
+    {};
+#endif
+
+    template< class Pointer, class Allocator, factory_alloc_propagation AP >
+    class factory
+        : private Allocator::template rebind< typename boost::pointee<
+            typename boost::remove_cv<Pointer>::type >::type >::other
+    {
+      public:
+        typedef typename boost::remove_cv<Pointer>::type result_type;
+        typedef typename boost::pointee<result_type>::type value_type;
+
+        typedef typename Allocator::template rebind<value_type>::other
+            allocator_type;
+
+        explicit factory(allocator_type const & a = allocator_type())
+          : allocator_type(a)
+        { }
+
+      private:
+
+        struct deleter
+            : allocator_type
+        {
+            inline deleter(allocator_type const& that) 
+              : allocator_type(that)
+            { }
+
+            allocator_type& get_allocator() const
+            {
+                return *const_cast<allocator_type*>(
+                    static_cast<allocator_type const*>(this));
+            }
+
+            void operator()(value_type* ptr) const
+            {
+                if (!! ptr) ptr->~value_type();
+                const_cast<allocator_type*>(static_cast<allocator_type const*>(
+                    this))->deallocate(ptr,1);
+            }
+        };
+
+        inline allocator_type& get_allocator() const
+        {
+            return *const_cast<allocator_type*>(
+                static_cast<allocator_type const*>(this));
+        }
+
+        inline result_type make_pointer(value_type* ptr, boost::non_type<
+            factory_alloc_propagation,factory_passes_alloc_to_smart_pointer>)
+        const
+        {
+            return result_type(ptr,deleter(this->get_allocator()));
+        }
+        inline result_type make_pointer(value_type* ptr, boost::non_type<
+            factory_alloc_propagation,factory_alloc_for_pointee_and_deleter>)
+        const
+        {
+            return result_type(ptr,deleter(this->get_allocator()),
+                this->get_allocator());
+        }
+
+      public:
+
+#     define BOOST_TMP_MACRO
+#     define BOOST_PP_FILENAME_1 <boost/functional/factory.hpp>
+#     define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_FACTORY_MAX_ARITY)
+#     include BOOST_PP_ITERATE()
+#     undef BOOST_TMP_MACRO
+    };
+
+    template< typename Pointer, class Allocator, factory_alloc_propagation AP > 
+    class factory<Pointer&, Allocator, AP>;
+    // forbidden, would create a dangling reference
+}
+
+#     define BOOST_FUNCTIONAL_FACTORY_HPP_INCLUDED
+#   else // defined(BOOST_PP_IS_ITERATING)
+#     define N BOOST_PP_ITERATION()
+#     if !defined(BOOST_TMP_MACRO)
+#       if N > 0
+    template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+#       endif
+    inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+    {
+        return result_type( new value_type(BOOST_PP_ENUM_PARAMS(N,a)) );
+    }
+#     else // defined(BOOST_TMP_MACRO)
+#       if N > 0
+    template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+#       endif
+    inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+    {
+        value_type* memory = this->get_allocator().allocate(1);
+        try
+        { 
+            return make_pointer(
+                new(memory) value_type(BOOST_PP_ENUM_PARAMS(N,a)),
+                boost::non_type<factory_alloc_propagation,AP>() );
+        }
+        catch (...) { this->get_allocator().deallocate(memory,1); throw; }
+    }
+#     endif
+#     undef N
+#   endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/functional/forward_adapter.hpp b/gatb-core/thirdparty/boost/functional/forward_adapter.hpp
new file mode 100644
index 0000000..796abd2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/forward_adapter.hpp
@@ -0,0 +1,472 @@
+/*=============================================================================
+    Copyright (c) 2007-2008 Tobias Schwinger
+  
+    Use modification and distribution are subject to the Boost Software 
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt).  
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_FORWARD_ADAPTER_HPP_INCLUDED
+#   ifndef BOOST_PP_IS_ITERATING
+
+#   include <boost/config.hpp>
+#   include <boost/detail/workaround.hpp>
+
+#   include <boost/preprocessor/iteration/iterate.hpp>
+#   include <boost/preprocessor/repetition/enum_params.hpp>
+#   include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#   include <boost/preprocessor/facilities/intercept.hpp>
+#   include <boost/preprocessor/arithmetic/dec.hpp>
+
+#   include <boost/utility/result_of.hpp>
+
+#   ifndef BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY
+#     define BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY 6
+#   elif BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY < 3
+#     undef  BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY
+#     define BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY 3
+#   endif
+
+
+namespace boost 
+{
+    template< typename Function, int Arity_Or_MinArity = -1, int MaxArity = -1 >
+    class forward_adapter;
+
+    //----- ---- --- -- - -  -   -
+
+    namespace detail
+    {
+        template< class MostDerived, typename Function, typename FunctionConst, 
+            int Arity, int MinArity >
+        struct forward_adapter_impl;
+
+        struct forward_adapter_result
+        {
+            template< typename Sig > struct apply;
+
+            // Utility metafunction for qualification adjustment on arguments
+            template< typename T > struct q          { typedef T const t; };
+            template< typename T > struct q<T const> { typedef T const t; };
+            template< typename T > struct q<T &>     { typedef T       t; };
+
+            // Utility metafunction to choose target function qualification
+            template< typename T > struct c
+            { typedef typename T::target_function_t t; };
+            template< typename T > struct c<T&      >
+            { typedef typename T::target_function_t t; };
+            template< typename T > struct c<T const >
+            { typedef typename T::target_function_const_t t; };
+            template< typename T > struct c<T const&>
+            { typedef typename T::target_function_const_t t; };
+        };
+    }
+
+#   define BOOST_TMP_MACRO(f,fn,fc) \
+        boost::detail::forward_adapter_impl< \
+            forward_adapter<f,Arity_Or_MinArity,MaxArity>, fn, fc, \
+            (MaxArity!=-1? MaxArity :Arity_Or_MinArity!=-1? Arity_Or_MinArity \
+                :BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY), \
+            (Arity_Or_MinArity!=-1? Arity_Or_MinArity : 0) >
+
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class forward_adapter
+        : public BOOST_TMP_MACRO(Function,Function,Function const)
+        , private Function
+    {
+      public:
+        forward_adapter(Function const& f = Function()) 
+          : Function(f) 
+        { }
+
+        typedef Function        target_function_t;
+        typedef Function const  target_function_const_t;
+
+        Function       & target_function()       { return *this; }
+        Function const & target_function() const { return *this; }
+
+        template< typename Sig > struct result
+            : detail::forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function,Function, Function const)::operator();
+    };
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class forward_adapter< Function const, Arity_Or_MinArity, MaxArity >
+        : public BOOST_TMP_MACRO(Function const, Function const, Function const)
+        , private Function
+    {
+      public:
+        forward_adapter(Function const& f = Function())
+          : Function(f) 
+        { }
+
+        typedef Function const target_function_t;
+        typedef Function const target_function_const_t;
+
+        Function const & target_function() const { return *this; }
+
+        template< typename Sig > struct result
+            : detail::forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function const,Function const, Function const)
+            ::operator();
+    };
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class forward_adapter< Function &, Arity_Or_MinArity, MaxArity >
+        : public BOOST_TMP_MACRO(Function&, Function, Function)
+    {
+        Function& ref_function;
+      public:
+        forward_adapter(Function& f)
+          : ref_function(f) 
+        { }
+
+        typedef Function target_function_t;
+        typedef Function target_function_const_t;
+
+        Function & target_function() const { return this->ref_function; }
+
+        template< typename Sig > struct result
+            : detail::forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function&, Function, Function)::operator();
+    }; 
+
+    #undef BOOST_TMP_MACRO
+
+    namespace detail
+    {
+        template< class Self >
+        struct forward_adapter_result::apply< Self() >
+            : boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
+        { };
+
+        template< class MD, class F, class FC >
+        struct forward_adapter_impl<MD,F,FC,0,0>
+        {
+            inline typename boost::result_of< FC() >::type
+            operator()() const
+            {
+                return static_cast<MD const*>(this)->target_function()();
+            }
+
+            inline typename boost::result_of< F() >::type
+            operator()()
+            {
+                return static_cast<MD*>(this)->target_function()();
+            }
+
+        // closing brace gets generated by preprocessing code, below
+
+#       define BOOST_TMP_MACRO(tpl_params,arg_types,params,args)              \
+            template< tpl_params >                                             \
+            inline typename boost::result_of< FC(arg_types) >::type            \
+            operator()(params) const                                           \
+            {                                                                  \
+                return static_cast<MD const*>(this)->target_function()(args);  \
+            }                                                                  \
+            template< tpl_params >                                             \
+            inline typename boost::result_of< F(arg_types)>::type              \
+            operator()(params)                                                 \
+            {                                                                  \
+                return static_cast<MD*>(this)->target_function()(args);        \
+            }
+
+#       // This is the total number of iterations we need
+#       define count ((1 << BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY+1)-2)
+
+#       // Chain file iteration to virtually one loop
+#       if BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY <= 7
+#         define limit1 count
+#         define limit2 0
+#         define limit3 0
+#       else
+#         if BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY <= 15
+#           define limit1 (count >> 8)
+#           define limit2 255
+#           define limit3 0
+#         else
+#           define limit1 (count >> 16)
+#           define limit2 255
+#           define limit3 255
+#         endif
+#       endif
+
+#       define N 0
+
+#       define  BOOST_PP_FILENAME_1 <boost/functional/forward_adapter.hpp>
+#       define  BOOST_PP_ITERATION_LIMITS (0,limit1)
+#       include BOOST_PP_ITERATE()
+
+#       undef N
+#       undef limit3
+#       undef limit2
+#       undef limit1
+#       undef count
+#       undef BOOST_TMP_MACRO
+
+        };
+
+    } // namespace detail
+
+    template<class F, int A0, int A1>
+    struct result_of<boost::forward_adapter<F,A0,A1> const ()>
+        : boost::detail::forward_adapter_result::template apply<
+            boost::forward_adapter<F,A0,A1> const () >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::forward_adapter<F,A0,A1>()>
+        : boost::detail::forward_adapter_result::template apply<
+            boost::forward_adapter<F,A0,A1>() >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::forward_adapter<F,A0,A1> const& ()>
+        : boost::detail::forward_adapter_result::template apply<
+            boost::forward_adapter<F,A0,A1> const () >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::forward_adapter<F,A0,A1>& ()>
+        : boost::detail::forward_adapter_result::template apply<
+            boost::forward_adapter<F,A0,A1>() >
+    { };
+}
+
+#       define BOOST_FUNCTIONAL_FORWARD_ADAPTER_HPP_INCLUDED
+
+#   elif BOOST_PP_ITERATION_DEPTH() == 1 && limit2
+#     define  BOOST_PP_FILENAME_2 <boost/functional/forward_adapter.hpp>
+#     define  BOOST_PP_ITERATION_LIMITS (0,limit2)
+#     include BOOST_PP_ITERATE()
+#   elif BOOST_PP_ITERATION_DEPTH() == 2 && limit3
+#     define  BOOST_PP_FILENAME_3 <boost/functional/forward_adapter.hpp>
+#     define  BOOST_PP_ITERATION_LIMITS (0,limit3)
+#     include BOOST_PP_ITERATE()
+
+#   else
+
+#     // I is the loop counter
+#     if limit2 && limit3
+#       define I (BOOST_PP_ITERATION_1 << 16 | BOOST_PP_ITERATION_2 << 8 | \
+            BOOST_PP_ITERATION_3)
+#     elif limit2
+#       define I (BOOST_PP_ITERATION_1 << 8 | BOOST_PP_ITERATION_2)
+#     else
+#       define I BOOST_PP_ITERATION_1
+#     endif
+
+#     if I < count
+
+#       // Done for this arity? Increment N
+#       if (I+2 >> N+1) 
+#         if N == 0
+#           undef N
+#           define N 1
+#         elif N == 1
+#           undef N
+#           define N 2
+#         elif N == 2
+#           undef N
+#           define N 3
+#         elif N == 3
+#           undef N
+#           define N 4
+#         elif N == 4
+#           undef N
+#           define N 5
+#         elif N == 5
+#           undef N
+#           define N 6
+#         elif N == 6
+#           undef N
+#           define N 7
+#         elif N == 7
+#           undef N
+#           define N 8
+#         elif N == 8
+#           undef N
+#           define N 9
+#         elif N == 9
+#           undef N
+#           define N 10
+#         elif N == 10
+#           undef N
+#           define N 11
+#         elif N == 11
+#           undef N
+#           define N 12
+#         elif N == 12
+#           undef N
+#           define N 13
+#         elif N == 13
+#           undef N
+#           define N 14
+#         elif N == 14
+#           undef N
+#           define N 15
+#         elif N == 15
+#           undef N
+#           define N 16
+#         endif
+
+        };
+
+        template< class Self, BOOST_PP_ENUM_PARAMS(N,typename T) >
+        struct forward_adapter_result::apply< Self(BOOST_PP_ENUM_PARAMS(N,T)) >
+            : boost::result_of< 
+                BOOST_DEDUCED_TYPENAME c<Self>::t(BOOST_PP_ENUM_BINARY_PARAMS(N, 
+                      typename q<T,>::t& BOOST_PP_INTERCEPT)) >
+        { };
+
+        template< class MD, class F, class FC >
+        struct forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),N>
+        {
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename boost::result_of< F(
+                BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT)) >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT));
+        };
+
+        template< class MD, class F, class FC, int MinArity >
+        struct forward_adapter_impl<MD,F,FC,N,MinArity>
+            : forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>
+        {
+            using forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>::operator();
+
+#       endif
+
+#       // Zero based count for each arity would be I-(1<<N)+2, but we don't
+#       // need it, unless we need a nicer order.
+
+#       // Macros for the parameter's type modifiers.
+#       if I & 0x000001
+#         define PT0 T0 &
+#       else
+#         define PT0 T0 const &
+#       endif
+#       if I & 0x000002
+#         define PT1 T1 &
+#       else
+#         define PT1 T1 const &
+#       endif
+#       if I & 0x000004
+#         define PT2 T2 &
+#       else
+#         define PT2 T2 const &
+#       endif
+#       if I & 0x000008
+#         define PT3 T3 &
+#       else
+#         define PT3 T3 const &
+#       endif
+#       if I & 0x000010
+#         define PT4 T4 &
+#       else
+#         define PT4 T4 const &
+#       endif
+#       if I & 0x000020
+#         define PT5 T5 &
+#       else
+#         define PT5 T5 const &
+#       endif
+#       if I & 0x000040
+#         define PT6 T6 &
+#       else
+#         define PT6 T6 const &
+#       endif
+#       if I & 0x000080
+#         define PT7 T7 &
+#       else
+#         define PT7 T7 const &
+#       endif
+#       if I & 0x000100
+#         define PT8 T8 &
+#       else
+#         define PT8 T8 const &
+#       endif
+#       if I & 0x000200
+#         define PT9 T9 &
+#       else
+#         define PT9 T9 const &
+#       endif
+#       if I & 0x000400
+#         define PT10 T10 &
+#       else
+#         define PT10 T10 const &
+#       endif
+#       if I & 0x000800
+#         define PT11 T11 &
+#       else
+#         define PT11 T11 const &
+#       endif
+#       if I & 0x001000
+#         define PT12 T12 &
+#       else
+#         define PT12 T12 const &
+#       endif
+#       if I & 0x002000
+#         define PT13 T13 &
+#       else
+#         define PT13 T13 const &
+#       endif
+#       if I & 0x004000
+#         define PT14 T14 &
+#       else
+#         define PT14 T14 const &
+#       endif
+#       if I & 0x008000
+#         define PT15 T15 &
+#       else
+#         define PT15 T15 const &
+#       endif
+
+#       if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400)) 
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename boost::result_of<  FC(BOOST_PP_ENUM_PARAMS(N,PT)) 
+                >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a)) const
+            {
+                return static_cast<MD const* const>(this)
+                    ->target_function()(BOOST_PP_ENUM_PARAMS(N,a));
+            }
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename boost::result_of<  F(BOOST_PP_ENUM_PARAMS(N,PT))
+                >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a))
+            {
+                return static_cast<MD* const>(this)
+                    ->target_function()(BOOST_PP_ENUM_PARAMS(N,a));
+            }
+#       else
+        BOOST_TMP_MACRO(BOOST_PP_ENUM_PARAMS(N,typename T),
+            BOOST_PP_ENUM_PARAMS(N,PT), BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a),
+            BOOST_PP_ENUM_PARAMS(N,a) )
+        // ...generates uglier code but is faster - it caches ENUM_*
+#       endif
+
+#       undef PT0
+#       undef PT1
+#       undef PT2
+#       undef PT3
+#       undef PT4
+#       undef PT5
+#       undef PT6
+#       undef PT7
+#       undef PT8
+#       undef PT9
+#       undef PT10
+#       undef PT11
+#       undef PT12
+#       undef PT13
+#       undef PT14
+#       undef PT15
+
+#     endif // I < count
+
+#     undef I
+#   endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/functional/hash.hpp b/gatb-core/thirdparty/boost/functional/hash.hpp
new file mode 100644
index 0000000..44983f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash.hpp
@@ -0,0 +1,7 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/functional/hash/hash.hpp>
+
diff --git a/gatb-core/thirdparty/boost/functional/hash/detail/float_functions.hpp b/gatb-core/thirdparty/boost/functional/hash/detail/float_functions.hpp
new file mode 100644
index 0000000..f3db52f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/detail/float_functions.hpp
@@ -0,0 +1,336 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_FLOAT_FUNCTIONS_HPP)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_FLOAT_FUNCTIONS_HPP
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+
+// Set BOOST_HASH_CONFORMANT_FLOATS to 1 for libraries known to have
+// sufficiently good floating point support to not require any
+// workarounds.
+//
+// When set to 0, the library tries to automatically
+// use the best available implementation. This normally works well, but
+// breaks when ambiguities are created by odd namespacing of the functions.
+//
+// Note that if this is set to 0, the library should still take full
+// advantage of the platform's floating point support.
+
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__LIBCOMO__)
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+// Rogue Wave library:
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(_LIBCPP_VERSION)
+// libc++
+#   define BOOST_HASH_CONFORMANT_FLOATS 1
+#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+// GNU libstdc++ 3
+#   if defined(__GNUC__) && __GNUC__ >= 4
+#       define BOOST_HASH_CONFORMANT_FLOATS 1
+#   else
+#       define BOOST_HASH_CONFORMANT_FLOATS 0
+#   endif
+#elif defined(__STL_CONFIG_H)
+// generic SGI STL
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__MSL_CPP__)
+// MSL standard lib:
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif defined(__IBMCPP__)
+// VACPP std lib (probably conformant for much earlier version).
+#   if __IBMCPP__ >= 1210
+#       define BOOST_HASH_CONFORMANT_FLOATS 1
+#   else
+#       define BOOST_HASH_CONFORMANT_FLOATS 0
+#   endif
+#elif defined(MSIPL_COMPILE_H)
+// Modena C++ standard library
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
+// Dinkumware Library (this has to appear after any possible replacement libraries):
+#   if _CPPLIB_VER >= 405
+#       define BOOST_HASH_CONFORMANT_FLOATS 1
+#   else
+#       define BOOST_HASH_CONFORMANT_FLOATS 0
+#   endif
+#else
+#   define BOOST_HASH_CONFORMANT_FLOATS 0
+#endif
+
+#if BOOST_HASH_CONFORMANT_FLOATS
+
+// The standard library is known to be compliant, so don't use the
+// configuration mechanism.
+
+namespace boost {
+    namespace hash_detail {
+        template <typename Float>
+        struct call_ldexp {
+            typedef Float float_type;
+            inline Float operator()(Float x, int y) const {
+                return std::ldexp(x, y);
+            }
+        };
+
+        template <typename Float>
+        struct call_frexp {
+            typedef Float float_type;
+            inline Float operator()(Float x, int* y) const {
+                return std::frexp(x, y);
+            }
+        };
+
+        template <typename Float>
+        struct select_hash_type
+        {
+            typedef Float type;
+        };
+    }
+}
+
+#else // BOOST_HASH_CONFORMANT_FLOATS == 0
+
+// The C++ standard requires that the C float functions are overloarded
+// for float, double and long double in the std namespace, but some of the older
+// library implementations don't support this. On some that don't, the C99
+// float functions (frexpf, frexpl, etc.) are available.
+//
+// The following tries to automatically detect which are available.
+
+namespace boost {
+    namespace hash_detail {
+
+        // Returned by dummy versions of the float functions.
+    
+        struct not_found {
+            // Implicitly convertible to float and long double in order to avoid
+            // a compile error when the dummy float functions are used.
+
+            inline operator float() const { return 0; }
+            inline operator long double() const { return 0; }
+        };
+          
+        // A type for detecting the return type of functions.
+
+        template <typename T> struct is;
+        template <> struct is<float> { char x[10]; };
+        template <> struct is<double> { char x[20]; };
+        template <> struct is<long double> { char x[30]; };
+        template <> struct is<boost::hash_detail::not_found> { char x[40]; };
+            
+        // Used to convert the return type of a function to a type for sizeof.
+
+        template <typename T> is<T> float_type(T);
+
+        // call_ldexp
+        //
+        // This will get specialized for float and long double
+        
+        template <typename Float> struct call_ldexp
+        {
+            typedef double float_type;
+            
+            inline double operator()(double a, int b) const
+            {
+                using namespace std;
+                return ldexp(a, b);
+            }
+        };
+
+        // call_frexp
+        //
+        // This will get specialized for float and long double
+
+        template <typename Float> struct call_frexp
+        {
+            typedef double float_type;
+            
+            inline double operator()(double a, int* b) const
+            {
+                using namespace std;
+                return frexp(a, b);
+            }
+        };
+    }
+}
+            
+// A namespace for dummy functions to detect when the actual function we want
+// isn't available. ldexpl, ldexpf etc. might be added tby the macros below.
+//
+// AFAICT these have to be outside of the boost namespace, as if they're in
+// the boost namespace they'll always be preferable to any other function
+// (since the arguments are built in types, ADL can't be used).
+
+namespace boost_hash_detect_float_functions {
+    template <class Float> boost::hash_detail::not_found ldexp(Float, int);
+    template <class Float> boost::hash_detail::not_found frexp(Float, int*);    
+}
+
+// Macros for generating specializations of call_ldexp and call_frexp.
+//
+// check_cpp and check_c99 check if the C++ or C99 functions are available.
+//
+// Then the call_* functions select an appropriate implementation.
+//
+// I used c99_func in a few places just to get a unique name.
+//
+// Important: when using 'using namespace' at namespace level, include as
+// little as possible in that namespace, as Visual C++ has an odd bug which
+// can cause the namespace to be imported at the global level. This seems to
+// happen mainly when there's a template in the same namesapce.
+
+#define BOOST_HASH_CALL_FLOAT_FUNC(cpp_func, c99_func, type1, type2)    \
+namespace boost_hash_detect_float_functions {                           \
+    template <class Float>                                              \
+    boost::hash_detail::not_found c99_func(Float, type2);               \
+}                                                                       \
+                                                                        \
+namespace boost {                                                       \
+    namespace hash_detail {                                             \
+        namespace c99_func##_detect {                                   \
+            using namespace std;                                        \
+            using namespace boost_hash_detect_float_functions;          \
+                                                                        \
+            struct check {                                              \
+                static type1 x;                                         \
+                static type2 y;                                         \
+                BOOST_STATIC_CONSTANT(bool, cpp =                       \
+                    sizeof(float_type(cpp_func(x,y)))                   \
+                        == sizeof(is<type1>));                          \
+                BOOST_STATIC_CONSTANT(bool, c99 =                       \
+                    sizeof(float_type(c99_func(x,y)))                   \
+                        == sizeof(is<type1>));                          \
+            };                                                          \
+        }                                                               \
+                                                                        \
+        template <bool x>                                               \
+        struct call_c99_##c99_func :                                    \
+            boost::hash_detail::call_##cpp_func<double> {};             \
+                                                                        \
+        template <>                                                     \
+        struct call_c99_##c99_func<true> {                              \
+            typedef type1 float_type;                                   \
+                                                                        \
+            template <typename T>                                       \
+            inline type1 operator()(type1 a, T b)  const                \
+            {                                                           \
+                using namespace std;                                    \
+                return c99_func(a, b);                                  \
+            }                                                           \
+        };                                                              \
+                                                                        \
+        template <bool x>                                               \
+        struct call_cpp_##c99_func :                                    \
+            call_c99_##c99_func<                                        \
+                ::boost::hash_detail::c99_func##_detect::check::c99     \
+            > {};                                                       \
+                                                                        \
+        template <>                                                     \
+        struct call_cpp_##c99_func<true> {                              \
+            typedef type1 float_type;                                   \
+                                                                        \
+            template <typename T>                                       \
+            inline type1 operator()(type1 a, T b)  const                \
+            {                                                           \
+                using namespace std;                                    \
+                return cpp_func(a, b);                                  \
+            }                                                           \
+        };                                                              \
+                                                                        \
+        template <>                                                     \
+        struct call_##cpp_func<type1> :                                 \
+            call_cpp_##c99_func<                                        \
+                ::boost::hash_detail::c99_func##_detect::check::cpp     \
+            > {};                                                       \
+    }                                                                   \
+}
+
+#define BOOST_HASH_CALL_FLOAT_MACRO(cpp_func, c99_func, type1, type2)   \
+namespace boost {                                                       \
+    namespace hash_detail {                                             \
+                                                                        \
+        template <>                                                     \
+        struct call_##cpp_func<type1> {                                 \
+            typedef type1 float_type;                                   \
+            inline type1 operator()(type1 x, type2 y) const {           \
+                return c99_func(x, y);                                  \
+            }                                                           \
+        };                                                              \
+    }                                                                   \
+}
+
+#if defined(ldexpf)
+BOOST_HASH_CALL_FLOAT_MACRO(ldexp, ldexpf, float, int)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(ldexp, ldexpf, float, int)
+#endif
+
+#if defined(ldexpl)
+BOOST_HASH_CALL_FLOAT_MACRO(ldexp, ldexpl, long double, int)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(ldexp, ldexpl, long double, int)
+#endif
+
+#if defined(frexpf)
+BOOST_HASH_CALL_FLOAT_MACRO(frexp, frexpf, float, int*)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(frexp, frexpf, float, int*)
+#endif
+
+#if defined(frexpl)
+BOOST_HASH_CALL_FLOAT_MACRO(frexp, frexpl, long double, int*)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(frexp, frexpl, long double, int*)
+#endif
+
+#undef BOOST_HASH_CALL_FLOAT_MACRO
+#undef BOOST_HASH_CALL_FLOAT_FUNC
+
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <typename Float1, typename Float2>
+        struct select_hash_type_impl {
+            typedef double type;
+        };
+
+        template <>
+        struct select_hash_type_impl<float, float> {
+            typedef float type;
+        };
+
+        template <>
+        struct select_hash_type_impl<long double, long double> {
+            typedef long double type;
+        };
+
+
+        // select_hash_type
+        //
+        // If there is support for a particular floating point type, use that
+        // otherwise use double (there's always support for double).
+             
+        template <typename Float>
+        struct select_hash_type : select_hash_type_impl<
+                BOOST_DEDUCED_TYPENAME call_ldexp<Float>::float_type,
+                BOOST_DEDUCED_TYPENAME call_frexp<Float>::float_type
+            > {};            
+    }
+}
+
+#endif // BOOST_HASH_CONFORMANT_FLOATS
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash/detail/hash_float.hpp b/gatb-core/thirdparty/boost/functional/hash/detail/hash_float.hpp
new file mode 100644
index 0000000..eb9264f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/detail/hash_float.hpp
@@ -0,0 +1,271 @@
+
+// Copyright 2005-2012 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <boost/functional/hash/detail/float_functions.hpp>
+#include <boost/functional/hash/detail/limits.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/integer/static_log2.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+#include <boost/limits.hpp>
+#include <cstring>
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#if BOOST_MSVC >= 1400
+#pragma warning(disable:6294) // Ill-defined for-loop: initial condition does
+                              // not satisfy test. Loop body not executed
+#endif
+#endif
+
+// Can we use fpclassify?
+
+// STLport
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define BOOST_HASH_USE_FPCLASSIFY 0
+
+// GNU libstdc++ 3
+#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+#  if (defined(__USE_ISOC99) || defined(_GLIBCXX_USE_C99_MATH)) && \
+      !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
+#    define BOOST_HASH_USE_FPCLASSIFY 1
+#  else
+#    define BOOST_HASH_USE_FPCLASSIFY 0
+#  endif
+
+// Everything else
+#else
+#  define BOOST_HASH_USE_FPCLASSIFY 0
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        inline void hash_float_combine(std::size_t& seed, std::size_t value)
+        {
+            seed ^= value + (seed<<6) + (seed>>2);
+        }
+
+        ////////////////////////////////////////////////////////////////////////
+        // Binary hash function
+        //
+        // Only used for floats with known iec559 floats, and certain values in
+        // numeric_limits
+
+        inline std::size_t hash_binary(char* ptr, std::size_t length)
+        {
+            std::size_t seed = 0;
+
+            if (length >= sizeof(std::size_t)) {
+                std::memcpy(&seed, ptr, sizeof(std::size_t));
+                length -= sizeof(std::size_t);
+                ptr += sizeof(std::size_t);
+
+                while(length >= sizeof(std::size_t)) {
+                    std::size_t buffer = 0;
+                    std::memcpy(&buffer, ptr, sizeof(std::size_t));
+                    hash_float_combine(seed, buffer);
+                    length -= sizeof(std::size_t);
+                    ptr += sizeof(std::size_t);
+                }
+            }
+
+            if (length > 0) {
+                std::size_t buffer = 0;
+                std::memcpy(&buffer, ptr, length);
+                hash_float_combine(seed, buffer);
+            }
+
+            return seed;
+        }
+
+        template <typename Float, unsigned digits, unsigned max_exponent>
+        struct enable_binary_hash
+        {
+            BOOST_STATIC_CONSTANT(bool, value =
+                std::numeric_limits<Float>::is_iec559 &&
+                std::numeric_limits<Float>::digits == digits &&
+                std::numeric_limits<Float>::radix == 2 &&
+                std::numeric_limits<Float>::max_exponent == max_exponent);
+        };
+
+        template <typename Float>
+        inline std::size_t float_hash_impl(Float v,
+            BOOST_DEDUCED_TYPENAME boost::enable_if_c<
+                enable_binary_hash<Float, 24, 128>::value,
+                std::size_t>::type)
+        {
+            return hash_binary((char*) &v, 4);
+        }
+
+
+        template <typename Float>
+        inline std::size_t float_hash_impl(Float v,
+            BOOST_DEDUCED_TYPENAME boost::enable_if_c<
+                enable_binary_hash<Float, 53, 1024>::value,
+                std::size_t>::type)
+        {
+            return hash_binary((char*) &v, 8);
+        }
+
+        template <typename Float>
+        inline std::size_t float_hash_impl(Float v,
+            BOOST_DEDUCED_TYPENAME boost::enable_if_c<
+                enable_binary_hash<Float, 64, 16384>::value,
+                std::size_t>::type)
+        {
+            return hash_binary((char*) &v, 10);
+        }
+
+        template <typename Float>
+        inline std::size_t float_hash_impl(Float v,
+            BOOST_DEDUCED_TYPENAME boost::enable_if_c<
+                enable_binary_hash<Float, 113, 16384>::value,
+                std::size_t>::type)
+        {
+            return hash_binary((char*) &v, 16);
+        }
+
+        ////////////////////////////////////////////////////////////////////////
+        // Portable hash function
+        //
+        // Used as a fallback when the binary hash function isn't supported.
+
+        template <class T>
+        inline std::size_t float_hash_impl2(T v)
+        {
+            boost::hash_detail::call_frexp<T> frexp;
+            boost::hash_detail::call_ldexp<T> ldexp;
+
+            int exp = 0;
+
+            v = frexp(v, &exp);
+
+            // A postive value is easier to hash, so combine the
+            // sign with the exponent and use the absolute value.
+            if(v < 0) {
+                v = -v;
+                exp += limits<T>::max_exponent -
+                    limits<T>::min_exponent;
+            }
+
+            v = ldexp(v, limits<std::size_t>::digits);
+            std::size_t seed = static_cast<std::size_t>(v);
+            v -= static_cast<T>(seed);
+
+            // ceiling(digits(T) * log2(radix(T))/ digits(size_t)) - 1;
+            std::size_t const length
+                = (limits<T>::digits *
+                        boost::static_log2<limits<T>::radix>::value
+                        + limits<std::size_t>::digits - 1)
+                / limits<std::size_t>::digits;
+
+            for(std::size_t i = 0; i != length; ++i)
+            {
+                v = ldexp(v, limits<std::size_t>::digits);
+                std::size_t part = static_cast<std::size_t>(v);
+                v -= static_cast<T>(part);
+                hash_float_combine(seed, part);
+            }
+
+            hash_float_combine(seed, exp);
+
+            return seed;
+        }
+
+#if !defined(BOOST_HASH_DETAIL_TEST_WITHOUT_GENERIC)
+        template <class T>
+        inline std::size_t float_hash_impl(T v, ...)
+        {
+            typedef BOOST_DEDUCED_TYPENAME select_hash_type<T>::type type;
+            return float_hash_impl2(static_cast<type>(v));
+        }
+#endif
+    }
+}
+
+#if BOOST_HASH_USE_FPCLASSIFY
+
+#include <boost/config/no_tr1/cmath.hpp>
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        inline std::size_t float_hash_value(T v)
+        {
+#if defined(fpclassify)
+            switch (fpclassify(v))
+#elif BOOST_HASH_CONFORMANT_FLOATS
+            switch (std::fpclassify(v))
+#else
+            using namespace std;
+            switch (fpclassify(v))
+#endif
+            {
+            case FP_ZERO:
+                return 0;
+            case FP_INFINITE:
+                return (std::size_t)(v > 0 ? -1 : -2);
+            case FP_NAN:
+                return (std::size_t)(-3);
+            case FP_NORMAL:
+            case FP_SUBNORMAL:
+                return float_hash_impl(v, 0);
+            default:
+                BOOST_ASSERT(0);
+                return 0;
+            }
+        }
+    }
+}
+
+#else // !BOOST_HASH_USE_FPCLASSIFY
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        inline bool is_zero(T v)
+        {
+#if !defined(__GNUC__)
+            return v == 0;
+#else
+            // GCC's '-Wfloat-equal' will complain about comparing
+            // v to 0, but because it disables warnings for system
+            // headers it won't complain if you use std::equal_to to
+            // compare with 0. Resulting in this silliness:
+            return std::equal_to<T>()(v, 0);
+#endif
+        }
+
+        template <class T>
+        inline std::size_t float_hash_value(T v)
+        {
+            return boost::hash_detail::is_zero(v) ? 0 : float_hash_impl(v, 0);
+        }
+    }
+}
+
+#endif // BOOST_HASH_USE_FPCLASSIFY
+
+#undef BOOST_HASH_USE_FPCLASSIFY
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash/detail/limits.hpp b/gatb-core/thirdparty/boost/functional/hash/detail/limits.hpp
new file mode 100644
index 0000000..4a971a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/detail/limits.hpp
@@ -0,0 +1,62 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// On some platforms std::limits gives incorrect values for long double.
+// This tries to work around them.
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <boost/limits.hpp>
+
+// On OpenBSD, numeric_limits is not reliable for long doubles, but
+// the macros defined in <float.h> are and support long double when STLport
+// doesn't.
+
+#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
+#include <float.h>
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        struct limits : std::numeric_limits<T> {};
+
+#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
+        template <>
+        struct limits<long double>
+             : std::numeric_limits<long double>
+        {
+            static long double epsilon() {
+                return LDBL_EPSILON;
+            }
+
+            static long double (max)() {
+                return LDBL_MAX;
+            }
+
+            static long double (min)() {
+                return LDBL_MIN;
+            }
+
+            BOOST_STATIC_CONSTANT(int, digits = LDBL_MANT_DIG);
+            BOOST_STATIC_CONSTANT(int, max_exponent = LDBL_MAX_EXP);
+            BOOST_STATIC_CONSTANT(int, min_exponent = LDBL_MIN_EXP);
+#if defined(_STLP_NO_LONG_DOUBLE)
+            BOOST_STATIC_CONSTANT(int, radix = FLT_RADIX);
+#endif
+        };
+#endif // __OpenBSD__
+    }
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash/extensions.hpp b/gatb-core/thirdparty/boost/functional/hash/extensions.hpp
new file mode 100644
index 0000000..eafaefe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/extensions.hpp
@@ -0,0 +1,318 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Based on Peter Dimov's proposal
+//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
+//  issue 6.18. 
+
+// This implements the extensions to the standard.
+// It's undocumented, so you shouldn't use it....
+
+#if !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP)
+#define BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <boost/functional/hash/hash.hpp>
+#include <boost/detail/container_fwd.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+
+#if !defined(BOOST_NO_CXX11_HDR_ARRAY)
+#   include <array>
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
+#   include <tuple>
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_MEMORY)
+#   include <memory>
+#endif
+
+#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+#include <boost/type_traits/is_array.hpp>
+#endif
+
+namespace boost
+{
+    template <class A, class B>
+    std::size_t hash_value(std::pair<A, B> const&);
+    template <class T, class A>
+    std::size_t hash_value(std::vector<T, A> const&);
+    template <class T, class A>
+    std::size_t hash_value(std::list<T, A> const& v);
+    template <class T, class A>
+    std::size_t hash_value(std::deque<T, A> const& v);
+    template <class K, class C, class A>
+    std::size_t hash_value(std::set<K, C, A> const& v);
+    template <class K, class C, class A>
+    std::size_t hash_value(std::multiset<K, C, A> const& v);
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::map<K, T, C, A> const& v);
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::multimap<K, T, C, A> const& v);
+
+    template <class T>
+    std::size_t hash_value(std::complex<T> const&);
+
+    template <class A, class B>
+    std::size_t hash_value(std::pair<A, B> const& v)
+    {
+        std::size_t seed = 0;
+        boost::hash_combine(seed, v.first);
+        boost::hash_combine(seed, v.second);
+        return seed;
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::vector<T, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::list<T, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::deque<T, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class C, class A>
+    std::size_t hash_value(std::set<K, C, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class C, class A>
+    std::size_t hash_value(std::multiset<K, C, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::map<K, T, C, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::multimap<K, T, C, A> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+
+    template <class T>
+    std::size_t hash_value(std::complex<T> const& v)
+    {
+        boost::hash<T> hasher;
+        std::size_t seed = hasher(v.imag());
+        seed ^= hasher(v.real()) + (seed<<6) + (seed>>2);
+        return seed;
+    }
+
+#if !defined(BOOST_NO_CXX11_HDR_ARRAY)
+    template <class T, std::size_t N>
+    std::size_t hash_value(std::array<T, N> const& v)
+    {
+        return boost::hash_range(v.begin(), v.end());
+    }
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
+    namespace hash_detail {
+        template <std::size_t I, typename T>
+        inline typename boost::enable_if_c<(I == std::tuple_size<T>::value),
+                void>::type
+            hash_combine_tuple(std::size_t&, T const&)
+        {
+        }
+
+        template <std::size_t I, typename T>
+        inline typename boost::enable_if_c<(I < std::tuple_size<T>::value),
+                void>::type
+            hash_combine_tuple(std::size_t& seed, T const& v)
+        {
+            boost::hash_combine(seed, std::get<I>(v));
+            boost::hash_detail::hash_combine_tuple<I + 1>(seed, v);
+        }
+
+        template <typename T>
+        inline std::size_t hash_tuple(T const& v)
+        {
+            std::size_t seed = 0;
+            boost::hash_detail::hash_combine_tuple<0>(seed, v);
+            return seed;
+        }
+    }
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template <typename... T>
+    inline std::size_t hash_value(std::tuple<T...> const& v)
+    {
+        return boost::hash_detail::hash_tuple(v);
+    }
+#else
+
+    inline std::size_t hash_value(std::tuple<> const& v)
+    {
+        return boost::hash_detail::hash_tuple(v);
+    }
+
+#   define BOOST_HASH_TUPLE_F(z, n, _)                                      \
+    template<                                                               \
+        BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)                            \
+    >                                                                       \
+    inline std::size_t hash_value(std::tuple<                               \
+        BOOST_PP_ENUM_PARAMS_Z(z, n, A)                                     \
+    > const& v)                                                             \
+    {                                                                       \
+        return boost::hash_detail::hash_tuple(v);                           \
+    }
+
+    BOOST_PP_REPEAT_FROM_TO(1, 11, BOOST_HASH_TUPLE_F, _)
+#   undef BOOST_HASH_TUPLE_F
+#endif
+
+#endif
+
+#if !defined(BOOST_NO_CXX11_SMART_PTR)
+    template <typename T>
+    inline std::size_t hash_value(std::shared_ptr<T> const& x) {
+        return boost::hash_value(x.get());
+    }
+
+    template <typename T, typename Deleter>
+    inline std::size_t hash_value(std::unique_ptr<T, Deleter> const& x) {
+        return boost::hash_value(x.get());
+    }
+#endif
+
+    //
+    // call_hash_impl
+    //
+
+    // On compilers without function template ordering, this deals with arrays.
+
+#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+    namespace hash_detail
+    {
+        template <bool IsArray>
+        struct call_hash_impl
+        {
+            template <class T>
+            struct inner
+            {
+                static std::size_t call(T const& v)
+                {
+                    using namespace boost;
+                    return hash_value(v);
+                }
+            };
+        };
+
+        template <>
+        struct call_hash_impl<true>
+        {
+            template <class Array>
+            struct inner
+            {
+                static std::size_t call(Array const& v)
+                {
+                    const int size = sizeof(v) / sizeof(*v);
+                    return boost::hash_range(v, v + size);
+                }
+            };
+        };
+
+        template <class T>
+        struct call_hash
+            : public call_hash_impl<boost::is_array<T>::value>
+                ::BOOST_NESTED_TEMPLATE inner<T>
+        {
+        };
+    }
+#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+
+    //
+    // boost::hash
+    //
+
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+    template <class T> struct hash
+        : std::unary_function<T, std::size_t>
+    {
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+        std::size_t operator()(T const& val) const
+        {
+            return hash_value(val);
+        }
+#else
+        std::size_t operator()(T const& val) const
+        {
+            return hash_detail::call_hash<T>::call(val);
+        }
+#endif
+    };
+
+#if BOOST_WORKAROUND(__DMC__, <= 0x848)
+    template <class T, unsigned int n> struct hash<T[n]>
+        : std::unary_function<T[n], std::size_t>
+    {
+        std::size_t operator()(const T* val) const
+        {
+            return boost::hash_range(val, val+n);
+        }
+    };
+#endif
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+    // On compilers without partial specialization, boost::hash<T>
+    // has already been declared to deal with pointers, so just
+    // need to supply the non-pointer version of hash_impl.
+
+    namespace hash_detail
+    {
+        template <bool IsPointer>
+        struct hash_impl;
+
+        template <>
+        struct hash_impl<false>
+        {
+            template <class T>
+            struct inner
+                : std::unary_function<T, std::size_t>
+            {
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+                std::size_t operator()(T const& val) const
+                {
+                    return hash_value(val);
+                }
+#else
+                std::size_t operator()(T const& val) const
+                {
+                    return hash_detail::call_hash<T>::call(val);
+                }
+#endif
+            };
+        };
+    }
+#endif  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash/hash.hpp b/gatb-core/thirdparty/boost/functional/hash/hash.hpp
new file mode 100644
index 0000000..3e5ab5b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/hash.hpp
@@ -0,0 +1,559 @@
+
+// Copyright 2005-2014 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Based on Peter Dimov's proposal
+//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
+//  issue 6.18. 
+//
+//  This also contains public domain code from MurmurHash. From the
+//  MurmurHash header:
+
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+#if !defined(BOOST_FUNCTIONAL_HASH_HASH_HPP)
+#define BOOST_FUNCTIONAL_HASH_HASH_HPP
+
+#include <boost/functional/hash/hash_fwd.hpp>
+#include <functional>
+#include <boost/functional/hash/detail/hash_float.hpp>
+#include <string>
+#include <boost/limits.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/cstdint.hpp>
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#include <boost/type_traits/is_pointer.hpp>
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX)
+#include <typeindex>
+#endif
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+
+#if BOOST_MSVC >= 1400
+#pragma warning(disable:6295) // Ill-defined for-loop : 'unsigned int' values
+                              // are always of range '0' to '4294967295'.
+                              // Loop executes infinitely.
+#endif
+
+#endif
+
+#if BOOST_WORKAROUND(__GNUC__, < 3) \
+    && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+#define BOOST_HASH_CHAR_TRAITS string_char_traits
+#else
+#define BOOST_HASH_CHAR_TRAITS char_traits
+#endif
+
+#if defined(_MSC_VER)
+#   define BOOST_FUNCTIONAL_HASH_ROTL32(x, r) _rotl(x,r)
+#else
+#   define BOOST_FUNCTIONAL_HASH_ROTL32(x, r) (x << r) | (x >> (32 - r))
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        struct enable_hash_value { typedef std::size_t type; };
+
+        template <typename T> struct basic_numbers {};
+        template <typename T> struct long_numbers;
+        template <typename T> struct ulong_numbers;
+        template <typename T> struct float_numbers {};
+
+        template <> struct basic_numbers<bool> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<char> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<unsigned char> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<signed char> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<short> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<unsigned short> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<int> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<unsigned int> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<long> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct basic_numbers<unsigned long> :
+            boost::hash_detail::enable_hash_value {};
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+        template <> struct basic_numbers<wchar_t> :
+            boost::hash_detail::enable_hash_value {};
+#endif
+
+        // long_numbers is defined like this to allow for separate
+        // specialization for long_long and int128_type, in case
+        // they conflict.
+        template <typename T> struct long_numbers2 {};
+        template <typename T> struct ulong_numbers2 {};
+        template <typename T> struct long_numbers : long_numbers2<T> {};
+        template <typename T> struct ulong_numbers : ulong_numbers2<T> {};
+
+#if !defined(BOOST_NO_LONG_LONG)
+        template <> struct long_numbers<boost::long_long_type> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct ulong_numbers<boost::ulong_long_type> :
+            boost::hash_detail::enable_hash_value {};
+#endif
+
+#if defined(BOOST_HAS_INT128)
+        template <> struct long_numbers2<boost::int128_type> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct ulong_numbers2<boost::uint128_type> :
+            boost::hash_detail::enable_hash_value {};
+#endif
+
+        template <> struct float_numbers<float> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct float_numbers<double> :
+            boost::hash_detail::enable_hash_value {};
+        template <> struct float_numbers<long double> :
+            boost::hash_detail::enable_hash_value {};
+    }
+
+    template <typename T>
+    typename boost::hash_detail::basic_numbers<T>::type hash_value(T);
+    template <typename T>
+    typename boost::hash_detail::long_numbers<T>::type hash_value(T);
+    template <typename T>
+    typename boost::hash_detail::ulong_numbers<T>::type hash_value(T);
+
+    template <typename T>
+    typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
+        hash_value(T);
+
+#if !BOOST_WORKAROUND(__DMC__, <= 0x848)
+    template <class T> std::size_t hash_value(T* const&);
+#else
+    template <class T> std::size_t hash_value(T*);
+#endif
+
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+    template< class T, unsigned N >
+    std::size_t hash_value(const T (&x)[N]);
+
+    template< class T, unsigned N >
+    std::size_t hash_value(T (&x)[N]);
+#endif
+
+    template <class Ch, class A>
+    std::size_t hash_value(
+        std::basic_string<Ch, std::BOOST_HASH_CHAR_TRAITS<Ch>, A> const&);
+
+    template <typename T>
+    typename boost::hash_detail::float_numbers<T>::type hash_value(T);
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX)
+    std::size_t hash_value(std::type_index);
+#endif
+
+    // Implementation
+
+    namespace hash_detail
+    {
+        template <class T>
+        inline std::size_t hash_value_signed(T val)
+        {
+             const int size_t_bits = std::numeric_limits<std::size_t>::digits;
+             // ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
+             const int length = (std::numeric_limits<T>::digits - 1)
+                 / size_t_bits;
+
+             std::size_t seed = 0;
+             T positive = val < 0 ? -1 - val : val;
+
+             // Hopefully, this loop can be unrolled.
+             for(unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits)
+             {
+                 seed ^= (std::size_t) (positive >> i) + (seed<<6) + (seed>>2);
+             }
+             seed ^= (std::size_t) val + (seed<<6) + (seed>>2);
+
+             return seed;
+        }
+
+        template <class T>
+        inline std::size_t hash_value_unsigned(T val)
+        {
+             const int size_t_bits = std::numeric_limits<std::size_t>::digits;
+             // ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
+             const int length = (std::numeric_limits<T>::digits - 1)
+                 / size_t_bits;
+
+             std::size_t seed = 0;
+
+             // Hopefully, this loop can be unrolled.
+             for(unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits)
+             {
+                 seed ^= (std::size_t) (val >> i) + (seed<<6) + (seed>>2);
+             }
+             seed ^= (std::size_t) val + (seed<<6) + (seed>>2);
+
+             return seed;
+        }
+
+        template <typename SizeT>
+        inline void hash_combine_impl(SizeT& seed, SizeT value)
+        {
+            seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
+        }
+
+        template <typename SizeT>
+        inline void hash_combine_impl(boost::uint32_t& h1,
+                boost::uint32_t k1)
+        {
+            const uint32_t c1 = 0xcc9e2d51;
+            const uint32_t c2 = 0x1b873593;
+
+            k1 *= c1;
+            k1 = BOOST_FUNCTIONAL_HASH_ROTL32(k1,15);
+            k1 *= c2;
+
+            h1 ^= k1;
+            h1 = BOOST_FUNCTIONAL_HASH_ROTL32(h1,13);
+            h1 = h1*5+0xe6546b64;
+        }
+
+
+// Don't define 64-bit hash combine on platforms with 64 bit integers,
+// and also not for 32-bit gcc as it warns about the 64-bit constant.
+#if !defined(BOOST_NO_INT64_T) && \
+        !(defined(__GNUC__) && ULONG_MAX == 0xffffffff)
+
+        template <typename SizeT>
+        inline void hash_combine_impl(boost::uint64_t& h,
+                boost::uint64_t k)
+        {
+            const uint64_t m = UINT64_C(0xc6a4a7935bd1e995);
+            const int r = 47;
+
+            k *= m;
+            k ^= k >> r;
+            k *= m;
+
+            h ^= k;
+            h *= m;
+        }
+
+#endif // BOOST_NO_INT64_T
+    }
+
+    template <typename T>
+    typename boost::hash_detail::basic_numbers<T>::type hash_value(T v)
+    {
+        return static_cast<std::size_t>(v);
+    }
+
+    template <typename T>
+    typename boost::hash_detail::long_numbers<T>::type hash_value(T v)
+    {
+        return hash_detail::hash_value_signed(v);
+    }
+
+    template <typename T>
+    typename boost::hash_detail::ulong_numbers<T>::type hash_value(T v)
+    {
+        return hash_detail::hash_value_unsigned(v);
+    }
+
+    template <typename T>
+    typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
+        hash_value(T v)
+    {
+        return static_cast<std::size_t>(v);
+    }
+
+    // Implementation by Alberto Barbati and Dave Harris.
+#if !BOOST_WORKAROUND(__DMC__, <= 0x848)
+    template <class T> std::size_t hash_value(T* const& v)
+#else
+    template <class T> std::size_t hash_value(T* v)
+#endif
+    {
+#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64
+    // for some reason ptrdiff_t on OpenVMS compiler with
+    // 64 bit is not 64 bit !!!
+        std::size_t x = static_cast<std::size_t>(
+           reinterpret_cast<long long int>(v));
+#else
+        std::size_t x = static_cast<std::size_t>(
+           reinterpret_cast<std::ptrdiff_t>(v));
+#endif
+        return x + (x >> 3);
+    }
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#if BOOST_MSVC <= 1400
+#pragma warning(disable:4267) // 'argument' : conversion from 'size_t' to
+                              // 'unsigned int', possible loss of data
+                              // A misguided attempt to detect 64-bit
+                              // incompatability.
+#endif
+#endif
+
+    template <class T>
+    inline void hash_combine(std::size_t& seed, T const& v)
+    {
+        boost::hash<T> hasher;
+        return boost::hash_detail::hash_combine_impl(seed, hasher(v));
+    }
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+    template <class It>
+    inline std::size_t hash_range(It first, It last)
+    {
+        std::size_t seed = 0;
+
+        for(; first != last; ++first)
+        {
+            hash_combine(seed, *first);
+        }
+
+        return seed;
+    }
+
+    template <class It>
+    inline void hash_range(std::size_t& seed, It first, It last)
+    {
+        for(; first != last; ++first)
+        {
+            hash_combine(seed, *first);
+        }
+    }
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+    template <class T>
+    inline std::size_t hash_range(T* first, T* last)
+    {
+        std::size_t seed = 0;
+
+        for(; first != last; ++first)
+        {
+            boost::hash<T> hasher;
+            seed ^= hasher(*first) + 0x9e3779b9 + (seed<<6) + (seed>>2);
+        }
+
+        return seed;
+    }
+
+    template <class T>
+    inline void hash_range(std::size_t& seed, T* first, T* last)
+    {
+        for(; first != last; ++first)
+        {
+            boost::hash<T> hasher;
+            seed ^= hasher(*first) + 0x9e3779b9 + (seed<<6) + (seed>>2);
+        }
+    }
+#endif
+
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+    template< class T, unsigned N >
+    inline std::size_t hash_value(const T (&x)[N])
+    {
+        return hash_range(x, x + N);
+    }
+
+    template< class T, unsigned N >
+    inline std::size_t hash_value(T (&x)[N])
+    {
+        return hash_range(x, x + N);
+    }
+#endif
+
+    template <class Ch, class A>
+    inline std::size_t hash_value(
+        std::basic_string<Ch, std::BOOST_HASH_CHAR_TRAITS<Ch>, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <typename T>
+    typename boost::hash_detail::float_numbers<T>::type hash_value(T v)
+    {
+        return boost::hash_detail::float_hash_value(v);
+    }
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX)
+    inline std::size_t hash_value(std::type_index v)
+    {
+        return v.hash_code();
+    }
+#endif
+
+    //
+    // boost::hash
+    //
+    
+    // Define the specializations required by the standard. The general purpose
+    // boost::hash is defined later in extensions.hpp if
+    // BOOST_HASH_NO_EXTENSIONS is not defined.
+    
+    // BOOST_HASH_SPECIALIZE - define a specialization for a type which is
+    // passed by copy.
+    //
+    // BOOST_HASH_SPECIALIZE_REF - define a specialization for a type which is
+    // passed by copy.
+    //
+    // These are undefined later.
+
+#define BOOST_HASH_SPECIALIZE(type) \
+    template <> struct hash<type> \
+         : public std::unary_function<type, std::size_t> \
+    { \
+        std::size_t operator()(type v) const \
+        { \
+            return boost::hash_value(v); \
+        } \
+    };
+
+#define BOOST_HASH_SPECIALIZE_REF(type) \
+    template <> struct hash<type> \
+         : public std::unary_function<type, std::size_t> \
+    { \
+        std::size_t operator()(type const& v) const \
+        { \
+            return boost::hash_value(v); \
+        } \
+    };
+
+    BOOST_HASH_SPECIALIZE(bool)
+    BOOST_HASH_SPECIALIZE(char)
+    BOOST_HASH_SPECIALIZE(signed char)
+    BOOST_HASH_SPECIALIZE(unsigned char)
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+    BOOST_HASH_SPECIALIZE(wchar_t)
+#endif
+    BOOST_HASH_SPECIALIZE(short)
+    BOOST_HASH_SPECIALIZE(unsigned short)
+    BOOST_HASH_SPECIALIZE(int)
+    BOOST_HASH_SPECIALIZE(unsigned int)
+    BOOST_HASH_SPECIALIZE(long)
+    BOOST_HASH_SPECIALIZE(unsigned long)
+
+    BOOST_HASH_SPECIALIZE(float)
+    BOOST_HASH_SPECIALIZE(double)
+    BOOST_HASH_SPECIALIZE(long double)
+
+    BOOST_HASH_SPECIALIZE_REF(std::string)
+#if !defined(BOOST_NO_STD_WSTRING)
+    BOOST_HASH_SPECIALIZE_REF(std::wstring)
+#endif
+
+#if !defined(BOOST_NO_LONG_LONG)
+    BOOST_HASH_SPECIALIZE(boost::long_long_type)
+    BOOST_HASH_SPECIALIZE(boost::ulong_long_type)
+#endif
+
+#if defined(BOOST_HAS_INT128)
+    BOOST_HASH_SPECIALIZE(boost::int128_type)
+    BOOST_HASH_SPECIALIZE(boost::uint128_type)
+#endif
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX)
+    BOOST_HASH_SPECIALIZE(std::type_index)
+#endif
+
+#undef BOOST_HASH_SPECIALIZE
+#undef BOOST_HASH_SPECIALIZE_REF
+
+// Specializing boost::hash for pointers.
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+    template <class T>
+    struct hash<T*>
+        : public std::unary_function<T*, std::size_t>
+    {
+        std::size_t operator()(T* v) const
+        {
+#if !BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590)
+            return boost::hash_value(v);
+#else
+            std::size_t x = static_cast<std::size_t>(
+                reinterpret_cast<std::ptrdiff_t>(v));
+
+            return x + (x >> 3);
+#endif
+        }
+    };
+
+#else
+
+    // For compilers without partial specialization, we define a
+    // boost::hash for all remaining types. But hash_impl is only defined
+    // for pointers in 'extensions.hpp' - so when BOOST_HASH_NO_EXTENSIONS
+    // is defined there will still be a compile error for types not supported
+    // in the standard.
+
+    namespace hash_detail
+    {
+        template <bool IsPointer>
+        struct hash_impl;
+
+        template <>
+        struct hash_impl<true>
+        {
+            template <class T>
+            struct inner
+                : public std::unary_function<T, std::size_t>
+            {
+                std::size_t operator()(T val) const
+                {
+#if !BOOST_WORKAROUND(__SUNPRO_CC, <= 590)
+                    return boost::hash_value(val);
+#else
+                    std::size_t x = static_cast<std::size_t>(
+                        reinterpret_cast<std::ptrdiff_t>(val));
+
+                    return x + (x >> 3);
+#endif
+                }
+            };
+        };
+    }
+
+    template <class T> struct hash
+        : public boost::hash_detail::hash_impl<boost::is_pointer<T>::value>
+            ::BOOST_NESTED_TEMPLATE inner<T>
+    {
+    };
+
+#endif
+}
+
+#undef BOOST_HASH_CHAR_TRAITS
+#undef BOOST_FUNCTIONAL_HASH_ROTL32
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif // BOOST_FUNCTIONAL_HASH_HASH_HPP
+
+// Include this outside of the include guards in case the file is included
+// twice - once with BOOST_HASH_NO_EXTENSIONS defined, and then with it
+// undefined.
+
+#if !defined(BOOST_HASH_NO_EXTENSIONS) \
+    && !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP)
+#include <boost/functional/hash/extensions.hpp>
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash/hash_fwd.hpp b/gatb-core/thirdparty/boost/functional/hash/hash_fwd.hpp
new file mode 100644
index 0000000..01fe012
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash/hash_fwd.hpp
@@ -0,0 +1,36 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Based on Peter Dimov's proposal
+//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
+//  issue 6.18. 
+
+#if !defined(BOOST_FUNCTIONAL_HASH_FWD_HPP)
+#define BOOST_FUNCTIONAL_HASH_FWD_HPP
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <cstddef>
+#include <boost/detail/workaround.hpp>
+
+namespace boost
+{
+    template <class T> struct hash;
+
+    template <class T> void hash_combine(std::size_t& seed, T const& v);
+
+    template <class It> std::size_t hash_range(It, It);
+    template <class It> void hash_range(std::size_t&, It, It);
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+    template <class T> inline std::size_t hash_range(T*, T*);
+    template <class T> inline void hash_range(std::size_t&, T*, T*);
+#endif
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/functional/hash_fwd.hpp b/gatb-core/thirdparty/boost/functional/hash_fwd.hpp
new file mode 100644
index 0000000..eea9073
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/hash_fwd.hpp
@@ -0,0 +1,11 @@
+
+// Copyright 2005-2009 Daniel James.
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#pragma once
+#endif
+
+#include <boost/functional/hash/hash_fwd.hpp>
diff --git a/gatb-core/thirdparty/boost/functional/lightweight_forward_adapter.hpp b/gatb-core/thirdparty/boost/functional/lightweight_forward_adapter.hpp
new file mode 100644
index 0000000..637aa9e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/lightweight_forward_adapter.hpp
@@ -0,0 +1,259 @@
+/*=============================================================================
+    Copyright (c) 2007 Tobias Schwinger
+  
+    Use modification and distribution are subject to the Boost Software 
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_HPP_INCLUDED
+#   ifndef BOOST_PP_IS_ITERATING
+
+#   include <boost/config.hpp>
+#   include <boost/detail/workaround.hpp>
+
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/iteration/iterate.hpp>
+#   include <boost/preprocessor/repetition/enum.hpp>
+#   include <boost/preprocessor/repetition/enum_params.hpp>
+#   include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#   include <boost/preprocessor/facilities/intercept.hpp>
+
+#   include <boost/utility/result_of.hpp>
+#   include <boost/ref.hpp>
+
+#   ifndef BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY
+#     define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY 10
+#   elif BOOST_FUNCTIONAL_FORDWARD_ADAPTER_MAX_ARITY < 3
+#     undef  BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY
+#     define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY 3
+#   endif
+
+namespace boost 
+{
+    template< typename Function, int Arity_Or_MinArity = -1, int MaxArity = -1 >
+    class lightweight_forward_adapter;
+
+    //----- ---- --- -- - -  -   -
+
+    namespace detail
+    {
+        template< class MostDerived, typename Function, typename FunctionConst, 
+            int Arity, int MinArity >
+        struct lightweight_forward_adapter_impl;
+
+        struct lightweight_forward_adapter_result
+        {
+            template< typename Sig > struct apply;
+
+            // Utility metafunction for argument transform
+            template< typename T > struct x  { typedef T const& t; };
+            template< typename T > struct x< boost::reference_wrapper<T> >
+            { typedef T& t; };
+            template< typename T > struct x<T&>       : x<T> { };
+            template< typename T > struct x<T const&> : x<T> { };
+            template< typename T > struct x<T const>  : x<T> { };
+
+            // Utility metafunction to choose target function qualification
+            template< typename T > struct c
+            { typedef typename T::target_function_t t; };
+            template< typename T > struct c<T&      >
+            { typedef typename T::target_function_t t; };
+            template< typename T > struct c<T const >
+            { typedef typename T::target_function_const_t t; };
+            template< typename T > struct c<T const&>
+            { typedef typename T::target_function_const_t t; };
+        };
+    }
+
+#   define BOOST_TMP_MACRO(f,fn,fc) \
+        boost::detail::lightweight_forward_adapter_impl< \
+            lightweight_forward_adapter<f,Arity_Or_MinArity,MaxArity>, fn, fc, \
+            (MaxArity!=-1? MaxArity :Arity_Or_MinArity!=-1? Arity_Or_MinArity \
+                :BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY), \
+            (Arity_Or_MinArity!=-1? Arity_Or_MinArity : 0) >
+
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class lightweight_forward_adapter
+        : public BOOST_TMP_MACRO(Function,Function,Function const)
+        , private Function
+    {
+      public:
+        lightweight_forward_adapter(Function const& f = Function()) 
+          : Function(f) 
+        { }
+
+        typedef Function        target_function_t;
+        typedef Function const  target_function_const_t;
+
+        Function       & target_function()       { return *this; }
+        Function const & target_function() const { return *this; }
+
+        template< typename Sig > struct result
+            : detail::lightweight_forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function,Function, Function const)::operator();
+    };
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class lightweight_forward_adapter< Function const, Arity_Or_MinArity, 
+        MaxArity >
+        : public BOOST_TMP_MACRO(Function const, Function const, Function const)
+        , private Function
+    {
+      public:
+        lightweight_forward_adapter(Function const& f = Function())
+          : Function(f) 
+        { }
+
+        typedef Function const target_function_t;
+        typedef Function const target_function_const_t;
+
+        Function const & target_function() const { return *this; }
+
+        template< typename Sig > struct result
+            : detail::lightweight_forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function const,Function const, Function const)
+            ::operator();
+    };
+    template< typename Function, int Arity_Or_MinArity, int MaxArity >
+    class lightweight_forward_adapter< Function &, Arity_Or_MinArity, MaxArity >
+        : public BOOST_TMP_MACRO(Function&, Function, Function)
+    {
+        Function& ref_function;
+      public:
+        lightweight_forward_adapter(Function& f)
+          : ref_function(f) 
+        { }
+
+        typedef Function target_function_t;
+        typedef Function target_function_const_t;
+
+        Function & target_function() const { return this->ref_function; }
+
+        template< typename Sig > struct result
+            : detail::lightweight_forward_adapter_result::template apply<Sig>
+        { };
+
+        using BOOST_TMP_MACRO(Function&, Function, Function)::operator();
+    }; 
+
+    #undef BOOST_TMP_MACRO
+
+    namespace detail
+    {
+        template< class Self >
+        struct lightweight_forward_adapter_result::apply< Self() >
+            : boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
+        { };
+
+        template< class MD, class F, class FC >
+        struct lightweight_forward_adapter_impl<MD,F,FC,0,0>
+            : lightweight_forward_adapter_result
+        {
+            inline typename boost::result_of< FC() >::type
+            operator()() const
+            {
+                return static_cast<MD const*>(this)->target_function()();
+            }
+
+            inline typename boost::result_of< F() >::type
+            operator()()
+            {
+                return static_cast<MD*>(this)->target_function()();
+            }
+        };
+
+#       define  BOOST_PP_FILENAME_1 \
+            <boost/functional/lightweight_forward_adapter.hpp>
+#       define  BOOST_PP_ITERATION_LIMITS                                     \
+            (1,BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY) 
+#       include BOOST_PP_ITERATE()
+
+    } // namespace detail
+
+    template<class F, int A0, int A1>
+    struct result_of<boost::lightweight_forward_adapter<F,A0,A1> const ()>
+        : boost::detail::lightweight_forward_adapter_result::template apply<
+            boost::lightweight_forward_adapter<F,A0,A1> const () >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::lightweight_forward_adapter<F,A0,A1>()>
+        : boost::detail::lightweight_forward_adapter_result::template apply<
+            boost::lightweight_forward_adapter<F,A0,A1>() >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::lightweight_forward_adapter<F,A0,A1> const& ()>
+        : boost::detail::lightweight_forward_adapter_result::template apply<
+            boost::lightweight_forward_adapter<F,A0,A1> const () >
+    { };
+    template<class F, int A0, int A1>
+    struct result_of<boost::lightweight_forward_adapter<F,A0,A1>& ()>
+        : boost::detail::lightweight_forward_adapter_result::template apply<
+            boost::lightweight_forward_adapter<F,A0,A1>() >
+    { };
+}
+
+#     define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_HPP_INCLUDED
+
+#   else // defined(BOOST_PP_IS_ITERATING)
+#     define N BOOST_PP_ITERATION() 
+
+        template< class Self, BOOST_PP_ENUM_PARAMS(N,typename T) >
+        struct lightweight_forward_adapter_result::apply<
+            Self (BOOST_PP_ENUM_PARAMS(N,T)) >
+            : boost::result_of<
+                BOOST_DEDUCED_TYPENAME c<Self>::t (BOOST_PP_ENUM_BINARY_PARAMS(N,
+                    typename x<T,>::t BOOST_PP_INTERCEPT)) >
+        { };
+
+        template< class MD, class F, class FC >
+        struct lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),N>
+            : lightweight_forward_adapter_result
+        {
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename boost::result_of< F(BOOST_PP_ENUM_BINARY_PARAMS(N,
+                T,const& BOOST_PP_INTERCEPT)) >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT));
+        };
+
+        template< class MD, class F, class FC, int MinArity >
+        struct lightweight_forward_adapter_impl<MD,F,FC,N,MinArity>
+            : lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>
+        {
+            using lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),
+                MinArity>::operator();
+
+#     define M(z,i,d) \
+          static_cast<typename d::template x<T##i>::t>(a##i)
+
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename lightweight_forward_adapter_result::template apply<
+                MD const (BOOST_PP_ENUM_BINARY_PARAMS(N,
+                    T,const& BOOST_PP_INTERCEPT)) >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const& a)) const
+            {
+                typedef lightweight_forward_adapter_result _;
+                return static_cast<MD const*>(this)->target_function()(
+                    BOOST_PP_ENUM(N,M,_));
+            }
+            template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+            inline typename lightweight_forward_adapter_result::template apply<
+                MD (BOOST_PP_ENUM_BINARY_PARAMS(N,
+                    T,const& BOOST_PP_INTERCEPT)) >::type
+            operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const& a))
+            {
+                typedef lightweight_forward_adapter_result _;
+                return static_cast<MD*>(this)->target_function()(
+                    BOOST_PP_ENUM(N,M,_));
+            }
+#     undef M
+      };
+
+#     undef N
+#   endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/functional/overloaded_function.hpp b/gatb-core/thirdparty/boost/functional/overloaded_function.hpp
new file mode 100644
index 0000000..83fe4b3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/overloaded_function.hpp
@@ -0,0 +1,311 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef DOXYGEN // Doxygen documentation only.
+
+#if !BOOST_PP_IS_ITERATING
+#   ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_HPP_
+#       define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_HPP_
+
+#       include <boost/functional/overloaded_function/detail/base.hpp>
+#       include <boost/functional/overloaded_function/detail/function_type.hpp>
+#       include <boost/functional/overloaded_function/config.hpp>
+#       include <boost/typeof/typeof.hpp>
+#       include <boost/preprocessor/iteration/iterate.hpp>
+#       include <boost/preprocessor/repetition/enum.hpp>
+#       include <boost/preprocessor/repetition/repeat.hpp>
+#       include <boost/preprocessor/control/expr_iif.hpp>
+#       include <boost/preprocessor/control/expr_if.hpp>
+#       include <boost/preprocessor/comparison/greater.hpp>
+#       include <boost/preprocessor/comparison/less.hpp>
+#       include <boost/preprocessor/cat.hpp>
+#       include <boost/preprocessor/arithmetic/add.hpp>
+#       include <boost/preprocessor/arithmetic/sub.hpp>
+#       include <boost/preprocessor/tuple/eat.hpp>
+#       include <boost/preprocessor/logical/and.hpp>
+#       include <boost/preprocessor/logical/not.hpp>
+#       include <boost/preprocessor/facilities/expand.hpp>
+
+#define BOOST_FUNCTIONAL_f_type(z, n, unused) \
+    BOOST_PP_CAT(F, n)
+
+#define BOOST_FUNCTIONAL_f_arg(z, n, unused) \
+    BOOST_PP_CAT(f, n)
+
+#define BOOST_FUNCTIONAL_f_tparam(z, n, unused) \
+    typename BOOST_FUNCTIONAL_f_type(z, n, ~) \
+
+#define BOOST_FUNCTIONAL_f_tparam_dflt(z, n, is_tspec) \
+    BOOST_FUNCTIONAL_f_tparam(z, n, ~) \
+    /* overload requires at least 2 functors so F0 and F1 not optional */ \
+    BOOST_PP_EXPR_IIF(BOOST_PP_AND(BOOST_PP_NOT(is_tspec), \
+            BOOST_PP_GREATER(n, 1)), \
+        = void \
+    )
+
+#define BOOST_FUNCTIONAL_f_arg_decl(z, n, unused) \
+    BOOST_FUNCTIONAL_f_type(z, n, ~) /* no qualifier to deduce tparam */ \
+    BOOST_FUNCTIONAL_f_arg(z, n, ~)
+
+#define BOOST_FUNCTIONAL_g_type(z, n, unused) \
+    BOOST_PP_CAT(G, n)
+
+#define BOOST_FUNCTIONAL_g_arg(z, n, unused) \
+    BOOST_PP_CAT(g, n)
+
+#define BOOST_FUNCTIONAL_g_tparam(z, n, unused) \
+    typename BOOST_FUNCTIONAL_g_type(z, n, ~)
+
+#define BOOST_FUNCTIONAL_g_arg_decl(z, n, unused) \
+    BOOST_FUNCTIONAL_g_type(z, n, ~) /* no qualifier to deduce tparam */ \
+    BOOST_FUNCTIONAL_g_arg(z, n, ~)
+
+#define BOOST_FUNCTIONAL_base(z, n, unused) \
+    ::boost::overloaded_function_detail::base< \
+        BOOST_FUNCTIONAL_f_type(z, n, ~) \
+    >
+
+#define BOOST_FUNCTIONAL_inherit(z, n, unused) \
+    public BOOST_FUNCTIONAL_base(z, n, ~)
+
+#define BOOST_FUNCTIONAL_base_init(z, n, unused) \
+    BOOST_FUNCTIONAL_base(z, n, ~)(BOOST_FUNCTIONAL_g_arg(z, n, ~))
+
+#define BOOST_FUNCTIONAL_using_operator_call(z, n, unused) \
+    using BOOST_FUNCTIONAL_base(z, n, ~)::operator();
+
+#define BOOST_FUNCTIONAL_function_type(z, n, unused) \
+    typename ::boost::overloaded_function_detail::function_type< \
+        BOOST_FUNCTIONAL_f_type(z, n, ~) \
+    >::type
+
+#       define BOOST_PP_ITERATION_PARAMS_1 \
+            /* at least 2 func to overload so start from 2 to MAX */ \
+            /* (cannot iterate [0, MAX-2) because error on Sun) */ \
+            (3, (2, BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX, \
+            "boost/functional/overloaded_function.hpp"))
+#       include BOOST_PP_ITERATE() // Iterate over function arity.
+
+#undef BOOST_FUNCTIONAL_f_type
+#undef BOOST_FUNCTIONAL_f_arg
+#undef BOOST_FUNCTIONAL_f_tparam
+#undef BOOST_FUNCTIONAL_f_arg_decl
+#undef BOOST_FUNCTIONAL_f_tparam_dflt
+#undef BOOST_FUNCTIONAL_g_type
+#undef BOOST_FUNCTIONAL_g_arg
+#undef BOOST_FUNCTIONAL_g_tparam
+#undef BOOST_FUNCTIONAL_g_arg_decl
+#undef BOOST_FUNCTIONAL_base
+#undef BOOST_FUNCTIONAL_inherit
+#undef BOOST_FUNCTIONAL_base_init
+#undef BOOST_FUNCTIONAL_using_operator_call
+#undef BOOST_FUNCTIONAL_function_type
+
+#   endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+#   define BOOST_FUNCTIONAL_overloads \
+        /* iterate as OVERLOADS, OVERLOADS-1, OVERLOADS-2, ... */ \
+        /* (add 2 because iteration started from 2 to MAX) */ \
+        BOOST_PP_ADD(2, BOOST_PP_SUB( \
+                BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX, \
+                BOOST_PP_FRAME_ITERATION(1)))
+#   define BOOST_FUNCTIONAL_is_tspec \
+        /* if template specialization */ \
+        BOOST_PP_LESS(BOOST_FUNCTIONAL_overloads, \
+                BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX)
+
+// For type-of emulation: This must be included at this pp iteration level.
+#   include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+namespace boost {
+
+template<
+    BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_tparam_dflt,
+            BOOST_FUNCTIONAL_is_tspec)
+>
+class overloaded_function
+    // Template specialization.
+    BOOST_PP_EXPR_IIF(BOOST_PP_EXPAND(BOOST_FUNCTIONAL_is_tspec), <)
+    BOOST_PP_IIF(BOOST_FUNCTIONAL_is_tspec,
+        BOOST_PP_ENUM
+    ,
+        BOOST_PP_TUPLE_EAT(3)
+    )(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_type, ~)
+    BOOST_PP_EXPR_IIF(BOOST_PP_EXPAND(BOOST_FUNCTIONAL_is_tspec), >)
+    // Bases (overloads >= 2 so always at least 2 bases).
+    : BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+            BOOST_FUNCTIONAL_inherit, ~)
+{
+public:
+    template<
+        BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_g_tparam, ~)
+    > /* implicit */ inline overloaded_function(
+            BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+                    BOOST_FUNCTIONAL_g_arg_decl, ~))
+            // Overloads >= 2 so always at least 2 bases to initialize.
+            : BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+                    BOOST_FUNCTIONAL_base_init, ~)
+    {}
+
+    BOOST_PP_REPEAT(BOOST_FUNCTIONAL_overloads, 
+            BOOST_FUNCTIONAL_using_operator_call, ~)
+};
+
+template<
+    BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_tparam, ~)
+>
+overloaded_function<
+    BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_function_type, ~)
+> make_overloaded_function(
+    BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_arg_decl, ~)
+) {
+    return overloaded_function<
+        BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+                BOOST_FUNCTIONAL_function_type, ~)
+    >(BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_arg, ~));
+}
+
+} // namespace
+
+// For type-of emulation: Register overloaded function type (for _AUTO, etc).
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::overloaded_function,
+    BOOST_FUNCTIONAL_overloads)
+
+#   undef BOOST_FUNCTIONAL_overloads
+#   undef BOOST_FUNCTIONAL_is_tspec
+#endif // iteration
+
+// DOCUMENTATION //
+
+#else // DOXYGEN
+
+/** @file
+ at brief Overload distinct function pointers, function references, and
+monomorphic function objects into a single function object.
+*/
+
+namespace boost {
+
+/**
+ at brief Function object to overload functions with distinct signatures.
+
+This function object aggregates together calls to functions of all the
+specified function types <c>F1</c>, <c>F2</c>, etc which must have distinct
+function signatures from one another.
+
+ at Params
+ at Param{F<em>i</em>,
+Each function type must be specified using the following syntax (which is
+Boost.Function's preferred syntax):
+ at code
+    result_type (argument1_type\, argumgnet2_type\, ...)
+ at endcode
+}
+ at EndParams
+
+In some cases, the @RefFunc{make_overloaded_function} function template can be
+useful to construct an overloaded function object without explicitly
+specifying the function types.
+
+At least two distinct function types must be specified (because there is
+nothing to overload between one or zero functions).
+The maximum number of functions to overload is given by the
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}
+configuration macro.
+The maximum number of function parameters for each of the specified function
+types is given by the
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX}
+configuration macro.
+
+ at See @RefSect{tutorial, Tutorial} section, @RefFunc{make_overloaded_function},
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX},
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX},
+Boost.Function.
+*/
+template<typename F1, typename F2, ...>
+class overloaded_function {
+public:
+    /**
+    @brief Construct the overloaded function object.
+
+    Any function pointer, function reference, and monomorphic function object
+    that can be converted to a <c>boost::function</c> function object can be
+    specified as parameter.
+
+    @Note Unfortunately, it is not possible to support polymorphic function
+    objects (as explained <a
+    href="http://lists.boost.org/Archives/boost/2012/03/191744.php">here</a>).
+    */
+    overloaded_function(const boost::function<F1>&,
+            const boost::function<F2>&, ...);
+
+    /**
+    @brief Call operator matching the signature of the function type specified
+    as 1st template parameter.
+
+    This will in turn invoke the call operator of the 1st function passed to
+    the constructor.
+    */
+    typename boost::function_traits<F1>::result_type operator()(
+            typename boost::function_traits<F1>::arg1_type,
+            typename boost::function_traits<F1>::arg2_type,
+            ...) const;
+
+    /**
+    @brief Call operator matching the signature of the function type specified
+    as 2nd template parameter.
+
+    This will in turn invoke the call operator of the 2nd function passed to
+    the constructor.
+
+    @Note Similar call operators are present for all specified function types
+    <c>F1</c>, <c>F2</c>, etc (even if not exhaustively listed by this
+    documentation).
+    */
+    typename boost::function_traits<F2>::result_type operator()(
+            typename boost::function_traits<F2>::arg1_type,
+            typename boost::function_traits<F2>::arg2_type,
+            ...) const;
+};
+
+/**
+ at brief Make an overloaded function object without explicitly specifying the
+function types.
+
+This function template creates and returns an @RefClass{overloaded_function}
+object that overloads all the specified functions <c>f1</c>, <c>f2</c>, etc.
+
+The function types are internally determined from the template parameter types
+so they do not need to be explicitly specified.
+Therefore, this function template usually has a more concise syntax when
+compared with @RefClass{overloaded_function}.
+This is especially useful when the explicit type of the returned
+ at RefClass{overloaded_function} object does not need to be known (e.g., when
+used with Boost.Typeof's <c>BOOST_AUTO</c>, C++11 <c>auto</c>, or when the
+overloaded function object is handled using a function template parameter, see
+the @RefSect{tutorial, Tutorial} section).
+
+The maximum number of functions to overload is given by the
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}
+configuration macro.
+
+ at Note In this documentation, <c>__function_type__</c> is a placeholder for a
+symbol that is specific to the implementation of this library.
+
+ at See @RefSect{tutorial, Tutorial} section, @RefClass{overloaded_function},
+ at RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}.
+*/
+template<typename F1, typename F2, ...>
+overloaded_function<
+    __function_type__<F1>, __function_type__<F2>, ...
+> make_overloaded_function(F1 f1, F2 f2, ...);
+
+} // namespace
+
+#endif // DOXYGEN
+
diff --git a/gatb-core/thirdparty/boost/functional/overloaded_function/config.hpp b/gatb-core/thirdparty/boost/functional/overloaded_function/config.hpp
new file mode 100644
index 0000000..2f5d9e1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/overloaded_function/config.hpp
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_HPP_
+#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_HPP_
+
+/** @file
+ at brief Change the compile-time configuration of this library.
+*/
+
+/**
+ at brief Specify the maximum number of arguments of the functions being
+overloaded.
+
+If this macro is left undefined by the user, it has a default value of 5
+(increasing this number might increase compilation time).
+When specified by the user, this macro must be a non-negative integer number.
+
+ at See @RefSect{getting_started, Getting Started},
+ at RefClass{boost::overloaded_function}.
+*/
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX 
+#   define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX 5
+#endif
+
+/**
+ at brief Specify the maximum number of functions that can be overloaded.
+
+If this macro is left undefined by the user, it has a default value of 5
+(increasing this number might increase compilation time).
+When defined by the user, this macro must be an integer number greater or
+equal than 2 (because at least two distinct functions need to be specified in
+order to define an overload).
+
+ at See @RefSect{getting_started, Getting Started},
+ at RefClass{boost::overloaded_function}.
+*/
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX
+#   define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX 5
+#endif
+#if BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX < 2
+#   error "maximum overload macro cannot be less than 2"
+#endif
+
+#endif // #include guard
+
diff --git a/gatb-core/thirdparty/boost/functional/overloaded_function/detail/base.hpp b/gatb-core/thirdparty/boost/functional/overloaded_function/detail/base.hpp
new file mode 100644
index 0000000..8fd9a0a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/overloaded_function/detail/base.hpp
@@ -0,0 +1,86 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#if !BOOST_PP_IS_ITERATING
+#   ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
+#       define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
+
+#       include <boost/functional/overloaded_function/config.hpp>
+#       include <boost/function.hpp>
+#       include <boost/preprocessor/iteration/iterate.hpp>
+#       include <boost/preprocessor/repetition/enum.hpp>
+#       include <boost/preprocessor/cat.hpp>
+#       include <boost/preprocessor/comma_if.hpp>
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
+    BOOST_PP_CAT(A, n)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused) \
+    BOOST_PP_CAT(a, n)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_tparam(z, n, unused) \
+    typename BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg(z, n, unused) \
+    BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
+    BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused)
+
+#define BOOST_FUNCTIONAL_DETAIL_f \
+    R (BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity, \
+            BOOST_FUNCTIONAL_DETAIL_arg_type, ~))
+
+// Do not use namespace ::detail because overloaded_function is already a class.
+namespace boost { namespace overloaded_function_detail {
+
+template<typename F>
+class base {}; // Empty template cannot be used directly (only its spec).
+
+#       define BOOST_PP_ITERATION_PARAMS_1 \
+                (3, (0, BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX, \
+                "boost/functional/overloaded_function/detail/base.hpp"))
+#       include BOOST_PP_ITERATE() // Iterate over funciton arity.
+
+} } // namespace
+
+#undef BOOST_FUNCTIONAL_DETAIL_arg_type
+#undef BOOST_FUNCTIONAL_DETAIL_arg_name
+#undef BOOST_FUNCTIONAL_DETAIL_arg_tparam
+#undef BOOST_FUNCTIONAL_DETAIL_arg
+#undef BOOST_FUNCTIONAL_DETAIL_f
+
+#   endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+#   define BOOST_FUNCTIONAL_DETAIL_arity BOOST_PP_FRAME_ITERATION(1)
+
+template<
+    typename R
+    BOOST_PP_COMMA_IF(BOOST_FUNCTIONAL_DETAIL_arity)
+    BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+            BOOST_FUNCTIONAL_DETAIL_arg_tparam, ~)
+>
+class base< BOOST_FUNCTIONAL_DETAIL_f > {
+public:
+    /* implicit */ inline base(
+            // This requires specified type to be implicitly convertible to
+            // a boost::function<> functor.
+            boost::function< BOOST_FUNCTIONAL_DETAIL_f > const& f): f_(f)
+    {}
+
+    inline R operator()(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+            BOOST_FUNCTIONAL_DETAIL_arg, ~)) const {
+        return f_(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+                BOOST_FUNCTIONAL_DETAIL_arg_name, ~));
+    }
+
+private:
+    boost::function< BOOST_FUNCTIONAL_DETAIL_f > const f_;
+};
+
+#   undef BOOST_FUNCTIONAL_DETAIL_arity
+#endif // iteration
+
diff --git a/gatb-core/thirdparty/boost/functional/overloaded_function/detail/function_type.hpp b/gatb-core/thirdparty/boost/functional/overloaded_function/detail/function_type.hpp
new file mode 100644
index 0000000..0c28607
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/overloaded_function/detail/function_type.hpp
@@ -0,0 +1,85 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_FUNCTION_TYPE_HPP_
+#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_FUNCTION_TYPE_HPP_
+
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/function.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/typeof/typeof.hpp>
+
+// Do not use namespace ::detail because overloaded_function is already a class.
+namespace boost { namespace overloaded_function_detail {
+
+// Requires: F is a monomorphic functor (i.e., has non-template `operator()`).
+// Returns: F's function type `result_type (arg1_type, arg2_type, ...)`.
+// It does not assume F typedef result_type, arg1_type, ... but needs typeof.
+template<typename F>
+class functor_type {
+    // NOTE: clang does not accept extra parenthesis `&(...)`.
+    typedef BOOST_TYPEOF_TPL(&F::operator()) call_ptr;
+public:
+    typedef
+        typename boost::function_types::function_type<
+            typename boost::mpl::push_front<
+                  typename boost::mpl::pop_front< // Remove functor type (1st).
+                    typename boost::function_types::parameter_types<
+                            call_ptr>::type
+                  >::type
+                , typename boost::function_types::result_type<call_ptr>::type
+            >::type
+        >::type
+    type;
+};
+
+// NOTE: When using boost::function in Boost.Typeof emulation mode, the user
+// has to register boost::functionN instead of boost::function in oder to
+// do TYPEOF(F::operator()). That is confusing, so boost::function is handled
+// separately so it does not require any Boost.Typeof registration at all.
+template<typename F>
+struct functor_type< boost::function<F> > {
+    typedef F type;
+};
+
+// Requires: F is a function type, pointer, reference, or monomorphic functor.
+// Returns: F's function type `result_type (arg1_type, arg2_type, ...)`.
+template<typename F>
+struct function_type {
+    typedef
+        typename boost::mpl::if_<boost::function_types::is_function<F>,
+            boost::mpl::identity<F>
+        ,
+            typename boost::mpl::if_<boost::function_types::
+                    is_function_pointer<F>,
+                boost::remove_pointer<F>
+            ,
+                typename boost::mpl::if_<boost::function_types::
+                        is_function_reference<F>,
+                    boost::remove_reference<F>
+                , // Else, requires that F is a functor.
+                    functor_type<F>
+                >::type
+            >::type
+        >::type
+    ::type type;
+};
+
+} } // namespace
+
+#endif // #include guard
+
diff --git a/gatb-core/thirdparty/boost/functional/value_factory.hpp b/gatb-core/thirdparty/boost/functional/value_factory.hpp
new file mode 100644
index 0000000..ba94c2a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/functional/value_factory.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+    Copyright (c) 2007 Tobias Schwinger
+  
+    Use modification and distribution are subject to the Boost Software 
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_VALUE_FACTORY_HPP_INCLUDED
+#   ifndef BOOST_PP_IS_ITERATING
+
+#     include <boost/preprocessor/iteration/iterate.hpp>
+#     include <boost/preprocessor/repetition/enum_params.hpp>
+#     include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#     include <new>
+#     include <boost/pointee.hpp>
+#     include <boost/get_pointer.hpp>
+#     include <boost/non_type.hpp>
+#     include <boost/type_traits/remove_cv.hpp>
+
+#     ifndef BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY
+#       define BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY 10
+#     elif BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY < 3
+#       undef  BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY
+#       define BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY 3
+#     endif
+
+namespace boost
+{
+    template< typename T >
+    class value_factory;
+
+    //----- ---- --- -- - -  -   -
+
+    template< typename T >
+    class value_factory
+    {
+      public:
+        typedef T result_type;
+
+        value_factory()
+        { }
+
+#     define BOOST_PP_FILENAME_1 <boost/functional/value_factory.hpp>
+#     define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY)
+#     include BOOST_PP_ITERATE()
+    };
+
+    template< typename T > class value_factory<T&>;
+    // forbidden, would create a dangling reference
+}
+#     define BOOST_FUNCTIONAL_VALUE_FACTORY_HPP_INCLUDED
+#   else // defined(BOOST_PP_IS_ITERATING)
+
+#     define N BOOST_PP_ITERATION()
+#     if N > 0
+    template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+#     endif
+    inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+    {
+        return result_type(BOOST_PP_ENUM_PARAMS(N,a));
+    }
+#     undef N
+
+#   endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/bindings/detail/big_digamma.hpp b/gatb-core/thirdparty/boost/math/bindings/detail/big_digamma.hpp
new file mode 100644
index 0000000..bbddb23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/detail/big_digamma.hpp
@@ -0,0 +1,295 @@
+//  (C) Copyright John Maddock 2006-8.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_NTL_DIGAMMA
+#define BOOST_MATH_NTL_DIGAMMA
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+T big_digamma_helper(T x)
+{
+      static const T P[61] = {
+         boost::lexical_cast<T>("0.6660133691143982067148122682345055274952e81"),
+         boost::lexical_cast<T>("0.6365271516829242456324234577164675383137e81"),
+         boost::lexical_cast<T>("0.2991038873096202943405966144203628966976e81"),
+         boost::lexical_cast<T>("0.9211116495503170498076013367421231351115e80"),
+         boost::lexical_cast<T>("0.2090792764676090716286400360584443891749e80"),
+         boost::lexical_cast<T>("0.3730037777359591428226035156377978092809e79"),
+         boost::lexical_cast<T>("0.5446396536956682043376492370432031543834e78"),
+         boost::lexical_cast<T>("0.6692523966335177847425047827449069256345e77"),
+         boost::lexical_cast<T>("0.7062543624100864681625612653756619116848e76"),
+         boost::lexical_cast<T>("0.6499914905966283735005256964443226879158e75"),
+         boost::lexical_cast<T>("0.5280364564853225211197557708655426736091e74"),
+         boost::lexical_cast<T>("0.3823205608981176913075543599005095206953e73"),
+         boost::lexical_cast<T>("0.2486733714214237704739129972671154532415e72"),
+         boost::lexical_cast<T>("0.1462562139602039577983434547171318011675e71"),
+         boost::lexical_cast<T>("0.7821169065036815012381267259559910324285e69"),
+         boost::lexical_cast<T>("0.3820552182348155468636157988764435365078e68"),
+         boost::lexical_cast<T>("0.1711618296983598244658239925535632505062e67"),
+         boost::lexical_cast<T>("0.7056661618357643731419080738521475204245e65"),
+         boost::lexical_cast<T>("0.2685246896473614017356264531791459936036e64"),
+         boost::lexical_cast<T>("0.9455168125599643085283071944864977592391e62"),
+         boost::lexical_cast<T>("0.3087541626972538362237309145177486236219e61"),
+         boost::lexical_cast<T>("0.9367928873352980208052601301625005737407e59"),
+         boost::lexical_cast<T>("0.2645306130689794942883818547314327466007e58"),
+         boost::lexical_cast<T>("0.6961815141171454309161007351079576190079e56"),
+         boost::lexical_cast<T>("0.1709637824471794552313802669803885946843e55"),
+         boost::lexical_cast<T>("0.3921553258481531526663112728778759311158e53"),
+         boost::lexical_cast<T>("0.8409006354449988687714450897575728228696e51"),
+         boost::lexical_cast<T>("0.1686755204461325935742097669030363344927e50"),
+         boost::lexical_cast<T>("0.3166653542877070999007425197729038754254e48"),
+         boost::lexical_cast<T>("0.5566029092358215049069560272835654229637e46"),
+         boost::lexical_cast<T>("0.9161766287916328133080586672953875116242e44"),
+         boost::lexical_cast<T>("1412317772330871298317974693514430627922000"),
+         boost::lexical_cast<T>("20387991986727877473732570146112459874790"),
+         boost::lexical_cast<T>("275557928713904105182512535678580359839.3"),
+         boost::lexical_cast<T>("3485719851040516559072031256589598330.723"),
+         boost::lexical_cast<T>("41247046743564028399938106707656877.40859"),
+         boost::lexical_cast<T>("456274078125709314602601667471879.0147312"),
+         boost::lexical_cast<T>("4714450683242899367025707077155.310613012"),
+         boost::lexical_cast<T>("45453933537925041680009544258.75073849996"),
+         boost::lexical_cast<T>("408437900487067278846361972.302331241052"),
+         boost::lexical_cast<T>("3415719344386166273085838.705771571751035"),
+         boost::lexical_cast<T>("26541502879185876562320.93134691487351145"),
+         boost::lexical_cast<T>("191261415065918713661.1571433274648417668"),
+         boost::lexical_cast<T>("1275349770108718421.645275944284937551702"),
+         boost::lexical_cast<T>("7849171120971773.318910987434906905704272"),
+         boost::lexical_cast<T>("44455946386549.80866460312682983576538056"),
+         boost::lexical_cast<T>("230920362395.3198137186361608905136598046"),
+         boost::lexical_cast<T>("1095700096.240863858624279930600654130254"),
+         boost::lexical_cast<T>("4727085.467506050153744334085516289728134"),
+         boost::lexical_cast<T>("18440.75118859447173303252421991479005424"),
+         boost::lexical_cast<T>("64.62515887799460295677071749181651317052"),
+         boost::lexical_cast<T>("0.201851568864688406206528472883512147547"),
+         boost::lexical_cast<T>("0.0005565091674187978029138500039504078098143"),
+         boost::lexical_cast<T>("0.1338097668312907986354698683493366559613e-5"),
+         boost::lexical_cast<T>("0.276308225077464312820179030238305271638e-8"),
+         boost::lexical_cast<T>("0.4801582970473168520375942100071070575043e-11"),
+         boost::lexical_cast<T>("0.6829184144212920949740376186058541800175e-14"),
+         boost::lexical_cast<T>("0.7634080076358511276617829524639455399182e-17"),
+         boost::lexical_cast<T>("0.6290035083727140966418512608156646142409e-20"),
+         boost::lexical_cast<T>("0.339652245667538733044036638506893821352e-23"),
+         boost::lexical_cast<T>("0.9017518064256388530773585529891677854909e-27")
+      };
+      static const T Q[61] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("0.1386831185456898357379390197203894063459e81"),
+         boost::lexical_cast<T>("0.6467076379487574703291056110838151259438e81"),
+         boost::lexical_cast<T>("0.1394967823848615838336194279565285465161e82"),
+         boost::lexical_cast<T>("0.1872927317344192945218570366455046340458e82"),
+         boost::lexical_cast<T>("0.1772461045338946243584650759986310355937e82"),
+         boost::lexical_cast<T>("0.1267294892200258648315971144069595555118e82"),
+         boost::lexical_cast<T>("0.7157764838362416821508872117623058626589e81"),
+         boost::lexical_cast<T>("0.329447266909948668265277828268378274513e81"),
+         boost::lexical_cast<T>("0.1264376077317689779509250183194342571207e81"),
+         boost::lexical_cast<T>("0.4118230304191980787640446056583623228873e80"),
+         boost::lexical_cast<T>("0.1154393529762694616405952270558316515261e80"),
+         boost::lexical_cast<T>("0.281655612889423906125295485693696744275e79"),
+         boost::lexical_cast<T>("0.6037483524928743102724159846414025482077e78"),
+         boost::lexical_cast<T>("0.1145927995397835468123576831800276999614e78"),
+         boost::lexical_cast<T>("0.1938624296151985600348534009382865995154e77"),
+         boost::lexical_cast<T>("0.293980925856227626211879961219188406675e76"),
+         boost::lexical_cast<T>("0.4015574518216966910319562902099567437832e75"),
+         boost::lexical_cast<T>("0.4961475457509727343545565970423431880907e74"),
+         boost::lexical_cast<T>("0.5565482348278933960215521991000378896338e73"),
+         boost::lexical_cast<T>("0.5686112924615820754631098622770303094938e72"),
+         boost::lexical_cast<T>("0.5305988545844796293285410303747469932856e71"),
+         boost::lexical_cast<T>("0.4533363413802585060568537458067343491358e70"),
+         boost::lexical_cast<T>("0.3553932059473516064068322757331575565718e69"),
+         boost::lexical_cast<T>("0.2561198565218704414618802902533972354203e68"),
+         boost::lexical_cast<T>("0.1699519313292900324098102065697454295572e67"),
+         boost::lexical_cast<T>("0.1039830160862334505389615281373574959236e66"),
+         boost::lexical_cast<T>("0.5873082967977428281000961954715372504986e64"),
+         boost::lexical_cast<T>("0.3065255179030575882202133042549783442446e63"),
+         boost::lexical_cast<T>("0.1479494813481364701208655943688307245459e62"),
+         boost::lexical_cast<T>("0.6608150467921598615495180659808895663164e60"),
+         boost::lexical_cast<T>("0.2732535313770902021791888953487787496976e59"),
+         boost::lexical_cast<T>("0.1046402297662493314531194338414508049069e58"),
+         boost::lexical_cast<T>("0.3711375077192882936085049147920021549622e56"),
+         boost::lexical_cast<T>("0.1219154482883895482637944309702972234576e55"),
+         boost::lexical_cast<T>("0.3708359374149458741391374452286837880162e53"),
+         boost::lexical_cast<T>("0.1044095509971707189716913168889769471468e52"),
+         boost::lexical_cast<T>("0.271951506225063286130946773813524945052e50"),
+         boost::lexical_cast<T>("0.6548016291215163843464133978454065823866e48"),
+         boost::lexical_cast<T>("0.1456062447610542135403751730809295219344e47"),
+         boost::lexical_cast<T>("0.2986690175077969760978388356833006028929e45"),
+         boost::lexical_cast<T>("5643149706574013350061247429006443326844000"),
+         boost::lexical_cast<T>("98047545414467090421964387960743688053480"),
+         boost::lexical_cast<T>("1563378767746846395507385099301468978550"),
+         boost::lexical_cast<T>("22823360528584500077862274918382796495"),
+         boost::lexical_cast<T>("304215527004115213046601295970388750"),
+         boost::lexical_cast<T>("3690289075895685793844344966820325"),
+         boost::lexical_cast<T>("40584512015702371433911456606050"),
+         boost::lexical_cast<T>("402834190897282802772754873905"),
+         boost::lexical_cast<T>("3589522158493606918146495750"),
+         boost::lexical_cast<T>("28530557707503483723634725"),
+         boost::lexical_cast<T>("200714561335055753000730"),
+         boost::lexical_cast<T>("1237953783437761888641"),
+         boost::lexical_cast<T>("6614698701445762950"),
+         boost::lexical_cast<T>("30155495647727505"),
+         boost::lexical_cast<T>("114953256021450"),
+         boost::lexical_cast<T>("356398020013"),
+         boost::lexical_cast<T>("863113950"),
+         boost::lexical_cast<T>("1531345"),
+         boost::lexical_cast<T>("1770"),
+         boost::lexical_cast<T>("1")
+      };
+      static const T PD[60] = {
+         boost::lexical_cast<T>("0.6365271516829242456324234577164675383137e81"),
+         2*boost::lexical_cast<T>("0.2991038873096202943405966144203628966976e81"),
+         3*boost::lexical_cast<T>("0.9211116495503170498076013367421231351115e80"),
+         4*boost::lexical_cast<T>("0.2090792764676090716286400360584443891749e80"),
+         5*boost::lexical_cast<T>("0.3730037777359591428226035156377978092809e79"),
+         6*boost::lexical_cast<T>("0.5446396536956682043376492370432031543834e78"),
+         7*boost::lexical_cast<T>("0.6692523966335177847425047827449069256345e77"),
+         8*boost::lexical_cast<T>("0.7062543624100864681625612653756619116848e76"),
+         9*boost::lexical_cast<T>("0.6499914905966283735005256964443226879158e75"),
+         10*boost::lexical_cast<T>("0.5280364564853225211197557708655426736091e74"),
+         11*boost::lexical_cast<T>("0.3823205608981176913075543599005095206953e73"),
+         12*boost::lexical_cast<T>("0.2486733714214237704739129972671154532415e72"),
+         13*boost::lexical_cast<T>("0.1462562139602039577983434547171318011675e71"),
+         14*boost::lexical_cast<T>("0.7821169065036815012381267259559910324285e69"),
+         15*boost::lexical_cast<T>("0.3820552182348155468636157988764435365078e68"),
+         16*boost::lexical_cast<T>("0.1711618296983598244658239925535632505062e67"),
+         17*boost::lexical_cast<T>("0.7056661618357643731419080738521475204245e65"),
+         18*boost::lexical_cast<T>("0.2685246896473614017356264531791459936036e64"),
+         19*boost::lexical_cast<T>("0.9455168125599643085283071944864977592391e62"),
+         20*boost::lexical_cast<T>("0.3087541626972538362237309145177486236219e61"),
+         21*boost::lexical_cast<T>("0.9367928873352980208052601301625005737407e59"),
+         22*boost::lexical_cast<T>("0.2645306130689794942883818547314327466007e58"),
+         23*boost::lexical_cast<T>("0.6961815141171454309161007351079576190079e56"),
+         24*boost::lexical_cast<T>("0.1709637824471794552313802669803885946843e55"),
+         25*boost::lexical_cast<T>("0.3921553258481531526663112728778759311158e53"),
+         26*boost::lexical_cast<T>("0.8409006354449988687714450897575728228696e51"),
+         27*boost::lexical_cast<T>("0.1686755204461325935742097669030363344927e50"),
+         28*boost::lexical_cast<T>("0.3166653542877070999007425197729038754254e48"),
+         29*boost::lexical_cast<T>("0.5566029092358215049069560272835654229637e46"),
+         30*boost::lexical_cast<T>("0.9161766287916328133080586672953875116242e44"),
+         31*boost::lexical_cast<T>("1412317772330871298317974693514430627922000"),
+         32*boost::lexical_cast<T>("20387991986727877473732570146112459874790"),
+         33*boost::lexical_cast<T>("275557928713904105182512535678580359839.3"),
+         34*boost::lexical_cast<T>("3485719851040516559072031256589598330.723"),
+         35*boost::lexical_cast<T>("41247046743564028399938106707656877.40859"),
+         36*boost::lexical_cast<T>("456274078125709314602601667471879.0147312"),
+         37*boost::lexical_cast<T>("4714450683242899367025707077155.310613012"),
+         38*boost::lexical_cast<T>("45453933537925041680009544258.75073849996"),
+         39*boost::lexical_cast<T>("408437900487067278846361972.302331241052"),
+         40*boost::lexical_cast<T>("3415719344386166273085838.705771571751035"),
+         41*boost::lexical_cast<T>("26541502879185876562320.93134691487351145"),
+         42*boost::lexical_cast<T>("191261415065918713661.1571433274648417668"),
+         43*boost::lexical_cast<T>("1275349770108718421.645275944284937551702"),
+         44*boost::lexical_cast<T>("7849171120971773.318910987434906905704272"),
+         45*boost::lexical_cast<T>("44455946386549.80866460312682983576538056"),
+         46*boost::lexical_cast<T>("230920362395.3198137186361608905136598046"),
+         47*boost::lexical_cast<T>("1095700096.240863858624279930600654130254"),
+         48*boost::lexical_cast<T>("4727085.467506050153744334085516289728134"),
+         49*boost::lexical_cast<T>("18440.75118859447173303252421991479005424"),
+         50*boost::lexical_cast<T>("64.62515887799460295677071749181651317052"),
+         51*boost::lexical_cast<T>("0.201851568864688406206528472883512147547"),
+         52*boost::lexical_cast<T>("0.0005565091674187978029138500039504078098143"),
+         53*boost::lexical_cast<T>("0.1338097668312907986354698683493366559613e-5"),
+         54*boost::lexical_cast<T>("0.276308225077464312820179030238305271638e-8"),
+         55*boost::lexical_cast<T>("0.4801582970473168520375942100071070575043e-11"),
+         56*boost::lexical_cast<T>("0.6829184144212920949740376186058541800175e-14"),
+         57*boost::lexical_cast<T>("0.7634080076358511276617829524639455399182e-17"),
+         58*boost::lexical_cast<T>("0.6290035083727140966418512608156646142409e-20"),
+         59*boost::lexical_cast<T>("0.339652245667538733044036638506893821352e-23"),
+         60*boost::lexical_cast<T>("0.9017518064256388530773585529891677854909e-27")
+      };
+      static const T QD[60] = {
+         boost::lexical_cast<T>("0.1386831185456898357379390197203894063459e81"),
+         2*boost::lexical_cast<T>("0.6467076379487574703291056110838151259438e81"),
+         3*boost::lexical_cast<T>("0.1394967823848615838336194279565285465161e82"),
+         4*boost::lexical_cast<T>("0.1872927317344192945218570366455046340458e82"),
+         5*boost::lexical_cast<T>("0.1772461045338946243584650759986310355937e82"),
+         6*boost::lexical_cast<T>("0.1267294892200258648315971144069595555118e82"),
+         7*boost::lexical_cast<T>("0.7157764838362416821508872117623058626589e81"),
+         8*boost::lexical_cast<T>("0.329447266909948668265277828268378274513e81"),
+         9*boost::lexical_cast<T>("0.1264376077317689779509250183194342571207e81"),
+         10*boost::lexical_cast<T>("0.4118230304191980787640446056583623228873e80"),
+         11*boost::lexical_cast<T>("0.1154393529762694616405952270558316515261e80"),
+         12*boost::lexical_cast<T>("0.281655612889423906125295485693696744275e79"),
+         13*boost::lexical_cast<T>("0.6037483524928743102724159846414025482077e78"),
+         14*boost::lexical_cast<T>("0.1145927995397835468123576831800276999614e78"),
+         15*boost::lexical_cast<T>("0.1938624296151985600348534009382865995154e77"),
+         16*boost::lexical_cast<T>("0.293980925856227626211879961219188406675e76"),
+         17*boost::lexical_cast<T>("0.4015574518216966910319562902099567437832e75"),
+         18*boost::lexical_cast<T>("0.4961475457509727343545565970423431880907e74"),
+         19*boost::lexical_cast<T>("0.5565482348278933960215521991000378896338e73"),
+         20*boost::lexical_cast<T>("0.5686112924615820754631098622770303094938e72"),
+         21*boost::lexical_cast<T>("0.5305988545844796293285410303747469932856e71"),
+         22*boost::lexical_cast<T>("0.4533363413802585060568537458067343491358e70"),
+         23*boost::lexical_cast<T>("0.3553932059473516064068322757331575565718e69"),
+         24*boost::lexical_cast<T>("0.2561198565218704414618802902533972354203e68"),
+         25*boost::lexical_cast<T>("0.1699519313292900324098102065697454295572e67"),
+         26*boost::lexical_cast<T>("0.1039830160862334505389615281373574959236e66"),
+         27*boost::lexical_cast<T>("0.5873082967977428281000961954715372504986e64"),
+         28*boost::lexical_cast<T>("0.3065255179030575882202133042549783442446e63"),
+         29*boost::lexical_cast<T>("0.1479494813481364701208655943688307245459e62"),
+         30*boost::lexical_cast<T>("0.6608150467921598615495180659808895663164e60"),
+         31*boost::lexical_cast<T>("0.2732535313770902021791888953487787496976e59"),
+         32*boost::lexical_cast<T>("0.1046402297662493314531194338414508049069e58"),
+         33*boost::lexical_cast<T>("0.3711375077192882936085049147920021549622e56"),
+         34*boost::lexical_cast<T>("0.1219154482883895482637944309702972234576e55"),
+         35*boost::lexical_cast<T>("0.3708359374149458741391374452286837880162e53"),
+         36*boost::lexical_cast<T>("0.1044095509971707189716913168889769471468e52"),
+         37*boost::lexical_cast<T>("0.271951506225063286130946773813524945052e50"),
+         38*boost::lexical_cast<T>("0.6548016291215163843464133978454065823866e48"),
+         39*boost::lexical_cast<T>("0.1456062447610542135403751730809295219344e47"),
+         40*boost::lexical_cast<T>("0.2986690175077969760978388356833006028929e45"),
+         41*boost::lexical_cast<T>("5643149706574013350061247429006443326844000"),
+         42*boost::lexical_cast<T>("98047545414467090421964387960743688053480"),
+         43*boost::lexical_cast<T>("1563378767746846395507385099301468978550"),
+         44*boost::lexical_cast<T>("22823360528584500077862274918382796495"),
+         45*boost::lexical_cast<T>("304215527004115213046601295970388750"),
+         46*boost::lexical_cast<T>("3690289075895685793844344966820325"),
+         47*boost::lexical_cast<T>("40584512015702371433911456606050"),
+         48*boost::lexical_cast<T>("402834190897282802772754873905"),
+         49*boost::lexical_cast<T>("3589522158493606918146495750"),
+         50*boost::lexical_cast<T>("28530557707503483723634725"),
+         51*boost::lexical_cast<T>("200714561335055753000730"),
+         52*boost::lexical_cast<T>("1237953783437761888641"),
+         53*boost::lexical_cast<T>("6614698701445762950"),
+         54*boost::lexical_cast<T>("30155495647727505"),
+         55*boost::lexical_cast<T>("114953256021450"),
+         56*boost::lexical_cast<T>("356398020013"),
+         57*boost::lexical_cast<T>("863113950"),
+         58*boost::lexical_cast<T>("1531345"),
+         59*boost::lexical_cast<T>("1770"),
+         60*boost::lexical_cast<T>("1")
+      };
+   static const double g = 63.192152;
+
+   T zgh = x + g - 0.5;
+
+   T result = (x - 0.5) / zgh;
+   result += log(zgh);
+   result += tools::evaluate_polynomial(PD, x) / tools::evaluate_polynomial(P, x);
+   result -= tools::evaluate_polynomial(QD, x) / tools::evaluate_polynomial(Q, x);
+   result -= 1;
+
+   return result;
+}
+
+template <class T>
+T big_digamma(T x)
+{
+   BOOST_MATH_STD_USING
+   if(x < 0)
+   {
+      return big_digamma_helper(static_cast<T>(1-x)) + constants::pi<T>() / tan(constants::pi<T>() * (1-x));
+   }
+   return big_digamma_helper(x);
+}
+
+}}}
+
+#endif // include guard
diff --git a/gatb-core/thirdparty/boost/math/bindings/detail/big_lanczos.hpp b/gatb-core/thirdparty/boost/math/bindings/detail/big_lanczos.hpp
new file mode 100644
index 0000000..573f9ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/detail/big_lanczos.hpp
@@ -0,0 +1,777 @@
+//  (C) Copyright John Maddock 2006-8.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_BIG_LANCZOS_HPP
+#define BOOST_BIG_LANCZOS_HPP
+
+#include <boost/math/special_functions/lanczos.hpp>
+
+namespace boost{ namespace math{ namespace lanczos{
+
+//
+// Lanczos Coefficients for N=13 G=13.144565
+// Max experimental error (with arbitary precision arithmetic) 9.2213e-23
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+typedef lanczos13 lanczos13UDT;
+
+//
+// Lanczos Coefficients for N=22 G=22.61891
+// Max experimental error (with arbitary precision arithmetic) 2.9524e-38
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos22UDT : public mpl::int_<120>
+{
+   //
+   // Produces slightly better than 128-bit long-double precision when 
+   // evaluated at higher precision:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos22UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 46198410803245094237463011094.12173081986)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 43735859291852324413622037436.321513777)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 19716607234435171720534556386.97481377748)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5629401471315018442177955161.245623932129)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1142024910634417138386281569.245580222392)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 175048529315951173131586747.695329230778)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 21044290245653709191654675.41581372963167)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2033001410561031998451380.335553678782601)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 160394318862140953773928.8736211601848891)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 10444944438396359705707.48957290388740896)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 565075825801617290121.1466393747967538948)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 25475874292116227538.99448534450411942597)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 957135055846602154.6720835535232270205725)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 29874506304047462.23662392445173880821515)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 769651310384737.2749087590725764959689181)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 16193289100889.15989633624378404096011797)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 273781151680.6807433264462376754578933261)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3630485900.32917021712188739762161583295)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 36374352.05577334277856865691538582936484)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 258945.7742115532455441786924971194951043)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1167.501919472435718934219997431551246996)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2.50662827463100050241576528481104525333))
+      };
+      static const T denom[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2432902008176640000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8752948036761600000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 13803759753640704000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 12870931245150988800.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8037811822645051776.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3599979517947607200.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1206647803780373360.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 311333643161390640.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 63030812099294896.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 10142299865511450.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1307535010540395.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 135585182899530.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 11310276995381.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 756111184500.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 40171771630.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1672280820.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 53327946.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1256850.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 20615.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 210.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1.0))
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos22UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 6939996264376682180.277485395074954356211)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 6570067992110214451.87201438870245659384)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2961859037444440551.986724631496417064121)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 845657339772791245.3541226499766163431651)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 171556737035449095.2475716923888737881837)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 26296059072490867.7822441885603400926007)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3161305619652108.433798300149816829198706)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 305400596026022.4774396904484542582526472)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 24094681058862.55120507202622377623528108)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1569055604375.919477574824168939428328839)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 84886558909.02047889339710230696942513159)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3827024985.166751989686050643579753162298)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 143782298.9273215199098728674282885500522)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 4487794.24541641841336786238909171265944)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 115618.2025760830513505888216285273541959)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2432.580773108508276957461757328744780439)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 41.12782532742893597168530008461874360191)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.5453771709477689805460179187388702295792)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.005464211062612080347167337964166505282809)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.388992321263586767037090706042788910953e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.1753839324538447655939518484052327068859e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.3765495513732730583386223384116545391759e-9))
+      };
+      static const T denom[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2432902008176640000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8752948036761600000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 13803759753640704000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 12870931245150988800.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8037811822645051776.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3599979517947607200.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1206647803780373360.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 311333643161390640.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 63030812099294896.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 10142299865511450.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1307535010540395.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 135585182899530.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 11310276995381.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 756111184500.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 40171771630.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1672280820.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 53327946.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1256850.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 20615.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 210.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1.0))
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos22UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[21] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8.318998691953337183034781139546384476554)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -63.15415991415959158214140353299240638675)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 217.3108224383632868591462242669081540163)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -448.5134281386108366899784093610397354889)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 619.2903759363285456927248474593012711346)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -604.1630177420625418522025080080444177046)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 428.8166750424646119935047118287362193314)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -224.6988753721310913866347429589434550302)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 87.32181627555510833499451817622786940961)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -25.07866854821128965662498003029199058098)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5.264398125689025351448861011657789005392)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.792518936256495243383586076579921559914)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.08317448364744713773350272460937904691566)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.005845345166274053157781068150827567998882)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.0002599412126352082483326238522490030412391)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.6748102079670763884917431338234783496303e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.908824383434109002762325095643458603605e-7)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.5299325929309389890892469299969669579725e-9)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.994306085859549890267983602248532869362e-12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.3499893692975262747371544905820891835298e-15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.7260746353663365145454867069182884694961e-20)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[21] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 75.39272007105208086018421070699575462226)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -572.3481967049935412452681346759966390319)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1969.426202741555335078065370698955484358)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -4064.74968778032030891520063865996757519)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5612.452614138013929794736248384309574814)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -5475.357667500026172903620177988213902339)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3886.243614216111328329547926490398103492)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -2036.382026072125407192448069428134470564)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 791.3727954936062108045551843636692287652)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -227.2808432388436552794021219198885223122)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 47.70974355562144229897637024320739257284)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -7.182373807798293545187073539819697141572)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.7537866989631514559601547530490976100468)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.05297470142240154822658739758236594717787)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.00235577330936380542539812701472320434133)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.6115613067659273118098229498679502138802e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.8236417010170941915758315020695551724181e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.4802628430993048190311242611330072198089e-8)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.9011113376981524418952720279739624707342e-11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.3171854152689711198382455703658589996796e-14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.6580207998808093935798753964580596673177e-19)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 22.61890999999999962710717227309942245483; }
+};
+//
+// Lanczos Coefficients for N=31 G=32.08067
+// Max experimental error (with arbitary precision arithmetic) 0.162e-52
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at May 9 2006
+//
+struct lanczos31UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos31UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[31] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2579646553333513328235723061836959833277e46)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2444796504337453845497419271639377138264e46)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1119885499016017172212179730662673475329e46)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.3301983829072723658949204487793889113715e45)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.7041171040503851585152895336505379417066e44)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1156687509001223855125097826246939403504e44)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1522559363393940883866575697565974893306000)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 164914363507650839510801418717701057005700)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 14978522943127593263654178827041568394060)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1156707153701375383907746879648168666774)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 76739431129980851159755403434593664173.2)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4407916278928188620282281495575981079.306)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 220487883931812802092792125175269667.3004)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 9644828280794966468052381443992828.433924)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 369996467042247229310044531282837.6549068)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 12468380890717344610932904378961.13494291)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 369289245210898235894444657859.0529720075)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 9607992460262594951559461829.34885209022)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 219225935074853412540086410.981421315799)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4374309943598658046326340.720767382079549)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 76008779092264509404014.10530947173485581)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1143503533822162444712.335663112617754987)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 14779233719977576920.37884890049671578409)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 162409028440678302.9992838032166348069916)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1496561553388385.733407609544964535634135)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11347624460661.81008311053190661436107043)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 68944915931.32004991941950530448472223832)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 322701221.6391432296123937035480931903651)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1092364.213992634267819050120261755371294)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2380.151399852411512711176940867823024864)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2.506628274631000502415765284811045253007)),
+      };
+      static const T denom[31] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.8841761993739701954543616e31)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.3502799997985980526649278464e32)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.622621928420356134910574592e32)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 66951000306085302338993639424000)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 49361465831621147825759587123200)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 26751280755793398822580822142976)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11139316913434780466101123891200)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3674201658710345201899117607040)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 981347603630155088295475765440)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 215760462268683520394805979744)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 39539238727270799376544542000)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6097272817323042122728617800)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 796974693974455191377937300)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 88776380550648116217781890)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 8459574446076318147830625)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 691254538651580660999025)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 48487623689430693038025)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2918939500751087661105)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 150566737512021319125)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6634460278534540725)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 248526574856284725)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 7860403394108265)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 207912996295875)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4539323721075)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 80328850875)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1122686019)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11921175)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 90335)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 435)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1)),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 31);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos31UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[31] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 30137154810677525966583148469478.52374216)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 28561746428637727032849890123131.36314653)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 13083250730789213354063781611435.74046294)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3857598154697777600846539129354.783647)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 822596651552555685068015316144.0952185852)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 135131964033213842052904200372.039133532)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 17787555889683709693655685146.19771358863)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1926639793777927562221423874.149673297196)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 174989113988888477076973808.6991839697774)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 13513425905835560387095425.01158383184045)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 896521313378762433091075.1446749283094845)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 51496223433749515758124.71524415105430686)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2575886794780078381228.37205955912263407)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 112677328855422964200.4155776009524490958)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4322545967487943330.625233358130724324796)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 145663957202380774.0362027607207590519723)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4314283729473470.686566233465428332496534)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 112246988185485.8877916434026906290603878)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2561143864972.040563435178307062626388193)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 51103611767.9626550674442537989885239605)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 887985348.0369447209508500133077232094491)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 13359172.3954672607019822025834072685839)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 172660.8841147568768783928167105965064459)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1897.370795407433013556725714874693719617)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 17.48383210090980598861217644749573257178)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1325705316732132940835251054350153028901)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.0008054605783673449641889260501816356090452)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.377001130700104515644336869896819162464e-5)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1276172868883867038813825443204454996531e-7)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2780651912081116274907381023821492811093e-10)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2928410648650955854121639682890739211234e-13)),
+      };
+      static const T denom[31] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.8841761993739701954543616e31)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.3502799997985980526649278464e32)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.622621928420356134910574592e32)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 66951000306085302338993639424000)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 49361465831621147825759587123200)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 26751280755793398822580822142976)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11139316913434780466101123891200)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3674201658710345201899117607040)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 981347603630155088295475765440)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 215760462268683520394805979744)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 39539238727270799376544542000)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6097272817323042122728617800)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 796974693974455191377937300)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 88776380550648116217781890)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 8459574446076318147830625)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 691254538651580660999025)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 48487623689430693038025)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2918939500751087661105)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 150566737512021319125)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6634460278534540725)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 248526574856284725)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 7860403394108265)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 207912996295875)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4539323721075)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 80328850875)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1122686019)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11921175)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 90335)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 435)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1)),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 31);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos31UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[30] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11.80038544942943603508206880307972596807)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -130.6355975335626214564236363322099481079)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 676.2177719145993049893392276809256538927)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2174.724497783850503069990936574060452057)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4869.877180638131076410069103742986502022)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -8065.744271864238179992762265472478229172)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 10245.03825618572106228191509520638651539)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -10212.83902362683215459850403668669647192)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 8110.289185383288952562767679576754140336)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -5179.310892558291062401828964000776095156)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2673.987492589052370230989109591011091273)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1118.342574651205183051884250033505609141)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 378.5812742511620662650096436471920295596)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -103.3725999812126067084828735543906768961)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 22.62913974335996321848099677797888917792)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -3.936414819950859548507275533569588041446)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.5376818198843817355682124535902641644854)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.0567827903603478957483409124122554243201)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.004545544993648879420352693271088478106482)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.0002689795568951033950042375135970897959935)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1139493459006846530734617710847103572122e-4)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.3316581197839213921885210451302820192794e-6)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.6285613334898374028443777562554713906213e-8)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.7222145115734409070310317999856424167091e-10)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.4562976983547274766890241815002584238219e-12)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.1380593023819058919640038942493212141072e-14)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.1629663871586410129307496385264268190679e-17)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.5429994291916548849493889660077076739993e-21)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2922682842441892106795386303084661338957e-25)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.8456967065309046044689041041336866118459e-31)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos31UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[30] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 147.9979641587472136175636384176549713358)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1638.404318611773924210055619836375434296)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 8480.981744216135641122944743711911653273)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -27274.93942104458448200467097634494071176)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 61076.98019918759324489193232276937262854)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -101158.8762737154296509560513952101409264)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 128491.1252383947174824913796141607174379)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -128087.2892038336581928787480535905496026)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 101717.5492545853663296795562084430123258)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -64957.8330410311808907869707511362206858)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 33536.59139229792478811870738772305570317)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -14026.01847115365926835980820243003785821)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4748.087094096186515212209389240715050212)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1296.477510211815971152205100242259733245)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 283.8099337545793198947620951499958085157)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -49.36969067101255103452092297769364837753)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6.743492833270653628580811118017061581404)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.7121578704864048548351804794951487823626)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.0570092738016915476694118877057948681298)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.003373485297696102660302960722607722438643)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.0001429128843527532859999752593761934089751)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.41595867130858508233493767243236888636e-5)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.7883284669307241040059778207492255409785e-7)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.905786322462384670803148223703187214379e-9)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.5722790216999820323272452464661250331451e-11)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.1731510870832349779315841757234562309727e-13)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.2043890314358438601429048378015983874378e-16)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.6810185176079344204740000170500311171065e-20)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.3665567641131713928114853776588342403919e-24)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.1060655106553177007425710511436497259484e-29)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 32.08066999999999779902282170951366424561; }
+};
+
+//
+// Lanczos Coefficients for N=61 G=63.192152
+// Max experimental error (with 1000-bit precision arithmetic) 3.740e-113
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 12 2006
+//
+struct lanczos61UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos61UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      using namespace boost;
+      static const T d[61] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2.50662827463100050241576528481104525300698674060993831662992357634229365460784197494659584)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 13349415823254323512107320481.3495396037261649201426994438803767191136434970492309775123879)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -300542621510568204264185787475.230003734889859348050696493467253861933279360152095861484548)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3273919938390136737194044982676.40271056035622723775417608127544182097346526115858803376474)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -22989594065095806099337396006399.5874206181563663855129141706748733174902067950115092492439)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 116970582893952893160414263796102.542775878583510989850142808618916073286745084692189044738)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -459561969036479455224850813196807.283291532483532558959779434457349912822256480548436066098)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1450959909778264914956547227964788.89797179379520834974601372820249784303794436366366810477)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -3782846865486775046285288437885921.41537699732805465141128848354901016102326190612528503251)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 8305043213936355459145388670886540.09976337905520168067329932809302445437208115570138102767)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -15580988484396722546934484726970745.4927787160273626078250810989811865283255762028143642311)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 25262722284076250779006793435537600.0822901485517345545978818780090308947301031347345640449)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -35714428027687018805443603728757116.5304655170478705341887572982734901197345415291580897698)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 44334726194692443174715432419157343.2294160783772787096321009453791271387235388689346602833)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -48599573547617297831555162417695106.187829304963846482633791012658974681648157963911491985)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 47258466493366798944386359199482189.0753349196625125615316002614813737880755896979754845101)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -40913448215392412059728312039233342.142914753896559359297977982314043378636755884088383226)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 31626312914486892948769164616982902.7262756989418188077611392594232674722318027323102462687)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -21878079174441332123064991795834438.4699982361692990285700077902601657354101259411789722708)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 13567268503974326527361474986354265.3136632133935430378937191911532112778452274286122946396)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -7551494211746723529747611556474669.62996644923557605747803028485900789337467673523741066527)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3775516572689476384052312341432597.70584966904950490541958869730702790312581801585742038997)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1696271471453637244930364711513292.79902955514107737992185368006225264329876265486853482449)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 684857608019352767999083000986166.20765273693720041519286231015176745354062413008561259139)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -248397566275708464679881624417990.410438107634139924805871051723444048539177890346227250473)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 80880368999557992138783568858556.1512378233079327986518410244522800950609595592170022878937)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -23618197945394013802495450485616.9025005749893350650829964098117490779655546610665927669729)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6176884636893816103087134481332.06708966653493024119556843727320635285468825056891248447124)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1444348683723439589948246285262.64080678953468490544615312565485170860503207005915261691108)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 301342031656979076702313946827.961658905182634508217626783081241074250132289461989777865387)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -55959656587719766738301589651.3940625826610668990368881615587469329021742236397809951765678)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 9223339169004064297247180402.36227016155682738556103138196079389248843082157924368301293963)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1344882881571942601385730283.42710150182526891377514071881534880944872423492272147871101373)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 172841913316760599352601139.54409257740173055624405575900164401527761357324625574736896079)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -19496120443876233531343952.3802212016691702737346568192063937387825469602063310488794471653)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1920907372583710284097959.44121420322495784420169085871802458519363819782779653621724219067)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -164429314798240461613359.399597503536657962383155875723527581699785846599051112719962464604)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 12154026644351189572525.1452249886865981747374191977801688548318519692423556934568426042152)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -770443988366210815096.519382051977221101156336663806705367929328924137169970381042234329058)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 41558909851418707920.4696085656889424895313728719601503526476333404973280596225722152966128)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1890879946549708819.24562220042687554209318172044783707920086716716717574156283898330017796)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 71844996557297623.9583461685535340440524052492427928388171299145330229958643439878608673403)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2253785109518255.55600197759875781765803818232939130127735487613049577235879610065545755637)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 57616883849355.997562563968344493719962252675875692642406455612671495250543228005045106721)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1182495730353.08218118278997948852215670614084013289033222774171548915344541249351599628436)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 19148649358.6196967288062261380599423925174178776792840639099120170800869284300966978300613)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -239779605.891370259668403359614360511661030470269478602533200704639655585967442891496784613)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2267583.00284368310957842936892685032434505866445291643236133553754152047677944820353796872)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -15749.490806784673108773558070497383604733010677027764233749920147549999361110299643477893)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 77.7059495149052727171505425584459982871343274332635726864135949842508025564999785370162956)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.261619987273930331397625130282851629108569607193781378836014468617185550622160348688297247)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.000572252321659691600529444769356185993188551770817110673186068921175991328434642504616377475)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.765167220661540041663007112207436426423746402583423562585653954743978584117929356523307954e-6)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.579179571056209077507916813937971472839851499147582627425979879366849876944438724610663401e-9)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.224804733043915149719206760378355636826808754704148660354494460792713189958510735070096991e-12)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.392711975389579343321746945135488409914483448652884894759297584020979857734289645857714768e-16)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.258603588346412049542768766878162221817684639789901440429511261589010049357907537684380983e-20)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.499992460848751668441190360024540741752242879565548017176883304716370989218399797418478685e-25)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.196211614533318174187346267877390498735734213905206562766348625767919122511096089367364025e-30)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.874722648949676363732094858062907290148733370978226751462386623191111439121706262759209573e-37)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.163907874717737848669759890242660846846105433791283903651924563157080252845636658802930428e-44)),
+      };
+      T result = d[0];
+      for(unsigned k = 1; k < sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += d[k]/(z+(k-1));
+      }
+      return result;
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos61UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      using namespace boost;
+      static const T d[61] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.901751806425638853077358552989167785490911341809902155556127108480303870921448984935411583e-27)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4.80241125306810017699523302110401965428995345115391817406006361151407344955277298373661032)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -108.119283021710869401330097315436214587270846871451487282117128515476478251641970487922552)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1177.78262074811362219818923738088833932279000985161077740440010901595132448469513438139561)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -8270.43570321334374279057432173814835581983913167617217749736484999327758232081395983082867)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 42079.807161997077661752306902088979258826568702655699995911391774839958572703348502730394)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -165326.003834443330215001219988296482004968548294447320869281647211603153902436231468280089)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 521978.361504895300685499370463597042533432134369277742485307843747923127933979566742421213)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1360867.51629992863544553419296636395576666570468519805449755596254912681418267100657262281)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2987713.73338656161102517003716335104823650191612448011720936412226357385029800040631754755)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -5605212.64915921452169919008770165304171481697939254152852673009005154549681704553438450709)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 9088186.58332916818449459635132673652700922052988327069535513580836143146727832380184335474)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -12848155.5543636394746355365819800465364996596310467415907815393346205151090486190421959769)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 15949281.2867656960575878805158849857756293807220033618942867694361569866468996967761600898)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -17483546.9948295433308250581770557182576171673272450149400973735206019559576269174369907171)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 17001087.8599749419660906448951424280111036786456594738278573653160553115681287326064596964)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -14718487.0643665950346574802384331125115747311674609017568623694516187494204567579595827859)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 11377468.7255609717716845971105161298889777425898291183866813269222281486121330837791392732)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -7870571.64253038587947746661946939286858490057774448573157856145556080330153403858747655263)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4880783.08440908743641723492059912671377140680710345996273343885045364205895751515063844239)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2716626.7992639625103140035635916455652302249897918893040695025407382316653674141983775542)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1358230.46602865696544327299659410214201327791319846880787515156343361311278133805428800255)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -610228.440751458395860905749312275043435828322076830117123636938979942213530882048883969802)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 246375.416501158654327780901087115642493055617468601787093268312234390446439555559050129729)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -89360.2599028475206119333931211015869139511677735549267100272095432140508089207221096740632)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 29096.4637987498328341260960356772198979319790332957125131055960448759586930781530063775634)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -8496.57401431514433694413130585404918350686834939156759654375188338156288564260152505382438)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2222.11523574301594407443285016240908726891841242444092960094015874546135316534057865883047)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -519.599993280949289705514822058693289933461756514489674453254304308040888101533569480646682)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 108.406868361306987817730701109400305482972790224573776407166683184990131682003417239181112)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -20.1313142142558596796857948064047373605439974799116521459977609253211918146595346493447238)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3.31806787671783168020012913552384112429614503798293169239082032849759155847394955909684383)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.483817477111537877685595212919784447924875428848331771524426361483392903320495411973587861)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.0621793463102927384924303843912913542297042029136293808338022462765755471002366206711862637)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.00701366932085103924241526535768453911099671087892444015581511551813219720807206445462785293)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.000691040514756294308758606917671220770856269030526647010461217455799229645004351524024364997)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.591529398871361458428147660822525365922497109038495896497692806150033516658042357799869656e-4)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.437237367535177689875119370170434437030440227275583289093139147244747901678407875809020739e-5)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.277164853397051135996651958345647824709602266382721185838782221179129726200661453504250697e-6)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.149506899012035980148891401548317536032574502641368034781671941165064546410613201579653674e-7)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.68023824066463262779882895193964639544061678698791279217407325790147925675797085217462974e-9)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.258460163734186329938721529982859244969655253624066115559707985878606277800329299821882688e-10)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.810792256024669306744649981276512583535251727474303382740940985102669076169168931092026491e-12)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.207274966207031327521921078048021807442500113231320959236850963529304158700096495799022922e-13)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.425399199286327802950259994834798737777721414442095221716122926637623478450472871269742436e-15)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.688866766744198529064607574117697940084548375790020728788313274612845280173338912495478431e-17)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.862599751805643281578607291655858333628582704771553874199104377131082877406179933909898885e-19)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.815756005678735657200275584442908437977926312650210429668619446123450972547018343768177988e-21)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.566583084099007858124915716926967268295318152203932871370429534546567151650626184750291695e-23)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.279544761599725082805446124351997692260093135930731230328454667675190245860598623539891708e-25)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.941169851584987983984201821679114408126982142904386301937192011680047611188837432096199601e-28)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.205866011331040736302780507155525142187875191518455173304638008169488993406425201915370746e-30)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.27526655245712584371295491216289353976964567057707464008951584303679019796521332324352501e-33)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.208358067979444305082929004102609366169534624348056112144990933897581971394396210379638792e-36)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.808728107661779323263133007119729988596844663194254976820030366188579170595441991680169012e-40)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.141276924383478964519776436955079978012672985961918248012931336621229652792338950573694356e-43)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.930318449287651389310440021745842417218125582685428432576258687100661462527604238849332053e-48)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.179870748819321661641184169834635133045197146966203370650788171790610563029431722308057539e-52)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.705865243912790337263229413370018392321238639017433365017168104310561824133229343750737083e-58)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.3146787805734405996448268100558028857930560442377698646099945108125281507396722995748398e-64)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.589653534231618730406843260601322236697428143603814281282790370329151249078338470962782338e-72)),
+      };
+      T result = d[0];
+      for(unsigned k = 1; k < sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += d[k]/(z+(k-1));
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos61UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      using namespace boost;
+      static const T d[60] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 23.2463658527729692390378860713647146932236940604550445351214987229819352880524561852919518)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -523.358012551815715084547614110229469295755088686612838322817729744722233637819564673967396)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 5701.12892340421080714956066268650092612647620400476183901625272640935853188559347587495571)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -40033.5506451901904954336453419007623117537868026994808919201793803506999271787018654246699)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 203689.884259074923009439144410340256983393397995558814367995938668111650624499963153485034)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -800270.648969745331278757692597096167418585957703057412758177038340791380011708874081291202)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 2526668.23380061659863999395867315313385499515711742092815402701950519696944982260718031476)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -6587362.57559198722630391278043503867973853468105110382293763174847657538179665571836023631)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 14462211.3454541602975917764900442754186801975533106565506542322063393991552960595701762805)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -27132375.1879227404375395522940895789625516798992585980380939378508607160857820002128106898)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 43991923.8735251977856804364757478459275087361742168436524951824945035673768875988985478116)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -62192284.0030124679010201921841372967696262036115679150017649233887633598058364494608060812)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 77203473.0770033513405070667417251568915937590689150831268228886281254637715669678358204991)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -84630180.2217173903516348977915150565994784278120192219937728967986198118628659866582594874)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 82294807.2253549409847505891112074804416229757832871133388349982640444405470371147991706317)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -71245738.2484649177928765605893043553453557808557887270209768163561363857395639001251515788)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 55073334.3180266913441333534260714059077572215147571872597651029894142803987981342430068594)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -38097984.1648990787690036742690550656061009857688125101191167768314179751258568264424911474)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 23625729.5032184580395130592017474282828236643586203914515183078852982915252442161768527976)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -13149998.4348054726172055622442157883429575511528431835657668083088902165366619827169829685)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 6574597.77221556423683199818131482663205682902023554728024972161230111356285973623550338976)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2953848.1483469149918109110050192571921018042012905892107136410603990336401921230407043408)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1192595.29584357246380113611351829515963605337523874715861849584306265512819543347806085356)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -432553.812019608638388918135375154289816441900572658692369491476137741687213006403648722272)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 140843.215385933866391177743292449477205328233960902455943995092958295858485718885800427129)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -41128.186992679630058614841985110676526199977321524879849001760603476646382839182691529968)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 10756.2849191854701631989789887757784944313743544315113894758328432005767448056040879337769)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2515.15559672041299884426826962296210458052543246529646213159169885444118227871246315458787)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 524.750087004805200600237632074908875763734578390662349666321453103782638818305404274166951)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -97.4468596421732493988298219295878130651986131393383646674144877163795143930682205035917965)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 16.0613108128210806736384551896802799172445298357754547684100294231532127326987175444453058)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2.34194813526540240672426202485306862230641838409943369059203455578340880900483887447559874)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.300982934748016059399829007219431333744032924923669397318820178988611410275964499475465815)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.033950095985367909789000959795708551814461844488183964432565731809399824963680858993718525)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.00334502394288921146242772614150438404658527112198421937945605441697314216921393987758378122)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.000286333429067523984607730553301991502191011265745476190940771685897687956262049750683013485)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.211647426149364947402896718485536530479491688838087899435991994237067890628274492042231115e-4)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.134163345121302758109675190598169832775248626443483098532368562186356128620805552609175683e-5)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.723697303042715085329782938306424498336642078597508935450663080894255773653328980495047891e-7)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.329273487343139063533251321553223583999676337945788660475231347828772272134656322947906888e-8)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.12510922551028971731767784013117088894558604838820475961392154031378891971216135267744134e-9)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.392468958215589939603666430583400537413757786057185505426804034745840192914621891690369903e-11)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.100332717101049934370760667782927946803279422001380028508200697081188326364078428184546051e-12)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.205917088291197705194762747639836655808855850989058813560983717575008725393428497910009756e-14)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.333450178247893143608439314203175490705783992567107481617660357577257627854979230819461489e-16)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.417546693906616047110563550428133589051498362676394888715581845170969319500638944065594319e-18)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.394871691642184410859178529844325390739857256666676534513661579365702353214518478078730801e-20)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.274258012587811199757875927548699264063511843669070634471054184977334027224611843434000922e-22)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.135315354265459854889496635967343027244391821142592599244505313738163473730636430399785048e-24)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.455579032003288910408487905303223613382276173706542364543918076752861628464036586507967767e-27)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.99650703862462739161520123768147312466695159780582506041370833824093136783202694548427718e-30)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.1332444609228706921659395801935919548447859029572115502899861345555006827214220195650058e-32)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.100856999148765307000182397631280249632761913433008379786888200467467364474581430670889392e-35)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.39146979455613683472384690509165395074425354524713697428673406058157887065953366609738731e-39)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.683859606707931248105140296850112494069265272540298100341919970496564103098283709868586478e-43)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.450326344248604222735147147805963966503893913752040066400766411031387063854141246972061792e-47)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.870675378039492904184581895322153006461319724931909799151743284769901586333730037761678891e-52)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.341678395249272265744518787745356400350877656459401143889000625280131819505857966769964401e-57)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.152322191370871666358069530949353871960316638394428595988162174042653299702098929238880862e-63)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.285425405297633795767452984791738825078111150078605004958179057245980222485147999495352632e-71)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos61UDT, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      using namespace boost;
+      static const T d[60] = {
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 557.56438192770795764344217888434355281097193198928944200046501607026919782564033547346298)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -12552.748616427645475141433405567201788681683808077269330800392600825597799119572762385222)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 136741.650054039199076788077149441364242294724343897779563222338447737802381279007988884806)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -960205.223613240309942047656967301131022760634321049075674684679438471862998829007639437133)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 4885504.47588736223774859617054275229642041717942140469884121916073195308537421162982679289)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -19194501.738192166918904824982935279260356575935661514109550613809352009246483412530545583)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 60602169.8633537742937457094837494059849674261357199218329545854990149896822944801504450843)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -157997975.522506767297528502540724511908584668874487506510120462561270100749019845014382885)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 346876323.86092543685419723290495817330608574729543216092477261152247521712190505658568876)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -650770365.471136883718747607976242475416651908858429752332176373467422603953536408709972919)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1055146856.05909309330903130910708372830487315684258450293308627289334336871273080305128138)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1491682726.25614447429071368736790697283307005456720192465860871846879804207692411263924608)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1851726287.94866167094858600116562210167031458934987154557042242638980748286188183300900268)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2029855953.68334371445800569238095379629407314338521720558391277508374519526853827142679839)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1973842002.53354868177824629525448788555435194808657489238517523691040148611221295436287925)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -1708829941.98209573247426625323314413060108441455314880934710595647408841619484540679859098)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 1320934627.12433688699625456833930317624783222321555050330381730035733198249283009357314954)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -913780636.858542526294419197161614811332299249415125108737474024007693329922089123296358727)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 566663423.929632170286007468016419798879660054391183200464733820209439185545886930103546787)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -315402880.436816230388857961460509181823167373029384218959199936902955049832392362044305869)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 157691811.550465734461741500275930418786875005567018699867961482249002625886064187146134966)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -70848085.5705405970640618473551954585013808128304384354476488268600720054598122945113512731)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 28604413.4050137708444142264980840059788755325900041515286382001704951527733220637586013815)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -10374808.7067303054787164054055989420809074792801592763124972441820101840292558840131568633)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 3378126.32016207486657791623723515804931231041318964254116390764473281291389374196880720069)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -986460.090390653140964189383080344920103075349535669020623874668558777188889544398718979744)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 257989.631187387317948158483575125380011593209850756066176921901006833159795100137743395985)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -60326.0391159227288325790327830741260824763549807922845004854215660451399733578621565837087)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 12586.1375399649496159880821645216260841794563919652590583420570326276086323953958907053394)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -2337.26417330316922535871922886167444795452055677161063205953141105726549966801856628447293)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 385.230745012608736644117458716226876976056390433401632749144285378123105481506733917763829)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -56.1716559403731491675970177460841997333796694857076749852739159067307309470690838101179615)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 7.21907953468550196348585224042498727840087634483369357697580053424523903859773769748599575)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.814293485887386870805786409956942772883474224091975496298369877683530509729332902182019049)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.0802304419995150047616460464220884371214157889148846405799324851793571580868840034085001373)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.00686771095380619535195996193943858680694970000948742557733102777115482017857981277171196115)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.000507636621977556438232617777542864427109623356049335590894564220687567763620803789858345916)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.32179095465362720747836116655088181481893063531138957363431280817392443948706754917605911e-4)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.173578890579848508947329833426585354230744194615295570820295052665075101971588563893718407e-5)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.789762880006288893888161070734302768702358633525134582027140158619195373770299678322596835e-7)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.300074637200885066788470310738617992259402710843493097610337134266720909870967550606601658e-8)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.941337297619721713151110244242536308266701344868601679868536153775533330272973088246835359e-10)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.24064815013182536657310186836079333949814111498828401548170442715552017773994482539471456e-11)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.493892399304811910466345686492277504628763169549384435563232052965821874553923373100791477e-13)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.799780678476644196901221989475355609743387528732994566453160178199295104357319723742820593e-15)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.100148627870893347527249092785257443532967736956154251497569191947184705954310833302770086e-16)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.947100256812658897084619699699028861352615460106539259289295071616221848196411749449858071e-19)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.657808193528898116367845405906343884364280888644748907819280236995018351085371701094007759e-21)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.324554050057463845012469010247790763753999056976705084126950591088538742509983426730851614e-23)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.10927068902162908990029309141242256163212535730975970310918370355165185052827948996110107e-25)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.239012340507870646690121104637467232366271566488184795459093215303237974655782634371712486e-28)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.31958700972990573259359660326375143524864710953063781494908314884519046349402409667329667e-31)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.241905641292988284384362036555782113275737930713192053073501265726048089991747342247551645e-34)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.93894080230619233745797029179332447129464915420290457418429337322820997038069119047864035e-38)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.164023814025085488413251990798690797467351995518990067783355251949198292596815470576539877e-41)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.108010831192689925518484618970761942019888832176355541674171850211917230280206410356465451e-45)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.208831600642796805563854019033577205240227465154130766898180386564934443551840379116390645e-50)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.819516067465171848863933747691434138146789031214932473898084756489529673230665363014007306e-56)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, 0.365344970579318347488211604761724311582675708113250505307342682118101409913523622073678179e-62)),
+         static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 150, -0.684593199208628857931267904308244537968349564351534581234005234847904343404822808648361291e-70)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 63.19215200000000010049916454590857028961181640625; }
+};
+
+}}} // namespaces
+
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/math/bindings/e_float.hpp b/gatb-core/thirdparty/boost/math/bindings/e_float.hpp
new file mode 100644
index 0000000..4068e35
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/e_float.hpp
@@ -0,0 +1,809 @@
+//  Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// Wrapper that works with mpfr_class defined in gmpfrxx.h
+// See http://math.berkeley.edu/~wilken/code/gmpfrxx/
+// Also requires the gmp and mpfr libraries.
+//
+
+#ifndef BOOST_MATH_E_FLOAT_BINDINGS_HPP
+#define BOOST_MATH_E_FLOAT_BINDINGS_HPP
+
+#include <boost/config.hpp>
+
+
+#include <e_float/e_float.h>
+#include <functions/functions.h>
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
+#include <boost/lexical_cast.hpp>
+
+
+namespace boost{ namespace math{ namespace ef{
+
+class e_float
+{
+public:
+   // Constructors:
+   e_float() {}
+   e_float(const ::e_float& c) : m_value(c){}
+   e_float(char c)
+   {
+      m_value = ::e_float(c);
+   }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   e_float(wchar_t c)
+   {
+      m_value = ::e_float(c);
+   }
+#endif
+   e_float(unsigned char c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(signed char c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(unsigned short c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(short c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(unsigned int c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(int c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(unsigned long c)
+   {
+      m_value = ::e_float((UINT64)c);
+   }
+   e_float(long c)
+   {
+      m_value = ::e_float((INT64)c);
+   }
+#ifdef BOOST_HAS_LONG_LONG
+   e_float(boost::ulong_long_type c)
+   {
+      m_value = ::e_float(c);
+   }
+   e_float(boost::long_long_type c)
+   {
+      m_value = ::e_float(c);
+   }
+#endif
+   e_float(float c)
+   {
+      assign_large_real(c);
+   }
+   e_float(double c)
+   {
+      assign_large_real(c);
+   }
+   e_float(long double c)
+   {
+      assign_large_real(c);
+   }
+
+   // Assignment:
+   e_float& operator=(char c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(unsigned char c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(signed char c) { m_value = ::e_float(c); return *this; }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   e_float& operator=(wchar_t c) { m_value = ::e_float(c); return *this; }
+#endif
+   e_float& operator=(short c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(unsigned short c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(int c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(unsigned int c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(long c) { m_value = ::e_float((INT64)c); return *this; }
+   e_float& operator=(unsigned long c) { m_value = ::e_float((UINT64)c); return *this; }
+#ifdef BOOST_HAS_LONG_LONG
+   e_float& operator=(boost::long_long_type c) { m_value = ::e_float(c); return *this; }
+   e_float& operator=(boost::ulong_long_type c) { m_value = ::e_float(c); return *this; }
+#endif
+   e_float& operator=(float c) { assign_large_real(c); return *this; }
+   e_float& operator=(double c) { assign_large_real(c); return *this; }
+   e_float& operator=(long double c) { assign_large_real(c); return *this; }
+
+   // Access:
+   ::e_float& value(){ return m_value; }
+   ::e_float const& value()const{ return m_value; }
+
+   // Member arithmetic:
+   e_float& operator+=(const e_float& other)
+   { m_value += other.value(); return *this; }
+   e_float& operator-=(const e_float& other)
+   { m_value -= other.value(); return *this; }
+   e_float& operator*=(const e_float& other)
+   { m_value *= other.value(); return *this; }
+   e_float& operator/=(const e_float& other)
+   { m_value /= other.value(); return *this; }
+   e_float operator-()const
+   { return -m_value; }
+   e_float const& operator+()const
+   { return *this; }
+
+private:
+   ::e_float m_value;
+
+   template <class V>
+   void assign_large_real(const V& a)
+   {
+      using std::frexp;
+      using std::ldexp;
+      using std::floor;
+      if (a == 0) {
+         m_value = ::ef::zero();
+         return;
+      }
+
+      if (a == 1) {
+         m_value = ::ef::one();
+         return;
+      }
+
+      if ((boost::math::isinf)(a))
+      {
+         m_value = a > 0 ? m_value.my_value_inf() : -m_value.my_value_inf();
+         return;
+      }
+      if((boost::math::isnan)(a))
+      {
+         m_value = m_value.my_value_nan();
+         return;
+      }
+
+      int e;
+      long double f, term;
+      ::e_float t;
+      m_value = ::ef::zero();
+
+      f = frexp(a, &e);
+
+      ::e_float shift = ::ef::pow2(30);
+
+      while(f)
+      {
+         // extract 30 bits from f:
+         f = ldexp(f, 30);
+         term = floor(f);
+         e -= 30;
+         m_value *= shift;
+         m_value += ::e_float(static_cast<INT64>(term));
+         f -= term;
+      }
+      m_value *= ::ef::pow2(e);
+   }
+};
+
+
+// Non-member arithmetic:
+inline e_float operator+(const e_float& a, const e_float& b)
+{
+   e_float result(a);
+   result += b;
+   return result;
+}
+inline e_float operator-(const e_float& a, const e_float& b)
+{
+   e_float result(a);
+   result -= b;
+   return result;
+}
+inline e_float operator*(const e_float& a, const e_float& b)
+{
+   e_float result(a);
+   result *= b;
+   return result;
+}
+inline e_float operator/(const e_float& a, const e_float& b)
+{
+   e_float result(a);
+   result /= b;
+   return result;
+}
+
+// Comparison:
+inline bool operator == (const e_float& a, const e_float& b)
+{ return a.value() == b.value() ? true : false; }
+inline bool operator != (const e_float& a, const e_float& b)
+{ return a.value() != b.value() ? true : false;}
+inline bool operator < (const e_float& a, const e_float& b)
+{ return a.value() < b.value() ? true : false; }
+inline bool operator <= (const e_float& a, const e_float& b)
+{ return a.value() <= b.value() ? true : false; }
+inline bool operator > (const e_float& a, const e_float& b)
+{ return a.value() > b.value() ? true : false; }
+inline bool operator >= (const e_float& a, const e_float& b)
+{ return a.value() >= b.value() ? true : false; }
+
+std::istream& operator >> (std::istream& is, e_float& f)
+{
+   return is >> f.value();
+}
+
+std::ostream& operator << (std::ostream& os, const e_float& f)
+{
+   return os << f.value();
+}
+
+inline e_float fabs(const e_float& v)
+{
+   return ::ef::fabs(v.value());
+}
+
+inline e_float abs(const e_float& v)
+{
+   return ::ef::fabs(v.value());
+}
+
+inline e_float floor(const e_float& v)
+{
+   return ::ef::floor(v.value());
+}
+
+inline e_float ceil(const e_float& v)
+{
+   return ::ef::ceil(v.value());
+}
+
+inline e_float pow(const e_float& v, const e_float& w)
+{
+   return ::ef::pow(v.value(), w.value());
+}
+
+inline e_float pow(const e_float& v, int i)
+{
+   return ::ef::pow(v.value(), ::e_float(i));
+}
+
+inline e_float exp(const e_float& v)
+{
+   return ::ef::exp(v.value());
+}
+
+inline e_float log(const e_float& v)
+{
+   return ::ef::log(v.value());
+}
+
+inline e_float sqrt(const e_float& v)
+{
+   return ::ef::sqrt(v.value());
+}
+
+inline e_float sin(const e_float& v)
+{
+   return ::ef::sin(v.value());
+}
+
+inline e_float cos(const e_float& v)
+{
+   return ::ef::cos(v.value());
+}
+
+inline e_float tan(const e_float& v)
+{
+   return ::ef::tan(v.value());
+}
+
+inline e_float acos(const e_float& v)
+{
+   return ::ef::acos(v.value());
+}
+
+inline e_float asin(const e_float& v)
+{
+   return ::ef::asin(v.value());
+}
+
+inline e_float atan(const e_float& v)
+{
+   return ::ef::atan(v.value());
+}
+
+inline e_float atan2(const e_float& v, const e_float& u)
+{
+   return ::ef::atan2(v.value(), u.value());
+}
+
+inline e_float ldexp(const e_float& v, int e)
+{
+   return v.value() * ::ef::pow2(e);
+}
+
+inline e_float frexp(const e_float& v, int* expon)
+{
+   double d;
+   INT64 i;
+   v.value().extract_parts(d, i);
+   *expon = static_cast<int>(i);
+   return v.value() * ::ef::pow2(-i);
+}
+
+inline e_float sinh (const e_float& x)
+{
+   return ::ef::sinh(x.value());
+}
+
+inline e_float cosh (const e_float& x)
+{
+   return ::ef::cosh(x.value());
+}
+
+inline e_float tanh (const e_float& x)
+{
+   return ::ef::tanh(x.value());
+}
+
+inline e_float asinh (const e_float& x)
+{
+   return ::ef::asinh(x.value());
+}
+
+inline e_float acosh (const e_float& x)
+{
+   return ::ef::acosh(x.value());
+}
+
+inline e_float atanh (const e_float& x)
+{
+   return ::ef::atanh(x.value());
+}
+
+e_float fmod(const e_float& v1, const e_float& v2)
+{
+   e_float n;
+   if(v1 < 0)
+      n = ceil(v1 / v2);
+   else
+      n = floor(v1 / v2);
+   return v1 - n * v2;
+}
+
+} namespace detail{
+
+template <>
+inline int fpclassify_imp< boost::math::ef::e_float> BOOST_NO_MACRO_EXPAND(boost::math::ef::e_float x, const generic_tag<true>&)
+{
+   if(x.value().isnan())
+      return FP_NAN;
+   if(x.value().isinf())
+      return FP_INFINITE;
+   if(x == 0)
+      return FP_ZERO;
+   return FP_NORMAL;
+}
+
+} namespace ef{
+
+template <class Policy>
+inline int itrunc(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::trunc(v, pol);
+   if(fabs(r) > (std::numeric_limits<int>::max)())
+      return static_cast<int>(policies::raise_rounding_error("boost::math::itrunc<%1%>(%1%)", 0, 0, v, pol));
+   return static_cast<int>(r.value().extract_int64());
+}
+
+template <class Policy>
+inline long ltrunc(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::trunc(v, pol);
+   if(fabs(r) > (std::numeric_limits<long>::max)())
+      return static_cast<long>(policies::raise_rounding_error("boost::math::ltrunc<%1%>(%1%)", 0, 0L, v, pol));
+   return static_cast<long>(r.value().extract_int64());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline boost::long_long_type lltrunc(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::trunc(v, pol);
+   if(fabs(r) > (std::numeric_limits<boost::long_long_type>::max)())
+      return static_cast<boost::long_long_type>(policies::raise_rounding_error("boost::math::lltrunc<%1%>(%1%)", 0, v, 0LL, pol).value().extract_int64());
+   return static_cast<boost::long_long_type>(r.value().extract_int64());
+}
+#endif
+
+template <class Policy>
+inline int iround(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::round(v, pol);
+   if(fabs(r) > (std::numeric_limits<int>::max)())
+      return static_cast<int>(policies::raise_rounding_error("boost::math::iround<%1%>(%1%)", 0, v, 0, pol).value().extract_int64());
+   return static_cast<int>(r.value().extract_int64());
+}
+
+template <class Policy>
+inline long lround(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::round(v, pol);
+   if(fabs(r) > (std::numeric_limits<long>::max)())
+      return static_cast<long int>(policies::raise_rounding_error("boost::math::lround<%1%>(%1%)", 0, v, 0L, pol).value().extract_int64());
+   return static_cast<long int>(r.value().extract_int64());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline boost::long_long_type llround(const e_float& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   e_float r = boost::math::round(v, pol);
+   if(fabs(r) > (std::numeric_limits<boost::long_long_type>::max)())
+      return static_cast<boost::long_long_type>(policies::raise_rounding_error("boost::math::llround<%1%>(%1%)", 0, v, 0LL, pol).value().extract_int64());
+   return static_cast<boost::long_long_type>(r.value().extract_int64());
+}
+#endif
+
+}}}
+
+namespace std{
+
+   template<>
+   class numeric_limits< ::boost::math::ef::e_float> : public numeric_limits< ::e_float>
+   {
+   public:
+      static const ::boost::math::ef::e_float (min) (void)
+      {
+         return (numeric_limits< ::e_float>::min)();
+      }
+      static const ::boost::math::ef::e_float (max) (void)
+      {
+         return (numeric_limits< ::e_float>::max)();
+      }
+      static const ::boost::math::ef::e_float epsilon (void)
+      {
+         return (numeric_limits< ::e_float>::epsilon)();
+      }
+      static const ::boost::math::ef::e_float round_error(void)
+      {
+         return (numeric_limits< ::e_float>::round_error)();
+      }
+      static const ::boost::math::ef::e_float infinity (void)
+      {
+         return (numeric_limits< ::e_float>::infinity)();
+      }
+      static const ::boost::math::ef::e_float quiet_NaN (void)
+      {
+         return (numeric_limits< ::e_float>::quiet_NaN)();
+      }
+      //
+      // e_float's supplied digits member is wrong 
+      // - it should be same the same as digits 10
+      // - given that radix is 10.
+      //
+      static const int digits = digits10;
+   };
+
+} // namespace std
+
+namespace boost{ namespace math{
+
+namespace policies{
+
+template <class Policy>
+struct precision< ::boost::math::ef::e_float, Policy>
+{
+   typedef typename Policy::precision_type precision_type;
+   typedef digits2<((::std::numeric_limits< ::boost::math::ef::e_float>::digits10 + 1) * 1000L) / 301L> digits_2;
+   typedef typename mpl::if_c<
+      ((digits_2::value <= precision_type::value) 
+      || (Policy::precision_type::value <= 0)),
+      // Default case, full precision for RealType:
+      digits_2,
+      // User customised precision:
+      precision_type
+   >::type type;
+};
+
+}
+
+namespace tools{
+
+template <>
+inline int digits< ::boost::math::ef::e_float>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC( ::boost::math::ef::e_float))
+{
+   return ((::std::numeric_limits< ::boost::math::ef::e_float>::digits10 + 1) * 1000L) / 301L;
+}
+
+template <>
+inline  ::boost::math::ef::e_float root_epsilon< ::boost::math::ef::e_float>()
+{
+   return detail::root_epsilon_imp(static_cast< ::boost::math::ef::e_float const*>(0), mpl::int_<0>());
+}
+
+template <>
+inline  ::boost::math::ef::e_float forth_root_epsilon< ::boost::math::ef::e_float>()
+{
+   return detail::forth_root_epsilon_imp(static_cast< ::boost::math::ef::e_float const*>(0), mpl::int_<0>());
+}
+
+}
+
+namespace lanczos{
+
+template<class Policy>
+struct lanczos<boost::math::ef::e_float, Policy>
+{
+   typedef typename mpl::if_c<
+      std::numeric_limits< ::e_float>::digits10 < 22,
+      lanczos13UDT,
+      typename mpl::if_c<
+         std::numeric_limits< ::e_float>::digits10 < 36,
+         lanczos22UDT,
+         typename mpl::if_c<
+            std::numeric_limits< ::e_float>::digits10 < 50,
+            lanczos31UDT,
+            typename mpl::if_c<
+               std::numeric_limits< ::e_float>::digits10 < 110,
+               lanczos61UDT,
+               undefined_lanczos
+            >::type
+         >::type
+      >::type
+   >::type type;
+};
+
+} // namespace lanczos
+
+template <class Policy>
+inline boost::math::ef::e_float skewness(const extreme_value_distribution<boost::math::ef::e_float, Policy>& /*dist*/)
+{
+   //
+   // This is 12 * sqrt(6) * zeta(3) / pi^3:
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   //
+   return boost::lexical_cast<boost::math::ef::e_float>("1.1395470994046486574927930193898461120875997958366");
+}
+
+template <class Policy>
+inline boost::math::ef::e_float skewness(const rayleigh_distribution<boost::math::ef::e_float, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<boost::math::ef::e_float>("0.63111065781893713819189935154422777984404221106391");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 2 * root_pi<RealType>() * pi_minus_three<RealType>() / pow23_four_minus_pi<RealType>();
+}
+
+template <class Policy>
+inline boost::math::ef::e_float kurtosis(const rayleigh_distribution<boost::math::ef::e_float, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<boost::math::ef::e_float>("3.2450893006876380628486604106197544154170667057995");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 3 - (6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  // (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+}
+
+template <class Policy>
+inline boost::math::ef::e_float kurtosis_excess(const rayleigh_distribution<boost::math::ef::e_float, Policy>& /*dist*/)
+{
+  //using namespace boost::math::constants;
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  return boost::lexical_cast<boost::math::ef::e_float>("0.2450893006876380628486604106197544154170667057995");
+  // return -(6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  //   (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+} // kurtosis
+
+namespace detail{
+
+//
+// Version of Digamma accurate to ~100 decimal digits.
+//
+template <class Policy>
+boost::math::ef::e_float digamma_imp(boost::math::ef::e_float x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // eboost::math::ef::e_floator handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   boost::math::ef::e_float result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      boost::math::ef::e_float remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<boost::math::ef::e_float>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<boost::math::ef::e_float>() / tan(constants::pi<boost::math::ef::e_float>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+boost::math::ef::e_float bessel_i0(boost::math::ef::e_float x)
+{
+    static const boost::math::ef::e_float P1[] = {
+        boost::lexical_cast<boost::math::ef::e_float>("-2.2335582639474375249e+15"),
+        boost::lexical_cast<boost::math::ef::e_float>("-5.5050369673018427753e+14"),
+        boost::lexical_cast<boost::math::ef::e_float>("-3.2940087627407749166e+13"),
+        boost::lexical_cast<boost::math::ef::e_float>("-8.4925101247114157499e+11"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.1912746104985237192e+10"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.0313066708737980747e+08"),
+        boost::lexical_cast<boost::math::ef::e_float>("-5.9545626019847898221e+05"),
+        boost::lexical_cast<boost::math::ef::e_float>("-2.4125195876041896775e+03"),
+        boost::lexical_cast<boost::math::ef::e_float>("-7.0935347449210549190e+00"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.5453977791786851041e-02"),
+        boost::lexical_cast<boost::math::ef::e_float>("-2.5172644670688975051e-05"),
+        boost::lexical_cast<boost::math::ef::e_float>("-3.0517226450451067446e-08"),
+        boost::lexical_cast<boost::math::ef::e_float>("-2.6843448573468483278e-11"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.5982226675653184646e-14"),
+        boost::lexical_cast<boost::math::ef::e_float>("-5.2487866627945699800e-18"),
+    };
+    static const boost::math::ef::e_float Q1[] = {
+        boost::lexical_cast<boost::math::ef::e_float>("-2.2335582639474375245e+15"),
+        boost::lexical_cast<boost::math::ef::e_float>("7.8858692566751002988e+12"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.2207067397808979846e+10"),
+        boost::lexical_cast<boost::math::ef::e_float>("1.0377081058062166144e+07"),
+        boost::lexical_cast<boost::math::ef::e_float>("-4.8527560179962773045e+03"),
+        boost::lexical_cast<boost::math::ef::e_float>("1.0"),
+    };
+    static const boost::math::ef::e_float P2[] = {
+        boost::lexical_cast<boost::math::ef::e_float>("-2.2210262233306573296e-04"),
+        boost::lexical_cast<boost::math::ef::e_float>("1.3067392038106924055e-02"),
+        boost::lexical_cast<boost::math::ef::e_float>("-4.4700805721174453923e-01"),
+        boost::lexical_cast<boost::math::ef::e_float>("5.5674518371240761397e+00"),
+        boost::lexical_cast<boost::math::ef::e_float>("-2.3517945679239481621e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("3.1611322818701131207e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("-9.6090021968656180000e+00"),
+    };
+    static const boost::math::ef::e_float Q2[] = {
+        boost::lexical_cast<boost::math::ef::e_float>("-5.5194330231005480228e-04"),
+        boost::lexical_cast<boost::math::ef::e_float>("3.2547697594819615062e-02"),
+        boost::lexical_cast<boost::math::ef::e_float>("-1.1151759188741312645e+00"),
+        boost::lexical_cast<boost::math::ef::e_float>("1.3982595353892851542e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("-6.0228002066743340583e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("8.5539563258012929600e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("-3.1446690275135491500e+01"),
+        boost::lexical_cast<boost::math::ef::e_float>("1.0"),
+    };
+    boost::math::ef::e_float value, factor, r;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (x < 0)
+    {
+        x = -x;                         // even function
+    }
+    if (x == 0)
+    {
+        return static_cast<boost::math::ef::e_float>(1);
+    }
+    if (x <= 15)                        // x in (0, 15]
+    {
+        boost::math::ef::e_float y = x * x;
+        value = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+    }
+    else                                // x in (15, \infty)
+    {
+        boost::math::ef::e_float y = 1 / x - boost::math::ef::e_float(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+boost::math::ef::e_float bessel_i1(boost::math::ef::e_float x)
+{
+    static const boost::math::ef::e_float P1[] = {
+        lexical_cast<boost::math::ef::e_float>("-1.4577180278143463643e+15"),
+        lexical_cast<boost::math::ef::e_float>("-1.7732037840791591320e+14"),
+        lexical_cast<boost::math::ef::e_float>("-6.9876779648010090070e+12"),
+        lexical_cast<boost::math::ef::e_float>("-1.3357437682275493024e+11"),
+        lexical_cast<boost::math::ef::e_float>("-1.4828267606612366099e+09"),
+        lexical_cast<boost::math::ef::e_float>("-1.0588550724769347106e+07"),
+        lexical_cast<boost::math::ef::e_float>("-5.1894091982308017540e+04"),
+        lexical_cast<boost::math::ef::e_float>("-1.8225946631657315931e+02"),
+        lexical_cast<boost::math::ef::e_float>("-4.7207090827310162436e-01"),
+        lexical_cast<boost::math::ef::e_float>("-9.1746443287817501309e-04"),
+        lexical_cast<boost::math::ef::e_float>("-1.3466829827635152875e-06"),
+        lexical_cast<boost::math::ef::e_float>("-1.4831904935994647675e-09"),
+        lexical_cast<boost::math::ef::e_float>("-1.1928788903603238754e-12"),
+        lexical_cast<boost::math::ef::e_float>("-6.5245515583151902910e-16"),
+        lexical_cast<boost::math::ef::e_float>("-1.9705291802535139930e-19"),
+    };
+    static const boost::math::ef::e_float Q1[] = {
+        lexical_cast<boost::math::ef::e_float>("-2.9154360556286927285e+15"),
+        lexical_cast<boost::math::ef::e_float>("9.7887501377547640438e+12"),
+        lexical_cast<boost::math::ef::e_float>("-1.4386907088588283434e+10"),
+        lexical_cast<boost::math::ef::e_float>("1.1594225856856884006e+07"),
+        lexical_cast<boost::math::ef::e_float>("-5.1326864679904189920e+03"),
+        lexical_cast<boost::math::ef::e_float>("1.0"),
+    };
+    static const boost::math::ef::e_float P2[] = {
+        lexical_cast<boost::math::ef::e_float>("1.4582087408985668208e-05"),
+        lexical_cast<boost::math::ef::e_float>("-8.9359825138577646443e-04"),
+        lexical_cast<boost::math::ef::e_float>("2.9204895411257790122e-02"),
+        lexical_cast<boost::math::ef::e_float>("-3.4198728018058047439e-01"),
+        lexical_cast<boost::math::ef::e_float>("1.3960118277609544334e+00"),
+        lexical_cast<boost::math::ef::e_float>("-1.9746376087200685843e+00"),
+        lexical_cast<boost::math::ef::e_float>("8.5591872901933459000e-01"),
+        lexical_cast<boost::math::ef::e_float>("-6.0437159056137599999e-02"),
+    };
+    static const boost::math::ef::e_float Q2[] = {
+        lexical_cast<boost::math::ef::e_float>("3.7510433111922824643e-05"),
+        lexical_cast<boost::math::ef::e_float>("-2.2835624489492512649e-03"),
+        lexical_cast<boost::math::ef::e_float>("7.4212010813186530069e-02"),
+        lexical_cast<boost::math::ef::e_float>("-8.5017476463217924408e-01"),
+        lexical_cast<boost::math::ef::e_float>("3.2593714889036996297e+00"),
+        lexical_cast<boost::math::ef::e_float>("-3.8806586721556593450e+00"),
+        lexical_cast<boost::math::ef::e_float>("1.0"),
+    };
+    boost::math::ef::e_float value, factor, r, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<boost::math::ef::e_float>(0);
+    }
+    if (w <= 15)                        // w in (0, 15]
+    {
+        boost::math::ef::e_float y = x * x;
+        r = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        factor = w;
+        value = factor * r;
+    }
+    else                                // w in (15, \infty)
+    {
+        boost::math::ef::e_float y = 1 / w - boost::math::ef::e_float(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(w) / sqrt(w);
+        value = factor * r;
+    }
+
+    if (x < 0)
+    {
+        value *= -value;                 // odd function
+    }
+    return value;
+}
+
+} // namespace detail
+
+}}
+#endif // BOOST_MATH_E_FLOAT_BINDINGS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/bindings/mpfr.hpp b/gatb-core/thirdparty/boost/math/bindings/mpfr.hpp
new file mode 100644
index 0000000..5edc0ae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/mpfr.hpp
@@ -0,0 +1,954 @@
+//  Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// Wrapper that works with mpfr_class defined in gmpfrxx.h
+// See http://math.berkeley.edu/~wilken/code/gmpfrxx/
+// Also requires the gmp and mpfr libraries.
+//
+
+#ifndef BOOST_MATH_MPLFR_BINDINGS_HPP
+#define BOOST_MATH_MPLFR_BINDINGS_HPP
+
+#include <boost/config.hpp>
+#include <boost/lexical_cast.hpp>
+
+#ifdef BOOST_MSVC
+//
+// We get a lot of warnings from the gmp, mpfr and gmpfrxx headers, 
+// disable them here, so we only see warnings from *our* code:
+//
+#pragma warning(push)
+#pragma warning(disable: 4127 4800 4512)
+#endif
+
+#include <gmpfrxx.h>
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
+#include <boost/math/tools/big_constant.hpp>
+
+inline mpfr_class fabs(const mpfr_class& v)
+{
+   return abs(v);
+}
+template <class T, class U>
+inline mpfr_class fabs(const __gmp_expr<T,U>& v)
+{
+   return abs(static_cast<mpfr_class>(v));
+}
+
+inline mpfr_class pow(const mpfr_class& b, const mpfr_class& e)
+{
+   mpfr_class result;
+   mpfr_pow(result.__get_mp(), b.__get_mp(), e.__get_mp(), GMP_RNDN);
+   return result;
+}
+/*
+template <class T, class U, class V, class W>
+inline mpfr_class pow(const __gmp_expr<T,U>& b, const __gmp_expr<V,W>& e)
+{
+   return pow(static_cast<mpfr_class>(b), static_cast<mpfr_class>(e));
+}
+*/
+inline mpfr_class ldexp(const mpfr_class& v, int e)
+{
+   //int e = mpfr_get_exp(*v.__get_mp());
+   mpfr_class result(v);
+   mpfr_set_exp(result.__get_mp(), e);
+   return result;
+}
+template <class T, class U>
+inline mpfr_class ldexp(const __gmp_expr<T,U>& v, int e)
+{
+   return ldexp(static_cast<mpfr_class>(v), e);
+}
+
+inline mpfr_class frexp(const mpfr_class& v, int* expon)
+{
+   int e = mpfr_get_exp(v.__get_mp());
+   mpfr_class result(v);
+   mpfr_set_exp(result.__get_mp(), 0);
+   *expon = e;
+   return result;
+}
+template <class T, class U>
+inline mpfr_class frexp(const __gmp_expr<T,U>& v, int* expon)
+{
+   return frexp(static_cast<mpfr_class>(v), expon);
+}
+
+inline mpfr_class fmod(const mpfr_class& v1, const mpfr_class& v2)
+{
+   mpfr_class n;
+   if(v1 < 0)
+      n = ceil(v1 / v2);
+   else
+      n = floor(v1 / v2);
+   return v1 - n * v2;
+}
+template <class T, class U, class V, class W>
+inline mpfr_class fmod(const __gmp_expr<T,U>& v1, const __gmp_expr<V,W>& v2)
+{
+   return fmod(static_cast<mpfr_class>(v1), static_cast<mpfr_class>(v2));
+}
+
+template <class Policy>
+inline mpfr_class modf(const mpfr_class& v, long long* ipart, const Policy& pol)
+{
+   *ipart = lltrunc(v, pol);
+   return v - boost::math::tools::real_cast<mpfr_class>(*ipart);
+}
+template <class T, class U, class Policy>
+inline mpfr_class modf(const __gmp_expr<T,U>& v, long long* ipart, const Policy& pol)
+{
+   return modf(static_cast<mpfr_class>(v), ipart, pol);
+}
+
+template <class Policy>
+inline int iround(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<int>(boost::math::round(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline int iround(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return iround(static_cast<mpfr_class>(x), pol);
+}
+
+template <class Policy>
+inline long lround(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<long>(boost::math::round(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline long lround(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return lround(static_cast<mpfr_class>(x), pol);
+}
+
+template <class Policy>
+inline long long llround(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::round(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline long long llround(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return llround(static_cast<mpfr_class>(x), pol);
+}
+
+template <class Policy>
+inline int itrunc(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<int>(boost::math::trunc(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline int itrunc(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return itrunc(static_cast<mpfr_class>(x), pol);
+}
+
+template <class Policy>
+inline long ltrunc(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<long>(boost::math::trunc(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline long ltrunc(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return ltrunc(static_cast<mpfr_class>(x), pol);
+}
+
+template <class Policy>
+inline long long lltrunc(mpfr_class const& x, const Policy&)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::trunc(x, typename boost::math::policies::normalise<Policy, boost::math::policies::rounding_error< boost::math::policies::throw_on_error> >::type()));
+}
+template <class T, class U, class Policy>
+inline long long lltrunc(__gmp_expr<T,U> const& x, const Policy& pol)
+{
+   return lltrunc(static_cast<mpfr_class>(x), pol);
+}
+
+namespace boost{ 
+
+#ifdef BOOST_MATH_USE_FLOAT128
+   template<> struct is_convertible<BOOST_MATH_FLOAT128_TYPE, mpfr_class> : public boost::integral_constant<bool, false>{};
+#endif
+   template<> struct is_convertible<long long, mpfr_class> : public boost::integral_constant<bool, false>{};
+
+namespace math{
+
+#if defined(__GNUC__) && (__GNUC__ < 4)
+   using ::iround;
+   using ::lround;
+   using ::llround;
+   using ::itrunc;
+   using ::ltrunc;
+   using ::lltrunc;
+   using ::modf;
+#endif
+
+namespace lanczos{
+
+struct mpfr_lanczos
+{
+   static mpfr_class lanczos_sum(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum(z);
+   }
+   static mpfr_class lanczos_sum_expG_scaled(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_expG_scaled(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_expG_scaled(z);
+   }
+   static mpfr_class lanczos_sum_near_1(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_1(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_1(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_1(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_1(z);
+   }
+   static mpfr_class lanczos_sum_near_2(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_2(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_2(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_2(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_2(z);
+   }
+   static mpfr_class g()
+   { 
+      unsigned long p = mpfr_class::get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::g();
+      else if(p <= 120)
+         return lanczos22UDT::g();
+      else if(p <= 170)
+         return lanczos31UDT::g();
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::g();
+   }
+};
+
+template<class Policy>
+struct lanczos<mpfr_class, Policy>
+{
+   typedef mpfr_lanczos type;
+};
+
+} // namespace lanczos
+
+namespace constants{
+
+template <class Real, class Policy>
+struct construction_traits;
+
+template <class Policy>
+struct construction_traits<mpfr_class, Policy>
+{
+   typedef mpl::int_<0> type;
+};
+
+}
+
+namespace tools
+{
+
+template <class T, class U>
+struct promote_arg<__gmp_expr<T,U> >
+{ // If T is integral type, then promote to double.
+  typedef mpfr_class type;
+};
+
+template<>
+inline int digits<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   return mpfr_class::get_dprec();
+}
+
+namespace detail{
+
+template<class I>
+void convert_to_long_result(mpfr_class const& r, I& result)
+{
+   result = 0;
+   I last_result(0);
+   mpfr_class t(r);
+   double term;
+   do
+   {
+      term = real_cast<double>(t);
+      last_result = result;
+      result += static_cast<I>(term);
+      t -= term;
+   }while(result != last_result);
+}
+
+}
+
+template <>
+inline mpfr_class real_cast<mpfr_class, long long>(long long t)
+{
+   mpfr_class result;
+   int expon = 0;
+   int sign = 1;
+   if(t < 0)
+   {
+      sign = -1;
+      t = -t;
+   }
+   while(t)
+   {
+      result += ldexp((double)(t & 0xffffL), expon);
+      expon += 32;
+      t >>= 32;
+   }
+   return result * sign;
+}
+template <>
+inline unsigned real_cast<unsigned, mpfr_class>(mpfr_class t)
+{
+   return t.get_ui();
+}
+template <>
+inline int real_cast<int, mpfr_class>(mpfr_class t)
+{
+   return t.get_si();
+}
+template <>
+inline double real_cast<double, mpfr_class>(mpfr_class t)
+{
+   return t.get_d();
+}
+template <>
+inline float real_cast<float, mpfr_class>(mpfr_class t)
+{
+   return static_cast<float>(t.get_d());
+}
+template <>
+inline long real_cast<long, mpfr_class>(mpfr_class t)
+{
+   long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+template <>
+inline long long real_cast<long long, mpfr_class>(mpfr_class t)
+{
+   long long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+
+template <>
+inline mpfr_class max_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val;
+   if(!has_init)
+   {
+      val = 0.5;
+      mpfr_set_exp(val.__get_mp(), mpfr_get_emax());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class min_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val;
+   if(!has_init)
+   {
+      val = 0.5;
+      mpfr_set_exp(val.__get_mp(), mpfr_get_emin());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class log_max_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val = max_value<mpfr_class>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class log_min_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val = max_value<mpfr_class>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class epsilon<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   return ldexp(mpfr_class(1), 1-boost::math::policies::digits<mpfr_class, boost::math::policies::policy<> >());
+}
+
+} // namespace tools
+
+namespace policies{
+
+template <class T, class U, class Policy>
+struct evaluation<__gmp_expr<T, U>, Policy>
+{
+   typedef mpfr_class type;
+};
+
+}
+
+template <class Policy>
+inline mpfr_class skewness(const extreme_value_distribution<mpfr_class, Policy>& /*dist*/)
+{
+   //
+   // This is 12 * sqrt(6) * zeta(3) / pi^3:
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   //
+   return boost::lexical_cast<mpfr_class>("1.1395470994046486574927930193898461120875997958366");
+}
+
+template <class Policy>
+inline mpfr_class skewness(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr_class>("0.63111065781893713819189935154422777984404221106391");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 2 * root_pi<RealType>() * pi_minus_three<RealType>() / pow23_four_minus_pi<RealType>();
+}
+
+template <class Policy>
+inline mpfr_class kurtosis(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr_class>("3.2450893006876380628486604106197544154170667057995");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 3 - (6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  // (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+}
+
+template <class Policy>
+inline mpfr_class kurtosis_excess(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  //using namespace boost::math::constants;
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  return boost::lexical_cast<mpfr_class>("0.2450893006876380628486604106197544154170667057995");
+  // return -(6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  //   (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+} // kurtosis
+
+namespace detail{
+
+//
+// Version of Digamma accurate to ~100 decimal digits.
+//
+template <class Policy>
+mpfr_class digamma_imp(mpfr_class x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // empfr_classor handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   mpfr_class result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      mpfr_class remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<mpfr_class>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<mpfr_class>() / tan(constants::pi<mpfr_class>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+//
+// Specialisations of this function provides the initial
+// starting guess for Halley iteration:
+//
+template <class Policy>
+inline mpfr_class erf_inv_imp(const mpfr_class& p, const mpfr_class& q, const Policy&, const boost::mpl::int_<64>*)
+{
+   BOOST_MATH_STD_USING // for ADL of std names.
+
+   mpfr_class result = 0;
+   
+   if(p <= 0.5)
+   {
+      //
+      // Evaluate inverse erf using the rational approximation:
+      //
+      // x = p(p+10)(Y+R(p))
+      //
+      // Where Y is a constant, and R(p) is optimised for a low
+      // absolute empfr_classor compared to |Y|.
+      //
+      // double: Max empfr_classor found: 2.001849e-18
+      // long double: Max empfr_classor found: 1.017064e-20
+      // Maximum Deviation Found (actual empfr_classor term at infinite precision) 8.030e-21
+      //
+      static const float Y = 0.0891314744949340820313f;
+      static const mpfr_class P[] = {    
+         -0.000508781949658280665617,
+         -0.00836874819741736770379,
+         0.0334806625409744615033,
+         -0.0126926147662974029034,
+         -0.0365637971411762664006,
+         0.0219878681111168899165,
+         0.00822687874676915743155,
+         -0.00538772965071242932965
+      };
+      static const mpfr_class Q[] = {    
+         1,
+         -0.970005043303290640362,
+         -1.56574558234175846809,
+         1.56221558398423026363,
+         0.662328840472002992063,
+         -0.71228902341542847553,
+         -0.0527396382340099713954,
+         0.0795283687341571680018,
+         -0.00233393759374190016776,
+         0.000886216390456424707504
+      };
+      mpfr_class g = p * (p + 10);
+      mpfr_class r = tools::evaluate_polynomial(P, p) / tools::evaluate_polynomial(Q, p);
+      result = g * Y + g * r;
+   }
+   else if(q >= 0.25)
+   {
+      //
+      // Rational approximation for 0.5 > q >= 0.25
+      //
+      // x = sqrt(-2*log(q)) / (Y + R(q))
+      //
+      // Where Y is a constant, and R(q) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // double : Max empfr_classor found: 7.403372e-17
+      // long double : Max empfr_classor found: 6.084616e-20
+      // Maximum Deviation Found (empfr_classor term) 4.811e-20
+      //
+      static const float Y = 2.249481201171875f;
+      static const mpfr_class P[] = {    
+         -0.202433508355938759655,
+         0.105264680699391713268,
+         8.37050328343119927838,
+         17.6447298408374015486,
+         -18.8510648058714251895,
+         -44.6382324441786960818,
+         17.445385985570866523,
+         21.1294655448340526258,
+         -3.67192254707729348546
+      };
+      static const mpfr_class Q[] = {    
+         1,
+         6.24264124854247537712,
+         3.9713437953343869095,
+         -28.6608180499800029974,
+         -20.1432634680485188801,
+         48.5609213108739935468,
+         10.8268667355460159008,
+         -22.6436933413139721736,
+         1.72114765761200282724
+      };
+      mpfr_class g = sqrt(-2 * log(q));
+      mpfr_class xs = q - 0.25;
+      mpfr_class r = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+      result = g / (Y + r);
+   }
+   else
+   {
+      //
+      // For q < 0.25 we have a series of rational approximations all
+      // of the general form:
+      //
+      // let: x = sqrt(-log(q))
+      //
+      // Then the result is given by:
+      //
+      // x(Y+R(x-B))
+      //
+      // where Y is a constant, B is the lowest value of x for which 
+      // the approximation is valid, and R(x-B) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // Note that almost all code will really go through the first
+      // or maybe second approximation.  After than we're dealing with very
+      // small input values indeed: 80 and 128 bit long double's go all the
+      // way down to ~ 1e-5000 so the "tail" is rather long...
+      //
+      mpfr_class x = sqrt(-log(q));
+      if(x < 3)
+      {
+         // Max empfr_classor found: 1.089051e-20
+         static const float Y = 0.807220458984375f;
+         static const mpfr_class P[] = {    
+            -0.131102781679951906451,
+            -0.163794047193317060787,
+            0.117030156341995252019,
+            0.387079738972604337464,
+            0.337785538912035898924,
+            0.142869534408157156766,
+            0.0290157910005329060432,
+            0.00214558995388805277169,
+            -0.679465575181126350155e-6,
+            0.285225331782217055858e-7,
+            -0.681149956853776992068e-9
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            3.46625407242567245975,
+            5.38168345707006855425,
+            4.77846592945843778382,
+            2.59301921623620271374,
+            0.848854343457902036425,
+            0.152264338295331783612,
+            0.01105924229346489121
+         };
+         mpfr_class xs = x - 1.125;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 6)
+      {
+         // Max empfr_classor found: 8.389174e-21
+         static const float Y = 0.93995571136474609375f;
+         static const mpfr_class P[] = {    
+            -0.0350353787183177984712,
+            -0.00222426529213447927281,
+            0.0185573306514231072324,
+            0.00950804701325919603619,
+            0.00187123492819559223345,
+            0.000157544617424960554631,
+            0.460469890584317994083e-5,
+            -0.230404776911882601748e-9,
+            0.266339227425782031962e-11
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            1.3653349817554063097,
+            0.762059164553623404043,
+            0.220091105764131249824,
+            0.0341589143670947727934,
+            0.00263861676657015992959,
+            0.764675292302794483503e-4
+         };
+         mpfr_class xs = x - 3;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 18)
+      {
+         // Max empfr_classor found: 1.481312e-19
+         static const float Y = 0.98362827301025390625f;
+         static const mpfr_class P[] = {    
+            -0.0167431005076633737133,
+            -0.00112951438745580278863,
+            0.00105628862152492910091,
+            0.000209386317487588078668,
+            0.149624783758342370182e-4,
+            0.449696789927706453732e-6,
+            0.462596163522878599135e-8,
+            -0.281128735628831791805e-13,
+            0.99055709973310326855e-16
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.591429344886417493481,
+            0.138151865749083321638,
+            0.0160746087093676504695,
+            0.000964011807005165528527,
+            0.275335474764726041141e-4,
+            0.282243172016108031869e-6
+         };
+         mpfr_class xs = x - 6;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 44)
+      {
+         // Max empfr_classor found: 5.697761e-20
+         static const float Y = 0.99714565277099609375f;
+         static const mpfr_class P[] = {    
+            -0.0024978212791898131227,
+            -0.779190719229053954292e-5,
+            0.254723037413027451751e-4,
+            0.162397777342510920873e-5,
+            0.396341011304801168516e-7,
+            0.411632831190944208473e-9,
+            0.145596286718675035587e-11,
+            -0.116765012397184275695e-17
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.207123112214422517181,
+            0.0169410838120975906478,
+            0.000690538265622684595676,
+            0.145007359818232637924e-4,
+            0.144437756628144157666e-6,
+            0.509761276599778486139e-9
+         };
+         mpfr_class xs = x - 18;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else
+      {
+         // Max empfr_classor found: 1.279746e-20
+         static const float Y = 0.99941349029541015625f;
+         static const mpfr_class P[] = {    
+            -0.000539042911019078575891,
+            -0.28398759004727721098e-6,
+            0.899465114892291446442e-6,
+            0.229345859265920864296e-7,
+            0.225561444863500149219e-9,
+            0.947846627503022684216e-12,
+            0.135880130108924861008e-14,
+            -0.348890393399948882918e-21
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.0845746234001899436914,
+            0.00282092984726264681981,
+            0.468292921940894236786e-4,
+            0.399968812193862100054e-6,
+            0.161809290887904476097e-8,
+            0.231558608310259605225e-11
+         };
+         mpfr_class xs = x - 44;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+   }
+   return result;
+}
+
+inline mpfr_class bessel_i0(mpfr_class x)
+{
+    static const mpfr_class P1[] = {
+        boost::lexical_cast<mpfr_class>("-2.2335582639474375249e+15"),
+        boost::lexical_cast<mpfr_class>("-5.5050369673018427753e+14"),
+        boost::lexical_cast<mpfr_class>("-3.2940087627407749166e+13"),
+        boost::lexical_cast<mpfr_class>("-8.4925101247114157499e+11"),
+        boost::lexical_cast<mpfr_class>("-1.1912746104985237192e+10"),
+        boost::lexical_cast<mpfr_class>("-1.0313066708737980747e+08"),
+        boost::lexical_cast<mpfr_class>("-5.9545626019847898221e+05"),
+        boost::lexical_cast<mpfr_class>("-2.4125195876041896775e+03"),
+        boost::lexical_cast<mpfr_class>("-7.0935347449210549190e+00"),
+        boost::lexical_cast<mpfr_class>("-1.5453977791786851041e-02"),
+        boost::lexical_cast<mpfr_class>("-2.5172644670688975051e-05"),
+        boost::lexical_cast<mpfr_class>("-3.0517226450451067446e-08"),
+        boost::lexical_cast<mpfr_class>("-2.6843448573468483278e-11"),
+        boost::lexical_cast<mpfr_class>("-1.5982226675653184646e-14"),
+        boost::lexical_cast<mpfr_class>("-5.2487866627945699800e-18"),
+    };
+    static const mpfr_class Q1[] = {
+        boost::lexical_cast<mpfr_class>("-2.2335582639474375245e+15"),
+        boost::lexical_cast<mpfr_class>("7.8858692566751002988e+12"),
+        boost::lexical_cast<mpfr_class>("-1.2207067397808979846e+10"),
+        boost::lexical_cast<mpfr_class>("1.0377081058062166144e+07"),
+        boost::lexical_cast<mpfr_class>("-4.8527560179962773045e+03"),
+        boost::lexical_cast<mpfr_class>("1.0"),
+    };
+    static const mpfr_class P2[] = {
+        boost::lexical_cast<mpfr_class>("-2.2210262233306573296e-04"),
+        boost::lexical_cast<mpfr_class>("1.3067392038106924055e-02"),
+        boost::lexical_cast<mpfr_class>("-4.4700805721174453923e-01"),
+        boost::lexical_cast<mpfr_class>("5.5674518371240761397e+00"),
+        boost::lexical_cast<mpfr_class>("-2.3517945679239481621e+01"),
+        boost::lexical_cast<mpfr_class>("3.1611322818701131207e+01"),
+        boost::lexical_cast<mpfr_class>("-9.6090021968656180000e+00"),
+    };
+    static const mpfr_class Q2[] = {
+        boost::lexical_cast<mpfr_class>("-5.5194330231005480228e-04"),
+        boost::lexical_cast<mpfr_class>("3.2547697594819615062e-02"),
+        boost::lexical_cast<mpfr_class>("-1.1151759188741312645e+00"),
+        boost::lexical_cast<mpfr_class>("1.3982595353892851542e+01"),
+        boost::lexical_cast<mpfr_class>("-6.0228002066743340583e+01"),
+        boost::lexical_cast<mpfr_class>("8.5539563258012929600e+01"),
+        boost::lexical_cast<mpfr_class>("-3.1446690275135491500e+01"),
+        boost::lexical_cast<mpfr_class>("1.0"),
+    };
+    mpfr_class value, factor, r;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (x < 0)
+    {
+        x = -x;                         // even function
+    }
+    if (x == 0)
+    {
+        return static_cast<mpfr_class>(1);
+    }
+    if (x <= 15)                        // x in (0, 15]
+    {
+        mpfr_class y = x * x;
+        value = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+    }
+    else                                // x in (15, \infty)
+    {
+        mpfr_class y = 1 / x - mpfr_class(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+inline mpfr_class bessel_i1(mpfr_class x)
+{
+    static const mpfr_class P1[] = {
+        static_cast<mpfr_class>("-1.4577180278143463643e+15"),
+        static_cast<mpfr_class>("-1.7732037840791591320e+14"),
+        static_cast<mpfr_class>("-6.9876779648010090070e+12"),
+        static_cast<mpfr_class>("-1.3357437682275493024e+11"),
+        static_cast<mpfr_class>("-1.4828267606612366099e+09"),
+        static_cast<mpfr_class>("-1.0588550724769347106e+07"),
+        static_cast<mpfr_class>("-5.1894091982308017540e+04"),
+        static_cast<mpfr_class>("-1.8225946631657315931e+02"),
+        static_cast<mpfr_class>("-4.7207090827310162436e-01"),
+        static_cast<mpfr_class>("-9.1746443287817501309e-04"),
+        static_cast<mpfr_class>("-1.3466829827635152875e-06"),
+        static_cast<mpfr_class>("-1.4831904935994647675e-09"),
+        static_cast<mpfr_class>("-1.1928788903603238754e-12"),
+        static_cast<mpfr_class>("-6.5245515583151902910e-16"),
+        static_cast<mpfr_class>("-1.9705291802535139930e-19"),
+    };
+    static const mpfr_class Q1[] = {
+        static_cast<mpfr_class>("-2.9154360556286927285e+15"),
+        static_cast<mpfr_class>("9.7887501377547640438e+12"),
+        static_cast<mpfr_class>("-1.4386907088588283434e+10"),
+        static_cast<mpfr_class>("1.1594225856856884006e+07"),
+        static_cast<mpfr_class>("-5.1326864679904189920e+03"),
+        static_cast<mpfr_class>("1.0"),
+    };
+    static const mpfr_class P2[] = {
+        static_cast<mpfr_class>("1.4582087408985668208e-05"),
+        static_cast<mpfr_class>("-8.9359825138577646443e-04"),
+        static_cast<mpfr_class>("2.9204895411257790122e-02"),
+        static_cast<mpfr_class>("-3.4198728018058047439e-01"),
+        static_cast<mpfr_class>("1.3960118277609544334e+00"),
+        static_cast<mpfr_class>("-1.9746376087200685843e+00"),
+        static_cast<mpfr_class>("8.5591872901933459000e-01"),
+        static_cast<mpfr_class>("-6.0437159056137599999e-02"),
+    };
+    static const mpfr_class Q2[] = {
+        static_cast<mpfr_class>("3.7510433111922824643e-05"),
+        static_cast<mpfr_class>("-2.2835624489492512649e-03"),
+        static_cast<mpfr_class>("7.4212010813186530069e-02"),
+        static_cast<mpfr_class>("-8.5017476463217924408e-01"),
+        static_cast<mpfr_class>("3.2593714889036996297e+00"),
+        static_cast<mpfr_class>("-3.8806586721556593450e+00"),
+        static_cast<mpfr_class>("1.0"),
+    };
+    mpfr_class value, factor, r, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<mpfr_class>(0);
+    }
+    if (w <= 15)                        // w in (0, 15]
+    {
+        mpfr_class y = x * x;
+        r = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        factor = w;
+        value = factor * r;
+    }
+    else                                // w in (15, \infty)
+    {
+        mpfr_class y = 1 / w - mpfr_class(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(w) / sqrt(w);
+        value = factor * r;
+    }
+
+    if (x < 0)
+    {
+        value *= -value;                 // odd function
+    }
+    return value;
+}
+
+} // namespace detail
+
+}
+
+template<> struct is_convertible<long double, mpfr_class> : public mpl::false_{};
+
+}
+
+#endif // BOOST_MATH_MPLFR_BINDINGS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/bindings/mpreal.hpp b/gatb-core/thirdparty/boost/math/bindings/mpreal.hpp
new file mode 100644
index 0000000..80ed819
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/mpreal.hpp
@@ -0,0 +1,898 @@
+//  Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// Wrapper that works with mpfr::mpreal defined in gmpfrxx.h
+// See http://math.berkeley.edu/~wilken/code/gmpfrxx/
+// Also requires the gmp and mpfr libraries.
+//
+
+#ifndef BOOST_MATH_MPREAL_BINDINGS_HPP
+#define BOOST_MATH_MPREAL_BINDINGS_HPP
+
+#include <boost/config.hpp>
+#include <boost/lexical_cast.hpp>
+
+#ifdef BOOST_MSVC
+//
+// We get a lot of warnings from the gmp, mpfr and gmpfrxx headers, 
+// disable them here, so we only see warnings from *our* code:
+//
+#pragma warning(push)
+#pragma warning(disable: 4127 4800 4512)
+#endif
+
+#include <mpreal.h>
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
+
+namespace mpfr{
+
+template <class T>
+inline mpreal operator + (const mpreal& r, const T& t){ return r + mpreal(t); }
+template <class T>
+inline mpreal operator - (const mpreal& r, const T& t){ return r - mpreal(t); }
+template <class T>
+inline mpreal operator * (const mpreal& r, const T& t){ return r * mpreal(t); }
+template <class T>
+inline mpreal operator / (const mpreal& r, const T& t){ return r / mpreal(t); }
+
+template <class T>
+inline mpreal operator + (const T& t, const mpreal& r){ return mpreal(t) + r; }
+template <class T>
+inline mpreal operator - (const T& t, const mpreal& r){ return mpreal(t) - r; }
+template <class T>
+inline mpreal operator * (const T& t, const mpreal& r){ return mpreal(t) * r; }
+template <class T>
+inline mpreal operator / (const T& t, const mpreal& r){ return mpreal(t) / r; }
+
+template <class T>
+inline bool operator == (const mpreal& r, const T& t){ return r == mpreal(t); }
+template <class T>
+inline bool operator != (const mpreal& r, const T& t){ return r != mpreal(t); }
+template <class T>
+inline bool operator <= (const mpreal& r, const T& t){ return r <= mpreal(t); }
+template <class T>
+inline bool operator >= (const mpreal& r, const T& t){ return r >= mpreal(t); }
+template <class T>
+inline bool operator < (const mpreal& r, const T& t){ return r < mpreal(t); }
+template <class T>
+inline bool operator > (const mpreal& r, const T& t){ return r > mpreal(t); }
+
+template <class T>
+inline bool operator == (const T& t, const mpreal& r){ return mpreal(t) == r; }
+template <class T>
+inline bool operator != (const T& t, const mpreal& r){ return mpreal(t) != r; }
+template <class T>
+inline bool operator <= (const T& t, const mpreal& r){ return mpreal(t) <= r; }
+template <class T>
+inline bool operator >= (const T& t, const mpreal& r){ return mpreal(t) >= r; }
+template <class T>
+inline bool operator < (const T& t, const mpreal& r){ return mpreal(t) < r; }
+template <class T>
+inline bool operator > (const T& t, const mpreal& r){ return mpreal(t) > r; }
+
+/*
+inline mpfr::mpreal fabs(const mpfr::mpreal& v)
+{
+   return abs(v);
+}
+inline mpfr::mpreal pow(const mpfr::mpreal& b, const mpfr::mpreal e)
+{
+   mpfr::mpreal result;
+   mpfr_pow(result.__get_mp(), b.__get_mp(), e.__get_mp(), GMP_RNDN);
+   return result;
+}
+*/
+inline mpfr::mpreal ldexp(const mpfr::mpreal& v, int e)
+{
+   return mpfr::ldexp(v, static_cast<mp_exp_t>(e));
+}
+
+inline mpfr::mpreal frexp(const mpfr::mpreal& v, int* expon)
+{
+   mp_exp_t e;
+   mpfr::mpreal r = mpfr::frexp(v, &e);
+   *expon = e;
+   return r;
+}
+
+#if (MPFR_VERSION < MPFR_VERSION_NUM(2,4,0))
+mpfr::mpreal fmod(const mpfr::mpreal& v1, const mpfr::mpreal& v2)
+{
+   mpfr::mpreal n;
+   if(v1 < 0)
+      n = ceil(v1 / v2);
+   else
+      n = floor(v1 / v2);
+   return v1 - n * v2;
+}
+#endif
+
+template <class Policy>
+inline mpfr::mpreal modf(const mpfr::mpreal& v, long long* ipart, const Policy& pol)
+{
+   *ipart = lltrunc(v, pol);
+   return v - boost::math::tools::real_cast<mpfr::mpreal>(*ipart);
+}
+template <class Policy>
+inline int iround(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<int>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline long lround(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline long long llround(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline int itrunc(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<int>(boost::math::trunc(x, pol));
+}
+
+template <class Policy>
+inline long ltrunc(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long>(boost::math::trunc(x, pol));
+}
+
+template <class Policy>
+inline long long lltrunc(mpfr::mpreal const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::trunc(x, pol));
+}
+
+}
+
+namespace boost{ namespace math{
+
+#if defined(__GNUC__) && (__GNUC__ < 4)
+   using ::iround;
+   using ::lround;
+   using ::llround;
+   using ::itrunc;
+   using ::ltrunc;
+   using ::lltrunc;
+   using ::modf;
+#endif
+
+namespace lanczos{
+
+struct mpreal_lanczos
+{
+   static mpfr::mpreal lanczos_sum(const mpfr::mpreal& z)
+   {
+      unsigned long p = z.get_default_prec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum(z);
+   }
+   static mpfr::mpreal lanczos_sum_expG_scaled(const mpfr::mpreal& z)
+   {
+      unsigned long p = z.get_default_prec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_expG_scaled(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_expG_scaled(z);
+   }
+   static mpfr::mpreal lanczos_sum_near_1(const mpfr::mpreal& z)
+   {
+      unsigned long p = z.get_default_prec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_1(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_1(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_1(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_1(z);
+   }
+   static mpfr::mpreal lanczos_sum_near_2(const mpfr::mpreal& z)
+   {
+      unsigned long p = z.get_default_prec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_2(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_2(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_2(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_2(z);
+   }
+   static mpfr::mpreal g()
+   { 
+      unsigned long p = mpfr::mpreal::get_default_prec();
+      if(p <= 72)
+         return lanczos13UDT::g();
+      else if(p <= 120)
+         return lanczos22UDT::g();
+      else if(p <= 170)
+         return lanczos31UDT::g();
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::g();
+   }
+};
+
+template<class Policy>
+struct lanczos<mpfr::mpreal, Policy>
+{
+   typedef mpreal_lanczos type;
+};
+
+} // namespace lanczos
+
+namespace tools
+{
+
+template<>
+inline int digits<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   return mpfr::mpreal::get_default_prec();
+}
+
+namespace detail{
+
+template<class I>
+void convert_to_long_result(mpfr::mpreal const& r, I& result)
+{
+   result = 0;
+   I last_result(0);
+   mpfr::mpreal t(r);
+   double term;
+   do
+   {
+      term = real_cast<double>(t);
+      last_result = result;
+      result += static_cast<I>(term);
+      t -= term;
+   }while(result != last_result);
+}
+
+}
+
+template <>
+inline mpfr::mpreal real_cast<mpfr::mpreal, long long>(long long t)
+{
+   mpfr::mpreal result;
+   int expon = 0;
+   int sign = 1;
+   if(t < 0)
+   {
+      sign = -1;
+      t = -t;
+   }
+   while(t)
+   {
+      result += ldexp((double)(t & 0xffffL), expon);
+      expon += 32;
+      t >>= 32;
+   }
+   return result * sign;
+}
+/*
+template <>
+inline unsigned real_cast<unsigned, mpfr::mpreal>(mpfr::mpreal t)
+{
+   return t.get_ui();
+}
+template <>
+inline int real_cast<int, mpfr::mpreal>(mpfr::mpreal t)
+{
+   return t.get_si();
+}
+template <>
+inline double real_cast<double, mpfr::mpreal>(mpfr::mpreal t)
+{
+   return t.get_d();
+}
+template <>
+inline float real_cast<float, mpfr::mpreal>(mpfr::mpreal t)
+{
+   return static_cast<float>(t.get_d());
+}
+template <>
+inline long real_cast<long, mpfr::mpreal>(mpfr::mpreal t)
+{
+   long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+*/
+template <>
+inline long long real_cast<long long, mpfr::mpreal>(mpfr::mpreal t)
+{
+   long long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+
+template <>
+inline mpfr::mpreal max_value<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   static bool has_init = false;
+   static mpfr::mpreal val(0.5);
+   if(!has_init)
+   {
+      val = ldexp(val, mpfr_get_emax());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr::mpreal min_value<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   static bool has_init = false;
+   static mpfr::mpreal val(0.5);
+   if(!has_init)
+   {
+      val = ldexp(val, mpfr_get_emin());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr::mpreal log_max_value<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   static bool has_init = false;
+   static mpfr::mpreal val = max_value<mpfr::mpreal>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr::mpreal log_min_value<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   static bool has_init = false;
+   static mpfr::mpreal val = max_value<mpfr::mpreal>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr::mpreal epsilon<mpfr::mpreal>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr::mpreal))
+{
+   return ldexp(mpfr::mpreal(1), 1-boost::math::policies::digits<mpfr::mpreal, boost::math::policies::policy<> >());
+}
+
+} // namespace tools
+
+template <class Policy>
+inline mpfr::mpreal skewness(const extreme_value_distribution<mpfr::mpreal, Policy>& /*dist*/)
+{
+   //
+   // This is 12 * sqrt(6) * zeta(3) / pi^3:
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   //
+   return boost::lexical_cast<mpfr::mpreal>("1.1395470994046486574927930193898461120875997958366");
+}
+
+template <class Policy>
+inline mpfr::mpreal skewness(const rayleigh_distribution<mpfr::mpreal, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr::mpreal>("0.63111065781893713819189935154422777984404221106391");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 2 * root_pi<RealType>() * pi_minus_three<RealType>() / pow23_four_minus_pi<RealType>();
+}
+
+template <class Policy>
+inline mpfr::mpreal kurtosis(const rayleigh_distribution<mpfr::mpreal, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr::mpreal>("3.2450893006876380628486604106197544154170667057995");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 3 - (6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  // (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+}
+
+template <class Policy>
+inline mpfr::mpreal kurtosis_excess(const rayleigh_distribution<mpfr::mpreal, Policy>& /*dist*/)
+{
+  //using namespace boost::math::constants;
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  return boost::lexical_cast<mpfr::mpreal>("0.2450893006876380628486604106197544154170667057995");
+  // return -(6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  //   (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+} // kurtosis
+
+namespace detail{
+
+//
+// Version of Digamma accurate to ~100 decimal digits.
+//
+template <class Policy>
+mpfr::mpreal digamma_imp(mpfr::mpreal x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // empfr_classor handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   mpfr::mpreal result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      mpfr::mpreal remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<mpfr::mpreal>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<mpfr::mpreal>() / tan(constants::pi<mpfr::mpreal>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+//
+// Specialisations of this function provides the initial
+// starting guess for Halley iteration:
+//
+template <class Policy>
+mpfr::mpreal erf_inv_imp(const mpfr::mpreal& p, const mpfr::mpreal& q, const Policy&, const boost::mpl::int_<64>*)
+{
+   BOOST_MATH_STD_USING // for ADL of std names.
+
+   mpfr::mpreal result = 0;
+   
+   if(p <= 0.5)
+   {
+      //
+      // Evaluate inverse erf using the rational approximation:
+      //
+      // x = p(p+10)(Y+R(p))
+      //
+      // Where Y is a constant, and R(p) is optimised for a low
+      // absolute empfr_classor compared to |Y|.
+      //
+      // double: Max empfr_classor found: 2.001849e-18
+      // long double: Max empfr_classor found: 1.017064e-20
+      // Maximum Deviation Found (actual empfr_classor term at infinite precision) 8.030e-21
+      //
+      static const float Y = 0.0891314744949340820313f;
+      static const mpfr::mpreal P[] = {    
+         -0.000508781949658280665617,
+         -0.00836874819741736770379,
+         0.0334806625409744615033,
+         -0.0126926147662974029034,
+         -0.0365637971411762664006,
+         0.0219878681111168899165,
+         0.00822687874676915743155,
+         -0.00538772965071242932965
+      };
+      static const mpfr::mpreal Q[] = {    
+         1,
+         -0.970005043303290640362,
+         -1.56574558234175846809,
+         1.56221558398423026363,
+         0.662328840472002992063,
+         -0.71228902341542847553,
+         -0.0527396382340099713954,
+         0.0795283687341571680018,
+         -0.00233393759374190016776,
+         0.000886216390456424707504
+      };
+      mpfr::mpreal g = p * (p + 10);
+      mpfr::mpreal r = tools::evaluate_polynomial(P, p) / tools::evaluate_polynomial(Q, p);
+      result = g * Y + g * r;
+   }
+   else if(q >= 0.25)
+   {
+      //
+      // Rational approximation for 0.5 > q >= 0.25
+      //
+      // x = sqrt(-2*log(q)) / (Y + R(q))
+      //
+      // Where Y is a constant, and R(q) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // double : Max empfr_classor found: 7.403372e-17
+      // long double : Max empfr_classor found: 6.084616e-20
+      // Maximum Deviation Found (empfr_classor term) 4.811e-20
+      //
+      static const float Y = 2.249481201171875f;
+      static const mpfr::mpreal P[] = {    
+         -0.202433508355938759655,
+         0.105264680699391713268,
+         8.37050328343119927838,
+         17.6447298408374015486,
+         -18.8510648058714251895,
+         -44.6382324441786960818,
+         17.445385985570866523,
+         21.1294655448340526258,
+         -3.67192254707729348546
+      };
+      static const mpfr::mpreal Q[] = {    
+         1,
+         6.24264124854247537712,
+         3.9713437953343869095,
+         -28.6608180499800029974,
+         -20.1432634680485188801,
+         48.5609213108739935468,
+         10.8268667355460159008,
+         -22.6436933413139721736,
+         1.72114765761200282724
+      };
+      mpfr::mpreal g = sqrt(-2 * log(q));
+      mpfr::mpreal xs = q - 0.25;
+      mpfr::mpreal r = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+      result = g / (Y + r);
+   }
+   else
+   {
+      //
+      // For q < 0.25 we have a series of rational approximations all
+      // of the general form:
+      //
+      // let: x = sqrt(-log(q))
+      //
+      // Then the result is given by:
+      //
+      // x(Y+R(x-B))
+      //
+      // where Y is a constant, B is the lowest value of x for which 
+      // the approximation is valid, and R(x-B) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // Note that almost all code will really go through the first
+      // or maybe second approximation.  After than we're dealing with very
+      // small input values indeed: 80 and 128 bit long double's go all the
+      // way down to ~ 1e-5000 so the "tail" is rather long...
+      //
+      mpfr::mpreal x = sqrt(-log(q));
+      if(x < 3)
+      {
+         // Max empfr_classor found: 1.089051e-20
+         static const float Y = 0.807220458984375f;
+         static const mpfr::mpreal P[] = {    
+            -0.131102781679951906451,
+            -0.163794047193317060787,
+            0.117030156341995252019,
+            0.387079738972604337464,
+            0.337785538912035898924,
+            0.142869534408157156766,
+            0.0290157910005329060432,
+            0.00214558995388805277169,
+            -0.679465575181126350155e-6,
+            0.285225331782217055858e-7,
+            -0.681149956853776992068e-9
+         };
+         static const mpfr::mpreal Q[] = {    
+            1,
+            3.46625407242567245975,
+            5.38168345707006855425,
+            4.77846592945843778382,
+            2.59301921623620271374,
+            0.848854343457902036425,
+            0.152264338295331783612,
+            0.01105924229346489121
+         };
+         mpfr::mpreal xs = x - 1.125;
+         mpfr::mpreal R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 6)
+      {
+         // Max empfr_classor found: 8.389174e-21
+         static const float Y = 0.93995571136474609375f;
+         static const mpfr::mpreal P[] = {    
+            -0.0350353787183177984712,
+            -0.00222426529213447927281,
+            0.0185573306514231072324,
+            0.00950804701325919603619,
+            0.00187123492819559223345,
+            0.000157544617424960554631,
+            0.460469890584317994083e-5,
+            -0.230404776911882601748e-9,
+            0.266339227425782031962e-11
+         };
+         static const mpfr::mpreal Q[] = {    
+            1,
+            1.3653349817554063097,
+            0.762059164553623404043,
+            0.220091105764131249824,
+            0.0341589143670947727934,
+            0.00263861676657015992959,
+            0.764675292302794483503e-4
+         };
+         mpfr::mpreal xs = x - 3;
+         mpfr::mpreal R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 18)
+      {
+         // Max empfr_classor found: 1.481312e-19
+         static const float Y = 0.98362827301025390625f;
+         static const mpfr::mpreal P[] = {    
+            -0.0167431005076633737133,
+            -0.00112951438745580278863,
+            0.00105628862152492910091,
+            0.000209386317487588078668,
+            0.149624783758342370182e-4,
+            0.449696789927706453732e-6,
+            0.462596163522878599135e-8,
+            -0.281128735628831791805e-13,
+            0.99055709973310326855e-16
+         };
+         static const mpfr::mpreal Q[] = {    
+            1,
+            0.591429344886417493481,
+            0.138151865749083321638,
+            0.0160746087093676504695,
+            0.000964011807005165528527,
+            0.275335474764726041141e-4,
+            0.282243172016108031869e-6
+         };
+         mpfr::mpreal xs = x - 6;
+         mpfr::mpreal R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 44)
+      {
+         // Max empfr_classor found: 5.697761e-20
+         static const float Y = 0.99714565277099609375f;
+         static const mpfr::mpreal P[] = {    
+            -0.0024978212791898131227,
+            -0.779190719229053954292e-5,
+            0.254723037413027451751e-4,
+            0.162397777342510920873e-5,
+            0.396341011304801168516e-7,
+            0.411632831190944208473e-9,
+            0.145596286718675035587e-11,
+            -0.116765012397184275695e-17
+         };
+         static const mpfr::mpreal Q[] = {    
+            1,
+            0.207123112214422517181,
+            0.0169410838120975906478,
+            0.000690538265622684595676,
+            0.145007359818232637924e-4,
+            0.144437756628144157666e-6,
+            0.509761276599778486139e-9
+         };
+         mpfr::mpreal xs = x - 18;
+         mpfr::mpreal R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else
+      {
+         // Max empfr_classor found: 1.279746e-20
+         static const float Y = 0.99941349029541015625f;
+         static const mpfr::mpreal P[] = {    
+            -0.000539042911019078575891,
+            -0.28398759004727721098e-6,
+            0.899465114892291446442e-6,
+            0.229345859265920864296e-7,
+            0.225561444863500149219e-9,
+            0.947846627503022684216e-12,
+            0.135880130108924861008e-14,
+            -0.348890393399948882918e-21
+         };
+         static const mpfr::mpreal Q[] = {    
+            1,
+            0.0845746234001899436914,
+            0.00282092984726264681981,
+            0.468292921940894236786e-4,
+            0.399968812193862100054e-6,
+            0.161809290887904476097e-8,
+            0.231558608310259605225e-11
+         };
+         mpfr::mpreal xs = x - 44;
+         mpfr::mpreal R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+   }
+   return result;
+}
+
+inline mpfr::mpreal bessel_i0(mpfr::mpreal x)
+{
+    static const mpfr::mpreal P1[] = {
+        boost::lexical_cast<mpfr::mpreal>("-2.2335582639474375249e+15"),
+        boost::lexical_cast<mpfr::mpreal>("-5.5050369673018427753e+14"),
+        boost::lexical_cast<mpfr::mpreal>("-3.2940087627407749166e+13"),
+        boost::lexical_cast<mpfr::mpreal>("-8.4925101247114157499e+11"),
+        boost::lexical_cast<mpfr::mpreal>("-1.1912746104985237192e+10"),
+        boost::lexical_cast<mpfr::mpreal>("-1.0313066708737980747e+08"),
+        boost::lexical_cast<mpfr::mpreal>("-5.9545626019847898221e+05"),
+        boost::lexical_cast<mpfr::mpreal>("-2.4125195876041896775e+03"),
+        boost::lexical_cast<mpfr::mpreal>("-7.0935347449210549190e+00"),
+        boost::lexical_cast<mpfr::mpreal>("-1.5453977791786851041e-02"),
+        boost::lexical_cast<mpfr::mpreal>("-2.5172644670688975051e-05"),
+        boost::lexical_cast<mpfr::mpreal>("-3.0517226450451067446e-08"),
+        boost::lexical_cast<mpfr::mpreal>("-2.6843448573468483278e-11"),
+        boost::lexical_cast<mpfr::mpreal>("-1.5982226675653184646e-14"),
+        boost::lexical_cast<mpfr::mpreal>("-5.2487866627945699800e-18"),
+    };
+    static const mpfr::mpreal Q1[] = {
+        boost::lexical_cast<mpfr::mpreal>("-2.2335582639474375245e+15"),
+        boost::lexical_cast<mpfr::mpreal>("7.8858692566751002988e+12"),
+        boost::lexical_cast<mpfr::mpreal>("-1.2207067397808979846e+10"),
+        boost::lexical_cast<mpfr::mpreal>("1.0377081058062166144e+07"),
+        boost::lexical_cast<mpfr::mpreal>("-4.8527560179962773045e+03"),
+        boost::lexical_cast<mpfr::mpreal>("1.0"),
+    };
+    static const mpfr::mpreal P2[] = {
+        boost::lexical_cast<mpfr::mpreal>("-2.2210262233306573296e-04"),
+        boost::lexical_cast<mpfr::mpreal>("1.3067392038106924055e-02"),
+        boost::lexical_cast<mpfr::mpreal>("-4.4700805721174453923e-01"),
+        boost::lexical_cast<mpfr::mpreal>("5.5674518371240761397e+00"),
+        boost::lexical_cast<mpfr::mpreal>("-2.3517945679239481621e+01"),
+        boost::lexical_cast<mpfr::mpreal>("3.1611322818701131207e+01"),
+        boost::lexical_cast<mpfr::mpreal>("-9.6090021968656180000e+00"),
+    };
+    static const mpfr::mpreal Q2[] = {
+        boost::lexical_cast<mpfr::mpreal>("-5.5194330231005480228e-04"),
+        boost::lexical_cast<mpfr::mpreal>("3.2547697594819615062e-02"),
+        boost::lexical_cast<mpfr::mpreal>("-1.1151759188741312645e+00"),
+        boost::lexical_cast<mpfr::mpreal>("1.3982595353892851542e+01"),
+        boost::lexical_cast<mpfr::mpreal>("-6.0228002066743340583e+01"),
+        boost::lexical_cast<mpfr::mpreal>("8.5539563258012929600e+01"),
+        boost::lexical_cast<mpfr::mpreal>("-3.1446690275135491500e+01"),
+        boost::lexical_cast<mpfr::mpreal>("1.0"),
+    };
+    mpfr::mpreal value, factor, r;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (x < 0)
+    {
+        x = -x;                         // even function
+    }
+    if (x == 0)
+    {
+        return static_cast<mpfr::mpreal>(1);
+    }
+    if (x <= 15)                        // x in (0, 15]
+    {
+        mpfr::mpreal y = x * x;
+        value = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+    }
+    else                                // x in (15, \infty)
+    {
+        mpfr::mpreal y = 1 / x - mpfr::mpreal(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+inline mpfr::mpreal bessel_i1(mpfr::mpreal x)
+{
+    static const mpfr::mpreal P1[] = {
+        static_cast<mpfr::mpreal>("-1.4577180278143463643e+15"),
+        static_cast<mpfr::mpreal>("-1.7732037840791591320e+14"),
+        static_cast<mpfr::mpreal>("-6.9876779648010090070e+12"),
+        static_cast<mpfr::mpreal>("-1.3357437682275493024e+11"),
+        static_cast<mpfr::mpreal>("-1.4828267606612366099e+09"),
+        static_cast<mpfr::mpreal>("-1.0588550724769347106e+07"),
+        static_cast<mpfr::mpreal>("-5.1894091982308017540e+04"),
+        static_cast<mpfr::mpreal>("-1.8225946631657315931e+02"),
+        static_cast<mpfr::mpreal>("-4.7207090827310162436e-01"),
+        static_cast<mpfr::mpreal>("-9.1746443287817501309e-04"),
+        static_cast<mpfr::mpreal>("-1.3466829827635152875e-06"),
+        static_cast<mpfr::mpreal>("-1.4831904935994647675e-09"),
+        static_cast<mpfr::mpreal>("-1.1928788903603238754e-12"),
+        static_cast<mpfr::mpreal>("-6.5245515583151902910e-16"),
+        static_cast<mpfr::mpreal>("-1.9705291802535139930e-19"),
+    };
+    static const mpfr::mpreal Q1[] = {
+        static_cast<mpfr::mpreal>("-2.9154360556286927285e+15"),
+        static_cast<mpfr::mpreal>("9.7887501377547640438e+12"),
+        static_cast<mpfr::mpreal>("-1.4386907088588283434e+10"),
+        static_cast<mpfr::mpreal>("1.1594225856856884006e+07"),
+        static_cast<mpfr::mpreal>("-5.1326864679904189920e+03"),
+        static_cast<mpfr::mpreal>("1.0"),
+    };
+    static const mpfr::mpreal P2[] = {
+        static_cast<mpfr::mpreal>("1.4582087408985668208e-05"),
+        static_cast<mpfr::mpreal>("-8.9359825138577646443e-04"),
+        static_cast<mpfr::mpreal>("2.9204895411257790122e-02"),
+        static_cast<mpfr::mpreal>("-3.4198728018058047439e-01"),
+        static_cast<mpfr::mpreal>("1.3960118277609544334e+00"),
+        static_cast<mpfr::mpreal>("-1.9746376087200685843e+00"),
+        static_cast<mpfr::mpreal>("8.5591872901933459000e-01"),
+        static_cast<mpfr::mpreal>("-6.0437159056137599999e-02"),
+    };
+    static const mpfr::mpreal Q2[] = {
+        static_cast<mpfr::mpreal>("3.7510433111922824643e-05"),
+        static_cast<mpfr::mpreal>("-2.2835624489492512649e-03"),
+        static_cast<mpfr::mpreal>("7.4212010813186530069e-02"),
+        static_cast<mpfr::mpreal>("-8.5017476463217924408e-01"),
+        static_cast<mpfr::mpreal>("3.2593714889036996297e+00"),
+        static_cast<mpfr::mpreal>("-3.8806586721556593450e+00"),
+        static_cast<mpfr::mpreal>("1.0"),
+    };
+    mpfr::mpreal value, factor, r, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<mpfr::mpreal>(0);
+    }
+    if (w <= 15)                        // w in (0, 15]
+    {
+        mpfr::mpreal y = x * x;
+        r = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        factor = w;
+        value = factor * r;
+    }
+    else                                // w in (15, \infty)
+    {
+        mpfr::mpreal y = 1 / w - mpfr::mpreal(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(w) / sqrt(w);
+        value = factor * r;
+    }
+
+    if (x < 0)
+    {
+        value *= -value;                 // odd function
+    }
+    return value;
+}
+
+} // namespace detail
+} // namespace math
+
+}
+
+#endif // BOOST_MATH_MPLFR_BINDINGS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/bindings/rr.hpp b/gatb-core/thirdparty/boost/math/bindings/rr.hpp
new file mode 100644
index 0000000..6ec79f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/bindings/rr.hpp
@@ -0,0 +1,884 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_NTL_RR_HPP
+#define BOOST_MATH_NTL_RR_HPP
+
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
+
+#include <ostream>
+#include <istream>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <NTL/RR.h>
+
+namespace boost{ namespace math{
+
+namespace ntl
+{
+
+class RR;
+
+RR ldexp(RR r, int exp);
+RR frexp(RR r, int* exp);
+
+class RR
+{
+public:
+   // Constructors:
+   RR() {}
+   RR(const ::NTL::RR& c) : m_value(c){}
+   RR(char c)
+   {
+      m_value = c;
+   }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   RR(wchar_t c)
+   {
+      m_value = c;
+   }
+#endif
+   RR(unsigned char c)
+   {
+      m_value = c;
+   }
+   RR(signed char c)
+   {
+      m_value = c;
+   }
+   RR(unsigned short c)
+   {
+      m_value = c;
+   }
+   RR(short c)
+   {
+      m_value = c;
+   }
+   RR(unsigned int c)
+   {
+      assign_large_int(c);
+   }
+   RR(int c)
+   {
+      assign_large_int(c);
+   }
+   RR(unsigned long c)
+   {
+      assign_large_int(c);
+   }
+   RR(long c)
+   {
+      assign_large_int(c);
+   }
+#ifdef BOOST_HAS_LONG_LONG
+   RR(boost::ulong_long_type c)
+   {
+      assign_large_int(c);
+   }
+   RR(boost::long_long_type c)
+   {
+      assign_large_int(c);
+   }
+#endif
+   RR(float c)
+   {
+      m_value = c;
+   }
+   RR(double c)
+   {
+      m_value = c;
+   }
+   RR(long double c)
+   {
+      assign_large_real(c);
+   }
+
+   // Assignment:
+   RR& operator=(char c) { m_value = c; return *this; }
+   RR& operator=(unsigned char c) { m_value = c; return *this; }
+   RR& operator=(signed char c) { m_value = c; return *this; }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   RR& operator=(wchar_t c) { m_value = c; return *this; }
+#endif
+   RR& operator=(short c) { m_value = c; return *this; }
+   RR& operator=(unsigned short c) { m_value = c; return *this; }
+   RR& operator=(int c) { assign_large_int(c); return *this; }
+   RR& operator=(unsigned int c) { assign_large_int(c); return *this; }
+   RR& operator=(long c) { assign_large_int(c); return *this; }
+   RR& operator=(unsigned long c) { assign_large_int(c); return *this; }
+#ifdef BOOST_HAS_LONG_LONG
+   RR& operator=(boost::long_long_type c) { assign_large_int(c); return *this; }
+   RR& operator=(boost::ulong_long_type c) { assign_large_int(c); return *this; }
+#endif
+   RR& operator=(float c) { m_value = c; return *this; }
+   RR& operator=(double c) { m_value = c; return *this; }
+   RR& operator=(long double c) { assign_large_real(c); return *this; }
+
+   // Access:
+   NTL::RR& value(){ return m_value; }
+   NTL::RR const& value()const{ return m_value; }
+
+   // Member arithmetic:
+   RR& operator+=(const RR& other)
+   { m_value += other.value(); return *this; }
+   RR& operator-=(const RR& other)
+   { m_value -= other.value(); return *this; }
+   RR& operator*=(const RR& other)
+   { m_value *= other.value(); return *this; }
+   RR& operator/=(const RR& other)
+   { m_value /= other.value(); return *this; }
+   RR operator-()const
+   { return -m_value; }
+   RR const& operator+()const
+   { return *this; }
+
+   // RR compatibity:
+   const ::NTL::ZZ& mantissa() const
+   { return m_value.mantissa(); }
+   long exponent() const
+   { return m_value.exponent(); }
+
+   static void SetPrecision(long p)
+   { ::NTL::RR::SetPrecision(p); }
+
+   static long precision()
+   { return ::NTL::RR::precision(); }
+
+   static void SetOutputPrecision(long p)
+   { ::NTL::RR::SetOutputPrecision(p); }
+   static long OutputPrecision()
+   { return ::NTL::RR::OutputPrecision(); }
+
+
+private:
+   ::NTL::RR m_value;
+
+   template <class V>
+   void assign_large_real(const V& a)
+   {
+      using std::frexp;
+      using std::ldexp;
+      using std::floor;
+      if (a == 0) {
+         clear(m_value);
+         return;
+      }
+
+      if (a == 1) {
+         NTL::set(m_value);
+         return;
+      }
+
+      if (!(boost::math::isfinite)(a))
+      {
+         throw std::overflow_error("Cannot construct an instance of NTL::RR with an infinite value.");
+      }
+
+      int e;
+      long double f, term;
+      ::NTL::RR t;
+      clear(m_value);
+
+      f = frexp(a, &e);
+
+      while(f)
+      {
+         // extract 30 bits from f:
+         f = ldexp(f, 30);
+         term = floor(f);
+         e -= 30;
+         conv(t.x, (int)term);
+         t.e = e;
+         m_value += t;
+         f -= term;
+      }
+   }
+
+   template <class V>
+   void assign_large_int(V a)
+   {
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4146)
+#endif
+      clear(m_value);
+      int exp = 0;
+      NTL::RR t;
+      bool neg = a < V(0) ? true : false;
+      if(neg) 
+         a = -a;
+      while(a)
+      {
+         t = static_cast<double>(a & 0xffff);
+         m_value += ldexp(RR(t), exp).value();
+         a >>= 16;
+         exp += 16;
+      }
+      if(neg)
+         m_value = -m_value;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+   }
+};
+
+// Non-member arithmetic:
+inline RR operator+(const RR& a, const RR& b)
+{
+   RR result(a);
+   result += b;
+   return result;
+}
+inline RR operator-(const RR& a, const RR& b)
+{
+   RR result(a);
+   result -= b;
+   return result;
+}
+inline RR operator*(const RR& a, const RR& b)
+{
+   RR result(a);
+   result *= b;
+   return result;
+}
+inline RR operator/(const RR& a, const RR& b)
+{
+   RR result(a);
+   result /= b;
+   return result;
+}
+
+// Comparison:
+inline bool operator == (const RR& a, const RR& b)
+{ return a.value() == b.value() ? true : false; }
+inline bool operator != (const RR& a, const RR& b)
+{ return a.value() != b.value() ? true : false;}
+inline bool operator < (const RR& a, const RR& b)
+{ return a.value() < b.value() ? true : false; }
+inline bool operator <= (const RR& a, const RR& b)
+{ return a.value() <= b.value() ? true : false; }
+inline bool operator > (const RR& a, const RR& b)
+{ return a.value() > b.value() ? true : false; }
+inline bool operator >= (const RR& a, const RR& b)
+{ return a.value() >= b.value() ? true : false; }
+
+#if 0
+// Non-member mixed compare:
+template <class T>
+inline bool operator == (const T& a, const RR& b)
+{
+   return a == b.value();
+}
+template <class T>
+inline bool operator != (const T& a, const RR& b)
+{
+   return a != b.value();
+}
+template <class T>
+inline bool operator < (const T& a, const RR& b)
+{
+   return a < b.value();
+}
+template <class T>
+inline bool operator > (const T& a, const RR& b)
+{
+   return a > b.value();
+}
+template <class T>
+inline bool operator <= (const T& a, const RR& b)
+{
+   return a <= b.value();
+}
+template <class T>
+inline bool operator >= (const T& a, const RR& b)
+{
+   return a >= b.value();
+}
+#endif  // Non-member mixed compare:
+
+// Non-member functions:
+/*
+inline RR acos(RR a)
+{ return ::NTL::acos(a.value()); }
+*/
+inline RR cos(RR a)
+{ return ::NTL::cos(a.value()); }
+/*
+inline RR asin(RR a)
+{ return ::NTL::asin(a.value()); }
+inline RR atan(RR a)
+{ return ::NTL::atan(a.value()); }
+inline RR atan2(RR a, RR b)
+{ return ::NTL::atan2(a.value(), b.value()); }
+*/
+inline RR ceil(RR a)
+{ return ::NTL::ceil(a.value()); }
+/*
+inline RR fmod(RR a, RR b)
+{ return ::NTL::fmod(a.value(), b.value()); }
+inline RR cosh(RR a)
+{ return ::NTL::cosh(a.value()); }
+*/
+inline RR exp(RR a)
+{ return ::NTL::exp(a.value()); }
+inline RR fabs(RR a)
+{ return ::NTL::fabs(a.value()); }
+inline RR abs(RR a)
+{ return ::NTL::abs(a.value()); }
+inline RR floor(RR a)
+{ return ::NTL::floor(a.value()); }
+/*
+inline RR modf(RR a, RR* ipart)
+{
+   ::NTL::RR ip;
+   RR result = modf(a.value(), &ip);
+   *ipart = ip;
+   return result;
+}
+inline RR frexp(RR a, int* expon)
+{ return ::NTL::frexp(a.value(), expon); }
+inline RR ldexp(RR a, int expon)
+{ return ::NTL::ldexp(a.value(), expon); }
+*/
+inline RR log(RR a)
+{ return ::NTL::log(a.value()); }
+inline RR log10(RR a)
+{ return ::NTL::log10(a.value()); }
+/*
+inline RR tan(RR a)
+{ return ::NTL::tan(a.value()); }
+*/
+inline RR pow(RR a, RR b)
+{ return ::NTL::pow(a.value(), b.value()); }
+inline RR pow(RR a, int b)
+{ return ::NTL::power(a.value(), b); }
+inline RR sin(RR a)
+{ return ::NTL::sin(a.value()); }
+/*
+inline RR sinh(RR a)
+{ return ::NTL::sinh(a.value()); }
+*/
+inline RR sqrt(RR a)
+{ return ::NTL::sqrt(a.value()); }
+/*
+inline RR tanh(RR a)
+{ return ::NTL::tanh(a.value()); }
+*/
+   inline RR pow(const RR& r, long l)
+   {
+      return ::NTL::power(r.value(), l);
+   }
+   inline RR tan(const RR& a)
+   {
+      return sin(a)/cos(a);
+   }
+   inline RR frexp(RR r, int* exp)
+   {
+      *exp = r.value().e;
+      r.value().e = 0;
+      while(r >= 1)
+      {
+         *exp += 1;
+         r.value().e -= 1;
+      }
+      while(r < 0.5)
+      {
+         *exp -= 1;
+         r.value().e += 1;
+      }
+      BOOST_ASSERT(r < 1);
+      BOOST_ASSERT(r >= 0.5);
+      return r;
+   }
+   inline RR ldexp(RR r, int exp)
+   {
+      r.value().e += exp;
+      return r;
+   }
+
+// Streaming:
+template <class charT, class traits>
+inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const RR& a)
+{
+   return os << a.value();
+}
+template <class charT, class traits>
+inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, RR& a)
+{
+   ::NTL::RR v;
+   is >> v;
+   a = v;
+   return is;
+}
+
+} // namespace ntl
+
+namespace lanczos{
+
+struct ntl_lanczos
+{
+   static ntl::RR lanczos_sum(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum(z);
+   }
+   static ntl::RR lanczos_sum_expG_scaled(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_expG_scaled(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_expG_scaled(z);
+   }
+   static ntl::RR lanczos_sum_near_1(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_1(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_1(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_1(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_1(z);
+   }
+   static ntl::RR lanczos_sum_near_2(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_2(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_2(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_2(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_2(z);
+   }
+   static ntl::RR g()
+   { 
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::g();
+      else if(p <= 120)
+         return lanczos22UDT::g();
+      else if(p <= 170)
+         return lanczos31UDT::g();
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::g();
+   }
+};
+
+template<class Policy>
+struct lanczos<ntl::RR, Policy>
+{
+   typedef ntl_lanczos type;
+};
+
+} // namespace lanczos
+
+namespace tools
+{
+
+template<>
+inline int digits<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   return ::NTL::RR::precision();
+}
+
+template <>
+inline float real_cast<float, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   double r;
+   conv(r, t.value());
+   return static_cast<float>(r);
+}
+template <>
+inline double real_cast<double, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   double r;
+   conv(r, t.value());
+   return r;
+}
+
+namespace detail{
+
+template<class I>
+void convert_to_long_result(NTL::RR const& r, I& result)
+{
+   result = 0;
+   I last_result(0);
+   NTL::RR t(r);
+   double term;
+   do
+   {
+      conv(term, t);
+      last_result = result;
+      result += static_cast<I>(term);
+      t -= term;
+   }while(result != last_result);
+}
+
+}
+
+template <>
+inline long double real_cast<long double, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   long double result(0);
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline boost::math::ntl::RR real_cast<boost::math::ntl::RR, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   return t;
+}
+template <>
+inline unsigned real_cast<unsigned, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   unsigned result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline int real_cast<int, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   int result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline long real_cast<long, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   long result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline long long real_cast<long long, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   long long result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+
+template <>
+inline boost::math::ntl::RR max_value<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   static bool has_init = false;
+   static NTL::RR val;
+   if(!has_init)
+   {
+      val = 1;
+      val.e = NTL_OVFBND-20;
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline boost::math::ntl::RR min_value<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   static bool has_init = false;
+   static NTL::RR val;
+   if(!has_init)
+   {
+      val = 1;
+      val.e = -NTL_OVFBND+20;
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline boost::math::ntl::RR log_max_value<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   static bool has_init = false;
+   static NTL::RR val;
+   if(!has_init)
+   {
+      val = 1;
+      val.e = NTL_OVFBND-20;
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline boost::math::ntl::RR log_min_value<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   static bool has_init = false;
+   static NTL::RR val;
+   if(!has_init)
+   {
+      val = 1;
+      val.e = -NTL_OVFBND+20;
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline boost::math::ntl::RR epsilon<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+   return ldexp(boost::math::ntl::RR(1), 1-boost::math::policies::digits<boost::math::ntl::RR, boost::math::policies::policy<> >());
+}
+
+} // namespace tools
+
+//
+// The number of digits precision in RR can vary with each call
+// so we need to recalculate these with each call:
+//
+namespace constants{
+
+template<> inline boost::math::ntl::RR pi<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+    NTL::RR result;
+    ComputePi(result);
+    return result;
+}
+template<> inline boost::math::ntl::RR e<boost::math::ntl::RR>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(boost::math::ntl::RR))
+{
+    NTL::RR result;
+    result = 1;
+    return exp(result);
+}
+
+} // namespace constants
+
+namespace ntl{
+   //
+   // These are some fairly brain-dead versions of the math
+   // functions that NTL fails to provide.
+   //
+
+
+   //
+   // Inverse trig functions:
+   //
+   struct asin_root
+   {
+      asin_root(RR const& target) : t(target){}
+
+      boost::math::tuple<RR, RR, RR> operator()(RR const& p)
+      {
+         RR f0 = sin(p);
+         RR f1 = cos(p);
+         RR f2 = -f0;
+         f0 -= t;
+         return boost::math::make_tuple(f0, f1, f2);
+      }
+   private:
+      RR t;
+   };
+
+   inline RR asin(RR z)
+   {
+      double r;
+      conv(r, z.value());
+      return boost::math::tools::halley_iterate(
+         asin_root(z), 
+         RR(std::asin(r)), 
+         RR(-boost::math::constants::pi<RR>()/2),
+         RR(boost::math::constants::pi<RR>()/2),
+         NTL::RR::precision());
+   }
+
+   struct acos_root
+   {
+      acos_root(RR const& target) : t(target){}
+
+      boost::math::tuple<RR, RR, RR> operator()(RR const& p)
+      {
+         RR f0 = cos(p);
+         RR f1 = -sin(p);
+         RR f2 = -f0;
+         f0 -= t;
+         return boost::math::make_tuple(f0, f1, f2);
+      }
+   private:
+      RR t;
+   };
+
+   inline RR acos(RR z)
+   {
+      double r;
+      conv(r, z.value());
+      return boost::math::tools::halley_iterate(
+         acos_root(z), 
+         RR(std::acos(r)), 
+         RR(-boost::math::constants::pi<RR>()/2),
+         RR(boost::math::constants::pi<RR>()/2),
+         NTL::RR::precision());
+   }
+
+   struct atan_root
+   {
+      atan_root(RR const& target) : t(target){}
+
+      boost::math::tuple<RR, RR, RR> operator()(RR const& p)
+      {
+         RR c = cos(p);
+         RR ta = tan(p);
+         RR f0 = ta - t;
+         RR f1 = 1 / (c * c);
+         RR f2 = 2 * ta / (c * c);
+         return boost::math::make_tuple(f0, f1, f2);
+      }
+   private:
+      RR t;
+   };
+
+   inline RR atan(RR z)
+   {
+      double r;
+      conv(r, z.value());
+      return boost::math::tools::halley_iterate(
+         atan_root(z), 
+         RR(std::atan(r)), 
+         -boost::math::constants::pi<RR>()/2,
+         boost::math::constants::pi<RR>()/2,
+         NTL::RR::precision());
+   }
+
+   inline RR atan2(RR y, RR x)
+   {
+      if(x > 0)
+         return atan(y / x);
+      if(x < 0)
+      {
+         return y < 0 ? atan(y / x) - boost::math::constants::pi<RR>() : atan(y / x) + boost::math::constants::pi<RR>();
+      }
+      return y < 0 ? -boost::math::constants::half_pi<RR>() : boost::math::constants::half_pi<RR>() ;
+   }
+
+   inline RR sinh(RR z)
+   {
+      return (expm1(z.value()) - expm1(-z.value())) / 2;
+   }
+
+   inline RR cosh(RR z)
+   {
+      return (exp(z) + exp(-z)) / 2;
+   }
+
+   inline RR tanh(RR z)
+   {
+      return sinh(z) / cosh(z);
+   }
+
+   inline RR fmod(RR x, RR y)
+   {
+      // This is a really crummy version of fmod, we rely on lots
+      // of digits to get us out of trouble...
+      RR factor = floor(x/y);
+      return x - factor * y;
+   }
+
+   template <class Policy>
+   inline int iround(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<int>(round(x, pol));
+   }
+
+   template <class Policy>
+   inline long lround(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long>(round(x, pol));
+   }
+
+   template <class Policy>
+   inline long long llround(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long long>(round(x, pol));
+   }
+
+   template <class Policy>
+   inline int itrunc(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<int>(trunc(x, pol));
+   }
+
+   template <class Policy>
+   inline long ltrunc(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long>(trunc(x, pol));
+   }
+
+   template <class Policy>
+   inline long long lltrunc(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long long>(trunc(x, pol));
+   }
+
+} // namespace ntl
+
+namespace detail{
+
+template <class Policy>
+ntl::RR digamma_imp(ntl::RR x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   ntl::RR result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      ntl::RR remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<ntl::RR>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<ntl::RR>() / tan(constants::pi<ntl::RR>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+
+} // namespace detail
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_REAL_CONCEPT_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/common_factor.hpp b/gatb-core/thirdparty/boost/math/common_factor.hpp
new file mode 100644
index 0000000..21a71e4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/common_factor.hpp
@@ -0,0 +1,16 @@
+//  Boost common_factor.hpp header file  -------------------------------------//
+
+//  (C) Copyright Daryle Walker 2001-2002.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_MATH_COMMON_FACTOR_HPP
+#define BOOST_MATH_COMMON_FACTOR_HPP
+
+#include <boost/math/common_factor_ct.hpp>
+#include <boost/math/common_factor_rt.hpp>
+
+#endif  // BOOST_MATH_COMMON_FACTOR_HPP
diff --git a/gatb-core/thirdparty/boost/math/common_factor_ct.hpp b/gatb-core/thirdparty/boost/math/common_factor_ct.hpp
new file mode 100644
index 0000000..bf58b94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/common_factor_ct.hpp
@@ -0,0 +1,97 @@
+//  Boost common_factor_ct.hpp header file  ----------------------------------//
+
+//  (C) Copyright Daryle Walker and Stephen Cleary 2001-2002.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_MATH_COMMON_FACTOR_CT_HPP
+#define BOOST_MATH_COMMON_FACTOR_CT_HPP
+
+#include <boost/math_fwd.hpp>  // self include
+#include <boost/config.hpp>  // for BOOST_STATIC_CONSTANT, etc.
+#include <boost/mpl/integral_c.hpp>
+
+namespace boost
+{
+namespace math
+{
+
+//  Implementation details  --------------------------------------------------//
+
+namespace detail
+{
+    // Build GCD with Euclid's recursive algorithm
+    template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_gcd_helper_t
+    {
+    private:
+        BOOST_STATIC_CONSTANT( static_gcd_type, new_value1 = Value2 );
+        BOOST_STATIC_CONSTANT( static_gcd_type, new_value2 = Value1 % Value2 );
+
+        #ifndef __BORLANDC__
+        #define BOOST_DETAIL_GCD_HELPER_VAL(Value) static_cast<static_gcd_type>(Value)
+        #else
+        typedef static_gcd_helper_t  self_type;
+        #define BOOST_DETAIL_GCD_HELPER_VAL(Value)  (self_type:: Value )
+        #endif
+
+        typedef static_gcd_helper_t< BOOST_DETAIL_GCD_HELPER_VAL(new_value1),
+         BOOST_DETAIL_GCD_HELPER_VAL(new_value2) >  next_step_type;
+
+        #undef BOOST_DETAIL_GCD_HELPER_VAL
+
+    public:
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = next_step_type::value );
+    };
+
+    // Non-recursive case
+    template < static_gcd_type Value1 >
+    struct static_gcd_helper_t< Value1, 0UL >
+    {
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 );
+    };
+
+    // Build the LCM from the GCD
+    template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_lcm_helper_t
+    {
+        typedef static_gcd_helper_t<Value1, Value2>  gcd_type;
+
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 / gcd_type::value
+         * Value2 );
+    };
+
+    // Special case for zero-GCD values
+    template < >
+    struct static_lcm_helper_t< 0UL, 0UL >
+    {
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = 0UL );
+    };
+
+}  // namespace detail
+
+
+//  Compile-time greatest common divisor evaluator class declaration  --------//
+
+template < static_gcd_type Value1, static_gcd_type Value2 >
+struct static_gcd : public mpl::integral_c<static_gcd_type, (detail::static_gcd_helper_t<Value1, Value2>::value) >
+{
+};  // boost::math::static_gcd
+
+
+//  Compile-time least common multiple evaluator class declaration  ----------//
+
+template < static_gcd_type Value1, static_gcd_type Value2 >
+struct static_lcm : public mpl::integral_c<static_gcd_type, (detail::static_lcm_helper_t<Value1, Value2>::value) >
+{
+};  // boost::math::static_lcm
+
+
+}  // namespace math
+}  // namespace boost
+
+
+#endif  // BOOST_MATH_COMMON_FACTOR_CT_HPP
diff --git a/gatb-core/thirdparty/boost/math/common_factor_rt.hpp b/gatb-core/thirdparty/boost/math/common_factor_rt.hpp
new file mode 100644
index 0000000..10a92eb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/common_factor_rt.hpp
@@ -0,0 +1,460 @@
+//  Boost common_factor_rt.hpp header file  ----------------------------------//
+
+//  (C) Copyright Daryle Walker and Paul Moore 2001-2002.  Permission to copy,
+//  use, modify, sell and distribute this software is granted provided this
+//  copyright notice appears in all copies.  This software is provided "as is"
+//  without express or implied warranty, and with no claim as to its suitability
+//  for any purpose. 
+
+// boostinspect:nolicense (don't complain about the lack of a Boost license)
+// (Paul Moore hasn't been in contact for years, so there's no way to change the
+// license.)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_MATH_COMMON_FACTOR_RT_HPP
+#define BOOST_MATH_COMMON_FACTOR_RT_HPP
+
+#include <boost/math_fwd.hpp>  // self include
+
+#include <boost/config.hpp>  // for BOOST_NESTED_TEMPLATE, etc.
+#include <boost/limits.hpp>  // for std::numeric_limits
+#include <climits>           // for CHAR_MIN
+#include <boost/detail/workaround.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127 4244)  // Conditional expression is constant
+#endif
+
+namespace boost
+{
+namespace math
+{
+
+
+//  Forward declarations for function templates  -----------------------------//
+
+template < typename IntegerType >
+    IntegerType  gcd( IntegerType const &a, IntegerType const &b );
+
+template < typename IntegerType >
+    IntegerType  lcm( IntegerType const &a, IntegerType const &b );
+
+
+//  Greatest common divisor evaluator class declaration  ---------------------//
+
+template < typename IntegerType >
+class gcd_evaluator
+{
+public:
+    // Types
+    typedef IntegerType  result_type, first_argument_type, second_argument_type;
+
+    // Function object interface
+    result_type  operator ()( first_argument_type const &a,
+     second_argument_type const &b ) const;
+
+};  // boost::math::gcd_evaluator
+
+
+//  Least common multiple evaluator class declaration  -----------------------//
+
+template < typename IntegerType >
+class lcm_evaluator
+{
+public:
+    // Types
+    typedef IntegerType  result_type, first_argument_type, second_argument_type;
+
+    // Function object interface
+    result_type  operator ()( first_argument_type const &a,
+     second_argument_type const &b ) const;
+
+};  // boost::math::lcm_evaluator
+
+
+//  Implementation details  --------------------------------------------------//
+
+namespace detail
+{
+    // Greatest common divisor for rings (including unsigned integers)
+    template < typename RingType >
+    RingType
+    gcd_euclidean
+    (
+        RingType a,
+        RingType b
+    )
+    {
+        // Avoid repeated construction
+        #ifndef __BORLANDC__
+        RingType const  zero = static_cast<RingType>( 0 );
+        #else
+        RingType  zero = static_cast<RingType>( 0 );
+        #endif
+
+        // Reduce by GCD-remainder property [GCD(a,b) == GCD(b,a MOD b)]
+        while ( true )
+        {
+            if ( a == zero )
+                return b;
+            b %= a;
+
+            if ( b == zero )
+                return a;
+            a %= b;
+        }
+    }
+
+    // Greatest common divisor for (signed) integers
+    template < typename IntegerType >
+    inline
+    IntegerType
+    gcd_integer
+    (
+        IntegerType const &  a,
+        IntegerType const &  b
+    )
+    {
+        // Avoid repeated construction
+        IntegerType const  zero = static_cast<IntegerType>( 0 );
+        IntegerType const  result = gcd_euclidean( a, b );
+
+        return ( result < zero ) ? static_cast<IntegerType>(-result) : result;
+    }
+
+    // Greatest common divisor for unsigned binary integers
+    template < typename BuiltInUnsigned >
+    BuiltInUnsigned
+    gcd_binary
+    (
+        BuiltInUnsigned  u,
+        BuiltInUnsigned  v
+    )
+    {
+        if ( u && v )
+        {
+            // Shift out common factors of 2
+            unsigned  shifts = 0;
+
+            while ( !(u & 1u) && !(v & 1u) )
+            {
+                ++shifts;
+                u >>= 1;
+                v >>= 1;
+            }
+
+            // Start with the still-even one, if any
+            BuiltInUnsigned  r[] = { u, v };
+            unsigned         which = static_cast<bool>( u & 1u );
+
+            // Whittle down the values via their differences
+            do
+            {
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+                while ( !(r[ which ] & 1u) )
+                {
+                    r[ which ] = (r[which] >> 1);
+                }
+#else
+                // Remove factors of two from the even one
+                while ( !(r[ which ] & 1u) )
+                {
+                    r[ which ] >>= 1;
+                }
+#endif
+
+                // Replace the larger of the two with their difference
+                if ( r[!which] > r[which] )
+                {
+                    which ^= 1u;
+                }
+
+                r[ which ] -= r[ !which ];
+            }
+            while ( r[which] );
+
+            // Shift-in the common factor of 2 to the residues' GCD
+            return r[ !which ] << shifts;
+        }
+        else
+        {
+            // At least one input is zero, return the other
+            // (adding since zero is the additive identity)
+            // or zero if both are zero.
+            return u + v;
+        }
+    }
+
+    // Least common multiple for rings (including unsigned integers)
+    template < typename RingType >
+    inline
+    RingType
+    lcm_euclidean
+    (
+        RingType const &  a,
+        RingType const &  b
+    )
+    {
+        RingType const  zero = static_cast<RingType>( 0 );
+        RingType const  temp = gcd_euclidean( a, b );
+
+        return ( temp != zero ) ? ( a / temp * b ) : zero;
+    }
+
+    // Least common multiple for (signed) integers
+    template < typename IntegerType >
+    inline
+    IntegerType
+    lcm_integer
+    (
+        IntegerType const &  a,
+        IntegerType const &  b
+    )
+    {
+        // Avoid repeated construction
+        IntegerType const  zero = static_cast<IntegerType>( 0 );
+        IntegerType const  result = lcm_euclidean( a, b );
+
+        return ( result < zero ) ? static_cast<IntegerType>(-result) : result;
+    }
+
+    // Function objects to find the best way of computing GCD or LCM
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T, bool IsSpecialized, bool IsSigned >
+    struct gcd_optimal_evaluator_helper_t
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_euclidean( a, b );
+        }
+    };
+
+    template < typename T >
+    struct gcd_optimal_evaluator_helper_t< T, true, true >
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_integer( a, b );
+        }
+    };
+
+    template < typename T >
+    struct gcd_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            typedef ::std::numeric_limits<T>  limits_type;
+
+            typedef gcd_optimal_evaluator_helper_t<T,
+             limits_type::is_specialized, limits_type::is_signed>  helper_type;
+
+            helper_type  solver;
+
+            return solver( a, b );
+        }
+    };
+#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T >
+    struct gcd_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_integer( a, b );
+        }
+    };
+#endif
+
+    // Specialize for the built-in integers
+#define BOOST_PRIVATE_GCD_UF( Ut )                  \
+    template < >  struct gcd_optimal_evaluator<Ut>  \
+    {  Ut  operator ()( Ut a, Ut b ) const  { return gcd_binary( a, b ); }  }
+
+    BOOST_PRIVATE_GCD_UF( unsigned char );
+    BOOST_PRIVATE_GCD_UF( unsigned short );
+    BOOST_PRIVATE_GCD_UF( unsigned );
+    BOOST_PRIVATE_GCD_UF( unsigned long );
+
+#ifdef BOOST_HAS_LONG_LONG
+    BOOST_PRIVATE_GCD_UF( boost::ulong_long_type );
+#elif defined(BOOST_HAS_MS_INT64)
+    BOOST_PRIVATE_GCD_UF( unsigned __int64 );
+#endif
+
+#if CHAR_MIN == 0
+    BOOST_PRIVATE_GCD_UF( char ); // char is unsigned
+#endif
+
+#undef BOOST_PRIVATE_GCD_UF
+
+#define BOOST_PRIVATE_GCD_SF( St, Ut )                            \
+    template < >  struct gcd_optimal_evaluator<St>                \
+    {  St  operator ()( St a, St b ) const  { Ut const  a_abs =   \
+    static_cast<Ut>( a < 0 ? -a : +a ), b_abs = static_cast<Ut>(  \
+    b < 0 ? -b : +b ); return static_cast<St>(                    \
+    gcd_optimal_evaluator<Ut>()(a_abs, b_abs) ); }  }
+
+    BOOST_PRIVATE_GCD_SF( signed char, unsigned char );
+    BOOST_PRIVATE_GCD_SF( short, unsigned short );
+    BOOST_PRIVATE_GCD_SF( int, unsigned );
+    BOOST_PRIVATE_GCD_SF( long, unsigned long );
+
+#if CHAR_MIN < 0
+    BOOST_PRIVATE_GCD_SF( char, unsigned char ); // char is signed
+#endif
+
+#ifdef BOOST_HAS_LONG_LONG
+    BOOST_PRIVATE_GCD_SF( boost::long_long_type, boost::ulong_long_type );
+#elif defined(BOOST_HAS_MS_INT64)
+    BOOST_PRIVATE_GCD_SF( __int64, unsigned __int64 );
+#endif
+
+#undef BOOST_PRIVATE_GCD_SF
+
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T, bool IsSpecialized, bool IsSigned >
+    struct lcm_optimal_evaluator_helper_t
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_euclidean( a, b );
+        }
+    };
+
+    template < typename T >
+    struct lcm_optimal_evaluator_helper_t< T, true, true >
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_integer( a, b );
+        }
+    };
+
+    template < typename T >
+    struct lcm_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            typedef ::std::numeric_limits<T>  limits_type;
+
+            typedef lcm_optimal_evaluator_helper_t<T,
+             limits_type::is_specialized, limits_type::is_signed>  helper_type;
+
+            helper_type  solver;
+
+            return solver( a, b );
+        }
+    };
+#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T >
+    struct lcm_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_integer( a, b );
+        }
+    };
+#endif
+
+    // Functions to find the GCD or LCM in the best way
+    template < typename T >
+    inline
+    T
+    gcd_optimal
+    (
+        T const &  a,
+        T const &  b
+    )
+    {
+        gcd_optimal_evaluator<T>  solver;
+
+        return solver( a, b );
+    }
+
+    template < typename T >
+    inline
+    T
+    lcm_optimal
+    (
+        T const &  a,
+        T const &  b
+    )
+    {
+        lcm_optimal_evaluator<T>  solver;
+
+        return solver( a, b );
+    }
+
+}  // namespace detail
+
+
+//  Greatest common divisor evaluator member function definition  ------------//
+
+template < typename IntegerType >
+inline
+typename gcd_evaluator<IntegerType>::result_type
+gcd_evaluator<IntegerType>::operator ()
+(
+    first_argument_type const &   a,
+    second_argument_type const &  b
+) const
+{
+    return detail::gcd_optimal( a, b );
+}
+
+
+//  Least common multiple evaluator member function definition  --------------//
+
+template < typename IntegerType >
+inline
+typename lcm_evaluator<IntegerType>::result_type
+lcm_evaluator<IntegerType>::operator ()
+(
+    first_argument_type const &   a,
+    second_argument_type const &  b
+) const
+{
+    return detail::lcm_optimal( a, b );
+}
+
+
+//  Greatest common divisor and least common multiple function definitions  --//
+
+template < typename IntegerType >
+inline
+IntegerType
+gcd
+(
+    IntegerType const &  a,
+    IntegerType const &  b
+)
+{
+    gcd_evaluator<IntegerType>  solver;
+
+    return solver( a, b );
+}
+
+template < typename IntegerType >
+inline
+IntegerType
+lcm
+(
+    IntegerType const &  a,
+    IntegerType const &  b
+)
+{
+    lcm_evaluator<IntegerType>  solver;
+
+    return solver( a, b );
+}
+
+
+}  // namespace math
+}  // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif  // BOOST_MATH_COMMON_FACTOR_RT_HPP
diff --git a/gatb-core/thirdparty/boost/math/complex.hpp b/gatb-core/thirdparty/boost/math/complex.hpp
new file mode 100644
index 0000000..8d9145e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex.hpp
@@ -0,0 +1,32 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_INCLUDED
+#define BOOST_MATH_COMPLEX_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_ASIN_INCLUDED
+#  include <boost/math/complex/asin.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ASINH_INCLUDED
+#  include <boost/math/complex/asinh.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ACOS_INCLUDED
+#  include <boost/math/complex/acos.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ACOSH_INCLUDED
+#  include <boost/math/complex/acosh.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ATAN_INCLUDED
+#  include <boost/math/complex/atan.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED
+#  include <boost/math/complex/atanh.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_FABS_INCLUDED
+#  include <boost/math/complex/fabs.hpp>
+#endif
+
+
+#endif // BOOST_MATH_COMPLEX_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/acos.hpp b/gatb-core/thirdparty/boost/math/complex/acos.hpp
new file mode 100644
index 0000000..a911756
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/acos.hpp
@@ -0,0 +1,245 @@
+//  (C) Copyright John Maddock 2005.
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ACOS_INCLUDED
+#define BOOST_MATH_COMPLEX_ACOS_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_LOG1P_INCLUDED
+#  include <boost/math/special_functions/log1p.hpp>
+#endif
+#include <boost/assert.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::sqrt; using ::fabs; using ::acos; using ::asin; using ::atan; using ::atan2; }
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+std::complex<T> acos(const std::complex<T>& z)
+{
+   //
+   // This implementation is a transcription of the pseudo-code in:
+   //
+   // "Implementing the Complex Arcsine and Arccosine Functions using Exception Handling."
+   // T E Hull, Thomas F Fairgrieve and Ping Tak Peter Tang.
+   // ACM Transactions on Mathematical Software, Vol 23, No 3, Sept 1997.
+   //
+
+   //
+   // These static constants should really be in a maths constants library,
+   // note that we have tweaked a_crossover as per: https://svn.boost.org/trac/boost/ticket/7290
+   //
+   static const T one = static_cast<T>(1);
+   //static const T two = static_cast<T>(2);
+   static const T half = static_cast<T>(0.5L);
+   static const T a_crossover = static_cast<T>(10);
+   static const T b_crossover = static_cast<T>(0.6417L);
+   static const T s_pi = boost::math::constants::pi<T>();
+   static const T half_pi = s_pi / 2;
+   static const T log_two = boost::math::constants::ln_two<T>();
+   static const T quarter_pi = s_pi / 4;
+   
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   //
+   // Get real and imaginary parts, discard the signs as we can 
+   // figure out the sign of the result later:
+   //
+   T x = std::fabs(z.real());
+   T y = std::fabs(z.imag());
+
+   T real, imag; // these hold our result
+
+   // 
+   // Handle special cases specified by the C99 standard,
+   // many of these special cases aren't really needed here,
+   // but doing it this way prevents overflow/underflow arithmetic
+   // in the main body of the logic, which may trip up some machines:
+   //
+   if((boost::math::isinf)(x))
+   {
+      if((boost::math::isinf)(y))
+      {
+         real = quarter_pi;
+         imag = std::numeric_limits<T>::infinity();
+      }
+      else if((boost::math::isnan)(y))
+      {
+         return std::complex<T>(y, -std::numeric_limits<T>::infinity());
+      }
+      else
+      {
+         // y is not infinity or nan:
+         real = 0;
+         imag = std::numeric_limits<T>::infinity();
+      }
+   }
+   else if((boost::math::isnan)(x))
+   {
+      if((boost::math::isinf)(y))
+         return std::complex<T>(x, ((boost::math::signbit)(z.imag())) ? std::numeric_limits<T>::infinity() :  -std::numeric_limits<T>::infinity());
+      return std::complex<T>(x, x);
+   }
+   else if((boost::math::isinf)(y))
+   {
+      real = half_pi;
+      imag = std::numeric_limits<T>::infinity();
+   }
+   else if((boost::math::isnan)(y))
+   {
+      return std::complex<T>((x == 0) ? half_pi : y, y);
+   }
+   else
+   {
+      //
+      // What follows is the regular Hull et al code,
+      // begin with the special case for real numbers:
+      //
+      if((y == 0) && (x <= one))
+         return std::complex<T>((x == 0) ? half_pi : std::acos(z.real()), (boost::math::changesign)(z.imag()));
+      //
+      // Figure out if our input is within the "safe area" identified by Hull et al.
+      // This would be more efficient with portable floating point exception handling;
+      // fortunately the quantities M and u identified by Hull et al (figure 3), 
+      // match with the max and min methods of numeric_limits<T>.
+      //
+      T safe_max = detail::safe_max(static_cast<T>(8));
+      T safe_min = detail::safe_min(static_cast<T>(4));
+
+      T xp1 = one + x;
+      T xm1 = x - one;
+
+      if((x < safe_max) && (x > safe_min) && (y < safe_max) && (y > safe_min))
+      {
+         T yy = y * y;
+         T r = std::sqrt(xp1*xp1 + yy);
+         T s = std::sqrt(xm1*xm1 + yy);
+         T a = half * (r + s);
+         T b = x / a;
+
+         if(b <= b_crossover)
+         {
+            real = std::acos(b);
+         }
+         else
+         {
+            T apx = a + x;
+            if(x <= one)
+            {
+               real = std::atan(std::sqrt(half * apx * (yy /(r + xp1) + (s-xm1)))/x);
+            }
+            else
+            {
+               real = std::atan((y * std::sqrt(half * (apx/(r + xp1) + apx/(s+xm1))))/x);
+            }
+         }
+
+         if(a <= a_crossover)
+         {
+            T am1;
+            if(x < one)
+            {
+               am1 = half * (yy/(r + xp1) + yy/(s - xm1));
+            }
+            else
+            {
+               am1 = half * (yy/(r + xp1) + (s + xm1));
+            }
+            imag = boost::math::log1p(am1 + std::sqrt(am1 * (a + one)));
+         }
+         else
+         {
+            imag = std::log(a + std::sqrt(a*a - one));
+         }
+      }
+      else
+      {
+         //
+         // This is the Hull et al exception handling code from Fig 6 of their paper:
+         //
+         if(y <= (std::numeric_limits<T>::epsilon() * std::fabs(xm1)))
+         {
+            if(x < one)
+            {
+               real = std::acos(x);
+               imag = y / std::sqrt(xp1*(one-x));
+            }
+            else
+            {
+               // This deviates from Hull et al's paper as per https://svn.boost.org/trac/boost/ticket/7290
+               if(((std::numeric_limits<T>::max)() / xp1) > xm1)
+               {
+                  // xp1 * xm1 won't overflow:
+                  real = y / std::sqrt(xm1*xp1);
+                  imag = boost::math::log1p(xm1 + std::sqrt(xp1*xm1));
+               }
+               else
+               {
+                  real = y / x;
+                  imag = log_two + std::log(x);
+               }
+            }
+         }
+         else if(y <= safe_min)
+         {
+            // There is an assumption in Hull et al's analysis that
+            // if we get here then x == 1.  This is true for all "good"
+            // machines where :
+            // 
+            // E^2 > 8*sqrt(u); with:
+            //
+            // E =  std::numeric_limits<T>::epsilon()
+            // u = (std::numeric_limits<T>::min)()
+            //
+            // Hull et al provide alternative code for "bad" machines
+            // but we have no way to test that here, so for now just assert
+            // on the assumption:
+            //
+            BOOST_ASSERT(x == 1);
+            real = std::sqrt(y);
+            imag = std::sqrt(y);
+         }
+         else if(std::numeric_limits<T>::epsilon() * y - one >= x)
+         {
+            real = half_pi;
+            imag = log_two + std::log(y);
+         }
+         else if(x > one)
+         {
+            real = std::atan(y/x);
+            T xoy = x/y;
+            imag = log_two + std::log(y) + half * boost::math::log1p(xoy*xoy);
+         }
+         else
+         {
+            real = half_pi;
+            T a = std::sqrt(one + y*y);
+            imag = half * boost::math::log1p(static_cast<T>(2)*y*(y+a));
+         }
+      }
+   }
+
+   //
+   // Finish off by working out the sign of the result:
+   //
+   if((boost::math::signbit)(z.real()))
+      real = s_pi - real;
+   if(!(boost::math::signbit)(z.imag()))
+      imag = (boost::math::changesign)(imag);
+
+   return std::complex<T>(real, imag);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ACOS_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/acosh.hpp b/gatb-core/thirdparty/boost/math/complex/acosh.hpp
new file mode 100644
index 0000000..4f987cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/acosh.hpp
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ACOSH_INCLUDED
+#define BOOST_MATH_COMPLEX_ACOSH_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED
+#  include <boost/math/complex/acos.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline std::complex<T> acosh(const std::complex<T>& z)
+{
+   //
+   // We use the relation acosh(z) = +-i acos(z)
+   // Choosing the sign of multiplier to give real(acosh(z)) >= 0
+   // as well as compatibility with C99.
+   //
+   std::complex<T> result = boost::math::acos(z);
+   if(!(boost::math::isnan)(result.imag()) && signbit(result.imag()))
+      return detail::mult_i(result);
+   return detail::mult_minus_i(result);
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ACOSH_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/asin.hpp b/gatb-core/thirdparty/boost/math/complex/asin.hpp
new file mode 100644
index 0000000..087c3b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/asin.hpp
@@ -0,0 +1,252 @@
+//  (C) Copyright John Maddock 2005.
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ASIN_INCLUDED
+#define BOOST_MATH_COMPLEX_ASIN_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_LOG1P_INCLUDED
+#  include <boost/math/special_functions/log1p.hpp>
+#endif
+#include <boost/assert.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::sqrt; using ::fabs; using ::acos; using ::asin; using ::atan; using ::atan2; }
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline std::complex<T> asin(const std::complex<T>& z)
+{
+   //
+   // This implementation is a transcription of the pseudo-code in:
+   //
+   // "Implementing the complex Arcsine and Arccosine Functions using Exception Handling."
+   // T E Hull, Thomas F Fairgrieve and Ping Tak Peter Tang.
+   // ACM Transactions on Mathematical Software, Vol 23, No 3, Sept 1997.
+   //
+
+   //
+   // These static constants should really be in a maths constants library,
+   // note that we have tweaked the value of a_crossover as per https://svn.boost.org/trac/boost/ticket/7290:
+   //
+   static const T one = static_cast<T>(1);
+   //static const T two = static_cast<T>(2);
+   static const T half = static_cast<T>(0.5L);
+   static const T a_crossover = static_cast<T>(10);
+   static const T b_crossover = static_cast<T>(0.6417L);
+   static const T s_pi = boost::math::constants::pi<T>();
+   static const T half_pi = s_pi / 2;
+   static const T log_two = boost::math::constants::ln_two<T>();
+   static const T quarter_pi = s_pi / 4;
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   //
+   // Get real and imaginary parts, discard the signs as we can 
+   // figure out the sign of the result later:
+   //
+   T x = std::fabs(z.real());
+   T y = std::fabs(z.imag());
+   T real, imag;  // our results
+
+   //
+   // Begin by handling the special cases for infinities and nan's
+   // specified in C99, most of this is handled by the regular logic
+   // below, but handling it as a special case prevents overflow/underflow
+   // arithmetic which may trip up some machines:
+   //
+   if((boost::math::isnan)(x))
+   {
+      if((boost::math::isnan)(y))
+         return std::complex<T>(x, x);
+      if((boost::math::isinf)(y))
+      {
+         real = x;
+         imag = std::numeric_limits<T>::infinity();
+      }
+      else
+         return std::complex<T>(x, x);
+   }
+   else if((boost::math::isnan)(y))
+   {
+      if(x == 0)
+      {
+         real = 0;
+         imag = y;
+      }
+      else if((boost::math::isinf)(x))
+      {
+         real = y;
+         imag = std::numeric_limits<T>::infinity();
+      }
+      else
+         return std::complex<T>(y, y);
+   }
+   else if((boost::math::isinf)(x))
+   {
+      if((boost::math::isinf)(y))
+      {
+         real = quarter_pi;
+         imag = std::numeric_limits<T>::infinity();
+      }
+      else
+      {
+         real = half_pi;
+         imag = std::numeric_limits<T>::infinity();
+      }
+   }
+   else if((boost::math::isinf)(y))
+   {
+      real = 0;
+      imag = std::numeric_limits<T>::infinity();
+   }
+   else
+   {
+      //
+      // special case for real numbers:
+      //
+      if((y == 0) && (x <= one))
+         return std::complex<T>(std::asin(z.real()), z.imag());
+      //
+      // Figure out if our input is within the "safe area" identified by Hull et al.
+      // This would be more efficient with portable floating point exception handling;
+      // fortunately the quantities M and u identified by Hull et al (figure 3), 
+      // match with the max and min methods of numeric_limits<T>.
+      //
+      T safe_max = detail::safe_max(static_cast<T>(8));
+      T safe_min = detail::safe_min(static_cast<T>(4));
+
+      T xp1 = one + x;
+      T xm1 = x - one;
+
+      if((x < safe_max) && (x > safe_min) && (y < safe_max) && (y > safe_min))
+      {
+         T yy = y * y;
+         T r = std::sqrt(xp1*xp1 + yy);
+         T s = std::sqrt(xm1*xm1 + yy);
+         T a = half * (r + s);
+         T b = x / a;
+
+         if(b <= b_crossover)
+         {
+            real = std::asin(b);
+         }
+         else
+         {
+            T apx = a + x;
+            if(x <= one)
+            {
+               real = std::atan(x/std::sqrt(half * apx * (yy /(r + xp1) + (s-xm1))));
+            }
+            else
+            {
+               real = std::atan(x/(y * std::sqrt(half * (apx/(r + xp1) + apx/(s+xm1)))));
+            }
+         }
+
+         if(a <= a_crossover)
+         {
+            T am1;
+            if(x < one)
+            {
+               am1 = half * (yy/(r + xp1) + yy/(s - xm1));
+            }
+            else
+            {
+               am1 = half * (yy/(r + xp1) + (s + xm1));
+            }
+            imag = boost::math::log1p(am1 + std::sqrt(am1 * (a + one)));
+         }
+         else
+         {
+            imag = std::log(a + std::sqrt(a*a - one));
+         }
+      }
+      else
+      {
+         //
+         // This is the Hull et al exception handling code from Fig 3 of their paper:
+         //
+         if(y <= (std::numeric_limits<T>::epsilon() * std::fabs(xm1)))
+         {
+            if(x < one)
+            {
+               real = std::asin(x);
+               imag = y / std::sqrt(-xp1*xm1);
+            }
+            else
+            {
+               real = half_pi;
+               if(((std::numeric_limits<T>::max)() / xp1) > xm1)
+               {
+                  // xp1 * xm1 won't overflow:
+                  imag = boost::math::log1p(xm1 + std::sqrt(xp1*xm1));
+               }
+               else
+               {
+                  imag = log_two + std::log(x);
+               }
+            }
+         }
+         else if(y <= safe_min)
+         {
+            // There is an assumption in Hull et al's analysis that
+            // if we get here then x == 1.  This is true for all "good"
+            // machines where :
+            // 
+            // E^2 > 8*sqrt(u); with:
+            //
+            // E =  std::numeric_limits<T>::epsilon()
+            // u = (std::numeric_limits<T>::min)()
+            //
+            // Hull et al provide alternative code for "bad" machines
+            // but we have no way to test that here, so for now just assert
+            // on the assumption:
+            //
+            BOOST_ASSERT(x == 1);
+            real = half_pi - std::sqrt(y);
+            imag = std::sqrt(y);
+         }
+         else if(std::numeric_limits<T>::epsilon() * y - one >= x)
+         {
+            real = x/y; // This can underflow!
+            imag = log_two + std::log(y);
+         }
+         else if(x > one)
+         {
+            real = std::atan(x/y);
+            T xoy = x/y;
+            imag = log_two + std::log(y) + half * boost::math::log1p(xoy*xoy);
+         }
+         else
+         {
+            T a = std::sqrt(one + y*y);
+            real = x/a; // This can underflow!
+            imag = half * boost::math::log1p(static_cast<T>(2)*y*(y+a));
+         }
+      }
+   }
+
+   //
+   // Finish off by working out the sign of the result:
+   //
+   if((boost::math::signbit)(z.real()))
+      real = (boost::math::changesign)(real);
+   if((boost::math::signbit)(z.imag()))
+      imag = (boost::math::changesign)(imag);
+
+   return std::complex<T>(real, imag);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ASIN_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/asinh.hpp b/gatb-core/thirdparty/boost/math/complex/asinh.hpp
new file mode 100644
index 0000000..6761cfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/asinh.hpp
@@ -0,0 +1,32 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ASINH_INCLUDED
+#define BOOST_MATH_COMPLEX_ASINH_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ASIN_INCLUDED
+#  include <boost/math/complex/asin.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline std::complex<T> asinh(const std::complex<T>& x)
+{
+   //
+   // We use asinh(z) = i asin(-i z);
+   // Note that C99 defines this the other way around (which is
+   // to say asin is specified in terms of asinh), this is consistent
+   // with C99 though:
+   //
+   return ::boost::math::detail::mult_i(::boost::math::asin(::boost::math::detail::mult_minus_i(x)));
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ASINH_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/atan.hpp b/gatb-core/thirdparty/boost/math/complex/atan.hpp
new file mode 100644
index 0000000..a210416
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/atan.hpp
@@ -0,0 +1,36 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ATAN_INCLUDED
+#define BOOST_MATH_COMPLEX_ATAN_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED
+#  include <boost/math/complex/atanh.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+std::complex<T> atan(const std::complex<T>& x)
+{
+   //
+   // We're using the C99 definition here; atan(z) = -i atanh(iz):
+   //
+   if(x.real() == 0)
+   {
+      if(x.imag() == 1)
+         return std::complex<T>(0, std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : static_cast<T>(HUGE_VAL));
+      if(x.imag() == -1)
+         return std::complex<T>(0, std::numeric_limits<T>::has_infinity ? -std::numeric_limits<T>::infinity() : -static_cast<T>(HUGE_VAL));
+   }
+   return ::boost::math::detail::mult_minus_i(::boost::math::atanh(::boost::math::detail::mult_i(x)));
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ATAN_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/atanh.hpp b/gatb-core/thirdparty/boost/math/complex/atanh.hpp
new file mode 100644
index 0000000..66f4599
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/atanh.hpp
@@ -0,0 +1,214 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_ATANH_INCLUDED
+#define BOOST_MATH_COMPLEX_ATANH_INCLUDED
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#  include <boost/math/complex/details.hpp>
+#endif
+#ifndef BOOST_MATH_LOG1P_INCLUDED
+#  include <boost/math/special_functions/log1p.hpp>
+#endif
+#include <boost/assert.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::sqrt; using ::fabs; using ::acos; using ::asin; using ::atan; using ::atan2; }
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+std::complex<T> atanh(const std::complex<T>& z)
+{
+   //
+   // References:
+   //
+   // Eric W. Weisstein. "Inverse Hyperbolic Tangent." 
+   // From MathWorld--A Wolfram Web Resource. 
+   // http://mathworld.wolfram.com/InverseHyperbolicTangent.html
+   //
+   // Also: The Wolfram Functions Site,
+   // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/
+   //
+   // Also "Abramowitz and Stegun. Handbook of Mathematical Functions."
+   // at : http://jove.prohosting.com/~skripty/toc.htm
+   //
+   // See also: https://svn.boost.org/trac/boost/ticket/7291
+   //
+   
+   static const T pi = boost::math::constants::pi<T>();
+   static const T half_pi = pi / 2;
+   static const T one = static_cast<T>(1.0L);
+   static const T two = static_cast<T>(2.0L);
+   static const T four = static_cast<T>(4.0L);
+   static const T zero = static_cast<T>(0);
+   static const T log_two = boost::math::constants::ln_two<T>();
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
+   T x = std::fabs(z.real());
+   T y = std::fabs(z.imag());
+
+   T real, imag;  // our results
+
+   T safe_upper = detail::safe_max(two);
+   T safe_lower = detail::safe_min(static_cast<T>(2));
+
+   //
+   // Begin by handling the special cases specified in C99:
+   //
+   if((boost::math::isnan)(x))
+   {
+      if((boost::math::isnan)(y))
+         return std::complex<T>(x, x);
+      else if((boost::math::isinf)(y))
+         return std::complex<T>(0, ((boost::math::signbit)(z.imag()) ? -half_pi : half_pi));
+      else
+         return std::complex<T>(x, x);
+   }
+   else if((boost::math::isnan)(y))
+   {
+      if(x == 0)
+         return std::complex<T>(x, y);
+      if((boost::math::isinf)(x))
+         return std::complex<T>(0, y);
+      else
+         return std::complex<T>(y, y);
+   }
+   else if((x > safe_lower) && (x < safe_upper) && (y > safe_lower) && (y < safe_upper))
+   {
+
+      T yy = y*y;
+      T mxm1 = one - x;
+      ///
+      // The real part is given by:
+      // 
+      // real(atanh(z)) == log1p(4*x / ((x-1)*(x-1) + y^2))
+      // 
+      real = boost::math::log1p(four * x / (mxm1*mxm1 + yy));
+      real /= four;
+      if((boost::math::signbit)(z.real()))
+         real = (boost::math::changesign)(real);
+
+      imag = std::atan2((y * two), (mxm1*(one+x) - yy));
+      imag /= two;
+      if(z.imag() < 0)
+         imag = (boost::math::changesign)(imag);
+   }
+   else
+   {
+      //
+      // This section handles exception cases that would normally cause
+      // underflow or overflow in the main formulas.
+      //
+      // Begin by working out the real part, we need to approximate
+      //    real = boost::math::log1p(4x / ((x-1)^2 + y^2))
+      // without either overflow or underflow in the squared terms.
+      //
+      T mxm1 = one - x;
+      if(x >= safe_upper)
+      {
+         // x-1 = x to machine precision:
+         if((boost::math::isinf)(x) || (boost::math::isinf)(y))
+         {
+            real = 0;
+         }
+         else if(y >= safe_upper)
+         {
+            // Big x and y: divide through by x*y:
+            real = boost::math::log1p((four/y) / (x/y + y/x));
+         }
+         else if(y > one)
+         {
+            // Big x: divide through by x:
+            real = boost::math::log1p(four / (x + y*y/x));
+         }
+         else
+         {
+            // Big x small y, as above but neglect y^2/x:
+            real = boost::math::log1p(four/x);
+         }
+      }
+      else if(y >= safe_upper)
+      {
+         if(x > one)
+         {
+            // Big y, medium x, divide through by y:
+            real = boost::math::log1p((four*x/y) / (y + mxm1*mxm1/y));
+         }
+         else
+         {
+            // Small or medium x, large y:
+            real = four*x/y/y;
+         }
+      }
+      else if (x != one)
+      {
+         // y is small, calculate divisor carefully:
+         T div = mxm1*mxm1;
+         if(y > safe_lower)
+            div += y*y;
+         real = boost::math::log1p(four*x/div);
+      }
+      else
+         real = boost::math::changesign(two * (std::log(y) - log_two));
+
+      real /= four;
+      if((boost::math::signbit)(z.real()))
+         real = (boost::math::changesign)(real);
+
+      //
+      // Now handle imaginary part, this is much easier,
+      // if x or y are large, then the formula:
+      //    atan2(2y, (1-x)*(1+x) - y^2)
+      // evaluates to +-(PI - theta) where theta is negligible compared to PI.
+      //
+      if((x >= safe_upper) || (y >= safe_upper))
+      {
+         imag = pi;
+      }
+      else if(x <= safe_lower)
+      {
+         //
+         // If both x and y are small then atan(2y),
+         // otherwise just x^2 is negligible in the divisor:
+         //
+         if(y <= safe_lower)
+            imag = std::atan2(two*y, one);
+         else
+         {
+            if((y == zero) && (x == zero))
+               imag = 0;
+            else
+               imag = std::atan2(two*y, one - y*y);
+         }
+      }
+      else
+      {
+         //
+         // y^2 is negligible:
+         //
+         if((y == zero) && (x == one))
+            imag = 0;
+         else
+            imag = std::atan2(two*y, mxm1*(one+x));
+      }
+      imag /= two;
+      if((boost::math::signbit)(z.imag()))
+         imag = (boost::math::changesign)(imag);
+   }
+   return std::complex<T>(real, imag);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_ATANH_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/complex/details.hpp b/gatb-core/thirdparty/boost/math/complex/details.hpp
new file mode 100644
index 0000000..46c61f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/details.hpp
@@ -0,0 +1,96 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+#define BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+//
+// This header contains all the support code that is common to the
+// inverse trig complex functions, it also contains all the includes
+// that we need to implement all these functions.
+//
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/config/no_tr1/complex.hpp>
+#include <boost/limits.hpp>
+#include <math.h> // isnan where available
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/constants/constants.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::sqrt; }
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline T mult_minus_one(const T& t)
+{
+   return (boost::math::isnan)(t) ? t : (boost::math::changesign)(t);
+}
+
+template <class T>
+inline std::complex<T> mult_i(const std::complex<T>& t)
+{
+   return std::complex<T>(mult_minus_one(t.imag()), t.real());
+}
+
+template <class T>
+inline std::complex<T> mult_minus_i(const std::complex<T>& t)
+{
+   return std::complex<T>(t.imag(), mult_minus_one(t.real()));
+}
+
+template <class T>
+inline T safe_max(T t)
+{
+   return std::sqrt((std::numeric_limits<T>::max)()) / t;
+}
+inline long double safe_max(long double t)
+{
+   // long double sqrt often returns infinity due to
+   // insufficient internal precision:
+   return std::sqrt((std::numeric_limits<double>::max)()) / t;
+}
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+// workaround for type deduction bug:
+inline float safe_max(float t)
+{
+   return std::sqrt((std::numeric_limits<float>::max)()) / t;
+}
+inline double safe_max(double t)
+{
+   return std::sqrt((std::numeric_limits<double>::max)()) / t;
+}
+#endif
+template <class T>
+inline T safe_min(T t)
+{
+   return std::sqrt((std::numeric_limits<T>::min)()) * t;
+}
+inline long double safe_min(long double t)
+{
+   // long double sqrt often returns zero due to
+   // insufficient internal precision:
+   return std::sqrt((std::numeric_limits<double>::min)()) * t;
+}
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+// type deduction workaround:
+inline double safe_min(double t)
+{
+   return std::sqrt((std::numeric_limits<double>::min)()) * t;
+}
+inline float safe_min(float t)
+{
+   return std::sqrt((std::numeric_limits<float>::min)()) * t;
+}
+#endif
+
+} } } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_DETAILS_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/math/complex/fabs.hpp b/gatb-core/thirdparty/boost/math/complex/fabs.hpp
new file mode 100644
index 0000000..5eb8b3b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/complex/fabs.hpp
@@ -0,0 +1,23 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COMPLEX_FABS_INCLUDED
+#define BOOST_MATH_COMPLEX_FABS_INCLUDED
+
+#ifndef BOOST_MATH_HYPOT_INCLUDED
+#  include <boost/math/special_functions/hypot.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+template<class T> 
+inline T fabs(const std::complex<T>& z)
+{
+   return ::boost::math::hypot(z.real(), z.imag());
+}
+
+} } // namespaces
+
+#endif // BOOST_MATH_COMPLEX_FABS_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/concepts/distributions.hpp b/gatb-core/thirdparty/boost/math/concepts/distributions.hpp
new file mode 100644
index 0000000..2e00377
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/concepts/distributions.hpp
@@ -0,0 +1,491 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// distributions.hpp provides definitions of the concept of a distribution
+// and non-member accessor functions that must be implemented by all distributions.
+// This is used to verify that
+// all the features of a distributions have been fully implemented.
+
+#ifndef BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
+#define BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
+
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/fwd.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4100)
+#pragma warning(disable: 4510)
+#pragma warning(disable: 4610)
+#pragma warning(disable: 4189) // local variable is initialized but not referenced.
+#endif
+#include <boost/concept_check.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <utility>
+
+namespace boost{
+namespace math{
+
+namespace concepts
+{
+// Begin by defining a concept archetype
+// for a distribution class:
+//
+template <class RealType>
+class distribution_archetype
+{
+public:
+   typedef RealType value_type;
+
+   distribution_archetype(const distribution_archetype&); // Copy constructible.
+   distribution_archetype& operator=(const distribution_archetype&); // Assignable.
+
+   // There is no default constructor,
+   // but we need a way to instantiate the archetype:
+   static distribution_archetype& get_object()
+   {
+      // will never get caled:
+      return *reinterpret_cast<distribution_archetype*>(0);
+   }
+}; // template <class RealType>class distribution_archetype
+
+// Non-member accessor functions:
+// (This list defines the functions that must be implemented by all distributions).
+
+template <class RealType>
+RealType pdf(const distribution_archetype<RealType>& dist, const RealType& x);
+
+template <class RealType>
+RealType cdf(const distribution_archetype<RealType>& dist, const RealType& x);
+
+template <class RealType>
+RealType quantile(const distribution_archetype<RealType>& dist, const RealType& p);
+
+template <class RealType>
+RealType cdf(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
+
+template <class RealType>
+RealType quantile(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
+
+template <class RealType>
+RealType mean(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType standard_deviation(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType variance(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType hazard(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType chf(const distribution_archetype<RealType>& dist);
+// http://en.wikipedia.org/wiki/Characteristic_function_%28probability_theory%29
+
+template <class RealType>
+RealType coefficient_of_variation(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType mode(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType skewness(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType kurtosis_excess(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType kurtosis(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+RealType median(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+std::pair<RealType, RealType> range(const distribution_archetype<RealType>& dist);
+
+template <class RealType>
+std::pair<RealType, RealType> support(const distribution_archetype<RealType>& dist);
+
+//
+// Next comes the concept checks for verifying that a class
+// fullfils the requirements of a Distribution:
+//
+template <class Distribution>
+struct DistributionConcept
+{
+   typedef typename Distribution::value_type value_type;
+
+   void constraints()
+   {
+      function_requires<CopyConstructibleConcept<Distribution> >();
+      function_requires<AssignableConcept<Distribution> >();
+
+      const Distribution& dist = DistributionConcept<Distribution>::get_object();
+
+      value_type x = 0;
+       // The result values are ignored in all these checks.
+       value_type v = cdf(dist, x);
+      v = cdf(complement(dist, x));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, x);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, x);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, x));
+      suppress_unused_variable_warning(v);
+      v = mean(dist);
+      suppress_unused_variable_warning(v);
+      v = mode(dist);
+      suppress_unused_variable_warning(v);
+      v = standard_deviation(dist);
+      suppress_unused_variable_warning(v);
+      v = variance(dist);
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, x);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, x);
+      suppress_unused_variable_warning(v);
+      v = coefficient_of_variation(dist);
+      suppress_unused_variable_warning(v);
+      v = skewness(dist);
+      suppress_unused_variable_warning(v);
+      v = kurtosis(dist);
+      suppress_unused_variable_warning(v);
+      v = kurtosis_excess(dist);
+      suppress_unused_variable_warning(v);
+      v = median(dist);
+      suppress_unused_variable_warning(v);
+      std::pair<value_type, value_type> pv;
+      pv = range(dist);
+      suppress_unused_variable_warning(pv);
+      pv = support(dist);
+      suppress_unused_variable_warning(pv);
+
+      float f = 1;
+      v = cdf(dist, f);
+      suppress_unused_variable_warning(v);
+      v = cdf(complement(dist, f));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, f);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, f);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, f));
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, f);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, f);
+      suppress_unused_variable_warning(v);
+      double d = 1;
+      v = cdf(dist, d);
+      suppress_unused_variable_warning(v);
+      v = cdf(complement(dist, d));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, d);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, d);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, d));
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, d);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, d);
+      suppress_unused_variable_warning(v);
+#ifndef TEST_MPFR
+      long double ld = 1;
+      v = cdf(dist, ld);
+      suppress_unused_variable_warning(v);
+      v = cdf(complement(dist, ld));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, ld);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, ld);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, ld));
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, ld);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, ld);
+      suppress_unused_variable_warning(v);
+#endif
+      int i = 1;
+      v = cdf(dist, i);
+      suppress_unused_variable_warning(v);
+      v = cdf(complement(dist, i));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, i);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, i);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, i));
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, i);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, i);
+      suppress_unused_variable_warning(v);
+      unsigned long li = 1;
+      v = cdf(dist, li);
+      suppress_unused_variable_warning(v);
+      v = cdf(complement(dist, li));
+      suppress_unused_variable_warning(v);
+      v = pdf(dist, li);
+      suppress_unused_variable_warning(v);
+      v = quantile(dist, li);
+      suppress_unused_variable_warning(v);
+      v = quantile(complement(dist, li));
+      suppress_unused_variable_warning(v);
+      v = hazard(dist, li);
+      suppress_unused_variable_warning(v);
+      v = chf(dist, li);
+      suppress_unused_variable_warning(v);
+      test_extra_members(dist);
+   }
+   template <class D>
+   static void test_extra_members(const D&)
+   {}
+   template <class R, class P>
+   static void test_extra_members(const boost::math::bernoulli_distribution<R, P>& d)
+   {
+      value_type r = d.success_fraction();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::beta_distribution<R, P>& d)
+   {
+      value_type r1 = d.alpha();
+      value_type r2 = d.beta();
+      r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2);
+      suppress_unused_variable_warning(r1);
+      r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2);
+      suppress_unused_variable_warning(r1);
+      r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2, r1);
+      suppress_unused_variable_warning(r1);
+      r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2, r1);
+      suppress_unused_variable_warning(r1);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::binomial_distribution<R, P>& d)
+   {
+      value_type r = d.success_fraction();
+      r = d.trials();
+      r = Distribution::find_lower_bound_on_p(r, r, r);
+      r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
+      r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
+      r = Distribution::find_upper_bound_on_p(r, r, r);
+      r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
+      r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
+      r = Distribution::find_minimum_number_of_trials(r, r, r);
+      r = Distribution::find_maximum_number_of_trials(r, r, r);
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::cauchy_distribution<R, P>& d)
+   {
+      value_type r = d.location();
+      r = d.scale();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::chi_squared_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom();
+      r = Distribution::find_degrees_of_freedom(r, r, r, r);
+      r = Distribution::find_degrees_of_freedom(r, r, r, r, r);
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::exponential_distribution<R, P>& d)
+   {
+      value_type r = d.lambda();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::extreme_value_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.location();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::fisher_f_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom1();
+      r = d.degrees_of_freedom2();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::gamma_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.shape();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::inverse_chi_squared_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.degrees_of_freedom();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::inverse_gamma_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.shape();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::hypergeometric_distribution<R, P>& d)
+   {
+      unsigned u = d.defective();
+      u = d.sample_count();
+      u = d.total();
+      suppress_unused_variable_warning(u);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::laplace_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.location();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::logistic_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.location();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::lognormal_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.location();
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::negative_binomial_distribution<R, P>& d)
+   {
+      value_type r = d.success_fraction();
+      r = d.successes();
+      r = Distribution::find_lower_bound_on_p(r, r, r);
+      r = Distribution::find_upper_bound_on_p(r, r, r);
+      r = Distribution::find_minimum_number_of_trials(r, r, r);
+      r = Distribution::find_maximum_number_of_trials(r, r, r);
+      suppress_unused_variable_warning(r);
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::non_central_beta_distribution<R, P>& d)
+   {
+      value_type r1 = d.alpha();
+      value_type r2 = d.beta();
+      r1 = d.non_centrality();
+      (void)r1; // warning suppression
+      (void)r2; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::non_central_chi_squared_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom();
+      r = d.non_centrality();
+      r = Distribution::find_degrees_of_freedom(r, r, r);
+      r = Distribution::find_degrees_of_freedom(boost::math::complement(r, r, r));
+      r = Distribution::find_non_centrality(r, r, r);
+      r = Distribution::find_non_centrality(boost::math::complement(r, r, r));
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::non_central_f_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom1();
+      r = d.degrees_of_freedom2();
+      r = d.non_centrality();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::non_central_t_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom();
+      r = d.non_centrality();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::normal_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.location();
+      r = d.mean();
+      r = d.standard_deviation();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::pareto_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.shape();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::poisson_distribution<R, P>& d)
+   {
+      value_type r = d.mean();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::rayleigh_distribution<R, P>& d)
+   {
+      value_type r = d.sigma();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::students_t_distribution<R, P>& d)
+   {
+      value_type r = d.degrees_of_freedom();
+      r = d.find_degrees_of_freedom(r, r, r, r);
+      r = d.find_degrees_of_freedom(r, r, r, r, r);
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::triangular_distribution<R, P>& d)
+   {
+      value_type r = d.lower();
+      r = d.mode();
+      r = d.upper();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::weibull_distribution<R, P>& d)
+   {
+      value_type r = d.scale();
+      r = d.shape();
+      (void)r; // warning suppression
+   }
+   template <class R, class P>
+   static void test_extra_members(const boost::math::uniform_distribution<R, P>& d)
+   {
+      value_type r = d.lower();
+      r = d.upper();
+      (void)r; // warning suppression
+   }
+private:
+   static Distribution* pd;
+   static Distribution& get_object()
+   {
+      // In reality this will never get called:
+      return *pd;
+   }
+}; // struct DistributionConcept
+
+template <class Distribution>
+Distribution* DistributionConcept<Distribution>::pd = 0;
+
+} // namespace concepts
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/concepts/real_concept.hpp b/gatb-core/thirdparty/boost/math/concepts/real_concept.hpp
new file mode 100644
index 0000000..2b105e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/concepts/real_concept.hpp
@@ -0,0 +1,451 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Test real concept.
+
+// real_concept is an archetype for User defined Real types.
+
+// This file defines the features, constructors, operators, functions...
+// that are essential to use mathematical and statistical functions.
+// The template typename "RealType" is used where this type
+// (as well as the normal built-in types, float, double & long double)
+// can be used.
+// That this is the minimum set is confirmed by use as a type
+// in tests of all functions & distributions, for example:
+//   test_spots(0.F); & test_spots(0.);  for float and double, but also
+//   test_spots(boost::math::concepts::real_concept(0.));
+// NTL quad_float type is an example of a type meeting the requirements,
+// but note minor additions are needed - see ntl.diff and documentation
+// "Using With NTL - a High-Precision Floating-Point Library".
+
+#ifndef BOOST_MATH_REAL_CONCEPT_HPP
+#define BOOST_MATH_REAL_CONCEPT_HPP
+
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/modf.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/policy.hpp>
+#if defined(__SGI_STL_PORT)
+#  include <boost/math/tools/real_cast.hpp>
+#endif
+#include <ostream>
+#include <istream>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <math.h> // fmodl
+
+#if defined(__SGI_STL_PORT) || defined(_RWSTD_VER) || defined(__LIBCOMO__)
+#  include <cstdio>
+#endif
+
+namespace boost{ namespace math{
+
+namespace concepts
+{
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+   typedef double real_concept_base_type;
+#else
+   typedef long double real_concept_base_type;
+#endif
+
+class real_concept
+{
+public:
+   // Constructors:
+   real_concept() : m_value(0){}
+   real_concept(char c) : m_value(c){}
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   real_concept(wchar_t c) : m_value(c){}
+#endif
+   real_concept(unsigned char c) : m_value(c){}
+   real_concept(signed char c) : m_value(c){}
+   real_concept(unsigned short c) : m_value(c){}
+   real_concept(short c) : m_value(c){}
+   real_concept(unsigned int c) : m_value(c){}
+   real_concept(int c) : m_value(c){}
+   real_concept(unsigned long c) : m_value(c){}
+   real_concept(long c) : m_value(c){}
+#if defined(__DECCXX) || defined(__SUNPRO_CC)
+   real_concept(unsigned long long c) : m_value(static_cast<real_concept_base_type>(c)){}
+   real_concept(long long c) : m_value(static_cast<real_concept_base_type>(c)){}
+#elif defined(BOOST_HAS_LONG_LONG)
+   real_concept(boost::ulong_long_type c) : m_value(static_cast<real_concept_base_type>(c)){}
+   real_concept(boost::long_long_type c) : m_value(static_cast<real_concept_base_type>(c)){}
+#elif defined(BOOST_HAS_MS_INT64)
+   real_concept(unsigned __int64 c) : m_value(static_cast<real_concept_base_type>(c)){}
+   real_concept(__int64 c) : m_value(static_cast<real_concept_base_type>(c)){}
+#endif
+   real_concept(float c) : m_value(c){}
+   real_concept(double c) : m_value(c){}
+   real_concept(long double c) : m_value(c){}
+#ifdef BOOST_MATH_USE_FLOAT128
+   real_concept(BOOST_MATH_FLOAT128_TYPE c) : m_value(c){}
+#endif
+
+   // Assignment:
+   real_concept& operator=(char c) { m_value = c; return *this; }
+   real_concept& operator=(unsigned char c) { m_value = c; return *this; }
+   real_concept& operator=(signed char c) { m_value = c; return *this; }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   real_concept& operator=(wchar_t c) { m_value = c; return *this; }
+#endif
+   real_concept& operator=(short c) { m_value = c; return *this; }
+   real_concept& operator=(unsigned short c) { m_value = c; return *this; }
+   real_concept& operator=(int c) { m_value = c; return *this; }
+   real_concept& operator=(unsigned int c) { m_value = c; return *this; }
+   real_concept& operator=(long c) { m_value = c; return *this; }
+   real_concept& operator=(unsigned long c) { m_value = c; return *this; }
+#ifdef BOOST_HAS_LONG_LONG
+   real_concept& operator=(boost::long_long_type c) { m_value = static_cast<real_concept_base_type>(c); return *this; }
+   real_concept& operator=(boost::ulong_long_type c) { m_value = static_cast<real_concept_base_type>(c); return *this; }
+#endif
+   real_concept& operator=(float c) { m_value = c; return *this; }
+   real_concept& operator=(double c) { m_value = c; return *this; }
+   real_concept& operator=(long double c) { m_value = c; return *this; }
+
+   // Access:
+   real_concept_base_type value()const{ return m_value; }
+
+   // Member arithmetic:
+   real_concept& operator+=(const real_concept& other)
+   { m_value += other.value(); return *this; }
+   real_concept& operator-=(const real_concept& other)
+   { m_value -= other.value(); return *this; }
+   real_concept& operator*=(const real_concept& other)
+   { m_value *= other.value(); return *this; }
+   real_concept& operator/=(const real_concept& other)
+   { m_value /= other.value(); return *this; }
+   real_concept operator-()const
+   { return -m_value; }
+   real_concept const& operator+()const
+   { return *this; }
+   real_concept& operator++()
+   { ++m_value;  return *this; }
+   real_concept& operator--()
+   { --m_value;  return *this; }
+
+private:
+   real_concept_base_type m_value;
+};
+
+// Non-member arithmetic:
+inline real_concept operator+(const real_concept& a, const real_concept& b)
+{
+   real_concept result(a);
+   result += b;
+   return result;
+}
+inline real_concept operator-(const real_concept& a, const real_concept& b)
+{
+   real_concept result(a);
+   result -= b;
+   return result;
+}
+inline real_concept operator*(const real_concept& a, const real_concept& b)
+{
+   real_concept result(a);
+   result *= b;
+   return result;
+}
+inline real_concept operator/(const real_concept& a, const real_concept& b)
+{
+   real_concept result(a);
+   result /= b;
+   return result;
+}
+
+// Comparison:
+inline bool operator == (const real_concept& a, const real_concept& b)
+{ return a.value() == b.value(); }
+inline bool operator != (const real_concept& a, const real_concept& b)
+{ return a.value() != b.value();}
+inline bool operator < (const real_concept& a, const real_concept& b)
+{ return a.value() < b.value(); }
+inline bool operator <= (const real_concept& a, const real_concept& b)
+{ return a.value() <= b.value(); }
+inline bool operator > (const real_concept& a, const real_concept& b)
+{ return a.value() > b.value(); }
+inline bool operator >= (const real_concept& a, const real_concept& b)
+{ return a.value() >= b.value(); }
+
+// Non-member functions:
+inline real_concept acos(real_concept a)
+{ return std::acos(a.value()); }
+inline real_concept cos(real_concept a)
+{ return std::cos(a.value()); }
+inline real_concept asin(real_concept a)
+{ return std::asin(a.value()); }
+inline real_concept atan(real_concept a)
+{ return std::atan(a.value()); }
+inline real_concept atan2(real_concept a, real_concept b)
+{ return std::atan2(a.value(), b.value()); }
+inline real_concept ceil(real_concept a)
+{ return std::ceil(a.value()); }
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+// I've seen std::fmod(long double) crash on some platforms
+// so use fmodl instead:
+#ifdef _WIN32_WCE
+//
+// Ugly workaround for macro fmodl:
+//
+inline long double call_fmodl(long double a, long double b)
+{  return fmodl(a, b); }
+inline real_concept fmod(real_concept a, real_concept b)
+{ return call_fmodl(a.value(), b.value()); }
+#else
+inline real_concept fmod(real_concept a, real_concept b)
+{ return fmodl(a.value(), b.value()); }
+#endif
+#endif
+inline real_concept cosh(real_concept a)
+{ return std::cosh(a.value()); }
+inline real_concept exp(real_concept a)
+{ return std::exp(a.value()); }
+inline real_concept fabs(real_concept a)
+{ return std::fabs(a.value()); }
+inline real_concept abs(real_concept a)
+{ return std::abs(a.value()); }
+inline real_concept floor(real_concept a)
+{ return std::floor(a.value()); }
+inline real_concept modf(real_concept a, real_concept* ipart)
+{
+   real_concept_base_type ip;
+   real_concept_base_type result = std::modf(a.value(), &ip);
+   *ipart = ip;
+   return result;
+}
+inline real_concept frexp(real_concept a, int* expon)
+{ return std::frexp(a.value(), expon); }
+inline real_concept ldexp(real_concept a, int expon)
+{ return std::ldexp(a.value(), expon); }
+inline real_concept log(real_concept a)
+{ return std::log(a.value()); }
+inline real_concept log10(real_concept a)
+{ return std::log10(a.value()); }
+inline real_concept tan(real_concept a)
+{ return std::tan(a.value()); }
+inline real_concept pow(real_concept a, real_concept b)
+{ return std::pow(a.value(), b.value()); }
+#if !defined(__SUNPRO_CC)
+inline real_concept pow(real_concept a, int b)
+{ return std::pow(a.value(), b); }
+#else
+inline real_concept pow(real_concept a, int b)
+{ return std::pow(a.value(), static_cast<real_concept_base_type>(b)); }
+#endif
+inline real_concept sin(real_concept a)
+{ return std::sin(a.value()); }
+inline real_concept sinh(real_concept a)
+{ return std::sinh(a.value()); }
+inline real_concept sqrt(real_concept a)
+{ return std::sqrt(a.value()); }
+inline real_concept tanh(real_concept a)
+{ return std::tanh(a.value()); }
+
+//
+// Conversion and truncation routines:
+//
+template <class Policy>
+inline int iround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::iround(v.value(), pol); }
+inline int iround(const concepts::real_concept& v)
+{ return boost::math::iround(v.value(), policies::policy<>()); }
+template <class Policy>
+inline long lround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::lround(v.value(), pol); }
+inline long lround(const concepts::real_concept& v)
+{ return boost::math::lround(v.value(), policies::policy<>()); }
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline boost::long_long_type llround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::llround(v.value(), pol); }
+inline boost::long_long_type llround(const concepts::real_concept& v)
+{ return boost::math::llround(v.value(), policies::policy<>()); }
+#endif
+
+template <class Policy>
+inline int itrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::itrunc(v.value(), pol); }
+inline int itrunc(const concepts::real_concept& v)
+{ return boost::math::itrunc(v.value(), policies::policy<>()); }
+template <class Policy>
+inline long ltrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::ltrunc(v.value(), pol); }
+inline long ltrunc(const concepts::real_concept& v)
+{ return boost::math::ltrunc(v.value(), policies::policy<>()); }
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline boost::long_long_type lltrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::lltrunc(v.value(), pol); }
+inline boost::long_long_type lltrunc(const concepts::real_concept& v)
+{ return boost::math::lltrunc(v.value(), policies::policy<>()); }
+#endif
+
+// Streaming:
+template <class charT, class traits>
+inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const real_concept& a)
+{
+   return os << a.value();
+}
+template <class charT, class traits>
+inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, real_concept& a)
+{
+#if defined(BOOST_MSVC) && defined(__SGI_STL_PORT)
+   //
+   // STLPort 5.1.4 has a problem reading long doubles from strings,
+   // see http://sourceforge.net/tracker/index.php?func=detail&aid=1811043&group_id=146814&atid=766244
+   //
+   double v;
+   is >> v;
+   a = v;
+   return is;
+#elif defined(__SGI_STL_PORT) || defined(_RWSTD_VER) || defined(__LIBCOMO__) || defined(_LIBCPP_VERSION)
+   std::string s;
+   real_concept_base_type d;
+   is >> s;
+   std::sscanf(s.c_str(), "%Lf", &d);
+   a = d;
+   return is;
+#else
+   real_concept_base_type v;
+   is >> v;
+   a = v;
+   return is;
+#endif
+}
+
+} // namespace concepts
+
+namespace tools
+{
+
+template <>
+inline concepts::real_concept make_big_value<concepts::real_concept>(boost::math::tools::largest_float val, const char* , mpl::false_ const&, mpl::false_ const&)
+{
+   return val;  // Can't use lexical_cast here, sometimes it fails....
+}
+
+template <>
+inline concepts::real_concept max_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+   return max_value<concepts::real_concept_base_type>();
+}
+
+template <>
+inline concepts::real_concept min_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+   return min_value<concepts::real_concept_base_type>();
+}
+
+template <>
+inline concepts::real_concept log_max_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+   return log_max_value<concepts::real_concept_base_type>();
+}
+
+template <>
+inline concepts::real_concept log_min_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+   return log_min_value<concepts::real_concept_base_type>();
+}
+
+template <>
+inline concepts::real_concept epsilon<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+#ifdef __SUNPRO_CC
+   return std::numeric_limits<concepts::real_concept_base_type>::epsilon();
+#else
+   return tools::epsilon<concepts::real_concept_base_type>();
+#endif
+}
+
+template <>
+inline int digits<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+{
+   // Assume number of significand bits is same as real_concept_base_type,
+   // unless std::numeric_limits<T>::is_specialized to provide digits.
+   return tools::digits<concepts::real_concept_base_type>();
+   // Note that if numeric_limits real concept is NOT specialized to provide digits10
+   // (or max_digits10) then the default precision of 6 decimal digits will be used
+   // by Boost test (giving misleading error messages like
+   // "difference between {9.79796} and {9.79796} exceeds 5.42101e-19%"
+   // and by Boost lexical cast and serialization causing loss of accuracy.
+}
+
+} // namespace tools
+
+#if defined(__SGI_STL_PORT) || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
+//
+// We shouldn't really need these type casts any more, but there are some
+// STLport iostream bugs we work around by using them....
+//
+namespace tools
+{
+// real_cast converts from T to integer and narrower floating-point types.
+
+// Convert from T to integer types.
+
+template <>
+inline unsigned int real_cast<unsigned int, concepts::real_concept>(concepts::real_concept r)
+{
+   return static_cast<unsigned int>(r.value());
+}
+
+template <>
+inline int real_cast<int, concepts::real_concept>(concepts::real_concept r)
+{
+   return static_cast<int>(r.value());
+}
+
+template <>
+inline long real_cast<long, concepts::real_concept>(concepts::real_concept r)
+{
+   return static_cast<long>(r.value());
+}
+
+// Converts from T to narrower floating-point types, float, double & long double.
+
+template <>
+inline float real_cast<float, concepts::real_concept>(concepts::real_concept r)
+{
+   return static_cast<float>(r.value());
+}
+template <>
+inline double real_cast<double, concepts::real_concept>(concepts::real_concept r)
+{
+   return static_cast<double>(r.value());
+}
+template <>
+inline long double real_cast<long double, concepts::real_concept>(concepts::real_concept r)
+{
+   return r.value();
+}
+
+} // STLPort
+
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+//
+// For some strange reason ADL sometimes fails to find the
+// correct overloads, unless we bring these declarations into scope:
+//
+using concepts::itrunc;
+using concepts::iround;
+
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_REAL_CONCEPT_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/concepts/real_type_concept.hpp b/gatb-core/thirdparty/boost/math/concepts/real_type_concept.hpp
new file mode 100644
index 0000000..97da780
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/concepts/real_type_concept.hpp
@@ -0,0 +1,122 @@
+//  Copyright John Maddock 2007-8.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_REAL_TYPE_CONCEPT_HPP
+#define BOOST_MATH_REAL_TYPE_CONCEPT_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4100)
+#pragma warning(disable: 4510)
+#pragma warning(disable: 4610)
+#endif
+#include <boost/concept_check.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/precision.hpp>
+
+
+namespace boost{ namespace math{ namespace concepts{
+
+template <class RealType>
+struct RealTypeConcept
+{
+   template <class Other>
+   void check_binary_ops(Other o)
+   {
+      RealType r(o);
+      r = o;
+      r -= o;
+      r += o;
+      r *= o;
+      r /= o;
+      r = r - o;
+      r = o - r;
+      r = r + o;
+      r = o + r;
+      r = o * r;
+      r = r * o;
+      r = r / o;
+      r = o / r;
+      bool b;
+      b = r == o;
+      suppress_unused_variable_warning(b);
+      b = o == r;
+      suppress_unused_variable_warning(b);
+      b = r != o;
+      suppress_unused_variable_warning(b);
+      b = o != r;
+      suppress_unused_variable_warning(b);
+      b = r <= o;
+      suppress_unused_variable_warning(b);
+      b = o <= r;
+      suppress_unused_variable_warning(b);
+      b = r >= o;
+      suppress_unused_variable_warning(b);
+      b = o >= r;
+      suppress_unused_variable_warning(b);
+      b = r < o;
+      suppress_unused_variable_warning(b);
+      b = o < r;
+      suppress_unused_variable_warning(b);
+      b = r > o;
+      suppress_unused_variable_warning(b);
+      b = o > r;
+      suppress_unused_variable_warning(b);
+   }
+
+   void constraints()
+   {
+      BOOST_MATH_STD_USING
+
+      RealType r;
+      check_binary_ops(r);
+      check_binary_ops(0.5f);
+      check_binary_ops(0.5);
+      //check_binary_ops(0.5L);
+      check_binary_ops(1);
+      //check_binary_ops(1u);
+      check_binary_ops(1L);
+      //check_binary_ops(1uL);
+#ifndef BOOST_HAS_LONG_LONG
+      check_binary_ops(1LL);
+#endif
+      RealType r2 = +r;
+      r2 = -r;
+
+      r2 = fabs(r);
+      r2 = abs(r);
+      r2 = ceil(r);
+      r2 = floor(r);
+      r2 = exp(r);
+      r2 = pow(r, r2);
+      r2 = sqrt(r);
+      r2 = log(r);
+      r2 = cos(r);
+      r2 = sin(r);
+      r2 = tan(r);
+      r2 = asin(r);
+      r2 = acos(r);
+      r2 = atan(r);
+      int i;
+      r2 = ldexp(r, i);
+      r2 = frexp(r, &i);
+      i = boost::math::tools::digits<RealType>();
+      r2 = boost::math::tools::max_value<RealType>();
+      r2 = boost::math::tools::min_value<RealType>();
+      r2 = boost::math::tools::log_max_value<RealType>();
+      r2 = boost::math::tools::log_min_value<RealType>();
+      r2 = boost::math::tools::epsilon<RealType>();
+   }
+}; // struct DistributionConcept
+
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/concepts/std_real_concept.hpp b/gatb-core/thirdparty/boost/math/concepts/std_real_concept.hpp
new file mode 100644
index 0000000..c565ce3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/concepts/std_real_concept.hpp
@@ -0,0 +1,405 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// std_real_concept is an archetype for built-in Real types.
+
+// The main purpose in providing this type is to verify
+// that std lib functions are found via a using declaration
+// bringing those functions into the current scope, and not
+// just because they happen to be in global scope.
+//
+// If ::pow is found rather than std::pow say, then the code
+// will silently compile, but truncation of long doubles to
+// double will cause a significant loss of precision.
+// A template instantiated with std_real_concept will *only*
+// compile if it std::whatever is in scope.
+
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+
+#include <ostream>
+#include <istream>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <math.h> // fmodl
+
+#ifndef BOOST_MATH_STD_REAL_CONCEPT_HPP
+#define BOOST_MATH_STD_REAL_CONCEPT_HPP
+
+namespace boost{ namespace math{
+
+namespace concepts
+{
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+   typedef double std_real_concept_base_type;
+#else
+   typedef long double std_real_concept_base_type;
+#endif
+
+class std_real_concept
+{
+public:
+   // Constructors:
+   std_real_concept() : m_value(0){}
+   std_real_concept(char c) : m_value(c){}
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   std_real_concept(wchar_t c) : m_value(c){}
+#endif
+   std_real_concept(unsigned char c) : m_value(c){}
+   std_real_concept(signed char c) : m_value(c){}
+   std_real_concept(unsigned short c) : m_value(c){}
+   std_real_concept(short c) : m_value(c){}
+   std_real_concept(unsigned int c) : m_value(c){}
+   std_real_concept(int c) : m_value(c){}
+   std_real_concept(unsigned long c) : m_value(c){}
+   std_real_concept(long c) : m_value(c){}
+#if defined(__DECCXX) || defined(__SUNPRO_CC)
+   std_real_concept(unsigned long long c) : m_value(static_cast<std_real_concept_base_type>(c)){}
+   std_real_concept(long long c) : m_value(static_cast<std_real_concept_base_type>(c)){}
+#elif defined(BOOST_HAS_LONG_LONG)
+   std_real_concept(boost::ulong_long_type c) : m_value(static_cast<std_real_concept_base_type>(c)){}
+   std_real_concept(boost::long_long_type c) : m_value(static_cast<std_real_concept_base_type>(c)){}
+#endif
+   std_real_concept(float c) : m_value(c){}
+   std_real_concept(double c) : m_value(c){}
+   std_real_concept(long double c) : m_value(c){}
+#ifdef BOOST_MATH_USE_FLOAT128
+   std_real_concept(BOOST_MATH_FLOAT128_TYPE c) : m_value(c){}
+#endif
+
+   // Assignment:
+   std_real_concept& operator=(char c) { m_value = c; return *this; }
+   std_real_concept& operator=(unsigned char c) { m_value = c; return *this; }
+   std_real_concept& operator=(signed char c) { m_value = c; return *this; }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+   std_real_concept& operator=(wchar_t c) { m_value = c; return *this; }
+#endif
+   std_real_concept& operator=(short c) { m_value = c; return *this; }
+   std_real_concept& operator=(unsigned short c) { m_value = c; return *this; }
+   std_real_concept& operator=(int c) { m_value = c; return *this; }
+   std_real_concept& operator=(unsigned int c) { m_value = c; return *this; }
+   std_real_concept& operator=(long c) { m_value = c; return *this; }
+   std_real_concept& operator=(unsigned long c) { m_value = c; return *this; }
+#if defined(__DECCXX) || defined(__SUNPRO_CC)
+   std_real_concept& operator=(unsigned long long c) { m_value = static_cast<std_real_concept_base_type>(c); return *this; }
+   std_real_concept& operator=(long long c) { m_value = static_cast<std_real_concept_base_type>(c); return *this; }
+#elif defined(BOOST_HAS_LONG_LONG)
+   std_real_concept& operator=(boost::long_long_type c) { m_value = static_cast<std_real_concept_base_type>(c); return *this; }
+   std_real_concept& operator=(boost::ulong_long_type c) { m_value = static_cast<std_real_concept_base_type>(c); return *this; }
+#endif
+   std_real_concept& operator=(float c) { m_value = c; return *this; }
+   std_real_concept& operator=(double c) { m_value = c; return *this; }
+   std_real_concept& operator=(long double c) { m_value = c; return *this; }
+
+   // Access:
+   std_real_concept_base_type value()const{ return m_value; }
+
+   // Member arithmetic:
+   std_real_concept& operator+=(const std_real_concept& other)
+   { m_value += other.value(); return *this; }
+   std_real_concept& operator-=(const std_real_concept& other)
+   { m_value -= other.value(); return *this; }
+   std_real_concept& operator*=(const std_real_concept& other)
+   { m_value *= other.value(); return *this; }
+   std_real_concept& operator/=(const std_real_concept& other)
+   { m_value /= other.value(); return *this; }
+   std_real_concept operator-()const
+   { return -m_value; }
+   std_real_concept const& operator+()const
+   { return *this; }
+
+private:
+   std_real_concept_base_type m_value;
+};
+
+// Non-member arithmetic:
+inline std_real_concept operator+(const std_real_concept& a, const std_real_concept& b)
+{
+   std_real_concept result(a);
+   result += b;
+   return result;
+}
+inline std_real_concept operator-(const std_real_concept& a, const std_real_concept& b)
+{
+   std_real_concept result(a);
+   result -= b;
+   return result;
+}
+inline std_real_concept operator*(const std_real_concept& a, const std_real_concept& b)
+{
+   std_real_concept result(a);
+   result *= b;
+   return result;
+}
+inline std_real_concept operator/(const std_real_concept& a, const std_real_concept& b)
+{
+   std_real_concept result(a);
+   result /= b;
+   return result;
+}
+
+// Comparison:
+inline bool operator == (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() == b.value(); }
+inline bool operator != (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() != b.value();}
+inline bool operator < (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() < b.value(); }
+inline bool operator <= (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() <= b.value(); }
+inline bool operator > (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() > b.value(); }
+inline bool operator >= (const std_real_concept& a, const std_real_concept& b)
+{ return a.value() >= b.value(); }
+
+} // namespace concepts
+} // namespace math
+} // namespace boost
+
+namespace std{
+
+// Non-member functions:
+inline boost::math::concepts::std_real_concept acos(boost::math::concepts::std_real_concept a)
+{ return std::acos(a.value()); }
+inline boost::math::concepts::std_real_concept cos(boost::math::concepts::std_real_concept a)
+{ return std::cos(a.value()); }
+inline boost::math::concepts::std_real_concept asin(boost::math::concepts::std_real_concept a)
+{ return std::asin(a.value()); }
+inline boost::math::concepts::std_real_concept atan(boost::math::concepts::std_real_concept a)
+{ return std::atan(a.value()); }
+inline boost::math::concepts::std_real_concept atan2(boost::math::concepts::std_real_concept a, boost::math::concepts::std_real_concept b)
+{ return std::atan2(a.value(), b.value()); }
+inline boost::math::concepts::std_real_concept ceil(boost::math::concepts::std_real_concept a)
+{ return std::ceil(a.value()); }
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+inline boost::math::concepts::std_real_concept fmod(boost::math::concepts::std_real_concept a, boost::math::concepts::std_real_concept b)
+{ return fmodl(a.value(), b.value()); }
+#else
+inline boost::math::concepts::std_real_concept fmod(boost::math::concepts::std_real_concept a, boost::math::concepts::std_real_concept b)
+{ return std::fmod(a.value(), b.value()); }
+#endif
+inline boost::math::concepts::std_real_concept cosh(boost::math::concepts::std_real_concept a)
+{ return std::cosh(a.value()); }
+inline boost::math::concepts::std_real_concept exp(boost::math::concepts::std_real_concept a)
+{ return std::exp(a.value()); }
+inline boost::math::concepts::std_real_concept fabs(boost::math::concepts::std_real_concept a)
+{ return std::fabs(a.value()); }
+inline boost::math::concepts::std_real_concept abs(boost::math::concepts::std_real_concept a)
+{ return std::abs(a.value()); }
+inline boost::math::concepts::std_real_concept floor(boost::math::concepts::std_real_concept a)
+{ return std::floor(a.value()); }
+inline boost::math::concepts::std_real_concept modf(boost::math::concepts::std_real_concept a, boost::math::concepts::std_real_concept* ipart)
+{
+   boost::math::concepts::std_real_concept_base_type ip;
+   boost::math::concepts::std_real_concept_base_type result = std::modf(a.value(), &ip);
+   *ipart = ip;
+   return result;
+}
+inline boost::math::concepts::std_real_concept frexp(boost::math::concepts::std_real_concept a, int* expon)
+{ return std::frexp(a.value(), expon); }
+inline boost::math::concepts::std_real_concept ldexp(boost::math::concepts::std_real_concept a, int expon)
+{ return std::ldexp(a.value(), expon); }
+inline boost::math::concepts::std_real_concept log(boost::math::concepts::std_real_concept a)
+{ return std::log(a.value()); }
+inline boost::math::concepts::std_real_concept log10(boost::math::concepts::std_real_concept a)
+{ return std::log10(a.value()); }
+inline boost::math::concepts::std_real_concept tan(boost::math::concepts::std_real_concept a)
+{ return std::tan(a.value()); }
+inline boost::math::concepts::std_real_concept pow(boost::math::concepts::std_real_concept a, boost::math::concepts::std_real_concept b)
+{ return std::pow(a.value(), b.value()); }
+#if !defined(__SUNPRO_CC)
+inline boost::math::concepts::std_real_concept pow(boost::math::concepts::std_real_concept a, int b)
+{ return std::pow(a.value(), b); }
+#else
+inline boost::math::concepts::std_real_concept pow(boost::math::concepts::std_real_concept a, int b)
+{ return std::pow(a.value(), static_cast<long double>(b)); }
+#endif
+inline boost::math::concepts::std_real_concept sin(boost::math::concepts::std_real_concept a)
+{ return std::sin(a.value()); }
+inline boost::math::concepts::std_real_concept sinh(boost::math::concepts::std_real_concept a)
+{ return std::sinh(a.value()); }
+inline boost::math::concepts::std_real_concept sqrt(boost::math::concepts::std_real_concept a)
+{ return std::sqrt(a.value()); }
+inline boost::math::concepts::std_real_concept tanh(boost::math::concepts::std_real_concept a)
+{ return std::tanh(a.value()); }
+
+} // namespace std
+
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/modf.hpp>
+#include <boost/math/tools/precision.hpp>
+
+namespace boost{ namespace math{ namespace concepts{
+
+//
+// Conversion and truncation routines:
+//
+template <class Policy>
+inline int iround(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::iround(v.value(), pol);
+}
+inline int iround(const concepts::std_real_concept& v)
+{
+   return boost::math::iround(v.value(), policies::policy<>());
+}
+
+template <class Policy>
+inline long lround(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::lround(v.value(), pol);
+}
+inline long lround(const concepts::std_real_concept& v)
+{
+   return boost::math::lround(v.value(), policies::policy<>());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+
+template <class Policy>
+inline boost::long_long_type llround(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::llround(v.value(), pol);
+}
+inline boost::long_long_type llround(const concepts::std_real_concept& v)
+{
+   return boost::math::llround(v.value(), policies::policy<>());
+}
+
+#endif
+
+template <class Policy>
+inline int itrunc(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::itrunc(v.value(), pol);
+}
+inline int itrunc(const concepts::std_real_concept& v)
+{
+   return boost::math::itrunc(v.value(), policies::policy<>());
+}
+
+template <class Policy>
+inline long ltrunc(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::ltrunc(v.value(), pol);
+}
+inline long ltrunc(const concepts::std_real_concept& v)
+{
+   return boost::math::ltrunc(v.value(), policies::policy<>());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+
+template <class Policy>
+inline boost::long_long_type lltrunc(const concepts::std_real_concept& v, const Policy& pol)
+{
+   return boost::math::lltrunc(v.value(), pol);
+}
+inline boost::long_long_type lltrunc(const concepts::std_real_concept& v)
+{
+   return boost::math::lltrunc(v.value(), policies::policy<>());
+}
+
+#endif
+
+// Streaming:
+template <class charT, class traits>
+inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const std_real_concept& a)
+{
+   return os << a.value();
+}
+template <class charT, class traits>
+inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, std_real_concept& a)
+{
+#if defined(__SGI_STL_PORT) || defined(_RWSTD_VER) || defined(__LIBCOMO__) || defined(_LIBCPP_VERSION)
+   std::string s;
+   std_real_concept_base_type d;
+   is >> s;
+   std::sscanf(s.c_str(), "%Lf", &d);
+   a = d;
+   return is;
+#else
+   std_real_concept_base_type v;
+   is >> v;
+   a = v;
+   return is;
+#endif
+}
+
+} // namespace concepts
+}}
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/big_constant.hpp>
+
+namespace boost{ namespace math{
+namespace tools
+{
+
+template <>
+inline concepts::std_real_concept make_big_value<concepts::std_real_concept>(boost::math::tools::largest_float val, const char*, mpl::false_ const&, mpl::false_ const&)
+{
+   return val;  // Can't use lexical_cast here, sometimes it fails....
+}
+
+template <>
+inline concepts::std_real_concept max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+   return max_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+   return min_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept log_max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+   return log_max_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept log_min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+   return log_min_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+   return tools::epsilon<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline int digits<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{ // Assume number of significand bits is same as std_real_concept_base_type,
+  // unless std::numeric_limits<T>::is_specialized to provide digits.
+   return digits<concepts::std_real_concept_base_type>();
+}
+
+} // namespace tools
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+using concepts::itrunc;
+using concepts::ltrunc;
+using concepts::lltrunc;
+using concepts::iround;
+using concepts::lround;
+using concepts::llround;
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_STD_REAL_CONCEPT_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/constants/calculate_constants.hpp b/gatb-core/thirdparty/boost/math/constants/calculate_constants.hpp
new file mode 100644
index 0000000..2dcdb9a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/constants/calculate_constants.hpp
@@ -0,0 +1,968 @@
+//  Copyright John Maddock 2010, 2012.
+//  Copyright Paul A. Bristow 2011, 2012.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_CALCULATE_CONSTANTS_CONSTANTS_INCLUDED
+#define BOOST_MATH_CALCULATE_CONSTANTS_CONSTANTS_INCLUDED
+
+#include <boost/math/special_functions/trunc.hpp>
+
+namespace boost{ namespace math{ namespace constants{ namespace detail{
+
+template <class T>
+template<int N>
+inline T constant_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+
+   return ldexp(acos(T(0)), 1);
+
+   /*
+   // Although this code works well, it's usually more accurate to just call acos
+   // and access the number types own representation of PI which is usually calculated
+   // at slightly higher precision...
+
+   T result;
+   T a = 1;
+   T b;
+   T A(a);
+   T B = 0.5f;
+   T D = 0.25f;
+
+   T lim;
+   lim = boost::math::tools::epsilon<T>();
+
+   unsigned k = 1;
+
+   do
+   {
+      result = A + B;
+      result = ldexp(result, -2);
+      b = sqrt(B);
+      a += b;
+      a = ldexp(a, -1);
+      A = a * a;
+      B = A - result;
+      B = ldexp(B, 1);
+      result = A - B;
+      bool neg = boost::math::sign(result) < 0;
+      if(neg)
+         result = -result;
+      if(result <= lim)
+         break;
+      if(neg)
+         result = -result;
+      result = ldexp(result, k - 1);
+      D -= result;
+      ++k;
+      lim = ldexp(lim, 1);
+   }
+   while(true);
+
+   result = B / D;
+   return result;
+   */
+}
+
+template <class T>
+template<int N>
+inline T constant_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return 2 * pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T> // 2 / pi
+template<int N>
+inline T constant_two_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return 2 / pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>  // sqrt(2/pi)
+template <int N>
+inline T constant_root_two_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt((2 / pi<T, policies::policy<policies::digits2<N> > >()));
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return 1 / two_pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>
+template<int N>
+inline T constant_root_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(pi<T, policies::policy<policies::digits2<N> > >());
+}
+
+template <class T>
+template<int N>
+inline T constant_root_half_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(pi<T, policies::policy<policies::digits2<N> > >() / 2);
+}
+
+template <class T>
+template<int N>
+inline T constant_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(two_pi<T, policies::policy<policies::digits2<N> > >());
+}
+
+template <class T>
+template<int N>
+inline T constant_log_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return log(root_two_pi<T, policies::policy<policies::digits2<N> > >());
+}
+
+template <class T>
+template<int N>
+inline T constant_root_ln_four<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(log(static_cast<T>(4)));
+}
+
+template <class T>
+template<int N>
+inline T constant_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   //
+   // Although we can clearly calculate this from first principles, this hooks into
+   // T's own notion of e, which hopefully will more accurate than one calculated to
+   // a few epsilon:
+   //
+   BOOST_MATH_STD_USING
+   return exp(static_cast<T>(1));
+}
+
+template <class T>
+template<int N>
+inline T constant_half<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return static_cast<T>(1) / static_cast<T>(2);
+}
+
+template <class T>
+template<int M>
+inline T constant_euler<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<M>))
+{
+   BOOST_MATH_STD_USING
+   //
+   // This is the method described in:
+   // "Some New Algorithms for High-Precision Computation of Euler's Constant"
+   // Richard P Brent and Edwin M McMillan.
+   // Mathematics of Computation, Volume 34, Number 149, Jan 1980, pages 305-312.
+   // See equation 17 with p = 2.
+   //
+   T n = 3 + (M ? (std::min)(M, tools::digits<T>()) : tools::digits<T>()) / 4;
+   T lim = M ? ldexp(T(1), 1 - (std::min)(M, tools::digits<T>())) : tools::epsilon<T>();
+   T lnn = log(n);
+   T term = 1;
+   T N = -lnn;
+   T D = 1;
+   T Hk = 0;
+   T one = 1;
+
+   for(unsigned k = 1;; ++k)
+   {
+      term *= n * n;
+      term /= k * k;
+      Hk += one / k;
+      N += term * (Hk - lnn);
+      D += term;
+
+      if(term < D * lim)
+         break;
+   }
+   return N / D;
+}
+
+template <class T>
+template<int N>
+inline T constant_euler_sqr<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+  BOOST_MATH_STD_USING
+  return euler<T, policies::policy<policies::digits2<N> > >()
+     * euler<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_euler<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+  BOOST_MATH_STD_USING
+  return static_cast<T>(1)
+     / euler<T, policies::policy<policies::digits2<N> > >();
+}
+
+
+template <class T>
+template<int N>
+inline T constant_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(static_cast<T>(2));
+}
+
+
+template <class T>
+template<int N>
+inline T constant_root_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(static_cast<T>(3));
+}
+
+template <class T>
+template<int N>
+inline T constant_half_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(static_cast<T>(2)) / 2;
+}
+
+template <class T>
+template<int N>
+inline T constant_ln_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   //
+   // Although there are good ways to calculate this from scratch, this hooks into
+   // T's own notion of log(2) which will hopefully be accurate to the full precision
+   // of T:
+   //
+   BOOST_MATH_STD_USING
+   return log(static_cast<T>(2));
+}
+
+template <class T>
+template<int N>
+inline T constant_ln_ten<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return log(static_cast<T>(10));
+}
+
+template <class T>
+template<int N>
+inline T constant_ln_ln_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return log(log(static_cast<T>(2)));
+}
+
+template <class T>
+template<int N>
+inline T constant_third<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(1) / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_twothirds<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(2) / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_two_thirds<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(2) / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_three_quarters<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(3) / static_cast<T>(4);
+}
+
+template <class T>
+template<int N>
+inline T constant_pi_minus_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_four_minus_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return static_cast<T>(4) - pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+//template <class T>
+//template<int N>
+//inline T constant_pow23_four_minus_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+//{
+//   BOOST_MATH_STD_USING
+//   return pow(four_minus_pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(1.5));
+//}
+
+template <class T>
+template<int N>
+inline T constant_exp_minus_half<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return exp(static_cast<T>(-0.5));
+}
+
+// Pi
+template <class T>
+template<int N>
+inline T constant_one_div_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return static_cast<T>(1) / root_two<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_root_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return static_cast<T>(1) / root_pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   return static_cast<T>(1) / root_two_pi<T, policies::policy<policies::digits2<N> > >();
+}
+
+template <class T>
+template<int N>
+inline T constant_root_one_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(static_cast<T>(1) / pi<T, policies::policy<policies::digits2<N> > >());
+}
+
+
+template <class T>
+template<int N>
+inline T constant_four_thirds_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(4) / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_half_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(2);
+}
+
+
+template <class T>
+template<int N>
+inline T constant_third_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_sixth_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(6);
+}
+
+template <class T>
+template<int N>
+inline T constant_two_thirds_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(2) / static_cast<T>(3);
+}
+
+template <class T>
+template<int N>
+inline T constant_three_quarters_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(3) / static_cast<T>(4);
+}
+
+template <class T>
+template<int N>
+inline T constant_pi_pow_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pow(pi<T, policies::policy<policies::digits2<N> > >(), e<T, policies::policy<policies::digits2<N> > >()); //
+}
+
+template <class T>
+template<int N>
+inline T constant_pi_sqr<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()
+   *      pi<T, policies::policy<policies::digits2<N> > >() ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_pi_sqr_div_six<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()
+   *      pi<T, policies::policy<policies::digits2<N> > >()
+   / static_cast<T>(6); //
+}
+
+
+template <class T>
+template<int N>
+inline T constant_pi_cubed<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()
+   *      pi<T, policies::policy<policies::digits2<N> > >()
+   *      pi<T, policies::policy<policies::digits2<N> > >()
+   ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_cbrt_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pow(pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(1)/ static_cast<T>(3));
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_cbrt_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(1)
+   / pow(pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(1)/ static_cast<T>(3));
+}
+
+// Euler's e
+
+template <class T>
+template<int N>
+inline T constant_e_pow_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pow(e<T, policies::policy<policies::digits2<N> > >(), pi<T, policies::policy<policies::digits2<N> > >()); //
+}
+
+template <class T>
+template<int N>
+inline T constant_root_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sqrt(e<T, policies::policy<policies::digits2<N> > >());
+}
+
+template <class T>
+template<int N>
+inline T constant_log10_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return log10(e<T, policies::policy<policies::digits2<N> > >());
+}
+
+template <class T>
+template<int N>
+inline T constant_one_div_log10_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return  static_cast<T>(1) /
+     log10(e<T, policies::policy<policies::digits2<N> > >());
+}
+
+// Trigonometric
+
+template <class T>
+template<int N>
+inline T constant_degree<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return pi<T, policies::policy<policies::digits2<N> > >()
+   / static_cast<T>(180)
+   ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_radian<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(180)
+   / pi<T, policies::policy<policies::digits2<N> > >()
+   ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_sin_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sin(static_cast<T>(1)) ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_cos_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return cos(static_cast<T>(1)) ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_sinh_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return sinh(static_cast<T>(1)) ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_cosh_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return cosh(static_cast<T>(1)) ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return (static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) ; //
+}
+
+template <class T>
+template<int N>
+inline T constant_ln_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   //return  log(phi<T, policies::policy<policies::digits2<N> > >()); // ???
+   return log((static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) );
+}
+template <class T>
+template<int N>
+inline T constant_one_div_ln_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+   return static_cast<T>(1) /
+     log((static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) );
+}
+
+// Zeta
+
+template <class T>
+template<int N>
+inline T constant_zeta_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   BOOST_MATH_STD_USING
+
+     return pi<T, policies::policy<policies::digits2<N> > >()
+     *  pi<T, policies::policy<policies::digits2<N> > >()
+     /static_cast<T>(6);
+}
+
+template <class T>
+template<int N>
+inline T constant_zeta_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   // http://mathworld.wolfram.com/AperysConstant.html
+   // http://en.wikipedia.org/wiki/Mathematical_constant
+
+   // http://oeis.org/A002117/constant
+   //T zeta3("1.20205690315959428539973816151144999076"
+   // "4986292340498881792271555341838205786313"
+   // "09018645587360933525814619915");
+
+  //"1.202056903159594285399738161511449990, 76498629234049888179227155534183820578631309018645587360933525814619915"  A002117
+  // 1.202056903159594285399738161511449990, 76498629234049888179227155534183820578631309018645587360933525814619915780, +00);
+  //"1.2020569031595942 double
+  // http://www.spaennare.se/SSPROG/ssnum.pdf  // section 11, Algorithm for Apery's constant zeta(3).
+  // Programs to Calculate some Mathematical Constants to Large Precision, Document Version 1.50
+
+  // by Stefan Spannare  September 19, 2007
+  // zeta(3) = 1/64 * sum
+   BOOST_MATH_STD_USING
+   T n_fact=static_cast<T>(1); // build n! for n = 0.
+   T sum = static_cast<double>(77); // Start with n = 0 case.
+   // for n = 0, (77/1) /64 = 1.203125
+   //double lim = std::numeric_limits<double>::epsilon();
+   T lim = N ? ldexp(T(1), 1 - (std::min)(N, tools::digits<T>())) : tools::epsilon<T>();
+   for(unsigned int n = 1; n < 40; ++n)
+   { // three to five decimal digits per term, so 40 should be plenty for 100 decimal digits.
+      //cout << "n = " << n << endl;
+      n_fact *= n; // n!
+      T n_fact_p10 = n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact; // (n!)^10
+      T num = ((205 * n * n) + (250 * n) + 77) * n_fact_p10; // 205n^2 + 250n + 77
+      // int nn = (2 * n + 1);
+      // T d = factorial(nn); // inline factorial.
+      T d = 1;
+      for(unsigned int i = 1; i <= (n+n + 1); ++i) // (2n + 1)
+      {
+        d *= i;
+      }
+      T den = d * d * d * d * d; // [(2n+1)!]^5
+      //cout << "den = " << den << endl;
+      T term = num/den;
+      if (n % 2 != 0)
+      { //term *= -1;
+        sum -= term;
+      }
+      else
+      {
+        sum += term;
+      }
+      //cout << "term = " << term << endl;
+      //cout << "sum/64  = " << sum/64 << endl;
+      if(abs(term) < lim)
+      {
+         break;
+      }
+   }
+   return sum / 64;
+}
+
+template <class T>
+template<int N>
+inline T constant_catalan<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{ // http://oeis.org/A006752/constant
+  //T c("0.915965594177219015054603514932384110774"
+ //"149374281672134266498119621763019776254769479356512926115106248574");
+
+  // 9.159655941772190150546035149323841107, 74149374281672134266498119621763019776254769479356512926115106248574422619, -01);
+
+   // This is equation (entry) 31 from
+   // http://www-2.cs.cmu.edu/~adamchik/articles/catalan/catalan.htm
+   // See also http://www.mpfr.org/algorithms.pdf
+   BOOST_MATH_STD_USING
+   T k_fact = 1;
+   T tk_fact = 1;
+   T sum = 1;
+   T term;
+   T lim = N ? ldexp(T(1), 1 - (std::min)(N, tools::digits<T>())) : tools::epsilon<T>();
+
+   for(unsigned k = 1;; ++k)
+   {
+      k_fact *= k;
+      tk_fact *= (2 * k) * (2 * k - 1);
+      term = k_fact * k_fact / (tk_fact * (2 * k + 1) * (2 * k + 1));
+      sum += term;
+      if(term < lim)
+      {
+         break;
+      }
+   }
+   return boost::math::constants::pi<T, boost::math::policies::policy<> >()
+      * log(2 + boost::math::constants::root_three<T, boost::math::policies::policy<> >())
+       / 8
+      + 3 * sum / 8;
+}
+
+namespace khinchin_detail{
+
+template <class T>
+T zeta_polynomial_series(T s, T sc, int digits)
+{
+   BOOST_MATH_STD_USING
+   //
+   // This is algorithm 3 from:
+   //
+   // "An Efficient Algorithm for the Riemann Zeta Function", P. Borwein,
+   // Canadian Mathematical Society, Conference Proceedings, 2000.
+   // See: http://www.cecm.sfu.ca/personal/pborwein/PAPERS/P155.pdf
+   //
+   BOOST_MATH_STD_USING
+   int n = (digits * 19) / 53;
+   T sum = 0;
+   T two_n = ldexp(T(1), n);
+   int ej_sign = 1;
+   for(int j = 0; j < n; ++j)
+   {
+      sum += ej_sign * -two_n / pow(T(j + 1), s);
+      ej_sign = -ej_sign;
+   }
+   T ej_sum = 1;
+   T ej_term = 1;
+   for(int j = n; j <= 2 * n - 1; ++j)
+   {
+      sum += ej_sign * (ej_sum - two_n) / pow(T(j + 1), s);
+      ej_sign = -ej_sign;
+      ej_term *= 2 * n - j;
+      ej_term /= j - n + 1;
+      ej_sum += ej_term;
+   }
+   return -sum / (two_n * (1 - pow(T(2), sc)));
+}
+
+template <class T>
+T khinchin(int digits)
+{
+   BOOST_MATH_STD_USING
+   T sum = 0;
+   T term;
+   T lim = ldexp(T(1), 1-digits);
+   T factor = 0;
+   unsigned last_k = 1;
+   T num = 1;
+   for(unsigned n = 1;; ++n)
+   {
+      for(unsigned k = last_k; k <= 2 * n - 1; ++k)
+      {
+         factor += num / k;
+         num = -num;
+      }
+      last_k = 2 * n;
+      term = (zeta_polynomial_series(T(2 * n), T(1 - T(2 * n)), digits) - 1) * factor / n;
+      sum += term;
+      if(term < lim)
+         break;
+   }
+   return exp(sum / boost::math::constants::ln_two<T, boost::math::policies::policy<> >());
+}
+
+}
+
+template <class T>
+template<int N>
+inline T constant_khinchin<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+   int n = N ? (std::min)(N, tools::digits<T>()) : tools::digits<T>();
+   return khinchin_detail::khinchin<T>(n);
+}
+
+template <class T>
+template<int N>
+inline T constant_extreme_value_skewness<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{ // from e_float constants.cpp
+  // Mathematica: N[12 Sqrt[6]  Zeta[3]/Pi^3, 1101]
+   BOOST_MATH_STD_USING
+   T ev(12 * sqrt(static_cast<T>(6)) * zeta_three<T, policies::policy<policies::digits2<N> > >()
+    / pi_cubed<T, policies::policy<policies::digits2<N> > >() );
+
+//T ev(
+//"1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150"
+//"1894272048688553376986765366075828644841024041679714157616857834895702411080704529137366329462558680"
+//"2015498788776135705587959418756809080074611906006528647805347822929577145038743873949415294942796280"
+//"0895597703063466053535550338267721294164578901640163603544404938283861127819804918174973533694090594"
+//"3094963822672055237678432023017824416203652657301470473548274848068762500300316769691474974950757965"
+//"8640779777748741897542093874605477776538884083378029488863880220988107155275203245233994097178778984"
+//"3488995668362387892097897322246698071290011857605809901090220903955815127463328974447572119951192970"
+//"3684453635456559086126406960279692862247058250100678008419431185138019869693206366891639436908462809"
+//"9756051372711251054914491837034685476095423926553367264355374652153595857163724698198860485357368964"
+//"3807049634423621246870868566707915720704996296083373077647528285782964567312903914752617978405994377"
+//"9064157147206717895272199736902453130842229559980076472936976287378945035706933650987259357729800315");
+
+  return ev;
+}
+
+namespace detail{
+//
+// Calculation of the Glaisher constant depends upon calculating the
+// derivative of the zeta function at 2, we can then use the relation:
+// zeta'(2) = 1/6 pi^2 [euler + ln(2pi)-12ln(A)]
+// To get the constant A.
+// See equation 45 at http://mathworld.wolfram.com/RiemannZetaFunction.html.
+//
+// The derivative of the zeta function is computed by direct differentiation
+// of the relation:
+// (1-2^(1-s))zeta(s) = SUM(n=0, INF){ (-n)^n / (n+1)^s  }
+// Which gives us 2 slowly converging but alternating sums to compute,
+// for this we use Algorithm 1 from "Convergent Acceleration of Alternating Series",
+// Henri Cohen, Fernando Rodriguez Villegas and Don Zagier, Experimental Mathematics 9:1 (1999).
+// See http://www.math.utexas.edu/users/villegas/publications/conv-accel.pdf
+//
+template <class T>
+T zeta_series_derivative_2(unsigned digits)
+{
+   // Derivative of the series part, evaluated at 2:
+   BOOST_MATH_STD_USING
+   int n = digits * 301 * 13 / 10000;
+   boost::math::itrunc((std::numeric_limits<T>::digits10 + 1) * 1.3);
+   T d = pow(3 + sqrt(T(8)), n);
+   d = (d + 1 / d) / 2;
+   T b = -1;
+   T c = -d;
+   T s = 0;
+   for(int k = 0; k < n; ++k)
+   {
+      T a = -log(T(k+1)) / ((k+1) * (k+1));
+      c = b - c;
+      s = s + c * a;
+      b = (k + n) * (k - n) * b / ((k + T(0.5f)) * (k + 1));
+   }
+   return s / d;
+}
+
+template <class T>
+T zeta_series_2(unsigned digits)
+{
+   // Series part of zeta at 2:
+   BOOST_MATH_STD_USING
+   int n = digits * 301 * 13 / 10000;
+   T d = pow(3 + sqrt(T(8)), n);
+   d = (d + 1 / d) / 2;
+   T b = -1;
+   T c = -d;
+   T s = 0;
+   for(int k = 0; k < n; ++k)
+   {
+      T a = T(1) / ((k + 1) * (k + 1));
+      c = b - c;
+      s = s + c * a;
+      b = (k + n) * (k - n) * b / ((k + T(0.5f)) * (k + 1));
+   }
+   return s / d;
+}
+
+template <class T>
+inline T zeta_series_lead_2()
+{
+   // lead part at 2:
+   return 2;
+}
+
+template <class T>
+inline T zeta_series_derivative_lead_2()
+{
+   // derivative of lead part at 2:
+   return -2 * boost::math::constants::ln_two<T>();
+}
+
+template <class T>
+inline T zeta_derivative_2(unsigned n)
+{
+   // zeta derivative at 2:
+   return zeta_series_derivative_2<T>(n) * zeta_series_lead_2<T>()
+      + zeta_series_derivative_lead_2<T>() * zeta_series_2<T>(n);
+}
+
+}  // namespace detail
+
+template <class T>
+template<int N>
+inline T constant_glaisher<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{
+
+   BOOST_MATH_STD_USING
+   typedef policies::policy<policies::digits2<N> > forwarding_policy;
+   int n = N ? (std::min)(N, tools::digits<T>()) : tools::digits<T>();
+   T v = detail::zeta_derivative_2<T>(n);
+   v *= 6;
+   v /= boost::math::constants::pi<T, forwarding_policy>() * boost::math::constants::pi<T, forwarding_policy>();
+   v -= boost::math::constants::euler<T, forwarding_policy>();
+   v -= log(2 * boost::math::constants::pi<T, forwarding_policy>());
+   v /= -12;
+   return exp(v);
+
+ /*
+   // from http://mpmath.googlecode.com/svn/data/glaisher.txt
+     // 20,000 digits of the Glaisher-Kinkelin constant A = exp(1/2 - zeta'(-1))
+     // Computed using A = exp((6 (-zeta'(2))/pi^2 + log 2 pi + gamma)/12)
+  // with Euler-Maclaurin summation for zeta'(2).
+  T g(
+  "1.282427129100622636875342568869791727767688927325001192063740021740406308858826"
+  "46112973649195820237439420646120399000748933157791362775280404159072573861727522"
+  "14334327143439787335067915257366856907876561146686449997784962754518174312394652"
+  "76128213808180219264516851546143919901083573730703504903888123418813674978133050"
+  "93770833682222494115874837348064399978830070125567001286994157705432053927585405"
+  "81731588155481762970384743250467775147374600031616023046613296342991558095879293"
+  "36343887288701988953460725233184702489001091776941712153569193674967261270398013"
+  "52652668868978218897401729375840750167472114895288815996668743164513890306962645"
+  "59870469543740253099606800842447417554061490189444139386196089129682173528798629"
+  "88434220366989900606980888785849587494085307347117090132667567503310523405221054"
+  "14176776156308191919997185237047761312315374135304725819814797451761027540834943"
+  "14384965234139453373065832325673954957601692256427736926358821692159870775858274"
+  "69575162841550648585890834128227556209547002918593263079373376942077522290940187");
+
+  return g;
+  */
+}
+
+template <class T>
+template<int N>
+inline T constant_rayleigh_skewness<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{  // From e_float
+  // 1100 digits of the Rayleigh distribution skewness
+  // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
+
+   BOOST_MATH_STD_USING
+   T rs(2 * root_pi<T, policies::policy<policies::digits2<N> > >()
+      * pi_minus_three<T, policies::policy<policies::digits2<N> > >()
+      / pow(four_minus_pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(3./2))
+      );
+ //   6.31110657818937138191899351544227779844042203134719497658094585692926819617473725459905027032537306794400047264,
+
+  //"0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067"
+  //"9440004726436754739597525250317640394102954301685809920213808351450851396781817932734836994829371322"
+  //"5797376021347531983451654130317032832308462278373358624120822253764532674177325950686466133508511968"
+  //"2389168716630349407238090652663422922072397393006683401992961569208109477307776249225072042971818671"
+  //"4058887072693437217879039875871765635655476241624825389439481561152126886932506682176611183750503553"
+  //"1218982627032068396407180216351425758181396562859085306247387212297187006230007438534686340210168288"
+  //"8956816965453815849613622117088096547521391672977226658826566757207615552041767516828171274858145957"
+  //"6137539156656005855905288420585194082284972984285863898582313048515484073396332610565441264220790791"
+  //"0194897267890422924599776483890102027823328602965235306539844007677157873140562950510028206251529523"
+  //"7428049693650605954398446899724157486062545281504433364675815915402937209673727753199567661561209251"
+  //"4695589950526053470201635372590001578503476490223746511106018091907936826431407434894024396366284848");  ;
+  return rs;
+}
+
+template <class T>
+template<int N>
+inline T constant_rayleigh_kurtosis_excess<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{ // - (6 Pi^2 - 24 Pi + 16)/((Pi - 4)^2)
+    // Might provide and calculate this using pi_minus_four.
+   BOOST_MATH_STD_USING
+   return - (((static_cast<T>(6) * pi<T, policies::policy<policies::digits2<N> > >()
+        * pi<T, policies::policy<policies::digits2<N> > >())
+   - (static_cast<T>(24) * pi<T, policies::policy<policies::digits2<N> > >()) + static_cast<T>(16) )
+   /
+   ((pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4))
+   * (pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4)))
+   );
+}
+
+template <class T>
+template<int N>
+inline T constant_rayleigh_kurtosis<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
+{ // 3 - (6 Pi^2 - 24 Pi + 16)/((Pi - 4)^2)
+  // Might provide and calculate this using pi_minus_four.
+   BOOST_MATH_STD_USING
+   return static_cast<T>(3) - (((static_cast<T>(6) * pi<T, policies::policy<policies::digits2<N> > >()
+        * pi<T, policies::policy<policies::digits2<N> > >())
+   - (static_cast<T>(24) * pi<T, policies::policy<policies::digits2<N> > >()) + static_cast<T>(16) )
+   /
+   ((pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4))
+   * (pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4)))
+   );
+}
+
+}}}} // namespaces
+
+#endif // BOOST_MATH_CALCULATE_CONSTANTS_CONSTANTS_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/constants/constants.hpp b/gatb-core/thirdparty/boost/math/constants/constants.hpp
new file mode 100644
index 0000000..59873c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/constants/constants.hpp
@@ -0,0 +1,359 @@
+//  Copyright John Maddock 2005-2006, 2011.
+//  Copyright Paul A. Bristow 2006-2011.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_CONSTANTS_CONSTANTS_INCLUDED
+#define BOOST_MATH_CONSTANTS_CONSTANTS_INCLUDED
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/tools/precision.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4127 4701)
+#endif
+#ifndef BOOST_MATH_NO_LEXICAL_CAST
+#include <boost/lexical_cast.hpp>
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/utility/declval.hpp>
+
+
+namespace boost{ namespace math
+{
+  namespace constants
+  {
+    // To permit other calculations at about 100 decimal digits with some UDT,
+    // it is obviously necessary to define constants to this accuracy.
+
+    // However, some compilers do not accept decimal digits strings as long as this.
+    // So the constant is split into two parts, with the 1st containing at least
+    // long double precision, and the 2nd zero if not needed or known.
+    // The 3rd part permits an exponent to be provided if necessary (use zero if none) -
+    // the other two parameters may only contain decimal digits (and sign and decimal point),
+    // and may NOT include an exponent like 1.234E99.
+    // The second digit string is only used if T is a User-Defined Type,
+    // when the constant is converted to a long string literal and lexical_casted to type T.
+    // (This is necessary because you can't use a numeric constant
+    // since even a long double might not have enough digits).
+
+   enum construction_method
+   {
+      construct_from_float = 1,
+      construct_from_double = 2,
+      construct_from_long_double = 3,
+      construct_from_string = 4,
+      construct_from_float128 = 5,
+      // Must be the largest value above:
+      construct_max = construct_from_float128
+   };
+
+   //
+   // Traits class determines how to convert from string based on whether T has a constructor
+   // from const char* or not:
+   //
+   template <int N>
+   struct dummy_size{};
+
+   template <class T>
+   struct is_explicitly_convertible_from_string
+   {
+#ifndef BOOST_NO_SFINAE_EXPR
+      template<typename S1, typename T1>
+      static type_traits::yes_type selector(dummy_size<sizeof(static_cast<T1>(declval<S1>()))>*);
+
+      template<typename S1, typename T1>
+      static type_traits::no_type selector(...);
+
+      static const bool value = sizeof(selector<const char*, T>(0)) == sizeof(type_traits::yes_type);
+#else
+      static const bool value = false;
+#endif
+   };
+
+   //
+   // Max number of binary digits in the string representations
+   // of our constants:
+   //
+   BOOST_STATIC_CONSTANT(int, max_string_digits = (101 * 1000L) / 301L);
+
+   template <class Real, class Policy>
+   struct construction_traits
+   {
+   private:
+      typedef typename policies::precision<Real, Policy>::type t1;
+      typedef typename policies::precision<float, Policy>::type t2;
+      typedef typename policies::precision<double, Policy>::type t3;
+      typedef typename policies::precision<long double, Policy>::type t4;
+#ifdef BOOST_MATH_USE_FLOAT128
+      typedef mpl::int_<113> t5;
+#endif
+   public:
+      typedef typename mpl::if_<
+         mpl::and_<boost::is_convertible<float, Real>, mpl::bool_< t1::value <= t2::value>, mpl::bool_<0 != t1::value> >,
+         mpl::int_<construct_from_float>,
+         typename mpl::if_<
+            mpl::and_<boost::is_convertible<double, Real>, mpl::bool_< t1::value <= t3::value>, mpl::bool_<0 != t1::value> >,
+            mpl::int_<construct_from_double>,
+            typename mpl::if_<
+               mpl::and_<boost::is_convertible<long double, Real>, mpl::bool_< t1::value <= t4::value>, mpl::bool_<0 != t1::value> >,
+               mpl::int_<construct_from_long_double>,
+#ifdef BOOST_MATH_USE_FLOAT128
+               typename mpl::if_<
+               mpl::and_<boost::is_convertible<BOOST_MATH_FLOAT128_TYPE, Real>, mpl::bool_< t1::value <= t5::value>, mpl::bool_<0 != t1::value> >,
+                  mpl::int_<construct_from_float128>,
+                  typename mpl::if_<
+                     mpl::and_<mpl::bool_< t1::value <= max_string_digits>, mpl::bool_<0 != t1::value> >,
+                     mpl::int_<construct_from_string>,
+                     mpl::int_<t1::value>
+                  >::type
+               >::type
+#else
+               typename mpl::if_<
+                  mpl::and_<mpl::bool_< t1::value <= max_string_digits>, mpl::bool_<0 != t1::value> >,
+                  mpl::int_<construct_from_string>,
+                  mpl::int_<t1::value>
+               >::type
+#endif
+            >::type
+         >::type
+      >::type type;
+   };
+
+#ifdef BOOST_HAS_THREADS
+#define BOOST_MATH_CONSTANT_THREAD_HELPER(name, prefix) \
+      boost::once_flag f = BOOST_ONCE_INIT;\
+      boost::call_once(f, &BOOST_JOIN(BOOST_JOIN(string_, get_), name)<T>);
+#else
+#define BOOST_MATH_CONSTANT_THREAD_HELPER(name, prefix)
+#endif
+
+   namespace detail{
+
+      template <class Real, class Policy = boost::math::policies::policy<> >
+      struct constant_return
+      {
+         typedef typename construction_traits<Real, Policy>::type construct_type;
+         typedef typename mpl::if_c<
+            (construct_type::value == construct_from_string) || (construct_type::value > construct_max),
+            const Real&, Real>::type type;
+      };
+
+      template <class Real>
+      Real convert_from_string(const char* p, const mpl::false_&)
+      {
+#ifdef BOOST_MATH_NO_LEXICAL_CAST
+         // This function should not compile, we don't have the necesary functionality to support it:
+         BOOST_STATIC_ASSERT(sizeof(Real) == 0);
+#else
+         return boost::lexical_cast<Real>(p);
+#endif
+      }
+      template <class Real>
+      const char* convert_from_string(const char* p, const mpl::true_&)
+      {
+         return p;
+      }
+
+      template <class T, const T& (*F)()>
+      struct constant_initializer
+      {
+         static void force_instantiate()
+         {
+            init.force_instantiate();
+         }
+      private:
+         struct initializer
+         {
+            initializer()
+            {
+               F();
+            }
+            void force_instantiate()const{}
+         };
+         static const initializer init;
+      };
+
+      template <class T, const T& (*F)()>
+      typename constant_initializer<T, F>::initializer const constant_initializer<T, F>::init;
+
+      template <class T, int N, const T& (*F)(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))>
+      struct constant_initializer2
+      {
+         static void force_instantiate()
+         {
+            init.force_instantiate();
+         }
+      private:
+         struct initializer
+         {
+            initializer()
+            {
+               F();
+            }
+            void force_instantiate()const{}
+         };
+         static const initializer init;
+      };
+
+      template <class T, int N, const T& (*F)(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))>
+      typename constant_initializer2<T, N, F>::initializer const constant_initializer2<T, N, F>::init;
+
+   }
+
+#ifdef BOOST_MATH_USE_FLOAT128
+#  define BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x) \
+   static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float128>&)\
+   { return BOOST_JOIN(x, Q); }
+#else
+#  define BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x)
+#endif
+
+#define BOOST_DEFINE_MATH_CONSTANT(name, x, y)\
+   namespace detail{\
+   template <class T> struct BOOST_JOIN(constant_, name){\
+   private:\
+   /* The default implementations come next: */ \
+   static inline const T& get_from_string()\
+   {\
+      typedef mpl::bool_<boost::is_convertible<const char*, T>::value || boost::math::constants::is_explicitly_convertible_from_string<T>::value> tag_type;\
+      static const T result(convert_from_string<T>(y, tag_type()));\
+      return result;\
+   }\
+   /* This one is for very high precision that is none the less known at compile time: */ \
+   template <int N> static T compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>));\
+   template <int N> static inline const T& get_from_compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))\
+   {\
+      static const T result = compute<N>();\
+      return result;\
+   }\
+   /* public getters come next */\
+   public:\
+   static inline const T& get(const mpl::int_<construct_from_string>&)\
+   {\
+      constant_initializer<T, & BOOST_JOIN(constant_, name)<T>::get_from_string >::force_instantiate();\
+      return get_from_string();\
+   }\
+   static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float>)\
+   { return BOOST_JOIN(x, F); }\
+   static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_double>&)\
+   { return x; }\
+   static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_long_double>&)\
+   { return BOOST_JOIN(x, L); }\
+   BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x) \
+   template <int N> static inline const T& get(const mpl::int_<N>&)\
+   {\
+      constant_initializer2<T, N, & BOOST_JOIN(constant_, name)<T>::template get_from_compute<N> >::force_instantiate();\
+      return get_from_compute<N>(); \
+   }\
+   /* This one is for true arbitary precision, which may well vary at runtime: */ \
+   static inline T get(const mpl::int_<0>&)\
+   { return tools::digits<T>() > max_string_digits ? compute<0>() : get(mpl::int_<construct_from_string>()); }\
+   }; /* end of struct */\
+   } /* namespace detail */ \
+   \
+   \
+   /* The actual forwarding function: */ \
+   template <class T, class Policy> inline BOOST_CONSTEXPR typename detail::constant_return<T, Policy>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(Policy))\
+   { return detail:: BOOST_JOIN(constant_, name)<T>::get(typename construction_traits<T, Policy>::type()); }\
+   template <class T> inline BOOST_CONSTEXPR typename detail::constant_return<T>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))\
+   { return name<T, boost::math::policies::policy<> >(); }\
+   \
+   \
+   /* Now the namespace specific versions: */ \
+   } namespace float_constants{ BOOST_STATIC_CONSTEXPR float name = BOOST_JOIN(x, F); }\
+   namespace double_constants{ BOOST_STATIC_CONSTEXPR double name = x; } \
+   namespace long_double_constants{ BOOST_STATIC_CONSTEXPR long double name = BOOST_JOIN(x, L); }\
+   namespace constants{
+
+  BOOST_DEFINE_MATH_CONSTANT(half, 5.000000000000000000000000000000000000e-01, "5.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01")
+  BOOST_DEFINE_MATH_CONSTANT(third, 3.333333333333333333333333333333333333e-01, "3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333e-01")
+  BOOST_DEFINE_MATH_CONSTANT(twothirds, 6.666666666666666666666666666666666666e-01, "6.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01")
+  BOOST_DEFINE_MATH_CONSTANT(two_thirds, 6.666666666666666666666666666666666666e-01, "6.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01")
+  BOOST_DEFINE_MATH_CONSTANT(three_quarters, 7.500000000000000000000000000000000000e-01, "7.50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01")
+  BOOST_DEFINE_MATH_CONSTANT(root_two, 1.414213562373095048801688724209698078e+00, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623e+00")
+  BOOST_DEFINE_MATH_CONSTANT(root_three, 1.732050807568877293527446341505872366e+00, "1.73205080756887729352744634150587236694280525381038062805580697945193301690880003708114618675724857567562614142e+00")
+  BOOST_DEFINE_MATH_CONSTANT(half_root_two, 7.071067811865475244008443621048490392e-01, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115e-01")
+  BOOST_DEFINE_MATH_CONSTANT(ln_two, 6.931471805599453094172321214581765680e-01, "6.93147180559945309417232121458176568075500134360255254120680009493393621969694715605863326996418687542001481021e-01")
+  BOOST_DEFINE_MATH_CONSTANT(ln_ln_two, -3.665129205816643270124391582326694694e-01, "-3.66512920581664327012439158232669469454263447837105263053677713670561615319352738549455822856698908358302523045e-01")
+  BOOST_DEFINE_MATH_CONSTANT(root_ln_four, 1.177410022515474691011569326459699637e+00, "1.17741002251547469101156932645969963774738568938582053852252575650002658854698492680841813836877081106747157858e+00")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_root_two, 7.071067811865475244008443621048490392e-01, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115e-01")
+  BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00")
+  BOOST_DEFINE_MATH_CONSTANT(half_pi, 1.570796326794896619231321691639751442e+00, "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404326e+00")
+  BOOST_DEFINE_MATH_CONSTANT(third_pi, 1.047197551196597746154214461093167628e+00, "1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550e+00")
+  BOOST_DEFINE_MATH_CONSTANT(sixth_pi, 5.235987755982988730771072305465838140e-01, "5.23598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752e-01")
+  BOOST_DEFINE_MATH_CONSTANT(two_pi, 6.283185307179586476925286766559005768e+00, "6.28318530717958647692528676655900576839433879875021164194988918461563281257241799725606965068423413596429617303e+00")
+  BOOST_DEFINE_MATH_CONSTANT(two_thirds_pi, 2.094395102393195492308428922186335256e+00, "2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539101e+00")
+  BOOST_DEFINE_MATH_CONSTANT(three_quarters_pi, 2.356194490192344928846982537459627163e+00, "2.35619449019234492884698253745962716314787704953132936573120844423086230471465674897102611900658780098661106488e+00")
+  BOOST_DEFINE_MATH_CONSTANT(four_thirds_pi, 4.188790204786390984616857844372670512e+00, "4.18879020478639098461685784437267051226289253250014109463325945641042187504827866483737976712282275730953078202e+00")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_two_pi, 1.591549430918953357688837633725143620e-01, "1.59154943091895335768883763372514362034459645740456448747667344058896797634226535090113802766253085956072842727e-01")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_root_two_pi, 3.989422804014326779399460599343818684e-01, "3.98942280401432677939946059934381868475858631164934657665925829670657925899301838501252333907306936430302558863e-01")
+  BOOST_DEFINE_MATH_CONSTANT(root_pi, 1.772453850905516027298167483341145182e+00, "1.77245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362e+00")
+  BOOST_DEFINE_MATH_CONSTANT(root_half_pi, 1.253314137315500251207882642405522626e+00, "1.25331413731550025120788264240552262650349337030496915831496178817114682730392098747329791918902863305800498633e+00")
+  BOOST_DEFINE_MATH_CONSTANT(root_two_pi, 2.506628274631000502415765284811045253e+00, "2.50662827463100050241576528481104525300698674060993831662992357634229365460784197494659583837805726611600997267e+00")
+  BOOST_DEFINE_MATH_CONSTANT(log_root_two_pi, 9.189385332046727417803297364056176398e-01, "9.18938533204672741780329736405617639861397473637783412817151540482765695927260397694743298635954197622005646625e-01")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_root_pi, 5.641895835477562869480794515607725858e-01, "5.64189583547756286948079451560772585844050629328998856844085721710642468441493414486743660202107363443028347906e-01")
+  BOOST_DEFINE_MATH_CONSTANT(root_one_div_pi, 5.641895835477562869480794515607725858e-01, "5.64189583547756286948079451560772585844050629328998856844085721710642468441493414486743660202107363443028347906e-01")
+  BOOST_DEFINE_MATH_CONSTANT(pi_minus_three, 1.415926535897932384626433832795028841e-01, "1.41592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513e-01")
+  BOOST_DEFINE_MATH_CONSTANT(four_minus_pi, 8.584073464102067615373566167204971158e-01, "8.58407346410206761537356616720497115802830600624894179025055407692183593713791001371965174657882932017851913487e-01")
+  //BOOST_DEFINE_MATH_CONSTANT(pow23_four_minus_pi, 7.953167673715975443483953350568065807e-01, "7.95316767371597544348395335056806580727639173327713205445302234388856268267518187590758006888600828436839800178e-01")
+  BOOST_DEFINE_MATH_CONSTANT(pi_pow_e, 2.245915771836104547342715220454373502e+01, "2.24591577183610454734271522045437350275893151339966922492030025540669260403991179123185197527271430315314500731e+01")
+  BOOST_DEFINE_MATH_CONSTANT(pi_sqr, 9.869604401089358618834490999876151135e+00, "9.86960440108935861883449099987615113531369940724079062641334937622004482241920524300177340371855223182402591377e+00")
+  BOOST_DEFINE_MATH_CONSTANT(pi_sqr_div_six, 1.644934066848226436472415166646025189e+00, "1.64493406684822643647241516664602518921894990120679843773555822937000747040320087383362890061975870530400431896e+00")
+  BOOST_DEFINE_MATH_CONSTANT(pi_cubed, 3.100627668029982017547631506710139520e+01, "3.10062766802998201754763150671013952022252885658851076941445381038063949174657060375667010326028861930301219616e+01")
+  BOOST_DEFINE_MATH_CONSTANT(cbrt_pi, 1.464591887561523263020142527263790391e+00, "1.46459188756152326302014252726379039173859685562793717435725593713839364979828626614568206782035382089750397002e+00")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_cbrt_pi, 6.827840632552956814670208331581645981e-01, "6.82784063255295681467020833158164598108367515632448804042681583118899226433403918237673501922595519865685577274e-01")
+  BOOST_DEFINE_MATH_CONSTANT(e, 2.718281828459045235360287471352662497e+00, "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193e+00")
+  BOOST_DEFINE_MATH_CONSTANT(exp_minus_half, 6.065306597126334236037995349911804534e-01, "6.06530659712633423603799534991180453441918135487186955682892158735056519413748423998647611507989456026423789794e-01")
+  BOOST_DEFINE_MATH_CONSTANT(e_pow_pi, 2.314069263277926900572908636794854738e+01, "2.31406926327792690057290863679485473802661062426002119934450464095243423506904527835169719970675492196759527048e+01")
+  BOOST_DEFINE_MATH_CONSTANT(root_e, 1.648721270700128146848650787814163571e+00, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663776e+00")
+  BOOST_DEFINE_MATH_CONSTANT(log10_e, 4.342944819032518276511289189166050822e-01, "4.34294481903251827651128918916605082294397005803666566114453783165864649208870774729224949338431748318706106745e-01")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_log10_e, 2.302585092994045684017991454684364207e+00, "2.30258509299404568401799145468436420760110148862877297603332790096757260967735248023599720508959829834196778404e+00")
+  BOOST_DEFINE_MATH_CONSTANT(ln_ten, 2.302585092994045684017991454684364207e+00, "2.30258509299404568401799145468436420760110148862877297603332790096757260967735248023599720508959829834196778404e+00")
+  BOOST_DEFINE_MATH_CONSTANT(degree, 1.745329251994329576923690768488612713e-02, "1.74532925199432957692369076848861271344287188854172545609719144017100911460344944368224156963450948221230449251e-02")
+  BOOST_DEFINE_MATH_CONSTANT(radian, 5.729577951308232087679815481410517033e+01, "5.72957795130823208767981548141051703324054724665643215491602438612028471483215526324409689958511109441862233816e+01")
+  BOOST_DEFINE_MATH_CONSTANT(sin_one, 8.414709848078965066525023216302989996e-01, "8.41470984807896506652502321630298999622563060798371065672751709991910404391239668948639743543052695854349037908e-01")
+  BOOST_DEFINE_MATH_CONSTANT(cos_one, 5.403023058681397174009366074429766037e-01, "5.40302305868139717400936607442976603732310420617922227670097255381100394774471764517951856087183089343571731160e-01")
+  BOOST_DEFINE_MATH_CONSTANT(sinh_one, 1.175201193643801456882381850595600815e+00, "1.17520119364380145688238185059560081515571798133409587022956541301330756730432389560711745208962339184041953333e+00")
+  BOOST_DEFINE_MATH_CONSTANT(cosh_one, 1.543080634815243778477905620757061682e+00, "1.54308063481524377847790562075706168260152911236586370473740221471076906304922369896426472643554303558704685860e+00")
+  BOOST_DEFINE_MATH_CONSTANT(phi, 1.618033988749894848204586834365638117e+00, "1.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408808e+00")
+  BOOST_DEFINE_MATH_CONSTANT(ln_phi, 4.812118250596034474977589134243684231e-01, "4.81211825059603447497758913424368423135184334385660519661018168840163867608221774412009429122723474997231839958e-01")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_ln_phi, 2.078086921235027537601322606117795767e+00, "2.07808692123502753760132260611779576774219226778328348027813992191974386928553540901445615414453604821933918634e+00")
+  BOOST_DEFINE_MATH_CONSTANT(euler, 5.772156649015328606065120900824024310e-01, "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447250e-01")
+  BOOST_DEFINE_MATH_CONSTANT(one_div_euler, 1.732454714600633473583025315860829681e+00, "1.73245471460063347358302531586082968115577655226680502204843613287065531408655243008832840219409928068072365714e+00")
+  BOOST_DEFINE_MATH_CONSTANT(euler_sqr, 3.331779238077186743183761363552442266e-01, "3.33177923807718674318376136355244226659417140249629743150833338002265793695756669661263268631715977303039565603e-01")
+  BOOST_DEFINE_MATH_CONSTANT(zeta_two, 1.644934066848226436472415166646025189e+00, "1.64493406684822643647241516664602518921894990120679843773555822937000747040320087383362890061975870530400431896e+00")
+  BOOST_DEFINE_MATH_CONSTANT(zeta_three, 1.202056903159594285399738161511449990e+00, "1.20205690315959428539973816151144999076498629234049888179227155534183820578631309018645587360933525814619915780e+00")
+  BOOST_DEFINE_MATH_CONSTANT(catalan, 9.159655941772190150546035149323841107e-01, "9.15965594177219015054603514932384110774149374281672134266498119621763019776254769479356512926115106248574422619e-01")
+  BOOST_DEFINE_MATH_CONSTANT(glaisher, 1.282427129100622636875342568869791727e+00, "1.28242712910062263687534256886979172776768892732500119206374002174040630885882646112973649195820237439420646120e+00")
+  BOOST_DEFINE_MATH_CONSTANT(khinchin, 2.685452001065306445309714835481795693e+00, "2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515346591e+00")
+  BOOST_DEFINE_MATH_CONSTANT(extreme_value_skewness, 1.139547099404648657492793019389846112e+00, "1.13954709940464865749279301938984611208759979583655182472165571008524800770607068570718754688693851501894272049e+00")
+  BOOST_DEFINE_MATH_CONSTANT(rayleigh_skewness, 6.311106578189371381918993515442277798e-01, "6.31110657818937138191899351544227779844042203134719497658094585692926819617473725459905027032537306794400047264e-01")
+  BOOST_DEFINE_MATH_CONSTANT(rayleigh_kurtosis, 3.245089300687638062848660410619754415e+00, "3.24508930068763806284866041061975441541706673178920936177133764493367904540874159051490619368679348977426462633e+00")
+  BOOST_DEFINE_MATH_CONSTANT(rayleigh_kurtosis_excess, 2.450893006876380628486604106197544154e-01, "2.45089300687638062848660410619754415417066731789209361771337644933679045408741590514906193686793489774264626328e-01")
+
+  BOOST_DEFINE_MATH_CONSTANT(two_div_pi, 6.366197723675813430755350534900574481e-01, "6.36619772367581343075535053490057448137838582961825794990669376235587190536906140360455211065012343824291370907e-01")
+  BOOST_DEFINE_MATH_CONSTANT(root_two_div_pi, 7.978845608028653558798921198687637369e-01, "7.97884560802865355879892119868763736951717262329869315331851659341315851798603677002504667814613872860605117725e-01")
+
+
+} // namespace constants
+} // namespace math
+} // namespace boost
+
+//
+// We deliberately include this *after* all the declarations above,
+// that way the calculation routines can call on other constants above:
+//
+#include <boost/math/constants/calculate_constants.hpp>
+
+#endif // BOOST_MATH_CONSTANTS_CONSTANTS_INCLUDED
+
+
diff --git a/gatb-core/thirdparty/boost/math/constants/info.hpp b/gatb-core/thirdparty/boost/math/constants/info.hpp
new file mode 100644
index 0000000..e3e6a51
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/constants/info.hpp
@@ -0,0 +1,163 @@
+//  Copyright John Maddock 2010.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifdef _MSC_VER
+#  pragma once
+#endif
+
+#ifndef BOOST_MATH_CONSTANTS_INFO_INCLUDED
+#define BOOST_MATH_CONSTANTS_INFO_INCLUDED
+
+#include <boost/math/constants/constants.hpp>
+#include <iostream>
+#include <iomanip>
+#include <typeinfo>
+
+namespace boost{ namespace math{ namespace constants{
+
+   namespace detail{
+
+      template <class T>
+      const char* nameof(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+      {
+         return typeid(T).name();
+      }
+      template <>
+      const char* nameof<float>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(float))
+      {
+         return "float";
+      }
+      template <>
+      const char* nameof<double>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(double))
+      {
+         return "double";
+      }
+      template <>
+      const char* nameof<long double>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(long double))
+      {
+         return "long double";
+      }
+
+   }
+
+template <class T, class Policy>
+void print_info_on_type(std::ostream& os = std::cout BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(Policy))
+{
+   using detail::nameof;
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   os <<
+      "Information on the Implementation and Handling of \n"
+      "Mathematical Constants for Type " << nameof<T>() <<
+      "\n\n"
+      "Checking for std::numeric_limits<" << nameof<T>() << "> specialisation: " <<
+      (std::numeric_limits<T>::is_specialized ? "yes" : "no") << std::endl;
+   if(std::numeric_limits<T>::is_specialized)
+   {
+      os <<
+         "std::numeric_limits<" << nameof<T>() << ">::digits reports that the radix is " << std::numeric_limits<T>::radix << ".\n";
+      if (std::numeric_limits<T>::radix == 2)
+      {
+      os <<
+         "std::numeric_limits<" << nameof<T>() << ">::digits reports that the precision is \n" << std::numeric_limits<T>::digits << " binary digits.\n";
+      }
+      else if (std::numeric_limits<T>::radix == 10)
+      {
+         os <<
+         "std::numeric_limits<" << nameof<T>() << ">::digits reports that the precision is \n" << std::numeric_limits<T>::digits10 << " decimal digits.\n";
+         os <<
+         "std::numeric_limits<" << nameof<T>() << ">::digits reports that the precision is \n"
+         << std::numeric_limits<T>::digits * 1000L /301L << " binary digits.\n";  // divide by log2(10) - about 3 bits per decimal digit.
+      }
+      else
+      {
+        os << "Unknown radix = " << std::numeric_limits<T>::radix << "\n";
+      }
+   }
+   typedef typename boost::math::policies::precision<T, Policy>::type precision_type;
+   if(precision_type::value)
+   {
+      if (std::numeric_limits<T>::radix == 2)
+      {
+       os <<
+       "boost::math::policies::precision<" << nameof<T>() << ", " << nameof<Policy>() << " reports that the compile time precision is \n" << precision_type::value << " binary digits.\n";
+      }
+      else if (std::numeric_limits<T>::radix == 10)
+      {
+         os <<
+         "boost::math::policies::precision<" << nameof<T>() << ", " << nameof<Policy>() << " reports that the compile time precision is \n" << precision_type::value << " binary digits.\n";
+      }
+      else
+      {
+        os << "Unknown radix = " << std::numeric_limits<T>::radix <<  "\n";
+      }
+   }
+   else
+   {
+      os <<
+         "boost::math::policies::precision<" << nameof<T>() << ", Policy> \n"
+         "reports that there is no compile type precision available.\n"
+         "boost::math::tools::digits<" << nameof<T>() << ">() \n"
+         "reports that the current runtime precision is \n" <<
+         boost::math::tools::digits<T>() << " binary digits.\n";
+   }
+
+   typedef typename construction_traits<T, Policy>::type construction_type;
+
+   switch(construction_type::value)
+   {
+   case 0:
+      os <<
+         "No compile time precision is available, the construction method \n"
+         "will be decided at runtime and results will not be cached \n"
+         "- this may lead to poor runtime performance.\n"
+         "Current runtime precision indicates that\n";
+      if(boost::math::tools::digits<T>() > max_string_digits)
+      {
+         os << "the constant will be recalculated on each call.\n";
+      }
+      else
+      {
+         os << "the constant will be constructed from a string on each call.\n";
+      }
+      break;
+   case 1:
+      os <<
+         "The constant will be constructed from a float.\n";
+      break;
+   case 2:
+      os <<
+         "The constant will be constructed from a double.\n";
+      break;
+   case 3:
+      os <<
+         "The constant will be constructed from a long double.\n";
+      break;
+   case 4:
+      os <<
+         "The constant will be constructed from a string (and the result cached).\n";
+      break;
+   default:
+      os <<
+         "The constant will be calculated (and the result cached).\n";
+      break;
+   }
+   os << std::endl;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class T>
+void print_info_on_type(std::ostream& os = std::cout BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+{
+   print_info_on_type<T, boost::math::policies::policy<> >(os);
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_CONSTANTS_INFO_INCLUDED
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_cmath.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_cmath.hpp
new file mode 100644
index 0000000..3043d90
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_cmath.hpp
@@ -0,0 +1,600 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision <cmath> support.
+
+#ifndef _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #include <cmath>
+  #include <stdexcept>
+  #include <boost/cstdint.hpp>
+  #include <boost/static_assert.hpp>
+  #include <boost/throw_exception.hpp>
+
+  #if defined(_WIN32) && defined(__GNUC__)
+    // Several versions of Mingw and probably cygwin too have broken
+    // libquadmath implementations that segfault as soon as you call
+    // expq or any function that depends on it.
+    #define BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+  #endif
+
+  // Here is a helper function used for raising the value of a given
+  // floating-point type to the power of n, where n has integral type.
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+
+  template<class float_type, class integer_type>
+  inline float_type pown(const float_type& x, const integer_type p)
+  {
+    const bool isneg  = (x < 0);
+    const bool isnan  = (x != x);
+    const bool isinf  = ((!isneg) ? bool(+x > (std::numeric_limits<float_type>::max)())
+                                  : bool(-x > (std::numeric_limits<float_type>::max)()));
+
+    if(isnan) { return x; }
+
+    if(isinf) { return std::numeric_limits<float_type>::quiet_NaN(); }
+
+    const bool       x_is_neg = (x < 0);
+    const float_type abs_x    = (x_is_neg ? -x : x);
+
+    if(p < static_cast<integer_type>(0))
+    {
+      if(abs_x < (std::numeric_limits<float_type>::min)())
+      {
+        return (x_is_neg ? -std::numeric_limits<float_type>::infinity()
+                         : +std::numeric_limits<float_type>::infinity());
+      }
+      else
+      {
+        return float_type(1) / pown(x, static_cast<integer_type>(-p));
+      }
+    }
+
+    if(p == static_cast<integer_type>(0))
+    {
+      return float_type(1);
+    }
+    else
+    {
+      if(p == static_cast<integer_type>(1)) { return x; }
+
+      if(abs_x > (std::numeric_limits<float_type>::max)())
+      {
+        return (x_is_neg ? -std::numeric_limits<float_type>::infinity()
+                         : +std::numeric_limits<float_type>::infinity());
+      }
+
+      if     (p == static_cast<integer_type>(2)) { return  (x * x); }
+      else if(p == static_cast<integer_type>(3)) { return ((x * x) * x); }
+      else if(p == static_cast<integer_type>(4)) { const float_type x2 = (x * x); return (x2 * x2); }
+      else
+      {
+        // The variable xn stores the binary powers of x.
+        float_type result(((p % integer_type(2)) != integer_type(0)) ? x : float_type(1));
+        float_type xn    (x);
+
+        integer_type p2 = p;
+
+        while(integer_type(p2 /= 2) != integer_type(0))
+        {
+          // Square xn for each binary power.
+          xn *= xn;
+
+          const bool has_binary_power = (integer_type(p2 % integer_type(2)) != integer_type(0));
+
+          if(has_binary_power)
+          {
+            // Multiply the result with each binary power contained in the exponent.
+            result *= xn;
+          }
+        }
+
+        return result;
+      }
+    }
+  }
+
+  } } } } // boost::math::cstdfloat::detail
+
+  // We will now define preprocessor symbols representing quadruple-precision <cmath> functions.
+  #if defined(BOOST_INTEL)
+    #define BOOST_CSTDFLOAT_FLOAT128_LDEXP  __ldexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FREXP  __frexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FABS   __fabsq
+    #define BOOST_CSTDFLOAT_FLOAT128_FLOOR  __floorq
+    #define BOOST_CSTDFLOAT_FLOAT128_CEIL   __ceilq
+    #if !defined(BOOST_CSTDFLOAT_FLOAT128_SQRT)
+    #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
+    #endif
+    #define BOOST_CSTDFLOAT_FLOAT128_TRUNC  __truncq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    __expq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXPM1  __expm1q
+    #define BOOST_CSTDFLOAT_FLOAT128_POW    __powq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG    __logq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG10  __log10q
+    #define BOOST_CSTDFLOAT_FLOAT128_SIN    __sinq
+    #define BOOST_CSTDFLOAT_FLOAT128_COS    __cosq
+    #define BOOST_CSTDFLOAT_FLOAT128_TAN    __tanq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASIN   __asinq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOS   __acosq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN   __atanq
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   __sinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   __coshq
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   __tanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  __asinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  __acoshq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  __atanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_FMOD   __fmodq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN2  __atan2q
+    #define BOOST_CSTDFLOAT_FLOAT128_LGAMMA __lgammaq
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA __tgammaq
+  #elif defined(__GNUC__)
+    #define BOOST_CSTDFLOAT_FLOAT128_LDEXP  ldexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FREXP  frexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FABS   fabsq
+    #define BOOST_CSTDFLOAT_FLOAT128_FLOOR  floorq
+    #define BOOST_CSTDFLOAT_FLOAT128_CEIL   ceilq
+    #if !defined(BOOST_CSTDFLOAT_FLOAT128_SQRT)
+    #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
+    #endif
+    #define BOOST_CSTDFLOAT_FLOAT128_TRUNC  truncq
+    #define BOOST_CSTDFLOAT_FLOAT128_POW    powq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG    logq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG10  log10q
+    #define BOOST_CSTDFLOAT_FLOAT128_SIN    sinq
+    #define BOOST_CSTDFLOAT_FLOAT128_COS    cosq
+    #define BOOST_CSTDFLOAT_FLOAT128_TAN    tanq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASIN   asinq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOS   acosq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN   atanq
+    #define BOOST_CSTDFLOAT_FLOAT128_FMOD   fmodq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN2  atan2q
+    #define BOOST_CSTDFLOAT_FLOAT128_LGAMMA lgammaq
+    #if !defined(BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS)
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    expq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXPM1  expm1q_internal
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   sinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   coshq
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   tanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  asinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  acoshq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  atanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA tgammaq
+    #else // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    expq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   sinhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   coshq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   tanhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  asinhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  acoshq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  atanhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA tgammaq_patch
+    #endif // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+  #endif 
+
+  // Implement quadruple-precision <cmath> functions in the namespace
+  // boost::math::cstdfloat::detail. Subsequently inject these into the
+  // std namespace via *using* directive.
+
+  // Begin with some forward function declarations. Also implement patches
+  // for compilers that have broken float128 exponential functions.
+
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LDEXP (boost::math::cstdfloat::detail::float_internal128_t, int)  throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FREXP (boost::math::cstdfloat::detail::float_internal128_t, int*) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FABS  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FLOOR (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_CEIL  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TRUNC (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_POW   (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LOG   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LOG10 (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SIN   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COS   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TAN   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASIN  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOS  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATAN  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FMOD  (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATAN2 (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LGAMMA(boost::math::cstdfloat::detail::float_internal128_t) throw();
+
+  #if !defined(BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS)
+
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SINH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COSH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TANH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASINH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOSH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATANH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TGAMMA(boost::math::cstdfloat::detail::float_internal128_t x) throw();
+
+  #else // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+
+  // Forward declaration of the patched exponent function, exp(x).
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x);
+
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXPM1 (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Compute exp(x) - 1 for x small.
+
+    // Use an order-36 polynomial approximation of the exponential function
+    // in the range of (-ln2 < x < ln2). Scale the argument to this range
+    // and subsequently multiply the result by 2^n accordingly.
+
+    // Derive the polynomial coefficients with Mathematica(R) by generating
+    // a table of high-precision values of exp(x) in the range (-ln2 < x < ln2)
+    // and subsequently applying the built-in *Fit* function.
+
+    // Table[{x, Exp[x] - 1}, {x, -Log[2], Log[2], 1/180}]
+    // N[%, 120]
+    // Fit[%, {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10, x^11, x^12,
+    //         x^13, x^14, x^15, x^16, x^17, x^18, x^19, x^20, x^21, x^22,
+    //         x^23, x^24, x^25, x^26, x^27, x^28, x^29, x^30, x^31, x^32,
+    //         x^33, x^34, x^35, x^36}, x]
+
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    float_type sum;
+
+    if(x > BOOST_FLOAT128_C(0.693147180559945309417232121458176568075500134360255))
+    {
+      sum = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x) - float_type(1);
+    }
+    else
+    {
+      // Compute the polynomial approximation of exp(alpha).
+      sum = ((((((((((((((((((((((((((((((((((((  float_type(BOOST_FLOAT128_C(2.69291698127774166063293705964720493864630783729857438187365E-42))  * x
+                                                + float_type(BOOST_FLOAT128_C(9.70937085471487654794114679403710456028986572118859594614033E-41))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.38715585158055097155585505318085512156885389014410753080500E-39))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.15162718532861050809222658798662695267019717760563645440433E-37))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.80039074689434663295873584133017767349635602413675471702393E-36))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.21612504934087520075905434734158045947460467096773246215239E-34))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.76998762883139753126119821241037824830069851253295480396224E-33))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.13099628863830344684998293828608215735777107850991029729440E-31))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.27988923706982293204067897468714277771890104022419696770352E-30))) * x
+                                                + float_type(BOOST_FLOAT128_C(9.18368986379558482800593745627556950089950023355628325088207E-29))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.47959626322479746949155352659617642905315302382639380521497E-27))) * x
+                                                + float_type(BOOST_FLOAT128_C(6.44695028438447337900255966737803112935639344283098705091949E-26))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.61173757109611834904452725462599961406036904573072897122957E-24))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.86817017063068403772269360016918092488847584660382953555804E-23))) * x
+                                                + float_type(BOOST_FLOAT128_C(8.89679139245057328674891109315654704307721758924206107351744E-22))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.95729410633912612308475595397946731738088422488032228717097E-20))) * x
+                                                + float_type(BOOST_FLOAT128_C(4.11031762331216485847799061511674191805055663711439605760231E-19))) * x
+                                                + float_type(BOOST_FLOAT128_C(8.22063524662432971695598123977873600603370758794431071426640E-18))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.56192069685862264622163643500633782667263448653185159383285E-16))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.81145725434552076319894558300988749849555291507956994126835E-15))) * x
+                                                + float_type(BOOST_FLOAT128_C(4.77947733238738529743820749111754320727153728139716409114011E-14))) * x
+                                                + float_type(BOOST_FLOAT128_C(7.64716373181981647590113198578807092707697416852226691068627E-13))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.14707455977297247138516979786821056670509688396295740818677E-11))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.60590438368216145993923771701549479323291461578567184216302E-10))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.08767569878680989792100903212014323125428376052986408239620E-09))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.50521083854417187750521083854417187750523408006206780016659E-08))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.75573192239858906525573192239858906525573195144226062684604E-07))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.75573192239858906525573192239858906525573191310049321957902E-06))) * x
+                                                + float_type(BOOST_FLOAT128_C(0.00002480158730158730158730158730158730158730158730149317774)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00019841269841269841269841269841269841269841269841293575920)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00138888888888888888888888888888888888888888888888889071045)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00833333333333333333333333333333333333333333333333332986595)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.04166666666666666666666666666666666666666666666666666664876)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.16666666666666666666666666666666666666666666666666666669048)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.50000000000000000000000000000000000000000000000000000000006)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.99999999999999999999999999999999999999999999999999999999995)))     * x);
+    }
+
+    return sum;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the expq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+
+    // Use an order-36 polynomial approximation of the exponential function
+    // in the range of (-ln2 < x < ln2). Scale the argument to this range
+    // and subsequently multiply the result by 2^n accordingly.
+
+    // Derive the polynomial coefficients with Mathematica(R) by generating
+    // a table of high-precision values of exp(x) in the range (-ln2 < x < ln2)
+    // and subsequently applying the built-in *Fit* function.
+
+    // Table[{x, Exp[x] - 1}, {x, -Log[2], Log[2], 1/180}]
+    // N[%, 120]
+    // Fit[%, {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10, x^11, x^12,
+    //         x^13, x^14, x^15, x^16, x^17, x^18, x^19, x^20, x^21, x^22,
+    //         x^23, x^24, x^25, x^26, x^27, x^28, x^29, x^30, x^31, x^32,
+    //         x^33, x^34, x^35, x^36}, x]
+
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    // Scale the argument x to the range (-ln2 < x < ln2).
+    BOOST_CONSTEXPR_OR_CONST float_type one_over_ln2 = float_type(BOOST_FLOAT128_C(1.44269504088896340735992468100189213742664595415299));
+    const float_type x_over_ln2   = x * one_over_ln2;
+
+    boost::int_fast32_t n;
+
+    if(x != x)
+    {
+      // The argument is NaN.
+      return std::numeric_limits<float_type>::quiet_NaN();
+    }
+    else if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) > BOOST_FLOAT128_C(+0.693147180559945309417232121458176568075500134360255))
+    {
+      // The absolute value of the argument exceeds ln2.
+      n = static_cast<boost::int_fast32_t>(::BOOST_CSTDFLOAT_FLOAT128_FLOOR(x_over_ln2));
+    }
+    else if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) < BOOST_FLOAT128_C(+0.693147180559945309417232121458176568075500134360255))
+    {
+      // The absolute value of the argument is less than ln2.
+      n = static_cast<boost::int_fast32_t>(0);
+    }
+    else
+    {
+      // The absolute value of the argument is exactly equal to ln2 (in the sense of floating-point equality).
+      return float_type(2);
+    }
+
+    // Check if the argument is very near an integer.
+    const float_type floor_of_x = ::BOOST_CSTDFLOAT_FLOAT128_FLOOR(x);
+
+    if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x - floor_of_x) < float_type(BOOST_CSTDFLOAT_FLOAT128_EPS))
+    {
+      // Return e^n for arguments very near an integer.
+      return boost::math::cstdfloat::detail::pown(BOOST_FLOAT128_C(2.71828182845904523536028747135266249775724709369996), static_cast<boost::int_fast32_t>(floor_of_x));
+    }
+
+    // Compute the scaled argument alpha.
+    const float_type alpha = x - (n * BOOST_FLOAT128_C(0.693147180559945309417232121458176568075500134360255));
+
+    // Compute the polynomial approximation of expm1(alpha) and add to it
+    // in order to obtain the scaled result.
+    const float_type scaled_result = ::BOOST_CSTDFLOAT_FLOAT128_EXPM1(alpha) + float_type(1);
+
+    // Rescale the result and return it.
+    return scaled_result * boost::math::cstdfloat::detail::pown(float_type(2), n);
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SINH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the sinhq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    // Here, we use the following:
+    // Set: ex  = exp(x)
+    // Set: em1 = expm1(x)
+    // Then
+    // sinh(x) = (ex - 1/ex) / 2         ; for |x| >= 1
+    // sinh(x) = (2em1 + em1^2) / (2ex)  ; for |x| < 1
+
+    const float_type ex = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+
+    if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) < float_type(+1))
+    {
+      const float_type em1 = ::BOOST_CSTDFLOAT_FLOAT128_EXPM1(x);
+
+      return ((em1 * 2) + (em1 * em1)) / (ex * 2);
+    }
+    else
+    {
+      return (ex - (float_type(1) / ex)) / 2;
+    }
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COSH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the coshq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type ex = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+    return (ex + (float_type(1) / ex)) / 2;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TANH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the tanhq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type ex_plus  = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+    const float_type ex_minus = (float_type(1) / ex_plus);
+    return (ex_plus - ex_minus) / (ex_plus + ex_minus);
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASINH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the asinh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    return ::BOOST_CSTDFLOAT_FLOAT128_LOG(x + ::BOOST_CSTDFLOAT_FLOAT128_SQRT((x * x) + float_type(1)));
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOSH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the acosh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type zp(x + float_type(1));
+    const float_type zm(x - float_type(1));
+
+    return ::BOOST_CSTDFLOAT_FLOAT128_LOG(x + (zp * ::BOOST_CSTDFLOAT_FLOAT128_SQRT(zm / zp)));
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATANH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the atanh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    return (  ::BOOST_CSTDFLOAT_FLOAT128_LOG(float_type(1) + x)
+            - ::BOOST_CSTDFLOAT_FLOAT128_LOG(float_type(1) - x)) / 2;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TGAMMA(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the tgammaq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    if(x > float_type(0))
+    {
+      return ::BOOST_CSTDFLOAT_FLOAT128_EXP(::BOOST_CSTDFLOAT_FLOAT128_LGAMMA(x));
+    }
+    else if(x < float_type(0))
+    {
+      // For x < 0, compute tgamma(-x) and use the reflection formula.
+      const float_type positive_x          = -x;
+            float_type gamma_value         = ::BOOST_CSTDFLOAT_FLOAT128_TGAMMA(positive_x);
+      const float_type floor_of_positive_x = ::BOOST_CSTDFLOAT_FLOAT128_FLOOR (positive_x);
+
+      // Take the reflection checks (slightly adapted) from <boost/math/gamma.hpp>.
+      const bool floor_of_z_is_equal_to_z = (positive_x == ::BOOST_CSTDFLOAT_FLOAT128_FLOOR(positive_x));
+
+      BOOST_CONSTEXPR_OR_CONST float_type my_pi = BOOST_FLOAT128_C(3.14159265358979323846264338327950288419716939937511);
+
+      if(floor_of_z_is_equal_to_z)
+      {
+        const bool is_odd = ((boost::int32_t(floor_of_positive_x) % boost::int32_t(2)) != boost::int32_t(0));
+
+        return (is_odd ? -std::numeric_limits<float_type>::infinity()
+                       : +std::numeric_limits<float_type>::infinity());
+      }
+
+      const float_type sinpx_value = x * ::BOOST_CSTDFLOAT_FLOAT128_SIN(my_pi * x);
+
+      gamma_value *= sinpx_value;
+
+      const bool result_is_too_large_to_represent = (   (::BOOST_CSTDFLOAT_FLOAT128_FABS(gamma_value) < float_type(1))
+                                                     && (((std::numeric_limits<float_type>::max)() * ::BOOST_CSTDFLOAT_FLOAT128_FABS(gamma_value)) < my_pi));
+
+      if(result_is_too_large_to_represent)
+      {
+        const bool is_odd = ((boost::int32_t(floor_of_positive_x) % boost::int32_t(2)) != boost::int32_t(0));
+
+        return (is_odd ? -std::numeric_limits<float_type>::infinity()
+                       : +std::numeric_limits<float_type>::infinity());
+      }
+
+      gamma_value = -my_pi / gamma_value;
+
+      if((gamma_value > float_type(0)) || (gamma_value < float_type(0)))
+      {
+        return gamma_value;
+      }
+      else
+      {
+        // The value of gamma is too small to represent. Return 0.0 here.
+        return float_type(0);
+      }
+    }
+    else
+    {
+      // Gamma of zero is complex infinity. Return NaN here.
+      return std::numeric_limits<float_type>::quiet_NaN();
+    }
+  }
+  #endif // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+
+  // Define the quadruple-precision <cmath> functions in the namespace boost::math::cstdfloat::detail.
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+  inline   boost::math::cstdfloat::detail::float_internal128_t ldexp (boost::math::cstdfloat::detail::float_internal128_t x, int n)                                                 { return ::BOOST_CSTDFLOAT_FLOAT128_LDEXP (x, n); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t frexp (boost::math::cstdfloat::detail::float_internal128_t x, int* pn)                                               { return ::BOOST_CSTDFLOAT_FLOAT128_FREXP (x, pn); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t fabs  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FABS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t abs   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FABS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t floor (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FLOOR (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t ceil  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_CEIL  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sqrt  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SQRT  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t trunc (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TRUNC (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t exp   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_EXP   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t pow   (boost::math::cstdfloat::detail::float_internal128_t x, boost::math::cstdfloat::detail::float_internal128_t a) { return ::BOOST_CSTDFLOAT_FLOAT128_POW   (x, a); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t pow   (boost::math::cstdfloat::detail::float_internal128_t x, int a)                                                 { return ::BOOST_CSTDFLOAT_FLOAT128_POW   (x, boost::math::cstdfloat::detail::float_internal128_t(a)); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t log   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LOG   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t log10 (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LOG10 (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sin   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SIN   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t cos   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_COS   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tan   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TAN   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t asin  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ASIN  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t acos  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ACOS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atan  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ATAN  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sinh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SINH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t cosh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_COSH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tanh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TANH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t asinh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ASINH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t acosh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ACOSH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atanh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ATANH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t fmod  (boost::math::cstdfloat::detail::float_internal128_t a, boost::math::cstdfloat::detail::float_internal128_t b) { return ::BOOST_CSTDFLOAT_FLOAT128_FMOD  (a, b); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atan2 (boost::math::cstdfloat::detail::float_internal128_t y, boost::math::cstdfloat::detail::float_internal128_t x) { return ::BOOST_CSTDFLOAT_FLOAT128_ATAN2 (y, x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t lgamma(boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LGAMMA(x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tgamma(boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TGAMMA(x); }
+  } } } } // boost::math::cstdfloat::detail
+
+  // We will now inject the quadruple-precision <cmath> functions
+  // into the std namespace. This is done via *using* directive.
+  namespace std
+  {
+    using boost::math::cstdfloat::detail::ldexp;
+    using boost::math::cstdfloat::detail::frexp;
+    using boost::math::cstdfloat::detail::fabs;
+    using boost::math::cstdfloat::detail::abs;
+    using boost::math::cstdfloat::detail::floor;
+    using boost::math::cstdfloat::detail::ceil;
+    using boost::math::cstdfloat::detail::sqrt;
+    using boost::math::cstdfloat::detail::trunc;
+    using boost::math::cstdfloat::detail::exp;
+    using boost::math::cstdfloat::detail::pow;
+    using boost::math::cstdfloat::detail::log;
+    using boost::math::cstdfloat::detail::log10;
+    using boost::math::cstdfloat::detail::sin;
+    using boost::math::cstdfloat::detail::cos;
+    using boost::math::cstdfloat::detail::tan;
+    using boost::math::cstdfloat::detail::asin;
+    using boost::math::cstdfloat::detail::acos;
+    using boost::math::cstdfloat::detail::atan;
+    using boost::math::cstdfloat::detail::sinh;
+    using boost::math::cstdfloat::detail::cosh;
+    using boost::math::cstdfloat::detail::tanh;
+    using boost::math::cstdfloat::detail::asinh;
+    using boost::math::cstdfloat::detail::acosh;
+    using boost::math::cstdfloat::detail::atanh;
+    using boost::math::cstdfloat::detail::fmod;
+    using boost::math::cstdfloat::detail::atan2;
+    using boost::math::cstdfloat::detail::lgamma;
+    using boost::math::cstdfloat::detail::tgamma;
+  } // namespace std
+
+  // We will now remove the preprocessor symbols representing quadruple-precision <cmath>
+  // functions from the preprocessor.
+
+  #undef BOOST_CSTDFLOAT_FLOAT128_LDEXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_FREXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_FABS
+  #undef BOOST_CSTDFLOAT_FLOAT128_FLOOR
+  #undef BOOST_CSTDFLOAT_FLOAT128_CEIL
+  #undef BOOST_CSTDFLOAT_FLOAT128_SQRT
+  #undef BOOST_CSTDFLOAT_FLOAT128_TRUNC
+  #undef BOOST_CSTDFLOAT_FLOAT128_EXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_EXPM1
+  #undef BOOST_CSTDFLOAT_FLOAT128_POW
+  #undef BOOST_CSTDFLOAT_FLOAT128_LOG
+  #undef BOOST_CSTDFLOAT_FLOAT128_LOG10
+  #undef BOOST_CSTDFLOAT_FLOAT128_SIN
+  #undef BOOST_CSTDFLOAT_FLOAT128_COS
+  #undef BOOST_CSTDFLOAT_FLOAT128_TAN
+  #undef BOOST_CSTDFLOAT_FLOAT128_ASIN
+  #undef BOOST_CSTDFLOAT_FLOAT128_ACOS
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATAN
+  #undef BOOST_CSTDFLOAT_FLOAT128_SINH
+  #undef BOOST_CSTDFLOAT_FLOAT128_COSH
+  #undef BOOST_CSTDFLOAT_FLOAT128_TANH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ASINH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ACOSH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATANH
+  #undef BOOST_CSTDFLOAT_FLOAT128_FMOD
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATAN2
+  #undef BOOST_CSTDFLOAT_FLOAT128_LGAMMA
+  #undef BOOST_CSTDFLOAT_FLOAT128_TGAMMA
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex.hpp
new file mode 100644
index 0000000..b3f4314
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex.hpp
@@ -0,0 +1,38 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision (and extended) support for <complex>.
+
+#ifndef _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_iostream.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS defined.
+  #endif
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+  #endif
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM defined.
+  #endif
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #define BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE boost::math::cstdfloat::detail::float_internal128_t
+  #include <boost/math/cstdfloat/cstdfloat_complex_std.hpp>
+  #undef BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex_std.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex_std.hpp
new file mode 100644
index 0000000..f949a9a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_complex_std.hpp
@@ -0,0 +1,641 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement a specialization of std::complex<> for *anything* that
+// is defined as BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE.
+
+#ifndef _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
+
+  #if defined(__GNUC__)
+  #pragma GCC system_header
+  #endif
+
+  #include <complex>
+  #include <boost/math/constants/constants.hpp>
+
+  namespace std
+  {
+    // Forward declarations.
+    template<class float_type>
+    class complex;
+
+    template<>
+    class complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>;
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE real(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE imag(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE abs (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE arg (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE norm(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> conj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> proj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> polar(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& = 0);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sqrt (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sin  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cos  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tan  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asin (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acos (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atan (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> exp  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log10(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      int);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&,
+                                                                      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sinh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cosh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tanh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    template<class char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>&, const std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    template<class char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>&, std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    // Template specialization of the complex class.
+    template<>
+    class complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>
+    {
+    public:
+      typedef BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE value_type;
+
+      explicit complex(const complex<float>&);
+      explicit complex(const complex<double>&);
+      explicit complex(const complex<long double>&);
+
+      #if defined(BOOST_NO_CXX11_CONSTEXPR)
+      complex(const value_type& r = value_type(),
+              const value_type& i = value_type()) : re(r),
+                                                    im(i) { }
+
+      template<typename X>
+      complex(const complex<X>& x) : re(x.real()),
+                                     im(x.imag()) { }
+
+      const value_type& real() const { return re; }
+      const value_type& imag() const { return im; }
+
+      value_type& real() { return re; }
+      value_type& imag() { return im; }
+      #else
+      BOOST_CONSTEXPR complex(const value_type& r = value_type(),
+                              const value_type& i = value_type()) : re(r),
+                                                                    im(i) { }
+
+      template<typename X>
+      BOOST_CONSTEXPR complex(const complex<X>& x) : re(x.real()),
+                                                     im(x.imag()) { }
+
+      value_type real() const { return re; }
+      value_type imag() const { return im; }
+      #endif
+
+      void real(value_type r) { re = r; }
+      void imag(value_type i) { im = i; }
+
+      complex<value_type>& operator=(const value_type& v)
+      {
+        re = v;
+        im = value_type(0);
+        return *this;
+      }
+
+      complex<value_type>& operator+=(const value_type& v)
+      {
+        re += v;
+        return *this;
+      }
+
+      complex<value_type>& operator-=(const value_type& v)
+      {
+        re -= v;
+        return *this;
+      }
+
+      complex<value_type>& operator*=(const value_type& v)
+      {
+        re *= v;
+        im *= v;
+        return *this;
+      }
+
+      complex<value_type>& operator/=(const value_type& v)
+      {
+        re /= v;
+        im /= v;
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator=(const complex<X>& x)
+      {
+        re = x.real();
+        im = x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator+=(const complex<X>& x)
+      {
+        re += x.real();
+        im += x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator-=(const complex<X>& x)
+      {
+        re -= x.real();
+        im -= x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator*=(const complex<X>& x)
+      {
+        const value_type tmp_real = (re * x.real()) - (im * x.imag());
+        im = (re * x.imag()) + (im * x.real());
+        re = tmp_real;
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator/=(const complex<X>& x)
+      {
+        const value_type tmp_real = (re * x.real()) + (im * x.imag());
+        const value_type the_norm = std::norm(x);
+        im = ((im * x.real()) - (re * x.imag())) / the_norm;
+        re = tmp_real / the_norm;
+        return *this;
+      }
+
+      private:
+        value_type re;
+        value_type im;
+    };
+
+    // Constructors from built-in complex representation of floating-point types.
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<float>& f)        : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( f.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( f.imag())) { }
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<double>& d)       : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( d.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( d.imag())) { }
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<long double>& ld) : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(ld.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(ld.imag())) { }
+  } // namespace std
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+  template<class float_type> std::complex<float_type> multiply_by_i(const std::complex<float_type>& x)
+  {
+    // Multiply x (in C) by I (the imaginary component), and return the result.
+    return std::complex<float_type>(-x.imag(), x.real());
+  }
+  } } } } // boost::math::cstdfloat::detail
+
+  namespace std
+  {
+    // ISO/IEC 14882:2011, Section 26.4.7, specific values.
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE real(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return x.real(); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE imag(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return x.imag(); }
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE abs (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { using std::sqrt;  return sqrt ((real(x) * real(x)) + (imag(x) * imag(x))); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE arg (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { using std::atan2; return atan2(x.imag(), x.real()); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE norm(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return (real(x) * real(x)) + (imag(x) * imag(x)); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> conj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(x.real(), -x.imag()); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> proj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE m = (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)();
+      if ((x.real() > m)
+        || (x.real() < -m)
+        || (x.imag() > m)
+        || (x.imag() < -m))
+      {
+        // We have an infinity, return a normalized infinity, respecting the sign of the imaginary part:
+         return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity(), x.imag() < 0 ? -0 : 0);
+      }
+      return x;
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> polar(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& rho,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& theta)
+    {
+      using std::sin;
+      using std::cos;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(rho * cos(theta), rho * sin(theta));
+    }
+
+    // Global add, sub, mul, div.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() + v.real(), u.imag() + v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() - v.real(), u.imag() - v.imag()); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v)
+    {
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>((u.real() * v.real()) - (u.imag() * v.imag()),
+                                                                  (u.real() * v.imag()) + (u.imag() * v.real()));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE the_norm = std::norm(v);
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(((u.real() * v.real()) + (u.imag() * v.imag())) / the_norm,
+                                                                  ((u.imag() * v.real()) - (u.real() * v.imag())) / the_norm);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() + v, u.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() - v, u.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() * v, u.imag() * v); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() / v, u.imag() / v); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u + v.real(),     v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u - v.real(),    -v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u * v.real(), u * v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE v_norm = norm(v); return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>((u * v.real()) / v_norm, (-u * v.imag()) / v_norm); }
+
+    // Unary plus / minus.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u) { return u; }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(-u.real(), -u.imag()); }
+
+    // Equality and inequality.
+    inline bool operator==(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x.real() == y.real()) && (x.imag() == y.imag())); }
+    inline bool operator==(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  y) { return ((x.real() == y)        && (x.imag() == BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator==(const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x        == y.real()) && (y.imag() == BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator!=(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x.real() != y.real()) || (x.imag() != y.imag())); }
+    inline bool operator!=(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  y) { return ((x.real() != y)        || (x.imag() != BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator!=(const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x        != y.real()) || (y.imag() != BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+
+    // ISO/IEC 14882:2011, Section 26.4.8, transcendentals.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sqrt(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::fabs;
+      using std::sqrt;
+
+      // Compute sqrt(x) for x in C:
+      // sqrt(x) = (s       , xi / 2s) : for xr > 0,
+      //           (|xi| / 2s, +-s)    : for xr < 0,
+      //           (sqrt(xi), sqrt(xi) : for xr = 0,
+      // where s = sqrt{ [ |xr| + sqrt(xr^2 + xi^2) ] / 2 },
+      // and the +- sign is the same as the sign of xi.
+
+      if(x.real() > 0)
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE s = sqrt((fabs(x.real()) + std::abs(x)) / 2);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(s, x.imag() / (s * 2));
+      }
+      else if(x.real() < 0)
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE s = sqrt((fabs(x.real()) + std::abs(x)) / 2);
+
+        const bool imag_is_neg = (x.imag() < 0);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(fabs(x.imag()) / (s * 2), (imag_is_neg ? -s : s));
+      }
+      else
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sqrt_xi_half = sqrt(x.imag() / 2);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sqrt_xi_half, sqrt_xi_half);
+      }
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sin(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sin_x * cosh_y, cos_x * sinh_y);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cos(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_x * cosh_y, -(sin_x * sinh_y));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tan(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return (  complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sin_x * cosh_y,  cos_x * sinh_y)
+              / complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_x * cosh_y, -sin_x * sinh_y));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asin(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return -boost::math::cstdfloat::detail::multiply_by_i(std::log(boost::math::cstdfloat::detail::multiply_by_i(x) + std::sqrt(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - (x * x))));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acos(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return boost::math::constants::half_pi<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>() - std::asin(x);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atan(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> izz = boost::math::cstdfloat::detail::multiply_by_i(x);
+
+      return boost::math::cstdfloat::detail::multiply_by_i(std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - izz) - std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) + izz)) / 2;
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> exp(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::exp;
+
+      return std::polar(exp(x.real()), x.imag());
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::atan2;
+      using std::log;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(log(std::norm(x)) / 2, atan2(x.imag(), x.real()));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log10(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return std::log(x) / boost::math::constants::ln_ten<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>();
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    int p)
+    {
+      const bool re_isneg  = (x.real() < 0);
+      const bool re_isnan  = (x.real() != x.real());
+      const bool re_isinf  = ((!re_isneg) ? bool(+x.real() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+                                          : bool(-x.real() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)()));
+
+      const bool im_isneg  = (x.imag() < 0);
+      const bool im_isnan  = (x.imag() != x.imag());
+      const bool im_isinf  = ((!im_isneg) ? bool(+x.imag() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+                                          : bool(-x.imag() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)()));
+
+      if(re_isnan || im_isnan) { return x; }
+
+      if(re_isinf || im_isinf)
+      {
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::quiet_NaN(),
+                                                                    std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::quiet_NaN());
+      }
+
+      if(p < 0)
+      {
+        if(std::abs(x) < (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::min)())
+        {
+          return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity(),
+                                                                      std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+        }
+        else
+        {
+          return BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / std::pow(x, -p);
+        }
+      }
+
+      if(p == 0)
+      {
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1));
+      }
+      else
+      {
+        if(p == 1) { return x; }
+
+        if(std::abs(x) > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+        {
+          const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE re = (re_isneg ? -std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity()
+                                                                           : +std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+
+          const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE im = (im_isneg ? -std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity()
+                                                                           : +std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+
+          return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(re, im);
+        }
+
+        if     (p == 2) { return  (x * x); }
+        else if(p == 3) { return ((x * x) * x); }
+        else if(p == 4) { const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> x2 = (x * x); return (x2 * x2); }
+        else
+        {
+          // The variable xn stores the binary powers of x.
+          complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> result(((p % 2) != 0) ? x : complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1)));
+          complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> xn    (x);
+
+          int p2 = p;
+
+          while((p2 /= 2) != 0)
+          {
+            // Square xn for each binary power.
+            xn *= xn;
+
+            const bool has_binary_power = ((p2 % 2) != 0);
+
+            if(has_binary_power)
+            {
+              // Multiply the result with each binary power contained in the exponent.
+              result *= xn;
+            }
+          }
+
+          return result;
+        }
+      }
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& x,
+                                                                    const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_y  = sin (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_y  = cos (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xp = exp (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xm = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_xp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_x = (exp_xp - exp_xm) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_x = (exp_xp + exp_xm) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_y * sinh_x, cosh_x * sin_y);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_y  = sin (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_y  = cos (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xp = exp (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xm = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_xp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_x = (exp_xp - exp_xm) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_x = (exp_xp + exp_xm) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_y * cosh_x, sin_y * sinh_x);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> ex_plus  = std::exp(x);
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> ex_minus = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / ex_plus;
+
+      return (ex_plus - ex_minus) / (ex_plus + ex_minus);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return std::log(x + std::sqrt((x * x) + BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1)));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE my_one(1);
+
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> zp(x.real() + my_one, x.imag());
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> zm(x.real() - my_one, x.imag());
+
+      return std::log(x + (zp * std::sqrt(zm / zp)));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return (std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) + x) - std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - x)) / 2.0;
+    }
+
+    template<class char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      std::basic_ostringstream<char_type, traits_type> ostr;
+
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      ostr << char_type('(')
+           << x.real()
+           << char_type(',')
+           << x.imag()
+           << char_type(')');
+
+      return (os << ostr.str());
+    }
+
+    template<class char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE rx;
+      BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE ix;
+
+      char_type the_char;
+
+      static_cast<void>(is >> the_char);
+
+      if(the_char == static_cast<char_type>('('))
+      {
+        static_cast<void>(is >> rx >> the_char);
+
+        if(the_char == static_cast<char_type>(','))
+        {
+          static_cast<void>(is >> ix >> the_char);
+
+          if(the_char == static_cast<char_type>(')'))
+          {
+            x = complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(rx, ix);
+          }
+          else
+          {
+            is.setstate(ios_base::failbit);
+          }
+        }
+        else if(the_char == static_cast<char_type>(')'))
+        {
+          x = rx;
+        }
+        else
+        {
+          is.setstate(ios_base::failbit);
+        }
+      }
+      else
+      {
+        static_cast<void>(is.putback(the_char));
+
+        static_cast<void>(is >> rx);
+
+        x = rx;
+      }
+
+      return is;
+    }
+  } // namespace std
+
+#endif // _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_iostream.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_iostream.hpp
new file mode 100644
index 0000000..ac94fd3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_iostream.hpp
@@ -0,0 +1,771 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision I/O stream operations.
+
+#ifndef _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_iostream.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+  #endif
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #include <cstddef>
+  #include <istream>
+  #include <ostream>
+  #include <sstream>
+  #include <stdexcept>
+  #include <string>
+  #include <boost/static_assert.hpp>
+  #include <boost/throw_exception.hpp>
+
+//  #if (0)
+  #if defined(__GNUC__)
+
+  // Forward declarations of quadruple-precision string functions.
+  extern "C" int quadmath_snprintf(char *str, size_t size, const char *format, ...) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t strtoflt128(const char*, char **) throw();
+
+  namespace std
+  {
+    template<typename char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::basic_ostringstream<char_type, traits_type> ostr;
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      char my_buffer[64U];
+
+      const int my_prec   = static_cast<int>(os.precision());
+      const int my_digits = ((my_prec == 0) ? 36 : my_prec);
+
+      const std::ios_base::fmtflags my_flags  = os.flags();
+
+      char my_format_string[8U];
+
+      std::size_t my_format_string_index = 0U;
+
+      my_format_string[my_format_string_index] = '%';
+      ++my_format_string_index;
+
+      if(my_flags & std::ios_base::showpos)   { my_format_string[my_format_string_index] = '+'; ++my_format_string_index; }
+      if(my_flags & std::ios_base::showpoint) { my_format_string[my_format_string_index] = '#'; ++my_format_string_index; }
+
+      my_format_string[my_format_string_index + 0U] = '.';
+      my_format_string[my_format_string_index + 1U] = '*';
+      my_format_string[my_format_string_index + 2U] = 'Q';
+
+      my_format_string_index += 3U;
+
+      char the_notation_char;
+
+      if     (my_flags & std::ios_base::scientific) { the_notation_char = 'e'; }
+      else if(my_flags & std::ios_base::fixed)      { the_notation_char = 'f'; }
+      else                                          { the_notation_char = 'g'; }
+
+      my_format_string[my_format_string_index + 0U] = the_notation_char;
+      my_format_string[my_format_string_index + 1U] = 0;
+
+      const int v = ::quadmath_snprintf(my_buffer,
+                                        static_cast<int>(sizeof(my_buffer)),
+                                        my_format_string,
+                                        my_digits,
+                                        x);
+
+      if(v < 0) { BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed internally in quadmath_snprintf().")); }
+
+      if(v >= static_cast<int>(sizeof(my_buffer) - 1U))
+      {
+        // Evidently there is a really long floating-point string here,
+        // such as a small decimal representation in non-scientific notation.
+        // So we have to use dynamic memory allocation for the output
+        // string buffer.
+
+        char* my_buffer2 = static_cast<char*>(0U);
+
+        try
+        {
+          my_buffer2 = new char[v + 3];
+        }
+        catch(const std::bad_alloc&)
+        {
+          BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed while allocating memory."));
+        }
+
+        const int v2 = ::quadmath_snprintf(my_buffer2,
+                                            v + 3,
+                                            my_format_string,
+                                            my_digits,
+                                            x);
+
+        if(v2 >= v + 3)
+        {
+          BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed."));
+        }
+
+        static_cast<void>(ostr << my_buffer2);
+
+        delete [] my_buffer2;
+      }
+      else
+      {
+        static_cast<void>(ostr << my_buffer);
+      }
+
+      return (os << ostr.str());
+    }
+
+    template<typename char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::string str;
+
+      static_cast<void>(is >> str);
+
+      char* p_end;
+
+      x = strtoflt128(str.c_str(), &p_end);
+
+      if(static_cast<std::ptrdiff_t>(p_end - str.c_str()) != static_cast<std::ptrdiff_t>(str.length()))
+      {
+        for(std::string::const_reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
+        {
+          static_cast<void>(is.putback(*it));
+        }
+
+        is.setstate(ios_base::failbit);
+
+        BOOST_THROW_EXCEPTION(std::runtime_error("Unable to interpret input string as a boost::float128_t"));
+      }
+
+      return is;
+    }
+  }
+
+//  #elif defined(__GNUC__)
+  #elif defined(BOOST_INTEL)
+
+  // The section for I/O stream support for the ICC compiler is particularly
+  // long, because these functions must be painstakingly synthesized from
+  // manually-written routines (ICC does not support I/O stream operations
+  // for its _Quad type).
+
+  // The following string-extraction routines are based on the methodology
+  // used in Boost.Multiprecision by John Maddock and Christopher Kormanyos.
+  // This methodology has been slightly modified here for boost::float128_t.
+
+  #include <cstring>
+  #include <cctype>
+  #include <boost/lexical_cast.hpp>
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+
+  template<class string_type>
+  void format_float_string(string_type& str,
+                            int my_exp,
+                            int digits,
+                            const std::ios_base::fmtflags f,
+                            const bool iszero)
+  {
+    typedef typename string_type::size_type size_type;
+
+    const bool scientific = ((f & std::ios_base::scientific) == std::ios_base::scientific);
+    const bool fixed      = ((f & std::ios_base::fixed)      == std::ios_base::fixed);
+    const bool showpoint  = ((f & std::ios_base::showpoint)  == std::ios_base::showpoint);
+    const bool showpos    = ((f & std::ios_base::showpos)    == std::ios_base::showpos);
+
+    const bool b_neg = ((str.size() != 0U) && (str[0] == '-'));
+
+    if(b_neg)
+    {
+      str.erase(0, 1);
+    }
+
+    if(digits == 0)
+    {
+      digits = static_cast<int>((std::max)(str.size(), size_type(16)));
+    }
+
+    if(iszero || str.empty() || (str.find_first_not_of('0') == string_type::npos))
+    {
+      // We will be printing zero, even though the value might not
+      // actually be zero (it just may have been rounded to zero).
+      str = "0";
+
+      if(scientific || fixed)
+      {
+        str.append(1, '.');
+        str.append(size_type(digits), '0');
+
+        if(scientific)
+        {
+          str.append("e+00");
+        }
+      }
+      else
+      {
+        if(showpoint)
+        {
+          str.append(1, '.');
+          if(digits > 1)
+          {
+            str.append(size_type(digits - 1), '0');
+          }
+        }
+      }
+
+      if(b_neg)
+      {
+        str.insert(0U, 1U, '-');
+      }
+      else if(showpos)
+      {
+        str.insert(0U, 1U, '+');
+      }
+
+      return;
+    }
+
+    if(!fixed && !scientific && !showpoint)
+    {
+      // Suppress trailing zeros.
+      typename string_type::iterator pos = str.end();
+
+      while(pos != str.begin() && *--pos == '0') { ; }
+
+      if(pos != str.end())
+      {
+        ++pos;
+      }
+
+      str.erase(pos, str.end());
+
+      if(str.empty())
+      {
+        str = '0';
+      }
+    }
+    else if(!fixed || (my_exp >= 0))
+    {
+      // Pad out the end with zero's if we need to.
+
+      int chars = static_cast<int>(str.size());
+      chars = digits - chars;
+
+      if(scientific)
+      {
+        ++chars;
+      }
+
+      if(chars > 0)
+      {
+        str.append(static_cast<size_type>(chars), '0');
+      }
+    }
+
+    if(fixed || (!scientific && (my_exp >= -4) && (my_exp < digits)))
+    {
+      if((1 + my_exp) > static_cast<int>(str.size()))
+      {
+        // Just pad out the end with zeros.
+        str.append(static_cast<size_type>((1 + my_exp) - static_cast<int>(str.size())), '0');
+
+        if(showpoint || fixed)
+        {
+          str.append(".");
+        }
+      }
+      else if(my_exp + 1 < static_cast<int>(str.size()))
+      {
+        if(my_exp < 0)
+        {
+          str.insert(0U, static_cast<size_type>(-1 - my_exp), '0');
+          str.insert(0U, "0.");
+        }
+        else
+        {
+          // Insert the decimal point:
+          str.insert(static_cast<size_type>(my_exp + 1), 1, '.');
+        }
+      }
+      else if(showpoint || fixed) // we have exactly the digits we require to left of the point
+      {
+        str += ".";
+      }
+
+      if(fixed)
+      {
+        // We may need to add trailing zeros.
+        int l = static_cast<int>(str.find('.') + 1U);
+        l = digits - (static_cast<int>(str.size()) - l);
+
+        if(l > 0)
+        {
+          str.append(size_type(l), '0');
+        }
+      }
+    }
+    else
+    {
+      // Scientific format:
+      if(showpoint || (str.size() > 1))
+      {
+        str.insert(1U, 1U, '.');
+      }
+
+      str.append(1U, 'e');
+      string_type e = boost::lexical_cast<string_type>(std::abs(my_exp));
+
+      if(e.size() < 2U)
+      {
+        e.insert(0U, 2U - e.size(), '0');
+      }
+
+      if(my_exp < 0)
+      {
+        e.insert(0U, 1U, '-');
+      }
+      else
+      {
+        e.insert(0U, 1U, '+');
+      }
+
+      str.append(e);
+    }
+
+    if(b_neg)
+    {
+      str.insert(0U, 1U, '-');
+    }
+    else if(showpos)
+    {
+      str.insert(0U, 1U, '+');
+    }
+  }
+
+  template<class float_type, class type_a> inline void eval_convert_to(type_a* pa,    const float_type& cb)                        { *pa  = static_cast<type_a>(cb); }
+  template<class float_type, class type_a> inline void eval_add       (float_type& b, const type_a& a)                             { b   += a; }
+  template<class float_type, class type_a> inline void eval_subtract  (float_type& b, const type_a& a)                             { b   -= a; }
+  template<class float_type, class type_a> inline void eval_multiply  (float_type& b, const type_a& a)                             { b   *= a; }
+  template<class float_type>               inline void eval_multiply  (float_type& b, const float_type& cb, const float_type& cb2) { b    = (cb * cb2); }
+  template<class float_type, class type_a> inline void eval_divide    (float_type& b, const type_a& a)                             { b   /= a; }
+  template<class float_type>               inline void eval_log10     (float_type& b, const float_type& cb)                        { b    = std::log10(cb); }
+  template<class float_type>               inline void eval_floor     (float_type& b, const float_type& cb)                        { b    = std::floor(cb); }
+
+  inline void round_string_up_at(std::string& s, int pos, int& expon)
+  {
+    // This subroutine rounds up a string representation of a
+    // number at the given position pos.
+
+    if(pos < 0)
+    {
+      s.insert(0U, 1U, '1');
+      s.erase(s.size() - 1U);
+      ++expon;
+    }
+    else if(s[pos] == '9')
+    {
+      s[pos] = '0';
+      round_string_up_at(s, pos - 1, expon);
+    }
+    else
+    {
+      if((pos == 0) && (s[pos] == '0') && (s.size() == 1))
+      {
+        ++expon;
+      }
+
+      ++s[pos];
+    }
+  }
+
+  template<class float_type>
+  std::string convert_to_string(float_type& x,
+                                std::streamsize digits,
+                                const std::ios_base::fmtflags f)
+  {
+    const bool isneg  = (x < 0);
+    const bool iszero = ((!isneg) ? bool(+x < (std::numeric_limits<float_type>::min)())
+                                  : bool(-x < (std::numeric_limits<float_type>::min)()));
+    const bool isnan  = (x != x);
+    const bool isinf  = ((!isneg) ? bool(+x > (std::numeric_limits<float_type>::max)())
+                                  : bool(-x > (std::numeric_limits<float_type>::max)()));
+
+    int expon = 0;
+
+    if(digits <= 0) { digits = std::numeric_limits<float_type>::max_digits10; }
+
+    const int org_digits = static_cast<int>(digits);
+
+    std::string result;
+
+    if(iszero)
+    {
+      result = "0";
+    }
+    else if(isinf)
+    {
+      if(x < 0)
+      {
+        return "-inf";
+      }
+      else
+      {
+        return ((f & std::ios_base::showpos) == std::ios_base::showpos) ? "+inf" : "inf";
+      }
+    }
+    else if(isnan)
+    {
+      return "nan";
+    }
+    else
+    {
+      // Start by figuring out the base-10 exponent.
+      if(isneg) { x = -x; }
+
+      float_type t;
+      float_type ten = 10;
+
+      eval_log10(t, x);
+      eval_floor(t, t);
+      eval_convert_to(&expon, t);
+
+      if(-expon > std::numeric_limits<float_type>::max_exponent10 - 3)
+      {
+        int e = -expon / 2;
+
+        const float_type t2 = boost::math::cstdfloat::detail::pown(ten, e);
+
+        eval_multiply(t, t2, x);
+        eval_multiply(t, t2);
+
+        if((expon & 1) != 0)
+        {
+          eval_multiply(t, ten);
+        }
+      }
+      else
+      {
+        t = boost::math::cstdfloat::detail::pown(ten, -expon);
+        eval_multiply(t, x);
+      }
+
+      // Make sure that the value lies between [1, 10), and adjust if not.
+      if(t < 1)
+      {
+        eval_multiply(t, 10);
+
+        --expon;
+      }
+      else if(t >= 10)
+      {
+        eval_divide(t, 10);
+
+        ++expon;
+      }
+
+      float_type digit;
+      int        cdigit;
+
+      // Adjust the number of digits required based on formatting options.
+      if(((f & std::ios_base::fixed) == std::ios_base::fixed) && (expon != -1))
+      {
+        digits += (expon + 1);
+      }
+
+      if((f & std::ios_base::scientific) == std::ios_base::scientific)
+      {
+        ++digits;
+      }
+
+      // Extract the base-10 digits one at a time.
+      for(int i = 0; i < digits; ++i)
+      {
+        eval_floor(digit, t);
+        eval_convert_to(&cdigit, digit);
+
+        result += static_cast<char>('0' + cdigit);
+
+        eval_subtract(t, digit);
+        eval_multiply(t, ten);
+      }
+
+      // Possibly round the result.
+      if(digits >= 0)
+      {
+        eval_floor(digit, t);
+        eval_convert_to(&cdigit, digit);
+        eval_subtract(t, digit);
+
+        if((cdigit == 5) && (t == 0))
+        {
+          // Use simple bankers rounding.
+
+          if((static_cast<int>(*result.rbegin() - '0') & 1) != 0)
+          {
+            round_string_up_at(result, static_cast<int>(result.size() - 1U), expon);
+          }
+        }
+        else if(cdigit >= 5)
+        {
+          round_string_up_at(result, static_cast<int>(result.size() - 1), expon);
+        }
+      }
+    }
+
+    while((result.size() > static_cast<std::string::size_type>(digits)) && result.size())
+    {
+      // We may get here as a result of rounding.
+
+      if(result.size() > 1U)
+      {
+        result.erase(result.size() - 1U);
+      }
+      else
+      {
+        if(expon > 0)
+        {
+          --expon; // so we put less padding in the result.
+        }
+        else
+        {
+          ++expon;
+        }
+
+        ++digits;
+      }
+    }
+
+    if(isneg)
+    {
+      result.insert(0U, 1U, '-');
+    }
+
+    format_float_string(result, expon, org_digits, f, iszero);
+
+    return result;
+  }
+
+  template <class float_type>
+  bool convert_from_string(float_type& value, const char* p)
+  {
+    value = 0;
+
+    if((p == static_cast<const char*>(0U)) || (*p == static_cast<char>(0)))
+    {
+      return;
+    }
+
+    bool is_neg       = false;
+    bool is_neg_expon = false;
+
+    BOOST_CONSTEXPR_OR_CONST int ten = 10;
+
+    int expon       = 0;
+    int digits_seen = 0;
+
+    BOOST_CONSTEXPR_OR_CONST int max_digits = std::numeric_limits<float_type>::max_digits10 + 1;
+
+    if(*p == static_cast<char>('+'))
+    {
+      ++p;
+    }
+    else if(*p == static_cast<char>('-'))
+    {
+      is_neg = true;
+      ++p;
+    }
+
+    const bool isnan = ((std::strcmp(p, "nan") == 0) || (std::strcmp(p, "NaN") == 0) || (std::strcmp(p, "NAN") == 0));
+
+    if(isnan)
+    {
+      eval_divide(value, 0);
+
+      if(is_neg)
+      {
+        value = -value;
+      }
+
+      return true;
+    }
+
+    const bool isinf = ((std::strcmp(p, "inf") == 0) || (std::strcmp(p, "Inf") == 0) || (std::strcmp(p, "INF") == 0));
+
+    if(isinf)
+    {
+      value = 1;
+      eval_divide(value, 0);
+
+      if(is_neg)
+      {
+        value = -value;
+      }
+
+      return true;
+    }
+
+    // Grab all the leading digits before the decimal point.
+    while(std::isdigit(*p))
+    {
+      eval_multiply(value, ten);
+      eval_add(value, static_cast<int>(*p - '0'));
+      ++p;
+      ++digits_seen;
+    }
+
+    if(*p == static_cast<char>('.'))
+    {
+      // Grab everything after the point, stop when we've seen
+      // enough digits, even if there are actually more available.
+
+      ++p;
+
+      while(std::isdigit(*p))
+      {
+        eval_multiply(value, ten);
+        eval_add(value, static_cast<int>(*p - '0'));
+        ++p;
+        --expon;
+
+        if(++digits_seen > max_digits)
+        {
+          break;
+        }
+      }
+
+      while(std::isdigit(*p))
+      {
+        ++p;
+      }
+    }
+
+    // Parse the exponent.
+    if((*p == static_cast<char>('e')) || (*p == static_cast<char>('E')))
+    {
+      ++p;
+
+      if(*p == static_cast<char>('+'))
+      {
+        ++p;
+      }
+      else if(*p == static_cast<char>('-'))
+      {
+        is_neg_expon = true;
+        ++p;
+      }
+
+      int e2 = 0;
+
+      while(std::isdigit(*p))
+      {
+        e2 *= 10;
+        e2 += (*p - '0');
+        ++p;
+      }
+
+      if(is_neg_expon)
+      {
+        e2 = -e2;
+      }
+
+      expon += e2;
+    }
+
+    if(expon)
+    {
+      // Scale by 10^expon. Note that 10^expon can be outside the range
+      // of our number type, even though the result is within range.
+      // If that looks likely, then split the calculation in two parts.
+      float_type t;
+      t = ten;
+
+      if(expon > (std::numeric_limits<float_type>::min_exponent10 + 2))
+      {
+        t = boost::math::cstdfloat::detail::pown(t, expon);
+        eval_multiply(value, t);
+      }
+      else
+      {
+        t = boost::math::cstdfloat::detail::pown(t, (expon + digits_seen + 1));
+        eval_multiply(value, t);
+        t = ten;
+        t = boost::math::cstdfloat::detail::pown(t, (-digits_seen - 1));
+        eval_multiply(value, t);
+      }
+    }
+
+    if(is_neg)
+    {
+      value = -value;
+    }
+
+    return (*p == static_cast<char>(0));
+  }
+  } } } } // boost::math::cstdfloat::detail
+
+  namespace std
+  {
+    template<typename char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      boost::math::cstdfloat::detail::float_internal128_t non_const_x = x;
+
+      const std::string str = boost::math::cstdfloat::detail::convert_to_string(non_const_x,
+                                                                                os.precision(),
+                                                                                os.flags());
+
+      std::basic_ostringstream<char_type, traits_type> ostr;
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      static_cast<void>(ostr << str);
+
+      return (os << ostr.str());
+    }
+
+    template<typename char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::string str;
+
+      static_cast<void>(is >> str);
+
+      const bool conversion_is_ok = boost::math::cstdfloat::detail::convert_from_string(x, str.c_str());
+
+      if(false == conversion_is_ok)
+      {
+        for(std::string::const_reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
+        {
+          static_cast<void>(is.putback(*it));
+        }
+
+        is.setstate(ios_base::failbit);
+
+        BOOST_THROW_EXCEPTION(std::runtime_error("Unable to interpret input string as a boost::float128_t"));
+      }
+
+      return is;
+    }
+  }
+
+  #endif // Use __GNUC__ or BOOST_INTEL libquadmath
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_limits.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_limits.hpp
new file mode 100644
index 0000000..ae9fbcb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_limits.hpp
@@ -0,0 +1,75 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision std::numeric_limits<> support.
+
+#ifndef _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
+  #define _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+    #include <limits>
+
+    // Define the name of the global quadruple-precision function to be used for
+    // calculating quiet_NaN() in the specialization of std::numeric_limits<>.
+    #if defined(BOOST_INTEL)
+      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
+    #elif defined(__GNUC__)
+      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
+    #endif
+
+    // Forward declaration of the quadruple-precision square root function.
+    extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) throw();
+
+    namespace std
+    {
+      template<>
+      class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>
+      {
+      public:
+        BOOST_STATIC_CONSTEXPR bool                                                 is_specialized           = true;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  (min) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MIN; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  (max) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MAX; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  lowest() BOOST_NOEXCEPT  { return -(max)(); }
+        BOOST_STATIC_CONSTEXPR int                                                  digits                   = 113;
+        BOOST_STATIC_CONSTEXPR int                                                  digits10                 = 33;
+        BOOST_STATIC_CONSTEXPR int                                                  max_digits10             = 36;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_signed                = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_integer               = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_exact                 = false;
+        BOOST_STATIC_CONSTEXPR int                                                  radix                    = 2;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  epsilon    ()            { return BOOST_CSTDFLOAT_FLOAT128_EPS; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  round_error()            { return BOOST_FLOAT128_C(0.5); }
+        BOOST_STATIC_CONSTEXPR int                                                  min_exponent             = -16381;
+        BOOST_STATIC_CONSTEXPR int                                                  min_exponent10           = static_cast<int>((min_exponent * 301L) / 1000L);
+        BOOST_STATIC_CONSTEXPR int                                                  max_exponent             = +16384;
+        BOOST_STATIC_CONSTEXPR int                                                  max_exponent10           = static_cast<int>((max_exponent * 301L) / 1000L);
+        BOOST_STATIC_CONSTEXPR bool                                                 has_infinity             = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_quiet_NaN            = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_signaling_NaN        = false;
+        BOOST_STATIC_CONSTEXPR float_denorm_style                                   has_denorm               = denorm_absent;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_denorm_loss          = false;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  infinity     ()          { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  quiet_NaN    ()          { return ::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0)); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  signaling_NaN()          { return BOOST_FLOAT128_C(0.0); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  denorm_min   ()          { return BOOST_FLOAT128_C(0.0); }
+        BOOST_STATIC_CONSTEXPR bool                                                 is_iec559                = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_bounded               = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_modulo                = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 traps                    = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 tinyness_before          = false;
+        BOOST_STATIC_CONSTEXPR float_round_style                                    round_style              = round_to_nearest;
+      };
+    } // namespace std
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
diff --git a/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_types.hpp b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_types.hpp
new file mode 100644
index 0000000..9e0d00b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/cstdfloat/cstdfloat_types.hpp
@@ -0,0 +1,440 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement the types for floating-point typedefs having specified widths.
+
+#ifndef _BOOST_CSTDFLOAT_TYPES_2014_01_09_HPP_
+  #define _BOOST_CSTDFLOAT_TYPES_2014_01_09_HPP_
+
+  #include <float.h>
+  #include <limits>
+  #include <boost/static_assert.hpp>
+  #include <boost/math/tools/config.hpp>
+
+  // This is the beginning of the preamble.
+
+  // In this preamble, the preprocessor is used to query certain
+  // preprocessor definitions from <float.h>. Based on the results
+  // of these queries, an attempt is made to automatically detect
+  // the presence of built-in floating-point types having specified
+  // widths. These are *thought* to be conformant with IEEE-754,
+  // whereby an unequivocal test based on std::numeric_limits<>
+  // follows below.
+
+  // In addition, various macros that are used for initializing
+  // floating-point literal values having specified widths and
+  // some basic min/max values are defined.
+
+  // First, we will pre-load certain preprocessor definitions
+  // with a dummy value.
+
+  #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH  0
+
+  #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE 0
+
+  // Ensure that the compiler has a radix-2 floating-point representation.
+  #if (!defined(FLT_RADIX) || ((defined(FLT_RADIX) && (FLT_RADIX != 2))))
+    #error The compiler does not support any radix-2 floating-point types required for <boost/cstdfloat.hpp>.
+  #endif
+
+  // Check if built-in float is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+  #if(defined(FLT_MANT_DIG) && defined(FLT_MAX_EXP))
+    #if  ((FLT_MANT_DIG == 11) && (FLT_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+      #define BOOST_FLOAT16_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_16_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_16_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 24) && (FLT_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+      #define BOOST_FLOAT32_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_32_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_32_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 53) && (FLT_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+      #define BOOST_FLOAT64_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_64_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_64_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 64) && (FLT_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+      #define BOOST_FLOAT80_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_80_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_80_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 113) && (FLT_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+      #define BOOST_FLOAT128_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_128_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_128_MAX  FLT_MAX
+    #endif
+  #endif
+
+  // Check if built-in double is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+  #if(defined(DBL_MANT_DIG) && defined(DBL_MAX_EXP))
+    #if  ((DBL_MANT_DIG == 11) && (DBL_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+      #define BOOST_FLOAT16_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_16_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_16_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 24) && (DBL_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+      #define BOOST_FLOAT32_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_32_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_32_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 53) && (DBL_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+      #define BOOST_FLOAT64_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_64_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_64_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 64) && (DBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+      #define BOOST_FLOAT80_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_80_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_80_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 113) && (DBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+      #define BOOST_FLOAT128_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_128_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_128_MAX  DBL_MAX
+    #endif
+  #endif
+
+  // Disable check long double capability even if supported by compiler since some math runtime
+  // implementations are broken for long double.
+  #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+    // Check if built-in long double is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+    #if(defined(LDBL_MANT_DIG) && defined(LDBL_MAX_EXP))
+      #if  ((LDBL_MANT_DIG == 11) && (LDBL_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+        #define BOOST_FLOAT16_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_16_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_16_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 24) && (LDBL_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+        #define BOOST_FLOAT32_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_32_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_32_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 53) && (LDBL_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+        #define BOOST_FLOAT64_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_64_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_64_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 64) && (LDBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+        #define BOOST_FLOAT80_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_80_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_80_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 113) && (LDBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+        #define BOOST_FLOAT128_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_128_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_128_MAX  LDBL_MAX
+      #endif
+    #endif
+  #endif
+
+  // Check if quadruple-precision is supported. Here, we are checking
+  // for the presence of __float128 from GCC's quadmath.h or _Quad
+  // from ICC's /Qlong-double flag). To query these, we use the
+  // BOOST_MATH_USE_FLOAT128 pre-processor definition from
+  // <boost/math/tools/config.hpp>.
+
+  #if (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+    // Specify the underlying name of the internal 128-bit floating-point type definition.
+    namespace boost { namespace math { namespace cstdfloat { namespace detail {
+    #if defined(BOOST_INTEL)
+      typedef _Quad      float_internal128_t;
+    #elif defined(__GNUC__)
+      typedef __float128 float_internal128_t;
+    #else
+      #error "Sorry, the compiler is neither GCC, nor Intel, I don't know how to configure <boost/cstdfloat.hpp>."
+    #endif
+    } } } } // boost::math::cstdfloat::detail
+
+    #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE boost::math::cstdfloat::detail::float_internal128_t
+    #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+    #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+    #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+    #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+    #define BOOST_FLOAT128_C(x)  (x ## Q)
+    #define BOOST_CSTDFLOAT_FLOAT128_MIN  3.36210314311209350626267781732175260e-4932Q
+    #define BOOST_CSTDFLOAT_FLOAT128_MAX  1.18973149535723176508575932662800702e+4932Q
+    #define BOOST_CSTDFLOAT_FLOAT128_EPS  1.92592994438723585305597794258492732e-0034Q
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+  // This is the end of the preamble, and also the end of the
+  // sections providing support for the C++ standard library
+  // for quadruple-precision.
+
+  // Now we use the results of the queries that have been obtained
+  // in the preamble (far above) for the final type definitions in
+  // the namespace boost.
+
+  // Make sure that the compiler has any floating-point type(s) whatsoever.
+  #if (   (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+    #error The compiler does not support any of the floating-point types required for <boost/cstdfloat.hpp>.
+  #endif
+
+  // The following section contains the various min/max macros
+  // for the *leastN and *fastN types.
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST16_MIN   BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOAT_LEAST16_MIN  BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOAT_FAST16_MAX   BOOST_CSTDFLOAT_FLOAT_16_MAX
+    #define BOOST_FLOAT_LEAST16_MAX  BOOST_CSTDFLOAT_FLOAT_16_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST32_MIN   BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOAT_LEAST32_MIN  BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOAT_FAST32_MAX   BOOST_CSTDFLOAT_FLOAT_32_MAX
+    #define BOOST_FLOAT_LEAST32_MAX  BOOST_CSTDFLOAT_FLOAT_32_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST64_MIN   BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOAT_LEAST64_MIN  BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOAT_FAST64_MAX   BOOST_CSTDFLOAT_FLOAT_64_MAX
+    #define BOOST_FLOAT_LEAST64_MAX  BOOST_CSTDFLOAT_FLOAT_64_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST80_MIN   BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOAT_LEAST80_MIN  BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOAT_FAST80_MAX   BOOST_CSTDFLOAT_FLOAT_80_MAX
+    #define BOOST_FLOAT_LEAST80_MAX  BOOST_CSTDFLOAT_FLOAT_80_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 1)
+    #define BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T
+
+    #define BOOST_FLOAT_FAST128_MIN   BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOAT_LEAST128_MIN  BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOAT_FAST128_MAX   BOOST_CSTDFLOAT_FLOAT_128_MAX
+    #define BOOST_FLOAT_LEAST128_MAX  BOOST_CSTDFLOAT_FLOAT_128_MAX
+  #endif
+
+  // The following section contains the various min/max macros
+  // for the *floatmax types.
+
+  #if  (BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 16)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT16_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_16_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 32)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT32_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_32_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 64)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT64_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_64_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 80)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT80_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_80_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 128)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT128_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_128_MAX
+  #else
+    #error The maximum available floating-point width for <boost/cstdfloat.hpp> is undefined.
+  #endif
+
+  // And finally..., we define the floating-point typedefs having
+  // specified widths. The types are defined in the namespace boost.
+
+  // For simplicity, the least and fast types are type defined identically
+  // as the corresponding fixed-width type. This behavior may, however,
+  // be modified when being optimized for a given compiler implementation.
+
+  // In addition, a clear assessment of IEEE-754 comformance is carried out
+  // using compile-time assertion.
+
+  namespace boost
+  {
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE float16_t;
+      typedef boost::float16_t float_fast16_t;
+      typedef boost::float16_t float_least16_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::is_iec559    == true, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::radix        ==    2, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::digits       ==   11, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::max_exponent ==   16, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_16_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_16_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE float32_t;
+      typedef boost::float32_t float_fast32_t;
+      typedef boost::float32_t float_least32_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::is_iec559    == true, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::radix        ==    2, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::digits       ==   24, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::max_exponent ==  128, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_32_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_32_MAX
+    #endif
+
+#if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && defined(__SUNPRO_CC)
+#undef BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+#define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE 0
+#undef BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+#define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE 0
+#undef BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+#define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+#endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE float64_t;
+      typedef boost::float64_t float_fast64_t;
+      typedef boost::float64_t float_least64_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::is_iec559    == true, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::radix        ==    2, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::digits       ==   53, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::max_exponent == 1024, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_64_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_64_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE float80_t;
+      typedef boost::float80_t float_fast80_t;
+      typedef boost::float80_t float_least80_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::is_iec559    ==  true, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::radix        ==     2, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::digits       ==    64, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::max_exponent == 16384, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_80_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_80_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE float128_t;
+      typedef boost::float128_t float_fast128_t;
+      typedef boost::float128_t float_least128_t;
+
+      #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+      // This configuration does not *yet* support std::numeric_limits<boost::float128_t>.
+      // Support for std::numeric_limits<boost::float128_t> is added in the detail
+      // file <boost/math/cstdfloat/cstdfloat_limits.hpp>.
+      #else
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::is_iec559    ==  true, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::radix        ==     2, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::digits       ==   113, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::max_exponent == 16384, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      #endif
+
+      #undef BOOST_CSTDFLOAT_FLOAT_128_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_128_MAX
+    #endif
+
+    #if  (BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  16)
+      typedef boost::float16_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  32)
+      typedef boost::float32_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  64)
+      typedef boost::float64_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  80)
+      typedef boost::float80_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 128)
+      typedef boost::float128_t floatmax_t;
+    #else
+      #error The maximum available floating-point width for <boost/cstdfloat.hpp> is undefined.
+    #endif
+
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+
+    #undef BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+  }
+  // namespace boost
+
+#endif // _BOOST_CSTDFLOAT_BASE_TYPES_2014_01_09_HPP_
diff --git a/gatb-core/thirdparty/boost/math/distributions.hpp b/gatb-core/thirdparty/boost/math/distributions.hpp
new file mode 100644
index 0000000..300f231
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions.hpp
@@ -0,0 +1,53 @@
+//  Copyright John Maddock 2006, 2007.
+//  Copyright Paul A. Bristow 2006, 2007, 2009, 2010.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This file includes *all* the distributions.
+// this *may* be convenient if many are used
+// - to avoid including each distribution individually.
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_HPP
+#define BOOST_MATH_DISTRIBUTIONS_HPP
+
+#include <boost/math/distributions/arcsine.hpp>
+#include <boost/math/distributions/bernoulli.hpp>
+#include <boost/math/distributions/beta.hpp>
+#include <boost/math/distributions/binomial.hpp>
+#include <boost/math/distributions/cauchy.hpp>
+#include <boost/math/distributions/chi_squared.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/exponential.hpp>
+#include <boost/math/distributions/extreme_value.hpp>
+#include <boost/math/distributions/fisher_f.hpp>
+#include <boost/math/distributions/gamma.hpp>
+#include <boost/math/distributions/geometric.hpp>
+#include <boost/math/distributions/hyperexponential.hpp>
+#include <boost/math/distributions/hypergeometric.hpp>
+#include <boost/math/distributions/inverse_chi_squared.hpp>
+#include <boost/math/distributions/inverse_gamma.hpp>
+#include <boost/math/distributions/inverse_gaussian.hpp>
+#include <boost/math/distributions/laplace.hpp>
+#include <boost/math/distributions/logistic.hpp>
+#include <boost/math/distributions/lognormal.hpp>
+#include <boost/math/distributions/negative_binomial.hpp>
+#include <boost/math/distributions/non_central_chi_squared.hpp>
+#include <boost/math/distributions/non_central_beta.hpp>
+#include <boost/math/distributions/non_central_f.hpp>
+#include <boost/math/distributions/non_central_t.hpp>
+#include <boost/math/distributions/normal.hpp>
+#include <boost/math/distributions/pareto.hpp>
+#include <boost/math/distributions/poisson.hpp>
+#include <boost/math/distributions/rayleigh.hpp>
+#include <boost/math/distributions/skew_normal.hpp>
+#include <boost/math/distributions/students_t.hpp>
+#include <boost/math/distributions/triangular.hpp>
+#include <boost/math/distributions/uniform.hpp>
+#include <boost/math/distributions/weibull.hpp>
+#include <boost/math/distributions/find_scale.hpp>
+#include <boost/math/distributions/find_location.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/arcsine.hpp b/gatb-core/thirdparty/boost/math/distributions/arcsine.hpp
new file mode 100644
index 0000000..8aad5b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/arcsine.hpp
@@ -0,0 +1,535 @@
+// boost/math/distributions/arcsine.hpp
+
+// Copyright John Maddock 2014.
+// Copyright Paul A. Bristow 2014.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/arcsine_distribution
+
+// The arcsine Distribution is a continuous probability distribution.
+// http://en.wikipedia.org/wiki/Arcsine_distribution
+// http://www.wolframalpha.com/input/?i=ArcSinDistribution
+
+// Standard arcsine distribution is a special case of beta distribution with both a & b = one half,
+// and 0 <= x <= 1.
+
+// It is generalized to include any bounded support a <= x <= b from 0 <= x <= 1
+// by Wolfram and Wikipedia,
+// but using location and scale parameters by
+// Virtual Laboratories in Probability and Statistics http://www.math.uah.edu/stat/index.html
+// http://www.math.uah.edu/stat/special/Arcsine.html
+// The end-point version is simpler and more obvious, so we implement that.
+// TODO Perhaps provide location and scale functions?
+
+
+#ifndef BOOST_MATH_DIST_ARCSINE_HPP
+#define BOOST_MATH_DIST_ARCSINE_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/complement.hpp> // complements.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks.
+#include <boost/math/constants/constants.hpp>
+
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning(disable: 4702) // Unreachable code,
+// in domain_error_imp in error_handling.
+#endif
+
+#include <utility>
+#include <exception>  // For std::domain_error.
+
+namespace boost
+{
+  namespace math
+  {
+    namespace arcsine_detail
+    {
+      // Common error checking routines for arcsine distribution functions:
+      // Duplicating for x_min and x_max provides specific error messages.
+      template <class RealType, class Policy>
+      inline bool check_x_min(const char* function, const RealType& x, RealType* result, const Policy& pol)
+      {
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x_min argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        return true;
+      } // bool check_x_min
+
+      template <class RealType, class Policy>
+      inline bool check_x_max(const char* function, const RealType& x, RealType* result, const Policy& pol)
+      {
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x_max argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        return true;
+      } // bool check_x_max
+
+
+      template <class RealType, class Policy>
+      inline bool check_x_minmax(const char* function, const RealType& x_min, const RealType& x_max, RealType* result, const Policy& pol)
+      { // Check x_min < x_max
+        if (x_min >= x_max)
+        {
+          std::string msg = "x_max argument is %1%, but must be > x_min = " + lexical_cast<std::string>(x_min) + "!";
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            msg.c_str(), x_max, pol);
+           // "x_max argument is %1%, but must be > x_min !", x_max, pol);
+            //  "x_max argument is %1%, but must be > x_min %2!", x_max, x_min, pol); would be better. 
+          // But would require replication of all helpers functions in /policies/error_handling.hpp for two values,
+          // as well as two value versions of raise_error, raise_domain_error and do_format ...
+          // so use slightly hacky lexical_cast to string instead.
+          return false;
+        }
+        return true;
+      } // bool check_x_minmax
+
+      template <class RealType, class Policy>
+      inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        if ((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      } // bool check_prob
+
+      template <class RealType, class Policy>
+      inline bool check_x(const char* function, const RealType& x_min, const RealType& x_max, const RealType& x, RealType* result, const Policy& pol)
+      { // Check x finite and x_min < x < x_max.
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        if ((x < x_min) || (x > x_max))
+        {
+          // std::cout << x_min << ' ' << x << x_max << std::endl;
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x argument is %1%, but must be x_min < x < x_max !", x, pol);
+          // For example:
+          // Error in function boost::math::pdf(arcsine_distribution<double> const&, double) : x argument is -1.01, but must be x_min < x < x_max !
+          // TODO Perhaps show values of x_min and x_max?
+          return false;
+        }
+        return true;
+      } // bool check_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& x_min, const RealType& x_max, RealType* result, const Policy& pol)
+      { // Check both x_min and x_max finite, and x_min  < x_max.
+        return check_x_min(function, x_min, result, pol)
+            && check_x_max(function, x_max, result, pol)
+            && check_x_minmax(function, x_min, x_max, result, pol);
+      } // bool check_dist
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_x(const char* function, const RealType& x_min, const RealType& x_max, RealType x, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, x_min, x_max, result, pol)
+          && arcsine_detail::check_x(function, x_min, x_max, x, result, pol);
+      } // bool check_dist_and_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, const RealType& x_min, const RealType& x_max, RealType p, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, x_min, x_max, result, pol)
+          && check_prob(function, p, result, pol);
+      } // bool check_dist_and_prob
+
+    } // namespace arcsine_detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class arcsine_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      arcsine_distribution(RealType x_min = 0, RealType x_max = 1) : m_x_min(x_min), m_x_max(x_max)
+      { // Default beta (alpha = beta = 0.5) is standard arcsine with x_min = 0, x_max = 1.
+        // Generalized to allow x_min and x_max to be specified.
+        RealType result;
+        arcsine_detail::check_dist(
+          "boost::math::arcsine_distribution<%1%>::arcsine_distribution",
+          m_x_min,
+          m_x_max,
+          &result, Policy());
+      } // arcsine_distribution constructor.
+      // Accessor functions:
+      RealType x_min() const
+      {
+        return m_x_min;
+      }
+      RealType x_max() const
+      {
+        return m_x_max;
+      }
+
+    private:
+      RealType m_x_min; // Two x min and x max parameters of the arcsine distribution.
+      RealType m_x_max;
+    }; // template <class RealType, class Policy> class arcsine_distribution
+
+    // Convenient typedef to construct double version.
+    typedef arcsine_distribution<double> arcsine;
+
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const arcsine_distribution<RealType, Policy>&  dist)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(static_cast<RealType>(dist.x_min()), static_cast<RealType>(dist.x_max()));
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const arcsine_distribution<RealType, Policy>&  dist)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      return std::pair<RealType, RealType>(static_cast<RealType>(dist.x_min()), static_cast<RealType>(dist.x_max()));
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const arcsine_distribution<RealType, Policy>& dist)
+    { // Mean of arcsine distribution .
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::mean(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_min + x_max) / 2;
+    } // mean
+
+    template <class RealType, class Policy>
+    inline RealType variance(const arcsine_distribution<RealType, Policy>& dist)
+    { // Variance of standard arcsine distribution = (1-0)/8 = 0.125.
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist(
+        "boost::math::variance(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_max - x_min) * (x_max - x_min) / 8;
+    } // variance
+
+    template <class RealType, class Policy>
+    inline RealType mode(const arcsine_distribution<RealType, Policy>& /* dist */)
+    { //There are always [*two] values for the mode, at ['x_min] and at ['x_max], default 0 and 1,
+      // so instead we raise the exception domain_error.
+      return policies::raise_domain_error<RealType>(
+        "boost::math::mode(arcsine_distribution<%1%>&)",
+        "The arcsine distribution has two modes at x_min and x_max: "
+        "so the return value is %1%.",
+        std::numeric_limits<RealType>::quiet_NaN(), Policy());
+    } // mode
+
+    template <class RealType, class Policy>
+    inline RealType median(const arcsine_distribution<RealType, Policy>& dist)
+    { // Median of arcsine distribution (a + b) / 2 == mean.
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      RealType result;
+      if (false == arcsine_detail::check_dist(
+        "boost::math::median(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_min + x_max) / 2;
+    }
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::skewness(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return 0;
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::kurtosis_excess(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      result = -3;
+      return  result / 2;
+    } // kurtosis_excess
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::kurtosis(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+
+      return 3 + kurtosis_excess(dist);
+    } // kurtosis
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const arcsine_distribution<RealType, Policy>& dist, const RealType& xx)
+    { // Probability Density/Mass Function arcsine.
+      BOOST_FPU_EXCEPTION_GUARD
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      static const char* function = "boost::math::pdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType lo = dist.x_min();
+      RealType hi = dist.x_max();
+      RealType x = xx;
+
+      // Argument checks:
+      RealType result = 0; 
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        lo, hi, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      using boost::math::constants::pi;
+      result = static_cast<RealType>(1) / (pi<RealType>() * sqrt((x - lo) * (hi - x)));
+      return result;
+    } // pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const arcsine_distribution<RealType, Policy>& dist, const RealType& x)
+    { // Cumulative Distribution Function arcsine.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      static const char* function = "boost::math::cdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      // Argument checks:
+      RealType result = 0;
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        x_min, x_max, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (x == x_min)
+      {
+        return 0;
+      }
+      else if (x == x_max)
+      {
+        return 1;
+      }
+      using boost::math::constants::pi;
+      result = static_cast<RealType>(2) * asin(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      return result;
+    } // arcsine cdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<arcsine_distribution<RealType, Policy>, RealType>& c)
+    { // Complemented Cumulative Distribution Function arcsine.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+      static const char* function = "boost::math::cdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType x = c.param;
+      arcsine_distribution<RealType, Policy> const& dist = c.dist;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      // Argument checks:
+      RealType result = 0;
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        x_min, x_max, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (x == x_min)
+      {
+        return 0;
+      }
+      else if (x == x_max)
+      {
+        return 1;
+      }
+      using boost::math::constants::pi;
+      // Naive version x = 1 - x;
+      // result = static_cast<RealType>(2) * asin(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      // is less accurate, so use acos instead of asin for complement.
+      result = static_cast<RealType>(2) * acos(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      return result;
+    } // arcine ccdf
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const arcsine_distribution<RealType, Policy>& dist, const RealType& p)
+    { 
+      // Quantile or Percent Point arcsine function or
+      // Inverse Cumulative probability distribution function CDF.
+      // Return x (0 <= x <= 1),
+      // for a given probability p (0 <= p <= 1).
+      // These functions take a probability as an argument
+      // and return a value such that the probability that a random variable x
+      // will be less than or equal to that value
+      // is whatever probability you supplied as an argument.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      using boost::math::constants::half_pi;
+
+      static const char* function = "boost::math::quantile(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType result = 0; // of argument checks:
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist_and_prob(
+        function,
+        x_min, x_max, p,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (p == 0)
+      {
+        return 0;
+      }
+      if (p == 1)
+      {
+        return 1;
+      }
+
+      RealType sin2hpip = sin(half_pi<RealType>() * p);
+      RealType sin2hpip2 = sin2hpip * sin2hpip;
+      result = -x_min * sin2hpip2 + x_min + x_max * sin2hpip2;
+
+      return result;
+    } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<arcsine_distribution<RealType, Policy>, RealType>& c)
+    { 
+      // Complement Quantile or Percent Point arcsine function.
+      // Return the number of expected x for a given
+      // complement of the probability q.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      using boost::math::constants::half_pi;
+      static const char* function = "boost::math::quantile(arcsine_distribution<%1%> const&, %1%)";
+
+      // Error checks:
+      RealType q = c.param;
+      const arcsine_distribution<RealType, Policy>& dist = c.dist;
+      RealType result = 0;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist_and_prob(
+        function,
+        x_min,
+        x_max,
+        q,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (q == 1)
+      {
+        return 0;
+      }
+      if (q == 0)
+      {
+        return 1;
+      }
+      // Naive RealType p = 1 - q; result = sin(half_pi<RealType>() * p); loses accuracy, so use a cos alternative instead.
+      //result = cos(half_pi<RealType>() * q); // for arcsine(0,1)
+      //result = result * result;
+      // For generalized arcsine:
+      RealType cos2hpip = cos(half_pi<RealType>() * q);
+      RealType cos2hpip2 = cos2hpip * cos2hpip;
+      result = -x_min * cos2hpip2 + x_min + x_max * cos2hpip2;
+
+      return result;
+    } // Quantile Complement
+
+  } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#if defined (BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_DIST_ARCSINE_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/bernoulli.hpp b/gatb-core/thirdparty/boost/math/distributions/bernoulli.hpp
new file mode 100644
index 0000000..1355eda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/bernoulli.hpp
@@ -0,0 +1,336 @@
+// boost\math\distributions\bernoulli.hpp
+
+// Copyright John Maddock 2006.
+// Copyright Paul A. Bristow 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/bernoulli_distribution
+// http://mathworld.wolfram.com/BernoulliDistribution.html
+
+// bernoulli distribution is the discrete probability distribution of
+// the number (k) of successes, in a single Bernoulli trials.
+// It is a version of the binomial distribution when n = 1.
+
+// But note that the bernoulli distribution
+// (like others including the poisson, binomial & negative binomial)
+// is strictly defined as a discrete function: only integral values of k are envisaged.
+// However because of the method of calculation using a continuous gamma function,
+// it is convenient to treat it as if a continous function,
+// and permit non-integral values of k.
+// To enforce the strict mathematical model, users should use floor or ceil functions
+// on k outside this function to ensure that k is integral.
+
+#ifndef BOOST_MATH_SPECIAL_BERNOULLI_HPP
+#define BOOST_MATH_SPECIAL_BERNOULLI_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+
+#include <utility>
+
+namespace boost
+{
+  namespace math
+  {
+    namespace bernoulli_detail
+    {
+      // Common error checking routines for bernoulli distribution functions:
+      template <class RealType, class Policy>
+      inline bool check_success_fraction(const char* function, const RealType& p, RealType* result, const Policy& /* pol */)
+      {
+        if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Success fraction argument is %1%, but must be >= 0 and <= 1 !", p, Policy());
+          return false;
+        }
+        return true;
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& p, RealType* result, const Policy& /* pol */, const mpl::true_&)
+      {
+        return check_success_fraction(function, p, result, Policy());
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* , const RealType& , RealType* , const Policy& /* pol */, const mpl::false_&)
+      {
+         return true;
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& p, RealType* result, const Policy& /* pol */)
+      {
+         return check_dist(function, p, result, Policy(), typename policies::constructor_error_check<Policy>::type());
+      }
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_k(const char* function, const RealType& p, RealType k, RealType* result, const Policy& pol)
+      {
+        if(check_dist(function, p, result, Policy(), typename policies::method_error_check<Policy>::type()) == false)
+        {
+          return false;
+        }
+        if(!(boost::math::isfinite)(k) || !((k == 0) || (k == 1)))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Number of successes argument is %1%, but must be 0 or 1 !", k, pol);
+          return false;
+        }
+       return true;
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, RealType p, RealType prob, RealType* result, const Policy& /* pol */)
+      {
+        if(check_dist(function, p, result, Policy(), typename policies::method_error_check<Policy>::type()) && detail::check_probability(function, prob, result, Policy()) == false)
+        {
+          return false;
+        }
+        return true;
+      }
+    } // namespace bernoulli_detail
+
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class bernoulli_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      bernoulli_distribution(RealType p = 0.5) : m_p(p)
+      { // Default probability = half suits 'fair' coin tossing
+        // where probability of heads == probability of tails.
+        RealType result; // of checks.
+        bernoulli_detail::check_dist(
+           "boost::math::bernoulli_distribution<%1%>::bernoulli_distribution",
+          m_p,
+          &result, Policy());
+      } // bernoulli_distribution constructor.
+
+      RealType success_fraction() const
+      { // Probability.
+        return m_p;
+      }
+
+    private:
+      RealType m_p; // success_fraction
+    }; // template <class RealType> class bernoulli_distribution
+
+    typedef bernoulli_distribution<double> bernoulli;
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const bernoulli_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable k = {0, 1}.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const bernoulli_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable k = {0, 1}.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const bernoulli_distribution<RealType, Policy>& dist)
+    { // Mean of bernoulli distribution = p (n = 1).
+      return dist.success_fraction();
+    } // mean
+
+    // Rely on dereived_accessors quantile(half)
+    //template <class RealType>
+    //inline RealType median(const bernoulli_distribution<RealType, Policy>& dist)
+    //{ // Median of bernoulli distribution is not defined.
+    //  return tools::domain_error<RealType>(BOOST_CURRENT_FUNCTION, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
+    //} // median
+
+    template <class RealType, class Policy>
+    inline RealType variance(const bernoulli_distribution<RealType, Policy>& dist)
+    { // Variance of bernoulli distribution =p * q.
+      return  dist.success_fraction() * (1 - dist.success_fraction());
+    } // variance
+
+    template <class RealType, class Policy>
+    RealType pdf(const bernoulli_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Probability Density/Mass Function.
+      BOOST_FPU_EXCEPTION_GUARD
+      // Error check:
+      RealType result = 0; // of checks.
+      if(false == bernoulli_detail::check_dist_and_k(
+        "boost::math::pdf(bernoulli_distribution<%1%>, %1%)",
+        dist.success_fraction(), // 0 to 1
+        k, // 0 or 1
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Assume k is integral.
+      if (k == 0)
+      {
+        return 1 - dist.success_fraction(); // 1 - p
+      }
+      else  // k == 1
+      {
+        return dist.success_fraction(); // p
+      }
+    } // pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const bernoulli_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Cumulative Distribution Function Bernoulli.
+      RealType p = dist.success_fraction();
+      // Error check:
+      RealType result = 0;
+      if(false == bernoulli_detail::check_dist_and_k(
+        "boost::math::cdf(bernoulli_distribution<%1%>, %1%)",
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (k == 0)
+      {
+        return 1 - p;
+      }
+      else
+      { // k == 1
+        return 1;
+      }
+    } // bernoulli cdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<bernoulli_distribution<RealType, Policy>, RealType>& c)
+    { // Complemented Cumulative Distribution Function bernoulli.
+      RealType const& k = c.param;
+      bernoulli_distribution<RealType, Policy> const& dist = c.dist;
+      RealType p = dist.success_fraction();
+      // Error checks:
+      RealType result = 0;
+      if(false == bernoulli_detail::check_dist_and_k(
+        "boost::math::cdf(bernoulli_distribution<%1%>, %1%)",
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (k == 0)
+      {
+        return p;
+      }
+      else
+      { // k == 1
+        return 0;
+      }
+    } // bernoulli cdf complement
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const bernoulli_distribution<RealType, Policy>& dist, const RealType& p)
+    { // Quantile or Percent Point Bernoulli function.
+      // Return the number of expected successes k either 0 or 1.
+      // for a given probability p.
+
+      RealType result = 0; // of error checks:
+      if(false == bernoulli_detail::check_dist_and_prob(
+        "boost::math::quantile(bernoulli_distribution<%1%>, %1%)",
+        dist.success_fraction(),
+        p,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (p <= (1 - dist.success_fraction()))
+      { // p <= pdf(dist, 0) == cdf(dist, 0)
+        return 0;
+      }
+      else
+      {
+        return 1;
+      }
+    } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<bernoulli_distribution<RealType, Policy>, RealType>& c)
+    { // Quantile or Percent Point bernoulli function.
+      // Return the number of expected successes k for a given
+      // complement of the probability q.
+      //
+      // Error checks:
+      RealType q = c.param;
+      const bernoulli_distribution<RealType, Policy>& dist = c.dist;
+      RealType result = 0;
+      if(false == bernoulli_detail::check_dist_and_prob(
+        "boost::math::quantile(bernoulli_distribution<%1%>, %1%)",
+        dist.success_fraction(),
+        q,
+        &result, Policy()))
+      {
+        return result;
+      }
+
+      if (q <= 1 - dist.success_fraction())
+      { // // q <= cdf(complement(dist, 0)) == pdf(dist, 0)
+        return 1;
+      }
+      else
+      {
+        return 0;
+      }
+    } // quantile complemented.
+
+    template <class RealType, class Policy>
+    inline RealType mode(const bernoulli_distribution<RealType, Policy>& dist)
+    {
+      return static_cast<RealType>((dist.success_fraction() <= 0.5) ? 0 : 1); // p = 0.5 can be 0 or 1
+    }
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const bernoulli_distribution<RealType, Policy>& dist)
+    {
+      BOOST_MATH_STD_USING; // Aid ADL for sqrt.
+      RealType p = dist.success_fraction();
+      return (1 - 2 * p) / sqrt(p * (1 - p));
+    }
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const bernoulli_distribution<RealType, Policy>& dist)
+    {
+      RealType p = dist.success_fraction();
+      // Note Wolfram says this is kurtosis in text, but gamma2 is the kurtosis excess,
+      // and Wikipedia also says this is the kurtosis excess formula.
+      // return (6 * p * p - 6 * p + 1) / (p * (1 - p));
+      // But Wolfram kurtosis article gives this simpler formula for kurtosis excess:
+      return 1 / (1 - p) + 1/p -6;
+    }
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const bernoulli_distribution<RealType, Policy>& dist)
+    {
+      RealType p = dist.success_fraction();
+      return 1 / (1 - p) + 1/p -6 + 3;
+      // Simpler than:
+      // return (6 * p * p - 6 * p + 1) / (p * (1 - p)) + 3;
+    }
+
+  } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_BERNOULLI_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/beta.hpp b/gatb-core/thirdparty/boost/math/distributions/beta.hpp
new file mode 100644
index 0000000..5ecf902
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/beta.hpp
@@ -0,0 +1,541 @@
+// boost\math\distributions\beta.hpp
+
+// Copyright John Maddock 2006.
+// Copyright Paul A. Bristow 2006.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/Beta_distribution
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
+// http://mathworld.wolfram.com/BetaDistribution.html
+
+// The Beta Distribution is a continuous probability distribution.
+// The beta distribution is used to model events which are constrained to take place
+// within an interval defined by maxima and minima,
+// so is used extensively in PERT and other project management systems
+// to describe the time to completion.
+// The cdf of the beta distribution is used as a convenient way
+// of obtaining the sum over a set of binomial outcomes.
+// The beta distribution is also used in Bayesian statistics.
+
+#ifndef BOOST_MATH_DIST_BETA_HPP
+#define BOOST_MATH_DIST_BETA_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for beta.
+#include <boost/math/distributions/complement.hpp> // complements.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning(disable: 4702) // unreachable code
+// in domain_error_imp in error_handling
+#endif
+
+#include <utility>
+
+namespace boost
+{
+  namespace math
+  {
+    namespace beta_detail
+    {
+      // Common error checking routines for beta distribution functions:
+      template <class RealType, class Policy>
+      inline bool check_alpha(const char* function, const RealType& alpha, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(alpha) || (alpha <= 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Alpha argument is %1%, but must be > 0 !", alpha, pol);
+          return false;
+        }
+        return true;
+      } // bool check_alpha
+
+      template <class RealType, class Policy>
+      inline bool check_beta(const char* function, const RealType& beta, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(beta) || (beta <= 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Beta argument is %1%, but must be > 0 !", beta, pol);
+          return false;
+        }
+        return true;
+      } // bool check_beta
+
+      template <class RealType, class Policy>
+      inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        if((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      } // bool check_prob
+
+      template <class RealType, class Policy>
+      inline bool check_x(const char* function, const RealType& x, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(x) || (x < 0) || (x > 1))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x argument is %1%, but must be >= 0 and <= 1 !", x, pol);
+          return false;
+        }
+        return true;
+      } // bool check_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& alpha, const RealType& beta, RealType* result, const Policy& pol)
+      { // Check both alpha and beta.
+        return check_alpha(function, alpha, result, pol)
+          && check_beta(function, beta, result, pol);
+      } // bool check_dist
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_x(const char* function, const RealType& alpha, const RealType& beta, RealType x, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, alpha, beta, result, pol)
+          && beta_detail::check_x(function, x, result, pol);
+      } // bool check_dist_and_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, const RealType& alpha, const RealType& beta, RealType p, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, alpha, beta, result, pol)
+          && check_prob(function, p, result, pol);
+      } // bool check_dist_and_prob
+
+      template <class RealType, class Policy>
+      inline bool check_mean(const char* function, const RealType& mean, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(mean) || (mean <= 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "mean argument is %1%, but must be > 0 !", mean, pol);
+          return false;
+        }
+        return true;
+      } // bool check_mean
+      template <class RealType, class Policy>
+      inline bool check_variance(const char* function, const RealType& variance, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(variance) || (variance <= 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "variance argument is %1%, but must be > 0 !", variance, pol);
+          return false;
+        }
+        return true;
+      } // bool check_variance
+    } // namespace beta_detail
+
+    // typedef beta_distribution<double> beta;
+    // is deliberately NOT included to avoid a name clash with the beta function.
+    // Use beta_distribution<> mybeta(...) to construct type double.
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class beta_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      beta_distribution(RealType l_alpha = 1, RealType l_beta = 1) : m_alpha(l_alpha), m_beta(l_beta)
+      {
+        RealType result;
+        beta_detail::check_dist(
+           "boost::math::beta_distribution<%1%>::beta_distribution",
+          m_alpha,
+          m_beta,
+          &result, Policy());
+      } // beta_distribution constructor.
+      // Accessor functions:
+      RealType alpha() const
+      {
+        return m_alpha;
+      }
+      RealType beta() const
+      { // .
+        return m_beta;
+      }
+
+      // Estimation of the alpha & beta parameters.
+      // http://en.wikipedia.org/wiki/Beta_distribution
+      // gives formulae in section on parameter estimation.
+      // Also NIST EDA page 3 & 4 give the same.
+      // http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
+      // http://www.epi.ucdavis.edu/diagnostictests/betabuster.html
+
+      static RealType find_alpha(
+        RealType mean, // Expected value of mean.
+        RealType variance) // Expected value of variance.
+      {
+        static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
+        RealType result = 0; // of error checks.
+        if(false ==
+            (
+              beta_detail::check_mean(function, mean, &result, Policy())
+              && beta_detail::check_variance(function, variance, &result, Policy())
+            )
+          )
+        {
+          return result;
+        }
+        return mean * (( (mean * (1 - mean)) / variance)- 1);
+      } // RealType find_alpha
+
+      static RealType find_beta(
+        RealType mean, // Expected value of mean.
+        RealType variance) // Expected value of variance.
+      {
+        static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
+        RealType result = 0; // of error checks.
+        if(false ==
+            (
+              beta_detail::check_mean(function, mean, &result, Policy())
+              &&
+              beta_detail::check_variance(function, variance, &result, Policy())
+            )
+          )
+        {
+          return result;
+        }
+        return (1 - mean) * (((mean * (1 - mean)) /variance)-1);
+      } //  RealType find_beta
+
+      // Estimate alpha & beta from either alpha or beta, and x and probability.
+      // Uses for these parameter estimators are unclear.
+
+      static RealType find_alpha(
+        RealType beta, // from beta.
+        RealType x, //  x.
+        RealType probability) // cdf
+      {
+        static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
+        RealType result = 0; // of error checks.
+        if(false ==
+            (
+             beta_detail::check_prob(function, probability, &result, Policy())
+             &&
+             beta_detail::check_beta(function, beta, &result, Policy())
+             &&
+             beta_detail::check_x(function, x, &result, Policy())
+            )
+          )
+        {
+          return result;
+        }
+        return ibeta_inva(beta, x, probability, Policy());
+      } // RealType find_alpha(beta, a, probability)
+
+      static RealType find_beta(
+        // ibeta_invb(T b, T x, T p); (alpha, x, cdf,)
+        RealType alpha, // alpha.
+        RealType x, // probability x.
+        RealType probability) // probability cdf.
+      {
+        static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
+        RealType result = 0; // of error checks.
+        if(false ==
+            (
+              beta_detail::check_prob(function, probability, &result, Policy())
+              &&
+              beta_detail::check_alpha(function, alpha, &result, Policy())
+              &&
+              beta_detail::check_x(function, x, &result, Policy())
+            )
+          )
+        {
+          return result;
+        }
+        return ibeta_invb(alpha, x, probability, Policy());
+      } //  RealType find_beta(alpha, x, probability)
+
+    private:
+      RealType m_alpha; // Two parameters of the beta distribution.
+      RealType m_beta;
+    }; // template <class RealType, class Policy> class beta_distribution
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const beta_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const beta_distribution<RealType, Policy>&  /* dist */)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const beta_distribution<RealType, Policy>& dist)
+    { // Mean of beta distribution = np.
+      return  dist.alpha() / (dist.alpha() + dist.beta());
+    } // mean
+
+    template <class RealType, class Policy>
+    inline RealType variance(const beta_distribution<RealType, Policy>& dist)
+    { // Variance of beta distribution = np(1-p).
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      return  (a * b) / ((a + b ) * (a + b) * (a + b + 1));
+    } // variance
+
+    template <class RealType, class Policy>
+    inline RealType mode(const beta_distribution<RealType, Policy>& dist)
+    {
+      static const char* function = "boost::math::mode(beta_distribution<%1%> const&)";
+
+      RealType result;
+      if ((dist.alpha() <= 1))
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "mode undefined for alpha = %1%, must be > 1!", dist.alpha(), Policy());
+        return result;
+      }
+
+      if ((dist.beta() <= 1))
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "mode undefined for beta = %1%, must be > 1!", dist.beta(), Policy());
+        return result;
+      }
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      return (a-1) / (a + b - 2);
+    } // mode
+
+    //template <class RealType, class Policy>
+    //inline RealType median(const beta_distribution<RealType, Policy>& dist)
+    //{ // Median of beta distribution is not defined.
+    //  return tools::domain_error<RealType>(function, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
+    //} // median
+
+    //But WILL be provided by the derived accessor as quantile(0.5).
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const beta_distribution<RealType, Policy>& dist)
+    {
+      BOOST_MATH_STD_USING // ADL of std functions.
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      return (2 * (b-a) * sqrt(a + b + 1)) / ((a + b + 2) * sqrt(a * b));
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const beta_distribution<RealType, Policy>& dist)
+    {
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      RealType a_2 = a * a;
+      RealType n = 6 * (a_2 * a - a_2 * (2 * b - 1) + b * b * (b + 1) - 2 * a * b * (b + 2));
+      RealType d = a * b * (a + b + 2) * (a + b + 3);
+      return  n / d;
+    } // kurtosis_excess
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const beta_distribution<RealType, Policy>& dist)
+    {
+      return 3 + kurtosis_excess(dist);
+    } // kurtosis
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
+    { // Probability Density/Mass Function.
+      BOOST_FPU_EXCEPTION_GUARD
+
+      static const char* function = "boost::math::pdf(beta_distribution<%1%> const&, %1%)";
+
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+
+      // Argument checks:
+      RealType result = 0;
+      if(false == beta_detail::check_dist_and_x(
+        function,
+        a, b, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      using boost::math::beta;
+      return ibeta_derivative(a, b, x, Policy());
+    } // pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
+    { // Cumulative Distribution Function beta.
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+      static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
+
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+
+      // Argument checks:
+      RealType result = 0;
+      if(false == beta_detail::check_dist_and_x(
+        function,
+        a, b, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (x == 0)
+      {
+        return 0;
+      }
+      else if (x == 1)
+      {
+        return 1;
+      }
+      return ibeta(a, b, x, Policy());
+    } // beta cdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
+    { // Complemented Cumulative Distribution Function beta.
+
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+      static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
+
+      RealType const& x = c.param;
+      beta_distribution<RealType, Policy> const& dist = c.dist;
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+
+      // Argument checks:
+      RealType result = 0;
+      if(false == beta_detail::check_dist_and_x(
+        function,
+        a, b, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (x == 0)
+      {
+        return 1;
+      }
+      else if (x == 1)
+      {
+        return 0;
+      }
+      // Calculate cdf beta using the incomplete beta function.
+      // Use of ibeta here prevents cancellation errors in calculating
+      // 1 - x if x is very small, perhaps smaller than machine epsilon.
+      return ibetac(a, b, x, Policy());
+    } // beta cdf
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const beta_distribution<RealType, Policy>& dist, const RealType& p)
+    { // Quantile or Percent Point beta function or
+      // Inverse Cumulative probability distribution function CDF.
+      // Return x (0 <= x <= 1),
+      // for a given probability p (0 <= p <= 1).
+      // These functions take a probability as an argument
+      // and return a value such that the probability that a random variable x
+      // will be less than or equal to that value
+      // is whatever probability you supplied as an argument.
+
+      static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
+
+      RealType result = 0; // of argument checks:
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      if(false == beta_detail::check_dist_and_prob(
+        function,
+        a, b, p,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (p == 0)
+      {
+        return 0;
+      }
+      if (p == 1)
+      {
+        return 1;
+      }
+      return ibeta_inv(a, b, p, static_cast<RealType*>(0), Policy());
+    } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
+    { // Complement Quantile or Percent Point beta function .
+      // Return the number of expected x for a given
+      // complement of the probability q.
+
+      static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
+
+      //
+      // Error checks:
+      RealType q = c.param;
+      const beta_distribution<RealType, Policy>& dist = c.dist;
+      RealType result = 0;
+      RealType a = dist.alpha();
+      RealType b = dist.beta();
+      if(false == beta_detail::check_dist_and_prob(
+        function,
+        a,
+        b,
+        q,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if(q == 1)
+      {
+        return 0;
+      }
+      if(q == 0)
+      {
+        return 1;
+      }
+
+      return ibetac_inv(a, b, q, static_cast<RealType*>(0), Policy());
+    } // Quantile Complement
+
+  } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#if defined (BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_DIST_BETA_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/binomial.hpp b/gatb-core/thirdparty/boost/math/distributions/binomial.hpp
new file mode 100644
index 0000000..a48c89c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/binomial.hpp
@@ -0,0 +1,728 @@
+// boost\math\distributions\binomial.hpp
+
+// Copyright John Maddock 2006.
+// Copyright Paul A. Bristow 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/binomial_distribution
+
+// Binomial distribution is the discrete probability distribution of
+// the number (k) of successes, in a sequence of
+// n independent (yes or no, success or failure) Bernoulli trials.
+
+// It expresses the probability of a number of events occurring in a fixed time
+// if these events occur with a known average rate (probability of success),
+// and are independent of the time since the last event.
+
+// The number of cars that pass through a certain point on a road during a given period of time.
+// The number of spelling mistakes a secretary makes while typing a single page.
+// The number of phone calls at a call center per minute.
+// The number of times a web server is accessed per minute.
+// The number of light bulbs that burn out in a certain amount of time.
+// The number of roadkill found per unit length of road
+
+// http://en.wikipedia.org/wiki/binomial_distribution
+
+// Given a sample of N measured values k[i],
+// we wish to estimate the value of the parameter x (mean)
+// of the binomial population from which the sample was drawn.
+// To calculate the maximum likelihood value = 1/N sum i = 1 to N of k[i]
+
+// Also may want a function for EXACTLY k.
+
+// And probability that there are EXACTLY k occurrences is
+// exp(-x) * pow(x, k) / factorial(k)
+// where x is expected occurrences (mean) during the given interval.
+// For example, if events occur, on average, every 4 min,
+// and we are interested in number of events occurring in 10 min,
+// then x = 10/4 = 2.5
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda366i.htm
+
+// The binomial distribution is used when there are
+// exactly two mutually exclusive outcomes of a trial.
+// These outcomes are appropriately labeled "success" and "failure".
+// The binomial distribution is used to obtain
+// the probability of observing x successes in N trials,
+// with the probability of success on a single trial denoted by p.
+// The binomial distribution assumes that p is fixed for all trials.
+
+// P(x, p, n) = n!/(x! * (n-x)!) * p^x * (1-p)^(n-x)
+
+// http://mathworld.wolfram.com/BinomialCoefficient.html
+
+// The binomial coefficient (n; k) is the number of ways of picking
+// k unordered outcomes from n possibilities,
+// also known as a combination or combinatorial number.
+// The symbols _nC_k and (n; k) are used to denote a binomial coefficient,
+// and are sometimes read as "n choose k."
+// (n; k) therefore gives the number of k-subsets  possible out of a set of n distinct items.
+
+// For example:
+//  The 2-subsets of {1,2,3,4} are the six pairs {1,2}, {1,3}, {1,4}, {2,3}, {2,4}, and {3,4}, so (4; 2)==6.
+
+// http://functions.wolfram.com/GammaBetaErf/Binomial/ for evaluation.
+
+// But note that the binomial distribution
+// (like others including the poisson, negative binomial & Bernoulli)
+// is strictly defined as a discrete function: only integral values of k are envisaged.
+// However because of the method of calculation using a continuous gamma function,
+// it is convenient to treat it as if a continous function,
+// and permit non-integral values of k.
+// To enforce the strict mathematical model, users should use floor or ceil functions
+// on k outside this function to ensure that k is integral.
+
+#ifndef BOOST_MATH_SPECIAL_BINOMIAL_HPP
+#define BOOST_MATH_SPECIAL_BINOMIAL_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for incomplete beta.
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/distributions/detail/inv_discrete_quantile.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+
+#include <utility>
+
+namespace boost
+{
+  namespace math
+  {
+
+     template <class RealType, class Policy>
+     class binomial_distribution;
+
+     namespace binomial_detail{
+        // common error checking routines for binomial distribution functions:
+        template <class RealType, class Policy>
+        inline bool check_N(const char* function, const RealType& N, RealType* result, const Policy& pol)
+        {
+           if((N < 0) || !(boost::math::isfinite)(N))
+           {
+               *result = policies::raise_domain_error<RealType>(
+                  function,
+                  "Number of Trials argument is %1%, but must be >= 0 !", N, pol);
+               return false;
+           }
+           return true;
+        }
+        template <class RealType, class Policy>
+        inline bool check_success_fraction(const char* function, const RealType& p, RealType* result, const Policy& pol)
+        {
+           if((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
+           {
+               *result = policies::raise_domain_error<RealType>(
+                  function,
+                  "Success fraction argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+               return false;
+           }
+           return true;
+        }
+        template <class RealType, class Policy>
+        inline bool check_dist(const char* function, const RealType& N, const RealType& p, RealType* result, const Policy& pol)
+        {
+           return check_success_fraction(
+              function, p, result, pol)
+              && check_N(
+               function, N, result, pol);
+        }
+        template <class RealType, class Policy>
+        inline bool check_dist_and_k(const char* function, const RealType& N, const RealType& p, RealType k, RealType* result, const Policy& pol)
+        {
+           if(check_dist(function, N, p, result, pol) == false)
+              return false;
+           if((k < 0) || !(boost::math::isfinite)(k))
+           {
+               *result = policies::raise_domain_error<RealType>(
+                  function,
+                  "Number of Successes argument is %1%, but must be >= 0 !", k, pol);
+               return false;
+           }
+           if(k > N)
+           {
+               *result = policies::raise_domain_error<RealType>(
+                  function,
+                  "Number of Successes argument is %1%, but must be <= Number of Trials !", k, pol);
+               return false;
+           }
+           return true;
+        }
+        template <class RealType, class Policy>
+        inline bool check_dist_and_prob(const char* function, const RealType& N, RealType p, RealType prob, RealType* result, const Policy& pol)
+        {
+           if(check_dist(function, N, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+              return false;
+           return true;
+        }
+
+         template <class T, class Policy>
+         T inverse_binomial_cornish_fisher(T n, T sf, T p, T q, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            // mean:
+            T m = n * sf;
+            // standard deviation:
+            T sigma = sqrt(n * sf * (1 - sf));
+            // skewness
+            T sk = (1 - 2 * sf) / sigma;
+            // kurtosis:
+            // T k = (1 - 6 * sf * (1 - sf) ) / (n * sf * (1 - sf));
+            // Get the inverse of a std normal distribution:
+            T x = boost::math::erfc_inv(p > q ? 2 * q : 2 * p, pol) * constants::root_two<T>();
+            // Set the sign:
+            if(p < 0.5)
+               x = -x;
+            T x2 = x * x;
+            // w is correction term due to skewness
+            T w = x + sk * (x2 - 1) / 6;
+            /*
+            // Add on correction due to kurtosis.
+            // Disabled for now, seems to make things worse?
+            //
+            if(n >= 10)
+               w += k * x * (x2 - 3) / 24 + sk * sk * x * (2 * x2 - 5) / -36;
+               */
+            w = m + sigma * w;
+            if(w < tools::min_value<T>())
+               return sqrt(tools::min_value<T>());
+            if(w > n)
+               return n;
+            return w;
+         }
+
+      template <class RealType, class Policy>
+      RealType quantile_imp(const binomial_distribution<RealType, Policy>& dist, const RealType& p, const RealType& q, bool comp)
+      { // Quantile or Percent Point Binomial function.
+        // Return the number of expected successes k,
+        // for a given probability p.
+        //
+        // Error checks:
+        BOOST_MATH_STD_USING  // ADL of std names
+        RealType result = 0;
+        RealType trials = dist.trials();
+        RealType success_fraction = dist.success_fraction();
+        if(false == binomial_detail::check_dist_and_prob(
+           "boost::math::quantile(binomial_distribution<%1%> const&, %1%)",
+           trials,
+           success_fraction,
+           p,
+           &result, Policy()))
+        {
+           return result;
+        }
+
+        // Special cases:
+        //
+        if(p == 0)
+        {  // There may actually be no answer to this question,
+           // since the probability of zero successes may be non-zero,
+           // but zero is the best we can do:
+           return 0;
+        }
+        if(p == 1)
+        {  // Probability of n or fewer successes is always one,
+           // so n is the most sensible answer here:
+           return trials;
+        }
+        if (p <= pow(1 - success_fraction, trials))
+        { // p <= pdf(dist, 0) == cdf(dist, 0)
+          return 0; // So the only reasonable result is zero.
+        } // And root finder would fail otherwise.
+        if(success_fraction == 1)
+        {  // our formulae break down in this case:
+           return p > 0.5f ? trials : 0;
+        }
+
+        // Solve for quantile numerically:
+        //
+        RealType guess = binomial_detail::inverse_binomial_cornish_fisher(trials, success_fraction, p, q, Policy());
+        RealType factor = 8;
+        if(trials > 100)
+           factor = 1.01f; // guess is pretty accurate
+        else if((trials > 10) && (trials - 1 > guess) && (guess > 3))
+           factor = 1.15f; // less accurate but OK.
+        else if(trials < 10)
+        {
+           // pretty inaccurate guess in this area:
+           if(guess > trials / 64)
+           {
+              guess = trials / 4;
+              factor = 2;
+           }
+           else
+              guess = trials / 1024;
+        }
+        else
+           factor = 2; // trials largish, but in far tails.
+
+        typedef typename Policy::discrete_quantile_type discrete_quantile_type;
+        boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+        return detail::inverse_discrete_quantile(
+            dist,
+            comp ? q : p,
+            comp,
+            guess,
+            factor,
+            RealType(1),
+            discrete_quantile_type(),
+            max_iter);
+      } // quantile
+
+     }
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class binomial_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      binomial_distribution(RealType n = 1, RealType p = 0.5) : m_n(n), m_p(p)
+      { // Default n = 1 is the Bernoulli distribution
+        // with equal probability of 'heads' or 'tails.
+         RealType r;
+         binomial_detail::check_dist(
+            "boost::math::binomial_distribution<%1%>::binomial_distribution",
+            m_n,
+            m_p,
+            &r, Policy());
+      } // binomial_distribution constructor.
+
+      RealType success_fraction() const
+      { // Probability.
+        return m_p;
+      }
+      RealType trials() const
+      { // Total number of trials.
+        return m_n;
+      }
+
+      enum interval_type{
+         clopper_pearson_exact_interval,
+         jeffreys_prior_interval
+      };
+
+      //
+      // Estimation of the success fraction parameter.
+      // The best estimate is actually simply successes/trials,
+      // these functions are used
+      // to obtain confidence intervals for the success fraction.
+      //
+      static RealType find_lower_bound_on_p(
+         RealType trials,
+         RealType successes,
+         RealType probability,
+         interval_type t = clopper_pearson_exact_interval)
+      {
+        static const char* function = "boost::math::binomial_distribution<%1%>::find_lower_bound_on_p";
+        // Error checks:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           function, trials, RealType(0), successes, &result, Policy())
+            &&
+           binomial_detail::check_dist_and_prob(
+           function, trials, RealType(0), probability, &result, Policy()))
+        { return result; }
+
+        if(successes == 0)
+           return 0;
+
+        // NOTE!!! The Clopper Pearson formula uses "successes" not
+        // "successes+1" as usual to get the lower bound,
+        // see http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm
+        return (t == clopper_pearson_exact_interval) ? ibeta_inv(successes, trials - successes + 1, probability, static_cast<RealType*>(0), Policy())
+           : ibeta_inv(successes + 0.5f, trials - successes + 0.5f, probability, static_cast<RealType*>(0), Policy());
+      }
+      static RealType find_upper_bound_on_p(
+         RealType trials,
+         RealType successes,
+         RealType probability,
+         interval_type t = clopper_pearson_exact_interval)
+      {
+        static const char* function = "boost::math::binomial_distribution<%1%>::find_upper_bound_on_p";
+        // Error checks:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           function, trials, RealType(0), successes, &result, Policy())
+            &&
+           binomial_detail::check_dist_and_prob(
+           function, trials, RealType(0), probability, &result, Policy()))
+        { return result; }
+
+        if(trials == successes)
+           return 1;
+
+        return (t == clopper_pearson_exact_interval) ? ibetac_inv(successes + 1, trials - successes, probability, static_cast<RealType*>(0), Policy())
+           : ibetac_inv(successes + 0.5f, trials - successes + 0.5f, probability, static_cast<RealType*>(0), Policy());
+      }
+      // Estimate number of trials parameter:
+      //
+      // "How many trials do I need to be P% sure of seeing k events?"
+      //    or
+      // "How many trials can I have to be P% sure of seeing fewer than k events?"
+      //
+      static RealType find_minimum_number_of_trials(
+         RealType k,     // number of events
+         RealType p,     // success fraction
+         RealType alpha) // risk level
+      {
+        static const char* function = "boost::math::binomial_distribution<%1%>::find_minimum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           function, k, p, k, &result, Policy())
+            &&
+           binomial_detail::check_dist_and_prob(
+           function, k, p, alpha, &result, Policy()))
+        { return result; }
+
+        result = ibetac_invb(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      }
+
+      static RealType find_maximum_number_of_trials(
+         RealType k,     // number of events
+         RealType p,     // success fraction
+         RealType alpha) // risk level
+      {
+        static const char* function = "boost::math::binomial_distribution<%1%>::find_maximum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           function, k, p, k, &result, Policy())
+            &&
+           binomial_detail::check_dist_and_prob(
+           function, k, p, alpha, &result, Policy()))
+        { return result; }
+
+        result = ibeta_invb(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      }
+
+    private:
+        RealType m_n; // Not sure if this shouldn't be an int?
+        RealType m_p; // success_fraction
+      }; // template <class RealType, class Policy> class binomial_distribution
+
+      typedef binomial_distribution<> binomial;
+      // typedef binomial_distribution<double> binomial;
+      // IS now included since no longer a name clash with function binomial.
+      //typedef binomial_distribution<double> binomial; // Reserved name of type double.
+
+      template <class RealType, class Policy>
+      const std::pair<RealType, RealType> range(const binomial_distribution<RealType, Policy>& dist)
+      { // Range of permissible values for random variable k.
+        using boost::math::tools::max_value;
+        return std::pair<RealType, RealType>(static_cast<RealType>(0), dist.trials());
+      }
+
+      template <class RealType, class Policy>
+      const std::pair<RealType, RealType> support(const binomial_distribution<RealType, Policy>& dist)
+      { // Range of supported values for random variable k.
+        // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+        return std::pair<RealType, RealType>(static_cast<RealType>(0),  dist.trials());
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mean(const binomial_distribution<RealType, Policy>& dist)
+      { // Mean of Binomial distribution = np.
+        return  dist.trials() * dist.success_fraction();
+      } // mean
+
+      template <class RealType, class Policy>
+      inline RealType variance(const binomial_distribution<RealType, Policy>& dist)
+      { // Variance of Binomial distribution = np(1-p).
+        return  dist.trials() * dist.success_fraction() * (1 - dist.success_fraction());
+      } // variance
+
+      template <class RealType, class Policy>
+      RealType pdf(const binomial_distribution<RealType, Policy>& dist, const RealType& k)
+      { // Probability Density/Mass Function.
+        BOOST_FPU_EXCEPTION_GUARD
+
+        BOOST_MATH_STD_USING // for ADL of std functions
+
+        RealType n = dist.trials();
+
+        // Error check:
+        RealType result = 0; // initialization silences some compiler warnings
+        if(false == binomial_detail::check_dist_and_k(
+           "boost::math::pdf(binomial_distribution<%1%> const&, %1%)",
+           n,
+           dist.success_fraction(),
+           k,
+           &result, Policy()))
+        {
+           return result;
+        }
+
+        // Special cases of success_fraction, regardless of k successes and regardless of n trials.
+        if (dist.success_fraction() == 0)
+        {  // probability of zero successes is 1:
+           return static_cast<RealType>(k == 0 ? 1 : 0);
+        }
+        if (dist.success_fraction() == 1)
+        {  // probability of n successes is 1:
+           return static_cast<RealType>(k == n ? 1 : 0);
+        }
+        // k argument may be integral, signed, or unsigned, or floating point.
+        // If necessary, it has already been promoted from an integral type.
+        if (n == 0)
+        {
+          return 1; // Probability = 1 = certainty.
+        }
+        if (k == 0)
+        { // binomial coeffic (n 0) = 1,
+          // n ^ 0 = 1
+          return pow(1 - dist.success_fraction(), n);
+        }
+        if (k == n)
+        { // binomial coeffic (n n) = 1,
+          // n ^ 0 = 1
+          return pow(dist.success_fraction(), k);  // * pow((1 - dist.success_fraction()), (n - k)) = 1
+        }
+
+        // Probability of getting exactly k successes
+        // if C(n, k) is the binomial coefficient then:
+        //
+        // f(k; n,p) = C(n, k) * p^k * (1-p)^(n-k)
+        //           = (n!/(k!(n-k)!)) * p^k * (1-p)^(n-k)
+        //           = (tgamma(n+1) / (tgamma(k+1)*tgamma(n-k+1))) * p^k * (1-p)^(n-k)
+        //           = p^k (1-p)^(n-k) / (beta(k+1, n-k+1) * (n+1))
+        //           = ibeta_derivative(k+1, n-k+1, p) / (n+1)
+        //
+        using boost::math::ibeta_derivative; // a, b, x
+        return ibeta_derivative(k+1, n-k+1, dist.success_fraction(), Policy()) / (n+1);
+
+      } // pdf
+
+      template <class RealType, class Policy>
+      inline RealType cdf(const binomial_distribution<RealType, Policy>& dist, const RealType& k)
+      { // Cumulative Distribution Function Binomial.
+        // The random variate k is the number of successes in n trials.
+        // k argument may be integral, signed, or unsigned, or floating point.
+        // If necessary, it has already been promoted from an integral type.
+
+        // Returns the sum of the terms 0 through k of the Binomial Probability Density/Mass:
+        //
+        //   i=k
+        //   --  ( n )   i      n-i
+        //   >   |   |  p  (1-p)
+        //   --  ( i )
+        //   i=0
+
+        // The terms are not summed directly instead
+        // the incomplete beta integral is employed,
+        // according to the formula:
+        // P = I[1-p]( n-k, k+1).
+        //   = 1 - I[p](k + 1, n - k)
+
+        BOOST_MATH_STD_USING // for ADL of std functions
+
+        RealType n = dist.trials();
+        RealType p = dist.success_fraction();
+
+        // Error check:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           "boost::math::cdf(binomial_distribution<%1%> const&, %1%)",
+           n,
+           p,
+           k,
+           &result, Policy()))
+        {
+           return result;
+        }
+        if (k == n)
+        {
+          return 1;
+        }
+
+        // Special cases, regardless of k.
+        if (p == 0)
+        {  // This need explanation:
+           // the pdf is zero for all cases except when k == 0.
+           // For zero p the probability of zero successes is one.
+           // Therefore the cdf is always 1:
+           // the probability of k or *fewer* successes is always 1
+           // if there are never any successes!
+           return 1;
+        }
+        if (p == 1)
+        { // This is correct but needs explanation:
+          // when k = 1
+          // all the cdf and pdf values are zero *except* when k == n,
+          // and that case has been handled above already.
+          return 0;
+        }
+        //
+        // P = I[1-p](n - k, k + 1)
+        //   = 1 - I[p](k + 1, n - k)
+        // Use of ibetac here prevents cancellation errors in calculating
+        // 1-p if p is very small, perhaps smaller than machine epsilon.
+        //
+        // Note that we do not use a finite sum here, since the incomplete
+        // beta uses a finite sum internally for integer arguments, so
+        // we'll just let it take care of the necessary logic.
+        //
+        return ibetac(k + 1, n - k, p, Policy());
+      } // binomial cdf
+
+      template <class RealType, class Policy>
+      inline RealType cdf(const complemented2_type<binomial_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function Binomial.
+        // The random variate k is the number of successes in n trials.
+        // k argument may be integral, signed, or unsigned, or floating point.
+        // If necessary, it has already been promoted from an integral type.
+
+        // Returns the sum of the terms k+1 through n of the Binomial Probability Density/Mass:
+        //
+        //   i=n
+        //   --  ( n )   i      n-i
+        //   >   |   |  p  (1-p)
+        //   --  ( i )
+        //   i=k+1
+
+        // The terms are not summed directly instead
+        // the incomplete beta integral is employed,
+        // according to the formula:
+        // Q = 1 -I[1-p]( n-k, k+1).
+        //   = I[p](k + 1, n - k)
+
+        BOOST_MATH_STD_USING // for ADL of std functions
+
+        RealType const& k = c.param;
+        binomial_distribution<RealType, Policy> const& dist = c.dist;
+        RealType n = dist.trials();
+        RealType p = dist.success_fraction();
+
+        // Error checks:
+        RealType result = 0;
+        if(false == binomial_detail::check_dist_and_k(
+           "boost::math::cdf(binomial_distribution<%1%> const&, %1%)",
+           n,
+           p,
+           k,
+           &result, Policy()))
+        {
+           return result;
+        }
+
+        if (k == n)
+        { // Probability of greater than n successes is necessarily zero:
+          return 0;
+        }
+
+        // Special cases, regardless of k.
+        if (p == 0)
+        {
+           // This need explanation: the pdf is zero for all
+           // cases except when k == 0.  For zero p the probability
+           // of zero successes is one.  Therefore the cdf is always
+           // 1: the probability of *more than* k successes is always 0
+           // if there are never any successes!
+           return 0;
+        }
+        if (p == 1)
+        {
+          // This needs explanation, when p = 1
+          // we always have n successes, so the probability
+          // of more than k successes is 1 as long as k < n.
+          // The k == n case has already been handled above.
+          return 1;
+        }
+        //
+        // Calculate cdf binomial using the incomplete beta function.
+        // Q = 1 -I[1-p](n - k, k + 1)
+        //   = I[p](k + 1, n - k)
+        // Use of ibeta here prevents cancellation errors in calculating
+        // 1-p if p is very small, perhaps smaller than machine epsilon.
+        //
+        // Note that we do not use a finite sum here, since the incomplete
+        // beta uses a finite sum internally for integer arguments, so
+        // we'll just let it take care of the necessary logic.
+        //
+        return ibeta(k + 1, n - k, p, Policy());
+      } // binomial cdf
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const binomial_distribution<RealType, Policy>& dist, const RealType& p)
+      {
+         return binomial_detail::quantile_imp(dist, p, RealType(1-p), false);
+      } // quantile
+
+      template <class RealType, class Policy>
+      RealType quantile(const complemented2_type<binomial_distribution<RealType, Policy>, RealType>& c)
+      {
+         return binomial_detail::quantile_imp(c.dist, RealType(1-c.param), c.param, true);
+      } // quantile
+
+      template <class RealType, class Policy>
+      inline RealType mode(const binomial_distribution<RealType, Policy>& dist)
+      {
+         BOOST_MATH_STD_USING // ADL of std functions.
+         RealType p = dist.success_fraction();
+         RealType n = dist.trials();
+         return floor(p * (n + 1));
+      }
+
+      template <class RealType, class Policy>
+      inline RealType median(const binomial_distribution<RealType, Policy>& dist)
+      { // Bounds for the median of the negative binomial distribution
+        // VAN DE VEN R. ; WEBER N. C. ;
+        // Univ. Sydney, school mathematics statistics, Sydney N.S.W. 2006, AUSTRALIE
+        // Metrika  (Metrika)  ISSN 0026-1335   CODEN MTRKA8
+        // 1993, vol. 40, no3-4, pp. 185-189 (4 ref.)
+
+        // Bounds for median and 50 percetage point of binomial and negative binomial distribution
+        // Metrika, ISSN   0026-1335 (Print) 1435-926X (Online)
+        // Volume 41, Number 1 / December, 1994, DOI   10.1007/BF01895303
+         BOOST_MATH_STD_USING // ADL of std functions.
+         RealType p = dist.success_fraction();
+         RealType n = dist.trials();
+         // Wikipedia says one of floor(np) -1, floor (np), floor(np) +1
+         return floor(p * n); // Chose the middle value.
+      }
+
+      template <class RealType, class Policy>
+      inline RealType skewness(const binomial_distribution<RealType, Policy>& dist)
+      {
+         BOOST_MATH_STD_USING // ADL of std functions.
+         RealType p = dist.success_fraction();
+         RealType n = dist.trials();
+         return (1 - 2 * p) / sqrt(n * p * (1 - p));
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis(const binomial_distribution<RealType, Policy>& dist)
+      {
+         RealType p = dist.success_fraction();
+         RealType n = dist.trials();
+         return 3 - 6 / n + 1 / (n * p * (1 - p));
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis_excess(const binomial_distribution<RealType, Policy>& dist)
+      {
+         RealType p = dist.success_fraction();
+         RealType q = 1 - p;
+         RealType n = dist.trials();
+         return (1 - 6 * p * q) / (n * p * q);
+      }
+
+    } // namespace math
+  } // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_BINOMIAL_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/cauchy.hpp b/gatb-core/thirdparty/boost/math/distributions/cauchy.hpp
new file mode 100644
index 0000000..5a3a64f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/cauchy.hpp
@@ -0,0 +1,362 @@
+// Copyright John Maddock 2006, 2007.
+// Copyright Paul A. Bristow 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_CAUCHY_HPP
+#define BOOST_STATS_CAUCHY_HPP
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4127) // conditional expression is constant
+#endif
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+
+template <class RealType, class Policy>
+class cauchy_distribution;
+
+namespace detail
+{
+
+template <class RealType, class Policy>
+RealType cdf_imp(const cauchy_distribution<RealType, Policy>& dist, const RealType& x, bool complement)
+{
+   //
+   // This calculates the cdf of the Cauchy distribution and/or its complement.
+   //
+   // The usual formula for the Cauchy cdf is:
+   //
+   // cdf = 0.5 + atan(x)/pi
+   //
+   // But that suffers from cancellation error as x -> -INF.
+   //
+   // Recall that for x < 0:
+   //
+   // atan(x) = -pi/2 - atan(1/x)
+   //
+   // Substituting into the above we get:
+   //
+   // CDF = -atan(1/x)  ; x < 0
+   //
+   // So the proceedure is to calculate the cdf for -fabs(x)
+   // using the above formula, and then subtract from 1 when required
+   // to get the result.
+   //
+   BOOST_MATH_STD_USING // for ADL of std functions
+   static const char* function = "boost::math::cdf(cauchy<%1%>&, %1%)";
+   RealType result = 0;
+   RealType location = dist.location();
+   RealType scale = dist.scale();
+   if(false == detail::check_location(function, location, &result, Policy()))
+   {
+     return result;
+   }
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+      return result;
+   }
+   if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+   { // cdf +infinity is unity.
+     return static_cast<RealType>((complement) ? 0 : 1);
+   }
+   if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+   { // cdf -infinity is zero.
+     return static_cast<RealType>((complement) ? 1 : 0);
+   }
+   if(false == detail::check_x(function, x, &result, Policy()))
+   { // Catches x == NaN
+      return result;
+   }
+   RealType mx = -fabs((x - location) / scale); // scale is > 0
+   if(mx > -tools::epsilon<RealType>() / 8)
+   {  // special case first: x extremely close to location.
+      return 0.5;
+   }
+   result = -atan(1 / mx) / constants::pi<RealType>();
+   return (((x > location) != complement) ? 1 - result : result);
+} // cdf
+
+template <class RealType, class Policy>
+RealType quantile_imp(
+      const cauchy_distribution<RealType, Policy>& dist,
+      const RealType& p,
+      bool complement)
+{
+   // This routine implements the quantile for the Cauchy distribution,
+   // the value p may be the probability, or its complement if complement=true.
+   //
+   // The procedure first performs argument reduction on p to avoid error
+   // when calculating the tangent, then calulates the distance from the
+   // mid-point of the distribution.  This is either added or subtracted
+   // from the location parameter depending on whether `complement` is true.
+   //
+   static const char* function = "boost::math::quantile(cauchy<%1%>&, %1%)";
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType result = 0;
+   RealType location = dist.location();
+   RealType scale = dist.scale();
+   if(false == detail::check_location(function, location, &result, Policy()))
+   {
+     return result;
+   }
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_probability(function, p, &result, Policy()))
+   {
+      return result;
+   }
+   // Special cases:
+   if(p == 1)
+   {
+      return (complement ? -1 : 1) * policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   if(p == 0)
+   {
+      return (complement ? 1 : -1) * policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+
+   RealType P = p - floor(p);   // argument reduction of p:
+   if(P > 0.5)
+   {
+      P = P - 1;
+   }
+   if(P == 0.5)   // special case:
+   {
+      return location;
+   }
+   result = -scale / tan(constants::pi<RealType>() * P);
+   return complement ? RealType(location - result) : RealType(location + result);
+} // quantile
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class cauchy_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   cauchy_distribution(RealType l_location = 0, RealType l_scale = 1)
+      : m_a(l_location), m_hg(l_scale)
+   {
+    static const char* function = "boost::math::cauchy_distribution<%1%>::cauchy_distribution";
+     RealType result;
+     detail::check_location(function, l_location, &result, Policy());
+     detail::check_scale(function, l_scale, &result, Policy());
+   } // cauchy_distribution
+
+   RealType location()const
+   {
+      return m_a;
+   }
+   RealType scale()const
+   {
+      return m_hg;
+   }
+
+private:
+   RealType m_a;    // The location, this is the median of the distribution.
+   RealType m_hg;   // The scale )or shape), this is the half width at half height.
+};
+
+typedef cauchy_distribution<double> cauchy;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const cauchy_distribution<RealType, Policy>&)
+{ // Range of permissible values for random variable x.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max.
+  }
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const cauchy_distribution<RealType, Policy>& )
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+     using boost::math::tools::max_value;
+     return std::pair<RealType, RealType>(-tools::max_value<RealType>(), max_value<RealType>()); // - to + max.
+  }
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const cauchy_distribution<RealType, Policy>& dist, const RealType& x)
+{  
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(cauchy<%1%>&, %1%)";
+   RealType result = 0;
+   RealType location = dist.location();
+   RealType scale = dist.scale();
+   if(false == detail::check_scale("boost::math::pdf(cauchy<%1%>&, %1%)", scale, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_location("boost::math::pdf(cauchy<%1%>&, %1%)", location, &result, Policy()))
+   {
+      return result;
+   }
+   if((boost::math::isinf)(x))
+   {
+     return 0; // pdf + and - infinity is zero.
+   }
+   // These produce MSVC 4127 warnings, so the above used instead.
+   //if(std::numeric_limits<RealType>::has_infinity && abs(x) == std::numeric_limits<RealType>::infinity())
+   //{ // pdf + and - infinity is zero.
+   //  return 0;
+   //}
+
+   if(false == detail::check_x(function, x, &result, Policy()))
+   { // Catches x = NaN
+      return result;
+   }
+
+   RealType xs = (x - location) / scale;
+   result = 1 / (constants::pi<RealType>() * scale * (1 + xs * xs));
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const cauchy_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   return detail::cdf_imp(dist, x, false);
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const cauchy_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   return detail::quantile_imp(dist, p, false);
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<cauchy_distribution<RealType, Policy>, RealType>& c)
+{
+   return detail::cdf_imp(c.dist, c.param, true);
+} //  cdf complement
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<cauchy_distribution<RealType, Policy>, RealType>& c)
+{
+   return detail::quantile_imp(c.dist, c.param, true);
+} // quantile complement
+
+template <class RealType, class Policy>
+inline RealType mean(const cauchy_distribution<RealType, Policy>&)
+{  // There is no mean:
+   typedef typename Policy::assert_undefined_type assert_type;
+   BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+   return policies::raise_domain_error<RealType>(
+      "boost::math::mean(cauchy<%1%>&)",
+      "The Cauchy distribution does not have a mean: "
+      "the only possible return value is %1%.",
+      std::numeric_limits<RealType>::quiet_NaN(), Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType variance(const cauchy_distribution<RealType, Policy>& /*dist*/)
+{
+   // There is no variance:
+   typedef typename Policy::assert_undefined_type assert_type;
+   BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+   return policies::raise_domain_error<RealType>(
+      "boost::math::variance(cauchy<%1%>&)",
+      "The Cauchy distribution does not have a variance: "
+      "the only possible return value is %1%.",
+      std::numeric_limits<RealType>::quiet_NaN(), Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const cauchy_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const cauchy_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+template <class RealType, class Policy>
+inline RealType skewness(const cauchy_distribution<RealType, Policy>& /*dist*/)
+{
+   // There is no skewness:
+   typedef typename Policy::assert_undefined_type assert_type;
+   BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+   return policies::raise_domain_error<RealType>(
+      "boost::math::skewness(cauchy<%1%>&)",
+      "The Cauchy distribution does not have a skewness: "
+      "the only possible return value is %1%.",
+      std::numeric_limits<RealType>::quiet_NaN(), Policy()); // infinity?
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const cauchy_distribution<RealType, Policy>& /*dist*/)
+{
+   // There is no kurtosis:
+   typedef typename Policy::assert_undefined_type assert_type;
+   BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+   return policies::raise_domain_error<RealType>(
+      "boost::math::kurtosis(cauchy<%1%>&)",
+      "The Cauchy distribution does not have a kurtosis: "
+      "the only possible return value is %1%.",
+      std::numeric_limits<RealType>::quiet_NaN(), Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const cauchy_distribution<RealType, Policy>& /*dist*/)
+{
+   // There is no kurtosis excess:
+   typedef typename Policy::assert_undefined_type assert_type;
+   BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+   return policies::raise_domain_error<RealType>(
+      "boost::math::kurtosis_excess(cauchy<%1%>&)",
+      "The Cauchy distribution does not have a kurtosis: "
+      "the only possible return value is %1%.",
+      std::numeric_limits<RealType>::quiet_NaN(), Policy());
+}
+
+} // namespace math
+} // namespace boost
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_CAUCHY_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/chi_squared.hpp b/gatb-core/thirdparty/boost/math/distributions/chi_squared.hpp
new file mode 100644
index 0000000..071c775
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/chi_squared.hpp
@@ -0,0 +1,364 @@
+// Copyright John Maddock 2006, 2007.
+// Copyright Paul A. Bristow 2008, 2010.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_CHI_SQUARED_HPP
+#define BOOST_MATH_DISTRIBUTIONS_CHI_SQUARED_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp> // for incomplete beta.
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class chi_squared_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   chi_squared_distribution(RealType i) : m_df(i)
+   {
+      RealType result;
+      detail::check_df(
+         "boost::math::chi_squared_distribution<%1%>::chi_squared_distribution", m_df, &result, Policy());
+   } // chi_squared_distribution
+
+   RealType degrees_of_freedom()const
+   {
+      return m_df;
+   }
+
+   // Parameter estimation:
+   static RealType find_degrees_of_freedom(
+      RealType difference_from_variance,
+      RealType alpha,
+      RealType beta,
+      RealType variance,
+      RealType hint = 100);
+
+private:
+   //
+   // Data member:
+   //
+   RealType m_df; // degrees of freedom is a positive real number.
+}; // class chi_squared_distribution
+
+typedef chi_squared_distribution<double> chi_squared;
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const chi_squared_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+    return std::pair<RealType, RealType>(static_cast<RealType>(0), std::numeric_limits<RealType>::infinity()); // 0 to + infinity.
+  }
+  else
+  {
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // 0 to + max.
+  }
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const chi_squared_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), tools::max_value<RealType>()); // 0 to + infinity.
+}
+
+template <class RealType, class Policy>
+RealType pdf(const chi_squared_distribution<RealType, Policy>& dist, const RealType& chi_square)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+   RealType degrees_of_freedom = dist.degrees_of_freedom();
+   // Error check:
+   RealType error_result;
+
+   static const char* function = "boost::math::pdf(const chi_squared_distribution<%1%>&, %1%)";
+
+   if(false == detail::check_df(
+         function, degrees_of_freedom, &error_result, Policy()))
+      return error_result;
+
+   if((chi_square < 0) || !(boost::math::isfinite)(chi_square))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Chi Square parameter was %1%, but must be > 0 !", chi_square, Policy());
+   }
+
+   if(chi_square == 0)
+   {
+      // Handle special cases:
+      if(degrees_of_freedom < 2)
+      {
+         return policies::raise_overflow_error<RealType>(
+            function, 0, Policy());
+      }
+      else if(degrees_of_freedom == 2)
+      {
+         return 0.5f;
+      }
+      else
+      {
+         return 0;
+      }
+   }
+
+   return gamma_p_derivative(degrees_of_freedom / 2, chi_square / 2, Policy()) / 2;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const chi_squared_distribution<RealType, Policy>& dist, const RealType& chi_square)
+{
+   RealType degrees_of_freedom = dist.degrees_of_freedom();
+   // Error check:
+   RealType error_result;
+   static const char* function = "boost::math::cdf(const chi_squared_distribution<%1%>&, %1%)";
+
+   if(false == detail::check_df(
+         function, degrees_of_freedom, &error_result, Policy()))
+      return error_result;
+
+   if((chi_square < 0) || !(boost::math::isfinite)(chi_square))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Chi Square parameter was %1%, but must be > 0 !", chi_square, Policy());
+   }
+
+   return boost::math::gamma_p(degrees_of_freedom / 2, chi_square / 2, Policy());
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const chi_squared_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   RealType degrees_of_freedom = dist.degrees_of_freedom();
+   static const char* function = "boost::math::quantile(const chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false ==
+     (
+       detail::check_df(function, degrees_of_freedom, &error_result, Policy())
+       && detail::check_probability(function, p, &error_result, Policy()))
+     )
+     return error_result;
+
+   return 2 * boost::math::gamma_p_inv(degrees_of_freedom / 2, p, Policy());
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<chi_squared_distribution<RealType, Policy>, RealType>& c)
+{
+   RealType const& degrees_of_freedom = c.dist.degrees_of_freedom();
+   RealType const& chi_square = c.param;
+   static const char* function = "boost::math::cdf(const chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false == detail::check_df(
+         function, degrees_of_freedom, &error_result, Policy()))
+      return error_result;
+
+   if((chi_square < 0) || !(boost::math::isfinite)(chi_square))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Chi Square parameter was %1%, but must be > 0 !", chi_square, Policy());
+   }
+
+   return boost::math::gamma_q(degrees_of_freedom / 2, chi_square / 2, Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<chi_squared_distribution<RealType, Policy>, RealType>& c)
+{
+   RealType const& degrees_of_freedom = c.dist.degrees_of_freedom();
+   RealType const& q = c.param;
+   static const char* function = "boost::math::quantile(const chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false == (
+     detail::check_df(function, degrees_of_freedom, &error_result, Policy())
+     && detail::check_probability(function, q, &error_result, Policy()))
+     )
+    return error_result;
+
+   return 2 * boost::math::gamma_q_inv(degrees_of_freedom / 2, q, Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const chi_squared_distribution<RealType, Policy>& dist)
+{ // Mean of Chi-Squared distribution = v.
+  return dist.degrees_of_freedom();
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const chi_squared_distribution<RealType, Policy>& dist)
+{ // Variance of Chi-Squared distribution = 2v.
+  return 2 * dist.degrees_of_freedom();
+} // variance
+
+template <class RealType, class Policy>
+inline RealType mode(const chi_squared_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   static const char* function = "boost::math::mode(const chi_squared_distribution<%1%>&)";
+   // Most sources only define mode for df >= 2,
+   // but for 0 <= df <= 2, the pdf maximum actually occurs at random variate = 0;
+   // So one could extend the definition of mode thus:
+   //if(df < 0)
+   //{
+   //   return policies::raise_domain_error<RealType>(
+   //      function,
+   //      "Chi-Squared distribution only has a mode for degrees of freedom >= 0, but got degrees of freedom = %1%.",
+   //      df, Policy());
+   //}
+   //return (df <= 2) ? 0 : df - 2;
+
+   if(df < 2)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "Chi-Squared distribution only has a mode for degrees of freedom >= 2, but got degrees of freedom = %1%.",
+         df, Policy());
+   return df - 2;
+}
+
+//template <class RealType, class Policy>
+//inline RealType median(const chi_squared_distribution<RealType, Policy>& dist)
+//{ // Median is given by Quantile[dist, 1/2]
+//   RealType df = dist.degrees_of_freedom();
+//   if(df <= 1)
+//      return tools::domain_error<RealType>(
+//         BOOST_CURRENT_FUNCTION,
+//         "The Chi-Squared distribution only has a mode for degrees of freedom >= 2, but got degrees of freedom = %1%.",
+//         df);
+//   return df - RealType(2)/3;
+//}
+// Now implemented via quantile(half) in derived accessors.
+
+template <class RealType, class Policy>
+inline RealType skewness(const chi_squared_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING // For ADL
+   RealType df = dist.degrees_of_freedom();
+   return sqrt (8 / df);  // == 2 * sqrt(2 / df);
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const chi_squared_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   return 3 + 12 / df;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const chi_squared_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   return 12 / df;
+}
+
+//
+// Parameter estimation comes last:
+//
+namespace detail
+{
+
+template <class RealType, class Policy>
+struct df_estimator
+{
+   df_estimator(RealType a, RealType b, RealType variance, RealType delta)
+      : alpha(a), beta(b), ratio(delta/variance)
+   { // Constructor
+   }
+
+   RealType operator()(const RealType& df)
+   {
+      if(df <= tools::min_value<RealType>())
+         return 1;
+      chi_squared_distribution<RealType, Policy> cs(df);
+
+      RealType result;
+      if(ratio > 0)
+      {
+         RealType r = 1 + ratio;
+         result = cdf(cs, quantile(complement(cs, alpha)) / r) - beta;
+      }
+      else
+      { // ratio <= 0
+         RealType r = 1 + ratio;
+         result = cdf(complement(cs, quantile(cs, alpha) / r)) - beta;
+      }
+      return result;
+   }
+private:
+   RealType alpha;
+   RealType beta;
+   RealType ratio; // Difference from variance / variance, so fractional.
+};
+
+} // namespace detail
+
+template <class RealType, class Policy>
+RealType chi_squared_distribution<RealType, Policy>::find_degrees_of_freedom(
+   RealType difference_from_variance,
+   RealType alpha,
+   RealType beta,
+   RealType variance,
+   RealType hint)
+{
+   static const char* function = "boost::math::chi_squared_distribution<%1%>::find_degrees_of_freedom(%1%,%1%,%1%,%1%,%1%)";
+   // Check for domain errors:
+   RealType error_result;
+   if(false ==
+     detail::check_probability(function, alpha, &error_result, Policy())
+     && detail::check_probability(function, beta, &error_result, Policy()))
+   { // Either probability is outside 0 to 1.
+      return error_result;
+   }
+
+   if(hint <= 0)
+   { // No hint given, so guess df = 1.
+      hint = 1;
+   }
+
+   detail::df_estimator<RealType, Policy> f(alpha, beta, variance, difference_from_variance);
+   tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   std::pair<RealType, RealType> r =
+     tools::bracket_and_solve_root(f, hint, RealType(2), false, tol, max_iter, Policy());
+   RealType result = r.first + (r.second - r.first) / 2;
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+   {
+      policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+         " either there is no answer to how many degrees of freedom are required"
+         " or the answer is infinite.  Current best guess is %1%", result, Policy());
+   }
+   return result;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_CHI_SQUARED_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/complement.hpp b/gatb-core/thirdparty/boost/math/distributions/complement.hpp
new file mode 100644
index 0000000..26d0d49
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/complement.hpp
@@ -0,0 +1,195 @@
+//  (C) Copyright John Maddock 2006.
+//  (C) Copyright Paul A. Bristow 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_COMPLEMENT_HPP
+#define BOOST_STATS_COMPLEMENT_HPP
+
+//
+// This code really defines our own tuple type.
+// It would be nice to reuse boost::math::tuple
+// while retaining our own type safety, but it's
+// not clear if that's possible.  In any case this
+// code is *very* lightweight.
+//
+namespace boost{ namespace math{
+
+template <class Dist, class RealType>
+struct complemented2_type
+{
+   complemented2_type(
+      const Dist& d, 
+      const RealType& p1)
+      : dist(d), 
+        param(p1) {}
+
+   const Dist& dist;
+   const RealType& param;
+
+private:
+   complemented2_type& operator=(const complemented2_type&);
+};
+
+template <class Dist, class RealType1, class RealType2>
+struct complemented3_type
+{
+   complemented3_type(
+      const Dist& d, 
+      const RealType1& p1,
+      const RealType2& p2)
+      : dist(d), 
+        param1(p1), 
+        param2(p2) {}
+
+   const Dist& dist;
+   const RealType1& param1;
+   const RealType2& param2;
+private:
+   complemented3_type& operator=(const complemented3_type&);
+};
+
+template <class Dist, class RealType1, class RealType2, class RealType3>
+struct complemented4_type
+{
+   complemented4_type(
+      const Dist& d, 
+      const RealType1& p1,
+      const RealType2& p2,
+      const RealType3& p3)
+      : dist(d), 
+        param1(p1), 
+        param2(p2), 
+        param3(p3) {}
+
+   const Dist& dist;
+   const RealType1& param1;
+   const RealType2& param2;
+   const RealType3& param3;
+private:
+   complemented4_type& operator=(const complemented4_type&);
+};
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
+struct complemented5_type
+{
+   complemented5_type(
+      const Dist& d, 
+      const RealType1& p1,
+      const RealType2& p2,
+      const RealType3& p3,
+      const RealType4& p4)
+      : dist(d), 
+        param1(p1), 
+        param2(p2), 
+        param3(p3), 
+        param4(p4) {}
+
+   const Dist& dist;
+   const RealType1& param1;
+   const RealType2& param2;
+   const RealType3& param3;
+   const RealType4& param4;
+private:
+   complemented5_type& operator=(const complemented5_type&);
+};
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
+struct complemented6_type
+{
+   complemented6_type(
+      const Dist& d, 
+      const RealType1& p1,
+      const RealType2& p2,
+      const RealType3& p3,
+      const RealType4& p4,
+      const RealType5& p5)
+      : dist(d), 
+        param1(p1), 
+        param2(p2), 
+        param3(p3), 
+        param4(p4), 
+        param5(p5) {}
+
+   const Dist& dist;
+   const RealType1& param1;
+   const RealType2& param2;
+   const RealType3& param3;
+   const RealType4& param4;
+   const RealType5& param5;
+private:
+   complemented6_type& operator=(const complemented6_type&);
+};
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
+struct complemented7_type
+{
+   complemented7_type(
+      const Dist& d, 
+      const RealType1& p1,
+      const RealType2& p2,
+      const RealType3& p3,
+      const RealType4& p4,
+      const RealType5& p5,
+      const RealType6& p6)
+      : dist(d), 
+        param1(p1), 
+        param2(p2), 
+        param3(p3), 
+        param4(p4), 
+        param5(p5), 
+        param6(p6) {}
+
+   const Dist& dist;
+   const RealType1& param1;
+   const RealType2& param2;
+   const RealType3& param3;
+   const RealType4& param4;
+   const RealType5& param5;
+   const RealType6& param6;
+private:
+   complemented7_type& operator=(const complemented7_type&);
+};
+
+template <class Dist, class RealType>
+inline complemented2_type<Dist, RealType> complement(const Dist& d, const RealType& r)
+{
+   return complemented2_type<Dist, RealType>(d, r);
+}
+
+template <class Dist, class RealType1, class RealType2>
+inline complemented3_type<Dist, RealType1, RealType2> complement(const Dist& d, const RealType1& r1, const RealType2& r2)
+{
+   return complemented3_type<Dist, RealType1, RealType2>(d, r1, r2);
+}
+
+template <class Dist, class RealType1, class RealType2, class RealType3>
+inline complemented4_type<Dist, RealType1, RealType2, RealType3> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3)
+{
+   return complemented4_type<Dist, RealType1, RealType2, RealType3>(d, r1, r2, r3);
+}
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
+inline complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4)
+{
+   return complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4>(d, r1, r2, r3, r4);
+}
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
+inline complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5)
+{
+   return complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5>(d, r1, r2, r3, r4, r5);
+}
+
+template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
+inline complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5, const RealType6& r6)
+{
+   return complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6>(d, r1, r2, r3, r4, r5, r6);
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_STATS_COMPLEMENT_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/common_error_handling.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/common_error_handling.hpp
new file mode 100644
index 0000000..71a771e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/common_error_handling.hpp
@@ -0,0 +1,194 @@
+// Copyright John Maddock 2006, 2007.
+// Copyright Paul A. Bristow 2006, 2007, 2012.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP
+#define BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+// using boost::math::isfinite;
+// using boost::math::isnan;
+
+namespace boost{ namespace math{ namespace detail
+{
+
+template <class RealType, class Policy>
+inline bool check_probability(const char* function, RealType const& prob, RealType* result, const Policy& pol)
+{
+   if((prob < 0) || (prob > 1) || !(boost::math::isfinite)(prob))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Probability argument is %1%, but must be >= 0 and <= 1 !", prob, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_df(const char* function, RealType const& df, RealType* result, const Policy& pol)
+{ //  df > 0 but NOT +infinity allowed.
+   if((df <= 0) || !(boost::math::isfinite)(df))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Degrees of freedom argument is %1%, but must be > 0 !", df, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_df_gt0_to_inf(const char* function, RealType const& df, RealType* result, const Policy& pol)
+{  // df > 0 or +infinity are allowed.
+   if( (df <= 0) || (boost::math::isnan)(df) )
+   { // is bad df <= 0 or NaN or -infinity.
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Degrees of freedom argument is %1%, but must be > 0 !", df, pol);
+      return false;
+   }
+   return true;
+} // check_df_gt0_to_inf
+
+
+template <class RealType, class Policy>
+inline bool check_scale(
+      const char* function,
+      RealType scale,
+      RealType* result,
+      const Policy& pol)
+{
+   if((scale <= 0) || !(boost::math::isfinite)(scale))
+   { // Assume scale == 0 is NOT valid for any distribution.
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Scale parameter is %1%, but must be > 0 !", scale, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_location(
+      const char* function,
+      RealType location,
+      RealType* result,
+      const Policy& pol)
+{
+   if(!(boost::math::isfinite)(location))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Location parameter is %1%, but must be finite!", location, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_x(
+      const char* function,
+      RealType x,
+      RealType* result,
+      const Policy& pol)
+{
+   // Note that this test catches both infinity and NaN.
+   // Some distributions permit x to be infinite, so these must be tested 1st and return,
+   // leaving this test to catch any NaNs.
+   // See Normal, Logistic, Laplace and Cauchy for example.
+   if(!(boost::math::isfinite)(x))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate x is %1%, but must be finite!", x, pol);
+      return false;
+   }
+   return true;
+} // bool check_x
+
+template <class RealType, class Policy>
+inline bool check_x_gt0(
+      const char* function,
+      RealType x,
+      RealType* result,
+      const Policy& pol)
+{
+   if(x <= 0)
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate x is %1%, but must be > 0!", x, pol);
+      return false;
+   }
+
+   return true;
+   // Note that this test catches both infinity and NaN.
+   // Some special cases permit x to be infinite, so these must be tested 1st,
+   // leaving this test to catch any NaNs.  See Normal and cauchy for example.
+} // bool check_x_gt0
+
+template <class RealType, class Policy>
+inline bool check_positive_x(
+      const char* function,
+      RealType x,
+      RealType* result,
+      const Policy& pol)
+{
+   if(!(boost::math::isfinite)(x) || (x < 0))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate x is %1%, but must be finite and >= 0!", x, pol);
+      return false;
+   }
+   return true;
+   // Note that this test catches both infinity and NaN.
+   // Some special cases permit x to be infinite, so these must be tested 1st,
+   // leaving this test to catch any NaNs.  see Normal and cauchy for example.
+}
+
+template <class RealType, class Policy>
+inline bool check_non_centrality(
+      const char* function,
+      RealType ncp,
+      RealType* result,
+      const Policy& pol)
+{
+   if((ncp < 0) || !(boost::math::isfinite)(ncp))
+   { // Assume scale == 0 is NOT valid for any distribution.
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Non centrality parameter is %1%, but must be > 0 !", ncp, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_finite(
+      const char* function,
+      RealType x,
+      RealType* result,
+      const Policy& pol)
+{
+   if(!(boost::math::isfinite)(x))
+   { // Assume scale == 0 is NOT valid for any distribution.
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Parameter is %1%, but must be finite !", x, pol);
+      return false;
+   }
+   return true;
+}
+
+} // namespace detail
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/derived_accessors.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/derived_accessors.hpp
new file mode 100644
index 0000000..00f5a93
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/derived_accessors.hpp
@@ -0,0 +1,163 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_DERIVED_HPP
+#define BOOST_STATS_DERIVED_HPP
+
+// This file implements various common properties of distributions
+// that can be implemented in terms of other properties:
+// variance OR standard deviation (see note below),
+// hazard, cumulative hazard (chf), coefficient_of_variation.
+//
+// Note that while both variance and standard_deviation are provided
+// here, each distribution MUST SPECIALIZE AT LEAST ONE OF THESE
+// otherwise these two versions will just call each other over and over
+// until stack space runs out ...
+
+// Of course there may be more efficient means of implementing these
+// that are specific to a particular distribution, but these generic
+// versions give these properties "for free" with most distributions.
+//
+// In order to make use of this header, it must be included AT THE END
+// of the distribution header, AFTER the distribution and its core
+// property accessors have been defined: this is so that compilers
+// that implement 2-phase lookup and early-type-checking of templates
+// can find the definitions refered to herein.
+//
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/static_assert.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4723) // potential divide by 0
+// Suppressing spurious warning in coefficient_of_variation
+#endif
+
+namespace boost{ namespace math{
+
+template <class Distribution>
+typename Distribution::value_type variance(const Distribution& dist);
+
+template <class Distribution>
+inline typename Distribution::value_type standard_deviation(const Distribution& dist)
+{
+   BOOST_MATH_STD_USING  // ADL of sqrt.
+   return sqrt(variance(dist));
+}
+
+template <class Distribution>
+inline typename Distribution::value_type variance(const Distribution& dist)
+{
+   typename Distribution::value_type result = standard_deviation(dist);
+   return result * result;
+}
+
+template <class Distribution, class RealType>
+inline typename Distribution::value_type hazard(const Distribution& dist, const RealType& x)
+{ // hazard function
+  // http://www.itl.nist.gov/div898/handbook/eda/section3/eda362.htm#HAZ
+   typedef typename Distribution::value_type value_type;
+   typedef typename Distribution::policy_type policy_type;
+   value_type p = cdf(complement(dist, x));
+   value_type d = pdf(dist, x);
+   if(d > p * tools::max_value<value_type>())
+      return policies::raise_overflow_error<value_type>(
+      "boost::math::hazard(const Distribution&, %1%)", 0, policy_type());
+   if(d == 0)
+   {
+      // This protects against 0/0, but is it the right thing to do?
+      return 0;
+   }
+   return d / p;
+}
+
+template <class Distribution, class RealType>
+inline typename Distribution::value_type chf(const Distribution& dist, const RealType& x)
+{ // cumulative hazard function.
+  // http://www.itl.nist.gov/div898/handbook/eda/section3/eda362.htm#HAZ
+   BOOST_MATH_STD_USING
+   return -log(cdf(complement(dist, x)));
+}
+
+template <class Distribution>
+inline typename Distribution::value_type coefficient_of_variation(const Distribution& dist)
+{
+   typedef typename Distribution::value_type value_type;
+   typedef typename Distribution::policy_type policy_type;
+
+   using std::abs;
+
+   value_type m = mean(dist);
+   value_type d = standard_deviation(dist);
+   if((abs(m) < 1) && (d > abs(m) * tools::max_value<value_type>()))
+   { // Checks too that m is not zero,
+      return policies::raise_overflow_error<value_type>("boost::math::coefficient_of_variation(const Distribution&, %1%)", 0, policy_type());
+   }
+   return d / m; // so MSVC warning on zerodivide is spurious, and suppressed.
+}
+//
+// Next follow overloads of some of the standard accessors with mixed
+// argument types. We just use a typecast to forward on to the "real"
+// implementation with all arguments of the same type:
+//
+template <class Distribution, class RealType>
+inline typename Distribution::value_type pdf(const Distribution& dist, const RealType& x)
+{
+   typedef typename Distribution::value_type value_type;
+   return pdf(dist, static_cast<value_type>(x));
+}
+template <class Distribution, class RealType>
+inline typename Distribution::value_type cdf(const Distribution& dist, const RealType& x)
+{
+   typedef typename Distribution::value_type value_type;
+   return cdf(dist, static_cast<value_type>(x));
+}
+template <class Distribution, class RealType>
+inline typename Distribution::value_type quantile(const Distribution& dist, const RealType& x)
+{
+   typedef typename Distribution::value_type value_type;
+   return quantile(dist, static_cast<value_type>(x));
+}
+/*
+template <class Distribution, class RealType>
+inline typename Distribution::value_type chf(const Distribution& dist, const RealType& x)
+{
+   typedef typename Distribution::value_type value_type;
+   return chf(dist, static_cast<value_type>(x));
+}
+*/
+template <class Distribution, class RealType>
+inline typename Distribution::value_type cdf(const complemented2_type<Distribution, RealType>& c)
+{
+   typedef typename Distribution::value_type value_type;
+   return cdf(complement(c.dist, static_cast<value_type>(c.param)));
+}
+
+template <class Distribution, class RealType>
+inline typename Distribution::value_type quantile(const complemented2_type<Distribution, RealType>& c)
+{
+   typedef typename Distribution::value_type value_type;
+   return quantile(complement(c.dist, static_cast<value_type>(c.param)));
+}
+
+template <class Dist>
+inline typename Dist::value_type median(const Dist& d)
+{ // median - default definition for those distributions for which a
+  // simple closed form is not known,
+  // and for which a domain_error and/or NaN generating function is NOT defined.
+  typedef typename Dist::value_type value_type;
+  return quantile(d, static_cast<value_type>(0.5f));
+}
+
+} // namespace math
+} // namespace boost
+
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_STATS_DERIVED_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/generic_mode.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/generic_mode.hpp
new file mode 100644
index 0000000..3857c9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/generic_mode.hpp
@@ -0,0 +1,149 @@
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_MODE_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_MODE_HPP
+
+#include <boost/math/tools/minima.hpp> // function minimization for mode
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/distributions/fwd.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class Dist>
+struct pdf_minimizer
+{
+   pdf_minimizer(const Dist& d)
+      : dist(d) {}
+
+   typename Dist::value_type operator()(const typename Dist::value_type& x)
+   {
+      return -pdf(dist, x);
+   }
+private:
+   Dist dist;
+};
+
+template <class Dist>
+typename Dist::value_type generic_find_mode(const Dist& dist, typename Dist::value_type guess, const char* function, typename Dist::value_type step = 0)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+   //
+   // Need to begin by bracketing the maxima of the PDF:
+   //
+   value_type maxval;
+   value_type upper_bound = guess;
+   value_type lower_bound;
+   value_type v = pdf(dist, guess);
+   if(v == 0)
+   {
+      //
+      // Oops we don't know how to handle this, or even in which
+      // direction we should move in, treat as an evaluation error:
+      //
+      return policies::raise_evaluation_error(
+         function, 
+         "Could not locate a starting location for the search for the mode, original guess was %1%", guess, policy_type());
+   }
+   do
+   {
+      maxval = v;
+      if(step != 0)
+         upper_bound += step;
+      else
+         upper_bound *= 2;
+      v = pdf(dist, upper_bound);
+   }while(maxval < v);
+
+   lower_bound = upper_bound;
+   do
+   {
+      maxval = v;
+      if(step != 0)
+         lower_bound -= step;
+      else
+         lower_bound /= 2;
+      v = pdf(dist, lower_bound);
+   }while(maxval < v);
+
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<policy_type>();
+
+   value_type result = tools::brent_find_minima(
+      pdf_minimizer<Dist>(dist), 
+      lower_bound, 
+      upper_bound, 
+      policies::digits<value_type, policy_type>(), 
+      max_iter).first;
+   if(max_iter >= policies::get_max_root_iterations<policy_type>())
+   {
+      return policies::raise_evaluation_error<value_type>(
+         function, 
+         "Unable to locate solution in a reasonable time:"
+         " either there is no answer to the mode of the distribution"
+         " or the answer is infinite.  Current best guess is %1%", result, policy_type());
+   }
+   return result;
+}
+//
+// As above,but confined to the interval [0,1]:
+//
+template <class Dist>
+typename Dist::value_type generic_find_mode_01(const Dist& dist, typename Dist::value_type guess, const char* function)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+   //
+   // Need to begin by bracketing the maxima of the PDF:
+   //
+   value_type maxval;
+   value_type upper_bound = guess;
+   value_type lower_bound;
+   value_type v = pdf(dist, guess);
+   do
+   {
+      maxval = v;
+      upper_bound = 1 - (1 - upper_bound) / 2;
+      if(upper_bound == 1)
+         return 1;
+      v = pdf(dist, upper_bound);
+   }while(maxval < v);
+
+   lower_bound = upper_bound;
+   do
+   {
+      maxval = v;
+      lower_bound /= 2;
+      if(lower_bound < tools::min_value<value_type>())
+         return 0;
+      v = pdf(dist, lower_bound);
+   }while(maxval < v);
+
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<policy_type>();
+
+   value_type result = tools::brent_find_minima(
+      pdf_minimizer<Dist>(dist), 
+      lower_bound, 
+      upper_bound, 
+      policies::digits<value_type, policy_type>(), 
+      max_iter).first;
+   if(max_iter >= policies::get_max_root_iterations<policy_type>())
+   {
+      return policies::raise_evaluation_error<value_type>(
+         function, 
+         "Unable to locate solution in a reasonable time:"
+         " either there is no answer to the mode of the distribution"
+         " or the answer is infinite.  Current best guess is %1%", result, policy_type());
+   }
+   return result;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_DISTRIBUTIONS_DETAIL_MODE_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/generic_quantile.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/generic_quantile.hpp
new file mode 100644
index 0000000..afde2ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/generic_quantile.hpp
@@ -0,0 +1,91 @@
+//  Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTIBUTIONS_DETAIL_GENERIC_QUANTILE_HPP
+#define BOOST_MATH_DISTIBUTIONS_DETAIL_GENERIC_QUANTILE_HPP
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class Dist>
+struct generic_quantile_finder
+{
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+
+   generic_quantile_finder(const Dist& d, value_type t, bool c)
+      : dist(d), target(t), comp(c) {}
+
+   value_type operator()(const value_type& x)
+   {
+      return comp ?
+         value_type(target - cdf(complement(dist, x)))
+         : value_type(cdf(dist, x) - target);
+   }
+
+private:
+   Dist dist;
+   value_type target;
+   bool comp;
+};
+
+template <class T, class Policy>
+inline T check_range_result(const T& x, const Policy& pol, const char* function)
+{
+   if((x >= 0) && (x < tools::min_value<T>()))
+      return policies::raise_underflow_error<T>(function, 0, pol);
+   if(x <= -tools::max_value<T>())
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+   if(x >= tools::max_value<T>())
+      return policies::raise_overflow_error<T>(function, 0, pol);
+   return x;
+}
+
+template <class Dist>
+typename Dist::value_type generic_quantile(const Dist& dist, const typename Dist::value_type& p, const typename Dist::value_type& guess, bool comp, const char* function)
+{
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+   typedef typename policies::normalise<
+      policy_type, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   //
+   // Special cases first:
+   //
+   if(p == 0)
+   {
+      return comp
+      ? check_range_result(range(dist).second, forwarding_policy(), function)
+      : check_range_result(range(dist).first, forwarding_policy(), function);
+   }
+   if(p == 1)
+   {
+      return !comp
+      ? check_range_result(range(dist).second, forwarding_policy(), function)
+      : check_range_result(range(dist).first, forwarding_policy(), function);
+   }
+
+   generic_quantile_finder<Dist> f(dist, p, comp);
+   tools::eps_tolerance<value_type> tol(policies::digits<value_type, forwarding_policy>() - 3);
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<forwarding_policy>();
+   std::pair<value_type, value_type> ir = tools::bracket_and_solve_root(
+      f, guess, value_type(2), true, tol, max_iter, forwarding_policy());
+   value_type result = ir.first + (ir.second - ir.first) / 2;
+   if(max_iter >= policies::get_max_root_iterations<forwarding_policy>())
+   {
+      return policies::raise_evaluation_error<value_type>(function, "Unable to locate solution in a reasonable time:"
+         " either there is no answer to quantile"
+         " or the answer is infinite.  Current best guess is %1%", result, forwarding_policy());
+   }
+   return result;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_DISTIBUTIONS_DETAIL_GENERIC_QUANTILE_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_cdf.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_cdf.hpp
new file mode 100644
index 0000000..638cab6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_cdf.hpp
@@ -0,0 +1,100 @@
+// Copyright 2008 John Maddock
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+   template <class T, class Policy>
+   T hypergeometric_cdf_imp(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy& pol)
+   {
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+      BOOST_MATH_STD_USING
+      T result = 0;
+      T mode = floor(T(r + 1) * T(n + 1) / (N + 2));
+      if(x < mode)
+      {
+         result = hypergeometric_pdf<T>(x, r, n, N, pol);
+         T diff = result;
+         unsigned lower_limit = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+         while(diff > (invert ? T(1) : result) * tools::epsilon<T>())
+         {
+            diff = T(x) * T((N + x) - n - r) * diff / (T(1 + n - x) * T(1 + r - x));
+            result += diff;
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            if(x == lower_limit)
+               break;
+            --x;
+         }
+      }
+      else
+      {
+         invert = !invert;
+         unsigned upper_limit = (std::min)(r, n);
+         if(x != upper_limit)
+         {
+            ++x;
+            result = hypergeometric_pdf<T>(x, r, n, N, pol);
+            T diff = result;
+            while((x <= upper_limit) && (diff > (invert ? T(1) : result) * tools::epsilon<T>()))
+            {
+               diff = T(n - x) * T(r - x) * diff / (T(x + 1) * T((N + x + 1) - n - r));
+               result += diff;
+               ++x;
+               BOOST_MATH_INSTRUMENT_VARIABLE(x);
+               BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            }
+         }
+      }
+      if(invert)
+         result = 1 - result;
+      return result;
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+   }
+
+   template <class T, class Policy>
+   inline T hypergeometric_cdf(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy&)
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      typedef typename tools::promote_args<T>::type result_type;
+      typedef typename policies::evaluation<result_type, Policy>::type value_type;
+      typedef typename policies::normalise<
+         Policy, 
+         policies::promote_float<false>, 
+         policies::promote_double<false>, 
+         policies::discrete_quantile<>,
+         policies::assert_undefined<> >::type forwarding_policy;
+
+      value_type result;
+      result = detail::hypergeometric_cdf_imp<value_type>(x, r, n, N, invert, forwarding_policy());
+      if(result > 1)
+      {
+         result  = 1;
+      }
+      if(result < 0)
+      {
+         result = 0;
+      }
+      return policies::checked_narrowing_cast<result_type, forwarding_policy>(result, "boost::math::hypergeometric_cdf<%1%>(%1%,%1%,%1%,%1%)");
+   }
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_pdf.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_pdf.hpp
new file mode 100644
index 0000000..1e6a5ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_pdf.hpp
@@ -0,0 +1,488 @@
+// Copyright 2008 Gautam Sewani
+// Copyright 2008 John Maddock
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_PDF_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_PDF_HPP
+
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/lanczos.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/pow.hpp>
+#include <boost/math/special_functions/prime.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+#ifdef BOOST_MATH_INSTRUMENT
+#include <typeinfo>
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Func>
+void bubble_down_one(T* first, T* last, Func f)
+{
+   using std::swap;
+   T* next = first;
+   ++next;
+   while((next != last) && (!f(*first, *next)))
+   {
+      swap(*first, *next);
+      ++first;
+      ++next;
+   }
+}
+
+template <class T>
+struct sort_functor
+{
+   sort_functor(const T* exponents) : m_exponents(exponents){}
+   bool operator()(int i, int j)
+   {
+      return m_exponents[i] > m_exponents[j];
+   }
+private:
+   const T* m_exponents;
+};
+
+template <class T, class Lanczos, class Policy>
+T hypergeometric_pdf_lanczos_imp(T /*dummy*/, unsigned x, unsigned r, unsigned n, unsigned N, const Lanczos&, const Policy&)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_FPU
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(r);
+   BOOST_MATH_INSTRUMENT_VARIABLE(n);
+   BOOST_MATH_INSTRUMENT_VARIABLE(N);
+   BOOST_MATH_INSTRUMENT_VARIABLE(typeid(Lanczos).name());
+
+   T bases[9] = {
+      T(n) + static_cast<T>(Lanczos::g()) + 0.5f,
+      T(r) + static_cast<T>(Lanczos::g()) + 0.5f,
+      T(N - n) + static_cast<T>(Lanczos::g()) + 0.5f,
+      T(N - r) + static_cast<T>(Lanczos::g()) + 0.5f,
+      1 / (T(N) + static_cast<T>(Lanczos::g()) + 0.5f),
+      1 / (T(x) + static_cast<T>(Lanczos::g()) + 0.5f),
+      1 / (T(n - x) + static_cast<T>(Lanczos::g()) + 0.5f),
+      1 / (T(r - x) + static_cast<T>(Lanczos::g()) + 0.5f),
+      1 / (T(N - n - r + x) + static_cast<T>(Lanczos::g()) + 0.5f)
+   };
+   T exponents[9] = {
+      n + T(0.5f),
+      r + T(0.5f),
+      N - n + T(0.5f),
+      N - r + T(0.5f),
+      N + T(0.5f),
+      x + T(0.5f),
+      n - x + T(0.5f),
+      r - x + T(0.5f),
+      N - n - r + x + T(0.5f)
+   };
+   int base_e_factors[9] = {
+      -1, -1, -1, -1, 1, 1, 1, 1, 1
+   };
+   int sorted_indexes[9] = {
+      0, 1, 2, 3, 4, 5, 6, 7, 8
+   };
+#ifdef BOOST_MATH_INSTRUMENT
+   BOOST_MATH_INSTRUMENT_FPU
+   for(unsigned i = 0; i < 9; ++i)
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(i);
+      BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+   }
+#endif
+   std::sort(sorted_indexes, sorted_indexes + 9, sort_functor<T>(exponents));
+#ifdef BOOST_MATH_INSTRUMENT
+   BOOST_MATH_INSTRUMENT_FPU
+   for(unsigned i = 0; i < 9; ++i)
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(i);
+      BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+   }
+#endif
+
+   do{
+      exponents[sorted_indexes[0]] -= exponents[sorted_indexes[1]];
+      bases[sorted_indexes[1]] *= bases[sorted_indexes[0]];
+      if((bases[sorted_indexes[1]] < tools::min_value<T>()) && (exponents[sorted_indexes[1]] != 0))
+      {
+         return 0;
+      }
+      base_e_factors[sorted_indexes[1]] += base_e_factors[sorted_indexes[0]];
+      bubble_down_one(sorted_indexes, sorted_indexes + 9, sort_functor<T>(exponents));
+
+#ifdef BOOST_MATH_INSTRUMENT
+      for(unsigned i = 0; i < 9; ++i)
+      {
+         BOOST_MATH_INSTRUMENT_VARIABLE(i);
+         BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+      }
+#endif
+   }while(exponents[sorted_indexes[1]] > 1);
+
+   //
+   // Combine equal powers:
+   //
+   int j = 8;
+   while(exponents[sorted_indexes[j]] == 0) --j;
+   while(j)
+   {
+      while(j && (exponents[sorted_indexes[j-1]] == exponents[sorted_indexes[j]]))
+      {
+         bases[sorted_indexes[j-1]] *= bases[sorted_indexes[j]];
+         exponents[sorted_indexes[j]] = 0;
+         base_e_factors[sorted_indexes[j-1]] += base_e_factors[sorted_indexes[j]];
+         bubble_down_one(sorted_indexes + j, sorted_indexes + 9, sort_functor<T>(exponents));
+         --j;
+      }
+      --j;
+
+#ifdef BOOST_MATH_INSTRUMENT
+      BOOST_MATH_INSTRUMENT_VARIABLE(j);
+      for(unsigned i = 0; i < 9; ++i)
+      {
+         BOOST_MATH_INSTRUMENT_VARIABLE(i);
+         BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+      }
+#endif
+   }
+
+#ifdef BOOST_MATH_INSTRUMENT
+   BOOST_MATH_INSTRUMENT_FPU
+   for(unsigned i = 0; i < 9; ++i)
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(i);
+      BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+   }
+#endif
+
+   T result;
+   BOOST_MATH_INSTRUMENT_VARIABLE(bases[sorted_indexes[0]] * exp(static_cast<T>(base_e_factors[sorted_indexes[0]])));
+   BOOST_MATH_INSTRUMENT_VARIABLE(exponents[sorted_indexes[0]]);
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      result = pow(bases[sorted_indexes[0]] * exp(static_cast<T>(base_e_factors[sorted_indexes[0]])), exponents[sorted_indexes[0]]);
+   }
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   for(unsigned i = 1; (i < 9) && (exponents[sorted_indexes[i]] > 0); ++i)
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      if(result < tools::min_value<T>())
+         return 0; // short circuit further evaluation
+      if(exponents[sorted_indexes[i]] == 1)
+         result *= bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]]));
+      else if(exponents[sorted_indexes[i]] == 0.5f)
+         result *= sqrt(bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]])));
+      else
+         result *= pow(bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]])), exponents[sorted_indexes[i]]);
+   
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   }
+
+   result *= Lanczos::lanczos_sum_expG_scaled(static_cast<T>(n + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(r + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - n + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - r + 1))
+      / 
+      ( Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(n - x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(r - x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - n - r + x + 1)));
+   
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   return result;
+}
+
+template <class T, class Policy>
+T hypergeometric_pdf_lanczos_imp(T /*dummy*/, unsigned x, unsigned r, unsigned n, unsigned N, const boost::math::lanczos::undefined_lanczos&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   return exp(
+      boost::math::lgamma(T(n + 1), pol)
+      + boost::math::lgamma(T(r + 1), pol)
+      + boost::math::lgamma(T(N - n + 1), pol)
+      + boost::math::lgamma(T(N - r + 1), pol)
+      - boost::math::lgamma(T(N + 1), pol)
+      - boost::math::lgamma(T(x + 1), pol)
+      - boost::math::lgamma(T(n - x + 1), pol)
+      - boost::math::lgamma(T(r - x + 1), pol)
+      - boost::math::lgamma(T(N - n - r + x + 1), pol));
+}
+
+template <class T>
+inline T integer_power(const T& x, int ex)
+{
+   if(ex < 0)
+      return 1 / integer_power(x, -ex);
+   switch(ex)
+   {
+   case 0:
+      return 1;
+   case 1:
+      return x;
+   case 2:
+      return x * x;
+   case 3:
+      return x * x * x;
+   case 4:
+      return boost::math::pow<4>(x);
+   case 5:
+      return boost::math::pow<5>(x);
+   case 6:
+      return boost::math::pow<6>(x);
+   case 7:
+      return boost::math::pow<7>(x);
+   case 8:
+      return boost::math::pow<8>(x);
+   }
+   BOOST_MATH_STD_USING
+#ifdef __SUNPRO_CC
+   return pow(x, T(ex));
+#else
+   return pow(x, ex);
+#endif
+}
+template <class T>
+struct hypergeometric_pdf_prime_loop_result_entry
+{
+   T value;
+   const hypergeometric_pdf_prime_loop_result_entry* next;
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4510 4512 4610)
+#endif
+
+struct hypergeometric_pdf_prime_loop_data
+{
+   const unsigned x;
+   const unsigned r;
+   const unsigned n;
+   const unsigned N;
+   unsigned prime_index;
+   unsigned current_prime;
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class T>
+T hypergeometric_pdf_prime_loop_imp(hypergeometric_pdf_prime_loop_data& data, hypergeometric_pdf_prime_loop_result_entry<T>& result)
+{
+   while(data.current_prime <= data.N)
+   {
+      unsigned base = data.current_prime;
+      int prime_powers = 0;
+      while(base <= data.N)
+      {
+         prime_powers += data.n / base;
+         prime_powers += data.r / base;
+         prime_powers += (data.N - data.n) / base;
+         prime_powers += (data.N - data.r) / base;
+         prime_powers -= data.N / base;
+         prime_powers -= data.x / base;
+         prime_powers -= (data.n - data.x) / base;
+         prime_powers -= (data.r - data.x) / base;
+         prime_powers -= (data.N - data.n - data.r + data.x) / base;
+         base *= data.current_prime;
+      }
+      if(prime_powers)
+      {
+         T p = integer_power<T>(data.current_prime, prime_powers);
+         if((p > 1) && (tools::max_value<T>() / p < result.value))
+         {
+            //
+            // The next calculation would overflow, use recursion
+            // to sidestep the issue:
+            //
+            hypergeometric_pdf_prime_loop_result_entry<T> t = { p, &result };
+            data.current_prime = prime(++data.prime_index);
+            return hypergeometric_pdf_prime_loop_imp<T>(data, t);
+         }
+         if((p < 1) && (tools::min_value<T>() / p > result.value))
+         {
+            //
+            // The next calculation would underflow, use recursion
+            // to sidestep the issue:
+            //
+            hypergeometric_pdf_prime_loop_result_entry<T> t = { p, &result };
+            data.current_prime = prime(++data.prime_index);
+            return hypergeometric_pdf_prime_loop_imp<T>(data, t);
+         }
+         result.value *= p;
+      }
+      data.current_prime = prime(++data.prime_index);
+   }
+   //
+   // When we get to here we have run out of prime factors,
+   // the overall result is the product of all the partial
+   // results we have accumulated on the stack so far, these
+   // are in a linked list starting with "data.head" and ending
+   // with "result".
+   //
+   // All that remains is to multiply them together, taking
+   // care not to overflow or underflow.
+   //
+   // Enumerate partial results >= 1 in variable i
+   // and partial results < 1 in variable j:
+   //
+   hypergeometric_pdf_prime_loop_result_entry<T> const *i, *j;
+   i = &result;
+   while(i && i->value < 1)
+      i = i->next;
+   j = &result;
+   while(j && j->value >= 1)
+      j = j->next;
+
+   T prod = 1;
+
+   while(i || j)
+   {
+      while(i && ((prod <= 1) || (j == 0)))
+      {
+         prod *= i->value;
+         i = i->next;
+         while(i && i->value < 1)
+            i = i->next;
+      }
+      while(j && ((prod >= 1) || (i == 0)))
+      {
+         prod *= j->value;
+         j = j->next;
+         while(j && j->value >= 1)
+            j = j->next;
+      }
+   }
+
+   return prod;
+}
+
+template <class T, class Policy>
+inline T hypergeometric_pdf_prime_imp(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   hypergeometric_pdf_prime_loop_result_entry<T> result = { 1, 0 };
+   hypergeometric_pdf_prime_loop_data data = { x, r, n, N, 0, prime(0) };
+   return hypergeometric_pdf_prime_loop_imp<T>(data, result);
+}
+
+template <class T, class Policy>
+T hypergeometric_pdf_factorial_imp(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_MATH_STD_USING
+   BOOST_ASSERT(N <= boost::math::max_factorial<T>::value);
+   T result = boost::math::unchecked_factorial<T>(n);
+   T num[3] = {
+      boost::math::unchecked_factorial<T>(r),
+      boost::math::unchecked_factorial<T>(N - n),
+      boost::math::unchecked_factorial<T>(N - r)
+   };
+   T denom[5] = {
+      boost::math::unchecked_factorial<T>(N),
+      boost::math::unchecked_factorial<T>(x),
+      boost::math::unchecked_factorial<T>(n - x),
+      boost::math::unchecked_factorial<T>(r - x),
+      boost::math::unchecked_factorial<T>(N - n - r + x)
+   };
+   int i = 0;
+   int j = 0;
+   while((i < 3) || (j < 5))
+   {
+      while((j < 5) && ((result >= 1) || (i >= 3)))
+      {
+         result /= denom[j];
+         ++j;
+      }
+      while((i < 3) && ((result <= 1) || (j >= 5)))
+      {
+         result *= num[i];
+         ++i;
+      }
+   }
+   return result;
+}
+
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   hypergeometric_pdf(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   value_type result;
+   if(N <= boost::math::max_factorial<value_type>::value)
+   {
+      //
+      // If N is small enough then we can evaluate the PDF via the factorials
+      // directly: table lookup of the factorials gives the best performance
+      // of the methods available:
+      //
+      result = detail::hypergeometric_pdf_factorial_imp<value_type>(x, r, n, N, forwarding_policy());
+   }
+   else if(N <= boost::math::prime(boost::math::max_prime - 1))
+   {
+      //
+      // If N is no larger than the largest prime number in our lookup table
+      // (104729) then we can use prime factorisation to evaluate the PDF,
+      // this is slow but accurate:
+      //
+      result = detail::hypergeometric_pdf_prime_imp<value_type>(x, r, n, N, forwarding_policy());
+   }
+   else
+   {
+      //
+      // Catch all case - use the lanczos approximation - where available - 
+      // to evaluate the ratio of factorials.  This is reasonably fast
+      // (almost as quick as using logarithmic evaluation in terms of lgamma)
+      // but only a few digits better in accuracy than using lgamma:
+      //
+      result = detail::hypergeometric_pdf_lanczos_imp(value_type(), x, r, n, N, evaluation_type(), forwarding_policy());
+   }
+
+   if(result > 1)
+   {
+      result = 1;
+   }
+   if(result < 0)
+   {
+      result = 0;
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(result, "boost::math::hypergeometric_pdf<%1%>(%1%,%1%,%1%,%1%)");
+}
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_quantile.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_quantile.hpp
new file mode 100644
index 0000000..a855a4a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/hypergeometric_quantile.hpp
@@ -0,0 +1,199 @@
+// Copyright 2008 John Maddock
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_QUANTILE_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_QUANTILE_HPP
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_down>&)
+{
+   if((p < cum * fudge_factor) && (x != lbound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x-1);
+      return --x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned /*lbound*/, unsigned ubound, const policies::discrete_quantile<policies::integer_round_up>&)
+{
+   if((cum < p * fudge_factor) && (x != ubound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x+1);
+      return ++x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_inwards>&)
+{
+   if(p >= 0.5)
+      return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_outwards>&)
+{
+   if(p >= 0.5)
+      return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+   return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T /*p*/, T /*cum*/, T /*fudge_factor*/, unsigned /*lbound*/, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_nearest>&)
+{
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_down>&)
+{
+   if((q * fudge_factor > cum) && (x != lbound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x-1);
+      return --x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned /*lbound*/, unsigned ubound, const policies::discrete_quantile<policies::integer_round_up>&)
+{
+   if((q < cum * fudge_factor) && (x != ubound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x+1);
+      return ++x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_inwards>&)
+{
+   if(q < 0.5)
+      return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_outwards>&)
+{
+   if(q >= 0.5)
+      return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T /*q*/, T /*cum*/, T /*fudge_factor*/, unsigned /*lbound*/, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_nearest>&)
+{
+   return x;
+}
+
+template <class T, class Policy>
+unsigned hypergeometric_quantile_imp(T p, T q, unsigned r, unsigned n, unsigned N, const Policy& pol)
+{
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+   typedef typename Policy::discrete_quantile_type discrete_quantile_type;
+   BOOST_MATH_STD_USING
+   BOOST_FPU_EXCEPTION_GUARD
+   T result;
+   T fudge_factor = 1 + tools::epsilon<T>() * ((N <= boost::math::prime(boost::math::max_prime - 1)) ? 50 : 2 * N);
+   unsigned base = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+   unsigned lim = (std::min)(r, n);
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(p);
+   BOOST_MATH_INSTRUMENT_VARIABLE(q);
+   BOOST_MATH_INSTRUMENT_VARIABLE(r);
+   BOOST_MATH_INSTRUMENT_VARIABLE(n);
+   BOOST_MATH_INSTRUMENT_VARIABLE(N);
+   BOOST_MATH_INSTRUMENT_VARIABLE(fudge_factor);
+   BOOST_MATH_INSTRUMENT_VARIABLE(base);
+   BOOST_MATH_INSTRUMENT_VARIABLE(lim);
+
+   if(p <= 0.5)
+   {
+      unsigned x = base;
+      result = hypergeometric_pdf<T>(x, r, n, N, pol);
+      T diff = result;
+      while(result < p)
+      {
+         diff = (diff > tools::min_value<T>() * 8) 
+            ? T(n - x) * T(r - x) * diff / (T(x + 1) * T(N + x + 1 - n - r))
+            : hypergeometric_pdf<T>(x + 1, r, n, N, pol);
+         if(result + diff / 2 > p)
+            break;
+         ++x;
+         result += diff;
+#ifdef BOOST_MATH_INSTRUMENT
+         if(diff != 0)
+         {
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+#endif
+      }
+      return round_x_from_p(x, p, result, fudge_factor, base, lim, discrete_quantile_type());
+   }
+   else
+   {
+      unsigned x = lim;
+      result = 0;
+      T diff = hypergeometric_pdf<T>(x, r, n, N, pol);
+      while(result + diff / 2 < q)
+      {
+         result += diff;
+         diff = (diff > tools::min_value<T>() * 8)
+            ? x * T(N + x - n - r) * diff / (T(1 + n - x) * T(1 + r - x))
+            : hypergeometric_pdf<T>(x - 1, r, n, N, pol);
+         --x;
+#ifdef BOOST_MATH_INSTRUMENT
+         if(diff != 0)
+         {
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+#endif
+      }
+      return round_x_from_q(x, q, result, fudge_factor, base, lim, discrete_quantile_type());
+   }
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+}
+
+template <class T, class Policy>
+inline unsigned hypergeometric_quantile(T p, T q, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return detail::hypergeometric_quantile_imp<value_type>(p, q, r, n, N, forwarding_policy());
+}
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/detail/inv_discrete_quantile.hpp b/gatb-core/thirdparty/boost/math/distributions/detail/inv_discrete_quantile.hpp
new file mode 100644
index 0000000..23e00b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/detail/inv_discrete_quantile.hpp
@@ -0,0 +1,571 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_INV_DISCRETE_QUANTILE
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_INV_DISCRETE_QUANTILE
+
+#include <algorithm>
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// Functor for root finding algorithm:
+//
+template <class Dist>
+struct distribution_quantile_finder
+{
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+
+   distribution_quantile_finder(const Dist d, value_type p, bool c)
+      : dist(d), target(p), comp(c) {}
+
+   value_type operator()(value_type const& x)
+   {
+      return comp ? value_type(target - cdf(complement(dist, x))) : value_type(cdf(dist, x) - target);
+   }
+
+private:
+   Dist dist;
+   value_type target;
+   bool comp;
+};
+//
+// The purpose of adjust_bounds, is to toggle the last bit of the
+// range so that both ends round to the same integer, if possible.
+// If they do both round the same then we terminate the search
+// for the root *very* quickly when finding an integer result.
+// At the point that this function is called we know that "a" is
+// below the root and "b" above it, so this change can not result
+// in the root no longer being bracketed.
+//
+template <class Real, class Tol>
+void adjust_bounds(Real& /* a */, Real& /* b */, Tol const& /* tol */){}
+
+template <class Real>
+void adjust_bounds(Real& /* a */, Real& b, tools::equal_floor const& /* tol */)
+{
+   BOOST_MATH_STD_USING
+   b -= tools::epsilon<Real>() * b;
+}
+
+template <class Real>
+void adjust_bounds(Real& a, Real& /* b */, tools::equal_ceil const& /* tol */)
+{
+   BOOST_MATH_STD_USING
+   a += tools::epsilon<Real>() * a;
+}
+
+template <class Real>
+void adjust_bounds(Real& a, Real& b, tools::equal_nearest_integer const& /* tol */)
+{
+   BOOST_MATH_STD_USING
+   a += tools::epsilon<Real>() * a;
+   b -= tools::epsilon<Real>() * b;
+}
+//
+// This is where all the work is done:
+//
+template <class Dist, class Tolerance>
+typename Dist::value_type 
+   do_inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool comp,
+      typename Dist::value_type guess,
+      const typename Dist::value_type& multiplier,
+      typename Dist::value_type adder,
+      const Tolerance& tol,
+      boost::uintmax_t& max_iter)
+{
+   typedef typename Dist::value_type value_type;
+   typedef typename Dist::policy_type policy_type;
+
+   static const char* function = "boost::math::do_inverse_discrete_quantile<%1%>";
+
+   BOOST_MATH_STD_USING
+
+   distribution_quantile_finder<Dist> f(dist, p, comp);
+   //
+   // Max bounds of the distribution:
+   //
+   value_type min_bound, max_bound;
+   boost::math::tie(min_bound, max_bound) = support(dist);
+
+   if(guess > max_bound)
+      guess = max_bound;
+   if(guess < min_bound)
+      guess = min_bound;
+
+   value_type fa = f(guess);
+   boost::uintmax_t count = max_iter - 1;
+   value_type fb(fa), a(guess), b =0; // Compiler warning C4701: potentially uninitialized local variable 'b' used
+
+   if(fa == 0)
+      return guess;
+
+   //
+   // For small expected results, just use a linear search:
+   //
+   if(guess < 10)
+   {
+      b = a;
+      while((a < 10) && (fa * fb >= 0))
+      {
+         if(fb <= 0)
+         {
+            a = b;
+            b = a + 1;
+            if(b > max_bound)
+               b = max_bound;
+            fb = f(b);
+            --count;
+            if(fb == 0)
+               return b;
+            if(a == b)
+               return b; // can't go any higher!
+         }
+         else
+         {
+            b = a;
+            a = (std::max)(value_type(b - 1), value_type(0));
+            if(a < min_bound)
+               a = min_bound;
+            fa = f(a);
+            --count;
+            if(fa == 0)
+               return a;
+            if(a == b)
+               return a;  //  We can't go any lower than this!
+         }
+      }
+   }
+   //
+   // Try and bracket using a couple of additions first, 
+   // we're assuming that "guess" is likely to be accurate
+   // to the nearest int or so:
+   //
+   else if(adder != 0)
+   {
+      //
+      // If we're looking for a large result, then bump "adder" up
+      // by a bit to increase our chances of bracketing the root:
+      //
+      //adder = (std::max)(adder, 0.001f * guess);
+      if(fa < 0)
+      {
+         b = a + adder;
+         if(b > max_bound)
+            b = max_bound;
+      }
+      else
+      {
+         b = (std::max)(value_type(a - adder), value_type(0));
+         if(b < min_bound)
+            b = min_bound;
+      }
+      fb = f(b);
+      --count;
+      if(fb == 0)
+         return b;
+      if(count && (fa * fb >= 0))
+      {
+         //
+         // We didn't bracket the root, try 
+         // once more:
+         //
+         a = b;
+         fa = fb;
+         if(fa < 0)
+         {
+            b = a + adder;
+            if(b > max_bound)
+               b = max_bound;
+         }
+         else
+         {
+            b = (std::max)(value_type(a - adder), value_type(0));
+            if(b < min_bound)
+               b = min_bound;
+         }
+         fb = f(b);
+         --count;
+      }
+      if(a > b)
+      {
+         using std::swap;
+         swap(a, b);
+         swap(fa, fb);
+      }
+   }
+   //
+   // If the root hasn't been bracketed yet, try again
+   // using the multiplier this time:
+   //
+   if((boost::math::sign)(fb) == (boost::math::sign)(fa))
+   {
+      if(fa < 0)
+      {
+         //
+         // Zero is to the right of x2, so walk upwards
+         // until we find it:
+         //
+         while(((boost::math::sign)(fb) == (boost::math::sign)(fa)) && (a != b))
+         {
+            if(count == 0)
+               return policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", b, policy_type());
+            a = b;
+            fa = fb;
+            b *= multiplier;
+            if(b > max_bound)
+               b = max_bound;
+            fb = f(b);
+            --count;
+            BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+         }
+      }
+      else
+      {
+         //
+         // Zero is to the left of a, so walk downwards
+         // until we find it:
+         //
+         while(((boost::math::sign)(fb) == (boost::math::sign)(fa)) && (a != b))
+         {
+            if(fabs(a) < tools::min_value<value_type>())
+            {
+               // Escape route just in case the answer is zero!
+               max_iter -= count;
+               max_iter += 1;
+               return 0;
+            }
+            if(count == 0)
+               return policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", a, policy_type());
+            b = a;
+            fb = fa;
+            a /= multiplier;
+            if(a < min_bound)
+               a = min_bound;
+            fa = f(a);
+            --count;
+            BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+         }
+      }
+   }
+   max_iter -= count;
+   if(fa == 0)
+      return a;
+   if(fb == 0)
+      return b;
+   if(a == b)
+      return b;  // Ran out of bounds trying to bracket - there is no answer!
+   //
+   // Adjust bounds so that if we're looking for an integer
+   // result, then both ends round the same way:
+   //
+   adjust_bounds(a, b, tol);
+   //
+   // We don't want zero or denorm lower bounds:
+   //
+   if(a < tools::min_value<value_type>())
+      a = tools::min_value<value_type>();
+   //
+   // Go ahead and find the root:
+   //
+   std::pair<value_type, value_type> r = toms748_solve(f, a, b, fa, fb, tol, count, policy_type());
+   max_iter += count;
+   BOOST_MATH_INSTRUMENT_CODE("max_iter = " << max_iter << " count = " << count);
+   return (r.first + r.second) / 2;
+}
+//
+// Some special routine for rounding up and down:
+// We want to check and see if we are very close to an integer, and if so test to see if
+// that integer is an exact root of the cdf.  We do this because our root finder only
+// guarantees to find *a root*, and there can sometimes be many consecutive floating
+// point values which are all roots.  This is especially true if the target probability
+// is very close 1.
+//
+template <class Dist>
+inline typename Dist::value_type round_to_floor(const Dist& d, typename Dist::value_type result, typename Dist::value_type p, bool c)
+{
+   BOOST_MATH_STD_USING
+   typename Dist::value_type cc = ceil(result);
+   typename Dist::value_type pp = cc <= support(d).second ? c ? cdf(complement(d, cc)) : cdf(d, cc) : 1;
+   if(pp == p)
+      result = cc;
+   else
+      result = floor(result);
+   //
+   // Now find the smallest integer <= result for which we get an exact root:
+   //
+   while(result != 0)
+   {
+      cc = result - 1;
+      if(cc < support(d).first)
+         break;
+      pp = c ? cdf(complement(d, cc)) : cdf(d, cc);
+      if(pp == p)
+         result = cc;
+      else if(c ? pp > p : pp < p)
+         break;
+      result -= 1;
+   }
+
+   return result;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
+template <class Dist>
+inline typename Dist::value_type round_to_ceil(const Dist& d, typename Dist::value_type result, typename Dist::value_type p, bool c)
+{
+   BOOST_MATH_STD_USING
+   typename Dist::value_type cc = floor(result);
+   typename Dist::value_type pp = cc >= support(d).first ? c ? cdf(complement(d, cc)) : cdf(d, cc) : 0;
+   if(pp == p)
+      result = cc;
+   else
+      result = ceil(result);
+   //
+   // Now find the largest integer >= result for which we get an exact root:
+   //
+   while(true)
+   {
+      cc = result + 1;
+      if(cc > support(d).second)
+         break;
+      pp = c ? cdf(complement(d, cc)) : cdf(d, cc);
+      if(pp == p)
+         result = cc;
+      else if(c ? pp < p : pp > p)
+         break;
+      result += 1;
+   }
+
+   return result;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+//
+// Now finally are the public API functions.
+// There is one overload for each policy,
+// each one is responsible for selecting the correct
+// termination condition, and rounding the result
+// to an int where required.
+//
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      typename Dist::value_type p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::real>&,
+      boost::uintmax_t& max_iter)
+{
+   if(p > 0.5)
+   {
+      p = 1 - p;
+      c = !c;
+   }
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   return do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      guess, 
+      multiplier, 
+      adder, 
+      tools::eps_tolerance<typename Dist::value_type>(policies::digits<typename Dist::value_type, typename Dist::policy_type>()),
+      max_iter);
+}
+
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::integer_round_outwards>&,
+      boost::uintmax_t& max_iter)
+{
+   typedef typename Dist::value_type value_type;
+   BOOST_MATH_STD_USING
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   //
+   // What happens next depends on whether we're looking for an 
+   // upper or lower quantile:
+   //
+   if(pp < 0.5f)
+      return round_to_floor(dist, do_inverse_discrete_quantile(
+         dist, 
+         p, 
+         c,
+         (guess < 1 ? value_type(1) : (value_type)floor(guess)), 
+         multiplier, 
+         adder, 
+         tools::equal_floor(),
+         max_iter), p, c);
+   // else:
+   return round_to_ceil(dist, do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      (value_type)ceil(guess), 
+      multiplier, 
+      adder, 
+      tools::equal_ceil(),
+      max_iter), p, c);
+}
+
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::integer_round_inwards>&,
+      boost::uintmax_t& max_iter)
+{
+   typedef typename Dist::value_type value_type;
+   BOOST_MATH_STD_USING
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   //
+   // What happens next depends on whether we're looking for an 
+   // upper or lower quantile:
+   //
+   if(pp < 0.5f)
+      return round_to_ceil(dist, do_inverse_discrete_quantile(
+         dist, 
+         p, 
+         c,
+         ceil(guess), 
+         multiplier, 
+         adder, 
+         tools::equal_ceil(),
+         max_iter), p, c);
+   // else:
+   return round_to_floor(dist, do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      (guess < 1 ? value_type(1) : floor(guess)), 
+      multiplier, 
+      adder, 
+      tools::equal_floor(),
+      max_iter), p, c);
+}
+
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::integer_round_down>&,
+      boost::uintmax_t& max_iter)
+{
+   typedef typename Dist::value_type value_type;
+   BOOST_MATH_STD_USING
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   return round_to_floor(dist, do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      (guess < 1 ? value_type(1) : floor(guess)), 
+      multiplier, 
+      adder, 
+      tools::equal_floor(),
+      max_iter), p, c);
+}
+
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::integer_round_up>&,
+      boost::uintmax_t& max_iter)
+{
+   BOOST_MATH_STD_USING
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   return round_to_ceil(dist, do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      ceil(guess), 
+      multiplier, 
+      adder, 
+      tools::equal_ceil(),
+      max_iter), p, c);
+}
+
+template <class Dist>
+inline typename Dist::value_type 
+   inverse_discrete_quantile(
+      const Dist& dist,
+      const typename Dist::value_type& p,
+      bool c,
+      const typename Dist::value_type& guess,
+      const typename Dist::value_type& multiplier,
+      const typename Dist::value_type& adder,
+      const policies::discrete_quantile<policies::integer_round_nearest>&,
+      boost::uintmax_t& max_iter)
+{
+   typedef typename Dist::value_type value_type;
+   BOOST_MATH_STD_USING
+   typename Dist::value_type pp = c ? 1 - p : p;
+   if(pp <= pdf(dist, 0))
+      return 0;
+   //
+   // Note that we adjust the guess to the nearest half-integer:
+   // this increase the chances that we will bracket the root
+   // with two results that both round to the same integer quickly.
+   //
+   return round_to_floor(dist, do_inverse_discrete_quantile(
+      dist, 
+      p, 
+      c,
+      (guess < 0.5f ? value_type(1.5f) : floor(guess + 0.5f) + 0.5f), 
+      multiplier, 
+      adder, 
+      tools::equal_nearest_integer(),
+      max_iter) + 0.5f, p, c);
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_DISTRIBUTIONS_DETAIL_INV_DISCRETE_QUANTILE
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/exponential.hpp b/gatb-core/thirdparty/boost/math/distributions/exponential.hpp
new file mode 100644
index 0000000..bfe7e6b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/exponential.hpp
@@ -0,0 +1,275 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_EXPONENTIAL_HPP
+#define BOOST_STATS_EXPONENTIAL_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4702) // unreachable code (return after domain_error throw).
+#endif
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+namespace detail{
+//
+// Error check:
+//
+template <class RealType, class Policy>
+inline bool verify_lambda(const char* function, RealType l, RealType* presult, const Policy& pol)
+{
+   if((l <= 0) || !(boost::math::isfinite)(l))
+   {
+      *presult = policies::raise_domain_error<RealType>(
+         function,
+         "The scale parameter \"lambda\" must be > 0, but was: %1%.", l, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool verify_exp_x(const char* function, RealType x, RealType* presult, const Policy& pol)
+{
+   if((x < 0) || (boost::math::isnan)(x))
+   {
+      *presult = policies::raise_domain_error<RealType>(
+         function,
+         "The random variable must be >= 0, but was: %1%.", x, pol);
+      return false;
+   }
+   return true;
+}
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class exponential_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   exponential_distribution(RealType l_lambda = 1)
+      : m_lambda(l_lambda)
+   {
+      RealType err;
+      detail::verify_lambda("boost::math::exponential_distribution<%1%>::exponential_distribution", l_lambda, &err, Policy());
+   } // exponential_distribution
+
+   RealType lambda()const { return m_lambda; }
+
+private:
+   RealType m_lambda;
+};
+
+typedef exponential_distribution<double> exponential;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const exponential_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+    return std::pair<RealType, RealType>(static_cast<RealType>(0), std::numeric_limits<RealType>::infinity()); // 0 to + infinity.
+  }
+  else
+  {
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // 0 to + max
+  }
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const exponential_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   using boost::math::tools::min_value;
+   return std::pair<RealType, RealType>(min_value<RealType>(),  max_value<RealType>());
+   // min_value<RealType>() to avoid a discontinuity at x = 0.
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const exponential_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(const exponential_distribution<%1%>&, %1%)";
+
+   RealType lambda = dist.lambda();
+   RealType result = 0;
+   if(0 == detail::verify_lambda(function, lambda, &result, Policy()))
+      return result;
+   if(0 == detail::verify_exp_x(function, x, &result, Policy()))
+      return result;
+   // Workaround for VC11/12 bug:
+   if ((boost::math::isinf)(x))
+	   return 0;
+   result = lambda * exp(-lambda * x);
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const exponential_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const exponential_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   RealType lambda = dist.lambda();
+   if(0 == detail::verify_lambda(function, lambda, &result, Policy()))
+      return result;
+   if(0 == detail::verify_exp_x(function, x, &result, Policy()))
+      return result;
+   result = -boost::math::expm1(-x * lambda, Policy());
+
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const exponential_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const exponential_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   RealType lambda = dist.lambda();
+   if(0 == detail::verify_lambda(function, lambda, &result, Policy()))
+      return result;
+   if(0 == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 0)
+      return 0;
+   if(p == 1)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = -boost::math::log1p(-p, Policy()) / lambda;
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<exponential_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const exponential_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   RealType lambda = c.dist.lambda();
+   if(0 == detail::verify_lambda(function, lambda, &result, Policy()))
+      return result;
+   if(0 == detail::verify_exp_x(function, c.param, &result, Policy()))
+      return result;
+   // Workaround for VC11/12 bug:
+   if (c.param >= tools::max_value<RealType>())
+	   return 0;
+   result = exp(-c.param * lambda);
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<exponential_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const exponential_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   RealType lambda = c.dist.lambda();
+   if(0 == detail::verify_lambda(function, lambda, &result, Policy()))
+      return result;
+
+   RealType q = c.param;
+   if(0 == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   if(q == 1)
+      return 0;
+   if(q == 0)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = -log(q) / lambda;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const exponential_distribution<RealType, Policy>& dist)
+{
+   RealType result = 0;
+   RealType lambda = dist.lambda();
+   if(0 == detail::verify_lambda("boost::math::mean(const exponential_distribution<%1%>&)", lambda, &result, Policy()))
+      return result;
+   return 1 / lambda;
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const exponential_distribution<RealType, Policy>& dist)
+{
+   RealType result = 0;
+   RealType lambda = dist.lambda();
+   if(0 == detail::verify_lambda("boost::math::standard_deviation(const exponential_distribution<%1%>&)", lambda, &result, Policy()))
+      return result;
+   return 1 / lambda;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const exponential_distribution<RealType, Policy>& /*dist*/)
+{
+   return 0;
+}
+
+template <class RealType, class Policy>
+inline RealType median(const exponential_distribution<RealType, Policy>& dist)
+{
+   using boost::math::constants::ln_two;
+   return ln_two<RealType>() / dist.lambda(); // ln(2) / lambda
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const exponential_distribution<RealType, Policy>& /*dist*/)
+{
+   return 2;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const exponential_distribution<RealType, Policy>& /*dist*/)
+{
+   return 9;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const exponential_distribution<RealType, Policy>& /*dist*/)
+{
+   return 6;
+}
+
+} // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_EXPONENTIAL_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/extreme_value.hpp b/gatb-core/thirdparty/boost/math/distributions/extreme_value.hpp
new file mode 100644
index 0000000..4c6b710
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/extreme_value.hpp
@@ -0,0 +1,300 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_EXTREME_VALUE_HPP
+#define BOOST_STATS_EXTREME_VALUE_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+//
+// This is the maximum extreme value distribution, see
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda366g.htm
+// and http://mathworld.wolfram.com/ExtremeValueDistribution.html
+// Also known as a Fisher-Tippett distribution, a log-Weibull
+// distribution or a Gumbel distribution.
+
+#include <utility>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4702) // unreachable code (return after domain_error throw).
+#endif
+
+namespace boost{ namespace math{
+
+namespace detail{
+//
+// Error check:
+//
+template <class RealType, class Policy>
+inline bool verify_scale_b(const char* function, RealType b, RealType* presult, const Policy& pol)
+{
+   if((b <= 0) || !(boost::math::isfinite)(b))
+   {
+      *presult = policies::raise_domain_error<RealType>(
+         function,
+         "The scale parameter \"b\" must be finite and > 0, but was: %1%.", b, pol);
+      return false;
+   }
+   return true;
+}
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class extreme_value_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   extreme_value_distribution(RealType a = 0, RealType b = 1)
+      : m_a(a), m_b(b)
+   {
+      RealType err;
+      detail::verify_scale_b("boost::math::extreme_value_distribution<%1%>::extreme_value_distribution", b, &err, Policy());
+      detail::check_finite("boost::math::extreme_value_distribution<%1%>::extreme_value_distribution", a, &err, Policy());
+   } // extreme_value_distribution
+
+   RealType location()const { return m_a; }
+   RealType scale()const { return m_b; }
+
+private:
+   RealType m_a, m_b;
+};
+
+typedef extreme_value_distribution<double> extreme_value;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const extreme_value_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(
+      std::numeric_limits<RealType>::has_infinity ? -std::numeric_limits<RealType>::infinity() : -max_value<RealType>(), 
+      std::numeric_limits<RealType>::has_infinity ? std::numeric_limits<RealType>::infinity() : max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const extreme_value_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const extreme_value_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(const extreme_value_distribution<%1%>&, %1%)";
+
+   RealType a = dist.location();
+   RealType b = dist.scale();
+   RealType result = 0;
+   if((boost::math::isinf)(x))
+      return 0.0f;
+   if(0 == detail::verify_scale_b(function, b, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_x(function, x, &result, Policy()))
+      return result;
+   RealType e = (a - x) / b;
+   if(e < tools::log_max_value<RealType>())
+      result = exp(e) * exp(-exp(e)) / b;
+   // else.... result *must* be zero since exp(e) is infinite...
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const extreme_value_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const extreme_value_distribution<%1%>&, %1%)";
+
+   if((boost::math::isinf)(x))
+      return x < 0 ? 0.0f : 1.0f;
+   RealType a = dist.location();
+   RealType b = dist.scale();
+   RealType result = 0;
+   if(0 == detail::verify_scale_b(function, b, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_x("boost::math::cdf(const extreme_value_distribution<%1%>&, %1%)", x, &result, Policy()))
+      return result;
+
+   result = exp(-exp((a-x)/b));
+
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+RealType quantile(const extreme_value_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const extreme_value_distribution<%1%>&, %1%)";
+
+   RealType a = dist.location();
+   RealType b = dist.scale();
+   RealType result = 0;
+   if(0 == detail::verify_scale_b(function, b, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 0)
+      return -policies::raise_overflow_error<RealType>(function, 0, Policy());
+   if(p == 1)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = a - log(-log(p)) * b;
+
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<extreme_value_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const extreme_value_distribution<%1%>&, %1%)";
+
+   if((boost::math::isinf)(c.param))
+      return c.param < 0 ? 1.0f : 0.0f;
+   RealType a = c.dist.location();
+   RealType b = c.dist.scale();
+   RealType result = 0;
+   if(0 == detail::verify_scale_b(function, b, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_x(function, c.param, &result, Policy()))
+      return result;
+
+   result = -boost::math::expm1(-exp((a-c.param)/b), Policy());
+
+   return result;
+}
+
+template <class RealType, class Policy>
+RealType quantile(const complemented2_type<extreme_value_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const extreme_value_distribution<%1%>&, %1%)";
+
+   RealType a = c.dist.location();
+   RealType b = c.dist.scale();
+   RealType q = c.param;
+   RealType result = 0;
+   if(0 == detail::verify_scale_b(function, b, &result, Policy()))
+      return result;
+   if(0 == detail::check_finite(function, a, &result, Policy()))
+      return result;
+   if(0 == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   if(q == 0)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   if(q == 1)
+      return -policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = a - log(-boost::math::log1p(-q, Policy())) * b;
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const extreme_value_distribution<RealType, Policy>& dist)
+{
+   RealType a = dist.location();
+   RealType b = dist.scale();
+   RealType result = 0;
+   if(0 == detail::verify_scale_b("boost::math::mean(const extreme_value_distribution<%1%>&)", b, &result, Policy()))
+      return result;
+   if(0 == detail::check_scale("boost::math::mean(const extreme_value_distribution<%1%>&)", a, &result, Policy()))
+      return result;
+   return a + constants::euler<RealType>() * b;
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const extreme_value_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions.
+
+   RealType b = dist.scale();
+   RealType result = 0;
+   if(0 == detail::verify_scale_b("boost::math::standard_deviation(const extreme_value_distribution<%1%>&)", b, &result, Policy()))
+      return result;
+   if(0 == detail::check_scale("boost::math::standard_deviation(const extreme_value_distribution<%1%>&)", dist.location(), &result, Policy()))
+      return result;
+   return constants::pi<RealType>() * b / sqrt(static_cast<RealType>(6));
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const extreme_value_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const extreme_value_distribution<RealType, Policy>& dist)
+{
+  using constants::ln_ln_two;
+   return dist.location() - dist.scale() * ln_ln_two<RealType>();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const extreme_value_distribution<RealType, Policy>& /*dist*/)
+{
+   //
+   // This is 12 * sqrt(6) * zeta(3) / pi^3:
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   //
+   return static_cast<RealType>(1.1395470994046486574927930193898461120875997958366L);
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const extreme_value_distribution<RealType, Policy>& /*dist*/)
+{
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   return RealType(27) / 5;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const extreme_value_distribution<RealType, Policy>& /*dist*/)
+{
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   return RealType(12) / 5;
+}
+
+
+} // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_EXTREME_VALUE_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/find_location.hpp b/gatb-core/thirdparty/boost/math/distributions/find_location.hpp
new file mode 100644
index 0000000..d9f62cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/find_location.hpp
@@ -0,0 +1,146 @@
+//  Copyright John Maddock 2007.
+//  Copyright Paul A. Bristow 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_FIND_LOCATION_HPP
+#define BOOST_STATS_FIND_LOCATION_HPP
+
+#include <boost/math/distributions/fwd.hpp> // for all distribution signatures.
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/tools/traits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/policies/error_handling.hpp>
+// using boost::math::policies::policy;
+// using boost::math::complement; // will be needed by users who want complement,
+// but NOT placed here to avoid putting it in global scope.
+
+namespace boost
+{
+  namespace math
+  {
+  // Function to find location of random variable z
+  // to give probability p (given scale)
+  // Applies to normal, lognormal, extreme value, Cauchy, (and symmetrical triangular),
+  // enforced by BOOST_STATIC_ASSERT below.
+
+    template <class Dist, class Policy>
+    inline
+      typename Dist::value_type find_location( // For example, normal mean.
+      typename Dist::value_type z, // location of random variable z to give probability, P(X > z) == p.
+      // For example, a nominal minimum acceptable z, so that p * 100 % are > z
+      typename Dist::value_type p, // probability value desired at x, say 0.95 for 95% > z.
+      typename Dist::value_type scale, // scale parameter, for example, normal standard deviation.
+      const Policy& pol 
+      )
+    {
+#if !defined(BOOST_NO_SFINAE) && !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+      // Will fail to compile here if try to use with a distribution without scale & location,
+      // for example pareto, and many others.  These tests are disabled by the pp-logic
+      // above if the compiler doesn't support the SFINAE tricks used in the traits class.
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_distribution<Dist>::value); 
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_scaled_distribution<Dist>::value);
+#endif
+      static const char* function = "boost::math::find_location<Dist, Policy>&, %1%)";
+
+      if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "Probability parameter was %1%, but must be >= 0 and <= 1!", p, pol);
+      }
+      if(!(boost::math::isfinite)(z))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "z parameter was %1%, but must be finite!", z, pol);
+      }
+      if(!(boost::math::isfinite)(scale))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "scale parameter was %1%, but must be finite!", scale, pol);
+      }
+        
+      //cout << "z " << z << ", p " << p << ",  quantile(Dist(), p) "
+      //  << quantile(Dist(), p) << ", quan * scale " << quantile(Dist(), p) * scale << endl;
+      return z - (quantile(Dist(), p) * scale);
+    } // find_location
+
+    template <class Dist>
+    inline // with default policy.
+      typename Dist::value_type find_location( // For example, normal mean.
+      typename Dist::value_type z, // location of random variable z to give probability, P(X > z) == p.
+      // For example, a nominal minimum acceptable z, so that p * 100 % are > z
+      typename Dist::value_type p, // probability value desired at x, say 0.95 for 95% > z.
+      typename Dist::value_type scale) // scale parameter, for example, normal standard deviation.
+    { // Forward to find_location with default policy.
+       return (find_location<Dist>(z, p, scale, policies::policy<>()));
+    } // find_location
+
+    // So the user can start from the complement q = (1 - p) of the probability p,
+    // for example, l = find_location<normal>(complement(z, q, sd));
+
+    template <class Dist, class Real1, class Real2, class Real3>
+    inline typename Dist::value_type find_location( // Default policy.
+      complemented3_type<Real1, Real2, Real3> const& c)
+    {
+      static const char* function = "boost::math::find_location<Dist, Policy>&, %1%)";
+
+      typename Dist::value_type p = c.param1;
+      if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "Probability parameter was %1%, but must be >= 0 and <= 1!", p, policies::policy<>());
+      }
+      typename Dist::value_type z = c.dist;
+      if(!(boost::math::isfinite)(z))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "z parameter was %1%, but must be finite!", z, policies::policy<>());
+      }
+      typename Dist::value_type scale = c.param2;
+      if(!(boost::math::isfinite)(scale))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "scale parameter was %1%, but must be finite!", scale, policies::policy<>());
+      }
+       // cout << "z " << c.dist << ", quantile (Dist(), " << c.param1 << ") * scale " << c.param2 << endl;
+       return z - quantile(Dist(), p) * scale;
+    } // find_location complement
+
+
+    template <class Dist, class Real1, class Real2, class Real3, class Real4>
+    inline typename Dist::value_type find_location( // Explicit policy.
+      complemented4_type<Real1, Real2, Real3, Real4> const& c)
+    {
+      static const char* function = "boost::math::find_location<Dist, Policy>&, %1%)";
+
+      typename Dist::value_type p = c.param1;
+      if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "Probability parameter was %1%, but must be >= 0 and <= 1!", p, c.param3);
+      }
+      typename Dist::value_type z = c.dist;
+      if(!(boost::math::isfinite)(z))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "z parameter was %1%, but must be finite!", z, c.param3);
+      }
+      typename Dist::value_type scale = c.param2;
+      if(!(boost::math::isfinite)(scale))
+      {
+       return policies::raise_domain_error<typename Dist::value_type>(
+           function, "scale parameter was %1%, but must be finite!", scale, c.param3);
+      }
+       // cout << "z " << c.dist << ", quantile (Dist(), " << c.param1 << ") * scale " << c.param2 << endl;
+       return z - quantile(Dist(), p) * scale;
+    } // find_location complement
+
+  } // namespace boost
+} // namespace math
+
+#endif // BOOST_STATS_FIND_LOCATION_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/find_scale.hpp b/gatb-core/thirdparty/boost/math/distributions/find_scale.hpp
new file mode 100644
index 0000000..e3baafc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/find_scale.hpp
@@ -0,0 +1,211 @@
+//  Copyright John Maddock 2007.
+//  Copyright Paul A. Bristow 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_FIND_SCALE_HPP
+#define BOOST_STATS_FIND_SCALE_HPP
+
+#include <boost/math/distributions/fwd.hpp> // for all distribution signatures.
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/policies/policy.hpp>
+// using boost::math::policies::policy;
+#include <boost/math/tools/traits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/policies/error_handling.hpp>
+// using boost::math::complement; // will be needed by users who want complement,
+// but NOT placed here to avoid putting it in global scope.
+
+namespace boost
+{
+  namespace math
+  {
+    // Function to find location of random variable z
+    // to give probability p (given scale)
+    // Applies to normal, lognormal, extreme value, Cauchy, (and symmetrical triangular),
+    // distributions that have scale.
+    // BOOST_STATIC_ASSERTs, see below, are used to enforce this.
+
+    template <class Dist, class Policy>
+    inline
+      typename Dist::value_type find_scale( // For example, normal mean.
+      typename Dist::value_type z, // location of random variable z to give probability, P(X > z) == p.
+      // For example, a nominal minimum acceptable weight z, so that p * 100 % are > z
+      typename Dist::value_type p, // probability value desired at x, say 0.95 for 95% > z.
+      typename Dist::value_type location, // location parameter, for example, normal distribution mean.
+      const Policy& pol 
+      )
+    {
+#if !defined(BOOST_NO_SFINAE) && !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_distribution<Dist>::value); 
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_scaled_distribution<Dist>::value); 
+#endif
+      static const char* function = "boost::math::find_scale<Dist, Policy>(%1%, %1%, %1%, Policy)";
+
+      if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "Probability parameter was %1%, but must be >= 0 and <= 1!", p, pol);
+      }
+      if(!(boost::math::isfinite)(z))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale z parameter was %1%, but must be finite!", z, pol);
+      }
+      if(!(boost::math::isfinite)(location))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale location parameter was %1%, but must be finite!", location, pol);
+      }
+
+      //cout << "z " << z << ", p " << p << ",  quantile(Dist(), p) "
+      //<< quantile(Dist(), p) << ", z - mean " << z - location 
+      //<<", sd " << (z - location)  / quantile(Dist(), p) << endl;
+
+      //quantile(N01, 0.001) -3.09023
+      //quantile(N01, 0.01) -2.32635
+      //quantile(N01, 0.05) -1.64485
+      //quantile(N01, 0.333333) -0.430728
+      //quantile(N01, 0.5) 0  
+      //quantile(N01, 0.666667) 0.430728
+      //quantile(N01, 0.9) 1.28155
+      //quantile(N01, 0.95) 1.64485
+      //quantile(N01, 0.99) 2.32635
+      //quantile(N01, 0.999) 3.09023
+
+      typename Dist::value_type result = 
+        (z - location)  // difference between desired x and current location.
+        / quantile(Dist(), p); // standard distribution.
+
+      if (result <= 0)
+      { // If policy isn't to throw, return the scale <= 0.
+        policies::raise_evaluation_error<typename Dist::value_type>(function,
+          "Computed scale (%1%) is <= 0!" " Was the complement intended?",
+          result, Policy());
+      }
+      return result;
+    } // template <class Dist, class Policy> find_scale
+
+    template <class Dist>
+    inline // with default policy.
+      typename Dist::value_type find_scale( // For example, normal mean.
+      typename Dist::value_type z, // location of random variable z to give probability, P(X > z) == p.
+      // For example, a nominal minimum acceptable z, so that p * 100 % are > z
+      typename Dist::value_type p, // probability value desired at x, say 0.95 for 95% > z.
+      typename Dist::value_type location) // location parameter, for example, mean.
+    { // Forward to find_scale using the default policy.
+      return (find_scale<Dist>(z, p, location, policies::policy<>()));
+    } // find_scale
+
+    template <class Dist, class Real1, class Real2, class Real3, class Policy>
+    inline typename Dist::value_type find_scale(
+      complemented4_type<Real1, Real2, Real3, Policy> const& c)
+    {
+      //cout << "cparam1 q " << c.param1 // q
+      //  << ", c.dist z " << c.dist // z
+      //  << ", c.param2 l " << c.param2 // l
+      //  << ", quantile (Dist(), c.param1 = q) "
+      //  << quantile(Dist(), c.param1) //q
+      //  << endl;
+
+#if !defined(BOOST_NO_SFINAE) && !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_distribution<Dist>::value); 
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_scaled_distribution<Dist>::value); 
+#endif
+      static const char* function = "boost::math::find_scale<Dist, Policy>(complement(%1%, %1%, %1%, Policy))";
+
+      // Checks on arguments, as not complemented version,
+      // Explicit policy.
+      typename Dist::value_type q = c.param1;
+      if(!(boost::math::isfinite)(q) || (q < 0) || (q > 1))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "Probability parameter was %1%, but must be >= 0 and <= 1!", q, c.param3);
+      }
+      typename Dist::value_type z = c.dist;
+      if(!(boost::math::isfinite)(z))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale z parameter was %1%, but must be finite!", z, c.param3);
+      }
+      typename Dist::value_type location = c.param2;
+      if(!(boost::math::isfinite)(location))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale location parameter was %1%, but must be finite!", location, c.param3);
+      }
+
+      typename Dist::value_type result = 
+        (c.dist - c.param2)  // difference between desired x and current location.
+        / quantile(complement(Dist(), c.param1));
+      //     (  z    - location) / (quantile(complement(Dist(),  q)) 
+      if (result <= 0)
+      { // If policy isn't to throw, return the scale <= 0.
+        policies::raise_evaluation_error<typename Dist::value_type>(function,
+          "Computed scale (%1%) is <= 0!" " Was the complement intended?",
+          result, Policy());
+      }
+      return result;
+    } // template <class Dist, class Policy, class Real1, class Real2, class Real3> typename Dist::value_type find_scale
+
+    // So the user can start from the complement q = (1 - p) of the probability p,
+    // for example, s = find_scale<normal>(complement(z, q, l));
+
+    template <class Dist, class Real1, class Real2, class Real3>
+    inline typename Dist::value_type find_scale(
+      complemented3_type<Real1, Real2, Real3> const& c)
+    {
+      //cout << "cparam1 q " << c.param1 // q
+      //  << ", c.dist z " << c.dist // z
+      //  << ", c.param2 l " << c.param2 // l
+      //  << ", quantile (Dist(), c.param1 = q) "
+      //  << quantile(Dist(), c.param1) //q
+      //  << endl;
+
+#if !defined(BOOST_NO_SFINAE) && !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_distribution<Dist>::value); 
+      BOOST_STATIC_ASSERT(::boost::math::tools::is_scaled_distribution<Dist>::value); 
+#endif
+      static const char* function = "boost::math::find_scale<Dist, Policy>(complement(%1%, %1%, %1%, Policy))";
+
+      // Checks on arguments, as not complemented version,
+      // default policy policies::policy<>().
+      typename Dist::value_type q = c.param1;
+      if(!(boost::math::isfinite)(q) || (q < 0) || (q > 1))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "Probability parameter was %1%, but must be >= 0 and <= 1!", q, policies::policy<>());
+      }
+      typename Dist::value_type z = c.dist;
+      if(!(boost::math::isfinite)(z))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale z parameter was %1%, but must be finite!", z, policies::policy<>());
+      }
+      typename Dist::value_type location = c.param2;
+      if(!(boost::math::isfinite)(location))
+      {
+        return policies::raise_domain_error<typename Dist::value_type>(
+          function, "find_scale location parameter was %1%, but must be finite!", location, policies::policy<>());
+      }
+
+      typename Dist::value_type result = 
+        (z - location)  // difference between desired x and current location.
+        / quantile(complement(Dist(), q));
+      //     (  z    - location) / (quantile(complement(Dist(),  q)) 
+      if (result <= 0)
+      { // If policy isn't to throw, return the scale <= 0.
+        policies::raise_evaluation_error<typename Dist::value_type>(function,
+          "Computed scale (%1%) is <= 0!" " Was the complement intended?",
+          result, policies::policy<>()); // This is only the default policy - also Want a version with Policy here.
+      }
+      return result;
+    } // template <class Dist, class Real1, class Real2, class Real3> typename Dist::value_type find_scale
+
+  } // namespace boost
+} // namespace math
+
+#endif // BOOST_STATS_FIND_SCALE_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/fisher_f.hpp b/gatb-core/thirdparty/boost/math/distributions/fisher_f.hpp
new file mode 100644
index 0000000..9e259bc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/fisher_f.hpp
@@ -0,0 +1,387 @@
+// Copyright John Maddock 2006.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_FISHER_F_HPP
+#define BOOST_MATH_DISTRIBUTIONS_FISHER_F_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for incomplete beta.
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class fisher_f_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   fisher_f_distribution(const RealType& i, const RealType& j) : m_df1(i), m_df2(j)
+   {
+      static const char* function = "fisher_f_distribution<%1%>::fisher_f_distribution";
+      RealType result;
+      detail::check_df(
+         function, m_df1, &result, Policy());
+      detail::check_df(
+         function, m_df2, &result, Policy());
+   } // fisher_f_distribution
+
+   RealType degrees_of_freedom1()const
+   {
+      return m_df1;
+   }
+   RealType degrees_of_freedom2()const
+   {
+      return m_df2;
+   }
+
+private:
+   //
+   // Data members:
+   //
+   RealType m_df1;  // degrees of freedom are a real number.
+   RealType m_df2;  // degrees of freedom are a real number.
+};
+
+typedef fisher_f_distribution<double> fisher_f;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const fisher_f_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const fisher_f_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+RealType pdf(const fisher_f_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   static const char* function = "boost::math::pdf(fisher_f_distribution<%1%> const&, %1%)";
+   if(false == detail::check_df(
+         function, df1, &error_result, Policy())
+         && detail::check_df(
+         function, df2, &error_result, Policy()))
+      return error_result;
+
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Random variable parameter was %1%, but must be > 0 !", x, Policy());
+   }
+
+   if(x == 0)
+   {
+      // special cases:
+      if(df1 < 2)
+         return policies::raise_overflow_error<RealType>(
+            function, 0, Policy());
+      else if(df1 == 2)
+         return 1;
+      else
+         return 0;
+   }
+
+   //
+   // You reach this formula by direct differentiation of the
+   // cdf expressed in terms of the incomplete beta.
+   //
+   // There are two versions so we don't pass a value of z
+   // that is very close to 1 to ibeta_derivative: for some values
+   // of df1 and df2, all the change takes place in this area.
+   //
+   RealType v1x = df1 * x;
+   RealType result;
+   if(v1x > df2)
+   {
+      result = (df2 * df1) / ((df2 + v1x) * (df2 + v1x));
+      result *= ibeta_derivative(df2 / 2, df1 / 2, df2 / (df2 + v1x), Policy());
+   }
+   else
+   {
+      result = df2 + df1 * x;
+      result = (result * df1 - x * df1 * df1) / (result * result);
+      result *= ibeta_derivative(df1 / 2, df2 / 2, v1x / (df2 + v1x), Policy());
+   }
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const fisher_f_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   static const char* function = "boost::math::cdf(fisher_f_distribution<%1%> const&, %1%)";
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+         function, df1, &error_result, Policy())
+         && detail::check_df(
+         function, df2, &error_result, Policy()))
+      return error_result;
+
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Random Variable parameter was %1%, but must be > 0 !", x, Policy());
+   }
+
+   RealType v1x = df1 * x;
+   //
+   // There are two equivalent formulas used here, the aim is
+   // to prevent the final argument to the incomplete beta
+   // from being too close to 1: for some values of df1 and df2
+   // the rate of change can be arbitrarily large in this area,
+   // whilst the value we're passing will have lost information
+   // content as a result of being 0.999999something.  Better
+   // to switch things around so we're passing 1-z instead.
+   //
+   return v1x > df2
+      ? boost::math::ibetac(df2 / 2, df1 / 2, df2 / (df2 + v1x), Policy())
+      : boost::math::ibeta(df1 / 2, df2 / 2, v1x / (df2 + v1x), Policy());
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const fisher_f_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   static const char* function = "boost::math::quantile(fisher_f_distribution<%1%> const&, %1%)";
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == (detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy())
+         && detail::check_probability(
+            function, p, &error_result, Policy())))
+      return error_result;
+
+   // With optimizations turned on, gcc wrongly warns about y being used
+   // uninitializated unless we initialize it to something:
+   RealType x, y(0);
+
+   x = boost::math::ibeta_inv(df1 / 2, df2 / 2, p, &y, Policy());
+
+   return df2 * x / (df1 * y);
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<fisher_f_distribution<RealType, Policy>, RealType>& c)
+{
+   static const char* function = "boost::math::cdf(fisher_f_distribution<%1%> const&, %1%)";
+   RealType df1 = c.dist.degrees_of_freedom1();
+   RealType df2 = c.dist.degrees_of_freedom2();
+   RealType x = c.param;
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+         function, df1, &error_result, Policy())
+         && detail::check_df(
+         function, df2, &error_result, Policy()))
+      return error_result;
+
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Random Variable parameter was %1%, but must be > 0 !", x, Policy());
+   }
+
+   RealType v1x = df1 * x;
+   //
+   // There are two equivalent formulas used here, the aim is
+   // to prevent the final argument to the incomplete beta
+   // from being too close to 1: for some values of df1 and df2
+   // the rate of change can be arbitrarily large in this area,
+   // whilst the value we're passing will have lost information
+   // content as a result of being 0.999999something.  Better
+   // to switch things around so we're passing 1-z instead.
+   //
+   return v1x > df2
+      ? boost::math::ibeta(df2 / 2, df1 / 2, df2 / (df2 + v1x), Policy())
+      : boost::math::ibetac(df1 / 2, df2 / 2, v1x / (df2 + v1x), Policy());
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<fisher_f_distribution<RealType, Policy>, RealType>& c)
+{
+   static const char* function = "boost::math::quantile(fisher_f_distribution<%1%> const&, %1%)";
+   RealType df1 = c.dist.degrees_of_freedom1();
+   RealType df2 = c.dist.degrees_of_freedom2();
+   RealType p = c.param;
+   // Error check:
+   RealType error_result = 0;
+   if(false == (detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy())
+         && detail::check_probability(
+            function, p, &error_result, Policy())))
+      return error_result;
+
+   RealType x, y;
+
+   x = boost::math::ibetac_inv(df1 / 2, df2 / 2, p, &y, Policy());
+
+   return df2 * x / (df1 * y);
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const fisher_f_distribution<RealType, Policy>& dist)
+{ // Mean of F distribution = v.
+   static const char* function = "boost::math::mean(fisher_f_distribution<%1%> const&)";
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy()))
+      return error_result;
+   if(df2 <= 2)
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Second degree of freedom was %1% but must be > 2 in order for the distribution to have a mean.", df2, Policy());
+   }
+   return df2 / (df2 - 2);
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const fisher_f_distribution<RealType, Policy>& dist)
+{ // Variance of F distribution.
+   static const char* function = "boost::math::variance(fisher_f_distribution<%1%> const&)";
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy()))
+      return error_result;
+   if(df2 <= 4)
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Second degree of freedom was %1% but must be > 4 in order for the distribution to have a valid variance.", df2, Policy());
+   }
+   return 2 * df2 * df2 * (df1 + df2 - 2) / (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));
+} // variance
+
+template <class RealType, class Policy>
+inline RealType mode(const fisher_f_distribution<RealType, Policy>& dist)
+{
+   static const char* function = "boost::math::mode(fisher_f_distribution<%1%> const&)";
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy()))
+      return error_result;
+   if(df2 <= 2)
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Second degree of freedom was %1% but must be > 2 in order for the distribution to have a mode.", df2, Policy());
+   }
+   return df2 * (df1 - 2) / (df1 * (df2 + 2));
+}
+
+//template <class RealType, class Policy>
+//inline RealType median(const fisher_f_distribution<RealType, Policy>& dist)
+//{ // Median of Fisher F distribution is not defined.
+//  return tools::domain_error<RealType>(BOOST_CURRENT_FUNCTION, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
+//  } // median
+
+// Now implemented via quantile(half) in derived accessors.
+
+template <class RealType, class Policy>
+inline RealType skewness(const fisher_f_distribution<RealType, Policy>& dist)
+{
+   static const char* function = "boost::math::skewness(fisher_f_distribution<%1%> const&)";
+   BOOST_MATH_STD_USING // ADL of std names
+   // See http://mathworld.wolfram.com/F-Distribution.html
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy()))
+      return error_result;
+   if(df2 <= 6)
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Second degree of freedom was %1% but must be > 6 in order for the distribution to have a skewness.", df2, Policy());
+   }
+   return 2 * (df2 + 2 * df1 - 2) * sqrt((2 * df2 - 8) / (df1 * (df2 + df1 - 2))) / (df2 - 6);
+}
+
+template <class RealType, class Policy>
+RealType kurtosis_excess(const fisher_f_distribution<RealType, Policy>& dist);
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const fisher_f_distribution<RealType, Policy>& dist)
+{
+   return 3 + kurtosis_excess(dist);
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const fisher_f_distribution<RealType, Policy>& dist)
+{
+   static const char* function = "boost::math::kurtosis_excess(fisher_f_distribution<%1%> const&)";
+   // See http://mathworld.wolfram.com/F-Distribution.html
+   RealType df1 = dist.degrees_of_freedom1();
+   RealType df2 = dist.degrees_of_freedom2();
+   // Error check:
+   RealType error_result = 0;
+   if(false == detail::check_df(
+            function, df1, &error_result, Policy())
+         && detail::check_df(
+            function, df2, &error_result, Policy()))
+      return error_result;
+   if(df2 <= 8)
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "Second degree of freedom was %1% but must be > 8 in order for the distribution to have a kutosis.", df2, Policy());
+   }
+   RealType df2_2 = df2 * df2;
+   RealType df1_2 = df1 * df1;
+   RealType n = -16 + 20 * df2 - 8 * df2_2 + df2_2 * df2 + 44 * df1 - 32 * df2 * df1 + 5 * df2_2 * df1 - 22 * df1_2 + 5 * df2 * df1_2;
+   n *= 12;
+   RealType d = df1 * (df2 - 6) * (df2 - 8) * (df1 + df2 - 2);
+   return n / d;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_FISHER_F_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/fwd.hpp b/gatb-core/thirdparty/boost/math/distributions/fwd.hpp
new file mode 100644
index 0000000..5b212c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/fwd.hpp
@@ -0,0 +1,153 @@
+// fwd.hpp Forward declarations of Boost.Math distributions.
+
+// Copyright Paul A. Bristow 2007, 2010, 2012, 2014.
+// Copyright John Maddock 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_FWD_HPP
+#define BOOST_MATH_DISTRIBUTIONS_FWD_HPP
+
+// 33 distributions at Boost 1.9.1 after adding hyperexpon and arcsine
+
+namespace boost{ namespace math{
+
+template <class RealType, class Policy>
+class arcsine_distribution;
+
+template <class RealType, class Policy>
+class bernoulli_distribution;
+
+template <class RealType, class Policy>
+class beta_distribution;
+
+template <class RealType, class Policy>
+class binomial_distribution;
+
+template <class RealType, class Policy>
+class cauchy_distribution;
+
+template <class RealType, class Policy>
+class chi_squared_distribution;
+
+template <class RealType, class Policy>
+class exponential_distribution;
+
+template <class RealType, class Policy>
+class extreme_value_distribution;
+
+template <class RealType, class Policy>
+class fisher_f_distribution;
+
+template <class RealType, class Policy>
+class gamma_distribution;
+
+template <class RealType, class Policy>
+class geometric_distribution;
+
+template <class RealType, class Policy>
+class hyperexponential_distribution;
+
+template <class RealType, class Policy>
+class hypergeometric_distribution;
+
+template <class RealType, class Policy>
+class inverse_chi_squared_distribution;
+
+template <class RealType, class Policy>
+class inverse_gamma_distribution;
+
+template <class RealType, class Policy>
+class inverse_gaussian_distribution;
+
+template <class RealType, class Policy>
+class laplace_distribution;
+
+template <class RealType, class Policy>
+class logistic_distribution;
+
+template <class RealType, class Policy>
+class lognormal_distribution;
+
+template <class RealType, class Policy>
+class negative_binomial_distribution;
+
+template <class RealType, class Policy>
+class non_central_beta_distribution;
+
+template <class RealType, class Policy>
+class non_central_chi_squared_distribution;
+
+template <class RealType, class Policy>
+class non_central_f_distribution;
+
+template <class RealType, class Policy>
+class non_central_t_distribution;
+
+template <class RealType, class Policy>
+class normal_distribution;
+
+template <class RealType, class Policy>
+class pareto_distribution;
+
+template <class RealType, class Policy>
+class poisson_distribution;
+
+template <class RealType, class Policy>
+class rayleigh_distribution;
+
+template <class RealType, class Policy>
+class skew_normal_distribution;
+
+template <class RealType, class Policy>
+class students_t_distribution;
+
+template <class RealType, class Policy>
+class triangular_distribution;
+
+template <class RealType, class Policy>
+class uniform_distribution;
+
+template <class RealType, class Policy>
+class weibull_distribution;
+
+}} // namespaces
+
+#define BOOST_MATH_DECLARE_DISTRIBUTIONS(Type, Policy)\
+   typedef boost::math::arcsine_distribution<Type, Policy> arcsine;\
+   typedef boost::math::bernoulli_distribution<Type, Policy> bernoulli;\
+   typedef boost::math::beta_distribution<Type, Policy> beta;\
+   typedef boost::math::binomial_distribution<Type, Policy> binomial;\
+   typedef boost::math::cauchy_distribution<Type, Policy> cauchy;\
+   typedef boost::math::chi_squared_distribution<Type, Policy> chi_squared;\
+   typedef boost::math::exponential_distribution<Type, Policy> exponential;\
+   typedef boost::math::extreme_value_distribution<Type, Policy> extreme_value;\
+   typedef boost::math::fisher_f_distribution<Type, Policy> fisher_f;\
+   typedef boost::math::gamma_distribution<Type, Policy> gamma;\
+   typedef boost::math::geometric_distribution<Type, Policy> geometric;\
+   typedef boost::math::hypergeometric_distribution<Type, Policy> hypergeometric;\
+   typedef boost::math::inverse_chi_squared_distribution<Type, Policy> inverse_chi_squared;\
+   typedef boost::math::inverse_gaussian_distribution<Type, Policy> inverse_gaussian;\
+   typedef boost::math::inverse_gamma_distribution<Type, Policy> inverse_gamma;\
+   typedef boost::math::laplace_distribution<Type, Policy> laplace;\
+   typedef boost::math::logistic_distribution<Type, Policy> logistic;\
+   typedef boost::math::lognormal_distribution<Type, Policy> lognormal;\
+   typedef boost::math::negative_binomial_distribution<Type, Policy> negative_binomial;\
+   typedef boost::math::non_central_beta_distribution<Type, Policy> non_central_beta;\
+   typedef boost::math::non_central_chi_squared_distribution<Type, Policy> non_central_chi_squared;\
+   typedef boost::math::non_central_f_distribution<Type, Policy> non_central_f;\
+   typedef boost::math::non_central_t_distribution<Type, Policy> non_central_t;\
+   typedef boost::math::normal_distribution<Type, Policy> normal;\
+   typedef boost::math::pareto_distribution<Type, Policy> pareto;\
+   typedef boost::math::poisson_distribution<Type, Policy> poisson;\
+   typedef boost::math::rayleigh_distribution<Type, Policy> rayleigh;\
+   typedef boost::math::skew_normal_distribution<Type, Policy> skew_normal;\
+   typedef boost::math::students_t_distribution<Type, Policy> students_t;\
+   typedef boost::math::triangular_distribution<Type, Policy> triangular;\
+   typedef boost::math::uniform_distribution<Type, Policy> uniform;\
+   typedef boost::math::weibull_distribution<Type, Policy> weibull;
+
+#endif // BOOST_MATH_DISTRIBUTIONS_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/gamma.hpp b/gatb-core/thirdparty/boost/math/distributions/gamma.hpp
new file mode 100644
index 0000000..9a9e2a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/gamma.hpp
@@ -0,0 +1,349 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_GAMMA_HPP
+#define BOOST_STATS_GAMMA_HPP
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda366b.htm
+// http://mathworld.wolfram.com/GammaDistribution.html
+// http://en.wikipedia.org/wiki/Gamma_distribution
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+namespace detail
+{
+
+template <class RealType, class Policy>
+inline bool check_gamma_shape(
+      const char* function,
+      RealType shape,
+      RealType* result, const Policy& pol)
+{
+   if((shape <= 0) || !(boost::math::isfinite)(shape))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Shape parameter is %1%, but must be > 0 !", shape, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_gamma_x(
+      const char* function,
+      RealType const& x,
+      RealType* result, const Policy& pol)
+{
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate is %1% but must be >= 0 !", x, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_gamma(
+      const char* function,
+      RealType scale,
+      RealType shape,
+      RealType* result, const Policy& pol)
+{
+   return check_scale(function, scale, result, pol) && check_gamma_shape(function, shape, result, pol);
+}
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class gamma_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   gamma_distribution(RealType l_shape, RealType l_scale = 1)
+      : m_shape(l_shape), m_scale(l_scale)
+   {
+      RealType result;
+      detail::check_gamma("boost::math::gamma_distribution<%1%>::gamma_distribution", l_scale, l_shape, &result, Policy());
+   }
+
+   RealType shape()const
+   {
+      return m_shape;
+   }
+
+   RealType scale()const
+   {
+      return m_scale;
+   }
+private:
+   //
+   // Data members:
+   //
+   RealType m_shape;     // distribution shape
+   RealType m_scale;     // distribution scale
+};
+
+// NO typedef because of clash with name of gamma function.
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const gamma_distribution<RealType, Policy>& /* dist */)
+{ // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const gamma_distribution<RealType, Policy>& /* dist */)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   using boost::math::tools::min_value;
+   return std::pair<RealType, RealType>(min_value<RealType>(),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const gamma_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_gamma_x(function, x, &result, Policy()))
+      return result;
+
+   if(x == 0)
+   {
+      return 0;
+   }
+   result = gamma_p_derivative(shape, x / scale, Policy()) / scale;
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const gamma_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_gamma_x(function, x, &result, Policy()))
+      return result;
+
+   result = boost::math::gamma_p(shape, x / scale, Policy());
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const gamma_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 1)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = gamma_p_inv(shape, p, Policy()) * scale;
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<gamma_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_gamma_x(function, c.param, &result, Policy()))
+      return result;
+
+   result = gamma_q(shape, c.param / scale, Policy());
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<gamma_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+   RealType q = c.param;
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   if(q == 0)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = gamma_q_inv(shape, q, Policy()) * scale;
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::mean(const gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+
+   result = shape * scale;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType variance(const gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::variance(const gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+
+   result = shape * scale * scale;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::mode(const gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+
+   if(shape < 1)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "The mode of the gamma distribution is only defined for values of the shape parameter >= 1, but got %1%.",
+         shape, Policy());
+
+   result = (shape - 1) * scale;
+   return result;
+}
+
+//template <class RealType, class Policy>
+//inline RealType median(const gamma_distribution<RealType, Policy>& dist)
+//{  // Rely on default definition in derived accessors.
+//}
+
+template <class RealType, class Policy>
+inline RealType skewness(const gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::skewness(const gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+
+   result = 2 / sqrt(shape);
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::kurtosis_excess(const gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_gamma(function, scale, shape, &result, Policy()))
+      return result;
+
+   result = 6 / shape;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const gamma_distribution<RealType, Policy>& dist)
+{
+   return kurtosis_excess(dist) + 3;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_GAMMA_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/geometric.hpp b/gatb-core/thirdparty/boost/math/distributions/geometric.hpp
new file mode 100644
index 0000000..88947d6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/geometric.hpp
@@ -0,0 +1,516 @@
+// boost\math\distributions\geometric.hpp
+
+// Copyright John Maddock 2010.
+// Copyright Paul A. Bristow 2010.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// geometric distribution is a discrete probability distribution.
+// It expresses the probability distribution of the number (k) of
+// events, occurrences, failures or arrivals before the first success.
+// supported on the set {0, 1, 2, 3...}
+
+// Note that the set includes zero (unlike some definitions that start at one).
+
+// The random variate k is the number of events, occurrences or arrivals.
+// k argument may be integral, signed, or unsigned, or floating point.
+// If necessary, it has already been promoted from an integral type.
+
+// Note that the geometric distribution
+// (like others including the binomial, geometric & Bernoulli)
+// is strictly defined as a discrete function:
+// only integral values of k are envisaged.
+// However because the method of calculation uses a continuous gamma function,
+// it is convenient to treat it as if a continous function,
+// and permit non-integral values of k.
+// To enforce the strict mathematical model, users should use floor or ceil functions
+// on k outside this function to ensure that k is integral.
+
+// See http://en.wikipedia.org/wiki/geometric_distribution
+// http://documents.wolfram.com/v5/Add-onsLinks/StandardPackages/Statistics/DiscreteDistributions.html
+// http://mathworld.wolfram.com/GeometricDistribution.html
+
+#ifndef BOOST_MATH_SPECIAL_GEOMETRIC_HPP
+#define BOOST_MATH_SPECIAL_GEOMETRIC_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for ibeta(a, b, x) == Ix(a, b).
+#include <boost/math/distributions/complement.hpp> // complement.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks domain_error & logic_error.
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+#include <boost/math/distributions/detail/inv_discrete_quantile.hpp>
+
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <limits> // using std::numeric_limits;
+#include <utility>
+
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+// This believed not now necessary, so commented out.
+//#  pragma warning(disable: 4702) // unreachable code.
+// in domain_error_imp in error_handling.
+#endif
+
+namespace boost
+{
+  namespace math
+  {
+    namespace geometric_detail
+    {
+      // Common error checking routines for geometric distribution function:
+      template <class RealType, class Policy>
+      inline bool check_success_fraction(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        if( !(boost::math::isfinite)(p) || (p < 0) || (p > 1) )
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Success fraction argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      }
+
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        return check_success_fraction(function, p, result, pol);
+      }
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_k(const char* function,  const RealType& p, RealType k, RealType* result, const Policy& pol)
+      {
+        if(check_dist(function, p, result, pol) == false)
+        {
+          return false;
+        }
+        if( !(boost::math::isfinite)(k) || (k < 0) )
+        { // Check k failures.
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Number of failures argument is %1%, but must be >= 0 !", k, pol);
+          return false;
+        }
+        return true;
+      } // Check_dist_and_k
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, RealType p, RealType prob, RealType* result, const Policy& pol)
+      {
+        if(check_dist(function, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+        {
+          return false;
+        }
+        return true;
+      } // check_dist_and_prob
+    } //  namespace geometric_detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class geometric_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      geometric_distribution(RealType p) : m_p(p)
+      { // Constructor stores success_fraction p.
+        RealType result;
+        geometric_detail::check_dist(
+          "geometric_distribution<%1%>::geometric_distribution",
+          m_p, // Check success_fraction 0 <= p <= 1.
+          &result, Policy());
+      } // geometric_distribution constructor.
+
+      // Private data getter class member functions.
+      RealType success_fraction() const
+      { // Probability of success as fraction in range 0 to 1.
+        return m_p;
+      }
+      RealType successes() const
+      { // Total number of successes r = 1 (for compatibility with negative binomial?).
+        return 1;
+      }
+
+      // Parameter estimation.
+      // (These are copies of negative_binomial distribution with successes = 1).
+      static RealType find_lower_bound_on_p(
+        RealType trials,
+        RealType alpha) // alpha 0.05 equivalent to 95% for one-sided test.
+      {
+        static const char* function = "boost::math::geometric<%1%>::find_lower_bound_on_p";
+        RealType result = 0;  // of error checks.
+        RealType successes = 1;
+        RealType failures = trials - successes;
+        if(false == detail::check_probability(function, alpha, &result, Policy())
+          && geometric_detail::check_dist_and_k(
+          function, RealType(0), failures, &result, Policy()))
+        {
+          return result;
+        }
+        // Use complement ibeta_inv function for lower bound.
+        // This is adapted from the corresponding binomial formula
+        // here: http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm
+        // This is a Clopper-Pearson interval, and may be overly conservative,
+        // see also "A Simple Improved Inferential Method for Some
+        // Discrete Distributions" Yong CAI and K. KRISHNAMOORTHY
+        // http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf
+        //
+        return ibeta_inv(successes, failures + 1, alpha, static_cast<RealType*>(0), Policy());
+      } // find_lower_bound_on_p
+
+      static RealType find_upper_bound_on_p(
+        RealType trials,
+        RealType alpha) // alpha 0.05 equivalent to 95% for one-sided test.
+      {
+        static const char* function = "boost::math::geometric<%1%>::find_upper_bound_on_p";
+        RealType result = 0;  // of error checks.
+        RealType successes = 1;
+        RealType failures = trials - successes;
+        if(false == geometric_detail::check_dist_and_k(
+          function, RealType(0), failures, &result, Policy())
+          && detail::check_probability(function, alpha, &result, Policy()))
+        {
+          return result;
+        }
+        if(failures == 0)
+        {
+           return 1;
+        }// Use complement ibetac_inv function for upper bound.
+        // Note adjusted failures value: *not* failures+1 as usual.
+        // This is adapted from the corresponding binomial formula
+        // here: http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm
+        // This is a Clopper-Pearson interval, and may be overly conservative,
+        // see also "A Simple Improved Inferential Method for Some
+        // Discrete Distributions" Yong CAI and K. Krishnamoorthy
+        // http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf
+        //
+        return ibetac_inv(successes, failures, alpha, static_cast<RealType*>(0), Policy());
+      } // find_upper_bound_on_p
+
+      // Estimate number of trials :
+      // "How many trials do I need to be P% sure of seeing k or fewer failures?"
+
+      static RealType find_minimum_number_of_trials(
+        RealType k,     // number of failures (k >= 0).
+        RealType p,     // success fraction 0 <= p <= 1.
+        RealType alpha) // risk level threshold 0 <= alpha <= 1.
+      {
+        static const char* function = "boost::math::geometric<%1%>::find_minimum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == geometric_detail::check_dist_and_k(
+          function, p, k, &result, Policy())
+          && detail::check_probability(function, alpha, &result, Policy()))
+        {
+          return result;
+        }
+        result = ibeta_inva(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      } // RealType find_number_of_failures
+
+      static RealType find_maximum_number_of_trials(
+        RealType k,     // number of failures (k >= 0).
+        RealType p,     // success fraction 0 <= p <= 1.
+        RealType alpha) // risk level threshold 0 <= alpha <= 1.
+      {
+        static const char* function = "boost::math::geometric<%1%>::find_maximum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == geometric_detail::check_dist_and_k(
+          function, p, k, &result, Policy())
+          &&  detail::check_probability(function, alpha, &result, Policy()))
+        { 
+          return result;
+        }
+        result = ibetac_inva(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      } // RealType find_number_of_trials complemented
+
+    private:
+      //RealType m_r; // successes fixed at unity.
+      RealType m_p; // success_fraction
+    }; // template <class RealType, class Policy> class geometric_distribution
+
+    typedef geometric_distribution<double> geometric; // Reserved name of type double.
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const geometric_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable k.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // max_integer?
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const geometric_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable k.
+       // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>()); // max_integer?
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const geometric_distribution<RealType, Policy>& dist)
+    { // Mean of geometric distribution = (1-p)/p.
+      return (1 - dist.success_fraction() ) / dist.success_fraction();
+    } // mean
+
+    // median implemented via quantile(half) in derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType mode(const geometric_distribution<RealType, Policy>&)
+    { // Mode of geometric distribution = zero.
+      BOOST_MATH_STD_USING // ADL of std functions.
+      return 0;
+    } // mode
+    
+    template <class RealType, class Policy>
+    inline RealType variance(const geometric_distribution<RealType, Policy>& dist)
+    { // Variance of Binomial distribution = (1-p) / p^2.
+      return  (1 - dist.success_fraction())
+        / (dist.success_fraction() * dist.success_fraction());
+    } // variance
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const geometric_distribution<RealType, Policy>& dist)
+    { // skewness of geometric distribution = 2-p / (sqrt(r(1-p))
+      BOOST_MATH_STD_USING // ADL of std functions.
+      RealType p = dist.success_fraction();
+      return (2 - p) / sqrt(1 - p);
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const geometric_distribution<RealType, Policy>& dist)
+    { // kurtosis of geometric distribution
+      // http://en.wikipedia.org/wiki/geometric is kurtosis_excess so add 3
+      RealType p = dist.success_fraction();
+      return 3 + (p*p - 6*p + 6) / (1 - p);
+    } // kurtosis
+
+     template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const geometric_distribution<RealType, Policy>& dist)
+    { // kurtosis excess of geometric distribution
+      // http://mathworld.wolfram.com/Kurtosis.html table of kurtosis_excess
+      RealType p = dist.success_fraction();
+      return (p*p - 6*p + 6) / (1 - p);
+    } // kurtosis_excess
+
+    // RealType standard_deviation(const geometric_distribution<RealType, Policy>& dist)
+    // standard_deviation provided by derived accessors.
+    // RealType hazard(const geometric_distribution<RealType, Policy>& dist)
+    // hazard of geometric distribution provided by derived accessors.
+    // RealType chf(const geometric_distribution<RealType, Policy>& dist)
+    // chf of geometric distribution provided by derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const geometric_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Probability Density/Mass Function.
+      BOOST_FPU_EXCEPTION_GUARD
+      BOOST_MATH_STD_USING  // For ADL of math functions.
+      static const char* function = "boost::math::pdf(const geometric_distribution<%1%>&, %1%)";
+
+      RealType p = dist.success_fraction();
+      RealType result = 0;
+      if(false == geometric_detail::check_dist_and_k(
+        function,
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (k == 0)
+      {
+        return p; // success_fraction
+      }
+      RealType q = 1 - p;  // Inaccurate for small p?
+      // So try to avoid inaccuracy for large or small p.
+      // but has little effect > last significant bit.
+      //cout << "p *  pow(q, k) " << result << endl; // seems best whatever p
+      //cout << "exp(p * k * log1p(-p)) " << p * exp(k * log1p(-p)) << endl;
+      //if (p < 0.5)
+      //{
+      //  result = p *  pow(q, k);
+      //}
+      //else
+      //{
+      //  result = p * exp(k * log1p(-p));
+      //}
+      result = p * pow(q, k);
+      return result;
+    } // geometric_pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const geometric_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Cumulative Distribution Function of geometric.
+      static const char* function = "boost::math::cdf(const geometric_distribution<%1%>&, %1%)";
+
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      RealType p = dist.success_fraction();
+      // Error check:
+      RealType result = 0;
+      if(false == geometric_detail::check_dist_and_k(
+        function,
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if(k == 0)
+      {
+        return p; // success_fraction
+      }
+      //RealType q = 1 - p;  // Bad for small p
+      //RealType probability = 1 - std::pow(q, k+1);
+
+      RealType z = boost::math::log1p(-p, Policy()) * (k + 1);
+      RealType probability = -boost::math::expm1(z, Policy());
+
+      return probability;
+    } // cdf Cumulative Distribution Function geometric.
+
+      template <class RealType, class Policy>
+      inline RealType cdf(const complemented2_type<geometric_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function geometric.
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::cdf(const geometric_distribution<%1%>&, %1%)";
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      RealType const& k = c.param;
+      geometric_distribution<RealType, Policy> const& dist = c.dist;
+      RealType p = dist.success_fraction();
+      // Error check:
+      RealType result = 0;
+      if(false == geometric_detail::check_dist_and_k(
+        function,
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      RealType z = boost::math::log1p(-p, Policy()) * (k+1);
+      RealType probability = exp(z);
+      return probability;
+    } // cdf Complemented Cumulative Distribution Function geometric.
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const geometric_distribution<RealType, Policy>& dist, const RealType& x)
+    { // Quantile, percentile/100 or Percent Point geometric function.
+      // Return the number of expected failures k for a given probability p.
+
+      // Inverse cumulative Distribution Function or Quantile (percentile / 100) of geometric Probability.
+      // k argument may be integral, signed, or unsigned, or floating point.
+
+      static const char* function = "boost::math::quantile(const geometric_distribution<%1%>&, %1%)";
+      BOOST_MATH_STD_USING // ADL of std functions.
+
+      RealType success_fraction = dist.success_fraction();
+      // Check dist and x.
+      RealType result = 0;
+      if(false == geometric_detail::check_dist_and_prob
+        (function, success_fraction, x, &result, Policy()))
+      {
+        return result;
+      }
+
+      // Special cases.
+      if (x == 1)
+      {  // Would need +infinity failures for total confidence.
+        result = policies::raise_overflow_error<RealType>(
+            function,
+            "Probability argument is 1, which implies infinite failures !", Policy());
+        return result;
+       // usually means return +std::numeric_limits<RealType>::infinity();
+       // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+      }
+      if (x == 0)
+      { // No failures are expected if P = 0.
+        return 0; // Total trials will be just dist.successes.
+      }
+      // if (P <= pow(dist.success_fraction(), 1))
+      if (x <= success_fraction)
+      { // p <= pdf(dist, 0) == cdf(dist, 0)
+        return 0;
+      }
+      if (x == 1)
+      {
+        return 0;
+      }
+   
+      // log(1-x) /log(1-success_fraction) -1; but use log1p in case success_fraction is small
+      result = boost::math::log1p(-x, Policy()) / boost::math::log1p(-success_fraction, Policy()) - 1;
+      // Subtract a few epsilons here too?
+      // to make sure it doesn't slip over, so ceil would be one too many.
+      return result;
+    } // RealType quantile(const geometric_distribution dist, p)
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<geometric_distribution<RealType, Policy>, RealType>& c)
+    {  // Quantile or Percent Point Binomial function.
+       // Return the number of expected failures k for a given
+       // complement of the probability Q = 1 - P.
+       static const char* function = "boost::math::quantile(const geometric_distribution<%1%>&, %1%)";
+       BOOST_MATH_STD_USING
+       // Error checks:
+       RealType x = c.param;
+       const geometric_distribution<RealType, Policy>& dist = c.dist;
+       RealType success_fraction = dist.success_fraction();
+       RealType result = 0;
+       if(false == geometric_detail::check_dist_and_prob(
+          function,
+          success_fraction,
+          x,
+          &result, Policy()))
+       {
+          return result;
+       }
+
+       // Special cases:
+       if(x == 1)
+       {  // There may actually be no answer to this question,
+          // since the probability of zero failures may be non-zero,
+          return 0; // but zero is the best we can do:
+       }
+       if (-x <= boost::math::powm1(dist.success_fraction(), dist.successes(), Policy()))
+       {  // q <= cdf(complement(dist, 0)) == pdf(dist, 0)
+          return 0; //
+       }
+       if(x == 0)
+       {  // Probability 1 - Q  == 1 so infinite failures to achieve certainty.
+          // Would need +infinity failures for total confidence.
+          result = policies::raise_overflow_error<RealType>(
+             function,
+             "Probability argument complement is 0, which implies infinite failures !", Policy());
+          return result;
+          // usually means return +std::numeric_limits<RealType>::infinity();
+          // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+       }
+       // log(x) /log(1-success_fraction) -1; but use log1p in case success_fraction is small
+       result = log(x) / boost::math::log1p(-success_fraction, Policy()) - 1;
+      return result;
+
+    } // quantile complement
+
+ } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#if defined (BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_SPECIAL_GEOMETRIC_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/hyperexponential.hpp b/gatb-core/thirdparty/boost/math/distributions/hyperexponential.hpp
new file mode 100644
index 0000000..4ed281c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/hyperexponential.hpp
@@ -0,0 +1,634 @@
+//  Copyright 2014 Marco Guazzone (marco.guazzone at gmail.com)
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This module implements the Hyper-Exponential distribution.
+//
+// References:
+// - "Queueing Theory in Manufacturing Systems Analysis and Design" by H.T. Papadopolous, C. Heavey and J. Browne (Chapman & Hall/CRC, 1993)
+// - http://reference.wolfram.com/language/ref/HyperexponentialDistribution.html
+// - http://en.wikipedia.org/wiki/Hyperexponential_distribution
+//
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL_HPP
+#define BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL_HPP
+
+
+#include <boost/config.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/exponential.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/size.hpp>
+#include <boost/type_traits/has_pre_increment.hpp>
+#include <cstddef>
+#include <iterator>
+#include <limits>
+#include <numeric>
+#include <utility>
+#include <vector>
+
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+# include <initializer_list>
+#endif
+
+#ifdef _MSC_VER
+# pragma warning (push)
+# pragma warning(disable:4127) // conditional expression is constant
+# pragma warning(disable:4389) // '==' : signed/unsigned mismatch in test_tools
+#endif // _MSC_VER
+
+namespace boost { namespace math {
+
+namespace detail {
+
+template <typename Dist>
+typename Dist::value_type generic_quantile(const Dist& dist, const typename Dist::value_type& p, const typename Dist::value_type& guess, bool comp, const char* function);
+
+} // Namespace detail
+
+
+template <typename RealT, typename PolicyT>
+class hyperexponential_distribution;
+
+
+namespace /*<unnamed>*/ { namespace hyperexp_detail {
+
+template <typename T>
+void normalize(std::vector<T>& v)
+{
+   if(!v.size())
+      return;  // Our error handlers will get this later
+    const T sum = std::accumulate(v.begin(), v.end(), static_cast<T>(0));
+    T final_sum = 0;
+    const typename std::vector<T>::iterator end = --v.end();
+    for (typename std::vector<T>::iterator it = v.begin();
+         it != end;
+         ++it)
+    {
+        *it /= sum;
+        final_sum += *it;
+    }
+    *end = 1 - final_sum;  // avoids round off errors, ensures the probs really do sum to 1.
+}
+
+template <typename RealT, typename PolicyT>
+bool check_probabilities(char const* function, std::vector<RealT> const& probabilities, RealT* presult, PolicyT const& pol)
+{
+    BOOST_MATH_STD_USING
+    const std::size_t n = probabilities.size();
+    RealT sum = 0;
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        if (probabilities[i] < 0
+            || probabilities[i] > 1
+            || !(boost::math::isfinite)(probabilities[i]))
+        {
+            *presult = policies::raise_domain_error<RealT>(function,
+                                                           "The elements of parameter \"probabilities\" must be >= 0 and <= 1, but at least one of them was: %1%.",
+                                                           probabilities[i],
+                                                           pol);
+            return false;
+        }
+        sum += probabilities[i];
+    }
+
+    //
+    // We try to keep phase probabilities correctly normalized in the distribution constructors,
+    // however in practice we have to allow for a very slight divergence from a sum of exactly 1:
+    //
+    if (fabs(sum - 1) > tools::epsilon<RealT>() * 2)
+    {
+        *presult = policies::raise_domain_error<RealT>(function,
+                                                       "The elements of parameter \"probabilities\" must sum to 1, but their sum is: %1%.",
+                                                       sum,
+                                                       pol);
+        return false;
+    }
+
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_rates(char const* function, std::vector<RealT> const& rates, RealT* presult, PolicyT const& pol)
+{
+    const std::size_t n = rates.size();
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        if (rates[i] <= 0
+            || !(boost::math::isfinite)(rates[i]))
+        {
+            *presult = policies::raise_domain_error<RealT>(function,
+                                                           "The elements of parameter \"rates\" must be > 0, but at least one of them is: %1%.",
+                                                           rates[i],
+                                                           pol);
+            return false;
+        }
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_dist(char const* function, std::vector<RealT> const& probabilities, std::vector<RealT> const& rates, RealT* presult, PolicyT const& pol)
+{
+    BOOST_MATH_STD_USING
+    if (probabilities.size() != rates.size())
+    {
+        *presult = policies::raise_domain_error<RealT>(function,
+                                                       "The parameters \"probabilities\" and \"rates\" must have the same length, but their size differ by: %1%.",
+                                                       fabs(static_cast<RealT>(probabilities.size())-static_cast<RealT>(rates.size())),
+                                                       pol);
+        return false;
+    }
+
+    return check_probabilities(function, probabilities, presult, pol)
+           && check_rates(function, rates, presult, pol);
+}
+
+template <typename RealT, typename PolicyT>
+bool check_x(char const* function, RealT x, RealT* presult, PolicyT const& pol)
+{
+    if (x < 0 || (boost::math::isnan)(x))
+    {
+        *presult = policies::raise_domain_error<RealT>(function, "The random variable must be >= 0, but is: %1%.", x, pol);
+        return false;
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_probability(char const* function, RealT p, RealT* presult, PolicyT const& pol)
+{
+    if (p < 0 || p > 1 || (boost::math::isnan)(p))
+    {
+        *presult = policies::raise_domain_error<RealT>(function, "The probability be >= 0 and <= 1, but is: %1%.", p, pol);
+        return false;
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+RealT quantile_impl(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& p, bool comp)
+{
+    // Don't have a closed form so try to numerically solve the inverse CDF...
+
+    typedef typename policies::evaluation<RealT, PolicyT>::type value_type;
+    typedef typename policies::normalise<PolicyT,
+                                         policies::promote_float<false>,
+                                         policies::promote_double<false>,
+                                         policies::discrete_quantile<>,
+                                         policies::assert_undefined<> >::type forwarding_policy;
+
+    static const char* function = comp ? "boost::math::quantile(const boost::math::complemented2_type<boost::math::hyperexponential_distribution<%1%>, %1%>&)"
+                                       : "boost::math::quantile(const boost::math::hyperexponential_distribution<%1%>&, %1%)";
+
+    RealT result = 0;
+
+    if (!check_probability(function, p, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    // A possible (but inaccurate) approximation is given below, where the
+    // quantile is given by the weighted sum of exponential quantiles:
+    RealT guess = 0;
+    if (comp)
+    {
+        for (std::size_t i = 0; i < n; ++i)
+        {
+            const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+            guess += probs[i]*quantile(complement(exp, p));
+        }
+    }
+    else
+    {
+        for (std::size_t i = 0; i < n; ++i)
+        {
+            const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+            guess += probs[i]*quantile(exp, p);
+        }
+    }
+
+    // Fast return in case the Hyper-Exponential is essentially an Exponential
+    if (n == 1)
+    {
+        return guess;
+    }
+
+    value_type q;
+    q = detail::generic_quantile(hyperexponential_distribution<RealT,forwarding_policy>(probs, rates),
+                                 p,
+                                 guess,
+                                 comp,
+                                 function);
+
+    result = policies::checked_narrowing_cast<RealT,forwarding_policy>(q, function);
+
+    return result;
+}
+
+}} // Namespace <unnamed>::hyperexp_detail
+
+
+template <typename RealT = double, typename PolicyT = policies::policy<> >
+class hyperexponential_distribution
+{
+    public: typedef RealT value_type;
+    public: typedef PolicyT policy_type;
+
+
+    public: hyperexponential_distribution()
+    : probs_(1, 1),
+      rates_(1, 1)
+    {
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Four arg constructor: no ambiguity here, the arguments must be two pairs of iterators:
+    public: template <typename ProbIterT, typename RateIterT>
+            hyperexponential_distribution(ProbIterT prob_first, ProbIterT prob_last,
+                                          RateIterT rate_first, RateIterT rate_last)
+    : probs_(prob_first, prob_last),
+      rates_(rate_first, rate_last)
+    {
+        hyperexp_detail::normalize(probs_);
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Two arg constructor from 2 ranges, we SFINAE this out of existance if
+    // either argument type is incrementable as in that case the type is
+    // probably an iterator:
+    public: template <typename ProbRangeT, typename RateRangeT>
+            hyperexponential_distribution(ProbRangeT const& prob_range,
+                                          RateRangeT const& rate_range,
+                                          typename boost::disable_if_c<boost::has_pre_increment<ProbRangeT>::value || boost::has_pre_increment<RateRangeT>::value>::type* = 0)
+    : probs_(boost::begin(prob_range), boost::end(prob_range)),
+      rates_(boost::begin(rate_range), boost::end(rate_range))
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Two arg constructor for a pair of iterators: we SFINAE this out of
+    // existance if neither argument types are incrementable.
+    // Note that we allow different argument types here to allow for
+    // construction from an array plus a pointer into that array.
+    public: template <typename RateIterT, typename RateIterT2>
+            hyperexponential_distribution(RateIterT const& rate_first, 
+                                          RateIterT2 const& rate_last, 
+                                          typename boost::enable_if_c<boost::has_pre_increment<RateIterT>::value || boost::has_pre_increment<RateIterT2>::value>::type* = 0)
+    : probs_(std::distance(rate_first, rate_last), 1), // will be normalized below
+      rates_(rate_first, rate_last)
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+      // Initializer list constructor: allows for construction from array literals:
+public: hyperexponential_distribution(std::initializer_list<RealT> l1, std::initializer_list<RealT> l2)
+      : probs_(l1.begin(), l1.end()),
+        rates_(l2.begin(), l2.end())
+      {
+         hyperexp_detail::normalize(probs_);
+
+         RealT err;
+         hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+            probs_,
+            rates_,
+            &err,
+            PolicyT());
+      }
+
+public: hyperexponential_distribution(std::initializer_list<RealT> l1)
+      : probs_(l1.size(), 1),
+        rates_(l1.begin(), l1.end())
+      {
+         hyperexp_detail::normalize(probs_);
+
+         RealT err;
+         hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+            probs_,
+            rates_,
+            &err,
+            PolicyT());
+      }
+#endif // !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+
+    // Single argument constructor: argument must be a range.
+    public: template <typename RateRangeT>
+    hyperexponential_distribution(RateRangeT const& rate_range)
+    : probs_(boost::size(rate_range), 1), // will be normalized below
+      rates_(boost::begin(rate_range), boost::end(rate_range))
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    public: std::vector<RealT> probabilities() const
+    {
+        return probs_;
+    }
+
+    public: std::vector<RealT> rates() const
+    {
+        return rates_;
+    }
+
+    public: std::size_t num_phases() const
+    {
+        return rates_.size();
+    }
+
+
+    private: std::vector<RealT> probs_;
+    private: std::vector<RealT> rates_;
+}; // class hyperexponential_distribution
+
+
+// Convenient type synonym for double.
+typedef hyperexponential_distribution<double> hyperexponential;
+
+
+// Range of permissible values for random variable x
+template <typename RealT, typename PolicyT>
+std::pair<RealT,RealT> range(hyperexponential_distribution<RealT,PolicyT> const&)
+{
+    if (std::numeric_limits<RealT>::has_infinity)
+    {
+        return std::make_pair(static_cast<RealT>(0), std::numeric_limits<RealT>::infinity()); // 0 to +inf.
+    }
+
+    return std::make_pair(static_cast<RealT>(0), tools::max_value<RealT>()); // 0 to +<max value>
+}
+
+// Range of supported values for random variable x.
+// This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+template <typename RealT, typename PolicyT>
+std::pair<RealT,RealT> support(hyperexponential_distribution<RealT,PolicyT> const&)
+{
+    return std::make_pair(tools::min_value<RealT>(), tools::max_value<RealT>()); // <min value> to +<max value>.
+}
+
+template <typename RealT, typename PolicyT>
+RealT pdf(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& x)
+{
+    BOOST_MATH_STD_USING
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::pdf(const boost::math::hyperexponential_distribution<%1%>&, %1%)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*pdf(exp, x);
+        //result += probs[i]*rates[i]*exp(-rates[i]*x);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT cdf(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& x)
+{
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::cdf(const boost::math::hyperexponential_distribution<%1%>&, %1%)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*cdf(exp, x);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT quantile(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& p)
+{
+    return hyperexp_detail::quantile_impl(dist, p , false);
+}
+
+template <typename RealT, typename PolicyT>
+RealT cdf(complemented2_type<hyperexponential_distribution<RealT,PolicyT>, RealT> const& c)
+{
+    RealT const& x = c.param;
+    hyperexponential_distribution<RealT,PolicyT> const& dist = c.dist;
+
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::cdf(boost::math::complemented2_type<const boost::math::hyperexponential_distribution<%1%>&, %1%>)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*cdf(complement(exp, x));
+    }
+
+    return result;
+}
+
+
+template <typename RealT, typename PolicyT>
+RealT quantile(complemented2_type<hyperexponential_distribution<RealT, PolicyT>, RealT> const& c)
+{
+    RealT const& p = c.param;
+    hyperexponential_distribution<RealT,PolicyT> const& dist = c.dist;
+
+    return hyperexp_detail::quantile_impl(dist, p , true);
+}
+
+template <typename RealT, typename PolicyT>
+RealT mean(hyperexponential_distribution<RealT, PolicyT> const& dist)
+{
+    RealT result = 0;
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*mean(exp);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT variance(hyperexponential_distribution<RealT, PolicyT> const& dist)
+{
+    RealT result = 0;
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        result += probs[i]/(rates[i]*rates[i]);
+    }
+
+    const RealT mean = boost::math::mean(dist);
+
+    result = 2*result-mean*mean;
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT skewness(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    BOOST_MATH_STD_USING
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    RealT s1 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i}
+    RealT s2 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^2}
+    RealT s3 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^3}
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const RealT p = probs[i];
+        const RealT r = rates[i];
+        const RealT r2 = r*r;
+        const RealT r3 = r2*r;
+
+        s1 += p/r;
+        s2 += p/r2;
+        s3 += p/r3;
+    }
+
+    const RealT s1s1 = s1*s1;
+
+    const RealT num = (6*s3 - (3*(2*s2 - s1s1) + s1s1)*s1);
+    const RealT den = (2*s2 - s1s1);
+
+    return num / pow(den, static_cast<RealT>(1.5));
+}
+
+template <typename RealT, typename PolicyT>
+RealT kurtosis(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    RealT s1 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i}
+    RealT s2 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^2}
+    RealT s3 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^3}
+    RealT s4 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^4}
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const RealT p = probs[i];
+        const RealT r = rates[i];
+        const RealT r2 = r*r;
+        const RealT r3 = r2*r;
+        const RealT r4 = r3*r;
+
+        s1 += p/r;
+        s2 += p/r2;
+        s3 += p/r3;
+        s4 += p/r4;
+    }
+
+    const RealT s1s1 = s1*s1;
+
+    const RealT num = (24*s4 - 24*s3*s1 + 3*(2*(2*s2 - s1s1) + s1s1)*s1s1);
+    const RealT den = (2*s2 - s1s1);
+
+    return num/(den*den);
+}
+
+template <typename RealT, typename PolicyT>
+RealT kurtosis_excess(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    return kurtosis(dist) - 3;
+}
+
+template <typename RealT, typename PolicyT>
+RealT mode(hyperexponential_distribution<RealT,PolicyT> const& /*dist*/)
+{
+    return 0;
+}
+
+}} // namespace boost::math
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+#include <boost/math/distributions/detail/generic_quantile.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL
diff --git a/gatb-core/thirdparty/boost/math/distributions/hypergeometric.hpp b/gatb-core/thirdparty/boost/math/distributions/hypergeometric.hpp
new file mode 100644
index 0000000..5d1ebc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/hypergeometric.hpp
@@ -0,0 +1,293 @@
+// Copyright 2008 Gautam Sewani
+// Copyright 2008 John Maddock
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_HYPERGEOMETRIC_HPP
+#define BOOST_MATH_DISTRIBUTIONS_HYPERGEOMETRIC_HPP
+
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+#include <boost/math/distributions/detail/hypergeometric_cdf.hpp>
+#include <boost/math/distributions/detail/hypergeometric_quantile.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+
+namespace boost { namespace math {
+
+   template <class RealType = double, class Policy = policies::policy<> >
+   class hypergeometric_distribution
+   {
+   public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      hypergeometric_distribution(unsigned r, unsigned n, unsigned N) // Constructor.
+         : m_n(n), m_N(N), m_r(r)
+      {
+         static const char* function = "boost::math::hypergeometric_distribution<%1%>::hypergeometric_distribution";
+         RealType ret;
+         check_params(function, &ret);
+      }
+      // Accessor functions.
+      unsigned total()const
+      {
+         return m_N;
+      }
+
+      unsigned defective()const
+      {
+         return m_n;
+      }
+
+      unsigned sample_count()const
+      {
+         return m_r;
+      }
+
+      bool check_params(const char* function, RealType* result)const
+      {
+         if(m_r > m_N)
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Parameter r out of range: must be <= N but got %1%", static_cast<RealType>(m_r), Policy());
+            return false;
+         }
+         if(m_n > m_N)
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Parameter n out of range: must be <= N but got %1%", static_cast<RealType>(m_n), Policy());
+            return false;
+         }
+         return true;
+      }
+      bool check_x(unsigned x, const char* function, RealType* result)const
+      {
+         if(x < static_cast<unsigned>((std::max)(0, (int)(m_n + m_r) - (int)(m_N))))
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Random variable out of range: must be > 0 and > m + r - N but got %1%", static_cast<RealType>(x), Policy());
+            return false;
+         }
+         if(x > (std::min)(m_r, m_n))
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Random variable out of range: must be less than both n and r but got %1%", static_cast<RealType>(x), Policy());
+            return false;
+         }
+         return true;
+      }
+
+   private:
+      // Data members:
+      unsigned m_n;  // number of "defective" items
+      unsigned m_N; // number of "total" items
+      unsigned m_r; // number of items picked
+
+   }; // class hypergeometric_distribution
+
+   typedef hypergeometric_distribution<double> hypergeometric;
+
+   template <class RealType, class Policy>
+   inline const std::pair<unsigned, unsigned> range(const hypergeometric_distribution<RealType, Policy>& dist)
+   { // Range of permissible values for random variable x.
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+      unsigned r = dist.sample_count();
+      unsigned n = dist.defective();
+      unsigned N = dist.total();
+      unsigned l = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+      unsigned u = (std::min)(r, n);
+      return std::pair<unsigned, unsigned>(l, u);
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+   }
+
+   template <class RealType, class Policy>
+   inline const std::pair<unsigned, unsigned> support(const hypergeometric_distribution<RealType, Policy>& d)
+   { 
+      return range(d);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType pdf(const hypergeometric_distribution<RealType, Policy>& dist, const unsigned& x)
+   {
+      static const char* function = "boost::math::pdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result = 0;
+      if(!dist.check_params(function, &result))
+         return result;
+      if(!dist.check_x(x, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_pdf<RealType>(
+         x, dist.sample_count(), dist.defective(), dist.total(), Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType pdf(const hypergeometric_distribution<RealType, Policy>& dist, const U& x)
+   {
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::pdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(x);
+      unsigned u = itrunc(r, typename policies::normalise<Policy, policies::rounding_error<policies::ignore_error> >::type());
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return pdf(dist, u);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType cdf(const hypergeometric_distribution<RealType, Policy>& dist, const unsigned& x)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result = 0;
+      if(!dist.check_params(function, &result))
+         return result;
+      if(!dist.check_x(x, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_cdf<RealType>(
+         x, dist.sample_count(), dist.defective(), dist.total(), false, Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType cdf(const hypergeometric_distribution<RealType, Policy>& dist, const U& x)
+   {
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(x);
+      unsigned u = itrunc(r, typename policies::normalise<Policy, policies::rounding_error<policies::ignore_error> >::type());
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return cdf(dist, u);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType cdf(const complemented2_type<hypergeometric_distribution<RealType, Policy>, unsigned>& c)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result = 0;
+      if(!c.dist.check_params(function, &result))
+         return result;
+      if(!c.dist.check_x(c.param, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_cdf<RealType>(
+         c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), true, Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType cdf(const complemented2_type<hypergeometric_distribution<RealType, Policy>, U>& c)
+   {
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(c.param);
+      unsigned u = itrunc(r, typename policies::normalise<Policy, policies::rounding_error<policies::ignore_error> >::type());
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return cdf(complement(c.dist, u));
+   }
+
+   template <class RealType, class Policy>
+   inline RealType quantile(const hypergeometric_distribution<RealType, Policy>& dist, const RealType& p)
+   {
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+         // Checking function argument
+         RealType result = 0;
+      const char* function = "boost::math::quantile(const hypergeometric_distribution<%1%>&, %1%)";
+      if (false == dist.check_params(function, &result)) return result;
+      if(false == detail::check_probability(function, p, &result, Policy())) return result;
+
+      return static_cast<RealType>(detail::hypergeometric_quantile(p, RealType(1 - p), dist.sample_count(), dist.defective(), dist.total(), Policy()));
+   } // quantile
+
+   template <class RealType, class Policy>
+   inline RealType quantile(const complemented2_type<hypergeometric_distribution<RealType, Policy>, RealType>& c)
+   {
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+      // Checking function argument
+      RealType result = 0;
+      const char* function = "quantile(const complemented2_type<hypergeometric_distribution<%1%>, %1%>&)";
+      if (false == c.dist.check_params(function, &result)) return result;
+      if(false == detail::check_probability(function, c.param, &result, Policy())) return result;
+
+      return static_cast<RealType>(detail::hypergeometric_quantile(RealType(1 - c.param), c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), Policy()));
+   } // quantile
+
+   template <class RealType, class Policy>
+   inline RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      return static_cast<RealType>(dist.sample_count() * dist.defective()) / dist.total();
+   } // RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return r * (n / N) * (1 - n / N) * (N - r) / (N - 1);
+   } // RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType mode(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      BOOST_MATH_STD_USING
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return floor((r + 1) * (n + 1) / (N + 2));
+   }
+
+   template <class RealType, class Policy>
+   inline RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      BOOST_MATH_STD_USING
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return (N - 2 * n) * sqrt(N - 1) * (N - 2 * r) / (sqrt(n * r * (N - n) * (N - r)) * (N - 2));
+   } // RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      RealType t1 = N * N * (N - 1) / (r * (N - 2) * (N - 3) * (N - r));
+      RealType t2 = (N * (N + 1) - 6 * N * (N - r)) / (n * (N - n))
+         + 3 * r * (N - r) * (N + 6) / (N * N) - 6;
+      return t1 * t2;
+   } // RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType kurtosis(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      return kurtosis_excess(dist) + 3;
+   } // RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+}} // namespaces
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // include guard
diff --git a/gatb-core/thirdparty/boost/math/distributions/inverse_chi_squared.hpp b/gatb-core/thirdparty/boost/math/distributions/inverse_chi_squared.hpp
new file mode 100644
index 0000000..c1e5490
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/inverse_chi_squared.hpp
@@ -0,0 +1,391 @@
+// Copyright John Maddock 2010.
+// Copyright Paul A. Bristow 2010.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_INVERSE_CHI_SQUARED_HPP
+#define BOOST_MATH_DISTRIBUTIONS_INVERSE_CHI_SQUARED_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp> // for incomplete beta.
+#include <boost/math/distributions/complement.hpp> // for complements.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // for error checks.
+#include <boost/math/special_functions/fpclassify.hpp> // for isfinite
+
+// See http://en.wikipedia.org/wiki/Scaled-inverse-chi-square_distribution
+// for definitions of this scaled version.
+// See http://en.wikipedia.org/wiki/Inverse-chi-square_distribution
+// for unscaled version.
+
+// http://reference.wolfram.com/mathematica/ref/InverseChiSquareDistribution.html
+// Weisstein, Eric W. "Inverse Chi-Squared Distribution." From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/InverseChi-SquaredDistribution.html
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+namespace detail
+{
+  template <class RealType, class Policy>
+  inline bool check_inverse_chi_squared( // Check both distribution parameters.
+        const char* function,
+        RealType degrees_of_freedom, // degrees_of_freedom (aka nu).
+        RealType scale,  // scale (aka sigma^2)
+        RealType* result,
+        const Policy& pol)
+  {
+     return check_scale(function, scale, result, pol)
+       && check_df(function, degrees_of_freedom,
+       result, pol);
+  } // bool check_inverse_chi_squared
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class inverse_chi_squared_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   inverse_chi_squared_distribution(RealType df, RealType l_scale) : m_df(df), m_scale (l_scale)
+   {
+      RealType result;
+      detail::check_df(
+         "boost::math::inverse_chi_squared_distribution<%1%>::inverse_chi_squared_distribution",
+         m_df, &result, Policy())
+         && detail::check_scale(
+"boost::math::inverse_chi_squared_distribution<%1%>::inverse_chi_squared_distribution",
+         m_scale, &result,  Policy());
+   } // inverse_chi_squared_distribution constructor 
+
+   inverse_chi_squared_distribution(RealType df = 1) : m_df(df)
+   {
+      RealType result;
+      m_scale = 1 / m_df ; // Default scale = 1 / degrees of freedom (Wikipedia definition 1).
+      detail::check_df(
+         "boost::math::inverse_chi_squared_distribution<%1%>::inverse_chi_squared_distribution",
+         m_df, &result, Policy());
+   } // inverse_chi_squared_distribution
+
+   RealType degrees_of_freedom()const
+   {
+      return m_df; // aka nu
+   }
+   RealType scale()const
+   {
+      return m_scale;  // aka xi
+   }
+
+   // Parameter estimation:  NOT implemented yet.
+   //static RealType find_degrees_of_freedom(
+   //   RealType difference_from_variance,
+   //   RealType alpha,
+   //   RealType beta,
+   //   RealType variance,
+   //   RealType hint = 100);
+
+private:
+   // Data members:
+   RealType m_df;  // degrees of freedom are treated as a real number.
+   RealType m_scale;  // distribution scale.
+
+}; // class chi_squared_distribution
+
+typedef inverse_chi_squared_distribution<double> inverse_chi_squared;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const inverse_chi_squared_distribution<RealType, Policy>& /*dist*/)
+{  // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // 0 to + infinity.
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const inverse_chi_squared_distribution<RealType, Policy>& /*dist*/)
+{  // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), tools::max_value<RealType>()); // 0 to + infinity.
+}
+
+template <class RealType, class Policy>
+RealType pdf(const inverse_chi_squared_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions.
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+   RealType error_result;
+
+   static const char* function = "boost::math::pdf(const inverse_chi_squared_distribution<%1%>&, %1%)";
+
+   if(false == detail::check_inverse_chi_squared
+     (function, df, scale, &error_result, Policy())
+     )
+   { // Bad distribution.
+      return error_result;
+   }
+   if((x < 0) || !(boost::math::isfinite)(x))
+   { // Bad x.
+      return policies::raise_domain_error<RealType>(
+         function, "inverse Chi Square parameter was %1%, but must be >= 0 !", x, Policy());
+   }
+
+   if(x == 0)
+   { // Treat as special case.
+     return 0;
+   }
+   // Wikipedia scaled inverse chi sq (df, scale) related to inv gamma (df/2, df * scale /2) 
+   // so use inverse gamma pdf with shape = df/2, scale df * scale /2 
+   // RealType shape = df /2; // inv_gamma shape
+   // RealType scale = df * scale/2; // inv_gamma scale
+   // RealType result = gamma_p_derivative(shape, scale / x, Policy()) * scale / (x * x);
+   RealType result = df * scale/2 / x;
+   if(result < tools::min_value<RealType>())
+      return 0; // Random variable is near enough infinite.
+   result = gamma_p_derivative(df/2, result, Policy()) * df * scale/2;
+   if(result != 0) // prevent 0 / 0,  gamma_p_derivative -> 0 faster than x^2
+      result /= (x * x);
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const inverse_chi_squared_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   static const char* function = "boost::math::cdf(const inverse_chi_squared_distribution<%1%>&, %1%)";
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+   RealType error_result;
+
+   if(false ==
+       detail::check_inverse_chi_squared(function, df, scale, &error_result, Policy())
+     )
+   { // Bad distribution.
+      return error_result;
+   }
+   if((x < 0) || !(boost::math::isfinite)(x))
+   { // Bad x.
+      return policies::raise_domain_error<RealType>(
+         function, "inverse Chi Square parameter was %1%, but must be >= 0 !", x, Policy());
+   }
+   if (x == 0)
+   { // Treat zero as a special case.
+     return 0;
+   }
+   // RealType shape = df /2; // inv_gamma shape,
+   // RealType scale = df * scale/2; // inv_gamma scale,
+   // result = boost::math::gamma_q(shape, scale / x, Policy()); // inverse_gamma code.
+   return boost::math::gamma_q(df / 2, (df * (scale / 2)) / x, Policy());
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const inverse_chi_squared_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   using boost::math::gamma_q_inv;
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+
+   static const char* function = "boost::math::quantile(const inverse_chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false == detail::check_df(
+         function, df, &error_result, Policy())
+         && detail::check_probability(
+            function, p, &error_result, Policy()))
+   {
+      return error_result;
+   }
+   if(false == detail::check_probability(
+            function, p, &error_result, Policy()))
+   {
+      return error_result;
+   }
+   // RealType shape = df /2; // inv_gamma shape,
+   // RealType scale = df * scale/2; // inv_gamma scale,
+   // result = scale / gamma_q_inv(shape, p, Policy());
+      RealType result = gamma_q_inv(df /2, p, Policy());
+      if(result == 0)
+         return policies::raise_overflow_error<RealType, Policy>(function, "Random variable is infinite.", Policy());
+      result = df * (scale / 2) / result;
+      return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<inverse_chi_squared_distribution<RealType, Policy>, RealType>& c)
+{
+   using boost::math::gamma_q_inv;
+   RealType const& df = c.dist.degrees_of_freedom();
+   RealType const& scale = c.dist.scale();
+   RealType const& x = c.param;
+   static const char* function = "boost::math::cdf(const inverse_chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false == detail::check_df(
+         function, df, &error_result, Policy()))
+   {
+      return error_result;
+   }
+   if (x == 0)
+   { // Treat zero as a special case.
+     return 1;
+   }
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      return policies::raise_domain_error<RealType>(
+         function, "inverse Chi Square parameter was %1%, but must be > 0 !", x, Policy());
+   }
+   // RealType shape = df /2; // inv_gamma shape,
+   // RealType scale = df * scale/2; // inv_gamma scale,
+   // result = gamma_p(shape, scale/c.param, Policy()); use inv_gamma.
+
+   return gamma_p(df / 2, (df * scale/2) / x, Policy()); // OK
+} // cdf(complemented
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<inverse_chi_squared_distribution<RealType, Policy>, RealType>& c)
+{
+   using boost::math::gamma_q_inv;
+
+   RealType const& df = c.dist.degrees_of_freedom();
+   RealType const& scale = c.dist.scale();
+   RealType const& q = c.param;
+   static const char* function = "boost::math::quantile(const inverse_chi_squared_distribution<%1%>&, %1%)";
+   // Error check:
+   RealType error_result;
+   if(false == detail::check_df(function, df, &error_result, Policy()))
+   {
+      return error_result;
+   }
+   if(false == detail::check_probability(function, q, &error_result, Policy()))
+   {
+      return error_result;
+   }
+   // RealType shape = df /2; // inv_gamma shape,
+   // RealType scale = df * scale/2; // inv_gamma scale,
+   // result = scale / gamma_p_inv(shape, q, Policy());  // using inv_gamma.
+   RealType result = gamma_p_inv(df/2, q, Policy());
+   if(result == 0)
+      return policies::raise_overflow_error<RealType, Policy>(function, "Random variable is infinite.", Policy());
+   result = (df * scale / 2) / result;
+   return result;
+} // quantile(const complement
+
+template <class RealType, class Policy>
+inline RealType mean(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{ // Mean of inverse Chi-Squared distribution.
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+
+   static const char* function = "boost::math::mean(const inverse_chi_squared_distribution<%1%>&)";
+   if(df <= 2)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a mode for degrees of freedom > 2, but got degrees of freedom = %1%.",
+         df, Policy());
+  return (df * scale) / (df - 2);
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{ // Variance of inverse Chi-Squared distribution.
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+   static const char* function = "boost::math::variance(const inverse_chi_squared_distribution<%1%>&)";
+   if(df <= 4)
+   {
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a variance for degrees of freedom > 4, but got degrees of freedom = %1%.",
+         df, Policy());
+   }
+   return 2 * df * df * scale * scale / ((df - 2)*(df - 2) * (df - 4));
+} // variance
+
+template <class RealType, class Policy>
+inline RealType mode(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{ // mode is not defined in Mathematica.
+  // See Discussion section http://en.wikipedia.org/wiki/Talk:Scaled-inverse-chi-square_distribution
+  // for origin of the formula used below.
+
+   RealType df = dist.degrees_of_freedom();
+   RealType scale = dist.scale();
+   static const char* function = "boost::math::mode(const inverse_chi_squared_distribution<%1%>&)";
+   if(df < 0)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a mode for degrees of freedom >= 0, but got degrees of freedom = %1%.",
+         df, Policy());
+   return (df * scale) / (df + 2);
+}
+
+//template <class RealType, class Policy>
+//inline RealType median(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+//{ // Median is given by Quantile[dist, 1/2]
+//   RealType df = dist.degrees_of_freedom();
+//   if(df <= 1)
+//      return tools::domain_error<RealType>(
+//         BOOST_CURRENT_FUNCTION,
+//         "The inverse_Chi-Squared distribution only has a median for degrees of freedom >= 0, but got degrees of freedom = %1%.",
+//         df);
+//   return df;
+//}
+// Now implemented via quantile(half) in derived accessors.
+
+template <class RealType, class Policy>
+inline RealType skewness(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING // For ADL
+   RealType df = dist.degrees_of_freedom();
+   static const char* function = "boost::math::skewness(const inverse_chi_squared_distribution<%1%>&)";
+   if(df <= 6)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a skewness for degrees of freedom > 6, but got degrees of freedom = %1%.",
+         df, Policy());
+
+   return 4 * sqrt (2 * (df - 4)) / (df - 6);  // Not a function of scale.
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   static const char* function = "boost::math::kurtosis(const inverse_chi_squared_distribution<%1%>&)";
+   if(df <= 8)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a kurtosis for degrees of freedom > 8, but got degrees of freedom = %1%.",
+         df, Policy());
+
+   return kurtosis_excess(dist) + 3;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const inverse_chi_squared_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   static const char* function = "boost::math::kurtosis(const inverse_chi_squared_distribution<%1%>&)";
+   if(df <= 8)
+      return policies::raise_domain_error<RealType>(
+         function,
+         "inverse Chi-Squared distribution only has a kurtosis excess for degrees of freedom > 8, but got degrees of freedom = %1%.",
+         df, Policy());
+
+   return 12 * (5 * df - 22) / ((df - 6 )*(df - 8));  // Not a function of scale.
+}
+
+//
+// Parameter estimation comes last:
+//
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_INVERSE_CHI_SQUARED_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/inverse_gamma.hpp b/gatb-core/thirdparty/boost/math/distributions/inverse_gamma.hpp
new file mode 100644
index 0000000..fa5d357
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/inverse_gamma.hpp
@@ -0,0 +1,461 @@
+// inverse_gamma.hpp
+
+//  Copyright Paul A. Bristow 2010.
+//  Copyright John Maddock 2010.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_INVERSE_GAMMA_HPP
+#define BOOST_STATS_INVERSE_GAMMA_HPP
+
+// Inverse Gamma Distribution is a two-parameter family
+// of continuous probability distributions
+// on the positive real line, which is the distribution of
+// the reciprocal of a variable distributed according to the gamma distribution.
+
+// http://en.wikipedia.org/wiki/Inverse-gamma_distribution
+// http://rss.acs.unt.edu/Rdoc/library/pscl/html/igamma.html
+
+// See also gamma distribution at gamma.hpp:
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda366b.htm
+// http://mathworld.wolfram.com/GammaDistribution.html
+// http://en.wikipedia.org/wiki/Gamma_distribution
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+namespace detail
+{
+
+template <class RealType, class Policy>
+inline bool check_inverse_gamma_shape(
+      const char* function, // inverse_gamma
+      RealType shape, // shape aka alpha
+      RealType* result, // to update, perhaps with NaN
+      const Policy& pol)
+{  // Sources say shape argument must be > 0
+   // but seems logical to allow shape zero as special case,
+   // returning pdf and cdf zero (but not < 0).
+   // (Functions like mean, variance with other limits on shape are checked
+   // in version including an operator & limit below).
+   if((shape < 0) || !(boost::math::isfinite)(shape))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Shape parameter is %1%, but must be >= 0 !", shape, pol);
+      return false;
+   }
+   return true;
+} //bool check_inverse_gamma_shape
+
+template <class RealType, class Policy>
+inline bool check_inverse_gamma_x(
+      const char* function,
+      RealType const& x,
+      RealType* result, const Policy& pol)
+{
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate is %1% but must be >= 0 !", x, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_inverse_gamma(
+      const char* function, // TODO swap these over, so shape is first.
+      RealType scale,  // scale aka beta
+      RealType shape, // shape aka alpha
+      RealType* result, const Policy& pol)
+{
+   return check_scale(function, scale, result, pol)
+     && check_inverse_gamma_shape(function, shape, result, pol);
+} // bool check_inverse_gamma
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class inverse_gamma_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   inverse_gamma_distribution(RealType l_shape = 1, RealType l_scale = 1)
+      : m_shape(l_shape), m_scale(l_scale)
+   {
+      RealType result;
+      detail::check_inverse_gamma(
+        "boost::math::inverse_gamma_distribution<%1%>::inverse_gamma_distribution",
+        l_scale, l_shape, &result, Policy());
+   }
+
+   RealType shape()const
+   {
+      return m_shape;
+   }
+
+   RealType scale()const
+   {
+      return m_scale;
+   }
+private:
+   //
+   // Data members:
+   //
+   RealType m_shape;     // distribution shape
+   RealType m_scale;     // distribution scale
+};
+
+typedef inverse_gamma_distribution<double> inverse_gamma;
+// typedef - but potential clash with name of inverse gamma *function*.
+// but there is a typedef for gamma
+//   typedef boost::math::gamma_distribution<Type, Policy> gamma;
+
+// Allow random variable x to be zero, treated as a special case (unlike some definitions).
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const inverse_gamma_distribution<RealType, Policy>& /* dist */)
+{  // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const inverse_gamma_distribution<RealType, Policy>& /* dist */)
+{  // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   using boost::math::tools::min_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const inverse_gamma_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(const inverse_gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+   { // distribution parameters bad.
+      return result;
+   } 
+   if(x == 0)
+   { // Treat random variate zero as a special case.
+      return 0;
+   }
+   else if(false == detail::check_inverse_gamma_x(function, x, &result, Policy()))
+   { // x bad.
+      return result;
+   }
+   result = scale / x;
+   if(result < tools::min_value<RealType>())
+      return 0;  // random variable is infinite or so close as to make no difference.
+   result = gamma_p_derivative(shape, result, Policy()) * scale;
+   if(0 != result)
+   {
+      if(x < 0)
+      {
+         // x * x may under or overflow, likewise our result,
+         // so be extra careful about the arithmetic:
+         RealType lim = tools::max_value<RealType>() * x;
+         if(lim < result)
+            return policies::raise_overflow_error<RealType, Policy>(function, "PDF is infinite.", Policy());
+         result /= x;
+         if(lim < result)
+            return policies::raise_overflow_error<RealType, Policy>(function, "PDF is infinite.", Policy());
+         result /= x;
+      }
+      result /= (x * x);
+   }
+   // better than naive
+   // result = (pow(scale, shape) * pow(x, (-shape -1)) * exp(-scale/x) ) / tgamma(shape);
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const inverse_gamma_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const inverse_gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+   { // distribution parameters bad.
+      return result;
+   }
+   if (x == 0)
+   { // Treat zero as a special case.
+     return 0;
+   }
+   else if(false == detail::check_inverse_gamma_x(function, x, &result, Policy()))
+   { // x bad
+      return result;
+   }
+   result = boost::math::gamma_q(shape, scale / x, Policy());
+   // result = tgamma(shape, scale / x) / tgamma(shape); // naive using tgamma
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const inverse_gamma_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+   using boost::math::gamma_q_inv;
+
+   static const char* function = "boost::math::quantile(const inverse_gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+   if(p == 1)
+   {
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   result = gamma_q_inv(shape, p, Policy());
+   if((result < 1) && (result * tools::max_value<RealType>() < scale))
+      return policies::raise_overflow_error<RealType, Policy>(function, "Value of random variable in inverse gamma distribution quantile is infinite.", Policy());
+   result = scale / result;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<inverse_gamma_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_inverse_gamma_x(function, c.param, &result, Policy()))
+      return result;
+
+   if(c.param == 0)
+      return 1; // Avoid division by zero
+
+   //result = 1. - gamma_q(shape, c.param / scale, Policy());
+   result = gamma_p(shape, scale/c.param, Policy());
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<inverse_gamma_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const inverse_gamma_distribution<%1%>&, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+   RealType q = c.param;
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   if(q == 0)
+   {
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   result = gamma_p_inv(shape, q, Policy());
+   if((result < 1) && (result * tools::max_value<RealType>() < scale))
+      return policies::raise_overflow_error<RealType, Policy>(function, "Value of random variable in inverse gamma distribution quantile is infinite.", Policy());
+   result = scale / result;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::mean(const inverse_gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+     return result;
+   }
+   if((shape <= 1) || !(boost::math::isfinite)(shape))
+   {
+     result = policies::raise_domain_error<RealType>(
+       function,
+       "Shape parameter is %1%, but for a defined mean it must be > 1", shape, Policy());
+     return result;
+   }
+  result = scale / (shape - 1);
+  return result;
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::variance(const inverse_gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+      if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+     return result;
+   }
+   if((shape <= 2) || !(boost::math::isfinite)(shape))
+   {
+     result = policies::raise_domain_error<RealType>(
+       function,
+       "Shape parameter is %1%, but for a defined variance it must be > 2", shape, Policy());
+     return result;
+   }
+   result = (scale * scale) / ((shape - 1) * (shape -1) * (shape -2));
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::mode(const inverse_gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_inverse_gamma(function, scale, shape, &result, Policy()))
+   {
+      return result;
+   }
+   // Only defined for shape >= 0, but is checked by check_inverse_gamma.
+   result = scale / (shape + 1);
+   return result;
+}
+
+//template <class RealType, class Policy>
+//inline RealType median(const gamma_distribution<RealType, Policy>& dist)
+//{  // Wikipedia does not define median,
+     // so rely on default definition quantile(0.5) in derived accessors.
+//  return result.
+//}
+
+template <class RealType, class Policy>
+inline RealType skewness(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::skewness(const inverse_gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+   RealType result = 0;
+
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+     return result;
+   }
+   if((shape <= 3) || !(boost::math::isfinite)(shape))
+   {
+     result = policies::raise_domain_error<RealType>(
+       function,
+       "Shape parameter is %1%, but for a defined skewness it must be > 3", shape, Policy());
+     return result;
+   }
+   result = (4 * sqrt(shape - 2) ) / (shape - 3);
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::kurtosis_excess(const inverse_gamma_distribution<%1%>&)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+     return result;
+   }
+   if((shape <= 4) || !(boost::math::isfinite)(shape))
+   {
+     result = policies::raise_domain_error<RealType>(
+       function,
+       "Shape parameter is %1%, but for a defined kurtosis excess it must be > 4", shape, Policy());
+     return result;
+   }
+   result = (30 * shape - 66) / ((shape - 3) * (shape - 4));
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const inverse_gamma_distribution<RealType, Policy>& dist)
+{
+  static const char* function = "boost::math::kurtosis(const inverse_gamma_distribution<%1%>&)";
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+
+  if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+     return result;
+   }
+   if((shape <= 4) || !(boost::math::isfinite)(shape))
+   {
+     result = policies::raise_domain_error<RealType>(
+       function,
+       "Shape parameter is %1%, but for a defined kurtosis it must be > 4", shape, Policy());
+     return result;
+   }
+  return kurtosis_excess(dist) + 3;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_INVERSE_GAMMA_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/inverse_gaussian.hpp b/gatb-core/thirdparty/boost/math/distributions/inverse_gaussian.hpp
new file mode 100644
index 0000000..eeca12a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/inverse_gaussian.hpp
@@ -0,0 +1,512 @@
+//  Copyright John Maddock 2010.
+//  Copyright Paul A. Bristow 2010.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_INVERSE_GAUSSIAN_HPP
+#define BOOST_STATS_INVERSE_GAUSSIAN_HPP
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4512) // assignment operator could not be generated
+#endif
+
+// http://en.wikipedia.org/wiki/Normal-inverse_Gaussian_distribution
+// http://mathworld.wolfram.com/InverseGaussianDistribution.html
+
+// The normal-inverse Gaussian distribution
+// also called the Wald distribution (some sources limit this to when mean = 1).
+
+// It is the continuous probability distribution
+// that is defined as the normal variance-mean mixture where the mixing density is the 
+// inverse Gaussian distribution. The tails of the distribution decrease more slowly
+// than the normal distribution. It is therefore suitable to model phenomena
+// where numerically large values are more probable than is the case for the normal distribution.
+
+// The Inverse Gaussian distribution was first studied in relationship to Brownian motion.
+// In 1956 M.C.K. Tweedie used the name 'Inverse Gaussian' because there is an inverse 
+// relationship between the time to cover a unit distance and distance covered in unit time.
+
+// Examples are returns from financial assets and turbulent wind speeds. 
+// The normal-inverse Gaussian distributions form
+// a subclass of the generalised hyperbolic distributions.
+
+// See also
+
+// http://en.wikipedia.org/wiki/Normal_distribution
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm
+// Also:
+// Weisstein, Eric W. "Normal Distribution."
+// From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/NormalDistribution.html
+
+// http://www.jstatsoft.org/v26/i04/paper General class of inverse Gaussian distributions.
+// ig package - withdrawn but at http://cran.r-project.org/src/contrib/Archive/ig/
+
+// http://www.stat.ucl.ac.be/ISdidactique/Rhelp/library/SuppDists/html/inverse_gaussian.html
+// R package for dinverse_gaussian, ...
+
+// http://www.statsci.org/s/inverse_gaussian.s  and http://www.statsci.org/s/inverse_gaussian.html
+
+//#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/erf.hpp> // for erf/erfc.
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/normal.hpp>
+#include <boost/math/distributions/gamma.hpp> // for gamma function
+// using boost::math::gamma_p;
+
+#include <boost/math/tools/tuple.hpp>
+//using std::tr1::tuple;
+//using std::tr1::make_tuple;
+#include <boost/math/tools/roots.hpp>
+//using boost::math::tools::newton_raphson_iterate;
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class inverse_gaussian_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   inverse_gaussian_distribution(RealType l_mean = 1, RealType l_scale = 1)
+      : m_mean(l_mean), m_scale(l_scale)
+   { // Default is a 1,1 inverse_gaussian distribution.
+     static const char* function = "boost::math::inverse_gaussian_distribution<%1%>::inverse_gaussian_distribution";
+
+     RealType result;
+     detail::check_scale(function, l_scale, &result, Policy());
+     detail::check_location(function, l_mean, &result, Policy());
+   }
+
+   RealType mean()const
+   { // alias for location.
+      return m_mean; // aka mu
+   }
+
+   // Synonyms, provided to allow generic use of find_location and find_scale.
+   RealType location()const
+   { // location, aka mu.
+      return m_mean;
+   }
+   RealType scale()const
+   { // scale, aka lambda.
+      return m_scale;
+   }
+
+   RealType shape()const
+   { // shape, aka phi = lambda/mu.
+      return m_scale / m_mean;
+   }
+
+private:
+   //
+   // Data members:
+   //
+   RealType m_mean;  // distribution mean or location, aka mu.
+   RealType m_scale;    // distribution standard deviation or scale, aka lambda.
+}; // class normal_distribution
+
+typedef inverse_gaussian_distribution<double> inverse_gaussian;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const inverse_gaussian_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x, zero to max.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0.), max_value<RealType>()); // - to + max value.
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const inverse_gaussian_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x, zero to max.
+  // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0.),  max_value<RealType>()); // - to + max value.
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const inverse_gaussian_distribution<RealType, Policy>& dist, const RealType& x)
+{ // Probability Density Function
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType scale = dist.scale();
+   RealType mean = dist.mean();
+   RealType result = 0;
+   static const char* function = "boost::math::pdf(const inverse_gaussian_distribution<%1%>&, %1%)";
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_location(function, mean, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_positive_x(function, x, &result, Policy()))
+   {
+      return result;
+   }
+
+   if (x == 0)
+   {
+     return 0; // Convenient, even if not defined mathematically.
+   }
+
+   result =
+     sqrt(scale / (constants::two_pi<RealType>() * x * x * x))
+    * exp(-scale * (x - mean) * (x - mean) / (2 * x * mean * mean));
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const inverse_gaussian_distribution<RealType, Policy>& dist, const RealType& x)
+{ // Cumulative Density Function.
+   BOOST_MATH_STD_USING  // for ADL of std functions.
+
+   RealType scale = dist.scale();
+   RealType mean = dist.mean();
+   static const char* function = "boost::math::cdf(const inverse_gaussian_distribution<%1%>&, %1%)";
+   RealType result = 0;
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_location(function, mean, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_positive_x(function, x, &result, Policy()))
+   {
+     return result;
+   }
+   if (x == 0)
+   {
+     return 0; // Convenient, even if not defined mathematically.
+   }
+   // Problem with this formula for large scale > 1000 or small x, 
+   //result = 0.5 * (erf(sqrt(scale / x) * ((x / mean) - 1) / constants::root_two<RealType>(), Policy()) + 1)
+   //  + exp(2 * scale / mean) / 2 
+   //  * (1 - erf(sqrt(scale / x) * (x / mean + 1) / constants::root_two<RealType>(), Policy()));
+   // so use normal distribution version:
+   // Wikipedia CDF equation http://en.wikipedia.org/wiki/Inverse_Gaussian_distribution.
+
+   normal_distribution<RealType> n01;
+
+   RealType n0 = sqrt(scale / x);
+   n0 *= ((x / mean) -1);
+   RealType n1 = cdf(n01, n0);
+   RealType expfactor = exp(2 * scale / mean);
+   RealType n3 = - sqrt(scale / x);
+   n3 *= (x / mean) + 1;
+   RealType n4 = cdf(n01, n3);
+   result = n1 + expfactor * n4;
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+struct inverse_gaussian_quantile_functor
+{ 
+
+  inverse_gaussian_quantile_functor(const boost::math::inverse_gaussian_distribution<RealType, Policy> dist, RealType const& p)
+    : distribution(dist), prob(p)
+  {
+  }
+  boost::math::tuple<RealType, RealType> operator()(RealType const& x)
+  {
+    RealType c = cdf(distribution, x);
+    RealType fx = c - prob;  // Difference cdf - value - to minimize.
+    RealType dx = pdf(distribution, x); // pdf is 1st derivative.
+    // return both function evaluation difference f(x) and 1st derivative f'(x).
+    return boost::math::make_tuple(fx, dx);
+  }
+  private:
+  const boost::math::inverse_gaussian_distribution<RealType, Policy> distribution;
+  RealType prob; 
+};
+
+template <class RealType, class Policy>
+struct inverse_gaussian_quantile_complement_functor
+{ 
+    inverse_gaussian_quantile_complement_functor(const boost::math::inverse_gaussian_distribution<RealType, Policy> dist, RealType const& p)
+    : distribution(dist), prob(p)
+  {
+  }
+  boost::math::tuple<RealType, RealType> operator()(RealType const& x)
+  {
+    RealType c = cdf(complement(distribution, x));
+    RealType fx = c - prob;  // Difference cdf - value - to minimize.
+    RealType dx = -pdf(distribution, x); // pdf is 1st derivative.
+    // return both function evaluation difference f(x) and 1st derivative f'(x).
+    //return std::tr1::make_tuple(fx, dx); if available.
+    return boost::math::make_tuple(fx, dx);
+  }
+  private:
+  const boost::math::inverse_gaussian_distribution<RealType, Policy> distribution;
+  RealType prob; 
+};
+
+namespace detail
+{
+  template <class RealType>
+  inline RealType guess_ig(RealType p, RealType mu = 1, RealType lambda = 1)
+  { // guess at random variate value x for inverse gaussian quantile.
+      BOOST_MATH_STD_USING
+      using boost::math::policies::policy;
+      // Error type.
+      using boost::math::policies::overflow_error;
+      // Action.
+      using boost::math::policies::ignore_error;
+
+      typedef policy<
+        overflow_error<ignore_error> // Ignore overflow (return infinity)
+      > no_overthrow_policy;
+
+    RealType x; // result is guess at random variate value x.
+    RealType phi = lambda / mu;
+    if (phi > 2.)
+    { // Big phi, so starting to look like normal Gaussian distribution.
+      //    x=(qnorm(p,0,1,true,false) - 0.5 * sqrt(mu/lambda)) / sqrt(lambda/mu);
+      // Whitmore, G.A. and Yalovsky, M.
+      // A normalising logarithmic transformation for inverse Gaussian random variables,
+      // Technometrics 20-2, 207-208 (1978), but using expression from
+      // V Seshadri, Inverse Gaussian distribution (1998) ISBN 0387 98618 9, page 6.
+ 
+      normal_distribution<RealType, no_overthrow_policy> n01;
+      x = mu * exp(quantile(n01, p) / sqrt(phi) - 1/(2 * phi));
+     }
+    else
+    { // phi < 2 so much less symmetrical with long tail,
+      // so use gamma distribution as an approximation.
+      using boost::math::gamma_distribution;
+
+      // Define the distribution, using gamma_nooverflow:
+      typedef gamma_distribution<RealType, no_overthrow_policy> gamma_nooverflow;
+
+      gamma_nooverflow g(static_cast<RealType>(0.5), static_cast<RealType>(1.));
+
+      // gamma_nooverflow g(static_cast<RealType>(0.5), static_cast<RealType>(1.));
+      // R qgamma(0.2, 0.5, 1)  0.0320923
+      RealType qg = quantile(complement(g, p));
+      //RealType qg1 = qgamma(1.- p, 0.5, 1.0, true, false);
+      x = lambda / (qg * 2);
+      // 
+      if (x > mu/2) // x > mu /2?
+      { // x too large for the gamma approximation to work well.
+        //x = qgamma(p, 0.5, 1.0); // qgamma(0.270614, 0.5, 1) = 0.05983807
+        RealType q = quantile(g, p);
+       // x = mu * exp(q * static_cast<RealType>(0.1));  // Said to improve at high p
+       // x = mu * x;  // Improves at high p?
+        x = mu * exp(q / sqrt(phi) - 1/(2 * phi));
+      }
+    }
+    return x;
+  }  // guess_ig
+} // namespace detail
+
+template <class RealType, class Policy>
+inline RealType quantile(const inverse_gaussian_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions.
+   // No closed form exists so guess and use Newton Raphson iteration.
+
+   RealType mean = dist.mean();
+   RealType scale = dist.scale();
+   static const char* function = "boost::math::quantile(const inverse_gaussian_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+   if (p == 0)
+   {
+     return 0; // Convenient, even if not defined mathematically?
+   }
+   if (p == 1)
+   { // overflow 
+      result = policies::raise_overflow_error<RealType>(function,
+        "probability parameter is 1, but must be < 1!", Policy());
+      return result; // std::numeric_limits<RealType>::infinity();
+   }
+
+  RealType guess = detail::guess_ig(p, dist.mean(), dist.scale());
+  using boost::math::tools::max_value;
+
+  RealType min = 0.; // Minimum possible value is bottom of range of distribution.
+  RealType max = max_value<RealType>();// Maximum possible value is top of range. 
+  // int digits = std::numeric_limits<RealType>::digits; // Maximum possible binary digits accuracy for type T.
+  // digits used to control how accurate to try to make the result.
+  // To allow user to control accuracy versus speed,
+  int get_digits = policies::digits<RealType, Policy>();// get digits from policy, 
+  boost::uintmax_t m = policies::get_max_root_iterations<Policy>(); // and max iterations.
+  using boost::math::tools::newton_raphson_iterate;
+  result =
+    newton_raphson_iterate(inverse_gaussian_quantile_functor<RealType, Policy>(dist, p), guess, min, max, get_digits, m);
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<inverse_gaussian_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions.
+
+   RealType scale = c.dist.scale();
+   RealType mean = c.dist.mean();
+   RealType x = c.param;
+   static const char* function = "boost::math::cdf(const complement(inverse_gaussian_distribution<%1%>&), %1%)";
+   // infinite arguments not supported.
+   //if((boost::math::isinf)(x))
+   //{
+   //  if(x < 0) return 1; // cdf complement -infinity is unity.
+   //  return 0; // cdf complement +infinity is zero
+   //}
+   // These produce MSVC 4127 warnings, so the above used instead.
+   //if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+   //{ // cdf complement +infinity is zero.
+   //  return 0;
+   //}
+   //if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+   //{ // cdf complement -infinity is unity.
+   //  return 1;
+   //}
+   RealType result = 0;
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   if(false == detail::check_positive_x(function, x, &result, Policy()))
+      return result;
+
+   normal_distribution<RealType> n01;
+   RealType n0 = sqrt(scale / x);
+   n0 *= ((x / mean) -1);
+   RealType cdf_1 = cdf(complement(n01, n0));
+
+   RealType expfactor = exp(2 * scale / mean);
+   RealType n3 = - sqrt(scale / x);
+   n3 *= (x / mean) + 1;
+
+   //RealType n5 = +sqrt(scale/x) * ((x /mean) + 1); // note now positive sign.
+   RealType n6 = cdf(complement(n01, +sqrt(scale/x) * ((x /mean) + 1)));
+   // RealType n4 = cdf(n01, n3); // = 
+   result = cdf_1 - expfactor * n6; 
+   return result;
+} // cdf complement
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<inverse_gaussian_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType scale = c.dist.scale();
+   RealType mean = c.dist.mean();
+   static const char* function = "boost::math::quantile(const complement(inverse_gaussian_distribution<%1%>&), %1%)";
+   RealType result = 0;
+   if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   RealType q = c.param;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   RealType guess = detail::guess_ig(q, mean, scale);
+   // Complement.
+   using boost::math::tools::max_value;
+
+  RealType min = 0.; // Minimum possible value is bottom of range of distribution.
+  RealType max = max_value<RealType>();// Maximum possible value is top of range. 
+  // int digits = std::numeric_limits<RealType>::digits; // Maximum possible binary digits accuracy for type T.
+  // digits used to control how accurate to try to make the result.
+  int get_digits = policies::digits<RealType, Policy>();
+  boost::uintmax_t m = policies::get_max_root_iterations<Policy>();
+  using boost::math::tools::newton_raphson_iterate;
+  result =
+    newton_raphson_iterate(inverse_gaussian_quantile_complement_functor<RealType, Policy>(c.dist, q), guess, min, max, get_digits, m);
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType mean(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{ // aka mu
+   return dist.mean();
+}
+
+template <class RealType, class Policy>
+inline RealType scale(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{ // aka lambda
+   return dist.scale();
+}
+
+template <class RealType, class Policy>
+inline RealType shape(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{ // aka phi
+   return dist.shape();
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{
+  BOOST_MATH_STD_USING
+  RealType scale = dist.scale();
+  RealType mean = dist.mean();
+  RealType result = sqrt(mean * mean * mean / scale);
+  return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{
+  BOOST_MATH_STD_USING
+  RealType scale = dist.scale();
+  RealType  mean = dist.mean();
+  RealType result = mean * (sqrt(1 + (9 * mean * mean)/(4 * scale * scale)) 
+      - 3 * mean / (2 * scale));
+  return result;
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{
+  BOOST_MATH_STD_USING
+  RealType scale = dist.scale();
+  RealType  mean = dist.mean();
+  RealType result = 3 * sqrt(mean/scale);
+  return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{
+  RealType scale = dist.scale();
+  RealType  mean = dist.mean();
+  RealType result = 15 * mean / scale -3;
+  return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const inverse_gaussian_distribution<RealType, Policy>& dist)
+{
+  RealType scale = dist.scale();
+  RealType  mean = dist.mean();
+  RealType result = 15 * mean / scale;
+  return result;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_INVERSE_GAUSSIAN_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/laplace.hpp b/gatb-core/thirdparty/boost/math/distributions/laplace.hpp
new file mode 100644
index 0000000..09b24c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/laplace.hpp
@@ -0,0 +1,350 @@
+//  Copyright Thijs van den Berg, 2008.
+//  Copyright John Maddock 2008.
+//  Copyright Paul A. Bristow 2008, 2014.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This module implements the Laplace distribution.
+// Weisstein, Eric W. "Laplace Distribution." From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/LaplaceDistribution.html
+// http://en.wikipedia.org/wiki/Laplace_distribution
+//
+// Abramowitz and Stegun 1972, p 930
+// http://www.math.sfu.ca/~cbm/aands/page_930.htm
+
+#ifndef BOOST_STATS_LAPLACE_HPP
+#define BOOST_STATS_LAPLACE_HPP
+
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <limits>
+
+namespace boost{ namespace math{
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4127) // conditional expression is constant
+#endif
+
+template <class RealType = double, class Policy = policies::policy<> >
+class laplace_distribution
+{
+public:
+   // ----------------------------------
+   // public Types
+   // ----------------------------------
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   // ----------------------------------
+   // Constructor(s)
+   // ----------------------------------
+   laplace_distribution(RealType l_location = 0, RealType l_scale = 1)
+      : m_location(l_location), m_scale(l_scale)
+   {
+      RealType result;
+      check_parameters("boost::math::laplace_distribution<%1%>::laplace_distribution()", &result);
+   }
+
+
+   // ----------------------------------
+   // Public functions
+   // ----------------------------------
+
+   RealType location() const
+   {
+      return m_location;
+   }
+
+   RealType scale() const
+   {
+      return m_scale;
+   }
+
+   bool check_parameters(const char* function, RealType* result) const
+   {
+         if(false == detail::check_scale(function, m_scale, result, Policy())) return false;
+         if(false == detail::check_location(function, m_location, result, Policy())) return false;
+         return true;
+   }
+
+private:
+   RealType m_location;
+   RealType m_scale;
+}; // class laplace_distribution
+
+//
+// Convenient type synonym for double.
+typedef laplace_distribution<double> laplace;
+
+//
+// Non-member functions.
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const laplace_distribution<RealType, Policy>&)
+{
+   if (std::numeric_limits<RealType>::has_infinity)
+  {  // Can use infinity.
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max value.
+  }
+
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const laplace_distribution<RealType, Policy>&)
+{
+  if (std::numeric_limits<RealType>::has_infinity)
+  { // Can Use infinity.
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max value.
+  }
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   // Checking function argument
+   RealType result = 0;
+   const char* function = "boost::math::pdf(const laplace_distribution<%1%>&, %1%))";
+
+   // Check scale and location.
+   if (false == dist.check_parameters(function, &result)) return result;
+   // Special pdf values.
+   if((boost::math::isinf)(x))
+   {
+      return 0; // pdf + and - infinity is zero.
+   }
+   if (false == detail::check_x(function, x, &result, Policy())) return result;
+
+   // General case
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   RealType exponent = x - location;
+   if (exponent>0) exponent = -exponent;
+   exponent /= scale;
+
+   result = exp(exponent);
+   result /= 2 * scale;
+
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // For ADL of std functions.
+
+   RealType result = 0;
+   // Checking function argument.
+   const char* function = "boost::math::cdf(const laplace_distribution<%1%>&, %1%)";
+   // Check scale and location.
+   if (false == dist.check_parameters(function, &result)) return result;
+
+   // Special cdf values:
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 0; // -infinity.
+     return 1; // + infinity.
+   }
+   if (false == detail::check_x(function, x, &result, Policy())) return result;
+
+   // General cdf  values
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   if (x < location)
+   {
+      result = exp( (x-location)/scale )/2;
+   }
+   else
+   {
+      result = 1 - exp( (location-x)/scale )/2;
+   }
+   return result;
+} // cdf
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const laplace_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions.
+
+   // Checking function argument
+   RealType result = 0;
+   const char* function = "boost::math::quantile(const laplace_distribution<%1%>&, %1%)";
+   if (false == dist.check_parameters(function, &result)) return result;
+   if(false == detail::check_probability(function, p, &result, Policy())) return result;
+
+   // Extreme values of p:
+   if(p == 0)
+   {
+      result = policies::raise_overflow_error<RealType>(function,
+        "probability parameter is 0, but must be > 0!", Policy());
+      return -result; // -std::numeric_limits<RealType>::infinity();
+   }
+  
+   if(p == 1)
+   {
+      result = policies::raise_overflow_error<RealType>(function,
+        "probability parameter is 1, but must be < 1!", Policy());
+      return result; // std::numeric_limits<RealType>::infinity();
+   }
+   // Calculate Quantile
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   if (p - 0.5 < 0.0)
+      result = location + scale*log( static_cast<RealType>(p*2) );
+   else
+      result = location - scale*log( static_cast<RealType>(-p*2 + 2) );
+
+   return result;
+} // quantile
+
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+   // Calculate complement of cdf.
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType scale = c.dist.scale();
+   RealType location = c.dist.location();
+   RealType x = c.param;
+   RealType result = 0;
+
+   // Checking function argument.
+   const char* function = "boost::math::cdf(const complemented2_type<laplace_distribution<%1%>, %1%>&)";
+
+   // Check scale and location.
+   //if(false == detail::check_scale(function, scale, result, Policy())) return false;
+   //if(false == detail::check_location(function, location, result, Policy())) return false;
+    if (false == c.dist.check_parameters(function, &result)) return result;
+
+   // Special cdf values.
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 1; // cdf complement -infinity is unity.
+     return 0; // cdf complement +infinity is zero.
+   }
+   if(false == detail::check_x(function, x, &result, Policy()))return result;
+
+   // Cdf interval value.
+   if (-x < -location)
+   {
+      result = exp( (-x+location)/scale )/2;
+   }
+   else
+   {
+      result = 1 - exp( (-location+x)/scale )/2;
+   }
+   return result;
+} // cdf complement
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions.
+
+   // Calculate quantile.
+   RealType scale = c.dist.scale();
+   RealType location = c.dist.location();
+   RealType q = c.param;
+   RealType result = 0;
+
+   // Checking function argument.
+   const char* function = "quantile(const complemented2_type<laplace_distribution<%1%>, %1%>&)";
+   if (false == c.dist.check_parameters(function, &result)) return result;
+   
+   // Extreme values.
+   if(q == 0)
+   {
+       return std::numeric_limits<RealType>::infinity();
+   }
+   if(q == 1)
+   {
+       return -std::numeric_limits<RealType>::infinity();
+   }
+   if(false == detail::check_probability(function, q, &result, Policy())) return result;
+
+   if (0.5 - q < 0.0)
+      result = location + scale*log( static_cast<RealType>(-q*2 + 2) );
+   else
+      result = location - scale*log( static_cast<RealType>(q*2) );
+
+
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType mean(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const laplace_distribution<RealType, Policy>& dist)
+{
+   return constants::root_two<RealType>() * dist.scale();
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 0;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 6;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 3;
+}
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_LAPLACE_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/logistic.hpp b/gatb-core/thirdparty/boost/math/distributions/logistic.hpp
new file mode 100644
index 0000000..b3d16b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/logistic.hpp
@@ -0,0 +1,299 @@
+// Copyright 2008 Gautam Sewani
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_LOGISTIC
+#define BOOST_MATH_DISTRIBUTIONS_LOGISTIC
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <utility>
+
+namespace boost { namespace math { 
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class logistic_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+      
+      logistic_distribution(RealType l_location=0, RealType l_scale=1) // Constructor.
+        : m_location(l_location), m_scale(l_scale) 
+      {
+        static const char* function = "boost::math::logistic_distribution<%1%>::logistic_distribution";
+        
+        RealType result;
+        detail::check_scale(function, l_scale, &result, Policy());
+        detail::check_location(function, l_location, &result, Policy());
+      }
+      // Accessor functions.
+      RealType scale()const
+      {
+        return m_scale;
+      }
+      
+      RealType location()const
+      {
+        return m_location;
+      }
+    private:
+      // Data members:
+      RealType m_location;  // distribution location aka mu.
+      RealType m_scale;  // distribution scale aka s.
+    }; // class logistic_distribution
+    
+    
+    typedef logistic_distribution<double> logistic;
+    
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const logistic_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(
+         std::numeric_limits<RealType>::has_infinity ? -std::numeric_limits<RealType>::infinity() : -max_value<RealType>(), 
+         std::numeric_limits<RealType>::has_infinity ? std::numeric_limits<RealType>::infinity() : max_value<RealType>());
+    }
+    
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const logistic_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + infinity
+    }
+     
+    template <class RealType, class Policy>
+    inline RealType pdf(const logistic_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+       static const char* function = "boost::math::pdf(const logistic_distribution<%1%>&, %1%)";
+       RealType scale = dist.scale();
+       RealType location = dist.location();
+       RealType result = 0;
+
+       if(false == detail::check_scale(function, scale , &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_location(function, location, &result, Policy()))
+       {
+          return result;
+       }
+
+       if((boost::math::isinf)(x))
+       {
+          return 0; // pdf + and - infinity is zero.
+       }
+
+       if(false == detail::check_x(function, x, &result, Policy()))
+       {
+          return result;
+       }
+
+       BOOST_MATH_STD_USING
+       RealType exp_term = (location - x) / scale;
+       if(fabs(exp_term) > tools::log_max_value<RealType>())
+          return 0;
+       exp_term = exp(exp_term);
+       if((exp_term * scale > 1) && (exp_term > tools::max_value<RealType>() / (scale * exp_term)))
+          return 1 / (scale * exp_term);
+       return (exp_term) / (scale * (1 + exp_term) * (1 + exp_term));
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType cdf(const logistic_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+       RealType scale = dist.scale();
+       RealType location = dist.location();
+       RealType result = 0; // of checks.
+       static const char* function = "boost::math::cdf(const logistic_distribution<%1%>&, %1%)";
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_location(function, location, &result, Policy()))
+       {
+          return result;
+       }
+
+       if((boost::math::isinf)(x))
+       {
+          if(x < 0) return 0; // -infinity
+          return 1; // + infinity
+       }
+
+       if(false == detail::check_x(function, x, &result, Policy()))
+       {
+          return result;
+       }
+       BOOST_MATH_STD_USING
+       RealType power = (location - x) / scale;
+       if(power > tools::log_max_value<RealType>())
+          return 0;
+       if(power < -tools::log_max_value<RealType>())
+          return 1;
+       return 1 / (1 + exp(power)); 
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType quantile(const logistic_distribution<RealType, Policy>& dist, const RealType& p)
+    {
+       BOOST_MATH_STD_USING
+       RealType location = dist.location();
+       RealType scale = dist.scale();
+
+       static const char* function = "boost::math::quantile(const logistic_distribution<%1%>&, %1%)";
+
+       RealType result = 0;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+          return result;
+       if(false == detail::check_location(function, location, &result, Policy()))
+          return result;
+       if(false == detail::check_probability(function, p, &result, Policy()))
+          return result;
+
+       if(p == 0)
+       {
+          return -policies::raise_overflow_error<RealType>(function,"probability argument is 0, must be >0 and <1",Policy());
+       }
+       if(p == 1)
+       {
+          return policies::raise_overflow_error<RealType>(function,"probability argument is 1, must be >0 and <1",Policy());
+       }
+       //Expressions to try
+       //return location+scale*log(p/(1-p));
+       //return location+scale*log1p((2*p-1)/(1-p));
+
+       //return location - scale*log( (1-p)/p);
+       //return location - scale*log1p((1-2*p)/p);
+
+       //return -scale*log(1/p-1) + location;
+       return location - scale * log((1 - p) / p);
+     } // RealType quantile(const logistic_distribution<RealType, Policy>& dist, const RealType& p)
+    
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<logistic_distribution<RealType, Policy>, RealType>& c)
+    {
+       BOOST_MATH_STD_USING
+       RealType location = c.dist.location();
+       RealType scale = c.dist.scale();
+       RealType x = c.param;
+       static const char* function = "boost::math::cdf(const complement(logistic_distribution<%1%>&), %1%)";
+
+       RealType result = 0;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_location(function, location, &result, Policy()))
+       {
+          return result;
+       }
+       if((boost::math::isinf)(x))
+       {
+          if(x < 0) return 1; // cdf complement -infinity is unity.
+          return 0; // cdf complement +infinity is zero.
+       }
+       if(false == detail::check_x(function, x, &result, Policy()))
+       {
+          return result;
+       }
+       RealType power = (x - location) / scale;
+       if(power > tools::log_max_value<RealType>())
+          return 0;
+       if(power < -tools::log_max_value<RealType>())
+          return 1;
+       return 1 / (1 + exp(power)); 
+    } 
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<logistic_distribution<RealType, Policy>, RealType>& c)
+    {
+       BOOST_MATH_STD_USING
+       RealType scale = c.dist.scale();
+       RealType location = c.dist.location();
+       static const char* function = "boost::math::quantile(const complement(logistic_distribution<%1%>&), %1%)";
+       RealType result = 0;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+          return result;
+       if(false == detail::check_location(function, location, &result, Policy()))
+          return result;
+       RealType q = c.param;
+       if(false == detail::check_probability(function, q, &result, Policy()))
+          return result;
+       using boost::math::tools::max_value;
+
+       if(q == 1)
+       {
+          return -policies::raise_overflow_error<RealType>(function,"probability argument is 1, but must be >0 and <1",Policy());
+       }
+       if(q == 0)
+       {
+          return policies::raise_overflow_error<RealType>(function,"probability argument is 0, but must be >0 and <1",Policy());
+       }
+       //Expressions to try 
+       //return location+scale*log((1-q)/q);
+       return location + scale * log((1 - q) / q);
+
+       //return location-scale*log(q/(1-q));
+       //return location-scale*log1p((2*q-1)/(1-q));
+
+       //return location+scale*log(1/q-1);
+       //return location+scale*log1p(1/q-2);
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType mean(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    } // RealType mean(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType variance(const logistic_distribution<RealType, Policy>& dist)
+    {
+      BOOST_MATH_STD_USING
+      RealType scale = dist.scale();
+      return boost::math::constants::pi<RealType>()*boost::math::constants::pi<RealType>()*scale*scale/3;
+    } // RealType variance(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType mode(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    }
+    
+    template <class RealType, class Policy>
+    inline RealType median(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    }
+    template <class RealType, class Policy>
+    inline RealType skewness(const logistic_distribution<RealType, Policy>& /*dist*/)
+    {
+      return 0;
+    } // RealType skewness(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& /*dist*/)
+    {
+      return static_cast<RealType>(6)/5; 
+    } // RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& dist)
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return kurtosis_excess(dist) + 3;
+    } // RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& dist)
+  }}
+
+
+// Must come at the end:
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_LOGISTIC
diff --git a/gatb-core/thirdparty/boost/math/distributions/lognormal.hpp b/gatb-core/thirdparty/boost/math/distributions/lognormal.hpp
new file mode 100644
index 0000000..4e6c061
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/lognormal.hpp
@@ -0,0 +1,341 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_LOGNORMAL_HPP
+#define BOOST_STATS_LOGNORMAL_HPP
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3669.htm
+// http://mathworld.wolfram.com/LogNormalDistribution.html
+// http://en.wikipedia.org/wiki/Lognormal_distribution
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/normal.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+namespace detail
+{
+
+  template <class RealType, class Policy>
+  inline bool check_lognormal_x(
+        const char* function,
+        RealType const& x,
+        RealType* result, const Policy& pol)
+  {
+     if((x < 0) || !(boost::math::isfinite)(x))
+     {
+        *result = policies::raise_domain_error<RealType>(
+           function,
+           "Random variate is %1% but must be >= 0 !", x, pol);
+        return false;
+     }
+     return true;
+  }
+
+} // namespace detail
+
+
+template <class RealType = double, class Policy = policies::policy<> >
+class lognormal_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   lognormal_distribution(RealType l_location = 0, RealType l_scale = 1)
+      : m_location(l_location), m_scale(l_scale)
+   {
+      RealType result;
+      detail::check_scale("boost::math::lognormal_distribution<%1%>::lognormal_distribution", l_scale, &result, Policy());
+      detail::check_location("boost::math::lognormal_distribution<%1%>::lognormal_distribution", l_location, &result, Policy());
+   }
+
+   RealType location()const
+   {
+      return m_location;
+   }
+
+   RealType scale()const
+   {
+      return m_scale;
+   }
+private:
+   //
+   // Data members:
+   //
+   RealType m_location;  // distribution location.
+   RealType m_scale;     // distribution scale.
+};
+
+typedef lognormal_distribution<double> lognormal;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const lognormal_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x is >0 to +infinity.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const lognormal_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+RealType pdf(const lognormal_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType mu = dist.location();
+   RealType sigma = dist.scale();
+
+   static const char* function = "boost::math::pdf(const lognormal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(0 == detail::check_scale(function, sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location(function, mu, &result, Policy()))
+      return result;
+   if(0 == detail::check_lognormal_x(function, x, &result, Policy()))
+      return result;
+
+   if(x == 0)
+      return 0;
+
+   RealType exponent = log(x) - mu;
+   exponent *= -exponent;
+   exponent /= 2 * sigma * sigma;
+
+   result = exp(exponent);
+   result /= sigma * sqrt(2 * constants::pi<RealType>()) * x;
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const lognormal_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const lognormal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(0 == detail::check_scale(function, dist.scale(), &result, Policy()))
+      return result;
+   if(0 == detail::check_location(function, dist.location(), &result, Policy()))
+      return result;
+   if(0 == detail::check_lognormal_x(function, x, &result, Policy()))
+      return result;
+
+   if(x == 0)
+      return 0;
+
+   normal_distribution<RealType, Policy> norm(dist.location(), dist.scale());
+   return cdf(norm, log(x));
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const lognormal_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const lognormal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(0 == detail::check_scale(function, dist.scale(), &result, Policy()))
+      return result;
+   if(0 == detail::check_location(function, dist.location(), &result, Policy()))
+      return result;
+   if(0 == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 0)
+      return 0;
+   if(p == 1)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   normal_distribution<RealType, Policy> norm(dist.location(), dist.scale());
+   return exp(quantile(norm, p));
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<lognormal_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const lognormal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(0 == detail::check_scale(function, c.dist.scale(), &result, Policy()))
+      return result;
+   if(0 == detail::check_location(function, c.dist.location(), &result, Policy()))
+      return result;
+   if(0 == detail::check_lognormal_x(function, c.param, &result, Policy()))
+      return result;
+
+   if(c.param == 0)
+      return 1;
+
+   normal_distribution<RealType, Policy> norm(c.dist.location(), c.dist.scale());
+   return cdf(complement(norm, log(c.param)));
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<lognormal_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const lognormal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(0 == detail::check_scale(function, c.dist.scale(), &result, Policy()))
+      return result;
+   if(0 == detail::check_location(function, c.dist.location(), &result, Policy()))
+      return result;
+   if(0 == detail::check_probability(function, c.param, &result, Policy()))
+      return result;
+
+   if(c.param == 1)
+      return 0;
+   if(c.param == 0)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   normal_distribution<RealType, Policy> norm(c.dist.location(), c.dist.scale());
+   return exp(quantile(complement(norm, c.param)));
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType mu = dist.location();
+   RealType sigma = dist.scale();
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::mean(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::mean(const lognormal_distribution<%1%>&)", mu, &result, Policy()))
+      return result;
+
+   return exp(mu + sigma * sigma / 2);
+}
+
+template <class RealType, class Policy>
+inline RealType variance(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType mu = dist.location();
+   RealType sigma = dist.scale();
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::variance(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::variance(const lognormal_distribution<%1%>&)", mu, &result, Policy()))
+      return result;
+
+   return boost::math::expm1(sigma * sigma, Policy()) * exp(2 * mu + sigma * sigma);
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType mu = dist.location();
+   RealType sigma = dist.scale();
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::mode(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::mode(const lognormal_distribution<%1%>&)", mu, &result, Policy()))
+      return result;
+
+   return exp(mu - sigma * sigma);
+}
+
+template <class RealType, class Policy>
+inline RealType median(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+   RealType mu = dist.location();
+   return exp(mu); // e^mu
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   //RealType mu = dist.location();
+   RealType sigma = dist.scale();
+
+   RealType ss = sigma * sigma;
+   RealType ess = exp(ss);
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::skewness(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::skewness(const lognormal_distribution<%1%>&)", dist.location(), &result, Policy()))
+      return result;
+
+   return (ess + 2) * sqrt(boost::math::expm1(ss, Policy()));
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   //RealType mu = dist.location();
+   RealType sigma = dist.scale();
+   RealType ss = sigma * sigma;
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::kurtosis(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::kurtosis(const lognormal_distribution<%1%>&)", dist.location(), &result, Policy()))
+      return result;
+
+   return exp(4 * ss) + 2 * exp(3 * ss) + 3 * exp(2 * ss) - 3;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const lognormal_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   // RealType mu = dist.location();
+   RealType sigma = dist.scale();
+   RealType ss = sigma * sigma;
+
+   RealType result = 0;
+   if(0 == detail::check_scale("boost::math::kurtosis_excess(const lognormal_distribution<%1%>&)", sigma, &result, Policy()))
+      return result;
+   if(0 == detail::check_location("boost::math::kurtosis_excess(const lognormal_distribution<%1%>&)", dist.location(), &result, Policy()))
+      return result;
+
+   return exp(4 * ss) + 2 * exp(3 * ss) + 3 * exp(2 * ss) - 6;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_STUDENTS_T_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/negative_binomial.hpp b/gatb-core/thirdparty/boost/math/distributions/negative_binomial.hpp
new file mode 100644
index 0000000..ca5723f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/negative_binomial.hpp
@@ -0,0 +1,607 @@
+// boost\math\special_functions\negative_binomial.hpp
+
+// Copyright Paul A. Bristow 2007.
+// Copyright John Maddock 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/negative_binomial_distribution
+// http://mathworld.wolfram.com/NegativeBinomialDistribution.html
+// http://documents.wolfram.com/teachersedition/Teacher/Statistics/DiscreteDistributions.html
+
+// The negative binomial distribution NegativeBinomialDistribution[n, p]
+// is the distribution of the number (k) of failures that occur in a sequence of trials before
+// r successes have occurred, where the probability of success in each trial is p.
+
+// In a sequence of Bernoulli trials or events
+// (independent, yes or no, succeed or fail) with success_fraction probability p,
+// negative_binomial is the probability that k or fewer failures
+// preceed the r th trial's success.
+// random variable k is the number of failures (NOT the probability).
+
+// Negative_binomial distribution is a discrete probability distribution.
+// But note that the negative binomial distribution
+// (like others including the binomial, Poisson & Bernoulli)
+// is strictly defined as a discrete function: only integral values of k are envisaged.
+// However because of the method of calculation using a continuous gamma function,
+// it is convenient to treat it as if a continous function,
+// and permit non-integral values of k.
+
+// However, by default the policy is to use discrete_quantile_policy.
+
+// To enforce the strict mathematical model, users should use conversion
+// on k outside this function to ensure that k is integral.
+
+// MATHCAD cumulative negative binomial pnbinom(k, n, p)
+
+// Implementation note: much greater speed, and perhaps greater accuracy,
+// might be achieved for extreme values by using a normal approximation.
+// This is NOT been tested or implemented.
+
+#ifndef BOOST_MATH_SPECIAL_NEGATIVE_BINOMIAL_HPP
+#define BOOST_MATH_SPECIAL_NEGATIVE_BINOMIAL_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for ibeta(a, b, x) == Ix(a, b).
+#include <boost/math/distributions/complement.hpp> // complement.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks domain_error & logic_error.
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+#include <boost/math/distributions/detail/inv_discrete_quantile.hpp>
+
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <limits> // using std::numeric_limits;
+#include <utility>
+
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+// This believed not now necessary, so commented out.
+//#  pragma warning(disable: 4702) // unreachable code.
+// in domain_error_imp in error_handling.
+#endif
+
+namespace boost
+{
+  namespace math
+  {
+    namespace negative_binomial_detail
+    {
+      // Common error checking routines for negative binomial distribution functions:
+      template <class RealType, class Policy>
+      inline bool check_successes(const char* function, const RealType& r, RealType* result, const Policy& pol)
+      {
+        if( !(boost::math::isfinite)(r) || (r <= 0) )
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Number of successes argument is %1%, but must be > 0 !", r, pol);
+          return false;
+        }
+        return true;
+      }
+      template <class RealType, class Policy>
+      inline bool check_success_fraction(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        if( !(boost::math::isfinite)(p) || (p < 0) || (p > 1) )
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Success fraction argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& r, const RealType& p, RealType* result, const Policy& pol)
+      {
+        return check_success_fraction(function, p, result, pol)
+          && check_successes(function, r, result, pol);
+      }
+      template <class RealType, class Policy>
+      inline bool check_dist_and_k(const char* function, const RealType& r, const RealType& p, RealType k, RealType* result, const Policy& pol)
+      {
+        if(check_dist(function, r, p, result, pol) == false)
+        {
+          return false;
+        }
+        if( !(boost::math::isfinite)(k) || (k < 0) )
+        { // Check k failures.
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Number of failures argument is %1%, but must be >= 0 !", k, pol);
+          return false;
+        }
+        return true;
+      } // Check_dist_and_k
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, const RealType& r, RealType p, RealType prob, RealType* result, const Policy& pol)
+      {
+        if(check_dist(function, r, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+        {
+          return false;
+        }
+        return true;
+      } // check_dist_and_prob
+    } //  namespace negative_binomial_detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class negative_binomial_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      negative_binomial_distribution(RealType r, RealType p) : m_r(r), m_p(p)
+      { // Constructor.
+        RealType result;
+        negative_binomial_detail::check_dist(
+          "negative_binomial_distribution<%1%>::negative_binomial_distribution",
+          m_r, // Check successes r > 0.
+          m_p, // Check success_fraction 0 <= p <= 1.
+          &result, Policy());
+      } // negative_binomial_distribution constructor.
+
+      // Private data getter class member functions.
+      RealType success_fraction() const
+      { // Probability of success as fraction in range 0 to 1.
+        return m_p;
+      }
+      RealType successes() const
+      { // Total number of successes r.
+        return m_r;
+      }
+
+      static RealType find_lower_bound_on_p(
+        RealType trials,
+        RealType successes,
+        RealType alpha) // alpha 0.05 equivalent to 95% for one-sided test.
+      {
+        static const char* function = "boost::math::negative_binomial<%1%>::find_lower_bound_on_p";
+        RealType result = 0;  // of error checks.
+        RealType failures = trials - successes;
+        if(false == detail::check_probability(function, alpha, &result, Policy())
+          && negative_binomial_detail::check_dist_and_k(
+          function, successes, RealType(0), failures, &result, Policy()))
+        {
+          return result;
+        }
+        // Use complement ibeta_inv function for lower bound.
+        // This is adapted from the corresponding binomial formula
+        // here: http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm
+        // This is a Clopper-Pearson interval, and may be overly conservative,
+        // see also "A Simple Improved Inferential Method for Some
+        // Discrete Distributions" Yong CAI and K. KRISHNAMOORTHY
+        // http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf
+        //
+        return ibeta_inv(successes, failures + 1, alpha, static_cast<RealType*>(0), Policy());
+      } // find_lower_bound_on_p
+
+      static RealType find_upper_bound_on_p(
+        RealType trials,
+        RealType successes,
+        RealType alpha) // alpha 0.05 equivalent to 95% for one-sided test.
+      {
+        static const char* function = "boost::math::negative_binomial<%1%>::find_upper_bound_on_p";
+        RealType result = 0;  // of error checks.
+        RealType failures = trials - successes;
+        if(false == negative_binomial_detail::check_dist_and_k(
+          function, successes, RealType(0), failures, &result, Policy())
+          && detail::check_probability(function, alpha, &result, Policy()))
+        {
+          return result;
+        }
+        if(failures == 0)
+           return 1;
+        // Use complement ibetac_inv function for upper bound.
+        // Note adjusted failures value: *not* failures+1 as usual.
+        // This is adapted from the corresponding binomial formula
+        // here: http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm
+        // This is a Clopper-Pearson interval, and may be overly conservative,
+        // see also "A Simple Improved Inferential Method for Some
+        // Discrete Distributions" Yong CAI and K. KRISHNAMOORTHY
+        // http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf
+        //
+        return ibetac_inv(successes, failures, alpha, static_cast<RealType*>(0), Policy());
+      } // find_upper_bound_on_p
+
+      // Estimate number of trials :
+      // "How many trials do I need to be P% sure of seeing k or fewer failures?"
+
+      static RealType find_minimum_number_of_trials(
+        RealType k,     // number of failures (k >= 0).
+        RealType p,     // success fraction 0 <= p <= 1.
+        RealType alpha) // risk level threshold 0 <= alpha <= 1.
+      {
+        static const char* function = "boost::math::negative_binomial<%1%>::find_minimum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == negative_binomial_detail::check_dist_and_k(
+          function, RealType(1), p, k, &result, Policy())
+          && detail::check_probability(function, alpha, &result, Policy()))
+        { return result; }
+
+        result = ibeta_inva(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      } // RealType find_number_of_failures
+
+      static RealType find_maximum_number_of_trials(
+        RealType k,     // number of failures (k >= 0).
+        RealType p,     // success fraction 0 <= p <= 1.
+        RealType alpha) // risk level threshold 0 <= alpha <= 1.
+      {
+        static const char* function = "boost::math::negative_binomial<%1%>::find_maximum_number_of_trials";
+        // Error checks:
+        RealType result = 0;
+        if(false == negative_binomial_detail::check_dist_and_k(
+          function, RealType(1), p, k, &result, Policy())
+          &&  detail::check_probability(function, alpha, &result, Policy()))
+        { return result; }
+
+        result = ibetac_inva(k + 1, p, alpha, Policy());  // returns n - k
+        return result + k;
+      } // RealType find_number_of_trials complemented
+
+    private:
+      RealType m_r; // successes.
+      RealType m_p; // success_fraction
+    }; // template <class RealType, class Policy> class negative_binomial_distribution
+
+    typedef negative_binomial_distribution<double> negative_binomial; // Reserved name of type double.
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const negative_binomial_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable k.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // max_integer?
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const negative_binomial_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable k.
+       // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>()); // max_integer?
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // Mean of Negative Binomial distribution = r(1-p)/p.
+      return dist.successes() * (1 - dist.success_fraction() ) / dist.success_fraction();
+    } // mean
+
+    //template <class RealType, class Policy>
+    //inline RealType median(const negative_binomial_distribution<RealType, Policy>& dist)
+    //{ // Median of negative_binomial_distribution is not defined.
+    //  return policies::raise_domain_error<RealType>(BOOST_CURRENT_FUNCTION, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
+    //} // median
+    // Now implemented via quantile(half) in derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType mode(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // Mode of Negative Binomial distribution = floor[(r-1) * (1 - p)/p]
+      BOOST_MATH_STD_USING // ADL of std functions.
+      return floor((dist.successes() -1) * (1 - dist.success_fraction()) / dist.success_fraction());
+    } // mode
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // skewness of Negative Binomial distribution = 2-p / (sqrt(r(1-p))
+      BOOST_MATH_STD_USING // ADL of std functions.
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+
+      return (2 - p) /
+        sqrt(r * (1 - p));
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // kurtosis of Negative Binomial distribution
+      // http://en.wikipedia.org/wiki/Negative_binomial is kurtosis_excess so add 3
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+      return 3 + (6 / r) + ((p * p) / (r * (1 - p)));
+    } // kurtosis
+
+     template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // kurtosis excess of Negative Binomial distribution
+      // http://mathworld.wolfram.com/Kurtosis.html table of kurtosis_excess
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+      return (6 - p * (6-p)) / (r * (1-p));
+    } // kurtosis_excess
+
+    template <class RealType, class Policy>
+    inline RealType variance(const negative_binomial_distribution<RealType, Policy>& dist)
+    { // Variance of Binomial distribution = r (1-p) / p^2.
+      return  dist.successes() * (1 - dist.success_fraction())
+        / (dist.success_fraction() * dist.success_fraction());
+    } // variance
+
+    // RealType standard_deviation(const negative_binomial_distribution<RealType, Policy>& dist)
+    // standard_deviation provided by derived accessors.
+    // RealType hazard(const negative_binomial_distribution<RealType, Policy>& dist)
+    // hazard of Negative Binomial distribution provided by derived accessors.
+    // RealType chf(const negative_binomial_distribution<RealType, Policy>& dist)
+    // chf of Negative Binomial distribution provided by derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const negative_binomial_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Probability Density/Mass Function.
+      BOOST_FPU_EXCEPTION_GUARD
+
+      static const char* function = "boost::math::pdf(const negative_binomial_distribution<%1%>&, %1%)";
+
+      RealType r = dist.successes();
+      RealType p = dist.success_fraction();
+      RealType result = 0;
+      if(false == negative_binomial_detail::check_dist_and_k(
+        function,
+        r,
+        dist.success_fraction(),
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+
+      result = (p/(r + k)) * ibeta_derivative(r, static_cast<RealType>(k+1), p, Policy());
+      // Equivalent to:
+      // return exp(lgamma(r + k) - lgamma(r) - lgamma(k+1)) * pow(p, r) * pow((1-p), k);
+      return result;
+    } // negative_binomial_pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const negative_binomial_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Cumulative Distribution Function of Negative Binomial.
+      static const char* function = "boost::math::cdf(const negative_binomial_distribution<%1%>&, %1%)";
+      using boost::math::ibeta; // Regularized incomplete beta function.
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+      // Error check:
+      RealType result = 0;
+      if(false == negative_binomial_detail::check_dist_and_k(
+        function,
+        r,
+        dist.success_fraction(),
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+
+      RealType probability = ibeta(r, static_cast<RealType>(k+1), p, Policy());
+      // Ip(r, k+1) = ibeta(r, k+1, p)
+      return probability;
+    } // cdf Cumulative Distribution Function Negative Binomial.
+
+      template <class RealType, class Policy>
+      inline RealType cdf(const complemented2_type<negative_binomial_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function Negative Binomial.
+
+      static const char* function = "boost::math::cdf(const negative_binomial_distribution<%1%>&, %1%)";
+      using boost::math::ibetac; // Regularized incomplete beta function complement.
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      RealType const& k = c.param;
+      negative_binomial_distribution<RealType, Policy> const& dist = c.dist;
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+      // Error check:
+      RealType result = 0;
+      if(false == negative_binomial_detail::check_dist_and_k(
+        function,
+        r,
+        p,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Calculate cdf negative binomial using the incomplete beta function.
+      // Use of ibeta here prevents cancellation errors in calculating
+      // 1-p if p is very small, perhaps smaller than machine epsilon.
+      // Ip(k+1, r) = ibetac(r, k+1, p)
+      // constrain_probability here?
+     RealType probability = ibetac(r, static_cast<RealType>(k+1), p, Policy());
+      // Numerical errors might cause probability to be slightly outside the range < 0 or > 1.
+      // This might cause trouble downstream, so warn, possibly throw exception, but constrain to the limits.
+      return probability;
+    } // cdf Cumulative Distribution Function Negative Binomial.
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const negative_binomial_distribution<RealType, Policy>& dist, const RealType& P)
+    { // Quantile, percentile/100 or Percent Point Negative Binomial function.
+      // Return the number of expected failures k for a given probability p.
+
+      // Inverse cumulative Distribution Function or Quantile (percentile / 100) of negative_binomial Probability.
+      // MAthCAD pnbinom return smallest k such that negative_binomial(k, n, p) >= probability.
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // BUT Cephes/CodeCogs says: finds argument p (0 to 1) such that cdf(k, n, p) = y
+      static const char* function = "boost::math::quantile(const negative_binomial_distribution<%1%>&, %1%)";
+      BOOST_MATH_STD_USING // ADL of std functions.
+
+      RealType p = dist.success_fraction();
+      RealType r = dist.successes();
+      // Check dist and P.
+      RealType result = 0;
+      if(false == negative_binomial_detail::check_dist_and_prob
+        (function, r, p, P, &result, Policy()))
+      {
+        return result;
+      }
+
+      // Special cases.
+      if (P == 1)
+      {  // Would need +infinity failures for total confidence.
+        result = policies::raise_overflow_error<RealType>(
+            function,
+            "Probability argument is 1, which implies infinite failures !", Policy());
+        return result;
+       // usually means return +std::numeric_limits<RealType>::infinity();
+       // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+      }
+      if (P == 0)
+      { // No failures are expected if P = 0.
+        return 0; // Total trials will be just dist.successes.
+      }
+      if (P <= pow(dist.success_fraction(), dist.successes()))
+      { // p <= pdf(dist, 0) == cdf(dist, 0)
+        return 0;
+      }
+      if(p == 0)
+      {  // Would need +infinity failures for total confidence.
+         result = policies::raise_overflow_error<RealType>(
+            function,
+            "Success fraction is 0, which implies infinite failures !", Policy());
+         return result;
+         // usually means return +std::numeric_limits<RealType>::infinity();
+         // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+      }
+      /*
+      // Calculate quantile of negative_binomial using the inverse incomplete beta function.
+      using boost::math::ibeta_invb;
+      return ibeta_invb(r, p, P, Policy()) - 1; //
+      */
+      RealType guess = 0;
+      RealType factor = 5;
+      if(r * r * r * P * p > 0.005)
+         guess = detail::inverse_negative_binomial_cornish_fisher(r, p, RealType(1-p), P, RealType(1-P), Policy());
+
+      if(guess < 10)
+      {
+         //
+         // Cornish-Fisher Negative binomial approximation not accurate in this area:
+         //
+         guess = (std::min)(RealType(r * 2), RealType(10));
+      }
+      else
+         factor = (1-P < sqrt(tools::epsilon<RealType>())) ? 2 : (guess < 20 ? 1.2f : 1.1f);
+      BOOST_MATH_INSTRUMENT_CODE("guess = " << guess);
+      //
+      // Max iterations permitted:
+      //
+      boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+      typedef typename Policy::discrete_quantile_type discrete_type;
+      return detail::inverse_discrete_quantile(
+         dist,
+         P,
+         false,
+         guess,
+         factor,
+         RealType(1),
+         discrete_type(),
+         max_iter);
+    } // RealType quantile(const negative_binomial_distribution dist, p)
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<negative_binomial_distribution<RealType, Policy>, RealType>& c)
+    {  // Quantile or Percent Point Binomial function.
+       // Return the number of expected failures k for a given
+       // complement of the probability Q = 1 - P.
+       static const char* function = "boost::math::quantile(const negative_binomial_distribution<%1%>&, %1%)";
+       BOOST_MATH_STD_USING
+
+       // Error checks:
+       RealType Q = c.param;
+       const negative_binomial_distribution<RealType, Policy>& dist = c.dist;
+       RealType p = dist.success_fraction();
+       RealType r = dist.successes();
+       RealType result = 0;
+       if(false == negative_binomial_detail::check_dist_and_prob(
+          function,
+          r,
+          p,
+          Q,
+          &result, Policy()))
+       {
+          return result;
+       }
+
+       // Special cases:
+       //
+       if(Q == 1)
+       {  // There may actually be no answer to this question,
+          // since the probability of zero failures may be non-zero,
+          return 0; // but zero is the best we can do:
+       }
+       if(Q == 0)
+       {  // Probability 1 - Q  == 1 so infinite failures to achieve certainty.
+          // Would need +infinity failures for total confidence.
+          result = policies::raise_overflow_error<RealType>(
+             function,
+             "Probability argument complement is 0, which implies infinite failures !", Policy());
+          return result;
+          // usually means return +std::numeric_limits<RealType>::infinity();
+          // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+       }
+       if (-Q <= boost::math::powm1(dist.success_fraction(), dist.successes(), Policy()))
+       {  // q <= cdf(complement(dist, 0)) == pdf(dist, 0)
+          return 0; //
+       }
+       if(p == 0)
+       {  // Success fraction is 0 so infinite failures to achieve certainty.
+          // Would need +infinity failures for total confidence.
+          result = policies::raise_overflow_error<RealType>(
+             function,
+             "Success fraction is 0, which implies infinite failures !", Policy());
+          return result;
+          // usually means return +std::numeric_limits<RealType>::infinity();
+          // unless #define BOOST_MATH_THROW_ON_OVERFLOW_ERROR
+       }
+       //return ibetac_invb(r, p, Q, Policy()) -1;
+       RealType guess = 0;
+       RealType factor = 5;
+       if(r * r * r * (1-Q) * p > 0.005)
+          guess = detail::inverse_negative_binomial_cornish_fisher(r, p, RealType(1-p), RealType(1-Q), Q, Policy());
+
+       if(guess < 10)
+       {
+          //
+          // Cornish-Fisher Negative binomial approximation not accurate in this area:
+          //
+          guess = (std::min)(RealType(r * 2), RealType(10));
+       }
+       else
+          factor = (Q < sqrt(tools::epsilon<RealType>())) ? 2 : (guess < 20 ? 1.2f : 1.1f);
+       BOOST_MATH_INSTRUMENT_CODE("guess = " << guess);
+       //
+       // Max iterations permitted:
+       //
+       boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+       typedef typename Policy::discrete_quantile_type discrete_type;
+       return detail::inverse_discrete_quantile(
+          dist,
+          Q,
+          true,
+          guess,
+          factor,
+          RealType(1),
+          discrete_type(),
+          max_iter);
+    } // quantile complement
+
+ } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#if defined (BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_SPECIAL_NEGATIVE_BINOMIAL_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/non_central_beta.hpp b/gatb-core/thirdparty/boost/math/distributions/non_central_beta.hpp
new file mode 100644
index 0000000..6e699e5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/non_central_beta.hpp
@@ -0,0 +1,925 @@
+// boost\math\distributions\non_central_beta.hpp
+
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_NON_CENTRAL_BETA_HPP
+#define BOOST_MATH_SPECIAL_NON_CENTRAL_BETA_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for incomplete gamma. gamma_q
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/beta.hpp> // central distribution
+#include <boost/math/distributions/detail/generic_mode.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+#include <boost/math/tools/series.hpp>
+
+namespace boost
+{
+   namespace math
+   {
+
+      template <class RealType, class Policy>
+      class non_central_beta_distribution;
+
+      namespace detail{
+
+         template <class T, class Policy>
+         T non_central_beta_p(T a, T b, T lam, T x, T y, const Policy& pol, T init_val = 0)
+         {
+            BOOST_MATH_STD_USING
+               using namespace boost::math;
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T l2 = lam / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term,
+            // note that unlike other similar code, we do not set
+            // k to zero, when l2 is small, as forward iteration
+            // is unstable:
+            //
+            int k = itrunc(l2);
+            if(k == 0)
+               k = 1;
+               // Starting Poisson weight:
+            T pois = gamma_p_derivative(T(k+1), l2, pol);
+            if(pois == 0)
+               return init_val;
+            // recurance term:
+            T xterm;
+            // Starting beta term:
+            T beta = x < y
+               ? detail::ibeta_imp(T(a + k), b, x, pol, false, true, &xterm)
+               : detail::ibeta_imp(b, T(a + k), y, pol, true, true, &xterm);
+
+            xterm *= y / (a + b + k - 1);
+            T poisf(pois), betaf(beta), xtermf(xterm);
+            T sum = init_val;
+
+            if((beta == 0) && (xterm == 0))
+               return init_val;
+
+            //
+            // Backwards recursion first, this is the stable
+            // direction for recursion:
+            //
+            T last_term = 0;
+            boost::uintmax_t count = k;
+            for(int i = k; i >= 0; --i)
+            {
+               T term = beta * pois;
+               sum += term;
+               if(((fabs(term/sum) < errtol) && (last_term >= term)) || (term == 0))
+               {
+                  count = k - i;
+                  break;
+               }
+               pois *= i / l2;
+               beta += xterm;
+               xterm *= (a + i - 1) / (x * (a + b + i - 2));
+               last_term = term;
+            }
+            for(int i = k + 1; ; ++i)
+            {
+               poisf *= l2 / i;
+               xtermf *= (x * (a + b + i - 2)) / (a + i - 1);
+               betaf -= xtermf;
+
+               T term = poisf * betaf;
+               sum += term;
+               if((fabs(term/sum) < errtol) || (term == 0))
+               {
+                  break;
+               }
+               if(static_cast<boost::uintmax_t>(count + i - k) > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "cdf(non_central_beta_distribution<%1%>, %1%)",
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+            }
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_beta_q(T a, T b, T lam, T x, T y, const Policy& pol, T init_val = 0)
+         {
+            BOOST_MATH_STD_USING
+               using namespace boost::math;
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T l2 = lam / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term:
+            //
+            int k = itrunc(l2);
+            T pois;
+            if(k <= 30)
+            {
+               //
+               // Might as well start at 0 since we'll likely have this number of terms anyway:
+               //
+               if(a + b > 1)
+                  k = 0;
+               else if(k == 0)
+                  k = 1;
+            }
+            if(k == 0)
+            {
+               // Starting Poisson weight:
+               pois = exp(-l2);
+            }
+            else
+            {
+               // Starting Poisson weight:
+               pois = gamma_p_derivative(T(k+1), l2, pol);
+            }
+            if(pois == 0)
+               return init_val;
+            // recurance term:
+            T xterm;
+            // Starting beta term:
+            T beta = x < y
+               ? detail::ibeta_imp(T(a + k), b, x, pol, true, true, &xterm)
+               : detail::ibeta_imp(b, T(a + k), y, pol, false, true, &xterm);
+
+            xterm *= y / (a + b + k - 1);
+            T poisf(pois), betaf(beta), xtermf(xterm);
+            T sum = init_val;
+            if((beta == 0) && (xterm == 0))
+               return init_val;
+            //
+            // Forwards recursion first, this is the stable
+            // direction for recursion, and the location
+            // of the bulk of the sum:
+            //
+            T last_term = 0;
+            boost::uintmax_t count = 0;
+            for(int i = k + 1; ; ++i)
+            {
+               poisf *= l2 / i;
+               xtermf *= (x * (a + b + i - 2)) / (a + i - 1);
+               betaf += xtermf;
+
+               T term = poisf * betaf;
+               sum += term;
+               if((fabs(term/sum) < errtol) && (last_term >= term))
+               {
+                  count = i - k;
+                  break;
+               }
+               if(static_cast<boost::uintmax_t>(i - k) > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "cdf(non_central_beta_distribution<%1%>, %1%)",
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+               last_term = term;
+            }
+            for(int i = k; i >= 0; --i)
+            {
+               T term = beta * pois;
+               sum += term;
+               if(fabs(term/sum) < errtol)
+               {
+                  break;
+               }
+               if(static_cast<boost::uintmax_t>(count + k - i) > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "cdf(non_central_beta_distribution<%1%>, %1%)",
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+               pois *= i / l2;
+               beta -= xterm;
+               xterm *= (a + i - 1) / (x * (a + b + i - 2));
+            }
+            return sum;
+         }
+
+         template <class RealType, class Policy>
+         inline RealType non_central_beta_cdf(RealType x, RealType y, RealType a, RealType b, RealType l, bool invert, const Policy&)
+         {
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            BOOST_MATH_STD_USING
+
+            if(x == 0)
+               return invert ? 1.0f : 0.0f;
+            if(y == 0)
+               return invert ? 0.0f : 1.0f;
+            value_type result;
+            value_type c = a + b + l / 2;
+            value_type cross = 1 - (b / c) * (1 + l / (2 * c * c));
+            if(l == 0)
+               result = cdf(boost::math::beta_distribution<RealType, Policy>(a, b), x);
+            else if(x > cross)
+            {
+               // Complement is the smaller of the two:
+               result = detail::non_central_beta_q(
+                  static_cast<value_type>(a),
+                  static_cast<value_type>(b),
+                  static_cast<value_type>(l),
+                  static_cast<value_type>(x),
+                  static_cast<value_type>(y),
+                  forwarding_policy(),
+                  static_cast<value_type>(invert ? 0 : -1));
+               invert = !invert;
+            }
+            else
+            {
+               result = detail::non_central_beta_p(
+                  static_cast<value_type>(a),
+                  static_cast<value_type>(b),
+                  static_cast<value_type>(l),
+                  static_cast<value_type>(x),
+                  static_cast<value_type>(y),
+                  forwarding_policy(),
+                  static_cast<value_type>(invert ? -1 : 0));
+            }
+            if(invert)
+               result = -result;
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               "boost::math::non_central_beta_cdf<%1%>(%1%, %1%, %1%)");
+         }
+
+         template <class T, class Policy>
+         struct nc_beta_quantile_functor
+         {
+            nc_beta_quantile_functor(const non_central_beta_distribution<T,Policy>& d, T t, bool c)
+               : dist(d), target(t), comp(c) {}
+
+            T operator()(const T& x)
+            {
+               return comp ?
+                  T(target - cdf(complement(dist, x)))
+                  : T(cdf(dist, x) - target);
+            }
+
+         private:
+            non_central_beta_distribution<T,Policy> dist;
+            T target;
+            bool comp;
+         };
+
+         //
+         // This is more or less a copy of bracket_and_solve_root, but
+         // modified to search only the interval [0,1] using similar
+         // heuristics.
+         //
+         template <class F, class T, class Tol, class Policy>
+         std::pair<T, T> bracket_and_solve_root_01(F f, const T& guess, T factor, bool rising, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+               static const char* function = "boost::math::tools::bracket_and_solve_root_01<%1%>";
+            //
+            // Set up inital brackets:
+            //
+            T a = guess;
+            T b = a;
+            T fa = f(a);
+            T fb = fa;
+            //
+            // Set up invocation count:
+            //
+            boost::uintmax_t count = max_iter - 1;
+
+            if((fa < 0) == (guess < 0 ? !rising : rising))
+            {
+               //
+               // Zero is to the right of b, so walk upwards
+               // until we find it:
+               //
+               while((boost::math::sign)(fb) == (boost::math::sign)(fa))
+               {
+                  if(count == 0)
+                  {
+                     b = policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", b, pol);
+                     return std::make_pair(a, b);
+                  }
+                  //
+                  // Heuristic: every 20 iterations we double the growth factor in case the
+                  // initial guess was *really* bad !
+                  //
+                  if((max_iter - count) % 20 == 0)
+                     factor *= 2;
+                  //
+                  // Now go ahead and move are guess by "factor",
+                  // we do this by reducing 1-guess by factor:
+                  //
+                  a = b;
+                  fa = fb;
+                  b = 1 - ((1 - b) / factor);
+                  fb = f(b);
+                  --count;
+                  BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+               }
+            }
+            else
+            {
+               //
+               // Zero is to the left of a, so walk downwards
+               // until we find it:
+               //
+               while((boost::math::sign)(fb) == (boost::math::sign)(fa))
+               {
+                  if(fabs(a) < tools::min_value<T>())
+                  {
+                     // Escape route just in case the answer is zero!
+                     max_iter -= count;
+                     max_iter += 1;
+                     return a > 0 ? std::make_pair(T(0), T(a)) : std::make_pair(T(a), T(0));
+                  }
+                  if(count == 0)
+                  {
+                     a = policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", a, pol);
+                     return std::make_pair(a, b);
+                  }
+                  //
+                  // Heuristic: every 20 iterations we double the growth factor in case the
+                  // initial guess was *really* bad !
+                  //
+                  if((max_iter - count) % 20 == 0)
+                     factor *= 2;
+                  //
+                  // Now go ahead and move are guess by "factor":
+                  //
+                  b = a;
+                  fb = fa;
+                  a /= factor;
+                  fa = f(a);
+                  --count;
+                  BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+               }
+            }
+            max_iter -= count;
+            max_iter += 1;
+            std::pair<T, T> r = toms748_solve(
+               f,
+               (a < 0 ? b : a),
+               (a < 0 ? a : b),
+               (a < 0 ? fb : fa),
+               (a < 0 ? fa : fb),
+               tol,
+               count,
+               pol);
+            max_iter += count;
+            BOOST_MATH_INSTRUMENT_CODE("max_iter = " << max_iter << " count = " << count);
+            return r;
+         }
+
+         template <class RealType, class Policy>
+         RealType nc_beta_quantile(const non_central_beta_distribution<RealType, Policy>& dist, const RealType& p, bool comp)
+         {
+            static const char* function = "quantile(non_central_beta_distribution<%1%>, %1%)";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            value_type a = dist.alpha();
+            value_type b = dist.beta();
+            value_type l = dist.non_centrality();
+            value_type r;
+            if(!beta_detail::check_alpha(
+               function,
+               a, &r, Policy())
+               ||
+            !beta_detail::check_beta(
+               function,
+               b, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !detail::check_probability(
+               function,
+               static_cast<value_type>(p),
+               &r,
+               Policy()))
+                  return (RealType)r;
+            //
+            // Special cases first:
+            //
+            if(p == 0)
+               return comp
+               ? 1.0f
+               : 0.0f;
+            if(p == 1)
+               return !comp
+               ? 1.0f
+               : 0.0f;
+
+            value_type c = a + b + l / 2;
+            value_type mean = 1 - (b / c) * (1 + l / (2 * c * c));
+            /*
+            //
+            // Calculate a normal approximation to the quantile,
+            // uses mean and variance approximations from:
+            // Algorithm AS 310:
+            // Computing the Non-Central Beta Distribution Function
+            // R. Chattamvelli; R. Shanmugam
+            // Applied Statistics, Vol. 46, No. 1. (1997), pp. 146-156.
+            //
+            // Unfortunately, when this is wrong it tends to be *very*
+            // wrong, so it's disabled for now, even though it often
+            // gets the initial guess quite close.  Probably we could
+            // do much better by factoring in the skewness if only
+            // we could calculate it....
+            //
+            value_type delta = l / 2;
+            value_type delta2 = delta * delta;
+            value_type delta3 = delta * delta2;
+            value_type delta4 = delta2 * delta2;
+            value_type G = c * (c + 1) + delta;
+            value_type alpha = a + b;
+            value_type alpha2 = alpha * alpha;
+            value_type eta = (2 * alpha + 1) * (2 * alpha + 1) + 1;
+            value_type H = 3 * alpha2 + 5 * alpha + 2;
+            value_type F = alpha2 * (alpha + 1) + H * delta
+               + (2 * alpha + 4) * delta2 + delta3;
+            value_type P = (3 * alpha + 1) * (9 * alpha + 17)
+               + 2 * alpha * (3 * alpha + 2) * (3 * alpha + 4) + 15;
+            value_type Q = 54 * alpha2 + 162 * alpha + 130;
+            value_type R = 6 * (6 * alpha + 11);
+            value_type D = delta
+               * (H * H + 2 * P * delta + Q * delta2 + R * delta3 + 9 * delta4);
+            value_type variance = (b / G)
+               * (1 + delta * (l * l + 3 * l + eta) / (G * G))
+               - (b * b / F) * (1 + D / (F * F));
+            value_type sd = sqrt(variance);
+
+            value_type guess = comp
+               ? quantile(complement(normal_distribution<RealType, Policy>(static_cast<RealType>(mean), static_cast<RealType>(sd)), p))
+               : quantile(normal_distribution<RealType, Policy>(static_cast<RealType>(mean), static_cast<RealType>(sd)), p);
+
+            if(guess >= 1)
+               guess = mean;
+            if(guess <= tools::min_value<value_type>())
+               guess = mean;
+            */
+            value_type guess = mean;
+            detail::nc_beta_quantile_functor<value_type, Policy>
+               f(non_central_beta_distribution<value_type, Policy>(a, b, l), p, comp);
+            tools::eps_tolerance<value_type> tol(policies::digits<RealType, Policy>());
+            boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+
+            std::pair<value_type, value_type> ir
+               = bracket_and_solve_root_01(
+                  f, guess, value_type(2.5), true, tol,
+                  max_iter, Policy());
+            value_type result = ir.first + (ir.second - ir.first) / 2;
+
+            if(max_iter >= policies::get_max_root_iterations<Policy>())
+            {
+               return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+                  " either there is no answer to quantile of the non central beta distribution"
+                  " or the answer is infinite.  Current best guess is %1%",
+                  policies::checked_narrowing_cast<RealType, forwarding_policy>(
+                     result,
+                     function), Policy());
+            }
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+
+         template <class T, class Policy>
+         T non_central_beta_pdf(T a, T b, T lam, T x, T y, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+               using namespace boost::math;
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T l2 = lam / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term:
+            //
+            int k = itrunc(l2);
+            // Starting Poisson weight:
+            T pois = gamma_p_derivative(T(k+1), l2, pol);
+            // Starting beta term:
+            T beta = x < y ?
+               ibeta_derivative(a + k, b, x, pol)
+               : ibeta_derivative(b, a + k, y, pol);
+            T sum = 0;
+            T poisf(pois);
+            T betaf(beta);
+
+            //
+            // Stable backwards recursion first:
+            //
+            boost::uintmax_t count = k;
+            for(int i = k; i >= 0; --i)
+            {
+               T term = beta * pois;
+               sum += term;
+               if((fabs(term/sum) < errtol) || (term == 0))
+               {
+                  count = k - i;
+                  break;
+               }
+               pois *= i / l2;
+               beta *= (a + i - 1) / (x * (a + i + b - 1));
+            }
+            for(int i = k + 1; ; ++i)
+            {
+               poisf *= l2 / i;
+               betaf *= x * (a + b + i - 1) / (a + i - 1);
+
+               T term = poisf * betaf;
+               sum += term;
+               if((fabs(term/sum) < errtol) || (term == 0))
+               {
+                  break;
+               }
+               if(static_cast<boost::uintmax_t>(count + i - k) > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "pdf(non_central_beta_distribution<%1%>, %1%)",
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+            }
+            return sum;
+         }
+
+         template <class RealType, class Policy>
+         RealType nc_beta_pdf(const non_central_beta_distribution<RealType, Policy>& dist, const RealType& x)
+         {
+            BOOST_MATH_STD_USING
+            static const char* function = "pdf(non_central_beta_distribution<%1%>, %1%)";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            value_type a = dist.alpha();
+            value_type b = dist.beta();
+            value_type l = dist.non_centrality();
+            value_type r;
+            if(!beta_detail::check_alpha(
+               function,
+               a, &r, Policy())
+               ||
+            !beta_detail::check_beta(
+               function,
+               b, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !beta_detail::check_x(
+               function,
+               static_cast<value_type>(x),
+               &r,
+               Policy()))
+                  return (RealType)r;
+
+            if(l == 0)
+               return pdf(boost::math::beta_distribution<RealType, Policy>(dist.alpha(), dist.beta()), x);
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               non_central_beta_pdf(a, b, l, static_cast<value_type>(x), value_type(1 - static_cast<value_type>(x)), forwarding_policy()),
+               "function");
+         }
+
+         template <class T>
+         struct hypergeometric_2F2_sum
+         {
+            typedef T result_type;
+            hypergeometric_2F2_sum(T a1_, T a2_, T b1_, T b2_, T z_) : a1(a1_), a2(a2_), b1(b1_), b2(b2_), z(z_), term(1), k(0) {}
+            T operator()()
+            {
+               T result = term;
+               term *= a1 * a2 / (b1 * b2);
+               a1 += 1;
+               a2 += 1;
+               b1 += 1;
+               b2 += 1;
+               k += 1;
+               term /= k;
+               term *= z;
+               return result;
+            }
+            T a1, a2, b1, b2, z, term, k;
+         };
+
+         template <class T, class Policy>
+         T hypergeometric_2F2(T a1, T a2, T b1, T b2, T z, const Policy& pol)
+         {
+            typedef typename policies::evaluation<T, Policy>::type value_type;
+
+            const char* function = "boost::math::detail::hypergeometric_2F2<%1%>(%1%,%1%,%1%,%1%,%1%)";
+
+            hypergeometric_2F2_sum<value_type> s(a1, a2, b1, b2, z);
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+            value_type zero = 0;
+            value_type result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<value_type, Policy>(), max_iter, zero);
+#else
+            value_type result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<value_type, Policy>(), max_iter);
+#endif
+            policies::check_series_iterations<T>(function, max_iter, pol);
+            return policies::checked_narrowing_cast<T, Policy>(result, function);
+         }
+
+      } // namespace detail
+
+      template <class RealType = double, class Policy = policies::policy<> >
+      class non_central_beta_distribution
+      {
+      public:
+         typedef RealType value_type;
+         typedef Policy policy_type;
+
+         non_central_beta_distribution(RealType a_, RealType b_, RealType lambda) : a(a_), b(b_), ncp(lambda)
+         {
+            const char* function = "boost::math::non_central_beta_distribution<%1%>::non_central_beta_distribution(%1%,%1%)";
+            RealType r;
+            beta_detail::check_alpha(
+               function,
+               a, &r, Policy());
+            beta_detail::check_beta(
+               function,
+               b, &r, Policy());
+            detail::check_non_centrality(
+               function,
+               lambda,
+               &r,
+               Policy());
+         } // non_central_beta_distribution constructor.
+
+         RealType alpha() const
+         { // Private data getter function.
+            return a;
+         }
+         RealType beta() const
+         { // Private data getter function.
+            return b;
+         }
+         RealType non_centrality() const
+         { // Private data getter function.
+            return ncp;
+         }
+      private:
+         // Data member, initialized by constructor.
+         RealType a;   // alpha.
+         RealType b;   // beta.
+         RealType ncp; // non-centrality parameter
+      }; // template <class RealType, class Policy> class non_central_beta_distribution
+
+      typedef non_central_beta_distribution<double> non_central_beta; // Reserved name of type double.
+
+      // Non-member functions to give properties of the distribution.
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> range(const non_central_beta_distribution<RealType, Policy>& /* dist */)
+      { // Range of permissible values for random variable k.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+      }
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> support(const non_central_beta_distribution<RealType, Policy>& /* dist */)
+      { // Range of supported values for random variable k.
+         // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mode(const non_central_beta_distribution<RealType, Policy>& dist)
+      { // mode.
+         static const char* function = "mode(non_central_beta_distribution<%1%> const&)";
+
+         RealType a = dist.alpha();
+         RealType b = dist.beta();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!beta_detail::check_alpha(
+               function,
+               a, &r, Policy())
+               ||
+            !beta_detail::check_beta(
+               function,
+               b, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+                  return (RealType)r;
+         RealType c = a + b + l / 2;
+         RealType mean = 1 - (b / c) * (1 + l / (2 * c * c));
+         return detail::generic_find_mode_01(
+            dist,
+            mean,
+            function);
+      }
+
+      //
+      // We don't have the necessary information to implement
+      // these at present.  These are just disabled for now,
+      // prototypes retained so we can fill in the blanks
+      // later:
+      //
+      template <class RealType, class Policy>
+      inline RealType mean(const non_central_beta_distribution<RealType, Policy>& dist)
+      {
+         BOOST_MATH_STD_USING
+         RealType a = dist.alpha();
+         RealType b = dist.beta();
+         RealType d = dist.non_centrality();
+         RealType apb = a + b;
+         return exp(-d / 2) * a * detail::hypergeometric_2F2<RealType, Policy>(1 + a, apb, a, 1 + apb, d / 2, Policy()) / apb;
+      } // mean
+
+      template <class RealType, class Policy>
+      inline RealType variance(const non_central_beta_distribution<RealType, Policy>& dist)
+      { 
+         //
+         // Relative error of this function may be arbitarily large... absolute
+         // error will be small however... that's the best we can do for now.
+         //
+         BOOST_MATH_STD_USING
+         RealType a = dist.alpha();
+         RealType b = dist.beta();
+         RealType d = dist.non_centrality();
+         RealType apb = a + b;
+         RealType result = detail::hypergeometric_2F2(RealType(1 + a), apb, a, RealType(1 + apb), RealType(d / 2), Policy());
+         result *= result * -exp(-d) * a * a / (apb * apb);
+         result += exp(-d / 2) * a * (1 + a) * detail::hypergeometric_2F2(RealType(2 + a), apb, a, RealType(2 + apb), RealType(d / 2), Policy()) / (apb * (1 + apb));
+         return result;
+      }
+
+      // RealType standard_deviation(const non_central_beta_distribution<RealType, Policy>& dist)
+      // standard_deviation provided by derived accessors.
+      template <class RealType, class Policy>
+      inline RealType skewness(const non_central_beta_distribution<RealType, Policy>& /*dist*/)
+      { // skewness = sqrt(l).
+         const char* function = "boost::math::non_central_beta_distribution<%1%>::skewness()";
+         typedef typename Policy::assert_undefined_type assert_type;
+         BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+         return policies::raise_evaluation_error<RealType>(
+            function,
+            "This function is not yet implemented, the only sensible result is %1%.",
+            std::numeric_limits<RealType>::quiet_NaN(), Policy()); // infinity?
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis_excess(const non_central_beta_distribution<RealType, Policy>& /*dist*/)
+      {
+         const char* function = "boost::math::non_central_beta_distribution<%1%>::kurtosis_excess()";
+         typedef typename Policy::assert_undefined_type assert_type;
+         BOOST_STATIC_ASSERT(assert_type::value == 0);
+
+         return policies::raise_evaluation_error<RealType>(
+            function,
+            "This function is not yet implemented, the only sensible result is %1%.",
+            std::numeric_limits<RealType>::quiet_NaN(), Policy()); // infinity?
+      } // kurtosis_excess
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis(const non_central_beta_distribution<RealType, Policy>& dist)
+      {
+         return kurtosis_excess(dist) + 3;
+      }
+
+      template <class RealType, class Policy>
+      inline RealType pdf(const non_central_beta_distribution<RealType, Policy>& dist, const RealType& x)
+      { // Probability Density/Mass Function.
+         return detail::nc_beta_pdf(dist, x);
+      } // pdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const non_central_beta_distribution<RealType, Policy>& dist, const RealType& x)
+      {
+         const char* function = "boost::math::non_central_beta_distribution<%1%>::cdf(%1%)";
+            RealType a = dist.alpha();
+            RealType b = dist.beta();
+            RealType l = dist.non_centrality();
+            RealType r;
+            if(!beta_detail::check_alpha(
+               function,
+               a, &r, Policy())
+               ||
+            !beta_detail::check_beta(
+               function,
+               b, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !beta_detail::check_x(
+               function,
+               x,
+               &r,
+               Policy()))
+                  return (RealType)r;
+
+         if(l == 0)
+            return cdf(beta_distribution<RealType, Policy>(a, b), x);
+
+         return detail::non_central_beta_cdf(x, RealType(1 - x), a, b, l, false, Policy());
+      } // cdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const complemented2_type<non_central_beta_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function
+         const char* function = "boost::math::non_central_beta_distribution<%1%>::cdf(%1%)";
+         non_central_beta_distribution<RealType, Policy> const& dist = c.dist;
+            RealType a = dist.alpha();
+            RealType b = dist.beta();
+            RealType l = dist.non_centrality();
+            RealType x = c.param;
+            RealType r;
+            if(!beta_detail::check_alpha(
+               function,
+               a, &r, Policy())
+               ||
+            !beta_detail::check_beta(
+               function,
+               b, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !beta_detail::check_x(
+               function,
+               x,
+               &r,
+               Policy()))
+                  return (RealType)r;
+
+         if(l == 0)
+            return cdf(complement(beta_distribution<RealType, Policy>(a, b), x));
+
+         return detail::non_central_beta_cdf(x, RealType(1 - x), a, b, l, true, Policy());
+      } // ccdf
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const non_central_beta_distribution<RealType, Policy>& dist, const RealType& p)
+      { // Quantile (or Percent Point) function.
+         return detail::nc_beta_quantile(dist, p, false);
+      } // quantile
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const complemented2_type<non_central_beta_distribution<RealType, Policy>, RealType>& c)
+      { // Quantile (or Percent Point) function.
+         return detail::nc_beta_quantile(c.dist, c.param, true);
+      } // quantile complement.
+
+   } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_NON_CENTRAL_BETA_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/non_central_chi_squared.hpp b/gatb-core/thirdparty/boost/math/distributions/non_central_chi_squared.hpp
new file mode 100644
index 0000000..88933c1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/non_central_chi_squared.hpp
@@ -0,0 +1,996 @@
+// boost\math\distributions\non_central_chi_squared.hpp
+
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_NON_CENTRAL_CHI_SQUARE_HPP
+#define BOOST_MATH_SPECIAL_NON_CENTRAL_CHI_SQUARE_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp> // for incomplete gamma. gamma_q
+#include <boost/math/special_functions/bessel.hpp> // for cyl_bessel_i
+#include <boost/math/special_functions/round.hpp> // for iround
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/chi_squared.hpp> // central distribution
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/tools/roots.hpp> // for root finding.
+#include <boost/math/distributions/detail/generic_mode.hpp>
+#include <boost/math/distributions/detail/generic_quantile.hpp>
+
+namespace boost
+{
+   namespace math
+   {
+
+      template <class RealType, class Policy>
+      class non_central_chi_squared_distribution;
+
+      namespace detail{
+
+         template <class T, class Policy>
+         T non_central_chi_square_q(T x, T f, T theta, const Policy& pol, T init_sum = 0)
+         {
+            //
+            // Computes the complement of the Non-Central Chi-Square
+            // Distribution CDF by summing a weighted sum of complements
+            // of the central-distributions.  The weighting factor is
+            // a Poisson Distribution.
+            //
+            // This is an application of the technique described in:
+            //
+            // Computing discrete mixtures of continuous
+            // distributions: noncentral chisquare, noncentral t
+            // and the distribution of the square of the sample
+            // multiple correlation coeficient.
+            // D. Benton, K. Krishnamoorthy.
+            // Computational Statistics & Data Analysis 43 (2003) 249 - 267
+            //
+            BOOST_MATH_STD_USING
+
+            // Special case:
+            if(x == 0)
+               return 1;
+
+            //
+            // Initialize the variables we'll be using:
+            //
+            T lambda = theta / 2;
+            T del = f / 2;
+            T y = x / 2;
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T sum = init_sum;
+            //
+            // k is the starting location for iteration, we'll
+            // move both forwards and backwards from this point.
+            // k is chosen as the peek of the Poisson weights, which
+            // will occur *before* the largest term.
+            //
+            int k = iround(lambda, pol);
+            // Forwards and backwards Poisson weights:
+            T poisf = boost::math::gamma_p_derivative(1 + k, lambda, pol);
+            T poisb = poisf * k / lambda;
+            // Initial forwards central chi squared term:
+            T gamf = boost::math::gamma_q(del + k, y, pol);
+            // Forwards and backwards recursion terms on the central chi squared:
+            T xtermf = boost::math::gamma_p_derivative(del + 1 + k, y, pol);
+            T xtermb = xtermf * (del + k) / y;
+            // Initial backwards central chi squared term:
+            T gamb = gamf - xtermb;
+
+            //
+            // Forwards iteration first, this is the
+            // stable direction for the gamma function
+            // recurrences:
+            //
+            int i;
+            for(i = k; static_cast<boost::uintmax_t>(i-k) < max_iter; ++i)
+            {
+               T term = poisf * gamf;
+               sum += term;
+               poisf *= lambda / (i + 1);
+               gamf += xtermf;
+               xtermf *= y / (del + i + 1);
+               if(((sum == 0) || (fabs(term / sum) < errtol)) && (term >= poisf * gamf))
+                  break;
+            }
+            //Error check:
+            if(static_cast<boost::uintmax_t>(i-k) >= max_iter)
+               return policies::raise_evaluation_error(
+                  "cdf(non_central_chi_squared_distribution<%1%>, %1%)",
+                  "Series did not converge, closest value was %1%", sum, pol);
+            //
+            // Now backwards iteration: the gamma
+            // function recurrences are unstable in this
+            // direction, we rely on the terms deminishing in size
+            // faster than we introduce cancellation errors.
+            // For this reason it's very important that we start
+            // *before* the largest term so that backwards iteration
+            // is strictly converging.
+            //
+            for(i = k - 1; i >= 0; --i)
+            {
+               T term = poisb * gamb;
+               sum += term;
+               poisb *= i / lambda;
+               xtermb *= (del + i) / y;
+               gamb -= xtermb;
+               if((sum == 0) || (fabs(term / sum) < errtol))
+                  break;
+            }
+
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_chi_square_p_ding(T x, T f, T theta, const Policy& pol, T init_sum = 0)
+         {
+            //
+            // This is an implementation of:
+            //
+            // Algorithm AS 275:
+            // Computing the Non-Central #2 Distribution Function
+            // Cherng G. Ding
+            // Applied Statistics, Vol. 41, No. 2. (1992), pp. 478-482.
+            //
+            // This uses a stable forward iteration to sum the
+            // CDF, unfortunately this can not be used for large
+            // values of the non-centrality parameter because:
+            // * The first term may underfow to zero.
+            // * We may need an extra-ordinary number of terms
+            //   before we reach the first *significant* term.
+            //
+            BOOST_MATH_STD_USING
+            // Special case:
+            if(x == 0)
+               return 0;
+            T tk = boost::math::gamma_p_derivative(f/2 + 1, x/2, pol);
+            T lambda = theta / 2;
+            T vk = exp(-lambda);
+            T uk = vk;
+            T sum = init_sum + tk * vk;
+            if(sum == 0)
+               return sum;
+
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+
+            int i;
+            T lterm(0), term(0);
+            for(i = 1; static_cast<boost::uintmax_t>(i) < max_iter; ++i)
+            {
+               tk = tk * x / (f + 2 * i);
+               uk = uk * lambda / i;
+               vk = vk + uk;
+               lterm = term;
+               term = vk * tk;
+               sum += term;
+               if((fabs(term / sum) < errtol) && (term <= lterm))
+                  break;
+            }
+            //Error check:
+            if(static_cast<boost::uintmax_t>(i) >= max_iter)
+               return policies::raise_evaluation_error(
+                  "cdf(non_central_chi_squared_distribution<%1%>, %1%)",
+                  "Series did not converge, closest value was %1%", sum, pol);
+            return sum;
+         }
+
+
+         template <class T, class Policy>
+         T non_central_chi_square_p(T y, T n, T lambda, const Policy& pol, T init_sum)
+         {
+            //
+            // This is taken more or less directly from:
+            //
+            // Computing discrete mixtures of continuous
+            // distributions: noncentral chisquare, noncentral t
+            // and the distribution of the square of the sample
+            // multiple correlation coeficient.
+            // D. Benton, K. Krishnamoorthy.
+            // Computational Statistics & Data Analysis 43 (2003) 249 - 267
+            //
+            // We're summing a Poisson weighting term multiplied by
+            // a central chi squared distribution.
+            //
+            BOOST_MATH_STD_USING
+            // Special case:
+            if(y == 0)
+               return 0;
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T errorf(0), errorb(0);
+
+            T x = y / 2;
+            T del = lambda / 2;
+            //
+            // Starting location for the iteration, we'll iterate
+            // both forwards and backwards from this point.  The
+            // location chosen is the maximum of the Poisson weight
+            // function, which ocurrs *after* the largest term in the
+            // sum.
+            //
+            int k = iround(del, pol);
+            T a = n / 2 + k;
+            // Central chi squared term for forward iteration:
+            T gamkf = boost::math::gamma_p(a, x, pol);
+
+            if(lambda == 0)
+               return gamkf;
+            // Central chi squared term for backward iteration:
+            T gamkb = gamkf;
+            // Forwards Poisson weight:
+            T poiskf = gamma_p_derivative(k+1, del, pol);
+            // Backwards Poisson weight:
+            T poiskb = poiskf;
+            // Forwards gamma function recursion term:
+            T xtermf = boost::math::gamma_p_derivative(a, x, pol);
+            // Backwards gamma function recursion term:
+            T xtermb = xtermf * x / a;
+            T sum = init_sum + poiskf * gamkf;
+            if(sum == 0)
+               return sum;
+            int i = 1;
+            //
+            // Backwards recursion first, this is the stable
+            // direction for gamma function recurrences:
+            //
+            while(i <= k)
+            {
+               xtermb *= (a - i + 1) / x;
+               gamkb += xtermb;
+               poiskb = poiskb * (k - i + 1) / del;
+               errorf = errorb;
+               errorb = gamkb * poiskb;
+               sum += errorb;
+               if((fabs(errorb / sum) < errtol) && (errorb <= errorf))
+                  break;
+               ++i;
+            }
+            i = 1;
+            //
+            // Now forwards recursion, the gamma function
+            // recurrence relation is unstable in this direction,
+            // so we rely on the magnitude of successive terms
+            // decreasing faster than we introduce cancellation error.
+            // For this reason it's vital that k is chosen to be *after*
+            // the largest term, so that successive forward iterations
+            // are strictly (and rapidly) converging.
+            //
+            do
+            {
+               xtermf = xtermf * x / (a + i - 1);
+               gamkf = gamkf - xtermf;
+               poiskf = poiskf * del / (k + i);
+               errorf = poiskf * gamkf;
+               sum += errorf;
+               ++i;
+            }while((fabs(errorf / sum) > errtol) && (static_cast<boost::uintmax_t>(i) < max_iter));
+
+            //Error check:
+            if(static_cast<boost::uintmax_t>(i) >= max_iter)
+               return policies::raise_evaluation_error(
+                  "cdf(non_central_chi_squared_distribution<%1%>, %1%)",
+                  "Series did not converge, closest value was %1%", sum, pol);
+
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_chi_square_pdf(T x, T n, T lambda, const Policy& pol)
+         {
+            //
+            // As above but for the PDF:
+            //
+            BOOST_MATH_STD_USING
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T x2 = x / 2;
+            T n2 = n / 2;
+            T l2 = lambda / 2;
+            T sum = 0;
+            int k = itrunc(l2);
+            T pois = gamma_p_derivative(k + 1, l2, pol) * gamma_p_derivative(n2 + k, x2);
+            if(pois == 0)
+               return 0;
+            T poisb = pois;
+            for(int i = k; ; ++i)
+            {
+               sum += pois;
+               if(pois / sum < errtol)
+                  break;
+               if(static_cast<boost::uintmax_t>(i - k) >= max_iter)
+                  return policies::raise_evaluation_error(
+                     "pdf(non_central_chi_squared_distribution<%1%>, %1%)",
+                     "Series did not converge, closest value was %1%", sum, pol);
+               pois *= l2 * x2 / ((i + 1) * (n2 + i));
+            }
+            for(int i = k - 1; i >= 0; --i)
+            {
+               poisb *= (i + 1) * (n2 + i) / (l2 * x2);
+               sum += poisb;
+               if(poisb / sum < errtol)
+                  break;
+            }
+            return sum / 2;
+         }
+
+         template <class RealType, class Policy>
+         inline RealType non_central_chi_squared_cdf(RealType x, RealType k, RealType l, bool invert, const Policy&)
+         {
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            BOOST_MATH_STD_USING
+            value_type result;
+            if(l == 0)
+               result = cdf(boost::math::chi_squared_distribution<RealType, Policy>(k), x);
+            else if(x > k + l)
+            {
+               // Complement is the smaller of the two:
+               result = detail::non_central_chi_square_q(
+                  static_cast<value_type>(x),
+                  static_cast<value_type>(k),
+                  static_cast<value_type>(l),
+                  forwarding_policy(),
+                  static_cast<value_type>(invert ? 0 : -1));
+               invert = !invert;
+            }
+            else if(l < 200)
+            {
+               // For small values of the non-centrality parameter
+               // we can use Ding's method:
+               result = detail::non_central_chi_square_p_ding(
+                  static_cast<value_type>(x),
+                  static_cast<value_type>(k),
+                  static_cast<value_type>(l),
+                  forwarding_policy(),
+                  static_cast<value_type>(invert ? -1 : 0));
+            }
+            else
+            {
+               // For largers values of the non-centrality
+               // parameter Ding's method will consume an
+               // extra-ordinary number of terms, and worse
+               // may return zero when the result is in fact
+               // finite, use Krishnamoorthy's method instead:
+               result = detail::non_central_chi_square_p(
+                  static_cast<value_type>(x),
+                  static_cast<value_type>(k),
+                  static_cast<value_type>(l),
+                  forwarding_policy(),
+                  static_cast<value_type>(invert ? -1 : 0));
+            }
+            if(invert)
+               result = -result;
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               "boost::math::non_central_chi_squared_cdf<%1%>(%1%, %1%, %1%)");
+         }
+
+         template <class T, class Policy>
+         struct nccs_quantile_functor
+         {
+            nccs_quantile_functor(const non_central_chi_squared_distribution<T,Policy>& d, T t, bool c)
+               : dist(d), target(t), comp(c) {}
+
+            T operator()(const T& x)
+            {
+               return comp ?
+                  target - cdf(complement(dist, x))
+                  : cdf(dist, x) - target;
+            }
+
+         private:
+            non_central_chi_squared_distribution<T,Policy> dist;
+            T target;
+            bool comp;
+         };
+
+         template <class RealType, class Policy>
+         RealType nccs_quantile(const non_central_chi_squared_distribution<RealType, Policy>& dist, const RealType& p, bool comp)
+         {
+            BOOST_MATH_STD_USING
+            static const char* function = "quantile(non_central_chi_squared_distribution<%1%>, %1%)";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            value_type k = dist.degrees_of_freedom();
+            value_type l = dist.non_centrality();
+            value_type r;
+            if(!detail::check_df(
+               function,
+               k, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !detail::check_probability(
+               function,
+               static_cast<value_type>(p),
+               &r,
+               Policy()))
+                  return (RealType)r;
+            //
+            // Special cases get short-circuited first:
+            //
+            if(p == 0)
+               return comp ? policies::raise_overflow_error<RealType>(function, 0, Policy()) : 0;
+            if(p == 1)
+               return comp ? 0 : policies::raise_overflow_error<RealType>(function, 0, Policy());
+            //
+            // This is Pearson's approximation to the quantile, see
+            // Pearson, E. S. (1959) "Note on an approximation to the distribution of 
+            // noncentral chi squared", Biometrika 46: 364.
+            // See also:
+            // "A comparison of approximations to percentiles of the noncentral chi2-distribution",
+            // Hardeo Sahai and Mario Miguel Ojeda, Revista de Matematica: Teoria y Aplicaciones 2003 10(1�2) : 57�76.
+            // Note that the latter reference refers to an approximation of the CDF, when they really mean the quantile.
+            //
+            value_type b = -(l * l) / (k + 3 * l);
+            value_type c = (k + 3 * l) / (k + 2 * l);
+            value_type ff = (k + 2 * l) / (c * c);
+            value_type guess;
+            if(comp)
+            {
+               guess = b + c * quantile(complement(chi_squared_distribution<value_type, forwarding_policy>(ff), p));
+            }
+            else
+            {
+               guess = b + c * quantile(chi_squared_distribution<value_type, forwarding_policy>(ff), p);
+            }
+            //
+            // Sometimes guess goes very small or negative, in that case we have
+            // to do something else for the initial guess, this approximation
+            // was provided in a private communication from Thomas Luu, PhD candidate, 
+            // University College London.  It's an asymptotic expansion for the
+            // quantile which usually gets us within an order of magnitude of the
+            // correct answer.
+            //
+            if(guess < 0.005)
+            {
+               value_type pp = comp ? 1 - p : p;
+               //guess = pow(pow(value_type(2), (k / 2 - 1)) * exp(l / 2) * pp * k, 2 / k);
+               guess = pow(pow(value_type(2), (k / 2 - 1)) * exp(l / 2) * pp * k * boost::math::tgamma(k / 2, forwarding_policy()), (2 / k));
+               if(guess == 0)
+                  guess = tools::min_value<value_type>();
+            }
+            value_type result = detail::generic_quantile(
+               non_central_chi_squared_distribution<value_type, forwarding_policy>(k, l),
+               p,
+               guess,
+               comp,
+               function);
+
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+
+         template <class RealType, class Policy>
+         RealType nccs_pdf(const non_central_chi_squared_distribution<RealType, Policy>& dist, const RealType& x)
+         {
+            BOOST_MATH_STD_USING
+            static const char* function = "pdf(non_central_chi_squared_distribution<%1%>, %1%)";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+            value_type k = dist.degrees_of_freedom();
+            value_type l = dist.non_centrality();
+            value_type r;
+            if(!detail::check_df(
+               function,
+               k, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy())
+               ||
+            !detail::check_positive_x(
+               function,
+               (value_type)x,
+               &r,
+               Policy()))
+                  return (RealType)r;
+
+         if(l == 0)
+            return pdf(boost::math::chi_squared_distribution<RealType, forwarding_policy>(dist.degrees_of_freedom()), x);
+
+         // Special case:
+         if(x == 0)
+            return 0;
+         if(l > 50)
+         {
+            r = non_central_chi_square_pdf(static_cast<value_type>(x), k, l, forwarding_policy());
+         }
+         else
+         {
+            r = log(x / l) * (k / 4 - 0.5f) - (x + l) / 2;
+            if(fabs(r) >= tools::log_max_value<RealType>() / 4)
+            {
+               r = non_central_chi_square_pdf(static_cast<value_type>(x), k, l, forwarding_policy());
+            }
+            else
+            {
+               r = exp(r);
+               r = 0.5f * r
+                  * boost::math::cyl_bessel_i(k/2 - 1, sqrt(l * x), forwarding_policy());
+            }
+         }
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               r,
+               function);
+         }
+
+         template <class RealType, class Policy>
+         struct degrees_of_freedom_finder
+         {
+            degrees_of_freedom_finder(
+               RealType lam_, RealType x_, RealType p_, bool c)
+               : lam(lam_), x(x_), p(p_), comp(c) {}
+
+            RealType operator()(const RealType& v)
+            {
+               non_central_chi_squared_distribution<RealType, Policy> d(v, lam);
+               return comp ?
+                  RealType(p - cdf(complement(d, x)))
+                  : RealType(cdf(d, x) - p);
+            }
+         private:
+            RealType lam;
+            RealType x;
+            RealType p;
+            bool comp;
+         };
+
+         template <class RealType, class Policy>
+         inline RealType find_degrees_of_freedom(
+            RealType lam, RealType x, RealType p, RealType q, const Policy& pol)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_degrees_of_freedom";
+            if((p == 0) || (q == 0))
+            {
+               //
+               // Can't a thing if one of p and q is zero:
+               //
+               return policies::raise_evaluation_error<RealType>(function,
+                  "Can't find degrees of freedom when the probability is 0 or 1, only possible answer is %1%",
+                  RealType(std::numeric_limits<RealType>::quiet_NaN()), Policy());
+            }
+            degrees_of_freedom_finder<RealType, Policy> f(lam, x, p < q ? p : q, p < q ? false : true);
+            tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+            boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+            //
+            // Pick an initial guess that we know will give us a probability
+            // right around 0.5.
+            //
+            RealType guess = x - lam;
+            if(guess < 1)
+               guess = 1;
+            std::pair<RealType, RealType> ir = tools::bracket_and_solve_root(
+               f, guess, RealType(2), false, tol, max_iter, pol);
+            RealType result = ir.first + (ir.second - ir.first) / 2;
+            if(max_iter >= policies::get_max_root_iterations<Policy>())
+            {
+               return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+                  " or there is no answer to problem.  Current best guess is %1%", result, Policy());
+            }
+            return result;
+         }
+
+         template <class RealType, class Policy>
+         struct non_centrality_finder
+         {
+            non_centrality_finder(
+               RealType v_, RealType x_, RealType p_, bool c)
+               : v(v_), x(x_), p(p_), comp(c) {}
+
+            RealType operator()(const RealType& lam)
+            {
+               non_central_chi_squared_distribution<RealType, Policy> d(v, lam);
+               return comp ?
+                  RealType(p - cdf(complement(d, x)))
+                  : RealType(cdf(d, x) - p);
+            }
+         private:
+            RealType v;
+            RealType x;
+            RealType p;
+            bool comp;
+         };
+
+         template <class RealType, class Policy>
+         inline RealType find_non_centrality(
+            RealType v, RealType x, RealType p, RealType q, const Policy& pol)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_non_centrality";
+            if((p == 0) || (q == 0))
+            {
+               //
+               // Can't do a thing if one of p and q is zero:
+               //
+               return policies::raise_evaluation_error<RealType>(function,
+                  "Can't find non centrality parameter when the probability is 0 or 1, only possible answer is %1%",
+                  RealType(std::numeric_limits<RealType>::quiet_NaN()), Policy());
+            }
+            non_centrality_finder<RealType, Policy> f(v, x, p < q ? p : q, p < q ? false : true);
+            tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+            boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+            //
+            // Pick an initial guess that we know will give us a probability
+            // right around 0.5.
+            //
+            RealType guess = x - v;
+            if(guess < 1)
+               guess = 1;
+            std::pair<RealType, RealType> ir = tools::bracket_and_solve_root(
+               f, guess, RealType(2), false, tol, max_iter, pol);
+            RealType result = ir.first + (ir.second - ir.first) / 2;
+            if(max_iter >= policies::get_max_root_iterations<Policy>())
+            {
+               return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+                  " or there is no answer to problem.  Current best guess is %1%", result, Policy());
+            }
+            return result;
+         }
+
+      }
+
+      template <class RealType = double, class Policy = policies::policy<> >
+      class non_central_chi_squared_distribution
+      {
+      public:
+         typedef RealType value_type;
+         typedef Policy policy_type;
+
+         non_central_chi_squared_distribution(RealType df_, RealType lambda) : df(df_), ncp(lambda)
+         {
+            const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::non_central_chi_squared_distribution(%1%,%1%)";
+            RealType r;
+            detail::check_df(
+               function,
+               df, &r, Policy());
+            detail::check_non_centrality(
+               function,
+               ncp,
+               &r,
+               Policy());
+         } // non_central_chi_squared_distribution constructor.
+
+         RealType degrees_of_freedom() const
+         { // Private data getter function.
+            return df;
+         }
+         RealType non_centrality() const
+         { // Private data getter function.
+            return ncp;
+         }
+         static RealType find_degrees_of_freedom(RealType lam, RealType x, RealType p)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_degrees_of_freedom";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_degrees_of_freedom(
+               static_cast<value_type>(lam),
+               static_cast<value_type>(x),
+               static_cast<value_type>(p),
+               static_cast<value_type>(1-p),
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+         template <class A, class B, class C>
+         static RealType find_degrees_of_freedom(const complemented3_type<A,B,C>& c)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_degrees_of_freedom";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_degrees_of_freedom(
+               static_cast<value_type>(c.dist),
+               static_cast<value_type>(c.param1),
+               static_cast<value_type>(1-c.param2),
+               static_cast<value_type>(c.param2),
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+         static RealType find_non_centrality(RealType v, RealType x, RealType p)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_non_centrality";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_non_centrality(
+               static_cast<value_type>(v),
+               static_cast<value_type>(x),
+               static_cast<value_type>(p),
+               static_cast<value_type>(1-p),
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+         template <class A, class B, class C>
+         static RealType find_non_centrality(const complemented3_type<A,B,C>& c)
+         {
+            const char* function = "non_central_chi_squared<%1%>::find_non_centrality";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy,
+               policies::promote_float<false>,
+               policies::promote_double<false>,
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_non_centrality(
+               static_cast<value_type>(c.dist),
+               static_cast<value_type>(c.param1),
+               static_cast<value_type>(1-c.param2),
+               static_cast<value_type>(c.param2),
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result,
+               function);
+         }
+      private:
+         // Data member, initialized by constructor.
+         RealType df; // degrees of freedom.
+         RealType ncp; // non-centrality parameter
+      }; // template <class RealType, class Policy> class non_central_chi_squared_distribution
+
+      typedef non_central_chi_squared_distribution<double> non_central_chi_squared; // Reserved name of type double.
+
+      // Non-member functions to give properties of the distribution.
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> range(const non_central_chi_squared_distribution<RealType, Policy>& /* dist */)
+      { // Range of permissible values for random variable k.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // Max integer?
+      }
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> support(const non_central_chi_squared_distribution<RealType, Policy>& /* dist */)
+      { // Range of supported values for random variable k.
+         // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mean(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      { // Mean of poisson distribution = lambda.
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::mean()";
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy()))
+               return r;
+         return k + l;
+      } // mean
+
+      template <class RealType, class Policy>
+      inline RealType mode(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      { // mode.
+         static const char* function = "mode(non_central_chi_squared_distribution<%1%> const&)";
+
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+         return detail::generic_find_mode(dist, 1 + k, function);
+      }
+
+      template <class RealType, class Policy>
+      inline RealType variance(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      { // variance.
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::variance()";
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy()))
+               return r;
+         return 2 * (2 * l + k);
+      }
+
+      // RealType standard_deviation(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      // standard_deviation provided by derived accessors.
+
+      template <class RealType, class Policy>
+      inline RealType skewness(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      { // skewness = sqrt(l).
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::skewness()";
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy()))
+               return r;
+         BOOST_MATH_STD_USING
+            return pow(2 / (k + 2 * l), RealType(3)/2) * (k + 3 * l);
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis_excess(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      {
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::kurtosis_excess()";
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy()))
+               return r;
+         return 12 * (k + 4 * l) / ((k + 2 * l) * (k + 2 * l));
+      } // kurtosis_excess
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis(const non_central_chi_squared_distribution<RealType, Policy>& dist)
+      {
+         return kurtosis_excess(dist) + 3;
+      }
+
+      template <class RealType, class Policy>
+      inline RealType pdf(const non_central_chi_squared_distribution<RealType, Policy>& dist, const RealType& x)
+      { // Probability Density/Mass Function.
+         return detail::nccs_pdf(dist, x);
+      } // pdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const non_central_chi_squared_distribution<RealType, Policy>& dist, const RealType& x)
+      {
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::cdf(%1%)";
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy())
+            ||
+         !detail::check_positive_x(
+            function,
+            x,
+            &r,
+            Policy()))
+               return r;
+
+         return detail::non_central_chi_squared_cdf(x, k, l, false, Policy());
+      } // cdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const complemented2_type<non_central_chi_squared_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function
+         const char* function = "boost::math::non_central_chi_squared_distribution<%1%>::cdf(%1%)";
+         non_central_chi_squared_distribution<RealType, Policy> const& dist = c.dist;
+         RealType x = c.param;
+         RealType k = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            k, &r, Policy())
+            ||
+         !detail::check_non_centrality(
+            function,
+            l,
+            &r,
+            Policy())
+            ||
+         !detail::check_positive_x(
+            function,
+            x,
+            &r,
+            Policy()))
+               return r;
+
+         return detail::non_central_chi_squared_cdf(x, k, l, true, Policy());
+      } // ccdf
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const non_central_chi_squared_distribution<RealType, Policy>& dist, const RealType& p)
+      { // Quantile (or Percent Point) function.
+         return detail::nccs_quantile(dist, p, false);
+      } // quantile
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const complemented2_type<non_central_chi_squared_distribution<RealType, Policy>, RealType>& c)
+      { // Quantile (or Percent Point) function.
+         return detail::nccs_quantile(c.dist, c.param, true);
+      } // quantile complement.
+
+   } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_NON_CENTRAL_CHI_SQUARE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/non_central_f.hpp b/gatb-core/thirdparty/boost/math/distributions/non_central_f.hpp
new file mode 100644
index 0000000..780dbff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/non_central_f.hpp
@@ -0,0 +1,410 @@
+// boost\math\distributions\non_central_f.hpp
+
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_NON_CENTRAL_F_HPP
+#define BOOST_MATH_SPECIAL_NON_CENTRAL_F_HPP
+
+#include <boost/math/distributions/non_central_beta.hpp>
+#include <boost/math/distributions/detail/generic_mode.hpp>
+#include <boost/math/special_functions/pow.hpp>
+
+namespace boost
+{
+   namespace math
+   {
+      template <class RealType = double, class Policy = policies::policy<> >
+      class non_central_f_distribution
+      {
+      public:
+         typedef RealType value_type;
+         typedef Policy policy_type;
+
+         non_central_f_distribution(RealType v1_, RealType v2_, RealType lambda) : v1(v1_), v2(v2_), ncp(lambda)
+         {
+            const char* function = "boost::math::non_central_f_distribution<%1%>::non_central_f_distribution(%1%,%1%)";
+            RealType r;
+            detail::check_df(
+               function,
+               v1, &r, Policy());
+            detail::check_df(
+               function,
+               v2, &r, Policy());
+            detail::check_non_centrality(
+               function,
+               lambda,
+               &r,
+               Policy());
+         } // non_central_f_distribution constructor.
+
+         RealType degrees_of_freedom1()const
+         {
+            return v1;
+         }
+         RealType degrees_of_freedom2()const
+         {
+            return v2;
+         }
+         RealType non_centrality() const
+         { // Private data getter function.
+            return ncp;
+         }
+      private:
+         // Data member, initialized by constructor.
+         RealType v1;   // alpha.
+         RealType v2;   // beta.
+         RealType ncp; // non-centrality parameter
+      }; // template <class RealType, class Policy> class non_central_f_distribution
+
+      typedef non_central_f_distribution<double> non_central_f; // Reserved name of type double.
+
+      // Non-member functions to give properties of the distribution.
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> range(const non_central_f_distribution<RealType, Policy>& /* dist */)
+      { // Range of permissible values for random variable k.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+      }
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> support(const non_central_f_distribution<RealType, Policy>& /* dist */)
+      { // Range of supported values for random variable k.
+         // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mean(const non_central_f_distribution<RealType, Policy>& dist)
+      {
+         const char* function = "mean(non_central_f_distribution<%1%> const&)";
+         RealType v1 = dist.degrees_of_freedom1();
+         RealType v2 = dist.degrees_of_freedom2();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            v1, &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               v2, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+               return r;
+         if(v2 <= 2)
+            return policies::raise_domain_error(
+               function,
+               "Second degrees of freedom parameter was %1%, but must be > 2 !",
+               v2, Policy());
+         return v2 * (v1 + l) / (v1 * (v2 - 2));
+      } // mean
+
+      template <class RealType, class Policy>
+      inline RealType mode(const non_central_f_distribution<RealType, Policy>& dist)
+      { // mode.
+         static const char* function = "mode(non_central_chi_squared_distribution<%1%> const&)";
+
+         RealType n = dist.degrees_of_freedom1();
+         RealType m = dist.degrees_of_freedom2();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            n, &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               m, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+               return r;
+         RealType guess = m > 2 ? RealType(m * (n + l) / (n * (m - 2))) : RealType(1);
+         return detail::generic_find_mode(
+            dist,
+            guess,
+            function);
+      }
+
+      template <class RealType, class Policy>
+      inline RealType variance(const non_central_f_distribution<RealType, Policy>& dist)
+      { // variance.
+         const char* function = "variance(non_central_f_distribution<%1%> const&)";
+         RealType n = dist.degrees_of_freedom1();
+         RealType m = dist.degrees_of_freedom2();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            n, &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               m, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+               return r;
+         if(m <= 4)
+            return policies::raise_domain_error(
+               function,
+               "Second degrees of freedom parameter was %1%, but must be > 4 !",
+               m, Policy());
+         RealType result = 2 * m * m * ((n + l) * (n + l)
+            + (m - 2) * (n + 2 * l));
+         result /= (m - 4) * (m - 2) * (m - 2) * n * n;
+         return result;
+      }
+
+      // RealType standard_deviation(const non_central_f_distribution<RealType, Policy>& dist)
+      // standard_deviation provided by derived accessors.
+
+      template <class RealType, class Policy>
+      inline RealType skewness(const non_central_f_distribution<RealType, Policy>& dist)
+      { // skewness = sqrt(l).
+         const char* function = "skewness(non_central_f_distribution<%1%> const&)";
+         BOOST_MATH_STD_USING
+         RealType n = dist.degrees_of_freedom1();
+         RealType m = dist.degrees_of_freedom2();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            n, &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               m, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+               return r;
+         if(m <= 6)
+            return policies::raise_domain_error(
+               function,
+               "Second degrees of freedom parameter was %1%, but must be > 6 !",
+               m, Policy());
+         RealType result = 2 * constants::root_two<RealType>();
+         result *= sqrt(m - 4);
+         result *= (n * (m + n - 2) *(m + 2 * n - 2)
+            + 3 * (m + n - 2) * (m + 2 * n - 2) * l
+            + 6 * (m + n - 2) * l * l + 2 * l * l * l);
+         result /= (m - 6) * pow(n * (m + n - 2) + 2 * (m + n - 2) * l + l * l, RealType(1.5f));
+         return result;
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis_excess(const non_central_f_distribution<RealType, Policy>& dist)
+      {
+         const char* function = "kurtosis_excess(non_central_f_distribution<%1%> const&)";
+         BOOST_MATH_STD_USING
+         RealType n = dist.degrees_of_freedom1();
+         RealType m = dist.degrees_of_freedom2();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df(
+            function,
+            n, &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               m, &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               l,
+               &r,
+               Policy()))
+               return r;
+         if(m <= 8)
+            return policies::raise_domain_error(
+               function,
+               "Second degrees of freedom parameter was %1%, but must be > 8 !",
+               m, Policy());
+         RealType l2 = l * l;
+         RealType l3 = l2 * l;
+         RealType l4 = l2 * l2;
+         RealType result = (3 * (m - 4) * (n * (m + n - 2)
+            * (4 * (m - 2) * (m - 2)
+            + (m - 2) * (m + 10) * n
+            + (10 + m) * n * n)
+            + 4 * (m + n - 2) * (4 * (m - 2) * (m - 2)
+            + (m - 2) * (10 + m) * n
+            + (10 + m) * n * n) * l + 2 * (10 + m)
+            * (m + n - 2) * (2 * m + 3 * n - 4) * l2
+            + 4 * (10 + m) * (-2 + m + n) * l3
+            + (10 + m) * l4))
+            /
+            ((-8 + m) * (-6 + m) * boost::math::pow<2>(n * (-2 + m + n)
+            + 2 * (-2 + m + n) * l + l2));
+            return result;
+      } // kurtosis_excess
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis(const non_central_f_distribution<RealType, Policy>& dist)
+      {
+         return kurtosis_excess(dist) + 3;
+      }
+
+      template <class RealType, class Policy>
+      inline RealType pdf(const non_central_f_distribution<RealType, Policy>& dist, const RealType& x)
+      { // Probability Density/Mass Function.
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy,
+            policies::promote_float<false>,
+            policies::promote_double<false>,
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+
+         value_type alpha = dist.degrees_of_freedom1() / 2;
+         value_type beta = dist.degrees_of_freedom2() / 2;
+         value_type y = x * alpha / beta;
+         value_type r = pdf(boost::math::non_central_beta_distribution<value_type, forwarding_policy>(alpha, beta, dist.non_centrality()), y / (1 + y));
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            r * (dist.degrees_of_freedom1() / dist.degrees_of_freedom2()) / ((1 + y) * (1 + y)),
+            "pdf(non_central_f_distribution<%1%>, %1%)");
+      } // pdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const non_central_f_distribution<RealType, Policy>& dist, const RealType& x)
+      {
+         const char* function = "cdf(const non_central_f_distribution<%1%>&, %1%)";
+         RealType r;
+         if(!detail::check_df(
+            function,
+            dist.degrees_of_freedom1(), &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               dist.degrees_of_freedom2(), &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               dist.non_centrality(),
+               &r,
+               Policy()))
+               return r;
+
+         if((x < 0) || !(boost::math::isfinite)(x))
+         {
+            return policies::raise_domain_error<RealType>(
+               function, "Random Variable parameter was %1%, but must be > 0 !", x, Policy());
+         }
+
+         RealType alpha = dist.degrees_of_freedom1() / 2;
+         RealType beta = dist.degrees_of_freedom2() / 2;
+         RealType y = x * alpha / beta;
+         RealType c = y / (1 + y);
+         RealType cp = 1 / (1 + y);
+         //
+         // To ensure accuracy, we pass both x and 1-x to the
+         // non-central beta cdf routine, this ensures accuracy
+         // even when we compute x to be ~ 1:
+         //
+         r = detail::non_central_beta_cdf(c, cp, alpha, beta,
+            dist.non_centrality(), false, Policy());
+         return r;
+      } // cdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const complemented2_type<non_central_f_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function
+         const char* function = "cdf(complement(const non_central_f_distribution<%1%>&, %1%))";
+         RealType r;
+         if(!detail::check_df(
+            function,
+            c.dist.degrees_of_freedom1(), &r, Policy())
+               ||
+            !detail::check_df(
+               function,
+               c.dist.degrees_of_freedom2(), &r, Policy())
+               ||
+            !detail::check_non_centrality(
+               function,
+               c.dist.non_centrality(),
+               &r,
+               Policy()))
+               return r;
+
+         if((c.param < 0) || !(boost::math::isfinite)(c.param))
+         {
+            return policies::raise_domain_error<RealType>(
+               function, "Random Variable parameter was %1%, but must be > 0 !", c.param, Policy());
+         }
+
+         RealType alpha = c.dist.degrees_of_freedom1() / 2;
+         RealType beta = c.dist.degrees_of_freedom2() / 2;
+         RealType y = c.param * alpha / beta;
+         RealType x = y / (1 + y);
+         RealType cx = 1 / (1 + y);
+         //
+         // To ensure accuracy, we pass both x and 1-x to the
+         // non-central beta cdf routine, this ensures accuracy
+         // even when we compute x to be ~ 1:
+         //
+         r = detail::non_central_beta_cdf(x, cx, alpha, beta,
+            c.dist.non_centrality(), true, Policy());
+         return r;
+      } // ccdf
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const non_central_f_distribution<RealType, Policy>& dist, const RealType& p)
+      { // Quantile (or Percent Point) function.
+         RealType alpha = dist.degrees_of_freedom1() / 2;
+         RealType beta = dist.degrees_of_freedom2() / 2;
+         RealType x = quantile(boost::math::non_central_beta_distribution<RealType, Policy>(alpha, beta, dist.non_centrality()), p);
+         if(x == 1)
+            return policies::raise_overflow_error<RealType>(
+               "quantile(const non_central_f_distribution<%1%>&, %1%)",
+               "Result of non central F quantile is too large to represent.",
+               Policy());
+         return (x / (1 - x)) * (dist.degrees_of_freedom2() / dist.degrees_of_freedom1());
+      } // quantile
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const complemented2_type<non_central_f_distribution<RealType, Policy>, RealType>& c)
+      { // Quantile (or Percent Point) function.
+         RealType alpha = c.dist.degrees_of_freedom1() / 2;
+         RealType beta = c.dist.degrees_of_freedom2() / 2;
+         RealType x = quantile(complement(boost::math::non_central_beta_distribution<RealType, Policy>(alpha, beta, c.dist.non_centrality()), c.param));
+         if(x == 1)
+            return policies::raise_overflow_error<RealType>(
+               "quantile(complement(const non_central_f_distribution<%1%>&, %1%))",
+               "Result of non central F quantile is too large to represent.",
+               Policy());
+         return (x / (1 - x)) * (c.dist.degrees_of_freedom2() / c.dist.degrees_of_freedom1());
+      } // quantile complement.
+
+   } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_NON_CENTRAL_F_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/non_central_t.hpp b/gatb-core/thirdparty/boost/math/distributions/non_central_t.hpp
new file mode 100644
index 0000000..df7a58e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/non_central_t.hpp
@@ -0,0 +1,1202 @@
+// boost\math\distributions\non_central_t.hpp
+
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_NON_CENTRAL_T_HPP
+#define BOOST_MATH_SPECIAL_NON_CENTRAL_T_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/non_central_beta.hpp> // for nc beta
+#include <boost/math/distributions/normal.hpp> // for normal CDF and quantile
+#include <boost/math/distributions/students_t.hpp>
+#include <boost/math/distributions/detail/generic_quantile.hpp> // quantile
+
+namespace boost
+{
+   namespace math
+   {
+
+      template <class RealType, class Policy>
+      class non_central_t_distribution;
+
+      namespace detail{
+
+         template <class T, class Policy>
+         T non_central_t2_p(T v, T delta, T x, T y, const Policy& pol, T init_val)
+         {
+            BOOST_MATH_STD_USING
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = policies::get_epsilon<T, Policy>();
+            T d2 = delta * delta / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term, we don't
+            // ever allow k == 0 as this can lead to catastrophic
+            // cancellation errors later (test case is v = 1621286869049072.3
+            // delta = 0.16212868690490723, x = 0.86987415482475994).
+            //
+            int k = itrunc(d2);
+            T pois;
+            if(k == 0) k = 1;
+            // Starting Poisson weight:
+            pois = gamma_p_derivative(T(k+1), d2, pol) 
+               * tgamma_delta_ratio(T(k + 1), T(0.5f))
+               * delta / constants::root_two<T>();
+            if(pois == 0)
+               return init_val;
+            T xterm, beta;
+            // Recurrance & starting beta terms:
+            beta = x < y
+               ? detail::ibeta_imp(T(k + 1), T(v / 2), x, pol, false, true, &xterm)
+               : detail::ibeta_imp(T(v / 2), T(k + 1), y, pol, true, true, &xterm);
+            xterm *= y / (v / 2 + k);
+            T poisf(pois), betaf(beta), xtermf(xterm);
+            T sum = init_val;
+            if((xterm == 0) && (beta == 0))
+               return init_val;
+
+            //
+            // Backwards recursion first, this is the stable
+            // direction for recursion:
+            //
+            boost::uintmax_t count = 0;
+            T last_term = 0;
+            for(int i = k; i >= 0; --i)
+            {
+               T term = beta * pois;
+               sum += term;
+               // Don't terminate on first term in case we "fixed" k above:
+               if((fabs(last_term) > fabs(term)) && fabs(term/sum) < errtol)
+                  break;
+               last_term = term;
+               pois *= (i + 0.5f) / d2;
+               beta += xterm;
+               xterm *= (i) / (x * (v / 2 + i - 1));
+               ++count;
+            }
+            last_term = 0;
+            for(int i = k + 1; ; ++i)
+            {
+               poisf *= d2 / (i + 0.5f);
+               xtermf *= (x * (v / 2 + i - 1)) / (i);
+               betaf -= xtermf;
+               T term = poisf * betaf;
+               sum += term;
+               if((fabs(last_term) > fabs(term)) && (fabs(term/sum) < errtol))
+                  break;
+               last_term = term;
+               ++count;
+               if(count > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "cdf(non_central_t_distribution<%1%>, %1%)", 
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+            }
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_t2_q(T v, T delta, T x, T y, const Policy& pol, T init_val)
+         {
+            BOOST_MATH_STD_USING
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T d2 = delta * delta / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term, we don't allow
+            // k == 0 as this can cause catastrophic cancellation errors
+            // (test case is v = 561908036470413.25, delta = 0.056190803647041321,
+            // x = 1.6155232703966216):
+            //
+            int k = itrunc(d2);
+            if(k == 0) k = 1;
+            // Starting Poisson weight:
+            T pois;
+            if((k < (int)(max_factorial<T>::value)) && (d2 < tools::log_max_value<T>()) && (log(d2) * k < tools::log_max_value<T>()))
+            {
+               //
+               // For small k we can optimise this calculation by using
+               // a simpler reduced formula:
+               //
+               pois = exp(-d2);
+               pois *= pow(d2, static_cast<T>(k));
+               pois /= boost::math::tgamma(T(k + 1 + 0.5), pol);
+               pois *= delta / constants::root_two<T>();
+            }
+            else
+            {
+               pois = gamma_p_derivative(T(k+1), d2, pol) 
+                  * tgamma_delta_ratio(T(k + 1), T(0.5f))
+                  * delta / constants::root_two<T>();
+            }
+            if(pois == 0)
+               return init_val;
+            // Recurance term:
+            T xterm;
+            T beta;
+            // Starting beta term:
+            if(k != 0)
+            {
+               beta = x < y 
+                  ? detail::ibeta_imp(T(k + 1), T(v / 2), x, pol, true, true, &xterm) 
+                  : detail::ibeta_imp(T(v / 2), T(k + 1), y, pol, false, true, &xterm);
+
+               xterm *= y / (v / 2 + k);
+            }
+            else
+            {
+               beta = pow(y, v / 2);
+               xterm = beta;
+            }
+            T poisf(pois), betaf(beta), xtermf(xterm);
+            T sum = init_val;
+            if((xterm == 0) && (beta == 0))
+               return init_val;
+
+            //
+            // Fused forward and backwards recursion:
+            //
+            boost::uintmax_t count = 0;
+            T last_term = 0;
+            for(int i = k + 1, j = k; ; ++i, --j)
+            {
+               poisf *= d2 / (i + 0.5f);
+               xtermf *= (x * (v / 2 + i - 1)) / (i);
+               betaf += xtermf;
+               T term = poisf * betaf;
+
+               if(j >= 0)
+               {
+                  term += beta * pois;
+                  pois *= (j + 0.5f) / d2;
+                  beta -= xterm;
+                  xterm *= (j) / (x * (v / 2 + j - 1));
+               }
+
+               sum += term;
+               // Don't terminate on first term in case we "fixed" the value of k above:
+               if((fabs(last_term) > fabs(term)) && fabs(term/sum) < errtol)
+                  break;
+               last_term = term;
+               if(count > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "cdf(non_central_t_distribution<%1%>, %1%)", 
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+               ++count;
+            }
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_t_cdf(T v, T delta, T t, bool invert, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            if ((boost::math::isinf)(v))
+            { // Infinite degrees of freedom, so use normal distribution located at delta.
+               normal_distribution<T, Policy> n(delta, 1); 
+               return cdf(n, t);
+            }
+            //
+            // Otherwise, for t < 0 we have to use the reflection formula:
+            if(t < 0)
+            {
+               t = -t;
+               delta = -delta;
+               invert = !invert;
+            }
+            if(fabs(delta / (4 * v)) < policies::get_epsilon<T, Policy>())
+            {
+               // Approximate with a Student's T centred on delta,
+               // the crossover point is based on eq 2.6 from
+               // "A Comparison of Approximations To Percentiles of the
+               // Noncentral t-Distribution".  H. Sahai and M. M. Ojeda,
+               // Revista Investigacion Operacional Vol 21, No 2, 2000.
+               // Original sources referenced in the above are:
+               // "Some Approximations to the Percentage Points of the Noncentral
+               // t-Distribution". C. van Eeden. International Statistical Review, 29, 4-31.
+               // "Continuous Univariate Distributions".  N.L. Johnson, S. Kotz and
+               // N. Balkrishnan. 1995. John Wiley and Sons New York.
+               T result = cdf(students_t_distribution<T, Policy>(v), t - delta);
+               return invert ? 1 - result : result;
+            }
+            //
+            // x and y are the corresponding random
+            // variables for the noncentral beta distribution,
+            // with y = 1 - x:
+            //
+            T x = t * t / (v + t * t);
+            T y = v / (v + t * t);
+            T d2 = delta * delta;
+            T a = 0.5f;
+            T b = v / 2;
+            T c = a + b + d2 / 2;
+            //
+            // Crossover point for calculating p or q is the same
+            // as for the noncentral beta:
+            //
+            T cross = 1 - (b / c) * (1 + d2 / (2 * c * c));
+            T result;
+            if(x < cross)
+            {
+               //
+               // Calculate p:
+               //
+               if(x != 0)
+               {
+                  result = non_central_beta_p(a, b, d2, x, y, pol);
+                  result = non_central_t2_p(v, delta, x, y, pol, result);
+                  result /= 2;
+               }
+               else
+                  result = 0;
+               result += cdf(boost::math::normal_distribution<T, Policy>(), -delta);
+            }
+            else
+            {
+               //
+               // Calculate q:
+               //
+               invert = !invert;
+               if(x != 0)
+               {
+                  result = non_central_beta_q(a, b, d2, x, y, pol);
+                  result = non_central_t2_q(v, delta, x, y, pol, result);
+                  result /= 2;
+               }
+               else // x == 0
+                  result = cdf(complement(boost::math::normal_distribution<T, Policy>(), -delta));
+            }
+            if(invert)
+               result = 1 - result;
+            return result;
+         }
+
+         template <class T, class Policy>
+         T non_central_t_quantile(const char* function, T v, T delta, T p, T q, const Policy&)
+         {
+            BOOST_MATH_STD_USING
+     //       static const char* function = "quantile(non_central_t_distribution<%1%>, %1%)";
+     // now passed as function
+            typedef typename policies::evaluation<T, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+
+               T r;
+               if(!detail::check_df_gt0_to_inf(
+                  function,
+                  v, &r, Policy())
+                  ||
+               !detail::check_finite(
+                  function,
+                  delta,
+                  &r,
+                  Policy())
+                  ||
+               !detail::check_probability(
+                  function,
+                  p,
+                  &r,
+                  Policy()))
+                     return r;
+
+
+            value_type guess = 0;
+            if ( ((boost::math::isinf)(v)) || (v > 1 / boost::math::tools::epsilon<T>()) )
+            { // Infinite or very large degrees of freedom, so use normal distribution located at delta.
+               normal_distribution<T, Policy> n(delta, 1);
+               if (p < q)
+               {
+                 return quantile(n, p);
+               }
+               else
+               {
+                 return quantile(complement(n, q));
+               }
+            }
+            else if(v > 3)
+            { // Use normal distribution to calculate guess.
+               value_type mean = (v > 1 / policies::get_epsilon<T, Policy>()) ? delta : delta * sqrt(v / 2) * tgamma_delta_ratio((v - 1) * 0.5f, T(0.5f));
+               value_type var = (v > 1 / policies::get_epsilon<T, Policy>()) ? value_type(1) : (((delta * delta + 1) * v) / (v - 2) - mean * mean);
+               if(p < q)
+                  guess = quantile(normal_distribution<value_type, forwarding_policy>(mean, var), p);
+               else
+                  guess = quantile(complement(normal_distribution<value_type, forwarding_policy>(mean, var), q));
+            }
+            //
+            // We *must* get the sign of the initial guess correct, 
+            // or our root-finder will fail, so double check it now:
+            //
+            value_type pzero = non_central_t_cdf(
+               static_cast<value_type>(v), 
+               static_cast<value_type>(delta), 
+               static_cast<value_type>(0), 
+               !(p < q), 
+               forwarding_policy());
+            int s;
+            if(p < q)
+               s = boost::math::sign(p - pzero);
+            else
+               s = boost::math::sign(pzero - q);
+            if(s != boost::math::sign(guess))
+            {
+               guess = s;
+            }
+
+            value_type result = detail::generic_quantile(
+               non_central_t_distribution<value_type, forwarding_policy>(v, delta), 
+               (p < q ? p : q), 
+               guess, 
+               (p >= q), 
+               function);
+            return policies::checked_narrowing_cast<T, forwarding_policy>(
+               result, 
+               function);
+         }
+
+         template <class T, class Policy>
+         T non_central_t2_pdf(T n, T delta, T x, T y, const Policy& pol, T init_val)
+         {
+            BOOST_MATH_STD_USING
+            //
+            // Variables come first:
+            //
+            boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
+            T d2 = delta * delta / 2;
+            //
+            // k is the starting point for iteration, and is the
+            // maximum of the poisson weighting term:
+            //
+            int k = itrunc(d2);
+            T pois, xterm;
+            if(k == 0)
+               k = 1;
+            // Starting Poisson weight:
+            pois = gamma_p_derivative(T(k+1), d2, pol) 
+               * tgamma_delta_ratio(T(k + 1), T(0.5f))
+               * delta / constants::root_two<T>();
+            // Starting beta term:
+            xterm = x < y
+               ? ibeta_derivative(T(k + 1), n / 2, x, pol)
+               : ibeta_derivative(n / 2, T(k + 1), y, pol);
+            T poisf(pois), xtermf(xterm);
+            T sum = init_val;
+            if((pois == 0) || (xterm == 0))
+               return init_val;
+
+            //
+            // Backwards recursion first, this is the stable
+            // direction for recursion:
+            //
+            boost::uintmax_t count = 0;
+            for(int i = k; i >= 0; --i)
+            {
+               T term = xterm * pois;
+               sum += term;
+               if(((fabs(term/sum) < errtol) && (i != k)) || (term == 0))
+                  break;
+               pois *= (i + 0.5f) / d2;
+               xterm *= (i) / (x * (n / 2 + i));
+               ++count;
+               if(count > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "pdf(non_central_t_distribution<%1%>, %1%)", 
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+            }
+            for(int i = k + 1; ; ++i)
+            {
+               poisf *= d2 / (i + 0.5f);
+               xtermf *= (x * (n / 2 + i)) / (i);
+               T term = poisf * xtermf;
+               sum += term;
+               if((fabs(term/sum) < errtol) || (term == 0))
+                  break;
+               ++count;
+               if(count > max_iter)
+               {
+                  return policies::raise_evaluation_error(
+                     "pdf(non_central_t_distribution<%1%>, %1%)", 
+                     "Series did not converge, closest value was %1%", sum, pol);
+               }
+            }
+            return sum;
+         }
+
+         template <class T, class Policy>
+         T non_central_t_pdf(T n, T delta, T t, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            if ((boost::math::isinf)(n))
+            { // Infinite degrees of freedom, so use normal distribution located at delta.
+               normal_distribution<T, Policy> norm(delta, 1); 
+               return pdf(norm, t);
+            }
+            //
+            // Otherwise, for t < 0 we have to use the reflection formula:
+            if(t < 0)
+            {
+               t = -t;
+               delta = -delta;
+            }
+            if(t == 0)
+            {
+               //
+               // Handle this as a special case, using the formula
+               // from Weisstein, Eric W. 
+               // "Noncentral Student's t-Distribution." 
+               // From MathWorld--A Wolfram Web Resource. 
+               // http://mathworld.wolfram.com/NoncentralStudentst-Distribution.html 
+               // 
+               // The formula is simplified thanks to the relation
+               // 1F1(a,b,0) = 1.
+               //
+               return tgamma_delta_ratio(n / 2 + 0.5f, T(0.5f))
+                  * sqrt(n / constants::pi<T>()) 
+                  * exp(-delta * delta / 2) / 2;
+            }
+            if(fabs(delta / (4 * n)) < policies::get_epsilon<T, Policy>())
+            {
+               // Approximate with a Student's T centred on delta,
+               // the crossover point is based on eq 2.6 from
+               // "A Comparison of Approximations To Percentiles of the
+               // Noncentral t-Distribution".  H. Sahai and M. M. Ojeda,
+               // Revista Investigacion Operacional Vol 21, No 2, 2000.
+               // Original sources referenced in the above are:
+               // "Some Approximations to the Percentage Points of the Noncentral
+               // t-Distribution". C. van Eeden. International Statistical Review, 29, 4-31.
+               // "Continuous Univariate Distributions".  N.L. Johnson, S. Kotz and
+               // N. Balkrishnan. 1995. John Wiley and Sons New York.
+               return pdf(students_t_distribution<T, Policy>(n), t - delta);
+            }
+            //
+            // x and y are the corresponding random
+            // variables for the noncentral beta distribution,
+            // with y = 1 - x:
+            //
+            T x = t * t / (n + t * t);
+            T y = n / (n + t * t);
+            T a = 0.5f;
+            T b = n / 2;
+            T d2 = delta * delta;
+            //
+            // Calculate pdf:
+            //
+            T dt = n * t / (n * n + 2 * n * t * t + t * t * t * t);
+            T result = non_central_beta_pdf(a, b, d2, x, y, pol);
+            T tol = tools::epsilon<T>() * result * 500;
+            result = non_central_t2_pdf(n, delta, x, y, pol, result);
+            if(result <= tol)
+               result = 0;
+            result *= dt;
+            return result;
+         }
+
+         template <class T, class Policy>
+         T mean(T v, T delta, const Policy& pol)
+         {
+            if ((boost::math::isinf)(v))
+            {
+               return delta;
+            }
+            BOOST_MATH_STD_USING
+            if (v > 1 / boost::math::tools::epsilon<T>() )
+            {
+              //normal_distribution<T, Policy> n(delta, 1);
+              //return boost::math::mean(n); 
+              return delta;
+            }
+            else
+            {
+             return delta * sqrt(v / 2) * tgamma_delta_ratio((v - 1) * 0.5f, T(0.5f), pol);
+            }
+            // Other moments use mean so using normal distribution is propagated.
+         }
+
+         template <class T, class Policy>
+         T variance(T v, T delta, const Policy& pol)
+         {
+            if ((boost::math::isinf)(v))
+            {
+               return 1;
+            }
+            if (delta == 0)
+            {  // == Student's t
+              return v / (v - 2);
+            }
+            T result = ((delta * delta + 1) * v) / (v - 2);
+            T m = mean(v, delta, pol);
+            result -= m * m;
+            return result;
+         }
+
+         template <class T, class Policy>
+         T skewness(T v, T delta, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            if ((boost::math::isinf)(v))
+            {
+               return 0;
+            }
+            if(delta == 0)
+            { // == Student's t
+              return 0;
+            }
+            T mean = boost::math::detail::mean(v, delta, pol);
+            T l2 = delta * delta;
+            T var = ((l2 + 1) * v) / (v - 2) - mean * mean;
+            T result = -2 * var;
+            result += v * (l2 + 2 * v - 3) / ((v - 3) * (v - 2));
+            result *= mean;
+            result /= pow(var, T(1.5f));
+            return result;
+         }
+
+         template <class T, class Policy>
+         T kurtosis_excess(T v, T delta, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            if ((boost::math::isinf)(v))
+            {
+               return 3;
+            }
+            if (delta == 0)
+            { // == Student's t
+              return 3;
+            }
+            T mean = boost::math::detail::mean(v, delta, pol);
+            T l2 = delta * delta;
+            T var = ((l2 + 1) * v) / (v - 2) - mean * mean;
+            T result = -3 * var;
+            result += v * (l2 * (v + 1) + 3 * (3 * v - 5)) / ((v - 3) * (v - 2));
+            result *= -mean * mean;
+            result += v * v * (l2 * l2 + 6 * l2 + 3) / ((v - 4) * (v - 2));
+            result /= var * var;
+            return result;
+         }
+
+#if 0
+         // 
+         // This code is disabled, since there can be multiple answers to the
+         // question, and it's not clear how to find the "right" one.
+         //
+         template <class RealType, class Policy>
+         struct t_degrees_of_freedom_finder
+         {
+            t_degrees_of_freedom_finder(
+               RealType delta_, RealType x_, RealType p_, bool c)
+               : delta(delta_), x(x_), p(p_), comp(c) {}
+
+            RealType operator()(const RealType& v)
+            {
+               non_central_t_distribution<RealType, Policy> d(v, delta);
+               return comp ?
+                  p - cdf(complement(d, x))
+                  : cdf(d, x) - p;
+            }
+         private:
+            RealType delta;
+            RealType x;
+            RealType p;
+            bool comp;
+         };
+
+         template <class RealType, class Policy>
+         inline RealType find_t_degrees_of_freedom(
+            RealType delta, RealType x, RealType p, RealType q, const Policy& pol)
+         {
+            const char* function = "non_central_t<%1%>::find_degrees_of_freedom";
+            if((p == 0) || (q == 0))
+            {
+               //
+               // Can't a thing if one of p and q is zero:
+               //
+               return policies::raise_evaluation_error<RealType>(function, 
+                  "Can't find degrees of freedom when the probability is 0 or 1, only possible answer is %1%", 
+                  RealType(std::numeric_limits<RealType>::quiet_NaN()), Policy());
+            }
+            t_degrees_of_freedom_finder<RealType, Policy> f(delta, x, p < q ? p : q, p < q ? false : true);
+            tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+            boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+            //
+            // Pick an initial guess:
+            //
+            RealType guess = 200;
+            std::pair<RealType, RealType> ir = tools::bracket_and_solve_root(
+               f, guess, RealType(2), false, tol, max_iter, pol);
+            RealType result = ir.first + (ir.second - ir.first) / 2;
+            if(max_iter >= policies::get_max_root_iterations<Policy>())
+            {
+               return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+                  " or there is no answer to problem.  Current best guess is %1%", result, Policy());
+            }
+            return result;
+         }
+
+         template <class RealType, class Policy>
+         struct t_non_centrality_finder
+         {
+            t_non_centrality_finder(
+               RealType v_, RealType x_, RealType p_, bool c)
+               : v(v_), x(x_), p(p_), comp(c) {}
+
+            RealType operator()(const RealType& delta)
+            {
+               non_central_t_distribution<RealType, Policy> d(v, delta);
+               return comp ?
+                  p - cdf(complement(d, x))
+                  : cdf(d, x) - p;
+            }
+         private:
+            RealType v;
+            RealType x;
+            RealType p;
+            bool comp;
+         };
+
+         template <class RealType, class Policy>
+         inline RealType find_t_non_centrality(
+            RealType v, RealType x, RealType p, RealType q, const Policy& pol)
+         {
+            const char* function = "non_central_t<%1%>::find_t_non_centrality";
+            if((p == 0) || (q == 0))
+            {
+               //
+               // Can't do a thing if one of p and q is zero:
+               //
+               return policies::raise_evaluation_error<RealType>(function, 
+                  "Can't find non-centrality parameter when the probability is 0 or 1, only possible answer is %1%", 
+                  RealType(std::numeric_limits<RealType>::quiet_NaN()), Policy());
+            }
+            t_non_centrality_finder<RealType, Policy> f(v, x, p < q ? p : q, p < q ? false : true);
+            tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+            boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+            //
+            // Pick an initial guess that we know is the right side of
+            // zero:
+            //
+            RealType guess;
+            if(f(0) < 0)
+               guess = 1;
+            else
+               guess = -1;
+            std::pair<RealType, RealType> ir = tools::bracket_and_solve_root(
+               f, guess, RealType(2), false, tol, max_iter, pol);
+            RealType result = ir.first + (ir.second - ir.first) / 2;
+            if(max_iter >= policies::get_max_root_iterations<Policy>())
+            {
+               return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+                  " or there is no answer to problem.  Current best guess is %1%", result, Policy());
+            }
+            return result;
+         }
+#endif
+      } // namespace detail ======================================================================
+
+      template <class RealType = double, class Policy = policies::policy<> >
+      class non_central_t_distribution
+      {
+      public:
+         typedef RealType value_type;
+         typedef Policy policy_type;
+
+         non_central_t_distribution(RealType v_, RealType lambda) : v(v_), ncp(lambda)
+         { 
+            const char* function = "boost::math::non_central_t_distribution<%1%>::non_central_t_distribution(%1%,%1%)";
+            RealType r;
+            detail::check_df_gt0_to_inf(
+               function,
+               v, &r, Policy());
+            detail::check_finite(
+               function,
+               lambda,
+               &r,
+               Policy());
+         } // non_central_t_distribution constructor.
+
+         RealType degrees_of_freedom() const
+         { // Private data getter function.
+            return v;
+         }
+         RealType non_centrality() const
+         { // Private data getter function.
+            return ncp;
+         }
+#if 0
+         // 
+         // This code is disabled, since there can be multiple answers to the
+         // question, and it's not clear how to find the "right" one.
+         //
+         static RealType find_degrees_of_freedom(RealType delta, RealType x, RealType p)
+         {
+            const char* function = "non_central_t<%1%>::find_degrees_of_freedom";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_t_degrees_of_freedom(
+               static_cast<value_type>(delta), 
+               static_cast<value_type>(x), 
+               static_cast<value_type>(p), 
+               static_cast<value_type>(1-p), 
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result, 
+               function);
+         }
+         template <class A, class B, class C>
+         static RealType find_degrees_of_freedom(const complemented3_type<A,B,C>& c)
+         {
+            const char* function = "non_central_t<%1%>::find_degrees_of_freedom";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_t_degrees_of_freedom(
+               static_cast<value_type>(c.dist), 
+               static_cast<value_type>(c.param1), 
+               static_cast<value_type>(1-c.param2), 
+               static_cast<value_type>(c.param2), 
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result, 
+               function);
+         }
+         static RealType find_non_centrality(RealType v, RealType x, RealType p)
+         {
+            const char* function = "non_central_t<%1%>::find_t_non_centrality";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_t_non_centrality(
+               static_cast<value_type>(v), 
+               static_cast<value_type>(x), 
+               static_cast<value_type>(p), 
+               static_cast<value_type>(1-p), 
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result, 
+               function);
+         }
+         template <class A, class B, class C>
+         static RealType find_non_centrality(const complemented3_type<A,B,C>& c)
+         {
+            const char* function = "non_central_t<%1%>::find_t_non_centrality";
+            typedef typename policies::evaluation<RealType, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+            value_type result = detail::find_t_non_centrality(
+               static_cast<value_type>(c.dist), 
+               static_cast<value_type>(c.param1), 
+               static_cast<value_type>(1-c.param2), 
+               static_cast<value_type>(c.param2), 
+               forwarding_policy());
+            return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+               result, 
+               function);
+         }
+#endif
+      private:
+         // Data member, initialized by constructor.
+         RealType v;   // degrees of freedom
+         RealType ncp; // non-centrality parameter
+      }; // template <class RealType, class Policy> class non_central_t_distribution
+
+      typedef non_central_t_distribution<double> non_central_t; // Reserved name of type double.
+
+      // Non-member functions to give properties of the distribution.
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> range(const non_central_t_distribution<RealType, Policy>& /* dist */)
+      { // Range of permissible values for random variable k.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+      }
+
+      template <class RealType, class Policy>
+      inline const std::pair<RealType, RealType> support(const non_central_t_distribution<RealType, Policy>& /* dist */)
+      { // Range of supported values for random variable k.
+         // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+         using boost::math::tools::max_value;
+         return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mode(const non_central_t_distribution<RealType, Policy>& dist)
+      { // mode.
+         static const char* function = "mode(non_central_t_distribution<%1%> const&)";
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+
+         BOOST_MATH_STD_USING
+
+         RealType m = v < 3 ? 0 : detail::mean(v, l, Policy());
+         RealType var = v < 4 ? 1 : detail::variance(v, l, Policy());
+
+         return detail::generic_find_mode(
+            dist, 
+            m,
+            function,
+            sqrt(var));
+      }
+
+      template <class RealType, class Policy>
+      inline RealType mean(const non_central_t_distribution<RealType, Policy>& dist)
+      { 
+         BOOST_MATH_STD_USING
+         const char* function = "mean(const non_central_t_distribution<%1%>&)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+         if(v <= 1)
+            return policies::raise_domain_error<RealType>(
+               function, 
+               "The non-central t distribution has no defined mean for degrees of freedom <= 1: got v=%1%.", v, Policy());
+         // return l * sqrt(v / 2) * tgamma_delta_ratio((v - 1) * 0.5f, RealType(0.5f));
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::mean(static_cast<value_type>(v), static_cast<value_type>(l), forwarding_policy()), function);
+
+      } // mean
+
+      template <class RealType, class Policy>
+      inline RealType variance(const non_central_t_distribution<RealType, Policy>& dist)
+      { // variance.
+         const char* function = "variance(const non_central_t_distribution<%1%>&)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+         BOOST_MATH_STD_USING
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+         if(v <= 2)
+            return policies::raise_domain_error<RealType>(
+               function, 
+               "The non-central t distribution has no defined variance for degrees of freedom <= 2: got v=%1%.", v, Policy());
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::variance(static_cast<value_type>(v), static_cast<value_type>(l), forwarding_policy()), function);
+      }
+
+      // RealType standard_deviation(const non_central_t_distribution<RealType, Policy>& dist)
+      // standard_deviation provided by derived accessors.
+
+      template <class RealType, class Policy>
+      inline RealType skewness(const non_central_t_distribution<RealType, Policy>& dist)
+      { // skewness = sqrt(l).
+         const char* function = "skewness(const non_central_t_distribution<%1%>&)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+         if(v <= 3)
+            return policies::raise_domain_error<RealType>(
+               function, 
+               "The non-central t distribution has no defined skewness for degrees of freedom <= 3: got v=%1%.", v, Policy());;
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::skewness(static_cast<value_type>(v), static_cast<value_type>(l), forwarding_policy()), function);
+      }
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis_excess(const non_central_t_distribution<RealType, Policy>& dist)
+      { 
+         const char* function = "kurtosis_excess(const non_central_t_distribution<%1%>&)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy()))
+               return (RealType)r;
+         if(v <= 4)
+            return policies::raise_domain_error<RealType>(
+               function, 
+               "The non-central t distribution has no defined kurtosis for degrees of freedom <= 4: got v=%1%.", v, Policy());;
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::kurtosis_excess(static_cast<value_type>(v), static_cast<value_type>(l), forwarding_policy()), function);
+      } // kurtosis_excess
+
+      template <class RealType, class Policy>
+      inline RealType kurtosis(const non_central_t_distribution<RealType, Policy>& dist)
+      {
+         return kurtosis_excess(dist) + 3;
+      }
+
+      template <class RealType, class Policy>
+      inline RealType pdf(const non_central_t_distribution<RealType, Policy>& dist, const RealType& t)
+      { // Probability Density/Mass Function.
+         const char* function = "pdf(non_central_t_distribution<%1%>, %1%)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy())
+            ||
+         !detail::check_x(
+            function,
+            t,
+            &r,
+            Policy()))
+               return (RealType)r;
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::non_central_t_pdf(static_cast<value_type>(v), 
+               static_cast<value_type>(l), 
+               static_cast<value_type>(t), 
+               Policy()),
+            function);
+      } // pdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const non_central_t_distribution<RealType, Policy>& dist, const RealType& x)
+      { 
+         const char* function = "boost::math::cdf(non_central_t_distribution<%1%>&, %1%)";
+//   was const char* function = "boost::math::non_central_t_distribution<%1%>::cdf(%1%)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy())
+            ||
+         !detail::check_x(
+            function,
+            x,
+            &r,
+            Policy()))
+               return (RealType)r;
+          if ((boost::math::isinf)(v))
+          { // Infinite degrees of freedom, so use normal distribution located at delta.
+             normal_distribution<RealType, Policy> n(l, 1); 
+             cdf(n, x);
+              //return cdf(normal_distribution<RealType, Policy>(l, 1), x);
+          }
+
+         if(l == 0)
+         { // NO non-centrality, so use Student's t instead.
+            return cdf(students_t_distribution<RealType, Policy>(v), x);
+         }
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::non_central_t_cdf(
+               static_cast<value_type>(v), 
+               static_cast<value_type>(l), 
+               static_cast<value_type>(x), 
+               false, Policy()),
+            function);
+      } // cdf
+
+      template <class RealType, class Policy>
+      RealType cdf(const complemented2_type<non_central_t_distribution<RealType, Policy>, RealType>& c)
+      { // Complemented Cumulative Distribution Function
+  // was       const char* function = "boost::math::non_central_t_distribution<%1%>::cdf(%1%)";
+         const char* function = "boost::math::cdf(const complement(non_central_t_distribution<%1%>&), %1%)";
+         typedef typename policies::evaluation<RealType, Policy>::type value_type;
+         typedef typename policies::normalise<
+            Policy, 
+            policies::promote_float<false>, 
+            policies::promote_double<false>, 
+            policies::discrete_quantile<>,
+            policies::assert_undefined<> >::type forwarding_policy;
+
+         non_central_t_distribution<RealType, Policy> const& dist = c.dist;
+         RealType x = c.param;
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality(); // aka delta
+         RealType r;
+         if(!detail::check_df_gt0_to_inf(
+            function,
+            v, &r, Policy())
+            ||
+         !detail::check_finite(
+            function,
+            l,
+            &r,
+            Policy())
+            ||
+         !detail::check_x(
+            function,
+            x,
+            &r,
+            Policy()))
+               return (RealType)r;
+
+         if ((boost::math::isinf)(v))
+         { // Infinite degrees of freedom, so use normal distribution located at delta.
+             normal_distribution<RealType, Policy> n(l, 1); 
+             return cdf(complement(n, x));
+         }
+         if(l == 0)
+         { // zero non-centrality so use Student's t distribution.
+            return cdf(complement(students_t_distribution<RealType, Policy>(v), x));
+         }
+         return policies::checked_narrowing_cast<RealType, forwarding_policy>(
+            detail::non_central_t_cdf(
+               static_cast<value_type>(v), 
+               static_cast<value_type>(l), 
+               static_cast<value_type>(x), 
+               true, Policy()),
+            function);
+      } // ccdf
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const non_central_t_distribution<RealType, Policy>& dist, const RealType& p)
+      { // Quantile (or Percent Point) function.
+         static const char* function = "quantile(const non_central_t_distribution<%1%>, %1%)";
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         return detail::non_central_t_quantile(function, v, l, p, RealType(1-p), Policy());
+      } // quantile
+
+      template <class RealType, class Policy>
+      inline RealType quantile(const complemented2_type<non_central_t_distribution<RealType, Policy>, RealType>& c)
+      { // Quantile (or Percent Point) function.
+         static const char* function = "quantile(const complement(non_central_t_distribution<%1%>, %1%))";
+         non_central_t_distribution<RealType, Policy> const& dist = c.dist;
+         RealType q = c.param;
+         RealType v = dist.degrees_of_freedom();
+         RealType l = dist.non_centrality();
+         return detail::non_central_t_quantile(function, v, l, RealType(1-q), q, Policy());
+      } // quantile complement.
+
+   } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_MATH_SPECIAL_NON_CENTRAL_T_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/normal.hpp b/gatb-core/thirdparty/boost/math/distributions/normal.hpp
new file mode 100644
index 0000000..32cf66e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/normal.hpp
@@ -0,0 +1,329 @@
+//  Copyright John Maddock 2006, 2007.
+//  Copyright Paul A. Bristow 2006, 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_NORMAL_HPP
+#define BOOST_STATS_NORMAL_HPP
+
+// http://en.wikipedia.org/wiki/Normal_distribution
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm
+// Also:
+// Weisstein, Eric W. "Normal Distribution."
+// From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/NormalDistribution.html
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/erf.hpp> // for erf/erfc.
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class normal_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   normal_distribution(RealType l_mean = 0, RealType sd = 1)
+      : m_mean(l_mean), m_sd(sd)
+   { // Default is a 'standard' normal distribution N01.
+     static const char* function = "boost::math::normal_distribution<%1%>::normal_distribution";
+
+     RealType result;
+     detail::check_scale(function, sd, &result, Policy());
+     detail::check_location(function, l_mean, &result, Policy());
+   }
+
+   RealType mean()const
+   { // alias for location.
+      return m_mean;
+   }
+
+   RealType standard_deviation()const
+   { // alias for scale.
+      return m_sd;
+   }
+
+   // Synonyms, provided to allow generic use of find_location and find_scale.
+   RealType location()const
+   { // location.
+      return m_mean;
+   }
+   RealType scale()const
+   { // scale.
+      return m_sd;
+   }
+
+private:
+   //
+   // Data members:
+   //
+   RealType m_mean;  // distribution mean or location.
+   RealType m_sd;    // distribution standard deviation or scale.
+}; // class normal_distribution
+
+typedef normal_distribution<double> normal;
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const normal_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max value.
+  }
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const normal_distribution<RealType, Policy>& /*dist*/)
+{ // This is range values for random variable x where cdf rises from 0 to 1, and outside it, the pdf is zero.
+  if (std::numeric_limits<RealType>::has_infinity)
+  { 
+     return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity.
+  }
+  else
+  { // Can only use max_value.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(),  max_value<RealType>()); // - to + max value.
+  }
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class RealType, class Policy>
+inline RealType pdf(const normal_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType sd = dist.standard_deviation();
+   RealType mean = dist.mean();
+
+   static const char* function = "boost::math::pdf(const normal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(false == detail::check_scale(function, sd, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_location(function, mean, &result, Policy()))
+   {
+      return result;
+   }
+   if((boost::math::isinf)(x))
+   {
+     return 0; // pdf + and - infinity is zero.
+   }
+   // Below produces MSVC 4127 warnings, so the above used instead.
+   //if(std::numeric_limits<RealType>::has_infinity && abs(x) == std::numeric_limits<RealType>::infinity())
+   //{ // pdf + and - infinity is zero.
+   //  return 0;
+   //}
+   if(false == detail::check_x(function, x, &result, Policy()))
+   {
+      return result;
+   }
+
+   RealType exponent = x - mean;
+   exponent *= -exponent;
+   exponent /= 2 * sd * sd;
+
+   result = exp(exponent);
+   result /= sd * sqrt(2 * constants::pi<RealType>());
+
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const normal_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType sd = dist.standard_deviation();
+   RealType mean = dist.mean();
+   static const char* function = "boost::math::cdf(const normal_distribution<%1%>&, %1%)";
+   RealType result = 0;
+   if(false == detail::check_scale(function, sd, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::check_location(function, mean, &result, Policy()))
+   {
+      return result;
+   }
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 0; // -infinity
+     return 1; // + infinity
+   }
+   // These produce MSVC 4127 warnings, so the above used instead.
+   //if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+   //{ // cdf +infinity is unity.
+   //  return 1;
+   //}
+   //if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+   //{ // cdf -infinity is zero.
+   //  return 0;
+   //}
+   if(false == detail::check_x(function, x, &result, Policy()))
+   {
+     return result;
+   }
+   RealType diff = (x - mean) / (sd * constants::root_two<RealType>());
+   result = boost::math::erfc(-diff, Policy()) / 2;
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const normal_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType sd = dist.standard_deviation();
+   RealType mean = dist.mean();
+   static const char* function = "boost::math::quantile(const normal_distribution<%1%>&, %1%)";
+
+   RealType result = 0;
+   if(false == detail::check_scale(function, sd, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   result= boost::math::erfc_inv(2 * p, Policy());
+   result = -result;
+   result *= sd * constants::root_two<RealType>();
+   result += mean;
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<normal_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType sd = c.dist.standard_deviation();
+   RealType mean = c.dist.mean();
+   RealType x = c.param;
+   static const char* function = "boost::math::cdf(const complement(normal_distribution<%1%>&), %1%)";
+
+   RealType result = 0;
+   if(false == detail::check_scale(function, sd, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 1; // cdf complement -infinity is unity.
+     return 0; // cdf complement +infinity is zero
+   }
+   // These produce MSVC 4127 warnings, so the above used instead.
+   //if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+   //{ // cdf complement +infinity is zero.
+   //  return 0;
+   //}
+   //if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+   //{ // cdf complement -infinity is unity.
+   //  return 1;
+   //}
+   if(false == detail::check_x(function, x, &result, Policy()))
+      return result;
+
+   RealType diff = (x - mean) / (sd * constants::root_two<RealType>());
+   result = boost::math::erfc(diff, Policy()) / 2;
+   return result;
+} // cdf complement
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<normal_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   RealType sd = c.dist.standard_deviation();
+   RealType mean = c.dist.mean();
+   static const char* function = "boost::math::quantile(const complement(normal_distribution<%1%>&), %1%)";
+   RealType result = 0;
+   if(false == detail::check_scale(function, sd, &result, Policy()))
+      return result;
+   if(false == detail::check_location(function, mean, &result, Policy()))
+      return result;
+   RealType q = c.param;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+   result = boost::math::erfc_inv(2 * q, Policy());
+   result *= sd * constants::root_two<RealType>();
+   result += mean;
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType mean(const normal_distribution<RealType, Policy>& dist)
+{
+   return dist.mean();
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const normal_distribution<RealType, Policy>& dist)
+{
+   return dist.standard_deviation();
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const normal_distribution<RealType, Policy>& dist)
+{
+   return dist.mean();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const normal_distribution<RealType, Policy>& dist)
+{
+   return dist.mean();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const normal_distribution<RealType, Policy>& /*dist*/)
+{
+   return 0;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const normal_distribution<RealType, Policy>& /*dist*/)
+{
+   return 3;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const normal_distribution<RealType, Policy>& /*dist*/)
+{
+   return 0;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_NORMAL_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/pareto.hpp b/gatb-core/thirdparty/boost/math/distributions/pareto.hpp
new file mode 100644
index 0000000..1c6cf35
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/pareto.hpp
@@ -0,0 +1,444 @@
+//  Copyright John Maddock 2007.
+//  Copyright Paul A. Bristow 2007, 2009
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_PARETO_HPP
+#define BOOST_STATS_PARETO_HPP
+
+// http://en.wikipedia.org/wiki/Pareto_distribution
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm
+// Also:
+// Weisstein, Eric W. "Pareto Distribution."
+// From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/ParetoDistribution.html
+// Handbook of Statistical Distributions with Applications, K Krishnamoorthy, ISBN 1-58488-635-8, Chapter 23, pp 257 - 267.
+// Caution KK's a and b are the reverse of Mathworld!
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/special_functions/powm1.hpp>
+
+#include <utility> // for BOOST_CURRENT_VALUE?
+
+namespace boost
+{
+  namespace math
+  {
+    namespace detail
+    { // Parameter checking.
+      template <class RealType, class Policy>
+      inline bool check_pareto_scale(
+        const char* function,
+        RealType scale,
+        RealType* result, const Policy& pol)
+      {
+        if((boost::math::isfinite)(scale))
+        { // any > 0 finite value is OK.
+          if (scale > 0)
+          {
+            return true;
+          }
+          else
+          {
+            *result = policies::raise_domain_error<RealType>(
+              function,
+              "Scale parameter is %1%, but must be > 0!", scale, pol);
+            return false;
+          }
+        }
+        else
+        { // Not finite.
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Scale parameter is %1%, but must be finite!", scale, pol);
+          return false;
+        }
+      } // bool check_pareto_scale
+
+      template <class RealType, class Policy>
+      inline bool check_pareto_shape(
+        const char* function,
+        RealType shape,
+        RealType* result, const Policy& pol)
+      {
+        if((boost::math::isfinite)(shape))
+        { // Any finite value > 0 is OK.
+          if (shape > 0)
+          {
+            return true;
+          }
+          else
+          {
+            *result = policies::raise_domain_error<RealType>(
+              function,
+              "Shape parameter is %1%, but must be > 0!", shape, pol);
+            return false;
+          }
+        }
+        else
+        { // Not finite.
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Shape parameter is %1%, but must be finite!", shape, pol);
+          return false;
+        }
+      } // bool check_pareto_shape(
+
+      template <class RealType, class Policy>
+      inline bool check_pareto_x(
+        const char* function,
+        RealType const& x,
+        RealType* result, const Policy& pol)
+      {
+        if((boost::math::isfinite)(x))
+        { //
+          if (x > 0)
+          {
+            return true;
+          }
+          else
+          {
+            *result = policies::raise_domain_error<RealType>(
+              function,
+              "x parameter is %1%, but must be > 0 !", x, pol);
+            return false;
+          }
+        }
+        else
+        { // Not finite..
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x parameter is %1%, but must be finite!", x, pol);
+          return false;
+        }
+      } // bool check_pareto_x
+
+      template <class RealType, class Policy>
+      inline bool check_pareto( // distribution parameters.
+        const char* function,
+        RealType scale,
+        RealType shape,
+        RealType* result, const Policy& pol)
+      {
+        return check_pareto_scale(function, scale, result, pol)
+           && check_pareto_shape(function, shape, result, pol);
+      } // bool check_pareto(
+
+    } // namespace detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class pareto_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      pareto_distribution(RealType l_scale = 1, RealType l_shape = 1)
+        : m_scale(l_scale), m_shape(l_shape)
+      { // Constructor.
+        RealType result = 0;
+        detail::check_pareto("boost::math::pareto_distribution<%1%>::pareto_distribution", l_scale, l_shape, &result, Policy());
+      }
+
+      RealType scale()const
+      { // AKA Xm and Wolfram b and beta
+        return m_scale;
+      }
+
+      RealType shape()const
+      { // AKA k and Wolfram a and alpha
+        return m_shape;
+      }
+    private:
+      // Data members:
+      RealType m_scale;  // distribution scale (xm) or beta
+      RealType m_shape;  // distribution shape (k) or alpha
+    };
+
+    typedef pareto_distribution<double> pareto; // Convenience to allow pareto(2., 3.);
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const pareto_distribution<RealType, Policy>& /*dist*/)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // scale zero to + infinity.
+    } // range
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const pareto_distribution<RealType, Policy>& dist)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(dist.scale(), max_value<RealType>() ); // scale to + infinity.
+    } // support
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const pareto_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+      BOOST_MATH_STD_USING  // for ADL of std function pow.
+      static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
+      RealType scale = dist.scale();
+      RealType shape = dist.shape();
+      RealType result = 0;
+      if(false == (detail::check_pareto_x(function, x, &result, Policy())
+         && detail::check_pareto(function, scale, shape, &result, Policy())))
+         return result;
+      if (x < scale)
+      { // regardless of shape, pdf is zero (or should be disallow x < scale and throw an exception?).
+        return 0;
+      }
+      result = shape * pow(scale, shape) / pow(x, shape+1);
+      return result;
+    } // pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const pareto_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+      BOOST_MATH_STD_USING  // for ADL of std function pow.
+      static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
+      RealType scale = dist.scale();
+      RealType shape = dist.shape();
+      RealType result = 0;
+
+      if(false == (detail::check_pareto_x(function, x, &result, Policy())
+         && detail::check_pareto(function, scale, shape, &result, Policy())))
+         return result;
+
+      if (x <= scale)
+      { // regardless of shape, cdf is zero.
+        return 0;
+      }
+
+      // result = RealType(1) - pow((scale / x), shape);
+      result = -boost::math::powm1(scale/x, shape, Policy()); // should be more accurate.
+      return result;
+    } // cdf
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const pareto_distribution<RealType, Policy>& dist, const RealType& p)
+    {
+      BOOST_MATH_STD_USING  // for ADL of std function pow.
+      static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
+      RealType result = 0;
+      RealType scale = dist.scale();
+      RealType shape = dist.shape();
+      if(false == (detail::check_probability(function, p, &result, Policy())
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
+      {
+        return result;
+      }
+      if (p == 0)
+      {
+        return scale; // x must be scale (or less).
+      }
+      if (p == 1)
+      {
+        return policies::raise_overflow_error<RealType>(function, 0, Policy()); // x = + infinity.
+      }
+      result = scale /
+        (pow((1 - p), 1 / shape));
+      // K. Krishnamoorthy,  ISBN 1-58488-635-8 eq 23.1.3
+      return result;
+    } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<pareto_distribution<RealType, Policy>, RealType>& c)
+    {
+       BOOST_MATH_STD_USING  // for ADL of std function pow.
+       static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
+       RealType result = 0;
+       RealType x = c.param;
+       RealType scale = c.dist.scale();
+       RealType shape = c.dist.shape();
+       if(false == (detail::check_pareto_x(function, x, &result, Policy())
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
+         return result;
+
+       if (x <= scale)
+       { // regardless of shape, cdf is zero, and complement is unity.
+         return 1;
+       }
+       result = pow((scale/x), shape);
+
+       return result;
+    } // cdf complement
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<pareto_distribution<RealType, Policy>, RealType>& c)
+    {
+      BOOST_MATH_STD_USING  // for ADL of std function pow.
+      static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
+      RealType result = 0;
+      RealType q = c.param;
+      RealType scale = c.dist.scale();
+      RealType shape = c.dist.shape();
+      if(false == (detail::check_probability(function, q, &result, Policy())
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
+      {
+        return result;
+      }
+      if (q == 1)
+      {
+        return scale; // x must be scale (or less).
+      }
+      if (q == 0)
+      {
+         return policies::raise_overflow_error<RealType>(function, 0, Policy()); // x = + infinity.
+      }
+      result = scale / (pow(q, 1 / shape));
+      // K. Krishnamoorthy,  ISBN 1-58488-635-8 eq 23.1.3
+      return result;
+    } // quantile complement
+
+    template <class RealType, class Policy>
+    inline RealType mean(const pareto_distribution<RealType, Policy>& dist)
+    {
+      RealType result = 0;
+      static const char* function = "boost::math::mean(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
+      {
+        return result;
+      }
+      if (dist.shape() > RealType(1))
+      {
+        return dist.shape() * dist.scale() / (dist.shape() - 1);
+      }
+      else
+      {
+        using boost::math::tools::max_value;
+        return max_value<RealType>(); // +infinity.
+      }
+    } // mean
+
+    template <class RealType, class Policy>
+    inline RealType mode(const pareto_distribution<RealType, Policy>& dist)
+    {
+      return dist.scale();
+    } // mode
+
+    template <class RealType, class Policy>
+    inline RealType median(const pareto_distribution<RealType, Policy>& dist)
+    {
+      RealType result = 0;
+      static const char* function = "boost::math::median(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
+      {
+        return result;
+      }
+      BOOST_MATH_STD_USING
+      return dist.scale() * pow(RealType(2), (1/dist.shape()));
+    } // median
+
+    template <class RealType, class Policy>
+    inline RealType variance(const pareto_distribution<RealType, Policy>& dist)
+    {
+      RealType result = 0;
+      RealType scale = dist.scale();
+      RealType shape = dist.shape();
+      static const char* function = "boost::math::variance(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, scale, shape, &result, Policy()))
+      {
+        return result;
+      }
+      if (shape > 2)
+      {
+        result = (scale * scale * shape) /
+         ((shape - 1) *  (shape - 1) * (shape - 2));
+      }
+      else
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "variance is undefined for shape <= 2, but got %1%.", dist.shape(), Policy());
+      }
+      return result;
+    } // variance
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const pareto_distribution<RealType, Policy>& dist)
+    {
+      BOOST_MATH_STD_USING
+      RealType result = 0;
+      RealType shape = dist.shape();
+      static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
+      {
+        return result;
+      }
+      if (shape > 3)
+      {
+        result = sqrt((shape - 2) / shape) *
+          2 * (shape + 1) /
+          (shape - 3);
+      }
+      else
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "skewness is undefined for shape <= 3, but got %1%.", dist.shape(), Policy());
+      }
+      return result;
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const pareto_distribution<RealType, Policy>& dist)
+    {
+      RealType result = 0;
+      RealType shape = dist.shape();
+      static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
+      {
+        return result;
+      }
+      if (shape > 4)
+      {
+        result = 3 * ((shape - 2) * (3 * shape * shape + shape + 2)) /
+          (shape * (shape - 3) * (shape - 4));
+      }
+      else
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "kurtosis_excess is undefined for shape <= 4, but got %1%.", shape, Policy());
+      }
+      return result;
+    } // kurtosis
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const pareto_distribution<RealType, Policy>& dist)
+    {
+      RealType result = 0;
+      RealType shape = dist.shape();
+      static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
+      {
+        return result;
+      }
+      if (shape > 4)
+      {
+        result = 6 * ((shape * shape * shape) + (shape * shape) - 6 * shape - 2) /
+          (shape * (shape - 3) * (shape - 4));
+      }
+      else
+      {
+        result = policies::raise_domain_error<RealType>(
+          function,
+          "kurtosis_excess is undefined for shape <= 4, but got %1%.", dist.shape(), Policy());
+      }
+      return result;
+    } // kurtosis_excess
+
+    } // namespace math
+  } // namespace boost
+
+  // This include must be at the end, *after* the accessors
+  // for this distribution have been defined, in order to
+  // keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_PARETO_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/poisson.hpp b/gatb-core/thirdparty/boost/math/distributions/poisson.hpp
new file mode 100644
index 0000000..e4665bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/poisson.hpp
@@ -0,0 +1,527 @@
+// boost\math\distributions\poisson.hpp
+
+// Copyright John Maddock 2006.
+// Copyright Paul A. Bristow 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Poisson distribution is a discrete probability distribution.
+// It expresses the probability of a number (k) of
+// events, occurrences, failures or arrivals occurring in a fixed time,
+// assuming these events occur with a known average or mean rate (lambda)
+// and are independent of the time since the last event.
+// The distribution was discovered by Simeon-Denis Poisson (1781-1840).
+
+// Parameter lambda is the mean number of events in the given time interval.
+// The random variate k is the number of events, occurrences or arrivals.
+// k argument may be integral, signed, or unsigned, or floating point.
+// If necessary, it has already been promoted from an integral type.
+
+// Note that the Poisson distribution
+// (like others including the binomial, negative binomial & Bernoulli)
+// is strictly defined as a discrete function:
+// only integral values of k are envisaged.
+// However because the method of calculation uses a continuous gamma function,
+// it is convenient to treat it as if a continous function,
+// and permit non-integral values of k.
+// To enforce the strict mathematical model, users should use floor or ceil functions
+// on k outside this function to ensure that k is integral.
+
+// See http://en.wikipedia.org/wiki/Poisson_distribution
+// http://documents.wolfram.com/v5/Add-onsLinks/StandardPackages/Statistics/DiscreteDistributions.html
+
+#ifndef BOOST_MATH_SPECIAL_POISSON_HPP
+#define BOOST_MATH_SPECIAL_POISSON_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp> // for incomplete gamma. gamma_q
+#include <boost/math/special_functions/trunc.hpp> // for incomplete gamma. gamma_q
+#include <boost/math/distributions/complement.hpp> // complements
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+#include <boost/math/special_functions/factorials.hpp> // factorials.
+#include <boost/math/tools/roots.hpp> // for root finding.
+#include <boost/math/distributions/detail/inv_discrete_quantile.hpp>
+
+#include <utility>
+
+namespace boost
+{
+  namespace math
+  {
+    namespace poisson_detail
+    {
+      // Common error checking routines for Poisson distribution functions.
+      // These are convoluted, & apparently redundant, to try to ensure that
+      // checks are always performed, even if exceptions are not enabled.
+
+      template <class RealType, class Policy>
+      inline bool check_mean(const char* function, const RealType& mean, RealType* result, const Policy& pol)
+      {
+        if(!(boost::math::isfinite)(mean) || (mean < 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Mean argument is %1%, but must be >= 0 !", mean, pol);
+          return false;
+        }
+        return true;
+      } // bool check_mean
+
+      template <class RealType, class Policy>
+      inline bool check_mean_NZ(const char* function, const RealType& mean, RealType* result, const Policy& pol)
+      { // mean == 0 is considered an error.
+        if( !(boost::math::isfinite)(mean) || (mean <= 0))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Mean argument is %1%, but must be > 0 !", mean, pol);
+          return false;
+        }
+        return true;
+      } // bool check_mean_NZ
+
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& mean, RealType* result, const Policy& pol)
+      { // Only one check, so this is redundant really but should be optimized away.
+        return check_mean_NZ(function, mean, result, pol);
+      } // bool check_dist
+
+      template <class RealType, class Policy>
+      inline bool check_k(const char* function, const RealType& k, RealType* result, const Policy& pol)
+      {
+        if((k < 0) || !(boost::math::isfinite)(k))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Number of events k argument is %1%, but must be >= 0 !", k, pol);
+          return false;
+        }
+        return true;
+      } // bool check_k
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_k(const char* function, RealType mean, RealType k, RealType* result, const Policy& pol)
+      {
+        if((check_dist(function, mean, result, pol) == false) ||
+          (check_k(function, k, result, pol) == false))
+        {
+          return false;
+        }
+        return true;
+      } // bool check_dist_and_k
+
+      template <class RealType, class Policy>
+      inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      { // Check 0 <= p <= 1
+        if(!(boost::math::isfinite)(p) || (p < 0) || (p > 1))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      } // bool check_prob
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, RealType mean,  RealType p, RealType* result, const Policy& pol)
+      {
+        if((check_dist(function, mean, result, pol) == false) ||
+          (check_prob(function, p, result, pol) == false))
+        {
+          return false;
+        }
+        return true;
+      } // bool check_dist_and_prob
+
+    } // namespace poisson_detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class poisson_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      poisson_distribution(RealType l_mean = 1) : m_l(l_mean) // mean (lambda).
+      { // Expected mean number of events that occur during the given interval.
+        RealType r;
+        poisson_detail::check_dist(
+           "boost::math::poisson_distribution<%1%>::poisson_distribution",
+          m_l,
+          &r, Policy());
+      } // poisson_distribution constructor.
+
+      RealType mean() const
+      { // Private data getter function.
+        return m_l;
+      }
+    private:
+      // Data member, initialized by constructor.
+      RealType m_l; // mean number of occurrences.
+    }; // template <class RealType, class Policy> class poisson_distribution
+
+    typedef poisson_distribution<double> poisson; // Reserved name of type double.
+
+    // Non-member functions to give properties of the distribution.
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const poisson_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable k.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>()); // Max integer?
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const poisson_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable k.
+       // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+       using boost::math::tools::max_value;
+       return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const poisson_distribution<RealType, Policy>& dist)
+    { // Mean of poisson distribution = lambda.
+      return dist.mean();
+    } // mean
+
+    template <class RealType, class Policy>
+    inline RealType mode(const poisson_distribution<RealType, Policy>& dist)
+    { // mode.
+      BOOST_MATH_STD_USING // ADL of std functions.
+      return floor(dist.mean());
+    }
+
+    //template <class RealType, class Policy>
+    //inline RealType median(const poisson_distribution<RealType, Policy>& dist)
+    //{ // median = approximately lambda + 1/3 - 0.2/lambda
+    //  RealType l = dist.mean();
+    //  return dist.mean() + static_cast<RealType>(0.3333333333333333333333333333333333333333333333)
+    //   - static_cast<RealType>(0.2) / l;
+    //} // BUT this formula appears to be out-by-one compared to quantile(half)
+    // Query posted on Wikipedia.
+    // Now implemented via quantile(half) in derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType variance(const poisson_distribution<RealType, Policy>& dist)
+    { // variance.
+      return dist.mean();
+    }
+
+    // RealType standard_deviation(const poisson_distribution<RealType, Policy>& dist)
+    // standard_deviation provided by derived accessors.
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const poisson_distribution<RealType, Policy>& dist)
+    { // skewness = sqrt(l).
+      BOOST_MATH_STD_USING // ADL of std functions.
+      return 1 / sqrt(dist.mean());
+    }
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const poisson_distribution<RealType, Policy>& dist)
+    { // skewness = sqrt(l).
+      return 1 / dist.mean(); // kurtosis_excess 1/mean from Wiki & MathWorld eq 31.
+      // http://mathworld.wolfram.com/Kurtosis.html explains that the kurtosis excess
+      // is more convenient because the kurtosis excess of a normal distribution is zero
+      // whereas the true kurtosis is 3.
+    } // RealType kurtosis_excess
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const poisson_distribution<RealType, Policy>& dist)
+    { // kurtosis is 4th moment about the mean = u4 / sd ^ 4
+      // http://en.wikipedia.org/wiki/Curtosis
+      // kurtosis can range from -2 (flat top) to +infinity (sharp peak & heavy tails).
+      // http://www.itl.nist.gov/div898/handbook/eda/section3/eda35b.htm
+      return 3 + 1 / dist.mean(); // NIST.
+      // http://mathworld.wolfram.com/Kurtosis.html explains that the kurtosis excess
+      // is more convenient because the kurtosis excess of a normal distribution is zero
+      // whereas the true kurtosis is 3.
+    } // RealType kurtosis
+
+    template <class RealType, class Policy>
+    RealType pdf(const poisson_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Probability Density/Mass Function.
+      // Probability that there are EXACTLY k occurrences (or arrivals).
+      BOOST_FPU_EXCEPTION_GUARD
+
+      BOOST_MATH_STD_USING // for ADL of std functions.
+
+      RealType mean = dist.mean();
+      // Error check:
+      RealType result = 0;
+      if(false == poisson_detail::check_dist_and_k(
+        "boost::math::pdf(const poisson_distribution<%1%>&, %1%)",
+        mean,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+
+      // Special case of mean zero, regardless of the number of events k.
+      if (mean == 0)
+      { // Probability for any k is zero.
+        return 0;
+      }
+      if (k == 0)
+      { // mean ^ k = 1, and k! = 1, so can simplify.
+        return exp(-mean);
+      }
+      return boost::math::gamma_p_derivative(k+1, mean, Policy());
+    } // pdf
+
+    template <class RealType, class Policy>
+    RealType cdf(const poisson_distribution<RealType, Policy>& dist, const RealType& k)
+    { // Cumulative Distribution Function Poisson.
+      // The random variate k is the number of occurrences(or arrivals)
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      // Returns the sum of the terms 0 through k of the Poisson Probability Density or Mass (pdf).
+
+      // But note that the Poisson distribution
+      // (like others including the binomial, negative binomial & Bernoulli)
+      // is strictly defined as a discrete function: only integral values of k are envisaged.
+      // However because of the method of calculation using a continuous gamma function,
+      // it is convenient to treat it as if it is a continous function
+      // and permit non-integral values of k.
+      // To enforce the strict mathematical model, users should use floor or ceil functions
+      // outside this function to ensure that k is integral.
+
+      // The terms are not summed directly (at least for larger k)
+      // instead the incomplete gamma integral is employed,
+
+      BOOST_MATH_STD_USING // for ADL of std function exp.
+
+      RealType mean = dist.mean();
+      // Error checks:
+      RealType result = 0;
+      if(false == poisson_detail::check_dist_and_k(
+        "boost::math::cdf(const poisson_distribution<%1%>&, %1%)",
+        mean,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (mean == 0)
+      { // Probability for any k is zero.
+        return 0;
+      }
+      if (k == 0)
+      { // return pdf(dist, static_cast<RealType>(0));
+        // but mean (and k) have already been checked,
+        // so this avoids unnecessary repeated checks.
+       return exp(-mean);
+      }
+      // For small integral k could use a finite sum -
+      // it's cheaper than the gamma function.
+      // BUT this is now done efficiently by gamma_q function.
+      // Calculate poisson cdf using the gamma_q function.
+      return gamma_q(k+1, mean, Policy());
+    } // binomial cdf
+
+    template <class RealType, class Policy>
+    RealType cdf(const complemented2_type<poisson_distribution<RealType, Policy>, RealType>& c)
+    { // Complemented Cumulative Distribution Function Poisson
+      // The random variate k is the number of events, occurrences or arrivals.
+      // k argument may be integral, signed, or unsigned, or floating point.
+      // If necessary, it has already been promoted from an integral type.
+      // But note that the Poisson distribution
+      // (like others including the binomial, negative binomial & Bernoulli)
+      // is strictly defined as a discrete function: only integral values of k are envisaged.
+      // However because of the method of calculation using a continuous gamma function,
+      // it is convenient to treat it as is it is a continous function
+      // and permit non-integral values of k.
+      // To enforce the strict mathematical model, users should use floor or ceil functions
+      // outside this function to ensure that k is integral.
+
+      // Returns the sum of the terms k+1 through inf of the Poisson Probability Density/Mass (pdf).
+      // The terms are not summed directly (at least for larger k)
+      // instead the incomplete gamma integral is employed,
+
+      RealType const& k = c.param;
+      poisson_distribution<RealType, Policy> const& dist = c.dist;
+
+      RealType mean = dist.mean();
+
+      // Error checks:
+      RealType result = 0;
+      if(false == poisson_detail::check_dist_and_k(
+        "boost::math::cdf(const poisson_distribution<%1%>&, %1%)",
+        mean,
+        k,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special case of mean, regardless of the number of events k.
+      if (mean == 0)
+      { // Probability for any k is unity, complement of zero.
+        return 1;
+      }
+      if (k == 0)
+      { // Avoid repeated checks on k and mean in gamma_p.
+         return -boost::math::expm1(-mean, Policy());
+      }
+      // Unlike un-complemented cdf (sum from 0 to k),
+      // can't use finite sum from k+1 to infinity for small integral k,
+      // anyway it is now done efficiently by gamma_p.
+      return gamma_p(k + 1, mean, Policy()); // Calculate Poisson cdf using the gamma_p function.
+      // CCDF = gamma_p(k+1, lambda)
+    } // poisson ccdf
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const poisson_distribution<RealType, Policy>& dist, const RealType& p)
+    { // Quantile (or Percent Point) Poisson function.
+      // Return the number of expected events k for a given probability p.
+      static const char* function = "boost::math::quantile(const poisson_distribution<%1%>&, %1%)";
+      RealType result = 0; // of Argument checks:
+      if(false == poisson_detail::check_prob(
+        function,
+        p,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special case:
+      if (dist.mean() == 0)
+      { // if mean = 0 then p = 0, so k can be anything?
+         if (false == poisson_detail::check_mean_NZ(
+         function,
+         dist.mean(),
+         &result, Policy()))
+        {
+          return result;
+        }
+      }
+      if(p == 0)
+      {
+         return 0; // Exact result regardless of discrete-quantile Policy
+      }
+      if(p == 1)
+      {
+         return policies::raise_overflow_error<RealType>(function, 0, Policy());
+      }
+      typedef typename Policy::discrete_quantile_type discrete_type;
+      boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+      RealType guess, factor = 8;
+      RealType z = dist.mean();
+      if(z < 1)
+         guess = z;
+      else
+         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, p, RealType(1-p), Policy());
+      if(z > 5)
+      {
+         if(z > 1000)
+            factor = 1.01f;
+         else if(z > 50)
+            factor = 1.1f;
+         else if(guess > 10)
+            factor = 1.25f;
+         else
+            factor = 2;
+         if(guess < 1.1)
+            factor = 8;
+      }
+
+      return detail::inverse_discrete_quantile(
+         dist,
+         p,
+         false,
+         guess,
+         factor,
+         RealType(1),
+         discrete_type(),
+         max_iter);
+   } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<poisson_distribution<RealType, Policy>, RealType>& c)
+    { // Quantile (or Percent Point) of Poisson function.
+      // Return the number of expected events k for a given
+      // complement of the probability q.
+      //
+      // Error checks:
+      static const char* function = "boost::math::quantile(complement(const poisson_distribution<%1%>&, %1%))";
+      RealType q = c.param;
+      const poisson_distribution<RealType, Policy>& dist = c.dist;
+      RealType result = 0;  // of argument checks.
+      if(false == poisson_detail::check_prob(
+        function,
+        q,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special case:
+      if (dist.mean() == 0)
+      { // if mean = 0 then p = 0, so k can be anything?
+         if (false == poisson_detail::check_mean_NZ(
+         function,
+         dist.mean(),
+         &result, Policy()))
+        {
+          return result;
+        }
+      }
+      if(q == 0)
+      {
+         return policies::raise_overflow_error<RealType>(function, 0, Policy());
+      }
+      if(q == 1)
+      {
+         return 0;  // Exact result regardless of discrete-quantile Policy
+      }
+      typedef typename Policy::discrete_quantile_type discrete_type;
+      boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+      RealType guess, factor = 8;
+      RealType z = dist.mean();
+      if(z < 1)
+         guess = z;
+      else
+         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, RealType(1-q), q, Policy());
+      if(z > 5)
+      {
+         if(z > 1000)
+            factor = 1.01f;
+         else if(z > 50)
+            factor = 1.1f;
+         else if(guess > 10)
+            factor = 1.25f;
+         else
+            factor = 2;
+         if(guess < 1.1)
+            factor = 8;
+      }
+
+      return detail::inverse_discrete_quantile(
+         dist,
+         q,
+         true,
+         guess,
+         factor,
+         RealType(1),
+         discrete_type(),
+         max_iter);
+   } // quantile complement.
+
+  } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+#include <boost/math/distributions/detail/inv_discrete_quantile.hpp>
+
+#endif // BOOST_MATH_SPECIAL_POISSON_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/rayleigh.hpp b/gatb-core/thirdparty/boost/math/distributions/rayleigh.hpp
new file mode 100644
index 0000000..01f38c0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/rayleigh.hpp
@@ -0,0 +1,301 @@
+//  Copyright Paul A. Bristow 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_rayleigh_HPP
+#define BOOST_STATS_rayleigh_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4702) // unreachable code (return after domain_error throw).
+#endif
+
+#include <utility>
+
+namespace boost{ namespace math{
+
+namespace detail
+{ // Error checks:
+  template <class RealType, class Policy>
+  inline bool verify_sigma(const char* function, RealType sigma, RealType* presult, const Policy& pol)
+  {
+     if((sigma <= 0) || (!(boost::math::isfinite)(sigma)))
+     {
+        *presult = policies::raise_domain_error<RealType>(
+           function,
+           "The scale parameter \"sigma\" must be > 0 and finite, but was: %1%.", sigma, pol);
+        return false;
+     }
+     return true;
+  } // bool verify_sigma
+
+  template <class RealType, class Policy>
+  inline bool verify_rayleigh_x(const char* function, RealType x, RealType* presult, const Policy& pol)
+  {
+     if((x < 0) || (boost::math::isnan)(x))
+     {
+        *presult = policies::raise_domain_error<RealType>(
+           function,
+           "The random variable must be >= 0, but was: %1%.", x, pol);
+        return false;
+     }
+     return true;
+  } // bool verify_rayleigh_x
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class rayleigh_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   rayleigh_distribution(RealType l_sigma = 1)
+      : m_sigma(l_sigma)
+   {
+      RealType err;
+      detail::verify_sigma("boost::math::rayleigh_distribution<%1%>::rayleigh_distribution", l_sigma, &err, Policy());
+   } // rayleigh_distribution
+
+   RealType sigma()const
+   { // Accessor.
+     return m_sigma;
+   }
+
+private:
+   RealType m_sigma;
+}; // class rayleigh_distribution
+
+typedef rayleigh_distribution<double> rayleigh;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const rayleigh_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), std::numeric_limits<RealType>::has_infinity ? std::numeric_limits<RealType>::infinity() : max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const rayleigh_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const rayleigh_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std function exp.
+
+   RealType sigma = dist.sigma();
+   RealType result = 0;
+   static const char* function = "boost::math::pdf(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::verify_rayleigh_x(function, x, &result, Policy()))
+   {
+      return result;
+   }
+   if((boost::math::isinf)(x))
+   {
+      return 0;
+   }
+   RealType sigmasqr = sigma * sigma;
+   result = x * (exp(-(x * x) / ( 2 * sigmasqr))) / sigmasqr;
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const rayleigh_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType result = 0;
+   RealType sigma = dist.sigma();
+   static const char* function = "boost::math::cdf(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   if(false == detail::verify_rayleigh_x(function, x, &result, Policy()))
+   {
+      return result;
+   }
+   result = -boost::math::expm1(-x * x / ( 2 * sigma * sigma), Policy());
+   return result;
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const rayleigh_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType result = 0;
+   RealType sigma = dist.sigma();
+   static const char* function = "boost::math::quantile(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 0)
+   {
+      return 0;
+   }
+   if(p == 1)
+   {
+     return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   result = sqrt(-2 * sigma * sigma * boost::math::log1p(-p, Policy()));
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<rayleigh_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType result = 0;
+   RealType sigma = c.dist.sigma();
+   static const char* function = "boost::math::cdf(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   RealType x = c.param;
+   if(false == detail::verify_rayleigh_x(function, x, &result, Policy()))
+   {
+      return result;
+   }
+   RealType ea = x * x / (2 * sigma * sigma);
+   // Fix for VC11/12 x64 bug in exp(float):
+   if (ea >= tools::max_value<RealType>())
+	   return 0;
+   result =  exp(-ea);
+   return result;
+} // cdf complement
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<rayleigh_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions, log & sqrt.
+
+   RealType result = 0;
+   RealType sigma = c.dist.sigma();
+   static const char* function = "boost::math::quantile(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   RealType q = c.param;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+   {
+      return result;
+   }
+   if(q == 1)
+   {
+      return 0;
+   }
+   if(q == 0)
+   {
+     return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   result = sqrt(-2 * sigma * sigma * log(q));
+   return result;
+} // quantile complement
+
+template <class RealType, class Policy>
+inline RealType mean(const rayleigh_distribution<RealType, Policy>& dist)
+{
+   RealType result = 0;
+   RealType sigma = dist.sigma();
+   static const char* function = "boost::math::mean(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   using boost::math::constants::root_half_pi;
+   return sigma * root_half_pi<RealType>();
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const rayleigh_distribution<RealType, Policy>& dist)
+{
+   RealType result = 0;
+   RealType sigma = dist.sigma();
+   static const char* function = "boost::math::variance(const rayleigh_distribution<%1%>&, %1%)";
+   if(false == detail::verify_sigma(function, sigma, &result, Policy()))
+   {
+      return result;
+   }
+   using boost::math::constants::four_minus_pi;
+   return four_minus_pi<RealType>() * sigma * sigma / 2;
+} // variance
+
+template <class RealType, class Policy>
+inline RealType mode(const rayleigh_distribution<RealType, Policy>& dist)
+{
+   return dist.sigma();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const rayleigh_distribution<RealType, Policy>& dist)
+{
+   using boost::math::constants::root_ln_four;
+   return root_ln_four<RealType>() * dist.sigma();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const rayleigh_distribution<RealType, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return static_cast<RealType>(0.63111065781893713819189935154422777984404221106391L);
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 2 * root_pi<RealType>() * pi_minus_three<RealType>() / pow23_four_minus_pi<RealType>();
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const rayleigh_distribution<RealType, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return static_cast<RealType>(3.2450893006876380628486604106197544154170667057995L);
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 3 - (6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  // (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const rayleigh_distribution<RealType, Policy>& /*dist*/)
+{
+  //using namespace boost::math::constants;
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  return static_cast<RealType>(0.2450893006876380628486604106197544154170667057995L);
+  // return -(6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  //   (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+} // kurtosis
+
+} // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_rayleigh_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/skew_normal.hpp b/gatb-core/thirdparty/boost/math/distributions/skew_normal.hpp
new file mode 100644
index 0000000..98348e5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/skew_normal.hpp
@@ -0,0 +1,719 @@
+//  Copyright Benjamin Sobotta 2012
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_SKEW_NORMAL_HPP
+#define BOOST_STATS_SKEW_NORMAL_HPP
+
+// http://en.wikipedia.org/wiki/Skew_normal_distribution
+// http://azzalini.stat.unipd.it/SN/
+// Also:
+// Azzalini, A. (1985). "A class of distributions which includes the normal ones".
+// Scand. J. Statist. 12: 171-178.
+
+#include <boost/math/distributions/fwd.hpp> // TODO add skew_normal distribution to fwd.hpp!
+#include <boost/math/special_functions/owens_t.hpp> // Owen's T function
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/normal.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/tuple.hpp>
+#include <boost/math/tools/roots.hpp> // Newton-Raphson
+#include <boost/assert.hpp>
+#include <boost/math/distributions/detail/generic_mode.hpp> // pdf max finder.
+
+#include <utility>
+#include <algorithm> // std::lower_bound, std::distance
+
+namespace boost{ namespace math{
+
+  namespace detail
+  {
+    template <class RealType, class Policy>
+    inline bool check_skew_normal_shape(
+      const char* function,
+      RealType shape,
+      RealType* result,
+      const Policy& pol)
+    {
+      if(!(boost::math::isfinite)(shape))
+      {
+        *result =
+          policies::raise_domain_error<RealType>(function,
+          "Shape parameter is %1%, but must be finite!",
+          shape, pol);
+        return false;
+      }
+      return true;
+    }
+
+  } // namespace detail
+
+  template <class RealType = double, class Policy = policies::policy<> >
+  class skew_normal_distribution
+  {
+  public:
+    typedef RealType value_type;
+    typedef Policy policy_type;
+
+    skew_normal_distribution(RealType l_location = 0, RealType l_scale = 1, RealType l_shape = 0)
+      : location_(l_location), scale_(l_scale), shape_(l_shape)
+    { // Default is a 'standard' normal distribution N01. (shape=0 results in the normal distribution with no skew)
+      static const char* function = "boost::math::skew_normal_distribution<%1%>::skew_normal_distribution";
+
+      RealType result;
+      detail::check_scale(function, l_scale, &result, Policy());
+      detail::check_location(function, l_location, &result, Policy());
+      detail::check_skew_normal_shape(function, l_shape, &result, Policy());
+    }
+
+    RealType location()const
+    { 
+      return location_;
+    }
+
+    RealType scale()const
+    { 
+      return scale_;
+    }
+
+    RealType shape()const
+    { 
+      return shape_;
+    }
+
+
+  private:
+    //
+    // Data members:
+    //
+    RealType location_;  // distribution location.
+    RealType scale_;    // distribution scale.
+    RealType shape_;    // distribution shape.
+  }; // class skew_normal_distribution
+
+  typedef skew_normal_distribution<double> skew_normal;
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> range(const skew_normal_distribution<RealType, Policy>& /*dist*/)
+  { // Range of permissible values for random variable x.
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(
+       std::numeric_limits<RealType>::has_infinity ? -std::numeric_limits<RealType>::infinity() : -max_value<RealType>(), 
+       std::numeric_limits<RealType>::has_infinity ? std::numeric_limits<RealType>::infinity() : max_value<RealType>()); // - to + max value.
+  }
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> support(const skew_normal_distribution<RealType, Policy>& /*dist*/)
+  { // Range of supported values for random variable x.
+    // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(-max_value<RealType>(),  max_value<RealType>()); // - to + max value.
+  }
+
+  template <class RealType, class Policy>
+  inline RealType pdf(const skew_normal_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    const RealType scale = dist.scale();
+    const RealType location = dist.location();
+    const RealType shape = dist.shape();
+
+    static const char* function = "boost::math::pdf(const skew_normal_distribution<%1%>&, %1%)";
+    if((boost::math::isinf)(x))
+    {
+      return 0; // pdf + and - infinity is zero.
+    }
+    // Below produces MSVC 4127 warnings, so the above used instead.
+    //if(std::numeric_limits<RealType>::has_infinity && abs(x) == std::numeric_limits<RealType>::infinity())
+    //{ // pdf + and - infinity is zero.
+    //  return 0;
+    //}
+
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_location(function, location, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_x(function, x, &result, Policy()))
+    {
+      return result;
+    }
+
+    const RealType transformed_x = (x-location)/scale;
+
+    normal_distribution<RealType, Policy> std_normal;
+
+    result = pdf(std_normal, transformed_x) * cdf(std_normal, shape*transformed_x) * 2 / scale;
+
+    return result;
+  } // pdf
+
+  template <class RealType, class Policy>
+  inline RealType cdf(const skew_normal_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    const RealType scale = dist.scale();
+    const RealType location = dist.location();
+    const RealType shape = dist.shape();
+
+    static const char* function = "boost::math::cdf(const skew_normal_distribution<%1%>&, %1%)";
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_location(function, location, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+    {
+      return result;
+    }
+    if((boost::math::isinf)(x))
+    {
+      if(x < 0) return 0; // -infinity
+      return 1; // + infinity
+    }
+    // These produce MSVC 4127 warnings, so the above used instead.
+    //if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+    //{ // cdf +infinity is unity.
+    //  return 1;
+    //}
+    //if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+    //{ // cdf -infinity is zero.
+    //  return 0;
+    //}
+    if(false == detail::check_x(function, x, &result, Policy()))
+    {
+      return result;
+    }
+
+    const RealType transformed_x = (x-location)/scale;
+
+    normal_distribution<RealType, Policy> std_normal;
+
+    result = cdf(std_normal, transformed_x) - owens_t(transformed_x, shape)*static_cast<RealType>(2);
+
+    return result;
+  } // cdf
+
+  template <class RealType, class Policy>
+  inline RealType cdf(const complemented2_type<skew_normal_distribution<RealType, Policy>, RealType>& c)
+  {
+    const RealType scale = c.dist.scale();
+    const RealType location = c.dist.location();
+    const RealType shape = c.dist.shape();
+    const RealType x = c.param;
+
+    static const char* function = "boost::math::cdf(const complement(skew_normal_distribution<%1%>&), %1%)";
+
+    if((boost::math::isinf)(x))
+    {
+      if(x < 0) return 1; // cdf complement -infinity is unity.
+      return 0; // cdf complement +infinity is zero
+    }
+    // These produce MSVC 4127 warnings, so the above used instead.
+    //if(std::numeric_limits<RealType>::has_infinity && x == std::numeric_limits<RealType>::infinity())
+    //{ // cdf complement +infinity is zero.
+    //  return 0;
+    //}
+    //if(std::numeric_limits<RealType>::has_infinity && x == -std::numeric_limits<RealType>::infinity())
+    //{ // cdf complement -infinity is unity.
+    //  return 1;
+    //}
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+    if(false == detail::check_location(function, location, &result, Policy()))
+      return result;
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+      return result;
+    if(false == detail::check_x(function, x, &result, Policy()))
+      return result;
+
+    const RealType transformed_x = (x-location)/scale;
+
+    normal_distribution<RealType, Policy> std_normal;
+
+    result = cdf(complement(std_normal, transformed_x)) + owens_t(transformed_x, shape)*static_cast<RealType>(2);
+    return result;
+  } // cdf complement
+
+  template <class RealType, class Policy>
+  inline RealType location(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    return dist.location();
+  }
+
+  template <class RealType, class Policy>
+  inline RealType scale(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    return dist.scale();
+  }
+
+  template <class RealType, class Policy>
+  inline RealType shape(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    return dist.shape();
+  }
+
+  template <class RealType, class Policy>
+  inline RealType mean(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    BOOST_MATH_STD_USING  // for ADL of std functions
+
+    using namespace boost::math::constants;
+
+    //const RealType delta = dist.shape() / sqrt(static_cast<RealType>(1)+dist.shape()*dist.shape());
+
+    //return dist.location() + dist.scale() * delta * root_two_div_pi<RealType>();
+
+    return dist.location() + dist.scale() * dist.shape() / sqrt(pi<RealType>()+pi<RealType>()*dist.shape()*dist.shape()) * root_two<RealType>();
+  }
+
+  template <class RealType, class Policy>
+  inline RealType variance(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    using namespace boost::math::constants;
+
+    const RealType delta2 = static_cast<RealType>(1) / (static_cast<RealType>(1)+static_cast<RealType>(1)/(dist.shape()*dist.shape()));
+    //const RealType inv_delta2 = static_cast<RealType>(1)+static_cast<RealType>(1)/(dist.shape()*dist.shape());
+
+    RealType variance = dist.scale()*dist.scale()*(static_cast<RealType>(1)-two_div_pi<RealType>()*delta2);
+    //RealType variance = dist.scale()*dist.scale()*(static_cast<RealType>(1)-two_div_pi<RealType>()/inv_delta2);
+
+    return variance;
+  }
+
+  namespace detail
+  {
+    /*
+      TODO No closed expression for mode, so use max of pdf.
+    */
+    
+    template <class RealType, class Policy>
+    inline RealType mode_fallback(const skew_normal_distribution<RealType, Policy>& dist)
+    { // mode.
+        static const char* function = "mode(skew_normal_distribution<%1%> const&)";
+        const RealType scale = dist.scale();
+        const RealType location = dist.location();
+        const RealType shape = dist.shape();
+        
+        RealType result;
+        if(!detail::check_scale(
+          function,
+          scale, &result, Policy())
+          ||
+        !detail::check_skew_normal_shape(
+          function,
+          shape,
+          &result,
+          Policy()))
+        return result;
+
+        if( shape == 0 )
+        {
+          return location;
+        }
+
+        if( shape < 0 )
+        {
+          skew_normal_distribution<RealType, Policy> D(0, 1, -shape);
+          result = mode_fallback(D);
+          result = location-scale*result;
+          return result;
+        }
+        
+        BOOST_MATH_STD_USING
+
+        // 21 elements
+        static const RealType shapes[] = {
+          0.0,
+          1.000000000000000e-004,
+          2.069138081114790e-004,
+          4.281332398719396e-004,
+          8.858667904100824e-004,
+          1.832980710832436e-003,
+          3.792690190732250e-003,
+          7.847599703514606e-003,
+          1.623776739188722e-002,
+          3.359818286283781e-002,
+          6.951927961775606e-002,
+          1.438449888287663e-001,
+          2.976351441631319e-001,
+          6.158482110660261e-001,
+          1.274274985703135e+000,
+          2.636650898730361e+000,
+          5.455594781168514e+000,
+          1.128837891684688e+001,
+          2.335721469090121e+001,
+          4.832930238571753e+001,
+          1.000000000000000e+002};
+
+        // 21 elements
+        static const RealType guess[] = {
+          0.0,
+          5.000050000525391e-005,
+          1.500015000148736e-004,
+          3.500035000350010e-004,
+          7.500075000752560e-004,
+          1.450014500145258e-003,
+          3.050030500305390e-003,
+          6.250062500624765e-003,
+          1.295012950129504e-002,
+          2.675026750267495e-002,
+          5.525055250552491e-002,
+          1.132511325113255e-001,
+          2.249522495224952e-001,
+          3.992539925399257e-001,
+          5.353553535535358e-001,
+          4.954549545495457e-001,
+          3.524535245352451e-001,
+          2.182521825218249e-001,
+          1.256512565125654e-001,
+          6.945069450694508e-002,
+          3.735037350373460e-002
+        };
+
+        const RealType* result_ptr = std::lower_bound(shapes, shapes+21, shape);
+
+        typedef typename std::iterator_traits<RealType*>::difference_type diff_type;
+        
+        const diff_type d = std::distance(shapes, result_ptr);
+        
+        BOOST_ASSERT(d > static_cast<diff_type>(0));
+
+        // refine
+        if(d < static_cast<diff_type>(21)) // shape smaller 100
+        {
+          result = guess[d-static_cast<diff_type>(1)]
+            + (guess[d]-guess[d-static_cast<diff_type>(1)])/(shapes[d]-shapes[d-static_cast<diff_type>(1)])
+            * (shape-shapes[d-static_cast<diff_type>(1)]);
+        }
+        else // shape greater 100
+        {
+          result = 1e-4;
+        }
+
+        skew_normal_distribution<RealType, Policy> helper(0, 1, shape);
+        
+        result = detail::generic_find_mode_01(helper, result, function);
+        
+        result = result*scale + location;
+        
+        return result;
+    } // mode_fallback
+    
+    
+    /*
+     * TODO No closed expression for mode, so use f'(x) = 0
+     */
+    template <class RealType, class Policy>
+    struct skew_normal_mode_functor
+    { 
+      skew_normal_mode_functor(const boost::math::skew_normal_distribution<RealType, Policy> dist)
+        : distribution(dist)
+      {
+      }
+
+      boost::math::tuple<RealType, RealType> operator()(RealType const& x)
+      {
+        normal_distribution<RealType, Policy> std_normal;
+        const RealType shape = distribution.shape();
+        const RealType pdf_x = pdf(distribution, x);
+        const RealType normpdf_x = pdf(std_normal, x);
+        const RealType normpdf_ax = pdf(std_normal, x*shape);
+        RealType fx = static_cast<RealType>(2)*shape*normpdf_ax*normpdf_x - x*pdf_x;
+        RealType dx = static_cast<RealType>(2)*shape*x*normpdf_x*normpdf_ax*(static_cast<RealType>(1) + shape*shape) + pdf_x + x*fx;
+        // return both function evaluation difference f(x) and 1st derivative f'(x).
+        return boost::math::make_tuple(fx, -dx);
+      }
+    private:
+      const boost::math::skew_normal_distribution<RealType, Policy> distribution;
+    };
+    
+  } // namespace detail
+  
+  template <class RealType, class Policy>
+  inline RealType mode(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    const RealType scale = dist.scale();
+    const RealType location = dist.location();
+    const RealType shape = dist.shape();
+
+    static const char* function = "boost::math::mode(const skew_normal_distribution<%1%>&, %1%)";
+
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+    if(false == detail::check_location(function, location, &result, Policy()))
+      return result;
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+      return result;
+
+    if( shape == 0 )
+    {
+      return location;
+    }
+
+    if( shape < 0 )
+    {
+      skew_normal_distribution<RealType, Policy> D(0, 1, -shape);
+      result = mode(D);
+      result = location-scale*result;
+      return result;
+    }
+
+    // 21 elements
+    static const RealType shapes[] = {
+      0.0,
+      static_cast<RealType>(1.000000000000000e-004),
+      static_cast<RealType>(2.069138081114790e-004),
+      static_cast<RealType>(4.281332398719396e-004),
+      static_cast<RealType>(8.858667904100824e-004),
+      static_cast<RealType>(1.832980710832436e-003),
+      static_cast<RealType>(3.792690190732250e-003),
+      static_cast<RealType>(7.847599703514606e-003),
+      static_cast<RealType>(1.623776739188722e-002),
+      static_cast<RealType>(3.359818286283781e-002),
+      static_cast<RealType>(6.951927961775606e-002),
+      static_cast<RealType>(1.438449888287663e-001),
+      static_cast<RealType>(2.976351441631319e-001),
+      static_cast<RealType>(6.158482110660261e-001),
+      static_cast<RealType>(1.274274985703135e+000),
+      static_cast<RealType>(2.636650898730361e+000),
+      static_cast<RealType>(5.455594781168514e+000),
+      static_cast<RealType>(1.128837891684688e+001),
+      static_cast<RealType>(2.335721469090121e+001),
+      static_cast<RealType>(4.832930238571753e+001),
+      static_cast<RealType>(1.000000000000000e+002)
+    };
+
+    // 21 elements
+    static const RealType guess[] = {
+      0.0,
+      static_cast<RealType>(5.000050000525391e-005),
+      static_cast<RealType>(1.500015000148736e-004),
+      static_cast<RealType>(3.500035000350010e-004),
+      static_cast<RealType>(7.500075000752560e-004),
+      static_cast<RealType>(1.450014500145258e-003),
+      static_cast<RealType>(3.050030500305390e-003),
+      static_cast<RealType>(6.250062500624765e-003),
+      static_cast<RealType>(1.295012950129504e-002),
+      static_cast<RealType>(2.675026750267495e-002),
+      static_cast<RealType>(5.525055250552491e-002),
+      static_cast<RealType>(1.132511325113255e-001),
+      static_cast<RealType>(2.249522495224952e-001),
+      static_cast<RealType>(3.992539925399257e-001),
+      static_cast<RealType>(5.353553535535358e-001),
+      static_cast<RealType>(4.954549545495457e-001),
+      static_cast<RealType>(3.524535245352451e-001),
+      static_cast<RealType>(2.182521825218249e-001),
+      static_cast<RealType>(1.256512565125654e-001),
+      static_cast<RealType>(6.945069450694508e-002),
+      static_cast<RealType>(3.735037350373460e-002)
+    };
+
+    const RealType* result_ptr = std::lower_bound(shapes, shapes+21, shape);
+
+    typedef typename std::iterator_traits<RealType*>::difference_type diff_type;
+    
+    const diff_type d = std::distance(shapes, result_ptr);
+    
+    BOOST_ASSERT(d > static_cast<diff_type>(0));
+
+    // TODO: make the search bounds smarter, depending on the shape parameter
+    RealType search_min = 0; // below zero was caught above
+    RealType search_max = 0.55f; // will never go above 0.55
+
+    // refine
+    if(d < static_cast<diff_type>(21)) // shape smaller 100
+    {
+      // it is safe to assume that d > 0, because shape==0.0 is caught earlier
+      result = guess[d-static_cast<diff_type>(1)]
+        + (guess[d]-guess[d-static_cast<diff_type>(1)])/(shapes[d]-shapes[d-static_cast<diff_type>(1)])
+        * (shape-shapes[d-static_cast<diff_type>(1)]);
+    }
+    else // shape greater 100
+    {
+      result = 1e-4f;
+      search_max = guess[19]; // set 19 instead of 20 to have a safety margin because the table may not be exact @ shape=100
+    }
+    
+    const int get_digits = policies::digits<RealType, Policy>();// get digits from policy, 
+    boost::uintmax_t m = policies::get_max_root_iterations<Policy>(); // and max iterations.
+
+    skew_normal_distribution<RealType, Policy> helper(0, 1, shape);
+
+    result = tools::newton_raphson_iterate(detail::skew_normal_mode_functor<RealType, Policy>(helper), result,
+      search_min, search_max, get_digits, m);
+    
+    result = result*scale + location;
+
+    return result;
+  }
+  
+
+  
+  template <class RealType, class Policy>
+  inline RealType skewness(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    BOOST_MATH_STD_USING  // for ADL of std functions
+    using namespace boost::math::constants;
+
+    static const RealType factor = four_minus_pi<RealType>()/static_cast<RealType>(2);
+    const RealType delta = dist.shape() / sqrt(static_cast<RealType>(1)+dist.shape()*dist.shape());
+
+    return factor * pow(root_two_div_pi<RealType>() * delta, 3) /
+      pow(static_cast<RealType>(1)-two_div_pi<RealType>()*delta*delta, static_cast<RealType>(1.5));
+  }
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    return kurtosis_excess(dist)+static_cast<RealType>(3);
+  }
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis_excess(const skew_normal_distribution<RealType, Policy>& dist)
+  {
+    using namespace boost::math::constants;
+
+    static const RealType factor = pi_minus_three<RealType>()*static_cast<RealType>(2);
+
+    const RealType delta2 = static_cast<RealType>(1) / (static_cast<RealType>(1)+static_cast<RealType>(1)/(dist.shape()*dist.shape()));
+
+    const RealType x = static_cast<RealType>(1)-two_div_pi<RealType>()*delta2;
+    const RealType y = two_div_pi<RealType>() * delta2;
+
+    return factor * y*y / (x*x);
+  }
+
+  namespace detail
+  {
+
+    template <class RealType, class Policy>
+    struct skew_normal_quantile_functor
+    { 
+      skew_normal_quantile_functor(const boost::math::skew_normal_distribution<RealType, Policy> dist, RealType const& p)
+        : distribution(dist), prob(p)
+      {
+      }
+
+      boost::math::tuple<RealType, RealType> operator()(RealType const& x)
+      {
+        RealType c = cdf(distribution, x);
+        RealType fx = c - prob;  // Difference cdf - value - to minimize.
+        RealType dx = pdf(distribution, x); // pdf is 1st derivative.
+        // return both function evaluation difference f(x) and 1st derivative f'(x).
+        return boost::math::make_tuple(fx, dx);
+      }
+    private:
+      const boost::math::skew_normal_distribution<RealType, Policy> distribution;
+      RealType prob; 
+    };
+
+  } // namespace detail
+
+  template <class RealType, class Policy>
+  inline RealType quantile(const skew_normal_distribution<RealType, Policy>& dist, const RealType& p)
+  {
+    const RealType scale = dist.scale();
+    const RealType location = dist.location();
+    const RealType shape = dist.shape();
+
+    static const char* function = "boost::math::quantile(const skew_normal_distribution<%1%>&, %1%)";
+
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+    if(false == detail::check_location(function, location, &result, Policy()))
+      return result;
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+      return result;
+    if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+    // Compute initial guess via Cornish-Fisher expansion.
+    RealType x = -boost::math::erfc_inv(2 * p, Policy()) * constants::root_two<RealType>();
+
+    // Avoid unnecessary computations if there is no skew.
+    if(shape != 0)
+    {
+      const RealType skew = skewness(dist);
+      const RealType exk = kurtosis_excess(dist);
+
+      x = x + (x*x-static_cast<RealType>(1))*skew/static_cast<RealType>(6)
+      + x*(x*x-static_cast<RealType>(3))*exk/static_cast<RealType>(24)
+      - x*(static_cast<RealType>(2)*x*x-static_cast<RealType>(5))*skew*skew/static_cast<RealType>(36);
+    } // if(shape != 0)
+
+    result = standard_deviation(dist)*x+mean(dist);
+
+    // handle special case of non-skew normal distribution.
+    if(shape == 0)
+      return result;
+
+    // refine the result by numerically searching the root of (p-cdf)
+
+    const RealType search_min = range(dist).first;
+    const RealType search_max = range(dist).second;
+
+    const int get_digits = policies::digits<RealType, Policy>();// get digits from policy, 
+    boost::uintmax_t m = policies::get_max_root_iterations<Policy>(); // and max iterations.
+
+    result = tools::newton_raphson_iterate(detail::skew_normal_quantile_functor<RealType, Policy>(dist, p), result,
+      search_min, search_max, get_digits, m);
+
+    return result;
+  } // quantile
+
+  template <class RealType, class Policy>
+  inline RealType quantile(const complemented2_type<skew_normal_distribution<RealType, Policy>, RealType>& c)
+  {
+    const RealType scale = c.dist.scale();
+    const RealType location = c.dist.location();
+    const RealType shape = c.dist.shape();
+
+    static const char* function = "boost::math::quantile(const complement(skew_normal_distribution<%1%>&), %1%)";
+    RealType result = 0;
+    if(false == detail::check_scale(function, scale, &result, Policy()))
+      return result;
+    if(false == detail::check_location(function, location, &result, Policy()))
+      return result;
+    if(false == detail::check_skew_normal_shape(function, shape, &result, Policy()))
+      return result;
+    RealType q = c.param;
+    if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+    skew_normal_distribution<RealType, Policy> D(-location, scale, -shape);
+
+    result = -quantile(D, q);
+
+    return result;
+  } // quantile
+
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_SKEW_NORMAL_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/students_t.hpp b/gatb-core/thirdparty/boost/math/distributions/students_t.hpp
new file mode 100644
index 0000000..0d6a646
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/students_t.hpp
@@ -0,0 +1,490 @@
+//  Copyright John Maddock 2006.
+//  Copyright Paul A. Bristow 2006, 2012.
+//  Copyright Thomas Mang 2012.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_STUDENTS_T_HPP
+#define BOOST_STATS_STUDENTS_T_HPP
+
+// http://en.wikipedia.org/wiki/Student%27s_t_distribution
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3664.htm
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/beta.hpp> // for ibeta(a, b, x).
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/normal.hpp> 
+
+#include <utility>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4702) // unreachable code (return after domain_error throw).
+#endif
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class students_t_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   students_t_distribution(RealType df) : df_(df)
+   { // Constructor.
+      RealType result;
+      detail::check_df_gt0_to_inf( // Checks that df > 0 or df == inf.
+         "boost::math::students_t_distribution<%1%>::students_t_distribution", df_, &result, Policy());
+   } // students_t_distribution
+
+   RealType degrees_of_freedom()const
+   {
+      return df_;
+   }
+
+   // Parameter estimation:
+   static RealType find_degrees_of_freedom(
+      RealType difference_from_mean,
+      RealType alpha,
+      RealType beta,
+      RealType sd,
+      RealType hint = 100);
+
+private:
+   // Data member:
+   RealType df_;  // degrees of freedom is a real number or +infinity.
+};
+
+typedef students_t_distribution<double> students_t; // Convenience typedef for double version.
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const students_t_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+  // NOT including infinity.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const students_t_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const students_t_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   BOOST_MATH_STD_USING  // for ADL of std functions.
+
+   RealType error_result;
+   if(false == detail::check_x(
+      "boost::math::pdf(const students_t_distribution<%1%>&, %1%)", x, &error_result, Policy()))
+      return error_result;
+   RealType df = dist.degrees_of_freedom();
+   if(false == detail::check_df_gt0_to_inf( // Check that df > 0 or == +infinity.
+      "boost::math::pdf(const students_t_distribution<%1%>&, %1%)", df, &error_result, Policy()))
+      return error_result;
+
+   RealType result;
+   if ((boost::math::isinf)(x))
+   { // +infinity.
+     normal_distribution<RealType, Policy> n(0, 1); 
+     result = pdf(n, x);
+     return result;
+   }
+   RealType limit = policies::get_epsilon<RealType, Policy>();
+   // Use policies so that if policy requests lower precision, 
+   // then get the normal distribution approximation earlier.
+   limit = static_cast<RealType>(1) / limit; // 1/eps
+   // for 64-bit double 1/eps = 4503599627370496
+   if (df > limit)
+   { // Special case for really big degrees_of_freedom > 1 / eps 
+     // - use normal distribution which is much faster and more accurate.
+     normal_distribution<RealType, Policy> n(0, 1); 
+     result = pdf(n, x);
+   }
+   else
+   { // 
+     RealType basem1 = x * x / df;
+     if(basem1 < 0.125)
+     {
+        result = exp(-boost::math::log1p(basem1, Policy()) * (1+df) / 2);
+     }
+     else
+     {
+        result = pow(1 / (1 + basem1), (df + 1) / 2);
+     }
+     result /= sqrt(df) * boost::math::beta(df / 2, RealType(0.5f), Policy());
+   }
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const students_t_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   RealType error_result;
+   if(false == detail::check_x(
+      "boost::math::pdf(const students_t_distribution<%1%>&, %1%)", x, &error_result, Policy()))
+      return error_result;
+   RealType df = dist.degrees_of_freedom();
+   // Error check:
+
+   if(false == detail::check_df_gt0_to_inf(  // Check that df > 0 or == +infinity.
+      "boost::math::cdf(const students_t_distribution<%1%>&, %1%)", df, &error_result, Policy()))
+      return error_result;
+
+   if (x == 0)
+   { // Special case with exact result.
+     return static_cast<RealType>(0.5);
+   }
+   if ((boost::math::isinf)(x))
+   { // +infinity.
+     normal_distribution<RealType, Policy> n(0, 1); 
+     RealType result = cdf(n, x);
+     return result;
+   }
+   RealType limit = policies::get_epsilon<RealType, Policy>();
+   // Use policies so that if policy requests lower precision, 
+   // then get the normal distribution approximation earlier.
+   limit = static_cast<RealType>(1) / limit; // 1/eps
+   // for 64-bit double 1/eps = 4503599627370496
+   if (df > limit)
+   { // Special case for really big degrees_of_freedom > 1 / eps (perhaps infinite?)
+     // - use normal distribution which is much faster and more accurate.
+     normal_distribution<RealType, Policy> n(0, 1); 
+     RealType result = cdf(n, x);
+     return result;
+   }
+   else
+   { // normal df case.
+     //
+     // Calculate probability of Student's t using the incomplete beta function.
+     // probability = ibeta(degrees_of_freedom / 2, 1/2, degrees_of_freedom / (degrees_of_freedom + t*t))
+     //
+     // However when t is small compared to the degrees of freedom, that formula
+     // suffers from rounding error, use the identity formula to work around
+     // the problem:
+     //
+     // I[x](a,b) = 1 - I[1-x](b,a)
+     //
+     // and:
+     //
+     //     x = df / (df + t^2)
+     //
+     // so:
+     //
+     // 1 - x = t^2 / (df + t^2)
+     //
+     RealType x2 = x * x;
+     RealType probability;
+     if(df > 2 * x2)
+     {
+        RealType z = x2 / (df + x2);
+        probability = ibetac(static_cast<RealType>(0.5), df / 2, z, Policy()) / 2;
+     }
+     else
+     {
+        RealType z = df / (df + x2);
+        probability = ibeta(df / 2, static_cast<RealType>(0.5), z, Policy()) / 2;
+     }
+     return (x > 0 ? 1   - probability : probability);
+  }
+} // cdf
+
+template <class RealType, class Policy>
+inline RealType quantile(const students_t_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+   //
+   // Obtain parameters:
+   RealType probability = p;
+ 
+   // Check for domain errors:
+   RealType df = dist.degrees_of_freedom();
+   static const char* function = "boost::math::quantile(const students_t_distribution<%1%>&, %1%)";
+   RealType error_result;
+   if(false == (detail::check_df_gt0_to_inf( // Check that df > 0 or == +infinity.
+      function, df, &error_result, Policy())
+         && detail::check_probability(function, probability, &error_result, Policy())))
+      return error_result;
+   // Special cases, regardless of degrees_of_freedom.
+   if (probability == 0)
+      return -policies::raise_overflow_error<RealType>(function, 0, Policy());
+   if (probability == 1)
+     return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   if (probability == static_cast<RealType>(0.5))
+     return 0;  //
+   //
+#if 0
+   // This next block is disabled in favour of a faster method than
+   // incomplete beta inverse, but code retained for future reference:
+   //
+   // Calculate quantile of Student's t using the incomplete beta function inverse:
+   //
+   probability = (probability > 0.5) ? 1 - probability : probability;
+   RealType t, x, y;
+   x = ibeta_inv(degrees_of_freedom / 2, RealType(0.5), 2 * probability, &y);
+   if(degrees_of_freedom * y > tools::max_value<RealType>() * x)
+      t = tools::overflow_error<RealType>(function);
+   else
+      t = sqrt(degrees_of_freedom * y / x);
+   //
+   // Figure out sign based on the size of p:
+   //
+   if(p < 0.5)
+      t = -t;
+
+   return t;
+#endif
+   //
+   // Depending on how many digits RealType has, this may forward
+   // to the incomplete beta inverse as above.  Otherwise uses a
+   // faster method that is accurate to ~15 digits everywhere
+   // and a couple of epsilon at double precision and in the central 
+   // region where most use cases will occur...
+   //
+   return boost::math::detail::fast_students_t_quantile(df, probability, Policy());
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<students_t_distribution<RealType, Policy>, RealType>& c)
+{
+   return cdf(c.dist, -c.param);
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<students_t_distribution<RealType, Policy>, RealType>& c)
+{
+   return -quantile(c.dist, c.param);
+}
+
+//
+// Parameter estimation follows:
+//
+namespace detail{
+//
+// Functors for finding degrees of freedom:
+//
+template <class RealType, class Policy>
+struct sample_size_func
+{
+   sample_size_func(RealType a, RealType b, RealType s, RealType d)
+      : alpha(a), beta(b), ratio(s*s/(d*d)) {}
+
+   RealType operator()(const RealType& df)
+   {
+      if(df <= tools::min_value<RealType>())
+      { // 
+         return 1;
+      }
+      students_t_distribution<RealType, Policy> t(df);
+      RealType qa = quantile(complement(t, alpha));
+      RealType qb = quantile(complement(t, beta));
+      qa += qb;
+      qa *= qa;
+      qa *= ratio;
+      qa -= (df + 1);
+      return qa;
+   }
+   RealType alpha, beta, ratio;
+};
+
+}  // namespace detail
+
+template <class RealType, class Policy>
+RealType students_t_distribution<RealType, Policy>::find_degrees_of_freedom(
+      RealType difference_from_mean,
+      RealType alpha,
+      RealType beta,
+      RealType sd,
+      RealType hint)
+{
+   static const char* function = "boost::math::students_t_distribution<%1%>::find_degrees_of_freedom";
+   //
+   // Check for domain errors:
+   //
+   RealType error_result;
+   if(false == detail::check_probability(
+      function, alpha, &error_result, Policy())
+         && detail::check_probability(function, beta, &error_result, Policy()))
+      return error_result;
+
+   if(hint <= 0)
+      hint = 1;
+
+   detail::sample_size_func<RealType, Policy> f(alpha, beta, sd, difference_from_mean);
+   tools::eps_tolerance<RealType> tol(policies::digits<RealType, Policy>());
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   std::pair<RealType, RealType> r = tools::bracket_and_solve_root(f, hint, RealType(2), false, tol, max_iter, Policy());
+   RealType result = r.first + (r.second - r.first) / 2;
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+   {
+      return policies::raise_evaluation_error<RealType>(function, "Unable to locate solution in a reasonable time:"
+         " either there is no answer to how many degrees of freedom are required"
+         " or the answer is infinite.  Current best guess is %1%", result, Policy());
+   }
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const students_t_distribution<RealType, Policy>& /*dist*/)
+{
+  // Assume no checks on degrees of freedom are useful (unlike mean).
+   return 0; // Always zero by definition.
+}
+
+template <class RealType, class Policy>
+inline RealType median(const students_t_distribution<RealType, Policy>& /*dist*/)
+{
+   // Assume no checks on degrees of freedom are useful (unlike mean).
+   return 0; // Always zero by definition.
+}
+
+// See section 5.1 on moments at  http://en.wikipedia.org/wiki/Student%27s_t-distribution
+
+template <class RealType, class Policy>
+inline RealType mean(const students_t_distribution<RealType, Policy>& dist)
+{  // Revised for https://svn.boost.org/trac/boost/ticket/7177
+   RealType df = dist.degrees_of_freedom();
+   if(((boost::math::isnan)(df)) || (df <= 1) ) 
+   { // mean is undefined for moment <= 1!
+      return policies::raise_domain_error<RealType>(
+      "boost::math::mean(students_t_distribution<%1%> const&, %1%)",
+      "Mean is undefined for degrees of freedom < 1 but got %1%.", df, Policy());
+      return std::numeric_limits<RealType>::quiet_NaN();
+   }
+   return 0;
+} // mean
+
+template <class RealType, class Policy>
+inline RealType variance(const students_t_distribution<RealType, Policy>& dist)
+{ // http://en.wikipedia.org/wiki/Student%27s_t-distribution
+  // Revised for https://svn.boost.org/trac/boost/ticket/7177
+  RealType df = dist.degrees_of_freedom();
+  if ((boost::math::isnan)(df) || (df <= 2))
+  { // NaN or undefined for <= 2.
+     return policies::raise_domain_error<RealType>(
+      "boost::math::variance(students_t_distribution<%1%> const&, %1%)",
+      "variance is undefined for degrees of freedom <= 2, but got %1%.",
+      df, Policy());
+    return std::numeric_limits<RealType>::quiet_NaN(); // Undefined.
+  }
+  if ((boost::math::isinf)(df))
+  { // +infinity.
+    return 1;
+  }
+  RealType limit = policies::get_epsilon<RealType, Policy>();
+  // Use policies so that if policy requests lower precision, 
+  // then get the normal distribution approximation earlier.
+  limit = static_cast<RealType>(1) / limit; // 1/eps
+  // for 64-bit double 1/eps = 4503599627370496
+  if (df > limit)
+  { // Special case for really big degrees_of_freedom > 1 / eps.
+    return 1;
+  }
+  else
+  {
+    return df / (df - 2);
+  }
+} // variance
+
+template <class RealType, class Policy>
+inline RealType skewness(const students_t_distribution<RealType, Policy>& dist)
+{
+    RealType df = dist.degrees_of_freedom();
+   if( ((boost::math::isnan)(df)) || (dist.degrees_of_freedom() <= 3))
+   { // Undefined for moment k = 3.
+      return policies::raise_domain_error<RealType>(
+         "boost::math::skewness(students_t_distribution<%1%> const&, %1%)",
+         "Skewness is undefined for degrees of freedom <= 3, but got %1%.",
+         dist.degrees_of_freedom(), Policy());
+      return std::numeric_limits<RealType>::quiet_NaN();
+   }
+   return 0; // For all valid df, including infinity.
+} // skewness
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const students_t_distribution<RealType, Policy>& dist)
+{
+   RealType df = dist.degrees_of_freedom();
+   if(((boost::math::isnan)(df)) || (df <= 4))
+   { // Undefined or infinity for moment k = 4.
+      return policies::raise_domain_error<RealType>(
+       "boost::math::kurtosis(students_t_distribution<%1%> const&, %1%)",
+       "Kurtosis is undefined for degrees of freedom <= 4, but got %1%.",
+        df, Policy());
+        return std::numeric_limits<RealType>::quiet_NaN(); // Undefined.
+   }
+   if ((boost::math::isinf)(df))
+   { // +infinity.
+     return 3;
+   }
+   RealType limit = policies::get_epsilon<RealType, Policy>();
+   // Use policies so that if policy requests lower precision, 
+   // then get the normal distribution approximation earlier.
+   limit = static_cast<RealType>(1) / limit; // 1/eps
+   // for 64-bit double 1/eps = 4503599627370496
+   if (df > limit)
+   { // Special case for really big degrees_of_freedom > 1 / eps.
+     return 3;
+   }
+   else
+   {
+     //return 3 * (df - 2) / (df - 4); re-arranged to
+     return 6 / (df - 4) + 3;
+   }
+} // kurtosis
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const students_t_distribution<RealType, Policy>& dist)
+{
+   // see http://mathworld.wolfram.com/Kurtosis.html
+
+   RealType df = dist.degrees_of_freedom();
+   if(((boost::math::isnan)(df)) || (df <= 4))
+   { // Undefined or infinity for moment k = 4.
+     return policies::raise_domain_error<RealType>(
+       "boost::math::kurtosis_excess(students_t_distribution<%1%> const&, %1%)",
+       "Kurtosis_excess is undefined for degrees of freedom <= 4, but got %1%.",
+      df, Policy());
+     return std::numeric_limits<RealType>::quiet_NaN(); // Undefined.
+   }
+   if ((boost::math::isinf)(df))
+   { // +infinity.
+     return 0;
+   }
+   RealType limit = policies::get_epsilon<RealType, Policy>();
+   // Use policies so that if policy requests lower precision, 
+   // then get the normal distribution approximation earlier.
+   limit = static_cast<RealType>(1) / limit; // 1/eps
+   // for 64-bit double 1/eps = 4503599627370496
+   if (df > limit)
+   { // Special case for really big degrees_of_freedom > 1 / eps.
+     return 0;
+   }
+   else
+   {
+     return 6 / (df - 4);
+   }
+}
+
+} // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_STUDENTS_T_HPP
diff --git a/gatb-core/thirdparty/boost/math/distributions/triangular.hpp b/gatb-core/thirdparty/boost/math/distributions/triangular.hpp
new file mode 100644
index 0000000..78ef0df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/triangular.hpp
@@ -0,0 +1,523 @@
+//  Copyright John Maddock 2006, 2007.
+//  Copyright Paul A. Bristow 2006, 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_TRIANGULAR_HPP
+#define BOOST_STATS_TRIANGULAR_HPP
+
+// http://mathworld.wolfram.com/TriangularDistribution.html
+// http://en.wikipedia.org/wiki/Triangular_distribution
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/constants/constants.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+  namespace detail
+  {
+    template <class RealType, class Policy>
+    inline bool check_triangular_lower(
+      const char* function,
+      RealType lower,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(lower))
+      { // Any finite value is OK.
+        return true;
+      }
+      else
+      { // Not finite: infinity or NaN.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "Lower parameter is %1%, but must be finite!", lower, pol);
+        return false;
+      }
+    } // bool check_triangular_lower(
+
+    template <class RealType, class Policy>
+    inline bool check_triangular_mode(
+      const char* function,
+      RealType mode,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(mode))
+      { // any finite value is OK.
+        return true;
+      }
+      else
+      { // Not finite: infinity or NaN.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "Mode parameter is %1%, but must be finite!", mode, pol);
+        return false;
+      }
+    } // bool check_triangular_mode(
+
+    template <class RealType, class Policy>
+    inline bool check_triangular_upper(
+      const char* function,
+      RealType upper,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(upper))
+      { // any finite value is OK.
+        return true;
+      }
+      else
+      { // Not finite: infinity or NaN.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "Upper parameter is %1%, but must be finite!", upper, pol);
+        return false;
+      }
+    } // bool check_triangular_upper(
+
+    template <class RealType, class Policy>
+    inline bool check_triangular_x(
+      const char* function,
+      RealType const& x,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(x))
+      { // Any finite value is OK
+        return true;
+      }
+      else
+      { // Not finite: infinity or NaN.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "x parameter is %1%, but must be finite!", x, pol);
+        return false;
+      }
+    } // bool check_triangular_x
+
+    template <class RealType, class Policy>
+    inline bool check_triangular(
+      const char* function,
+      RealType lower,
+      RealType mode,
+      RealType upper,
+      RealType* result, const Policy& pol)
+    {
+      if ((check_triangular_lower(function, lower, result, pol) == false)
+        || (check_triangular_mode(function, mode, result, pol) == false)
+        || (check_triangular_upper(function, upper, result, pol) == false))
+      { // Some parameter not finite.
+        return false;
+      }
+      else if (lower >= upper) // lower == upper NOT useful.
+      { // lower >= upper.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "lower parameter is %1%, but must be less than upper!", lower, pol);
+        return false;
+      }
+      else
+      { // Check lower <= mode <= upper.
+        if (mode < lower)
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "mode parameter is %1%, but must be >= than lower!", lower, pol);
+          return false;
+        }
+        if (mode > upper)
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "mode parameter is %1%, but must be <= than upper!", upper, pol);
+          return false;
+        }
+        return true; // All OK.
+      }
+    } // bool check_triangular
+  } // namespace detail
+
+  template <class RealType = double, class Policy = policies::policy<> >
+  class triangular_distribution
+  {
+  public:
+    typedef RealType value_type;
+    typedef Policy policy_type;
+
+    triangular_distribution(RealType l_lower = -1, RealType l_mode = 0, RealType l_upper = 1)
+      : m_lower(l_lower), m_mode(l_mode), m_upper(l_upper) // Constructor.
+    { // Evans says 'standard triangular' is lower 0, mode 1/2, upper 1,
+      // has median sqrt(c/2) for c <=1/2 and 1 - sqrt(1-c)/2 for c >= 1/2
+      // But this -1, 0, 1 is more useful in most applications to approximate normal distribution,
+      // where the central value is the most likely and deviations either side equally likely.
+      RealType result;
+      detail::check_triangular("boost::math::triangular_distribution<%1%>::triangular_distribution",l_lower, l_mode, l_upper, &result, Policy());
+    }
+    // Accessor functions.
+    RealType lower()const
+    {
+      return m_lower;
+    }
+    RealType mode()const
+    {
+      return m_mode;
+    }
+    RealType upper()const
+    {
+      return m_upper;
+    }
+  private:
+    // Data members:
+    RealType m_lower;  // distribution lower aka a
+    RealType m_mode;  // distribution mode aka c
+    RealType m_upper;  // distribution upper aka b
+  }; // class triangular_distribution
+
+  typedef triangular_distribution<double> triangular;
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> range(const triangular_distribution<RealType, Policy>& /* dist */)
+  { // Range of permissible values for random variable x.
+    using boost::math::tools::max_value;
+    return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+  }
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> support(const triangular_distribution<RealType, Policy>& dist)
+  { // Range of supported values for random variable x.
+    // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+    return std::pair<RealType, RealType>(dist.lower(), dist.upper());
+  }
+
+  template <class RealType, class Policy>
+  RealType pdf(const triangular_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    static const char* function = "boost::math::pdf(const triangular_distribution<%1%>&, %1%)";
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular(function, lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_triangular_x(function, x, &result, Policy()))
+    {
+      return result;
+    }
+    if((x < lower) || (x > upper))
+    {
+      return 0;
+    }
+    if (x == lower)
+    { // (mode - lower) == 0 which would lead to divide by zero!
+      return (mode == lower) ? 2 / (upper - lower) : RealType(0);
+    }
+    else if (x == upper)
+    {
+      return (mode == upper) ? 2 / (upper - lower) : RealType(0);
+    }
+    else if (x <= mode)
+    {
+      return 2 * (x - lower) / ((upper - lower) * (mode - lower));
+    }
+    else
+    {  // (x > mode)
+      return 2 * (upper - x) / ((upper - lower) * (upper - mode));
+    }
+  } // RealType pdf(const triangular_distribution<RealType, Policy>& dist, const RealType& x)
+
+  template <class RealType, class Policy>
+  inline RealType cdf(const triangular_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    static const char* function = "boost::math::cdf(const triangular_distribution<%1%>&, %1%)";
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular(function, lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_triangular_x(function, x, &result, Policy()))
+    {
+      return result;
+    }
+    if((x <= lower))
+    {
+      return 0;
+    }
+    if (x >= upper)
+    {
+      return 1;
+    }
+    // else lower < x < upper
+    if (x <= mode)
+    {
+      return ((x - lower) * (x - lower)) / ((upper - lower) * (mode - lower));
+    }
+    else
+    {
+      return 1 - (upper - x) *  (upper - x) / ((upper - lower) * (upper - mode));
+    }
+  } // RealType cdf(const triangular_distribution<RealType, Policy>& dist, const RealType& x)
+
+  template <class RealType, class Policy>
+  RealType quantile(const triangular_distribution<RealType, Policy>& dist, const RealType& p)
+  {
+    BOOST_MATH_STD_USING  // for ADL of std functions (sqrt).
+    static const char* function = "boost::math::quantile(const triangular_distribution<%1%>&, %1%)";
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks
+    if(false == detail::check_triangular(function,lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_probability(function, p, &result, Policy()))
+    {
+      return result;
+    }
+    if(p == 0)
+    {
+      return lower;
+    }
+    if(p == 1)
+    {
+      return upper;
+    }
+    RealType p0 = (mode - lower) / (upper - lower);
+    RealType q = 1 - p;
+    if (p < p0)
+    {
+      result = sqrt((upper - lower) * (mode - lower) * p) + lower;
+    }
+    else if (p == p0)
+    {
+      result = mode;
+    }
+    else // p > p0
+    {
+      result = upper - sqrt((upper - lower) * (upper - mode) * q);
+    }
+    return result;
+
+  } // RealType quantile(const triangular_distribution<RealType, Policy>& dist, const RealType& q)
+
+  template <class RealType, class Policy>
+  RealType cdf(const complemented2_type<triangular_distribution<RealType, Policy>, RealType>& c)
+  {
+    static const char* function = "boost::math::cdf(const triangular_distribution<%1%>&, %1%)";
+    RealType lower = c.dist.lower();
+    RealType mode = c.dist.mode();
+    RealType upper = c.dist.upper();
+    RealType x = c.param;
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular(function, lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_triangular_x(function, x, &result, Policy()))
+    {
+      return result;
+    }
+    if (x <= lower)
+    {
+      return 1;
+    }
+    if (x >= upper)
+    {
+      return 0;
+    }
+    if (x <= mode)
+    {
+      return 1 - ((x - lower) * (x - lower)) / ((upper - lower) * (mode - lower));
+    }
+    else
+    {
+      return (upper - x) *  (upper - x) / ((upper - lower) * (upper - mode));
+    }
+  } // RealType cdf(const complemented2_type<triangular_distribution<RealType, Policy>, RealType>& c)
+
+  template <class RealType, class Policy>
+  RealType quantile(const complemented2_type<triangular_distribution<RealType, Policy>, RealType>& c)
+  {
+    BOOST_MATH_STD_USING  // Aid ADL for sqrt.
+    static const char* function = "boost::math::quantile(const triangular_distribution<%1%>&, %1%)";
+    RealType l = c.dist.lower();
+    RealType m = c.dist.mode();
+    RealType u = c.dist.upper();
+    RealType q = c.param; // probability 0 to 1.
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular(function, l, m, u, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_probability(function, q, &result, Policy()))
+    {
+      return result;
+    }
+    if(q == 0)
+    {
+      return u;
+    }
+    if(q == 1)
+    {
+      return l;
+    }
+    RealType lower = c.dist.lower();
+    RealType mode = c.dist.mode();
+    RealType upper = c.dist.upper();
+
+    RealType p = 1 - q;
+    RealType p0 = (mode - lower) / (upper - lower);
+    if(p < p0)
+    {
+      RealType s = (upper - lower) * (mode - lower);
+      s *= p;
+      result = sqrt((upper - lower) * (mode - lower) * p) + lower;
+    }
+    else if (p == p0)
+    {
+      result = mode;
+    }
+    else // p > p0
+    {
+      result = upper - sqrt((upper - lower) * (upper - mode) * q);
+    }
+    return result;
+  } // RealType quantile(const complemented2_type<triangular_distribution<RealType, Policy>, RealType>& c)
+
+  template <class RealType, class Policy>
+  inline RealType mean(const triangular_distribution<RealType, Policy>& dist)
+  {
+    static const char* function = "boost::math::mean(const triangular_distribution<%1%>&)";
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0;  // of checks.
+    if(false == detail::check_triangular(function, lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return (lower + upper + mode) / 3;
+  } // RealType mean(const triangular_distribution<RealType, Policy>& dist)
+
+
+  template <class RealType, class Policy>
+  inline RealType variance(const triangular_distribution<RealType, Policy>& dist)
+  {
+    static const char* function = "boost::math::mean(const triangular_distribution<%1%>&)";
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular(function, lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return (lower * lower + upper * upper + mode * mode - lower * upper - lower * mode - upper * mode) / 18;
+  } // RealType variance(const triangular_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType mode(const triangular_distribution<RealType, Policy>& dist)
+  {
+    static const char* function = "boost::math::mode(const triangular_distribution<%1%>&)";
+    RealType mode = dist.mode();
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular_mode(function, mode, &result, Policy()))
+    { // This should never happen!
+      return result;
+    }
+    return mode;
+  } // RealType mode
+
+  template <class RealType, class Policy>
+  inline RealType median(const triangular_distribution<RealType, Policy>& dist)
+  {
+    BOOST_MATH_STD_USING // ADL of std functions.
+    static const char* function = "boost::math::median(const triangular_distribution<%1%>&)";
+    RealType mode = dist.mode();
+    RealType result = 0; // of checks.
+    if(false == detail::check_triangular_mode(function, mode, &result, Policy()))
+    { // This should never happen!
+      return result;
+    }
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    if (mode < (upper - lower) / 2)
+    {
+      return lower + sqrt((upper - lower) * (mode - lower)) / constants::root_two<RealType>();
+    }
+    else
+    {
+      return upper - sqrt((upper - lower) * (upper - mode)) / constants::root_two<RealType>();
+    }
+  } // RealType mode
+
+  template <class RealType, class Policy>
+  inline RealType skewness(const triangular_distribution<RealType, Policy>& dist)
+  {
+    BOOST_MATH_STD_USING  // for ADL of std functions
+    using namespace boost::math::constants; // for root_two
+    static const char* function = "boost::math::skewness(const triangular_distribution<%1%>&)";
+
+    RealType lower = dist.lower();
+    RealType mode = dist.mode();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == boost::math::detail::check_triangular(function,lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return root_two<RealType>() * (lower + upper - 2 * mode) * (2 * lower - upper - mode) * (lower - 2 * upper + mode) /
+      (5 * pow((lower * lower + upper + upper + mode * mode - lower * upper - lower * mode - upper * mode), RealType(3)/RealType(2)));
+  } // RealType skewness(const triangular_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis(const triangular_distribution<RealType, Policy>& dist)
+  { // These checks may be belt and braces as should have been checked on construction?
+    static const char* function = "boost::math::kurtosis(const triangular_distribution<%1%>&)";
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType mode = dist.mode();
+    RealType result = 0;  // of checks.
+    if(false == detail::check_triangular(function,lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return static_cast<RealType>(12)/5; //  12/5 = 2.4;
+  } // RealType kurtosis_excess(const triangular_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis_excess(const triangular_distribution<RealType, Policy>& dist)
+  { // These checks may be belt and braces as should have been checked on construction?
+    static const char* function = "boost::math::kurtosis_excess(const triangular_distribution<%1%>&)";
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType mode = dist.mode();
+    RealType result = 0;  // of checks.
+    if(false == detail::check_triangular(function,lower, mode, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return static_cast<RealType>(-3)/5; // - 3/5 = -0.6
+    // Assuming mathworld really means kurtosis excess?  Wikipedia now corrected to match this.
+  }
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_TRIANGULAR_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/uniform.hpp b/gatb-core/thirdparty/boost/math/distributions/uniform.hpp
new file mode 100644
index 0000000..a20597a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/uniform.hpp
@@ -0,0 +1,379 @@
+//  Copyright John Maddock 2006.
+//  Copyright Paul A. Bristow 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// TODO deal with infinity as special better - or remove.
+//
+
+#ifndef BOOST_STATS_UNIFORM_HPP
+#define BOOST_STATS_UNIFORM_HPP
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3668.htm
+// http://mathworld.wolfram.com/UniformDistribution.html
+// http://documents.wolfram.com/calculationcenter/v2/Functions/ListsMatrices/Statistics/UniformDistribution.html
+// http://en.wikipedia.org/wiki/Uniform_distribution_%28continuous%29
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+  namespace detail
+  {
+    template <class RealType, class Policy>
+    inline bool check_uniform_lower(
+      const char* function,
+      RealType lower,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(lower))
+      { // any finite value is OK.
+        return true;
+      }
+      else
+      { // Not finite.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "Lower parameter is %1%, but must be finite!", lower, pol);
+        return false;
+      }
+    } // bool check_uniform_lower(
+
+    template <class RealType, class Policy>
+    inline bool check_uniform_upper(
+      const char* function,
+      RealType upper,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(upper))
+      { // Any finite value is OK.
+        return true;
+      }
+      else
+      { // Not finite.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "Upper parameter is %1%, but must be finite!", upper, pol);
+        return false;
+      }
+    } // bool check_uniform_upper(
+
+    template <class RealType, class Policy>
+    inline bool check_uniform_x(
+      const char* function,
+      RealType const& x,
+      RealType* result, const Policy& pol)
+    {
+      if((boost::math::isfinite)(x))
+      { // Any finite value is OK
+        return true;
+      }
+      else
+      { // Not finite..
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "x parameter is %1%, but must be finite!", x, pol);
+        return false;
+      }
+    } // bool check_uniform_x
+
+    template <class RealType, class Policy>
+    inline bool check_uniform(
+      const char* function,
+      RealType lower,
+      RealType upper,
+      RealType* result, const Policy& pol)
+    {
+      if((check_uniform_lower(function, lower, result, pol) == false)
+        || (check_uniform_upper(function, upper, result, pol) == false))
+      {
+        return false;
+      }
+      else if (lower >= upper) // If lower == upper then 1 / (upper-lower) = 1/0 = +infinity!
+      { // upper and lower have been checked before, so must be lower >= upper.
+        *result = policies::raise_domain_error<RealType>(
+          function,
+          "lower parameter is %1%, but must be less than upper!", lower, pol);
+        return false;
+      }
+      else
+      { // All OK,
+        return true;
+      }
+    } // bool check_uniform(
+
+  } // namespace detail
+
+  template <class RealType = double, class Policy = policies::policy<> >
+  class uniform_distribution
+  {
+  public:
+    typedef RealType value_type;
+    typedef Policy policy_type;
+
+    uniform_distribution(RealType l_lower = 0, RealType l_upper = 1) // Constructor.
+      : m_lower(l_lower), m_upper(l_upper) // Default is standard uniform distribution.
+    {
+      RealType result;
+      detail::check_uniform("boost::math::uniform_distribution<%1%>::uniform_distribution", l_lower, l_upper, &result, Policy());
+    }
+    // Accessor functions.
+    RealType lower()const
+    {
+      return m_lower;
+    }
+
+    RealType upper()const
+    {
+      return m_upper;
+    }
+  private:
+    // Data members:
+    RealType m_lower;  // distribution lower aka a.
+    RealType m_upper;  // distribution upper aka b.
+  }; // class uniform_distribution
+
+  typedef uniform_distribution<double> uniform;
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> range(const uniform_distribution<RealType, Policy>& /* dist */)
+  { // Range of permissible values for random variable x.
+     using boost::math::tools::max_value;
+     return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + 'infinity'.
+     // Note RealType infinity is NOT permitted, only max_value.
+  }
+
+  template <class RealType, class Policy>
+  inline const std::pair<RealType, RealType> support(const uniform_distribution<RealType, Policy>& dist)
+  { // Range of supported values for random variable x.
+     // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+     using boost::math::tools::max_value;
+     return std::pair<RealType, RealType>(dist.lower(),  dist.upper());
+  }
+
+  template <class RealType, class Policy>
+  inline RealType pdf(const uniform_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::pdf(const uniform_distribution<%1%>&, %1%)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_uniform_x("boost::math::pdf(const uniform_distribution<%1%>&, %1%)", x, &result, Policy()))
+    {
+      return result;
+    }
+
+    if((x < lower) || (x > upper) )
+    {
+      return 0;
+    }
+    else
+    {
+      return 1 / (upper - lower);
+    }
+  } // RealType pdf(const uniform_distribution<RealType, Policy>& dist, const RealType& x)
+
+  template <class RealType, class Policy>
+  inline RealType cdf(const uniform_distribution<RealType, Policy>& dist, const RealType& x)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::cdf(const uniform_distribution<%1%>&, %1%)",lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_uniform_x("boost::math::cdf(const uniform_distribution<%1%>&, %1%)", x, &result, Policy()))
+    {
+      return result;
+    }
+    if (x < lower)
+    {
+      return 0;
+    }
+    if (x > upper)
+    {
+      return 1;
+    }
+    return (x - lower) / (upper - lower); // lower <= x <= upper
+  } // RealType cdf(const uniform_distribution<RealType, Policy>& dist, const RealType& x)
+
+  template <class RealType, class Policy>
+  inline RealType quantile(const uniform_distribution<RealType, Policy>& dist, const RealType& p)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks
+    if(false == detail::check_uniform("boost::math::quantile(const uniform_distribution<%1%>&, %1%)",lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_probability("boost::math::quantile(const uniform_distribution<%1%>&, %1%)", p, &result, Policy()))
+    {
+      return result;
+    }
+    if(p == 0)
+    {
+      return lower;
+    }
+    if(p == 1)
+    {
+      return upper;
+    }
+    return p * (upper - lower) + lower;
+  } // RealType quantile(const uniform_distribution<RealType, Policy>& dist, const RealType& p)
+
+  template <class RealType, class Policy>
+  inline RealType cdf(const complemented2_type<uniform_distribution<RealType, Policy>, RealType>& c)
+  {
+    RealType lower = c.dist.lower();
+    RealType upper = c.dist.upper();
+    RealType x = c.param;
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::cdf(const uniform_distribution<%1%>&, %1%)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_uniform_x("boost::math::cdf(const uniform_distribution<%1%>&, %1%)", x, &result, Policy()))
+    {
+      return result;
+    }
+    if (x < lower)
+    {
+      return 1;
+    }
+    if (x > upper)
+    {
+      return 0;
+    }
+    return (upper - x) / (upper - lower);
+  } // RealType cdf(const complemented2_type<uniform_distribution<RealType, Policy>, RealType>& c)
+
+  template <class RealType, class Policy>
+  inline RealType quantile(const complemented2_type<uniform_distribution<RealType, Policy>, RealType>& c)
+  {
+    RealType lower = c.dist.lower();
+    RealType upper = c.dist.upper();
+    RealType q = c.param;
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::quantile(const uniform_distribution<%1%>&, %1%)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    if(false == detail::check_probability("boost::math::quantile(const uniform_distribution<%1%>&, %1%)", q, &result, Policy()))
+      if(q == 0)
+      {
+        return lower;
+      }
+      if(q == 1)
+      {
+        return upper;
+      }
+      return -q * (upper - lower) + upper;
+  } // RealType quantile(const complemented2_type<uniform_distribution<RealType, Policy>, RealType>& c)
+
+  template <class RealType, class Policy>
+  inline RealType mean(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0;  // of checks.
+    if(false == detail::check_uniform("boost::math::mean(const uniform_distribution<%1%>&)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return (lower + upper ) / 2;
+  } // RealType mean(const uniform_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType variance(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::variance(const uniform_distribution<%1%>&)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return (upper - lower) * ( upper - lower) / 12;
+    // for standard uniform = 0.833333333333333333333333333333333333333333;
+  } // RealType variance(const uniform_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType mode(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::mode(const uniform_distribution<%1%>&)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    result = lower; // Any value [lower, upper] but arbitrarily choose lower.
+    return result;
+  }
+
+  template <class RealType, class Policy>
+  inline RealType median(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::median(const uniform_distribution<%1%>&)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return (lower + upper) / 2; //
+  }
+  template <class RealType, class Policy>
+  inline RealType skewness(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0; // of checks.
+    if(false == detail::check_uniform("boost::math::skewness(const uniform_distribution<%1%>&)",lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return 0;
+  } // RealType skewness(const uniform_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis_excess(const uniform_distribution<RealType, Policy>& dist)
+  {
+    RealType lower = dist.lower();
+    RealType upper = dist.upper();
+    RealType result = 0;  // of checks.
+    if(false == detail::check_uniform("boost::math::kurtosis_execess(const uniform_distribution<%1%>&)", lower, upper, &result, Policy()))
+    {
+      return result;
+    }
+    return static_cast<RealType>(-6)/5; //  -6/5 = -1.2;
+  } // RealType kurtosis_excess(const uniform_distribution<RealType, Policy>& dist)
+
+  template <class RealType, class Policy>
+  inline RealType kurtosis(const uniform_distribution<RealType, Policy>& dist)
+  {
+    return kurtosis_excess(dist) + 3;
+  }
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_UNIFORM_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/distributions/weibull.hpp b/gatb-core/thirdparty/boost/math/distributions/weibull.hpp
new file mode 100644
index 0000000..da11890
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/distributions/weibull.hpp
@@ -0,0 +1,395 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_STATS_WEIBULL_HPP
+#define BOOST_STATS_WEIBULL_HPP
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3668.htm
+// http://mathworld.wolfram.com/WeibullDistribution.html
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+
+#include <utility>
+
+namespace boost{ namespace math
+{
+namespace detail{
+
+template <class RealType, class Policy>
+inline bool check_weibull_shape(
+      const char* function,
+      RealType shape,
+      RealType* result, const Policy& pol)
+{
+   if((shape <= 0) || !(boost::math::isfinite)(shape))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Shape parameter is %1%, but must be > 0 !", shape, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_weibull_x(
+      const char* function,
+      RealType const& x,
+      RealType* result, const Policy& pol)
+{
+   if((x < 0) || !(boost::math::isfinite)(x))
+   {
+      *result = policies::raise_domain_error<RealType>(
+         function,
+         "Random variate is %1% but must be >= 0 !", x, pol);
+      return false;
+   }
+   return true;
+}
+
+template <class RealType, class Policy>
+inline bool check_weibull(
+      const char* function,
+      RealType scale,
+      RealType shape,
+      RealType* result, const Policy& pol)
+{
+   return check_scale(function, scale, result, pol) && check_weibull_shape(function, shape, result, pol);
+}
+
+} // namespace detail
+
+template <class RealType = double, class Policy = policies::policy<> >
+class weibull_distribution
+{
+public:
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   weibull_distribution(RealType l_shape, RealType l_scale = 1)
+      : m_shape(l_shape), m_scale(l_scale)
+   {
+      RealType result;
+      detail::check_weibull("boost::math::weibull_distribution<%1%>::weibull_distribution", l_scale, l_shape, &result, Policy());
+   }
+
+   RealType shape()const
+   {
+      return m_shape;
+   }
+
+   RealType scale()const
+   {
+      return m_scale;
+   }
+private:
+   //
+   // Data members:
+   //
+   RealType m_shape;     // distribution shape
+   RealType m_scale;     // distribution scale
+};
+
+typedef weibull_distribution<double> weibull;
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const weibull_distribution<RealType, Policy>& /*dist*/)
+{ // Range of permissible values for random variable x.
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const weibull_distribution<RealType, Policy>& /*dist*/)
+{ // Range of supported values for random variable x.
+   // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+   using boost::math::tools::max_value;
+   using boost::math::tools::min_value;
+   return std::pair<RealType, RealType>(min_value<RealType>(),  max_value<RealType>());
+   // A discontinuity at x == 0, so only support down to min_value.
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const weibull_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::pdf(const weibull_distribution<%1%>, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_weibull_x(function, x, &result, Policy()))
+      return result;
+
+   if(x == 0)
+   {
+      if(shape == 1)
+      {
+         return 1 / scale;
+      }
+      if(shape > 1)
+      {
+         return 0;
+      }
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+   }
+   result = exp(-pow(x / scale, shape));
+   result *= pow(x / scale, shape - 1) * shape / scale;
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const weibull_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const weibull_distribution<%1%>, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_weibull_x(function, x, &result, Policy()))
+      return result;
+
+   result = -boost::math::expm1(-pow(x / scale, shape), Policy());
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const weibull_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const weibull_distribution<%1%>, %1%)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, p, &result, Policy()))
+      return result;
+
+   if(p == 1)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = scale * pow(-boost::math::log1p(-p, Policy()), 1 / shape);
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<weibull_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::cdf(const weibull_distribution<%1%>, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_weibull_x(function, c.param, &result, Policy()))
+      return result;
+
+   result = exp(-pow(c.param / scale, shape));
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<weibull_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::quantile(const weibull_distribution<%1%>, %1%)";
+
+   RealType shape = c.dist.shape();
+   RealType scale = c.dist.scale();
+   RealType q = c.param;
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+   if(false == detail::check_probability(function, q, &result, Policy()))
+      return result;
+
+   if(q == 0)
+      return policies::raise_overflow_error<RealType>(function, 0, Policy());
+
+   result = scale * pow(-log(q), 1 / shape);
+
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mean(const weibull_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::mean(const weibull_distribution<%1%>)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+
+   result = scale * boost::math::tgamma(1 + 1 / shape, Policy());
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType variance(const weibull_distribution<RealType, Policy>& dist)
+{
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   static const char* function = "boost::math::variance(const weibull_distribution<%1%>)";
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+   {
+      return result;
+   }
+   result = boost::math::tgamma(1 + 1 / shape, Policy());
+   result *= -result;
+   result += boost::math::tgamma(1 + 2 / shape, Policy());
+   result *= scale * scale;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const weibull_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std function pow.
+
+   static const char* function = "boost::math::mode(const weibull_distribution<%1%>)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+   {
+      return result;
+   }
+   if(shape <= 1)
+      return 0;
+   result = scale * pow((shape - 1) / shape, 1 / shape);
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType median(const weibull_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std function pow.
+
+   static const char* function = "boost::math::median(const weibull_distribution<%1%>)";
+
+   RealType shape = dist.shape(); // Wikipedia k
+   RealType scale = dist.scale(); // Wikipedia lambda
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+   {
+      return result;
+   }
+   using boost::math::constants::ln_two;
+   result = scale * pow(ln_two<RealType>(), 1 / shape);
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const weibull_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::skewness(const weibull_distribution<%1%>)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+   {
+      return result;
+   }
+   RealType g1, g2, g3, d;
+
+   g1 = boost::math::tgamma(1 + 1 / shape, Policy());
+   g2 = boost::math::tgamma(1 + 2 / shape, Policy());
+   g3 = boost::math::tgamma(1 + 3 / shape, Policy());
+   d = pow(g2 - g1 * g1, RealType(1.5));
+
+   result = (2 * g1 * g1 * g1 - 3 * g1 * g2 + g3) / d;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const weibull_distribution<RealType, Policy>& dist)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   static const char* function = "boost::math::kurtosis_excess(const weibull_distribution<%1%>)";
+
+   RealType shape = dist.shape();
+   RealType scale = dist.scale();
+
+   RealType result = 0;
+   if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
+      return result;
+
+   RealType g1, g2, g3, g4, d, g1_2, g1_4;
+
+   g1 = boost::math::tgamma(1 + 1 / shape, Policy());
+   g2 = boost::math::tgamma(1 + 2 / shape, Policy());
+   g3 = boost::math::tgamma(1 + 3 / shape, Policy());
+   g4 = boost::math::tgamma(1 + 4 / shape, Policy());
+   g1_2 = g1 * g1;
+   g1_4 = g1_2 * g1_2;
+   d = g2 - g1_2;
+   d *= d;
+
+   result = -6 * g1_4 + 12 * g1_2 * g2 - 3 * g2 * g2 - 4 * g1 * g3 + g4;
+   result /= d;
+   return result;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const weibull_distribution<RealType, Policy>& dist)
+{
+   return kurtosis_excess(dist) + 3;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_WEIBULL_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/octonion.hpp b/gatb-core/thirdparty/boost/math/octonion.hpp
new file mode 100644
index 0000000..fba9aff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/octonion.hpp
@@ -0,0 +1,4250 @@
+//    boost octonion.hpp header file
+
+//  (C) Copyright Hubert Holin 2001.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+
+#ifndef BOOST_OCTONION_HPP
+#define BOOST_OCTONION_HPP
+
+#include <boost/math/quaternion.hpp>
+
+
+namespace boost
+{
+    namespace math
+    {
+    
+#define    BOOST_OCTONION_ACCESSOR_GENERATOR(type)                      \
+            type                        real() const                    \
+            {                                                           \
+                return(a);                                              \
+            }                                                           \
+                                                                        \
+            octonion<type>                unreal() const                \
+            {                                                           \
+                return( octonion<type>(static_cast<type>(0),b,c,d,e,f,g,h));   \
+            }                                                           \
+                                                                        \
+            type                            R_component_1() const       \
+            {                                                           \
+                return(a);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_2() const       \
+            {                                                           \
+                return(b);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_3() const       \
+            {                                                           \
+                return(c);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_4() const       \
+            {                                                           \
+                return(d);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_5() const       \
+            {                                                           \
+                return(e);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_6() const       \
+            {                                                           \
+                return(f);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_7() const       \
+            {                                                           \
+                return(g);                                              \
+            }                                                           \
+                                                                        \
+            type                            R_component_8() const       \
+            {                                                           \
+                return(h);                                              \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>            C_component_1() const       \
+            {                                                           \
+                return(::std::complex<type>(a,b));                      \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>            C_component_2() const       \
+            {                                                           \
+                return(::std::complex<type>(c,d));                      \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>            C_component_3() const       \
+            {                                                           \
+                return(::std::complex<type>(e,f));                      \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>            C_component_4() const       \
+            {                                                           \
+                return(::std::complex<type>(g,h));                      \
+            }                                                           \
+                                                                        \
+            ::boost::math::quaternion<type>    H_component_1() const    \
+            {                                                           \
+                return(::boost::math::quaternion<type>(a,b,c,d));       \
+            }                                                           \
+                                                                        \
+            ::boost::math::quaternion<type>    H_component_2() const    \
+            {                                                           \
+                return(::boost::math::quaternion<type>(e,f,g,h));       \
+            }
+        
+    
+#define    BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(type)                                         \
+            template<typename X>                                                                    \
+            octonion<type> &        operator = (octonion<X> const & a_affecter)                     \
+            {                                                                                       \
+                a = static_cast<type>(a_affecter.R_component_1());                                  \
+                b = static_cast<type>(a_affecter.R_component_2());                                  \
+                c = static_cast<type>(a_affecter.R_component_3());                                  \
+                d = static_cast<type>(a_affecter.R_component_4());                                  \
+                e = static_cast<type>(a_affecter.R_component_5());                                  \
+                f = static_cast<type>(a_affecter.R_component_6());                                  \
+                g = static_cast<type>(a_affecter.R_component_7());                                  \
+                h = static_cast<type>(a_affecter.R_component_8());                                  \
+                                                                                                    \
+                return(*this);                                                                      \
+            }                                                                                       \
+                                                                                                    \
+            octonion<type> &        operator = (octonion<type> const & a_affecter)                  \
+            {                                                                                       \
+                a = a_affecter.a;                                                                   \
+                b = a_affecter.b;                                                                   \
+                c = a_affecter.c;                                                                   \
+                d = a_affecter.d;                                                                   \
+                e = a_affecter.e;                                                                   \
+                f = a_affecter.f;                                                                   \
+                g = a_affecter.g;                                                                   \
+                h = a_affecter.h;                                                                   \
+                                                                                                    \
+                return(*this);                                                                      \
+            }                                                                                       \
+                                                                                                    \
+            octonion<type> &        operator = (type const & a_affecter)                            \
+            {                                                                                       \
+                a = a_affecter;                                                                     \
+                                                                                                    \
+                b = c = d = e = f= g = h = static_cast<type>(0);                                    \
+                                                                                                    \
+                return(*this);                                                                      \
+            }                                                                                       \
+                                                                                                    \
+            octonion<type> &        operator = (::std::complex<type> const & a_affecter)            \
+            {                                                                                       \
+                a = a_affecter.real();                                                              \
+                b = a_affecter.imag();                                                              \
+                                                                                                    \
+                c = d = e = f = g = h = static_cast<type>(0);                                       \
+                                                                                                    \
+                return(*this);                                                                      \
+            }                                                                                       \
+                                                                                                    \
+            octonion<type> &        operator = (::boost::math::quaternion<type> const & a_affecter) \
+            {                                                                                       \
+                a = a_affecter.R_component_1();                                                     \
+                b = a_affecter.R_component_2();                                                     \
+                c = a_affecter.R_component_3();                                                     \
+                d = a_affecter.R_component_4();                                                     \
+                                                                                                    \
+                e = f = g = h = static_cast<type>(0);                                               \
+                                                                                                    \
+                return(*this);                                                                      \
+            }
+        
+        
+#define    BOOST_OCTONION_MEMBER_DATA_GENERATOR(type) \
+            type    a;                                \
+            type    b;                                \
+            type    c;                                \
+            type    d;                                \
+            type    e;                                \
+            type    f;                                \
+            type    g;                                \
+            type    h;                                \
+        
+        
+        template<typename T>
+        class octonion
+        {
+        public:
+            
+            typedef T value_type;
+            
+            // constructor for O seen as R^8
+            // (also default constructor)
+            
+            explicit                octonion(   T const & requested_a = T(),
+                                                T const & requested_b = T(),
+                                                T const & requested_c = T(),
+                                                T const & requested_d = T(),
+                                                T const & requested_e = T(),
+                                                T const & requested_f = T(),
+                                                T const & requested_g = T(),
+                                                T const & requested_h = T())
+            :   a(requested_a),
+                b(requested_b),
+                c(requested_c),
+                d(requested_d),
+                e(requested_e),
+                f(requested_f),
+                g(requested_g),
+                h(requested_h)
+            {
+                // nothing to do!
+            }
+            
+            
+            // constructor for H seen as C^4
+                
+            explicit                octonion(   ::std::complex<T> const & z0,
+                                                ::std::complex<T> const & z1 = ::std::complex<T>(),
+                                                ::std::complex<T> const & z2 = ::std::complex<T>(),
+                                                ::std::complex<T> const & z3 = ::std::complex<T>())
+            :   a(z0.real()),
+                b(z0.imag()),
+                c(z1.real()),
+                d(z1.imag()),
+                e(z2.real()),
+                f(z2.imag()),
+                g(z3.real()),
+                h(z3.imag())
+            {
+                // nothing to do!
+            }
+            
+            
+            // constructor for O seen as H^2
+                
+            explicit                octonion(   ::boost::math::quaternion<T> const & q0,
+                                                ::boost::math::quaternion<T> const & q1 = ::boost::math::quaternion<T>())
+            :   a(q0.R_component_1()),
+                b(q0.R_component_2()),
+                c(q0.R_component_3()),
+                d(q0.R_component_4()),
+                e(q1.R_component_1()),
+                f(q1.R_component_2()),
+                g(q1.R_component_3()),
+                h(q1.R_component_4())
+            {
+                // nothing to do!
+            }
+            
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            
+            // templated copy constructor
+            
+            template<typename X>
+            explicit                octonion(octonion<X> const & a_recopier)
+            :   a(static_cast<T>(a_recopier.R_component_1())),
+                b(static_cast<T>(a_recopier.R_component_2())),
+                c(static_cast<T>(a_recopier.R_component_3())),
+                d(static_cast<T>(a_recopier.R_component_4())),
+                e(static_cast<T>(a_recopier.R_component_5())),
+                f(static_cast<T>(a_recopier.R_component_6())),
+                g(static_cast<T>(a_recopier.R_component_7())),
+                h(static_cast<T>(a_recopier.R_component_8()))
+            {
+                // nothing to do!
+            }
+            
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            
+            // accessors
+            //
+            // Note:    Like complex number, octonions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is an octonion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_OCTONION_ACCESSOR_GENERATOR(T)
+            
+            // assignment operators
+            
+            BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(T)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Octonion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);";
+            //            octonion multiplication is also *NOT* associative
+            
+            octonion<T> &            operator += (T const & rhs)
+            {
+                T    at = a + rhs;    // exception guard
+                
+                a = at;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator += (::std::complex<T> const & rhs)
+            {
+                T    at = a + rhs.real();    // exception guard
+                T    bt = b + rhs.imag();    // exception guard
+                
+                a = at; 
+                b = bt;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator += (::boost::math::quaternion<T> const & rhs)
+            {
+                T    at = a + rhs.R_component_1();    // exception guard
+                T    bt = b + rhs.R_component_2();    // exception guard
+                T    ct = c + rhs.R_component_3();    // exception guard
+                T    dt = d + rhs.R_component_4();    // exception guard
+                
+                a = at; 
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            octonion<T> &            operator += (octonion<X> const & rhs)
+            {
+                T    at = a + static_cast<T>(rhs.R_component_1());    // exception guard
+                T    bt = b + static_cast<T>(rhs.R_component_2());    // exception guard
+                T    ct = c + static_cast<T>(rhs.R_component_3());    // exception guard
+                T    dt = d + static_cast<T>(rhs.R_component_4());    // exception guard
+                T    et = e + static_cast<T>(rhs.R_component_5());    // exception guard
+                T    ft = f + static_cast<T>(rhs.R_component_6());    // exception guard
+                T    gt = g + static_cast<T>(rhs.R_component_7());    // exception guard
+                T    ht = h + static_cast<T>(rhs.R_component_8());    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            
+            octonion<T> &            operator -= (T const & rhs)
+            {
+                T    at = a - rhs;    // exception guard
+                
+                a = at;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator -= (::std::complex<T> const & rhs)
+            {
+                T    at = a - rhs.real();    // exception guard
+                T    bt = b - rhs.imag();    // exception guard
+                
+                a = at; 
+                b = bt;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator -= (::boost::math::quaternion<T> const & rhs)
+            {
+                T    at = a - rhs.R_component_1();    // exception guard
+                T    bt = b - rhs.R_component_2();    // exception guard
+                T    ct = c - rhs.R_component_3();    // exception guard
+                T    dt = d - rhs.R_component_4();    // exception guard
+                
+                a = at; 
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            octonion<T> &            operator -= (octonion<X> const & rhs)
+            {
+                T    at = a - static_cast<T>(rhs.R_component_1());    // exception guard
+                T    bt = b - static_cast<T>(rhs.R_component_2());    // exception guard
+                T    ct = c - static_cast<T>(rhs.R_component_3());    // exception guard
+                T    dt = d - static_cast<T>(rhs.R_component_4());    // exception guard
+                T    et = e - static_cast<T>(rhs.R_component_5());    // exception guard
+                T    ft = f - static_cast<T>(rhs.R_component_6());    // exception guard
+                T    gt = g - static_cast<T>(rhs.R_component_7());    // exception guard
+                T    ht = h - static_cast<T>(rhs.R_component_8());    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator *= (T const & rhs)
+            {
+                T    at = a * rhs;    // exception guard
+                T    bt = b * rhs;    // exception guard
+                T    ct = c * rhs;    // exception guard
+                T    dt = d * rhs;    // exception guard
+                T    et = e * rhs;    // exception guard
+                T    ft = f * rhs;    // exception guard
+                T    gt = g * rhs;    // exception guard
+                T    ht = h * rhs;    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator *= (::std::complex<T> const & rhs)
+            {
+                T    ar = rhs.real();
+                T    br = rhs.imag();
+                
+                T    at = +a*ar-b*br;
+                T    bt = +a*br+b*ar;
+                T    ct = +c*ar+d*br;
+                T    dt = -c*br+d*ar;
+                T    et = +e*ar+f*br;
+                T    ft = -e*br+f*ar;
+                T    gt = +g*ar-h*br;
+                T    ht = +g*br+h*ar;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator *= (::boost::math::quaternion<T> const & rhs)
+            {
+                T    ar = rhs.R_component_1();
+                T    br = rhs.R_component_2();
+                T    cr = rhs.R_component_2();
+                T    dr = rhs.R_component_2();
+                
+                T    at = +a*ar-b*br-c*cr-d*dr;
+                T    bt = +a*br+b*ar+c*dr-d*cr;
+                T    ct = +a*cr-b*dr+c*ar+d*br;
+                T    dt = +a*dr+b*cr-c*br+d*ar;
+                T    et = +e*ar+f*br+g*cr+h*dr;
+                T    ft = -e*br+f*ar-g*dr+h*cr;
+                T    gt = -e*cr+f*dr+g*ar-h*br;
+                T    ht = -e*dr-f*cr+g*br+h*ar;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            octonion<T> &            operator *= (octonion<X> const & rhs)
+            {
+                T    ar = static_cast<T>(rhs.R_component_1());
+                T    br = static_cast<T>(rhs.R_component_2());
+                T    cr = static_cast<T>(rhs.R_component_3());
+                T    dr = static_cast<T>(rhs.R_component_4());
+                T    er = static_cast<T>(rhs.R_component_5());
+                T    fr = static_cast<T>(rhs.R_component_6());
+                T    gr = static_cast<T>(rhs.R_component_7());
+                T    hr = static_cast<T>(rhs.R_component_8());
+                
+                T    at = +a*ar-b*br-c*cr-d*dr-e*er-f*fr-g*gr-h*hr;
+                T    bt = +a*br+b*ar+c*dr-d*cr+e*fr-f*er-g*hr+h*gr;
+                T    ct = +a*cr-b*dr+c*ar+d*br+e*gr+f*hr-g*er-h*fr;
+                T    dt = +a*dr+b*cr-c*br+d*ar+e*hr-f*gr+g*fr-h*er;
+                T    et = +a*er-b*fr-c*gr-d*hr+e*ar+f*br+g*cr+h*dr;
+                T    ft = +a*fr+b*er-c*hr+d*gr-e*br+f*ar-g*dr+h*cr;
+                T    gt = +a*gr+b*hr+c*er-d*fr-e*cr+f*dr+g*ar-h*br;
+                T    ht = +a*hr-b*gr+c*fr+d*er-e*dr-f*cr+g*br+h*ar;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator /= (T const & rhs)
+            {
+                T    at = a / rhs;    // exception guard
+                T    bt = b / rhs;    // exception guard
+                T    ct = c / rhs;    // exception guard
+                T    dt = d / rhs;    // exception guard
+                T    et = e / rhs;    // exception guard
+                T    ft = f / rhs;    // exception guard
+                T    gt = g / rhs;    // exception guard
+                T    ht = h / rhs;    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator /= (::std::complex<T> const & rhs)
+            {
+                T    ar = rhs.real();
+                T    br = rhs.imag();
+                
+                T    denominator = ar*ar+br*br;
+                
+                T    at = (+a*ar-b*br)/denominator;
+                T    bt = (-a*br+b*ar)/denominator;
+                T    ct = (+c*ar-d*br)/denominator;
+                T    dt = (+c*br+d*ar)/denominator;
+                T    et = (+e*ar-f*br)/denominator;
+                T    ft = (+e*br+f*ar)/denominator;
+                T    gt = (+g*ar+h*br)/denominator;
+                T    ht = (+g*br+h*ar)/denominator;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            octonion<T> &            operator /= (::boost::math::quaternion<T> const & rhs)
+            {
+                T    ar = rhs.R_component_1();
+                T    br = rhs.R_component_2();
+                T    cr = rhs.R_component_2();
+                T    dr = rhs.R_component_2();
+                
+                T    denominator = ar*ar+br*br+cr*cr+dr*dr;
+                
+                T    at = (+a*ar+b*br+c*cr+d*dr)/denominator;
+                T    bt = (-a*br+b*ar-c*dr+d*cr)/denominator;
+                T    ct = (-a*cr+b*dr+c*ar-d*br)/denominator;
+                T    dt = (-a*dr-b*cr+c*br+d*ar)/denominator;
+                T    et = (+e*ar-f*br-g*cr-h*dr)/denominator;
+                T    ft = (+e*br+f*ar+g*dr-h*cr)/denominator;
+                T    gt = (+e*cr-f*dr+g*ar+h*br)/denominator;
+                T    ht = (+e*dr+f*cr-g*br+h*ar)/denominator;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            octonion<T> &            operator /= (octonion<X> const & rhs)
+            {
+                T    ar = static_cast<T>(rhs.R_component_1());
+                T    br = static_cast<T>(rhs.R_component_2());
+                T    cr = static_cast<T>(rhs.R_component_3());
+                T    dr = static_cast<T>(rhs.R_component_4());
+                T    er = static_cast<T>(rhs.R_component_5());
+                T    fr = static_cast<T>(rhs.R_component_6());
+                T    gr = static_cast<T>(rhs.R_component_7());
+                T    hr = static_cast<T>(rhs.R_component_8());
+                
+                T    denominator = ar*ar+br*br+cr*cr+dr*dr+er*er+fr*fr+gr*gr+hr*hr;
+                
+                T    at = (+a*ar+b*br+c*cr+d*dr+e*er+f*fr+g*gr+h*hr)/denominator;
+                T    bt = (-a*br+b*ar-c*dr+d*cr-e*fr+f*er+g*hr-h*gr)/denominator;
+                T    ct = (-a*cr+b*dr+c*ar-d*br-e*gr-f*hr+g*er+h*fr)/denominator;
+                T    dt = (-a*dr-b*cr+c*br+d*ar-e*hr+f*gr-g*fr+h*er)/denominator;
+                T    et = (-a*er+b*fr+c*gr+d*hr+e*ar-f*br-g*cr-h*dr)/denominator;
+                T    ft = (-a*fr-b*er+c*hr-d*gr+e*br+f*ar+g*dr-h*cr)/denominator;
+                T    gt = (-a*gr-b*hr-c*er+d*fr+e*cr-f*dr+g*ar+h*br)/denominator;
+                T    ht = (-a*hr+b*gr-c*fr-d*er+e*dr+f*cr-g*br+h*ar)/denominator;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                e = et;
+                f = ft;
+                g = gt;
+                h = ht;
+                
+                return(*this);
+            }
+            
+            
+        protected:
+            
+            BOOST_OCTONION_MEMBER_DATA_GENERATOR(T)
+            
+            
+        private:
+            
+        };
+        
+        
+        // declaration of octonion specialization
+        
+        template<>    class octonion<float>;
+        template<>    class octonion<double>;
+        template<>    class octonion<long double>;
+        
+        
+        // helper templates for converting copy constructors (declaration)
+        
+        namespace detail
+        {
+            
+            template<   typename T,
+                        typename U
+                    >
+            octonion<T>    octonion_type_converter(octonion<U> const & rhs);
+        }
+        
+        
+        // implementation of octonion specialization
+        
+        
+#define    BOOST_OCTONION_CONSTRUCTOR_GENERATOR(type)                                                                               \
+            explicit                    octonion(   type const & requested_a = static_cast<type>(0),                                \
+                                                    type const & requested_b = static_cast<type>(0),                                \
+                                                    type const & requested_c = static_cast<type>(0),                                \
+                                                    type const & requested_d = static_cast<type>(0),                                \
+                                                    type const & requested_e = static_cast<type>(0),                                \
+                                                    type const & requested_f = static_cast<type>(0),                                \
+                                                    type const & requested_g = static_cast<type>(0),                                \
+                                                    type const & requested_h = static_cast<type>(0))                                \
+            :   a(requested_a),                                                                                                     \
+                b(requested_b),                                                                                                     \
+                c(requested_c),                                                                                                     \
+                d(requested_d),                                                                                                     \
+                e(requested_e),                                                                                                     \
+                f(requested_f),                                                                                                     \
+                g(requested_g),                                                                                                     \
+                h(requested_h)                                                                                                      \
+            {                                                                                                                       \
+            }                                                                                                                       \
+                                                                                                                                    \
+            explicit                    octonion(   ::std::complex<type> const & z0,                                                \
+                                                    ::std::complex<type> const & z1 = ::std::complex<type>(),                       \
+                                                    ::std::complex<type> const & z2 = ::std::complex<type>(),                       \
+                                                    ::std::complex<type> const & z3 = ::std::complex<type>())                       \
+            :   a(z0.real()),                                                                                                       \
+                b(z0.imag()),                                                                                                       \
+                c(z1.real()),                                                                                                       \
+                d(z1.imag()),                                                                                                       \
+                e(z2.real()),                                                                                                       \
+                f(z2.imag()),                                                                                                       \
+                g(z3.real()),                                                                                                       \
+                h(z3.imag())                                                                                                        \
+            {                                                                                                                       \
+            }                                                                                                                       \
+                                                                                                                                    \
+            explicit                    octonion(   ::boost::math::quaternion<type> const & q0,                                     \
+                                                    ::boost::math::quaternion<type> const & q1 = ::boost::math::quaternion<type>()) \
+            :   a(q0.R_component_1()),                                                                                              \
+                b(q0.R_component_2()),                                                                                              \
+                c(q0.R_component_3()),                                                                                              \
+                d(q0.R_component_4()),                                                                                              \
+                e(q1.R_component_1()),                                                                                              \
+                f(q1.R_component_2()),                                                                                              \
+                g(q1.R_component_3()),                                                                                              \
+                h(q1.R_component_4())                                                                                               \
+            {                                                                                                                       \
+            }
+        
+    
+#define    BOOST_OCTONION_MEMBER_ADD_GENERATOR_1(type)                  \
+            octonion<type> &            operator += (type const & rhs)  \
+            {                                                           \
+                a += rhs;                                               \
+                                                                        \
+                return(*this);                                          \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_ADD_GENERATOR_2(type)                                  \
+            octonion<type> &            operator += (::std::complex<type> const & rhs)  \
+            {                                                                           \
+                a += rhs.real();                                                        \
+                b += rhs.imag();                                                        \
+                                                                                        \
+                return(*this);                                                          \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_ADD_GENERATOR_3(type)                                              \
+            octonion<type> &            operator += (::boost::math::quaternion<type> const & rhs)   \
+            {                                                                                       \
+                a += rhs.R_component_1();                                                           \
+                b += rhs.R_component_2();                                                           \
+                c += rhs.R_component_3();                                                           \
+                d += rhs.R_component_4();                                                           \
+                                                                                                    \
+                return(*this);                                                                      \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_ADD_GENERATOR_4(type)                          \
+            template<typename X>                                                \
+            octonion<type> &            operator += (octonion<X> const & rhs)   \
+            {                                                                   \
+                a += static_cast<type>(rhs.R_component_1());                    \
+                b += static_cast<type>(rhs.R_component_2());                    \
+                c += static_cast<type>(rhs.R_component_3());                    \
+                d += static_cast<type>(rhs.R_component_4());                    \
+                e += static_cast<type>(rhs.R_component_5());                    \
+                f += static_cast<type>(rhs.R_component_6());                    \
+                g += static_cast<type>(rhs.R_component_7());                    \
+                h += static_cast<type>(rhs.R_component_8());                    \
+                                                                                \
+                return(*this);                                                  \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_SUB_GENERATOR_1(type)                  \
+            octonion<type> &            operator -= (type const & rhs)  \
+            {                                                           \
+                a -= rhs;                                               \
+                                                                        \
+                return(*this);                                          \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_SUB_GENERATOR_2(type)                                  \
+            octonion<type> &            operator -= (::std::complex<type> const & rhs)  \
+            {                                                                           \
+                a -= rhs.real();                                                        \
+                b -= rhs.imag();                                                        \
+                                                                                        \
+                return(*this);                                                          \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_SUB_GENERATOR_3(type)                                              \
+            octonion<type> &            operator -= (::boost::math::quaternion<type> const & rhs)   \
+            {                                                                                       \
+                a -= rhs.R_component_1();                                                           \
+                b -= rhs.R_component_2();                                                           \
+                c -= rhs.R_component_3();                                                           \
+                d -= rhs.R_component_4();                                                           \
+                                                                                                    \
+                return(*this);                                                                      \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_SUB_GENERATOR_4(type)                        \
+            template<typename X>                                              \
+            octonion<type> &            operator -= (octonion<X> const & rhs) \
+            {                                                                 \
+                a -= static_cast<type>(rhs.R_component_1());                  \
+                b -= static_cast<type>(rhs.R_component_2());                  \
+                c -= static_cast<type>(rhs.R_component_3());                  \
+                d -= static_cast<type>(rhs.R_component_4());                  \
+                e -= static_cast<type>(rhs.R_component_5());                  \
+                f -= static_cast<type>(rhs.R_component_6());                  \
+                g -= static_cast<type>(rhs.R_component_7());                  \
+                h -= static_cast<type>(rhs.R_component_8());                  \
+                                                                              \
+                return(*this);                                                \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_MUL_GENERATOR_1(type)                   \
+            octonion<type> &            operator *= (type const & rhs)   \
+            {                                                            \
+                a *= rhs;                                                \
+                b *= rhs;                                                \
+                c *= rhs;                                                \
+                d *= rhs;                                                \
+                e *= rhs;                                                \
+                f *= rhs;                                                \
+                g *= rhs;                                                \
+                h *= rhs;                                                \
+                                                                         \
+                return(*this);                                           \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_MUL_GENERATOR_2(type)                                  \
+            octonion<type> &            operator *= (::std::complex<type> const & rhs)  \
+            {                                                                           \
+                type    ar = rhs.real();                                                \
+                type    br = rhs.imag();                                                \
+                                                                                        \
+                type    at = +a*ar-b*br;                                                \
+                type    bt = +a*br+b*ar;                                                \
+                type    ct = +c*ar+d*br;                                                \
+                type    dt = -c*br+d*ar;                                                \
+                type    et = +e*ar+f*br;                                                \
+                type    ft = -e*br+f*ar;                                                \
+                type    gt = +g*ar-h*br;                                                \
+                type    ht = +g*br+h*ar;                                                \
+                                                                                        \
+                a = at;                                                                 \
+                b = bt;                                                                 \
+                c = ct;                                                                 \
+                d = dt;                                                                 \
+                e = et;                                                                 \
+                f = ft;                                                                 \
+                g = gt;                                                                 \
+                h = ht;                                                                 \
+                                                                                        \
+                return(*this);                                                          \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_MUL_GENERATOR_3(type)                                                    \
+            octonion<type> &            operator *= (::boost::math::quaternion<type> const & rhs)   \
+            {                                                                                       \
+                type    ar = rhs.R_component_1();                                                   \
+                type    br = rhs.R_component_2();                                                   \
+                type    cr = rhs.R_component_2();                                                   \
+                type    dr = rhs.R_component_2();                                                   \
+                                                                                                    \
+                type    at = +a*ar-b*br-c*cr-d*dr;                                                  \
+                type    bt = +a*br+b*ar+c*dr-d*cr;                                                  \
+                type    ct = +a*cr-b*dr+c*ar+d*br;                                                  \
+                type    dt = +a*dr+b*cr-c*br+d*ar;                                                  \
+                type    et = +e*ar+f*br+g*cr+h*dr;                                                  \
+                type    ft = -e*br+f*ar-g*dr+h*cr;                                                  \
+                type    gt = -e*cr+f*dr+g*ar-h*br;                                                  \
+                type    ht = -e*dr-f*cr+g*br+h*ar;                                                  \
+                                                                                                    \
+                a = at;                                                                             \
+                b = bt;                                                                             \
+                c = ct;                                                                             \
+                d = dt;                                                                             \
+                e = et;                                                                             \
+                f = ft;                                                                             \
+                g = gt;                                                                             \
+                h = ht;                                                                             \
+                                                                                                    \
+                return(*this);                                                                      \
+            }
+    
+#define    BOOST_OCTONION_MEMBER_MUL_GENERATOR_4(type)                          \
+            template<typename X>                                                \
+            octonion<type> &            operator *= (octonion<X> const & rhs)   \
+            {                                                                   \
+                type    ar = static_cast<type>(rhs.R_component_1());            \
+                type    br = static_cast<type>(rhs.R_component_2());            \
+                type    cr = static_cast<type>(rhs.R_component_3());            \
+                type    dr = static_cast<type>(rhs.R_component_4());            \
+                type    er = static_cast<type>(rhs.R_component_5());            \
+                type    fr = static_cast<type>(rhs.R_component_6());            \
+                type    gr = static_cast<type>(rhs.R_component_7());            \
+                type    hr = static_cast<type>(rhs.R_component_8());            \
+                                                                                \
+                type    at = +a*ar-b*br-c*cr-d*dr-e*er-f*fr-g*gr-h*hr;          \
+                type    bt = +a*br+b*ar+c*dr-d*cr+e*fr-f*er-g*hr+h*gr;          \
+                type    ct = +a*cr-b*dr+c*ar+d*br+e*gr+f*hr-g*er-h*fr;          \
+                type    dt = +a*dr+b*cr-c*br+d*ar+e*hr-f*gr+g*fr-h*er;          \
+                type    et = +a*er-b*fr-c*gr-d*hr+e*ar+f*br+g*cr+h*dr;          \
+                type    ft = +a*fr+b*er-c*hr+d*gr-e*br+f*ar-g*dr+h*cr;          \
+                type    gt = +a*gr+b*hr+c*er-d*fr-e*cr+f*dr+g*ar-h*br;          \
+                type    ht = +a*hr-b*gr+c*fr+d*er-e*dr-f*cr+g*br+h*ar;          \
+                                                                                \
+                a = at;                                                         \
+                b = bt;                                                         \
+                c = ct;                                                         \
+                d = dt;                                                         \
+                e = et;                                                         \
+                f = ft;                                                         \
+                g = gt;                                                         \
+                h = ht;                                                         \
+                                                                                \
+                return(*this);                                                  \
+            }
+    
+// There is quite a lot of repetition in the code below. This is intentional.
+// The last conditional block is the normal form, and the others merely
+// consist of workarounds for various compiler deficiencies. Hopefuly, when
+// more compilers are conformant and we can retire support for those that are
+// not, we will be able to remove the clutter. This is makes the situation
+// (painfully) explicit.
+    
+#define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_1(type)                  \
+            octonion<type> &            operator /= (type const & rhs)  \
+            {                                                           \
+                a /= rhs;                                               \
+                b /= rhs;                                               \
+                c /= rhs;                                               \
+                d /= rhs;                                               \
+                                                                        \
+                return(*this);                                          \
+            }
+    
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type)                              \
+            octonion<type> &            operator /= (::std::complex<type> const & rhs)  \
+            {                                                                           \
+                using    ::std::valarray;                                               \
+                using    ::std::abs;                                                    \
+                                                                                        \
+                valarray<type>    tr(2);                                                \
+                                                                                        \
+                tr[0] = rhs.real();                                                     \
+                tr[1] = rhs.imag();                                                     \
+                                                                                        \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();           \
+                                                                                        \
+                tr *= mixam;                                                            \
+                                                                                        \
+                valarray<type>    tt(8);                                                \
+                                                                                        \
+                tt[0] = +a*tr[0]-b*tr[1];                                               \
+                tt[1] = -a*tr[1]+b*tr[0];                                               \
+                tt[2] = +c*tr[0]-d*tr[1];                                               \
+                tt[3] = +c*tr[1]+d*tr[0];                                               \
+                tt[4] = +e*tr[0]-f*tr[1];                                               \
+                tt[5] = +e*tr[1]+f*tr[0];                                               \
+                tt[6] = +g*tr[0]+h*tr[1];                                               \
+                tt[7] = +g*tr[1]+h*tr[0];                                               \
+                                                                                        \
+                tr *= tr;                                                               \
+                                                                                        \
+                tt *= (mixam/tr.sum());                                                 \
+                                                                                        \
+                a = tt[0];                                                              \
+                b = tt[1];                                                              \
+                c = tt[2];                                                              \
+                d = tt[3];                                                              \
+                e = tt[4];                                                              \
+                f = tt[5];                                                              \
+                g = tt[6];                                                              \
+                h = tt[7];                                                              \
+                                                                                        \
+                return(*this);                                                          \
+            }
+#else
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type)                              \
+            octonion<type> &            operator /= (::std::complex<type> const & rhs)  \
+            {                                                                           \
+                using    ::std::valarray;                                               \
+                                                                                        \
+                valarray<type>    tr(2);                                                \
+                                                                                        \
+                tr[0] = rhs.real();                                                     \
+                tr[1] = rhs.imag();                                                     \
+                                                                                        \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();           \
+                                                                                        \
+                tr *= mixam;                                                            \
+                                                                                        \
+                valarray<type>    tt(8);                                                \
+                                                                                        \
+                tt[0] = +a*tr[0]-b*tr[1];                                               \
+                tt[1] = -a*tr[1]+b*tr[0];                                               \
+                tt[2] = +c*tr[0]-d*tr[1];                                               \
+                tt[3] = +c*tr[1]+d*tr[0];                                               \
+                tt[4] = +e*tr[0]-f*tr[1];                                               \
+                tt[5] = +e*tr[1]+f*tr[0];                                               \
+                tt[6] = +g*tr[0]+h*tr[1];                                               \
+                tt[7] = +g*tr[1]+h*tr[0];                                               \
+                                                                                        \
+                tr *= tr;                                                               \
+                                                                                        \
+                tt *= (mixam/tr.sum());                                                 \
+                                                                                        \
+                a = tt[0];                                                              \
+                b = tt[1];                                                              \
+                c = tt[2];                                                              \
+                d = tt[3];                                                              \
+                e = tt[4];                                                              \
+                f = tt[5];                                                              \
+                g = tt[6];                                                              \
+                h = tt[7];                                                              \
+                                                                                        \
+                return(*this);                                                          \
+            }
+#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+    
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type)                                           \
+            octonion<type> &            operator /= (::boost::math::quaternion<type> const & rhs)    \
+            {                                                                                        \
+                using    ::std::valarray;                                                            \
+                using    ::std::abs;                                                                 \
+                                                                                                     \
+                valarray<type>    tr(4);                                                             \
+                                                                                                     \
+                tr[0] = static_cast<type>(rhs.R_component_1());                                      \
+                tr[1] = static_cast<type>(rhs.R_component_2());                                      \
+                tr[2] = static_cast<type>(rhs.R_component_3());                                      \
+                tr[3] = static_cast<type>(rhs.R_component_4());                                      \
+                                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();                        \
+                                                                                                     \
+                tr *= mixam;                                                                         \
+                                                                                                     \
+                valarray<type>    tt(8);                                                             \
+                                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3];                                            \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2];                                            \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1];                                            \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0];                                            \
+                tt[4] = +e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3];                                            \
+                tt[5] = +e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2];                                            \
+                tt[6] = +e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1];                                            \
+                tt[7] = +e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0];                                            \
+                                                                                                     \
+                tr *= tr;                                                                            \
+                                                                                                     \
+                tt *= (mixam/tr.sum());                                                              \
+                                                                                                     \
+                a = tt[0];                                                                           \
+                b = tt[1];                                                                           \
+                c = tt[2];                                                                           \
+                d = tt[3];                                                                           \
+                e = tt[4];                                                                           \
+                f = tt[5];                                                                           \
+                g = tt[6];                                                                           \
+                h = tt[7];                                                                           \
+                                                                                                     \
+                return(*this);                                                                       \
+            }
+#else
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type)                                           \
+            octonion<type> &            operator /= (::boost::math::quaternion<type> const & rhs)    \
+            {                                                                                        \
+                using    ::std::valarray;                                                            \
+                                                                                                     \
+                valarray<type>    tr(4);                                                             \
+                                                                                                     \
+                tr[0] = static_cast<type>(rhs.R_component_1());                                      \
+                tr[1] = static_cast<type>(rhs.R_component_2());                                      \
+                tr[2] = static_cast<type>(rhs.R_component_3());                                      \
+                tr[3] = static_cast<type>(rhs.R_component_4());                                      \
+                                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();                        \
+                                                                                                     \
+                tr *= mixam;                                                                         \
+                                                                                                     \
+                valarray<type>    tt(8);                                                             \
+                                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3];                                            \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2];                                            \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1];                                            \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0];                                            \
+                tt[4] = +e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3];                                            \
+                tt[5] = +e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2];                                            \
+                tt[6] = +e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1];                                            \
+                tt[7] = +e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0];                                            \
+                                                                                                     \
+                tr *= tr;                                                                            \
+                                                                                                     \
+                tt *= (mixam/tr.sum());                                                              \
+                                                                                                     \
+                a = tt[0];                                                                           \
+                b = tt[1];                                                                           \
+                c = tt[2];                                                                           \
+                d = tt[3];                                                                           \
+                e = tt[4];                                                                           \
+                f = tt[5];                                                                           \
+                g = tt[6];                                                                           \
+                h = tt[7];                                                                           \
+                                                                                                     \
+                return(*this);                                                                       \
+            }
+#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+    
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type)                                           \
+            template<typename X>                                                                     \
+            octonion<type> &            operator /= (octonion<X> const & rhs)                        \
+            {                                                                                        \
+                using    ::std::valarray;                                                            \
+                using    ::std::abs;                                                                 \
+                                                                                                     \
+                valarray<type>    tr(8);                                                             \
+                                                                                                     \
+                tr[0] = static_cast<type>(rhs.R_component_1());                                      \
+                tr[1] = static_cast<type>(rhs.R_component_2());                                      \
+                tr[2] = static_cast<type>(rhs.R_component_3());                                      \
+                tr[3] = static_cast<type>(rhs.R_component_4());                                      \
+                tr[4] = static_cast<type>(rhs.R_component_5());                                      \
+                tr[5] = static_cast<type>(rhs.R_component_6());                                      \
+                tr[6] = static_cast<type>(rhs.R_component_7());                                      \
+                tr[7] = static_cast<type>(rhs.R_component_8());                                      \
+                                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();                        \
+                                                                                                     \
+                tr *= mixam;                                                                         \
+                                                                                                     \
+                valarray<type>    tt(8);                                                             \
+                                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]+e*tr[4]+f*tr[5]+g*tr[6]+h*tr[7];            \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]-e*tr[5]+f*tr[4]+g*tr[7]-h*tr[6];            \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]-e*tr[6]-f*tr[7]+g*tr[4]+h*tr[5];            \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]-e*tr[7]+f*tr[6]-g*tr[5]+h*tr[4];            \
+                tt[4] = -a*tr[4]+b*tr[5]+c*tr[6]+d*tr[7]+e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3];            \
+                tt[5] = -a*tr[5]-b*tr[4]+c*tr[7]-d*tr[6]+e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2];            \
+                tt[6] = -a*tr[6]-b*tr[7]-c*tr[4]+d*tr[5]+e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1];            \
+                tt[7] = -a*tr[7]+b*tr[6]-c*tr[5]-d*tr[4]+e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0];            \
+                                                                                                     \
+                tr *= tr;                                                                            \
+                                                                                                     \
+                tt *= (mixam/tr.sum());                                                              \
+                                                                                                     \
+                a = tt[0];                                                                           \
+                b = tt[1];                                                                           \
+                c = tt[2];                                                                           \
+                d = tt[3];                                                                           \
+                e = tt[4];                                                                           \
+                f = tt[5];                                                                           \
+                g = tt[6];                                                                           \
+                h = tt[7];                                                                           \
+                                                                                                     \
+                return(*this);                                                                       \
+            }
+#else
+    #define    BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type)                                           \
+            template<typename X>                                                                     \
+            octonion<type> &            operator /= (octonion<X> const & rhs)                        \
+            {                                                                                        \
+                using    ::std::valarray;                                                            \
+                                                                                                     \
+                valarray<type>    tr(8);                                                             \
+                                                                                                     \
+                tr[0] = static_cast<type>(rhs.R_component_1());                                      \
+                tr[1] = static_cast<type>(rhs.R_component_2());                                      \
+                tr[2] = static_cast<type>(rhs.R_component_3());                                      \
+                tr[3] = static_cast<type>(rhs.R_component_4());                                      \
+                tr[4] = static_cast<type>(rhs.R_component_5());                                      \
+                tr[5] = static_cast<type>(rhs.R_component_6());                                      \
+                tr[6] = static_cast<type>(rhs.R_component_7());                                      \
+                tr[7] = static_cast<type>(rhs.R_component_8());                                      \
+                                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();                        \
+                                                                                                     \
+                tr *= mixam;                                                                         \
+                                                                                                     \
+                valarray<type>    tt(8);                                                             \
+                                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]+e*tr[4]+f*tr[5]+g*tr[6]+h*tr[7];            \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]-e*tr[5]+f*tr[4]+g*tr[7]-h*tr[6];            \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]-e*tr[6]-f*tr[7]+g*tr[4]+h*tr[5];            \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]-e*tr[7]+f*tr[6]-g*tr[5]+h*tr[4];            \
+                tt[4] = -a*tr[4]+b*tr[5]+c*tr[6]+d*tr[7]+e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3];            \
+                tt[5] = -a*tr[5]-b*tr[4]+c*tr[7]-d*tr[6]+e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2];            \
+                tt[6] = -a*tr[6]-b*tr[7]-c*tr[4]+d*tr[5]+e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1];            \
+                tt[7] = -a*tr[7]+b*tr[6]-c*tr[5]-d*tr[4]+e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0];            \
+                                                                                                     \
+                tr *= tr;                                                                            \
+                                                                                                     \
+                tt *= (mixam/tr.sum());                                                              \
+                                                                                                     \
+                a = tt[0];                                                                           \
+                b = tt[1];                                                                           \
+                c = tt[2];                                                                           \
+                d = tt[3];                                                                           \
+                e = tt[4];                                                                           \
+                f = tt[5];                                                                           \
+                g = tt[6];                                                                           \
+                h = tt[7];                                                                           \
+                                                                                                     \
+                return(*this);                                                                       \
+            }
+#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+    
+    
+#define    BOOST_OCTONION_MEMBER_ADD_GENERATOR(type)       \
+        BOOST_OCTONION_MEMBER_ADD_GENERATOR_1(type)        \
+        BOOST_OCTONION_MEMBER_ADD_GENERATOR_2(type)        \
+        BOOST_OCTONION_MEMBER_ADD_GENERATOR_3(type)        \
+        BOOST_OCTONION_MEMBER_ADD_GENERATOR_4(type)
+        
+#define    BOOST_OCTONION_MEMBER_SUB_GENERATOR(type)       \
+        BOOST_OCTONION_MEMBER_SUB_GENERATOR_1(type)        \
+        BOOST_OCTONION_MEMBER_SUB_GENERATOR_2(type)        \
+        BOOST_OCTONION_MEMBER_SUB_GENERATOR_3(type)        \
+        BOOST_OCTONION_MEMBER_SUB_GENERATOR_4(type)
+        
+#define    BOOST_OCTONION_MEMBER_MUL_GENERATOR(type)       \
+        BOOST_OCTONION_MEMBER_MUL_GENERATOR_1(type)        \
+        BOOST_OCTONION_MEMBER_MUL_GENERATOR_2(type)        \
+        BOOST_OCTONION_MEMBER_MUL_GENERATOR_3(type)        \
+        BOOST_OCTONION_MEMBER_MUL_GENERATOR_4(type)
+        
+#define    BOOST_OCTONION_MEMBER_DIV_GENERATOR(type)       \
+        BOOST_OCTONION_MEMBER_DIV_GENERATOR_1(type)        \
+        BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type)        \
+        BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type)        \
+        BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type)
+        
+#define    BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(type) \
+        BOOST_OCTONION_MEMBER_ADD_GENERATOR(type)          \
+        BOOST_OCTONION_MEMBER_SUB_GENERATOR(type)          \
+        BOOST_OCTONION_MEMBER_MUL_GENERATOR(type)          \
+        BOOST_OCTONION_MEMBER_DIV_GENERATOR(type)
+        
+        
+        template<>
+        class octonion<float>
+        {
+        public:
+            
+            typedef float value_type;
+            
+            BOOST_OCTONION_CONSTRUCTOR_GENERATOR(float)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // explicit copy constructors (precision-loosing converters)
+            
+            explicit                    octonion(octonion<double> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<float, double>(a_recopier);
+            }
+            
+            explicit                    octonion(octonion<long double> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<float, long double>(a_recopier);
+            }
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, octonions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is an octonion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_OCTONION_ACCESSOR_GENERATOR(float)
+            
+            // assignment operators
+            
+            BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(float)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Octonion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);";
+            //            octonion multiplication is also *NOT* associative
+            
+            BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(float)
+            
+            
+        protected:
+            
+            BOOST_OCTONION_MEMBER_DATA_GENERATOR(float)
+            
+            
+        private:
+            
+        };
+        
+        
+        template<>
+        class octonion<double>
+        {
+        public:
+            
+            typedef double value_type;
+            
+            BOOST_OCTONION_CONSTRUCTOR_GENERATOR(double)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // converting copy constructor
+            
+            explicit                    octonion(octonion<float> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<double, float>(a_recopier);
+            }
+            
+            // explicit copy constructors (precision-loosing converters)
+            
+            explicit                    octonion(octonion<long double> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<double, long double>(a_recopier);
+            }
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, octonions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is an octonion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_OCTONION_ACCESSOR_GENERATOR(double)
+            
+            // assignment operators
+            
+            BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(double)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Octonion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);";
+            //            octonion multiplication is also *NOT* associative
+            
+            BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(double)
+            
+            
+        protected:
+            
+            BOOST_OCTONION_MEMBER_DATA_GENERATOR(double)
+            
+            
+        private:
+            
+        };
+        
+        
+        template<>
+        class octonion<long double>
+        {
+        public:
+            
+            typedef long double value_type;
+            
+            BOOST_OCTONION_CONSTRUCTOR_GENERATOR(long double)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // converting copy constructor
+            
+            explicit                            octonion(octonion<float> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<long double, float>(a_recopier);
+            }
+            
+            
+            explicit                            octonion(octonion<double> const & a_recopier)
+            {
+                *this = detail::octonion_type_converter<long double, double>(a_recopier);
+            }
+            
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, octonions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is an octonion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_OCTONION_ACCESSOR_GENERATOR(long double)
+            
+            // assignment operators
+            
+            BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(long double)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Octonion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);";
+            //            octonion multiplication is also *NOT* associative
+            
+            BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(long double)
+            
+            
+        protected:
+            
+            BOOST_OCTONION_MEMBER_DATA_GENERATOR(long double)
+            
+            
+        private:
+            
+        };
+        
+        
+#undef    BOOST_OCTONION_CONSTRUCTOR_GENERATOR
+        
+#undef    BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR
+    
+#undef    BOOST_OCTONION_MEMBER_ADD_GENERATOR
+#undef    BOOST_OCTONION_MEMBER_SUB_GENERATOR
+#undef    BOOST_OCTONION_MEMBER_MUL_GENERATOR
+#undef    BOOST_OCTONION_MEMBER_DIV_GENERATOR
+    
+#undef    BOOST_OCTONION_MEMBER_ADD_GENERATOR_1
+#undef    BOOST_OCTONION_MEMBER_ADD_GENERATOR_2
+#undef    BOOST_OCTONION_MEMBER_ADD_GENERATOR_3
+#undef    BOOST_OCTONION_MEMBER_ADD_GENERATOR_4
+#undef    BOOST_OCTONION_MEMBER_SUB_GENERATOR_1
+#undef    BOOST_OCTONION_MEMBER_SUB_GENERATOR_2
+#undef    BOOST_OCTONION_MEMBER_SUB_GENERATOR_3
+#undef    BOOST_OCTONION_MEMBER_SUB_GENERATOR_4
+#undef    BOOST_OCTONION_MEMBER_MUL_GENERATOR_1
+#undef    BOOST_OCTONION_MEMBER_MUL_GENERATOR_2
+#undef    BOOST_OCTONION_MEMBER_MUL_GENERATOR_3
+#undef    BOOST_OCTONION_MEMBER_MUL_GENERATOR_4
+#undef    BOOST_OCTONION_MEMBER_DIV_GENERATOR_1
+#undef    BOOST_OCTONION_MEMBER_DIV_GENERATOR_2
+#undef    BOOST_OCTONION_MEMBER_DIV_GENERATOR_3
+#undef    BOOST_OCTONION_MEMBER_DIV_GENERATOR_4
+    
+    
+#undef    BOOST_OCTONION_MEMBER_DATA_GENERATOR
+    
+#undef    BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR
+    
+#undef    BOOST_OCTONION_ACCESSOR_GENERATOR
+        
+        
+        // operators
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op) \
+        {                                             \
+            octonion<T>    res(lhs);                  \
+            res op##= rhs;                            \
+            return(res);                              \
+        }
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_1_L(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (T const & lhs, octonion<T> const & rhs)                            \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_1_R(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (octonion<T> const & lhs, T const & rhs)                            \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_2_L(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (::std::complex<T> const & lhs, octonion<T> const & rhs)            \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_2_R(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (octonion<T> const & lhs, ::std::complex<T> const & rhs)            \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_3_L(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs) \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_3_R(op)                                                                              \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs) \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR_4(op)                                                                                \
+        template<typename T>                                                                                                      \
+        inline octonion<T>                        operator op (octonion<T> const & lhs, octonion<T> const & rhs)                  \
+        BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_OCTONION_OPERATOR_GENERATOR(op)     \
+        BOOST_OCTONION_OPERATOR_GENERATOR_1_L(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_1_R(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_2_L(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_2_R(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_3_L(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_3_R(op)    \
+        BOOST_OCTONION_OPERATOR_GENERATOR_4(op)
+        
+        
+        BOOST_OCTONION_OPERATOR_GENERATOR(+)
+        BOOST_OCTONION_OPERATOR_GENERATOR(-)
+        BOOST_OCTONION_OPERATOR_GENERATOR(*)
+        BOOST_OCTONION_OPERATOR_GENERATOR(/)
+        
+        
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR
+        
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_1_L
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_1_R
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_2_L
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_2_R
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_3_L
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_3_R
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_4
+    
+#undef    BOOST_OCTONION_OPERATOR_GENERATOR_BODY
+        
+        
+        template<typename T>
+        inline octonion<T>                        operator + (octonion<T> const & o)
+        {
+            return(o);
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        operator - (octonion<T> const & o)
+        {
+            return(octonion<T>(-o.R_component_1(),-o.R_component_2(),-o.R_component_3(),-o.R_component_4(),-o.R_component_5(),-o.R_component_6(),-o.R_component_7(),-o.R_component_8()));
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (T const & lhs, octonion<T> const & rhs)
+        {
+            return(
+                        (rhs.R_component_1() == lhs)&&
+                        (rhs.R_component_2() == static_cast<T>(0))&&
+                        (rhs.R_component_3() == static_cast<T>(0))&&
+                        (rhs.R_component_4() == static_cast<T>(0))&&
+                        (rhs.R_component_5() == static_cast<T>(0))&&
+                        (rhs.R_component_6() == static_cast<T>(0))&&
+                        (rhs.R_component_7() == static_cast<T>(0))&&
+                        (rhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (octonion<T> const & lhs, T const & rhs)
+        {
+            return(
+                        (lhs.R_component_1() == rhs)&&
+                        (lhs.R_component_2() == static_cast<T>(0))&&
+                        (lhs.R_component_3() == static_cast<T>(0))&&
+                        (lhs.R_component_4() == static_cast<T>(0))&&
+                        (lhs.R_component_5() == static_cast<T>(0))&&
+                        (lhs.R_component_6() == static_cast<T>(0))&&
+                        (lhs.R_component_7() == static_cast<T>(0))&&
+                        (lhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (::std::complex<T> const & lhs, octonion<T> const & rhs)
+        {
+            return(
+                        (rhs.R_component_1() == lhs.real())&&
+                        (rhs.R_component_2() == lhs.imag())&&
+                        (rhs.R_component_3() == static_cast<T>(0))&&
+                        (rhs.R_component_4() == static_cast<T>(0))&&
+                        (rhs.R_component_5() == static_cast<T>(0))&&
+                        (rhs.R_component_6() == static_cast<T>(0))&&
+                        (rhs.R_component_7() == static_cast<T>(0))&&
+                        (rhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (octonion<T> const & lhs, ::std::complex<T> const & rhs)
+        {
+            return(
+                        (lhs.R_component_1() == rhs.real())&&
+                        (lhs.R_component_2() == rhs.imag())&&
+                        (lhs.R_component_3() == static_cast<T>(0))&&
+                        (lhs.R_component_4() == static_cast<T>(0))&&
+                        (lhs.R_component_5() == static_cast<T>(0))&&
+                        (lhs.R_component_6() == static_cast<T>(0))&&
+                        (lhs.R_component_7() == static_cast<T>(0))&&
+                        (lhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs)
+        {
+            return(
+                        (rhs.R_component_1() == lhs.R_component_1())&&
+                        (rhs.R_component_2() == lhs.R_component_2())&&
+                        (rhs.R_component_3() == lhs.R_component_3())&&
+                        (rhs.R_component_4() == lhs.R_component_4())&&
+                        (rhs.R_component_5() == static_cast<T>(0))&&
+                        (rhs.R_component_6() == static_cast<T>(0))&&
+                        (rhs.R_component_7() == static_cast<T>(0))&&
+                        (rhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs)
+        {
+            return(
+                        (lhs.R_component_1() == rhs.R_component_1())&&
+                        (lhs.R_component_2() == rhs.R_component_2())&&
+                        (lhs.R_component_3() == rhs.R_component_3())&&
+                        (lhs.R_component_4() == rhs.R_component_4())&&
+                        (lhs.R_component_5() == static_cast<T>(0))&&
+                        (lhs.R_component_6() == static_cast<T>(0))&&
+                        (lhs.R_component_7() == static_cast<T>(0))&&
+                        (lhs.R_component_8() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (octonion<T> const & lhs, octonion<T> const & rhs)
+        {
+            return(
+                        (rhs.R_component_1() == lhs.R_component_1())&&
+                        (rhs.R_component_2() == lhs.R_component_2())&&
+                        (rhs.R_component_3() == lhs.R_component_3())&&
+                        (rhs.R_component_4() == lhs.R_component_4())&&
+                        (rhs.R_component_5() == lhs.R_component_5())&&
+                        (rhs.R_component_6() == lhs.R_component_6())&&
+                        (rhs.R_component_7() == lhs.R_component_7())&&
+                        (rhs.R_component_8() == lhs.R_component_8())
+                    );
+        }
+        
+        
+#define    BOOST_OCTONION_NOT_EQUAL_GENERATOR \
+        {                                     \
+            return(!(lhs == rhs));            \
+        }
+        
+        template<typename T>
+        inline bool                                operator != (T const & lhs, octonion<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (octonion<T> const & lhs, T const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (::std::complex<T> const & lhs, octonion<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (octonion<T> const & lhs, ::std::complex<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (octonion<T> const & lhs, octonion<T> const & rhs)
+        BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+    #undef    BOOST_OCTONION_NOT_EQUAL_GENERATOR
+        
+        
+        // Note:    the default values in the constructors of the complex and quaternions make for
+        //            a very complex and ambiguous situation; we have made choices to disambiguate.
+        template<typename T, typename charT, class traits>
+        ::std::basic_istream<charT,traits> &    operator >> (    ::std::basic_istream<charT,traits> & is,
+                                                                octonion<T> & o)
+        {
+#ifdef     BOOST_NO_STD_LOCALE
+#else
+            const ::std::ctype<charT> & ct = ::std::use_facet< ::std::ctype<charT> >(is.getloc());
+#endif /* BOOST_NO_STD_LOCALE */
+            
+            T    a = T();
+            T    b = T();
+            T    c = T();
+            T    d = T();
+            T    e = T();
+            T    f = T();
+            T    g = T();
+            T    h = T();
+            
+            ::std::complex<T>    u = ::std::complex<T>();
+            ::std::complex<T>    v = ::std::complex<T>();
+            ::std::complex<T>    x = ::std::complex<T>();
+            ::std::complex<T>    y = ::std::complex<T>();
+            
+            ::boost::math::quaternion<T>    p = ::boost::math::quaternion<T>();
+            ::boost::math::quaternion<T>    q = ::boost::math::quaternion<T>();
+            
+            charT    ch = charT();
+            char    cc;
+            
+            is >> ch;                                        // get the first lexeme
+            
+            if    (!is.good())    goto finish;
+            
+#ifdef    BOOST_NO_STD_LOCALE
+            cc = ch;
+#else
+            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+            
+            if    (cc == '(')                            // read "("
+            {
+                is >> ch;                                    // get the second lexeme
+                
+                if    (!is.good())    goto finish;
+                
+#ifdef    BOOST_NO_STD_LOCALE
+                cc = ch;
+#else
+                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                
+                if    (cc == '(')                                // read "(("
+                {
+                    is >> ch;                                    // get the third lexeme
+                    
+                    if    (!is.good())    goto finish;
+                    
+#ifdef    BOOST_NO_STD_LOCALE
+                    cc = ch;
+#else
+                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                    if    (cc == '(')                                // read "((("
+                    {
+                        is.putback(ch);
+                        
+                        is >> u;                                // read "((u"
+                        
+                        if    (!is.good())    goto finish;
+                        
+                        is >> ch;                                // get the next lexeme
+                        
+                        if    (!is.good())    goto finish;
+                        
+#ifdef    BOOST_NO_STD_LOCALE
+                        cc = ch;
+#else
+                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                        if        (cc == ')')                        // read "((u)"
+                        {
+                            is >> ch;                                // get the next lexeme
+                            
+                            if    (!is.good())    goto finish;
+                            
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == ')')                        // format: (((a))), (((a,b)))
+                            {
+                                o = octonion<T>(u);
+                            }
+                            else if    (cc == ',')                        // read "((u),"
+                            {
+                                p = ::boost::math::quaternion<T>(u);
+                                
+                                is >> q;                                // read "((u),q"
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                                // get the next lexeme
+                                
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                        // format: (((a)),q), (((a,b)),q)
+                                {
+                                    o = octonion<T>(p,q);
+                                }
+                                else                                    // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                            else                                    // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                        else if    (cc ==',')                        // read "((u,"
+                        {
+                            is >> v;                                // read "((u,v"
+                            
+                            if    (!is.good())    goto finish;
+                            
+                            is >> ch;                                // get the next lexeme
+                            
+                            if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == ')')                        // read "((u,v)"
+                            {
+                                p = ::boost::math::quaternion<T>(u,v);
+                                
+                                is >> ch;                                // get the next lexeme
+                                
+                                if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                        // format: (((a),v)), (((a,b),v))
+                                {
+                                    o = octonion<T>(p);
+                                }
+                                else if    (cc == ',')                        // read "((u,v),"
+                                {
+                                    is >> q;                                // read "(p,q"
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                                // get the next lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                        // format: (((a),v),q), (((a,b),v),q)
+                                    {
+                                        o = octonion<T>(p,q);
+                                    }
+                                    else                                    // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else                                    // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                            else                                    // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                        else                                    // error
+                        {
+                            is.setstate(::std::ios_base::failbit);
+                        }
+                    }
+                    else                                        // read "((a"
+                    {
+                        is.putback(ch);
+                        
+                        is >> a;                                    // we extract the first component
+                        
+                        if    (!is.good())    goto finish;
+                        
+                        is >> ch;                                    // get the next lexeme
+                        
+                        if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                        cc = ch;
+#else
+                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                        if        (cc == ')')                            // read "((a)"
+                        {
+                            is >> ch;                                    // get the next lexeme
+                            
+                            if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == ')')                            // read "((a))"
+                            {
+                                o = octonion<T>(a);
+                            }
+                            else if    (cc == ',')                            // read "((a),"
+                            {
+                                is >> ch;                                    // get the next lexeme
+                                
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == '(')                            // read "((a),("
+                                {
+                                    is >> ch;                                    // get the next lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == '(')                            // read "((a),(("
+                                    {
+                                        is.putback(ch);
+                                        
+                                        is.putback(ch);                                // we backtrack twice, with the same value!
+                                        
+                                        is >> q;                                    // read "((a),q"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                        
+                                        if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a),q)"
+                                        {
+                                            p = ::boost::math::quaternion<T>(a);
+                                            
+                                            o = octonion<T>(p,q);
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // read "((a),(c" or "((a),(e"
+                                    {
+                                        is.putback(ch);
+                                        
+                                        is >> c;
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a),(c)" (ambiguity resolution)
+                                        {
+                                            is >> ch;                                    // get the next lexeme
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                        // read "((a),(c))"
+                                            {
+                                                o = octonion<T>(a,b,c);
+                                            }
+                                            else if    (cc == ',')                        // read "((a),(c),"
+                                            {
+                                                u = ::std::complex<T>(a);
+                                                
+                                                v = ::std::complex<T>(c);
+                                                
+                                                is >> x;                            // read "((a),(c),x"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                // get the next lexeme
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                        // read "((a),(c),x)"
+                                                {
+                                                    o = octonion<T>(u,v,x);
+                                                }
+                                                else if    (cc == ',')                        // read "((a),(c),x,"
+                                                {
+                                                    is >> y;                                // read "((a),(c),x,y"
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+                                                    is >> ch;                                // get the next lexeme
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                        // read "((a),(c),x,y)"
+                                                    {
+                                                        o = octonion<T>(u,v,x,y);
+                                                    }
+                                                    else                                    // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                    // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                    // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else if    (cc == ',')                            // read "((a),(c," or "((a),(e,"
+                                        {
+                                            is >> ch;                                // get the next lexeme
+                                            
+                                            if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == '(')                        // read "((a),(e,(" (ambiguity resolution)
+                                            {
+                                                p = ::boost::math::quaternion<T>(a);
+                                                
+                                                x = ::std::complex<T>(c);                // "c" was actually "e"
+                                                
+                                                is.putback(ch);                            // we can only backtrace once
+                                                
+                                                is >> y;                                // read "((a),(e,y"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                // get the next lexeme
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                        // read "((a),(e,y)"
+                                                {
+                                                    q = ::boost::math::quaternion<T>(x,y);
+                                                    
+                                                    is >> ch;                                // get the next lexeme
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                        // read "((a),(e,y))"
+                                                    {
+                                                        o = octonion<T>(p,q);
+                                                    }
+                                                    else                                    // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                    // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                    // read "((a),(c,d" or "((a),(e,f"
+                                            {
+                                                is.putback(ch);
+                                                
+                                                is >> d;
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                // get the next lexeme
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                        // read "((a),(c,d)" (ambiguity resolution)
+                                                {
+                                                    is >> ch;                                // get the next lexeme
+                                                    
+                                                    if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                        // read "((a),(c,d))"
+                                                    {
+                                                        o = octonion<T>(a,b,c,d);
+                                                    }
+                                                    else if    (cc == ',')                        // read "((a),(c,d),"
+                                                    {
+                                                        u = ::std::complex<T>(a);
+                                                        
+                                                        v = ::std::complex<T>(c,d);
+                                                        
+                                                        is >> x;                                // read "((a),(c,d),x"
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                        // read "((a),(c,d),x)"
+                                                        {
+                                                            o = octonion<T>(u,v,x);
+                                                        }
+                                                        else if    (cc == ',')                        // read "((a),(c,d),x,"
+                                                        {
+                                                            is >> y;                                // read "((a),(c,d),x,y"
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+                                                            is >> ch;                                // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                        // read "((a),(c,d),x,y)"
+                                                            {
+                                                                o = octonion<T>(u,v,x,y);
+                                                            }
+                                                            else                                    // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                    // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else                                    // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else if    (cc == ',')                        // read "((a),(e,f," (ambiguity resolution)
+                                                {
+                                                    p = ::boost::math::quaternion<T>(a);
+                                                    
+                                                    is >> g;                                // read "((a),(e,f,g" (too late to backtrack)
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+                                                    is >> ch;                                // get the next lexeme
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                        // read "((a),(e,f,g)"
+                                                    {
+                                                        q = ::boost::math::quaternion<T>(c,d,g);        // "c" was actually "e", and "d" was actually "f"
+                                                        
+                                                        is >> ch;                                // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                        // read "((a),(e,f,g))"
+                                                        {
+                                                            o = octonion<T>(p,q);
+                                                        }
+                                                        else                                    // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else if    (cc == ',')                        // read "((a),(e,f,g,"
+                                                    {
+                                                        is >> h;                                // read "((a),(e,f,g,h"
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                        // read "((a),(e,f,g,h)"
+                                                        {
+                                                            q = ::boost::math::quaternion<T>(c,d,g,h);    // "c" was actually "e", and "d" was actually "f"
+                                                            
+                                                            is >> ch;                                // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                        // read "((a),(e,f,g,h))"
+                                                            {
+                                                                o = octonion<T>(p,q);
+                                                            }
+                                                            else                                    // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                    // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else                                    // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                    // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                }
+                                else                                        // read "((a),c" (ambiguity resolution)
+                                {
+                                    is.putback(ch);
+                                    
+                                    is >> c;                                    // we extract the third component
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                                    // get the next lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "((a),c)"
+                                    {
+                                        o = octonion<T>(a,b,c);
+                                    }
+                                    else if    (cc == ',')                            // read "((a),c,"
+                                    {
+                                        is >> x;                                    // read "((a),c,x"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a),c,x)"
+                                        {
+                                            o = octonion<T>(a,b,c,d,x.real(),x.imag());
+                                        }
+                                        else if    (cc == ',')                            // read "((a),c,x,"
+                                        {
+                                            is >> y;if    (!is.good())    goto finish;        // read "((a),c,x,y"
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "((a),c,x,y)"
+                                            {
+                                                o = octonion<T>(a,b,c,d,x.real(),x.imag(),y.real(),y.imag());
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                            }
+                            else                                        // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                        else if    (cc ==',')                            // read "((a,"
+                        {
+                            is >> ch;                                    // get the next lexeme
+                            
+                            if    (!is.good())    goto finish;
+                            
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == '(')                            // read "((a,("
+                            {
+                                u = ::std::complex<T>(a);
+                                
+                                is.putback(ch);                                // can only backtrack so much
+                                
+                                is >> v;                                    // read "((a,v"
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                                    // get the next lexeme
+                                
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                            // read "((a,v)"
+                                {
+                                    is >> ch;                                    // get the next lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "((a,v))"
+                                    {
+                                        o = octonion<T>(u,v);
+                                    }
+                                    else if    (cc == ',')                            // read "((a,v),"
+                                    {
+                                        p = ::boost::math::quaternion<T>(u,v);
+                                        
+                                        is >> q;                                    // read "((a,v),q"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a,v),q)"
+                                        {
+                                            o = octonion<T>(p,q);
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else                                        // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                            else
+                            {
+                                is.putback(ch);
+                                
+                                is >> b;                                    // read "((a,b"
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                                    // get the next lexeme
+                                
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                            // read "((a,b)"
+                                {
+                                    is >> ch;                                    // get the next lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "((a,b))"
+                                    {
+                                        o = octonion<T>(a,b);
+                                    }
+                                    else if    (cc == ',')                            // read "((a,b),"
+                                    {
+                                        is >> ch;                                    // get the next lexeme
+                                        
+                                        if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == '(')                            // read "((a,b),("
+                                        {
+                                            is >> ch;                                    // get the next lexeme
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == '(')                            // read "((a,b),(("
+                                            {
+                                                p = ::boost::math::quaternion<T>(a,b);
+                                                
+                                                is.putback(ch);
+                                                
+                                                is.putback(ch);                            // we backtrack twice, with the same value
+                                                
+                                                is >> q;                                // read "((a,b),q"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "((a,b),q)"
+                                                {
+                                                    o = octonion<T>(p,q);
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                        // read "((a,b),(c" or "((a,b),(e"
+                                            {
+                                                is.putback(ch);
+                                                
+                                                is >> c;
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "((a,b),(c)" (ambiguity resolution)
+                                                {
+                                                    is >> ch;                                    // get the next lexeme
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                            // read "((a,b),(c))"
+                                                    {
+                                                        o = octonion<T>(a,b,c);
+                                                    }
+                                                    else if    (cc == ',')                            // read "((a,b),(c),"
+                                                    {
+                                                        u = ::std::complex<T>(a,b);
+                                                        
+                                                        v = ::std::complex<T>(c);
+                                                        
+                                                        is >> x;                                    // read "((a,b),(c),x"
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                    // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                            // read "((a,b),(c),x)"
+                                                        {
+                                                            o = octonion<T>(u,v,x);
+                                                        }
+                                                        else if    (cc == ',')                            // read "((a,b),(c),x,"
+                                                        {
+                                                            is >> y;                                    // read "((a,b),(c),x,y"
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+                                                            is >> ch;                                    // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                            // read "((a,b),(c),x,y)"
+                                                            {
+                                                                o = octonion<T>(u,v,x,y);
+                                                            }
+                                                            else                                        // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                        // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else                                        // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else if    (cc == ',')                            // read "((a,b),(c," or "((a,b),(e,"
+                                                {
+                                                    is >> ch;                                    // get the next lexeme
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == '(')                            // read "((a,b),(e,(" (ambiguity resolution)
+                                                    {
+                                                        u = ::std::complex<T>(a,b);
+                                                        
+                                                        x = ::std::complex<T>(c);                    // "c" is actually "e"
+                                                        
+                                                        is.putback(ch);
+                                                        
+                                                        is >> y;                                    // read "((a,b),(e,y"
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                    // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                            // read "((a,b),(e,y)"
+                                                        {
+                                                            is >> ch;                                    // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                            // read "((a,b),(e,y))"
+                                                            {
+                                                                o = octonion<T>(u,v,x,y);
+                                                            }
+                                                            else                                        // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                        // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else                                        // read "((a,b),(c,d" or "((a,b),(e,f"
+                                                    {
+                                                        is.putback(ch);
+                                                        
+                                                        is >> d;
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                    // get the next lexeme
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                            // read "((a,b),(c,d)" (ambiguity resolution)
+                                                        {
+                                                            u = ::std::complex<T>(a,b);
+                                                            
+                                                            v = ::std::complex<T>(c,d);
+                                                            
+                                                            is >> ch;                                    // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                            // read "((a,b),(c,d))"
+                                                            {
+                                                                o = octonion<T>(u,v);
+                                                            }
+                                                            else if    (cc == ',')                            // read "((a,b),(c,d),"
+                                                            {
+                                                                is >> x;                                    // read "((a,b),(c,d),x
+                                                                
+                                                                if    (!is.good())    goto finish;
+                                                                
+                                                                is >> ch;                                    // get the next lexeme
+                                                                
+                                                                if    (!is.good())    goto finish;
+                                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                                cc = ch;
+#else
+                                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                                
+                                                                if        (cc == ')')                            // read "((a,b),(c,d),x)"
+                                                                {
+                                                                    o = octonion<T>(u,v,x);
+                                                                }
+                                                                else if    (cc == ',')                            // read "((a,b),(c,d),x,"
+                                                                {
+                                                                    is >> y;                                    // read "((a,b),(c,d),x,y"
+                                                                    
+                                                                    if    (!is.good())    goto finish;
+                                                                    
+                                                                    is >> ch;                                    // get the next lexeme
+                                                                    
+                                                                    if    (!is.good())    goto finish;
+                                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                                    cc = ch;
+#else
+                                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                                    
+                                                                    if        (cc == ')')                            // read "((a,b),(c,d),x,y)"
+                                                                    {
+                                                                        o = octonion<T>(u,v,x,y);
+                                                                    }
+                                                                    else                                        // error
+                                                                    {
+                                                                        is.setstate(::std::ios_base::failbit);
+                                                                    }
+                                                                }
+                                                                else                                        // error
+                                                                {
+                                                                    is.setstate(::std::ios_base::failbit);
+                                                                }
+                                                            }
+                                                            else                                        // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else if    (cc == ',')                            // read "((a,b),(e,f," (ambiguity resolution)
+                                                        {
+                                                            p = ::boost::math::quaternion<T>(a,b);                // too late to backtrack
+                                                            
+                                                            is >> g;                                    // read "((a,b),(e,f,g"
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+                                                            is >> ch;                                    // get the next lexeme
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                            // read "((a,b),(e,f,g)"
+                                                            {
+                                                                is >> ch;                                    // get the next lexeme
+                                                                
+                                                                if    (!is.good())    goto finish;
+                                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                                cc = ch;
+#else
+                                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                                
+                                                                if        (cc == ')')                            // read "((a,b),(e,f,g))"
+                                                                {
+                                                                    q = ::boost::math::quaternion<T>(c,d,g);            // "c" is actually "e" and "d" is actually "f"
+                                                                    
+                                                                    o = octonion<T>(p,q);
+                                                                }
+                                                                else                                        // error
+                                                                {
+                                                                    is.setstate(::std::ios_base::failbit);
+                                                                }
+                                                            }
+                                                            else if    (cc == ',')                            // read "((a,b),(e,f,g,"
+                                                            {
+                                                                is >> h;                                    // read "((a,b),(e,f,g,h"
+                                                                
+                                                                if    (!is.good())    goto finish;
+                                                                
+                                                                is >> ch;                                    // get the next lexeme
+                                                                
+                                                                if    (!is.good())    goto finish;
+                                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                                cc = ch;
+#else
+                                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                                
+                                                                if        (cc == ')')                            // read "((a,b),(e,f,g,h)"
+                                                                {
+                                                                    is >> ch;                                    // get the next lexeme
+                                                                    
+                                                                    if    (!is.good())    goto finish;
+                                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                                    cc = ch;
+#else
+                                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                                    
+                                                                    if        (cc == ')')                            // read ((a,b),(e,f,g,h))"
+                                                                    {
+                                                                        q = ::boost::math::quaternion<T>(c,d,g,h);            // "c" is actually "e" and "d" is actually "f"
+                                                                        
+                                                                        o = octonion<T>(p,q);
+                                                                    }
+                                                                    else                                        // error
+                                                                    {
+                                                                        is.setstate(::std::ios_base::failbit);
+                                                                    }
+                                                                }
+                                                                else                                        // error
+                                                                {
+                                                                    is.setstate(::std::ios_base::failbit);
+                                                                }
+                                                            }
+                                                            else                                        // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                        // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else if    (cc == ',')                            // read "((a,b,"
+                                {
+                                    is >> c;                                    // read "((a,b,c"
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                                    // get the next lexeme
+                                                                
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "((a,b,c)"
+                                    {
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a,b,c))"
+                                        {
+                                            o = octonion<T>(a,b,c);
+                                        }
+                                        else if    (cc == ',')                            // read "((a,b,c),"
+                                        {
+                                            p = ::boost::math::quaternion<T>(a,b,c);
+                                            
+                                            is >> q;                                    // read "((a,b,c),q"
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "((a,b,c),q)"
+                                            {
+                                                o = octonion<T>(p,q);
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else if    (cc == ',')                            // read "((a,b,c,"
+                                    {
+                                        is >> d;                                    // read "((a,b,c,d"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "((a,b,c,d)"
+                                        {
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "((a,b,c,d))"
+                                            {
+                                                o = octonion<T>(a,b,c,d);
+                                            }
+                                            else if    (cc == ',')                            // read "((a,b,c,d),"
+                                            {
+                                                p = ::boost::math::quaternion<T>(a,b,c,d);
+                                                
+                                                is >> q;                                    // read "((a,b,c,d),q"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                                            
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "((a,b,c,d),q)"
+                                                {
+                                                    o = octonion<T>(p,q);
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else                                        // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                        }
+                        else                                        // error
+                        {
+                            is.setstate(::std::ios_base::failbit);
+                        }
+                    }
+                }
+                else                                        // read "(a"
+                {
+                    is.putback(ch);
+                    
+                    is >> a;                                    // we extract the first component
+                    
+                    if    (!is.good())    goto finish;
+                    
+                    is >> ch;                                    // get the next lexeme
+                                                
+                    if    (!is.good())    goto finish;
+                    
+#ifdef    BOOST_NO_STD_LOCALE
+                    cc = ch;
+#else
+                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                    
+                    if        (cc == ')')                            // read "(a)"
+                    {
+                        o = octonion<T>(a);
+                    }
+                    else if    (cc == ',')                            // read "(a,"
+                    {
+                        is >> ch;                                    // get the next lexeme
+                                                    
+                        if    (!is.good())    goto finish;
+                        
+#ifdef    BOOST_NO_STD_LOCALE
+                        cc = ch;
+#else
+                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                        if        (cc == '(')                            // read "(a,("
+                        {
+                            is >> ch;                                    // get the next lexeme
+                                                        
+                            if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == '(')                            // read "(a,(("
+                            {
+                                p = ::boost::math::quaternion<T>(a);
+                                
+                                is.putback(ch);
+                                
+                                is.putback(ch);                                // we backtrack twice, with the same value
+                                
+                                is >> q;                                    // read "(a,q"
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                                    // get the next lexeme
+                                                            
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                            // read "(a,q)"
+                                {
+                                    o = octonion<T>(p,q);
+                                }
+                                else                                        // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                            else                                        // read "(a,(c" or "(a,(e"
+                            {
+                                is.putback(ch);
+                                
+                                is >> c;
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                                    // get the next lexeme
+                                                            
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')                            // read "(a,(c)" (ambiguity resolution)
+                                {
+                                    is >> ch;                                    // get the next lexeme
+                                                                
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "(a,(c))"
+                                    {
+                                        o = octonion<T>(a,b,c);
+                                    }
+                                    else if    (cc == ',')                            // read "(a,(c),"
+                                    {
+                                        u = ::std::complex<T>(a);
+                                        
+                                        v = ::std::complex<T>(c);
+                                        
+                                        is >> x;                                // read "(a,(c),x"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "(a,(c),x)"
+                                        {
+                                            o = octonion<T>(u,v,x);
+                                        }
+                                        else if    (cc == ',')                            // read "(a,(c),x,"
+                                        {
+                                            is >> y;                                    // read "(a,(c),x,y"
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,(c),x,y)"
+                                            {
+                                                o = octonion<T>(u,v,x,y);
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else if    (cc == ',')                            // read "(a,(c," or "(a,(e,"
+                                {
+                                    is >> ch;                                    // get the next lexeme
+                                                                
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == '(')                            // read "(a,(e,(" (ambiguity resolution)
+                                    {
+                                        u = ::std::complex<T>(a);
+                                        
+                                        x = ::std::complex<T>(c);                // "c" is actually "e"
+                                        
+                                        is.putback(ch);                            // we backtrack
+                                        
+                                        is >> y;                                // read "(a,(e,y"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "(a,(e,y)"
+                                        {
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,(e,y))"
+                                            {
+                                                o = octonion<T>(u,v,x,y);
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // read "(a,(c,d" or "(a,(e,f"
+                                    {
+                                        is.putback(ch);
+                                        
+                                        is >> d;
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "(a,(c,d)" (ambiguity resolution)
+                                        {
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,(c,d))"
+                                            {
+                                                o = octonion<T>(a,b,c,d);
+                                            }
+                                            else if    (cc == ',')                            // read "(a,(c,d),"
+                                            {
+                                                u = ::std::complex<T>(a);
+                                                
+                                                v = ::std::complex<T>(c,d);
+                                                
+                                                is >> x;                                // read "(a,(c,d),x"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                                            
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "(a,(c,d),x)"
+                                                {
+                                                    o = octonion<T>(u,v,x);
+                                                }
+                                                else if    (cc == ',')                            // read "(a,(c,d),x,"
+                                                {
+                                                    is >> y;                                    // read "(a,(c,d),x,y"
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+                                                    is >> ch;                                    // get the next lexeme
+                                                                                
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                            // read "(a,(c,d),x,y)"
+                                                    {
+                                                        o = octonion<T>(u,v,x,y);
+                                                    }
+                                                    else                                        // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else if    (cc == ',')                            // read "(a,(e,f," (ambiguity resolution)
+                                        {
+                                            p = ::boost::math::quaternion<T>(a);
+                                            
+                                            is >> g;                                    // read "(a,(e,f,g"
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,(e,f,g)"
+                                            {
+                                                is >> ch;                                    // get the next lexeme
+                                                                            
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "(a,(e,f,g))"
+                                                {
+                                                    q = ::boost::math::quaternion<T>(c,d,g);            // "c" is actually "e" and "d" is actually "f"
+                                                    
+                                                    o = octonion<T>(p,q);
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else if    (cc == ',')                            // read "(a,(e,f,g,"
+                                            {
+                                                is >> h;                                    // read "(a,(e,f,g,h"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                                            
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "(a,(e,f,g,h)"
+                                                {
+                                                    is >> ch;                                    // get the next lexeme
+                                                                                
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                            // read "(a,(e,f,g,h))"
+                                                    {
+                                                        q = ::boost::math::quaternion<T>(c,d,g,h);            // "c" is actually "e" and "d" is actually "f"
+                                                        
+                                                        o = octonion<T>(p,q);
+                                                    }
+                                                    else                                        // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                }
+                                else                                        // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                        }
+                        else                                        // read "(a,b" or "(a,c" (ambiguity resolution)
+                        {
+                            is.putback(ch);
+                            
+                            is >> b;
+                            
+                            if    (!is.good())    goto finish;
+                            
+                            is >> ch;                                    // get the next lexeme
+                                                        
+                            if    (!is.good())    goto finish;
+                            
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if        (cc == ')')                            // read "(a,b)" (ambiguity resolution)
+                            {
+                                o = octonion<T>(a,b);
+                            }
+                            else if    (cc == ',')                            // read "(a,b," or "(a,c,"
+                            {
+                                is >> ch;                                    // get the next lexeme
+                                                            
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == '(')                            // read "(a,c,(" (ambiguity resolution)
+                                {
+                                    u = ::std::complex<T>(a);
+                                    
+                                    v = ::std::complex<T>(b);                    // "b" is actually "c"
+                                    
+                                    is.putback(ch);                                // we backtrack
+                                    
+                                    is >> x;                                    // read "(a,c,x"
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                                    // get the next lexeme
+                                                                
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "(a,c,x)"
+                                    {
+                                        o = octonion<T>(u,v,x);
+                                    }
+                                    else if    (cc == ',')                            // read "(a,c,x,"
+                                    {
+                                        is >> y;                                    // read "(a,c,x,y"                                    // read "(a,c,x"
+                                        
+                                        if    (!is.good())    goto finish;
+                                        
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == ')')                            // read "(a,c,x,y)"
+                                        {
+                                            o = octonion<T>(u,v,x,y);
+                                        }
+                                        else                                        // error
+                                        {
+                                            is.setstate(::std::ios_base::failbit);
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else                                        // read "(a,b,c" or "(a,c,e"
+                                {
+                                    is.putback(ch);
+                                    
+                                    is >> c;
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                                    // get the next lexeme
+                                                                
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if        (cc == ')')                            // read "(a,b,c)" (ambiguity resolution)
+                                    {
+                                        o = octonion<T>(a,b,c);
+                                    }
+                                    else if    (cc == ',')                            // read "(a,b,c," or "(a,c,e,"
+                                    {
+                                        is >> ch;                                    // get the next lexeme
+                                                                    
+                                        if    (!is.good())    goto finish;
+                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                        cc = ch;
+#else
+                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                        
+                                        if        (cc == '(')                            // read "(a,c,e,(") (ambiguity resolution)
+                                        {
+                                            u = ::std::complex<T>(a);
+                                            
+                                            v = ::std::complex<T>(b);                    // "b" is actually "c"
+                                            
+                                            x = ::std::complex<T>(c);                    // "c" is actually "e"
+                                            
+                                            is.putback(ch);                                // we backtrack
+                                            
+                                            is >> y;                                    // read "(a,c,e,y"
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,c,e,y)"
+                                            {
+                                                o = octonion<T>(u,v,x,y);
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                        else                                        // read "(a,b,c,d" (ambiguity resolution)
+                                        {
+                                            is.putback(ch);                                // we backtrack
+                                            
+                                            is >> d;
+                                            
+                                            if    (!is.good())    goto finish;
+                                            
+                                            is >> ch;                                    // get the next lexeme
+                                                                        
+                                            if    (!is.good())    goto finish;
+                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                            cc = ch;
+#else
+                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                            
+                                            if        (cc == ')')                            // read "(a,b,c,d)"
+                                            {
+                                                o = octonion<T>(a,b,c,d);
+                                            }
+                                            else if    (cc == ',')                            // read "(a,b,c,d,"
+                                            {
+                                                is >> e;                                    // read "(a,b,c,d,e"
+                                                
+                                                if    (!is.good())    goto finish;
+                                                
+                                                is >> ch;                                    // get the next lexeme
+                                                                            
+                                                if    (!is.good())    goto finish;
+                                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                                cc = ch;
+#else
+                                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                
+                                                if        (cc == ')')                            // read "(a,b,c,d,e)"
+                                                {
+                                                    o = octonion<T>(a,b,c,d,e);
+                                                }
+                                                else if    (cc == ',')                            // read "(a,b,c,d,e,"
+                                                {
+                                                    is >> f;                                    // read "(a,b,c,d,e,f"
+                                                    
+                                                    if    (!is.good())    goto finish;
+                                                    
+                                                    is >> ch;                                    // get the next lexeme
+                                                                                
+                                                    if    (!is.good())    goto finish;
+                                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                                    cc = ch;
+#else
+                                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                    
+                                                    if        (cc == ')')                            // read "(a,b,c,d,e,f)"
+                                                    {
+                                                        o = octonion<T>(a,b,c,d,e,f);
+                                                    }
+                                                    else if    (cc == ',')                            // read "(a,b,c,d,e,f,"
+                                                    {
+                                                        is >> g;                                    // read "(a,b,c,d,e,f,g"                                    // read "(a,b,c,d,e,f"
+                                                        
+                                                        if    (!is.good())    goto finish;
+                                                        
+                                                        is >> ch;                                    // get the next lexeme
+                                                                                    
+                                                        if    (!is.good())    goto finish;
+                                                        
+#ifdef    BOOST_NO_STD_LOCALE
+                                                        cc = ch;
+#else
+                                                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                        
+                                                        if        (cc == ')')                            // read "(a,b,c,d,e,f,g)"
+                                                        {
+                                                            o = octonion<T>(a,b,c,d,e,f,g);
+                                                        }
+                                                        else if    (cc == ',')                            // read "(a,b,c,d,e,f,g,"
+                                                        {
+                                                            is >> h;                                    // read "(a,b,c,d,e,f,g,h"                                    // read "(a,b,c,d,e,f,g"                                    // read "(a,b,c,d,e,f"
+                                                            
+                                                            if    (!is.good())    goto finish;
+                                                            
+                                                            is >> ch;                                    // get the next lexeme
+                                                                                        
+                                                            if    (!is.good())    goto finish;
+                                                            
+#ifdef    BOOST_NO_STD_LOCALE
+                                                            cc = ch;
+#else
+                                                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                                            
+                                                            if        (cc == ')')                            // read "(a,b,c,d,e,f,g,h)"
+                                                            {
+                                                                o = octonion<T>(a,b,c,d,e,f,g,h);
+                                                            }
+                                                            else                                        // error
+                                                            {
+                                                                is.setstate(::std::ios_base::failbit);
+                                                            }
+                                                        }
+                                                        else                                        // error
+                                                        {
+                                                            is.setstate(::std::ios_base::failbit);
+                                                        }
+                                                    }
+                                                    else                                        // error
+                                                    {
+                                                        is.setstate(::std::ios_base::failbit);
+                                                    }
+                                                }
+                                                else                                        // error
+                                                {
+                                                    is.setstate(::std::ios_base::failbit);
+                                                }
+                                            }
+                                            else                                        // error
+                                            {
+                                                is.setstate(::std::ios_base::failbit);
+                                            }
+                                        }
+                                    }
+                                    else                                        // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                            }
+                            else                                        // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                    }
+                    else                                        // error
+                    {
+                        is.setstate(::std::ios_base::failbit);
+                    }
+                }
+            }
+            else                                        // format:    a
+            {
+                is.putback(ch);
+                
+                is >> a;                                    // we extract the first component
+                
+                if    (!is.good())    goto finish;
+                
+                o = octonion<T>(a);
+            }
+            
+            finish:
+            return(is);
+        }
+        
+        
+        template<typename T, typename charT, class traits>
+        ::std::basic_ostream<charT,traits> &    operator << (    ::std::basic_ostream<charT,traits> & os,
+                                                                octonion<T> const & o)
+        {
+            ::std::basic_ostringstream<charT,traits>    s;
+            
+            s.flags(os.flags());
+#ifdef    BOOST_NO_STD_LOCALE
+#else
+            s.imbue(os.getloc());
+#endif /* BOOST_NO_STD_LOCALE */
+            s.precision(os.precision());
+            
+            s << '('    << o.R_component_1() << ','
+                        << o.R_component_2() << ','
+                        << o.R_component_3() << ','
+                        << o.R_component_4() << ','
+                        << o.R_component_5() << ','
+                        << o.R_component_6() << ','
+                        << o.R_component_7() << ','
+                        << o.R_component_8() << ')';
+            
+            return os << s.str();
+        }
+        
+        
+        // values
+        
+        template<typename T>
+        inline T                                real(octonion<T> const & o)
+        {
+            return(o.real());
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        unreal(octonion<T> const & o)
+        {
+            return(o.unreal());
+        }
+        
+        
+#define    BOOST_OCTONION_VALARRAY_LOADER   \
+            using    ::std::valarray;       \
+                                            \
+            valarray<T>    temp(8);         \
+                                            \
+            temp[0] = o.R_component_1();    \
+            temp[1] = o.R_component_2();    \
+            temp[2] = o.R_component_3();    \
+            temp[3] = o.R_component_4();    \
+            temp[4] = o.R_component_5();    \
+            temp[5] = o.R_component_6();    \
+            temp[6] = o.R_component_7();    \
+            temp[7] = o.R_component_8();
+        
+        
+        template<typename T>
+        inline T                                sup(octonion<T> const & o)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            BOOST_OCTONION_VALARRAY_LOADER
+            
+            return((abs(temp).max)());
+        }
+        
+        
+        template<typename T>
+        inline T                                l1(octonion<T> const & o)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            BOOST_OCTONION_VALARRAY_LOADER
+            
+            return(abs(temp).sum());
+        }
+        
+        
+        template<typename T>
+        inline T                                abs(const octonion<T> & o)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            using    ::std::sqrt;
+            
+            BOOST_OCTONION_VALARRAY_LOADER
+            
+            T            maxim = (abs(temp).max)();    // overflow protection
+            
+            if    (maxim == static_cast<T>(0))
+            {
+                return(maxim);
+            }
+            else
+            {
+                T    mixam = static_cast<T>(1)/maxim;    // prefer multiplications over divisions
+                
+                temp *= mixam;
+                
+                temp *= temp;
+                
+                return(maxim*sqrt(temp.sum()));
+            }
+            
+            //return(::std::sqrt(norm(o)));
+        }
+        
+        
+#undef    BOOST_OCTONION_VALARRAY_LOADER
+        
+        
+        // Note:    This is the Cayley norm, not the Euclidian norm...
+        
+        template<typename T>
+        inline T                                norm(octonion<T> const & o)
+        {
+            return(real(o*conj(o)));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        conj(octonion<T> const & o)
+        {
+            return(octonion<T>( +o.R_component_1(),
+                                -o.R_component_2(),
+                                -o.R_component_3(),
+                                -o.R_component_4(),
+                                -o.R_component_5(),
+                                -o.R_component_6(),
+                                -o.R_component_7(),
+                                -o.R_component_8()));
+        }
+        
+        
+        // Note:    There is little point, for the octonions, to introduce the equivalents
+        //            to the complex "arg" and the quaternionic "cylindropolar".
+        
+        
+        template<typename T>
+        inline octonion<T>                        spherical(T const & rho,
+                                                            T const & theta,
+                                                            T const & phi1,
+                                                            T const & phi2,
+                                                            T const & phi3,
+                                                            T const & phi4,
+                                                            T const & phi5,
+                                                            T const & phi6)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            //T    a = cos(theta)*cos(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
+            //T    b = sin(theta)*cos(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
+            //T    c = sin(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
+            //T    d = sin(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
+            //T    e = sin(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
+            //T    f = sin(phi4)*cos(phi5)*cos(phi6);
+            //T    g = sin(phi5)*cos(phi6);
+            //T    h = sin(phi6);
+            
+            T    courrant = static_cast<T>(1);
+            
+            T    h = sin(phi6);
+            
+            courrant *= cos(phi6);
+            
+            T    g = sin(phi5)*courrant;
+            
+            courrant *= cos(phi5);
+            
+            T    f = sin(phi4)*courrant;
+            
+            courrant *= cos(phi4);
+            
+            T    e = sin(phi3)*courrant;
+            
+            courrant *= cos(phi3);
+            
+            T    d = sin(phi2)*courrant;
+            
+            courrant *= cos(phi2);
+            
+            T    c = sin(phi1)*courrant;
+            
+            courrant *= cos(phi1);
+            
+            T    b = sin(theta)*courrant;
+            T    a = cos(theta)*courrant;
+            
+            return(rho*octonion<T>(a,b,c,d,e,f,g,h));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        multipolar(T const & rho1,
+                                                             T const & theta1,
+                                                             T const & rho2,
+                                                             T const & theta2,
+                                                             T const & rho3,
+                                                             T const & theta3,
+                                                             T const & rho4,
+                                                             T const & theta4)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            T    a = rho1*cos(theta1);
+            T    b = rho1*sin(theta1);
+            T    c = rho2*cos(theta2);
+            T    d = rho2*sin(theta2);
+            T    e = rho3*cos(theta3);
+            T    f = rho3*sin(theta3);
+            T    g = rho4*cos(theta4);
+            T    h = rho4*sin(theta4);
+            
+            return(octonion<T>(a,b,c,d,e,f,g,h));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        cylindrical(T const & r,
+                                                              T const & angle,
+                                                              T const & h1,
+                                                              T const & h2,
+                                                              T const & h3,
+                                                              T const & h4,
+                                                              T const & h5,
+                                                              T const & h6)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            T    a = r*cos(angle);
+            T    b = r*sin(angle);
+            
+            return(octonion<T>(a,b,h1,h2,h3,h4,h5,h6));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        exp(octonion<T> const & o)
+        {
+            using    ::std::exp;
+            using    ::std::cos;
+            
+            using    ::boost::math::sinc_pi;
+            
+            T    u = exp(real(o));
+            
+            T    z = abs(unreal(o));
+            
+            T    w = sinc_pi(z);
+            
+            return(u*octonion<T>(cos(z),
+                w*o.R_component_2(), w*o.R_component_3(),
+                w*o.R_component_4(), w*o.R_component_5(),
+                w*o.R_component_6(), w*o.R_component_7(),
+                w*o.R_component_8()));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        cos(octonion<T> const & o)
+        {
+            using    ::std::sin;
+            using    ::std::cos;
+            using    ::std::cosh;
+            
+            using    ::boost::math::sinhc_pi;
+            
+            T    z = abs(unreal(o));
+            
+            T    w = -sin(o.real())*sinhc_pi(z);
+            
+            return(octonion<T>(cos(o.real())*cosh(z),
+                w*o.R_component_2(), w*o.R_component_3(),
+                w*o.R_component_4(), w*o.R_component_5(),
+                w*o.R_component_6(), w*o.R_component_7(),
+                w*o.R_component_8()));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        sin(octonion<T> const & o)
+        {
+            using    ::std::sin;
+            using    ::std::cos;
+            using    ::std::cosh;
+            
+            using    ::boost::math::sinhc_pi;
+            
+            T    z = abs(unreal(o));
+            
+            T    w = +cos(o.real())*sinhc_pi(z);
+            
+            return(octonion<T>(sin(o.real())*cosh(z),
+                w*o.R_component_2(), w*o.R_component_3(),
+                w*o.R_component_4(), w*o.R_component_5(),
+                w*o.R_component_6(), w*o.R_component_7(),
+                w*o.R_component_8()));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        tan(octonion<T> const & o)
+        {
+            return(sin(o)/cos(o));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        cosh(octonion<T> const & o)
+        {
+            return((exp(+o)+exp(-o))/static_cast<T>(2));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        sinh(octonion<T> const & o)
+        {
+            return((exp(+o)-exp(-o))/static_cast<T>(2));
+        }
+        
+        
+        template<typename T>
+        inline octonion<T>                        tanh(octonion<T> const & o)
+        {
+            return(sinh(o)/cosh(o));
+        }
+        
+        
+        template<typename T>
+        octonion<T>                                pow(octonion<T> const & o,
+                                                    int n)
+        {
+            if        (n > 1)
+            {
+                int    m = n>>1;
+                
+                octonion<T>    result = pow(o, m);
+                
+                result *= result;
+                
+                if    (n != (m<<1))
+                {
+                    result *= o; // n odd
+                }
+                
+                return(result);
+            }
+            else if    (n == 1)
+            {
+                return(o);
+            }
+            else if    (n == 0)
+            {
+                return(octonion<T>(static_cast<T>(1)));
+            }
+            else    /* n < 0 */
+            {
+                return(pow(octonion<T>(static_cast<T>(1))/o,-n));
+            }
+        }
+        
+        
+        // helper templates for converting copy constructors (definition)
+        
+        namespace detail
+        {
+            
+            template<   typename T,
+                        typename U
+                    >
+            octonion<T>    octonion_type_converter(octonion<U> const & rhs)
+            {
+                return(octonion<T>( static_cast<T>(rhs.R_component_1()),
+                                    static_cast<T>(rhs.R_component_2()),
+                                    static_cast<T>(rhs.R_component_3()),
+                                    static_cast<T>(rhs.R_component_4()),
+                                    static_cast<T>(rhs.R_component_5()),
+                                    static_cast<T>(rhs.R_component_6()),
+                                    static_cast<T>(rhs.R_component_7()),
+                                    static_cast<T>(rhs.R_component_8())));
+            }
+        }
+    }
+}
+
+#endif /* BOOST_OCTONION_HPP */
diff --git a/gatb-core/thirdparty/boost/math/policies/error_handling.hpp b/gatb-core/thirdparty/boost/math/policies/error_handling.hpp
new file mode 100644
index 0000000..6747590
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/policies/error_handling.hpp
@@ -0,0 +1,805 @@
+//  Copyright John Maddock 2007.
+//  Copyright Paul A. Bristow 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_POLICY_ERROR_HANDLING_HPP
+#define BOOST_MATH_POLICY_ERROR_HANDLING_HPP
+
+#include <stdexcept>
+#include <iomanip>
+#include <string>
+#include <cerrno>
+#include <boost/config/no_tr1/complex.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <stdexcept>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/cstdint.hpp>
+#ifdef BOOST_MSVC
+#  pragma warning(push) // Quiet warnings in boost/format.hpp
+#  pragma warning(disable: 4996) // _SCL_SECURE_NO_DEPRECATE
+#  pragma warning(disable: 4512) // assignment operator could not be generated.
+// And warnings in error handling:
+#  pragma warning(disable: 4702) // unreachable code.
+// Note that this only occurs when the compiler can deduce code is unreachable,
+// for example when policy macros are used to ignore errors rather than throw.
+#endif
+#include <boost/format.hpp>
+
+namespace boost{ namespace math{
+
+class evaluation_error : public std::runtime_error
+{
+public:
+   evaluation_error(const std::string& s) : std::runtime_error(s){}
+};
+
+class rounding_error : public std::runtime_error
+{
+public:
+   rounding_error(const std::string& s) : std::runtime_error(s){}
+};
+
+namespace policies{
+//
+// Forward declarations of user error handlers,
+// it's up to the user to provide the definition of these:
+//
+template <class T>
+T user_domain_error(const char* function, const char* message, const T& val);
+template <class T>
+T user_pole_error(const char* function, const char* message, const T& val);
+template <class T>
+T user_overflow_error(const char* function, const char* message, const T& val);
+template <class T>
+T user_underflow_error(const char* function, const char* message, const T& val);
+template <class T>
+T user_denorm_error(const char* function, const char* message, const T& val);
+template <class T>
+T user_evaluation_error(const char* function, const char* message, const T& val);
+template <class T, class TargetType>
+T user_rounding_error(const char* function, const char* message, const T& val, const TargetType& t);
+template <class T>
+T user_indeterminate_result_error(const char* function, const char* message, const T& val);
+
+namespace detail
+{
+//
+// Helper function to avoid binding rvalue to non-const-reference,
+// in other words a warning suppression mechanism:
+//
+template <class Formatter, class Group>
+inline std::string do_format(Formatter f, const Group& g)
+{
+   return (f % g).str();
+}
+
+template <class T>
+inline const char* name_of()
+{
+#ifndef BOOST_NO_RTTI
+   return typeid(T).name();
+#else
+   return "unknown";
+#endif
+}
+template <> inline const char* name_of<float>(){ return "float"; }
+template <> inline const char* name_of<double>(){ return "double"; }
+template <> inline const char* name_of<long double>(){ return "long double"; }
+
+#ifdef BOOST_MATH_USE_FLOAT128
+template <>
+inline const char* name_of<BOOST_MATH_FLOAT128_TYPE>()
+{
+   return "__float128";
+}
+#endif
+
+template <class E, class T>
+void raise_error(const char* function, const char* message)
+{
+  if(function == 0)
+       function = "Unknown function operating on type %1%";
+  if(message == 0)
+       message = "Cause unknown";
+
+  std::string msg("Error in function ");
+#ifndef BOOST_NO_RTTI
+  msg += (boost::format(function) % boost::math::policies::detail::name_of<T>()).str();
+#else
+  msg += function;
+#endif
+  msg += ": ";
+  msg += message;
+
+  E e(msg);
+  boost::throw_exception(e);
+}
+
+template <class E, class T>
+void raise_error(const char* function, const char* message, const T& val)
+{
+  if(function == 0)
+     function = "Unknown function operating on type %1%";
+  if(message == 0)
+     message = "Cause unknown: error caused by bad argument with value %1%";
+
+  std::string msg("Error in function ");
+#ifndef BOOST_NO_RTTI
+  msg += (boost::format(function) % boost::math::policies::detail::name_of<T>()).str();
+#else
+  msg += function;
+#endif
+  msg += ": ";
+  msg += message;
+
+  int prec = 2 + (boost::math::policies::digits<T, boost::math::policies::policy<> >() * 30103UL) / 100000UL;
+  msg = do_format(boost::format(msg), boost::io::group(std::setprecision(prec), val));
+
+  E e(msg);
+  boost::throw_exception(e);
+}
+
+template <class T>
+inline T raise_domain_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const ::boost::math::policies::domain_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::domain_error, T>(function, message, val);
+   // we never get here:
+   return std::numeric_limits<T>::quiet_NaN();
+}
+
+template <class T>
+inline T raise_domain_error(
+           const char* ,
+           const char* ,
+           const T& ,
+           const ::boost::math::policies::domain_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return std::numeric_limits<T>::quiet_NaN();
+}
+
+template <class T>
+inline T raise_domain_error(
+           const char* ,
+           const char* ,
+           const T& ,
+           const ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = EDOM;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return std::numeric_limits<T>::quiet_NaN();
+}
+
+template <class T>
+inline T raise_domain_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::domain_error< ::boost::math::policies::user_error>&)
+{
+   return user_domain_error(function, message, val);
+}
+
+template <class T>
+inline T raise_pole_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::pole_error< ::boost::math::policies::throw_on_error>&)
+{
+   return boost::math::policies::detail::raise_domain_error(function, message, val,  ::boost::math::policies::domain_error< ::boost::math::policies::throw_on_error>());
+}
+
+template <class T>
+inline T raise_pole_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::pole_error< ::boost::math::policies::ignore_error>&)
+{
+   return  ::boost::math::policies::detail::raise_domain_error(function, message, val,  ::boost::math::policies::domain_error< ::boost::math::policies::ignore_error>());
+}
+
+template <class T>
+inline T raise_pole_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::pole_error< ::boost::math::policies::errno_on_error>&)
+{
+   return  ::boost::math::policies::detail::raise_domain_error(function, message, val,  ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>());
+}
+
+template <class T>
+inline T raise_pole_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::pole_error< ::boost::math::policies::user_error>&)
+{
+   return user_pole_error(function, message, val);
+}
+
+
+template <class T>
+inline T raise_overflow_error(
+           const char* function,
+           const char* message,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::overflow_error, T>(function, message ? message : "numeric overflow");
+   // We should never get here:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const ::boost::math::policies::overflow_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::overflow_error, T>(function, message ? message : "numeric overflow", val);
+   // We should never get here:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* ,
+           const char* ,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* ,
+           const char* ,
+           const T&,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* ,
+           const char* ,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = ERANGE;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* ,
+           const char* ,
+           const T&,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = ERANGE;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>();
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* function,
+           const char* message,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::user_error>&)
+{
+   return user_overflow_error(function, message, std::numeric_limits<T>::infinity());
+}
+
+template <class T>
+inline T raise_overflow_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::overflow_error< ::boost::math::policies::user_error>&)
+{
+   std::string fmsg("Error in function ");
+#ifndef BOOST_NO_RTTI
+   fmsg += (boost::format(function) % boost::math::policies::detail::name_of<T>()).str();
+#else
+   fmsg += function;
+#endif
+   int prec = 2 + (boost::math::policies::digits<T, boost::math::policies::policy<> >() * 30103UL) / 100000UL;
+   std::string msg = do_format(boost::format(message), boost::io::group(std::setprecision(prec), val));
+   return user_overflow_error(fmsg.c_str(), msg.c_str(), std::numeric_limits<T>::infinity());
+}
+
+template <class T>
+inline T raise_underflow_error(
+           const char* function,
+           const char* message,
+           const  ::boost::math::policies::underflow_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::underflow_error, T>(function, message ? message : "numeric underflow");
+   // We should never get here:
+   return 0;
+}
+
+template <class T>
+inline T raise_underflow_error(
+           const char* ,
+           const char* ,
+           const  ::boost::math::policies::underflow_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return T(0);
+}
+
+template <class T>
+inline T raise_underflow_error(
+           const char* /* function */,
+           const char* /* message */,
+           const  ::boost::math::policies::underflow_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = ERANGE;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return T(0);
+}
+
+template <class T>
+inline T raise_underflow_error(
+           const char* function,
+           const char* message,
+           const  ::boost::math::policies::underflow_error< ::boost::math::policies::user_error>&)
+{
+   return user_underflow_error(function, message, T(0));
+}
+
+template <class T>
+inline T raise_denorm_error(
+           const char* function,
+           const char* message,
+           const T& /* val */,
+           const  ::boost::math::policies::denorm_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::underflow_error, T>(function, message ? message : "denormalised result");
+   // we never get here:
+   return T(0);
+}
+
+template <class T>
+inline T raise_denorm_error(
+           const char* ,
+           const char* ,
+           const T&  val,
+           const  ::boost::math::policies::denorm_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return val;
+}
+
+template <class T>
+inline T raise_denorm_error(
+           const char* ,
+           const char* ,
+           const T& val,
+           const  ::boost::math::policies::denorm_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = ERANGE;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return val;
+}
+
+template <class T>
+inline T raise_denorm_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::denorm_error< ::boost::math::policies::user_error>&)
+{
+   return user_denorm_error(function, message, val);
+}
+
+template <class T>
+inline T raise_evaluation_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::evaluation_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<boost::math::evaluation_error, T>(function, message, val);
+   // we never get here:
+   return T(0);
+}
+
+template <class T>
+inline T raise_evaluation_error(
+           const char* ,
+           const char* ,
+           const T& val,
+           const  ::boost::math::policies::evaluation_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return val;
+}
+
+template <class T>
+inline T raise_evaluation_error(
+           const char* ,
+           const char* ,
+           const T& val,
+           const  ::boost::math::policies::evaluation_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = EDOM;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return val;
+}
+
+template <class T>
+inline T raise_evaluation_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const  ::boost::math::policies::evaluation_error< ::boost::math::policies::user_error>&)
+{
+   return user_evaluation_error(function, message, val);
+}
+
+template <class T, class TargetType>
+inline TargetType raise_rounding_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const TargetType&,
+           const  ::boost::math::policies::rounding_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<boost::math::rounding_error, T>(function, message, val);
+   // we never get here:
+   return TargetType(0);
+}
+
+template <class T, class TargetType>
+inline TargetType raise_rounding_error(
+           const char* ,
+           const char* ,
+           const T& val,
+           const TargetType&,
+           const  ::boost::math::policies::rounding_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   BOOST_STATIC_ASSERT(std::numeric_limits<TargetType>::is_specialized);
+   return  val > 0 ? (std::numeric_limits<TargetType>::max)() : (std::numeric_limits<TargetType>::is_integer ? (std::numeric_limits<TargetType>::min)() : -(std::numeric_limits<TargetType>::max)());
+}
+
+template <class T, class TargetType>
+inline TargetType raise_rounding_error(
+           const char* ,
+           const char* ,
+           const T& val,
+           const TargetType&,
+           const  ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = ERANGE;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   BOOST_STATIC_ASSERT(std::numeric_limits<TargetType>::is_specialized);
+   return  val > 0 ? (std::numeric_limits<TargetType>::max)() : (std::numeric_limits<TargetType>::is_integer ? (std::numeric_limits<TargetType>::min)() : -(std::numeric_limits<TargetType>::max)());
+}
+
+template <class T, class TargetType>
+inline TargetType raise_rounding_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const TargetType& t,
+           const  ::boost::math::policies::rounding_error< ::boost::math::policies::user_error>&)
+{
+   return user_rounding_error(function, message, val, t);
+}
+
+template <class T, class R>
+inline T raise_indeterminate_result_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const R& ,
+           const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::throw_on_error>&)
+{
+   raise_error<std::domain_error, T>(function, message, val);
+   // we never get here:
+   return std::numeric_limits<T>::quiet_NaN();
+}
+
+template <class T, class R>
+inline T raise_indeterminate_result_error(
+           const char* ,
+           const char* ,
+           const T& ,
+           const R& result,
+           const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::ignore_error>&)
+{
+   // This may or may not do the right thing, but the user asked for the error
+   // to be ignored so here we go anyway:
+   return result;
+}
+
+template <class T, class R>
+inline T raise_indeterminate_result_error(
+           const char* ,
+           const char* ,
+           const T& ,
+           const R& result,
+           const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::errno_on_error>&)
+{
+   errno = EDOM;
+   // This may or may not do the right thing, but the user asked for the error
+   // to be silent so here we go anyway:
+   return result;
+}
+
+template <class T, class R>
+inline T raise_indeterminate_result_error(
+           const char* function,
+           const char* message,
+           const T& val,
+           const R& ,
+           const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::user_error>&)
+{
+   return user_indeterminate_result_error(function, message, val);
+}
+
+}  // namespace detail
+
+template <class T, class Policy>
+inline T raise_domain_error(const char* function, const char* message, const T& val, const Policy&)
+{
+   typedef typename Policy::domain_error_type policy_type;
+   return detail::raise_domain_error(
+      function, message ? message : "Domain Error evaluating function at %1%",
+      val, policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_pole_error(const char* function, const char* message, const T& val, const Policy&)
+{
+   typedef typename Policy::pole_error_type policy_type;
+   return detail::raise_pole_error(
+      function, message ? message : "Evaluation of function at pole %1%",
+      val, policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_overflow_error(const char* function, const char* message, const Policy&)
+{
+   typedef typename Policy::overflow_error_type policy_type;
+   return detail::raise_overflow_error<T>(
+      function, message ? message : "Overflow Error",
+      policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_overflow_error(const char* function, const char* message, const T& val, const Policy&)
+{
+   typedef typename Policy::overflow_error_type policy_type;
+   return detail::raise_overflow_error(
+      function, message ? message : "Overflow evaluating function at %1%",
+      val, policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_underflow_error(const char* function, const char* message, const Policy&)
+{
+   typedef typename Policy::underflow_error_type policy_type;
+   return detail::raise_underflow_error<T>(
+      function, message ? message : "Underflow Error",
+      policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_denorm_error(const char* function, const char* message, const T& val, const Policy&)
+{
+   typedef typename Policy::denorm_error_type policy_type;
+   return detail::raise_denorm_error<T>(
+      function, message ? message : "Denorm Error",
+      val,
+      policy_type());
+}
+
+template <class T, class Policy>
+inline T raise_evaluation_error(const char* function, const char* message, const T& val, const Policy&)
+{
+   typedef typename Policy::evaluation_error_type policy_type;
+   return detail::raise_evaluation_error(
+      function, message ? message : "Internal Evaluation Error, best value so far was %1%",
+      val, policy_type());
+}
+
+template <class T, class TargetType, class Policy>
+inline TargetType raise_rounding_error(const char* function, const char* message, const T& val, const TargetType& t, const Policy&)
+{
+   typedef typename Policy::rounding_error_type policy_type;
+   return detail::raise_rounding_error(
+      function, message ? message : "Value %1% can not be represented in the target integer type.",
+      val, t, policy_type());
+}
+
+template <class T, class R, class Policy>
+inline T raise_indeterminate_result_error(const char* function, const char* message, const T& val, const R& result, const Policy&)
+{
+   typedef typename Policy::indeterminate_result_error_type policy_type;
+   return detail::raise_indeterminate_result_error(
+      function, message ? message : "Indeterminate result with value %1%",
+      val, result, policy_type());
+}
+
+//
+// checked_narrowing_cast:
+//
+namespace detail
+{
+
+template <class R, class T, class Policy>
+inline bool check_overflow(T val, R* result, const char* function, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   if(fabs(val) > tools::max_value<R>())
+   {
+      boost::math::policies::detail::raise_overflow_error<R>(function, 0, pol);
+      *result = static_cast<R>(val);
+      return true;
+   }
+   return false;
+}
+template <class R, class T, class Policy>
+inline bool check_overflow(std::complex<T> val, R* result, const char* function, const Policy& pol)
+{
+   typedef typename R::value_type r_type;
+   r_type re, im;
+   bool r = check_overflow<r_type>(val.real(), &re, function, pol);
+   r = check_overflow<r_type>(val.imag(), &im, function, pol) || r;
+   *result = R(re, im);
+   return r;
+}
+template <class R, class T, class Policy>
+inline bool check_underflow(T val, R* result, const char* function, const Policy& pol)
+{
+   if((val != 0) && (static_cast<R>(val) == 0))
+   {
+      *result = static_cast<R>(boost::math::policies::detail::raise_underflow_error<R>(function, 0, pol));
+      return true;
+   }
+   return false;
+}
+template <class R, class T, class Policy>
+inline bool check_underflow(std::complex<T> val, R* result, const char* function, const Policy& pol)
+{
+   typedef typename R::value_type r_type;
+   r_type re, im;
+   bool r = check_underflow<r_type>(val.real(), &re, function, pol);
+   r = check_underflow<r_type>(val.imag(), &im, function, pol) || r;
+   *result = R(re, im);
+   return r;
+}
+template <class R, class T, class Policy>
+inline bool check_denorm(T val, R* result, const char* function, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   if((fabs(val) < static_cast<T>(tools::min_value<R>())) && (static_cast<R>(val) != 0))
+   {
+      *result = static_cast<R>(boost::math::policies::detail::raise_denorm_error<R>(function, 0, static_cast<R>(val), pol));
+      return true;
+   }
+   return false;
+}
+template <class R, class T, class Policy>
+inline bool check_denorm(std::complex<T> val, R* result, const char* function, const Policy& pol)
+{
+   typedef typename R::value_type r_type;
+   r_type re, im;
+   bool r = check_denorm<r_type>(val.real(), &re, function, pol);
+   r = check_denorm<r_type>(val.imag(), &im, function, pol) || r;
+   *result = R(re, im);
+   return r;
+}
+
+// Default instantiations with ignore_error policy.
+template <class R, class T>
+inline bool check_overflow(T /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&){ return false; }
+template <class R, class T>
+inline bool check_overflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&){ return false; }
+template <class R, class T>
+inline bool check_underflow(T /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&){ return false; }
+template <class R, class T>
+inline bool check_underflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&){ return false; }
+template <class R, class T>
+inline bool check_denorm(T /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&){ return false; }
+template <class R, class T>
+inline bool check_denorm(std::complex<T> /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&){ return false; }
+
+} // namespace detail
+
+template <class R, class Policy, class T>
+inline R checked_narrowing_cast(T val, const char* function)
+{
+   typedef typename Policy::overflow_error_type overflow_type;
+   typedef typename Policy::underflow_error_type underflow_type;
+   typedef typename Policy::denorm_error_type denorm_type;
+   //
+   // Most of what follows will evaluate to a no-op:
+   //
+   R result = 0;
+   if(detail::check_overflow<R>(val, &result, function, overflow_type()))
+      return result;
+   if(detail::check_underflow<R>(val, &result, function, underflow_type()))
+      return result;
+   if(detail::check_denorm<R>(val, &result, function, denorm_type()))
+      return result;
+
+   return static_cast<R>(val);
+}
+
+template <class T, class Policy>
+inline void check_series_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol)
+{
+   if(max_iter >= policies::get_max_series_iterations<Policy>())
+      raise_evaluation_error<T>(
+         function,
+         "Series evaluation exceeded %1% iterations, giving up now.", static_cast<T>(static_cast<double>(max_iter)), pol);
+}
+
+template <class T, class Policy>
+inline void check_root_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol)
+{
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+      raise_evaluation_error<T>(
+         function,
+         "Root finding evaluation exceeded %1% iterations, giving up now.", static_cast<T>(static_cast<double>(max_iter)), pol);
+}
+
+} //namespace policies
+
+namespace detail{
+
+//
+// Simple helper function to assist in returning a pair from a single value,
+// that value usually comes from one of the error handlers above:
+//
+template <class T>
+std::pair<T, T> pair_from_single(const T& val)
+{
+   return std::make_pair(val, val);
+}
+
+}
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+}} // namespaces boost/math
+
+#endif // BOOST_MATH_POLICY_ERROR_HANDLING_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/policies/policy.hpp b/gatb-core/thirdparty/boost/math/policies/policy.hpp
new file mode 100644
index 0000000..71309fa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/policies/policy.hpp
@@ -0,0 +1,996 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_POLICY_HPP
+#define BOOST_MATH_POLICY_HPP
+
+#include <boost/mpl/list.hpp>
+#include <boost/mpl/contains.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/remove_if.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/comparison.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/assert.hpp>
+#include <boost/math/tools/config.hpp>
+#include <limits>
+// Sadly we do need the .h versions of these to be sure of getting
+// FLT_MANT_DIG etc.
+#include <limits.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <math.h>
+
+namespace boost{ namespace math{ 
+
+namespace tools{
+
+template <class T>
+int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
+template <class T>
+T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
+
+}
+
+namespace policies{
+
+//
+// Define macros for our default policies, if they're not defined already:
+//
+#ifndef BOOST_MATH_DOMAIN_ERROR_POLICY
+#define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error
+#endif
+#ifndef BOOST_MATH_POLE_ERROR_POLICY
+#define BOOST_MATH_POLE_ERROR_POLICY throw_on_error
+#endif
+#ifndef BOOST_MATH_OVERFLOW_ERROR_POLICY
+#define BOOST_MATH_OVERFLOW_ERROR_POLICY throw_on_error
+#endif
+#ifndef BOOST_MATH_EVALUATION_ERROR_POLICY
+#define BOOST_MATH_EVALUATION_ERROR_POLICY throw_on_error
+#endif
+#ifndef BOOST_MATH_ROUNDING_ERROR_POLICY
+#define BOOST_MATH_ROUNDING_ERROR_POLICY throw_on_error
+#endif
+#ifndef BOOST_MATH_UNDERFLOW_ERROR_POLICY
+#define BOOST_MATH_UNDERFLOW_ERROR_POLICY ignore_error
+#endif
+#ifndef BOOST_MATH_DENORM_ERROR_POLICY
+#define BOOST_MATH_DENORM_ERROR_POLICY ignore_error
+#endif
+#ifndef BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY
+#define BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY ignore_error
+#endif
+#ifndef BOOST_MATH_DIGITS10_POLICY
+#define BOOST_MATH_DIGITS10_POLICY 0
+#endif
+#ifndef BOOST_MATH_PROMOTE_FLOAT_POLICY
+#define BOOST_MATH_PROMOTE_FLOAT_POLICY true
+#endif
+#ifndef BOOST_MATH_PROMOTE_DOUBLE_POLICY
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false
+#else
+#define BOOST_MATH_PROMOTE_DOUBLE_POLICY true
+#endif
+#endif
+#ifndef BOOST_MATH_DISCRETE_QUANTILE_POLICY
+#define BOOST_MATH_DISCRETE_QUANTILE_POLICY integer_round_outwards
+#endif
+#ifndef BOOST_MATH_ASSERT_UNDEFINED_POLICY
+#define BOOST_MATH_ASSERT_UNDEFINED_POLICY true
+#endif
+#ifndef BOOST_MATH_MAX_SERIES_ITERATION_POLICY
+#define BOOST_MATH_MAX_SERIES_ITERATION_POLICY 1000000
+#endif
+#ifndef BOOST_MATH_MAX_ROOT_ITERATION_POLICY
+#define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 200
+#endif
+
+#if !defined(__BORLANDC__)
+#define BOOST_MATH_META_INT(type, name, Default)\
+   template <type N = Default> struct name : public boost::mpl::int_<N>{};\
+   namespace detail{\
+   template <type N>\
+   char test_is_valid_arg(const name<N>*);\
+   char test_is_default_arg(const name<Default>*);\
+   template <class T> struct is_##name##_imp\
+   {\
+      template <type N> static char test(const name<N>*);\
+      static double test(...);\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\
+   };\
+   }\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{};
+
+#define BOOST_MATH_META_BOOL(name, Default)\
+   template <bool N = Default> struct name : public boost::mpl::bool_<N>{};\
+   namespace detail{\
+   template <bool N>\
+   char test_is_valid_arg(const name<N>*);\
+   char test_is_default_arg(const name<Default>*);\
+   template <class T> struct is_##name##_imp\
+   {\
+      template <bool N> static char test(const name<N>*);\
+      static double test(...);\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\
+   };\
+   }\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{};
+#else
+#define BOOST_MATH_META_INT(Type, name, Default)\
+   template <Type N = Default> struct name : public boost::mpl::int_<N>{};\
+   namespace detail{\
+   template <Type N>\
+   char test_is_valid_arg(const name<N>*);\
+   char test_is_default_arg(const name<Default>*);\
+   template <class T> struct is_##name##_tester\
+   {\
+      template <Type N> static char test(const name<N>&);\
+      static double test(...);\
+   };\
+   template <class T> struct is_##name##_imp\
+   {\
+      static T inst;\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\
+   };\
+   }\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\
+   {\
+      template <class U> struct apply{ typedef is_##name<U> type; };\
+   };
+
+#define BOOST_MATH_META_BOOL(name, Default)\
+   template <bool N = Default> struct name : public boost::mpl::bool_<N>{};\
+   namespace detail{\
+   template <bool N>\
+   char test_is_valid_arg(const name<N>*);\
+   char test_is_default_arg(const name<Default>*);\
+   template <class T> struct is_##name##_tester\
+   {\
+      template <bool N> static char test(const name<N>&);\
+      static double test(...);\
+   };\
+   template <class T> struct is_##name##_imp\
+   {\
+      static T inst;\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\
+   };\
+   }\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\
+   {\
+      template <class U> struct apply{ typedef is_##name<U> type;  };\
+   };
+#endif
+//
+// Begin by defining policy types for error handling:
+//
+enum error_policy_type
+{
+   throw_on_error = 0,
+   errno_on_error = 1,
+   ignore_error = 2,
+   user_error = 3
+};
+
+BOOST_MATH_META_INT(error_policy_type, domain_error, BOOST_MATH_DOMAIN_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, pole_error, BOOST_MATH_POLE_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, overflow_error, BOOST_MATH_OVERFLOW_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, underflow_error, BOOST_MATH_UNDERFLOW_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, denorm_error, BOOST_MATH_DENORM_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, evaluation_error, BOOST_MATH_EVALUATION_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, rounding_error, BOOST_MATH_ROUNDING_ERROR_POLICY)
+BOOST_MATH_META_INT(error_policy_type, indeterminate_result_error, BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY)
+
+//
+// Policy types for internal promotion:
+//
+BOOST_MATH_META_BOOL(promote_float, BOOST_MATH_PROMOTE_FLOAT_POLICY)
+BOOST_MATH_META_BOOL(promote_double, BOOST_MATH_PROMOTE_DOUBLE_POLICY)
+BOOST_MATH_META_BOOL(assert_undefined, BOOST_MATH_ASSERT_UNDEFINED_POLICY)
+//
+// Policy types for discrete quantiles:
+//
+enum discrete_quantile_policy_type
+{
+   real,
+   integer_round_outwards,
+   integer_round_inwards,
+   integer_round_down,
+   integer_round_up,
+   integer_round_nearest
+};
+
+BOOST_MATH_META_INT(discrete_quantile_policy_type, discrete_quantile, BOOST_MATH_DISCRETE_QUANTILE_POLICY)
+//
+// Precision:
+//
+BOOST_MATH_META_INT(int, digits10, BOOST_MATH_DIGITS10_POLICY)
+BOOST_MATH_META_INT(int, digits2, 0)
+//
+// Iterations:
+//
+BOOST_MATH_META_INT(unsigned long, max_series_iterations, BOOST_MATH_MAX_SERIES_ITERATION_POLICY)
+BOOST_MATH_META_INT(unsigned long, max_root_iterations, BOOST_MATH_MAX_ROOT_ITERATION_POLICY)
+//
+// Define the names for each possible policy:
+//
+#define BOOST_MATH_PARAMETER(name)\
+   BOOST_PARAMETER_TEMPLATE_KEYWORD(name##_name)\
+   BOOST_PARAMETER_NAME(name##_name)
+
+struct default_policy{};
+
+namespace detail{
+//
+// Trait to work out bits precision from digits10 and digits2:
+//
+template <class Digits10, class Digits2>
+struct precision
+{
+   //
+   // Now work out the precision:
+   //
+   typedef typename mpl::if_c<
+      (Digits10::value == 0),
+      digits2<0>,
+      digits2<((Digits10::value + 1) * 1000L) / 301L>
+   >::type digits2_type;
+public:
+#ifdef __BORLANDC__
+   typedef typename mpl::if_c<
+      (Digits2::value > ::boost::math::policies::detail::precision<Digits10,Digits2>::digits2_type::value),
+      Digits2, digits2_type>::type type;
+#else
+   typedef typename mpl::if_c<
+      (Digits2::value > digits2_type::value),
+      Digits2, digits2_type>::type type;
+#endif
+};
+
+template <class A, class B, bool b>
+struct select_result
+{
+   typedef A type;
+};
+template <class A, class B>
+struct select_result<A, B, false>
+{
+   typedef typename mpl::deref<B>::type type;
+};
+
+template <class Seq, class Pred, class DefaultType>
+struct find_arg
+{
+private:
+   typedef typename mpl::find_if<Seq, Pred>::type iter;
+   typedef typename mpl::end<Seq>::type end_type;
+public:
+   typedef typename select_result<
+      DefaultType, iter,
+      ::boost::is_same<iter, end_type>::value>::type type;
+};
+
+double test_is_valid_arg(...);
+double test_is_default_arg(...);
+char test_is_valid_arg(const default_policy*);
+char test_is_default_arg(const default_policy*);
+
+template <class T>
+struct is_valid_policy_imp 
+{
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_valid_arg(static_cast<T*>(0))) == 1);
+};
+
+template <class T>
+struct is_default_policy_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_default_arg(static_cast<T*>(0))) == 1);
+};
+
+template <class T> struct is_valid_policy 
+: public mpl::bool_< 
+   ::boost::math::policies::detail::is_valid_policy_imp<T>::value>
+{};
+
+template <class T> struct is_default_policy 
+: public mpl::bool_< 
+   ::boost::math::policies::detail::is_default_policy_imp<T>::value>
+{
+   template <class U>
+   struct apply
+   {
+      typedef is_default_policy<U> type;
+   };
+};
+
+template <class Seq, class T, int N>
+struct append_N
+{
+   typedef typename mpl::push_back<Seq, T>::type new_seq;
+   typedef typename append_N<new_seq, T, N-1>::type type;
+};
+
+template <class Seq, class T>
+struct append_N<Seq, T, 0>
+{
+   typedef Seq type;
+};
+
+//
+// Traits class to work out what template parameters our default
+// policy<> class will have when modified for forwarding:
+//
+template <bool f, bool d>
+struct default_args
+{
+   typedef promote_float<false> arg1;
+   typedef promote_double<false> arg2;
+};
+
+template <>
+struct default_args<false, false>
+{
+   typedef default_policy arg1;
+   typedef default_policy arg2;
+};
+
+template <>
+struct default_args<true, false>
+{
+   typedef promote_float<false> arg1;
+   typedef default_policy arg2;
+};
+
+template <>
+struct default_args<false, true>
+{
+   typedef promote_double<false> arg1;
+   typedef default_policy arg2;
+};
+
+typedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg1 forwarding_arg1;
+typedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg2 forwarding_arg2;
+
+} // detail
+//
+// Now define the policy type with enough arguments to handle all
+// the policies:
+//
+template <class A1 = default_policy, 
+          class A2 = default_policy, 
+          class A3 = default_policy,
+          class A4 = default_policy,
+          class A5 = default_policy,
+          class A6 = default_policy,
+          class A7 = default_policy,
+          class A8 = default_policy,
+          class A9 = default_policy,
+          class A10 = default_policy,
+          class A11 = default_policy,
+          class A12 = default_policy,
+          class A13 = default_policy>
+struct policy
+{
+private:
+   //
+   // Validate all our arguments:
+   //
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A1>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A2>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A3>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A4>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A5>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A6>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A7>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A8>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A9>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A10>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A11>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A12>::value);
+   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A13>::value);
+   //
+   // Typelist of the arguments:
+   //
+   typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list;
+
+public:
+   typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, domain_error<> >::type domain_error_type;
+   typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, pole_error<> >::type pole_error_type;
+   typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, overflow_error<> >::type overflow_error_type;
+   typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, underflow_error<> >::type underflow_error_type;
+   typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, denorm_error<> >::type denorm_error_type;
+   typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, evaluation_error<> >::type evaluation_error_type;
+   typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, rounding_error<> >::type rounding_error_type;
+   typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, indeterminate_result_error<> >::type indeterminate_result_error_type;
+private:
+   //
+   // Now work out the precision:
+   //
+   typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type;
+   typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, digits2<> >::type bits_precision_type;
+public:
+   typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type;
+   //
+   // Internal promotion:
+   //
+   typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, promote_float<> >::type promote_float_type;
+   typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, promote_double<> >::type promote_double_type;
+   //
+   // Discrete quantiles:
+   //
+   typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, discrete_quantile<> >::type discrete_quantile_type;
+   //
+   // Mathematically undefined properties:
+   //
+   typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, assert_undefined<> >::type assert_undefined_type;
+   //
+   // Max iterations:
+   //
+   typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, max_series_iterations<> >::type max_series_iterations_type;
+   typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, max_root_iterations<> >::type max_root_iterations_type;
+};
+//
+// These full specializations are defined to reduce the amount of
+// template instantiations that have to take place when using the default
+// policies, they have quite a large impact on compile times:
+//
+template <>
+struct policy<default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy>
+{
+public:
+   typedef domain_error<> domain_error_type;
+   typedef pole_error<> pole_error_type;
+   typedef overflow_error<> overflow_error_type;
+   typedef underflow_error<> underflow_error_type;
+   typedef denorm_error<> denorm_error_type;
+   typedef evaluation_error<> evaluation_error_type;
+   typedef rounding_error<> rounding_error_type;
+   typedef indeterminate_result_error<> indeterminate_result_error_type;
+#if BOOST_MATH_DIGITS10_POLICY == 0
+   typedef digits2<> precision_type;
+#else
+   typedef detail::precision<digits10<>, digits2<> >::type precision_type;
+#endif
+   typedef promote_float<> promote_float_type;
+   typedef promote_double<> promote_double_type;
+   typedef discrete_quantile<> discrete_quantile_type;
+   typedef assert_undefined<> assert_undefined_type;
+   typedef max_series_iterations<> max_series_iterations_type;
+   typedef max_root_iterations<> max_root_iterations_type;
+};
+
+template <>
+struct policy<detail::forwarding_arg1, detail::forwarding_arg2, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy>
+{
+public:
+   typedef domain_error<> domain_error_type;
+   typedef pole_error<> pole_error_type;
+   typedef overflow_error<> overflow_error_type;
+   typedef underflow_error<> underflow_error_type;
+   typedef denorm_error<> denorm_error_type;
+   typedef evaluation_error<> evaluation_error_type;
+   typedef rounding_error<> rounding_error_type;
+   typedef indeterminate_result_error<> indeterminate_result_error_type;
+#if BOOST_MATH_DIGITS10_POLICY == 0
+   typedef digits2<> precision_type;
+#else
+   typedef detail::precision<digits10<>, digits2<> >::type precision_type;
+#endif
+   typedef promote_float<false> promote_float_type;
+   typedef promote_double<false> promote_double_type;
+   typedef discrete_quantile<> discrete_quantile_type;
+   typedef assert_undefined<> assert_undefined_type;
+   typedef max_series_iterations<> max_series_iterations_type;
+   typedef max_root_iterations<> max_root_iterations_type;
+};
+
+template <class Policy, 
+          class A1 = default_policy, 
+          class A2 = default_policy, 
+          class A3 = default_policy,
+          class A4 = default_policy,
+          class A5 = default_policy,
+          class A6 = default_policy,
+          class A7 = default_policy,
+          class A8 = default_policy,
+          class A9 = default_policy,
+          class A10 = default_policy,
+          class A11 = default_policy,
+          class A12 = default_policy,
+          class A13 = default_policy>
+struct normalise
+{
+private:
+   typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list;
+   typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, typename Policy::domain_error_type >::type domain_error_type;
+   typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, typename Policy::pole_error_type >::type pole_error_type;
+   typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, typename Policy::overflow_error_type >::type overflow_error_type;
+   typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, typename Policy::underflow_error_type >::type underflow_error_type;
+   typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, typename Policy::denorm_error_type >::type denorm_error_type;
+   typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, typename Policy::evaluation_error_type >::type evaluation_error_type;
+   typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, typename Policy::rounding_error_type >::type rounding_error_type;
+   typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, typename Policy::indeterminate_result_error_type >::type indeterminate_result_error_type;
+   //
+   // Now work out the precision:
+   //
+   typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type;
+   typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, typename Policy::precision_type >::type bits_precision_type;
+   typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type;
+   //
+   // Internal promotion:
+   //
+   typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, typename Policy::promote_float_type >::type promote_float_type;
+   typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, typename Policy::promote_double_type >::type promote_double_type;
+   //
+   // Discrete quantiles:
+   //
+   typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, typename Policy::discrete_quantile_type >::type discrete_quantile_type;
+   //
+   // Mathematically undefined properties:
+   //
+   typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, typename Policy::assert_undefined_type >::type assert_undefined_type;
+   //
+   // Max iterations:
+   //
+   typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, typename Policy::max_series_iterations_type>::type max_series_iterations_type;
+   typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, typename Policy::max_root_iterations_type>::type max_root_iterations_type;
+   //
+   // Define a typelist of the policies:
+   //
+   typedef mpl::vector<
+      domain_error_type,
+      pole_error_type,
+      overflow_error_type,
+      underflow_error_type,
+      denorm_error_type,
+      evaluation_error_type,
+      rounding_error_type,
+      indeterminate_result_error_type,
+      precision_type,
+      promote_float_type,
+      promote_double_type,
+      discrete_quantile_type,
+      assert_undefined_type,
+      max_series_iterations_type,
+      max_root_iterations_type> result_list;
+   //
+   // Remove all the policies that are the same as the default:
+   //
+   typedef typename mpl::remove_if<result_list, detail::is_default_policy<mpl::_> >::type reduced_list;
+   //
+   // Pad out the list with defaults:
+   //
+   typedef typename detail::append_N<reduced_list, default_policy, (14 - ::boost::mpl::size<reduced_list>::value)>::type result_type;
+public:
+   typedef policy<
+      typename mpl::at<result_type, mpl::int_<0> >::type,
+      typename mpl::at<result_type, mpl::int_<1> >::type,
+      typename mpl::at<result_type, mpl::int_<2> >::type,
+      typename mpl::at<result_type, mpl::int_<3> >::type,
+      typename mpl::at<result_type, mpl::int_<4> >::type,
+      typename mpl::at<result_type, mpl::int_<5> >::type,
+      typename mpl::at<result_type, mpl::int_<6> >::type,
+      typename mpl::at<result_type, mpl::int_<7> >::type,
+      typename mpl::at<result_type, mpl::int_<8> >::type,
+      typename mpl::at<result_type, mpl::int_<9> >::type,
+      typename mpl::at<result_type, mpl::int_<10> >::type,
+      typename mpl::at<result_type, mpl::int_<11> >::type,
+      typename mpl::at<result_type, mpl::int_<12> >::type > type;
+};
+//
+// Full specialisation to speed up compilation of the common case:
+//
+template <>
+struct normalise<policy<>, 
+          promote_float<false>, 
+          promote_double<false>, 
+          discrete_quantile<>,
+          assert_undefined<>,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy>
+{
+   typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
+};
+
+template <>
+struct normalise<policy<detail::forwarding_arg1, detail::forwarding_arg2>,
+          promote_float<false>,
+          promote_double<false>,
+          discrete_quantile<>,
+          assert_undefined<>,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy>
+{
+   typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
+};
+
+inline policy<> make_policy()
+{ return policy<>(); }
+
+template <class A1>
+inline typename normalise<policy<>, A1>::type make_policy(const A1&)
+{ 
+   typedef typename normalise<policy<>, A1>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2>
+inline typename normalise<policy<>, A1, A2>::type make_policy(const A1&, const A2&)
+{ 
+   typedef typename normalise<policy<>, A1, A2>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3>
+inline typename normalise<policy<>, A1, A2, A3>::type make_policy(const A1&, const A2&, const A3&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4>
+inline typename normalise<policy<>, A1, A2, A3, A4>::type make_policy(const A1&, const A2&, const A3&, const A4&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&)
+{ 
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type result_type;
+   return result_type(); 
+}
+
+template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
+inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&, const A11&)
+{
+   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type result_type;
+   return result_type();
+}
+
+//
+// Traits class to handle internal promotion:
+//
+template <class Real, class Policy>
+struct evaluation
+{
+   typedef Real type;
+};
+
+template <class Policy>
+struct evaluation<float, Policy>
+{
+   typedef typename mpl::if_<typename Policy::promote_float_type, double, float>::type type;
+};
+
+template <class Policy>
+struct evaluation<double, Policy>
+{
+   typedef typename mpl::if_<typename Policy::promote_double_type, long double, double>::type type;
+};
+
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+
+template <class Real>
+struct basic_digits : public mpl::int_<0>{ };
+template <>
+struct basic_digits<float> : public mpl::int_<FLT_MANT_DIG>{ };
+template <>
+struct basic_digits<double> : public mpl::int_<DBL_MANT_DIG>{ };
+template <>
+struct basic_digits<long double> : public mpl::int_<LDBL_MANT_DIG>{ };
+
+template <class Real, class Policy>
+struct precision
+{
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<Real>::radix == 2);
+   typedef typename Policy::precision_type precision_type;
+   typedef basic_digits<Real> digits_t;
+   typedef typename mpl::if_<
+      mpl::equal_to<digits_t, mpl::int_<0> >,
+      // Possibly unknown precision:
+      precision_type,
+      typename mpl::if_<
+         mpl::or_<mpl::less_equal<digits_t, precision_type>, mpl::less_equal<precision_type, mpl::int_<0> > >,
+         // Default case, full precision for RealType:
+         digits2< ::std::numeric_limits<Real>::digits>,
+         // User customised precision:
+         precision_type
+      >::type
+   >::type type;
+};
+
+template <class Policy>
+struct precision<float, Policy>
+{
+   typedef digits2<FLT_MANT_DIG> type;
+};
+template <class Policy>
+struct precision<double, Policy>
+{
+   typedef digits2<DBL_MANT_DIG> type;
+};
+template <class Policy>
+struct precision<long double, Policy>
+{
+   typedef digits2<LDBL_MANT_DIG> type;
+};
+
+#else
+
+template <class Real, class Policy>
+struct precision
+{
+   BOOST_STATIC_ASSERT((::std::numeric_limits<Real>::radix == 2) || ((::std::numeric_limits<Real>::is_specialized == 0) || (::std::numeric_limits<Real>::digits == 0)));
+#ifndef __BORLANDC__
+   typedef typename Policy::precision_type precision_type;
+   typedef typename mpl::if_c<
+      ((::std::numeric_limits<Real>::is_specialized == 0) || (::std::numeric_limits<Real>::digits == 0)),
+      // Possibly unknown precision:
+      precision_type,
+      typename mpl::if_c<
+         ((::std::numeric_limits<Real>::digits <= precision_type::value) 
+         || (Policy::precision_type::value <= 0)),
+         // Default case, full precision for RealType:
+         digits2< ::std::numeric_limits<Real>::digits>,
+         // User customised precision:
+         precision_type
+      >::type
+   >::type type;
+#else
+   typedef typename Policy::precision_type precision_type;
+   typedef mpl::int_< ::std::numeric_limits<Real>::digits> digits_t;
+   typedef mpl::bool_< ::std::numeric_limits<Real>::is_specialized> spec_t;
+   typedef typename mpl::if_<
+      mpl::or_<mpl::equal_to<spec_t, mpl::false_>, mpl::equal_to<digits_t, mpl::int_<0> > >,
+      // Possibly unknown precision:
+      precision_type,
+      typename mpl::if_<
+         mpl::or_<mpl::less_equal<digits_t, precision_type>, mpl::less_equal<precision_type, mpl::int_<0> > >,
+         // Default case, full precision for RealType:
+         digits2< ::std::numeric_limits<Real>::digits>,
+         // User customised precision:
+         precision_type
+      >::type
+   >::type type;
+#endif
+};
+
+#endif
+
+#ifdef BOOST_MATH_USE_FLOAT128
+
+template <class Policy>
+struct precision<BOOST_MATH_FLOAT128_TYPE, Policy>
+{
+   typedef mpl::int_<113> type;
+};
+
+#endif
+
+namespace detail{
+
+template <class T, class Policy>
+inline int digits_imp(mpl::true_ const&)
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   typedef typename boost::math::policies::precision<T, Policy>::type p_t;
+   return p_t::value;
+}
+
+template <class T, class Policy>
+inline int digits_imp(mpl::false_ const&)
+{
+   return tools::digits<T>();
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   typedef mpl::bool_< std::numeric_limits<T>::is_specialized > tag_type;
+   return detail::digits_imp<T, Policy>(tag_type());
+}
+template <class T, class Policy>
+inline int digits_base10(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return boost::math::policies::digits<T, Policy>() * 301 / 1000L;
+}
+
+template <class Policy>
+inline unsigned long get_max_series_iterations()
+{
+   typedef typename Policy::max_series_iterations_type iter_type;
+   return iter_type::value;
+}
+
+template <class Policy>
+inline unsigned long get_max_root_iterations()
+{
+   typedef typename Policy::max_root_iterations_type iter_type;
+   return iter_type::value;
+}
+
+namespace detail{
+
+template <class T, class Digits, class Small, class Default>
+struct series_factor_calc
+{
+   static T get()
+   {
+      return ldexp(T(1.0), 1 - Digits::value);
+   }
+};
+
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::true_, mpl::true_>
+{
+   static T get()
+   {
+      return boost::math::tools::epsilon<T>();
+   }
+};
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::true_, mpl::false_>
+{
+   static T get()
+   {
+      static const boost::uintmax_t v = static_cast<boost::uintmax_t>(1u) << (Digits::value - 1);
+      return 1 / static_cast<T>(v);
+   }
+};
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::false_, mpl::true_>
+{
+   static T get()
+   {
+      return boost::math::tools::epsilon<T>();
+   }
+};
+
+template <class T, class Policy>
+inline T get_epsilon_imp(mpl::true_ const&)
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::radix == 2);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+   BOOST_ASSERT(::std::numeric_limits<T>::radix == 2);
+#endif
+   typedef typename boost::math::policies::precision<T, Policy>::type p_t;
+   typedef mpl::bool_<p_t::value <= std::numeric_limits<boost::uintmax_t>::digits> is_small_int;
+   typedef mpl::bool_<p_t::value >= std::numeric_limits<T>::digits> is_default_value;
+   return series_factor_calc<T, p_t, is_small_int, is_default_value>::get();
+}
+
+template <class T, class Policy>
+inline T get_epsilon_imp(mpl::false_ const&)
+{
+   return tools::epsilon<T>();
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline T get_epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   typedef mpl::bool_< (std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2)) > tag_type;
+   return detail::get_epsilon_imp<T, Policy>(tag_type());
+}
+
+namespace detail{
+
+template <class A1, 
+          class A2, 
+          class A3,
+          class A4,
+          class A5,
+          class A6,
+          class A7,
+          class A8,
+          class A9,
+          class A10,
+          class A11>
+char test_is_policy(const policy<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11>*);
+double test_is_policy(...);
+
+template <class P>
+struct is_policy_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::math::policies::detail::test_is_policy(static_cast<P*>(0))) == 1));
+};
+
+}
+
+template <class P>
+struct is_policy : public mpl::bool_< ::boost::math::policies::detail::is_policy_imp<P>::value> {};
+
+//
+// Helper traits class for distribution error handling:
+//
+template <class Policy>
+struct constructor_error_check
+{
+   typedef typename Policy::domain_error_type domain_error_type;
+   typedef typename mpl::if_c<
+      (domain_error_type::value == throw_on_error) || (domain_error_type::value == user_error),
+      mpl::true_,
+      mpl::false_>::type type;
+};
+
+template <class Policy>
+struct method_error_check
+{
+   typedef typename Policy::domain_error_type domain_error_type;
+   typedef typename mpl::if_c<
+      (domain_error_type::value == throw_on_error) && (domain_error_type::value != user_error),
+      mpl::false_,
+      mpl::true_>::type type;
+};
+
+}}} // namespaces
+
+#endif // BOOST_MATH_POLICY_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/quaternion.hpp b/gatb-core/thirdparty/boost/math/quaternion.hpp
new file mode 100644
index 0000000..d816a76
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/quaternion.hpp
@@ -0,0 +1,1773 @@
+//  boost quaternion.hpp header file
+
+//  (C) Copyright Hubert Holin 2001.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_QUATERNION_HPP
+#define BOOST_QUATERNION_HPP
+
+
+#include <complex>
+#include <iosfwd>                                    // for the "<<" and ">>" operators
+#include <sstream>                                    // for the "<<" operator
+
+#include <boost/config.hpp> // for BOOST_NO_STD_LOCALE
+#include <boost/detail/workaround.hpp>
+#ifndef    BOOST_NO_STD_LOCALE
+    #include <locale>                                    // for the "<<" operator
+#endif /* BOOST_NO_STD_LOCALE */
+
+#include <valarray>
+
+
+
+#include <boost/math/special_functions/sinc.hpp>    // for the Sinus cardinal
+#include <boost/math/special_functions/sinhc.hpp>    // for the Hyperbolic Sinus cardinal
+
+
+namespace boost
+{
+    namespace math
+    {
+
+#define    BOOST_QUATERNION_ACCESSOR_GENERATOR(type)                    \
+            type                    real() const                        \
+            {                                                           \
+                return(a);                                              \
+            }                                                           \
+                                                                        \
+            quaternion<type>        unreal() const                      \
+            {                                                           \
+                return(quaternion<type>(static_cast<type>(0),b,c,d));   \
+            }                                                           \
+                                                                        \
+            type                    R_component_1() const               \
+            {                                                           \
+                return(a);                                              \
+            }                                                           \
+                                                                        \
+            type                    R_component_2() const               \
+            {                                                           \
+                return(b);                                              \
+            }                                                           \
+                                                                        \
+            type                    R_component_3() const               \
+            {                                                           \
+                return(c);                                              \
+            }                                                           \
+                                                                        \
+            type                    R_component_4() const               \
+            {                                                           \
+                return(d);                                              \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>    C_component_1() const               \
+            {                                                           \
+                return(::std::complex<type>(a,b));                      \
+            }                                                           \
+                                                                        \
+            ::std::complex<type>    C_component_2() const               \
+            {                                                           \
+                return(::std::complex<type>(c,d));                      \
+            }
+        
+        
+#define    BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(type)                               \
+            template<typename X>                                                            \
+            quaternion<type> &        operator = (quaternion<X> const  & a_affecter)        \
+            {                                                                               \
+                a = static_cast<type>(a_affecter.R_component_1());                          \
+                b = static_cast<type>(a_affecter.R_component_2());                          \
+                c = static_cast<type>(a_affecter.R_component_3());                          \
+                d = static_cast<type>(a_affecter.R_component_4());                          \
+                                                                                            \
+                return(*this);                                                              \
+            }                                                                               \
+                                                                                            \
+            quaternion<type> &        operator = (quaternion<type> const & a_affecter)      \
+            {                                                                               \
+                a = a_affecter.a;                                                           \
+                b = a_affecter.b;                                                           \
+                c = a_affecter.c;                                                           \
+                d = a_affecter.d;                                                           \
+                                                                                            \
+                return(*this);                                                              \
+            }                                                                               \
+                                                                                            \
+            quaternion<type> &        operator = (type const & a_affecter)                  \
+            {                                                                               \
+                a = a_affecter;                                                             \
+                                                                                            \
+                b = c = d = static_cast<type>(0);                                           \
+                                                                                            \
+                return(*this);                                                              \
+            }                                                                               \
+                                                                                            \
+            quaternion<type> &        operator = (::std::complex<type> const & a_affecter)  \
+            {                                                                               \
+                a = a_affecter.real();                                                      \
+                b = a_affecter.imag();                                                      \
+                                                                                            \
+                c = d = static_cast<type>(0);                                               \
+                                                                                            \
+                return(*this);                                                              \
+            }
+        
+        
+#define    BOOST_QUATERNION_MEMBER_DATA_GENERATOR(type)       \
+            type    a;                                        \
+            type    b;                                        \
+            type    c;                                        \
+            type    d;
+        
+        
+        template<typename T>
+        class quaternion
+        {
+        public:
+            
+            typedef T value_type;
+            
+            
+            // constructor for H seen as R^4
+            // (also default constructor)
+            
+            explicit            quaternion( T const & requested_a = T(),
+                                            T const & requested_b = T(),
+                                            T const & requested_c = T(),
+                                            T const & requested_d = T())
+            :   a(requested_a),
+                b(requested_b),
+                c(requested_c),
+                d(requested_d)
+            {
+                // nothing to do!
+            }
+            
+            
+            // constructor for H seen as C^2
+                
+            explicit            quaternion( ::std::complex<T> const & z0,
+                                            ::std::complex<T> const & z1 = ::std::complex<T>())
+            :   a(z0.real()),
+                b(z0.imag()),
+                c(z1.real()),
+                d(z1.imag())
+            {
+                // nothing to do!
+            }
+            
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            
+            // templated copy constructor
+            
+            template<typename X>
+            explicit            quaternion(quaternion<X> const & a_recopier)
+            :   a(static_cast<T>(a_recopier.R_component_1())),
+                b(static_cast<T>(a_recopier.R_component_2())),
+                c(static_cast<T>(a_recopier.R_component_3())),
+                d(static_cast<T>(a_recopier.R_component_4()))
+            {
+                // nothing to do!
+            }
+            
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            
+            // accessors
+            //
+            // Note:    Like complex number, quaternions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is a quaternion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_QUATERNION_ACCESSOR_GENERATOR(T)
+            
+            // assignment operators
+            
+            BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(T)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Quaternion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);"
+            
+            quaternion<T> &        operator += (T const & rhs)
+            {
+                T    at = a + rhs;    // exception guard
+                
+                a = at;
+                
+                return(*this);
+            }
+            
+            
+            quaternion<T> &        operator += (::std::complex<T> const & rhs)
+            {
+                T    at = a + rhs.real();    // exception guard
+                T    bt = b + rhs.imag();    // exception guard
+                
+                a = at; 
+                b = bt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            quaternion<T> &        operator += (quaternion<X> const & rhs)
+            {
+                T    at = a + static_cast<T>(rhs.R_component_1());    // exception guard
+                T    bt = b + static_cast<T>(rhs.R_component_2());    // exception guard
+                T    ct = c + static_cast<T>(rhs.R_component_3());    // exception guard
+                T    dt = d + static_cast<T>(rhs.R_component_4());    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            
+            quaternion<T> &        operator -= (T const & rhs)
+            {
+                T    at = a - rhs;    // exception guard
+                
+                a = at;
+                
+                return(*this);
+            }
+            
+            
+            quaternion<T> &        operator -= (::std::complex<T> const & rhs)
+            {
+                T    at = a - rhs.real();    // exception guard
+                T    bt = b - rhs.imag();    // exception guard
+                
+                a = at;
+                b = bt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            quaternion<T> &        operator -= (quaternion<X> const & rhs)
+            {
+                T    at = a - static_cast<T>(rhs.R_component_1());    // exception guard
+                T    bt = b - static_cast<T>(rhs.R_component_2());    // exception guard
+                T    ct = c - static_cast<T>(rhs.R_component_3());    // exception guard
+                T    dt = d - static_cast<T>(rhs.R_component_4());    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            quaternion<T> &        operator *= (T const & rhs)
+            {
+                T    at = a * rhs;    // exception guard
+                T    bt = b * rhs;    // exception guard
+                T    ct = c * rhs;    // exception guard
+                T    dt = d * rhs;    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            quaternion<T> &        operator *= (::std::complex<T> const & rhs)
+            {
+                T    ar = rhs.real();
+                T    br = rhs.imag();
+                
+                T    at = +a*ar-b*br;
+                T    bt = +a*br+b*ar;
+                T    ct = +c*ar+d*br;
+                T    dt = -c*br+d*ar;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            quaternion<T> &        operator *= (quaternion<X> const & rhs)
+            {
+                T    ar = static_cast<T>(rhs.R_component_1());
+                T    br = static_cast<T>(rhs.R_component_2());
+                T    cr = static_cast<T>(rhs.R_component_3());
+                T    dr = static_cast<T>(rhs.R_component_4());
+                
+                T    at = +a*ar-b*br-c*cr-d*dr;
+                T    bt = +a*br+b*ar+c*dr-d*cr;    //(a*br+ar*b)+(c*dr-cr*d);
+                T    ct = +a*cr-b*dr+c*ar+d*br;    //(a*cr+ar*c)+(d*br-dr*b);
+                T    dt = +a*dr+b*cr-c*br+d*ar;    //(a*dr+ar*d)+(b*cr-br*c);
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            
+            quaternion<T> &        operator /= (T const & rhs)
+            {
+                T    at = a / rhs;    // exception guard
+                T    bt = b / rhs;    // exception guard
+                T    ct = c / rhs;    // exception guard
+                T    dt = d / rhs;    // exception guard
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            quaternion<T> &        operator /= (::std::complex<T> const & rhs)
+            {
+                T    ar = rhs.real();
+                T    br = rhs.imag();
+                
+                T    denominator = ar*ar+br*br;
+                
+                T    at = (+a*ar+b*br)/denominator;    //(a*ar+b*br)/denominator;
+                T    bt = (-a*br+b*ar)/denominator;    //(ar*b-a*br)/denominator;
+                T    ct = (+c*ar-d*br)/denominator;    //(ar*c-d*br)/denominator;
+                T    dt = (+c*br+d*ar)/denominator;    //(ar*d+br*c)/denominator;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+            template<typename X>
+            quaternion<T> &        operator /= (quaternion<X> const & rhs)
+            {
+                T    ar = static_cast<T>(rhs.R_component_1());
+                T    br = static_cast<T>(rhs.R_component_2());
+                T    cr = static_cast<T>(rhs.R_component_3());
+                T    dr = static_cast<T>(rhs.R_component_4());
+                
+                T    denominator = ar*ar+br*br+cr*cr+dr*dr;
+                
+                T    at = (+a*ar+b*br+c*cr+d*dr)/denominator;    //(a*ar+b*br+c*cr+d*dr)/denominator;
+                T    bt = (-a*br+b*ar-c*dr+d*cr)/denominator;    //((ar*b-a*br)+(cr*d-c*dr))/denominator;
+                T    ct = (-a*cr+b*dr+c*ar-d*br)/denominator;    //((ar*c-a*cr)+(dr*b-d*br))/denominator;
+                T    dt = (-a*dr-b*cr+c*br+d*ar)/denominator;    //((ar*d-a*dr)+(br*c-b*cr))/denominator;
+                
+                a = at;
+                b = bt;
+                c = ct;
+                d = dt;
+                
+                return(*this);
+            }
+            
+            
+        protected:
+            
+            BOOST_QUATERNION_MEMBER_DATA_GENERATOR(T)
+            
+            
+        private:
+            
+        };
+        
+        
+        // declaration of quaternion specialization
+        
+        template<>    class quaternion<float>;
+        template<>    class quaternion<double>;
+        template<>    class quaternion<long double>;
+        
+        
+        // helper templates for converting copy constructors (declaration)
+        
+        namespace detail
+        {
+            
+            template<   typename T,
+                        typename U
+                    >
+            quaternion<T>    quaternion_type_converter(quaternion<U> const & rhs);
+        }
+        
+        
+        // implementation of quaternion specialization
+        
+        
+#define    BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(type)                                                 \
+            explicit            quaternion( type const & requested_a = static_cast<type>(0),            \
+                                            type const & requested_b = static_cast<type>(0),            \
+                                            type const & requested_c = static_cast<type>(0),            \
+                                            type const & requested_d = static_cast<type>(0))            \
+            :   a(requested_a),                                                                         \
+                b(requested_b),                                                                         \
+                c(requested_c),                                                                         \
+                d(requested_d)                                                                          \
+            {                                                                                           \
+            }                                                                                           \
+                                                                                                        \
+            explicit            quaternion( ::std::complex<type> const & z0,                            \
+                                            ::std::complex<type> const & z1 = ::std::complex<type>())   \
+            :   a(z0.real()),                                                                           \
+                b(z0.imag()),                                                                           \
+                c(z1.real()),                                                                           \
+                d(z1.imag())                                                                            \
+            {                                                                                           \
+            }
+        
+        
+#define    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_1(type)             \
+            quaternion<type> &        operator += (type const & rhs) \
+            {                                                        \
+                a += rhs;                                            \
+                                                                     \
+                return(*this);                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_2(type)                             \
+            quaternion<type> &        operator += (::std::complex<type> const & rhs) \
+            {                                                                        \
+                a += rhs.real();                                                     \
+                b += rhs.imag();                                                     \
+                                                                                     \
+                return(*this);                                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_3(type)                      \
+            template<typename X>                                              \
+            quaternion<type> &        operator += (quaternion<X> const & rhs) \
+            {                                                                 \
+                a += static_cast<type>(rhs.R_component_1());                  \
+                b += static_cast<type>(rhs.R_component_2());                  \
+                c += static_cast<type>(rhs.R_component_3());                  \
+                d += static_cast<type>(rhs.R_component_4());                  \
+                                                                              \
+                return(*this);                                                \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_1(type)             \
+            quaternion<type> &        operator -= (type const & rhs) \
+            {                                                        \
+                a -= rhs;                                            \
+                                                                     \
+                return(*this);                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_2(type)                             \
+            quaternion<type> &        operator -= (::std::complex<type> const & rhs) \
+            {                                                                        \
+                a -= rhs.real();                                                     \
+                b -= rhs.imag();                                                     \
+                                                                                     \
+                return(*this);                                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_3(type)                      \
+            template<typename X>                                              \
+            quaternion<type> &        operator -= (quaternion<X> const & rhs) \
+            {                                                                 \
+                a -= static_cast<type>(rhs.R_component_1());                  \
+                b -= static_cast<type>(rhs.R_component_2());                  \
+                c -= static_cast<type>(rhs.R_component_3());                  \
+                d -= static_cast<type>(rhs.R_component_4());                  \
+                                                                              \
+                return(*this);                                                \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_1(type)             \
+            quaternion<type> &        operator *= (type const & rhs) \
+            {                                                        \
+                a *= rhs;                                            \
+                b *= rhs;                                            \
+                c *= rhs;                                            \
+                d *= rhs;                                            \
+                                                                     \
+                return(*this);                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_2(type)                             \
+            quaternion<type> &        operator *= (::std::complex<type> const & rhs) \
+            {                                                                        \
+                type    ar = rhs.real();                                             \
+                type    br = rhs.imag();                                             \
+                                                                                     \
+                type    at = +a*ar-b*br;                                             \
+                type    bt = +a*br+b*ar;                                             \
+                type    ct = +c*ar+d*br;                                             \
+                type    dt = -c*br+d*ar;                                             \
+                                                                                     \
+                a = at;                                                              \
+                b = bt;                                                              \
+                c = ct;                                                              \
+                d = dt;                                                              \
+                                                                                     \
+                return(*this);                                                       \
+            }
+    
+#define    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_3(type)                      \
+            template<typename X>                                              \
+            quaternion<type> &        operator *= (quaternion<X> const & rhs) \
+            {                                                                 \
+                type    ar = static_cast<type>(rhs.R_component_1());          \
+                type    br = static_cast<type>(rhs.R_component_2());          \
+                type    cr = static_cast<type>(rhs.R_component_3());          \
+                type    dr = static_cast<type>(rhs.R_component_4());          \
+                                                                              \
+                type    at = +a*ar-b*br-c*cr-d*dr;                            \
+                type    bt = +a*br+b*ar+c*dr-d*cr;                            \
+                type    ct = +a*cr-b*dr+c*ar+d*br;                            \
+                type    dt = +a*dr+b*cr-c*br+d*ar;                            \
+                                                                              \
+                a = at;                                                       \
+                b = bt;                                                       \
+                c = ct;                                                       \
+                d = dt;                                                       \
+                                                                              \
+                return(*this);                                                \
+            }
+    
+// There is quite a lot of repetition in the code below. This is intentional.
+// The last conditional block is the normal form, and the others merely
+// consist of workarounds for various compiler deficiencies. Hopefuly, when
+// more compilers are conformant and we can retire support for those that are
+// not, we will be able to remove the clutter. This is makes the situation
+// (painfully) explicit.
+    
+#define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_1(type)             \
+            quaternion<type> &        operator /= (type const & rhs) \
+            {                                                        \
+                a /= rhs;                                            \
+                b /= rhs;                                            \
+                c /= rhs;                                            \
+                d /= rhs;                                            \
+                                                                     \
+                return(*this);                                       \
+            }
+
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    #define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_2(type)                         \
+            quaternion<type> &        operator /= (::std::complex<type> const & rhs) \
+            {                                                                        \
+                using    ::std::valarray;                                            \
+                using    ::std::abs;                                                 \
+                                                                                     \
+                valarray<type>    tr(2);                                             \
+                                                                                     \
+                tr[0] = rhs.real();                                                  \
+                tr[1] = rhs.imag();                                                  \
+                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();        \
+                                                                                     \
+                tr *= mixam;                                                         \
+                                                                                     \
+                valarray<type>    tt(4);                                             \
+                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1];                                            \
+                tt[1] = -a*tr[1]+b*tr[0];                                            \
+                tt[2] = +c*tr[0]-d*tr[1];                                            \
+                tt[3] = +c*tr[1]+d*tr[0];                                            \
+                                                                                     \
+                tr *= tr;                                                            \
+                                                                                     \
+                tt *= (mixam/tr.sum());                                              \
+                                                                                     \
+                a = tt[0];                                                           \
+                b = tt[1];                                                           \
+                c = tt[2];                                                           \
+                d = tt[3];                                                           \
+                                                                                     \
+                return(*this);                                                       \
+            }
+#else
+    #define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_2(type)                         \
+            quaternion<type> &        operator /= (::std::complex<type> const & rhs) \
+            {                                                                        \
+                using    ::std::valarray;                                            \
+                                                                                     \
+                valarray<type>    tr(2);                                             \
+                                                                                     \
+                tr[0] = rhs.real();                                                  \
+                tr[1] = rhs.imag();                                                  \
+                                                                                     \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)();        \
+                                                                                     \
+                tr *= mixam;                                                         \
+                                                                                     \
+                valarray<type>    tt(4);                                             \
+                                                                                     \
+                tt[0] = +a*tr[0]+b*tr[1];                                            \
+                tt[1] = -a*tr[1]+b*tr[0];                                            \
+                tt[2] = +c*tr[0]-d*tr[1];                                            \
+                tt[3] = +c*tr[1]+d*tr[0];                                            \
+                                                                                     \
+                tr *= tr;                                                            \
+                                                                                     \
+                tt *= (mixam/tr.sum());                                              \
+                                                                                     \
+                a = tt[0];                                                           \
+                b = tt[1];                                                           \
+                c = tt[2];                                                           \
+                d = tt[3];                                                           \
+                                                                                     \
+                return(*this);                                                       \
+            }
+#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+    
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    #define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type)                  \
+            template<typename X>                                              \
+            quaternion<type> &        operator /= (quaternion<X> const & rhs) \
+            {                                                                 \
+                using    ::std::valarray;                                     \
+                using    ::std::abs;                                          \
+                                                                              \
+                valarray<type>    tr(4);                                      \
+                                                                              \
+                tr[0] = static_cast<type>(rhs.R_component_1());               \
+                tr[1] = static_cast<type>(rhs.R_component_2());               \
+                tr[2] = static_cast<type>(rhs.R_component_3());               \
+                tr[3] = static_cast<type>(rhs.R_component_4());               \
+                                                                              \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)(); \
+                                                                              \
+                tr *= mixam;                                                  \
+                                                                              \
+                valarray<type>    tt(4);                                      \
+                                                                              \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3];                     \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2];                     \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1];                     \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0];                     \
+                                                                              \
+                tr *= tr;                                                     \
+                                                                              \
+                tt *= (mixam/tr.sum());                                       \
+                                                                              \
+                a = tt[0];                                                    \
+                b = tt[1];                                                    \
+                c = tt[2];                                                    \
+                d = tt[3];                                                    \
+                                                                              \
+                return(*this);                                                \
+            }
+#else
+    #define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type)                  \
+            template<typename X>                                              \
+            quaternion<type> &        operator /= (quaternion<X> const & rhs) \
+            {                                                                 \
+                using    ::std::valarray;                                     \
+                                                                              \
+                valarray<type>    tr(4);                                      \
+                                                                              \
+                tr[0] = static_cast<type>(rhs.R_component_1());               \
+                tr[1] = static_cast<type>(rhs.R_component_2());               \
+                tr[2] = static_cast<type>(rhs.R_component_3());               \
+                tr[3] = static_cast<type>(rhs.R_component_4());               \
+                                                                              \
+                type            mixam = static_cast<type>(1)/(abs(tr).max)(); \
+                                                                              \
+                tr *= mixam;                                                  \
+                                                                              \
+                valarray<type>    tt(4);                                      \
+                                                                              \
+                tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3];                     \
+                tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2];                     \
+                tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1];                     \
+                tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0];                     \
+                                                                              \
+                tr *= tr;                                                     \
+                                                                              \
+                tt *= (mixam/tr.sum());                                       \
+                                                                              \
+                a = tt[0];                                                    \
+                b = tt[1];                                                    \
+                c = tt[2];                                                    \
+                d = tt[3];                                                    \
+                                                                              \
+                return(*this);                                                \
+            }
+#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+    
+#define    BOOST_QUATERNION_MEMBER_ADD_GENERATOR(type)   \
+        BOOST_QUATERNION_MEMBER_ADD_GENERATOR_1(type)    \
+        BOOST_QUATERNION_MEMBER_ADD_GENERATOR_2(type)    \
+        BOOST_QUATERNION_MEMBER_ADD_GENERATOR_3(type)
+        
+#define    BOOST_QUATERNION_MEMBER_SUB_GENERATOR(type)   \
+        BOOST_QUATERNION_MEMBER_SUB_GENERATOR_1(type)    \
+        BOOST_QUATERNION_MEMBER_SUB_GENERATOR_2(type)    \
+        BOOST_QUATERNION_MEMBER_SUB_GENERATOR_3(type)
+        
+#define    BOOST_QUATERNION_MEMBER_MUL_GENERATOR(type)   \
+        BOOST_QUATERNION_MEMBER_MUL_GENERATOR_1(type)    \
+        BOOST_QUATERNION_MEMBER_MUL_GENERATOR_2(type)    \
+        BOOST_QUATERNION_MEMBER_MUL_GENERATOR_3(type)
+        
+#define    BOOST_QUATERNION_MEMBER_DIV_GENERATOR(type)   \
+        BOOST_QUATERNION_MEMBER_DIV_GENERATOR_1(type)    \
+        BOOST_QUATERNION_MEMBER_DIV_GENERATOR_2(type)    \
+        BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type)
+        
+#define    BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(type)   \
+        BOOST_QUATERNION_MEMBER_ADD_GENERATOR(type)            \
+        BOOST_QUATERNION_MEMBER_SUB_GENERATOR(type)            \
+        BOOST_QUATERNION_MEMBER_MUL_GENERATOR(type)            \
+        BOOST_QUATERNION_MEMBER_DIV_GENERATOR(type)
+        
+        
+        template<>
+        class quaternion<float>
+        {
+        public:
+            
+            typedef float value_type;
+            
+            BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(float)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // explicit copy constructors (precision-loosing converters)
+            
+            explicit            quaternion(quaternion<double> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<float, double>(a_recopier);
+            }
+            
+            explicit            quaternion(quaternion<long double> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<float, long double>(a_recopier);
+            }
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, quaternions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is a quaternion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_QUATERNION_ACCESSOR_GENERATOR(float)
+            
+            // assignment operators
+            
+            BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(float)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Quaternion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);"
+            
+            BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(float)
+            
+            
+        protected:
+            
+            BOOST_QUATERNION_MEMBER_DATA_GENERATOR(float)
+            
+            
+        private:
+            
+        };
+        
+        
+        template<>
+        class quaternion<double>
+        {
+        public:
+            
+            typedef double value_type;
+            
+            BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(double)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // converting copy constructor
+            
+            explicit                quaternion(quaternion<float> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<double, float>(a_recopier);
+            }
+            
+            // explicit copy constructors (precision-loosing converters)
+            
+            explicit                quaternion(quaternion<long double> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<double, long double>(a_recopier);
+            }
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, quaternions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is a quaternion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_QUATERNION_ACCESSOR_GENERATOR(double)
+            
+            // assignment operators
+            
+            BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(double)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Quaternion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);"
+            
+            BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(double)
+            
+            
+        protected:
+            
+            BOOST_QUATERNION_MEMBER_DATA_GENERATOR(double)
+            
+            
+        private:
+            
+        };
+        
+        
+        template<>
+        class quaternion<long double>
+        {
+        public:
+            
+            typedef long double value_type;
+            
+            BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(long double)
+            
+            // UNtemplated copy constructor
+            // (this is taken care of by the compiler itself)
+            
+            // converting copy constructors
+            
+            explicit                    quaternion(quaternion<float> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<long double, float>(a_recopier);
+            }
+            
+            explicit                    quaternion(quaternion<double> const & a_recopier)
+            {
+                *this = detail::quaternion_type_converter<long double, double>(a_recopier);
+            }
+            
+            // destructor
+            // (this is taken care of by the compiler itself)
+            
+            // accessors
+            //
+            // Note:    Like complex number, quaternions do have a meaningful notion of "real part",
+            //            but unlike them there is no meaningful notion of "imaginary part".
+            //            Instead there is an "unreal part" which itself is a quaternion, and usually
+            //            nothing simpler (as opposed to the complex number case).
+            //            However, for practicallity, there are accessors for the other components
+            //            (these are necessary for the templated copy constructor, for instance).
+            
+            BOOST_QUATERNION_ACCESSOR_GENERATOR(long double)
+            
+            // assignment operators
+            
+            BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(long double)
+            
+            // other assignment-related operators
+            //
+            // NOTE:    Quaternion multiplication is *NOT* commutative;
+            //            symbolically, "q *= rhs;" means "q = q * rhs;"
+            //            and "q /= rhs;" means "q = q * inverse_of(rhs);"
+            
+            BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(long double)
+            
+            
+        protected:
+            
+            BOOST_QUATERNION_MEMBER_DATA_GENERATOR(long double)
+            
+            
+        private:
+            
+        };
+        
+        
+#undef    BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR
+#undef    BOOST_QUATERNION_MEMBER_ADD_GENERATOR
+#undef    BOOST_QUATERNION_MEMBER_SUB_GENERATOR
+#undef    BOOST_QUATERNION_MEMBER_MUL_GENERATOR
+#undef    BOOST_QUATERNION_MEMBER_DIV_GENERATOR
+#undef    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_1
+#undef    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_2
+#undef    BOOST_QUATERNION_MEMBER_ADD_GENERATOR_3
+#undef    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_1
+#undef    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_2
+#undef    BOOST_QUATERNION_MEMBER_SUB_GENERATOR_3
+#undef    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_1
+#undef    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_2
+#undef    BOOST_QUATERNION_MEMBER_MUL_GENERATOR_3
+#undef    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_1
+#undef    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_2
+#undef    BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3
+        
+#undef    BOOST_QUATERNION_CONSTRUCTOR_GENERATOR
+        
+        
+#undef    BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR
+        
+#undef    BOOST_QUATERNION_MEMBER_DATA_GENERATOR
+        
+#undef    BOOST_QUATERNION_ACCESSOR_GENERATOR
+        
+        
+        // operators
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)      \
+        {                                                    \
+            quaternion<T>    res(lhs);                       \
+            res op##= rhs;                                   \
+            return(res);                                     \
+        }
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_1_L(op)                                                  \
+        template<typename T>                                                                            \
+        inline quaternion<T>    operator op (T const & lhs, quaternion<T> const & rhs)                  \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_1_R(op)                                                  \
+        template<typename T>                                                                            \
+        inline quaternion<T>    operator op (quaternion<T> const & lhs, T const & rhs)                  \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_2_L(op)                                                  \
+        template<typename T>                                                                            \
+        inline quaternion<T>    operator op (::std::complex<T> const & lhs, quaternion<T> const & rhs)  \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_2_R(op)                                                  \
+        template<typename T>                                                                            \
+        inline quaternion<T>    operator op (quaternion<T> const & lhs, ::std::complex<T> const & rhs)  \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR_3(op)                                                    \
+        template<typename T>                                                                            \
+        inline quaternion<T>    operator op (quaternion<T> const & lhs, quaternion<T> const & rhs)      \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_BODY(op)
+        
+#define    BOOST_QUATERNION_OPERATOR_GENERATOR(op)     \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_1_L(op)    \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_1_R(op)    \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_2_L(op)    \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_2_R(op)    \
+        BOOST_QUATERNION_OPERATOR_GENERATOR_3(op)
+        
+        
+        BOOST_QUATERNION_OPERATOR_GENERATOR(+)
+        BOOST_QUATERNION_OPERATOR_GENERATOR(-)
+        BOOST_QUATERNION_OPERATOR_GENERATOR(*)
+        BOOST_QUATERNION_OPERATOR_GENERATOR(/)
+
+
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR
+        
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_1_L
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_1_R
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_2_L
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_2_R
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_3
+
+#undef    BOOST_QUATERNION_OPERATOR_GENERATOR_BODY
+        
+        
+        template<typename T>
+        inline quaternion<T>                    operator + (quaternion<T> const & q)
+        {
+            return(q);
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    operator - (quaternion<T> const & q)
+        {
+            return(quaternion<T>(-q.R_component_1(),-q.R_component_2(),-q.R_component_3(),-q.R_component_4()));
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (T const & lhs, quaternion<T> const & rhs)
+        {
+            return    (
+                        (rhs.R_component_1() == lhs)&&
+                        (rhs.R_component_2() == static_cast<T>(0))&&
+                        (rhs.R_component_3() == static_cast<T>(0))&&
+                        (rhs.R_component_4() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (quaternion<T> const & lhs, T const & rhs)
+        {
+            return    (
+                        (lhs.R_component_1() == rhs)&&
+                        (lhs.R_component_2() == static_cast<T>(0))&&
+                        (lhs.R_component_3() == static_cast<T>(0))&&
+                        (lhs.R_component_4() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (::std::complex<T> const & lhs, quaternion<T> const & rhs)
+        {
+            return    (
+                        (rhs.R_component_1() == lhs.real())&&
+                        (rhs.R_component_2() == lhs.imag())&&
+                        (rhs.R_component_3() == static_cast<T>(0))&&
+                        (rhs.R_component_4() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (quaternion<T> const & lhs, ::std::complex<T> const & rhs)
+        {
+            return    (
+                        (lhs.R_component_1() == rhs.real())&&
+                        (lhs.R_component_2() == rhs.imag())&&
+                        (lhs.R_component_3() == static_cast<T>(0))&&
+                        (lhs.R_component_4() == static_cast<T>(0))
+                    );
+        }
+        
+        
+        template<typename T>
+        inline bool                                operator == (quaternion<T> const & lhs, quaternion<T> const & rhs)
+        {
+            return    (
+                        (rhs.R_component_1() == lhs.R_component_1())&&
+                        (rhs.R_component_2() == lhs.R_component_2())&&
+                        (rhs.R_component_3() == lhs.R_component_3())&&
+                        (rhs.R_component_4() == lhs.R_component_4())
+                    );
+        }
+        
+        
+#define    BOOST_QUATERNION_NOT_EQUAL_GENERATOR  \
+        {                                        \
+            return(!(lhs == rhs));               \
+        }
+        
+        template<typename T>
+        inline bool                                operator != (T const & lhs, quaternion<T> const & rhs)
+        BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (quaternion<T> const & lhs, T const & rhs)
+        BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (::std::complex<T> const & lhs, quaternion<T> const & rhs)
+        BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (quaternion<T> const & lhs, ::std::complex<T> const & rhs)
+        BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+        template<typename T>
+        inline bool                                operator != (quaternion<T> const & lhs, quaternion<T> const & rhs)
+        BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+#undef    BOOST_QUATERNION_NOT_EQUAL_GENERATOR
+        
+        
+        // Note:    we allow the following formats, whith a, b, c, and d reals
+        //            a
+        //            (a), (a,b), (a,b,c), (a,b,c,d)
+        //            (a,(c)), (a,(c,d)), ((a)), ((a),c), ((a),(c)), ((a),(c,d)), ((a,b)), ((a,b),c), ((a,b),(c)), ((a,b),(c,d))
+        template<typename T, typename charT, class traits>
+        ::std::basic_istream<charT,traits> &    operator >> (    ::std::basic_istream<charT,traits> & is,
+                                                                quaternion<T> & q)
+        {
+            
+#ifdef    BOOST_NO_STD_LOCALE
+#else
+            const ::std::ctype<charT> & ct = ::std::use_facet< ::std::ctype<charT> >(is.getloc());
+#endif /* BOOST_NO_STD_LOCALE */
+            
+            T    a = T();
+            T    b = T();
+            T    c = T();
+            T    d = T();
+            
+            ::std::complex<T>    u = ::std::complex<T>();
+            ::std::complex<T>    v = ::std::complex<T>();
+            
+            charT    ch = charT();
+            char    cc;
+            
+            is >> ch;                                        // get the first lexeme
+            
+            if    (!is.good())    goto finish;
+            
+#ifdef    BOOST_NO_STD_LOCALE
+            cc = ch;
+#else
+            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+            
+            if    (cc == '(')                            // read "(", possible: (a), (a,b), (a,b,c), (a,b,c,d), (a,(c)), (a,(c,d)), ((a)), ((a),c), ((a),(c)), ((a),(c,d)), ((a,b)), ((a,b),c), ((a,b),(c)), ((a,b,),(c,d,))
+            {
+                is >> ch;                                    // get the second lexeme
+                
+                if    (!is.good())    goto finish;
+                
+#ifdef    BOOST_NO_STD_LOCALE
+                cc = ch;
+#else
+                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                
+                if    (cc == '(')                        // read "((", possible: ((a)), ((a),c), ((a),(c)), ((a),(c,d)), ((a,b)), ((a,b),c), ((a,b),(c)), ((a,b,),(c,d,))
+                {
+                    is.putback(ch);
+                    
+                    is >> u;                                // we extract the first and second components
+                    a = u.real();
+                    b = u.imag();
+                    
+                    if    (!is.good())    goto finish;
+                    
+                    is >> ch;                                // get the next lexeme
+                    
+                    if    (!is.good())    goto finish;
+                    
+#ifdef    BOOST_NO_STD_LOCALE
+                    cc = ch;
+#else
+                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                    
+                    if        (cc == ')')                    // format: ((a)) or ((a,b))
+                    {
+                        q = quaternion<T>(a,b);
+                    }
+                    else if    (cc == ',')                // read "((a)," or "((a,b),", possible: ((a),c), ((a),(c)), ((a),(c,d)), ((a,b),c), ((a,b),(c)), ((a,b,),(c,d,))
+                    {
+                        is >> v;                            // we extract the third and fourth components
+                        c = v.real();
+                        d = v.imag();
+                        
+                        if    (!is.good())    goto finish;
+                        
+                        is >> ch;                                // get the last lexeme
+                        
+                        if    (!is.good())    goto finish;
+                        
+#ifdef    BOOST_NO_STD_LOCALE
+                        cc = ch;
+#else
+                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                        if    (cc == ')')                    // format: ((a),c), ((a),(c)), ((a),(c,d)), ((a,b),c), ((a,b),(c)) or ((a,b,),(c,d,))
+                        {
+                            q = quaternion<T>(a,b,c,d);
+                        }
+                        else                            // error
+                        {
+                            is.setstate(::std::ios_base::failbit);
+                        }
+                    }
+                    else                                // error
+                    {
+                        is.setstate(::std::ios_base::failbit);
+                    }
+                }
+                else                                // read "(a", possible: (a), (a,b), (a,b,c), (a,b,c,d), (a,(c)), (a,(c,d))
+                {
+                    is.putback(ch);
+                    
+                    is >> a;                                // we extract the first component
+                    
+                    if    (!is.good())    goto finish;
+                    
+                    is >> ch;                                // get the third lexeme
+                    
+                    if    (!is.good())    goto finish;
+                    
+#ifdef    BOOST_NO_STD_LOCALE
+                    cc = ch;
+#else
+                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                    
+                    if        (cc == ')')                    // format: (a)
+                    {
+                        q = quaternion<T>(a);
+                    }
+                    else if    (cc == ',')                // read "(a,", possible: (a,b), (a,b,c), (a,b,c,d), (a,(c)), (a,(c,d))
+                    {
+                        is >> ch;                            // get the fourth lexeme
+                        
+                        if    (!is.good())    goto finish;
+                        
+#ifdef    BOOST_NO_STD_LOCALE
+                        cc = ch;
+#else
+                        cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                        
+                        if    (cc == '(')                // read "(a,(", possible: (a,(c)), (a,(c,d))
+                        {
+                            is.putback(ch);
+                            
+                            is >> v;                        // we extract the third and fourth component
+                            
+                            c = v.real();
+                            d = v.imag();
+                            
+                            if    (!is.good())    goto finish;
+                            
+                            is >> ch;                        // get the ninth lexeme
+                            
+                            if    (!is.good())    goto finish;
+                            
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if    (cc == ')')                // format: (a,(c)) or (a,(c,d))
+                            {
+                                q = quaternion<T>(a,b,c,d);
+                            }
+                            else                        // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                        else                        // read "(a,b", possible: (a,b), (a,b,c), (a,b,c,d)
+                        {
+                            is.putback(ch);
+                            
+                            is >> b;                        // we extract the second component
+                            
+                            if    (!is.good())    goto finish;
+                            
+                            is >> ch;                        // get the fifth lexeme
+                            
+                            if    (!is.good())    goto finish;
+                            
+#ifdef    BOOST_NO_STD_LOCALE
+                            cc = ch;
+#else
+                            cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                            
+                            if    (cc == ')')                // format: (a,b)
+                            {
+                                q = quaternion<T>(a,b);
+                            }
+                            else if    (cc == ',')        // read "(a,b,", possible: (a,b,c), (a,b,c,d)
+                            {
+                                is >> c;                    // we extract the third component
+                                
+                                if    (!is.good())    goto finish;
+                                
+                                is >> ch;                    // get the seventh lexeme
+                                
+                                if    (!is.good())    goto finish;
+                                
+#ifdef    BOOST_NO_STD_LOCALE
+                                cc = ch;
+#else
+                                cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                
+                                if        (cc == ')')        // format: (a,b,c)
+                                {
+                                    q = quaternion<T>(a,b,c);
+                                }
+                                else if    (cc == ',')    // read "(a,b,c,", possible: (a,b,c,d)
+                                {
+                                    is >> d;                // we extract the fourth component
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+                                    is >> ch;                // get the ninth lexeme
+                                    
+                                    if    (!is.good())    goto finish;
+                                    
+#ifdef    BOOST_NO_STD_LOCALE
+                                    cc = ch;
+#else
+                                    cc = ct.narrow(ch, char());
+#endif /* BOOST_NO_STD_LOCALE */
+                                    
+                                    if    (cc == ')')        // format: (a,b,c,d)
+                                    {
+                                        q = quaternion<T>(a,b,c,d);
+                                    }
+                                    else                // error
+                                    {
+                                        is.setstate(::std::ios_base::failbit);
+                                    }
+                                }
+                                else                    // error
+                                {
+                                    is.setstate(::std::ios_base::failbit);
+                                }
+                            }
+                            else                        // error
+                            {
+                                is.setstate(::std::ios_base::failbit);
+                            }
+                        }
+                    }
+                    else                                // error
+                    {
+                        is.setstate(::std::ios_base::failbit);
+                    }
+                }
+            }
+            else                                        // format:    a
+            {
+                is.putback(ch);
+                
+                is >> a;                                    // we extract the first component
+                
+                if    (!is.good())    goto finish;
+                
+                q = quaternion<T>(a);
+            }
+            
+            finish:
+            return(is);
+        }
+        
+        
+        template<typename T, typename charT, class traits>
+        ::std::basic_ostream<charT,traits> &    operator << (    ::std::basic_ostream<charT,traits> & os,
+                                                                quaternion<T> const & q)
+        {
+            ::std::basic_ostringstream<charT,traits>    s;
+
+            s.flags(os.flags());
+#ifdef    BOOST_NO_STD_LOCALE
+#else
+            s.imbue(os.getloc());
+#endif /* BOOST_NO_STD_LOCALE */
+            s.precision(os.precision());
+            
+            s << '('    << q.R_component_1() << ','
+                        << q.R_component_2() << ','
+                        << q.R_component_3() << ','
+                        << q.R_component_4() << ')';
+            
+            return os << s.str();
+        }
+        
+        
+        // values
+        
+        template<typename T>
+        inline T                                real(quaternion<T> const & q)
+        {
+            return(q.real());
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    unreal(quaternion<T> const & q)
+        {
+            return(q.unreal());
+        }
+        
+        
+#define    BOOST_QUATERNION_VALARRAY_LOADER  \
+            using    ::std::valarray;        \
+                                             \
+            valarray<T>    temp(4);          \
+                                             \
+            temp[0] = q.R_component_1();     \
+            temp[1] = q.R_component_2();     \
+            temp[2] = q.R_component_3();     \
+            temp[3] = q.R_component_4();
+        
+        
+        template<typename T>
+        inline T                                sup(quaternion<T> const & q)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            BOOST_QUATERNION_VALARRAY_LOADER
+            
+            return((abs(temp).max)());
+        }
+        
+        
+        template<typename T>
+        inline T                                l1(quaternion<T> const & q)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            BOOST_QUATERNION_VALARRAY_LOADER
+            
+            return(abs(temp).sum());
+        }
+        
+        
+        template<typename T>
+        inline T                                abs(quaternion<T> const & q)
+        {
+#ifdef    BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
+            using    ::std::abs;
+#endif    /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
+            
+            using    ::std::sqrt;
+            
+            BOOST_QUATERNION_VALARRAY_LOADER
+            
+            T            maxim = (abs(temp).max)();    // overflow protection
+            
+            if    (maxim == static_cast<T>(0))
+            {
+                return(maxim);
+            }
+            else
+            {
+                T    mixam = static_cast<T>(1)/maxim;    // prefer multiplications over divisions
+                
+                temp *= mixam;
+                
+                temp *= temp;
+                
+                return(maxim*sqrt(temp.sum()));
+            }
+            
+            //return(sqrt(norm(q)));
+        }
+        
+        
+#undef    BOOST_QUATERNION_VALARRAY_LOADER
+        
+        
+        // Note:    This is the Cayley norm, not the Euclidian norm...
+        
+        template<typename T>
+        inline T                                norm(quaternion<T>const  & q)
+        {
+            return(real(q*conj(q)));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    conj(quaternion<T> const & q)
+        {
+            return(quaternion<T>(   +q.R_component_1(),
+                                    -q.R_component_2(),
+                                    -q.R_component_3(),
+                                    -q.R_component_4()));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    spherical(  T const & rho,
+                                                            T const & theta,
+                                                            T const & phi1,
+                                                            T const & phi2)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            //T    a = cos(theta)*cos(phi1)*cos(phi2);
+            //T    b = sin(theta)*cos(phi1)*cos(phi2);
+            //T    c = sin(phi1)*cos(phi2);
+            //T    d = sin(phi2);
+            
+            T    courrant = static_cast<T>(1);
+            
+            T    d = sin(phi2);
+            
+            courrant *= cos(phi2);
+            
+            T    c = sin(phi1)*courrant;
+            
+            courrant *= cos(phi1);
+            
+            T    b = sin(theta)*courrant;
+            T    a = cos(theta)*courrant;
+            
+            return(rho*quaternion<T>(a,b,c,d));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    semipolar(  T const & rho,
+                                                            T const & alpha,
+                                                            T const & theta1,
+                                                            T const & theta2)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            T    a = cos(alpha)*cos(theta1);
+            T    b = cos(alpha)*sin(theta1);
+            T    c = sin(alpha)*cos(theta2);
+            T    d = sin(alpha)*sin(theta2);
+            
+            return(rho*quaternion<T>(a,b,c,d));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    multipolar( T const & rho1,
+                                                            T const & theta1,
+                                                            T const & rho2,
+                                                            T const & theta2)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            T    a = rho1*cos(theta1);
+            T    b = rho1*sin(theta1);
+            T    c = rho2*cos(theta2);
+            T    d = rho2*sin(theta2);
+            
+            return(quaternion<T>(a,b,c,d));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    cylindrospherical(  T const & t,
+                                                                    T const & radius,
+                                                                    T const & longitude,
+                                                                    T const & latitude)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            
+            
+            T    b = radius*cos(longitude)*cos(latitude);
+            T    c = radius*sin(longitude)*cos(latitude);
+            T    d = radius*sin(latitude);
+            
+            return(quaternion<T>(t,b,c,d));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    cylindrical(T const & r,
+                                                            T const & angle,
+                                                            T const & h1,
+                                                            T const & h2)
+        {
+            using ::std::cos;
+            using ::std::sin;
+            
+            T    a = r*cos(angle);
+            T    b = r*sin(angle);
+            
+            return(quaternion<T>(a,b,h1,h2));
+        }
+        
+        
+        // transcendentals
+        // (please see the documentation)
+        
+        
+        template<typename T>
+        inline quaternion<T>                    exp(quaternion<T> const & q)
+        {
+            using    ::std::exp;
+            using    ::std::cos;
+            
+            using    ::boost::math::sinc_pi;
+            
+            T    u = exp(real(q));
+            
+            T    z = abs(unreal(q));
+            
+            T    w = sinc_pi(z);
+            
+            return(u*quaternion<T>(cos(z),
+                w*q.R_component_2(), w*q.R_component_3(),
+                w*q.R_component_4()));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    cos(quaternion<T> const & q)
+        {
+            using    ::std::sin;
+            using    ::std::cos;
+            using    ::std::cosh;
+            
+            using    ::boost::math::sinhc_pi;
+            
+            T    z = abs(unreal(q));
+            
+            T    w = -sin(q.real())*sinhc_pi(z);
+            
+            return(quaternion<T>(cos(q.real())*cosh(z),
+                w*q.R_component_2(), w*q.R_component_3(),
+                w*q.R_component_4()));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    sin(quaternion<T> const & q)
+        {
+            using    ::std::sin;
+            using    ::std::cos;
+            using    ::std::cosh;
+            
+            using    ::boost::math::sinhc_pi;
+            
+            T    z = abs(unreal(q));
+            
+            T    w = +cos(q.real())*sinhc_pi(z);
+            
+            return(quaternion<T>(sin(q.real())*cosh(z),
+                w*q.R_component_2(), w*q.R_component_3(),
+                w*q.R_component_4()));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    tan(quaternion<T> const & q)
+        {
+            return(sin(q)/cos(q));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    cosh(quaternion<T> const & q)
+        {
+            return((exp(+q)+exp(-q))/static_cast<T>(2));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    sinh(quaternion<T> const & q)
+        {
+            return((exp(+q)-exp(-q))/static_cast<T>(2));
+        }
+        
+        
+        template<typename T>
+        inline quaternion<T>                    tanh(quaternion<T> const & q)
+        {
+            return(sinh(q)/cosh(q));
+        }
+        
+        
+        template<typename T>
+        quaternion<T>                            pow(quaternion<T> const & q,
+                                                    int n)
+        {
+            if        (n > 1)
+            {
+                int    m = n>>1;
+                
+                quaternion<T>    result = pow(q, m);
+                
+                result *= result;
+                
+                if    (n != (m<<1))
+                {
+                    result *= q; // n odd
+                }
+                
+                return(result);
+            }
+            else if    (n == 1)
+            {
+                return(q);
+            }
+            else if    (n == 0)
+            {
+                return(quaternion<T>(static_cast<T>(1)));
+            }
+            else    /* n < 0 */
+            {
+                return(pow(quaternion<T>(static_cast<T>(1))/q,-n));
+            }
+        }
+        
+        
+        // helper templates for converting copy constructors (definition)
+        
+        namespace detail
+        {
+            
+            template<   typename T,
+                        typename U
+                    >
+            quaternion<T>    quaternion_type_converter(quaternion<U> const & rhs)
+            {
+                return(quaternion<T>(   static_cast<T>(rhs.R_component_1()),
+                                        static_cast<T>(rhs.R_component_2()),
+                                        static_cast<T>(rhs.R_component_3()),
+                                        static_cast<T>(rhs.R_component_4())));
+            }
+        }
+    }
+}
+
+#endif /* BOOST_QUATERNION_HPP */
diff --git a/gatb-core/thirdparty/boost/math/special_functions.hpp b/gatb-core/thirdparty/boost/math/special_functions.hpp
new file mode 100644
index 0000000..52e412e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions.hpp
@@ -0,0 +1,71 @@
+//  Copyright John Maddock 2006, 2007, 2012, 2014.
+//  Copyright Paul A. Bristow 2006, 2007, 2012
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This file includes *all* the special functions.
+// this may be useful if many are used
+// - to avoid including each function individually.
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_HPP
+#define BOOST_MATH_SPECIAL_FUNCTIONS_HPP
+
+#include <boost/math/special_functions/airy.hpp>
+#include <boost/math/special_functions/acosh.hpp>
+#include <boost/math/special_functions/asinh.hpp>
+#include <boost/math/special_functions/atanh.hpp>
+#include <boost/math/special_functions/bernoulli.hpp>
+#include <boost/math/special_functions/bessel.hpp>
+#include <boost/math/special_functions/bessel_prime.hpp>
+#include <boost/math/special_functions/beta.hpp>
+#include <boost/math/special_functions/binomial.hpp>
+#include <boost/math/special_functions/cbrt.hpp>
+#include <boost/math/special_functions/cos_pi.hpp>
+#include <boost/math/special_functions/digamma.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/ellint_2.hpp>
+#include <boost/math/special_functions/ellint_3.hpp>
+#include <boost/math/special_functions/ellint_d.hpp>
+#include <boost/math/special_functions/jacobi_zeta.hpp>
+#include <boost/math/special_functions/heuman_lambda.hpp>
+#include <boost/math/special_functions/ellint_rc.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_rg.hpp>
+#include <boost/math/special_functions/erf.hpp>
+#include <boost/math/special_functions/expint.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/hermite.hpp>
+#include <boost/math/special_functions/hypot.hpp>
+#include <boost/math/special_functions/jacobi_elliptic.hpp>
+#include <boost/math/special_functions/laguerre.hpp>
+#include <boost/math/special_functions/lanczos.hpp>
+#include <boost/math/special_functions/legendre.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/next.hpp>
+#include <boost/math/special_functions/owens_t.hpp>
+#include <boost/math/special_functions/polygamma.hpp>
+#include <boost/math/special_functions/powm1.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/sin_pi.hpp>
+#include <boost/math/special_functions/sinc.hpp>
+#include <boost/math/special_functions/sinhc.hpp>
+#include <boost/math/special_functions/spherical_harmonic.hpp>
+#include <boost/math/special_functions/sqrt1pm1.hpp>
+#include <boost/math/special_functions/zeta.hpp>
+#include <boost/math/special_functions/modf.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/pow.hpp>
+#include <boost/math/special_functions/next.hpp>
+#include <boost/math/special_functions/owens_t.hpp>
+#include <boost/math/special_functions/hankel.hpp>
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/acosh.hpp b/gatb-core/thirdparty/boost/math/special_functions/acosh.hpp
new file mode 100644
index 0000000..0af5c94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/acosh.hpp
@@ -0,0 +1,104 @@
+//    boost asinh.hpp header file
+
+//  (C) Copyright Eric Ford 2001 & Hubert Holin.
+//  (C) Copyright John Maddock 2008.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_ACOSH_HPP
+#define BOOST_ACOSH_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/constants/constants.hpp>
+
+// This is the inverse of the hyperbolic cosine function.
+
+namespace boost
+{
+    namespace math
+    {
+       namespace detail
+       {
+        template<typename T, typename Policy>
+        inline T    acosh_imp(const T x, const Policy& pol)
+        {
+            BOOST_MATH_STD_USING
+            
+            if(x < 1)
+            {
+               return policies::raise_domain_error<T>(
+                  "boost::math::acosh<%1%>(%1%)",
+                  "acosh requires x >= 1, but got x = %1%.", x, pol);
+            }
+            else if    ((x - 1) >= tools::root_epsilon<T>())
+            {
+                if    (x > 1 / tools::root_epsilon<T>())
+                {
+                    // http://functions.wolfram.com/ElementaryFunctions/ArcCosh/06/01/06/01/0001/
+                    // approximation by laurent series in 1/x at 0+ order from -1 to 0
+                    return log(x) + constants::ln_two<T>();
+                }
+                else if(x < 1.5f)
+                {
+                   // This is just a rearrangement of the standard form below
+                   // devised to minimse loss of precision when x ~ 1:
+                   T y = x - 1;
+                   return boost::math::log1p(y + sqrt(y * y + 2 * y), pol);
+                }
+                else
+                {
+                    // http://functions.wolfram.com/ElementaryFunctions/ArcCosh/02/
+                    return( log( x + sqrt(x * x - 1) ) );
+                }
+            }
+            else
+            {
+                // see http://functions.wolfram.com/ElementaryFunctions/ArcCosh/06/01/04/01/0001/
+                T y = x - 1;
+                
+                // approximation by taylor series in y at 0 up to order 2
+                T result = sqrt(2 * y) * (1 - y /12 + 3 * y * y / 160);
+                return result;
+            }
+        }
+       }
+
+        template<typename T, typename Policy>
+        inline typename tools::promote_args<T>::type acosh(T x, const Policy&)
+        {
+            typedef typename tools::promote_args<T>::type result_type;
+            typedef typename policies::evaluation<result_type, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+           return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+              detail::acosh_imp(static_cast<value_type>(x), forwarding_policy()),
+              "boost::math::acosh<%1%>(%1%)");
+        }
+        template<typename T>
+        inline typename tools::promote_args<T>::type acosh(T x)
+        {
+           return boost::math::acosh(x, policies::policy<>());
+        }
+
+    }
+}
+
+#endif /* BOOST_ACOSH_HPP */
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/airy.hpp b/gatb-core/thirdparty/boost/math/special_functions/airy.hpp
new file mode 100644
index 0000000..e84a705
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/airy.hpp
@@ -0,0 +1,469 @@
+// Copyright John Maddock 2012.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_AIRY_HPP
+#define BOOST_MATH_AIRY_HPP
+
+#include <limits>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/bessel.hpp>
+#include <boost/math/special_functions/cbrt.hpp>
+#include <boost/math/special_functions/detail/airy_ai_bi_zero.hpp>
+#include <boost/math/tools/roots.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T, class Policy>
+T airy_ai_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(x < 0)
+   {
+      T p = (-x * sqrt(-x) * 2) / 3;
+      T v = T(1) / 3;
+      T j1 = boost::math::cyl_bessel_j(v, p, pol);
+      T j2 = boost::math::cyl_bessel_j(-v, p, pol);
+      T ai = sqrt(-x) * (j1 + j2) / 3;
+      //T bi = sqrt(-x / 3) * (j2 - j1);
+      return ai;
+   }
+   else if(fabs(x * x * x) / 6 < tools::epsilon<T>())
+   {
+      T tg = boost::math::tgamma(constants::twothirds<T>(), pol);
+      T ai = 1 / (pow(T(3), constants::twothirds<T>()) * tg);
+      //T bi = 1 / (sqrt(boost::math::cbrt(T(3))) * tg);
+      return ai;
+   }
+   else
+   {
+      T p = 2 * x * sqrt(x) / 3;
+      T v = T(1) / 3;
+      //T j1 = boost::math::cyl_bessel_i(-v, p, pol);
+      //T j2 = boost::math::cyl_bessel_i(v, p, pol);
+      //
+      // Note that although we can calculate ai from j1 and j2, the accuracy is horrible
+      // as we're subtracting two very large values, so use the Bessel K relation instead:
+      //
+      T ai = cyl_bessel_k(v, p, pol) * sqrt(x / 3) / boost::math::constants::pi<T>();  //sqrt(x) * (j1 - j2) / 3;
+      //T bi = sqrt(x / 3) * (j1 + j2);
+      return ai;
+   }
+}
+
+template <class T, class Policy>
+T airy_bi_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(x < 0)
+   {
+      T p = (-x * sqrt(-x) * 2) / 3;
+      T v = T(1) / 3;
+      T j1 = boost::math::cyl_bessel_j(v, p, pol);
+      T j2 = boost::math::cyl_bessel_j(-v, p, pol);
+      //T ai = sqrt(-x) * (j1 + j2) / 3;
+      T bi = sqrt(-x / 3) * (j2 - j1);
+      return bi;
+   }
+   else if(fabs(x * x * x) / 6 < tools::epsilon<T>())
+   {
+      T tg = boost::math::tgamma(constants::twothirds<T>(), pol);
+      //T ai = 1 / (pow(T(3), constants::twothirds<T>()) * tg);
+      T bi = 1 / (sqrt(boost::math::cbrt(T(3))) * tg);
+      return bi;
+   }
+   else
+   {
+      T p = 2 * x * sqrt(x) / 3;
+      T v = T(1) / 3;
+      T j1 = boost::math::cyl_bessel_i(-v, p, pol);
+      T j2 = boost::math::cyl_bessel_i(v, p, pol);
+      T bi = sqrt(x / 3) * (j1 + j2);
+      return bi;
+   }
+}
+
+template <class T, class Policy>
+T airy_ai_prime_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(x < 0)
+   {
+      T p = (-x * sqrt(-x) * 2) / 3;
+      T v = T(2) / 3;
+      T j1 = boost::math::cyl_bessel_j(v, p, pol);
+      T j2 = boost::math::cyl_bessel_j(-v, p, pol);
+      T aip = -x * (j1 - j2) / 3;
+      return aip;
+   }
+   else if(fabs(x * x) / 2 < tools::epsilon<T>())
+   {
+      T tg = boost::math::tgamma(constants::third<T>(), pol);
+      T aip = 1 / (boost::math::cbrt(T(3)) * tg);
+      return -aip;
+   }
+   else
+   {
+      T p = 2 * x * sqrt(x) / 3;
+      T v = T(2) / 3;
+      //T j1 = boost::math::cyl_bessel_i(-v, p, pol);
+      //T j2 = boost::math::cyl_bessel_i(v, p, pol);
+      //
+      // Note that although we can calculate ai from j1 and j2, the accuracy is horrible
+      // as we're subtracting two very large values, so use the Bessel K relation instead:
+      //
+      T aip = -cyl_bessel_k(v, p, pol) * x / (boost::math::constants::root_three<T>() * boost::math::constants::pi<T>());
+      return aip;
+   }
+}
+
+template <class T, class Policy>
+T airy_bi_prime_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(x < 0)
+   {
+      T p = (-x * sqrt(-x) * 2) / 3;
+      T v = T(2) / 3;
+      T j1 = boost::math::cyl_bessel_j(v, p, pol);
+      T j2 = boost::math::cyl_bessel_j(-v, p, pol);
+      T aip = -x * (j1 + j2) / constants::root_three<T>();
+      return aip;
+   }
+   else if(fabs(x * x) / 2 < tools::epsilon<T>())
+   {
+      T tg = boost::math::tgamma(constants::third<T>(), pol);
+      T bip = sqrt(boost::math::cbrt(T(3))) / tg;
+      return bip;
+   }
+   else
+   {
+      T p = 2 * x * sqrt(x) / 3;
+      T v = T(2) / 3;
+      T j1 = boost::math::cyl_bessel_i(-v, p, pol);
+      T j2 = boost::math::cyl_bessel_i(v, p, pol);
+      T aip = x * (j1 + j2) / boost::math::constants::root_three<T>();
+      return aip;
+   }
+}
+
+template <class T, class Policy>
+T airy_ai_zero_imp(int m, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
+
+   // Handle cases when a negative zero (negative rank) is requested.
+   if(m < 0)
+   {
+      return policies::raise_domain_error<T>("boost::math::airy_ai_zero<%1%>(%1%, int)",
+         "Requested the %1%'th zero, but the rank must be 1 or more !", static_cast<T>(m), pol);
+   }
+
+   // Handle case when the zero'th zero is requested.
+   if(m == 0U)
+   {
+      return policies::raise_domain_error<T>("boost::math::airy_ai_zero<%1%>(%1%,%1%)",
+        "The requested rank of the zero is %1%, but must be 1 or more !", static_cast<T>(m), pol);
+   }
+
+   // Set up the initial guess for the upcoming root-finding.
+   const T guess_root = boost::math::detail::airy_zero::airy_ai_zero_detail::initial_guess<T>(m);
+
+   // Select the maximum allowed iterations based on the number
+   // of decimal digits in the numeric type T, being at least 12.
+   const int my_digits10 = static_cast<int>(static_cast<float>(policies::digits<T, Policy>() * 0.301F));
+
+   const boost::uintmax_t iterations_allowed = static_cast<boost::uintmax_t>((std::max)(12, my_digits10 * 2));
+
+   boost::uintmax_t iterations_used = iterations_allowed;
+
+   // Use a dynamic tolerance because the roots get closer the higher m gets.
+   T tolerance;
+
+   if     (m <=   10) { tolerance = T(0.3F); }
+   else if(m <=  100) { tolerance = T(0.1F); }
+   else if(m <= 1000) { tolerance = T(0.05F); }
+   else               { tolerance = T(1) / sqrt(T(m)); }
+
+   // Perform the root-finding using Newton-Raphson iteration from Boost.Math.
+   const T am =
+      boost::math::tools::newton_raphson_iterate(
+         boost::math::detail::airy_zero::airy_ai_zero_detail::function_object_ai_and_ai_prime<T, Policy>(pol),
+         guess_root,
+         T(guess_root - tolerance),
+         T(guess_root + tolerance),
+         policies::digits<T, Policy>(),
+         iterations_used);
+
+   static_cast<void>(iterations_used);
+
+   return am;
+}
+
+template <class T, class Policy>
+T airy_bi_zero_imp(int m, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
+
+   // Handle cases when a negative zero (negative rank) is requested.
+   if(m < 0)
+   {
+      return policies::raise_domain_error<T>("boost::math::airy_bi_zero<%1%>(%1%, int)",
+         "Requested the %1%'th zero, but the rank must 1 or more !", static_cast<T>(m), pol);
+   }
+
+   // Handle case when the zero'th zero is requested.
+   if(m == 0U)
+   {
+      return policies::raise_domain_error<T>("boost::math::airy_bi_zero<%1%>(%1%,%1%)",
+        "The requested rank of the zero is %1%, but must be 1 or more !", static_cast<T>(m), pol);
+   }
+   // Set up the initial guess for the upcoming root-finding.
+   const T guess_root = boost::math::detail::airy_zero::airy_bi_zero_detail::initial_guess<T>(m);
+
+   // Select the maximum allowed iterations based on the number
+   // of decimal digits in the numeric type T, being at least 12.
+   const int my_digits10 = static_cast<int>(static_cast<float>(policies::digits<T, Policy>() * 0.301F));
+
+   const boost::uintmax_t iterations_allowed = static_cast<boost::uintmax_t>((std::max)(12, my_digits10 * 2));
+
+   boost::uintmax_t iterations_used = iterations_allowed;
+
+   // Use a dynamic tolerance because the roots get closer the higher m gets.
+   T tolerance;
+
+   if     (m <=   10) { tolerance = T(0.3F); }
+   else if(m <=  100) { tolerance = T(0.1F); }
+   else if(m <= 1000) { tolerance = T(0.05F); }
+   else               { tolerance = T(1) / sqrt(T(m)); }
+
+   // Perform the root-finding using Newton-Raphson iteration from Boost.Math.
+   const T bm =
+      boost::math::tools::newton_raphson_iterate(
+         boost::math::detail::airy_zero::airy_bi_zero_detail::function_object_bi_and_bi_prime<T, Policy>(pol),
+         guess_root,
+         T(guess_root - tolerance),
+         T(guess_root + tolerance),
+         policies::digits<T, Policy>(),
+         iterations_used);
+
+   static_cast<void>(iterations_used);
+
+   return bm;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type airy_ai(T x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::airy_ai_imp<value_type>(static_cast<value_type>(x), forwarding_policy()), "boost::math::airy<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type airy_ai(T x)
+{
+   return airy_ai(x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type airy_bi(T x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::airy_bi_imp<value_type>(static_cast<value_type>(x), forwarding_policy()), "boost::math::airy<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type airy_bi(T x)
+{
+   return airy_bi(x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type airy_ai_prime(T x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::airy_ai_prime_imp<value_type>(static_cast<value_type>(x), forwarding_policy()), "boost::math::airy<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type airy_ai_prime(T x)
+{
+   return airy_ai_prime(x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type airy_bi_prime(T x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::airy_bi_prime_imp<value_type>(static_cast<value_type>(x), forwarding_policy()), "boost::math::airy<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type airy_bi_prime(T x)
+{
+   return airy_bi_prime(x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T airy_ai_zero(int m, const Policy& /*pol*/)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename policies::evaluation<T, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Airy value type must be a floating-point type.");
+
+   return policies::checked_narrowing_cast<T, Policy>(detail::airy_ai_zero_imp<value_type>(m, forwarding_policy()), "boost::math::airy_ai_zero<%1%>(unsigned)");
+}
+
+template <class T>
+inline T airy_ai_zero(int m)
+{
+   return airy_ai_zero<T>(m, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator airy_ai_zero(
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it,
+                         const Policy& pol)
+{
+   typedef T result_type;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Airy value type must be a floating-point type.");
+
+   for(unsigned i = 0; i < number_of_zeros; ++i)
+   {
+      *out_it = boost::math::airy_ai_zero<result_type>(start_index + i, pol);
+      ++out_it;
+   }
+   return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator airy_ai_zero(
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it)
+{
+   return airy_ai_zero<T>(start_index, number_of_zeros, out_it, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T airy_bi_zero(int m, const Policy& /*pol*/)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename policies::evaluation<T, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Airy value type must be a floating-point type.");
+
+   return policies::checked_narrowing_cast<T, Policy>(detail::airy_bi_zero_imp<value_type>(m, forwarding_policy()), "boost::math::airy_bi_zero<%1%>(unsigned)");
+}
+
+template <typename T>
+inline T airy_bi_zero(int m)
+{
+   return airy_bi_zero<T>(m, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator airy_bi_zero(
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it,
+                         const Policy& pol)
+{
+   typedef T result_type;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Airy value type must be a floating-point type.");
+
+   for(unsigned i = 0; i < number_of_zeros; ++i)
+   {
+      *out_it = boost::math::airy_bi_zero<result_type>(start_index + i, pol);
+      ++out_it;
+   }
+   return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator airy_bi_zero(
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it)
+{
+   return airy_bi_zero<T>(start_index, number_of_zeros, out_it, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_AIRY_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/asinh.hpp b/gatb-core/thirdparty/boost/math/special_functions/asinh.hpp
new file mode 100644
index 0000000..a863e68
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/asinh.hpp
@@ -0,0 +1,106 @@
+//    boost asinh.hpp header file
+
+//  (C) Copyright Eric Ford & Hubert Holin 2001.
+//  (C) Copyright John Maddock 2008.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_ASINH_HPP
+#define BOOST_ASINH_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/sqrt1pm1.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/constants/constants.hpp>
+
+// This is the inverse of the hyperbolic sine function.
+
+namespace boost
+{
+    namespace math
+    {
+       namespace detail{
+        template<typename T, class Policy>
+        inline T    asinh_imp(const T x, const Policy& pol)
+        {
+            BOOST_MATH_STD_USING
+            
+            if        (x >= tools::forth_root_epsilon<T>())
+            {
+               if        (x > 1 / tools::root_epsilon<T>())
+                {
+                    // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/06/01/06/01/0001/
+                    // approximation by laurent series in 1/x at 0+ order from -1 to 1
+                    return constants::ln_two<T>() + log(x) + 1/ (4 * x * x);
+                }
+                else if(x < 0.5f)
+                {
+                   // As below, but rearranged to preserve digits:
+                   return boost::math::log1p(x + boost::math::sqrt1pm1(x * x, pol), pol);
+                }
+                else
+                {
+                    // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/02/
+                    return( log( x + sqrt(x*x+1) ) );
+                }
+            }
+            else if    (x <= -tools::forth_root_epsilon<T>())
+            {
+                return(-asinh(-x, pol));
+            }
+            else
+            {
+                // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/06/01/03/01/0001/
+                // approximation by taylor series in x at 0 up to order 2
+                T    result = x;
+                
+                if    (abs(x) >= tools::root_epsilon<T>())
+                {
+                    T    x3 = x*x*x;
+                    
+                    // approximation by taylor series in x at 0 up to order 4
+                    result -= x3/static_cast<T>(6);
+                }
+                
+                return(result);
+            }
+        }
+       }
+
+        template<typename T>
+        inline typename tools::promote_args<T>::type asinh(T x)
+        {
+           return boost::math::asinh(x, policies::policy<>());
+        }
+        template<typename T, typename Policy>
+        inline typename tools::promote_args<T>::type asinh(T x, const Policy&)
+        {
+            typedef typename tools::promote_args<T>::type result_type;
+            typedef typename policies::evaluation<result_type, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+           return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+              detail::asinh_imp(static_cast<value_type>(x), forwarding_policy()),
+              "boost::math::asinh<%1%>(%1%)");
+        }
+
+    }
+}
+
+#endif /* BOOST_ASINH_HPP */
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/atanh.hpp b/gatb-core/thirdparty/boost/math/special_functions/atanh.hpp
new file mode 100644
index 0000000..2c5e3f4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/atanh.hpp
@@ -0,0 +1,117 @@
+//    boost atanh.hpp header file
+
+//  (C) Copyright Hubert Holin 2001.
+//  (C) Copyright John Maddock 2008.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_ATANH_HPP
+#define BOOST_ATANH_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+
+// This is the inverse of the hyperbolic tangent function.
+
+namespace boost
+{
+    namespace math
+    {
+       namespace detail
+       {
+        // This is the main fare
+        
+        template<typename T, typename Policy>
+        inline T    atanh_imp(const T x, const Policy& pol)
+        {
+            BOOST_MATH_STD_USING
+            static const char* function = "boost::math::atanh<%1%>(%1%)";
+            
+            if(x < -1)
+            {
+               return policies::raise_domain_error<T>(
+                  function,
+                  "atanh requires x >= -1, but got x = %1%.", x, pol);
+            }
+            else if(x > 1)
+            {
+               return policies::raise_domain_error<T>(
+                  function,
+                  "atanh requires x <= 1, but got x = %1%.", x, pol);
+            }
+            else if(x < -1 + tools::epsilon<T>())
+            {
+               // -Infinity:
+               return -policies::raise_overflow_error<T>(function, 0, pol);
+            }
+            else if(x > 1 - tools::epsilon<T>())
+            {
+               // Infinity:
+               return policies::raise_overflow_error<T>(function, 0, pol);
+            }
+            else if(abs(x) >= tools::forth_root_epsilon<T>())
+            {
+                // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/02/
+                if(abs(x) < 0.5f)
+                   return (boost::math::log1p(x, pol) - boost::math::log1p(-x, pol)) / 2;
+                return(log( (1 + x) / (1 - x) ) / 2);
+            }
+            else
+            {
+                // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/06/01/03/01/
+                // approximation by taylor series in x at 0 up to order 2
+                T    result = x;
+                
+                if    (abs(x) >= tools::root_epsilon<T>())
+                {
+                    T    x3 = x*x*x;
+                    
+                    // approximation by taylor series in x at 0 up to order 4
+                    result += x3/static_cast<T>(3);
+                }
+                
+                return(result);
+            }
+        }
+       }
+
+        template<typename T, typename Policy>
+        inline typename tools::promote_args<T>::type atanh(T x, const Policy&)
+        {
+            typedef typename tools::promote_args<T>::type result_type;
+            typedef typename policies::evaluation<result_type, Policy>::type value_type;
+            typedef typename policies::normalise<
+               Policy, 
+               policies::promote_float<false>, 
+               policies::promote_double<false>, 
+               policies::discrete_quantile<>,
+               policies::assert_undefined<> >::type forwarding_policy;
+           return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+              detail::atanh_imp(static_cast<value_type>(x), forwarding_policy()),
+              "boost::math::atanh<%1%>(%1%)");
+        }
+        template<typename T>
+        inline typename tools::promote_args<T>::type atanh(T x)
+        {
+           return boost::math::atanh(x, policies::policy<>());
+        }
+
+    }
+}
+
+#endif /* BOOST_ATANH_HPP */
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/bernoulli.hpp b/gatb-core/thirdparty/boost/math/special_functions/bernoulli.hpp
new file mode 100644
index 0000000..5f2b7e1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/bernoulli.hpp
@@ -0,0 +1,143 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2013 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
+#define _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/unchecked_bernoulli.hpp>
+#include <boost/math/special_functions/detail/bernoulli_details.hpp>
+
+namespace boost { namespace math { 
+   
+namespace detail {
+
+template <class T, class OutputIterator, class Policy, int N>
+OutputIterator bernoulli_number_imp(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol, const mpl::int_<N>& tag)
+{
+   for(std::size_t i = start; (i <= max_bernoulli_b2n<T>::value) && (i < start + n); ++i)
+   {
+      *out = unchecked_bernoulli_imp<T>(i, tag);
+      ++out;
+   }
+   
+   for(std::size_t i = (std::max)(static_cast<std::size_t>(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
+   {
+      // We must overflow:
+      *out = (i & 1 ? 1 : -1) * policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(n)", 0, T(i), pol);
+      ++out;
+   }
+   return out;
+}
+
+template <class T, class OutputIterator, class Policy>
+OutputIterator bernoulli_number_imp(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol, const mpl::int_<0>& tag)
+{
+   for(std::size_t i = start; (i <= max_bernoulli_b2n<T>::value) && (i < start + n); ++i)
+   {
+      *out = unchecked_bernoulli_imp<T>(i, tag);
+      ++out;
+   }
+   //
+   // Short circuit return so we don't grab the mutex below unless we have to:
+   //
+   if(start + n <= max_bernoulli_b2n<T>::value)
+      return out;
+
+   return get_bernoulli_numbers_cache<T, Policy>().copy_bernoulli_numbers(out, start, n, pol);
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline T bernoulli_b2n(const int i, const Policy &pol)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+   if(i < 0)
+      return policies::raise_domain_error<T>("boost::math::bernoulli_b2n<%1%>", "Index should be >= 0 but got %1%", T(i), pol);
+
+   T result = 0; // The = 0 is just to silence compiler warings :-(
+   boost::math::detail::bernoulli_number_imp<T>(&result, static_cast<std::size_t>(i), 1u, pol, tag_type());
+   return result;
+}
+
+template <class T>
+inline T bernoulli_b2n(const int i)
+{
+   return boost::math::bernoulli_b2n<T>(i, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator bernoulli_b2n(const int start_index,
+                                    const unsigned number_of_bernoullis_b2n,
+                                    OutputIterator out_it,
+                                    const Policy& pol)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+   if(start_index < 0)
+   {
+      *out_it = policies::raise_domain_error<T>("boost::math::bernoulli_b2n<%1%>", "Index should be >= 0 but got %1%", T(start_index), pol);
+      return ++out_it;
+   }
+
+   return boost::math::detail::bernoulli_number_imp<T>(out_it, start_index, number_of_bernoullis_b2n, pol, tag_type());
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator bernoulli_b2n(const int start_index,
+                                    const unsigned number_of_bernoullis_b2n,
+                                    OutputIterator out_it)
+{
+   return boost::math::bernoulli_b2n<T, OutputIterator>(start_index, number_of_bernoullis_b2n, out_it, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T tangent_t2n(const int i, const Policy &pol)
+{
+   if(i < 0)
+      return policies::raise_domain_error<T>("boost::math::tangent_t2n<%1%>", "Index should be >= 0 but got %1%", T(i), pol);
+
+   T result;
+   boost::math::detail::get_bernoulli_numbers_cache<T, Policy>().copy_tangent_numbers(&result, i, 1, pol);
+   return result;
+}
+
+template <class T>
+inline T tangent_t2n(const int i)
+{
+   return boost::math::tangent_t2n<T>(i, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator tangent_t2n(const int start_index,
+                                    const unsigned number_of_tangent_t2n,
+                                    OutputIterator out_it,
+                                    const Policy& pol)
+{
+   if(start_index < 0)
+   {
+      *out_it = policies::raise_domain_error<T>("boost::math::tangent_t2n<%1%>", "Index should be >= 0 but got %1%", T(start_index), pol);
+      return ++out_it;
+   }
+
+   return boost::math::detail::get_bernoulli_numbers_cache<T, Policy>().copy_tangent_numbers(out_it, start_index, number_of_tangent_t2n, pol);
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator tangent_t2n(const int start_index,
+                                    const unsigned number_of_tangent_t2n,
+                                    OutputIterator out_it)
+{
+   return boost::math::tangent_t2n<T, OutputIterator>(start_index, number_of_tangent_t2n, out_it, policies::policy<>());
+}
+
+} } // namespace boost::math
+
+#endif // _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
diff --git a/gatb-core/thirdparty/boost/math/special_functions/bessel.hpp b/gatb-core/thirdparty/boost/math/special_functions/bessel.hpp
new file mode 100644
index 0000000..eab723d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/bessel.hpp
@@ -0,0 +1,786 @@
+//  Copyright (c) 2007, 2013 John Maddock
+//  Copyright Christopher Kormanyos 2013.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This header just defines the function entry points, and adds dispatch
+// to the right implementation method.  Most of the implementation details
+// are in separate headers and copyright Xiaogang Zhang.
+//
+#ifndef BOOST_MATH_BESSEL_HPP
+#define BOOST_MATH_BESSEL_HPP
+
+#ifdef _MSC_VER
+#  pragma once
+#endif
+
+#include <limits>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/bessel_jy.hpp>
+#include <boost/math/special_functions/detail/bessel_jn.hpp>
+#include <boost/math/special_functions/detail/bessel_yn.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_zero.hpp>
+#include <boost/math/special_functions/detail/bessel_ik.hpp>
+#include <boost/math/special_functions/detail/bessel_i0.hpp>
+#include <boost/math/special_functions/detail/bessel_i1.hpp>
+#include <boost/math/special_functions/detail/bessel_kn.hpp>
+#include <boost/math/special_functions/detail/iconv.hpp>
+#include <boost/math/special_functions/sin_pi.hpp>
+#include <boost/math/special_functions/cos_pi.hpp>
+#include <boost/math/special_functions/sinc.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/roots.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T, class Policy>
+struct sph_bessel_j_small_z_series_term
+{
+   typedef T result_type;
+
+   sph_bessel_j_small_z_series_term(unsigned v_, T x)
+      : N(0), v(v_)
+   {
+      BOOST_MATH_STD_USING
+      mult = x / 2;
+      if(v + 3 > max_factorial<T>::value)
+      {
+         term = v * log(mult) - boost::math::lgamma(v+1+T(0.5f), Policy());
+         term = exp(term);
+      }
+      else
+         term = pow(mult, T(v)) / boost::math::tgamma(v+1+T(0.5f), Policy());
+      mult *= -mult;
+   }
+   T operator()()
+   {
+      T r = term;
+      ++N;
+      term *= mult / (N * T(N + v + 0.5f));
+      return r;
+   }
+private:
+   unsigned N;
+   unsigned v;
+   T mult;
+   T term;
+};
+
+template <class T, class Policy>
+inline T sph_bessel_j_small_z_series(unsigned v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   sph_bessel_j_small_z_series_term<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   policies::check_series_iterations<T>("boost::math::sph_bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   return result * sqrt(constants::pi<T>() / 4);
+}
+
+template <class T, class Policy>
+T cyl_bessel_j_imp(T v, T x, const bessel_no_int_tag& t, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::bessel_j<%1%>(%1%,%1%)";
+   if(x < 0)
+   {
+      // better have integer v:
+      if(floor(v) == v)
+      {
+         T r = cyl_bessel_j_imp(v, T(-x), t, pol);
+         if(iround(v, pol) & 1)
+            r = -r;
+         return r;
+      }
+      else
+         return policies::raise_domain_error<T>(
+            function,
+            "Got x = %1%, but we need x >= 0", x, pol);
+   }
+   
+   T j, y;
+   bessel_jy(v, x, &j, &y, need_j, pol);
+   return j;
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_j_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std names.
+   int ival = detail::iconv(v, pol);
+   // If v is an integer, use the integer recursion
+   // method, both that and Steeds method are O(v):
+   if((0 == v - ival))
+   {
+      return bessel_jn(ival, x, pol);
+   }
+   return cyl_bessel_j_imp(v, x, bessel_no_int_tag(), pol);
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_j_imp(int v, T x, const bessel_int_tag&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   return bessel_jn(v, x, pol);
+}
+
+template <class T, class Policy>
+inline T sph_bessel_j_imp(unsigned n, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   if(x < 0)
+      return policies::raise_domain_error<T>(
+         "boost::math::sph_bessel_j<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0.", x, pol);
+   //
+   // Special case, n == 0 resolves down to the sinus cardinal of x:
+   //
+   if(n == 0)
+      return boost::math::sinc_pi(x, pol);
+   //
+   // Special case for x == 0:
+   //
+   if(x == 0)
+      return 0;
+   //
+   // When x is small we may end up with 0/0, use series evaluation
+   // instead, especially as it converges rapidly:
+   //
+   if(x < 1)
+      return sph_bessel_j_small_z_series(n, x, pol);
+   //
+   // Default case is just a naive evaluation of the definition:
+   //
+   return sqrt(constants::pi<T>() / (2 * x)) 
+      * cyl_bessel_j_imp(T(T(n)+T(0.5f)), x, bessel_no_int_tag(), pol);
+}
+
+template <class T, class Policy>
+T cyl_bessel_i_imp(T v, T x, const Policy& pol)
+{
+   //
+   // This handles all the bessel I functions, note that we don't optimise
+   // for integer v, other than the v = 0 or 1 special cases, as Millers
+   // algorithm is at least as inefficient as the general case (the general
+   // case has better error handling too).
+   //
+   BOOST_MATH_STD_USING
+   if(x < 0)
+   {
+      // better have integer v:
+      if(floor(v) == v)
+      {
+         T r = cyl_bessel_i_imp(v, T(-x), pol);
+         if(iround(v, pol) & 1)
+            r = -r;
+         return r;
+      }
+      else
+         return policies::raise_domain_error<T>(
+         "boost::math::cyl_bessel_i<%1%>(%1%,%1%)",
+            "Got x = %1%, but we need x >= 0", x, pol);
+   }
+   if(x == 0)
+   {
+      return (v == 0) ? static_cast<T>(1) : static_cast<T>(0);
+   }
+   if(v == 0.5f)
+   {
+      // common special case, note try and avoid overflow in exp(x):
+      if(x >= tools::log_max_value<T>())
+      {
+         T e = exp(x / 2);
+         return e * (e / sqrt(2 * x * constants::pi<T>()));
+      }
+      return sqrt(2 / (x * constants::pi<T>())) * sinh(x);
+   }
+   if(policies::digits<T, Policy>() <= 64)
+   {
+      if(v == 0)
+      {
+         return bessel_i0(x);
+      }
+      if(v == 1)
+      {
+         return bessel_i1(x);
+      }
+   }
+   if((v > 0) && (x / v < 0.25))
+      return bessel_i_small_z_series(v, x, pol);
+   T I, K;
+   bessel_ik(v, x, &I, &K, need_i, pol);
+   return I;
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_k_imp(T v, T x, const bessel_no_int_tag& /* t */, const Policy& pol)
+{
+   static const char* function = "boost::math::cyl_bessel_k<%1%>(%1%,%1%)";
+   BOOST_MATH_STD_USING
+   if(x < 0)
+   {
+      return policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but we need x > 0", x, pol);
+   }
+   if(x == 0)
+   {
+      return (v == 0) ? policies::raise_overflow_error<T>(function, 0, pol)
+         : policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but we need x > 0", x, pol);
+   }
+   T I, K;
+   bessel_ik(v, x, &I, &K, need_k, pol);
+   return K;
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_k_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   if((floor(v) == v))
+   {
+      return bessel_kn(itrunc(v), x, pol);
+   }
+   return cyl_bessel_k_imp(v, x, bessel_no_int_tag(), pol);
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_k_imp(int v, T x, const bessel_int_tag&, const Policy& pol)
+{
+   return bessel_kn(v, x, pol);
+}
+
+template <class T, class Policy>
+inline T cyl_neumann_imp(T v, T x, const bessel_no_int_tag&, const Policy& pol)
+{
+   static const char* function = "boost::math::cyl_neumann<%1%>(%1%,%1%)";
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   if(x <= 0)
+   {
+      return (v == 0) && (x == 0) ?
+         policies::raise_overflow_error<T>(function, 0, pol)
+         : policies::raise_domain_error<T>(
+               function,
+               "Got x = %1%, but result is complex for x <= 0", x, pol);
+   }
+   T j, y;
+   bessel_jy(v, x, &j, &y, need_y, pol);
+   // 
+   // Post evaluation check for internal overflow during evaluation,
+   // can occur when x is small and v is large, in which case the result
+   // is -INF:
+   //
+   if(!(boost::math::isfinite)(y))
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+   return y;
+}
+
+template <class T, class Policy>
+inline T cyl_neumann_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   if(floor(v) == v)
+   {
+      if(asymptotic_bessel_large_x_limit(v, x))
+      {
+         T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
+         if((v < 0) && (itrunc(v, pol) & 1))
+            r = -r;
+         BOOST_MATH_INSTRUMENT_VARIABLE(r);
+         return r;
+      }
+      else
+      {
+         T r = bessel_yn(itrunc(v, pol), x, pol);
+         BOOST_MATH_INSTRUMENT_VARIABLE(r);
+         return r;
+      }
+   }
+   T r = cyl_neumann_imp<T>(v, x, bessel_no_int_tag(), pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(r);
+   return r;
+}
+
+template <class T, class Policy>
+inline T cyl_neumann_imp(int v, T x, const bessel_int_tag&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   if(asymptotic_bessel_large_x_limit(T(v), x))
+   {
+      T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
+      if((v < 0) && (v & 1))
+         r = -r;
+      return r;
+   }
+   else
+      return bessel_yn(v, x, pol);
+}
+
+template <class T, class Policy>
+inline T sph_neumann_imp(unsigned v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   static const char* function = "boost::math::sph_neumann<%1%>(%1%,%1%)";
+   //
+   // Nothing much to do here but check for errors, and
+   // evaluate the function's definition directly:
+   //
+   if(x < 0)
+      return policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x > 0.", x, pol);
+
+   if(x < 2 * tools::min_value<T>())
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   T result = cyl_neumann_imp(T(T(v)+0.5f), x, bessel_no_int_tag(), pol);
+   T tx = sqrt(constants::pi<T>() / (2 * x));
+
+   if((tx > 1) && (tools::max_value<T>() / tx < result))
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   return result * tx;
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_j_zero_imp(T v, int m, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names, needed for floor.
+
+   static const char* function = "boost::math::cyl_bessel_j_zero<%1%>(%1%, int)";
+
+   const T half_epsilon(boost::math::tools::epsilon<T>() / 2U);
+
+   // Handle non-finite order.
+   if (!(boost::math::isfinite)(v) )
+   {
+     return policies::raise_domain_error<T>(function, "Order argument is %1%, but must be finite >= 0 !", v, pol);
+   }
+
+   // Handle negative rank.
+   if(m < 0)
+   {
+      // Zeros of Jv(x) with negative rank are not defined and requesting one raises a domain error.
+      return policies::raise_domain_error<T>(function, "Requested the %1%'th zero, but the rank must be positive !", static_cast<T>(m), pol);
+   }
+
+   // Get the absolute value of the order.
+   const bool order_is_negative = (v < 0);
+   const T vv((!order_is_negative) ? v : T(-v));
+
+   // Check if the order is very close to zero or very close to an integer.
+   const bool order_is_zero    = (vv < half_epsilon);
+   const bool order_is_integer = ((vv - floor(vv)) < half_epsilon);
+
+   if(m == 0)
+   {
+      if(order_is_zero)
+      {
+         // The zero'th zero of J0(x) is not defined and requesting it raises a domain error.
+         return policies::raise_domain_error<T>(function, "Requested the %1%'th zero of J0, but the rank must be > 0 !", static_cast<T>(m), pol);
+      }
+
+      // The zero'th zero of Jv(x) for v < 0 is not defined
+      // unless the order is a negative integer.
+      if(order_is_negative && (!order_is_integer))
+      {
+         // For non-integer, negative order, requesting the zero'th zero raises a domain error.
+         return policies::raise_domain_error<T>(function, "Requested the %1%'th zero of Jv for negative, non-integer order, but the rank must be > 0 !", static_cast<T>(m), pol);
+      }
+
+      // The zero'th zero does exist and its value is zero.
+      return T(0);
+   }
+
+   // Set up the initial guess for the upcoming root-finding.
+   // If the order is a negative integer, then use the corresponding
+   // positive integer for the order.
+   const T guess_root = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess<T, Policy>((order_is_integer ? vv : v), m, pol);
+
+   // Select the maximum allowed iterations from the policy.
+   boost::uintmax_t number_of_iterations = policies::get_max_root_iterations<Policy>();
+
+   const T delta_lo = ((guess_root > 0.2F) ? T(0.2) : T(guess_root / 2U));
+
+   // Perform the root-finding using Newton-Raphson iteration from Boost.Math.
+   const T jvm =
+      boost::math::tools::newton_raphson_iterate(
+         boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::function_object_jv_and_jv_prime<T, Policy>((order_is_integer ? vv : v), order_is_zero, pol),
+         guess_root,
+         T(guess_root - delta_lo),
+         T(guess_root + 0.2F),
+         policies::digits<T, Policy>(),
+         number_of_iterations);
+
+   if(number_of_iterations >= policies::get_max_root_iterations<Policy>())
+   {
+      return policies::raise_evaluation_error<T>(function, "Unable to locate root in a reasonable time:"
+         "  Current best guess is %1%", jvm, Policy());
+   }
+
+   return jvm;
+}
+
+template <class T, class Policy>
+inline T cyl_neumann_zero_imp(T v, int m, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names, needed for floor.
+
+   static const char* function = "boost::math::cyl_neumann_zero<%1%>(%1%, int)";
+
+   // Handle non-finite order.
+   if (!(boost::math::isfinite)(v) )
+   {
+     return policies::raise_domain_error<T>(function, "Order argument is %1%, but must be finite >= 0 !", v, pol);
+   }
+
+   // Handle negative rank.
+   if(m < 0)
+   {
+      return policies::raise_domain_error<T>(function, "Requested the %1%'th zero, but the rank must be positive !", static_cast<T>(m), pol);
+   }
+
+   const T half_epsilon(boost::math::tools::epsilon<T>() / 2U);
+
+   // Get the absolute value of the order.
+   const bool order_is_negative = (v < 0);
+   const T vv((!order_is_negative) ? v : T(-v));
+
+   const bool order_is_integer = ((vv - floor(vv)) < half_epsilon);
+
+   // For negative integers, use reflection to positive integer order.
+   if(order_is_negative && order_is_integer)
+      return boost::math::detail::cyl_neumann_zero_imp(vv, m, pol);
+
+   // Check if the order is very close to a negative half-integer.
+   const T delta_half_integer(vv - (floor(vv) + 0.5F));
+
+   const bool order_is_negative_half_integer =
+      (order_is_negative && ((delta_half_integer > -half_epsilon) && (delta_half_integer < +half_epsilon)));
+
+   // The zero'th zero of Yv(x) for v < 0 is not defined
+   // unless the order is a negative integer.
+   if((m == 0) && (!order_is_negative_half_integer))
+   {
+      // For non-integer, negative order, requesting the zero'th zero raises a domain error.
+      return policies::raise_domain_error<T>(function, "Requested the %1%'th zero of Yv for negative, non-half-integer order, but the rank must be > 0 !", static_cast<T>(m), pol);
+   }
+
+   // For negative half-integers, use the corresponding
+   // spherical Bessel function of positive half-integer order.
+   if(order_is_negative_half_integer)
+      return boost::math::detail::cyl_bessel_j_zero_imp(vv, m, pol);
+
+   // Set up the initial guess for the upcoming root-finding.
+   // If the order is a negative integer, then use the corresponding
+   // positive integer for the order.
+   const T guess_root = boost::math::detail::bessel_zero::cyl_neumann_zero_detail::initial_guess<T, Policy>(v, m, pol);
+
+   // Select the maximum allowed iterations from the policy.
+   boost::uintmax_t number_of_iterations = policies::get_max_root_iterations<Policy>();
+
+   const T delta_lo = ((guess_root > 0.2F) ? T(0.2) : T(guess_root / 2U));
+
+   // Perform the root-finding using Newton-Raphson iteration from Boost.Math.
+   const T yvm =
+      boost::math::tools::newton_raphson_iterate(
+         boost::math::detail::bessel_zero::cyl_neumann_zero_detail::function_object_yv_and_yv_prime<T, Policy>(v, pol),
+         guess_root,
+         T(guess_root - delta_lo),
+         T(guess_root + 0.2F),
+         policies::digits<T, Policy>(),
+         number_of_iterations);
+
+   if(number_of_iterations >= policies::get_max_root_iterations<Policy>())
+   {
+      return policies::raise_evaluation_error<T>(function, "Unable to locate root in a reasonable time:"
+         "  Current best guess is %1%", yvm, Policy());
+   }
+
+   return yvm;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_imp<value_type>(v, static_cast<value_type>(x), tag_type(), forwarding_policy()), "boost::math::cyl_bessel_j<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_j(T1 v, T2 x)
+{
+   return cyl_bessel_j(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_bessel(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_bessel_j_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_bessel<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_bessel(unsigned v, T x)
+{
+   return sph_bessel(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_i(T1 v, T2 x)
+{
+   return cyl_bessel_i(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_k_imp<value_type>(v, static_cast<value_type>(x), tag_type(), forwarding_policy()), "boost::math::cyl_bessel_k<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_k(T1 v, T2 x)
+{
+   return cyl_bessel_k(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_imp<value_type>(v, static_cast<value_type>(x), tag_type(), forwarding_policy()), "boost::math::cyl_neumann<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_neumann(T1 v, T2 x)
+{
+   return cyl_neumann(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_neumann(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_neumann_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_neumann<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_neumann(unsigned v, T x)
+{
+   return sph_neumann(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type cyl_bessel_j_zero(T v, int m, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_zero_imp<value_type>(v, m, forwarding_policy()), "boost::math::cyl_bessel_j_zero<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_bessel_j_zero(T v, int m)
+{
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   return cyl_bessel_j_zero<T, policies::policy<> >(v, m, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator cyl_bessel_j_zero(T v,
+                              int start_index,
+                              unsigned number_of_zeros,
+                              OutputIterator out_it,
+                              const Policy& pol)
+{
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   for(int i = 0; i < static_cast<int>(number_of_zeros); ++i)
+   {
+      *out_it = boost::math::cyl_bessel_j_zero(v, start_index + i, pol);
+      ++out_it;
+   }
+   return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator cyl_bessel_j_zero(T v,
+                              int start_index,
+                              unsigned number_of_zeros,
+                              OutputIterator out_it)
+{
+   return cyl_bessel_j_zero(v, start_index, number_of_zeros, out_it, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type cyl_neumann_zero(T v, int m, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_zero_imp<value_type>(v, m, forwarding_policy()), "boost::math::cyl_neumann_zero<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_neumann_zero(T v, int m)
+{
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   return cyl_neumann_zero<T, policies::policy<> >(v, m, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator cyl_neumann_zero(T v,
+                             int start_index,
+                             unsigned number_of_zeros,
+                             OutputIterator out_it,
+                             const Policy& pol)
+{
+   BOOST_STATIC_ASSERT_MSG(    false == std::numeric_limits<T>::is_specialized
+                           || (   true  == std::numeric_limits<T>::is_specialized
+                               && false == std::numeric_limits<T>::is_integer),
+                           "Order must be a floating-point type.");
+
+   for(int i = 0; i < static_cast<int>(number_of_zeros); ++i)
+   {
+      *out_it = boost::math::cyl_neumann_zero(v, start_index + i, pol);
+      ++out_it;
+   }
+   return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator cyl_neumann_zero(T v,
+                             int start_index,
+                             unsigned number_of_zeros,
+                             OutputIterator out_it)
+{
+   return cyl_neumann_zero(v, start_index, number_of_zeros, out_it, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_BESSEL_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/bessel_prime.hpp b/gatb-core/thirdparty/boost/math/special_functions/bessel_prime.hpp
new file mode 100644
index 0000000..c5f2d58
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/bessel_prime.hpp
@@ -0,0 +1,359 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_MATH_BESSEL_DERIVATIVES_HPP
+#define BOOST_MATH_BESSEL_DERIVATIVES_HPP
+
+#ifdef _MSC_VER
+#  pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/bessel.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp>
+#include <boost/math/special_functions/detail/bessel_derivatives_linear.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class Tag, class T, class Policy>
+inline T cyl_bessel_j_prime_imp(T v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::cyl_bessel_j_prime<%1%>(%1%,%1%)";
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex result:
+   //
+   if (x < 0 && floor(v) != v)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0", x, pol);
+   //
+   // Special cases for x == 0:
+   //
+   if (x == 0)
+   {
+      if (v == 1)
+         return 0.5;
+      else if (v == -1)
+         return -0.5;
+      else if (floor(v) == v || v > 1)
+         return 0;
+      else return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   }
+   //
+   // Special case for large x: use asymptotic expansion:
+   //
+   if (boost::math::detail::asymptotic_bessel_derivative_large_x_limit(v, x))
+      return boost::math::detail::asymptotic_bessel_j_derivative_large_x_2(v, x);
+   //
+   // Special case for small x: use Taylor series:
+   //
+   if ((abs(x) < 5) || (abs(v) > x * x / 4))
+   {
+      bool inversed = false;
+      if (floor(v) == v && v < 0)
+      {
+         v = -v;
+         if (itrunc(v, pol) & 1)
+            inversed = true;
+      }
+      T r = boost::math::detail::bessel_j_derivative_small_z_series(v, x, pol);
+      return inversed ? T(-r) : r;
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_bessel_j_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_j_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class T, class Policy>
+inline T sph_bessel_j_prime_imp(unsigned v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::sph_bessel_prime<%1%>(%1%,%1%)";
+   //
+   // Prevent complex result:
+   //
+   if (x < 0)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0.", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return (x == 0) ? boost::math::policies::raise_overflow_error<T>(function, 0, pol)
+         : static_cast<T>(-boost::math::detail::sph_bessel_j_imp<T>(1, x, pol));
+   //
+   // Special case for x == 0 and v > 0:
+   //
+   if (x == 0)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::sph_bessel_j_derivative_linear(v, x, pol);
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_i_prime_imp(T v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)";
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex result:
+   //
+   if (x < 0 && floor(v) != v)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0", x, pol);
+   //
+   // Special cases for x == 0:
+   //
+   if (x == 0)
+   {
+      if (v == 1 || v == -1)
+         return 0.5;
+      else if (floor(v) == v || v > 1)
+         return 0;
+      else return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return boost::math::detail::cyl_bessel_i_imp<T>(1, x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_i_derivative_linear(v, x, pol);
+}
+
+template <class Tag, class T, class Policy>
+inline T cyl_bessel_k_prime_imp(T v, T x, const Policy& pol)
+{
+   //
+   // Prevent complex and indeterminate results:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::cyl_bessel_k_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_bessel_k_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_k_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class Tag, class T, class Policy>
+inline T cyl_neumann_prime_imp(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex and indeterminate results:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::cyl_neumann_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0", x, pol);
+   //
+   // Special case for large x: use asymptotic expansion:
+   //
+   if (boost::math::detail::asymptotic_bessel_derivative_large_x_limit(v, x))
+      return boost::math::detail::asymptotic_bessel_y_derivative_large_x_2(v, x);
+   //
+   // Special case for small x: use Taylor series:
+   //
+   if (v > 0 && floor(v) != v)
+   {
+      const T eps = boost::math::policies::get_epsilon<T, Policy>();
+      if (log(eps / 2) > v * log((x * x) / (v * 4)))
+         return boost::math::detail::bessel_y_derivative_small_z_series(v, x, pol);
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_neumann_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_y_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class T, class Policy>
+inline T sph_neumann_prime_imp(unsigned v, T x, const Policy& pol)
+{
+   //
+   // Prevent complex and indeterminate result:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::sph_neumann_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0.", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::sph_neumann_imp<T>(1, x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::sph_neumann_derivative_linear(v, x, pol);
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_j_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_j_prime(T1 v, T2 x)
+{
+   return cyl_bessel_j_prime(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_bessel_prime(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_bessel_j_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_bessel_j_prime<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_bessel_prime(unsigned v, T x)
+{
+   return sph_bessel_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_i_prime(T1 v, T2 x)
+{
+   return cyl_bessel_i_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_k_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_k_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_k_prime(T1 v, T2 x)
+{
+   return cyl_bessel_k_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_neumann_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_neumann_prime(T1 v, T2 x)
+{
+   return cyl_neumann_prime(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_neumann_prime(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_neumann_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_neumann_prime<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_neumann_prime(unsigned v, T x)
+{
+   return sph_neumann_prime(v, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_BESSEL_DERIVATIVES_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/beta.hpp b/gatb-core/thirdparty/boost/math/special_functions/beta.hpp
new file mode 100644
index 0000000..98d8f7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/beta.hpp
@@ -0,0 +1,1529 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_BETA_HPP
+#define BOOST_MATH_SPECIAL_BETA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/binomial.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/erf.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+//
+// Implementation of Beta(a,b) using the Lanczos approximation:
+//
+template <class T, class Lanczos, class Policy>
+T beta_imp(T a, T b, const Lanczos&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // for ADL of std names
+
+   if(a <= 0)
+      return policies::raise_domain_error<T>("boost::math::beta<%1%>(%1%,%1%)", "The arguments to the beta function must be greater than zero (got a=%1%).", a, pol);
+   if(b <= 0)
+      return policies::raise_domain_error<T>("boost::math::beta<%1%>(%1%,%1%)", "The arguments to the beta function must be greater than zero (got b=%1%).", b, pol);
+
+   T result;
+
+   T prefix = 1;
+   T c = a + b;
+
+   // Special cases:
+   if((c == a) && (b < tools::epsilon<T>()))
+      return boost::math::tgamma(b, pol);
+   else if((c == b) && (a < tools::epsilon<T>()))
+      return boost::math::tgamma(a, pol);
+   if(b == 1)
+      return 1/a;
+   else if(a == 1)
+      return 1/b;
+
+   /*
+   //
+   // This code appears to be no longer necessary: it was
+   // used to offset errors introduced from the Lanczos
+   // approximation, but the current Lanczos approximations
+   // are sufficiently accurate for all z that we can ditch
+   // this.  It remains in the file for future reference...
+   //
+   // If a or b are less than 1, shift to greater than 1:
+   if(a < 1)
+   {
+      prefix *= c / a;
+      c += 1;
+      a += 1;
+   }
+   if(b < 1)
+   {
+      prefix *= c / b;
+      c += 1;
+      b += 1;
+   }
+   */
+
+   if(a < b)
+      std::swap(a, b);
+
+   // Lanczos calculation:
+   T agh = a + Lanczos::g() - T(0.5);
+   T bgh = b + Lanczos::g() - T(0.5);
+   T cgh = c + Lanczos::g() - T(0.5);
+   result = Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b) / Lanczos::lanczos_sum_expG_scaled(c);
+   T ambh = a - T(0.5) - b;
+   if((fabs(b * ambh) < (cgh * 100)) && (a > 100))
+   {
+      // Special case where the base of the power term is close to 1
+      // compute (1+x)^y instead:
+      result *= exp(ambh * boost::math::log1p(-b / cgh, pol));
+   }
+   else
+   {
+      result *= pow(agh / cgh, a - T(0.5) - b);
+   }
+   if(cgh > 1e10f)
+      // this avoids possible overflow, but appears to be marginally less accurate:
+      result *= pow((agh / cgh) * (bgh / cgh), b);
+   else
+      result *= pow((agh * bgh) / (cgh * cgh), b);
+   result *= sqrt(boost::math::constants::e<T>() / bgh);
+
+   // If a and b were originally less than 1 we need to scale the result:
+   result *= prefix;
+
+   return result;
+} // template <class T, class Lanczos> beta_imp(T a, T b, const Lanczos&)
+
+//
+// Generic implementation of Beta(a,b) without Lanczos approximation support
+// (Caution this is slow!!!):
+//
+template <class T, class Policy>
+T beta_imp(T a, T b, const lanczos::undefined_lanczos& /* l */, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(a <= 0)
+      return policies::raise_domain_error<T>("boost::math::beta<%1%>(%1%,%1%)", "The arguments to the beta function must be greater than zero (got a=%1%).", a, pol);
+   if(b <= 0)
+      return policies::raise_domain_error<T>("boost::math::beta<%1%>(%1%,%1%)", "The arguments to the beta function must be greater than zero (got b=%1%).", b, pol);
+
+   T result;
+
+   T prefix = 1;
+   T c = a + b;
+
+   // special cases:
+   if((c == a) && (b < tools::epsilon<T>()))
+      return boost::math::tgamma(b, pol);
+   else if((c == b) && (a < tools::epsilon<T>()))
+      return boost::math::tgamma(a, pol);
+   if(b == 1)
+      return 1/a;
+   else if(a == 1)
+      return 1/b;
+
+   // shift to a and b > 1 if required:
+   if(a < 1)
+   {
+      prefix *= c / a;
+      c += 1;
+      a += 1;
+   }
+   if(b < 1)
+   {
+      prefix *= c / b;
+      c += 1;
+      b += 1;
+   }
+   if(a < b)
+      std::swap(a, b);
+
+   // set integration limits:
+   T la = (std::max)(T(10), a);
+   T lb = (std::max)(T(10), b);
+   T lc = (std::max)(T(10), T(a+b));
+
+   // calculate the fraction parts:
+   T sa = detail::lower_gamma_series(a, la, pol) / a;
+   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
+   T sb = detail::lower_gamma_series(b, lb, pol) / b;
+   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
+   T sc = detail::lower_gamma_series(c, lc, pol) / c;
+   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
+
+   // and the exponent part:
+   result = exp(lc - la - lb) * pow(la/lc, a) * pow(lb/lc, b);
+
+   // and combine:
+   result *= sa * sb / sc;
+
+   // if a and b were originally less than 1 we need to scale the result:
+   result *= prefix;
+
+   return result;
+} // template <class T>T beta_imp(T a, T b, const lanczos::undefined_lanczos& l)
+
+
+//
+// Compute the leading power terms in the incomplete Beta:
+//
+// (x^a)(y^b)/Beta(a,b) when normalised, and
+// (x^a)(y^b) otherwise.
+//
+// Almost all of the error in the incomplete beta comes from this
+// function: particularly when a and b are large. Computing large
+// powers are *hard* though, and using logarithms just leads to
+// horrendous cancellation errors.
+//
+template <class T, class Lanczos, class Policy>
+T ibeta_power_terms(T a,
+                        T b,
+                        T x,
+                        T y,
+                        const Lanczos&,
+                        bool normalised,
+                        const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(!normalised)
+   {
+      // can we do better here?
+      return pow(x, a) * pow(y, b);
+   }
+
+   T result;
+
+   T prefix = 1;
+   T c = a + b;
+
+   // combine power terms with Lanczos approximation:
+   T agh = a + Lanczos::g() - T(0.5);
+   T bgh = b + Lanczos::g() - T(0.5);
+   T cgh = c + Lanczos::g() - T(0.5);
+   result = Lanczos::lanczos_sum_expG_scaled(c) / (Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b));
+
+   // l1 and l2 are the base of the exponents minus one:
+   T l1 = (x * b - y * agh) / agh;
+   T l2 = (y * a - x * bgh) / bgh;
+   if(((std::min)(fabs(l1), fabs(l2)) < 0.2))
+   {
+      // when the base of the exponent is very near 1 we get really
+      // gross errors unless extra care is taken:
+      if((l1 * l2 > 0) || ((std::min)(a, b) < 1))
+      {
+         //
+         // This first branch handles the simple cases where either: 
+         //
+         // * The two power terms both go in the same direction 
+         // (towards zero or towards infinity).  In this case if either 
+         // term overflows or underflows, then the product of the two must 
+         // do so also.  
+         // *Alternatively if one exponent is less than one, then we 
+         // can't productively use it to eliminate overflow or underflow 
+         // from the other term.  Problems with spurious overflow/underflow 
+         // can't be ruled out in this case, but it is *very* unlikely 
+         // since one of the power terms will evaluate to a number close to 1.
+         //
+         if(fabs(l1) < 0.1)
+         {
+            result *= exp(a * boost::math::log1p(l1, pol));
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         else
+         {
+            result *= pow((x * cgh) / agh, a);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         if(fabs(l2) < 0.1)
+         {
+            result *= exp(b * boost::math::log1p(l2, pol));
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         else
+         {
+            result *= pow((y * cgh) / bgh, b);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+      }
+      else if((std::max)(fabs(l1), fabs(l2)) < 0.5)
+      {
+         //
+         // Both exponents are near one and both the exponents are 
+         // greater than one and further these two 
+         // power terms tend in opposite directions (one towards zero, 
+         // the other towards infinity), so we have to combine the terms 
+         // to avoid any risk of overflow or underflow.
+         //
+         // We do this by moving one power term inside the other, we have:
+         //
+         //    (1 + l1)^a * (1 + l2)^b
+         //  = ((1 + l1)*(1 + l2)^(b/a))^a
+         //  = (1 + l1 + l3 + l1*l3)^a   ;  l3 = (1 + l2)^(b/a) - 1
+         //                                    = exp((b/a) * log(1 + l2)) - 1
+         //
+         // The tricky bit is deciding which term to move inside :-)
+         // By preference we move the larger term inside, so that the
+         // size of the largest exponent is reduced.  However, that can
+         // only be done as long as l3 (see above) is also small.
+         //
+         bool small_a = a < b;
+         T ratio = b / a;
+         if((small_a && (ratio * l2 < 0.1)) || (!small_a && (l1 / ratio > 0.1)))
+         {
+            T l3 = boost::math::expm1(ratio * boost::math::log1p(l2, pol), pol);
+            l3 = l1 + l3 + l3 * l1;
+            l3 = a * boost::math::log1p(l3, pol);
+            result *= exp(l3);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         else
+         {
+            T l3 = boost::math::expm1(boost::math::log1p(l1, pol) / ratio, pol);
+            l3 = l2 + l3 + l3 * l2;
+            l3 = b * boost::math::log1p(l3, pol);
+            result *= exp(l3);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+      }
+      else if(fabs(l1) < fabs(l2))
+      {
+         // First base near 1 only:
+         T l = a * boost::math::log1p(l1, pol)
+            + b * log((y * cgh) / bgh);
+         result *= exp(l);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else
+      {
+         // Second base near 1 only:
+         T l = b * boost::math::log1p(l2, pol)
+            + a * log((x * cgh) / agh);
+         result *= exp(l);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+   }
+   else
+   {
+      // general case:
+      T b1 = (x * cgh) / agh;
+      T b2 = (y * cgh) / bgh;
+      l1 = a * log(b1);
+      l2 = b * log(b2);
+      BOOST_MATH_INSTRUMENT_VARIABLE(b1);
+      BOOST_MATH_INSTRUMENT_VARIABLE(b2);
+      BOOST_MATH_INSTRUMENT_VARIABLE(l1);
+      BOOST_MATH_INSTRUMENT_VARIABLE(l2);
+      if((l1 >= tools::log_max_value<T>())
+         || (l1 <= tools::log_min_value<T>())
+         || (l2 >= tools::log_max_value<T>())
+         || (l2 <= tools::log_min_value<T>())
+         )
+      {
+         // Oops, overflow, sidestep:
+         if(a < b)
+            result *= pow(pow(b2, b/a) * b1, a);
+         else
+            result *= pow(pow(b1, a/b) * b2, b);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else
+      {
+         // finally the normal case:
+         result *= pow(b1, a) * pow(b2, b);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+   }
+   // combine with the leftover terms from the Lanczos approximation:
+   result *= sqrt(bgh / boost::math::constants::e<T>());
+   result *= sqrt(agh / cgh);
+   result *= prefix;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+
+   return result;
+}
+//
+// Compute the leading power terms in the incomplete Beta:
+//
+// (x^a)(y^b)/Beta(a,b) when normalised, and
+// (x^a)(y^b) otherwise.
+//
+// Almost all of the error in the incomplete beta comes from this
+// function: particularly when a and b are large. Computing large
+// powers are *hard* though, and using logarithms just leads to
+// horrendous cancellation errors.
+//
+// This version is generic, slow, and does not use the Lanczos approximation.
+//
+template <class T, class Policy>
+T ibeta_power_terms(T a,
+                        T b,
+                        T x,
+                        T y,
+                        const boost::math::lanczos::undefined_lanczos&,
+                        bool normalised,
+                        const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(!normalised)
+   {
+      return pow(x, a) * pow(y, b);
+   }
+
+   T result= 0; // assignment here silences warnings later
+
+   T c = a + b;
+
+   // integration limits for the gamma functions:
+   //T la = (std::max)(T(10), a);
+   //T lb = (std::max)(T(10), b);
+   //T lc = (std::max)(T(10), a+b);
+   T la = a + 5;
+   T lb = b + 5;
+   T lc = a + b + 5;
+   // gamma function partials:
+   T sa = detail::lower_gamma_series(a, la, pol) / a;
+   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
+   T sb = detail::lower_gamma_series(b, lb, pol) / b;
+   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
+   T sc = detail::lower_gamma_series(c, lc, pol) / c;
+   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
+   // gamma function powers combined with incomplete beta powers:
+
+   T b1 = (x * lc) / la;
+   T b2 = (y * lc) / lb;
+   T e1 = lc - la - lb;
+   T lb1 = a * log(b1);
+   T lb2 = b * log(b2);
+
+   if((lb1 >= tools::log_max_value<T>())
+      || (lb1 <= tools::log_min_value<T>())
+      || (lb2 >= tools::log_max_value<T>())
+      || (lb2 <= tools::log_min_value<T>())
+      || (e1 >= tools::log_max_value<T>())
+      || (e1 <= tools::log_min_value<T>())
+      )
+   {
+      result = exp(lb1 + lb2 - e1);
+   }
+   else
+   {
+      T p1, p2;
+      if((fabs(b1 - 1) * a < 10) && (a > 1))
+         p1 = exp(a * boost::math::log1p((x * b - y * la) / la, pol));
+      else
+         p1 = pow(b1, a);
+      if((fabs(b2 - 1) * b < 10) && (b > 1))
+         p2 = exp(b * boost::math::log1p((y * a - x * lb) / lb, pol));
+      else
+         p2 = pow(b2, b);
+      T p3 = exp(e1);
+      result = p1 * p2 / p3;
+   }
+   // and combine with the remaining gamma function components:
+   result /= sa * sb / sc;
+
+   return result;
+}
+//
+// Series approximation to the incomplete beta:
+//
+template <class T>
+struct ibeta_series_t
+{
+   typedef T result_type;
+   ibeta_series_t(T a_, T b_, T x_, T mult) : result(mult), x(x_), apn(a_), poch(1-b_), n(1) {}
+   T operator()()
+   {
+      T r = result / apn;
+      apn += 1;
+      result *= poch * x / n;
+      ++n;
+      poch += 1;
+      return r;
+   }
+private:
+   T result, x, apn, poch;
+   int n;
+};
+
+template <class T, class Lanczos, class Policy>
+T ibeta_series(T a, T b, T x, T s0, const Lanczos&, bool normalised, T* p_derivative, T y, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T result;
+
+   BOOST_ASSERT((p_derivative == 0) || normalised);
+
+   if(normalised)
+   {
+      T c = a + b;
+
+      // incomplete beta power term, combined with the Lanczos approximation:
+      T agh = a + Lanczos::g() - T(0.5);
+      T bgh = b + Lanczos::g() - T(0.5);
+      T cgh = c + Lanczos::g() - T(0.5);
+      result = Lanczos::lanczos_sum_expG_scaled(c) / (Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b));
+      if(a * b < bgh * 10)
+         result *= exp((b - 0.5f) * boost::math::log1p(a / bgh, pol));
+      else
+         result *= pow(cgh / bgh, b - 0.5f);
+      result *= pow(x * cgh / agh, a);
+      result *= sqrt(agh / boost::math::constants::e<T>());
+
+      if(p_derivative)
+      {
+         *p_derivative = result * pow(y, b);
+         BOOST_ASSERT(*p_derivative >= 0);
+      }
+   }
+   else
+   {
+      // Non-normalised, just compute the power:
+      result = pow(x, a);
+   }
+   if(result < tools::min_value<T>())
+      return s0; // Safeguard: series can't cope with denorms.
+   ibeta_series_t<T> s(a, b, x, result);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, s0);
+   policies::check_series_iterations<T>("boost::math::ibeta<%1%>(%1%, %1%, %1%) in ibeta_series (with lanczos)", max_iter, pol);
+   return result;
+}
+//
+// Incomplete Beta series again, this time without Lanczos support:
+//
+template <class T, class Policy>
+T ibeta_series(T a, T b, T x, T s0, const boost::math::lanczos::undefined_lanczos&, bool normalised, T* p_derivative, T y, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T result;
+   BOOST_ASSERT((p_derivative == 0) || normalised);
+
+   if(normalised)
+   {
+      T c = a + b;
+
+      // figure out integration limits for the gamma function:
+      //T la = (std::max)(T(10), a);
+      //T lb = (std::max)(T(10), b);
+      //T lc = (std::max)(T(10), a+b);
+      T la = a + 5;
+      T lb = b + 5;
+      T lc = a + b + 5;
+
+      // calculate the gamma parts:
+      T sa = detail::lower_gamma_series(a, la, pol) / a;
+      sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
+      T sb = detail::lower_gamma_series(b, lb, pol) / b;
+      sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
+      T sc = detail::lower_gamma_series(c, lc, pol) / c;
+      sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
+
+      // and their combined power-terms:
+      T b1 = (x * lc) / la;
+      T b2 = lc/lb;
+      T e1 = lc - la - lb;
+      T lb1 = a * log(b1);
+      T lb2 = b * log(b2);
+
+      if((lb1 >= tools::log_max_value<T>())
+         || (lb1 <= tools::log_min_value<T>())
+         || (lb2 >= tools::log_max_value<T>())
+         || (lb2 <= tools::log_min_value<T>())
+         || (e1 >= tools::log_max_value<T>())
+         || (e1 <= tools::log_min_value<T>()) )
+      {
+         T p = lb1 + lb2 - e1;
+         result = exp(p);
+      }
+      else
+      {
+         result = pow(b1, a);
+         if(a * b < lb * 10)
+            result *= exp(b * boost::math::log1p(a / lb, pol));
+         else
+            result *= pow(b2, b);
+         result /= exp(e1);
+      }
+      // and combine the results:
+      result /= sa * sb / sc;
+
+      if(p_derivative)
+      {
+         *p_derivative = result * pow(y, b);
+         BOOST_ASSERT(*p_derivative >= 0);
+      }
+   }
+   else
+   {
+      // Non-normalised, just compute the power:
+      result = pow(x, a);
+   }
+   if(result < tools::min_value<T>())
+      return s0; // Safeguard: series can't cope with denorms.
+   ibeta_series_t<T> s(a, b, x, result);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, s0);
+   policies::check_series_iterations<T>("boost::math::ibeta<%1%>(%1%, %1%, %1%) in ibeta_series (without lanczos)", max_iter, pol);
+   return result;
+}
+
+//
+// Continued fraction for the incomplete beta:
+//
+template <class T>
+struct ibeta_fraction2_t
+{
+   typedef std::pair<T, T> result_type;
+
+   ibeta_fraction2_t(T a_, T b_, T x_, T y_) : a(a_), b(b_), x(x_), y(y_), m(0) {}
+
+   result_type operator()()
+   {
+      T aN = (a + m - 1) * (a + b + m - 1) * m * (b - m) * x * x;
+      T denom = (a + 2 * m - 1);
+      aN /= denom * denom;
+
+      T bN = m;
+      bN += (m * (b - m) * x) / (a + 2*m - 1);
+      bN += ((a + m) * (a * y - b * x + 1 + m *(2 - x))) / (a + 2*m + 1);
+
+      ++m;
+
+      return std::make_pair(aN, bN);
+   }
+
+private:
+   T a, b, x, y;
+   int m;
+};
+//
+// Evaluate the incomplete beta via the continued fraction representation:
+//
+template <class T, class Policy>
+inline T ibeta_fraction2(T a, T b, T x, T y, const Policy& pol, bool normalised, T* p_derivative)
+{
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   BOOST_MATH_STD_USING
+   T result = ibeta_power_terms(a, b, x, y, lanczos_type(), normalised, pol);
+   if(p_derivative)
+   {
+      *p_derivative = result;
+      BOOST_ASSERT(*p_derivative >= 0);
+   }
+   if(result == 0)
+      return result;
+
+   ibeta_fraction2_t<T> f(a, b, x, y);
+   T fract = boost::math::tools::continued_fraction_b(f, boost::math::policies::get_epsilon<T, Policy>());
+   BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   return result / fract;
+}
+//
+// Computes the difference between ibeta(a,b,x) and ibeta(a+k,b,x):
+//
+template <class T, class Policy>
+T ibeta_a_step(T a, T b, T x, T y, int k, const Policy& pol, bool normalised, T* p_derivative)
+{
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(k);
+
+   T prefix = ibeta_power_terms(a, b, x, y, lanczos_type(), normalised, pol);
+   if(p_derivative)
+   {
+      *p_derivative = prefix;
+      BOOST_ASSERT(*p_derivative >= 0);
+   }
+   prefix /= a;
+   if(prefix == 0)
+      return prefix;
+   T sum = 1;
+   T term = 1;
+   // series summation from 0 to k-1:
+   for(int i = 0; i < k-1; ++i)
+   {
+      term *= (a+b+i) * x / (a+i+1);
+      sum += term;
+   }
+   prefix *= sum;
+
+   return prefix;
+}
+//
+// This function is only needed for the non-regular incomplete beta,
+// it computes the delta in:
+// beta(a,b,x) = prefix + delta * beta(a+k,b,x)
+// it is currently only called for small k.
+//
+template <class T>
+inline T rising_factorial_ratio(T a, T b, int k)
+{
+   // calculate:
+   // (a)(a+1)(a+2)...(a+k-1)
+   // _______________________
+   // (b)(b+1)(b+2)...(b+k-1)
+
+   // This is only called with small k, for large k
+   // it is grossly inefficient, do not use outside it's
+   // intended purpose!!!
+   BOOST_MATH_INSTRUMENT_VARIABLE(k);
+   if(k == 0)
+      return 1;
+   T result = 1;
+   for(int i = 0; i < k; ++i)
+      result *= (a+i) / (b+i);
+   return result;
+}
+//
+// Routine for a > 15, b < 1
+//
+// Begin by figuring out how large our table of Pn's should be,
+// quoted accuracies are "guestimates" based on empiracal observation.
+// Note that the table size should never exceed the size of our
+// tables of factorials.
+//
+template <class T>
+struct Pn_size
+{
+   // This is likely to be enough for ~35-50 digit accuracy
+   // but it's hard to quantify exactly:
+   BOOST_STATIC_CONSTANT(unsigned, value = 50);
+   BOOST_STATIC_ASSERT(::boost::math::max_factorial<T>::value >= 100);
+};
+template <>
+struct Pn_size<float>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 15); // ~8-15 digit accuracy
+   BOOST_STATIC_ASSERT(::boost::math::max_factorial<float>::value >= 30);
+};
+template <>
+struct Pn_size<double>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 30); // 16-20 digit accuracy
+   BOOST_STATIC_ASSERT(::boost::math::max_factorial<double>::value >= 60);
+};
+template <>
+struct Pn_size<long double>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 50); // ~35-50 digit accuracy
+   BOOST_STATIC_ASSERT(::boost::math::max_factorial<long double>::value >= 100);
+};
+
+template <class T, class Policy>
+T beta_small_b_large_a_series(T a, T b, T x, T y, T s0, T mult, const Policy& pol, bool normalised)
+{
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   BOOST_MATH_STD_USING
+   //
+   // This is DiDonato and Morris's BGRAT routine, see Eq's 9 through 9.6.
+   //
+   // Some values we'll need later, these are Eq 9.1:
+   //
+   T bm1 = b - 1;
+   T t = a + bm1 / 2;
+   T lx, u;
+   if(y < 0.35)
+      lx = boost::math::log1p(-y, pol);
+   else
+      lx = log(x);
+   u = -t * lx;
+   // and from from 9.2:
+   T prefix;
+   T h = regularised_gamma_prefix(b, u, pol, lanczos_type());
+   if(h <= tools::min_value<T>())
+      return s0;
+   if(normalised)
+   {
+      prefix = h / boost::math::tgamma_delta_ratio(a, b, pol);
+      prefix /= pow(t, b);
+   }
+   else
+   {
+      prefix = full_igamma_prefix(b, u, pol) / pow(t, b);
+   }
+   prefix *= mult;
+   //
+   // now we need the quantity Pn, unfortunatately this is computed
+   // recursively, and requires a full history of all the previous values
+   // so no choice but to declare a big table and hope it's big enough...
+   //
+   T p[ ::boost::math::detail::Pn_size<T>::value ] = { 1 };  // see 9.3.
+   //
+   // Now an initial value for J, see 9.6:
+   //
+   T j = boost::math::gamma_q(b, u, pol) / h;
+   //
+   // Now we can start to pull things together and evaluate the sum in Eq 9:
+   //
+   T sum = s0 + prefix * j;  // Value at N = 0
+   // some variables we'll need:
+   unsigned tnp1 = 1; // 2*N+1
+   T lx2 = lx / 2;
+   lx2 *= lx2;
+   T lxp = 1;
+   T t4 = 4 * t * t;
+   T b2n = b;
+
+   for(unsigned n = 1; n < sizeof(p)/sizeof(p[0]); ++n)
+   {
+      /*
+      // debugging code, enable this if you want to determine whether
+      // the table of Pn's is large enough...
+      //
+      static int max_count = 2;
+      if(n > max_count)
+      {
+         max_count = n;
+         std::cerr << "Max iterations in BGRAT was " << n << std::endl;
+      }
+      */
+      //
+      // begin by evaluating the next Pn from Eq 9.4:
+      //
+      tnp1 += 2;
+      p[n] = 0;
+      T mbn = b - n;
+      unsigned tmp1 = 3;
+      for(unsigned m = 1; m < n; ++m)
+      {
+         mbn = m * b - n;
+         p[n] += mbn * p[n-m] / boost::math::unchecked_factorial<T>(tmp1);
+         tmp1 += 2;
+      }
+      p[n] /= n;
+      p[n] += bm1 / boost::math::unchecked_factorial<T>(tnp1);
+      //
+      // Now we want Jn from Jn-1 using Eq 9.6:
+      //
+      j = (b2n * (b2n + 1) * j + (u + b2n + 1) * lxp) / t4;
+      lxp *= lx2;
+      b2n += 2;
+      //
+      // pull it together with Eq 9:
+      //
+      T r = prefix * p[n] * j;
+      sum += r;
+      if(r > 1)
+      {
+         if(fabs(r) < fabs(tools::epsilon<T>() * sum))
+            break;
+      }
+      else
+      {
+         if(fabs(r / tools::epsilon<T>()) < fabs(sum))
+            break;
+      }
+   }
+   return sum;
+} // template <class T, class Lanczos>T beta_small_b_large_a_series(T a, T b, T x, T y, T s0, T mult, const Lanczos& l, bool normalised)
+
+//
+// For integer arguments we can relate the incomplete beta to the
+// complement of the binomial distribution cdf and use this finite sum.
+//
+template <class T>
+T binomial_ccdf(T n, T k, T x, T y)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   T result = pow(x, n);
+
+   if(result > tools::min_value<T>())
+   {
+      T term = result;
+      for(unsigned i = itrunc(T(n - 1)); i > k; --i)
+      {
+         term *= ((i + 1) * y) / ((n - i) * x);
+         result += term;
+      }
+   }
+   else
+   {
+      // First term underflows so we need to start at the mode of the
+      // distribution and work outwards:
+      int start = itrunc(n * x);
+      if(start <= k + 1)
+         start = itrunc(k + 2);
+      result = pow(x, start) * pow(y, n - start) * boost::math::binomial_coefficient<T>(itrunc(n), itrunc(start));
+      if(result == 0)
+      {
+         // OK, starting slightly above the mode didn't work, 
+         // we'll have to sum the terms the old fashioned way:
+         for(unsigned i = start - 1; i > k; --i)
+         {
+            result += pow(x, (int)i) * pow(y, n - i) * boost::math::binomial_coefficient<T>(itrunc(n), itrunc(i));
+         }
+      }
+      else
+      {
+         T term = result;
+         T start_term = result;
+         for(unsigned i = start - 1; i > k; --i)
+         {
+            term *= ((i + 1) * y) / ((n - i) * x);
+            result += term;
+         }
+         term = start_term;
+         for(unsigned i = start + 1; i <= n; ++i)
+         {
+            term *= (n - i + 1) * x / (i * y);
+            result += term;
+         }
+      }
+   }
+
+   return result;
+}
+
+
+//
+// The incomplete beta function implementation:
+// This is just a big bunch of spagetti code to divide up the
+// input range and select the right implementation method for
+// each domain:
+//
+template <class T, class Policy>
+T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_derivative)
+{
+   static const char* function = "boost::math::ibeta<%1%>(%1%, %1%, %1%)";
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   BOOST_MATH_STD_USING // for ADL of std math functions.
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(b);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(inv);
+   BOOST_MATH_INSTRUMENT_VARIABLE(normalised);
+
+   bool invert = inv;
+   T fract;
+   T y = 1 - x;
+
+   BOOST_ASSERT((p_derivative == 0) || normalised);
+
+   if(p_derivative)
+      *p_derivative = -1; // value not set.
+
+   if((x < 0) || (x > 1))
+      return policies::raise_domain_error<T>(function, "Parameter x outside the range [0,1] in the incomplete beta function (got x=%1%).", x, pol);
+
+   if(normalised)
+   {
+      if(a < 0)
+         return policies::raise_domain_error<T>(function, "The argument a to the incomplete beta function must be >= zero (got a=%1%).", a, pol);
+      if(b < 0)
+         return policies::raise_domain_error<T>(function, "The argument b to the incomplete beta function must be >= zero (got b=%1%).", b, pol);
+      // extend to a few very special cases:
+      if(a == 0)
+      {
+         if(b == 0)
+            return policies::raise_domain_error<T>(function, "The arguments a and b to the incomplete beta function cannot both be zero, with x=%1%.", x, pol);
+         if(b > 0)
+            return inv ? 0 : 1;
+      }
+      else if(b == 0)
+      {
+         if(a > 0)
+            return inv ? 1 : 0;
+      }
+   }
+   else
+   {
+      if(a <= 0)
+         return policies::raise_domain_error<T>(function, "The argument a to the incomplete beta function must be greater than zero (got a=%1%).", a, pol);
+      if(b <= 0)
+         return policies::raise_domain_error<T>(function, "The argument b to the incomplete beta function must be greater than zero (got b=%1%).", b, pol);
+   }
+
+   if(x == 0)
+   {
+      if(p_derivative)
+      {
+         *p_derivative = (a == 1) ? (T)1 : (a < 1) ? T(tools::max_value<T>() / 2) : T(tools::min_value<T>() * 2);
+      }
+      return (invert ? (normalised ? T(1) : boost::math::beta(a, b, pol)) : T(0));
+   }
+   if(x == 1)
+   {
+      if(p_derivative)
+      {
+         *p_derivative = (b == 1) ? T(1) : (b < 1) ? T(tools::max_value<T>() / 2) : T(tools::min_value<T>() * 2);
+      }
+      return (invert == 0 ? (normalised ? 1 : boost::math::beta(a, b, pol)) : 0);
+   }
+   if((a == 0.5f) && (b == 0.5f))
+   {
+      // We have an arcsine distribution:
+      if(p_derivative)
+      {
+         *p_derivative = 1 / constants::pi<T>() * sqrt(y * x);
+      }
+      T p = invert ? asin(sqrt(y)) / constants::half_pi<T>() : asin(sqrt(x)) / constants::half_pi<T>();
+      if(!normalised)
+         p *= constants::pi<T>();
+      return p;
+   }
+   if(a == 1)
+   {
+      std::swap(a, b);
+      std::swap(x, y);
+      invert = !invert;
+   }
+   if(b == 1)
+   {
+      //
+      // Special case see: http://functions.wolfram.com/GammaBetaErf/BetaRegularized/03/01/01/
+      //
+      if(a == 1)
+      {
+         if(p_derivative)
+            *p_derivative = 1;
+         return invert ? y : x;
+      }
+      
+      if(p_derivative)
+      {
+         *p_derivative = a * pow(x, a - 1);
+      }
+      T p;
+      if(y < 0.5)
+         p = invert ? T(-boost::math::expm1(a * boost::math::log1p(-y, pol), pol)) : T(exp(a * boost::math::log1p(-y, pol)));
+      else
+         p = invert ? T(-boost::math::powm1(x, a, pol)) : T(pow(x, a));
+      if(!normalised)
+         p /= a;
+      return p;
+   }
+
+   if((std::min)(a, b) <= 1)
+   {
+      if(x > 0.5)
+      {
+         std::swap(a, b);
+         std::swap(x, y);
+         invert = !invert;
+         BOOST_MATH_INSTRUMENT_VARIABLE(invert);
+      }
+      if((std::max)(a, b) <= 1)
+      {
+         // Both a,b < 1:
+         if((a >= (std::min)(T(0.2), b)) || (pow(x, a) <= 0.9))
+         {
+            if(!invert)
+            {
+               fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+            else
+            {
+               fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+               invert = false;
+               fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+         }
+         else
+         {
+            std::swap(a, b);
+            std::swap(x, y);
+            invert = !invert;
+            if(y >= 0.3)
+            {
+               if(!invert)
+               {
+                  fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+               else
+               {
+                  fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+                  invert = false;
+                  fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+            }
+            else
+            {
+               // Sidestep on a, and then use the series representation:
+               T prefix;
+               if(!normalised)
+               {
+                  prefix = rising_factorial_ratio(T(a+b), a, 20);
+               }
+               else
+               {
+                  prefix = 1;
+               }
+               fract = ibeta_a_step(a, b, x, y, 20, pol, normalised, p_derivative);
+               if(!invert)
+               {
+                  fract = beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+               else
+               {
+                  fract -= (normalised ? 1 : boost::math::beta(a, b, pol));
+                  invert = false;
+                  fract = -beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+            }
+         }
+      }
+      else
+      {
+         // One of a, b < 1 only:
+         if((b <= 1) || ((x < 0.1) && (pow(b * x, a) <= 0.7)))
+         {
+            if(!invert)
+            {
+               fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+            else
+            {
+               fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+               invert = false;
+               fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+         }
+         else
+         {
+            std::swap(a, b);
+            std::swap(x, y);
+            invert = !invert;
+
+            if(y >= 0.3)
+            {
+               if(!invert)
+               {
+                  fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+               else
+               {
+                  fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+                  invert = false;
+                  fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+            }
+            else if(a >= 15)
+            {
+               if(!invert)
+               {
+                  fract = beta_small_b_large_a_series(a, b, x, y, T(0), T(1), pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+               else
+               {
+                  fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+                  invert = false;
+                  fract = -beta_small_b_large_a_series(a, b, x, y, fract, T(1), pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+            }
+            else
+            {
+               // Sidestep to improve errors:
+               T prefix;
+               if(!normalised)
+               {
+                  prefix = rising_factorial_ratio(T(a+b), a, 20);
+               }
+               else
+               {
+                  prefix = 1;
+               }
+               fract = ibeta_a_step(a, b, x, y, 20, pol, normalised, p_derivative);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               if(!invert)
+               {
+                  fract = beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+               else
+               {
+                  fract -= (normalised ? 1 : boost::math::beta(a, b, pol));
+                  invert = false;
+                  fract = -beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
+            }
+         }
+      }
+   }
+   else
+   {
+      // Both a,b >= 1:
+      T lambda;
+      if(a < b)
+      {
+         lambda = a - (a + b) * x;
+      }
+      else
+      {
+         lambda = (a + b) * y - b;
+      }
+      if(lambda < 0)
+      {
+         std::swap(a, b);
+         std::swap(x, y);
+         invert = !invert;
+         BOOST_MATH_INSTRUMENT_VARIABLE(invert);
+      }
+      
+      if(b < 40)
+      {
+         if((floor(a) == a) && (floor(b) == b) && (a < (std::numeric_limits<int>::max)() - 100))
+         {
+            // relate to the binomial distribution and use a finite sum:
+            T k = a - 1;
+            T n = b + k;
+            fract = binomial_ccdf(n, k, x, y);
+            if(!normalised)
+               fract *= boost::math::beta(a, b, pol);
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+         }
+         else if(b * x <= 0.7)
+         {
+            if(!invert)
+            {
+               fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+            else
+            {
+               fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
+               invert = false;
+               fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
+         }
+         else if(a > 15)
+         {
+            // sidestep so we can use the series representation:
+            int n = itrunc(T(floor(b)), pol);
+            if(n == b)
+               --n;
+            T bbar = b - n;
+            T prefix;
+            if(!normalised)
+            {
+               prefix = rising_factorial_ratio(T(a+bbar), bbar, n);
+            }
+            else
+            {
+               prefix = 1;
+            }
+            fract = ibeta_a_step(bbar, a, y, x, n, pol, normalised, static_cast<T*>(0));
+            fract = beta_small_b_large_a_series(a,  bbar, x, y, fract, T(1), pol, normalised);
+            fract /= prefix;
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+         }
+         else if(normalised)
+         {
+            // The formula here for the non-normalised case is tricky to figure
+            // out (for me!!), and requires two pochhammer calculations rather
+            // than one, so leave it for now and only use this in the normalized case....
+            int n = itrunc(T(floor(b)), pol);
+            T bbar = b - n;
+            if(bbar <= 0)
+            {
+               --n;
+               bbar += 1;
+            }
+            fract = ibeta_a_step(bbar, a, y, x, n, pol, normalised, static_cast<T*>(0));
+            fract += ibeta_a_step(a, bbar, x, y, 20, pol, normalised, static_cast<T*>(0));
+            if(invert)
+               fract -= 1;  // Note this line would need changing if we ever enable this branch in non-normalized case
+            fract = beta_small_b_large_a_series(T(a+20),  bbar, x, y, fract, T(1), pol, normalised);
+            if(invert)
+            {
+               fract = -fract;
+               invert = false;
+            }
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+         }
+         else
+         {
+            fract = ibeta_fraction2(a, b, x, y, pol, normalised, p_derivative);
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+         }
+      }
+      else
+      {
+         fract = ibeta_fraction2(a, b, x, y, pol, normalised, p_derivative);
+         BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+      }
+   }
+   if(p_derivative)
+   {
+      if(*p_derivative < 0)
+      {
+         *p_derivative = ibeta_power_terms(a, b, x, y, lanczos_type(), true, pol);
+      }
+      T div = y * x;
+
+      if(*p_derivative != 0)
+      {
+         if((tools::max_value<T>() * div < *p_derivative))
+         {
+            // overflow, return an arbitarily large value:
+            *p_derivative = tools::max_value<T>() / 2;
+         }
+         else
+         {
+            *p_derivative /= div;
+         }
+      }
+   }
+   return invert ? (normalised ? 1 : boost::math::beta(a, b, pol)) - fract : fract;
+} // template <class T, class Lanczos>T ibeta_imp(T a, T b, T x, const Lanczos& l, bool inv, bool normalised)
+
+template <class T, class Policy>
+inline T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised)
+{
+   return ibeta_imp(a, b, x, pol, inv, normalised, static_cast<T*>(0));
+}
+
+template <class T, class Policy>
+T ibeta_derivative_imp(T a, T b, T x, const Policy& pol)
+{
+   static const char* function = "ibeta_derivative<%1%>(%1%,%1%,%1%)";
+   //
+   // start with the usual error checks:
+   //
+   if(a <= 0)
+      return policies::raise_domain_error<T>(function, "The argument a to the incomplete beta function must be greater than zero (got a=%1%).", a, pol);
+   if(b <= 0)
+      return policies::raise_domain_error<T>(function, "The argument b to the incomplete beta function must be greater than zero (got b=%1%).", b, pol);
+   if((x < 0) || (x > 1))
+      return policies::raise_domain_error<T>(function, "Parameter x outside the range [0,1] in the incomplete beta function (got x=%1%).", x, pol);
+   //
+   // Now the corner cases:
+   //
+   if(x == 0)
+   {
+      return (a > 1) ? 0 : 
+         (a == 1) ? 1 / boost::math::beta(a, b, pol) : policies::raise_overflow_error<T>(function, 0, pol);
+   }
+   else if(x == 1)
+   {
+      return (b > 1) ? 0 :
+         (b == 1) ? 1 / boost::math::beta(a, b, pol) : policies::raise_overflow_error<T>(function, 0, pol);
+   }
+   //
+   // Now the regular cases:
+   //
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   T f1 = ibeta_power_terms<T>(a, b, x, 1 - x, lanczos_type(), true, pol);
+   T y = (1 - x) * x;
+
+   if(f1 == 0)
+      return 0;
+   
+   if((tools::max_value<T>() * y < f1))
+   {
+      // overflow:
+      return policies::raise_overflow_error<T>(function, 0, pol);
+   }
+
+   f1 /= y;
+
+   return f1;
+}
+//
+// Some forwarding functions that dis-ambiguate the third argument type:
+//
+template <class RT1, class RT2, class Policy>
+inline typename tools::promote_args<RT1, RT2>::type 
+   beta(RT1 a, RT2 b, const Policy&, const mpl::true_*)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::beta_imp(static_cast<value_type>(a), static_cast<value_type>(b), evaluation_type(), forwarding_policy()), "boost::math::beta<%1%>(%1%,%1%)");
+}
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   beta(RT1 a, RT2 b, RT3 x, const mpl::false_*)
+{
+   return boost::math::beta(a, b, x, policies::policy<>());
+}
+} // namespace detail
+
+//
+// The actual function entry-points now follow, these just figure out
+// which Lanczos approximation to use
+// and forward to the implementation functions:
+//
+template <class RT1, class RT2, class A>
+inline typename tools::promote_args<RT1, RT2, A>::type 
+   beta(RT1 a, RT2 b, A arg)
+{
+   typedef typename policies::is_policy<A>::type tag;
+   return boost::math::detail::beta(a, b, arg, static_cast<tag*>(0));
+}
+
+template <class RT1, class RT2>
+inline typename tools::promote_args<RT1, RT2>::type 
+   beta(RT1 a, RT2 b)
+{
+   return boost::math::beta(a, b, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   beta(RT1 a, RT2 b, RT3 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::ibeta_imp(static_cast<value_type>(a), static_cast<value_type>(b), static_cast<value_type>(x), forwarding_policy(), false, false), "boost::math::beta<%1%>(%1%,%1%,%1%)");
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   betac(RT1 a, RT2 b, RT3 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::ibeta_imp(static_cast<value_type>(a), static_cast<value_type>(b), static_cast<value_type>(x), forwarding_policy(), true, false), "boost::math::betac<%1%>(%1%,%1%,%1%)");
+}
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   betac(RT1 a, RT2 b, RT3 x)
+{
+   return boost::math::betac(a, b, x, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibeta(RT1 a, RT2 b, RT3 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::ibeta_imp(static_cast<value_type>(a), static_cast<value_type>(b), static_cast<value_type>(x), forwarding_policy(), false, true), "boost::math::ibeta<%1%>(%1%,%1%,%1%)");
+}
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibeta(RT1 a, RT2 b, RT3 x)
+{
+   return boost::math::ibeta(a, b, x, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibetac(RT1 a, RT2 b, RT3 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::ibeta_imp(static_cast<value_type>(a), static_cast<value_type>(b), static_cast<value_type>(x), forwarding_policy(), true, true), "boost::math::ibetac<%1%>(%1%,%1%,%1%)");
+}
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibetac(RT1 a, RT2 b, RT3 x)
+{
+   return boost::math::ibetac(a, b, x, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibeta_derivative(RT1 a, RT2 b, RT3 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::ibeta_derivative_imp(static_cast<value_type>(a), static_cast<value_type>(b), static_cast<value_type>(x), forwarding_policy()), "boost::math::ibeta_derivative<%1%>(%1%,%1%,%1%)");
+}
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibeta_derivative(RT1 a, RT2 b, RT3 x)
+{
+   return boost::math::ibeta_derivative(a, b, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#include <boost/math/special_functions/detail/ibeta_inverse.hpp>
+#include <boost/math/special_functions/detail/ibeta_inv_ab.hpp>
+
+#endif // BOOST_MATH_SPECIAL_BETA_HPP
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/binomial.hpp b/gatb-core/thirdparty/boost/math/special_functions/binomial.hpp
new file mode 100644
index 0000000..9a24fc1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/binomial.hpp
@@ -0,0 +1,82 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_BINOMIAL_HPP
+#define BOOST_MATH_SF_BINOMIAL_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/beta.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{ namespace math{
+
+template <class T, class Policy>
+T binomial_coefficient(unsigned n, unsigned k, const Policy& pol)
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::binomial_coefficient<%1%>(unsigned, unsigned)";
+   if(k > n)
+      return policies::raise_domain_error<T>(
+         function, 
+         "The binomial coefficient is undefined for k > n, but got k = %1%.",
+         static_cast<T>(k), pol);
+   T result;
+   if((k == 0) || (k == n))
+      return static_cast<T>(1);
+   if((k == 1) || (k == n-1))
+      return static_cast<T>(n);
+
+   if(n <= max_factorial<T>::value)
+   {
+      // Use fast table lookup:
+      result = unchecked_factorial<T>(n);
+      result /= unchecked_factorial<T>(n-k);
+      result /= unchecked_factorial<T>(k);
+   }
+   else
+   {
+      // Use the beta function:
+      if(k < n - k)
+         result = k * beta(static_cast<T>(k), static_cast<T>(n-k+1), pol);
+      else
+         result = (n - k) * beta(static_cast<T>(k+1), static_cast<T>(n-k), pol);
+      if(result == 0)
+         return policies::raise_overflow_error<T>(function, 0, pol);
+      result = 1 / result;
+   }
+   // convert to nearest integer:
+   return ceil(result - 0.5f);
+}
+//
+// Type float can only store the first 35 factorials, in order to
+// increase the chance that we can use a table driven implementation
+// we'll promote to double:
+//
+template <>
+inline float binomial_coefficient<float, policies::policy<> >(unsigned n, unsigned k, const policies::policy<>& pol)
+{
+   return policies::checked_narrowing_cast<float, policies::policy<> >(binomial_coefficient<double>(n, k, pol), "boost::math::binomial_coefficient<%1%>(unsigned,unsigned)");
+}
+
+template <class T>
+inline T binomial_coefficient(unsigned n, unsigned k)
+{
+   return binomial_coefficient<T>(n, k, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+
+#endif // BOOST_MATH_SF_BINOMIAL_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/cbrt.hpp b/gatb-core/thirdparty/boost/math/special_functions/cbrt.hpp
new file mode 100644
index 0000000..0fc6e07
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/cbrt.hpp
@@ -0,0 +1,180 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_CBRT_HPP
+#define BOOST_MATH_SF_CBRT_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/mpl/divides.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail
+{
+
+struct big_int_type
+{
+   operator boost::uintmax_t()const;
+};
+
+template <class T>
+struct largest_cbrt_int_type
+{
+   typedef typename mpl::if_<
+      boost::is_convertible<big_int_type, T>,
+      boost::uintmax_t,
+      unsigned int
+   >::type type;
+};
+
+template <class T, class Policy>
+T cbrt_imp(T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // cbrt approximation for z in the range [0.5,1]
+   // It's hard to say what number of terms gives the optimum
+   // trade off between precision and performance, this seems
+   // to be about the best for double precision.
+   //
+   // Maximum Deviation Found:                     1.231e-006
+   // Expected Error Term:                         -1.231e-006
+   // Maximum Relative Change in Control Points:   5.982e-004
+   //
+   static const T P[] = { 
+      static_cast<T>(0.37568269008611818),
+      static_cast<T>(1.3304968705558024),
+      static_cast<T>(-1.4897101632445036),
+      static_cast<T>(1.2875573098219835),
+      static_cast<T>(-0.6398703759826468),
+      static_cast<T>(0.13584489959258635),
+   };
+   static const T correction[] = {
+      static_cast<T>(0.62996052494743658238360530363911),  // 2^-2/3
+      static_cast<T>(0.79370052598409973737585281963615),  // 2^-1/3
+      static_cast<T>(1),
+      static_cast<T>(1.2599210498948731647672106072782),   // 2^1/3
+      static_cast<T>(1.5874010519681994747517056392723),   // 2^2/3
+   };
+
+   if(!(boost::math::isfinite)(z))
+   {
+      return policies::raise_domain_error("boost::math::cbrt<%1%>(%1%)", "Argument to function must be finite but got %1%.", z, pol);
+   }
+
+   int i_exp, sign(1);
+   if(z < 0)
+   {
+      z = -z;
+      sign = -sign;
+   }
+   if(z == 0)
+      return 0;
+
+   T guess = frexp(z, &i_exp);
+   int original_i_exp = i_exp; // save for later
+   guess = tools::evaluate_polynomial(P, guess);
+   int i_exp3 = i_exp / 3;
+
+   typedef typename largest_cbrt_int_type<T>::type shift_type;
+
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<shift_type>::radix == 2);
+
+   if(abs(i_exp3) < std::numeric_limits<shift_type>::digits)
+   {
+      if(i_exp3 > 0)
+         guess *= shift_type(1u) << i_exp3;
+      else
+         guess /= shift_type(1u) << -i_exp3;
+   }
+   else
+   {
+      guess = ldexp(guess, i_exp3);
+   }
+   i_exp %= 3;
+   guess *= correction[i_exp + 2];
+   //
+   // Now inline Halley iteration.
+   // We do this here rather than calling tools::halley_iterate since we can
+   // simplify the expressions algebraically, and don't need most of the error
+   // checking of the boilerplate version as we know in advance that the function
+   // is well behaved...
+   //
+   typedef typename policies::precision<T, Policy>::type prec;
+   typedef typename mpl::divides<prec, mpl::int_<3> >::type prec3;
+   typedef typename mpl::plus<prec3, mpl::int_<3> >::type new_prec;
+   typedef typename policies::normalise<Policy, policies::digits2<new_prec::value> >::type new_policy;
+   //
+   // Epsilon calculation uses compile time arithmetic when it's available for type T,
+   // otherwise uses ldexp to calculate at runtime:
+   //
+   T eps = (new_prec::value > 3) ? policies::get_epsilon<T, new_policy>() : ldexp(T(1), -2 - tools::digits<T>() / 3);
+   T diff;
+
+   if(original_i_exp < std::numeric_limits<T>::max_exponent - 3)
+   {
+      //
+      // Safe from overflow, use the fast method:
+      //
+      do
+      {
+         T g3 = guess * guess * guess;
+         diff = (g3 + z + z) / (g3 + g3 + z);
+         guess *= diff;
+      }
+      while(fabs(1 - diff) > eps);
+   }
+   else
+   {
+      //
+      // Either we're ready to overflow, or we can't tell because numeric_limits isn't
+      // available for type T:
+      //
+      do
+      {
+         T g2 = guess * guess;
+         diff = (g2 - z / guess) / (2 * guess + z / g2);
+         guess -= diff;
+      }
+      while((guess * eps) < fabs(diff));
+   }
+
+   return sign * guess;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type cbrt(T z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return static_cast<result_type>(detail::cbrt_imp(value_type(z), pol));
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type cbrt(T z)
+{
+   return cbrt(z, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SF_CBRT_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/cos_pi.hpp b/gatb-core/thirdparty/boost/math/special_functions/cos_pi.hpp
new file mode 100644
index 0000000..669a2c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/cos_pi.hpp
@@ -0,0 +1,82 @@
+//  Copyright (c) 2007 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_COS_PI_HPP
+#define BOOST_MATH_COS_PI_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/constants/constants.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+T cos_pi_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   // cos of pi*x:
+   bool invert = false;
+   if(fabs(x) < 0.25)
+      return cos(constants::pi<T>() * x);
+
+   if(x < 0)
+   {
+      x = -x;
+   }
+   T rem = floor(x);
+   if(itrunc(rem, pol) & 1)
+      invert = !invert;
+   rem = x - rem;
+   if(rem > 0.5f)
+   {
+      rem = 1 - rem;
+      invert = !invert;
+   }
+   if(rem == 0.5f)
+      return 0;
+   
+   if(rem > 0.25f)
+   {
+      rem = 0.5f - rem;
+      rem = sin(constants::pi<T>() * rem);
+   }
+   else
+      rem = cos(constants::pi<T>() * rem);
+   return invert ? T(-rem) : rem;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type cos_pi(T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(boost::math::detail::cos_pi_imp<value_type>(x, forwarding_policy()), "cos_pi");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type cos_pi(T x)
+{
+   return boost::math::cos_pi(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/airy_ai_bi_zero.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/airy_ai_bi_zero.hpp
new file mode 100644
index 0000000..dbb7388
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/airy_ai_bi_zero.hpp
@@ -0,0 +1,160 @@
+//  Copyright (c) 2013 Christopher Kormanyos
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+//
+// This header contains implementation details for estimating the zeros
+// of the Airy functions airy_ai and airy_bi on the negative real axis.
+//
+#ifndef _AIRY_AI_BI_ZERO_2013_01_20_HPP_
+  #define _AIRY_AI_BI_ZERO_2013_01_20_HPP_
+
+  #include <boost/math/constants/constants.hpp>
+  #include <boost/math/special_functions/cbrt.hpp>
+
+  namespace boost { namespace math {
+  namespace detail
+  {
+    // Forward declarations of the needed Airy function implementations.
+    template <class T, class Policy>
+    T airy_ai_imp(T x, const Policy& pol);
+    template <class T, class Policy>
+    T airy_bi_imp(T x, const Policy& pol);
+    template <class T, class Policy>
+    T airy_ai_prime_imp(T x, const Policy& pol);
+    template <class T, class Policy>
+    T airy_bi_prime_imp(T x, const Policy& pol);
+
+    namespace airy_zero
+    {
+      template<class T>
+      T equation_as_10_4_105(const T& z)
+      {
+        const T one_over_z        (T(1) / z);
+        const T one_over_z_squared(one_over_z * one_over_z);
+
+        const T z_pow_third     (boost::math::cbrt(z));
+        const T z_pow_two_thirds(z_pow_third * z_pow_third);
+
+        // Implement the top line of Eq. 10.4.105.
+        const T fz(z_pow_two_thirds * (((((                     + (T(162375596875.0) / 334430208UL)
+                                           * one_over_z_squared - (   T(108056875.0) /   6967296UL))
+                                           * one_over_z_squared + (       T(77125UL) /     82944UL))
+                                           * one_over_z_squared - (           T(5U)  /        36U))
+                                           * one_over_z_squared + (           T(5U)  /        48U))
+                                           * one_over_z_squared + (1)));
+
+        return fz;
+      }
+
+      namespace airy_ai_zero_detail
+      {
+        template<class T>
+        T initial_guess(const int m)
+        {
+          T guess;
+
+          switch(m)
+          {
+            case  0: { guess = T(0);                       break; }
+            case  1: { guess = T(-2.33810741045976703849); break; }
+            case  2: { guess = T(-4.08794944413097061664); break; }
+            case  3: { guess = T(-5.52055982809555105913); break; }
+            case  4: { guess = T(-6.78670809007175899878); break; }
+            case  5: { guess = T(-7.94413358712085312314); break; }
+            case  6: { guess = T(-9.02265085334098038016); break; }
+            case  7: { guess = T(-10.0401743415580859306); break; }
+            case  8: { guess = T(-11.0085243037332628932); break; }
+            case  9: { guess = T(-11.9360155632362625170); break; }
+            case 10:{ guess = T(-12.8287767528657572004); break; }
+            default:
+            {
+              const T t(((boost::math::constants::pi<T>() * 3) * ((T(m) * 4) - 1)) / 8);
+              guess = -boost::math::detail::airy_zero::equation_as_10_4_105(t);
+              break;
+            }
+          }
+
+          return guess;
+        }
+
+        template<class T, class Policy>
+        class function_object_ai_and_ai_prime
+        {
+        public:
+          function_object_ai_and_ai_prime(const Policy pol) : my_pol(pol) { }
+
+          boost::math::tuple<T, T> operator()(const T& x) const
+          {
+            // Return a tuple containing both Ai(x) and Ai'(x).
+            return boost::math::make_tuple(
+              boost::math::detail::airy_ai_imp      (x, my_pol),
+              boost::math::detail::airy_ai_prime_imp(x, my_pol));
+          }
+
+        private:
+          const Policy& my_pol;
+          const function_object_ai_and_ai_prime& operator=(const function_object_ai_and_ai_prime&);
+        };
+      } // namespace airy_ai_zero_detail
+
+      namespace airy_bi_zero_detail
+      {
+        template<class T>
+        T initial_guess(const int m)
+        {
+          T guess;
+
+          switch(m)
+          {
+            case  0: { guess = T(0);                       break; }
+            case  1: { guess = T(-1.17371322270912792492); break; }
+            case  2: { guess = T(-3.27109330283635271568); break; }
+            case  3: { guess = T(-4.83073784166201593267); break; }
+            case  4: { guess = T(-6.16985212831025125983); break; }
+            case  5: { guess = T(-7.37676207936776371360); break; }
+            case  6: { guess = T(-8.49194884650938801345); break; }
+            case  7: { guess = T(-9.53819437934623888663); break; }
+            case  8: { guess = T(-10.5299135067053579244); break; }
+            case  9: { guess = T(-11.4769535512787794379); break; }
+            case 10: { guess = T(-12.3864171385827387456); break; }
+            default:
+            {
+              const T t(((boost::math::constants::pi<T>() * 3) * ((T(m) * 4) - 3)) / 8);
+              guess = -boost::math::detail::airy_zero::equation_as_10_4_105(t);
+              break;
+            }
+          }
+
+          return guess;
+        }
+
+        template<class T, class Policy>
+        class function_object_bi_and_bi_prime
+        {
+        public:
+          function_object_bi_and_bi_prime(const Policy pol) : my_pol(pol) { }
+
+          boost::math::tuple<T, T> operator()(const T& x) const
+          {
+            // Return a tuple containing both Bi(x) and Bi'(x).
+            return boost::math::make_tuple(
+              boost::math::detail::airy_bi_imp      (x, my_pol),
+              boost::math::detail::airy_bi_prime_imp(x, my_pol));
+          }
+
+        private:
+          const Policy& my_pol;
+          const function_object_bi_and_bi_prime& operator=(const function_object_bi_and_bi_prime&);
+        };
+      } // namespace airy_bi_zero_detail
+    } // namespace airy_zero
+  } // namespace detail
+  } // namespace math
+  } // namespaces boost
+
+#endif // _AIRY_AI_BI_ZERO_2013_01_20_HPP_
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bernoulli_details.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bernoulli_details.hpp
new file mode 100644
index 0000000..525c1fc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bernoulli_details.hpp
@@ -0,0 +1,653 @@
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 John Maddock
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BERNOULLI_DETAIL_HPP
+#define BOOST_MATH_BERNOULLI_DETAIL_HPP
+
+#include <boost/config.hpp>
+#include <boost/detail/lightweight_mutex.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/math/tools/toms748_solve.hpp>
+
+#ifdef BOOST_HAS_THREADS
+
+#ifndef BOOST_NO_CXX11_HDR_ATOMIC
+#  include <atomic>
+#  define BOOST_MATH_ATOMIC_NS std
+#if ATOMIC_INT_LOCK_FREE == 2
+typedef std::atomic<int> atomic_counter_type;
+typedef int atomic_integer_type;
+#elif ATOMIC_SHORT_LOCK_FREE == 2
+typedef std::atomic<short> atomic_counter_type;
+typedef short atomic_integer_type;
+#elif ATOMIC_LONG_LOCK_FREE == 2
+typedef std::atomic<long> atomic_counter_type;
+typedef long atomic_integer_type;
+#elif ATOMIC_LLONG_LOCK_FREE == 2
+typedef std::atomic<long long> atomic_counter_type;
+typedef long long atomic_integer_type;
+#else
+#  define BOOST_MATH_NO_ATOMIC_INT
+#endif
+
+#else // BOOST_NO_CXX11_HDR_ATOMIC
+//
+// We need Boost.Atomic, but on any platform that supports auto-linking we do
+// not need to link against a separate library:
+//
+#define BOOST_ATOMIC_NO_LIB
+#include <boost/atomic.hpp>
+#  define BOOST_MATH_ATOMIC_NS boost
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// We need a type to use as an atomic counter:
+//
+#if BOOST_ATOMIC_INT_LOCK_FREE == 2
+typedef boost::atomic<int> atomic_counter_type;
+typedef int atomic_integer_type;
+#elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
+typedef boost::atomic<short> atomic_counter_type;
+typedef short atomic_integer_type;
+#elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
+typedef boost::atomic<long> atomic_counter_type;
+typedef long atomic_integer_type;
+#elif BOOST_ATOMIC_LLONG_LOCK_FREE == 2
+typedef boost::atomic<long long> atomic_counter_type;
+typedef long long atomic_integer_type;
+#else
+#  define BOOST_MATH_NO_ATOMIC_INT
+#endif
+
+}}} // namespaces
+
+#endif  // BOOST_NO_CXX11_HDR_ATOMIC
+
+#endif // BOOST_HAS_THREADS
+
+namespace boost{ namespace math{ namespace detail{
+//
+// Asymptotic expansion for B2n due to
+// Luschny LogB3 formula (http://www.luschny.de/math/primes/bernincl.html)
+//
+template <class T, class Policy>
+T b2n_asymptotic(int n)
+{
+   BOOST_MATH_STD_USING
+   const T nx = static_cast<T>(n);
+   const T nx2(nx * nx);
+
+   const T approximate_log_of_bernoulli_bn = 
+        ((boost::math::constants::half<T>() + nx) * log(nx))
+        + ((boost::math::constants::half<T>() - nx) * log(boost::math::constants::pi<T>()))
+        + (((T(3) / 2) - nx) * boost::math::constants::ln_two<T>())
+        + ((nx * (T(2) - (nx2 * 7) * (1 + ((nx2 * 30) * ((nx2 * 12) - 1))))) / (((nx2 * nx2) * nx2) * 2520));
+   return ((n / 2) & 1 ? 1 : -1) * (approximate_log_of_bernoulli_bn > tools::log_max_value<T>() 
+      ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, nx, Policy())
+      : static_cast<T>(exp(approximate_log_of_bernoulli_bn)));
+}
+
+template <class T, class Policy>
+T t2n_asymptotic(int n)
+{
+   BOOST_MATH_STD_USING
+   // Just get B2n and convert to a Tangent number:
+   T t2n = fabs(b2n_asymptotic<T, Policy>(2 * n)) / (2 * n);
+   T p2 = ldexp(T(1), n);
+   if(tools::max_value<T>() / p2 < t2n)
+      return policies::raise_overflow_error<T>("boost::math::tangent_t2n<%1%>(std::size_t)", 0, T(n), Policy());
+   t2n *= p2;
+   p2 -= 1;
+   if(tools::max_value<T>() / p2 < t2n)
+      return policies::raise_overflow_error<T>("boost::math::tangent_t2n<%1%>(std::size_t)", 0, Policy());
+   t2n *= p2;
+   return t2n;
+}
+//
+// We need to know the approximate value of /n/ which will
+// cause bernoulli_b2n<T>(n) to return infinity - this allows
+// us to elude a great deal of runtime checking for values below
+// n, and only perform the full overflow checks when we know that we're
+// getting close to the point where our calculations will overflow.
+// We use Luschny's LogB3 formula (http://www.luschny.de/math/primes/bernincl.html) 
+// to find the limit, and since we're dealing with the log of the Bernoulli numbers
+// we need only perform the calculation at double precision and not with T
+// (which may be a multiprecision type).  The limit returned is within 1 of the true
+// limit for all the types tested.  Note that although the code below is basically
+// the same as b2n_asymptotic above, it has been recast as a continuous real-valued 
+// function as this makes the root finding go smoother/faster.  It also omits the
+// sign of the Bernoulli number.
+//
+struct max_bernoulli_root_functor
+{
+   max_bernoulli_root_functor(long long t) : target(static_cast<double>(t)) {}
+   double operator()(double n)
+   {
+      BOOST_MATH_STD_USING
+
+      // Luschny LogB3(n) formula.
+
+      const double nx2(n * n);
+
+      const double approximate_log_of_bernoulli_bn
+         =   ((boost::math::constants::half<double>() + n) * log(n))
+           + ((boost::math::constants::half<double>() - n) * log(boost::math::constants::pi<double>()))
+           + (((double(3) / 2) - n) * boost::math::constants::ln_two<double>())
+           + ((n * (2 - (nx2 * 7) * (1 + ((nx2 * 30) * ((nx2 * 12) - 1))))) / (((nx2 * nx2) * nx2) * 2520));
+
+      return approximate_log_of_bernoulli_bn - target;
+   }
+private:
+   double target;
+};
+
+template <class T, class Policy>
+inline std::size_t find_bernoulli_overflow_limit(const mpl::false_&)
+{
+   long long t = lltrunc(boost::math::tools::log_max_value<T>());
+   max_bernoulli_root_functor fun(t);
+   boost::math::tools::equal_floor tol;
+   boost::uintmax_t max_iter = boost::math::policies::get_max_root_iterations<Policy>();
+   return static_cast<std::size_t>(boost::math::tools::toms748_solve(fun, sqrt(double(t)), double(t), tol, max_iter).first) / 2;
+}
+
+template <class T, class Policy>
+inline std::size_t find_bernoulli_overflow_limit(const mpl::true_&)
+{
+   return max_bernoulli_index<bernoulli_imp_variant<T>::value>::value;
+}
+
+template <class T, class Policy>
+std::size_t b2n_overflow_limit()
+{
+   // This routine is called at program startup if it's called at all:
+   // that guarantees safe initialization of the static variable.
+   typedef mpl::bool_<(bernoulli_imp_variant<T>::value >= 1) && (bernoulli_imp_variant<T>::value <= 3)> tag_type;
+   static const std::size_t lim = find_bernoulli_overflow_limit<T, Policy>(tag_type());
+   return lim;
+}
+
+//
+// The tangent numbers grow larger much more rapidly than the Bernoulli numbers do....
+// so to compute the Bernoulli numbers from the tangent numbers, we need to avoid spurious
+// overflow in the calculation, we can do this by scaling all the tangent number by some scale factor:
+//
+template <class T>
+inline typename enable_if_c<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2), T>::type tangent_scale_factor()
+{
+   BOOST_MATH_STD_USING
+   return ldexp(T(1), std::numeric_limits<T>::min_exponent + 5);
+}
+template <class T>
+inline typename disable_if_c<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2), T>::type tangent_scale_factor()
+{
+   return tools::min_value<T>() * 16;
+}
+//
+// Initializer: ensure all our constants are initialized prior to the first call of main:
+//
+template <class T, class Policy>
+struct bernoulli_initializer
+{
+   struct init
+   {
+      init()
+      {
+         //
+         // We call twice, once to initialize our static table, and once to
+         // initialize our dymanic table:
+         //
+         boost::math::bernoulli_b2n<T>(2, Policy());
+         try{
+            boost::math::bernoulli_b2n<T>(max_bernoulli_b2n<T>::value + 1, Policy());
+         } catch(const std::overflow_error&){}
+         boost::math::tangent_t2n<T>(2, Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bernoulli_initializer<T, Policy>::init bernoulli_initializer<T, Policy>::initializer;
+
+//
+// We need something to act as a cache for our calculated Bernoulli numbers.  In order to
+// ensure both fast access and thread safety, we need a stable table which may be extended
+// in size, but which never reallocates: that way values already calculated may be accessed
+// concurrently with another thread extending the table with new values.
+//
+// Very very simple vector class that will never allocate more than once, we could use
+// boost::container::static_vector here, but that allocates on the stack, which may well
+// cause issues for the amount of memory we want in the extreme case...
+//
+template <class T>
+struct fixed_vector : private std::allocator<T>
+{
+   typedef unsigned size_type;
+   typedef T* iterator;
+   typedef const T* const_iterator;
+   fixed_vector() : m_used(0)
+   { 
+      std::size_t overflow_limit = 5 + b2n_overflow_limit<T, policies::policy<> >();
+      m_capacity = static_cast<unsigned>((std::min)(overflow_limit, static_cast<std::size_t>(100000u)));
+      m_data = this->allocate(m_capacity); 
+   }
+   ~fixed_vector()
+   {
+      for(unsigned i = 0; i < m_used; ++i)
+         this->destroy(&m_data[i]);
+      this->deallocate(m_data, m_capacity);
+   }
+   T& operator[](unsigned n) { BOOST_ASSERT(n < m_used); return m_data[n]; }
+   const T& operator[](unsigned n)const { BOOST_ASSERT(n < m_used); return m_data[n]; }
+   unsigned size()const { return m_used; }
+   unsigned size() { return m_used; }
+   void resize(unsigned n, const T& val)
+   {
+      if(n > m_capacity)
+         throw std::runtime_error("Exhausted storage for Bernoulli numbers.");
+      for(unsigned i = m_used; i < n; ++i)
+         new (m_data + i) T(val);
+      m_used = n;
+   }
+   void resize(unsigned n) { resize(n, T()); }
+   T* begin() { return m_data; }
+   T* end() { return m_data + m_used; }
+   T* begin()const { return m_data; }
+   T* end()const { return m_data + m_used; }
+   unsigned capacity()const { return m_capacity; }
+private:
+   T* m_data;
+   unsigned m_used, m_capacity;
+};
+
+template <class T, class Policy>
+class bernoulli_numbers_cache
+{
+public:
+   bernoulli_numbers_cache() : m_overflow_limit((std::numeric_limits<std::size_t>::max)())
+#if defined(BOOST_HAS_THREADS) && !defined(BOOST_MATH_NO_ATOMIC_INT)
+      , m_counter(0)
+#endif
+   {}
+
+   typedef fixed_vector<T> container_type;
+
+   void tangent(std::size_t m)
+   {
+      static const std::size_t min_overflow_index = b2n_overflow_limit<T, Policy>() - 1;
+      tn.resize(static_cast<typename container_type::size_type>(m), T(0U));
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(min_overflow_index);
+
+      std::size_t prev_size = m_intermediates.size();
+      m_intermediates.resize(m, T(0U));
+
+      if(prev_size == 0)
+      {
+         m_intermediates[1] = tangent_scale_factor<T>() /*T(1U)*/;
+         tn[0U] = T(0U);
+         tn[1U] = tangent_scale_factor<T>()/* T(1U)*/;
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[0]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[1]);
+      }
+
+      for(std::size_t i = std::max<size_t>(2, prev_size); i < m; i++)
+      {
+         bool overflow_check = false;
+         if(i >= min_overflow_index && (boost::math::tools::max_value<T>() / (i-1) < m_intermediates[1]) )
+         {
+            std::fill(tn.begin() + i, tn.end(), boost::math::tools::max_value<T>());
+            break;
+         }
+         m_intermediates[1] = m_intermediates[1] * (i-1);
+         for(std::size_t j = 2; j <= i; j++)
+         {
+            overflow_check =
+                  (i >= min_overflow_index) && (
+                  (boost::math::tools::max_value<T>() / (i - j) < m_intermediates[j])
+                  || (boost::math::tools::max_value<T>() / (i - j + 2) < m_intermediates[j-1])
+                  || (boost::math::tools::max_value<T>() - m_intermediates[j] * (i - j) < m_intermediates[j-1] * (i - j + 2))
+                  || ((boost::math::isinf)(m_intermediates[j]))
+                );
+
+            if(overflow_check)
+            {
+               std::fill(tn.begin() + i, tn.end(), boost::math::tools::max_value<T>());
+               break;
+            }
+            m_intermediates[j] = m_intermediates[j] * (i - j) + m_intermediates[j-1] * (i - j + 2);
+         }
+         if(overflow_check)
+            break; // already filled the tn...
+         tn[static_cast<typename container_type::size_type>(i)] = m_intermediates[i];
+         BOOST_MATH_INSTRUMENT_VARIABLE(i);
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[static_cast<typename container_type::size_type>(i)]);
+      }
+   }
+
+   void tangent_numbers_series(const std::size_t m)
+   {
+      BOOST_MATH_STD_USING
+      static const std::size_t min_overflow_index = b2n_overflow_limit<T, Policy>() - 1;
+
+      typename container_type::size_type old_size = bn.size();
+
+      tangent(m);
+      bn.resize(static_cast<typename container_type::size_type>(m));
+
+      if(!old_size)
+      {
+         bn[0] = 1;
+         old_size = 1;
+      }
+
+      T power_two(ldexp(T(1), static_cast<int>(2 * old_size)));
+
+      for(std::size_t i = old_size; i < m; i++)
+      {
+         T b(static_cast<T>(i * 2));
+         //
+         // Not only do we need to take care to avoid spurious over/under flow in
+         // the calculation, but we also need to avoid overflow altogether in case
+         // we're calculating with a type where "bad things" happen in that case:
+         //
+         b  = b / (power_two * tangent_scale_factor<T>());
+         b /= (power_two - 1);
+         bool overflow_check = (i >= min_overflow_index) && (tools::max_value<T>() / tn[static_cast<typename container_type::size_type>(i)] < b);
+         if(overflow_check)
+         {
+            m_overflow_limit = i;
+            while(i < m)
+            {
+               b = std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : tools::max_value<T>();
+               bn[static_cast<typename container_type::size_type>(i)] = ((i % 2U) ? b : T(-b));
+               ++i;
+            }
+            break;
+         }
+         else
+         {
+            b *= tn[static_cast<typename container_type::size_type>(i)];
+         }
+
+         power_two = ldexp(power_two, 2);
+
+         const bool b_neg = i % 2 == 0;
+
+         bn[static_cast<typename container_type::size_type>(i)] = ((!b_neg) ? b : T(-b));
+      }
+   }
+
+   template <class OutputIterator>
+   OutputIterator copy_bernoulli_numbers(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol)
+   {
+      //
+      // There are basically 3 thread safety options:
+      //
+      // 1) There are no threads (BOOST_HAS_THREADS is not defined).
+      // 2) There are threads, but we do not have a true atomic integer type, 
+      //    in this case we just use a mutex to guard against race conditions.
+      // 3) There are threads, and we have an atomic integer: in this case we can
+      //    use the double-checked locking pattern to avoid thread synchronisation
+      //    when accessing values already in the cache.
+      //
+      // First off handle the common case for overflow and/or asymptotic expansion:
+      //
+      if(start + n > bn.capacity())
+      {
+         if(start < bn.capacity())
+         {
+            out = copy_bernoulli_numbers(out, start, bn.capacity() - start, pol);
+            n -= bn.capacity() - start;
+            start = static_cast<std::size_t>(bn.capacity());
+         }
+         if(start < b2n_overflow_limit<T, Policy>() + 2u)
+         {
+            for(; n; ++start, --n)
+            {
+               *out = b2n_asymptotic<T, Policy>(static_cast<typename container_type::size_type>(start * 2U));
+               ++out;
+            }
+         }
+         for(; n; ++start, --n)
+         {
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(start), pol);
+            ++out;
+         }
+         return out;
+      }
+   #if !defined(BOOST_HAS_THREADS)
+      //
+      // Single threaded code, very simple:
+      //
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
+         ++out;
+      }
+   #elif defined(BOOST_MATH_NO_ATOMIC_INT)
+      //
+      // We need to grab a mutex every time we get here, for both readers and writers:
+      //
+      boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
+         ++out;
+      }
+
+   #else
+      //
+      // Double-checked locking pattern, lets us access cached already cached values
+      // without locking:
+      //
+      // Get the counter and see if we need to calculate more constants:
+      //
+      if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+      {
+         boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+
+         if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+         {
+            if(start + n >= bn.size())
+            {
+               std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+               tangent_numbers_series(new_size);
+            }
+            m_counter.store(static_cast<atomic_integer_type>(bn.size()), BOOST_MATH_ATOMIC_NS::memory_order_release);
+         }
+      }
+
+      for(std::size_t i = (std::max)(static_cast<std::size_t>(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[static_cast<typename container_type::size_type>(i)];
+         ++out;
+      }
+
+   #endif
+      return out;
+   }
+
+   template <class OutputIterator>
+   OutputIterator copy_tangent_numbers(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol)
+   {
+      //
+      // There are basically 3 thread safety options:
+      //
+      // 1) There are no threads (BOOST_HAS_THREADS is not defined).
+      // 2) There are threads, but we do not have a true atomic integer type, 
+      //    in this case we just use a mutex to guard against race conditions.
+      // 3) There are threads, and we have an atomic integer: in this case we can
+      //    use the double-checked locking pattern to avoid thread synchronisation
+      //    when accessing values already in the cache.
+      //
+      //
+      // First off handle the common case for overflow and/or asymptotic expansion:
+      //
+      if(start + n > bn.capacity())
+      {
+         if(start < bn.capacity())
+         {
+            out = copy_tangent_numbers(out, start, bn.capacity() - start, pol);
+            n -= bn.capacity() - start;
+            start = static_cast<std::size_t>(bn.capacity());
+         }
+         if(start < b2n_overflow_limit<T, Policy>() + 2u)
+         {
+            for(; n; ++start, --n)
+            {
+               *out = t2n_asymptotic<T, Policy>(static_cast<typename container_type::size_type>(start));
+               ++out;
+            }
+         }
+         for(; n; ++start, --n)
+         {
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(start), pol);
+            ++out;
+         }
+         return out;
+      }
+   #if !defined(BOOST_HAS_THREADS)
+      //
+      // Single threaded code, very simple:
+      //
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+   #elif defined(BOOST_MATH_NO_ATOMIC_INT)
+      //
+      // We need to grab a mutex every time we get here, for both readers and writers:
+      //
+      boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+
+   #else
+      //
+      // Double-checked locking pattern, lets us access cached already cached values
+      // without locking:
+      //
+      // Get the counter and see if we need to calculate more constants:
+      //
+      if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+      {
+         boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+
+         if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+         {
+            if(start + n >= bn.size())
+            {
+               std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+               tangent_numbers_series(new_size);
+            }
+            m_counter.store(static_cast<atomic_integer_type>(bn.size()), BOOST_MATH_ATOMIC_NS::memory_order_release);
+         }
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+
+   #endif
+      return out;
+   }
+
+private:
+   //
+   // The caches for Bernoulli and tangent numbers, once allocated,
+   // these must NEVER EVER reallocate as it breaks our thread
+   // safety guarentees:
+   //
+   fixed_vector<T> bn, tn;
+   std::vector<T> m_intermediates;
+   // The value at which we know overflow has already occurred for the Bn:
+   std::size_t m_overflow_limit;
+#if !defined(BOOST_HAS_THREADS)
+#elif defined(BOOST_MATH_NO_ATOMIC_INT)
+   boost::detail::lightweight_mutex m_mutex;
+#else
+   boost::detail::lightweight_mutex m_mutex;
+   atomic_counter_type m_counter;
+#endif
+};
+
+template <class T, class Policy>
+inline bernoulli_numbers_cache<T, Policy>& get_bernoulli_numbers_cache()
+{
+   //
+   // Force this function to be called at program startup so all the static variables
+   // get initailzed then (thread safety).
+   //
+   bernoulli_initializer<T, Policy>::force_instantiate();
+   static bernoulli_numbers_cache<T, Policy> data;
+   return data;
+}
+
+}}}
+
+#endif // BOOST_MATH_BERNOULLI_DETAIL_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_derivatives_linear.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_derivatives_linear.hpp
new file mode 100644
index 0000000..2ee86a0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_derivatives_linear.hpp
@@ -0,0 +1,75 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is a partial header, do not include on it's own!!!
+//
+// Linear combination for bessel derivatives are defined here
+#ifndef BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
+#define BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Tag, class Policy>
+inline T bessel_j_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_j_imp<T>(v-1, x, tag, pol) - boost::math::detail::cyl_bessel_j_imp<T>(v+1, x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T bessel_j_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_j_imp<T>(itrunc(v-1), x, tag, pol) - boost::math::detail::cyl_bessel_j_imp<T>(itrunc(v+1), x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T sph_bessel_j_derivative_linear(unsigned v, T x, Policy pol)
+{
+   return (v / x) * boost::math::detail::sph_bessel_j_imp<T>(v, x, pol) - boost::math::detail::sph_bessel_j_imp<T>(v+1, x, pol);
+}
+
+template <class T, class Policy>
+inline T bessel_i_derivative_linear(T v, T x, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_i_imp<T>(v-1, x, pol) + boost::math::detail::cyl_bessel_i_imp<T>(v+1, x, pol)) / 2;
+}
+
+template <class T, class Tag, class Policy>
+inline T bessel_k_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_k_imp<T>(v-1, x, tag, pol) + boost::math::detail::cyl_bessel_k_imp<T>(v+1, x, tag, pol)) / -2;
+}
+
+template <class T, class Policy>
+inline T bessel_k_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_k_imp<T>(itrunc(v-1), x, tag, pol) + boost::math::detail::cyl_bessel_k_imp<T>(itrunc(v+1), x, tag, pol)) / -2;
+}
+
+template <class T, class Tag, class Policy>
+inline T bessel_y_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_neumann_imp<T>(v-1, x, tag, pol) - boost::math::detail::cyl_neumann_imp<T>(v+1, x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T bessel_y_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_neumann_imp<T>(itrunc(v-1), x, tag, pol) - boost::math::detail::cyl_neumann_imp<T>(itrunc(v+1), x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T sph_neumann_derivative_linear(unsigned v, T x, Policy pol)
+{
+   return (v / x) * boost::math::detail::sph_neumann_imp<T>(v, x, pol) - boost::math::detail::sph_neumann_imp<T>(v+1, x, pol);
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i0.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i0.hpp
new file mode 100644
index 0000000..676eb71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i0.hpp
@@ -0,0 +1,129 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_I0_HPP
+#define BOOST_MATH_BESSEL_I0_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/assert.hpp>
+
+// Modified Bessel function of the first kind of order zero
+// minimax rational approximations on intervals, see
+// Blair and Edwards, Chalk River Report AECL-4928, 1974
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T>
+T bessel_i0(T x);
+
+template <class T>
+struct bessel_i0_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_i0(T(1));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T>
+const typename bessel_i0_initializer<T>::init bessel_i0_initializer<T>::initializer;
+
+template <typename T>
+T bessel_i0(T x)
+{
+    bessel_i0_initializer<T>::force_instantiate();
+
+    static const T P1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2335582639474375249e+15)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.5050369673018427753e+14)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.2940087627407749166e+13)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.4925101247114157499e+11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1912746104985237192e+10)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0313066708737980747e+08)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.9545626019847898221e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.4125195876041896775e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -7.0935347449210549190e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5453977791786851041e-02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.5172644670688975051e-05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.0517226450451067446e-08)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.6843448573468483278e-11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5982226675653184646e-14)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.2487866627945699800e-18)),
+    };
+    static const T Q1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2335582639474375245e+15)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.8858692566751002988e+12)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2207067397808979846e+10)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0377081058062166144e+07)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.8527560179962773045e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T P2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2210262233306573296e-04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3067392038106924055e-02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4700805721174453923e-01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.5674518371240761397e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.3517945679239481621e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.1611322818701131207e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.6090021968656180000e+00)),
+    };
+    static const T Q2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.5194330231005480228e-04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.2547697594819615062e-02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1151759188741312645e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3982595353892851542e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.0228002066743340583e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.5539563258012929600e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.1446690275135491500e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    T value, factor, r;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    BOOST_ASSERT(x >= 0); // negative x is handled before we get here
+    if (x == 0)
+    {
+        return static_cast<T>(1);
+    }
+    if (x <= 15)                        // x in (0, 15]
+    {
+        T y = x * x;
+        value = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+    }
+    else                                // x in (15, \infty)
+    {
+        T y = 1 / x - T(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_I0_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i1.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i1.hpp
new file mode 100644
index 0000000..b85bc67
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_i1.hpp
@@ -0,0 +1,133 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_I1_HPP
+#define BOOST_MATH_BESSEL_I1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/assert.hpp>
+
+// Modified Bessel function of the first kind of order one
+// minimax rational approximations on intervals, see
+// Blair and Edwards, Chalk River Report AECL-4928, 1974
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T>
+T bessel_i1(T x);
+
+template <class T>
+struct bessel_i1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_i1(T(1));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T>
+const typename bessel_i1_initializer<T>::init bessel_i1_initializer<T>::initializer;
+
+template <typename T>
+T bessel_i1(T x)
+{
+
+    bessel_i1_initializer<T>::force_instantiate();
+
+    static const T P1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4577180278143463643e+15)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.7732037840791591320e+14)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.9876779648010090070e+12)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.3357437682275493024e+11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4828267606612366099e+09)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0588550724769347106e+07)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.1894091982308017540e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8225946631657315931e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.7207090827310162436e-01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.1746443287817501309e-04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.3466829827635152875e-06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4831904935994647675e-09)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1928788903603238754e-12)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.5245515583151902910e-16)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.9705291802535139930e-19)),
+    };
+    static const T Q1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.9154360556286927285e+15)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.7887501377547640438e+12)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4386907088588283434e+10)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1594225856856884006e+07)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.1326864679904189920e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T P2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4582087408985668208e-05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.9359825138577646443e-04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.9204895411257790122e-02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.4198728018058047439e-01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3960118277609544334e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.9746376087200685843e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.5591872901933459000e-01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.0437159056137599999e-02)),
+    };
+    static const T Q2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.7510433111922824643e-05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2835624489492512649e-03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.4212010813186530069e-02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.5017476463217924408e-01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.2593714889036996297e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.8806586721556593450e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    T value, factor, r, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    BOOST_ASSERT(x >= 0); // negative x is handled before we get here
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<T>(0);
+    }
+    if (w <= 15)                        // w in (0, 15]
+    {
+        T y = x * x;
+        r = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        factor = w;
+        value = factor * r;
+    }
+    else                                // w in (15, \infty)
+    {
+        T y = 1 / w - T(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(w) / sqrt(w);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_I1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_ik.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_ik.hpp
new file mode 100644
index 0000000..10118d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_ik.hpp
@@ -0,0 +1,449 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_IK_HPP
+#define BOOST_MATH_BESSEL_IK_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/sin_pi.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/config.hpp>
+
+// Modified Bessel functions of the first and second kind of fractional order
+
+namespace boost { namespace math {
+
+namespace detail {
+
+template <class T, class Policy>
+struct cyl_bessel_i_small_z
+{
+   typedef T result_type;
+
+   cyl_bessel_i_small_z(T v_, T z_) : k(0), v(v_), mult(z_*z_/4) 
+   {
+      BOOST_MATH_STD_USING
+      term = 1;
+   }
+
+   T operator()()
+   {
+      T result = term;
+      ++k;
+      term *= mult / k;
+      term /= k + v;
+      return result;
+   }
+private:
+   unsigned k;
+   T v;
+   T term;
+   T mult;
+};
+
+template <class T, class Policy>
+inline T bessel_i_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T prefix;
+   if(v < max_factorial<T>::value)
+   {
+      prefix = pow(x / 2, v) / boost::math::tgamma(v + 1, pol);
+   }
+   else
+   {
+      prefix = v * log(x / 2) - boost::math::lgamma(v + 1, pol);
+      prefix = exp(prefix);
+   }
+   if(prefix == 0)
+      return prefix;
+
+   cyl_bessel_i_small_z<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   policies::check_series_iterations<T>("boost::math::bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   return prefix * result;
+}
+
+// Calculate K(v, x) and K(v+1, x) by method analogous to
+// Temme, Journal of Computational Physics, vol 21, 343 (1976)
+template <typename T, typename Policy>
+int temme_ik(T v, T x, T* K, T* K1, const Policy& pol)
+{
+    T f, h, p, q, coef, sum, sum1, tolerance;
+    T a, b, c, d, sigma, gamma1, gamma2;
+    unsigned long k;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+
+    // |x| <= 2, Temme series converge rapidly
+    // |x| > 2, the larger the |x|, the slower the convergence
+    BOOST_ASSERT(abs(x) <= 2);
+    BOOST_ASSERT(abs(v) <= 0.5f);
+
+    T gp = boost::math::tgamma1pm1(v, pol);
+    T gm = boost::math::tgamma1pm1(-v, pol);
+
+    a = log(x / 2);
+    b = exp(v * a);
+    sigma = -a * v;
+    c = abs(v) < tools::epsilon<T>() ?
+       T(1) : T(boost::math::sin_pi(v) / (v * pi<T>()));
+    d = abs(sigma) < tools::epsilon<T>() ?
+        T(1) : T(sinh(sigma) / sigma);
+    gamma1 = abs(v) < tools::epsilon<T>() ?
+        T(-euler<T>()) : T((0.5f / v) * (gp - gm) * c);
+    gamma2 = (2 + gp + gm) * c / 2;
+
+    // initial values
+    p = (gp + 1) / (2 * b);
+    q = (1 + gm) * b / 2;
+    f = (cosh(sigma) * gamma1 + d * (-a) * gamma2) / c;
+    h = p;
+    coef = 1;
+    sum = coef * f;
+    sum1 = coef * h;
+
+    BOOST_MATH_INSTRUMENT_VARIABLE(p);
+    BOOST_MATH_INSTRUMENT_VARIABLE(q);
+    BOOST_MATH_INSTRUMENT_VARIABLE(f);
+    BOOST_MATH_INSTRUMENT_VARIABLE(sigma);
+    BOOST_MATH_INSTRUMENT_CODE(sinh(sigma));
+    BOOST_MATH_INSTRUMENT_VARIABLE(gamma1);
+    BOOST_MATH_INSTRUMENT_VARIABLE(gamma2);
+    BOOST_MATH_INSTRUMENT_VARIABLE(c);
+    BOOST_MATH_INSTRUMENT_VARIABLE(d);
+    BOOST_MATH_INSTRUMENT_VARIABLE(a);
+
+    // series summation
+    tolerance = tools::epsilon<T>();
+    for (k = 1; k < policies::get_max_series_iterations<Policy>(); k++)
+    {
+        f = (k * f + p + q) / (k*k - v*v);
+        p /= k - v;
+        q /= k + v;
+        h = p - k * f;
+        coef *= x * x / (4 * k);
+        sum += coef * f;
+        sum1 += coef * h;
+        if (abs(coef * f) < abs(sum) * tolerance) 
+        { 
+           break; 
+        }
+    }
+    policies::check_series_iterations<T>("boost::math::bessel_ik<%1%>(%1%,%1%) in temme_ik", k, pol);
+
+    *K = sum;
+    *K1 = 2 * sum1 / x;
+
+    return 0;
+}
+
+// Evaluate continued fraction fv = I_(v+1) / I_v, derived from
+// Abramowitz and Stegun, Handbook of Mathematical Functions, 1972, 9.1.73
+template <typename T, typename Policy>
+int CF1_ik(T v, T x, T* fv, const Policy& pol)
+{
+    T C, D, f, a, b, delta, tiny, tolerance;
+    unsigned long k;
+
+    BOOST_MATH_STD_USING
+
+    // |x| <= |v|, CF1_ik converges rapidly
+    // |x| > |v|, CF1_ik needs O(|x|) iterations to converge
+
+    // modified Lentz's method, see
+    // Lentz, Applied Optics, vol 15, 668 (1976)
+    tolerance = 2 * tools::epsilon<T>();
+    BOOST_MATH_INSTRUMENT_VARIABLE(tolerance);
+    tiny = sqrt(tools::min_value<T>());
+    BOOST_MATH_INSTRUMENT_VARIABLE(tiny);
+    C = f = tiny;                           // b0 = 0, replace with tiny
+    D = 0;
+    for (k = 1; k < policies::get_max_series_iterations<Policy>(); k++)
+    {
+        a = 1;
+        b = 2 * (v + k) / x;
+        C = b + a / C;
+        D = b + a * D;
+        if (C == 0) { C = tiny; }
+        if (D == 0) { D = tiny; }
+        D = 1 / D;
+        delta = C * D;
+        f *= delta;
+        BOOST_MATH_INSTRUMENT_VARIABLE(delta-1);
+        if (abs(delta - 1) <= tolerance) 
+        { 
+           break; 
+        }
+    }
+    BOOST_MATH_INSTRUMENT_VARIABLE(k);
+    policies::check_series_iterations<T>("boost::math::bessel_ik<%1%>(%1%,%1%) in CF1_ik", k, pol);
+
+    *fv = f;
+
+    return 0;
+}
+
+// Calculate K(v, x) and K(v+1, x) by evaluating continued fraction
+// z1 / z0 = U(v+1.5, 2v+1, 2x) / U(v+0.5, 2v+1, 2x), see
+// Thompson and Barnett, Computer Physics Communications, vol 47, 245 (1987)
+template <typename T, typename Policy>
+int CF2_ik(T v, T x, T* Kv, T* Kv1, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::constants;
+
+    T S, C, Q, D, f, a, b, q, delta, tolerance, current, prev;
+    unsigned long k;
+
+    // |x| >= |v|, CF2_ik converges rapidly
+    // |x| -> 0, CF2_ik fails to converge
+
+    BOOST_ASSERT(abs(x) > 1);
+
+    // Steed's algorithm, see Thompson and Barnett,
+    // Journal of Computational Physics, vol 64, 490 (1986)
+    tolerance = tools::epsilon<T>();
+    a = v * v - 0.25f;
+    b = 2 * (x + 1);                              // b1
+    D = 1 / b;                                    // D1 = 1 / b1
+    f = delta = D;                                // f1 = delta1 = D1, coincidence
+    prev = 0;                                     // q0
+    current = 1;                                  // q1
+    Q = C = -a;                                   // Q1 = C1 because q1 = 1
+    S = 1 + Q * delta;                            // S1
+    BOOST_MATH_INSTRUMENT_VARIABLE(tolerance);
+    BOOST_MATH_INSTRUMENT_VARIABLE(a);
+    BOOST_MATH_INSTRUMENT_VARIABLE(b);
+    BOOST_MATH_INSTRUMENT_VARIABLE(D);
+    BOOST_MATH_INSTRUMENT_VARIABLE(f);
+
+    for (k = 2; k < policies::get_max_series_iterations<Policy>(); k++)     // starting from 2
+    {
+        // continued fraction f = z1 / z0
+        a -= 2 * (k - 1);
+        b += 2;
+        D = 1 / (b + a * D);
+        delta *= b * D - 1;
+        f += delta;
+
+        // series summation S = 1 + \sum_{n=1}^{\infty} C_n * z_n / z_0
+        q = (prev - (b - 2) * current) / a;
+        prev = current;
+        current = q;                        // forward recurrence for q
+        C *= -a / k;
+        Q += C * q;
+        S += Q * delta;
+        //
+        // Under some circumstances q can grow very small and C very
+        // large, leading to under/overflow.  This is particularly an
+        // issue for types which have many digits precision but a narrow
+        // exponent range.  A typical example being a "double double" type.
+        // To avoid this situation we can normalise q (and related prev/current)
+        // and C.  All other variables remain unchanged in value.  A typical
+        // test case occurs when x is close to 2, for example cyl_bessel_k(9.125, 2.125).
+        //
+        if(q < tools::epsilon<T>())
+        {
+           C *= q;
+           prev /= q;
+           current /= q;
+           q = 1;
+        }
+
+        // S converges slower than f
+        BOOST_MATH_INSTRUMENT_VARIABLE(Q * delta);
+        BOOST_MATH_INSTRUMENT_VARIABLE(abs(S) * tolerance);
+        BOOST_MATH_INSTRUMENT_VARIABLE(S);
+        if (abs(Q * delta) < abs(S) * tolerance) 
+        { 
+           break; 
+        }
+    }
+    policies::check_series_iterations<T>("boost::math::bessel_ik<%1%>(%1%,%1%) in CF2_ik", k, pol);
+
+    if(x >= tools::log_max_value<T>())
+       *Kv = exp(0.5f * log(pi<T>() / (2 * x)) - x - log(S));
+    else
+      *Kv = sqrt(pi<T>() / (2 * x)) * exp(-x) / S;
+    *Kv1 = *Kv * (0.5f + v + x + (v * v - 0.25f) * f) / x;
+    BOOST_MATH_INSTRUMENT_VARIABLE(*Kv);
+    BOOST_MATH_INSTRUMENT_VARIABLE(*Kv1);
+
+    return 0;
+}
+
+enum{
+   need_i = 1,
+   need_k = 2
+};
+
+// Compute I(v, x) and K(v, x) simultaneously by Temme's method, see
+// Temme, Journal of Computational Physics, vol 19, 324 (1975)
+template <typename T, typename Policy>
+int bessel_ik(T v, T x, T* I, T* K, int kind, const Policy& pol)
+{
+    // Kv1 = K_(v+1), fv = I_(v+1) / I_v
+    // Ku1 = K_(u+1), fu = I_(u+1) / I_u
+    T u, Iv, Kv, Kv1, Ku, Ku1, fv;
+    T W, current, prev, next;
+    bool reflect = false;
+    unsigned n, k;
+    int org_kind = kind;
+    BOOST_MATH_INSTRUMENT_VARIABLE(v);
+    BOOST_MATH_INSTRUMENT_VARIABLE(x);
+    BOOST_MATH_INSTRUMENT_VARIABLE(kind);
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    static const char* function = "boost::math::bessel_ik<%1%>(%1%,%1%)";
+
+    if (v < 0)
+    {
+        reflect = true;
+        v = -v;                             // v is non-negative from here
+        kind |= need_k;
+    }
+    n = iround(v, pol);
+    u = v - n;                              // -1/2 <= u < 1/2
+    BOOST_MATH_INSTRUMENT_VARIABLE(n);
+    BOOST_MATH_INSTRUMENT_VARIABLE(u);
+
+    if (x < 0)
+    {
+       *I = *K = policies::raise_domain_error<T>(function,
+            "Got x = %1% but real argument x must be non-negative, complex number result not supported.", x, pol);
+        return 1;
+    }
+    if (x == 0)
+    {
+       Iv = (v == 0) ? static_cast<T>(1) : static_cast<T>(0);
+       if(kind & need_k)
+       {
+         Kv = policies::raise_overflow_error<T>(function, 0, pol);
+       }
+       else
+       {
+          Kv = std::numeric_limits<T>::quiet_NaN(); // any value will do
+       }
+
+       if(reflect && (kind & need_i))
+       {
+           T z = (u + n % 2);
+           Iv = boost::math::sin_pi(z, pol) == 0 ? 
+               Iv : 
+               policies::raise_overflow_error<T>(function, 0, pol);   // reflection formula
+       }
+
+       *I = Iv;
+       *K = Kv;
+       return 0;
+    }
+
+    // x is positive until reflection
+    W = 1 / x;                                 // Wronskian
+    if (x <= 2)                                // x in (0, 2]
+    {
+        temme_ik(u, x, &Ku, &Ku1, pol);             // Temme series
+    }
+    else                                       // x in (2, \infty)
+    {
+        CF2_ik(u, x, &Ku, &Ku1, pol);               // continued fraction CF2_ik
+    }
+    BOOST_MATH_INSTRUMENT_VARIABLE(Ku);
+    BOOST_MATH_INSTRUMENT_VARIABLE(Ku1);
+    prev = Ku;
+    current = Ku1;
+    T scale = 1;
+    for (k = 1; k <= n; k++)                   // forward recurrence for K
+    {
+        T fact = 2 * (u + k) / x;
+        if((tools::max_value<T>() - fabs(prev)) / fact < fabs(current))
+        {
+           prev /= current;
+           scale /= current;
+           current = 1;
+        }
+        next = fact * current + prev;
+        prev = current;
+        current = next;
+    }
+    Kv = prev;
+    Kv1 = current;
+    BOOST_MATH_INSTRUMENT_VARIABLE(Kv);
+    BOOST_MATH_INSTRUMENT_VARIABLE(Kv1);
+    if(kind & need_i)
+    {
+       T lim = (4 * v * v + 10) / (8 * x);
+       lim *= lim;
+       lim *= lim;
+       lim /= 24;
+       if((lim < tools::epsilon<T>() * 10) && (x > 100))
+       {
+          // x is huge compared to v, CF1 may be very slow
+          // to converge so use asymptotic expansion for large
+          // x case instead.  Note that the asymptotic expansion
+          // isn't very accurate - so it's deliberately very hard 
+          // to get here - probably we're going to overflow:
+          Iv = asymptotic_bessel_i_large_x(v, x, pol);
+       }
+       else if((v > 0) && (x / v < 0.25))
+       {
+          Iv = bessel_i_small_z_series(v, x, pol);
+       }
+       else
+       {
+          CF1_ik(v, x, &fv, pol);                         // continued fraction CF1_ik
+          Iv = scale * W / (Kv * fv + Kv1);                  // Wronskian relation
+       }
+    }
+    else
+       Iv = std::numeric_limits<T>::quiet_NaN(); // any value will do
+
+    if (reflect)
+    {
+        T z = (u + n % 2);
+        T fact = (2 / pi<T>()) * (boost::math::sin_pi(z) * Kv);
+        if(fact == 0)
+           *I = Iv;
+        else if(tools::max_value<T>() * scale < fact)
+           *I = (org_kind & need_i) ? T(sign(fact) * sign(scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+        else
+         *I = Iv + fact / scale;   // reflection formula
+    }
+    else
+    {
+        *I = Iv;
+    }
+    if(tools::max_value<T>() * scale < Kv)
+      *K = (org_kind & need_k) ? T(sign(Kv) * sign(scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+    else
+      *K = Kv / scale;
+    BOOST_MATH_INSTRUMENT_VARIABLE(*I);
+    BOOST_MATH_INSTRUMENT_VARIABLE(*K);
+    return 0;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_IK_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j0.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j0.hpp
new file mode 100644
index 0000000..ebcab17
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j0.hpp
@@ -0,0 +1,193 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_J0_HPP
+#define BOOST_MATH_BESSEL_J0_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/assert.hpp>
+
+// Bessel function of the first kind of order zero
+// x <= 8, minimax rational approximations on root-bracketing intervals
+// x > 8, Hankel asymptotic expansion in Hart, Computer Approximations, 1968
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T>
+T bessel_j0(T x);
+
+template <class T>
+struct bessel_j0_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_j0(T(1));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T>
+const typename bessel_j0_initializer<T>::init bessel_j0_initializer<T>::initializer;
+
+template <typename T>
+T bessel_j0(T x)
+{
+    bessel_j0_initializer<T>::force_instantiate();
+    
+    static const T P1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.1298668500990866786e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.7282507878605942706e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.2140700423540120665e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6302997904833794242e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.6629814655107086448e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0344222815443188943e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2117036164593528341e-01))
+    };
+    static const T Q1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.3883787996332290397e+12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.6328198300859648632e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3985097372263433271e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.5612696224219938200e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.3614022392337710626e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0))
+    };
+    static const T P2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8319397969392084011e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2254078161378989535e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -7.2879702464464618998e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0341910641583726701e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1725046279757103576e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.4176707025325087628e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.4321196680624245801e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.8591703355916499363e+01))
+    };
+    static const T Q2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.5783478026152301072e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.4599102262586308984e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.4055062591169562211e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8680990008359188352e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.9458766545509337327e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.3307310774649071172e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.5258076240801555057e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T PC[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2779090197304684302e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1345386639580765797e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1170523380864944322e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4806486443249270347e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5376201909008354296e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.8961548424210455236e-01))
+    };
+    static const T QC[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2779090197304684318e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1370412495510416640e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1215350561880115730e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.5028735138235608207e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5711159858080893649e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T PS[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.9226600200800094098e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8591953644342993800e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1183429920482737611e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2300261666214198472e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2441026745835638459e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.8033303048680751817e-03))
+    };
+    static const T QS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.7105024128512061905e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1951131543434613647e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.2642780169211018836e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4887231232283756582e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.0593769594993125859e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T x1  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.4048255576957727686e+00)),
+                   x2  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.5200781102863106496e+00)),
+                   x11 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.160e+02)),
+                   x12 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.42444230422723137837e-03)),
+                   x21 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4130e+03)),
+                   x22 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.46860286310649596604e-04));
+
+    T value, factor, r, rc, rs;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    if (x < 0)
+    {
+        x = -x;                         // even function
+    }
+    if (x == 0)
+    {
+        return static_cast<T>(1);
+    }
+    if (x <= 4)                       // x in (0, 4]
+    {
+        T y = x * x;
+        BOOST_ASSERT(sizeof(P1) == sizeof(Q1));
+        r = evaluate_rational(P1, Q1, y);
+        factor = (x + x1) * ((x - x11/256) - x12);
+        value = factor * r;
+    }
+    else if (x <= 8.0)                  // x in (4, 8]
+    {
+        T y = 1 - (x * x)/64;
+        BOOST_ASSERT(sizeof(P2) == sizeof(Q2));
+        r = evaluate_rational(P2, Q2, y);
+        factor = (x + x2) * ((x - x21/256) - x22);
+        value = factor * r;
+    }
+    else                                // x in (8, \infty)
+    {
+        T y = 8 / x;
+        T y2 = y * y;
+        BOOST_ASSERT(sizeof(PC) == sizeof(QC));
+        BOOST_ASSERT(sizeof(PS) == sizeof(QS));
+        rc = evaluate_rational(PC, QC, y2);
+        rs = evaluate_rational(PS, QS, y2);
+        factor = constants::one_div_root_pi<T>() / sqrt(x);
+        //
+        // What follows is really just:
+        //
+        // T z = x - pi/4;
+        // value = factor * (rc * cos(z) - y * rs * sin(z));
+        //
+        // But using the addition formulae for sin and cos, plus
+        // the special values for sin/cos of pi/4.
+        //
+        T sx = sin(x);
+        T cx = cos(x);
+        value = factor * (rc * (cx + sx) - y * rs * (sx - cx));
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_J0_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j1.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j1.hpp
new file mode 100644
index 0000000..91ecd28
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_j1.hpp
@@ -0,0 +1,199 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_J1_HPP
+#define BOOST_MATH_BESSEL_J1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/assert.hpp>
+
+// Bessel function of the first kind of order one
+// x <= 8, minimax rational approximations on root-bracketing intervals
+// x > 8, Hankel asymptotic expansion in Hart, Computer Approximations, 1968
+
+namespace boost { namespace math{  namespace detail{
+
+template <typename T>
+T bessel_j1(T x);
+
+template <class T>
+struct bessel_j1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_j1(T(1));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T>
+const typename bessel_j1_initializer<T>::init bessel_j1_initializer<T>::initializer;
+
+template <typename T>
+T bessel_j1(T x)
+{
+    bessel_j1_initializer<T>::force_instantiate();
+
+    static const T P1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4258509801366645672e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6781041261492395835e+09)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1548696764841276794e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.8062904098958257677e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4615792982775076130e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0650724020080236441e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0767857011487300348e-02))
+    };
+    static const T Q1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1868604460820175290e+12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.2091902282580133541e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.0228375140097033958e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.9117614494174794095e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0742272239517380498e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0))
+    };
+    static const T P2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.7527881995806511112e+16)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.6608531731299018674e+15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.6658018905416665164e+13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.5580665670910619166e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8113931269860667829e+09)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.0793266148011179143e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -7.5023342220781607561e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.6179191852758252278e+00))
+    };
+    static const T Q2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7253905888447681194e+18)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7128800897135812012e+16)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.4899346165481429307e+13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.7622777286244082666e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.4872502899596389593e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1267125065029138050e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3886978985861357615e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T PC[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4357578167941278571e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.9422465050776411957e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.6033732483649391093e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5235293511811373833e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0982405543459346727e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.6116166443246101165e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0))
+    };
+    static const T QC[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4357578167941278568e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.9341243899345856590e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.5853394797230870728e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5118095066341608816e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0726385991103820119e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4550094401904961825e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T PS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.3220913409857223519e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.5145160675335701966e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6178836581270835179e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8494262873223866797e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7063754290207680021e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.5265133846636032186e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0))
+    };
+    static const T QS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.0871281941028743574e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8194580422439972989e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4194606696037208929e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.0029443582266975117e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.7890229745772202641e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.6383677696049909675e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T x1  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.8317059702075123156e+00)),
+                   x2  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.0155866698156187535e+00)),
+                   x11 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.810e+02)),
+                   x12 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.2527979248768438556e-04)),
+                   x21 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7960e+03)),
+                   x22 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.8330184381246462950e-05));
+
+    T value, factor, r, rc, rs, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<T>(0);
+    }
+    if (w <= 4)                       // w in (0, 4]
+    {
+        T y = x * x;
+        BOOST_ASSERT(sizeof(P1) == sizeof(Q1));
+        r = evaluate_rational(P1, Q1, y);
+        factor = w * (w + x1) * ((w - x11/256) - x12);
+        value = factor * r;
+    }
+    else if (w <= 8)                  // w in (4, 8]
+    {
+        T y = x * x;
+        BOOST_ASSERT(sizeof(P2) == sizeof(Q2));
+        r = evaluate_rational(P2, Q2, y);
+        factor = w * (w + x2) * ((w - x21/256) - x22);
+        value = factor * r;
+    }
+    else                                // w in (8, \infty)
+    {
+        T y = 8 / w;
+        T y2 = y * y;
+        BOOST_ASSERT(sizeof(PC) == sizeof(QC));
+        BOOST_ASSERT(sizeof(PS) == sizeof(QS));
+        rc = evaluate_rational(PC, QC, y2);
+        rs = evaluate_rational(PS, QS, y2);
+        factor = 1 / (sqrt(w) * constants::root_pi<T>());
+        //
+        // What follows is really just:
+        //
+        // T z = w - 0.75f * pi<T>();
+        // value = factor * (rc * cos(z) - y * rs * sin(z));
+        //
+        // but using the sin/cos addition rules plus constants
+        // for the values of sin/cos of 3PI/4 which then cancel
+        // out with corresponding terms in "factor".
+        //
+        T sx = sin(x);
+        T cx = cos(x);
+        value = factor * (rc * (sx - cx) + y * rs * (sx + cx));
+    }
+
+    if (x < 0)
+    {
+        value *= -1;                 // odd function
+    }
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_J1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jn.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jn.hpp
new file mode 100644
index 0000000..3f15f9c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jn.hpp
@@ -0,0 +1,134 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_JN_HPP
+#define BOOST_MATH_BESSEL_JN_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/bessel_j0.hpp>
+#include <boost/math/special_functions/detail/bessel_j1.hpp>
+#include <boost/math/special_functions/detail/bessel_jy.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_asym.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_series.hpp>
+
+// Bessel function of the first kind of integer order
+// J_n(z) is the minimal solution
+// n < abs(z), forward recurrence stable and usable
+// n >= abs(z), forward recurrence unstable, use Miller's algorithm
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_jn(int n, T x, const Policy& pol)
+{
+    T value(0), factor, current, prev, next;
+
+    BOOST_MATH_STD_USING
+
+    //
+    // Reflection has to come first:
+    //
+    if (n < 0)
+    {
+        factor = (n & 0x1) ? -1 : 1;  // J_{-n}(z) = (-1)^n J_n(z)
+        n = -n;
+    }
+    else
+    {
+        factor = 1;
+    }
+    if(x < 0)
+    {
+        factor *= (n & 0x1) ? -1 : 1;  // J_{n}(-z) = (-1)^n J_n(z)
+        x = -x;
+    }
+    //
+    // Special cases:
+    //
+    if (n == 0)
+    {
+        return factor * bessel_j0(x);
+    }
+    if (n == 1)
+    {
+        return factor * bessel_j1(x);
+    }
+
+    if (x == 0)                             // n >= 2
+    {
+        return static_cast<T>(0);
+    }
+
+    if(asymptotic_bessel_large_x_limit(T(n), x))
+      return factor * asymptotic_bessel_j_large_x_2<T>(n, x);
+
+    BOOST_ASSERT(n > 1);
+    T scale = 1;
+    if (n < abs(x))                         // forward recurrence
+    {
+        prev = bessel_j0(x);
+        current = bessel_j1(x);
+        policies::check_series_iterations<T>("boost::math::bessel_j_n<%1%>(%1%,%1%)", n, pol);
+        for (int k = 1; k < n; k++)
+        {
+            T fact = 2 * k / x;
+            //
+            // rescale if we would overflow or underflow:
+            //
+            if((fabs(fact) > 1) && ((tools::max_value<T>() - fabs(prev)) / fabs(fact) < fabs(current)))
+            {
+               scale /= current;
+               prev /= current;
+               current = 1;
+            }
+            value = fact * current - prev;
+            prev = current;
+            current = value;
+        }
+    }
+    else if((x < 1) || (n > x * x / 4) || (x < 5))
+    {
+       return factor * bessel_j_small_z_series(T(n), x, pol);
+    }
+    else                                    // backward recurrence
+    {
+        T fn; int s;                        // fn = J_(n+1) / J_n
+        // |x| <= n, fast convergence for continued fraction CF1
+        boost::math::detail::CF1_jy(static_cast<T>(n), x, &fn, &s, pol);
+        prev = fn;
+        current = 1;
+        // Check recursion won't go on too far:
+        policies::check_series_iterations<T>("boost::math::bessel_j_n<%1%>(%1%,%1%)", n, pol);
+        for (int k = n; k > 0; k--)
+        {
+            T fact = 2 * k / x;
+            if((fabs(fact) > 1) && ((tools::max_value<T>() - fabs(prev)) / fabs(fact) < fabs(current)))
+            {
+               prev /= current;
+               scale /= current;
+               current = 1;
+            }
+            next = fact * current - prev;
+            prev = current;
+            current = next;
+        }
+        value = bessel_j0(x) / current;       // normalization
+        scale = 1 / scale;
+    }
+    value *= factor;
+
+    if(tools::max_value<T>() * scale < fabs(value))
+       return policies::raise_overflow_error<T>("boost::math::bessel_jn<%1%>(%1%,%1%)", 0, pol);
+
+    return value / scale;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_JN_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy.hpp
new file mode 100644
index 0000000..b67d989
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy.hpp
@@ -0,0 +1,589 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_JY_HPP
+#define BOOST_MATH_BESSEL_JY_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/hypot.hpp>
+#include <boost/math/special_functions/sin_pi.hpp>
+#include <boost/math/special_functions/cos_pi.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_asym.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_series.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <complex>
+
+// Bessel functions of the first and second kind of fractional order
+
+namespace boost { namespace math {
+
+   namespace detail {
+
+      //
+      // Simultaneous calculation of A&S 9.2.9 and 9.2.10
+      // for use in A&S 9.2.5 and 9.2.6.
+      // This series is quick to evaluate, but divergent unless
+      // x is very large, in fact it's pretty hard to figure out
+      // with any degree of precision when this series actually 
+      // *will* converge!!  Consequently, we may just have to
+      // try it and see...
+      //
+      template <class T, class Policy>
+      bool hankel_PQ(T v, T x, T* p, T* q, const Policy& )
+      {
+         BOOST_MATH_STD_USING
+            T tolerance = 2 * policies::get_epsilon<T, Policy>();
+         *p = 1;
+         *q = 0;
+         T k = 1;
+         T z8 = 8 * x;
+         T sq = 1;
+         T mu = 4 * v * v;
+         T term = 1;
+         bool ok = true;
+         do
+         {
+            term *= (mu - sq * sq) / (k * z8);
+            *q += term;
+            k += 1;
+            sq += 2;
+            T mult = (sq * sq - mu) / (k * z8);
+            ok = fabs(mult) < 0.5f;
+            term *= mult;
+            *p += term;
+            k += 1;
+            sq += 2;
+         }
+         while((fabs(term) > tolerance * *p) && ok);
+         return ok;
+      }
+
+      // Calculate Y(v, x) and Y(v+1, x) by Temme's method, see
+      // Temme, Journal of Computational Physics, vol 21, 343 (1976)
+      template <typename T, typename Policy>
+      int temme_jy(T v, T x, T* Y, T* Y1, const Policy& pol)
+      {
+         T g, h, p, q, f, coef, sum, sum1, tolerance;
+         T a, d, e, sigma;
+         unsigned long k;
+
+         BOOST_MATH_STD_USING
+            using namespace boost::math::tools;
+         using namespace boost::math::constants;
+
+         BOOST_ASSERT(fabs(v) <= 0.5f);  // precondition for using this routine
+
+         T gp = boost::math::tgamma1pm1(v, pol);
+         T gm = boost::math::tgamma1pm1(-v, pol);
+         T spv = boost::math::sin_pi(v, pol);
+         T spv2 = boost::math::sin_pi(v/2, pol);
+         T xp = pow(x/2, v);
+
+         a = log(x / 2);
+         sigma = -a * v;
+         d = abs(sigma) < tools::epsilon<T>() ?
+            T(1) : sinh(sigma) / sigma;
+         e = abs(v) < tools::epsilon<T>() ? T(v*pi<T>()*pi<T>() / 2)
+            : T(2 * spv2 * spv2 / v);
+
+         T g1 = (v == 0) ? T(-euler<T>()) : T((gp - gm) / ((1 + gp) * (1 + gm) * 2 * v));
+         T g2 = (2 + gp + gm) / ((1 + gp) * (1 + gm) * 2);
+         T vspv = (fabs(v) < tools::epsilon<T>()) ? T(1/constants::pi<T>()) : T(v / spv);
+         f = (g1 * cosh(sigma) - g2 * a * d) * 2 * vspv;
+
+         p = vspv / (xp * (1 + gm));
+         q = vspv * xp / (1 + gp);
+
+         g = f + e * q;
+         h = p;
+         coef = 1;
+         sum = coef * g;
+         sum1 = coef * h;
+
+         T v2 = v * v;
+         T coef_mult = -x * x / 4;
+
+         // series summation
+         tolerance = policies::get_epsilon<T, Policy>();
+         for (k = 1; k < policies::get_max_series_iterations<Policy>(); k++)
+         {
+            f = (k * f + p + q) / (k*k - v2);
+            p /= k - v;
+            q /= k + v;
+            g = f + e * q;
+            h = p - k * g;
+            coef *= coef_mult / k;
+            sum += coef * g;
+            sum1 += coef * h;
+            if (abs(coef * g) < abs(sum) * tolerance) 
+            { 
+               break; 
+            }
+         }
+         policies::check_series_iterations<T>("boost::math::bessel_jy<%1%>(%1%,%1%) in temme_jy", k, pol);
+         *Y = -sum;
+         *Y1 = -2 * sum1 / x;
+
+         return 0;
+      }
+
+      // Evaluate continued fraction fv = J_(v+1) / J_v, see
+      // Abramowitz and Stegun, Handbook of Mathematical Functions, 1972, 9.1.73
+      template <typename T, typename Policy>
+      int CF1_jy(T v, T x, T* fv, int* sign, const Policy& pol)
+      {
+         T C, D, f, a, b, delta, tiny, tolerance;
+         unsigned long k;
+         int s = 1;
+
+         BOOST_MATH_STD_USING
+
+            // |x| <= |v|, CF1_jy converges rapidly
+            // |x| > |v|, CF1_jy needs O(|x|) iterations to converge
+
+            // modified Lentz's method, see
+            // Lentz, Applied Optics, vol 15, 668 (1976)
+            tolerance = 2 * policies::get_epsilon<T, Policy>();;
+         tiny = sqrt(tools::min_value<T>());
+         C = f = tiny;                           // b0 = 0, replace with tiny
+         D = 0;
+         for (k = 1; k < policies::get_max_series_iterations<Policy>() * 100; k++)
+         {
+            a = -1;
+            b = 2 * (v + k) / x;
+            C = b + a / C;
+            D = b + a * D;
+            if (C == 0) { C = tiny; }
+            if (D == 0) { D = tiny; }
+            D = 1 / D;
+            delta = C * D;
+            f *= delta;
+            if (D < 0) { s = -s; }
+            if (abs(delta - 1) < tolerance) 
+            { break; }
+         }
+         policies::check_series_iterations<T>("boost::math::bessel_jy<%1%>(%1%,%1%) in CF1_jy", k / 100, pol);
+         *fv = -f;
+         *sign = s;                              // sign of denominator
+
+         return 0;
+      }
+      //
+      // This algorithm was originally written by Xiaogang Zhang
+      // using std::complex to perform the complex arithmetic.
+      // However, that turns out to 10x or more slower than using
+      // all real-valued arithmetic, so it's been rewritten using
+      // real values only.
+      //
+      template <typename T, typename Policy>
+      int CF2_jy(T v, T x, T* p, T* q, const Policy& pol)
+      {
+         BOOST_MATH_STD_USING
+
+            T Cr, Ci, Dr, Di, fr, fi, a, br, bi, delta_r, delta_i, temp;
+         T tiny;
+         unsigned long k;
+
+         // |x| >= |v|, CF2_jy converges rapidly
+         // |x| -> 0, CF2_jy fails to converge
+         BOOST_ASSERT(fabs(x) > 1);
+
+         // modified Lentz's method, complex numbers involved, see
+         // Lentz, Applied Optics, vol 15, 668 (1976)
+         T tolerance = 2 * policies::get_epsilon<T, Policy>();
+         tiny = sqrt(tools::min_value<T>());
+         Cr = fr = -0.5f / x;
+         Ci = fi = 1;
+         //Dr = Di = 0;
+         T v2 = v * v;
+         a = (0.25f - v2) / x; // Note complex this one time only!
+         br = 2 * x;
+         bi = 2;
+         temp = Cr * Cr + 1;
+         Ci = bi + a * Cr / temp;
+         Cr = br + a / temp;
+         Dr = br;
+         Di = bi;
+         if (fabs(Cr) + fabs(Ci) < tiny) { Cr = tiny; }
+         if (fabs(Dr) + fabs(Di) < tiny) { Dr = tiny; }
+         temp = Dr * Dr + Di * Di;
+         Dr = Dr / temp;
+         Di = -Di / temp;
+         delta_r = Cr * Dr - Ci * Di;
+         delta_i = Ci * Dr + Cr * Di;
+         temp = fr;
+         fr = temp * delta_r - fi * delta_i;
+         fi = temp * delta_i + fi * delta_r;
+         for (k = 2; k < policies::get_max_series_iterations<Policy>(); k++)
+         {
+            a = k - 0.5f;
+            a *= a;
+            a -= v2;
+            bi += 2;
+            temp = Cr * Cr + Ci * Ci;
+            Cr = br + a * Cr / temp;
+            Ci = bi - a * Ci / temp;
+            Dr = br + a * Dr;
+            Di = bi + a * Di;
+            if (fabs(Cr) + fabs(Ci) < tiny) { Cr = tiny; }
+            if (fabs(Dr) + fabs(Di) < tiny) { Dr = tiny; }
+            temp = Dr * Dr + Di * Di;
+            Dr = Dr / temp;
+            Di = -Di / temp;
+            delta_r = Cr * Dr - Ci * Di;
+            delta_i = Ci * Dr + Cr * Di;
+            temp = fr;
+            fr = temp * delta_r - fi * delta_i;
+            fi = temp * delta_i + fi * delta_r;
+            if (fabs(delta_r - 1) + fabs(delta_i) < tolerance)
+               break;
+         }
+         policies::check_series_iterations<T>("boost::math::bessel_jy<%1%>(%1%,%1%) in CF2_jy", k, pol);
+         *p = fr;
+         *q = fi;
+
+         return 0;
+      }
+
+      static const int need_j = 1;
+      static const int need_y = 2;
+
+      // Compute J(v, x) and Y(v, x) simultaneously by Steed's method, see
+      // Barnett et al, Computer Physics Communications, vol 8, 377 (1974)
+      template <typename T, typename Policy>
+      int bessel_jy(T v, T x, T* J, T* Y, int kind, const Policy& pol)
+      {
+         BOOST_ASSERT(x >= 0);
+
+         T u, Jv, Ju, Yv, Yv1, Yu, Yu1(0), fv, fu;
+         T W, p, q, gamma, current, prev, next;
+         bool reflect = false;
+         unsigned n, k;
+         int s;
+         int org_kind = kind;
+         T cp = 0;
+         T sp = 0;
+
+         static const char* function = "boost::math::bessel_jy<%1%>(%1%,%1%)";
+
+         BOOST_MATH_STD_USING
+            using namespace boost::math::tools;
+         using namespace boost::math::constants;
+
+         if (v < 0)
+         {
+            reflect = true;
+            v = -v;                             // v is non-negative from here
+         }
+         if (v > static_cast<T>((std::numeric_limits<int>::max)()))
+         {
+            *J = *Y = policies::raise_evaluation_error<T>(function, "Order of Bessel function is too large to evaluate: got %1%", v, pol);
+            return 1;
+         }
+         n = iround(v, pol);
+         u = v - n;                              // -1/2 <= u < 1/2
+
+         if(reflect)
+         {
+            T z = (u + n % 2);
+            cp = boost::math::cos_pi(z, pol);
+            sp = boost::math::sin_pi(z, pol);
+            if(u != 0)
+               kind = need_j|need_y;               // need both for reflection formula
+         }
+
+         if(x == 0)
+         {
+            if(v == 0)
+               *J = 1;
+            else if((u == 0) || !reflect)
+               *J = 0;
+            else if(kind & need_j)
+               *J = policies::raise_domain_error<T>(function, "Value of Bessel J_v(x) is complex-infinity at %1%", x, pol); // complex infinity
+            else
+               *J = std::numeric_limits<T>::quiet_NaN();  // any value will do, not using J.
+
+            if((kind & need_y) == 0)
+               *Y = std::numeric_limits<T>::quiet_NaN();  // any value will do, not using Y.
+            else if(v == 0)
+               *Y = -policies::raise_overflow_error<T>(function, 0, pol);
+            else
+               *Y = policies::raise_domain_error<T>(function, "Value of Bessel Y_v(x) is complex-infinity at %1%", x, pol); // complex infinity
+            return 1;
+         }
+
+         // x is positive until reflection
+         W = T(2) / (x * pi<T>());               // Wronskian
+         T Yv_scale = 1;
+         if(((kind & need_y) == 0) && ((x < 1) || (v > x * x / 4) || (x < 5)))
+         {
+            //
+            // This series will actually converge rapidly for all small
+            // x - say up to x < 20 - but the first few terms are large
+            // and divergent which leads to large errors :-(
+            //
+            Jv = bessel_j_small_z_series(v, x, pol);
+            Yv = std::numeric_limits<T>::quiet_NaN();
+         }
+         else if((x < 1) && (u != 0) && (log(policies::get_epsilon<T, Policy>() / 2) > v * log((x/2) * (x/2) / v)))
+         {
+            // Evaluate using series representations.
+            // This is particularly important for x << v as in this
+            // area temme_jy may be slow to converge, if it converges at all.
+            // Requires x is not an integer.
+            if(kind&need_j)
+               Jv = bessel_j_small_z_series(v, x, pol);
+            else
+               Jv = std::numeric_limits<T>::quiet_NaN();
+            if((org_kind&need_y && (!reflect || (cp != 0))) 
+               || (org_kind & need_j && (reflect && (sp != 0))))
+            {
+               // Only calculate if we need it, and if the reflection formula will actually use it:
+               Yv = bessel_y_small_z_series(v, x, &Yv_scale, pol);
+            }
+            else
+               Yv = std::numeric_limits<T>::quiet_NaN();
+         }
+         else if((u == 0) && (x < policies::get_epsilon<T, Policy>()))
+         {
+            // Truncated series evaluation for small x and v an integer,
+            // much quicker in this area than temme_jy below.
+            if(kind&need_j)
+               Jv = bessel_j_small_z_series(v, x, pol);
+            else
+               Jv = std::numeric_limits<T>::quiet_NaN();
+            if((org_kind&need_y && (!reflect || (cp != 0))) 
+               || (org_kind & need_j && (reflect && (sp != 0))))
+            {
+               // Only calculate if we need it, and if the reflection formula will actually use it:
+               Yv = bessel_yn_small_z(n, x, &Yv_scale, pol);
+            }
+            else
+               Yv = std::numeric_limits<T>::quiet_NaN();
+         }
+         else if(asymptotic_bessel_large_x_limit(v, x))
+         {
+            if(kind&need_y)
+            {
+               Yv = asymptotic_bessel_y_large_x_2(v, x);
+            }
+            else
+               Yv = std::numeric_limits<T>::quiet_NaN(); // any value will do, we're not using it.
+            if(kind&need_j)
+            {
+               Jv = asymptotic_bessel_j_large_x_2(v, x);
+            }
+            else
+               Jv = std::numeric_limits<T>::quiet_NaN(); // any value will do, we're not using it.
+         }
+         else if((x > 8) && hankel_PQ(v, x, &p, &q, pol))
+         {
+            //
+            // Hankel approximation: note that this method works best when x 
+            // is large, but in that case we end up calculating sines and cosines
+            // of large values, with horrendous resulting accuracy.  It is fast though
+            // when it works....
+            //
+            // Normally we calculate sin/cos(chi) where:
+            //
+            // chi = x - fmod(T(v / 2 + 0.25f), T(2)) * boost::math::constants::pi<T>();
+            //
+            // But this introduces large errors, so use sin/cos addition formulae to
+            // improve accuracy:
+            //
+            T mod_v = fmod(T(v / 2 + 0.25f), T(2));
+            T sx = sin(x);
+            T cx = cos(x);
+            T sv = sin_pi(mod_v);
+            T cv = cos_pi(mod_v);
+
+            T sc = sx * cv - sv * cx; // == sin(chi);
+            T cc = cx * cv + sx * sv; // == cos(chi);
+            T chi = boost::math::constants::root_two<T>() / (boost::math::constants::root_pi<T>() * sqrt(x)); //sqrt(2 / (boost::math::constants::pi<T>() * x));
+            Yv = chi * (p * sc + q * cc);
+            Jv = chi * (p * cc - q * sc);
+         }
+         else if (x <= 2)                           // x in (0, 2]
+         {
+            if(temme_jy(u, x, &Yu, &Yu1, pol))             // Temme series
+            {
+               // domain error:
+               *J = *Y = Yu;
+               return 1;
+            }
+            prev = Yu;
+            current = Yu1;
+            T scale = 1;
+            policies::check_series_iterations<T>(function, n, pol);
+            for (k = 1; k <= n; k++)            // forward recurrence for Y
+            {
+               T fact = 2 * (u + k) / x;
+               if((tools::max_value<T>() - fabs(prev)) / fact < fabs(current))
+               {
+                  scale /= current;
+                  prev /= current;
+                  current = 1;
+               }
+               next = fact * current - prev;
+               prev = current;
+               current = next;
+            }
+            Yv = prev;
+            Yv1 = current;
+            if(kind&need_j)
+            {
+               CF1_jy(v, x, &fv, &s, pol);                 // continued fraction CF1_jy
+               Jv = scale * W / (Yv * fv - Yv1);           // Wronskian relation
+            }
+            else
+               Jv = std::numeric_limits<T>::quiet_NaN(); // any value will do, we're not using it.
+            Yv_scale = scale;
+         }
+         else                                    // x in (2, \infty)
+         {
+            // Get Y(u, x):
+
+            T ratio;
+            CF1_jy(v, x, &fv, &s, pol);
+            // tiny initial value to prevent overflow
+            T init = sqrt(tools::min_value<T>());
+            BOOST_MATH_INSTRUMENT_VARIABLE(init);
+            prev = fv * s * init;
+            current = s * init;
+            if(v < max_factorial<T>::value)
+            {
+               policies::check_series_iterations<T>(function, n, pol);
+               for (k = n; k > 0; k--)             // backward recurrence for J
+               {
+                  next = 2 * (u + k) * current / x - prev;
+                  prev = current;
+                  current = next;
+               }
+               ratio = (s * init) / current;     // scaling ratio
+               // can also call CF1_jy() to get fu, not much difference in precision
+               fu = prev / current;
+            }
+            else
+            {
+               //
+               // When v is large we may get overflow in this calculation
+               // leading to NaN's and other nasty surprises:
+               //
+               policies::check_series_iterations<T>(function, n, pol);
+               bool over = false;
+               for (k = n; k > 0; k--)             // backward recurrence for J
+               {
+                  T t = 2 * (u + k) / x;
+                  if((t > 1) && (tools::max_value<T>() / t < current))
+                  {
+                     over = true;
+                     break;
+                  }
+                  next = t * current - prev;
+                  prev = current;
+                  current = next;
+               }
+               if(!over)
+               {
+                  ratio = (s * init) / current;     // scaling ratio
+                  // can also call CF1_jy() to get fu, not much difference in precision
+                  fu = prev / current;
+               }
+               else
+               {
+                  ratio = 0;
+                  fu = 1;
+               }
+            }
+            CF2_jy(u, x, &p, &q, pol);                  // continued fraction CF2_jy
+            T t = u / x - fu;                   // t = J'/J
+            gamma = (p - t) / q;
+            //
+            // We can't allow gamma to cancel out to zero competely as it messes up
+            // the subsequent logic.  So pretend that one bit didn't cancel out
+            // and set to a suitably small value.  The only test case we've been able to
+            // find for this, is when v = 8.5 and x = 4*PI.
+            //
+            if(gamma == 0)
+            {
+               gamma = u * tools::epsilon<T>() / x;
+            }
+            BOOST_MATH_INSTRUMENT_VARIABLE(current);
+            BOOST_MATH_INSTRUMENT_VARIABLE(W);
+            BOOST_MATH_INSTRUMENT_VARIABLE(q);
+            BOOST_MATH_INSTRUMENT_VARIABLE(gamma);
+            BOOST_MATH_INSTRUMENT_VARIABLE(p);
+            BOOST_MATH_INSTRUMENT_VARIABLE(t);
+            Ju = sign(current) * sqrt(W / (q + gamma * (p - t)));
+            BOOST_MATH_INSTRUMENT_VARIABLE(Ju);
+
+            Jv = Ju * ratio;                    // normalization
+
+            Yu = gamma * Ju;
+            Yu1 = Yu * (u/x - p - q/gamma);
+
+            if(kind&need_y)
+            {
+               // compute Y:
+               prev = Yu;
+               current = Yu1;
+               policies::check_series_iterations<T>(function, n, pol);
+               for (k = 1; k <= n; k++)            // forward recurrence for Y
+               {
+                  T fact = 2 * (u + k) / x;
+                  if((tools::max_value<T>() - fabs(prev)) / fact < fabs(current))
+                  {
+                     prev /= current;
+                     Yv_scale /= current;
+                     current = 1;
+                  }
+                  next = fact * current - prev;
+                  prev = current;
+                  current = next;
+               }
+               Yv = prev;
+            }
+            else
+               Yv = std::numeric_limits<T>::quiet_NaN(); // any value will do, we're not using it.
+         }
+
+         if (reflect)
+         {
+            if((sp != 0) && (tools::max_value<T>() * fabs(Yv_scale) < fabs(sp * Yv)))
+               *J = org_kind & need_j ? T(-sign(sp) * sign(Yv) * sign(Yv_scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+            else
+               *J = cp * Jv - (sp == 0 ? T(0) : T((sp * Yv) / Yv_scale));     // reflection formula
+            if((cp != 0) && (tools::max_value<T>() * fabs(Yv_scale) < fabs(cp * Yv)))
+               *Y = org_kind & need_y ? T(-sign(cp) * sign(Yv) * sign(Yv_scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+            else
+               *Y = (sp != 0 ? sp * Jv : T(0)) + (cp == 0 ? T(0) : T((cp * Yv) / Yv_scale));
+         }
+         else
+         {
+            *J = Jv;
+            if(tools::max_value<T>() * fabs(Yv_scale) < fabs(Yv))
+               *Y = org_kind & need_y ? T(sign(Yv) * sign(Yv_scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+            else
+               *Y = Yv / Yv_scale;
+         }
+
+         return 0;
+      }
+
+   } // namespace detail
+
+}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_JY_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_asym.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_asym.hpp
new file mode 100644
index 0000000..81f6238
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_asym.hpp
@@ -0,0 +1,205 @@
+//  Copyright (c) 2007 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is a partial header, do not include on it's own!!!
+//
+// Contains asymptotic expansions for Bessel J(v,x) and Y(v,x)
+// functions, as x -> INF.
+//
+#ifndef BOOST_MATH_SF_DETAIL_BESSEL_JY_ASYM_HPP
+#define BOOST_MATH_SF_DETAIL_BESSEL_JY_ASYM_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/factorials.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline T asymptotic_bessel_amplitude(T v, T x)
+{
+   // Calculate the amplitude of J(v, x) and Y(v, x) for large
+   // x: see A&S 9.2.28.
+   BOOST_MATH_STD_USING
+   T s = 1;
+   T mu = 4 * v * v;
+   T txq = 2 * x;
+   txq *= txq;
+
+   s += (mu - 1) / (2 * txq);
+   s += 3 * (mu - 1) * (mu - 9) / (txq * txq * 8);
+   s += 15 * (mu - 1) * (mu - 9) * (mu - 25) / (txq * txq * txq * 8 * 6);
+
+   return sqrt(s * 2 / (constants::pi<T>() * x));
+}
+
+template <class T>
+T asymptotic_bessel_phase_mx(T v, T x)
+{
+   //
+   // Calculate the phase of J(v, x) and Y(v, x) for large x.
+   // See A&S 9.2.29.
+   // Note that the result returned is the phase less (x - PI(v/2 + 1/4))
+   // which we'll factor in later when we calculate the sines/cosines of the result:
+   //
+   T mu = 4 * v * v;
+   T denom = 4 * x;
+   T denom_mult = denom * denom;
+
+   T s = 0;
+   s += (mu - 1) / (2 * denom);
+   denom *= denom_mult;
+   s += (mu - 1) * (mu - 25) / (6 * denom);
+   denom *= denom_mult;
+   s += (mu - 1) * (mu * mu - 114 * mu + 1073) / (5 * denom);
+   denom *= denom_mult;
+   s += (mu - 1) * (5 * mu * mu * mu - 1535 * mu * mu + 54703 * mu - 375733) / (14 * denom);
+   return s;
+}
+
+template <class T>
+inline T asymptotic_bessel_y_large_x_2(T v, T x)
+{
+   // See A&S 9.2.19.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   T ampl = asymptotic_bessel_amplitude(v, x);
+   T phase = asymptotic_bessel_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 + 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   T cx = cos(x);
+   T sx = sin(x);
+   T ci = cos_pi(v / 2 + 0.25f);
+   T si = sin_pi(v / 2 + 0.25f);
+   T sin_phase = sin(phase) * (cx * ci + sx * si) + cos(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline T asymptotic_bessel_j_large_x_2(T v, T x)
+{
+   // See A&S 9.2.19.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   T ampl = asymptotic_bessel_amplitude(v, x);
+   T phase = asymptotic_bessel_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 + 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   T cx = cos(x);
+   T sx = sin(x);
+   T ci = cos_pi(v / 2 + 0.25f);
+   T si = sin_pi(v / 2 + 0.25f);
+   T sin_phase = cos(phase) * (cx * ci + sx * si) - sin(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_VARIABLE(sin_phase);
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline bool asymptotic_bessel_large_x_limit(const T& v, const T& x)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Determines if x is large enough compared to v to take the asymptotic
+   // forms above.  From A&S 9.2.28 we require: 
+   //    v < x * eps^1/8
+   // and from A&S 9.2.29 we require:
+   //    v^12/10 < 1.5 * x * eps^1/10
+   // using the former seems to work OK in practice with broadly similar 
+   // error rates either side of the divide for v < 10000.
+   // At double precision eps^1/8 ~= 0.01.
+   //
+   return (std::max)(T(fabs(v)), T(1)) < x * sqrt(tools::forth_root_epsilon<T>());
+}
+
+template <class T, class Policy>
+void temme_asyptotic_y_small_x(T v, T x, T* Y, T* Y1, const Policy& pol)
+{
+   T c = 1;
+   T p = (v / boost::math::sin_pi(v, pol)) * pow(x / 2, -v) / boost::math::tgamma(1 - v, pol);
+   T q = (v / boost::math::sin_pi(v, pol)) * pow(x / 2, v) / boost::math::tgamma(1 + v, pol);
+   T f = (p - q) / v;
+   T g_prefix = boost::math::sin_pi(v / 2, pol);
+   g_prefix *= g_prefix * 2 / v;
+   T g = f + g_prefix * q;
+   T h = p;
+   T c_mult = -x * x / 4;
+
+   T y(c * g), y1(c * h);
+
+   for(int k = 1; k < policies::get_max_series_iterations<Policy>(); ++k)
+   {
+      f = (k * f + p + q) / (k*k - v*v);
+      p /= k - v;
+      q /= k + v;
+      c *= c_mult / k;
+      T c1 = pow(-x * x / 4, k) / factorial<T>(k, pol);
+      g = f + g_prefix * q;
+      h = -k * g + p;
+      y += c * g;
+      y1 += c * h;
+      if(c * g / tools::epsilon<T>() < y)
+         break;
+   }
+
+   *Y = -y;
+   *Y1 = (-2 / x) * y1;
+}
+
+template <class T, class Policy>
+T asymptotic_bessel_i_large_x(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std names
+   T s = 1;
+   T mu = 4 * v * v;
+   T ex = 8 * x;
+   T num = mu - 1;
+   T denom = ex;
+
+   s -= num / denom;
+
+   num *= mu - 9;
+   denom *= ex * 2;
+   s += num / denom;
+
+   num *= mu - 25;
+   denom *= ex * 3;
+   s -= num / denom;
+
+   // Try and avoid overflow to the last minute:
+   T e = exp(x/2);
+
+   s = e * (e * s / sqrt(2 * x * constants::pi<T>()));
+
+   return (boost::math::isfinite)(s) ? 
+      s : policies::raise_overflow_error<T>("boost::math::asymptotic_bessel_i_large_x<%1%>(%1%,%1%)", 0, pol);
+}
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp
new file mode 100644
index 0000000..bdbfb9d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp
@@ -0,0 +1,141 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is a partial header, do not include on it's own!!!
+//
+// Contains asymptotic expansions for derivatives of Bessel J(v,x) and Y(v,x)
+// functions, as x -> INF.
+#ifndef BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
+#define BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline T asymptotic_bessel_derivative_amplitude(T v, T x)
+{
+   // Calculate the amplitude for J'(v,x) and I'(v,x)
+   // for large x: see A&S 9.2.30.
+   BOOST_MATH_STD_USING
+   T s = 1;
+   const T mu = 4 * v * v;
+   T txq = 2 * x;
+   txq *= txq;
+
+   s -= (mu - 3) / (2 * txq);
+   s -= ((mu - 1) * (mu - 45)) / (txq * txq * 8);
+
+   return sqrt(s * 2 / (boost::math::constants::pi<T>() * x));
+}
+
+template <class T>
+inline T asymptotic_bessel_derivative_phase_mx(T v, T x)
+{
+   // Calculate the phase of J'(v, x) and Y'(v, x) for large x.
+   // See A&S 9.2.31.
+   // Note that the result returned is the phase less (x - PI(v/2 - 1/4))
+   // which we'll factor in later when we calculate the sines/cosines of the result:
+   const T mu = 4 * v * v;
+   const T mu2 = mu * mu;
+   const T mu3 = mu2 * mu;
+   T denom = 4 * x;
+   T denom_mult = denom * denom;
+
+   T s = 0;
+   s += (mu + 3) / (2 * denom);
+   denom *= denom_mult;
+   s += (mu2 + (46 * mu) - 63) / (6 * denom);
+   denom *= denom_mult;
+   s += (mu3 + (185 * mu2) - (2053 * mu) + 1899) / (5 * denom);
+   return s;
+}
+
+template <class T>
+inline T asymptotic_bessel_y_derivative_large_x_2(T v, T x)
+{
+   // See A&S 9.2.20.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   const T ampl = asymptotic_bessel_derivative_amplitude(v, x);
+   const T phase = asymptotic_bessel_derivative_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 - 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   const T cx = cos(x);
+   const T sx = sin(x);
+   const T vd2shifted = (v / 2) - 0.25f;
+   const T ci = cos_pi(vd2shifted);
+   const T si = sin_pi(vd2shifted);
+   const T sin_phase = sin(phase) * (cx * ci + sx * si) + cos(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline T asymptotic_bessel_j_derivative_large_x_2(T v, T x)
+{
+   // See A&S 9.2.20.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   const T ampl = asymptotic_bessel_derivative_amplitude(v, x);
+   const T phase = asymptotic_bessel_derivative_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 - 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   const T cx = cos(x);
+   const T sx = sin(x);
+   const T vd2shifted = (v / 2) - 0.25f;
+   const T ci = cos_pi(vd2shifted);
+   const T si = sin_pi(vd2shifted);
+   const T sin_phase = cos(phase) * (cx * ci + sx * si) - sin(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_VARIABLE(sin_phase);
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline bool asymptotic_bessel_derivative_large_x_limit(const T& v, const T& x)
+{
+   BOOST_MATH_STD_USING
+   //
+   // This function is the copy of math::asymptotic_bessel_large_x_limit
+   // It means that we use the same rules for determining how x is large
+   // compared to v.
+   //
+   // Determines if x is large enough compared to v to take the asymptotic
+   // forms above.  From A&S 9.2.28 we require:
+   //    v < x * eps^1/8
+   // and from A&S 9.2.29 we require:
+   //    v^12/10 < 1.5 * x * eps^1/10
+   // using the former seems to work OK in practice with broadly similar
+   // error rates either side of the divide for v < 10000.
+   // At double precision eps^1/8 ~= 0.01.
+   //
+   return (std::max)(T(fabs(v)), T(1)) < x * sqrt(boost::math::tools::forth_root_epsilon<T>());
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp
new file mode 100644
index 0000000..0dc68fc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp
@@ -0,0 +1,220 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_JY_DERIVATIVES_SERIES_HPP
+#define BOOST_MATH_BESSEL_JY_DERIVATIVES_SERIES_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+struct bessel_j_derivative_small_z_series_term
+{
+   typedef T result_type;
+
+   bessel_j_derivative_small_z_series_term(T v_, T x)
+      : N(0), v(v_), term(1), mult(x / 2)
+   {
+      mult *= -mult;
+      // iterate if v == 0; otherwise result of
+      // first term is 0 and tools::sum_series stops
+      if (v == 0)
+         iterate();
+   }
+   T operator()()
+   {
+      T r = term * (v + 2 * N);
+      iterate();
+      return r;
+   }
+private:
+   void iterate()
+   {
+      ++N;
+      term *= mult / (N * (N + v));
+   }
+   unsigned N;
+   T v;
+   T term;
+   T mult;
+};
+//
+// Series evaluation for BesselJ'(v, z) as z -> 0.
+// It's derivative of http://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/06/01/04/01/01/0003/
+// Converges rapidly for all z << v.
+//
+template <class T, class Policy>
+inline T bessel_j_derivative_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T prefix;
+   if (v < boost::math::max_factorial<T>::value)
+   {
+      prefix = pow(x / 2, v - 1) / 2 / boost::math::tgamma(v + 1, pol);
+   }
+   else
+   {
+      prefix = (v - 1) * log(x / 2) - constants::ln_two<T>() - boost::math::lgamma(v + 1, pol);
+      prefix = exp(prefix);
+   }
+   if (0 == prefix)
+      return prefix;
+
+   bessel_j_derivative_small_z_series_term<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   boost::math::policies::check_series_iterations<T>("boost::math::bessel_j_derivative_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   return prefix * result;
+}
+
+template <class T, class Policy>
+struct bessel_y_derivative_small_z_series_term_a
+{
+   typedef T result_type;
+
+   bessel_y_derivative_small_z_series_term_a(T v_, T x)
+      : N(0), v(v_)
+   {
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term * (-v + 2 * N);
+      ++N;
+      term *= mult / (N * (N - v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+
+template <class T, class Policy>
+struct bessel_y_derivative_small_z_series_term_b
+{
+   typedef T result_type;
+
+   bessel_y_derivative_small_z_series_term_b(T v_, T x)
+      : N(0), v(v_)
+   {
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term * (v + 2 * N);
+      ++N;
+      term *= mult / (N * (N + v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+//
+// Series form for BesselY' as z -> 0,
+// It's derivative of http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/01/0003/
+// This series is only useful when the second term is small compared to the first
+// otherwise we get catestrophic cancellation errors.
+//
+// Approximating tgamma(v) by v^v, and assuming |tgamma(-z)| < eps we end up requiring:
+// eps/2 * v^v(x/2)^-v > (x/2)^v or log(eps/2) > v log((x/2)^2/v)
+//
+template <class T, class Policy>
+inline T bessel_y_derivative_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "bessel_y_derivative_small_z_series<%1%>(%1%,%1%)";
+   T prefix;
+   T gam;
+   T p = log(x / 2);
+   T scale = 1;
+   bool need_logs = (v >= boost::math::max_factorial<T>::value) || (boost::math::tools::log_max_value<T>() / v < fabs(p));
+   if (!need_logs)
+   {
+      gam = boost::math::tgamma(v, pol);
+      p = pow(x / 2, v + 1) * 2;
+      if (boost::math::tools::max_value<T>() * p < gam)
+      {
+         scale /= gam;
+         gam = 1;
+         if (boost::math::tools::max_value<T>() * p < gam)
+         {
+            return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -gam / (boost::math::constants::pi<T>() * p);
+   }
+   else
+   {
+      gam = boost::math::lgamma(v, pol);
+      p = (v + 1) * p + constants::ln_two<T>();
+      prefix = gam - log(boost::math::constants::pi<T>()) - p;
+      if (boost::math::tools::log_max_value<T>() < prefix)
+      {
+         prefix -= log(boost::math::tools::max_value<T>() / 4);
+         scale /= (boost::math::tools::max_value<T>() / 4);
+         if (boost::math::tools::log_max_value<T>() < prefix)
+         {
+            return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -exp(prefix);
+   }
+   bessel_y_derivative_small_z_series_term_a<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   boost::math::policies::check_series_iterations<T>("boost::math::bessel_y_derivative_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   result *= prefix;
+
+   p = pow(x / 2, v - 1) / 2;
+   if (!need_logs)
+   {
+      prefix = boost::math::tgamma(-v, pol) * boost::math::cos_pi(v) * p / boost::math::constants::pi<T>();
+   }
+   else
+   {
+      int sgn;
+      prefix = boost::math::lgamma(-v, &sgn, pol) + (v - 1) * log(x / 2) - constants::ln_two<T>();
+      prefix = exp(prefix) * sgn / boost::math::constants::pi<T>();
+   }
+   bessel_y_derivative_small_z_series_term_b<T, Policy> s2(v, x);
+   max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   result += scale * prefix * b;
+   return result;
+}
+
+// Calculating of BesselY'(v,x) with small x (x < epsilon) and integer x using derivatives
+// of formulas in http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/02/
+// seems to lose precision. Instead using linear combination of regular Bessel is preferred.
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_JY_DERIVATVIES_SERIES_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_series.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_series.hpp
new file mode 100644
index 0000000..d50bef8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_series.hpp
@@ -0,0 +1,261 @@
+//  Copyright (c) 2011 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_JN_SERIES_HPP
+#define BOOST_MATH_BESSEL_JN_SERIES_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost { namespace math { namespace detail{
+
+template <class T, class Policy>
+struct bessel_j_small_z_series_term
+{
+   typedef T result_type;
+
+   bessel_j_small_z_series_term(T v_, T x)
+      : N(0), v(v_)
+   {
+      BOOST_MATH_STD_USING
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term;
+      ++N;
+      term *= mult / (N * (N + v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+//
+// Series evaluation for BesselJ(v, z) as z -> 0.
+// See http://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/06/01/04/01/01/0003/
+// Converges rapidly for all z << v.
+//
+template <class T, class Policy>
+inline T bessel_j_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T prefix;
+   if(v < max_factorial<T>::value)
+   {
+      prefix = pow(x / 2, v) / boost::math::tgamma(v+1, pol);
+   }
+   else
+   {
+      prefix = v * log(x / 2) - boost::math::lgamma(v+1, pol);
+      prefix = exp(prefix);
+   }
+   if(0 == prefix)
+      return prefix;
+
+   bessel_j_small_z_series_term<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   policies::check_series_iterations<T>("boost::math::bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   return prefix * result;
+}
+
+template <class T, class Policy>
+struct bessel_y_small_z_series_term_a
+{
+   typedef T result_type;
+
+   bessel_y_small_z_series_term_a(T v_, T x)
+      : N(0), v(v_)
+   {
+      BOOST_MATH_STD_USING
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      BOOST_MATH_STD_USING
+      T r = term;
+      ++N;
+      term *= mult / (N * (N - v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+
+template <class T, class Policy>
+struct bessel_y_small_z_series_term_b
+{
+   typedef T result_type;
+
+   bessel_y_small_z_series_term_b(T v_, T x)
+      : N(0), v(v_)
+   {
+      BOOST_MATH_STD_USING
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term;
+      ++N;
+      term *= mult / (N * (N + v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+//
+// Series form for BesselY as z -> 0, 
+// see: http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/01/0003/
+// This series is only useful when the second term is small compared to the first
+// otherwise we get catestrophic cancellation errors.
+//
+// Approximating tgamma(v) by v^v, and assuming |tgamma(-z)| < eps we end up requiring:
+// eps/2 * v^v(x/2)^-v > (x/2)^v or log(eps/2) > v log((x/2)^2/v)
+//
+template <class T, class Policy>
+inline T bessel_y_small_z_series(T v, T x, T* pscale, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "bessel_y_small_z_series<%1%>(%1%,%1%)";
+   T prefix;
+   T gam;
+   T p = log(x / 2);
+   T scale = 1;
+   bool need_logs = (v >= max_factorial<T>::value) || (tools::log_max_value<T>() / v < fabs(p));
+   if(!need_logs)
+   {
+      gam = boost::math::tgamma(v, pol);
+      p = pow(x / 2, v);
+      if(tools::max_value<T>() * p < gam)
+      {
+         scale /= gam;
+         gam = 1;
+         if(tools::max_value<T>() * p < gam)
+         {
+            return -policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -gam / (constants::pi<T>() * p);
+   }
+   else
+   {
+      gam = boost::math::lgamma(v, pol);
+      p = v * p;
+      prefix = gam - log(constants::pi<T>()) - p;
+      if(tools::log_max_value<T>() < prefix)
+      {
+         prefix -= log(tools::max_value<T>() / 4);
+         scale /= (tools::max_value<T>() / 4);
+         if(tools::log_max_value<T>() < prefix)
+         {
+            return -policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -exp(prefix);
+   }
+   bessel_y_small_z_series_term_a<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   *pscale = scale;
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   policies::check_series_iterations<T>("boost::math::bessel_y_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   result *= prefix;
+
+   if(!need_logs)
+   {
+      prefix = boost::math::tgamma(-v, pol) * boost::math::cos_pi(v) * p / constants::pi<T>();
+   }
+   else
+   {
+      int sgn;
+      prefix = boost::math::lgamma(-v, &sgn, pol) + p;
+      prefix = exp(prefix) * sgn / constants::pi<T>();
+   }
+   bessel_y_small_z_series_term_b<T, Policy> s2(v, x);
+   max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   result -= scale * prefix * b;
+   return result;
+}
+
+template <class T, class Policy>
+T bessel_yn_small_z(int n, T z, T* scale, const Policy& pol)
+{
+   //
+   // See http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/02/
+   //
+   // Note that when called we assume that x < epsilon and n is a positive integer.
+   //
+   BOOST_MATH_STD_USING
+   BOOST_ASSERT(n >= 0);
+   BOOST_ASSERT((z < policies::get_epsilon<T, Policy>()));
+
+   if(n == 0)
+   {
+      return (2 / constants::pi<T>()) * (log(z / 2) +  constants::euler<T>());
+   }
+   else if(n == 1)
+   {
+      return (z / constants::pi<T>()) * log(z / 2) 
+         - 2 / (constants::pi<T>() * z) 
+         - (z / (2 * constants::pi<T>())) * (1 - 2 * constants::euler<T>());
+   }
+   else if(n == 2)
+   {
+      return (z * z) / (4 * constants::pi<T>()) * log(z / 2) 
+         - (4 / (constants::pi<T>() * z * z)) 
+         - ((z * z) / (8 * constants::pi<T>())) * (T(3)/2 - 2 * constants::euler<T>());
+   }
+   else
+   {
+      T p = pow(z / 2, n);
+      T result = -((boost::math::factorial<T>(n - 1) / constants::pi<T>()));
+      if(p * tools::max_value<T>() < result)
+      {
+         T div = tools::max_value<T>() / 8;
+         result /= div;
+         *scale /= div;
+         if(p * tools::max_value<T>() < result)
+         {
+            return -policies::raise_overflow_error<T>("bessel_yn_small_z<%1%>(%1%,%1%)", 0, pol);
+         }
+      }
+      return result / p;
+   }
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_JN_SERIES_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_zero.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_zero.hpp
new file mode 100644
index 0000000..ecd8696
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_jy_zero.hpp
@@ -0,0 +1,617 @@
+//  Copyright (c) 2013 Christopher Kormanyos
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+//
+// This header contains implementation details for estimating the zeros
+// of cylindrical Bessel and Neumann functions on the positive real axis.
+// Support is included for both positive as well as negative order.
+// Various methods are used to estimate the roots. These include
+// empirical curve fitting and McMahon's asymptotic approximation
+// for small order, uniform asymptotic expansion for large order,
+// and iteration and root interlacing for negative order.
+//
+#ifndef _BESSEL_JY_ZERO_2013_01_18_HPP_
+  #define _BESSEL_JY_ZERO_2013_01_18_HPP_
+
+  #include <algorithm>
+  #include <boost/math/constants/constants.hpp>
+  #include <boost/math/special_functions/math_fwd.hpp>
+  #include <boost/math/special_functions/cbrt.hpp>
+  #include <boost/math/special_functions/detail/airy_ai_bi_zero.hpp>
+
+  namespace boost { namespace math {
+  namespace detail
+  {
+    namespace bessel_zero
+    {
+      template<class T>
+      T equation_nist_10_21_19(const T& v, const T& a)
+      {
+        // Get the initial estimate of the m'th root of Jv or Yv.
+        // This subroutine is used for the order m with m > 1.
+        // The order m has been used to create the input parameter a.
+
+        // This is Eq. 10.21.19 in the NIST Handbook.
+        const T mu                  = (v * v) * 4U;
+        const T mu_minus_one        = mu - T(1);
+        const T eight_a_inv         = T(1) / (a * 8U);
+        const T eight_a_inv_squared = eight_a_inv * eight_a_inv;
+
+        const T term3 = ((mu_minus_one *  4U) *     ((mu *    7U) -     T(31U) )) / 3U;
+        const T term5 = ((mu_minus_one * 32U) *   ((((mu *   83U) -    T(982U) ) * mu) +    T(3779U) )) / 15U;
+        const T term7 = ((mu_minus_one * 64U) * ((((((mu * 6949U) - T(153855UL)) * mu) + T(1585743UL)) * mu) - T(6277237UL))) / 105U;
+
+        return a + ((((                      - term7
+                       * eight_a_inv_squared - term5)
+                       * eight_a_inv_squared - term3)
+                       * eight_a_inv_squared - mu_minus_one)
+                       * eight_a_inv);
+      }
+
+      template<typename T>
+      class equation_as_9_3_39_and_its_derivative
+      {
+      public:
+        equation_as_9_3_39_and_its_derivative(const T& zt) : zeta(zt) { }
+
+        boost::math::tuple<T, T> operator()(const T& z) const
+        {
+          BOOST_MATH_STD_USING // ADL of std names, needed for acos, sqrt.
+
+          // Return the function of zeta that is implicitly defined
+          // in A&S Eq. 9.3.39 as a function of z. The function is
+          // returned along with its derivative with respect to z.
+
+          const T zsq_minus_one_sqrt = sqrt((z * z) - T(1));
+
+          const T the_function(
+              zsq_minus_one_sqrt
+            - (  acos(T(1) / z) + ((T(2) / 3U) * (zeta * sqrt(zeta)))));
+
+          const T its_derivative(zsq_minus_one_sqrt / z);
+
+          return boost::math::tuple<T, T>(the_function, its_derivative);
+        }
+
+      private:
+        const equation_as_9_3_39_and_its_derivative& operator=(const equation_as_9_3_39_and_its_derivative&);
+        const T zeta;
+      };
+
+      template<class T>
+      static T equation_as_9_5_26(const T& v, const T& ai_bi_root)
+      {
+        BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
+
+        // Obtain the estimate of the m'th zero of Jv or Yv.
+        // The order m has been used to create the input parameter ai_bi_root.
+        // Here, v is larger than about 2.2. The estimate is computed
+        // from Abramowitz and Stegun Eqs. 9.5.22 and 9.5.26, page 371.
+        //
+        // The inversion of z as a function of zeta is mentioned in the text
+        // following A&S Eq. 9.5.26. Here, we accomplish the inversion by
+        // performing a Taylor expansion of Eq. 9.3.39 for large z to order 2
+        // and solving the resulting quadratic equation, thereby taking
+        // the positive root of the quadratic.
+        // In other words: (2/3)(-zeta)^(3/2) approx = z + 1/(2z) - pi/2.
+        // This leads to: z^2 - [(2/3)(-zeta)^(3/2) + pi/2]z + 1/2 = 0.
+        //
+        // With this initial estimate, Newton-Raphson iteration is used
+        // to refine the value of the estimate of the root of z
+        // as a function of zeta.
+
+        const T v_pow_third(boost::math::cbrt(v));
+        const T v_pow_minus_two_thirds(T(1) / (v_pow_third * v_pow_third));
+
+        // Obtain zeta using the order v combined with the m'th root of
+        // an airy function, as shown in  A&S Eq. 9.5.22.
+        const T zeta = v_pow_minus_two_thirds * (-ai_bi_root);
+
+        const T zeta_sqrt = sqrt(zeta);
+
+        // Set up a quadratic equation based on the Taylor series
+        // expansion mentioned above.
+        const T b = -((((zeta * zeta_sqrt) * 2U) / 3U) + boost::math::constants::half_pi<T>());
+
+        // Solve the quadratic equation, taking the positive root.
+        const T z_estimate = (-b + sqrt((b * b) - T(2))) / 2U;
+
+        // Establish the range, the digits, and the iteration limit
+        // for the upcoming root-finding.
+        const T range_zmin = (std::max<T>)(z_estimate - T(1), T(1));
+        const T range_zmax = z_estimate + T(1);
+
+        const int my_digits10 = static_cast<int>(static_cast<float>(boost::math::tools::digits<T>() * 0.301F));
+
+        // Select the maximum allowed iterations based on the number
+        // of decimal digits in the numeric type T, being at least 12.
+        const boost::uintmax_t iterations_allowed = static_cast<boost::uintmax_t>((std::max)(12, my_digits10 * 2));
+
+        boost::uintmax_t iterations_used = iterations_allowed;
+
+        // Calculate the root of z as a function of zeta.
+        const T z = boost::math::tools::newton_raphson_iterate(
+          boost::math::detail::bessel_zero::equation_as_9_3_39_and_its_derivative<T>(zeta),
+          z_estimate,
+          range_zmin,
+          range_zmax,
+          (std::min)(boost::math::tools::digits<T>(), boost::math::tools::digits<float>()),
+          iterations_used);
+
+        static_cast<void>(iterations_used);
+
+        // Continue with the implementation of A&S Eq. 9.3.39.
+        const T zsq_minus_one      = (z * z) - T(1);
+        const T zsq_minus_one_sqrt = sqrt(zsq_minus_one);
+
+        // This is A&S Eq. 9.3.42.
+        const T b0_term_5_24 = T(5) / ((zsq_minus_one * zsq_minus_one_sqrt) * 24U);
+        const T b0_term_1_8  = T(1) / ( zsq_minus_one_sqrt * 8U);
+        const T b0_term_5_48 = T(5) / ((zeta * zeta) * 48U);
+
+        const T b0 = -b0_term_5_48 + ((b0_term_5_24 + b0_term_1_8) / zeta_sqrt);
+
+        // This is the second line of A&S Eq. 9.5.26 for f_k with k = 1.
+        const T f1 = ((z * zeta_sqrt) * b0) / zsq_minus_one_sqrt;
+
+        // This is A&S Eq. 9.5.22 expanded to k = 1 (i.e., one term in the series).
+        return (v * z) + (f1 / v);
+      }
+
+      namespace cyl_bessel_j_zero_detail
+      {
+        template<class T>
+        T equation_nist_10_21_40_a(const T& v)
+        {
+          const T v_pow_third(boost::math::cbrt(v));
+          const T v_pow_minus_two_thirds(T(1) / (v_pow_third * v_pow_third));
+
+          return v * (((((                         + T(0.043)
+                          * v_pow_minus_two_thirds - T(0.0908))
+                          * v_pow_minus_two_thirds - T(0.00397))
+                          * v_pow_minus_two_thirds + T(1.033150))
+                          * v_pow_minus_two_thirds + T(1.8557571))
+                          * v_pow_minus_two_thirds + T(1));
+        }
+
+        template<class T, class Policy>
+        class function_object_jv
+        {
+        public:
+          function_object_jv(const T& v,
+                             const Policy& pol) : my_v(v),
+                                                  my_pol(pol) { }
+
+          T operator()(const T& x) const
+          {
+            return boost::math::cyl_bessel_j(my_v, x, my_pol);
+          }
+
+        private:
+          const T my_v;
+          const Policy& my_pol;
+          const function_object_jv& operator=(const function_object_jv&);
+        };
+
+        template<class T, class Policy>
+        class function_object_jv_and_jv_prime
+        {
+        public:
+          function_object_jv_and_jv_prime(const T& v,
+                                          const bool order_is_zero,
+                                          const Policy& pol) : my_v(v),
+                                                               my_order_is_zero(order_is_zero),
+                                                               my_pol(pol) { }
+
+          boost::math::tuple<T, T> operator()(const T& x) const
+          {
+            // Obtain Jv(x) and Jv'(x).
+            // Chris's original code called the Bessel function implementation layer direct, 
+            // but that circumvented optimizations for integer-orders.  Call the documented
+            // top level functions instead, and let them sort out which implementation to use.
+            T j_v;
+            T j_v_prime;
+
+            if(my_order_is_zero)
+            {
+              j_v       =  boost::math::cyl_bessel_j(0, x, my_pol);
+              j_v_prime = -boost::math::cyl_bessel_j(1, x, my_pol);
+            }
+            else
+            {
+                      j_v       = boost::math::cyl_bessel_j(  my_v,      x, my_pol);
+              const T j_v_m1     (boost::math::cyl_bessel_j(T(my_v - 1), x, my_pol));
+                      j_v_prime = j_v_m1 - ((my_v * j_v) / x);
+            }
+
+            // Return a tuple containing both Jv(x) and Jv'(x).
+            return boost::math::make_tuple(j_v, j_v_prime);
+          }
+
+        private:
+          const T my_v;
+          const bool my_order_is_zero;
+          const Policy& my_pol;
+          const function_object_jv_and_jv_prime& operator=(const function_object_jv_and_jv_prime&);
+        };
+
+        template<class T> bool my_bisection_unreachable_tolerance(const T&, const T&) { return false; }
+
+        template<class T, class Policy>
+        T initial_guess(const T& v, const int m, const Policy& pol)
+        {
+          BOOST_MATH_STD_USING // ADL of std names, needed for floor.
+
+          // Compute an estimate of the m'th root of cyl_bessel_j.
+
+          T guess;
+
+          // There is special handling for negative order.
+          if(v < 0)
+          {
+            if((m == 1) && (v > -0.5F))
+            {
+              // For small, negative v, use the results of empirical curve fitting.
+              // Mathematica(R) session for the coefficients:
+              //  Table[{n, BesselJZero[n, 1]}, {n, -(1/2), 0, 1/10}]
+              //  N[%, 20]
+              //  Fit[%, {n^0, n^1, n^2, n^3, n^4, n^5, n^6}, n]
+              guess = (((((    - T(0.2321156900729)
+                           * v - T(0.1493247777488))
+                           * v - T(0.15205419167239))
+                           * v + T(0.07814930561249))
+                           * v - T(0.17757573537688))
+                           * v + T(1.542805677045663))
+                           * v + T(2.40482555769577277);
+
+              return guess;
+            }
+
+            // Create the positive order and extract its positive floor integer part.
+            const T vv(-v);
+            const T vv_floor(floor(vv));
+
+            // The to-be-found root is bracketed by the roots of the
+            // Bessel function whose reflected, positive integer order
+            // is less than, but nearest to vv.
+
+            T root_hi = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess(vv_floor, m, pol);
+            T root_lo;
+
+            if(m == 1)
+            {
+              // The estimate of the first root for negative order is found using
+              // an adaptive range-searching algorithm.
+              root_lo = T(root_hi - 0.1F);
+
+              const bool hi_end_of_bracket_is_negative = (boost::math::cyl_bessel_j(v, root_hi, pol) < 0);
+
+              while((root_lo > boost::math::tools::epsilon<T>()))
+              {
+                const bool lo_end_of_bracket_is_negative = (boost::math::cyl_bessel_j(v, root_lo, pol) < 0);
+
+                if(hi_end_of_bracket_is_negative != lo_end_of_bracket_is_negative)
+                {
+                  break;
+                }
+
+                root_hi = root_lo;
+
+                // Decrease the lower end of the bracket using an adaptive algorithm.
+                if(root_lo > 0.5F)
+                {
+                  root_lo -= 0.5F;
+                }
+                else
+                {
+                  root_lo *= 0.75F;
+                }
+              }
+            }
+            else
+            {
+              root_lo = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess(vv_floor, m - 1, pol);
+            }
+
+            // Perform several steps of bisection iteration to refine the guess.
+            boost::uintmax_t number_of_iterations(12U);
+
+            // Do the bisection iteration.
+            const boost::math::tuple<T, T> guess_pair =
+               boost::math::tools::bisect(
+                  boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::function_object_jv<T, Policy>(v, pol),
+                  root_lo,
+                  root_hi,
+                  boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::my_bisection_unreachable_tolerance<T>,
+                  number_of_iterations);
+
+            return (boost::math::get<0>(guess_pair) + boost::math::get<1>(guess_pair)) / 2U;
+          }
+
+          if(m == 1U)
+          {
+            // Get the initial estimate of the first root.
+
+            if(v < 2.2F)
+            {
+              // For small v, use the results of empirical curve fitting.
+              // Mathematica(R) session for the coefficients:
+              //  Table[{n, BesselJZero[n, 1]}, {n, 0, 22/10, 1/10}]
+              //  N[%, 20]
+              //  Fit[%, {n^0, n^1, n^2, n^3, n^4, n^5, n^6}, n]
+              guess = (((((    - T(0.0008342379046010)
+                           * v + T(0.007590035637410))
+                           * v - T(0.030640914772013))
+                           * v + T(0.078232088020106))
+                           * v - T(0.169668712590620))
+                           * v + T(1.542187960073750))
+                           * v + T(2.4048359915254634);
+            }
+            else
+            {
+              // For larger v, use the first line of Eqs. 10.21.40 in the NIST Handbook.
+              guess = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::equation_nist_10_21_40_a(v);
+            }
+          }
+          else
+          {
+            if(v < 2.2F)
+            {
+              // Use Eq. 10.21.19 in the NIST Handbook.
+              const T a(((v + T(m * 2U)) - T(0.5)) * boost::math::constants::half_pi<T>());
+
+              guess = boost::math::detail::bessel_zero::equation_nist_10_21_19(v, a);
+            }
+            else
+            {
+              // Get an estimate of the m'th root of airy_ai.
+              const T airy_ai_root(boost::math::detail::airy_zero::airy_ai_zero_detail::initial_guess<T>(m));
+
+              // Use Eq. 9.5.26 in the A&S Handbook.
+              guess = boost::math::detail::bessel_zero::equation_as_9_5_26(v, airy_ai_root);
+            }
+          }
+
+          return guess;
+        }
+      } // namespace cyl_bessel_j_zero_detail
+
+      namespace cyl_neumann_zero_detail
+      {
+        template<class T>
+        T equation_nist_10_21_40_b(const T& v)
+        {
+          const T v_pow_third(boost::math::cbrt(v));
+          const T v_pow_minus_two_thirds(T(1) / (v_pow_third * v_pow_third));
+
+          return v * (((((                         - T(0.001)
+                          * v_pow_minus_two_thirds - T(0.0060))
+                          * v_pow_minus_two_thirds + T(0.01198))
+                          * v_pow_minus_two_thirds + T(0.260351))
+                          * v_pow_minus_two_thirds + T(0.9315768))
+                          * v_pow_minus_two_thirds + T(1));
+        }
+
+        template<class T, class Policy>
+        class function_object_yv
+        {
+        public:
+          function_object_yv(const T& v,
+                             const Policy& pol) : my_v(v),
+                                                  my_pol(pol) { }
+
+          T operator()(const T& x) const
+          {
+            return boost::math::cyl_neumann(my_v, x, my_pol);
+          }
+
+        private:
+          const T my_v;
+          const Policy& my_pol;
+          const function_object_yv& operator=(const function_object_yv&);
+        };
+
+        template<class T, class Policy>
+        class function_object_yv_and_yv_prime
+        {
+        public:
+          function_object_yv_and_yv_prime(const T& v,
+                                          const Policy& pol) : my_v(v),
+                                                               my_pol(pol) { }
+
+          boost::math::tuple<T, T> operator()(const T& x) const
+          {
+            const T half_epsilon(boost::math::tools::epsilon<T>() / 2U);
+
+            const bool order_is_zero = ((my_v > -half_epsilon) && (my_v < +half_epsilon));
+
+            // Obtain Yv(x) and Yv'(x).
+            // Chris's original code called the Bessel function implementation layer direct, 
+            // but that circumvented optimizations for integer-orders.  Call the documented
+            // top level functions instead, and let them sort out which implementation to use.
+            T y_v;
+            T y_v_prime;
+
+            if(order_is_zero)
+            {
+              y_v       =  boost::math::cyl_neumann(0, x, my_pol);
+              y_v_prime = -boost::math::cyl_neumann(1, x, my_pol);
+            }
+            else
+            {
+                      y_v       = boost::math::cyl_neumann(  my_v,      x, my_pol);
+              const T y_v_m1     (boost::math::cyl_neumann(T(my_v - 1), x, my_pol));
+                      y_v_prime = y_v_m1 - ((my_v * y_v) / x);
+            }
+
+            // Return a tuple containing both Yv(x) and Yv'(x).
+            return boost::math::make_tuple(y_v, y_v_prime);
+          }
+
+        private:
+          const T my_v;
+          const Policy& my_pol;
+          const function_object_yv_and_yv_prime& operator=(const function_object_yv_and_yv_prime&);
+        };
+
+        template<class T> bool my_bisection_unreachable_tolerance(const T&, const T&) { return false; }
+
+        template<class T, class Policy>
+        T initial_guess(const T& v, const int m, const Policy& pol)
+        {
+          BOOST_MATH_STD_USING // ADL of std names, needed for floor.
+
+          // Compute an estimate of the m'th root of cyl_neumann.
+
+          T guess;
+
+          // There is special handling for negative order.
+          if(v < 0)
+          {
+            // Create the positive order and extract its positive floor and ceiling integer parts.
+            const T vv(-v);
+            const T vv_floor(floor(vv));
+
+            // The to-be-found root is bracketed by the roots of the
+            // Bessel function whose reflected, positive integer order
+            // is less than, but nearest to vv.
+
+            // The special case of negative, half-integer order uses
+            // the relation between Yv and spherical Bessel functions
+            // in order to obtain the bracket for the root.
+            // In these special cases, cyl_neumann(-n/2, x) = sph_bessel_j(+n/2, x)
+            // for v = -n/2.
+
+            T root_hi;
+            T root_lo;
+
+            if(m == 1)
+            {
+              // The estimate of the first root for negative order is found using
+              // an adaptive range-searching algorithm.
+              // Take special precautions for the discontinuity at negative,
+              // half-integer orders and use different brackets above and below these.
+              if(T(vv - vv_floor) < 0.5F)
+              {
+                root_hi = boost::math::detail::bessel_zero::cyl_neumann_zero_detail::initial_guess(vv_floor, m, pol);
+              }
+              else
+              {
+                root_hi = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess(T(vv_floor + 0.5F), m, pol);
+              }
+
+              root_lo = T(root_hi - 0.1F);
+
+              const bool hi_end_of_bracket_is_negative = (boost::math::cyl_neumann(v, root_hi, pol) < 0);
+
+              while((root_lo > boost::math::tools::epsilon<T>()))
+              {
+                const bool lo_end_of_bracket_is_negative = (boost::math::cyl_neumann(v, root_lo, pol) < 0);
+
+                if(hi_end_of_bracket_is_negative != lo_end_of_bracket_is_negative)
+                {
+                  break;
+                }
+
+                root_hi = root_lo;
+
+                // Decrease the lower end of the bracket using an adaptive algorithm.
+                if(root_lo > 0.5F)
+                {
+                  root_lo -= 0.5F;
+                }
+                else
+                {
+                  root_lo *= 0.75F;
+                }
+              }
+            }
+            else
+            {
+              if(T(vv - vv_floor) < 0.5F)
+              {
+                root_lo  = boost::math::detail::bessel_zero::cyl_neumann_zero_detail::initial_guess(vv_floor, m - 1, pol);
+                root_hi = boost::math::detail::bessel_zero::cyl_neumann_zero_detail::initial_guess(vv_floor, m, pol);
+                root_lo += 0.01F;
+                root_hi += 0.01F;
+              }
+              else
+              {
+                root_lo = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess(T(vv_floor + 0.5F), m - 1, pol);
+                root_hi = boost::math::detail::bessel_zero::cyl_bessel_j_zero_detail::initial_guess(T(vv_floor + 0.5F), m, pol);
+                root_lo += 0.01F;
+                root_hi += 0.01F;
+              }
+            }
+
+            // Perform several steps of bisection iteration to refine the guess.
+            boost::uintmax_t number_of_iterations(12U);
+
+            // Do the bisection iteration.
+            const boost::math::tuple<T, T> guess_pair =
+               boost::math::tools::bisect(
+                  boost::math::detail::bessel_zero::cyl_neumann_zero_detail::function_object_yv<T, Policy>(v, pol),
+                  root_lo,
+                  root_hi,
+                  boost::math::detail::bessel_zero::cyl_neumann_zero_detail::my_bisection_unreachable_tolerance<T>,
+                  number_of_iterations);
+
+            return (boost::math::get<0>(guess_pair) + boost::math::get<1>(guess_pair)) / 2U;
+          }
+
+          if(m == 1U)
+          {
+            // Get the initial estimate of the first root.
+
+            if(v < 2.2F)
+            {
+              // For small v, use the results of empirical curve fitting.
+              // Mathematica(R) session for the coefficients:
+              //  Table[{n, BesselYZero[n, 1]}, {n, 0, 22/10, 1/10}]
+              //  N[%, 20]
+              //  Fit[%, {n^0, n^1, n^2, n^3, n^4, n^5, n^6}, n]
+              guess = (((((    - T(0.0025095909235652)
+                           * v + T(0.021291887049053))
+                           * v - T(0.076487785486526))
+                           * v + T(0.159110268115362))
+                           * v - T(0.241681668765196))
+                           * v + T(1.4437846310885244))
+                           * v + T(0.89362115190200490);
+            }
+            else
+            {
+              // For larger v, use the second line of Eqs. 10.21.40 in the NIST Handbook.
+              guess = boost::math::detail::bessel_zero::cyl_neumann_zero_detail::equation_nist_10_21_40_b(v);
+            }
+          }
+          else
+          {
+            if(v < 2.2F)
+            {
+              // Use Eq. 10.21.19 in the NIST Handbook.
+              const T a(((v + T(m * 2U)) - T(1.5)) * boost::math::constants::half_pi<T>());
+
+              guess = boost::math::detail::bessel_zero::equation_nist_10_21_19(v, a);
+            }
+            else
+            {
+              // Get an estimate of the m'th root of airy_bi.
+              const T airy_bi_root(boost::math::detail::airy_zero::airy_bi_zero_detail::initial_guess<T>(m));
+
+              // Use Eq. 9.5.26 in the A&S Handbook.
+              guess = boost::math::detail::bessel_zero::equation_as_9_5_26(v, airy_bi_root);
+            }
+          }
+
+          return guess;
+        }
+      } // namespace cyl_neumann_zero_detail
+    } // namespace bessel_zero
+  } } } // namespace boost::math::detail
+
+#endif // _BESSEL_JY_ZERO_2013_01_18_HPP_
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k0.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k0.hpp
new file mode 100644
index 0000000..e209168
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k0.hpp
@@ -0,0 +1,152 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_K0_HPP
+#define BOOST_MATH_BESSEL_K0_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/assert.hpp>
+
+// Modified Bessel function of the second kind of order zero
+// minimax rational approximations on intervals, see
+// Russon and Blair, Chalk River Report AECL-3461, 1969
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_k0(T x, const Policy&);
+
+template <class T, class Policy>
+struct bessel_k0_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_k0(T(1), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bessel_k0_initializer<T, Policy>::init bessel_k0_initializer<T, Policy>::initializer;
+
+template <typename T, typename Policy>
+T bessel_k0(T x, const Policy& pol)
+{
+    BOOST_MATH_INSTRUMENT_CODE(x);
+
+    bessel_k0_initializer<T, Policy>::force_instantiate();
+
+    static const T P1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.4708152720399552679e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.9169059852270512312e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.6850901201934832188e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1999463724910714109e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3166052564989571850e-01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.8599221412826100000e-04))
+    };
+    static const T Q1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1312714303849120380e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.4994418972832303646e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T P2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.6128136304458193998e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.7333769444840079748e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.7984434409411765813e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.9501657892958843865e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.6414452837299064100e+00))
+    };
+    static const T Q2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.6128136304458193998e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.9865713163054025489e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.5064972445877992730e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T P3[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1600249425076035558e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.3444738764199315021e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8321525870183537725e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.1557062783764037541e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5097646353289914539e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7398867902565686251e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0577068948034021957e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.1075408980684392399e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.6832589957340267940e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1394980557384778174e+02))
+    };
+    static const T Q3[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.2556599177304839811e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8821890840982713696e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4847228371802360957e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.8824616785857027752e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.2689839587977598727e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5144644673520157801e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.7418829762268075784e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.1474655750295278825e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.4329628889746408858e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.0013443064949242491e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    T value, factor, r, r1, r2;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::bessel_k0<%1%>(%1%,%1%)";
+
+    if (x < 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got x = %1%, but argument x must be non-negative, complex number result not supported", x, pol);
+    }
+    if (x == 0)
+    {
+       return policies::raise_overflow_error<T>(function, 0, pol);
+    }
+    if (x <= 1)                         // x in (0, 1]
+    {
+        T y = x * x;
+        r1 = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        r2 = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = log(x);
+        value = r1 - factor * r2;
+    }
+    else                                // x in (1, \infty)
+    {
+        T y = 1 / x;
+        r = evaluate_polynomial(P3, y) / evaluate_polynomial(Q3, y);
+        factor = exp(-x) / sqrt(x);
+        value = factor * r;
+        BOOST_MATH_INSTRUMENT_CODE("y = " << y);
+        BOOST_MATH_INSTRUMENT_CODE("r = " << r);
+        BOOST_MATH_INSTRUMENT_CODE("factor = " << factor);
+        BOOST_MATH_INSTRUMENT_CODE("value = " << value);
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_K0_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k1.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k1.hpp
new file mode 100644
index 0000000..0d17cd3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_k1.hpp
@@ -0,0 +1,148 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_K1_HPP
+#define BOOST_MATH_BESSEL_K1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/assert.hpp>
+
+// Modified Bessel function of the second kind of order one
+// minimax rational approximations on intervals, see
+// Russon and Blair, Chalk River Report AECL-3461, 1969
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_k1(T x, const Policy&);
+
+template <class T, class Policy>
+struct bessel_k1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_k1(T(1), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bessel_k1_initializer<T, Policy>::init bessel_k1_initializer<T, Policy>::initializer;
+
+template <typename T, typename Policy>
+T bessel_k1(T x, const Policy& pol)
+{
+    bessel_k1_initializer<T, Policy>::force_instantiate();
+
+    static const T P1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2149374878243304548e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.1938920065420586101e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7733324035147015630e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.1885382604084798576e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.9991373567429309922e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.8127070456878442310e-01))
+    };
+    static const T Q1[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2149374878243304548e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.7264298672067697862e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.8143915754538725829e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T P2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.3531161492785421328e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4758069205414222471e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.5051623763436087023e+03)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.3103913335180275253e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2795590826955002390e-01))
+    };
+    static const T Q2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.7062322985570842656e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.3117653211351080007e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.0507151578787595807e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    static const T P3[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2196792496874548962e+00)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.4137176114230414036e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4122953486801312910e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3319486433183221990e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.8590657697910288226e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4540675585544584407e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.3123742209168871550e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.1094256146537402173e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3182609918569941308e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.5584584631176030810e+00)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.4257745859173138767e-02))
+    };
+    static const T Q3[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7710478032601086579e+00)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4552228452758912848e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.5951223655579051357e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.6929165726802648634e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.9448440788918006154e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1181000487171943810e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.2082692316002348638e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.3031020088765390854e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.6001069306861518855e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0))
+    };
+    T value, factor, r, r1, r2;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::bessel_k1<%1%>(%1%,%1%)";
+
+    if (x < 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got x = %1%, but argument x must be non-negative, complex number result not supported.", x, pol);
+    }
+    if (x == 0)
+    {
+       return policies::raise_overflow_error<T>(function, 0, pol);
+    }
+    if (x <= 1)                         // x in (0, 1]
+    {
+        T y = x * x;
+        r1 = evaluate_polynomial(P1, y) /  evaluate_polynomial(Q1, y);
+        r2 = evaluate_polynomial(P2, y) /  evaluate_polynomial(Q2, y);
+        factor = log(x);
+        value = (r1 + factor * r2) / x;
+    }
+    else                                // x in (1, \infty)
+    {
+        T y = 1 / x;
+        r = evaluate_polynomial(P3, y) /  evaluate_polynomial(Q3, y);
+        factor = exp(-x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_K1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_kn.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_kn.hpp
new file mode 100644
index 0000000..e3a5023
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_kn.hpp
@@ -0,0 +1,86 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_KN_HPP
+#define BOOST_MATH_BESSEL_KN_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/bessel_k0.hpp>
+#include <boost/math/special_functions/detail/bessel_k1.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+// Modified Bessel function of the second kind of integer order
+// K_n(z) is the dominant solution, forward recurrence always OK (though unstable)
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_kn(int n, T x, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    T value, current, prev;
+
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::bessel_kn<%1%>(%1%,%1%)";
+
+    if (x < 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got x = %1%, but argument x must be non-negative, complex number result not supported.", x, pol);
+    }
+    if (x == 0)
+    {
+       return policies::raise_overflow_error<T>(function, 0, pol);
+    }
+
+    if (n < 0)
+    {
+        n = -n;                             // K_{-n}(z) = K_n(z)
+    }
+    if (n == 0)
+    {
+        value = bessel_k0(x, pol);
+    }
+    else if (n == 1)
+    {
+        value = bessel_k1(x, pol);
+    }
+    else
+    {
+       prev = bessel_k0(x, pol);
+       current = bessel_k1(x, pol);
+       int k = 1;
+       BOOST_ASSERT(k < n);
+       T scale = 1;
+       do
+       {
+           T fact = 2 * k / x;
+           if((tools::max_value<T>() - fabs(prev)) / fact < fabs(current))
+           {
+              scale /= current;
+              prev /= current;
+              current = 1;
+           }
+           value = fact * current + prev;
+           prev = current;
+           current = value;
+           ++k;
+       }
+       while(k < n);
+       if(tools::max_value<T>() * scale < fabs(value))
+          return sign(scale) * sign(value) * policies::raise_overflow_error<T>(function, 0, pol);
+       value /= scale;
+    }
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_KN_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y0.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y0.hpp
new file mode 100644
index 0000000..533ab7c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y0.hpp
@@ -0,0 +1,224 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_Y0_HPP
+#define BOOST_MATH_BESSEL_Y0_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/bessel_j0.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/assert.hpp>
+
+// Bessel function of the second kind of order zero
+// x <= 8, minimax rational approximations on root-bracketing intervals
+// x > 8, Hankel asymptotic expansion in Hart, Computer Approximations, 1968
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_y0(T x, const Policy&);
+
+template <class T, class Policy>
+struct bessel_y0_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_y0(T(1), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bessel_y0_initializer<T, Policy>::init bessel_y0_initializer<T, Policy>::initializer;
+
+template <typename T, typename Policy>
+T bessel_y0(T x, const Policy& pol)
+{
+    bessel_y0_initializer<T, Policy>::force_instantiate();
+
+    static const T P1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0723538782003176831e+11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.3716255451260504098e+09)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.0422274357376619816e+08)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.1287548474401797963e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0102532948020907590e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8402381979244993524e+01)),
+    };
+    static const T Q1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.8873865738997033405e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.1617187777290363573e+09)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.5662956624278251596e+07)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.3889393209447253406e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6475986689240190091e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T P2[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2213976967566192242e+13)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.5107435206722644429e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.3600098638603061642e+10)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.9590439394619619534e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.6905288611678631510e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4566865832663635920e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7427031242901594547e+01)),
+    };
+    static const T Q2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.3386146580707264428e+14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.4266824419412347550e+12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4015103849971240096e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3960202770986831075e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.0669982352539552018e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.3030857612070288823e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T P3[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.0728726905150210443e+15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.7016641869173237784e+14)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2829912364088687306e+11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.9363051266772083678e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1958827170518100757e+09)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0085539923498211426e+07)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1363534169313901632e+04)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.7439661319197499338e+01)),
+    };
+    static const T Q3[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4563724628846457519e+17)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.9272425569640309819e+15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2598377924042897629e+13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.6926121104209825246e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.4727219475672302327e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.3924739209768057030e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.7903362168128450017e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T PC[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2779090197304684302e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1345386639580765797e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1170523380864944322e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.4806486443249270347e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5376201909008354296e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.8961548424210455236e-01)),
+    };
+    static const T QC[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2779090197304684318e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1370412495510416640e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1215350561880115730e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.5028735138235608207e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.5711159858080893649e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T PS[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.9226600200800094098e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.8591953644342993800e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1183429920482737611e+02)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.2300261666214198472e+01)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2441026745835638459e+00)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -8.8033303048680751817e-03)),
+    };
+    static const T QS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.7105024128512061905e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1951131543434613647e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.2642780169211018836e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4887231232283756582e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.0593769594993125859e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T x1  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.9357696627916752158e-01)),
+                   x2  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.9576784193148578684e+00)),
+                   x3  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.0860510603017726976e+00)),
+                   x11 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.280e+02)),
+                   x12 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.9519662791675215849e-03)),
+                   x21 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0130e+03)),
+                   x22 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.4716931485786837568e-04)),
+                   x31 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8140e+03)),
+                   x32 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1356030177269762362e-04))
+    ;
+    T value, factor, r, rc, rs;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    static const char* function = "boost::math::bessel_y0<%1%>(%1%,%1%)";
+
+    if (x < 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got x = %1% but x must be non-negative, complex result not supported.", x, pol);
+    }
+    if (x == 0)
+    {
+       return -policies::raise_overflow_error<T>(function, 0, pol);
+    }
+    if (x <= 3)                       // x in (0, 3]
+    {
+        T y = x * x;
+        T z = 2 * log(x/x1) * bessel_j0(x) / pi<T>();
+        r = evaluate_rational(P1, Q1, y);
+        factor = (x + x1) * ((x - x11/256) - x12);
+        value = z + factor * r;
+    }
+    else if (x <= 5.5f)                  // x in (3, 5.5]
+    {
+        T y = x * x;
+        T z = 2 * log(x/x2) * bessel_j0(x) / pi<T>();
+        r = evaluate_rational(P2, Q2, y);
+        factor = (x + x2) * ((x - x21/256) - x22);
+        value = z + factor * r;
+    }
+    else if (x <= 8)                  // x in (5.5, 8]
+    {
+        T y = x * x;
+        T z = 2 * log(x/x3) * bessel_j0(x) / pi<T>();
+        r = evaluate_rational(P3, Q3, y);
+        factor = (x + x3) * ((x - x31/256) - x32);
+        value = z + factor * r;
+    }
+    else                                // x in (8, \infty)
+    {
+        T y = 8 / x;
+        T y2 = y * y;
+        rc = evaluate_rational(PC, QC, y2);
+        rs = evaluate_rational(PS, QS, y2);
+        factor = constants::one_div_root_pi<T>() / sqrt(x);
+        //
+        // The following code is really just:
+        //
+        // T z = x - 0.25f * pi<T>();
+        // value = factor * (rc * sin(z) + y * rs * cos(z));
+        //
+        // But using the sin/cos addition formulae and constant values for
+        // sin/cos of PI/4 which then cancel part of the "factor" term as they're all
+        // 1 / sqrt(2):
+        //
+        T sx = sin(x);
+        T cx = cos(x);
+        value = factor * (rc * (sx - cx) + y * rs * (cx + sx));
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_Y0_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y1.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y1.hpp
new file mode 100644
index 0000000..8396f8f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_y1.hpp
@@ -0,0 +1,196 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_Y1_HPP
+#define BOOST_MATH_BESSEL_Y1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/bessel_j1.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/assert.hpp>
+
+// Bessel function of the second kind of order one
+// x <= 8, minimax rational approximations on root-bracketing intervals
+// x > 8, Hankel asymptotic expansion in Hart, Computer Approximations, 1968
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_y1(T x, const Policy&);
+
+template <class T, class Policy>
+struct bessel_y1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         bessel_y1(T(1), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bessel_y1_initializer<T, Policy>::init bessel_y1_initializer<T, Policy>::initializer;
+
+template <typename T, typename Policy>
+T bessel_y1(T x, const Policy& pol)
+{
+    bessel_y1_initializer<T, Policy>::force_instantiate();
+
+    static const T P1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.0535726612579544093e+13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.4708611716525426053e+12)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.7595974497819597599e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.2144548214502560419e+09)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.9157479997408395984e+07)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.2157953222280260820e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -3.1714424660046133456e+02)),
+    };
+    static const T Q1[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.0737873921079286084e+14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.1272286200406461981e+12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.7800352738690585613e+10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.2250435122182963220e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.8136470753052572164e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.2079908168393867438e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T P2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1514276357909013326e+19)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.6808094574724204577e+18)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.3638408497043134724e+16)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.0686275289804744814e+15)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -5.9530713129741981618e+13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.7453673962438488783e+11)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.1957961912070617006e+09)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.9153806858264202986e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.2337180442012953128e+03)),
+    };
+    static const T Q2[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.3321844313316185697e+20)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.6968198822857178911e+18)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.0837179548112881950e+16)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.1187010065856971027e+14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.0221766852960403645e+11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.3550318087088919566e+08)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0453748201934079734e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.2855164849321609336e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T PC[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4357578167941278571e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.9422465050776411957e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.6033732483649391093e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5235293511811373833e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0982405543459346727e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.6116166443246101165e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0)),
+    };
+    static const T QC[] = {
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -4.4357578167941278568e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -9.9341243899345856590e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.5853394797230870728e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.5118095066341608816e+06)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.0726385991103820119e+05)),
+        static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4550094401904961825e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T PS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.3220913409857223519e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.5145160675335701966e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6178836581270835179e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8494262873223866797e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.7063754290207680021e+03)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.5265133846636032186e+01)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0)),
+    };
+    static const T QS[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 7.0871281941028743574e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8194580422439972989e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.4194606696037208929e+06)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.0029443582266975117e+05)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3.7890229745772202641e+04)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 8.6383677696049909675e+02)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.0)),
+    };
+    static const T x1  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.1971413260310170351e+00)),
+                   x2  =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.4296810407941351328e+00)),
+                   x11 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5.620e+02)),
+                   x12 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.8288260310170351490e-03)),
+                   x21 =  static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.3900e+03)),
+                   x22 = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -6.4592058648672279948e-06))
+    ;
+    T value, factor, r, rc, rs;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    if (x <= 0)
+    {
+       return policies::raise_domain_error<T>("bost::math::bessel_y1<%1%>(%1%,%1%)",
+            "Got x == %1%, but x must be > 0, complex result not supported.", x, pol);
+    }
+    if (x <= 4)                       // x in (0, 4]
+    {
+        T y = x * x;
+        T z = 2 * log(x/x1) * bessel_j1(x) / pi<T>();
+        r = evaluate_rational(P1, Q1, y);
+        factor = (x + x1) * ((x - x11/256) - x12) / x;
+        value = z + factor * r;
+    }
+    else if (x <= 8)                  // x in (4, 8]
+    {
+        T y = x * x;
+        T z = 2 * log(x/x2) * bessel_j1(x) / pi<T>();
+        r = evaluate_rational(P2, Q2, y);
+        factor = (x + x2) * ((x - x21/256) - x22) / x;
+        value = z + factor * r;
+    }
+    else                                // x in (8, \infty)
+    {
+        T y = 8 / x;
+        T y2 = y * y;
+        rc = evaluate_rational(PC, QC, y2);
+        rs = evaluate_rational(PS, QS, y2);
+        factor = 1 / (sqrt(x) * root_pi<T>());
+        //
+        // This code is really just:
+        //
+        // T z = x - 0.75f * pi<T>();
+        // value = factor * (rc * sin(z) + y * rs * cos(z));
+        //
+        // But using the sin/cos addition rules, plus constants for sin/cos of 3PI/4
+        // which then cancel out with corresponding terms in "factor".
+        //
+        T sx = sin(x);
+        T cx = cos(x);
+        value = factor * (y * rs * (sx - cx) - rc * (sx + cx));
+    }
+
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_Y1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_yn.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_yn.hpp
new file mode 100644
index 0000000..0509062
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/bessel_yn.hpp
@@ -0,0 +1,104 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_YN_HPP
+#define BOOST_MATH_BESSEL_YN_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/bessel_y0.hpp>
+#include <boost/math/special_functions/detail/bessel_y1.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_series.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+// Bessel function of the second kind of integer order
+// Y_n(z) is the dominant solution, forward recurrence always OK (though unstable)
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T bessel_yn(int n, T x, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    T value, factor, current, prev;
+
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::bessel_yn<%1%>(%1%,%1%)";
+
+    if ((x == 0) && (n == 0))
+    {
+       return -policies::raise_overflow_error<T>(function, 0, pol);
+    }
+    if (x <= 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got x = %1%, but x must be > 0, complex result not supported.", x, pol);
+    }
+
+    //
+    // Reflection comes first:
+    //
+    if (n < 0)
+    {
+        factor = (n & 0x1) ? -1 : 1;  // Y_{-n}(z) = (-1)^n Y_n(z)
+        n = -n;
+    }
+    else
+    {
+        factor = 1;
+    }
+
+    if(x < policies::get_epsilon<T, Policy>())
+    {
+       T scale = 1;
+       value = bessel_yn_small_z(n, x, &scale, pol);
+       if(tools::max_value<T>() * fabs(scale) < fabs(value))
+          return boost::math::sign(scale) * boost::math::sign(value) * policies::raise_overflow_error<T>(function, 0, pol);
+       value /= scale;
+    }
+    else if (n == 0)
+    {
+        value = bessel_y0(x, pol);
+    }
+    else if (n == 1)
+    {
+        value = factor * bessel_y1(x, pol);
+    }
+    else
+    {
+       prev = bessel_y0(x, pol);
+       current = bessel_y1(x, pol);
+       int k = 1;
+       BOOST_ASSERT(k < n);
+       policies::check_series_iterations<T>("boost::math::bessel_y_n<%1%>(%1%,%1%)", n, pol);
+       do
+       {
+           T fact = 2 * k / x;
+           if((fact > 1) && ((tools::max_value<T>() - fabs(prev)) / fact < fabs(current)))
+           {
+              prev /= current;
+              factor /= current;
+              current = 1;
+           }
+           value = fact * current - prev;
+           prev = current;
+           current = value;
+           ++k;
+       }
+       while(k < n);
+       if(fabs(tools::max_value<T>() * factor) < fabs(value))
+          return sign(value) * sign(value) * policies::raise_overflow_error<T>(function, 0, pol);
+       value /= factor;
+    }
+    return value;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_YN_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/erf_inv.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/erf_inv.hpp
new file mode 100644
index 0000000..35072d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/erf_inv.hpp
@@ -0,0 +1,536 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_ERF_INV_HPP
+#define BOOST_MATH_SF_ERF_INV_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ 
+
+namespace detail{
+//
+// The inverse erf and erfc functions share a common implementation,
+// this version is for 80-bit long double's and smaller:
+//
+template <class T, class Policy>
+T erf_inv_imp(const T& p, const T& q, const Policy&, const boost::mpl::int_<64>*)
+{
+   BOOST_MATH_STD_USING // for ADL of std names.
+
+   T result = 0;
+   
+   if(p <= 0.5)
+   {
+      //
+      // Evaluate inverse erf using the rational approximation:
+      //
+      // x = p(p+10)(Y+R(p))
+      //
+      // Where Y is a constant, and R(p) is optimised for a low
+      // absolute error compared to |Y|.
+      //
+      // double: Max error found: 2.001849e-18
+      // long double: Max error found: 1.017064e-20
+      // Maximum Deviation Found (actual error term at infinite precision) 8.030e-21
+      //
+      static const float Y = 0.0891314744949340820313f;
+      static const T P[] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000508781949658280665617),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00836874819741736770379),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0334806625409744615033),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0126926147662974029034),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0365637971411762664006),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0219878681111168899165),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00822687874676915743155),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00538772965071242932965)
+      };
+      static const T Q[] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.970005043303290640362),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -1.56574558234175846809),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.56221558398423026363),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.662328840472002992063),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.71228902341542847553),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0527396382340099713954),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0795283687341571680018),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00233393759374190016776),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000886216390456424707504)
+      };
+      T g = p * (p + 10);
+      T r = tools::evaluate_polynomial(P, p) / tools::evaluate_polynomial(Q, p);
+      result = g * Y + g * r;
+   }
+   else if(q >= 0.25)
+   {
+      //
+      // Rational approximation for 0.5 > q >= 0.25
+      //
+      // x = sqrt(-2*log(q)) / (Y + R(q))
+      //
+      // Where Y is a constant, and R(q) is optimised for a low
+      // absolute error compared to Y.
+      //
+      // double : Max error found: 7.403372e-17
+      // long double : Max error found: 6.084616e-20
+      // Maximum Deviation Found (error term) 4.811e-20
+      //
+      static const float Y = 2.249481201171875f;
+      static const T P[] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.202433508355938759655),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.105264680699391713268),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 8.37050328343119927838),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 17.6447298408374015486),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -18.8510648058714251895),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -44.6382324441786960818),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 17.445385985570866523),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 21.1294655448340526258),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -3.67192254707729348546)
+      };
+      static const T Q[] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 6.24264124854247537712),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 3.9713437953343869095),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -28.6608180499800029974),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -20.1432634680485188801),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 48.5609213108739935468),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 10.8268667355460159008),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -22.6436933413139721736),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.72114765761200282724)
+      };
+      T g = sqrt(-2 * log(q));
+      T xs = q - 0.25f;
+      T r = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+      result = g / (Y + r);
+   }
+   else
+   {
+      //
+      // For q < 0.25 we have a series of rational approximations all
+      // of the general form:
+      //
+      // let: x = sqrt(-log(q))
+      //
+      // Then the result is given by:
+      //
+      // x(Y+R(x-B))
+      //
+      // where Y is a constant, B is the lowest value of x for which 
+      // the approximation is valid, and R(x-B) is optimised for a low
+      // absolute error compared to Y.
+      //
+      // Note that almost all code will really go through the first
+      // or maybe second approximation.  After than we're dealing with very
+      // small input values indeed: 80 and 128 bit long double's go all the
+      // way down to ~ 1e-5000 so the "tail" is rather long...
+      //
+      T x = sqrt(-log(q));
+      if(x < 3)
+      {
+         // Max error found: 1.089051e-20
+         static const float Y = 0.807220458984375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.131102781679951906451),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.163794047193317060787),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.117030156341995252019),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.387079738972604337464),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.337785538912035898924),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.142869534408157156766),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0290157910005329060432),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00214558995388805277169),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.679465575181126350155e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.285225331782217055858e-7),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.681149956853776992068e-9)
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 3.46625407242567245975),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 5.38168345707006855425),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 4.77846592945843778382),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 2.59301921623620271374),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.848854343457902036425),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.152264338295331783612),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.01105924229346489121)
+         };
+         T xs = x - 1.125f;
+         T R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 6)
+      {
+         // Max error found: 8.389174e-21
+         static const float Y = 0.93995571136474609375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.0350353787183177984712),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.00222426529213447927281),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0185573306514231072324),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00950804701325919603619),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00187123492819559223345),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000157544617424960554631),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.460469890584317994083e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.230404776911882601748e-9),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.266339227425782031962e-11)
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.3653349817554063097),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.762059164553623404043),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.220091105764131249824),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0341589143670947727934),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00263861676657015992959),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.764675292302794483503e-4)
+         };
+         T xs = x - 3;
+         T R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 18)
+      {
+         // Max error found: 1.481312e-19
+         static const float Y = 0.98362827301025390625f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.0167431005076633737133),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.00112951438745580278863),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00105628862152492910091),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000209386317487588078668),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.149624783758342370182e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.449696789927706453732e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.462596163522878599135e-8),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.281128735628831791805e-13),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.99055709973310326855e-16)
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.591429344886417493481),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.138151865749083321638),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0160746087093676504695),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000964011807005165528527),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.275335474764726041141e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.282243172016108031869e-6)
+         };
+         T xs = x - 6;
+         T R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 44)
+      {
+         // Max error found: 5.697761e-20
+         static const float Y = 0.99714565277099609375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.0024978212791898131227),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.779190719229053954292e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.254723037413027451751e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.162397777342510920873e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.396341011304801168516e-7),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.411632831190944208473e-9),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.145596286718675035587e-11),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.116765012397184275695e-17)
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.207123112214422517181),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0169410838120975906478),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000690538265622684595676),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.145007359818232637924e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.144437756628144157666e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.509761276599778486139e-9)
+         };
+         T xs = x - 18;
+         T R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else
+      {
+         // Max error found: 1.279746e-20
+         static const float Y = 0.99941349029541015625f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.000539042911019078575891),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.28398759004727721098e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.899465114892291446442e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.229345859265920864296e-7),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.225561444863500149219e-9),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.947846627503022684216e-12),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.135880130108924861008e-14),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.348890393399948882918e-21)
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0845746234001899436914),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00282092984726264681981),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.468292921940894236786e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.399968812193862100054e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.161809290887904476097e-8),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.231558608310259605225e-11)
+         };
+         T xs = x - 44;
+         T R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+   }
+   return result;
+}
+
+template <class T, class Policy>
+struct erf_roots
+{
+   boost::math::tuple<T,T,T> operator()(const T& guess)
+   {
+      BOOST_MATH_STD_USING
+      T derivative = sign * (2 / sqrt(constants::pi<T>())) * exp(-(guess * guess));
+      T derivative2 = -2 * guess * derivative;
+      return boost::math::make_tuple(((sign > 0) ? static_cast<T>(boost::math::erf(guess, Policy()) - target) : static_cast<T>(boost::math::erfc(guess, Policy())) - target), derivative, derivative2);
+   }
+   erf_roots(T z, int s) : target(z), sign(s) {}
+private:
+   T target;
+   int sign;
+};
+
+template <class T, class Policy>
+T erf_inv_imp(const T& p, const T& q, const Policy& pol, const boost::mpl::int_<0>*)
+{
+   //
+   // Generic version, get a guess that's accurate to 64-bits (10^-19)
+   //
+   T guess = erf_inv_imp(p, q, pol, static_cast<mpl::int_<64> const*>(0));
+   T result;
+   //
+   // If T has more bit's than 64 in it's mantissa then we need to iterate,
+   // otherwise we can just return the result:
+   //
+   if(policies::digits<T, Policy>() > 64)
+   {
+      boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+      if(p <= 0.5)
+      {
+         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(p, 1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3, max_iter);
+      }
+      else
+      {
+         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(q, -1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3, max_iter);
+      }
+      policies::check_root_iterations<T>("boost::math::erf_inv<%1%>", max_iter, pol);
+   }
+   else
+   {
+      result = guess;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+struct erf_inv_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static bool is_value_non_zero(T);
+      static void do_init()
+      {
+         boost::math::erf_inv(static_cast<T>(0.25), Policy());
+         boost::math::erf_inv(static_cast<T>(0.55), Policy());
+         boost::math::erf_inv(static_cast<T>(0.95), Policy());
+         boost::math::erfc_inv(static_cast<T>(1e-15), Policy());
+         // These following initializations must not be called if
+         // type T can not hold the relevant values without
+         // underflow to zero.  We check this at runtime because
+         // some tools such as valgrind silently change the precision
+         // of T at runtime, and numeric_limits basically lies!
+         if(is_value_non_zero(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-130))))
+            boost::math::erfc_inv(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-130)), Policy());
+
+         // Some compilers choke on constants that would underflow, even in code that isn't instantiated
+         // so try and filter these cases out in the preprocessor:
+#if LDBL_MAX_10_EXP >= 800
+         if(is_value_non_zero(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-800))))
+            boost::math::erfc_inv(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-800)), Policy());
+         if(is_value_non_zero(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-900))))
+            boost::math::erfc_inv(static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1e-900)), Policy());
+#else
+         if(is_value_non_zero(static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 64, 1e-800))))
+            boost::math::erfc_inv(static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 64, 1e-800)), Policy());
+         if(is_value_non_zero(static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 64, 1e-900))))
+            boost::math::erfc_inv(static_cast<T>(BOOST_MATH_HUGE_CONSTANT(T, 64, 1e-900)), Policy());
+#endif
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename erf_inv_initializer<T, Policy>::init erf_inv_initializer<T, Policy>::initializer;
+
+template <class T, class Policy>
+bool erf_inv_initializer<T, Policy>::init::is_value_non_zero(T v)
+{
+   // This needs to be non-inline to detect whether v is non zero at runtime
+   // rather than at compile time, only relevant when running under valgrind
+   // which changes long double's to double's on the fly.
+   return v != 0;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+typename tools::promote_args<T>::type erfc_inv(T z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+
+   //
+   // Begin by testing for domain errors, and other special cases:
+   //
+   static const char* function = "boost::math::erfc_inv<%1%>(%1%, %1%)";
+   if((z < 0) || (z > 2))
+      return policies::raise_domain_error<result_type>(function, "Argument outside range [0,2] in inverse erfc function (got p=%1%).", z, pol);
+   if(z == 0)
+      return policies::raise_overflow_error<result_type>(function, 0, pol);
+   if(z == 2)
+      return -policies::raise_overflow_error<result_type>(function, 0, pol);
+   //
+   // Normalise the input, so it's in the range [0,1], we will
+   // negate the result if z is outside that range.  This is a simple
+   // application of the erfc reflection formula: erfc(-z) = 2 - erfc(z)
+   //
+   result_type p, q, s;
+   if(z > 1)
+   {
+      q = 2 - z;
+      p = 1 - q;
+      s = -1;
+   }
+   else
+   {
+      p = 1 - z;
+      q = z;
+      s = 1;
+   }
+   //
+   // A bit of meta-programming to figure out which implementation
+   // to use, based on the number of bits in the mantissa of T:
+   //
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::or_<mpl::less_equal<precision_type, mpl::int_<0> >, mpl::greater<precision_type, mpl::int_<64> > >,
+      mpl::int_<0>,
+      mpl::int_<64>
+   >::type tag_type;
+   //
+   // Likewise use internal promotion, so we evaluate at a higher
+   // precision internally if it's appropriate:
+   //
+   typedef typename policies::evaluation<result_type, Policy>::type eval_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   detail::erf_inv_initializer<eval_type, forwarding_policy>::force_instantiate();
+
+   //
+   // And get the result, negating where required:
+   //
+   return s * policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::erf_inv_imp(static_cast<eval_type>(p), static_cast<eval_type>(q), forwarding_policy(), static_cast<tag_type const*>(0)), function);
+}
+
+template <class T, class Policy>
+typename tools::promote_args<T>::type erf_inv(T z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+
+   //
+   // Begin by testing for domain errors, and other special cases:
+   //
+   static const char* function = "boost::math::erf_inv<%1%>(%1%, %1%)";
+   if((z < -1) || (z > 1))
+      return policies::raise_domain_error<result_type>(function, "Argument outside range [-1, 1] in inverse erf function (got p=%1%).", z, pol);
+   if(z == 1)
+      return policies::raise_overflow_error<result_type>(function, 0, pol);
+   if(z == -1)
+      return -policies::raise_overflow_error<result_type>(function, 0, pol);
+   if(z == 0)
+      return 0;
+   //
+   // Normalise the input, so it's in the range [0,1], we will
+   // negate the result if z is outside that range.  This is a simple
+   // application of the erf reflection formula: erf(-z) = -erf(z)
+   //
+   result_type p, q, s;
+   if(z < 0)
+   {
+      p = -z;
+      q = 1 - p;
+      s = -1;
+   }
+   else
+   {
+      p = z;
+      q = 1 - z;
+      s = 1;
+   }
+   //
+   // A bit of meta-programming to figure out which implementation
+   // to use, based on the number of bits in the mantissa of T:
+   //
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::or_<mpl::less_equal<precision_type, mpl::int_<0> >, mpl::greater<precision_type, mpl::int_<64> > >,
+      mpl::int_<0>,
+      mpl::int_<64>
+   >::type tag_type;
+   //
+   // Likewise use internal promotion, so we evaluate at a higher
+   // precision internally if it's appropriate:
+   //
+   typedef typename policies::evaluation<result_type, Policy>::type eval_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   //
+   // Likewise use internal promotion, so we evaluate at a higher
+   // precision internally if it's appropriate:
+   //
+   typedef typename policies::evaluation<result_type, Policy>::type eval_type;
+
+   detail::erf_inv_initializer<eval_type, forwarding_policy>::force_instantiate();
+   //
+   // And get the result, negating where required:
+   //
+   return s * policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::erf_inv_imp(static_cast<eval_type>(p), static_cast<eval_type>(q), forwarding_policy(), static_cast<tag_type const*>(0)), function);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type erfc_inv(T z)
+{
+   return erfc_inv(z, policies::policy<>());
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type erf_inv(T z)
+{
+   return erf_inv(z, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SF_ERF_INV_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/fp_traits.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/fp_traits.hpp
new file mode 100644
index 0000000..09dc516
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/fp_traits.hpp
@@ -0,0 +1,580 @@
+// fp_traits.hpp
+
+#ifndef BOOST_MATH_FP_TRAITS_HPP
+#define BOOST_MATH_FP_TRAITS_HPP
+
+// Copyright (c) 2006 Johan Rade
+
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+/*
+To support old compilers, care has been taken to avoid partial template
+specialization and meta function forwarding.
+With these techniques, the code could be simplified.
+*/
+
+#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
+// The VAX floating point formats are used (for float and double)
+#   define BOOST_FPCLASSIFY_VAX_FORMAT
+#endif
+
+#include <cstring>
+
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/detail/endian.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+  namespace std{ using ::memcpy; }
+#endif
+
+#ifndef FP_NORMAL
+
+#define FP_ZERO        0
+#define FP_NORMAL      1
+#define FP_INFINITE    2
+#define FP_NAN         3
+#define FP_SUBNORMAL   4
+
+#else
+
+#define BOOST_HAS_FPCLASSIFY
+
+#ifndef fpclassify
+#  if (defined(__GLIBCPP__) || defined(__GLIBCXX__)) \
+         && defined(_GLIBCXX_USE_C99_MATH) \
+         && !(defined(_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) \
+         && (_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC != 0))
+#     ifdef _STLP_VENDOR_CSTD
+#        if _STLPORT_VERSION >= 0x520
+#           define BOOST_FPCLASSIFY_PREFIX ::__std_alias:: 
+#        else
+#           define BOOST_FPCLASSIFY_PREFIX ::_STLP_VENDOR_CSTD:: 
+#        endif
+#     else
+#        define BOOST_FPCLASSIFY_PREFIX ::std::
+#     endif
+#  else
+#     undef BOOST_HAS_FPCLASSIFY
+#     define BOOST_FPCLASSIFY_PREFIX
+#  endif
+#elif (defined(__HP_aCC) && !defined(__hppa))
+// aCC 6 appears to do "#define fpclassify fpclassify" which messes us up a bit!
+#  define BOOST_FPCLASSIFY_PREFIX ::
+#else
+#  define BOOST_FPCLASSIFY_PREFIX
+#endif
+
+#ifdef __MINGW32__
+#  undef BOOST_HAS_FPCLASSIFY
+#endif
+
+#endif
+
+
+//------------------------------------------------------------------------------
+
+namespace boost {
+namespace math {
+namespace detail {
+
+//------------------------------------------------------------------------------
+
+/* 
+The following classes are used to tag the different methods that are used
+for floating point classification
+*/
+
+struct native_tag {};
+template <bool has_limits>
+struct generic_tag {};
+struct ieee_tag {};
+struct ieee_copy_all_bits_tag : public ieee_tag {};
+struct ieee_copy_leading_bits_tag : public ieee_tag {};
+
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+//
+// These helper functions are used only when numeric_limits<>
+// members are not compile time constants:
+//
+inline bool is_generic_tag_false(const generic_tag<false>*)
+{
+   return true;
+}
+inline bool is_generic_tag_false(const void*)
+{
+   return false;
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+/*
+Most processors support three different floating point precisions:
+single precision (32 bits), double precision (64 bits)
+and extended double precision (80 - 128 bits, depending on the processor)
+
+Note that the C++ type long double can be implemented
+both as double precision and extended double precision.
+*/
+
+struct unknown_precision{};
+struct single_precision {};
+struct double_precision {};
+struct extended_double_precision {};
+
+// native_tag version --------------------------------------------------------------
+
+template<class T> struct fp_traits_native
+{
+    typedef native_tag method;
+};
+
+// generic_tag version -------------------------------------------------------------
+
+template<class T, class U> struct fp_traits_non_native
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   typedef generic_tag<std::numeric_limits<T>::is_specialized> method;
+#else
+   typedef generic_tag<false> method;
+#endif
+};
+
+// ieee_tag versions ---------------------------------------------------------------
+
+/*
+These specializations of fp_traits_non_native contain information needed
+to "parse" the binary representation of a floating point number.
+
+Typedef members:
+
+  bits -- the target type when copying the leading bytes of a floating
+      point number. It is a typedef for uint32_t or uint64_t.
+
+  method -- tells us whether all bytes are copied or not.
+      It is a typedef for ieee_copy_all_bits_tag or ieee_copy_leading_bits_tag.
+
+Static data members:
+
+  sign, exponent, flag, significand -- bit masks that give the meaning of the
+  bits in the leading bytes.
+
+Static function members:
+
+  get_bits(), set_bits() -- provide access to the leading bytes.
+
+*/
+
+// ieee_tag version, float (32 bits) -----------------------------------------------
+
+#ifndef BOOST_FPCLASSIFY_VAX_FORMAT
+
+template<> struct fp_traits_non_native<float, single_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7f800000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x007fffff);
+
+    typedef uint32_t bits;
+    static void get_bits(float x, uint32_t& a) { std::memcpy(&a, &x, 4); }
+    static void set_bits(float& x, uint32_t a) { std::memcpy(&x, &a, 4); }
+};
+
+// ieee_tag version, double (64 bits) ----------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION) \
+   || defined(__BORLANDC__) || defined(__CODEGEAR__)
+
+template<> struct fp_traits_non_native<double, double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 4);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+//..............................................................................
+
+#else
+
+template<> struct fp_traits_non_native<double, double_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    static const uint64_t sign     = ((uint64_t)0x80000000u) << 32;
+    static const uint64_t exponent = ((uint64_t)0x7ff00000) << 32;
+    static const uint64_t flag     = 0;
+    static const uint64_t significand
+        = (((uint64_t)0x000fffff) << 32) + ((uint64_t)0xffffffffu);
+
+    typedef uint64_t bits;
+    static void get_bits(double x, uint64_t& a) { std::memcpy(&a, &x, 8); }
+    static void set_bits(double& x, uint64_t a) { std::memcpy(&x, &a, 8); }
+};
+
+#endif
+
+#endif  // #ifndef BOOST_FPCLASSIFY_VAX_FORMAT
+
+// long double (64 bits) -------------------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\
+   || defined(__BORLANDC__) || defined(__CODEGEAR__)
+
+template<> struct fp_traits_non_native<long double, double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 4);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+//..............................................................................
+
+#else
+
+template<> struct fp_traits_non_native<long double, double_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    static const uint64_t sign     = (uint64_t)0x80000000u << 32;
+    static const uint64_t exponent = (uint64_t)0x7ff00000 << 32;
+    static const uint64_t flag     = 0;
+    static const uint64_t significand
+        = ((uint64_t)0x000fffff << 32) + (uint64_t)0xffffffffu;
+
+    typedef uint64_t bits;
+    static void get_bits(long double x, uint64_t& a) { std::memcpy(&a, &x, 8); }
+    static void set_bits(long double& x, uint64_t a) { std::memcpy(&x, &a, 8); }
+};
+
+#endif
+
+
+// long double (>64 bits), x86 and x64 -----------------------------------------
+
+#if defined(__i386) || defined(__i386__) || defined(_M_IX86) \
+    || defined(__amd64) || defined(__amd64__)  || defined(_M_AMD64) \
+    || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)
+
+// Intel extended double precision format (80 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00008000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x00007fff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + 6, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + 6, &a, 4);
+    }
+};
+
+
+// long double (>64 bits), Itanium ---------------------------------------------
+
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+
+// The floating point format is unknown at compile time
+// No template specialization is provided.
+// The generic_tag definition is used.
+
+// The Itanium supports both
+// the Intel extended double precision format (80 bits) and
+// the IEEE extended double precision format with 15 exponent bits (128 bits).
+
+#elif defined(__GNUC__) && (LDBL_MANT_DIG == 106)
+
+//
+// Define nothing here and fall though to generic_tag:
+// We have GCC's "double double" in effect, and any attempt
+// to handle it via bit-fiddling is pretty much doomed to fail...
+//
+
+// long double (>64 bits), PowerPC ---------------------------------------------
+
+#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) \
+    || defined(__ppc) || defined(__ppc__) || defined(__PPC__)
+
+// PowerPC extended double precision format (128 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 12);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+
+// long double (>64 bits), Motorola 68K ----------------------------------------
+
+#elif defined(__m68k) || defined(__m68k__) \
+    || defined(__mc68000) || defined(__mc68000__) \
+
+// Motorola extended double precision format (96 bits)
+
+// It is the same format as the Intel extended double precision format,
+// except that 1) it is big-endian, 2) the 3rd and 4th byte are padding, and
+// 3) the flag bit is not set for infinity
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00008000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x00007fff);
+
+    // copy 1st, 2nd, 5th and 6th byte. 3rd and 4th byte are padding.
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, &x, 2);
+        std::memcpy(reinterpret_cast<unsigned char*>(&a) + 2,
+               reinterpret_cast<const unsigned char*>(&x) + 4, 2);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(&x, &a, 2);
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + 4,
+               reinterpret_cast<const unsigned char*>(&a) + 2, 2);
+    }
+};
+
+
+// long double (>64 bits), All other processors --------------------------------
+
+#else
+
+// IEEE extended double precision format with 15 exponent bits (128 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x0000ffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 12);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+#endif
+
+//------------------------------------------------------------------------------
+
+// size_to_precision is a type switch for converting a C++ floating point type
+// to the corresponding precision type.
+
+template<int n, bool fp> struct size_to_precision
+{
+   typedef unknown_precision type;
+};
+
+template<> struct size_to_precision<4, true>
+{
+    typedef single_precision type;
+};
+
+template<> struct size_to_precision<8, true>
+{
+    typedef double_precision type;
+};
+
+template<> struct size_to_precision<10, true>
+{
+    typedef extended_double_precision type;
+};
+
+template<> struct size_to_precision<12, true>
+{
+    typedef extended_double_precision type;
+};
+
+template<> struct size_to_precision<16, true>
+{
+    typedef extended_double_precision type;
+};
+
+//------------------------------------------------------------------------------
+//
+// Figure out whether to use native classification functions based on
+// whether T is a built in floating point type or not:
+//
+template <class T>
+struct select_native
+{
+    typedef BOOST_DEDUCED_TYPENAME size_to_precision<sizeof(T), ::boost::is_floating_point<T>::value>::type precision;
+    typedef fp_traits_non_native<T, precision> type;
+};
+template<>
+struct select_native<float>
+{
+    typedef fp_traits_native<float> type;
+};
+template<>
+struct select_native<double>
+{
+    typedef fp_traits_native<double> type;
+};
+template<>
+struct select_native<long double>
+{
+    typedef fp_traits_native<long double> type;
+};
+
+//------------------------------------------------------------------------------
+
+// fp_traits is a type switch that selects the right fp_traits_non_native
+
+#if (defined(BOOST_MATH_USE_C99) && !(defined(__GNUC__) && (__GNUC__ < 4))) \
+   && !defined(__hpux) \
+   && !defined(__DECCXX)\
+   && !defined(__osf__) \
+   && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\
+   && !defined(__FAST_MATH__)\
+   && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)\
+   && !defined(BOOST_INTEL)\
+   && !defined(sun)
+#  define BOOST_MATH_USE_STD_FPCLASSIFY
+#endif
+
+template<class T> struct fp_traits
+{
+    typedef BOOST_DEDUCED_TYPENAME size_to_precision<sizeof(T), ::boost::is_floating_point<T>::value>::type precision;
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+    typedef typename select_native<T>::type type;
+#else
+    typedef fp_traits_non_native<T, precision> type;
+#endif
+    typedef fp_traits_non_native<T, precision> sign_change_type;
+};
+
+//------------------------------------------------------------------------------
+
+}   // namespace detail
+}   // namespace math
+}   // namespace boost
+
+#endif
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/gamma_inva.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/gamma_inva.hpp
new file mode 100644
index 0000000..7c32d29
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/gamma_inva.hpp
@@ -0,0 +1,233 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is not a complete header file, it is included by gamma.hpp
+// after it has defined it's definitions.  This inverts the incomplete
+// gamma functions P and Q on the first parameter "a" using a generic
+// root finding algorithm (TOMS Algorithm 748).
+//
+
+#ifndef BOOST_MATH_SP_DETAIL_GAMMA_INVA
+#define BOOST_MATH_SP_DETAIL_GAMMA_INVA
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/toms748_solve.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+struct gamma_inva_t
+{
+   gamma_inva_t(T z_, T p_, bool invert_) : z(z_), p(p_), invert(invert_) {}
+   T operator()(T a)
+   {
+      return invert ? p - boost::math::gamma_q(a, z, Policy()) : boost::math::gamma_p(a, z, Policy()) - p;
+   }
+private:
+   T z, p;
+   bool invert;
+};
+
+template <class T, class Policy>
+T inverse_poisson_cornish_fisher(T lambda, T p, T q, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   // mean:
+   T m = lambda;
+   // standard deviation:
+   T sigma = sqrt(lambda);
+   // skewness
+   T sk = 1 / sigma;
+   // kurtosis:
+   // T k = 1/lambda;
+   // Get the inverse of a std normal distribution:
+   T x = boost::math::erfc_inv(p > q ? 2 * q : 2 * p, pol) * constants::root_two<T>();
+   // Set the sign:
+   if(p < 0.5)
+      x = -x;
+   T x2 = x * x;
+   // w is correction term due to skewness
+   T w = x + sk * (x2 - 1) / 6;
+   /*
+   // Add on correction due to kurtosis.
+   // Disabled for now, seems to make things worse?
+   //
+   if(lambda >= 10)
+      w += k * x * (x2 - 3) / 24 + sk * sk * x * (2 * x2 - 5) / -36;
+   */
+   w = m + sigma * w;
+   return w > tools::min_value<T>() ? w : tools::min_value<T>();
+}
+
+template <class T, class Policy>
+T gamma_inva_imp(const T& z, const T& p, const T& q, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // for ADL of std lib math functions
+   //
+   // Special cases first:
+   //
+   if(p == 0)
+   {
+      return policies::raise_overflow_error<T>("boost::math::gamma_p_inva<%1%>(%1%, %1%)", 0, Policy());
+   }
+   if(q == 0)
+   {
+      return tools::min_value<T>();
+   }
+   //
+   // Function object, this is the functor whose root
+   // we have to solve:
+   //
+   gamma_inva_t<T, Policy> f(z, (p < q) ? p : q, (p < q) ? false : true);
+   //
+   // Tolerance: full precision.
+   //
+   tools::eps_tolerance<T> tol(policies::digits<T, Policy>());
+   //
+   // Now figure out a starting guess for what a may be, 
+   // we'll start out with a value that'll put p or q
+   // right bang in the middle of their range, the functions
+   // are quite sensitive so we should need too many steps
+   // to bracket the root from there:
+   //
+   T guess;
+   T factor = 8;
+   if(z >= 1)
+   {
+      //
+      // We can use the relationship between the incomplete 
+      // gamma function and the poisson distribution to
+      // calculate an approximate inverse, for large z
+      // this is actually pretty accurate, but it fails badly
+      // when z is very small.  Also set our step-factor according
+      // to how accurate we think the result is likely to be:
+      //
+      guess = 1 + inverse_poisson_cornish_fisher(z, q, p, pol);
+      if(z > 5)
+      {
+         if(z > 1000)
+            factor = 1.01f;
+         else if(z > 50)
+            factor = 1.1f;
+         else if(guess > 10)
+            factor = 1.25f;
+         else
+            factor = 2;
+         if(guess < 1.1)
+            factor = 8;
+      }
+   }
+   else if(z > 0.5)
+   {
+      guess = z * 1.2f;
+   }
+   else
+   {
+      guess = -0.4f / log(z);
+   }
+   //
+   // Max iterations permitted:
+   //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   //
+   // Use our generic derivative-free root finding procedure.
+   // We could use Newton steps here, taking the PDF of the
+   // Poisson distribution as our derivative, but that's
+   // even worse performance-wise than the generic method :-(
+   //
+   std::pair<T, T> r = bracket_and_solve_root(f, guess, factor, false, tol, max_iter, pol);
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+      return policies::raise_evaluation_error<T>("boost::math::gamma_p_inva<%1%>(%1%, %1%)", "Unable to locate the root within a reasonable number of iterations, closest approximation so far was %1%", r.first, pol);
+   return (r.first + r.second) / 2;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_inva(T1 x, T2 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   if(p == 0)
+   {
+      policies::raise_overflow_error<result_type>("boost::math::gamma_p_inva<%1%>(%1%, %1%)", 0, Policy());
+   }
+   if(p == 1)
+   {
+      return tools::min_value<result_type>();
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_inva_imp(
+         static_cast<value_type>(x), 
+         static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
+         pol), "boost::math::gamma_p_inva<%1%>(%1%, %1%)");
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_q_inva(T1 x, T2 q, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   if(q == 1)
+   {
+      policies::raise_overflow_error<result_type>("boost::math::gamma_q_inva<%1%>(%1%, %1%)", 0, Policy());
+   }
+   if(q == 0)
+   {
+      return tools::min_value<result_type>();
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_inva_imp(
+         static_cast<value_type>(x), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
+         static_cast<value_type>(q), 
+         pol), "boost::math::gamma_q_inva<%1%>(%1%, %1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_inva(T1 x, T2 p)
+{
+   return boost::math::gamma_p_inva(x, p, policies::policy<>());
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   gamma_q_inva(T1 x, T2 q)
+{
+   return boost::math::gamma_q_inva(x, q, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SP_DETAIL_GAMMA_INVA
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inv_ab.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inv_ab.hpp
new file mode 100644
index 0000000..f5735a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inv_ab.hpp
@@ -0,0 +1,328 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is not a complete header file, it is included by beta.hpp
+// after it has defined it's definitions.  This inverts the incomplete
+// beta functions ibeta and ibetac on the first parameters "a"
+// and "b" using a generic root finding algorithm (TOMS Algorithm 748).
+//
+
+#ifndef BOOST_MATH_SP_DETAIL_BETA_INV_AB
+#define BOOST_MATH_SP_DETAIL_BETA_INV_AB
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/toms748_solve.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+struct beta_inv_ab_t
+{
+   beta_inv_ab_t(T b_, T z_, T p_, bool invert_, bool swap_ab_) : b(b_), z(z_), p(p_), invert(invert_), swap_ab(swap_ab_) {}
+   T operator()(T a)
+   {
+      return invert ? 
+         p - boost::math::ibetac(swap_ab ? b : a, swap_ab ? a : b, z, Policy()) 
+         : boost::math::ibeta(swap_ab ? b : a, swap_ab ? a : b, z, Policy()) - p;
+   }
+private:
+   T b, z, p;
+   bool invert, swap_ab;
+};
+
+template <class T, class Policy>
+T inverse_negative_binomial_cornish_fisher(T n, T sf, T sfc, T p, T q, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   // mean:
+   T m = n * (sfc) / sf;
+   T t = sqrt(n * (sfc));
+   // standard deviation:
+   T sigma = t / sf;
+   // skewness
+   T sk = (1 + sfc) / t;
+   // kurtosis:
+   T k = (6 - sf * (5+sfc)) / (n * (sfc));
+   // Get the inverse of a std normal distribution:
+   T x = boost::math::erfc_inv(p > q ? 2 * q : 2 * p, pol) * constants::root_two<T>();
+   // Set the sign:
+   if(p < 0.5)
+      x = -x;
+   T x2 = x * x;
+   // w is correction term due to skewness
+   T w = x + sk * (x2 - 1) / 6;
+   //
+   // Add on correction due to kurtosis.
+   //
+   if(n >= 10)
+      w += k * x * (x2 - 3) / 24 + sk * sk * x * (2 * x2 - 5) / -36;
+
+   w = m + sigma * w;
+   if(w < tools::min_value<T>())
+      return tools::min_value<T>();
+   return w;
+}
+
+template <class T, class Policy>
+T ibeta_inv_ab_imp(const T& b, const T& z, const T& p, const T& q, bool swap_ab, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // for ADL of std lib math functions
+   //
+   // Special cases first:
+   //
+   BOOST_MATH_INSTRUMENT_CODE("b = " << b << " z = " << z << " p = " << p << " q = " << " swap = " << swap_ab);
+   if(p == 0)
+   {
+      return swap_ab ? tools::min_value<T>() : tools::max_value<T>();
+   }
+   if(q == 0)
+   {
+      return swap_ab ? tools::max_value<T>() : tools::min_value<T>();
+   }
+   //
+   // Function object, this is the functor whose root
+   // we have to solve:
+   //
+   beta_inv_ab_t<T, Policy> f(b, z, (p < q) ? p : q, (p < q) ? false : true, swap_ab);
+   //
+   // Tolerance: full precision.
+   //
+   tools::eps_tolerance<T> tol(policies::digits<T, Policy>());
+   //
+   // Now figure out a starting guess for what a may be, 
+   // we'll start out with a value that'll put p or q
+   // right bang in the middle of their range, the functions
+   // are quite sensitive so we should need too many steps
+   // to bracket the root from there:
+   //
+   T guess = 0;
+   T factor = 5;
+   //
+   // Convert variables to parameters of a negative binomial distribution:
+   //
+   T n = b;
+   T sf = swap_ab ? z : 1-z;
+   T sfc = swap_ab ? 1-z : z;
+   T u = swap_ab ? p : q;
+   T v = swap_ab ? q : p;
+   if(u <= pow(sf, n))
+   {
+      //
+      // Result is less than 1, negative binomial approximation
+      // is useless....
+      //
+      if((p < q) != swap_ab)
+      {
+         guess = (std::min)(T(b * 2), T(1));
+      }
+      else
+      {
+         guess = (std::min)(T(b / 2), T(1));
+      }
+   }
+   if(n * n * n * u * sf > 0.005)
+      guess = 1 + inverse_negative_binomial_cornish_fisher(n, sf, sfc, u, v, pol);
+
+   if(guess < 10)
+   {
+      //
+      // Negative binomial approximation not accurate in this area:
+      //
+      if((p < q) != swap_ab)
+      {
+         guess = (std::min)(T(b * 2), T(10));
+      }
+      else
+      {
+         guess = (std::min)(T(b / 2), T(10));
+      }
+   }
+   else
+      factor = (v < sqrt(tools::epsilon<T>())) ? 2 : (guess < 20 ? 1.2f : 1.1f);
+   BOOST_MATH_INSTRUMENT_CODE("guess = " << guess);
+   //
+   // Max iterations permitted:
+   //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   std::pair<T, T> r = bracket_and_solve_root(f, guess, factor, swap_ab ? true : false, tol, max_iter, pol);
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+      return policies::raise_evaluation_error<T>("boost::math::ibeta_invab_imp<%1%>(%1%,%1%,%1%)", "Unable to locate the root within a reasonable number of iterations, closest approximation so far was %1%", r.first, pol);
+   return (r.first + r.second) / 2;
+}
+
+} // namespace detail
+
+template <class RT1, class RT2, class RT3, class Policy>
+typename tools::promote_args<RT1, RT2, RT3>::type 
+      ibeta_inva(RT1 b, RT2 x, RT3 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   static const char* function = "boost::math::ibeta_inva<%1%>(%1%,%1%,%1%)";
+   if(p == 0)
+   {
+      return policies::raise_overflow_error<result_type>(function, 0, Policy());
+   }
+   if(p == 1)
+   {
+      return tools::min_value<result_type>();
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::ibeta_inv_ab_imp(
+         static_cast<value_type>(b), 
+         static_cast<value_type>(x), 
+         static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
+         false, pol), 
+      function);
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+typename tools::promote_args<RT1, RT2, RT3>::type 
+      ibetac_inva(RT1 b, RT2 x, RT3 q, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   static const char* function = "boost::math::ibetac_inva<%1%>(%1%,%1%,%1%)";
+   if(q == 1)
+   {
+      return policies::raise_overflow_error<result_type>(function, 0, Policy());
+   }
+   if(q == 0)
+   {
+      return tools::min_value<result_type>();
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::ibeta_inv_ab_imp(
+         static_cast<value_type>(b), 
+         static_cast<value_type>(x), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
+         static_cast<value_type>(q), 
+         false, pol),
+      function);
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+typename tools::promote_args<RT1, RT2, RT3>::type 
+      ibeta_invb(RT1 a, RT2 x, RT3 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   static const char* function = "boost::math::ibeta_invb<%1%>(%1%,%1%,%1%)";
+   if(p == 0)
+   {
+      return tools::min_value<result_type>();
+   }
+   if(p == 1)
+   {
+      return policies::raise_overflow_error<result_type>(function, 0, Policy());
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::ibeta_inv_ab_imp(
+         static_cast<value_type>(a), 
+         static_cast<value_type>(x), 
+         static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
+         true, pol),
+      function);
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+typename tools::promote_args<RT1, RT2, RT3>::type 
+      ibetac_invb(RT1 a, RT2 x, RT3 q, const Policy& pol)
+{
+   static const char* function = "boost::math::ibeta_invb<%1%>(%1%, %1%, %1%)";
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   if(q == 1)
+   {
+      return tools::min_value<result_type>();
+   }
+   if(q == 0)
+   {
+      return policies::raise_overflow_error<result_type>(function, 0, Policy());
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::ibeta_inv_ab_imp(
+         static_cast<value_type>(a), 
+         static_cast<value_type>(x), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
+         static_cast<value_type>(q),
+         true, pol),
+         function);
+}
+
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+         ibeta_inva(RT1 b, RT2 x, RT3 p)
+{
+   return boost::math::ibeta_inva(b, x, p, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+         ibetac_inva(RT1 b, RT2 x, RT3 q)
+{
+   return boost::math::ibetac_inva(b, x, q, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+         ibeta_invb(RT1 a, RT2 x, RT3 p)
+{
+   return boost::math::ibeta_invb(a, x, p, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+         ibetac_invb(RT1 a, RT2 x, RT3 q)
+{
+   return boost::math::ibetac_invb(a, x, q, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SP_DETAIL_BETA_INV_AB
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inverse.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inverse.hpp
new file mode 100644
index 0000000..a9fe8cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/ibeta_inverse.hpp
@@ -0,0 +1,993 @@
+//  Copyright John Maddock 2006.
+//  Copyright Paul A. Bristow 2007
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_IBETA_INVERSE_HPP
+#define BOOST_MATH_SPECIAL_FUNCTIONS_IBETA_INVERSE_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/beta.hpp>
+#include <boost/math/special_functions/erf.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/math/special_functions/detail/t_distribution_inv.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// Helper object used by root finding
+// code to convert eta to x.
+//
+template <class T>
+struct temme_root_finder
+{
+   temme_root_finder(const T t_, const T a_) : t(t_), a(a_) {}
+
+   boost::math::tuple<T, T> operator()(T x)
+   {
+      BOOST_MATH_STD_USING // ADL of std names
+
+      T y = 1 - x;
+      if(y == 0)
+      {
+         T big = tools::max_value<T>() / 4;
+         return boost::math::make_tuple(static_cast<T>(-big), static_cast<T>(-big));
+      }
+      if(x == 0)
+      {
+         T big = tools::max_value<T>() / 4;
+         return boost::math::make_tuple(static_cast<T>(-big), big);
+      }
+      T f = log(x) + a * log(y) + t;
+      T f1 = (1 / x) - (a / (y));
+      return boost::math::make_tuple(f, f1);
+   }
+private:
+   T t, a;
+};
+//
+// See:
+// "Asymptotic Inversion of the Incomplete Beta Function"
+// N.M. Temme
+// Journal of Computation and Applied Mathematics 41 (1992) 145-157.
+// Section 2.
+//
+template <class T, class Policy>
+T temme_method_1_ibeta_inverse(T a, T b, T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   const T r2 = sqrt(T(2));
+   //
+   // get the first approximation for eta from the inverse
+   // error function (Eq: 2.9 and 2.10).
+   //
+   T eta0 = boost::math::erfc_inv(2 * z, pol);
+   eta0 /= -sqrt(a / 2);
+
+   T terms[4] = { eta0 };
+   T workspace[7];
+   //
+   // calculate powers:
+   //
+   T B = b - a;
+   T B_2 = B * B;
+   T B_3 = B_2 * B;
+   //
+   // Calculate correction terms:
+   //
+
+   // See eq following 2.15:
+   workspace[0] = -B * r2 / 2;
+   workspace[1] = (1 - 2 * B) / 8;
+   workspace[2] = -(B * r2 / 48);
+   workspace[3] = T(-1) / 192;
+   workspace[4] = -B * r2 / 3840;
+   terms[1] = tools::evaluate_polynomial(workspace, eta0, 5);
+   // Eq Following 2.17:
+   workspace[0] = B * r2 * (3 * B - 2) / 12;
+   workspace[1] = (20 * B_2 - 12 * B + 1) / 128;
+   workspace[2] = B * r2 * (20 * B - 1) / 960;
+   workspace[3] = (16 * B_2 + 30 * B - 15) / 4608;
+   workspace[4] = B * r2 * (21 * B + 32) / 53760;
+   workspace[5] = (-32 * B_2 + 63) / 368640;
+   workspace[6] = -B * r2 * (120 * B + 17) / 25804480;
+   terms[2] = tools::evaluate_polynomial(workspace, eta0, 7);
+   // Eq Following 2.17:
+   workspace[0] = B * r2 * (-75 * B_2 + 80 * B - 16) / 480;
+   workspace[1] = (-1080 * B_3 + 868 * B_2 - 90 * B - 45) / 9216;
+   workspace[2] = B * r2 * (-1190 * B_2 + 84 * B + 373) / 53760;
+   workspace[3] = (-2240 * B_3 - 2508 * B_2 + 2100 * B - 165) / 368640;
+   terms[3] = tools::evaluate_polynomial(workspace, eta0, 4);
+   //
+   // Bring them together to get a final estimate for eta:
+   //
+   T eta = tools::evaluate_polynomial(terms, T(1/a), 4);
+   //
+   // now we need to convert eta to x, by solving the appropriate
+   // quadratic equation:
+   //
+   T eta_2 = eta * eta;
+   T c = -exp(-eta_2 / 2);
+   T x;
+   if(eta_2 == 0)
+      x = 0.5;
+   else
+      x = (1 + eta * sqrt((1 + c) / eta_2)) / 2;
+
+   BOOST_ASSERT(x >= 0);
+   BOOST_ASSERT(x <= 1);
+   BOOST_ASSERT(eta * (x - 0.5) >= 0);
+#ifdef BOOST_INSTRUMENT
+   std::cout << "Estimating x with Temme method 1: " << x << std::endl;
+#endif
+   return x;
+}
+//
+// See:
+// "Asymptotic Inversion of the Incomplete Beta Function"
+// N.M. Temme
+// Journal of Computation and Applied Mathematics 41 (1992) 145-157.
+// Section 3.
+//
+template <class T, class Policy>
+T temme_method_2_ibeta_inverse(T /*a*/, T /*b*/, T z, T r, T theta, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   //
+   // Get first estimate for eta, see Eq 3.9 and 3.10,
+   // but note there is a typo in Eq 3.10:
+   //
+   T eta0 = boost::math::erfc_inv(2 * z, pol);
+   eta0 /= -sqrt(r / 2);
+
+   T s = sin(theta);
+   T c = cos(theta);
+   //
+   // Now we need to purturb eta0 to get eta, which we do by
+   // evaluating the polynomial in 1/r at the bottom of page 151,
+   // to do this we first need the error terms e1, e2 e3
+   // which we'll fill into the array "terms".  Since these
+   // terms are themselves polynomials, we'll need another
+   // array "workspace" to calculate those...
+   //
+   T terms[4] = { eta0 };
+   T workspace[6];
+   //
+   // some powers of sin(theta)cos(theta) that we'll need later:
+   //
+   T sc = s * c;
+   T sc_2 = sc * sc;
+   T sc_3 = sc_2 * sc;
+   T sc_4 = sc_2 * sc_2;
+   T sc_5 = sc_2 * sc_3;
+   T sc_6 = sc_3 * sc_3;
+   T sc_7 = sc_4 * sc_3;
+   //
+   // Calculate e1 and put it in terms[1], see the middle of page 151:
+   //
+   workspace[0] = (2 * s * s - 1) / (3 * s * c);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co1[] = { -1, -5, 5 };
+   workspace[1] = -tools::evaluate_even_polynomial(co1, s, 3) / (36 * sc_2);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co2[] = { 1, 21, -69, 46 };
+   workspace[2] = tools::evaluate_even_polynomial(co2, s, 4) / (1620 * sc_3);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co3[] = { 7, -2, 33, -62, 31 };
+   workspace[3] = -tools::evaluate_even_polynomial(co3, s, 5) / (6480 * sc_4);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co4[] = { 25, -52, -17, 88, -115, 46 };
+   workspace[4] = tools::evaluate_even_polynomial(co4, s, 6) / (90720 * sc_5);
+   terms[1] = tools::evaluate_polynomial(workspace, eta0, 5);
+   //
+   // Now evaluate e2 and put it in terms[2]:
+   //
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co5[] = { 7, 12, -78, 52 };
+   workspace[0] = -tools::evaluate_even_polynomial(co5, s, 4) / (405 * sc_3);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co6[] = { -7, 2, 183, -370, 185 };
+   workspace[1] = tools::evaluate_even_polynomial(co6, s, 5) / (2592 * sc_4);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co7[] = { -533, 776, -1835, 10240, -13525, 5410 };
+   workspace[2] = -tools::evaluate_even_polynomial(co7, s, 6) / (204120 * sc_5);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co8[] = { -1579, 3747, -3372, -15821, 45588, -45213, 15071 };
+   workspace[3] = -tools::evaluate_even_polynomial(co8, s, 7) / (2099520 * sc_6);
+   terms[2] = tools::evaluate_polynomial(workspace, eta0, 4);
+   //
+   // And e3, and put it in terms[3]:
+   //
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co9[] = {449, -1259, -769, 6686, -9260, 3704 };
+   workspace[0] = tools::evaluate_even_polynomial(co9, s, 6) / (102060 * sc_5);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co10[] = { 63149, -151557, 140052, -727469, 2239932, -2251437, 750479 };
+   workspace[1] = -tools::evaluate_even_polynomial(co10, s, 7) / (20995200 * sc_6);
+   static const BOOST_MATH_INT_TABLE_TYPE(T, int) co11[] = { 29233, -78755, 105222, 146879, -1602610, 3195183, -2554139, 729754 };
+   workspace[2] = tools::evaluate_even_polynomial(co11, s, 8) / (36741600 * sc_7);
+   terms[3] = tools::evaluate_polynomial(workspace, eta0, 3);
+   //
+   // Bring the correction terms together to evaluate eta,
+   // this is the last equation on page 151:
+   //
+   T eta = tools::evaluate_polynomial(terms, T(1/r), 4);
+   //
+   // Now that we have eta we need to back solve for x,
+   // we seek the value of x that gives eta in Eq 3.2.
+   // The two methods used are described in section 5.
+   //
+   // Begin by defining a few variables we'll need later:
+   //
+   T x;
+   T s_2 = s * s;
+   T c_2 = c * c;
+   T alpha = c / s;
+   alpha *= alpha;
+   T lu = (-(eta * eta) / (2 * s_2) + log(s_2) + c_2 * log(c_2) / s_2);
+   //
+   // Temme doesn't specify what value to switch on here,
+   // but this seems to work pretty well:
+   //
+   if(fabs(eta) < 0.7)
+   {
+      //
+      // Small eta use the expansion Temme gives in the second equation
+      // of section 5, it's a polynomial in eta:
+      //
+      workspace[0] = s * s;
+      workspace[1] = s * c;
+      workspace[2] = (1 - 2 * workspace[0]) / 3;
+      static const BOOST_MATH_INT_TABLE_TYPE(T, int) co12[] = { 1, -13, 13 };
+      workspace[3] = tools::evaluate_polynomial(co12, workspace[0], 3) / (36 * s * c);
+      static const BOOST_MATH_INT_TABLE_TYPE(T, int) co13[] = { 1, 21, -69, 46 };
+      workspace[4] = tools::evaluate_polynomial(co13, workspace[0], 4) / (270 * workspace[0] * c * c);
+      x = tools::evaluate_polynomial(workspace, eta, 5);
+#ifdef BOOST_INSTRUMENT
+      std::cout << "Estimating x with Temme method 2 (small eta): " << x << std::endl;
+#endif
+   }
+   else
+   {
+      //
+      // If eta is large we need to solve Eq 3.2 more directly,
+      // begin by getting an initial approximation for x from
+      // the last equation on page 155, this is a polynomial in u:
+      //
+      T u = exp(lu);
+      workspace[0] = u;
+      workspace[1] = alpha;
+      workspace[2] = 0;
+      workspace[3] = 3 * alpha * (3 * alpha + 1) / 6;
+      workspace[4] = 4 * alpha * (4 * alpha + 1) * (4 * alpha + 2) / 24;
+      workspace[5] = 5 * alpha * (5 * alpha + 1) * (5 * alpha + 2) * (5 * alpha + 3) / 120;
+      x = tools::evaluate_polynomial(workspace, u, 6);
+      //
+      // At this point we may or may not have the right answer, Eq-3.2 has
+      // two solutions for x for any given eta, however the mapping in 3.2
+      // is 1:1 with the sign of eta and x-sin^2(theta) being the same.
+      // So we can check if we have the right root of 3.2, and if not
+      // switch x for 1-x.  This transformation is motivated by the fact
+      // that the distribution is *almost* symetric so 1-x will be in the right
+      // ball park for the solution:
+      //
+      if((x - s_2) * eta < 0)
+         x = 1 - x;
+#ifdef BOOST_INSTRUMENT
+      std::cout << "Estimating x with Temme method 2 (large eta): " << x << std::endl;
+#endif
+   }
+   //
+   // The final step is a few Newton-Raphson iterations to
+   // clean up our approximation for x, this is pretty cheap
+   // in general, and very cheap compared to an incomplete beta
+   // evaluation.  The limits set on x come from the observation
+   // that the sign of eta and x-sin^2(theta) are the same.
+   //
+   T lower, upper;
+   if(eta < 0)
+   {
+      lower = 0;
+      upper = s_2;
+   }
+   else
+   {
+      lower = s_2;
+      upper = 1;
+   }
+   //
+   // If our initial approximation is out of bounds then bisect:
+   //
+   if((x < lower) || (x > upper))
+      x = (lower+upper) / 2;
+   //
+   // And iterate:
+   //
+   x = tools::newton_raphson_iterate(
+      temme_root_finder<T>(-lu, alpha), x, lower, upper, policies::digits<T, Policy>() / 2);
+
+   return x;
+}
+//
+// See:
+// "Asymptotic Inversion of the Incomplete Beta Function"
+// N.M. Temme
+// Journal of Computation and Applied Mathematics 41 (1992) 145-157.
+// Section 4.
+//
+template <class T, class Policy>
+T temme_method_3_ibeta_inverse(T a, T b, T p, T q, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   //
+   // Begin by getting an initial approximation for the quantity
+   // eta from the dominant part of the incomplete beta:
+   //
+   T eta0;
+   if(p < q)
+      eta0 = boost::math::gamma_q_inv(b, p, pol);
+   else
+      eta0 = boost::math::gamma_p_inv(b, q, pol);
+   eta0 /= a;
+   //
+   // Define the variables and powers we'll need later on:
+   //
+   T mu = b / a;
+   T w = sqrt(1 + mu);
+   T w_2 = w * w;
+   T w_3 = w_2 * w;
+   T w_4 = w_2 * w_2;
+   T w_5 = w_3 * w_2;
+   T w_6 = w_3 * w_3;
+   T w_7 = w_4 * w_3;
+   T w_8 = w_4 * w_4;
+   T w_9 = w_5 * w_4;
+   T w_10 = w_5 * w_5;
+   T d = eta0 - mu;
+   T d_2 = d * d;
+   T d_3 = d_2 * d;
+   T d_4 = d_2 * d_2;
+   T w1 = w + 1;
+   T w1_2 = w1 * w1;
+   T w1_3 = w1 * w1_2;
+   T w1_4 = w1_2 * w1_2;
+   //
+   // Now we need to compute the purturbation error terms that
+   // convert eta0 to eta, these are all polynomials of polynomials.
+   // Probably these should be re-written to use tabulated data
+   // (see examples above), but it's less of a win in this case as we
+   // need to calculate the individual powers for the denominator terms
+   // anyway, so we might as well use them for the numerator-polynomials
+   // as well....
+   //
+   // Refer to p154-p155 for the details of these expansions:
+   //
+   T e1 = (w + 2) * (w - 1) / (3 * w);
+   e1 += (w_3 + 9 * w_2 + 21 * w + 5) * d / (36 * w_2 * w1);
+   e1 -= (w_4 - 13 * w_3 + 69 * w_2 + 167 * w + 46) * d_2 / (1620 * w1_2 * w_3);
+   e1 -= (7 * w_5 + 21 * w_4 + 70 * w_3 + 26 * w_2 - 93 * w - 31) * d_3 / (6480 * w1_3 * w_4);
+   e1 -= (75 * w_6 + 202 * w_5 + 188 * w_4 - 888 * w_3 - 1345 * w_2 + 118 * w + 138) * d_4 / (272160 * w1_4 * w_5);
+
+   T e2 = (28 * w_4 + 131 * w_3 + 402 * w_2 + 581 * w + 208) * (w - 1) / (1620 * w1 * w_3);
+   e2 -= (35 * w_6 - 154 * w_5 - 623 * w_4 - 1636 * w_3 - 3983 * w_2 - 3514 * w - 925) * d / (12960 * w1_2 * w_4);
+   e2 -= (2132 * w_7 + 7915 * w_6 + 16821 * w_5 + 35066 * w_4 + 87490 * w_3 + 141183 * w_2 + 95993 * w + 21640) * d_2  / (816480 * w_5 * w1_3);
+   e2 -= (11053 * w_8 + 53308 * w_7 + 117010 * w_6 + 163924 * w_5 + 116188 * w_4 - 258428 * w_3 - 677042 * w_2 - 481940 * w - 105497) * d_3 / (14696640 * w1_4 * w_6);
+
+   T e3 = -((3592 * w_7 + 8375 * w_6 - 1323 * w_5 - 29198 * w_4 - 89578 * w_3 - 154413 * w_2 - 116063 * w - 29632) * (w - 1)) / (816480 * w_5 * w1_2);
+   e3 -= (442043 * w_9 + 2054169 * w_8 + 3803094 * w_7 + 3470754 * w_6 + 2141568 * w_5 - 2393568 * w_4 - 19904934 * w_3 - 34714674 * w_2 - 23128299 * w - 5253353) * d / (146966400 * w_6 * w1_3);
+   e3 -= (116932 * w_10 + 819281 * w_9 + 2378172 * w_8 + 4341330 * w_7 + 6806004 * w_6 + 10622748 * w_5 + 18739500 * w_4 + 30651894 * w_3 + 30869976 * w_2 + 15431867 * w + 2919016) * d_2 / (146966400 * w1_4 * w_7);
+   //
+   // Combine eta0 and the error terms to compute eta (Second eqaution p155):
+   //
+   T eta = eta0 + e1 / a + e2 / (a * a) + e3 / (a * a * a);
+   //
+   // Now we need to solve Eq 4.2 to obtain x.  For any given value of
+   // eta there are two solutions to this equation, and since the distribtion
+   // may be very skewed, these are not related by x ~ 1-x we used when
+   // implementing section 3 above.  However we know that:
+   //
+   //  cross < x <= 1       ; iff eta < mu
+   //          x == cross   ; iff eta == mu
+   //     0 <= x < cross    ; iff eta > mu
+   //
+   // Where cross == 1 / (1 + mu)
+   // Many thanks to Prof Temme for clarifying this point.
+   //
+   // Therefore we'll just jump straight into Newton iterations
+   // to solve Eq 4.2 using these bounds, and simple bisection
+   // as the first guess, in practice this converges pretty quickly
+   // and we only need a few digits correct anyway:
+   //
+   if(eta <= 0)
+      eta = tools::min_value<T>();
+   T u = eta - mu * log(eta) + (1 + mu) * log(1 + mu) - mu;
+   T cross = 1 / (1 + mu);
+   T lower = eta < mu ? cross : 0;
+   T upper = eta < mu ? 1 : cross;
+   T x = (lower + upper) / 2;
+   x = tools::newton_raphson_iterate(
+      temme_root_finder<T>(u, mu), x, lower, upper, policies::digits<T, Policy>() / 2);
+#ifdef BOOST_INSTRUMENT
+   std::cout << "Estimating x with Temme method 3: " << x << std::endl;
+#endif
+   return x;
+}
+
+template <class T, class Policy>
+struct ibeta_roots
+{
+   ibeta_roots(T _a, T _b, T t, bool inv = false)
+      : a(_a), b(_b), target(t), invert(inv) {}
+
+   boost::math::tuple<T, T, T> operator()(T x)
+   {
+      BOOST_MATH_STD_USING // ADL of std names
+
+      BOOST_FPU_EXCEPTION_GUARD
+      
+      T f1;
+      T y = 1 - x;
+      T f = ibeta_imp(a, b, x, Policy(), invert, true, &f1) - target;
+      if(invert)
+         f1 = -f1;
+      if(y == 0)
+         y = tools::min_value<T>() * 64;
+      if(x == 0)
+         x = tools::min_value<T>() * 64;
+
+      T f2 = f1 * (-y * a + (b - 2) * x + 1);
+      if(fabs(f2) < y * x * tools::max_value<T>())
+         f2 /= (y * x);
+      if(invert)
+         f2 = -f2;
+
+      // make sure we don't have a zero derivative:
+      if(f1 == 0)
+         f1 = (invert ? -1 : 1) * tools::min_value<T>() * 64;
+
+      return boost::math::make_tuple(f, f1, f2);
+   }
+private:
+   T a, b, target;
+   bool invert;
+};
+
+template <class T, class Policy>
+T ibeta_inv_imp(T a, T b, T p, T q, const Policy& pol, T* py)
+{
+   BOOST_MATH_STD_USING  // For ADL of math functions.
+
+   //
+   // The flag invert is set to true if we swap a for b and p for q,
+   // in which case the result has to be subtracted from 1:
+   //
+   bool invert = false;
+   //
+   // Handle trivial cases first:
+   //
+   if(q == 0)
+   {
+      if(py) *py = 0;
+      return 1;
+   }
+   else if(p == 0)
+   {
+      if(py) *py = 1;
+      return 0;
+   }
+   else if(a == 1)
+   {
+      if(b == 1)
+      {
+         if(py) *py = 1 - p;
+         return p;
+      }
+      // Change things around so we can handle as b == 1 special case below:
+      std::swap(a, b);
+      std::swap(p, q);
+      invert = true;
+   }
+   //
+   // Depending upon which approximation method we use, we may end up
+   // calculating either x or y initially (where y = 1-x):
+   //
+   T x = 0; // Set to a safe zero to avoid a
+   // MSVC 2005 warning C4701: potentially uninitialized local variable 'x' used
+   // But code inspection appears to ensure that x IS assigned whatever the code path.
+   T y; 
+
+   // For some of the methods we can put tighter bounds
+   // on the result than simply [0,1]:
+   //
+   T lower = 0;
+   T upper = 1;
+   //
+   // Student's T with b = 0.5 gets handled as a special case, swap
+   // around if the arguments are in the "wrong" order:
+   //
+   if(a == 0.5f)
+   {
+      if(b == 0.5f)
+      {
+         x = sin(p * constants::half_pi<T>());
+         x *= x;
+         if(py)
+         {
+            *py = sin(q * constants::half_pi<T>());
+            *py *= *py;
+         }
+         return x;
+      }
+      else if(b > 0.5f)
+      {
+         std::swap(a, b);
+         std::swap(p, q);
+         invert = !invert;
+      }
+   }
+   //
+   // Select calculation method for the initial estimate:
+   //
+   if((b == 0.5f) && (a >= 0.5f) && (p != 1))
+   {
+      //
+      // We have a Student's T distribution:
+      x = find_ibeta_inv_from_t_dist(a, p, q, &y, pol);
+   }
+   else if(b == 1)
+   {
+      if(p < q)
+      {
+         if(a > 1)
+         {
+            x = pow(p, 1 / a);
+            y = -boost::math::expm1(log(p) / a, pol);
+         }
+         else
+         {
+            x = pow(p, 1 / a);
+            y = 1 - x;
+         }
+      }
+      else
+      {
+         x = exp(boost::math::log1p(-q, pol) / a);
+         y = -boost::math::expm1(boost::math::log1p(-q, pol) / a, pol);
+      }
+      if(invert)
+         std::swap(x, y);
+      if(py)
+         *py = y;
+      return x;
+   }
+   else if(a + b > 5)
+   {
+      //
+      // When a+b is large then we can use one of Prof Temme's
+      // asymptotic expansions, begin by swapping things around
+      // so that p < 0.5, we do this to avoid cancellations errors
+      // when p is large.
+      //
+      if(p > 0.5)
+      {
+         std::swap(a, b);
+         std::swap(p, q);
+         invert = !invert;
+      }
+      T minv = (std::min)(a, b);
+      T maxv = (std::max)(a, b);
+      if((sqrt(minv) > (maxv - minv)) && (minv > 5))
+      {
+         //
+         // When a and b differ by a small amount
+         // the curve is quite symmetrical and we can use an error
+         // function to approximate the inverse. This is the cheapest
+         // of the three Temme expantions, and the calculated value
+         // for x will never be much larger than p, so we don't have
+         // to worry about cancellation as long as p is small.
+         //
+         x = temme_method_1_ibeta_inverse(a, b, p, pol);
+         y = 1 - x;
+      }
+      else
+      {
+         T r = a + b;
+         T theta = asin(sqrt(a / r));
+         T lambda = minv / r;
+         if((lambda >= 0.2) && (lambda <= 0.8) && (r >= 10))
+         {
+            //
+            // The second error function case is the next cheapest
+            // to use, it brakes down when the result is likely to be
+            // very small, if a+b is also small, but we can use a
+            // cheaper expansion there in any case.  As before x won't
+            // be much larger than p, so as long as p is small we should
+            // be free of cancellation error.
+            //
+            T ppa = pow(p, 1/a);
+            if((ppa < 0.0025) && (a + b < 200))
+            {
+               x = ppa * pow(a * boost::math::beta(a, b, pol), 1/a);
+            }
+            else
+               x = temme_method_2_ibeta_inverse(a, b, p, r, theta, pol);
+            y = 1 - x;
+         }
+         else
+         {
+            //
+            // If we get here then a and b are very different in magnitude
+            // and we need to use the third of Temme's methods which
+            // involves inverting the incomplete gamma.  This is much more
+            // expensive than the other methods.  We also can only use this
+            // method when a > b, which can lead to cancellation errors
+            // if we really want y (as we will when x is close to 1), so
+            // a different expansion is used in that case.
+            //
+            if(a < b)
+            {
+               std::swap(a, b);
+               std::swap(p, q);
+               invert = !invert;
+            }
+            //
+            // Try and compute the easy way first:
+            //
+            T bet = 0;
+            if(b < 2)
+               bet = boost::math::beta(a, b, pol);
+            if(bet != 0)
+            {
+               y = pow(b * q * bet, 1/b);
+               x = 1 - y;
+            }
+            else 
+               y = 1;
+            if(y > 1e-5)
+            {
+               x = temme_method_3_ibeta_inverse(a, b, p, q, pol);
+               y = 1 - x;
+            }
+         }
+      }
+   }
+   else if((a < 1) && (b < 1))
+   {
+      //
+      // Both a and b less than 1,
+      // there is a point of inflection at xs:
+      //
+      T xs = (1 - a) / (2 - a - b);
+      //
+      // Now we need to ensure that we start our iteration from the
+      // right side of the inflection point:
+      //
+      T fs = boost::math::ibeta(a, b, xs, pol) - p;
+      if(fabs(fs) / p < tools::epsilon<T>() * 3)
+      {
+         // The result is at the point of inflection, best just return it:
+         *py = invert ? xs : 1 - xs;
+         return invert ? 1-xs : xs;
+      }
+      if(fs < 0)
+      {
+         std::swap(a, b);
+         std::swap(p, q);
+         invert = !invert;
+         xs = 1 - xs;
+      }
+      T xg = pow(a * p * boost::math::beta(a, b, pol), 1/a);
+      x = xg / (1 + xg);
+      y = 1 / (1 + xg);
+      //
+      // And finally we know that our result is below the inflection
+      // point, so set an upper limit on our search:
+      //
+      if(x > xs)
+         x = xs;
+      upper = xs;
+   }
+   else if((a > 1) && (b > 1))
+   {
+      //
+      // Small a and b, both greater than 1,
+      // there is a point of inflection at xs,
+      // and it's complement is xs2, we must always
+      // start our iteration from the right side of the
+      // point of inflection.
+      //
+      T xs = (a - 1) / (a + b - 2);
+      T xs2 = (b - 1) / (a + b - 2);
+      T ps = boost::math::ibeta(a, b, xs, pol) - p;
+
+      if(ps < 0)
+      {
+         std::swap(a, b);
+         std::swap(p, q);
+         std::swap(xs, xs2);
+         invert = !invert;
+      }
+      //
+      // Estimate x and y, using expm1 to get a good estimate
+      // for y when it's very small:
+      //
+      T lx = log(p * a * boost::math::beta(a, b, pol)) / a;
+      x = exp(lx);
+      y = x < 0.9 ? T(1 - x) : (T)(-boost::math::expm1(lx, pol));
+
+      if((b < a) && (x < 0.2))
+      {
+         //
+         // Under a limited range of circumstances we can improve
+         // our estimate for x, frankly it's clear if this has much effect!
+         //
+         T ap1 = a - 1;
+         T bm1 = b - 1;
+         T a_2 = a * a;
+         T a_3 = a * a_2;
+         T b_2 = b * b;
+         T terms[5] = { 0, 1 };
+         terms[2] = bm1 / ap1;
+         ap1 *= ap1;
+         terms[3] = bm1 * (3 * a * b + 5 * b + a_2 - a - 4) / (2 * (a + 2) * ap1);
+         ap1 *= (a + 1);
+         terms[4] = bm1 * (33 * a * b_2 + 31 * b_2 + 8 * a_2 * b_2 - 30 * a * b - 47 * b + 11 * a_2 * b + 6 * a_3 * b + 18 + 4 * a - a_3 + a_2 * a_2 - 10 * a_2)
+                    / (3 * (a + 3) * (a + 2) * ap1);
+         x = tools::evaluate_polynomial(terms, x, 5);
+      }
+      //
+      // And finally we know that our result is below the inflection
+      // point, so set an upper limit on our search:
+      //
+      if(x > xs)
+         x = xs;
+      upper = xs;
+   }
+   else /*if((a <= 1) != (b <= 1))*/
+   {
+      //
+      // If all else fails we get here, only one of a and b
+      // is above 1, and a+b is small.  Start by swapping
+      // things around so that we have a concave curve with b > a
+      // and no points of inflection in [0,1].  As long as we expect
+      // x to be small then we can use the simple (and cheap) power
+      // term to estimate x, but when we expect x to be large then
+      // this greatly underestimates x and leaves us trying to
+      // iterate "round the corner" which may take almost forever...
+      //
+      // We could use Temme's inverse gamma function case in that case,
+      // this works really rather well (albeit expensively) even though
+      // strictly speaking we're outside it's defined range.
+      //
+      // However it's expensive to compute, and an alternative approach
+      // which models the curve as a distorted quarter circle is much
+      // cheaper to compute, and still keeps the number of iterations
+      // required down to a reasonable level.  With thanks to Prof Temme
+      // for this suggestion.
+      //
+      if(b < a)
+      {
+         std::swap(a, b);
+         std::swap(p, q);
+         invert = !invert;
+      }
+      if(pow(p, 1/a) < 0.5)
+      {
+         x = pow(p * a * boost::math::beta(a, b, pol), 1 / a);
+         if(x == 0)
+            x = boost::math::tools::min_value<T>();
+         y = 1 - x;
+      }
+      else /*if(pow(q, 1/b) < 0.1)*/
+      {
+         // model a distorted quarter circle:
+         y = pow(1 - pow(p, b * boost::math::beta(a, b, pol)), 1/b);
+         if(y == 0)
+            y = boost::math::tools::min_value<T>();
+         x = 1 - y;
+      }
+   }
+
+   //
+   // Now we have a guess for x (and for y) we can set things up for
+   // iteration.  If x > 0.5 it pays to swap things round:
+   //
+   if(x > 0.5)
+   {
+      std::swap(a, b);
+      std::swap(p, q);
+      std::swap(x, y);
+      invert = !invert;
+      T l = 1 - upper;
+      T u = 1 - lower;
+      lower = l;
+      upper = u;
+   }
+   //
+   // lower bound for our search:
+   //
+   // We're not interested in denormalised answers as these tend to
+   // these tend to take up lots of iterations, given that we can't get
+   // accurate derivatives in this area (they tend to be infinite).
+   //
+   if(lower == 0)
+   {
+      if(invert && (py == 0))
+      {
+         //
+         // We're not interested in answers smaller than machine epsilon:
+         //
+         lower = boost::math::tools::epsilon<T>();
+         if(x < lower)
+            x = lower;
+      }
+      else
+         lower = boost::math::tools::min_value<T>();
+      if(x < lower)
+         x = lower;
+   }
+   //
+   // Figure out how many digits to iterate towards:
+   //
+   int digits = boost::math::policies::digits<T, Policy>() / 2;
+   if((x < 1e-50) && ((a < 1) || (b < 1)))
+   {
+      //
+      // If we're in a region where the first derivative is very
+      // large, then we have to take care that the root-finder
+      // doesn't terminate prematurely.  We'll bump the precision
+      // up to avoid this, but we have to take care not to set the
+      // precision too high or the last few iterations will just
+      // thrash around and convergence may be slow in this case.
+      // Try 3/4 of machine epsilon:
+      //
+      digits *= 3;  
+      digits /= 2;
+   }
+   //
+   // Now iterate, we can use either p or q as the target here
+   // depending on which is smaller:
+   //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   x = boost::math::tools::halley_iterate(
+      boost::math::detail::ibeta_roots<T, Policy>(a, b, (p < q ? p : q), (p < q ? false : true)), x, lower, upper, digits, max_iter);
+   policies::check_root_iterations<T>("boost::math::ibeta<%1%>(%1%, %1%, %1%)", max_iter, pol);
+   //
+   // We don't really want these asserts here, but they are useful for sanity
+   // checking that we have the limits right, uncomment if you suspect bugs *only*.
+   //
+   //BOOST_ASSERT(x != upper);
+   //BOOST_ASSERT((x != lower) || (x == boost::math::tools::min_value<T>()) || (x == boost::math::tools::epsilon<T>()));
+   //
+   // Tidy up, if we "lower" was too high then zero is the best answer we have:
+   //
+   if(x == lower)
+      x = 0;
+   if(py)
+      *py = invert ? x : 1 - x;
+   return invert ? 1-x : x;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class T4, class Policy>
+inline typename tools::promote_args<T1, T2, T3, T4>::type  
+   ibeta_inv(T1 a, T2 b, T3 p, T4* py, const Policy& pol)
+{
+   static const char* function = "boost::math::ibeta_inv<%1%>(%1%,%1%,%1%)";
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2, T3, T4>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   if(a <= 0)
+      return policies::raise_domain_error<result_type>(function, "The argument a to the incomplete beta function inverse must be greater than zero (got a=%1%).", a, pol);
+   if(b <= 0)
+      return policies::raise_domain_error<result_type>(function, "The argument b to the incomplete beta function inverse must be greater than zero (got b=%1%).", b, pol);
+   if((p < 0) || (p > 1))
+      return policies::raise_domain_error<result_type>(function, "Argument p outside the range [0,1] in the incomplete beta function inverse (got p=%1%).", p, pol);
+
+   value_type rx, ry;
+
+   rx = detail::ibeta_inv_imp(
+         static_cast<value_type>(a),
+         static_cast<value_type>(b),
+         static_cast<value_type>(p),
+         static_cast<value_type>(1 - p),
+         forwarding_policy(), &ry);
+
+   if(py) *py = policies::checked_narrowing_cast<T4, forwarding_policy>(ry, function);
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(rx, function);
+}
+
+template <class T1, class T2, class T3, class T4>
+inline typename tools::promote_args<T1, T2, T3, T4>::type  
+   ibeta_inv(T1 a, T2 b, T3 p, T4* py)
+{
+   return ibeta_inv(a, b, p, py, policies::policy<>());
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ibeta_inv(T1 a, T2 b, T3 p)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ibeta_inv(a, b, p, static_cast<result_type*>(0), policies::policy<>());
+}
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ibeta_inv(T1 a, T2 b, T3 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ibeta_inv(a, b, p, static_cast<result_type*>(0), pol);
+}
+
+template <class T1, class T2, class T3, class T4, class Policy>
+inline typename tools::promote_args<T1, T2, T3, T4>::type 
+   ibetac_inv(T1 a, T2 b, T3 q, T4* py, const Policy& pol)
+{
+   static const char* function = "boost::math::ibetac_inv<%1%>(%1%,%1%,%1%)";
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2, T3, T4>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   if(a <= 0)
+      return policies::raise_domain_error<result_type>(function, "The argument a to the incomplete beta function inverse must be greater than zero (got a=%1%).", a, pol);
+   if(b <= 0)
+      return policies::raise_domain_error<result_type>(function, "The argument b to the incomplete beta function inverse must be greater than zero (got b=%1%).", b, pol);
+   if((q < 0) || (q > 1))
+      return policies::raise_domain_error<result_type>(function, "Argument q outside the range [0,1] in the incomplete beta function inverse (got q=%1%).", q, pol);
+
+   value_type rx, ry;
+
+   rx = detail::ibeta_inv_imp(
+         static_cast<value_type>(a),
+         static_cast<value_type>(b),
+         static_cast<value_type>(1 - q),
+         static_cast<value_type>(q),
+         forwarding_policy(), &ry);
+
+   if(py) *py = policies::checked_narrowing_cast<T4, forwarding_policy>(ry, function);
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(rx, function);
+}
+
+template <class T1, class T2, class T3, class T4>
+inline typename tools::promote_args<T1, T2, T3, T4>::type 
+   ibetac_inv(T1 a, T2 b, T3 q, T4* py)
+{
+   return ibetac_inv(a, b, q, py, policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3>
+inline typename tools::promote_args<RT1, RT2, RT3>::type 
+   ibetac_inv(RT1 a, RT2 b, RT3 q)
+{
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   return ibetac_inv(a, b, q, static_cast<result_type*>(0), policies::policy<>());
+}
+
+template <class RT1, class RT2, class RT3, class Policy>
+inline typename tools::promote_args<RT1, RT2, RT3>::type
+   ibetac_inv(RT1 a, RT2 b, RT3 q, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT1, RT2, RT3>::type result_type;
+   return ibetac_inv(a, b, q, static_cast<result_type*>(0), pol);
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_IGAMMA_INVERSE_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/iconv.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/iconv.hpp
new file mode 100644
index 0000000..4256ffc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/iconv.hpp
@@ -0,0 +1,42 @@
+//  Copyright (c) 2009 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_ICONV_HPP
+#define BOOST_MATH_ICONV_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/round.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost { namespace math { namespace detail{
+
+template <class T, class Policy>
+inline int iconv_imp(T v, Policy const&, mpl::true_ const&)
+{
+   return static_cast<int>(v);
+}
+
+template <class T, class Policy>
+inline int iconv_imp(T v, Policy const& pol, mpl::false_ const&)
+{
+   BOOST_MATH_STD_USING
+   return iround(v, pol);
+}
+
+template <class T, class Policy>
+inline int iconv(T v, Policy const& pol)
+{
+   typedef typename boost::is_convertible<T, int>::type tag_type;
+   return iconv_imp(v, pol, tag_type());
+}
+
+
+}}} // namespaces
+
+#endif // BOOST_MATH_ICONV_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_inverse.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_inverse.hpp
new file mode 100644
index 0000000..fd0189c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_inverse.hpp
@@ -0,0 +1,551 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_IGAMMA_INVERSE_HPP
+#define BOOST_MATH_SPECIAL_FUNCTIONS_IGAMMA_INVERSE_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/tuple.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T>
+T find_inverse_s(T p, T q)
+{
+   //
+   // Computation of the Incomplete Gamma Function Ratios and their Inverse
+   // ARMIDO R. DIDONATO and ALFRED H. MORRIS, JR.
+   // ACM Transactions on Mathematical Software, Vol. 12, No. 4,
+   // December 1986, Pages 377-393.
+   //
+   // See equation 32.
+   //
+   BOOST_MATH_STD_USING
+   T t;
+   if(p < 0.5)
+   {
+      t = sqrt(-2 * log(p));
+   }
+   else
+   {
+      t = sqrt(-2 * log(q));
+   }
+   static const double a[4] = { 3.31125922108741, 11.6616720288968, 4.28342155967104, 0.213623493715853 };
+   static const double b[5] = { 1, 6.61053765625462, 6.40691597760039, 1.27364489782223, 0.3611708101884203e-1 };
+   T s = t - tools::evaluate_polynomial(a, t) / tools::evaluate_polynomial(b, t);
+   if(p < 0.5)
+      s = -s;
+   return s;
+}
+
+template <class T>
+T didonato_SN(T a, T x, unsigned N, T tolerance = 0)
+{
+   //
+   // Computation of the Incomplete Gamma Function Ratios and their Inverse
+   // ARMIDO R. DIDONATO and ALFRED H. MORRIS, JR.
+   // ACM Transactions on Mathematical Software, Vol. 12, No. 4,
+   // December 1986, Pages 377-393.
+   //
+   // See equation 34.
+   //
+   T sum = 1;
+   if(N >= 1)
+   {
+      T partial = x / (a + 1);
+      sum += partial;
+      for(unsigned i = 2; i <= N; ++i)
+      {
+         partial *= x / (a + i);
+         sum += partial;
+         if(partial < tolerance)
+            break;
+      }
+   }
+   return sum;
+}
+
+template <class T, class Policy>
+inline T didonato_FN(T p, T a, T x, unsigned N, T tolerance, const Policy& pol)
+{
+   //
+   // Computation of the Incomplete Gamma Function Ratios and their Inverse
+   // ARMIDO R. DIDONATO and ALFRED H. MORRIS, JR.
+   // ACM Transactions on Mathematical Software, Vol. 12, No. 4,
+   // December 1986, Pages 377-393.
+   //
+   // See equation 34.
+   //
+   BOOST_MATH_STD_USING
+   T u = log(p) + boost::math::lgamma(a + 1, pol);
+   return exp((u + x - log(didonato_SN(a, x, N, tolerance))) / a);
+}
+
+template <class T, class Policy>
+T find_inverse_gamma(T a, T p, T q, const Policy& pol, bool* p_has_10_digits)
+{
+   //
+   // In order to understand what's going on here, you will
+   // need to refer to:
+   //
+   // Computation of the Incomplete Gamma Function Ratios and their Inverse
+   // ARMIDO R. DIDONATO and ALFRED H. MORRIS, JR.
+   // ACM Transactions on Mathematical Software, Vol. 12, No. 4,
+   // December 1986, Pages 377-393.
+   //
+   BOOST_MATH_STD_USING
+
+   T result;
+   *p_has_10_digits = false;
+
+   if(a == 1)
+   {
+      result = -log(q);
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   }
+   else if(a < 1)
+   {
+      T g = boost::math::tgamma(a, pol);
+      T b = q * g;
+      BOOST_MATH_INSTRUMENT_VARIABLE(g);
+      BOOST_MATH_INSTRUMENT_VARIABLE(b);
+      if((b > 0.6) || ((b >= 0.45) && (a >= 0.3)))
+      {
+         // DiDonato & Morris Eq 21: 
+         //
+         // There is a slight variation from DiDonato and Morris here:
+         // the first form given here is unstable when p is close to 1,
+         // making it impossible to compute the inverse of Q(a,x) for small
+         // q.  Fortunately the second form works perfectly well in this case.
+         //
+         T u;
+         if((b * q > 1e-8) && (q > 1e-5))
+         {
+            u = pow(p * g * a, 1 / a);
+            BOOST_MATH_INSTRUMENT_VARIABLE(u);
+         }
+         else
+         {
+            u = exp((-q / a) - constants::euler<T>());
+            BOOST_MATH_INSTRUMENT_VARIABLE(u);
+         }
+         result = u / (1 - (u / (a + 1)));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else if((a < 0.3) && (b >= 0.35))
+      {
+         // DiDonato & Morris Eq 22:
+         T t = exp(-constants::euler<T>() - b);
+         T u = t * exp(t);
+         result = t * exp(u);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else if((b > 0.15) || (a >= 0.3))
+      {
+         // DiDonato & Morris Eq 23:
+         T y = -log(b);
+         T u = y - (1 - a) * log(y);
+         result = y - (1 - a) * log(u) - log(1 + (1 - a) / (1 + u));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else if (b > 0.1)
+      {
+         // DiDonato & Morris Eq 24:
+         T y = -log(b);
+         T u = y - (1 - a) * log(y);
+         result = y - (1 - a) * log(u) - log((u * u + 2 * (3 - a) * u + (2 - a) * (3 - a)) / (u * u + (5 - a) * u + 2));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else
+      {
+         // DiDonato & Morris Eq 25:
+         T y = -log(b);
+         T c1 = (a - 1) * log(y);
+         T c1_2 = c1 * c1;
+         T c1_3 = c1_2 * c1;
+         T c1_4 = c1_2 * c1_2;
+         T a_2 = a * a;
+         T a_3 = a_2 * a;
+
+         T c2 = (a - 1) * (1 + c1);
+         T c3 = (a - 1) * (-(c1_2 / 2) + (a - 2) * c1 + (3 * a - 5) / 2);
+         T c4 = (a - 1) * ((c1_3 / 3) - (3 * a - 5) * c1_2 / 2 + (a_2 - 6 * a + 7) * c1 + (11 * a_2 - 46 * a + 47) / 6);
+         T c5 = (a - 1) * (-(c1_4 / 4)
+                           + (11 * a - 17) * c1_3 / 6
+                           + (-3 * a_2 + 13 * a -13) * c1_2
+                           + (2 * a_3 - 25 * a_2 + 72 * a - 61) * c1 / 2
+                           + (25 * a_3 - 195 * a_2 + 477 * a - 379) / 12);
+
+         T y_2 = y * y;
+         T y_3 = y_2 * y;
+         T y_4 = y_2 * y_2;
+         result = y + c1 + (c2 / y) + (c3 / y_2) + (c4 / y_3) + (c5 / y_4);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         if(b < 1e-28f)
+            *p_has_10_digits = true;
+      }
+   }
+   else
+   {
+      // DiDonato and Morris Eq 31:
+      T s = find_inverse_s(p, q);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(s);
+
+      T s_2 = s * s;
+      T s_3 = s_2 * s;
+      T s_4 = s_2 * s_2;
+      T s_5 = s_4 * s;
+      T ra = sqrt(a);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(ra);
+
+      T w = a + s * ra + (s * s -1) / 3;
+      w += (s_3 - 7 * s) / (36 * ra);
+      w -= (3 * s_4 + 7 * s_2 - 16) / (810 * a);
+      w += (9 * s_5 + 256 * s_3 - 433 * s) / (38880 * a * ra);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(w);
+
+      if((a >= 500) && (fabs(1 - w / a) < 1e-6))
+      {
+         result = w;
+         *p_has_10_digits = true;
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else if (p > 0.5)
+      {
+         if(w < 3 * a)
+         {
+            result = w;
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         else
+         {
+            T D = (std::max)(T(2), T(a * (a - 1)));
+            T lg = boost::math::lgamma(a, pol);
+            T lb = log(q) + lg;
+            if(lb < -D * 2.3)
+            {
+               // DiDonato and Morris Eq 25:
+               T y = -lb;
+               T c1 = (a - 1) * log(y);
+               T c1_2 = c1 * c1;
+               T c1_3 = c1_2 * c1;
+               T c1_4 = c1_2 * c1_2;
+               T a_2 = a * a;
+               T a_3 = a_2 * a;
+
+               T c2 = (a - 1) * (1 + c1);
+               T c3 = (a - 1) * (-(c1_2 / 2) + (a - 2) * c1 + (3 * a - 5) / 2);
+               T c4 = (a - 1) * ((c1_3 / 3) - (3 * a - 5) * c1_2 / 2 + (a_2 - 6 * a + 7) * c1 + (11 * a_2 - 46 * a + 47) / 6);
+               T c5 = (a - 1) * (-(c1_4 / 4)
+                                 + (11 * a - 17) * c1_3 / 6
+                                 + (-3 * a_2 + 13 * a -13) * c1_2
+                                 + (2 * a_3 - 25 * a_2 + 72 * a - 61) * c1 / 2
+                                 + (25 * a_3 - 195 * a_2 + 477 * a - 379) / 12);
+
+               T y_2 = y * y;
+               T y_3 = y_2 * y;
+               T y_4 = y_2 * y_2;
+               result = y + c1 + (c2 / y) + (c3 / y_2) + (c4 / y_3) + (c5 / y_4);
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            }
+            else
+            {
+               // DiDonato and Morris Eq 33:
+               T u = -lb + (a - 1) * log(w) - log(1 + (1 - a) / (1 + w));
+               result = -lb + (a - 1) * log(u) - log(1 + (1 - a) / (1 + u));
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            }
+         }
+      }
+      else
+      {
+         T z = w;
+         T ap1 = a + 1;
+         T ap2 = a + 2;
+         if(w < 0.15f * ap1)
+         {
+            // DiDonato and Morris Eq 35:
+            T v = log(p) + boost::math::lgamma(ap1, pol);
+            z = exp((v + w) / a);
+            s = boost::math::log1p(z / ap1 * (1 + z / ap2), pol);
+            z = exp((v + z - s) / a);
+            s = boost::math::log1p(z / ap1 * (1 + z / ap2), pol);
+            z = exp((v + z - s) / a);
+            s = boost::math::log1p(z / ap1 * (1 + z / ap2 * (1 + z / (a + 3))), pol);
+            z = exp((v + z - s) / a);
+            BOOST_MATH_INSTRUMENT_VARIABLE(z);
+         }
+
+         if((z <= 0.01 * ap1) || (z > 0.7 * ap1))
+         {
+            result = z;
+            if(z <= 0.002 * ap1)
+               *p_has_10_digits = true;
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+         else
+         {
+            // DiDonato and Morris Eq 36:
+            T ls = log(didonato_SN(a, z, 100, T(1e-4)));
+            T v = log(p) + boost::math::lgamma(ap1, pol);
+            z = exp((v + z - ls) / a);
+            result = z * (1 - (a * log(z) - z - v + ls) / (a - z));
+
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+      }
+   }
+   return result;
+}
+
+template <class T, class Policy>
+struct gamma_p_inverse_func
+{
+   gamma_p_inverse_func(T a_, T p_, bool inv) : a(a_), p(p_), invert(inv)
+   {
+      //
+      // If p is too near 1 then P(x) - p suffers from cancellation
+      // errors causing our root-finding algorithms to "thrash", better
+      // to invert in this case and calculate Q(x) - (1-p) instead.
+      //
+      // Of course if p is *very* close to 1, then the answer we get will
+      // be inaccurate anyway (because there's not enough information in p)
+      // but at least we will converge on the (inaccurate) answer quickly.
+      //
+      if(p > 0.9)
+      {
+         p = 1 - p;
+         invert = !invert;
+      }
+   }
+
+   boost::math::tuple<T, T, T> operator()(const T& x)const
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      //
+      // Calculate P(x) - p and the first two derivates, or if the invert
+      // flag is set, then Q(x) - q and it's derivatives.
+      //
+      typedef typename policies::evaluation<T, Policy>::type value_type;
+      // typedef typename lanczos::lanczos<T, Policy>::type evaluation_type;
+      typedef typename policies::normalise<
+         Policy, 
+         policies::promote_float<false>, 
+         policies::promote_double<false>, 
+         policies::discrete_quantile<>,
+         policies::assert_undefined<> >::type forwarding_policy;
+
+      BOOST_MATH_STD_USING  // For ADL of std functions.
+
+      T f, f1;
+      value_type ft;
+      f = static_cast<T>(boost::math::detail::gamma_incomplete_imp(
+               static_cast<value_type>(a), 
+               static_cast<value_type>(x), 
+               true, invert,
+               forwarding_policy(), &ft));
+      f1 = static_cast<T>(ft);
+      T f2;
+      T div = (a - x - 1) / x;
+      f2 = f1;
+      if((fabs(div) > 1) && (tools::max_value<T>() / fabs(div) < f2))
+      {
+         // overflow:
+         f2 = -tools::max_value<T>() / 2;
+      }
+      else
+      {
+         f2 *= div;
+      }
+
+      if(invert)
+      {
+         f1 = -f1;
+         f2 = -f2;
+      }
+
+      return boost::math::make_tuple(static_cast<T>(f - p), f1, f2);
+   }
+private:
+   T a, p;
+   bool invert;
+};
+
+template <class T, class Policy>
+T gamma_p_inv_imp(T a, T p, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std functions.
+
+   static const char* function = "boost::math::gamma_p_inv<%1%>(%1%, %1%)";
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(p);
+
+   if(a <= 0)
+      return policies::raise_domain_error<T>(function, "Argument a in the incomplete gamma function inverse must be >= 0 (got a=%1%).", a, pol);
+   if((p < 0) || (p > 1))
+      return policies::raise_domain_error<T>(function, "Probabilty must be in the range [0,1] in the incomplete gamma function inverse (got p=%1%).", p, pol);
+   if(p == 1)
+      return policies::raise_overflow_error<T>(function, 0, Policy());
+   if(p == 0)
+      return 0;
+   bool has_10_digits;
+   T guess = detail::find_inverse_gamma<T>(a, p, 1 - p, pol, &has_10_digits);
+   if((policies::digits<T, Policy>() <= 36) && has_10_digits)
+      return guess;
+   T lower = tools::min_value<T>();
+   if(guess <= lower)
+      guess = tools::min_value<T>();
+   BOOST_MATH_INSTRUMENT_VARIABLE(guess);
+   //
+   // Work out how many digits to converge to, normally this is
+   // 2/3 of the digits in T, but if the first derivative is very
+   // large convergence is slow, so we'll bump it up to full 
+   // precision to prevent premature termination of the root-finding routine.
+   //
+   unsigned digits = policies::digits<T, Policy>();
+   if(digits < 30)
+   {
+      digits *= 2;
+      digits /= 3;
+   }
+   else
+   {
+      digits /= 2;
+      digits -= 1;
+   }
+   if((a < 0.125) && (fabs(gamma_p_derivative(a, guess, pol)) > 1 / sqrt(tools::epsilon<T>())))
+      digits = policies::digits<T, Policy>() - 2;
+   //
+   // Go ahead and iterate:
+   //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   guess = tools::halley_iterate(
+      detail::gamma_p_inverse_func<T, Policy>(a, p, false),
+      guess,
+      lower,
+      tools::max_value<T>(),
+      digits,
+      max_iter);
+   policies::check_root_iterations<T>(function, max_iter, pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(guess);
+   if(guess == lower)
+      guess = policies::raise_underflow_error<T>(function, "Expected result known to be non-zero, but is smaller than the smallest available number.", pol);
+   return guess;
+}
+
+template <class T, class Policy>
+T gamma_q_inv_imp(T a, T q, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std functions.
+
+   static const char* function = "boost::math::gamma_q_inv<%1%>(%1%, %1%)";
+
+   if(a <= 0)
+      return policies::raise_domain_error<T>(function, "Argument a in the incomplete gamma function inverse must be >= 0 (got a=%1%).", a, pol);
+   if((q < 0) || (q > 1))
+      return policies::raise_domain_error<T>(function, "Probabilty must be in the range [0,1] in the incomplete gamma function inverse (got q=%1%).", q, pol);
+   if(q == 0)
+      return policies::raise_overflow_error<T>(function, 0, Policy());
+   if(q == 1)
+      return 0;
+   bool has_10_digits;
+   T guess = detail::find_inverse_gamma<T>(a, 1 - q, q, pol, &has_10_digits);
+   if((policies::digits<T, Policy>() <= 36) && has_10_digits)
+      return guess;
+   T lower = tools::min_value<T>();
+   if(guess <= lower)
+      guess = tools::min_value<T>();
+   //
+   // Work out how many digits to converge to, normally this is
+   // 2/3 of the digits in T, but if the first derivative is very
+   // large convergence is slow, so we'll bump it up to full 
+   // precision to prevent premature termination of the root-finding routine.
+   //
+   unsigned digits = policies::digits<T, Policy>();
+   if(digits < 30)
+   {
+      digits *= 2;
+      digits /= 3;
+   }
+   else
+   {
+      digits /= 2;
+      digits -= 1;
+   }
+   if((a < 0.125) && (fabs(gamma_p_derivative(a, guess, pol)) > 1 / sqrt(tools::epsilon<T>())))
+      digits = policies::digits<T, Policy>();
+   //
+   // Go ahead and iterate:
+   //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   guess = tools::halley_iterate(
+      detail::gamma_p_inverse_func<T, Policy>(a, q, true),
+      guess,
+      lower,
+      tools::max_value<T>(),
+      digits,
+      max_iter);
+   policies::check_root_iterations<T>(function, max_iter, pol);
+   if(guess == lower)
+      guess = policies::raise_underflow_error<T>(function, "Expected result known to be non-zero, but is smaller than the smallest available number.", pol);
+   return guess;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_inv(T1 a, T2 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::gamma_p_inv_imp(
+      static_cast<result_type>(a),
+      static_cast<result_type>(p), pol);
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_q_inv(T1 a, T2 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::gamma_q_inv_imp(
+      static_cast<result_type>(a),
+      static_cast<result_type>(p), pol);
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_inv(T1 a, T2 p)
+{
+   return gamma_p_inv(a, p, policies::policy<>());
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_q_inv(T1 a, T2 p)
+{
+   return gamma_q_inv(a, p, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_IGAMMA_INVERSE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_large.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_large.hpp
new file mode 100644
index 0000000..eb3d4ba
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/igamma_large.hpp
@@ -0,0 +1,768 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This file implements the asymptotic expansions of the incomplete
+// gamma functions P(a, x) and Q(a, x), used when a is large and
+// x ~ a.
+//
+// The primary reference is:
+//
+// "The Asymptotic Expansion of the Incomplete Gamma Functions"
+// N. M. Temme.
+// Siam J. Math Anal. Vol 10 No 4, July 1979, p757.
+//
+// A different way of evaluating these expansions,
+// plus a lot of very useful background information is in:
+// 
+// "A Set of Algorithms For the Incomplete Gamma Functions."
+// N. M. Temme.
+// Probability in the Engineering and Informational Sciences,
+// 8, 1994, 291.
+//
+// An alternative implementation is in:
+//
+// "Computation of the Incomplete Gamma Function Ratios and their Inverse."
+// A. R. Didonato and A. H. Morris.
+// ACM TOMS, Vol 12, No 4, Dec 1986, p377.
+//
+// There are various versions of the same code below, each accurate
+// to a different precision.  To understand the code, refer to Didonato
+// and Morris, from Eq 17 and 18 onwards.
+//
+// The coefficients used here are not taken from Didonato and Morris:
+// the domain over which these expansions are used is slightly different
+// to theirs, and their constants are not quite accurate enough for
+// 128-bit long double's.  Instead the coefficients were calculated
+// using the methods described by Temme p762 from Eq 3.8 onwards.
+// The values obtained agree with those obtained by Didonato and Morris
+// (at least to the first 30 digits that they provide).
+// At double precision the degrees of polynomial required for full
+// machine precision are close to those recomended to Didonato and Morris,
+// but of course many more terms are needed for larger types.
+//
+#ifndef BOOST_MATH_DETAIL_IGAMMA_LARGE
+#define BOOST_MATH_DETAIL_IGAMMA_LARGE
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+// This version will never be called (at runtime), it's a stub used
+// when T is unsuitable to be passed to these routines:
+//
+template <class T, class Policy>
+inline T igamma_temme_large(T, T, const Policy& /* pol */, mpl::int_<0> const *)
+{
+   // stub function, should never actually be called
+   BOOST_ASSERT(0);
+   return 0;
+}
+//
+// This version is accurate for up to 64-bit mantissa's, 
+// (80-bit long double, or 10^-20).
+//
+template <class T, class Policy>
+T igamma_temme_large(T a, T x, const Policy& pol, mpl::int_<64> const *)
+{
+   BOOST_MATH_STD_USING // ADL of std functions
+   T sigma = (x - a) / a;
+   T phi = -boost::math::log1pmx(sigma, pol);
+   T y = a * phi;
+   T z = sqrt(2 * phi);
+   if(x < a)
+      z = -z;
+
+   T workspace[13];
+
+   static const T C0[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0833333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0148148148148148148148),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00115740740740740740741),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000352733686067019400353),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0001787551440329218107),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.39192631785224377817e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.218544851067999216147e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.18540622107151599607e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.829671134095308600502e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.176659527368260793044e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.670785354340149858037e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.102618097842403080426e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.438203601845335318655e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.914769958223679023418e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.255141939949462497669e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.583077213255042506746e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.243619480206674162437e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.502766928011417558909e-11),
+   };
+   workspace[0] = tools::evaluate_polynomial(C0, z);
+
+   static const T C1[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00185185185185185185185),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00347222222222222222222),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00264550264550264550265),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000990226337448559670782),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000205761316872427983539),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.40187757201646090535e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.18098550334489977837e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.764916091608111008464e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.161209008945634460038e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.464712780280743434226e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.137863344691572095931e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.575254560351770496402e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.119516285997781473243e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.175432417197476476238e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.100915437106004126275e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.416279299184258263623e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.856390702649298063807e-10),
+   };
+   workspace[1] = tools::evaluate_polynomial(C1, z);
+
+   static const T C2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00413359788359788359788),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00268132716049382716049),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000771604938271604938272),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.200938786008230452675e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000107366532263651605215),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.529234488291201254164e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.127606351886187277134e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.342357873409613807419e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.137219573090629332056e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.629899213838005502291e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.142806142060642417916e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.204770984219908660149e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.140925299108675210533e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.622897408492202203356e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.136704883966171134993e-8),
+   };
+   workspace[2] = tools::evaluate_polynomial(C2, z);
+
+   static const T C3[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000649434156378600823045),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000229472093621399176955),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000469189494395255712128),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000267720632062838852962),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.756180167188397641073e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.239650511386729665193e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.110826541153473023615e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.56749528269915965675e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.142309007324358839146e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.278610802915281422406e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.169584040919302772899e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.809946490538808236335e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.191111684859736540607e-7),
+   };
+   workspace[3] = tools::evaluate_polynomial(C3, z);
+
+   static const T C4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000861888290916711698605),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000784039221720066627474),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000299072480303190179733),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.146384525788434181781e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.664149821546512218666e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.396836504717943466443e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.113757269706784190981e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.250749722623753280165e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.169541495365583060147e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.890750753220530968883e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.229293483400080487057e-6),
+   };
+   workspace[4] = tools::evaluate_polynomial(C4, z);
+
+   static const T C5[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000336798553366358150309),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.697281375836585777429e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000277275324495939207873),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000199325705161888477003),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.679778047793720783882e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.141906292064396701483e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.135940481897686932785e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.801847025633420153972e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.229148117650809517038e-5),
+   };
+   workspace[5] = tools::evaluate_polynomial(C5, z);
+
+   static const T C6[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000531307936463992223166),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000592166437353693882865),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000270878209671804482771),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.790235323266032787212e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.815396936756196875093e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.561168275310624965004e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.183291165828433755673e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.307961345060330478256e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.346515536880360908674e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.20291327396058603727e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.57887928631490037089e-6),
+   };
+   workspace[6] = tools::evaluate_polynomial(C6, z);
+
+   static const T C7[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000344367606892377671254),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.517179090826059219337e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000334931610811422363117),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000281269515476323702274),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000109765822446847310235),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.127410090954844853795e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.277444515115636441571e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.182634888057113326614e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.578769494973505239894e-5),
+   };
+   workspace[7] = tools::evaluate_polynomial(C7, z);
+
+   static const T C8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000652623918595309418922),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000839498720672087279993),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000438297098541721005061),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.696909145842055197137e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000166448466420675478374),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000127835176797692185853),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.462995326369130429061e-4),
+   };
+   workspace[8] = tools::evaluate_polynomial(C8, z);
+
+   static const T C9[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000596761290192746250124),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.720489541602001055909e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000678230883766732836162),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0006401475260262758451),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000277501076343287044992),
+   };
+   workspace[9] = tools::evaluate_polynomial(C9, z);
+
+   static const T C10[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00133244544948006563713),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0019144384985654775265),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00110893691345966373396),
+   };
+   workspace[10] = tools::evaluate_polynomial(C10, z);
+
+   static const T C11[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00157972766073083495909),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.000162516262783915816899),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00206334210355432762645),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00213896861856890981541),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00101085593912630031708),
+   };
+   workspace[11] = tools::evaluate_polynomial(C11, z);
+
+   static const T C12[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00407251211951401664727),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00640336283380806979482),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00404101610816766177474),
+   };
+   workspace[12] = tools::evaluate_polynomial(C12, z);
+
+   T result = tools::evaluate_polynomial<13, T, T>(workspace, 1/a);
+   result *= exp(-y) / sqrt(2 * constants::pi<T>() * a);
+   if(x < a)
+      result = -result;
+
+   result += boost::math::erfc(sqrt(y), pol) / 2;
+
+   return result;
+}
+//
+// This one is accurate for 53-bit mantissa's
+// (IEEE double precision or 10^-17).
+//
+template <class T, class Policy>
+T igamma_temme_large(T a, T x, const Policy& pol, mpl::int_<53> const *)
+{
+   BOOST_MATH_STD_USING // ADL of std functions
+   T sigma = (x - a) / a;
+   T phi = -boost::math::log1pmx(sigma, pol);
+   T y = a * phi;
+   T z = sqrt(2 * phi);
+   if(x < a)
+      z = -z;
+
+   T workspace[10];
+
+   static const T C0[] = {
+      static_cast<T>(-0.33333333333333333L),
+      static_cast<T>(0.083333333333333333L),
+      static_cast<T>(-0.014814814814814815L),
+      static_cast<T>(0.0011574074074074074L),
+      static_cast<T>(0.0003527336860670194L),
+      static_cast<T>(-0.00017875514403292181L),
+      static_cast<T>(0.39192631785224378e-4L),
+      static_cast<T>(-0.21854485106799922e-5L),
+      static_cast<T>(-0.185406221071516e-5L),
+      static_cast<T>(0.8296711340953086e-6L),
+      static_cast<T>(-0.17665952736826079e-6L),
+      static_cast<T>(0.67078535434014986e-8L),
+      static_cast<T>(0.10261809784240308e-7L),
+      static_cast<T>(-0.43820360184533532e-8L),
+      static_cast<T>(0.91476995822367902e-9L),
+   };
+   workspace[0] = tools::evaluate_polynomial(C0, z);
+
+   static const T C1[] = {
+      static_cast<T>(-0.0018518518518518519L),
+      static_cast<T>(-0.0034722222222222222L),
+      static_cast<T>(0.0026455026455026455L),
+      static_cast<T>(-0.00099022633744855967L),
+      static_cast<T>(0.00020576131687242798L),
+      static_cast<T>(-0.40187757201646091e-6L),
+      static_cast<T>(-0.18098550334489978e-4L),
+      static_cast<T>(0.76491609160811101e-5L),
+      static_cast<T>(-0.16120900894563446e-5L),
+      static_cast<T>(0.46471278028074343e-8L),
+      static_cast<T>(0.1378633446915721e-6L),
+      static_cast<T>(-0.5752545603517705e-7L),
+      static_cast<T>(0.11951628599778147e-7L),
+   };
+   workspace[1] = tools::evaluate_polynomial(C1, z);
+
+   static const T C2[] = {
+      static_cast<T>(0.0041335978835978836L),
+      static_cast<T>(-0.0026813271604938272L),
+      static_cast<T>(0.00077160493827160494L),
+      static_cast<T>(0.20093878600823045e-5L),
+      static_cast<T>(-0.00010736653226365161L),
+      static_cast<T>(0.52923448829120125e-4L),
+      static_cast<T>(-0.12760635188618728e-4L),
+      static_cast<T>(0.34235787340961381e-7L),
+      static_cast<T>(0.13721957309062933e-5L),
+      static_cast<T>(-0.6298992138380055e-6L),
+      static_cast<T>(0.14280614206064242e-6L),
+   };
+   workspace[2] = tools::evaluate_polynomial(C2, z);
+
+   static const T C3[] = {
+      static_cast<T>(0.00064943415637860082L),
+      static_cast<T>(0.00022947209362139918L),
+      static_cast<T>(-0.00046918949439525571L),
+      static_cast<T>(0.00026772063206283885L),
+      static_cast<T>(-0.75618016718839764e-4L),
+      static_cast<T>(-0.23965051138672967e-6L),
+      static_cast<T>(0.11082654115347302e-4L),
+      static_cast<T>(-0.56749528269915966e-5L),
+      static_cast<T>(0.14230900732435884e-5L),
+   };
+   workspace[3] = tools::evaluate_polynomial(C3, z);
+
+   static const T C4[] = {
+      static_cast<T>(-0.0008618882909167117L),
+      static_cast<T>(0.00078403922172006663L),
+      static_cast<T>(-0.00029907248030319018L),
+      static_cast<T>(-0.14638452578843418e-5L),
+      static_cast<T>(0.66414982154651222e-4L),
+      static_cast<T>(-0.39683650471794347e-4L),
+      static_cast<T>(0.11375726970678419e-4L),
+   };
+   workspace[4] = tools::evaluate_polynomial(C4, z);
+
+   static const T C5[] = {
+      static_cast<T>(-0.00033679855336635815L),
+      static_cast<T>(-0.69728137583658578e-4L),
+      static_cast<T>(0.00027727532449593921L),
+      static_cast<T>(-0.00019932570516188848L),
+      static_cast<T>(0.67977804779372078e-4L),
+      static_cast<T>(0.1419062920643967e-6L),
+      static_cast<T>(-0.13594048189768693e-4L),
+      static_cast<T>(0.80184702563342015e-5L),
+      static_cast<T>(-0.22914811765080952e-5L),
+   };
+   workspace[5] = tools::evaluate_polynomial(C5, z);
+
+   static const T C6[] = {
+      static_cast<T>(0.00053130793646399222L),
+      static_cast<T>(-0.00059216643735369388L),
+      static_cast<T>(0.00027087820967180448L),
+      static_cast<T>(0.79023532326603279e-6L),
+      static_cast<T>(-0.81539693675619688e-4L),
+      static_cast<T>(0.56116827531062497e-4L),
+      static_cast<T>(-0.18329116582843376e-4L),
+   };
+   workspace[6] = tools::evaluate_polynomial(C6, z);
+
+   static const T C7[] = {
+      static_cast<T>(0.00034436760689237767L),
+      static_cast<T>(0.51717909082605922e-4L),
+      static_cast<T>(-0.00033493161081142236L),
+      static_cast<T>(0.0002812695154763237L),
+      static_cast<T>(-0.00010976582244684731L),
+   };
+   workspace[7] = tools::evaluate_polynomial(C7, z);
+
+   static const T C8[] = {
+      static_cast<T>(-0.00065262391859530942L),
+      static_cast<T>(0.00083949872067208728L),
+      static_cast<T>(-0.00043829709854172101L),
+   };
+   workspace[8] = tools::evaluate_polynomial(C8, z);
+   workspace[9] = static_cast<T>(-0.00059676129019274625L);
+
+   T result = tools::evaluate_polynomial<10, T, T>(workspace, 1/a);
+   result *= exp(-y) / sqrt(2 * constants::pi<T>() * a);
+   if(x < a)
+      result = -result;
+
+   result += boost::math::erfc(sqrt(y), pol) / 2;
+
+   return result;
+}
+//
+// This one is accurate for 24-bit mantissa's
+// (IEEE float precision, or 10^-8)
+//
+template <class T, class Policy>
+T igamma_temme_large(T a, T x, const Policy& pol, mpl::int_<24> const *)
+{
+   BOOST_MATH_STD_USING // ADL of std functions
+   T sigma = (x - a) / a;
+   T phi = -boost::math::log1pmx(sigma, pol);
+   T y = a * phi;
+   T z = sqrt(2 * phi);
+   if(x < a)
+      z = -z;
+
+   T workspace[3];
+
+   static const T C0[] = {
+      static_cast<T>(-0.333333333L),
+      static_cast<T>(0.0833333333L),
+      static_cast<T>(-0.0148148148L),
+      static_cast<T>(0.00115740741L),
+      static_cast<T>(0.000352733686L),
+      static_cast<T>(-0.000178755144L),
+      static_cast<T>(0.391926318e-4L),
+   };
+   workspace[0] = tools::evaluate_polynomial(C0, z);
+
+   static const T C1[] = {
+      static_cast<T>(-0.00185185185L),
+      static_cast<T>(-0.00347222222L),
+      static_cast<T>(0.00264550265L),
+      static_cast<T>(-0.000990226337L),
+      static_cast<T>(0.000205761317L),
+   };
+   workspace[1] = tools::evaluate_polynomial(C1, z);
+
+   static const T C2[] = {
+      static_cast<T>(0.00413359788L),
+      static_cast<T>(-0.00268132716L),
+      static_cast<T>(0.000771604938L),
+   };
+   workspace[2] = tools::evaluate_polynomial(C2, z);
+
+   T result = tools::evaluate_polynomial(workspace, 1/a);
+   result *= exp(-y) / sqrt(2 * constants::pi<T>() * a);
+   if(x < a)
+      result = -result;
+
+   result += boost::math::erfc(sqrt(y), pol) / 2;
+
+   return result;
+}
+//
+// And finally, a version for 113-bit mantissa's
+// (128-bit long doubles, or 10^-34).
+// Note this one has been optimised for a > 200
+// It's use for a < 200 is not recomended, that would
+// require many more terms in the polynomials.
+//
+template <class T, class Policy>
+T igamma_temme_large(T a, T x, const Policy& pol, mpl::int_<113> const *)
+{
+   BOOST_MATH_STD_USING // ADL of std functions
+   T sigma = (x - a) / a;
+   T phi = -boost::math::log1pmx(sigma, pol);
+   T y = a * phi;
+   T z = sqrt(2 * phi);
+   if(x < a)
+      z = -z;
+
+   T workspace[14];
+
+   static const T C0[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0833333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0148148148148148148148148148148148148),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00115740740740740740740740740740740741),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0003527336860670194003527336860670194),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000178755144032921810699588477366255144),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.391926317852243778169704095630021556e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.218544851067999216147364295512443661e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.185406221071515996070179883622956325e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.829671134095308600501624213166443227e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.17665952736826079304360054245742403e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.670785354340149858036939710029613572e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.102618097842403080425739573227252951e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.438203601845335318655297462244719123e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.914769958223679023418248817633113681e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.255141939949462497668779537993887013e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.583077213255042506746408945040035798e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.243619480206674162436940696707789943e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.502766928011417558909054985925744366e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.110043920319561347708374174497293411e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.337176326240098537882769884169200185e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.13923887224181620659193661848957998e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.285348938070474432039669099052828299e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.513911183424257261899064580300494205e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.197522882943494428353962401580710912e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.809952115670456133407115668702575255e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.165225312163981618191514820265351162e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.253054300974788842327061090060267385e-17),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.116869397385595765888230876507793475e-16),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.477003704982048475822167804084816597e-17),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.969912605905623712420709685898585354e-18),
+   };
+   workspace[0] = tools::evaluate_polynomial(C0, z);
+
+   static const T C1[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00185185185185185185185185185185185185),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00347222222222222222222222222222222222),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0026455026455026455026455026455026455),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000990226337448559670781893004115226337),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000205761316872427983539094650205761317),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.401877572016460905349794238683127572e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.180985503344899778370285914867533523e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.76491609160811100846374214980916921e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.16120900894563446003775221882217767e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.464712780280743434226135033938722401e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.137863344691572095931187533077488877e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.575254560351770496402194531835048307e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.119516285997781473243076536699698169e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.175432417197476476237547551202312502e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.100915437106004126274577504686681675e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.416279299184258263623372347219858628e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.856390702649298063807431562579670208e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.606721510160475861512701762169919581e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.716249896481148539007961017165545733e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.293318664377143711740636683615595403e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.599669636568368872330374527568788909e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.216717865273233141017100472779701734e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.497833997236926164052815522048108548e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.202916288237134247736694804325894226e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.413125571381061004935108332558187111e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.828651623988309644380188591057589316e-18),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.341003088693333279336339355910600992e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.138541953028939715357034547426313703e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.281234665322887466568860332727259483e-16),
+   };
+   workspace[1] = tools::evaluate_polynomial(C1, z);
+
+   static const T C2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0041335978835978835978835978835978836),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00268132716049382716049382716049382716),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000771604938271604938271604938271604938),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.200938786008230452674897119341563786e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000107366532263651605215391223621676297),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.529234488291201254164217127180090143e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.127606351886187277133779191392360117e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.34235787340961380741902003904747389e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.137219573090629332055943852926020279e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.629899213838005502290672234278391876e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.142806142060642417915846008822771748e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.204770984219908660149195854409200226e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.140925299108675210532930244154315272e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.622897408492202203356394293530327112e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.136704883966171134992724380284402402e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.942835615901467819547711211663208075e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.128722524000893180595479368872770442e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.556459561343633211465414765894951439e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.119759355463669810035898150310311343e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.416897822518386350403836626692480096e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.109406404278845944099299008640802908e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.4662239946390135746326204922464679e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.990510576390690597844122258212382301e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.189318767683735145056885183170630169e-16),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.885922187259112726176031067028740667e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.373782039804640545306560251777191937e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.786883363903515525774088394065960751e-15),
+   };
+   workspace[2] = tools::evaluate_polynomial(C2, z);
+
+   static const T C3[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000649434156378600823045267489711934156),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000229472093621399176954732510288065844),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000469189494395255712128140111679206329),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000267720632062838852962309752433209223),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.756180167188397641072538191879755666e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.239650511386729665193314027333231723e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.110826541153473023614770299726861227e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.567495282699159656749963105701560205e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.14230900732435883914551894470580433e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.278610802915281422405802158211174452e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.16958404091930277289864168795820267e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.809946490538808236335278504852724081e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.191111684859736540606728140872727635e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.239286204398081179686413514022282056e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.206201318154887984369925818486654549e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.946049666185513217375417988510192814e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.215410497757749078380130268468744512e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.138882333681390304603424682490735291e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.218947616819639394064123400466489455e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.979099895117168512568262802255883368e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.217821918801809621153859472011393244e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.62088195734079014258166361684972205e-16),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.212697836327973697696702537114614471e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.934468879151743333127396765626749473e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.204536712267828493249215913063207436e-13),
+   };
+   workspace[3] = tools::evaluate_polynomial(C3, z);
+
+   static const T C4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000861888290916711698604702719929057378),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00078403922172006662747403488144228885),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000299072480303190179733389609932819809),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.146384525788434181781232535690697556e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.664149821546512218665853782451862013e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.396836504717943466443123507595386882e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.113757269706784190980552042885831759e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.250749722623753280165221942390057007e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.169541495365583060147164356781525752e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.890750753220530968882898422505515924e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.229293483400080487057216364891158518e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.295679413754404904696572852500004588e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.288658297427087836297341274604184504e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.141897394378032193894774303903982717e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.344635804994648970659527720474194356e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.230245171745280671320192735850147087e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.394092330280464052750697640085291799e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.186023389685045019134258533045185639e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.435632300505661804380678327446262424e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.127860010162962312660550463349930726e-14),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.467927502665791946200382739991760062e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.214924647061348285410535341910721086e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.490881561480965216323649688463984082e-12),
+   };
+   workspace[4] = tools::evaluate_polynomial(C4, z);
+
+   static const T C5[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000336798553366358150308767592718210002),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.697281375836585777429398828575783308e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00027727532449593920787336425196507501),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000199325705161888477003360405280844238),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.679778047793720783881640176604435742e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.141906292064396701483392727105575757e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.135940481897686932784583938837504469e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.80184702563342015397192571980419684e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.229148117650809517038048790128781806e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.325247355129845395166230137750005047e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.346528464910852649559195496827579815e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.184471871911713432765322367374920978e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.482409670378941807563762631738989002e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.179894667217435153025754291716644314e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.630619450001352343517516981425944698e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.316241762877456793773762181540969623e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.784092425369742929000839303523267545e-9),
+   };
+   workspace[5] = tools::evaluate_polynomial(C5, z);
+
+   static const T C6[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00053130793646399222316574854297762391),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000592166437353693882864836225604401187),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000270878209671804482771279183488328692),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.790235323266032787212032944390816666e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.815396936756196875092890088464682624e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.561168275310624965003775619041471695e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.183291165828433755673259749374098313e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.307961345060330478256414192546677006e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.346515536880360908673728529745376913e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.202913273960586037269527254582695285e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.578879286314900370889997586203187687e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.233863067382665698933480579231637609e-12),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.88286007463304835250508524317926246e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.474359588804081278032150770595852426e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.125454150207103824457130611214783073e-7),
+   };
+   workspace[6] = tools::evaluate_polynomial(C6, z);
+
+   static const T C7[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000344367606892377671254279625108523655),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.517179090826059219337057843002058823e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000334931610811422363116635090580012327),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000281269515476323702273722110707777978),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000109765822446847310235396824500789005),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.127410090954844853794579954588107623e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.277444515115636441570715073933712622e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.182634888057113326614324442681892723e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.578769494973505239894178121070843383e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.493875893393627039981813418398565502e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.105953670140260427338098566209633945e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.616671437611040747858836254004890765e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.175629733590604619378669693914265388e-6),
+   };
+   workspace[7] = tools::evaluate_polynomial(C7, z);
+
+   static const T C8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000652623918595309418922034919726622692),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000839498720672087279993357516764983445),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000438297098541721005061087953050560377),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.696909145842055197136911097362072702e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00016644846642067547837384572662326101),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000127835176797692185853344001461664247),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.462995326369130429061361032704489636e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.455790986792270771162749294232219616e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.105952711258051954718238500312872328e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.678334290486516662273073740749269432e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.210754766662588042469972680229376445e-5),
+   };
+   workspace[8] = tools::evaluate_polynomial(C8, z);
+
+   static const T C9[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000596761290192746250124390067179459605),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.720489541602001055908571930225015052e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000678230883766732836161951166000673426),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000640147526026275845100045652582354779),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000277501076343287044992374518205845463),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.181970083804651510461686554030325202e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.847950711706850318239732559632810086e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.610519208250153101764709122740859458e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.210739201834048624082975255893773306e-4),
+   };
+   workspace[9] = tools::evaluate_polynomial(C9, z);
+
+   static const T C10[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00133244544948006563712694993432717968),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00191443849856547752650089885832852254),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0011089369134596637339607446329267522),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.993240412264229896742295262075817566e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000508745012930931989848393025305956774),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00042735056665392884328432271160040444),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000168588537679107988033552814662382059),
+   };
+   workspace[10] = tools::evaluate_polynomial(C10, z);
+
+   static const T C11[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00157972766073083495908785631307733022),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000162516262783915816898635123980270998),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00206334210355432762645284467690276817),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00213896861856890981541061922797693947),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00101085593912630031708085801712479376),
+   };
+   workspace[11] = tools::evaluate_polynomial(C11, z);
+
+   static const T C12[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00407251211951401664727281097914544601),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00640336283380806979482363809026579583),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00404101610816766177473974858518094879),
+   };
+   workspace[12] = tools::evaluate_polynomial(C12, z);
+   workspace[13] = -0.0059475779383993002845382844736066323L;
+
+   T result = tools::evaluate_polynomial(workspace, T(1/a));
+   result *= exp(-y) / sqrt(2 * constants::pi<T>() * a);
+   if(x < a)
+      result = -result;
+
+   result += boost::math::erfc(sqrt(y), pol) / 2;
+
+   return result;
+}
+
+}  // namespace detail
+}  // namespace math
+}  // namespace math
+
+
+#endif // BOOST_MATH_DETAIL_IGAMMA_LARGE
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/lanczos_sse2.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/lanczos_sse2.hpp
new file mode 100644
index 0000000..edef3a0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/lanczos_sse2.hpp
@@ -0,0 +1,204 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS_SSE2
+#define BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS_SSE2
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <emmintrin.h>
+
+#if defined(__GNUC__) || defined(__PGI)
+#define ALIGN16 __attribute__((__aligned__(16)))
+#else
+#define ALIGN16 __declspec(align(16))
+#endif
+
+namespace boost{ namespace math{ namespace lanczos{
+
+template <>
+inline double lanczos13m53::lanczos_sum<double>(const double& x)
+{
+   static const ALIGN16 double coeff[26] = {
+      static_cast<double>(2.506628274631000270164908177133837338626L),
+      static_cast<double>(1u),
+      static_cast<double>(210.8242777515793458725097339207133627117L),
+      static_cast<double>(66u),
+      static_cast<double>(8071.672002365816210638002902272250613822L),
+      static_cast<double>(1925u),
+      static_cast<double>(186056.2653952234950402949897160456992822L),
+      static_cast<double>(32670u),
+      static_cast<double>(2876370.628935372441225409051620849613599L),
+      static_cast<double>(357423u),
+      static_cast<double>(31426415.58540019438061423162831820536287L),
+      static_cast<double>(2637558u),
+      static_cast<double>(248874557.8620541565114603864132294232163L),
+      static_cast<double>(13339535u),
+      static_cast<double>(1439720407.311721673663223072794912393972L),
+      static_cast<double>(45995730u),
+      static_cast<double>(6039542586.35202800506429164430729792107L),
+      static_cast<double>(105258076u),
+      static_cast<double>(17921034426.03720969991975575445893111267L),
+      static_cast<double>(150917976u),
+      static_cast<double>(35711959237.35566804944018545154716670596L),
+      static_cast<double>(120543840u),
+      static_cast<double>(42919803642.64909876895789904700198885093L),
+      static_cast<double>(39916800u),
+      static_cast<double>(23531376880.41075968857200767445163675473L),
+      static_cast<double>(0u)
+   };
+   __m128d vx = _mm_load1_pd(&x);
+   __m128d sum_even = _mm_load_pd(coeff);
+   __m128d sum_odd = _mm_load_pd(coeff+2);
+   __m128d nc_odd, nc_even;
+   __m128d vx2 = _mm_mul_pd(vx, vx);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 4);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 6);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 8);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 10);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 12);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 14);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 16);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 18);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 20);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 22);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 24);
+   sum_odd = _mm_mul_pd(sum_odd, vx);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_even = _mm_add_pd(sum_even, sum_odd);
+
+
+   double ALIGN16 t[2];
+   _mm_store_pd(t, sum_even);
+   
+   return t[0] / t[1];
+}
+
+template <>
+inline double lanczos13m53::lanczos_sum_expG_scaled<double>(const double& x)
+{
+   static const ALIGN16 double coeff[26] = {
+         static_cast<double>(0.006061842346248906525783753964555936883222L),
+         static_cast<double>(1u),
+         static_cast<double>(0.5098416655656676188125178644804694509993L),
+         static_cast<double>(66u),
+         static_cast<double>(19.51992788247617482847860966235652136208L),
+         static_cast<double>(1925u),
+         static_cast<double>(449.9445569063168119446858607650988409623L),
+         static_cast<double>(32670u),
+         static_cast<double>(6955.999602515376140356310115515198987526L),
+         static_cast<double>(357423u),
+         static_cast<double>(75999.29304014542649875303443598909137092L),
+         static_cast<double>(2637558u),
+         static_cast<double>(601859.6171681098786670226533699352302507L),
+         static_cast<double>(13339535u),
+         static_cast<double>(3481712.15498064590882071018964774556468L),
+         static_cast<double>(45995730u),
+         static_cast<double>(14605578.08768506808414169982791359218571L),
+         static_cast<double>(105258076u),
+         static_cast<double>(43338889.32467613834773723740590533316085L),
+         static_cast<double>(150917976u),
+         static_cast<double>(86363131.28813859145546927288977868422342L),
+         static_cast<double>(120543840u),
+         static_cast<double>(103794043.1163445451906271053616070238554L),
+         static_cast<double>(39916800u),
+         static_cast<double>(56906521.91347156388090791033559122686859L),
+         static_cast<double>(0u)
+   };
+   __m128d vx = _mm_load1_pd(&x);
+   __m128d sum_even = _mm_load_pd(coeff);
+   __m128d sum_odd = _mm_load_pd(coeff+2);
+   __m128d nc_odd, nc_even;
+   __m128d vx2 = _mm_mul_pd(vx, vx);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 4);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 6);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 8);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 10);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 12);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 14);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 16);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 18);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 20);
+   sum_odd = _mm_mul_pd(sum_odd, vx2);
+   nc_odd = _mm_load_pd(coeff + 22);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_odd = _mm_add_pd(sum_odd, nc_odd);
+
+   sum_even = _mm_mul_pd(sum_even, vx2);
+   nc_even = _mm_load_pd(coeff + 24);
+   sum_odd = _mm_mul_pd(sum_odd, vx);
+   sum_even = _mm_add_pd(sum_even, nc_even);
+   sum_even = _mm_add_pd(sum_even, sum_odd);
+
+
+   double ALIGN16 t[2];
+   _mm_store_pd(t, sum_even);
+   
+   return t[0] / t[1];
+}
+
+} // namespace lanczos
+} // namespace math
+} // namespace boost
+
+#undef ALIGN16
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/lgamma_small.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/lgamma_small.hpp
new file mode 100644
index 0000000..e65f8b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/lgamma_small.hpp
@@ -0,0 +1,522 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_DETAIL_LGAMMA_SMALL
+#define BOOST_MATH_SPECIAL_FUNCTIONS_DETAIL_LGAMMA_SMALL
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/big_constant.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// These need forward declaring to keep GCC happy:
+//
+template <class T, class Policy, class Lanczos>
+T gamma_imp(T z, const Policy& pol, const Lanczos& l);
+template <class T, class Policy>
+T gamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos& l);
+
+//
+// lgamma for small arguments:
+//
+template <class T, class Policy, class Lanczos>
+T lgamma_small_imp(T z, T zm1, T zm2, const mpl::int_<64>&, const Policy& /* l */, const Lanczos&)
+{
+   // This version uses rational approximations for small
+   // values of z accurate enough for 64-bit mantissas
+   // (80-bit long doubles), works well for 53-bit doubles as well.
+   // Lanczos is only used to select the Lanczos function.
+
+   BOOST_MATH_STD_USING  // for ADL of std names
+   T result = 0;
+   if(z < tools::epsilon<T>())
+   {
+      result = -log(z);
+   }
+   else if((zm1 == 0) || (zm2 == 0))
+   {
+      // nothing to do, result is zero....
+   }
+   else if(z > 2)
+   {
+      //
+      // Begin by performing argument reduction until
+      // z is in [2,3):
+      //
+      if(z >= 3)
+      {
+         do
+         {
+            z -= 1;
+            zm2 -= 1;
+            result += log(z);
+         }while(z >= 3);
+         // Update zm2, we need it below:
+         zm2 = z - 2;
+      }
+
+      //
+      // Use the following form:
+      //
+      // lgamma(z) = (z-2)(z+1)(Y + R(z-2))
+      //
+      // where R(z-2) is a rational approximation optimised for
+      // low absolute error - as long as it's absolute error
+      // is small compared to the constant Y - then any rounding
+      // error in it's computation will get wiped out.
+      //
+      // R(z-2) has the following properties:
+      //
+      // At double: Max error found:                    4.231e-18
+      // At long double: Max error found:               1.987e-21
+      // Maximum Deviation Found (approximation error): 5.900e-24
+      //
+      static const T P[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.180355685678449379109e-1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.25126649619989678683e-1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.494103151567532234274e-1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.172491608709613993966e-1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.259453563205438108893e-3)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.541009869215204396339e-3)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.324588649825948492091e-4))
+      };
+      static const T Q[] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1e1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.196202987197795200688e1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.148019669424231326694e1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.541391432071720958364e0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.988504251128010129477e-1)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.82130967464889339326e-2)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.224936291922115757597e-3)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.223352763208617092964e-6))
+      };
+
+      static const float Y = 0.158963680267333984375e0f;
+
+      T r = zm2 * (z + 1);
+      T R = tools::evaluate_polynomial(P, zm2);
+      R /= tools::evaluate_polynomial(Q, zm2);
+
+      result +=  r * Y + r * R;
+   }
+   else
+   {
+      //
+      // If z is less than 1 use recurrance to shift to
+      // z in the interval [1,2]:
+      //
+      if(z < 1)
+      {
+         result += -log(z);
+         zm2 = zm1;
+         zm1 = z;
+         z += 1;
+      }
+      //
+      // Two approximations, on for z in [1,1.5] and
+      // one for z in [1.5,2]:
+      //
+      if(z <= 1.5)
+      {
+         //
+         // Use the following form:
+         //
+         // lgamma(z) = (z-1)(z-2)(Y + R(z-1))
+         //
+         // where R(z-1) is a rational approximation optimised for
+         // low absolute error - as long as it's absolute error
+         // is small compared to the constant Y - then any rounding
+         // error in it's computation will get wiped out.
+         //
+         // R(z-1) has the following properties:
+         //
+         // At double precision: Max error found:                1.230011e-17
+         // At 80-bit long double precision:   Max error found:  5.631355e-21
+         // Maximum Deviation Found:                             3.139e-021
+         // Expected Error Term:                                 3.139e-021
+
+         //
+         static const float Y = 0.52815341949462890625f;
+
+         static const T P[] = {
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.490622454069039543534e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.969117530159521214579e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.414983358359495381969e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.406567124211938417342e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.158413586390692192217e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.240149820648571559892e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.100346687696279557415e-2))
+         };
+         static const T Q[] = {
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.302349829846463038743e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.348739585360723852576e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.191415588274426679201e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.507137738614363510846e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.577039722690451849648e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.195768102601107189171e-2))
+         };
+
+         T r = tools::evaluate_polynomial(P, zm1) / tools::evaluate_polynomial(Q, zm1);
+         T prefix = zm1 * zm2;
+
+         result += prefix * Y + prefix * r;
+      }
+      else
+      {
+         //
+         // Use the following form:
+         //
+         // lgamma(z) = (2-z)(1-z)(Y + R(2-z))
+         //
+         // where R(2-z) is a rational approximation optimised for
+         // low absolute error - as long as it's absolute error
+         // is small compared to the constant Y - then any rounding
+         // error in it's computation will get wiped out.
+         //
+         // R(2-z) has the following properties:
+         //
+         // At double precision, max error found:              1.797565e-17
+         // At 80-bit long double precision, max error found:  9.306419e-21
+         // Maximum Deviation Found:                           2.151e-021
+         // Expected Error Term:                               2.150e-021
+         //
+         static const float Y = 0.452017307281494140625f;
+
+         static const T P[] = {
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.292329721830270012337e-1)), 
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.144216267757192309184e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.142440390738631274135e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.542809694055053558157e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.850535976868336437746e-2)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.431171342679297331241e-3))
+         };
+         static const T Q[] = {
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.150169356054485044494e1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.846973248876495016101e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.220095151814995745555e0)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.25582797155975869989e-1)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.100666795539143372762e-2)),
+            static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.827193521891290553639e-6))
+         };
+         T r = zm2 * zm1;
+         T R = tools::evaluate_polynomial(P, T(-zm2)) / tools::evaluate_polynomial(Q, T(-zm2));
+
+         result += r * Y + r * R;
+      }
+   }
+   return result;
+}
+template <class T, class Policy, class Lanczos>
+T lgamma_small_imp(T z, T zm1, T zm2, const mpl::int_<113>&, const Policy& /* l */, const Lanczos&)
+{
+   //
+   // This version uses rational approximations for small
+   // values of z accurate enough for 113-bit mantissas
+   // (128-bit long doubles).
+   //
+   BOOST_MATH_STD_USING  // for ADL of std names
+   T result = 0;
+   if(z < tools::epsilon<T>())
+   {
+      result = -log(z);
+      BOOST_MATH_INSTRUMENT_CODE(result);
+   }
+   else if((zm1 == 0) || (zm2 == 0))
+   {
+      // nothing to do, result is zero....
+   }
+   else if(z > 2)
+   {
+      //
+      // Begin by performing argument reduction until
+      // z is in [2,3):
+      //
+      if(z >= 3)
+      {
+         do
+         {
+            z -= 1;
+            result += log(z);
+         }while(z >= 3);
+         zm2 = z - 2;
+      }
+      BOOST_MATH_INSTRUMENT_CODE(zm2);
+      BOOST_MATH_INSTRUMENT_CODE(z);
+      BOOST_MATH_INSTRUMENT_CODE(result);
+
+      //
+      // Use the following form:
+      //
+      // lgamma(z) = (z-2)(z+1)(Y + R(z-2))
+      //
+      // where R(z-2) is a rational approximation optimised for
+      // low absolute error - as long as it's absolute error
+      // is small compared to the constant Y - then any rounding
+      // error in it's computation will get wiped out.
+      //
+      // Maximum Deviation Found (approximation error)      3.73e-37
+
+      static const T P[] = {
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.018035568567844937910504030027467476655),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.013841458273109517271750705401202404195),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.062031842739486600078866923383017722399),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.052518418329052161202007865149435256093),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.01881718142472784129191838493267755758),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0025104830367021839316463675028524702846),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00021043176101831873281848891452678568311),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00010249622350908722793327719494037981166),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.11381479670982006841716879074288176994e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.49999811718089980992888533630523892389e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.70529798686542184668416911331718963364e-8)
+      };
+      static const T Q[] = {
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 2.5877485070422317542808137697939233685),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 2.8797959228352591788629602533153837126),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.8030885955284082026405495275461180977),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.69774331297747390169238306148355428436),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.17261566063277623942044077039756583802),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.02729301254544230229429621192443000121),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0026776425891195270663133581960016620433),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00015244249160486584591370355730402168106),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.43997034032479866020546814475414346627e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.46295080708455613044541885534408170934e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.93326638207459533682980757982834180952e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.42316456553164995177177407325292867513e-13)
+      };
+
+      T R = tools::evaluate_polynomial(P, zm2);
+      R /= tools::evaluate_polynomial(Q, zm2);
+
+      static const float Y = 0.158963680267333984375F;
+
+      T r = zm2 * (z + 1);
+
+      result +=  r * Y + r * R;
+      BOOST_MATH_INSTRUMENT_CODE(result);
+   }
+   else
+   {
+      //
+      // If z is less than 1 use recurrance to shift to
+      // z in the interval [1,2]:
+      //
+      if(z < 1)
+      {
+         result += -log(z);
+         zm2 = zm1;
+         zm1 = z;
+         z += 1;
+      }
+      BOOST_MATH_INSTRUMENT_CODE(result);
+      BOOST_MATH_INSTRUMENT_CODE(z);
+      BOOST_MATH_INSTRUMENT_CODE(zm2);
+      //
+      // Three approximations, on for z in [1,1.35], [1.35,1.625] and [1.625,1]
+      //
+      if(z <= 1.35)
+      {
+         //
+         // Use the following form:
+         //
+         // lgamma(z) = (z-1)(z-2)(Y + R(z-1))
+         //
+         // where R(z-1) is a rational approximation optimised for
+         // low absolute error - as long as it's absolute error
+         // is small compared to the constant Y - then any rounding
+         // error in it's computation will get wiped out.
+         //
+         // R(z-1) has the following properties:
+         //
+         // Maximum Deviation Found (approximation error)            1.659e-36
+         // Expected Error Term (theoretical error)                  1.343e-36
+         // Max error found at 128-bit long double precision         1.007e-35
+         //
+         static const float Y = 0.54076099395751953125f;
+
+         static const T P[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.036454670944013329356512090082402429697),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.066235835556476033710068679907798799959),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.67492399795577182387312206593595565371),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -1.4345555263962411429855341651960000166),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -1.4894319559821365820516771951249649563),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.87210277668067964629483299712322411566),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.29602090537771744401524080430529369136),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0561832587517836908929331992218879676),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0053236785487328044334381502530383140443),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.00018629360291358130461736386077971890789),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.10164985672213178500790406939467614498e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.13680157145361387405588201461036338274e-8)
+         };
+         static const T Q[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 4.9106336261005990534095838574132225599),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 10.258804800866438510889341082793078432),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 11.88588976846826108836629960537466889),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 8.3455000546999704314454891036700998428),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 3.6428823682421746343233362007194282703),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.97465989807254572142266753052776132252),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.15121052897097822172763084966793352524),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.012017363555383555123769849654484594893),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0003583032812720649835431669893011257277)
+         };
+
+         T r = tools::evaluate_polynomial(P, zm1) / tools::evaluate_polynomial(Q, zm1);
+         T prefix = zm1 * zm2;
+
+         result += prefix * Y + prefix * r;
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+      else if(z <= 1.625)
+      {
+         //
+         // Use the following form:
+         //
+         // lgamma(z) = (2-z)(1-z)(Y + R(2-z))
+         //
+         // where R(2-z) is a rational approximation optimised for
+         // low absolute error - as long as it's absolute error
+         // is small compared to the constant Y - then any rounding
+         // error in it's computation will get wiped out.
+         //
+         // R(2-z) has the following properties:
+         //
+         // Max error found at 128-bit long double precision  9.634e-36
+         // Maximum Deviation Found (approximation error)     1.538e-37
+         // Expected Error Term (theoretical error)           2.350e-38
+         //
+         static const float Y = 0.483787059783935546875f;
+
+         static const T P[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.017977422421608624353488126610933005432),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.18484528905298309555089509029244135703),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.40401251514859546989565001431430884082),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.40277179799147356461954182877921388182),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.21993421441282936476709677700477598816),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.069595742223850248095697771331107571011),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.012681481427699686635516772923547347328),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0012489322866834830413292771335113136034),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.57058739515423112045108068834668269608e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.8207548771933585614380644961342925976e-6)
+         };
+         static const T Q[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -2.9629552288944259229543137757200262073),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 3.7118380799042118987185957298964772755),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -2.5569815272165399297600586376727357187),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0546764918220835097855665680632153367),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.26574021300894401276478730940980810831),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.03996289731752081380552901986471233462),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0033398680924544836817826046380586480873),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00013288854760548251757651556792598235735),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.17194794958274081373243161848194745111e-5)
+         };
+         T r = zm2 * zm1;
+         T R = tools::evaluate_polynomial(P, T(0.625 - zm1)) / tools::evaluate_polynomial(Q, T(0.625 - zm1));
+
+         result += r * Y + r * R;
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+      else
+      {
+         //
+         // Same form as above.
+         //
+         // Max error found (at 128-bit long double precision) 1.831e-35
+         // Maximum Deviation Found (approximation error)      8.588e-36
+         // Expected Error Term (theoretical error)            1.458e-36
+         //
+         static const float Y = 0.443811893463134765625f;
+
+         static const T P[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.021027558364667626231512090082402429494),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.15128811104498736604523586803722368377),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.26249631480066246699388544451126410278),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.21148748610533489823742352180628489742),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.093964130697489071999873506148104370633),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.024292059227009051652542804957550866827),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0036284453226534839926304745756906117066),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0002939230129315195346843036254392485984),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.11088589183158123733132268042570710338e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.13240510580220763969511741896361984162e-6)
+         };
+         static const T Q[] = {
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -2.4240003754444040525462170802796471996),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.4868383476933178722203278602342786002),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -1.4047068395206343375520721509193698547),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.47583809087867443858344765659065773369),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.09865724264554556400463655444270700132),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.012238223514176587501074150988445109735),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.00084625068418239194670614419707491797097),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.2796574430456237061420839429225710602e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.30202973883316730694433702165188835331e-6)
+         };
+         // (2 - x) * (1 - x) * (c + R(2 - x))
+         T r = zm2 * zm1;
+         T R = tools::evaluate_polynomial(P, T(-zm2)) / tools::evaluate_polynomial(Q, T(-zm2));
+
+         result += r * Y + r * R;
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+   }
+   BOOST_MATH_INSTRUMENT_CODE(result);
+   return result;
+}
+template <class T, class Policy, class Lanczos>
+T lgamma_small_imp(T z, T zm1, T zm2, const mpl::int_<0>&, const Policy& pol, const Lanczos&)
+{
+   //
+   // No rational approximations are available because either
+   // T has no numeric_limits support (so we can't tell how
+   // many digits it has), or T has more digits than we know
+   // what to do with.... we do have a Lanczos approximation
+   // though, and that can be used to keep errors under control.
+   //
+   BOOST_MATH_STD_USING  // for ADL of std names
+   T result = 0;
+   if(z < tools::epsilon<T>())
+   {
+      result = -log(z);
+   }
+   else if(z < 0.5)
+   {
+      // taking the log of tgamma reduces the error, no danger of overflow here:
+      result = log(gamma_imp(z, pol, Lanczos()));
+   }
+   else if(z >= 3)
+   {
+      // taking the log of tgamma reduces the error, no danger of overflow here:
+      result = log(gamma_imp(z, pol, Lanczos()));
+   }
+   else if(z >= 1.5)
+   {
+      // special case near 2:
+      T dz = zm2;
+      result = dz * log((z + Lanczos::g() - T(0.5)) / boost::math::constants::e<T>());
+      result += boost::math::log1p(dz / (Lanczos::g() + T(1.5)), pol) * T(1.5);
+      result += boost::math::log1p(Lanczos::lanczos_sum_near_2(dz), pol);
+   }
+   else
+   {
+      // special case near 1:
+      T dz = zm1;
+      result = dz * log((z + Lanczos::g() - T(0.5)) / boost::math::constants::e<T>());
+      result += boost::math::log1p(dz / (Lanczos::g() + T(0.5)), pol) / 2;
+      result += boost::math::log1p(Lanczos::lanczos_sum_near_1(dz), pol);
+   }
+   return result;
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_DETAIL_LGAMMA_SMALL
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/polygamma.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/polygamma.hpp
new file mode 100644
index 0000000..4ef503b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/polygamma.hpp
@@ -0,0 +1,538 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2014 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+  #define _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+
+  #include <cmath>
+  #include <limits>
+  #include <boost/cstdint.hpp>
+  #include <boost/math/policies/policy.hpp>
+  #include <boost/math/special_functions/bernoulli.hpp>
+  #include <boost/math/special_functions/trunc.hpp>
+  #include <boost/math/special_functions/zeta.hpp>
+  #include <boost/math/special_functions/digamma.hpp>
+  #include <boost/math/special_functions/sin_pi.hpp>
+  #include <boost/math/special_functions/cos_pi.hpp>
+  #include <boost/math/special_functions/pow.hpp>
+  #include <boost/mpl/if.hpp>
+  #include <boost/mpl/int.hpp>
+  #include <boost/static_assert.hpp>
+  #include <boost/type_traits/is_convertible.hpp>
+
+  namespace boost { namespace math { namespace detail{
+
+  template<class T, class Policy>
+  T polygamma_atinfinityplus(const int n, const T& x, const Policy& pol, const char* function) // for large values of x such as for x> 400
+  {
+     // See http://functions.wolfram.com/GammaBetaErf/PolyGamma2/06/02/0001/
+     BOOST_MATH_STD_USING
+     //
+     // sum       == current value of accumulated sum.
+     // term      == value of current term to be added to sum.
+     // part_term == value of current term excluding the Bernoulli number part
+     //
+     if(n + x == x)
+     {
+        // x is crazy large, just concentrate on the first part of the expression and use logs:
+        if(n == 1) return 1 / x;
+        T nlx = n * log(x);
+        if((nlx < tools::log_max_value<T>()) && (n < max_factorial<T>::value))
+           return ((n & 1) ? 1 : -1) * boost::math::factorial<T>(n - 1) * pow(x, -n);
+        else
+         return ((n & 1) ? 1 : -1) * exp(boost::math::lgamma(T(n), pol) - n * log(x));
+     }
+     T term, sum, part_term;
+     T x_squared = x * x;
+     //
+     // Start by setting part_term to:
+     //
+     // (n-1)! / x^(n+1)
+     //
+     // which is common to both the first term of the series (with k = 1)
+     // and to the leading part.  
+     // We can then get to the leading term by:
+     //
+     // part_term * (n + 2 * x) / 2
+     //
+     // and to the first term in the series 
+     // (excluding the Bernoulli number) by:
+     //
+     // part_term n * (n + 1) / (2x)
+     //
+     // If either the factorial would overflow,
+     // or the power term underflows, this just gets set to 0 and then we
+     // know that we have to use logs for the initial terms:
+     //
+     part_term = ((n > boost::math::max_factorial<T>::value) && (T(n) * n > tools::log_max_value<T>())) 
+        ? T(0) : static_cast<T>(boost::math::factorial<T>(n - 1, pol) * pow(x, -n - 1));
+     if(part_term == 0)
+     {
+        // Either n is very large, or the power term underflows,
+        // set the initial values of part_term, term and sum via logs:
+        part_term = boost::math::lgamma(n, pol) - (n + 1) * log(x);
+        sum = exp(part_term + log(n + 2 * x) - boost::math::constants::ln_two<T>());
+        part_term += log(T(n) * (n + 1)) - boost::math::constants::ln_two<T>() - log(x);
+        part_term = exp(part_term);
+     }
+     else
+     {
+        sum = part_term * (n + 2 * x) / 2;
+        part_term *= (T(n) * (n + 1)) / 2;
+        part_term /= x;
+     }
+     //
+     // If the leading term is 0, so is the result:
+     //
+     if(sum == 0)
+        return sum;
+
+     for(unsigned k = 1;;)
+     {
+        term = part_term * boost::math::bernoulli_b2n<T>(k, pol);
+        sum += term;
+        //
+        // Normal termination condition:
+        //
+        if(fabs(term / sum) < tools::epsilon<T>())
+           break;
+        //
+        // Increment our counter, and move part_term on to the next value:
+        //
+        ++k;
+        part_term *= T(n + 2 * k - 2) * (n - 1 + 2 * k);
+        part_term /= (2 * k - 1) * 2 * k;
+        part_term /= x_squared;
+        //
+        // Emergency get out termination condition:
+        //
+        if(k > policies::get_max_series_iterations<Policy>())
+        {
+           return policies::raise_evaluation_error(function, "Series did not converge, closest value was %1%", sum, pol);
+        }
+     }
+     
+     if((n - 1) & 1)
+        sum = -sum;
+
+     return sum;
+  }
+
+  template<class T, class Policy>
+  T polygamma_attransitionplus(const int n, const T& x, const Policy& pol, const char* function)
+  {
+    // See: http://functions.wolfram.com/GammaBetaErf/PolyGamma2/16/01/01/0017/
+
+    // Use N = (0.4 * digits) + (4 * n) for target value for x:
+    BOOST_MATH_STD_USING
+    const int d4d  = static_cast<int>(0.4F * policies::digits_base10<T, Policy>());
+    const int N = d4d + (4 * n);
+    const int m    = n;
+    const int iter = N - itrunc(x);
+
+    if(iter > (int)policies::get_max_series_iterations<Policy>())
+       return policies::raise_evaluation_error<T>(function, ("Exceeded maximum series evaluations evaluating at n = " + boost::lexical_cast<std::string>(n) + " and x = %1%").c_str(), x, pol);
+
+    const int minus_m_minus_one = -m - 1;
+
+    T z(x);
+    T sum0(0);
+    T z_plus_k_pow_minus_m_minus_one(0);
+
+    // Forward recursion to larger x, need to check for overflow first though:
+    if(log(z + iter) * minus_m_minus_one > -tools::log_max_value<T>())
+    {
+       for(int k = 1; k <= iter; ++k)
+       {
+          z_plus_k_pow_minus_m_minus_one = pow(z, minus_m_minus_one);
+          sum0 += z_plus_k_pow_minus_m_minus_one;
+          z += 1;
+       }
+       sum0 *= boost::math::factorial<T>(n);
+    }
+    else
+    {
+       for(int k = 1; k <= iter; ++k)
+       {
+          T log_term = log(z) * minus_m_minus_one + boost::math::lgamma(T(n + 1), pol);
+          sum0 += exp(log_term);
+          z += 1;
+       }
+    }
+    if((n - 1) & 1)
+       sum0 = -sum0;
+
+    return sum0 + polygamma_atinfinityplus(n, z, pol, function);
+  }
+
+  template <class T, class Policy>
+  T polygamma_nearzero(int n, T x, const Policy& pol, const char* function)
+  {
+     BOOST_MATH_STD_USING
+     //
+     // If we take this expansion for polygamma: http://functions.wolfram.com/06.15.06.0003.02
+     // and substitute in this expression for polygamma(n, 1): http://functions.wolfram.com/06.15.03.0009.01
+     // we get an alternating series for polygamma when x is small in terms of zeta functions of
+     // integer arguments (which are easy to evaluate, at least when the integer is even).
+     //
+     // In order to avoid spurious overflow, save the n! term for later, and rescale at the end:
+     //
+     T scale = boost::math::factorial<T>(n, pol);
+     //
+     // "factorial_part" contains everything except the zeta function
+     // evaluations in each term:
+     //
+     T factorial_part = 1;
+     //
+     // "prefix" is what we'll be adding the accumulated sum to, it will
+     // be n! / z^(n+1), but since we're scaling by n! it's just 
+     // 1 / z^(n+1) for now:
+     //
+     T prefix = pow(x, n + 1);
+     if(prefix == 0)
+        return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     prefix = 1 / prefix;
+     //
+     // First term in the series is necessarily < zeta(2) < 2, so
+     // ignore the sum if it will have no effect on the result anyway:
+     //
+     if(prefix > 2 / policies::get_epsilon<T, Policy>())
+        return ((n & 1) ? 1 : -1) * 
+         (tools::max_value<T>() / prefix < scale ? policies::raise_overflow_error<T>(function, 0, pol) : prefix * scale);
+     //
+     // As this is an alternating series we could accelerate it using 
+     // "Convergence Acceleration of Alternating Series",
+     // Henri Cohen, Fernando Rodriguez Villegas, and Don Zagier, Experimental Mathematics, 1999.
+     // In practice however, it appears not to make any difference to the number of terms
+     // required except in some edge cases which are filtered out anyway before we get here.
+     //
+     T sum = prefix;
+     for(unsigned k = 0;;)
+     {
+        // Get the k'th term:
+        T term = factorial_part * boost::math::zeta(T(k + n + 1), pol);
+        sum += term;
+        // Termination condition:
+        if(fabs(term) < fabs(sum * boost::math::policies::get_epsilon<T, Policy>()))
+           break;
+        //
+        // Move on k and factorial_part:
+        //
+        ++k;
+        factorial_part *= (-x * (n + k)) / k;
+        //
+        // Last chance exit:
+        //
+        if(k > policies::get_max_series_iterations<Policy>())
+           return policies::raise_evaluation_error<T>(function, "Series did not converge, best value is %1%", sum, pol);
+     }
+     //
+     // We need to multiply by the scale, at each stage checking for oveflow:
+     //
+     if(boost::math::tools::max_value<T>() / scale < sum)
+        return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     sum *= scale;
+     return n & 1 ? sum : -sum;
+  }
+
+  //
+  // Helper function which figures out which slot our coefficient is in
+  // given an angle multiplier for the cosine term of power:
+  //
+  template <class Table>
+  typename Table::value_type::reference dereference_table(Table& table, unsigned row, unsigned power)
+  {
+     return table[row][power / 2];
+  }
+
+
+
+  template <class T, class Policy>
+  T poly_cot_pi(int n, T x, T xc, const Policy& pol, const char* function)
+  {
+     BOOST_MATH_STD_USING
+     // Return n'th derivative of cot(pi*x) at x, these are simply
+     // tabulated for up to n = 9, beyond that it is possible to
+     // calculate coefficients as follows:
+     //
+     // The general form of each derivative is:
+     //
+     // pi^n * SUM{k=0, n} C[k,n] * cos^k(pi * x) * csc^(n+1)(pi * x)
+     //
+     // With constant C[0,1] = -1 and all other C[k,n] = 0;
+     // Then for each k < n+1:
+     // C[k-1, n+1]  -= k * C[k, n];
+     // C[k+1, n+1]  += (k-n-1) * C[k, n];
+     //
+     // Note that there are many different ways of representing this derivative thanks to
+     // the many trigomonetric identies available.  In particular, the sum of powers of
+     // cosines could be replaced by a sum of cosine multiple angles, and indeed if you
+     // plug the derivative into Mathematica this is the form it will give.  The two
+     // forms are related via the Chebeshev polynomials of the first kind and
+     // T_n(cos(x)) = cos(n x).  The polynomial form has the great advantage that
+     // all the cosine terms are zero at half integer arguments - right where this
+     // function has it's minumum - thus avoiding cancellation error in this region.
+     //
+     // And finally, since every other term in the polynomials is zero, we can save
+     // space by only storing the non-zero terms.  This greatly complexifies
+     // subscripting the tables in the calculation, but halves the storage space
+     // (and complexity for that matter).
+     //
+     T s = fabs(x) < fabs(xc) ? boost::math::sin_pi(x, pol) : boost::math::sin_pi(xc, pol);
+     T c = boost::math::cos_pi(x, pol);
+     switch(n)
+     {
+     case 1:
+        return -constants::pi<T, Policy>() / (s * s);
+     case 2:
+     {
+        return 2 * constants::pi<T, Policy>() * constants::pi<T, Policy>() * c / boost::math::pow<3>(s, pol);
+     }
+     case 3:
+     {
+        int P[] = { -2, -4 };
+        return boost::math::pow<3>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<4>(s, pol);
+     }
+     case 4:
+     {
+        int P[] = { 16, 8 };
+        return boost::math::pow<4>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<5>(s, pol);
+     }
+     case 5:
+     {
+        int P[] = { -16, -88, -16 };
+        return boost::math::pow<5>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<6>(s, pol);
+     }
+     case 6:
+     {
+        int P[] = { 272, 416, 32 };
+        return boost::math::pow<6>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<7>(s, pol);
+     }
+     case 7:
+     {
+        int P[] = { -272, -2880, -1824, -64 };
+        return boost::math::pow<7>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<8>(s, pol);
+     }
+     case 8:
+     {
+        int P[] = { 7936, 24576, 7680, 128 };
+        return boost::math::pow<8>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<9>(s, pol);
+     }
+     case 9:
+     {
+        int P[] = { -7936, -137216, -185856, -31616, -256 };
+        return boost::math::pow<9>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<10>(s, pol);
+     }
+     case 10:
+     {
+        int P[] = { 353792, 1841152, 1304832, 128512, 512 };
+        return boost::math::pow<10>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<11>(s, pol);
+     }
+     case 11:
+     {
+        int P[] = { -353792, -9061376, -21253376, -8728576, -518656, -1024};
+        return boost::math::pow<11>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<12>(s, pol);
+     }
+     case 12:
+     {
+        int P[] = { 22368256, 175627264, 222398464, 56520704, 2084864, 2048 };
+        return boost::math::pow<12>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<13>(s, pol);
+     }
+#ifndef BOOST_NO_LONG_LONG
+     case 13:
+     {
+        long long P[] = { -22368256LL, -795300864LL, -2868264960LL, -2174832640LL, -357888000LL, -8361984LL, -4096 };
+        return boost::math::pow<13>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<14>(s, pol);
+     }
+     case 14:
+     {
+        long long P[] = { 1903757312LL, 21016670208LL, 41731645440LL, 20261765120LL, 2230947840LL, 33497088LL, 8192 };
+        return boost::math::pow<14>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<15>(s, pol);
+     }
+     case 15:
+     {
+        long long P[] = { -1903757312LL, -89702612992LL, -460858269696LL, -559148810240LL, -182172651520LL, -13754155008LL, -134094848LL, -16384 };
+        return boost::math::pow<15>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<16>(s, pol);
+     }
+     case 16:
+     {
+        long long P[] = { 209865342976LL, 3099269660672LL, 8885192097792LL, 7048869314560LL, 1594922762240LL, 84134068224LL, 536608768LL, 32768 };
+        return boost::math::pow<16>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<17>(s, pol);
+     }
+     case 17:
+     {
+        long long P[] = { -209865342976LL, -12655654469632LL, -87815735738368LL, -155964390375424LL, -84842998005760LL, -13684856848384LL, -511780323328LL, -2146926592LL, -65536 };
+        return boost::math::pow<17>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<18>(s, pol);
+     }
+     case 18:
+     {
+        long long P[] = { 29088885112832LL, 553753414467584LL, 2165206642589696LL, 2550316668551168LL, 985278548541440LL, 115620218667008LL, 3100738912256LL, 8588754944LL, 131072 };
+        return boost::math::pow<18>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<19>(s, pol);
+     }
+     case 19:
+     {
+        long long P[] = { -29088885112832LL, -2184860175433728LL, -19686087844429824LL, -48165109676113920LL, -39471306959486976LL, -11124607890751488LL, -965271355195392LL, -18733264797696LL, -34357248000LL, -262144 };
+        return boost::math::pow<19>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<20>(s, pol);
+     }
+     case 20:
+     {
+        long long P[] = { 4951498053124096LL, 118071834535526400LL, 603968063567560704LL, 990081991141490688LL, 584901762421358592LL, 122829335169859584LL, 7984436548730880LL, 112949304754176LL, 137433710592LL, 524288 };
+        return boost::math::pow<20>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<21>(s, pol);
+     }
+#endif
+     }
+
+     //
+     // We'll have to compute the coefficients up to n, 
+     // complexity is O(n^2) which we don't worry about for now
+     // as the values are computed once and then cached.
+     // However, if the final evaluation would have too many
+     // terms just bail out right away:
+     //
+     if((unsigned)n / 2u > policies::get_max_series_iterations<Policy>())
+        return policies::raise_evaluation_error<T>(function, "The value of n is so large that we're unable to compute the result in reasonable time, best guess is %1%", 0, pol);
+#ifdef BOOST_HAS_THREADS
+     static boost::detail::lightweight_mutex m;
+     boost::detail::lightweight_mutex::scoped_lock l(m);
+#endif
+     static std::vector<std::vector<T> > table(1, std::vector<T>(1, T(-1)));
+
+     int index = n - 1;
+
+     if(index >= (int)table.size())
+     {
+        for(int i = (int)table.size() - 1; i < index; ++i)
+        {
+           int offset = i & 1; // 1 if the first cos power is 0, otherwise 0.
+           int sin_order = i + 2;  // order of the sin term
+           int max_cos_order = sin_order - 1;  // largest order of the polynomial of cos terms
+           int max_columns = (max_cos_order - offset) / 2;  // How many entries there are in the current row.
+           int next_offset = offset ? 0 : 1;
+           int next_max_columns = (max_cos_order + 1 - next_offset) / 2;  // How many entries there will be in the next row
+           table.push_back(std::vector<T>(next_max_columns + 1, T(0)));
+
+           for(int column = 0; column <= max_columns; ++column)
+           {
+              int cos_order = 2 * column + offset;  // order of the cosine term in entry "column"
+              BOOST_ASSERT(column < (int)table[i].size());
+              BOOST_ASSERT((cos_order + 1) / 2 < (int)table[i + 1].size());
+              table[i + 1][(cos_order + 1) / 2] += ((cos_order - sin_order) * table[i][column]) / (sin_order - 1);
+              if(cos_order)
+                table[i + 1][(cos_order - 1) / 2] += (-cos_order * table[i][column]) / (sin_order - 1);
+           }
+        }
+
+     }
+     T sum = boost::math::tools::evaluate_even_polynomial(&table[index][0], c, table[index].size());
+     if(index & 1)
+        sum *= c;  // First coeffient is order 1, and really an odd polynomial.
+     if(sum == 0)
+        return sum;
+     //
+     // The remaining terms are computed using logs since the powers and factorials
+     // get real large real quick:
+     //
+     T power_terms = n * log(boost::math::constants::pi<T>());
+     if(s == 0)
+        return sum * boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     power_terms -= log(fabs(s)) * (n + 1);
+     power_terms += boost::math::lgamma(T(n));
+     power_terms += log(fabs(sum));
+
+     if(power_terms > boost::math::tools::log_max_value<T>())
+        return sum * boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+
+     return exp(power_terms) * ((s < 0) && ((n + 1) & 1) ? -1 : 1) * boost::math::sign(sum);
+  }
+
+  template <class T, class Policy>
+  struct polygamma_initializer
+  {
+     struct init
+     {
+        init()
+        {
+           // Forces initialization of our table of coefficients and mutex:
+           boost::math::polygamma(30, T(-2.5f), Policy());
+        }
+        void force_instantiate()const{}
+     };
+     static const init initializer;
+     static void force_instantiate()
+     {
+        initializer.force_instantiate();
+     }
+  };
+
+  template <class T, class Policy>
+  const typename polygamma_initializer<T, Policy>::init polygamma_initializer<T, Policy>::initializer;
+  
+  template<class T, class Policy>
+  inline T polygamma_imp(const int n, T x, const Policy &pol)
+  {
+    BOOST_MATH_STD_USING
+    static const char* function = "boost::math::polygamma<%1%>(int, %1%)";
+    polygamma_initializer<T, Policy>::initializer.force_instantiate();
+    if(n < 0)
+       return policies::raise_domain_error<T>(function, "Order must be >= 0, but got %1%", static_cast<T>(n), pol);
+    if(x < 0)
+    {
+       if(floor(x) == x)
+       {
+          //
+          // Result is infinity if x is odd, and a pole error if x is even.
+          //
+          if(lltrunc(x) & 1)
+             return policies::raise_overflow_error<T>(function, 0, pol);
+          else
+             return policies::raise_pole_error<T>(function, "Evaluation at negative integer %1%", x, pol);
+       }
+       T z = 1 - x;
+       T result = polygamma_imp(n, z, pol) + constants::pi<T, Policy>() * poly_cot_pi(n, z, x, pol, function);
+       return n & 1 ? T(-result) : result;
+    }
+    //
+    // Limit for use of small-x-series is chosen
+    // so that the series doesn't go too divergent
+    // in the first few terms.  Ordinarily this
+    // would mean setting the limit to ~ 1 / n,
+    // but we can tolerate a small amount of divergence:
+    //
+    T small_x_limit = std::min(T(T(5) / n), T(0.25f));
+    if(x < small_x_limit)
+    {
+      return polygamma_nearzero(n, x, pol, function);
+    }
+    else if(x > 0.4F * policies::digits_base10<T, Policy>() + 4.0f * n)
+    {
+      return polygamma_atinfinityplus(n, x, pol, function);
+    }
+    else if(x == 1)
+    {
+       return (n & 1 ? 1 : -1) * boost::math::factorial<T>(n, pol) * boost::math::zeta(T(n + 1), pol);
+    }
+    else if(x == 0.5f)
+    {
+       T result = (n & 1 ? 1 : -1) * boost::math::factorial<T>(n, pol) * boost::math::zeta(T(n + 1), pol);
+       if(fabs(result) >= ldexp(tools::max_value<T>(), -n - 1))
+          return boost::math::sign(result) * policies::raise_overflow_error<T>(function, 0, pol);
+       result *= ldexp(T(1), n + 1) - 1;
+       return result;
+    }
+    else
+    {
+      return polygamma_attransitionplus(n, x, pol, function);
+    }
+  }
+
+} } } // namespace boost::math::detail
+
+#endif // _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/round_fwd.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/round_fwd.hpp
new file mode 100644
index 0000000..8c45a7d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/round_fwd.hpp
@@ -0,0 +1,93 @@
+// Copyright John Maddock 2008.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_ROUND_FWD_HPP
+#define BOOST_MATH_SPECIAL_ROUND_FWD_HPP
+
+#include <boost/config.hpp>
+#include <boost/math/tools/promotion.hpp>
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost
+{
+   namespace math
+   { 
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type trunc(const T& v, const Policy& pol);
+   template <class T>
+   typename tools::promote_args<T>::type trunc(const T& v);
+   template <class T, class Policy>
+   int itrunc(const T& v, const Policy& pol);
+   template <class T>
+   int itrunc(const T& v);
+   template <class T, class Policy>
+   long ltrunc(const T& v, const Policy& pol);
+   template <class T>
+   long ltrunc(const T& v);
+#ifdef BOOST_HAS_LONG_LONG
+   template <class T, class Policy>
+   boost::long_long_type lltrunc(const T& v, const Policy& pol);
+   template <class T>
+   boost::long_long_type lltrunc(const T& v);
+#endif
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type round(const T& v, const Policy& pol);
+   template <class T>
+   typename tools::promote_args<T>::type round(const T& v);
+   template <class T, class Policy>
+   int iround(const T& v, const Policy& pol);
+   template <class T>
+   int iround(const T& v);
+   template <class T, class Policy>
+   long lround(const T& v, const Policy& pol);
+   template <class T>
+   long lround(const T& v);
+#ifdef BOOST_HAS_LONG_LONG
+   template <class T, class Policy>
+   boost::long_long_type llround(const T& v, const Policy& pol);
+   template <class T>
+   boost::long_long_type llround(const T& v);
+#endif
+   template <class T, class Policy>
+   T modf(const T& v, T* ipart, const Policy& pol);
+   template <class T>
+   T modf(const T& v, T* ipart);
+   template <class T, class Policy>
+   T modf(const T& v, int* ipart, const Policy& pol);
+   template <class T>
+   T modf(const T& v, int* ipart);
+   template <class T, class Policy>
+   T modf(const T& v, long* ipart, const Policy& pol);
+   template <class T>
+   T modf(const T& v, long* ipart);
+#ifdef BOOST_HAS_LONG_LONG
+   template <class T, class Policy>
+   T modf(const T& v, boost::long_long_type* ipart, const Policy& pol);
+   template <class T>
+   T modf(const T& v, boost::long_long_type* ipart);
+#endif
+
+   }
+}
+
+#undef BOOST_MATH_STD_USING
+#define BOOST_MATH_STD_USING BOOST_MATH_STD_USING_CORE\
+   using boost::math::round;\
+   using boost::math::iround;\
+   using boost::math::lround;\
+   using boost::math::trunc;\
+   using boost::math::itrunc;\
+   using boost::math::ltrunc;\
+   using boost::math::modf;
+
+
+#endif // BOOST_MATH_SPECIAL_ROUND_FWD_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/t_distribution_inv.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/t_distribution_inv.hpp
new file mode 100644
index 0000000..72f6f0c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/t_distribution_inv.hpp
@@ -0,0 +1,549 @@
+//  Copyright John Maddock 2007.
+//  Copyright Paul A. Bristow 2007
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_DETAIL_INV_T_HPP
+#define BOOST_MATH_SF_DETAIL_INV_T_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/cbrt.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// The main method used is due to Hill:
+//
+// G. W. Hill, Algorithm 396, Student's t-Quantiles,
+// Communications of the ACM, 13(10): 619-620, Oct., 1970.
+//
+template <class T, class Policy>
+T inverse_students_t_hill(T ndf, T u, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   BOOST_ASSERT(u <= 0.5);
+
+   T a, b, c, d, q, x, y;
+
+   if (ndf > 1e20f)
+      return -boost::math::erfc_inv(2 * u, pol) * constants::root_two<T>();
+
+   a = 1 / (ndf - 0.5f);
+   b = 48 / (a * a);
+   c = ((20700 * a / b - 98) * a - 16) * a + 96.36f;
+   d = ((94.5f / (b + c) - 3) / b + 1) * sqrt(a * constants::pi<T>() / 2) * ndf;
+   y = pow(d * 2 * u, 2 / ndf);
+
+   if (y > (0.05f + a))
+   {
+      //
+      // Asymptotic inverse expansion about normal:
+      //
+      x = -boost::math::erfc_inv(2 * u, pol) * constants::root_two<T>();
+      y = x * x;
+
+      if (ndf < 5)
+         c += 0.3f * (ndf - 4.5f) * (x + 0.6f);
+      c += (((0.05f * d * x - 5) * x - 7) * x - 2) * x + b;
+      y = (((((0.4f * y + 6.3f) * y + 36) * y + 94.5f) / c - y - 3) / b + 1) * x;
+      y = boost::math::expm1(a * y * y, pol);
+   }
+   else
+   {
+      y = ((1 / (((ndf + 6) / (ndf * y) - 0.089f * d - 0.822f)
+              * (ndf + 2) * 3) + 0.5 / (ndf + 4)) * y - 1)
+              * (ndf + 1) / (ndf + 2) + 1 / y;
+   }
+   q = sqrt(ndf * y);
+
+   return -q;
+}
+//
+// Tail and body series are due to Shaw:
+//
+// www.mth.kcl.ac.uk/~shaww/web_page/papers/Tdistribution06.pdf
+//
+// Shaw, W.T., 2006, "Sampling Student's T distribution - use of
+// the inverse cumulative distribution function."
+// Journal of Computational Finance, Vol 9 Issue 4, pp 37-73, Summer 2006
+//
+template <class T, class Policy>
+T inverse_students_t_tail_series(T df, T v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   // Tail series expansion, see section 6 of Shaw's paper.
+   // w is calculated using Eq 60:
+   T w = boost::math::tgamma_delta_ratio(df / 2, constants::half<T>(), pol)
+      * sqrt(df * constants::pi<T>()) * v;
+   // define some variables:
+   T np2 = df + 2;
+   T np4 = df + 4;
+   T np6 = df + 6;
+   //
+   // Calculate the coefficients d(k), these depend only on the
+   // number of degrees of freedom df, so at least in theory
+   // we could tabulate these for fixed df, see p15 of Shaw:
+   //
+   T d[7] = { 1, };
+   d[1] = -(df + 1) / (2 * np2);
+   np2 *= (df + 2);
+   d[2] = -df * (df + 1) * (df + 3) / (8 * np2 * np4);
+   np2 *= df + 2;
+   d[3] = -df * (df + 1) * (df + 5) * (((3 * df) + 7) * df -2) / (48 * np2 * np4 * np6);
+   np2 *= (df + 2);
+   np4 *= (df + 4);
+   d[4] = -df * (df + 1) * (df + 7) *
+      ( (((((15 * df) + 154) * df + 465) * df + 286) * df - 336) * df + 64 )
+      / (384 * np2 * np4 * np6 * (df + 8));
+   np2 *= (df + 2);
+   d[5] = -df * (df + 1) * (df + 3) * (df + 9)
+            * (((((((35 * df + 452) * df + 1573) * df + 600) * df - 2020) * df) + 928) * df -128)
+            / (1280 * np2 * np4 * np6 * (df + 8) * (df + 10));
+   np2 *= (df + 2);
+   np4 *= (df + 4);
+   np6 *= (df + 6);
+   d[6] = -df * (df + 1) * (df + 11)
+            * ((((((((((((945 * df) + 31506) * df + 425858) * df + 2980236) * df + 11266745) * df + 20675018) * df + 7747124) * df - 22574632) * df - 8565600) * df + 18108416) * df - 7099392) * df + 884736)
+            / (46080 * np2 * np4 * np6 * (df + 8) * (df + 10) * (df +12));
+   //
+   // Now bring everthing together to provide the result,
+   // this is Eq 62 of Shaw:
+   //
+   T rn = sqrt(df);
+   T div = pow(rn * w, 1 / df);
+   T power = div * div;
+   T result = tools::evaluate_polynomial<7, T, T>(d, power);
+   result *= rn;
+   result /= div;
+   return -result;
+}
+
+template <class T, class Policy>
+T inverse_students_t_body_series(T df, T u, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Body series for small N:
+   //
+   // Start with Eq 56 of Shaw:
+   //
+   T v = boost::math::tgamma_delta_ratio(df / 2, constants::half<T>(), pol)
+      * sqrt(df * constants::pi<T>()) * (u - constants::half<T>());
+   //
+   // Workspace for the polynomial coefficients:
+   //
+   T c[11] = { 0, 1, };
+   //
+   // Figure out what the coefficients are, note these depend
+   // only on the degrees of freedom (Eq 57 of Shaw):
+   //
+   T in = 1 / df;
+   c[2] = 0.16666666666666666667 + 0.16666666666666666667 * in;
+   c[3] = (0.0083333333333333333333 * in 
+      + 0.066666666666666666667) * in 
+      + 0.058333333333333333333;
+   c[4] = ((0.00019841269841269841270 * in 
+      + 0.0017857142857142857143) * in 
+      + 0.026785714285714285714) * in 
+      + 0.025198412698412698413;
+   c[5] = (((2.7557319223985890653e-6 * in 
+      + 0.00037477954144620811287) * in 
+      - 0.0011078042328042328042) * in 
+      + 0.010559964726631393298) * in 
+      + 0.012039792768959435626;
+   c[6] = ((((2.5052108385441718775e-8 * in 
+      - 0.000062705427288760622094) * in 
+      + 0.00059458674042007375341) * in 
+      - 0.0016095979637646304313) * in 
+      + 0.0061039211560044893378) * in 
+      + 0.0038370059724226390893;
+   c[7] = (((((1.6059043836821614599e-10 * in 
+      + 0.000015401265401265401265) * in 
+      - 0.00016376804137220803887) * in
+      + 0.00069084207973096861986) * in 
+      - 0.0012579159844784844785) * in 
+      + 0.0010898206731540064873) * in 
+      + 0.0032177478835464946576;
+   c[8] = ((((((7.6471637318198164759e-13 * in
+      - 3.9851014346715404916e-6) * in
+      + 0.000049255746366361445727) * in
+      - 0.00024947258047043099953) * in 
+      + 0.00064513046951456342991) * in
+      - 0.00076245135440323932387) * in
+      + 0.000033530976880017885309) * in 
+      + 0.0017438262298340009980;
+   c[9] = (((((((2.8114572543455207632e-15 * in
+      + 1.0914179173496789432e-6) * in
+      - 0.000015303004486655377567) * in
+      + 0.000090867107935219902229) * in
+      - 0.00029133414466938067350) * in
+      + 0.00051406605788341121363) * in
+      - 0.00036307660358786885787) * in
+      - 0.00031101086326318780412) * in 
+      + 0.00096472747321388644237;
+   c[10] = ((((((((8.2206352466243297170e-18 * in
+      - 3.1239569599829868045e-7) * in
+      + 4.8903045291975346210e-6) * in
+      - 0.000033202652391372058698) * in
+      + 0.00012645437628698076975) * in
+      - 0.00028690924218514613987) * in
+      + 0.00035764655430568632777) * in
+      - 0.00010230378073700412687) * in
+      - 0.00036942667800009661203) * in
+      + 0.00054229262813129686486;
+   //
+   // The result is then a polynomial in v (see Eq 56 of Shaw):
+   //
+   return tools::evaluate_odd_polynomial<11, T, T>(c, v);
+}
+
+template <class T, class Policy>
+T inverse_students_t(T df, T u, T v, const Policy& pol, bool* pexact = 0)
+{
+   //
+   // df = number of degrees of freedom.
+   // u = probablity.
+   // v = 1 - u.
+   // l = lanczos type to use.
+   //
+   BOOST_MATH_STD_USING
+   bool invert = false;
+   T result = 0;
+   if(pexact)
+      *pexact = false;
+   if(u > v)
+   {
+      // function is symmetric, invert it:
+      std::swap(u, v);
+      invert = true;
+   }
+   if((floor(df) == df) && (df < 20))
+   {
+      //
+      // we have integer degrees of freedom, try for the special
+      // cases first:
+      //
+      T tolerance = ldexp(1.0f, (2 * policies::digits<T, Policy>()) / 3);
+
+      switch(itrunc(df, Policy()))
+      {
+      case 1:
+         {
+            //
+            // df = 1 is the same as the Cauchy distribution, see
+            // Shaw Eq 35:
+            //
+            if(u == 0.5)
+               result = 0;
+            else
+               result = -cos(constants::pi<T>() * u) / sin(constants::pi<T>() * u);
+            if(pexact)
+               *pexact = true;
+            break;
+         }
+      case 2:
+         {
+            //
+            // df = 2 has an exact result, see Shaw Eq 36:
+            //
+            result =(2 * u - 1) / sqrt(2 * u * v);
+            if(pexact)
+               *pexact = true;
+            break;
+         }
+      case 4:
+         {
+            //
+            // df = 4 has an exact result, see Shaw Eq 38 & 39:
+            //
+            T alpha = 4 * u * v;
+            T root_alpha = sqrt(alpha);
+            T r = 4 * cos(acos(root_alpha) / 3) / root_alpha;
+            T x = sqrt(r - 4);
+            result = u - 0.5f < 0 ? (T)-x : x;
+            if(pexact)
+               *pexact = true;
+            break;
+         }
+      case 6:
+         {
+            //
+            // We get numeric overflow in this area:
+            //
+            if(u < 1e-150)
+               return (invert ? -1 : 1) * inverse_students_t_hill(df, u, pol);
+            //
+            // Newton-Raphson iteration of a polynomial case,
+            // choice of seed value is taken from Shaw's online
+            // supplement:
+            //
+            T a = 4 * (u - u * u);//1 - 4 * (u - 0.5f) * (u - 0.5f);
+            T b = boost::math::cbrt(a);
+            static const T c = 0.85498797333834849467655443627193;
+            T p = 6 * (1 + c * (1 / b - 1));
+            T p0;
+            do{
+               T p2 = p * p;
+               T p4 = p2 * p2;
+               T p5 = p * p4;
+               p0 = p;
+               // next term is given by Eq 41:
+               p = 2 * (8 * a * p5 - 270 * p2 + 2187) / (5 * (4 * a * p4 - 216 * p - 243));
+            }while(fabs((p - p0) / p) > tolerance);
+            //
+            // Use Eq 45 to extract the result:
+            //
+            p = sqrt(p - df);
+            result = (u - 0.5f) < 0 ? (T)-p : p;
+            break;
+         }
+#if 0
+         //
+         // These are Shaw's "exact" but iterative solutions
+         // for even df, the numerical accuracy of these is
+         // rather less than Hill's method, so these are disabled
+         // for now, which is a shame because they are reasonably
+         // quick to evaluate...
+         //
+      case 8:
+         {
+            //
+            // Newton-Raphson iteration of a polynomial case,
+            // choice of seed value is taken from Shaw's online
+            // supplement:
+            //
+            static const T c8 = 0.85994765706259820318168359251872L;
+            T a = 4 * (u - u * u); //1 - 4 * (u - 0.5f) * (u - 0.5f);
+            T b = pow(a, T(1) / 4);
+            T p = 8 * (1 + c8 * (1 / b - 1));
+            T p0 = p;
+            do{
+               T p5 = p * p;
+               p5 *= p5 * p;
+               p0 = p;
+               // Next term is given by Eq 42:
+               p = 2 * (3 * p + (640 * (160 + p * (24 + p * (p + 4)))) / (-5120 + p * (-2048 - 960 * p + a * p5))) / 7;
+            }while(fabs((p - p0) / p) > tolerance);
+            //
+            // Use Eq 45 to extract the result:
+            //
+            p = sqrt(p - df);
+            result = (u - 0.5f) < 0 ? -p : p;
+            break;
+         }
+      case 10:
+         {
+            //
+            // Newton-Raphson iteration of a polynomial case,
+            // choice of seed value is taken from Shaw's online
+            // supplement:
+            //
+            static const T c10 = 0.86781292867813396759105692122285L;
+            T a = 4 * (u - u * u); //1 - 4 * (u - 0.5f) * (u - 0.5f);
+            T b = pow(a, T(1) / 5);
+            T p = 10 * (1 + c10 * (1 / b - 1));
+            T p0;
+            do{
+               T p6 = p * p;
+               p6 *= p6 * p6;
+               p0 = p;
+               // Next term given by Eq 43:
+               p = (8 * p) / 9 + (218750 * (21875 + 4 * p * (625 + p * (75 + 2 * p * (5 + p))))) /
+                  (9 * (-68359375 + 8 * p * (-2343750 + p * (-546875 - 175000 * p + 8 * a * p6))));
+            }while(fabs((p - p0) / p) > tolerance);
+            //
+            // Use Eq 45 to extract the result:
+            //
+            p = sqrt(p - df);
+            result = (u - 0.5f) < 0 ? -p : p;
+            break;
+         }
+#endif
+      default:
+         goto calculate_real;
+      }
+   }
+   else
+   {
+calculate_real:
+      if(df > 0x10000000)
+      {
+         result = -boost::math::erfc_inv(2 * u, pol) * constants::root_two<T>();
+         if((pexact) && (df >= 1e20))
+            *pexact = true;
+      }
+      else if(df < 3)
+      {
+         //
+         // Use a roughly linear scheme to choose between Shaw's
+         // tail series and body series:
+         //
+         T crossover = 0.2742f - df * 0.0242143f;
+         if(u > crossover)
+         {
+            result = boost::math::detail::inverse_students_t_body_series(df, u, pol);
+         }
+         else
+         {
+            result = boost::math::detail::inverse_students_t_tail_series(df, u, pol);
+         }
+      }
+      else
+      {
+         //
+         // Use Hill's method except in the exteme tails
+         // where we use Shaw's tail series.
+         // The crossover point is roughly exponential in -df:
+         //
+         T crossover = ldexp(1.0f, iround(T(df / -0.654f), typename policies::normalise<Policy, policies::rounding_error<policies::ignore_error> >::type()));
+         if(u > crossover)
+         {
+            result = boost::math::detail::inverse_students_t_hill(df, u, pol);
+         }
+         else
+         {
+            result = boost::math::detail::inverse_students_t_tail_series(df, u, pol);
+         }
+      }
+   }
+   return invert ? (T)-result : result;
+}
+
+template <class T, class Policy>
+inline T find_ibeta_inv_from_t_dist(T a, T p, T /*q*/, T* py, const Policy& pol)
+{
+   T u = p / 2;
+   T v = 1 - u;
+   T df = a * 2;
+   T t = boost::math::detail::inverse_students_t(df, u, v, pol);
+   *py = t * t / (df + t * t);
+   return df / (df + t * t);
+}
+
+template <class T, class Policy>
+inline T fast_students_t_quantile_imp(T df, T p, const Policy& pol, const mpl::false_*)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Need to use inverse incomplete beta to get
+   // required precision so not so fast:
+   //
+   T probability = (p > 0.5) ? 1 - p : p;
+   T t, x, y(0);
+   x = ibeta_inv(df / 2, T(0.5), 2 * probability, &y, pol);
+   if(df * y > tools::max_value<T>() * x)
+      t = policies::raise_overflow_error<T>("boost::math::students_t_quantile<%1%>(%1%,%1%)", 0, pol);
+   else
+      t = sqrt(df * y / x);
+   //
+   // Figure out sign based on the size of p:
+   //
+   if(p < 0.5)
+      t = -t;
+   return t;
+}
+
+template <class T, class Policy>
+T fast_students_t_quantile_imp(T df, T p, const Policy& pol, const mpl::true_*)
+{
+   BOOST_MATH_STD_USING
+   bool invert = false;
+   if((df < 2) && (floor(df) != df))
+      return boost::math::detail::fast_students_t_quantile_imp(df, p, pol, static_cast<mpl::false_*>(0));
+   if(p > 0.5)
+   {
+      p = 1 - p;
+      invert = true;
+   }
+   //
+   // Get an estimate of the result:
+   //
+   bool exact;
+   T t = inverse_students_t(df, p, T(1-p), pol, &exact);
+   if((t == 0) || exact)
+      return invert ? -t : t; // can't do better!
+   //
+   // Change variables to inverse incomplete beta:
+   //
+   T t2 = t * t;
+   T xb = df / (df + t2);
+   T y = t2 / (df + t2);
+   T a = df / 2;
+   //
+   // t can be so large that x underflows,
+   // just return our estimate in that case:
+   //
+   if(xb == 0)
+      return t;
+   //
+   // Get incomplete beta and it's derivative:
+   //
+   T f1;
+   T f0 = xb < y ? ibeta_imp(a, constants::half<T>(), xb, pol, false, true, &f1)
+      : ibeta_imp(constants::half<T>(), a, y, pol, true, true, &f1);
+
+   // Get cdf from incomplete beta result:
+   T p0 = f0 / 2  - p;
+   // Get pdf from derivative:
+   T p1 = f1 * sqrt(y * xb * xb * xb / df);
+   //
+   // Second derivative divided by p1:
+   //
+   // yacas gives:
+   //
+   // In> PrettyForm(Simplify(D(t) (1 + t^2/v) ^ (-(v+1)/2)))
+   //
+   //  |                        | v + 1     |     |
+   //  |                       -| ----- + 1 |     |
+   //  |                        |   2       |     |
+   // -|             |  2     |                   |
+   //  |             | t      |                   |
+   //  |             | -- + 1 |                   |
+   //  | ( v + 1 ) * | v      |               * t |
+   // ---------------------------------------------
+   //                       v
+   //
+   // Which after some manipulation is:
+   //
+   // -p1 * t * (df + 1) / (t^2 + df)
+   //
+   T p2 = t * (df + 1) / (t * t + df);
+   // Halley step:
+   t = fabs(t);
+   t += p0 / (p1 + p0 * p2 / 2);
+   return !invert ? -t : t;
+}
+
+template <class T, class Policy>
+inline T fast_students_t_quantile(T df, T p, const Policy& pol)
+{
+   typedef typename policies::evaluation<T, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   typedef mpl::bool_<
+      (std::numeric_limits<T>::digits <= 53)
+       &&
+      (std::numeric_limits<T>::is_specialized)
+       &&
+      (std::numeric_limits<T>::radix == 2)
+   > tag_type;
+   return policies::checked_narrowing_cast<T, forwarding_policy>(fast_students_t_quantile_imp(static_cast<value_type>(df), static_cast<value_type>(p), pol, static_cast<tag_type*>(0)), "boost::math::students_t_quantile<%1%>(%1%,%1%,%1%)");
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SF_DETAIL_INV_T_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_bernoulli.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_bernoulli.hpp
new file mode 100644
index 0000000..03c3766
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_bernoulli.hpp
@@ -0,0 +1,700 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2013 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_UNCHECKED_BERNOULLI_HPP
+#define BOOST_MATH_UNCHECKED_BERNOULLI_HPP
+
+#include <limits>
+#include <cmath>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost { namespace math { 
+   
+namespace detail {
+
+template <unsigned N>
+struct max_bernoulli_index
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 17);
+};
+
+template <>
+struct max_bernoulli_index<1>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 32);
+};
+
+template <>
+struct max_bernoulli_index<2>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 129);
+};
+
+template <>
+struct max_bernoulli_index<3>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 1156);
+};
+
+template <>
+struct max_bernoulli_index<4>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 11);
+};
+
+template <class T>
+struct bernoulli_imp_variant
+{
+   static const unsigned value = 
+      (std::numeric_limits<T>::max_exponent == 128)
+      && (std::numeric_limits<T>::radix == 2)
+      && (std::numeric_limits<T>::digits <= std::numeric_limits<float>::digits)
+      && (boost::is_convertible<float, T>::value) ? 1 :
+      (
+         (std::numeric_limits<T>::max_exponent == 1024)
+         && (std::numeric_limits<T>::radix == 2)
+         && (std::numeric_limits<T>::digits <= std::numeric_limits<double>::digits)
+         && (boost::is_convertible<double, T>::value) ? 2 :
+         (
+            (std::numeric_limits<T>::max_exponent == 16384)
+            && (std::numeric_limits<T>::radix == 2)
+            && (std::numeric_limits<T>::digits <= std::numeric_limits<long double>::digits)
+            && (boost::is_convertible<long double, T>::value) ? 3 : (!is_convertible<boost::int64_t, T>::value ? 4 : 0)
+         )
+      );
+};
+
+} // namespace detail
+
+template <class T>
+struct max_bernoulli_b2n : public detail::max_bernoulli_index<detail::bernoulli_imp_variant<T>::value>{};
+
+namespace detail{
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<0>& )
+{
+   static const boost::array<boost::int64_t, 1 + max_bernoulli_b2n<T>::value> numerators =
+   {{
+      boost::int64_t(            +1LL),
+      boost::int64_t(            +1LL),
+      boost::int64_t(            -1LL),
+      boost::int64_t(            +1LL),
+      boost::int64_t(            -1LL),
+      boost::int64_t(            +5LL),
+      boost::int64_t(          -691LL),
+      boost::int64_t(            +7LL),
+      boost::int64_t(         -3617LL),
+      boost::int64_t(        +43867LL),
+      boost::int64_t(       -174611LL),
+      boost::int64_t(       +854513LL),
+      boost::int64_t(    -236364091LL),
+      boost::int64_t(      +8553103LL),
+      boost::int64_t(  -23749461029LL),
+      boost::int64_t(+8615841276005LL),
+      boost::int64_t(-7709321041217LL),
+      boost::int64_t(+2577687858367LL)
+   }};
+
+   static const boost::array<boost::int64_t, 1 + max_bernoulli_b2n<T>::value> denominators =
+   {{
+      boost::int64_t(      1LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(     30LL),
+      boost::int64_t(     42LL),
+      boost::int64_t(     30LL),
+      boost::int64_t(     66LL),
+      boost::int64_t(   2730LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(    510LL),
+      boost::int64_t(    798LL),
+      boost::int64_t(    330LL),
+      boost::int64_t(    138LL),
+      boost::int64_t(   2730LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(    870LL),
+      boost::int64_t(  14322LL),
+      boost::int64_t(    510LL),
+      boost::int64_t(      6LL)
+   }};
+   return T(numerators[n]) / denominators[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<1>& )
+{
+   static const boost::array<float, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000F,
+      +0.166666666666666666666666666666666666666667F,
+      -0.0333333333333333333333333333333333333333333F,
+      +0.0238095238095238095238095238095238095238095F,
+      -0.0333333333333333333333333333333333333333333F,
+      +0.0757575757575757575757575757575757575757576F,
+      -0.253113553113553113553113553113553113553114F,
+      +1.16666666666666666666666666666666666666667F,
+      -7.09215686274509803921568627450980392156863F,
+      +54.9711779448621553884711779448621553884712F,
+      -529.124242424242424242424242424242424242424F,
+      +6192.12318840579710144927536231884057971014F,
+      -86580.2531135531135531135531135531135531136F,
+      +1.42551716666666666666666666666666666666667e6F,
+      -2.72982310678160919540229885057471264367816e7F,
+      +6.01580873900642368384303868174835916771401e8F,
+      -1.51163157670921568627450980392156862745098e10F,
+      +4.29614643061166666666666666666666666666667e11F,
+      -1.37116552050883327721590879485616327721591e13F,
+      +4.88332318973593166666666666666666666666667e14F,
+      -1.92965793419400681486326681448632668144863e16F,
+      +8.41693047573682615000553709856035437430786e17F,
+      -4.03380718540594554130768115942028985507246e19F,
+      +2.11507486380819916056014539007092198581560e21F,
+      -1.20866265222965259346027311937082525317819e23F,
+      +7.50086674607696436685572007575757575757576e24F,
+      -5.03877810148106891413789303052201257861635e26F,
+      +3.65287764848181233351104308429711779448622e28F,
+      -2.84987693024508822262691464329106781609195e30F,
+      +2.38654274996836276446459819192192149717514e32F,
+      -2.13999492572253336658107447651910973926742e34F,
+      +2.05009757234780975699217330956723102516667e36F,
+      -2.09380059113463784090951852900279701847092e38F,
+   }};
+
+   return bernoulli_data[n];
+}
+
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<2>& )
+{
+   static const boost::array<double, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000,
+      +0.166666666666666666666666666666666666666667,
+      -0.0333333333333333333333333333333333333333333,
+      +0.0238095238095238095238095238095238095238095,
+      -0.0333333333333333333333333333333333333333333,
+      +0.0757575757575757575757575757575757575757576,
+      -0.253113553113553113553113553113553113553114,
+      +1.16666666666666666666666666666666666666667,
+      -7.09215686274509803921568627450980392156863,
+      +54.9711779448621553884711779448621553884712,
+      -529.124242424242424242424242424242424242424,
+      +6192.12318840579710144927536231884057971014,
+      -86580.2531135531135531135531135531135531136,
+      +1.42551716666666666666666666666666666666667e6,
+      -2.72982310678160919540229885057471264367816e7,
+      +6.01580873900642368384303868174835916771401e8,
+      -1.51163157670921568627450980392156862745098e10,
+      +4.29614643061166666666666666666666666666667e11,
+      -1.37116552050883327721590879485616327721591e13,
+      +4.88332318973593166666666666666666666666667e14,
+      -1.92965793419400681486326681448632668144863e16,
+      +8.41693047573682615000553709856035437430786e17,
+      -4.03380718540594554130768115942028985507246e19,
+      +2.11507486380819916056014539007092198581560e21,
+      -1.20866265222965259346027311937082525317819e23,
+      +7.50086674607696436685572007575757575757576e24,
+      -5.03877810148106891413789303052201257861635e26,
+      +3.65287764848181233351104308429711779448622e28,
+      -2.84987693024508822262691464329106781609195e30,
+      +2.38654274996836276446459819192192149717514e32,
+      -2.13999492572253336658107447651910973926742e34,
+      +2.05009757234780975699217330956723102516667e36,
+      -2.09380059113463784090951852900279701847092e38,
+      +2.27526964884635155596492603527692645814700e40,
+      -2.62577102862395760473030497361582020814490e42,
+      +3.21250821027180325182047923042649852435219e44,
+      -4.15982781667947109139170744952623589366896e46,
+      +5.69206954820352800238834562191210586444805e48,
+      -8.21836294197845756922906534686173330145509e50,
+      +1.25029043271669930167323398297028955241772e53,
+      -2.00155832332483702749253291988132987687242e55,
+      +3.36749829153643742333966769033387530162196e57,
+      -5.94709705031354477186604968440515408405791e59,
+      +1.10119103236279775595641307904376916046305e62,
+      -2.13552595452535011886583850190410656789733e64,
+      +4.33288969866411924196166130593792062184514e66,
+      -9.18855282416693282262005552155018971389604e68,
+      +2.03468967763290744934550279902200200659751e71,
+      -4.70038339580357310785752555350060606545967e73,
+      +1.13180434454842492706751862577339342678904e76,
+      -2.83822495706937069592641563364817647382847e78,
+      +7.40642489796788506297508271409209841768797e80,
+      -2.00964548027566044834656196727153631868673e83,
+      +5.66571700508059414457193460305193569614195e85,
+      -1.65845111541362169158237133743199123014950e88,
+      +5.03688599504923774192894219151801548124424e90,
+      -1.58614682376581863693634015729664387827410e93,
+      +5.17567436175456269840732406825071225612408e95,
+      -1.74889218402171173396900258776181591451415e98,
+      +6.11605199949521852558245252642641677807677e100,
+      -2.21227769127078349422883234567129324455732e103,
+      +8.27227767987709698542210624599845957312047e105,
+      -3.19589251114157095835916343691808148735263e108,
+      +1.27500822233877929823100243029266798669572e111,
+      -5.25009230867741338994028246245651754469199e113,
+      +2.23018178942416252098692981988387281437383e116,
+      -9.76845219309552044386335133989802393011669e118,
+      +4.40983619784529542722726228748131691918758e121,
+      -2.05085708864640888397293377275830154864566e124,
+      +9.82144332797912771075729696020975210414919e126,
+      -4.84126007982088805087891967099634127611305e129,
+      +2.45530888014809826097834674040886903996737e132,
+      -1.28069268040847475487825132786017857218118e135,
+      +6.86761671046685811921018885984644004360924e137,
+      -3.78464685819691046949789954163795568144895e140,
+      +2.14261012506652915508713231351482720966602e143,
+      -1.24567271371836950070196429616376072194583e146,
+      +7.43457875510001525436796683940520613117807e148,
+      -4.55357953046417048940633332233212748767721e151,
+      +2.86121128168588683453638472510172325229190e154,
+      -1.84377235520338697276882026536287854875414e157,
+      +1.21811545362210466995013165065995213558174e160,
+      -8.24821871853141215484818457296893447301419e162,
+      +5.72258779378329433296516498142978615918685e165,
+      -4.06685305250591047267679693831158655602196e168,
+      +2.95960920646420500628752695815851870426379e171,
+      -2.20495225651894575090311752273445984836379e174,
+      +1.68125970728895998058311525151360665754464e177,
+      -1.31167362135569576486452806355817153004431e180,
+      +1.04678940094780380821832853929823089643829e183,
+      -8.54328935788337077185982546299082774593270e185,
+      +7.12878213224865423522884066771438224721245e188,
+      -6.08029314555358993000847118686477458461988e191,
+      +5.29967764248499239300942910043247266228490e194,
+      -4.71942591687458626443646229013379911103761e197,
+      +4.29284137914029810894168296541074669045521e200,
+      -3.98767449682322074434477655542938795106651e203,
+      +3.78197804193588827138944181161393327898220e206,
+      -3.66142336836811912436858082151197348755196e209,
+      +3.61760902723728623488554609298914089477541e212,
+      -3.64707726451913543621383088655499449048682e215,
+      +3.75087554364544090983452410104814189306842e218,
+      -3.93458672964390282694891288533713429355657e221,
+      +4.20882111481900820046571171111494898242731e224,
+      -4.59022962206179186559802940573325591059371e227,
+      +5.10317257726295759279198185106496768539760e230,
+      -5.78227623036569554015377271242917142512200e233,
+      +6.67624821678358810322637794412809363451080e236,
+      -7.85353076444504163225916259639312444428230e239,
+      +9.41068940670587255245443288258762485293948e242,
+      -1.14849338734651839938498599206805592548354e246,
+      +1.42729587428487856771416320087122499897180e249,
+      -1.80595595869093090142285728117654560926719e252,
+      +2.32615353076608052161297985184708876161736e255,
+      -3.04957517154995947681942819261542593785327e258,
+      +4.06858060764339734424012124124937318633684e261,
+      -5.52310313219743616252320044093186392324280e264,
+      +7.62772793964343924869949690204961215533859e267,
+      -1.07155711196978863132793524001065396932667e271,
+      +1.53102008959691884453440916153355334355847e274,
+      -2.22448916821798346676602348865048510824835e277,
+      +3.28626791906901391668189736436895275365183e280,
+      -4.93559289559603449020711938191575963496999e283,
+      +7.53495712008325067212266049779283956727824e286,
+      -1.16914851545841777278088924731655041783900e290,
+      +1.84352614678389394126646201597702232396492e293,
+      -2.95368261729680829728014917350525183485207e296,
+      +4.80793212775015697668878704043264072227967e299,
+      -7.95021250458852528538243631671158693036798e302,
+      +1.33527841873546338750122832017820518292039e306
+   }};
+
+   return bernoulli_data[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<3>& )
+{
+   static const boost::array<long double, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000L,
+      +0.166666666666666666666666666666666666666667L,
+      -0.0333333333333333333333333333333333333333333L,
+      +0.0238095238095238095238095238095238095238095L,
+      -0.0333333333333333333333333333333333333333333L,
+      +0.0757575757575757575757575757575757575757576L,
+      -0.253113553113553113553113553113553113553114L,
+      +1.16666666666666666666666666666666666666667L,
+      -7.09215686274509803921568627450980392156863L,
+      +54.9711779448621553884711779448621553884712L,
+      -529.124242424242424242424242424242424242424L,
+      +6192.12318840579710144927536231884057971014L,
+      -86580.2531135531135531135531135531135531136L,
+      +1.42551716666666666666666666666666666666667E6L,
+      -2.72982310678160919540229885057471264367816E7L,
+      +6.01580873900642368384303868174835916771401E8L,
+      -1.51163157670921568627450980392156862745098E10L,
+      +4.29614643061166666666666666666666666666667E11L,
+      -1.37116552050883327721590879485616327721591E13L,
+      +4.88332318973593166666666666666666666666667E14L,
+      -1.92965793419400681486326681448632668144863E16L,
+      +8.41693047573682615000553709856035437430786E17L,
+      -4.03380718540594554130768115942028985507246E19L,
+      +2.11507486380819916056014539007092198581560E21L,
+      -1.20866265222965259346027311937082525317819E23L,
+      +7.50086674607696436685572007575757575757576E24L,
+      -5.03877810148106891413789303052201257861635E26L,
+      +3.65287764848181233351104308429711779448622E28L,
+      -2.84987693024508822262691464329106781609195E30L,
+      +2.38654274996836276446459819192192149717514E32L,
+      -2.13999492572253336658107447651910973926742E34L,
+      +2.05009757234780975699217330956723102516667E36L,
+      -2.09380059113463784090951852900279701847092E38L,
+      +2.27526964884635155596492603527692645814700E40L,
+      -2.62577102862395760473030497361582020814490E42L,
+      +3.21250821027180325182047923042649852435219E44L,
+      -4.15982781667947109139170744952623589366896E46L,
+      +5.69206954820352800238834562191210586444805E48L,
+      -8.21836294197845756922906534686173330145509E50L,
+      +1.25029043271669930167323398297028955241772E53L,
+      -2.00155832332483702749253291988132987687242E55L,
+      +3.36749829153643742333966769033387530162196E57L,
+      -5.94709705031354477186604968440515408405791E59L,
+      +1.10119103236279775595641307904376916046305E62L,
+      -2.13552595452535011886583850190410656789733E64L,
+      +4.33288969866411924196166130593792062184514E66L,
+      -9.18855282416693282262005552155018971389604E68L,
+      +2.03468967763290744934550279902200200659751E71L,
+      -4.70038339580357310785752555350060606545967E73L,
+      +1.13180434454842492706751862577339342678904E76L,
+      -2.83822495706937069592641563364817647382847E78L,
+      +7.40642489796788506297508271409209841768797E80L,
+      -2.00964548027566044834656196727153631868673E83L,
+      +5.66571700508059414457193460305193569614195E85L,
+      -1.65845111541362169158237133743199123014950E88L,
+      +5.03688599504923774192894219151801548124424E90L,
+      -1.58614682376581863693634015729664387827410E93L,
+      +5.17567436175456269840732406825071225612408E95L,
+      -1.74889218402171173396900258776181591451415E98L,
+      +6.11605199949521852558245252642641677807677E100L,
+      -2.21227769127078349422883234567129324455732E103L,
+      +8.27227767987709698542210624599845957312047E105L,
+      -3.19589251114157095835916343691808148735263E108L,
+      +1.27500822233877929823100243029266798669572E111L,
+      -5.25009230867741338994028246245651754469199E113L,
+      +2.23018178942416252098692981988387281437383E116L,
+      -9.76845219309552044386335133989802393011669E118L,
+      +4.40983619784529542722726228748131691918758E121L,
+      -2.05085708864640888397293377275830154864566E124L,
+      +9.82144332797912771075729696020975210414919E126L,
+      -4.84126007982088805087891967099634127611305E129L,
+      +2.45530888014809826097834674040886903996737E132L,
+      -1.28069268040847475487825132786017857218118E135L,
+      +6.86761671046685811921018885984644004360924E137L,
+      -3.78464685819691046949789954163795568144895E140L,
+      +2.14261012506652915508713231351482720966602E143L,
+      -1.24567271371836950070196429616376072194583E146L,
+      +7.43457875510001525436796683940520613117807E148L,
+      -4.55357953046417048940633332233212748767721E151L,
+      +2.86121128168588683453638472510172325229190E154L,
+      -1.84377235520338697276882026536287854875414E157L,
+      +1.21811545362210466995013165065995213558174E160L,
+      -8.24821871853141215484818457296893447301419E162L,
+      +5.72258779378329433296516498142978615918685E165L,
+      -4.06685305250591047267679693831158655602196E168L,
+      +2.95960920646420500628752695815851870426379E171L,
+      -2.20495225651894575090311752273445984836379E174L,
+      +1.68125970728895998058311525151360665754464E177L,
+      -1.31167362135569576486452806355817153004431E180L,
+      +1.04678940094780380821832853929823089643829E183L,
+      -8.54328935788337077185982546299082774593270E185L,
+      +7.12878213224865423522884066771438224721245E188L,
+      -6.08029314555358993000847118686477458461988E191L,
+      +5.29967764248499239300942910043247266228490E194L,
+      -4.71942591687458626443646229013379911103761E197L,
+      +4.29284137914029810894168296541074669045521E200L,
+      -3.98767449682322074434477655542938795106651E203L,
+      +3.78197804193588827138944181161393327898220E206L,
+      -3.66142336836811912436858082151197348755196E209L,
+      +3.61760902723728623488554609298914089477541E212L,
+      -3.64707726451913543621383088655499449048682E215L,
+      +3.75087554364544090983452410104814189306842E218L,
+      -3.93458672964390282694891288533713429355657E221L,
+      +4.20882111481900820046571171111494898242731E224L,
+      -4.59022962206179186559802940573325591059371E227L,
+      +5.10317257726295759279198185106496768539760E230L,
+      -5.78227623036569554015377271242917142512200E233L,
+      +6.67624821678358810322637794412809363451080E236L,
+      -7.85353076444504163225916259639312444428230E239L,
+      +9.41068940670587255245443288258762485293948E242L,
+      -1.14849338734651839938498599206805592548354E246L,
+      +1.42729587428487856771416320087122499897180E249L,
+      -1.80595595869093090142285728117654560926719E252L,
+      +2.32615353076608052161297985184708876161736E255L,
+      -3.04957517154995947681942819261542593785327E258L,
+      +4.06858060764339734424012124124937318633684E261L,
+      -5.52310313219743616252320044093186392324280E264L,
+      +7.62772793964343924869949690204961215533859E267L,
+      -1.07155711196978863132793524001065396932667E271L,
+      +1.53102008959691884453440916153355334355847E274L,
+      -2.22448916821798346676602348865048510824835E277L,
+      +3.28626791906901391668189736436895275365183E280L,
+      -4.93559289559603449020711938191575963496999E283L,
+      +7.53495712008325067212266049779283956727824E286L,
+      -1.16914851545841777278088924731655041783900E290L,
+      +1.84352614678389394126646201597702232396492E293L,
+      -2.95368261729680829728014917350525183485207E296L,
+      +4.80793212775015697668878704043264072227967E299L,
+      -7.95021250458852528538243631671158693036798E302L,
+      +1.33527841873546338750122832017820518292039E306L,
+#if LDBL_MAX_EXP == 16384
+      // Entries 260 - 600 http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C258%2C600%2C2}]
+      -2.277640649601959593875058983506938037019e309L, 
+      3.945184036046326234163525556422667595884e312L, 
+      -6.938525772130602106071724989641405550473e315L, 
+      1.238896367577564823729057820219210929986e319L, 
+      -2.245542599169309759499987966025604480745e322L, 
+      4.131213176073842359732511639489669404266e325L, 
+      -7.713581346815269584960928069762882771369e328L, 
+      1.461536066837669600638613788471335541313e332L, 
+      -2.809904606225532896862935642992712059631e335L, 
+      5.480957121318876639512096994413992284327e338L, 
+      -1.084573284087686110518125291186079616320e342L, 
+      2.176980775647663539729165173863716459962e345L, 
+      -4.431998786117553751947439433256752608068e348L, 
+      9.150625657715535047417756278073770096073e351L, 
+      -1.915867353003157351316577579148683133613e355L, 
+      4.067256303542212258698836003682016040629e358L, 
+      -8.754223791037736616228150209910348734629e361L, 
+      1.910173688735533667244373747124109379826e365L, 
+      -4.225001320265091714631115064713174404607e368L, 
+      9.471959352547827678466770796787503034505e371L, 
+      -2.152149973279986829719817376756088198573e375L, 
+      4.955485775334221051344839716507812871361e378L, 
+      -1.156225941759134696630956889716381968142e382L, 
+      2.733406597646137698610991926705098514017e385L, 
+      -6.546868135325176947099912523279938546333e388L, 
+      1.588524912441221472814692121069821695547e392L, 
+      -3.904354800861715180218598151050191841308e395L, 
+      9.719938686092045781827273411668132975319e398L, 
+      -2.450763621049522051234479737511375679283e402L, 
+      6.257892098396815305085674126334317095277e405L, 
+      -1.618113552083806592527989531636955084420e409L, 
+      4.236528795217618357348618613216833722648e412L, 
+      -1.123047068199051008086174989124136878992e416L, 
+      3.013971787525654770217283559392286666886e419L, 
+      -8.188437573221553030375681429202969070420e422L, 
+      2.251910591336716809153958146725775718707e426L, 
+      -6.268411292043789823075314151509139413399e429L, 
+      1.765990845202322642693572112511312471527e433L, 
+      -5.035154436231331651259071296731160882240e436L, 
+      1.452779356460483245253765356664402207266e440L, 
+      -4.241490890130137339052414960684151515166e443L, 
+      1.252966001692427774088293833338841893293e447L, 
+      -3.744830047478272947978103227876747240343e450L, 
+      1.132315806695710930595876001089232216024e454L, 
+      -3.463510845942701805991786197773934662578e457L, 
+      1.071643382649675572086865465873916611537e461L, 
+      -3.353824475439933688957233489984711465335e464L, 
+      1.061594257145875875963152734129803268488e468L, 
+      -3.398420969215528955528654193586189805265e471L, 
+      1.100192502000434096206138068020551065890e475L, 
+      -3.601686379213993374332690210094863486472e478L, 
+      1.192235170430164900533187239994513019475e482L, 
+      -3.990342751779668381699052942504119409180e485L, 
+      1.350281800938769780891258894167663309221e489L, 
+      -4.619325443466054312873093650888507562249e492L, 
+      1.597522243968586548227514639959727696694e496L, 
+      -5.584753729092155108530929002119620487652e499L, 
+      1.973443623104646193229794524759543752089e503L, 
+      -7.048295441989615807045620880311201930244e506L, 
+      2.544236702499719094591873151590280263560e510L, 
+      -9.281551595258615205927443367289948150345e513L, 
+      3.421757163154453657766296828520235351572e517L, 
+      -1.274733639384538364282697627345068947433e521L, 
+      4.798524805311016034711205886780460173566e524L, 
+      -1.825116948422858388787806917284878870034e528L, 
+      7.013667442807288452441777981425055613982e531L, 
+      -2.723003862685989740898815670978399383114e535L, 
+      1.068014853917260290630122222858884658850e539L, 
+      -4.231650952273697842269381683768681118533e542L, 
+      1.693650052202594386658903598564772900388e546L, 
+      -6.846944855806453360616258582310883597678e549L, 
+      2.795809132238082267120232174243715559601e553L, 
+      -1.153012972808983269106716828311318981951e557L, 
+      4.802368854268746357511997492039592697149e560L, 
+      -2.019995255271910836389761734035403905781e564L, 
+      8.580207235032617856059250643095019760968e567L, 
+      -3.680247942263468164408192134916355198549e571L, 
+      1.593924457586765331397457407661306895942e575L, 
+      -6.970267175232643679233530367569943057501e578L, 
+      3.077528087427698518703282907890556154309e582L, 
+      -1.371846760052887888926055417297342106614e586L, 
+      6.173627360829553396851763207025505289166e589L, 
+      -2.804703130495506384463249394043486916669e593L, 
+      1.286250900087150126167490951216207186092e597L, 
+      -5.954394420063617872366818601092036543220e600L, 
+      2.782297785278756426177542270854984091406e604L, 
+      -1.312214674935307746141207680066262384215e608L, 
+      6.246299145383554153167974732783934504370e611L, 
+      -3.000812007679574430883792565577444226490e615L, 
+      1.454904877136007844493861746476079537075e619L, 
+      -7.118558521873800304612781121044077357278e622L, 
+      3.514739820897817389472822276832677887997e626L, 
+      -1.751137068816377401163011262831890828437e630L, 
+      8.803498091818800678575314081978951179602e633L, 
+      -4.465612911700593572269200981612564161010e637L, 
+      2.285494565287530681465757798517033542888e641L, 
+      -1.180145168917737098025683613598595411329e645L, 
+      6.147941849198393232663105284575149616925e648L, 
+      -3.231069156963603593233679426198974663352e652L, 
+      1.713042725635435041806895849197608270935e656L, 
+      -9.161761363270648920537613435771882898051e659L, 
+      4.942675965960539112005679080810117766825e663L, 
+      -2.689684712697383518131267222872386600031e667L, 
+      1.476320014229917759615308193449511534656e671L, 
+      -8.173037740864781506597184122049453514594e674L, 
+      4.563462313190521363235182420178784459580e678L, 
+      -2.569790015236158475703055501886439298708e682L, 
+      1.459410219452119981958355737832022375085e686L, 
+      -8.358304882556983795372406183642486436653e689L, 
+      4.827305091483557818593092377664570208355e693L, 
+      -2.811394311081493166793414157061950132403e697L, 
+      1.651026863340675349245561261339568827739e701L, 
+      -9.776578579336866764167878646459810047899e704L, 
+      5.837207965197521880181236529616560780535e708L, 
+      -3.513938957938032127105389702846371181520e712L, 
+      2.132747371360190507595748444536911078788e716L, 
+      -1.305047363239192640729466563372665311602e720L, 
+      8.050825342678337497636292798039996484780e723L, 
+      -5.006884161223862543665524155681082112689e727L, 
+      3.139016066011452177570812014513491361235e731L, 
+      -1.983829535212711378291469356666001365873e735L, 
+      1.263822427649676371257598052486237628698e739L, 
+      -8.115678659900522918802121684491754629503e742L, 
+      5.252995164972075271667364371449050412435e746L, 
+      -3.427038125662404660056511738625477058135e750L, 
+      2.253446011834352733279946306835940729858e754L, 
+      -1.493407341897034717876962786798831719683e758L, 
+      9.974681322653365118752729509398728354442e761L, 
+      -6.714230142773850863927710112350816379426e765L, 
+      4.554668668931723346600337564274944733530e769L, 
+      -3.113635386023220127834102980385275379533e773L, 
+      2.144945411287666204679363498162954050208e777L, 
+      -1.488982121181387164932397544378555256016e781L, 
+      1.041537218854627455352298173588983048748e785L, 
+      -7.341073881786613676177562822942175683993e788L, 
+      5.213524272587199574980117351016322518428e792L, 
+      -3.730592531776514409283897139216167197989e796L, 
+      2.689592876341877079083449497724049500175e800L, 
+      -1.953643788231947582529884602972233135002e804L, 
+      1.429691073080500563348668321308878246277e808L, 
+      -1.054059177095488639836063073070536825675e812L, 
+      7.828919160938693948399336431565350676613e815L, 
+      -5.857884457184396382550955498026762014753e819L, 
+      4.415401588264172474136969345712659422380e823L, 
+      -3.352573884181287635796498822858109969161e827L, 
+      2.564210385719224000156548240934108974447e831L, 
+      -1.975534392116037602837941409848663077528e835L, 
+      1.533062123975940045180943006948008486466e839L, 
+      -1.198306160488763291730059994812781226903e843L, 
+      9.434034267770711698676321369174735725321e846L, 
+      -7.480619200038505368468483892246806488879e850L, 
+      5.974161898439971564124576801455052907638e854L, 
+      -4.805125663714699771668630995361572639386e858L, 
+      3.892332138028039952403812726744593073776e862L, 
+      -3.175276505779699340738548328810180869575e866L, 
+      2.608608681939322393581069188271626122519e870L, 
+      -2.158148554392732439392868052394994052628e874L, 
+      1.797993483301448477700600221980862686033e878L, 
+      -1.508407575089108597171576068862286462909e882L, 
+      1.274273406242459482708930389008701147244e886L, 
+      -1.083950475353171986748233157909397370193e890L, 
+      9.284292630726328432038470356821265395331e893L, 
+      -8.007012115449516364480417355063446317414e897L, 
+      6.952871948429568933888979915833266241471e901L, 
+      -6.078828929473797621198666799700739891205e905L, 
+      5.350908089710964244671334224708057812633e909L, 
+      -4.742168072503284973969982758434401589090e913L, 
+      4.231149239401967697257534662010605751136e917L, 
+      -3.800684612827828851942743291026898158947e921L, 
+      3.436984796314246158361599955909956583986e925L, 
+      -3.128930718993658356398482705317381808301e929L,
+      //
+      // 602-1300: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C602%2C1300%2C2}]
+      2.867524740577223817164663595437919813239e933L, -2.645462974939090580963101220449509725942e937L, 2.456800827789169780295419018499543141869e941L, -2.296690549725790064673528302231294870532e945L, 2.161174697699793265715182091764676666457e949L, -2.047023224586087259305754002882269123194e953L, 1.951604806042481282712736234132803700277e957L, -1.872785206668284042110390583158639495143e961L, 1.808847160923282257302788929692654262867e965L, -1.758427529634609613399327744595257497188e969L, 1 [...]
+      //
+      // 1302-1600: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1302%2C1600%2C2}]
+      6.300146502435743791500010801885493871234e2452L, -2.711520667146768856688291798851999580833e2457L, 1.170595555513900137297344452318266434006e2462L, -5.069095411973246242900074508988493530542e2466L, 2.201819284807954055092117706033113168896e2471L, -9.593088725189386197503123561368325167085e2475L, 4.192362385909155628936230811010649614060e2480L, -1.837725836941968309866675158105812946762e2485L, 8.080201101491972605313807752565294881374e2489L, -3.56353607552721570296639254378403953924 [...]
+      //
+      // 1602-1900: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1602%2C1900%2C2}]
+      5.596396533621874175909933615343145642161e3161L, -3.644908483469388437457938883454376864180e3166L, 2.379838409026860469990569665632800095988e3171L, -1.557720925267669865362152155022069166772e3176L, 1.022143420270029721682551084917730373739e3181L, -6.723767358891570842116651998814252095792e3185L, 4.433950491570308179905446963723780229747e3190L, -2.931196854668917448553150023532223509373e3195L, 1.942557068752664549549945921392100172355e3200L, -1.29055320297862278689126555810623506869 [...]
+      //
+      // 1902-2200: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1902%2C2200%2C2}]
+      1.705787724951999960095629912416210969679e3895L, -1.565564556110550991891247404758895970376e3900L, 1.439889351869832939488618785632174464789e3905L, -1.327084102784257406218693901793045990520e3910L, 1.225682557296027075027021534960026145706e3915L, -1.134401635488994148555787301654561211982e3920L, 1.052116934052356802920509999705307165985e3925L, -9.778417073593082219082361206542342793584e3929L, 9.107088061888562704837019028349522303725e3934L, -8.49955136463310213847124615598005693612 [...]
+      //
+      // 2202-2320: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C2202%2C2320%2C2}]
+      2.222043594325228980916360265527780300093e4649L, -2.732869701246338361699515268224049951411e4654L, 3.367233945421922463553518272642397177145e4659L, -4.156377225041273602431272489314020150392e4664L, 5.139764368092890466235162431795350591151e4669L, -6.367329693760865476879589228002216011370e4674L, 7.902356742934106007362514378717026407839e4679L, -9.825176966314431712897976595483070301406e4684L, 1.223792760178593282435724837135946867088e4690L, -1.52706815145275040485314081520747755519 [...]
+#endif
+   }};
+
+   return bernoulli_data[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<4>& )
+{
+   //
+   // Special case added for multiprecision types that have no conversion from long long,
+   // there are very few such types, but mpfr_class is one.
+   //
+   static const boost::array<boost::int32_t, 1 + max_bernoulli_b2n<T>::value> numerators =
+   {{
+      boost::int32_t(            +1LL),
+      boost::int32_t(            +1LL),
+      boost::int32_t(            -1LL),
+      boost::int32_t(            +1LL),
+      boost::int32_t(            -1LL),
+      boost::int32_t(            +5LL),
+      boost::int32_t(          -691LL),
+      boost::int32_t(            +7LL),
+      boost::int32_t(         -3617LL),
+      boost::int32_t(        +43867LL),
+      boost::int32_t(       -174611LL),
+      boost::int32_t(       +854513LL),
+   }};
+
+   static const boost::array<boost::int32_t, 1 + max_bernoulli_b2n<T>::value> denominators =
+   {{
+      boost::int32_t(      1LL),
+      boost::int32_t(      6LL),
+      boost::int32_t(     30LL),
+      boost::int32_t(     42LL),
+      boost::int32_t(     30LL),
+      boost::int32_t(     66LL),
+      boost::int32_t(   2730LL),
+      boost::int32_t(      6LL),
+      boost::int32_t(    510LL),
+      boost::int32_t(    798LL),
+      boost::int32_t(    330LL),
+      boost::int32_t(    138LL),
+   }};
+   return T(numerators[n]) / T(denominators[n]);
+}
+
+} // namespace detail
+
+template<class T>
+inline T unchecked_bernoulli_b2n(const std::size_t n)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+
+   return detail::unchecked_bernoulli_imp<T>(n, tag_type());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_UNCHECKED_BERNOULLI_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_factorial.hpp b/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_factorial.hpp
new file mode 100644
index 0000000..3c23d6e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/detail/unchecked_factorial.hpp
@@ -0,0 +1,625 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SP_UC_FACTORIALS_HPP
+#define BOOST_MATH_SP_UC_FACTORIALS_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/array.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push) // Temporary until lexical cast fixed.
+#pragma warning(disable: 4127 4701)
+#endif
+#ifndef BOOST_MATH_NO_LEXICAL_CAST
+#include <boost/lexical_cast.hpp>
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+
+namespace boost { namespace math
+{
+// Forward declarations:
+template <class T>
+struct max_factorial;
+
+// Definitions:
+template <>
+inline float unchecked_factorial<float>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(float))
+{
+   static const boost::array<float, 35> factorials = {{
+      1.0F,
+      1.0F,
+      2.0F,
+      6.0F,
+      24.0F,
+      120.0F,
+      720.0F,
+      5040.0F,
+      40320.0F,
+      362880.0F,
+      3628800.0F,
+      39916800.0F,
+      479001600.0F,
+      6227020800.0F,
+      87178291200.0F,
+      1307674368000.0F,
+      20922789888000.0F,
+      355687428096000.0F,
+      6402373705728000.0F,
+      121645100408832000.0F,
+      0.243290200817664e19F,
+      0.5109094217170944e20F,
+      0.112400072777760768e22F,
+      0.2585201673888497664e23F,
+      0.62044840173323943936e24F,
+      0.15511210043330985984e26F,
+      0.403291461126605635584e27F,
+      0.10888869450418352160768e29F,
+      0.304888344611713860501504e30F,
+      0.8841761993739701954543616e31F,
+      0.26525285981219105863630848e33F,
+      0.822283865417792281772556288e34F,
+      0.26313083693369353016721801216e36F,
+      0.868331761881188649551819440128e37F,
+      0.29523279903960414084761860964352e39F,
+   }};
+
+   return factorials[i];
+}
+
+template <>
+struct max_factorial<float>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 34);
+};
+
+
+template <>
+inline long double unchecked_factorial<long double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(long double))
+{
+   static const boost::array<long double, 171> factorials = {{
+      1L,
+      1L,
+      2L,
+      6L,
+      24L,
+      120L,
+      720L,
+      5040L,
+      40320L,
+      362880.0L,
+      3628800.0L,
+      39916800.0L,
+      479001600.0L,
+      6227020800.0L,
+      87178291200.0L,
+      1307674368000.0L,
+      20922789888000.0L,
+      355687428096000.0L,
+      6402373705728000.0L,
+      121645100408832000.0L,
+      0.243290200817664e19L,
+      0.5109094217170944e20L,
+      0.112400072777760768e22L,
+      0.2585201673888497664e23L,
+      0.62044840173323943936e24L,
+      0.15511210043330985984e26L,
+      0.403291461126605635584e27L,
+      0.10888869450418352160768e29L,
+      0.304888344611713860501504e30L,
+      0.8841761993739701954543616e31L,
+      0.26525285981219105863630848e33L,
+      0.822283865417792281772556288e34L,
+      0.26313083693369353016721801216e36L,
+      0.868331761881188649551819440128e37L,
+      0.29523279903960414084761860964352e39L,
+      0.103331479663861449296666513375232e41L,
+      0.3719933267899012174679994481508352e42L,
+      0.137637530912263450463159795815809024e44L,
+      0.5230226174666011117600072241000742912e45L,
+      0.203978820811974433586402817399028973568e47L,
+      0.815915283247897734345611269596115894272e48L,
+      0.3345252661316380710817006205344075166515e50L,
+      0.1405006117752879898543142606244511569936e52L,
+      0.6041526306337383563735513206851399750726e53L,
+      0.265827157478844876804362581101461589032e55L,
+      0.1196222208654801945619631614956577150644e57L,
+      0.5502622159812088949850305428800254892962e58L,
+      0.2586232415111681806429643551536119799692e60L,
+      0.1241391559253607267086228904737337503852e62L,
+      0.6082818640342675608722521633212953768876e63L,
+      0.3041409320171337804361260816606476884438e65L,
+      0.1551118753287382280224243016469303211063e67L,
+      0.8065817517094387857166063685640376697529e68L,
+      0.427488328406002556429801375338939964969e70L,
+      0.2308436973392413804720927426830275810833e72L,
+      0.1269640335365827592596510084756651695958e74L,
+      0.7109985878048634518540456474637249497365e75L,
+      0.4052691950487721675568060190543232213498e77L,
+      0.2350561331282878571829474910515074683829e79L,
+      0.1386831185456898357379390197203894063459e81L,
+      0.8320987112741390144276341183223364380754e82L,
+      0.507580213877224798800856812176625227226e84L,
+      0.3146997326038793752565312235495076408801e86L,
+      0.1982608315404440064116146708361898137545e88L,
+      0.1268869321858841641034333893351614808029e90L,
+      0.8247650592082470666723170306785496252186e91L,
+      0.5443449390774430640037292402478427526443e93L,
+      0.3647111091818868528824985909660546442717e95L,
+      0.2480035542436830599600990418569171581047e97L,
+      0.1711224524281413113724683388812728390923e99L,
+      0.1197857166996989179607278372168909873646e101L,
+      0.8504785885678623175211676442399260102886e102L,
+      0.6123445837688608686152407038527467274078e104L,
+      0.4470115461512684340891257138125051110077e106L,
+      0.3307885441519386412259530282212537821457e108L,
+      0.2480914081139539809194647711659403366093e110L,
+      0.188549470166605025498793226086114655823e112L,
+      0.1451830920282858696340707840863082849837e114L,
+      0.1132428117820629783145752115873204622873e116L,
+      0.8946182130782975286851441715398316520698e117L,
+      0.7156945704626380229481153372318653216558e119L,
+      0.5797126020747367985879734231578109105412e121L,
+      0.4753643337012841748421382069894049466438e123L,
+      0.3945523969720658651189747118012061057144e125L,
+      0.3314240134565353266999387579130131288001e127L,
+      0.2817104114380550276949479442260611594801e129L,
+      0.2422709538367273238176552320344125971528e131L,
+      0.210775729837952771721360051869938959523e133L,
+      0.1854826422573984391147968456455462843802e135L,
+      0.1650795516090846108121691926245361930984e137L,
+      0.1485715964481761497309522733620825737886e139L,
+      0.1352001527678402962551665687594951421476e141L,
+      0.1243841405464130725547532432587355307758e143L,
+      0.1156772507081641574759205162306240436215e145L,
+      0.1087366156656743080273652852567866010042e147L,
+      0.103299784882390592625997020993947270954e149L,
+      0.9916779348709496892095714015418938011582e150L,
+      0.9619275968248211985332842594956369871234e152L,
+      0.942689044888324774562618574305724247381e154L,
+      0.9332621544394415268169923885626670049072e156L,
+      0.9332621544394415268169923885626670049072e158L,
+      0.9425947759838359420851623124482936749562e160L,
+      0.9614466715035126609268655586972595484554e162L,
+      0.990290071648618040754671525458177334909e164L,
+      0.1029901674514562762384858386476504428305e167L,
+      0.1081396758240290900504101305800329649721e169L,
+      0.1146280563734708354534347384148349428704e171L,
+      0.1226520203196137939351751701038733888713e173L,
+      0.132464181945182897449989183712183259981e175L,
+      0.1443859583202493582204882102462797533793e177L,
+      0.1588245541522742940425370312709077287172e179L,
+      0.1762952551090244663872161047107075788761e181L,
+      0.1974506857221074023536820372759924883413e183L,
+      0.2231192748659813646596607021218715118256e185L,
+      0.2543559733472187557120132004189335234812e187L,
+      0.2925093693493015690688151804817735520034e189L,
+      0.339310868445189820119825609358857320324e191L,
+      0.396993716080872089540195962949863064779e193L,
+      0.4684525849754290656574312362808384164393e195L,
+      0.5574585761207605881323431711741977155627e197L,
+      0.6689502913449127057588118054090372586753e199L,
+      0.8094298525273443739681622845449350829971e201L,
+      0.9875044200833601362411579871448208012564e203L,
+      0.1214630436702532967576624324188129585545e206L,
+      0.1506141741511140879795014161993280686076e208L,
+      0.1882677176888926099743767702491600857595e210L,
+      0.237217324288004688567714730513941708057e212L,
+      0.3012660018457659544809977077527059692324e214L,
+      0.3856204823625804217356770659234636406175e216L,
+      0.4974504222477287440390234150412680963966e218L,
+      0.6466855489220473672507304395536485253155e220L,
+      0.8471580690878820510984568758152795681634e222L,
+      0.1118248651196004307449963076076169029976e225L,
+      0.1487270706090685728908450891181304809868e227L,
+      0.1992942746161518876737324194182948445223e229L,
+      0.269047270731805048359538766214698040105e231L,
+      0.3659042881952548657689727220519893345429e233L,
+      0.5012888748274991661034926292112253883237e235L,
+      0.6917786472619488492228198283114910358867e237L,
+      0.9615723196941089004197195613529725398826e239L,
+      0.1346201247571752460587607385894161555836e242L,
+      0.1898143759076170969428526414110767793728e244L,
+      0.2695364137888162776588507508037290267094e246L,
+      0.3854370717180072770521565736493325081944e248L,
+      0.5550293832739304789551054660550388118e250L,
+      0.80479260574719919448490292577980627711e252L,
+      0.1174997204390910823947958271638517164581e255L,
+      0.1727245890454638911203498659308620231933e257L,
+      0.2556323917872865588581178015776757943262e259L,
+      0.380892263763056972698595524350736933546e261L,
+      0.571338395644585459047893286526105400319e263L,
+      0.8627209774233240431623188626544191544816e265L,
+      0.1311335885683452545606724671234717114812e268L,
+      0.2006343905095682394778288746989117185662e270L,
+      0.308976961384735088795856467036324046592e272L,
+      0.4789142901463393876335775239063022722176e274L,
+      0.7471062926282894447083809372938315446595e276L,
+      0.1172956879426414428192158071551315525115e279L,
+      0.1853271869493734796543609753051078529682e281L,
+      0.2946702272495038326504339507351214862195e283L,
+      0.4714723635992061322406943211761943779512e285L,
+      0.7590705053947218729075178570936729485014e287L,
+      0.1229694218739449434110178928491750176572e290L,
+      0.2004401576545302577599591653441552787813e292L,
+      0.3287218585534296227263330311644146572013e294L,
+      0.5423910666131588774984495014212841843822e296L,
+      0.9003691705778437366474261723593317460744e298L,
+      0.1503616514864999040201201707840084015944e301L,
+      0.2526075744973198387538018869171341146786e303L,
+      0.4269068009004705274939251888899566538069e305L,
+      0.7257415615307998967396728211129263114717e307L,
+   }};
+
+   return factorials[i];
+}
+
+template <>
+struct max_factorial<long double>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 170);
+};
+
+#ifdef BOOST_MATH_USE_FLOAT128
+
+template <>
+inline BOOST_MATH_FLOAT128_TYPE unchecked_factorial<BOOST_MATH_FLOAT128_TYPE>(unsigned i)
+{
+   static const boost::array<BOOST_MATH_FLOAT128_TYPE, 171> factorials = { {
+      1,
+      1,
+      2,
+      6,
+      24,
+      120,
+      720,
+      5040,
+      40320,
+      362880.0Q,
+      3628800.0Q,
+      39916800.0Q,
+      479001600.0Q,
+      6227020800.0Q,
+      87178291200.0Q,
+      1307674368000.0Q,
+      20922789888000.0Q,
+      355687428096000.0Q,
+      6402373705728000.0Q,
+      121645100408832000.0Q,
+      0.243290200817664e19Q,
+      0.5109094217170944e20Q,
+      0.112400072777760768e22Q,
+      0.2585201673888497664e23Q,
+      0.62044840173323943936e24Q,
+      0.15511210043330985984e26Q,
+      0.403291461126605635584e27Q,
+      0.10888869450418352160768e29Q,
+      0.304888344611713860501504e30Q,
+      0.8841761993739701954543616e31Q,
+      0.26525285981219105863630848e33Q,
+      0.822283865417792281772556288e34Q,
+      0.26313083693369353016721801216e36Q,
+      0.868331761881188649551819440128e37Q,
+      0.29523279903960414084761860964352e39Q,
+      0.103331479663861449296666513375232e41Q,
+      0.3719933267899012174679994481508352e42Q,
+      0.137637530912263450463159795815809024e44Q,
+      0.5230226174666011117600072241000742912e45Q,
+      0.203978820811974433586402817399028973568e47Q,
+      0.815915283247897734345611269596115894272e48Q,
+      0.3345252661316380710817006205344075166515e50Q,
+      0.1405006117752879898543142606244511569936e52Q,
+      0.6041526306337383563735513206851399750726e53Q,
+      0.265827157478844876804362581101461589032e55Q,
+      0.1196222208654801945619631614956577150644e57Q,
+      0.5502622159812088949850305428800254892962e58Q,
+      0.2586232415111681806429643551536119799692e60Q,
+      0.1241391559253607267086228904737337503852e62Q,
+      0.6082818640342675608722521633212953768876e63Q,
+      0.3041409320171337804361260816606476884438e65Q,
+      0.1551118753287382280224243016469303211063e67Q,
+      0.8065817517094387857166063685640376697529e68Q,
+      0.427488328406002556429801375338939964969e70Q,
+      0.2308436973392413804720927426830275810833e72Q,
+      0.1269640335365827592596510084756651695958e74Q,
+      0.7109985878048634518540456474637249497365e75Q,
+      0.4052691950487721675568060190543232213498e77Q,
+      0.2350561331282878571829474910515074683829e79Q,
+      0.1386831185456898357379390197203894063459e81Q,
+      0.8320987112741390144276341183223364380754e82Q,
+      0.507580213877224798800856812176625227226e84Q,
+      0.3146997326038793752565312235495076408801e86Q,
+      0.1982608315404440064116146708361898137545e88Q,
+      0.1268869321858841641034333893351614808029e90Q,
+      0.8247650592082470666723170306785496252186e91Q,
+      0.5443449390774430640037292402478427526443e93Q,
+      0.3647111091818868528824985909660546442717e95Q,
+      0.2480035542436830599600990418569171581047e97Q,
+      0.1711224524281413113724683388812728390923e99Q,
+      0.1197857166996989179607278372168909873646e101Q,
+      0.8504785885678623175211676442399260102886e102Q,
+      0.6123445837688608686152407038527467274078e104Q,
+      0.4470115461512684340891257138125051110077e106Q,
+      0.3307885441519386412259530282212537821457e108Q,
+      0.2480914081139539809194647711659403366093e110Q,
+      0.188549470166605025498793226086114655823e112Q,
+      0.1451830920282858696340707840863082849837e114Q,
+      0.1132428117820629783145752115873204622873e116Q,
+      0.8946182130782975286851441715398316520698e117Q,
+      0.7156945704626380229481153372318653216558e119Q,
+      0.5797126020747367985879734231578109105412e121Q,
+      0.4753643337012841748421382069894049466438e123Q,
+      0.3945523969720658651189747118012061057144e125Q,
+      0.3314240134565353266999387579130131288001e127Q,
+      0.2817104114380550276949479442260611594801e129Q,
+      0.2422709538367273238176552320344125971528e131Q,
+      0.210775729837952771721360051869938959523e133Q,
+      0.1854826422573984391147968456455462843802e135Q,
+      0.1650795516090846108121691926245361930984e137Q,
+      0.1485715964481761497309522733620825737886e139Q,
+      0.1352001527678402962551665687594951421476e141Q,
+      0.1243841405464130725547532432587355307758e143Q,
+      0.1156772507081641574759205162306240436215e145Q,
+      0.1087366156656743080273652852567866010042e147Q,
+      0.103299784882390592625997020993947270954e149Q,
+      0.9916779348709496892095714015418938011582e150Q,
+      0.9619275968248211985332842594956369871234e152Q,
+      0.942689044888324774562618574305724247381e154Q,
+      0.9332621544394415268169923885626670049072e156Q,
+      0.9332621544394415268169923885626670049072e158Q,
+      0.9425947759838359420851623124482936749562e160Q,
+      0.9614466715035126609268655586972595484554e162Q,
+      0.990290071648618040754671525458177334909e164Q,
+      0.1029901674514562762384858386476504428305e167Q,
+      0.1081396758240290900504101305800329649721e169Q,
+      0.1146280563734708354534347384148349428704e171Q,
+      0.1226520203196137939351751701038733888713e173Q,
+      0.132464181945182897449989183712183259981e175Q,
+      0.1443859583202493582204882102462797533793e177Q,
+      0.1588245541522742940425370312709077287172e179Q,
+      0.1762952551090244663872161047107075788761e181Q,
+      0.1974506857221074023536820372759924883413e183Q,
+      0.2231192748659813646596607021218715118256e185Q,
+      0.2543559733472187557120132004189335234812e187Q,
+      0.2925093693493015690688151804817735520034e189Q,
+      0.339310868445189820119825609358857320324e191Q,
+      0.396993716080872089540195962949863064779e193Q,
+      0.4684525849754290656574312362808384164393e195Q,
+      0.5574585761207605881323431711741977155627e197Q,
+      0.6689502913449127057588118054090372586753e199Q,
+      0.8094298525273443739681622845449350829971e201Q,
+      0.9875044200833601362411579871448208012564e203Q,
+      0.1214630436702532967576624324188129585545e206Q,
+      0.1506141741511140879795014161993280686076e208Q,
+      0.1882677176888926099743767702491600857595e210Q,
+      0.237217324288004688567714730513941708057e212Q,
+      0.3012660018457659544809977077527059692324e214Q,
+      0.3856204823625804217356770659234636406175e216Q,
+      0.4974504222477287440390234150412680963966e218Q,
+      0.6466855489220473672507304395536485253155e220Q,
+      0.8471580690878820510984568758152795681634e222Q,
+      0.1118248651196004307449963076076169029976e225Q,
+      0.1487270706090685728908450891181304809868e227Q,
+      0.1992942746161518876737324194182948445223e229Q,
+      0.269047270731805048359538766214698040105e231Q,
+      0.3659042881952548657689727220519893345429e233Q,
+      0.5012888748274991661034926292112253883237e235Q,
+      0.6917786472619488492228198283114910358867e237Q,
+      0.9615723196941089004197195613529725398826e239Q,
+      0.1346201247571752460587607385894161555836e242Q,
+      0.1898143759076170969428526414110767793728e244Q,
+      0.2695364137888162776588507508037290267094e246Q,
+      0.3854370717180072770521565736493325081944e248Q,
+      0.5550293832739304789551054660550388118e250Q,
+      0.80479260574719919448490292577980627711e252Q,
+      0.1174997204390910823947958271638517164581e255Q,
+      0.1727245890454638911203498659308620231933e257Q,
+      0.2556323917872865588581178015776757943262e259Q,
+      0.380892263763056972698595524350736933546e261Q,
+      0.571338395644585459047893286526105400319e263Q,
+      0.8627209774233240431623188626544191544816e265Q,
+      0.1311335885683452545606724671234717114812e268Q,
+      0.2006343905095682394778288746989117185662e270Q,
+      0.308976961384735088795856467036324046592e272Q,
+      0.4789142901463393876335775239063022722176e274Q,
+      0.7471062926282894447083809372938315446595e276Q,
+      0.1172956879426414428192158071551315525115e279Q,
+      0.1853271869493734796543609753051078529682e281Q,
+      0.2946702272495038326504339507351214862195e283Q,
+      0.4714723635992061322406943211761943779512e285Q,
+      0.7590705053947218729075178570936729485014e287Q,
+      0.1229694218739449434110178928491750176572e290Q,
+      0.2004401576545302577599591653441552787813e292Q,
+      0.3287218585534296227263330311644146572013e294Q,
+      0.5423910666131588774984495014212841843822e296Q,
+      0.9003691705778437366474261723593317460744e298Q,
+      0.1503616514864999040201201707840084015944e301Q,
+      0.2526075744973198387538018869171341146786e303Q,
+      0.4269068009004705274939251888899566538069e305Q,
+      0.7257415615307998967396728211129263114717e307Q,
+   } };
+
+   return factorials[i];
+}
+
+template <>
+struct max_factorial<BOOST_MATH_FLOAT128_TYPE>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 170);
+};
+
+#endif
+
+template <>
+inline double unchecked_factorial<double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(double))
+{
+   return static_cast<double>(boost::math::unchecked_factorial<long double>(i));
+}
+
+template <>
+struct max_factorial<double>
+{
+   BOOST_STATIC_CONSTANT(unsigned,
+      value = ::boost::math::max_factorial<long double>::value);
+};
+
+#ifndef BOOST_MATH_NO_LEXICAL_CAST
+
+template <class T>
+inline T unchecked_factorial(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   // factorial<unsigned int>(n) is not implemented
+   // because it would overflow integral type T for too small n
+   // to be useful. Use instead a floating-point type,
+   // and convert to an unsigned type if essential, for example:
+   // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n));
+   // See factorial documentation for more detail.
+
+   static const boost::array<T, 101> factorials = {{
+      boost::lexical_cast<T>("1"),
+      boost::lexical_cast<T>("1"),
+      boost::lexical_cast<T>("2"),
+      boost::lexical_cast<T>("6"),
+      boost::lexical_cast<T>("24"),
+      boost::lexical_cast<T>("120"),
+      boost::lexical_cast<T>("720"),
+      boost::lexical_cast<T>("5040"),
+      boost::lexical_cast<T>("40320"),
+      boost::lexical_cast<T>("362880"),
+      boost::lexical_cast<T>("3628800"),
+      boost::lexical_cast<T>("39916800"),
+      boost::lexical_cast<T>("479001600"),
+      boost::lexical_cast<T>("6227020800"),
+      boost::lexical_cast<T>("87178291200"),
+      boost::lexical_cast<T>("1307674368000"),
+      boost::lexical_cast<T>("20922789888000"),
+      boost::lexical_cast<T>("355687428096000"),
+      boost::lexical_cast<T>("6402373705728000"),
+      boost::lexical_cast<T>("121645100408832000"),
+      boost::lexical_cast<T>("2432902008176640000"),
+      boost::lexical_cast<T>("51090942171709440000"),
+      boost::lexical_cast<T>("1124000727777607680000"),
+      boost::lexical_cast<T>("25852016738884976640000"),
+      boost::lexical_cast<T>("620448401733239439360000"),
+      boost::lexical_cast<T>("15511210043330985984000000"),
+      boost::lexical_cast<T>("403291461126605635584000000"),
+      boost::lexical_cast<T>("10888869450418352160768000000"),
+      boost::lexical_cast<T>("304888344611713860501504000000"),
+      boost::lexical_cast<T>("8841761993739701954543616000000"),
+      boost::lexical_cast<T>("265252859812191058636308480000000"),
+      boost::lexical_cast<T>("8222838654177922817725562880000000"),
+      boost::lexical_cast<T>("263130836933693530167218012160000000"),
+      boost::lexical_cast<T>("8683317618811886495518194401280000000"),
+      boost::lexical_cast<T>("295232799039604140847618609643520000000"),
+      boost::lexical_cast<T>("10333147966386144929666651337523200000000"),
+      boost::lexical_cast<T>("371993326789901217467999448150835200000000"),
+      boost::lexical_cast<T>("13763753091226345046315979581580902400000000"),
+      boost::lexical_cast<T>("523022617466601111760007224100074291200000000"),
+      boost::lexical_cast<T>("20397882081197443358640281739902897356800000000"),
+      boost::lexical_cast<T>("815915283247897734345611269596115894272000000000"),
+      boost::lexical_cast<T>("33452526613163807108170062053440751665152000000000"),
+      boost::lexical_cast<T>("1405006117752879898543142606244511569936384000000000"),
+      boost::lexical_cast<T>("60415263063373835637355132068513997507264512000000000"),
+      boost::lexical_cast<T>("2658271574788448768043625811014615890319638528000000000"),
+      boost::lexical_cast<T>("119622220865480194561963161495657715064383733760000000000"),
+      boost::lexical_cast<T>("5502622159812088949850305428800254892961651752960000000000"),
+      boost::lexical_cast<T>("258623241511168180642964355153611979969197632389120000000000"),
+      boost::lexical_cast<T>("12413915592536072670862289047373375038521486354677760000000000"),
+      boost::lexical_cast<T>("608281864034267560872252163321295376887552831379210240000000000"),
+      boost::lexical_cast<T>("30414093201713378043612608166064768844377641568960512000000000000"),
+      boost::lexical_cast<T>("1551118753287382280224243016469303211063259720016986112000000000000"),
+      boost::lexical_cast<T>("80658175170943878571660636856403766975289505440883277824000000000000"),
+      boost::lexical_cast<T>("4274883284060025564298013753389399649690343788366813724672000000000000"),
+      boost::lexical_cast<T>("230843697339241380472092742683027581083278564571807941132288000000000000"),
+      boost::lexical_cast<T>("12696403353658275925965100847566516959580321051449436762275840000000000000"),
+      boost::lexical_cast<T>("710998587804863451854045647463724949736497978881168458687447040000000000000"),
+      boost::lexical_cast<T>("40526919504877216755680601905432322134980384796226602145184481280000000000000"),
+      boost::lexical_cast<T>("2350561331282878571829474910515074683828862318181142924420699914240000000000000"),
+      boost::lexical_cast<T>("138683118545689835737939019720389406345902876772687432540821294940160000000000000"),
+      boost::lexical_cast<T>("8320987112741390144276341183223364380754172606361245952449277696409600000000000000"),
+      boost::lexical_cast<T>("507580213877224798800856812176625227226004528988036003099405939480985600000000000000"),
+      boost::lexical_cast<T>("31469973260387937525653122354950764088012280797258232192163168247821107200000000000000"),
+      boost::lexical_cast<T>("1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000"),
+      boost::lexical_cast<T>("126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000"),
+      boost::lexical_cast<T>("8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000"),
+      boost::lexical_cast<T>("544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000"),
+      boost::lexical_cast<T>("36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000"),
+      boost::lexical_cast<T>("2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000"),
+      boost::lexical_cast<T>("171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000"),
+      boost::lexical_cast<T>("11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000"),
+      boost::lexical_cast<T>("850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000"),
+      boost::lexical_cast<T>("61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000"),
+      boost::lexical_cast<T>("4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000"),
+      boost::lexical_cast<T>("330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000"),
+      boost::lexical_cast<T>("24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000"),
+      boost::lexical_cast<T>("1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000"),
+      boost::lexical_cast<T>("145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000"),
+      boost::lexical_cast<T>("11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000"),
+      boost::lexical_cast<T>("894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000"),
+      boost::lexical_cast<T>("71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000"),
+      boost::lexical_cast<T>("5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000"),
+      boost::lexical_cast<T>("475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000"),
+      boost::lexical_cast<T>("39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000"),
+      boost::lexical_cast<T>("3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000"),
+      boost::lexical_cast<T>("281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000"),
+      boost::lexical_cast<T>("24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000"),
+      boost::lexical_cast<T>("2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000"),
+      boost::lexical_cast<T>("185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000"),
+      boost::lexical_cast<T>("16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000"),
+      boost::lexical_cast<T>("1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000"),
+      boost::lexical_cast<T>("135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000"),
+      boost::lexical_cast<T>("12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000"),
+      boost::lexical_cast<T>("1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000"),
+      boost::lexical_cast<T>("108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000"),
+      boost::lexical_cast<T>("10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000"),
+      boost::lexical_cast<T>("991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000"),
+      boost::lexical_cast<T>("96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000"),
+      boost::lexical_cast<T>("9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000"),
+      boost::lexical_cast<T>("933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000"),
+      boost::lexical_cast<T>("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"),
+   }};
+
+   return factorials[i];
+}
+
+template <class T>
+struct max_factorial
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 100);
+};
+
+#else // BOOST_MATH_NO_LEXICAL_CAST
+
+template <class T>
+inline T unchecked_factorial(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+{
+   return 1;
+}
+
+template <class T>
+struct max_factorial
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 0);
+};
+
+#endif
+
+#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+template <class T>
+const unsigned max_factorial<T>::value;
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SP_UC_FACTORIALS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/digamma.hpp b/gatb-core/thirdparty/boost/math/special_functions/digamma.hpp
new file mode 100644
index 0000000..718eaf9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/digamma.hpp
@@ -0,0 +1,628 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_DIGAMMA_HPP
+#define BOOST_MATH_SF_DIGAMMA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/mpl/comparison.hpp>
+#include <boost/math/tools/big_constant.hpp>
+
+namespace boost{
+namespace math{
+namespace detail{
+//
+// Begin by defining the smallest value for which it is safe to
+// use the asymptotic expansion for digamma:
+//
+inline unsigned digamma_large_lim(const mpl::int_<0>*)
+{  return 20;  }
+inline unsigned digamma_large_lim(const mpl::int_<113>*)
+{  return 20;  }
+inline unsigned digamma_large_lim(const void*)
+{  return 10;  }
+//
+// Implementations of the asymptotic expansion come next,
+// the coefficients of the series have been evaluated
+// in advance at high precision, and the series truncated
+// at the first term that's too small to effect the result.
+// Note that the series becomes divergent after a while
+// so truncation is very important.
+//
+// This first one gives 34-digit precision for x >= 20:
+//
+template <class T>
+inline T digamma_imp_large(T x, const mpl::int_<113>*)
+{
+   BOOST_MATH_STD_USING // ADL of std functions.
+   static const T P[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.003968253968253968253968253968253968253968253968254),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0041666666666666666666666666666666666666666666666667),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0075757575757575757575757575757575757575757575757576),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.021092796092796092796092796092796092796092796092796),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.44325980392156862745098039215686274509803921568627),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.0539543302701197438039543302701197438039543302701),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -26.456212121212121212121212121212121212121212121212),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 281.4601449275362318840579710144927536231884057971),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -3607.510546398046398046398046398046398046398046398),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 54827.583333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -974936.82385057471264367816091954022988505747126437),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 20052695.796688078946143462272494530559046688078946),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -472384867.72162990196078431372549019607843137254902),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 12635724795.916666666666666666666666666666666666667)
+   };
+   x -= 1;
+   T result = log(x);
+   result += 1 / (2 * x);
+   T z = 1 / (x*x);
+   result -= z * tools::evaluate_polynomial(P, z);
+   return result;
+}
+//
+// 19-digit precision for x >= 10:
+//
+template <class T>
+inline T digamma_imp_large(T x, const mpl::int_<64>*)
+{
+   BOOST_MATH_STD_USING // ADL of std functions.
+   static const T P[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.003968253968253968253968253968253968253968253968254),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0041666666666666666666666666666666666666666666666667),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0075757575757575757575757575757575757575757575757576),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.021092796092796092796092796092796092796092796092796),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.44325980392156862745098039215686274509803921568627),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.0539543302701197438039543302701197438039543302701),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -26.456212121212121212121212121212121212121212121212),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 281.4601449275362318840579710144927536231884057971),
+   };
+   x -= 1;
+   T result = log(x);
+   result += 1 / (2 * x);
+   T z = 1 / (x*x);
+   result -= z * tools::evaluate_polynomial(P, z);
+   return result;
+}
+//
+// 17-digit precision for x >= 10:
+//
+template <class T>
+inline T digamma_imp_large(T x, const mpl::int_<53>*)
+{
+   BOOST_MATH_STD_USING // ADL of std functions.
+   static const T P[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.0083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.003968253968253968253968253968253968253968253968254),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.0041666666666666666666666666666666666666666666666667),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.0075757575757575757575757575757575757575757575757576),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.021092796092796092796092796092796092796092796092796),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.44325980392156862745098039215686274509803921568627)
+   };
+   x -= 1;
+   T result = log(x);
+   result += 1 / (2 * x);
+   T z = 1 / (x*x);
+   result -= z * tools::evaluate_polynomial(P, z);
+   return result;
+}
+//
+// 9-digit precision for x >= 10:
+//
+template <class T>
+inline T digamma_imp_large(T x, const mpl::int_<24>*)
+{
+   BOOST_MATH_STD_USING // ADL of std functions.
+   static const T P[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 24, 0.083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 24, -0.0083333333333333333333333333333333333333333333333333),
+      BOOST_MATH_BIG_CONSTANT(T, 24, 0.003968253968253968253968253968253968253968253968254)
+   };
+   x -= 1;
+   T result = log(x);
+   result += 1 / (2 * x);
+   T z = 1 / (x*x);
+   result -= z * tools::evaluate_polynomial(P, z);
+   return result;
+}
+//
+// Fully generic asymptotic expansion in terms of Bernoulli numbers, see:
+// http://functions.wolfram.com/06.14.06.0012.01
+//
+template <class T>
+struct digamma_series_func
+{
+private:
+   int k;
+   T xx;
+   T term;
+public:
+   digamma_series_func(T x) : k(1), xx(x * x), term(1 / (x * x)) {}
+   T operator()()
+   {
+      T result = term * boost::math::bernoulli_b2n<T>(k) / (2 * k);
+      term /= xx;
+      ++k;
+      return result;
+   }
+   typedef T result_type;
+};
+
+template <class T, class Policy>
+inline T digamma_imp_large(T x, const Policy& pol, const mpl::int_<0>*)
+{
+   BOOST_MATH_STD_USING
+   digamma_series_func<T> s(x);
+   T result = log(x) - 1 / (2 * x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, -result);
+   result = -result;
+   policies::check_series_iterations<T>("boost::math::digamma<%1%>(%1%)", max_iter, pol);
+   return result;
+}
+//
+// Now follow rational approximations over the range [1,2].
+//
+// 35-digit precision:
+//
+template <class T>
+T digamma_imp_1_2(T x, const mpl::int_<113>*)
+{
+   //
+   // Now the approximation, we use the form:
+   //
+   // digamma(x) = (x - root) * (Y + R(x-1))
+   //
+   // Where root is the location of the positive root of digamma,
+   // Y is a constant, and R is optimised for low absolute error
+   // compared to Y.
+   //
+   // Max error found at 128-bit long double precision:  5.541e-35
+   // Maximum Deviation Found (approximation error):     1.965e-35
+   //
+   static const float Y = 0.99558162689208984375F;
+
+   static const T root1 = T(1569415565) / 1073741824uL;
+   static const T root2 = (T(381566830) / 1073741824uL) / 1073741824uL;
+   static const T root3 = ((T(111616537) / 1073741824uL) / 1073741824uL) / 1073741824uL;
+   static const T root4 = (((T(503992070) / 1073741824uL) / 1073741824uL) / 1073741824uL) / 1073741824uL;
+   static const T root5 = BOOST_MATH_BIG_CONSTANT(T, 113, 0.52112228569249997894452490385577338504019838794544e-36);
+
+   static const T P[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.25479851061131551526977464225335883769),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.18684290534374944114622235683619897417),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.80360876047931768958995775910991929922),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.67227342794829064330498117008564270136),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.26569010991230617151285010695543858005),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.05775672694575986971640757748003553385),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0071432147823164975485922555833274240665),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00048740753910766168912364555706064993274),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.16454996865214115723416538844975174761e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.20327832297631728077731148515093164955e-6)
+   };
+   static const T Q[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.6210924610812025425088411043163287646),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.6850757078559596612621337395886392594),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.4320913706209965531250495490639289418),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.4410872083455009362557012239501953402),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.081385727399251729505165509278152487225),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0089478633066857163432104815183858149496),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00055861622855066424871506755481997374154),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.1760168552357342401304462967950178554e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.20585454493572473724556649516040874384e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.90745971844439990284514121823069162795e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.48857673606545846774761343500033283272e-13),
+   };
+   T g = x - root1;
+   g -= root2;
+   g -= root3;
+   g -= root4;
+   g -= root5;
+   T r = tools::evaluate_polynomial(P, T(x-1)) / tools::evaluate_polynomial(Q, T(x-1));
+   T result = g * Y + g * r;
+
+   return result;
+}
+//
+// 19-digit precision:
+//
+template <class T>
+T digamma_imp_1_2(T x, const mpl::int_<64>*)
+{
+   //
+   // Now the approximation, we use the form:
+   //
+   // digamma(x) = (x - root) * (Y + R(x-1))
+   //
+   // Where root is the location of the positive root of digamma,
+   // Y is a constant, and R is optimised for low absolute error
+   // compared to Y.
+   //
+   // Max error found at 80-bit long double precision:   5.016e-20
+   // Maximum Deviation Found (approximation error):     3.575e-20
+   //
+   static const float Y = 0.99558162689208984375F;
+
+   static const T root1 = T(1569415565) / 1073741824uL;
+   static const T root2 = (T(381566830) / 1073741824uL) / 1073741824uL;
+   static const T root3 = BOOST_MATH_BIG_CONSTANT(T, 64, 0.9016312093258695918615325266959189453125e-19);
+
+   static const T P[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.254798510611315515235),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.314628554532916496608),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.665836341559876230295),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.314767657147375752913),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.0541156266153505273939),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.00289268368333918761452)
+   };
+   static const T Q[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 2.1195759927055347547),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.54350554664961128724),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.486986018231042975162),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0660481487173569812846),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00298999662592323990972),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.165079794012604905639e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.317940243105952177571e-7)
+   };
+   T g = x - root1;
+   g -= root2;
+   g -= root3;
+   T r = tools::evaluate_polynomial(P, T(x-1)) / tools::evaluate_polynomial(Q, T(x-1));
+   T result = g * Y + g * r;
+
+   return result;
+}
+//
+// 18-digit precision:
+//
+template <class T>
+T digamma_imp_1_2(T x, const mpl::int_<53>*)
+{
+   //
+   // Now the approximation, we use the form:
+   //
+   // digamma(x) = (x - root) * (Y + R(x-1))
+   //
+   // Where root is the location of the positive root of digamma,
+   // Y is a constant, and R is optimised for low absolute error
+   // compared to Y.
+   //
+   // Maximum Deviation Found:               1.466e-18
+   // At double precision, max error found:  2.452e-17
+   //
+   static const float Y = 0.99558162689208984F;
+
+   static const T root1 = T(1569415565) / 1073741824uL;
+   static const T root2 = (T(381566830) / 1073741824uL) / 1073741824uL;
+   static const T root3 = BOOST_MATH_BIG_CONSTANT(T, 53, 0.9016312093258695918615325266959189453125e-19);
+
+   static const T P[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.25479851061131551),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.32555031186804491),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.65031853770896507),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.28919126444774784),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.045251321448739056),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.0020713321167745952)
+   };
+   static const T Q[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.0767117023730469),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.4606242909763515),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.43593529692665969),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.054151797245674225),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.0021284987017821144),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.55789841321675513e-6)
+   };
+   T g = x - root1;
+   g -= root2;
+   g -= root3;
+   T r = tools::evaluate_polynomial(P, T(x-1)) / tools::evaluate_polynomial(Q, T(x-1));
+   T result = g * Y + g * r;
+
+   return result;
+}
+//
+// 9-digit precision:
+//
+template <class T>
+inline T digamma_imp_1_2(T x, const mpl::int_<24>*)
+{
+   //
+   // Now the approximation, we use the form:
+   //
+   // digamma(x) = (x - root) * (Y + R(x-1))
+   //
+   // Where root is the location of the positive root of digamma,
+   // Y is a constant, and R is optimised for low absolute error
+   // compared to Y.
+   //
+   // Maximum Deviation Found:              3.388e-010
+   // At float precision, max error found:  2.008725e-008
+   //
+   static const float Y = 0.99558162689208984f;
+   static const T root = 1532632.0f / 1048576;
+   static const T root_minor = static_cast<T>(0.3700660185912626595423257213284682051735604e-6L);
+   static const T P[] = {    
+      0.25479851023250261e0f,
+      -0.44981331915268368e0f,
+      -0.43916936919946835e0f,
+      -0.61041765350579073e-1f
+   };
+   static const T Q[] = {    
+      0.1e1,
+      0.15890202430554952e1f,
+      0.65341249856146947e0f,
+      0.63851690523355715e-1f
+   };
+   T g = x - root;
+   g -= root_minor;
+   T r = tools::evaluate_polynomial(P, T(x-1)) / tools::evaluate_polynomial(Q, T(x-1));
+   T result = g * Y + g * r;
+
+   return result;
+}
+
+template <class T, class Tag, class Policy>
+T digamma_imp(T x, const Tag* t, const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   T result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x <= -1)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      T remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<T>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<T>() / tan(constants::pi<T>() * remainder);
+   }
+   if(x == 0)
+      return policies::raise_pole_error<T>("boost::math::digamma<%1%>(%1%)", 0, x, pol);
+   //
+   // If we're above the lower-limit for the
+   // asymptotic expansion then use it:
+   //
+   if(x >= digamma_large_lim(t))
+   {
+      result += digamma_imp_large(x, t);
+   }
+   else
+   {
+      //
+      // If x > 2 reduce to the interval [1,2]:
+      //
+      while(x > 2)
+      {
+         x -= 1;
+         result += 1/x;
+      }
+      //
+      // If x < 1 use recurrance to shift to > 1:
+      //
+      while(x < 1)
+      {
+         result -= 1/x;
+         x += 1;
+      }
+      result += digamma_imp_1_2(x, t);
+   }
+   return result;
+}
+
+template <class T, class Policy>
+T digamma_imp(T x, const mpl::int_<0>* t, const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   T result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x <= -1)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      T remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<T>("boost::math::digamma<%1%>(%1%)", 0, (1 - x), pol);
+      }
+      result = constants::pi<T>() / tan(constants::pi<T>() * remainder);
+   }
+   if(x == 0)
+      return policies::raise_pole_error<T>("boost::math::digamma<%1%>(%1%)", 0, x, pol);
+   //
+   // If we're above the lower-limit for the
+   // asymptotic expansion then use it, the
+   // limit is a linear interpolation with
+   // limit = 10 at 50 bit precision and
+   // limit = 250 at 1000 bit precision.
+   //
+   T lim = 10 + (tools::digits<T>() - 50) * 240 / 950;
+   T two_x = ldexp(x, 1);
+   if(x >= lim)
+   {
+      result += digamma_imp_large(x, pol, t);
+   }
+   else if(floor(x) == x)
+   {
+      //
+      // Special case for integer arguments, see
+      // http://functions.wolfram.com/06.14.03.0001.01
+      //
+      result = -constants::euler<T, Policy>();
+      T val = 1;
+      while(val < x)
+      {
+         result += 1 / val;
+         val += 1;
+      }
+   }
+   else if(floor(two_x) == two_x)
+   {
+      //
+      // Special case for half integer arguments, see:
+      // http://functions.wolfram.com/06.14.03.0007.01
+      //
+      result = -2 * constants::ln_two<T, Policy>() - constants::euler<T, Policy>();
+      int n = itrunc(x);
+      if(n)
+      {
+         for(int k = 1; k < n; ++k)
+            result += 1 / T(k);
+         for(int k = n; k <= 2 * n - 1; ++k)
+            result += 2 / T(k);
+      }
+   }
+   else
+   {
+      //
+      // Rescale so we can use the asymptotic expansion:
+      //
+      while(x < lim)
+      {
+         result -= 1 / x;
+         x += 1;
+      }
+      result += digamma_imp_large(x, pol, t);
+   }
+   return result;
+}
+//
+// Initializer: ensure all our constants are initialized prior to the first call of main:
+//
+template <class T, class Policy>
+struct digamma_initializer
+{
+   struct init
+   {
+      init()
+      {
+         typedef typename policies::precision<T, Policy>::type precision_type;
+         do_init(mpl::bool_<precision_type::value && (precision_type::value <= 113)>());
+      }
+      void do_init(const mpl::true_&)
+      {
+         boost::math::digamma(T(1.5), Policy());
+         boost::math::digamma(T(500), Policy());
+      }
+      void do_init(const mpl::false_&){}
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename digamma_initializer<T, Policy>::init digamma_initializer<T, Policy>::initializer;
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   digamma(T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<T, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::or_<
+         mpl::less_equal<precision_type, mpl::int_<0> >,
+         mpl::greater<precision_type, mpl::int_<114> >
+      >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less<precision_type, mpl::int_<25> >,
+         mpl::int_<24>,
+         typename mpl::if_<
+            mpl::less<precision_type, mpl::int_<54> >,
+            mpl::int_<53>,
+            typename mpl::if_<
+               mpl::less<precision_type, mpl::int_<65> >,
+               mpl::int_<64>,
+               mpl::int_<113>
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   // Force initialization of constants:
+   detail::digamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::digamma_imp(
+      static_cast<value_type>(x),
+      static_cast<const tag_type*>(0), forwarding_policy()), "boost::math::digamma<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   digamma(T x)
+{
+   return digamma(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_1.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_1.hpp
new file mode 100644
index 0000000..62a0bf3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_1.hpp
@@ -0,0 +1,201 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Copyright (c) 2006 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to ensure
+//  that the code continues to work no matter how many digits
+//  type T has.
+
+#ifndef BOOST_MATH_ELLINT_1_HPP
+#define BOOST_MATH_ELLINT_1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+// Elliptic integrals (complete and incomplete) of the first kind
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math {
+
+template <class T1, class T2, class Policy>
+typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi, const Policy& pol);
+
+namespace detail{
+
+template <typename T, typename Policy>
+T ellint_k_imp(T k, const Policy& pol);
+
+// Elliptic integral (Legendre form) of the first kind
+template <typename T, typename Policy>
+T ellint_f_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    static const char* function = "boost::math::ellint_f<%1%>(%1%,%1%)";
+    BOOST_MATH_INSTRUMENT_VARIABLE(phi);
+    BOOST_MATH_INSTRUMENT_VARIABLE(k);
+    BOOST_MATH_INSTRUMENT_VARIABLE(function);
+
+    if (abs(k) > 1)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       BOOST_MATH_INSTRUMENT_VARIABLE(phi);
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+
+    if(phi >= tools::max_value<T>())
+    {
+       // Need to handle infinity as a special case:
+       result = policies::raise_overflow_error<T>(function, 0, pol);
+       BOOST_MATH_INSTRUMENT_VARIABLE(result);
+    }
+    else if(phi > 1 / tools::epsilon<T>())
+    {
+       // Phi is so large that phi%pi is necessarily zero (or garbage),
+       // just return the second part of the duplication formula:
+       result = 2 * phi * ellint_k_imp(k, pol) / constants::pi<T>();
+       BOOST_MATH_INSTRUMENT_VARIABLE(result);
+    }
+    else
+    {
+       // Carlson's algorithm works only for |phi| <= pi/2,
+       // use the integrand's periodicity to normalize phi
+       //
+       // Xiaogang's original code used a cast to long long here
+       // but that fails if T has more digits than a long long,
+       // so rewritten to use fmod instead:
+       //
+       BOOST_MATH_INSTRUMENT_CODE("pi/2 = " << constants::pi<T>() / 2);
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::half_pi<T>()));
+       BOOST_MATH_INSTRUMENT_VARIABLE(rphi);
+       T m = boost::math::round((phi - rphi) / constants::half_pi<T>());
+       BOOST_MATH_INSTRUMENT_VARIABLE(m);
+       int s = 1;
+       if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
+       {
+          m += 1;
+          s = -1;
+          rphi = constants::half_pi<T>() - rphi;
+          BOOST_MATH_INSTRUMENT_VARIABLE(rphi);
+       }
+       T sinp = sin(rphi);
+       sinp *= sinp;
+       T cosp = cos(rphi);
+       cosp *= cosp;
+       T c = 1 / sinp;
+       BOOST_MATH_INSTRUMENT_VARIABLE(sinp);
+       BOOST_MATH_INSTRUMENT_VARIABLE(cosp);
+       if(sinp > tools::min_value<T>())
+       {
+          //
+          // Use http://dlmf.nist.gov/19.25#E5, note that
+          // c-1 simplifies to cot^2(rphi) which avoid cancellation:
+          //
+          result = rphi == 0 ? static_cast<T>(0) : static_cast<T>(s * ellint_rf_imp(T(cosp / sinp), T(c - k * k), c, pol));
+       }
+       else
+          result = s * sin(rphi);
+       BOOST_MATH_INSTRUMENT_VARIABLE(result);
+       if(m != 0)
+       {
+          result += m * ellint_k_imp(k, pol);
+          BOOST_MATH_INSTRUMENT_VARIABLE(result);
+       }
+    }
+    return invert ? T(-result) : result;
+}
+
+// Complete elliptic integral (Legendre form) of the first kind
+template <typename T, typename Policy>
+T ellint_k_imp(T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::ellint_k<%1%>(%1%)";
+
+    if (abs(k) > 1)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+    if (abs(k) == 1)
+    {
+       return policies::raise_overflow_error<T>(function, 0, pol);
+    }
+
+    T x = 0;
+    T y = 1 - k * k;
+    T z = 1;
+    T value = ellint_rf_imp(x, y, z, pol);
+
+    return value;
+}
+
+template <typename T, typename Policy>
+inline typename tools::promote_args<T>::type ellint_1(T k, const Policy& pol, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_k_imp(static_cast<value_type>(k), pol), "boost::math::ellint_1<%1%>(%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi, const mpl::false_&)
+{
+   return boost::math::ellint_1(k, phi, policies::policy<>());
+}
+
+}
+
+// Complete elliptic integral (Legendre form) of the first kind
+template <typename T>
+inline typename tools::promote_args<T>::type ellint_1(T k)
+{
+   return ellint_1(k, policies::policy<>());
+}
+
+// Elliptic integral (Legendre form) of the first kind
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_f_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::ellint_1<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi)
+{
+   typedef typename policies::is_policy<T2>::type tag_type;
+   return detail::ellint_1(k, phi, tag_type());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_2.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_2.hpp
new file mode 100644
index 0000000..f4f65cc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_2.hpp
@@ -0,0 +1,198 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Copyright (c) 2006 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to ensure
+//  that the code continues to work no matter how many digits
+//  type T has.
+
+#ifndef BOOST_MATH_ELLINT_2_HPP
+#define BOOST_MATH_ELLINT_2_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rg.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+// Elliptic integrals (complete and incomplete) of the second kind
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { 
+   
+template <class T1, class T2, class Policy>
+typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi, const Policy& pol);
+   
+namespace detail{
+
+template <typename T, typename Policy>
+T ellint_e_imp(T k, const Policy& pol);
+
+// Elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_e_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+
+    if(phi >= tools::max_value<T>())
+    {
+       // Need to handle infinity as a special case:
+       result = policies::raise_overflow_error<T>("boost::math::ellint_e<%1%>(%1%,%1%)", 0, pol);
+    }
+    else if(phi > 1 / tools::epsilon<T>())
+    {
+       // Phi is so large that phi%pi is necessarily zero (or garbage),
+       // just return the second part of the duplication formula:
+       result = 2 * phi * ellint_e_imp(k, pol) / constants::pi<T>();
+    }
+    else if(k == 0)
+    {
+       return invert ? T(-phi) : phi;
+    }
+    else if(fabs(k) == 1)
+    {
+       return invert ? T(-sin(phi)) : sin(phi);
+    }
+    else
+    {
+       // Carlson's algorithm works only for |phi| <= pi/2,
+       // use the integrand's periodicity to normalize phi
+       //
+       // Xiaogang's original code used a cast to long long here
+       // but that fails if T has more digits than a long long,
+       // so rewritten to use fmod instead:
+       //
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::half_pi<T>()));
+       T m = boost::math::round((phi - rphi) / constants::half_pi<T>());
+       int s = 1;
+       if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
+       {
+          m += 1;
+          s = -1;
+          rphi = constants::half_pi<T>() - rphi;
+       }
+       T sinp = sin(rphi);
+       T cosp = cos(rphi);
+       T c = 1 / (sinp * sinp);
+       T cm1 = cosp * cosp / (sinp * sinp);  // c - 1
+       T k2 = k * k;
+       if(k2 > 1)
+       {
+          return policies::raise_domain_error<T>("boost::math::ellint_2<%1%>(%1%, %1%)", "The parameter k is out of range, got k = %1%", k, pol);
+       }
+       else if(rphi == 0)
+       {
+          result = 0;
+       }
+       else if(sinp * sinp < tools::min_value<T>())
+       {
+          T x = cosp * cosp;
+          T t = k * k * sinp * sinp;
+          T y = 1 - t;
+          T z = 1;
+          result = s * sinp * (ellint_rf_imp(x, y, z, pol) - t * ellint_rd_imp(x, y, z, pol) / 3);
+       }
+       else
+       {
+          // http://dlmf.nist.gov/19.25#E10
+          result = s * ((1 - k2) * ellint_rf_imp(cm1, T(c - k2), c, pol) + k2 * (1 - k2) * ellint_rd(cm1, c, T(c - k2), pol) / 3 + k2 * sqrt(cm1 / (c * (c - k2))));
+       }
+       if(m != 0)
+          result += m * ellint_e_imp(k, pol);
+    }
+    return invert ? T(-result) : result;
+}
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_e_imp(T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (abs(k) > 1)
+    {
+       return policies::raise_domain_error<T>("boost::math::ellint_e<%1%>(%1%)",
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+    if (abs(k) == 1)
+    {
+        return static_cast<T>(1);
+    }
+
+    T x = 0;
+    T t = k * k;
+    T y = 1 - t;
+    T z = 1;
+    T value = 2 * ellint_rg_imp(x, y, z, pol);
+
+    return value;
+}
+
+template <typename T, typename Policy>
+inline typename tools::promote_args<T>::type ellint_2(T k, const Policy& pol, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_e_imp(static_cast<value_type>(k), pol), "boost::math::ellint_2<%1%>(%1%)");
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi, const mpl::false_&)
+{
+   return boost::math::ellint_2(k, phi, policies::policy<>());
+}
+
+} // detail
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T>
+inline typename tools::promote_args<T>::type ellint_2(T k)
+{
+   return ellint_2(k, policies::policy<>());
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi)
+{
+   typedef typename policies::is_policy<T2>::type tag_type;
+   return detail::ellint_2(k, phi, tag_type());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_e_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::ellint_2<%1%>(%1%,%1%)");
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_2_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_3.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_3.hpp
new file mode 100644
index 0000000..9ab0f83
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_3.hpp
@@ -0,0 +1,376 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Copyright (c) 2006 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to correctly
+//  handle the various corner cases.
+//
+
+#ifndef BOOST_MATH_ELLINT_3_HPP
+#define BOOST_MATH_ELLINT_3_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/ellint_2.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/atanh.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+// Elliptic integrals (complete and incomplete) of the third kind
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { 
+   
+namespace detail{
+
+template <typename T, typename Policy>
+T ellint_pi_imp(T v, T k, T vc, const Policy& pol);
+
+// Elliptic integral (Legendre form) of the third kind
+template <typename T, typename Policy>
+T ellint_pi_imp(T v, T phi, T k, T vc, const Policy& pol)
+{
+   // Note vc = 1-v presumably without cancellation error.
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::ellint_3<%1%>(%1%,%1%,%1%)";
+
+   if(abs(k) > 1)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Got k = %1%, function requires |k| <= 1", k, pol);
+   }
+
+   T sphi = sin(fabs(phi));
+   T result = 0;
+
+   if(v > 1 / (sphi * sphi))
+   {
+      // Complex result is a domain error:
+      return policies::raise_domain_error<T>(function,
+         "Got v = %1%, but result is complex for v > 1 / sin^2(phi)", v, pol);
+   }
+
+   // Special cases first:
+   if(v == 0)
+   {
+      // A&S 17.7.18 & 19
+      return (k == 0) ? phi : ellint_f_imp(phi, k, pol);
+   }
+   if(v == 1)
+   {
+      // http://functions.wolfram.com/08.06.03.0008.01
+      T m = k * k;
+      result = sqrt(1 - m * sphi * sphi) * tan(phi) - ellint_e_imp(phi, k, pol);
+      result /= 1 - m;
+      result += ellint_f_imp(phi, k, pol);
+      return result;
+   }
+   if(phi == constants::half_pi<T>())
+   {
+      // Have to filter this case out before the next
+      // special case, otherwise we might get an infinity from
+      // tan(phi).
+      // Also note that since we can't represent PI/2 exactly
+      // in a T, this is a bit of a guess as to the users true
+      // intent...
+      //
+      return ellint_pi_imp(v, k, vc, pol);
+   }
+   if((phi > constants::half_pi<T>()) || (phi < 0))
+   {
+      // Carlson's algorithm works only for |phi| <= pi/2,
+      // use the integrand's periodicity to normalize phi
+      //
+      // Xiaogang's original code used a cast to long long here
+      // but that fails if T has more digits than a long long,
+      // so rewritten to use fmod instead:
+      //
+      // See http://functions.wolfram.com/08.06.16.0002.01
+      //
+      if(fabs(phi) > 1 / tools::epsilon<T>())
+      {
+         if(v > 1)
+            return policies::raise_domain_error<T>(
+            function,
+            "Got v = %1%, but this is only supported for 0 <= phi <= pi/2", v, pol);
+         //  
+         // Phi is so large that phi%pi is necessarily zero (or garbage),
+         // just return the second part of the duplication formula:
+         //
+         result = 2 * fabs(phi) * ellint_pi_imp(v, k, vc, pol) / constants::pi<T>();
+      }
+      else
+      {
+         T rphi = boost::math::tools::fmod_workaround(T(fabs(phi)), T(constants::half_pi<T>()));
+         T m = boost::math::round((fabs(phi) - rphi) / constants::half_pi<T>());
+         int sign = 1;
+         if((m != 0) && (k >= 1))
+         {
+            return policies::raise_domain_error<T>(function, "Got k=1 and phi=%1% but the result is complex in that domain", phi, pol);
+         }
+         if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
+         {
+            m += 1;
+            sign = -1;
+            rphi = constants::half_pi<T>() - rphi;
+         }
+         result = sign * ellint_pi_imp(v, rphi, k, vc, pol);
+         if((m > 0) && (vc > 0))
+            result += m * ellint_pi_imp(v, k, vc, pol);
+      }
+      return phi < 0 ? -result : result;
+   }
+   if(k == 0)
+   {
+      // A&S 17.7.20:
+      if(v < 1)
+      {
+         T vcr = sqrt(vc);
+         return atan(vcr * tan(phi)) / vcr;
+      }
+      else if(v == 1)
+      {
+         return tan(phi);
+      }
+      else
+      {
+         // v > 1:
+         T vcr = sqrt(-vc);
+         T arg = vcr * tan(phi);
+         return (boost::math::log1p(arg, pol) - boost::math::log1p(-arg, pol)) / (2 * vcr);
+      }
+   }
+   if(v < 0)
+   {
+      //
+      // If we don't shift to 0 <= v <= 1 we get
+      // cancellation errors later on.  Use
+      // A&S 17.7.15/16 to shift to v > 0.
+      //
+      // Mathematica simplifies the expressions
+      // given in A&S as follows (with thanks to
+      // Rocco Romeo for figuring these out!):
+      //
+      // V = (k2 - n)/(1 - n)
+      // Assuming[(k2 >= 0 && k2 <= 1) && n < 0, FullSimplify[Sqrt[(1 - V)*(1 - k2 / V)] / Sqrt[((1 - n)*(1 - k2 / n))]]]
+      // Result: ((-1 + k2) n) / ((-1 + n) (-k2 + n))
+      //
+      // Assuming[(k2 >= 0 && k2 <= 1) && n < 0, FullSimplify[k2 / (Sqrt[-n*(k2 - n) / (1 - n)] * Sqrt[(1 - n)*(1 - k2 / n)])]]
+      // Result : k2 / (k2 - n)
+      //
+      // Assuming[(k2 >= 0 && k2 <= 1) && n < 0, FullSimplify[Sqrt[1 / ((1 - n)*(1 - k2 / n))]]]
+      // Result : Sqrt[n / ((k2 - n) (-1 + n))]
+      //
+      T k2 = k * k;
+      T N = (k2 - v) / (1 - v);
+      T Nm1 = (1 - k2) / (1 - v);
+      T p2 = -v * N;
+      T t;
+      if(p2 <= tools::min_value<T>())
+         p2 = sqrt(-v) * sqrt(N);
+      else
+         p2 = sqrt(p2);
+      T delta = sqrt(1 - k2 * sphi * sphi);
+      if(N > k2)
+      {
+         result = ellint_pi_imp(N, phi, k, Nm1, pol);
+         result *= v / (v - 1);
+         result *= (k2 - 1) / (v - k2);
+      }
+
+      if(k != 0)
+      {
+         t = ellint_f_imp(phi, k, pol);
+         t *= k2 / (k2 - v);
+         result += t;
+      }
+      t = v / ((k2 - v) * (v - 1));
+      if(t > tools::min_value<T>())
+      {
+         result += atan((p2 / 2) * sin(2 * phi) / delta) * sqrt(t);
+      }
+      else
+      {
+         result += atan((p2 / 2) * sin(2 * phi) / delta) * sqrt(fabs(1 / (k2 - v))) * sqrt(fabs(v / (v - 1)));
+      }
+      return result;
+   }
+   if(k == 1)
+   {
+      // See http://functions.wolfram.com/08.06.03.0013.01
+      result = sqrt(v) * atanh(sqrt(v) * sin(phi)) - log(1 / cos(phi) + tan(phi));
+      result /= v - 1;
+      return result;
+   }
+#if 0  // disabled but retained for future reference: see below.
+   if(v > 1)
+   {
+      //
+      // If v > 1 we can use the identity in A&S 17.7.7/8
+      // to shift to 0 <= v <= 1.  In contrast to previous
+      // revisions of this header, this identity does now work
+      // but appears not to produce better error rates in 
+      // practice.  Archived here for future reference...
+      //
+      T k2 = k * k;
+      T N = k2 / v;
+      T Nm1 = (v - k2) / v;
+      T p1 = sqrt((-vc) * (1 - k2 / v));
+      T delta = sqrt(1 - k2 * sphi * sphi);
+      //
+      // These next two terms have a large amount of cancellation
+      // so it's not clear if this relation is useable even if
+      // the issues with phi > pi/2 can be fixed:
+      //
+      result = -ellint_pi_imp(N, phi, k, Nm1, pol);
+      result += ellint_f_imp(phi, k, pol);
+      //
+      // This log term gives the complex result when
+      //     n > 1/sin^2(phi)
+      // However that case is dealt with as an error above, 
+      // so we should always get a real result here:
+      //
+      result += log((delta + p1 * tan(phi)) / (delta - p1 * tan(phi))) / (2 * p1);
+      return result;
+   }
+#endif
+   //
+   // Carlson's algorithm works only for |phi| <= pi/2,
+   // by the time we get here phi should already have been
+   // normalised above.
+   //
+   BOOST_ASSERT(fabs(phi) < constants::half_pi<T>());
+   BOOST_ASSERT(phi >= 0);
+   T x, y, z, p, t;
+   T cosp = cos(phi);
+   x = cosp * cosp;
+   t = sphi * sphi;
+   y = 1 - k * k * t;
+   z = 1;
+   if(v * t < 0.5)
+      p = 1 - v * t;
+   else
+      p = x + vc * t;
+   result = sphi * (ellint_rf_imp(x, y, z, pol) + v * t * ellint_rj_imp(x, y, z, p, pol) / 3);
+
+   return result;
+}
+
+// Complete elliptic integral (Legendre form) of the third kind
+template <typename T, typename Policy>
+T ellint_pi_imp(T v, T k, T vc, const Policy& pol)
+{
+    // Note arg vc = 1-v, possibly without cancellation errors
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    static const char* function = "boost::math::ellint_pi<%1%>(%1%,%1%)";
+
+    if (abs(k) >= 1)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+    if(vc <= 0)
+    {
+       // Result is complex:
+       return policies::raise_domain_error<T>(function,
+            "Got v = %1%, function requires v < 1", v, pol);
+    }
+
+    if(v == 0)
+    {
+       return (k == 0) ? boost::math::constants::pi<T>() / 2 : ellint_k_imp(k, pol);
+    }
+
+    if(v < 0)
+    {
+       // Apply A&S 17.7.17:
+       T k2 = k * k;
+       T N = (k2 - v) / (1 - v);
+       T Nm1 = (1 - k2) / (1 - v);
+       T result = 0;
+       result = boost::math::detail::ellint_pi_imp(N, k, Nm1, pol);
+       // This next part is split in two to avoid spurious over/underflow:
+       result *= -v / (1 - v);
+       result *= (1 - k2) / (k2 - v);
+       result += ellint_k_imp(k, pol) * k2 / (k2 - v);
+       return result;
+    }
+
+    T x = 0;
+    T y = 1 - k * k;
+    T z = 1;
+    T p = vc;
+    T value = ellint_rf_imp(x, y, z, pol) + v * ellint_rj_imp(x, y, z, p, pol) / 3;
+
+    return value;
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi, const mpl::false_&)
+{
+   return boost::math::ellint_3(k, v, phi, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type ellint_3(T1 k, T2 v, const Policy& pol, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_pi_imp(
+         static_cast<value_type>(v), 
+         static_cast<value_type>(k),
+         static_cast<value_type>(1-v),
+         pol), "boost::math::ellint_3<%1%>(%1%,%1%)");
+}
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_pi_imp(
+         static_cast<value_type>(v), 
+         static_cast<value_type>(phi), 
+         static_cast<value_type>(k),
+         static_cast<value_type>(1-v),
+         pol), "boost::math::ellint_3<%1%>(%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3>
+typename detail::ellint_3_result<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi)
+{
+   typedef typename policies::is_policy<T3>::type tag_type;
+   return detail::ellint_3(k, v, phi, tag_type());
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_3(T1 k, T2 v)
+{
+   return ellint_3(k, v, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_3_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_d.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_d.hpp
new file mode 100644
index 0000000..5bd065d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_d.hpp
@@ -0,0 +1,180 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Copyright (c) 2006 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to ensure
+//  that the code continues to work no matter how many digits
+//  type T has.
+
+#ifndef BOOST_MATH_ELLINT_D_HPP
+#define BOOST_MATH_ELLINT_D_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rg.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+// Elliptic integrals (complete and incomplete) of the second kind
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { 
+   
+template <class T1, class T2, class Policy>
+typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const Policy& pol);
+   
+namespace detail{
+
+template <typename T, typename Policy>
+T ellint_d_imp(T k, const Policy& pol);
+
+// Elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_d_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+
+    if(phi >= tools::max_value<T>())
+    {
+       // Need to handle infinity as a special case:
+       result = policies::raise_overflow_error<T>("boost::math::ellint_e<%1%>(%1%,%1%)", 0, pol);
+    }
+    else if(phi > 1 / tools::epsilon<T>())
+    {
+       // Phi is so large that phi%pi is necessarily zero (or garbage),
+       // just return the second part of the duplication formula:
+       result = 2 * phi * ellint_d_imp(k, pol) / constants::pi<T>();
+    }
+    else
+    {
+       // Carlson's algorithm works only for |phi| <= pi/2,
+       // use the integrand's periodicity to normalize phi
+       //
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::half_pi<T>()));
+       T m = boost::math::round((phi - rphi) / constants::half_pi<T>());
+       int s = 1;
+       if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
+       {
+          m += 1;
+          s = -1;
+          rphi = constants::half_pi<T>() - rphi;
+       }
+       T sinp = sin(rphi);
+       T cosp = cos(rphi);
+       T c = 1 / (sinp * sinp);
+       T cm1 = cosp * cosp / (sinp * sinp);  // c - 1
+       T k2 = k * k;
+       if(k2 > 1)
+       {
+          return policies::raise_domain_error<T>("boost::math::ellint_d<%1%>(%1%, %1%)", "The parameter k is out of range, got k = %1%", k, pol);
+       }
+       else if(rphi == 0)
+       {
+          result = 0;
+       }
+       else
+       {
+          // http://dlmf.nist.gov/19.25#E10
+          result = s * ellint_rd_imp(cm1, T(c - k2), c, pol) / 3;
+       }
+       if(m != 0)
+          result += m * ellint_d_imp(k, pol);
+    }
+    return invert ? T(-result) : result;
+}
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_d_imp(T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (abs(k) > 1)
+    {
+       return policies::raise_domain_error<T>("boost::math::ellint_e<%1%>(%1%)",
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+    if (abs(k) == 1)
+    {
+        return static_cast<T>(1);
+    }
+    if(fabs(k) <= tools::root_epsilon<T>())
+       return constants::pi<T>() / 4;
+
+    T x = 0;
+    T t = k * k;
+    T y = 1 - t;
+    T z = 1;
+    T value = ellint_rd_imp(x, y, z, pol) / 3;
+
+    return value;
+}
+
+template <typename T, typename Policy>
+inline typename tools::promote_args<T>::type ellint_d(T k, const Policy& pol, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_d_imp(static_cast<value_type>(k), pol), "boost::math::ellint_d<%1%>(%1%)");
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const mpl::false_&)
+{
+   return boost::math::ellint_d(k, phi, policies::policy<>());
+}
+
+} // detail
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T>
+inline typename tools::promote_args<T>::type ellint_d(T k)
+{
+   return ellint_d(k, policies::policy<>());
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi)
+{
+   typedef typename policies::is_policy<T2>::type tag_type;
+   return detail::ellint_d(k, phi, tag_type());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_d_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::ellint_2<%1%>(%1%,%1%)");
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_rc.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_rc.hpp
new file mode 100644
index 0000000..846c752
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_rc.hpp
@@ -0,0 +1,114 @@
+//  Copyright (c) 2006 Xiaogang Zhang, 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to correctly
+//  handle the y < 0 case.
+//  Updated 2015 to use Carlson's latest methods.
+//
+
+#ifndef BOOST_MATH_ELLINT_RC_HPP
+#define BOOST_MATH_ELLINT_RC_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <iostream>
+
+// Carlson's degenerate elliptic integral
+// R_C(x, y) = R_F(x, y, y) = 0.5 * \int_{0}^{\infty} (t+x)^{-1/2} (t+y)^{-1} dt
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T ellint_rc_imp(T x, T y, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+
+    static const char* function = "boost::math::ellint_rc<%1%>(%1%,%1%)";
+
+    if(x < 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Argument x must be non-negative but got %1%", x, pol);
+    }
+    if(y == 0)
+    {
+       return policies::raise_domain_error<T>(function,
+            "Argument y must not be zero but got %1%", y, pol);
+    }
+
+    // for y < 0, the integral is singular, return Cauchy principal value
+    T prefix, result;
+    if(y < 0)
+    {
+        prefix = sqrt(x / (x - y));
+        x = x - y;
+        y = -y;
+    }
+    else
+       prefix = 1;
+
+    if(x == 0)
+    {
+       result = constants::half_pi<T>() / sqrt(y);
+    }
+    else if(x == y)
+    {
+       result = 1 / sqrt(x);
+    }
+    else if(y > x)
+    {
+       result = atan(sqrt((y - x) / x)) / sqrt(y - x);
+    }
+    else
+    {
+       if(y / x > 0.5)
+       {
+          T arg = sqrt((x - y) / x);
+          result = (boost::math::log1p(arg) - boost::math::log1p(-arg)) / (2 * sqrt(x - y));
+       }
+       else
+       {
+          result = log((sqrt(x) + sqrt(x - y)) / sqrt(y)) / sqrt(x - y);
+       }
+    }
+    return prefix * result;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   ellint_rc(T1 x, T2 y, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rc_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y), pol), "boost::math::ellint_rc<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   ellint_rc(T1 x, T2 y)
+{
+   return ellint_rc(x, y, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RC_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_rd.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_rd.hpp
new file mode 100644
index 0000000..03b73b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_rd.hpp
@@ -0,0 +1,201 @@
+//  Copyright (c) 2006 Xiaogang Zhang, 2015 John Maddock.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it slightly to fit into the
+//  Boost.Math conceptual framework better.
+//  Updated 2015 to use Carlson's latest methods.
+
+#ifndef BOOST_MATH_ELLINT_RD_HPP
+#define BOOST_MATH_ELLINT_RD_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rc.hpp>
+#include <boost/math/special_functions/pow.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+// Carlson's elliptic integral of the second kind
+// R_D(x, y, z) = R_J(x, y, z, z) = 1.5 * \int_{0}^{\infty} [(t+x)(t+y)]^{-1/2} (t+z)^{-3/2} dt
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T ellint_rd_imp(T x, T y, T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   using std::swap;
+
+   static const char* function = "boost::math::ellint_rd<%1%>(%1%,%1%,%1%)";
+
+   if(x < 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument x must be >= 0, but got %1%", x, pol);
+   }
+   if(y < 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument y must be >= 0, but got %1%", y, pol);
+   }
+   if(z <= 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument z must be > 0, but got %1%", z, pol);
+   }
+   if(x + y == 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "At most one argument can be zero, but got, x + y = %1%", x + y, pol);
+   }
+   //
+   // Special cases from http://dlmf.nist.gov/19.20#iv
+   //
+   using std::swap;
+   if(x == z)
+      swap(x, y);
+   if(y == z)
+   {
+      if(x == y)
+      {
+         return 1 / (x * sqrt(x));
+      }
+      else if(x == 0)
+      {
+         return 3 * constants::pi<T>() / (4 * y * sqrt(y));
+      }
+      else
+      {
+         if((std::min)(x, y) / (std::max)(x, y) > 1.3)
+            return 3 * (ellint_rc_imp(x, y, pol) - sqrt(x) / y) / (2 * (y - x));
+         // Otherwise fall through to avoid cancellation in the above (RC(x,y) -> 1/x^0.5 as x -> y)
+      }
+   }
+   if(x == y)
+   {
+      if((std::min)(x, z) / (std::max)(x, z) > 1.3)
+         return 3 * (ellint_rc_imp(z, x, pol) - 1 / sqrt(z)) / (z - x);
+      // Otherwise fall through to avoid cancellation in the above (RC(x,y) -> 1/x^0.5 as x -> y)
+   }
+   if(y == 0)
+      swap(x, y);
+   if(x == 0)
+   {
+      //
+      // Special handling for common case, from
+      // Numerical Computation of Real or Complex Elliptic Integrals, eq.47
+      //
+      T xn = sqrt(y);
+      T yn = sqrt(z);
+      T x0 = xn;
+      T y0 = yn;
+      T sum = 0;
+      T sum_pow = 0.25f;
+
+      while(fabs(xn - yn) >= 2.7 * tools::root_epsilon<T>() * fabs(xn))
+      {
+         T t = sqrt(xn * yn);
+         xn = (xn + yn) / 2;
+         yn = t;
+         sum_pow *= 2;
+         sum += sum_pow * boost::math::pow<2>(xn - yn);
+      }
+      T RF = constants::pi<T>() / (xn + yn);
+      //
+      // This following calculation suffers from serious cancellation when y ~ z
+      // unless we combine terms.  We have:
+      //
+      // ( ((x0 + y0)/2)^2 - z ) / (z(y-z))
+      //
+      // Substituting y = x0^2 and z = y0^2 and simplifying we get the following:
+      //
+      T pt = (x0 + 3 * y0) / (4 * z * (x0 + y0));
+      //
+      // Since we've moved the demoninator from eq.47 inside the expression, we
+      // need to also scale "sum" by the same value:
+      //
+      pt -= sum / (z * (y - z));
+      return pt * RF * 3;
+   }
+
+   T xn = x;
+   T yn = y;
+   T zn = z;
+   T An = (x + y + 3 * z) / 5;
+   T A0 = An;
+   // This has an extra 1.2 fudge factor which is really only needed when x, y and z are close in magnitude:
+   T Q = pow(tools::epsilon<T>() / 4, -T(1) / 8) * (std::max)((std::max)(An - x, An - y), An - z) * 1.2f;
+   T lambda, rx, ry, rz;
+   unsigned k = 0;
+   T fn = 1;
+   T RD_sum = 0;
+
+   for(; k < policies::get_max_series_iterations<Policy>(); ++k)
+   {
+      rx = sqrt(xn);
+      ry = sqrt(yn);
+      rz = sqrt(zn);
+      lambda = rx * ry + rx * rz + ry * rz;
+      RD_sum += fn / (rz * (zn + lambda));
+      An = (An + lambda) / 4;
+      xn = (xn + lambda) / 4;
+      yn = (yn + lambda) / 4;
+      zn = (zn + lambda) / 4;
+      fn /= 4;
+      Q /= 4;
+      if(Q < An)
+         break;
+   }
+
+   policies::check_series_iterations<T, Policy>(function, k, pol);
+
+   T X = fn * (A0 - x) / An;
+   T Y = fn * (A0 - y) / An;
+   T Z = -(X + Y) / 3;
+   T E2 = X * Y - 6 * Z * Z;
+   T E3 = (3 * X * Y - 8 * Z * Z) * Z;
+   T E4 = 3 * (X * Y - Z * Z) * Z * Z;
+   T E5 = X * Y * Z * Z * Z;
+
+   T result = fn * pow(An, T(-3) / 2) *
+      (1 - 3 * E2 / 14 + E3 / 6 + 9 * E2 * E2 / 88 - 3 * E4 / 22 - 9 * E2 * E3 / 52 + 3 * E5 / 26 - E2 * E2 * E2 / 16
+      + 3 * E3 * E3 / 40 + 3 * E2 * E4 / 20 + 45 * E2 * E2 * E3 / 272 - 9 * (E3 * E4 + E2 * E5) / 68);
+   result += 3 * RD_sum;
+
+   return result;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rd(T1 x, T2 y, T3 z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rd_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y),
+         static_cast<value_type>(z), pol), "boost::math::ellint_rd<%1%>(%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rd(T1 x, T2 y, T3 z)
+{
+   return ellint_rd(x, y, z, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RD_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_rf.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_rf.hpp
new file mode 100644
index 0000000..a8a7b4b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_rf.hpp
@@ -0,0 +1,174 @@
+//  Copyright (c) 2006 Xiaogang Zhang, 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to handle
+//  types longer than 80-bit reals.
+//  Updated 2015 to use Carlson's latest methods.
+//
+#ifndef BOOST_MATH_ELLINT_RF_HPP
+#define BOOST_MATH_ELLINT_RF_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/ellint_rc.hpp>
+
+// Carlson's elliptic integral of the first kind
+// R_F(x, y, z) = 0.5 * \int_{0}^{\infty} [(t+x)(t+y)(t+z)]^{-1/2} dt
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { namespace detail{
+
+   template <typename T, typename Policy>
+   T ellint_rf_imp(T x, T y, T z, const Policy& pol)
+   {
+      BOOST_MATH_STD_USING
+      using namespace boost::math;
+      using std::swap;
+
+      static const char* function = "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)";
+
+      if(x < 0 || y < 0 || z < 0)
+      {
+         return policies::raise_domain_error<T>(function,
+            "domain error, all arguments must be non-negative, "
+            "only sensible result is %1%.",
+            std::numeric_limits<T>::quiet_NaN(), pol);
+      }
+      if(x + y == 0 || y + z == 0 || z + x == 0)
+      {
+         return policies::raise_domain_error<T>(function,
+            "domain error, at most one argument can be zero, "
+            "only sensible result is %1%.",
+            std::numeric_limits<T>::quiet_NaN(), pol);
+      }
+      //
+      // Special cases from http://dlmf.nist.gov/19.20#i
+      //
+      if(x == y)
+      {
+         if(x == z)
+         {
+            // x, y, z equal:
+            return 1 / sqrt(x);
+         }
+         else
+         {
+            // 2 equal, x and y:
+            if(z == 0)
+               return constants::pi<T>() / (2 * sqrt(x));
+            else
+               return ellint_rc_imp(z, x, pol);
+         }
+      }
+      if(x == z)
+      {
+         if(y == 0)
+            return constants::pi<T>() / (2 * sqrt(x));
+         else
+            return ellint_rc_imp(y, x, pol);
+      }
+      if(y == z)
+      {
+         if(x == 0)
+            return constants::pi<T>() / (2 * sqrt(y));
+         else
+            return ellint_rc_imp(x, y, pol);
+      }
+      if(x == 0)
+         swap(x, z);
+      else if(y == 0)
+         swap(y, z);
+      if(z == 0)
+      {
+         //
+         // Special case for one value zero:
+         //
+         T xn = sqrt(x);
+         T yn = sqrt(y);
+
+         while(fabs(xn - yn) >= 2.7 * tools::root_epsilon<T>() * fabs(xn))
+         {
+            T t = sqrt(xn * yn);
+            xn = (xn + yn) / 2;
+            yn = t;
+         }
+         return constants::pi<T>() / (xn + yn);
+      }
+
+      T xn = x;
+      T yn = y;
+      T zn = z;
+      T An = (x + y + z) / 3;
+      T A0 = An;
+      T Q = pow(3 * boost::math::tools::epsilon<T>(), T(-1) / 8) * (std::max)((std::max)(fabs(An - xn), fabs(An - yn)), fabs(An - zn));
+      T fn = 1;
+
+
+      // duplication
+      unsigned k = 1;
+      for(; k < boost::math::policies::get_max_series_iterations<Policy>(); ++k)
+      {
+         T root_x = sqrt(xn);
+         T root_y = sqrt(yn);
+         T root_z = sqrt(zn);
+         T lambda = root_x * root_y + root_x * root_z + root_y * root_z;
+         An = (An + lambda) / 4;
+         xn = (xn + lambda) / 4;
+         yn = (yn + lambda) / 4;
+         zn = (zn + lambda) / 4;
+         Q /= 4;
+         fn *= 4;
+         if(Q < fabs(An))
+            break;
+      }
+      // Check to see if we gave up too soon:
+      policies::check_series_iterations<T>(function, k, pol);
+      BOOST_MATH_INSTRUMENT_VARIABLE(k);
+
+      T X = (A0 - x) / (An * fn);
+      T Y = (A0 - y) / (An * fn);
+      T Z = -X - Y;
+
+      // Taylor series expansion to the 7th order
+      T E2 = X * Y - Z * Z;
+      T E3 = X * Y * Z;
+      return (1 + E3 * (T(1) / 14 + 3 * E3 / 104) + E2 * (T(-1) / 10 + E2 / 24 - (3 * E3) / 44 - 5 * E2 * E2 / 208 + E2 * E3 / 16)) / sqrt(An);
+   }
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rf(T1 x, T2 y, T3 z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rf_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y),
+         static_cast<value_type>(z), pol), "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rf(T1 x, T2 y, T3 z)
+{
+   return ellint_rf(x, y, z, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RF_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_rg.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_rg.hpp
new file mode 100644
index 0000000..bb5b7c3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_rg.hpp
@@ -0,0 +1,136 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_MATH_ELLINT_RG_HPP
+#define BOOST_MATH_ELLINT_RG_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/pow.hpp>
+
+namespace boost { namespace math { namespace detail{
+
+   template <typename T, typename Policy>
+   T ellint_rg_imp(T x, T y, T z, const Policy& pol)
+   {
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)";
+
+      if(x < 0 || y < 0 || z < 0)
+      {
+         return policies::raise_domain_error<T>(function,
+            "domain error, all arguments must be non-negative, "
+            "only sensible result is %1%.",
+            std::numeric_limits<T>::quiet_NaN(), pol);
+      }
+      //
+      // Function is symmetric in x, y and z, but we require
+      // (x - z)(y - z) >= 0 to avoid cancellation error in the result
+      // which implies (for example) x >= z >= y
+      //
+      using std::swap;
+      if(x < y)
+         swap(x, y);
+      if(x < z)
+         swap(x, z);
+      if(y > z)
+         swap(y, z);
+      
+      BOOST_ASSERT(x >= z);
+      BOOST_ASSERT(z >= y);
+      //
+      // Special cases from http://dlmf.nist.gov/19.20#ii
+      //
+      if(x == z)
+      {
+         if(y == z)
+         {
+            // x = y = z
+            // This also works for x = y = z = 0 presumably.
+            return sqrt(x);
+         }
+         else if(y == 0)
+         {
+            // x = y, z = 0
+            return constants::pi<T>() * sqrt(x) / 4;
+         }
+         else
+         {
+            // x = z, y != 0
+            swap(x, y);
+            return (x == 0) ? T(sqrt(z) / 2) : T((z * ellint_rc_imp(x, z, pol) + sqrt(x)) / 2);
+         }
+      }
+      else if(y == z)
+      {
+         if(x == 0)
+            return constants::pi<T>() * sqrt(y) / 4;
+         else
+            return (y == 0) ? T(sqrt(x) / 2) : T((y * ellint_rc_imp(x, y, pol) + sqrt(x)) / 2);
+      }
+      else if(y == 0)
+      {
+         swap(y, z);
+         //
+         // Special handling for common case, from
+         // Numerical Computation of Real or Complex Elliptic Integrals, eq.46
+         //
+         T xn = sqrt(x);
+         T yn = sqrt(y);
+         T x0 = xn;
+         T y0 = yn;
+         T sum = 0;
+         T sum_pow = 0.25f;
+
+         while(fabs(xn - yn) >= 2.7 * tools::root_epsilon<T>() * fabs(xn))
+         {
+            T t = sqrt(xn * yn);
+            xn = (xn + yn) / 2;
+            yn = t;
+            sum_pow *= 2;
+            sum += sum_pow * boost::math::pow<2>(xn - yn);
+         }
+         T RF = constants::pi<T>() / (xn + yn);
+         return ((boost::math::pow<2>((x0 + y0) / 2) - sum) * RF) / 2;
+      }
+      return (z * ellint_rf_imp(x, y, z, pol)
+         - (x - z) * (y - z) * ellint_rd_imp(x, y, z, pol) / 3
+         + sqrt(x * y / z)) / 2;
+   }
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rg(T1 x, T2 y, T3 z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rg_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y),
+         static_cast<value_type>(z), pol), "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rg(T1 x, T2 y, T3 z)
+{
+   return ellint_rg(x, y, z, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RG_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/ellint_rj.hpp b/gatb-core/thirdparty/boost/math/special_functions/ellint_rj.hpp
new file mode 100644
index 0000000..ac39bed
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/ellint_rj.hpp
@@ -0,0 +1,302 @@
+//  Copyright (c) 2006 Xiaogang Zhang, 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to correctly
+//  handle the p < 0 case.
+//  Updated 2015 to use Carlson's latest methods.
+//
+
+#ifndef BOOST_MATH_ELLINT_RJ_HPP
+#define BOOST_MATH_ELLINT_RJ_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/ellint_rc.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+
+// Carlson's elliptic integral of the third kind
+// R_J(x, y, z, p) = 1.5 * \int_{0}^{\infty} (t+p)^{-1} [(t+x)(t+y)(t+z)]^{-1/2} dt
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { namespace detail{
+
+template <typename T, typename Policy>
+T ellint_rc1p_imp(T y, const Policy& pol)
+{
+   using namespace boost::math;
+   // Calculate RC(1, 1 + x)
+   BOOST_MATH_STD_USING
+
+  static const char* function = "boost::math::ellint_rc<%1%>(%1%,%1%)";
+
+   if(y == -1)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument y must not be zero but got %1%", y, pol);
+   }
+
+   // for 1 + y < 0, the integral is singular, return Cauchy principal value
+   T result;
+   if(y < -1)
+   {
+      result = sqrt(1 / -y) * detail::ellint_rc_imp(T(-y), T(-1 - y), pol);
+   }
+   else if(y == 0)
+   {
+      result = 1;
+   }
+   else if(y > 0)
+   {
+      result = atan(sqrt(y)) / sqrt(y);
+   }
+   else
+   {
+      if(y > -0.5)
+      {
+         T arg = sqrt(-y);
+         result = (boost::math::log1p(arg) - boost::math::log1p(-arg)) / (2 * sqrt(-y));
+      }
+      else
+      {
+         result = log((1 + sqrt(-y)) / sqrt(1 + y)) / sqrt(-y);
+      }
+   }
+   return result;
+}
+
+template <typename T, typename Policy>
+T ellint_rj_imp(T x, T y, T z, T p, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::ellint_rj<%1%>(%1%,%1%,%1%)";
+
+   if(x < 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument x must be non-negative, but got x = %1%", x, pol);
+   }
+   if(y < 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument y must be non-negative, but got y = %1%", y, pol);
+   }
+   if(z < 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument z must be non-negative, but got z = %1%", z, pol);
+   }
+   if(p == 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "Argument p must not be zero, but got p = %1%", p, pol);
+   }
+   if(x + y == 0 || y + z == 0 || z + x == 0)
+   {
+      return policies::raise_domain_error<T>(function,
+         "At most one argument can be zero, "
+         "only possible result is %1%.", std::numeric_limits<T>::quiet_NaN(), pol);
+   }
+
+   // for p < 0, the integral is singular, return Cauchy principal value
+   if(p < 0)
+   {
+      //
+      // We must ensure that x < y < z.
+      // Since the integral is symmetrical in x, y and z
+      // we can just permute the values:
+      //
+      if(x > y)
+         std::swap(x, y);
+      if(y > z)
+         std::swap(y, z);
+      if(x > y)
+         std::swap(x, y);
+
+      BOOST_ASSERT(x <= y);
+      BOOST_ASSERT(y <= z);
+
+      T q = -p;
+      p = (z * (x + y + q) - x * y) / (z + q);
+
+      BOOST_ASSERT(p >= 0);
+
+      T value = (p - z) * ellint_rj_imp(x, y, z, p, pol);
+      value -= 3 * ellint_rf_imp(x, y, z, pol);
+      value += 3 * sqrt((x * y * z) / (x * y + p * q)) * ellint_rc_imp(T(x * y + p * q), T(p * q), pol);
+      value /= (z + q);
+      return value;
+   }
+
+   //
+   // Special cases from http://dlmf.nist.gov/19.20#iii
+   //
+   if(x == y)
+   {
+      if(x == z)
+      {
+         if(x == p)
+         {
+            // All values equal:
+            return 1 / (x * sqrt(x));
+         }
+         else
+         {
+            // x = y = z:
+            return 3 * (ellint_rc_imp(x, p, pol) - 1 / sqrt(x)) / (x - p);
+         }
+      }
+      else
+      {
+         // x = y only, permute so y = z:
+         using std::swap;
+         swap(x, z);
+         if(y == p)
+         {
+            return ellint_rd_imp(x, y, y, pol);
+         }
+         else if((std::max)(y, p) / (std::min)(y, p) > 1.2)
+         {
+            return 3 * (ellint_rc_imp(x, y, pol) - ellint_rc_imp(x, p, pol)) / (p - y);
+         }
+         // Otherwise fall through to normal method, special case above will suffer too much cancellation...
+      }
+   }
+   if(y == z)
+   {
+      if(y == p)
+      {
+         // y = z = p:
+         return ellint_rd_imp(x, y, y, pol);
+      }
+      else if((std::max)(y, p) / (std::min)(y, p) > 1.2)
+      {
+         // y = z:
+         return 3 * (ellint_rc_imp(x, y, pol) - ellint_rc_imp(x, p, pol)) / (p - y);
+      }
+      // Otherwise fall through to normal method, special case above will suffer too much cancellation...
+   }
+   if(z == p)
+   {
+      return ellint_rd_imp(x, y, z, pol);
+   }
+
+   T xn = x;
+   T yn = y;
+   T zn = z;
+   T pn = p;
+   T An = (x + y + z + 2 * p) / 5;
+   T A0 = An;
+   T delta = (p - x) * (p - y) * (p - z);
+   T Q = pow(tools::epsilon<T>() / 5, -T(1) / 8) * (std::max)((std::max)(fabs(An - x), fabs(An - y)), (std::max)(fabs(An - z), fabs(An - p)));
+
+   unsigned n;
+   T lambda;
+   T Dn;
+   T En;
+   T rx, ry, rz, rp;
+   T fmn = 1; // 4^-n
+   T RC_sum = 0;
+
+   for(n = 0; n < policies::get_max_series_iterations<Policy>(); ++n)
+   {
+      rx = sqrt(xn);
+      ry = sqrt(yn);
+      rz = sqrt(zn);
+      rp = sqrt(pn);
+      Dn = (rp + rx) * (rp + ry) * (rp + rz);
+      En = delta / Dn;
+      En /= Dn;
+      if((En < -0.5) && (En > -1.5))
+      {
+         //
+         // Occationally En ~ -1, we then have no means of calculating
+         // RC(1, 1+En) without terrible cancellation error, so we
+         // need to get to 1+En directly.  By substitution we have
+         //
+         // 1+E_0 = 1 + (p-x)*(p-y)*(p-z)/((sqrt(p) + sqrt(x))*(sqrt(p)+sqrt(y))*(sqrt(p)+sqrt(z)))^2
+         //       = 2*sqrt(p)*(p+sqrt(x) * (sqrt(y)+sqrt(z)) + sqrt(y)*sqrt(z)) / ((sqrt(p) + sqrt(x))*(sqrt(p) + sqrt(y)*(sqrt(p)+sqrt(z))))
+         //
+         // And since this is just an application of the duplication formula for RJ, the same
+         // expression works for 1+En if we use x,y,z,p_n etc.
+         // This branch is taken only once or twice at the start of iteration,
+         // after than En reverts to it's usual very small values.
+         //
+         T b = 2 * rp * (pn + rx * (ry + rz) + ry * rz) / Dn;
+         RC_sum += fmn / Dn * detail::ellint_rc_imp(T(1), b, pol);
+      }
+      else
+      {
+         RC_sum += fmn / Dn * ellint_rc1p_imp(En, pol);
+      }
+      lambda = rx * ry + rx * rz + ry * rz;
+
+      // From here on we move to n+1:
+      An = (An + lambda) / 4;
+      fmn /= 4;
+
+      if(fmn * Q < An)
+         break;
+
+      xn = (xn + lambda) / 4;
+      yn = (yn + lambda) / 4;
+      zn = (zn + lambda) / 4;
+      pn = (pn + lambda) / 4;
+      delta /= 64;
+   }
+
+   T X = fmn * (A0 - x) / An;
+   T Y = fmn * (A0 - y) / An;
+   T Z = fmn * (A0 - z) / An;
+   T P = (-X - Y - Z) / 2;
+   T E2 = X * Y + X * Z + Y * Z - 3 * P * P;
+   T E3 = X * Y * Z + 2 * E2 * P + 4 * P * P * P;
+   T E4 = (2 * X * Y * Z + E2 * P + 3 * P * P * P) * P;
+   T E5 = X * Y * Z * P * P;
+   T result = fmn * pow(An, T(-3) / 2) *
+      (1 - 3 * E2 / 14 + E3 / 6 + 9 * E2 * E2 / 88 - 3 * E4 / 22 - 9 * E2 * E3 / 52 + 3 * E5 / 26 - E2 * E2 * E2 / 16
+      + 3 * E3 * E3 / 40 + 3 * E2 * E4 / 20 + 45 * E2 * E2 * E3 / 272 - 9 * (E3 * E4 + E2 * E5) / 68);
+
+   result += 6 * RC_sum;
+   return result;
+}
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class T4, class Policy>
+inline typename tools::promote_args<T1, T2, T3, T4>::type 
+   ellint_rj(T1 x, T2 y, T3 z, T4 p, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3, T4>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rj_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y),
+         static_cast<value_type>(z),
+         static_cast<value_type>(p),
+         pol), "boost::math::ellint_rj<%1%>(%1%,%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3, class T4>
+inline typename tools::promote_args<T1, T2, T3, T4>::type 
+   ellint_rj(T1 x, T2 y, T3 z, T4 p)
+{
+   return ellint_rj(x, y, z, p, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RJ_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/erf.hpp b/gatb-core/thirdparty/boost/math/special_functions/erf.hpp
new file mode 100644
index 0000000..f7f75b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/erf.hpp
@@ -0,0 +1,1155 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_ERF_HPP
+#define BOOST_MATH_SPECIAL_ERF_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/big_constant.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail
+{
+
+//
+// Asymptotic series for large z:
+//
+template <class T>
+struct erf_asympt_series_t
+{
+   erf_asympt_series_t(T z) : xx(2 * -z * z), tk(1)
+   {
+      BOOST_MATH_STD_USING
+      result = -exp(-z * z) / sqrt(boost::math::constants::pi<T>());
+      result /= z;
+   }
+
+   typedef T result_type;
+
+   T operator()()
+   {
+      BOOST_MATH_STD_USING
+      T r = result;
+      result *= tk / xx;
+      tk += 2;
+      if( fabs(r) < fabs(result))
+         result = 0;
+      return r;
+   }
+private:
+   T result;
+   T xx;
+   int tk;
+};
+//
+// How large z has to be in order to ensure that the series converges:
+//
+template <class T>
+inline float erf_asymptotic_limit_N(const T&)
+{
+   return (std::numeric_limits<float>::max)();
+}
+inline float erf_asymptotic_limit_N(const mpl::int_<24>&)
+{
+   return 2.8F;
+}
+inline float erf_asymptotic_limit_N(const mpl::int_<53>&)
+{
+   return 4.3F;
+}
+inline float erf_asymptotic_limit_N(const mpl::int_<64>&)
+{
+   return 4.8F;
+}
+inline float erf_asymptotic_limit_N(const mpl::int_<106>&)
+{
+   return 6.5F;
+}
+inline float erf_asymptotic_limit_N(const mpl::int_<113>&)
+{
+   return 6.8F;
+}
+
+template <class T, class Policy>
+inline T erf_asymptotic_limit()
+{
+   typedef typename policies::precision<T, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<24> >,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<0> >,
+         mpl::int_<0>,
+         mpl::int_<24>
+      >::type,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>,
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<106> >,
+               mpl::int_<106>,
+               typename mpl::if_<
+                  mpl::less_equal<precision_type, mpl::int_<113> >,
+                  mpl::int_<113>,
+                  mpl::int_<0>
+               >::type
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+   return erf_asymptotic_limit_N(tag_type());
+}
+
+template <class T, class Policy, class Tag>
+T erf_imp(T z, bool invert, const Policy& pol, const Tag& t)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_CODE("Generic erf_imp called");
+
+   if(z < 0)
+   {
+      if(!invert)
+         return -erf_imp(T(-z), invert, pol, t);
+      else
+         return 1 + erf_imp(T(-z), false, pol, t);
+   }
+
+   T result;
+
+   if(!invert && (z > detail::erf_asymptotic_limit<T, Policy>()))
+   {
+      detail::erf_asympt_series_t<T> s(z);
+      boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+      result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, 1);
+      policies::check_series_iterations<T>("boost::math::erf<%1%>(%1%, %1%)", max_iter, pol);
+   }
+   else
+   {
+      T x = z * z;
+      if(x < 0.6)
+      {
+         // Compute P:
+         result = z * exp(-x);
+         result /= sqrt(boost::math::constants::pi<T>());
+         if(result != 0)
+            result *= 2 * detail::lower_gamma_series(T(0.5f), x, pol);
+      }
+      else if(x < 1.1f)
+      {
+         // Compute Q:
+         invert = !invert;
+         result = tgamma_small_upper_part(T(0.5f), x, pol);
+         result /= sqrt(boost::math::constants::pi<T>());
+      }
+      else
+      {
+         // Compute Q:
+         invert = !invert;
+         result = z * exp(-x);
+         result /= sqrt(boost::math::constants::pi<T>());
+         result *= upper_gamma_fraction(T(0.5f), x, policies::get_epsilon<T, Policy>());
+      }
+   }
+   if(invert)
+      result = 1 - result;
+   return result;
+}
+
+template <class T, class Policy>
+T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<53>& t)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_CODE("53-bit precision erf_imp called");
+
+   if(z < 0)
+   {
+      if(!invert)
+         return -erf_imp(T(-z), invert, pol, t);
+      else if(z < -0.5)
+         return 2 - erf_imp(T(-z), invert, pol, t);
+      else
+         return 1 + erf_imp(T(-z), false, pol, t);
+   }
+
+   T result;
+
+   //
+   // Big bunch of selection statements now to pick
+   // which implementation to use,
+   // try to put most likely options first:
+   //
+   if(z < 0.5)
+   {
+      //
+      // We're going to calculate erf:
+      //
+      if(z < 1e-10)
+      {
+         if(z == 0)
+         {
+            result = T(0);
+         }
+         else
+         {
+            static const T c = BOOST_MATH_BIG_CONSTANT(T, 53, 0.003379167095512573896158903121545171688);
+            result = static_cast<T>(z * 1.125f + z * c);
+         }
+      }
+      else
+      {
+         // Maximum Deviation Found:                     1.561e-17
+         // Expected Error Term:                         1.561e-17
+         // Maximum Relative Change in Control Points:   1.155e-04
+         // Max Error found at double precision =        2.961182e-17
+
+         static const T Y = 1.044948577880859375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0834305892146531832907),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.338165134459360935041),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.0509990735146777432841),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.00772758345802133288487),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.000322780120964605683831),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.455004033050794024546),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0875222600142252549554),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00858571925074406212772),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.000370900071787748000569),
+         };
+         T zz = z * z;
+         result = z * (Y + tools::evaluate_polynomial(P, zz) / tools::evaluate_polynomial(Q, zz));
+      }
+   }
+   else if(invert ? (z < 28) : (z < 5.8f))
+   {
+      //
+      // We'll be calculating erfc:
+      //
+      invert = !invert;
+      if(z < 1.5f)
+      {
+         // Maximum Deviation Found:                     3.702e-17
+         // Expected Error Term:                         3.702e-17
+         // Maximum Relative Change in Control Points:   2.845e-04
+         // Max Error found at double precision =        4.841816e-17
+         static const T Y = 0.405935764312744140625f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.098090592216281240205),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.178114665841120341155),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.191003695796775433986),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0888900368967884466578),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0195049001251218801359),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00180424538297014223957),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.84759070983002217845),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.42628004845511324508),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.578052804889902404909),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.12385097467900864233),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0113385233577001411017),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.337511472483094676155e-5),
+         };
+         BOOST_MATH_INSTRUMENT_VARIABLE(Y);
+         BOOST_MATH_INSTRUMENT_VARIABLE(P[0]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(Q[0]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(z);
+         result = Y + tools::evaluate_polynomial(P, T(z - 0.5)) / tools::evaluate_polynomial(Q, T(z - 0.5));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         result *= exp(-z * z) / z;
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else if(z < 2.5f)
+      {
+         // Max Error found at double precision =        6.599585e-18
+         // Maximum Deviation Found:                     3.909e-18
+         // Expected Error Term:                         3.909e-18
+         // Maximum Relative Change in Control Points:   9.886e-05
+         static const T Y = 0.50672817230224609375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.0243500476207698441272),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0386540375035707201728),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.04394818964209516296),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0175679436311802092299),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00323962406290842133584),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.000235839115596880717416),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.53991494948552447182),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.982403709157920235114),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.325732924782444448493),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0563921837420478160373),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00410369723978904575884),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 1.5)) / tools::evaluate_polynomial(Q, T(z - 1.5));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 4.5f)
+      {
+         // Maximum Deviation Found:                     1.512e-17
+         // Expected Error Term:                         1.512e-17
+         // Maximum Relative Change in Control Points:   2.222e-04
+         // Max Error found at double precision =        2.062515e-17
+         static const T Y = 0.5405750274658203125f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00295276716530971662634),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0137384425896355332126),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00840807615555585383007),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00212825620914618649141),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.000250269961544794627958),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.113212406648847561139e-4),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.04217814166938418171),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.442597659481563127003),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0958492726301061423444),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0105982906484876531489),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.000479411269521714493907),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 3.5)) / tools::evaluate_polynomial(Q, T(z - 3.5));
+         result *= exp(-z * z) / z;
+      }
+      else
+      {
+         // Max Error found at double precision =        2.997958e-17
+         // Maximum Deviation Found:                     2.860e-17
+         // Expected Error Term:                         2.859e-17
+         // Maximum Relative Change in Control Points:   1.357e-05
+         static const T Y = 0.5579090118408203125f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.00628057170626964891937),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 0.0175389834052493308818),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.212652252872804219852),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -0.687717681153649930619),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -2.5518551727311523996),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -3.22729451764143718517),
+            BOOST_MATH_BIG_CONSTANT(T, 53, -2.8175401114513378771),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 2.79257750980575282228),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 11.0567237927800161565),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 15.930646027911794143),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 22.9367376522880577224),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 13.5064170191802889145),
+            BOOST_MATH_BIG_CONSTANT(T, 53, 5.48409182238641741584),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(1 / z)) / tools::evaluate_polynomial(Q, T(1 / z));
+         result *= exp(-z * z) / z;
+      }
+   }
+   else
+   {
+      //
+      // Any value of z larger than 28 will underflow to zero:
+      //
+      result = 0;
+      invert = !invert;
+   }
+
+   if(invert)
+   {
+      result = 1 - result;
+   }
+
+   return result;
+} // template <class T, class Lanczos>T erf_imp(T z, bool invert, const Lanczos& l, const mpl::int_<53>& t)
+
+
+template <class T, class Policy>
+T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<64>& t)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_CODE("64-bit precision erf_imp called");
+
+   if(z < 0)
+   {
+      if(!invert)
+         return -erf_imp(T(-z), invert, pol, t);
+      else if(z < -0.5)
+         return 2 - erf_imp(T(-z), invert, pol, t);
+      else
+         return 1 + erf_imp(T(-z), false, pol, t);
+   }
+
+   T result;
+
+   //
+   // Big bunch of selection statements now to pick which
+   // implementation to use, try to put most likely options
+   // first:
+   //
+   if(z < 0.5)
+   {
+      //
+      // We're going to calculate erf:
+      //
+      if(z == 0)
+      {
+         result = 0;
+      }
+      else if(z < 1e-10)
+      {
+         static const T c = BOOST_MATH_BIG_CONSTANT(T, 64, 0.003379167095512573896158903121545171688);
+         result = z * 1.125 + z * c;
+      }
+      else
+      {
+         // Max Error found at long double precision =   1.623299e-20
+         // Maximum Deviation Found:                     4.326e-22
+         // Expected Error Term:                         -4.326e-22
+         // Maximum Relative Change in Control Points:   1.474e-04
+         static const T Y = 1.044948577880859375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0834305892146531988966),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.338097283075565413695),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.0509602734406067204596),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.00904906346158537794396),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.000489468651464798669181),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.200305626366151877759e-4),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.455817300515875172439),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0916537354356241792007),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0102722652675910031202),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000650511752687851548735),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.189532519105655496778e-4),
+         };
+         result = z * (Y + tools::evaluate_polynomial(P, T(z * z)) / tools::evaluate_polynomial(Q, T(z * z)));
+      }
+   }
+   else if(invert ? (z < 110) : (z < 6.4f))
+   {
+      //
+      // We'll be calculating erfc:
+      //
+      invert = !invert;
+      if(z < 1.5)
+      {
+         // Max Error found at long double precision =   3.239590e-20
+         // Maximum Deviation Found:                     2.241e-20
+         // Expected Error Term:                         -2.241e-20
+         // Maximum Relative Change in Control Points:   5.110e-03
+         static const T Y = 0.405935764312744140625f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.0980905922162812031672),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.159989089922969141329),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.222359821619935712378),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.127303921703577362312),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0384057530342762400273),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00628431160851156719325),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000441266654514391746428),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.266689068336295642561e-7),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 2.03237474985469469291),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.78355454954969405222),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.867940326293760578231),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.248025606990021698392),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0396649631833002269861),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00279220237309449026796),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 0.5f)) / tools::evaluate_polynomial(Q, T(z - 0.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 2.5)
+      {
+         // Max Error found at long double precision =   3.686211e-21
+         // Maximum Deviation Found:                     1.495e-21
+         // Expected Error Term:                         -1.494e-21
+         // Maximum Relative Change in Control Points:   1.793e-04
+         static const T Y = 0.50672817230224609375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.024350047620769840217),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0343522687935671451309),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0505420824305544949541),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0257479325917757388209),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00669349844190354356118),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00090807914416099524444),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.515917266698050027934e-4),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.71657861671930336344),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.26409634824280366218),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.512371437838969015941),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.120902623051120950935),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0158027197831887485261),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.000897871370778031611439),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 1.5f)) / tools::evaluate_polynomial(Q, T(z - 1.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 4.5)
+      {
+         // Maximum Deviation Found:                     1.107e-20
+         // Expected Error Term:                         -1.106e-20
+         // Maximum Relative Change in Control Points:   1.709e-04
+         // Max Error found at long double precision =   1.446908e-20
+         static const T Y  = 0.5405750274658203125f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0029527671653097284033),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0141853245895495604051),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0104959584626432293901),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00343963795976100077626),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00059065441194877637899),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.523435380636174008685e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.189896043050331257262e-5),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.19352160185285642574),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.603256964363454392857),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.165411142458540585835),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0259729870946203166468),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00221657568292893699158),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.804149464190309799804e-4),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 3.5f)) / tools::evaluate_polynomial(Q, T(z - 3.5f));
+         result *= exp(-z * z) / z;
+      }
+      else
+      {
+         // Max Error found at long double precision =   7.961166e-21
+         // Maximum Deviation Found:                     6.677e-21
+         // Expected Error Term:                         6.676e-21
+         // Maximum Relative Change in Control Points:   2.319e-05
+         static const T Y = 0.55825519561767578125f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.00593438793008050214106),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 0.0280666231009089713937),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.141597835204583050043),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -0.978088201154300548842),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -5.47351527796012049443),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -13.8677304660245326627),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -27.1274948720539821722),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -29.2545152747009461519),
+            BOOST_MATH_BIG_CONSTANT(T, 64, -16.8865774499799676937),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 4.72948911186645394541),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 23.6750543147695749212),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 60.0021517335693186785),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 131.766251645149522868),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 178.167924971283482513),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 182.499390505915222699),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 104.365251479578577989),
+            BOOST_MATH_BIG_CONSTANT(T, 64, 30.8365511891224291717),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(1 / z)) / tools::evaluate_polynomial(Q, T(1 / z));
+         result *= exp(-z * z) / z;
+      }
+   }
+   else
+   {
+      //
+      // Any value of z larger than 110 will underflow to zero:
+      //
+      result = 0;
+      invert = !invert;
+   }
+
+   if(invert)
+   {
+      result = 1 - result;
+   }
+
+   return result;
+} // template <class T, class Lanczos>T erf_imp(T z, bool invert, const Lanczos& l, const mpl::int_<64>& t)
+
+
+template <class T, class Policy>
+T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<113>& t)
+{
+   BOOST_MATH_STD_USING
+
+   BOOST_MATH_INSTRUMENT_CODE("113-bit precision erf_imp called");
+
+   if(z < 0)
+   {
+      if(!invert)
+         return -erf_imp(T(-z), invert, pol, t);
+      else if(z < -0.5)
+         return 2 - erf_imp(T(-z), invert, pol, t);
+      else
+         return 1 + erf_imp(T(-z), false, pol, t);
+   }
+
+   T result;
+
+   //
+   // Big bunch of selection statements now to pick which
+   // implementation to use, try to put most likely options
+   // first:
+   //
+   if(z < 0.5)
+   {
+      //
+      // We're going to calculate erf:
+      //
+      if(z == 0)
+      {
+         result = 0;
+      }
+      else if(z < 1e-20)
+      {
+         static const T c = BOOST_MATH_BIG_CONSTANT(T, 113, 0.003379167095512573896158903121545171688);
+         result = z * 1.125 + z * c;
+      }
+      else
+      {
+         // Max Error found at long double precision =   2.342380e-35
+         // Maximum Deviation Found:                     6.124e-36
+         // Expected Error Term:                         -6.124e-36
+         // Maximum Relative Change in Control Points:   3.492e-10
+         static const T Y = 1.0841522216796875f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0442269454158250738961589031215451778),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.35549265736002144875335323556961233),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0582179564566667896225454670863270393),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0112694696904802304229950538453123925),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.000805730648981801146251825329609079099),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.566304966591936566229702842075966273e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.169655010425186987820201021510002265e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.344448249920445916714548295433198544e-7),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.466542092785657604666906909196052522),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.100005087012526447295176964142107611),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0128341535890117646540050072234142603),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00107150448466867929159660677016658186),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.586168368028999183607733369248338474e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.196230608502104324965623171516808796e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.313388521582925207734229967907890146e-7),
+         };
+         result = z * (Y + tools::evaluate_polynomial(P, T(z * z)) / tools::evaluate_polynomial(Q, T(z * z)));
+      }
+   }
+   else if(invert ? (z < 110) : (z < 8.65f))
+   {
+      //
+      // We'll be calculating erfc:
+      //
+      invert = !invert;
+      if(z < 1)
+      {
+         // Max Error found at long double precision =   3.246278e-35
+         // Maximum Deviation Found:                     1.388e-35
+         // Expected Error Term:                         1.387e-35
+         // Maximum Relative Change in Control Points:   6.127e-05
+         static const T Y = 0.371877193450927734375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0640320213544647969396032886581290455),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.200769874440155895637857443946706731),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.378447199873537170666487408805779826),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.30521399466465939450398642044975127),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.146890026406815277906781824723458196),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0464837937749539978247589252732769567),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00987895759019540115099100165904822903),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00137507575429025512038051025154301132),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0001144764551085935580772512359680516),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.436544865032836914773944382339900079e-5),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.47651182872457465043733800302427977),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.78706486002517996428836400245547955),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.87295924621659627926365005293130693),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.829375825174365625428280908787261065),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.251334771307848291593780143950311514),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0522110268876176186719436765734722473),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00718332151250963182233267040106902368),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000595279058621482041084986219276392459),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.226988669466501655990637599399326874e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.270666232259029102353426738909226413e-10),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 0.5f)) / tools::evaluate_polynomial(Q, T(z - 0.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 1.5)
+      {
+         // Max Error found at long double precision =   2.215785e-35
+         // Maximum Deviation Found:                     1.539e-35
+         // Expected Error Term:                         1.538e-35
+         // Maximum Relative Change in Control Points:   6.104e-05
+         static const T Y = 0.45658016204833984375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0289965858925328393392496555094848345),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0868181194868601184627743162571779226),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.169373435121178901746317404936356745),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.13350446515949251201104889028133486),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0617447837290183627136837688446313313),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0185618495228251406703152962489700468),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00371949406491883508764162050169531013),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000485121708792921297742105775823900772),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.376494706741453489892108068231400061e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.133166058052466262415271732172490045e-5),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.32970330146503867261275580968135126),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.46325715420422771961250513514928746),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.55307882560757679068505047390857842),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.644274289865972449441174485441409076),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.182609091063258208068606847453955649),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0354171651271241474946129665801606795),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00454060370165285246451879969534083997),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000349871943711566546821198612518656486),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.123749319840299552925421880481085392e-4),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 1.0f)) / tools::evaluate_polynomial(Q, T(z - 1.0f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 2.25)
+      {
+         // Maximum Deviation Found:                     1.418e-35
+         // Expected Error Term:                         1.418e-35
+         // Maximum Relative Change in Control Points:   1.316e-04
+         // Max Error found at long double precision =   1.998462e-35
+         static const T Y = 0.50250148773193359375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0201233630504573402185161184151016606),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0331864357574860196516686996302305002),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0716562720864787193337475444413405461),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0545835322082103985114927569724880658),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0236692635189696678976549720784989593),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00656970902163248872837262539337601845),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00120282643299089441390490459256235021),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000142123229065182650020762792081622986),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.991531438367015135346716277792989347e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.312857043762117596999398067153076051e-6),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.13506082409097783827103424943508554),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2.06399257267556230937723190496806215),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.18678481279932541314830499880691109),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.447733186643051752513538142316799562),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.11505680005657879437196953047542148),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.020163993632192726170219663831914034),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00232708971840141388847728782209730585),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000160733201627963528519726484608224112),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.507158721790721802724402992033269266e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.18647774409821470950544212696270639e-12),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 1.5f)) / tools::evaluate_polynomial(Q, T(z - 1.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if (z < 3)
+      {
+         // Maximum Deviation Found:                     3.575e-36
+         // Expected Error Term:                         3.575e-36
+         // Maximum Relative Change in Control Points:   7.103e-05
+         // Max Error found at long double precision =   5.794737e-36
+         static const T Y = 0.52896785736083984375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.00902152521745813634562524098263360074),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0145207142776691539346923710537580927),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0301681239582193983824211995978678571),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0215548540823305814379020678660434461),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00864683476267958365678294164340749949),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00219693096885585491739823283511049902),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000364961639163319762492184502159894371),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.388174251026723752769264051548703059e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.241918026931789436000532513553594321e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.676586625472423508158937481943649258e-7),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.93669171363907292305550231764920001),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.69468476144051356810672506101377494),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.880023580986436640372794392579985511),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.299099106711315090710836273697708402),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0690593962363545715997445583603382337),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0108427016361318921960863149875360222),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00111747247208044534520499324234317695),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.686843205749767250666787987163701209e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.192093541425429248675532015101904262e-5),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 2.25f)) / tools::evaluate_polynomial(Q, T(z - 2.25f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 3.5)
+      {
+         // Maximum Deviation Found:                     8.126e-37
+         // Expected Error Term:                         -8.126e-37
+         // Maximum Relative Change in Control Points:   1.363e-04
+         // Max Error found at long double precision =   1.747062e-36
+         static const T Y = 0.54037380218505859375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.0033703486408887424921155540591370375),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0104948043110005245215286678898115811),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0148530118504000311502310457390417795),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00816693029245443090102738825536188916),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00249716579989140882491939681805594585),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0004655591010047353023978045800916647),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.531129557920045295895085236636025323e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.343526765122727069515775194111741049e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.971120407556888763695313774578711839e-7),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.59911256167540354915906501335919317),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.136006830764025173864831382946934),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.468565867990030871678574840738423023),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.122821824954470343413956476900662236),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0209670914950115943338996513330141633),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00227845718243186165620199012883547257),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000144243326443913171313947613547085553),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.407763415954267700941230249989140046e-5),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 3.0f)) / tools::evaluate_polynomial(Q, T(z - 3.0f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 5.5)
+      {
+         // Maximum Deviation Found:                     5.804e-36
+         // Expected Error Term:                         -5.803e-36
+         // Maximum Relative Change in Control Points:   2.475e-05
+         // Max Error found at long double precision =   1.349545e-35
+         static const T Y = 0.55000019073486328125f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00118142849742309772151454518093813615),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0072201822885703318172366893469382745),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0078782276276860110721875733778481505),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00418229166204362376187593976656261146),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00134198400587769200074194304298642705),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000283210387078004063264777611497435572),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.405687064094911866569295610914844928e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.39348283801568113807887364414008292e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.248798540917787001526976889284624449e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.929502490223452372919607105387474751e-8),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.156161469668275442569286723236274457e-9),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.52955245103668419479878456656709381),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.06263944820093830054635017117417064),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.441684612681607364321013134378316463),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.121665258426166960049773715928906382),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0232134512374747691424978642874321434),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00310778180686296328582860464875562636),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000288361770756174705123674838640161693),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.177529187194133944622193191942300132e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.655068544833064069223029299070876623e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.11005507545746069573608988651927452e-7),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 4.5f)) / tools::evaluate_polynomial(Q, T(z - 4.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 7.5)
+      {
+         // Maximum Deviation Found:                     1.007e-36
+         // Expected Error Term:                         1.007e-36
+         // Maximum Relative Change in Control Points:   1.027e-03
+         // Max Error found at long double precision =   2.646420e-36
+         static const T Y = 0.5574436187744140625f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000293236907400849056269309713064107674),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00225110719535060642692275221961480162),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00190984458121502831421717207849429799),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000747757733460111743833929141001680706),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000170663175280949889583158597373928096),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.246441188958013822253071608197514058e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.229818000860544644974205957895688106e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.134886977703388748488480980637704864e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.454764611880548962757125070106650958e-8),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.673002744115866600294723141176820155e-10),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.12843690320861239631195353379313367),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.569900657061622955362493442186537259),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.169094404206844928112348730277514273),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0324887449084220415058158657252147063),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00419252877436825753042680842608219552),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00036344133176118603523976748563178578),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.204123895931375107397698245752850347e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.674128352521481412232785122943508729e-6),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.997637501418963696542159244436245077e-8),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z - 6.5f)) / tools::evaluate_polynomial(Q, T(z - 6.5f));
+         result *= exp(-z * z) / z;
+      }
+      else if(z < 11.5)
+      {
+         // Maximum Deviation Found:                     8.380e-36
+         // Expected Error Term:                         8.380e-36
+         // Maximum Relative Change in Control Points:   2.632e-06
+         // Max Error found at long double precision =   9.849522e-36
+         static const T Y = 0.56083202362060546875f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000282420728751494363613829834891390121),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00175387065018002823433704079355125161),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0021344978564889819420775336322920375),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00124151356560137532655039683963075661),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000423600733566948018555157026862139644),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.914030340865175237133613697319509698e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.126999927156823363353809747017945494e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.110610959842869849776179749369376402e-5),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.55075079477173482096725348704634529e-7),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.119735694018906705225870691331543806e-8),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.69889613396167354566098060039549882),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.28824647372749624464956031163282674),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.572297795434934493541628008224078717),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.164157697425571712377043857240773164),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.0315311145224594430281219516531649562),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00405588922155632380812945849777127458),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000336929033691445666232029762868642417),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.164033049810404773469413526427932109e-4),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.356615210500531410114914617294694857e-6),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(z / 2 - 4.75f)) / tools::evaluate_polynomial(Q, T(z / 2 - 4.75f));
+         result *= exp(-z * z) / z;
+      }
+      else
+      {
+         // Maximum Deviation Found:                     1.132e-35
+         // Expected Error Term:                         -1.132e-35
+         // Maximum Relative Change in Control Points:   4.674e-04
+         // Max Error found at long double precision =   1.162590e-35
+         static const T Y = 0.5632686614990234375f;
+         static const T P[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.000920922048732849448079451574171836943),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 0.00321439044532288750501700028748922439),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.250455263029390118657884864261823431),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -0.906807635364090342031792404764598142),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -8.92233572835991735876688745989985565),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -21.7797433494422564811782116907878495),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -91.1451915251976354349734589601171659),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -144.1279109655993927069052125017673),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -313.845076581796338665519022313775589),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -273.11378811923343424081101235736475),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -271.651566205951067025696102600443452),
+            BOOST_MATH_BIG_CONSTANT(T, 113, -60.0530577077238079968843307523245547),
+         };
+         static const T Q[] = {    
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 3.49040448075464744191022350947892036),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 34.3563592467165971295915749548313227),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 84.4993232033879023178285731843850461),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 376.005865281206894120659401340373818),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 629.95369438888946233003926191755125),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1568.35771983533158591604513304269098),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1646.02452040831961063640827116581021),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 2299.96860633240298708910425594484895),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 1222.73204392037452750381340219906374),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 799.359797306084372350264298361110448),
+            BOOST_MATH_BIG_CONSTANT(T, 113, 72.7415265778588087243442792401576737),
+         };
+         result = Y + tools::evaluate_polynomial(P, T(1 / z)) / tools::evaluate_polynomial(Q, T(1 / z));
+         result *= exp(-z * z) / z;
+      }
+   }
+   else
+   {
+      //
+      // Any value of z larger than 110 will underflow to zero:
+      //
+      result = 0;
+      invert = !invert;
+   }
+
+   if(invert)
+   {
+      result = 1 - result;
+   }
+
+   return result;
+} // template <class T, class Lanczos>T erf_imp(T z, bool invert, const Lanczos& l, const mpl::int_<113>& t)
+
+template <class T, class Policy, class tag>
+struct erf_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      static void do_init(const mpl::int_<0>&){}
+      static void do_init(const mpl::int_<53>&)
+      {
+         boost::math::erf(static_cast<T>(1e-12), Policy());
+         boost::math::erf(static_cast<T>(0.25), Policy());
+         boost::math::erf(static_cast<T>(1.25), Policy());
+         boost::math::erf(static_cast<T>(2.25), Policy());
+         boost::math::erf(static_cast<T>(4.25), Policy());
+         boost::math::erf(static_cast<T>(5.25), Policy());
+      }
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::erf(static_cast<T>(1e-12), Policy());
+         boost::math::erf(static_cast<T>(0.25), Policy());
+         boost::math::erf(static_cast<T>(1.25), Policy());
+         boost::math::erf(static_cast<T>(2.25), Policy());
+         boost::math::erf(static_cast<T>(4.25), Policy());
+         boost::math::erf(static_cast<T>(5.25), Policy());
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         boost::math::erf(static_cast<T>(1e-22), Policy());
+         boost::math::erf(static_cast<T>(0.25), Policy());
+         boost::math::erf(static_cast<T>(1.25), Policy());
+         boost::math::erf(static_cast<T>(2.125), Policy());
+         boost::math::erf(static_cast<T>(2.75), Policy());
+         boost::math::erf(static_cast<T>(3.25), Policy());
+         boost::math::erf(static_cast<T>(5.25), Policy());
+         boost::math::erf(static_cast<T>(7.25), Policy());
+         boost::math::erf(static_cast<T>(11.25), Policy());
+         boost::math::erf(static_cast<T>(12.5), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename erf_initializer<T, Policy, tag>::init erf_initializer<T, Policy, tag>::initializer;
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type erf(T z, const Policy& /* pol */)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_MATH_INSTRUMENT_CODE("result_type = " << typeid(result_type).name());
+   BOOST_MATH_INSTRUMENT_CODE("value_type = " << typeid(value_type).name());
+   BOOST_MATH_INSTRUMENT_CODE("precision_type = " << typeid(precision_type).name());
+
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   BOOST_MATH_INSTRUMENT_CODE("tag_type = " << typeid(tag_type).name());
+
+   detail::erf_initializer<value_type, forwarding_policy, tag_type>::force_instantiate(); // Force constants to be initialized before main
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::erf_imp(
+      static_cast<value_type>(z),
+      false,
+      forwarding_policy(),
+      tag_type()), "boost::math::erf<%1%>(%1%, %1%)");
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type erfc(T z, const Policy& /* pol */)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   BOOST_MATH_INSTRUMENT_CODE("result_type = " << typeid(result_type).name());
+   BOOST_MATH_INSTRUMENT_CODE("value_type = " << typeid(value_type).name());
+   BOOST_MATH_INSTRUMENT_CODE("precision_type = " << typeid(precision_type).name());
+
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   BOOST_MATH_INSTRUMENT_CODE("tag_type = " << typeid(tag_type).name());
+
+   detail::erf_initializer<value_type, forwarding_policy, tag_type>::force_instantiate(); // Force constants to be initialized before main
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::erf_imp(
+      static_cast<value_type>(z),
+      true,
+      forwarding_policy(),
+      tag_type()), "boost::math::erfc<%1%>(%1%, %1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type erf(T z)
+{
+   return boost::math::erf(z, policies::policy<>());
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type erfc(T z)
+{
+   return boost::math::erfc(z, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#include <boost/math/special_functions/detail/erf_inv.hpp>
+
+#endif // BOOST_MATH_SPECIAL_ERF_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/expint.hpp b/gatb-core/thirdparty/boost/math/special_functions/expint.hpp
new file mode 100644
index 0000000..c26420d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/expint.hpp
@@ -0,0 +1,1672 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_EXPINT_HPP
+#define BOOST_MATH_EXPINT_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/tools/fraction.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/digamma.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/pow.hpp>
+
+namespace boost{ namespace math{
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type
+   expint(unsigned n, T z, const Policy& /*pol*/);
+   
+namespace detail{
+
+template <class T>
+inline T expint_1_rational(const T& z, const mpl::int_<0>&)
+{
+   // this function is never actually called
+   BOOST_ASSERT(0);
+   return z;
+}
+
+template <class T>
+T expint_1_rational(const T& z, const mpl::int_<53>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(z <= 1)
+   {
+      // Maximum Deviation Found:                     2.006e-18
+      // Expected Error Term:                         2.006e-18
+      // Max error found at double precision:         2.760e-17
+      static const T Y = 0.66373538970947265625F;
+      static const T P[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0865197248079397976498),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0320913665303559189999),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.245088216639761496153),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0368031736257943745142),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00399167106081113256961),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.000111507792921197858394)
+      };
+      static const T Q[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.37091387659397013215),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.056770677104207528384),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00427347600017103698101),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.000131049900798434683324),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.528611029520217142048e-6)
+      };
+      result = tools::evaluate_polynomial(P, z) 
+         / tools::evaluate_polynomial(Q, z);
+      result += z - log(z) - Y;
+   }
+   else if(z < -boost::math::tools::log_min_value<T>())
+   {
+      // Maximum Deviation Found (interpolated):      1.444e-17
+      // Max error found at double precision:         3.119e-17
+      static const T P[11] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.121013190657725568138e-18),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.999999999999998811143),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -43.3058660811817946037),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -724.581482791462469795),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -6046.8250112711035463),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -27182.6254466733970467),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -66598.2652345418633509),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -86273.1567711649528784),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -54844.4587226402067411),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -14751.4895786128450662),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -1185.45720315201027667)
+      };
+      static const T Q[12] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 45.3058660811801465927),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 809.193214954550328455),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 7417.37624454689546708),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 38129.5594484818471461),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 113057.05869159631492),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 192104.047790227984431),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 180329.498380501819718),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 86722.3403467334749201),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 18455.4124737722049515),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1229.20784182403048905),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.776491285282330997549)
+      };
+      T recip = 1 / z;
+      result = 1 + tools::evaluate_polynomial(P, recip)
+         / tools::evaluate_polynomial(Q, recip);
+      result *= exp(-z) * recip;
+   }
+   else
+   {
+      result = 0;
+   }
+   return result;
+}
+
+template <class T>
+T expint_1_rational(const T& z, const mpl::int_<64>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(z <= 1)
+   {
+      // Maximum Deviation Found:                     3.807e-20
+      // Expected Error Term:                         3.807e-20
+      // Max error found at long double precision:    6.249e-20
+
+      static const T Y = 0.66373538970947265625F;
+      static const T P[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0865197248079397956816),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0275114007037026844633),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.246594388074877139824),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0237624819878732642231),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00259113319641673986276),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.30853660894346057053e-4)
+      };
+      static const T Q[7] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.317978365797784100273),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0393622602554758722511),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00204062029115966323229),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.732512107100088047854e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.202872781770207871975e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.52779248094603709945e-7)
+      };
+      result = tools::evaluate_polynomial(P, z) 
+         / tools::evaluate_polynomial(Q, z);
+      result += z - log(z) - Y;
+   }
+   else if(z < -boost::math::tools::log_min_value<T>())
+   {
+      // Maximum Deviation Found (interpolated):     2.220e-20
+      // Max error found at long double precision:   1.346e-19
+      static const T P[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.534401189080684443046e-23),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.999999999999999999905),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -62.1517806091379402505),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -1568.45688271895145277),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -21015.3431990874009619),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -164333.011755931661949),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -777917.270775426696103),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -2244188.56195255112937),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -3888702.98145335643429),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -3909822.65621952648353),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -2149033.9538897398457),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -584705.537139793925189),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -65815.2605361889477244),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -2038.82870680427258038)
+      };
+      static const T Q[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 64.1517806091379399478),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1690.76044393722763785),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 24035.9534033068949426),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 203679.998633572361706),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1074661.58459976978285),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 3586552.65020899358773),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 7552186.84989547621411),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 9853333.79353054111434),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 7689642.74550683631258),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 3385553.35146759180739),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 763218.072732396428725),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 73930.2995984054930821),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 2063.86994219629165937)
+      };
+      T recip = 1 / z;
+      result = 1 + tools::evaluate_polynomial(P, recip)
+         / tools::evaluate_polynomial(Q, recip);
+      result *= exp(-z) * recip;
+   }
+   else
+   {
+      result = 0;
+   }
+   return result;
+}
+
+template <class T>
+T expint_1_rational(const T& z, const mpl::int_<113>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(z <= 1)
+   {
+      // Maximum Deviation Found:                     2.477e-35
+      // Expected Error Term:                         2.477e-35
+      // Max error found at long double precision:    6.810e-35
+
+      static const T Y = 0.66373538970947265625F;
+      static const T P[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0865197248079397956434879099175975937),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0369066175910795772830865304506087759),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.24272036838415474665971599314725545),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0502166331248948515282379137550178307),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00768384138547489410285101483730424919),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.000612574337702109683505224915484717162),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.380207107950635046971492617061708534e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.136528159460768830763009294683628406e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.346839106212658259681029388908658618e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.340500302777838063940402160594523429e-9)
+      };
+      static const T Q[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.426568827778942588160423015589537302),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0841384046470893490592450881447510148),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0100557215850668029618957359471132995),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000799334870474627021737357294799839363),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.434452090903862735242423068552687688e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.15829674748799079874182885081231252e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.354406206738023762100882270033082198e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.369373328141051577845488477377890236e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.274149801370933606409282434677600112e-12)
+      };
+      result = tools::evaluate_polynomial(P, z) 
+         / tools::evaluate_polynomial(Q, z);
+      result += z - log(z) - Y;
+   }
+   else if(z <= 4)
+   {
+      // Max error in interpolated form:             5.614e-35
+      // Max error found at long double precision:   7.979e-35
+
+      static const T Y = 0.70190334320068359375F;
+
+      static const T P[16] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.298096656795020369955077350585959794),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 12.9314045995266142913135497455971247),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 226.144334921582637462526628217345501),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 2070.83670924261732722117682067381405),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 10715.1115684330959908244769731347186),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 30728.7876355542048019664777316053311),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 38520.6078609349855436936232610875297),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -27606.0780981527583168728339620565165),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -169026.485055785605958655247592604835),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -254361.919204983608659069868035092282),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -195765.706874132267953259272028679935),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -83352.6826013533205474990119962408675),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -19251.6828496869586415162597993050194),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -2226.64251774578542836725386936102339),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -109.009437301400845902228611986479816),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -1.51492042209561411434644938098833499)
+      };
+      static const T Q[16] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 46.734521442032505570517810766704587),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 908.694714348462269000247450058595655),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 9701.76053033673927362784882748513195),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 63254.2815292641314236625196594947774),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 265115.641285880437335106541757711092),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 732707.841188071900498536533086567735),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1348514.02492635723327306628712057794),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1649986.81455283047769673308781585991),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1326000.828522976970116271208812099),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 683643.09490612171772350481773951341),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 217640.505137263607952365685653352229),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 40288.3467237411710881822569476155485),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 3932.89353979531632559232883283175754),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 169.845369689596739824177412096477219),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 2.17607292280092201170768401876895354)
+      };
+      T recip = 1 / z;
+      result = Y + tools::evaluate_polynomial(P, recip)
+         / tools::evaluate_polynomial(Q, recip);
+      result *= exp(-z) * recip;
+   }
+   else if(z < -boost::math::tools::log_min_value<T>())
+   {
+      // Max error in interpolated form:             4.413e-35
+      // Max error found at long double precision:   8.928e-35
+
+      static const T P[19] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.559148411832951463689610809550083986e-40),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.999999999999999999999999999999999997),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -166.542326331163836642960118190147367),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -12204.639128796330005065904675153652),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -520807.069767086071806275022036146855),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -14435981.5242137970691490903863125326),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -274574945.737064301247496460758654196),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -3691611582.99810039356254671781473079),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -35622515944.8255047299363690814678763),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -248040014774.502043161750715548451142),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -1243190389769.53458416330946622607913),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -4441730126135.54739052731990368425339),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -11117043181899.7388524310281751971366),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -18976497615396.9717776601813519498961),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -21237496819711.1011661104761906067131),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -14695899122092.5161620333466757812848),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -5737221535080.30569711574295785864903),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -1077042281708.42654526404581272546244),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -68028222642.1941480871395695677675137)
+      };
+      static const T Q[20] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 168.542326331163836642960118190147311),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 12535.7237814586576783518249115343619),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 544891.263372016404143120911148640627),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 15454474.7241010258634446523045237762),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 302495899.896629522673410325891717381),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 4215565948.38886507646911672693270307),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 42552409471.7951815668506556705733344),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 313592377066.753173979584098301610186),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1688763640223.4541980740597514904542),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 6610992294901.59589748057620192145704),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 18601637235659.6059890851321772682606),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 36944278231087.2571020964163402941583),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 50425858518481.7497071917028793820058),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 45508060902865.0899967797848815980644),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 25649955002765.3817331501988304758142),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 8259575619094.6518520988612711292331),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1299981487496.12607474362723586264515),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 70242279152.8241187845178443118302693),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -37633302.9409263839042721539363416685)
+      };
+      T recip = 1 / z;
+      result = 1 + tools::evaluate_polynomial(P, recip)
+         / tools::evaluate_polynomial(Q, recip);
+      result *= exp(-z) * recip;
+   }
+   else
+   {
+      result = 0;
+   }
+   return result;
+}
+
+template <class T>
+struct expint_fraction
+{
+   typedef std::pair<T,T> result_type;
+   expint_fraction(unsigned n_, T z_) : b(n_ + z_), i(-1), n(n_){}
+   std::pair<T,T> operator()()
+   {
+      std::pair<T,T> result = std::make_pair(-static_cast<T>((i+1) * (n+i)), b);
+      b += 2;
+      ++i;
+      return result;
+   }
+private:
+   T b;
+   int i;
+   unsigned n;
+};
+
+template <class T, class Policy>
+inline T expint_as_fraction(unsigned n, T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   BOOST_MATH_INSTRUMENT_VARIABLE(z)
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   expint_fraction<T> f(n, z);
+   T result = tools::continued_fraction_b(
+      f, 
+      boost::math::policies::get_epsilon<T, Policy>(),
+      max_iter);
+   policies::check_series_iterations<T>("boost::math::expint_continued_fraction<%1%>(unsigned,%1%)", max_iter, pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   BOOST_MATH_INSTRUMENT_VARIABLE(max_iter)
+   result = exp(-z) / result;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   return result;
+}
+
+template <class T>
+struct expint_series
+{
+   typedef T result_type;
+   expint_series(unsigned k_, T z_, T x_k_, T denom_, T fact_) 
+      : k(k_), z(z_), x_k(x_k_), denom(denom_), fact(fact_){}
+   T operator()()
+   {
+      x_k *= -z;
+      denom += 1;
+      fact *= ++k;
+      return x_k / (denom * fact);
+   }
+private:
+   unsigned k;
+   T z;
+   T x_k;
+   T denom;
+   T fact;
+};
+
+template <class T, class Policy>
+inline T expint_as_series(unsigned n, T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(z)
+
+   T result = 0;
+   T x_k = -1;
+   T denom = T(1) - n;
+   T fact = 1;
+   unsigned k = 0;
+   for(; k < n - 1;)
+   {
+      result += x_k / (denom * fact);
+      denom += 1;
+      x_k *= -z;
+      fact *= ++k;
+   }
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result += pow(-z, static_cast<T>(n - 1)) 
+      * (boost::math::digamma(static_cast<T>(n)) - log(z)) / fact;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+
+   expint_series<T> s(k, z, x_k, denom, fact);
+   result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, result);
+   policies::check_series_iterations<T>("boost::math::expint_series<%1%>(unsigned,%1%)", max_iter, pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   BOOST_MATH_INSTRUMENT_VARIABLE(max_iter)
+   return result;
+}
+
+template <class T, class Policy, class Tag>
+T expint_imp(unsigned n, T z, const Policy& pol, const Tag& tag)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::expint<%1%>(unsigned, %1%)";
+   if(z < 0)
+      return policies::raise_domain_error<T>(function, "Function requires z >= 0 but got %1%.", z, pol);
+   if(z == 0)
+      return n == 1 ? policies::raise_overflow_error<T>(function, 0, pol) : T(1 / (static_cast<T>(n - 1)));
+
+   T result;
+
+   bool f;
+   if(n < 3)
+   {
+      f = z < 0.5;
+   }
+   else
+   {
+      f = z < (static_cast<T>(n - 2) / static_cast<T>(n - 1));
+   }
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4127) // conditional expression is constant
+#endif
+   if(n == 0)
+      result = exp(-z) / z;
+   else if((n == 1) && (Tag::value))
+   {
+      result = expint_1_rational(z, tag);
+   }
+   else if(f)
+      result = expint_as_series(n, z, pol);
+   else
+      result = expint_as_fraction(n, z, pol);
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+   return result;
+}
+
+template <class T>
+struct expint_i_series
+{
+   typedef T result_type;
+   expint_i_series(T z_) : k(0), z_k(1), z(z_){}
+   T operator()()
+   {
+      z_k *= z / ++k;
+      return z_k / k;
+   }
+private:
+   unsigned k;
+   T z_k;
+   T z;
+};
+
+template <class T, class Policy>
+T expint_i_as_series(T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T result = log(z); // (log(z) - log(1 / z)) / 2;
+   result += constants::euler<T>();
+   expint_i_series<T> s(z);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, result);
+   policies::check_series_iterations<T>("boost::math::expint_i_series<%1%>(%1%)", max_iter, pol);
+   return result;
+}
+
+template <class T, class Policy, class Tag>
+T expint_i_imp(T z, const Policy& pol, const Tag& tag)
+{
+   static const char* function = "boost::math::expint<%1%>(%1%)";
+   if(z < 0)
+      return -expint_imp(1, T(-z), pol, tag);
+   if(z == 0)
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+   return expint_i_as_series(z, pol);
+}
+
+template <class T, class Policy>
+T expint_i_imp(T z, const Policy& pol, const mpl::int_<53>& tag)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::expint<%1%>(%1%)";
+   if(z < 0)
+      return -expint_imp(1, T(-z), pol, tag);
+   if(z == 0)
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   T result;
+
+   if(z <= 6)
+   {
+      // Maximum Deviation Found:                     2.852e-18
+      // Expected Error Term:                         2.852e-18
+      // Max Error found at double precision =        Poly: 2.636335e-16   Cheb: 4.187027e-16
+      static const T P[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 2.98677224343598593013),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.356343618769377415068),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.780836076283730801839),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.114670926327032002811),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0499434773576515260534),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00726224593341228159561),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00115478237227804306827),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.000116419523609765200999),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.798296365679269702435e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.2777056254402008721e-6)
+      };
+      static const T Q[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -1.17090412365413911947),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.62215109846016746276),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.195114782069495403315),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0391523431392967238166),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00504800158663705747345),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.000389034007436065401822),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.138972589601781706598e-4)
+      };
+
+      static const T c1 = BOOST_MATH_BIG_CONSTANT(T, 53, 1677624236387711.0);
+      static const T c2 = BOOST_MATH_BIG_CONSTANT(T, 53, 4503599627370496.0);
+      static const T r1 = static_cast<T>(c1 / c2);
+      static const T r2 = BOOST_MATH_BIG_CONSTANT(T, 53, 0.131401834143860282009280387409357165515556574352422001206362e-16);
+      static const T r = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 53, 0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392));
+      T t = (z / 3) - 1;
+      result = tools::evaluate_polynomial(P, t) 
+         / tools::evaluate_polynomial(Q, t);
+      t = (z - r1) - r2;
+      result *= t;
+      if(fabs(t) < 0.1)
+      {
+         result += boost::math::log1p(t / r, pol);
+      }
+      else
+      {
+         result += log(z / r);
+      }
+   }
+   else if (z <= 10)
+   {
+      // Maximum Deviation Found:                     6.546e-17
+      // Expected Error Term:                         6.546e-17
+      // Max Error found at double precision =        Poly: 6.890169e-17   Cheb: 6.772128e-17
+      static const T Y = 1.158985137939453125F;
+      static const T P[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00139324086199402804173),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0349921221823888744966),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0264095520754134848538),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00761224003005476438412),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00247496209592143627977),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.000374885917942100256775),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.554086272024881826253e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.396487648924804510056e-5)
+      };
+      static const T Q[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.744625566823272107711),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.329061095011767059236),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.100128624977313872323),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0223851099128506347278),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00365334190742316650106),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.000402453408512476836472),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.263649630720255691787e-4)
+      };
+      T t = z / 2 - 4;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      result *= exp(z) / z;
+      result += z;
+   }
+   else if(z <= 20)
+   {
+      // Maximum Deviation Found:                     1.843e-17
+      // Expected Error Term:                         -1.842e-17
+      // Max Error found at double precision =        Poly: 4.375868e-17   Cheb: 5.860967e-17
+
+      static const T Y = 1.0869731903076171875F;
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00893891094356945667451),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0484607730127134045806),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0652810444222236895772),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0478447572647309671455),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0226059218923777094596),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00720603636917482065907),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00155941947035972031334),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.000209750022660200888349),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.138652200349182596186e-4)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.97017214039061194971),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.86232465043073157508),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.09601437090337519977),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.438873285773088870812),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.122537731979686102756),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0233458478275769288159),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00278170769163303669021),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.000159150281166108755531)
+      };
+      T t = z / 5 - 3;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      result *= exp(z) / z;
+      result += z;
+   }
+   else if(z <= 40)
+   {
+      // Maximum Deviation Found:                     5.102e-18
+      // Expected Error Term:                         5.101e-18
+      // Max Error found at double precision =        Poly: 1.441088e-16   Cheb: 1.864792e-16
+
+
+      static const T Y = 1.03937530517578125F;
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00356165148914447597995),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0229930320357982333406),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0449814350482277917716),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0453759383048193402336),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0272050837209380717069),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00994403059883350813295),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.00207592267812291726961),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.000192178045857733706044),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.113161784705911400295e-9)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 2.84354408840148561131),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 3.6599610090072393012),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 2.75088464344293083595),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.2985244073998398643),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.383213198510794507409),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.0651165455496281337831),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.00488071077519227853585)
+      };
+      T t = z / 10 - 3;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      result *= exp(z) / z;
+      result += z;
+   }
+   else
+   {
+      // Max Error found at double precision =        3.381886e-17
+      static const T exp40 = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 53, 2.35385266837019985407899910749034804508871617254555467236651e17));
+      static const T Y= 1.013065338134765625F;
+      static const T P[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, -0.0130653381347656243849),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 0.19029710559486576682),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 94.7365094537197236011),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -2516.35323679844256203),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 18932.0850014925993025),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -38703.1431362056714134)
+      };
+      static const T Q[7] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 61.9733592849439884145),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -2354.56211323420194283),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 22329.1459489893079041),
+         BOOST_MATH_BIG_CONSTANT(T, 53, -70126.245140396567133),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 54738.2833147775537106),
+         BOOST_MATH_BIG_CONSTANT(T, 53, 8297.16296356518409347)
+      };
+      T t = 1 / z;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      if(z < 41)
+         result *= exp(z) / z;
+      else
+      {
+         // Avoid premature overflow if we can:
+         t = z - 40;
+         if(t > tools::log_max_value<T>())
+         {
+            result = policies::raise_overflow_error<T>(function, 0, pol);
+         }
+         else
+         {
+            result *= exp(z - 40) / z;
+            if(result > tools::max_value<T>() / exp40)
+            {
+               result = policies::raise_overflow_error<T>(function, 0, pol);
+            }
+            else
+            {
+               result *= exp40;
+            }
+         }
+      }
+      result += z;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+T expint_i_imp(T z, const Policy& pol, const mpl::int_<64>& tag)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::expint<%1%>(%1%)";
+   if(z < 0)
+      return -expint_imp(1, T(-z), pol, tag);
+   if(z == 0)
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   T result;
+
+   if(z <= 6)
+   {
+      // Maximum Deviation Found:                     3.883e-21
+      // Expected Error Term:                         3.883e-21
+      // Max Error found at long double precision =   Poly: 3.344801e-19   Cheb: 4.989937e-19
+
+      static const T P[11] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 2.98677224343598593764),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.25891613550886736592),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.789323584998672832285),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.092432587824602399339),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0514236978728625906656),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00658477469745132977921),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00124914538197086254233),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000131429679565472408551),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.11293331317982763165e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.629499283139417444244e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.177833045143692498221e-7)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -1.20352377969742325748),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.66707904942606479811),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.223014531629140771914),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0493340022262908008636),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00741934273050807310677),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00074353567782087939294),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.455861727069603367656e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.131515429329812837701e-5)
+      };
+
+      static const T c1 = BOOST_MATH_BIG_CONSTANT(T, 64, 1677624236387711.0);
+      static const T c2 = BOOST_MATH_BIG_CONSTANT(T, 64, 4503599627370496.0);
+      static const T r1 = c1 / c2;
+      static const T r2 = BOOST_MATH_BIG_CONSTANT(T, 64, 0.131401834143860282009280387409357165515556574352422001206362e-16);
+      static const T r = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392));
+      T t = (z / 3) - 1;
+      result = tools::evaluate_polynomial(P, t) 
+         / tools::evaluate_polynomial(Q, t);
+      t = (z - r1) - r2;
+      result *= t;
+      if(fabs(t) < 0.1)
+      {
+         result += boost::math::log1p(t / r, pol);
+      }
+      else
+      {
+         result += log(z / r);
+      }
+   }
+   else if (z <= 10)
+   {
+      // Maximum Deviation Found:                     2.622e-21
+      // Expected Error Term:                         -2.622e-21
+      // Max Error found at long double precision =   Poly: 1.208328e-20   Cheb: 1.073723e-20
+
+      static const T Y = 1.158985137939453125F;
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00139324086199409049399),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0345238388952337563247),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0382065278072592940767),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0156117003070560727392),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00383276012430495387102),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000697070540945496497992),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.877310384591205930343e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.623067256376494930067e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.377246883283337141444e-6)
+      };
+      static const T Q[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.08073635708902053767),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.553681133533942532909),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.176763647137553797451),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0387891748253869928121),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0060603004848394727017),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000670519492939992806051),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.4947357050100855646e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.204339282037446434827e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.146951181174930425744e-7)
+      };
+      T t = z / 2 - 4;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      result *= exp(z) / z;
+      result += z;
+   }
+   else if(z <= 20)
+   {
+      // Maximum Deviation Found:                     3.220e-20
+      // Expected Error Term:                         3.220e-20
+      // Max Error found at long double precision =   Poly: 7.696841e-20   Cheb: 6.205163e-20
+
+
+      static const T Y = 1.0869731903076171875F;
+      static const T P[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00893891094356946995368),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0487562980088748775943),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0670568657950041926085),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0509577352851442932713),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.02551800927409034206),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00892913759760086687083),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00224469630207344379888),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000392477245911296982776),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.44424044184395578775e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.252788029251437017959e-5)
+      };
+      static const T Q[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 2.00323265503572414261),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.94688958187256383178),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.19733638134417472296),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.513137726038353385661),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.159135395578007264547),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0358233587351620919881),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0056716655597009417875),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000577048986213535829925),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.290976943033493216793e-4)
+      };
+      T t = z / 5 - 3;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      result *= exp(z) / z;
+      result += z;
+   }
+   else if(z <= 40)
+   {
+      // Maximum Deviation Found:                     2.940e-21
+      // Expected Error Term:                         -2.938e-21
+      // Max Error found at long double precision =   Poly: 3.419893e-19   Cheb: 3.359874e-19
+
+      static const T Y = 1.03937530517578125F;
+      static const T P[12] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00356165148914447278177),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0240235006148610849678),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0516699967278057976119),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0586603078706856245674),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0409960120868776180825),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0185485073689590665153),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00537842101034123222417),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000920988084778273760609),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.716742618812210980263e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.504623302166487346677e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.712662196671896837736e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.533769629702262072175e-11)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 3.13286733695729715455),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 4.49281223045653491929),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 3.84900294427622911374),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 2.15205199043580378211),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.802912186540269232424),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.194793170017818925388),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0280128013584653182994),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00182034930799902922549)
+      };
+      T t = z / 10 - 3;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      BOOST_MATH_INSTRUMENT_VARIABLE(result)
+      result *= exp(z) / z;
+      BOOST_MATH_INSTRUMENT_VARIABLE(result)
+      result += z;
+      BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   }
+   else
+   {
+      // Maximum Deviation Found:                     3.536e-20
+      // Max Error found at long double precision =   Poly: 1.310671e-19   Cheb: 8.630943e-11
+
+      static const T exp40 = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.35385266837019985407899910749034804508871617254555467236651e17));
+      static const T Y= 1.013065338134765625F;
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0130653381347656250004),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.644487780349757303739),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 143.995670348227433964),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -13918.9322758014173709),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 476260.975133624194484),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -7437102.15135982802122),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 53732298.8764767916542),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -160695051.957997452509),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 137839271.592778020028)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 27.2103343964943718802),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -8785.48528692879413676),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 397530.290000322626766),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -7356441.34957799368252),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 63050914.5343400957524),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -246143779.638307701369),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 384647824.678554961174),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -166288297.874583961493)
+      };
+      T t = 1 / z;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      if(z < 41)
+         result *= exp(z) / z;
+      else
+      {
+         // Avoid premature overflow if we can:
+         t = z - 40;
+         if(t > tools::log_max_value<T>())
+         {
+            result = policies::raise_overflow_error<T>(function, 0, pol);
+         }
+         else
+         {
+            result *= exp(z - 40) / z;
+            if(result > tools::max_value<T>() / exp40)
+            {
+               result = policies::raise_overflow_error<T>(function, 0, pol);
+            }
+            else
+            {
+               result *= exp40;
+            }
+         }
+      }
+      result += z;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+void expint_i_imp_113a(T& result, const T& z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     1.230e-36
+   // Expected Error Term:                         -1.230e-36
+   // Max Error found at long double precision =   Poly: 4.355299e-34   Cheb: 7.512581e-34
+
+
+   static const T P[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.98677224343598593765287235997328555),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.333256034674702967028780537349334037),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.851831522798101228384971644036708463),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0657854833494646206186773614110374948),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0630065662557284456000060708977935073),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00311759191425309373327784154659649232),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00176213568201493949664478471656026771),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.491548660404172089488535218163952295e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.207764227621061706075562107748176592e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.225445398156913584846374273379402765e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.996939977231410319761273881672601592e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.212546902052178643330520878928100847e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.154646053060262871360159325115980023e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.143971277122049197323415503594302307e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.306243138978114692252817805327426657e-13)
+   };
+   static const T Q[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -1.40178870313943798705491944989231793),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.943810968269701047641218856758605284),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.405026631534345064600850391026113165),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.123924153524614086482627660399122762),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0286364505373369439591132549624317707),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00516148845910606985396596845494015963),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000738330799456364820380739850924783649),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.843737760991856114061953265870882637e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.767957673431982543213661388914587589e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.549136847313854595809952100614840031e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.299801381513743676764008325949325404e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.118419479055346106118129130945423483e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.30372295663095470359211949045344607e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.382742953753485333207877784720070523e-12)
+   };
+
+   static const T c1 = BOOST_MATH_BIG_CONSTANT(T, 113, 1677624236387711.0);
+   static const T c2 = BOOST_MATH_BIG_CONSTANT(T, 113, 4503599627370496.0);
+   static const T c3 = BOOST_MATH_BIG_CONSTANT(T, 113, 266514582277687.0);
+   static const T c4 = BOOST_MATH_BIG_CONSTANT(T, 113, 4503599627370496.0);
+   static const T c5 = BOOST_MATH_BIG_CONSTANT(T, 113, 4503599627370496.0);
+   static const T r1 = c1 / c2;
+   static const T r2 = c3 / c4 / c5;
+   static const T r3 = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.283806480836357377069325311780969887585024578164571984232357e-31));
+   static const T r = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392));
+   T t = (z / 3) - 1;
+   result = tools::evaluate_polynomial(P, t) 
+      / tools::evaluate_polynomial(Q, t);
+   t = ((z - r1) - r2) - r3;
+   result *= t;
+   if(fabs(t) < 0.1)
+   {
+      result += boost::math::log1p(t / r, pol);
+   }
+   else
+   {
+      result += log(z / r);
+   }
+}
+
+template <class T>
+void expint_i_113b(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     7.779e-36
+   // Expected Error Term:                         -7.779e-36
+   // Max Error found at long double precision =   Poly: 2.576723e-35   Cheb: 1.236001e-34
+
+   static const T Y = 1.158985137939453125F;
+   static const T P[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00139324086199409049282472239613554817),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0338173111691991289178779840307998955),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0555972290794371306259684845277620556),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0378677976003456171563136909186202177),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0152221583517528358782902783914356667),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00428283334203873035104248217403126905),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000922782631491644846511553601323435286),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000155513428088853161562660696055496696),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.205756580255359882813545261519317096e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.220327406578552089820753181821115181e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.189483157545587592043421445645377439e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.122426571518570587750898968123803867e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.635187358949437991465353268374523944e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.203015132965870311935118337194860863e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.384276705503357655108096065452950822e-12)
+   };
+   static const T Q[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.58784732785354597996617046880946257),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.18550755302279446339364262338114098),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.55598993549661368604527040349702836),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.184290888380564236919107835030984453),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0459658051803613282360464632326866113),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0089505064268613225167835599456014705),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00139042673882987693424772855926289077),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000174210708041584097450805790176479012),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.176324034009707558089086875136647376e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.142935845999505649273084545313710581e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.907502324487057260675816233312747784e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.431044337808893270797934621235918418e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.139007266881450521776529705677086902e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.234715286125516430792452741830364672e-11)
+   };
+   T t = z / 2 - 4;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   result *= exp(z) / z;
+   result += z;
+}
+
+template <class T>
+void expint_i_113c(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     1.082e-34
+   // Expected Error Term:                         1.080e-34
+   // Max Error found at long double precision =   Poly: 1.958294e-34   Cheb: 2.472261e-34
+
+
+   static const T Y = 1.091579437255859375F;
+   static const T P[17] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00685089599550151282724924894258520532),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0443313550253580053324487059748497467),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.071538561252424027443296958795814874),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0622923153354102682285444067843300583),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0361631270264607478205393775461208794),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0153192826839624850298106509601033261),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00496967904961260031539602977748408242),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00126989079663425780800919171538920589),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000258933143097125199914724875206326698),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.422110326689204794443002330541441956e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.546004547590412661451073996127115221e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.546775260262202177131068692199272241e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.404157632825805803833379568956559215e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.200612596196561323832327013027419284e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.502538501472133913417609379765434153e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.326283053716799774936661568391296584e-13),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.869226483473172853557775877908693647e-15)
+   };
+   static const T Q[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.23227220874479061894038229141871087),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.40221000361027971895657505660959863),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.65476320985936174728238416007084214),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.816828602963895720369875535001248227),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.306337922909446903672123418670921066),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0902400121654409267774593230720600752),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0212708882169429206498765100993228086),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00404442626252467471957713495828165491),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0006195601618842253612635241404054589),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.755930932686543009521454653994321843e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.716004532773778954193609582677482803e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.500881663076471627699290821742924233e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.233593219218823384508105943657387644e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.554900353169148897444104962034267682e-9)
+   };
+   T t = z / 4 - 3.5;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   result *= exp(z) / z;
+   result += z;
+}
+
+template <class T>
+void expint_i_113d(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     3.163e-35
+   // Expected Error Term:                         3.163e-35
+   // Max Error found at long double precision =   Poly: 4.158110e-35   Cheb: 5.385532e-35
+
+   static const T Y = 1.051731109619140625F;
+   static const T P[14] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00144552494420652573815404828020593565),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0126747451594545338365684731262912741),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.01757394877502366717526779263438073),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0126838952395506921945756139424722588),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0060045057928894974954756789352443522),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00205349237147226126653803455793107903),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000532606040579654887676082220195624207),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000107344687098019891474772069139014662),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.169536802705805811859089949943435152e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.20863311729206543881826553010120078e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.195670358542116256713560296776654385e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.133291168587253145439184028259772437e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.595500337089495614285777067722823397e-9),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.133141358866324100955927979606981328e-10)
+   };
+   static const T Q[14] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.72490783907582654629537013560044682),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.44524329516800613088375685659759765),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.778241785539308257585068744978050181),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.300520486589206605184097270225725584),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0879346899691339661394537806057953957),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0200802415843802892793583043470125006),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00362842049172586254520256100538273214),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000519731362862955132062751246769469957),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.584092147914050999895178697392282665e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.501851497707855358002773398333542337e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.313085677467921096644895738538865537e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.127552010539733113371132321521204458e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.25737310826983451144405899970774587e-9)
+   };
+   T t = z / 4 - 5.5;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result *= exp(z) / z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result += z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+}
+
+template <class T>
+void expint_i_113e(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     7.972e-36
+   // Expected Error Term:                         7.962e-36
+   // Max Error found at long double precision =   Poly: 1.711721e-34   Cheb: 3.100018e-34
+
+   static const T Y = 1.032726287841796875F;
+   static const T P[15] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00141056919297307534690895009969373233),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0123384175302540291339020257071411437),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0298127270706864057791526083667396115),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0390686759471630584626293670260768098),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0338226792912607409822059922949035589),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0211659736179834946452561197559654582),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0100428887460879377373158821400070313),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00370717396015165148484022792801682932),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0010768667551001624764329000496561659),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000246127328761027039347584096573123531),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.437318110527818613580613051861991198e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.587532682329299591501065482317771497e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.565697065670893984610852937110819467e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.350233957364028523971768887437839573e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.105428907085424234504608142258423505e-8)
+   };
+   static const T Q[16] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.17261315255467581204685605414005525),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.85267952971640525245338392887217426),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.74341914912439861451492872946725151),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.31108463283559911602405970817931801),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.74657006336994649386607925179848899),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.718255607416072737965933040353653244),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.234037553177354542791975767960643864),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0607470145906491602476833515412605389),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0125048143774226921434854172947548724),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00201034366420433762935768458656609163),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000244823338417452367656368849303165721),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.213511655166983177960471085462540807e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.119323998465870686327170541547982932e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.322153582559488797803027773591727565e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.161635525318683508633792845159942312e-16)
+   };
+   T t = z / 8 - 4.25;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result *= exp(z) / z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result += z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+}
+
+template <class T>
+void expint_i_113f(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     4.469e-36
+   // Expected Error Term:                         4.468e-36
+   // Max Error found at long double precision =   Poly: 1.288958e-35   Cheb: 2.304586e-35
+
+   static const T Y = 1.0216197967529296875F;
+   static const T P[12] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000322999116096627043476023926572650045),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00385606067447365187909164609294113346),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00686514524727568176735949971985244415),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00606260649593050194602676772589601799),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00334382362017147544335054575436194357),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00126108534260253075708625583630318043),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000337881489347846058951220431209276776),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.648480902304640018785370650254018022e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.87652644082970492211455290209092766e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.794712243338068631557849449519994144e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.434084023639508143975983454830954835e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.107839681938752337160494412638656696e-8)
+   };
+   static const T Q[12] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.09913805456661084097134805151524958),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.07041755535439919593503171320431849),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.26406517226052371320416108604874734),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.529689923703770353961553223973435569),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.159578150879536711042269658656115746),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0351720877642000691155202082629857131),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00565313621289648752407123620997063122),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000646920278540515480093843570291218295),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.499904084850091676776993523323213591e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.233740058688179614344680531486267142e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.498800627828842754845418576305379469e-7)
+   };
+   T t = z / 7 - 7;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result *= exp(z) / z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result += z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+}
+
+template <class T>
+void expint_i_113g(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     5.588e-35
+   // Expected Error Term:                         -5.566e-35
+   // Max Error found at long double precision =   Poly: 9.976345e-35   Cheb: 8.358865e-35
+
+   static const T Y = 1.015148162841796875F;
+   static const T P[11] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000435714784725086961464589957142615216),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00432114324353830636009453048419094314),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0100740363285526177522819204820582424),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0116744115827059174392383504427640362),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00816145387784261141360062395898644652),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00371380272673500791322744465394211508),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.00112958263488611536502153195005736563),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.000228316462389404645183269923754256664),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.29462181955852860250359064291292577e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.21972450610957417963227028788460299e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.720558173805289167524715527536874694e-7)
+   };
+   static const T Q[11] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.95918362458402597039366979529287095),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.96472247520659077944638411856748924),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.15563251550528513747923714884142131),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.64674612007093983894215359287448334),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.58695020129846594405856226787156424),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.144358385319329396231755457772362793),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.024146911506411684815134916238348063),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0026257132337460784266874572001650153),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000167479843750859222348869769094711093),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.475673638665358075556452220192497036e-5)
+   };
+   T t = z / 14 - 5;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result *= exp(z) / z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+   result += z;
+   BOOST_MATH_INSTRUMENT_VARIABLE(result)
+}
+
+template <class T>
+void expint_i_113h(T& result, const T& z)
+{
+   BOOST_MATH_STD_USING
+   // Maximum Deviation Found:                     4.448e-36
+   // Expected Error Term:                         4.445e-36
+   // Max Error found at long double precision =   Poly: 2.058532e-35   Cheb: 2.165465e-27
+
+   static const T Y= 1.00849151611328125F;
+   static const T P[9] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0084915161132812500000001440233607358),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.84479378737716028341394223076147872),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -130.431146923726715674081563022115568),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4336.26945491571504885214176203512015),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -76279.0031974974730095170437591004177),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 729577.956271997673695191455111727774),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -3661928.69330208734947103004900349266),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8570600.041606912735872059184527855),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -6758379.93672362080947905580906028645)
+   };
+   static const T Q[10] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -99.4868026047611434569541483506091713),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3879.67753690517114249705089803055473),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -76495.82413252517165830203774900806),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 820773.726408311894342553758526282667),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -4803087.64956923577571031564909646579),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 14521246.227703545012713173740895477),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -19762752.0196769712258527849159393044),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8354144.67882768405803322344185185517),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 355076.853106511136734454134915432571)
+   };
+   T t = 1 / z;
+   result = Y + tools::evaluate_polynomial(P, t)
+      / tools::evaluate_polynomial(Q, t);
+   result *= exp(z) / z;
+   result += z;
+}
+
+template <class T, class Policy>
+T expint_i_imp(T z, const Policy& pol, const mpl::int_<113>& tag)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::expint<%1%>(%1%)";
+   if(z < 0)
+      return -expint_imp(1, T(-z), pol, tag);
+   if(z == 0)
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   T result;
+
+   if(z <= 6)
+   {
+      expint_i_imp_113a(result, z, pol);
+   }
+   else if (z <= 10)
+   {
+      expint_i_113b(result, z);
+   }
+   else if(z <= 18)
+   {
+      expint_i_113c(result, z);
+   }
+   else if(z <= 26)
+   {
+      expint_i_113d(result, z);
+   }
+   else if(z <= 42)
+   {
+      expint_i_113e(result, z);
+   }
+   else if(z <= 56)
+   {
+      expint_i_113f(result, z);
+   }
+   else if(z <= 84)
+   {
+      expint_i_113g(result, z);
+   }
+   else if(z <= 210)
+   {
+      expint_i_113h(result, z);
+   }
+   else // z > 210
+   {
+      // Maximum Deviation Found:                     3.963e-37
+      // Expected Error Term:                         3.963e-37
+      // Max Error found at long double precision =   Poly: 1.248049e-36   Cheb: 2.843486e-29
+
+      static const T exp40 = static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2.35385266837019985407899910749034804508871617254555467236651e17));
+      static const T Y= 1.00252532958984375F;
+      static const T P[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00252532958984375000000000000000000085),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.16591386866059087390621952073890359),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -67.8483431314018462417456828499277579),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1567.68688154683822956359536287575892),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -17335.4683325819116482498725687644986),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 93632.6567462673524739954389166550069),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -225025.189335919133214440347510936787),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 175864.614717440010942804684741336853)
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -65.6998869881600212224652719706425129),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1642.73850032324014781607859416890077),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -19937.2610222467322481947237312818575),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 124136.267326632742667972126625064538),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -384614.251466704550678760562965502293),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 523355.035910385688578278384032026998),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -217809.552260834025885677791936351294),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -8555.81719551123640677261226549550872)
+      };
+      T t = 1 / z;
+      result = Y + tools::evaluate_polynomial(P, t)
+         / tools::evaluate_polynomial(Q, t);
+      if(z < 41)
+         result *= exp(z) / z;
+      else
+      {
+         // Avoid premature overflow if we can:
+         t = z - 40;
+         if(t > tools::log_max_value<T>())
+         {
+            result = policies::raise_overflow_error<T>(function, 0, pol);
+         }
+         else
+         {
+            result *= exp(z - 40) / z;
+            if(result > tools::max_value<T>() / exp40)
+            {
+               result = policies::raise_overflow_error<T>(function, 0, pol);
+            }
+            else
+            {
+               result *= exp40;
+            }
+         }
+      }
+      result += z;
+   }
+   return result;
+}
+
+template <class T, class Policy, class tag>
+struct expint_i_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      static void do_init(const mpl::int_<0>&){}
+      static void do_init(const mpl::int_<53>&)
+      {
+         boost::math::expint(T(5));
+         boost::math::expint(T(7));
+         boost::math::expint(T(18));
+         boost::math::expint(T(38));
+         boost::math::expint(T(45));
+      }
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::expint(T(5));
+         boost::math::expint(T(7));
+         boost::math::expint(T(18));
+         boost::math::expint(T(38));
+         boost::math::expint(T(45));
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         boost::math::expint(T(5));
+         boost::math::expint(T(7));
+         boost::math::expint(T(17));
+         boost::math::expint(T(25));
+         boost::math::expint(T(40));
+         boost::math::expint(T(50));
+         boost::math::expint(T(80));
+         boost::math::expint(T(200));
+         boost::math::expint(T(220));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename expint_i_initializer<T, Policy, tag>::init expint_i_initializer<T, Policy, tag>::initializer;
+
+template <class T, class Policy, class tag>
+struct expint_1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      static void do_init(const mpl::int_<0>&){}
+      static void do_init(const mpl::int_<53>&)
+      {
+         boost::math::expint(1, T(0.5));
+         boost::math::expint(1, T(2));
+      }
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::expint(1, T(0.5));
+         boost::math::expint(1, T(2));
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         boost::math::expint(1, T(0.5));
+         boost::math::expint(1, T(2));
+         boost::math::expint(1, T(6));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename expint_1_initializer<T, Policy, tag>::init expint_1_initializer<T, Policy, tag>::initializer;
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type
+   expint_forwarder(T z, const Policy& /*pol*/, mpl::true_ const&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   expint_i_initializer<value_type, forwarding_policy, tag_type>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::expint_i_imp(
+      static_cast<value_type>(z),
+      forwarding_policy(),
+      tag_type()), "boost::math::expint<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type
+expint_forwarder(unsigned n, T z, const mpl::false_&)
+{
+   return boost::math::expint(n, z, policies::policy<>());
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type
+   expint(unsigned n, T z, const Policy& /*pol*/)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   detail::expint_1_initializer<value_type, forwarding_policy, tag_type>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::expint_imp(
+      n,
+      static_cast<value_type>(z),
+      forwarding_policy(),
+      tag_type()), "boost::math::expint<%1%>(unsigned, %1%)");
+}
+
+template <class T, class U>
+inline typename detail::expint_result<T, U>::type
+   expint(T const z, U const u)
+{
+   typedef typename policies::is_policy<U>::type tag_type;
+   return detail::expint_forwarder(z, u, tag_type());
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type
+   expint(T z)
+{
+   return expint(z, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_EXPINT_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/expm1.hpp b/gatb-core/thirdparty/boost/math/special_functions/expm1.hpp
new file mode 100644
index 0000000..7423dc5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/expm1.hpp
@@ -0,0 +1,343 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_EXPM1_INCLUDED
+#define BOOST_MATH_EXPM1_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <math.h> // platform's ::expm1
+#include <boost/limits.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/mpl/less_equal.hpp>
+
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#  include <boost/static_assert.hpp>
+#else
+#  include <boost/assert.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+namespace detail
+{
+  // Functor expm1_series returns the next term in the Taylor series
+  // x^k / k!
+  // each time that operator() is invoked.
+  //
+  template <class T>
+  struct expm1_series
+  {
+     typedef T result_type;
+
+     expm1_series(T x)
+        : k(0), m_x(x), m_term(1) {}
+
+     T operator()()
+     {
+        ++k;
+        m_term *= m_x;
+        m_term /= k;
+        return m_term;
+     }
+
+     int count()const
+     {
+        return k;
+     }
+
+  private:
+     int k;
+     const T m_x;
+     T m_term;
+     expm1_series(const expm1_series&);
+     expm1_series& operator=(const expm1_series&);
+  };
+
+template <class T, class Policy, class tag>
+struct expm1_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      template <int N>
+      static void do_init(const mpl::int_<N>&){}
+      static void do_init(const mpl::int_<64>&)
+      {
+         expm1(T(0.5));
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         expm1(T(0.5));
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename expm1_initializer<T, Policy, tag>::init expm1_initializer<T, Policy, tag>::initializer;
+
+//
+// Algorithm expm1 is part of C99, but is not yet provided by many compilers.
+//
+// This version uses a Taylor series expansion for 0.5 > |x| > epsilon.
+//
+template <class T, class Policy>
+T expm1_imp(T x, const mpl::int_<0>&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T a = fabs(x);
+   if(a > T(0.5f))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
+      return exp(x) - T(1);
+   }
+   if(a < tools::epsilon<T>())
+      return x;
+   detail::expm1_series<T> s(x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) && !BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
+   T result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter);
+#else
+   T zero = 0;
+   T result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, zero);
+#endif
+   policies::check_series_iterations<T>("boost::math::expm1<%1%>(%1%)", max_iter, pol);
+   return result;
+}
+
+template <class T, class P>
+T expm1_imp(T x, const mpl::int_<53>&, const P& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T a = fabs(x);
+   if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
+      return exp(x) - T(1);
+   }
+   if(a < tools::epsilon<T>())
+      return x;
+
+   static const float Y = 0.10281276702880859e1f;
+   static const T n[] = { static_cast<T>(-0.28127670288085937e-1), static_cast<T>(0.51278186299064534e0), static_cast<T>(-0.6310029069350198e-1), static_cast<T>(0.11638457975729296e-1), static_cast<T>(-0.52143390687521003e-3), static_cast<T>(0.21491399776965688e-4) };
+   static const T d[] = { 1, static_cast<T>(-0.45442309511354755e0), static_cast<T>(0.90850389570911714e-1), static_cast<T>(-0.10088963629815502e-1), static_cast<T>(0.63003407478692265e-3), static_cast<T>(-0.17976570003654402e-4) };
+
+   T result = x * Y + x * tools::evaluate_polynomial(n, x) / tools::evaluate_polynomial(d, x);
+   return result;
+}
+
+template <class T, class P>
+T expm1_imp(T x, const mpl::int_<64>&, const P& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T a = fabs(x);
+   if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
+      return exp(x) - T(1);
+   }
+   if(a < tools::epsilon<T>())
+      return x;
+
+   static const float Y = 0.10281276702880859375e1f;
+   static const T n[] = { 
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.281276702880859375e-1), 
+       BOOST_MATH_BIG_CONSTANT(T, 64, 0.512980290285154286358e0), 
+       BOOST_MATH_BIG_CONSTANT(T, 64, -0.667758794592881019644e-1),
+       BOOST_MATH_BIG_CONSTANT(T, 64, 0.131432469658444745835e-1),
+       BOOST_MATH_BIG_CONSTANT(T, 64, -0.72303795326880286965e-3),
+       BOOST_MATH_BIG_CONSTANT(T, 64, 0.447441185192951335042e-4),
+       BOOST_MATH_BIG_CONSTANT(T, 64, -0.714539134024984593011e-6)
+   };
+   static const T d[] = { 
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.461477618025562520389e0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.961237488025708540713e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.116483957658204450739e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.873308008461557544458e-3),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.387922804997682392562e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.807473180049193557294e-6)
+   };
+
+   T result = x * Y + x * tools::evaluate_polynomial(n, x) / tools::evaluate_polynomial(d, x);
+   return result;
+}
+
+template <class T, class P>
+T expm1_imp(T x, const mpl::int_<113>&, const P& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T a = fabs(x);
+   if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
+      return exp(x) - T(1);
+   }
+   if(a < tools::epsilon<T>())
+      return x;
+
+   static const float Y = 0.10281276702880859375e1f;
+   static const T n[] = { 
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.28127670288085937499999999999999999854e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.51278156911210477556524452177540792214e0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.63263178520747096729500254678819588223e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.14703285606874250425508446801230572252e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.8675686051689527802425310407898459386e-3),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.88126359618291165384647080266133492399e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.25963087867706310844432390015463138953e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.14226691087800461778631773363204081194e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.15995603306536496772374181066765665596e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.45261820069007790520447958280473183582e-10)
+   };
+   static const T d[] = { 
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.45441264709074310514348137469214538853e0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.96827131936192217313133611655555298106e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.12745248725908178612540554584374876219e-1),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.11473613871583259821612766907781095472e-2),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.73704168477258911962046591907690764416e-4),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.34087499397791555759285503797256103259e-5),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.11114024704296196166272091230695179724e-6),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.23987051614110848595909588343223896577e-8),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.29477341859111589208776402638429026517e-10),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.13222065991022301420255904060628100924e-12)
+   };
+
+   T result = x * Y + x * tools::evaluate_polynomial(n, x) / tools::evaluate_polynomial(d, x);
+   return result;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type expm1(T x, const Policy& /* pol */)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   typedef typename mpl::if_c<
+      ::std::numeric_limits<result_type>::is_specialized == 0,
+      mpl::int_<0>,  // no numeric_limits, use generic solution
+      typename mpl::if_<
+         typename mpl::less_equal<precision_type, mpl::int_<53> >::type,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            typename mpl::less_equal<precision_type, mpl::int_<64> >::type,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               typename mpl::less_equal<precision_type, mpl::int_<113> >::type,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+
+   detail::expm1_initializer<value_type, forwarding_policy, tag_type>::force_instantiate();
+   
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::expm1_imp(
+      static_cast<value_type>(x),
+      tag_type(), forwarding_policy()), "boost::math::expm1<%1%>(%1%)");
+}
+
+#ifdef expm1
+#  ifndef BOOST_HAS_expm1
+#     define BOOST_HAS_expm1
+#  endif
+#  undef expm1
+#endif
+
+#if defined(BOOST_HAS_EXPM1) && !(defined(__osf__) && defined(__DECCXX_VER))
+#  ifdef BOOST_MATH_USE_C99
+inline float expm1(float x, const policies::policy<>&){ return ::expm1f(x); }
+#     ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+inline long double expm1(long double x, const policies::policy<>&){ return ::expm1l(x); }
+#     endif
+#  else
+inline float expm1(float x, const policies::policy<>&){ return static_cast<float>(::expm1(x)); }
+#  endif
+inline double expm1(double x, const policies::policy<>&){ return ::expm1(x); }
+#endif
+
+template <class T>
+inline typename tools::promote_args<T>::type expm1(T x)
+{
+   return expm1(x, policies::policy<>());
+}
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+inline float expm1(float z)
+{
+   return expm1<float>(z);
+}
+inline double expm1(double z)
+{
+   return expm1<double>(z);
+}
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+inline long double expm1(long double z)
+{
+   return expm1<long double>(z);
+}
+#endif
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_HYPOT_INCLUDED
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/factorials.hpp b/gatb-core/thirdparty/boost/math/special_functions/factorials.hpp
new file mode 100644
index 0000000..e36a098
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/factorials.hpp
@@ -0,0 +1,268 @@
+//  Copyright John Maddock 2006, 2010.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SP_FACTORIALS_HPP
+#define BOOST_MATH_SP_FACTORIALS_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/detail/unchecked_factorial.hpp>
+#include <boost/array.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push) // Temporary until lexical cast fixed.
+#pragma warning(disable: 4127 4701)
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/config/no_tr1/cmath.hpp>
+
+namespace boost { namespace math
+{
+
+template <class T, class Policy>
+inline T factorial(unsigned i, const Policy& pol)
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   // factorial<unsigned int>(n) is not implemented
+   // because it would overflow integral type T for too small n
+   // to be useful. Use instead a floating-point type,
+   // and convert to an unsigned type if essential, for example:
+   // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n));
+   // See factorial documentation for more detail.
+
+   BOOST_MATH_STD_USING // Aid ADL for floor.
+
+   if(i <= max_factorial<T>::value)
+      return unchecked_factorial<T>(i);
+   T result = boost::math::tgamma(static_cast<T>(i+1), pol);
+   if(result > tools::max_value<T>())
+      return result; // Overflowed value! (But tgamma will have signalled the error already).
+   return floor(result + 0.5f);
+}
+
+template <class T>
+inline T factorial(unsigned i)
+{
+   return factorial<T>(i, policies::policy<>());
+}
+/*
+// Can't have these in a policy enabled world?
+template<>
+inline float factorial<float>(unsigned i)
+{
+   if(i <= max_factorial<float>::value)
+      return unchecked_factorial<float>(i);
+   return tools::overflow_error<float>(BOOST_CURRENT_FUNCTION);
+}
+
+template<>
+inline double factorial<double>(unsigned i)
+{
+   if(i <= max_factorial<double>::value)
+      return unchecked_factorial<double>(i);
+   return tools::overflow_error<double>(BOOST_CURRENT_FUNCTION);
+}
+*/
+template <class T, class Policy>
+T double_factorial(unsigned i, const Policy& pol)
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   BOOST_MATH_STD_USING  // ADL lookup of std names
+   if(i & 1)
+   {
+      // odd i:
+      if(i < max_factorial<T>::value)
+      {
+         unsigned n = (i - 1) / 2;
+         return ceil(unchecked_factorial<T>(i) / (ldexp(T(1), (int)n) * unchecked_factorial<T>(n)) - 0.5f);
+      }
+      //
+      // Fallthrough: i is too large to use table lookup, try the
+      // gamma function instead.
+      //
+      T result = boost::math::tgamma(static_cast<T>(i) / 2 + 1, pol) / sqrt(constants::pi<T>());
+      if(ldexp(tools::max_value<T>(), -static_cast<int>(i+1) / 2) > result)
+         return ceil(result * ldexp(T(1), static_cast<int>(i+1) / 2) - 0.5f);
+   }
+   else
+   {
+      // even i:
+      unsigned n = i / 2;
+      T result = factorial<T>(n, pol);
+      if(ldexp(tools::max_value<T>(), -(int)n) > result)
+         return result * ldexp(T(1), (int)n);
+   }
+   //
+   // If we fall through to here then the result is infinite:
+   //
+   return policies::raise_overflow_error<T>("boost::math::double_factorial<%1%>(unsigned)", 0, pol);
+}
+
+template <class T>
+inline T double_factorial(unsigned i)
+{
+   return double_factorial<T>(i, policies::policy<>());
+}
+
+namespace detail{
+
+template <class T, class Policy>
+T rising_factorial_imp(T x, int n, const Policy& pol)
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   if(x < 0)
+   {
+      //
+      // For x less than zero, we really have a falling
+      // factorial, modulo a possible change of sign.
+      //
+      // Note that the falling factorial isn't defined
+      // for negative n, so we'll get rid of that case
+      // first:
+      //
+      bool inv = false;
+      if(n < 0)
+      {
+         x += n;
+         n = -n;
+         inv = true;
+      }
+      T result = ((n&1) ? -1 : 1) * falling_factorial(-x, n, pol);
+      if(inv)
+         result = 1 / result;
+      return result;
+   }
+   if(n == 0)
+      return 1;
+   if(x == 0)
+   {
+      if(n < 0)
+         return -boost::math::tgamma_delta_ratio(x + 1, static_cast<T>(-n), pol);
+      else
+         return 0;
+   }
+   if((x < 1) && (x + n < 0))
+   {
+      T val = boost::math::tgamma_delta_ratio(1 - x, static_cast<T>(-n), pol);
+      return (n & 1) ? T(-val) : val;
+   }
+   //
+   // We don't optimise this for small n, because
+   // tgamma_delta_ratio is alreay optimised for that
+   // use case:
+   //
+   return 1 / boost::math::tgamma_delta_ratio(x, static_cast<T>(n), pol);
+}
+
+template <class T, class Policy>
+inline T falling_factorial_imp(T x, unsigned n, const Policy& pol)
+{
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
+   BOOST_MATH_STD_USING // ADL of std names
+   if((x == 0) && (n >= 0))
+      return 0;
+   if(x < 0)
+   {
+      //
+      // For x < 0 we really have a rising factorial
+      // modulo a possible change of sign:
+      //
+      return (n&1 ? -1 : 1) * rising_factorial(-x, n, pol);
+   }
+   if(n == 0)
+      return 1;
+   if(x < 0.5f)
+   {
+      //
+      // 1 + x below will throw away digits, so split up calculation:
+      //
+      if(n > max_factorial<T>::value - 2)
+      {
+         // If the two end of the range are far apart we have a ratio of two very large
+         // numbers, split the calculation up into two blocks:
+         T t1 = x * boost::math::falling_factorial(x - 1, max_factorial<T>::value - 2);
+         T t2 = boost::math::falling_factorial(x - max_factorial<T>::value + 1, n - max_factorial<T>::value + 1);
+         if(tools::max_value<T>() / fabs(t1) < fabs(t2))
+            return boost::math::sign(t1) * boost::math::sign(t2) * policies::raise_overflow_error<T>("boost::math::falling_factorial<%1%>", 0, pol);
+         return t1 * t2;
+      }
+      return x * boost::math::falling_factorial(x - 1, n - 1);
+   }
+   if(x <= n - 1)
+   {
+      //
+      // x+1-n will be negative and tgamma_delta_ratio won't
+      // handle it, split the product up into three parts:
+      //
+      T xp1 = x + 1;
+      unsigned n2 = itrunc((T)floor(xp1), pol);
+      if(n2 == xp1)
+         return 0;
+      T result = boost::math::tgamma_delta_ratio(xp1, -static_cast<T>(n2), pol);
+      x -= n2;
+      result *= x;
+      ++n2;
+      if(n2 < n)
+         result *= falling_factorial(x - 1, n - n2, pol);
+      return result;
+   }
+   //
+   // Simple case: just the ratio of two
+   // (positive argument) gamma functions.
+   // Note that we don't optimise this for small n,
+   // because tgamma_delta_ratio is alreay optimised
+   // for that use case:
+   //
+   return boost::math::tgamma_delta_ratio(x + 1, -static_cast<T>(n), pol);
+}
+
+} // namespace detail
+
+template <class RT>
+inline typename tools::promote_args<RT>::type
+   falling_factorial(RT x, unsigned n)
+{
+   typedef typename tools::promote_args<RT>::type result_type;
+   return detail::falling_factorial_imp(
+      static_cast<result_type>(x), n, policies::policy<>());
+}
+
+template <class RT, class Policy>
+inline typename tools::promote_args<RT>::type
+   falling_factorial(RT x, unsigned n, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT>::type result_type;
+   return detail::falling_factorial_imp(
+      static_cast<result_type>(x), n, pol);
+}
+
+template <class RT>
+inline typename tools::promote_args<RT>::type
+   rising_factorial(RT x, int n)
+{
+   typedef typename tools::promote_args<RT>::type result_type;
+   return detail::rising_factorial_imp(
+      static_cast<result_type>(x), n, policies::policy<>());
+}
+
+template <class RT, class Policy>
+inline typename tools::promote_args<RT>::type
+   rising_factorial(RT x, int n, const Policy& pol)
+{
+   typedef typename tools::promote_args<RT>::type result_type;
+   return detail::rising_factorial_imp(
+      static_cast<result_type>(x), n, pol);
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SP_FACTORIALS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/fpclassify.hpp b/gatb-core/thirdparty/boost/math/special_functions/fpclassify.hpp
new file mode 100644
index 0000000..8e75fae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/fpclassify.hpp
@@ -0,0 +1,606 @@
+//  Copyright John Maddock 2005-2008.
+//  Copyright (c) 2006-2008 Johan Rade
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_FPCLASSIFY_HPP
+#define BOOST_MATH_FPCLASSIFY_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <math.h>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/fp_traits.hpp>
+/*!
+  \file fpclassify.hpp
+  \brief Classify floating-point value as normal, subnormal, zero, infinite, or NaN.
+  \version 1.0
+  \author John Maddock
+ */
+
+/*
+
+1. If the platform is C99 compliant, then the native floating point
+classification functions are used.  However, note that we must only
+define the functions which call std::fpclassify etc if that function
+really does exist: otherwise a compiler may reject the code even though
+the template is never instantiated.
+
+2. If the platform is not C99 compliant, and the binary format for
+a floating point type (float, double or long double) can be determined
+at compile time, then the following algorithm is used:
+
+        If all exponent bits, the flag bit (if there is one),
+        and all significand bits are 0, then the number is zero.
+
+        If all exponent bits and the flag bit (if there is one) are 0,
+        and at least one significand bit is 1, then the number is subnormal.
+
+        If all exponent bits are 1 and all significand bits are 0,
+        then the number is infinity.
+
+        If all exponent bits are 1 and at least one significand bit is 1,
+        then the number is a not-a-number.
+
+        Otherwise the number is normal.
+
+        This algorithm works for the IEEE 754 representation,
+        and also for several non IEEE 754 formats.
+
+    Most formats have the structure
+        sign bit + exponent bits + significand bits.
+
+    A few have the structure
+        sign bit + exponent bits + flag bit + significand bits.
+    The flag bit is 0 for zero and subnormal numbers,
+        and 1 for normal numbers and NaN.
+        It is 0 (Motorola 68K) or 1 (Intel) for infinity.
+
+    To get the bits, the four or eight most significant bytes are copied
+    into an uint32_t or uint64_t and bit masks are applied.
+    This covers all the exponent bits and the flag bit (if there is one),
+    but not always all the significand bits.
+    Some of the functions below have two implementations,
+    depending on whether all the significand bits are copied or not.
+
+3. If the platform is not C99 compliant, and the binary format for
+a floating point type (float, double or long double) can not be determined
+at compile time, then comparison with std::numeric_limits values
+is used.
+
+*/
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#include <float.h>
+#endif
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+  namespace std{ using ::abs; using ::fabs; }
+#endif
+
+namespace boost{
+
+//
+// This must not be located in any namespace under boost::math
+// otherwise we can get into an infinite loop if isnan is
+// a #define for "isnan" !
+//
+namespace math_detail{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4800)
+#endif
+
+template <class T>
+inline bool is_nan_helper(T t, const boost::true_type&)
+{
+#ifdef isnan
+   return isnan(t);
+#elif defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY) || !defined(BOOST_HAS_FPCLASSIFY)
+   (void)t;
+   return false;
+#else // BOOST_HAS_FPCLASSIFY
+   return (BOOST_FPCLASSIFY_PREFIX fpclassify(t) == (int)FP_NAN);
+#endif
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class T>
+inline bool is_nan_helper(T, const boost::false_type&)
+{
+   return false;
+}
+
+}
+
+namespace math{
+
+namespace detail{
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const native_tag&)
+{
+   return (std::fpclassify)(t);
+}
+#endif
+
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const generic_tag<true>&)
+{
+   BOOST_MATH_INSTRUMENT_VARIABLE(t);
+
+   // whenever possible check for Nan's first:
+#if defined(BOOST_HAS_FPCLASSIFY)  && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+   if(::boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
+      return FP_NAN;
+#elif defined(isnan)
+   if(boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
+      return FP_NAN;
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
+   if(::_isnan(boost::math::tools::real_cast<double>(t)))
+      return FP_NAN;
+#endif
+   // std::fabs broken on a few systems especially for long long!!!!
+   T at = (t < T(0)) ? -t : t;
+
+   // Use a process of exclusion to figure out
+   // what kind of type we have, this relies on
+   // IEEE conforming reals that will treat
+   // Nan's as unordered.  Some compilers
+   // don't do this once optimisations are
+   // turned on, hence the check for nan's above.
+   if(at <= (std::numeric_limits<T>::max)())
+   {
+      if(at >= (std::numeric_limits<T>::min)())
+         return FP_NORMAL;
+      return (at != 0) ? FP_SUBNORMAL : FP_ZERO;
+   }
+   else if(at > (std::numeric_limits<T>::max)())
+      return FP_INFINITE;
+   return FP_NAN;
+}
+
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const generic_tag<false>&)
+{
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   if(std::numeric_limits<T>::is_specialized)
+      return fpclassify_imp(t, generic_tag<true>());
+#endif
+   //
+   // An unknown type with no numeric_limits support,
+   // so what are we supposed to do we do here?
+   //
+   BOOST_MATH_INSTRUMENT_VARIABLE(t);
+
+   return t == 0 ? FP_ZERO : FP_NORMAL;
+}
+
+template<class T>
+int fpclassify_imp BOOST_NO_MACRO_EXPAND(T x, ieee_copy_all_bits_tag)
+{
+   typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   BOOST_DEDUCED_TYPENAME traits::bits a;
+   traits::get_bits(x,a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   a &= traits::exponent | traits::flag | traits::significand;
+   BOOST_MATH_INSTRUMENT_VARIABLE((traits::exponent | traits::flag | traits::significand));
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+
+   if(a <= traits::significand) {
+      if(a == 0)
+         return FP_ZERO;
+      else
+         return FP_SUBNORMAL;
+   }
+
+   if(a < traits::exponent) return FP_NORMAL;
+
+   a &= traits::significand;
+   if(a == 0) return FP_INFINITE;
+
+   return FP_NAN;
+}
+
+template<class T>
+int fpclassify_imp BOOST_NO_MACRO_EXPAND(T x, ieee_copy_leading_bits_tag)
+{
+   typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   BOOST_DEDUCED_TYPENAME traits::bits a;
+   traits::get_bits(x,a);
+   a &= traits::exponent | traits::flag | traits::significand;
+
+   if(a <= traits::significand) {
+      if(x == 0)
+         return FP_ZERO;
+      else
+         return FP_SUBNORMAL;
+   }
+
+   if(a < traits::exponent) return FP_NORMAL;
+
+   a &= traits::significand;
+   traits::set_bits(x,a);
+   if(x == 0) return FP_INFINITE;
+
+   return FP_NAN;
+}
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && (defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY) || defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS))
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::fpclassify_imp(t, generic_tag<true>());
+}
+#endif
+
+}  // namespace detail
+
+template <class T>
+inline int fpclassify BOOST_NO_MACRO_EXPAND(T t)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename tools::promote_args_permissive<T>::type value_type;
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   if(std::numeric_limits<T>::is_specialized && detail::is_generic_tag_false(static_cast<method*>(0)))
+      return detail::fpclassify_imp(static_cast<value_type>(t), detail::generic_tag<true>());
+   return detail::fpclassify_imp(static_cast<value_type>(t), method());
+#else
+   return detail::fpclassify_imp(static_cast<value_type>(t), method());
+#endif
+}
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+template <>
+inline int fpclassify<long double> BOOST_NO_MACRO_EXPAND(long double t)
+{
+   typedef detail::fp_traits<long double>::type traits;
+   typedef traits::method method;
+   typedef long double value_type;
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   if(std::numeric_limits<long double>::is_specialized && detail::is_generic_tag_false(static_cast<method*>(0)))
+      return detail::fpclassify_imp(static_cast<value_type>(t), detail::generic_tag<true>());
+   return detail::fpclassify_imp(static_cast<value_type>(t), method());
+#else
+   return detail::fpclassify_imp(static_cast<value_type>(t), method());
+#endif
+}
+#endif
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T>
+    inline bool isfinite_impl(T x, native_tag const&)
+    {
+        return (std::isfinite)(x);
+    }
+#endif
+
+    template<class T>
+    inline bool isfinite_impl(T x, generic_tag<true> const&)
+    {
+        return x >= -(std::numeric_limits<T>::max)()
+            && x <= (std::numeric_limits<T>::max)();
+    }
+
+    template<class T>
+    inline bool isfinite_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isfinite_impl(x, generic_tag<true>());
+#endif
+       (void)x; // warning suppression.
+       return true;
+    }
+
+    template<class T>
+    inline bool isfinite_impl(T x, ieee_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent;
+        return a != traits::exponent;
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+inline bool isfinite_impl BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isfinite_impl(t, generic_tag<true>());
+}
+#endif
+
+}
+
+template<class T>
+inline bool (isfinite)(T x)
+{ //!< \brief return true if floating-point type t is finite.
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   // typedef typename boost::is_floating_point<T>::type fp_tag;
+   typedef typename tools::promote_args_permissive<T>::type value_type;
+   return detail::isfinite_impl(static_cast<value_type>(x), method());
+}
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+template<>
+inline bool (isfinite)(long double x)
+{ //!< \brief return true if floating-point type t is finite.
+   typedef detail::fp_traits<long double>::type traits;
+   typedef traits::method method;
+   //typedef boost::is_floating_point<long double>::type fp_tag;
+   typedef long double value_type;
+   return detail::isfinite_impl(static_cast<value_type>(x), method());
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T>
+    inline bool isnormal_impl(T x, native_tag const&)
+    {
+        return (std::isnormal)(x);
+    }
+#endif
+
+    template<class T>
+    inline bool isnormal_impl(T x, generic_tag<true> const&)
+    {
+        if(x < 0) x = -x;
+        return x >= (std::numeric_limits<T>::min)()
+            && x <= (std::numeric_limits<T>::max)();
+    }
+
+    template<class T>
+    inline bool isnormal_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isnormal_impl(x, generic_tag<true>());
+#endif
+       return !(x == 0);
+    }
+
+    template<class T>
+    inline bool isnormal_impl(T x, ieee_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::flag;
+        return (a != 0) && (a < traits::exponent);
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+inline bool isnormal_impl BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isnormal_impl(t, generic_tag<true>());
+}
+#endif
+
+}
+
+template<class T>
+inline bool (isnormal)(T x)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   //typedef typename boost::is_floating_point<T>::type fp_tag;
+   typedef typename tools::promote_args_permissive<T>::type value_type;
+   return detail::isnormal_impl(static_cast<value_type>(x), method());
+}
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+template<>
+inline bool (isnormal)(long double x)
+{
+   typedef detail::fp_traits<long double>::type traits;
+   typedef traits::method method;
+   //typedef boost::is_floating_point<long double>::type fp_tag;
+   typedef long double value_type;
+   return detail::isnormal_impl(static_cast<value_type>(x), method());
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T>
+    inline bool isinf_impl(T x, native_tag const&)
+    {
+        return (std::isinf)(x);
+    }
+#endif
+
+    template<class T>
+    inline bool isinf_impl(T x, generic_tag<true> const&)
+    {
+        (void)x; // in case the compiler thinks that x is unused because std::numeric_limits<T>::has_infinity is false
+        return std::numeric_limits<T>::has_infinity
+            && ( x == std::numeric_limits<T>::infinity()
+                 || x == -std::numeric_limits<T>::infinity());
+    }
+
+    template<class T>
+    inline bool isinf_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isinf_impl(x, generic_tag<true>());
+#endif
+        (void)x; // warning suppression.
+        return false;
+    }
+
+    template<class T>
+    inline bool isinf_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        return a == traits::exponent;
+    }
+
+    template<class T>
+    inline bool isinf_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        if(a != traits::exponent)
+            return false;
+
+        traits::set_bits(x,0);
+        return x == 0;
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+inline bool isinf_impl BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isinf_impl(t, generic_tag<true>());
+}
+#endif
+
+}   // namespace detail
+
+template<class T>
+inline bool (isinf)(T x)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   // typedef typename boost::is_floating_point<T>::type fp_tag;
+   typedef typename tools::promote_args_permissive<T>::type value_type;
+   return detail::isinf_impl(static_cast<value_type>(x), method());
+}
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+template<>
+inline bool (isinf)(long double x)
+{
+   typedef detail::fp_traits<long double>::type traits;
+   typedef traits::method method;
+   //typedef boost::is_floating_point<long double>::type fp_tag;
+   typedef long double value_type;
+   return detail::isinf_impl(static_cast<value_type>(x), method());
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T>
+    inline bool isnan_impl(T x, native_tag const&)
+    {
+        return (std::isnan)(x);
+    }
+#endif
+
+    template<class T>
+    inline bool isnan_impl(T x, generic_tag<true> const&)
+    {
+        return std::numeric_limits<T>::has_infinity
+            ? !(x <= std::numeric_limits<T>::infinity())
+            : x != x;
+    }
+
+    template<class T>
+    inline bool isnan_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isnan_impl(x, generic_tag<true>());
+#endif
+        (void)x; // warning suppression
+        return false;
+    }
+
+    template<class T>
+    inline bool isnan_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        return a > traits::exponent;
+    }
+
+    template<class T>
+    inline bool isnan_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+
+        a &= traits::exponent | traits::significand;
+        if(a < traits::exponent)
+            return false;
+
+        a &= traits::significand;
+        traits::set_bits(x,a);
+        return x != 0;
+    }
+
+}   // namespace detail
+
+template<class T>
+inline bool (isnan)(T x)
+{ //!< \brief return true if floating-point type t is NaN (Not A Number).
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   // typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::isnan_impl(x, method());
+}
+
+#ifdef isnan
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<float>(float t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<double>(double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<long double>(long double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+#elif defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+template<>
+inline bool (isnan)(long double x)
+{ //!< \brief return true if floating-point type t is NaN (Not A Number).
+   typedef detail::fp_traits<long double>::type traits;
+   typedef traits::method method;
+   //typedef boost::is_floating_point<long double>::type fp_tag;
+   return detail::isnan_impl(x, method());
+}
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_FPCLASSIFY_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/gamma.hpp b/gatb-core/thirdparty/boost/math/special_functions/gamma.hpp
new file mode 100644
index 0000000..1db1e4c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/gamma.hpp
@@ -0,0 +1,2035 @@
+
+//  Copyright John Maddock 2006-7, 2013-14.
+//  Copyright Paul A. Bristow 2007, 2013-14.
+//  Copyright Nikhar Agrawal 2013-14
+//  Copyright Christopher Kormanyos 2013-14
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_GAMMA_HPP
+#define BOOST_MATH_SF_GAMMA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/fraction.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/powm1.hpp>
+#include <boost/math/special_functions/sqrt1pm1.hpp>
+#include <boost/math/special_functions/lanczos.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/detail/igamma_large.hpp>
+#include <boost/math/special_functions/detail/unchecked_factorial.hpp>
+#include <boost/math/special_functions/detail/lgamma_small.hpp>
+#include <boost/math/special_functions/bernoulli.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/assert.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/greater.hpp>
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <algorithm>
+
+#ifdef BOOST_MSVC
+# pragma warning(push)
+# pragma warning(disable: 4702) // unreachable code (return after domain_error throw).
+# pragma warning(disable: 4127) // conditional expression is constant.
+# pragma warning(disable: 4100) // unreferenced formal parameter.
+// Several variables made comments,
+// but some difficulty as whether referenced on not may depend on macro values.
+// So to be safe, 4100 warnings suppressed.
+// TODO - revisit this?
+#endif
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T>
+inline bool is_odd(T v, const boost::true_type&)
+{
+   int i = static_cast<int>(v);
+   return i&1;
+}
+template <class T>
+inline bool is_odd(T v, const boost::false_type&)
+{
+   // Oh dear can't cast T to int!
+   BOOST_MATH_STD_USING
+   T modulus = v - 2 * floor(v/2);
+   return static_cast<bool>(modulus != 0);
+}
+template <class T>
+inline bool is_odd(T v)
+{
+   return is_odd(v, ::boost::is_convertible<T, int>());
+}
+
+template <class T>
+T sinpx(T z)
+{
+   // Ad hoc function calculates x * sin(pi * x),
+   // taking extra care near when x is near a whole number.
+   BOOST_MATH_STD_USING
+   int sign = 1;
+   if(z < 0)
+   {
+      z = -z;
+   }
+   T fl = floor(z);
+   T dist;
+   if(is_odd(fl))
+   {
+      fl += 1;
+      dist = fl - z;
+      sign = -sign;
+   }
+   else
+   {
+      dist = z - fl;
+   }
+   BOOST_ASSERT(fl >= 0);
+   if(dist > 0.5)
+      dist = 1 - dist;
+   T result = sin(dist*boost::math::constants::pi<T>());
+   return sign*z*result;
+} // template <class T> T sinpx(T z)
+//
+// tgamma(z), with Lanczos support:
+//
+template <class T, class Policy, class Lanczos>
+T gamma_imp(T z, const Policy& pol, const Lanczos& l)
+{
+   BOOST_MATH_STD_USING
+
+   T result = 1;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   static bool b = false;
+   if(!b)
+   {
+      std::cout << "tgamma_imp called with " << typeid(z).name() << " " << typeid(l).name() << std::endl;
+      b = true;
+   }
+#endif
+   static const char* function = "boost::math::tgamma<%1%>(%1%)";
+
+   if(z <= 0)
+   {
+      if(floor(z) == z)
+         return policies::raise_pole_error<T>(function, "Evaluation of tgamma at a negative integer %1%.", z, pol);
+      if(z <= -20)
+      {
+         result = gamma_imp(T(-z), pol, l) * sinpx(z);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         if((fabs(result) < 1) && (tools::max_value<T>() * fabs(result) < boost::math::constants::pi<T>()))
+            return -boost::math::sign(result) * policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
+         result = -boost::math::constants::pi<T>() / result;
+         if(result == 0)
+            return policies::raise_underflow_error<T>(function, "Result of tgamma is too small to represent.", pol);
+         if((boost::math::fpclassify)(result) == (int)FP_SUBNORMAL)
+            return policies::raise_denorm_error<T>(function, "Result of tgamma is denormalized.", result, pol);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         return result;
+      }
+
+      // shift z to > 1:
+      while(z < 0)
+      {
+         result /= z;
+         z += 1;
+      }
+   }
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   if((floor(z) == z) && (z < max_factorial<T>::value))
+   {
+      result *= unchecked_factorial<T>(itrunc(z, pol) - 1);
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   }
+   else if (z < tools::root_epsilon<T>())
+   {
+      if (z < 1 / tools::max_value<T>())
+         result = policies::raise_overflow_error<T>(function, 0, pol);
+	   result *= 1 / z - constants::euler<T>();
+   }
+   else
+   {
+      result *= Lanczos::lanczos_sum(z);
+      T zgh = (z + static_cast<T>(Lanczos::g()) - boost::math::constants::half<T>());
+      T lzgh = log(zgh);
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      BOOST_MATH_INSTRUMENT_VARIABLE(tools::log_max_value<T>());
+      if(z * lzgh > tools::log_max_value<T>())
+      {
+         // we're going to overflow unless this is done with care:
+         BOOST_MATH_INSTRUMENT_VARIABLE(zgh);
+         if(lzgh * z / 2 > tools::log_max_value<T>())
+            return boost::math::sign(result) * policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
+         T hp = pow(zgh, (z / 2) - T(0.25));
+         BOOST_MATH_INSTRUMENT_VARIABLE(hp);
+         result *= hp / exp(zgh);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         if(tools::max_value<T>() / hp < result)
+            return boost::math::sign(result) * policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
+         result *= hp;
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+      else
+      {
+         BOOST_MATH_INSTRUMENT_VARIABLE(zgh);
+         BOOST_MATH_INSTRUMENT_VARIABLE(pow(zgh, z - boost::math::constants::half<T>()));
+         BOOST_MATH_INSTRUMENT_VARIABLE(exp(zgh));
+         result *= pow(zgh, z - boost::math::constants::half<T>()) / exp(zgh);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+      }
+   }
+   return result;
+}
+//
+// lgamma(z) with Lanczos support:
+//
+template <class T, class Policy, class Lanczos>
+T lgamma_imp(T z, const Policy& pol, const Lanczos& l, int* sign = 0)
+{
+#ifdef BOOST_MATH_INSTRUMENT
+   static bool b = false;
+   if(!b)
+   {
+      std::cout << "lgamma_imp called with " << typeid(z).name() << " " << typeid(l).name() << std::endl;
+      b = true;
+   }
+#endif
+
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::lgamma<%1%>(%1%)";
+
+   T result = 0;
+   int sresult = 1;
+   if(z <= -tools::root_epsilon<T>())
+   {
+      // reflection formula:
+      if(floor(z) == z)
+         return policies::raise_pole_error<T>(function, "Evaluation of lgamma at a negative integer %1%.", z, pol);
+
+      T t = sinpx(z);
+      z = -z;
+      if(t < 0)
+      {
+         t = -t;
+      }
+      else
+      {
+         sresult = -sresult;
+      }
+      result = log(boost::math::constants::pi<T>()) - lgamma_imp(z, pol, l) - log(t);
+   }
+   else if (z < tools::root_epsilon<T>())
+   {
+	   if (0 == z)
+		   return policies::raise_pole_error<T>(function, "Evaluation of lgamma at %1%.", z, pol);
+      if (fabs(z) < 1 / tools::max_value<T>())
+         result = -log(fabs(z));
+      else
+	      result = log(fabs(1 / z - constants::euler<T>()));
+	   if (z < 0)
+		sresult = -1;
+   }
+   else if(z < 15)
+   {
+      typedef typename policies::precision<T, Policy>::type precision_type;
+      typedef typename mpl::if_<
+         mpl::and_<
+            mpl::less_equal<precision_type, mpl::int_<64> >, 
+            mpl::greater<precision_type, mpl::int_<0> > 
+         >,
+         mpl::int_<64>,
+         typename mpl::if_<
+            mpl::and_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::greater<precision_type, mpl::int_<0> > 
+            >,
+            mpl::int_<113>, mpl::int_<0> >::type
+          >::type tag_type;
+      result = lgamma_small_imp<T>(z, T(z - 1), T(z - 2), tag_type(), pol, l);
+   }
+   else if((z >= 3) && (z < 100) && (std::numeric_limits<T>::max_exponent >= 1024))
+   {
+      // taking the log of tgamma reduces the error, no danger of overflow here:
+      result = log(gamma_imp(z, pol, l));
+   }
+   else
+   {
+      // regular evaluation:
+      T zgh = static_cast<T>(z + Lanczos::g() - boost::math::constants::half<T>());
+      result = log(zgh) - 1;
+      result *= z - 0.5f;
+      result += log(Lanczos::lanczos_sum_expG_scaled(z));
+   }
+
+   if(sign)
+      *sign = sresult;
+   return result;
+}
+
+//
+// Incomplete gamma functions follow:
+//
+template <class T>
+struct upper_incomplete_gamma_fract
+{
+private:
+   T z, a;
+   int k;
+public:
+   typedef std::pair<T,T> result_type;
+
+   upper_incomplete_gamma_fract(T a1, T z1)
+      : z(z1-a1+1), a(a1), k(0)
+   {
+   }
+
+   result_type operator()()
+   {
+      ++k;
+      z += 2;
+      return result_type(k * (a - k), z);
+   }
+};
+
+template <class T>
+inline T upper_gamma_fraction(T a, T z, T eps)
+{
+   // Multiply result by z^a * e^-z to get the full
+   // upper incomplete integral.  Divide by tgamma(z)
+   // to normalise.
+   upper_incomplete_gamma_fract<T> f(a, z);
+   return 1 / (z - a + 1 + boost::math::tools::continued_fraction_a(f, eps));
+}
+
+template <class T>
+struct lower_incomplete_gamma_series
+{
+private:
+   T a, z, result;
+public:
+   typedef T result_type;
+   lower_incomplete_gamma_series(T a1, T z1) : a(a1), z(z1), result(1){}
+
+   T operator()()
+   {
+      T r = result;
+      a += 1;
+      result *= z/a;
+      return r;
+   }
+};
+
+template <class T, class Policy>
+inline T lower_gamma_series(T a, T z, const Policy& pol, T init_value = 0)
+{
+   // Multiply result by ((z^a) * (e^-z) / a) to get the full
+   // lower incomplete integral. Then divide by tgamma(a)
+   // to get the normalised value.
+   lower_incomplete_gamma_series<T> s(a, z);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+   T factor = policies::get_epsilon<T, Policy>();
+   T result = boost::math::tools::sum_series(s, factor, max_iter, init_value);
+   policies::check_series_iterations<T>("boost::math::detail::lower_gamma_series<%1%>(%1%)", max_iter, pol);
+   return result;
+}
+
+//
+// Fully generic tgamma and lgamma use Stirling's approximation
+// with Bernoulli numbers.
+//
+template<class T>
+std::size_t highest_bernoulli_index()
+{
+   const float digits10_of_type = (std::numeric_limits<T>::is_specialized
+                                      ? static_cast<float>(std::numeric_limits<T>::digits10)
+                                      : static_cast<float>(boost::math::tools::digits<T>() * 0.301F));
+
+   // Find the high index n for Bn to produce the desired precision in Stirling's calculation.
+   return static_cast<std::size_t>(18.0F + (0.6F * digits10_of_type));
+}
+
+template<class T>
+T minimum_argument_for_bernoulli_recursion()
+{
+   const float digits10_of_type = (std::numeric_limits<T>::is_specialized
+                                      ? static_cast<float>(std::numeric_limits<T>::digits10)
+                                      : static_cast<float>(boost::math::tools::digits<T>() * 0.301F));
+
+   return T(digits10_of_type * 1.7F);
+}
+
+// Forward declaration of the lgamma_imp template specialization.
+template <class T, class Policy>
+T lgamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos&, int* sign = 0);
+
+template <class T, class Policy>
+T gamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos&)
+{
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::tgamma<%1%>(%1%)";
+
+   // Check if the argument of tgamma is identically zero.
+   const bool is_at_zero = (z == 0);
+
+   if(is_at_zero)
+      return policies::raise_domain_error<T>(function, "Evaluation of tgamma at zero %1%.", z, pol);
+
+   const bool b_neg = (z < 0);
+
+   const bool floor_of_z_is_equal_to_z = (floor(z) == z);
+
+   // Special case handling of small factorials:
+   if((!b_neg) && floor_of_z_is_equal_to_z && (z < boost::math::max_factorial<T>::value))
+   {
+      return boost::math::unchecked_factorial<T>(itrunc(z) - 1);
+   }
+
+   // Make a local, unsigned copy of the input argument.
+   T zz((!b_neg) ? z : -z);
+
+   // Special case for ultra-small z:
+   if(zz < tools::cbrt_epsilon<T>())
+   {
+      const T a0(1);
+      const T a1(boost::math::constants::euler<T>());
+      const T six_euler_squared((boost::math::constants::euler<T>() * boost::math::constants::euler<T>()) * 6);
+      const T a2((six_euler_squared -  boost::math::constants::pi_sqr<T>()) / 12);
+
+      const T inverse_tgamma_series = z * ((a2 * z + a1) * z + a0);
+
+      return 1 / inverse_tgamma_series;
+   }
+
+   // Scale the argument up for the calculation of lgamma,
+   // and use downward recursion later for the final result.
+   const T min_arg_for_recursion = minimum_argument_for_bernoulli_recursion<T>();
+
+   int n_recur;
+
+   if(zz < min_arg_for_recursion)
+   {
+      n_recur = boost::math::itrunc(min_arg_for_recursion - zz) + 1;
+
+      zz += n_recur;
+   }
+   else
+   {
+      n_recur = 0;
+   }
+
+   const T log_gamma_value = lgamma_imp(zz, pol, lanczos::undefined_lanczos());
+
+   if(log_gamma_value > tools::log_max_value<T>())
+      return policies::raise_overflow_error<T>(function, 0, pol);
+
+   T gamma_value = exp(log_gamma_value);
+
+   // Rescale the result using downward recursion if necessary.
+   if(n_recur)
+   {
+      // The order of divides is important, if we keep subtracting 1 from zz
+      // we DO NOT get back to z (cancellation error).  Further if z < epsilon
+      // we would end up dividing by zero.  Also in order to prevent spurious
+      // overflow with the first division, we must save dividing by |z| till last,
+      // so the optimal order of divides is z+1, z+2, z+3...z+n_recur-1,z.
+      zz = fabs(z) + 1;
+      for(int k = 1; k < n_recur; ++k)
+      {
+         gamma_value /= zz;
+         zz += 1;
+      }
+      gamma_value /= fabs(z);
+   }
+
+   // Return the result, accounting for possible negative arguments.
+   if(b_neg)
+   {
+      // Provide special error analysis for:
+      // * arguments in the neighborhood of a negative integer
+      // * arguments exactly equal to a negative integer.
+
+      // Check if the argument of tgamma is exactly equal to a negative integer.
+      if(floor_of_z_is_equal_to_z)
+         return policies::raise_pole_error<T>(function, "Evaluation of tgamma at a negative integer %1%.", z, pol);
+
+      gamma_value *= sinpx(z);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(gamma_value);
+
+      const bool result_is_too_large_to_represent = (   (abs(gamma_value) < 1)
+                                                     && ((tools::max_value<T>() * abs(gamma_value)) < boost::math::constants::pi<T>()));
+
+      if(result_is_too_large_to_represent)
+         return policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
+
+      gamma_value = -boost::math::constants::pi<T>() / gamma_value;
+      BOOST_MATH_INSTRUMENT_VARIABLE(gamma_value);
+
+      if(gamma_value == 0)
+         return policies::raise_underflow_error<T>(function, "Result of tgamma is too small to represent.", pol);
+
+      if((boost::math::fpclassify)(gamma_value) == static_cast<int>(FP_SUBNORMAL))
+         return policies::raise_denorm_error<T>(function, "Result of tgamma is denormalized.", gamma_value, pol);
+   }
+
+   return gamma_value;
+}
+
+template <class T, class Policy>
+T lgamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos&, int* sign)
+{
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::lgamma<%1%>(%1%)";
+
+   // Check if the argument of lgamma is identically zero.
+   const bool is_at_zero = (z == 0);
+
+   if(is_at_zero)
+      return policies::raise_domain_error<T>(function, "Evaluation of lgamma at zero %1%.", z, pol);
+
+   const bool b_neg = (z < 0);
+
+   const bool floor_of_z_is_equal_to_z = (floor(z) == z);
+
+   // Special case handling of small factorials:
+   if((!b_neg) && floor_of_z_is_equal_to_z && (z < boost::math::max_factorial<T>::value))
+   {
+      return log(boost::math::unchecked_factorial<T>(itrunc(z) - 1));
+   }
+
+   // Make a local, unsigned copy of the input argument.
+   T zz((!b_neg) ? z : -z);
+
+   const T min_arg_for_recursion = minimum_argument_for_bernoulli_recursion<T>();
+
+   T log_gamma_value;
+
+   if (zz < min_arg_for_recursion)
+   {
+	   // Here we simply take the logarithm of tgamma(). This is somewhat
+	   // inefficient, but simple. The rationale is that the argument here
+	   // is relatively small and overflow is not expected to be likely.
+      if (z > -tools::root_epsilon<T>())
+      {
+         // Reflection formula may fail if z is very close to zero, let the series
+         // expansion for tgamma close to zero do the work:
+         log_gamma_value = log(abs(gamma_imp(z, pol, lanczos::undefined_lanczos())));
+         if (sign)
+         {
+             *sign = z < 0 ? -1 : 1;
+         }
+         return log_gamma_value;
+      }
+	   else
+      {
+         // No issue with spurious overflow in reflection formula, 
+         // just fall through to regular code:
+         log_gamma_value = log(abs(gamma_imp(zz, pol, lanczos::undefined_lanczos())));
+      }
+   }
+   else
+   {
+      // Perform the Bernoulli series expansion of Stirling's approximation.
+
+      const std::size_t number_of_bernoullis_b2n = highest_bernoulli_index<T>();
+
+            T one_over_x_pow_two_n_minus_one = 1 / zz;
+      const T one_over_x2                    = one_over_x_pow_two_n_minus_one * one_over_x_pow_two_n_minus_one;
+            T sum                            = (boost::math::bernoulli_b2n<T>(1) / 2) * one_over_x_pow_two_n_minus_one;
+      const T target_epsilon_to_break_loop   = (sum * boost::math::tools::epsilon<T>()) * T(1.0E-10F);
+
+      for(std::size_t n = 2U; n < number_of_bernoullis_b2n; ++n)
+      {
+         one_over_x_pow_two_n_minus_one *= one_over_x2;
+
+         const std::size_t n2 = static_cast<std::size_t>(n * 2U);
+
+         const T term = (boost::math::bernoulli_b2n<T>(static_cast<int>(n)) * one_over_x_pow_two_n_minus_one) / (n2 * (n2 - 1U));
+
+         if((n >= 8U) && (abs(term) < target_epsilon_to_break_loop))
+         {
+            // We have reached the desired precision in Stirling's expansion.
+            // Adding additional terms to the sum of this divergent asymptotic
+            // expansion will not improve the result.
+
+            // Break from the loop.
+            break;
+         }
+
+         sum += term;
+      }
+
+      // Complete Stirling's approximation.
+      const T half_ln_two_pi = log(boost::math::constants::two_pi<T>()) / 2;
+
+      log_gamma_value = ((((zz - boost::math::constants::half<T>()) * log(zz)) - zz) + half_ln_two_pi) + sum;
+   }
+
+   int sign_of_result = 1;
+
+   if(b_neg)
+   {
+      // Provide special error analysis if the argument is exactly
+      // equal to a negative integer.
+
+      // Check if the argument of lgamma is exactly equal to a negative integer.
+      if(floor_of_z_is_equal_to_z)
+         return policies::raise_pole_error<T>(function, "Evaluation of lgamma at a negative integer %1%.", z, pol);
+
+      T t = sinpx(z);
+
+      if(t < 0)
+      {
+         t = -t;
+      }
+      else
+      {
+         sign_of_result = -sign_of_result;
+      }
+
+      log_gamma_value = - log_gamma_value
+                        + log(boost::math::constants::pi<T>())
+                        - log(t);
+   }
+
+   if(sign != static_cast<int*>(0U)) { *sign = sign_of_result; }
+
+   return log_gamma_value;
+}
+
+//
+// This helper calculates tgamma(dz+1)-1 without cancellation errors,
+// used by the upper incomplete gamma with z < 1:
+//
+template <class T, class Policy, class Lanczos>
+T tgammap1m1_imp(T dz, Policy const& pol, const Lanczos& l)
+{
+   BOOST_MATH_STD_USING
+
+   typedef typename policies::precision<T,Policy>::type precision_type;
+
+   typedef typename mpl::if_<
+      mpl::or_<
+         mpl::less_equal<precision_type, mpl::int_<0> >,
+         mpl::greater<precision_type, mpl::int_<113> >
+      >,
+      typename mpl::if_<
+         is_same<Lanczos, lanczos::lanczos24m113>,
+         mpl::int_<113>,
+         mpl::int_<0>
+      >::type,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<64> >,
+         mpl::int_<64>, mpl::int_<113> >::type
+       >::type tag_type;
+
+   T result;
+   if(dz < 0)
+   {
+      if(dz < -0.5)
+      {
+         // Best method is simply to subtract 1 from tgamma:
+         result = boost::math::tgamma(1+dz, pol) - 1;
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+      else
+      {
+         // Use expm1 on lgamma:
+         result = boost::math::expm1(-boost::math::log1p(dz, pol) 
+            + lgamma_small_imp<T>(dz+2, dz + 1, dz, tag_type(), pol, l));
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+   }
+   else
+   {
+      if(dz < 2)
+      {
+         // Use expm1 on lgamma:
+         result = boost::math::expm1(lgamma_small_imp<T>(dz+1, dz, dz-1, tag_type(), pol, l), pol);
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+      else
+      {
+         // Best method is simply to subtract 1 from tgamma:
+         result = boost::math::tgamma(1+dz, pol) - 1;
+         BOOST_MATH_INSTRUMENT_CODE(result);
+      }
+   }
+
+   return result;
+}
+
+template <class T, class Policy>
+inline T tgammap1m1_imp(T dz, Policy const& pol,
+                 const ::boost::math::lanczos::undefined_lanczos& l)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   //
+   // There should be a better solution than this, but the
+   // algebra isn't easy for the general case....
+   // Start by subracting 1 from tgamma:
+   //
+   T result = gamma_imp(T(1 + dz), pol, l) - 1;
+   BOOST_MATH_INSTRUMENT_CODE(result);
+   //
+   // Test the level of cancellation error observed: we loose one bit
+   // for each power of 2 the result is less than 1.  If we would get
+   // more bits from our most precise lgamma rational approximation, 
+   // then use that instead:
+   //
+   BOOST_MATH_INSTRUMENT_CODE((dz > -0.5));
+   BOOST_MATH_INSTRUMENT_CODE((dz < 2));
+   BOOST_MATH_INSTRUMENT_CODE((ldexp(1.0, boost::math::policies::digits<T, Policy>()) * fabs(result) < 1e34));
+   if((dz > -0.5) && (dz < 2) && (ldexp(1.0, boost::math::policies::digits<T, Policy>()) * fabs(result) < 1e34))
+   {
+      result = tgammap1m1_imp(dz, pol, boost::math::lanczos::lanczos24m113());
+      BOOST_MATH_INSTRUMENT_CODE(result);
+   }
+   return result;
+}
+
+//
+// Series representation for upper fraction when z is small:
+//
+template <class T>
+struct small_gamma2_series
+{
+   typedef T result_type;
+
+   small_gamma2_series(T a_, T x_) : result(-x_), x(-x_), apn(a_+1), n(1){}
+
+   T operator()()
+   {
+      T r = result / (apn);
+      result *= x;
+      result /= ++n;
+      apn += 1;
+      return r;
+   }
+
+private:
+   T result, x, apn;
+   int n;
+};
+//
+// calculate power term prefix (z^a)(e^-z) used in the non-normalised
+// incomplete gammas:
+//
+template <class T, class Policy>
+T full_igamma_prefix(T a, T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   T prefix;
+   T alz = a * log(z);
+
+   if(z >= 1)
+   {
+      if((alz < tools::log_max_value<T>()) && (-z > tools::log_min_value<T>()))
+      {
+         prefix = pow(z, a) * exp(-z);
+      }
+      else if(a >= 1)
+      {
+         prefix = pow(z / exp(z/a), a);
+      }
+      else
+      {
+         prefix = exp(alz - z);
+      }
+   }
+   else
+   {
+      if(alz > tools::log_min_value<T>())
+      {
+         prefix = pow(z, a) * exp(-z);
+      }
+      else if(z/a < tools::log_max_value<T>())
+      {
+         prefix = pow(z / exp(z/a), a);
+      }
+      else
+      {
+         prefix = exp(alz - z);
+      }
+   }
+   //
+   // This error handling isn't very good: it happens after the fact
+   // rather than before it...
+   //
+   if((boost::math::fpclassify)(prefix) == (int)FP_INFINITE)
+      return policies::raise_overflow_error<T>("boost::math::detail::full_igamma_prefix<%1%>(%1%, %1%)", "Result of incomplete gamma function is too large to represent.", pol);
+
+   return prefix;
+}
+//
+// Compute (z^a)(e^-z)/tgamma(a)
+// most if the error occurs in this function:
+//
+template <class T, class Policy, class Lanczos>
+T regularised_gamma_prefix(T a, T z, const Policy& pol, const Lanczos& l)
+{
+   BOOST_MATH_STD_USING
+   T agh = a + static_cast<T>(Lanczos::g()) - T(0.5);
+   T prefix;
+   T d = ((z - a) - static_cast<T>(Lanczos::g()) + T(0.5)) / agh;
+
+   if(a < 1)
+   {
+      //
+      // We have to treat a < 1 as a special case because our Lanczos
+      // approximations are optimised against the factorials with a > 1,
+      // and for high precision types especially (128-bit reals for example)
+      // very small values of a can give rather eroneous results for gamma
+      // unless we do this:
+      //
+      // TODO: is this still required?  Lanczos approx should be better now?
+      //
+      if(z <= tools::log_min_value<T>())
+      {
+         // Oh dear, have to use logs, should be free of cancellation errors though:
+         return exp(a * log(z) - z - lgamma_imp(a, pol, l));
+      }
+      else
+      {
+         // direct calculation, no danger of overflow as gamma(a) < 1/a
+         // for small a.
+         return pow(z, a) * exp(-z) / gamma_imp(a, pol, l);
+      }
+   }
+   else if((fabs(d*d*a) <= 100) && (a > 150))
+   {
+      // special case for large a and a ~ z.
+      prefix = a * boost::math::log1pmx(d, pol) + z * static_cast<T>(0.5 - Lanczos::g()) / agh;
+      prefix = exp(prefix);
+   }
+   else
+   {
+      //
+      // general case.
+      // direct computation is most accurate, but use various fallbacks
+      // for different parts of the problem domain:
+      //
+      T alz = a * log(z / agh);
+      T amz = a - z;
+      if(((std::min)(alz, amz) <= tools::log_min_value<T>()) || ((std::max)(alz, amz) >= tools::log_max_value<T>()))
+      {
+         T amza = amz / a;
+         if(((std::min)(alz, amz)/2 > tools::log_min_value<T>()) && ((std::max)(alz, amz)/2 < tools::log_max_value<T>()))
+         {
+            // compute square root of the result and then square it:
+            T sq = pow(z / agh, a / 2) * exp(amz / 2);
+            prefix = sq * sq;
+         }
+         else if(((std::min)(alz, amz)/4 > tools::log_min_value<T>()) && ((std::max)(alz, amz)/4 < tools::log_max_value<T>()) && (z > a))
+         {
+            // compute the 4th root of the result then square it twice:
+            T sq = pow(z / agh, a / 4) * exp(amz / 4);
+            prefix = sq * sq;
+            prefix *= prefix;
+         }
+         else if((amza > tools::log_min_value<T>()) && (amza < tools::log_max_value<T>()))
+         {
+            prefix = pow((z * exp(amza)) / agh, a);
+         }
+         else
+         {
+            prefix = exp(alz + amz);
+         }
+      }
+      else
+      {
+         prefix = pow(z / agh, a) * exp(amz);
+      }
+   }
+   prefix *= sqrt(agh / boost::math::constants::e<T>()) / Lanczos::lanczos_sum_expG_scaled(a);
+   return prefix;
+}
+//
+// And again, without Lanczos support:
+//
+template <class T, class Policy>
+T regularised_gamma_prefix(T a, T z, const Policy& pol, const lanczos::undefined_lanczos&)
+{
+   BOOST_MATH_STD_USING
+
+   T limit = (std::max)(T(10), a);
+   T sum = detail::lower_gamma_series(a, limit, pol) / a;
+   sum += detail::upper_gamma_fraction(a, limit, ::boost::math::policies::get_epsilon<T, Policy>());
+
+   if(a < 10)
+   {
+      // special case for small a:
+      T prefix = pow(z / 10, a);
+      prefix *= exp(10-z);
+      if(0 == prefix)
+      {
+         prefix = pow((z * exp((10-z)/a)) / 10, a);
+      }
+      prefix /= sum;
+      return prefix;
+   }
+
+   T zoa = z / a;
+   T amz = a - z;
+   T alzoa = a * log(zoa);
+   T prefix;
+   if(((std::min)(alzoa, amz) <= tools::log_min_value<T>()) || ((std::max)(alzoa, amz) >= tools::log_max_value<T>()))
+   {
+      T amza = amz / a;
+      if((amza <= tools::log_min_value<T>()) || (amza >= tools::log_max_value<T>()))
+      {
+         prefix = exp(alzoa + amz);
+      }
+      else
+      {
+         prefix = pow(zoa * exp(amza), a);
+      }
+   }
+   else
+   {
+      prefix = pow(zoa, a) * exp(amz);
+   }
+   prefix /= sum;
+   return prefix;
+}
+//
+// Upper gamma fraction for very small a:
+//
+template <class T, class Policy>
+inline T tgamma_small_upper_part(T a, T x, const Policy& pol, T* pgam = 0, bool invert = false, T* pderivative = 0)
+{
+   BOOST_MATH_STD_USING  // ADL of std functions.
+   //
+   // Compute the full upper fraction (Q) when a is very small:
+   //
+   T result;
+   result = boost::math::tgamma1pm1(a, pol);
+   if(pgam)
+      *pgam = (result + 1) / a;
+   T p = boost::math::powm1(x, a, pol);
+   result -= p;
+   result /= a;
+   detail::small_gamma2_series<T> s(a, x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>() - 10;
+   p += 1;
+   if(pderivative)
+      *pderivative = p / (*pgam * exp(x));
+   T init_value = invert ? *pgam : 0;
+   result = -p * tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, (init_value - result) / p);
+   policies::check_series_iterations<T>("boost::math::tgamma_small_upper_part<%1%>(%1%, %1%)", max_iter, pol);
+   if(invert)
+      result = -result;
+   return result;
+}
+//
+// Upper gamma fraction for integer a:
+//
+template <class T, class Policy>
+inline T finite_gamma_q(T a, T x, Policy const& pol, T* pderivative = 0)
+{
+   //
+   // Calculates normalised Q when a is an integer:
+   //
+   BOOST_MATH_STD_USING
+   T e = exp(-x);
+   T sum = e;
+   if(sum != 0)
+   {
+      T term = sum;
+      for(unsigned n = 1; n < a; ++n)
+      {
+         term /= n;
+         term *= x;
+         sum += term;
+      }
+   }
+   if(pderivative)
+   {
+      *pderivative = e * pow(x, a) / boost::math::unchecked_factorial<T>(itrunc(T(a - 1), pol));
+   }
+   return sum;
+}
+//
+// Upper gamma fraction for half integer a:
+//
+template <class T, class Policy>
+T finite_half_gamma_q(T a, T x, T* p_derivative, const Policy& pol)
+{
+   //
+   // Calculates normalised Q when a is a half-integer:
+   //
+   BOOST_MATH_STD_USING
+   T e = boost::math::erfc(sqrt(x), pol);
+   if((e != 0) && (a > 1))
+   {
+      T term = exp(-x) / sqrt(constants::pi<T>() * x);
+      term *= x;
+      static const T half = T(1) / 2;
+      term /= half;
+      T sum = term;
+      for(unsigned n = 2; n < a; ++n)
+      {
+         term /= n - half;
+         term *= x;
+         sum += term;
+      }
+      e += sum;
+      if(p_derivative)
+      {
+         *p_derivative = 0;
+      }
+   }
+   else if(p_derivative)
+   {
+      // We'll be dividing by x later, so calculate derivative * x:
+      *p_derivative = sqrt(x) * exp(-x) / constants::root_pi<T>();
+   }
+   return e;
+}
+//
+// Main incomplete gamma entry point, handles all four incomplete gamma's:
+//
+template <class T, class Policy>
+T gamma_incomplete_imp(T a, T x, bool normalised, bool invert, 
+                       const Policy& pol, T* p_derivative)
+{
+   static const char* function = "boost::math::gamma_p<%1%>(%1%, %1%)";
+   if(a <= 0)
+      return policies::raise_domain_error<T>(function, "Argument a to the incomplete gamma function must be greater than zero (got a=%1%).", a, pol);
+   if(x < 0)
+      return policies::raise_domain_error<T>(function, "Argument x to the incomplete gamma function must be >= 0 (got x=%1%).", x, pol);
+
+   BOOST_MATH_STD_USING
+
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+
+   T result = 0; // Just to avoid warning C4701: potentially uninitialized local variable 'result' used
+
+   if(a >= max_factorial<T>::value && !normalised)
+   {
+      //
+      // When we're computing the non-normalized incomplete gamma
+      // and a is large the result is rather hard to compute unless
+      // we use logs.  There are really two options - if x is a long
+      // way from a in value then we can reliably use methods 2 and 4
+      // below in logarithmic form and go straight to the result.
+      // Otherwise we let the regularized gamma take the strain
+      // (the result is unlikely to unerflow in the central region anyway)
+      // and combine with lgamma in the hopes that we get a finite result.
+      //
+      if(invert && (a * 4 < x))
+      {
+         // This is method 4 below, done in logs:
+         result = a * log(x) - x;
+         if(p_derivative)
+            *p_derivative = exp(result);
+         result += log(upper_gamma_fraction(a, x, policies::get_epsilon<T, Policy>()));
+      }
+      else if(!invert && (a > 4 * x))
+      {
+         // This is method 2 below, done in logs:
+         result = a * log(x) - x;
+         if(p_derivative)
+            *p_derivative = exp(result);
+         T init_value = 0;
+         result += log(detail::lower_gamma_series(a, x, pol, init_value) / a);
+      }
+      else
+      {
+         result = gamma_incomplete_imp(a, x, true, invert, pol, p_derivative);
+         if(result == 0)
+         {
+            if(invert)
+            {
+               // Try http://functions.wolfram.com/06.06.06.0039.01
+               result = 1 + 1 / (12 * a) + 1 / (288 * a * a);
+               result = log(result) - a + (a - 0.5f) * log(a) + log(boost::math::constants::root_two_pi<T>());
+               if(p_derivative)
+                  *p_derivative = exp(a * log(x) - x);
+            }
+            else
+            {
+               // This is method 2 below, done in logs, we're really outside the
+               // range of this method, but since the result is almost certainly
+               // infinite, we should probably be OK:
+               result = a * log(x) - x;
+               if(p_derivative)
+                  *p_derivative = exp(result);
+               T init_value = 0;
+               result += log(detail::lower_gamma_series(a, x, pol, init_value) / a);
+            }
+         }
+         else
+         {
+            result = log(result) + boost::math::lgamma(a, pol);
+         }
+      }
+      if(result > tools::log_max_value<T>())
+         return policies::raise_overflow_error<T>(function, 0, pol);
+      return exp(result);
+   }
+
+   BOOST_ASSERT((p_derivative == 0) || (normalised == true));
+
+   bool is_int, is_half_int;
+   bool is_small_a = (a < 30) && (a <= x + 1) && (x < tools::log_max_value<T>());
+   if(is_small_a)
+   {
+      T fa = floor(a);
+      is_int = (fa == a);
+      is_half_int = is_int ? false : (fabs(fa - a) == 0.5f);
+   }
+   else
+   {
+      is_int = is_half_int = false;
+   }
+
+   int eval_method;
+   
+   if(is_int && (x > 0.6))
+   {
+      // calculate Q via finite sum:
+      invert = !invert;
+      eval_method = 0;
+   }
+   else if(is_half_int && (x > 0.2))
+   {
+      // calculate Q via finite sum for half integer a:
+      invert = !invert;
+      eval_method = 1;
+   }
+   else if((x < tools::root_epsilon<T>()) && (a > 1))
+   {
+      eval_method = 6;
+   }
+   else if(x < 0.5)
+   {
+      //
+      // Changeover criterion chosen to give a changeover at Q ~ 0.33
+      //
+      if(-0.4 / log(x) < a)
+      {
+         eval_method = 2;
+      }
+      else
+      {
+         eval_method = 3;
+      }
+   }
+   else if(x < 1.1)
+   {
+      //
+      // Changover here occurs when P ~ 0.75 or Q ~ 0.25:
+      //
+      if(x * 0.75f < a)
+      {
+         eval_method = 2;
+      }
+      else
+      {
+         eval_method = 3;
+      }
+   }
+   else
+   {
+      //
+      // Begin by testing whether we're in the "bad" zone
+      // where the result will be near 0.5 and the usual
+      // series and continued fractions are slow to converge:
+      //
+      bool use_temme = false;
+      if(normalised && std::numeric_limits<T>::is_specialized && (a > 20))
+      {
+         T sigma = fabs((x-a)/a);
+         if((a > 200) && (policies::digits<T, Policy>() <= 113))
+         {
+            //
+            // This limit is chosen so that we use Temme's expansion
+            // only if the result would be larger than about 10^-6.
+            // Below that the regular series and continued fractions
+            // converge OK, and if we use Temme's method we get increasing
+            // errors from the dominant erfc term as it's (inexact) argument
+            // increases in magnitude.
+            //
+            if(20 / a > sigma * sigma)
+               use_temme = true;
+         }
+         else if(policies::digits<T, Policy>() <= 64)
+         {
+            // Note in this zone we can't use Temme's expansion for 
+            // types longer than an 80-bit real:
+            // it would require too many terms in the polynomials.
+            if(sigma < 0.4)
+               use_temme = true;
+         }
+      }
+      if(use_temme)
+      {
+         eval_method = 5;
+      }
+      else
+      {
+         //
+         // Regular case where the result will not be too close to 0.5.
+         //
+         // Changeover here occurs at P ~ Q ~ 0.5
+         // Note that series computation of P is about x2 faster than continued fraction
+         // calculation of Q, so try and use the CF only when really necessary, especially
+         // for small x.
+         //
+         if(x - (1 / (3 * x)) < a)
+         {
+            eval_method = 2;
+         }
+         else
+         {
+            eval_method = 4;
+            invert = !invert;
+         }
+      }
+   }
+
+   switch(eval_method)
+   {
+   case 0:
+      {
+         result = finite_gamma_q(a, x, pol, p_derivative);
+         if(normalised == false)
+            result *= boost::math::tgamma(a, pol);
+         break;
+      }
+   case 1:
+      {
+         result = finite_half_gamma_q(a, x, p_derivative, pol);
+         if(normalised == false)
+            result *= boost::math::tgamma(a, pol);
+         if(p_derivative && (*p_derivative == 0))
+            *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         break;
+      }
+   case 2:
+      {
+         // Compute P:
+         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
+         if(p_derivative)
+            *p_derivative = result;
+         if(result != 0)
+         {
+            //
+            // If we're going to be inverting the result then we can
+            // reduce the number of series evaluations by quite
+            // a few iterations if we set an initial value for the
+            // series sum based on what we'll end up subtracting it from
+            // at the end.
+            // Have to be careful though that this optimization doesn't 
+            // lead to spurious numberic overflow.  Note that the
+            // scary/expensive overflow checks below are more often
+            // than not bypassed in practice for "sensible" input
+            // values:
+            //
+            T init_value = 0;
+            bool optimised_invert = false;
+            if(invert)
+            {
+               init_value = (normalised ? 1 : boost::math::tgamma(a, pol));
+               if(normalised || (result >= 1) || (tools::max_value<T>() * result > init_value))
+               {
+                  init_value /= result;
+                  if(normalised || (a < 1) || (tools::max_value<T>() / a > init_value))
+                  {
+                     init_value *= -a;
+                     optimised_invert = true;
+                  }
+                  else
+                     init_value = 0;
+               }
+               else
+                  init_value = 0;
+            }
+            result *= detail::lower_gamma_series(a, x, pol, init_value) / a;
+            if(optimised_invert)
+            {
+               invert = false;
+               result = -result;
+            }
+         }
+         break;
+      }
+   case 3:
+      {
+         // Compute Q:
+         invert = !invert;
+         T g;
+         result = tgamma_small_upper_part(a, x, pol, &g, invert, p_derivative);
+         invert = false;
+         if(normalised)
+            result /= g;
+         break;
+      }
+   case 4:
+      {
+         // Compute Q:
+         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
+         if(p_derivative)
+            *p_derivative = result;
+         if(result != 0)
+            result *= upper_gamma_fraction(a, x, policies::get_epsilon<T, Policy>());
+         break;
+      }
+   case 5:
+      {
+         //
+         // Use compile time dispatch to the appropriate
+         // Temme asymptotic expansion.  This may be dead code
+         // if T does not have numeric limits support, or has
+         // too many digits for the most precise version of
+         // these expansions, in that case we'll be calling
+         // an empty function.
+         //
+         typedef typename policies::precision<T, Policy>::type precision_type;
+
+         typedef typename mpl::if_<
+            mpl::or_<mpl::equal_to<precision_type, mpl::int_<0> >,
+            mpl::greater<precision_type, mpl::int_<113> > >,
+            mpl::int_<0>,
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<53> >,
+               mpl::int_<53>,
+               typename mpl::if_<
+                  mpl::less_equal<precision_type, mpl::int_<64> >,
+                  mpl::int_<64>,
+                  mpl::int_<113>
+               >::type
+            >::type
+         >::type tag_type;
+
+         result = igamma_temme_large(a, x, pol, static_cast<tag_type const*>(0));
+         if(x >= a)
+            invert = !invert;
+         if(p_derivative)
+            *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         break;
+      }
+   case 6:
+      {
+         // x is so small that P is necessarily very small too,
+         // use http://functions.wolfram.com/GammaBetaErf/GammaRegularized/06/01/05/01/01/
+         result = !normalised ? pow(x, a) / (a) : pow(x, a) / boost::math::tgamma(a + 1, pol);
+         result *= 1 - a * x / (a + 1);
+      }
+   }
+
+   if(normalised && (result > 1))
+      result = 1;
+   if(invert)
+   {
+      T gam = normalised ? 1 : boost::math::tgamma(a, pol);
+      result = gam - result;
+   }
+   if(p_derivative)
+   {
+      //
+      // Need to convert prefix term to derivative:
+      //
+      if((x < 1) && (tools::max_value<T>() * x < *p_derivative))
+      {
+         // overflow, just return an arbitrarily large value:
+         *p_derivative = tools::max_value<T>() / 2;
+      }
+
+      *p_derivative /= x;
+   }
+
+   return result;
+}
+
+//
+// Ratios of two gamma functions:
+//
+template <class T, class Policy, class Lanczos>
+T tgamma_delta_ratio_imp_lanczos(T z, T delta, const Policy& pol, const Lanczos& l)
+{
+   BOOST_MATH_STD_USING
+   if(z < tools::epsilon<T>())
+   {
+      //
+      // We get spurious numeric overflow unless we're very careful, this
+      // can occur either inside Lanczos::lanczos_sum(z) or in the
+      // final combination of terms, to avoid this, split the product up
+      // into 2 (or 3) parts:
+      //
+      // G(z) / G(L) = 1 / (z * G(L)) ; z < eps, L = z + delta = delta
+      //    z * G(L) = z * G(lim) * (G(L)/G(lim)) ; lim = largest factorial
+      //
+      if(boost::math::max_factorial<T>::value < delta)
+      {
+         T ratio = tgamma_delta_ratio_imp_lanczos(delta, T(boost::math::max_factorial<T>::value - delta), pol, l);
+         ratio *= z;
+         ratio *= boost::math::unchecked_factorial<T>(boost::math::max_factorial<T>::value - 1);
+         return 1 / ratio;
+      }
+      else
+      {
+         return 1 / (z * boost::math::tgamma(z + delta, pol));
+      }
+   }
+   T zgh = z + Lanczos::g() - constants::half<T>();
+   T result;
+   if(fabs(delta) < 10)
+   {
+      result = exp((constants::half<T>() - z) * boost::math::log1p(delta / zgh, pol));
+   }
+   else
+   {
+      result = pow(zgh / (zgh + delta), z - constants::half<T>());
+   }
+   // Split the calculation up to avoid spurious overflow:
+   result *= Lanczos::lanczos_sum(z) / Lanczos::lanczos_sum(T(z + delta));
+   result *= pow(constants::e<T>() / (zgh + delta), delta);
+   return result;
+}
+//
+// And again without Lanczos support this time:
+//
+template <class T, class Policy>
+T tgamma_delta_ratio_imp_lanczos(T z, T delta, const Policy& pol, const lanczos::undefined_lanczos&)
+{
+   BOOST_MATH_STD_USING
+   //
+   // The upper gamma fraction is *very* slow for z < 6, actually it's very
+   // slow to converge everywhere but recursing until z > 6 gets rid of the
+   // worst of it's behaviour.
+   //
+   T prefix = 1;
+   T zd = z + delta;
+   while((zd < 6) && (z < 6))
+   {
+      prefix /= z;
+      prefix *= zd;
+      z += 1;
+      zd += 1;
+   }
+   if(delta < 10)
+   {
+      prefix *= exp(-z * boost::math::log1p(delta / z, pol));
+   }
+   else
+   {
+      prefix *= pow(z / zd, z);
+   }
+   prefix *= pow(constants::e<T>() / zd, delta);
+   T sum = detail::lower_gamma_series(z, z, pol) / z;
+   sum += detail::upper_gamma_fraction(z, z, ::boost::math::policies::get_epsilon<T, Policy>());
+   T sumd = detail::lower_gamma_series(zd, zd, pol) / zd;
+   sumd += detail::upper_gamma_fraction(zd, zd, ::boost::math::policies::get_epsilon<T, Policy>());
+   sum /= sumd;
+   if(fabs(tools::max_value<T>() / prefix) < fabs(sum))
+      return policies::raise_overflow_error<T>("boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)", "Result of tgamma is too large to represent.", pol);
+   return sum * prefix;
+}
+
+template <class T, class Policy>
+T tgamma_delta_ratio_imp(T z, T delta, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if((z <= 0) || (z + delta <= 0))
+   {
+      // This isn't very sofisticated, or accurate, but it does work:
+      return boost::math::tgamma(z, pol) / boost::math::tgamma(z + delta, pol);
+   }
+
+   if(floor(delta) == delta)
+   {
+      if(floor(z) == z)
+      {
+         //
+         // Both z and delta are integers, see if we can just use table lookup
+         // of the factorials to get the result:
+         //
+         if((z <= max_factorial<T>::value) && (z + delta <= max_factorial<T>::value))
+         {
+            return unchecked_factorial<T>((unsigned)itrunc(z, pol) - 1) / unchecked_factorial<T>((unsigned)itrunc(T(z + delta), pol) - 1);
+         }
+      }
+      if(fabs(delta) < 20)
+      {
+         //
+         // delta is a small integer, we can use a finite product:
+         //
+         if(delta == 0)
+            return 1;
+         if(delta < 0)
+         {
+            z -= 1;
+            T result = z;
+            while(0 != (delta += 1))
+            {
+               z -= 1;
+               result *= z;
+            }
+            return result;
+         }
+         else
+         {
+            T result = 1 / z;
+            while(0 != (delta -= 1))
+            {
+               z += 1;
+               result /= z;
+            }
+            return result;
+         }
+      }
+   }
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   return tgamma_delta_ratio_imp_lanczos(z, delta, pol, lanczos_type());
+}
+
+template <class T, class Policy>
+T tgamma_ratio_imp(T x, T y, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if((x <= 0) || (boost::math::isinf)(x))
+      return policies::raise_domain_error<T>("boost::math::tgamma_ratio<%1%>(%1%, %1%)", "Gamma function ratios only implemented for positive arguments (got a=%1%).", x, pol);
+   if((y <= 0) || (boost::math::isinf)(y))
+      return policies::raise_domain_error<T>("boost::math::tgamma_ratio<%1%>(%1%, %1%)", "Gamma function ratios only implemented for positive arguments (got b=%1%).", y, pol);
+
+   if(x <= tools::min_value<T>())
+   {
+      // Special case for denorms...Ugh.
+      T shift = ldexp(T(1), tools::digits<T>());
+      return shift * tgamma_ratio_imp(T(x * shift), y, pol);
+   }
+
+   if((x < max_factorial<T>::value) && (y < max_factorial<T>::value))
+   {
+      // Rather than subtracting values, lets just call the gamma functions directly:
+      return boost::math::tgamma(x, pol) / boost::math::tgamma(y, pol);
+   }
+   T prefix = 1;
+   if(x < 1)
+   {
+      if(y < 2 * max_factorial<T>::value)
+      {
+         // We need to sidestep on x as well, otherwise we'll underflow
+         // before we get to factor in the prefix term:
+         prefix /= x;
+         x += 1;
+         while(y >=  max_factorial<T>::value)
+         {
+            y -= 1;
+            prefix /= y;
+         }
+         return prefix * boost::math::tgamma(x, pol) / boost::math::tgamma(y, pol);
+      }
+      //
+      // result is almost certainly going to underflow to zero, try logs just in case:
+      //
+      return exp(boost::math::lgamma(x, pol) - boost::math::lgamma(y, pol));
+   }
+   if(y < 1)
+   {
+      if(x < 2 * max_factorial<T>::value)
+      {
+         // We need to sidestep on y as well, otherwise we'll overflow
+         // before we get to factor in the prefix term:
+         prefix *= y;
+         y += 1;
+         while(x >= max_factorial<T>::value)
+         {
+            x -= 1;
+            prefix *= x;
+         }
+         return prefix * boost::math::tgamma(x, pol) / boost::math::tgamma(y, pol);
+      }
+      //
+      // Result will almost certainly overflow, try logs just in case:
+      //
+      return exp(boost::math::lgamma(x, pol) - boost::math::lgamma(y, pol));
+   }
+   //
+   // Regular case, x and y both large and similar in magnitude:
+   //
+   return boost::math::tgamma_delta_ratio(x, y - x, pol);
+}
+
+template <class T, class Policy>
+T gamma_p_derivative_imp(T a, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Usual error checks first:
+   //
+   if(a <= 0)
+      return policies::raise_domain_error<T>("boost::math::gamma_p_derivative<%1%>(%1%, %1%)", "Argument a to the incomplete gamma function must be greater than zero (got a=%1%).", a, pol);
+   if(x < 0)
+      return policies::raise_domain_error<T>("boost::math::gamma_p_derivative<%1%>(%1%, %1%)", "Argument x to the incomplete gamma function must be >= 0 (got x=%1%).", x, pol);
+   //
+   // Now special cases:
+   //
+   if(x == 0)
+   {
+      return (a > 1) ? 0 :
+         (a == 1) ? 1 : policies::raise_overflow_error<T>("boost::math::gamma_p_derivative<%1%>(%1%, %1%)", 0, pol);
+   }
+   //
+   // Normal case:
+   //
+   typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+   T f1 = detail::regularised_gamma_prefix(a, x, pol, lanczos_type());
+   if((x < 1) && (tools::max_value<T>() * x < f1))
+   {
+      // overflow:
+      return policies::raise_overflow_error<T>("boost::math::gamma_p_derivative<%1%>(%1%, %1%)", 0, pol);
+   }
+   if(f1 == 0)
+   {
+      // Underflow in calculation, use logs instead:
+      f1 = a * log(x) - x - lgamma(a, pol) - log(x);
+      f1 = exp(f1);
+   }
+   else
+      f1 /= x;
+
+   return f1;
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   tgamma(T z, const Policy& /* pol */, const mpl::true_)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::gamma_imp(static_cast<value_type>(z), forwarding_policy(), evaluation_type()), "boost::math::tgamma<%1%>(%1%)");
+}
+
+template <class T, class Policy>
+struct igamma_initializer
+{
+   struct init
+   {
+      init()
+      {
+         typedef typename policies::precision<T, Policy>::type precision_type;
+
+         typedef typename mpl::if_<
+            mpl::or_<mpl::equal_to<precision_type, mpl::int_<0> >,
+            mpl::greater<precision_type, mpl::int_<113> > >,
+            mpl::int_<0>,
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<53> >,
+               mpl::int_<53>,
+               typename mpl::if_<
+                  mpl::less_equal<precision_type, mpl::int_<64> >,
+                  mpl::int_<64>,
+                  mpl::int_<113>
+               >::type
+            >::type
+         >::type tag_type;
+
+         do_init(tag_type());
+      }
+      template <int N>
+      static void do_init(const mpl::int_<N>&)
+      {
+         boost::math::gamma_p(static_cast<T>(400), static_cast<T>(400), Policy());
+      }
+      static void do_init(const mpl::int_<53>&){}
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename igamma_initializer<T, Policy>::init igamma_initializer<T, Policy>::initializer;
+
+template <class T, class Policy>
+struct lgamma_initializer
+{
+   struct init
+   {
+      init()
+      {
+         typedef typename policies::precision<T, Policy>::type precision_type;
+         typedef typename mpl::if_<
+            mpl::and_<
+               mpl::less_equal<precision_type, mpl::int_<64> >, 
+               mpl::greater<precision_type, mpl::int_<0> > 
+            >,
+            mpl::int_<64>,
+            typename mpl::if_<
+               mpl::and_<
+                  mpl::less_equal<precision_type, mpl::int_<113> >,
+                  mpl::greater<precision_type, mpl::int_<0> > 
+               >,
+               mpl::int_<113>, mpl::int_<0> >::type
+             >::type tag_type;
+         do_init(tag_type());
+      }
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::lgamma(static_cast<T>(2.5), Policy());
+         boost::math::lgamma(static_cast<T>(1.25), Policy());
+         boost::math::lgamma(static_cast<T>(1.75), Policy());
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         boost::math::lgamma(static_cast<T>(2.5), Policy());
+         boost::math::lgamma(static_cast<T>(1.25), Policy());
+         boost::math::lgamma(static_cast<T>(1.5), Policy());
+         boost::math::lgamma(static_cast<T>(1.75), Policy());
+      }
+      static void do_init(const mpl::int_<0>&)
+      {
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename lgamma_initializer<T, Policy>::init lgamma_initializer<T, Policy>::initializer;
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma(T1 a, T2 z, const Policy&, const mpl::false_)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   // typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   igamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_incomplete_imp(static_cast<value_type>(a),
+      static_cast<value_type>(z), false, true,
+      forwarding_policy(), static_cast<value_type*>(0)), "boost::math::tgamma<%1%>(%1%, %1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma(T1 a, T2 z, const mpl::false_ tag)
+{
+   return tgamma(a, z, policies::policy<>(), tag);
+}
+
+
+} // namespace detail
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   tgamma(T z)
+{
+   return tgamma(z, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   lgamma(T z, int* sign, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   detail::lgamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::lgamma_imp(static_cast<value_type>(z), forwarding_policy(), evaluation_type(), sign), "boost::math::lgamma<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   lgamma(T z, int* sign)
+{
+   return lgamma(z, sign, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   lgamma(T x, const Policy& pol)
+{
+   return ::boost::math::lgamma(x, 0, pol);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   lgamma(T x)
+{
+   return ::boost::math::lgamma(x, 0, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   tgamma1pm1(T z, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<typename remove_cv<result_type>::type, forwarding_policy>(detail::tgammap1m1_imp(static_cast<value_type>(z), forwarding_policy(), evaluation_type()), "boost::math::tgamma1pm1<%!%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   tgamma1pm1(T z)
+{
+   return tgamma1pm1(z, policies::policy<>());
+}
+
+//
+// Full upper incomplete gamma:
+//
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma(T1 a, T2 z)
+{
+   //
+   // Type T2 could be a policy object, or a value, select the 
+   // right overload based on T2:
+   //
+   typedef typename policies::is_policy<T2>::type maybe_policy;
+   return detail::tgamma(a, z, maybe_policy());
+}
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma(T1 a, T2 z, const Policy& pol)
+{
+   return detail::tgamma(a, z, pol, mpl::false_());
+}
+//
+// Full lower incomplete gamma:
+//
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma_lower(T1 a, T2 z, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   // typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   detail::igamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_incomplete_imp(static_cast<value_type>(a),
+      static_cast<value_type>(z), false, false,
+      forwarding_policy(), static_cast<value_type*>(0)), "tgamma_lower<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   tgamma_lower(T1 a, T2 z)
+{
+   return tgamma_lower(a, z, policies::policy<>());
+}
+//
+// Regularised upper incomplete gamma:
+//
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type
+   gamma_q(T1 a, T2 z, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   // typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   detail::igamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_incomplete_imp(static_cast<value_type>(a),
+      static_cast<value_type>(z), true, true,
+      forwarding_policy(), static_cast<value_type*>(0)), "gamma_q<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   gamma_q(T1 a, T2 z)
+{
+   return gamma_q(a, z, policies::policy<>());
+}
+//
+// Regularised lower incomplete gamma:
+//
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type
+   gamma_p(T1 a, T2 z, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   // typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   detail::igamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::gamma_incomplete_imp(static_cast<value_type>(a),
+      static_cast<value_type>(z), true, false,
+      forwarding_policy(), static_cast<value_type*>(0)), "gamma_p<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type
+   gamma_p(T1 a, T2 z)
+{
+   return gamma_p(a, z, policies::policy<>());
+}
+
+// ratios of gamma functions:
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   tgamma_delta_ratio(T1 z, T2 delta, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::tgamma_delta_ratio_imp(static_cast<value_type>(z), static_cast<value_type>(delta), forwarding_policy()), "boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   tgamma_delta_ratio(T1 z, T2 delta)
+{
+   return tgamma_delta_ratio(z, delta, policies::policy<>());
+}
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   tgamma_ratio(T1 a, T2 b, const Policy&)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::tgamma_ratio_imp(static_cast<value_type>(a), static_cast<value_type>(b), forwarding_policy()), "boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   tgamma_ratio(T1 a, T2 b)
+{
+   return tgamma_ratio(a, b, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_derivative(T1 a, T2 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::gamma_p_derivative_imp(static_cast<value_type>(a), static_cast<value_type>(x), forwarding_policy()), "boost::math::gamma_p_derivative<%1%>(%1%, %1%)");
+}
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   gamma_p_derivative(T1 a, T2 x)
+{
+   return gamma_p_derivative(a, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif
+
+#include <boost/math/special_functions/detail/igamma_inverse.hpp>
+#include <boost/math/special_functions/detail/gamma_inva.hpp>
+#include <boost/math/special_functions/erf.hpp>
+
+#endif // BOOST_MATH_SF_GAMMA_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/hankel.hpp b/gatb-core/thirdparty/boost/math/special_functions/hankel.hpp
new file mode 100644
index 0000000..4266ef8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/hankel.hpp
@@ -0,0 +1,180 @@
+// Copyright John Maddock 2012.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_HANKEL_HPP
+#define BOOST_MATH_HANKEL_HPP
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/bessel.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T, class Policy>
+std::complex<T> hankel_imp(T v, T x, const bessel_no_int_tag&, const Policy& pol, int sign)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::cyl_hankel_1<%1%>(%1%,%1%)";
+
+   if(x < 0)
+   {
+      bool isint_v = floor(v) == v;
+      T j, y;
+      bessel_jy(v, -x, &j, &y, need_j | need_y, pol);
+      std::complex<T> cx(x), cv(v);
+      std::complex<T> j_result, y_result;
+      if(isint_v)
+      {
+         int s = (iround(v) & 1) ? -1 : 1;
+         j_result = j * s;
+         y_result = T(s) * (y - (2 / constants::pi<T>()) * (log(-x) - log(cx)) * j);
+      }
+      else
+      {
+         j_result = pow(cx, v) * pow(-cx, -v) * j;
+         T p1 = pow(-x, v);
+         std::complex<T> p2 = pow(cx, v);
+         y_result = p1 * y / p2
+            + (p2 / p1 - p1 / p2) * j / tan(constants::pi<T>() * v);
+      }
+      // multiply y_result by i:
+      y_result = std::complex<T>(-sign * y_result.imag(), sign * y_result.real());
+      return j_result + y_result;
+   }
+
+   if(x == 0)
+   {
+      if(v == 0)
+      {
+         // J is 1, Y is -INF
+         return std::complex<T>(1, sign * -policies::raise_overflow_error<T>(function, 0, pol));
+      }
+      else
+      {
+         // At least one of J and Y is complex infinity:
+         return std::complex<T>(policies::raise_overflow_error<T>(function, 0, pol), sign * policies::raise_overflow_error<T>(function, 0, pol));
+      }
+   }
+
+   T j, y;
+   bessel_jy(v, x, &j, &y, need_j | need_y, pol);
+   return std::complex<T>(j, sign * y);
+}
+
+template <class T, class Policy>
+std::complex<T> hankel_imp(int v, T x, const bessel_int_tag&, const Policy& pol, int sign);
+
+template <class T, class Policy>
+inline std::complex<T> hankel_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& pol, int sign)
+{
+   BOOST_MATH_STD_USING  // ADL of std names.
+   int ival = detail::iconv(v, pol);
+   if(0 == v - ival)
+   {
+      return hankel_imp(ival, x, bessel_int_tag(), pol, sign);
+   }
+   return hankel_imp(v, x, bessel_no_int_tag(), pol, sign);
+}
+
+template <class T, class Policy>
+inline std::complex<T> hankel_imp(int v, T x, const bessel_int_tag&, const Policy& pol, int sign)
+{
+   BOOST_MATH_STD_USING
+   if((std::abs(v) < 200) && (x > 0))
+      return std::complex<T>(bessel_jn(v, x, pol), sign * bessel_yn(v, x, pol));
+   return hankel_imp(static_cast<T>(v), x, bessel_no_int_tag(), pol, sign);
+}
+
+template <class T, class Policy>
+inline std::complex<T> sph_hankel_imp(T v, T x, const Policy& pol, int sign)
+{
+   BOOST_MATH_STD_USING
+   return constants::root_half_pi<T>() * hankel_imp(v + 0.5f, x, bessel_no_int_tag(), pol, sign) / sqrt(std::complex<T>(x));
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> cyl_hankel_1(T1 v, T2 x, const Policy& pol)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<std::complex<result_type>, Policy>(detail::hankel_imp<value_type>(v, static_cast<value_type>(x), tag_type(), pol, 1), "boost::math::cyl_hankel_1<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> cyl_hankel_1(T1 v, T2 x)
+{
+   return cyl_hankel_1(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> cyl_hankel_2(T1 v, T2 x, const Policy& pol)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<std::complex<result_type>, Policy>(detail::hankel_imp<value_type>(v, static_cast<value_type>(x), tag_type(), pol, -1), "boost::math::cyl_hankel_1<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> cyl_hankel_2(T1 v, T2 x)
+{
+   return cyl_hankel_2(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> sph_hankel_1(T1 v, T2 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<std::complex<result_type>, Policy>(detail::sph_hankel_imp<value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy(), 1), "boost::math::sph_hankel_1<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> sph_hankel_1(T1 v, T2 x)
+{
+   return sph_hankel_1(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> sph_hankel_2(T1 v, T2 x, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return policies::checked_narrowing_cast<std::complex<result_type>, Policy>(detail::sph_hankel_imp<value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy(), -1), "boost::math::sph_hankel_1<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> sph_hankel_2(T1 v, T2 x)
+{
+   return sph_hankel_2(v, x, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_HANKEL_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/hermite.hpp b/gatb-core/thirdparty/boost/math/special_functions/hermite.hpp
new file mode 100644
index 0000000..1221f41
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/hermite.hpp
@@ -0,0 +1,76 @@
+
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_HERMITE_HPP
+#define BOOST_MATH_SPECIAL_HERMITE_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{
+namespace math{
+
+// Recurrance relation for Hermite polynomials:
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   hermite_next(unsigned n, T1 x, T2 Hn, T3 Hnm1)
+{
+   return (2 * x * Hn - 2 * n * Hnm1);
+}
+
+namespace detail{
+
+// Implement Hermite polynomials via recurrance:
+template <class T>
+T hermite_imp(unsigned n, T x)
+{
+   T p0 = 1;
+   T p1 = 2 * x;
+
+   if(n == 0)
+      return p0;
+
+   unsigned c = 1;
+
+   while(c < n)
+   {
+      std::swap(p0, p1);
+      p1 = hermite_next(c, x, p0, p1);
+      ++c;
+   }
+   return p1;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   hermite(unsigned n, T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::hermite_imp(n, static_cast<value_type>(x)), "boost::math::hermite<%1%>(unsigned, %1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   hermite(unsigned n, T x)
+{
+   return boost::math::hermite(n, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_HERMITE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/heuman_lambda.hpp b/gatb-core/thirdparty/boost/math/special_functions/heuman_lambda.hpp
new file mode 100644
index 0000000..6389443
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/heuman_lambda.hpp
@@ -0,0 +1,87 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_ELLINT_HL_HPP
+#define BOOST_MATH_ELLINT_HL_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/jacobi_zeta.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+
+// Elliptic integral the Jacobi Zeta function.
+
+namespace boost { namespace math { 
+   
+namespace detail{
+
+// Elliptic integral - Jacobi Zeta
+template <typename T, typename Policy>
+T heuman_lambda_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    const char* function = "boost::math::heuman_lambda<%1%>(%1%, %1%)";
+
+    if(fabs(k) > 1)
+       return policies::raise_domain_error<T>(function, "We require |k| <= 1 but got k = %1%", k, pol);
+
+    T result;
+    T sinp = sin(phi);
+    T cosp = cos(phi);
+    T s2 = sinp * sinp;
+    T k2 = k * k;
+    T kp = 1 - k2;
+    T delta = sqrt(1 - (kp * s2));
+    if(fabs(phi) <= constants::half_pi<T>())
+    {
+       result = kp * sinp * cosp / (delta * constants::half_pi<T>());
+       result *= ellint_rf_imp(T(0), kp, T(1), pol) + k2 * ellint_rj(T(0), kp, T(1), T(1 - k2 / (delta * delta)), pol) / (3 * delta * delta);
+    }
+    else
+    {
+       T rkp = sqrt(kp);
+       T ratio;
+       if(rkp == 1)
+       {
+          return policies::raise_domain_error<T>(function, "When 1-k^2 == 1 then phi must be < Pi/2, but got phi = %1%", phi, pol);
+       }
+       else
+          ratio = ellint_f_imp(phi, rkp, pol) / ellint_k_imp(rkp, pol);
+       result = ratio + ellint_k_imp(k, pol) * jacobi_zeta_imp(phi, rkp, pol) / constants::half_pi<T>();
+    }
+    return result;
+}
+
+} // detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::heuman_lambda_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::heuman_lambda<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi)
+{
+   return boost::math::heuman_lambda(k, phi, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/hypot.hpp b/gatb-core/thirdparty/boost/math/special_functions/hypot.hpp
new file mode 100644
index 0000000..efe1a3f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/hypot.hpp
@@ -0,0 +1,86 @@
+//  (C) Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_HYPOT_INCLUDED
+#define BOOST_MATH_HYPOT_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <algorithm> // for swap
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::sqrt; using ::fabs; }
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+T hypot_imp(T x, T y, const Policy& pol)
+{
+   //
+   // Normalize x and y, so that both are positive and x >= y:
+   //
+   using std::fabs; using std::sqrt; // ADL of std names
+
+   x = fabs(x);
+   y = fabs(y);
+
+#ifdef BOOST_MSVC
+#pragma warning(push) 
+#pragma warning(disable: 4127)
+#endif
+   // special case, see C99 Annex F:
+   if(std::numeric_limits<T>::has_infinity
+      && ((x == std::numeric_limits<T>::infinity())
+      || (y == std::numeric_limits<T>::infinity())))
+      return policies::raise_overflow_error<T>("boost::math::hypot<%1%>(%1%,%1%)", 0, pol);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+   if(y > x)
+      (std::swap)(x, y);
+
+   if(x * tools::epsilon<T>() >= y)
+      return x;
+
+   T rat = y / x;
+   return x * sqrt(1 + rat*rat);
+} // template <class T> T hypot(T x, T y)
+
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   hypot(T1 x, T2 y)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::hypot_imp(
+      static_cast<result_type>(x), static_cast<result_type>(y), policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   hypot(T1 x, T2 y, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::hypot_imp(
+      static_cast<result_type>(x), static_cast<result_type>(y), pol);
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_HYPOT_INCLUDED
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/jacobi_elliptic.hpp b/gatb-core/thirdparty/boost/math/special_functions/jacobi_elliptic.hpp
new file mode 100644
index 0000000..3ffc011
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/jacobi_elliptic.hpp
@@ -0,0 +1,321 @@
+// Copyright John Maddock 2012.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_JACOBI_ELLIPTIC_HPP
+#define BOOST_MATH_JACOBI_ELLIPTIC_HPP
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T, class Policy>
+T jacobi_recurse(const T& x, const T& k, T anm1, T bnm1, unsigned N, T* pTn, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   ++N;
+   T Tn;
+   T cn = (anm1 - bnm1) / 2;
+   T an = (anm1 + bnm1) / 2;
+   if(cn < policies::get_epsilon<T, Policy>())
+   {
+      Tn = ldexp(T(1), (int)N) * x * an;
+   }
+   else
+      Tn = jacobi_recurse<T>(x, k, an, sqrt(anm1 * bnm1), N, 0, pol);
+   if(pTn)
+      *pTn = Tn;
+   return (Tn + asin((cn / an) * sin(Tn))) / 2;
+}
+
+template <class T, class Policy>
+T jacobi_imp(const T& x, const T& k, T* cn, T* dn, const Policy& pol, const char* function)
+{
+   BOOST_MATH_STD_USING
+   if(k < 0)
+   {
+      *cn = policies::raise_domain_error<T>(function, "Modulus k must be positive but got %1%.", k, pol);
+      *dn = *cn;
+      return *cn;
+   }
+   if(k > 1)
+   {
+      T xp = x * k;
+      T kp = 1 / k;
+      T snp, cnp, dnp;
+      snp = jacobi_imp(xp, kp, &cnp, &dnp, pol, function);
+      *cn = dnp;
+      *dn = cnp;
+      return snp * kp;
+   }
+   //
+   // Special cases first:
+   //
+   if(x == 0)
+   {
+      *cn = *dn = 1;
+      return 0;
+   }
+   if(k == 0)
+   {
+      *cn = cos(x);
+      *dn = 1;
+      return sin(x);
+   }
+   if(k == 1)
+   {
+      *cn = *dn = 1 / cosh(x);
+      return tanh(x);
+   }
+   //
+   // Asymptotic forms from A&S 16.13:
+   //
+   if(k < tools::forth_root_epsilon<T>())
+   {
+      T su = sin(x);
+      T cu = cos(x);
+      T m = k * k;
+      *dn = 1 - m * su * su / 2;
+      *cn = cu + m * (x - su * cu) * su / 4;
+      return su - m * (x - su * cu) * cu / 4;
+   }
+   /*  Can't get this to work to adequate precision - disabled for now...
+   //
+   // Asymptotic forms from A&S 16.15:
+   //
+   if(k > 1 - tools::root_epsilon<T>())
+   {
+      T tu = tanh(x);
+      T su = sinh(x);
+      T cu = cosh(x);
+      T sec = 1 / cu;
+      T kp = 1 - k;
+      T m1 = 2 * kp - kp * kp;
+      *dn = sec + m1 * (su * cu + x) * tu * sec / 4;
+      *cn = sec - m1 * (su * cu - x) * tu * sec / 4;
+      T sn = tu;
+      T sn2 = m1 * (x * sec * sec - tu) / 4;
+      T sn3 = (72 * x * cu + 4 * (8 * x * x - 5) * su - 19 * sinh(3 * x) + sinh(5 * x)) * sec * sec * sec * m1 * m1 / 512;
+      return sn + sn2 - sn3;
+   }*/
+   T T1;
+   T kc = 1 - k;
+   T k_prime = k < 0.5 ? T(sqrt(1 - k * k)) : T(sqrt(2 * kc - kc * kc));
+   T T0 = jacobi_recurse(x, k, T(1), k_prime, 0, &T1, pol);
+   *cn = cos(T0);
+   *dn = cos(T0) / cos(T1 - T0);
+   return sin(T0);
+}
+
+} // namespace detail
+
+template <class T, class U, class V, class Policy>
+inline typename tools::promote_args<T, U, V>::type jacobi_elliptic(T k, U theta, V* pcn, V* pdn, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   static const char* function = "boost::math::jacobi_elliptic<%1%>(%1%)";
+
+   value_type sn, cn, dn;
+   sn = detail::jacobi_imp<value_type>(static_cast<value_type>(theta), static_cast<value_type>(k), &cn, &dn, forwarding_policy(), function);
+   if(pcn)
+      *pcn = policies::checked_narrowing_cast<result_type, Policy>(cn, function);
+   if(pdn)
+      *pdn = policies::checked_narrowing_cast<result_type, Policy>(dn, function);
+   return policies::checked_narrowing_cast<result_type, Policy>(sn, function);;
+}
+
+template <class T, class U, class V>
+inline typename tools::promote_args<T, U, V>::type jacobi_elliptic(T k, U theta, V* pcn, V* pdn)
+{
+   return jacobi_elliptic(k, theta, pcn, pdn, policies::policy<>());
+}
+
+template <class U, class T, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_sn(U k, T theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   return jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), static_cast<result_type*>(0), static_cast<result_type*>(0), pol);
+}
+
+template <class U, class T>
+inline typename tools::promote_args<T, U>::type jacobi_sn(U k, T theta)
+{
+   return jacobi_sn(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_cn(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type cn;
+   jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), &cn, static_cast<result_type*>(0), pol);
+   return cn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_cn(T k, U theta)
+{
+   return jacobi_cn(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_dn(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type dn;
+   jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), static_cast<result_type*>(0), &dn, pol);
+   return dn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_dn(T k, U theta)
+{
+   return jacobi_dn(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_cd(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type cn, dn;
+   jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), &cn, &dn, pol);
+   return cn / dn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_cd(T k, U theta)
+{
+   return jacobi_cd(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_dc(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type cn, dn;
+   jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), &cn, &dn, pol);
+   return dn / cn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_dc(T k, U theta)
+{
+   return jacobi_dc(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_ns(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   return 1 / jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), static_cast<result_type*>(0), static_cast<result_type*>(0), pol);
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_ns(T k, U theta)
+{
+   return jacobi_ns(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_sd(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type sn, dn;
+   sn = jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), static_cast<result_type*>(0), &dn, pol);
+   return sn / dn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_sd(T k, U theta)
+{
+   return jacobi_sd(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_ds(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type sn, dn;
+   sn = jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), static_cast<result_type*>(0), &dn, pol);
+   return dn / sn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_ds(T k, U theta)
+{
+   return jacobi_ds(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_nc(T k, U theta, const Policy& pol)
+{
+   return 1 / jacobi_cn(k, theta, pol);
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_nc(T k, U theta)
+{
+   return jacobi_nc(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_nd(T k, U theta, const Policy& pol)
+{
+   return 1 / jacobi_dn(k, theta, pol);
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_nd(T k, U theta)
+{
+   return jacobi_nd(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_sc(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type sn, cn;
+   sn = jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), &cn, static_cast<result_type*>(0), pol);
+   return sn / cn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_sc(T k, U theta)
+{
+   return jacobi_sc(k, theta, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type jacobi_cs(T k, U theta, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   result_type sn, cn;
+   sn = jacobi_elliptic(static_cast<result_type>(k), static_cast<result_type>(theta), &cn, static_cast<result_type*>(0), pol);
+   return cn / sn;
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type jacobi_cs(T k, U theta)
+{
+   return jacobi_cs(k, theta, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_JACOBI_ELLIPTIC_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/jacobi_zeta.hpp b/gatb-core/thirdparty/boost/math/special_functions/jacobi_zeta.hpp
new file mode 100644
index 0000000..a3fa547
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/jacobi_zeta.hpp
@@ -0,0 +1,74 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_MATH_ELLINT_JZ_HPP
+#define BOOST_MATH_ELLINT_JZ_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+
+// Elliptic integral the Jacobi Zeta function.
+
+namespace boost { namespace math { 
+   
+namespace detail{
+
+// Elliptic integral - Jacobi Zeta
+template <typename T, typename Policy>
+T jacobi_zeta_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+    T sinp = sin(phi);
+    T cosp = cos(phi);
+    T s2 = sinp * sinp;
+    T k2 = k * k;
+    T kp = 1 - k2;
+    if(k == 1)
+       result = sinp * (boost::math::sign)(cosp);  // We get here by simplifying JacobiZeta[w, 1] in Mathematica, and the fact that 0 <= phi.
+    else
+       result = k2 * sinp * cosp * sqrt(1 - k2 * s2) * ellint_rj_imp(T(0), kp, T(1), T(1 - k2 * s2), pol) / (3 * ellint_k_imp(k, pol));
+    return invert ? T(-result) : result;
+}
+
+} // detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::jacobi_zeta_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::jacobi_zeta<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi)
+{
+   return boost::math::jacobi_zeta(k, phi, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/laguerre.hpp b/gatb-core/thirdparty/boost/math/special_functions/laguerre.hpp
new file mode 100644
index 0000000..070927f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/laguerre.hpp
@@ -0,0 +1,139 @@
+
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_LAGUERRE_HPP
+#define BOOST_MATH_SPECIAL_LAGUERRE_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{
+namespace math{
+
+// Recurrance relation for Laguerre polynomials:
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type  
+   laguerre_next(unsigned n, T1 x, T2 Ln, T3 Lnm1)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ((2 * n + 1 - result_type(x)) * result_type(Ln) - n * result_type(Lnm1)) / (n + 1);
+}
+
+namespace detail{
+
+// Implement Laguerre polynomials via recurrance:
+template <class T>
+T laguerre_imp(unsigned n, T x)
+{
+   T p0 = 1;
+   T p1 = 1 - x;
+
+   if(n == 0)
+      return p0;
+
+   unsigned c = 1;
+
+   while(c < n)
+   {
+      std::swap(p0, p1);
+      p1 = laguerre_next(c, x, p0, p1);
+      ++c;
+   }
+   return p1;
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+laguerre(unsigned n, T x, const Policy&, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::laguerre_imp(n, static_cast<value_type>(x)), "boost::math::laguerre<%1%>(unsigned, %1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   laguerre(unsigned n, unsigned m, T x, const mpl::false_&)
+{
+   return boost::math::laguerre(n, m, x, policies::policy<>());
+}
+
+} // namespace detail
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   laguerre(unsigned n, T x)
+{
+   return laguerre(n, x, policies::policy<>());
+}
+
+// Recurrence for associated polynomials:
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type  
+   laguerre_next(unsigned n, unsigned l, T1 x, T2 Pl, T3 Plm1)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ((2 * n + l + 1 - result_type(x)) * result_type(Pl) - (n + l) * result_type(Plm1)) / (n+1);
+}
+
+namespace detail{
+// Laguerre Associated Polynomial:
+template <class T, class Policy>
+T laguerre_imp(unsigned n, unsigned m, T x, const Policy& pol)
+{
+   // Special cases:
+   if(m == 0)
+      return boost::math::laguerre(n, x, pol);
+
+   T p0 = 1;
+   
+   if(n == 0)
+      return p0;
+
+   T p1 = m + 1 - x;
+
+   unsigned c = 1;
+
+   while(c < n)
+   {
+      std::swap(p0, p1);
+      p1 = laguerre_next(c, m, x, p0, p1);
+      ++c;
+   }
+   return p1;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   laguerre(unsigned n, unsigned m, T x, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::laguerre_imp(n, m, static_cast<value_type>(x), pol), "boost::math::laguerre<%1%>(unsigned, unsigned, %1%)");
+}
+
+template <class T1, class T2>
+inline typename laguerre_result<T1, T2>::type 
+   laguerre(unsigned n, T1 m, T2 x)
+{
+   typedef typename policies::is_policy<T2>::type tag_type;
+   return detail::laguerre(n, m, x, tag_type());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_LAGUERRE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/lanczos.hpp b/gatb-core/thirdparty/boost/math/special_functions/lanczos.hpp
new file mode 100644
index 0000000..0db21d3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/lanczos.hpp
@@ -0,0 +1,1296 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS
+#define BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/limits.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/mpl/less_equal.hpp>
+
+#include <limits.h>
+
+namespace boost{ namespace math{ namespace lanczos{
+
+//
+// Individual lanczos approximations start here.
+//
+// Optimal values for G for each N are taken from
+// http://web.mala.bc.ca/pughg/phdThesis/phdThesis.pdf,
+// as are the theoretical error bounds.
+//
+// Constants calculated using the method described by Godfrey
+// http://my.fit.edu/~gabdo/gamma.txt and elaborated by Toth at
+// http://www.rskey.org/gamma.htm using NTL::RR at 1000 bit precision.
+//
+// Begin with a small helper to force initialization of constants prior
+// to main.  This makes the constant initialization thread safe, even
+// when called with a user-defined number type.
+//
+template <class Lanczos, class T>
+struct lanczos_initializer
+{
+   struct init
+   {
+      init()
+      {
+         T t(1);
+         Lanczos::lanczos_sum(t);
+         Lanczos::lanczos_sum_expG_scaled(t);
+         Lanczos::lanczos_sum_near_1(t);
+         Lanczos::lanczos_sum_near_2(t);
+         Lanczos::g();
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+template <class Lanczos, class T>
+typename lanczos_initializer<Lanczos, T>::init const lanczos_initializer<Lanczos, T>::initializer;
+//
+// Lanczos Coefficients for N=6 G=5.581
+// Max experimental error (with arbitary precision arithmetic) 9.516e-12
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos6 : public mpl::int_<35>
+{
+   //
+   // Produces slightly better than float precision when evaluated at
+   // double precision:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos6, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[6] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 8706.349592549009182288174442774377925882)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 8523.650341121874633477483696775067709735)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 3338.029219476423550899999750161289306564)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 653.6424994294008795995653541449610986791)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 63.99951844938187085666201263218840287667)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 2.506628274631006311133031631822390264407))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint16_t) denom[6] = {
+         static_cast<boost::uint16_t>(0u),
+         static_cast<boost::uint16_t>(24u),
+         static_cast<boost::uint16_t>(50u),
+         static_cast<boost::uint16_t>(35u),
+         static_cast<boost::uint16_t>(10u),
+         static_cast<boost::uint16_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos6, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[6] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 32.81244541029783471623665933780748627823)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 32.12388941444332003446077108933558534361)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 12.58034729455216106950851080138931470954)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 2.463444478353241423633780693218408889251)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 0.2412010548258800231126240760264822486599)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 0.009446967704539249494420221613134244048319))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint16_t) denom[6] = {
+         static_cast<boost::uint16_t>(0u),
+         static_cast<boost::uint16_t>(24u),
+         static_cast<boost::uint16_t>(50u),
+         static_cast<boost::uint16_t>(35u),
+         static_cast<boost::uint16_t>(10u),
+         static_cast<boost::uint16_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos6, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[5] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 2.044879010930422922760429926121241330235)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, -2.751366405578505366591317846728753993668)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 1.02282965224225004296750609604264824677)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, -0.09786124911582813985028889636665335893627)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 0.0009829742267506615183144364420540766510112)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos6, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[5] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 5.748142489536043490764289256167080091892)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, -7.734074268282457156081021756682138251825)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 2.875167944990511006997713242805893543947)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, -0.2750873773533504542306766137703788781776)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 35, 0.002763134585812698552178368447708846850353)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 5.581000000000000405009359383257105946541; }
+};
+
+//
+// Lanczos Coefficients for N=11 G=10.900511
+// Max experimental error (with arbitary precision arithmetic) 2.16676e-19
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos11 : public mpl::int_<60>
+{
+   //
+   // Produces slightly better than double precision when evaluated at
+   // extended-double precision:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos11, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[11] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 38474670393.31776828316099004518914832218)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 36857665043.51950660081971227404959150474)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 15889202453.72942008945006665994637853242)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 4059208354.298834770194507810788393801607)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 680547661.1834733286087695557084801366446)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 78239755.00312005289816041245285376206263)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 6246580.776401795264013335510453568106366)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 341986.3488721347032223777872763188768288)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 12287.19451182455120096222044424100527629)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 261.6140441641668190791708576058805625502)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 2.506628274631000502415573855452633787834))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[11] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(362880u),
+         static_cast<boost::uint32_t>(1026576u),
+         static_cast<boost::uint32_t>(1172700u),
+         static_cast<boost::uint32_t>(723680u),
+         static_cast<boost::uint32_t>(269325u),
+         static_cast<boost::uint32_t>(63273u),
+         static_cast<boost::uint32_t>(9450u),
+         static_cast<boost::uint32_t>(870u),
+         static_cast<boost::uint32_t>(45u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos11, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[11] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 709811.662581657956893540610814842699825)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 679979.847415722640161734319823103390728)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 293136.785721159725251629480984140341656)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 74887.5403291467179935942448101441897121)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 12555.29058241386295096255111537516768137)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 1443.42992444170669746078056942194198252)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 115.2419459613734722083208906727972935065)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 6.30923920573262762719523981992008976989)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.2266840463022436475495508977579735223818)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.004826466289237661857584712046231435101741)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.4624429436045378766270459638520555557321e-4))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[11] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(362880u),
+         static_cast<boost::uint32_t>(1026576u),
+         static_cast<boost::uint32_t>(1172700u),
+         static_cast<boost::uint32_t>(723680u),
+         static_cast<boost::uint32_t>(269325u),
+         static_cast<boost::uint32_t>(63273u),
+         static_cast<boost::uint32_t>(9450u),
+         static_cast<boost::uint32_t>(870u),
+         static_cast<boost::uint32_t>(45u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos11, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[10] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 4.005853070677940377969080796551266387954)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -13.17044315127646469834125159673527183164)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 17.19146865350790353683895137079288129318)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -11.36446409067666626185701599196274701126)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 4.024801119349323770107694133829772634737)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -0.7445703262078094128346501724255463005006)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.06513861351917497265045550019547857713172)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -0.00217899958561830354633560009312512312758)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.17655204574495137651670832229571934738e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -0.1036282091079938047775645941885460820853e-7)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos11, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[10] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 19.05889633808148715159575716844556056056)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -62.66183664701721716960978577959655644762)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 81.7929198065004751699057192860287512027)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -54.06941772964234828416072865069196553015)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 19.14904664790693019642068229478769661515)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -3.542488556926667589704590409095331790317)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.3099140334815639910894627700232804503017)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -0.01036716187296241640634252431913030440825)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, 0.8399926504443119927673843789048514017761e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 60, -0.493038376656195010308610694048822561263e-7)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 10.90051099999999983936049829935654997826; }
+};
+
+//
+// Lanczos Coefficients for N=13 G=13.144565
+// Max experimental error (with arbitary precision arithmetic) 9.2213e-23
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos13 : public mpl::int_<72>
+{
+   //
+   // Produces slightly better than extended-double precision when evaluated at
+   // higher precision:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos13, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[13] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 44012138428004.60895436261759919070125699)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 41590453358593.20051581730723108131357995)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 18013842787117.99677796276038389462742949)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 4728736263475.388896889723995205703970787)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 837910083628.4046470415724300225777912264)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 105583707273.4299344907359855510105321192)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 9701363618.494999493386608345339104922694)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 654914397.5482052641016767125048538245644)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 32238322.94213356530668889463945849409184)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 1128514.219497091438040721811544858643121)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 26665.79378459858944762533958798805525125)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 381.8801248632926870394389468349331394196)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 2.506628274631000502415763426076722427007))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos13, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[13] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 86091529.53418537217994842267760536134841)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 81354505.17858011242874285785316135398567)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 35236626.38815461910817650960734605416521)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 9249814.988024471294683815872977672237195)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 1639024.216687146960253839656643518985826)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 206530.8157641225032631778026076868855623)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 18976.70193530288915698282139308582105936)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 1281.068909912559479885759622791374106059)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 63.06093343420234536146194868906771599354)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 2.207470909792527638222674678171050209691)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.05216058694613505427476207805814960742102)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.0007469903808915448316510079585999893674101)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.4903180573459871862552197089738373164184e-5))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos13, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[12] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 4.832115561461656947793029596285626840312)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -19.86441536140337740383120735104359034688)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 33.9927422807443239927197864963170585331)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -31.41520692249765980987427413991250886138)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 17.0270866009599345679868972409543597821)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -5.5077216950865501362506920516723682167)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 1.037811741948214855286817963800439373362)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.106640468537356182313660880481398642811)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.005276450526660653288757565778182586742831)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.0001000935625597121545867453746252064770029)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.462590910138598083940803704521211569234e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.1735307814426389420248044907765671743012e-9)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos13, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[12] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 26.96979819614830698367887026728396466395)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -110.8705424709385114023884328797900204863)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 189.7258846119231466417015694690434770085)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -175.3397202971107486383321670769397356553)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 95.03437648691551457087250340903980824948)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -30.7406022781665264273675797983497141978)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 5.792405601630517993355102578874590410552)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.5951993240669148697377539518639997795831)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.02944979359164017509944724739946255067671)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.0005586586555377030921194246330399163602684)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, 0.2581888478270733025288922038673392636029e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 72, -0.9685385411006641478305219367315965391289e-9)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 13.1445650000000000545696821063756942749; }
+};
+
+//
+// Lanczos Coefficients for N=22 G=22.61891
+// Max experimental error (with arbitary precision arithmetic) 2.9524e-38
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos22 : public mpl::int_<120>
+{
+   //
+   // Produces slightly better than 128-bit long-double precision when 
+   // evaluated at higher precision:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos22, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 46198410803245094237463011094.12173081986)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 43735859291852324413622037436.321513777)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 19716607234435171720534556386.97481377748)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5629401471315018442177955161.245623932129)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1142024910634417138386281569.245580222392)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 175048529315951173131586747.695329230778)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 21044290245653709191654675.41581372963167)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2033001410561031998451380.335553678782601)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 160394318862140953773928.8736211601848891)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 10444944438396359705707.48957290388740896)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 565075825801617290121.1466393747967538948)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 25475874292116227538.99448534450411942597)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 957135055846602154.6720835535232270205725)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 29874506304047462.23662392445173880821515)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 769651310384737.2749087590725764959689181)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 16193289100889.15989633624378404096011797)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 273781151680.6807433264462376754578933261)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3630485900.32917021712188739762161583295)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 36374352.05577334277856865691538582936484)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 258945.7742115532455441786924971194951043)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1167.501919472435718934219997431551246996)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2.50662827463100050241576528481104525333))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[22] = {
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2432902008176640000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8752948036761600000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(13803759753640704000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(12870931245150988800, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8037811822645051776, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(3599979517947607200, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1206647803780373360, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(311333643161390640, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(63030812099294896, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(10142299865511450, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307535010540395, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(135585182899530, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(11310276995381, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(756111184500, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(40171771630, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1672280820, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(53327946, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1256850, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(20615, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(210, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos22, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[22] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 6939996264376682180.277485395074954356211)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 6570067992110214451.87201438870245659384)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2961859037444440551.986724631496417064121)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 845657339772791245.3541226499766163431651)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 171556737035449095.2475716923888737881837)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 26296059072490867.7822441885603400926007)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3161305619652108.433798300149816829198706)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 305400596026022.4774396904484542582526472)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 24094681058862.55120507202622377623528108)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1569055604375.919477574824168939428328839)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 84886558909.02047889339710230696942513159)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3827024985.166751989686050643579753162298)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 143782298.9273215199098728674282885500522)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 4487794.24541641841336786238909171265944)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 115618.2025760830513505888216285273541959)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 2432.580773108508276957461757328744780439)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 41.12782532742893597168530008461874360191)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.5453771709477689805460179187388702295792)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.005464211062612080347167337964166505282809)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.388992321263586767037090706042788910953e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.1753839324538447655939518484052327068859e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.3765495513732730583386223384116545391759e-9))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[22] = {
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2432902008176640000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8752948036761600000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(13803759753640704000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(12870931245150988800, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8037811822645051776, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(3599979517947607200, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1206647803780373360, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(311333643161390640, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(63030812099294896, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(10142299865511450, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307535010540395, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(135585182899530, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(11310276995381, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(756111184500, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(40171771630, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1672280820, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(53327946, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1256850, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(20615, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(210, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos22, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[21] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 8.318998691953337183034781139546384476554)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -63.15415991415959158214140353299240638675)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 217.3108224383632868591462242669081540163)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -448.5134281386108366899784093610397354889)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 619.2903759363285456927248474593012711346)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -604.1630177420625418522025080080444177046)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 428.8166750424646119935047118287362193314)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -224.6988753721310913866347429589434550302)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 87.32181627555510833499451817622786940961)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -25.07866854821128965662498003029199058098)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5.264398125689025351448861011657789005392)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.792518936256495243383586076579921559914)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.08317448364744713773350272460937904691566)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.005845345166274053157781068150827567998882)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.0002599412126352082483326238522490030412391)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.6748102079670763884917431338234783496303e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.908824383434109002762325095643458603605e-7)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.5299325929309389890892469299969669579725e-9)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.994306085859549890267983602248532869362e-12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.3499893692975262747371544905820891835298e-15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.7260746353663365145454867069182884694961e-20)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos22, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[21] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 75.39272007105208086018421070699575462226)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -572.3481967049935412452681346759966390319)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 1969.426202741555335078065370698955484358)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -4064.74968778032030891520063865996757519)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 5612.452614138013929794736248384309574814)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -5475.357667500026172903620177988213902339)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 3886.243614216111328329547926490398103492)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -2036.382026072125407192448069428134470564)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 791.3727954936062108045551843636692287652)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -227.2808432388436552794021219198885223122)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 47.70974355562144229897637024320739257284)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -7.182373807798293545187073539819697141572)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.7537866989631514559601547530490976100468)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.05297470142240154822658739758236594717787)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.00235577330936380542539812701472320434133)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.6115613067659273118098229498679502138802e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.8236417010170941915758315020695551724181e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.4802628430993048190311242611330072198089e-8)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.9011113376981524418952720279739624707342e-11)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, -0.3171854152689711198382455703658589996796e-14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 120, 0.6580207998808093935798753964580596673177e-19)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 22.61890999999999962710717227309942245483; }
+};
+
+//
+// Lanczos Coefficients for N=6 G=1.428456135094165802001953125
+// Max experimental error (with arbitary precision arithmetic) 8.111667e-8
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos6m24 : public mpl::int_<24>
+{
+   //
+   // Use for float precision, when evaluated as a float:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      static const T num[6] = {
+         static_cast<T>(58.52061591769095910314047740215847630266L),
+         static_cast<T>(182.5248962595894264831189414768236280862L),
+         static_cast<T>(211.0971093028510041839168287718170827259L),
+         static_cast<T>(112.2526547883668146736465390902227161763L),
+         static_cast<T>(27.5192015197455403062503721613097825345L),
+         static_cast<T>(2.50662858515256974113978724717473206342L)
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint16_t) denom[6] = {
+         static_cast<boost::uint16_t>(0u),
+         static_cast<boost::uint16_t>(24u),
+         static_cast<boost::uint16_t>(50u),
+         static_cast<boost::uint16_t>(35u),
+         static_cast<boost::uint16_t>(10u),
+         static_cast<boost::uint16_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      static const T num[6] = {
+         static_cast<T>(14.0261432874996476619570577285003839357L),
+         static_cast<T>(43.74732405540314316089531289293124360129L),
+         static_cast<T>(50.59547402616588964511581430025589038612L),
+         static_cast<T>(26.90456680562548195593733429204228910299L),
+         static_cast<T>(6.595765571169314946316366571954421695196L),
+         static_cast<T>(0.6007854010515290065101128585795542383721L)
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint16_t) denom[6] = {
+         static_cast<boost::uint16_t>(0u),
+         static_cast<boost::uint16_t>(24u),
+         static_cast<boost::uint16_t>(50u),
+         static_cast<boost::uint16_t>(35u),
+         static_cast<boost::uint16_t>(10u),
+         static_cast<boost::uint16_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      static const T d[5] = {
+         static_cast<T>(0.4922488055204602807654354732674868442106L),
+         static_cast<T>(0.004954497451132152436631238060933905650346L),
+         static_cast<T>(-0.003374784572167105840686977985330859371848L),
+         static_cast<T>(0.001924276018962061937026396537786414831385L),
+         static_cast<T>(-0.00056533046336427583708166383712907694434L),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[5] = {
+         static_cast<T>(0.6534966888520080645505805298901130485464L),
+         static_cast<T>(0.006577461728560758362509168026049182707101L),
+         static_cast<T>(-0.004480276069269967207178373559014835978161L),
+         static_cast<T>(0.00255461870648818292376982818026706528842L),
+         static_cast<T>(-0.000750517993690428370380996157470900204524L),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 1.428456135094165802001953125; }
+};
+
+//
+// Lanczos Coefficients for N=13 G=6.024680040776729583740234375
+// Max experimental error (with arbitary precision arithmetic) 1.196214e-17
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos13m53 : public mpl::int_<53>
+{
+   //
+   // Use for double precision, when evaluated as a double:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      static const T num[13] = {
+         static_cast<T>(23531376880.41075968857200767445163675473L),
+         static_cast<T>(42919803642.64909876895789904700198885093L),
+         static_cast<T>(35711959237.35566804944018545154716670596L),
+         static_cast<T>(17921034426.03720969991975575445893111267L),
+         static_cast<T>(6039542586.35202800506429164430729792107L),
+         static_cast<T>(1439720407.311721673663223072794912393972L),
+         static_cast<T>(248874557.8620541565114603864132294232163L),
+         static_cast<T>(31426415.58540019438061423162831820536287L),
+         static_cast<T>(2876370.628935372441225409051620849613599L),
+         static_cast<T>(186056.2653952234950402949897160456992822L),
+         static_cast<T>(8071.672002365816210638002902272250613822L),
+         static_cast<T>(210.8242777515793458725097339207133627117L),
+         static_cast<T>(2.506628274631000270164908177133837338626L)
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      static const T num[13] = {
+         static_cast<T>(56906521.91347156388090791033559122686859L),
+         static_cast<T>(103794043.1163445451906271053616070238554L),
+         static_cast<T>(86363131.28813859145546927288977868422342L),
+         static_cast<T>(43338889.32467613834773723740590533316085L),
+         static_cast<T>(14605578.08768506808414169982791359218571L),
+         static_cast<T>(3481712.15498064590882071018964774556468L),
+         static_cast<T>(601859.6171681098786670226533699352302507L),
+         static_cast<T>(75999.29304014542649875303443598909137092L),
+         static_cast<T>(6955.999602515376140356310115515198987526L),
+         static_cast<T>(449.9445569063168119446858607650988409623L),
+         static_cast<T>(19.51992788247617482847860966235652136208L),
+         static_cast<T>(0.5098416655656676188125178644804694509993L),
+         static_cast<T>(0.006061842346248906525783753964555936883222L)
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint32_t) denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      static const T d[12] = {
+         static_cast<T>(2.208709979316623790862569924861841433016L),
+         static_cast<T>(-3.327150580651624233553677113928873034916L),
+         static_cast<T>(1.483082862367253753040442933770164111678L),
+         static_cast<T>(-0.1993758927614728757314233026257810172008L),
+         static_cast<T>(0.004785200610085071473880915854204301886437L),
+         static_cast<T>(-0.1515973019871092388943437623825208095123e-5L),
+         static_cast<T>(-0.2752907702903126466004207345038327818713e-7L),
+         static_cast<T>(0.3075580174791348492737947340039992829546e-7L),
+         static_cast<T>(-0.1933117898880828348692541394841204288047e-7L),
+         static_cast<T>(0.8690926181038057039526127422002498960172e-8L),
+         static_cast<T>(-0.2499505151487868335680273909354071938387e-8L),
+         static_cast<T>(0.3394643171893132535170101292240837927725e-9L),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[12] = {
+         static_cast<T>(6.565936202082889535528455955485877361223L),
+         static_cast<T>(-9.8907772644920670589288081640128194231L),
+         static_cast<T>(4.408830289125943377923077727900630927902L),
+         static_cast<T>(-0.5926941084905061794445733628891024027949L),
+         static_cast<T>(0.01422519127192419234315002746252160965831L),
+         static_cast<T>(-0.4506604409707170077136555010018549819192e-5L),
+         static_cast<T>(-0.8183698410724358930823737982119474130069e-7L),
+         static_cast<T>(0.9142922068165324132060550591210267992072e-7L),
+         static_cast<T>(-0.5746670642147041587497159649318454348117e-7L),
+         static_cast<T>(0.2583592566524439230844378948704262291927e-7L),
+         static_cast<T>(-0.7430396708998719707642735577238449585822e-8L),
+         static_cast<T>(0.1009141566987569892221439918230042368112e-8L),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 6.024680040776729583740234375; }
+};
+
+//
+// Lanczos Coefficients for N=17 G=12.2252227365970611572265625
+// Max experimental error (with arbitary precision arithmetic) 2.7699e-26
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos17m64 : public mpl::int_<64>
+{
+   //
+   // Use for extended-double precision, when evaluated as an extended-double:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos17m64, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[17] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 553681095419291969.2230556393350368550504)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 731918863887667017.2511276782146694632234)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 453393234285807339.4627124634539085143364)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 174701893724452790.3546219631779712198035)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 46866125995234723.82897281620357050883077)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9281280675933215.169109622777099699054272)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1403600894156674.551057997617468721789536)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 165345984157572.7305349809894046783973837)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 15333629842677.31531822808737907246817024)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1123152927963.956626161137169462874517318)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 64763127437.92329018717775593533620578237)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2908830362.657527782848828237106640944457)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 99764700.56999856729959383751710026787811)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2525791.604886139959837791244686290089331)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 44516.94034970167828580039370201346554872)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 488.0063567520005730476791712814838113252)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2.50662827463100050241576877135758834683))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[17] = {
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307674368000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4339163001600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6165817614720, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(5056995703824, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2706813345600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1009672107080, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(272803210680, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(54631129553, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8207628000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(928095740, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(78558480, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4899622, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(218400, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6580, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(120, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos17m64, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[17] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2715894658327.717377557655133124376674911)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 3590179526097.912105038525528721129550434)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 2223966599737.814969312127353235818710172)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 856940834518.9562481809925866825485883417)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 229885871668.749072933597446453399395469)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 45526171687.54610815813502794395753410032)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 6884887713.165178784550917647709216424823)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 811048596.1407531864760282453852372777439)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 75213915.96540822314499613623119501704812)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 5509245.417224265151697527957954952830126)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 317673.5368435419126714931842182369574221)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 14268.27989845035520147014373320337523596)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 489.3618720403263670213909083601787814792)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 12.38941330038454449295883217865458609584)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.2183627389504614963941574507281683147897)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.002393749522058449186690627996063983095463)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1229541408909435212800785616808830746135e-4))
+      };
+      static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[17] = {
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307674368000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4339163001600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6165817614720, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(5056995703824, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2706813345600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1009672107080, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(272803210680, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(54631129553, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8207628000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(928095740, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(78558480, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4899622, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(218400, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6580, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(120, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos17m64, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[16] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 4.493645054286536365763334986866616581265)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -16.95716370392468543800733966378143997694)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 26.19196892983737527836811770970479846644)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -21.3659076437988814488356323758179283908)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 9.913992596774556590710751047594507535764)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -2.62888300018780199210536267080940382158)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.3807056693542503606384861890663080735588)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.02714647489697685807340312061034730486958)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.0007815484715461206757220527133967191796747)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.6108630817371501052576880554048972272435e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.5037380238864836824167713635482801545086e-8)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.1483232144262638814568926925964858237006e-13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1346609158752142460943888149156716841693e-14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.660492688923978805315914918995410340796e-15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.1472114697343266749193617793755763792681e-15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.1410901942033374651613542904678399264447e-16)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos17m64, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[16] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 23.56409085052261327114594781581930373708)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -88.92116338946308797946237246006238652361)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 137.3472822086847596961177383569603988797)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -112.0400438263562152489272966461114852861)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 51.98768915202973863076166956576777843805)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -13.78552090862799358221343319574970124948)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 1.996371068830872830250406773917646121742)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.1423525874909934506274738563671862576161)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.004098338646046865122459664947239111298524)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.3203286637326511000882086573060433529094e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.2641536751640138646146395939004587594407e-7)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.7777876663062235617693516558976641009819e-13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.7061443477097101636871806229515157914789e-14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.3463537849537988455590834887691613484813e-14)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, 0.7719578215795234036320348283011129450595e-15)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 64, -0.7398586479708476329563577384044188912075e-16)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 12.2252227365970611572265625; }
+};
+
+//
+// Lanczos Coefficients for N=24 G=20.3209821879863739013671875
+// Max experimental error (with arbitary precision arithmetic) 1.0541e-38
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos24m113 : public mpl::int_<113>
+{
+   //
+   // Use for long-double precision, when evaluated as an long-double:
+   //
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      lanczos_initializer<lanczos24m113, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[24] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2029889364934367661624137213253.22102954656825019111612712252027267955023987678816620961507)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2338599599286656537526273232565.2727349714338768161421882478417543004440597874814359063158)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1288527989493833400335117708406.3953711906175960449186720680201425446299360322830739180195)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 451779745834728745064649902914.550539158066332484594436145043388809847364393288132164411521)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 113141284461097964029239556815.291212318665536114012605167994061291631013303788706545334708)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 21533689802794625866812941616.7509064680880468667055339259146063256555368135236149614592432)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3235510315314840089932120340.71494940111731241353655381919722177496659303550321056514776757)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 393537392344185475704891959.081297108513472083749083165179784098220158201055270548272414314)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 39418265082950435024868801.5005452240816902251477336582325944930252142622315101857742955673)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3290158764187118871697791.05850632319194734270969161036889516414516566453884272345518372696)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 230677110449632078321772.618245845856640677845629174549731890660612368500786684333975350954)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 13652233645509183190158.5916189185218250859402806777406323001463296297553612462737044693697)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 683661466754325350495.216655026531202476397782296585200982429378069417193575896602446904762)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 28967871782219334117.0122379171041074970463982134039409352925258212207710168851968215545064)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1036104088560167006.2022834098572346459442601718514554488352117620272232373622553429728555)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 31128490785613152.8380102669349814751268126141105475287632676569913936040772990253369753962)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 779327504127342.536207878988196814811198475410572992436243686674896894543126229424358472541)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 16067543181294.643350688789124777020407337133926174150582333950666044399234540521336771876)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 268161795520.300916569439413185778557212729611517883948634711190170998896514639936969855484)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3533216359.10528191668842486732408440112703691790824611391987708562111396961696753452085068)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 35378979.5479656110614685178752543826919239614088343789329169535932709470588426584501652577)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 253034.881362204346444503097491737872930637147096453940375713745904094735506180552724766444)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1151.61895453463992438325318456328526085882924197763140514450975619271382783957699017875304)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2.50662827463100050241576528481104515966515623051532908941425544355490413900497467936202516))
+      };
+      static const T denom[24] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.112400072777760768e22)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.414847677933545472e22)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 6756146673770930688000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 6548684852703068697600.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4280722865357147142912.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2021687376910682741568.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 720308216440924653696.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 199321978221066137360.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 43714229649594412832.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 7707401101297361068.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1103230881185949736.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 129006659818331295.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 12363045847086207.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 971250460939913.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 62382416421941.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3256091103430.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 136717357942.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4546047198.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 116896626.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2240315.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 30107.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 253.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1.0))
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      lanczos_initializer<lanczos24m113, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T num[24] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3035162425359883494754.02878223286972654682199012688209026810841953293372712802258398358538)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3496756894406430103600.16057175075063458536101374170860226963245118484234495645518505519827)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1926652656689320888654.01954015145958293168365236755537645929361841917596501251362171653478)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 675517066488272766316.083023742440619929434602223726894748181327187670231286180156444871912)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 169172853104918752780.086262749564831660238912144573032141700464995906149421555926000038492)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 32197935167225605785.6444116302160245528783954573163541751756353183343357329404208062043808)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4837849542714083249.37587447454818124327561966323276633775195138872820542242539845253171632)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 588431038090493242.308438203986649553459461798968819276505178004064031201740043314534404158)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 58939585141634058.6206417889192563007809470547755357240808035714047014324843817783741669733)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4919561837722192.82991866530802080996138070630296720420704876654726991998309206256077395868)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 344916580244240.407442753122831512004021081677987651622305356145640394384006997569631719101)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 20413302960687.8250598845969238472629322716685686993835561234733641729957841485003560103066)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1022234822943.78400752460970689311934727763870970686747383486600540378889311406851534545789)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 43313787191.9821354846952908076307094286897439975815501673706144217246093900159173598852503)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1549219505.59667418528481770869280437577581951167003505825834192510436144666564648361001914)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 46544421.1998761919380541579358096705925369145324466147390364674998568485110045455014967149)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1165278.06807504975090675074910052763026564833951579556132777702952882101173607903881127542)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 24024.759267256769471083727721827405338569868270177779485912486668586611981795179894572115)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 400.965008113421955824358063769761286758463521789765880962939528760888853281920872064838918)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 5.28299015654478269617039029170846385138134929147421558771949982217659507918482272439717603)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.0528999024412510102409256676599360516359062802002483877724963720047531347449011629466149805)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.000378346710654740685454266569593414561162134092347356968516522170279688139165340746957511115)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.172194142179211139195966608011235161516824700287310869949928393345257114743230967204370963e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.374799931707148855771381263542708435935402853962736029347951399323367765509988401336565436e-8))
+      };
+      static const T denom[24] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.112400072777760768e22)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.414847677933545472e22)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 6756146673770930688000.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 6548684852703068697600.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4280722865357147142912.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2021687376910682741568.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 720308216440924653696.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 199321978221066137360.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 43714229649594412832.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 7707401101297361068.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1103230881185949736.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 129006659818331295.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 12363045847086207.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 971250460939913.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 62382416421941.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 3256091103430.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 136717357942.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4546047198.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 116896626.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2240315.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 30107.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 253.0)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1.0))
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      lanczos_initializer<lanczos24m113, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[23] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 7.4734083002469026177867421609938203388868806387315406134072298925733950040583068760685908)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -50.4225805042247530267317342133388132970816607563062253708655085754357843064134941138154171)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 152.288200621747008570784082624444625293884063492396162110698238568311211546361189979357019)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -271.894959539150384169327513139846971255640842175739337449692360299099322742181325023644769)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 319.240102980202312307047586791116902719088581839891008532114107693294261542869734803906793)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -259.493144143048088289689500935518073716201741349569864988870534417890269467336454358361499)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 149.747518319689708813209645403067832020714660918583227716408482877303972685262557460145835)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -61.9261301009341333289187201425188698128684426428003249782448828881580630606817104372760037)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 18.3077524177286961563937379403377462608113523887554047531153187277072451294845795496072365)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -3.82011322251948043097070160584761236869363471824695092089556195047949392738162970152230254)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.549382685505691522516705902336780999493262538301283190963770663549981309645795228539620711)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.0524814679715180697633723771076668718265358076235229045603747927518423453658004287459638024)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.00315392664003333528534120626687784812050217700942910879712808180705014754163256855643360698)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.000110098373127648510519799564665442121339511198561008748083409549601095293123407080388658329)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.19809382866681658224945717689377373458866950897791116315219376038432014207446832310901893e-5)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.152278977408600291408265615203504153130482270424202400677280558181047344681214058227949755e-7)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.364344768076106268872239259083188037615571711218395765792787047015406264051536972018235217e-10)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.148897510480440424971521542520683536298361220674662555578951242811522959610991621951203526e-13)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.261199241161582662426512749820666625442516059622425213340053324061794752786482115387573582e-18)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.780072664167099103420998436901014795601783313858454665485256897090476089641613851903791529e-24)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.303465867587106629530056603454807425512962762653755513440561256044986695349304176849392735e-24)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.615420597971283870342083342286977366161772327800327789325710571275345878439656918541092056e-25)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.499641233843540749369110053005439398774706583601830828776209650445427083113181961630763702e-26)),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      lanczos_initializer<lanczos24m113, T>::force_instantiate(); // Ensure our constants get initialized before main()
+      static const T d[23] = {
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 61.4165001061101455341808888883960361969557848005400286332291451422461117307237198559485365)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -414.372973678657049667308134761613915623353625332248315105320470271523320700386200587519147)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1251.50505818554680171298972755376376836161706773644771875668053742215217922228357204561873)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -2234.43389421602399514176336175766511311493214354568097811220122848998413358085613880612158)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 2623.51647746991904821899989145639147785427273427135380151752779100215839537090464785708684)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -2132.51572435428751962745870184529534443305617818870214348386131243463614597272260797772423)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 1230.62572059218405766499842067263311220019173335523810725664442147670956427061920234820189)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -508.90919151163744999377586956023909888833335885805154492270846381061182696305011395981929)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 150.453184562246579758706538566480316921938628645961177699894388251635886834047343195475395)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -31.3937061525822497422230490071156186113405446381476081565548185848237169870395131828731397)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 4.51482916590287954234936829724231512565732528859217337795452389161322923867318809206313688)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.431292919341108177524462194102701868233551186625103849565527515201492276412231365776131952)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.0259189820815586225636729971503340447445001375909094681698918294680345547092233915092128323)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.000904788882557558697594884691337532557729219389814315972435534723829065673966567231504429712)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.162793589759218213439218473348810982422449144393340433592232065020562974405674317564164312e-4)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.125142926178202562426432039899709511761368233479483128438847484617555752948755923647214487e-6)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.299418680048132583204152682950097239197934281178261879500770485862852229898797687301941982e-9)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.122364035267809278675627784883078206654408225276233049012165202996967011873995261617995421e-12)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.21465364366598631597052073538883430194257709353929022544344097235100199405814005393447785e-17)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.641064035802907518396608051803921688237330857546406669209280666066685733941549058513986818e-23)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.249388374622173329690271566855185869111237201309011956145463506483151054813346819490278951e-23)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, -0.505752900177513489906064295001851463338022055787536494321532352380960774349054239257683149e-24)),
+         static_cast<T>(BOOST_MATH_BIG_CONSTANT(T, 113, 0.410605371184590959139968810080063542546949719163227555918846829816144878123034347778284006e-25)),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 20.3209821879863739013671875; }
+};
+
+
+//
+// placeholder for no lanczos info available:
+//
+struct undefined_lanczos : public mpl::int_<INT_MAX - 1> { };
+
+#if 0
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#define BOOST_MATH_FLT_DIGITS ::std::numeric_limits<float>::digits
+#define BOOST_MATH_DBL_DIGITS ::std::numeric_limits<double>::digits
+#define BOOST_MATH_LDBL_DIGITS ::std::numeric_limits<long double>::digits
+#else
+#define BOOST_MATH_FLT_DIGITS FLT_MANT_DIG
+#define BOOST_MATH_DBL_DIGITS DBL_MANT_DIG
+#define BOOST_MATH_LDBL_DIGITS LDBL_MANT_DIG
+#endif
+#endif
+
+typedef mpl::list<
+   lanczos6m24, 
+/*   lanczos6, */
+   lanczos13m53, 
+/*   lanczos13, */
+   lanczos17m64, 
+   lanczos24m113, 
+   lanczos22, 
+   undefined_lanczos> lanczos_list;
+
+template <class Real, class Policy>
+struct lanczos
+{
+   typedef typename mpl::if_<
+      typename mpl::less_equal<
+         typename policies::precision<Real, Policy>::type,
+         mpl::int_<0>
+      >::type,
+      mpl::int_<INT_MAX - 2>,
+      typename policies::precision<Real, Policy>::type
+   >::type target_precision;
+
+   typedef typename mpl::deref<typename mpl::find_if<
+      lanczos_list, 
+      mpl::less_equal<target_precision, mpl::_1> >::type>::type type;
+};
+
+} // namespace lanczos
+} // namespace math
+} // namespace boost
+
+#if !defined(_CRAYC) && !defined(__CUDACC__) && (!defined(__GNUC__) || (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 3)))
+#if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__SSE2__)
+#include <boost/math/special_functions/detail/lanczos_sse2.hpp>
+#endif
+#endif
+
+#endif // BOOST_MATH_SPECIAL_FUNCTIONS_LANCZOS
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/legendre.hpp b/gatb-core/thirdparty/boost/math/special_functions/legendre.hpp
new file mode 100644
index 0000000..1a2ef5d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/legendre.hpp
@@ -0,0 +1,194 @@
+
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_LEGENDRE_HPP
+#define BOOST_MATH_SPECIAL_LEGENDRE_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/tools/config.hpp>
+
+namespace boost{
+namespace math{
+
+// Recurrance relation for legendre P and Q polynomials:
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type
+   legendre_next(unsigned l, T1 x, T2 Pl, T3 Plm1)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ((2 * l + 1) * result_type(x) * result_type(Pl) - l * result_type(Plm1)) / (l + 1);
+}
+
+namespace detail{
+
+// Implement Legendre P and Q polynomials via recurrance:
+template <class T, class Policy>
+T legendre_imp(unsigned l, T x, const Policy& pol, bool second = false)
+{
+   static const char* function = "boost::math::legrendre_p<%1%>(unsigned, %1%)";
+   // Error handling:
+   if((x < -1) || (x > 1))
+      return policies::raise_domain_error<T>(
+         function,
+         "The Legendre Polynomial is defined for"
+         " -1 <= x <= 1, but got x = %1%.", x, pol);
+
+   T p0, p1;
+   if(second)
+   {
+      // A solution of the second kind (Q):
+      p0 = (boost::math::log1p(x, pol) - boost::math::log1p(-x, pol)) / 2;
+      p1 = x * p0 - 1;
+   }
+   else
+   {
+      // A solution of the first kind (P):
+      p0 = 1;
+      p1 = x;
+   }
+   if(l == 0)
+      return p0;
+
+   unsigned n = 1;
+
+   while(n < l)
+   {
+      std::swap(p0, p1);
+      p1 = boost::math::legendre_next(n, x, p0, p1);
+      ++n;
+   }
+   return p1;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
+   legendre_p(int l, T x, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   static const char* function = "boost::math::legendre_p<%1%>(unsigned, %1%)";
+   if(l < 0)
+      return policies::checked_narrowing_cast<result_type, Policy>(detail::legendre_imp(-l-1, static_cast<value_type>(x), pol, false), function);
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::legendre_imp(l, static_cast<value_type>(x), pol, false), function);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   legendre_p(int l, T x)
+{
+   return boost::math::legendre_p(l, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
+   legendre_q(unsigned l, T x, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::legendre_imp(l, static_cast<value_type>(x), pol, true), "boost::math::legendre_q<%1%>(unsigned, %1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   legendre_q(unsigned l, T x)
+{
+   return boost::math::legendre_q(l, x, policies::policy<>());
+}
+
+// Recurrence for associated polynomials:
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   return ((2 * l + 1) * result_type(x) * result_type(Pl) - (l + m) * result_type(Plm1)) / (l + 1 - m);
+}
+
+namespace detail{
+// Legendre P associated polynomial:
+template <class T, class Policy>
+T legendre_p_imp(int l, int m, T x, T sin_theta_power, const Policy& pol)
+{
+   // Error handling:
+   if((x < -1) || (x > 1))
+      return policies::raise_domain_error<T>(
+      "boost::math::legendre_p<%1%>(int, int, %1%)",
+         "The associated Legendre Polynomial is defined for"
+         " -1 <= x <= 1, but got x = %1%.", x, pol);
+   // Handle negative arguments first:
+   if(l < 0)
+      return legendre_p_imp(-l-1, m, x, sin_theta_power, pol);
+   if(m < 0)
+   {
+      int sign = (m&1) ? -1 : 1;
+      return sign * boost::math::tgamma_ratio(static_cast<T>(l+m+1), static_cast<T>(l+1-m), pol) * legendre_p_imp(l, -m, x, sin_theta_power, pol);
+   }
+   // Special cases:
+   if(m > l)
+      return 0;
+   if(m == 0)
+      return boost::math::legendre_p(l, x, pol);
+
+   T p0 = boost::math::double_factorial<T>(2 * m - 1, pol) * sin_theta_power;
+
+   if(m&1)
+      p0 *= -1;
+   if(m == l)
+      return p0;
+
+   T p1 = x * (2 * m + 1) * p0;
+
+   int n = m + 1;
+
+   while(n < l)
+   {
+      std::swap(p0, p1);
+      p1 = boost::math::legendre_next(n, m, x, p0, p1);
+      ++n;
+   }
+   return p1;
+}
+
+template <class T, class Policy>
+inline T legendre_p_imp(int l, int m, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   // TODO: we really could use that mythical "pow1p" function here:
+   return legendre_p_imp(l, m, x, static_cast<T>(pow(1 - x*x, T(abs(m))/2)), pol);
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type
+   legendre_p(int l, int m, T x, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::legendre_p_imp(l, m, static_cast<value_type>(x), pol), "bost::math::legendre_p<%1%>(int, int, %1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type
+   legendre_p(int l, int m, T x)
+{
+   return boost::math::legendre_p(l, m, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_LEGENDRE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/log1p.hpp b/gatb-core/thirdparty/boost/math/special_functions/log1p.hpp
new file mode 100644
index 0000000..62f5b80
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/log1p.hpp
@@ -0,0 +1,503 @@
+//  (C) Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_LOG1P_INCLUDED
+#define BOOST_MATH_LOG1P_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <math.h> // platform's ::log1p
+#include <boost/limits.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#  include <boost/static_assert.hpp>
+#else
+#  include <boost/assert.hpp>
+#endif
+
+namespace boost{ namespace math{
+
+namespace detail
+{
+  // Functor log1p_series returns the next term in the Taylor series
+  //   pow(-1, k-1)*pow(x, k) / k
+  // each time that operator() is invoked.
+  //
+  template <class T>
+  struct log1p_series
+  {
+     typedef T result_type;
+
+     log1p_series(T x)
+        : k(0), m_mult(-x), m_prod(-1){}
+
+     T operator()()
+     {
+        m_prod *= m_mult;
+        return m_prod / ++k;
+     }
+
+     int count()const
+     {
+        return k;
+     }
+
+  private:
+     int k;
+     const T m_mult;
+     T m_prod;
+     log1p_series(const log1p_series&);
+     log1p_series& operator=(const log1p_series&);
+  };
+
+// Algorithm log1p is part of C99, but is not yet provided by many compilers.
+//
+// This version uses a Taylor series expansion for 0.5 > x > epsilon, which may
+// require up to std::numeric_limits<T>::digits+1 terms to be calculated. 
+// It would be much more efficient to use the equivalence:
+//   log(1+x) == (log(1+x) * x) / ((1-x) - 1)
+// Unfortunately many optimizing compilers make such a mess of this, that 
+// it performs no better than log(1+x): which is to say not very well at all.
+//
+template <class T, class Policy>
+T log1p_imp(T const & x, const Policy& pol, const mpl::int_<0>&)
+{ // The function returns the natural logarithm of 1 + x.
+   typedef typename tools::promote_args<T>::type result_type;
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::log1p<%1%>(%1%)";
+
+   if(x < -1)
+      return policies::raise_domain_error<T>(
+         function, "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<T>(
+         function, 0, pol);
+
+   result_type a = abs(result_type(x));
+   if(a > result_type(0.5f))
+      return log(1 + result_type(x));
+   // Note that without numeric_limits specialisation support, 
+   // epsilon just returns zero, and our "optimisation" will always fail:
+   if(a < tools::epsilon<result_type>())
+      return x;
+   detail::log1p_series<result_type> s(x);
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) && !BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
+   result_type result = tools::sum_series(s, policies::get_epsilon<result_type, Policy>(), max_iter);
+#else
+   result_type zero = 0;
+   result_type result = tools::sum_series(s, policies::get_epsilon<result_type, Policy>(), max_iter, zero);
+#endif
+   policies::check_series_iterations<T>(function, max_iter, pol);
+   return result;
+}
+
+template <class T, class Policy>
+T log1p_imp(T const& x, const Policy& pol, const mpl::int_<53>&)
+{ // The function returns the natural logarithm of 1 + x.
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::log1p<%1%>(%1%)";
+
+   if(x < -1)
+      return policies::raise_domain_error<T>(
+         function, "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<T>(
+         function, 0, pol);
+
+   T a = fabs(x);
+   if(a > 0.5f)
+      return log(1 + x);
+   // Note that without numeric_limits specialisation support, 
+   // epsilon just returns zero, and our "optimisation" will always fail:
+   if(a < tools::epsilon<T>())
+      return x;
+
+   // Maximum Deviation Found:                     1.846e-017
+   // Expected Error Term:                         1.843e-017
+   // Maximum Relative Change in Control Points:   8.138e-004
+   // Max Error found at double precision =        3.250766e-016
+   static const T P[] = {    
+       0.15141069795941984e-16L,
+       0.35495104378055055e-15L,
+       0.33333333333332835L,
+       0.99249063543365859L,
+       1.1143969784156509L,
+       0.58052937949269651L,
+       0.13703234928513215L,
+       0.011294864812099712L
+     };
+   static const T Q[] = {    
+       1L,
+       3.7274719063011499L,
+       5.5387948649720334L,
+       4.159201143419005L,
+       1.6423855110312755L,
+       0.31706251443180914L,
+       0.022665554431410243L,
+       -0.29252538135177773e-5L
+     };
+
+   T result = 1 - x / 2 + tools::evaluate_polynomial(P, x) / tools::evaluate_polynomial(Q, x);
+   result *= x;
+
+   return result;
+}
+
+template <class T, class Policy>
+T log1p_imp(T const& x, const Policy& pol, const mpl::int_<64>&)
+{ // The function returns the natural logarithm of 1 + x.
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::log1p<%1%>(%1%)";
+
+   if(x < -1)
+      return policies::raise_domain_error<T>(
+         function, "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<T>(
+         function, 0, pol);
+
+   T a = fabs(x);
+   if(a > 0.5f)
+      return log(1 + x);
+   // Note that without numeric_limits specialisation support, 
+   // epsilon just returns zero, and our "optimisation" will always fail:
+   if(a < tools::epsilon<T>())
+      return x;
+
+   // Maximum Deviation Found:                     8.089e-20
+   // Expected Error Term:                         8.088e-20
+   // Maximum Relative Change in Control Points:   9.648e-05
+   // Max Error found at long double precision =   2.242324e-19
+   static const T P[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.807533446680736736712e-19),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.490881544804798926426e-18),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.333333333333333373941),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.17141290782087994162),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.62790522814926264694),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.13156411870766876113),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.408087379932853785336),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0706537026422828914622),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00441709903782239229447)
+   };
+   static const T Q[] = {    
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 4.26423872346263928361),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 7.48189472704477708962),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 6.94757016732904280913),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.6493508622280767304),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.06884863623790638317),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.158292216998514145947),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.00885295524069924328658),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.560026216133415663808e-6)
+   };
+
+   T result = 1 - x / 2 + tools::evaluate_polynomial(P, x) / tools::evaluate_polynomial(Q, x);
+   result *= x;
+
+   return result;
+}
+
+template <class T, class Policy>
+T log1p_imp(T const& x, const Policy& pol, const mpl::int_<24>&)
+{ // The function returns the natural logarithm of 1 + x.
+   BOOST_MATH_STD_USING
+
+   static const char* function = "boost::math::log1p<%1%>(%1%)";
+
+   if(x < -1)
+      return policies::raise_domain_error<T>(
+         function, "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<T>(
+         function, 0, pol);
+
+   T a = fabs(x);
+   if(a > 0.5f)
+      return log(1 + x);
+   // Note that without numeric_limits specialisation support, 
+   // epsilon just returns zero, and our "optimisation" will always fail:
+   if(a < tools::epsilon<T>())
+      return x;
+
+   // Maximum Deviation Found:                     6.910e-08
+   // Expected Error Term:                         6.910e-08
+   // Maximum Relative Change in Control Points:   2.509e-04
+   // Max Error found at double precision =        6.910422e-08
+   // Max Error found at float precision =         8.357242e-08
+   static const T P[] = {    
+      -0.671192866803148236519e-7L,
+      0.119670999140731844725e-6L,
+      0.333339469182083148598L,
+      0.237827183019664122066L
+   };
+   static const T Q[] = {    
+      1L,
+      1.46348272586988539733L,
+      0.497859871350117338894L,
+      -0.00471666268910169651936L
+   };
+
+   T result = 1 - x / 2 + tools::evaluate_polynomial(P, x) / tools::evaluate_polynomial(Q, x);
+   result *= x;
+
+   return result;
+}
+
+template <class T, class Policy, class tag>
+struct log1p_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      template <int N>
+      static void do_init(const mpl::int_<N>&){}
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::log1p(static_cast<T>(0.25), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename log1p_initializer<T, Policy, tag>::init log1p_initializer<T, Policy, tag>::initializer;
+
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type log1p(T x, const Policy&)
+{ 
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            mpl::int_<0> // too many bits, use generic version.
+         >::type
+      >::type
+   >::type tag_type;
+
+   detail::log1p_initializer<value_type, forwarding_policy, tag_type>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+      detail::log1p_imp(static_cast<value_type>(x), forwarding_policy(), tag_type()), "boost::math::log1p<%1%>(%1%)");
+}
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+// These overloads work around a type deduction bug:
+inline float log1p(float z)
+{
+   return log1p<float>(z);
+}
+inline double log1p(double z)
+{
+   return log1p<double>(z);
+}
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+inline long double log1p(long double z)
+{
+   return log1p<long double>(z);
+}
+#endif
+#endif
+
+#ifdef log1p
+#  ifndef BOOST_HAS_LOG1P
+#     define BOOST_HAS_LOG1P
+#  endif
+#  undef log1p
+#endif
+
+#if defined(BOOST_HAS_LOG1P) && !(defined(__osf__) && defined(__DECCXX_VER))
+#  ifdef BOOST_MATH_USE_C99
+template <class Policy>
+inline float log1p(float x, const Policy& pol)
+{ 
+   if(x < -1)
+      return policies::raise_domain_error<float>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<float>(
+         "log1p<%1%>(%1%)", 0, pol);
+   return ::log1pf(x); 
+}
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+template <class Policy>
+inline long double log1p(long double x, const Policy& pol)
+{ 
+   if(x < -1)
+      return policies::raise_domain_error<long double>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<long double>(
+         "log1p<%1%>(%1%)", 0, pol);
+   return ::log1pl(x); 
+}
+#endif
+#else
+template <class Policy>
+inline float log1p(float x, const Policy& pol)
+{ 
+   if(x < -1)
+      return policies::raise_domain_error<float>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<float>(
+         "log1p<%1%>(%1%)", 0, pol);
+   return ::log1p(x); 
+}
+#endif
+template <class Policy>
+inline double log1p(double x, const Policy& pol)
+{ 
+   if(x < -1)
+      return policies::raise_domain_error<double>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<double>(
+         "log1p<%1%>(%1%)", 0, pol);
+   return ::log1p(x); 
+}
+#elif defined(_MSC_VER) && (BOOST_MSVC >= 1400)
+//
+// You should only enable this branch if you are absolutely sure
+// that your compilers optimizer won't mess this code up!!
+// Currently tested with VC8 and Intel 9.1.
+//
+template <class Policy>
+inline double log1p(double x, const Policy& pol)
+{
+   if(x < -1)
+      return policies::raise_domain_error<double>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<double>(
+         "log1p<%1%>(%1%)", 0, pol);
+   double u = 1+x;
+   if(u == 1.0) 
+      return x; 
+   else
+      return ::log(u)*(x/(u-1.0));
+}
+template <class Policy>
+inline float log1p(float x, const Policy& pol)
+{
+   return static_cast<float>(boost::math::log1p(static_cast<double>(x), pol));
+}
+#ifndef _WIN32_WCE
+//
+// For some reason this fails to compile under WinCE...
+// Needs more investigation.
+//
+template <class Policy>
+inline long double log1p(long double x, const Policy& pol)
+{
+   if(x < -1)
+      return policies::raise_domain_error<long double>(
+         "log1p<%1%>(%1%)", "log1p(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<long double>(
+         "log1p<%1%>(%1%)", 0, pol);
+   long double u = 1+x;
+   if(u == 1.0) 
+      return x; 
+   else
+      return ::logl(u)*(x/(u-1.0));
+}
+#endif
+#endif
+
+template <class T>
+inline typename tools::promote_args<T>::type log1p(T x)
+{
+   return boost::math::log1p(x, policies::policy<>());
+}
+//
+// Compute log(1+x)-x:
+//
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   log1pmx(T x, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::log1pmx<%1%>(%1%)";
+
+   if(x < -1)
+      return policies::raise_domain_error<T>(
+         function, "log1pmx(x) requires x > -1, but got x = %1%.", x, pol);
+   if(x == -1)
+      return -policies::raise_overflow_error<T>(
+         function, 0, pol);
+
+   result_type a = abs(result_type(x));
+   if(a > result_type(0.95f))
+      return log(1 + result_type(x)) - result_type(x);
+   // Note that without numeric_limits specialisation support, 
+   // epsilon just returns zero, and our "optimisation" will always fail:
+   if(a < tools::epsilon<result_type>())
+      return -x * x / 2;
+   boost::math::detail::log1p_series<T> s(x);
+   s();
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   policies::check_series_iterations<T>(function, max_iter, pol);
+   return result;
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type log1pmx(T x)
+{
+   return log1pmx(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_LOG1P_INCLUDED
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/math_fwd.hpp b/gatb-core/thirdparty/boost/math/special_functions/math_fwd.hpp
new file mode 100644
index 0000000..96f6072
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/math_fwd.hpp
@@ -0,0 +1,1573 @@
+// math_fwd.hpp
+
+// TODO revise completely for new distribution classes.
+
+// Copyright Paul A. Bristow 2006.
+// Copyright John Maddock 2006.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Omnibus list of forward declarations of math special functions.
+
+// IT = Integer type.
+// RT = Real type (built-in floating-point types, float, double, long double) & User Defined Types
+// AT = Integer or Real type
+
+#ifndef BOOST_MATH_SPECIAL_MATH_FWD_HPP
+#define BOOST_MATH_SPECIAL_MATH_FWD_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/detail/round_fwd.hpp>
+#include <boost/math/tools/promotion.hpp> // for argument promotion.
+#include <boost/math/policies/policy.hpp>
+#include <boost/mpl/comparison.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/config/no_tr1/complex.hpp>
+
+#define BOOST_NO_MACRO_EXPAND /**/
+
+namespace boost
+{
+   namespace math
+   { // Math functions (in roughly alphabetic order).
+
+   // Beta functions.
+   template <class RT1, class RT2>
+   typename tools::promote_args<RT1, RT2>::type
+         beta(RT1 a, RT2 b); // Beta function (2 arguments).
+
+   template <class RT1, class RT2, class A>
+   typename tools::promote_args<RT1, RT2, A>::type
+         beta(RT1 a, RT2 b, A x); // Beta function (3 arguments).
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         beta(RT1 a, RT2 b, RT3 x, const Policy& pol); // Beta function (3 arguments).
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         betac(RT1 a, RT2 b, RT3 x);
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         betac(RT1 a, RT2 b, RT3 x, const Policy& pol);
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta(RT1 a, RT2 b, RT3 x); // Incomplete beta function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta(RT1 a, RT2 b, RT3 x, const Policy& pol); // Incomplete beta function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac(RT1 a, RT2 b, RT3 x); // Incomplete beta complement function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac(RT1 a, RT2 b, RT3 x, const Policy& pol); // Incomplete beta complement function.
+
+   template <class T1, class T2, class T3, class T4>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ibeta_inv(T1 a, T2 b, T3 p, T4* py);
+
+   template <class T1, class T2, class T3, class T4, class Policy>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ibeta_inv(T1 a, T2 b, T3 p, T4* py, const Policy& pol);
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_inv(RT1 a, RT2 b, RT3 p); // Incomplete beta inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_inv(RT1 a, RT2 b, RT3 p, const Policy&); // Incomplete beta inverse function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_inva(RT1 a, RT2 b, RT3 p); // Incomplete beta inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_inva(RT1 a, RT2 b, RT3 p, const Policy&); // Incomplete beta inverse function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_invb(RT1 a, RT2 b, RT3 p); // Incomplete beta inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_invb(RT1 a, RT2 b, RT3 p, const Policy&); // Incomplete beta inverse function.
+
+   template <class T1, class T2, class T3, class T4>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ibetac_inv(T1 a, T2 b, T3 q, T4* py);
+
+   template <class T1, class T2, class T3, class T4, class Policy>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ibetac_inv(T1 a, T2 b, T3 q, T4* py, const Policy& pol);
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_inv(RT1 a, RT2 b, RT3 q); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_inv(RT1 a, RT2 b, RT3 q, const Policy&); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_inva(RT1 a, RT2 b, RT3 q); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_inva(RT1 a, RT2 b, RT3 q, const Policy&); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_invb(RT1 a, RT2 b, RT3 q); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibetac_invb(RT1 a, RT2 b, RT3 q, const Policy&); // Incomplete beta complement inverse function.
+
+   template <class RT1, class RT2, class RT3>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_derivative(RT1 a, RT2 b, RT3 x);  // derivative of incomplete beta
+
+   template <class RT1, class RT2, class RT3, class Policy>
+   typename tools::promote_args<RT1, RT2, RT3>::type
+         ibeta_derivative(RT1 a, RT2 b, RT3 x, const Policy& pol);  // derivative of incomplete beta
+
+   // Binomial:
+   template <class T, class Policy>
+   T binomial_coefficient(unsigned n, unsigned k, const Policy& pol);
+   template <class T>
+   T binomial_coefficient(unsigned n, unsigned k);
+
+   // erf & erfc error functions.
+   template <class RT> // Error function.
+   typename tools::promote_args<RT>::type erf(RT z);
+   template <class RT, class Policy> // Error function.
+   typename tools::promote_args<RT>::type erf(RT z, const Policy&);
+
+   template <class RT>// Error function complement.
+   typename tools::promote_args<RT>::type erfc(RT z);
+   template <class RT, class Policy>// Error function complement.
+   typename tools::promote_args<RT>::type erfc(RT z, const Policy&);
+
+   template <class RT>// Error function inverse.
+   typename tools::promote_args<RT>::type erf_inv(RT z);
+   template <class RT, class Policy>// Error function inverse.
+   typename tools::promote_args<RT>::type erf_inv(RT z, const Policy& pol);
+
+   template <class RT>// Error function complement inverse.
+   typename tools::promote_args<RT>::type erfc_inv(RT z);
+   template <class RT, class Policy>// Error function complement inverse.
+   typename tools::promote_args<RT>::type erfc_inv(RT z, const Policy& pol);
+
+   // Polynomials:
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+         legendre_next(unsigned l, T1 x, T2 Pl, T3 Plm1);
+
+   template <class T>
+   typename tools::promote_args<T>::type
+         legendre_p(int l, T x);
+
+   template <class T, class Policy>
+   typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
+         legendre_p(int l, T x, const Policy& pol);
+
+   template <class T>
+   typename tools::promote_args<T>::type
+         legendre_q(unsigned l, T x);
+
+   template <class T, class Policy>
+   typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
+         legendre_q(unsigned l, T x, const Policy& pol);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+         legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1);
+
+   template <class T>
+   typename tools::promote_args<T>::type
+         legendre_p(int l, int m, T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type
+         legendre_p(int l, int m, T x, const Policy& pol);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+         laguerre_next(unsigned n, T1 x, T2 Ln, T3 Lnm1);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+      laguerre_next(unsigned n, unsigned l, T1 x, T2 Pl, T3 Plm1);
+
+   template <class T>
+   typename tools::promote_args<T>::type
+      laguerre(unsigned n, T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type
+      laguerre(unsigned n, unsigned m, T x, const Policy& pol);
+
+   template <class T1, class T2>
+   struct laguerre_result
+   {
+      typedef typename mpl::if_<
+         policies::is_policy<T2>,
+         typename tools::promote_args<T1>::type,
+         typename tools::promote_args<T2>::type
+      >::type type;
+   };
+
+   template <class T1, class T2>
+   typename laguerre_result<T1, T2>::type
+      laguerre(unsigned n, T1 m, T2 x);
+
+   template <class T>
+   typename tools::promote_args<T>::type
+      hermite(unsigned n, T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type
+      hermite(unsigned n, T x, const Policy& pol);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+      hermite_next(unsigned n, T1 x, T2 Hn, T3 Hnm1);
+
+   template <class T1, class T2>
+   std::complex<typename tools::promote_args<T1, T2>::type>
+         spherical_harmonic(unsigned n, int m, T1 theta, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   std::complex<typename tools::promote_args<T1, T2>::type>
+      spherical_harmonic(unsigned n, int m, T1 theta, T2 phi, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type
+         spherical_harmonic_r(unsigned n, int m, T1 theta, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type
+      spherical_harmonic_r(unsigned n, int m, T1 theta, T2 phi, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type
+         spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type
+      spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi, const Policy& pol);
+
+   // Elliptic integrals:
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+         ellint_rf(T1 x, T2 y, T3 z);
+
+   template <class T1, class T2, class T3, class Policy>
+   typename tools::promote_args<T1, T2, T3>::type
+         ellint_rf(T1 x, T2 y, T3 z, const Policy& pol);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+         ellint_rd(T1 x, T2 y, T3 z);
+
+   template <class T1, class T2, class T3, class Policy>
+   typename tools::promote_args<T1, T2, T3>::type
+         ellint_rd(T1 x, T2 y, T3 z, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type
+         ellint_rc(T1 x, T2 y);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type
+         ellint_rc(T1 x, T2 y, const Policy& pol);
+
+   template <class T1, class T2, class T3, class T4>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ellint_rj(T1 x, T2 y, T3 z, T4 p);
+
+   template <class T1, class T2, class T3, class T4, class Policy>
+   typename tools::promote_args<T1, T2, T3, T4>::type
+         ellint_rj(T1 x, T2 y, T3 z, T4 p, const Policy& pol);
+
+   template <class T1, class T2, class T3>
+   typename tools::promote_args<T1, T2, T3>::type
+      ellint_rg(T1 x, T2 y, T3 z);
+
+   template <class T1, class T2, class T3, class Policy>
+   typename tools::promote_args<T1, T2, T3>::type
+      ellint_rg(T1 x, T2 y, T3 z, const Policy& pol);
+
+   template <typename T>
+   typename tools::promote_args<T>::type ellint_2(T k);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi, const Policy& pol);
+
+   template <typename T>
+   typename tools::promote_args<T>::type ellint_1(T k);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi, const Policy& pol);
+
+   template <typename T>
+   typename tools::promote_args<T>::type ellint_d(T k);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi, const Policy& pol);
+
+   namespace detail{
+
+   template <class T, class U, class V>
+   struct ellint_3_result
+   {
+      typedef typename mpl::if_<
+         policies::is_policy<V>,
+         typename tools::promote_args<T, U>::type,
+         typename tools::promote_args<T, U, V>::type
+      >::type type;
+   };
+
+   } // namespace detail
+
+
+   template <class T1, class T2, class T3>
+   typename detail::ellint_3_result<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi);
+
+   template <class T1, class T2, class T3, class Policy>
+   typename tools::promote_args<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type ellint_3(T1 k, T2 v);
+
+   // Factorial functions.
+   // Note: not for integral types, at present.
+   template <class RT>
+   struct max_factorial;
+   template <class RT>
+   RT factorial(unsigned int);
+   template <class RT, class Policy>
+   RT factorial(unsigned int, const Policy& pol);
+   template <class RT>
+   RT unchecked_factorial(unsigned int BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(RT));
+   template <class RT>
+   RT double_factorial(unsigned i);
+   template <class RT, class Policy>
+   RT double_factorial(unsigned i, const Policy& pol);
+
+   template <class RT>
+   typename tools::promote_args<RT>::type falling_factorial(RT x, unsigned n);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type falling_factorial(RT x, unsigned n, const Policy& pol);
+
+   template <class RT>
+   typename tools::promote_args<RT>::type rising_factorial(RT x, int n);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type rising_factorial(RT x, int n, const Policy& pol);
+
+   // Gamma functions.
+   template <class RT>
+   typename tools::promote_args<RT>::type tgamma(RT z);
+
+   template <class RT>
+   typename tools::promote_args<RT>::type tgamma1pm1(RT z);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type tgamma1pm1(RT z, const Policy& pol);
+
+   template <class RT1, class RT2>
+   typename tools::promote_args<RT1, RT2>::type tgamma(RT1 a, RT2 z);
+
+   template <class RT1, class RT2, class Policy>
+   typename tools::promote_args<RT1, RT2>::type tgamma(RT1 a, RT2 z, const Policy& pol);
+
+   template <class RT>
+   typename tools::promote_args<RT>::type lgamma(RT z, int* sign);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type lgamma(RT z, int* sign, const Policy& pol);
+
+   template <class RT>
+   typename tools::promote_args<RT>::type lgamma(RT x);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type lgamma(RT x, const Policy& pol);
+
+   template <class RT1, class RT2>
+   typename tools::promote_args<RT1, RT2>::type tgamma_lower(RT1 a, RT2 z);
+
+   template <class RT1, class RT2, class Policy>
+   typename tools::promote_args<RT1, RT2>::type tgamma_lower(RT1 a, RT2 z, const Policy&);
+
+   template <class RT1, class RT2>
+   typename tools::promote_args<RT1, RT2>::type gamma_q(RT1 a, RT2 z);
+
+   template <class RT1, class RT2, class Policy>
+   typename tools::promote_args<RT1, RT2>::type gamma_q(RT1 a, RT2 z, const Policy&);
+
+   template <class RT1, class RT2>
+   typename tools::promote_args<RT1, RT2>::type gamma_p(RT1 a, RT2 z);
+
+   template <class RT1, class RT2, class Policy>
+   typename tools::promote_args<RT1, RT2>::type gamma_p(RT1 a, RT2 z, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type tgamma_delta_ratio(T1 z, T2 delta);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type tgamma_delta_ratio(T1 z, T2 delta, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type tgamma_ratio(T1 a, T2 b);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type tgamma_ratio(T1 a, T2 b, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type gamma_p_derivative(T1 a, T2 x);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type gamma_p_derivative(T1 a, T2 x, const Policy&);
+
+   // gamma inverse.
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type gamma_p_inv(T1 a, T2 p);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type gamma_p_inva(T1 a, T2 p, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type gamma_p_inva(T1 a, T2 p);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type gamma_p_inv(T1 a, T2 p, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type gamma_q_inv(T1 a, T2 q);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type gamma_q_inv(T1 a, T2 q, const Policy&);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type gamma_q_inva(T1 a, T2 q);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type gamma_q_inva(T1 a, T2 q, const Policy&);
+
+   // digamma:
+   template <class T>
+   typename tools::promote_args<T>::type digamma(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type digamma(T x, const Policy&);
+
+   // trigamma:
+   template <class T>
+   typename tools::promote_args<T>::type trigamma(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type trigamma(T x, const Policy&);
+
+   // polygamma:
+   template <class T>
+   typename tools::promote_args<T>::type polygamma(int n, T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type polygamma(int n, T x, const Policy&);
+
+   // Hypotenuse function sqrt(x ^ 2 + y ^ 2).
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type
+         hypot(T1 x, T2 y);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type
+         hypot(T1 x, T2 y, const Policy&);
+
+   // cbrt - cube root.
+   template <class RT>
+   typename tools::promote_args<RT>::type cbrt(RT z);
+
+   template <class RT, class Policy>
+   typename tools::promote_args<RT>::type cbrt(RT z, const Policy&);
+
+   // log1p is log(x + 1)
+   template <class T>
+   typename tools::promote_args<T>::type log1p(T);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type log1p(T, const Policy&);
+
+   // log1pmx is log(x + 1) - x
+   template <class T>
+   typename tools::promote_args<T>::type log1pmx(T);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type log1pmx(T, const Policy&);
+
+   // Exp (x) minus 1 functions.
+   template <class T>
+   typename tools::promote_args<T>::type expm1(T);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type expm1(T, const Policy&);
+
+   // Power - 1
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type
+         powm1(const T1 a, const T2 z);
+
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type
+         powm1(const T1 a, const T2 z, const Policy&);
+
+   // sqrt(1+x) - 1
+   template <class T>
+   typename tools::promote_args<T>::type sqrt1pm1(const T& val);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type sqrt1pm1(const T& val, const Policy&);
+
+   // sinus cardinals:
+   template <class T>
+   typename tools::promote_args<T>::type sinc_pi(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type sinc_pi(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type sinhc_pi(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type sinhc_pi(T x, const Policy&);
+
+   // inverse hyperbolics:
+   template<typename T>
+   typename tools::promote_args<T>::type asinh(T x);
+
+   template<typename T, class Policy>
+   typename tools::promote_args<T>::type asinh(T x, const Policy&);
+
+   template<typename T>
+   typename tools::promote_args<T>::type acosh(T x);
+
+   template<typename T, class Policy>
+   typename tools::promote_args<T>::type acosh(T x, const Policy&);
+
+   template<typename T>
+   typename tools::promote_args<T>::type atanh(T x);
+
+   template<typename T, class Policy>
+   typename tools::promote_args<T>::type atanh(T x, const Policy&);
+
+   namespace detail{
+
+      typedef mpl::int_<0> bessel_no_int_tag;      // No integer optimisation possible.
+      typedef mpl::int_<1> bessel_maybe_int_tag;   // Maybe integer optimisation.
+      typedef mpl::int_<2> bessel_int_tag;         // Definite integer optimistaion.
+
+      template <class T1, class T2, class Policy>
+      struct bessel_traits
+      {
+         typedef typename tools::promote_args<
+            T1, T2
+         >::type result_type;
+
+         typedef typename policies::precision<result_type, Policy>::type precision_type;
+
+         typedef typename mpl::if_<
+            mpl::or_<
+               mpl::less_equal<precision_type, mpl::int_<0> >,
+               mpl::greater<precision_type, mpl::int_<64> > >,
+            bessel_no_int_tag,
+            typename mpl::if_<
+               is_integral<T1>,
+               bessel_int_tag,
+               bessel_maybe_int_tag
+            >::type
+         >::type optimisation_tag;
+      };
+   } // detail
+
+   // Bessel functions:
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j(T1 v, T2 x, const Policy& pol);
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j_prime(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_j(T1 v, T2 x);
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_j_prime(T1 v, T2 x);
+
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type sph_bessel(unsigned v, T x, const Policy& pol);
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type sph_bessel_prime(unsigned v, T x, const Policy& pol);
+
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_bessel(unsigned v, T x);
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_bessel_prime(unsigned v, T x);
+
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i(T1 v, T2 x, const Policy& pol);
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i_prime(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_i(T1 v, T2 x);
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_i_prime(T1 v, T2 x);
+
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k(T1 v, T2 x, const Policy& pol);
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k_prime(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_k(T1 v, T2 x);
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_k_prime(T1 v, T2 x);
+
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann(T1 v, T2 x, const Policy& pol);
+   template <class T1, class T2, class Policy>
+   typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann_prime(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_neumann(T1 v, T2 x);
+   template <class T1, class T2>
+   typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_neumann_prime(T1 v, T2 x);
+
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type sph_neumann(unsigned v, T x, const Policy& pol);
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type sph_neumann_prime(unsigned v, T x, const Policy& pol);
+
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_neumann(unsigned v, T x);
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_neumann_prime(unsigned v, T x);
+
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type cyl_bessel_j_zero(T v, int m, const Policy& pol);
+
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_bessel_j_zero(T v, int m);
+
+   template <class T, class OutputIterator>
+   OutputIterator cyl_bessel_j_zero(T v,
+                          int start_index,
+                          unsigned number_of_zeros,
+                          OutputIterator out_it);
+
+   template <class T, class OutputIterator, class Policy>
+   OutputIterator cyl_bessel_j_zero(T v,
+                          int start_index,
+                          unsigned number_of_zeros,
+                          OutputIterator out_it,
+                          const Policy&);
+
+   template <class T, class Policy>
+   typename detail::bessel_traits<T, T, Policy>::result_type cyl_neumann_zero(T v, int m, const Policy& pol);
+
+   template <class T>
+   typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_neumann_zero(T v, int m);
+
+   template <class T, class OutputIterator>
+   OutputIterator cyl_neumann_zero(T v,
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it);
+
+   template <class T, class OutputIterator, class Policy>
+   OutputIterator cyl_neumann_zero(T v,
+                         int start_index,
+                         unsigned number_of_zeros,
+                         OutputIterator out_it,
+                         const Policy&);
+
+   template <class T1, class T2>
+   std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> cyl_hankel_1(T1 v, T2 x);
+
+   template <class T1, class T2, class Policy>
+   std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> cyl_hankel_1(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2, class Policy>
+   std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> cyl_hankel_2(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> cyl_hankel_2(T1 v, T2 x);
+
+   template <class T1, class T2, class Policy>
+   std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> sph_hankel_1(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> sph_hankel_1(T1 v, T2 x);
+
+   template <class T1, class T2, class Policy>
+   std::complex<typename detail::bessel_traits<T1, T2, Policy>::result_type> sph_hankel_2(T1 v, T2 x, const Policy& pol);
+
+   template <class T1, class T2>
+   std::complex<typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type> sph_hankel_2(T1 v, T2 x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type airy_ai(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type airy_ai(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type airy_bi(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type airy_bi(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type airy_ai_prime(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type airy_ai_prime(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type airy_bi_prime(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type airy_bi_prime(T x);
+
+   template <class T>
+   T airy_ai_zero(int m);
+   template <class T, class Policy>
+   T airy_ai_zero(int m, const Policy&);
+
+   template <class OutputIterator>
+   OutputIterator airy_ai_zero(
+                     int start_index,
+                     unsigned number_of_zeros,
+                     OutputIterator out_it);
+   template <class OutputIterator, class Policy>
+   OutputIterator airy_ai_zero(
+                     int start_index,
+                     unsigned number_of_zeros,
+                     OutputIterator out_it,
+                     const Policy&);
+
+   template <class T>
+   T airy_bi_zero(int m);
+   template <class T, class Policy>
+   T airy_bi_zero(int m, const Policy&);
+
+   template <class OutputIterator>
+   OutputIterator airy_bi_zero(
+                     int start_index,
+                     unsigned number_of_zeros,
+                     OutputIterator out_it);
+   template <class OutputIterator, class Policy>
+   OutputIterator airy_bi_zero(
+                     int start_index,
+                     unsigned number_of_zeros,
+                     OutputIterator out_it,
+                     const Policy&);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type sin_pi(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type sin_pi(T x);
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type cos_pi(T x, const Policy&);
+
+   template <class T>
+   typename tools::promote_args<T>::type cos_pi(T x);
+
+   template <class T>
+   int fpclassify BOOST_NO_MACRO_EXPAND(T t);
+
+   template <class T>
+   bool isfinite BOOST_NO_MACRO_EXPAND(T z);
+
+   template <class T>
+   bool isinf BOOST_NO_MACRO_EXPAND(T t);
+
+   template <class T>
+   bool isnan BOOST_NO_MACRO_EXPAND(T t);
+
+   template <class T>
+   bool isnormal BOOST_NO_MACRO_EXPAND(T t);
+
+   template<class T>
+   int signbit BOOST_NO_MACRO_EXPAND(T x);
+
+   template <class T>
+   int sign BOOST_NO_MACRO_EXPAND(const T& z);
+
+   template <class T, class U>
+   typename tools::promote_args_permissive<T, U>::type copysign BOOST_NO_MACRO_EXPAND(const T& x, const U& y);
+
+   template <class T>
+   typename tools::promote_args_permissive<T>::type changesign BOOST_NO_MACRO_EXPAND(const T& z);
+
+   // Exponential integrals:
+   namespace detail{
+
+   template <class T, class U>
+   struct expint_result
+   {
+      typedef typename mpl::if_<
+         policies::is_policy<U>,
+         typename tools::promote_args<T>::type,
+         typename tools::promote_args<U>::type
+      >::type type;
+   };
+
+   } // namespace detail
+
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type expint(unsigned n, T z, const Policy&);
+
+   template <class T, class U>
+   typename detail::expint_result<T, U>::type expint(T const z, U const u);
+
+   template <class T>
+   typename tools::promote_args<T>::type expint(T z);
+
+   // Zeta:
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type zeta(T s, const Policy&);
+
+   // Owen's T function:
+   template <class T1, class T2, class Policy>
+   typename tools::promote_args<T1, T2>::type owens_t(T1 h, T2 a, const Policy& pol);
+
+   template <class T1, class T2>
+   typename tools::promote_args<T1, T2>::type owens_t(T1 h, T2 a);
+
+   // Jacobi Functions:
+   template <class T, class U, class V, class Policy>
+   typename tools::promote_args<T, U, V>::type jacobi_elliptic(T k, U theta, V* pcn, V* pdn, const Policy&);
+
+   template <class T, class U, class V>
+   typename tools::promote_args<T, U, V>::type jacobi_elliptic(T k, U theta, V* pcn = 0, V* pdn = 0);
+
+   template <class U, class T, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_sn(U k, T theta, const Policy& pol);
+
+   template <class U, class T>
+   typename tools::promote_args<T, U>::type jacobi_sn(U k, T theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_cn(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_cn(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_dn(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_dn(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_cd(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_cd(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_dc(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_dc(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_ns(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_ns(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_sd(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_sd(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_ds(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_ds(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_nc(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_nc(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_nd(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_nd(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_sc(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_sc(T k, U theta);
+
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type jacobi_cs(T k, U theta, const Policy& pol);
+
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type jacobi_cs(T k, U theta);
+
+
+   template <class T>
+   typename tools::promote_args<T>::type zeta(T s);
+
+   // pow:
+   template <int N, typename T, class Policy>
+   typename tools::promote_args<T>::type pow(T base, const Policy& policy);
+
+   template <int N, typename T>
+   typename tools::promote_args<T>::type pow(T base);
+
+   // next:
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type nextafter(const T&, const U&, const Policy&);
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type nextafter(const T&, const U&);
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type float_next(const T&, const Policy&);
+   template <class T>
+   typename tools::promote_args<T>::type float_next(const T&);
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type float_prior(const T&, const Policy&);
+   template <class T>
+   typename tools::promote_args<T>::type float_prior(const T&);
+   template <class T, class U, class Policy>
+   typename tools::promote_args<T, U>::type float_distance(const T&, const U&, const Policy&);
+   template <class T, class U>
+   typename tools::promote_args<T, U>::type float_distance(const T&, const U&);
+   template <class T, class Policy>
+   typename tools::promote_args<T>::type float_advance(T val, int distance, const Policy& pol);
+   template <class T>
+   typename tools::promote_args<T>::type float_advance(const T& val, int distance);
+
+   template<class T>
+   T unchecked_bernoulli_b2n(const std::size_t n);
+   template <class T, class Policy>
+   T bernoulli_b2n(const int i, const Policy &pol);
+   template <class T>
+   T bernoulli_b2n(const int i);
+   template <class T, class OutputIterator, class Policy>
+   OutputIterator bernoulli_b2n(const int start_index,
+                                       const unsigned number_of_bernoullis_b2n,
+                                       OutputIterator out_it,
+                                       const Policy& pol);
+   template <class T, class OutputIterator>
+   OutputIterator bernoulli_b2n(const int start_index,
+                                       const unsigned number_of_bernoullis_b2n,
+                                       OutputIterator out_it);
+   template <class T, class Policy>
+   T tangent_t2n(const int i, const Policy &pol);
+   template <class T>
+   T tangent_t2n(const int i);
+   template <class T, class OutputIterator, class Policy>
+   OutputIterator tangent_t2n(const int start_index,
+                                       const unsigned number_of_bernoullis_b2n,
+                                       OutputIterator out_it,
+                                       const Policy& pol);
+   template <class T, class OutputIterator>
+   OutputIterator tangent_t2n(const int start_index,
+                                       const unsigned number_of_bernoullis_b2n,
+                                       OutputIterator out_it);
+
+    } // namespace math
+} // namespace boost
+
+#ifdef BOOST_HAS_LONG_LONG
+#define BOOST_MATH_DETAIL_LL_FUNC(Policy)\
+   \
+   template <class T>\
+   inline T modf(const T& v, boost::long_long_type* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
+   \
+   template <class T>\
+   inline boost::long_long_type lltrunc(const T& v){ using boost::math::lltrunc; return lltrunc(v, Policy()); }\
+   \
+   template <class T>\
+   inline boost::long_long_type llround(const T& v){ using boost::math::llround; return llround(v, Policy()); }\
+
+#else
+#define BOOST_MATH_DETAIL_LL_FUNC(Policy)
+#endif
+
+#define BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(Policy)\
+   \
+   BOOST_MATH_DETAIL_LL_FUNC(Policy)\
+   \
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type \
+   beta(RT1 a, RT2 b) { return ::boost::math::beta(a, b, Policy()); }\
+\
+   template <class RT1, class RT2, class A>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, A>::type \
+   beta(RT1 a, RT2 b, A x){ return ::boost::math::beta(a, b, x, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   betac(RT1 a, RT2 b, RT3 x) { return ::boost::math::betac(a, b, x, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibeta(RT1 a, RT2 b, RT3 x){ return ::boost::math::ibeta(a, b, x, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibetac(RT1 a, RT2 b, RT3 x){ return ::boost::math::ibetac(a, b, x, Policy()); }\
+\
+   template <class T1, class T2, class T3, class T4>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3, T4>::type  \
+   ibeta_inv(T1 a, T2 b, T3 p, T4* py){ return ::boost::math::ibeta_inv(a, b, p, py, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibeta_inv(RT1 a, RT2 b, RT3 p){ return ::boost::math::ibeta_inv(a, b, p, Policy()); }\
+\
+   template <class T1, class T2, class T3, class T4>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3, T4>::type \
+   ibetac_inv(T1 a, T2 b, T3 q, T4* py){ return ::boost::math::ibetac_inv(a, b, q, py, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibeta_inva(RT1 a, RT2 b, RT3 p){ return ::boost::math::ibeta_inva(a, b, p, Policy()); }\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type \
+   ibetac_inva(T1 a, T2 b, T3 q){ return ::boost::math::ibetac_inva(a, b, q, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibeta_invb(RT1 a, RT2 b, RT3 p){ return ::boost::math::ibeta_invb(a, b, p, Policy()); }\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type \
+   ibetac_invb(T1 a, T2 b, T3 q){ return ::boost::math::ibetac_invb(a, b, q, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibetac_inv(RT1 a, RT2 b, RT3 q){ return ::boost::math::ibetac_inv(a, b, q, Policy()); }\
+\
+   template <class RT1, class RT2, class RT3>\
+   inline typename boost::math::tools::promote_args<RT1, RT2, RT3>::type \
+   ibeta_derivative(RT1 a, RT2 b, RT3 x){ return ::boost::math::ibeta_derivative(a, b, x, Policy()); }\
+\
+   template <class T> T binomial_coefficient(unsigned n, unsigned k){ return ::boost::math::binomial_coefficient<T, Policy>(n, k, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type erf(RT z) { return ::boost::math::erf(z, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type erfc(RT z){ return ::boost::math::erfc(z, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type erf_inv(RT z) { return ::boost::math::erf_inv(z, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type erfc_inv(RT z){ return ::boost::math::erfc_inv(z, Policy()); }\
+\
+   using boost::math::legendre_next;\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type \
+   legendre_p(int l, T x){ return ::boost::math::legendre_p(l, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type \
+   legendre_q(unsigned l, T x){ return ::boost::math::legendre_q(l, x, Policy()); }\
+\
+   using ::boost::math::legendre_next;\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type \
+   legendre_p(int l, int m, T x){ return ::boost::math::legendre_p(l, m, x, Policy()); }\
+\
+   using ::boost::math::laguerre_next;\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type \
+   laguerre(unsigned n, T x){ return ::boost::math::laguerre(n, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::laguerre_result<T1, T2>::type \
+   laguerre(unsigned n, T1 m, T2 x) { return ::boost::math::laguerre(n, m, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type \
+   hermite(unsigned n, T x){ return ::boost::math::hermite(n, x, Policy()); }\
+\
+   using boost::math::hermite_next;\
+\
+   template <class T1, class T2>\
+   inline std::complex<typename boost::math::tools::promote_args<T1, T2>::type> \
+   spherical_harmonic(unsigned n, int m, T1 theta, T2 phi){ return boost::math::spherical_harmonic(n, m, theta, phi, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+   spherical_harmonic_r(unsigned n, int m, T1 theta, T2 phi){ return ::boost::math::spherical_harmonic_r(n, m, theta, phi, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+   spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi){ return boost::math::spherical_harmonic_i(n, m, theta, phi, Policy()); }\
+\
+   template <class T1, class T2, class Policy>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+      spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi, const Policy& pol);\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type \
+   ellint_rf(T1 x, T2 y, T3 z){ return ::boost::math::ellint_rf(x, y, z, Policy()); }\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type \
+   ellint_rd(T1 x, T2 y, T3 z){ return ::boost::math::ellint_rd(x, y, z, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+   ellint_rc(T1 x, T2 y){ return ::boost::math::ellint_rc(x, y, Policy()); }\
+\
+   template <class T1, class T2, class T3, class T4>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3, T4>::type \
+   ellint_rj(T1 x, T2 y, T3 z, T4 p){ return boost::math::ellint_rj(x, y, z, p, Policy()); }\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type \
+   ellint_rg(T1 x, T2 y, T3 z){ return ::boost::math::ellint_rg(x, y, z, Policy()); }\
+   \
+   template <typename T>\
+   inline typename boost::math::tools::promote_args<T>::type ellint_2(T k){ return boost::math::ellint_2(k, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type ellint_2(T1 k, T2 phi){ return boost::math::ellint_2(k, phi, Policy()); }\
+\
+   template <typename T>\
+   inline typename boost::math::tools::promote_args<T>::type ellint_d(T k){ return boost::math::ellint_d(k, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi){ return boost::math::ellint_d(k, phi, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi){ return boost::math::jacobi_zeta(k, phi, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi){ return boost::math::heuman_lambda(k, phi, Policy()); }\
+\
+   template <typename T>\
+   inline typename boost::math::tools::promote_args<T>::type ellint_1(T k){ return boost::math::ellint_1(k, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type ellint_1(T1 k, T2 phi){ return boost::math::ellint_1(k, phi, Policy()); }\
+\
+   template <class T1, class T2, class T3>\
+   inline typename boost::math::tools::promote_args<T1, T2, T3>::type ellint_3(T1 k, T2 v, T3 phi){ return boost::math::ellint_3(k, v, phi, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type ellint_3(T1 k, T2 v){ return boost::math::ellint_3(k, v, Policy()); }\
+\
+   using boost::math::max_factorial;\
+   template <class RT>\
+   inline RT factorial(unsigned int i) { return boost::math::factorial<RT>(i, Policy()); }\
+   using boost::math::unchecked_factorial;\
+   template <class RT>\
+   inline RT double_factorial(unsigned i){ return boost::math::double_factorial<RT>(i, Policy()); }\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type falling_factorial(RT x, unsigned n){ return boost::math::falling_factorial(x, n, Policy()); }\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type rising_factorial(RT x, unsigned n){ return boost::math::rising_factorial(x, n, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type tgamma(RT z){ return boost::math::tgamma(z, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type tgamma1pm1(RT z){ return boost::math::tgamma1pm1(z, Policy()); }\
+\
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type tgamma(RT1 a, RT2 z){ return boost::math::tgamma(a, z, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type lgamma(RT z, int* sign){ return boost::math::lgamma(z, sign, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type lgamma(RT x){ return boost::math::lgamma(x, Policy()); }\
+\
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type tgamma_lower(RT1 a, RT2 z){ return boost::math::tgamma_lower(a, z, Policy()); }\
+\
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type gamma_q(RT1 a, RT2 z){ return boost::math::gamma_q(a, z, Policy()); }\
+\
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type gamma_p(RT1 a, RT2 z){ return boost::math::gamma_p(a, z, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type tgamma_delta_ratio(T1 z, T2 delta){ return boost::math::tgamma_delta_ratio(z, delta, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type tgamma_ratio(T1 a, T2 b) { return boost::math::tgamma_ratio(a, b, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type gamma_p_derivative(T1 a, T2 x){ return boost::math::gamma_p_derivative(a, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type gamma_p_inv(T1 a, T2 p){ return boost::math::gamma_p_inv(a, p, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type gamma_p_inva(T1 a, T2 p){ return boost::math::gamma_p_inva(a, p, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type gamma_q_inv(T1 a, T2 q){ return boost::math::gamma_q_inv(a, q, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type gamma_q_inva(T1 a, T2 q){ return boost::math::gamma_q_inva(a, q, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type digamma(T x){ return boost::math::digamma(x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type trigamma(T x){ return boost::math::trigamma(x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type polygamma(int n, T x){ return boost::math::polygamma(n, x, Policy()); }\
+   \
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+   hypot(T1 x, T2 y){ return boost::math::hypot(x, y, Policy()); }\
+\
+   template <class RT>\
+   inline typename boost::math::tools::promote_args<RT>::type cbrt(RT z){ return boost::math::cbrt(z, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type log1p(T x){ return boost::math::log1p(x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type log1pmx(T x){ return boost::math::log1pmx(x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type expm1(T x){ return boost::math::expm1(x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::tools::promote_args<T1, T2>::type \
+   powm1(const T1 a, const T2 z){ return boost::math::powm1(a, z, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type sqrt1pm1(const T& val){ return boost::math::sqrt1pm1(val, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type sinc_pi(T x){ return boost::math::sinc_pi(x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type sinhc_pi(T x){ return boost::math::sinhc_pi(x, Policy()); }\
+\
+   template<typename T>\
+   inline typename boost::math::tools::promote_args<T>::type asinh(const T x){ return boost::math::asinh(x, Policy()); }\
+\
+   template<typename T>\
+   inline typename boost::math::tools::promote_args<T>::type acosh(const T x){ return boost::math::acosh(x, Policy()); }\
+\
+   template<typename T>\
+   inline typename boost::math::tools::promote_args<T>::type atanh(const T x){ return boost::math::atanh(x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type cyl_bessel_j(T1 v, T2 x)\
+   { return boost::math::cyl_bessel_j(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type cyl_bessel_j_prime(T1 v, T2 x)\
+   { return boost::math::cyl_bessel_j_prime(v, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type sph_bessel(unsigned v, T x)\
+   { return boost::math::sph_bessel(v, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type sph_bessel_prime(unsigned v, T x)\
+   { return boost::math::sph_bessel_prime(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_bessel_i(T1 v, T2 x) { return boost::math::cyl_bessel_i(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_bessel_i_prime(T1 v, T2 x) { return boost::math::cyl_bessel_i_prime(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_bessel_k(T1 v, T2 x) { return boost::math::cyl_bessel_k(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_bessel_k_prime(T1 v, T2 x) { return boost::math::cyl_bessel_k_prime(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_neumann(T1 v, T2 x){ return boost::math::cyl_neumann(v, x, Policy()); }\
+\
+   template <class T1, class T2>\
+   inline typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type \
+   cyl_neumann_prime(T1 v, T2 x){ return boost::math::cyl_neumann_prime(v, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type \
+   sph_neumann(unsigned v, T x){ return boost::math::sph_neumann(v, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type \
+   sph_neumann_prime(unsigned v, T x){ return boost::math::sph_neumann_prime(v, x, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type cyl_bessel_j_zero(T v, int m)\
+   { return boost::math::cyl_bessel_j_zero(v, m, Policy()); }\
+\
+template <class OutputIterator, class T>\
+   inline void cyl_bessel_j_zero(T v,\
+                                 int start_index,\
+                                 unsigned number_of_zeros,\
+                                 OutputIterator out_it)\
+   { boost::math::cyl_bessel_j_zero(v, start_index, number_of_zeros, out_it, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type cyl_neumann_zero(T v, int m)\
+   { return boost::math::cyl_neumann_zero(v, m, Policy()); }\
+\
+template <class OutputIterator, class T>\
+   inline void cyl_neumann_zero(T v,\
+                                int start_index,\
+                                unsigned number_of_zeros,\
+                                OutputIterator out_it)\
+   { boost::math::cyl_neumann_zero(v, start_index, number_of_zeros, out_it, Policy()); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type sin_pi(T x){ return boost::math::sin_pi(x); }\
+\
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type cos_pi(T x){ return boost::math::cos_pi(x); }\
+\
+   using boost::math::fpclassify;\
+   using boost::math::isfinite;\
+   using boost::math::isinf;\
+   using boost::math::isnan;\
+   using boost::math::isnormal;\
+   using boost::math::signbit;\
+   using boost::math::sign;\
+   using boost::math::copysign;\
+   using boost::math::changesign;\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T,U>::type expint(T const& z, U const& u)\
+   { return boost::math::expint(z, u, Policy()); }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type expint(T z){ return boost::math::expint(z, Policy()); }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type zeta(T s){ return boost::math::zeta(s, Policy()); }\
+   \
+   template <class T>\
+   inline T round(const T& v){ using boost::math::round; return round(v, Policy()); }\
+   \
+   template <class T>\
+   inline int iround(const T& v){ using boost::math::iround; return iround(v, Policy()); }\
+   \
+   template <class T>\
+   inline long lround(const T& v){ using boost::math::lround; return lround(v, Policy()); }\
+   \
+   template <class T>\
+   inline T trunc(const T& v){ using boost::math::trunc; return trunc(v, Policy()); }\
+   \
+   template <class T>\
+   inline int itrunc(const T& v){ using boost::math::itrunc; return itrunc(v, Policy()); }\
+   \
+   template <class T>\
+   inline long ltrunc(const T& v){ using boost::math::ltrunc; return ltrunc(v, Policy()); }\
+   \
+   template <class T>\
+   inline T modf(const T& v, T* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
+   \
+   template <class T>\
+   inline T modf(const T& v, int* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
+   \
+   template <class T>\
+   inline T modf(const T& v, long* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
+   \
+   template <int N, class T>\
+   inline typename boost::math::tools::promote_args<T>::type pow(T v){ return boost::math::pow<N>(v, Policy()); }\
+   \
+   template <class T> T nextafter(const T& a, const T& b){ return boost::math::nextafter(a, b, Policy()); }\
+   template <class T> T float_next(const T& a){ return boost::math::float_next(a, Policy()); }\
+   template <class T> T float_prior(const T& a){ return boost::math::float_prior(a, Policy()); }\
+   template <class T> T float_distance(const T& a, const T& b){ return boost::math::float_distance(a, b, Policy()); }\
+   \
+   template <class RT1, class RT2>\
+   inline typename boost::math::tools::promote_args<RT1, RT2>::type owens_t(RT1 a, RT2 z){ return boost::math::owens_t(a, z, Policy()); }\
+   \
+   template <class T1, class T2>\
+   inline std::complex<typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type> cyl_hankel_1(T1 v, T2 x)\
+   {  return boost::math::cyl_hankel_1(v, x, Policy()); }\
+   \
+   template <class T1, class T2>\
+   inline std::complex<typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type> cyl_hankel_2(T1 v, T2 x)\
+   { return boost::math::cyl_hankel_2(v, x, Policy()); }\
+   \
+   template <class T1, class T2>\
+   inline std::complex<typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type> sph_hankel_1(T1 v, T2 x)\
+   { return boost::math::sph_hankel_1(v, x, Policy()); }\
+   \
+   template <class T1, class T2>\
+   inline std::complex<typename boost::math::detail::bessel_traits<T1, T2, Policy >::result_type> sph_hankel_2(T1 v, T2 x)\
+   { return boost::math::sph_hankel_2(v, x, Policy()); }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type jacobi_elliptic(T k, T theta, T* pcn, T* pdn)\
+   { return boost::math::jacobi_elliptic(k, theta, pcn, pdn, Policy()); }\
+   \
+   template <class U, class T>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_sn(U k, T theta)\
+   { return boost::math::jacobi_sn(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_cn(T k, U theta)\
+   { return boost::math::jacobi_cn(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_dn(T k, U theta)\
+   { return boost::math::jacobi_dn(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_cd(T k, U theta)\
+   { return boost::math::jacobi_cd(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_dc(T k, U theta)\
+   { return boost::math::jacobi_dc(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_ns(T k, U theta)\
+   { return boost::math::jacobi_ns(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_sd(T k, U theta)\
+   { return boost::math::jacobi_sd(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_ds(T k, U theta)\
+   { return boost::math::jacobi_ds(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_nc(T k, U theta)\
+   { return boost::math::jacobi_nc(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_nd(T k, U theta)\
+   { return boost::math::jacobi_nd(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_sc(T k, U theta)\
+   { return boost::math::jacobi_sc(k, theta, Policy()); }\
+   \
+   template <class T, class U>\
+   inline typename boost::math::tools::promote_args<T, U>::type jacobi_cs(T k, U theta)\
+   { return boost::math::jacobi_cs(k, theta, Policy()); }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type airy_ai(T x)\
+   {  return boost::math::airy_ai(x, Policy());  }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type airy_bi(T x)\
+   {  return boost::math::airy_bi(x, Policy());  }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type airy_ai_prime(T x)\
+   {  return boost::math::airy_ai_prime(x, Policy());  }\
+   \
+   template <class T>\
+   inline typename boost::math::tools::promote_args<T>::type airy_bi_prime(T x)\
+   {  return boost::math::airy_bi_prime(x, Policy());  }\
+   \
+   template <class T>\
+   inline T airy_ai_zero(int m)\
+   { return boost::math::airy_ai_zero<T>(m, Policy()); }\
+   template <class T, class OutputIterator>\
+   OutputIterator airy_ai_zero(int start_index, unsigned number_of_zeros, OutputIterator out_it)\
+   { return boost::math::airy_ai_zero<T>(start_index, number_of_zeros, out_it, Policy()); }\
+   \
+   template <class T>\
+   inline T airy_bi_zero(int m)\
+   { return boost::math::airy_bi_zero<T>(m, Policy()); }\
+   template <class T, class OutputIterator>\
+   OutputIterator airy_bi_zero(int start_index, unsigned number_of_zeros, OutputIterator out_it)\
+   { return boost::math::airy_bi_zero<T>(start_index, number_of_zeros, out_it, Policy()); }\
+   \
+   template <class T>\
+   T bernoulli_b2n(const int i)\
+   { return boost::math::bernoulli_b2n<T>(i, Policy()); }\
+   template <class T, class OutputIterator>\
+   OutputIterator bernoulli_b2n(int start_index, unsigned number_of_bernoullis_b2n, OutputIterator out_it)\
+   { return boost::math::bernoulli_b2n<T>(start_index, number_of_bernoullis_b2n, out_it, Policy()); }\
+   \
+   template <class T>\
+   T tangent_t2n(const int i)\
+   { return boost::math::tangent_t2n<T>(i, Policy()); }\
+   template <class T, class OutputIterator>\
+   OutputIterator tangent_t2n(int start_index, unsigned number_of_bernoullis_b2n, OutputIterator out_it)\
+   { return boost::math::tangent_t2n<T>(start_index, number_of_bernoullis_b2n, out_it, Policy()); }\
+   \
+
+
+
+
+
+#endif // BOOST_MATH_SPECIAL_MATH_FWD_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/modf.hpp b/gatb-core/thirdparty/boost/math/special_functions/modf.hpp
new file mode 100644
index 0000000..3ce74e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/modf.hpp
@@ -0,0 +1,71 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_MODF_HPP
+#define BOOST_MATH_MODF_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+
+namespace boost{ namespace math{
+
+template <class T, class Policy>
+inline T modf(const T& v, T* ipart, const Policy& pol)
+{
+   *ipart = trunc(v, pol);
+   return v - *ipart;
+}
+template <class T>
+inline T modf(const T& v, T* ipart)
+{
+   return modf(v, ipart, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T modf(const T& v, int* ipart, const Policy& pol)
+{
+   *ipart = itrunc(v, pol);
+   return v - *ipart;
+}
+template <class T>
+inline T modf(const T& v, int* ipart)
+{
+   return modf(v, ipart, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T modf(const T& v, long* ipart, const Policy& pol)
+{
+   *ipart = ltrunc(v, pol);
+   return v - *ipart;
+}
+template <class T>
+inline T modf(const T& v, long* ipart)
+{
+   return modf(v, ipart, policies::policy<>());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class T, class Policy>
+inline T modf(const T& v, boost::long_long_type* ipart, const Policy& pol)
+{
+   *ipart = lltrunc(v, pol);
+   return v - *ipart;
+}
+template <class T>
+inline T modf(const T& v, boost::long_long_type* ipart)
+{
+   return modf(v, ipart, policies::policy<>());
+}
+#endif
+
+}} // namespaces
+
+#endif // BOOST_MATH_MODF_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/next.hpp b/gatb-core/thirdparty/boost/math/special_functions/next.hpp
new file mode 100644
index 0000000..9602bc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/next.hpp
@@ -0,0 +1,500 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_NEXT_HPP
+#define BOOST_MATH_SPECIAL_NEXT_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+
+#include <float.h>
+
+#if !defined(_CRAYC) && !defined(__CUDACC__) && (!defined(__GNUC__) || (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 3)))
+#if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__SSE2__)
+#include "xmmintrin.h"
+#define BOOST_MATH_CHECK_SSE2
+#endif
+#endif
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T>
+inline T get_smallest_value(mpl::true_ const&)
+{
+   //
+   // numeric_limits lies about denorms being present - particularly
+   // when this can be turned on or off at runtime, as is the case
+   // when using the SSE2 registers in DAZ or FTZ mode.
+   //
+   static const T m = std::numeric_limits<T>::denorm_min();
+#ifdef BOOST_MATH_CHECK_SSE2
+   return (_mm_getcsr() & (_MM_FLUSH_ZERO_ON | 0x40)) ? tools::min_value<T>() : m;;
+#else
+   return ((tools::min_value<T>() / 2) == 0) ? tools::min_value<T>() : m;
+#endif
+}
+
+template <class T>
+inline T get_smallest_value(mpl::false_ const&)
+{
+   return tools::min_value<T>();
+}
+
+template <class T>
+inline T get_smallest_value()
+{
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1310)
+   return get_smallest_value<T>(mpl::bool_<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::has_denorm == 1)>());
+#else
+   return get_smallest_value<T>(mpl::bool_<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::has_denorm == std::denorm_present)>());
+#endif
+}
+
+//
+// Returns the smallest value that won't generate denorms when
+// we calculate the value of the least-significant-bit:
+//
+template <class T>
+T get_min_shift_value();
+
+template <class T>
+struct min_shift_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init();
+      }
+      static void do_init()
+      {
+         get_min_shift_value<T>();
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T>
+const typename min_shift_initializer<T>::init min_shift_initializer<T>::initializer;
+
+
+template <class T>
+inline T get_min_shift_value()
+{
+   BOOST_MATH_STD_USING
+   static const T val = ldexp(tools::min_value<T>(), tools::digits<T>() + 1);
+   min_shift_initializer<T>::force_instantiate();
+
+   return val;
+}
+
+template <class T, class Policy>
+T float_next_imp(const T& val, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   int expon;
+   static const char* function = "float_next<%1%>(%1%)";
+
+   int fpclass = (boost::math::fpclassify)(val);
+
+   if((fpclass == (int)FP_NAN) || (fpclass == (int)FP_INFINITE))
+   {
+      if(val < 0)
+         return -tools::max_value<T>();
+      return policies::raise_domain_error<T>(
+         function,
+         "Argument must be finite, but got %1%", val, pol);
+   }
+
+   if(val >= tools::max_value<T>())
+      return policies::raise_overflow_error<T>(function, 0, pol);
+
+   if(val == 0)
+      return detail::get_smallest_value<T>();
+
+   if((fpclass != (int)FP_SUBNORMAL) && (fpclass != (int)FP_ZERO) && (fabs(val) < detail::get_min_shift_value<T>()) && (val != -tools::min_value<T>()))
+   {
+      //
+      // Special case: if the value of the least significant bit is a denorm, and the result
+      // would not be a denorm, then shift the input, increment, and shift back.
+      // This avoids issues with the Intel SSE2 registers when the FTZ or DAZ flags are set.
+      //
+      return ldexp(float_next(T(ldexp(val, 2 * tools::digits<T>())), pol), -2 * tools::digits<T>());
+   }
+
+   if(-0.5f == frexp(val, &expon))
+      --expon; // reduce exponent when val is a power of two, and negative.
+   T diff = ldexp(T(1), expon - tools::digits<T>());
+   if(diff == 0)
+      diff = detail::get_smallest_value<T>();
+   return val + diff;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type float_next(const T& val, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   return detail::float_next_imp(static_cast<result_type>(val), pol);
+}
+
+#if 0 //def BOOST_MSVC
+//
+// We used to use ::_nextafter here, but doing so fails when using
+// the SSE2 registers if the FTZ or DAZ flags are set, so use our own
+// - albeit slower - code instead as at least that gives the correct answer.
+//
+template <class Policy>
+inline double float_next(const double& val, const Policy& pol)
+{
+   static const char* function = "float_next<%1%>(%1%)";
+
+   if(!(boost::math::isfinite)(val) && (val > 0))
+      return policies::raise_domain_error<double>(
+         function,
+         "Argument must be finite, but got %1%", val, pol);
+
+   if(val >= tools::max_value<double>())
+      return policies::raise_overflow_error<double>(function, 0, pol);
+
+   return ::_nextafter(val, tools::max_value<double>());
+}
+#endif
+
+template <class T>
+inline typename tools::promote_args<T>::type float_next(const T& val)
+{
+   return float_next(val, policies::policy<>());
+}
+
+namespace detail{
+
+template <class T, class Policy>
+T float_prior_imp(const T& val, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   int expon;
+   static const char* function = "float_prior<%1%>(%1%)";
+
+   int fpclass = (boost::math::fpclassify)(val);
+
+   if((fpclass == (int)FP_NAN) || (fpclass == (int)FP_INFINITE))
+   {
+      if(val > 0)
+         return tools::max_value<T>();
+      return policies::raise_domain_error<T>(
+         function,
+         "Argument must be finite, but got %1%", val, pol);
+   }
+
+   if(val <= -tools::max_value<T>())
+      return -policies::raise_overflow_error<T>(function, 0, pol);
+
+   if(val == 0)
+      return -detail::get_smallest_value<T>();
+
+   if((fpclass != (int)FP_SUBNORMAL) && (fpclass != (int)FP_ZERO) && (fabs(val) < detail::get_min_shift_value<T>()) && (val != tools::min_value<T>()))
+   {
+      //
+      // Special case: if the value of the least significant bit is a denorm, and the result
+      // would not be a denorm, then shift the input, increment, and shift back.
+      // This avoids issues with the Intel SSE2 registers when the FTZ or DAZ flags are set.
+      //
+      return ldexp(float_prior(T(ldexp(val, 2 * tools::digits<T>())), pol), -2 * tools::digits<T>());
+   }
+
+   T remain = frexp(val, &expon);
+   if(remain == 0.5)
+      --expon; // when val is a power of two we must reduce the exponent
+   T diff = ldexp(T(1), expon - tools::digits<T>());
+   if(diff == 0)
+      diff = detail::get_smallest_value<T>();
+   return val - diff;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type float_prior(const T& val, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   return detail::float_prior_imp(static_cast<result_type>(val), pol);
+}
+
+#if 0 //def BOOST_MSVC
+//
+// We used to use ::_nextafter here, but doing so fails when using
+// the SSE2 registers if the FTZ or DAZ flags are set, so use our own
+// - albeit slower - code instead as at least that gives the correct answer.
+//
+template <class Policy>
+inline double float_prior(const double& val, const Policy& pol)
+{
+   static const char* function = "float_prior<%1%>(%1%)";
+
+   if(!(boost::math::isfinite)(val) && (val < 0))
+      return policies::raise_domain_error<double>(
+         function,
+         "Argument must be finite, but got %1%", val, pol);
+
+   if(val <= -tools::max_value<double>())
+      return -policies::raise_overflow_error<double>(function, 0, pol);
+
+   return ::_nextafter(val, -tools::max_value<double>());
+}
+#endif
+
+template <class T>
+inline typename tools::promote_args<T>::type float_prior(const T& val)
+{
+   return float_prior(val, policies::policy<>());
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type nextafter(const T& val, const U& direction, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   return val < direction ? boost::math::float_next<result_type>(val, pol) : val == direction ? val : boost::math::float_prior<result_type>(val, pol);
+}
+
+template <class T, class U>
+inline typename tools::promote_args<T, U>::type nextafter(const T& val, const U& direction)
+{
+   return nextafter(val, direction, policies::policy<>());
+}
+
+namespace detail{
+
+template <class T, class Policy>
+T float_distance_imp(const T& a, const T& b, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Error handling:
+   //
+   static const char* function = "float_distance<%1%>(%1%, %1%)";
+   if(!(boost::math::isfinite)(a))
+      return policies::raise_domain_error<T>(
+         function,
+         "Argument a must be finite, but got %1%", a, pol);
+   if(!(boost::math::isfinite)(b))
+      return policies::raise_domain_error<T>(
+         function,
+         "Argument b must be finite, but got %1%", b, pol);
+   //
+   // Special cases:
+   //
+   if(a > b)
+      return -float_distance(b, a, pol);
+   if(a == b)
+      return 0;
+   if(a == 0)
+      return 1 + fabs(float_distance(static_cast<T>((b < 0) ? T(-detail::get_smallest_value<T>()) : detail::get_smallest_value<T>()), b, pol));
+   if(b == 0)
+      return 1 + fabs(float_distance(static_cast<T>((a < 0) ? T(-detail::get_smallest_value<T>()) : detail::get_smallest_value<T>()), a, pol));
+   if(boost::math::sign(a) != boost::math::sign(b))
+      return 2 + fabs(float_distance(static_cast<T>((b < 0) ? T(-detail::get_smallest_value<T>()) : detail::get_smallest_value<T>()), b, pol))
+         + fabs(float_distance(static_cast<T>((a < 0) ? T(-detail::get_smallest_value<T>()) : detail::get_smallest_value<T>()), a, pol));
+   //
+   // By the time we get here, both a and b must have the same sign, we want
+   // b > a and both postive for the following logic:
+   //
+   if(a < 0)
+      return float_distance(static_cast<T>(-b), static_cast<T>(-a), pol);
+
+   BOOST_ASSERT(a >= 0);
+   BOOST_ASSERT(b >= a);
+
+   int expon;
+   //
+   // Note that if a is a denorm then the usual formula fails
+   // because we actually have fewer than tools::digits<T>()
+   // significant bits in the representation:
+   //
+   frexp(((boost::math::fpclassify)(a) == (int)FP_SUBNORMAL) ? tools::min_value<T>() : a, &expon);
+   T upper = ldexp(T(1), expon);
+   T result = 0;
+   expon = tools::digits<T>() - expon;
+   //
+   // If b is greater than upper, then we *must* split the calculation
+   // as the size of the ULP changes with each order of magnitude change:
+   //
+   if(b > upper)
+   {
+      result = float_distance(upper, b);
+   }
+   //
+   // Use compensated double-double addition to avoid rounding
+   // errors in the subtraction:
+   //
+   T mb, x, y, z;
+   if(((boost::math::fpclassify)(a) == (int)FP_SUBNORMAL) || (b - a < tools::min_value<T>()))
+   {
+      //
+      // Special case - either one end of the range is a denormal, or else the difference is.
+      // The regular code will fail if we're using the SSE2 registers on Intel and either
+      // the FTZ or DAZ flags are set.
+      //
+      T a2 = ldexp(a, tools::digits<T>());
+      T b2 = ldexp(b, tools::digits<T>());
+      mb = -(std::min)(T(ldexp(upper, tools::digits<T>())), b2);
+      x = a2 + mb;
+      z = x - a2;
+      y = (a2 - (x - z)) + (mb - z);
+
+      expon -= tools::digits<T>();
+   }
+   else
+   {
+      mb = -(std::min)(upper, b);
+      x = a + mb;
+      z = x - a;
+      y = (a - (x - z)) + (mb - z);
+   }
+   if(x < 0)
+   {
+      x = -x;
+      y = -y;
+   }
+   result += ldexp(x, expon) + ldexp(y, expon);
+   //
+   // Result must be an integer:
+   //
+   BOOST_ASSERT(result == floor(result));
+   return result;
+}
+
+}
+
+template <class T, class U, class Policy>
+inline typename tools::promote_args<T, U>::type float_distance(const T& a, const U& b, const Policy& pol)
+{
+   typedef typename tools::promote_args<T, U>::type result_type;
+   return detail::float_distance_imp(static_cast<result_type>(a), static_cast<result_type>(b), pol);
+}
+
+template <class T, class U>
+typename tools::promote_args<T, U>::type float_distance(const T& a, const U& b)
+{
+   return boost::math::float_distance(a, b, policies::policy<>());
+}
+
+namespace detail{
+
+template <class T, class Policy>
+T float_advance_imp(T val, int distance, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Error handling:
+   //
+   static const char* function = "float_advance<%1%>(%1%, int)";
+
+   int fpclass = (boost::math::fpclassify)(val);
+
+   if((fpclass == (int)FP_NAN) || (fpclass == (int)FP_INFINITE))
+      return policies::raise_domain_error<T>(
+         function,
+         "Argument val must be finite, but got %1%", val, pol);
+
+   if(val < 0)
+      return -float_advance(-val, -distance, pol);
+   if(distance == 0)
+      return val;
+   if(distance == 1)
+      return float_next(val, pol);
+   if(distance == -1)
+      return float_prior(val, pol);
+
+   if(fabs(val) < detail::get_min_shift_value<T>())
+   {
+      //
+      // Special case: if the value of the least significant bit is a denorm,
+      // implement in terms of float_next/float_prior.
+      // This avoids issues with the Intel SSE2 registers when the FTZ or DAZ flags are set.
+      //
+      if(distance > 0)
+      {
+         do{ val = float_next(val, pol); } while(--distance);
+      }
+      else
+      {
+         do{ val = float_prior(val, pol); } while(++distance);
+      }
+      return val;
+   }
+
+   int expon;
+   frexp(val, &expon);
+   T limit = ldexp((distance < 0 ? T(0.5f) : T(1)), expon);
+   if(val <= tools::min_value<T>())
+   {
+      limit = sign(T(distance)) * tools::min_value<T>();
+   }
+   T limit_distance = float_distance(val, limit);
+   while(fabs(limit_distance) < abs(distance))
+   {
+      distance -= itrunc(limit_distance);
+      val = limit;
+      if(distance < 0)
+      {
+         limit /= 2;
+         expon--;
+      }
+      else
+      {
+         limit *= 2;
+         expon++;
+      }
+      limit_distance = float_distance(val, limit);
+      if(distance && (limit_distance == 0))
+      {
+         return policies::raise_evaluation_error<T>(function, "Internal logic failed while trying to increment floating point value %1%: most likely your FPU is in non-IEEE conforming mode.", val, pol);
+      }
+   }
+   if((0.5f == frexp(val, &expon)) && (distance < 0))
+      --expon;
+   T diff = 0;
+   if(val != 0)
+      diff = distance * ldexp(T(1), expon - tools::digits<T>());
+   if(diff == 0)
+      diff = distance * detail::get_smallest_value<T>();
+   return val += diff;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type float_advance(T val, int distance, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   return detail::float_advance_imp(static_cast<result_type>(val), distance, pol);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type float_advance(const T& val, int distance)
+{
+   return boost::math::float_advance(val, distance, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_SPECIAL_NEXT_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/nonfinite_num_facets.hpp b/gatb-core/thirdparty/boost/math/special_functions/nonfinite_num_facets.hpp
new file mode 100644
index 0000000..84d3f10
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/nonfinite_num_facets.hpp
@@ -0,0 +1,592 @@
+#ifndef BOOST_MATH_NONFINITE_NUM_FACETS_HPP
+#define BOOST_MATH_NONFINITE_NUM_FACETS_HPP
+
+// Copyright 2006 Johan Rade
+// Copyright 2012 K R Walker
+// Copyright 2011, 2012 Paul A. Bristow 
+
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+/*
+\file
+
+\brief non_finite_num facets for C99 standard output of infinity and NaN.
+
+\details See fuller documentation at Boost.Math Facets
+  for Floating-Point Infinities and NaNs.
+*/
+
+#include <cstring>
+#include <ios>
+#include <limits>
+#include <locale>
+
+#include <boost/version.hpp>
+
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+
+#ifdef _MSC_VER
+#  pragma warning(push)
+#  pragma warning(disable : 4127) // conditional expression is constant.
+#  pragma warning(disable : 4706) // assignment within conditional expression.
+#endif
+
+namespace boost {
+  namespace math {
+
+    // flags (enums can be ORed together)       -----------------------------------
+
+    const int legacy = 0x1; //!< get facet will recognize most string representations of infinity and NaN.
+    const int signed_zero = 0x2; //!< put facet will distinguish between positive and negative zero.
+    const int trap_infinity = 0x4; /*!< put facet will throw an exception of type std::ios_base::failure
+       when an attempt is made to format positive or negative infinity.
+       get will set the fail bit of the stream when an attempt is made
+       to parse a string that represents positive or negative sign infinity.
+    */
+    const int trap_nan = 0x8; /*!< put facet will throw an exception of type std::ios_base::failure
+       when an attempt is made to format positive or negative NaN.
+       get will set the fail bit of the stream when an attempt is made
+       to parse a string that represents positive or negative sign infinity.
+       */
+
+    // class nonfinite_num_put -----------------------------------------------------
+
+    template<
+      class CharType,
+      class OutputIterator = std::ostreambuf_iterator<CharType>
+            >
+    class nonfinite_num_put : public std::num_put<CharType, OutputIterator>
+    {
+    public:
+      explicit nonfinite_num_put(int flags = 0) : flags_(flags) {}
+
+    protected:
+      virtual OutputIterator do_put(
+        OutputIterator it, std::ios_base& iosb, CharType fill, double val) const
+      {
+        put_and_reset_width(it, iosb, fill, val);
+        return it;
+      }
+
+      virtual OutputIterator do_put(
+        OutputIterator it, std::ios_base& iosb,  CharType fill, long double val) const
+      {
+        put_and_reset_width(it, iosb, fill, val);
+        return it;
+      }
+
+    private:
+      template<class ValType> void put_and_reset_width(
+        OutputIterator& it, std::ios_base& iosb,
+        CharType fill, ValType val) const
+      {
+        put_impl(it, iosb, fill, val);
+        iosb.width(0);
+      }
+
+      template<class ValType> void put_impl(
+        OutputIterator& it, std::ios_base& iosb,
+        CharType fill, ValType val) const
+      {
+        static const CharType prefix_plus[2] = { '+', '\0' };
+        static const CharType prefix_minus[2] = { '-', '\0' };
+        static const CharType body_inf[4] = { 'i', 'n', 'f', '\0' };
+        static const CharType body_nan[4] = { 'n', 'a', 'n', '\0' };
+        static const CharType* null_string = 0;
+
+        switch((boost::math::fpclassify)(val))
+        {
+
+        case FP_INFINITE:
+          if(flags_ & trap_infinity)
+          {
+            throw std::ios_base::failure("Infinity");
+          }
+          else if((boost::math::signbit)(val))
+          { // negative infinity.
+            put_num_and_fill(it, iosb, prefix_minus, body_inf, fill, val);
+          }
+          else if(iosb.flags() & std::ios_base::showpos)
+          { // Explicit "+inf" wanted.
+            put_num_and_fill(it, iosb, prefix_plus, body_inf, fill, val);
+          }
+          else
+          { // just "inf" wanted.
+            put_num_and_fill(it, iosb, null_string, body_inf, fill, val);
+          }
+          break;
+
+        case FP_NAN:
+          if(flags_ & trap_nan)
+          {
+            throw std::ios_base::failure("NaN");
+          }
+          else if((boost::math::signbit)(val))
+          { // negative so "-nan".
+            put_num_and_fill(it, iosb, prefix_minus, body_nan, fill, val);
+          }
+          else if(iosb.flags() & std::ios_base::showpos)
+          { // explicit "+nan" wanted.
+            put_num_and_fill(it, iosb, prefix_plus, body_nan, fill, val);
+          }
+          else
+          { // Just "nan".
+            put_num_and_fill(it, iosb, null_string, body_nan, fill, val);
+          }
+          break;
+
+        case FP_ZERO:
+          if((flags_ & signed_zero) && ((boost::math::signbit)(val)))
+          { // Flag set to distinguish between positive and negative zero.
+            // But string "0" should have stuff after decimal point if setprecision and/or exp format. 
+
+            std::basic_ostringstream<CharType> zeros; // Needs to be CharType version.
+
+            // Copy flags, fill, width and precision.
+            zeros.flags(iosb.flags());
+            zeros.unsetf(std::ios::showpos); // Ignore showpos because must be negative.
+            zeros.precision(iosb.precision());
+            //zeros.width is set by put_num_and_fill
+            zeros.fill(static_cast<char>(fill));
+            zeros << ValType(0);
+            put_num_and_fill(it, iosb, prefix_minus, zeros.str().c_str(), fill, val);
+          }
+          else
+          { // Output the platform default for positive and negative zero.
+            put_num_and_fill(it, iosb, null_string, null_string, fill, val);
+          }
+          break;
+
+        default:  // Normal non-zero finite value.
+          it = std::num_put<CharType, OutputIterator>::do_put(it, iosb, fill, val);
+          break;
+        }
+      }
+
+      template<class ValType>
+      void put_num_and_fill(
+        OutputIterator& it, std::ios_base& iosb, const CharType* prefix,
+          const CharType* body, CharType fill, ValType val) const
+      {
+        int prefix_length = prefix ? (int)std::char_traits<CharType>::length(prefix) : 0;
+        int body_length = body ? (int)std::char_traits<CharType>::length(body) : 0;
+        int width = prefix_length + body_length;
+        std::ios_base::fmtflags adjust = iosb.flags() & std::ios_base::adjustfield;
+        const std::ctype<CharType>& ct
+          = std::use_facet<std::ctype<CharType> >(iosb.getloc());
+
+        if(body || prefix)
+        { // adjust == std::ios_base::right, so leading fill needed.
+          if(adjust != std::ios_base::internal && adjust != std::ios_base::left)
+            put_fill(it, iosb, fill, width);
+        }
+
+        if(prefix)
+        { // Adjust width for prefix.
+          while(*prefix)
+            *it = *(prefix++);
+          iosb.width( iosb.width() - prefix_length );
+          width -= prefix_length;
+        }
+
+        if(body)
+        { // 
+          if(adjust == std::ios_base::internal)
+          { // Put fill between sign and digits.
+            put_fill(it, iosb, fill, width);
+          }
+          if(iosb.flags() & std::ios_base::uppercase)
+          {
+              while(*body)
+                *it = ct.toupper(*(body++));
+          }
+          else
+          {
+            while(*body)
+              *it = *(body++);
+          }
+
+          if(adjust == std::ios_base::left)
+            put_fill(it, iosb, fill, width);
+        }
+        else
+        {
+          it = std::num_put<CharType, OutputIterator>::do_put(it, iosb, fill, val);
+        }
+      }
+
+      void put_fill(
+        OutputIterator& it, std::ios_base& iosb, CharType fill, int width) const
+      { // Insert fill chars.
+        for(std::streamsize i = iosb.width() - static_cast<std::streamsize>(width); i > 0; --i)
+          *it = fill;
+      }
+
+    private:
+      const int flags_;
+    };
+
+
+    // class nonfinite_num_get ------------------------------------------------------
+
+    template<
+      class CharType,
+      class InputIterator = std::istreambuf_iterator<CharType>
+    >
+    class nonfinite_num_get : public std::num_get<CharType, InputIterator>
+    {
+
+    public:
+      explicit nonfinite_num_get(int flags = 0) : flags_(flags)
+      {}
+
+    protected:  // float, double and long double versions of do_get.
+      virtual InputIterator do_get(
+        InputIterator it, InputIterator end, std::ios_base& iosb,
+        std::ios_base::iostate& state, float& val) const
+      {
+        get_and_check_eof(it, end, iosb, state, val);
+        return it;
+      }
+
+      virtual InputIterator do_get(
+        InputIterator it, InputIterator end, std::ios_base& iosb,
+        std::ios_base::iostate& state, double& val) const
+      {
+        get_and_check_eof(it, end, iosb, state, val);
+        return it;
+      }
+
+      virtual InputIterator do_get(
+        InputIterator it, InputIterator end, std::ios_base& iosb,
+        std::ios_base::iostate& state, long double& val) const
+      {
+        get_and_check_eof(it, end, iosb, state, val);
+        return it;
+      }
+
+      //..............................................................................
+
+    private:
+      template<class ValType> static ValType positive_nan()
+      {
+        // On some platforms quiet_NaN() may be negative.
+        return (boost::math::copysign)(
+          std::numeric_limits<ValType>::quiet_NaN(), static_cast<ValType>(1)
+          );
+        // static_cast<ValType>(1) added Paul A. Bristow 5 Apr 11
+      }
+
+      template<class ValType> void get_and_check_eof
+      (
+        InputIterator& it, InputIterator end, std::ios_base& iosb,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        get_signed(it, end, iosb, state, val);
+        if(it == end)
+          state |= std::ios_base::eofbit;
+      }
+
+      template<class ValType> void get_signed
+      (
+        InputIterator& it, InputIterator end, std::ios_base& iosb,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        const std::ctype<CharType>& ct
+          = std::use_facet<std::ctype<CharType> >(iosb.getloc());
+
+        char c = peek_char(it, end, ct);
+
+        bool negative = (c == '-');
+
+        if(negative || c == '+')
+        {
+          ++it;
+          c = peek_char(it, end, ct);
+          if(c == '-' || c == '+')
+          { // Without this check, "++5" etc would be accepted.
+            state |= std::ios_base::failbit;
+            return;
+          }
+        }
+
+        get_unsigned(it, end, iosb, ct, state, val);
+
+        if(negative)
+        {
+          val = (boost::math::changesign)(val);
+        }
+      } // void get_signed
+
+      template<class ValType> void get_unsigned
+      ( //! Get an unsigned floating-point value into val,
+        //! but checking for letters indicating non-finites.
+        InputIterator& it, InputIterator end, std::ios_base& iosb,
+        const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        switch(peek_char(it, end, ct))
+        {
+        case 'i':
+          get_i(it, end, ct, state, val);
+          break;
+
+        case 'n':
+          get_n(it, end, ct, state, val);
+          break;
+
+        case 'q':
+        case 's':
+          get_q(it, end, ct, state, val);
+          break;
+
+        default: // Got a normal floating-point value into val.
+          it = std::num_get<CharType, InputIterator>::do_get(
+            it, end, iosb, state, val);
+          if((flags_ & legacy) && val == static_cast<ValType>(1)
+            && peek_char(it, end, ct) == '#')
+            get_one_hash(it, end, ct, state, val);
+          break;
+        }
+      } //  get_unsigned
+
+      //..........................................................................
+
+      template<class ValType> void get_i
+      ( // Get the rest of all strings starting with 'i', expect "inf", "infinity".
+        InputIterator& it, InputIterator end, const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        if(!std::numeric_limits<ValType>::has_infinity
+          || (flags_ & trap_infinity))
+        {
+            state |= std::ios_base::failbit;
+            return;
+        }
+
+        ++it;
+        if(!match_string(it, end, ct, "nf"))
+        {
+          state |= std::ios_base::failbit;
+          return;
+        }
+
+        if(peek_char(it, end, ct) != 'i')
+        {
+          val = std::numeric_limits<ValType>::infinity();  // "inf"
+          return;
+        }
+
+        ++it;
+        if(!match_string(it, end, ct, "nity"))
+        { // Expected "infinity"
+          state |= std::ios_base::failbit;
+          return;
+        }
+
+        val = std::numeric_limits<ValType>::infinity(); // "infinity"
+      } // void get_i
+
+      template<class ValType> void get_n
+      ( // Get expected strings after 'n', "nan", "nanq", "nans", "nan(...)"
+        InputIterator& it, InputIterator end, const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        if(!std::numeric_limits<ValType>::has_quiet_NaN
+          || (flags_ & trap_nan)) {
+            state |= std::ios_base::failbit;
+            return;
+        }
+
+        ++it;
+        if(!match_string(it, end, ct, "an"))
+        {
+          state |= std::ios_base::failbit;
+          return;
+        }
+
+        switch(peek_char(it, end, ct)) {
+        case 'q':
+        case 's':
+          if(flags_ && legacy)
+            ++it;
+          break;  // "nanq", "nans"
+
+        case '(':   // Optional payload field in (...) follows.
+         {
+            ++it;
+            char c;
+            while((c = peek_char(it, end, ct))
+              && c != ')' && c != ' ' && c != '\n' && c != '\t')
+              ++it;
+            if(c != ')')
+            { // Optional payload field terminator missing!
+              state |= std::ios_base::failbit;
+              return;
+            }
+            ++it;
+            break;  // "nan(...)"
+          }
+
+        default:
+          break;  // "nan"
+        }
+
+        val = positive_nan<ValType>();
+      } // void get_n
+
+      template<class ValType> void get_q
+      ( // Get expected rest of string starting with 'q': "qnan".
+        InputIterator& it, InputIterator end, const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        if(!std::numeric_limits<ValType>::has_quiet_NaN
+          || (flags_ & trap_nan) || !(flags_ & legacy))
+        {
+          state |= std::ios_base::failbit;
+          return;
+        }
+
+        ++it;
+        if(!match_string(it, end, ct, "nan"))
+        {
+          state |= std::ios_base::failbit;
+          return;
+        }
+
+        val = positive_nan<ValType>(); // "QNAN"
+      } //  void get_q
+
+      template<class ValType> void get_one_hash
+      ( // Get expected string after having read "1.#": "1.#IND", "1.#QNAN", "1.#SNAN".
+        InputIterator& it, InputIterator end, const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+
+        ++it;
+        switch(peek_char(it, end, ct))
+        {
+        case 'i': // from IND (indeterminate), considered same a QNAN.
+          get_one_hash_i(it, end, ct, state, val); // "1.#IND"
+          return;
+
+        case 'q': // from QNAN
+        case 's': // from SNAN - treated the same as QNAN.
+          if(std::numeric_limits<ValType>::has_quiet_NaN
+            && !(flags_ & trap_nan))
+          {
+            ++it;
+            if(match_string(it, end, ct, "nan"))
+            { // "1.#QNAN", "1.#SNAN"
+ //             ++it; // removed as caused assert() cannot increment iterator).
+// (match_string consumes string, so not needed?).
+// https://svn.boost.org/trac/boost/ticket/5467
+// Change in nonfinite_num_facet.hpp Paul A. Bristow 11 Apr 11 makes legacy_test.cpp work OK.
+              val = positive_nan<ValType>(); // "1.#QNAN"
+              return;
+            }
+          }
+          break;
+
+        default:
+          break;
+        }
+
+        state |= std::ios_base::failbit;
+      } //  void get_one_hash
+
+      template<class ValType> void get_one_hash_i
+      ( // Get expected strings after 'i', "1.#INF", 1.#IND".
+        InputIterator& it, InputIterator end, const std::ctype<CharType>& ct,
+        std::ios_base::iostate& state, ValType& val
+      ) const
+      {
+        ++it;
+
+        if(peek_char(it, end, ct) == 'n')
+        {
+          ++it;
+          switch(peek_char(it, end, ct))
+          {
+          case 'f':  // "1.#INF"
+            if(std::numeric_limits<ValType>::has_infinity
+              && !(flags_ & trap_infinity))
+            {
+                ++it;
+                val = std::numeric_limits<ValType>::infinity();
+                return;
+            }
+            break;
+
+          case 'd':   // 1.#IND"
+            if(std::numeric_limits<ValType>::has_quiet_NaN
+              && !(flags_ & trap_nan))
+            {
+                ++it;
+                val = positive_nan<ValType>();
+                return;
+            }
+            break;
+
+          default:
+            break;
+          }
+        }
+
+        state |= std::ios_base::failbit;
+      } //  void get_one_hash_i
+
+      //..........................................................................
+
+      char peek_char
+      ( //! \return next char in the input buffer, ensuring lowercase (but do not 'consume' char).
+        InputIterator& it, InputIterator end,
+        const std::ctype<CharType>& ct
+      ) const
+      {
+        if(it == end) return 0;
+        return ct.narrow(ct.tolower(*it), 0); // Always tolower to ensure case insensitive.
+      }
+
+      bool match_string
+      ( //! Match remaining chars to expected string (case insensitive),
+        //! consuming chars that match OK.
+        //! \return true if matched expected string, else false.
+        InputIterator& it, InputIterator end,
+        const std::ctype<CharType>& ct,
+        const char* s
+      ) const
+      {
+        while(it != end && *s && *s == ct.narrow(ct.tolower(*it), 0))
+        {
+          ++s;
+          ++it; //
+        }
+        return !*s;
+      } // bool match_string
+
+    private:
+      const int flags_;
+    }; //
+
+    //------------------------------------------------------------------------------
+
+  }   // namespace math
+}   // namespace boost
+
+#ifdef _MSC_VER
+#   pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_NONFINITE_NUM_FACETS_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/owens_t.hpp b/gatb-core/thirdparty/boost/math/special_functions/owens_t.hpp
new file mode 100644
index 0000000..6de93a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/owens_t.hpp
@@ -0,0 +1,1071 @@
+// Copyright Benjamin Sobotta 2012
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_OWENS_T_HPP
+#define BOOST_OWENS_T_HPP
+
+// Reference:
+// Mike Patefield, David Tandy
+// FAST AND ACCURATE CALCULATION OF OWEN'S T-FUNCTION
+// Journal of Statistical Software, 5 (5), 1-25
+
+#ifdef _MSC_VER
+#  pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/special_functions/erf.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/assert.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/tools/big_constant.hpp>
+
+#include <stdexcept>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
+namespace boost
+{
+   namespace math
+   {
+      namespace detail
+      {
+         // owens_t_znorm1(x) = P(-oo<Z<=x)-0.5 with Z being normally distributed.
+         template<typename RealType>
+         inline RealType owens_t_znorm1(const RealType x)
+         {
+            using namespace boost::math::constants;
+            return erf(x*one_div_root_two<RealType>())*half<RealType>();
+         } // RealType owens_t_znorm1(const RealType x)
+
+         // owens_t_znorm2(x) = P(x<=Z<oo) with Z being normally distributed.
+         template<typename RealType>
+         inline RealType owens_t_znorm2(const RealType x)
+         {
+            using namespace boost::math::constants;
+            return erfc(x*one_div_root_two<RealType>())*half<RealType>();
+         } // RealType owens_t_znorm2(const RealType x)
+
+         // Auxiliary function, it computes an array key that is used to determine
+         // the specific computation method for Owen's T and the order thereof
+         // used in owens_t_dispatch.
+         template<typename RealType>
+         inline unsigned short owens_t_compute_code(const RealType h, const RealType a)
+         {
+            static const RealType hrange[] =
+            {0.02, 0.06, 0.09, 0.125, 0.26, 0.4,  0.6,  1.6,  1.7,  2.33,  2.4,  3.36, 3.4,  4.8};
+
+            static const RealType arange[] = {0.025, 0.09, 0.15, 0.36, 0.5, 0.9, 0.99999};
+            /*
+            original select array from paper:
+            1, 1, 2,13,13,13,13,13,13,13,13,16,16,16, 9
+            1, 2, 2, 3, 3, 5, 5,14,14,15,15,16,16,16, 9
+            2, 2, 3, 3, 3, 5, 5,15,15,15,15,16,16,16,10
+            2, 2, 3, 5, 5, 5, 5, 7, 7,16,16,16,16,16,10
+            2, 3, 3, 5, 5, 6, 6, 8, 8,17,17,17,12,12,11
+            2, 3, 5, 5, 5, 6, 6, 8, 8,17,17,17,12,12,12
+            2, 3, 4, 4, 6, 6, 8, 8,17,17,17,17,17,12,12
+            2, 3, 4, 4, 6, 6,18,18,18,18,17,17,17,12,12
+            */                  
+            // subtract one because the array is written in FORTRAN in mind - in C arrays start @ zero
+            static const unsigned short select[] =
+            {
+               0,    0 ,   1  , 12   ,12 ,  12  , 12  , 12 ,  12  , 12  , 12  , 15  , 15 ,  15  ,  8,
+               0  ,  1  ,  1   , 2 ,   2   , 4  ,  4  , 13 ,  13  , 14  , 14 ,  15  , 15  , 15  ,  8,
+               1  ,  1   , 2 ,   2  ,  2  ,  4   , 4  , 14  , 14 ,  14  , 14 ,  15  , 15 ,  15  ,  9,
+               1  ,  1   , 2 ,   4  ,  4  ,  4   , 4  ,  6  ,  6 ,  15  , 15 ,  15 ,  15 ,  15  ,  9,
+               1  ,  2   , 2  ,  4  ,  4  ,  5   , 5  ,  7  ,  7  , 16   ,16 ,  16 ,  11 ,  11 ,  10,
+               1  ,  2   , 4  ,  4   , 4  ,  5   , 5  ,  7  ,  7  , 16  , 16 ,  16 ,  11  , 11 ,  11,
+               1  ,  2   , 3  ,  3  ,  5  ,  5   , 7  ,  7  , 16 ,  16  , 16 ,  16 ,  16  , 11 ,  11,
+               1  ,  2   , 3   , 3   , 5  ,  5 ,  17  , 17  , 17 ,  17  , 16 ,  16 ,  16 ,  11 ,  11
+            };
+
+            unsigned short ihint = 14, iaint = 7;
+            for(unsigned short i = 0; i != 14; i++)
+            {
+               if( h <= hrange[i] )
+               {
+                  ihint = i;
+                  break;
+               }
+            } // for(unsigned short i = 0; i != 14; i++)
+
+            for(unsigned short i = 0; i != 7; i++)
+            {
+               if( a <= arange[i] )
+               {
+                  iaint = i;
+                  break;
+               }
+            } // for(unsigned short i = 0; i != 7; i++)
+
+            // interprete select array as 8x15 matrix
+            return select[iaint*15 + ihint];
+
+         } // unsigned short owens_t_compute_code(const RealType h, const RealType a)
+
+         template<typename RealType>
+         inline unsigned short owens_t_get_order_imp(const unsigned short icode, RealType, const mpl::int_<53>&)
+         {
+            static const unsigned short ord[] = {2, 3, 4, 5, 7, 10, 12, 18, 10, 20, 30, 0, 4, 7, 8, 20, 0, 0}; // 18 entries
+
+            BOOST_ASSERT(icode<18);
+
+            return ord[icode];
+         } // unsigned short owens_t_get_order(const unsigned short icode, RealType, mpl::int<53> const&)
+
+         template<typename RealType>
+         inline unsigned short owens_t_get_order_imp(const unsigned short icode, RealType, const mpl::int_<64>&)
+        {
+           // method ================>>>       {1, 1, 1, 1, 1,  1,  1,  1,  2,  2,  2,  3, 4,  4,  4,  4,  5, 6}
+           static const unsigned short ord[] = {3, 4, 5, 6, 8, 11, 13, 19, 10, 20, 30,  0, 7, 10, 11, 23,  0, 0}; // 18 entries
+
+          BOOST_ASSERT(icode<18);
+
+          return ord[icode];
+        } // unsigned short owens_t_get_order(const unsigned short icode, RealType, mpl::int<64> const&)
+
+         template<typename RealType, typename Policy>
+         inline unsigned short owens_t_get_order(const unsigned short icode, RealType r, const Policy&)
+         {
+            typedef typename policies::precision<RealType, Policy>::type precision_type;
+            typedef typename mpl::if_<
+               mpl::or_<
+                  mpl::less_equal<precision_type, mpl::int_<0> >,
+                  mpl::greater<precision_type, mpl::int_<53> >
+               >,
+               mpl::int_<64>,
+               mpl::int_<53>
+            >::type tag_type;
+
+            return owens_t_get_order_imp(icode, r, tag_type());
+         }
+
+         // compute the value of Owen's T function with method T1 from the reference paper
+         template<typename RealType, typename Policy>
+         inline RealType owens_t_T1(const RealType h, const RealType a, const unsigned short m, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const RealType hs = -h*h*half<RealType>();
+            const RealType dhs = exp( hs );
+            const RealType as = a*a;
+
+            unsigned short j=1;
+            RealType jj = 1;
+            RealType aj = a * one_div_two_pi<RealType>();
+            RealType dj = boost::math::expm1( hs, pol);
+            RealType gj = hs*dhs;
+
+            RealType val = atan( a ) * one_div_two_pi<RealType>();
+
+            while( true )
+            {
+               val += dj*aj/jj;
+
+               if( m <= j )
+                  break;
+
+               j++;
+               jj += static_cast<RealType>(2);
+               aj *= as;
+               dj = gj - dj;
+               gj *= hs / static_cast<RealType>(j);
+            } // while( true )
+
+            return val;
+         } // RealType owens_t_T1(const RealType h, const RealType a, const unsigned short m)
+
+         // compute the value of Owen's T function with method T2 from the reference paper
+         template<typename RealType, class Policy>
+         inline RealType owens_t_T2(const RealType h, const RealType a, const unsigned short m, const RealType ah, const Policy&, const mpl::false_&)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const unsigned short maxii = m+m+1;
+            const RealType hs = h*h;
+            const RealType as = -a*a;
+            const RealType y = static_cast<RealType>(1) / hs;
+
+            unsigned short ii = 1;
+            RealType val = 0;
+            RealType vi = a * exp( -ah*ah*half<RealType>() ) * one_div_root_two_pi<RealType>();
+            RealType z = owens_t_znorm1(ah)/h;
+
+            while( true )
+            {
+               val += z;
+               if( maxii <= ii )
+               {
+                  val *= exp( -hs*half<RealType>() ) * one_div_root_two_pi<RealType>();
+                  break;
+               } // if( maxii <= ii )
+               z = y * ( vi - static_cast<RealType>(ii) * z );
+               vi *= as;
+               ii += 2;
+            } // while( true )
+
+            return val;
+         } // RealType owens_t_T2(const RealType h, const RealType a, const unsigned short m, const RealType ah)
+
+         // compute the value of Owen's T function with method T3 from the reference paper
+         template<typename RealType>
+         inline RealType owens_t_T3_imp(const RealType h, const RealType a, const RealType ah, const mpl::int_<53>&)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+      const unsigned short m = 20;
+
+            static const RealType c2[] =
+            {
+               0.99999999999999987510,
+               -0.99999999999988796462,      0.99999999998290743652,
+               -0.99999999896282500134,      0.99999996660459362918,
+               -0.99999933986272476760,      0.99999125611136965852,
+               -0.99991777624463387686,      0.99942835555870132569,
+               -0.99697311720723000295,      0.98751448037275303682,
+               -0.95915857980572882813,      0.89246305511006708555,
+               -0.76893425990463999675,      0.58893528468484693250,
+               -0.38380345160440256652,      0.20317601701045299653,
+               -0.82813631607004984866E-01,  0.24167984735759576523E-01,
+               -0.44676566663971825242E-02,  0.39141169402373836468E-03
+            };
+
+            const RealType as = a*a;
+            const RealType hs = h*h;
+            const RealType y = static_cast<RealType>(1)/hs;
+
+            RealType ii = 1;
+            unsigned short i = 0;
+            RealType vi = a * exp( -ah*ah*half<RealType>() ) * one_div_root_two_pi<RealType>();
+            RealType zi = owens_t_znorm1(ah)/h;
+            RealType val = 0;
+
+            while( true )
+            {
+               BOOST_ASSERT(i < 21);
+               val += zi*c2[i];
+               if( m <= i ) // if( m < i+1 )
+               {
+                  val *= exp( -hs*half<RealType>() ) * one_div_root_two_pi<RealType>();
+                  break;
+               } // if( m < i )
+               zi = y * (ii*zi - vi);
+               vi *= as;
+               ii += 2;
+               i++;
+            } // while( true )
+
+            return val;
+         } // RealType owens_t_T3(const RealType h, const RealType a, const RealType ah)
+
+        // compute the value of Owen's T function with method T3 from the reference paper
+        template<class RealType>
+        inline RealType owens_t_T3_imp(const RealType h, const RealType a, const RealType ah, const mpl::int_<64>&)
+        {
+          BOOST_MATH_STD_USING
+          using namespace boost::math::constants;
+          
+          const unsigned short m = 30;
+
+          static const RealType c2[] =
+          {
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.99999999999999999999999729978162447266851932041876728736094298092917625009873),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.99999999999999999999467056379678391810626533251885323416799874878563998732905968),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.99999999999999999824849349313270659391127814689133077036298754586814091034842536),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.9999999999999997703859616213643405880166422891953033591551179153879839440241685),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.99999999999998394883415238173334565554173013941245103172035286759201504179038147),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.9999999999993063616095509371081203145247992197457263066869044528823599399470977),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.9999999999797336340409464429599229870590160411238245275855903767652432017766116267),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.999999999574958412069046680119051639753412378037565521359444170241346845522403274),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.9999999933226234193375324943920160947158239076786103108097456617750134812033362048),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.9999999188923242461073033481053037468263536806742737922476636768006622772762168467),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.9999992195143483674402853783549420883055129680082932629160081128947764415749728967),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.999993935137206712830997921913316971472227199741857386575097250553105958772041501),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.99996135597690552745362392866517133091672395614263398912807169603795088421057688716),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.99979556366513946026406788969630293820987757758641211293079784585126692672425362469),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.999092789629617100153486251423850590051366661947344315423226082520411961968929483),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.996593837411918202119308620432614600338157335862888580671450938858935084316004769854),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.98910017138386127038463510314625339359073956513420458166238478926511821146316469589567),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.970078558040693314521331982203762771512160168582494513347846407314584943870399016019),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.92911438683263187495758525500033707204091967947532160289872782771388170647150321633673),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.8542058695956156057286980736842905011429254735181323743367879525470479126968822863),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.73796526033030091233118357742803709382964420335559408722681794195743240930748630755),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.58523469882837394570128599003785154144164680587615878645171632791404210655891158),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.415997776145676306165661663581868460503874205343014196580122174949645271353372263),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.2588210875241943574388730510317252236407805082485246378222935376279663808416534365),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.1375535825163892648504646951500265585055789019410617565727090346559210218472356689),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.0607952766325955730493900985022020434830339794955745989150270485056436844239206648),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.0216337683299871528059836483840390514275488679530797294557060229266785853764115),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -0.00593405693455186729876995814181203900550014220428843483927218267309209471516256),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 0.0011743414818332946510474576182739210553333860106811865963485870668929503649964142),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, -1.489155613350368934073453260689881330166342484405529981510694514036264969925132e-4),
+             BOOST_MATH_BIG_CONSTANT(RealType, 260, 9.072354320794357587710929507988814669454281514268844884841547607134260303118208e-6)
+          };
+
+          const RealType as = a*a;
+          const RealType hs = h*h;
+          const RealType y = 1 / hs;
+
+          RealType ii = 1;
+          unsigned short i = 0;
+          RealType vi = a * exp( -ah*ah*half<RealType>() ) * one_div_root_two_pi<RealType>();
+          RealType zi = owens_t_znorm1(ah)/h;
+          RealType val = 0;
+
+          while( true )
+          {
+              BOOST_ASSERT(i < 31);
+              val += zi*c2[i];
+              if( m <= i ) // if( m < i+1 )
+              {
+                val *= exp( -hs*half<RealType>() ) * one_div_root_two_pi<RealType>();
+                break;
+              } // if( m < i )
+              zi = y * (ii*zi - vi);
+              vi *= as;
+              ii += 2;
+              i++;
+          } // while( true )
+
+          return val;
+        } // RealType owens_t_T3(const RealType h, const RealType a, const RealType ah)
+
+        template<class RealType, class Policy>
+        inline RealType owens_t_T3(const RealType h, const RealType a, const RealType ah, const Policy&)
+        {
+            typedef typename policies::precision<RealType, Policy>::type precision_type;
+            typedef typename mpl::if_<
+               mpl::or_<
+                  mpl::less_equal<precision_type, mpl::int_<0> >,
+                  mpl::greater<precision_type, mpl::int_<53> >
+               >,
+               mpl::int_<64>,
+               mpl::int_<53>
+            >::type tag_type;
+
+            return owens_t_T3_imp(h, a, ah, tag_type());
+        }
+
+         // compute the value of Owen's T function with method T4 from the reference paper
+         template<typename RealType>
+         inline RealType owens_t_T4(const RealType h, const RealType a, const unsigned short m)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const unsigned short maxii = m+m+1;
+            const RealType hs = h*h;
+            const RealType as = -a*a;
+
+            unsigned short ii = 1;
+            RealType ai = a * exp( -hs*(static_cast<RealType>(1)-as)*half<RealType>() ) * one_div_two_pi<RealType>();
+            RealType yi = 1;
+            RealType val = 0;
+
+            while( true )
+            {
+               val += ai*yi;
+               if( maxii <= ii )
+                  break;
+               ii += 2;
+               yi = (static_cast<RealType>(1)-hs*yi) / static_cast<RealType>(ii);
+               ai *= as;
+            } // while( true )
+
+            return val;
+         } // RealType owens_t_T4(const RealType h, const RealType a, const unsigned short m)
+
+         // compute the value of Owen's T function with method T5 from the reference paper
+         template<typename RealType>
+         inline RealType owens_t_T5_imp(const RealType h, const RealType a, const mpl::int_<53>&)
+         {
+            BOOST_MATH_STD_USING
+            /*
+               NOTICE:
+               - The pts[] array contains the squares (!) of the abscissas, i.e. the roots of the Legendre
+                 polynomial P_n(x), instead of the plain roots as required in Gauss-Legendre
+                 quadrature, because T5(h,a,m) contains only x^2 terms.
+               - The wts[] array contains the weights for Gauss-Legendre quadrature scaled with a factor
+                 of 1/(2*pi) according to T5(h,a,m).
+             */
+
+            const unsigned short m = 13;
+            static const RealType pts[] = {0.35082039676451715489E-02,
+               0.31279042338030753740E-01,  0.85266826283219451090E-01,
+               0.16245071730812277011,      0.25851196049125434828,
+               0.36807553840697533536,      0.48501092905604697475,
+               0.60277514152618576821,      0.71477884217753226516,
+               0.81475510988760098605,      0.89711029755948965867,
+               0.95723808085944261843,      0.99178832974629703586};
+            static const RealType wts[] = { 0.18831438115323502887E-01,
+               0.18567086243977649478E-01,  0.18042093461223385584E-01,
+               0.17263829606398753364E-01,  0.16243219975989856730E-01,
+               0.14994592034116704829E-01,  0.13535474469662088392E-01,
+               0.11886351605820165233E-01,  0.10070377242777431897E-01,
+               0.81130545742299586629E-02,  0.60419009528470238773E-02,
+               0.38862217010742057883E-02,  0.16793031084546090448E-02};
+
+            const RealType as = a*a;
+            const RealType hs = -h*h*boost::math::constants::half<RealType>();
+
+            RealType val = 0;
+            for(unsigned short i = 0; i < m; ++i)
+            {
+               BOOST_ASSERT(i < 13);
+               const RealType r = static_cast<RealType>(1) + as*pts[i];
+               val += wts[i] * exp( hs*r ) / r;
+            } // for(unsigned short i = 0; i < m; ++i)
+
+            return val*a;
+         } // RealType owens_t_T5(const RealType h, const RealType a)
+
+        // compute the value of Owen's T function with method T5 from the reference paper
+        template<typename RealType>
+        inline RealType owens_t_T5_imp(const RealType h, const RealType a, const mpl::int_<64>&)
+        {
+          BOOST_MATH_STD_USING
+            /*
+              NOTICE:
+              - The pts[] array contains the squares (!) of the abscissas, i.e. the roots of the Legendre
+              polynomial P_n(x), instead of the plain roots as required in Gauss-Legendre
+              quadrature, because T5(h,a,m) contains only x^2 terms.
+              - The wts[] array contains the weights for Gauss-Legendre quadrature scaled with a factor
+              of 1/(2*pi) according to T5(h,a,m).
+            */
+
+          const unsigned short m = 19;
+          static const RealType pts[] = {
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0016634282895983227941),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.014904509242697054183),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.04103478879005817919),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.079359853513391511008),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.1288612130237615133),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.18822336642448518856),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.25586876186122962384),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.32999972011807857222),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.40864620815774761438),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.48971819306044782365),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.57106118513245543894),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.6505134942981533829),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.72596367859928091618),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.79540665919549865924),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.85699701386308739244),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.90909804422384697594),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.95032536436570154409),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.97958418733152273717),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.99610366384229088321)
+          };
+          static const RealType wts[] = {
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.012975111395684900835),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.012888764187499150078),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.012716644398857307844),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.012459897461364705691),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.012120231988292330388),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.011699908404856841158),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.011201723906897224448),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.010628993848522759853),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0099855296835573320047),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0092756136096132857933),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0085039700881139589055),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0076757344408814561254),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0067964187616556459109),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.005871875456524750363),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0049082589542498110071),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0039119870792519721409),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0028897090921170700834),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.0018483371329504443947),
+               BOOST_MATH_BIG_CONSTANT(RealType, 64, 0.00079623320100438873578)
+          };
+
+          const RealType as = a*a;
+          const RealType hs = -h*h*boost::math::constants::half<RealType>();
+
+          RealType val = 0;
+          for(unsigned short i = 0; i < m; ++i)
+            {
+              BOOST_ASSERT(i < 19);
+              const RealType r = 1 + as*pts[i];
+              val += wts[i] * exp( hs*r ) / r;
+            } // for(unsigned short i = 0; i < m; ++i)
+
+          return val*a;
+        } // RealType owens_t_T5(const RealType h, const RealType a)
+
+        template<class RealType, class Policy>
+        inline RealType owens_t_T5(const RealType h, const RealType a, const Policy&)
+        {
+            typedef typename policies::precision<RealType, Policy>::type precision_type;
+            typedef typename mpl::if_<
+               mpl::or_<
+                  mpl::less_equal<precision_type, mpl::int_<0> >,
+                  mpl::greater<precision_type, mpl::int_<53> >
+               >,
+               mpl::int_<64>,
+               mpl::int_<53>
+            >::type tag_type;
+
+            return owens_t_T5_imp(h, a, tag_type());
+        }
+
+
+         // compute the value of Owen's T function with method T6 from the reference paper
+         template<typename RealType>
+         inline RealType owens_t_T6(const RealType h, const RealType a)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const RealType normh = owens_t_znorm2( h );
+            const RealType y = static_cast<RealType>(1) - a;
+            const RealType r = atan2(y, static_cast<RealType>(1 + a) );
+
+            RealType val = normh * ( static_cast<RealType>(1) - normh ) * half<RealType>();
+
+            if( r != 0 )
+               val -= r * exp( -y*h*h*half<RealType>()/r ) * one_div_two_pi<RealType>();
+
+            return val;
+         } // RealType owens_t_T6(const RealType h, const RealType a, const unsigned short m)
+
+         template <class T, class Policy>
+         std::pair<T, T> owens_t_T1_accelerated(T h, T a, const Policy& pol)
+         {
+            //
+            // This is the same series as T1, but:
+            // * The Taylor series for atan has been combined with that for T1, 
+            //   reducing but not eliminating cancellation error.
+            // * The resulting alternating series is then accelerated using method 1
+            //   from H. Cohen, F. Rodriguez Villegas, D. Zagier, 
+            //   "Convergence acceleration of alternating series", Bonn, (1991).
+            //
+            BOOST_MATH_STD_USING
+            static const char* function = "boost::math::owens_t<%1%>(%1%, %1%)";
+            T half_h_h = h * h / 2;
+            T a_pow = a;
+            T aa = a * a;
+            T exp_term = exp(-h * h / 2);
+            T one_minus_dj_sum = exp_term; 
+            T sum = a_pow * exp_term;
+            T dj_pow = exp_term;
+            T term = sum;
+            T abs_err;
+            int j = 1;
+
+            //
+            // Normally with this form of series acceleration we can calculate
+            // up front how many terms will be required - based on the assumption
+            // that each term decreases in size by a factor of 3.  However,
+            // that assumption does not apply here, as the underlying T1 series can 
+            // go quite strongly divergent in the early terms, before strongly
+            // converging later.  Various "guestimates" have been tried to take account
+            // of this, but they don't always work.... so instead set "n" to the 
+            // largest value that won't cause overflow later, and abort iteration
+            // when the last accelerated term was small enough...
+            //
+            int n;
+            try
+            {
+               n = itrunc(T(tools::log_max_value<T>() / 6));
+            }
+            catch(...)
+            {
+               n = (std::numeric_limits<int>::max)();
+            }
+            n = (std::min)(n, 1500);
+            T d = pow(3 + sqrt(T(8)), n);
+            d = (d + 1 / d) / 2;
+            T b = -1;
+            T c = -d;
+            c = b - c;
+            sum *= c;
+            b = -n * n * b * 2;
+            abs_err = ldexp(fabs(sum), -tools::digits<T>());
+
+            while(j < n)
+            {
+               a_pow *= aa;
+               dj_pow *= half_h_h / j;
+               one_minus_dj_sum += dj_pow;
+               term = one_minus_dj_sum * a_pow / (2 * j + 1);
+               c = b - c;
+               sum += c * term;
+               abs_err += ldexp((std::max)(T(fabs(sum)), T(fabs(c*term))), -tools::digits<T>());
+               b = (j + n) * (j - n) * b / ((j + T(0.5)) * (j + 1));
+               ++j;
+               //
+               // Include an escape route to prevent calculating too many terms:
+               //
+               if((j > 10) && (fabs(sum * tools::epsilon<T>()) > fabs(c * term)))
+                  break;
+            }
+            abs_err += fabs(c * term);
+            if(sum < 0)  // sum must always be positive, if it's negative something really bad has happend:
+               policies::raise_evaluation_error(function, 0, T(0), pol);
+            return std::pair<T, T>((sum / d) / boost::math::constants::two_pi<T>(), abs_err / sum);
+         }
+
+         template<typename RealType, class Policy>
+         inline RealType owens_t_T2(const RealType h, const RealType a, const unsigned short m, const RealType ah, const Policy&, const mpl::true_&)
+         {
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const unsigned short maxii = m+m+1;
+            const RealType hs = h*h;
+            const RealType as = -a*a;
+            const RealType y = static_cast<RealType>(1) / hs;
+
+            unsigned short ii = 1;
+            RealType val = 0;
+            RealType vi = a * exp( -ah*ah*half<RealType>() ) / root_two_pi<RealType>();
+            RealType z = owens_t_znorm1(ah)/h;
+            RealType last_z = fabs(z);
+            RealType lim = policies::get_epsilon<RealType, Policy>();
+
+            while( true )
+            {
+               val += z;
+               //
+               // This series stops converging after a while, so put a limit
+               // on how far we go before returning our best guess:
+               //
+               if((fabs(lim * val) > fabs(z)) || ((ii > maxii) && (fabs(z) > last_z)) || (z == 0))
+               {
+                  val *= exp( -hs*half<RealType>() ) / root_two_pi<RealType>();
+                  break;
+               } // if( maxii <= ii )
+               last_z = fabs(z);
+               z = y * ( vi - static_cast<RealType>(ii) * z );
+               vi *= as;
+               ii += 2;
+            } // while( true )
+
+            return val;
+         } // RealType owens_t_T2(const RealType h, const RealType a, const unsigned short m, const RealType ah)
+
+         template<typename RealType, class Policy>
+         inline std::pair<RealType, RealType> owens_t_T2_accelerated(const RealType h, const RealType a, const RealType ah, const Policy&)
+         {
+            //
+            // This is the same series as T2, but with acceleration applied.
+            // Note that we have to be *very* careful to check that nothing bad
+            // has happened during evaluation - this series will go divergent
+            // and/or fail to alternate at a drop of a hat! :-(
+            //
+            BOOST_MATH_STD_USING
+            using namespace boost::math::constants;
+
+            const RealType hs = h*h;
+            const RealType as = -a*a;
+            const RealType y = static_cast<RealType>(1) / hs;
+
+            unsigned short ii = 1;
+            RealType val = 0;
+            RealType vi = a * exp( -ah*ah*half<RealType>() ) / root_two_pi<RealType>();
+            RealType z = boost::math::detail::owens_t_znorm1(ah)/h;
+            RealType last_z = fabs(z);
+
+            //
+            // Normally with this form of series acceleration we can calculate
+            // up front how many terms will be required - based on the assumption
+            // that each term decreases in size by a factor of 3.  However,
+            // that assumption does not apply here, as the underlying T1 series can 
+            // go quite strongly divergent in the early terms, before strongly
+            // converging later.  Various "guestimates" have been tried to take account
+            // of this, but they don't always work.... so instead set "n" to the 
+            // largest value that won't cause overflow later, and abort iteration
+            // when the last accelerated term was small enough...
+            //
+            int n;
+            try
+            {
+               n = itrunc(RealType(tools::log_max_value<RealType>() / 6));
+            }
+            catch(...)
+            {
+               n = (std::numeric_limits<int>::max)();
+            }
+            n = (std::min)(n, 1500);
+            RealType d = pow(3 + sqrt(RealType(8)), n);
+            d = (d + 1 / d) / 2;
+            RealType b = -1;
+            RealType c = -d;
+            int s = 1;
+
+            for(int k = 0; k < n; ++k)
+            {
+               //
+               // Check for both convergence and whether the series has gone bad:
+               //
+               if(
+                  (fabs(z) > last_z)     // Series has gone divergent, abort
+                  || (fabs(val) * tools::epsilon<RealType>() > fabs(c * s * z))  // Convergence!
+                  || (z * s < 0)         // Series has stopped alternating - all bets are off - abort.
+                  )
+               {
+                  break;
+               }
+               c = b - c;
+               val += c * s * z;
+               b = (k + n) * (k - n) * b / ((k + RealType(0.5)) * (k + 1));
+               last_z = fabs(z);
+               s = -s;
+               z = y * ( vi - static_cast<RealType>(ii) * z );
+               vi *= as;
+               ii += 2;
+            } // while( true )
+            RealType err = fabs(c * z) / val;
+            return std::pair<RealType, RealType>(val * exp( -hs*half<RealType>() ) / (d * root_two_pi<RealType>()), err);
+         } // RealType owens_t_T2_accelerated(const RealType h, const RealType a, const RealType ah, const Policy&)
+
+         template<typename RealType, typename Policy>
+         inline RealType T4_mp(const RealType h, const RealType a, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            
+            const RealType hs = h*h;
+            const RealType as = -a*a;
+
+            unsigned short ii = 1;
+            RealType ai = constants::one_div_two_pi<RealType>() * a * exp( -0.5*hs*(1.0-as) );
+            RealType yi = 1.0;
+            RealType val = 0.0;
+
+            RealType lim = boost::math::policies::get_epsilon<RealType, Policy>();
+
+            while( true )
+            {
+               RealType term = ai*yi;
+               val += term;
+               if((yi != 0) && (fabs(val * lim) > fabs(term)))
+                  break;
+               ii += 2;
+               yi = (1.0-hs*yi) / static_cast<RealType>(ii);
+               ai *= as;
+               if(ii > (std::min)(1500, (int)policies::get_max_series_iterations<Policy>()))
+                  policies::raise_evaluation_error("boost::math::owens_t<%1%>", 0, val, pol);
+            } // while( true )
+
+            return val;
+         } // arg_type owens_t_T4(const arg_type h, const arg_type a, const unsigned short m)
+
+
+         // This routine dispatches the call to one of six subroutines, depending on the values
+         // of h and a.
+         // preconditions: h >= 0, 0<=a<=1, ah=a*h
+         //
+         // Note there are different versions for different precisions....
+         template<typename RealType, typename Policy>
+         inline RealType owens_t_dispatch(const RealType h, const RealType a, const RealType ah, const Policy& pol, mpl::int_<64> const&)
+         {
+            // Simple main case for 64-bit precision or less, this is as per the Patefield-Tandy paper:
+            BOOST_MATH_STD_USING
+            //
+            // Handle some special cases first, these are from
+            // page 1077 of Owen's original paper:
+            //
+            if(h == 0)
+            {
+               return atan(a) * constants::one_div_two_pi<RealType>();
+            }
+            if(a == 0)
+            {
+               return 0;
+            }
+            if(a == 1)
+            {
+               return owens_t_znorm2(RealType(-h)) * owens_t_znorm2(h) / 2;
+            }
+            if(a >= tools::max_value<RealType>())
+            {
+               return owens_t_znorm2(RealType(fabs(h)));
+            }
+            RealType val = 0; // avoid compiler warnings, 0 will be overwritten in any case
+            const unsigned short icode = owens_t_compute_code(h, a);
+            const unsigned short m = owens_t_get_order(icode, val /* just a dummy for the type */, pol);
+            static const unsigned short meth[] = {1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 6}; // 18 entries
+
+            // determine the appropriate method, T1 ... T6
+            switch( meth[icode] )
+            {
+            case 1: // T1
+               val = owens_t_T1(h,a,m,pol);
+               break;
+            case 2: // T2
+               typedef typename policies::precision<RealType, Policy>::type precision_type;
+               typedef mpl::bool_<(precision_type::value == 0) || (precision_type::value > 64)> tag_type;
+               val = owens_t_T2(h, a, m, ah, pol, tag_type());
+               break;
+            case 3: // T3
+               val = owens_t_T3(h,a,ah, pol);
+               break;
+            case 4: // T4
+               val = owens_t_T4(h,a,m);
+               break;
+            case 5: // T5
+               val = owens_t_T5(h,a, pol);
+               break;
+            case 6: // T6
+               val = owens_t_T6(h,a);
+               break;
+            default:
+               BOOST_THROW_EXCEPTION(std::logic_error("selection routine in Owen's T function failed"));
+            }
+            return val;
+         }
+
+         template<typename RealType, typename Policy>
+         inline RealType owens_t_dispatch(const RealType h, const RealType a, const RealType ah, const Policy& pol, const mpl::int_<65>&)
+         {
+            // Arbitrary precision version:
+            BOOST_MATH_STD_USING
+            //
+            // Handle some special cases first, these are from
+            // page 1077 of Owen's original paper:
+            //
+            if(h == 0)
+            {
+               return atan(a) * constants::one_div_two_pi<RealType>();
+            }
+            if(a == 0)
+            {
+               return 0;
+            }
+            if(a == 1)
+            {
+               return owens_t_znorm2(RealType(-h)) * owens_t_znorm2(h) / 2;
+            }
+            if(a >= tools::max_value<RealType>())
+            {
+               return owens_t_znorm2(RealType(fabs(h)));
+            }
+            // Attempt arbitrary precision code, this will throw if it goes wrong:
+            typedef typename boost::math::policies::normalise<Policy, boost::math::policies::evaluation_error<> >::type forwarding_policy;
+            std::pair<RealType, RealType> p1(0, tools::max_value<RealType>()), p2(0, tools::max_value<RealType>());
+            RealType target_precision = policies::get_epsilon<RealType, Policy>() * 1000;
+            bool have_t1(false), have_t2(false);
+            if(ah < 3)
+            {
+               try
+               {
+                  have_t1 = true;
+                  p1 = owens_t_T1_accelerated(h, a, forwarding_policy());
+                  if(p1.second < target_precision)
+                     return p1.first;
+               }
+               catch(const boost::math::evaluation_error&){}  // T1 may fail and throw, that's OK
+            }
+            if(ah > 1)
+            {
+               try
+               {
+                  have_t2 = true;
+                  p2 = owens_t_T2_accelerated(h, a, ah, forwarding_policy());
+                  if(p2.second < target_precision)
+                     return p2.first;
+               }
+               catch(const boost::math::evaluation_error&){}  // T2 may fail and throw, that's OK
+            }
+            //
+            // If we haven't tried T1 yet, do it now - sometimes it succeeds and the number of iterations
+            // is fairly low compared to T4.
+            //
+            if(!have_t1)
+            {
+               try
+               {
+                  have_t1 = true;
+                  p1 = owens_t_T1_accelerated(h, a, forwarding_policy());
+                  if(p1.second < target_precision)
+                     return p1.first;
+               }
+               catch(const boost::math::evaluation_error&){}  // T1 may fail and throw, that's OK
+            }
+            //
+            // If we haven't tried T2 yet, do it now - sometimes it succeeds and the number of iterations
+            // is fairly low compared to T4.
+            //
+            if(!have_t2)
+            {
+               try
+               {
+                  have_t2 = true;
+                  p2 = owens_t_T2_accelerated(h, a, ah, forwarding_policy());
+                  if(p2.second < target_precision)
+                     return p2.first;
+               }
+               catch(const boost::math::evaluation_error&){}  // T2 may fail and throw, that's OK
+            }
+            //
+            // OK, nothing left to do but try the most expensive option which is T4,
+            // this is often slow to converge, but when it does converge it tends to
+            // be accurate:
+            try
+            {
+               return T4_mp(h, a, pol);
+            }
+            catch(const boost::math::evaluation_error&){}  // T4 may fail and throw, that's OK
+            //
+            // Now look back at the results from T1 and T2 and see if either gave better
+            // results than we could get from the 64-bit precision versions.
+            //
+            if((std::min)(p1.second, p2.second) < 1e-20)
+            {
+               return p1.second < p2.second ? p1.first : p2.first;
+            }
+            //
+            // We give up - no arbitrary precision versions succeeded!
+            //
+            return owens_t_dispatch(h, a, ah, pol, mpl::int_<64>());
+         } // RealType owens_t_dispatch(RealType h, RealType a, RealType ah)
+         template<typename RealType, typename Policy>
+         inline RealType owens_t_dispatch(const RealType h, const RealType a, const RealType ah, const Policy& pol, const mpl::int_<0>&)
+         {
+            // We don't know what the precision is until runtime:
+            if(tools::digits<RealType>() <= 64)
+               return owens_t_dispatch(h, a, ah, pol, mpl::int_<64>());
+            return owens_t_dispatch(h, a, ah, pol, mpl::int_<65>());
+         }
+         template<typename RealType, typename Policy>
+         inline RealType owens_t_dispatch(const RealType h, const RealType a, const RealType ah, const Policy& pol)
+         {
+            // Figure out the precision and forward to the correct version:
+            typedef typename policies::precision<RealType, Policy>::type precision_type;
+            typedef typename mpl::if_c<
+               precision_type::value == 0,
+               mpl::int_<0>,
+               typename mpl::if_c<
+                  precision_type::value <= 64,
+                  mpl::int_<64>,
+                  mpl::int_<65>
+               >::type
+            >::type tag_type;
+            return owens_t_dispatch(h, a, ah, pol, tag_type());
+         }
+         // compute Owen's T function, T(h,a), for arbitrary values of h and a
+         template<typename RealType, class Policy>
+         inline RealType owens_t(RealType h, RealType a, const Policy& pol)
+         {
+            BOOST_MATH_STD_USING
+            // exploit that T(-h,a) == T(h,a)
+            h = fabs(h);
+
+            // Use equation (2) in the paper to remap the arguments
+            // such that h>=0 and 0<=a<=1 for the call of the actual
+            // computation routine.
+
+            const RealType fabs_a = fabs(a);
+            const RealType fabs_ah = fabs_a*h;
+
+            RealType val = 0.0; // avoid compiler warnings, 0.0 will be overwritten in any case
+
+            if(fabs_a <= 1)
+            {
+               val = owens_t_dispatch(h, fabs_a, fabs_ah, pol);
+            } // if(fabs_a <= 1.0)
+            else 
+            {
+               if( h <= 0.67 )
+               {
+                  const RealType normh = owens_t_znorm1(h);
+                  const RealType normah = owens_t_znorm1(fabs_ah);
+                  val = static_cast<RealType>(1)/static_cast<RealType>(4) - normh*normah -
+                     owens_t_dispatch(fabs_ah, static_cast<RealType>(1 / fabs_a), h, pol);
+               } // if( h <= 0.67 )
+               else
+               {
+                  const RealType normh = detail::owens_t_znorm2(h);
+                  const RealType normah = detail::owens_t_znorm2(fabs_ah);
+                  val = constants::half<RealType>()*(normh+normah) - normh*normah -
+                     owens_t_dispatch(fabs_ah, static_cast<RealType>(1 / fabs_a), h, pol);
+               } // else [if( h <= 0.67 )]
+            } // else [if(fabs_a <= 1)]
+
+            // exploit that T(h,-a) == -T(h,a)
+            if(a < 0)
+            {
+               return -val;
+            } // if(a < 0)
+
+            return val;
+         } // RealType owens_t(RealType h, RealType a)
+
+         template <class T, class Policy, class tag>
+         struct owens_t_initializer
+         {
+            struct init
+            {
+               init()
+               {
+                  do_init(tag());
+               }
+               template <int N>
+               static void do_init(const mpl::int_<N>&){}
+               static void do_init(const mpl::int_<64>&)
+               {
+                  boost::math::owens_t(static_cast<T>(7), static_cast<T>(0.96875), Policy());
+                  boost::math::owens_t(static_cast<T>(2), static_cast<T>(0.5), Policy());
+               }
+               void force_instantiate()const{}
+            };
+            static const init initializer;
+            static void force_instantiate()
+            {
+               initializer.force_instantiate();
+            }
+         };
+
+         template <class T, class Policy, class tag>
+         const typename owens_t_initializer<T, Policy, tag>::init owens_t_initializer<T, Policy, tag>::initializer;
+
+      } // namespace detail
+
+      template <class T1, class T2, class Policy>
+      inline typename tools::promote_args<T1, T2>::type owens_t(T1 h, T2 a, const Policy& pol)
+      {
+         typedef typename tools::promote_args<T1, T2>::type result_type;
+         typedef typename policies::evaluation<result_type, Policy>::type value_type;
+         typedef typename policies::precision<value_type, Policy>::type precision_type;
+         typedef typename mpl::if_c<
+               precision_type::value == 0,
+               mpl::int_<0>,
+               typename mpl::if_c<
+                  precision_type::value <= 64,
+                  mpl::int_<64>,
+                  mpl::int_<65>
+               >::type
+            >::type tag_type;
+
+         detail::owens_t_initializer<result_type, Policy, tag_type>::force_instantiate();
+            
+         return policies::checked_narrowing_cast<result_type, Policy>(detail::owens_t(static_cast<value_type>(h), static_cast<value_type>(a), pol), "boost::math::owens_t<%1%>(%1%,%1%)");
+      }
+
+      template <class T1, class T2>
+      inline typename tools::promote_args<T1, T2>::type owens_t(T1 h, T2 a)
+      {
+         return owens_t(h, a, policies::policy<>());
+      }
+
+
+   } // namespace math
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+// EOF
diff --git a/gatb-core/thirdparty/boost/math/special_functions/polygamma.hpp b/gatb-core/thirdparty/boost/math/special_functions/polygamma.hpp
new file mode 100644
index 0000000..6b7815d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/polygamma.hpp
@@ -0,0 +1,83 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2014 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_POLYGAMMA_2013_07_30_HPP_
+  #define _BOOST_POLYGAMMA_2013_07_30_HPP_
+
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/detail/polygamma.hpp>
+#include <boost/math/special_functions/trigamma.hpp>
+
+namespace boost { namespace math {
+
+  
+  template<class T, class Policy>
+  inline typename tools::promote_args<T>::type polygamma(const int n, T x, const Policy& pol)
+  {
+     //
+     // Filter off special cases right at the start:
+     //
+     if(n == 0)
+        return boost::math::digamma(x, pol);
+     if(n == 1)
+        return boost::math::trigamma(x, pol);
+     //
+     // We've found some standard library functions to misbehave if any FPU exception flags
+     // are set prior to their call, this code will clear those flags, then reset them
+     // on exit:
+     //
+     BOOST_FPU_EXCEPTION_GUARD
+     //
+     // The type of the result - the common type of T and U after
+     // any integer types have been promoted to double:
+     //
+     typedef typename tools::promote_args<T>::type result_type;
+     //
+     // The type used for the calculation.  This may be a wider type than
+     // the result in order to ensure full precision:
+     //
+     typedef typename policies::evaluation<result_type, Policy>::type value_type;
+     //
+     // The type of the policy to forward to the actual implementation.
+     // We disable promotion of float and double as that's [possibly]
+     // happened already in the line above.  Also reset to the default
+     // any policies we don't use (reduces code bloat if we're called
+     // multiple times with differing policies we don't actually use).
+     // Also normalise the type, again to reduce code bloat in case we're
+     // called multiple times with functionally identical policies that happen
+     // to be different types.
+     //
+     typedef typename policies::normalise<
+        Policy,
+        policies::promote_float<false>,
+        policies::promote_double<false>,
+        policies::discrete_quantile<>,
+        policies::assert_undefined<> >::type forwarding_policy;
+     //
+     // Whew.  Now we can make the actual call to the implementation.
+     // Arguments are explicitly cast to the evaluation type, and the result
+     // passed through checked_narrowing_cast which handles things like overflow
+     // according to the policy passed:
+     //
+     return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+        detail::polygamma_imp(n, static_cast<value_type>(x), forwarding_policy()),
+        "boost::math::polygamma<%1%>(int, %1%)");
+  }
+
+  template<class T>
+  inline typename tools::promote_args<T>::type polygamma(const int n, T x)
+  {
+      return boost::math::polygamma(n, x, policies::policy<>());
+  }
+
+} } // namespace boost::math
+
+#endif // _BOOST_BERNOULLI_2013_05_30_HPP_
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/pow.hpp b/gatb-core/thirdparty/boost/math/special_functions/pow.hpp
new file mode 100644
index 0000000..494f721
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/pow.hpp
@@ -0,0 +1,148 @@
+//   Boost pow.hpp header file
+//   Computes a power with exponent known at compile-time
+
+//  (C) Copyright Bruno Lalande 2008.
+//  Distributed under the Boost Software License, Version 1.0.
+//  (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+
+#ifndef BOOST_MATH_POW_HPP
+#define BOOST_MATH_POW_HPP
+
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/mpl/greater_equal.hpp>
+
+
+namespace boost {
+namespace math {
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4702) // Unreachable code, only triggered in release mode and /W4
+#endif
+
+namespace detail {
+
+
+template <int N, int M = N%2>
+struct positive_power
+{
+    template <typename T>
+    static T result(T base)
+    {
+        T power = positive_power<N/2>::result(base);
+        return power * power;
+    }
+};
+
+template <int N>
+struct positive_power<N, 1>
+{
+    template <typename T>
+    static T result(T base)
+    {
+        T power = positive_power<N/2>::result(base);
+        return base * power * power;
+    }
+};
+
+template <>
+struct positive_power<1, 1>
+{
+    template <typename T>
+    static T result(T base){ return base; }
+};
+
+
+template <int N, bool>
+struct power_if_positive
+{
+    template <typename T, class Policy>
+    static T result(T base, const Policy&)
+    { return positive_power<N>::result(base); }
+};
+
+template <int N>
+struct power_if_positive<N, false>
+{
+    template <typename T, class Policy>
+    static T result(T base, const Policy& policy)
+    {
+        if (base == 0)
+        {
+            return policies::raise_overflow_error<T>(
+                       "boost::math::pow(%1%)",
+                       "Attempted to compute a negative power of 0",
+                       policy
+                   );
+        }
+
+        return T(1) / positive_power<-N>::result(base);
+    }
+};
+
+template <>
+struct power_if_positive<0, true>
+{
+    template <typename T, class Policy>
+    static T result(T base, const Policy& policy)
+    {
+        if (base == 0)
+        {
+            return policies::raise_indeterminate_result_error<T>(
+                       "boost::math::pow(%1%)",
+                       "The result of pow<0>(%1%) is undetermined",
+                       base,
+                       T(1),
+                       policy
+                   );
+        }
+
+        return T(1);
+    }
+};
+
+
+template <int N>
+struct select_power_if_positive
+{
+    typedef typename mpl::greater_equal<
+                         mpl::int_<N>,
+                         mpl::int_<0>
+                     >::type is_positive;
+
+    typedef power_if_positive<N, is_positive::value> type;
+};
+
+
+}  // namespace detail
+
+
+template <int N, typename T, class Policy>
+inline typename tools::promote_args<T>::type pow(T base, const Policy& policy)
+{ 
+   typedef typename tools::promote_args<T>::type result_type;
+   return detail::select_power_if_positive<N>::type::result(static_cast<result_type>(base), policy); 
+}
+
+
+template <int N, typename T>
+inline typename tools::promote_args<T>::type pow(T base)
+{ return pow<N>(base, policies::policy<>()); }
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+}  // namespace math
+}  // namespace boost
+
+
+#endif
diff --git a/gatb-core/thirdparty/boost/math/special_functions/powm1.hpp b/gatb-core/thirdparty/boost/math/special_functions/powm1.hpp
new file mode 100644
index 0000000..f3af3d6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/powm1.hpp
@@ -0,0 +1,61 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_POWM1
+#define BOOST_MATH_POWM1
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+#include <boost/assert.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+inline T powm1_imp(const T a, const T z, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if((fabs(a) < 1) || (fabs(z) < 1))
+   {
+      T p = log(a) * z;
+      if(fabs(p) < 2)
+         return boost::math::expm1(p, pol);
+      // otherwise fall though:
+   }
+   return pow(a, z) - 1;
+}
+
+} // detail
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   powm1(const T1 a, const T2 z)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::powm1_imp(static_cast<result_type>(a), static_cast<result_type>(z), policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   powm1(const T1 a, const T2 z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   return detail::powm1_imp(static_cast<result_type>(a), static_cast<result_type>(z), pol);
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_POWM1
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/prime.hpp b/gatb-core/thirdparty/boost/math/special_functions/prime.hpp
new file mode 100644
index 0000000..94c28f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/prime.hpp
@@ -0,0 +1,1220 @@
+// Copyright 2008 John Maddock
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_PRIME_HPP
+#define BOOST_MATH_SF_PRIME_HPP
+
+#include <boost/array.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+
+namespace boost{ namespace math{
+
+   template <class Policy>
+   boost::uint32_t prime(unsigned n, const Policy& pol)
+   {
+      //
+      // This is basically three big tables which together
+      // occupy 19946 bytes, we use the smallest type which
+      // will handle each value, and store the final set of 
+      // values in a uint16_t with the values offset by 0xffff.
+      // That gives us the first 10000 primes with the largest
+      // being 104729:
+      //
+      static const unsigned b1 = 53;
+      static const unsigned b2 = 6541;
+      static const unsigned b3 = 10000;
+      static const boost::array<unsigned char, 54> a1 = {{
+         2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u, 
+         37u, 41u, 43u, 47u, 53u, 59u, 61u, 67u, 71u, 73u, 
+         79u, 83u, 89u, 97u, 101u, 103u, 107u, 109u, 113u, 
+         127u, 131u, 137u, 139u, 149u, 151u, 157u, 163u, 
+         167u, 173u, 179u, 181u, 191u, 193u, 197u, 199u, 
+         211u, 223u, 227u, 229u, 233u, 239u, 241u, 251u
+      }};
+      static const boost::array<boost::uint16_t, 6488> a2 = {{
+         257u, 263u, 269u, 271u, 277u, 281u, 283u, 293u, 
+         307u, 311u, 313u, 317u, 331u, 337u, 347u, 349u, 353u, 
+         359u, 367u, 373u, 379u, 383u, 389u, 397u, 401u, 409u, 
+         419u, 421u, 431u, 433u, 439u, 443u, 449u, 457u, 461u, 
+         463u, 467u, 479u, 487u, 491u, 499u, 503u, 509u, 521u, 
+         523u, 541u, 547u, 557u, 563u, 569u, 571u, 577u, 587u, 
+         593u, 599u, 601u, 607u, 613u, 617u, 619u, 631u, 641u, 
+         643u, 647u, 653u, 659u, 661u, 673u, 677u, 683u, 691u, 
+         701u, 709u, 719u, 727u, 733u, 739u, 743u, 751u, 757u, 
+         761u, 769u, 773u, 787u, 797u, 809u, 811u, 821u, 823u, 
+         827u, 829u, 839u, 853u, 857u, 859u, 863u, 877u, 881u, 
+         883u, 887u, 907u, 911u, 919u, 929u, 937u, 941u, 947u, 
+         953u, 967u, 971u, 977u, 983u, 991u, 997u, 1009u, 1013u, 
+         1019u, 1021u, 1031u, 1033u, 1039u, 1049u, 1051u, 1061u, 1063u, 
+         1069u, 1087u, 1091u, 1093u, 1097u, 1103u, 1109u, 1117u, 1123u, 
+         1129u, 1151u, 1153u, 1163u, 1171u, 1181u, 1187u, 1193u, 1201u, 
+         1213u, 1217u, 1223u, 1229u, 1231u, 1237u, 1249u, 1259u, 1277u, 
+         1279u, 1283u, 1289u, 1291u, 1297u, 1301u, 1303u, 1307u, 1319u, 
+         1321u, 1327u, 1361u, 1367u, 1373u, 1381u, 1399u, 1409u, 1423u, 
+         1427u, 1429u, 1433u, 1439u, 1447u, 1451u, 1453u, 1459u, 1471u, 
+         1481u, 1483u, 1487u, 1489u, 1493u, 1499u, 1511u, 1523u, 1531u, 
+         1543u, 1549u, 1553u, 1559u, 1567u, 1571u, 1579u, 1583u, 1597u, 
+         1601u, 1607u, 1609u, 1613u, 1619u, 1621u, 1627u, 1637u, 1657u, 
+         1663u, 1667u, 1669u, 1693u, 1697u, 1699u, 1709u, 1721u, 1723u, 
+         1733u, 1741u, 1747u, 1753u, 1759u, 1777u, 1783u, 1787u, 1789u, 
+         1801u, 1811u, 1823u, 1831u, 1847u, 1861u, 1867u, 1871u, 1873u, 
+         1877u, 1879u, 1889u, 1901u, 1907u, 1913u, 1931u, 1933u, 1949u, 
+         1951u, 1973u, 1979u, 1987u, 1993u, 1997u, 1999u, 2003u, 2011u, 
+         2017u, 2027u, 2029u, 2039u, 2053u, 2063u, 2069u, 2081u, 2083u, 
+         2087u, 2089u, 2099u, 2111u, 2113u, 2129u, 2131u, 2137u, 2141u, 
+         2143u, 2153u, 2161u, 2179u, 2203u, 2207u, 2213u, 2221u, 2237u, 
+         2239u, 2243u, 2251u, 2267u, 2269u, 2273u, 2281u, 2287u, 2293u, 
+         2297u, 2309u, 2311u, 2333u, 2339u, 2341u, 2347u, 2351u, 2357u, 
+         2371u, 2377u, 2381u, 2383u, 2389u, 2393u, 2399u, 2411u, 2417u, 
+         2423u, 2437u, 2441u, 2447u, 2459u, 2467u, 2473u, 2477u, 2503u, 
+         2521u, 2531u, 2539u, 2543u, 2549u, 2551u, 2557u, 2579u, 2591u, 
+         2593u, 2609u, 2617u, 2621u, 2633u, 2647u, 2657u, 2659u, 2663u, 
+         2671u, 2677u, 2683u, 2687u, 2689u, 2693u, 2699u, 2707u, 2711u, 
+         2713u, 2719u, 2729u, 2731u, 2741u, 2749u, 2753u, 2767u, 2777u, 
+         2789u, 2791u, 2797u, 2801u, 2803u, 2819u, 2833u, 2837u, 2843u, 
+         2851u, 2857u, 2861u, 2879u, 2887u, 2897u, 2903u, 2909u, 2917u, 
+         2927u, 2939u, 2953u, 2957u, 2963u, 2969u, 2971u, 2999u, 3001u, 
+         3011u, 3019u, 3023u, 3037u, 3041u, 3049u, 3061u, 3067u, 3079u, 
+         3083u, 3089u, 3109u, 3119u, 3121u, 3137u, 3163u, 3167u, 3169u, 
+         3181u, 3187u, 3191u, 3203u, 3209u, 3217u, 3221u, 3229u, 3251u, 
+         3253u, 3257u, 3259u, 3271u, 3299u, 3301u, 3307u, 3313u, 3319u, 
+         3323u, 3329u, 3331u, 3343u, 3347u, 3359u, 3361u, 3371u, 3373u, 
+         3389u, 3391u, 3407u, 3413u, 3433u, 3449u, 3457u, 3461u, 3463u, 
+         3467u, 3469u, 3491u, 3499u, 3511u, 3517u, 3527u, 3529u, 3533u, 
+         3539u, 3541u, 3547u, 3557u, 3559u, 3571u, 3581u, 3583u, 3593u, 
+         3607u, 3613u, 3617u, 3623u, 3631u, 3637u, 3643u, 3659u, 3671u, 
+         3673u, 3677u, 3691u, 3697u, 3701u, 3709u, 3719u, 3727u, 3733u, 
+         3739u, 3761u, 3767u, 3769u, 3779u, 3793u, 3797u, 3803u, 3821u, 
+         3823u, 3833u, 3847u, 3851u, 3853u, 3863u, 3877u, 3881u, 3889u, 
+         3907u, 3911u, 3917u, 3919u, 3923u, 3929u, 3931u, 3943u, 3947u, 
+         3967u, 3989u, 4001u, 4003u, 4007u, 4013u, 4019u, 4021u, 4027u, 
+         4049u, 4051u, 4057u, 4073u, 4079u, 4091u, 4093u, 4099u, 4111u, 
+         4127u, 4129u, 4133u, 4139u, 4153u, 4157u, 4159u, 4177u, 4201u, 
+         4211u, 4217u, 4219u, 4229u, 4231u, 4241u, 4243u, 4253u, 4259u, 
+         4261u, 4271u, 4273u, 4283u, 4289u, 4297u, 4327u, 4337u, 4339u, 
+         4349u, 4357u, 4363u, 4373u, 4391u, 4397u, 4409u, 4421u, 4423u, 
+         4441u, 4447u, 4451u, 4457u, 4463u, 4481u, 4483u, 4493u, 4507u, 
+         4513u, 4517u, 4519u, 4523u, 4547u, 4549u, 4561u, 4567u, 4583u, 
+         4591u, 4597u, 4603u, 4621u, 4637u, 4639u, 4643u, 4649u, 4651u, 
+         4657u, 4663u, 4673u, 4679u, 4691u, 4703u, 4721u, 4723u, 4729u, 
+         4733u, 4751u, 4759u, 4783u, 4787u, 4789u, 4793u, 4799u, 4801u, 
+         4813u, 4817u, 4831u, 4861u, 4871u, 4877u, 4889u, 4903u, 4909u, 
+         4919u, 4931u, 4933u, 4937u, 4943u, 4951u, 4957u, 4967u, 4969u, 
+         4973u, 4987u, 4993u, 4999u, 5003u, 5009u, 5011u, 5021u, 5023u, 
+         5039u, 5051u, 5059u, 5077u, 5081u, 5087u, 5099u, 5101u, 5107u, 
+         5113u, 5119u, 5147u, 5153u, 5167u, 5171u, 5179u, 5189u, 5197u, 
+         5209u, 5227u, 5231u, 5233u, 5237u, 5261u, 5273u, 5279u, 5281u, 
+         5297u, 5303u, 5309u, 5323u, 5333u, 5347u, 5351u, 5381u, 5387u, 
+         5393u, 5399u, 5407u, 5413u, 5417u, 5419u, 5431u, 5437u, 5441u, 
+         5443u, 5449u, 5471u, 5477u, 5479u, 5483u, 5501u, 5503u, 5507u, 
+         5519u, 5521u, 5527u, 5531u, 5557u, 5563u, 5569u, 5573u, 5581u, 
+         5591u, 5623u, 5639u, 5641u, 5647u, 5651u, 5653u, 5657u, 5659u, 
+         5669u, 5683u, 5689u, 5693u, 5701u, 5711u, 5717u, 5737u, 5741u, 
+         5743u, 5749u, 5779u, 5783u, 5791u, 5801u, 5807u, 5813u, 5821u, 
+         5827u, 5839u, 5843u, 5849u, 5851u, 5857u, 5861u, 5867u, 5869u, 
+         5879u, 5881u, 5897u, 5903u, 5923u, 5927u, 5939u, 5953u, 5981u, 
+         5987u, 6007u, 6011u, 6029u, 6037u, 6043u, 6047u, 6053u, 6067u, 
+         6073u, 6079u, 6089u, 6091u, 6101u, 6113u, 6121u, 6131u, 6133u, 
+         6143u, 6151u, 6163u, 6173u, 6197u, 6199u, 6203u, 6211u, 6217u, 
+         6221u, 6229u, 6247u, 6257u, 6263u, 6269u, 6271u, 6277u, 6287u, 
+         6299u, 6301u, 6311u, 6317u, 6323u, 6329u, 6337u, 6343u, 6353u, 
+         6359u, 6361u, 6367u, 6373u, 6379u, 6389u, 6397u, 6421u, 6427u, 
+         6449u, 6451u, 6469u, 6473u, 6481u, 6491u, 6521u, 6529u, 6547u, 
+         6551u, 6553u, 6563u, 6569u, 6571u, 6577u, 6581u, 6599u, 6607u, 
+         6619u, 6637u, 6653u, 6659u, 6661u, 6673u, 6679u, 6689u, 6691u, 
+         6701u, 6703u, 6709u, 6719u, 6733u, 6737u, 6761u, 6763u, 6779u, 
+         6781u, 6791u, 6793u, 6803u, 6823u, 6827u, 6829u, 6833u, 6841u, 
+         6857u, 6863u, 6869u, 6871u, 6883u, 6899u, 6907u, 6911u, 6917u, 
+         6947u, 6949u, 6959u, 6961u, 6967u, 6971u, 6977u, 6983u, 6991u, 
+         6997u, 7001u, 7013u, 7019u, 7027u, 7039u, 7043u, 7057u, 7069u, 
+         7079u, 7103u, 7109u, 7121u, 7127u, 7129u, 7151u, 7159u, 7177u, 
+         7187u, 7193u, 7207u, 7211u, 7213u, 7219u, 7229u, 7237u, 7243u, 
+         7247u, 7253u, 7283u, 7297u, 7307u, 7309u, 7321u, 7331u, 7333u, 
+         7349u, 7351u, 7369u, 7393u, 7411u, 7417u, 7433u, 7451u, 7457u, 
+         7459u, 7477u, 7481u, 7487u, 7489u, 7499u, 7507u, 7517u, 7523u, 
+         7529u, 7537u, 7541u, 7547u, 7549u, 7559u, 7561u, 7573u, 7577u, 
+         7583u, 7589u, 7591u, 7603u, 7607u, 7621u, 7639u, 7643u, 7649u, 
+         7669u, 7673u, 7681u, 7687u, 7691u, 7699u, 7703u, 7717u, 7723u, 
+         7727u, 7741u, 7753u, 7757u, 7759u, 7789u, 7793u, 7817u, 7823u, 
+         7829u, 7841u, 7853u, 7867u, 7873u, 7877u, 7879u, 7883u, 7901u, 
+         7907u, 7919u, 7927u, 7933u, 7937u, 7949u, 7951u, 7963u, 7993u, 
+         8009u, 8011u, 8017u, 8039u, 8053u, 8059u, 8069u, 8081u, 8087u, 
+         8089u, 8093u, 8101u, 8111u, 8117u, 8123u, 8147u, 8161u, 8167u, 
+         8171u, 8179u, 8191u, 8209u, 8219u, 8221u, 8231u, 8233u, 8237u, 
+         8243u, 8263u, 8269u, 8273u, 8287u, 8291u, 8293u, 8297u, 8311u, 
+         8317u, 8329u, 8353u, 8363u, 8369u, 8377u, 8387u, 8389u, 8419u, 
+         8423u, 8429u, 8431u, 8443u, 8447u, 8461u, 8467u, 8501u, 8513u, 
+         8521u, 8527u, 8537u, 8539u, 8543u, 8563u, 8573u, 8581u, 8597u, 
+         8599u, 8609u, 8623u, 8627u, 8629u, 8641u, 8647u, 8663u, 8669u, 
+         8677u, 8681u, 8689u, 8693u, 8699u, 8707u, 8713u, 8719u, 8731u, 
+         8737u, 8741u, 8747u, 8753u, 8761u, 8779u, 8783u, 8803u, 8807u, 
+         8819u, 8821u, 8831u, 8837u, 8839u, 8849u, 8861u, 8863u, 8867u, 
+         8887u, 8893u, 8923u, 8929u, 8933u, 8941u, 8951u, 8963u, 8969u, 
+         8971u, 8999u, 9001u, 9007u, 9011u, 9013u, 9029u, 9041u, 9043u, 
+         9049u, 9059u, 9067u, 9091u, 9103u, 9109u, 9127u, 9133u, 9137u, 
+         9151u, 9157u, 9161u, 9173u, 9181u, 9187u, 9199u, 9203u, 9209u, 
+         9221u, 9227u, 9239u, 9241u, 9257u, 9277u, 9281u, 9283u, 9293u, 
+         9311u, 9319u, 9323u, 9337u, 9341u, 9343u, 9349u, 9371u, 9377u, 
+         9391u, 9397u, 9403u, 9413u, 9419u, 9421u, 9431u, 9433u, 9437u, 
+         9439u, 9461u, 9463u, 9467u, 9473u, 9479u, 9491u, 9497u, 9511u, 
+         9521u, 9533u, 9539u, 9547u, 9551u, 9587u, 9601u, 9613u, 9619u, 
+         9623u, 9629u, 9631u, 9643u, 9649u, 9661u, 9677u, 9679u, 9689u, 
+         9697u, 9719u, 9721u, 9733u, 9739u, 9743u, 9749u, 9767u, 9769u, 
+         9781u, 9787u, 9791u, 9803u, 9811u, 9817u, 9829u, 9833u, 9839u, 
+         9851u, 9857u, 9859u, 9871u, 9883u, 9887u, 9901u, 9907u, 9923u, 
+         9929u, 9931u, 9941u, 9949u, 9967u, 9973u, 10007u, 10009u, 10037u, 
+         10039u, 10061u, 10067u, 10069u, 10079u, 10091u, 10093u, 10099u, 10103u, 
+         10111u, 10133u, 10139u, 10141u, 10151u, 10159u, 10163u, 10169u, 10177u, 
+         10181u, 10193u, 10211u, 10223u, 10243u, 10247u, 10253u, 10259u, 10267u, 
+         10271u, 10273u, 10289u, 10301u, 10303u, 10313u, 10321u, 10331u, 10333u, 
+         10337u, 10343u, 10357u, 10369u, 10391u, 10399u, 10427u, 10429u, 10433u, 
+         10453u, 10457u, 10459u, 10463u, 10477u, 10487u, 10499u, 10501u, 10513u, 
+         10529u, 10531u, 10559u, 10567u, 10589u, 10597u, 10601u, 10607u, 10613u, 
+         10627u, 10631u, 10639u, 10651u, 10657u, 10663u, 10667u, 10687u, 10691u, 
+         10709u, 10711u, 10723u, 10729u, 10733u, 10739u, 10753u, 10771u, 10781u, 
+         10789u, 10799u, 10831u, 10837u, 10847u, 10853u, 10859u, 10861u, 10867u, 
+         10883u, 10889u, 10891u, 10903u, 10909u, 10937u, 10939u, 10949u, 10957u, 
+         10973u, 10979u, 10987u, 10993u, 11003u, 11027u, 11047u, 11057u, 11059u, 
+         11069u, 11071u, 11083u, 11087u, 11093u, 11113u, 11117u, 11119u, 11131u, 
+         11149u, 11159u, 11161u, 11171u, 11173u, 11177u, 11197u, 11213u, 11239u, 
+         11243u, 11251u, 11257u, 11261u, 11273u, 11279u, 11287u, 11299u, 11311u, 
+         11317u, 11321u, 11329u, 11351u, 11353u, 11369u, 11383u, 11393u, 11399u, 
+         11411u, 11423u, 11437u, 11443u, 11447u, 11467u, 11471u, 11483u, 11489u, 
+         11491u, 11497u, 11503u, 11519u, 11527u, 11549u, 11551u, 11579u, 11587u, 
+         11593u, 11597u, 11617u, 11621u, 11633u, 11657u, 11677u, 11681u, 11689u, 
+         11699u, 11701u, 11717u, 11719u, 11731u, 11743u, 11777u, 11779u, 11783u, 
+         11789u, 11801u, 11807u, 11813u, 11821u, 11827u, 11831u, 11833u, 11839u, 
+         11863u, 11867u, 11887u, 11897u, 11903u, 11909u, 11923u, 11927u, 11933u, 
+         11939u, 11941u, 11953u, 11959u, 11969u, 11971u, 11981u, 11987u, 12007u, 
+         12011u, 12037u, 12041u, 12043u, 12049u, 12071u, 12073u, 12097u, 12101u, 
+         12107u, 12109u, 12113u, 12119u, 12143u, 12149u, 12157u, 12161u, 12163u, 
+         12197u, 12203u, 12211u, 12227u, 12239u, 12241u, 12251u, 12253u, 12263u, 
+         12269u, 12277u, 12281u, 12289u, 12301u, 12323u, 12329u, 12343u, 12347u, 
+         12373u, 12377u, 12379u, 12391u, 12401u, 12409u, 12413u, 12421u, 12433u, 
+         12437u, 12451u, 12457u, 12473u, 12479u, 12487u, 12491u, 12497u, 12503u, 
+         12511u, 12517u, 12527u, 12539u, 12541u, 12547u, 12553u, 12569u, 12577u, 
+         12583u, 12589u, 12601u, 12611u, 12613u, 12619u, 12637u, 12641u, 12647u, 
+         12653u, 12659u, 12671u, 12689u, 12697u, 12703u, 12713u, 12721u, 12739u, 
+         12743u, 12757u, 12763u, 12781u, 12791u, 12799u, 12809u, 12821u, 12823u, 
+         12829u, 12841u, 12853u, 12889u, 12893u, 12899u, 12907u, 12911u, 12917u, 
+         12919u, 12923u, 12941u, 12953u, 12959u, 12967u, 12973u, 12979u, 12983u, 
+         13001u, 13003u, 13007u, 13009u, 13033u, 13037u, 13043u, 13049u, 13063u, 
+         13093u, 13099u, 13103u, 13109u, 13121u, 13127u, 13147u, 13151u, 13159u, 
+         13163u, 13171u, 13177u, 13183u, 13187u, 13217u, 13219u, 13229u, 13241u, 
+         13249u, 13259u, 13267u, 13291u, 13297u, 13309u, 13313u, 13327u, 13331u, 
+         13337u, 13339u, 13367u, 13381u, 13397u, 13399u, 13411u, 13417u, 13421u, 
+         13441u, 13451u, 13457u, 13463u, 13469u, 13477u, 13487u, 13499u, 13513u, 
+         13523u, 13537u, 13553u, 13567u, 13577u, 13591u, 13597u, 13613u, 13619u, 
+         13627u, 13633u, 13649u, 13669u, 13679u, 13681u, 13687u, 13691u, 13693u, 
+         13697u, 13709u, 13711u, 13721u, 13723u, 13729u, 13751u, 13757u, 13759u, 
+         13763u, 13781u, 13789u, 13799u, 13807u, 13829u, 13831u, 13841u, 13859u, 
+         13873u, 13877u, 13879u, 13883u, 13901u, 13903u, 13907u, 13913u, 13921u, 
+         13931u, 13933u, 13963u, 13967u, 13997u, 13999u, 14009u, 14011u, 14029u, 
+         14033u, 14051u, 14057u, 14071u, 14081u, 14083u, 14087u, 14107u, 14143u, 
+         14149u, 14153u, 14159u, 14173u, 14177u, 14197u, 14207u, 14221u, 14243u, 
+         14249u, 14251u, 14281u, 14293u, 14303u, 14321u, 14323u, 14327u, 14341u, 
+         14347u, 14369u, 14387u, 14389u, 14401u, 14407u, 14411u, 14419u, 14423u, 
+         14431u, 14437u, 14447u, 14449u, 14461u, 14479u, 14489u, 14503u, 14519u, 
+         14533u, 14537u, 14543u, 14549u, 14551u, 14557u, 14561u, 14563u, 14591u, 
+         14593u, 14621u, 14627u, 14629u, 14633u, 14639u, 14653u, 14657u, 14669u, 
+         14683u, 14699u, 14713u, 14717u, 14723u, 14731u, 14737u, 14741u, 14747u, 
+         14753u, 14759u, 14767u, 14771u, 14779u, 14783u, 14797u, 14813u, 14821u, 
+         14827u, 14831u, 14843u, 14851u, 14867u, 14869u, 14879u, 14887u, 14891u, 
+         14897u, 14923u, 14929u, 14939u, 14947u, 14951u, 14957u, 14969u, 14983u, 
+         15013u, 15017u, 15031u, 15053u, 15061u, 15073u, 15077u, 15083u, 15091u, 
+         15101u, 15107u, 15121u, 15131u, 15137u, 15139u, 15149u, 15161u, 15173u, 
+         15187u, 15193u, 15199u, 15217u, 15227u, 15233u, 15241u, 15259u, 15263u, 
+         15269u, 15271u, 15277u, 15287u, 15289u, 15299u, 15307u, 15313u, 15319u, 
+         15329u, 15331u, 15349u, 15359u, 15361u, 15373u, 15377u, 15383u, 15391u, 
+         15401u, 15413u, 15427u, 15439u, 15443u, 15451u, 15461u, 15467u, 15473u, 
+         15493u, 15497u, 15511u, 15527u, 15541u, 15551u, 15559u, 15569u, 15581u, 
+         15583u, 15601u, 15607u, 15619u, 15629u, 15641u, 15643u, 15647u, 15649u, 
+         15661u, 15667u, 15671u, 15679u, 15683u, 15727u, 15731u, 15733u, 15737u, 
+         15739u, 15749u, 15761u, 15767u, 15773u, 15787u, 15791u, 15797u, 15803u, 
+         15809u, 15817u, 15823u, 15859u, 15877u, 15881u, 15887u, 15889u, 15901u, 
+         15907u, 15913u, 15919u, 15923u, 15937u, 15959u, 15971u, 15973u, 15991u, 
+         16001u, 16007u, 16033u, 16057u, 16061u, 16063u, 16067u, 16069u, 16073u, 
+         16087u, 16091u, 16097u, 16103u, 16111u, 16127u, 16139u, 16141u, 16183u, 
+         16187u, 16189u, 16193u, 16217u, 16223u, 16229u, 16231u, 16249u, 16253u, 
+         16267u, 16273u, 16301u, 16319u, 16333u, 16339u, 16349u, 16361u, 16363u, 
+         16369u, 16381u, 16411u, 16417u, 16421u, 16427u, 16433u, 16447u, 16451u, 
+         16453u, 16477u, 16481u, 16487u, 16493u, 16519u, 16529u, 16547u, 16553u, 
+         16561u, 16567u, 16573u, 16603u, 16607u, 16619u, 16631u, 16633u, 16649u, 
+         16651u, 16657u, 16661u, 16673u, 16691u, 16693u, 16699u, 16703u, 16729u, 
+         16741u, 16747u, 16759u, 16763u, 16787u, 16811u, 16823u, 16829u, 16831u, 
+         16843u, 16871u, 16879u, 16883u, 16889u, 16901u, 16903u, 16921u, 16927u, 
+         16931u, 16937u, 16943u, 16963u, 16979u, 16981u, 16987u, 16993u, 17011u, 
+         17021u, 17027u, 17029u, 17033u, 17041u, 17047u, 17053u, 17077u, 17093u, 
+         17099u, 17107u, 17117u, 17123u, 17137u, 17159u, 17167u, 17183u, 17189u, 
+         17191u, 17203u, 17207u, 17209u, 17231u, 17239u, 17257u, 17291u, 17293u, 
+         17299u, 17317u, 17321u, 17327u, 17333u, 17341u, 17351u, 17359u, 17377u, 
+         17383u, 17387u, 17389u, 17393u, 17401u, 17417u, 17419u, 17431u, 17443u, 
+         17449u, 17467u, 17471u, 17477u, 17483u, 17489u, 17491u, 17497u, 17509u, 
+         17519u, 17539u, 17551u, 17569u, 17573u, 17579u, 17581u, 17597u, 17599u, 
+         17609u, 17623u, 17627u, 17657u, 17659u, 17669u, 17681u, 17683u, 17707u, 
+         17713u, 17729u, 17737u, 17747u, 17749u, 17761u, 17783u, 17789u, 17791u, 
+         17807u, 17827u, 17837u, 17839u, 17851u, 17863u, 17881u, 17891u, 17903u, 
+         17909u, 17911u, 17921u, 17923u, 17929u, 17939u, 17957u, 17959u, 17971u, 
+         17977u, 17981u, 17987u, 17989u, 18013u, 18041u, 18043u, 18047u, 18049u, 
+         18059u, 18061u, 18077u, 18089u, 18097u, 18119u, 18121u, 18127u, 18131u, 
+         18133u, 18143u, 18149u, 18169u, 18181u, 18191u, 18199u, 18211u, 18217u, 
+         18223u, 18229u, 18233u, 18251u, 18253u, 18257u, 18269u, 18287u, 18289u, 
+         18301u, 18307u, 18311u, 18313u, 18329u, 18341u, 18353u, 18367u, 18371u, 
+         18379u, 18397u, 18401u, 18413u, 18427u, 18433u, 18439u, 18443u, 18451u, 
+         18457u, 18461u, 18481u, 18493u, 18503u, 18517u, 18521u, 18523u, 18539u, 
+         18541u, 18553u, 18583u, 18587u, 18593u, 18617u, 18637u, 18661u, 18671u, 
+         18679u, 18691u, 18701u, 18713u, 18719u, 18731u, 18743u, 18749u, 18757u, 
+         18773u, 18787u, 18793u, 18797u, 18803u, 18839u, 18859u, 18869u, 18899u, 
+         18911u, 18913u, 18917u, 18919u, 18947u, 18959u, 18973u, 18979u, 19001u, 
+         19009u, 19013u, 19031u, 19037u, 19051u, 19069u, 19073u, 19079u, 19081u, 
+         19087u, 19121u, 19139u, 19141u, 19157u, 19163u, 19181u, 19183u, 19207u, 
+         19211u, 19213u, 19219u, 19231u, 19237u, 19249u, 19259u, 19267u, 19273u, 
+         19289u, 19301u, 19309u, 19319u, 19333u, 19373u, 19379u, 19381u, 19387u, 
+         19391u, 19403u, 19417u, 19421u, 19423u, 19427u, 19429u, 19433u, 19441u, 
+         19447u, 19457u, 19463u, 19469u, 19471u, 19477u, 19483u, 19489u, 19501u, 
+         19507u, 19531u, 19541u, 19543u, 19553u, 19559u, 19571u, 19577u, 19583u, 
+         19597u, 19603u, 19609u, 19661u, 19681u, 19687u, 19697u, 19699u, 19709u, 
+         19717u, 19727u, 19739u, 19751u, 19753u, 19759u, 19763u, 19777u, 19793u, 
+         19801u, 19813u, 19819u, 19841u, 19843u, 19853u, 19861u, 19867u, 19889u, 
+         19891u, 19913u, 19919u, 19927u, 19937u, 19949u, 19961u, 19963u, 19973u, 
+         19979u, 19991u, 19993u, 19997u, 20011u, 20021u, 20023u, 20029u, 20047u, 
+         20051u, 20063u, 20071u, 20089u, 20101u, 20107u, 20113u, 20117u, 20123u, 
+         20129u, 20143u, 20147u, 20149u, 20161u, 20173u, 20177u, 20183u, 20201u, 
+         20219u, 20231u, 20233u, 20249u, 20261u, 20269u, 20287u, 20297u, 20323u, 
+         20327u, 20333u, 20341u, 20347u, 20353u, 20357u, 20359u, 20369u, 20389u, 
+         20393u, 20399u, 20407u, 20411u, 20431u, 20441u, 20443u, 20477u, 20479u, 
+         20483u, 20507u, 20509u, 20521u, 20533u, 20543u, 20549u, 20551u, 20563u, 
+         20593u, 20599u, 20611u, 20627u, 20639u, 20641u, 20663u, 20681u, 20693u, 
+         20707u, 20717u, 20719u, 20731u, 20743u, 20747u, 20749u, 20753u, 20759u, 
+         20771u, 20773u, 20789u, 20807u, 20809u, 20849u, 20857u, 20873u, 20879u, 
+         20887u, 20897u, 20899u, 20903u, 20921u, 20929u, 20939u, 20947u, 20959u, 
+         20963u, 20981u, 20983u, 21001u, 21011u, 21013u, 21017u, 21019u, 21023u, 
+         21031u, 21059u, 21061u, 21067u, 21089u, 21101u, 21107u, 21121u, 21139u, 
+         21143u, 21149u, 21157u, 21163u, 21169u, 21179u, 21187u, 21191u, 21193u, 
+         21211u, 21221u, 21227u, 21247u, 21269u, 21277u, 21283u, 21313u, 21317u, 
+         21319u, 21323u, 21341u, 21347u, 21377u, 21379u, 21383u, 21391u, 21397u, 
+         21401u, 21407u, 21419u, 21433u, 21467u, 21481u, 21487u, 21491u, 21493u, 
+         21499u, 21503u, 21517u, 21521u, 21523u, 21529u, 21557u, 21559u, 21563u, 
+         21569u, 21577u, 21587u, 21589u, 21599u, 21601u, 21611u, 21613u, 21617u, 
+         21647u, 21649u, 21661u, 21673u, 21683u, 21701u, 21713u, 21727u, 21737u, 
+         21739u, 21751u, 21757u, 21767u, 21773u, 21787u, 21799u, 21803u, 21817u, 
+         21821u, 21839u, 21841u, 21851u, 21859u, 21863u, 21871u, 21881u, 21893u, 
+         21911u, 21929u, 21937u, 21943u, 21961u, 21977u, 21991u, 21997u, 22003u, 
+         22013u, 22027u, 22031u, 22037u, 22039u, 22051u, 22063u, 22067u, 22073u, 
+         22079u, 22091u, 22093u, 22109u, 22111u, 22123u, 22129u, 22133u, 22147u, 
+         22153u, 22157u, 22159u, 22171u, 22189u, 22193u, 22229u, 22247u, 22259u, 
+         22271u, 22273u, 22277u, 22279u, 22283u, 22291u, 22303u, 22307u, 22343u, 
+         22349u, 22367u, 22369u, 22381u, 22391u, 22397u, 22409u, 22433u, 22441u, 
+         22447u, 22453u, 22469u, 22481u, 22483u, 22501u, 22511u, 22531u, 22541u, 
+         22543u, 22549u, 22567u, 22571u, 22573u, 22613u, 22619u, 22621u, 22637u, 
+         22639u, 22643u, 22651u, 22669u, 22679u, 22691u, 22697u, 22699u, 22709u, 
+         22717u, 22721u, 22727u, 22739u, 22741u, 22751u, 22769u, 22777u, 22783u, 
+         22787u, 22807u, 22811u, 22817u, 22853u, 22859u, 22861u, 22871u, 22877u, 
+         22901u, 22907u, 22921u, 22937u, 22943u, 22961u, 22963u, 22973u, 22993u, 
+         23003u, 23011u, 23017u, 23021u, 23027u, 23029u, 23039u, 23041u, 23053u, 
+         23057u, 23059u, 23063u, 23071u, 23081u, 23087u, 23099u, 23117u, 23131u, 
+         23143u, 23159u, 23167u, 23173u, 23189u, 23197u, 23201u, 23203u, 23209u, 
+         23227u, 23251u, 23269u, 23279u, 23291u, 23293u, 23297u, 23311u, 23321u, 
+         23327u, 23333u, 23339u, 23357u, 23369u, 23371u, 23399u, 23417u, 23431u, 
+         23447u, 23459u, 23473u, 23497u, 23509u, 23531u, 23537u, 23539u, 23549u, 
+         23557u, 23561u, 23563u, 23567u, 23581u, 23593u, 23599u, 23603u, 23609u, 
+         23623u, 23627u, 23629u, 23633u, 23663u, 23669u, 23671u, 23677u, 23687u, 
+         23689u, 23719u, 23741u, 23743u, 23747u, 23753u, 23761u, 23767u, 23773u, 
+         23789u, 23801u, 23813u, 23819u, 23827u, 23831u, 23833u, 23857u, 23869u, 
+         23873u, 23879u, 23887u, 23893u, 23899u, 23909u, 23911u, 23917u, 23929u, 
+         23957u, 23971u, 23977u, 23981u, 23993u, 24001u, 24007u, 24019u, 24023u, 
+         24029u, 24043u, 24049u, 24061u, 24071u, 24077u, 24083u, 24091u, 24097u, 
+         24103u, 24107u, 24109u, 24113u, 24121u, 24133u, 24137u, 24151u, 24169u, 
+         24179u, 24181u, 24197u, 24203u, 24223u, 24229u, 24239u, 24247u, 24251u, 
+         24281u, 24317u, 24329u, 24337u, 24359u, 24371u, 24373u, 24379u, 24391u, 
+         24407u, 24413u, 24419u, 24421u, 24439u, 24443u, 24469u, 24473u, 24481u, 
+         24499u, 24509u, 24517u, 24527u, 24533u, 24547u, 24551u, 24571u, 24593u, 
+         24611u, 24623u, 24631u, 24659u, 24671u, 24677u, 24683u, 24691u, 24697u, 
+         24709u, 24733u, 24749u, 24763u, 24767u, 24781u, 24793u, 24799u, 24809u, 
+         24821u, 24841u, 24847u, 24851u, 24859u, 24877u, 24889u, 24907u, 24917u, 
+         24919u, 24923u, 24943u, 24953u, 24967u, 24971u, 24977u, 24979u, 24989u, 
+         25013u, 25031u, 25033u, 25037u, 25057u, 25073u, 25087u, 25097u, 25111u, 
+         25117u, 25121u, 25127u, 25147u, 25153u, 25163u, 25169u, 25171u, 25183u, 
+         25189u, 25219u, 25229u, 25237u, 25243u, 25247u, 25253u, 25261u, 25301u, 
+         25303u, 25307u, 25309u, 25321u, 25339u, 25343u, 25349u, 25357u, 25367u, 
+         25373u, 25391u, 25409u, 25411u, 25423u, 25439u, 25447u, 25453u, 25457u, 
+         25463u, 25469u, 25471u, 25523u, 25537u, 25541u, 25561u, 25577u, 25579u, 
+         25583u, 25589u, 25601u, 25603u, 25609u, 25621u, 25633u, 25639u, 25643u, 
+         25657u, 25667u, 25673u, 25679u, 25693u, 25703u, 25717u, 25733u, 25741u, 
+         25747u, 25759u, 25763u, 25771u, 25793u, 25799u, 25801u, 25819u, 25841u, 
+         25847u, 25849u, 25867u, 25873u, 25889u, 25903u, 25913u, 25919u, 25931u, 
+         25933u, 25939u, 25943u, 25951u, 25969u, 25981u, 25997u, 25999u, 26003u, 
+         26017u, 26021u, 26029u, 26041u, 26053u, 26083u, 26099u, 26107u, 26111u, 
+         26113u, 26119u, 26141u, 26153u, 26161u, 26171u, 26177u, 26183u, 26189u, 
+         26203u, 26209u, 26227u, 26237u, 26249u, 26251u, 26261u, 26263u, 26267u, 
+         26293u, 26297u, 26309u, 26317u, 26321u, 26339u, 26347u, 26357u, 26371u, 
+         26387u, 26393u, 26399u, 26407u, 26417u, 26423u, 26431u, 26437u, 26449u, 
+         26459u, 26479u, 26489u, 26497u, 26501u, 26513u, 26539u, 26557u, 26561u, 
+         26573u, 26591u, 26597u, 26627u, 26633u, 26641u, 26647u, 26669u, 26681u, 
+         26683u, 26687u, 26693u, 26699u, 26701u, 26711u, 26713u, 26717u, 26723u, 
+         26729u, 26731u, 26737u, 26759u, 26777u, 26783u, 26801u, 26813u, 26821u, 
+         26833u, 26839u, 26849u, 26861u, 26863u, 26879u, 26881u, 26891u, 26893u, 
+         26903u, 26921u, 26927u, 26947u, 26951u, 26953u, 26959u, 26981u, 26987u, 
+         26993u, 27011u, 27017u, 27031u, 27043u, 27059u, 27061u, 27067u, 27073u, 
+         27077u, 27091u, 27103u, 27107u, 27109u, 27127u, 27143u, 27179u, 27191u, 
+         27197u, 27211u, 27239u, 27241u, 27253u, 27259u, 27271u, 27277u, 27281u, 
+         27283u, 27299u, 27329u, 27337u, 27361u, 27367u, 27397u, 27407u, 27409u, 
+         27427u, 27431u, 27437u, 27449u, 27457u, 27479u, 27481u, 27487u, 27509u, 
+         27527u, 27529u, 27539u, 27541u, 27551u, 27581u, 27583u, 27611u, 27617u, 
+         27631u, 27647u, 27653u, 27673u, 27689u, 27691u, 27697u, 27701u, 27733u, 
+         27737u, 27739u, 27743u, 27749u, 27751u, 27763u, 27767u, 27773u, 27779u, 
+         27791u, 27793u, 27799u, 27803u, 27809u, 27817u, 27823u, 27827u, 27847u, 
+         27851u, 27883u, 27893u, 27901u, 27917u, 27919u, 27941u, 27943u, 27947u, 
+         27953u, 27961u, 27967u, 27983u, 27997u, 28001u, 28019u, 28027u, 28031u, 
+         28051u, 28057u, 28069u, 28081u, 28087u, 28097u, 28099u, 28109u, 28111u, 
+         28123u, 28151u, 28163u, 28181u, 28183u, 28201u, 28211u, 28219u, 28229u, 
+         28277u, 28279u, 28283u, 28289u, 28297u, 28307u, 28309u, 28319u, 28349u, 
+         28351u, 28387u, 28393u, 28403u, 28409u, 28411u, 28429u, 28433u, 28439u, 
+         28447u, 28463u, 28477u, 28493u, 28499u, 28513u, 28517u, 28537u, 28541u, 
+         28547u, 28549u, 28559u, 28571u, 28573u, 28579u, 28591u, 28597u, 28603u, 
+         28607u, 28619u, 28621u, 28627u, 28631u, 28643u, 28649u, 28657u, 28661u, 
+         28663u, 28669u, 28687u, 28697u, 28703u, 28711u, 28723u, 28729u, 28751u, 
+         28753u, 28759u, 28771u, 28789u, 28793u, 28807u, 28813u, 28817u, 28837u, 
+         28843u, 28859u, 28867u, 28871u, 28879u, 28901u, 28909u, 28921u, 28927u, 
+         28933u, 28949u, 28961u, 28979u, 29009u, 29017u, 29021u, 29023u, 29027u, 
+         29033u, 29059u, 29063u, 29077u, 29101u, 29123u, 29129u, 29131u, 29137u, 
+         29147u, 29153u, 29167u, 29173u, 29179u, 29191u, 29201u, 29207u, 29209u, 
+         29221u, 29231u, 29243u, 29251u, 29269u, 29287u, 29297u, 29303u, 29311u, 
+         29327u, 29333u, 29339u, 29347u, 29363u, 29383u, 29387u, 29389u, 29399u, 
+         29401u, 29411u, 29423u, 29429u, 29437u, 29443u, 29453u, 29473u, 29483u, 
+         29501u, 29527u, 29531u, 29537u, 29567u, 29569u, 29573u, 29581u, 29587u, 
+         29599u, 29611u, 29629u, 29633u, 29641u, 29663u, 29669u, 29671u, 29683u, 
+         29717u, 29723u, 29741u, 29753u, 29759u, 29761u, 29789u, 29803u, 29819u, 
+         29833u, 29837u, 29851u, 29863u, 29867u, 29873u, 29879u, 29881u, 29917u, 
+         29921u, 29927u, 29947u, 29959u, 29983u, 29989u, 30011u, 30013u, 30029u, 
+         30047u, 30059u, 30071u, 30089u, 30091u, 30097u, 30103u, 30109u, 30113u, 
+         30119u, 30133u, 30137u, 30139u, 30161u, 30169u, 30181u, 30187u, 30197u, 
+         30203u, 30211u, 30223u, 30241u, 30253u, 30259u, 30269u, 30271u, 30293u, 
+         30307u, 30313u, 30319u, 30323u, 30341u, 30347u, 30367u, 30389u, 30391u, 
+         30403u, 30427u, 30431u, 30449u, 30467u, 30469u, 30491u, 30493u, 30497u, 
+         30509u, 30517u, 30529u, 30539u, 30553u, 30557u, 30559u, 30577u, 30593u, 
+         30631u, 30637u, 30643u, 30649u, 30661u, 30671u, 30677u, 30689u, 30697u, 
+         30703u, 30707u, 30713u, 30727u, 30757u, 30763u, 30773u, 30781u, 30803u, 
+         30809u, 30817u, 30829u, 30839u, 30841u, 30851u, 30853u, 30859u, 30869u, 
+         30871u, 30881u, 30893u, 30911u, 30931u, 30937u, 30941u, 30949u, 30971u, 
+         30977u, 30983u, 31013u, 31019u, 31033u, 31039u, 31051u, 31063u, 31069u, 
+         31079u, 31081u, 31091u, 31121u, 31123u, 31139u, 31147u, 31151u, 31153u, 
+         31159u, 31177u, 31181u, 31183u, 31189u, 31193u, 31219u, 31223u, 31231u, 
+         31237u, 31247u, 31249u, 31253u, 31259u, 31267u, 31271u, 31277u, 31307u, 
+         31319u, 31321u, 31327u, 31333u, 31337u, 31357u, 31379u, 31387u, 31391u, 
+         31393u, 31397u, 31469u, 31477u, 31481u, 31489u, 31511u, 31513u, 31517u, 
+         31531u, 31541u, 31543u, 31547u, 31567u, 31573u, 31583u, 31601u, 31607u, 
+         31627u, 31643u, 31649u, 31657u, 31663u, 31667u, 31687u, 31699u, 31721u, 
+         31723u, 31727u, 31729u, 31741u, 31751u, 31769u, 31771u, 31793u, 31799u, 
+         31817u, 31847u, 31849u, 31859u, 31873u, 31883u, 31891u, 31907u, 31957u, 
+         31963u, 31973u, 31981u, 31991u, 32003u, 32009u, 32027u, 32029u, 32051u, 
+         32057u, 32059u, 32063u, 32069u, 32077u, 32083u, 32089u, 32099u, 32117u, 
+         32119u, 32141u, 32143u, 32159u, 32173u, 32183u, 32189u, 32191u, 32203u, 
+         32213u, 32233u, 32237u, 32251u, 32257u, 32261u, 32297u, 32299u, 32303u, 
+         32309u, 32321u, 32323u, 32327u, 32341u, 32353u, 32359u, 32363u, 32369u, 
+         32371u, 32377u, 32381u, 32401u, 32411u, 32413u, 32423u, 32429u, 32441u, 
+         32443u, 32467u, 32479u, 32491u, 32497u, 32503u, 32507u, 32531u, 32533u, 
+         32537u, 32561u, 32563u, 32569u, 32573u, 32579u, 32587u, 32603u, 32609u, 
+         32611u, 32621u, 32633u, 32647u, 32653u, 32687u, 32693u, 32707u, 32713u, 
+         32717u, 32719u, 32749u, 32771u, 32779u, 32783u, 32789u, 32797u, 32801u, 
+         32803u, 32831u, 32833u, 32839u, 32843u, 32869u, 32887u, 32909u, 32911u, 
+         32917u, 32933u, 32939u, 32941u, 32957u, 32969u, 32971u, 32983u, 32987u, 
+         32993u, 32999u, 33013u, 33023u, 33029u, 33037u, 33049u, 33053u, 33071u, 
+         33073u, 33083u, 33091u, 33107u, 33113u, 33119u, 33149u, 33151u, 33161u, 
+         33179u, 33181u, 33191u, 33199u, 33203u, 33211u, 33223u, 33247u, 33287u, 
+         33289u, 33301u, 33311u, 33317u, 33329u, 33331u, 33343u, 33347u, 33349u, 
+         33353u, 33359u, 33377u, 33391u, 33403u, 33409u, 33413u, 33427u, 33457u, 
+         33461u, 33469u, 33479u, 33487u, 33493u, 33503u, 33521u, 33529u, 33533u, 
+         33547u, 33563u, 33569u, 33577u, 33581u, 33587u, 33589u, 33599u, 33601u, 
+         33613u, 33617u, 33619u, 33623u, 33629u, 33637u, 33641u, 33647u, 33679u, 
+         33703u, 33713u, 33721u, 33739u, 33749u, 33751u, 33757u, 33767u, 33769u, 
+         33773u, 33791u, 33797u, 33809u, 33811u, 33827u, 33829u, 33851u, 33857u, 
+         33863u, 33871u, 33889u, 33893u, 33911u, 33923u, 33931u, 33937u, 33941u, 
+         33961u, 33967u, 33997u, 34019u, 34031u, 34033u, 34039u, 34057u, 34061u, 
+         34123u, 34127u, 34129u, 34141u, 34147u, 34157u, 34159u, 34171u, 34183u, 
+         34211u, 34213u, 34217u, 34231u, 34253u, 34259u, 34261u, 34267u, 34273u, 
+         34283u, 34297u, 34301u, 34303u, 34313u, 34319u, 34327u, 34337u, 34351u, 
+         34361u, 34367u, 34369u, 34381u, 34403u, 34421u, 34429u, 34439u, 34457u, 
+         34469u, 34471u, 34483u, 34487u, 34499u, 34501u, 34511u, 34513u, 34519u, 
+         34537u, 34543u, 34549u, 34583u, 34589u, 34591u, 34603u, 34607u, 34613u, 
+         34631u, 34649u, 34651u, 34667u, 34673u, 34679u, 34687u, 34693u, 34703u, 
+         34721u, 34729u, 34739u, 34747u, 34757u, 34759u, 34763u, 34781u, 34807u, 
+         34819u, 34841u, 34843u, 34847u, 34849u, 34871u, 34877u, 34883u, 34897u, 
+         34913u, 34919u, 34939u, 34949u, 34961u, 34963u, 34981u, 35023u, 35027u, 
+         35051u, 35053u, 35059u, 35069u, 35081u, 35083u, 35089u, 35099u, 35107u, 
+         35111u, 35117u, 35129u, 35141u, 35149u, 35153u, 35159u, 35171u, 35201u, 
+         35221u, 35227u, 35251u, 35257u, 35267u, 35279u, 35281u, 35291u, 35311u, 
+         35317u, 35323u, 35327u, 35339u, 35353u, 35363u, 35381u, 35393u, 35401u, 
+         35407u, 35419u, 35423u, 35437u, 35447u, 35449u, 35461u, 35491u, 35507u, 
+         35509u, 35521u, 35527u, 35531u, 35533u, 35537u, 35543u, 35569u, 35573u, 
+         35591u, 35593u, 35597u, 35603u, 35617u, 35671u, 35677u, 35729u, 35731u, 
+         35747u, 35753u, 35759u, 35771u, 35797u, 35801u, 35803u, 35809u, 35831u, 
+         35837u, 35839u, 35851u, 35863u, 35869u, 35879u, 35897u, 35899u, 35911u, 
+         35923u, 35933u, 35951u, 35963u, 35969u, 35977u, 35983u, 35993u, 35999u, 
+         36007u, 36011u, 36013u, 36017u, 36037u, 36061u, 36067u, 36073u, 36083u, 
+         36097u, 36107u, 36109u, 36131u, 36137u, 36151u, 36161u, 36187u, 36191u, 
+         36209u, 36217u, 36229u, 36241u, 36251u, 36263u, 36269u, 36277u, 36293u, 
+         36299u, 36307u, 36313u, 36319u, 36341u, 36343u, 36353u, 36373u, 36383u, 
+         36389u, 36433u, 36451u, 36457u, 36467u, 36469u, 36473u, 36479u, 36493u, 
+         36497u, 36523u, 36527u, 36529u, 36541u, 36551u, 36559u, 36563u, 36571u, 
+         36583u, 36587u, 36599u, 36607u, 36629u, 36637u, 36643u, 36653u, 36671u, 
+         36677u, 36683u, 36691u, 36697u, 36709u, 36713u, 36721u, 36739u, 36749u, 
+         36761u, 36767u, 36779u, 36781u, 36787u, 36791u, 36793u, 36809u, 36821u, 
+         36833u, 36847u, 36857u, 36871u, 36877u, 36887u, 36899u, 36901u, 36913u, 
+         36919u, 36923u, 36929u, 36931u, 36943u, 36947u, 36973u, 36979u, 36997u, 
+         37003u, 37013u, 37019u, 37021u, 37039u, 37049u, 37057u, 37061u, 37087u, 
+         37097u, 37117u, 37123u, 37139u, 37159u, 37171u, 37181u, 37189u, 37199u, 
+         37201u, 37217u, 37223u, 37243u, 37253u, 37273u, 37277u, 37307u, 37309u, 
+         37313u, 37321u, 37337u, 37339u, 37357u, 37361u, 37363u, 37369u, 37379u, 
+         37397u, 37409u, 37423u, 37441u, 37447u, 37463u, 37483u, 37489u, 37493u, 
+         37501u, 37507u, 37511u, 37517u, 37529u, 37537u, 37547u, 37549u, 37561u, 
+         37567u, 37571u, 37573u, 37579u, 37589u, 37591u, 37607u, 37619u, 37633u, 
+         37643u, 37649u, 37657u, 37663u, 37691u, 37693u, 37699u, 37717u, 37747u, 
+         37781u, 37783u, 37799u, 37811u, 37813u, 37831u, 37847u, 37853u, 37861u, 
+         37871u, 37879u, 37889u, 37897u, 37907u, 37951u, 37957u, 37963u, 37967u, 
+         37987u, 37991u, 37993u, 37997u, 38011u, 38039u, 38047u, 38053u, 38069u, 
+         38083u, 38113u, 38119u, 38149u, 38153u, 38167u, 38177u, 38183u, 38189u, 
+         38197u, 38201u, 38219u, 38231u, 38237u, 38239u, 38261u, 38273u, 38281u, 
+         38287u, 38299u, 38303u, 38317u, 38321u, 38327u, 38329u, 38333u, 38351u, 
+         38371u, 38377u, 38393u, 38431u, 38447u, 38449u, 38453u, 38459u, 38461u, 
+         38501u, 38543u, 38557u, 38561u, 38567u, 38569u, 38593u, 38603u, 38609u, 
+         38611u, 38629u, 38639u, 38651u, 38653u, 38669u, 38671u, 38677u, 38693u, 
+         38699u, 38707u, 38711u, 38713u, 38723u, 38729u, 38737u, 38747u, 38749u, 
+         38767u, 38783u, 38791u, 38803u, 38821u, 38833u, 38839u, 38851u, 38861u, 
+         38867u, 38873u, 38891u, 38903u, 38917u, 38921u, 38923u, 38933u, 38953u, 
+         38959u, 38971u, 38977u, 38993u, 39019u, 39023u, 39041u, 39043u, 39047u, 
+         39079u, 39089u, 39097u, 39103u, 39107u, 39113u, 39119u, 39133u, 39139u, 
+         39157u, 39161u, 39163u, 39181u, 39191u, 39199u, 39209u, 39217u, 39227u, 
+         39229u, 39233u, 39239u, 39241u, 39251u, 39293u, 39301u, 39313u, 39317u, 
+         39323u, 39341u, 39343u, 39359u, 39367u, 39371u, 39373u, 39383u, 39397u, 
+         39409u, 39419u, 39439u, 39443u, 39451u, 39461u, 39499u, 39503u, 39509u, 
+         39511u, 39521u, 39541u, 39551u, 39563u, 39569u, 39581u, 39607u, 39619u, 
+         39623u, 39631u, 39659u, 39667u, 39671u, 39679u, 39703u, 39709u, 39719u, 
+         39727u, 39733u, 39749u, 39761u, 39769u, 39779u, 39791u, 39799u, 39821u, 
+         39827u, 39829u, 39839u, 39841u, 39847u, 39857u, 39863u, 39869u, 39877u, 
+         39883u, 39887u, 39901u, 39929u, 39937u, 39953u, 39971u, 39979u, 39983u, 
+         39989u, 40009u, 40013u, 40031u, 40037u, 40039u, 40063u, 40087u, 40093u, 
+         40099u, 40111u, 40123u, 40127u, 40129u, 40151u, 40153u, 40163u, 40169u, 
+         40177u, 40189u, 40193u, 40213u, 40231u, 40237u, 40241u, 40253u, 40277u, 
+         40283u, 40289u, 40343u, 40351u, 40357u, 40361u, 40387u, 40423u, 40427u, 
+         40429u, 40433u, 40459u, 40471u, 40483u, 40487u, 40493u, 40499u, 40507u, 
+         40519u, 40529u, 40531u, 40543u, 40559u, 40577u, 40583u, 40591u, 40597u, 
+         40609u, 40627u, 40637u, 40639u, 40693u, 40697u, 40699u, 40709u, 40739u, 
+         40751u, 40759u, 40763u, 40771u, 40787u, 40801u, 40813u, 40819u, 40823u, 
+         40829u, 40841u, 40847u, 40849u, 40853u, 40867u, 40879u, 40883u, 40897u, 
+         40903u, 40927u, 40933u, 40939u, 40949u, 40961u, 40973u, 40993u, 41011u, 
+         41017u, 41023u, 41039u, 41047u, 41051u, 41057u, 41077u, 41081u, 41113u, 
+         41117u, 41131u, 41141u, 41143u, 41149u, 41161u, 41177u, 41179u, 41183u, 
+         41189u, 41201u, 41203u, 41213u, 41221u, 41227u, 41231u, 41233u, 41243u, 
+         41257u, 41263u, 41269u, 41281u, 41299u, 41333u, 41341u, 41351u, 41357u, 
+         41381u, 41387u, 41389u, 41399u, 41411u, 41413u, 41443u, 41453u, 41467u, 
+         41479u, 41491u, 41507u, 41513u, 41519u, 41521u, 41539u, 41543u, 41549u, 
+         41579u, 41593u, 41597u, 41603u, 41609u, 41611u, 41617u, 41621u, 41627u, 
+         41641u, 41647u, 41651u, 41659u, 41669u, 41681u, 41687u, 41719u, 41729u, 
+         41737u, 41759u, 41761u, 41771u, 41777u, 41801u, 41809u, 41813u, 41843u, 
+         41849u, 41851u, 41863u, 41879u, 41887u, 41893u, 41897u, 41903u, 41911u, 
+         41927u, 41941u, 41947u, 41953u, 41957u, 41959u, 41969u, 41981u, 41983u, 
+         41999u, 42013u, 42017u, 42019u, 42023u, 42043u, 42061u, 42071u, 42073u, 
+         42083u, 42089u, 42101u, 42131u, 42139u, 42157u, 42169u, 42179u, 42181u, 
+         42187u, 42193u, 42197u, 42209u, 42221u, 42223u, 42227u, 42239u, 42257u, 
+         42281u, 42283u, 42293u, 42299u, 42307u, 42323u, 42331u, 42337u, 42349u, 
+         42359u, 42373u, 42379u, 42391u, 42397u, 42403u, 42407u, 42409u, 42433u, 
+         42437u, 42443u, 42451u, 42457u, 42461u, 42463u, 42467u, 42473u, 42487u, 
+         42491u, 42499u, 42509u, 42533u, 42557u, 42569u, 42571u, 42577u, 42589u, 
+         42611u, 42641u, 42643u, 42649u, 42667u, 42677u, 42683u, 42689u, 42697u, 
+         42701u, 42703u, 42709u, 42719u, 42727u, 42737u, 42743u, 42751u, 42767u, 
+         42773u, 42787u, 42793u, 42797u, 42821u, 42829u, 42839u, 42841u, 42853u, 
+         42859u, 42863u, 42899u, 42901u, 42923u, 42929u, 42937u, 42943u, 42953u, 
+         42961u, 42967u, 42979u, 42989u, 43003u, 43013u, 43019u, 43037u, 43049u, 
+         43051u, 43063u, 43067u, 43093u, 43103u, 43117u, 43133u, 43151u, 43159u, 
+         43177u, 43189u, 43201u, 43207u, 43223u, 43237u, 43261u, 43271u, 43283u, 
+         43291u, 43313u, 43319u, 43321u, 43331u, 43391u, 43397u, 43399u, 43403u, 
+         43411u, 43427u, 43441u, 43451u, 43457u, 43481u, 43487u, 43499u, 43517u, 
+         43541u, 43543u, 43573u, 43577u, 43579u, 43591u, 43597u, 43607u, 43609u, 
+         43613u, 43627u, 43633u, 43649u, 43651u, 43661u, 43669u, 43691u, 43711u, 
+         43717u, 43721u, 43753u, 43759u, 43777u, 43781u, 43783u, 43787u, 43789u, 
+         43793u, 43801u, 43853u, 43867u, 43889u, 43891u, 43913u, 43933u, 43943u, 
+         43951u, 43961u, 43963u, 43969u, 43973u, 43987u, 43991u, 43997u, 44017u, 
+         44021u, 44027u, 44029u, 44041u, 44053u, 44059u, 44071u, 44087u, 44089u, 
+         44101u, 44111u, 44119u, 44123u, 44129u, 44131u, 44159u, 44171u, 44179u, 
+         44189u, 44201u, 44203u, 44207u, 44221u, 44249u, 44257u, 44263u, 44267u, 
+         44269u, 44273u, 44279u, 44281u, 44293u, 44351u, 44357u, 44371u, 44381u, 
+         44383u, 44389u, 44417u, 44449u, 44453u, 44483u, 44491u, 44497u, 44501u, 
+         44507u, 44519u, 44531u, 44533u, 44537u, 44543u, 44549u, 44563u, 44579u, 
+         44587u, 44617u, 44621u, 44623u, 44633u, 44641u, 44647u, 44651u, 44657u, 
+         44683u, 44687u, 44699u, 44701u, 44711u, 44729u, 44741u, 44753u, 44771u, 
+         44773u, 44777u, 44789u, 44797u, 44809u, 44819u, 44839u, 44843u, 44851u, 
+         44867u, 44879u, 44887u, 44893u, 44909u, 44917u, 44927u, 44939u, 44953u, 
+         44959u, 44963u, 44971u, 44983u, 44987u, 45007u, 45013u, 45053u, 45061u, 
+         45077u, 45083u, 45119u, 45121u, 45127u, 45131u, 45137u, 45139u, 45161u, 
+         45179u, 45181u, 45191u, 45197u, 45233u, 45247u, 45259u, 45263u, 45281u, 
+         45289u, 45293u, 45307u, 45317u, 45319u, 45329u, 45337u, 45341u, 45343u, 
+         45361u, 45377u, 45389u, 45403u, 45413u, 45427u, 45433u, 45439u, 45481u, 
+         45491u, 45497u, 45503u, 45523u, 45533u, 45541u, 45553u, 45557u, 45569u, 
+         45587u, 45589u, 45599u, 45613u, 45631u, 45641u, 45659u, 45667u, 45673u, 
+         45677u, 45691u, 45697u, 45707u, 45737u, 45751u, 45757u, 45763u, 45767u, 
+         45779u, 45817u, 45821u, 45823u, 45827u, 45833u, 45841u, 45853u, 45863u, 
+         45869u, 45887u, 45893u, 45943u, 45949u, 45953u, 45959u, 45971u, 45979u, 
+         45989u, 46021u, 46027u, 46049u, 46051u, 46061u, 46073u, 46091u, 46093u, 
+         46099u, 46103u, 46133u, 46141u, 46147u, 46153u, 46171u, 46181u, 46183u, 
+         46187u, 46199u, 46219u, 46229u, 46237u, 46261u, 46271u, 46273u, 46279u, 
+         46301u, 46307u, 46309u, 46327u, 46337u, 46349u, 46351u, 46381u, 46399u, 
+         46411u, 46439u, 46441u, 46447u, 46451u, 46457u, 46471u, 46477u, 46489u, 
+         46499u, 46507u, 46511u, 46523u, 46549u, 46559u, 46567u, 46573u, 46589u, 
+         46591u, 46601u, 46619u, 46633u, 46639u, 46643u, 46649u, 46663u, 46679u, 
+         46681u, 46687u, 46691u, 46703u, 46723u, 46727u, 46747u, 46751u, 46757u, 
+         46769u, 46771u, 46807u, 46811u, 46817u, 46819u, 46829u, 46831u, 46853u, 
+         46861u, 46867u, 46877u, 46889u, 46901u, 46919u, 46933u, 46957u, 46993u, 
+         46997u, 47017u, 47041u, 47051u, 47057u, 47059u, 47087u, 47093u, 47111u, 
+         47119u, 47123u, 47129u, 47137u, 47143u, 47147u, 47149u, 47161u, 47189u, 
+         47207u, 47221u, 47237u, 47251u, 47269u, 47279u, 47287u, 47293u, 47297u, 
+         47303u, 47309u, 47317u, 47339u, 47351u, 47353u, 47363u, 47381u, 47387u, 
+         47389u, 47407u, 47417u, 47419u, 47431u, 47441u, 47459u, 47491u, 47497u, 
+         47501u, 47507u, 47513u, 47521u, 47527u, 47533u, 47543u, 47563u, 47569u, 
+         47581u, 47591u, 47599u, 47609u, 47623u, 47629u, 47639u, 47653u, 47657u, 
+         47659u, 47681u, 47699u, 47701u, 47711u, 47713u, 47717u, 47737u, 47741u, 
+         47743u, 47777u, 47779u, 47791u, 47797u, 47807u, 47809u, 47819u, 47837u, 
+         47843u, 47857u, 47869u, 47881u, 47903u, 47911u, 47917u, 47933u, 47939u, 
+         47947u, 47951u, 47963u, 47969u, 47977u, 47981u, 48017u, 48023u, 48029u, 
+         48049u, 48073u, 48079u, 48091u, 48109u, 48119u, 48121u, 48131u, 48157u, 
+         48163u, 48179u, 48187u, 48193u, 48197u, 48221u, 48239u, 48247u, 48259u, 
+         48271u, 48281u, 48299u, 48311u, 48313u, 48337u, 48341u, 48353u, 48371u, 
+         48383u, 48397u, 48407u, 48409u, 48413u, 48437u, 48449u, 48463u, 48473u, 
+         48479u, 48481u, 48487u, 48491u, 48497u, 48523u, 48527u, 48533u, 48539u, 
+         48541u, 48563u, 48571u, 48589u, 48593u, 48611u, 48619u, 48623u, 48647u, 
+         48649u, 48661u, 48673u, 48677u, 48679u, 48731u, 48733u, 48751u, 48757u, 
+         48761u, 48767u, 48779u, 48781u, 48787u, 48799u, 48809u, 48817u, 48821u, 
+         48823u, 48847u, 48857u, 48859u, 48869u, 48871u, 48883u, 48889u, 48907u, 
+         48947u, 48953u, 48973u, 48989u, 48991u, 49003u, 49009u, 49019u, 49031u, 
+         49033u, 49037u, 49043u, 49057u, 49069u, 49081u, 49103u, 49109u, 49117u, 
+         49121u, 49123u, 49139u, 49157u, 49169u, 49171u, 49177u, 49193u, 49199u, 
+         49201u, 49207u, 49211u, 49223u, 49253u, 49261u, 49277u, 49279u, 49297u, 
+         49307u, 49331u, 49333u, 49339u, 49363u, 49367u, 49369u, 49391u, 49393u, 
+         49409u, 49411u, 49417u, 49429u, 49433u, 49451u, 49459u, 49463u, 49477u, 
+         49481u, 49499u, 49523u, 49529u, 49531u, 49537u, 49547u, 49549u, 49559u, 
+         49597u, 49603u, 49613u, 49627u, 49633u, 49639u, 49663u, 49667u, 49669u, 
+         49681u, 49697u, 49711u, 49727u, 49739u, 49741u, 49747u, 49757u, 49783u, 
+         49787u, 49789u, 49801u, 49807u, 49811u, 49823u, 49831u, 49843u, 49853u, 
+         49871u, 49877u, 49891u, 49919u, 49921u, 49927u, 49937u, 49939u, 49943u, 
+         49957u, 49991u, 49993u, 49999u, 50021u, 50023u, 50033u, 50047u, 50051u, 
+         50053u, 50069u, 50077u, 50087u, 50093u, 50101u, 50111u, 50119u, 50123u, 
+         50129u, 50131u, 50147u, 50153u, 50159u, 50177u, 50207u, 50221u, 50227u, 
+         50231u, 50261u, 50263u, 50273u, 50287u, 50291u, 50311u, 50321u, 50329u, 
+         50333u, 50341u, 50359u, 50363u, 50377u, 50383u, 50387u, 50411u, 50417u, 
+         50423u, 50441u, 50459u, 50461u, 50497u, 50503u, 50513u, 50527u, 50539u, 
+         50543u, 50549u, 50551u, 50581u, 50587u, 50591u, 50593u, 50599u, 50627u, 
+         50647u, 50651u, 50671u, 50683u, 50707u, 50723u, 50741u, 50753u, 50767u, 
+         50773u, 50777u, 50789u, 50821u, 50833u, 50839u, 50849u, 50857u, 50867u, 
+         50873u, 50891u, 50893u, 50909u, 50923u, 50929u, 50951u, 50957u, 50969u, 
+         50971u, 50989u, 50993u, 51001u, 51031u, 51043u, 51047u, 51059u, 51061u, 
+         51071u, 51109u, 51131u, 51133u, 51137u, 51151u, 51157u, 51169u, 51193u, 
+         51197u, 51199u, 51203u, 51217u, 51229u, 51239u, 51241u, 51257u, 51263u, 
+         51283u, 51287u, 51307u, 51329u, 51341u, 51343u, 51347u, 51349u, 51361u, 
+         51383u, 51407u, 51413u, 51419u, 51421u, 51427u, 51431u, 51437u, 51439u, 
+         51449u, 51461u, 51473u, 51479u, 51481u, 51487u, 51503u, 51511u, 51517u, 
+         51521u, 51539u, 51551u, 51563u, 51577u, 51581u, 51593u, 51599u, 51607u, 
+         51613u, 51631u, 51637u, 51647u, 51659u, 51673u, 51679u, 51683u, 51691u, 
+         51713u, 51719u, 51721u, 51749u, 51767u, 51769u, 51787u, 51797u, 51803u, 
+         51817u, 51827u, 51829u, 51839u, 51853u, 51859u, 51869u, 51871u, 51893u, 
+         51899u, 51907u, 51913u, 51929u, 51941u, 51949u, 51971u, 51973u, 51977u, 
+         51991u, 52009u, 52021u, 52027u, 52051u, 52057u, 52067u, 52069u, 52081u, 
+         52103u, 52121u, 52127u, 52147u, 52153u, 52163u, 52177u, 52181u, 52183u, 
+         52189u, 52201u, 52223u, 52237u, 52249u, 52253u, 52259u, 52267u, 52289u, 
+         52291u, 52301u, 52313u, 52321u, 52361u, 52363u, 52369u, 52379u, 52387u, 
+         52391u, 52433u, 52453u, 52457u, 52489u, 52501u, 52511u, 52517u, 52529u, 
+         52541u, 52543u, 52553u, 52561u, 52567u, 52571u, 52579u, 52583u, 52609u, 
+         52627u, 52631u, 52639u, 52667u, 52673u, 52691u, 52697u, 52709u, 52711u, 
+         52721u, 52727u, 52733u, 52747u, 52757u, 52769u, 52783u, 52807u, 52813u, 
+         52817u, 52837u, 52859u, 52861u, 52879u, 52883u, 52889u, 52901u, 52903u, 
+         52919u, 52937u, 52951u, 52957u, 52963u, 52967u, 52973u, 52981u, 52999u, 
+         53003u, 53017u, 53047u, 53051u, 53069u, 53077u, 53087u, 53089u, 53093u, 
+         53101u, 53113u, 53117u, 53129u, 53147u, 53149u, 53161u, 53171u, 53173u, 
+         53189u, 53197u, 53201u, 53231u, 53233u, 53239u, 53267u, 53269u, 53279u, 
+         53281u, 53299u, 53309u, 53323u, 53327u, 53353u, 53359u, 53377u, 53381u, 
+         53401u, 53407u, 53411u, 53419u, 53437u, 53441u, 53453u, 53479u, 53503u, 
+         53507u, 53527u, 53549u, 53551u, 53569u, 53591u, 53593u, 53597u, 53609u, 
+         53611u, 53617u, 53623u, 53629u, 53633u, 53639u, 53653u, 53657u, 53681u, 
+         53693u, 53699u, 53717u, 53719u, 53731u, 53759u, 53773u, 53777u, 53783u, 
+         53791u, 53813u, 53819u, 53831u, 53849u, 53857u, 53861u, 53881u, 53887u, 
+         53891u, 53897u, 53899u, 53917u, 53923u, 53927u, 53939u, 53951u, 53959u, 
+         53987u, 53993u, 54001u, 54011u, 54013u, 54037u, 54049u, 54059u, 54083u, 
+         54091u, 54101u, 54121u, 54133u, 54139u, 54151u, 54163u, 54167u, 54181u, 
+         54193u, 54217u, 54251u, 54269u, 54277u, 54287u, 54293u, 54311u, 54319u, 
+         54323u, 54331u, 54347u, 54361u, 54367u, 54371u, 54377u, 54401u, 54403u, 
+         54409u, 54413u, 54419u, 54421u, 54437u, 54443u, 54449u, 54469u, 54493u, 
+         54497u, 54499u, 54503u, 54517u, 54521u, 54539u, 54541u, 54547u, 54559u, 
+         54563u, 54577u, 54581u, 54583u, 54601u, 54617u, 54623u, 54629u, 54631u, 
+         54647u, 54667u, 54673u, 54679u, 54709u, 54713u, 54721u, 54727u, 54751u, 
+         54767u, 54773u, 54779u, 54787u, 54799u, 54829u, 54833u, 54851u, 54869u, 
+         54877u, 54881u, 54907u, 54917u, 54919u, 54941u, 54949u, 54959u, 54973u, 
+         54979u, 54983u, 55001u, 55009u, 55021u, 55049u, 55051u, 55057u, 55061u, 
+         55073u, 55079u, 55103u, 55109u, 55117u, 55127u, 55147u, 55163u, 55171u, 
+         55201u, 55207u, 55213u, 55217u, 55219u, 55229u, 55243u, 55249u, 55259u, 
+         55291u, 55313u, 55331u, 55333u, 55337u, 55339u, 55343u, 55351u, 55373u, 
+         55381u, 55399u, 55411u, 55439u, 55441u, 55457u, 55469u, 55487u, 55501u, 
+         55511u, 55529u, 55541u, 55547u, 55579u, 55589u, 55603u, 55609u, 55619u, 
+         55621u, 55631u, 55633u, 55639u, 55661u, 55663u, 55667u, 55673u, 55681u, 
+         55691u, 55697u, 55711u, 55717u, 55721u, 55733u, 55763u, 55787u, 55793u, 
+         55799u, 55807u, 55813u, 55817u, 55819u, 55823u, 55829u, 55837u, 55843u, 
+         55849u, 55871u, 55889u, 55897u, 55901u, 55903u, 55921u, 55927u, 55931u, 
+         55933u, 55949u, 55967u, 55987u, 55997u, 56003u, 56009u, 56039u, 56041u, 
+         56053u, 56081u, 56087u, 56093u, 56099u, 56101u, 56113u, 56123u, 56131u, 
+         56149u, 56167u, 56171u, 56179u, 56197u, 56207u, 56209u, 56237u, 56239u, 
+         56249u, 56263u, 56267u, 56269u, 56299u, 56311u, 56333u, 56359u, 56369u, 
+         56377u, 56383u, 56393u, 56401u, 56417u, 56431u, 56437u, 56443u, 56453u, 
+         56467u, 56473u, 56477u, 56479u, 56489u, 56501u, 56503u, 56509u, 56519u, 
+         56527u, 56531u, 56533u, 56543u, 56569u, 56591u, 56597u, 56599u, 56611u, 
+         56629u, 56633u, 56659u, 56663u, 56671u, 56681u, 56687u, 56701u, 56711u, 
+         56713u, 56731u, 56737u, 56747u, 56767u, 56773u, 56779u, 56783u, 56807u, 
+         56809u, 56813u, 56821u, 56827u, 56843u, 56857u, 56873u, 56891u, 56893u, 
+         56897u, 56909u, 56911u, 56921u, 56923u, 56929u, 56941u, 56951u, 56957u, 
+         56963u, 56983u, 56989u, 56993u, 56999u, 57037u, 57041u, 57047u, 57059u, 
+         57073u, 57077u, 57089u, 57097u, 57107u, 57119u, 57131u, 57139u, 57143u, 
+         57149u, 57163u, 57173u, 57179u, 57191u, 57193u, 57203u, 57221u, 57223u, 
+         57241u, 57251u, 57259u, 57269u, 57271u, 57283u, 57287u, 57301u, 57329u, 
+         57331u, 57347u, 57349u, 57367u, 57373u, 57383u, 57389u, 57397u, 57413u, 
+         57427u, 57457u, 57467u, 57487u, 57493u, 57503u, 57527u, 57529u, 57557u, 
+         57559u, 57571u, 57587u, 57593u, 57601u, 57637u, 57641u, 57649u, 57653u, 
+         57667u, 57679u, 57689u, 57697u, 57709u, 57713u, 57719u, 57727u, 57731u, 
+         57737u, 57751u, 57773u, 57781u, 57787u, 57791u, 57793u, 57803u, 57809u, 
+         57829u, 57839u, 57847u, 57853u, 57859u, 57881u, 57899u, 57901u, 57917u, 
+         57923u, 57943u, 57947u, 57973u, 57977u, 57991u, 58013u, 58027u, 58031u, 
+         58043u, 58049u, 58057u, 58061u, 58067u, 58073u, 58099u, 58109u, 58111u, 
+         58129u, 58147u, 58151u, 58153u, 58169u, 58171u, 58189u, 58193u, 58199u, 
+         58207u, 58211u, 58217u, 58229u, 58231u, 58237u, 58243u, 58271u, 58309u, 
+         58313u, 58321u, 58337u, 58363u, 58367u, 58369u, 58379u, 58391u, 58393u, 
+         58403u, 58411u, 58417u, 58427u, 58439u, 58441u, 58451u, 58453u, 58477u, 
+         58481u, 58511u, 58537u, 58543u, 58549u, 58567u, 58573u, 58579u, 58601u, 
+         58603u, 58613u, 58631u, 58657u, 58661u, 58679u, 58687u, 58693u, 58699u, 
+         58711u, 58727u, 58733u, 58741u, 58757u, 58763u, 58771u, 58787u, 58789u, 
+         58831u, 58889u, 58897u, 58901u, 58907u, 58909u, 58913u, 58921u, 58937u, 
+         58943u, 58963u, 58967u, 58979u, 58991u, 58997u, 59009u, 59011u, 59021u, 
+         59023u, 59029u, 59051u, 59053u, 59063u, 59069u, 59077u, 59083u, 59093u, 
+         59107u, 59113u, 59119u, 59123u, 59141u, 59149u, 59159u, 59167u, 59183u, 
+         59197u, 59207u, 59209u, 59219u, 59221u, 59233u, 59239u, 59243u, 59263u, 
+         59273u, 59281u, 59333u, 59341u, 59351u, 59357u, 59359u, 59369u, 59377u, 
+         59387u, 59393u, 59399u, 59407u, 59417u, 59419u, 59441u, 59443u, 59447u, 
+         59453u, 59467u, 59471u, 59473u, 59497u, 59509u, 59513u, 59539u, 59557u, 
+         59561u, 59567u, 59581u, 59611u, 59617u, 59621u, 59627u, 59629u, 59651u, 
+         59659u, 59663u, 59669u, 59671u, 59693u, 59699u, 59707u, 59723u, 59729u, 
+         59743u, 59747u, 59753u, 59771u, 59779u, 59791u, 59797u, 59809u, 59833u, 
+         59863u, 59879u, 59887u, 59921u, 59929u, 59951u, 59957u, 59971u, 59981u, 
+         59999u, 60013u, 60017u, 60029u, 60037u, 60041u, 60077u, 60083u, 60089u, 
+         60091u, 60101u, 60103u, 60107u, 60127u, 60133u, 60139u, 60149u, 60161u, 
+         60167u, 60169u, 60209u, 60217u, 60223u, 60251u, 60257u, 60259u, 60271u, 
+         60289u, 60293u, 60317u, 60331u, 60337u, 60343u, 60353u, 60373u, 60383u, 
+         60397u, 60413u, 60427u, 60443u, 60449u, 60457u, 60493u, 60497u, 60509u, 
+         60521u, 60527u, 60539u, 60589u, 60601u, 60607u, 60611u, 60617u, 60623u, 
+         60631u, 60637u, 60647u, 60649u, 60659u, 60661u, 60679u, 60689u, 60703u, 
+         60719u, 60727u, 60733u, 60737u, 60757u, 60761u, 60763u, 60773u, 60779u, 
+         60793u, 60811u, 60821u, 60859u, 60869u, 60887u, 60889u, 60899u, 60901u, 
+         60913u, 60917u, 60919u, 60923u, 60937u, 60943u, 60953u, 60961u, 61001u, 
+         61007u, 61027u, 61031u, 61043u, 61051u, 61057u, 61091u, 61099u, 61121u, 
+         61129u, 61141u, 61151u, 61153u, 61169u, 61211u, 61223u, 61231u, 61253u, 
+         61261u, 61283u, 61291u, 61297u, 61331u, 61333u, 61339u, 61343u, 61357u, 
+         61363u, 61379u, 61381u, 61403u, 61409u, 61417u, 61441u, 61463u, 61469u, 
+         61471u, 61483u, 61487u, 61493u, 61507u, 61511u, 61519u, 61543u, 61547u, 
+         61553u, 61559u, 61561u, 61583u, 61603u, 61609u, 61613u, 61627u, 61631u, 
+         61637u, 61643u, 61651u, 61657u, 61667u, 61673u, 61681u, 61687u, 61703u, 
+         61717u, 61723u, 61729u, 61751u, 61757u, 61781u, 61813u, 61819u, 61837u, 
+         61843u, 61861u, 61871u, 61879u, 61909u, 61927u, 61933u, 61949u, 61961u, 
+         61967u, 61979u, 61981u, 61987u, 61991u, 62003u, 62011u, 62017u, 62039u, 
+         62047u, 62053u, 62057u, 62071u, 62081u, 62099u, 62119u, 62129u, 62131u, 
+         62137u, 62141u, 62143u, 62171u, 62189u, 62191u, 62201u, 62207u, 62213u, 
+         62219u, 62233u, 62273u, 62297u, 62299u, 62303u, 62311u, 62323u, 62327u, 
+         62347u, 62351u, 62383u, 62401u, 62417u, 62423u, 62459u, 62467u, 62473u, 
+         62477u, 62483u, 62497u, 62501u, 62507u, 62533u, 62539u, 62549u, 62563u, 
+         62581u, 62591u, 62597u, 62603u, 62617u, 62627u, 62633u, 62639u, 62653u, 
+         62659u, 62683u, 62687u, 62701u, 62723u, 62731u, 62743u, 62753u, 62761u, 
+         62773u, 62791u, 62801u, 62819u, 62827u, 62851u, 62861u, 62869u, 62873u, 
+         62897u, 62903u, 62921u, 62927u, 62929u, 62939u, 62969u, 62971u, 62981u, 
+         62983u, 62987u, 62989u, 63029u, 63031u, 63059u, 63067u, 63073u, 63079u, 
+         63097u, 63103u, 63113u, 63127u, 63131u, 63149u, 63179u, 63197u, 63199u, 
+         63211u, 63241u, 63247u, 63277u, 63281u, 63299u, 63311u, 63313u, 63317u, 
+         63331u, 63337u, 63347u, 63353u, 63361u, 63367u, 63377u, 63389u, 63391u, 
+         63397u, 63409u, 63419u, 63421u, 63439u, 63443u, 63463u, 63467u, 63473u, 
+         63487u, 63493u, 63499u, 63521u, 63527u, 63533u, 63541u, 63559u, 63577u, 
+         63587u, 63589u, 63599u, 63601u, 63607u, 63611u, 63617u, 63629u, 63647u, 
+         63649u, 63659u, 63667u, 63671u, 63689u, 63691u, 63697u, 63703u, 63709u, 
+         63719u, 63727u, 63737u, 63743u, 63761u, 63773u, 63781u, 63793u, 63799u, 
+         63803u, 63809u, 63823u, 63839u, 63841u, 63853u, 63857u, 63863u, 63901u, 
+         63907u, 63913u, 63929u, 63949u, 63977u, 63997u, 64007u, 64013u, 64019u, 
+         64033u, 64037u, 64063u, 64067u, 64081u, 64091u, 64109u, 64123u, 64151u, 
+         64153u, 64157u, 64171u, 64187u, 64189u, 64217u, 64223u, 64231u, 64237u, 
+         64271u, 64279u, 64283u, 64301u, 64303u, 64319u, 64327u, 64333u, 64373u, 
+         64381u, 64399u, 64403u, 64433u, 64439u, 64451u, 64453u, 64483u, 64489u, 
+         64499u, 64513u, 64553u, 64567u, 64577u, 64579u, 64591u, 64601u, 64609u, 
+         64613u, 64621u, 64627u, 64633u, 64661u, 64663u, 64667u, 64679u, 64693u, 
+         64709u, 64717u, 64747u, 64763u, 64781u, 64783u, 64793u, 64811u, 64817u, 
+         64849u, 64853u, 64871u, 64877u, 64879u, 64891u, 64901u, 64919u, 64921u, 
+         64927u, 64937u, 64951u, 64969u, 64997u, 65003u, 65011u, 65027u, 65029u, 
+         65033u, 65053u, 65063u, 65071u, 65089u, 65099u, 65101u, 65111u, 65119u, 
+         65123u, 65129u, 65141u, 65147u, 65167u, 65171u, 65173u, 65179u, 65183u, 
+         65203u, 65213u, 65239u, 65257u, 65267u, 65269u, 65287u, 65293u, 65309u, 
+         65323u, 65327u, 65353u, 65357u, 65371u, 65381u, 65393u, 65407u, 65413u, 
+         65419u, 65423u, 65437u, 65447u, 65449u, 65479u, 65497u, 65519u, 65521u
+      }};
+      static const boost::array<boost::uint16_t, 3458> a3 = {{
+         2u, 4u, 8u, 16u, 22u, 28u, 44u, 
+         46u, 52u, 64u, 74u, 82u, 94u, 98u, 112u, 
+         116u, 122u, 142u, 152u, 164u, 166u, 172u, 178u, 
+         182u, 184u, 194u, 196u, 226u, 242u, 254u, 274u, 
+         292u, 296u, 302u, 304u, 308u, 316u, 332u, 346u, 
+         364u, 386u, 392u, 394u, 416u, 422u, 428u, 446u, 
+         448u, 458u, 494u, 502u, 506u, 512u, 532u, 536u, 
+         548u, 554u, 568u, 572u, 574u, 602u, 626u, 634u, 
+         638u, 644u, 656u, 686u, 704u, 736u, 758u, 766u, 
+         802u, 808u, 812u, 824u, 826u, 838u, 842u, 848u, 
+         868u, 878u, 896u, 914u, 922u, 928u, 932u, 956u, 
+         964u, 974u, 988u, 994u, 998u, 1006u, 1018u, 1034u, 
+         1036u, 1052u, 1058u, 1066u, 1082u, 1094u, 1108u, 1118u, 
+         1148u, 1162u, 1166u, 1178u, 1186u, 1198u, 1204u, 1214u, 
+         1216u, 1228u, 1256u, 1262u, 1274u, 1286u, 1306u, 1316u, 
+         1318u, 1328u, 1342u, 1348u, 1354u, 1384u, 1388u, 1396u, 
+         1408u, 1412u, 1414u, 1424u, 1438u, 1442u, 1468u, 1486u, 
+         1498u, 1508u, 1514u, 1522u, 1526u, 1538u, 1544u, 1568u, 
+         1586u, 1594u, 1604u, 1606u, 1618u, 1622u, 1634u, 1646u, 
+         1652u, 1654u, 1676u, 1678u, 1682u, 1684u, 1696u, 1712u, 
+         1726u, 1736u, 1738u, 1754u, 1772u, 1804u, 1808u, 1814u, 
+         1834u, 1856u, 1864u, 1874u, 1876u, 1886u, 1892u, 1894u, 
+         1898u, 1912u, 1918u, 1942u, 1946u, 1954u, 1958u, 1964u, 
+         1976u, 1988u, 1996u, 2002u, 2012u, 2024u, 2032u, 2042u, 
+         2044u, 2054u, 2066u, 2072u, 2084u, 2096u, 2116u, 2144u, 
+         2164u, 2174u, 2188u, 2198u, 2206u, 2216u, 2222u, 2224u, 
+         2228u, 2242u, 2248u, 2254u, 2266u, 2272u, 2284u, 2294u, 
+         2308u, 2318u, 2332u, 2348u, 2356u, 2366u, 2392u, 2396u, 
+         2398u, 2404u, 2408u, 2422u, 2426u, 2432u, 2444u, 2452u, 
+         2458u, 2488u, 2506u, 2518u, 2524u, 2536u, 2552u, 2564u, 
+         2576u, 2578u, 2606u, 2612u, 2626u, 2636u, 2672u, 2674u, 
+         2678u, 2684u, 2692u, 2704u, 2726u, 2744u, 2746u, 2776u, 
+         2794u, 2816u, 2836u, 2854u, 2864u, 2902u, 2908u, 2912u, 
+         2914u, 2938u, 2942u, 2948u, 2954u, 2956u, 2966u, 2972u, 
+         2986u, 2996u, 3004u, 3008u, 3032u, 3046u, 3062u, 3076u, 
+         3098u, 3104u, 3124u, 3134u, 3148u, 3152u, 3164u, 3176u, 
+         3178u, 3194u, 3202u, 3208u, 3214u, 3232u, 3236u, 3242u, 
+         3256u, 3278u, 3284u, 3286u, 3328u, 3344u, 3346u, 3356u, 
+         3362u, 3364u, 3368u, 3374u, 3382u, 3392u, 3412u, 3428u, 
+         3458u, 3466u, 3476u, 3484u, 3494u, 3496u, 3526u, 3532u, 
+         3538u, 3574u, 3584u, 3592u, 3608u, 3614u, 3616u, 3628u, 
+         3656u, 3658u, 3662u, 3668u, 3686u, 3698u, 3704u, 3712u, 
+         3722u, 3724u, 3728u, 3778u, 3782u, 3802u, 3806u, 3836u, 
+         3844u, 3848u, 3854u, 3866u, 3868u, 3892u, 3896u, 3904u, 
+         3922u, 3928u, 3932u, 3938u, 3946u, 3956u, 3958u, 3962u, 
+         3964u, 4004u, 4022u, 4058u, 4088u, 4118u, 4126u, 4142u, 
+         4156u, 4162u, 4174u, 4202u, 4204u, 4226u, 4228u, 4232u, 
+         4244u, 4274u, 4286u, 4292u, 4294u, 4298u, 4312u, 4322u, 
+         4324u, 4342u, 4364u, 4376u, 4394u, 4396u, 4406u, 4424u, 
+         4456u, 4462u, 4466u, 4468u, 4474u, 4484u, 4504u, 4516u, 
+         4526u, 4532u, 4544u, 4564u, 4576u, 4582u, 4586u, 4588u, 
+         4604u, 4606u, 4622u, 4628u, 4642u, 4646u, 4648u, 4664u, 
+         4666u, 4672u, 4688u, 4694u, 4702u, 4706u, 4714u, 4736u, 
+         4754u, 4762u, 4774u, 4778u, 4786u, 4792u, 4816u, 4838u, 
+         4844u, 4846u, 4858u, 4888u, 4894u, 4904u, 4916u, 4922u, 
+         4924u, 4946u, 4952u, 4954u, 4966u, 4972u, 4994u, 5002u, 
+         5014u, 5036u, 5038u, 5048u, 5054u, 5072u, 5084u, 5086u, 
+         5092u, 5104u, 5122u, 5128u, 5132u, 5152u, 5174u, 5182u, 
+         5194u, 5218u, 5234u, 5248u, 5258u, 5288u, 5306u, 5308u, 
+         5314u, 5318u, 5332u, 5342u, 5344u, 5356u, 5366u, 5378u, 
+         5384u, 5386u, 5402u, 5414u, 5416u, 5422u, 5434u, 5444u, 
+         5446u, 5456u, 5462u, 5464u, 5476u, 5488u, 5504u, 5524u, 
+         5534u, 5546u, 5554u, 5584u, 5594u, 5608u, 5612u, 5618u, 
+         5626u, 5632u, 5636u, 5656u, 5674u, 5698u, 5702u, 5714u, 
+         5722u, 5726u, 5728u, 5752u, 5758u, 5782u, 5792u, 5794u, 
+         5798u, 5804u, 5806u, 5812u, 5818u, 5824u, 5828u, 5852u, 
+         5854u, 5864u, 5876u, 5878u, 5884u, 5894u, 5902u, 5908u, 
+         5918u, 5936u, 5938u, 5944u, 5948u, 5968u, 5992u, 6002u, 
+         6014u, 6016u, 6028u, 6034u, 6058u, 6062u, 6098u, 6112u, 
+         6128u, 6136u, 6158u, 6164u, 6172u, 6176u, 6178u, 6184u, 
+         6206u, 6226u, 6242u, 6254u, 6272u, 6274u, 6286u, 6302u, 
+         6308u, 6314u, 6326u, 6332u, 6344u, 6346u, 6352u, 6364u, 
+         6374u, 6382u, 6398u, 6406u, 6412u, 6428u, 6436u, 6448u, 
+         6452u, 6458u, 6464u, 6484u, 6496u, 6508u, 6512u, 6518u, 
+         6538u, 6542u, 6554u, 6556u, 6566u, 6568u, 6574u, 6604u, 
+         6626u, 6632u, 6634u, 6638u, 6676u, 6686u, 6688u, 6692u, 
+         6694u, 6716u, 6718u, 6734u, 6736u, 6742u, 6752u, 6772u, 
+         6778u, 6802u, 6806u, 6818u, 6832u, 6844u, 6848u, 6886u, 
+         6896u, 6926u, 6932u, 6934u, 6946u, 6958u, 6962u, 6968u, 
+         6998u, 7012u, 7016u, 7024u, 7042u, 7078u, 7082u, 7088u, 
+         7108u, 7112u, 7114u, 7126u, 7136u, 7138u, 7144u, 7154u, 
+         7166u, 7172u, 7184u, 7192u, 7198u, 7204u, 7228u, 7232u, 
+         7262u, 7282u, 7288u, 7324u, 7334u, 7336u, 7348u, 7354u, 
+         7358u, 7366u, 7372u, 7376u, 7388u, 7396u, 7402u, 7414u, 
+         7418u, 7424u, 7438u, 7442u, 7462u, 7474u, 7478u, 7484u, 
+         7502u, 7504u, 7508u, 7526u, 7528u, 7544u, 7556u, 7586u, 
+         7592u, 7598u, 7606u, 7646u, 7654u, 7702u, 7708u, 7724u, 
+         7742u, 7756u, 7768u, 7774u, 7792u, 7796u, 7816u, 7826u, 
+         7828u, 7834u, 7844u, 7852u, 7882u, 7886u, 7898u, 7918u, 
+         7924u, 7936u, 7942u, 7948u, 7982u, 7988u, 7994u, 8012u, 
+         8018u, 8026u, 8036u, 8048u, 8054u, 8062u, 8072u, 8074u, 
+         8078u, 8102u, 8108u, 8116u, 8138u, 8144u, 8146u, 8158u, 
+         8164u, 8174u, 8186u, 8192u, 8216u, 8222u, 8236u, 8248u, 
+         8284u, 8288u, 8312u, 8314u, 8324u, 8332u, 8342u, 8348u, 
+         8362u, 8372u, 8404u, 8408u, 8416u, 8426u, 8438u, 8464u, 
+         8482u, 8486u, 8492u, 8512u, 8516u, 8536u, 8542u, 8558u, 
+         8564u, 8566u, 8596u, 8608u, 8614u, 8624u, 8626u, 8632u, 
+         8642u, 8654u, 8662u, 8666u, 8668u, 8674u, 8684u, 8696u, 
+         8722u, 8744u, 8752u, 8758u, 8762u, 8776u, 8782u, 8788u, 
+         8818u, 8822u, 8828u, 8842u, 8846u, 8848u, 8876u, 8878u, 
+         8884u, 8906u, 8914u, 8918u, 8936u, 8954u, 8972u, 8974u, 
+         8986u, 8992u, 8996u, 9016u, 9026u, 9032u, 9038u, 9052u, 
+         9062u, 9074u, 9076u, 9088u, 9118u, 9152u, 9164u, 9172u, 
+         9178u, 9182u, 9184u, 9194u, 9196u, 9212u, 9224u, 9226u, 
+         9236u, 9244u, 9262u, 9286u, 9292u, 9296u, 9308u, 9322u, 
+         9326u, 9334u, 9338u, 9352u, 9356u, 9362u, 9368u, 9388u, 
+         9394u, 9398u, 9406u, 9424u, 9476u, 9478u, 9482u, 9494u, 
+         9502u, 9506u, 9544u, 9548u, 9574u, 9598u, 9614u, 9626u, 
+         9632u, 9634u, 9646u, 9658u, 9674u, 9676u, 9682u, 9688u, 
+         9692u, 9704u, 9718u, 9734u, 9742u, 9754u, 9772u, 9788u, 
+         9794u, 9802u, 9812u, 9818u, 9832u, 9842u, 9854u, 9856u, 
+         9866u, 9868u, 9872u, 9896u, 9902u, 9944u, 9968u, 9976u, 
+         9986u, 9992u, 9998u, 10004u, 10006u, 10018u, 10022u, 10036u, 
+         10042u, 10048u, 10076u, 10082u, 10084u, 10094u, 10106u, 10118u, 
+         10124u, 10144u, 10148u, 10154u, 10168u, 10172u, 10174u, 10186u, 
+         10196u, 10208u, 10232u, 10238u, 10246u, 10252u, 10258u, 10262u, 
+         10286u, 10298u, 10318u, 10334u, 10348u, 10378u, 10396u, 10402u, 
+         10406u, 10432u, 10444u, 10448u, 10454u, 10456u, 10462u, 10466u, 
+         10468u, 10496u, 10504u, 10544u, 10546u, 10556u, 10564u, 10568u, 
+         10588u, 10594u, 10612u, 10622u, 10624u, 10628u, 10672u, 10678u, 
+         10696u, 10708u, 10714u, 10718u, 10724u, 10726u, 10748u, 10754u, 
+         10768u, 10798u, 10808u, 10832u, 10834u, 10844u, 10852u, 10868u, 
+         10886u, 10888u, 10906u, 10928u, 10936u, 10946u, 10952u, 10958u, 
+         10972u, 10976u, 10984u, 11002u, 11006u, 11008u, 11026u, 11044u, 
+         11062u, 11068u, 11072u, 11096u, 11114u, 11116u, 11132u, 11138u, 
+         11144u, 11162u, 11182u, 11198u, 11218u, 11222u, 11236u, 11242u, 
+         11246u, 11266u, 11284u, 11294u, 11296u, 11302u, 11312u, 11336u, 
+         11338u, 11348u, 11372u, 11378u, 11384u, 11408u, 11414u, 11426u, 
+         11428u, 11456u, 11468u, 11482u, 11488u, 11494u, 11506u, 11512u, 
+         11534u, 11546u, 11558u, 11566u, 11602u, 11606u, 11618u, 11632u, 
+         11636u, 11656u, 11666u, 11678u, 11702u, 11704u, 11708u, 11714u, 
+         11726u, 11728u, 11732u, 11734u, 11744u, 11756u, 11782u, 11788u, 
+         11804u, 11812u, 11816u, 11824u, 11834u, 11842u, 11848u, 11882u, 
+         11884u, 11896u, 11912u, 11936u, 11942u, 11944u, 11954u, 11956u, 
+         11974u, 11978u, 11986u, 11992u, 12008u, 12014u, 12016u, 12022u, 
+         12028u, 12034u, 12038u, 12052u, 12056u, 12076u, 12082u, 12086u, 
+         12106u, 12112u, 12124u, 12146u, 12152u, 12154u, 12164u, 12176u, 
+         12178u, 12184u, 12188u, 12196u, 12208u, 12212u, 12226u, 12238u, 
+         12248u, 12262u, 12266u, 12278u, 12304u, 12314u, 12328u, 12332u, 
+         12358u, 12364u, 12394u, 12398u, 12416u, 12434u, 12442u, 12448u, 
+         12464u, 12472u, 12482u, 12496u, 12506u, 12514u, 12524u, 12544u, 
+         12566u, 12586u, 12602u, 12604u, 12622u, 12628u, 12632u, 12638u, 
+         12644u, 12656u, 12658u, 12668u, 12694u, 12698u, 12706u, 12724u, 
+         12742u, 12748u, 12766u, 12772u, 12776u, 12782u, 12806u, 12812u, 
+         12832u, 12866u, 12892u, 12902u, 12904u, 12932u, 12944u, 12952u, 
+         12962u, 12974u, 12976u, 12982u, 13004u, 13006u, 13018u, 13034u, 
+         13036u, 13042u, 13048u, 13058u, 13072u, 13088u, 13108u, 13114u, 
+         13118u, 13156u, 13162u, 13172u, 13178u, 13186u, 13202u, 13244u, 
+         13246u, 13252u, 13256u, 13262u, 13268u, 13274u, 13288u, 13304u, 
+         13318u, 13322u, 13342u, 13352u, 13354u, 13358u, 13366u, 13384u, 
+         13394u, 13406u, 13442u, 13444u, 13454u, 13496u, 13504u, 13508u, 
+         13528u, 13552u, 13568u, 13576u, 13598u, 13604u, 13612u, 13616u, 
+         13618u, 13624u, 13646u, 13652u, 13658u, 13666u, 13694u, 13696u, 
+         13706u, 13724u, 13738u, 13744u, 13748u, 13766u, 13774u, 13784u, 
+         13798u, 13802u, 13814u, 13822u, 13832u, 13844u, 13858u, 13862u, 
+         13864u, 13876u, 13888u, 13892u, 13898u, 13916u, 13946u, 13958u, 
+         13996u, 14002u, 14014u, 14024u, 14026u, 14044u, 14054u, 14066u, 
+         14074u, 14078u, 14086u, 14092u, 14096u, 14098u, 14122u, 14134u, 
+         14152u, 14156u, 14158u, 14162u, 14164u, 14222u, 14234u, 14242u, 
+         14266u, 14276u, 14278u, 14282u, 14288u, 14294u, 14306u, 14308u, 
+         14312u, 14326u, 14332u, 14338u, 14354u, 14366u, 14368u, 14372u, 
+         14404u, 14408u, 14432u, 14438u, 14444u, 14452u, 14462u, 14464u, 
+         14486u, 14504u, 14516u, 14536u, 14542u, 14572u, 14576u, 14606u, 
+         14612u, 14614u, 14618u, 14632u, 14638u, 14642u, 14656u, 14672u, 
+         14674u, 14686u, 14696u, 14698u, 14704u, 14716u, 14728u, 14738u, 
+         14744u, 14752u, 14774u, 14782u, 14794u, 14806u, 14812u, 14828u, 
+         14834u, 14852u, 14872u, 14894u, 14912u, 14914u, 14936u, 14938u, 
+         14954u, 14956u, 14978u, 14992u, 15002u, 15022u, 15032u, 15064u, 
+         15068u, 15076u, 15086u, 15092u, 15094u, 15116u, 15122u, 15134u, 
+         15136u, 15142u, 15146u, 15148u, 15152u, 15166u, 15178u, 15202u, 
+         15212u, 15214u, 15226u, 15242u, 15244u, 15248u, 15254u, 15268u, 
+         15274u, 15284u, 15296u, 15298u, 15314u, 15328u, 15362u, 15374u, 
+         15376u, 15382u, 15388u, 15394u, 15398u, 15418u, 15428u, 15454u, 
+         15466u, 15478u, 15482u, 15484u, 15488u, 15496u, 15506u, 15508u, 
+         15512u, 15514u, 15536u, 15542u, 15548u, 15562u, 15566u, 15584u, 
+         15596u, 15622u, 15628u, 15638u, 15646u, 15662u, 15664u, 15668u, 
+         15688u, 15698u, 15704u, 15746u, 15748u, 15758u, 15764u, 15772u, 
+         15796u, 15808u, 15814u, 15818u, 15824u, 15836u, 15838u, 15866u, 
+         15874u, 15886u, 15904u, 15922u, 15928u, 15974u, 15982u, 15992u, 
+         15998u, 16012u, 16016u, 16018u, 16024u, 16028u, 16034u, 16076u, 
+         16084u, 16094u, 16102u, 16112u, 16114u, 16132u, 16136u, 16142u, 
+         16154u, 16166u, 16168u, 16172u, 16192u, 16202u, 16214u, 16226u, 
+         16234u, 16238u, 16264u, 16282u, 16304u, 16312u, 16318u, 16334u, 
+         16348u, 16364u, 16366u, 16384u, 16394u, 16396u, 16402u, 16408u, 
+         16418u, 16432u, 16436u, 16438u, 16468u, 16472u, 16474u, 16478u, 
+         16486u, 16496u, 16502u, 16504u, 16516u, 16532u, 16538u, 16594u, 
+         16604u, 16606u, 16618u, 16628u, 16636u, 16648u, 16654u, 16658u, 
+         16672u, 16682u, 16684u, 16688u, 16696u, 16702u, 16706u, 16726u, 
+         16732u, 16744u, 16766u, 16772u, 16804u, 16814u, 16816u, 16826u, 
+         16838u, 16852u, 16858u, 16886u, 16922u, 16928u, 16934u, 16936u, 
+         16948u, 16952u, 16958u, 16964u, 16972u, 16994u, 16996u, 17014u, 
+         17024u, 17026u, 17032u, 17036u, 17056u, 17066u, 17074u, 17078u, 
+         17084u, 17098u, 17116u, 17122u, 17164u, 17186u, 17188u, 17192u, 
+         17194u, 17222u, 17224u, 17228u, 17246u, 17252u, 17258u, 17264u, 
+         17276u, 17278u, 17302u, 17312u, 17348u, 17354u, 17356u, 17368u, 
+         17378u, 17404u, 17428u, 17446u, 17462u, 17468u, 17474u, 17488u, 
+         17512u, 17524u, 17528u, 17536u, 17542u, 17554u, 17558u, 17566u, 
+         17582u, 17602u, 17642u, 17668u, 17672u, 17684u, 17686u, 17692u, 
+         17696u, 17698u, 17708u, 17722u, 17732u, 17734u, 17738u, 17764u, 
+         17776u, 17804u, 17806u, 17822u, 17848u, 17854u, 17864u, 17866u, 
+         17872u, 17882u, 17888u, 17896u, 17902u, 17908u, 17914u, 17924u, 
+         17936u, 17942u, 17962u, 18002u, 18022u, 18026u, 18028u, 18044u, 
+         18056u, 18062u, 18074u, 18082u, 18086u, 18104u, 18106u, 18118u, 
+         18128u, 18154u, 18166u, 18182u, 18184u, 18202u, 18226u, 18238u, 
+         18242u, 18256u, 18278u, 18298u, 18308u, 18322u, 18334u, 18338u, 
+         18356u, 18368u, 18376u, 18386u, 18398u, 18404u, 18434u, 18448u, 
+         18452u, 18476u, 18482u, 18512u, 18518u, 18524u, 18526u, 18532u, 
+         18554u, 18586u, 18592u, 18596u, 18602u, 18608u, 18628u, 18644u, 
+         18646u, 18656u, 18664u, 18676u, 18686u, 18688u, 18694u, 18704u, 
+         18712u, 18728u, 18764u, 18772u, 18778u, 18782u, 18784u, 18812u, 
+         18814u, 18842u, 18854u, 18856u, 18866u, 18872u, 18886u, 18896u, 
+         18902u, 18908u, 18914u, 18922u, 18928u, 18932u, 18946u, 18964u, 
+         18968u, 18974u, 18986u, 18988u, 18998u, 19016u, 19024u, 19054u, 
+         19094u, 19096u, 19114u, 19118u, 19124u, 19138u, 19156u, 19162u, 
+         19166u, 19178u, 19184u, 19196u, 19202u, 19216u, 19226u, 19252u, 
+         19258u, 19274u, 19276u, 19292u, 19322u, 19324u, 19334u, 19336u, 
+         19378u, 19384u, 19412u, 19426u, 19432u, 19442u, 19444u, 19456u, 
+         19474u, 19486u, 19492u, 19502u, 19514u, 19526u, 19546u, 19552u, 
+         19556u, 19558u, 19568u, 19574u, 19586u, 19598u, 19612u, 19624u, 
+         19658u, 19664u, 19666u, 19678u, 19688u, 19694u, 19702u, 19708u, 
+         19712u, 19724u, 19762u, 19768u, 19778u, 19796u, 19798u, 19826u, 
+         19828u, 19834u, 19846u, 19876u, 19892u, 19894u, 19904u, 19912u, 
+         19916u, 19918u, 19934u, 19952u, 19978u, 19982u, 19988u, 19996u, 
+         20014u, 20036u, 20042u, 20062u, 20066u, 20072u, 20084u, 20086u, 
+         20092u, 20104u, 20108u, 20126u, 20132u, 20134u, 20156u, 20168u, 
+         20176u, 20182u, 20198u, 20216u, 20246u, 20258u, 20282u, 20284u, 
+         20294u, 20296u, 20302u, 20308u, 20312u, 20318u, 20354u, 20368u, 
+         20374u, 20396u, 20398u, 20456u, 20464u, 20476u, 20482u, 20492u, 
+         20494u, 20534u, 20542u, 20548u, 20576u, 20578u, 20582u, 20596u, 
+         20602u, 20608u, 20626u, 20636u, 20644u, 20648u, 20662u, 20666u, 
+         20674u, 20704u, 20708u, 20714u, 20722u, 20728u, 20734u, 20752u, 
+         20756u, 20758u, 20762u, 20776u, 20788u, 20806u, 20816u, 20818u, 
+         20822u, 20834u, 20836u, 20846u, 20854u, 20864u, 20878u, 20888u, 
+         20906u, 20918u, 20926u, 20932u, 20942u, 20956u, 20966u, 20974u, 
+         20996u, 20998u, 21004u, 21026u, 21038u, 21044u, 21052u, 21064u, 
+         21092u, 21094u, 21142u, 21154u, 21158u, 21176u, 21184u, 21194u, 
+         21208u, 21218u, 21232u, 21236u, 21248u, 21278u, 21302u, 21308u, 
+         21316u, 21322u, 21326u, 21334u, 21388u, 21392u, 21394u, 21404u, 
+         21416u, 21424u, 21434u, 21446u, 21458u, 21476u, 21478u, 21502u, 
+         21506u, 21514u, 21536u, 21548u, 21568u, 21572u, 21584u, 21586u, 
+         21598u, 21614u, 21616u, 21644u, 21646u, 21652u, 21676u, 21686u, 
+         21688u, 21716u, 21718u, 21722u, 21742u, 21746u, 21758u, 21764u, 
+         21778u, 21782u, 21788u, 21802u, 21824u, 21848u, 21868u, 21872u, 
+         21886u, 21892u, 21898u, 21908u, 21938u, 21946u, 21956u, 21974u, 
+         21976u, 21982u, 21988u, 22004u, 22006u, 22012u, 22018u, 22022u, 
+         22024u, 22048u, 22052u, 22054u, 22078u, 22088u, 22094u, 22096u, 
+         22106u, 22108u, 22114u, 22136u, 22144u, 22148u, 22156u, 22162u, 
+         22166u, 22184u, 22186u, 22204u, 22208u, 22216u, 22232u, 22258u, 
+         22262u, 22268u, 22276u, 22298u, 22318u, 22334u, 22342u, 22346u, 
+         22352u, 22376u, 22382u, 22396u, 22408u, 22424u, 22426u, 22438u, 
+         22442u, 22456u, 22466u, 22468u, 22472u, 22484u, 22502u, 22534u, 
+         22544u, 22558u, 22582u, 22594u, 22634u, 22642u, 22676u, 22688u, 
+         22702u, 22706u, 22724u, 22726u, 22754u, 22766u, 22786u, 22792u, 
+         22802u, 22804u, 22844u, 22862u, 22876u, 22888u, 22892u, 22928u, 
+         22934u, 22936u, 22958u, 22964u, 22978u, 22988u, 23012u, 23054u, 
+         23056u, 23072u, 23074u, 23108u, 23116u, 23122u, 23126u, 23128u, 
+         23132u, 23146u, 23186u, 23194u, 23206u, 23212u, 23236u, 23254u, 
+         23258u, 23264u, 23266u, 23272u, 23276u, 23278u, 23282u, 23284u, 
+         23308u, 23318u, 23326u, 23332u, 23338u, 23348u, 23362u, 23368u, 
+         23384u, 23402u, 23416u, 23434u, 23458u, 23462u, 23468u, 23474u, 
+         23482u, 23486u, 23506u, 23516u, 23522u, 23534u, 23536u, 23548u, 
+         23552u, 23566u, 23572u, 23578u, 23584u, 23588u, 23602u, 23618u, 
+         23654u, 23668u, 23674u, 23678u, 23692u, 23696u, 23702u, 23726u, 
+         23734u, 23738u, 23758u, 23768u, 23782u, 23794u, 23828u, 23836u, 
+         23846u, 23852u, 23858u, 23864u, 23878u, 23882u, 23896u, 23908u, 
+         23914u, 23924u, 23942u, 23956u, 23966u, 23978u, 23984u, 23986u, 
+         23992u, 23998u, 24026u, 24028u, 24032u, 24056u, 24062u, 24064u, 
+         24068u, 24076u, 24092u, 24098u, 24118u, 24122u, 24124u, 24134u, 
+         24136u, 24146u, 24154u, 24218u, 24224u, 24232u, 24244u, 24248u, 
+         24262u, 24274u, 24284u, 24286u, 24298u, 24304u, 24314u, 24332u, 
+         24356u, 24362u, 24364u, 24374u, 24382u, 24388u, 24404u, 24424u, 
+         24428u, 24442u, 24448u, 24454u, 24466u, 24472u, 24476u, 24482u, 
+         24484u, 24488u, 24496u, 24518u, 24524u, 24532u, 24536u, 24538u, 
+         24554u, 24572u, 24586u, 24592u, 24614u, 24628u, 24638u, 24652u, 
+         24656u, 24662u, 24664u, 24668u, 24682u, 24692u, 24704u, 24712u, 
+         24728u, 24736u, 24746u, 24754u, 24778u, 24818u, 24824u, 24836u, 
+         24838u, 24844u, 24862u, 24866u, 24868u, 24872u, 24902u, 24904u, 
+         24934u, 24938u, 24946u, 24964u, 24976u, 24988u, 24992u, 24994u, 
+         24998u, 25012u, 25048u, 25064u, 25082u, 25084u, 25096u, 25106u, 
+         25112u, 25124u, 25142u, 25144u, 25162u, 25168u, 25174u, 25196u, 
+         25214u, 25252u, 25258u, 25268u, 25286u, 25288u, 25298u, 25306u, 
+         25312u, 25328u, 25352u, 25366u, 25372u, 25376u, 25382u, 25396u, 
+         25412u, 25436u, 25442u, 25454u, 25462u, 25474u, 25484u, 25498u, 
+         25544u, 25546u, 25562u, 25564u, 25586u, 25592u, 25594u, 25604u, 
+         25606u, 25616u, 25618u, 25624u, 25628u, 25648u, 25658u, 25664u, 
+         25694u, 25702u, 25708u, 25714u, 25718u, 25748u, 25756u, 25762u, 
+         25768u, 25774u, 25796u, 25832u, 25834u, 25838u, 25846u, 25852u, 
+         25858u, 25862u, 25876u, 25888u, 25898u, 25918u, 25922u, 25924u, 
+         25928u, 25958u, 25964u, 25978u, 25994u, 26006u, 26036u, 26038u, 
+         26042u, 26048u, 26056u, 26086u, 26096u, 26104u, 26138u, 26156u, 
+         26168u, 26176u, 26198u, 26218u, 26222u, 26236u, 26246u, 26266u, 
+         26272u, 26276u, 26278u, 26288u, 26302u, 26306u, 26332u, 26338u, 
+         26374u, 26386u, 26404u, 26408u, 26416u, 26422u, 26426u, 26432u, 
+         26434u, 26462u, 26468u, 26474u, 26498u, 26506u, 26516u, 26542u, 
+         26548u, 26572u, 26576u, 26584u, 26608u, 26618u, 26638u, 26642u, 
+         26644u, 26654u, 26668u, 26684u, 26686u, 26692u, 26698u, 26702u, 
+         26708u, 26716u, 26734u, 26762u, 26776u, 26782u, 26798u, 26812u, 
+         26818u, 26822u, 26828u, 26834u, 26842u, 26846u, 26848u, 26852u, 
+         26864u, 26866u, 26878u, 26884u, 26896u, 26924u, 26926u, 26932u, 
+         26944u, 26954u, 26968u, 26972u, 27016u, 27022u, 27032u, 27034u, 
+         27046u, 27058u, 27088u, 27092u, 27104u, 27106u, 27112u, 27122u, 
+         27134u, 27136u, 27146u, 27148u, 27158u, 27164u, 27172u, 27182u, 
+         27188u, 27202u, 27218u, 27226u, 27232u, 27244u, 27254u, 27256u, 
+         27266u, 27274u, 27286u, 27296u, 27314u, 27322u, 27326u, 27328u, 
+         27332u, 27358u, 27364u, 27386u, 27392u, 27406u, 27416u, 27422u, 
+         27424u, 27452u, 27458u, 27466u, 27512u, 27518u, 27524u, 27542u, 
+         27548u, 27554u, 27562u, 27568u, 27578u, 27596u, 27598u, 27604u, 
+         27616u, 27634u, 27644u, 27652u, 27664u, 27694u, 27704u, 27706u, 
+         27716u, 27718u, 27722u, 27728u, 27746u, 27748u, 27752u, 27772u, 
+         27784u, 27788u, 27794u, 27802u, 27836u, 27842u, 27848u, 27872u, 
+         27884u, 27892u, 27928u, 27944u, 27946u, 27952u, 27956u, 27958u, 
+         27962u, 27968u, 27988u, 27994u, 28018u, 28022u, 28024u, 28028u, 
+         28046u, 28066u, 28072u, 28094u, 28102u, 28148u, 28166u, 28168u, 
+         28184u, 28204u, 28226u, 28228u, 28252u, 28274u, 28276u, 28292u, 
+         28316u, 28336u, 28352u, 28354u, 28358u, 28366u, 28376u, 28378u, 
+         28388u, 28402u, 28406u, 28414u, 28432u, 28436u, 28444u, 28448u, 
+         28462u, 28472u, 28474u, 28498u, 28514u, 28522u, 28528u, 28544u, 
+         28564u, 28574u, 28576u, 28582u, 28586u, 28616u, 28618u, 28634u, 
+         28666u, 28672u, 28684u, 28694u, 28718u, 28726u, 28738u, 28756u, 
+         28772u, 28774u, 28786u, 28792u, 28796u, 28808u, 28814u, 28816u, 
+         28844u, 28862u, 28864u, 28886u, 28892u, 28898u, 28904u, 28906u, 
+         28912u, 28928u, 28942u, 28948u, 28978u, 28994u, 28996u, 29006u, 
+         29008u, 29012u, 29024u, 29026u, 29038u, 29048u, 29062u, 29068u, 
+         29078u, 29086u, 29114u, 29116u, 29152u, 29158u, 29174u, 29188u, 
+         29192u, 29212u, 29236u, 29242u, 29246u, 29254u, 29258u, 29276u, 
+         29284u, 29288u, 29302u, 29306u, 29312u, 29314u, 29338u, 29354u, 
+         29368u, 29372u, 29398u, 29414u, 29416u, 29426u, 29458u, 29464u, 
+         29468u, 29474u, 29486u, 29492u, 29528u, 29536u, 29548u, 29552u, 
+         29554u, 29558u, 29566u, 29572u, 29576u, 29596u, 29608u, 29618u, 
+         29642u, 29654u, 29656u, 29668u, 29678u, 29684u, 29696u, 29698u, 
+         29704u, 29722u, 29726u, 29732u, 29738u, 29744u, 29752u, 29776u, 
+         29782u, 29792u, 29804u, 29834u, 29848u, 29858u, 29866u, 29878u, 
+         29884u, 29894u, 29906u, 29908u, 29926u, 29932u, 29936u, 29944u, 
+         29948u, 29972u, 29992u, 29996u, 30004u, 30014u, 30026u, 30034u, 
+         30046u, 30062u, 30068u, 30082u, 30086u, 30094u, 30098u, 30116u, 
+         30166u, 30172u, 30178u, 30182u, 30188u, 30196u, 30202u, 30212u, 
+         30238u, 30248u, 30254u, 30256u, 30266u, 30268u, 30278u, 30284u, 
+         30322u, 30334u, 30338u, 30346u, 30356u, 30376u, 30382u, 30388u, 
+         30394u, 30412u, 30422u, 30424u, 30436u, 30452u, 30454u, 30466u, 
+         30478u, 30482u, 30508u, 30518u, 30524u, 30544u, 30562u, 30602u, 
+         30614u, 30622u, 30632u, 30644u, 30646u, 30664u, 30676u, 30686u, 
+         30688u, 30698u, 30724u, 30728u, 30734u, 30746u, 30754u, 30758u, 
+         30788u, 30794u, 30796u, 30802u, 30818u, 30842u, 30866u, 30884u, 
+         30896u, 30908u, 30916u, 30922u, 30926u, 30934u, 30944u, 30952u, 
+         30958u, 30962u, 30982u, 30992u, 31018u, 31022u, 31046u, 31052u, 
+         31054u, 31066u, 31108u, 31126u, 31132u, 31136u, 31162u, 31168u, 
+         31196u, 31202u, 31204u, 31214u, 31222u, 31228u, 31234u, 31244u, 
+         31252u, 31262u, 31264u, 31286u, 31288u, 31292u, 31312u, 31316u, 
+         31322u, 31358u, 31372u, 31376u, 31396u, 31418u, 31424u, 31438u, 
+         31444u, 31454u, 31462u, 31466u, 31468u, 31472u, 31486u, 31504u, 
+         31538u, 31546u, 31568u, 31582u, 31592u, 31616u, 31622u, 31624u, 
+         31634u, 31636u, 31642u, 31652u, 31678u, 31696u, 31706u, 31724u, 
+         31748u, 31766u, 31768u, 31792u, 31832u, 31834u, 31838u, 31844u, 
+         31846u, 31852u, 31862u, 31888u, 31894u, 31906u, 31918u, 31924u, 
+         31928u, 31964u, 31966u, 31976u, 31988u, 32012u, 32014u, 32018u, 
+         32026u, 32036u, 32042u, 32044u, 32048u, 32072u, 32074u, 32078u, 
+         32114u, 32116u, 32138u, 32152u, 32176u, 32194u, 32236u, 32242u, 
+         32252u, 32254u, 32278u, 32294u, 32306u, 32308u, 32312u, 32314u, 
+         32324u, 32326u, 32336u, 32344u, 32348u, 32384u, 32392u, 32396u, 
+         32408u, 32426u, 32432u, 32438u, 32452u, 32474u, 32476u, 32482u, 
+         32506u, 32512u, 32522u, 32546u, 32566u, 32588u, 32594u, 32608u, 
+         32644u, 32672u, 32678u, 32686u, 32692u, 32716u, 32722u, 32734u, 
+         32762u, 32764u, 32782u, 32786u, 32788u, 32792u, 32812u, 32834u, 
+         32842u, 32852u, 32854u, 32872u, 32876u, 32884u, 32894u, 32908u, 
+         32918u, 32924u, 32932u, 32938u, 32944u, 32956u, 32972u, 32984u, 
+         32998u, 33008u, 33026u, 33028u, 33038u, 33062u, 33086u, 33092u, 
+         33104u, 33106u, 33128u, 33134u, 33154u, 33176u, 33178u, 33182u, 
+         33194u, 33196u, 33202u, 33238u, 33244u, 33266u, 33272u, 33274u, 
+         33302u, 33314u, 33332u, 33334u, 33338u, 33352u, 33358u, 33362u, 
+         33364u, 33374u, 33376u, 33392u, 33394u, 33404u, 33412u, 33418u, 
+         33428u, 33446u, 33458u, 33464u, 33478u, 33482u, 33488u, 33506u, 
+         33518u, 33544u, 33548u, 33554u, 33568u, 33574u, 33584u, 33596u, 
+         33598u, 33602u, 33604u, 33614u, 33638u, 33646u, 33656u, 33688u, 
+         33698u, 33706u, 33716u, 33722u, 33724u, 33742u, 33754u, 33782u, 
+         33812u, 33814u, 33832u, 33836u, 33842u, 33856u, 33862u, 33866u, 
+         33874u, 33896u, 33904u, 33934u, 33952u, 33962u, 33988u, 33992u, 
+         33994u, 34016u, 34024u, 34028u, 34036u, 34042u, 34046u, 34072u, 
+         34076u, 34088u, 34108u, 34126u, 34132u, 34144u, 34154u, 34172u, 
+         34174u, 34178u, 34184u, 34186u, 34198u, 34226u, 34232u, 34252u, 
+         34258u, 34274u, 34282u, 34288u, 34294u, 34298u, 34304u, 34324u, 
+         34336u, 34342u, 34346u, 34366u, 34372u, 34388u, 34394u, 34426u, 
+         34436u, 34454u, 34456u, 34468u, 34484u, 34508u, 34514u, 34522u, 
+         34534u, 34568u, 34574u, 34594u, 34616u, 34618u, 34634u, 34648u, 
+         34654u, 34658u, 34672u, 34678u, 34702u, 34732u, 34736u, 34744u, 
+         34756u, 34762u, 34778u, 34798u, 34808u, 34822u, 34826u, 34828u, 
+         34844u, 34856u, 34858u, 34868u, 34876u, 34882u, 34912u, 34924u, 
+         34934u, 34948u, 34958u, 34966u, 34976u, 34982u, 34984u, 34988u, 
+         35002u, 35012u, 35014u, 35024u, 35056u, 35074u, 35078u, 35086u, 
+         35114u, 35134u, 35138u, 35158u, 35164u, 35168u, 35198u, 35206u, 
+         35212u, 35234u, 35252u, 35264u, 35266u, 35276u, 35288u, 35294u, 
+         35312u, 35318u, 35372u, 35378u, 35392u, 35396u, 35402u, 35408u, 
+         35422u, 35446u, 35452u, 35464u, 35474u, 35486u, 35492u, 35516u, 
+         35528u, 35546u, 35554u, 35572u, 35576u, 35578u, 35582u, 35584u, 
+         35606u, 35614u, 35624u, 35626u, 35638u, 35648u, 35662u, 35668u, 
+         35672u, 35674u, 35686u, 35732u, 35738u, 35744u, 35746u, 35752u, 
+         35758u, 35788u, 35798u, 35806u, 35812u, 35824u, 35828u, 35842u, 
+         35848u, 35864u, 35876u, 35884u, 35894u, 35914u, 35932u, 35942u, 
+         35948u, 35954u, 35966u, 35968u, 35978u, 35992u, 35996u, 35998u, 
+         36002u, 36026u, 36038u, 36046u, 36064u, 36068u, 36076u, 36092u, 
+         36106u, 36118u, 36128u, 36146u, 36158u, 36166u, 36184u, 36188u, 
+         36202u, 36206u, 36212u, 36214u, 36236u, 36254u, 36262u, 36272u, 
+         36298u, 36302u, 36304u, 36328u, 36334u, 36338u, 36344u, 36356u, 
+         36382u, 36386u, 36394u, 36404u, 36422u, 36428u, 36442u, 36452u, 
+         36464u, 36466u, 36478u, 36484u, 36488u, 36496u, 36508u, 36524u, 
+         36526u, 36536u, 36542u, 36544u, 36566u, 36568u, 36572u, 36586u, 
+         36604u, 36614u, 36626u, 36646u, 36656u, 36662u, 36664u, 36668u, 
+         36682u, 36694u, 36698u, 36706u, 36716u, 36718u, 36724u, 36758u, 
+         36764u, 36766u, 36782u, 36794u, 36802u, 36824u, 36832u, 36862u, 
+         36872u, 36874u, 36898u, 36902u, 36916u, 36926u, 36946u, 36962u, 
+         36964u, 36968u, 36988u, 36998u, 37004u, 37012u, 37016u, 37024u, 
+         37028u, 37052u, 37058u, 37072u, 37076u, 37108u, 37112u, 37118u, 
+         37132u, 37138u, 37142u, 37144u, 37166u, 37226u, 37228u, 37234u, 
+         37258u, 37262u, 37276u, 37294u, 37306u, 37324u, 37336u, 37342u, 
+         37346u, 37376u, 37378u, 37394u, 37396u, 37418u, 37432u, 37448u, 
+         37466u, 37472u, 37508u, 37514u, 37532u, 37534u, 37544u, 37552u, 
+         37556u, 37558u, 37564u, 37588u, 37606u, 37636u, 37642u, 37648u, 
+         37682u, 37696u, 37702u, 37754u, 37756u, 37772u, 37784u, 37798u, 
+         37814u, 37822u, 37852u, 37856u, 37858u, 37864u, 37874u, 37886u, 
+         37888u, 37916u, 37922u, 37936u, 37948u, 37976u, 37994u, 38014u, 
+         38018u, 38026u, 38032u, 38038u, 38042u, 38048u, 38056u, 38078u, 
+         38084u, 38108u, 38116u, 38122u, 38134u, 38146u, 38152u, 38164u, 
+         38168u, 38188u, 38234u, 38252u, 38266u, 38276u, 38278u, 38302u, 
+         38306u, 38308u, 38332u, 38354u, 38368u, 38378u, 38384u, 38416u, 
+         38428u, 38432u, 38434u, 38444u, 38446u, 38456u, 38458u, 38462u, 
+         38468u, 38474u, 38486u, 38498u, 38512u, 38518u, 38524u, 38552u, 
+         38554u, 38572u, 38578u, 38584u, 38588u, 38612u, 38614u, 38626u, 
+         38638u, 38644u, 38648u, 38672u, 38696u, 38698u, 38704u, 38708u, 
+         38746u, 38752u, 38762u, 38774u, 38776u, 38788u, 38792u, 38812u, 
+         38834u, 38846u, 38848u, 38858u, 38864u, 38882u, 38924u, 38936u, 
+         38938u, 38944u, 38956u, 38978u, 38992u, 39002u, 39008u, 39014u, 
+         39016u, 39026u, 39044u, 39058u, 39062u, 39088u, 39104u, 39116u, 
+         39124u, 39142u, 39146u, 39148u, 39158u, 39166u, 39172u, 39176u, 
+         39182u, 39188u, 39194u
+      }};
+
+      if(n <= b1)
+         return a1[n];
+      if(n <= b2)
+         return a2[n - b1 - 1];
+      if(n >= b3)
+      {
+         return boost::math::policies::raise_domain_error<boost::uint32_t>(
+            "boost::math::prime<%1%>", "Argument n out of range: got %1%", n, pol);
+      }
+      return static_cast<boost::uint32_t>(a3[n - b2 - 1]) + 0xFFFFu;
+   }
+
+   inline boost::uint32_t prime(unsigned n)
+   {
+      return boost::math::prime(n, boost::math::policies::policy<>());
+   }
+
+   static const unsigned max_prime = 10000;
+
+}} // namespace boost and math
+
+#endif // BOOST_MATH_SF_PRIME_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/round.hpp b/gatb-core/thirdparty/boost/math/special_functions/round.hpp
new file mode 100644
index 0000000..e21f718
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/round.hpp
@@ -0,0 +1,132 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_ROUND_HPP
+#define BOOST_MATH_ROUND_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type round(const T& v, const Policy& pol, const mpl::false_)
+{
+   BOOST_MATH_STD_USING
+      typedef typename tools::promote_args<T>::type result_type;
+   if(!(boost::math::isfinite)(v))
+      return policies::raise_rounding_error("boost::math::round<%1%>(%1%)", 0, static_cast<result_type>(v), static_cast<result_type>(v), pol);
+   //
+   // The logic here is rather convoluted, but avoids a number of traps,
+   // see discussion here https://github.com/boostorg/math/pull/8
+   //
+   if (-0.5 < v && v < 0.5)
+   {
+      // special case to avoid rounding error on the direct
+      // predecessor of +0.5 resp. the direct successor of -0.5 in
+      // IEEE floating point types
+      return 0;
+   }
+   else if (v > 0)
+   {
+      // subtract v from ceil(v) first in order to avoid rounding
+      // errors on largest representable integer numbers
+      result_type c(ceil(v));
+      return 0.5 < c - v ? c - 1 : c;
+   }
+   else
+   {
+      // see former branch
+      result_type f(floor(v));
+      return 0.5 < v - f ? f + 1 : f;
+   }
+}
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type round(const T& v, const Policy&, const mpl::true_)
+{
+   return v;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type round(const T& v, const Policy& pol)
+{
+   return detail::round(v, pol, mpl::bool_<detail::is_integer_for_rounding<T>::value>());
+}
+template <class T>
+inline typename tools::promote_args<T>::type round(const T& v)
+{
+   return round(v, policies::policy<>());
+}
+//
+// The following functions will not compile unless T has an
+// implicit convertion to the integer types.  For user-defined
+// number types this will likely not be the case.  In that case
+// these functions should either be specialized for the UDT in
+// question, or else overloads should be placed in the same 
+// namespace as the UDT: these will then be found via argument
+// dependent lookup.  See our concept archetypes for examples.
+//
+template <class T, class Policy>
+inline int iround(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T r = boost::math::round(v, pol);
+   if((r > (std::numeric_limits<int>::max)()) || (r < (std::numeric_limits<int>::min)()))
+      return static_cast<int>(policies::raise_rounding_error("boost::math::iround<%1%>(%1%)", 0, v, 0, pol));
+   return static_cast<int>(r);
+}
+template <class T>
+inline int iround(const T& v)
+{
+   return iround(v, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline long lround(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T r = boost::math::round(v, pol);
+   if((r > (std::numeric_limits<long>::max)()) || (r < (std::numeric_limits<long>::min)()))
+      return static_cast<long int>(policies::raise_rounding_error("boost::math::lround<%1%>(%1%)", 0, v, 0L, pol));
+   return static_cast<long int>(r);
+}
+template <class T>
+inline long lround(const T& v)
+{
+   return lround(v, policies::policy<>());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+
+template <class T, class Policy>
+inline boost::long_long_type llround(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T r = boost::math::round(v, pol);
+   if((r > (std::numeric_limits<boost::long_long_type>::max)()) || (r < (std::numeric_limits<boost::long_long_type>::min)()))
+      return static_cast<boost::long_long_type>(policies::raise_rounding_error("boost::math::llround<%1%>(%1%)", 0, v, static_cast<boost::long_long_type>(0), pol));
+   return static_cast<boost::long_long_type>(r);
+}
+template <class T>
+inline boost::long_long_type llround(const T& v)
+{
+   return llround(v, policies::policy<>());
+}
+
+#endif
+
+}} // namespaces
+
+#endif // BOOST_MATH_ROUND_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/sign.hpp b/gatb-core/thirdparty/boost/math/special_functions/sign.hpp
new file mode 100644
index 0000000..3324c90
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/sign.hpp
@@ -0,0 +1,194 @@
+//  (C) Copyright John Maddock 2006.
+//  (C) Copyright Johan Rade 2006.
+//  (C) Copyright Paul A. Bristow 2011 (added changesign).
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_SIGN_HPP
+#define BOOST_MATH_TOOLS_SIGN_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/fp_traits.hpp>
+
+namespace boost{ namespace math{ 
+
+namespace detail {
+
+  // signbit
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline int signbit_impl(T x, native_tag const&)
+    {
+        return (std::signbit)(x);
+    }
+#endif
+
+    // Generic versions first, note that these do not handle
+    // signed zero or NaN.
+
+    template<class T>
+    inline int signbit_impl(T x, generic_tag<true> const&)
+    {
+        return x < 0;
+    }
+
+    template<class T> 
+    inline int signbit_impl(T x, generic_tag<false> const&)
+    {
+        return x < 0;
+    }
+
+#if defined(__GNUC__) && (LDBL_MANT_DIG == 106)
+    //
+    // Special handling for GCC's "double double" type, 
+    // in this case the sign is the same as the sign we
+    // get by casting to double, no overflow/underflow
+    // can occur since the exponents are the same magnitude
+    // for the two types:
+    //
+    inline int signbit_impl(long double x, generic_tag<true> const&)
+    {
+       return (boost::math::signbit)(static_cast<double>(x));
+    }
+    inline int signbit_impl(long double x, generic_tag<false> const&)
+    {
+       return (boost::math::signbit)(static_cast<double>(x));
+    }
+#endif
+
+    template<class T>
+    inline int signbit_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        return a & traits::sign ? 1 : 0;
+    }
+
+    template<class T> 
+    inline int signbit_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+
+        return a & traits::sign ? 1 : 0;
+    }
+
+    // Changesign
+    
+    // Generic versions first, note that these do not handle
+    // signed zero or NaN.
+
+    template<class T>
+    inline T (changesign_impl)(T x, generic_tag<true> const&)
+    {
+        return -x;
+    }
+
+    template<class T>
+    inline T (changesign_impl)(T x, generic_tag<false> const&)
+    {
+        return -x;
+    }
+#if defined(__GNUC__) && (LDBL_MANT_DIG == 106)
+    //
+    // Special handling for GCC's "double double" type, 
+    // in this case we need to change the sign of both
+    // components of the "double double":
+    //
+    inline long double (changesign_impl)(long double x, generic_tag<true> const&)
+    {
+       double* pd = reinterpret_cast<double*>(&x);
+       pd[0] = boost::math::changesign(pd[0]);
+       pd[1] = boost::math::changesign(pd[1]);
+       return x;
+    }
+    inline long double (changesign_impl)(long double x, generic_tag<false> const&)
+    {
+       double* pd = reinterpret_cast<double*>(&x);
+       pd[0] = boost::math::changesign(pd[0]);
+       pd[1] = boost::math::changesign(pd[1]);
+       return x;
+    }
+#endif
+
+    template<class T>
+    inline T changesign_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::sign_change_type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a ^= traits::sign;
+        traits::set_bits(x,a);
+        return x;
+    }
+
+    template<class T>
+    inline T (changesign_impl)(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::sign_change_type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a ^= traits::sign;
+        traits::set_bits(x,a);
+        return x;
+    }
+
+
+}   // namespace detail
+
+template<class T> int (signbit)(T x)
+{ 
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   // typedef typename boost::is_floating_point<T>::type fp_tag;
+   typedef typename tools::promote_args_permissive<T>::type result_type;
+   return detail::signbit_impl(static_cast<result_type>(x), method());
+}
+
+template <class T>
+inline int sign BOOST_NO_MACRO_EXPAND(const T& z)
+{
+   return (z == 0) ? 0 : (boost::math::signbit)(z) ? -1 : 1;
+}
+
+template <class T> typename tools::promote_args_permissive<T>::type (changesign)(const T& x)
+{ //!< \brief return unchanged binary pattern of x, except for change of sign bit. 
+   typedef typename detail::fp_traits<T>::sign_change_type traits;
+   typedef typename traits::method method;
+   // typedef typename boost::is_floating_point<T>::type fp_tag;
+   typedef typename tools::promote_args_permissive<T>::type result_type;
+
+   return detail::changesign_impl(static_cast<result_type>(x), method());
+}
+
+template <class T, class U>
+inline typename tools::promote_args_permissive<T, U>::type 
+   copysign BOOST_NO_MACRO_EXPAND(const T& x, const U& y)
+{
+   BOOST_MATH_STD_USING
+   typedef typename tools::promote_args_permissive<T, U>::type result_type;
+   return (boost::math::signbit)(static_cast<result_type>(x)) != (boost::math::signbit)(static_cast<result_type>(y)) 
+      ? (boost::math::changesign)(static_cast<result_type>(x)) : static_cast<result_type>(x);
+}
+
+} // namespace math
+} // namespace boost
+
+
+#endif // BOOST_MATH_TOOLS_SIGN_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/sin_pi.hpp b/gatb-core/thirdparty/boost/math/special_functions/sin_pi.hpp
new file mode 100644
index 0000000..ae6b3e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/sin_pi.hpp
@@ -0,0 +1,78 @@
+//  Copyright (c) 2007 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SIN_PI_HPP
+#define BOOST_MATH_SIN_PI_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/constants/constants.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+T sin_pi_imp(T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+   if(x < 0)
+      return -sin_pi(-x);
+   // sin of pi*x:
+   bool invert;
+   if(x < 0.5)
+      return sin(constants::pi<T>() * x);
+   if(x < 1)
+   {
+      invert = true;
+      x = -x;
+   }
+   else
+      invert = false;
+
+   T rem = floor(x);
+   if(itrunc(rem, pol) & 1)
+      invert = !invert;
+   rem = x - rem;
+   if(rem > 0.5f)
+      rem = 1 - rem;
+   if(rem == 0.5f)
+      return static_cast<T>(invert ? -1 : 1);
+   
+   rem = sin(constants::pi<T>() * rem);
+   return invert ? T(-rem) : rem;
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type sin_pi(T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(boost::math::detail::sin_pi_imp<value_type>(x, forwarding_policy()), "cos_pi");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type sin_pi(T x)
+{
+   return boost::math::sin_pi(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/sinc.hpp b/gatb-core/thirdparty/boost/math/special_functions/sinc.hpp
new file mode 100644
index 0000000..84fbf0e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/sinc.hpp
@@ -0,0 +1,145 @@
+//  boost sinc.hpp header file
+
+//  (C) Copyright Hubert Holin 2001.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_SINC_HPP
+#define BOOST_SINC_HPP
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <string>
+#include <stdexcept>
+
+
+#include <boost/config.hpp>
+
+
+// These are the the "Sinus Cardinal" functions.
+
+namespace boost
+{
+    namespace math
+    {
+       namespace detail
+       {
+        // This is the "Sinus Cardinal" of index Pi.
+
+        template<typename T>
+        inline T    sinc_pi_imp(const T x)
+        {
+            BOOST_MATH_STD_USING
+
+            T const    taylor_0_bound = tools::epsilon<T>();
+            T const    taylor_2_bound = tools::root_epsilon<T>();
+            T const    taylor_n_bound = tools::forth_root_epsilon<T>();
+
+            if    (abs(x) >= taylor_n_bound)
+            {
+                return(sin(x)/x);
+            }
+            else
+            {
+                // approximation by taylor series in x at 0 up to order 0
+                T    result = static_cast<T>(1);
+
+                if    (abs(x) >= taylor_0_bound)
+                {
+                    T    x2 = x*x;
+
+                    // approximation by taylor series in x at 0 up to order 2
+                    result -= x2/static_cast<T>(6);
+
+                    if    (abs(x) >= taylor_2_bound)
+                    {
+                        // approximation by taylor series in x at 0 up to order 4
+                        result += (x2*x2)/static_cast<T>(120);
+                    }
+                }
+
+                return(result);
+            }
+        }
+
+       } // namespace detail
+
+       template <class T>
+       inline typename tools::promote_args<T>::type sinc_pi(T x)
+       {
+          typedef typename tools::promote_args<T>::type result_type;
+          return detail::sinc_pi_imp(static_cast<result_type>(x));
+       }
+
+       template <class T, class Policy>
+       inline typename tools::promote_args<T>::type sinc_pi(T x, const Policy&)
+       {
+          typedef typename tools::promote_args<T>::type result_type;
+          return detail::sinc_pi_imp(static_cast<result_type>(x));
+       }
+
+#ifndef    BOOST_NO_TEMPLATE_TEMPLATES
+        template<typename T, template<typename> class U>
+        inline U<T>    sinc_pi(const U<T> x)
+        {
+            BOOST_MATH_STD_USING
+            using    ::std::numeric_limits;
+
+            T const    taylor_0_bound = tools::epsilon<T>();
+            T const    taylor_2_bound = tools::root_epsilon<T>();
+            T const    taylor_n_bound = tools::forth_root_epsilon<T>();
+
+            if    (abs(x) >= taylor_n_bound)
+            {
+                return(sin(x)/x);
+            }
+            else
+            {
+                // approximation by taylor series in x at 0 up to order 0
+#ifdef __MWERKS__
+                U<T>    result = static_cast<U<T> >(1);
+#else
+                U<T>    result = U<T>(1);
+#endif
+
+                if    (abs(x) >= taylor_0_bound)
+                {
+                    U<T>    x2 = x*x;
+
+                    // approximation by taylor series in x at 0 up to order 2
+                    result -= x2/static_cast<T>(6);
+
+                    if    (abs(x) >= taylor_2_bound)
+                    {
+                        // approximation by taylor series in x at 0 up to order 4
+                        result += (x2*x2)/static_cast<T>(120);
+                    }
+                }
+
+                return(result);
+            }
+        }
+
+        template<typename T, template<typename> class U, class Policy>
+        inline U<T>    sinc_pi(const U<T> x, const Policy&)
+        {
+           return sinc_pi(x);
+        }
+#endif    /* BOOST_NO_TEMPLATE_TEMPLATES */
+    }
+}
+
+#endif /* BOOST_SINC_HPP */
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/sinhc.hpp b/gatb-core/thirdparty/boost/math/special_functions/sinhc.hpp
new file mode 100644
index 0000000..1216b7b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/sinhc.hpp
@@ -0,0 +1,156 @@
+//  boost sinhc.hpp header file
+
+//  (C) Copyright Hubert Holin 2001.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_SINHC_HPP
+#define BOOST_SINHC_HPP
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <string>
+#include <stdexcept>
+
+#include <boost/config.hpp>
+
+
+// These are the the "Hyperbolic Sinus Cardinal" functions.
+
+namespace boost
+{
+    namespace math
+    {
+       namespace detail
+       {
+        // This is the "Hyperbolic Sinus Cardinal" of index Pi.
+
+        template<typename T>
+        inline T    sinhc_pi_imp(const T x)
+        {
+#if defined(BOOST_NO_STDC_NAMESPACE) && !defined(__SUNPRO_CC)
+            using    ::abs;
+            using    ::sinh;
+            using    ::sqrt;
+#else    /* BOOST_NO_STDC_NAMESPACE */
+            using    ::std::abs;
+            using    ::std::sinh;
+            using    ::std::sqrt;
+#endif    /* BOOST_NO_STDC_NAMESPACE */
+
+            static T const    taylor_0_bound = tools::epsilon<T>();
+            static T const    taylor_2_bound = sqrt(taylor_0_bound);
+            static T const    taylor_n_bound = sqrt(taylor_2_bound);
+
+            if    (abs(x) >= taylor_n_bound)
+            {
+                return(sinh(x)/x);
+            }
+            else
+            {
+                // approximation by taylor series in x at 0 up to order 0
+                T    result = static_cast<T>(1);
+
+                if    (abs(x) >= taylor_0_bound)
+                {
+                    T    x2 = x*x;
+
+                    // approximation by taylor series in x at 0 up to order 2
+                    result += x2/static_cast<T>(6);
+
+                    if    (abs(x) >= taylor_2_bound)
+                    {
+                        // approximation by taylor series in x at 0 up to order 4
+                        result += (x2*x2)/static_cast<T>(120);
+                    }
+                }
+
+                return(result);
+            }
+        }
+
+       } // namespace detail
+
+       template <class T>
+       inline typename tools::promote_args<T>::type sinhc_pi(T x)
+       {
+          typedef typename tools::promote_args<T>::type result_type;
+          return detail::sinhc_pi_imp(static_cast<result_type>(x));
+       }
+
+       template <class T, class Policy>
+       inline typename tools::promote_args<T>::type sinhc_pi(T x, const Policy&)
+       {
+          return boost::math::sinhc_pi(x);
+       }
+
+#ifdef    BOOST_NO_TEMPLATE_TEMPLATES
+#else    /* BOOST_NO_TEMPLATE_TEMPLATES */
+        template<typename T, template<typename> class U>
+        inline U<T>    sinhc_pi(const U<T> x)
+        {
+#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) || defined(__GNUC__)
+            using namespace std;
+#elif    defined(BOOST_NO_STDC_NAMESPACE) && !defined(__SUNPRO_CC)
+            using    ::abs;
+            using    ::sinh;
+            using    ::sqrt;
+#else    /* BOOST_NO_STDC_NAMESPACE */
+            using    ::std::abs;
+            using    ::std::sinh;
+            using    ::std::sqrt;
+#endif    /* BOOST_NO_STDC_NAMESPACE */
+
+            using    ::std::numeric_limits;
+
+            static T const    taylor_0_bound = tools::epsilon<T>();
+            static T const    taylor_2_bound = sqrt(taylor_0_bound);
+            static T const    taylor_n_bound = sqrt(taylor_2_bound);
+
+            if    (abs(x) >= taylor_n_bound)
+            {
+                return(sinh(x)/x);
+            }
+            else
+            {
+                // approximation by taylor series in x at 0 up to order 0
+#ifdef __MWERKS__
+                U<T>    result = static_cast<U<T> >(1);
+#else
+                U<T>    result = U<T>(1);
+#endif
+
+                if    (abs(x) >= taylor_0_bound)
+                {
+                    U<T>    x2 = x*x;
+
+                    // approximation by taylor series in x at 0 up to order 2
+                    result += x2/static_cast<T>(6);
+
+                    if    (abs(x) >= taylor_2_bound)
+                    {
+                        // approximation by taylor series in x at 0 up to order 4
+                        result += (x2*x2)/static_cast<T>(120);
+                    }
+                }
+
+                return(result);
+            }
+        }
+#endif    /* BOOST_NO_TEMPLATE_TEMPLATES */
+    }
+}
+
+#endif /* BOOST_SINHC_HPP */
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/spherical_harmonic.hpp b/gatb-core/thirdparty/boost/math/special_functions/spherical_harmonic.hpp
new file mode 100644
index 0000000..00a6ade
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/spherical_harmonic.hpp
@@ -0,0 +1,205 @@
+
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_SPHERICAL_HARMONIC_HPP
+#define BOOST_MATH_SPECIAL_SPHERICAL_HARMONIC_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/legendre.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <complex>
+
+namespace boost{
+namespace math{
+
+namespace detail{
+
+//
+// Calculates the prefix term that's common to the real
+// and imaginary parts.  Does *not* fix up the sign of the result
+// though.
+//
+template <class T, class Policy>
+inline T spherical_harmonic_prefix(unsigned n, unsigned m, T theta, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+
+   if(m > n)
+      return 0;
+
+   T sin_theta = sin(theta);
+   T x = cos(theta);
+
+   T leg = detail::legendre_p_imp(n, m, x, static_cast<T>(pow(fabs(sin_theta), T(m))), pol);
+   
+   T prefix = boost::math::tgamma_delta_ratio(static_cast<T>(n - m + 1), static_cast<T>(2 * m), pol);
+   prefix *= (2 * n + 1) / (4 * constants::pi<T>());
+   prefix = sqrt(prefix);
+   return prefix * leg;
+}
+//
+// Real Part:
+//
+template <class T, class Policy>
+T spherical_harmonic_r(unsigned n, int m, T theta, T phi, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std functions
+
+   bool sign = false;
+   if(m < 0)
+   {
+      // Reflect and adjust sign if m < 0:
+      sign = m&1;
+      m = abs(m);
+   }
+   if(m&1)
+   {
+      // Check phase if theta is outside [0, PI]:
+      T mod = boost::math::tools::fmod_workaround(theta, T(2 * constants::pi<T>()));
+      if(mod < 0)
+         mod += 2 * constants::pi<T>();
+      if(mod > constants::pi<T>())
+         sign = !sign;
+   }
+   // Get the value and adjust sign as required:
+   T prefix = spherical_harmonic_prefix(n, m, theta, pol);
+   prefix *= cos(m * phi);
+   return sign ? T(-prefix) : prefix;
+}
+
+template <class T, class Policy>
+T spherical_harmonic_i(unsigned n, int m, T theta, T phi, const Policy& pol)
+{
+   BOOST_MATH_STD_USING  // ADL of std functions
+
+   bool sign = false;
+   if(m < 0)
+   {
+      // Reflect and adjust sign if m < 0:
+      sign = !(m&1);
+      m = abs(m);
+   }
+   if(m&1)
+   {
+      // Check phase if theta is outside [0, PI]:
+      T mod = boost::math::tools::fmod_workaround(theta, T(2 * constants::pi<T>()));
+      if(mod < 0)
+         mod += 2 * constants::pi<T>();
+      if(mod > constants::pi<T>())
+         sign = !sign;
+   }
+   // Get the value and adjust sign as required:
+   T prefix = spherical_harmonic_prefix(n, m, theta, pol);
+   prefix *= sin(m * phi);
+   return sign ? T(-prefix) : prefix;
+}
+
+template <class T, class U, class Policy>
+std::complex<T> spherical_harmonic(unsigned n, int m, U theta, U phi, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Sort out the signs:
+   //
+   bool r_sign = false;
+   bool i_sign = false;
+   if(m < 0)
+   {
+      // Reflect and adjust sign if m < 0:
+      r_sign = m&1;
+      i_sign = !(m&1);
+      m = abs(m);
+   }
+   if(m&1)
+   {
+      // Check phase if theta is outside [0, PI]:
+      U mod = boost::math::tools::fmod_workaround(theta, U(2 * constants::pi<U>()));
+      if(mod < 0)
+         mod += 2 * constants::pi<U>();
+      if(mod > constants::pi<U>())
+      {
+         r_sign = !r_sign;
+         i_sign = !i_sign;
+      }
+   }
+   //
+   // Calculate the value:
+   //
+   U prefix = spherical_harmonic_prefix(n, m, theta, pol);
+   U r = prefix * cos(m * phi);
+   U i = prefix * sin(m * phi);
+   //
+   // Add in the signs:
+   //
+   if(r_sign)
+      r = -r;
+   if(i_sign)
+      i = -i;
+   static const char* function = "boost::math::spherical_harmonic<%1%>(int, int, %1%, %1%)";
+   return std::complex<T>(policies::checked_narrowing_cast<T, Policy>(r, function), policies::checked_narrowing_cast<T, Policy>(i, function));
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline std::complex<typename tools::promote_args<T1, T2>::type> 
+   spherical_harmonic(unsigned n, int m, T1 theta, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return detail::spherical_harmonic<result_type, value_type>(n, m, static_cast<value_type>(theta), static_cast<value_type>(phi), pol);
+}
+
+template <class T1, class T2>
+inline std::complex<typename tools::promote_args<T1, T2>::type> 
+   spherical_harmonic(unsigned n, int m, T1 theta, T2 phi)
+{
+   return boost::math::spherical_harmonic(n, m, theta, phi, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   spherical_harmonic_r(unsigned n, int m, T1 theta, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::spherical_harmonic_r(n, m, static_cast<value_type>(theta), static_cast<value_type>(phi), pol), "bost::math::spherical_harmonic_r<%1%>(unsigned, int, %1%, %1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   spherical_harmonic_r(unsigned n, int m, T1 theta, T2 phi)
+{
+   return boost::math::spherical_harmonic_r(n, m, theta, phi, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type 
+   spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::spherical_harmonic_i(n, m, static_cast<value_type>(theta), static_cast<value_type>(phi), pol), "boost::math::spherical_harmonic_i<%1%>(unsigned, int, %1%, %1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type 
+   spherical_harmonic_i(unsigned n, int m, T1 theta, T2 phi)
+{
+   return boost::math::spherical_harmonic_i(n, m, theta, phi, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SPECIAL_SPHERICAL_HARMONIC_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/sqrt1pm1.hpp b/gatb-core/thirdparty/boost/math/special_functions/sqrt1pm1.hpp
new file mode 100644
index 0000000..293a9d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/sqrt1pm1.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SQRT1PM1
+#define BOOST_MATH_SQRT1PM1
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/special_functions/expm1.hpp>
+
+//
+// This algorithm computes sqrt(1+x)-1 for small x:
+//
+
+namespace boost{ namespace math{
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type sqrt1pm1(const T& val, const Policy& pol)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   BOOST_MATH_STD_USING
+
+   if(fabs(result_type(val)) > 0.75)
+      return sqrt(1 + result_type(val)) - 1;
+   return boost::math::expm1(boost::math::log1p(val, pol) / 2, pol);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type sqrt1pm1(const T& val)
+{
+   return sqrt1pm1(val, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_SQRT1PM1
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/trigamma.hpp b/gatb-core/thirdparty/boost/math/special_functions/trigamma.hpp
new file mode 100644
index 0000000..6fccb36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/trigamma.hpp
@@ -0,0 +1,469 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_TRIGAMMA_HPP
+#define BOOST_MATH_SF_TRIGAMMA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/mpl/comparison.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/special_functions/polygamma.hpp>
+
+namespace boost{
+namespace math{
+namespace detail{
+
+template<class T, class Policy>
+T polygamma_imp(const int n, T x, const Policy &pol);
+
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<53>*, const Policy&)
+{
+   // Max error in interpolated form: 3.736e-017
+   static const T offset = BOOST_MATH_BIG_CONSTANT(T, 53, 2.1093254089355469);
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, -1.1093280605946045),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -3.8310674472619321),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -3.3703848401898283),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.28080574467981213),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.6638069578676164),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.64468386819102836),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 3.4535389668541151),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 4.5208926987851437),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.7012734178351534),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.64468798399785611),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.20314516859987728e-6),
+   };
+   // Max error in interpolated form: 1.159e-017
+   static const T P_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.13803835004508849e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.50000049158540261),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.6077979838469348),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.5645435828098254),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.0534873203680393),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.74566981111565923),
+   };
+   static const T Q_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.8822787662376169),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 4.1681660554090917),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.7853527819234466),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.74967671848044792),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.00057069112416246805),
+   };
+   // Maximum Deviation Found:                     6.896e-018
+   // Expected Error Term :                       -6.895e-018
+   // Maximum Relative Change in Control Points :  8.497e-004
+   static const T P_4_inf[] = {
+      0.68947581948701249e-17L,
+      0.49999999999998975L,
+      1.0177274392923795L,
+      2.498208511343429L,
+      2.1921221359427595L,
+      1.5897035272532764L,
+      0.40154388356961734L,
+   };
+   static const T Q_4_inf[] = {
+      1.0L,
+      1.7021215452463932L,
+      4.4290431747556469L,
+      2.9745631894384922L,
+      2.3013614809773616L,
+      0.28360399799075752L,
+      0.022892987908906897L,
+   };
+
+   if(x <= 2)
+   {
+      return (offset + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 4)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_2_4, y) / tools::evaluate_polynomial(Q_2_4, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_4_inf, y) / tools::evaluate_polynomial(Q_4_inf, y)) / x;
+}
+   
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<64>*, const Policy&)
+{
+   // Max error in interpolated form: 1.178e-020
+   static const T offset_1_2 = BOOST_MATH_BIG_CONSTANT(T, 64, 2.109325408935546875);
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -1.10932535608960258341),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -4.18793841543017129052),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -4.63865531898487734531),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.919832884430500908047),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.68074038333180423012),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.21172611429185622377),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.259635673503366427284),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.77521119359546982995),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 5.664338024578956321),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 4.25995134879278028361),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.62956638448940402182),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.259635512844691089868),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.629642219810618032207e-8),
+   };
+   // Max error in interpolated form: 3.912e-020
+   static const T P_2_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.387540035162952880976e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.500000000276430504),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.21926880986360957306),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 10.2550347708483445775),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 18.9002075150709144043),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 21.0357215832399705625),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 13.4346512182925923978),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.98656291026448279118),
+   };
+   static const T Q_2_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 6.10520430478613667724),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 18.475001060603645512),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 31.7087534567758405638),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 31.908814523890465398),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 17.4175479039227084798),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.98749106958394941276),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000115917322224411128566),
+   };
+   // Maximum Deviation Found:                     2.635e-020
+   // Expected Error Term :                        2.635e-020
+   // Maximum Relative Change in Control Points :  1.791e-003
+   static const T P_8_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.263527875092466899848e-19),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.500000000000000058145),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0730121433777364138677),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.94505878379957149534),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0517092358874932620529),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.07995383547483921121),
+   };
+   static const T Q_8_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.187309046577818095504),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.95255391645238842975),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -1.14743283327078949087),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 2.52989799376344914499),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.627414303172402506396),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.141554248216425512536),
+   };
+
+   if(x <= 2)
+   {
+      return (offset_1_2 + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 8)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_2_8, y) / tools::evaluate_polynomial(Q_2_8, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_8_inf, y) / tools::evaluate_polynomial(Q_8_inf, y)) / x;
+}
+
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<113>*, const Policy&)
+{
+   // Max error in interpolated form: 1.916e-035
+
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.999999999999999082554457936871832533),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -4.71237311120865266379041700054847734),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -7.94125711970499027763789342500817316),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -5.74657746697664735258222071695644535),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.404213349456398905981223965160595687),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.47877781178642876561595890095758896),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.07714151702455125992166949812126433),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.858877899162360138844032265418028567),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.20499222604410032375789018837922397),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0272103140348194747360175268778415049),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0015764849020876949848954081173520686),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.71237311120863419878375031457715223),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.58619118655339853449127952145877467),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 11.0940067269829372437561421279054968),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.09075424749327792073276309969037885),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.87705890159891405185343806884451286),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.22758678701914477836330837816976782),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.249092040606385004109672077814668716),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0295750413900655597027079600025569048),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00157648490200498142247694709728858139),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.161264050344059471721062360645432809e-14),
+   };
+
+   // Max error in interpolated form: 8.958e-035
+   static const T P_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -2.55843734739907925764326773972215085),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -12.2830208240542011967952466273455887),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -23.9195022162767993526575786066414403),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -24.9256431504823483094158828285470862),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -14.7979122765478779075108064826412285),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -4.46654453928610666393276765059122272),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0191439033405649675717082465687845002),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.515412052554351265708917209749037352),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.195378348786064304378247325360320038),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0334761282624174313035014426794245393),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.002373665205942206348500250056602687),
+   };
+   static const T Q_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.80098558454419907830670928248659245),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.99220727843170133895059300223445265),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 11.8896146167631330735386697123464976),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.96613256683809091593793565879092581),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.47254136149624110878909334574485751),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.48600982028196527372434773913633152),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.319570735766764237068541501137990078),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0407358345787680953107374215319322066),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00237366520593271641375755486420859837),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.239554887903526152679337256236302116e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.294749244740618656265237072002026314e-17),
+   };
+
+   static const T y_offset_2_4 = BOOST_MATH_BIG_CONSTANT(T, 113, 3.558437347412109375);
+
+   // Max error in interpolated form: 4.319e-035
+   static const T P_4_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.166626112697021464248967707021688845e-16),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.499999999999997739552090249208808197),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 6.40270945019053817915772473771553187),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 41.3833374155000608013677627389343329),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 166.803341854562809335667241074035245),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 453.39964786925369319960722793414521),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 851.153712317697055375935433362983944),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1097.70657567285059133109286478004458),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 938.431232478455316020076349367632922),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 487.268001604651932322080970189930074),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 119.953445242335730062471193124820659),
+   };
+   static const T Q_4_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 12.4720855670474488978638945855932398),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 78.6093129753298570701376952709727391),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 307.470246050318322489781182863190127),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 805.140686101151538537565264188630079),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1439.12019760292146454787601409644413),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1735.6105285756048831268586001383127),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1348.32500712856328019355198611280536),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 607.225985860570846699704222144650563),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 119.952317857277045332558673164517227),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000140165918355036060868680809129436084),
+   };
+
+   // Maximum Deviation Found:                     2.867e-035
+   // Expected Error Term :                        2.866e-035
+   // Maximum Relative Change in Control Points :  2.662e-004
+   static const T P_8_16[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.184828315274146610610872315609837439e-19),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.500000000000000004122475157735807738),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.02533865247313349284875558880415875),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 13.5995927517457371243039532492642734),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 35.3132224283087906757037999452941588),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 67.1639424550714159157603179911505619),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 83.5767733658513967581959839367419891),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 71.073491212235705900866411319363501),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 35.8621515614725564575893663483998663),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.72152231639983491987779743154333318),
+   };
+   static const T Q_8_16[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 5.71734397161293452310624822415866372),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 25.293404179620438179337103263274815),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 62.2619767967468199111077640625328469),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 113.955048909238993473389714972250235),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 130.807138328938966981862203944329408),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 102.423146902337654110717764213057753),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 44.0424772805245202514468199602123565),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.89898032477904072082994913461386099),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0296627336872039988632793863671456398),
+   };
+   // Maximum Deviation Found:                     1.079e-035
+   // Expected Error Term :                       -1.079e-035
+   // Maximum Relative Change in Control Points :  7.884e-003
+   static const T P_16_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.500000000000000000000000000000087317),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.345625669885456215194494735902663968),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.62895499360842232127552650044647769),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.5936085382439026269301003761320812),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 49.459599118438883265036646019410669),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 7.77519237321893917784735690560496607),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 74.4536074488178075948642351179304121),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.75209340397069050436806159297952699),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 23.9292359711471667884504840186561598),
+   };
+   static const T Q_16_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.357918006437579097055656138920742037),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 19.1386039850709849435325005484512944),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.874349081464143606016221431763364517),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 98.6516097434855572678195488061432509),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -16.1051972833382893468655223662534306),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 154.316860216253720989145047141653727),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -40.2026880424378986053105969312264534),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 60.1679136674264778074736441126810223),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -13.3414844622256422644504472438320114),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.53795636200649908779512969030363442),
+   };
+
+   if(x <= 2)
+   {
+      return (2 + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 4)
+   {
+      return (y_offset_2_4 + boost::math::tools::evaluate_polynomial(P_2_4, x) / tools::evaluate_polynomial(Q_2_4, x)) / (x * x);
+   }
+   else if(x <= 8)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_4_8, y) / tools::evaluate_polynomial(Q_4_8, y)) / x;
+   }
+   else if(x <= 16)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_8_16, y) / tools::evaluate_polynomial(Q_8_16, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_16_inf, y) / tools::evaluate_polynomial(Q_16_inf, y)) / x;
+}
+
+template <class T, class Tag, class Policy>
+T trigamma_imp(T x, const Tag* t, const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   T result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x <= 0)
+   {
+      // Reflect:
+      T z = 1 - x;
+      // Argument reduction for tan:
+      if(floor(x) == x)
+      {
+         return policies::raise_pole_error<T>("boost::math::trigamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      T s = fabs(x) < fabs(z) ? boost::math::sin_pi(x, pol) : boost::math::sin_pi(z, pol);
+      return -trigamma_imp(z, t, pol) + boost::math::pow<2>(constants::pi<T>()) / (s * s);
+   }
+   if(x < 1)
+   {
+      result = 1 / (x * x);
+      x += 1;
+   }
+   return result + trigamma_prec(x, t, pol);
+}
+
+template <class T, class Policy>
+T trigamma_imp(T x, const mpl::int_<0>*, const Policy& pol)
+{
+   return polygamma_imp(1, x, pol);
+}
+//
+// Initializer: ensure all our constants are initialized prior to the first call of main:
+//
+template <class T, class Policy>
+struct trigamma_initializer
+{
+   struct init
+   {
+      init()
+      {
+         typedef typename policies::precision<T, Policy>::type precision_type;
+         do_init(mpl::bool_<precision_type::value && (precision_type::value <= 113)>());
+      }
+      void do_init(const mpl::true_&)
+      {
+         boost::math::trigamma(T(2.5), Policy());
+      }
+      void do_init(const mpl::false_&){}
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename trigamma_initializer<T, Policy>::init trigamma_initializer<T, Policy>::initializer;
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   trigamma(T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<T, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::or_<
+         mpl::less_equal<precision_type, mpl::int_<0> >,
+         mpl::greater<precision_type, mpl::int_<114> >
+      >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less<precision_type, mpl::int_<54> >,
+         mpl::int_<53>,
+         typename mpl::if_<
+            mpl::less<precision_type, mpl::int_<65> >,
+            mpl::int_<64>,
+            mpl::int_<113>
+         >::type
+      >::type
+   >::type tag_type;
+
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   // Force initialization of constants:
+   detail::trigamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::trigamma_imp(
+      static_cast<value_type>(x),
+      static_cast<const tag_type*>(0), forwarding_policy()), "boost::math::trigamma<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   trigamma(T x)
+{
+   return trigamma(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/special_functions/trunc.hpp b/gatb-core/thirdparty/boost/math/special_functions/trunc.hpp
new file mode 100644
index 0000000..3f80c96
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/trunc.hpp
@@ -0,0 +1,111 @@
+//  Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TRUNC_HPP
+#define BOOST_MATH_TRUNC_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type trunc(const T& v, const Policy& pol, const mpl::false_&)
+{
+   BOOST_MATH_STD_USING
+   typedef typename tools::promote_args<T>::type result_type;
+   if(!(boost::math::isfinite)(v))
+      return policies::raise_rounding_error("boost::math::trunc<%1%>(%1%)", 0, static_cast<result_type>(v), static_cast<result_type>(v), pol);
+   return (v >= 0) ? static_cast<result_type>(floor(v)) : static_cast<result_type>(ceil(v));
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type trunc(const T& v, const Policy&, const mpl::true_&)
+{
+   return v;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type trunc(const T& v, const Policy& pol)
+{
+   return detail::trunc(v, pol, mpl::bool_<detail::is_integer_for_rounding<T>::value>());
+}
+template <class T>
+inline typename tools::promote_args<T>::type trunc(const T& v)
+{
+   return trunc(v, policies::policy<>());
+}
+//
+// The following functions will not compile unless T has an
+// implicit convertion to the integer types.  For user-defined
+// number types this will likely not be the case.  In that case
+// these functions should either be specialized for the UDT in
+// question, or else overloads should be placed in the same 
+// namespace as the UDT: these will then be found via argument
+// dependent lookup.  See our concept archetypes for examples.
+//
+template <class T, class Policy>
+inline int itrunc(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   typedef typename tools::promote_args<T>::type result_type;
+   result_type r = boost::math::trunc(v, pol);
+   if((r > (std::numeric_limits<int>::max)()) || (r < (std::numeric_limits<int>::min)()))
+      return static_cast<int>(policies::raise_rounding_error("boost::math::itrunc<%1%>(%1%)", 0, static_cast<result_type>(v), 0, pol));
+   return static_cast<int>(r);
+}
+template <class T>
+inline int itrunc(const T& v)
+{
+   return itrunc(v, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline long ltrunc(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   typedef typename tools::promote_args<T>::type result_type;
+   result_type r = boost::math::trunc(v, pol);
+   if((r > (std::numeric_limits<long>::max)()) || (r < (std::numeric_limits<long>::min)()))
+      return static_cast<long>(policies::raise_rounding_error("boost::math::ltrunc<%1%>(%1%)", 0, static_cast<result_type>(v), 0L, pol));
+   return static_cast<long>(r);
+}
+template <class T>
+inline long ltrunc(const T& v)
+{
+   return ltrunc(v, policies::policy<>());
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+
+template <class T, class Policy>
+inline boost::long_long_type lltrunc(const T& v, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   typedef typename tools::promote_args<T>::type result_type;
+   result_type r = boost::math::trunc(v, pol);
+   if((r > (std::numeric_limits<boost::long_long_type>::max)()) || (r < (std::numeric_limits<boost::long_long_type>::min)()))
+      return static_cast<boost::long_long_type>(policies::raise_rounding_error("boost::math::lltrunc<%1%>(%1%)", 0, v, static_cast<boost::long_long_type>(0), pol));
+   return static_cast<boost::long_long_type>(r);
+}
+template <class T>
+inline boost::long_long_type lltrunc(const T& v)
+{
+   return lltrunc(v, policies::policy<>());
+}
+
+#endif
+
+}} // namespaces
+
+#endif // BOOST_MATH_TRUNC_HPP
diff --git a/gatb-core/thirdparty/boost/math/special_functions/zeta.hpp b/gatb-core/thirdparty/boost/math/special_functions/zeta.hpp
new file mode 100644
index 0000000..1ba282f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/special_functions/zeta.hpp
@@ -0,0 +1,1086 @@
+//  Copyright John Maddock 2007, 2014.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_ZETA_HPP
+#define BOOST_MATH_ZETA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/sin_pi.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+#if 0
+//
+// This code is commented out because we have a better more rapidly converging series
+// now.  Retained for future reference and in case the new code causes any issues down the line....
+//
+
+template <class T, class Policy>
+struct zeta_series_cache_size
+{
+   //
+   // Work how large to make our cache size when evaluating the series 
+   // evaluation:  normally this is just large enough for the series
+   // to have converged, but for arbitrary precision types we need a 
+   // really large cache to achieve reasonable precision in a reasonable 
+   // time.  This is important when constructing rational approximations
+   // to zeta for example.
+   //
+   typedef typename boost::math::policies::precision<T,Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<5000>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<64> >,
+         mpl::int_<70>,
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<113> >,
+            mpl::int_<100>,
+            mpl::int_<5000>
+         >::type
+      >::type
+   >::type type;
+};
+
+template <class T, class Policy>
+T zeta_series_imp(T s, T sc, const Policy&)
+{
+   //
+   // Series evaluation from:
+   // Havil, J. Gamma: Exploring Euler's Constant. 
+   // Princeton, NJ: Princeton University Press, 2003.
+   //
+   // See also http://mathworld.wolfram.com/RiemannZetaFunction.html
+   //
+   BOOST_MATH_STD_USING
+   T sum = 0;
+   T mult = 0.5;
+   T change;
+   typedef typename zeta_series_cache_size<T,Policy>::type cache_size;
+   T powers[cache_size::value] = { 0, };
+   unsigned n = 0;
+   do{
+      T binom = -static_cast<T>(n);
+      T nested_sum = 1;
+      if(n < sizeof(powers) / sizeof(powers[0]))
+         powers[n] = pow(static_cast<T>(n + 1), -s);
+      for(unsigned k = 1; k <= n; ++k)
+      {
+         T p;
+         if(k < sizeof(powers) / sizeof(powers[0]))
+         {
+            p = powers[k];
+            //p = pow(k + 1, -s);
+         }
+         else
+            p = pow(static_cast<T>(k + 1), -s);
+         nested_sum += binom * p;
+        binom *= (k - static_cast<T>(n)) / (k + 1);
+      }
+      change = mult * nested_sum;
+      sum += change;
+      mult /= 2;
+      ++n;
+   }while(fabs(change / sum) > tools::epsilon<T>());
+
+   return sum * 1 / -boost::math::powm1(T(2), sc);
+}
+
+//
+// Classical p-series:
+//
+template <class T>
+struct zeta_series2
+{
+   typedef T result_type;
+   zeta_series2(T _s) : s(-_s), k(1){}
+   T operator()()
+   {
+      BOOST_MATH_STD_USING
+      return pow(static_cast<T>(k++), s);
+   }
+private:
+   T s;
+   unsigned k;
+};
+
+template <class T, class Policy>
+inline T zeta_series2_imp(T s, const Policy& pol)
+{
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();;
+   zeta_series2<T> f(s);
+   T result = tools::sum_series(
+      f, 
+      policies::get_epsilon<T, Policy>(),
+      max_iter);
+   policies::check_series_iterations<T>("boost::math::zeta_series2<%1%>(%1%)", max_iter, pol);
+   return result;
+}
+#endif
+
+template <class T, class Policy>
+T zeta_polynomial_series(T s, T sc, Policy const &)
+{
+   //
+   // This is algorithm 3 from:
+   // 
+   // "An Efficient Algorithm for the Riemann Zeta Function", P. Borwein, 
+   // Canadian Mathematical Society, Conference Proceedings.
+   // See: http://www.cecm.sfu.ca/personal/pborwein/PAPERS/P155.pdf
+   //
+   BOOST_MATH_STD_USING
+   int n = itrunc(T(log(boost::math::tools::epsilon<T>()) / -2));
+   T sum = 0;
+   T two_n = ldexp(T(1), n);
+   int ej_sign = 1;
+   for(int j = 0; j < n; ++j)
+   {
+      sum += ej_sign * -two_n / pow(T(j + 1), s);
+      ej_sign = -ej_sign; 
+   }
+   T ej_sum = 1;
+   T ej_term = 1;
+   for(int j = n; j <= 2 * n - 1; ++j)
+   {
+      sum += ej_sign * (ej_sum - two_n) / pow(T(j + 1), s);
+      ej_sign = -ej_sign;
+      ej_term *= 2 * n - j;
+      ej_term /= j - n + 1;
+      ej_sum += ej_term;
+   }
+   return -sum / (two_n * (-powm1(T(2), sc)));
+}
+
+template <class T, class Policy>
+T zeta_imp_prec(T s, T sc, const Policy& pol, const mpl::int_<0>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(s >= policies::digits<T, Policy>())
+      return 1;
+   result = zeta_polynomial_series(s, sc, pol); 
+#if 0
+   // Old code archived for future reference:
+
+   //
+   // Only use power series if it will converge in 100 
+   // iterations or less: the more iterations it consumes
+   // the slower convergence becomes so we have to be very 
+   // careful in it's usage.
+   //
+   if (s > -log(tools::epsilon<T>()) / 4.5)
+      result = detail::zeta_series2_imp(s, pol);
+   else
+      result = detail::zeta_series_imp(s, sc, pol);
+#endif
+   return result;
+}
+
+template <class T, class Policy>
+inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(s < 1)
+   {
+      // Rational Approximation
+      // Maximum Deviation Found:                     2.020e-18
+      // Expected Error Term:                         -2.020e-18
+      // Max error found at double precision:         3.994987e-17
+      static const T P[6] = {    
+         0.24339294433593750202L,
+         -0.49092470516353571651L,
+         0.0557616214776046784287L,
+         -0.00320912498879085894856L,
+         0.000451534528645796438704L,
+         -0.933241270357061460782e-5L,
+        };
+      static const T Q[6] = {    
+         1L,
+         -0.279960334310344432495L,
+         0.0419676223309986037706L,
+         -0.00413421406552171059003L,
+         0.00024978985622317935355L,
+         -0.101855788418564031874e-4L,
+      };
+      result = tools::evaluate_polynomial(P, sc) / tools::evaluate_polynomial(Q, sc);
+      result -= 1.2433929443359375F;
+      result += (sc);
+      result /= (sc);
+   }
+   else if(s <= 2)
+   {
+      // Maximum Deviation Found:        9.007e-20
+      // Expected Error Term:            9.007e-20
+      static const T P[6] = {    
+         0.577215664901532860516,
+         0.243210646940107164097,
+         0.0417364673988216497593,
+         0.00390252087072843288378,
+         0.000249606367151877175456,
+         0.110108440976732897969e-4,
+      };
+      static const T Q[6] = {    
+         1,
+         0.295201277126631761737,
+         0.043460910607305495864,
+         0.00434930582085826330659,
+         0.000255784226140488490982,
+         0.10991819782396112081e-4,
+      };
+      result = tools::evaluate_polynomial(P, T(-sc)) / tools::evaluate_polynomial(Q, T(-sc));
+      result += 1 / (-sc);
+   }
+   else if(s <= 4)
+   {
+      // Maximum Deviation Found:          5.946e-22
+      // Expected Error Term:              -5.946e-22
+      static const float Y = 0.6986598968505859375;
+      static const T P[6] = {    
+         -0.0537258300023595030676,
+         0.0445163473292365591906,
+         0.0128677673534519952905,
+         0.00097541770457391752726,
+         0.769875101573654070925e-4,
+         0.328032510000383084155e-5,
+      };
+      static const T Q[7] = {    
+         1,
+         0.33383194553034051422,
+         0.0487798431291407621462,
+         0.00479039708573558490716,
+         0.000270776703956336357707,
+         0.106951867532057341359e-4,
+         0.236276623974978646399e-7,
+      };
+      result = tools::evaluate_polynomial(P, T(s - 2)) / tools::evaluate_polynomial(Q, T(s - 2));
+      result += Y + 1 / (-sc);
+   }
+   else if(s <= 7)
+   {
+      // Maximum Deviation Found:                     2.955e-17
+      // Expected Error Term:                         2.955e-17
+      // Max error found at double precision:         2.009135e-16
+
+      static const T P[6] = {    
+         -2.49710190602259410021,
+         -2.60013301809475665334,
+         -0.939260435377109939261,
+         -0.138448617995741530935,
+         -0.00701721240549802377623,
+         -0.229257310594893932383e-4,
+      };
+      static const T Q[9] = {    
+         1,
+         0.706039025937745133628,
+         0.15739599649558626358,
+         0.0106117950976845084417,
+         -0.36910273311764618902e-4,
+         0.493409563927590008943e-5,
+         -0.234055487025287216506e-6,
+         0.718833729365459760664e-8,
+         -0.1129200113474947419e-9,
+      };
+      result = tools::evaluate_polynomial(P, T(s - 4)) / tools::evaluate_polynomial(Q, T(s - 4));
+      result = 1 + exp(result);
+   }
+   else if(s < 15)
+   {
+      // Maximum Deviation Found:                     7.117e-16
+      // Expected Error Term:                         7.117e-16
+      // Max error found at double precision:         9.387771e-16
+      static const T P[7] = {    
+         -4.78558028495135619286,
+         -1.89197364881972536382,
+         -0.211407134874412820099,
+         -0.000189204758260076688518,
+         0.00115140923889178742086,
+         0.639949204213164496988e-4,
+         0.139348932445324888343e-5,
+        };
+      static const T Q[9] = {    
+         1,
+         0.244345337378188557777,
+         0.00873370754492288653669,
+         -0.00117592765334434471562,
+         -0.743743682899933180415e-4,
+         -0.21750464515767984778e-5,
+         0.471001264003076486547e-8,
+         -0.833378440625385520576e-10,
+         0.699841545204845636531e-12,
+        };
+      result = tools::evaluate_polynomial(P, T(s - 7)) / tools::evaluate_polynomial(Q, T(s - 7));
+      result = 1 + exp(result);
+   }
+   else if(s < 36)
+   {
+      // Max error in interpolated form:             1.668e-17
+      // Max error found at long double precision:   1.669714e-17
+      static const T P[8] = {    
+         -10.3948950573308896825,
+         -2.85827219671106697179,
+         -0.347728266539245787271,
+         -0.0251156064655346341766,
+         -0.00119459173416968685689,
+         -0.382529323507967522614e-4,
+         -0.785523633796723466968e-6,
+         -0.821465709095465524192e-8,
+      };
+      static const T Q[10] = {    
+         1,
+         0.208196333572671890965,
+         0.0195687657317205033485,
+         0.00111079638102485921877,
+         0.408507746266039256231e-4,
+         0.955561123065693483991e-6,
+         0.118507153474022900583e-7,
+         0.222609483627352615142e-14,
+      };
+      result = tools::evaluate_polynomial(P, T(s - 15)) / tools::evaluate_polynomial(Q, T(s - 15));
+      result = 1 + exp(result);
+   }
+   else if(s < 56)
+   {
+      result = 1 + pow(T(2), -s);
+   }
+   else
+   {
+      result = 1;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<64>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(s < 1)
+   {
+      // Rational Approximation
+      // Maximum Deviation Found:                     3.099e-20
+      // Expected Error Term:                         3.099e-20
+      // Max error found at long double precision:    5.890498e-20
+      static const T P[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.243392944335937499969),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.496837806864865688082),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0680008039723709987107),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00511620413006619942112),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000455369899250053003335),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.279496685273033761927e-4),
+        };
+      static const T Q[7] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.30425480068225790522),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.050052748580371598736),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00519355671064700627862),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000360623385771198350257),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.159600883054550987633e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.339770279812410586032e-6),
+      };
+      result = tools::evaluate_polynomial(P, sc) / tools::evaluate_polynomial(Q, sc);
+      result -= 1.2433929443359375F;
+      result += (sc);
+      result /= (sc);
+   }
+   else if(s <= 2)
+   {
+      // Maximum Deviation Found:                     1.059e-21
+      // Expected Error Term:                         1.059e-21
+      // Max error found at long double precision:    1.626303e-19
+
+      static const T P[6] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.577215664901532860605),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.222537368917162139445),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0356286324033215682729),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00304465292366350081446),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000178102511649069421904),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.700867470265983665042e-5),
+      };
+      static const T Q[7] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.259385759149531030085),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0373974962106091316854),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00332735159183332820617),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000188690420706998606469),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.635994377921861930071e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.226583954978371199405e-7),
+      };
+      result = tools::evaluate_polynomial(P, T(-sc)) / tools::evaluate_polynomial(Q, T(-sc));
+      result += 1 / (-sc);
+   }
+   else if(s <= 4)
+   {
+      // Maximum Deviation Found:          5.946e-22
+      // Expected Error Term:              -5.946e-22
+      static const float Y = 0.6986598968505859375;
+      static const T P[7] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.053725830002359501027),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0470551187571475844778),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0101339410415759517471),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00100240326666092854528),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.685027119098122814867e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.390972820219765942117e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.540319769113543934483e-7),
+      };
+      static const T Q[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.286577739726542730421),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0447355811517733225843),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00430125107610252363302),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000284956969089786662045),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.116188101609848411329e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.278090318191657278204e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.19683620233222028478e-8),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 2)) / tools::evaluate_polynomial(Q, T(s - 2));
+      result += Y + 1 / (-sc);
+   }
+   else if(s <= 7)
+   {
+      // Max error found at long double precision: 8.132216e-19
+      static const T P[8] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -2.49710190602259407065),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -3.36664913245960625334),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -1.77180020623777595452),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.464717885249654313933),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0643694921293579472583),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00464265386202805715487),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000165556579779704340166),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.252884970740994069582e-5),
+      };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.01300131390690459085),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.387898115758643503827),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0695071490045701135188),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00586908595251442839291),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000217752974064612188616),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.397626583349419011731e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.927884739284359700764e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.119810501805618894381e-9),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 4)) / tools::evaluate_polynomial(Q, T(s - 4));
+      result = 1 + exp(result);
+   }
+   else if(s < 15)
+   {
+      // Max error in interpolated form:              1.133e-18
+      // Max error found at long double precision:    2.183198e-18
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -4.78558028495135548083),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -3.23873322238609358947),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.892338582881021799922),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.131326296217965913809),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0115651591773783712996),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.000657728968362695775205),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.252051328129449973047e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.626503445372641798925e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.815696314790853893484e-8),
+        };
+      static const T Q[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.525765665400123515036),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.10852641753657122787),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0115669945375362045249),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.000732896513858274091966),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.30683952282420248448e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.819649214609633126119e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.117957556472335968146e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.193432300973017671137e-12),
+        };
+      result = tools::evaluate_polynomial(P, T(s - 7)) / tools::evaluate_polynomial(Q, T(s - 7));
+      result = 1 + exp(result);
+   }
+   else if(s < 42)
+   {
+      // Max error in interpolated form:             1.668e-17
+      // Max error found at long double precision:   1.669714e-17
+      static const T P[9] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, -10.3948950573308861781),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -2.82646012777913950108),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.342144362739570333665),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.0249285145498722647472),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.00122493108848097114118),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.423055371192592850196e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.1025215577185967488e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.165096762663509467061e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.145392555873022044329e-9),
+      };
+      static const T Q[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.205135978585281988052),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.0192359357875879453602),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.00111496452029715514119),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.434928449016693986857e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.116911068726610725891e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.206704342290235237475e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.209772836100827647474e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 64, -0.939798249922234703384e-16),
+         BOOST_MATH_BIG_CONSTANT(T, 64, 0.264584017421245080294e-18),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 15)) / tools::evaluate_polynomial(Q, T(s - 15));
+      result = 1 + exp(result);
+   }
+   else if(s < 63)
+   {
+      result = 1 + pow(T(2), -s);
+   }
+   else
+   {
+      result = 1;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<113>&)
+{
+   BOOST_MATH_STD_USING
+   T result;
+   if(s < 1)
+   {
+      // Rational Approximation
+      // Maximum Deviation Found:                     9.493e-37
+      // Expected Error Term:                         9.492e-37
+      // Max error found at long double precision:    7.281332e-31
+
+      static const T P[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0353008629988648122808504280990313668),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0107795651204927743049369868548706909),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000523961870530500751114866884685172975),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.661805838304910731947595897966487515e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.658932670403818558510656304189164638e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.103437265642266106533814021041010453e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.116818787212666457105375746642927737e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.660690993901506912123512551294239036e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.113103113698388531428914333768142527e-10),
+        };
+      static const T Q[11] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.387483472099602327112637481818565459),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0802265315091063135271497708694776875),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0110727276164171919280036408995078164),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00112552716946286252000434849173787243),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.874554160748626916455655180296834352e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.530097847491828379568636739662278322e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.248461553590496154705565904497247452e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.881834921354014787309644951507523899e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.217062446168217797598596496310953025e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.315823200002384492377987848307151168e-11),
+      };
+      result = tools::evaluate_polynomial(P, sc) / tools::evaluate_polynomial(Q, sc);
+      result += (sc);
+      result /= (sc);
+   }
+   else if(s <= 2)
+   {
+      // Maximum Deviation Found:                     1.616e-37
+      // Expected Error Term:                         -1.615e-37
+
+      static const T P[10] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.577215664901532860606512090082402431),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.255597968739771510415479842335906308),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0494056503552807274142218876983542205),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00551372778611700965268920983472292325),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00043667616723970574871427830895192731),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.268562259154821957743669387915239528e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.109249633923016310141743084480436612e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.273895554345300227466534378753023924e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.583103205551702720149237384027795038e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.835774625259919268768735944711219256e-11),
+      };
+      static const T Q[11] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.316661751179735502065583176348292881),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0540401806533507064453851182728635272),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00598621274107420237785899476374043797),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000474907812321704156213038740142079615),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.272125421722314389581695715835862418e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.112649552156479800925522445229212933e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.301838975502992622733000078063330461e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.422960728687211282539769943184270106e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.377105263588822468076813329270698909e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.581926559304525152432462127383600681e-13),
+      };
+      result = tools::evaluate_polynomial(P, T(-sc)) / tools::evaluate_polynomial(Q, T(-sc));
+      result += 1 / (-sc);
+   }
+   else if(s <= 4)
+   {
+      // Maximum Deviation Found:                     1.891e-36
+      // Expected Error Term:                         -1.891e-36
+      // Max error found: 2.171527e-35
+
+      static const float Y = 0.6986598968505859375;
+      static const T P[11] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0537258300023595010275848333539748089),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0429086930802630159457448174466342553),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0136148228754303412510213395034056857),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00190231601036042925183751238033763915),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000186880390916311438818302549192456581),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.145347370745893262394287982691323657e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.805843276446813106414036600485884885e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.340818159286739137503297172091882574e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.115762357488748996526167305116837246e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.231904754577648077579913403645767214e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.340169592866058506675897646629036044e-12),
+      };
+      static const T Q[12] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.363755247765087100018556983050520554),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0696581979014242539385695131258321598),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00882208914484611029571547753782014817),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000815405623261946661762236085660996718),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.571366167062457197282642344940445452e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.309278269271853502353954062051797838e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.12822982083479010834070516053794262e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.397876357325018976733953479182110033e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.8484432107648683277598472295289279e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.105677416606909614301995218444080615e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.547223964564003701979951154093005354e-15),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 2)) / tools::evaluate_polynomial(Q, T(s - 2));
+      result += Y + 1 / (-sc);
+   }
+   else if(s <= 6)
+   {
+      // Max error in interpolated form:             1.510e-37
+      // Max error found at long double precision:   2.769266e-34
+
+      static const T Y = 3.28348541259765625F;
+
+      static const T P[13] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.786383506575062179339611614117697622),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.495766593395271370974685959652073976),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.409116737851754766422360889037532228),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.57340744006238263817895456842655987),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.280479899797421910694892949057963111),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0753148409447590257157585696212649869),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0122934003684672788499099362823748632),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00126148398446193639247961370266962927),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.828465038179772939844657040917364896e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.361008916706050977143208468690645684e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.109879825497910544424797771195928112e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.214539416789686920918063075528797059e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.15090220092460596872172844424267351e-10),
+      };
+      static const T Q[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.69490865837142338462982225731926485),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.22697696630994080733321401255942464),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.495409420862526540074366618006341533),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.122368084916843823462872905024259633),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0191412993625268971656513890888208623),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00191401538628980617753082598351559642),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000123318142456272424148930280876444459),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.531945488232526067889835342277595709e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.161843184071894368337068779669116236e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.305796079600152506743828859577462778e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.233582592298450202680170811044408894e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.275363878344548055574209713637734269e-13),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.221564186807357535475441900517843892e-15),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 4)) / tools::evaluate_polynomial(Q, T(s - 4));
+      result -= Y;
+      result = 1 + exp(result);
+   }
+   else if(s < 10)
+   {
+      // Max error in interpolated form:             1.999e-34
+      // Max error found at long double precision:   2.156186e-33
+
+      static const T P[13] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -4.0545627381873738086704293881227365),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -4.70088348734699134347906176097717782),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -2.36921550900925512951976617607678789),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.684322583796369508367726293719322866),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.126026534540165129870721937592996324),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.015636903921778316147260572008619549),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00135442294754728549644376325814460807),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.842793965853572134365031384646117061e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.385602133791111663372015460784978351e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.130458500394692067189883214401478539e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.315861074947230418778143153383660035e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.500334720512030826996373077844707164e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.420204769185233365849253969097184005e-12),
+        };
+      static const T Q[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.97663511666410096104783358493318814),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.40878780231201806504987368939673249),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0963890666609396058945084107597727252),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0142207619090854604824116070866614505),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00139010220902667918476773423995750877),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.940669540194694997889636696089994734e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.458220848507517004399292480807026602e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.16345521617741789012782420625435495e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.414007452533083304371566316901024114e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.68701473543366328016953742622661377e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.603461891080716585087883971886075863e-12),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.294670713571839023181857795866134957e-16),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.147003914536437243143096875069813451e-18),
+        };
+      result = tools::evaluate_polynomial(P, T(s - 6)) / tools::evaluate_polynomial(Q, T(s - 6));
+      result = 1 + exp(result);
+   }
+   else if(s < 17)
+   {
+      // Max error in interpolated form:             1.641e-32
+      // Max error found at long double precision:   1.696121e-32
+      static const T P[13] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -6.91319491921722925920883787894829678),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -3.65491257639481960248690596951049048),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.813557553449954526442644544105257881),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0994317301685870959473658713841138083),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00726896610245676520248617014211734906),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.000317253318715075854811266230916762929),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.66851422826636750855184211580127133e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.879464154730985406003332577806849971e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.113838903158254250631678791998294628e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.379184410304927316385211327537817583e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.612992858643904887150527613446403867e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.347873737198164757035457841688594788e-13),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.289187187441625868404494665572279364e-15),
+        };
+      static const T Q[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.427310044448071818775721584949868806),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.074602514873055756201435421385243062),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00688651562174480772901425121653945942),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000360174847635115036351323894321880445),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.973556847713307543918865405758248777e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.853455848314516117964634714780874197e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.118203513654855112421673192194622826e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.462521662511754117095006543363328159e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.834212591919475633107355719369463143e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.5354594751002702935740220218582929e-13),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.406451690742991192964889603000756203e-15),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.887948682401000153828241615760146728e-19),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.34980761098820347103967203948619072e-21),
+        };
+      result = tools::evaluate_polynomial(P, T(s - 10)) / tools::evaluate_polynomial(Q, T(s - 10));
+      result = 1 + exp(result);
+   }
+   else if(s < 30)
+   {
+      // Max error in interpolated form:             1.563e-31
+      // Max error found at long double precision:   1.562725e-31
+
+      static const T P[13] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -11.7824798233959252791987402769438322),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -4.36131215284987731928174218354118102),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.732260980060982349410898496846972204),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0744985185694913074484248803015717388),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.00517228281320594683022294996292250527),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.000260897206152101522569969046299309939),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.989553462123121764865178453128769948e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.286916799741891410827712096608826167e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.637262477796046963617949532211619729e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.106796831465628373325491288787760494e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.129343095511091870860498356205376823e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.102397936697965977221267881716672084e-13),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.402663128248642002351627980255756363e-16),
+      };
+      static const T Q[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.311288325355705609096155335186466508),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0438318468940415543546769437752132748),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.00374396349183199548610264222242269536),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.000218707451200585197339671707189281302),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.927578767487930747532953583797351219e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.294145760625753561951137473484889639e-6),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.704618586690874460082739479535985395e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.126333332872897336219649130062221257e-9),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.16317315713773503718315435769352765e-11),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.137846712823719515148344938160275695e-13),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.580975420554224366450994232723910583e-16),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.291354445847552426900293580511392459e-22),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.73614324724785855925025452085443636e-25),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 17)) / tools::evaluate_polynomial(Q, T(s - 17));
+      result = 1 + exp(result);
+   }
+   else if(s < 74)
+   {
+      // Max error in interpolated form:             2.311e-27
+      // Max error found at long double precision:   2.297544e-27
+      static const T P[14] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, -20.7944102007844314586649688802236072),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -4.95759941987499442499908748130192187),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.563290752832461751889194629200298688),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0406197001137935911912457120706122877),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.0020846534789473022216888863613422293),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.808095978462109173749395599401375667e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.244706022206249301640890603610060959e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.589477682919645930544382616501666572e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.113699573675553496343617442433027672e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.174767860183598149649901223128011828e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.210051620306761367764549971980026474e-12),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.189187969537370950337212675466400599e-14),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.116313253429564048145641663778121898e-16),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.376708747782400769427057630528578187e-19),
+      };
+      static const T Q[16] = {    
+         BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.205076752981410805177554569784219717),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.0202526722696670378999575738524540269),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.001278305290005994980069466658219057),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.576404779858501791742255670403304787e-4),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.196477049872253010859712483984252067e-5),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.521863830500876189501054079974475762e-7),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.109524209196868135198775445228552059e-8),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.181698713448644481083966260949267825e-10),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.234793316975091282090312036524695562e-12),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.227490441461460571047545264251399048e-14),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.151500292036937400913870642638520668e-16),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.543475775154780935815530649335936121e-19),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.241647013434111434636554455083309352e-28),
+         BOOST_MATH_BIG_CONSTANT(T, 113, -0.557103423021951053707162364713587374e-31),
+         BOOST_MATH_BIG_CONSTANT(T, 113, 0.618708773442584843384712258199645166e-34),
+      };
+      result = tools::evaluate_polynomial(P, T(s - 30)) / tools::evaluate_polynomial(Q, T(s - 30));
+      result = 1 + exp(result);
+   }
+   else if(s < 117)
+   {
+      result = 1 + pow(T(2), -s);
+   }
+   else
+   {
+      result = 1;
+   }
+   return result;
+}
+
+template <class T, class Policy>
+T zeta_imp_odd_integer(int s, const T&, const Policy&, const mpl::true_&)
+{
+   static const T results[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.2020569031595942853997381615114500), BOOST_MATH_BIG_CONSTANT(T, 113, 1.0369277551433699263313654864570342), BOOST_MATH_BIG_CONSTANT(T, 113, 1.0083492773819228268397975498497968), BOOST_MATH_BIG_CONSTANT(T, 113, 1.0020083928260822144178527692324121), BOOST_MATH_BIG_CONSTANT(T, 113, 1.0004941886041194645587022825264699), BOOST_MATH_BIG_CONSTANT(T, 113, 1.0001227133475784891467518365263574), BOOST_MATH_BIG_CONSTANT(T, 113, 1.00003058823630702049355172 [...]
+   };
+   return s > 113 ? 1 : results[(s - 3) / 2];
+}
+
+template <class T, class Policy>
+T zeta_imp_odd_integer(int s, const T& sc, const Policy& pol, const mpl::false_&)
+{
+   static bool is_init = false;
+   static T results[50] = {};
+   if(!is_init)
+   {
+      is_init = true;
+      for(int k = 0; k < sizeof(results) / sizeof(results[0]); ++k)
+      {
+         T arg = k * 2 + 3;
+         T c_arg = 1 - arg;
+         results[k] = zeta_polynomial_series(arg, c_arg, pol);
+      }
+   }
+   int index = (s - 3) / 2;
+   return index >= sizeof(results) / sizeof(results[0]) ? zeta_polynomial_series(T(s), sc, pol): results[index];
+}
+
+template <class T, class Policy, class Tag>
+T zeta_imp(T s, T sc, const Policy& pol, const Tag& tag)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::zeta<%1%>";
+   if(sc == 0)
+      return policies::raise_pole_error<T>(
+         function, 
+         "Evaluation of zeta function at pole %1%", 
+         s, pol);
+   T result;
+   //
+   // Trivial case:
+   //
+   if(s > policies::digits<T, Policy>())
+      return 1;
+   //
+   // Start by seeing if we have a simple closed form:
+   //
+   if(floor(s) == s)
+   {
+      try
+      {
+         int v = itrunc(s);
+         if(v == s)
+         {
+            if(v < 0)
+            {
+               if(((-v) & 1) == 0)
+                  return 0;
+               int n = (-v + 1) / 2;
+               if(n <= boost::math::max_bernoulli_b2n<T>::value)
+                  return T((-v & 1) ? -1 : 1) * boost::math::unchecked_bernoulli_b2n<T>(n) / (1 - v);
+            }
+            else if((v & 1) == 0)
+            {
+               if(((v / 2) <= boost::math::max_bernoulli_b2n<T>::value) && (v <= boost::math::max_factorial<T>::value))
+                  return T(((v / 2 - 1) & 1) ? -1 : 1) * ldexp(T(1), v - 1) * pow(constants::pi<T, Policy>(), v) *
+                     boost::math::unchecked_bernoulli_b2n<T>(v / 2) / boost::math::unchecked_factorial<T>(v);
+               return T(((v / 2 - 1) & 1) ? -1 : 1) * ldexp(T(1), v - 1) * pow(constants::pi<T, Policy>(), v) *
+                  boost::math::bernoulli_b2n<T>(v / 2) / boost::math::factorial<T>(v);
+            }
+            else
+               return zeta_imp_odd_integer(v, sc, pol, mpl::bool_<(Tag::value <= 113) && Tag::value>());
+         }
+      }
+      catch(const boost::math::rounding_error&){} // Just fall through, s is too large to round
+      catch(const std::overflow_error&){}
+   }
+
+   if(fabs(s) < tools::root_epsilon<T>())
+   {
+      result = -0.5f - constants::log_root_two_pi<T, Policy>() * s;
+   }
+   else if(s < 0)
+   {
+      std::swap(s, sc);
+      if(floor(sc/2) == sc/2)
+         result = 0;
+      else
+      {
+         if(s > max_factorial<T>::value)
+         {
+            T mult = boost::math::sin_pi(0.5f * sc, pol) * 2 * zeta_imp(s, sc, pol, tag);
+            result = boost::math::lgamma(s, pol);
+            result -= s * log(2 * constants::pi<T>());
+            if(result > tools::log_max_value<T>())
+               return sign(mult) * policies::raise_overflow_error<T>(function, 0, pol);
+            result = exp(result);
+            if(tools::max_value<T>() / fabs(mult) < result)
+               return boost::math::sign(mult) * policies::raise_overflow_error<T>(function, 0, pol);
+            result *= mult;
+         }
+         else
+         {
+            result = boost::math::sin_pi(0.5f * sc, pol)
+               * 2 * pow(2 * constants::pi<T>(), -s) 
+               * boost::math::tgamma(s, pol) 
+               * zeta_imp(s, sc, pol, tag);
+         }
+      }
+   }
+   else
+   {
+      result = zeta_imp_prec(s, sc, pol, tag);
+   }
+   return result;
+}
+
+template <class T, class Policy, class tag>
+struct zeta_initializer
+{
+   struct init
+   {
+      init()
+      {
+         do_init(tag());
+      }
+      static void do_init(const mpl::int_<0>&){ boost::math::zeta(static_cast<T>(5), Policy()); }
+      static void do_init(const mpl::int_<53>&){ boost::math::zeta(static_cast<T>(5), Policy()); }
+      static void do_init(const mpl::int_<64>&)
+      {
+         boost::math::zeta(static_cast<T>(0.5), Policy());
+         boost::math::zeta(static_cast<T>(1.5), Policy());
+         boost::math::zeta(static_cast<T>(3.5), Policy());
+         boost::math::zeta(static_cast<T>(6.5), Policy());
+         boost::math::zeta(static_cast<T>(14.5), Policy());
+         boost::math::zeta(static_cast<T>(40.5), Policy());
+
+         boost::math::zeta(static_cast<T>(5), Policy());
+      }
+      static void do_init(const mpl::int_<113>&)
+      {
+         boost::math::zeta(static_cast<T>(0.5), Policy());
+         boost::math::zeta(static_cast<T>(1.5), Policy());
+         boost::math::zeta(static_cast<T>(3.5), Policy());
+         boost::math::zeta(static_cast<T>(5.5), Policy());
+         boost::math::zeta(static_cast<T>(9.5), Policy());
+         boost::math::zeta(static_cast<T>(16.5), Policy());
+         boost::math::zeta(static_cast<T>(25.5), Policy());
+         boost::math::zeta(static_cast<T>(70.5), Policy());
+
+         boost::math::zeta(static_cast<T>(5), Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy, class tag>
+const typename zeta_initializer<T, Policy, tag>::init zeta_initializer<T, Policy, tag>::initializer;
+
+} // detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type zeta(T s, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<result_type, Policy>::type precision_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   typedef typename mpl::if_<
+      mpl::less_equal<precision_type, mpl::int_<0> >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less_equal<precision_type, mpl::int_<53> >,
+         mpl::int_<53>,  // double
+         typename mpl::if_<
+            mpl::less_equal<precision_type, mpl::int_<64> >,
+            mpl::int_<64>, // 80-bit long double
+            typename mpl::if_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::int_<113>, // 128-bit long double
+               mpl::int_<0> // too many bits, use generic version.
+            >::type
+         >::type
+      >::type
+   >::type tag_type;
+   //typedef mpl::int_<0> tag_type;
+
+   detail::zeta_initializer<value_type, forwarding_policy, tag_type>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::zeta_imp(
+      static_cast<value_type>(s),
+      static_cast<value_type>(1 - static_cast<value_type>(s)),
+      forwarding_policy(),
+      tag_type()), "boost::math::zeta<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type zeta(T s)
+{
+   return zeta(s, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ZETA_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/big_constant.hpp b/gatb-core/thirdparty/boost/math/tools/big_constant.hpp
new file mode 100644
index 0000000..ff13633
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/big_constant.hpp
@@ -0,0 +1,86 @@
+
+//  Copyright (c) 2011 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_BIG_CONSTANT_HPP
+#define BOOST_MATH_TOOLS_BIG_CONSTANT_HPP
+
+#include <boost/math/tools/config.hpp>
+#ifndef BOOST_MATH_NO_LEXICAL_CAST
+#include <boost/lexical_cast.hpp>
+#endif
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost{ namespace math{ 
+
+namespace tools{
+
+template <class T>
+struct numeric_traits : public std::numeric_limits< T > {};
+
+#ifdef BOOST_MATH_USE_FLOAT128
+typedef __float128 largest_float;
+#define BOOST_MATH_LARGEST_FLOAT_C(x) x##Q
+template <>
+struct numeric_traits<__float128>
+{
+   static const int digits = 113;
+   static const int digits10 = 33;
+   static const int max_exponent = 16384;
+   static const bool is_specialized = true;
+};
+#else
+typedef long double largest_float;
+#define BOOST_MATH_LARGEST_FLOAT_C(x) x##L
+#endif
+
+template <class T>
+inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::false_ const&)
+{
+   return static_cast<T>(v);
+}
+template <class T>
+inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::true_ const&)
+{
+   return static_cast<T>(v);
+}
+#ifndef BOOST_MATH_NO_LEXICAL_CAST
+template <class T>
+inline T make_big_value(largest_float, const char* s, mpl::false_ const&, mpl::false_ const&)
+{
+   return boost::lexical_cast<T>(s);
+}
+#endif
+template <class T>
+inline BOOST_CONSTEXPR const char* make_big_value(largest_float, const char* s, mpl::false_ const&, mpl::true_ const&)
+{
+   return s;
+}
+
+//
+// For constants which might fit in a long double (if it's big enough):
+//
+#define BOOST_MATH_BIG_CONSTANT(T, D, x)\
+   boost::math::tools::make_big_value<T>(\
+      BOOST_MATH_LARGEST_FLOAT_C(x), \
+      BOOST_STRINGIZE(x), \
+      mpl::bool_< (is_convertible<boost::math::tools::largest_float, T>::value) && \
+      ((D <= boost::math::tools::numeric_traits<boost::math::tools::largest_float>::digits) \
+          || is_floating_point<T>::value \
+          || (boost::math::tools::numeric_traits<T>::is_specialized && \
+          (boost::math::tools::numeric_traits<T>::digits10 <= boost::math::tools::numeric_traits<boost::math::tools::largest_float>::digits10))) >(), \
+      boost::is_convertible<const char*, T>())
+//
+// For constants too huge for any conceivable long double (and which generate compiler errors if we try and declare them as such):
+//
+#define BOOST_MATH_HUGE_CONSTANT(T, D, x)\
+   boost::math::tools::make_big_value<T>(0.0L, BOOST_STRINGIZE(x), \
+   mpl::bool_<is_floating_point<T>::value || (boost::math::tools::numeric_traits<T>::is_specialized && boost::math::tools::numeric_traits<T>::max_exponent <= boost::math::tools::numeric_traits<boost::math::tools::largest_float>::max_exponent && boost::math::tools::numeric_traits<T>::digits <= boost::math::tools::numeric_traits<boost::math::tools::largest_float>::digits)>(), \
+   boost::is_convertible<const char*, T>())
+
+}}} // namespaces
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/tools/config.hpp b/gatb-core/thirdparty/boost/math/tools/config.hpp
new file mode 100644
index 0000000..e88f578
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/config.hpp
@@ -0,0 +1,409 @@
+//  Copyright (c) 2006-7 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_CONFIG_HPP
+#define BOOST_MATH_TOOLS_CONFIG_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp> // for boost::uintmax_t
+#include <boost/detail/workaround.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <algorithm>  // for min and max
+#include <boost/config/no_tr1/cmath.hpp>
+#include <climits>
+#include <cfloat>
+#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
+#  include <math.h>
+#endif
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+#  include <limits>
+#endif
+
+#include <boost/math/tools/user.hpp>
+
+#if (defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__NetBSD__) \
+   || (defined(__hppa) && !defined(__OpenBSD__)) || (defined(__NO_LONG_DOUBLE_MATH) && (DBL_MANT_DIG != LDBL_MANT_DIG))) \
+   && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+#  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#endif
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+//
+// Borland post 5.8.2 uses Dinkumware's std C lib which
+// doesn't have true long double precision.  Earlier
+// versions are problematic too:
+//
+#  define BOOST_MATH_NO_REAL_CONCEPT_TESTS
+#  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#  define BOOST_MATH_CONTROL_FP _control87(MCW_EM,MCW_EM)
+#  include <float.h>
+#endif
+#ifdef __IBMCPP__
+//
+// For reasons I don't unserstand, the tests with IMB's compiler all
+// pass at long double precision, but fail with real_concept, those tests
+// are disabled for now.  (JM 2012).
+#  define BOOST_MATH_NO_REAL_CONCEPT_TESTS
+#endif
+#ifdef sun
+// Any use of __float128 in program startup code causes a segfault  (tested JM 2015, Solaris 11).
+#  define BOOST_MATH_DISABLE_FLOAT128
+#endif
+#ifdef __HAIKU__
+//
+// Not sure what's up with the math detection on Haiku, but linking fails with
+// float128 code enabled, and we don't have an implementation of __expl, so
+// disabling long double functions for now as well.
+#  define BOOST_MATH_DISABLE_FLOAT128
+#  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#endif
+#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && ((LDBL_MANT_DIG == 106) || (__LDBL_MANT_DIG__ == 106)) && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+//
+// Darwin's rather strange "double double" is rather hard to
+// support, it should be possible given enough effort though...
+//
+#  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#endif
+#if defined(unix) && defined(__INTEL_COMPILER) && (__INTEL_COMPILER <= 1000) && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+//
+// Intel compiler prior to version 10 has sporadic problems
+// calling the long double overloads of the std lib math functions:
+// calling ::powl is OK, but std::pow(long double, long double) 
+// may segfault depending upon the value of the arguments passed 
+// and the specific Linux distribution.
+//
+// We'll be conservative and disable long double support for this compiler.
+//
+// Comment out this #define and try building the tests to determine whether
+// your Intel compiler version has this issue or not.
+//
+#  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#endif
+#if defined(unix) && defined(__INTEL_COMPILER)
+//
+// Intel compiler has sporadic issues compiling std::fpclassify depending on
+// the exact OS version used.  Use our own code for this as we know it works
+// well on Intel processors:
+//
+#define BOOST_MATH_DISABLE_STD_FPCLASSIFY
+#endif
+
+#if defined(BOOST_MSVC) && !defined(_WIN32_WCE)
+   // Better safe than sorry, our tests don't support hardware exceptions:
+#  define BOOST_MATH_CONTROL_FP _control87(MCW_EM,MCW_EM)
+#endif
+
+#ifdef __IBMCPP__
+#  define BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS
+#endif
+
+#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901))
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if (defined(__hpux) && !defined(__hppa))
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if defined(__GNUC__) && defined(_GLIBCXX_USE_C99)
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if defined(_LIBCPP_VERSION) && !defined(_MSC_VER)
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if defined(__CYGWIN__) || defined(__HP_aCC) || defined(BOOST_INTEL) \
+  || defined(BOOST_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY) \
+  || (defined(__GNUC__) && !defined(BOOST_MATH_USE_C99))\
+  || defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+#  define BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY
+#endif
+
+#if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590)
+
+#  include "boost/type.hpp"
+#  include "boost/non_type.hpp"
+
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(t)         boost::type<t>* = 0
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(t)    boost::type<t>*
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE(t, v)  boost::non_type<t, v>* = 0
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)  boost::non_type<t, v>*
+
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(t)         \
+             , BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(t)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)    \
+             , BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)  \
+             , BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)  \
+             , BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
+
+#else
+
+// no workaround needed: expand to nothing
+
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(t)
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
+#  define BOOST_MATH_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
+
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(t)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
+#  define BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
+
+
+#endif // __SUNPRO_CC
+
+#if (defined(__SUNPRO_CC) || defined(__hppa) || defined(__GNUC__)) && !defined(BOOST_MATH_SMALL_CONSTANT)
+// Sun's compiler emits a hard error if a constant underflows,
+// as does aCC on PA-RISC, while gcc issues a large number of warnings:
+#  define BOOST_MATH_SMALL_CONSTANT(x) 0.0
+#else
+#  define BOOST_MATH_SMALL_CONSTANT(x) x
+#endif
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+//
+// Define if constants too large for a float cause "bad"
+// values to be stored in the data, rather than infinity
+// or a suitably large value.
+//
+#  define BOOST_MATH_BUGGY_LARGE_FLOAT_CONSTANTS
+#endif
+//
+// Tune performance options for specific compilers:
+//
+#ifdef BOOST_MSVC
+#  define BOOST_MATH_POLY_METHOD 2
+#elif defined(BOOST_INTEL)
+#  define BOOST_MATH_POLY_METHOD 2
+#  define BOOST_MATH_RATIONAL_METHOD 2
+#elif defined(__GNUC__)
+#  define BOOST_MATH_POLY_METHOD 3
+#  define BOOST_MATH_RATIONAL_METHOD 3
+#  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##.0L
+#endif
+
+#if defined(BOOST_NO_LONG_LONG) && !defined(BOOST_MATH_INT_TABLE_TYPE)
+#  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##.0L
+#endif
+
+//
+// The maximum order of polynomial that will be evaluated 
+// via an unrolled specialisation:
+//
+#ifndef BOOST_MATH_MAX_POLY_ORDER
+#  define BOOST_MATH_MAX_POLY_ORDER 17
+#endif 
+//
+// Set the method used to evaluate polynomials and rationals:
+//
+#ifndef BOOST_MATH_POLY_METHOD
+#  define BOOST_MATH_POLY_METHOD 1
+#endif 
+#ifndef BOOST_MATH_RATIONAL_METHOD
+#  define BOOST_MATH_RATIONAL_METHOD 0
+#endif 
+//
+// decide whether to store constants as integers or reals:
+//
+#ifndef BOOST_MATH_INT_TABLE_TYPE
+#  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
+#endif
+#ifndef BOOST_MATH_INT_VALUE_SUFFIX
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##SUF
+#endif
+//
+// Test whether to support __float128:
+//
+#if defined(_GLIBCXX_USE_FLOAT128) && defined(BOOST_GCC) && !defined(__STRICT_ANSI__) \
+   && !defined(BOOST_MATH_DISABLE_FLOAT128) || defined(BOOST_MATH_USE_FLOAT128)
+//
+// Only enable this when the compiler really is GCC as clang and probably 
+// intel too don't support __float128 yet :-(
+//
+#ifndef BOOST_MATH_USE_FLOAT128
+#  define BOOST_MATH_USE_FLOAT128
+#endif
+
+#  if defined(BOOST_INTEL) && defined(BOOST_INTEL_CXX_VERSION) && (BOOST_INTEL_CXX_VERSION >= 1310) && defined(__GNUC__)
+#    if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))
+#      define BOOST_MATH_FLOAT128_TYPE __float128
+#    endif
+#  elif defined(__GNUC__)
+#      define BOOST_MATH_FLOAT128_TYPE __float128
+#  endif
+
+#  ifndef BOOST_MATH_FLOAT128_TYPE
+#      define BOOST_MATH_FLOAT128_TYPE _Quad
+#  endif
+#endif
+//
+// Check for WinCE with no iostream support:
+//
+#if defined(_WIN32_WCE) && !defined(__SGI_STL_PORT)
+#  define BOOST_MATH_NO_LEXICAL_CAST
+#endif
+
+//
+// Helper macro for controlling the FP behaviour:
+//
+#ifndef BOOST_MATH_CONTROL_FP
+#  define BOOST_MATH_CONTROL_FP
+#endif
+//
+// Helper macro for using statements:
+//
+#define BOOST_MATH_STD_USING_CORE \
+   using std::abs;\
+   using std::acos;\
+   using std::cos;\
+   using std::fmod;\
+   using std::modf;\
+   using std::tan;\
+   using std::asin;\
+   using std::cosh;\
+   using std::frexp;\
+   using std::pow;\
+   using std::tanh;\
+   using std::atan;\
+   using std::exp;\
+   using std::ldexp;\
+   using std::sin;\
+   using std::atan2;\
+   using std::fabs;\
+   using std::log;\
+   using std::sinh;\
+   using std::ceil;\
+   using std::floor;\
+   using std::log10;\
+   using std::sqrt;
+
+#define BOOST_MATH_STD_USING BOOST_MATH_STD_USING_CORE
+
+namespace boost{ namespace math{
+namespace tools
+{
+
+template <class T>
+inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c)
+{
+   return (std::max)((std::max)(a, b), c);
+}
+
+template <class T>
+inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d)
+{
+   return (std::max)((std::max)(a, b), (std::max)(c, d));
+}
+
+} // namespace tools
+
+template <class T>
+void suppress_unused_variable_warning(const T&)
+{
+}
+
+namespace detail{
+
+template <class T>
+struct is_integer_for_rounding
+{
+   static const bool value = boost::is_integral<T>::value
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      || (std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_integer)
+#endif
+      ;
+};
+
+}
+
+}} // namespace boost namespace math
+
+#ifdef __GLIBC_PREREQ
+#  if __GLIBC_PREREQ(2,14)
+#     define BOOST_MATH_HAVE_FIXED_GLIBC
+#  endif
+#endif
+
+#if ((defined(__linux__) && !defined(__UCLIBC__) && !defined(BOOST_MATH_HAVE_FIXED_GLIBC)) || defined(__QNX__) || defined(__IBMCPP__)) && !defined(BOOST_NO_FENV_H)
+//
+// This code was introduced in response to this glibc bug: http://sourceware.org/bugzilla/show_bug.cgi?id=2445
+// Basically powl and expl can return garbage when the result is small and certain exception flags are set
+// on entrance to these functions.  This appears to have been fixed in Glibc 2.14 (May 2011).
+// Much more information in this message thread: https://groups.google.com/forum/#!topic/boost-list/ZT99wtIFlb4
+//
+
+   #include <boost/detail/fenv.hpp>
+
+#  ifdef FE_ALL_EXCEPT
+
+namespace boost{ namespace math{
+   namespace detail
+   {
+   struct fpu_guard
+   {
+      fpu_guard()
+      {
+         fegetexceptflag(&m_flags, FE_ALL_EXCEPT);
+         feclearexcept(FE_ALL_EXCEPT);
+      }
+      ~fpu_guard()
+      {
+         fesetexceptflag(&m_flags, FE_ALL_EXCEPT);
+      }
+   private:
+      fexcept_t m_flags;
+   };
+
+   } // namespace detail
+   }} // namespaces
+
+#    define BOOST_FPU_EXCEPTION_GUARD boost::math::detail::fpu_guard local_guard_object;
+#    define BOOST_MATH_INSTRUMENT_FPU do{ fexcept_t cpu_flags; fegetexceptflag(&cpu_flags, FE_ALL_EXCEPT); BOOST_MATH_INSTRUMENT_VARIABLE(cpu_flags); } while(0); 
+
+#  else
+
+#    define BOOST_FPU_EXCEPTION_GUARD
+#    define BOOST_MATH_INSTRUMENT_FPU
+
+#  endif
+
+#else // All other platforms.
+#  define BOOST_FPU_EXCEPTION_GUARD
+#  define BOOST_MATH_INSTRUMENT_FPU
+#endif
+
+#ifdef BOOST_MATH_INSTRUMENT
+
+#  include <iostream>
+#  include <iomanip>
+#  include <typeinfo>
+
+#  define BOOST_MATH_INSTRUMENT_CODE(x) \
+      std::cout << std::setprecision(35) << __FILE__ << ":" << __LINE__ << " " << x << std::endl;
+#  define BOOST_MATH_INSTRUMENT_VARIABLE(name) BOOST_MATH_INSTRUMENT_CODE(BOOST_STRINGIZE(name) << " = " << name)
+
+#else
+
+#  define BOOST_MATH_INSTRUMENT_CODE(x)
+#  define BOOST_MATH_INSTRUMENT_VARIABLE(name)
+
+#endif
+
+#endif // BOOST_MATH_TOOLS_CONFIG_HPP
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_10.hpp
new file mode 100644
index 0000000..b13d6a3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_10.hpp
@@ -0,0 +1,84 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_11.hpp
new file mode 100644
index 0000000..f0cf67e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_11.hpp
@@ -0,0 +1,90 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_12.hpp
new file mode 100644
index 0000000..03b974c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_12.hpp
@@ -0,0 +1,96 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_13.hpp
new file mode 100644
index 0000000..b947f54
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_13.hpp
@@ -0,0 +1,102 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_14.hpp
new file mode 100644
index 0000000..8374e38
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_14.hpp
@@ -0,0 +1,108 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_15.hpp
new file mode 100644
index 0000000..ebfa463
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_15.hpp
@@ -0,0 +1,114 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_16.hpp
new file mode 100644
index 0000000..60eb4dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_16.hpp
@@ -0,0 +1,120 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_17.hpp
new file mode 100644
index 0000000..6233f1b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_17.hpp
@@ -0,0 +1,126 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_18.hpp
new file mode 100644
index 0000000..2a06def
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_18.hpp
@@ -0,0 +1,132 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_19.hpp
new file mode 100644
index 0000000..8f0da8b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_19.hpp
@@ -0,0 +1,138 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   return static_cast<V>((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_2.hpp
new file mode 100644
index 0000000..a0b10d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_2.hpp
@@ -0,0 +1,36 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_20.hpp
new file mode 100644
index 0000000..d1a886d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_20.hpp
@@ -0,0 +1,144 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   return static_cast<V>((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+{
+   return static_cast<V>(((((((((((((((((((a[19] * x + a[18]) * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_3.hpp
new file mode 100644
index 0000000..715a69a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_3.hpp
@@ -0,0 +1,42 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_4.hpp
new file mode 100644
index 0000000..d74b7a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_4.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_5.hpp
new file mode 100644
index 0000000..bb66e6c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_5.hpp
@@ -0,0 +1,54 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_6.hpp
new file mode 100644
index 0000000..a29c271
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_6.hpp
@@ -0,0 +1,60 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_7.hpp
new file mode 100644
index 0000000..093ab89
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_7.hpp
@@ -0,0 +1,66 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_8.hpp
new file mode 100644
index 0000000..a3d329a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_8.hpp
@@ -0,0 +1,72 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_9.hpp
new file mode 100644
index 0000000..e90f578
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner1_9.hpp
@@ -0,0 +1,78 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_10.hpp
new file mode 100644
index 0000000..7c4101f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_10.hpp
@@ -0,0 +1,90 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_11.hpp
new file mode 100644
index 0000000..bebd1e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_11.hpp
@@ -0,0 +1,97 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_12.hpp
new file mode 100644
index 0000000..c4da24a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_12.hpp
@@ -0,0 +1,104 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_13.hpp
new file mode 100644
index 0000000..5d7dddc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_13.hpp
@@ -0,0 +1,111 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_14.hpp
new file mode 100644
index 0000000..21a5a37
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_14.hpp
@@ -0,0 +1,118 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_15.hpp
new file mode 100644
index 0000000..7b41214
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_15.hpp
@@ -0,0 +1,125 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_16.hpp
new file mode 100644
index 0000000..aa3763a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_16.hpp
@@ -0,0 +1,132 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_17.hpp
new file mode 100644
index 0000000..6ed5566
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_17.hpp
@@ -0,0 +1,139 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_18.hpp
new file mode 100644
index 0000000..02c72b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_18.hpp
@@ -0,0 +1,146 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_19.hpp
new file mode 100644
index 0000000..6e36ace
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_19.hpp
@@ -0,0 +1,153 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_2.hpp
new file mode 100644
index 0000000..e2a4e7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_2.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_20.hpp
new file mode 100644
index 0000000..e394b6b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_20.hpp
@@ -0,0 +1,160 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((((((((a[19] * x2 + a[17]) * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_3.hpp
new file mode 100644
index 0000000..187b86c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_3.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_4.hpp
new file mode 100644
index 0000000..84badc3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_4.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_5.hpp
new file mode 100644
index 0000000..287b4be
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_5.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_6.hpp
new file mode 100644
index 0000000..3662d44
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_6.hpp
@@ -0,0 +1,62 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_7.hpp
new file mode 100644
index 0000000..78ed0df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_7.hpp
@@ -0,0 +1,69 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_8.hpp
new file mode 100644
index 0000000..ac8e941
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_8.hpp
@@ -0,0 +1,76 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_9.hpp
new file mode 100644
index 0000000..e1a3d17
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner2_9.hpp
@@ -0,0 +1,83 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_10.hpp
new file mode 100644
index 0000000..69736d7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_10.hpp
@@ -0,0 +1,156 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_11.hpp
new file mode 100644
index 0000000..273ed53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_11.hpp
@@ -0,0 +1,181 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_12.hpp
new file mode 100644
index 0000000..3405674
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_12.hpp
@@ -0,0 +1,208 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_13.hpp
new file mode 100644
index 0000000..849c93e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_13.hpp
@@ -0,0 +1,237 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_14.hpp
new file mode 100644
index 0000000..f5ac1df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_14.hpp
@@ -0,0 +1,268 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_15.hpp
new file mode 100644
index 0000000..b57af7e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_15.hpp
@@ -0,0 +1,301 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_16.hpp
new file mode 100644
index 0000000..1fc8560
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_16.hpp
@@ -0,0 +1,336 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[15] * x2 + a[13];
+   t[1] = a[14] * x2 + a[12];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_17.hpp
new file mode 100644
index 0000000..4a0d0aa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_17.hpp
@@ -0,0 +1,373 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[15] * x2 + a[13];
+   t[1] = a[14] * x2 + a[12];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[16] * x2 + a[14]);
+   t[1] = static_cast<V>(a[15] * x2 + a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_18.hpp
new file mode 100644
index 0000000..899117d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_18.hpp
@@ -0,0 +1,412 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[15] * x2 + a[13];
+   t[1] = a[14] * x2 + a[12];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[16] * x2 + a[14]);
+   t[1] = static_cast<V>(a[15] * x2 + a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[17] * x2 + a[15];
+   t[1] = a[16] * x2 + a[14];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[13]);
+   t[1] += static_cast<V>(a[12]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_19.hpp
new file mode 100644
index 0000000..7c4f728
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_19.hpp
@@ -0,0 +1,453 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[15] * x2 + a[13];
+   t[1] = a[14] * x2 + a[12];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[16] * x2 + a[14]);
+   t[1] = static_cast<V>(a[15] * x2 + a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[17] * x2 + a[15];
+   t[1] = a[16] * x2 + a[14];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[13]);
+   t[1] += static_cast<V>(a[12]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[18] * x2 + a[16]);
+   t[1] = static_cast<V>(a[17] * x2 + a[15]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[14]);
+   t[1] += static_cast<V>(a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_2.hpp
new file mode 100644
index 0000000..372630c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_2.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_20.hpp
new file mode 100644
index 0000000..b20e0d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_20.hpp
@@ -0,0 +1,496 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[9] * x2 + a[7];
+   t[1] = a[8] * x2 + a[6];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[10] * x2 + a[8]);
+   t[1] = static_cast<V>(a[9] * x2 + a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[11] * x2 + a[9];
+   t[1] = a[10] * x2 + a[8];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[12] * x2 + a[10]);
+   t[1] = static_cast<V>(a[11] * x2 + a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[13] * x2 + a[11];
+   t[1] = a[12] * x2 + a[10];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[14] * x2 + a[12]);
+   t[1] = static_cast<V>(a[13] * x2 + a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[15] * x2 + a[13];
+   t[1] = a[14] * x2 + a[12];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[16] * x2 + a[14]);
+   t[1] = static_cast<V>(a[15] * x2 + a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[17] * x2 + a[15];
+   t[1] = a[16] * x2 + a[14];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[13]);
+   t[1] += static_cast<V>(a[12]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[18] * x2 + a[16]);
+   t[1] = static_cast<V>(a[17] * x2 + a[15]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[14]);
+   t[1] += static_cast<V>(a[13]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[12]);
+   t[1] += static_cast<V>(a[11]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[10]);
+   t[1] += static_cast<V>(a[9]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[8]);
+   t[1] += static_cast<V>(a[7]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[6]);
+   t[1] += static_cast<V>(a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[19] * x2 + a[17];
+   t[1] = a[18] * x2 + a[16];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[15]);
+   t[1] += static_cast<V>(a[14]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[13]);
+   t[1] += static_cast<V>(a[12]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[11]);
+   t[1] += static_cast<V>(a[10]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[9]);
+   t[1] += static_cast<V>(a[8]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[7]);
+   t[1] += static_cast<V>(a[6]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[5]);
+   t[1] += static_cast<V>(a[4]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_3.hpp
new file mode 100644
index 0000000..cc6b1a9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_3.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_4.hpp
new file mode 100644
index 0000000..74192f0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_4.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_5.hpp
new file mode 100644
index 0000000..73d1900
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_5.hpp
@@ -0,0 +1,61 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_6.hpp
new file mode 100644
index 0000000..da02574
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_6.hpp
@@ -0,0 +1,76 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_7.hpp
new file mode 100644
index 0000000..d45a622
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_7.hpp
@@ -0,0 +1,93 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_8.hpp
new file mode 100644
index 0000000..d0198bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_8.hpp
@@ -0,0 +1,112 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_9.hpp
new file mode 100644
index 0000000..b3e0b19
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/polynomial_horner3_9.hpp
@@ -0,0 +1,133 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Unrolled polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+#define BOOST_MATH_TOOLS_POLY_EVAL_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>(a[1] * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[4] * x2 + a[2]);
+   t[1] = static_cast<V>(a[3] * x2 + a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[5] * x2 + a[3];
+   t[1] = a[4] * x2 + a[2];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[6] * x2 + a[4]);
+   t[1] = static_cast<V>(a[5] * x2 + a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = a[7] * x2 + a[5];
+   t[1] = a[6] * x2 + a[4];
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[3]);
+   t[1] += static_cast<V>(a[2]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[1]);
+   t[1] += static_cast<V>(a[0]);
+   t[0] *= x;
+   return t[0] + t[1];
+}
+
+template <class T, class V>
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+{
+   V x2 = x * x;
+   V t[2];
+   t[0] = static_cast<V>(a[8] * x2 + a[6]);
+   t[1] = static_cast<V>(a[7] * x2 + a[5]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[4]);
+   t[1] += static_cast<V>(a[3]);
+   t[0] *= x2;
+   t[1] *= x2;
+   t[0] += static_cast<V>(a[2]);
+   t[1] += static_cast<V>(a[1]);
+   t[0] *= x2;
+   t[0] += static_cast<V>(a[0]);
+   t[1] *= x;
+   return t[0] + t[1];
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_10.hpp
new file mode 100644
index 0000000..919ba6d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_10.hpp
@@ -0,0 +1,138 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_10_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_11.hpp
new file mode 100644
index 0000000..e17bfbc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_11.hpp
@@ -0,0 +1,150 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_11_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_12.hpp
new file mode 100644
index 0000000..67b430a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_12.hpp
@@ -0,0 +1,162 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_12_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_13.hpp
new file mode 100644
index 0000000..33ae675
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_13.hpp
@@ -0,0 +1,174 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_13_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_14.hpp
new file mode 100644
index 0000000..0c5f188
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_14.hpp
@@ -0,0 +1,186 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_14_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_15.hpp
new file mode 100644
index 0000000..8481907
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_15.hpp
@@ -0,0 +1,198 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_15_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_16.hpp
new file mode 100644
index 0000000..e0661f8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_16.hpp
@@ -0,0 +1,210 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_16_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) / (((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_17.hpp
new file mode 100644
index 0000000..f123da4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_17.hpp
@@ -0,0 +1,222 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_17_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) / (((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) / ((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_18.hpp
new file mode 100644
index 0000000..718ace8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_18.hpp
@@ -0,0 +1,234 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_18_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) / (((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) / ((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) / (((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]) * z + b[17]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_19.hpp
new file mode 100644
index 0000000..c849ba8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_19.hpp
@@ -0,0 +1,246 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_19_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) / (((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) / ((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) / (((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]) * z + b[17]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((((b[18] * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x [...]
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) * z + a[18]) / ((((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + [...]
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_2.hpp
new file mode 100644
index 0000000..87e41ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_2.hpp
@@ -0,0 +1,42 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_2_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_20.hpp
new file mode 100644
index 0000000..e05eaaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_20.hpp
@@ -0,0 +1,258 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_20_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) / (((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) / ((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) / (((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) / ((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) / (((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) / ((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) / (((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) / ((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) / (((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + b[16]) * z + b[17]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((((b[18] * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x [...]
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) * z + a[18]) / ((((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z + b[15]) * z + [...]
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((((((((((((((a[19] * x + a[18]) * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((((b[19] * x + b[18]) * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) [...]
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((((((((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) * z + a[9]) * z + a[10]) * z + a[11]) * z + a[12]) * z + a[13]) * z + a[14]) * z + a[15]) * z + a[16]) * z + a[17]) * z + a[18]) * z + a[19]) / (((((((((((((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]) * z + b[9]) * z + b[10]) * z + b[11]) * z + b[12]) * z + b[13]) * z + b[14]) * z [...]
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_3.hpp
new file mode 100644
index 0000000..ac1b785
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_3.hpp
@@ -0,0 +1,54 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_3_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_4.hpp
new file mode 100644
index 0000000..eeced60
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_4.hpp
@@ -0,0 +1,66 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_4_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_5.hpp
new file mode 100644
index 0000000..0479f66
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_5.hpp
@@ -0,0 +1,78 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_5_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_6.hpp
new file mode 100644
index 0000000..db25996
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_6.hpp
@@ -0,0 +1,90 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_6_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_7.hpp
new file mode 100644
index 0000000..b431fe9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_7.hpp
@@ -0,0 +1,102 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_7_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_8.hpp
new file mode 100644
index 0000000..5a04a7a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_8.hpp
@@ -0,0 +1,114 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_8_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_9.hpp
new file mode 100644
index 0000000..4b5465f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner1_9.hpp
@@ -0,0 +1,126 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using Horners rule
+#ifndef BOOST_MATH_TOOLS_POLY_RAT_9_HPP
+#define BOOST_MATH_TOOLS_POLY_RAT_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   if(x <= 1)
+     return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((a[0] * z + a[1]) / (b[0] * z + b[1]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((a[0] * z + a[1]) * z + a[2]) / ((b[0] * z + b[1]) * z + b[2]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) / (((b[0] * z + b[1]) * z + b[2]) * z + b[3]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) / ((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) / (((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) / ((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+     return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) / (((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+     return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
+   else
+   {
+      V z = 1 / x;
+      return static_cast<V>(((((((((a[0] * z + a[1]) * z + a[2]) * z + a[3]) * z + a[4]) * z + a[5]) * z + a[6]) * z + a[7]) * z + a[8]) / ((((((((b[0] * z + b[1]) * z + b[2]) * z + b[3]) * z + b[4]) * z + b[5]) * z + b[6]) * z + b[7]) * z + b[8]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_10.hpp
new file mode 100644
index 0000000..e26d2d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_10.hpp
@@ -0,0 +1,144 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_10_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_11.hpp
new file mode 100644
index 0000000..c05e697
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_11.hpp
@@ -0,0 +1,160 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_12.hpp
new file mode 100644
index 0000000..4ee3734
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_12.hpp
@@ -0,0 +1,176 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_12_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_13.hpp
new file mode 100644
index 0000000..37977a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_13.hpp
@@ -0,0 +1,192 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_13_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_14.hpp
new file mode 100644
index 0000000..78edfbb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_14.hpp
@@ -0,0 +1,208 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_14_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_15.hpp
new file mode 100644
index 0000000..3cf4ef5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_15.hpp
@@ -0,0 +1,224 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_15_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_16.hpp
new file mode 100644
index 0000000..3936a1b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_16.hpp
@@ -0,0 +1,240 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_16_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_17.hpp
new file mode 100644
index 0000000..4d253b9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_17.hpp
@@ -0,0 +1,256 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_17_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16] + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16] + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_18.hpp
new file mode 100644
index 0000000..6c213ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_18.hpp
@@ -0,0 +1,272 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_18_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16] + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16] + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((((b[17] * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2  [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) / (((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b [...]
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_19.hpp
new file mode 100644
index 0000000..88e0b9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_19.hpp
@@ -0,0 +1,288 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_19_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16] + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16] + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((((b[17] * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2  [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) / (((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b [...]
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((((b[18] * x2 + b[16]) * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((((b[17] * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z2 + a[18] + ((((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) * z) / (((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z2 + b[18] + ((((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9 [...]
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_2.hpp
new file mode 100644
index 0000000..35b5abb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_2.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_2_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_20.hpp
new file mode 100644
index 0000000..dc73fdd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_20.hpp
@@ -0,0 +1,304 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_20_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((b[9] * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10] + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z) / (((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10] + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((b[10] * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z + ((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z + ((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((b[11] * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12] + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z) / ((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12] + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((b[12] * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z + (((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z + (((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((b[13] * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14] + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z) / (((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14] + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((b[14] * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z + ((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z + ((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((((((b[15] * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16] + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z) / ((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16] + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b[13]) * z2 + b[15]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / (((((((((b[17] * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + (((((((b[16] * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2  [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z + (((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) / (((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z + (((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9]) * z2 + b[11]) * z2 + b [...]
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / (((((((((b[18] * x2 + b[16]) * x2 + b[14]) * x2 + b[12]) * x2 + b[10]) * x2 + b[8]) * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((((((((b[17] * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z2 + a[18] + ((((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) * z) / (((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z2 + b[18] + ((((((((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z2 + b[9 [...]
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((((((((a[19] * x2 + a[17]) * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((((((((b[19] * x2 + b[17]) * x2 + b[15]) * x2 + b[13]) * x2 + b[11]) * x2 + b[9]) * x2 + b[7]) * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((((((((b[18] * x2 + b[16]) * x2 + b[14]) [...]
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((((((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8]) * z2 + a[10]) * z2 + a[12]) * z2 + a[14]) * z2 + a[16]) * z2 + a[18]) * z + ((((((((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z2 + a[9]) * z2 + a[11]) * z2 + a[13]) * z2 + a[15]) * z2 + a[17]) * z2 + a[19]) / ((((((((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8]) * z2 + b[10]) * z2 + b[12]) * z2 + b[14]) * z2 + b[16]) * z2 + b[18]) * z + ((((((((b[1] * z2 + b[3]) * z2 + b[5]) *  [...]
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_3.hpp
new file mode 100644
index 0000000..8838ac1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_3.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_3_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_4.hpp
new file mode 100644
index 0000000..5fe5ada
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_4.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_4_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_5.hpp
new file mode 100644
index 0000000..48b8498
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_5.hpp
@@ -0,0 +1,64 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_5_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_6.hpp
new file mode 100644
index 0000000..83631ea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_6.hpp
@@ -0,0 +1,80 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_6_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_7.hpp
new file mode 100644
index 0000000..3ed86ea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_7.hpp
@@ -0,0 +1,96 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_7_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_8.hpp
new file mode 100644
index 0000000..f8b36ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_8.hpp
@@ -0,0 +1,112 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_8_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_9.hpp
new file mode 100644
index 0000000..88cc4e5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner2_9.hpp
@@ -0,0 +1,128 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_9_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x) / ((b[4] * x2 + b[2]) * x2 + b[0] + (b[3] * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((a[0] * z2 + a[2]) * z2 + a[4] + (a[1] * z2 + a[3]) * z) / ((b[0] * z2 + b[2]) * z2 + b[4] + (b[1] * z2 + b[3]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]) / (((b[5] * x2 + b[3]) * x2 + b[1]) * x + (b[4] * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z + (a[1] * z2 + a[3]) * z2 + a[5]) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z + (b[1] * z2 + b[3]) * z2 + b[5]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>((((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x) / (((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + ((b[5] * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6] + ((a[1] * z2 + a[3]) * z2 + a[5]) * z) / (((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6] + ((b[1] * z2 + b[3]) * z2 + b[5]) * z));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]) / ((((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x + ((b[6] * x2 + b[4]) * x2 + b[2]) * x2 + b[0]));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z + ((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z + ((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]));
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      return static_cast<V>(((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x) / ((((b[8] * x2 + b[6]) * x2 + b[4]) * x2 + b[2]) * x2 + b[0] + (((b[7] * x2 + b[5]) * x2 + b[3]) * x2 + b[1]) * x));
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      return static_cast<V>(((((a[0] * z2 + a[2]) * z2 + a[4]) * z2 + a[6]) * z2 + a[8] + (((a[1] * z2 + a[3]) * z2 + a[5]) * z2 + a[7]) * z) / ((((b[0] * z2 + b[2]) * z2 + b[4]) * z2 + b[6]) * z2 + b[8] + (((b[1] * z2 + b[3]) * z2 + b[5]) * z2 + b[7]) * z));
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_10.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_10.hpp
new file mode 100644
index 0000000..019ffda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_10.hpp
@@ -0,0 +1,396 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_10_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_10_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_11.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_11.hpp
new file mode 100644
index 0000000..13ce313
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_11.hpp
@@ -0,0 +1,482 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_12.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_12.hpp
new file mode 100644
index 0000000..634140b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_12.hpp
@@ -0,0 +1,576 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_12_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_12_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_13.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_13.hpp
new file mode 100644
index 0000000..0b4974a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_13.hpp
@@ -0,0 +1,678 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_13_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_13_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_14.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_14.hpp
new file mode 100644
index 0000000..63f4e95
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_14.hpp
@@ -0,0 +1,788 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_14_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_14_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_15.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_15.hpp
new file mode 100644
index 0000000..c13500f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_15.hpp
@@ -0,0 +1,906 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_15_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_15_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_16.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_16.hpp
new file mode 100644
index 0000000..b1c8977
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_16.hpp
@@ -0,0 +1,1032 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_16_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_16_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[15] * x2 + a[13];
+      t[1] = a[14] * x2 + a[12];
+      t[2] = b[15] * x2 + b[13];
+      t[3] = b[14] * x2 + b[12];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_17.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_17.hpp
new file mode 100644
index 0000000..9c3498e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_17.hpp
@@ -0,0 +1,1166 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_17_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_17_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[15] * x2 + a[13];
+      t[1] = a[14] * x2 + a[12];
+      t[2] = b[15] * x2 + b[13];
+      t[3] = b[14] * x2 + b[12];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[16] * x2 + a[14];
+      t[1] = a[15] * x2 + a[13];
+      t[2] = b[16] * x2 + b[14];
+      t[3] = b[15] * x2 + b[13];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[2] += static_cast<V>(b[16]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_18.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_18.hpp
new file mode 100644
index 0000000..5401e9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_18.hpp
@@ -0,0 +1,1308 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_18_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_18_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[15] * x2 + a[13];
+      t[1] = a[14] * x2 + a[12];
+      t[2] = b[15] * x2 + b[13];
+      t[3] = b[14] * x2 + b[12];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[16] * x2 + a[14];
+      t[1] = a[15] * x2 + a[13];
+      t[2] = b[16] * x2 + b[14];
+      t[3] = b[15] * x2 + b[13];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[2] += static_cast<V>(b[16]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[17] * x2 + a[15];
+      t[1] = a[16] * x2 + a[14];
+      t[2] = b[17] * x2 + b[15];
+      t[3] = b[16] * x2 + b[14];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[13]);
+      t[1] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[13]);
+      t[3] += static_cast<V>(b[12]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_19.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_19.hpp
new file mode 100644
index 0000000..c111b68
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_19.hpp
@@ -0,0 +1,1458 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_19_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_19_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[15] * x2 + a[13];
+      t[1] = a[14] * x2 + a[12];
+      t[2] = b[15] * x2 + b[13];
+      t[3] = b[14] * x2 + b[12];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[16] * x2 + a[14];
+      t[1] = a[15] * x2 + a[13];
+      t[2] = b[16] * x2 + b[14];
+      t[3] = b[15] * x2 + b[13];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[2] += static_cast<V>(b[16]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[17] * x2 + a[15];
+      t[1] = a[16] * x2 + a[14];
+      t[2] = b[17] * x2 + b[15];
+      t[3] = b[16] * x2 + b[14];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[13]);
+      t[1] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[13]);
+      t[3] += static_cast<V>(b[12]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[18] * x2 + a[16];
+      t[1] = a[17] * x2 + a[15];
+      t[2] = b[18] * x2 + b[16];
+      t[3] = b[17] * x2 + b[15];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[18]);
+      t[2] += static_cast<V>(b[18]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_2.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_2.hpp
new file mode 100644
index 0000000..35b5abb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_2.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_2_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_2_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_20.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_20.hpp
new file mode 100644
index 0000000..7bee9b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_20.hpp
@@ -0,0 +1,1616 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_20_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_20_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[9] * x2 + a[7];
+      t[1] = a[8] * x2 + a[6];
+      t[2] = b[9] * x2 + b[7];
+      t[3] = b[8] * x2 + b[6];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[10] * x2 + a[8];
+      t[1] = a[9] * x2 + a[7];
+      t[2] = b[10] * x2 + b[8];
+      t[3] = b[9] * x2 + b[7];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[10]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[11] * x2 + a[9];
+      t[1] = a[10] * x2 + a[8];
+      t[2] = b[11] * x2 + b[9];
+      t[3] = b[10] * x2 + b[8];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[12] * x2 + a[10];
+      t[1] = a[11] * x2 + a[9];
+      t[2] = b[12] * x2 + b[10];
+      t[3] = b[11] * x2 + b[9];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[12]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[13] * x2 + a[11];
+      t[1] = a[12] * x2 + a[10];
+      t[2] = b[13] * x2 + b[11];
+      t[3] = b[12] * x2 + b[10];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[14] * x2 + a[12];
+      t[1] = a[13] * x2 + a[11];
+      t[2] = b[14] * x2 + b[12];
+      t[3] = b[13] * x2 + b[11];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[14]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[15] * x2 + a[13];
+      t[1] = a[14] * x2 + a[12];
+      t[2] = b[15] * x2 + b[13];
+      t[3] = b[14] * x2 + b[12];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[16] * x2 + a[14];
+      t[1] = a[15] * x2 + a[13];
+      t[2] = b[16] * x2 + b[14];
+      t[3] = b[15] * x2 + b[13];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[2] += static_cast<V>(b[16]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[17] * x2 + a[15];
+      t[1] = a[16] * x2 + a[14];
+      t[2] = b[17] * x2 + b[15];
+      t[3] = b[16] * x2 + b[14];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[13]);
+      t[1] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[13]);
+      t[3] += static_cast<V>(b[12]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[18] * x2 + a[16];
+      t[1] = a[17] * x2 + a[15];
+      t[2] = b[18] * x2 + b[16];
+      t[3] = b[17] * x2 + b[15];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[18]);
+      t[2] += static_cast<V>(b[18]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[19] * x2 + a[17];
+      t[1] = a[18] * x2 + a[16];
+      t[2] = b[19] * x2 + b[17];
+      t[3] = b[18] * x2 + b[16];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[15]);
+      t[1] += static_cast<V>(a[14]);
+      t[2] += static_cast<V>(b[15]);
+      t[3] += static_cast<V>(b[14]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[13]);
+      t[1] += static_cast<V>(a[12]);
+      t[2] += static_cast<V>(b[13]);
+      t[3] += static_cast<V>(b[12]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[11]);
+      t[1] += static_cast<V>(a[10]);
+      t[2] += static_cast<V>(b[11]);
+      t[3] += static_cast<V>(b[10]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[9]);
+      t[1] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[9]);
+      t[3] += static_cast<V>(b[8]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[7]);
+      t[1] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[7]);
+      t[3] += static_cast<V>(b[6]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[5]);
+      t[1] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[5]);
+      t[3] += static_cast<V>(b[4]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[1] += static_cast<V>(a[9]);
+      t[2] += static_cast<V>(b[8]);
+      t[3] += static_cast<V>(b[9]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[10]);
+      t[1] += static_cast<V>(a[11]);
+      t[2] += static_cast<V>(b[10]);
+      t[3] += static_cast<V>(b[11]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[12]);
+      t[1] += static_cast<V>(a[13]);
+      t[2] += static_cast<V>(b[12]);
+      t[3] += static_cast<V>(b[13]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[14]);
+      t[1] += static_cast<V>(a[15]);
+      t[2] += static_cast<V>(b[14]);
+      t[3] += static_cast<V>(b[15]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[16]);
+      t[1] += static_cast<V>(a[17]);
+      t[2] += static_cast<V>(b[16]);
+      t[3] += static_cast<V>(b[17]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[18]);
+      t[1] += static_cast<V>(a[19]);
+      t[2] += static_cast<V>(b[18]);
+      t[3] += static_cast<V>(b[19]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_3.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_3.hpp
new file mode 100644
index 0000000..8838ac1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_3.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_3_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_3_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_4.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_4.hpp
new file mode 100644
index 0000000..5fe5ada
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_4.hpp
@@ -0,0 +1,48 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_4_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_4_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_5.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_5.hpp
new file mode 100644
index 0000000..23a6068
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_5.hpp
@@ -0,0 +1,86 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_5_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_5_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_6.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_6.hpp
new file mode 100644
index 0000000..186167d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_6.hpp
@@ -0,0 +1,132 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_6_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_6_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_7.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_7.hpp
new file mode 100644
index 0000000..e08dce6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_7.hpp
@@ -0,0 +1,186 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_7_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_7_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_8.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_8.hpp
new file mode 100644
index 0000000..3ceb717
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_8.hpp
@@ -0,0 +1,248 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_8_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_8_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_9.hpp b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_9.hpp
new file mode 100644
index 0000000..94dab4c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/detail/rational_horner3_9.hpp
@@ -0,0 +1,318 @@
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file is machine generated, do not edit by hand
+
+// Polynomial evaluation using second order Horners rule
+#ifndef BOOST_MATH_TOOLS_RAT_EVAL_9_HPP
+#define BOOST_MATH_TOOLS_RAT_EVAL_9_HPP
+
+namespace boost{ namespace math{ namespace tools{ namespace detail{
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+{
+   return static_cast<V>(0);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+{
+   return static_cast<V>(a[0]) / static_cast<V>(b[0]);
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+{
+   return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+{
+   return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+{
+   return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[4] * x2 + a[2];
+      t[1] = a[3] * x2 + a[1];
+      t[2] = b[4] * x2 + b[2];
+      t[3] = b[3] * x2 + b[1];
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[2] += static_cast<V>(b[4]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[5] * x2 + a[3];
+      t[1] = a[4] * x2 + a[2];
+      t[2] = b[5] * x2 + b[3];
+      t[3] = b[4] * x2 + b[2];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[6] * x2 + a[4];
+      t[1] = a[5] * x2 + a[3];
+      t[2] = b[6] * x2 + b[4];
+      t[3] = b[5] * x2 + b[3];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[2] += static_cast<V>(b[6]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[7] * x2 + a[5];
+      t[1] = a[6] * x2 + a[4];
+      t[2] = b[7] * x2 + b[5];
+      t[3] = b[6] * x2 + b[4];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[3]);
+      t[1] += static_cast<V>(a[2]);
+      t[2] += static_cast<V>(b[3]);
+      t[3] += static_cast<V>(b[2]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[1]);
+      t[1] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[1]);
+      t[3] += static_cast<V>(b[0]);
+      t[0] *= x;
+      t[2] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z;
+      t[2] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+template <class T, class U, class V>
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+{
+   if(x <= 1)
+   {
+      V x2 = x * x;
+      V t[4];
+      t[0] = a[8] * x2 + a[6];
+      t[1] = a[7] * x2 + a[5];
+      t[2] = b[8] * x2 + b[6];
+      t[3] = b[7] * x2 + b[5];
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[3]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[3]);
+      t[0] *= x2;
+      t[1] *= x2;
+      t[2] *= x2;
+      t[3] *= x2;
+      t[0] += static_cast<V>(a[2]);
+      t[1] += static_cast<V>(a[1]);
+      t[2] += static_cast<V>(b[2]);
+      t[3] += static_cast<V>(b[1]);
+      t[0] *= x2;
+      t[2] *= x2;
+      t[0] += static_cast<V>(a[0]);
+      t[2] += static_cast<V>(b[0]);
+      t[1] *= x;
+      t[3] *= x;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+   else
+   {
+      V z = 1 / x;
+      V z2 = 1 / (x * x);
+      V t[4];
+      t[0] = a[0] * z2 + a[2];
+      t[1] = a[1] * z2 + a[3];
+      t[2] = b[0] * z2 + b[2];
+      t[3] = b[1] * z2 + b[3];
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[4]);
+      t[1] += static_cast<V>(a[5]);
+      t[2] += static_cast<V>(b[4]);
+      t[3] += static_cast<V>(b[5]);
+      t[0] *= z2;
+      t[1] *= z2;
+      t[2] *= z2;
+      t[3] *= z2;
+      t[0] += static_cast<V>(a[6]);
+      t[1] += static_cast<V>(a[7]);
+      t[2] += static_cast<V>(b[6]);
+      t[3] += static_cast<V>(b[7]);
+      t[0] *= z2;
+      t[2] *= z2;
+      t[0] += static_cast<V>(a[8]);
+      t[2] += static_cast<V>(b[8]);
+      t[1] *= z;
+      t[3] *= z;
+      return (t[0] + t[1]) / (t[2] + t[3]);
+   }
+}
+
+
+}}}} // namespaces
+
+#endif // include guard
+
diff --git a/gatb-core/thirdparty/boost/math/tools/fraction.hpp b/gatb-core/thirdparty/boost/math/tools/fraction.hpp
new file mode 100644
index 0000000..b245ddd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/fraction.hpp
@@ -0,0 +1,252 @@
+//  (C) Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_FRACTION_INCLUDED
+#define BOOST_MATH_TOOLS_FRACTION_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/math/tools/precision.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+namespace detail
+{
+
+   template <class T>
+   struct is_pair : public boost::false_type{};
+
+   template <class T, class U>
+   struct is_pair<std::pair<T,U> > : public boost::true_type{};
+
+   template <class Gen>
+   struct fraction_traits_simple
+   {
+       typedef typename Gen::result_type result_type;
+       typedef typename Gen::result_type value_type;
+
+       static result_type a(const value_type&)
+       {
+          return 1;
+       }
+       static result_type b(const value_type& v)
+       {
+          return v;
+       }
+   };
+
+   template <class Gen>
+   struct fraction_traits_pair
+   {
+       typedef typename Gen::result_type value_type;
+       typedef typename value_type::first_type result_type;
+
+       static result_type a(const value_type& v)
+       {
+          return v.first;
+       }
+       static result_type b(const value_type& v)
+       {
+          return v.second;
+       }
+   };
+
+   template <class Gen>
+   struct fraction_traits
+       : public boost::mpl::if_c<
+         is_pair<typename Gen::result_type>::value,
+         fraction_traits_pair<Gen>,
+         fraction_traits_simple<Gen> >::type
+   {
+   };
+
+} // namespace detail
+
+//
+// continued_fraction_b
+// Evaluates:
+//
+// b0 +       a1
+//      ---------------
+//      b1 +     a2
+//           ----------
+//           b2 +   a3
+//                -----
+//                b3 + ...
+//
+// Note that the first a0 returned by generator Gen is disarded.
+//
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+   typedef typename traits::value_type value_type;
+
+   result_type tiny = tools::min_value<result_type>();
+
+   value_type v = g();
+
+   result_type f, C, D, delta;
+   f = traits::b(v);
+   if(f == 0)
+      f = tiny;
+   C = f;
+   D = 0;
+
+   boost::uintmax_t counter(max_terms);
+
+   do{
+      v = g();
+      D = traits::b(v) + traits::a(v) * D;
+      if(D == 0)
+         D = tiny;
+      C = traits::b(v) + traits::a(v) / C;
+      if(C == 0)
+         C = tiny;
+      D = 1/D;
+      delta = C*D;
+      f = f * delta;
+   }while((fabs(delta - 1) > factor) && --counter);
+
+   max_terms = max_terms - counter;
+
+   return f;
+}
+
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor)
+{
+   boost::uintmax_t max_terms = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_b(g, factor, max_terms);
+}
+
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+
+   result_type factor = ldexp(1.0f, 1 - bits); // 1 / pow(result_type(2), bits);
+   boost::uintmax_t max_terms = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_b(g, factor, max_terms);
+}
+
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+
+   result_type factor = ldexp(1.0f, 1 - bits); // 1 / pow(result_type(2), bits);
+   return continued_fraction_b(g, factor, max_terms);
+}
+
+//
+// continued_fraction_a
+// Evaluates:
+//
+//            a1
+//      ---------------
+//      b1 +     a2
+//           ----------
+//           b2 +   a3
+//                -----
+//                b3 + ...
+//
+// Note that the first a1 and b1 returned by generator Gen are both used.
+//
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+   typedef typename traits::value_type value_type;
+
+   result_type tiny = tools::min_value<result_type>();
+
+   value_type v = g();
+
+   result_type f, C, D, delta, a0;
+   f = traits::b(v);
+   a0 = traits::a(v);
+   if(f == 0)
+      f = tiny;
+   C = f;
+   D = 0;
+
+   boost::uintmax_t counter(max_terms);
+
+   do{
+      v = g();
+      D = traits::b(v) + traits::a(v) * D;
+      if(D == 0)
+         D = tiny;
+      C = traits::b(v) + traits::a(v) / C;
+      if(C == 0)
+         C = tiny;
+      D = 1/D;
+      delta = C*D;
+      f = f * delta;
+   }while((fabs(delta - 1) > factor) && --counter);
+
+   max_terms = max_terms - counter;
+
+   return a0/f;
+}
+
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor)
+{
+   boost::uintmax_t max_iter = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_a(g, factor, max_iter);
+}
+
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+
+   result_type factor = ldexp(1.0f, 1-bits); // 1 / pow(result_type(2), bits);
+   boost::uintmax_t max_iter = (std::numeric_limits<boost::uintmax_t>::max)();
+
+   return continued_fraction_a(g, factor, max_iter);
+}
+
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
+
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
+
+   result_type factor = ldexp(1.0f, 1-bits); // 1 / pow(result_type(2), bits);
+   return continued_fraction_a(g, factor, max_terms);
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_FRACTION_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/math/tools/minima.hpp b/gatb-core/thirdparty/boost/math/tools/minima.hpp
new file mode 100644
index 0000000..3dc5356
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/minima.hpp
@@ -0,0 +1,152 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_MATH_TOOLS_MINIMA_HPP
+#define BOOST_MATH_TOOLS_MINIMA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <utility>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+template <class F, class T>
+std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t& max_iter)
+{
+   BOOST_MATH_STD_USING
+   bits = (std::min)(policies::digits<T, policies::policy<> >() / 2, bits);
+   T tolerance = static_cast<T>(ldexp(1.0, 1-bits));
+   T x;  // minima so far
+   T w;  // second best point
+   T v;  // previous value of w
+   T u;  // most recent evaluation point
+   T delta;  // The distance moved in the last step
+   T delta2; // The distance moved in the step before last
+   T fu, fv, fw, fx;  // function evaluations at u, v, w, x
+   T mid; // midpoint of min and max
+   T fract1, fract2;  // minimal relative movement in x
+
+   static const T golden = 0.3819660f;  // golden ratio, don't need too much precision here!
+
+   x = w = v = max;
+   fw = fv = fx = f(x);
+   delta2 = delta = 0;
+
+   uintmax_t count = max_iter;
+
+   do{
+      // get midpoint
+      mid = (min + max) / 2;
+      // work out if we're done already:
+      fract1 = tolerance * fabs(x) + tolerance / 4;
+      fract2 = 2 * fract1;
+      if(fabs(x - mid) <= (fract2 - (max - min) / 2))
+         break;
+
+      if(fabs(delta2) > fract1)
+      {
+         // try and construct a parabolic fit:
+         T r = (x - w) * (fx - fv);
+         T q = (x - v) * (fx - fw);
+         T p = (x - v) * q - (x - w) * r;
+         q = 2 * (q - r);
+         if(q > 0)
+            p = -p;
+         q = fabs(q);
+         T td = delta2;
+         delta2 = delta;
+         // determine whether a parabolic step is acceptible or not:
+         if((fabs(p) >= fabs(q * td / 2)) || (p <= q * (min - x)) || (p >= q * (max - x)))
+         {
+            // nope, try golden section instead
+            delta2 = (x >= mid) ? min - x : max - x;
+            delta = golden * delta2;
+         }
+         else
+         {
+            // whew, parabolic fit:
+            delta = p / q;
+            u = x + delta;
+            if(((u - min) < fract2) || ((max- u) < fract2))
+               delta = (mid - x) < 0 ? (T)-fabs(fract1) : (T)fabs(fract1);
+         }
+      }
+      else
+      {
+         // golden section:
+         delta2 = (x >= mid) ? min - x : max - x;
+         delta = golden * delta2;
+      }
+      // update current position:
+      u = (fabs(delta) >= fract1) ? T(x + delta) : (delta > 0 ? T(x + fabs(fract1)) : T(x - fabs(fract1)));
+      fu = f(u);
+      if(fu <= fx)
+      {
+         // good new point is an improvement!
+         // update brackets:
+         if(u >= x)
+            min = x;
+         else
+            max = x;
+         // update control points:
+         v = w;
+         w = x;
+         x = u;
+         fv = fw;
+         fw = fx;
+         fx = fu;
+      }
+      else
+      {
+         // Oh dear, point u is worse than what we have already,
+         // even so it *must* be better than one of our endpoints:
+         if(u < x)
+            min = u;
+         else
+            max = u;
+         if((fu <= fw) || (w == x))
+         {
+            // however it is at least second best:
+            v = w;
+            w = u;
+            fv = fw;
+            fw = fu;
+         }
+         else if((fu <= fv) || (v == x) || (v == w))
+         {
+            // third best:
+            v = u;
+            fv = fu;
+         }
+      }
+
+   }while(--count);
+
+   max_iter -= count;
+
+   return std::make_pair(x, fx);
+}
+
+template <class F, class T>
+inline std::pair<T, T> brent_find_minima(F f, T min, T max, int digits)
+{
+   boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+   return brent_find_minima(f, min, max, digits, m);
+}
+
+}}} // namespaces
+
+#endif
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/polynomial.hpp b/gatb-core/thirdparty/boost/math/tools/polynomial.hpp
new file mode 100644
index 0000000..9858880
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/polynomial.hpp
@@ -0,0 +1,323 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_POLYNOMIAL_HPP
+#define BOOST_MATH_TOOLS_POLYNOMIAL_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/assert.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/special_functions/binomial.hpp>
+
+#include <vector>
+#include <ostream>
+#include <algorithm>
+
+namespace boost{ namespace math{ namespace tools{
+
+template <class T>
+T chebyshev_coefficient(unsigned n, unsigned m)
+{
+   BOOST_MATH_STD_USING
+   if(m > n)
+      return 0;
+   if((n & 1) != (m & 1))
+      return 0;
+   if(n == 0)
+      return 1;
+   T result = T(n) / 2;
+   unsigned r = n - m;
+   r /= 2;
+
+   BOOST_ASSERT(n - 2 * r == m);
+
+   if(r & 1)
+      result = -result;
+   result /= n - r;
+   result *= boost::math::binomial_coefficient<T>(n - r, r);
+   result *= ldexp(1.0f, m);
+   return result;
+}
+
+template <class Seq>
+Seq polynomial_to_chebyshev(const Seq& s)
+{
+   // Converts a Polynomial into Chebyshev form:
+   typedef typename Seq::value_type value_type;
+   typedef typename Seq::difference_type difference_type;
+   Seq result(s);
+   difference_type order = s.size() - 1;
+   difference_type even_order = order & 1 ? order - 1 : order;
+   difference_type odd_order = order & 1 ? order : order - 1;
+
+   for(difference_type i = even_order; i >= 0; i -= 2)
+   {
+      value_type val = s[i];
+      for(difference_type k = even_order; k > i; k -= 2)
+      {
+         val -= result[k] * chebyshev_coefficient<value_type>(static_cast<unsigned>(k), static_cast<unsigned>(i));
+      }
+      val /= chebyshev_coefficient<value_type>(static_cast<unsigned>(i), static_cast<unsigned>(i));
+      result[i] = val;
+   }
+   result[0] *= 2;
+
+   for(difference_type i = odd_order; i >= 0; i -= 2)
+   {
+      value_type val = s[i];
+      for(difference_type k = odd_order; k > i; k -= 2)
+      {
+         val -= result[k] * chebyshev_coefficient<value_type>(static_cast<unsigned>(k), static_cast<unsigned>(i));
+      }
+      val /= chebyshev_coefficient<value_type>(static_cast<unsigned>(i), static_cast<unsigned>(i));
+      result[i] = val;
+   }
+   return result;
+}
+
+template <class Seq, class T>
+T evaluate_chebyshev(const Seq& a, const T& x)
+{
+   // Clenshaw's formula:
+   typedef typename Seq::difference_type difference_type;
+   T yk2 = 0;
+   T yk1 = 0;
+   T yk = 0;
+   for(difference_type i = a.size() - 1; i >= 1; --i)
+   {
+      yk2 = yk1;
+      yk1 = yk;
+      yk = 2 * x * yk1 - yk2 + a[i];
+   }
+   return a[0] / 2 + yk * x - yk1;
+}
+
+template <class T>
+class polynomial
+{
+public:
+   // typedefs:
+   typedef typename std::vector<T>::value_type value_type;
+   typedef typename std::vector<T>::size_type size_type;
+
+   // construct:
+   polynomial(){}
+   template <class U>
+   polynomial(const U* data, unsigned order)
+      : m_data(data, data + order + 1)
+   {
+   }
+   template <class U>
+   polynomial(const U& point)
+   {
+      m_data.push_back(point);
+   }
+
+   // copy:
+   polynomial(const polynomial& p)
+      : m_data(p.m_data) { }
+
+   template <class U>
+   polynomial(const polynomial<U>& p)
+   {
+      for(unsigned i = 0; i < p.size(); ++i)
+      {
+         m_data.push_back(boost::math::tools::real_cast<T>(p[i]));
+      }
+   }
+
+   // access:
+   size_type size()const { return m_data.size(); }
+   size_type degree()const { return m_data.size() - 1; }
+   value_type& operator[](size_type i)
+   {
+      return m_data[i];
+   }
+   const value_type& operator[](size_type i)const
+   {
+      return m_data[i];
+   }
+   T evaluate(T z)const
+   {
+      return boost::math::tools::evaluate_polynomial(&m_data[0], z, m_data.size());;
+   }
+   std::vector<T> chebyshev()const
+   {
+      return polynomial_to_chebyshev(m_data);
+   }
+
+   // operators:
+   template <class U>
+   polynomial& operator +=(const U& value)
+   {
+      if(m_data.size() == 0)
+         m_data.push_back(value);
+      else
+      {
+         m_data[0] += value;
+      }
+      return *this;
+   }
+   template <class U>
+   polynomial& operator -=(const U& value)
+   {
+      if(m_data.size() == 0)
+         m_data.push_back(-value);
+      else
+      {
+         m_data[0] -= value;
+      }
+      return *this;
+   }
+   template <class U>
+   polynomial& operator *=(const U& value)
+   {
+      for(size_type i = 0; i < m_data.size(); ++i)
+         m_data[i] *= value;
+      return *this;
+   }
+   template <class U>
+   polynomial& operator +=(const polynomial<U>& value)
+   {
+      size_type s1 = (std::min)(m_data.size(), value.size());
+      for(size_type i = 0; i < s1; ++i)
+         m_data[i] += value[i];
+      for(size_type i = s1; i < value.size(); ++i)
+         m_data.push_back(value[i]);
+      return *this;
+   }
+   template <class U>
+   polynomial& operator -=(const polynomial<U>& value)
+   {
+      size_type s1 = (std::min)(m_data.size(), value.size());
+      for(size_type i = 0; i < s1; ++i)
+         m_data[i] -= value[i];
+      for(size_type i = s1; i < value.size(); ++i)
+         m_data.push_back(-value[i]);
+      return *this;
+   }
+   template <class U>
+   polynomial& operator *=(const polynomial<U>& value)
+   {
+      // TODO: FIXME: use O(N log(N)) algorithm!!!
+      BOOST_ASSERT(value.size());
+      polynomial base(*this);
+      *this *= value[0];
+      for(size_type i = 1; i < value.size(); ++i)
+      {
+         polynomial t(base);
+         t *= value[i];
+         size_type s = size() - i;
+         for(size_type j = 0; j < s; ++j)
+         {
+            m_data[i+j] += t[j];
+         }
+         for(size_type j = s; j < t.size(); ++j)
+            m_data.push_back(t[j]);
+      }
+      return *this;
+   }
+
+private:
+   std::vector<T> m_data;
+};
+
+template <class T>
+inline polynomial<T> operator + (const polynomial<T>& a, const polynomial<T>& b)
+{
+   polynomial<T> result(a);
+   result += b;
+   return result;
+}
+
+template <class T>
+inline polynomial<T> operator - (const polynomial<T>& a, const polynomial<T>& b)
+{
+   polynomial<T> result(a);
+   result -= b;
+   return result;
+}
+
+template <class T>
+inline polynomial<T> operator * (const polynomial<T>& a, const polynomial<T>& b)
+{
+   polynomial<T> result(a);
+   result *= b;
+   return result;
+}
+
+template <class T, class U>
+inline polynomial<T> operator + (const polynomial<T>& a, const U& b)
+{
+   polynomial<T> result(a);
+   result += b;
+   return result;
+}
+
+template <class T, class U>
+inline polynomial<T> operator - (const polynomial<T>& a, const U& b)
+{
+   polynomial<T> result(a);
+   result -= b;
+   return result;
+}
+
+template <class T, class U>
+inline polynomial<T> operator * (const polynomial<T>& a, const U& b)
+{
+   polynomial<T> result(a);
+   result *= b;
+   return result;
+}
+
+template <class U, class T>
+inline polynomial<T> operator + (const U& a, const polynomial<T>& b)
+{
+   polynomial<T> result(b);
+   result += a;
+   return result;
+}
+
+template <class U, class T>
+inline polynomial<T> operator - (const U& a, const polynomial<T>& b)
+{
+   polynomial<T> result(a);
+   result -= b;
+   return result;
+}
+
+template <class U, class T>
+inline polynomial<T> operator * (const U& a, const polynomial<T>& b)
+{
+   polynomial<T> result(b);
+   result *= a;
+   return result;
+}
+
+template <class charT, class traits, class T>
+inline std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& os, const polynomial<T>& poly)
+{
+   os << "{ ";
+   for(unsigned i = 0; i < poly.size(); ++i)
+   {
+      if(i) os << ", ";
+      os << poly[i];
+   }
+   os << " }";
+   return os;
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_POLYNOMIAL_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/precision.hpp b/gatb-core/thirdparty/boost/math/tools/precision.hpp
new file mode 100644
index 0000000..ed146c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/precision.hpp
@@ -0,0 +1,392 @@
+//  Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_PRECISION_INCLUDED
+#define BOOST_MATH_TOOLS_PRECISION_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/math/policies/policy.hpp>
+
+// These two are for LDBL_MAN_DIG:
+#include <limits.h>
+#include <math.h>
+
+namespace boost{ namespace math
+{
+namespace tools
+{
+// If T is not specialized, the functions digits, max_value and min_value,
+// all get synthesised automatically from std::numeric_limits.
+// However, if numeric_limits is not specialised for type RealType,
+// for example with NTL::RR type, then you will get a compiler error
+// when code tries to use these functions, unless you explicitly specialise them.
+
+// For example if the precision of RealType varies at runtime,
+// then numeric_limits support may not be appropriate,
+// see boost/math/tools/ntl.hpp  for examples like
+// template <> NTL::RR max_value<NTL::RR> ...
+// See  Conceptual Requirements for Real Number Types.
+
+template <class T>
+inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::radix == 2 || ::std::numeric_limits<T>::radix == 10);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+   BOOST_ASSERT(::std::numeric_limits<T>::radix == 2 || ::std::numeric_limits<T>::radix == 10);
+#endif
+   return std::numeric_limits<T>::radix == 2 
+      ? std::numeric_limits<T>::digits
+      : ((std::numeric_limits<T>::digits + 1) * 1000L) / 301L;
+}
+
+template <class T>
+inline T max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   return (std::numeric_limits<T>::max)();
+} // Also used as a finite 'infinite' value for - and +infinity, for example:
+// -max_value<double> = -1.79769e+308, max_value<double> = 1.79769e+308.
+
+template <class T>
+inline T min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   return (std::numeric_limits<T>::min)();
+}
+
+namespace detail{
+//
+// Logarithmic limits come next, note that although
+// we can compute these from the log of the max value
+// that is not in general thread safe (if we cache the value)
+// so it's better to specialise these:
+//
+// For type float first:
+//
+template <class T>
+inline T log_max_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return 88.0f;
+}
+
+template <class T>
+inline T log_min_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return -87.0f;
+}
+//
+// Now double:
+//
+template <class T>
+inline T log_max_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return 709.0;
+}
+
+template <class T>
+inline T log_min_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return -708.0;
+}
+//
+// 80 and 128-bit long doubles:
+//
+template <class T>
+inline T log_max_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return 11356.0L;
+}
+
+template <class T>
+inline T log_min_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return -11355.0L;
+}
+
+template <class T>
+inline T log_max_value(const mpl::int_<0>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   BOOST_MATH_STD_USING
+#ifdef __SUNPRO_CC
+   static const T m = (std::numeric_limits<T>::max)();
+   static const T val = log(m);
+#else
+   static const T val = log((std::numeric_limits<T>::max)());
+#endif
+   return val;
+}
+
+template <class T>
+inline T log_min_value(const mpl::int_<0>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   BOOST_MATH_STD_USING
+#ifdef __SUNPRO_CC
+   static const T m = (std::numeric_limits<T>::min)();
+   static const T val = log(m);
+#else
+   static const T val = log((std::numeric_limits<T>::min)());
+#endif
+   return val;
+}
+
+template <class T>
+inline T epsilon(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   return std::numeric_limits<T>::epsilon();
+}
+
+#if defined(__GNUC__) && ((LDBL_MANT_DIG == 106) || (__LDBL_MANT_DIG__ == 106))
+template <>
+inline long double epsilon<long double>(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(long double))
+{
+   // numeric_limits on Darwin (and elsewhere) tells lies here:
+   // the issue is that long double on a few platforms is
+   // really a "double double" which has a non-contiguous
+   // mantissa: 53 bits followed by an unspecified number of
+   // zero bits, followed by 53 more bits.  Thus the apparent
+   // precision of the type varies depending where it's been.
+   // Set epsilon to the value that a 106 bit fixed mantissa
+   // type would have, as that will give us sensible behaviour everywhere.
+   //
+   // This static assert fails for some unknown reason, so
+   // disabled for now...
+   // BOOST_STATIC_ASSERT(std::numeric_limits<long double>::digits == 106);
+   return 2.4651903288156618919116517665087e-32L;
+}
+#endif
+
+template <class T>
+inline T epsilon(const mpl::false_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   BOOST_MATH_STD_USING  // for ADL of std names
+   static const T eps = ldexp(static_cast<T>(1), 1-policies::digits<T, policies::policy<> >());
+   return eps;
+}
+
+} // namespace detail
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4309)
+#endif
+
+template <class T>
+inline T log_max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   typedef typename mpl::if_c<
+      (std::numeric_limits<T>::radix == 2) &&
+      (std::numeric_limits<T>::max_exponent == 128
+      || std::numeric_limits<T>::max_exponent == 1024
+      || std::numeric_limits<T>::max_exponent == 16384),
+      mpl::int_<(std::numeric_limits<T>::max_exponent > INT_MAX ? INT_MAX : static_cast<int>(std::numeric_limits<T>::max_exponent))>,
+      mpl::int_<0>
+   >::type tag_type;
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+   return detail::log_max_value<T>(tag_type());
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+   BOOST_MATH_STD_USING
+   static const T val = log((std::numeric_limits<T>::max)());
+   return val;
+#endif
+}
+
+template <class T>
+inline T log_min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   typedef typename mpl::if_c<
+      (std::numeric_limits<T>::radix == 2) &&
+      (std::numeric_limits<T>::max_exponent == 128
+      || std::numeric_limits<T>::max_exponent == 1024
+      || std::numeric_limits<T>::max_exponent == 16384),
+      mpl::int_<(std::numeric_limits<T>::max_exponent > INT_MAX ? INT_MAX : static_cast<int>(std::numeric_limits<T>::max_exponent))>,
+      mpl::int_<0>
+   >::type tag_type;
+
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+   return detail::log_min_value<T>(tag_type());
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+   BOOST_MATH_STD_USING
+   static const T val = log((std::numeric_limits<T>::min)());
+   return val;
+#endif
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class T>
+inline T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   return detail::epsilon<T>(mpl::bool_< ::std::numeric_limits<T>::is_specialized>());
+#else
+   return ::std::numeric_limits<T>::is_specialized ?
+      detail::epsilon<T>(mpl::true_()) :
+      detail::epsilon<T>(mpl::false_());
+#endif
+}
+
+namespace detail{
+
+template <class T>
+inline T root_epsilon_imp(const mpl::int_<24>&)
+{
+   return static_cast<T>(0.00034526698300124390839884978618400831996329879769945L);
+}
+
+template <class T>
+inline T root_epsilon_imp(const T*, const mpl::int_<53>&)
+{
+   return static_cast<T>(0.1490116119384765625e-7L);
+}
+
+template <class T>
+inline T root_epsilon_imp(const T*, const mpl::int_<64>&)
+{
+   return static_cast<T>(0.32927225399135962333569506281281311031656150598474e-9L);
+}
+
+template <class T>
+inline T root_epsilon_imp(const T*, const mpl::int_<113>&)
+{
+   return static_cast<T>(0.1387778780781445675529539585113525390625e-16L);
+}
+
+template <class T, class Tag>
+inline T root_epsilon_imp(const T*, const Tag&)
+{
+   BOOST_MATH_STD_USING
+   static const T r_eps = sqrt(tools::epsilon<T>());
+   return r_eps;
+}
+
+template <class T>
+inline T cbrt_epsilon_imp(const mpl::int_<24>&)
+{
+   return static_cast<T>(0.0049215666011518482998719164346805794944150447839903L);
+}
+
+template <class T>
+inline T cbrt_epsilon_imp(const T*, const mpl::int_<53>&)
+{
+   return static_cast<T>(6.05545445239333906078989272793696693569753008995e-6L);
+}
+
+template <class T>
+inline T cbrt_epsilon_imp(const T*, const mpl::int_<64>&)
+{
+   return static_cast<T>(4.76837158203125e-7L);
+}
+
+template <class T>
+inline T cbrt_epsilon_imp(const T*, const mpl::int_<113>&)
+{
+   return static_cast<T>(5.7749313854154005630396773604745549542403508090496e-12L);
+}
+
+template <class T, class Tag>
+inline T cbrt_epsilon_imp(const T*, const Tag&)
+{
+   BOOST_MATH_STD_USING;
+   static const T cbrt_eps = pow(tools::epsilon<T>(), T(1) / 3);
+   return cbrt_eps;
+}
+
+template <class T>
+inline T forth_root_epsilon_imp(const T*, const mpl::int_<24>&)
+{
+   return static_cast<T>(0.018581361171917516667460937040007436176452688944747L);
+}
+
+template <class T>
+inline T forth_root_epsilon_imp(const T*, const mpl::int_<53>&)
+{
+   return static_cast<T>(0.0001220703125L);
+}
+
+template <class T>
+inline T forth_root_epsilon_imp(const T*, const mpl::int_<64>&)
+{
+   return static_cast<T>(0.18145860519450699870567321328132261891067079047605e-4L);
+}
+
+template <class T>
+inline T forth_root_epsilon_imp(const T*, const mpl::int_<113>&)
+{
+   return static_cast<T>(0.37252902984619140625e-8L);
+}
+
+template <class T, class Tag>
+inline T forth_root_epsilon_imp(const T*, const Tag&)
+{
+   BOOST_MATH_STD_USING
+   static const T r_eps = sqrt(sqrt(tools::epsilon<T>()));
+   return r_eps;
+}
+
+}
+
+template <class T>
+inline T root_epsilon()
+{
+   typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
+   return detail::root_epsilon_imp(static_cast<T const*>(0), tag_type());
+}
+
+template <class T>
+inline T cbrt_epsilon()
+{
+   typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
+   return detail::cbrt_epsilon_imp(static_cast<T const*>(0), tag_type());
+}
+
+template <class T>
+inline T forth_root_epsilon()
+{
+   typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
+   return detail::forth_root_epsilon_imp(static_cast<T const*>(0), tag_type());
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_PRECISION_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/math/tools/promotion.hpp b/gatb-core/thirdparty/boost/math/tools/promotion.hpp
new file mode 100644
index 0000000..b3ad204
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/promotion.hpp
@@ -0,0 +1,175 @@
+// boost\math\tools\promotion.hpp
+
+// Copyright John Maddock 2006.
+// Copyright Paul A. Bristow 2006.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Promote arguments functions to allow math functions to have arguments
+// provided as integer OR real (floating-point, built-in or UDT)
+// (called ArithmeticType in functions that use promotion)
+// that help to reduce the risk of creating multiple instantiations.
+// Allows creation of an inline wrapper that forwards to a foo(RT, RT) function,
+// so you never get to instantiate any mixed foo(RT, IT) functions.
+
+#ifndef BOOST_MATH_PROMOTION_HPP
+#define BOOST_MATH_PROMOTION_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+// Boost type traits:
+#include <boost/math/tools/config.hpp>
+#include <boost/type_traits/is_floating_point.hpp> // for boost::is_floating_point;
+#include <boost/type_traits/is_integral.hpp> // for boost::is_integral
+#include <boost/type_traits/is_convertible.hpp> // for boost::is_convertible
+#include <boost/type_traits/is_same.hpp>// for boost::is_same
+#include <boost/type_traits/remove_cv.hpp>// for boost::remove_cv
+// Boost Template meta programming:
+#include <boost/mpl/if.hpp> // for boost::mpl::if_c.
+#include <boost/mpl/and.hpp> // for boost::mpl::if_c.
+#include <boost/mpl/or.hpp> // for boost::mpl::if_c.
+#include <boost/mpl/not.hpp> // for boost::mpl::if_c.
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#include <boost/static_assert.hpp>
+#endif
+
+namespace boost
+{
+  namespace math
+  {
+    namespace tools
+    {
+      // If either T1 or T2 is an integer type,
+      // pretend it was a double (for the purposes of further analysis).
+      // Then pick the wider of the two floating-point types
+      // as the actual signature to forward to.
+      // For example:
+      // foo(int, short) -> double foo(double, double);
+      // foo(int, float) -> double foo(double, double);
+      // Note: NOT float foo(float, float)
+      // foo(int, double) -> foo(double, double);
+      // foo(double, float) -> double foo(double, double);
+      // foo(double, float) -> double foo(double, double);
+      // foo(any-int-or-float-type, long double) -> foo(long double, long double);
+      // but ONLY float foo(float, float) is unchanged.
+      // So the only way to get an entirely float version is to call foo(1.F, 2.F),
+      // But since most (all?) the math functions convert to double internally,
+      // probably there would not be the hoped-for gain by using float here.
+
+      // This follows the C-compatible conversion rules of pow, etc
+      // where pow(int, float) is converted to pow(double, double).
+
+      template <class T>
+      struct promote_arg
+      { // If T is integral type, then promote to double.
+        typedef typename mpl::if_<is_integral<T>, double, T>::type type;
+      };
+      // These full specialisations reduce mpl::if_ usage and speed up
+      // compilation:
+      template <> struct promote_arg<float> { typedef float type; };
+      template <> struct promote_arg<double>{ typedef double type; };
+      template <> struct promote_arg<long double> { typedef long double type; };
+      template <> struct promote_arg<int> {  typedef double type; };
+
+      template <class T1, class T2>
+      struct promote_args_2
+      { // Promote, if necessary, & pick the wider of the two floating-point types.
+        // for both parameter types, if integral promote to double.
+        typedef typename promote_arg<T1>::type T1P; // T1 perhaps promoted.
+        typedef typename promote_arg<T2>::type T2P; // T2 perhaps promoted.
+
+        typedef typename mpl::if_<
+          typename mpl::and_<is_floating_point<T1P>, is_floating_point<T2P> >::type, // both T1P and T2P are floating-point?
+          typename mpl::if_< typename mpl::or_<is_same<long double, T1P>, is_same<long double, T2P> >::type, // either long double?
+            long double, // then result type is long double.
+            typename mpl::if_< typename mpl::or_<is_same<double, T1P>, is_same<double, T2P> >::type, // either double?
+            double, // result type is double.
+          float // else result type is float.
+          >::type
+          >::type,
+          // else one or the other is a user-defined type:
+          typename mpl::if_< typename mpl::and_<mpl::not_<is_floating_point<T2P> >, ::boost::is_convertible<T1P, T2P> >, T2P, T1P>::type>::type type;
+      }; // promote_arg2
+      // These full specialisations reduce mpl::if_ usage and speed up
+      // compilation:
+      template <> struct promote_args_2<float, float> { typedef float type; };
+      template <> struct promote_args_2<double, double>{ typedef double type; };
+      template <> struct promote_args_2<long double, long double> { typedef long double type; };
+      template <> struct promote_args_2<int, int> {  typedef double type; };
+      template <> struct promote_args_2<int, float> {  typedef double type; };
+      template <> struct promote_args_2<float, int> {  typedef double type; };
+      template <> struct promote_args_2<int, double> {  typedef double type; };
+      template <> struct promote_args_2<double, int> {  typedef double type; };
+      template <> struct promote_args_2<int, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, int> {  typedef long double type; };
+      template <> struct promote_args_2<float, double> {  typedef double type; };
+      template <> struct promote_args_2<double, float> {  typedef double type; };
+      template <> struct promote_args_2<float, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, float> {  typedef long double type; };
+      template <> struct promote_args_2<double, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, double> {  typedef long double type; };
+
+      template <class T1, class T2=float, class T3=float, class T4=float, class T5=float, class T6=float>
+      struct promote_args
+      {
+         typedef typename promote_args_2<
+            typename remove_cv<T1>::type,
+            typename promote_args_2<
+               typename remove_cv<T2>::type,
+               typename promote_args_2<
+                  typename remove_cv<T3>::type,
+                  typename promote_args_2<
+                     typename remove_cv<T4>::type,
+                     typename promote_args_2<
+                        typename remove_cv<T5>::type, typename remove_cv<T6>::type
+                     >::type
+                  >::type
+               >::type
+            >::type
+         >::type type;
+
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+         //
+         // Guard against use of long double if it's not supported:
+         //
+         BOOST_STATIC_ASSERT_MSG((0 == ::boost::is_same<type, long double>::value), "Sorry, but this platform does not have sufficient long double support for the special functions to be reliably implemented.");
+#endif
+      };
+
+      //
+      // This struct is the same as above, but has no static assert on long double usage,
+      // it should be used only on functions that can be implemented for long double
+      // even when std lib support is missing or broken for that type.
+      //
+      template <class T1, class T2=float, class T3=float, class T4=float, class T5=float, class T6=float>
+      struct promote_args_permissive
+      {
+         typedef typename promote_args_2<
+            typename remove_cv<T1>::type,
+            typename promote_args_2<
+               typename remove_cv<T2>::type,
+               typename promote_args_2<
+                  typename remove_cv<T3>::type,
+                  typename promote_args_2<
+                     typename remove_cv<T4>::type,
+                     typename promote_args_2<
+                        typename remove_cv<T5>::type, typename remove_cv<T6>::type
+                     >::type
+                  >::type
+               >::type
+            >::type
+         >::type type;
+      };
+
+    } // namespace tools
+  } // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_PROMOTION_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/tools/rational.hpp b/gatb-core/thirdparty/boost/math/tools/rational.hpp
new file mode 100644
index 0000000..accffea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/rational.hpp
@@ -0,0 +1,333 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_RATIONAL_HPP
+#define BOOST_MATH_TOOLS_RATIONAL_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/array.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/mpl/int.hpp>
+
+#if BOOST_MATH_POLY_METHOD == 1
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/polynomial_horner1_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#elif BOOST_MATH_POLY_METHOD == 2
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/polynomial_horner2_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#elif BOOST_MATH_POLY_METHOD == 3
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/polynomial_horner3_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#endif
+#if BOOST_MATH_RATIONAL_METHOD == 1
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/rational_horner1_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#elif BOOST_MATH_RATIONAL_METHOD == 2
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/rational_horner2_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#elif BOOST_MATH_RATIONAL_METHOD == 3
+#  define BOOST_HEADER() <BOOST_JOIN(boost/math/tools/detail/rational_horner3_, BOOST_MATH_MAX_POLY_ORDER).hpp>
+#  include BOOST_HEADER()
+#  undef BOOST_HEADER
+#endif
+
+#if 0
+//
+// This just allows dependency trackers to find the headers
+// used in the above PP-magic.
+//
+#include <boost/math/tools/detail/polynomial_horner1_2.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_3.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_4.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_5.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_6.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_7.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_8.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_9.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_10.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_11.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_12.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_13.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_14.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_15.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_16.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_17.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_18.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_19.hpp>
+#include <boost/math/tools/detail/polynomial_horner1_20.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_2.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_3.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_4.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_5.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_6.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_7.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_8.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_9.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_10.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_11.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_12.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_13.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_14.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_15.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_16.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_17.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_18.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_19.hpp>
+#include <boost/math/tools/detail/polynomial_horner2_20.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_2.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_3.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_4.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_5.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_6.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_7.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_8.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_9.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_10.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_11.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_12.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_13.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_14.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_15.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_16.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_17.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_18.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_19.hpp>
+#include <boost/math/tools/detail/polynomial_horner3_20.hpp>
+#include <boost/math/tools/detail/rational_horner1_2.hpp>
+#include <boost/math/tools/detail/rational_horner1_3.hpp>
+#include <boost/math/tools/detail/rational_horner1_4.hpp>
+#include <boost/math/tools/detail/rational_horner1_5.hpp>
+#include <boost/math/tools/detail/rational_horner1_6.hpp>
+#include <boost/math/tools/detail/rational_horner1_7.hpp>
+#include <boost/math/tools/detail/rational_horner1_8.hpp>
+#include <boost/math/tools/detail/rational_horner1_9.hpp>
+#include <boost/math/tools/detail/rational_horner1_10.hpp>
+#include <boost/math/tools/detail/rational_horner1_11.hpp>
+#include <boost/math/tools/detail/rational_horner1_12.hpp>
+#include <boost/math/tools/detail/rational_horner1_13.hpp>
+#include <boost/math/tools/detail/rational_horner1_14.hpp>
+#include <boost/math/tools/detail/rational_horner1_15.hpp>
+#include <boost/math/tools/detail/rational_horner1_16.hpp>
+#include <boost/math/tools/detail/rational_horner1_17.hpp>
+#include <boost/math/tools/detail/rational_horner1_18.hpp>
+#include <boost/math/tools/detail/rational_horner1_19.hpp>
+#include <boost/math/tools/detail/rational_horner1_20.hpp>
+#include <boost/math/tools/detail/rational_horner2_2.hpp>
+#include <boost/math/tools/detail/rational_horner2_3.hpp>
+#include <boost/math/tools/detail/rational_horner2_4.hpp>
+#include <boost/math/tools/detail/rational_horner2_5.hpp>
+#include <boost/math/tools/detail/rational_horner2_6.hpp>
+#include <boost/math/tools/detail/rational_horner2_7.hpp>
+#include <boost/math/tools/detail/rational_horner2_8.hpp>
+#include <boost/math/tools/detail/rational_horner2_9.hpp>
+#include <boost/math/tools/detail/rational_horner2_10.hpp>
+#include <boost/math/tools/detail/rational_horner2_11.hpp>
+#include <boost/math/tools/detail/rational_horner2_12.hpp>
+#include <boost/math/tools/detail/rational_horner2_13.hpp>
+#include <boost/math/tools/detail/rational_horner2_14.hpp>
+#include <boost/math/tools/detail/rational_horner2_15.hpp>
+#include <boost/math/tools/detail/rational_horner2_16.hpp>
+#include <boost/math/tools/detail/rational_horner2_17.hpp>
+#include <boost/math/tools/detail/rational_horner2_18.hpp>
+#include <boost/math/tools/detail/rational_horner2_19.hpp>
+#include <boost/math/tools/detail/rational_horner2_20.hpp>
+#include <boost/math/tools/detail/rational_horner3_2.hpp>
+#include <boost/math/tools/detail/rational_horner3_3.hpp>
+#include <boost/math/tools/detail/rational_horner3_4.hpp>
+#include <boost/math/tools/detail/rational_horner3_5.hpp>
+#include <boost/math/tools/detail/rational_horner3_6.hpp>
+#include <boost/math/tools/detail/rational_horner3_7.hpp>
+#include <boost/math/tools/detail/rational_horner3_8.hpp>
+#include <boost/math/tools/detail/rational_horner3_9.hpp>
+#include <boost/math/tools/detail/rational_horner3_10.hpp>
+#include <boost/math/tools/detail/rational_horner3_11.hpp>
+#include <boost/math/tools/detail/rational_horner3_12.hpp>
+#include <boost/math/tools/detail/rational_horner3_13.hpp>
+#include <boost/math/tools/detail/rational_horner3_14.hpp>
+#include <boost/math/tools/detail/rational_horner3_15.hpp>
+#include <boost/math/tools/detail/rational_horner3_16.hpp>
+#include <boost/math/tools/detail/rational_horner3_17.hpp>
+#include <boost/math/tools/detail/rational_horner3_18.hpp>
+#include <boost/math/tools/detail/rational_horner3_19.hpp>
+#include <boost/math/tools/detail/rational_horner3_20.hpp>
+#endif
+
+namespace boost{ namespace math{ namespace tools{
+
+//
+// Forward declaration to keep two phase lookup happy:
+//
+template <class T, class U>
+U evaluate_polynomial(const T* poly, U const& z, std::size_t count);
+
+namespace detail{
+
+template <class T, class V, class Tag>
+inline V evaluate_polynomial_c_imp(const T* a, const V& val, const Tag*)
+{
+   return evaluate_polynomial(a, val, Tag::value);
+}
+
+} // namespace detail
+
+//
+// Polynomial evaluation with runtime size.
+// This requires a for-loop which may be more expensive than
+// the loop expanded versions above:
+//
+template <class T, class U>
+inline U evaluate_polynomial(const T* poly, U const& z, std::size_t count)
+{
+   BOOST_ASSERT(count > 0);
+   U sum = static_cast<U>(poly[count - 1]);
+   for(int i = static_cast<int>(count) - 2; i >= 0; --i)
+   {
+      sum *= z;
+      sum += static_cast<U>(poly[i]);
+   }
+   return sum;
+}
+//
+// Compile time sized polynomials, just inline forwarders to the
+// implementations above:
+//
+template <std::size_t N, class T, class V>
+inline V evaluate_polynomial(const T(&a)[N], const V& val)
+{
+   typedef mpl::int_<N> tag_type;
+   return detail::evaluate_polynomial_c_imp(static_cast<const T*>(a), val, static_cast<tag_type const*>(0));
+}
+
+template <std::size_t N, class T, class V>
+inline V evaluate_polynomial(const boost::array<T,N>& a, const V& val)
+{
+   typedef mpl::int_<N> tag_type;
+   return detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()), val, static_cast<tag_type const*>(0));
+}
+//
+// Even polynomials are trivial: just square the argument!
+//
+template <class T, class U>
+inline U evaluate_even_polynomial(const T* poly, U z, std::size_t count)
+{
+   return evaluate_polynomial(poly, U(z*z), count);
+}
+
+template <std::size_t N, class T, class V>
+inline V evaluate_even_polynomial(const T(&a)[N], const V& z)
+{
+   return evaluate_polynomial(a, V(z*z));
+}
+
+template <std::size_t N, class T, class V>
+inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z)
+{
+   return evaluate_polynomial(a, V(z*z));
+}
+//
+// Odd polynomials come next:
+//
+template <class T, class U>
+inline U evaluate_odd_polynomial(const T* poly, U z, std::size_t count)
+{
+   return poly[0] + z * evaluate_polynomial(poly+1, U(z*z), count-1);
+}
+
+template <std::size_t N, class T, class V>
+inline V evaluate_odd_polynomial(const T(&a)[N], const V& z)
+{
+   typedef mpl::int_<N-1> tag_type;
+   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a) + 1, V(z*z), static_cast<tag_type const*>(0));
+}
+
+template <std::size_t N, class T, class V>
+inline V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z)
+{
+   typedef mpl::int_<N-1> tag_type;
+   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()) + 1, V(z*z), static_cast<tag_type const*>(0));
+}
+
+template <class T, class U, class V>
+V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count);
+
+namespace detail{
+
+template <class T, class U, class V, class Tag>
+inline V evaluate_rational_c_imp(const T* num, const U* denom, const V& z, const Tag*)
+{
+   return boost::math::tools::evaluate_rational(num, denom, z, Tag::value);
+}
+
+}
+//
+// Rational functions: numerator and denominator must be
+// equal in size.  These always have a for-loop and so may be less
+// efficient than evaluating a pair of polynomials. However, there
+// are some tricks we can use to prevent overflow that might otherwise
+// occur in polynomial evaluation, if z is large.  This is important
+// in our Lanczos code for example.
+//
+template <class T, class U, class V>
+V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count)
+{
+   V z(z_);
+   V s1, s2;
+   if(z <= 1)
+   {
+      s1 = static_cast<V>(num[count-1]);
+      s2 = static_cast<V>(denom[count-1]);
+      for(int i = (int)count - 2; i >= 0; --i)
+      {
+         s1 *= z;
+         s2 *= z;
+         s1 += num[i];
+         s2 += denom[i];
+      }
+   }
+   else
+   {
+      z = 1 / z;
+      s1 = static_cast<V>(num[0]);
+      s2 = static_cast<V>(denom[0]);
+      for(unsigned i = 1; i < count; ++i)
+      {
+         s1 *= z;
+         s2 *= z;
+         s1 += num[i];
+         s2 += denom[i];
+      }
+   }
+   return s1 / s2;
+}
+
+template <std::size_t N, class T, class U, class V>
+inline V evaluate_rational(const T(&a)[N], const U(&b)[N], const V& z)
+{
+   return detail::evaluate_rational_c_imp(a, b, z, static_cast<const mpl::int_<N>*>(0));
+}
+
+template <std::size_t N, class T, class U, class V>
+inline V evaluate_rational(const boost::array<T,N>& a, const boost::array<U,N>& b, const V& z)
+{
+   return detail::evaluate_rational_c_imp(a.data(), b.data(), z, static_cast<mpl::int_<N>*>(0));
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_RATIONAL_HPP
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/real_cast.hpp b/gatb-core/thirdparty/boost/math/tools/real_cast.hpp
new file mode 100644
index 0000000..9b854e3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/real_cast.hpp
@@ -0,0 +1,29 @@
+//  Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_REAL_CAST_HPP
+#define BOOST_MATH_TOOLS_REAL_CAST_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math
+{
+  namespace tools
+  {
+    template <class To, class T>
+    inline To real_cast(T t)
+    {
+       return static_cast<To>(t);
+    }
+  } // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_REAL_CAST_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/roots.hpp b/gatb-core/thirdparty/boost/math/tools/roots.hpp
new file mode 100644
index 0000000..2442f5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/roots.hpp
@@ -0,0 +1,542 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_NEWTON_SOLVER_HPP
+#define BOOST_MATH_TOOLS_NEWTON_SOLVER_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <utility>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <stdexcept>
+
+#include <boost/math/tools/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+#include <boost/throw_exception.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4512)
+#endif
+#include <boost/math/tools/tuple.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/tools/toms748_solve.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+namespace detail{
+
+template <class Tuple, class T>
+inline void unpack_0(const Tuple& t, T& val)
+{ val = boost::math::get<0>(t); }
+
+template <class F, class T>
+void handle_zero_derivative(F f,
+                            T& last_f0,
+                            const T& f0,
+                            T& delta,
+                            T& result,
+                            T& guess,
+                            const T& min,
+                            const T& max)
+{
+   if(last_f0 == 0)
+   {
+      // this must be the first iteration, pretend that we had a
+      // previous one at either min or max:
+      if(result == min)
+      {
+         guess = max;
+      }
+      else
+      {
+         guess = min;
+      }
+      unpack_0(f(guess), last_f0);
+      delta = guess - result;
+   }
+   if(sign(last_f0) * sign(f0) < 0)
+   {
+      // we've crossed over so move in opposite direction to last step:
+      if(delta < 0)
+      {
+         delta = (result - min) / 2;
+      }
+      else
+      {
+         delta = (result - max) / 2;
+      }
+   }
+   else
+   {
+      // move in same direction as last step:
+      if(delta < 0)
+      {
+         delta = (result - max) / 2;
+      }
+      else
+      {
+         delta = (result - min) / 2;
+      }
+   }
+}
+
+} // namespace
+
+template <class F, class T, class Tol, class Policy>
+std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+{
+   T fmin = f(min);
+   T fmax = f(max);
+   if(fmin == 0)
+      return std::make_pair(min, min);
+   if(fmax == 0)
+      return std::make_pair(max, max);
+
+   //
+   // Error checking:
+   //
+   static const char* function = "boost::math::tools::bisect<%1%>";
+   if(min >= max)
+   {
+      return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function,
+         "Arguments in wrong order in boost::math::tools::bisect (first arg=%1%)", min, pol));
+   }
+   if(fmin * fmax >= 0)
+   {
+      return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function,
+         "No change of sign in boost::math::tools::bisect, either there is no root to find, or there are multiple roots in the interval (f(min) = %1%).", fmin, pol));
+   }
+
+   //
+   // Three function invocations so far:
+   //
+   boost::uintmax_t count = max_iter;
+   if(count < 3)
+      count = 0;
+   else
+      count -= 3;
+
+   while(count && (0 == tol(min, max)))
+   {
+      T mid = (min + max) / 2;
+      T fmid = f(mid);
+      if((mid == max) || (mid == min))
+         break;
+      if(fmid == 0)
+      {
+         min = max = mid;
+         break;
+      }
+      else if(sign(fmid) * sign(fmin) < 0)
+      {
+         max = mid;
+         fmax = fmid;
+      }
+      else
+      {
+         min = mid;
+         fmin = fmid;
+      }
+      --count;
+   }
+
+   max_iter -= count;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Bisection iteration, final count = " << max_iter << std::endl;
+
+   static boost::uintmax_t max_count = 0;
+   if(max_iter > max_count)
+   {
+      max_count = max_iter;
+      std::cout << "Maximum iterations: " << max_iter << std::endl;
+   }
+#endif
+
+   return std::make_pair(min, max);
+}
+
+template <class F, class T, class Tol>
+inline std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter)
+{
+   return bisect(f, min, max, tol, max_iter, policies::policy<>());
+}
+
+template <class F, class T, class Tol>
+inline std::pair<T, T> bisect(F f, T min, T max, Tol tol)
+{
+   boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+   return bisect(f, min, max, tol, m, policies::policy<>());
+}
+
+template <class F, class T>
+T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
+{
+   BOOST_MATH_STD_USING
+
+   T f0(0), f1, last_f0(0);
+   T result = guess;
+
+   T factor = static_cast<T>(ldexp(1.0, 1 - digits));
+   T delta = 1;
+   T delta1 = tools::max_value<T>();
+   T delta2 = tools::max_value<T>();
+
+   boost::uintmax_t count(max_iter);
+
+   do{
+      last_f0 = f0;
+      delta2 = delta1;
+      delta1 = delta;
+      boost::math::tie(f0, f1) = f(result);
+      if(0 == f0)
+         break;
+      if(f1 == 0)
+      {
+         // Oops zero derivative!!!
+#ifdef BOOST_MATH_INSTRUMENT
+         std::cout << "Newton iteration, zero derivative found" << std::endl;
+#endif
+         detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
+      }
+      else
+      {
+         delta = f0 / f1;
+      }
+#ifdef BOOST_MATH_INSTRUMENT
+      std::cout << "Newton iteration, delta = " << delta << std::endl;
+#endif
+      if(fabs(delta * 2) > fabs(delta2))
+      {
+         // last two steps haven't converged, try bisection:
+         delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
+      }
+      guess = result;
+      result -= delta;
+      if(result <= min)
+      {
+         delta = 0.5F * (guess - min);
+         result = guess - delta;
+         if((result == min) || (result == max))
+            break;
+      }
+      else if(result >= max)
+      {
+         delta = 0.5F * (guess - max);
+         result = guess - delta;
+         if((result == min) || (result == max))
+            break;
+      }
+      // update brackets:
+      if(delta > 0)
+         max = guess;
+      else
+         min = guess;
+   }while(--count && (fabs(result * factor) < fabs(delta)));
+
+   max_iter -= count;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Newton Raphson iteration, final count = " << max_iter << std::endl;
+
+   static boost::uintmax_t max_count = 0;
+   if(max_iter > max_count)
+   {
+      max_count = max_iter;
+      std::cout << "Maximum iterations: " << max_iter << std::endl;
+   }
+#endif
+
+   return result;
+}
+
+template <class F, class T>
+inline T newton_raphson_iterate(F f, T guess, T min, T max, int digits)
+{
+   boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+   return newton_raphson_iterate(f, guess, min, max, digits, m);
+}
+
+template <class F, class T>
+T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
+{
+   BOOST_MATH_STD_USING
+
+   T f0(0), f1, f2;
+   T result = guess;
+
+   T factor = static_cast<T>(ldexp(1.0, 1 - digits));
+   T delta = (std::max)(T(10000000 * guess), T(10000000));  // arbitarily large delta
+   T last_f0 = 0;
+   T delta1 = delta;
+   T delta2 = delta;
+
+   bool out_of_bounds_sentry = false;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Halley iteration, limit = " << factor << std::endl;
+#endif
+
+   boost::uintmax_t count(max_iter);
+
+   do{
+      last_f0 = f0;
+      delta2 = delta1;
+      delta1 = delta;
+      boost::math::tie(f0, f1, f2) = f(result);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(f0);
+      BOOST_MATH_INSTRUMENT_VARIABLE(f1);
+      BOOST_MATH_INSTRUMENT_VARIABLE(f2);
+      
+      if(0 == f0)
+         break;
+      if(f1 == 0)
+      {
+         // Oops zero derivative!!!
+#ifdef BOOST_MATH_INSTRUMENT
+         std::cout << "Halley iteration, zero derivative found" << std::endl;
+#endif
+         detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
+      }
+      else
+      {
+         if(f2 != 0)
+         {
+            T denom = 2 * f0;
+            T num = 2 * f1 - f0 * (f2 / f1);
+
+            BOOST_MATH_INSTRUMENT_VARIABLE(denom);
+            BOOST_MATH_INSTRUMENT_VARIABLE(num);
+
+            if((fabs(num) < 1) && (fabs(denom) >= fabs(num) * tools::max_value<T>()))
+            {
+               // possible overflow, use Newton step:
+               delta = f0 / f1;
+            }
+            else
+               delta = denom / num;
+            if(delta * f1 / f0 < 0)
+            {
+               // Oh dear, we have a problem as Newton and Halley steps
+               // disagree about which way we should move.  Probably
+               // there is cancelation error in the calculation of the
+               // Halley step, or else the derivatives are so small
+               // that their values are basically trash.  We will move
+               // in the direction indicated by a Newton step, but
+               // by no more than twice the current guess value, otherwise
+               // we can jump way out of bounds if we're not careful.
+               // See https://svn.boost.org/trac/boost/ticket/8314.
+               delta = f0 / f1;
+               if(fabs(delta) > 2 * fabs(guess))
+                  delta = (delta < 0 ? -1 : 1) * 2 * fabs(guess);
+            }
+         }
+         else
+            delta = f0 / f1;
+      }
+#ifdef BOOST_MATH_INSTRUMENT
+      std::cout << "Halley iteration, delta = " << delta << std::endl;
+#endif
+      T convergence = fabs(delta / delta2);
+      if((convergence > 0.8) && (convergence < 2))
+      {
+         // last two steps haven't converged, try bisection:
+         delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
+         if(fabs(delta) > result)
+            delta = sign(delta) * result; // protect against huge jumps!
+         // reset delta2 so that this branch will *not* be taken on the
+         // next iteration:
+         delta2 = delta * 3;
+         BOOST_MATH_INSTRUMENT_VARIABLE(delta);
+      }
+      guess = result;
+      result -= delta;
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+
+      // check for out of bounds step:
+      if(result < min)
+      {
+         T diff = ((fabs(min) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(min))) ? T(1000)  : T(result / min);
+         if(fabs(diff) < 1)
+            diff = 1 / diff;
+         if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+         {
+            // Only a small out of bounds step, lets assume that the result
+            // is probably approximately at min:
+            delta = 0.99f * (guess  - min);
+            result = guess - delta;
+            out_of_bounds_sentry = true; // only take this branch once!
+         }
+         else
+         {
+            delta = (guess - min) / 2;
+            result = guess - delta;
+            if((result == min) || (result == max))
+               break;
+         }
+      }
+      else if(result > max)
+      {
+         T diff = ((fabs(max) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(max))) ? T(1000) : T(result / max);
+         if(fabs(diff) < 1)
+            diff = 1 / diff;
+         if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+         {
+            // Only a small out of bounds step, lets assume that the result
+            // is probably approximately at min:
+            delta = 0.99f * (guess  - max);
+            result = guess - delta;
+            out_of_bounds_sentry = true; // only take this branch once!
+         }
+         else
+         {
+            delta = (guess - max) / 2;
+            result = guess - delta;
+            if((result == min) || (result == max))
+               break;
+         }
+      }
+      // update brackets:
+      if(delta > 0)
+         max = guess;
+      else
+         min = guess;
+   }while(--count && (fabs(result * factor) < fabs(delta)));
+
+   max_iter -= count;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Halley iteration, final count = " << max_iter << std::endl;
+#endif
+
+   return result;
+}
+
+template <class F, class T>
+inline T halley_iterate(F f, T guess, T min, T max, int digits)
+{
+   boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+   return halley_iterate(f, guess, min, max, digits, m);
+}
+
+template <class F, class T>
+T schroeder_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
+{
+   BOOST_MATH_STD_USING
+
+   T f0(0), f1, f2, last_f0(0);
+   T result = guess;
+
+   T factor = static_cast<T>(ldexp(1.0, 1 - digits));
+   T delta = 0;
+   T delta1 = tools::max_value<T>();
+   T delta2 = tools::max_value<T>();
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Schroeder iteration, limit = " << factor << std::endl;
+#endif
+
+   boost::uintmax_t count(max_iter);
+
+   do{
+      last_f0 = f0;
+      delta2 = delta1;
+      delta1 = delta;
+      boost::math::tie(f0, f1, f2) = f(result);
+      if(0 == f0)
+         break;
+      if((f1 == 0) && (f2 == 0))
+      {
+         // Oops zero derivative!!!
+#ifdef BOOST_MATH_INSTRUMENT
+         std::cout << "Halley iteration, zero derivative found" << std::endl;
+#endif
+         detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
+      }
+      else
+      {
+         T ratio = f0 / f1;
+         if(ratio / result < 0.1)
+         {
+            delta = ratio + (f2 / (2 * f1)) * ratio * ratio;
+            // check second derivative doesn't over compensate:
+            if(delta * ratio < 0)
+               delta = ratio;
+         }
+         else
+            delta = ratio;  // fall back to Newton iteration.
+      }
+      if(fabs(delta * 2) > fabs(delta2))
+      {
+         // last two steps haven't converged, try bisection:
+         delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
+      }
+      guess = result;
+      result -= delta;
+#ifdef BOOST_MATH_INSTRUMENT
+      std::cout << "Halley iteration, delta = " << delta << std::endl;
+#endif
+      if(result <= min)
+      {
+         delta = 0.5F * (guess - min);
+         result = guess - delta;
+         if((result == min) || (result == max))
+            break;
+      }
+      else if(result >= max)
+      {
+         delta = 0.5F * (guess - max);
+         result = guess - delta;
+         if((result == min) || (result == max))
+            break;
+      }
+      // update brackets:
+      if(delta > 0)
+         max = guess;
+      else
+         min = guess;
+   }while(--count && (fabs(result * factor) < fabs(delta)));
+
+   max_iter -= count;
+
+#ifdef BOOST_MATH_INSTRUMENT
+   std::cout << "Schroeder iteration, final count = " << max_iter << std::endl;
+
+   static boost::uintmax_t max_count = 0;
+   if(max_iter > max_count)
+   {
+      max_count = max_iter;
+      std::cout << "Maximum iterations: " << max_iter << std::endl;
+   }
+#endif
+
+   return result;
+}
+
+template <class F, class T>
+inline T schroeder_iterate(F f, T guess, T min, T max, int digits)
+{
+   boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+   return schroeder_iterate(f, guess, min, max, digits, m);
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_NEWTON_SOLVER_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/series.hpp b/gatb-core/thirdparty/boost/math/tools/series.hpp
new file mode 100644
index 0000000..a32a33f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/series.hpp
@@ -0,0 +1,158 @@
+//  (C) Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_SERIES_INCLUDED
+#define BOOST_MATH_TOOLS_SERIES_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/tools/config.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+//
+// Simple series summation come first:
+//
+template <class Functor, class U, class V>
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms, const V& init_value)
+{
+   BOOST_MATH_STD_USING
+
+   typedef typename Functor::result_type result_type;
+
+   boost::uintmax_t counter = max_terms;
+
+   result_type result = init_value;
+   result_type next_term;
+   do{
+      next_term = func();
+      result += next_term;
+   }
+   while((fabs(factor * result) < fabs(next_term)) && --counter);
+
+   // set max_terms to the actual number of terms of the series evaluated:
+   max_terms = max_terms - counter;
+
+   return result;
+}
+
+template <class Functor, class U>
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms)
+{
+   typename Functor::result_type init_value = 0;
+   return sum_series(func, factor, max_terms, init_value);
+}
+
+template <class Functor, class U>
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms, const U& init_value)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Functor::result_type result_type;
+   result_type factor = ldexp(result_type(1), 1 - bits);
+   return sum_series(func, factor, max_terms, init_value);
+}
+
+template <class Functor>
+inline typename Functor::result_type sum_series(Functor& func, int bits)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Functor::result_type result_type;
+   boost::uintmax_t iters = (std::numeric_limits<boost::uintmax_t>::max)();
+   result_type init_val = 0;
+   return sum_series(func, bits, iters, init_val);
+}
+
+template <class Functor>
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Functor::result_type result_type;
+   result_type init_val = 0;
+   return sum_series(func, bits, max_terms, init_val);
+}
+
+template <class Functor, class U>
+inline typename Functor::result_type sum_series(Functor& func, int bits, const U& init_value)
+{
+   BOOST_MATH_STD_USING
+   boost::uintmax_t iters = (std::numeric_limits<boost::uintmax_t>::max)();
+   return sum_series(func, bits, iters, init_value);
+}
+
+//
+// Algorithm kahan_sum_series invokes Functor func until the N'th
+// term is too small to have any effect on the total, the terms
+// are added using the Kahan summation method.
+//
+// CAUTION: Optimizing compilers combined with extended-precision
+// machine registers conspire to render this algorithm partly broken:
+// double rounding of intermediate terms (first to a long double machine
+// register, and then to a double result) cause the rounding error computed
+// by the algorithm to be off by up to 1ulp.  However this occurs rarely, and
+// in any case the result is still much better than a naive summation.
+//
+template <class Functor>
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits)
+{
+   BOOST_MATH_STD_USING
+
+   typedef typename Functor::result_type result_type;
+
+   result_type factor = pow(result_type(2), bits);
+   result_type result = func();
+   result_type next_term, y, t;
+   result_type carry = 0;
+   do{
+      next_term = func();
+      y = next_term - carry;
+      t = result + y;
+      carry = t - result;
+      carry -= y;
+      result = t;
+   }
+   while(fabs(result) < fabs(factor * next_term));
+   return result;
+}
+
+template <class Functor>
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING
+
+   typedef typename Functor::result_type result_type;
+
+   boost::uintmax_t counter = max_terms;
+
+   result_type factor = ldexp(result_type(1), bits);
+   result_type result = func();
+   result_type next_term, y, t;
+   result_type carry = 0;
+   do{
+      next_term = func();
+      y = next_term - carry;
+      t = result + y;
+      carry = t - result;
+      carry -= y;
+      result = t;
+   }
+   while((fabs(result) < fabs(factor * next_term)) && --counter);
+
+   // set max_terms to the actual number of terms of the series evaluated:
+   max_terms = max_terms - counter;
+
+   return result;
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_TOOLS_SERIES_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/math/tools/stats.hpp b/gatb-core/thirdparty/boost/math/tools/stats.hpp
new file mode 100644
index 0000000..e7ea8bd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/stats.hpp
@@ -0,0 +1,88 @@
+//  (C) Copyright John Maddock 2005-2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_STATS_INCLUDED
+#define BOOST_MATH_TOOLS_STATS_INCLUDED
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/math/tools/precision.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+template <class T>
+class stats
+{
+public:
+   stats()
+      : m_min(tools::max_value<T>()),
+        m_max(-tools::max_value<T>()),
+        m_total(0),
+        m_squared_total(0),
+        m_count(0)
+   {}
+   void add(const T& val)
+   {
+      if(val < m_min)
+         m_min = val;
+      if(val > m_max)
+         m_max = val;
+      m_total += val;
+      ++m_count;
+      m_squared_total += val*val;
+   }
+   T min BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return m_min; }
+   T max BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return m_max; }
+   T total()const{ return m_total; }
+   T mean()const{ return m_total / static_cast<T>(m_count); }
+   boost::uintmax_t count()const{ return m_count; }
+   T variance()const
+   {
+      BOOST_MATH_STD_USING
+
+      T t = m_squared_total - m_total * m_total / m_count;
+      t /= m_count;
+      return t;
+   }
+   T variance1()const
+   {
+      BOOST_MATH_STD_USING
+
+      T t = m_squared_total - m_total * m_total / m_count;
+      t /= (m_count-1);
+      return t;
+   }
+   T rms()const
+   {
+      BOOST_MATH_STD_USING
+
+      return sqrt(m_squared_total / static_cast<T>(m_count));
+   }
+   stats& operator+=(const stats& s)
+   {
+      if(s.m_min < m_min)
+         m_min = s.m_min;
+      if(s.m_max > m_max)
+         m_max = s.m_max;
+      m_total += s.m_total;
+      m_squared_total += s.m_squared_total;
+      m_count += s.m_count;
+      return *this;
+   }
+private:
+   T m_min, m_max, m_total, m_squared_total;
+   boost::uintmax_t m_count;
+};
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/math/tools/toms748_solve.hpp b/gatb-core/thirdparty/boost/math/tools/toms748_solve.hpp
new file mode 100644
index 0000000..48737a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/toms748_solve.hpp
@@ -0,0 +1,609 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
+#define BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/cstdint.hpp>
+#include <limits>
+
+#ifdef BOOST_MATH_LOG_ROOT_ITERATIONS
+#  define BOOST_MATH_LOGGER_INCLUDE <boost/math/tools/iteration_logger.hpp>
+#  include BOOST_MATH_LOGGER_INCLUDE
+#  undef BOOST_MATH_LOGGER_INCLUDE
+#else
+#  define BOOST_MATH_LOG_COUNT(count)
+#endif
+
+namespace boost{ namespace math{ namespace tools{
+
+template <class T>
+class eps_tolerance
+{
+public:
+   eps_tolerance(unsigned bits)
+   {
+      BOOST_MATH_STD_USING
+      eps = (std::max)(T(ldexp(1.0F, 1-bits)), T(4 * tools::epsilon<T>()));
+   }
+   bool operator()(const T& a, const T& b)
+   {
+      BOOST_MATH_STD_USING
+      return fabs(a - b) <= (eps * (std::min)(fabs(a), fabs(b)));
+   }
+private:
+   T eps;
+};
+
+struct equal_floor
+{
+   equal_floor(){}
+   template <class T>
+   bool operator()(const T& a, const T& b)
+   {
+      BOOST_MATH_STD_USING
+      return floor(a) == floor(b);
+   }
+};
+
+struct equal_ceil
+{
+   equal_ceil(){}
+   template <class T>
+   bool operator()(const T& a, const T& b)
+   {
+      BOOST_MATH_STD_USING
+      return ceil(a) == ceil(b);
+   }
+};
+
+struct equal_nearest_integer
+{
+   equal_nearest_integer(){}
+   template <class T>
+   bool operator()(const T& a, const T& b)
+   {
+      BOOST_MATH_STD_USING
+      return floor(a + 0.5f) == floor(b + 0.5f);
+   }
+};
+
+namespace detail{
+
+template <class F, class T>
+void bracket(F f, T& a, T& b, T c, T& fa, T& fb, T& d, T& fd)
+{
+   //
+   // Given a point c inside the existing enclosing interval
+   // [a, b] sets a = c if f(c) == 0, otherwise finds the new 
+   // enclosing interval: either [a, c] or [c, b] and sets
+   // d and fd to the point that has just been removed from
+   // the interval.  In other words d is the third best guess
+   // to the root.
+   //
+   BOOST_MATH_STD_USING  // For ADL of std math functions
+   T tol = tools::epsilon<T>() * 2;
+   //
+   // If the interval [a,b] is very small, or if c is too close 
+   // to one end of the interval then we need to adjust the
+   // location of c accordingly:
+   //
+   if((b - a) < 2 * tol * a)
+   {
+      c = a + (b - a) / 2;
+   }
+   else if(c <= a + fabs(a) * tol)
+   {
+      c = a + fabs(a) * tol;
+   }
+   else if(c >= b - fabs(b) * tol)
+   {
+      c = b - fabs(a) * tol;
+   }
+   //
+   // OK, lets invoke f(c):
+   //
+   T fc = f(c);
+   //
+   // if we have a zero then we have an exact solution to the root:
+   //
+   if(fc == 0)
+   {
+      a = c;
+      fa = 0;
+      d = 0;
+      fd = 0;
+      return;
+   }
+   //
+   // Non-zero fc, update the interval:
+   //
+   if(boost::math::sign(fa) * boost::math::sign(fc) < 0)
+   {
+      d = b;
+      fd = fb;
+      b = c;
+      fb = fc;
+   }
+   else
+   {
+      d = a;
+      fd = fa;
+      a = c;
+      fa= fc;
+   }
+}
+
+template <class T>
+inline T safe_div(T num, T denom, T r)
+{
+   //
+   // return num / denom without overflow,
+   // return r if overflow would occur.
+   //
+   BOOST_MATH_STD_USING  // For ADL of std math functions
+
+   if(fabs(denom) < 1)
+   {
+      if(fabs(denom * tools::max_value<T>()) <= fabs(num))
+         return r;
+   }
+   return num / denom;
+}
+
+template <class T>
+inline T secant_interpolate(const T& a, const T& b, const T& fa, const T& fb)
+{
+   //
+   // Performs standard secant interpolation of [a,b] given
+   // function evaluations f(a) and f(b).  Performs a bisection
+   // if secant interpolation would leave us very close to either
+   // a or b.  Rationale: we only call this function when at least
+   // one other form of interpolation has already failed, so we know
+   // that the function is unlikely to be smooth with a root very
+   // close to a or b.
+   //
+   BOOST_MATH_STD_USING  // For ADL of std math functions
+
+   T tol = tools::epsilon<T>() * 5;
+   T c = a - (fa / (fb - fa)) * (b - a);
+   if((c <= a + fabs(a) * tol) || (c >= b - fabs(b) * tol))
+      return (a + b) / 2;
+   return c;
+}
+
+template <class T>
+T quadratic_interpolate(const T& a, const T& b, T const& d,
+                           const T& fa, const T& fb, T const& fd, 
+                           unsigned count)
+{
+   //
+   // Performs quadratic interpolation to determine the next point,
+   // takes count Newton steps to find the location of the
+   // quadratic polynomial.
+   //
+   // Point d must lie outside of the interval [a,b], it is the third
+   // best approximation to the root, after a and b.
+   //
+   // Note: this does not guarentee to find a root
+   // inside [a, b], so we fall back to a secant step should
+   // the result be out of range.
+   //
+   // Start by obtaining the coefficients of the quadratic polynomial:
+   //
+   T B = safe_div(T(fb - fa), T(b - a), tools::max_value<T>());
+   T A = safe_div(T(fd - fb), T(d - b), tools::max_value<T>());
+   A = safe_div(T(A - B), T(d - a), T(0));
+
+   if(A == 0)
+   {
+      // failure to determine coefficients, try a secant step:
+      return secant_interpolate(a, b, fa, fb);
+   }
+   //
+   // Determine the starting point of the Newton steps:
+   //
+   T c;
+   if(boost::math::sign(A) * boost::math::sign(fa) > 0)
+   {
+      c = a;
+   }
+   else
+   {
+      c = b;
+   }
+   //
+   // Take the Newton steps:
+   //
+   for(unsigned i = 1; i <= count; ++i)
+   {
+      //c -= safe_div(B * c, (B + A * (2 * c - a - b)), 1 + c - a);
+      c -= safe_div(T(fa+(B+A*(c-b))*(c-a)), T(B + A * (2 * c - a - b)), T(1 + c - a));
+   }
+   if((c <= a) || (c >= b))
+   {
+      // Oops, failure, try a secant step:
+      c = secant_interpolate(a, b, fa, fb);
+   }
+   return c;
+}
+
+template <class T>
+T cubic_interpolate(const T& a, const T& b, const T& d, 
+                    const T& e, const T& fa, const T& fb, 
+                    const T& fd, const T& fe)
+{
+   //
+   // Uses inverse cubic interpolation of f(x) at points 
+   // [a,b,d,e] to obtain an approximate root of f(x).
+   // Points d and e lie outside the interval [a,b]
+   // and are the third and forth best approximations
+   // to the root that we have found so far.
+   //
+   // Note: this does not guarentee to find a root
+   // inside [a, b], so we fall back to quadratic
+   // interpolation in case of an erroneous result.
+   //
+   BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b
+      << " d = " << d << " e = " << e << " fa = " << fa << " fb = " << fb 
+      << " fd = " << fd << " fe = " << fe);
+   T q11 = (d - e) * fd / (fe - fd);
+   T q21 = (b - d) * fb / (fd - fb);
+   T q31 = (a - b) * fa / (fb - fa);
+   T d21 = (b - d) * fd / (fd - fb);
+   T d31 = (a - b) * fb / (fb - fa);
+   BOOST_MATH_INSTRUMENT_CODE(
+      "q11 = " << q11 << " q21 = " << q21 << " q31 = " << q31
+      << " d21 = " << d21 << " d31 = " << d31);
+   T q22 = (d21 - q11) * fb / (fe - fb);
+   T q32 = (d31 - q21) * fa / (fd - fa);
+   T d32 = (d31 - q21) * fd / (fd - fa);
+   T q33 = (d32 - q22) * fa / (fe - fa);
+   T c = q31 + q32 + q33 + a;
+   BOOST_MATH_INSTRUMENT_CODE(
+      "q22 = " << q22 << " q32 = " << q32 << " d32 = " << d32
+      << " q33 = " << q33 << " c = " << c);
+
+   if((c <= a) || (c >= b))
+   {
+      // Out of bounds step, fall back to quadratic interpolation:
+      c = quadratic_interpolate(a, b, d, fa, fb, fd, 3);
+   BOOST_MATH_INSTRUMENT_CODE(
+      "Out of bounds interpolation, falling back to quadratic interpolation. c = " << c);
+   }
+
+   return c;
+}
+
+} // namespace detail
+
+template <class F, class T, class Tol, class Policy>
+std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, const T& fax, const T& fbx, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+{
+   //
+   // Main entry point and logic for Toms Algorithm 748
+   // root finder.
+   //
+   BOOST_MATH_STD_USING  // For ADL of std math functions
+
+   static const char* function = "boost::math::tools::toms748_solve<%1%>";
+
+   boost::uintmax_t count = max_iter;
+   T a, b, fa, fb, c, u, fu, a0, b0, d, fd, e, fe;
+   static const T mu = 0.5f;
+
+   // initialise a, b and fa, fb:
+   a = ax;
+   b = bx;
+   if(a >= b)
+      return boost::math::detail::pair_from_single(policies::raise_domain_error(
+         function, 
+         "Parameters a and b out of order: a=%1%", a, pol));
+   fa = fax;
+   fb = fbx;
+
+   if(tol(a, b) || (fa == 0) || (fb == 0))
+   {
+      max_iter = 0;
+      if(fa == 0)
+         b = a;
+      else if(fb == 0)
+         a = b;
+      return std::make_pair(a, b);
+   }
+
+   if(boost::math::sign(fa) * boost::math::sign(fb) > 0)
+      return boost::math::detail::pair_from_single(policies::raise_domain_error(
+         function, 
+         "Parameters a and b do not bracket the root: a=%1%", a, pol));
+   // dummy value for fd, e and fe:
+   fe = e = fd = 1e5F;
+
+   if(fa != 0)
+   {
+      //
+      // On the first step we take a secant step:
+      //
+      c = detail::secant_interpolate(a, b, fa, fb);
+      detail::bracket(f, a, b, c, fa, fb, d, fd);
+      --count;
+      BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+
+      if(count && (fa != 0) && !tol(a, b))
+      {
+         //
+         // On the second step we take a quadratic interpolation:
+         //
+         c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 2);
+         e = d;
+         fe = fd;
+         detail::bracket(f, a, b, c, fa, fb, d, fd);
+         --count;
+         BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+      }
+   }
+
+   while(count && (fa != 0) && !tol(a, b))
+   {
+      // save our brackets:
+      a0 = a;
+      b0 = b;
+      //
+      // Starting with the third step taken
+      // we can use either quadratic or cubic interpolation.
+      // Cubic interpolation requires that all four function values
+      // fa, fb, fd, and fe are distinct, should that not be the case
+      // then variable prof will get set to true, and we'll end up
+      // taking a quadratic step instead.
+      //
+      T min_diff = tools::min_value<T>() * 32;
+      bool prof = (fabs(fa - fb) < min_diff) || (fabs(fa - fd) < min_diff) || (fabs(fa - fe) < min_diff) || (fabs(fb - fd) < min_diff) || (fabs(fb - fe) < min_diff) || (fabs(fd - fe) < min_diff);
+      if(prof)
+      {
+         c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 2);
+         BOOST_MATH_INSTRUMENT_CODE("Can't take cubic step!!!!");
+      }
+      else
+      {
+         c = detail::cubic_interpolate(a, b, d, e, fa, fb, fd, fe);
+      }
+      //
+      // re-bracket, and check for termination:
+      //
+      e = d;
+      fe = fd;
+      detail::bracket(f, a, b, c, fa, fb, d, fd);
+      if((0 == --count) || (fa == 0) || tol(a, b))
+         break;
+      BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+      //
+      // Now another interpolated step:
+      //
+      prof = (fabs(fa - fb) < min_diff) || (fabs(fa - fd) < min_diff) || (fabs(fa - fe) < min_diff) || (fabs(fb - fd) < min_diff) || (fabs(fb - fe) < min_diff) || (fabs(fd - fe) < min_diff);
+      if(prof)
+      {
+         c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 3);
+         BOOST_MATH_INSTRUMENT_CODE("Can't take cubic step!!!!");
+      }
+      else
+      {
+         c = detail::cubic_interpolate(a, b, d, e, fa, fb, fd, fe);
+      }
+      //
+      // Bracket again, and check termination condition, update e:
+      //
+      detail::bracket(f, a, b, c, fa, fb, d, fd);
+      if((0 == --count) || (fa == 0) || tol(a, b))
+         break;
+      BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+      //
+      // Now we take a double-length secant step:
+      //
+      if(fabs(fa) < fabs(fb))
+      {
+         u = a;
+         fu = fa;
+      }
+      else
+      {
+         u = b;
+         fu = fb;
+      }
+      c = u - 2 * (fu / (fb - fa)) * (b - a);
+      if(fabs(c - u) > (b - a) / 2)
+      {
+         c = a + (b - a) / 2;
+      }
+      //
+      // Bracket again, and check termination condition:
+      //
+      e = d;
+      fe = fd;
+      detail::bracket(f, a, b, c, fa, fb, d, fd);
+      BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+      BOOST_MATH_INSTRUMENT_CODE(" tol = " << T((fabs(a) - fabs(b)) / fabs(a)));
+      if((0 == --count) || (fa == 0) || tol(a, b))
+         break;
+      //
+      // And finally... check to see if an additional bisection step is 
+      // to be taken, we do this if we're not converging fast enough:
+      //
+      if((b - a) < mu * (b0 - a0))
+         continue;
+      //
+      // bracket again on a bisection:
+      //
+      e = d;
+      fe = fd;
+      detail::bracket(f, a, b, T(a + (b - a) / 2), fa, fb, d, fd);
+      --count;
+      BOOST_MATH_INSTRUMENT_CODE("Not converging: Taking a bisection!!!!");
+      BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
+   } // while loop
+
+   max_iter -= count;
+   if(fa == 0)
+   {
+      b = a;
+   }
+   else if(fb == 0)
+   {
+      a = b;
+   }
+   BOOST_MATH_LOG_COUNT(max_iter)
+   return std::make_pair(a, b);
+}
+
+template <class F, class T, class Tol>
+inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, const T& fax, const T& fbx, Tol tol, boost::uintmax_t& max_iter)
+{
+   return toms748_solve(f, ax, bx, fax, fbx, tol, max_iter, policies::policy<>());
+}
+
+template <class F, class T, class Tol, class Policy>
+inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+{
+   max_iter -= 2;
+   std::pair<T, T> r = toms748_solve(f, ax, bx, f(ax), f(bx), tol, max_iter, pol);
+   max_iter += 2;
+   return r;
+}
+
+template <class F, class T, class Tol>
+inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, Tol tol, boost::uintmax_t& max_iter)
+{
+   return toms748_solve(f, ax, bx, tol, max_iter, policies::policy<>());
+}
+
+template <class F, class T, class Tol, class Policy>
+std::pair<T, T> bracket_and_solve_root(F f, const T& guess, T factor, bool rising, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "boost::math::tools::bracket_and_solve_root<%1%>";
+   //
+   // Set up inital brackets:
+   //
+   T a = guess;
+   T b = a;
+   T fa = f(a);
+   T fb = fa;
+   //
+   // Set up invocation count:
+   //
+   boost::uintmax_t count = max_iter - 1;
+
+   int step = 32;
+
+   if((fa < 0) == (guess < 0 ? !rising : rising))
+   {
+      //
+      // Zero is to the right of b, so walk upwards
+      // until we find it:
+      //
+      while((boost::math::sign)(fb) == (boost::math::sign)(fa))
+      {
+         if(count == 0)
+            return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", b, pol));
+         //
+         // Heuristic: normally it's best not to increase the step sizes as we'll just end up
+         // with a really wide range to search for the root.  However, if the initial guess was *really*
+         // bad then we need to speed up the search otherwise we'll take forever if we're orders of
+         // magnitude out.  This happens most often if the guess is a small value (say 1) and the result
+         // we're looking for is close to std::numeric_limits<T>::min().
+         //
+         if((max_iter - count) % step == 0)
+         {
+            factor *= 2;
+            if(step > 1) step /= 2;
+         }
+         //
+         // Now go ahead and move our guess by "factor":
+         //
+         a = b;
+         fa = fb;
+         b *= factor;
+         fb = f(b);
+         --count;
+         BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+      }
+   }
+   else
+   {
+      //
+      // Zero is to the left of a, so walk downwards
+      // until we find it:
+      //
+      while((boost::math::sign)(fb) == (boost::math::sign)(fa))
+      {
+         if(fabs(a) < tools::min_value<T>())
+         {
+            // Escape route just in case the answer is zero!
+            max_iter -= count;
+            max_iter += 1;
+            return a > 0 ? std::make_pair(T(0), T(a)) : std::make_pair(T(a), T(0)); 
+         }
+         if(count == 0)
+            return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", a, pol));
+         //
+         // Heuristic: normally it's best not to increase the step sizes as we'll just end up
+         // with a really wide range to search for the root.  However, if the initial guess was *really*
+         // bad then we need to speed up the search otherwise we'll take forever if we're orders of
+         // magnitude out.  This happens most often if the guess is a small value (say 1) and the result
+         // we're looking for is close to std::numeric_limits<T>::min().
+         //
+         if((max_iter - count) % step == 0)
+         {
+            factor *= 2;
+            if(step > 1) step /= 2;
+         }
+         //
+         // Now go ahead and move are guess by "factor":
+         //
+         b = a;
+         fb = fa;
+         a /= factor;
+         fa = f(a);
+         --count;
+         BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
+      }
+   }
+   max_iter -= count;
+   max_iter += 1;
+   std::pair<T, T> r = toms748_solve(
+      f, 
+      (a < 0 ? b : a), 
+      (a < 0 ? a : b), 
+      (a < 0 ? fb : fa), 
+      (a < 0 ? fa : fb), 
+      tol, 
+      count, 
+      pol);
+   max_iter += count;
+   BOOST_MATH_INSTRUMENT_CODE("max_iter = " << max_iter << " count = " << count);
+   BOOST_MATH_LOG_COUNT(max_iter)
+   return r;
+}
+
+template <class F, class T, class Tol>
+inline std::pair<T, T> bracket_and_solve_root(F f, const T& guess, const T& factor, bool rising, Tol tol, boost::uintmax_t& max_iter)
+{
+   return bracket_and_solve_root(f, guess, factor, rising, tol, max_iter, policies::policy<>());
+}
+
+} // namespace tools
+} // namespace math
+} // namespace boost
+
+
+#endif // BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/tools/traits.hpp b/gatb-core/thirdparty/boost/math/tools/traits.hpp
new file mode 100644
index 0000000..c49bf19
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/traits.hpp
@@ -0,0 +1,111 @@
+//  Copyright John Maddock 2007.
+
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+/*
+This header defines two traits classes, both in namespace boost::math::tools.
+
+is_distribution<D>::value is true iff D has overloaded "cdf" and
+"quantile" functions, plus member typedefs value_type and policy_type.  
+It's not much of a definitive test frankly,
+but if it looks like a distribution and quacks like a distribution
+then it must be a distribution.
+
+is_scaled_distribution<D>::value is true iff D is a distribution
+as defined above, and has member functions "scale" and "location".
+
+*/
+
+#ifndef BOOST_STATS_IS_DISTRIBUTION_HPP
+#define BOOST_STATS_IS_DISTRIBUTION_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/mpl/has_xxx.hpp>
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+
+namespace detail{
+
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_value_type, value_type, true)
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_policy_type, policy_type, true)
+
+template<class D>
+char cdf(const D& ...);
+template<class D>
+char quantile(const D& ...);
+
+template <class D>
+struct has_cdf
+{
+   static D d;
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(cdf(d, 0.0f)) != 1);
+};
+
+template <class D>
+struct has_quantile
+{
+   static D d;
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(quantile(d, 0.0f)) != 1);
+};
+
+template <class D>
+struct is_distribution_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = 
+      has_quantile<D>::value 
+      && has_cdf<D>::value
+      && has_value_type<D>::value
+      && has_policy_type<D>::value);
+};
+
+template <class sig, sig val>
+struct result_tag{};
+
+template <class D>
+double test_has_location(const volatile result_tag<typename D::value_type (D::*)()const, &D::location>*);
+template <class D>
+char test_has_location(...);
+
+template <class D>
+double test_has_scale(const volatile result_tag<typename D::value_type (D::*)()const, &D::scale>*);
+template <class D>
+char test_has_scale(...);
+
+template <class D, bool b>
+struct is_scaled_distribution_helper
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <class D>
+struct is_scaled_distribution_helper<D, true>
+{
+   BOOST_STATIC_CONSTANT(bool, value = 
+      (sizeof(test_has_location<D>(0)) != 1) 
+      && 
+      (sizeof(test_has_scale<D>(0)) != 1));
+};
+
+template <class D>
+struct is_scaled_distribution_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = (::boost::math::tools::detail::is_scaled_distribution_helper<D, ::boost::math::tools::detail::is_distribution_imp<D>::value>::value));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_distribution,T,::boost::math::tools::detail::is_distribution_imp<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scaled_distribution,T,::boost::math::tools::detail::is_scaled_distribution_imp<T>::value)
+
+}}}
+
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/tuple.hpp b/gatb-core/thirdparty/boost/math/tools/tuple.hpp
new file mode 100644
index 0000000..0ae778c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/tuple.hpp
@@ -0,0 +1,90 @@
+//  (C) Copyright John Maddock 2010.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TUPLE_HPP_INCLUDED
+#  define BOOST_MATH_TUPLE_HPP_INCLUDED
+#  include <boost/config.hpp>
+
+#ifndef BOOST_NO_CXX11_HDR_TUPLE
+
+#include <tuple>
+
+namespace boost{ namespace math{
+
+using ::std::tuple;
+
+// [6.1.3.2] Tuple creation functions
+using ::std::ignore;
+using ::std::make_tuple;
+using ::std::tie;
+using ::std::get;
+
+// [6.1.3.3] Tuple helper classes
+using ::std::tuple_size;
+using ::std::tuple_element;
+
+}}
+
+#elif (defined(__BORLANDC__) && (__BORLANDC__ <= 0x600)) || defined(__IBMCPP__)
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/tuple/tuple_comparison.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+namespace boost{ namespace math{
+
+using ::boost::tuple;
+
+// [6.1.3.2] Tuple creation functions
+using ::boost::tuples::ignore;
+using ::boost::make_tuple;
+using ::boost::tie;
+
+// [6.1.3.3] Tuple helper classes
+template <class T> 
+struct tuple_size 
+   : public ::boost::integral_constant
+   < ::std::size_t, ::boost::tuples::length<T>::value>
+{};
+
+template < int I, class T>
+struct tuple_element
+{
+   typedef typename boost::tuples::element<I,T>::type type;
+};
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
+// [6.1.3.4] Element access
+using ::boost::get;
+#endif
+
+} } // namespaces
+
+#else
+
+#include <boost/fusion/include/tuple.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+namespace boost{ namespace math{
+
+using ::boost::fusion::tuple;
+
+// [6.1.3.2] Tuple creation functions
+using ::boost::fusion::ignore;
+using ::boost::fusion::make_tuple;
+using ::boost::fusion::tie;
+using ::boost::fusion::get;
+
+// [6.1.3.3] Tuple helper classes
+using ::boost::fusion::tuple_size;
+using ::boost::fusion::tuple_element;
+
+}}
+
+#endif
+
+#endif
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/user.hpp b/gatb-core/thirdparty/boost/math/tools/user.hpp
new file mode 100644
index 0000000..08a7e53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/user.hpp
@@ -0,0 +1,105 @@
+// Copyright John Maddock 2007.
+// Copyright Paul A. Bristow 2007.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_USER_HPP
+#define BOOST_MATH_TOOLS_USER_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+// This file can be modified by the user to change the default policies.
+// See "Changing the Policy Defaults" in documentation.
+
+// define this if the platform has no long double functions,
+// or if the long double versions have only double precision:
+//
+// #define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+//
+// Performance tuning options:
+//
+// #define BOOST_MATH_POLY_METHOD 3
+// #define BOOST_MATH_RATIONAL_METHOD 3
+//
+// The maximum order of polynomial that will be evaluated
+// via an unrolled specialisation:
+//
+// #define BOOST_MATH_MAX_POLY_ORDER 17
+//
+// decide whether to store constants as integers or reals:
+//
+// #define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
+
+//
+// Default policies follow:
+//
+// Domain errors:
+//
+// #define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error
+//
+// Pole errors:
+//
+// #define BOOST_MATH_POLE_ERROR_POLICY throw_on_error
+//
+// Overflow Errors:
+//
+// #define BOOST_MATH_OVERFLOW_ERROR_POLICY throw_on_error
+//
+// Internal Evaluation Errors:
+//
+// #define BOOST_MATH_EVALUATION_ERROR_POLICY throw_on_error
+//
+// Underfow:
+//
+// #define BOOST_MATH_UNDERFLOW_ERROR_POLICY ignore_error
+//
+// Denorms:
+//
+// #define BOOST_MATH_DENORM_ERROR_POLICY ignore_error
+//
+// Max digits to use for internal calculations:
+//
+// #define BOOST_MATH_DIGITS10_POLICY 0
+//
+// Promote floats to doubles internally?
+//
+// #define BOOST_MATH_PROMOTE_FLOAT_POLICY true
+//
+// Promote doubles to long double internally:
+//
+// #define BOOST_MATH_PROMOTE_DOUBLE_POLICY true
+//
+// What do discrete quantiles return?
+//
+// #define BOOST_MATH_DISCRETE_QUANTILE_POLICY integer_round_outwards
+//
+// If a function is mathematically undefined
+// (for example the Cauchy distribution has no mean),
+// then do we stop the code from compiling?
+//
+// #define BOOST_MATH_ASSERT_UNDEFINED_POLICY true
+//
+// Maximum series iterstions permitted:
+//
+// #define BOOST_MATH_MAX_SERIES_ITERATION_POLICY 1000000
+//
+// Maximum root finding steps permitted:
+//
+// define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 200
+//
+// Enable use of __float128 in numeric constants:
+//
+// #define BOOST_MATH_USE_FLOAT128
+//
+// Disable use of __float128 in numeric_constants even if the compiler looks to support it:
+//
+// #define BOOST_MATH_DISABLE_FLOAT128
+
+#endif // BOOST_MATH_TOOLS_USER_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/math/tools/workaround.hpp b/gatb-core/thirdparty/boost/math/tools/workaround.hpp
new file mode 100644
index 0000000..2010681
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tools/workaround.hpp
@@ -0,0 +1,38 @@
+//  Copyright (c) 2006-7 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TOOLS_WORHAROUND_HPP
+#define BOOST_MATH_TOOLS_WORHAROUND_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+
+namespace boost{ namespace math{ namespace tools{
+//
+// We call this short forwarding function so that we can work around a bug
+// on Darwin that causes std::fmod to return a NaN.  The test case is:
+// std::fmod(1185.0L, 1.5L);
+//
+template <class T>
+inline T fmod_workaround(T a, T b)
+{
+   BOOST_MATH_STD_USING
+   return fmod(a, b);
+}
+#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && ((LDBL_MANT_DIG == 106) || (__LDBL_MANT_DIG__ == 106))
+template <>
+inline long double fmod_workaround(long double a, long double b)
+{
+   return ::fmodl(a, b);
+}
+#endif
+
+}}} // namespaces
+
+#endif // BOOST_MATH_TOOLS_WORHAROUND_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/tr1.hpp b/gatb-core/thirdparty/boost/math/tr1.hpp
new file mode 100644
index 0000000..df8ab0e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tr1.hpp
@@ -0,0 +1,1115 @@
+// Copyright John Maddock 2008.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TR1_HPP
+#define BOOST_MATH_TR1_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <math.h> // So we can check which std C lib we're using
+
+#ifdef __cplusplus
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+
+namespace boost{ namespace math{ namespace tr1{ extern "C"{
+
+#else
+
+#define BOOST_PREVENT_MACRO_SUBSTITUTION /**/
+
+#endif // __cplusplus
+
+// we need to import/export our code only if the user has specifically
+// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+// libraries to be dynamically linked, or BOOST_MATH_TR1_DYN_LINK
+// if they want just this one to be dynamically liked:
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_MATH_TR1_DYN_LINK)
+// export if this is our own source, otherwise import:
+#ifdef BOOST_MATH_TR1_SOURCE
+# define BOOST_MATH_TR1_DECL BOOST_SYMBOL_EXPORT
+#else
+# define BOOST_MATH_TR1_DECL BOOST_SYMBOL_IMPORT
+#endif  // BOOST_MATH_TR1_SOURCE
+#else
+#  define BOOST_MATH_TR1_DECL
+#endif  // DYN_LINK
+//
+// Set any throw specifications on the C99 extern "C" functions - these have to be
+// the same as used in the std lib if any.
+//
+#if defined(__GLIBC__) && defined(__THROW)
+#  define BOOST_MATH_C99_THROW_SPEC __THROW
+#else
+#  define BOOST_MATH_C99_THROW_SPEC
+#endif
+
+//
+// Now set up the libraries to link against:
+//
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus)
+#  define BOOST_LIB_NAME boost_math_c99
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus)
+#  define BOOST_LIB_NAME boost_math_c99f
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus) \
+   && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+#  define BOOST_LIB_NAME boost_math_c99l
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus)
+#  define BOOST_LIB_NAME boost_math_tr1
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus)
+#  define BOOST_LIB_NAME boost_math_tr1f
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+#if !defined(BOOST_MATH_TR1_NO_LIB) && !defined(BOOST_MATH_TR1_SOURCE) \
+   && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus) \
+   && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+#  define BOOST_LIB_NAME boost_math_tr1l
+#  if defined(BOOST_MATH_TR1_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+
+#if !(defined(BOOST_INTEL) && defined(__APPLE__)) && !(defined(__FLT_EVAL_METHOD__) && !defined(__cplusplus))
+#ifndef FLT_EVAL_METHOD
+typedef float float_t;
+typedef double double_t;
+#elif FLT_EVAL_METHOD == 0
+typedef float float_t;
+typedef double double_t;
+#elif FLT_EVAL_METHOD == 1
+typedef double float_t;
+typedef double double_t;
+#else
+typedef long double float_t;
+typedef long double double_t;
+#endif
+#endif
+
+// C99 Functions:
+double BOOST_MATH_TR1_DECL boost_acosh BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_acoshf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_acoshl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_asinh BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_asinhf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_asinhl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_atanh BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_atanhf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_atanhl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_cbrtf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_cbrtl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_copysign BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_copysignf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_copysignl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_erf BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_erff BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_erfl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_erfc BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_erfcf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_erfcl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL boost_exp2 BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_exp2f BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_exp2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_expm1f BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_expm1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL boost_fdim BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_fdimf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_fdiml BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+double BOOST_MATH_TR1_DECL boost_fma BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y, double z) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_fmaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y, float z) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_fmal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y, long double z) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_fmax BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_fmaxf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_fmaxl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_fmin BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_fminf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_fminl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_hypot BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_hypotf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_hypotl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+int BOOST_MATH_TR1_DECL boost_ilogb BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+int BOOST_MATH_TR1_DECL boost_ilogbf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+int BOOST_MATH_TR1_DECL boost_ilogbl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_lgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_lgammal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#ifdef BOOST_HAS_LONG_LONG
+#if 0
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llround BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+::boost::long_long_type BOOST_MATH_TR1_DECL boost_llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_log1p BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_log1pl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL log2 BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL log2f BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL log2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL logb BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL logbf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL logbl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+long BOOST_MATH_TR1_DECL lrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+long BOOST_MATH_TR1_DECL lrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long BOOST_MATH_TR1_DECL lrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+long BOOST_MATH_TR1_DECL boost_lround BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+long BOOST_MATH_TR1_DECL boost_lroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long BOOST_MATH_TR1_DECL boost_lroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL nan BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL nanf BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL nanl BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str) BOOST_MATH_C99_THROW_SPEC;
+double BOOST_MATH_TR1_DECL nearbyint BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL nearbyintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL nearbyintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_nextafterf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_nextafterl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_nexttowardf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, long double y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_nexttowardl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL boost_remainder BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_remainderf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_remainderl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+double BOOST_MATH_TR1_DECL boost_remquo BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y, int *pquo) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_remquof BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y, int *pquo) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_remquol BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y, int *pquo) BOOST_MATH_C99_THROW_SPEC;
+double BOOST_MATH_TR1_DECL boost_rint BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_rintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_rintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_round BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_roundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_roundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+double BOOST_MATH_TR1_DECL boost_scalbln BOOST_PREVENT_MACRO_SUBSTITUTION(double x, long ex) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_scalblnf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, long ex) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_scalblnl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long ex) BOOST_MATH_C99_THROW_SPEC;
+double BOOST_MATH_TR1_DECL boost_scalbn BOOST_PREVENT_MACRO_SUBSTITUTION(double x, int ex) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_scalbnf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, int ex) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_scalbnl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, int ex) BOOST_MATH_C99_THROW_SPEC;
+#endif
+double BOOST_MATH_TR1_DECL boost_tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_tgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_tgammal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+double BOOST_MATH_TR1_DECL boost_trunc BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_truncf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_truncl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.1] associated Laguerre polynomials:
+double BOOST_MATH_TR1_DECL boost_assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_assoc_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_assoc_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.2] associated Legendre functions:
+double BOOST_MATH_TR1_DECL boost_assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_assoc_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_assoc_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.3] beta function:
+double BOOST_MATH_TR1_DECL boost_beta BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_betaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_betal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.4] (complete) elliptic integral of the first kind:
+double BOOST_MATH_TR1_DECL boost_comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(double k) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_comp_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(float k) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_comp_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.5] (complete) elliptic integral of the second kind:
+double BOOST_MATH_TR1_DECL boost_comp_ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(double k) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_comp_ellint_2f BOOST_PREVENT_MACRO_SUBSTITUTION(float k) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_comp_ellint_2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.6] (complete) elliptic integral of the third kind:
+double BOOST_MATH_TR1_DECL boost_comp_ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double nu) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_comp_ellint_3f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float nu) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_comp_ellint_3l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double nu) BOOST_MATH_C99_THROW_SPEC;
+#if 0
+// [5.2.1.7] confluent hypergeometric functions:
+double BOOST_MATH_TR1_DECL conf_hyperg BOOST_PREVENT_MACRO_SUBSTITUTION(double a, double c, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL conf_hypergf BOOST_PREVENT_MACRO_SUBSTITUTION(float a, float c, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL conf_hypergl BOOST_PREVENT_MACRO_SUBSTITUTION(long double a, long double c, long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+// [5.2.1.8] regular modified cylindrical Bessel functions:
+double BOOST_MATH_TR1_DECL boost_cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_cyl_bessel_if BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_cyl_bessel_il BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.9] cylindrical Bessel functions (of the first kind):
+double BOOST_MATH_TR1_DECL boost_cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_cyl_bessel_jf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_cyl_bessel_jl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.10] irregular modified cylindrical Bessel functions:
+double BOOST_MATH_TR1_DECL boost_cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_cyl_bessel_kf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_cyl_bessel_kl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.11] cylindrical Neumann functions BOOST_MATH_C99_THROW_SPEC;
+// cylindrical Bessel functions (of the second kind):
+double BOOST_MATH_TR1_DECL boost_cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_cyl_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_cyl_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.12] (incomplete) elliptic integral of the first kind:
+double BOOST_MATH_TR1_DECL boost_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double phi) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.13] (incomplete) elliptic integral of the second kind:
+double BOOST_MATH_TR1_DECL boost_ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double phi) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_ellint_2f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_ellint_2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.14] (incomplete) elliptic integral of the third kind:
+double BOOST_MATH_TR1_DECL boost_ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double nu, double phi) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_ellint_3f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float nu, float phi) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_ellint_3l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double nu, long double phi) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.15] exponential integral:
+double BOOST_MATH_TR1_DECL boost_expint BOOST_PREVENT_MACRO_SUBSTITUTION(double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_expintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_expintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.16] Hermite polynomials:
+double BOOST_MATH_TR1_DECL boost_hermite BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_hermitef BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_hermitel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+#if 0
+// [5.2.1.17] hypergeometric functions:
+double BOOST_MATH_TR1_DECL hyperg BOOST_PREVENT_MACRO_SUBSTITUTION(double a, double b, double c, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL hypergf BOOST_PREVENT_MACRO_SUBSTITUTION(float a, float b, float c, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL hypergl BOOST_PREVENT_MACRO_SUBSTITUTION(long double a, long double b, long double c,
+long double x) BOOST_MATH_C99_THROW_SPEC;
+#endif
+
+// [5.2.1.18] Laguerre polynomials:
+double BOOST_MATH_TR1_DECL boost_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.19] Legendre polynomials:
+double BOOST_MATH_TR1_DECL boost_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.20] Riemann zeta function:
+double BOOST_MATH_TR1_DECL boost_riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(double) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_riemann_zetaf BOOST_PREVENT_MACRO_SUBSTITUTION(float) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_riemann_zetal BOOST_PREVENT_MACRO_SUBSTITUTION(long double) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.21] spherical Bessel functions (of the first kind):
+double BOOST_MATH_TR1_DECL boost_sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_sph_besself BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_sph_bessell BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.22] spherical associated Legendre functions:
+double BOOST_MATH_TR1_DECL boost_sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, double theta) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_sph_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float theta) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_sph_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double theta) BOOST_MATH_C99_THROW_SPEC;
+
+// [5.2.1.23] spherical Neumann functions BOOST_MATH_C99_THROW_SPEC;
+// spherical Bessel functions (of the second kind):
+double BOOST_MATH_TR1_DECL boost_sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x) BOOST_MATH_C99_THROW_SPEC;
+float BOOST_MATH_TR1_DECL boost_sph_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x) BOOST_MATH_C99_THROW_SPEC;
+long double BOOST_MATH_TR1_DECL boost_sph_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x) BOOST_MATH_C99_THROW_SPEC;
+
+#ifdef __cplusplus
+
+}}}}  // namespaces
+
+#include <boost/math/tools/promotion.hpp>
+
+namespace boost{ namespace math{ namespace tr1{
+//
+// Declare overload of the functions which forward to the
+// C interfaces:
+//
+// C99 Functions:
+inline double acosh BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_acosh BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float acoshf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_acoshf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double acoshl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_acoshl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float acosh BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::acoshf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double acosh BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::acoshl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type acosh BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::acosh BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline double asinh BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_asinh BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float asinhf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_asinhf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double asinhl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_asinhl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float asinh BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::asinhf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double asinh BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::asinhl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type asinh BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::asinh BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline double atanh BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_atanh BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float atanhf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_atanhf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double atanhl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_atanhl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float atanh BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::atanhf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double atanh BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::atanhl(x); }
+template <class T>
+inline typename tools::promote_args<T>::type atanh BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::atanh BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline double cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float cbrtf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_cbrtf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double cbrtl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_cbrtl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::cbrtf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::cbrtl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline double copysign BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_copysign BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float copysignf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_copysignf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double copysignl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_copysignl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float copysign BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::copysignf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double copysign BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::copysignl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type copysign BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::copysign BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+inline double erf BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_erf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float erff BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_erff BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double erfl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_erfl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float erf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::erff BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double erf BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::erfl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type erf BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::erf BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline double erfc BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_erfc BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float erfcf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_erfcf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double erfcl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_erfcl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float erfc BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::erfcf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double erfc BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::erfcl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type erfc BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::erfc BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+#if 0
+double exp2 BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+float exp2f BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long double exp2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+
+inline float expm1f BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_expm1f BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double expm1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_expm1l BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::expm1f BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::expm1l BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+#if 0
+double fdim BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y);
+float fdimf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y);
+long double fdiml BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y);
+double fma BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y, double z);
+float fmaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y, float z);
+long double fmal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y, long double z);
+#endif
+inline double fmax BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_fmax BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float fmaxf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_fmaxf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double fmaxl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_fmaxl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float fmax BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::fmaxf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double fmax BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::fmaxl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type fmax BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::fmax BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+inline double fmin BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_fmin BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float fminf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_fminf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double fminl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_fminl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float fmin BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::fminf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double fmin BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::fminl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type fmin BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::fmin BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+inline float hypotf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_hypotf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline double hypot BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_hypot BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double hypotl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_hypotl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float hypot BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::hypotf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double hypot BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::hypotl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type hypot BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::hypot BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+#if 0
+int ilogb BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+int ilogbf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+int ilogbl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+
+inline float lgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_lgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double lgammal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_lgammal BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::lgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::lgammal BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+#ifdef BOOST_HAS_LONG_LONG
+#if 0
+::boost::long_long_type llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+::boost::long_long_type llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+::boost::long_long_type llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+
+inline ::boost::long_long_type llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_llround BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline ::boost::long_long_type llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return llround BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<double>(x)); }
+#endif
+
+inline float log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double log1p BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_log1p BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double log1pl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_log1pl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float log1p BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double log1p BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::log1pl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type log1p BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::log1p BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+#if 0
+double log2 BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+float log2f BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long double log2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+
+double logb BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+float logbf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long double logbl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+long lrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+long lrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long lrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+inline long lroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_lroundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long lround BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_lround BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long lroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_lroundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long lround BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::lroundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long lround BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::lroundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+long lround BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::lround BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<double>(x)); }
+#if 0
+double nan BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str);
+float nanf BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str);
+long double nanl BOOST_PREVENT_MACRO_SUBSTITUTION(const char *str);
+double nearbyint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+float nearbyintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long double nearbyintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+inline float nextafterf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_nextafterf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline double nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double nextafterl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_nextafterl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::nextafterf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::nextafterl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+inline float nexttowardf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_nexttowardf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline double nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double nexttowardl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_nexttowardl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::nexttowardf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::nexttowardl BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(T1 x, T2 y)
+{ return boost::math::tr1::nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<long double>(y)); }
+#if 0
+double remainder BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y);
+float remainderf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y);
+long double remainderl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y);
+double remquo BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y, int *pquo);
+float remquof BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y, int *pquo);
+long double remquol BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y, int *pquo);
+double rint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+float rintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+long double rintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+inline float roundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_roundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double round BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_round BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double roundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_roundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float round BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::roundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double round BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::roundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type round BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::round BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+#if 0
+double scalbln BOOST_PREVENT_MACRO_SUBSTITUTION(double x, long ex);
+float scalblnf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, long ex);
+long double scalblnl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long ex);
+double scalbn BOOST_PREVENT_MACRO_SUBSTITUTION(double x, int ex);
+float scalbnf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, int ex);
+long double scalbnl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, int ex);
+#endif
+inline float tgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_tgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double tgammal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_tgammal BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::tgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::tgammal BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+inline float truncf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_truncf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double trunc BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_trunc BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double truncl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_truncl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float trunc BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::truncf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double trunc BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::truncl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type trunc BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::trunc BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+# define NO_MACRO_EXPAND /**/
+// C99 macros defined as C++ templates
+template<class T> bool signbit NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> bool BOOST_MATH_TR1_DECL signbit<float> NO_MACRO_EXPAND(float x);
+template<> bool BOOST_MATH_TR1_DECL signbit<double> NO_MACRO_EXPAND(double x);
+template<> bool BOOST_MATH_TR1_DECL signbit<long double> NO_MACRO_EXPAND(long double x);
+
+template<class T> int fpclassify NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> int BOOST_MATH_TR1_DECL fpclassify<float> NO_MACRO_EXPAND(float x);
+template<> int BOOST_MATH_TR1_DECL fpclassify<double> NO_MACRO_EXPAND(double x);
+template<> int BOOST_MATH_TR1_DECL fpclassify<long double> NO_MACRO_EXPAND(long double x);
+
+template<class T> bool isfinite NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> bool BOOST_MATH_TR1_DECL isfinite<float> NO_MACRO_EXPAND(float x);
+template<> bool BOOST_MATH_TR1_DECL isfinite<double> NO_MACRO_EXPAND(double x);
+template<> bool BOOST_MATH_TR1_DECL isfinite<long double> NO_MACRO_EXPAND(long double x);
+
+template<class T> bool isinf NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> bool BOOST_MATH_TR1_DECL isinf<float> NO_MACRO_EXPAND(float x);
+template<> bool BOOST_MATH_TR1_DECL isinf<double> NO_MACRO_EXPAND(double x);
+template<> bool BOOST_MATH_TR1_DECL isinf<long double> NO_MACRO_EXPAND(long double x);
+
+template<class T> bool isnan NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> bool BOOST_MATH_TR1_DECL isnan<float> NO_MACRO_EXPAND(float x);
+template<> bool BOOST_MATH_TR1_DECL isnan<double> NO_MACRO_EXPAND(double x);
+template<> bool BOOST_MATH_TR1_DECL isnan<long double> NO_MACRO_EXPAND(long double x);
+
+template<class T> bool isnormal NO_MACRO_EXPAND(T x)
+{ BOOST_STATIC_ASSERT(sizeof(T) == 0); return false; } // must not be instantiated
+template<> bool BOOST_MATH_TR1_DECL isnormal<float> NO_MACRO_EXPAND(float x);
+template<> bool BOOST_MATH_TR1_DECL isnormal<double> NO_MACRO_EXPAND(double x);
+template<> bool BOOST_MATH_TR1_DECL isnormal<long double> NO_MACRO_EXPAND(long double x);
+
+#undef NO_MACRO_EXPAND   
+   
+// [5.2.1.1] associated Laguerre polynomials:
+inline float assoc_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, float x)
+{ return boost::math::tr1::boost_assoc_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, x); }
+inline double assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, double x)
+{ return boost::math::tr1::boost_assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, x); }
+inline long double assoc_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, long double x)
+{ return boost::math::tr1::boost_assoc_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, x); }
+inline float assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, float x)
+{ return boost::math::tr1::assoc_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, x); }
+inline long double assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, long double x)
+{ return boost::math::tr1::assoc_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, x); }
+template <class T> 
+inline typename tools::promote_args<T>::type assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, unsigned m, T x)
+{ return boost::math::tr1::assoc_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(n, m, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.2] associated Legendre functions:
+inline float assoc_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float x)
+{ return boost::math::tr1::boost_assoc_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, x); }
+inline double assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, double x)
+{ return boost::math::tr1::boost_assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, x); }
+inline long double assoc_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double x)
+{ return boost::math::tr1::boost_assoc_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, x); }
+inline float assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float x)
+{ return boost::math::tr1::assoc_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, x); }
+inline long double assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double x)
+{ return boost::math::tr1::assoc_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, x); }
+template <class T>
+inline typename tools::promote_args<T>::type assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, T x)
+{ return boost::math::tr1::assoc_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.3] beta function:
+inline float betaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::boost_betaf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline double beta BOOST_PREVENT_MACRO_SUBSTITUTION(double x, double y)
+{ return boost::math::tr1::boost_beta BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double betal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::boost_betal BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline float beta BOOST_PREVENT_MACRO_SUBSTITUTION(float x, float y)
+{ return boost::math::tr1::betaf BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+inline long double beta BOOST_PREVENT_MACRO_SUBSTITUTION(long double x, long double y)
+{ return boost::math::tr1::betal BOOST_PREVENT_MACRO_SUBSTITUTION(x, y); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type beta BOOST_PREVENT_MACRO_SUBSTITUTION(T2 x, T1 y)
+{ return boost::math::tr1::beta BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(x), static_cast<typename tools::promote_args<T1, T2>::type>(y)); }
+
+// [5.2.1.4] (complete) elliptic integral of the first kind:
+inline float comp_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(float k)
+{ return boost::math::tr1::boost_comp_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(k); }
+inline double comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(double k)
+{ return boost::math::tr1::boost_comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(k); }
+inline long double comp_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k)
+{ return boost::math::tr1::boost_comp_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(k); }
+inline float comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(float k)
+{ return boost::math::tr1::comp_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(k); }
+inline long double comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(long double k)
+{ return boost::math::tr1::comp_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(k); }
+template <class T>
+inline typename tools::promote_args<T>::type comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(T k)
+{ return boost::math::tr1::comp_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(k)); }
+
+// [5.2.1.5]  (complete) elliptic integral of the second kind:
+inline float comp_ellint_2f(float k)
+{ return boost::math::tr1::boost_comp_ellint_2f(k); }
+inline double comp_ellint_2(double k)
+{ return boost::math::tr1::boost_comp_ellint_2(k); }
+inline long double comp_ellint_2l(long double k)
+{ return boost::math::tr1::boost_comp_ellint_2l(k); }
+inline float comp_ellint_2(float k)
+{ return boost::math::tr1::comp_ellint_2f(k); }
+inline long double comp_ellint_2(long double k)
+{ return boost::math::tr1::comp_ellint_2l(k); }
+template <class T>
+inline typename tools::promote_args<T>::type comp_ellint_2(T k)
+{ return boost::math::tr1::comp_ellint_2(static_cast<typename tools::promote_args<T>::type> BOOST_PREVENT_MACRO_SUBSTITUTION(k)); }
+
+// [5.2.1.6]  (complete) elliptic integral of the third kind:
+inline float comp_ellint_3f(float k, float nu)
+{ return boost::math::tr1::boost_comp_ellint_3f(k, nu); }
+inline double comp_ellint_3(double k, double nu)
+{ return boost::math::tr1::boost_comp_ellint_3(k, nu); }
+inline long double comp_ellint_3l(long double k, long double nu)
+{ return boost::math::tr1::boost_comp_ellint_3l(k, nu); }
+inline float comp_ellint_3(float k, float nu)
+{ return boost::math::tr1::comp_ellint_3f(k, nu); }
+inline long double comp_ellint_3(long double k, long double nu)
+{ return boost::math::tr1::comp_ellint_3l(k, nu); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type comp_ellint_3(T1 k, T2 nu)
+{ return boost::math::tr1::comp_ellint_3(static_cast<typename tools::promote_args<T1, T2>::type> BOOST_PREVENT_MACRO_SUBSTITUTION(k), static_cast<typename tools::promote_args<T1, T2>::type> BOOST_PREVENT_MACRO_SUBSTITUTION(nu)); }
+
+#if 0
+// [5.2.1.7] confluent hypergeometric functions:
+double conf_hyperg BOOST_PREVENT_MACRO_SUBSTITUTION(double a, double c, double x);
+float conf_hypergf BOOST_PREVENT_MACRO_SUBSTITUTION(float a, float c, float x);
+long double conf_hypergl BOOST_PREVENT_MACRO_SUBSTITUTION(long double a, long double c, long double x);
+#endif
+
+// [5.2.1.8] regular modified cylindrical Bessel functions:
+inline float cyl_bessel_if BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::boost_cyl_bessel_if BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline double cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x)
+{ return boost::math::tr1::boost_cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_il BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::boost_cyl_bessel_il BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline float cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::cyl_bessel_if BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::cyl_bessel_il BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(T1 nu, T2 x)
+{ return boost::math::tr1::cyl_bessel_i BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(nu), static_cast<typename tools::promote_args<T1, T2>::type>(x)); }
+
+// [5.2.1.9] cylindrical Bessel functions (of the first kind):
+inline float cyl_bessel_jf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::boost_cyl_bessel_jf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline double cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x)
+{ return boost::math::tr1::boost_cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_jl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::boost_cyl_bessel_jl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline float cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::cyl_bessel_jf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::cyl_bessel_jl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(T1 nu, T2 x)
+{ return boost::math::tr1::cyl_bessel_j BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(nu), static_cast<typename tools::promote_args<T1, T2>::type>(x)); }
+
+// [5.2.1.10] irregular modified cylindrical Bessel functions:
+inline float cyl_bessel_kf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::boost_cyl_bessel_kf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline double cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x)
+{ return boost::math::tr1::boost_cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_kl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::boost_cyl_bessel_kl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline float cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::cyl_bessel_kf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::cyl_bessel_kl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(T1 nu, T2 x)
+{ return boost::math::tr1::cyl_bessel_k BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type> BOOST_PREVENT_MACRO_SUBSTITUTION(nu), static_cast<typename tools::promote_args<T1, T2>::type>(x)); }
+
+// [5.2.1.11] cylindrical Neumann functions;
+// cylindrical Bessel functions (of the second kind):
+inline float cyl_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::boost_cyl_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline double cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(double nu, double x)
+{ return boost::math::tr1::boost_cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::boost_cyl_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline float cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(float nu, float x)
+{ return boost::math::tr1::cyl_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+inline long double cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(long double nu, long double x)
+{ return boost::math::tr1::cyl_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(nu, x); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(T1 nu, T2 x)
+{ return boost::math::tr1::cyl_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(nu), static_cast<typename tools::promote_args<T1, T2>::type>(x)); }
+
+// [5.2.1.12] (incomplete) elliptic integral of the first kind:
+inline float ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi)
+{ return boost::math::tr1::boost_ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline double ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double phi)
+{ return boost::math::tr1::boost_ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline long double ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi)
+{ return boost::math::tr1::boost_ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline float ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi)
+{ return boost::math::tr1::ellint_1f BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline long double ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi)
+{ return boost::math::tr1::ellint_1l BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(T1 k, T2 phi)
+{ return boost::math::tr1::ellint_1 BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(k), static_cast<typename tools::promote_args<T1, T2>::type>(phi)); }
+
+// [5.2.1.13] (incomplete) elliptic integral of the second kind:
+inline float ellint_2f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi)
+{ return boost::math::tr1::boost_ellint_2f BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline double ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double phi)
+{ return boost::math::tr1::boost_ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline long double ellint_2l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi)
+{ return boost::math::tr1::boost_ellint_2l BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline float ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float phi)
+{ return boost::math::tr1::ellint_2f BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+inline long double ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double phi)
+{ return boost::math::tr1::ellint_2l BOOST_PREVENT_MACRO_SUBSTITUTION(k, phi); }
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(T1 k, T2 phi)
+{ return boost::math::tr1::ellint_2 BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2>::type>(k), static_cast<typename tools::promote_args<T1, T2>::type>(phi)); }
+
+// [5.2.1.14] (incomplete) elliptic integral of the third kind:
+inline float ellint_3f BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float nu, float phi)
+{ return boost::math::tr1::boost_ellint_3f BOOST_PREVENT_MACRO_SUBSTITUTION(k, nu, phi); }
+inline double ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(double k, double nu, double phi)
+{ return boost::math::tr1::boost_ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(k, nu, phi); }
+inline long double ellint_3l BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double nu, long double phi)
+{ return boost::math::tr1::boost_ellint_3l BOOST_PREVENT_MACRO_SUBSTITUTION(k, nu, phi); }
+inline float ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(float k, float nu, float phi)
+{ return boost::math::tr1::ellint_3f BOOST_PREVENT_MACRO_SUBSTITUTION(k, nu, phi); }
+inline long double ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(long double k, long double nu, long double phi)
+{ return boost::math::tr1::ellint_3l BOOST_PREVENT_MACRO_SUBSTITUTION(k, nu, phi); }
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(T1 k, T2 nu, T3 phi)
+{ return boost::math::tr1::ellint_3 BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T1, T2, T3>::type>(k), static_cast<typename tools::promote_args<T1, T2, T3>::type>(nu), static_cast<typename tools::promote_args<T1, T2, T3>::type>(phi)); }
+
+// [5.2.1.15] exponential integral:
+inline float expintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::boost_expintf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline double expint BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
+{ return boost::math::tr1::boost_expint BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double expintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::boost_expintl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline float expint BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+{ return boost::math::tr1::expintf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+inline long double expint BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+{ return boost::math::tr1::expintl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
+template <class T>
+inline typename tools::promote_args<T>::type expint BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+{ return boost::math::tr1::expint BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.16] Hermite polynomials:
+inline float hermitef BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::boost_hermitef BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline double hermite BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x)
+{ return boost::math::tr1::boost_hermite BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double hermitel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::boost_hermitel BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline float hermite BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::hermitef BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double hermite BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::hermitel BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+template <class T>
+inline typename tools::promote_args<T>::type hermite BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, T x)
+{ return boost::math::tr1::hermite BOOST_PREVENT_MACRO_SUBSTITUTION(n, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+#if 0
+// [5.2.1.17] hypergeometric functions:
+double hyperg BOOST_PREVENT_MACRO_SUBSTITUTION(double a, double b, double c, double x);
+float hypergf BOOST_PREVENT_MACRO_SUBSTITUTION(float a, float b, float c, float x);
+long double hypergl BOOST_PREVENT_MACRO_SUBSTITUTION(long double a, long double b, long double c,
+long double x);
+#endif
+
+// [5.2.1.18] Laguerre polynomials:
+inline float laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::boost_laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline double laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x)
+{ return boost::math::tr1::boost_laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::boost_laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline float laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::laguerref BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::laguerrel BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+template <class T>
+inline typename tools::promote_args<T>::type laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, T x)
+{ return boost::math::tr1::laguerre BOOST_PREVENT_MACRO_SUBSTITUTION(n, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.19] Legendre polynomials:
+inline float legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, float x)
+{ return boost::math::tr1::boost_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, x); }
+inline double legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, double x)
+{ return boost::math::tr1::boost_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, x); }
+inline long double legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, long double x)
+{ return boost::math::tr1::boost_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, x); }
+inline float legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, float x)
+{ return boost::math::tr1::legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, x); }
+inline long double legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, long double x)
+{ return boost::math::tr1::legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, x); }
+template <class T>
+inline typename tools::promote_args<T>::type legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, T x)
+{ return boost::math::tr1::legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.20] Riemann zeta function:
+inline float riemann_zetaf BOOST_PREVENT_MACRO_SUBSTITUTION(float z)
+{ return boost::math::tr1::boost_riemann_zetaf BOOST_PREVENT_MACRO_SUBSTITUTION(z); }
+inline double riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(double z)
+{ return boost::math::tr1::boost_riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(z); }
+inline long double riemann_zetal BOOST_PREVENT_MACRO_SUBSTITUTION(long double z)
+{ return boost::math::tr1::boost_riemann_zetal BOOST_PREVENT_MACRO_SUBSTITUTION(z); }
+inline float riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(float z)
+{ return boost::math::tr1::riemann_zetaf BOOST_PREVENT_MACRO_SUBSTITUTION(z); }
+inline long double riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(long double z)
+{ return boost::math::tr1::riemann_zetal BOOST_PREVENT_MACRO_SUBSTITUTION(z); }
+template <class T>
+inline typename tools::promote_args<T>::type riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(T z)
+{ return boost::math::tr1::riemann_zeta BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(z)); }
+
+// [5.2.1.21] spherical Bessel functions (of the first kind):
+inline float sph_besself BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::boost_sph_besself BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline double sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x)
+{ return boost::math::tr1::boost_sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double sph_bessell BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::boost_sph_bessell BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline float sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::sph_besself BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::sph_bessell BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+template <class T>
+inline typename tools::promote_args<T>::type sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, T x)
+{ return boost::math::tr1::sph_bessel BOOST_PREVENT_MACRO_SUBSTITUTION(n, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+// [5.2.1.22] spherical associated Legendre functions:
+inline float sph_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float theta)
+{ return boost::math::tr1::boost_sph_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, theta); }
+inline double sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, double theta)
+{ return boost::math::tr1::boost_sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, theta); }
+inline long double sph_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double theta)
+{ return boost::math::tr1::boost_sph_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, theta); }
+inline float sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, float theta)
+{ return boost::math::tr1::sph_legendref BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, theta); }
+inline long double sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, long double theta)
+{ return boost::math::tr1::sph_legendrel BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, theta); }
+template <class T>
+inline typename tools::promote_args<T>::type sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned l, unsigned m, T theta)
+{ return boost::math::tr1::sph_legendre BOOST_PREVENT_MACRO_SUBSTITUTION(l, m, static_cast<typename tools::promote_args<T>::type>(theta)); }
+
+// [5.2.1.23] spherical Neumann functions;
+// spherical Bessel functions (of the second kind):
+inline float sph_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::boost_sph_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline double sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, double x)
+{ return boost::math::tr1::boost_sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double sph_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::boost_sph_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline float sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, float x)
+{ return boost::math::tr1::sph_neumannf BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+inline long double sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, long double x)
+{ return boost::math::tr1::sph_neumannl BOOST_PREVENT_MACRO_SUBSTITUTION(n, x); }
+template <class T>
+inline typename tools::promote_args<T>::type sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(unsigned n, T x)
+{ return boost::math::tr1::sph_neumann BOOST_PREVENT_MACRO_SUBSTITUTION(n, static_cast<typename tools::promote_args<T>::type>(x)); }
+
+}}} // namespaces
+
+#else // __cplusplus
+
+#include <boost/math/tr1_c_macros.ipp>
+
+#endif // __cplusplus
+
+#endif // BOOST_MATH_TR1_HPP
+
diff --git a/gatb-core/thirdparty/boost/math/tr1_c_macros.ipp b/gatb-core/thirdparty/boost/math/tr1_c_macros.ipp
new file mode 100644
index 0000000..ec8e7da
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math/tr1_c_macros.ipp
@@ -0,0 +1,810 @@
+// Copyright John Maddock 2008-11.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_C_MACROS_IPP
+#define BOOST_MATH_C_MACROS_IPP
+
+// C99 Functions:
+#ifdef acosh
+#undef acosh
+#endif
+#define acosh boost_acosh
+#ifdef acoshf
+#undef acoshf
+#endif
+#define acoshf boost_acoshf
+#ifdef acoshl
+#undef acoshl
+#endif
+#define acoshl boost_acoshl
+
+#ifdef asinh
+#undef asinh
+#endif
+#define asinh boost_asinh
+#ifdef asinhf
+#undef asinhf
+#endif
+#define asinhf boost_asinhf
+#ifdef asinhl
+#undef asinhl
+#endif
+#define asinhl boost_asinhl
+
+#ifdef atanh
+#undef atanh
+#endif
+#define atanh boost_atanh
+#ifdef atanhf
+#undef atanhf
+#endif
+#define atanhf boost_atanhf
+#ifdef atanhl
+#undef atanhl
+#endif
+#define atanhl boost_atanhl
+
+#ifdef cbrt
+#undef cbrt
+#endif
+#define cbrt boost_cbrt
+#ifdef cbrtf
+#undef cbrtf
+#endif
+#define cbrtf boost_cbrtf
+#ifdef cbrtl
+#undef cbrtl
+#endif
+#define cbrtl boost_cbrtl
+
+#ifdef copysign
+#undef copysign
+#endif
+#define copysign boost_copysign
+#ifdef copysignf
+#undef copysignf
+#endif
+#define copysignf boost_copysignf
+#ifdef copysignl
+#undef copysignl
+#endif
+#define copysignl boost_copysignl
+
+#ifdef erf
+#undef erf
+#endif
+#define erf boost_erf
+#ifdef erff
+#undef erff
+#endif
+#define erff boost_erff
+#ifdef erfl
+#undef erfl
+#endif
+#define erfl boost_erfl
+
+#ifdef erfc
+#undef erfc
+#endif
+#define erfc boost_erfc
+#ifdef erfcf
+#undef erfcf
+#endif
+#define erfcf boost_erfcf
+#ifdef erfcl
+#undef erfcl
+#endif
+#define erfcl boost_erfcl
+
+#if 0
+#ifdef exp2
+#undef exp2
+#endif
+#define exp2 boost_exp2
+#ifdef exp2f
+#undef exp2f
+#endif
+#define exp2f boost_exp2f
+#ifdef exp2l
+#undef exp2l
+#endif
+#define exp2l boost_exp2l
+#endif
+
+#ifdef expm1
+#undef expm1
+#endif
+#define expm1 boost_expm1
+#ifdef expm1f
+#undef expm1f
+#endif
+#define expm1f boost_expm1f
+#ifdef expm1l
+#undef expm1l
+#endif
+#define expm1l boost_expm1l
+
+#if 0
+#ifdef fdim
+#undef fdim
+#endif
+#define fdim boost_fdim
+#ifdef fdimf
+#undef fdimf
+#endif
+#define fdimf boost_fdimf
+#ifdef fdiml
+#undef fdiml
+#endif
+#define fdiml boost_fdiml
+#ifdef acosh
+#undef acosh
+#endif
+#define fma boost_fma
+#ifdef fmaf
+#undef fmaf
+#endif
+#define fmaf boost_fmaf
+#ifdef fmal
+#undef fmal
+#endif
+#define fmal boost_fmal
+#endif
+
+#ifdef fmax
+#undef fmax
+#endif
+#define fmax boost_fmax
+#ifdef fmaxf
+#undef fmaxf
+#endif
+#define fmaxf boost_fmaxf
+#ifdef fmaxl
+#undef fmaxl
+#endif
+#define fmaxl boost_fmaxl
+
+#ifdef fmin
+#undef fmin
+#endif
+#define fmin boost_fmin
+#ifdef fminf
+#undef fminf
+#endif
+#define fminf boost_fminf
+#ifdef fminl
+#undef fminl
+#endif
+#define fminl boost_fminl
+
+#ifdef hypot
+#undef hypot
+#endif
+#define hypot boost_hypot
+#ifdef hypotf
+#undef hypotf
+#endif
+#define hypotf boost_hypotf
+#ifdef hypotl
+#undef hypotl
+#endif
+#define hypotl boost_hypotl
+
+#if 0
+#ifdef ilogb
+#undef ilogb
+#endif
+#define ilogb boost_ilogb
+#ifdef ilogbf
+#undef ilogbf
+#endif
+#define ilogbf boost_ilogbf
+#ifdef ilogbl
+#undef ilogbl
+#endif
+#define ilogbl boost_ilogbl
+#endif
+
+#ifdef lgamma
+#undef lgamma
+#endif
+#define lgamma boost_lgamma
+#ifdef lgammaf
+#undef lgammaf
+#endif
+#define lgammaf boost_lgammaf
+#ifdef lgammal
+#undef lgammal
+#endif
+#define lgammal boost_lgammal
+
+#ifdef BOOST_HAS_LONG_LONG
+#if 0
+#ifdef llrint
+#undef llrint
+#endif
+#define llrint boost_llrint
+#ifdef llrintf
+#undef llrintf
+#endif
+#define llrintf boost_llrintf
+#ifdef llrintl
+#undef llrintl
+#endif
+#define llrintl boost_llrintl
+#endif
+#ifdef llround
+#undef llround
+#endif
+#define llround boost_llround
+#ifdef llroundf
+#undef llroundf
+#endif
+#define llroundf boost_llroundf
+#ifdef llroundl
+#undef llroundl
+#endif
+#define llroundl boost_llroundl
+#endif
+
+#ifdef log1p
+#undef log1p
+#endif
+#define log1p boost_log1p
+#ifdef log1pf
+#undef log1pf
+#endif
+#define log1pf boost_log1pf
+#ifdef log1pl
+#undef log1pl
+#endif
+#define log1pl boost_log1pl
+
+#if 0
+#ifdef log2
+#undef log2
+#endif
+#define log2 boost_log2
+#ifdef log2f
+#undef log2f
+#endif
+#define log2f boost_log2f
+#ifdef log2l
+#undef log2l
+#endif
+#define log2l boost_log2l
+
+#ifdef logb
+#undef logb
+#endif
+#define logb boost_logb
+#ifdef logbf
+#undef logbf
+#endif
+#define logbf boost_logbf
+#ifdef logbl
+#undef logbl
+#endif
+#define logbl boost_logbl
+
+#ifdef lrint
+#undef lrint
+#endif
+#define lrint boost_lrint
+#ifdef lrintf
+#undef lrintf
+#endif
+#define lrintf boost_lrintf
+#ifdef lrintl
+#undef lrintl
+#endif
+#define lrintl boost_lrintl
+#endif
+
+#ifdef lround
+#undef lround
+#endif
+#define lround boost_lround
+#ifdef lroundf
+#undef lroundf
+#endif
+#define lroundf boost_lroundf
+#ifdef lroundl
+#undef lroundl
+#endif
+#define lroundl boost_lroundl
+
+#if 0
+#ifdef nan
+#undef nan
+#endif
+#define nan boost_nan
+#ifdef nanf
+#undef nanf
+#endif
+#define nanf boost_nanf
+#ifdef nanl
+#undef nanl
+#endif
+#define nanl boost_nanl
+
+#ifdef nearbyint
+#undef nearbyint
+#endif
+#define nearbyint boost_nearbyint
+#ifdef nearbyintf
+#undef nearbyintf
+#endif
+#define nearbyintf boost_nearbyintf
+#ifdef nearbyintl
+#undef nearbyintl
+#endif
+#define nearbyintl boost_nearbyintl
+#endif
+
+#ifdef nextafter
+#undef nextafter
+#endif
+#define nextafter boost_nextafter
+#ifdef nextafterf
+#undef nextafterf
+#endif
+#define nextafterf boost_nextafterf
+#ifdef nextafterl
+#undef nextafterl
+#endif
+#define nextafterl boost_nextafterl
+
+#ifdef nexttoward
+#undef nexttoward
+#endif
+#define nexttoward boost_nexttoward
+#ifdef nexttowardf
+#undef nexttowardf
+#endif
+#define nexttowardf boost_nexttowardf
+#ifdef nexttowardl
+#undef nexttowardl
+#endif
+#define nexttowardl boost_nexttowardl
+
+#if 0
+#ifdef remainder
+#undef remainder
+#endif
+#define remainder boost_remainder
+#ifdef remainderf
+#undef remainderf
+#endif
+#define remainderf boost_remainderf
+#ifdef remainderl
+#undef remainderl
+#endif
+#define remainderl boost_remainderl
+
+#ifdef remquo
+#undef remquo
+#endif
+#define remquo boost_remquo
+#ifdef remquof
+#undef remquof
+#endif
+#define remquof boost_remquof
+#ifdef remquol
+#undef remquol
+#endif
+#define remquol boost_remquol
+
+#ifdef rint
+#undef rint
+#endif
+#define rint boost_rint
+#ifdef rintf
+#undef rintf
+#endif
+#define rintf boost_rintf
+#ifdef rintl
+#undef rintl
+#endif
+#define rintl boost_rintl
+#endif
+
+#ifdef round
+#undef round
+#endif
+#define round boost_round
+#ifdef roundf
+#undef roundf
+#endif
+#define roundf boost_roundf
+#ifdef roundl
+#undef roundl
+#endif
+#define roundl boost_roundl
+
+#if 0
+#ifdef scalbln
+#undef scalbln
+#endif
+#define scalbln boost_scalbln
+#ifdef scalblnf
+#undef scalblnf
+#endif
+#define scalblnf boost_scalblnf
+#ifdef scalblnl
+#undef scalblnl
+#endif
+#define scalblnl boost_scalblnl
+
+#ifdef scalbn
+#undef scalbn
+#endif
+#define scalbn boost_scalbn
+#ifdef scalbnf
+#undef scalbnf
+#endif
+#define scalbnf boost_scalbnf
+#ifdef scalbnl
+#undef scalbnl
+#endif
+#define scalbnl boost_scalbnl
+#endif
+
+#ifdef tgamma
+#undef tgamma
+#endif
+#define tgamma boost_tgamma
+#ifdef tgammaf
+#undef tgammaf
+#endif
+#define tgammaf boost_tgammaf
+#ifdef tgammal
+#undef tgammal
+#endif
+#define tgammal boost_tgammal
+
+#ifdef trunc
+#undef trunc
+#endif
+#define trunc boost_trunc
+#ifdef truncf
+#undef truncf
+#endif
+#define truncf boost_truncf
+#ifdef truncl
+#undef truncl
+#endif
+#define truncl boost_truncl
+
+// [5.2.1.1] associated Laguerre polynomials:
+#ifdef assoc_laguerre
+#undef assoc_laguerre
+#endif
+#define assoc_laguerre boost_assoc_laguerre
+#ifdef assoc_laguerref
+#undef assoc_laguerref
+#endif
+#define assoc_laguerref boost_assoc_laguerref
+#ifdef assoc_laguerrel
+#undef assoc_laguerrel
+#endif
+#define assoc_laguerrel boost_assoc_laguerrel
+
+// [5.2.1.2] associated Legendre functions:
+#ifdef assoc_legendre
+#undef assoc_legendre
+#endif
+#define assoc_legendre boost_assoc_legendre
+#ifdef assoc_legendref
+#undef assoc_legendref
+#endif
+#define assoc_legendref boost_assoc_legendref
+#ifdef assoc_legendrel
+#undef assoc_legendrel
+#endif
+#define assoc_legendrel boost_assoc_legendrel
+
+// [5.2.1.3] beta function:
+#ifdef beta
+#undef beta
+#endif
+#define beta boost_beta
+#ifdef betaf
+#undef betaf
+#endif
+#define betaf boost_betaf
+#ifdef betal
+#undef betal
+#endif
+#define betal boost_betal
+
+// [5.2.1.4] (complete) elliptic integral of the first kind:
+#ifdef comp_ellint_1
+#undef comp_ellint_1
+#endif
+#define comp_ellint_1 boost_comp_ellint_1
+#ifdef comp_ellint_1f
+#undef comp_ellint_1f
+#endif
+#define comp_ellint_1f boost_comp_ellint_1f
+#ifdef comp_ellint_1l
+#undef comp_ellint_1l
+#endif
+#define comp_ellint_1l boost_comp_ellint_1l
+
+// [5.2.1.5] (complete) elliptic integral of the second kind:
+#ifdef comp_ellint_2
+#undef comp_ellint_2
+#endif
+#define comp_ellint_2 boost_comp_ellint_2
+#ifdef comp_ellint_2f
+#undef comp_ellint_2f
+#endif
+#define comp_ellint_2f boost_comp_ellint_2f
+#ifdef comp_ellint_2l
+#undef comp_ellint_2l
+#endif
+#define comp_ellint_2l boost_comp_ellint_2l
+
+// [5.2.1.6] (complete) elliptic integral of the third kind:
+#ifdef comp_ellint_3
+#undef comp_ellint_3
+#endif
+#define comp_ellint_3 boost_comp_ellint_3
+#ifdef comp_ellint_3f
+#undef comp_ellint_3f
+#endif
+#define comp_ellint_3f boost_comp_ellint_3f
+#ifdef comp_ellint_3l
+#undef comp_ellint_3l
+#endif
+#define comp_ellint_3l boost_comp_ellint_3l
+
+#if 0
+// [5.2.1.7] confluent hypergeometric functions:
+#ifdef conf_hyper
+#undef conf_hyper
+#endif
+#define conf_hyper boost_conf_hyper
+#ifdef conf_hyperf
+#undef conf_hyperf
+#endif
+#define conf_hyperf boost_conf_hyperf
+#ifdef conf_hyperl
+#undef conf_hyperl
+#endif
+#define conf_hyperl boost_conf_hyperl
+#endif
+
+// [5.2.1.8] regular modified cylindrical Bessel functions:
+#ifdef cyl_bessel_i
+#undef cyl_bessel_i
+#endif
+#define cyl_bessel_i boost_cyl_bessel_i
+#ifdef cyl_bessel_if
+#undef cyl_bessel_if
+#endif
+#define cyl_bessel_if boost_cyl_bessel_if
+#ifdef cyl_bessel_il
+#undef cyl_bessel_il
+#endif
+#define cyl_bessel_il boost_cyl_bessel_il
+
+// [5.2.1.9] cylindrical Bessel functions (of the first kind):
+#ifdef cyl_bessel_j
+#undef cyl_bessel_j
+#endif
+#define cyl_bessel_j boost_cyl_bessel_j
+#ifdef cyl_bessel_jf
+#undef cyl_bessel_jf
+#endif
+#define cyl_bessel_jf boost_cyl_bessel_jf
+#ifdef cyl_bessel_jl
+#undef cyl_bessel_jl
+#endif
+#define cyl_bessel_jl boost_cyl_bessel_jl
+
+// [5.2.1.10] irregular modified cylindrical Bessel functions:
+#ifdef cyl_bessel_k
+#undef cyl_bessel_k
+#endif
+#define cyl_bessel_k boost_cyl_bessel_k
+#ifdef cyl_bessel_kf
+#undef cyl_bessel_kf
+#endif
+#define cyl_bessel_kf boost_cyl_bessel_kf
+#ifdef cyl_bessel_kl
+#undef cyl_bessel_kl
+#endif
+#define cyl_bessel_kl boost_cyl_bessel_kl
+
+// [5.2.1.11] cylindrical Neumann functions BOOST_MATH_C99_THROW_SPEC;
+// cylindrical Bessel functions (of the second kind):
+#ifdef cyl_neumann
+#undef cyl_neumann
+#endif
+#define cyl_neumann boost_cyl_neumann
+#ifdef cyl_neumannf
+#undef cyl_neumannf
+#endif
+#define cyl_neumannf boost_cyl_neumannf
+#ifdef cyl_neumannl
+#undef cyl_neumannl
+#endif
+#define cyl_neumannl boost_cyl_neumannl
+
+// [5.2.1.12] (incomplete) elliptic integral of the first kind:
+#ifdef ellint_1
+#undef ellint_1
+#endif
+#define ellint_1 boost_ellint_1
+#ifdef ellint_1f
+#undef ellint_1f
+#endif
+#define ellint_1f boost_ellint_1f
+#ifdef ellint_1l
+#undef ellint_1l
+#endif
+#define ellint_1l boost_ellint_1l
+
+// [5.2.1.13] (incomplete) elliptic integral of the second kind:
+#ifdef ellint_2
+#undef ellint_2
+#endif
+#define ellint_2 boost_ellint_2
+#ifdef ellint_2f
+#undef ellint_2f
+#endif
+#define ellint_2f boost_ellint_2f
+#ifdef ellint_2l
+#undef ellint_2l
+#endif
+#define ellint_2l boost_ellint_2l
+
+// [5.2.1.14] (incomplete) elliptic integral of the third kind:
+#ifdef ellint_3
+#undef ellint_3
+#endif
+#define ellint_3 boost_ellint_3
+#ifdef ellint_3f
+#undef ellint_3f
+#endif
+#define ellint_3f boost_ellint_3f
+#ifdef ellint_3l
+#undef ellint_3l
+#endif
+#define ellint_3l boost_ellint_3l
+
+// [5.2.1.15] exponential integral:
+#ifdef expint
+#undef expint
+#endif
+#define expint boost_expint
+#ifdef expintf
+#undef expintf
+#endif
+#define expintf boost_expintf
+#ifdef expintl
+#undef expintl
+#endif
+#define expintl boost_expintl
+
+// [5.2.1.16] Hermite polynomials:
+#ifdef hermite
+#undef hermite
+#endif
+#define hermite boost_hermite
+#ifdef hermitef
+#undef hermitef
+#endif
+#define hermitef boost_hermitef
+#ifdef hermitel
+#undef hermitel
+#endif
+#define hermitel boost_hermitel
+
+#if 0
+// [5.2.1.17] hypergeometric functions:
+#ifdef hyperg
+#undef hyperg
+#endif
+#define hyperg boost_hyperg
+#ifdef hypergf
+#undef hypergf
+#endif
+#define hypergf boost_hypergf
+#ifdef hypergl
+#undef hypergl
+#endif
+#define hypergl boost_hypergl
+#endif
+
+// [5.2.1.18] Laguerre polynomials:
+#ifdef laguerre
+#undef laguerre
+#endif
+#define laguerre boost_laguerre
+#ifdef laguerref
+#undef laguerref
+#endif
+#define laguerref boost_laguerref
+#ifdef laguerrel
+#undef laguerrel
+#endif
+#define laguerrel boost_laguerrel
+
+// [5.2.1.19] Legendre polynomials:
+#ifdef legendre
+#undef legendre
+#endif
+#define legendre boost_legendre
+#ifdef legendref
+#undef legendref
+#endif
+#define legendref boost_legendref
+#ifdef legendrel
+#undef legendrel
+#endif
+#define legendrel boost_legendrel
+
+// [5.2.1.20] Riemann zeta function:
+#ifdef riemann_zeta
+#undef riemann_zeta
+#endif
+#define riemann_zeta boost_riemann_zeta
+#ifdef riemann_zetaf
+#undef riemann_zetaf
+#endif
+#define riemann_zetaf boost_riemann_zetaf
+#ifdef riemann_zetal
+#undef riemann_zetal
+#endif
+#define riemann_zetal boost_riemann_zetal
+
+// [5.2.1.21] spherical Bessel functions (of the first kind):
+#ifdef sph_bessel
+#undef sph_bessel
+#endif
+#define sph_bessel boost_sph_bessel
+#ifdef sph_besself
+#undef sph_besself
+#endif
+#define sph_besself boost_sph_besself
+#ifdef sph_bessell
+#undef sph_bessell
+#endif
+#define sph_bessell boost_sph_bessell
+
+// [5.2.1.22] spherical associated Legendre functions:
+#ifdef sph_legendre
+#undef sph_legendre
+#endif
+#define sph_legendre boost_sph_legendre
+#ifdef sph_legendref
+#undef sph_legendref
+#endif
+#define sph_legendref boost_sph_legendref
+#ifdef sph_legendrel
+#undef sph_legendrel
+#endif
+#define sph_legendrel boost_sph_legendrel
+
+// [5.2.1.23] spherical Neumann functions BOOST_MATH_C99_THROW_SPEC;
+// spherical Bessel functions (of the second kind):
+#ifdef sph_neumann
+#undef sph_neumann
+#endif
+#define sph_neumann boost_sph_neumann
+#ifdef sph_neumannf
+#undef sph_neumannf
+#endif
+#define sph_neumannf boost_sph_neumannf
+#ifdef sph_neumannl
+#undef sph_neumannl
+#endif
+#define sph_neumannl boost_sph_neumannl
+
+#endif // BOOST_MATH_C_MACROS_IPP
diff --git a/gatb-core/thirdparty/boost/math_fwd.hpp b/gatb-core/thirdparty/boost/math_fwd.hpp
new file mode 100644
index 0000000..f9b7915
--- /dev/null
+++ b/gatb-core/thirdparty/boost/math_fwd.hpp
@@ -0,0 +1,108 @@
+//  Boost math_fwd.hpp header file  ------------------------------------------//
+
+//  (C) Copyright Hubert Holin and Daryle Walker 2001-2002.  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/math for documentation.
+
+#ifndef BOOST_MATH_FWD_HPP
+#define BOOST_MATH_FWD_HPP
+
+#include <boost/cstdint.hpp>
+
+namespace boost
+{
+namespace math
+{
+
+
+//  From <boost/math/quaternion.hpp>  ----------------------------------------//
+
+template < typename T >
+    class quaternion;
+
+template < >
+    class quaternion< float >;
+template < >
+    class quaternion< double >;
+template < >
+    class quaternion< long double >;
+
+// Also has many function templates (including operators)
+
+
+//  From <boost/math/octonion.hpp>  ------------------------------------------//
+
+template < typename T >
+    class octonion;
+
+template < >
+    class octonion< float >;
+template < >
+    class octonion< double >;
+template < >
+    class octonion< long double >;
+
+// Also has many function templates (including operators)
+
+
+//  From <boost/math/special_functions/acosh.hpp>  ---------------------------//
+
+// Only has function template
+
+
+//  From <boost/math/special_functions/asinh.hpp>  ---------------------------//
+
+// Only has function template
+
+
+//  From <boost/math/special_functions/atanh.hpp>  ---------------------------//
+
+// Only has function template
+
+
+//  From <boost/math/special_functions/sinc.hpp>  ----------------------------//
+
+// Only has function templates
+
+
+//  From <boost/math/special_functions/sinhc.hpp>  ---------------------------//
+
+// Only has function templates
+
+
+//  From <boost/math/common_factor.hpp>  -------------------------------------//
+
+// Only #includes other headers
+
+
+//  From <boost/math/common_factor_ct.hpp>  ----------------------------------//
+
+#ifdef BOOST_NO_INTEGRAL_INT64_T
+     typedef unsigned long static_gcd_type;
+#else
+     typedef boost::uintmax_t static_gcd_type;
+#endif
+
+template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_gcd;
+template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_lcm;
+
+
+//  From <boost/math/common_factor_rt.hpp>  ----------------------------------//
+
+template < typename IntegerType >
+    class gcd_evaluator;
+template < typename IntegerType >
+    class lcm_evaluator;
+
+// Also has a couple of function templates
+
+
+}  // namespace math
+}  // namespace boost
+
+
+#endif  // BOOST_MATH_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/move/adl_move_swap.hpp b/gatb-core/thirdparty/boost/move/adl_move_swap.hpp
new file mode 100644
index 0000000..2a010cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/adl_move_swap.hpp
@@ -0,0 +1,233 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_ADL_MOVE_SWAP_HPP
+#define BOOST_MOVE_ADL_MOVE_SWAP_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//Based on Boost.Core's swap.
+//Many thanks to Steven Watanabe, Joseph Gauterin and Niels Dekker.
+
+#include <boost/config.hpp>
+#include <cstddef> //for std::size_t
+
+//Try to avoid including <algorithm>, as it's quite big
+#if defined(_MSC_VER) && defined(BOOST_DINKUMWARE_STDLIB)
+   #include <utility>   //Dinkum libraries define std::swap in utility which is lighter than algorithm
+#elif defined(BOOST_GNU_STDLIB)
+   //For non-GCC compilers, where GNUC version is not very reliable, or old GCC versions
+   //use the good old stl_algobase header, which is quite lightweight
+   #if !defined(BOOST_GCC) || ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 3)))
+      #include <bits/stl_algobase.h>
+   #elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)
+      //In GCC 4.3 a tiny stl_move.h was created with swap and move utilities
+      #include <bits/stl_move.h>
+   #else
+      //In GCC 4.4 stl_move.h was renamed to move.h
+      #include <bits/move.h>
+   #endif
+#elif defined(_LIBCPP_VERSION)
+   #include <type_traits>  //The initial import of libc++ defines std::swap and still there
+#elif __cplusplus >= 201103L
+   #include <utility>    //Fallback for C++ >= 2011
+#else
+   #include <algorithm>  //Fallback for C++98/03
+#endif
+
+#include <boost/move/utility_core.hpp> //for boost::move
+
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+namespace boost_move_member_swap {
+
+struct dont_care
+{
+   dont_care(...);
+};
+
+struct private_type
+{
+   static private_type p;
+   private_type const &operator,(int) const;
+};
+
+typedef char yes_type;            
+struct no_type{ char dummy[2]; }; 
+
+template<typename T>
+no_type is_private_type(T const &);
+
+yes_type is_private_type(private_type const &);
+
+template <typename Type>
+class has_member_function_named_swap
+{
+   struct BaseMixin
+   {
+      void swap();
+   };
+
+   struct Base : public Type, public BaseMixin { Base(); };
+   template <typename T, T t> class Helper{};
+
+   template <typename U>
+   static no_type deduce(U*, Helper<void (BaseMixin::*)(), &U::swap>* = 0);
+   static yes_type deduce(...);
+
+   public:
+   static const bool value = sizeof(yes_type) == sizeof(deduce((Base*)(0)));
+};
+
+template<typename Fun, bool HasFunc>
+struct has_member_swap_impl
+{
+   static const bool value = false;
+};
+
+template<typename Fun>
+struct has_member_swap_impl<Fun, true>
+{
+   struct FunWrap : Fun
+   {
+      FunWrap();
+
+      using Fun::swap;
+      private_type swap(dont_care) const;
+   };
+
+   static Fun &declval_fun();
+   static FunWrap declval_wrap();
+
+   static bool const value =
+      sizeof(no_type) == sizeof(is_private_type( (declval_wrap().swap(declval_fun()), 0)) );
+};
+
+template<typename Fun>
+struct has_member_swap : public has_member_swap_impl
+      <Fun, has_member_function_named_swap<Fun>::value>
+{};
+
+}  //namespace boost_move_member_swap
+
+namespace boost_move_adl_swap{
+
+template<class P1, class P2, bool = P1::value>
+struct and_op_impl
+{  static const bool value = false; };
+
+template<class P1, class P2>
+struct and_op_impl<P1, P2, true>
+{  static const bool value = P2::value;   };
+
+template<class P1, class P2>
+struct and_op
+   : and_op_impl<P1, P2>
+{};
+
+//////
+
+template<class P1, class P2, bool = P1::value>
+struct and_op_not_impl
+{  static const bool value = false; };
+
+template<class P1, class P2>
+struct and_op_not_impl<P1, P2, true>
+{  static const bool value = !P2::value;   };
+
+template<class P1, class P2>
+struct and_op_not
+   : and_op_not_impl<P1, P2>
+{};
+
+template<class T>
+void swap_proxy(T& x, T& y, typename boost::move_detail::enable_if_c<!boost::move_detail::has_move_emulation_enabled_impl<T>::value>::type* = 0)
+{
+   //use std::swap if argument dependent lookup fails
+   //Use using directive ("using namespace xxx;") instead as some older compilers
+   //don't do ADL with using declarations ("using ns::func;").
+   using namespace std;
+   swap(x, y);
+}
+
+template<class T>
+void swap_proxy(T& x, T& y
+               , typename boost::move_detail::enable_if< and_op_not_impl<boost::move_detail::has_move_emulation_enabled_impl<T>
+                                                                        , boost_move_member_swap::has_member_swap<T> >
+                                                       >::type* = 0)
+{  T t(::boost::move(x)); x = ::boost::move(y); y = ::boost::move(t);  }
+
+template<class T>
+void swap_proxy(T& x, T& y
+               , typename boost::move_detail::enable_if< and_op_impl< boost::move_detail::has_move_emulation_enabled_impl<T>
+                                                                    , boost_move_member_swap::has_member_swap<T> >
+                                                       >::type* = 0)
+{  x.swap(y);  }
+
+}  //namespace boost_move_adl_swap{
+
+#else
+
+namespace boost_move_adl_swap{
+
+template<class T>
+void swap_proxy(T& x, T& y)
+{
+   using std::swap;
+   swap(x, y);
+}
+
+}  //namespace boost_move_adl_swap{
+
+#endif   //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+namespace boost_move_adl_swap{
+
+template<class T, std::size_t N>
+void swap_proxy(T (& x)[N], T (& y)[N])
+{
+   for (std::size_t i = 0; i < N; ++i){
+      ::boost_move_adl_swap::swap_proxy(x[i], y[i]);
+   }
+}
+
+}  //namespace boost_move_adl_swap {
+
+#endif   //!defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+
+//! Exchanges the values of a and b, using Argument Dependent Lookup (ADL) to select a
+//! specialized swap function if available. If no specialized swap function is available,
+//! std::swap is used.
+//!
+//! <b>Exception</b>: If T uses Boost.Move's move emulation and the compiler has
+//! no rvalue references then:
+//!
+//!   -  If T has a <code>T::swap(T&)</code> member, that member is called.
+//!   -  Otherwise a move-based swap is called, equivalent to: 
+//!      <code>T t(::boost::move(x)); x = ::boost::move(y); y = ::boost::move(t);</code>.
+template<class T>
+void adl_move_swap(T& x, T& y)
+{
+   ::boost_move_adl_swap::swap_proxy(x, y);
+}
+
+}  //namespace boost{
+
+#endif   //#ifndef BOOST_MOVE_ADL_MOVE_SWAP_HPP
diff --git a/gatb-core/thirdparty/boost/move/algorithm.hpp b/gatb-core/thirdparty/boost/move/algorithm.hpp
new file mode 100644
index 0000000..fbda0f4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/algorithm.hpp
@@ -0,0 +1,282 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_ALGORITHM_HPP
+#define BOOST_MOVE_ALGORITHM_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+
+#include <boost/move/utility_core.hpp>
+#include <boost/move/iterator.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+
+#include <algorithm> //copy, copy_backward
+#include <memory>    //uninitialized_copy
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+
+   //! <b>Effects</b>: Moves elements in the range [first,last) into the range [result,result + (last -
+   //!   first)) starting from first and proceeding to last. For each non-negative integer n < (last-first),
+   //!   performs *(result + n) = ::boost::move (*(first + n)).
+   //!
+   //! <b>Effects</b>: result + (last - first).
+   //!
+   //! <b>Requires</b>: result shall not be in the range [first,last).
+   //!
+   //! <b>Complexity</b>: Exactly last - first move assignments.
+   template <typename I, // I models InputIterator
+            typename O> // O models OutputIterator
+   O move(I f, I l, O result)
+   {
+      while (f != l) {
+         *result = ::boost::move(*f);
+         ++f; ++result;
+      }
+      return result;
+   }
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                               move_backward
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   //! <b>Effects</b>: Moves elements in the range [first,last) into the range
+   //!   [result - (last-first),result) starting from last - 1 and proceeding to
+   //!   first. For each positive integer n <= (last - first),
+   //!   performs *(result - n) = ::boost::move(*(last - n)).
+   //!
+   //! <b>Requires</b>: result shall not be in the range [first,last).
+   //!
+   //! <b>Returns</b>: result - (last - first).
+   //!
+   //! <b>Complexity</b>: Exactly last - first assignments.
+   template <typename I, // I models BidirectionalIterator
+   typename O> // O models BidirectionalIterator
+   O move_backward(I f, I l, O result)
+   {
+      while (f != l) {
+         --l; --result;
+         *result = ::boost::move(*l);
+      }
+      return result;
+   }
+
+#else
+
+   using ::std::move_backward;
+
+#endif   //!defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; first != last; ++result, ++first)
+//!      new (static_cast<void*>(&*result))
+//!         typename iterator_traits<ForwardIterator>::value_type(boost::move(*first));
+//!   \endcode
+//!
+//! <b>Returns</b>: result
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+F uninitialized_move(I f, I l, F r
+   /// @cond
+//   ,typename ::boost::move_detail::enable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0
+   /// @endcond
+   )
+{
+   typedef typename std::iterator_traits<I>::value_type input_value_type;
+
+   F back = r;
+   BOOST_TRY{
+      while (f != l) {
+         void * const addr = static_cast<void*>(::boost::move_detail::addressof(*r));
+         ::new(addr) input_value_type(::boost::move(*f));
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+	   for (; back != r; ++back){
+         back->~input_value_type();
+      }
+	   BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+/// @cond
+/*
+template
+   <typename I,   // I models InputIterator
+    typename F>   // F models ForwardIterator
+F uninitialized_move(I f, I l, F r,
+   typename ::boost::move_detail::disable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0)
+{
+   return std::uninitialized_copy(f, l, r);
+}
+*/
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            uninitialized_copy_or_move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F uninitialized_move_move_iterator(I f, I l, F r
+//                             ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
+)
+{
+   return ::boost::uninitialized_move(f, l, r);
+}
+/*
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F uninitialized_move_move_iterator(I f, I l, F r,
+                                   typename ::boost::move_detail::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
+{
+   return std::uninitialized_copy(f.base(), l.base(), r);
+}
+*/
+}  //namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F uninitialized_copy_or_move(I f, I l, F r,
+                             typename ::boost::move_detail::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
+{
+   return ::boost::move_detail::uninitialized_move_move_iterator(f, l, r);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            copy_or_move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F move_move_iterator(I f, I l, F r
+//                             ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
+)
+{
+   return ::boost::move(f, l, r);
+}
+/*
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F move_move_iterator(I f, I l, F r,
+                                   typename ::boost::move_detail::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
+{
+   return std::copy(f.base(), l.base(), r);
+}
+*/
+
+}  //namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F copy_or_move(I f, I l, F r,
+                             typename ::boost::move_detail::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
+{
+   return ::boost::move_detail::move_move_iterator(f, l, r);
+}
+
+/// @endcond
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; first != last; ++result, ++first)
+//!      new (static_cast<void*>(&*result))
+//!         typename iterator_traits<ForwardIterator>::value_type(*first);
+//!   \endcode
+//!
+//! <b>Returns</b>: result
+//!
+//! <b>Note</b>: This function is provided because
+//!   <i>std::uninitialized_copy</i> from some STL implementations
+//!    is not compatible with <i>move_iterator</i>
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F uninitialized_copy_or_move(I f, I l, F r
+   /// @cond
+   ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator<I> >::type* = 0
+   /// @endcond
+   )
+{
+   return std::uninitialized_copy(f, l, r);
+}
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; first != last; ++result, ++first)
+//!      *result = *first;
+//!   \endcode
+//!
+//! <b>Returns</b>: result
+//!
+//! <b>Note</b>: This function is provided because
+//!   <i>std::uninitialized_copy</i> from some STL implementations
+//!    is not compatible with <i>move_iterator</i>
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline F copy_or_move(I f, I l, F r
+   /// @cond
+   ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator<I> >::type* = 0
+   /// @endcond
+   )
+{
+   return std::copy(f, l, r);
+}
+
+}  //namespace boost {
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_ALGORITHM_HPP
diff --git a/gatb-core/thirdparty/boost/move/core.hpp b/gatb-core/thirdparty/boost/move/core.hpp
new file mode 100644
index 0000000..55486e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/core.hpp
@@ -0,0 +1,497 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+//! This header implements macros to define movable classes and
+//! move-aware functions
+
+#ifndef BOOST_MOVE_CORE_HPP
+#define BOOST_MOVE_CORE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+
+//boost_move_no_copy_constructor_or_assign typedef
+//used to detect noncopyable types for other Boost libraries.
+#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+   #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
+      private:\
+      TYPE(TYPE &);\
+      TYPE& operator=(TYPE &);\
+      public:\
+      typedef int boost_move_no_copy_constructor_or_assign; \
+      private:\
+   //
+#else
+   #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
+      public:\
+      TYPE(TYPE const &) = delete;\
+      TYPE& operator=(TYPE const &) = delete;\
+      public:\
+      typedef int boost_move_no_copy_constructor_or_assign; \
+      private:\
+   //
+#endif   //BOOST_NO_CXX11_DELETED_FUNCTIONS
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #include <boost/move/detail/type_traits.hpp>
+
+   #if defined(BOOST_MOVE_ADDRESS_SANITIZER_ON)
+      #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) reinterpret_cast<RV_TYPE>(ARG)
+   #else
+      #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) static_cast<RV_TYPE>(ARG)
+   #endif
+
+   //Move emulation rv breaks standard aliasing rules so add workarounds for some compilers
+   #if defined(__GNUC__) && (__GNUC__ >= 4) && \
+      (\
+         defined(BOOST_GCC) ||   \
+         (defined(BOOST_INTEL) && (BOOST_INTEL_CXX_VERSION >= 1300)) \
+      )
+      #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))
+   #else
+      #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS
+   #endif
+
+   namespace boost {
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            struct rv
+   //
+   //////////////////////////////////////////////////////////////////////////////
+   template <class T>
+   class rv
+      : public ::boost::move_detail::if_c
+         < ::boost::move_detail::is_class<T>::value
+         , T
+         , ::boost::move_detail::nat
+         >::type
+   {
+      rv();
+      ~rv() throw();
+      rv(rv const&);
+      void operator=(rv const&);
+   } BOOST_MOVE_ATTRIBUTE_MAY_ALIAS;
+
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            is_rv
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   namespace move_detail {
+
+   template <class T>
+   struct is_rv
+        //Derive from integral constant because some Boost code assummes it has
+        //a "type" internal typedef
+      : integral_constant<bool, ::boost::move_detail::is_rv_impl<T>::value >
+   {};
+
+   template <class T>
+   struct is_not_rv
+   {
+      static const bool value = !is_rv<T>::value;
+   };
+
+   }  //namespace move_detail {
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                               has_move_emulation_enabled
+   //
+   //////////////////////////////////////////////////////////////////////////////
+   template<class T>
+   struct has_move_emulation_enabled
+      : ::boost::move_detail::has_move_emulation_enabled_impl<T>
+   {};
+
+   template<class T>
+   struct has_move_emulation_disabled
+   {
+      static const bool value = !::boost::move_detail::has_move_emulation_enabled_impl<T>::value;
+   };
+
+   }  //namespace boost {
+
+   #define BOOST_RV_REF(TYPE)\
+      ::boost::rv< TYPE >& \
+   //
+
+   #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+      ::boost::rv< TYPE<ARG1, ARG2> >& \
+   //
+
+   #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+      ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
+   //
+
+   #define BOOST_RV_REF_BEG\
+      ::boost::rv<   \
+   //
+
+   #define BOOST_RV_REF_END\
+      >& \
+   //
+
+   #define BOOST_RV_REF_BEG_IF_CXX11 \
+      \
+   //
+
+   #define BOOST_RV_REF_END_IF_CXX11 \
+      \
+   //
+
+   #define BOOST_FWD_REF(TYPE)\
+      const TYPE & \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF(TYPE)\
+      const ::boost::rv< TYPE >& \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_BEG \
+      const ::boost::rv<  \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_END \
+      >& \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+      const ::boost::rv< TYPE<ARG1, ARG2> >& \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+      const ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
+   //
+
+   #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
+      const ::boost::rv< TYPE >& \
+   //
+
+   namespace boost {
+   namespace move_detail {
+
+   template <class Ret, class T>
+   inline typename ::boost::move_detail::enable_if_c
+      <  ::boost::move_detail::is_lvalue_reference<Ret>::value ||
+        !::boost::has_move_emulation_enabled<T>::value
+      , T&>::type
+         move_return(T& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class Ret, class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < !::boost::move_detail::is_lvalue_reference<Ret>::value &&
+         ::boost::has_move_emulation_enabled<T>::value
+      , ::boost::rv<T>&>::type
+         move_return(T& x) BOOST_NOEXCEPT
+   {
+      return *BOOST_MOVE_TO_RV_CAST(::boost::rv<T>*, ::boost::move_detail::addressof(x));
+   }
+
+   template <class Ret, class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < !::boost::move_detail::is_lvalue_reference<Ret>::value &&
+         ::boost::has_move_emulation_enabled<T>::value
+      , ::boost::rv<T>&>::type
+         move_return(::boost::rv<T>& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   }  //namespace move_detail {
+   }  //namespace boost {
+
+   #define BOOST_MOVE_RET(RET_TYPE, REF)\
+      boost::move_detail::move_return< RET_TYPE >(REF)
+   //
+
+   #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
+      ::boost::move((BASE_TYPE&)(ARG))
+   //
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                         BOOST_MOVABLE_BUT_NOT_COPYABLE
+   //
+   //////////////////////////////////////////////////////////////////////////////
+   #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
+      BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
+      public:\
+      operator ::boost::rv<TYPE>&() \
+      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
+      operator const ::boost::rv<TYPE>&() const \
+      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
+      private:\
+   //
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                         BOOST_COPYABLE_AND_MOVABLE
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
+      public:\
+      TYPE& operator=(TYPE &t)\
+      {  this->operator=(const_cast<const TYPE &>(t)); return *this;}\
+      public:\
+      operator ::boost::rv<TYPE>&() \
+      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
+      operator const ::boost::rv<TYPE>&() const \
+      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
+      private:\
+   //
+
+   #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
+      public:\
+      operator ::boost::rv<TYPE>&() \
+      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
+      operator const ::boost::rv<TYPE>&() const \
+      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
+      private:\
+   //
+
+   namespace boost{
+   namespace move_detail{
+
+   template< class T>
+   struct forward_type
+   { typedef const T &type; };
+
+   template< class T>
+   struct forward_type< boost::rv<T> >
+   { typedef T type; };
+
+   }}
+
+#else    //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+   //! This macro marks a type as movable but not copyable, disabling copy construction
+   //! and assignment. The user will need to write a move constructor/assignment as explained
+   //! in the documentation to fully write a movable but not copyable class.
+   #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
+      BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
+      public:\
+      typedef int boost_move_emulation_t;\
+   //
+
+   //! This macro marks a type as copyable and movable.
+   //! The user will need to write a move constructor/assignment and a copy assignment
+   //! as explained in the documentation to fully write a copyable and movable class.
+   #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
+   //
+
+   #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
+   //
+   #endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   namespace boost {
+
+   //!This trait yields to a compile-time true boolean if T was marked as
+   //!BOOST_MOVABLE_BUT_NOT_COPYABLE or BOOST_COPYABLE_AND_MOVABLE and
+   //!rvalue references are not available on the platform. False otherwise.
+   template<class T>
+   struct has_move_emulation_enabled
+   {
+      static const bool value = false;
+   };
+
+   template<class T>
+   struct has_move_emulation_disabled
+   {
+      static const bool value = true;
+   };
+
+   }  //namespace boost{
+
+   //!This macro is used to achieve portable syntax in move
+   //!constructors and assignments for classes marked as
+   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE
+   #define BOOST_RV_REF(TYPE)\
+      TYPE && \
+   //
+
+   //!This macro is used to achieve portable syntax in move
+   //!constructors and assignments for template classes marked as
+   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
+   //!As macros have problems with comma-separated template arguments,
+   //!the template argument must be preceded with BOOST_RV_REF_BEG
+   //!and ended with BOOST_RV_REF_END
+   #define BOOST_RV_REF_BEG\
+         \
+   //
+
+   //!This macro is used to achieve portable syntax in move
+   //!constructors and assignments for template classes marked as
+   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
+   //!As macros have problems with comma-separated template arguments,
+   //!the template argument must be preceded with BOOST_RV_REF_BEG
+   //!and ended with BOOST_RV_REF_END
+   #define BOOST_RV_REF_END\
+      && \
+   //
+
+   //!This macro expands to BOOST_RV_REF_BEG if BOOST_NO_CXX11_RVALUE_REFERENCES
+   //!is not defined, empty otherwise
+   #define BOOST_RV_REF_BEG_IF_CXX11 \
+      BOOST_RV_REF_BEG \
+   //
+
+   //!This macro expands to BOOST_RV_REF_END if BOOST_NO_CXX11_RVALUE_REFERENCES
+   //!is not defined, empty otherwise
+   #define BOOST_RV_REF_END_IF_CXX11 \
+      BOOST_RV_REF_END \
+   //
+
+   //!This macro is used to achieve portable syntax in copy
+   //!assignment for classes marked as BOOST_COPYABLE_AND_MOVABLE.
+   #define BOOST_COPY_ASSIGN_REF(TYPE)\
+      const TYPE & \
+   //
+
+   //! This macro is used to implement portable perfect forwarding
+   //! as explained in the documentation.
+   #define BOOST_FWD_REF(TYPE)\
+      TYPE && \
+   //
+
+   #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+      TYPE<ARG1, ARG2> && \
+   //
+
+   #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+      TYPE<ARG1, ARG2, ARG3> && \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_BEG \
+      const \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_END \
+      & \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+      const TYPE<ARG1, ARG2> & \
+   //
+
+   #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+      const TYPE<ARG1, ARG2, ARG3>& \
+   //
+
+   #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
+      const TYPE & \
+   //
+
+   #endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #if !defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+      //!This macro is used to achieve portable move return semantics.
+      //!The C++11 Standard allows implicit move returns when the object to be returned
+      //!is designated by a lvalue and:
+      //!   - The criteria for elision of a copy operation are met OR
+      //!   - The criteria would be met save for the fact that the source object is a function parameter
+      //!
+      //!For C++11 conforming compilers this macros only yields to REF:
+      //! <code>return BOOST_MOVE_RET(RET_TYPE, REF);</code> -> <code>return REF;</code>
+      //!
+      //!For compilers without rvalue references
+      //!this macro does an explicit move if the move emulation is activated
+      //!and the return type (RET_TYPE) is not a reference.
+      //!
+      //!For non-conforming compilers with rvalue references like Visual 2010 & 2012,
+      //!an explicit move is performed if RET_TYPE is not a reference.
+      //!
+      //! <b>Caution</b>: When using this macro in non-conforming or C++03
+      //!compilers, a move will be performed even if the C++11 standard does not allow it
+      //!(e.g. returning a static variable). The user is responsible for using this macro
+      //!only to return local objects that met C++11 criteria.
+      #define BOOST_MOVE_RET(RET_TYPE, REF)\
+         REF
+      //
+
+   #else //!defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+      #include <boost/move/detail/meta_utils.hpp>
+
+      namespace boost {
+      namespace move_detail {
+
+      template <class Ret, class T>
+      inline typename ::boost::move_detail::enable_if_c
+         <  ::boost::move_detail::is_lvalue_reference<Ret>::value
+         , T&>::type
+            move_return(T& x) BOOST_NOEXCEPT
+      {
+         return x;
+      }
+
+      template <class Ret, class T>
+      inline typename ::boost::move_detail::enable_if_c
+         < !::boost::move_detail::is_lvalue_reference<Ret>::value
+         , Ret && >::type
+            move_return(T&& t) BOOST_NOEXCEPT
+      {
+         return static_cast< Ret&& >(t);
+      }
+
+      }  //namespace move_detail {
+      }  //namespace boost {
+
+      #define BOOST_MOVE_RET(RET_TYPE, REF)\
+         boost::move_detail::move_return< RET_TYPE >(REF)
+      //
+
+   #endif   //!defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   //!This macro is used to achieve portable optimal move constructors.
+   //!
+   //!When implementing the move constructor, in C++03 compilers the moved-from argument must be
+   //!cast to the base type before calling `::boost::move()` due to rvalue reference limitations.
+   //!
+   //!In C++11 compilers the cast from a rvalue reference of a derived type to a rvalue reference of
+   //!a base type is implicit.
+   #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
+      ::boost::move((BASE_TYPE&)(ARG))
+   //
+
+   namespace boost {
+   namespace move_detail {
+
+   template< class T> struct forward_type { typedef T type; };
+
+   }}
+
+#endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_CORE_HPP
diff --git a/gatb-core/thirdparty/boost/move/default_delete.hpp b/gatb-core/thirdparty/boost/move/default_delete.hpp
new file mode 100644
index 0000000..afe1b1b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/default_delete.hpp
@@ -0,0 +1,195 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
+#define BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/static_assert.hpp>
+
+#include <cstddef>   //For std::size_t,std::nullptr_t
+
+//!\file
+//! Describes the default deleter (destruction policy) of <tt>unique_ptr</tt>: <tt>default_delete</tt>.
+
+namespace boost{
+namespace move_upd {
+
+namespace bmupmu = ::boost::move_upmu;
+
+////////////////////////////////////////
+////        enable_def_del
+////////////////////////////////////////
+
+//compatible with a pointer type T*:
+//When either Y* is convertible to T*
+//Y is U[N] and T is U cv []
+template<class U, class T>
+struct def_del_compatible_cond
+   : bmupmu::is_convertible<U*, T*>
+{};
+
+template<class U, class T, std::size_t N>
+struct def_del_compatible_cond<U[N], T[]>
+   : def_del_compatible_cond<U[], T[]>
+{};
+
+template<class U, class T, class Type = bmupmu::nat>
+struct enable_def_del
+   : bmupmu::enable_if_c<def_del_compatible_cond<U, T>::value, Type>
+{};
+
+////////////////////////////////////////
+////        enable_defdel_call
+////////////////////////////////////////
+
+//When 2nd is T[N], 1st(*)[N] shall be convertible to T(*)[N]; 
+//When 2nd is T[],  1st(*)[] shall be convertible to T(*)[]; 
+//Otherwise, 1st* shall be convertible to 2nd*.
+
+template<class U, class T, class Type = bmupmu::nat>
+struct enable_defdel_call
+   : public enable_def_del<U, T, Type>
+{};
+
+template<class U, class T, class Type>
+struct enable_defdel_call<U, T[], Type>
+   : public enable_def_del<U[], T[], Type>
+{};
+
+template<class U, class T, class Type, std::size_t N>
+struct enable_defdel_call<U, T[N], Type>
+   : public enable_def_del<U[N], T[N], Type>
+{};
+
+////////////////////////////////////////
+////     Some bool literal zero conversion utilities
+////////////////////////////////////////
+
+struct bool_conversion {int for_bool; int for_arg(); };
+typedef int bool_conversion::* explicit_bool_arg;
+
+#if !defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_CXX11_DECLTYPE)
+   typedef decltype(nullptr) nullptr_type;
+#elif !defined(BOOST_NO_CXX11_NULLPTR)
+   typedef std::nullptr_t nullptr_type;
+#else
+   typedef int (bool_conversion::*nullptr_type)();
+#endif
+
+}  //namespace move_upd {
+
+namespace movelib {
+
+namespace bmupd = boost::move_upd;
+namespace bmupmu = ::boost::move_upmu;
+
+//!The class template <tt>default_delete</tt> serves as the default deleter
+//!(destruction policy) for the class template <tt>unique_ptr</tt>.
+//!
+//! \tparam T The type to be deleted. It may be an incomplete type
+template <class T>
+struct default_delete
+{
+   //! Default constructor.
+   //!
+   BOOST_CONSTEXPR default_delete()
+   //Avoid "defaulted on its first declaration must not have an exception-specification" error for GCC 4.6
+   #if !defined(BOOST_GCC) || (BOOST_GCC < 40600 && BOOST_GCC >= 40700) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   BOOST_NOEXCEPT
+   #endif
+   #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   = default;
+   #else
+   {};
+   #endif
+
+   #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   default_delete(const default_delete&) BOOST_NOEXCEPT = default;
+   default_delete &operator=(const default_delete&) BOOST_NOEXCEPT = default;
+   #else
+   typedef typename bmupmu::remove_extent<T>::type element_type;
+   #endif
+
+   //! <b>Effects</b>: Constructs a default_delete object from another <tt>default_delete<U></tt> object.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - If T is not an array type and U* is implicitly convertible to T*.
+   //!   - If T is an array type and U* is a more CV qualified pointer to remove_extent<T>::type.
+   template <class U>
+   default_delete(const default_delete<U>&
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_def_del<U BOOST_MOVE_I T>::type* =0)
+      ) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+   }
+
+   //! <b>Effects</b>: Constructs a default_delete object from another <tt>default_delete<U></tt> object.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - If T is not an array type and U* is implicitly convertible to T*.
+   //!   - If T is an array type and U* is a more CV qualified pointer to remove_extent<T>::type.
+   template <class U>
+   BOOST_MOVE_DOC1ST(default_delete&, 
+      typename bmupd::enable_def_del<U BOOST_MOVE_I T BOOST_MOVE_I default_delete &>::type)
+      operator=(const default_delete<U>&) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+      return *this;
+   }
+
+   //! <b>Effects</b>: if T is not an array type, calls <tt>delete</tt> on static_cast<T*>(ptr),
+   //!   otherwise calls <tt>delete[]</tt> on static_cast<remove_extent<T>::type*>(ptr).
+   //!
+   //! <b>Remarks</b>: If U is an incomplete type, the program is ill-formed.
+   //!   This operator shall not participate in overload resolution unless:
+   //!      - T is not an array type and U* is convertible to T*, OR
+   //!      - T is an array type, and remove_cv<U>::type is the same type as
+   //!         remove_cv<remove_extent<T>::type>::type and U* is convertible to remove_extent<T>::type*.
+   template <class U>
+   BOOST_MOVE_DOC1ST(void, typename bmupd::enable_defdel_call<U BOOST_MOVE_I T BOOST_MOVE_I void>::type)
+      operator()(U* ptr) const BOOST_NOEXCEPT
+   {
+      //U must be a complete type
+      BOOST_STATIC_ASSERT(sizeof(U) > 0);
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+      element_type * const p = static_cast<element_type*>(ptr);
+      bmupmu::is_array<T>::value ? delete [] p : delete p;
+   }
+
+   //! <b>Effects</b>: Same as <tt>(*this)(static_cast<element_type*>(nullptr))</tt>.
+   //!
+   void operator()(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) const BOOST_NOEXCEPT
+   {  BOOST_STATIC_ASSERT(sizeof(element_type) > 0);  }
+};
+
+}  //namespace movelib {
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/move/detail/config_begin.hpp b/gatb-core/thirdparty/boost/move/detail/config_begin.hpp
new file mode 100644
index 0000000..342390b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/config_begin.hpp
@@ -0,0 +1,19 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
+
+#ifdef BOOST_MSVC
+#  pragma warning (push)
+#  pragma warning (disable : 4324) // structure was padded due to __declspec(align())
+#  pragma warning (disable : 4675) // "function":  resolved overload was found by argument-dependent lookup
+#  pragma warning (disable : 4996) // "function": was declared deprecated (_CRT_SECURE_NO_DEPRECATE/_SCL_SECURE_NO_WARNINGS)
+#endif
diff --git a/gatb-core/thirdparty/boost/move/detail/config_end.hpp b/gatb-core/thirdparty/boost/move/detail/config_end.hpp
new file mode 100644
index 0000000..71a99e9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/config_end.hpp
@@ -0,0 +1,12 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#if defined BOOST_MSVC
+#  pragma warning (pop)
+#endif
diff --git a/gatb-core/thirdparty/boost/move/detail/fwd_macros.hpp b/gatb-core/thirdparty/boost/move/detail/fwd_macros.hpp
new file mode 100644
index 0000000..8d5ab2e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/fwd_macros.hpp
@@ -0,0 +1,465 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DETAIL_FWD_MACROS_HPP
+#define BOOST_MOVE_DETAIL_FWD_MACROS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/workaround.hpp>
+
+namespace boost {
+namespace move_detail {
+
+template <typename T> struct unvoid { typedef T type; };
+template <> struct unvoid<void> { struct type { }; };
+template <> struct unvoid<const void> { struct type { }; };
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+#if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
+
+namespace boost {
+namespace move_detail {
+
+   template<class T>
+   struct mref;
+
+   template<class T>
+   struct mref<T &>
+   {
+      explicit mref(T &t) : t_(t){}
+      T &t_;
+      T & get() {  return t_;   }
+   };
+
+   template<class T>
+   struct mref
+   {
+      explicit mref(T &&t) : t_(t) {}
+      T &t_;
+      T &&get() {  return ::boost::move(t_);   }
+   };
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#endif   //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+#endif   //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+//BOOST_MOVE_REPEATN(MACRO)
+#define BOOST_MOVE_REPEAT0(MACRO)
+#define BOOST_MOVE_REPEAT1(MACRO) MACRO
+#define BOOST_MOVE_REPEAT2(MACRO) BOOST_MOVE_REPEAT1(MACRO), MACRO
+#define BOOST_MOVE_REPEAT3(MACRO) BOOST_MOVE_REPEAT2(MACRO), MACRO
+#define BOOST_MOVE_REPEAT4(MACRO) BOOST_MOVE_REPEAT3(MACRO), MACRO
+#define BOOST_MOVE_REPEAT5(MACRO) BOOST_MOVE_REPEAT4(MACRO), MACRO
+#define BOOST_MOVE_REPEAT6(MACRO) BOOST_MOVE_REPEAT5(MACRO), MACRO
+#define BOOST_MOVE_REPEAT7(MACRO) BOOST_MOVE_REPEAT6(MACRO), MACRO
+#define BOOST_MOVE_REPEAT8(MACRO) BOOST_MOVE_REPEAT7(MACRO), MACRO
+#define BOOST_MOVE_REPEAT9(MACRO) BOOST_MOVE_REPEAT8(MACRO), MACRO
+
+//BOOST_MOVE_FWDN
+#define BOOST_MOVE_FWD0
+#define BOOST_MOVE_FWD1 ::boost::forward<P0>(p0)
+#define BOOST_MOVE_FWD2 BOOST_MOVE_FWD1, ::boost::forward<P1>(p1)
+#define BOOST_MOVE_FWD3 BOOST_MOVE_FWD2, ::boost::forward<P2>(p2)
+#define BOOST_MOVE_FWD4 BOOST_MOVE_FWD3, ::boost::forward<P3>(p3)
+#define BOOST_MOVE_FWD5 BOOST_MOVE_FWD4, ::boost::forward<P4>(p4)
+#define BOOST_MOVE_FWD6 BOOST_MOVE_FWD5, ::boost::forward<P5>(p5)
+#define BOOST_MOVE_FWD7 BOOST_MOVE_FWD6, ::boost::forward<P6>(p6)
+#define BOOST_MOVE_FWD8 BOOST_MOVE_FWD7, ::boost::forward<P7>(p7)
+#define BOOST_MOVE_FWD9 BOOST_MOVE_FWD8, ::boost::forward<P8>(p8)
+
+//BOOST_MOVE_FWDQN
+#define BOOST_MOVE_FWDQ0
+#define BOOST_MOVE_FWDQ1 ::boost::forward<Q0>(q0)
+#define BOOST_MOVE_FWDQ2 BOOST_MOVE_FWDQ1, ::boost::forward<Q1>(q1)
+#define BOOST_MOVE_FWDQ3 BOOST_MOVE_FWDQ2, ::boost::forward<Q2>(q2)
+#define BOOST_MOVE_FWDQ4 BOOST_MOVE_FWDQ3, ::boost::forward<Q3>(q3)
+#define BOOST_MOVE_FWDQ5 BOOST_MOVE_FWDQ4, ::boost::forward<Q4>(q4)
+#define BOOST_MOVE_FWDQ6 BOOST_MOVE_FWDQ5, ::boost::forward<Q5>(q5)
+#define BOOST_MOVE_FWDQ7 BOOST_MOVE_FWDQ6, ::boost::forward<Q6>(q6)
+#define BOOST_MOVE_FWDQ8 BOOST_MOVE_FWDQ7, ::boost::forward<Q7>(q7)
+#define BOOST_MOVE_FWDQ9 BOOST_MOVE_FWDQ8, ::boost::forward<Q8>(q8)
+
+//BOOST_MOVE_ARGN
+#define BOOST_MOVE_ARG0
+#define BOOST_MOVE_ARG1 p0
+#define BOOST_MOVE_ARG2 BOOST_MOVE_ARG1, p1
+#define BOOST_MOVE_ARG3 BOOST_MOVE_ARG2, p2
+#define BOOST_MOVE_ARG4 BOOST_MOVE_ARG3, p3
+#define BOOST_MOVE_ARG5 BOOST_MOVE_ARG4, p4
+#define BOOST_MOVE_ARG6 BOOST_MOVE_ARG5, p5
+#define BOOST_MOVE_ARG7 BOOST_MOVE_ARG6, p6
+#define BOOST_MOVE_ARG8 BOOST_MOVE_ARG7, p7
+#define BOOST_MOVE_ARG9 BOOST_MOVE_ARG8, p8
+
+//BOOST_MOVE_DECLVALN
+#define BOOST_MOVE_DECLVAL0
+#define BOOST_MOVE_DECLVAL1 ::boost::move_detail::declval<P0>()
+#define BOOST_MOVE_DECLVAL2 BOOST_MOVE_DECLVAL1, ::boost::move_detail::declval<P1>()
+#define BOOST_MOVE_DECLVAL3 BOOST_MOVE_DECLVAL2, ::boost::move_detail::declval<P2>()
+#define BOOST_MOVE_DECLVAL4 BOOST_MOVE_DECLVAL3, ::boost::move_detail::declval<P3>()
+#define BOOST_MOVE_DECLVAL5 BOOST_MOVE_DECLVAL4, ::boost::move_detail::declval<P4>()
+#define BOOST_MOVE_DECLVAL6 BOOST_MOVE_DECLVAL5, ::boost::move_detail::declval<P5>()
+#define BOOST_MOVE_DECLVAL7 BOOST_MOVE_DECLVAL6, ::boost::move_detail::declval<P6>()
+#define BOOST_MOVE_DECLVAL8 BOOST_MOVE_DECLVAL7, ::boost::move_detail::declval<P7>()
+#define BOOST_MOVE_DECLVAL9 BOOST_MOVE_DECLVAL8, ::boost::move_detail::declval<P8>()
+
+#ifdef BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+   #define BOOST_MOVE_MREF(T)    ::boost::move_detail::mref<T>
+   #define BOOST_MOVE_MFWD(N)    ::boost::forward<P##N>(this->m_p##N.get())
+#else
+   #define BOOST_MOVE_MREF(T)    BOOST_FWD_REF(T)
+   #define BOOST_MOVE_MFWD(N)    ::boost::forward<P##N>(this->m_p##N)
+#endif
+#define BOOST_MOVE_MITFWD(N)  *this->m_p##N
+#define BOOST_MOVE_MINC(N)    ++this->m_p##N
+
+//BOOST_MOVE_MFWDN
+#define BOOST_MOVE_MFWD0
+#define BOOST_MOVE_MFWD1 BOOST_MOVE_MFWD(0)
+#define BOOST_MOVE_MFWD2 BOOST_MOVE_MFWD1, BOOST_MOVE_MFWD(1)
+#define BOOST_MOVE_MFWD3 BOOST_MOVE_MFWD2, BOOST_MOVE_MFWD(2)
+#define BOOST_MOVE_MFWD4 BOOST_MOVE_MFWD3, BOOST_MOVE_MFWD(3)
+#define BOOST_MOVE_MFWD5 BOOST_MOVE_MFWD4, BOOST_MOVE_MFWD(4)
+#define BOOST_MOVE_MFWD6 BOOST_MOVE_MFWD5, BOOST_MOVE_MFWD(5)
+#define BOOST_MOVE_MFWD7 BOOST_MOVE_MFWD6, BOOST_MOVE_MFWD(6)
+#define BOOST_MOVE_MFWD8 BOOST_MOVE_MFWD7, BOOST_MOVE_MFWD(7)
+#define BOOST_MOVE_MFWD9 BOOST_MOVE_MFWD8, BOOST_MOVE_MFWD(8)
+
+//BOOST_MOVE_MINCN
+#define BOOST_MOVE_MINC0
+#define BOOST_MOVE_MINC1 BOOST_MOVE_MINC(0)
+#define BOOST_MOVE_MINC2 BOOST_MOVE_MINC1, BOOST_MOVE_MINC(1)
+#define BOOST_MOVE_MINC3 BOOST_MOVE_MINC2, BOOST_MOVE_MINC(2)
+#define BOOST_MOVE_MINC4 BOOST_MOVE_MINC3, BOOST_MOVE_MINC(3)
+#define BOOST_MOVE_MINC5 BOOST_MOVE_MINC4, BOOST_MOVE_MINC(4)
+#define BOOST_MOVE_MINC6 BOOST_MOVE_MINC5, BOOST_MOVE_MINC(5)
+#define BOOST_MOVE_MINC7 BOOST_MOVE_MINC6, BOOST_MOVE_MINC(6)
+#define BOOST_MOVE_MINC8 BOOST_MOVE_MINC7, BOOST_MOVE_MINC(7)
+#define BOOST_MOVE_MINC9 BOOST_MOVE_MINC8, BOOST_MOVE_MINC(8)
+
+//BOOST_MOVE_MITFWDN
+#define BOOST_MOVE_MITFWD0
+#define BOOST_MOVE_MITFWD1 BOOST_MOVE_MITFWD(0)
+#define BOOST_MOVE_MITFWD2 BOOST_MOVE_MITFWD1, BOOST_MOVE_MITFWD(1)
+#define BOOST_MOVE_MITFWD3 BOOST_MOVE_MITFWD2, BOOST_MOVE_MITFWD(2)
+#define BOOST_MOVE_MITFWD4 BOOST_MOVE_MITFWD3, BOOST_MOVE_MITFWD(3)
+#define BOOST_MOVE_MITFWD5 BOOST_MOVE_MITFWD4, BOOST_MOVE_MITFWD(4)
+#define BOOST_MOVE_MITFWD6 BOOST_MOVE_MITFWD5, BOOST_MOVE_MITFWD(5)
+#define BOOST_MOVE_MITFWD7 BOOST_MOVE_MITFWD6, BOOST_MOVE_MITFWD(6)
+#define BOOST_MOVE_MITFWD8 BOOST_MOVE_MITFWD7, BOOST_MOVE_MITFWD(7)
+#define BOOST_MOVE_MITFWD9 BOOST_MOVE_MITFWD8, BOOST_MOVE_MITFWD(8)
+
+
+//BOOST_MOVE_FWD_INITN
+#define BOOST_MOVE_FWD_INIT0
+#define BOOST_MOVE_FWD_INIT1 m_p0(::boost::forward<P0>(p0))
+#define BOOST_MOVE_FWD_INIT2 BOOST_MOVE_FWD_INIT1, m_p1(::boost::forward<P1>(p1))
+#define BOOST_MOVE_FWD_INIT3 BOOST_MOVE_FWD_INIT2, m_p2(::boost::forward<P2>(p2))
+#define BOOST_MOVE_FWD_INIT4 BOOST_MOVE_FWD_INIT3, m_p3(::boost::forward<P3>(p3))
+#define BOOST_MOVE_FWD_INIT5 BOOST_MOVE_FWD_INIT4, m_p4(::boost::forward<P4>(p4))
+#define BOOST_MOVE_FWD_INIT6 BOOST_MOVE_FWD_INIT5, m_p5(::boost::forward<P5>(p5))
+#define BOOST_MOVE_FWD_INIT7 BOOST_MOVE_FWD_INIT6, m_p6(::boost::forward<P6>(p6))
+#define BOOST_MOVE_FWD_INIT8 BOOST_MOVE_FWD_INIT7, m_p7(::boost::forward<P7>(p7))
+#define BOOST_MOVE_FWD_INIT9 BOOST_MOVE_FWD_INIT8, m_p8(::boost::forward<P8>(p8))
+
+//BOOST_MOVE_VAL_INITN
+#define BOOST_MOVE_VAL_INIT0
+#define BOOST_MOVE_VAL_INIT1 m_p0(p0)
+#define BOOST_MOVE_VAL_INIT2 BOOST_MOVE_VAL_INIT1, m_p1(p1)
+#define BOOST_MOVE_VAL_INIT3 BOOST_MOVE_VAL_INIT2, m_p2(p2)
+#define BOOST_MOVE_VAL_INIT4 BOOST_MOVE_VAL_INIT3, m_p3(p3)
+#define BOOST_MOVE_VAL_INIT5 BOOST_MOVE_VAL_INIT4, m_p4(p4)
+#define BOOST_MOVE_VAL_INIT6 BOOST_MOVE_VAL_INIT5, m_p5(p5)
+#define BOOST_MOVE_VAL_INIT7 BOOST_MOVE_VAL_INIT6, m_p6(p6)
+#define BOOST_MOVE_VAL_INIT8 BOOST_MOVE_VAL_INIT7, m_p7(p7)
+#define BOOST_MOVE_VAL_INIT9 BOOST_MOVE_VAL_INIT8, m_p8(p8)
+
+//BOOST_MOVE_UREFN
+#define BOOST_MOVE_UREF0
+#define BOOST_MOVE_UREF1 BOOST_FWD_REF(P0) p0
+#define BOOST_MOVE_UREF2 BOOST_MOVE_UREF1, BOOST_FWD_REF(P1) p1
+#define BOOST_MOVE_UREF3 BOOST_MOVE_UREF2, BOOST_FWD_REF(P2) p2
+#define BOOST_MOVE_UREF4 BOOST_MOVE_UREF3, BOOST_FWD_REF(P3) p3
+#define BOOST_MOVE_UREF5 BOOST_MOVE_UREF4, BOOST_FWD_REF(P4) p4
+#define BOOST_MOVE_UREF6 BOOST_MOVE_UREF5, BOOST_FWD_REF(P5) p5
+#define BOOST_MOVE_UREF7 BOOST_MOVE_UREF6, BOOST_FWD_REF(P6) p6
+#define BOOST_MOVE_UREF8 BOOST_MOVE_UREF7, BOOST_FWD_REF(P7) p7
+#define BOOST_MOVE_UREF9 BOOST_MOVE_UREF8, BOOST_FWD_REF(P8) p8
+
+//BOOST_MOVE_VALN
+#define BOOST_MOVE_VAL0
+#define BOOST_MOVE_VAL1 P0 p0
+#define BOOST_MOVE_VAL2 BOOST_MOVE_VAL1, BOOST_FWD_REF(P1) p1
+#define BOOST_MOVE_VAL3 BOOST_MOVE_VAL2, BOOST_FWD_REF(P2) p2
+#define BOOST_MOVE_VAL4 BOOST_MOVE_VAL3, BOOST_FWD_REF(P3) p3
+#define BOOST_MOVE_VAL5 BOOST_MOVE_VAL4, BOOST_FWD_REF(P4) p4
+#define BOOST_MOVE_VAL6 BOOST_MOVE_VAL5, BOOST_FWD_REF(P5) p5
+#define BOOST_MOVE_VAL7 BOOST_MOVE_VAL6, BOOST_FWD_REF(P6) p6
+#define BOOST_MOVE_VAL8 BOOST_MOVE_VAL7, BOOST_FWD_REF(P7) p7
+#define BOOST_MOVE_VAL9 BOOST_MOVE_VAL8, BOOST_FWD_REF(P8) p8
+
+//BOOST_MOVE_UREFQN
+#define BOOST_MOVE_UREFQ0
+#define BOOST_MOVE_UREFQ1 BOOST_FWD_REF(Q0) q0
+#define BOOST_MOVE_UREFQ2 BOOST_MOVE_UREFQ1, BOOST_FWD_REF(Q1) q1
+#define BOOST_MOVE_UREFQ3 BOOST_MOVE_UREFQ2, BOOST_FWD_REF(Q2) q2
+#define BOOST_MOVE_UREFQ4 BOOST_MOVE_UREFQ3, BOOST_FWD_REF(Q3) q3
+#define BOOST_MOVE_UREFQ5 BOOST_MOVE_UREFQ4, BOOST_FWD_REF(Q4) q4
+#define BOOST_MOVE_UREFQ6 BOOST_MOVE_UREFQ5, BOOST_FWD_REF(Q5) q5
+#define BOOST_MOVE_UREFQ7 BOOST_MOVE_UREFQ6, BOOST_FWD_REF(Q6) q6
+#define BOOST_MOVE_UREFQ8 BOOST_MOVE_UREFQ7, BOOST_FWD_REF(Q7) q7
+#define BOOST_MOVE_UREFQ9 BOOST_MOVE_UREFQ8, BOOST_FWD_REF(Q8) q8
+
+//BOOST_MOVE_CREFN
+#define BOOST_MOVE_UNVOIDCREF(T) const typename boost::move_detail::unvoid<T>::type&
+#define BOOST_MOVE_CREF0
+#define BOOST_MOVE_CREF1 BOOST_MOVE_UNVOIDCREF(P0) p0
+#define BOOST_MOVE_CREF2 BOOST_MOVE_CREF1, BOOST_MOVE_UNVOIDCREF(P1) p1
+#define BOOST_MOVE_CREF3 BOOST_MOVE_CREF2, BOOST_MOVE_UNVOIDCREF(P2) p2
+#define BOOST_MOVE_CREF4 BOOST_MOVE_CREF3, BOOST_MOVE_UNVOIDCREF(P3) p3
+#define BOOST_MOVE_CREF5 BOOST_MOVE_CREF4, BOOST_MOVE_UNVOIDCREF(P4) p4
+#define BOOST_MOVE_CREF6 BOOST_MOVE_CREF5, BOOST_MOVE_UNVOIDCREF(P5) p5
+#define BOOST_MOVE_CREF7 BOOST_MOVE_CREF6, BOOST_MOVE_UNVOIDCREF(P6) p6
+#define BOOST_MOVE_CREF8 BOOST_MOVE_CREF7, BOOST_MOVE_UNVOIDCREF(P7) p7
+#define BOOST_MOVE_CREF9 BOOST_MOVE_CREF8, BOOST_MOVE_UNVOIDCREF(P8) p8
+
+//BOOST_MOVE_CLASSN
+#define BOOST_MOVE_CLASS0
+#define BOOST_MOVE_CLASS1 class P0
+#define BOOST_MOVE_CLASS2 BOOST_MOVE_CLASS1, class P1
+#define BOOST_MOVE_CLASS3 BOOST_MOVE_CLASS2, class P2
+#define BOOST_MOVE_CLASS4 BOOST_MOVE_CLASS3, class P3
+#define BOOST_MOVE_CLASS5 BOOST_MOVE_CLASS4, class P4
+#define BOOST_MOVE_CLASS6 BOOST_MOVE_CLASS5, class P5
+#define BOOST_MOVE_CLASS7 BOOST_MOVE_CLASS6, class P6
+#define BOOST_MOVE_CLASS8 BOOST_MOVE_CLASS7, class P7
+#define BOOST_MOVE_CLASS9 BOOST_MOVE_CLASS8, class P8
+
+//BOOST_MOVE_CLASSQN
+#define BOOST_MOVE_CLASSQ0
+#define BOOST_MOVE_CLASSQ1 class Q0
+#define BOOST_MOVE_CLASSQ2 BOOST_MOVE_CLASSQ1, class Q1
+#define BOOST_MOVE_CLASSQ3 BOOST_MOVE_CLASSQ2, class Q2
+#define BOOST_MOVE_CLASSQ4 BOOST_MOVE_CLASSQ3, class Q3
+#define BOOST_MOVE_CLASSQ5 BOOST_MOVE_CLASSQ4, class Q4
+#define BOOST_MOVE_CLASSQ6 BOOST_MOVE_CLASSQ5, class Q5
+#define BOOST_MOVE_CLASSQ7 BOOST_MOVE_CLASSQ6, class Q6
+#define BOOST_MOVE_CLASSQ8 BOOST_MOVE_CLASSQ7, class Q7
+#define BOOST_MOVE_CLASSQ9 BOOST_MOVE_CLASSQ8, class Q8
+
+//BOOST_MOVE_CLASSDFLTN
+#define BOOST_MOVE_CLASSDFLT0
+#define BOOST_MOVE_CLASSDFLT1 class P0 = void
+#define BOOST_MOVE_CLASSDFLT2 BOOST_MOVE_CLASSDFLT1, class P1 = void
+#define BOOST_MOVE_CLASSDFLT3 BOOST_MOVE_CLASSDFLT2, class P2 = void
+#define BOOST_MOVE_CLASSDFLT4 BOOST_MOVE_CLASSDFLT3, class P3 = void
+#define BOOST_MOVE_CLASSDFLT5 BOOST_MOVE_CLASSDFLT4, class P4 = void
+#define BOOST_MOVE_CLASSDFLT6 BOOST_MOVE_CLASSDFLT5, class P5 = void
+#define BOOST_MOVE_CLASSDFLT7 BOOST_MOVE_CLASSDFLT6, class P6 = void
+#define BOOST_MOVE_CLASSDFLT8 BOOST_MOVE_CLASSDFLT7, class P7 = void
+#define BOOST_MOVE_CLASSDFLT9 BOOST_MOVE_CLASSDFLT8, class P8 = void
+
+//BOOST_MOVE_TARGN
+#define BOOST_MOVE_TARG0
+#define BOOST_MOVE_TARG1 P0
+#define BOOST_MOVE_TARG2 BOOST_MOVE_TARG1, P1
+#define BOOST_MOVE_TARG3 BOOST_MOVE_TARG2, P2
+#define BOOST_MOVE_TARG4 BOOST_MOVE_TARG3, P3
+#define BOOST_MOVE_TARG5 BOOST_MOVE_TARG4, P4
+#define BOOST_MOVE_TARG6 BOOST_MOVE_TARG5, P5
+#define BOOST_MOVE_TARG7 BOOST_MOVE_TARG6, P6
+#define BOOST_MOVE_TARG8 BOOST_MOVE_TARG7, P7
+#define BOOST_MOVE_TARG9 BOOST_MOVE_TARG8, P8
+
+//BOOST_MOVE_FWD_TN
+#define BOOST_MOVE_FWD_T0
+#define BOOST_MOVE_FWD_T1 typename ::boost::move_detail::forward_type<P0>::type
+#define BOOST_MOVE_FWD_T2 BOOST_MOVE_FWD_T1, typename ::boost::move_detail::forward_type<P1>::type
+#define BOOST_MOVE_FWD_T3 BOOST_MOVE_FWD_T2, typename ::boost::move_detail::forward_type<P2>::type
+#define BOOST_MOVE_FWD_T4 BOOST_MOVE_FWD_T3, typename ::boost::move_detail::forward_type<P3>::type
+#define BOOST_MOVE_FWD_T5 BOOST_MOVE_FWD_T4, typename ::boost::move_detail::forward_type<P4>::type
+#define BOOST_MOVE_FWD_T6 BOOST_MOVE_FWD_T5, typename ::boost::move_detail::forward_type<P5>::type
+#define BOOST_MOVE_FWD_T7 BOOST_MOVE_FWD_T6, typename ::boost::move_detail::forward_type<P6>::type
+#define BOOST_MOVE_FWD_T8 BOOST_MOVE_FWD_T7, typename ::boost::move_detail::forward_type<P7>::type
+#define BOOST_MOVE_FWD_T9 BOOST_MOVE_FWD_T8, typename ::boost::move_detail::forward_type<P8>::type
+
+//BOOST_MOVE_MREFX
+#define BOOST_MOVE_MREF0
+#define BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P0) m_p0;
+#define BOOST_MOVE_MREF2 BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P1) m_p1;
+#define BOOST_MOVE_MREF3 BOOST_MOVE_MREF2 BOOST_MOVE_MREF(P2) m_p2;
+#define BOOST_MOVE_MREF4 BOOST_MOVE_MREF3 BOOST_MOVE_MREF(P3) m_p3;
+#define BOOST_MOVE_MREF5 BOOST_MOVE_MREF4 BOOST_MOVE_MREF(P4) m_p4;
+#define BOOST_MOVE_MREF6 BOOST_MOVE_MREF5 BOOST_MOVE_MREF(P5) m_p5;
+#define BOOST_MOVE_MREF7 BOOST_MOVE_MREF6 BOOST_MOVE_MREF(P6) m_p6;
+#define BOOST_MOVE_MREF8 BOOST_MOVE_MREF7 BOOST_MOVE_MREF(P7) m_p7;
+#define BOOST_MOVE_MREF9 BOOST_MOVE_MREF8 BOOST_MOVE_MREF(P8) m_p8;
+
+//BOOST_MOVE_MEMBX
+#define BOOST_MOVE_MEMB0
+#define BOOST_MOVE_MEMB1 P0 m_p0;
+#define BOOST_MOVE_MEMB2 BOOST_MOVE_MEMB1 P1 m_p1;
+#define BOOST_MOVE_MEMB3 BOOST_MOVE_MEMB2 P2 m_p2;
+#define BOOST_MOVE_MEMB4 BOOST_MOVE_MEMB3 P3 m_p3;
+#define BOOST_MOVE_MEMB5 BOOST_MOVE_MEMB4 P4 m_p4;
+#define BOOST_MOVE_MEMB6 BOOST_MOVE_MEMB5 P5 m_p5;
+#define BOOST_MOVE_MEMB7 BOOST_MOVE_MEMB6 P6 m_p6;
+#define BOOST_MOVE_MEMB8 BOOST_MOVE_MEMB7 P7 m_p7;
+#define BOOST_MOVE_MEMB9 BOOST_MOVE_MEMB8 P8 m_p8;
+
+//BOOST_MOVE_TMPL_LTN
+#define BOOST_MOVE_TMPL_LT0
+#define BOOST_MOVE_TMPL_LT1 template<
+#define BOOST_MOVE_TMPL_LT2 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT3 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT4 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT5 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT6 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT7 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT8 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT9 BOOST_MOVE_TMPL_LT1
+
+//BOOST_MOVE_LTN
+#define BOOST_MOVE_LT0
+#define BOOST_MOVE_LT1 <
+#define BOOST_MOVE_LT2 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT3 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT4 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT5 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT6 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT7 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT8 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT9 BOOST_MOVE_LT1
+
+//BOOST_MOVE_GTN
+#define BOOST_MOVE_GT0
+#define BOOST_MOVE_GT1 >
+#define BOOST_MOVE_GT2 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT3 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT4 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT5 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT6 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT7 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT8 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT9 BOOST_MOVE_GT1
+
+//BOOST_MOVE_LPN
+#define BOOST_MOVE_LP0
+#define BOOST_MOVE_LP1 (
+#define BOOST_MOVE_LP2 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP3 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP4 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP5 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP6 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP7 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP8 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP9 BOOST_MOVE_LP1
+
+//BOOST_MOVE_RPN
+#define BOOST_MOVE_RP0
+#define BOOST_MOVE_RP1 )
+#define BOOST_MOVE_RP2 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP3 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP4 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP5 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP6 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP7 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP8 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP9 BOOST_MOVE_RP1
+
+//BOOST_MOVE_IN
+#define BOOST_MOVE_I0
+#define BOOST_MOVE_I1 ,
+#define BOOST_MOVE_I2 BOOST_MOVE_I1
+#define BOOST_MOVE_I3 BOOST_MOVE_I1
+#define BOOST_MOVE_I4 BOOST_MOVE_I1
+#define BOOST_MOVE_I5 BOOST_MOVE_I1
+#define BOOST_MOVE_I6 BOOST_MOVE_I1
+#define BOOST_MOVE_I7 BOOST_MOVE_I1
+#define BOOST_MOVE_I8 BOOST_MOVE_I1
+#define BOOST_MOVE_I9 BOOST_MOVE_I1
+
+//BOOST_MOVE_COLON
+#define BOOST_MOVE_COLON0
+#define BOOST_MOVE_COLON1 :
+#define BOOST_MOVE_COLON2 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON3 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON4 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON5 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON6 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON7 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON8 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON9 BOOST_MOVE_COLON1
+
+//BOOST_MOVE_ITERATE_2TON
+#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC)   MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_2TO3(MACROFUNC)   BOOST_MOVE_ITERATE_2TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_2TO4(MACROFUNC)   BOOST_MOVE_ITERATE_2TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_2TO5(MACROFUNC)   BOOST_MOVE_ITERATE_2TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_2TO6(MACROFUNC)   BOOST_MOVE_ITERATE_2TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_2TO7(MACROFUNC)   BOOST_MOVE_ITERATE_2TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_2TO8(MACROFUNC)   BOOST_MOVE_ITERATE_2TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_2TO9(MACROFUNC)   BOOST_MOVE_ITERATE_2TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_1TON
+#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC)   MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_1TO2(MACROFUNC)   BOOST_MOVE_ITERATE_1TO1(MACROFUNC)  MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_1TO3(MACROFUNC)   BOOST_MOVE_ITERATE_1TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_1TO4(MACROFUNC)   BOOST_MOVE_ITERATE_1TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_1TO5(MACROFUNC)   BOOST_MOVE_ITERATE_1TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_1TO6(MACROFUNC)   BOOST_MOVE_ITERATE_1TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_1TO7(MACROFUNC)   BOOST_MOVE_ITERATE_1TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_1TO8(MACROFUNC)   BOOST_MOVE_ITERATE_1TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_1TO9(MACROFUNC)   BOOST_MOVE_ITERATE_1TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_0TON
+#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC)   MACROFUNC(0)
+#define BOOST_MOVE_ITERATE_0TO1(MACROFUNC)   BOOST_MOVE_ITERATE_0TO0(MACROFUNC)  MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_0TO2(MACROFUNC)   BOOST_MOVE_ITERATE_0TO1(MACROFUNC)  MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_0TO3(MACROFUNC)   BOOST_MOVE_ITERATE_0TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_0TO4(MACROFUNC)   BOOST_MOVE_ITERATE_0TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_0TO5(MACROFUNC)   BOOST_MOVE_ITERATE_0TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_0TO6(MACROFUNC)   BOOST_MOVE_ITERATE_0TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_0TO7(MACROFUNC)   BOOST_MOVE_ITERATE_0TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_0TO8(MACROFUNC)   BOOST_MOVE_ITERATE_0TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_0TO9(MACROFUNC)   BOOST_MOVE_ITERATE_0TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_NTON
+#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC)   MACROFUNC(0)
+#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC)   MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC)   MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_3TO3(MACROFUNC)   MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_4TO4(MACROFUNC)   MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_5TO5(MACROFUNC)   MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_6TO6(MACROFUNC)   MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_7TO7(MACROFUNC)   MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_8TO8(MACROFUNC)   MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_9TO9(MACROFUNC)   MACROFUNC(9)
+
+//BOOST_MOVE_CAT
+#define BOOST_MOVE_CAT(a, b) BOOST_MOVE_CAT_I(a, b)
+#define BOOST_MOVE_CAT_I(a, b) a ## b
+//#    define BOOST_MOVE_CAT_I(a, b) BOOST_MOVE_CAT_II(~, a ## b)
+//#    define BOOST_MOVE_CAT_II(p, res) res
+
+#endif //#ifndef BOOST_MOVE_DETAIL_FWD_MACROS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/iterator_traits.hpp b/gatb-core/thirdparty/boost/move/detail/iterator_traits.hpp
new file mode 100644
index 0000000..2c5dc3e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/iterator_traits.hpp
@@ -0,0 +1,87 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
+#define BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>
+
+#if defined(__clang__) && defined(_LIBCPP_VERSION)
+   #define BOOST_MOVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic push
+   #pragma GCC diagnostic ignored "-Wc++11-extensions"
+   #define BOOST_MOVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+   #define BOOST_MOVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#else
+   #define BOOST_MOVE_STD_NS_BEG namespace std{
+   #define BOOST_MOVE_STD_NS_END }
+#endif
+
+BOOST_MOVE_STD_NS_BEG
+
+struct input_iterator_tag;
+struct forward_iterator_tag;
+struct bidirectional_iterator_tag;
+struct random_access_iterator_tag;
+struct output_iterator_tag;
+
+BOOST_MOVE_STD_NS_END
+
+#ifdef BOOST_MOVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic pop
+   #undef BOOST_MOVE_CLANG_INLINE_STD_NS
+#endif   //BOOST_MOVE_CLANG_INLINE_STD_NS
+
+namespace boost{  namespace movelib{
+
+template<class Iterator>
+struct iterator_traits
+{
+   typedef typename Iterator::difference_type   difference_type;
+   typedef typename Iterator::value_type        value_type;
+   typedef typename Iterator::pointer           pointer;
+   typedef typename Iterator::reference         reference;
+   typedef typename Iterator::iterator_category iterator_category;
+};
+
+template<class T>
+struct iterator_traits<T*>
+{
+   typedef std::ptrdiff_t                    difference_type;
+   typedef T                                 value_type;
+   typedef T*                                pointer;
+   typedef T&                                reference;
+   typedef std::random_access_iterator_tag   iterator_category;
+};
+
+template<class T>
+struct iterator_traits<const T*>
+{
+   typedef std::ptrdiff_t                    difference_type;
+   typedef T                                 value_type;
+   typedef const T*                          pointer;
+   typedef const T&                          reference;
+   typedef std::random_access_iterator_tag   iterator_category;
+};
+
+}} //namespace boost {  namespace movelib{
+
+#endif //#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/meta_utils.hpp b/gatb-core/thirdparty/boost/move/detail/meta_utils.hpp
new file mode 100644
index 0000000..a8a61db
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/meta_utils.hpp
@@ -0,0 +1,559 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_DETAIL_META_UTILS_HPP
+#define BOOST_MOVE_DETAIL_META_UTILS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+#include <boost/move/detail/meta_utils_core.hpp>
+#include <cstddef>   //for std::size_t
+
+//Small meta-typetraits to support move
+
+namespace boost {
+
+//Forward declare boost::rv
+template <class T> class rv;
+
+namespace move_detail {
+
+//////////////////////////////////////
+//          is_different
+//////////////////////////////////////
+template<class T, class U>
+struct is_different
+{
+   static const bool value = !is_same<T, U>::value;
+};
+
+//////////////////////////////////////
+//             apply
+//////////////////////////////////////
+template<class F, class Param>
+struct apply
+{
+   typedef typename F::template apply<Param>::type type;
+};
+
+//////////////////////////////////////
+//             bool_
+//////////////////////////////////////
+
+template< bool C_ >
+struct bool_ : integral_constant<bool, C_>
+{
+     operator bool() const { return C_; }
+   bool operator()() const { return C_; }
+};
+
+typedef bool_<true>        true_;
+typedef bool_<false>       false_;
+
+//////////////////////////////////////
+//              nat
+//////////////////////////////////////
+struct nat{};
+
+//////////////////////////////////////
+//          yes_type/no_type
+//////////////////////////////////////
+typedef char yes_type;
+
+struct no_type
+{
+   char _[2];
+};
+
+//////////////////////////////////////
+//            natify
+//////////////////////////////////////
+template <class T> struct natify{};
+
+//////////////////////////////////////
+//          remove_reference
+//////////////////////////////////////
+template<class T>
+struct remove_reference
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference<T&>
+{
+   typedef T type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct remove_reference<T&&>
+{
+   typedef T type;
+};
+
+#else
+
+template<class T>
+struct remove_reference< rv<T> >
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< rv<T> &>
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< const rv<T> &>
+{
+   typedef T type;
+};
+
+#endif
+
+//////////////////////////////////////
+//             remove_pointer
+//////////////////////////////////////
+
+template< class T > struct remove_pointer                    { typedef T type;   };
+template< class T > struct remove_pointer<T*>                { typedef T type;   };
+template< class T > struct remove_pointer<T* const>          { typedef T type;   };
+template< class T > struct remove_pointer<T* volatile>       { typedef T type;   };
+template< class T > struct remove_pointer<T* const volatile> { typedef T type;   };
+
+//////////////////////////////////////
+//             add_pointer
+//////////////////////////////////////
+template< class T >
+struct add_pointer
+{
+   typedef typename remove_reference<T>::type* type;
+};
+
+//////////////////////////////////////
+//             add_const
+//////////////////////////////////////
+template<class T>
+struct add_const
+{
+   typedef const T type;
+};
+
+template<class T>
+struct add_const<T&>
+{
+   typedef const T& type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct add_const<T&&>
+{
+   typedef T&& type;
+};
+
+#endif
+
+//////////////////////////////////////
+//      add_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct add_lvalue_reference
+{  typedef T& type;  };
+
+template<class T> struct add_lvalue_reference<T&>                 {  typedef T& type;  };
+template<>        struct add_lvalue_reference<void>               {  typedef void type;   };
+template<>        struct add_lvalue_reference<const void>         {  typedef const void type;  };
+template<>        struct add_lvalue_reference<volatile void>      {  typedef volatile void type;   };
+template<>        struct add_lvalue_reference<const volatile void>{  typedef const volatile void type;   };
+
+template<class T>
+struct add_const_lvalue_reference
+{
+   typedef typename remove_reference<T>::type         t_unreferenced;
+   typedef typename add_const<t_unreferenced>::type   t_unreferenced_const;
+   typedef typename add_lvalue_reference
+      <t_unreferenced_const>::type                    type;
+};
+
+//////////////////////////////////////
+//             is_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct is_lvalue_reference
+{
+    static const bool value = false;
+};
+
+template<class T>
+struct is_lvalue_reference<T&>
+{
+    static const bool value = true;
+};
+
+
+//////////////////////////////////////
+//             identity
+//////////////////////////////////////
+template <class T>
+struct identity
+{
+   typedef T type;
+   typedef typename add_const_lvalue_reference<T>::type reference;
+   reference operator()(reference t)
+   {  return t;   }
+};
+
+//////////////////////////////////////
+//          is_class_or_union
+//////////////////////////////////////
+template<class T>
+struct is_class_or_union
+{
+   struct twochar { char dummy[2]; };
+   template <class U>
+   static char is_class_or_union_tester(void(U::*)(void));
+   template <class U>
+   static twochar is_class_or_union_tester(...);
+   static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);
+};
+
+//////////////////////////////////////
+//             addressof
+//////////////////////////////////////
+template<class T>
+struct addr_impl_ref
+{
+   T & v_;
+   inline addr_impl_ref( T & v ): v_( v ) {}
+   inline operator T& () const { return v_; }
+
+   private:
+   addr_impl_ref & operator=(const addr_impl_ref &);
+};
+
+template<class T>
+struct addressof_impl
+{
+   static inline T * f( T & v, long )
+   {
+      return reinterpret_cast<T*>(
+         &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
+   }
+
+   static inline T * f( T * v, int )
+   {  return v;  }
+};
+
+template<class T>
+inline T * addressof( T & v )
+{
+   return ::boost::move_detail::addressof_impl<T>::f
+      ( ::boost::move_detail::addr_impl_ref<T>( v ), 0 );
+}
+
+//////////////////////////////////////
+//          has_pointer_type
+//////////////////////////////////////
+template <class T>
+struct has_pointer_type
+{
+   struct two { char c[2]; };
+   template <class U> static two test(...);
+   template <class U> static char test(typename U::pointer* = 0);
+   static const bool value = sizeof(test<T>(0)) == 1;
+};
+
+//////////////////////////////////////
+//           is_convertible
+//////////////////////////////////////
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+//use intrinsic since in MSVC
+//overaligned types can't go through ellipsis
+template <class T, class U>
+struct is_convertible
+{
+   static const bool value = __is_convertible_to(T, U);
+};
+
+#else
+
+template <class T, class U>
+class is_convertible
+{
+   typedef typename add_lvalue_reference<T>::type t_reference;
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static false_t dispatch(...);
+   static true_t  dispatch(U);
+   static t_reference       trigger();
+   public:
+   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
+};
+
+#endif
+
+template<
+      bool C
+    , typename F1
+    , typename F2
+    >
+struct eval_if_c
+    : if_c<C,F1,F2>::type
+{};
+
+template<
+      typename C
+    , typename T1
+    , typename T2
+    >
+struct eval_if
+    : if_<C,T1,T2>::type
+{};
+
+template<class T, class U, class R = void>
+struct enable_if_convertible
+   : enable_if< is_convertible<T, U>, R>
+{};
+
+template<class T, class U, class R = void>
+struct disable_if_convertible
+   : disable_if< is_convertible<T, U>, R>
+{};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         and_
+//
+//////////////////////////////////////////////////////////////////////////////
+template<bool, class B = true_, class C = true_, class D = true_>
+struct and_impl
+   : and_impl<B::value, C, D>
+{};
+
+template<>
+struct and_impl<true, true_, true_, true_>
+{
+   static const bool value = true;
+};
+
+template<class B, class C, class D>
+struct and_impl<false, B, C, D>
+{
+   static const bool value = false;
+};
+
+template<class A, class B, class C = true_, class D = true_>
+struct and_
+   : and_impl<A::value, B, C, D>
+{};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            or_
+//
+//////////////////////////////////////////////////////////////////////////////
+template<bool, class B = false_, class C = false_, class D = false_>
+struct or_impl
+   : or_impl<B::value, C, D>
+{};
+
+template<>
+struct or_impl<false, false_, false_, false_>
+{
+   static const bool value = false;
+};
+
+template<class B, class C, class D>
+struct or_impl<true, B, C, D>
+{
+   static const bool value = true;
+};
+
+template<class A, class B, class C = false_, class D = false_>
+struct or_
+   : or_impl<A::value, B, C, D>
+{};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         not_
+//
+//////////////////////////////////////////////////////////////////////////////
+template<class T>
+struct not_
+{
+   static const bool value = !T::value;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// enable_if_and / disable_if_and / enable_if_or / disable_if_or
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template<class R, class A, class B, class C = true_, class D = true_>
+struct enable_if_and
+   : enable_if_c< and_<A, B, C, D>::value, R>
+{};
+
+template<class R, class A, class B, class C = true_, class D = true_>
+struct disable_if_and
+   : disable_if_c< and_<A, B, C, D>::value, R>
+{};
+
+template<class R, class A, class B, class C = false_, class D = false_>
+struct enable_if_or
+   : enable_if_c< or_<A, B, C, D>::value, R>
+{};
+
+template<class R, class A, class B, class C = false_, class D = false_>
+struct disable_if_or
+   : disable_if_c< or_<A, B, C, D>::value, R>
+{};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                      has_move_emulation_enabled_impl
+//
+//////////////////////////////////////////////////////////////////////////////
+template<class T>
+struct has_move_emulation_enabled_impl
+   : is_convertible< T, ::boost::rv<T>& >
+{};
+
+template<class T>
+struct has_move_emulation_enabled_impl<T&>
+{  static const bool value = false;  };
+
+template<class T>
+struct has_move_emulation_enabled_impl< ::boost::rv<T> >
+{  static const bool value = false;  };
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            is_rv_impl
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template <class T>
+struct is_rv_impl
+{  static const bool value = false;  };
+
+template <class T>
+struct is_rv_impl< rv<T> >
+{  static const bool value = true;  };
+
+template <class T>
+struct is_rv_impl< const rv<T> >
+{  static const bool value = true;  };
+
+// Code from Jeffrey Lee Hellrung, many thanks
+
+template< class T >
+struct is_rvalue_reference
+{  static const bool value = false;  };
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T >
+struct is_rvalue_reference< T&& >
+{  static const bool value = true;  };
+
+#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T >
+struct is_rvalue_reference< boost::rv<T>& >
+{  static const bool value = true;  };
+
+template< class T >
+struct is_rvalue_reference< const boost::rv<T>& >
+{  static const bool value = true;  };
+
+#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T >
+struct add_rvalue_reference
+{ typedef T&& type; };
+
+#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+namespace detail_add_rvalue_reference
+{
+   template< class T
+            , bool emulation = has_move_emulation_enabled_impl<T>::value
+            , bool rv        = is_rv_impl<T>::value  >
+   struct add_rvalue_reference_impl { typedef T type; };
+
+   template< class T, bool emulation>
+   struct add_rvalue_reference_impl< T, emulation, true > { typedef T & type; };
+
+   template< class T, bool rv >
+   struct add_rvalue_reference_impl< T, true, rv > { typedef ::boost::rv<T>& type; };
+} // namespace detail_add_rvalue_reference
+
+template< class T >
+struct add_rvalue_reference
+   : detail_add_rvalue_reference::add_rvalue_reference_impl<T>
+{ };
+
+template< class T >
+struct add_rvalue_reference<T &>
+{  typedef T & type; };
+
+#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T > struct remove_rvalue_reference { typedef T type; };
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   template< class T > struct remove_rvalue_reference< T&& >                  { typedef T type; };
+#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   template< class T > struct remove_rvalue_reference< rv<T> >                { typedef T type; };
+   template< class T > struct remove_rvalue_reference< const rv<T> >          { typedef T type; };
+   template< class T > struct remove_rvalue_reference< volatile rv<T> >       { typedef T type; };
+   template< class T > struct remove_rvalue_reference< const volatile rv<T> > { typedef T type; };
+   template< class T > struct remove_rvalue_reference< rv<T>& >               { typedef T type; };
+   template< class T > struct remove_rvalue_reference< const rv<T>& >         { typedef T type; };
+   template< class T > struct remove_rvalue_reference< volatile rv<T>& >      { typedef T type; };
+   template< class T > struct remove_rvalue_reference< const volatile rv<T>& >{ typedef T type; };
+#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+// Ideas from Boost.Move review, Jeffrey Lee Hellrung:
+//
+//- TypeTraits metafunctions is_lvalue_reference, add_lvalue_reference, and remove_lvalue_reference ?
+//  Perhaps add_reference and remove_reference can be modified so that they behave wrt emulated rvalue
+//  references the same as wrt real rvalue references, i.e., add_reference< rv<T>& > -> T& rather than
+//  rv<T>& (since T&& & -> T&).
+//
+//- Add'l TypeTraits has_[trivial_]move_{constructor,assign}...?
+//
+//- An as_lvalue(T& x) function, which amounts to an identity operation in C++0x, but strips emulated
+//  rvalue references in C++03.  This may be necessary to prevent "accidental moves".
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/meta_utils_core.hpp b/gatb-core/thirdparty/boost/move/detail/meta_utils_core.hpp
new file mode 100644
index 0000000..4d715a0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/meta_utils_core.hpp
@@ -0,0 +1,120 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
+#define BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//Small meta-typetraits to support move
+
+namespace boost {
+namespace move_detail {
+
+//////////////////////////////////////
+//             if_c
+//////////////////////////////////////
+template<bool C, typename T1, typename T2>
+struct if_c
+{
+   typedef T1 type;
+};
+
+template<typename T1, typename T2>
+struct if_c<false,T1,T2>
+{
+   typedef T2 type;
+};
+
+//////////////////////////////////////
+//             if_
+//////////////////////////////////////
+template<typename T1, typename T2, typename T3>
+struct if_ : if_c<0 != T1::value, T2, T3>
+{};
+
+//////////////////////////////////////
+//          enable_if_c
+//////////////////////////////////////
+template <bool B, class T = void>
+struct enable_if_c
+{
+   typedef T type;
+};
+
+template <class T>
+struct enable_if_c<false, T> {};
+
+//////////////////////////////////////
+//           enable_if
+//////////////////////////////////////
+template <class Cond, class T = void>
+struct enable_if : enable_if_c<Cond::value, T> {};
+
+//////////////////////////////////////
+//          disable_if_c
+//////////////////////////////////////
+template <bool B, class T = void>
+struct disable_if_c
+   : enable_if_c<!B, T>
+{};
+
+//////////////////////////////////////
+//          disable_if
+//////////////////////////////////////
+template <class Cond, class T = void>
+struct disable_if : enable_if_c<!Cond::value, T> {};
+
+//////////////////////////////////////
+//          integral_constant
+//////////////////////////////////////
+template<class T, T v>
+struct integral_constant
+{
+   static const T value = v;
+   typedef T value_type;
+   typedef integral_constant<T, v> type;
+
+     operator T() const { return value; }
+   T operator()() const { return value; }
+};
+
+typedef integral_constant<bool, true >  true_type;
+typedef integral_constant<bool, false > false_type;
+
+
+//////////////////////////////////////
+//             is_same
+//////////////////////////////////////
+template<class T, class U>
+struct is_same
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_same<T, T>
+{
+   static const bool value = true;
+};
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/move_helpers.hpp b/gatb-core/thirdparty/boost/move/detail/move_helpers.hpp
new file mode 100644
index 0000000..e3b8883
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/move_helpers.hpp
@@ -0,0 +1,178 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_MOVE_HELPERS_HPP
+#define BOOST_MOVE_MOVE_HELPERS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/utility_core.hpp>
+#include <boost/move/detail/meta_utils.hpp>
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+#define BOOST_MOVE_CATCH_CONST(U)  \
+   typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
+#define BOOST_MOVE_CATCH_RVALUE(U)\
+   typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_RV_REF(U), ::boost::move_detail::nat>::type
+#define BOOST_MOVE_CATCH_FWD(U) BOOST_FWD_REF(U)
+#else
+#define BOOST_MOVE_CATCH_CONST(U)  const U &
+#define BOOST_MOVE_CATCH_RVALUE(U) U &&
+#define BOOST_MOVE_CATCH_FWD(U)    U &&
+#endif
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(::boost::move(x));  }\
+\
+   RETURN_VALUE PUB_FUNCTION(TYPE &x)\
+   {  return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::enable_if_and\
+                     < RETURN_VALUE \
+                     , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+                     , ::boost::move_detail::is_class_or_union<TYPE>\
+                     , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+                     >::type\
+   PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+   { return FWD_FUNCTION(u); }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::disable_if_or\
+                     < RETURN_VALUE \
+                     , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+                     , ::boost::move_detail::and_ \
+                        < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
+                        , ::boost::move_detail::is_class_or_union<BOOST_MOVE_TEMPL_PARAM> \
+                        > \
+                     >::type\
+   PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+   {\
+      TYPE t(u);\
+      return FWD_FUNCTION(::boost::move(t));\
+   }\
+//
+
+#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
+
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(::boost::move(x));  }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::enable_if_c\
+                     < !::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
+                     , RETURN_VALUE >::type\
+   PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+   {\
+      TYPE t(u);\
+      return FWD_FUNCTION(::boost::move(t));\
+   }\
+//
+
+#else
+
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(::boost::move(x));  }\
+//
+
+#endif
+
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(arg1, ::boost::move(x));  }\
+\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
+   {  return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::enable_if_and\
+                     < RETURN_VALUE \
+                     , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+                     , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+                     >::type\
+   PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+   { return FWD_FUNCTION(arg1, u); }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::disable_if_or\
+                     < RETURN_VALUE \
+                     , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
+                     , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+                     , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
+                     >::type\
+   PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+   {\
+      TYPE t(u);\
+      return FWD_FUNCTION(arg1, ::boost::move(t));\
+   }\
+//
+
+#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
+
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(arg1, ::boost::move(x));  }\
+\
+   template<class BOOST_MOVE_TEMPL_PARAM>\
+   typename ::boost::move_detail::disable_if_or\
+                     < RETURN_VALUE \
+                     , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+                     , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO> \
+                     >::type\
+   PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+   {\
+      TYPE t(u);\
+      return FWD_FUNCTION(arg1, ::boost::move(t));\
+   }\
+//
+
+#else
+
+#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+   {  return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+\
+   RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+   {  return FWD_FUNCTION(arg1, ::boost::move(x));  }\
+//
+
+#endif
+
+#endif //#ifndef BOOST_MOVE_MOVE_HELPERS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/type_traits.hpp b/gatb-core/thirdparty/boost/move/detail/type_traits.hpp
new file mode 100644
index 0000000..ab79fb1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/type_traits.hpp
@@ -0,0 +1,1078 @@
+//////////////////////////////////////////////////////////////////////////////
+// (C) Copyright John Maddock 2000.
+// (C) Copyright Ion Gaztanaga 2005-2015.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+// The alignment and Type traits implementation comes from
+// John Maddock's TypeTraits library.
+//
+// Some other tricks come from Howard Hinnant's papers and StackOverflow replies
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
+#define BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+
+// move/detail
+#include <boost/move/detail/meta_utils.hpp>
+// other
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+// std
+#include <cstddef>
+
+//Use of Boost.TypeTraits leads to long preprocessed source code due to
+//MPL dependencies. We'll use intrinsics directly and make or own
+//simplified version of TypeTraits.
+//If someday Boost.TypeTraits dependencies are minimized, we should
+//revisit this file redirecting code to Boost.TypeTraits traits.
+
+//These traits don't care about volatile, reference or other checks
+//made by Boost.TypeTraits because no volatile or reference types
+//can be hold in Boost.Containers. This helps to avoid any Boost.TypeTraits
+//dependency.
+
+// Helper macros for builtin compiler support.
+// If your compiler has builtin support for any of the following
+// traits concepts, then redefine the appropriate macros to pick
+// up on the compiler support:
+//
+// (these should largely ignore cv-qualifiers)
+// BOOST_MOVE_IS_POD(T) should evaluate to true if T is a POD type
+// BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
+// BOOST_MOVE_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
+// BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
+// BOOST_MOVE_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
+// BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
+// BOOST_MOVE_IS_ENUM(T) should evaluate to true it t is a union type.
+//
+// The following can also be defined: when detected our implementation is greatly simplified.
+//
+// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.
+
+#if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000)
+    // Metrowerks compiler is acquiring intrinsic type traits support
+    // post version 8.  We hook into the published interface to pick up
+    // user defined specializations as well as compiler intrinsics as
+    // and when they become available:
+#   include <msl_utility>
+#   define BOOST_MOVE_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union<T>::value
+#   define BOOST_MOVE_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor<T>::value
+#endif
+
+#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
+         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T)                    (__is_pod(T) && __has_trivial_constructor(T))
+#   define BOOST_MOVE_IS_EMPTY(T)                  __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T)   __has_trivial_constructor(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T)          (__has_trivial_copy(T)|| ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T)        (__has_trivial_assign(T) || ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T)    (__has_trivial_destructor(T) || ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T)   (__has_nothrow_constructor(T) || ::boost::move_detail::is_trivially_default_constructible<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T)          (__has_nothrow_copy(T) || ::boost::move_detail::is_trivially_copy_constructible<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T)        (__has_nothrow_assign(T) || ::boost::move_detail::is_trivially_copy_assignable<T>::value)
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   if defined(_MSC_VER) && (_MSC_VER >= 1700)
+#       define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)   (__has_trivial_move_constructor(T) || ::boost::move_detail::is_pod<T>::value)
+#       define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T)        (__has_trivial_move_assign(T) || ::boost::move_detail::is_pod<T>::value)
+#   endif
+#endif
+
+#if defined(BOOST_CLANG) && defined(__has_feature)
+
+#   if __has_feature(is_union)
+#     define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_pod)
+#     define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_empty)
+#     define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   endif
+#   if __has_feature(has_trivial_constructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_copy)
+#     //There are problems with deleted copy constructors detected as trivially copyable.
+#     //http://stackoverflow.com/questions/12754886/has-trivial-copy-behaves-differently-in-clang-and-gcc-whos-right
+#     define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && ::boost::move_detail::is_copy_constructible<T>::value)
+#   endif
+#   if __has_feature(has_trivial_assign)
+#     define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) )
+#   endif
+#   if __has_feature(has_trivial_destructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   endif
+#   if __has_feature(has_nothrow_constructor)
+#     define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   endif
+#   if __has_feature(has_nothrow_copy)
+#     define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T))
+#   endif
+#   if __has_feature(is_nothrow_copy_assignable)
+#     define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+#   endif
+#   if __has_feature(is_enum)
+#     define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   endif
+#   if __has_feature(has_trivial_move_constructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) __has_trivial_move_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_move_assign)
+#     define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) __has_trivial_move_assign(T)
+#   endif
+#   define BOOST_MOVE_ALIGNMENT_OF(T) __alignof(T)
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
+
+#ifdef BOOST_INTEL
+#  define BOOST_MOVE_INTEL_TT_OPTS || ::boost::move_detail::is_pod<T>::value
+#else
+#  define BOOST_MOVE_INTEL_TT_OPTS
+#endif
+
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_MOVE_INTEL_TT_OPTS) )
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_MOVE_INTEL_TT_OPTS)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_MOVE_INTEL_TT_OPTS)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_MOVE_INTEL_TT_OPTS))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)
+      // GCC sometimes lies about alignment requirements
+      // of type double on 32-bit unix platforms, use the
+      // old implementation instead in that case:
+#     define BOOST_MOVE_ALIGNMENT_OF(T) __alignof__(T)
+#   endif
+#endif
+
+#if defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   define BOOST_MOVE_ALIGNMENT_OF(T) __alignof__(T)
+#endif
+
+# if defined(__CODEGEARC__)
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   define BOOST_MOVE_ALIGNMENT_OF(T) alignof(T)
+
+#endif
+
+//Fallback definitions
+
+#ifdef BOOST_MOVE_IS_UNION
+   #define BOOST_MOVE_IS_UNION_IMPL(T) BOOST_MOVE_IS_UNION(T)
+#else
+   #define BOOST_MOVE_IS_UNION_IMPL(T) false
+#endif
+
+#ifdef BOOST_MOVE_IS_POD
+   //in some compilers the intrinsic is limited to class types so add scalar and void
+   #define BOOST_MOVE_IS_POD_IMPL(T) (::boost::move_detail::is_scalar<T>::value ||\
+                                      ::boost::move_detail::is_void<T>::value   ||\
+                                       BOOST_MOVE_IS_POD(T))
+#else
+   #define BOOST_MOVE_IS_POD_IMPL(T) \
+      (::boost::move_detail::is_scalar<T>::value || ::boost::move_detail::is_void<T>::value)
+#endif
+
+#ifdef BOOST_MOVE_IS_EMPTY
+   #define BOOST_MOVE_IS_EMPTY_IMPL(T) BOOST_MOVE_IS_EMPTY(T)
+#else
+   #define BOOST_MOVE_IS_EMPTY_IMPL(T)    ::boost::move_detail::is_empty_nonintrinsic<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_COPY(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T)  BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_COPY(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_ASSIGN
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)  BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR
+   #define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T)  BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_COPY
+   #define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_NOTHROW_COPY(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_NOTHROW_MOVE(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_ASSIGN
+   #define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_IS_ENUM
+   #define BOOST_MOVE_IS_ENUM_IMPL(T)   BOOST_MOVE_IS_ENUM(T)
+#else
+   #define BOOST_MOVE_IS_ENUM_IMPL(T)   ::boost::move_detail::is_enum_nonintrinsic<T>::value
+#endif
+
+namespace boost {
+namespace move_detail {
+
+//////////////////////////
+//    is_reference
+//////////////////////////
+template<class T>
+struct is_reference
+{  static const bool value = false; };
+
+template<class T>
+struct is_reference<T&>
+{  static const bool value = true; };
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template<class T>
+struct is_reference<T&&>
+{  static const bool value = true; };
+#endif
+
+//////////////////////////
+//    is_pointer
+//////////////////////////
+template<class T>
+struct is_pointer
+{  static const bool value = false; };
+
+template<class T>
+struct is_pointer<T*>
+{  static const bool value = true; };
+
+//////////////////////////
+//       is_const
+//////////////////////////
+template<class T>
+struct is_const
+{  static const bool value = false; };
+
+template<class T>
+struct is_const<const T>
+{  static const bool value = true; };
+
+//////////////////////////
+//       unvoid_ref
+//////////////////////////
+template <typename T> struct unvoid_ref : add_lvalue_reference<T>{};
+template <> struct unvoid_ref<void>                { typedef unvoid_ref & type; };
+template <> struct unvoid_ref<const void>          { typedef unvoid_ref & type; };
+template <> struct unvoid_ref<volatile void>       { typedef unvoid_ref & type; };
+template <> struct unvoid_ref<const volatile void> { typedef unvoid_ref & type; };
+
+template <typename T>
+struct add_reference : add_lvalue_reference<T>
+{};
+
+//////////////////////////
+//    add_const_reference
+//////////////////////////
+template <class T>
+struct add_const_reference
+{  typedef const T &type;   };
+
+template <class T>
+struct add_const_reference<T&>
+{  typedef T& type;   };
+
+//////////////////////////
+//    add_const_if_c
+//////////////////////////
+template<class T, bool Add>
+struct add_const_if_c
+   : if_c<Add, typename add_const<T>::type, T>
+{};
+
+//////////////////////////
+//    remove_const
+//////////////////////////
+template<class T>
+struct remove_const
+{  typedef T type;   };
+
+template<class T>
+struct remove_const< const T>
+{  typedef T type;   };
+
+//////////////////////////
+//    remove_cv
+//////////////////////////
+template<typename T> struct remove_cv                    {  typedef T type;   };
+template<typename T> struct remove_cv<const T>           {  typedef T type;   };
+template<typename T> struct remove_cv<const volatile T>  {  typedef T type;   };
+template<typename T> struct remove_cv<volatile T>        {  typedef T type;   };
+
+//////////////////////////
+//    make_unsigned
+//////////////////////////
+template <class T>
+struct make_unsigned_impl                                         {  typedef T type;   };
+template <> struct make_unsigned_impl<signed char>                {  typedef unsigned char  type; };
+template <> struct make_unsigned_impl<signed short>               {  typedef unsigned short type; };
+template <> struct make_unsigned_impl<signed int>                 {  typedef unsigned int   type; };
+template <> struct make_unsigned_impl<signed long>                {  typedef unsigned long  type; };
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct make_unsigned_impl< ::boost::long_long_type >  {  typedef ::boost::ulong_long_type type; };
+#endif
+
+template <class T>
+struct make_unsigned
+   : make_unsigned_impl<typename remove_cv<T>::type>
+{};
+
+//////////////////////////
+//    is_floating_point
+//////////////////////////
+template<class T> struct is_floating_point_cv               {  static const bool value = false; };
+template<>        struct is_floating_point_cv<float>        {  static const bool value = true; };
+template<>        struct is_floating_point_cv<double>       {  static const bool value = true; };
+template<>        struct is_floating_point_cv<long double>  {  static const bool value = true; };
+
+template<class T>
+struct is_floating_point
+   : is_floating_point_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////
+//    is_integral
+//////////////////////////
+template<class T> struct is_integral_cv                    {  static const bool value = false; };
+template<> struct is_integral_cv<                     bool>{  static const bool value = true; };
+template<> struct is_integral_cv<                     char>{  static const bool value = true; };
+template<> struct is_integral_cv<            unsigned char>{  static const bool value = true; };
+template<> struct is_integral_cv<              signed char>{  static const bool value = true; };
+#ifndef BOOST_NO_CXX11_CHAR16_T
+template<> struct is_integral_cv<                 char16_t>{  static const bool value = true; };
+#endif
+#ifndef BOOST_NO_CXX11_CHAR32_T
+template<> struct is_integral_cv<                 char32_t>{  static const bool value = true; };
+#endif
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<> struct is_integral_cv<                  wchar_t>{  static const bool value = true; };
+#endif
+template<> struct is_integral_cv<                    short>{  static const bool value = true; };
+template<> struct is_integral_cv<           unsigned short>{  static const bool value = true; };
+template<> struct is_integral_cv<                      int>{  static const bool value = true; };
+template<> struct is_integral_cv<             unsigned int>{  static const bool value = true; };
+template<> struct is_integral_cv<                     long>{  static const bool value = true; };
+template<> struct is_integral_cv<            unsigned long>{  static const bool value = true; };
+#ifdef BOOST_HAS_LONG_LONG
+template<> struct is_integral_cv< ::boost:: long_long_type>{  static const bool value = true; };
+template<> struct is_integral_cv< ::boost::ulong_long_type>{  static const bool value = true; };
+#endif
+
+template<class T>
+struct is_integral
+   : public is_integral_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          remove_all_extents
+//////////////////////////////////////
+template <class T>
+struct remove_all_extents
+{  typedef T type;};
+
+template <class T>
+struct remove_all_extents<T[]>
+{  typedef typename remove_all_extents<T>::type type; };
+
+template <class T, size_t N>
+struct remove_all_extents<T[N]>
+{  typedef typename remove_all_extents<T>::type type;};
+
+//////////////////////////
+//    is_scalar
+//////////////////////////
+template<class T>
+struct is_scalar
+{  static const bool value = is_integral<T>::value || is_floating_point<T>::value; };
+
+//////////////////////////
+//       is_void
+//////////////////////////
+template<class T>
+struct is_void_cv
+{  static const bool value = false; };
+
+template<>
+struct is_void_cv<void>
+{  static const bool value = true; };
+
+template<class T>
+struct is_void
+   : is_void_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_array
+//////////////////////////////////////
+template<class T>
+struct is_array
+{  static const bool value = false; };
+
+template<class T>
+struct is_array<T[]>
+{  static const bool value = true;  };
+
+template<class T, std::size_t N>
+struct is_array<T[N]>
+{  static const bool value = true;  };
+
+//////////////////////////////////////
+//           is_member_pointer
+//////////////////////////////////////
+template <class T>         struct is_member_pointer_cv         {  static const bool value = false; };
+template <class T, class U>struct is_member_pointer_cv<T U::*> {  static const bool value = true; };
+
+template <class T>
+struct is_member_pointer
+    : is_member_pointer_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_nullptr_t
+//////////////////////////////////////
+template <class T>
+struct is_nullptr_t_cv
+{  static const bool value = false; };
+
+#if !defined(BOOST_NO_CXX11_NULLPTR)
+template <>
+struct is_nullptr_t_cv
+   #if !defined(BOOST_NO_CXX11_DECLTYPE)
+   <decltype(nullptr)>
+   #else
+   <std::nullptr_t>
+   #endif
+{  static const bool value = true; };
+#endif
+
+template <class T>
+struct is_nullptr_t
+   : is_nullptr_t_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_function
+//////////////////////////////////////
+//Inspired by libc++, thanks to Howard Hinnant
+//For a function to pointer an lvalue of function type T can be implicitly converted to a prvalue
+//pointer to that function. This does not apply to non-static member functions because lvalues
+//that refer to non-static member functions do not exist.
+template <class T>
+struct is_reference_convertible_to_pointer
+{
+   struct twochar { char dummy[2]; };
+   template <class U> static char    test(U*);
+   template <class U> static twochar test(...);
+   static T& source();
+   static const bool value = sizeof(char) == sizeof(test<T>(source()));
+};
+//Filter out:
+// - class types that might have implicit conversions
+// - void (to avoid forming a reference to void later)
+// - references (e.g.: filtering reference to functions)
+// - nullptr_t (convertible to pointer)
+template < class T
+         , bool Filter = is_class_or_union<T>::value  ||
+                         is_void<T>::value            ||
+                         is_reference<T>::value       ||
+                         is_nullptr_t<T>::value       >
+struct is_function_impl
+{  static const bool value = is_reference_convertible_to_pointer<T>::value; };
+
+template <class T>
+struct is_function_impl<T, true>
+{  static const bool value = false; };
+
+template <class T>
+struct is_function
+   : is_function_impl<T>
+{};
+
+//////////////////////////////////////
+//       is_union
+//////////////////////////////////////
+template<class T>
+struct is_union_noextents_cv
+{  static const bool value = BOOST_MOVE_IS_UNION_IMPL(T); };
+
+template<class T>
+struct is_union
+   : is_union_noextents_cv<typename remove_cv<typename remove_all_extents<T>::type>::type>
+{};
+
+//////////////////////////////////////
+//             is_class
+//////////////////////////////////////
+template <class T>
+struct is_class
+{
+   static const bool value = is_class_or_union<T>::value && ! is_union<T>::value;
+};
+
+
+//////////////////////////////////////
+//             is_arithmetic
+//////////////////////////////////////
+template <class T>
+struct is_arithmetic
+{
+   static const bool value = is_floating_point<T>::value ||
+                             is_integral<T>::value;
+};
+
+//////////////////////////////////////
+//    is_member_function_pointer
+//////////////////////////////////////
+template <class T>
+struct is_member_function_pointer_cv
+{
+   static const bool value = false;
+};
+
+template <class T, class C>
+struct is_member_function_pointer_cv<T C::*>
+   : is_function<T>
+{};
+
+template <class T>
+struct is_member_function_pointer
+    : is_member_function_pointer_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//             is_enum
+//////////////////////////////////////
+#if !defined(BOOST_MOVE_IS_ENUM)
+//Based on (http://howardhinnant.github.io/TypeHiearchy.pdf)
+template <class T>
+struct is_enum_nonintrinsic
+{
+   static const bool value =  !is_arithmetic<T>::value     &&
+                              !is_reference<T>::value      &&
+                              !is_class_or_union<T>::value &&
+                              !is_array<T>::value          &&
+                              !is_void<T>::value           &&
+                              !is_nullptr_t<T>::value      &&
+                              !is_member_pointer<T>::value &&
+                              !is_pointer<T>::value        &&
+                              !is_function<T>::value;
+};
+#endif
+
+template <class T>
+struct is_enum
+{  static const bool value = BOOST_MOVE_IS_ENUM_IMPL(T);  };
+
+//////////////////////////////////////
+//       is_pod
+//////////////////////////////////////
+template<class T>
+struct is_pod_noextents_cv  //for non-c++11 compilers, a safe fallback
+{  static const bool value = BOOST_MOVE_IS_POD_IMPL(T); };
+
+template<class T>
+struct is_pod
+   : is_pod_noextents_cv<typename remove_cv<typename remove_all_extents<T>::type>::type>
+{};
+
+//////////////////////////////////////
+//             is_empty
+//////////////////////////////////////
+#if !defined(BOOST_MOVE_IS_EMPTY)
+
+template <typename T>
+struct empty_helper_t1 : public T
+{
+   empty_helper_t1();  // hh compiler bug workaround
+   int i[256];
+   private:
+
+   empty_helper_t1(const empty_helper_t1&);
+   empty_helper_t1& operator=(const empty_helper_t1&);
+};
+
+struct empty_helper_t2 { int i[256]; };
+
+template <typename T, bool IsClass = is_class<T>::value >
+struct is_empty_nonintrinsic
+{
+   static const bool value = false;
+};
+
+template <typename T>
+struct is_empty_nonintrinsic<T, true>
+{
+   static const bool value = sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2);
+};
+#endif
+
+template <class T>
+struct is_empty
+{  static const bool value = BOOST_MOVE_IS_EMPTY_IMPL(T);  };
+
+
+template<class T>
+struct has_boost_move_no_copy_constructor_or_assign_type
+{
+   template <class U>
+   static yes_type test(typename U::boost_move_no_copy_constructor_or_assign*);
+
+   template <class U>
+   static no_type test(...);
+
+   static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
+};
+
+//////////////////////////////////////
+//       is_copy_constructible
+//////////////////////////////////////
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_CXX11_DECLTYPE) \
+   && !defined(BOOST_INTEL_CXX_VERSION) && \
+      !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+#define BOOST_MOVE_TT_CXX11_IS_COPY_CONSTRUCTIBLE
+#endif
+
+template<class T>
+struct is_copy_constructible
+{
+   // Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+   //
+   // error: function *function_name* cannot be referenced -- it is a deleted function
+   // static yes_type test(U&, decltype(U(boost::declval<U&>()))* = 0);
+   //                                                        ^ 
+   // MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+   // https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+   #if defined(BOOST_MOVE_TT_CXX11_IS_COPY_CONSTRUCTIBLE)
+      template<class U> static typename add_reference<U>::type source();
+      static no_type test(...);
+      #ifdef BOOST_NO_CXX11_DECLTYPE
+         template <class U>
+         static yes_type test(U&, bool_<sizeof(U(source<U>()))>* = 0);
+      #else
+         template <class U>
+         static yes_type test(U&, decltype(U(source<U>()))* = 0);
+      #endif
+      static const bool value = sizeof(test(source<T>())) == sizeof(yes_type);
+   #else
+   static const bool value = !has_boost_move_no_copy_constructor_or_assign_type<T>::value;
+   #endif
+};
+
+
+//////////////////////////////////////
+//       is_copy_assignable
+//////////////////////////////////////
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_CXX11_DECLTYPE) \
+   && !defined(BOOST_INTEL_CXX_VERSION) && \
+      !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+#define BOOST_MOVE_TT_CXX11_IS_COPY_ASSIGNABLE
+#endif
+
+template <class T>
+struct is_copy_assignable
+{
+// Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+//
+// error: function *function_name* cannot be referenced -- it is a deleted function
+// static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+//                                                        ^ 
+//
+// MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+// https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+#if defined(BOOST_MOVE_TT_CXX11_IS_COPY_ASSIGNABLE)
+   typedef char yes_type;
+   struct no_type { char dummy[2]; };
+   
+   template <class U>   static typename add_reference<U>::type source();
+   template <class U>   static decltype(source<U&>() = source<const U&>(), yes_type() ) test(int);
+   template <class>     static no_type test(...);
+
+   static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
+#else
+   static const bool value = !has_boost_move_no_copy_constructor_or_assign_type<T>::value;
+#endif
+};
+
+//////////////////////////////////////
+//       is_trivially_destructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_destructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_default_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_default_constructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_copy_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_copy_constructible
+{
+   //In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
+   //deleted copy constructors so make sure the type is copy constructible.
+   static const bool value = ::boost::move_detail::is_pod<T>::value ||
+                             ( ::boost::move_detail::is_copy_constructible<T>::value &&
+                               BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) );
+};
+
+//////////////////////////////////////
+//       is_trivially_move_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_move_constructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_copy_assignable
+//////////////////////////////////////
+template<class T>
+struct is_trivially_copy_assignable
+{
+   //In several compilers BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE return true even with
+   //deleted copy constructors so make sure the type is copy constructible.
+   static const bool value = ::boost::move_detail::is_pod<T>::value ||
+                             ( ::boost::move_detail::is_copy_assignable<T>::value &&
+                               BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) );
+};                             
+
+//////////////////////////////////////
+//       is_trivially_move_assignable
+//////////////////////////////////////
+template<class T>
+struct is_trivially_move_assignable
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//       is_nothrow_default_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_default_constructible
+   : is_pod<T>
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_copy_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_copy_constructible
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_move_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_move_constructible
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//       is_nothrow_copy_assignable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_copy_assignable
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_move_assignable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_move_assignable
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_swappable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_swappable
+{
+   static const bool value = is_empty<T>::value || is_pod<T>::value;
+};
+
+//////////////////////////////////////
+//       alignment_of
+//////////////////////////////////////
+template <typename T>
+struct alignment_of_hack
+{
+   T t1;
+   char c;
+   T t2;
+   alignment_of_hack();
+};
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{  static const std::size_t value = A < S ? A : S; };
+
+template< typename T >
+struct alignment_of_impl
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)
+    // With MSVC both the native __alignof operator
+    // and our own logic gets things wrong from time to time :-(
+    // Using a combination of the two seems to make the most of a bad job:
+   : alignment_logic< sizeof(alignment_of_hack<T>) - 2*sizeof(T), __alignof(T)>
+{};
+#elif !defined(BOOST_MOVE_ALIGNMENT_OF)
+   : alignment_logic< sizeof(alignment_of_hack<T>) - 2*sizeof(T), sizeof(T)>
+{};
+#else
+{  static const std::size_t value = BOOST_MOVE_ALIGNMENT_OF(T);  };
+#endif
+
+template< typename T >
+struct alignment_of
+   : alignment_of_impl<T>
+{};
+
+class alignment_dummy;
+typedef void (*function_ptr)();
+typedef int (alignment_dummy::*member_ptr);
+typedef int (alignment_dummy::*member_function_ptr)();
+struct alignment_struct
+{  long double dummy[4];  };
+
+/////////////////////////////
+//    max_align_t
+/////////////////////////////
+//This is not standard, but should work with all compilers
+union max_align
+{
+   char        char_;
+   short       short_;
+   int         int_;
+   long        long_;
+   #ifdef BOOST_HAS_LONG_LONG
+   ::boost::long_long_type   long_long_;
+   #endif
+   float       float_;
+   double      double_;
+   void *      void_ptr_;
+   long double long_double_[4];
+   alignment_dummy *unknown_class_ptr_;
+   function_ptr function_ptr_;
+   member_function_ptr member_function_ptr_;
+   alignment_struct alignment_struct_;
+};
+
+typedef union max_align max_align_t;
+
+/////////////////////////////
+//    aligned_storage
+/////////////////////////////
+
+#if !defined(BOOST_NO_ALIGNMENT)
+
+template<std::size_t Len, std::size_t Align>
+struct aligned_storage_impl;
+
+#define BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(A)\
+template<std::size_t Len>\
+struct BOOST_ALIGNMENT(A) aligned_storage_impl<Len, A>\
+{\
+   char dummy[Len];\
+   typedef aligned_storage_impl<Len, A> type;\
+};\
+//
+
+//Up to 4K alignment (typical page size)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x1)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x2)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x4)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x8)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x10)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x20)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x40)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x80)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x100)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x200)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x400)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x800)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x1000)
+
+#undef BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT
+
+#else //BOOST_NO_ALIGNMENT
+
+template<class T, size_t Len>
+union aligned_union
+{	
+   T aligner;
+   char dummy[Len];
+};
+
+template<std::size_t Len, std::size_t Align, class T, bool Ok>
+struct aligned_next;
+
+template<std::size_t Len, std::size_t Align, class T>
+struct aligned_next<Len, Align, T, true>
+{
+   BOOST_STATIC_ASSERT((alignment_of<T>::value == Align));
+   typedef aligned_union<T, Len> type;
+};
+
+//End of search defaults to max_align_t
+template<std::size_t Len, std::size_t Align>
+struct aligned_next<Len, Align, max_align_t, false>
+{	typedef aligned_union<max_align_t, Len> type;   };
+
+//Now define a search list through types
+#define BOOST_MOVE_ALIGNED_NEXT_STEP(TYPE, NEXT_TYPE)\
+   template<std::size_t Len, std::size_t Align>\
+   struct aligned_next<Len, Align, TYPE, false>\
+      : aligned_next<Len, Align, NEXT_TYPE, Align == alignment_of<NEXT_TYPE>::value>\
+   {};\
+   //
+   BOOST_MOVE_ALIGNED_NEXT_STEP(long double, max_align_t)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(double, long double)
+   #ifdef BOOST_HAS_LONG_LONG
+      BOOST_MOVE_ALIGNED_NEXT_STEP(::boost::long_long_type, double)
+      BOOST_MOVE_ALIGNED_NEXT_STEP(long, ::boost::long_long_type)
+   #else
+      BOOST_MOVE_ALIGNED_NEXT_STEP(long, double)
+   #endif
+   BOOST_MOVE_ALIGNED_NEXT_STEP(int, long)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(short, int)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(char, short)
+#undef BOOST_MOVE_ALIGNED_NEXT_STEP
+
+template<std::size_t Len, std::size_t Align>
+struct aligned_storage_impl
+   : aligned_next<Len, Align, char, Align == alignment_of<char>::value>
+{};
+
+#endif
+
+template<std::size_t Len, std::size_t Align = alignment_of<max_align_t>::value>
+struct aligned_storage
+{
+   //Sanity checks for input parameters
+   BOOST_STATIC_ASSERT(Align > 0);
+
+   //Sanity checks for output type
+   typedef typename aligned_storage_impl<Len ? Len : 1, Align>::type type;
+   static const std::size_t value = alignment_of<type>::value;
+   BOOST_STATIC_ASSERT(value >= Align);
+   BOOST_STATIC_ASSERT((value % Align) == 0);
+
+   //Just in case someone instantiates aligned_storage
+   //instead of aligned_storage::type (typical error).
+   private:
+   aligned_storage();
+};
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/unique_ptr_meta_utils.hpp b/gatb-core/thirdparty/boost/move/detail/unique_ptr_meta_utils.hpp
new file mode 100644
index 0000000..3372068
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/unique_ptr_meta_utils.hpp
@@ -0,0 +1,591 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
+#define BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>   //for std::size_t
+
+//Small meta-typetraits to support move
+
+namespace boost {
+
+namespace movelib {
+
+template <class T>
+struct default_delete;
+
+}  //namespace movelib {
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+//Forward declare boost::rv
+template <class T> class rv;
+#endif
+
+namespace move_upmu {
+
+//////////////////////////////////////
+//              nat
+//////////////////////////////////////
+struct nat{};
+
+//////////////////////////////////////
+//            natify
+//////////////////////////////////////
+template <class T> struct natify{};
+
+//////////////////////////////////////
+//             if_c
+//////////////////////////////////////
+template<bool C, typename T1, typename T2>
+struct if_c
+{
+   typedef T1 type;
+};
+
+template<typename T1, typename T2>
+struct if_c<false,T1,T2>
+{
+   typedef T2 type;
+};
+
+//////////////////////////////////////
+//             if_
+//////////////////////////////////////
+template<typename T1, typename T2, typename T3>
+struct if_ : if_c<0 != T1::value, T2, T3>
+{};
+
+//enable_if_
+template <bool B, class T = nat>
+struct enable_if_c
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//          enable_if_c
+//////////////////////////////////////
+template <class T>
+struct enable_if_c<false, T> {};
+
+//////////////////////////////////////
+//           enable_if
+//////////////////////////////////////
+template <class Cond, class T = nat>
+struct enable_if : public enable_if_c<Cond::value, T> {};
+
+//////////////////////////////////////
+//          remove_reference
+//////////////////////////////////////
+template<class T>
+struct remove_reference
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference<T&>
+{
+   typedef T type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct remove_reference<T&&>
+{
+   typedef T type;
+};
+
+#else
+
+template<class T>
+struct remove_reference< rv<T> >
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< rv<T> &>
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< const rv<T> &>
+{
+   typedef T type;
+};
+
+
+#endif
+
+//////////////////////////////////////
+//             remove_const
+//////////////////////////////////////
+template< class T >
+struct remove_const
+{
+   typedef T type;
+};
+
+template< class T >
+struct remove_const<const T>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             remove_volatile
+//////////////////////////////////////
+template< class T >
+struct remove_volatile
+{
+   typedef T type;
+};
+
+template< class T >
+struct remove_volatile<volatile T>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             remove_cv
+//////////////////////////////////////
+template< class T >
+struct remove_cv
+{
+    typedef typename remove_volatile
+      <typename remove_const<T>::type>::type type;
+};
+
+//////////////////////////////////////
+//          remove_extent
+//////////////////////////////////////
+template<class T>
+struct remove_extent
+{
+   typedef T type;
+};
+ 
+template<class T>
+struct remove_extent<T[]>
+{
+   typedef T type;
+};
+ 
+template<class T, std::size_t N>
+struct remove_extent<T[N]>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             extent
+//////////////////////////////////////
+
+template<class T, unsigned N = 0>
+struct extent
+{
+   static const std::size_t value = 0;
+};
+ 
+template<class T>
+struct extent<T[], 0> 
+{
+   static const std::size_t value = 0;
+};
+
+template<class T, unsigned N>
+struct extent<T[], N>
+{
+   static const std::size_t value = extent<T, N-1>::value;
+};
+
+template<class T, std::size_t N>
+struct extent<T[N], 0> 
+{
+   static const std::size_t value = N;
+};
+ 
+template<class T, std::size_t I, unsigned N>
+struct extent<T[I], N>
+{
+   static const std::size_t value = extent<T, N-1>::value;
+};
+
+//////////////////////////////////////
+//      add_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct add_lvalue_reference
+{
+   typedef T& type;
+};
+
+template<class T>
+struct add_lvalue_reference<T&>
+{
+   typedef T& type;
+};
+
+template<>
+struct add_lvalue_reference<void>
+{
+   typedef void type;
+};
+
+template<>
+struct add_lvalue_reference<const void>
+{
+   typedef const void type;
+};
+
+template<>
+struct add_lvalue_reference<volatile void>
+{
+   typedef volatile void type;
+};
+
+template<>
+struct add_lvalue_reference<const volatile void>
+{
+   typedef const volatile void type;
+};
+
+template<class T>
+struct add_const_lvalue_reference
+{
+   typedef typename remove_reference<T>::type   t_unreferenced;
+   typedef const t_unreferenced                 t_unreferenced_const;
+   typedef typename add_lvalue_reference
+      <t_unreferenced_const>::type              type;
+};
+
+//////////////////////////////////////
+//             is_same
+//////////////////////////////////////
+template<class T, class U>
+struct is_same
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_same<T, T>
+{
+   static const bool value = true;
+};
+
+//////////////////////////////////////
+//             is_pointer
+//////////////////////////////////////
+template< class T >
+struct is_pointer
+{
+    static const bool value = false;
+};
+
+template< class T >
+struct is_pointer<T*>
+{
+    static const bool value = true;
+};
+
+//////////////////////////////////////
+//             is_reference
+//////////////////////////////////////
+template< class T >
+struct is_reference
+{
+    static const bool value = false;
+};
+
+template< class T >
+struct is_reference<T&>
+{
+    static const bool value = true;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T >
+struct is_reference<T&&>
+{
+    static const bool value = true;
+};
+
+#endif
+
+//////////////////////////////////////
+//             is_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct is_lvalue_reference
+{
+    static const bool value = false;
+};
+
+template<class T>
+struct is_lvalue_reference<T&>
+{
+    static const bool value = true;
+};
+
+//////////////////////////////////////
+//          is_array
+//////////////////////////////////////
+template<class T>
+struct is_array
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_array<T[]>
+{
+   static const bool value = true;
+};
+ 
+template<class T, std::size_t N>
+struct is_array<T[N]>
+{
+   static const bool value = true;
+};
+
+//////////////////////////////////////
+//          has_pointer_type
+//////////////////////////////////////
+template <class T>
+struct has_pointer_type
+{
+   struct two { char c[2]; };
+   template <class U> static two test(...);
+   template <class U> static char test(typename U::pointer* = 0);
+   static const bool value = sizeof(test<T>(0)) == 1;
+};
+
+//////////////////////////////////////
+//             pointer_type
+//////////////////////////////////////
+template <class T, class D, bool = has_pointer_type<D>::value>
+struct pointer_type_imp
+{
+    typedef typename D::pointer type;
+};
+
+template <class T, class D>
+struct pointer_type_imp<T, D, false>
+{
+    typedef typename remove_extent<T>::type* type;
+};
+
+template <class T, class D>
+struct pointer_type
+{
+    typedef typename pointer_type_imp
+      <typename remove_extent<T>::type, typename remove_reference<D>::type>::type type;
+};
+
+//////////////////////////////////////
+//           is_convertible
+//////////////////////////////////////
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+//use intrinsic since in MSVC
+//overaligned types can't go through ellipsis
+template <class T, class U>
+struct is_convertible
+{
+   static const bool value = __is_convertible_to(T, U);
+};
+
+#else
+
+template <class T, class U>
+class is_convertible
+{
+   typedef typename add_lvalue_reference<T>::type t_reference;
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static false_t dispatch(...);
+   static true_t  dispatch(U);
+   static t_reference       trigger();
+   public:
+   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
+};
+
+#endif
+
+//////////////////////////////////////
+//       is_unary_function
+//////////////////////////////////////
+#if defined(BOOST_MSVC) || defined(__BORLANDC_)
+#define BOOST_MOVE_TT_DECL __cdecl
+#else
+#define BOOST_MOVE_TT_DECL
+#endif
+
+#if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64) && !defined(_M_ARM) && !defined(UNDER_CE)
+#define BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+#endif
+
+template <typename T>
+struct is_unary_function_impl
+{  static const bool value = false; };
+
+// avoid duplicate definitions of is_unary_function_impl
+#ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R>
+struct is_unary_function_impl<R (*)()>
+{  static const bool value = true;  };
+
+template <typename R>
+struct is_unary_function_impl<R (*)(...)>
+{  static const bool value = true;  };
+
+#else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R>
+struct is_unary_function_impl<R (__stdcall*)()>
+{  static const bool value = true;  };
+
+#ifndef _MANAGED
+
+template <typename R>
+struct is_unary_function_impl<R (__fastcall*)()>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename R>
+struct is_unary_function_impl<R (__cdecl*)()>
+{  static const bool value = true;  };
+
+template <typename R>
+struct is_unary_function_impl<R (__cdecl*)(...)>
+{  static const bool value = true;  };
+
+#endif
+
+// avoid duplicate definitions of is_unary_function_impl
+#ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (*)(T0)>
+{  static const bool value = true;  };
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (*)(T0...)>
+{  static const bool value = true;  };
+
+#else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__stdcall*)(T0)>
+{  static const bool value = true;  };
+
+#ifndef _MANAGED
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__fastcall*)(T0)>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__cdecl*)(T0)>
+{  static const bool value = true;  };
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__cdecl*)(T0...)>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename T>
+struct is_unary_function_impl<T&>
+{  static const bool value = false; };
+
+template<typename T>
+struct is_unary_function
+{  static const bool value = is_unary_function_impl<T>::value;   };
+
+//////////////////////////////////////
+//       has_virtual_destructor
+//////////////////////////////////////
+#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
+         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(BOOST_CLANG) && defined(__has_feature)
+#  if __has_feature(has_virtual_destructor)
+#     define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#  endif
+#elif defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(__CODEGEARC__)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#endif
+
+#ifdef BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR
+   template<class T>
+   struct has_virtual_destructor{   static const bool value = BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T);  };
+#else
+   //If no intrinsic is available you trust the programmer knows what is doing
+   template<class T>
+   struct has_virtual_destructor{   static const bool value = true;  };
+#endif
+
+//////////////////////////////////////
+//       missing_virtual_destructor
+//////////////////////////////////////
+
+template< class T, class U
+        , bool enable =  is_convertible< U*, T*>::value &&
+                        !is_array<T>::value &&
+                        !is_same<typename remove_cv<T>::type, void>::value &&
+                        !is_same<typename remove_cv<U>::type, typename remove_cv<T>::type>::value
+        >
+struct missing_virtual_destructor_default_delete
+{  static const bool value = !has_virtual_destructor<T>::value;  };
+
+template<class T, class U>
+struct missing_virtual_destructor_default_delete<T, U, false>
+{  static const bool value = false;  };
+
+template<class Deleter, class U>
+struct missing_virtual_destructor
+{  static const bool value = false;  };
+
+template<class T, class U>
+struct missing_virtual_destructor< ::boost::movelib::default_delete<T>, U >
+   : missing_virtual_destructor_default_delete<T, U>
+{};
+
+}  //namespace move_upmu {
+}  //namespace boost {
+
+#endif //#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
diff --git a/gatb-core/thirdparty/boost/move/detail/workaround.hpp b/gatb-core/thirdparty/boost/move/detail/workaround.hpp
new file mode 100644
index 0000000..b3f81b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/detail/workaround.hpp
@@ -0,0 +1,55 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
+#define BOOST_MOVE_DETAIL_WORKAROUND_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#if    !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+   #define BOOST_MOVE_PERFECT_FORWARDING
+#endif
+
+#if defined(__has_feature)
+   #define BOOST_MOVE_HAS_FEATURE __has_feature
+#else
+   #define BOOST_MOVE_HAS_FEATURE(x) 0
+#endif
+
+#if BOOST_MOVE_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+   #define BOOST_MOVE_ADDRESS_SANITIZER_ON
+#endif
+
+//Macros for documentation purposes. For code, expands to the argument
+#define BOOST_MOVE_IMPDEF(TYPE) TYPE
+#define BOOST_MOVE_SEEDOC(TYPE) TYPE
+#define BOOST_MOVE_DOC0PTR(TYPE) TYPE
+#define BOOST_MOVE_DOC1ST(TYPE1, TYPE2) TYPE2
+#define BOOST_MOVE_I ,
+#define BOOST_MOVE_DOCIGN(T1) T1
+
+#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5) && !defined(__clang__)
+   //Pre-standard rvalue binding rules
+   #define BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+#elif defined(_MSC_VER) && (_MSC_VER == 1600)
+   //Standard rvalue binding rules but with some bugs
+   #define BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+   #define BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG
+#elif defined(_MSC_VER) && (_MSC_VER == 1700)
+   #define BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG
+#endif
+
+#endif   //#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
diff --git a/gatb-core/thirdparty/boost/move/iterator.hpp b/gatb-core/thirdparty/boost/move/iterator.hpp
new file mode 100644
index 0000000..1b39e26
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/iterator.hpp
@@ -0,0 +1,312 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_ITERATOR_HPP
+#define BOOST_MOVE_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/iterator_traits.hpp>
+#include <boost/move/utility_core.hpp>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! Class template move_iterator is an iterator adaptor with the same behavior
+//! as the underlying iterator except that its dereference operator implicitly
+//! converts the value returned by the underlying iterator's dereference operator
+//! to an rvalue reference. Some generic algorithms can be called with move
+//! iterators to replace copying with moving.
+template <class It>
+class move_iterator
+{
+   public:
+   typedef It                                                              iterator_type;
+   typedef typename boost::movelib::iterator_traits<iterator_type>::value_type        value_type;
+   #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   typedef value_type &&                                                   reference;
+   #else
+   typedef typename ::boost::move_detail::if_
+      < ::boost::has_move_emulation_enabled<value_type>
+      , ::boost::rv<value_type>&
+      , value_type & >::type                                               reference;
+   #endif
+   typedef It                                                              pointer;
+   typedef typename boost::movelib::iterator_traits<iterator_type>::difference_type   difference_type;
+   typedef typename boost::movelib::iterator_traits<iterator_type>::iterator_category iterator_category;
+
+   move_iterator()
+   {}
+
+   explicit move_iterator(It i)
+      :  m_it(i)
+   {}
+
+   template <class U>
+   move_iterator(const move_iterator<U>& u)
+      :  m_it(u.base())
+   {}
+
+   iterator_type base() const
+   {  return m_it;   }
+
+   reference operator*() const
+   {
+      #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+      return *m_it;
+      #else
+      return ::boost::move(*m_it);
+      #endif
+   }
+
+   pointer   operator->() const
+   {  return m_it;   }
+
+   move_iterator& operator++()
+   {  ++m_it; return *this;   }
+
+   move_iterator<iterator_type>  operator++(int)
+   {  move_iterator<iterator_type> tmp(*this); ++(*this); return tmp;   }
+
+   move_iterator& operator--()
+   {  --m_it; return *this;   }
+
+   move_iterator<iterator_type>  operator--(int)
+   {  move_iterator<iterator_type> tmp(*this); --(*this); return tmp;   }
+
+   move_iterator<iterator_type>  operator+ (difference_type n) const
+   {  return move_iterator<iterator_type>(m_it + n);  }
+
+   move_iterator& operator+=(difference_type n)
+   {  m_it += n; return *this;   }
+
+   move_iterator<iterator_type>  operator- (difference_type n) const
+   {  return move_iterator<iterator_type>(m_it - n);  }
+
+   move_iterator& operator-=(difference_type n)
+   {  m_it -= n; return *this;   }
+
+   reference operator[](difference_type n) const
+   {
+      #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+      return m_it[n];
+      #else
+      return ::boost::move(m_it[n]);
+      #endif
+   }
+
+   friend bool operator==(const move_iterator& x, const move_iterator& y)
+   {  return x.base() == y.base();  }
+
+   friend bool operator!=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() != y.base();  }
+
+   friend bool operator< (const move_iterator& x, const move_iterator& y)
+   {  return x.base() < y.base();   }
+
+   friend bool operator<=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() <= y.base();  }
+
+   friend bool operator> (const move_iterator& x, const move_iterator& y)
+   {  return x.base() > y.base();  }
+
+   friend bool operator>=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() >= y.base();  }
+
+   friend difference_type operator-(const move_iterator& x, const move_iterator& y)
+   {  return x.base() - y.base();   }
+
+   friend move_iterator operator+(difference_type n, const move_iterator& x)
+   {  return move_iterator(x.base() + n);   }
+
+   private:
+   It m_it;
+};
+
+//is_move_iterator
+namespace move_detail {
+
+template <class I>
+struct is_move_iterator
+{
+   static const bool value = false;
+};
+
+template <class I>
+struct is_move_iterator< ::boost::move_iterator<I> >
+{
+   static const bool value = true;
+};
+
+}  //namespace move_detail {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//!
+//! <b>Returns</b>: move_iterator<It>(i).
+template<class It>
+inline move_iterator<It> make_move_iterator(const It &it)
+{  return move_iterator<It>(it); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         back_move_insert_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+//! A move insert iterator that move constructs elements at the
+//! back of a container
+template <typename C> // C models Container
+class back_move_insert_iterator
+{
+   C* container_m;
+
+   public:
+   typedef C                           container_type;
+   typedef typename C::value_type      value_type;
+   typedef typename C::reference       reference;
+   typedef typename C::pointer         pointer;
+   typedef typename C::difference_type difference_type;
+   typedef std::output_iterator_tag    iterator_category;
+
+   explicit back_move_insert_iterator(C& x) : container_m(&x) { }
+
+   back_move_insert_iterator& operator=(reference x)
+   { container_m->push_back(boost::move(x)); return *this; }
+
+   back_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
+   {  reference rx = x; return this->operator=(rx);  }
+
+   back_move_insert_iterator& operator*()     { return *this; }
+   back_move_insert_iterator& operator++()    { return *this; }
+   back_move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: back_move_insert_iterator<C>(x).
+template <typename C> // C models Container
+inline back_move_insert_iterator<C> back_move_inserter(C& x)
+{
+   return back_move_insert_iterator<C>(x);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         front_move_insert_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! A move insert iterator that move constructs elements int the
+//! front of a container
+template <typename C> // C models Container
+class front_move_insert_iterator
+{
+   C* container_m;
+
+public:
+   typedef C                           container_type;
+   typedef typename C::value_type      value_type;
+   typedef typename C::reference       reference;
+   typedef typename C::pointer         pointer;
+   typedef typename C::difference_type difference_type;
+   typedef std::output_iterator_tag    iterator_category;
+
+   explicit front_move_insert_iterator(C& x) : container_m(&x) { }
+
+   front_move_insert_iterator& operator=(reference x)
+   { container_m->push_front(boost::move(x)); return *this; }
+
+   front_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
+   {  reference rx = x; return this->operator=(rx);  }
+
+   front_move_insert_iterator& operator*()     { return *this; }
+   front_move_insert_iterator& operator++()    { return *this; }
+   front_move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: front_move_insert_iterator<C>(x).
+template <typename C> // C models Container
+inline front_move_insert_iterator<C> front_move_inserter(C& x)
+{
+   return front_move_insert_iterator<C>(x);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         insert_move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+template <typename C> // C models Container
+class move_insert_iterator
+{
+   C* container_m;
+   typename C::iterator pos_;
+
+   public:
+   typedef C                           container_type;
+   typedef typename C::value_type      value_type;
+   typedef typename C::reference       reference;
+   typedef typename C::pointer         pointer;
+   typedef typename C::difference_type difference_type;
+   typedef std::output_iterator_tag    iterator_category;
+
+   explicit move_insert_iterator(C& x, typename C::iterator pos)
+      : container_m(&x), pos_(pos)
+   {}
+
+   move_insert_iterator& operator=(reference x)
+   {
+      pos_ = container_m->insert(pos_, ::boost::move(x));
+      ++pos_;
+      return *this;
+   }
+
+   move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
+   {  reference rx = x; return this->operator=(rx);  }
+
+   move_insert_iterator& operator*()     { return *this; }
+   move_insert_iterator& operator++()    { return *this; }
+   move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: move_insert_iterator<C>(x, it).
+template <typename C> // C models Container
+inline move_insert_iterator<C> move_inserter(C& x, typename C::iterator it)
+{
+   return move_insert_iterator<C>(x, it);
+}
+
+}  //namespace boost {
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_ITERATOR_HPP
diff --git a/gatb-core/thirdparty/boost/move/make_unique.hpp b/gatb-core/thirdparty/boost/move/make_unique.hpp
new file mode 100644
index 0000000..bb59ab6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/make_unique.hpp
@@ -0,0 +1,237 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
+#define BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/move/unique_ptr.hpp>
+#include <cstddef>   //for std::size_t
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#  include <boost/move/detail/fwd_macros.hpp>
+#endif
+
+//!\file
+//! Defines "make_unique" functions, which are factories to create instances
+//! of unique_ptr depending on the passed arguments.
+//!
+//! This header can be a bit heavyweight in C++03 compilers due to the use of the
+//! preprocessor library, that's why it's a a separate header from <tt>unique_ptr.hpp</tt>
+ 
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace std {   //no namespace versioning in clang+libc++
+
+struct nothrow_t;
+
+}  //namespace std {
+
+namespace boost{
+namespace move_upmu {
+
+//Compile time switch between
+//single element, unknown bound array
+//and known bound array
+template<class T>
+struct unique_ptr_if
+{
+   typedef ::boost::movelib::unique_ptr<T> t_is_not_array;
+};
+
+template<class T>
+struct unique_ptr_if<T[]>
+{
+   typedef ::boost::movelib::unique_ptr<T[]> t_is_array_of_unknown_bound;
+};
+
+template<class T, std::size_t N>
+struct unique_ptr_if<T[N]>
+{
+   typedef void t_is_array_of_known_bound;
+};
+
+template <int Dummy = 0>
+struct nothrow_holder
+{
+   static std::nothrow_t *pnothrow;   
+};
+
+template <int Dummy>
+std::nothrow_t *nothrow_holder<Dummy>::pnothrow;
+
+}  //namespace move_upmu {
+}  //namespace boost{
+
+#endif   //!defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+namespace movelib {
+
+#if defined(BOOST_MOVE_DOXYGEN_INVOKED) || !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::forward<Args>(args)...))</tt>.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique(BOOST_FWD_REF(Args)... args)
+{  return unique_ptr<T>(new T(::boost::forward<Args>(args)...));  }
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::nothrow)(std::forward<Args>(args)...))</tt>.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_nothrow(BOOST_FWD_REF(Args)... args)
+{  return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T(::boost::forward<Args>(args)...));  }
+
+#else
+   #define BOOST_MOVE_MAKE_UNIQUE_CODE(N)\
+      template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N>\
+      typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array\
+         make_unique( BOOST_MOVE_UREF##N)\
+      {  return unique_ptr<T>( new T( BOOST_MOVE_FWD##N ) );  }\
+      \
+      template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N>\
+      typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array\
+         make_unique_nothrow( BOOST_MOVE_UREF##N)\
+      {  return unique_ptr<T>( new (*boost::move_upmu::nothrow_holder<>::pnothrow)T ( BOOST_MOVE_FWD##N ) );  }\
+      //
+   BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_MAKE_UNIQUE_CODE)
+   #undef BOOST_MOVE_MAKE_UNIQUE_CODE
+
+#endif
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T)</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_definit()
+{
+    return unique_ptr<T>(new T);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::nothrow)</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_nothrow_definit()
+{
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new remove_extent_t<T>[n]())</tt> (value initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new U[n]());
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new (std::nothrow)remove_extent_t<T>[n]())</tt> (value initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_nothrow(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)U[n]());
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new remove_extent_t<T>[n])</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_definit(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new U[n]);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new (std::nothrow)remove_extent_t<T>[n])</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_nothrow_definit(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow) U[n]);
+}
+
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_definit(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_nothrow(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_nothrow_definit(BOOST_FWD_REF(Args) ...) = delete;
+
+#endif
+
+}  //namespace movelib {
+
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/move/move.hpp b/gatb-core/thirdparty/boost/move/move.hpp
new file mode 100644
index 0000000..62dddbc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/move.hpp
@@ -0,0 +1,35 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet 2009.
+// (C) Copyright Ion Gaztanaga 2009-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+//! A general library header that includes
+//! the rest of top-level headers.
+
+#ifndef BOOST_MOVE_MOVE_HPP
+#define BOOST_MOVE_MOVE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/utility.hpp>
+#include <boost/move/iterator.hpp>
+#include <boost/move/traits.hpp>
+#include <boost/move/algorithm.hpp>
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_MOVE_HPP
diff --git a/gatb-core/thirdparty/boost/move/traits.hpp b/gatb-core/thirdparty/boost/move/traits.hpp
new file mode 100644
index 0000000..b48b8f6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/traits.hpp
@@ -0,0 +1,77 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_TRAITS_HPP
+#define BOOST_MOVE_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+#include <boost/move/core.hpp>
+#endif
+#include <boost/move/detail/meta_utils.hpp>
+#include <boost/move/detail/type_traits.hpp>
+
+namespace boost {
+
+//! If this trait yields to true
+//! (<i>has_trivial_destructor_after_move <T>::value == true</i>)
+//! means that if T is used as argument of a move construction/assignment,
+//! there is no need to call T's destructor.
+//! This optimization tipically is used to improve containers' performance.
+//!
+//! By default this trait is true if the type has trivial destructor,
+//! every class should specialize this trait if it wants to improve performance
+//! when inserted in containers.
+template <class T>
+struct has_trivial_destructor_after_move
+   : ::boost::move_detail::is_trivially_destructible<T>
+{};
+
+//! By default this traits returns
+//! <pre>boost::is_nothrow_move_constructible<T>::value && boost::is_nothrow_move_assignable<T>::value </pre>.
+//! Classes with non-throwing move constructor
+//! and assignment can specialize this trait to obtain some performance improvements.
+template <class T>
+struct has_nothrow_move
+{
+   static const bool value = boost::move_detail::is_nothrow_move_constructible<T>::value &&
+                             boost::move_detail::is_nothrow_move_assignable<T>::value;
+};
+
+namespace move_detail {
+
+template <class T>
+struct is_nothrow_move_constructible_or_uncopyable
+{
+   //The standard requires is_nothrow_move_constructible for move_if_noexcept
+   //but a user (usually in C++03) might specialize has_nothrow_move which includes it
+   static const bool value = is_nothrow_move_constructible<T>::value ||
+                             has_nothrow_move<T>::value ||
+                            !is_copy_constructible<T>::value;
+};
+
+}  //move_detail {
+}  //namespace boost {
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/move/unique_ptr.hpp b/gatb-core/thirdparty/boost/move/unique_ptr.hpp
new file mode 100644
index 0000000..bcf4fae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/unique_ptr.hpp
@@ -0,0 +1,869 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
+#define BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#include <boost/move/default_delete.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/move/adl_move_swap.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/assert.hpp>
+
+#include <cstddef>   //For std::nullptr_t and std::size_t
+
+//!\file
+//! Describes the smart pointer unique_ptr, a drop-in replacement for std::unique_ptr,
+//! usable also from C++03 compilers.
+//!
+//! Main differences from std::unique_ptr to avoid heavy dependencies,
+//! specially in C++03 compilers:
+//!   - <tt>operator < </tt> uses pointer <tt>operator < </tt>instead of <tt>std::less<common_type></tt>. 
+//!      This avoids dependencies on <tt>std::common_type</tt> and <tt>std::less</tt>
+//!      (<tt><type_traits>/<functional></tt> headers. In C++03 this avoid pulling Boost.Typeof and other
+//!      cascading dependencies. As in all Boost platforms <tt>operator <</tt> on raw pointers and
+//!      other smart pointers provides strict weak ordering in practice this should not be a problem for users.
+//!   - assignable from literal 0 for compilers without nullptr
+//!   - <tt>unique_ptr<T[]></tt> is constructible and assignable from <tt>unique_ptr<U[]></tt> if
+//!      cv-less T and cv-less U are the same type and T is more CV qualified than U.
+
+namespace boost{
+namespace move_upd {
+
+////////////////////////////////////////////
+//          deleter types
+////////////////////////////////////////////
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T>
+class is_noncopyable
+{
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   template<class U> static false_t dispatch(...);
+   template<class U> static true_t  dispatch(typename U::boost_move_no_copy_constructor_or_assign*);
+   public:
+   static const bool value = sizeof(dispatch<T>(0)) == sizeof(true_t);
+};
+#endif   //defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+template <class D>
+struct deleter_types
+{
+   typedef typename bmupmu::add_lvalue_reference<D>::type            del_ref;
+   typedef typename bmupmu::add_const_lvalue_reference<D>::type      del_cref;
+   #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   typedef typename bmupmu::if_c
+      < bmupmu::is_lvalue_reference<D>::value, D, del_cref >::type   deleter_arg_type1;
+   typedef typename bmupmu::remove_reference<D>::type &&             deleter_arg_type2;
+   #else
+   typedef typename bmupmu::if_c
+      < is_noncopyable<D>::value, bmupmu::nat, del_cref>::type       non_ref_deleter_arg1;
+   typedef typename bmupmu::if_c< bmupmu::is_lvalue_reference<D>::value
+                       , D, non_ref_deleter_arg1 >::type          deleter_arg_type1;
+   typedef ::boost::rv<D> &                                       deleter_arg_type2;
+   #endif
+};
+
+////////////////////////////////////////////
+//          unique_ptr_data
+////////////////////////////////////////////
+template <class P, class D, bool = bmupmu::is_unary_function<D>::value || bmupmu::is_reference<D>::value >
+struct unique_ptr_data
+{
+   typedef typename deleter_types<D>::deleter_arg_type1  deleter_arg_type1;
+   typedef typename deleter_types<D>::del_ref            del_ref;
+   typedef typename deleter_types<D>::del_cref           del_cref;
+
+   unique_ptr_data() BOOST_NOEXCEPT
+      : m_p(), d()
+   {}
+
+   explicit unique_ptr_data(P p) BOOST_NOEXCEPT
+      : m_p(p), d()
+   {}
+
+   unique_ptr_data(P p, deleter_arg_type1 d1) BOOST_NOEXCEPT
+      : m_p(p), d(d1)
+   {}
+
+   template <class U>
+   unique_ptr_data(P p, BOOST_FWD_REF(U) d1) BOOST_NOEXCEPT
+      : m_p(p), d(::boost::forward<U>(d1))
+   {}
+
+   del_ref deleter()       { return d; }
+   del_cref deleter() const{ return d; }
+
+   P m_p;
+   D d;
+
+   private:
+   unique_ptr_data& operator=(const unique_ptr_data&);
+   unique_ptr_data(const unique_ptr_data&);
+};
+
+template <class P, class D>
+struct unique_ptr_data<P, D, false>
+   : private D
+{
+   typedef typename deleter_types<D>::deleter_arg_type1  deleter_arg_type1;
+   typedef typename deleter_types<D>::del_ref            del_ref;
+   typedef typename deleter_types<D>::del_cref           del_cref;
+
+   unique_ptr_data() BOOST_NOEXCEPT
+      : D(), m_p()
+   {}
+
+   explicit unique_ptr_data(P p) BOOST_NOEXCEPT
+      : D(), m_p(p)
+   {}
+
+   unique_ptr_data(P p, deleter_arg_type1 d1) BOOST_NOEXCEPT
+      : D(d1), m_p(p)
+   {}
+
+   template <class U>
+   unique_ptr_data(P p, BOOST_FWD_REF(U) d) BOOST_NOEXCEPT
+      : D(::boost::forward<U>(d)), m_p(p)
+   {}
+
+   del_ref deleter()        BOOST_NOEXCEPT   {  return static_cast<del_ref>(*this);   }
+   del_cref deleter() const BOOST_NOEXCEPT   {  return static_cast<del_cref>(*this);  }
+
+   P m_p;
+
+   private:
+   unique_ptr_data& operator=(const unique_ptr_data&);
+   unique_ptr_data(const unique_ptr_data&);
+};
+
+////////////////////////////////////////////
+//          is_unique_ptr_convertible
+////////////////////////////////////////////
+
+//Although non-standard, we avoid using pointer_traits
+//to avoid heavy dependencies
+template <typename T>
+struct get_element_type
+{
+   struct DefaultWrap { typedef bmupmu::natify<T> element_type; };
+   template <typename X>   static char test(int, typename X::element_type*);
+   template <typename X>   static int test(...);
+   static const bool value = (1 == sizeof(test<T>(0, 0)));
+   typedef typename bmupmu::if_c<value, T, DefaultWrap>::type::element_type type;
+};
+
+template<class T>
+struct get_element_type<T*>
+{
+   typedef T type;
+};
+
+template<class T>
+struct get_cvelement
+   : bmupmu::remove_cv<typename get_element_type<T>::type>
+{};
+
+template <class P1, class P2>
+struct is_same_cvelement_and_convertible
+{
+   typedef typename bmupmu::remove_reference<P1>::type arg1;
+   typedef typename bmupmu::remove_reference<P2>::type arg2;
+   static const bool same_cvless =
+      bmupmu::is_same<typename get_cvelement<arg1>::type,typename get_cvelement<arg2>::type>::value;
+   static const bool value = same_cvless && bmupmu::is_convertible<arg1, arg2>::value;
+};
+
+template<bool IsArray, class FromPointer, class ThisPointer>
+struct is_unique_ptr_convertible
+   : is_same_cvelement_and_convertible<FromPointer, ThisPointer>
+{};
+
+template<class FromPointer, class ThisPointer>
+struct is_unique_ptr_convertible<false, FromPointer, ThisPointer>
+   : bmupmu::is_convertible<FromPointer, ThisPointer>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_assign
+////////////////////////////////////////
+
+template<class T, class FromPointer, class ThisPointer, class Type = bmupmu::nat>
+struct enable_up_ptr
+   : bmupmu::enable_if_c< is_unique_ptr_convertible
+      < bmupmu::is_array<T>::value, FromPointer, ThisPointer>::value, Type>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_assign
+////////////////////////////////////////
+
+template<class T, class D, class U, class E>
+struct unique_moveconvert_assignable
+{
+   static const bool t_is_array = bmupmu::is_array<T>::value;
+   static const bool value =
+      t_is_array == bmupmu::is_array<U>::value &&
+      bmupmu::extent<T>::value == bmupmu::extent<U>::value &&
+      is_unique_ptr_convertible
+         < t_is_array
+         , typename bmupmu::pointer_type<U, E>::type, typename bmupmu::pointer_type<T, D>::type
+         >::value;
+};
+
+template<class T, class D, class U, class E, std::size_t N>
+struct unique_moveconvert_assignable<T[], D, U[N], E>
+   : unique_moveconvert_assignable<T[], D, U[], E>
+{};
+
+template<class T, class D, class U, class E, class Type = bmupmu::nat>
+struct enable_up_moveconv_assign
+   : bmupmu::enable_if_c<unique_moveconvert_assignable<T, D, U, E>::value, Type>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_constr
+////////////////////////////////////////
+
+template<class D, class E, bool IsReference = bmupmu::is_reference<D>::value>
+struct unique_deleter_is_initializable
+   : bmupmu::is_same<D, E>
+{};
+
+template <class T, class U>
+class is_rvalue_convertible
+{
+   #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   typedef typename bmupmu::remove_reference<T>::type&& t_from;
+   #else
+   typedef typename bmupmu::if_c
+      < ::boost::has_move_emulation_enabled<T>::value && !bmupmu::is_reference<T>::value
+      , ::boost::rv<T>&
+      , typename bmupmu::add_lvalue_reference<T>::type
+      >::type t_from;
+   #endif
+
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static false_t dispatch(...);
+   static true_t  dispatch(U);
+   static t_from trigger();
+   public:
+   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
+};
+
+template<class D, class E>
+struct unique_deleter_is_initializable<D, E, false>
+{
+   #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+   //Clang has some problems with is_rvalue_convertible with non-copyable types
+   //so use intrinsic if available
+   #if defined(BOOST_CLANG)
+      #if __has_feature(is_convertible_to)
+      static const bool value = __is_convertible_to(E, D);
+      #else
+      static const bool value = is_rvalue_convertible<E, D>::value;
+      #endif
+   #else
+   static const bool value = is_rvalue_convertible<E, D>::value;
+   #endif
+
+   #else //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+   //No hope for compilers with move emulation for now. In several compilers is_convertible
+   // leads to errors, so just move the Deleter and see if the conversion works
+   static const bool value = true;  /*is_rvalue_convertible<E, D>::value*/
+   #endif
+};
+
+template<class T, class D, class U, class E, class Type = bmupmu::nat>
+struct enable_up_moveconv_constr
+   : bmupmu::enable_if_c
+      < unique_moveconvert_assignable<T, D, U, E>::value && unique_deleter_is_initializable<D, E>::value
+      , Type>
+{};
+
+}  //namespace move_upd {
+
+namespace movelib {
+
+//! A unique pointer is an object that owns another object and
+//! manages that other object through a pointer.
+//! 
+//! More precisely, a unique pointer is an object u that stores a pointer to a second object p and will dispose
+//! of p when u is itself destroyed (e.g., when leaving block scope). In this context, u is said to own p.
+//! 
+//! The mechanism by which u disposes of p is known as p's associated deleter, a function object whose correct
+//! invocation results in p's appropriate disposition (typically its deletion).
+//! 
+//! Let the notation u.p denote the pointer stored by u, and let u.d denote the associated deleter. Upon request,
+//! u can reset (replace) u.p and u.d with another pointer and deleter, but must properly dispose of its owned
+//! object via the associated deleter before such replacement is considered completed.
+//! 
+//! Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of
+//! such a transfer, the following postconditions hold:
+//!   - u2.p is equal to the pre-transfer u.p,
+//!   - u.p is equal to nullptr, and
+//!   - if the pre-transfer u.d maintained state, such state has been transferred to u2.d.
+//! 
+//! As in the case of a reset, u2 must properly dispose of its pre-transfer owned object via the pre-transfer
+//! associated deleter before the ownership transfer is considered complete.
+//! 
+//! Each object of a type U instantiated from the unique_ptr template specified in this subclause has the strict
+//! ownership semantics, specified above, of a unique pointer. In partial satisfaction of these semantics, each
+//! such U is MoveConstructible and MoveAssignable, but is not CopyConstructible nor CopyAssignable.
+//! The template parameter T of unique_ptr may be an incomplete type.
+//! 
+//! The uses of unique_ptr include providing exception safety for dynamically allocated memory, passing
+//! ownership of dynamically allocated memory to a function, and returning dynamically allocated memory from
+//! a function.
+//!
+//! If T is an array type (e.g. unique_ptr<MyType[]>) the interface is slightly altered:
+//!   - Pointers to types derived from T are rejected by the constructors, and by reset.
+//!   - The observers <tt>operator*</tt> and <tt>operator-></tt> are not provided.
+//!   - The indexing observer <tt>operator[]</tt> is provided.
+//!
+//! \tparam T Provides the type of the stored pointer.
+//! \tparam D The deleter type:
+//!   -  The default type for the template parameter D is default_delete. A client-supplied template argument
+//!      D shall be a function object type, lvalue-reference to function, or lvalue-reference to function object type
+//!      for which, given a value d of type D and a value ptr of type unique_ptr<T, D>::pointer, the expression
+//!      d(ptr) is valid and has the effect of disposing of the pointer as appropriate for that deleter.
+//!   -  If the deleter's type D is not a reference type, D shall satisfy the requirements of Destructible.
+//!   -  If the type <tt>remove_reference<D>::type::pointer</tt> exists, it shall satisfy the requirements of NullablePointer.
+template <class T, class D = default_delete<T> >
+class unique_ptr
+{
+   #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   public:
+   unique_ptr(const unique_ptr&) = delete;
+   unique_ptr& operator=(const unique_ptr&) = delete;
+   private:
+   #else
+   BOOST_MOVABLE_BUT_NOT_COPYABLE(unique_ptr)
+
+   typedef bmupmu::pointer_type<T, D >                            pointer_type_obtainer;
+   typedef bmupd::unique_ptr_data
+      <typename pointer_type_obtainer::type, D>                data_type;
+   typedef typename bmupd::deleter_types<D>::deleter_arg_type1 deleter_arg_type1;
+   typedef typename bmupd::deleter_types<D>::deleter_arg_type2 deleter_arg_type2;
+   data_type m_data;
+   #endif
+
+   public:
+   //! If the type <tt>remove_reference<D>::type::pointer</tt> exists, then it shall be a
+   //! synonym for <tt>remove_reference<D>::type::pointer</tt>. Otherwise it shall be a
+   //! synonym for T*.
+   typedef typename BOOST_MOVE_SEEDOC(pointer_type_obtainer::type) pointer;
+   //! If T is an array type, then element_type is equal to T. Otherwise, if T is a type
+   //! in the form U[], element_type is equal to U.
+   typedef typename BOOST_MOVE_SEEDOC(bmupmu::remove_extent<T>::type) element_type;
+   typedef D deleter_type;
+
+   //! <b>Requires</b>: D shall satisfy the requirements of DefaultConstructible, and
+   //!   that construction shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object that owns nothing, value-initializing the
+   //!   stored pointer and the stored deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == nullptr</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter.
+   //!
+   //! <b>Remarks</b>: If this constructor is instantiated with a pointer type or reference type
+   //!   for the template argument D, the program is ill-formed.   
+   BOOST_CONSTEXPR unique_ptr() BOOST_NOEXCEPT
+      : m_data()
+   {
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //! <b>Effects</b>: Same as <tt>unique_ptr()</tt> (default constructor).
+   //! 
+   BOOST_CONSTEXPR unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+      : m_data()
+   {
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //! <b>Requires</b>: D shall satisfy the requirements of DefaultConstructible, and
+   //!   that construction shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr which owns p, initializing the stored pointer 
+   //!   with p and value initializing the stored deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter.
+   //!
+   //! <b>Remarks</b>: If this constructor is instantiated with a pointer type or reference type
+   //!   for the template argument D, the program is ill-formed.
+   //!   This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   explicit unique_ptr(Pointer p
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+                 ) BOOST_NOEXCEPT
+      : m_data(p)
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //!The signature of this constructor depends upon whether D is a reference type.
+   //!   - If D is non-reference type A, then the signature is <tt>unique_ptr(pointer p, const A& d)</tt>.
+   //!   - If D is an lvalue-reference type A&, then the signature is <tt>unique_ptr(pointer p, A& d)</tt>.
+   //!   - If D is an lvalue-reference type const A&, then the signature is <tt>unique_ptr(pointer p, const A& d)</tt>.
+   //!
+   //!
+   //! <b>Requires</b>: Either
+   //!   - D is not an lvalue-reference type and d is an lvalue or const rvalue. 
+   //!         D shall satisfy the requirements of CopyConstructible, and the copy constructor of D
+   //!         shall not throw an exception. This unique_ptr will hold a copy of d.
+   //!   - D is an lvalue-reference type and d is an lvalue. the type which D references need not be CopyConstructible nor
+   //!      MoveConstructible. This unique_ptr will hold a D which refers to the lvalue d.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object which owns p, initializing the stored pointer with p and
+   //!   initializing the deleter as described above.
+   //! 
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter. If D is a
+   //!   reference type then <tt>get_deleter()</tt> returns a reference to the lvalue d.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   unique_ptr(Pointer p, BOOST_MOVE_SEEDOC(deleter_arg_type1) d1
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+              ) BOOST_NOEXCEPT
+      : m_data(p, d1)
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+   }
+
+   //! <b>Effects</b>: Same effects as <tt>template<class Pointer> unique_ptr(Pointer p, deleter_arg_type1 d1)</tt>
+   //!   and additionally <tt>get() == nullptr</tt>
+   unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), BOOST_MOVE_SEEDOC(deleter_arg_type1) d1) BOOST_NOEXCEPT
+      : m_data(pointer(), d1)
+   {}
+
+   //! The signature of this constructor depends upon whether D is a reference type.
+   //!   - If D is non-reference type A, then the signature is <tt>unique_ptr(pointer p, A&& d)</tt>.
+   //!   - If D is an lvalue-reference type A&, then the signature is <tt>unique_ptr(pointer p, A&& d)</tt>.
+   //!   - If D is an lvalue-reference type const A&, then the signature is <tt>unique_ptr(pointer p, const A&& d)</tt>.
+   //!
+   //! <b>Requires</b>: Either
+   //!   - D is not an lvalue-reference type and d is a non-const rvalue. D
+   //!      shall satisfy the requirements of MoveConstructible, and the move constructor
+   //!      of D shall not throw an exception. This unique_ptr will hold a value move constructed from d.
+   //!   - D is an lvalue-reference type and d is an rvalue, the program is ill-formed.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object which owns p, initializing the stored pointer with p and
+   //!   initializing the deleter as described above.
+   //! 
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter. If D is a
+   //!   reference type then <tt>get_deleter()</tt> returns a reference to the lvalue d.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   unique_ptr(Pointer p, BOOST_MOVE_SEEDOC(deleter_arg_type2) d2
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+             ) BOOST_NOEXCEPT
+      : m_data(p, ::boost::move(d2))
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+   }
+
+   //! <b>Effects</b>: Same effects as <tt>template<class Pointer> unique_ptr(Pointer p, deleter_arg_type2 d2)</tt>
+   //!   and additionally <tt>get() == nullptr</tt>
+   unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), BOOST_MOVE_SEEDOC(deleter_arg_type2) d2) BOOST_NOEXCEPT
+      : m_data(pointer(), ::boost::move(d2))
+   {}
+
+   //! <b>Requires</b>: If D is not a reference type, D shall satisfy the requirements of MoveConstructible.
+   //! Construction of the deleter from an rvalue of type D shall not throw an exception.
+   //! 
+   //! <b>Effects</b>: Constructs a unique_ptr by transferring ownership from u to *this. If D is a reference type,
+   //! this deleter is copy constructed from u's deleter; otherwise, this deleter is move constructed from u's
+   //! deleter.
+   //! 
+   //! <b>Postconditions</b>: <tt>get()</tt> yields the value u.get() yielded before the construction. <tt>get_deleter()</tt>
+   //! returns a reference to the stored deleter that was constructed from u.get_deleter(). If D is a
+   //! reference type then <tt>get_deleter()</tt> and <tt>u.get_deleter()</tt> both reference the same lvalue deleter.
+   unique_ptr(BOOST_RV_REF(unique_ptr) u) BOOST_NOEXCEPT
+      : m_data(u.release(), ::boost::move_if_not_lvalue_reference<D>(u.get_deleter()))
+   {}
+
+   //! <b>Requires</b>: If E is not a reference type, construction of the deleter from an rvalue of type E shall be
+   //!   well formed and shall not throw an exception. Otherwise, E is a reference type and construction of the
+   //!   deleter from an lvalue of type E shall be well formed and shall not throw an exception.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - <tt>unique_ptr<U, E>::pointer</tt> is implicitly convertible to pointer,
+   //!   - U is not an array type, and
+   //!   - either D is a reference type and E is the same type as D, or D is not a reference type and E is
+   //!      implicitly convertible to D.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr by transferring ownership from u to *this. If E is a reference type,
+   //!   this deleter is copy constructed from u's deleter; otherwise, this deleter is move constructed from u's deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get()</tt> yields the value <tt>u.get()</tt> yielded before the construction. <tt>get_deleter()</tt>
+   //!   returns a reference to the stored deleter that was constructed from <tt>u.get_deleter()</tt>.
+   template <class U, class E>
+   unique_ptr( BOOST_RV_REF_BEG_IF_CXX11 unique_ptr<U, E> BOOST_RV_REF_END_IF_CXX11 u
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_moveconv_constr<T BOOST_MOVE_I D BOOST_MOVE_I U BOOST_MOVE_I E>::type* =0)
+      ) BOOST_NOEXCEPT
+      : m_data(u.release(), ::boost::move_if_not_lvalue_reference<E>(u.get_deleter()))
+   {
+      //If T is not an array type, U derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename unique_ptr<U, E>::pointer>::value ));
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: If <tt>get() == nullpt1r</tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
+   //!
+   //! <b>Note</b>: The use of default_delete requires T to be a complete type
+   ~unique_ptr()
+   {  if(m_data.m_p) m_data.deleter()(m_data.m_p);   }
+
+   //! <b>Requires</b>: If D is not a reference type, D shall satisfy the requirements of MoveAssignable
+   //!   and assignment of the deleter from an rvalue of type D shall not throw an exception. Otherwise, D
+   //!   is a reference type; <tt>remove_reference<D>::type</tt> shall satisfy the CopyAssignable requirements and
+   //!   assignment of the deleter from an lvalue of type D shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Transfers ownership from u to *this as if by calling <tt>reset(u.release())</tt> followed
+   //!   by <tt>get_deleter() = std::forward<D>(u.get_deleter())</tt>.
+   //!
+   //! <b>Returns</b>: *this.
+   unique_ptr& operator=(BOOST_RV_REF(unique_ptr) u) BOOST_NOEXCEPT
+   {
+      this->reset(u.release());
+      m_data.deleter() = ::boost::move_if_not_lvalue_reference<D>(u.get_deleter());
+      return *this;
+   }
+
+   //! <b>Requires</b>: If E is not a reference type, assignment of the deleter from an rvalue of type E shall be
+   //!   well-formed and shall not throw an exception. Otherwise, E is a reference type and assignment of the
+   //!   deleter from an lvalue of type E shall be well-formed and shall not throw an exception.
+   //!
+   //! <b>Remarks</b>: This operator shall not participate in overload resolution unless:
+   //!   - <tt>unique_ptr<U, E>::pointer</tt> is implicitly convertible to pointer and
+   //!   - U is not an array type.
+   //!
+   //! <b>Effects</b>: Transfers ownership from u to *this as if by calling <tt>reset(u.release())</tt> followed by
+   //!   <tt>get_deleter() = std::forward<E>(u.get_deleter())</tt>.
+   //!
+   //! <b>Returns</b>: *this.
+   template <class U, class E>
+   BOOST_MOVE_DOC1ST(unique_ptr&, typename bmupd::enable_up_moveconv_assign
+         <T BOOST_MOVE_I D BOOST_MOVE_I U BOOST_MOVE_I E BOOST_MOVE_I unique_ptr &>::type)
+      operator=(BOOST_RV_REF_BEG unique_ptr<U, E> BOOST_RV_REF_END u) BOOST_NOEXCEPT
+   {
+      this->reset(u.release());
+      m_data.deleter() = ::boost::move_if_not_lvalue_reference<E>(u.get_deleter());
+      return *this;
+   }
+
+   //! <b>Effects</b>: <tt>reset()</tt>.
+   //!
+   //! <b>Postcondition</b>: <tt>get() == nullptr</tt>
+   //!
+   //! <b>Returns</b>: *this.
+   unique_ptr& operator=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+   {  this->reset(); return *this;  }
+
+   //! <b>Requires</b>: <tt>get() != nullptr</tt>.
+   //!
+   //! <b>Returns</b>: <tt>*get()</tt>.
+   //!
+   //! <b>Remarks</b: If T is an array type, the program is ill-formed.
+   BOOST_MOVE_DOC1ST(element_type&, typename bmupmu::add_lvalue_reference<element_type>::type)
+      operator*() const BOOST_NOEXCEPT
+   {
+      BOOST_STATIC_ASSERT((!bmupmu::is_array<T>::value));
+      return *m_data.m_p;
+   }
+
+   //! <b>Requires</b>: i < the number of elements in the array to which the stored pointer points.
+   //!
+   //! <b>Returns</b>: <tt>get()[i]</tt>.
+   //!
+   //! <b>Remarks</b: If T is not an array type, the program is ill-formed.
+   BOOST_MOVE_DOC1ST(element_type&, typename bmupmu::add_lvalue_reference<element_type>::type)
+      operator[](std::size_t i) const BOOST_NOEXCEPT
+   {
+      BOOST_ASSERT( bmupmu::extent<T>::value == 0 || i < bmupmu::extent<T>::value );
+      BOOST_ASSERT(m_data.m_p);
+      return m_data.m_p[i];
+   }
+
+   //! <b>Requires</b>: <tt>get() != nullptr</tt>.
+   //!
+   //! <b>Returns</b>: <tt>get()</tt>.
+   //!
+   //! <b>Note</b>: use typically requires that T be a complete type.
+   //!
+   //! <b>Remarks</b: If T is an array type, the program is ill-formed.
+   pointer operator->() const BOOST_NOEXCEPT
+   {
+      BOOST_STATIC_ASSERT((!bmupmu::is_array<T>::value));
+      BOOST_ASSERT(m_data.m_p);
+      return m_data.m_p;
+   }
+
+   //! <b>Returns</b>: The stored pointer.
+   //!
+   pointer get() const BOOST_NOEXCEPT
+   {  return m_data.m_p;  }
+
+   //! <b>Returns</b>: A reference to the stored deleter.
+   //!
+   BOOST_MOVE_DOC1ST(D&, typename bmupmu::add_lvalue_reference<D>::type)
+      get_deleter() BOOST_NOEXCEPT
+   {  return m_data.deleter();  }   
+
+   //! <b>Returns</b>: A reference to the stored deleter.
+   //!
+   BOOST_MOVE_DOC1ST(const D&, typename bmupmu::add_const_lvalue_reference<D>::type)
+      get_deleter() const BOOST_NOEXCEPT
+   {  return m_data.deleter();  }
+
+   #ifdef BOOST_MOVE_DOXYGEN_INVOKED
+   //! <b>Returns</b>: Returns: get() != nullptr.
+   //!
+   explicit operator bool
+   #else
+   operator bmupd::explicit_bool_arg
+   #endif
+      ()const BOOST_NOEXCEPT
+   {
+      return m_data.m_p
+         ? &bmupd::bool_conversion::for_bool
+         : bmupd::explicit_bool_arg(0);
+   }
+
+   //! <b>Postcondition</b>: <tt>get() == nullptr</tt>.
+   //!
+   //! <b>Returns</b>: The value <tt>get()</tt> had at the start of the call to release.   
+   pointer release() BOOST_NOEXCEPT
+   {
+      const pointer tmp = m_data.m_p;
+      m_data.m_p = pointer();
+      return tmp;
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: assigns p to the stored pointer, and then if the old value of the stored pointer, old_p, was not
+   //!   equal to nullptr, calls <tt>get_deleter()(old_p)</tt>. Note: The order of these operations is significant
+   //!   because the call to <tt>get_deleter()</tt> may destroy *this.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. Note: The postcondition does not hold if the call to <tt>get_deleter()</tt>
+   //!   destroys *this since <tt>this->get()</tt> is no longer a valid expression.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   BOOST_MOVE_DOC1ST(void, typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer BOOST_MOVE_I void>::type)
+      reset(Pointer p) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+      pointer tmp = m_data.m_p;
+      m_data.m_p = p;
+      if(tmp) m_data.deleter()(tmp);
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: assigns nullptr to the stored pointer, and then if the old value of the stored pointer, old_p, was not
+   //!   equal to nullptr, calls <tt>get_deleter()(old_p)</tt>. Note: The order of these operations is significant
+   //!   because the call to <tt>get_deleter()</tt> may destroy *this.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. Note: The postcondition does not hold if the call to <tt>get_deleter()</tt>
+   //!   destroys *this since <tt>this->get()</tt> is no longer a valid expression.
+   void reset() BOOST_NOEXCEPT
+   {  this->reset(pointer());  }
+
+   //! <b>Effects</b>: Same as <tt>reset()</tt>
+   //! 
+   void reset(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+   {  this->reset(); }
+
+   //! <b>Requires</b>: <tt>get_deleter()</tt> shall be swappable and shall not throw an exception under swap.
+   //!
+   //! <b>Effects</b>: Invokes swap on the stored pointers and on the stored deleters of *this and u.
+   void swap(unique_ptr& u) BOOST_NOEXCEPT
+   {
+      ::boost::adl_move_swap(m_data.m_p, u.m_data.m_p);
+      ::boost::adl_move_swap(m_data.deleter(), u.m_data.deleter());
+   }
+};
+
+//! <b>Effects</b>: Calls <tt>x.swap(y)</tt>.
+//!
+template <class T, class D>
+inline void swap(unique_ptr<T, D> &x, unique_ptr<T, D> &y) BOOST_NOEXCEPT
+{  x.swap(y); }
+
+//! <b>Returns</b>: <tt>x.get() == y.get()</tt>.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator==(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() == y.get(); }
+
+//! <b>Returns</b>: <tt>x.get() != y.get()</tt>.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator!=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() != y.get(); }
+
+//! <b>Returns</b>: x.get() < y.get().
+//!
+//! <b>Remarks</b>: This comparison shall induce a
+//!   strict weak ordering betwen pointers.
+template <class T1, class D1, class T2, class D2>
+inline bool operator<(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() < y.get();  }
+
+//! <b>Returns</b>: !(y < x).
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator<=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return !(y < x);  }
+
+//! <b>Returns</b>: y < x.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator>(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return y < x;  }
+
+//! <b>Returns</b>:!(x < y).
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator>=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return !(x < y);  }
+
+//! <b>Returns</b>:!x.
+//!
+template <class T, class D>
+inline bool operator==(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+{  return !x;  }
+
+//! <b>Returns</b>:!x.
+//!
+template <class T, class D>
+inline bool operator==(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x) BOOST_NOEXCEPT
+{  return !x;  }
+
+//! <b>Returns</b>: (bool)x.
+//!
+template <class T, class D>
+inline bool operator!=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+{  return !!x;  }
+
+//! <b>Returns</b>: (bool)x.
+//!
+template <class T, class D>
+inline bool operator!=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x) BOOST_NOEXCEPT
+{  return !!x;  }
+
+//! <b>Requires</b>: <tt>operator </tt> shall induce a strict weak ordering on unique_ptr<T, D>::pointer values.
+//!
+//! <b>Returns</b>: Returns <tt>x.get() < pointer()</tt>.
+template <class T, class D>
+inline bool operator<(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return x.get() < typename unique_ptr<T, D>::pointer();  }
+
+//! <b>Requires</b>: <tt>operator </tt> shall induce a strict weak ordering on unique_ptr<T, D>::pointer values.
+//!
+//! <b>Returns</b>: Returns <tt>pointer() < x.get()</tt>.
+template <class T, class D>
+inline bool operator<(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return typename unique_ptr<T, D>::pointer() < x.get();  }
+
+//! <b>Returns</b>: <tt>nullptr < x</tt>.
+//!
+template <class T, class D>
+inline bool operator>(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return x.get() > typename unique_ptr<T, D>::pointer();  }
+
+//! <b>Returns</b>: <tt>x < nullptr</tt>.
+//!
+template <class T, class D>
+inline bool operator>(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return typename unique_ptr<T, D>::pointer() > x.get();  }
+
+//! <b>Returns</b>: <tt>!(nullptr < x)</tt>.
+//!
+template <class T, class D>
+inline bool operator<=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return !(bmupd::nullptr_type() < x);  }
+
+//! <b>Returns</b>: <tt>!(x < nullptr)</tt>.
+//!
+template <class T, class D>
+inline bool operator<=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return !(x < bmupd::nullptr_type());  }
+
+//! <b>Returns</b>: <tt>!(x < nullptr)</tt>.
+//!
+template <class T, class D>
+inline bool operator>=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return !(x < bmupd::nullptr_type());  }
+
+//! <b>Returns</b>: <tt>!(nullptr < x)</tt>.
+//!
+template <class T, class D>
+inline bool operator>=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return !(bmupd::nullptr_type() < x);  }
+
+}  //namespace movelib {
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/move/utility.hpp b/gatb-core/thirdparty/boost/move/utility.hpp
new file mode 100644
index 0000000..8f9c20b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/utility.hpp
@@ -0,0 +1,149 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+//! This header includes core utilities from <tt><boost/move/utility_core.hpp></tt> and defines
+//! some more advanced utilities such as:
+
+#ifndef BOOST_MOVE_MOVE_UTILITY_HPP
+#define BOOST_MOVE_MOVE_UTILITY_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/move/traits.hpp>
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   namespace boost {
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            move_if_noexcept()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && !has_move_emulation_enabled<T>::value
+      , typename ::boost::move_detail::add_const<T>::type &
+      >::type
+         move_if_noexcept(T& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value
+            && ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, rv<T>&>::type
+         move_if_noexcept(T& x) BOOST_NOEXCEPT
+   {
+      return *static_cast<rv<T>* >(::boost::move_detail::addressof(x));
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value
+            && ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value
+      , rv<T>&
+      >::type
+         move_if_noexcept(rv<T>& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value
+            && !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value
+      , typename ::boost::move_detail::add_const<T>::type &
+      >::type
+         move_if_noexcept(T& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value
+            && !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value
+      , typename ::boost::move_detail::add_const<T>::type &
+      >::type
+         move_if_noexcept(rv<T>& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   }  //namespace boost
+
+#else    //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+      #include <utility>
+
+      namespace boost{
+
+      using ::std::move_if_noexcept;
+
+      }  //namespace boost
+
+   #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
+
+      namespace boost {
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                            move_if_noexcept()
+      //
+      //////////////////////////////////////////////////////////////////////////////
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         //! This function provides a way to convert a reference into a rvalue reference
+         //! in compilers with rvalue references. For other compilers converts T & into
+         //! <i>::boost::rv<T> &</i> so that move emulation is activated. Reference
+         //! would be converted to rvalue reference only if input type is nothrow move
+         //! constructible or if it has no copy constructor. In all other cases const
+         //! reference would be returned
+         template <class T>
+         rvalue_reference_or_const_lvalue_reference move_if_noexcept(input_reference) noexcept;
+
+      #else //BOOST_MOVE_DOXYGEN_INVOKED
+
+         template <class T>
+         typename ::boost::move_detail::enable_if_c
+            < ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, T&&>::type
+               move_if_noexcept(T& x) BOOST_NOEXCEPT
+         {  return ::boost::move(x);   }
+
+         template <class T>
+         typename ::boost::move_detail::enable_if_c
+            < !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, const T&>::type
+               move_if_noexcept(T& x) BOOST_NOEXCEPT
+         {  return x;  }
+
+      #endif //BOOST_MOVE_DOXYGEN_INVOKED
+
+      }  //namespace boost {
+
+   #endif   //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+
+#endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_MOVE_UTILITY_HPP
diff --git a/gatb-core/thirdparty/boost/move/utility_core.hpp b/gatb-core/thirdparty/boost/move/utility_core.hpp
new file mode 100644
index 0000000..89e4f07
--- /dev/null
+++ b/gatb-core/thirdparty/boost/move/utility_core.hpp
@@ -0,0 +1,315 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+//! This header defines core utilities to ease the development
+//! of move-aware functions. This header minimizes dependencies
+//! from other libraries.
+
+#ifndef BOOST_MOVE_MOVE_UTILITY_CORE_HPP
+#define BOOST_MOVE_MOVE_UTILITY_CORE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/core.hpp>
+#include <boost/move/detail/meta_utils.hpp>
+#include <boost/static_assert.hpp>
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   namespace boost {
+
+   template<class T>
+   struct enable_move_utility_emulation
+   {
+      static const bool value = true;
+   };
+    
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            move()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < T &
+      , enable_move_utility_emulation<T>
+      , has_move_emulation_disabled<T>
+      >::type
+         move(T& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < rv<T>&
+      , enable_move_utility_emulation<T>
+      , has_move_emulation_enabled<T>
+      >::type
+         move(T& x) BOOST_NOEXCEPT
+   {
+      return *BOOST_MOVE_TO_RV_CAST(::boost::rv<T>*, ::boost::move_detail::addressof(x) );
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < rv<T>&
+      , enable_move_utility_emulation<T>
+      , has_move_emulation_enabled<T>
+      >::type
+         move(rv<T>& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            forward()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < T &
+      , enable_move_utility_emulation<T>
+      , ::boost::move_detail::is_rv<T>
+      >::type
+         forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return const_cast<T&>(x);
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < const T &
+      , enable_move_utility_emulation<T>
+      , ::boost::move_detail::is_not_rv<T>
+      >::type
+         forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                        move_if_not_lvalue_reference()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < T &
+      , enable_move_utility_emulation<T>
+      , ::boost::move_detail::is_rv<T>
+      >::type
+         move_if_not_lvalue_reference(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return const_cast<T&>(x);
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < typename ::boost::move_detail::add_lvalue_reference<T>::type
+      , enable_move_utility_emulation<T>
+      , ::boost::move_detail::is_not_rv<T>
+      , ::boost::move_detail::or_
+         < ::boost::move_detail::is_lvalue_reference<T>
+         , has_move_emulation_disabled<T>
+         >
+      >::type
+         move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type &x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_and
+      < rv<T>&
+      , enable_move_utility_emulation<T>
+      , ::boost::move_detail::is_not_rv<T>
+      , ::boost::move_detail::and_
+         < ::boost::move_detail::not_< ::boost::move_detail::is_lvalue_reference<T> >
+         , has_move_emulation_enabled<T>
+         >
+      >::type
+         move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type &x) BOOST_NOEXCEPT
+   {
+      return move(x);
+   }
+
+   }  //namespace boost
+
+#else    //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+      #include <utility>
+
+      namespace boost{
+
+      using ::std::move;
+      using ::std::forward;
+
+      }  //namespace boost
+
+   #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
+
+      namespace boost {
+
+      //! This trait's internal boolean `value` is false in compilers with rvalue references
+      //! and true in compilers without rvalue references.
+      //!
+      //! A user can specialize this trait for a type T to false to SFINAE out `move` and `forward`
+      //! so that the user can define a different move emulation for that type in namespace boost
+      //! (e.g. another Boost library for its types) and avoid any overload ambiguity.
+      template<class T>
+      struct enable_move_utility_emulation
+      {
+         static const bool value = false;
+      };
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                                  move
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         //! This function provides a way to convert a reference into a rvalue reference
+         //! in compilers with rvalue references. For other compilers if `T` is Boost.Move
+         //! enabled type then it converts `T&` into <tt>::boost::rv<T> &</tt> so that
+         //! move emulation is activated, else it returns `T &`.
+         template <class T>
+         rvalue_reference move(input_reference) noexcept;
+
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+         template <class T>
+         inline typename ::boost::move_detail::remove_reference<T>::type && move(T&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+
+         template <class T>
+         inline typename ::boost::move_detail::remove_reference<T>::type && move(T&& t) BOOST_NOEXCEPT
+         { return static_cast<typename ::boost::move_detail::remove_reference<T>::type &&>(t); }
+
+      #endif   //BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                                  forward
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         //! This function provides limited form of forwarding that is usually enough for
+         //! in-place construction and avoids the exponential overloading for
+         //! achieve the limited forwarding in C++03.
+         //!
+         //! For compilers with rvalue references this function provides perfect forwarding.
+         //!
+         //! Otherwise:
+         //! * If input_reference binds to const ::boost::rv<T> & then it output_reference is
+         //!   ::boost::rv<T> &
+         //!
+         //! * Else, output_reference is equal to input_reference.
+         template <class T> output_reference forward(input_reference) noexcept;
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::identity<T>::type&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //Old move
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::remove_reference<T>::type& t) BOOST_NOEXCEPT
+         {  return static_cast<T&&>(t);   }
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::remove_reference<T>::type&& t) BOOST_NOEXCEPT
+         {
+            //"boost::forward<T> error: 'T' is a lvalue reference, can't forward as rvalue.";
+            BOOST_STATIC_ASSERT(!boost::move_detail::is_lvalue_reference<T>::value);
+            return static_cast<T&&>(t);
+         }
+
+      #endif   //BOOST_MOVE_DOXYGEN_INVOKED
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                         move_if_not_lvalue_reference
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         template <class T> output_reference move_if_not_lvalue_reference(input_reference) noexcept;
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::identity<T>::type&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //Old move
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type& t) BOOST_NOEXCEPT
+         {  return static_cast<T&&>(t);   }
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type&& t) BOOST_NOEXCEPT
+         {
+            //"boost::forward<T> error: 'T' is a lvalue reference, can't forward as rvalue.";
+            BOOST_STATIC_ASSERT(!boost::move_detail::is_lvalue_reference<T>::value);
+            return static_cast<T&&>(t);
+         }
+
+      #endif   //BOOST_MOVE_DOXYGEN_INVOKED
+
+      }  //namespace boost {
+
+   #endif   //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+
+#endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+namespace move_detail{
+
+template <typename T>
+typename boost::move_detail::add_rvalue_reference<T>::type declval();
+
+}  //namespace move_detail{
+}  //namespace boost{
+
+#endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_MOVE_UTILITY_CORE_HPP
diff --git a/gatb-core/thirdparty/boost/mpl/O1_size.hpp b/gatb-core/thirdparty/boost/mpl/O1_size.hpp
new file mode 100644
index 0000000..98bd3a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/O1_size.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_O1_SIZE_HPP_INCLUDED
+#define BOOST_MPL_O1_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/O1_size_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/O1_size_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+// returns sequence size if it's an O(1) operation; otherwise returns -1
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct O1_size
+    : O1_size_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, O1_size, (Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, O1_size)
+
+}}
+
+#endif // BOOST_MPL_O1_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/O1_size_fwd.hpp b/gatb-core/thirdparty/boost/mpl/O1_size_fwd.hpp
new file mode 100644
index 0000000..c84a7a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/O1_size_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED
+#define BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct O1_size_impl;
+template< typename Sequence > struct O1_size;
+
+}}
+
+#endif // BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/accumulate.hpp b/gatb-core/thirdparty/boost/mpl/accumulate.hpp
new file mode 100644
index 0000000..dc2c75e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/accumulate.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_ACCUMULATE_HPP_INCLUDED
+#define BOOST_MPL_ACCUMULATE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)
+    >
+struct accumulate
+    : fold<Sequence,State,ForwardOp>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,accumulate,(Sequence,State,ForwardOp))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, accumulate)
+
+}}
+
+#endif // BOOST_MPL_ACCUMULATE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/advance.hpp b/gatb-core/thirdparty/boost/mpl/advance.hpp
new file mode 100644
index 0000000..1af6004
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/advance.hpp
@@ -0,0 +1,76 @@
+
+#ifndef BOOST_MPL_ADVANCE_HPP_INCLUDED
+#define BOOST_MPL_ADVANCE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/advance_fwd.hpp>
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/negate.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/tag.hpp>
+#include <boost/mpl/apply_wrap.hpp>
+#include <boost/mpl/aux_/advance_forward.hpp>
+#include <boost/mpl/aux_/advance_backward.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation for forward/bidirectional iterators
+template< typename Tag >
+struct advance_impl
+{
+    template< typename Iterator, typename N > struct apply
+    {
+        typedef typename less< N,long_<0> >::type backward_;
+        typedef typename if_< backward_, negate<N>, N >::type offset_;
+
+        typedef typename if_<
+              backward_
+            , aux::advance_backward< BOOST_MPL_AUX_VALUE_WKND(offset_)::value >
+            , aux::advance_forward< BOOST_MPL_AUX_VALUE_WKND(offset_)::value >
+            >::type f_;
+
+        typedef typename apply_wrap1<f_,Iterator>::type type;
+    };
+};
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Iterator)
+    , typename BOOST_MPL_AUX_NA_PARAM(N)
+    >
+struct advance
+    : advance_impl< typename tag<Iterator>::type >
+        ::template apply<Iterator,N>
+{
+};
+
+template<
+      typename Iterator
+    , BOOST_MPL_AUX_NTTP_DECL(long, N)
+    >
+struct advance_c
+    : advance_impl< typename tag<Iterator>::type >
+        ::template apply<Iterator,long_<N> >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, advance)
+
+}}
+
+#endif // BOOST_MPL_ADVANCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/advance_fwd.hpp b/gatb-core/thirdparty/boost/mpl/advance_fwd.hpp
new file mode 100644
index 0000000..8038410
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/advance_fwd.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_ADVANCE_FWD_HPP_INCLUDED
+#define BOOST_MPL_ADVANCE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(advance)
+
+template< typename Tag > struct advance_impl;
+template< typename Iterator, typename N > struct advance;
+
+}}
+
+#endif // BOOST_MPL_ADVANCE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/alias.hpp b/gatb-core/thirdparty/boost/mpl/alias.hpp
new file mode 100644
index 0000000..f0fe0ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/alias.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_ALIAS_HPP_INCLUDED
+#define BOOST_MPL_ALIAS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace {
+namespace mpl = boost::mpl;
+}
+
+#endif // BOOST_MPL_ALIAS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/always.hpp b/gatb-core/thirdparty/boost/mpl/always.hpp
new file mode 100644
index 0000000..5fe7132
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/always.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_ALWAYS_HPP_INCLUDED
+#define BOOST_MPL_ALWAYS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/arity_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Value > struct always
+{
+    template<
+        BOOST_MPL_PP_DEFAULT_PARAMS(BOOST_MPL_LIMIT_METAFUNCTION_ARITY, typename T, na)
+        >
+    struct apply
+    {
+        typedef Value type;
+    };
+};
+
+BOOST_MPL_AUX_ARITY_SPEC(0, always)
+
+}}
+
+#endif // BOOST_MPL_ALWAYS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/and.hpp b/gatb-core/thirdparty/boost/mpl/and.hpp
new file mode 100644
index 0000000..454aaf2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/and.hpp
@@ -0,0 +1,60 @@
+
+#ifndef BOOST_MPL_AND_HPP_INCLUDED
+#define BOOST_MPL_AND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/nested_type_wknd.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+
+// agurt, 19/may/04: workaround a conflict with <iso646.h> header's 
+// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(and)'
+// has to be checked in a separate condition, otherwise GCC complains 
+// about 'and' being an alternative token
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(and) 
+#   pragma push_macro("and")
+#   undef and
+#   define and(x)
+#endif
+#endif
+#endif
+
+#   define BOOST_MPL_PREPROCESSED_HEADER and.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(and) 
+#   pragma pop_macro("and")
+#endif
+#endif
+#endif
+
+#else
+
+#   define AUX778076_OP_NAME and_
+#   define AUX778076_OP_VALUE1 false
+#   define AUX778076_OP_VALUE2 true
+#   include <boost/mpl/aux_/logical_op.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/apply.hpp b/gatb-core/thirdparty/boost/mpl/apply.hpp
new file mode 100644
index 0000000..581eb68
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/apply.hpp
@@ -0,0 +1,229 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_APPLY_HPP_INCLUDED
+#define BOOST_MPL_APPLY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/apply_fwd.hpp>
+#   include <boost/mpl/apply_wrap.hpp>
+#   include <boost/mpl/placeholders.hpp>
+#   include <boost/mpl/lambda.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER apply.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/config/lambda.hpp>
+#   include <boost/mpl/aux_/config/dtp.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+#   define AUX778076_APPLY_PARAMS(param) \
+    BOOST_MPL_PP_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        ) \
+    /**/
+
+#   define AUX778076_APPLY_DEF_PARAMS(param, value) \
+    BOOST_MPL_PP_DEFAULT_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        , value \
+        ) \
+    /**/
+
+#   define AUX778076_APPLY_N_PARAMS(n, param) \
+    BOOST_MPL_PP_PARAMS(n, param) \
+    /**/
+
+#   define AUX778076_APPLY_N_COMMA_PARAMS(n, param) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_MPL_PP_PARAMS(n, param) \
+    /**/
+
+#   define AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(n, param, def) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \
+    /**/
+    
+#   define AUX778076_APPLY_N_SPEC_PARAMS(n, param) \
+    BOOST_MPL_PP_ENUM(BOOST_PP_INC(n), param) \
+    /**/
+
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply.hpp>))
+#include BOOST_PP_ITERATE()
+
+#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)
+// real C++ version is already taken care of
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+namespace aux {
+// apply_count_args
+#define AUX778076_COUNT_ARGS_PREFIX apply
+#define AUX778076_COUNT_ARGS_DEFAULT na
+#define AUX778076_COUNT_ARGS_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#include <boost/mpl/aux_/count_args.hpp>
+}
+
+
+template<
+      typename F, AUX778076_APPLY_DEF_PARAMS(typename T, na)
+    >
+struct apply
+    : aux::apply_chooser< 
+          aux::apply_count_args< AUX778076_APPLY_PARAMS(T) >::value
+        >::template result_< F, AUX778076_APPLY_PARAMS(T) >::type
+{
+};
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE
+
+#   undef AUX778076_APPLY_N_SPEC_PARAMS
+#   undef AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS
+#   undef AUX778076_APPLY_N_COMMA_PARAMS
+#   undef AUX778076_APPLY_N_PARAMS
+#   undef AUX778076_APPLY_DEF_PARAMS
+#   undef AUX778076_APPLY_PARAMS
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_APPLY_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+
+#   define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply,i_)
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    : BOOST_PP_CAT(apply_wrap,i_)< 
+          typename lambda<F>::type
+        AUX778076_APPLY_N_COMMA_PARAMS(i_, T)
+        >
+{
+#else
+{
+    typedef typename BOOST_PP_CAT(apply_wrap,i_)< 
+          typename lambda<F>::type
+        AUX778076_APPLY_N_COMMA_PARAMS(i_, T)
+        >::type type;
+#endif
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          BOOST_PP_INC(i_)
+        , BOOST_PP_CAT(apply,i_)
+        , (F AUX778076_APPLY_N_COMMA_PARAMS(i_,T))
+        )
+};
+
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+/// workaround for ETI bug
+template<>
+struct BOOST_PP_CAT(apply,i_)<AUX778076_APPLY_N_SPEC_PARAMS(i_, int)>
+{
+    typedef int type;
+};
+#endif
+
+#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+#if i_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+/// primary template (not a specialization!)
+template<
+      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)
+    >
+struct apply
+    : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) >
+{
+};
+#else
+template<
+      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)
+    >
+struct apply< F AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(i_, T, na) >
+    : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) >
+{
+};
+#endif
+
+#   else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)
+namespace aux {
+
+template<>
+struct apply_chooser<i_>
+{
+    template<
+          typename F, AUX778076_APPLY_PARAMS(typename T)
+        >
+    struct result_
+    {
+        typedef BOOST_PP_CAT(apply,i_)<
+              F AUX778076_APPLY_N_COMMA_PARAMS(i_, T)
+            > type;
+    };
+};
+
+} // namespace aux
+#endif
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE
+
+#   undef i_
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/apply_fwd.hpp
new file mode 100644
index 0000000..5f5fa78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/apply_fwd.hpp
@@ -0,0 +1,107 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_APPLY_FWD_HPP_INCLUDED
+#define BOOST_MPL_APPLY_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/aux_/na.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER apply_fwd.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+// agurt, 15/jan/02: top-level 'apply' template gives an ICE on MSVC
+// (for known reasons)
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#   define BOOST_MPL_CFG_NO_APPLY_TEMPLATE
+#endif
+
+namespace boost { namespace mpl {
+
+// local macro, #undef-ined at the end of the header
+#   define AUX778076_APPLY_DEF_PARAMS(param, value) \
+    BOOST_MPL_PP_DEFAULT_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        , value \
+        ) \
+    /**/
+
+#   define AUX778076_APPLY_N_COMMA_PARAMS(n, param) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_MPL_PP_PARAMS(n, param) \
+    /**/
+
+#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+// forward declaration
+template<
+      typename F, AUX778076_APPLY_DEF_PARAMS(typename T, na)
+    >
+struct apply;
+#else
+namespace aux {
+template< BOOST_AUX_NTTP_DECL(int, arity_) > struct apply_chooser;
+}
+#endif
+
+#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply_fwd.hpp>))
+#include BOOST_PP_ITERATE()
+
+
+#   undef AUX778076_APPLY_N_COMMA_PARAMS
+#   undef AUX778076_APPLY_DEF_PARAMS
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_APPLY_FWD_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply,i_);
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/apply_wrap.hpp
new file mode 100644
index 0000000..b807779
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/apply_wrap.hpp
@@ -0,0 +1,234 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_APPLY_WRAP_HPP_INCLUDED
+#define BOOST_MPL_APPLY_WRAP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/aux_/arity.hpp>
+#   include <boost/mpl/aux_/has_apply.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/msvc_never_true.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER apply_wrap.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/preprocessor/add.hpp>
+#   include <boost/mpl/aux_/config/bcc.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/dtp.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/logical/and.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+#   define AUX778076_APPLY_WRAP_PARAMS(n, param) \
+    BOOST_MPL_PP_PARAMS(n, param) \
+    /**/
+
+#   define AUX778076_APPLY_WRAP_SPEC_PARAMS(n, param) \
+    BOOST_MPL_PP_ENUM(BOOST_PP_INC(n), param) \
+    /**/
+
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply_wrap.hpp>))
+#include BOOST_PP_ITERATE()
+
+
+#   undef AUX778076_APPLY_WRAP_SPEC_PARAMS
+#   undef AUX778076_APPLY_WRAP_PARAMS
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_APPLY_WRAP_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+
+#   define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+// MSVC version
+
+#define AUX778076_MSVC_DTW_NAME BOOST_PP_CAT(msvc_apply,i_)
+#define AUX778076_MSVC_DTW_ORIGINAL_NAME apply
+#define AUX778076_MSVC_DTW_ARITY i_
+#include <boost/mpl/aux_/msvc_dtw.hpp>
+
+template<
+      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply_wrap,i_)
+{
+    // Metafunction forwarding confuses vc6
+    typedef typename BOOST_PP_CAT(msvc_apply,i_)<F>::template result_<
+          AUX778076_APPLY_WRAP_PARAMS(i_, T)
+        >::type type;
+};
+
+#   elif defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+// MWCW/Borland version
+
+template<
+      int N, typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply_wrap_impl,i_);
+
+#define BOOST_PP_ITERATION_PARAMS_2 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY - i_, <boost/mpl/apply_wrap.hpp>))
+#include BOOST_PP_ITERATE()
+
+template<
+      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply_wrap,i_)
+    : BOOST_PP_CAT(apply_wrap_impl,i_)<
+          ::boost::mpl::aux::arity<F,i_>::value
+        , F
+        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)
+        >::type
+{
+};
+
+#   else
+// ISO98 C++, with minor concession to vc7
+
+template<
+      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+#if i_ == 0
+    , typename has_apply_ = typename aux::has_apply<F>::type
+#endif
+    >
+struct BOOST_PP_CAT(apply_wrap,i_)
+// metafunction forwarding confuses MSVC 7.0
+#if !BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+    : F::template apply< AUX778076_APPLY_WRAP_PARAMS(i_, T) >
+{
+#else
+{    
+    typedef typename F::template apply<
+         AUX778076_APPLY_WRAP_PARAMS(i_, T)
+        >::type type;
+#endif
+};
+
+#if i_ == 0 && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+template< typename F >
+struct BOOST_PP_CAT(apply_wrap,i_)<F,true_>
+    : F::apply
+{
+};
+#endif
+
+#   endif // workarounds
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+/// workaround for ETI bug
+template<>
+struct BOOST_PP_CAT(apply_wrap,i_)<AUX778076_APPLY_WRAP_SPEC_PARAMS(i_, int)>
+{
+    typedef int type;
+};
+#endif
+
+#   undef i_
+
+///// iteration, depth == 2
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#   define j_ BOOST_PP_FRAME_ITERATION(2)
+
+#if i_ == 0 && j_ == 0 \
+    && defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS) \
+    && !defined(BOOST_MPL_CFG_NO_HAS_APPLY)
+
+template< typename F, bool F_has_apply >
+struct apply_wrap_impl0_bcb {
+    typedef typename F::template apply< na > type;
+};
+
+template< typename F >
+struct apply_wrap_impl0_bcb< F, true > {
+    typedef typename F::apply type;
+};
+
+template<
+      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply_wrap_impl,i_)<
+          BOOST_MPL_PP_ADD(i_, j_)
+        , F
+        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)
+        >
+{
+    typedef apply_wrap_impl0_bcb< F, aux::has_apply< F >::value >::type type;
+};
+#else
+
+template<
+      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(apply_wrap_impl,i_)<
+          BOOST_MPL_PP_ADD(i_, j_)
+        , F
+        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)
+        >
+{
+    typedef typename F::template apply<
+          AUX778076_APPLY_WRAP_PARAMS(i_, T)
+#if i_ == 0 && j_ == 0
+/// since the defaults are "lost", we have to pass *something* even for nullary
+/// metafunction classes
+        na
+#else
+        BOOST_PP_COMMA_IF(BOOST_PP_AND(i_, j_)) BOOST_MPL_PP_ENUM(j_, na)
+#endif
+        > type;
+};
+
+#endif
+
+#   undef j_
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/arg.hpp b/gatb-core/thirdparty/boost/mpl/arg.hpp
new file mode 100644
index 0000000..f51adfa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/arg.hpp
@@ -0,0 +1,131 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_ARG_HPP_INCLUDED
+#define BOOST_MPL_ARG_HPP_INCLUDED
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/arg_fwd.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/na_assert.hpp>
+#   include <boost/mpl/aux_/arity_spec.hpp>
+#   include <boost/mpl/aux_/arg_typedef.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER arg.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/config/lambda.hpp>
+#   include <boost/mpl/aux_/config/dtp.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+// local macro, #undef-ined at the end of the header
+#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#   define AUX778076_ARG_N_DEFAULT_PARAMS(param,value) \
+    BOOST_MPL_PP_DEFAULT_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        , value \
+        ) \
+    /**/
+#else
+#   define AUX778076_ARG_N_DEFAULT_PARAMS(param,value) \
+    BOOST_MPL_PP_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        ) \
+    /**/
+#endif
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/arg.hpp>))
+#include BOOST_PP_ITERATE()
+
+
+#   undef AUX778076_ARG_N_DEFAULT_PARAMS
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int,arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_ARG_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if i_ > 0
+
+template<> struct arg<i_>
+{
+    BOOST_STATIC_CONSTANT(int, value = i_);
+    typedef arg<BOOST_PP_INC(i_)> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          AUX778076_ARG_N_DEFAULT_PARAMS(typename U, na)
+        >
+    struct apply
+    {
+        typedef BOOST_PP_CAT(U,i_) type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+#else
+
+template<> struct arg<-1>
+{
+    BOOST_STATIC_CONSTANT(int, value = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          AUX778076_ARG_N_DEFAULT_PARAMS(typename U, na)
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+#endif // i_ > 0
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/arg_fwd.hpp b/gatb-core/thirdparty/boost/mpl/arg_fwd.hpp
new file mode 100644
index 0000000..7346dc3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/arg_fwd.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_ARG_FWD_HPP_INCLUDED
+#define BOOST_MPL_ARG_FWD_HPP_INCLUDED
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct arg;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(arg)
+
+#endif // BOOST_MPL_ARG_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/arithmetic.hpp b/gatb-core/thirdparty/boost/mpl/arithmetic.hpp
new file mode 100644
index 0000000..7729fd2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/arithmetic.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_ARITHMETIC_HPP_INCLUDED
+#define BOOST_MPL_ARITHMETIC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/times.hpp>
+#include <boost/mpl/divides.hpp>
+#include <boost/mpl/modulus.hpp>
+#include <boost/mpl/negate.hpp>
+#include <boost/mpl/multiplies.hpp> // deprecated
+
+#endif // BOOST_MPL_ARITHMETIC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/as_sequence.hpp b/gatb-core/thirdparty/boost/mpl/as_sequence.hpp
new file mode 100644
index 0000000..7e671b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/as_sequence.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_AS_SEQUENCE_HPP_INCLUDED
+#define BOOST_MPL_AS_SEQUENCE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/single_view.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct as_sequence
+    : if_< is_sequence<T>, T, single_view<T> >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,as_sequence,(T))
+};
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, as_sequence)
+
+}}
+
+#endif // BOOST_MPL_AS_SEQUENCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/assert.hpp b/gatb-core/thirdparty/boost/mpl/assert.hpp
new file mode 100644
index 0000000..4d860a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/assert.hpp
@@ -0,0 +1,439 @@
+
+#ifndef BOOST_MPL_ASSERT_HPP_INCLUDED
+#define BOOST_MPL_ASSERT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/nested_type_wknd.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/adl_barrier.hpp>
+
+#include <boost/mpl/aux_/config/nttp.hpp>
+#include <boost/mpl/aux_/config/dtp.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/gpu.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/pp_counter.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+
+#include <boost/config.hpp> // make sure 'size_t' is placed into 'std'
+#include <cstddef>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+#include <boost/mpl/if.hpp>
+#endif
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+    || (BOOST_MPL_CFG_GCC != 0) \
+    || BOOST_WORKAROUND(__IBMCPP__, <= 600)
+#   define BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES
+#endif
+
+#if BOOST_WORKAROUND(__MWERKS__, < 0x3202) \
+    || BOOST_WORKAROUND(__EDG_VERSION__, <= 238) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+#   define BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER
+#endif
+
+// agurt, 10/nov/06: use enums for Borland (which cannot cope with static constants) 
+// and GCC (which issues "unused variable" warnings when static constants are used 
+// at a function scope)
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+    || (BOOST_MPL_CFG_GCC != 0) || (BOOST_MPL_CFG_GPU != 0)
+#   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
+#else
+#   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) BOOST_STATIC_CONSTANT(T, expr)
+#endif
+
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+struct failed {};
+
+// agurt, 24/aug/04: MSVC 7.1 workaround here and below: return/accept 
+// 'assert<false>' by reference; can't apply it unconditionally -- apparently it
+// degrades the quality of GCC diagnostics
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+#   define AUX778076_ASSERT_ARG(x) x&
+#else
+#   define AUX778076_ASSERT_ARG(x) x
+#endif
+
+template< bool C >  struct assert        { typedef void* type; };
+template<>          struct assert<false> { typedef AUX778076_ASSERT_ARG(assert) type; };
+
+template< bool C >
+int assertion_failed( typename assert<C>::type );
+
+template< bool C >
+struct assertion
+{
+    static int failed( assert<false> );
+};
+
+template<>
+struct assertion<true>
+{
+    static int failed( void* );
+};
+
+struct assert_
+{
+#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+    template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};
+#endif
+    static assert_ const arg;
+    enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };
+};
+
+
+#if !defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)
+
+bool operator==( failed, failed );
+bool operator!=( failed, failed );
+bool operator>( failed, failed );
+bool operator>=( failed, failed );
+bool operator<( failed, failed );
+bool operator<=( failed, failed );
+
+#if defined(__EDG_VERSION__)
+template< bool (*)(failed, failed), long x, long y > struct assert_relation {};
+#   define BOOST_MPL_AUX_ASSERT_RELATION(x, y, r) assert_relation<r,x,y>
+#else
+template< BOOST_MPL_AUX_NTTP_DECL(long, x), BOOST_MPL_AUX_NTTP_DECL(long, y), bool (*)(failed, failed) > 
+struct assert_relation {};
+#   define BOOST_MPL_AUX_ASSERT_RELATION(x, y, r) assert_relation<x,y,r>
+#endif
+
+#else // BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES
+
+boost::mpl::aux::weighted_tag<1>::type operator==( assert_, assert_ );
+boost::mpl::aux::weighted_tag<2>::type operator!=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<3>::type operator>(  assert_, assert_ );
+boost::mpl::aux::weighted_tag<4>::type operator>=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<5>::type operator<( assert_, assert_ );
+boost::mpl::aux::weighted_tag<6>::type operator<=( assert_, assert_ );
+
+template< assert_::relations r, long x, long y > struct assert_relation {};
+
+#endif 
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+
+template<class Pred>
+struct extract_assert_pred;
+
+template<class Pred>
+struct extract_assert_pred<void(Pred)> { typedef Pred type; };
+
+template<class Pred>
+struct eval_assert {
+    typedef typename extract_assert_pred<Pred>::type P;
+    typedef typename P::type p_type;
+    typedef typename ::boost::mpl::if_c<p_type::value,
+        AUX778076_ASSERT_ARG(assert<false>),
+        failed ************ P::************
+    >::type type;
+};
+
+template<class Pred>
+struct eval_assert_not {
+    typedef typename extract_assert_pred<Pred>::type P;
+    typedef typename P::type p_type;
+    typedef typename ::boost::mpl::if_c<!p_type::value,
+        AUX778076_ASSERT_ARG(assert<false>),
+        failed ************ ::boost::mpl::not_<P>::************
+    >::type type;
+};
+
+template< typename T >
+T make_assert_arg();
+
+#elif !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
+
+template< bool > struct assert_arg_pred_impl { typedef int type; };
+template<> struct assert_arg_pred_impl<true> { typedef void* type; };
+
+template< typename P > struct assert_arg_pred
+{
+    typedef typename P::type p_type;
+    typedef typename assert_arg_pred_impl< p_type::value >::type type;
+};
+
+template< typename P > struct assert_arg_pred_not
+{
+    typedef typename P::type p_type;
+    BOOST_MPL_AUX_ASSERT_CONSTANT( bool, p = !p_type::value );
+    typedef typename assert_arg_pred_impl<p>::type type;
+};
+
+template< typename Pred >
+failed ************ (Pred::************ 
+      assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )
+    );
+
+template< typename Pred >
+failed ************ (boost::mpl::not_<Pred>::************ 
+      assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )
+    );
+
+template< typename Pred >
+AUX778076_ASSERT_ARG(assert<false>)
+assert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );
+
+template< typename Pred >
+AUX778076_ASSERT_ARG(assert<false>)
+assert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );
+
+
+#else // BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER
+        
+template< bool c, typename Pred > struct assert_arg_type_impl
+{
+    typedef failed      ************ Pred::* mwcw83_wknd;
+    typedef mwcw83_wknd ************* type;
+};
+
+template< typename Pred > struct assert_arg_type_impl<true,Pred>
+{
+    typedef AUX778076_ASSERT_ARG(assert<false>) type;
+};
+
+template< typename Pred > struct assert_arg_type
+    : assert_arg_type_impl< BOOST_MPL_AUX_VALUE_WKND(BOOST_MPL_AUX_NESTED_TYPE_WKND(Pred))::value, Pred >
+{
+};
+
+template< typename Pred >
+typename assert_arg_type<Pred>::type 
+assert_arg(void (*)(Pred), int);
+
+template< typename Pred >
+typename assert_arg_type< boost::mpl::not_<Pred> >::type 
+assert_not_arg(void (*)(Pred), int);
+
+#   if !defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)
+template< long x, long y, bool (*r)(failed, failed) >
+typename assert_arg_type_impl< false,BOOST_MPL_AUX_ASSERT_RELATION(x,y,r) >::type
+assert_rel_arg( BOOST_MPL_AUX_ASSERT_RELATION(x,y,r) );
+#   else
+template< assert_::relations r, long x, long y >
+typename assert_arg_type_impl< false,assert_relation<r,x,y> >::type
+assert_rel_arg( assert_relation<r,x,y> );
+#   endif
+
+#endif // BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER
+
+#undef AUX778076_ASSERT_ARG
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+
+// BOOST_MPL_ASSERT((pred<x,...>))
+
+#define BOOST_MPL_ASSERT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+          boost::mpl::assertion_failed<false>( \
+              boost::mpl::make_assert_arg< \
+                  typename boost::mpl::eval_assert<void pred>::type \
+                >() \
+            ) \
+        ) \
+    ) \
+/**/
+
+// BOOST_MPL_ASSERT_NOT((pred<x,...>))
+
+#define BOOST_MPL_ASSERT_NOT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+          boost::mpl::assertion_failed<false>( \
+              boost::mpl::make_assert_arg< \
+                  typename boost::mpl::eval_assert_not<void pred>::type \
+                >() \
+            ) \
+        ) \
+    ) \
+/**/
+
+#else
+
+// BOOST_MPL_ASSERT((pred<x,...>))
+
+#define BOOST_MPL_ASSERT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+          boost::mpl::assertion_failed<false>( \
+              boost::mpl::assert_arg( (void (*) pred)0, 1 ) \
+            ) \
+        ) \
+    ) \
+/**/
+
+// BOOST_MPL_ASSERT_NOT((pred<x,...>))
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#   define BOOST_MPL_ASSERT_NOT(pred) \
+enum { \
+      BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+          boost::mpl::assertion<false>::failed( \
+              boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
+            ) \
+        ) \
+}\
+/**/
+#else
+#   define BOOST_MPL_ASSERT_NOT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+          boost::mpl::assertion_failed<false>( \
+              boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
+            ) \
+        ) \
+   ) \
+/**/
+#endif
+
+#endif
+
+// BOOST_MPL_ASSERT_RELATION(x, ==|!=|<=|<|>=|>, y)
+
+#if defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)
+
+#   if !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
+// agurt, 9/nov/06: 'enum' below is a workaround for gcc 4.0.4/4.1.1 bugs #29522 and #29518
+#   define BOOST_MPL_ASSERT_RELATION_IMPL(counter, x, rel, y)      \
+enum { BOOST_PP_CAT(mpl_assert_rel_value,counter) = (x rel y) }; \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \
+        boost::mpl::assertion_failed<BOOST_PP_CAT(mpl_assert_rel_value,counter)>( \
+            (boost::mpl::failed ************ ( boost::mpl::assert_relation< \
+                  boost::mpl::assert_::relations( sizeof( \
+                      boost::mpl::assert_::arg rel boost::mpl::assert_::arg \
+                    ) ) \
+                , x \
+                , y \
+                >::************)) 0 ) \
+        ) \
+    ) \
+/**/
+#   else
+#   define BOOST_MPL_ASSERT_RELATION_IMPL(counter, x, rel, y)    \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assert_rel,counter) = sizeof( \
+          boost::mpl::assert_::arg rel boost::mpl::assert_::arg \
+        ) \
+    ); \
+BOOST_MPL_AUX_ASSERT_CONSTANT( bool, BOOST_PP_CAT(mpl_assert_rel_value,counter) = (x rel y) ); \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \
+        boost::mpl::assertion_failed<BOOST_PP_CAT(mpl_assert_rel_value,counter)>( \
+              boost::mpl::assert_rel_arg( boost::mpl::assert_relation< \
+                  boost::mpl::assert_::relations(BOOST_PP_CAT(mpl_assert_rel,counter)) \
+                , x \
+                , y \
+                >() ) \
+            ) \
+        ) \
+    ) \
+/**/
+#   endif
+
+#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \
+BOOST_MPL_ASSERT_RELATION_IMPL(BOOST_MPL_AUX_PP_COUNTER(), x, rel, y) \
+/**/
+
+#else // !BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES
+
+#   if defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
+#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+        boost::mpl::assertion_failed<(x rel y)>( boost::mpl::assert_rel_arg( \
+              boost::mpl::BOOST_MPL_AUX_ASSERT_RELATION(x,y,(&boost::mpl::operator rel))() \
+            ) ) \
+        ) \
+    ) \
+/**/
+#   else
+#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+        boost::mpl::assertion_failed<(x rel y)>( (boost::mpl::failed ************ ( \
+            boost::mpl::BOOST_MPL_AUX_ASSERT_RELATION(x,y,(&boost::mpl::operator rel))::************))0 ) \
+        ) \
+    ) \
+/**/
+#   endif
+
+#endif
+
+
+// BOOST_MPL_ASSERT_MSG( (pred<x,...>::value), USER_PROVIDED_MESSAGE, (types<x,...>) ) 
+
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202))
+#   define BOOST_MPL_ASSERT_MSG_IMPL( counter, c, msg, types_ ) \
+struct msg; \
+typedef struct BOOST_PP_CAT(msg,counter) : boost::mpl::assert_ \
+{ \
+    using boost::mpl::assert_::types; \
+    static boost::mpl::failed ************ (msg::************ assert_arg()) types_ \
+    { return 0; } \
+} BOOST_PP_CAT(mpl_assert_arg,counter); \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \
+        boost::mpl::assertion<(c)>::failed( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) \
+        ) \
+    ) \
+/**/
+#else
+#   define BOOST_MPL_ASSERT_MSG_IMPL( counter, c, msg, types_ )  \
+struct msg; \
+typedef struct BOOST_PP_CAT(msg,counter) : boost::mpl::assert_ \
+{ \
+    static boost::mpl::failed ************ (msg::************ assert_arg()) types_ \
+    { return 0; } \
+} BOOST_PP_CAT(mpl_assert_arg,counter); \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+      std::size_t \
+    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \
+        boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) \
+        ) \
+    ) \
+/**/
+#endif
+
+#define BOOST_MPL_ASSERT_MSG( c, msg, types_ ) \
+BOOST_MPL_ASSERT_MSG_IMPL( BOOST_MPL_AUX_PP_COUNTER(), c, msg, types_ ) \
+/**/
+
+#endif // BOOST_MPL_ASSERT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/at.hpp b/gatb-core/thirdparty/boost/mpl/at.hpp
new file mode 100644
index 0000000..aa90e59
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/at.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_AT_HPP_INCLUDED
+#define BOOST_MPL_AT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/at_fwd.hpp>
+#include <boost/mpl/aux_/at_impl.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(N)
+    >
+struct at
+    : at_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,N >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,at,(Sequence,N))
+};
+
+template<
+      typename Sequence
+    , BOOST_MPL_AUX_NTTP_DECL(long, N)
+    >
+struct at_c
+    : at_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,mpl::long_<N> >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, at)
+
+}}
+
+#endif // BOOST_MPL_AT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/at_fwd.hpp b/gatb-core/thirdparty/boost/mpl/at_fwd.hpp
new file mode 100644
index 0000000..6aaae38
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/at_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_AT_FWD_HPP_INCLUDED
+#define BOOST_MPL_AT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct at_impl;
+template< typename Sequence, typename N > struct at;
+
+}}
+
+#endif // BOOST_MPL_AT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/O1_size_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/O1_size_impl.hpp
new file mode 100644
index 0000000..3bcbd0f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/O1_size_impl.hpp
@@ -0,0 +1,87 @@
+
+#ifndef BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/O1_size_fwd.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/has_size.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation - returns 'Sequence::size' if sequence has a 'size'
+// member, and -1 otherwise; conrete sequences might override it by 
+// specializing either the 'O1_size_impl' or the primary 'O1_size' template
+
+#   if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+    && !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
+
+namespace aux {
+template< typename Sequence > struct O1_size_impl
+    : Sequence::size
+{
+};
+}
+
+template< typename Tag >
+struct O1_size_impl
+{
+    template< typename Sequence > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : if_<
+              aux::has_size<Sequence>
+            , aux::O1_size_impl<Sequence>
+            , long_<-1>
+            >::type
+    {
+#else
+    {
+        typedef typename if_<
+              aux::has_size<Sequence>
+            , aux::O1_size_impl<Sequence>
+            , long_<-1>
+            >::type type;
+
+        BOOST_STATIC_CONSTANT(long, value =
+              (if_<
+                  aux::has_size<Sequence>
+                , aux::O1_size_impl<Sequence>
+                , long_<-1>
+                >::type::value)
+            );
+#endif
+    };
+};
+
+#   else // BOOST_MSVC
+
+template< typename Tag >
+struct O1_size_impl
+{
+    template< typename Sequence > struct apply
+        : long_<-1>
+        {
+        };
+};
+
+#   endif
+
+}}
+
+#endif // BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/adl_barrier.hpp b/gatb-core/thirdparty/boost/mpl/aux_/adl_barrier.hpp
new file mode 100644
index 0000000..3968c24
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/adl_barrier.hpp
@@ -0,0 +1,48 @@
+
+#ifndef BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED
+#define BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/adl.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)
+
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE mpl_
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN namespace mpl_ {
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE }
+#   define BOOST_MPL_AUX_ADL_BARRIER_DECL(type) \
+    namespace boost { namespace mpl { \
+    using ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::type; \
+    } } \
+/**/
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+namespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE { namespace aux {} }
+namespace boost { namespace mpl { using namespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE; 
+namespace aux { using namespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::aux; }
+}}
+#endif
+
+#else // BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE
+
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE boost::mpl
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN namespace boost { namespace mpl {
+#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE }}
+#   define BOOST_MPL_AUX_ADL_BARRIER_DECL(type) /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/advance_backward.hpp
new file mode 100644
index 0000000..df56793
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/advance_backward.hpp
@@ -0,0 +1,128 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED
+#define BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/prior.hpp>
+#   include <boost/mpl/apply_wrap.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER advance_backward.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/unrolling.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+// forward declaration
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct advance_backward;
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/advance_backward.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<BOOST_MPL_LIMIT_UNROLLING>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - BOOST_MPL_LIMIT_UNROLLING) < 0
+                    ? 0
+                    : N - BOOST_MPL_LIMIT_UNROLLING
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<>
+struct advance_backward< BOOST_PP_FRAME_ITERATION(1) >
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+
+#if i_ > 0
+#   define BOOST_PP_ITERATION_PARAMS_2 \
+    (3,(1, BOOST_PP_FRAME_ITERATION(1), <boost/mpl/aux_/advance_backward.hpp>))
+#   include BOOST_PP_ITERATE()
+#endif
+
+        typedef BOOST_PP_CAT(iter,BOOST_PP_FRAME_ITERATION(1)) type;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+#endif
+};
+
+#undef i_
+
+///// iteration, depth == 2
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#   define AUX778076_ITER_0 BOOST_PP_CAT(iter,BOOST_PP_DEC(BOOST_PP_FRAME_ITERATION(2)))
+#   define AUX778076_ITER_1 BOOST_PP_CAT(iter,BOOST_PP_FRAME_ITERATION(2))
+
+        typedef typename prior<AUX778076_ITER_0>::type AUX778076_ITER_1;
+        
+#   undef AUX778076_ITER_1
+#   undef AUX778076_ITER_0
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/advance_forward.hpp
new file mode 100644
index 0000000..62b0101
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/advance_forward.hpp
@@ -0,0 +1,127 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_AUX_ADVANCE_FORWARD_HPP_INCLUDED
+#define BOOST_MPL_AUX_ADVANCE_FORWARD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/next.hpp>
+#   include <boost/mpl/apply_wrap.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER advance_forward.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/unrolling.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+// forward declaration
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct advance_forward;
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/advance_forward.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > 
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<BOOST_MPL_LIMIT_UNROLLING>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - BOOST_MPL_LIMIT_UNROLLING) < 0
+                    ? 0
+                    : N - BOOST_MPL_LIMIT_UNROLLING
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_ADVANCE_FORWARD_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<>
+struct advance_forward< BOOST_PP_FRAME_ITERATION(1) >
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+
+#if i_ > 0
+#   define BOOST_PP_ITERATION_PARAMS_2 \
+    (3,(1, i_, <boost/mpl/aux_/advance_forward.hpp>))
+#   include BOOST_PP_ITERATE()
+#endif
+        typedef BOOST_PP_CAT(iter,i_) type;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+#endif
+};
+
+#undef i_
+
+///// iteration, depth == 2
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#   define AUX778076_ITER_0 BOOST_PP_CAT(iter,BOOST_PP_DEC(BOOST_PP_FRAME_ITERATION(2)))
+#   define AUX778076_ITER_1 BOOST_PP_CAT(iter,BOOST_PP_FRAME_ITERATION(2))
+
+        typedef typename next<AUX778076_ITER_0>::type AUX778076_ITER_1;
+        
+#   undef AUX778076_ITER_1
+#   undef AUX778076_ITER_0
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/apply_1st.hpp b/gatb-core/thirdparty/boost/mpl/aux_/apply_1st.hpp
new file mode 100644
index 0000000..b567748
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/apply_1st.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_APPLY_1ST_HPP_INCLUDED
+#define BOOST_MPL_AUX_APPLY_1ST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/apply.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+struct apply_1st
+{
+    template< typename Pair, typename T > struct apply
+        : apply2<
+              typename Pair::first
+            , typename Pair::second
+            , T
+            >
+    {
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_APPLY_1ST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/arg_typedef.hpp b/gatb-core/thirdparty/boost/mpl/aux_/arg_typedef.hpp
new file mode 100644
index 0000000..362db16
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/arg_typedef.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED
+#define BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/lambda.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \
+    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+    
+#   define BOOST_MPL_AUX_ARG_TYPEDEF(T, name) typedef T name;
+
+#else
+
+#   define BOOST_MPL_AUX_ARG_TYPEDEF(T, name) /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/arithmetic_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/arithmetic_op.hpp
new file mode 100644
index 0000000..0171db5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/arithmetic_op.hpp
@@ -0,0 +1,92 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/integral_c.hpp>
+#   include <boost/mpl/aux_/largest_int.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#endif
+
+#if !defined(AUX778076_OP_PREFIX)
+#   define AUX778076_OP_PREFIX AUX778076_OP_NAME
+#endif
+
+#include <boost/mpl/aux_/numeric_op.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER AUX778076_OP_PREFIX.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/workaround.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+namespace aux {
+template< typename T, T n1, T n2 >
+struct BOOST_PP_CAT(AUX778076_OP_PREFIX,_wknd)
+{
+    BOOST_STATIC_CONSTANT(T, value = (n1 AUX778076_OP_TOKEN n2));
+    typedef integral_c<T,value> type;
+};
+}
+#endif
+
+template<>
+struct AUX778076_OP_IMPL_NAME<integral_c_tag,integral_c_tag>
+{
+    template< typename N1, typename N2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  AUX778076_OP_TOKEN BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+#else
+        : aux::BOOST_PP_CAT(AUX778076_OP_PREFIX,_wknd)<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+#endif
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#undef AUX778076_OP_TAG_NAME
+#undef AUX778076_OP_IMPL_NAME
+#undef AUX778076_OP_ARITY
+#undef AUX778076_OP_PREFIX
+#undef AUX778076_OP_NAME
+#undef AUX778076_OP_TOKEN
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/arity.hpp
new file mode 100644
index 0000000..d13ab4a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/arity.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_AUX_ARITY_HPP_INCLUDED
+#define BOOST_MPL_AUX_ARITY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/dtp.hpp>
+
+#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+// agurt, 15/mar/02: it's possible to implement the template so that it will 
+// "just work" and do not require any specialization, but not on the compilers
+// that require the arity workaround in the first place
+template< typename F, BOOST_MPL_AUX_NTTP_DECL(int, N) >
+struct arity
+{
+    BOOST_STATIC_CONSTANT(int, value = N);
+};
+
+}}}
+
+#endif // BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES
+
+#endif // BOOST_MPL_AUX_ARITY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/arity_spec.hpp b/gatb-core/thirdparty/boost/mpl/aux_/arity_spec.hpp
new file mode 100644
index 0000000..7c82214
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/arity_spec.hpp
@@ -0,0 +1,67 @@
+
+#ifndef BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED
+#define BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/limits/arity.hpp>
+#include <boost/mpl/aux_/config/dtp.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/arity.hpp>
+#include <boost/mpl/aux_/template_arity_fwd.hpp>
+#include <boost/mpl/aux_/config/ttp.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#   define BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,type,name) \
+namespace aux { \
+template< BOOST_MPL_AUX_NTTP_DECL(int, N), BOOST_MPL_PP_PARAMS(i,type T) > \
+struct arity< \
+      name< BOOST_MPL_PP_PARAMS(i,T) > \
+    , N \
+    > \
+{ \
+    BOOST_STATIC_CONSTANT(int \
+        , value = BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        ); \
+}; \
+} \
+/**/
+#else
+#   define BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,type,name) /**/
+#endif
+
+#   define BOOST_MPL_AUX_ARITY_SPEC(i,name) \
+    BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,typename,name) \
+/**/
+
+
+#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \
+    && !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+#   define BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(i, name) \
+namespace aux { \
+template< BOOST_MPL_PP_PARAMS(i,typename T) > \
+struct template_arity< name<BOOST_MPL_PP_PARAMS(i,T)> > \
+    : int_<i> \
+{ \
+}; \
+} \
+/**/
+#else
+#   define BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(i, name) /**/
+#endif
+
+
+#endif // BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/at_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/at_impl.hpp
new file mode 100644
index 0000000..9239374
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/at_impl.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_AUX_AT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_AT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/advance.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'at_impl' or the primary 'at' template
+
+template< typename Tag >
+struct at_impl
+{
+    template< typename Sequence, typename N > struct apply
+    {
+        typedef typename advance<
+              typename begin<Sequence>::type
+            , N
+            >::type iter_;
+
+        typedef typename deref<iter_>::type type;
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2, at_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_AT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/back_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/back_impl.hpp
new file mode 100644
index 0000000..a3c7248
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/back_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_AUX_BACK_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_BACK_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation, requires at least bi-directional iterators;
+// conrete sequences might override it by specializing either the 
+// 'back_impl' or the primary 'back' template
+
+template< typename Tag >
+struct back_impl
+{
+    template< typename Sequence > struct apply
+    {
+        typedef typename end<Sequence>::type end_;
+        typedef typename prior<end_>::type last_;
+        typedef typename deref<last_>::type type;
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, back_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_BACK_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/basic_bind.hpp
new file mode 100644
index 0000000..6c1f643
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/basic_bind.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_AUX_BASIC_BIND_HPP_INCLUDED
+#define BOOST_MPL_AUX_BASIC_BIND_HPP_INCLUDED
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT
+#include <boost/mpl/bind.hpp>
+
+#endif // BOOST_MPL_AUX_BASIC_BIND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/begin_end_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/begin_end_impl.hpp
new file mode 100644
index 0000000..58b70dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/begin_end_impl.hpp
@@ -0,0 +1,101 @@
+
+#ifndef BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/sequence_tag_fwd.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/aux_/has_begin.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl {
+
+
+namespace aux { 
+
+template< typename Sequence > 
+struct begin_type 
+{ 
+    typedef typename Sequence::begin type; 
+};
+template< typename Sequence > 
+struct end_type
+{ 
+    typedef typename Sequence::end type; 
+};
+
+}
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'begin_impl/end_impl' or the primary 
+// 'begin/end' templates
+
+template< typename Tag >
+struct begin_impl
+{
+    template< typename Sequence > struct apply
+    {
+        typedef typename eval_if<aux::has_begin<Sequence, true_>,
+                                 aux::begin_type<Sequence>, void_>::type type;
+    };
+};
+
+template< typename Tag >
+struct end_impl
+{
+    template< typename Sequence > struct apply
+    {
+        typedef typename eval_if<aux::has_begin<Sequence, true_>,
+                                 aux::end_type<Sequence>, void_>::type type;
+    };
+};
+
+// specialize 'begin_trait/end_trait' for two pre-defined tags
+
+#   define AUX778076_IMPL_SPEC(name, tag, result) \
+template<> \
+struct name##_impl<tag> \
+{ \
+    template< typename Sequence > struct apply \
+    { \
+        typedef result type; \
+    }; \
+}; \
+/**/
+
+// a sequence with nested 'begin/end' typedefs; just query them
+AUX778076_IMPL_SPEC(begin, nested_begin_end_tag, typename Sequence::begin)
+AUX778076_IMPL_SPEC(end, nested_begin_end_tag, typename Sequence::end)
+
+// if a type 'T' does not contain 'begin/end' or 'tag' members 
+// and doesn't specialize either 'begin/end' or 'begin_impl/end_impl' 
+// templates, then we end up here
+AUX778076_IMPL_SPEC(begin, non_sequence_tag, void_)
+AUX778076_IMPL_SPEC(end, non_sequence_tag, void_)
+AUX778076_IMPL_SPEC(begin, na, void_)
+AUX778076_IMPL_SPEC(end, na, void_)
+
+#   undef AUX778076_IMPL_SPEC
+
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(1,begin_impl)
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(1,end_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/clear_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/clear_impl.hpp
new file mode 100644
index 0000000..20b270c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/clear_impl.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl {
+
+// no default implementation; the definition is needed to make MSVC happy
+
+template< typename Tag >
+struct clear_impl
+{
+    template< typename Sequence > struct apply;
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, clear_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/common_name_wknd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/common_name_wknd.hpp
new file mode 100644
index 0000000..00758b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/common_name_wknd.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED
+#define BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, < 0x561)
+// agurt, 12/nov/02: to suppress the bogus "Cannot have both a template class 
+// and function named 'xxx'" diagnostic
+#   define BOOST_MPL_AUX_COMMON_NAME_WKND(name) \
+namespace name_##wknd { \
+template< typename > void name(); \
+} \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_COMMON_NAME_WKND(name) /**/
+
+#endif // __BORLANDC__
+
+#endif // BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/comparison_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/comparison_op.hpp
new file mode 100644
index 0000000..2df72d3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/comparison_op.hpp
@@ -0,0 +1,83 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#endif
+
+#if !defined(AUX778076_OP_PREFIX)
+#   define AUX778076_OP_PREFIX AUX778076_OP_NAME
+#endif
+
+#define AUX778076_OP_ARITY 2
+
+#include <boost/mpl/aux_/numeric_op.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER AUX778076_OP_PREFIX.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/integral.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+// MSVC workaround: implement less in terms of greater
+#if 0 AUX778076_OP_TOKEN 1 && !(1 AUX778076_OP_TOKEN 0) && !(0 AUX778076_OP_TOKEN 0)
+#   define AUX778076_OP(N1, N2) \
+    ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) \
+/**/
+#else
+#   define AUX778076_OP(N1, N2) \
+    ( BOOST_MPL_AUX_VALUE_WKND(N1)::value \
+          AUX778076_OP_TOKEN BOOST_MPL_AUX_VALUE_WKND(N2)::value \
+        ) \
+/**/
+#endif
+
+template<>
+struct AUX778076_OP_IMPL_NAME<integral_c_tag,integral_c_tag>
+{
+    template< typename N1, typename N2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+        : bool_< AUX778076_OP(N1, N2) >
+    {
+#else
+    {
+        BOOST_STATIC_CONSTANT(bool, value = AUX778076_OP(N1, N2));
+        typedef bool_<value> type;
+#endif
+    };
+};
+
+#undef AUX778076_OP
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#undef AUX778076_OP_TAG_NAME
+#undef AUX778076_OP_IMPL_NAME
+#undef AUX778076_OP_ARITY
+#undef AUX778076_OP_PREFIX
+#undef AUX778076_OP_NAME
+#undef AUX778076_OP_TOKEN
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/adl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/adl.hpp
new file mode 100644
index 0000000..e9bdf11
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/adl.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/intel.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// agurt, 25/apr/04: technically, the ADL workaround is only needed for GCC,
+// but putting everything expect public, user-specializable metafunctions into
+// a separate global namespace has a nice side effect of reducing the length 
+// of template instantiation symbols, so we apply the workaround on all 
+// platforms that can handle it
+
+#if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE) \
+    && (   BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
+        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \
+        || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
+        || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) \
+        )
+
+#   define BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/arrays.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/arrays.hpp
new file mode 100644
index 0000000..a9ea68a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/arrays.hpp
@@ -0,0 +1,30 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && ( BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+        )
+
+#   define BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/bcc.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/bcc.hpp
new file mode 100644
index 0000000..fe4941a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/bcc.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date: 2004-09-02 10:41:37 -0500 (Thu, 02 Sep 2004) $
+// $Revision: 24874 $
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__BORLANDC__, >= 0x590) \
+    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+
+#   define BOOST_MPL_CFG_BCC590_WORKAROUNDS
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/bind.hpp
new file mode 100644
index 0000000..10bcb94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/bind.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED
+
+// Copyright David Abrahams 2002
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        )
+
+#   define BOOST_MPL_CFG_NO_BIND_TEMPLATE
+
+#endif
+
+//#define BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT
+
+#endif // BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/compiler.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/compiler.hpp
new file mode 100644
index 0000000..7d3e3b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/compiler.hpp
@@ -0,0 +1,66 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_CFG_COMPILER_DIR)
+
+#   include <boost/mpl/aux_/config/dtp.hpp>
+#   include <boost/mpl/aux_/config/ttp.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/gcc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#       define BOOST_MPL_CFG_COMPILER_DIR msvc60
+
+#   elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+#       define BOOST_MPL_CFG_COMPILER_DIR msvc70
+
+#   elif BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304))
+#       define BOOST_MPL_CFG_COMPILER_DIR gcc
+
+#   elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#       if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#           define BOOST_MPL_CFG_COMPILER_DIR bcc551
+#       elif BOOST_WORKAROUND(__BORLANDC__, >= 0x590)
+#           define BOOST_MPL_CFG_COMPILER_DIR bcc
+#       else
+#           define BOOST_MPL_CFG_COMPILER_DIR bcc_pre590
+#       endif
+
+#   elif BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+#       define BOOST_MPL_CFG_COMPILER_DIR dmc
+
+#   elif defined(__MWERKS__)
+#       if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#           define BOOST_MPL_CFG_COMPILER_DIR mwcw
+#       else
+#           define BOOST_MPL_CFG_COMPILER_DIR plain
+#       endif
+
+#   elif defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#       define BOOST_MPL_CFG_COMPILER_DIR no_ctps
+
+#   elif defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS)
+#       define BOOST_MPL_CFG_COMPILER_DIR no_ttp
+
+#   else
+#       define BOOST_MPL_CFG_COMPILER_DIR plain
+#   endif
+
+#endif // BOOST_MPL_CFG_COMPILER_DIR
+
+#endif // BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/ctps.hpp
new file mode 100644
index 0000000..af78f47
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/ctps.hpp
@@ -0,0 +1,30 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/config.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__BORLANDC__, < 0x582)
+
+#   define BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC
+
+#endif
+
+// BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION is defined in <boost/config.hpp>
+
+#endif // BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/dependent_nttp.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/dependent_nttp.hpp
new file mode 100644
index 0000000..5c2e24d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/dependent_nttp.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_DEPENDENT_NTTP_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_DEPENDENT_NTTP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// GCC and EDG-based compilers incorrectly reject the following code:
+//   template< typename T, T n > struct a;
+//   template< typename T > struct b;
+//   template< typename T, T n > struct b< a<T,n> > {};
+
+#if    !defined(BOOST_MPL_CFG_NO_DEPENDENT_NONTYPE_PARAMETER_IN_PARTIAL_SPEC) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(300)) \
+        || BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0302)) \
+        )
+
+#   define BOOST_MPL_CFG_NO_DEPENDENT_NONTYPE_PARAMETER_IN_PARTIAL_SPEC
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_DEPENDENT_NTTP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp
new file mode 100644
index 0000000..9f8ea8c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+
+#   define BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/dtp.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/dtp.hpp
new file mode 100644
index 0000000..4379b6b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/dtp.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// MWCW 7.x-8.0 "losts" default template parameters of nested class 
+// templates when their owner classes are passed as arguments to other 
+// templates; Borland 5.5.1 "forgets" them from the very beginning (if 
+// the owner class is a class template), and Borland 5.6 isn't even
+// able to compile a definition of nested class template with DTP
+
+#if    !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__BORLANDC__, >= 0x560) \
+    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+
+#   define BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES
+
+#endif
+
+
+#if    !defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   BOOST_WORKAROUND(__MWERKS__, <= 0x3001) \
+        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        || defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \
+        )
+        
+#   define BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/eti.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/eti.hpp
new file mode 100644
index 0000000..519d433
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/eti.hpp
@@ -0,0 +1,47 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// flags for MSVC 6.5's so-called "early template instantiation bug"
+#if    !defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+#   define BOOST_MPL_CFG_MSVC_60_ETI_BUG
+
+#endif
+
+#if    !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+
+#   define BOOST_MPL_CFG_MSVC_70_ETI_BUG
+
+#endif
+
+#if    !defined(BOOST_MPL_CFG_MSVC_ETI_BUG) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && ( defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) \
+        || defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG) \
+        )
+
+#   define BOOST_MPL_CFG_MSVC_ETI_BUG
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/forwarding.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/forwarding.hpp
new file mode 100644
index 0000000..b4296ad
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/forwarding.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+
+#   define BOOST_MPL_CFG_NO_NESTED_FORWARDING
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/gcc.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/gcc.hpp
new file mode 100644
index 0000000..080495d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/gcc.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if defined(__GNUC__) && !defined(__EDG_VERSION__)
+#   define BOOST_MPL_CFG_GCC ((__GNUC__ << 8) | __GNUC_MINOR__)
+#else
+#   define BOOST_MPL_CFG_GCC 0
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/gpu.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/gpu.hpp
new file mode 100644
index 0000000..0e5ed78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/gpu.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
+
+// Copyright Eric Niebler 2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_MPL_CFG_GPU_ENABLED) \
+
+#   define BOOST_MPL_CFG_GPU_ENABLED BOOST_GPU_ENABLED
+
+#endif
+
+#if defined __CUDACC__
+
+#    define BOOST_MPL_CFG_GPU 1
+
+#else
+
+#    define BOOST_MPL_CFG_GPU 0
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/has_apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/has_apply.hpp
new file mode 100644
index 0000000..4dc01c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/has_apply.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/has_xxx.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_HAS_APPLY) \
+    && (   defined(BOOST_MPL_CFG_NO_HAS_XXX) \
+        || BOOST_WORKAROUND(__EDG_VERSION__, < 300) \
+        || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+        || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
+        )
+
+#   define BOOST_MPL_CFG_NO_HAS_APPLY
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/has_xxx.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/has_xxx.hpp
new file mode 100644
index 0000000..b0f2f8c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/has_xxx.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+// Copyright David Abrahams 2002-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/overload_resolution.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// agurt, 11/jan/03: signals a stub-only 'has_xxx' implementation
+
+#if !defined(BOOST_MPL_CFG_NO_HAS_XXX) \
+    && (   defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION) \
+        || BOOST_WORKAROUND(__GNUC__, <= 2) \
+        || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \
+        )
+
+#   define BOOST_MPL_CFG_NO_HAS_XXX
+#   define BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/integral.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/integral.hpp
new file mode 100644
index 0000000..144542d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/integral.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+
+#   define BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS
+
+#endif
+
+#if    !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && ( BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+        || BOOST_WORKAROUND(__EDG_VERSION__, <= 238) \
+        )
+
+#   define BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/intel.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/intel.hpp
new file mode 100644
index 0000000..5bd9159
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/intel.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+
+// BOOST_INTEL_CXX_VERSION is defined here:
+#include <boost/config.hpp>
+
+#endif // BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/lambda.hpp
new file mode 100644
index 0000000..93fbafe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/lambda.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/ttp.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+// agurt, 15/jan/02: full-fledged implementation requires both 
+// template template parameters _and_ partial specialization
+
+#if    !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \
+    && (   defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \
+        || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+        )
+
+#   define BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/msvc.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/msvc.hpp
new file mode 100644
index 0000000..8a6b924
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/msvc.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+
+// BOOST_MSVC is defined here:
+#include <boost/config.hpp>
+
+#endif // BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/msvc_typename.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/msvc_typename.hpp
new file mode 100644
index 0000000..feedc16
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/msvc_typename.hpp
@@ -0,0 +1,26 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#   define BOOST_MSVC_TYPENAME
+#else
+#   define BOOST_MSVC_TYPENAME typename
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/nttp.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/nttp.hpp
new file mode 100644
index 0000000..11125a9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/nttp.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// MSVC 6.5 ICE-s on the code as simple as this (see "aux_/nttp_decl.hpp"
+// for a workaround):
+//
+//    namespace std {
+//    template< typename Char > struct string;
+//    }
+//
+//    void foo(std::string<char>);
+//
+//    namespace boost { namespace mpl {
+//    template< int > struct arg;
+//    }}
+
+#if    !defined(BOOST_MPL_CFG_NTTP_BUG) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+#   define BOOST_MPL_CFG_NTTP_BUG
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/operators.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/operators.hpp
new file mode 100644
index 0000000..3fb9db3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/operators.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING) \
+    && ( BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        || BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \
+        || BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0295) \
+        || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) \
+        || BOOST_WORKAROUND(__NVCC__, BOOST_TESTED_AT(1)) \
+        )
+
+#   define BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/overload_resolution.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/overload_resolution.hpp
new file mode 100644
index 0000000..61e4486
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/overload_resolution.hpp
@@ -0,0 +1,29 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if    !defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   BOOST_WORKAROUND(__BORLANDC__, < 0x590) \
+        || BOOST_WORKAROUND(__MWERKS__, < 0x3001) \
+        )
+
+#   define BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/pp_counter.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/pp_counter.hpp
new file mode 100644
index 0000000..e7fb8d6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/pp_counter.hpp
@@ -0,0 +1,26 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_AUX_PP_COUNTER)
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   if BOOST_WORKAROUND(BOOST_MSVC, >= 1300)
+#       define BOOST_MPL_AUX_PP_COUNTER() __COUNTER__
+#   else
+#       define BOOST_MPL_AUX_PP_COUNTER() __LINE__
+#   endif
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/preprocessor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/preprocessor.hpp
new file mode 100644
index 0000000..82ebc68
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/preprocessor.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION) \
+    && (   BOOST_WORKAROUND(__MWERKS__, <= 0x3003) \
+        || BOOST_WORKAROUND(__BORLANDC__, < 0x582) \
+        || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(502)) \
+        )
+
+#   define BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION
+
+#endif
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+#   define BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES
+#endif
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING) \
+    && BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+#   define BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING
+#endif
+
+
+#endif // BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/static_constant.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/static_constant.hpp
new file mode 100644
index 0000000..ece38fb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/static_constant.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+// BOOST_STATIC_CONSTANT is defined here:
+#   include <boost/config.hpp>
+#else
+// undef the macro for the preprocessing mode
+#   undef BOOST_STATIC_CONSTANT
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/ttp.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/ttp.hpp
new file mode 100644
index 0000000..3aff3f8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/ttp.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \
+    && ( defined(BOOST_NO_TEMPLATE_TEMPLATES) \
+      || BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x590) ) \
+       )
+
+#   define BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS
+
+#endif
+
+
+#if    !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0302)) \
+        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+        )
+
+#   define BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/typeof.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/typeof.hpp
new file mode 100644
index 0000000..cde6179
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/typeof.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_TYPEOF_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_TYPEOF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/gcc.hpp>
+
+#if !defined(BOOST_MPL_CFG_HAS_TYPEOF) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && (   defined(BOOST_MPL_CFG_GCC) && BOOST_MPL_CFG_GCC >= 0x0302 \
+        || defined(__MWERKS__) && __MWERKS__ >= 0x3000 \
+        )
+
+#   define BOOST_MPL_CFG_HAS_TYPEOF
+
+#endif
+
+
+#if !defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE) \
+    && defined(BOOST_MPL_CFG_HAS_TYPEOF)
+
+#   define BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_TYPEOF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/use_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/use_preprocessed.hpp
new file mode 100644
index 0000000..8fd5c60
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/use_preprocessed.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/config/workaround.hpp b/gatb-core/thirdparty/boost/mpl/aux_/config/workaround.hpp
new file mode 100644
index 0000000..82c6329
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/config/workaround.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/detail/workaround.hpp>
+
+#endif // BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/contains_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/contains_impl.hpp
new file mode 100644
index 0000000..b80caea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/contains_impl.hpp
@@ -0,0 +1,61 @@
+
+#ifndef BOOST_MPL_AUX_CONTAINS_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONTAINS_IMPL_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/contains_fwd.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/find.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Tag >
+struct contains_impl
+{
+    template< typename Sequence, typename T > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : not_< is_same<
+              typename find<Sequence,T>::type
+            , typename end<Sequence>::type
+            > >
+    {
+#else
+    {
+        typedef not_< is_same<
+              typename find<Sequence,T>::type
+            , typename end<Sequence>::type
+            > > type;
+
+        BOOST_STATIC_CONSTANT(bool, value = 
+              (not_< is_same<
+                  typename find<Sequence,T>::type
+                , typename end<Sequence>::type
+                > >::value)
+            );
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2,contains_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_CONTAINS_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/count_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/count_args.hpp
new file mode 100644
index 0000000..b432d37
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/count_args.hpp
@@ -0,0 +1,105 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/expr_if.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#if !defined(AUX778076_COUNT_ARGS_PARAM_NAME)
+#   define AUX778076_COUNT_ARGS_PARAM_NAME T
+#endif
+
+#if !defined(AUX778076_COUNT_ARGS_TEMPLATE_PARAM)
+#   define AUX778076_COUNT_ARGS_TEMPLATE_PARAM typename AUX778076_COUNT_ARGS_PARAM_NAME
+#endif
+
+// local macros, #undef-ined at the end of the header
+
+#if !defined(AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES)
+
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+
+#   define AUX778076_COUNT_ARGS_REPEAT BOOST_MPL_PP_REPEAT
+#   define AUX778076_COUNT_ARGS_PARAMS(param) \
+    BOOST_MPL_PP_PARAMS( \
+          AUX778076_COUNT_ARGS_ARITY \
+        , param \
+        ) \
+    /**/
+
+#else
+
+#   include <boost/preprocessor/enum_shifted_params.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+
+#   define AUX778076_COUNT_ARGS_REPEAT BOOST_PP_REPEAT
+#   define AUX778076_COUNT_ARGS_PARAMS(param) \
+    BOOST_PP_ENUM_SHIFTED_PARAMS( \
+          BOOST_PP_INC(AUX778076_COUNT_ARGS_ARITY) \
+        , param \
+        ) \
+    /**/
+
+#endif // AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES
+
+
+#define AUX778076_IS_ARG_TEMPLATE_NAME \
+    BOOST_PP_CAT(is_,BOOST_PP_CAT(AUX778076_COUNT_ARGS_PREFIX,_arg)) \
+/**/
+
+#define AUX778076_COUNT_ARGS_FUNC(unused, i, param) \
+    BOOST_PP_EXPR_IF(i, +) \
+    AUX778076_IS_ARG_TEMPLATE_NAME<BOOST_PP_CAT(param,BOOST_PP_INC(i))>::value \
+/**/
+
+// is_<xxx>_arg
+template< AUX778076_COUNT_ARGS_TEMPLATE_PARAM >
+struct AUX778076_IS_ARG_TEMPLATE_NAME
+{
+    BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template<>
+struct AUX778076_IS_ARG_TEMPLATE_NAME<AUX778076_COUNT_ARGS_DEFAULT>
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// <xxx>_count_args
+template<
+      AUX778076_COUNT_ARGS_PARAMS(AUX778076_COUNT_ARGS_TEMPLATE_PARAM)
+    >
+struct BOOST_PP_CAT(AUX778076_COUNT_ARGS_PREFIX,_count_args)
+{
+    BOOST_STATIC_CONSTANT(int, value = AUX778076_COUNT_ARGS_REPEAT(
+          AUX778076_COUNT_ARGS_ARITY
+        , AUX778076_COUNT_ARGS_FUNC
+        , AUX778076_COUNT_ARGS_PARAM_NAME
+        ));
+};
+
+#undef AUX778076_COUNT_ARGS_FUNC
+#undef AUX778076_IS_ARG_TEMPLATE_NAME
+#undef AUX778076_COUNT_ARGS_PARAMS
+#undef AUX778076_COUNT_ARGS_REPEAT
+
+#undef AUX778076_COUNT_ARGS_ARITY
+#undef AUX778076_COUNT_ARGS_DEFAULT
+#undef AUX778076_COUNT_ARGS_PREFIX
+#undef AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES
+#undef AUX778076_COUNT_ARGS_TEMPLATE_PARAM
+#undef AUX778076_COUNT_ARGS_PARAM_NAME
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/count_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/count_impl.hpp
new file mode 100644
index 0000000..2f1200c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/count_impl.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_AUX_COUNT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_COUNT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/count_fwd.hpp>
+#include <boost/mpl/count_if.hpp>
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct count_impl
+{
+    template< typename Sequence, typename T > struct apply
+#if BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x561))
+    {
+        typedef typename count_if< Sequence,same_as<T> >::type type;
+        BOOST_STATIC_CONSTANT(int, value = BOOST_MPL_AUX_VALUE_WKND(type)::value);
+#else
+        : count_if< Sequence,same_as<T> >
+    {
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2,count_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_COUNT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/empty_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/empty_impl.hpp
new file mode 100644
index 0000000..cfe55ae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/empty_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'empty_impl' or the primary 'empty' template
+
+template< typename Tag >
+struct empty_impl
+{
+    template< typename Sequence > struct apply
+        : is_same<
+              typename begin<Sequence>::type
+            , typename end<Sequence>::type
+            >
+    {
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1,empty_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/erase_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/erase_impl.hpp
new file mode 100644
index 0000000..ab763be
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/erase_impl.hpp
@@ -0,0 +1,69 @@
+
+#ifndef BOOST_MPL_AUX_ERASE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ERASE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/aux_/na.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'erase_impl' or the primary 'erase' template
+
+template< typename Tag >
+struct erase_impl
+{
+    template<
+          typename Sequence
+        , typename First
+        , typename Last
+        >
+    struct apply
+    {
+        typedef typename if_na< Last,typename next<First>::type >::type last_;
+        
+        // 1st half: [begin, first)
+        typedef iterator_range<
+              typename begin<Sequence>::type
+            , First
+            > first_half_;
+
+        // 2nd half: [last, end) ... that is, [last + 1, end)
+        typedef iterator_range<
+              last_
+            , typename end<Sequence>::type
+            > second_half_;
+
+        typedef typename reverse_fold<
+              second_half_
+            , typename clear<Sequence>::type
+            , push_front<_,_>
+            >::type half_sequence_;
+
+        typedef typename reverse_fold<
+              first_half_
+            , half_sequence_
+            , push_front<_,_>
+            >::type type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_ERASE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/erase_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/erase_key_impl.hpp
new file mode 100644
index 0000000..4d213a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/erase_key_impl.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_key_fwd.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Tag >
+struct erase_key_impl
+{
+    template< typename Sequence, typename Key > struct apply;
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2, erase_key_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/filter_iter.hpp b/gatb-core/thirdparty/boost/mpl/aux_/filter_iter.hpp
new file mode 100644
index 0000000..e4237f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/filter_iter.hpp
@@ -0,0 +1,140 @@
+
+#ifndef BOOST_MPL_AUX_FILTER_ITER_HPP_INCLUDED
+#define BOOST_MPL_AUX_FILTER_ITER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename Predicate
+    > 
+struct filter_iter;
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename Predicate
+    >
+struct next_filter_iter
+{
+    typedef typename find_if<
+          iterator_range<Iterator,LastIterator>
+        , Predicate
+        >::type base_iter_;
+ 
+    typedef filter_iter<base_iter_,LastIterator,Predicate> type;
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename Predicate
+    >
+struct filter_iter
+{
+    typedef Iterator base;
+    typedef forward_iterator_tag category;
+    typedef typename aux::next_filter_iter<
+          typename mpl::next<base>::type
+        , LastIterator
+        , Predicate
+        >::type next;
+    
+    typedef typename deref<base>::type type;
+};
+
+template<
+      typename LastIterator
+    , typename Predicate
+    >
+struct filter_iter< LastIterator,LastIterator,Predicate >
+{
+    typedef LastIterator base;
+    typedef forward_iterator_tag category;
+};
+
+#else
+
+template< bool >
+struct filter_iter_impl
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename Predicate
+        >
+    struct result_
+    {
+        typedef Iterator base;
+        typedef forward_iterator_tag category;
+        typedef typename next_filter_iter<
+              typename mpl::next<Iterator>::type
+            , LastIterator
+            , Predicate
+            >::type next;
+        
+        typedef typename deref<base>::type type;
+    };
+};
+
+template<>
+struct filter_iter_impl< true >
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename Predicate
+        >
+    struct result_
+    {
+        typedef Iterator base;
+        typedef forward_iterator_tag category;
+    };
+};
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename Predicate
+    >
+struct filter_iter
+    : filter_iter_impl<
+          ::boost::is_same<Iterator,LastIterator>::value
+        >::template result_< Iterator,LastIterator,Predicate >
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} // namespace aux
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, aux::filter_iter)
+
+}}
+
+#endif // BOOST_MPL_AUX_FILTER_ITER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/find_if_pred.hpp b/gatb-core/thirdparty/boost/mpl/aux_/find_if_pred.hpp
new file mode 100644
index 0000000..c07d89d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/find_if_pred.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED
+#define BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Eric Friedman 2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+#include <boost/mpl/aux_/iter_apply.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Predicate >
+struct find_if_pred
+{
+    template< typename Iterator >
+    struct apply
+    {
+        typedef not_< aux::iter_apply1<Predicate,Iterator> > type;
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/fold_impl.hpp
new file mode 100644
index 0000000..97c88c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/fold_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/next_prior.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#       include <boost/mpl/if.hpp>
+#       include <boost/type_traits/is_same.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER fold_impl.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   define AUX778076_FOLD_IMPL_OP(iter) typename deref<iter>::type
+#   define AUX778076_FOLD_IMPL_NAME_PREFIX fold
+#   include <boost/mpl/aux_/fold_impl_body.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/fold_impl_body.hpp b/gatb-core/thirdparty/boost/mpl/aux_/fold_impl_body.hpp
new file mode 100644
index 0000000..02dd645
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/fold_impl_body.hpp
@@ -0,0 +1,365 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#   include <boost/mpl/limits/unrolling.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/dec.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+// local macros, #undef-ined at the end of the header
+
+#   define AUX778076_ITER_FOLD_STEP(unused, i, unused2) \
+    typedef typename apply2< \
+          ForwardOp \
+        , BOOST_PP_CAT(state,i) \
+        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,i)) \
+        >::type BOOST_PP_CAT(state,BOOST_PP_INC(i)); \
+    typedef typename mpl::next<BOOST_PP_CAT(iter,i)>::type \
+        BOOST_PP_CAT(iter,BOOST_PP_INC(i)); \
+    /**/
+
+#   define AUX778076_FOLD_IMPL_NAME \
+    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \
+    /**/
+
+#   define AUX778076_FOLD_CHUNK_NAME \
+    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \
+    /**/
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME;
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+#   if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME
+{
+    typedef AUX778076_FOLD_IMPL_NAME<
+          BOOST_MPL_LIMIT_UNROLLING
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef AUX778076_FOLD_IMPL_NAME<
+          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+        
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+// fallback implementation for sequences of unknown size
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,ForwardOp>
+    : AUX778076_FOLD_IMPL_NAME<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,ForwardOp>
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+#   else // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+
+// Borland have some serious problems with the unrolled version, so
+// we always use a basic implementation
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME
+{
+    typedef AUX778076_FOLD_IMPL_NAME<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+    typedef state type;
+};
+
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N)
+     , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME<N,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+    typedef state type;
+};
+
+#   endif // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+ 
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
+struct AUX778076_FOLD_CHUNK_NAME;
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > 
+struct AUX778076_FOLD_CHUNK_NAME
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        > 
+    struct result_
+    {
+        typedef AUX778076_FOLD_IMPL_NAME<
+              BOOST_MPL_LIMIT_UNROLLING
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef AUX778076_FOLD_IMPL_NAME<
+              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+// fallback implementation for sequences of unknown size
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);
+
+template<
+      typename Last
+    , typename State
+    >
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<> 
+struct AUX778076_FOLD_CHUNK_NAME<-1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        > 
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same<First,Last>::type
+            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>
+            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,ForwardOp>
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct result_<int,int,int,int>
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+#endif
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)
+{
+    // can't inherit here - it breaks MSVC 7.0
+    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME
+    : AUX778076_FOLD_CHUNK_NAME<N>
+        ::template result_<First,Last,State,ForwardOp>
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}}
+
+#   undef AUX778076_FOLD_IMPL_NAME
+#   undef AUX778076_FOLD_CHUNK_NAME
+#   undef AUX778076_ITER_FOLD_STEP
+
+#undef AUX778076_FOLD_IMPL_OP
+#undef AUX778076_FOLD_IMPL_NAME_PREFIX
+
+///// iteration
+
+#else
+
+#   define n_ BOOST_PP_FRAME_ITERATION(1)
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,ForwardOp>
+{
+    typedef First iter0;
+    typedef State state0;
+
+    BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
+
+    typedef BOOST_PP_CAT(state,n_) state;
+    typedef BOOST_PP_CAT(iter,n_) iterator;
+};
+
+#else
+
+template<> struct AUX778076_FOLD_CHUNK_NAME<n_>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+
+        BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
+
+        typedef BOOST_PP_CAT(state,n_) state;
+        typedef BOOST_PP_CAT(iter,n_) iterator;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct result_<int,int,int,int>
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+#endif
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#   undef n_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/fold_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/fold_op.hpp
new file mode 100644
index 0000000..722c22c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/fold_op.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_AUX_FOLD_OP_HPP_INCLUDED
+#define BOOST_MPL_AUX_FOLD_OP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/apply.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+// hand-written version is more efficient than bind/lambda expression
+template< typename Op >
+struct fold_op
+{
+    template< typename T1, typename T2 > struct apply
+    {
+        typedef typename apply2<
+              Op
+            , T1
+            , typename T2::type
+            >::type type;
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_FOLD_OP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/fold_pred.hpp b/gatb-core/thirdparty/boost/mpl/aux_/fold_pred.hpp
new file mode 100644
index 0000000..3156400
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/fold_pred.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_AUX_FOLD_PRED_HPP_INCLUDED
+#define BOOST_MPL_AUX_FOLD_PRED_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/apply.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Last >
+struct fold_pred
+{
+    template<
+          typename State
+        , typename Iterator
+        >
+    struct apply
+        : not_same_as<Last>::template apply<Iterator>
+    {
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_FOLD_PRED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/front_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/front_impl.hpp
new file mode 100644
index 0000000..9493c1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/front_impl.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_AUX_FRONT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_FRONT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'front_impl' or the primary 'front' template
+
+template< typename Tag >
+struct front_impl
+{
+    template< typename Sequence > struct apply
+    {
+        typedef typename begin<Sequence>::type iter_;
+        typedef typename deref<iter_>::type type;
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1,front_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_FRONT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/full_lambda.hpp
new file mode 100644
index 0000000..918aff5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/full_lambda.hpp
@@ -0,0 +1,354 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
+#define BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/lambda_fwd.hpp>
+#   include <boost/mpl/bind_fwd.hpp>
+#   include <boost/mpl/protect.hpp>
+#   include <boost/mpl/quote.hpp>
+#   include <boost/mpl/arg.hpp>
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/int_fwd.hpp>
+#   include <boost/mpl/aux_/template_arity.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/config/ttp.hpp>
+#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+#       include <boost/mpl/if.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/lambda_arity_param.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER full_lambda.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+#   define AUX778076_LAMBDA_PARAMS(i_, param) \
+    BOOST_MPL_PP_PARAMS(i_, param) \
+    /**/
+
+#   define AUX778076_BIND_PARAMS(param) \
+    BOOST_MPL_PP_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        ) \
+    /**/
+
+#   define AUX778076_BIND_N_PARAMS(i_, param) \
+    BOOST_PP_COMMA_IF(i_) \
+    BOOST_MPL_PP_PARAMS(i_, param) \
+    /**/
+
+#   define AUX778076_ARITY_PARAM(param) \
+    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param) \
+    /**/
+
+
+#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+namespace aux {
+
+template<
+      BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >
+    : false_
+{
+};
+
+} // namespace aux
+#undef n_
+
+template<
+      typename T
+    , typename Tag
+    AUX778076_ARITY_PARAM(typename Arity)
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+
+template< int N, typename Tag >
+struct lambda< arg<N>,Tag AUX778076_ARITY_PARAM(int_<-1>) >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type; 
+};
+
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/full_lambda.hpp>))
+#include BOOST_PP_ITERATE()
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>,Tag AUX778076_ARITY_PARAM(int_<1>) >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+template<
+      typename F, AUX778076_BIND_PARAMS(typename T)
+    , typename Tag
+    >
+struct lambda<
+          bind<F,AUX778076_BIND_PARAMS(T)>
+        , Tag
+        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)>)
+        >
+{
+    typedef false_ is_le;
+    typedef bind<F, AUX778076_BIND_PARAMS(T)> result_;
+    typedef result_ type;
+};
+
+
+#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    , typename Arity
+    >
+struct lambda<
+          lambda<F,Tag1,Arity>
+        , Tag2
+        , int_<3>
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+
+    typedef typename l1::is_le is_le;
+    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
+    typedef lambda< typename if_<is_le,arity_,Arity>::type,Tag2 > l3;
+    
+    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+#elif !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+#endif
+
+#   undef AUX778076_ARITY_PARAM
+#   undef AUX778076_BIND_N_PARAMS
+#   undef AUX778076_BIND_PARAMS
+#   undef AUX778076_LAMBDA_PARAMS
+
+#if !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+#else
+BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
+#endif
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if i_ > 0
+
+namespace aux {
+
+#   define AUX778076_RESULT(unused, i_, T) \
+    BOOST_PP_COMMA_IF(i_) \
+    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::result_ \
+    /**/
+
+#   define AUX778076_TYPE(unused, i_, T) \
+    BOOST_PP_COMMA_IF(i_) \
+    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::type \
+    /**/
+
+template<
+      typename IsLE, typename Tag
+    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
+    , AUX778076_LAMBDA_PARAMS(i_, typename L)
+    >
+struct BOOST_PP_CAT(le_result,i_)
+{
+    typedef F<
+          BOOST_MPL_PP_REPEAT(i_, AUX778076_TYPE, L)
+        > result_;
+    
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
+    , AUX778076_LAMBDA_PARAMS(i_, typename L)
+    >
+struct BOOST_PP_CAT(le_result,i_)< true_,Tag,F,AUX778076_LAMBDA_PARAMS(i_, L) >
+{
+    typedef BOOST_PP_CAT(bind,i_)<
+          BOOST_PP_CAT(quote,i_)<F,Tag>
+        , BOOST_MPL_PP_REPEAT(i_, AUX778076_RESULT, L)
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+#   undef AUX778076_TYPE
+#   undef AUX778076_RESULT
+
+} // namespace aux
+
+
+#   define AUX778076_LAMBDA_TYPEDEF(unused, i_, T) \
+    typedef lambda< BOOST_PP_CAT(T, BOOST_PP_INC(i_)), Tag > \
+        BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \
+/**/
+
+#   define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \
+    typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \
+        BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \
+/**/
+
+#   define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \
+    BOOST_PP_COMMA_IF(i_) \
+    BOOST_PP_CAT(is_le,BOOST_PP_INC(i_))::value \
+/**/
+
+template<
+      template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
+    , AUX778076_LAMBDA_PARAMS(i_, typename T)
+    , typename Tag
+    >
+struct lambda< 
+          F<AUX778076_LAMBDA_PARAMS(i_, T)>
+        , Tag
+        AUX778076_ARITY_PARAM(int_<i_>)
+        >
+{
+    BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, T)
+    BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)
+
+    typedef typename aux::lambda_or<
+          BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)
+        >::type is_le;
+
+    typedef aux::BOOST_PP_CAT(le_result,i_)<
+          is_le, Tag, F, AUX778076_LAMBDA_PARAMS(i_, l)
+        > le_result_;
+    
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+
+#   undef AUX778076_IS_LAMBDA_EXPR
+#   undef AUX778076_IS_LE_TYPEDEF
+#   undef AUX778076_LAMBDA_TYPEDEF
+
+#endif // i_ > 0
+
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T)
+    , typename Tag
+    >
+struct lambda<
+          BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_, T)>
+        , Tag
+        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(i_)>)
+        >
+{
+    typedef false_ is_le;
+    typedef BOOST_PP_CAT(bind,i_)<
+          F
+        AUX778076_BIND_N_PARAMS(i_, T)
+        > result_;
+        
+    typedef result_ type;
+};
+
+#undef i_
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_apply.hpp
new file mode 100644
index 0000000..9c16a35
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_apply.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/aux_/config/has_apply.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+#if !defined(BOOST_MPL_CFG_NO_HAS_APPLY)
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_apply, apply, false)
+#else
+template< typename T, typename fallback_ = false_ >
+struct has_apply
+    : fallback_
+{
+};
+#endif
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_begin.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_begin.hpp
new file mode 100644
index 0000000..4ee415c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_begin.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_xxx.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_begin, begin, true)
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_key_impl.hpp
new file mode 100644
index 0000000..7a0e9b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_key_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+// Copyright David Abrahams 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_key_fwd.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+// no default implementation; the definition is needed to make MSVC happy 
+
+template< typename Tag > struct has_key_impl
+{
+    template< typename AssociativeSequence, typename Key > struct apply;
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2,has_key_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_rebind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_rebind.hpp
new file mode 100644
index 0000000..eb4eda6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_rebind.hpp
@@ -0,0 +1,99 @@
+
+#ifndef BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/intel.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)
+#   include <boost/mpl/has_xxx.hpp>
+#elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#   include <boost/mpl/has_xxx.hpp>
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/msvc_is_class.hpp>
+#elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/yes_no.hpp>
+#   include <boost/mpl/aux_/config/static_constant.hpp>
+#   include <boost/type_traits/is_class.hpp>
+#else
+#   include <boost/mpl/aux_/type_wrapper.hpp>
+#   include <boost/mpl/aux_/yes_no.hpp>
+#   include <boost/mpl/aux_/config/static_constant.hpp>
+#endif
+
+namespace boost { namespace mpl { namespace aux {
+
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)
+
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind, rebind, false)
+
+#elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind_impl, rebind, false)
+
+template< typename T >
+struct has_rebind
+    : if_< 
+          msvc_is_class<T>
+        , has_rebind_impl<T>
+        , bool_<false>
+        >::type
+{
+};
+
+#else // the rest
+
+template< typename T > struct has_rebind_tag {};
+no_tag operator|(has_rebind_tag<int>, void const volatile*);
+
+#   if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+template< typename T >
+struct has_rebind
+{
+    static has_rebind_tag<T>* get();
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag)
+        );
+};
+#   else // __BORLANDC__
+template< typename T >
+struct has_rebind_impl
+{
+    static T* get();
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag)
+        );
+};
+
+template< typename T >
+struct has_rebind
+    : if_< 
+          is_class<T>
+        , has_rebind_impl<T>
+        , bool_<false>
+        >::type
+{
+};
+#   endif // __BORLANDC__
+
+#endif
+
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_size.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_size.hpp
new file mode 100644
index 0000000..ff29913
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_size.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_xxx.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+BOOST_MPL_HAS_XXX_TRAIT_DEF(size)
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_tag.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_tag.hpp
new file mode 100644
index 0000000..3912a76
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_tag.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_xxx.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_tag, tag, false)
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/has_type.hpp b/gatb-core/thirdparty/boost/mpl/aux_/has_type.hpp
new file mode 100644
index 0000000..6744ef5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/has_type.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED
+#define BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_xxx.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_type, type, true)
+}}}
+
+#endif // BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/include_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/aux_/include_preprocessed.hpp
new file mode 100644
index 0000000..c13434c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/include_preprocessed.hpp
@@ -0,0 +1,42 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/compiler.hpp>
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_PREPROCESSED_HEADER \
+    BOOST_MPL_CFG_COMPILER_DIR/BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#else
+#   define AUX778076_PREPROCESSED_HEADER \
+    BOOST_PP_CAT(BOOST_MPL_CFG_COMPILER_DIR,/)##BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#endif
+
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))
+#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/aux_/preprocessed/AUX778076_PREPROCESSED_HEADER)
+#   include AUX778076_INCLUDE_STRING
+#   undef AUX778076_INCLUDE_STRING
+#else
+#   include BOOST_PP_STRINGIZE(boost/mpl/aux_/preprocessed/AUX778076_PREPROCESSED_HEADER)
+#endif
+
+#   undef AUX778076_PREPROCESSED_HEADER
+
+#undef BOOST_MPL_PREPROCESSED_HEADER
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/insert_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/insert_impl.hpp
new file mode 100644
index 0000000..03a304b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/insert_impl.hpp
@@ -0,0 +1,68 @@
+
+#ifndef BOOST_MPL_INSERT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_INSERT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'insert_impl' or the primary 'insert' template
+
+template< typename Tag >
+struct insert_impl
+{
+    template<
+          typename Sequence
+        , typename Pos
+        , typename T
+        >
+    struct apply
+    {
+        typedef iterator_range<
+              typename begin<Sequence>::type
+            , Pos
+            > first_half_;
+
+        typedef iterator_range<
+              Pos
+            , typename end<Sequence>::type
+            > second_half_;
+
+        typedef typename reverse_fold<
+              second_half_
+            , typename clear<Sequence>::type
+            , push_front<_,_>
+            >::type half_sequence_;
+
+        typedef typename reverse_fold<
+              first_half_
+            , typename push_front<half_sequence_,T>::type
+            , push_front<_,_>
+            >::type type;
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_impl)
+
+}}
+
+#endif // BOOST_MPL_INSERT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/insert_range_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/insert_range_impl.hpp
new file mode 100644
index 0000000..fa43315
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/insert_range_impl.hpp
@@ -0,0 +1,80 @@
+
+#ifndef BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/iter_push_front.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+#include <boost/type_traits/same_traits.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'insert_range_impl' or the primary 
+// 'insert_range' template
+
+
+template< typename Tag >
+struct insert_range_impl
+{
+    template<
+          typename Sequence
+        , typename Pos
+        , typename Range
+        >
+    struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : reverse_fold<
+              joint_view<
+                  iterator_range<typename begin<Sequence>::type,Pos>
+                , joint_view<
+                      Range
+                    , iterator_range<Pos,typename end<Sequence>::type>
+                    >
+                >
+            , typename clear<Sequence>::type
+            , insert<_1, begin<_1>, _2>
+            >
+    {
+#else
+    {
+        typedef typename reverse_fold<
+                joint_view<
+                    iterator_range<typename begin<Sequence>::type,Pos>
+                  , joint_view<
+                        Range
+                      , iterator_range<Pos,typename end<Sequence>::type>
+                      >
+                  >
+              , typename clear<Sequence>::type
+              , insert<_1, begin<_1>, _2>
+              >::type type;
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_range_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/inserter_algorithm.hpp b/gatb-core/thirdparty/boost/mpl/aux_/inserter_algorithm.hpp
new file mode 100644
index 0000000..20ae816
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/inserter_algorithm.hpp
@@ -0,0 +1,159 @@
+
+#ifndef BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED
+#define BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/front_inserter.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/front_inserter.hpp>
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+#   define BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(arity, name) \
+BOOST_MPL_AUX_COMMON_NAME_WKND(name) \
+template< \
+      BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \
+    > \
+struct name \
+    : aux::name##_impl<BOOST_MPL_PP_PARAMS(arity, P)> \
+{ \
+}; \
+\
+template< \
+      BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \
+    > \
+struct name< BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P),na > \
+    : if_< has_push_back< typename clear<P1>::type> \
+        , aux::name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , back_inserter< typename clear<P1>::type > \
+            > \
+        , aux::reverse_##name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , front_inserter< typename clear<P1>::type > \
+            > \
+        >::type \
+{ \
+}; \
+\
+template< \
+      BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \
+    > \
+struct reverse_##name \
+    : aux::reverse_##name##_impl<BOOST_MPL_PP_PARAMS(arity, P)> \
+{ \
+}; \
+\
+template< \
+      BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \
+    > \
+struct reverse_##name< BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P),na > \
+    : if_< has_push_back<P1> \
+        , aux::reverse_##name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , back_inserter< typename clear<P1>::type > \
+            > \
+        , aux::name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , front_inserter< typename clear<P1>::type > \
+            > \
+        >::type \
+{ \
+}; \
+BOOST_MPL_AUX_NA_SPEC(arity, name) \
+BOOST_MPL_AUX_NA_SPEC(arity, reverse_##name) \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(arity, name) \
+BOOST_MPL_AUX_COMMON_NAME_WKND(name) \
+template< \
+      BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \
+    > \
+struct def_##name##_impl \
+    : if_< has_push_back<P1> \
+        , aux::name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , back_inserter< typename clear<P1>::type > \
+            > \
+        , aux::reverse_##name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , front_inserter< typename clear<P1>::type > \
+            > \
+        >::type \
+{ \
+}; \
+\
+template< \
+      BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \
+    > \
+struct name \
+{ \
+    typedef typename eval_if< \
+          is_na<BOOST_PP_CAT(P, arity)> \
+        , def_##name##_impl<BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P)> \
+        , aux::name##_impl<BOOST_MPL_PP_PARAMS(arity, P)> \
+        >::type type; \
+}; \
+\
+template< \
+      BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \
+    > \
+struct def_reverse_##name##_impl \
+    : if_< has_push_back<P1> \
+        , aux::reverse_##name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , back_inserter< typename clear<P1>::type > \
+            > \
+        , aux::name##_impl< \
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
+            , front_inserter< typename clear<P1>::type > \
+            > \
+        >::type \
+{ \
+}; \
+template< \
+      BOOST_MPL_PP_DEFAULT_PARAMS(arity, typename P, na) \
+    > \
+struct reverse_##name \
+{ \
+    typedef typename eval_if< \
+          is_na<BOOST_PP_CAT(P, arity)> \
+        , def_reverse_##name##_impl<BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P)> \
+        , aux::reverse_##name##_impl<BOOST_MPL_PP_PARAMS(arity, P)> \
+        >::type type; \
+}; \
+BOOST_MPL_AUX_NA_SPEC(arity, name) \
+BOOST_MPL_AUX_NA_SPEC(arity, reverse_##name) \
+/**/
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_AUX_INSERTER_ALGORITHM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/integral_wrapper.hpp b/gatb-core/thirdparty/boost/mpl/aux_/integral_wrapper.hpp
new file mode 100644
index 0000000..6bc05f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/integral_wrapper.hpp
@@ -0,0 +1,93 @@
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#include <boost/mpl/integral_c_tag.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+
+#if !defined(AUX_WRAPPER_NAME)
+#   define AUX_WRAPPER_NAME BOOST_PP_CAT(AUX_WRAPPER_VALUE_TYPE,_)
+#endif
+
+#if !defined(AUX_WRAPPER_PARAMS)
+#   define AUX_WRAPPER_PARAMS(N) BOOST_MPL_AUX_NTTP_DECL(AUX_WRAPPER_VALUE_TYPE, N)
+#endif
+
+#if !defined(AUX_WRAPPER_INST)
+#   if BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
+#       define AUX_WRAPPER_INST(value) AUX_WRAPPER_NAME< value >
+#   else 
+#       define AUX_WRAPPER_INST(value) BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::AUX_WRAPPER_NAME< value >
+#   endif
+#endif
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< AUX_WRAPPER_PARAMS(N) >
+struct AUX_WRAPPER_NAME
+{
+    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, value = N);
+// agurt, 08/mar/03: SGI MIPSpro C++ workaround, have to #ifdef because some 
+// other compilers (e.g. MSVC) are not particulary happy about it
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+    typedef struct AUX_WRAPPER_NAME type;
+#else
+    typedef AUX_WRAPPER_NAME type;
+#endif
+    typedef AUX_WRAPPER_VALUE_TYPE value_type;
+    typedef integral_c_tag tag;
+
+// have to #ifdef here: some compilers don't like the 'N + 1' form (MSVC),
+// while some other don't like 'value + 1' (Borland), and some don't like
+// either
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243)
+ private:
+    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, next_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1)));
+    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, prior_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)));
+ public:
+    typedef AUX_WRAPPER_INST(next_value) next;
+    typedef AUX_WRAPPER_INST(prior_value) prior;
+#elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \
+    || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(502)) \
+    || (BOOST_WORKAROUND(__HP_aCC, <= 53800) && (BOOST_WORKAROUND(__hpxstd98, != 1)))
+    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1)) ) next;
+    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)) ) prior;
+#else
+    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value + 1)) ) next;
+    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value - 1)) ) prior;
+#endif
+
+    // enables uniform function call syntax for families of overloaded 
+    // functions that return objects of both arithmetic ('int', 'long',
+    // 'double', etc.) and wrapped integral types (for an example, see 
+    // "mpl/example/power.cpp")
+    BOOST_CONSTEXPR operator AUX_WRAPPER_VALUE_TYPE() const { return static_cast<AUX_WRAPPER_VALUE_TYPE>(this->value); } 
+};
+
+#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+template< AUX_WRAPPER_PARAMS(N) >
+AUX_WRAPPER_VALUE_TYPE const AUX_WRAPPER_INST(N)::value;
+#endif
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+#undef AUX_WRAPPER_NAME
+#undef AUX_WRAPPER_PARAMS
+#undef AUX_WRAPPER_INST
+#undef AUX_WRAPPER_VALUE_TYPE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/is_msvc_eti_arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/is_msvc_eti_arg.hpp
new file mode 100644
index 0000000..4989940
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/is_msvc_eti_arg.hpp
@@ -0,0 +1,64 @@
+
+#ifndef BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED
+#define BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+
+template< typename T >
+struct is_msvc_eti_arg
+{ 
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+#else // BOOST_MPL_CFG_MSVC_60_ETI_BUG
+
+struct eti_int_convertible
+{
+    eti_int_convertible(int);
+};
+
+template< typename T >
+struct is_msvc_eti_arg
+{ 
+    static no_tag test(...);
+    static yes_tag test(eti_int_convertible);
+    static T& get();
+
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof(test(get())) == sizeof(yes_tag)
+        );
+};
+
+#endif
+
+template<>
+struct is_msvc_eti_arg<int>
+{ 
+    BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+#endif // BOOST_MPL_CFG_MSVC_ETI_BUG
+
+}}}
+
+#endif // BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/iter_apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/iter_apply.hpp
new file mode 100644
index 0000000..41dfdfa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/iter_apply.hpp
@@ -0,0 +1,47 @@
+
+#ifndef BOOST_MPL_ITER_APPLY_HPP_INCLUDED
+#define BOOST_MPL_ITER_APPLY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/deref.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template<
+      typename F
+    , typename Iterator
+    >
+struct iter_apply1
+    : apply1< F,typename deref<Iterator>::type >
+{
+};
+
+template<
+      typename F
+    , typename Iterator1
+    , typename Iterator2
+    >
+struct iter_apply2
+    : apply2<
+          F
+        , typename deref<Iterator1>::type
+        , typename deref<Iterator2>::type
+        >
+{
+};
+
+}}}
+
+#endif // BOOST_MPL_ITER_APPLY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6372e83
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_if_impl.hpp
@@ -0,0 +1,210 @@
+
+#ifndef BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/identity.hpp>
+#   include <boost/mpl/next.hpp>
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER iter_fold_if_impl.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/unrolling.hpp>
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/dec.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2<StateOp,State,Iterator>::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+// agurt, 25/jun/02: MSVC 6.5 workaround, had to get rid of inheritance 
+// here and in 'iter_fold_if_backward_step', because sometimes it interfered 
+// with the "early template instantiation bug" in _really_ ugly ways
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2<Predicate,State,Iterator>::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp,mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2<Predicate,State,Iterator>::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp,identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+
+// local macros, #undef-ined at the end of the header
+
+#   define AUX_ITER_FOLD_FORWARD_STEP(unused, i, unused2) \
+    typedef iter_fold_if_forward_step< \
+          typename BOOST_PP_CAT(forward_step,i)::iterator \
+        , typename BOOST_PP_CAT(forward_step,i)::state \
+        , ForwardOp \
+        , ForwardPredicate \
+        > BOOST_PP_CAT(forward_step, BOOST_PP_INC(i)); \
+    /**/
+
+#   define AUX_ITER_FOLD_BACKWARD_STEP_FUNC(i) \
+    typedef iter_fold_if_backward_step< \
+          typename BOOST_PP_CAT(forward_step,BOOST_PP_DEC(i))::iterator \
+        , typename BOOST_PP_CAT(backward_step,i)::state \
+        , BackwardOp \
+        , BackwardPredicate \
+        > BOOST_PP_CAT(backward_step,BOOST_PP_DEC(i)); \
+    /**/
+
+#   define AUX_ITER_FOLD_BACKWARD_STEP(unused, i, unused2) \
+    AUX_ITER_FOLD_BACKWARD_STEP_FUNC( \
+        BOOST_PP_SUB_D(1,BOOST_MPL_LIMIT_UNROLLING,i) \
+        ) \
+    /**/
+
+#   define AUX_LAST_FORWARD_STEP \
+    BOOST_PP_CAT(forward_step, BOOST_MPL_LIMIT_UNROLLING) \
+    /**/
+
+#   define AUX_LAST_BACKWARD_STEP \
+    BOOST_PP_CAT(backward_step, BOOST_MPL_LIMIT_UNROLLING) \
+    /**/
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step<Iterator,State> forward_step0;
+    BOOST_PP_REPEAT(
+          BOOST_MPL_LIMIT_UNROLLING
+        , AUX_ITER_FOLD_FORWARD_STEP
+        , unused
+        )
+    
+    typedef typename if_<
+          typename AUX_LAST_FORWARD_STEP::not_last
+        , iter_fold_if_impl<
+              typename AUX_LAST_FORWARD_STEP::iterator
+            , typename AUX_LAST_FORWARD_STEP::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename AUX_LAST_FORWARD_STEP::iterator
+            , typename AUX_LAST_FORWARD_STEP::state
+            >
+        >::type AUX_LAST_BACKWARD_STEP;
+
+    BOOST_PP_REPEAT(
+          BOOST_MPL_LIMIT_UNROLLING
+        , AUX_ITER_FOLD_BACKWARD_STEP
+        , unused
+        )
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename AUX_LAST_BACKWARD_STEP::iterator iterator;
+};
+
+#   undef AUX_LAST_BACKWARD_STEP
+#   undef AUX_LAST_FORWARD_STEP
+#   undef AUX_ITER_FOLD_BACKWARD_STEP
+#   undef AUX_ITER_FOLD_BACKWARD_STEP_FUNC
+#   undef AUX_ITER_FOLD_FORWARD_STEP
+
+}}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_impl.hpp
new file mode 100644
index 0000000..b4d2922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/iter_fold_impl.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_AUX_ITER_FOLD_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ITER_FOLD_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/next_prior.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#       include <boost/mpl/if.hpp>
+#       include <boost/type_traits/is_same.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER iter_fold_impl.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   define AUX778076_FOLD_IMPL_OP(iter) iter
+#   define AUX778076_FOLD_IMPL_NAME_PREFIX iter_fold
+#   include <boost/mpl/aux_/fold_impl_body.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_ITER_FOLD_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/iter_push_front.hpp b/gatb-core/thirdparty/boost/mpl/aux_/iter_push_front.hpp
new file mode 100644
index 0000000..35ccc4d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/iter_push_front.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED
+#define BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/deref.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template<
+      typename Sequence
+    , typename Iterator
+    >
+struct iter_push_front
+{
+    typedef typename push_front<
+          Sequence
+        , typename deref<Iterator>::type
+        >::type type;
+};
+
+}}}
+
+#endif // BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/joint_iter.hpp b/gatb-core/thirdparty/boost/mpl/aux_/joint_iter.hpp
new file mode 100644
index 0000000..277580e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/joint_iter.hpp
@@ -0,0 +1,120 @@
+
+#ifndef BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED
+#define BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#   include <boost/type_traits/is_same.hpp>
+#endif
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename Iterator1
+    , typename LastIterator1
+    , typename Iterator2
+    >
+struct joint_iter
+{
+    typedef Iterator1 base;
+    typedef forward_iterator_tag category;
+};
+
+template<
+      typename LastIterator1
+    , typename Iterator2
+    >
+struct joint_iter<LastIterator1,LastIterator1,Iterator2>
+{
+    typedef Iterator2 base;
+    typedef forward_iterator_tag category;
+};
+
+
+template< typename I1, typename L1, typename I2 >
+struct deref< joint_iter<I1,L1,I2> >
+{
+    typedef typename joint_iter<I1,L1,I2>::base base_;
+    typedef typename deref<base_>::type type;
+};
+
+template< typename I1, typename L1, typename I2 >
+struct next< joint_iter<I1,L1,I2> >
+{
+    typedef joint_iter< typename mpl::next<I1>::type,L1,I2 > type;
+};
+
+template< typename L1, typename I2 >
+struct next< joint_iter<L1,L1,I2> >
+{
+    typedef joint_iter< L1,L1,typename mpl::next<I2>::type > type;
+};
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template<
+      typename Iterator1
+    , typename LastIterator1
+    , typename Iterator2
+    >
+struct joint_iter;
+
+template< bool > struct joint_iter_impl
+{
+    template< typename I1, typename L1, typename I2 > struct result_
+    {
+        typedef I1 base;
+        typedef forward_iterator_tag category;
+        typedef joint_iter< typename mpl::next<I1>::type,L1,I2 > next;
+        typedef typename deref<I1>::type type;
+    };
+};
+
+template<> struct joint_iter_impl<true>
+{
+    template< typename I1, typename L1, typename I2 > struct result_
+    {
+        typedef I2 base;
+        typedef forward_iterator_tag category;
+        typedef joint_iter< L1,L1,typename mpl::next<I2>::type > next;
+        typedef typename deref<I2>::type type;
+    };
+};
+
+template<
+      typename Iterator1
+    , typename LastIterator1
+    , typename Iterator2
+    >
+struct joint_iter
+    : joint_iter_impl< is_same<Iterator1,LastIterator1>::value >
+        ::template result_<Iterator1,LastIterator1,Iterator2>
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, joint_iter)
+
+}}
+
+#endif // BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/lambda_arity_param.hpp b/gatb-core/thirdparty/boost/mpl/aux_/lambda_arity_param.hpp
new file mode 100644
index 0000000..63cfcd4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/lambda_arity_param.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED
+#define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/ttp.hpp>
+
+#if !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+#   define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param)    
+#else
+#   define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param) , param
+#endif
+
+#endif // BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/lambda_no_ctps.hpp
new file mode 100644
index 0000000..9e0d020
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/lambda_no_ctps.hpp
@@ -0,0 +1,193 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
+#define BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/lambda_fwd.hpp>
+#   include <boost/mpl/bind_fwd.hpp>
+#   include <boost/mpl/protect.hpp>
+#   include <boost/mpl/is_placeholder.hpp>
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/identity.hpp>
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#   include <boost/mpl/aux_/template_arity.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if    !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER lambda_no_ctps.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+#   define AUX778076_LAMBDA_PARAMS(i_, param) \
+    BOOST_MPL_PP_PARAMS(i_, param) \
+    /**/
+
+namespace aux {
+
+#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+template<
+      BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >
+    : false_
+{
+};
+#undef n_
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/lambda_no_ctps.hpp>))
+#include BOOST_PP_ITERATE()
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+#   undef AUX778076_LAMBDA_PARAMS
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+#else
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   define AUX778076_LAMBDA_TYPEDEF(unused, i_, F) \
+    typedef lambda< \
+          typename F::BOOST_PP_CAT(arg,BOOST_PP_INC(i_)) \
+        , Tag \
+        , false_ \
+        > BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \
+    /**/
+
+#   define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \
+    typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \
+        BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \
+    /**/
+
+#   define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \
+    BOOST_PP_COMMA_IF(i_) \
+    BOOST_MPL_AUX_MSVC_VALUE_WKND(BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)))::value \
+    /**/
+
+#   define AUX778076_LAMBDA_RESULT(unused, i_, unused2) \
+    , typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::type \
+    /**/
+
+template<> struct lambda_impl< int_<i_> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, F)
+        BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)
+
+        typedef aux::lambda_or<
+              BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)
+            > is_le;
+
+        typedef BOOST_PP_CAT(bind,i_)<
+              typename F::rebind
+            BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_RESULT, unused)
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+    
+        typedef typename type_::type type;
+    };
+};
+
+#   undef AUX778076_LAMBDA_RESULT
+#   undef AUX778076_IS_LAMBDA_EXPR
+#   undef AUX778076_IS_LE_TYPEDEF
+#   undef AUX778076_LAMBDA_TYPEDEF
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/lambda_spec.hpp b/gatb-core/thirdparty/boost/mpl/aux_/lambda_spec.hpp
new file mode 100644
index 0000000..6ffacc0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/lambda_spec.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED
+#define BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2007
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/lambda_fwd.hpp>
+#include <boost/mpl/int_fwd.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/lambda_arity_param.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+
+#   define BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(i, name) \
+template< \
+      BOOST_MPL_PP_PARAMS(i, typename T) \
+    , typename Tag \
+    > \
+struct lambda< \
+      name< BOOST_MPL_PP_PARAMS(i, T) > \
+    , Tag \
+    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(int_<i>) \
+    > \
+{ \
+    typedef false_ is_le; \
+    typedef name< BOOST_MPL_PP_PARAMS(i, T) > result_; \
+    typedef result_ type; \
+}; \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(i, name) /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/lambda_support.hpp b/gatb-core/thirdparty/boost/mpl/aux_/lambda_support.hpp
new file mode 100644
index 0000000..5b2af58
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/lambda_support.hpp
@@ -0,0 +1,169 @@
+
+#ifndef BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED
+#define BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) /**/
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i,name,params) /**/
+
+#else
+
+#   include <boost/mpl/int_fwd.hpp>
+#   include <boost/mpl/aux_/yes_no.hpp>
+#   include <boost/mpl/aux_/na_fwd.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/tuple/to_list.hpp>
+#   include <boost/preprocessor/list/for_each_i.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC(R,typedef_,i,param) \
+    typedef_ param BOOST_PP_CAT(arg,BOOST_PP_INC(i)); \
+    /**/
+
+// agurt, 07/mar/03: restore an old revision for the sake of SGI MIPSpro C++
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) 
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
+    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
+    BOOST_PP_LIST_FOR_EACH_I_R( \
+          1 \
+        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
+        , typedef \
+        , BOOST_PP_TUPLE_TO_LIST(i,params) \
+        ) \
+    struct rebind \
+    { \
+        template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
+            : name< BOOST_MPL_PP_PARAMS(i,U) > \
+        { \
+        }; \
+    }; \
+    /**/
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
+    /**/
+
+#elif BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)
+// agurt, 18/jan/03: old EDG-based compilers actually enforce 11.4 para 9
+// (in strict mode), so we have to provide an alternative to the 
+// MSVC-optimized implementation
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
+    BOOST_PP_LIST_FOR_EACH_I_R( \
+          1 \
+        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
+        , typedef \
+        , BOOST_PP_TUPLE_TO_LIST(i,params) \
+        ) \
+    struct rebind; \
+/**/
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+}; \
+template< BOOST_MPL_PP_PARAMS(i,typename T) > \
+struct name<BOOST_MPL_PP_PARAMS(i,T)>::rebind \
+{ \
+    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
+        : name< BOOST_MPL_PP_PARAMS(i,U) > \
+    { \
+    }; \
+/**/
+
+#else // __EDG_VERSION__
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct has_rebind_tag;
+}}}
+
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
+    BOOST_PP_LIST_FOR_EACH_I_R( \
+          1 \
+        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
+        , typedef \
+        , BOOST_PP_TUPLE_TO_LIST(i,params) \
+        ) \
+    friend class BOOST_PP_CAT(name,_rebind); \
+    typedef BOOST_PP_CAT(name,_rebind) rebind; \
+/**/
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
+template< BOOST_MPL_PP_PARAMS(i,typename T) > \
+::boost::mpl::aux::yes_tag operator|( \
+      ::boost::mpl::aux::has_rebind_tag<int> \
+    , name<BOOST_MPL_PP_PARAMS(i,T)>* \
+    ); \
+::boost::mpl::aux::no_tag operator|( \
+      ::boost::mpl::aux::has_rebind_tag<int> \
+    , name< BOOST_MPL_PP_ENUM(i,::boost::mpl::na) >* \
+    ); \
+/**/
+#elif !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
+template< BOOST_MPL_PP_PARAMS(i,typename T) > \
+::boost::mpl::aux::yes_tag operator|( \
+      ::boost::mpl::aux::has_rebind_tag<int> \
+    , ::boost::mpl::aux::has_rebind_tag< name<BOOST_MPL_PP_PARAMS(i,T)> >* \
+    ); \
+/**/
+#else
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) /**/
+#endif
+
+#   if !defined(__BORLANDC__)
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+}; \
+BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
+class BOOST_PP_CAT(name,_rebind) \
+{ \
+ public: \
+    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
+        : name< BOOST_MPL_PP_PARAMS(i,U) > \
+    { \
+    }; \
+/**/
+#   else
+#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
+}; \
+BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
+class BOOST_PP_CAT(name,_rebind) \
+{ \
+ public: \
+    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
+    { \
+        typedef typename name< BOOST_MPL_PP_PARAMS(i,U) >::type type; \
+    }; \
+/**/
+#   endif // __BORLANDC__
+
+#endif // __EDG_VERSION__
+
+#endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+#endif // BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/largest_int.hpp b/gatb-core/thirdparty/boost/mpl/aux_/largest_int.hpp
new file mode 100644
index 0000000..feaa1ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/largest_int.hpp
@@ -0,0 +1,63 @@
+
+#ifndef BOOST_MPL_AUX_LARGEST_INT_HPP_INCLUDED
+#define BOOST_MPL_AUX_LARGEST_INT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/aux_/config/integral.hpp>
+#include <boost/config.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct integral_rank;
+
+template<> struct integral_rank<bool>           : int_<1> {};
+template<> struct integral_rank<signed char>    : int_<2> {};
+template<> struct integral_rank<char>           : int_<3> {};
+template<> struct integral_rank<unsigned char>  : int_<4> {};
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+template<> struct integral_rank<wchar_t>        : int_<5> {};
+#endif
+template<> struct integral_rank<short>          : int_<6> {};
+template<> struct integral_rank<unsigned short> : int_<7> {};
+template<> struct integral_rank<int>            : int_<8> {};
+template<> struct integral_rank<unsigned int>   : int_<9> {};
+template<> struct integral_rank<long>           : int_<10> {};
+template<> struct integral_rank<unsigned long>  : int_<11> {};
+
+#if defined(BOOST_HAS_LONG_LONG)
+template<> struct integral_rank<long_long_type> : int_<12> {};
+template<> struct integral_rank<ulong_long_type>: int_<13> {};
+#endif
+
+template< typename T1, typename T2 > struct largest_int
+#if !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+    : if_c< 
+          ( integral_rank<T1>::value >= integral_rank<T2>::value )
+        , T1
+        , T2
+        >
+{
+#else
+{
+    enum { rank1 = integral_rank<T1>::value };
+    enum { rank2 = integral_rank<T2>::value };
+    typedef typename if_c< (rank1 >= rank2),T1,T2 >::type type;
+#endif
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_LARGEST_INT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/logical_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/logical_op.hpp
new file mode 100644
index 0000000..0ba2510
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/logical_op.hpp
@@ -0,0 +1,165 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/nested_type_wknd.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#endif
+
+#include <boost/mpl/limits/arity.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/preprocessor/ext_params.hpp>
+#include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>
+#include <boost/mpl/aux_/preprocessor/enum.hpp>
+#include <boost/mpl/aux_/preprocessor/sub.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+#   define AUX778076_PARAMS(param, sub) \
+    BOOST_MPL_PP_PARAMS( \
+          BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY, sub) \
+        , param \
+        ) \
+    /**/
+
+#   define AUX778076_SHIFTED_PARAMS(param, sub) \
+    BOOST_MPL_PP_EXT_PARAMS( \
+          2, BOOST_MPL_PP_SUB(BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY), sub) \
+        , param \
+        ) \
+    /**/
+
+#   define AUX778076_SPEC_PARAMS(param) \
+    BOOST_MPL_PP_ENUM( \
+          BOOST_PP_DEC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY) \
+        , param \
+        ) \
+    /**/
+
+namespace aux {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< bool C_, AUX778076_PARAMS(typename T, 1) >
+struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)
+    : BOOST_PP_CAT(AUX778076_OP_VALUE1,_)
+{
+};
+
+template< AUX778076_PARAMS(typename T, 1) >
+struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)< AUX778076_OP_VALUE2,AUX778076_PARAMS(T, 1) >
+    : BOOST_PP_CAT(AUX778076_OP_NAME,impl)<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , AUX778076_SHIFTED_PARAMS(T, 1)
+        , BOOST_PP_CAT(AUX778076_OP_VALUE2,_)
+        >
+{
+};
+
+template<>
+struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<
+          AUX778076_OP_VALUE2
+        , AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_))
+        >
+    : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)
+{
+};
+
+#else
+
+template< bool C_ > struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)
+{
+    template< AUX778076_PARAMS(typename T, 1) > struct result_
+        : BOOST_PP_CAT(AUX778076_OP_VALUE1,_)
+    {
+    };
+};
+
+template<> struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<AUX778076_OP_VALUE2>
+{
+    template< AUX778076_PARAMS(typename T, 1) > struct result_
+        : BOOST_PP_CAT(AUX778076_OP_NAME,impl)< 
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< AUX778076_SHIFTED_PARAMS(T,1),BOOST_PP_CAT(AUX778076_OP_VALUE2,_) >
+    {
+    };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+    template<> struct result_<AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_))>
+        : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)
+    {
+    };
+};
+#else
+};
+
+template<>
+struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<AUX778076_OP_VALUE2>
+    ::result_< AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_)) >
+        : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)
+{
+};
+#endif // BOOST_MSVC == 1300
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    BOOST_MPL_PP_DEF_PARAMS_TAIL(2, typename T, BOOST_PP_CAT(AUX778076_OP_VALUE2,_))
+    >
+struct AUX778076_OP_NAME
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    : aux::BOOST_PP_CAT(AUX778076_OP_NAME,impl)<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , AUX778076_SHIFTED_PARAMS(T,0)
+        >
+#else
+    : aux::BOOST_PP_CAT(AUX778076_OP_NAME,impl)< 
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< AUX778076_SHIFTED_PARAMS(T,0) >
+#endif
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+        , AUX778076_OP_NAME
+        , (AUX778076_PARAMS(T, 0))
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+    , AUX778076_OP_NAME
+    )
+
+}}
+
+#undef AUX778076_SPEC_PARAMS
+#undef AUX778076_SHIFTED_PARAMS
+#undef AUX778076_PARAMS
+#undef AUX778076_OP_NAME
+#undef AUX778076_OP_VALUE1
+#undef AUX778076_OP_VALUE2
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/msvc_dtw.hpp b/gatb-core/thirdparty/boost/mpl/aux_/msvc_dtw.hpp
new file mode 100644
index 0000000..d595b23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/msvc_dtw.hpp
@@ -0,0 +1,68 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+
+// local macros, #undef-ined at the end of the header
+#define AUX778076_DTW_PARAMS(param) \
+    BOOST_MPL_PP_PARAMS(AUX778076_MSVC_DTW_ARITY, param) \
+/**/
+
+#define AUX778076_DTW_ORIGINAL_NAME \
+    AUX778076_MSVC_DTW_ORIGINAL_NAME \
+/**/
+
+// warning: not a well-formed C++
+// workaround for MSVC 6.5's "dependent template typedef bug"
+
+template< typename F>
+struct AUX778076_MSVC_DTW_NAME
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+#if AUX778076_MSVC_DTW_ARITY > 0
+        template< AUX778076_DTW_PARAMS(typename P) > struct AUX778076_DTW_ORIGINAL_NAME
+        {
+            typedef int type;
+        };
+    };
+
+    template< AUX778076_DTW_PARAMS(typename T) > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template AUX778076_DTW_ORIGINAL_NAME< AUX778076_DTW_PARAMS(T) >
+    {
+    };
+#else
+        template< typename P = int > struct AUX778076_DTW_ORIGINAL_NAME
+        {
+            typedef int type;
+        };
+    };
+
+    template< typename T = int > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template AUX778076_DTW_ORIGINAL_NAME<>
+    {
+    };
+#endif
+};
+
+#undef AUX778076_DTW_ORIGINAL_NAME
+#undef AUX778076_DTW_PARAMS
+
+#undef AUX778076_MSVC_DTW_NAME
+#undef AUX778076_MSVC_DTW_ORIGINAL_NAME
+#undef AUX778076_MSVC_DTW_ARITY
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/msvc_eti_base.hpp b/gatb-core/thirdparty/boost/mpl/aux_/msvc_eti_base.hpp
new file mode 100644
index 0000000..0d8ace6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/msvc_eti_base.hpp
@@ -0,0 +1,77 @@
+
+#ifndef BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED
+#define BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+#if defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)
+
+template< bool > struct msvc_eti_base_impl
+{
+    template< typename T > struct result_
+        : T
+    {
+        typedef T type;
+    };
+};
+
+template<> struct msvc_eti_base_impl<true>
+{
+    template< typename T > struct result_
+    {
+        typedef result_ type;
+        typedef result_ first;
+        typedef result_ second;
+        typedef result_ tag;
+        enum { value = 0 };
+    };
+};
+
+template< typename T > struct msvc_eti_base
+    : msvc_eti_base_impl< is_msvc_eti_arg<T>::value >
+        ::template result_<T>
+{
+};
+
+#else // !BOOST_MPL_CFG_MSVC_70_ETI_BUG
+
+template< typename T > struct msvc_eti_base
+    : T
+{
+#if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304))
+    msvc_eti_base();
+#endif
+    typedef T type;
+};
+
+#endif 
+
+template<> struct msvc_eti_base<int>
+{
+    typedef msvc_eti_base type;
+    typedef msvc_eti_base first;
+    typedef msvc_eti_base second;
+    typedef msvc_eti_base tag;
+    enum { value = 0 };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/msvc_is_class.hpp b/gatb-core/thirdparty/boost/mpl/aux_/msvc_is_class.hpp
new file mode 100644
index 0000000..acd40e3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/msvc_is_class.hpp
@@ -0,0 +1,58 @@
+
+#ifndef BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED
+#define BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+
+#include <boost/type_traits/is_reference.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct is_class_helper
+{
+    typedef int (T::* type)();
+};
+
+// MSVC 6.x-specific lightweight 'is_class' implementation; 
+// Distinguishing feature: does not instantiate the type being tested.
+template< typename T >
+struct msvc_is_class_impl
+{
+    template< typename U>
+    static yes_tag  test(type_wrapper<U>*, /*typename*/ is_class_helper<U>::type = 0);
+    static no_tag   test(void const volatile*, ...);
+
+    enum { value = sizeof(test((type_wrapper<T>*)0)) == sizeof(yes_tag) };
+    typedef bool_<value> type;
+};
+
+// agurt, 17/sep/04: have to check for 'is_reference' upfront to avoid ICEs in
+// complex metaprograms
+template< typename T >
+struct msvc_is_class
+    : if_<
+          is_reference<T>
+        , false_
+        , msvc_is_class_impl<T>
+        >::type
+{
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/msvc_never_true.hpp b/gatb-core/thirdparty/boost/mpl/aux_/msvc_never_true.hpp
new file mode 100644
index 0000000..2df9b81
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/msvc_never_true.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED
+#define BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T >
+struct msvc_never_true
+{
+    enum { value = false };
+};
+
+}}}
+
+#endif // BOOST_MSVC
+
+#endif // BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/msvc_type.hpp b/gatb-core/thirdparty/boost/mpl/aux_/msvc_type.hpp
new file mode 100644
index 0000000..bea244f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/msvc_type.hpp
@@ -0,0 +1,62 @@
+
+#ifndef BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED
+#define BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+#if defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)
+
+template< bool > struct msvc_type_impl
+{
+    template< typename T > struct result_
+    {
+        typedef typename T::type type;
+    };
+};
+
+template<> struct msvc_type_impl<true>
+{
+    template< typename T > struct result_
+    {
+        typedef result_ type;
+    };
+};
+
+template< typename T > struct msvc_type
+    : msvc_type_impl< is_msvc_eti_arg<T>::value >
+        ::template result_<T>
+{
+};
+
+#else // BOOST_MPL_CFG_MSVC_70_ETI_BUG
+
+template< typename T > struct msvc_type 
+{
+    typedef typename T::type type;
+};
+
+template<> struct msvc_type<int>
+{
+    typedef int type;
+};
+
+#endif
+
+}}}
+
+#endif // BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/na.hpp b/gatb-core/thirdparty/boost/mpl/aux_/na.hpp
new file mode 100644
index 0000000..f079c1e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/na.hpp
@@ -0,0 +1,95 @@
+
+#ifndef BOOST_MPL_AUX_NA_HPP_INCLUDED
+#define BOOST_MPL_AUX_NA_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/na_fwd.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T >
+struct is_na
+    : false_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using false_::value;
+#endif
+};
+
+template<>
+struct is_na<na>
+    : true_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using true_::value;
+#endif
+};
+
+template< typename T >
+struct is_not_na
+    : true_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using true_::value;
+#endif
+};
+
+template<>
+struct is_not_na<na>
+    : false_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using false_::value;
+#endif
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+template< typename T, typename U > struct if_na
+{
+    typedef T type;
+};
+
+template< typename U > struct if_na<na,U>
+{
+    typedef U type;
+};
+#else
+template< typename T > struct if_na_impl
+{
+    template< typename U > struct apply
+    {
+        typedef T type;
+    };
+};
+
+template<> struct if_na_impl<na>
+{
+    template< typename U > struct apply
+    {
+        typedef U type;
+    };
+};
+
+template< typename T, typename U > struct if_na
+    : if_na_impl<T>::template apply<U>
+{
+};
+#endif
+
+}}
+
+#endif // BOOST_MPL_AUX_NA_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/na_assert.hpp b/gatb-core/thirdparty/boost/mpl/aux_/na_assert.hpp
new file mode 100644
index 0000000..1983c09
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/na_assert.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED
+#define BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if !BOOST_WORKAROUND(_MSC_FULL_VER, <= 140050601)    \
+    && !BOOST_WORKAROUND(__EDG_VERSION__, <= 243)
+#   include <boost/mpl/assert.hpp>
+#   define BOOST_MPL_AUX_ASSERT_NOT_NA(x) \
+    BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
+/**/
+#else
+#   include <boost/static_assert.hpp>
+#   define BOOST_MPL_AUX_ASSERT_NOT_NA(x) \
+    BOOST_STATIC_ASSERT(!boost::mpl::is_na<x>::value) \
+/**/
+#endif
+
+#endif // BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/na_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/na_fwd.hpp
new file mode 100644
index 0000000..4388241
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/na_fwd.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED
+#define BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+// n.a. == not available
+struct na
+{
+    typedef na type;
+    enum { value = 0 };
+};
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(na)
+
+#endif // BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/na_spec.hpp b/gatb-core/thirdparty/boost/mpl/aux_/na_spec.hpp
new file mode 100644
index 0000000..d052fce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/na_spec.hpp
@@ -0,0 +1,175 @@
+
+#ifndef BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED
+#define BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/lambda_fwd.hpp>
+#   include <boost/mpl/int.hpp>
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/arity.hpp>
+#   include <boost/mpl/aux_/template_arity_fwd.hpp>
+#endif
+
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/preprocessor/enum.hpp>
+#include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>
+#include <boost/mpl/aux_/lambda_arity_param.hpp>
+#include <boost/mpl/aux_/config/dtp.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/ttp.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+#include <boost/mpl/aux_/config/overload_resolution.hpp>
+
+
+#define BOOST_MPL_AUX_NA_PARAMS(i) \
+    BOOST_MPL_PP_ENUM(i, na) \
+/**/
+
+#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#   define BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \
+namespace aux { \
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > \
+struct arity< \
+          name< BOOST_MPL_AUX_NA_PARAMS(i) > \
+        , N \
+        > \
+    : int_< BOOST_MPL_LIMIT_METAFUNCTION_ARITY > \
+{ \
+}; \
+} \
+/**/
+#else
+#   define BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) /**/
+#endif
+
+#define BOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \
+template<> \
+struct name< BOOST_MPL_AUX_NA_PARAMS(i) > \
+{ \
+    template< \
+          BOOST_MPL_PP_PARAMS(i, typename T) \
+        BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, typename T, na) \
+        > \
+    struct apply \
+        : name< BOOST_MPL_PP_PARAMS(i, T) > \
+    { \
+    }; \
+}; \
+/**/
+
+#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+#   define BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \
+template<> \
+struct lambda< \
+      name< BOOST_MPL_AUX_NA_PARAMS(i) > \
+    , void_ \
+    , true_ \
+    > \
+{ \
+    typedef false_ is_le; \
+    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \
+}; \
+template<> \
+struct lambda< \
+      name< BOOST_MPL_AUX_NA_PARAMS(i) > \
+    , void_ \
+    , false_ \
+    > \
+{ \
+    typedef false_ is_le; \
+    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \
+}; \
+/**/
+#else
+#   define BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \
+template< typename Tag > \
+struct lambda< \
+      name< BOOST_MPL_AUX_NA_PARAMS(i) > \
+    , Tag \
+    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(int_<-1>) \
+    > \
+{ \
+    typedef false_ is_le; \
+    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > result_; \
+    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \
+}; \
+/**/
+#endif
+
+#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \
+    || defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \
+        && defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION)
+#   define BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) \
+namespace aux { \
+template< BOOST_MPL_PP_PARAMS(j, typename T) > \
+struct template_arity< \
+          name< BOOST_MPL_PP_PARAMS(j, T) > \
+        > \
+    : int_<j> \
+{ \
+}; \
+\
+template<> \
+struct template_arity< \
+          name< BOOST_MPL_PP_ENUM(i, na) > \
+        > \
+    : int_<-1> \
+{ \
+}; \
+} \
+/**/
+#else
+#   define BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) /**/
+#endif
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+#   define BOOST_MPL_AUX_NA_SPEC_ETI(i, name) \
+template<> \
+struct name< BOOST_MPL_PP_ENUM(i, int) > \
+{ \
+    typedef int type; \
+    enum { value = 0 }; \
+}; \
+/**/
+#else
+#   define BOOST_MPL_AUX_NA_SPEC_ETI(i, name) /**/
+#endif
+
+#define BOOST_MPL_AUX_NA_PARAM(param) param = na
+
+#define BOOST_MPL_AUX_NA_SPEC_NO_ETI(i, name) \
+BOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \
+BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, i, name) \
+/**/
+
+#define BOOST_MPL_AUX_NA_SPEC(i, name) \
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(i, name) \
+BOOST_MPL_AUX_NA_SPEC_ETI(i, name) \
+/**/
+
+#define BOOST_MPL_AUX_NA_SPEC2(i, j, name) \
+BOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \
+BOOST_MPL_AUX_NA_SPEC_ETI(i, name) \
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \
+BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) \
+/**/
+
+
+#endif // BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/nested_type_wknd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/nested_type_wknd.hpp
new file mode 100644
index 0000000..4207abd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/nested_type_wknd.hpp
@@ -0,0 +1,48 @@
+
+#ifndef BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED
+#define BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0302)) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \
+    || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x530)) \
+    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct nested_type_wknd
+    : T::type
+{
+};
+}}}
+
+#if BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) \
+    aux::nested_type_wknd<T> \
+/**/
+#else
+#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) \
+    ::boost::mpl::aux::nested_type_wknd<T> \
+/**/
+#endif
+
+#else // !BOOST_MPL_CFG_GCC et al.
+
+#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) T::type
+
+#endif 
+
+#endif // BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/nttp_decl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/nttp_decl.hpp
new file mode 100644
index 0000000..8c344d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/nttp_decl.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED
+#define BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/nttp.hpp>
+
+#if defined(BOOST_MPL_CFG_NTTP_BUG)
+
+typedef bool        _mpl_nttp_bool;
+typedef int         _mpl_nttp_int;
+typedef unsigned    _mpl_nttp_unsigned;
+typedef long        _mpl_nttp_long;
+
+#   include <boost/preprocessor/cat.hpp>
+#   define BOOST_MPL_AUX_NTTP_DECL(T, x) BOOST_PP_CAT(_mpl_nttp_,T) x /**/
+
+#else
+
+#   define BOOST_MPL_AUX_NTTP_DECL(T, x) T x /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/numeric_cast_utils.hpp b/gatb-core/thirdparty/boost/mpl/aux_/numeric_cast_utils.hpp
new file mode 100644
index 0000000..a7ac85a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/numeric_cast_utils.hpp
@@ -0,0 +1,77 @@
+
+#ifndef BOOST_MPL_AUX_NUMERIC_CAST_HPP_INCLUDED
+#define BOOST_MPL_AUX_NUMERIC_CAST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/numeric_cast.hpp>
+#include <boost/mpl/apply_wrap.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    >
+struct cast1st_impl
+{
+    template< typename N1, typename N2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : apply_wrap2< 
+              F
+            , typename apply_wrap1< BOOST_MPL_AUX_NUMERIC_CAST<Tag1,Tag2>,N1 >::type
+            , N2
+            >
+    {
+#else
+    {
+    typedef typename apply_wrap2< 
+              F
+            , typename apply_wrap1< BOOST_MPL_AUX_NUMERIC_CAST<Tag1,Tag2>,N1 >::type
+            , N2
+            >::type type;
+#endif
+    };
+};
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    >
+struct cast2nd_impl
+{
+    template< typename N1, typename N2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : apply_wrap2< 
+              F
+            , N1
+            , typename apply_wrap1< BOOST_MPL_AUX_NUMERIC_CAST<Tag2,Tag1>,N2 >::type
+            >
+    {
+#else
+    {
+        typedef typename apply_wrap2< 
+              F
+            , N1
+            , typename apply_wrap1< BOOST_MPL_AUX_NUMERIC_CAST<Tag2,Tag1>,N2 >::type
+            >::type type;
+#endif
+    };
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_NUMERIC_CAST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/numeric_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/numeric_op.hpp
new file mode 100644
index 0000000..5492557
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/numeric_op.hpp
@@ -0,0 +1,315 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/numeric_cast.hpp>
+#   include <boost/mpl/apply_wrap.hpp>
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/tag.hpp>
+#   include <boost/mpl/aux_/numeric_cast_utils.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#   include <boost/mpl/aux_/msvc_eti_base.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+#if defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    || defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/preprocessor/ext_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/preprocessor/add.hpp>
+#   include <boost/mpl/aux_/preprocessor/sub.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/eti.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/dec.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+
+#if !defined(AUX778076_OP_ARITY)
+#   define AUX778076_OP_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#endif
+
+#if !defined(AUX778076_OP_IMPL_NAME)
+#   define AUX778076_OP_IMPL_NAME BOOST_PP_CAT(AUX778076_OP_PREFIX,_impl)
+#endif
+
+#if !defined(AUX778076_OP_TAG_NAME)
+#   define AUX778076_OP_TAG_NAME BOOST_PP_CAT(AUX778076_OP_PREFIX,_tag)
+#endif
+
+namespace boost { namespace mpl {
+
+template< 
+      typename Tag1
+    , typename Tag2
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value 
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value 
+    >
+struct AUX778076_OP_IMPL_NAME
+    : if_c<
+          ( tag1_ > tag2_ )
+#else
+    >
+struct AUX778076_OP_IMPL_NAME
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+#endif
+        , aux::cast2nd_impl< AUX778076_OP_IMPL_NAME<Tag1,Tag1>,Tag1,Tag2 >
+        , aux::cast1st_impl< AUX778076_OP_IMPL_NAME<Tag2,Tag2>,Tag1,Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct AUX778076_OP_IMPL_NAME<na,na>
+{
+    template< typename U1, typename U2 > struct apply 
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+template< typename Tag > struct AUX778076_OP_IMPL_NAME<na,Tag>
+{
+    template< typename U1, typename U2 > struct apply 
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+};
+
+template< typename Tag > struct AUX778076_OP_IMPL_NAME<Tag,na>
+{
+    template< typename U1, typename U2 > struct apply 
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+};
+#else
+template<> struct AUX778076_OP_IMPL_NAME<na,integral_c_tag>
+{
+    template< typename U1, typename U2 > struct apply 
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+};
+
+template<> struct AUX778076_OP_IMPL_NAME<integral_c_tag,na>
+{
+    template< typename U1, typename U2 > struct apply 
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+};
+#endif
+
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && BOOST_WORKAROUND(BOOST_MSVC, >= 1300)
+template< typename T > struct AUX778076_OP_TAG_NAME
+    : tag<T,na>
+{
+};
+#else
+template< typename T > struct AUX778076_OP_TAG_NAME
+{
+    typedef typename T::tag type;
+};
+#endif
+
+
+#if AUX778076_OP_ARITY != 2
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+#   define AUX778076_OP_RIGHT_OPERAND(unused, i, N) , BOOST_PP_CAT(N, BOOST_MPL_PP_ADD(i, 2))>
+#   define AUX778076_OP_N_CALLS(i, N) \
+    BOOST_MPL_PP_REPEAT( BOOST_PP_DEC(i), BOOST_MPL_PP_REPEAT_IDENTITY_FUNC, AUX778076_OP_NAME< ) \
+    N1 BOOST_MPL_PP_REPEAT( BOOST_MPL_PP_SUB(i, 1), AUX778076_OP_RIGHT_OPERAND, N ) \
+/**/
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    BOOST_MPL_PP_DEF_PARAMS_TAIL(2, typename N, na)
+    >
+struct AUX778076_OP_NAME
+    : AUX778076_OP_N_CALLS(AUX778076_OP_ARITY, N)
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          AUX778076_OP_ARITY
+        , AUX778076_OP_NAME
+        , ( BOOST_MPL_PP_PARAMS(AUX778076_OP_ARITY, N) )
+        )
+};
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,( BOOST_PP_DEC(AUX778076_OP_ARITY), 2, <boost/mpl/aux_/numeric_op.hpp> ))
+#include BOOST_PP_ITERATE()
+
+#   undef AUX778076_OP_N_CALLS
+#   undef AUX778076_OP_RIGHT_OPERAND
+
+#   else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+/// forward declaration
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct BOOST_PP_CAT(AUX778076_OP_NAME,2);
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    BOOST_MPL_PP_DEF_PARAMS_TAIL(2, typename N, na)
+    >
+struct AUX778076_OP_NAME
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+    : aux::msvc_eti_base< typename if_<
+#else
+    : if_<
+#endif
+          is_na<N3>
+        , BOOST_PP_CAT(AUX778076_OP_NAME,2)<N1,N2>
+        , AUX778076_OP_NAME<
+              BOOST_PP_CAT(AUX778076_OP_NAME,2)<N1,N2>
+            , BOOST_MPL_PP_EXT_PARAMS(3, BOOST_PP_INC(AUX778076_OP_ARITY), N)
+            >
+        >::type
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+    >
+#endif
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          AUX778076_OP_ARITY
+        , AUX778076_OP_NAME
+        , ( BOOST_MPL_PP_PARAMS(AUX778076_OP_ARITY, N) )
+        )
+};
+
+template< 
+      typename N1
+    , typename N2
+    >
+struct BOOST_PP_CAT(AUX778076_OP_NAME,2)
+
+#endif
+
+#else // AUX778076_OP_ARITY == 2
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct AUX778076_OP_NAME
+
+#endif
+
+#if !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+    : AUX778076_OP_IMPL_NAME<
+          typename AUX778076_OP_TAG_NAME<N1>::type
+        , typename AUX778076_OP_TAG_NAME<N2>::type
+        >::template apply<N1,N2>::type
+#else
+    : aux::msvc_eti_base< typename apply_wrap2<
+          AUX778076_OP_IMPL_NAME<
+              typename AUX778076_OP_TAG_NAME<N1>::type
+            , typename AUX778076_OP_TAG_NAME<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+#endif
+{
+#if AUX778076_OP_ARITY != 2
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          AUX778076_OP_ARITY
+        , AUX778076_OP_NAME
+        , ( BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(2, N, na) )
+        )
+#   else
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, BOOST_PP_CAT(AUX778076_OP_NAME,2), (N1, N2))
+#   endif
+
+#else
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, AUX778076_OP_NAME, (N1, N2))
+#endif
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, AUX778076_OP_ARITY, AUX778076_OP_NAME)
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+
+#   define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      BOOST_MPL_PP_PARAMS(i_, typename N)
+    >
+struct AUX778076_OP_NAME<BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(i_, N, na)>
+#if i_ != 2
+    : AUX778076_OP_N_CALLS(i_, N)
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          AUX778076_OP_ARITY
+        , AUX778076_OP_NAME
+        , ( BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(i_, N, na) )
+        )
+};
+#endif
+
+#   undef i_
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/order_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/order_impl.hpp
new file mode 100644
index 0000000..2c14521
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/order_impl.hpp
@@ -0,0 +1,76 @@
+
+#ifndef BOOST_MPL_AUX_ORDER_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ORDER_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/order_fwd.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/aux_/overload_names.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; requires 'Seq' to provide corresponding overloads 
+// of BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY
+
+template< typename Seq, typename Key > struct x_order_impl
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
+    || BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
+{
+    BOOST_STATIC_CONSTANT(long, value = 
+          sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(
+              Seq
+            , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<Key>*, 0)
+            ) )
+        );
+
+    typedef long_<value> type;
+
+#else // ISO98 C++
+    : long_< 
+          sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(
+              Seq
+            , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<Key>*, 0)
+            ) )
+        >
+{
+#endif
+};
+
+template< typename Tag >
+struct order_impl
+{
+    template< typename Seq, typename Key > struct apply
+        : if_<
+              typename has_key_impl<Tag>::template apply<Seq,Key>
+            , x_order_impl<Seq,Key>
+            , void_
+            >::type
+    {
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2,order_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_ORDER_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/overload_names.hpp b/gatb-core/thirdparty/boost/mpl/aux_/overload_names.hpp
new file mode 100644
index 0000000..f9bbb39
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/overload_names.hpp
@@ -0,0 +1,48 @@
+
+#ifndef BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED
+#define BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/ptr_to_ref.hpp>
+#include <boost/mpl/aux_/config/operators.hpp>
+
+#if defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING)
+
+#   include <boost/mpl/aux_/static_cast.hpp>
+
+#   define BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY  operator/
+#   define BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER operator|
+#   define BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY  operator||
+#   define BOOST_MPL_AUX_OVERLOAD_IS_MASKED     operator%
+
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_VALUE_BY_KEY(T, x)   BOOST_MPL_AUX_PTR_TO_REF(T) / x
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_ITEM_BY_ORDER(T, x)  BOOST_MPL_AUX_PTR_TO_REF(T) | x
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(T, x)   BOOST_MPL_AUX_PTR_TO_REF(T) || x
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(T, x)      BOOST_MPL_AUX_PTR_TO_REF(T) % x
+
+#else
+
+#   define BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY  value_by_key_
+#   define BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER item_by_order_
+#   define BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY  order_by_key_
+#   define BOOST_MPL_AUX_OVERLOAD_IS_MASKED     is_masked_
+
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_VALUE_BY_KEY(T, x)   T::BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY( BOOST_MPL_AUX_PTR_TO_REF(T), x )
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_ITEM_BY_ORDER(T, x)  T::BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER( BOOST_MPL_AUX_PTR_TO_REF(T), x )
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(T, x)   T::BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY( BOOST_MPL_AUX_PTR_TO_REF(T), x )
+#   define BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(T, x)      T::BOOST_MPL_AUX_OVERLOAD_IS_MASKED( BOOST_MPL_AUX_PTR_TO_REF(T), x )
+
+#endif
+
+#endif // BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/partition_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/partition_op.hpp
new file mode 100644
index 0000000..79d4937
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/partition_op.hpp
@@ -0,0 +1,58 @@
+
+#ifndef BOOST_MPL_AUX_PARTITION_OP_HPP_INCLUDED
+#define BOOST_MPL_AUX_PARTITION_OP_HPP_INCLUDED
+
+// Copyright Eric Friedman 2003
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+
+namespace boost { namespace mpl { 
+
+namespace aux {
+
+template< typename Pred, typename In1Op, typename In2Op >
+struct partition_op
+{
+    template< typename State, typename T >
+    struct apply
+    {
+        typedef typename State::first first_;
+        typedef typename State::second second_;
+        typedef typename apply1< Pred,T >::type pred_;
+
+        typedef typename eval_if<
+              pred_
+            , apply2<In1Op,first_,T>
+            , apply2<In2Op,second_,T>
+            >::type result_;
+
+        typedef typename if_<
+              pred_
+            , pair< result_,second_ >
+            , pair< first_,result_ >
+            >::type type;
+    };
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, aux::partition_op)
+
+}}
+
+#endif // BOOST_MPL_AUX_PARTITION_OP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/pop_back_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/pop_back_impl.hpp
new file mode 100644
index 0000000..2b54e0f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/pop_back_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_POP_BACK_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_POP_BACK_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_back_fwd.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+// no default implementation; the definition is needed to make MSVC happy
+
+template< typename Tag >
+struct pop_back_impl
+{
+    template< typename Sequence > struct apply;
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, pop_back_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_POP_BACK_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/pop_front_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/pop_front_impl.hpp
new file mode 100644
index 0000000..7697b1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/pop_front_impl.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_AUX_POP_FRONT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_POP_FRONT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_front_fwd.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+
+namespace boost { namespace mpl {
+
+// no default implementation; the definition is needed to make MSVC happy
+
+template< typename Tag >
+struct pop_front_impl
+{
+    template< typename Sequence > struct apply
+    // conservatively placed, but maybe should go outside surrounding
+    // braces.
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) 
+    {
+        typedef int type;
+    }
+#endif
+    ;
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, pop_front_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_POP_FRONT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp
new file mode 100644
index 0000000..5cb50dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp
new file mode 100644
index 0000000..9654ee3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/and.hpp
new file mode 100644
index 0000000..f345689
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply.hpp
new file mode 100644
index 0000000..bce7c2c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp
new file mode 100644
index 0000000..1ba706f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp
new file mode 100644
index 0000000..45b75c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp
@@ -0,0 +1,461 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      int N, typename F
+    >
+struct apply_wrap_impl0;
+
+template< typename F, bool F_has_apply >
+struct apply_wrap_impl0_bcb {
+    typedef typename F::template apply<na> type;
+};
+
+template< typename F >
+struct apply_wrap_impl0_bcb< F,true > {
+    typedef typename F::apply type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          0
+        , F
+       
+        >
+{
+    typedef apply_wrap_impl0_bcb< F, aux::has_apply<F>::value >::type type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          1
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          2
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          3
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          4
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          5
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap0
+    : apply_wrap_impl0<
+          ::boost::mpl::aux::arity< F,0 >::value
+        , F
+       
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1
+    >
+struct apply_wrap_impl1;
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          1
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          2
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          3
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          4
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          5
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap1
+    : apply_wrap_impl1<
+          ::boost::mpl::aux::arity< F,1 >::value
+        , F
+        , T1
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          2
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          3
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          4
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          5
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap2
+    : apply_wrap_impl2<
+          ::boost::mpl::aux::arity< F,2 >::value
+        , F
+        , T1, T2
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          3
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          4
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          5
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap3
+    : apply_wrap_impl3<
+          ::boost::mpl::aux::arity< F,3 >::value
+        , F
+        , T1, T2, T3
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          4
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          5
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap4
+    : apply_wrap_impl4<
+          ::boost::mpl::aux::arity< F,4 >::value
+        , F
+        , T1, T2, T3, T4
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5<
+          5
+        , F
+        , T1, T2, T3, T4, T5
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4, T5
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap5
+    : apply_wrap_impl5<
+          ::boost::mpl::aux::arity< F,5 >::value
+        , F
+        , T1, T2, T3, T4, T5
+        >::type
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/arg.hpp
new file mode 100644
index 0000000..3ac4340
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/arg.hpp
@@ -0,0 +1,117 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp
new file mode 100644
index 0000000..74b0029
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp
@@ -0,0 +1,300 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind.hpp
new file mode 100644
index 0000000..e769a0c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind.hpp
@@ -0,0 +1,397 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp
new file mode 100644
index 0000000..962b5c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitand.hpp
new file mode 100644
index 0000000..527b689
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitor.hpp
new file mode 100644
index 0000000..3f0d5ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp
new file mode 100644
index 0000000..06996c0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/deque.hpp
new file mode 100644
index 0000000..06505c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/divides.hpp
new file mode 100644
index 0000000..6b4178a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp
new file mode 100644
index 0000000..901a93c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp
new file mode 100644
index 0000000..45ab4e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp
new file mode 100644
index 0000000..8b2bf59
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp
@@ -0,0 +1,558 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Arity
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>,Tag, int_< -1 > >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>,Tag, int_<1> >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    , typename Arity
+    >
+struct lambda<
+          lambda< F,Tag1,Arity >
+        , Tag2
+        , int_<3>
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
+    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;
+    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater.hpp
new file mode 100644
index 0000000..3d1c3dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp
new file mode 100644
index 0000000..fb01186
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/inherit.hpp
new file mode 100644
index 0000000..6adcc01
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/inherit.hpp
@@ -0,0 +1,139 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1, typename T2, typename T3, typename T4, typename T5
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..b767e95
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp
new file mode 100644
index 0000000..1dd216c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp
new file mode 100644
index 0000000..75b30ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less.hpp
new file mode 100644
index 0000000..0b6ce1d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp
new file mode 100644
index 0000000..0010e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list.hpp
new file mode 100644
index 0000000..cbd58ac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list_c.hpp
new file mode 100644
index 0000000..495c3f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/map.hpp
new file mode 100644
index 0000000..80ef156
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/minus.hpp
new file mode 100644
index 0000000..cfddc15
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/modulus.hpp
new file mode 100644
index 0000000..eb5eff0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp
new file mode 100644
index 0000000..68356ee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/or.hpp
new file mode 100644
index 0000000..ff7ce9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp
new file mode 100644
index 0000000..b306bbb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/plus.hpp
new file mode 100644
index 0000000..82539ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/quote.hpp
new file mode 100644
index 0000000..677a3f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/quote.hpp
@@ -0,0 +1,119 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+
+{
+    typedef typename T::type type;
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+    typedef T type;
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+    {
+        typedef typename quote_impl<
+              F<U1>
+            , aux::has_type< F<U1> >::value
+            >::type type;
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+    {
+        typedef typename quote_impl<
+              F< U1,U2 >
+            , aux::has_type< F< U1,U2 > >::value
+            >::type type;
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+    {
+        typedef typename quote_impl<
+              F< U1,U2,U3 >
+            , aux::has_type< F< U1,U2,U3 > >::value
+            >::type type;
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+    {
+        typedef typename quote_impl<
+              F< U1,U2,U3,U4 >
+            , aux::has_type< F< U1,U2,U3,U4 > >::value
+            >::type type;
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+    {
+        typedef typename quote_impl<
+              F< U1,U2,U3,U4,U5 >
+            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+            >::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp
new file mode 100644
index 0000000..372f0d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..44aadf7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set.hpp
new file mode 100644
index 0000000..ace3a4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set_c.hpp
new file mode 100644
index 0000000..4e6993c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp
new file mode 100644
index 0000000..6d19e94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp
new file mode 100644
index 0000000..dd31d97
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp
new file mode 100644
index 0000000..b24a0a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp
@@ -0,0 +1,40 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/times.hpp
new file mode 100644
index 0000000..ab100f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp
new file mode 100644
index 0000000..f391dc1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+    {
+        typedef typename aux::unpack_args_impl<
+              size<Args>::value
+            , F
+            , Args
+            >::type type;
+
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector.hpp
new file mode 100644
index 0000000..803e217
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp
new file mode 100644
index 0000000..643b7fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/and.hpp
new file mode 100644
index 0000000..010ad1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply.hpp
new file mode 100644
index 0000000..e08eacc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp
new file mode 100644
index 0000000..2ffe709
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp
@@ -0,0 +1,456 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      int N, typename F
+    >
+struct apply_wrap_impl0;
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          0
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+/// since the defaults are "lost", we have to pass *something* even for nullary
+/// metafunction classes
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          1
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          2
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          3
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          4
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          5
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap0
+    : apply_wrap_impl0<
+          ::boost::mpl::aux::arity< F,0 >::value
+        , F
+       
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1
+    >
+struct apply_wrap_impl1;
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          1
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          2
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          3
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          4
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          5
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap1
+    : apply_wrap_impl1<
+          ::boost::mpl::aux::arity< F,1 >::value
+        , F
+        , T1
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          2
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          3
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          4
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          5
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap2
+    : apply_wrap_impl2<
+          ::boost::mpl::aux::arity< F,2 >::value
+        , F
+        , T1, T2
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          3
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          4
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          5
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap3
+    : apply_wrap_impl3<
+          ::boost::mpl::aux::arity< F,3 >::value
+        , F
+        , T1, T2, T3
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          4
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          5
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap4
+    : apply_wrap_impl4<
+          ::boost::mpl::aux::arity< F,4 >::value
+        , F
+        , T1, T2, T3, T4
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5<
+          5
+        , F
+        , T1, T2, T3, T4, T5
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4, T5
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap5
+    : apply_wrap_impl5<
+          ::boost::mpl::aux::arity< F,5 >::value
+        , F
+        , T1, T2, T3, T4, T5
+        >::type
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp
new file mode 100644
index 0000000..a29daa0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp
@@ -0,0 +1,306 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind.hpp
new file mode 100644
index 0000000..34b1b5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind.hpp
@@ -0,0 +1,403 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp
new file mode 100644
index 0000000..022cba3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp
new file mode 100644
index 0000000..0bbf54e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp
new file mode 100644
index 0000000..55b31cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp
new file mode 100644
index 0000000..ec19391
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/divides.hpp
new file mode 100644
index 0000000..86f1682
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp
new file mode 100644
index 0000000..62c9945
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp
new file mode 100644
index 0000000..e3eef71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp
@@ -0,0 +1,558 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Arity
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>,Tag, int_< -1 > >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>,Tag, int_<1> >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    , typename Arity
+    >
+struct lambda<
+          lambda< F,Tag1,Arity >
+        , Tag2
+        , int_<3>
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
+    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;
+    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater.hpp
new file mode 100644
index 0000000..14d8e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp
new file mode 100644
index 0000000..2603f91
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp
new file mode 100644
index 0000000..00f31c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less.hpp
new file mode 100644
index 0000000..4fe3cd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp
new file mode 100644
index 0000000..ca2894f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/minus.hpp
new file mode 100644
index 0000000..71d4913
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp
new file mode 100644
index 0000000..224b349
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp
new file mode 100644
index 0000000..98b21b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/or.hpp
new file mode 100644
index 0000000..31e1aaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/plus.hpp
new file mode 100644
index 0000000..a9f6ee7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/quote.hpp
new file mode 100644
index 0000000..e7a7f00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/quote.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp
new file mode 100644
index 0000000..7a07414
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..39a4057
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp
new file mode 100644
index 0000000..b5b181c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp
new file mode 100644
index 0000000..f7a342e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp
new file mode 100644
index 0000000..1164f0f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp
@@ -0,0 +1,40 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/times.hpp
new file mode 100644
index 0000000..cb97cc4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp
new file mode 100644
index 0000000..ef7c2b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+    {
+        typedef typename aux::unpack_args_impl<
+              size<Args>::value
+            , F
+            , Args
+            >::type type;
+
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp
new file mode 100644
index 0000000..5cb50dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp
new file mode 100644
index 0000000..9654ee3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp
new file mode 100644
index 0000000..f345689
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp
new file mode 100644
index 0000000..bce7c2c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp
new file mode 100644
index 0000000..1ba706f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp
new file mode 100644
index 0000000..d88129d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp
@@ -0,0 +1,456 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      int N, typename F
+    >
+struct apply_wrap_impl0;
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          0
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+/// since the defaults are "lost", we have to pass *something* even for nullary
+/// metafunction classes
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          1
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          2
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          3
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          4
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          5
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap0
+    : apply_wrap_impl0<
+          ::boost::mpl::aux::arity< F,0 >::value
+        , F
+       
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1
+    >
+struct apply_wrap_impl1;
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          1
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          2
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          3
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          4
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          5
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap1
+    : apply_wrap_impl1<
+          ::boost::mpl::aux::arity< F,1 >::value
+        , F
+        , T1
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          2
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          3
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          4
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          5
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap2
+    : apply_wrap_impl2<
+          ::boost::mpl::aux::arity< F,2 >::value
+        , F
+        , T1, T2
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          3
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          4
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          5
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap3
+    : apply_wrap_impl3<
+          ::boost::mpl::aux::arity< F,3 >::value
+        , F
+        , T1, T2, T3
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          4
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          5
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap4
+    : apply_wrap_impl4<
+          ::boost::mpl::aux::arity< F,4 >::value
+        , F
+        , T1, T2, T3, T4
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5<
+          5
+        , F
+        , T1, T2, T3, T4, T5
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4, T5
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap5
+    : apply_wrap_impl5<
+          ::boost::mpl::aux::arity< F,5 >::value
+        , F
+        , T1, T2, T3, T4, T5
+        >::type
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp
new file mode 100644
index 0000000..3ac4340
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp
@@ -0,0 +1,117 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp
new file mode 100644
index 0000000..74b0029
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp
@@ -0,0 +1,300 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp
new file mode 100644
index 0000000..e769a0c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp
@@ -0,0 +1,397 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4, typename U5
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp
new file mode 100644
index 0000000..962b5c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp
new file mode 100644
index 0000000..527b689
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp
new file mode 100644
index 0000000..3f0d5ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp
new file mode 100644
index 0000000..06996c0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp
new file mode 100644
index 0000000..06505c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp
new file mode 100644
index 0000000..6b4178a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp
new file mode 100644
index 0000000..901a93c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp
new file mode 100644
index 0000000..45ab4e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp
new file mode 100644
index 0000000..8b2bf59
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp
@@ -0,0 +1,558 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Arity
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>,Tag, int_< -1 > >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>,Tag, int_<1> >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    , typename Arity
+    >
+struct lambda<
+          lambda< F,Tag1,Arity >
+        , Tag2
+        , int_<3>
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
+    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;
+    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp
new file mode 100644
index 0000000..3d1c3dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp
new file mode 100644
index 0000000..fb01186
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp
new file mode 100644
index 0000000..6adcc01
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp
@@ -0,0 +1,139 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1, typename T2, typename T3, typename T4, typename T5
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..b767e95
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp
new file mode 100644
index 0000000..1dd216c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp
new file mode 100644
index 0000000..75b30ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp
new file mode 100644
index 0000000..0b6ce1d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp
new file mode 100644
index 0000000..0010e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp
new file mode 100644
index 0000000..cbd58ac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp
new file mode 100644
index 0000000..495c3f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp
new file mode 100644
index 0000000..80ef156
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp
new file mode 100644
index 0000000..cfddc15
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp
new file mode 100644
index 0000000..eb5eff0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp
new file mode 100644
index 0000000..68356ee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp
new file mode 100644
index 0000000..ff7ce9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp
new file mode 100644
index 0000000..b306bbb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp
new file mode 100644
index 0000000..82539ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp
new file mode 100644
index 0000000..7f9d18b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "quote.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp
new file mode 100644
index 0000000..372f0d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..44aadf7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp
new file mode 100644
index 0000000..ace3a4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp
new file mode 100644
index 0000000..4e6993c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp
new file mode 100644
index 0000000..6d19e94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp
new file mode 100644
index 0000000..dd31d97
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp
new file mode 100644
index 0000000..b24a0a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp
@@ -0,0 +1,40 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp
new file mode 100644
index 0000000..ab100f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp
new file mode 100644
index 0000000..f391dc1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+    {
+        typedef typename aux::unpack_args_impl<
+              size<Args>::value
+            , F
+            , Args
+            >::type type;
+
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp
new file mode 100644
index 0000000..803e217
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp
new file mode 100644
index 0000000..643b7fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/and.hpp
new file mode 100644
index 0000000..010ad1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply.hpp
new file mode 100644
index 0000000..e08eacc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp
new file mode 100644
index 0000000..34d51a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp
@@ -0,0 +1,84 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+    : F::template apply<  >
+{
+};
+
+template< typename F >
+struct apply_wrap0< F,true_ >
+    : F::apply
+{
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+    : F::template apply<T1>
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+    : F::template apply< T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+    : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+    : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+    : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp
new file mode 100644
index 0000000..1e73429
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp
@@ -0,0 +1,406 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F, int dummy_
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, int dummy_
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1, int dummy_
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, int dummy_
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, int dummy_
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, int dummy_
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, int dummy_
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, int dummy_
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , int dummy_
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , int dummy_
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, int dummy_
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, int dummy_
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind.hpp
new file mode 100644
index 0000000..94bfe1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind.hpp
@@ -0,0 +1,515 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F, int dummy_
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, int dummy_
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1, int dummy_
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, int dummy_
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, int dummy_
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, int dummy_
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, int dummy_
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, int dummy_
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , int dummy_
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , int dummy_
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, int dummy_
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, int dummy_
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp
new file mode 100644
index 0000000..181bc77
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp
@@ -0,0 +1,53 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, int dummy_ = 0
+    >
+struct bind;
+
+template<
+      typename F, int dummy_ = 0
+    >
+struct bind0;
+
+template<
+      typename F, typename T1, int dummy_ = 0
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2, int dummy_ = 0
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3, int dummy_ = 0
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , int dummy_ = 0
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, int dummy_ = 0
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitand.hpp
new file mode 100644
index 0000000..0bbf54e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitor.hpp
new file mode 100644
index 0000000..55b31cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp
new file mode 100644
index 0000000..ec19391
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/divides.hpp
new file mode 100644
index 0000000..86f1682
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp
new file mode 100644
index 0000000..62c9945
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp
new file mode 100644
index 0000000..026418c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp
@@ -0,0 +1,536 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater.hpp
new file mode 100644
index 0000000..14d8e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp
new file mode 100644
index 0000000..2603f91
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/inherit.hpp
new file mode 100644
index 0000000..00f31c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/inherit.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less.hpp
new file mode 100644
index 0000000..4fe3cd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp
new file mode 100644
index 0000000..ca2894f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/minus.hpp
new file mode 100644
index 0000000..71d4913
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/modulus.hpp
new file mode 100644
index 0000000..224b349
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp
new file mode 100644
index 0000000..98b21b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/or.hpp
new file mode 100644
index 0000000..31e1aaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/plus.hpp
new file mode 100644
index 0000000..a9f6ee7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/quote.hpp
new file mode 100644
index 0000000..d7d0420
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/quote.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+    : T
+{
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+    typedef T type;
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl<
+              F<U1>
+            , aux::has_type< F<U1> >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl<
+              F< U1,U2 >
+            , aux::has_type< F< U1,U2 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl<
+              F< U1,U2,U3 >
+            , aux::has_type< F< U1,U2,U3 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4 >
+            , aux::has_type< F< U1,U2,U3,U4 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4,U5 >
+            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+            >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp
new file mode 100644
index 0000000..c468684
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..658f92a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp
new file mode 100644
index 0000000..b5b181c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp
new file mode 100644
index 0000000..f7a342e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp
new file mode 100644
index 0000000..a23fc23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/times.hpp
new file mode 100644
index 0000000..cb97cc4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp
new file mode 100644
index 0000000..2194ce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value,F, Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/and.hpp
new file mode 100644
index 0000000..010ad1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply.hpp
new file mode 100644
index 0000000..e08eacc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp
new file mode 100644
index 0000000..34d51a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp
@@ -0,0 +1,84 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+    : F::template apply<  >
+{
+};
+
+template< typename F >
+struct apply_wrap0< F,true_ >
+    : F::apply
+{
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+    : F::template apply<T1>
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+    : F::template apply< T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+    : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+    : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+    : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp
new file mode 100644
index 0000000..b070232
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp
@@ -0,0 +1,440 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind.hpp
new file mode 100644
index 0000000..0e9513a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind.hpp
@@ -0,0 +1,561 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp
new file mode 100644
index 0000000..c4a5060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct bind;
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitand.hpp
new file mode 100644
index 0000000..0bbf54e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitor.hpp
new file mode 100644
index 0000000..55b31cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp
new file mode 100644
index 0000000..ec19391
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/divides.hpp
new file mode 100644
index 0000000..86f1682
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp
new file mode 100644
index 0000000..62c9945
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp
new file mode 100644
index 0000000..e3eef71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp
@@ -0,0 +1,558 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Arity
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>,Tag, int_< -1 > >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+        , int_<1>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+        , int_<2>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+        , int_<3>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+        , int_<4>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<5>
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>,Tag, int_<1> >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+        , int_<6>
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+template<
+      typename F
+    , typename Tag1
+    , typename Tag2
+    , typename Arity
+    >
+struct lambda<
+          lambda< F,Tag1,Arity >
+        , Tag2
+        , int_<3>
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
+    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;
+    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater.hpp
new file mode 100644
index 0000000..14d8e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp
new file mode 100644
index 0000000..2603f91
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/inherit.hpp
new file mode 100644
index 0000000..00f31c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/inherit.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less.hpp
new file mode 100644
index 0000000..4fe3cd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp
new file mode 100644
index 0000000..ca2894f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/minus.hpp
new file mode 100644
index 0000000..71d4913
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/modulus.hpp
new file mode 100644
index 0000000..224b349
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp
new file mode 100644
index 0000000..98b21b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/or.hpp
new file mode 100644
index 0000000..31e1aaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/plus.hpp
new file mode 100644
index 0000000..a9f6ee7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/quote.hpp
new file mode 100644
index 0000000..020f093
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/quote.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+{
+    typedef typename T::type type;
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+    typedef T type;
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl<
+              F<U1>
+            , aux::has_type< F<U1> >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl<
+              F< U1,U2 >
+            , aux::has_type< F< U1,U2 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl<
+              F< U1,U2,U3 >
+            , aux::has_type< F< U1,U2,U3 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4 >
+            , aux::has_type< F< U1,U2,U3,U4 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4,U5 >
+            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+            >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp
new file mode 100644
index 0000000..c468684
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..658f92a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp
new file mode 100644
index 0000000..b5b181c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp
new file mode 100644
index 0000000..f7a342e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp
new file mode 100644
index 0000000..daec4b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// *Preprocessed* version of the main "template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+template< int N > struct arity_tag
+{
+    typedef char (&type)[N + 1];
+};
+
+template<
+      int C1, int C2, int C3, int C4, int C5, int C6
+    >
+struct max_arity
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          ( C6 > 0 ? C6 : ( C5 > 0 ? C5 : ( C4 > 0 ? C4 : ( C3 > 0 ? C3 : ( C2 > 0 ? C2 : ( C1 > 0 ? C1 : -1 ) ) ) ) ) )
+        );
+};
+
+arity_tag<0>::type arity_helper(...);
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    >
+typename arity_tag<1>::type
+arity_helper(type_wrapper< F<T1> >, arity_tag<1>);
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    >
+typename arity_tag<2>::type
+arity_helper(type_wrapper< F< T1,T2 > >, arity_tag<2>);
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    >
+typename arity_tag<3>::type
+arity_helper(type_wrapper< F< T1,T2,T3 > >, arity_tag<3>);
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    >
+typename arity_tag<4>::type
+arity_helper(type_wrapper< F< T1,T2,T3,T4 > >, arity_tag<4>);
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    >
+typename arity_tag<5>::type
+arity_helper(type_wrapper< F< T1,T2,T3,T4,T5 > >, arity_tag<5>);
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5, typename P6
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6
+    >
+typename arity_tag<6>::type
+arity_helper(type_wrapper< F< T1,T2,T3,T4,T5,T6 > >, arity_tag<6>);
+template< typename F, int N >
+struct template_arity_impl
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(), arity_tag<N>())) - 1
+        );
+};
+
+template< typename F >
+struct template_arity
+{
+    BOOST_STATIC_CONSTANT(int, value  = (
+          max_arity< template_arity_impl< F,1 >::value, template_arity_impl< F,2 >::value, template_arity_impl< F,3 >::value, template_arity_impl< F,4 >::value, template_arity_impl< F,5 >::value, template_arity_impl< F,6 >::value >::value
+        ));
+    typedef mpl::int_<value> type;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/times.hpp
new file mode 100644
index 0000000..cb97cc4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp
new file mode 100644
index 0000000..2194ce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value,F, Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp
new file mode 100644
index 0000000..36337c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp
@@ -0,0 +1,132 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp
new file mode 100644
index 0000000..4ffbe78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp
@@ -0,0 +1,132 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+
+    /// ETI workaround
+    template<> struct apply<int>
+    {
+        typedef int type;
+    };
+
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/and.hpp
new file mode 100644
index 0000000..555c800
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/and.hpp
@@ -0,0 +1,73 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct and_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : false_
+    {
+    };
+};
+
+template<> struct and_impl<true>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : and_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,true_ >
+    {
+    };
+};
+
+template<>
+struct and_impl<true>
+    ::result_< true_,true_,true_,true_ >
+        : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply.hpp
new file mode 100644
index 0000000..a3e2929
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply.hpp
@@ -0,0 +1,166 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+{
+    typedef typename apply_wrap0<
+          typename lambda<F>::type
+       
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply0<int>
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+{
+    typedef typename apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply1< int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+{
+    typedef typename apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply2< int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+{
+    typedef typename apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply3< int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+{
+    typedef typename apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply4< int,int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+{
+    typedef typename apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply5< int,int,int,int,int,int >
+{
+    typedef int type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp
new file mode 100644
index 0000000..f0f86c1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp
new file mode 100644
index 0000000..4e89507
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp
@@ -0,0 +1,247 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename F>
+struct msvc_apply0
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template< typename P  = int > struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template< typename T  = int > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply<>
+    {
+    };
+
+};
+
+template<
+      typename F
+    >
+struct apply_wrap0
+{
+    typedef typename msvc_apply0<F>::template result_<
+         
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap0<int>
+{
+    typedef int type;
+};
+
+template< typename F>
+struct msvc_apply1
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template< typename P1 > struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template< typename T1 > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply<T1>
+    {
+    };
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap1
+{
+    typedef typename msvc_apply1<F>::template result_<
+          T1
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap1< int,int >
+{
+    typedef int type;
+};
+
+template< typename F>
+struct msvc_apply2
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template< typename P1, typename P2 > struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template< typename T1, typename T2 > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply< T1,T2 >
+    {
+    };
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap2
+{
+    typedef typename msvc_apply2<F>::template result_<
+          T1, T2
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap2< int,int,int >
+{
+    typedef int type;
+};
+
+template< typename F>
+struct msvc_apply3
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template< typename P1, typename P2, typename P3 > struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template< typename T1, typename T2, typename T3 > struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply< T1,T2,T3 >
+    {
+    };
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap3
+{
+    typedef typename msvc_apply3<F>::template result_<
+          T1, T2, T3
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap3< int,int,int,int >
+{
+    typedef int type;
+};
+
+template< typename F>
+struct msvc_apply4
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template<
+              typename P1, typename P2, typename P3, typename P4
+            >
+        struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply< T1,T2,T3,T4 >
+    {
+    };
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap4
+{
+    typedef typename msvc_apply4<F>::template result_<
+          T1, T2, T3, T4
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap4< int,int,int,int,int >
+{
+    typedef int type;
+};
+
+template< typename F>
+struct msvc_apply5
+{
+    template< bool > struct f_ : F {};
+    template<> struct f_<true>
+    {
+        template<
+              typename P1, typename P2, typename P3, typename P4
+            , typename P5
+            >
+        struct apply
+        {
+            typedef int type;
+        };
+    };
+
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+        : f_< aux::msvc_never_true<F>::value >
+            ::template apply< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap5
+{
+    typedef typename msvc_apply5<F>::template result_<
+          T1, T2, T3, T4, T5
+        >::type type;
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap5< int,int,int,int,int,int >
+{
+    typedef int type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp
new file mode 100644
index 0000000..4f12a40
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind.hpp
new file mode 100644
index 0000000..53c76e8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind.hpp
@@ -0,0 +1,432 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< typename T >
+struct replace_unnamed_arg_impl
+{
+    template< typename Arg > struct result_
+    {
+        typedef Arg next;
+        typedef T type;
+    };
+};
+
+template<>
+struct replace_unnamed_arg_impl< arg< -1 > >
+{
+    template< typename Arg > struct result_
+    {
+        typedef typename next<Arg>::type next;
+        typedef Arg type;
+    };
+};
+
+template< typename T, typename Arg >
+struct replace_unnamed_arg
+    : replace_unnamed_arg_impl<T>::template result_<Arg>
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp
new file mode 100644
index 0000000..022cba3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp
new file mode 100644
index 0000000..e96cf1a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitand_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitand_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+
+    : if_<
+
+          is_na<N3>
+        , bitand_2< N1,N2 >
+        , bitand_<
+              bitand_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitand_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitand_impl<
+              typename bitand_tag<N1>::type
+            , typename bitand_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitand_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitand_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp
new file mode 100644
index 0000000..bbc96ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitor_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+
+    : if_<
+
+          is_na<N3>
+        , bitor_2< N1,N2 >
+        , bitor_<
+              bitor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitor_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitor_impl<
+              typename bitor_tag<N1>::type
+            , typename bitor_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp
new file mode 100644
index 0000000..4c14297
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitxor_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitxor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+
+    : if_<
+
+          is_na<N3>
+        , bitxor_2< N1,N2 >
+        , bitxor_<
+              bitxor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitxor_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitxor_impl<
+              typename bitxor_tag<N1>::type
+            , typename bitxor_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitxor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitxor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/deque.hpp
new file mode 100644
index 0000000..a0445d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/deque.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct deque_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct deque_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_deque_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_deque_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct deque_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_deque_arg<T1>::value + is_deque_arg<T2>::value 
+        + is_deque_arg<T3>::value + is_deque_arg<T4>::value 
+        + is_deque_arg<T5>::value + is_deque_arg<T6>::value 
+        + is_deque_arg<T7>::value + is_deque_arg<T8>::value 
+        + is_deque_arg<T9>::value + is_deque_arg<T10>::value 
+        + is_deque_arg<T11>::value + is_deque_arg<T12>::value 
+        + is_deque_arg<T13>::value + is_deque_arg<T14>::value 
+        + is_deque_arg<T15>::value + is_deque_arg<T16>::value 
+        + is_deque_arg<T17>::value + is_deque_arg<T18>::value 
+        + is_deque_arg<T19>::value + is_deque_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque_impl
+{
+    typedef aux::deque_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::deque_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque
+    : aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/divides.hpp
new file mode 100644
index 0000000..7681491
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/divides.hpp
@@ -0,0 +1,148 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct divides_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct divides2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+
+    : if_<
+
+          is_na<N3>
+        , divides2< N1,N2 >
+        , divides<
+              divides2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct divides2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          divides_impl<
+              typename divides_tag<N1>::type
+            , typename divides_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct divides_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::divides_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp
new file mode 100644
index 0000000..64e9065
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct equal_to_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+    : aux::msvc_eti_base< typename apply_wrap2<
+          equal_to_impl<
+              typename equal_to_tag<N1>::type
+            , typename equal_to_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp
new file mode 100644
index 0000000..4b3c690
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp
@@ -0,0 +1,293 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template< int N >
+struct fold_chunk;
+
+template<> struct fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template< int N >
+struct fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , fold_null_step< Last,State >
+            , fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step
+{
+    typedef fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+    : fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater.hpp
new file mode 100644
index 0000000..5f5662d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct greater_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+    : aux::msvc_eti_base< typename apply_wrap2<
+          greater_impl<
+              typename greater_tag<N1>::type
+            , typename greater_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp
new file mode 100644
index 0000000..ae776fc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct greater_equal_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+    : aux::msvc_eti_base< typename apply_wrap2<
+          greater_equal_impl<
+              typename greater_equal_tag<N1>::type
+            , typename greater_equal_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp
new file mode 100644
index 0000000..233a1ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp
@@ -0,0 +1,166 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C1, bool C2 >
+struct inherit2_impl
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1, T2
+    {
+        typedef Derived type_;
+    };
+};
+
+template<>
+struct inherit2_impl< false,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1
+    {
+        typedef T1 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,false >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T2
+    {
+        typedef T2 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+    {
+        typedef T1 type_;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : aux::inherit2_impl<
+          is_empty_base<T1>::value
+        , is_empty_base<T2>::value
+        >::template result_< inherit2< T1,T2 >,T1, T2 >
+{
+    typedef typename inherit2::type_ type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp
new file mode 100644
index 0000000..69aadc4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp
@@ -0,0 +1,293 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template< int N >
+struct iter_fold_chunk;
+
+template<> struct iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template< int N >
+struct iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef iter_fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , iter_fold_null_step< Last,State >
+            , iter_fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step
+{
+    typedef iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+    : iter_fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less.hpp
new file mode 100644
index 0000000..951f060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct less_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+    : aux::msvc_eti_base< typename apply_wrap2<
+          less_impl<
+              typename less_tag<N1>::type
+            , typename less_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N1)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp
new file mode 100644
index 0000000..a56e692
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct less_equal_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+    : aux::msvc_eti_base< typename apply_wrap2<
+          less_equal_impl<
+              typename less_equal_tag<N1>::type
+            , typename less_equal_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list.hpp
new file mode 100644
index 0000000..e5ea456
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef list0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_list_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct list_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_arg<T1>::value + is_list_arg<T2>::value 
+        + is_list_arg<T3>::value + is_list_arg<T4>::value 
+        + is_list_arg<T5>::value + is_list_arg<T6>::value 
+        + is_list_arg<T7>::value + is_list_arg<T8>::value 
+        + is_list_arg<T9>::value + is_list_arg<T10>::value 
+        + is_list_arg<T11>::value + is_list_arg<T12>::value 
+        + is_list_arg<T13>::value + is_list_arg<T14>::value 
+        + is_list_arg<T15>::value + is_list_arg<T16>::value 
+        + is_list_arg<T17>::value + is_list_arg<T18>::value 
+        + is_list_arg<T19>::value + is_list_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list_impl
+{
+    typedef aux::list_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::list_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list
+    : aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp
new file mode 100644
index 0000000..ab25482
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_list_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct list_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value 
+        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value 
+        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value 
+        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value 
+        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value 
+        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value 
+        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value 
+        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value 
+        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value 
+        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c_impl
+{
+    typedef aux::list_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::list_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c
+    : aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/map.hpp
new file mode 100644
index 0000000..970e0b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/map.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct map_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct map_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef map0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_map_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_map_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct map_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_map_arg<T1>::value + is_map_arg<T2>::value 
+        + is_map_arg<T3>::value + is_map_arg<T4>::value 
+        + is_map_arg<T5>::value + is_map_arg<T6>::value 
+        + is_map_arg<T7>::value + is_map_arg<T8>::value 
+        + is_map_arg<T9>::value + is_map_arg<T10>::value 
+        + is_map_arg<T11>::value + is_map_arg<T12>::value 
+        + is_map_arg<T13>::value + is_map_arg<T14>::value 
+        + is_map_arg<T15>::value + is_map_arg<T16>::value 
+        + is_map_arg<T17>::value + is_map_arg<T18>::value 
+        + is_map_arg<T19>::value + is_map_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map_impl
+{
+    typedef aux::map_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::map_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map
+    : aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/minus.hpp
new file mode 100644
index 0000000..b47f328
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/minus.hpp
@@ -0,0 +1,148 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct minus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct minus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+
+    : if_<
+
+          is_na<N3>
+        , minus2< N1,N2 >
+        , minus<
+              minus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct minus2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          minus_impl<
+              typename minus_tag<N1>::type
+            , typename minus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct minus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::minus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp
new file mode 100644
index 0000000..c12b3f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp
@@ -0,0 +1,115 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct modulus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+    : aux::msvc_eti_base< typename apply_wrap2<
+          modulus_impl<
+              typename modulus_tag<N1>::type
+            , typename modulus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct modulus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::modulus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp
new file mode 100644
index 0000000..6e56b1e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+    : aux::msvc_eti_base< typename apply_wrap2<
+          not_equal_to_impl<
+              typename not_equal_to_tag<N1>::type
+            , typename not_equal_to_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/or.hpp
new file mode 100644
index 0000000..3f7394e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/or.hpp
@@ -0,0 +1,73 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct or_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : true_
+    {
+    };
+};
+
+template<> struct or_impl<false>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : or_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,false_ >
+    {
+    };
+};
+
+template<>
+struct or_impl<false>
+    ::result_< false_,false_,false_,false_ >
+        : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/plus.hpp
new file mode 100644
index 0000000..1052335
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/plus.hpp
@@ -0,0 +1,148 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct plus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct plus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+
+    : if_<
+
+          is_na<N3>
+        , plus2< N1,N2 >
+        , plus<
+              plus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct plus2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          plus_impl<
+              typename plus_tag<N1>::type
+            , typename plus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct plus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::plus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/quote.hpp
new file mode 100644
index 0000000..e7a7f00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/quote.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp
new file mode 100644
index 0000000..adf15b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp
@@ -0,0 +1,343 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..208ad97
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp
@@ -0,0 +1,343 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+    /// ETI workaround
+    template<> struct result_< int,int,int,int,int >
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set.hpp
new file mode 100644
index 0000000..95aaa5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef set0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_set_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct set_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_arg<T1>::value + is_set_arg<T2>::value 
+        + is_set_arg<T3>::value + is_set_arg<T4>::value 
+        + is_set_arg<T5>::value + is_set_arg<T6>::value 
+        + is_set_arg<T7>::value + is_set_arg<T8>::value 
+        + is_set_arg<T9>::value + is_set_arg<T10>::value 
+        + is_set_arg<T11>::value + is_set_arg<T12>::value 
+        + is_set_arg<T13>::value + is_set_arg<T14>::value 
+        + is_set_arg<T15>::value + is_set_arg<T16>::value 
+        + is_set_arg<T17>::value + is_set_arg<T18>::value 
+        + is_set_arg<T19>::value + is_set_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set_impl
+{
+    typedef aux::set_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::set_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set
+    : aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp
new file mode 100644
index 0000000..1ff34f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_set_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct set_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value 
+        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value 
+        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value 
+        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value 
+        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value 
+        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value 
+        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value 
+        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value 
+        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value 
+        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c_impl
+{
+    typedef aux::set_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::set_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c
+    : aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp
new file mode 100644
index 0000000..3861ca1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp
@@ -0,0 +1,114 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct shift_left_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+    : aux::msvc_eti_base< typename apply_wrap2<
+          shift_left_impl<
+              typename shift_left_tag<N1>::type
+            , typename shift_left_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_left_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n << s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_left_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp
new file mode 100644
index 0000000..24ea094
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp
@@ -0,0 +1,114 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct shift_right_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+    : aux::msvc_eti_base< typename apply_wrap2<
+          shift_right_impl<
+              typename shift_right_tag<N1>::type
+            , typename shift_right_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_right_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n >> s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_right_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp
new file mode 100644
index 0000000..1668771
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+template<>
+struct template_arity<int>
+    : mpl::int_< -1 >
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/times.hpp
new file mode 100644
index 0000000..dee7fd4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/times.hpp
@@ -0,0 +1,148 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct times_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct times2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+
+    : if_<
+
+          is_na<N3>
+        , times2< N1,N2 >
+        , times<
+              times2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct times2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          times_impl<
+              typename times_tag<N1>::type
+            , typename times_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct times_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::times_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp
new file mode 100644
index 0000000..26533dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp
@@ -0,0 +1,109 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl
+{
+    template< typename F, typename Args > struct apply;
+};
+
+template<> struct unpack_args_impl<0>
+{
+    template< typename F, typename Args > struct apply
+        : apply0<
+              F
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<1>
+{
+    template< typename F, typename Args > struct apply
+        : apply1<
+              F
+            , typename at_c< Args,0 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<2>
+{
+    template< typename F, typename Args > struct apply
+        : apply2<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<3>
+{
+    template< typename F, typename Args > struct apply
+        : apply3<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<4>
+{
+    template< typename F, typename Args > struct apply
+        : apply4<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<5>
+{
+    template< typename F, typename Args > struct apply
+        : apply5<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            , typename at_c< Args,4 >::type
+            >
+    {
+    };
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value >
+            ::template apply< F,Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector.hpp
new file mode 100644
index 0000000..a6c7b62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_vector_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct vector_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_arg<T1>::value + is_vector_arg<T2>::value 
+        + is_vector_arg<T3>::value + is_vector_arg<T4>::value 
+        + is_vector_arg<T5>::value + is_vector_arg<T6>::value 
+        + is_vector_arg<T7>::value + is_vector_arg<T8>::value 
+        + is_vector_arg<T9>::value + is_vector_arg<T10>::value 
+        + is_vector_arg<T11>::value + is_vector_arg<T12>::value 
+        + is_vector_arg<T13>::value + is_vector_arg<T14>::value 
+        + is_vector_arg<T15>::value + is_vector_arg<T16>::value 
+        + is_vector_arg<T17>::value + is_vector_arg<T18>::value 
+        + is_vector_arg<T19>::value + is_vector_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector_impl
+{
+    typedef aux::vector_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::vector_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector
+    : aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp
new file mode 100644
index 0000000..c522d08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector1_c<
+              T, T(C0)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector2_c<
+              T, T(C0), T(C1)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector3_c<
+              T, T(C0), T(C1), T(C2)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector4_c<
+              T, T(C0), T(C1), T(C2), T(C3)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector5_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector6_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector7_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector8_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector9_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector10_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector11_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector12_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector13_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector14_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector15_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector16_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector17_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector18_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector19_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector20_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_vector_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct vector_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value 
+        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value 
+        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value 
+        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value 
+        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value 
+        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value 
+        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value 
+        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value 
+        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value 
+        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c_impl
+{
+    typedef aux::vector_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::vector_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c
+    : aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/and.hpp
new file mode 100644
index 0000000..e58640a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/and.hpp
@@ -0,0 +1,71 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct and_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : false_
+    {
+    };
+};
+
+template<> struct and_impl<true>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : and_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,true_ >
+    {
+    };
+
+    template<> struct result_< true_,true_,true_,true_ >
+        : true_
+    {
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply.hpp
new file mode 100644
index 0000000..d46d030
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply.hpp
@@ -0,0 +1,160 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply0<int>
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply1< int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply2< int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply3< int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply4< int,int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// workaround for ETI bug
+template<>
+struct apply5< int,int,int,int,int,int >
+{
+    typedef int type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp
new file mode 100644
index 0000000..f0f86c1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp
new file mode 100644
index 0000000..d307517
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp
@@ -0,0 +1,138 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+{
+    typedef typename F::template apply<
+        
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap0<int>
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+{
+    typedef typename F::template apply<
+         T1
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap1< int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+{
+    typedef typename F::template apply<
+         T1, T2
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap2< int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+{
+    typedef typename F::template apply<
+         T1, T2, T3
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap3< int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+{
+    typedef typename F::template apply<
+         T1, T2, T3, T4
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap4< int,int,int,int,int >
+{
+    typedef int type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+{
+    typedef typename F::template apply<
+         T1, T2, T3, T4, T5
+        >::type type;
+
+};
+
+/// workaround for ETI bug
+template<>
+struct apply_wrap5< int,int,int,int,int,int >
+{
+    typedef int type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp
new file mode 100644
index 0000000..4f12a40
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind.hpp
new file mode 100644
index 0000000..53c76e8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind.hpp
@@ -0,0 +1,432 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< typename T >
+struct replace_unnamed_arg_impl
+{
+    template< typename Arg > struct result_
+    {
+        typedef Arg next;
+        typedef T type;
+    };
+};
+
+template<>
+struct replace_unnamed_arg_impl< arg< -1 > >
+{
+    template< typename Arg > struct result_
+    {
+        typedef typename next<Arg>::type next;
+        typedef Arg type;
+    };
+};
+
+template< typename T, typename Arg >
+struct replace_unnamed_arg
+    : replace_unnamed_arg_impl<T>::template result_<Arg>
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp
new file mode 100644
index 0000000..022cba3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp
new file mode 100644
index 0000000..e54b4ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp
@@ -0,0 +1,151 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitand_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitand_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , bitand_2< N1,N2 >
+        , bitand_<
+              bitand_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitand_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitand_impl<
+              typename bitand_tag<N1>::type
+            , typename bitand_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitand_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitand_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp
new file mode 100644
index 0000000..3b465b3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp
@@ -0,0 +1,151 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitor_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , bitor_2< N1,N2 >
+        , bitor_<
+              bitor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitor_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitor_impl<
+              typename bitor_tag<N1>::type
+            , typename bitor_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp
new file mode 100644
index 0000000..f7c5d43
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp
@@ -0,0 +1,151 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct bitxor_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitxor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , bitxor_2< N1,N2 >
+        , bitxor_<
+              bitxor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitxor_2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          bitxor_impl<
+              typename bitxor_tag<N1>::type
+            , typename bitxor_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitxor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitxor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/deque.hpp
new file mode 100644
index 0000000..a0445d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/deque.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct deque_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct deque_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_deque_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_deque_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct deque_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_deque_arg<T1>::value + is_deque_arg<T2>::value 
+        + is_deque_arg<T3>::value + is_deque_arg<T4>::value 
+        + is_deque_arg<T5>::value + is_deque_arg<T6>::value 
+        + is_deque_arg<T7>::value + is_deque_arg<T8>::value 
+        + is_deque_arg<T9>::value + is_deque_arg<T10>::value 
+        + is_deque_arg<T11>::value + is_deque_arg<T12>::value 
+        + is_deque_arg<T13>::value + is_deque_arg<T14>::value 
+        + is_deque_arg<T15>::value + is_deque_arg<T16>::value 
+        + is_deque_arg<T17>::value + is_deque_arg<T18>::value 
+        + is_deque_arg<T19>::value + is_deque_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque_impl
+{
+    typedef aux::deque_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::deque_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque
+    : aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/divides.hpp
new file mode 100644
index 0000000..0c60c43
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/divides.hpp
@@ -0,0 +1,150 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct divides_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct divides2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , divides2< N1,N2 >
+        , divides<
+              divides2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct divides2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          divides_impl<
+              typename divides_tag<N1>::type
+            , typename divides_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct divides_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::divides_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp
new file mode 100644
index 0000000..107912b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct equal_to_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+    : aux::msvc_eti_base< typename apply_wrap2<
+          equal_to_impl<
+              typename equal_to_tag<N1>::type
+            , typename equal_to_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp
new file mode 100644
index 0000000..58066d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp
@@ -0,0 +1,245 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template< int N >
+struct fold_chunk;
+
+template<> struct fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< int N >
+struct fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , fold_null_step< Last,State >
+            , fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step
+{
+    typedef fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+    : fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater.hpp
new file mode 100644
index 0000000..f60a860
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct greater_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+    : aux::msvc_eti_base< typename apply_wrap2<
+          greater_impl<
+              typename greater_tag<N1>::type
+            , typename greater_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp
new file mode 100644
index 0000000..2ab09fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct greater_equal_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+    : aux::msvc_eti_base< typename apply_wrap2<
+          greater_equal_impl<
+              typename greater_equal_tag<N1>::type
+            , typename greater_equal_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp
new file mode 100644
index 0000000..233a1ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp
@@ -0,0 +1,166 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C1, bool C2 >
+struct inherit2_impl
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1, T2
+    {
+        typedef Derived type_;
+    };
+};
+
+template<>
+struct inherit2_impl< false,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1
+    {
+        typedef T1 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,false >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T2
+    {
+        typedef T2 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+    {
+        typedef T1 type_;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : aux::inherit2_impl<
+          is_empty_base<T1>::value
+        , is_empty_base<T2>::value
+        >::template result_< inherit2< T1,T2 >,T1, T2 >
+{
+    typedef typename inherit2::type_ type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp
new file mode 100644
index 0000000..50ea754
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp
@@ -0,0 +1,245 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template< int N >
+struct iter_fold_chunk;
+
+template<> struct iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< int N >
+struct iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef iter_fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , iter_fold_null_step< Last,State >
+            , iter_fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step
+{
+    typedef iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+    : iter_fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less.hpp
new file mode 100644
index 0000000..72338de
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct less_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+    : aux::msvc_eti_base< typename apply_wrap2<
+          less_impl<
+              typename less_tag<N1>::type
+            , typename less_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N1)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp
new file mode 100644
index 0000000..b588697
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct less_equal_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+    : aux::msvc_eti_base< typename apply_wrap2<
+          less_equal_impl<
+              typename less_equal_tag<N1>::type
+            , typename less_equal_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list.hpp
new file mode 100644
index 0000000..e5ea456
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef list0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_list_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct list_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_arg<T1>::value + is_list_arg<T2>::value 
+        + is_list_arg<T3>::value + is_list_arg<T4>::value 
+        + is_list_arg<T5>::value + is_list_arg<T6>::value 
+        + is_list_arg<T7>::value + is_list_arg<T8>::value 
+        + is_list_arg<T9>::value + is_list_arg<T10>::value 
+        + is_list_arg<T11>::value + is_list_arg<T12>::value 
+        + is_list_arg<T13>::value + is_list_arg<T14>::value 
+        + is_list_arg<T15>::value + is_list_arg<T16>::value 
+        + is_list_arg<T17>::value + is_list_arg<T18>::value 
+        + is_list_arg<T19>::value + is_list_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list_impl
+{
+    typedef aux::list_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::list_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list
+    : aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp
new file mode 100644
index 0000000..ab25482
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_list_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct list_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value 
+        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value 
+        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value 
+        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value 
+        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value 
+        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value 
+        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value 
+        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value 
+        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value 
+        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c_impl
+{
+    typedef aux::list_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::list_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c
+    : aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/map.hpp
new file mode 100644
index 0000000..970e0b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/map.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct map_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct map_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef map0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_map_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_map_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct map_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_map_arg<T1>::value + is_map_arg<T2>::value 
+        + is_map_arg<T3>::value + is_map_arg<T4>::value 
+        + is_map_arg<T5>::value + is_map_arg<T6>::value 
+        + is_map_arg<T7>::value + is_map_arg<T8>::value 
+        + is_map_arg<T9>::value + is_map_arg<T10>::value 
+        + is_map_arg<T11>::value + is_map_arg<T12>::value 
+        + is_map_arg<T13>::value + is_map_arg<T14>::value 
+        + is_map_arg<T15>::value + is_map_arg<T16>::value 
+        + is_map_arg<T17>::value + is_map_arg<T18>::value 
+        + is_map_arg<T19>::value + is_map_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map_impl
+{
+    typedef aux::map_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::map_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map
+    : aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/minus.hpp
new file mode 100644
index 0000000..3237fa6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/minus.hpp
@@ -0,0 +1,150 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct minus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct minus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , minus2< N1,N2 >
+        , minus<
+              minus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct minus2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          minus_impl<
+              typename minus_tag<N1>::type
+            , typename minus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct minus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::minus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp
new file mode 100644
index 0000000..9c672c0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp
@@ -0,0 +1,115 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct modulus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+    : aux::msvc_eti_base< typename apply_wrap2<
+          modulus_impl<
+              typename modulus_tag<N1>::type
+            , typename modulus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct modulus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::modulus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp
new file mode 100644
index 0000000..1e48e7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp
@@ -0,0 +1,102 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+    : aux::msvc_eti_base< typename apply_wrap2<
+          not_equal_to_impl<
+              typename not_equal_to_tag<N1>::type
+            , typename not_equal_to_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/or.hpp
new file mode 100644
index 0000000..8d0ba0a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/or.hpp
@@ -0,0 +1,71 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct or_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : true_
+    {
+    };
+};
+
+template<> struct or_impl<false>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : or_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,false_ >
+    {
+    };
+
+    template<> struct result_< false_,false_,false_,false_ >
+        : false_
+    {
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/plus.hpp
new file mode 100644
index 0000000..c8f3355
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/plus.hpp
@@ -0,0 +1,150 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct plus_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct plus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , plus2< N1,N2 >
+        , plus<
+              plus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct plus2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          plus_impl<
+              typename plus_tag<N1>::type
+            , typename plus_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct plus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::plus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/quote.hpp
new file mode 100644
index 0000000..b85880f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/quote.hpp
@@ -0,0 +1,116 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+template< bool > struct quote_impl
+{
+    template< typename T > struct result_
+        : T
+    {
+    };
+};
+
+template<> struct quote_impl<false>
+{
+    template< typename T > struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl< aux::has_type< F<U1> >::value >
+            ::template result_< F<U1> >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2 > >::value >
+            ::template result_< F< U1,U2 > >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3 > >::value >
+            ::template result_< F< U1,U2,U3 > >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3,U4 > >::value >
+            ::template result_< F< U1,U2,U3,U4 > >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3,U4,U5 > >::value >
+            ::template result_< F< U1,U2,U3,U4,U5 > >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp
new file mode 100644
index 0000000..7a07414
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..39a4057
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set.hpp
new file mode 100644
index 0000000..95aaa5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef set0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_set_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct set_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_arg<T1>::value + is_set_arg<T2>::value 
+        + is_set_arg<T3>::value + is_set_arg<T4>::value 
+        + is_set_arg<T5>::value + is_set_arg<T6>::value 
+        + is_set_arg<T7>::value + is_set_arg<T8>::value 
+        + is_set_arg<T9>::value + is_set_arg<T10>::value 
+        + is_set_arg<T11>::value + is_set_arg<T12>::value 
+        + is_set_arg<T13>::value + is_set_arg<T14>::value 
+        + is_set_arg<T15>::value + is_set_arg<T16>::value 
+        + is_set_arg<T17>::value + is_set_arg<T18>::value 
+        + is_set_arg<T19>::value + is_set_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set_impl
+{
+    typedef aux::set_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::set_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set
+    : aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp
new file mode 100644
index 0000000..1ff34f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_set_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct set_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value 
+        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value 
+        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value 
+        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value 
+        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value 
+        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value 
+        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value 
+        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value 
+        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value 
+        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c_impl
+{
+    typedef aux::set_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::set_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c
+    : aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp
new file mode 100644
index 0000000..176fc00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp
@@ -0,0 +1,114 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct shift_left_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+    : aux::msvc_eti_base< typename apply_wrap2<
+          shift_left_impl<
+              typename shift_left_tag<N1>::type
+            , typename shift_left_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_left_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n << s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_left_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp
new file mode 100644
index 0000000..6b6e01f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp
@@ -0,0 +1,114 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct shift_right_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+    : tag< T,na >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+    : aux::msvc_eti_base< typename apply_wrap2<
+          shift_right_impl<
+              typename shift_right_tag<N1>::type
+            , typename shift_right_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_right_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n >> s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_right_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp
new file mode 100644
index 0000000..1668771
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp
@@ -0,0 +1,46 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+template<>
+struct template_arity<int>
+    : mpl::int_< -1 >
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/times.hpp
new file mode 100644
index 0000000..a6ae333
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/times.hpp
@@ -0,0 +1,150 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
+    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
+    >
+struct times_impl
+    : if_c<
+          ( tag1_ > tag2_ )
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+    : tag< T,na >
+{
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct times2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+
+    : aux::msvc_eti_base< typename if_<
+
+          is_na<N3>
+        , times2< N1,N2 >
+        , times<
+              times2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+    >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct times2
+    : aux::msvc_eti_base< typename apply_wrap2<
+          times_impl<
+              typename times_tag<N1>::type
+            , typename times_tag<N2>::type
+            >
+        , N1
+        , N2
+        >::type >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct times_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::times_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp
new file mode 100644
index 0000000..26533dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp
@@ -0,0 +1,109 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl
+{
+    template< typename F, typename Args > struct apply;
+};
+
+template<> struct unpack_args_impl<0>
+{
+    template< typename F, typename Args > struct apply
+        : apply0<
+              F
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<1>
+{
+    template< typename F, typename Args > struct apply
+        : apply1<
+              F
+            , typename at_c< Args,0 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<2>
+{
+    template< typename F, typename Args > struct apply
+        : apply2<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<3>
+{
+    template< typename F, typename Args > struct apply
+        : apply3<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<4>
+{
+    template< typename F, typename Args > struct apply
+        : apply4<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<5>
+{
+    template< typename F, typename Args > struct apply
+        : apply5<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            , typename at_c< Args,4 >::type
+            >
+    {
+    };
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value >
+            ::template apply< F,Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector.hpp
new file mode 100644
index 0000000..a6c7b62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_vector_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct vector_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_arg<T1>::value + is_vector_arg<T2>::value 
+        + is_vector_arg<T3>::value + is_vector_arg<T4>::value 
+        + is_vector_arg<T5>::value + is_vector_arg<T6>::value 
+        + is_vector_arg<T7>::value + is_vector_arg<T8>::value 
+        + is_vector_arg<T9>::value + is_vector_arg<T10>::value 
+        + is_vector_arg<T11>::value + is_vector_arg<T12>::value 
+        + is_vector_arg<T13>::value + is_vector_arg<T14>::value 
+        + is_vector_arg<T15>::value + is_vector_arg<T16>::value 
+        + is_vector_arg<T17>::value + is_vector_arg<T18>::value 
+        + is_vector_arg<T19>::value + is_vector_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector_impl
+{
+    typedef aux::vector_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::vector_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector
+    : aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp
new file mode 100644
index 0000000..c522d08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector1_c<
+              T, T(C0)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector2_c<
+              T, T(C0), T(C1)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector3_c<
+              T, T(C0), T(C1), T(C2)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector4_c<
+              T, T(C0), T(C1), T(C2), T(C3)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector5_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector6_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector7_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector8_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector9_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector10_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector11_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector12_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector13_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector14_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector15_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector16_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector17_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector18_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector19_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector20_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_vector_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct vector_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value 
+        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value 
+        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value 
+        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value 
+        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value 
+        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value 
+        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value 
+        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value 
+        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value 
+        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c_impl
+{
+    typedef aux::vector_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::vector_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c
+    : aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/and.hpp
new file mode 100644
index 0000000..010ad1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply.hpp
new file mode 100644
index 0000000..e08eacc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp
new file mode 100644
index 0000000..2ffe709
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp
@@ -0,0 +1,456 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      int N, typename F
+    >
+struct apply_wrap_impl0;
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          0
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+/// since the defaults are "lost", we have to pass *something* even for nullary
+/// metafunction classes
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          1
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          2
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          3
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          4
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap_impl0<
+          5
+        , F
+       
+        >
+{
+    typedef typename F::template apply<
+         
+        na, na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F
+    >
+struct apply_wrap0
+    : apply_wrap_impl0<
+          ::boost::mpl::aux::arity< F,0 >::value
+        , F
+       
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1
+    >
+struct apply_wrap_impl1;
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          1
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          2
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          3
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          4
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap_impl1<
+          5
+        , F
+        , T1
+        >
+{
+    typedef typename F::template apply<
+          T1
+        , na, na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply_wrap1
+    : apply_wrap_impl1<
+          ::boost::mpl::aux::arity< F,1 >::value
+        , F
+        , T1
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          2
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          3
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          4
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap_impl2<
+          5
+        , F
+        , T1, T2
+        >
+{
+    typedef typename F::template apply<
+          T1, T2
+
+        , na, na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply_wrap2
+    : apply_wrap_impl2<
+          ::boost::mpl::aux::arity< F,2 >::value
+        , F
+        , T1, T2
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          3
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          4
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap_impl3<
+          5
+        , F
+        , T1, T2, T3
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3
+
+        , na, na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply_wrap3
+    : apply_wrap_impl3<
+          ::boost::mpl::aux::arity< F,3 >::value
+        , F
+        , T1, T2, T3
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          4
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap_impl4<
+          5
+        , F
+        , T1, T2, T3, T4
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4
+
+        , na
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply_wrap4
+    : apply_wrap_impl4<
+          ::boost::mpl::aux::arity< F,4 >::value
+        , F
+        , T1, T2, T3, T4
+        >::type
+{
+};
+
+template<
+      int N, typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap_impl5<
+          5
+        , F
+        , T1, T2, T3, T4, T5
+        >
+{
+    typedef typename F::template apply<
+          T1, T2, T3, T4, T5
+
+        > type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply_wrap5
+    : apply_wrap_impl5<
+          ::boost::mpl::aux::arity< F,5 >::value
+        , F
+        , T1, T2, T3, T4, T5
+        >::type
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp
new file mode 100644
index 0000000..b070232
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp
@@ -0,0 +1,440 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind.hpp
new file mode 100644
index 0000000..0e9513a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind.hpp
@@ -0,0 +1,561 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp
new file mode 100644
index 0000000..c4a5060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct bind;
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp
new file mode 100644
index 0000000..0bbf54e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp
new file mode 100644
index 0000000..55b31cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp
new file mode 100644
index 0000000..ec19391
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp
@@ -0,0 +1,147 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/divides.hpp
new file mode 100644
index 0000000..86f1682
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/divides.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp
new file mode 100644
index 0000000..62c9945
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater.hpp
new file mode 100644
index 0000000..14d8e08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp
new file mode 100644
index 0000000..2603f91
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp
new file mode 100644
index 0000000..00f31c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less.hpp
new file mode 100644
index 0000000..4fe3cd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp
new file mode 100644
index 0000000..ca2894f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/minus.hpp
new file mode 100644
index 0000000..71d4913
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/minus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp
new file mode 100644
index 0000000..224b349
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp
new file mode 100644
index 0000000..98b21b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/or.hpp
new file mode 100644
index 0000000..31e1aaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/plus.hpp
new file mode 100644
index 0000000..a9f6ee7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/plus.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/quote.hpp
new file mode 100644
index 0000000..d7d0420
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/quote.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+    : T
+{
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+    typedef T type;
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl<
+              F<U1>
+            , aux::has_type< F<U1> >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl<
+              F< U1,U2 >
+            , aux::has_type< F< U1,U2 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl<
+              F< U1,U2,U3 >
+            , aux::has_type< F< U1,U2,U3 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4 >
+            , aux::has_type< F< U1,U2,U3,U4 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4,U5 >
+            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+            >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp
new file mode 100644
index 0000000..c468684
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..658f92a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp
new file mode 100644
index 0000000..b5b181c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp
new file mode 100644
index 0000000..f7a342e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp
new file mode 100644
index 0000000..a23fc23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/times.hpp
new file mode 100644
index 0000000..cb97cc4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/times.hpp
@@ -0,0 +1,146 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp
new file mode 100644
index 0000000..2194ce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value,F, Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/and.hpp
new file mode 100644
index 0000000..555c800
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/and.hpp
@@ -0,0 +1,73 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct and_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : false_
+    {
+    };
+};
+
+template<> struct and_impl<true>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : and_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,true_ >
+    {
+    };
+};
+
+template<>
+struct and_impl<true>
+    ::result_< true_,true_,true_,true_ >
+        : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp
new file mode 100644
index 0000000..9838e79
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp
@@ -0,0 +1,268 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<0>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply0<
+              F
+            > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<1>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply1<
+              F, T1
+            > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<2>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply2<
+              F, T1, T2
+            > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<3>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply3<
+              F, T1, T2, T3
+            > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<4>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply4<
+              F, T1, T2, T3, T4
+            > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+namespace aux {
+
+template<>
+struct apply_chooser<5>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef apply5<
+              F, T1, T2, T3, T4, T5
+            > type;
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_apply_arg
+{
+    static bool const value  = true;
+};
+
+template<>
+struct is_apply_arg<na>
+{
+    static bool const value  = false;
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    >
+struct apply_count_args
+{
+    static int const value  = is_apply_arg<T1>::value + is_apply_arg<T2>::value + is_apply_arg<T3>::value + is_apply_arg<T4>::value + is_apply_arg<T5>::value;
+
+};
+
+}
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply
+    : aux::apply_chooser<
+          aux::apply_count_args< T1,T2,T3,T4,T5 >::value
+        >::template result_< F,T1,T2,T3,T4,T5 >::type
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp
new file mode 100644
index 0000000..7de6dad
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp
@@ -0,0 +1,50 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< BOOST_AUX_NTTP_DECL(int, arity_) > struct apply_chooser;
+}
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp
new file mode 100644
index 0000000..efa213d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp
@@ -0,0 +1,78 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+    : F::template apply<  >
+{
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+    : F::template apply<T1>
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+    : F::template apply< T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+    : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+    : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+    : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp
new file mode 100644
index 0000000..254e5b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp
@@ -0,0 +1,486 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag is_bind_helper(bind< F,T1,T2,T3,T4,T5 >*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+namespace aux {
+
+template<>
+struct bind_chooser<0>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind0<F> type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+namespace aux {
+
+template<>
+struct bind_chooser<1>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind1< F,T1 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+namespace aux {
+
+template<>
+struct bind_chooser<2>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind2< F,T1,T2 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+namespace aux {
+
+template<>
+struct bind_chooser<3>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind3< F,T1,T2,T3 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+namespace aux {
+
+template<>
+struct bind_chooser<4>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind4< F,T1,T2,T3,T4 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+namespace aux {
+
+template<>
+struct bind_chooser<5>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind5< F,T1,T2,T3,T4,T5 > type;
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_bind_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_bind_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    >
+struct bind_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_bind_arg<T1>::value + is_bind_arg<T2>::value 
+        + is_bind_arg<T3>::value + is_bind_arg<T4>::value 
+        + is_bind_arg<T5>::value
+        );
+
+};
+
+}
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : aux::bind_chooser<
+          aux::bind_count_args< T1,T2,T3,T4,T5 >::value
+        >::template result_< F,T1,T2,T3,T4,T5 >::type
+{
+};
+
+BOOST_MPL_AUX_ARITY_SPEC(
+      6
+    , bind
+    )
+
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(
+      6
+    , bind
+    )
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp
new file mode 100644
index 0000000..12062b4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp
@@ -0,0 +1,590 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool >
+struct resolve_arg_impl
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<>
+struct resolve_arg_impl<true>
+{
+    template<
+          typename T, typename U1, typename U2, typename U3
+        , typename U4, typename U5
+        >
+    struct result_
+    {
+        typedef typename apply_wrap5<
+              T
+            , U1, U2, U3, U4, U5
+            >::type type;
+    };
+};
+
+template< typename T > struct is_bind_template;
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,U1,U2,U3,U4,U5 >
+{
+};
+
+template< typename T >
+struct replace_unnamed_arg_impl
+{
+    template< typename Arg > struct result_
+    {
+        typedef Arg next;
+        typedef T type;
+    };
+};
+
+template<>
+struct replace_unnamed_arg_impl< arg< -1 > >
+{
+    template< typename Arg > struct result_
+    {
+        typedef typename next<Arg>::type next;
+        typedef Arg type;
+    };
+};
+
+template< typename T, typename Arg >
+struct replace_unnamed_arg
+    : replace_unnamed_arg_impl<T>::template result_<Arg>
+{
+};
+
+template< int arity_ > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag is_bind_helper(bind< F,T1,T2,T3,T4,T5 >*);
+
+template< int N >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_  = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value  = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+              sizeof(aux::is_bind_helper(static_cast<T*>(0)))
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F
+    >
+aux::yes_tag
+is_bind_helper(bind0<F>*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+namespace aux {
+
+template<>
+struct bind_chooser<0>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind0<F> type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1
+    >
+aux::yes_tag
+is_bind_helper(bind1< F,T1 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+namespace aux {
+
+template<>
+struct bind_chooser<1>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind1< F,T1 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2
+    >
+aux::yes_tag
+is_bind_helper(bind2< F,T1,T2 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+namespace aux {
+
+template<>
+struct bind_chooser<2>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind2< F,T1,T2 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+aux::yes_tag
+is_bind_helper(bind3< F,T1,T2,T3 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+namespace aux {
+
+template<>
+struct bind_chooser<3>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind3< F,T1,T2,T3 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+aux::yes_tag
+is_bind_helper(bind4< F,T1,T2,T3,T4 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+namespace aux {
+
+template<>
+struct bind_chooser<4>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind4< F,T1,T2,T3,T4 > type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+aux::yes_tag
+is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+namespace aux {
+
+template<>
+struct bind_chooser<5>
+{
+    template<
+          typename F, typename T1, typename T2, typename T3, typename T4
+        , typename T5
+        >
+    struct result_
+    {
+        typedef bind5< F,T1,T2,T3,T4,T5 > type;
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_bind_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_bind_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    >
+struct bind_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_bind_arg<T1>::value + is_bind_arg<T2>::value 
+        + is_bind_arg<T3>::value + is_bind_arg<T4>::value 
+        + is_bind_arg<T5>::value
+        );
+
+};
+
+}
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : aux::bind_chooser<
+          aux::bind_count_args< T1,T2,T3,T4,T5 >::value
+        >::template result_< F,T1,T2,T3,T4,T5 >::type
+{
+};
+
+BOOST_MPL_AUX_ARITY_SPEC(
+      6
+    , bind
+    )
+
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(
+      6
+    , bind
+    )
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp
new file mode 100644
index 0000000..c4a5060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct bind;
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp
new file mode 100644
index 0000000..020d6ba
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp
@@ -0,0 +1,134 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitand_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitand_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+
+    : if_<
+
+          is_na<N3>
+        , bitand_2< N1,N2 >
+        , bitand_<
+              bitand_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitand_2
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp
new file mode 100644
index 0000000..0474877
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp
@@ -0,0 +1,134 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+
+    : if_<
+
+          is_na<N3>
+        , bitor_2< N1,N2 >
+        , bitor_<
+              bitor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitor_2
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp
new file mode 100644
index 0000000..42a9758
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp
@@ -0,0 +1,134 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct bitxor_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct bitxor_2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+
+    : if_<
+
+          is_na<N3>
+        , bitxor_2< N1,N2 >
+        , bitxor_<
+              bitxor_2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct bitxor_2
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp
new file mode 100644
index 0000000..a0445d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct deque_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct deque_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct deque_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_deque_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_deque_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct deque_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_deque_arg<T1>::value + is_deque_arg<T2>::value 
+        + is_deque_arg<T3>::value + is_deque_arg<T4>::value 
+        + is_deque_arg<T5>::value + is_deque_arg<T6>::value 
+        + is_deque_arg<T7>::value + is_deque_arg<T8>::value 
+        + is_deque_arg<T9>::value + is_deque_arg<T10>::value 
+        + is_deque_arg<T11>::value + is_deque_arg<T12>::value 
+        + is_deque_arg<T13>::value + is_deque_arg<T14>::value 
+        + is_deque_arg<T15>::value + is_deque_arg<T16>::value 
+        + is_deque_arg<T17>::value + is_deque_arg<T18>::value 
+        + is_deque_arg<T19>::value + is_deque_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque_impl
+{
+    typedef aux::deque_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::deque_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque
+    : aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::deque_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp
new file mode 100644
index 0000000..00636dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct divides_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct divides2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+
+    : if_<
+
+          is_na<N3>
+        , divides2< N1,N2 >
+        , divides<
+              divides2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct divides2
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp
new file mode 100644
index 0000000..b14cdda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp
new file mode 100644
index 0000000..58066d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp
@@ -0,0 +1,245 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template< int N >
+struct fold_chunk;
+
+template<> struct fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< int N >
+struct fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , fold_null_step< Last,State >
+            , fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_step
+{
+    typedef fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+    : fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp
new file mode 100644
index 0000000..6fdf8ba
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp
new file mode 100644
index 0000000..f848eef
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct greater_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp
new file mode 100644
index 0000000..233a1ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp
@@ -0,0 +1,166 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C1, bool C2 >
+struct inherit2_impl
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1, T2
+    {
+        typedef Derived type_;
+    };
+};
+
+template<>
+struct inherit2_impl< false,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1
+    {
+        typedef T1 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,false >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T2
+    {
+        typedef T2 type_;
+    };
+};
+
+template<>
+struct inherit2_impl< true,true >
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+    {
+        typedef T1 type_;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : aux::inherit2_impl<
+          is_empty_base<T1>::value
+        , is_empty_base<T2>::value
+        >::template result_< inherit2< T1,T2 >,T1, T2 >
+{
+    typedef typename inherit2::type_ type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp
new file mode 100644
index 0000000..50ea754
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp
@@ -0,0 +1,245 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template< int N >
+struct iter_fold_chunk;
+
+template<> struct iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef state1 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef state2 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef state3 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State state0;
+        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef state4 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< int N >
+struct iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef iter_fold_impl<
+              4
+            , First
+            , Last
+            , State
+            , ForwardOp
+            > chunk_;
+
+        typedef iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , typename chunk_::iterator
+            , Last
+            , typename chunk_::state
+            , ForwardOp
+            > res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , iter_fold_null_step< Last,State >
+            , iter_fold_step< First,Last,State,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_step
+{
+    typedef iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        > chunk_;
+
+    typedef typename chunk_::state state;
+    typedef typename chunk_::iterator iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+    : iter_fold_chunk<N>
+        ::template result_< First,Last,State,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less.hpp
new file mode 100644
index 0000000..7fb35e1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp
new file mode 100644
index 0000000..206ecdc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct less_equal_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list.hpp
new file mode 100644
index 0000000..e5ea456
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef list0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename list20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_list_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct list_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_arg<T1>::value + is_list_arg<T2>::value 
+        + is_list_arg<T3>::value + is_list_arg<T4>::value 
+        + is_list_arg<T5>::value + is_list_arg<T6>::value 
+        + is_list_arg<T7>::value + is_list_arg<T8>::value 
+        + is_list_arg<T9>::value + is_list_arg<T10>::value 
+        + is_list_arg<T11>::value + is_list_arg<T12>::value 
+        + is_list_arg<T13>::value + is_list_arg<T14>::value 
+        + is_list_arg<T15>::value + is_list_arg<T16>::value 
+        + is_list_arg<T17>::value + is_list_arg<T18>::value 
+        + is_list_arg<T19>::value + is_list_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list_impl
+{
+    typedef aux::list_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::list_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list
+    : aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::list_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp
new file mode 100644
index 0000000..ab25482
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct list_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct list_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct list_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename list20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_list_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_list_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct list_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value 
+        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value 
+        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value 
+        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value 
+        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value 
+        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value 
+        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value 
+        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value 
+        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value 
+        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c_impl
+{
+    typedef aux::list_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::list_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c
+    : aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::list_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/map.hpp
new file mode 100644
index 0000000..970e0b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/map.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct map_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct map_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef map0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct map_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename map20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_map_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_map_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct map_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_map_arg<T1>::value + is_map_arg<T2>::value 
+        + is_map_arg<T3>::value + is_map_arg<T4>::value 
+        + is_map_arg<T5>::value + is_map_arg<T6>::value 
+        + is_map_arg<T7>::value + is_map_arg<T8>::value 
+        + is_map_arg<T9>::value + is_map_arg<T10>::value 
+        + is_map_arg<T11>::value + is_map_arg<T12>::value 
+        + is_map_arg<T13>::value + is_map_arg<T14>::value 
+        + is_map_arg<T15>::value + is_map_arg<T16>::value 
+        + is_map_arg<T17>::value + is_map_arg<T18>::value 
+        + is_map_arg<T19>::value + is_map_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map_impl
+{
+    typedef aux::map_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::map_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map
+    : aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::map_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp
new file mode 100644
index 0000000..7b49450
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct minus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct minus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+
+    : if_<
+
+          is_na<N3>
+        , minus2< N1,N2 >
+        , minus<
+              minus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct minus2
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp
new file mode 100644
index 0000000..8badbab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp
@@ -0,0 +1,101 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct modulus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp
new file mode 100644
index 0000000..d87d8cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct not_equal_to_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/or.hpp
new file mode 100644
index 0000000..3f7394e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/or.hpp
@@ -0,0 +1,73 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< bool C_ > struct or_impl
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : true_
+    {
+    };
+};
+
+template<> struct or_impl<false>
+{
+    template<
+          typename T1, typename T2, typename T3, typename T4
+        >
+    struct result_
+        : or_impl<
+              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+            >::template result_< T2,T3,T4,false_ >
+    {
+    };
+};
+
+template<>
+struct or_impl<false>
+    ::result_< false_,false_,false_,false_ >
+        : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        >::template result_< T2,T3,T4,T5 >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp
new file mode 100644
index 0000000..a55b24c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct plus_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct plus2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+
+    : if_<
+
+          is_na<N3>
+        , plus2< N1,N2 >
+        , plus<
+              plus2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct plus2
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp
new file mode 100644
index 0000000..b85880f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp
@@ -0,0 +1,116 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+template< bool > struct quote_impl
+{
+    template< typename T > struct result_
+        : T
+    {
+    };
+};
+
+template<> struct quote_impl<false>
+{
+    template< typename T > struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl< aux::has_type< F<U1> >::value >
+            ::template result_< F<U1> >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2 > >::value >
+            ::template result_< F< U1,U2 > >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3 > >::value >
+            ::template result_< F< U1,U2,U3 > >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3,U4 > >::value >
+            ::template result_< F< U1,U2,U3,U4 > >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl< aux::has_type< F< U1,U2,U3,U4,U5 > >::value >
+            ::template result_< F< U1,U2,U3,U4,U5 > >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp
new file mode 100644
index 0000000..7a07414
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template< long N >
+struct reverse_fold_chunk;
+
+template<> struct reverse_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_fold_null_step< Last,State >
+            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_step
+{
+    typedef reverse_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+    : reverse_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..39a4057
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp
@@ -0,0 +1,295 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template< long N >
+struct reverse_iter_fold_chunk;
+
+template<> struct reverse_iter_fold_chunk<0>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef fwd_state0 bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter0 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        
+
+        typedef fwd_state1 bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        typedef bkwd_state0 state;
+        typedef iter1 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<2>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        
+
+        typedef fwd_state2 bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter2 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<3>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        
+
+        typedef fwd_state3 bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter3 iterator;
+    };
+};
+
+template<> struct reverse_iter_fold_chunk<4>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef fwd_state4 bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef iter4 iterator;
+    };
+};
+
+template< long N >
+struct reverse_iter_fold_chunk
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+        typedef typename mpl::next<iter0>::type iter1;
+        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+        typedef typename mpl::next<iter1>::type iter2;
+        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+        typedef typename mpl::next<iter2>::type iter3;
+        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+        typedef typename mpl::next<iter3>::type iter4;
+        
+
+        typedef reverse_iter_fold_impl<
+              ( (N - 4) < 0 ? 0 : N - 4 )
+            , iter4
+            , Last
+            , fwd_state4
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+
+        typedef typename nested_chunk::state bkwd_state4;
+        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+        
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step;
+
+template<
+      typename Last
+    , typename State
+    >
+struct reverse_iter_fold_null_step
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<>
+struct reverse_iter_fold_chunk< -1 >
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same< First,Last >::type
+            , reverse_iter_fold_null_step< Last,State >
+            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_step
+{
+    typedef reverse_iter_fold_chunk< -1 >::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+    : reverse_iter_fold_chunk<N>
+        ::template result_< First,Last,State,BackwardOp,ForwardOp >
+{
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set.hpp
new file mode 100644
index 0000000..95aaa5c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef set0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename set20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_set_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct set_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_arg<T1>::value + is_set_arg<T2>::value 
+        + is_set_arg<T3>::value + is_set_arg<T4>::value 
+        + is_set_arg<T5>::value + is_set_arg<T6>::value 
+        + is_set_arg<T7>::value + is_set_arg<T8>::value 
+        + is_set_arg<T9>::value + is_set_arg<T10>::value 
+        + is_set_arg<T11>::value + is_set_arg<T12>::value 
+        + is_set_arg<T13>::value + is_set_arg<T14>::value 
+        + is_set_arg<T15>::value + is_set_arg<T16>::value 
+        + is_set_arg<T17>::value + is_set_arg<T18>::value 
+        + is_set_arg<T19>::value + is_set_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set_impl
+{
+    typedef aux::set_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::set_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set
+    : aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::set_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp
new file mode 100644
index 0000000..1ff34f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct set_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct set_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set1_c<
+              T, C0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set2_c<
+              T, C0, C1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set3_c<
+              T, C0, C1, C2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set4_c<
+              T, C0, C1, C2, C3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set5_c<
+              T, C0, C1, C2, C3, C4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set6_c<
+              T, C0, C1, C2, C3, C4, C5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set7_c<
+              T, C0, C1, C2, C3, C4, C5, C6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set8_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set9_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set10_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set11_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set12_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set13_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set14_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set15_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set16_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set17_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set18_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set19_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct set_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename set20_c<
+              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_set_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_set_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct set_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value 
+        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value 
+        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value 
+        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value 
+        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value 
+        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value 
+        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value 
+        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value 
+        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value 
+        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c_impl
+{
+    typedef aux::set_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::set_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c
+    : aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::set_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp
new file mode 100644
index 0000000..d14a5e4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_left_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp
new file mode 100644
index 0000000..08c4915
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct shift_right_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp
new file mode 100644
index 0000000..1164f0f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp
@@ -0,0 +1,40 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/times.hpp
new file mode 100644
index 0000000..fd773cc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/times.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< na,integral_c_tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template<> struct times_impl< integral_c_tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+/// forward declaration
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct times2;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+
+    : if_<
+
+          is_na<N3>
+        , times2< N1,N2 >
+        , times<
+              times2< N1,N2 >
+            , N3, N4, N5
+            >
+        >::type
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1
+    , typename N2
+    >
+struct times2
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp
new file mode 100644
index 0000000..26533dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp
@@ -0,0 +1,109 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl
+{
+    template< typename F, typename Args > struct apply;
+};
+
+template<> struct unpack_args_impl<0>
+{
+    template< typename F, typename Args > struct apply
+        : apply0<
+              F
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<1>
+{
+    template< typename F, typename Args > struct apply
+        : apply1<
+              F
+            , typename at_c< Args,0 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<2>
+{
+    template< typename F, typename Args > struct apply
+        : apply2<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<3>
+{
+    template< typename F, typename Args > struct apply
+        : apply3<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<4>
+{
+    template< typename F, typename Args > struct apply
+        : apply4<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            >
+    {
+    };
+};
+
+template<> struct unpack_args_impl<5>
+{
+    template< typename F, typename Args > struct apply
+        : apply5<
+              F
+            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+            , typename at_c< Args,4 >::type
+            >
+    {
+    };
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value >
+            ::template apply< F,Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp
new file mode 100644
index 0000000..a6c7b62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp
@@ -0,0 +1,556 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_chooser<0>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef vector0<
+             
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<1>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector1<
+              T0
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<2>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector2<
+              T0, T1
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<3>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector3<
+              T0, T1, T2
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<4>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector4<
+              T0, T1, T2, T3
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<5>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector5<
+              T0, T1, T2, T3, T4
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<6>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector6<
+              T0, T1, T2, T3, T4, T5
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<7>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector7<
+              T0, T1, T2, T3, T4, T5, T6
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<8>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector8<
+              T0, T1, T2, T3, T4, T5, T6, T7
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<9>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector9<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<10>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector10<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<11>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector11<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<12>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector12<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<13>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector13<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<14>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector14<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<15>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector15<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<16>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector16<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<17>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector17<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<18>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector18<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<19>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector19<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_chooser<20>
+{
+    template<
+          typename T0, typename T1, typename T2, typename T3, typename T4
+        , typename T5, typename T6, typename T7, typename T8, typename T9
+        , typename T10, typename T11, typename T12, typename T13, typename T14
+        , typename T15, typename T16, typename T17, typename T18, typename T19
+        >
+    struct result_
+    {
+        typedef typename vector20<
+              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< typename T >
+struct is_vector_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_arg<na>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename T6, typename T7, typename T8, typename T9, typename T10
+    , typename T11, typename T12, typename T13, typename T14, typename T15
+    , typename T16, typename T17, typename T18, typename T19, typename T20
+    >
+struct vector_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_arg<T1>::value + is_vector_arg<T2>::value 
+        + is_vector_arg<T3>::value + is_vector_arg<T4>::value 
+        + is_vector_arg<T5>::value + is_vector_arg<T6>::value 
+        + is_vector_arg<T7>::value + is_vector_arg<T8>::value 
+        + is_vector_arg<T9>::value + is_vector_arg<T10>::value 
+        + is_vector_arg<T11>::value + is_vector_arg<T12>::value 
+        + is_vector_arg<T13>::value + is_vector_arg<T14>::value 
+        + is_vector_arg<T15>::value + is_vector_arg<T16>::value 
+        + is_vector_arg<T17>::value + is_vector_arg<T18>::value 
+        + is_vector_arg<T19>::value + is_vector_arg<T20>::value
+        );
+
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector_impl
+{
+    typedef aux::vector_count_args<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        > arg_num_;
+
+    typedef typename aux::vector_chooser< arg_num_::value >
+        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector
+    : aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type
+{
+    typedef typename aux::vector_impl<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp
new file mode 100644
index 0000000..c522d08
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp
@@ -0,0 +1,534 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< int N >
+struct vector_c_chooser;
+
+}
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<0>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector0_c<
+              T
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<1>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector1_c<
+              T, T(C0)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<2>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector2_c<
+              T, T(C0), T(C1)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<3>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector3_c<
+              T, T(C0), T(C1), T(C2)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<4>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector4_c<
+              T, T(C0), T(C1), T(C2), T(C3)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<5>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector5_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<6>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector6_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<7>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector7_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<8>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector8_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<9>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector9_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<10>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector10_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<11>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector11_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<12>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector12_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<13>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector13_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<14>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector14_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<15>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector15_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<16>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector16_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<17>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector17_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<18>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector18_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<19>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector19_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template<>
+struct vector_c_chooser<20>
+{
+    template<
+          typename T, long C0, long C1, long C2, long C3, long C4, long C5
+        , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+        , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+        >
+    struct result_
+    {
+        typedef typename vector20_c<
+              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)
+            >::type type;
+
+    };
+};
+
+} // namespace aux
+
+namespace aux {
+
+template< long C >
+struct is_vector_c_arg
+{
+    BOOST_STATIC_CONSTANT(bool, value  = true);
+};
+
+template<>
+struct is_vector_c_arg<LONG_MAX>
+{
+    BOOST_STATIC_CONSTANT(bool, value  = false);
+};
+
+template<
+      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8
+    , long C9, long C10, long C11, long C12, long C13, long C14, long C15
+    , long C16, long C17, long C18, long C19, long C20
+    >
+struct vector_c_count_args
+{
+    BOOST_STATIC_CONSTANT(int, value =
+          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value 
+        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value 
+        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value 
+        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value 
+        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value 
+        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value 
+        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value 
+        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value 
+        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value 
+        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value
+        );
+
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c_impl
+{
+    typedef aux::vector_c_count_args<
+          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        > arg_num_;
+
+    typedef typename aux::vector_c_chooser< arg_num_::value >
+        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c
+    : aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type
+{
+    typedef typename aux::vector_c_impl<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19
+        >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/and.hpp
new file mode 100644
index 0000000..010ad1f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/and.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , and_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp
new file mode 100644
index 0000000..e08eacc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          1
+        , apply0
+        , (F )
+        )
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          2
+        , apply1
+        , (F, T1)
+        )
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , apply2
+        , (F, T1, T2)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , apply3
+        , (F, T1, T2, T3)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , apply4
+        , (F, T1, T2, T3, T4)
+        )
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , apply5
+        , (F, T1, T2, T3, T4, T5)
+        )
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp
new file mode 100644
index 0000000..34d51a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp
@@ -0,0 +1,84 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+    : F::template apply<  >
+{
+};
+
+template< typename F >
+struct apply_wrap0< F,true_ >
+    : F::apply
+{
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+    : F::template apply<T1>
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+    : F::template apply< T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+    : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+    : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+    : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp
new file mode 100644
index 0000000..095b84d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp
@@ -0,0 +1,369 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp
new file mode 100644
index 0000000..2891440
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp
@@ -0,0 +1,466 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp
new file mode 100644
index 0000000..c4a5060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct bind;
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp
new file mode 100644
index 0000000..282771b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp
@@ -0,0 +1,157 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitand_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitand_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp
new file mode 100644
index 0000000..bc9c198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp
@@ -0,0 +1,157 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp
new file mode 100644
index 0000000..76ce540
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp
@@ -0,0 +1,157 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct bitxor_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::bitxor_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp
new file mode 100644
index 0000000..9bc7fb1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp
@@ -0,0 +1,156 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , divides
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct divides_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::divides_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp
new file mode 100644
index 0000000..fa2dc4a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp
new file mode 100644
index 0000000..faa3f2b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp
new file mode 100644
index 0000000..392d142
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp
new file mode 100644
index 0000000..00f31c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          3
+        , inherit3
+        , ( T1, T2, T3)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , inherit4
+        , ( T1, T2, T3, T4)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , inherit5
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp
new file mode 100644
index 0000000..890a198
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less.hpp
new file mode 100644
index 0000000..6451680
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >
+             BOOST_MPL_AUX_VALUE_WKND(N1)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp
new file mode 100644
index 0000000..00ae0d3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp
new file mode 100644
index 0000000..bb67c59
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp
@@ -0,0 +1,156 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , minus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct minus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::minus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp
new file mode 100644
index 0000000..6fd0cab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp
@@ -0,0 +1,111 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct modulus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::modulus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp
new file mode 100644
index 0000000..7c940a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp
@@ -0,0 +1,98 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+    {
+        BOOST_STATIC_CONSTANT(bool, value =
+             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=
+             BOOST_MPL_AUX_VALUE_WKND(N2)::value )
+            );
+        typedef bool_<value> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/or.hpp
new file mode 100644
index 0000000..31e1aaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/or.hpp
@@ -0,0 +1,69 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , or_
+        , ( T1, T2, T3, T4, T5)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp
new file mode 100644
index 0000000..cecead7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp
@@ -0,0 +1,156 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , plus
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct plus_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::plus_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp
new file mode 100644
index 0000000..e7a7f00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp
new file mode 100644
index 0000000..c468684
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..658f92a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp
new file mode 100644
index 0000000..7ef4672
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp
@@ -0,0 +1,110 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_left_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n << s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_left_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp
new file mode 100644
index 0000000..91a98f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp
@@ -0,0 +1,110 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct shift_right_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n >> s));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+        : aux::shift_right_wknd<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp
new file mode 100644
index 0000000..1164f0f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp
@@ -0,0 +1,40 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_< -1 >
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/times.hpp
new file mode 100644
index 0000000..d019b57
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/times.hpp
@@ -0,0 +1,156 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          5
+        , times
+        , ( N1, N2, N3, N4, N5 )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T, T n1, T n2 >
+struct times_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));
+    typedef integral_c< T,value > type;
+};
+
+}
+
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+        : aux::times_wknd<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , N1::value
+            , N2::value
+            >::type
+
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp
new file mode 100644
index 0000000..2194ce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value,F, Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp
new file mode 100644
index 0000000..26de94c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_backward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_backward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_backward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_backward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_backward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename prior<iter0>::type iter1;
+        typedef typename prior<iter1>::type iter2;
+        typedef typename prior<iter2>::type iter3;
+        typedef typename prior<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_backward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_backward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_backward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp
new file mode 100644
index 0000000..b137cc7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/advance_forward.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef iter0 type;
+    };
+};
+
+template<>
+struct advance_forward<1>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef iter1 type;
+    };
+};
+
+template<>
+struct advance_forward<2>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef iter2 type;
+    };
+};
+
+template<>
+struct advance_forward<3>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef iter3 type;
+    };
+};
+
+template<>
+struct advance_forward<4>
+{
+    template< typename Iterator > struct apply
+    {
+        typedef Iterator iter0;
+        typedef typename next<iter0>::type iter1;
+        typedef typename next<iter1>::type iter2;
+        typedef typename next<iter2>::type iter3;
+        typedef typename next<iter3>::type iter4;
+        typedef iter4 type;
+    };
+};
+
+template< long N >
+struct advance_forward
+{
+    template< typename Iterator > struct apply
+    {
+        typedef typename apply_wrap1<
+              advance_forward<4>
+            , Iterator
+            >::type chunk_result_;
+
+        typedef typename apply_wrap1<
+              advance_forward<(
+                (N - 4) < 0
+                    ? 0
+                    : N - 4
+                    )>
+            , chunk_result_
+            >::type type;
+    };
+};
+
+}}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/and.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/and.hpp
new file mode 100644
index 0000000..163913f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/and.hpp
@@ -0,0 +1,64 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/and.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+    : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+    : and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , true_
+        >
+{
+};
+
+template<>
+struct and_impl<
+          true
+        , true_, true_, true_, true_
+        >
+    : true_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = true_, typename T4 = true_, typename T5 = true_
+    >
+struct and_
+
+    : aux::and_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , and_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply.hpp
new file mode 100644
index 0000000..89d9e4b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply.hpp
@@ -0,0 +1,139 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+    >
+struct apply0
+
+    : apply_wrap0<
+          typename lambda<F>::type
+       
+        >
+{
+};
+
+template<
+      typename F
+    >
+struct apply< F,na,na,na,na,na >
+    : apply0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply1
+
+    : apply_wrap1<
+          typename lambda<F>::type
+        , T1
+        >
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct apply< F,T1,na,na,na,na >
+    : apply1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2
+
+    : apply_wrap2<
+          typename lambda<F>::type
+        , T1, T2
+        >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply< F,T1,T2,na,na,na >
+    : apply2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3
+
+    : apply_wrap3<
+          typename lambda<F>::type
+        , T1, T2, T3
+        >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply< F,T1,T2,T3,na,na >
+    : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4
+
+    : apply_wrap4<
+          typename lambda<F>::type
+        , T1, T2, T3, T4
+        >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply< F,T1,T2,T3,T4,na >
+    : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5
+
+    : apply_wrap5<
+          typename lambda<F>::type
+        , T1, T2, T3, T4, T5
+        >
+{
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply
+    : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp
new file mode 100644
index 0000000..b2ed5d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct apply;
+
+template<
+      typename F
+    >
+struct apply0;
+
+template<
+      typename F, typename T1
+    >
+struct apply1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct apply2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct apply3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct apply4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct apply5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp
new file mode 100644
index 0000000..34d51a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp
@@ -0,0 +1,84 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/apply_wrap.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F
+
+    , typename has_apply_ = typename aux::has_apply<F>::type
+
+    >
+struct apply_wrap0
+
+    : F::template apply<  >
+{
+};
+
+template< typename F >
+struct apply_wrap0< F,true_ >
+    : F::apply
+{
+};
+
+template<
+      typename F, typename T1
+
+    >
+struct apply_wrap1
+
+    : F::template apply<T1>
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+
+    >
+struct apply_wrap2
+
+    : F::template apply< T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+
+    >
+struct apply_wrap3
+
+    : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+
+    >
+struct apply_wrap4
+
+    : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+
+    >
+struct apply_wrap5
+
+    : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/arg.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/arg.hpp
new file mode 100644
index 0000000..6f2f8a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/arg.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Peter Dimov 2001-2002
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/arg.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+template<> struct arg< -1 >
+{
+    BOOST_STATIC_CONSTANT(int, value  = -1);
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<1>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 1);
+    typedef arg<2> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U1 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<2>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 2);
+    typedef arg<3> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U2 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<3>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 3);
+    typedef arg<4> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U3 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<4>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 4);
+    typedef arg<5> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U4 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+template<> struct arg<5>
+{
+    BOOST_STATIC_CONSTANT(int, value  = 5);
+    typedef arg<6> next;
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)
+    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)
+
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+        typedef U5 type;
+        BOOST_MPL_AUX_ASSERT_NOT_NA(type);
+    };
+};
+
+BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp
new file mode 100644
index 0000000..b070232
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp
@@ -0,0 +1,440 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;
+        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;
+
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;
+        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;
+        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind.hpp
new file mode 100644
index 0000000..0e9513a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind.hpp
@@ -0,0 +1,561 @@
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename T, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+template<
+      int N, typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+    typedef bind< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename F
+    >
+struct bind0
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+     public:
+        typedef typename apply_wrap0<
+              f_
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind0<F>, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind0<F> f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(1, bind0)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)
+
+template<
+      typename F
+    >
+struct bind< F,na,na,na,na,na >
+    : bind0<F>
+{
+};
+
+template<
+      typename F, typename T1
+    >
+struct bind1
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+     public:
+        typedef typename apply_wrap1<
+              f_
+            , typename t1::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename U1, typename U2, typename U3
+    , typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind1< F,T1 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind1< F,T1 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(2, bind1)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)
+
+template<
+      typename F, typename T1
+    >
+struct bind< F,T1,na,na,na,na >
+    : bind1< F,T1 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+     public:
+        typedef typename apply_wrap2<
+              f_
+            , typename t1::type, typename t2::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename U1, typename U2
+    , typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind2< F,T1,T2 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(3, bind2)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind< F,T1,T2,na,na,na >
+    : bind2< F,T1,T2 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+     public:
+        typedef typename apply_wrap3<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename U1
+    , typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind3< F,T1,T2,T3 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(4, bind3)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind< F,T1,T2,T3,na,na >
+    : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+     public:
+        typedef typename apply_wrap4<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename U1, typename U2, typename U3, typename U4, typename U5
+    >
+struct resolve_bind_arg<
+      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind4< F,T1,T2,T3,T4 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(5, bind4)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind< F,T1,T2,T3,T4,na >
+    : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+        ///
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef aux::replace_unnamed_arg< T4,n4 > r4;
+        typedef typename r4::type a4;
+        typedef typename r4::next n5;
+        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+        ///
+        typedef aux::replace_unnamed_arg< T5,n5 > r5;
+        typedef typename r5::type a5;
+        typedef typename r5::next n6;
+        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+        ///
+     public:
+        typedef typename apply_wrap5<
+              f_
+            , typename t1::type, typename t2::type, typename t3::type
+            , typename t4::type, typename t5::type
+            >::type type;
+
+    };
+};
+
+namespace aux {
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename U1, typename U2, typename U3, typename U4
+    , typename U5
+    >
+struct resolve_bind_arg<
+      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+    >
+{
+    typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(6, bind5)
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)
+
+/// primary template (not a specialization!)
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind
+    : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+/// if_/eval_if specializations
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< if_,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename if_<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+template<
+      template< typename T1, typename T2, typename T3 > class F, typename Tag
+    >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+      typename Tag, typename T1, typename T2, typename T3
+    >
+struct bind3<
+      quote3< eval_if,Tag >
+    , T1, T2, T3
+    >
+{
+    template<
+          typename U1 = na, typename U2 = na, typename U3 = na
+        , typename U4 = na, typename U5 = na
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+        typedef aux::replace_unnamed_arg< T1,n1 > r1;
+        typedef typename r1::type a1;
+        typedef typename r1::next n2;
+        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+        ///
+        typedef aux::replace_unnamed_arg< T2,n2 > r2;
+        typedef typename r2::type a2;
+        typedef typename r2::next n3;
+        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+        ///
+        typedef aux::replace_unnamed_arg< T3,n3 > r3;
+        typedef typename r3::type a3;
+        typedef typename r3::next n4;
+        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+        ///
+        typedef typename eval_if<
+              typename t1::type
+            , t2, t3
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp
new file mode 100644
index 0000000..c4a5060
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bind_fwd.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename F, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na
+    >
+struct bind;
+
+template<
+      typename F
+    >
+struct bind0;
+
+template<
+      typename F, typename T1
+    >
+struct bind1;
+
+template<
+      typename F, typename T1, typename T2
+    >
+struct bind2;
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    >
+struct bind3;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    >
+struct bind4;
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct bind5;
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitand.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitand.hpp
new file mode 100644
index 0000000..ee40fb3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitand.hpp
@@ -0,0 +1,142 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitand.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitand_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitand_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitand_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitand_
+    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitand_< N1,N2,N3,N4,na >
+
+    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitand_< N1,N2,N3,na,na >
+
+    : bitand_< bitand_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitand_< N1,N2,na,na,na >
+    : bitand_impl<
+          typename bitand_tag<N1>::type
+        , typename bitand_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitand_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitor.hpp
new file mode 100644
index 0000000..1e28d3b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitor.hpp
@@ -0,0 +1,142 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitor_
+    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitor_< N1,N2,N3,N4,na >
+
+    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitor_< N1,N2,N3,na,na >
+
+    : bitor_< bitor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitor_< N1,N2,na,na,na >
+    : bitor_impl<
+          typename bitor_tag<N1>::type
+        , typename bitor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitxor.hpp
new file mode 100644
index 0000000..2ba879d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/bitxor.hpp
@@ -0,0 +1,142 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/bitxor.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct bitxor_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct bitxor_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct bitxor_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct bitxor_
+    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct bitxor_< N1,N2,N3,N4,na >
+
+    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct bitxor_< N1,N2,N3,na,na >
+
+    : bitxor_< bitxor_< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct bitxor_< N1,N2,na,na,na >
+    : bitxor_impl<
+          typename bitxor_tag<N1>::type
+        , typename bitxor_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , bitxor_
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/deque.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/deque.hpp
new file mode 100644
index 0000000..de67398
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/deque.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/deque.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct deque;
+
+template<
+     
+    >
+struct deque<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct deque<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct deque<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct deque<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct deque<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct deque<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct deque<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct deque
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/divides.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/divides.hpp
new file mode 100644
index 0000000..f365d62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/divides.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/divides.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct divides_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct divides_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct divides_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct divides_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct divides
+    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct divides< N1,N2,N3,N4,na >
+
+    : divides< divides< divides< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct divides< N1,N2,N3,na,na >
+
+    : divides< divides< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct divides< N1,N2,na,na,na >
+    : divides_impl<
+          typename divides_tag<N1>::type
+        , typename divides_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , divides
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, divides)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct divides_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/equal_to.hpp
new file mode 100644
index 0000000..bbc6bf0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/equal_to.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct equal_to
+
+    : equal_to_impl<
+          typename equal_to_tag<N1>::type
+        , typename equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp
new file mode 100644
index 0000000..9e7a293
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl
+{
+    typedef fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+    : fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp
new file mode 100644
index 0000000..bf81873
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp
@@ -0,0 +1,554 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+   
+    >
+struct lambda
+{
+    typedef false_ is_le;
+    typedef T result_;
+    typedef T type;
+};
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+    typedef true_ is_le;
+    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
+    typedef mpl::protect<result_> type;
+};
+
+template<
+      typename F
+    , typename Tag
+    >
+struct lambda<
+          bind0<F>
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind0<
+          F
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1
+{
+    typedef F<
+          typename L1::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1 > class F
+    , typename L1
+    >
+struct le_result1< true_,Tag,F,L1 >
+{
+    typedef bind1<
+          quote1< F,Tag >
+        , typename L1::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1 > class F
+    , typename T1
+    , typename Tag
+    >
+struct lambda<
+          F<T1>
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef typename l1::is_le is_le1;
+    typedef typename aux::lambda_or<
+          is_le1::value
+        >::type is_le;
+
+    typedef aux::le_result1<
+          is_le, Tag, F, l1
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1
+    , typename Tag
+    >
+struct lambda<
+          bind1< F,T1 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind1<
+          F
+        , T1
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2
+{
+    typedef F<
+          typename L1::type, typename L2::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2 > class F
+    , typename L1, typename L2
+    >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+    typedef bind2<
+          quote2< F,Tag >
+        , typename L1::result_, typename L2::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value
+        >::type is_le;
+
+    typedef aux::le_result2<
+          is_le, Tag, F, l1, l2
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2
+    , typename Tag
+    >
+struct lambda<
+          bind2< F,T1,T2 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind2<
+          F
+        , T1, T2
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3 > class F
+    , typename L1, typename L2, typename L3
+    >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+    typedef bind3<
+          quote3< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value
+        >::type is_le;
+
+    typedef aux::le_result3<
+          is_le, Tag, F, l1, l2, l3
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3
+    , typename Tag
+    >
+struct lambda<
+          bind3< F,T1,T2,T3 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind3<
+          F
+        , T1, T2, T3
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename L1, typename L2, typename L3, typename L4
+    >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+    typedef bind4<
+          quote4< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        >::type is_le;
+
+    typedef aux::le_result4<
+          is_le, Tag, F, l1, l2, l3, l4
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename Tag
+    >
+struct lambda<
+          bind4< F,T1,T2,T3,T4 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind4<
+          F
+        , T1, T2, T3, T4
+        > result_;
+
+    typedef result_ type;
+};
+
+namespace aux {
+
+template<
+      typename IsLE, typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5
+{
+    typedef F<
+          typename L1::type, typename L2::type, typename L3::type
+        , typename L4::type, typename L5::type
+        > result_;
+
+    typedef result_ type;
+};
+
+template<
+      typename Tag
+    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+    , typename L1, typename L2, typename L3, typename L4, typename L5
+    >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+    typedef bind5<
+          quote5< F,Tag >
+        , typename L1::result_, typename L2::result_, typename L3::result_
+        , typename L4::result_, typename L5::result_
+        > result_;
+
+    typedef mpl::protect<result_> type;
+};
+
+} // namespace aux
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename T1, typename T2, typename T3, typename T4, typename T5
+    , typename Tag
+    >
+struct lambda<
+          F< T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef lambda< T1,Tag > l1;
+    typedef lambda< T2,Tag > l2;
+    typedef lambda< T3,Tag > l3;
+    typedef lambda< T4,Tag > l4;
+    typedef lambda< T5,Tag > l5;
+    
+    typedef typename l1::is_le is_le1;
+    typedef typename l2::is_le is_le2;
+    typedef typename l3::is_le is_le3;
+    typedef typename l4::is_le is_le4;
+    typedef typename l5::is_le is_le5;
+    
+
+    typedef typename aux::lambda_or<
+          is_le1::value, is_le2::value, is_le3::value, is_le4::value
+        , is_le5::value
+        >::type is_le;
+
+    typedef aux::le_result5<
+          is_le, Tag, F, l1, l2, l3, l4, l5
+        > le_result_;
+
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind5< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind5<
+          F
+        , T1, T2, T3, T4, T5
+        > result_;
+
+    typedef result_ type;
+};
+
+/// special case for 'protect'
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+    typedef false_ is_le;
+    typedef mpl::protect<T> result_;
+    typedef result_ type;
+};
+
+/// specializations for the main 'bind' form
+
+template<
+      typename F, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    , typename Tag
+    >
+struct lambda<
+          bind< F,T1,T2,T3,T4,T5 >
+        , Tag
+       
+        >
+{
+    typedef false_ is_le;
+    typedef bind< F,T1,T2,T3,T4,T5 > result_;
+    typedef result_ type;
+};
+
+/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
+
+template<
+      typename F, typename Tag1, typename Tag2
+    >
+struct lambda<
+          lambda< F,Tag1 >
+        , Tag2
+        >
+{
+    typedef lambda< F,Tag2 > l1;
+    typedef lambda< Tag1,Tag2 > l2;
+    typedef typename l1::is_le is_le;
+    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+    typedef typename le_result_::result_ result_;
+    typedef typename le_result_::type type;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, lambda)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater.hpp
new file mode 100644
index 0000000..38c8bb3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater
+
+    : greater_impl<
+          typename greater_tag<N1>::type
+        , typename greater_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp
new file mode 100644
index 0000000..2aa8370
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/greater_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct greater_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct greater_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct greater_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct greater_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct greater_equal
+
+    : greater_equal_impl<
+          typename greater_equal_tag<N1>::type
+        , typename greater_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct greater_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/inherit.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/inherit.hpp
new file mode 100644
index 0000000..8b34e71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/inherit.hpp
@@ -0,0 +1,125 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/inherit.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+};
+
+template< typename T1 >
+struct inherit2< T1,empty_base >
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))
+};
+
+template< typename T2 >
+struct inherit2< empty_base,T2 >
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))
+};
+
+template<>
+struct inherit2< empty_base,empty_base >
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na
+    >
+struct inherit3
+    : inherit2<
+          typename inherit2<
+              T1, T2
+            >::type
+        , T3
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, inherit3)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    >
+struct inherit4
+    : inherit2<
+          typename inherit3<
+              T1, T2, T3
+            >::type
+        , T4
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(4, inherit4)
+
+template<
+      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na
+    , typename T5 = na
+    >
+struct inherit5
+    : inherit2<
+          typename inherit4<
+              T1, T2, T3, T4
+            >::type
+        , T5
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(5, inherit5)
+
+/// primary template
+
+template<
+      typename T1 = empty_base, typename T2 = empty_base
+    , typename T3 = empty_base, typename T4 = empty_base
+    , typename T5 = empty_base
+    >
+struct inherit
+    : inherit5< T1,T2,T3,T4,T5 >
+{
+};
+
+template<>
+struct inherit< na,na,na,na,na >
+{
+    template<
+
+          typename T1 = empty_base, typename T2 = empty_base
+        , typename T3 = empty_base, typename T4 = empty_base
+        , typename T5 = empty_base
+
+        >
+    struct apply
+        : inherit< T1,T2,T3,T4,T5 >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp
new file mode 100644
index 0000000..6951795
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp
@@ -0,0 +1,133 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_if_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Iterator, typename State >
+struct iter_fold_if_null_step
+{
+    typedef State state;
+    typedef Iterator iterator;
+};
+
+template< bool >
+struct iter_fold_if_step_impl
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef typename apply2< StateOp,State,Iterator >::type state;
+        typedef typename IteratorOp::type iterator;
+    };
+};
+
+template<>
+struct iter_fold_if_step_impl<false>
+{
+    template<
+          typename Iterator
+        , typename State
+        , typename StateOp
+        , typename IteratorOp
+        >
+    struct result_
+    {
+        typedef State state;
+        typedef Iterator iterator;
+    };
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_forward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename BackwardOp
+    , typename Predicate
+    >
+struct iter_fold_if_backward_step
+{
+    typedef typename apply2< Predicate,State,Iterator >::type not_last;
+    typedef typename iter_fold_if_step_impl<
+          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
+        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;
+
+    typedef typename impl_::state state;
+    typedef typename impl_::iterator iterator;
+};
+
+template<
+      typename Iterator
+    , typename State
+    , typename ForwardOp
+    , typename ForwardPredicate
+    , typename BackwardOp
+    , typename BackwardPredicate
+    >
+struct iter_fold_if_impl
+{
+ private:
+    typedef iter_fold_if_null_step< Iterator,State > forward_step0;
+    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;
+    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;
+    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;
+    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;
+    
+
+    typedef typename if_<
+          typename forward_step4::not_last
+        , iter_fold_if_impl<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            , ForwardOp
+            , ForwardPredicate
+            , BackwardOp
+            , BackwardPredicate
+            >
+        , iter_fold_if_null_step<
+              typename forward_step4::iterator
+            , typename forward_step4::state
+            >
+        >::type backward_step4;
+
+    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;
+    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;
+    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;
+    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;
+    
+
+ public:
+    typedef typename backward_step0::state state;
+    typedef typename backward_step4::iterator iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp
new file mode 100644
index 0000000..805790e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp
@@ -0,0 +1,180 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef state1 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef state2 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef state3 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+    typedef First iter0;
+    typedef State state0;
+    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef state4 state;
+    typedef iter4 iterator;
+};
+
+template<
+      int N
+    , typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl
+{
+    typedef iter_fold_impl<
+          4
+        , First
+        , Last
+        , State
+        , ForwardOp
+        > chunk_;
+
+    typedef iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , typename chunk_::iterator
+        , Last
+        , typename chunk_::state
+        , ForwardOp
+        > res_;
+
+    typedef typename res_::state state;
+    typedef typename res_::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+    : iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , ForwardOp
+        >
+{
+};
+
+template<
+      typename Last
+    , typename State
+    , typename ForwardOp
+    >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp
new file mode 100644
index 0000000..f8f109c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp
@@ -0,0 +1,228 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/lambda_no_ctps.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+    , bool C5 = false
+    >
+struct lambda_or
+    : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+    : false_
+{
+};
+
+template< typename Arity > struct lambda_impl
+{
+    template< typename T, typename Tag, typename Protect > struct result_
+    {
+        typedef T type;
+        typedef is_placeholder<T> is_le;
+    };
+};
+
+template<> struct lambda_impl< int_<1> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef typename l1::is_le is_le1;
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value
+            > is_le;
+
+        typedef bind1<
+              typename F::rebind
+            , typename l1::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<2> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value
+            > is_le;
+
+        typedef bind2<
+              typename F::rebind
+            , typename l1::type, typename l2::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<3> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value
+            > is_le;
+
+        typedef bind3<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<4> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value
+            > is_le;
+
+        typedef bind4<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+template<> struct lambda_impl< int_<5> >
+{
+    template< typename F, typename Tag, typename Protect > struct result_
+    {
+        typedef lambda< typename F::arg1, Tag, false_ > l1;
+        typedef lambda< typename F::arg2, Tag, false_ > l2;
+        typedef lambda< typename F::arg3, Tag, false_ > l3;
+        typedef lambda< typename F::arg4, Tag, false_ > l4;
+        typedef lambda< typename F::arg5, Tag, false_ > l5;
+        
+        typedef typename l1::is_le is_le1;
+        typedef typename l2::is_le is_le2;
+        typedef typename l3::is_le is_le3;
+        typedef typename l4::is_le is_le4;
+        typedef typename l5::is_le is_le5;
+        
+
+        typedef aux::lambda_or<
+              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value
+            > is_le;
+
+        typedef bind5<
+              typename F::rebind
+            , typename l1::type, typename l2::type, typename l3::type
+            , typename l4::type, typename l5::type
+            > bind_;
+
+        typedef typename if_<
+              is_le
+            , if_< Protect, mpl::protect<bind_>, bind_ >
+            , identity<F>
+            >::type type_;
+
+        typedef typename type_::type type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename T
+    , typename Tag
+    , typename Protect
+    >
+struct lambda
+{
+    /// Metafunction forwarding confuses MSVC 6.x
+    typedef typename aux::template_arity<T>::type arity_;
+    typedef typename aux::lambda_impl<arity_>
+        ::template result_< T,Tag,Protect > l_;
+
+    typedef typename l_::type type;
+    typedef typename l_::is_le is_le;
+};
+
+BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
+
+template<
+      typename T
+    >
+struct is_lambda_expression
+    : lambda<T>::is_le
+{
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less.hpp
new file mode 100644
index 0000000..928d0e3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less
+
+    : less_impl<
+          typename less_tag<N1>::type
+        , typename less_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less_equal.hpp
new file mode 100644
index 0000000..364cd96
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/less_equal.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/less_equal.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct less_equal_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct less_equal_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct less_equal_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct less_equal_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct less_equal
+
+    : less_equal_impl<
+          typename less_equal_tag<N1>::type
+        , typename less_equal_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_equal_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list.hpp
new file mode 100644
index 0000000..4e8ad53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct list;
+
+template<
+     
+    >
+struct list<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list0<  >
+{
+    typedef list0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct list<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list1<T0>
+{
+    typedef typename list1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list2< T0,T1 >
+{
+    typedef typename list2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list3< T0,T1,T2 >
+{
+    typedef typename list3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list4< T0,T1,T2,T3 >
+{
+    typedef typename list4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list5< T0,T1,T2,T3,T4 >
+{
+    typedef typename list5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : list15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : list16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : list17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : list18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : list19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list
+    : list20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list_c.hpp
new file mode 100644
index 0000000..0b48a7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/list_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct list_c;
+
+template<
+      typename T
+    >
+struct list_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list0_c<T>
+{
+    typedef typename list0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct list_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list1_c< T,C0 >
+{
+    typedef typename list1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct list_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list2_c< T,C0,C1 >
+{
+    typedef typename list2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct list_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list3_c< T,C0,C1,C2 >
+{
+    typedef typename list3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct list_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : list17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : list18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct list_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : list19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct list_c
+    : list20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/map.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/map.hpp
new file mode 100644
index 0000000..837e013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/map.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct map;
+
+template<
+     
+    >
+struct map<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map0<  >
+{
+    typedef map0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct map<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map1<T0>
+{
+    typedef typename map1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct map<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map2< T0,T1 >
+{
+    typedef typename map2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct map<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map3< T0,T1,T2 >
+{
+    typedef typename map3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct map<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map4< T0,T1,T2,T3 >
+{
+    typedef typename map4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct map<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map5< T0,T1,T2,T3,T4 >
+{
+    typedef typename map5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : map15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : map16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : map17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : map18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct map<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : map19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct map
+    : map20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/minus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/minus.hpp
new file mode 100644
index 0000000..0b8b5ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/minus.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/minus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct minus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct minus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct minus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct minus
+    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct minus< N1,N2,N3,N4,na >
+
+    : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct minus< N1,N2,N3,na,na >
+
+    : minus< minus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct minus< N1,N2,na,na,na >
+    : minus_impl<
+          typename minus_tag<N1>::type
+        , typename minus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , minus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, minus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/modulus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/modulus.hpp
new file mode 100644
index 0000000..6a64e49
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/modulus.hpp
@@ -0,0 +1,99 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/modulus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct modulus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct modulus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct modulus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct modulus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct modulus
+
+    : modulus_impl<
+          typename modulus_tag<N1>::type
+        , typename modulus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct modulus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp
new file mode 100644
index 0000000..c08d7f0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp
@@ -0,0 +1,92 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/not_equal_to.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct not_equal_to_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct not_equal_to_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct not_equal_to_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct not_equal_to_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct not_equal_to
+
+    : not_equal_to_impl<
+          typename not_equal_to_tag<N1>::type
+        , typename not_equal_to_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct not_equal_to_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/or.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/or.hpp
new file mode 100644
index 0000000..986b2e0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/or.hpp
@@ -0,0 +1,64 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/or.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct or_impl
+    : true_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct or_impl< false,T1,T2,T3,T4 >
+    : or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4
+        , false_
+        >
+{
+};
+
+template<>
+struct or_impl<
+          false
+        , false_, false_, false_, false_
+        >
+    : false_
+{
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename T3 = false_, typename T4 = false_, typename T5 = false_
+    >
+struct or_
+
+    : aux::or_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
+        , T2, T3, T4, T5
+        >
+
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(
+      2
+    , 5
+    , or_
+    )
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/placeholders.hpp
new file mode 100644
index 0000000..ff97364
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/placeholders.hpp
@@ -0,0 +1,105 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/placeholders.hpp" header
+// -- DO NOT modify by hand!
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg< -1 > _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<1> _1;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<2> _2;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<3> _3;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<4> _4;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<5> _5;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;
+}
+
+}}
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<6> _6;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;
+}
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/plus.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/plus.hpp
new file mode 100644
index 0000000..ed2e432
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/plus.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/plus.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct plus_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct plus_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct plus_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct plus
+    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct plus< N1,N2,N3,N4,na >
+
+    : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct plus< N1,N2,N3,na,na >
+
+    : plus< plus< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct plus< N1,N2,na,na,na >
+    : plus_impl<
+          typename plus_tag<N1>::type
+        , typename plus_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , plus
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, plus)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/quote.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/quote.hpp
new file mode 100644
index 0000000..d7d0420
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/quote.hpp
@@ -0,0 +1,123 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/quote.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+    : T
+{
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+    typedef T type;
+};
+
+template<
+      template< typename P1 > class F
+    , typename Tag = void_
+    >
+struct quote1
+{
+    template< typename U1 > struct apply
+
+        : quote_impl<
+              F<U1>
+            , aux::has_type< F<U1> >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2 > class F
+    , typename Tag = void_
+    >
+struct quote2
+{
+    template< typename U1, typename U2 > struct apply
+
+        : quote_impl<
+              F< U1,U2 >
+            , aux::has_type< F< U1,U2 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3 > class F
+    , typename Tag = void_
+    >
+struct quote3
+{
+    template< typename U1, typename U2, typename U3 > struct apply
+
+        : quote_impl<
+              F< U1,U2,U3 >
+            , aux::has_type< F< U1,U2,U3 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template< typename P1, typename P2, typename P3, typename P4 > class F
+    , typename Tag = void_
+    >
+struct quote4
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4 >
+            , aux::has_type< F< U1,U2,U3,U4 > >::value
+            >
+
+    {
+    };
+};
+
+template<
+      template<
+          typename P1, typename P2, typename P3, typename P4
+        , typename P5
+        >
+      class F
+    , typename Tag = void_
+    >
+struct quote5
+{
+    template<
+          typename U1, typename U2, typename U3, typename U4
+        , typename U5
+        >
+    struct apply
+
+        : quote_impl<
+              F< U1,U2,U3,U4,U5 >
+            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+            >
+
+    {
+    };
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp
new file mode 100644
index 0000000..c468684
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , typename deref<First>::type
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..658f92a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp
@@ -0,0 +1,231 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl;
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef fwd_state0 bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter0 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    
+
+    typedef fwd_state1 bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    typedef bkwd_state0 state;
+    typedef iter1 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    
+
+    typedef fwd_state2 bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter2 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    
+
+    typedef fwd_state3 bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter3 iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef fwd_state4 bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef iter4 iterator;
+};
+
+template<
+      long N
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;
+    typedef typename mpl::next<iter0>::type iter1;
+    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;
+    typedef typename mpl::next<iter1>::type iter2;
+    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;
+    typedef typename mpl::next<iter2>::type iter3;
+    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;
+    typedef typename mpl::next<iter3>::type iter4;
+    
+
+    typedef reverse_iter_fold_impl<
+          ( (N - 4) < 0 ? 0 : N - 4 )
+        , iter4
+        , Last
+        , fwd_state4
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+
+    typedef typename nested_chunk::state bkwd_state4;
+    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;
+    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;
+    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;
+    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;
+    
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+    typedef reverse_iter_fold_impl<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2< ForwardOp,State,First >::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , First
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+}}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set.hpp
new file mode 100644
index 0000000..5721922
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct set;
+
+template<
+     
+    >
+struct set<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set0<  >
+{
+    typedef set0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct set<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set1<T0>
+{
+    typedef typename set1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set2< T0,T1 >
+{
+    typedef typename set2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set3< T0,T1,T2 >
+{
+    typedef typename set3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set4< T0,T1,T2,T3 >
+{
+    typedef typename set4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set5< T0,T1,T2,T3,T4 >
+{
+    typedef typename set5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : set15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : set16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : set17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : set18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : set19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set
+    : set20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set_c.hpp
new file mode 100644
index 0000000..cbeb932
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/set_c.hpp
@@ -0,0 +1,328 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct set_c;
+
+template<
+      typename T
+    >
+struct set_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set0_c<T>
+{
+    typedef typename set0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct set_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set1_c< T,C0 >
+{
+    typedef typename set1_c< T,C0 >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct set_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set2_c< T,C0,C1 >
+{
+    typedef typename set2_c< T,C0,C1 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct set_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set3_c< T,C0,C1,C2 >
+{
+    typedef typename set3_c< T,C0,C1,C2 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct set_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set4_c< T,C0,C1,C2,C3 >
+{
+    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set5_c< T,C0,C1,C2,C3,C4 >
+{
+    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set6_c< T,C0,C1,C2,C3,C4,C5 >
+{
+    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+{
+    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+{
+    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+{
+    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+{
+    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+{
+    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+{
+    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+{
+    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set14_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        >
+{
+    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set15_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        >
+{
+    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set16_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15
+        >
+{
+    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : set17_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16
+        >
+{
+    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : set18_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17
+        >
+{
+    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct set_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : set19_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18
+        >
+{
+    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct set_c
+    : set20_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, C19
+        >
+{
+    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_left.hpp
new file mode 100644
index 0000000..cf9c837
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_left.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_left.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_left_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_left_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_left_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_left_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_left
+
+    : shift_left_impl<
+          typename shift_left_tag<N1>::type
+        , typename shift_left_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_left_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  << BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_right.hpp
new file mode 100644
index 0000000..477229f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/shift_right.hpp
@@ -0,0 +1,97 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/shift_right.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct shift_right_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct shift_right_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct shift_right_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct shift_right_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct shift_right
+
+    : shift_right_impl<
+          typename shift_right_tag<N1>::type
+        , typename shift_right_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct shift_right_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N, typename S > struct apply
+
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/template_arity.hpp
new file mode 100644
index 0000000..a23fc23
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/template_arity.hpp
@@ -0,0 +1,11 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/aux_/template_arity.hpp" header
+// -- DO NOT modify by hand!
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/times.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/times.hpp
new file mode 100644
index 0000000..ca88d40
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/times.hpp
@@ -0,0 +1,141 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/times.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename Tag1
+    , typename Tag2
+    >
+struct times_impl
+    : if_c<
+          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)
+              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)
+            )
+
+        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >
+        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >
+        >::type
+{
+};
+
+/// for Digital Mars C++/compilers with no CTPS/TTP support
+template<> struct times_impl< na,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< na,Tag >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename Tag > struct times_impl< Tag,na >
+{
+    template< typename U1, typename U2 > struct apply
+    {
+        typedef apply type;
+        BOOST_STATIC_CONSTANT(int, value  = 0);
+    };
+};
+
+template< typename T > struct times_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    , typename N3 = na, typename N4 = na, typename N5 = na
+    >
+struct times
+    : times< times< times< times< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+      typename N1, typename N2, typename N3, typename N4
+    >
+struct times< N1,N2,N3,N4,na >
+
+    : times< times< times< N1,N2 >, N3>, N4>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, N4, na )
+        )
+};
+
+template<
+      typename N1, typename N2, typename N3
+    >
+struct times< N1,N2,N3,na,na >
+
+    : times< times< N1,N2 >, N3>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, N3, na, na )
+        )
+};
+
+template<
+      typename N1, typename N2
+    >
+struct times< N1,N2,na,na,na >
+    : times_impl<
+          typename times_tag<N1>::type
+        , typename times_tag<N2>::type
+        >::template apply< N1,N2 >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(
+          5
+        , times
+        , ( N1, N2, na, na, na )
+        )
+
+};
+
+BOOST_MPL_AUX_NA_SPEC2(2, 5, times)
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct times_impl< integral_c_tag,integral_c_tag >
+{
+    template< typename N1, typename N2 > struct apply
+
+        : integral_c<
+              typename aux::largest_int<
+                  typename N1::value_type
+                , typename N2::value_type
+                >::type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value
+                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value
+                )
+            >
+    {
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp
new file mode 100644
index 0000000..2194ce9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp
@@ -0,0 +1,94 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/unpack_args.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+
+template< typename F, typename Args >
+struct unpack_args_impl< 0,F,Args >
+    : apply0<
+          F
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 1,F,Args >
+    : apply1<
+          F
+        , typename at_c< Args,0 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 2,F,Args >
+    : apply2<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 3,F,Args >
+    : apply3<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 4,F,Args >
+    : apply4<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        >
+{
+};
+
+template< typename F, typename Args >
+struct unpack_args_impl< 5,F,Args >
+    : apply5<
+          F
+        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type
+        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type
+        , typename at_c< Args,4 >::type
+        >
+{
+};
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+
+        : aux::unpack_args_impl< size<Args>::value,F, Args >
+
+    {
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector.hpp
new file mode 100644
index 0000000..bfa9565
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector.hpp
@@ -0,0 +1,323 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
+    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
+    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
+    , typename T12 = na, typename T13 = na, typename T14 = na
+    , typename T15 = na, typename T16 = na, typename T17 = na
+    , typename T18 = na, typename T19 = na
+    >
+struct vector;
+
+template<
+     
+    >
+struct vector<
+          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector0<  >
+{
+    typedef vector0<  >::type type;
+};
+
+template<
+      typename T0
+    >
+struct vector<
+          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector1<T0>
+{
+    typedef typename vector1<T0>::type type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector<
+          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector2< T0,T1 >
+{
+    typedef typename vector2< T0,T1 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector<
+          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector3< T0,T1,T2 >
+{
+    typedef typename vector3< T0,T1,T2 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector<
+          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector4< T0,T1,T2,T3 >
+{
+    typedef typename vector4< T0,T1,T2,T3 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector<
+          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector5< T0,T1,T2,T3,T4 >
+{
+    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector6< T0,T1,T2,T3,T4,T5 >
+{
+    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector7< T0,T1,T2,T3,T4,T5,T6 >
+{
+    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+{
+    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+{
+    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+{
+    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na
+        , na, na, na
+        >
+    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+{
+    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na
+        , na, na, na, na
+        >
+    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+{
+    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na
+        , na, na, na, na
+        >
+    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+{
+    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na
+        , na, na, na, na
+        >
+    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+{
+    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na
+        , na, na, na, na
+        >
+    : vector15<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        >
+{
+    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, na, na, na, na
+        >
+    : vector16<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15
+        >
+{
+    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, na, na, na
+        >
+    : vector17<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16
+        >
+{
+    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, na, na
+        >
+    : vector18<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17
+        >
+{
+    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, na
+        >
+    : vector19<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18
+        >
+{
+    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector
+    : vector20<
+          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
+        , T15, T16, T17, T18, T19
+        >
+{
+    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector_c.hpp
new file mode 100644
index 0000000..0f1560d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessed/plain/vector_c.hpp
@@ -0,0 +1,309 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX
+    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX
+    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX
+    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX
+    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX
+    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX
+    , long C18 = LONG_MAX, long C19 = LONG_MAX
+    >
+struct vector_c;
+
+template<
+      typename T
+    >
+struct vector_c<
+          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector0_c<T>
+{
+    typedef typename vector0_c<T>::type type;
+};
+
+template<
+      typename T, long C0
+    >
+struct vector_c<
+          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector1_c< T, T(C0) >
+{
+    typedef typename vector1_c< T, T(C0) >::type type;
+};
+
+template<
+      typename T, long C0, long C1
+    >
+struct vector_c<
+          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector2_c< T, T(C0), T(C1) >
+{
+    typedef typename vector2_c< T, T(C0), T(C1) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2
+    >
+struct vector_c<
+          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector3_c< T, T(C0), T(C1), T(C2) >
+{
+    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >
+{
+    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >
+{
+    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >
+{
+    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >
+{
+    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX
+        >
+    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >
+{
+    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >
+{
+    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        , LONG_MAX
+        >
+    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >
+{
+    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >
+{
+    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >
+{
+    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >
+{
+    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >
+{
+    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >
+{
+    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >
+{
+    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX
+        >
+    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >
+{
+    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, LONG_MAX, LONG_MAX
+        >
+    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >
+{
+    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;
+};
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18
+    >
+struct vector_c<
+          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
+        , C15, C16, C17, C18, LONG_MAX
+        >
+    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >
+{
+    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;
+};
+
+/// primary template (not a specialization!)
+
+template<
+      typename T, long C0, long C1, long C2, long C3, long C4, long C5
+    , long C6, long C7, long C8, long C9, long C10, long C11, long C12
+    , long C13, long C14, long C15, long C16, long C17, long C18, long C19
+    >
+struct vector_c
+    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >
+{
+    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;
+};
+
+}}
+
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/add.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/add.hpp
new file mode 100644
index 0000000..53e646e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/add.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/mpl/aux_/preprocessor/tuple.hpp>
+
+#if defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION)
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_ADD(i,j) \
+    BOOST_MPL_PP_ADD_DELAY(i,j) \
+    /**/
+
+#   define BOOST_MPL_PP_ADD_DELAY(i,j) \
+    BOOST_PP_CAT(BOOST_MPL_PP_TUPLE_11_ELEM_##i,BOOST_MPL_PP_ADD_##j) \
+    /**/
+#else
+#   define BOOST_MPL_PP_ADD(i,j) \
+    BOOST_MPL_PP_ADD_DELAY(i,j) \
+    /**/
+
+#   define BOOST_MPL_PP_ADD_DELAY(i,j) \
+    BOOST_MPL_PP_TUPLE_11_ELEM_##i BOOST_MPL_PP_ADD_##j \
+    /**/
+#endif
+
+#   define BOOST_MPL_PP_ADD_0 (0,1,2,3,4,5,6,7,8,9,10)
+#   define BOOST_MPL_PP_ADD_1 (1,2,3,4,5,6,7,8,9,10,0)
+#   define BOOST_MPL_PP_ADD_2 (2,3,4,5,6,7,8,9,10,0,0)
+#   define BOOST_MPL_PP_ADD_3 (3,4,5,6,7,8,9,10,0,0,0)
+#   define BOOST_MPL_PP_ADD_4 (4,5,6,7,8,9,10,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_5 (5,6,7,8,9,10,0,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_6 (6,7,8,9,10,0,0,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_7 (7,8,9,10,0,0,0,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_8 (8,9,10,0,0,0,0,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_9 (9,10,0,0,0,0,0,0,0,0,0)
+#   define BOOST_MPL_PP_ADD_10 (10,0,0,0,0,0,0,0,0,0,0)
+
+#else
+
+#   include <boost/preprocessor/arithmetic/add.hpp>
+
+#   define BOOST_MPL_PP_ADD(i,j) \
+    BOOST_PP_ADD(i,j) \
+    /**/
+    
+#endif 
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/def_params_tail.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/def_params_tail.hpp
new file mode 100644
index 0000000..cab3989
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/def_params_tail.hpp
@@ -0,0 +1,105 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/limits/arity.hpp>
+#include <boost/mpl/aux_/config/dtp.hpp>
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#include <boost/preprocessor/comma_if.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/identity.hpp>
+#include <boost/preprocessor/empty.hpp>
+
+// BOOST_MPL_PP_DEF_PARAMS_TAIL(1,T,value): , T1 = value, .., Tn = value
+// BOOST_MPL_PP_DEF_PARAMS_TAIL(2,T,value): , T2 = value, .., Tn = value
+// BOOST_MPL_PP_DEF_PARAMS_TAIL(n,T,value): <nothing>
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/mpl/aux_/preprocessor/filter_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/sub.hpp>
+
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, value_func) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_1( \
+          i \
+        , BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,i) \
+        , param \
+        , value_func \
+        ) \
+    /**/
+
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_1(i, n, param, value_func) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_2(i,n,param,value_func) \
+    /**/
+
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_2(i, n, param, value_func) \
+    BOOST_PP_COMMA_IF(BOOST_PP_AND(i,n)) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_##i(n,param,value_func) \
+    /**/
+
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_0(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##1 v(),p##2 v(),p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v())
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_1(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##2 v(),p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_2(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_3(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_4(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_5(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4,p5)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_6(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4,p5,p6)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_7(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##8 v(),p##9 v(),p1,p2,p3,p4,p5,p6,p7)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_8(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##9 v(),p1,p2,p3,p4,p5,p6,p7,p8)
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_9(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p1,p2,p3,p4,p5,p6,p7,p8,p9)
+
+#else
+
+#   include <boost/preprocessor/arithmetic/add.hpp>
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/tuple/elem.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_AUX_TAIL_PARAM_FUNC(unused, i, op) \
+    , BOOST_PP_CAT( \
+          BOOST_PP_TUPLE_ELEM(3, 1, op) \
+        , BOOST_PP_ADD_D(1, i, BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(3, 0, op))) \
+        ) BOOST_PP_TUPLE_ELEM(3, 2, op)() \
+    /**/
+
+#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, value_func) \
+    BOOST_PP_REPEAT( \
+          BOOST_PP_SUB_D(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, i) \
+        , BOOST_MPL_PP_AUX_TAIL_PARAM_FUNC \
+        , (i, param, value_func) \
+        ) \
+    /**/
+
+
+#endif // BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES
+
+#define BOOST_MPL_PP_DEF_PARAMS_TAIL(i, param, value) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_IDENTITY(=value)) \
+    /**/
+
+#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#   define BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, param, value) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_IDENTITY(=value)) \
+    /**/
+#else
+#   define BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, param, value) \
+    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_EMPTY) \
+    /**/
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/default_params.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/default_params.hpp
new file mode 100644
index 0000000..c3548c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/default_params.hpp
@@ -0,0 +1,67 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+// BOOST_MPL_PP_DEFAULT_PARAMS(0,T,int): <nothing>
+// BOOST_MPL_PP_DEFAULT_PARAMS(1,T,int): T1 = int
+// BOOST_MPL_PP_DEFAULT_PARAMS(2,T,int): T1 = int, T2 = int
+// BOOST_MPL_PP_DEFAULT_PARAMS(n,T,int): T1 = int, T2 = int, .., Tn = int
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_DEFAULT_PARAMS(n,p,v) \
+    BOOST_PP_CAT(BOOST_MPL_PP_DEFAULT_PARAMS_,n)(p,v) \
+    /**/
+    
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_0(p,v)
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_1(p,v) p##1=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_2(p,v) p##1=v,p##2=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_3(p,v) p##1=v,p##2=v,p##3=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_4(p,v) p##1=v,p##2=v,p##3=v,p##4=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_5(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_6(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_7(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_8(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v,p##8=v
+#   define BOOST_MPL_PP_DEFAULT_PARAMS_9(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v,p##8=v,p##9=v
+
+#else
+
+#   include <boost/preprocessor/tuple/elem.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_AUX_DEFAULT_PARAM_FUNC(unused, i, pv) \
+    BOOST_PP_COMMA_IF(i) \
+    BOOST_PP_CAT( BOOST_PP_TUPLE_ELEM(2,0,pv), BOOST_PP_INC(i) ) \
+        = BOOST_PP_TUPLE_ELEM(2,1,pv) \
+    /**/
+
+#   define BOOST_MPL_PP_DEFAULT_PARAMS(n, param, value) \
+    BOOST_PP_REPEAT( \
+          n \
+        , BOOST_MPL_PP_AUX_DEFAULT_PARAM_FUNC \
+        , (param,value) \
+        ) \
+    /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/enum.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/enum.hpp
new file mode 100644
index 0000000..64c5e6a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/enum.hpp
@@ -0,0 +1,62 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+// BOOST_MPL_PP_ENUM(0,int): <nothing>
+// BOOST_MPL_PP_ENUM(1,int): int
+// BOOST_MPL_PP_ENUM(2,int): int, int
+// BOOST_MPL_PP_ENUM(n,int): int, int, .., int
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_ENUM(n, param) \
+    BOOST_PP_CAT(BOOST_MPL_PP_ENUM_,n)(param) \
+    /**/
+    
+#   define BOOST_MPL_PP_ENUM_0(p)
+#   define BOOST_MPL_PP_ENUM_1(p) p
+#   define BOOST_MPL_PP_ENUM_2(p) p,p
+#   define BOOST_MPL_PP_ENUM_3(p) p,p,p
+#   define BOOST_MPL_PP_ENUM_4(p) p,p,p,p
+#   define BOOST_MPL_PP_ENUM_5(p) p,p,p,p,p
+#   define BOOST_MPL_PP_ENUM_6(p) p,p,p,p,p,p
+#   define BOOST_MPL_PP_ENUM_7(p) p,p,p,p,p,p,p
+#   define BOOST_MPL_PP_ENUM_8(p) p,p,p,p,p,p,p,p
+#   define BOOST_MPL_PP_ENUM_9(p) p,p,p,p,p,p,p,p,p
+
+#else
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+
+#   define BOOST_MPL_PP_AUX_ENUM_FUNC(unused, i, param) \
+    BOOST_PP_COMMA_IF(i) param \
+    /**/
+
+#   define BOOST_MPL_PP_ENUM(n, param) \
+    BOOST_PP_REPEAT( \
+          n \
+        , BOOST_MPL_PP_AUX_ENUM_FUNC \
+        , param \
+        ) \
+    /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/ext_params.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/ext_params.hpp
new file mode 100644
index 0000000..f5e6e50
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/ext_params.hpp
@@ -0,0 +1,78 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+// BOOST_MPL_PP_EXT_PARAMS(2,2,T): <nothing>
+// BOOST_MPL_PP_EXT_PARAMS(2,3,T): T2
+// BOOST_MPL_PP_EXT_PARAMS(2,4,T): T2, T3
+// BOOST_MPL_PP_EXT_PARAMS(2,n,T): T2, T3, .., Tn-1
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/mpl/aux_/preprocessor/filter_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/sub.hpp>
+
+#   define BOOST_MPL_PP_EXT_PARAMS(i,j,p) \
+    BOOST_MPL_PP_EXT_PARAMS_DELAY_1(i,BOOST_MPL_PP_SUB(j,i),p) \
+    /**/
+
+#   define BOOST_MPL_PP_EXT_PARAMS_DELAY_1(i,n,p) \
+    BOOST_MPL_PP_EXT_PARAMS_DELAY_2(i,n,p) \
+    /**/
+
+#   define BOOST_MPL_PP_EXT_PARAMS_DELAY_2(i,n,p) \
+    BOOST_MPL_PP_EXT_PARAMS_##i(n,p) \
+    /**/
+
+#   define BOOST_MPL_PP_EXT_PARAMS_1(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9)
+#   define BOOST_MPL_PP_EXT_PARAMS_2(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9,p1)
+#   define BOOST_MPL_PP_EXT_PARAMS_3(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##3,p##4,p##5,p##6,p##7,p##8,p##9,p1,p2)
+#   define BOOST_MPL_PP_EXT_PARAMS_4(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##4,p##5,p##6,p##7,p##8,p##9,p1,p2,p3)
+#   define BOOST_MPL_PP_EXT_PARAMS_5(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##5,p##6,p##7,p##8,p##9,p1,p2,p3,p4)
+#   define BOOST_MPL_PP_EXT_PARAMS_6(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##6,p##7,p##8,p##9,p1,p2,p3,p4,p5)
+#   define BOOST_MPL_PP_EXT_PARAMS_7(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##7,p##8,p##9,p1,p2,p3,p4,p5,p6)
+#   define BOOST_MPL_PP_EXT_PARAMS_8(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##8,p##9,p1,p2,p3,p4,p5,p6,p7)
+#   define BOOST_MPL_PP_EXT_PARAMS_9(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##9,p1,p2,p3,p4,p5,p6,p7,p8)
+
+#else
+
+#   include <boost/preprocessor/arithmetic/add.hpp>
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/tuple/elem.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_AUX_EXT_PARAM_FUNC(unused, i, op) \
+    BOOST_PP_COMMA_IF(i) \
+    BOOST_PP_CAT( \
+          BOOST_PP_TUPLE_ELEM(2,1,op) \
+        , BOOST_PP_ADD_D(1, i, BOOST_PP_TUPLE_ELEM(2,0,op)) \
+        ) \
+    /**/
+
+#   define BOOST_MPL_PP_EXT_PARAMS(i, j, param) \
+    BOOST_PP_REPEAT( \
+          BOOST_PP_SUB_D(1,j,i) \
+        , BOOST_MPL_PP_AUX_EXT_PARAM_FUNC \
+        , (i,param) \
+        ) \
+    /**/
+
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/filter_params.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/filter_params.hpp
new file mode 100644
index 0000000..7c0df4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/filter_params.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define BOOST_MPL_PP_FILTER_PARAMS_0(p1,p2,p3,p4,p5,p6,p7,p8,p9) 
+#define BOOST_MPL_PP_FILTER_PARAMS_1(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1
+#define BOOST_MPL_PP_FILTER_PARAMS_2(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2
+#define BOOST_MPL_PP_FILTER_PARAMS_3(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3
+#define BOOST_MPL_PP_FILTER_PARAMS_4(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4
+#define BOOST_MPL_PP_FILTER_PARAMS_5(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5
+#define BOOST_MPL_PP_FILTER_PARAMS_6(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6
+#define BOOST_MPL_PP_FILTER_PARAMS_7(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7
+#define BOOST_MPL_PP_FILTER_PARAMS_8(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7,p8
+#define BOOST_MPL_PP_FILTER_PARAMS_9(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7,p8,p9
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/is_seq.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/is_seq.hpp
new file mode 100644
index 0000000..cb6dcb9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/is_seq.hpp
@@ -0,0 +1,54 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
+
+// Copyright Paul Mensonides 2003
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/punctuation/paren.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/config/config.hpp>
+
+// returns 1 if 'seq' is a PP-sequence, 0 otherwise:
+//
+//   BOOST_PP_ASSERT( BOOST_PP_NOT( BOOST_MPL_PP_IS_SEQ( int ) ) )
+//   BOOST_PP_ASSERT( BOOST_MPL_PP_IS_SEQ( (int) ) )
+//   BOOST_PP_ASSERT( BOOST_MPL_PP_IS_SEQ( (1)(2) ) )
+
+#if (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()) || defined(_MSC_VER) && defined(__INTEL_COMPILER) && __INTEL_COMPILER == 1010
+
+#   define BOOST_MPL_PP_IS_SEQ(seq) BOOST_PP_DEC( BOOST_PP_SEQ_SIZE( BOOST_MPL_PP_IS_SEQ_(seq) ) )
+#   define BOOST_MPL_PP_IS_SEQ_(seq) BOOST_MPL_PP_IS_SEQ_SEQ_( BOOST_MPL_PP_IS_SEQ_SPLIT_ seq )
+#   define BOOST_MPL_PP_IS_SEQ_SEQ_(x) (x)
+#   define BOOST_MPL_PP_IS_SEQ_SPLIT_(unused) unused)((unused)
+
+#else
+
+#   if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#       define BOOST_MPL_PP_IS_SEQ(seq) BOOST_MPL_PP_IS_SEQ_MWCC_((seq))
+#       define BOOST_MPL_PP_IS_SEQ_MWCC_(args) BOOST_MPL_PP_IS_SEQ_ ## args
+#   else
+#       define BOOST_MPL_PP_IS_SEQ(seq) BOOST_MPL_PP_IS_SEQ_(seq)
+#   endif
+
+#   define BOOST_MPL_PP_IS_SEQ_(seq) BOOST_PP_CAT(BOOST_MPL_PP_IS_SEQ_, BOOST_MPL_PP_IS_SEQ_0 seq BOOST_PP_RPAREN())
+#   define BOOST_MPL_PP_IS_SEQ_0(x) BOOST_MPL_PP_IS_SEQ_1(x
+#   define BOOST_MPL_PP_IS_SEQ_ALWAYS_0(unused) 0
+#   define BOOST_MPL_PP_IS_SEQ_BOOST_MPL_PP_IS_SEQ_0 BOOST_MPL_PP_IS_SEQ_ALWAYS_0(
+#   define BOOST_MPL_PP_IS_SEQ_BOOST_MPL_PP_IS_SEQ_1(unused) 1
+
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/params.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/params.hpp
new file mode 100644
index 0000000..acad321
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/params.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+// BOOST_MPL_PP_PARAMS(0,T): <nothing>
+// BOOST_MPL_PP_PARAMS(1,T): T1
+// BOOST_MPL_PP_PARAMS(2,T): T1, T2
+// BOOST_MPL_PP_PARAMS(n,T): T1, T2, .., Tn
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_PARAMS(n,p) \
+    BOOST_PP_CAT(BOOST_MPL_PP_PARAMS_,n)(p) \
+    /**/
+
+#   define BOOST_MPL_PP_PARAMS_0(p)
+#   define BOOST_MPL_PP_PARAMS_1(p) p##1
+#   define BOOST_MPL_PP_PARAMS_2(p) p##1,p##2
+#   define BOOST_MPL_PP_PARAMS_3(p) p##1,p##2,p##3
+#   define BOOST_MPL_PP_PARAMS_4(p) p##1,p##2,p##3,p##4
+#   define BOOST_MPL_PP_PARAMS_5(p) p##1,p##2,p##3,p##4,p##5
+#   define BOOST_MPL_PP_PARAMS_6(p) p##1,p##2,p##3,p##4,p##5,p##6
+#   define BOOST_MPL_PP_PARAMS_7(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7
+#   define BOOST_MPL_PP_PARAMS_8(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8
+#   define BOOST_MPL_PP_PARAMS_9(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9
+
+#else
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_AUX_PARAM_FUNC(unused, i, param) \
+    BOOST_PP_COMMA_IF(i) \
+    BOOST_PP_CAT(param, BOOST_PP_INC(i)) \
+    /**/
+
+#   define BOOST_MPL_PP_PARAMS(n, param) \
+    BOOST_PP_REPEAT( \
+          n \
+        , BOOST_MPL_PP_AUX_PARAM_FUNC \
+        , param \
+        ) \
+    /**/
+
+#endif 
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/partial_spec_params.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/partial_spec_params.hpp
new file mode 100644
index 0000000..de5535c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/partial_spec_params.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/limits/arity.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/preprocessor/enum.hpp>
+#include <boost/mpl/aux_/preprocessor/sub.hpp>
+#include <boost/preprocessor/comma_if.hpp>
+
+#define BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \
+BOOST_MPL_PP_PARAMS(n, param) \
+BOOST_PP_COMMA_IF(BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,n)) \
+BOOST_MPL_PP_ENUM( \
+      BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,n) \
+    , def \
+    ) \
+/**/
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/range.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/range.hpp
new file mode 100644
index 0000000..d66eeb5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/range.hpp
@@ -0,0 +1,30 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/seq/subseq.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+
+#define BOOST_MPL_PP_RANGE_ITEM(z,n,_) (n)
+
+#define BOOST_MPL_PP_RANGE(first, length) \
+    BOOST_PP_SEQ_SUBSEQ( \
+        BOOST_PP_REPEAT(BOOST_PP_ADD(first,length), BOOST_MPL_PP_RANGE_ITEM, _), \
+        first, length \
+    ) \
+/**/
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/repeat.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/repeat.hpp
new file mode 100644
index 0000000..0511367
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/repeat.hpp
@@ -0,0 +1,51 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_REPEAT(n,f,param) \
+    BOOST_PP_CAT(BOOST_MPL_PP_REPEAT_,n)(f,param) \
+    /**/
+    
+#   define BOOST_MPL_PP_REPEAT_0(f,p)
+#   define BOOST_MPL_PP_REPEAT_1(f,p) f(0,0,p)
+#   define BOOST_MPL_PP_REPEAT_2(f,p) f(0,0,p) f(0,1,p)
+#   define BOOST_MPL_PP_REPEAT_3(f,p) f(0,0,p) f(0,1,p) f(0,2,p)
+#   define BOOST_MPL_PP_REPEAT_4(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p)
+#   define BOOST_MPL_PP_REPEAT_5(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p)
+#   define BOOST_MPL_PP_REPEAT_6(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p)
+#   define BOOST_MPL_PP_REPEAT_7(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p)
+#   define BOOST_MPL_PP_REPEAT_8(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p)
+#   define BOOST_MPL_PP_REPEAT_9(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p) f(0,8,p)
+#   define BOOST_MPL_PP_REPEAT_10(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p) f(0,8,p) f(0,9,p)
+
+#else 
+
+#   include <boost/preprocessor/repeat.hpp>
+
+#   define BOOST_MPL_PP_REPEAT(n,f,param) \
+    BOOST_PP_REPEAT(n,f,param) \
+    /**/
+
+#endif 
+
+#define BOOST_MPL_PP_REPEAT_IDENTITY_FUNC(unused1, unused2, x) x
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/sub.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/sub.hpp
new file mode 100644
index 0000000..c794c74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/sub.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)
+
+#   include <boost/mpl/aux_/preprocessor/tuple.hpp>
+
+#if defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION)
+#   include <boost/preprocessor/cat.hpp>
+
+#   define BOOST_MPL_PP_SUB(i,j) \
+    BOOST_MPL_PP_SUB_DELAY(i,j) \
+    /**/
+
+#   define BOOST_MPL_PP_SUB_DELAY(i,j) \
+    BOOST_PP_CAT(BOOST_MPL_PP_TUPLE_11_ELEM_##i,BOOST_MPL_PP_SUB_##j) \
+    /**/
+#else
+#   define BOOST_MPL_PP_SUB(i,j) \
+    BOOST_MPL_PP_SUB_DELAY(i,j) \
+    /**/
+
+#   define BOOST_MPL_PP_SUB_DELAY(i,j) \
+    BOOST_MPL_PP_TUPLE_11_ELEM_##i BOOST_MPL_PP_SUB_##j \
+    /**/
+#endif
+
+#   define BOOST_MPL_PP_SUB_0 (0,1,2,3,4,5,6,7,8,9,10)
+#   define BOOST_MPL_PP_SUB_1 (0,0,1,2,3,4,5,6,7,8,9)
+#   define BOOST_MPL_PP_SUB_2 (0,0,0,1,2,3,4,5,6,7,8)
+#   define BOOST_MPL_PP_SUB_3 (0,0,0,0,1,2,3,4,5,6,7)
+#   define BOOST_MPL_PP_SUB_4 (0,0,0,0,0,1,2,3,4,5,6)
+#   define BOOST_MPL_PP_SUB_5 (0,0,0,0,0,0,1,2,3,4,5)
+#   define BOOST_MPL_PP_SUB_6 (0,0,0,0,0,0,0,1,2,3,4)
+#   define BOOST_MPL_PP_SUB_7 (0,0,0,0,0,0,0,0,1,2,3)
+#   define BOOST_MPL_PP_SUB_8 (0,0,0,0,0,0,0,0,0,1,2)
+#   define BOOST_MPL_PP_SUB_9 (0,0,0,0,0,0,0,0,0,0,1)
+#   define BOOST_MPL_PP_SUB_10 (0,0,0,0,0,0,0,0,0,0,0)
+
+#else
+
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+
+#   define BOOST_MPL_PP_SUB(i,j) \
+    BOOST_PP_SUB(i,j) \
+    /**/
+    
+#endif
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/token_equal.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/token_equal.hpp
new file mode 100644
index 0000000..ffdb20f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/token_equal.hpp
@@ -0,0 +1,56 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_TOKEN_EQUAL_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_TOKEN_EQUAL_HPP_INCLUDED
+
+// Copyright Paul Mensonides 2003
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/preprocessor/is_seq.hpp>
+
+#include <boost/preprocessor/if.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// compares tokens 'a' and 'b' for equality:
+//
+//   #define BOOST_MPL_PP_TOKEN_EQUAL_apple(x) x
+//   #define BOOST_MPL_PP_TOKEN_EQUAL_orange(x) x
+//
+//   BOOST_PP_ASSERT( BOOST_PP_NOT( BOOST_MPL_PP_TOKEN_EQUAL(apple, abc) ) )
+//   BOOST_PP_ASSERT( BOOST_PP_NOT( BOOST_MPL_PP_TOKEN_EQUAL(abc, apple) ) )
+//   BOOST_PP_ASSERT( BOOST_PP_NOT( BOOST_MPL_PP_TOKEN_EQUAL(apple, orange) ) )
+//   BOOST_PP_ASSERT( BOOST_MPL_PP_TOKEN_EQUAL(apple, apple) )
+//   BOOST_PP_ASSERT( BOOST_MPL_PP_TOKEN_EQUAL(orange, orange) )
+
+#define BOOST_MPL_PP_TOKEN_EQUAL(a, b) \
+    BOOST_PP_IIF( \
+        BOOST_PP_BITAND( \
+              BOOST_MPL_PP_IS_SEQ( BOOST_PP_CAT(BOOST_MPL_PP_TOKEN_EQUAL_, a)((unused)) ) \
+            , BOOST_MPL_PP_IS_SEQ( BOOST_PP_CAT(BOOST_MPL_PP_TOKEN_EQUAL_, b)((unused)) ) \
+            ) \
+        , BOOST_MPL_PP_TOKEN_EQUAL_I \
+        , 0 BOOST_PP_TUPLE_EAT(2) \
+        )(a, b) \
+/**/
+
+#define BOOST_MPL_PP_TOKEN_EQUAL_I(a, b) \
+    BOOST_PP_COMPL(BOOST_MPL_PP_IS_SEQ( \
+        BOOST_MPL_PP_TOKEN_EQUAL_ ## a( \
+            BOOST_MPL_PP_TOKEN_EQUAL_ ## b \
+            )((unused)) \
+        )) \
+/**/
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_TOKEN_EQUAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/tuple.hpp b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/tuple.hpp
new file mode 100644
index 0000000..755bbc5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/preprocessor/tuple.hpp
@@ -0,0 +1,29 @@
+
+#ifndef BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED
+#define BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define BOOST_MPL_PP_TUPLE_11_ELEM_0(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e0
+#define BOOST_MPL_PP_TUPLE_11_ELEM_1(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e1
+#define BOOST_MPL_PP_TUPLE_11_ELEM_2(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e2
+#define BOOST_MPL_PP_TUPLE_11_ELEM_3(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e3
+#define BOOST_MPL_PP_TUPLE_11_ELEM_4(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e4
+#define BOOST_MPL_PP_TUPLE_11_ELEM_5(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e5
+#define BOOST_MPL_PP_TUPLE_11_ELEM_6(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e6
+#define BOOST_MPL_PP_TUPLE_11_ELEM_7(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e7
+#define BOOST_MPL_PP_TUPLE_11_ELEM_8(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e8
+#define BOOST_MPL_PP_TUPLE_11_ELEM_9(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e9
+#define BOOST_MPL_PP_TUPLE_11_ELEM_10(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e10
+
+#endif // BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/ptr_to_ref.hpp b/gatb-core/thirdparty/boost/mpl/aux_/ptr_to_ref.hpp
new file mode 100644
index 0000000..8517b30
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/ptr_to_ref.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
+#define BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
+    ||  ( BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \
+        && !(defined(__STD_STRICT_ANSI) \
+            || defined(__STD_STRICT_ANSI_ERRORS)) )
+
+#   define BOOST_MPL_AUX_PTR_TO_REF(X) \
+    *BOOST_MPL_AUX_STATIC_CAST(X*, 0) \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_PTR_TO_REF(X) \
+    aux::ptr_to_ref(BOOST_MPL_AUX_STATIC_CAST(X*, 0)) \
+/**/
+
+#endif
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > static T const& ptr_to_ref(T*);
+
+}}}
+
+#endif // BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/push_back_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/push_back_impl.hpp
new file mode 100644
index 0000000..27e7a60
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/push_back_impl.hpp
@@ -0,0 +1,70 @@
+
+#ifndef BOOST_MPL_AUX_PUSH_BACK_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_PUSH_BACK_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_back_fwd.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/aux_/has_type.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+struct has_push_back_arg {};
+
+// agurt 05/feb/04: no default implementation; the stub definition is needed 
+// to enable the default 'has_push_back' implementation below
+template< typename Tag >
+struct push_back_impl
+{
+    template< typename Sequence, typename T > struct apply
+    {
+        // should be instantiated only in the context of 'has_push_back_impl';
+        // if you've got an assert here, you are requesting a 'push_back' 
+        // specialization that doesn't exist.
+        BOOST_MPL_ASSERT_MSG(
+              ( boost::is_same< T, has_push_back_arg >::value )
+            , REQUESTED_PUSH_BACK_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST
+            , ( Sequence )
+            );
+    };
+};
+
+template< typename Tag >
+struct has_push_back_impl
+{
+    template< typename Seq > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : aux::has_type< push_back< Seq, has_push_back_arg > >
+    {
+#else
+    {
+        typedef aux::has_type< push_back< Seq, has_push_back_arg > > type;
+        BOOST_STATIC_CONSTANT(bool, value = 
+              (aux::has_type< push_back< Seq, has_push_back_arg > >::value)
+            );
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2, push_back_impl)
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, has_push_back_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_PUSH_BACK_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/push_front_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/push_front_impl.hpp
new file mode 100644
index 0000000..5b83ee7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/push_front_impl.hpp
@@ -0,0 +1,71 @@
+
+#ifndef BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front_fwd.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/aux_/has_type.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+struct has_push_front_arg {};
+
+// agurt 05/feb/04: no default implementation; the stub definition is needed 
+// to enable the default 'has_push_front' implementation below
+
+template< typename Tag >
+struct push_front_impl
+{
+    template< typename Sequence, typename T > struct apply
+    {
+        // should be instantiated only in the context of 'has_push_front_impl';
+        // if you've got an assert here, you are requesting a 'push_front' 
+        // specialization that doesn't exist.
+        BOOST_MPL_ASSERT_MSG(
+              ( boost::is_same< T, has_push_front_arg >::value )
+            , REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST
+            , ( Sequence )
+            );
+    };
+};
+
+template< typename Tag >
+struct has_push_front_impl
+{
+    template< typename Seq > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : aux::has_type< push_front< Seq, has_push_front_arg > >
+    {
+#else
+    {
+        typedef aux::has_type< push_front< Seq, has_push_front_arg > > type;
+        BOOST_STATIC_CONSTANT(bool, value = 
+              (aux::has_type< push_front< Seq, has_push_front_arg > >::value)
+            );
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2, push_front_impl)
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, has_push_front_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/O1_size.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/O1_size.hpp
new file mode 100644
index 0000000..9b393e8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/O1_size.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_O1_SIZE_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_O1_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/O1_size_fwd.hpp>
+#include <boost/mpl/aux_/range_c/size.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct O1_size_impl< aux::half_open_range_tag >
+    : size_impl< aux::half_open_range_tag >
+{
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_O1_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/back.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/back.hpp
new file mode 100644
index 0000000..5490108
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/back.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_BACK_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/back_fwd.hpp>
+#include <boost/mpl/prior.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct back_impl< aux::half_open_range_tag >
+{
+    template< typename Range > struct apply
+    {
+        typedef typename prior< typename Range::finish >::type type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/empty.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/empty.hpp
new file mode 100644
index 0000000..574bdf2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/empty.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_EMPTY_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_EMPTY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct empty_impl< aux::half_open_range_tag >
+{
+    template< typename Range > struct apply
+        : equal_to<
+              typename Range::start
+            , typename Range::finish
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_EMPTY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/front.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/front.hpp
new file mode 100644
index 0000000..2964ab5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/front.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_FRONT_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct front_impl< aux::half_open_range_tag >
+{
+    template< typename Range > struct apply
+    {
+        typedef typename Range::start type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/iterator.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/iterator.hpp
new file mode 100644
index 0000000..2c52905
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/iterator.hpp
@@ -0,0 +1,106 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_ITERATOR_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_ITERATOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/advance_fwd.hpp>
+#include <boost/mpl/distance_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+// theoretically will work on any discrete numeric type
+template< typename N > struct r_iter
+{
+    typedef aux::r_iter_tag tag;
+    typedef random_access_iterator_tag category;
+    typedef N type;
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    typedef r_iter< typename mpl::next<N>::type > next;
+    typedef r_iter< typename mpl::prior<N>::type > prior;
+#endif
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename N
+    >
+struct next< r_iter<N> >
+{
+    typedef r_iter< typename mpl::next<N>::type > type;
+};
+
+template<
+      typename N
+    >
+struct prior< r_iter<N> >
+{
+    typedef r_iter< typename mpl::prior<N>::type > type;
+};
+
+#endif
+
+
+template<> struct advance_impl<aux::r_iter_tag>
+{
+    template< typename Iter, typename Dist > struct apply
+    {
+        typedef typename deref<Iter>::type n_;
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+        typedef typename plus_impl<integral_c_tag,integral_c_tag>
+            ::template apply<n_,Dist>::type m_;
+#else
+        typedef typename plus<n_,Dist>::type m_;
+#endif
+        // agurt, 10/nov/04: to be generic, the code have to do something along
+        // the lines below...
+        //
+        // typedef typename apply_wrap1<
+        //       numeric_cast< typename m_::tag, typename n_::tag >
+        //     , m_
+        //     >::type result_;
+        //
+        // ... meanwhile:
+        
+        typedef integral_c< 
+              typename aux::value_type_wknd<n_>::type
+            , BOOST_MPL_AUX_VALUE_WKND(m_)::value 
+            > result_;
+        
+        typedef r_iter<result_> type;
+    };
+};
+
+template<> struct distance_impl<aux::r_iter_tag>
+{
+    template< typename Iter1, typename Iter2 > struct apply
+        : minus<
+              typename Iter2::type
+            , typename Iter1::type
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_ITERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/size.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/size.hpp
new file mode 100644
index 0000000..761a97c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/size.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_SIZE_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct size_impl< aux::half_open_range_tag >
+{
+    template< typename Range > struct apply
+        : minus<
+              typename Range::finish
+            , typename Range::start
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/range_c/tag.hpp b/gatb-core/thirdparty/boost/mpl/aux_/range_c/tag.hpp
new file mode 100644
index 0000000..7f8fdde
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/range_c/tag.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_AUX_RANGE_C_TAG_HPP_INCLUDED
+#define BOOST_MPL_AUX_RANGE_C_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+struct half_open_range_tag;
+struct r_iter_tag;
+
+}}}
+
+#endif // BOOST_MPL_AUX_RANGE_C_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl.hpp
new file mode 100644
index 0000000..a27a35f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/next_prior.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    || defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+#       include <boost/mpl/if.hpp>
+#       include <boost/type_traits/is_same.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER reverse_fold_impl.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   define AUX778076_FOLD_IMPL_OP(iter) typename deref<iter>::type
+#   define AUX778076_FOLD_IMPL_NAME_PREFIX reverse_fold
+#   include <boost/mpl/aux_/reverse_fold_impl_body.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl_body.hpp b/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl_body.hpp
new file mode 100644
index 0000000..0f80010
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/reverse_fold_impl_body.hpp
@@ -0,0 +1,412 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#   include <boost/mpl/limits/unrolling.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/dec.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+// local macros, #undef-ined at the end of the header
+
+#   define AUX778076_ITER_FOLD_FORWARD_STEP(unused, n_, unused2) \
+    typedef typename apply2< \
+          ForwardOp \
+        , BOOST_PP_CAT(fwd_state,n_) \
+        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,n_)) \
+        >::type BOOST_PP_CAT(fwd_state,BOOST_PP_INC(n_)); \
+    typedef typename mpl::next<BOOST_PP_CAT(iter,n_)>::type \
+        BOOST_PP_CAT(iter,BOOST_PP_INC(n_)); \
+    /**/
+
+#   define AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC(n_) \
+    typedef typename apply2< \
+          BackwardOp \
+        , BOOST_PP_CAT(bkwd_state,n_) \
+        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,BOOST_PP_DEC(n_))) \
+        >::type BOOST_PP_CAT(bkwd_state,BOOST_PP_DEC(n_)); \
+    /**/
+
+#   define AUX778076_ITER_FOLD_BACKWARD_STEP(unused, n_, j) \
+    AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC( \
+          BOOST_PP_SUB_D(1,j,n_) \
+        ) \
+    /**/
+
+#   define AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(n_) \
+    typedef typename nested_chunk::state BOOST_PP_CAT(bkwd_state,n_);
+    /**/
+
+#   define AUX778076_FOLD_IMPL_NAME \
+    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \
+    /**/
+
+#   define AUX778076_FOLD_CHUNK_NAME \
+    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \
+    /**/
+
+namespace boost { namespace mpl { namespace aux {
+
+/// forward declaration
+template<
+      BOOST_MPL_AUX_NTTP_DECL(long, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME;
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template<
+      BOOST_MPL_AUX_NTTP_DECL(long, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+
+    BOOST_MPL_PP_REPEAT(
+          BOOST_MPL_LIMIT_UNROLLING
+        , AUX778076_ITER_FOLD_FORWARD_STEP
+        , unused
+        )
+
+    typedef AUX778076_FOLD_IMPL_NAME<
+          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
+        , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)
+        , Last
+        , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)
+        , BackwardOp
+        , ForwardOp
+        > nested_chunk;
+        
+    AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)
+
+    BOOST_MPL_PP_REPEAT(
+          BOOST_MPL_LIMIT_UNROLLING
+        , AUX778076_ITER_FOLD_BACKWARD_STEP
+        , BOOST_MPL_LIMIT_UNROLLING
+        )
+
+    typedef bkwd_state0 state;
+    typedef typename nested_chunk::iterator iterator;
+};
+
+// fallback implementation for sequences of unknown size
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,BackwardOp,ForwardOp>
+{
+    typedef AUX778076_FOLD_IMPL_NAME<
+          -1
+        , typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , AUX778076_FOLD_IMPL_OP(First)
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,BackwardOp,ForwardOp>
+{
+    typedef State state;
+    typedef Last iterator;
+};
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) >
+struct AUX778076_FOLD_CHUNK_NAME;
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))
+#   include BOOST_PP_ITERATE()
+
+// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > 
+struct AUX778076_FOLD_CHUNK_NAME
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        > 
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+
+        BOOST_MPL_PP_REPEAT(
+              BOOST_MPL_LIMIT_UNROLLING
+            , AUX778076_ITER_FOLD_FORWARD_STEP
+            , unused
+            )
+
+        typedef AUX778076_FOLD_IMPL_NAME<
+              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
+            , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)
+            , Last
+            , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)
+            , BackwardOp
+            , ForwardOp
+            > nested_chunk;
+            
+        AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)
+
+        BOOST_MPL_PP_REPEAT(
+              BOOST_MPL_LIMIT_UNROLLING
+            , AUX778076_ITER_FOLD_BACKWARD_STEP
+            , BOOST_MPL_LIMIT_UNROLLING
+            )
+
+        typedef bkwd_state0 state;
+        typedef typename nested_chunk::iterator iterator;
+    };
+};
+
+// fallback implementation for sequences of unknown size
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);
+
+template<
+      typename Last
+    , typename State
+    >
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)
+{
+    typedef Last iterator;
+    typedef State state;
+};
+
+template<> 
+struct AUX778076_FOLD_CHUNK_NAME<-1>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        > 
+    struct result_
+    {
+        typedef typename if_<
+              typename is_same<First,Last>::type
+            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>
+            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,BackwardOp,ForwardOp>
+            >::type res_;
+
+        typedef typename res_::state state;
+        typedef typename res_::iterator iterator;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct result_<int,int,int,int,int>
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+#endif
+};
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)
+{
+    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<
+          typename mpl::next<First>::type
+        , Last
+        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
+        , BackwardOp
+        , ForwardOp
+        > nested_step;
+
+    typedef typename apply2<
+          BackwardOp
+        , typename nested_step::state
+        , AUX778076_FOLD_IMPL_OP(First)
+        >::type state;
+
+    typedef typename nested_step::iterator iterator;
+};
+
+template<
+      BOOST_MPL_AUX_NTTP_DECL(long, N)
+    , typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    > 
+struct AUX778076_FOLD_IMPL_NAME
+    : AUX778076_FOLD_CHUNK_NAME<N>
+        ::template result_<First,Last,State,BackwardOp,ForwardOp>
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}}
+
+#   undef AUX778076_FIRST_BACKWARD_STATE_TYPEDEF
+#   undef AUX778076_ITER_FOLD_BACKWARD_STEP
+#   undef AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC
+#   undef AUX778076_ITER_FOLD_FORWARD_STEP
+
+#undef AUX778076_FOLD_IMPL_OP
+#undef AUX778076_FOLD_IMPL_NAME_PREFIX
+
+///// iteration
+
+#else
+
+#   define n_ BOOST_PP_FRAME_ITERATION(1)
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+
+template<
+      typename First
+    , typename Last
+    , typename State
+    , typename BackwardOp
+    , typename ForwardOp
+    >
+struct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,BackwardOp,ForwardOp>
+{
+    typedef First iter0;
+    typedef State fwd_state0;
+
+    BOOST_MPL_PP_REPEAT(
+          n_
+        , AUX778076_ITER_FOLD_FORWARD_STEP
+        , unused
+        )
+
+    typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);
+
+    BOOST_MPL_PP_REPEAT(
+          n_
+        , AUX778076_ITER_FOLD_BACKWARD_STEP
+        , n_
+        )
+
+    typedef bkwd_state0 state;
+    typedef BOOST_PP_CAT(iter,n_) iterator;
+};
+
+#else
+
+template<> struct AUX778076_FOLD_CHUNK_NAME<n_>
+{
+    template<
+          typename First
+        , typename Last
+        , typename State
+        , typename BackwardOp
+        , typename ForwardOp
+        >
+    struct result_
+    {
+        typedef First iter0;
+        typedef State fwd_state0;
+
+        BOOST_MPL_PP_REPEAT(
+              n_
+            , AUX778076_ITER_FOLD_FORWARD_STEP
+            , unused
+            )
+
+        typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);
+
+        BOOST_MPL_PP_REPEAT(
+              n_
+            , AUX778076_ITER_FOLD_BACKWARD_STEP
+            , n_
+            )
+
+        typedef bkwd_state0 state;
+        typedef BOOST_PP_CAT(iter,n_) iterator;
+    };
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+    /// ETI workaround
+    template<> struct result_<int,int,int,int,int>
+    {
+        typedef int state;
+        typedef int iterator;
+    };
+#endif
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#   undef n_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/reverse_iter_fold_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/reverse_iter_fold_impl.hpp
new file mode 100644
index 0000000..83182a2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/reverse_iter_fold_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_AUX_ITER_FOLD_BACKWARD_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_ITER_FOLD_BACKWARD_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/next_prior.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    || defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+#       include <boost/mpl/if.hpp>
+#       include <boost/type_traits/is_same.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER reverse_iter_fold_impl.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   define AUX778076_FOLD_IMPL_OP(iter) iter
+#   define AUX778076_FOLD_IMPL_NAME_PREFIX reverse_iter_fold
+#   include <boost/mpl/aux_/reverse_fold_impl_body.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_ITER_FOLD_BACKWARD_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/sequence_wrapper.hpp b/gatb-core/thirdparty/boost/mpl/aux_/sequence_wrapper.hpp
new file mode 100644
index 0000000..3f5e553
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/sequence_wrapper.hpp
@@ -0,0 +1,292 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/static_constant.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/arithmetic/sub.hpp>
+#   include <boost/preprocessor/tuple/elem.hpp>
+#   include <boost/preprocessor/enum_params_with_a_default.hpp>
+#   include <boost/preprocessor/enum_params.hpp>
+#   include <boost/preprocessor/enum.hpp>
+#   include <boost/preprocessor/repeat.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+#if defined(BOOST_MPL_PREPROCESSING_MODE)
+#   undef LONG_MAX
+#endif
+
+namespace boost { namespace mpl {
+
+#if !defined(AUX778076_SEQUENCE_BASE_NAME)
+#   define AUX778076_SEQUENCE_BASE_NAME AUX778076_SEQUENCE_NAME
+#endif
+
+#if !defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
+
+#   define AUX778076_SEQUENCE_PARAM_NAME T
+#   define AUX778076_SEQUENCE_TEMPLATE_PARAM typename T
+#   define AUX778076_SEQUENCE_DEFAULT na
+
+#   define AUX778076_SEQUENCE_NAME_N(n) \
+    BOOST_PP_CAT(AUX778076_SEQUENCE_BASE_NAME,n) \
+    /**/
+
+#   define AUX778076_SEQUENCE_PARAMS() \
+    BOOST_PP_ENUM_PARAMS( \
+          AUX778076_SEQUENCE_LIMIT \
+        , AUX778076_SEQUENCE_TEMPLATE_PARAM \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_ARGS() \
+    BOOST_PP_ENUM_PARAMS( \
+          AUX778076_SEQUENCE_LIMIT \
+        , T \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_DEFAULT_PARAMS() \
+     BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \
+          AUX778076_SEQUENCE_LIMIT \
+        , AUX778076_SEQUENCE_TEMPLATE_PARAM \
+        , AUX778076_SEQUENCE_DEFAULT \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_N_PARAMS(n) \
+    BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \
+    /**/
+
+#   define AUX778076_SEQUENCE_N_ARGS(n) \
+    BOOST_PP_ENUM_PARAMS(n, T) \
+    /**/
+
+#   define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \
+    BOOST_PP_ENUM_PARAMS(n, T) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_PP_ENUM( \
+          BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \
+        , BOOST_PP_TUPLE_ELEM_3_2 \
+        , AUX778076_SEQUENCE_DEFAULT \
+        ) \
+    /**/
+
+#else // AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+
+#   define AUX778076_SEQUENCE_PARAM_NAME C
+#   define AUX778076_SEQUENCE_TEMPLATE_PARAM BOOST_MPL_AUX_NTTP_DECL(long, C)
+#   define AUX778076_SEQUENCE_DEFAULT LONG_MAX
+
+#   define AUX778076_SEQUENCE_PARAMS() \
+    typename T, BOOST_PP_ENUM_PARAMS( \
+          AUX778076_SEQUENCE_LIMIT \
+        , AUX778076_SEQUENCE_TEMPLATE_PARAM \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_ARGS() \
+    T, BOOST_PP_ENUM_PARAMS( \
+          AUX778076_SEQUENCE_LIMIT \
+        , C \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_DEFAULT_PARAMS() \
+    typename T, \
+    BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \
+          AUX778076_SEQUENCE_LIMIT \
+        , AUX778076_SEQUENCE_TEMPLATE_PARAM \
+        , AUX778076_SEQUENCE_DEFAULT \
+        ) \
+    /**/
+
+#   define AUX778076_SEQUENCE_N_PARAMS(n) \
+    typename T BOOST_PP_COMMA_IF(n) \
+    BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \
+    /**/
+
+#   if !defined(AUX778076_SEQUENCE_CONVERT_CN_TO)
+#       define AUX778076_SEQUENCE_CONVERT_CN_TO(z,n,TARGET) BOOST_PP_CAT(C,n)
+#   endif
+
+#   define AUX778076_SEQUENCE_N_ARGS(n) \
+    T BOOST_PP_COMMA_IF(n) \
+    BOOST_PP_ENUM(n,AUX778076_SEQUENCE_CONVERT_CN_TO,T) \
+    /**/
+
+#   define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \
+    T, BOOST_PP_ENUM_PARAMS(n, C) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_PP_ENUM( \
+          BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \
+        , BOOST_PP_TUPLE_ELEM_3_2 \
+        , AUX778076_SEQUENCE_DEFAULT \
+        ) \
+    /**/
+
+#endif // AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+// forward declaration
+template<
+      AUX778076_SEQUENCE_DEFAULT_PARAMS()
+    >
+struct AUX778076_SEQUENCE_NAME;
+#else
+namespace aux {
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > 
+struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser);
+}
+#endif
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, AUX778076_SEQUENCE_LIMIT, <boost/mpl/aux_/sequence_wrapper.hpp>))
+#include BOOST_PP_ITERATE()
+
+// real C++ version is already taken care of
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+namespace aux {
+// ???_count_args
+#define AUX778076_COUNT_ARGS_PREFIX         AUX778076_SEQUENCE_NAME
+#define AUX778076_COUNT_ARGS_DEFAULT        AUX778076_SEQUENCE_DEFAULT
+#define AUX778076_COUNT_ARGS_PARAM_NAME     AUX778076_SEQUENCE_PARAM_NAME
+#define AUX778076_COUNT_ARGS_TEMPLATE_PARAM AUX778076_SEQUENCE_TEMPLATE_PARAM
+#define AUX778076_COUNT_ARGS_ARITY          AUX778076_SEQUENCE_LIMIT
+#define AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES
+#include <boost/mpl/aux_/count_args.hpp>
+
+template<
+      AUX778076_SEQUENCE_PARAMS()
+    >
+struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)
+{
+    typedef aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_count_args)<
+          BOOST_PP_ENUM_PARAMS(AUX778076_SEQUENCE_LIMIT, AUX778076_SEQUENCE_PARAM_NAME)
+        > arg_num_;
+    
+    typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)< arg_num_::value >
+        ::template result_< AUX778076_SEQUENCE_ARGS() >::type type;
+};
+
+} // namespace aux
+
+template<
+      AUX778076_SEQUENCE_DEFAULT_PARAMS()
+    >
+struct AUX778076_SEQUENCE_NAME
+    : aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<
+          AUX778076_SEQUENCE_ARGS()
+        >::type
+{
+    typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<
+          AUX778076_SEQUENCE_ARGS()
+        >::type type;
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#   undef AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS
+#   undef AUX778076_SEQUENCE_N_ARGS
+#   undef AUX778076_SEQUENCE_CONVERT_CN_TO
+#   undef AUX778076_SEQUENCE_N_PARAMS
+#   undef AUX778076_SEQUENCE_DEFAULT_PARAMS
+#   undef AUX778076_SEQUENCE_ARGS
+#   undef AUX778076_SEQUENCE_PARAMS
+#   undef AUX778076_SEQUENCE_NAME_N
+#   undef AUX778076_SEQUENCE_DEFAULT
+#   undef AUX778076_SEQUENCE_TEMPLATE_PARAM
+#   undef AUX778076_SEQUENCE_PARAM_NAME
+#   undef AUX778076_SEQUENCE_LIMIT
+#   undef AUX778076_SEQUENCE_BASE_NAME
+#   undef AUX778076_SEQUENCE_NAME
+#   undef AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+
+}}
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+#if i_ == AUX778076_SEQUENCE_LIMIT
+
+/// primary template (not a specialization!)
+template<
+      AUX778076_SEQUENCE_N_PARAMS(i_)
+    >
+struct AUX778076_SEQUENCE_NAME
+    : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >
+{
+    typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
+};
+
+#else
+
+template<
+      AUX778076_SEQUENCE_N_PARAMS(i_)
+    >
+struct AUX778076_SEQUENCE_NAME< AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(i_) >
+    : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >
+{
+#if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
+    typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
+#else
+    typedef AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
+#endif
+};
+
+#endif // i_ == AUX778076_SEQUENCE_LIMIT
+
+#   else
+
+namespace aux {
+
+template<>
+struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)<i_>
+{
+    template<
+          AUX778076_SEQUENCE_PARAMS()
+        >
+    struct result_
+    {
+#if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
+        typedef typename AUX778076_SEQUENCE_NAME_N(i_)<
+              AUX778076_SEQUENCE_N_ARGS(i_)
+            >::type type;
+#else
+        typedef AUX778076_SEQUENCE_NAME_N(i_)<
+              AUX778076_SEQUENCE_N_ARGS(i_)
+            >::type type;
+#endif
+    };
+};
+
+} // namespace aux
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/shift_op.hpp b/gatb-core/thirdparty/boost/mpl/aux_/shift_op.hpp
new file mode 100644
index 0000000..b9840bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/shift_op.hpp
@@ -0,0 +1,87 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/integral_c.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#endif
+
+#if !defined(AUX778076_OP_PREFIX)
+#   define AUX778076_OP_PREFIX AUX778076_OP_NAME
+#endif
+
+#define AUX778076_OP_ARITY 2
+
+#include <boost/mpl/aux_/numeric_op.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER AUX778076_OP_PREFIX.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/integral.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+namespace aux {
+template< typename T, typename Shift, T n, Shift s >
+struct BOOST_PP_CAT(AUX778076_OP_PREFIX,_wknd)
+{
+    BOOST_STATIC_CONSTANT(T, value = (n AUX778076_OP_TOKEN s));
+    typedef integral_c<T,value> type;
+};
+}
+#endif
+
+template<>
+struct AUX778076_OP_IMPL_NAME<integral_c_tag,integral_c_tag>
+{
+    template< typename N, typename S > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+        : integral_c<
+              typename N::value_type
+            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value
+                  AUX778076_OP_TOKEN BOOST_MPL_AUX_VALUE_WKND(S)::value
+                )
+            >
+#else
+        : aux::BOOST_PP_CAT(AUX778076_OP_PREFIX,_wknd)<
+              typename N::value_type
+            , typename S::value_type
+            , N::value
+            , S::value
+            >::type
+#endif
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#undef AUX778076_OP_TAG_NAME
+#undef AUX778076_OP_IMPL_NAME
+#undef AUX778076_OP_ARITY
+#undef AUX778076_OP_PREFIX
+#undef AUX778076_OP_NAME
+#undef AUX778076_OP_TOKEN
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/single_element_iter.hpp b/gatb-core/thirdparty/boost/mpl/aux_/single_element_iter.hpp
new file mode 100644
index 0000000..9aceb74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/single_element_iter.hpp
@@ -0,0 +1,118 @@
+
+#ifndef BOOST_MPL_AUX_SINGLE_ELEMENT_ITER_HPP_INCLUDED
+#define BOOST_MPL_AUX_SINGLE_ELEMENT_ITER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/advance_fwd.hpp>
+#include <boost/mpl/distance_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl { 
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+namespace aux {
+
+template< typename T, BOOST_MPL_AUX_NTTP_DECL(int, is_last_) >
+struct sel_iter;
+
+template< typename T >
+struct sel_iter<T,0>
+{
+    typedef random_access_iterator_tag category;
+    typedef sel_iter<T,1> next;
+    typedef T type;
+};
+
+template< typename T >
+struct sel_iter<T,1>
+{
+    typedef random_access_iterator_tag category;
+    typedef sel_iter<T,0> prior;
+};
+
+} // namespace aux
+
+template< typename T, BOOST_MPL_AUX_NTTP_DECL(int, is_last_), typename Distance >
+struct advance< aux::sel_iter<T,is_last_>,Distance>
+{
+    typedef aux::sel_iter<
+          T
+        , ( is_last_ + BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Distance) )
+        > type;
+};
+
+template< 
+      typename T
+    , BOOST_MPL_AUX_NTTP_DECL(int, l1)
+    , BOOST_MPL_AUX_NTTP_DECL(int, l2) 
+    >
+struct distance< aux::sel_iter<T,l1>, aux::sel_iter<T,l2> >
+    : int_<( l2 - l1 )>
+{
+};
+
+#else
+
+namespace aux {
+
+struct sel_iter_tag;
+
+template< typename T, BOOST_MPL_AUX_NTTP_DECL(int, is_last_) >
+struct sel_iter
+{
+    enum { pos_ = is_last_ };
+    typedef aux::sel_iter_tag tag;
+    typedef random_access_iterator_tag category;
+
+    typedef sel_iter<T,(is_last_ + 1)> next;
+    typedef sel_iter<T,(is_last_ - 1)> prior;
+    typedef T type;
+};
+
+} // namespace aux
+
+template<> struct advance_impl<aux::sel_iter_tag>
+{
+    template< typename Iterator, typename N > struct apply
+    {
+        enum { pos_ = Iterator::pos_, n_ = N::value };
+        typedef aux::sel_iter<
+              typename Iterator::type
+            , (pos_ + n_)
+            > type;
+    };
+};
+
+template<> struct distance_impl<aux::sel_iter_tag>
+{
+    template< typename Iter1, typename Iter2 > struct apply
+    {
+        enum { pos1_ = Iter1::pos_, pos2_ = Iter2::pos_ };
+        typedef int_<( pos2_ - pos1_ )> type;
+        BOOST_STATIC_CONSTANT(int, value = ( pos2_ - pos1_ ));
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}
+
+#endif // BOOST_MPL_AUX_SINGLE_ELEMENT_ITER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/size_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/size_impl.hpp
new file mode 100644
index 0000000..50f5ee9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/size_impl.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_AUX_SIZE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_SIZE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/distance.hpp>
+#include <boost/mpl/aux_/traits_lambda_spec.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+// default implementation; conrete sequences might override it by 
+// specializing either the 'size_impl' or the primary 'size' template
+
+template< typename Tag >
+struct size_impl
+{
+    template< typename Sequence > struct apply
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561))
+        : distance<
+              typename begin<Sequence>::type
+            , typename end<Sequence>::type
+            >
+    {
+#else
+    {
+        typedef typename distance<
+              typename begin<Sequence>::type
+            , typename end<Sequence>::type
+            >::type type;
+#endif
+    };
+};
+
+BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, size_impl)
+
+}}
+
+#endif // BOOST_MPL_AUX_SIZE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/sort_impl.hpp b/gatb-core/thirdparty/boost/mpl/aux_/sort_impl.hpp
new file mode 100644
index 0000000..3820421
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/sort_impl.hpp
@@ -0,0 +1,121 @@
+
+#ifndef BOOST_MPL_AUX_SORT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_AUX_SORT_IMPL_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/partition.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/front_inserter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/single_view.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/aux_/na.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename Seq, typename Pred >
+struct quick_sort;
+
+// agurt, 10/nov/04: for the sake of deficeint compilers 
+template< typename Pred, typename Pivot >
+struct quick_sort_pred
+{
+    template< typename T > struct apply
+    {
+        typedef typename apply2<Pred,T,Pivot>::type type;
+    };
+};
+
+template< 
+      typename Seq
+    , typename Pred
+    >
+struct quick_sort_impl
+{
+    typedef typename begin<Seq>::type pivot;
+    typedef typename partition<
+          iterator_range< 
+              typename next<pivot>::type
+            , typename end<Seq>::type
+            >
+        , protect< aux::quick_sort_pred< Pred, typename deref<pivot>::type > >
+        , back_inserter< vector<> >
+        , back_inserter< vector<> >
+        >::type partitioned;
+
+    typedef typename quick_sort< typename partitioned::first, Pred >::type part1;
+    typedef typename quick_sort< typename partitioned::second, Pred >::type part2;
+
+    typedef joint_view< 
+              joint_view< part1, single_view< typename deref<pivot>::type > >
+            , part2
+            > type;
+};
+
+template< 
+      typename Seq
+    , typename Pred
+    >
+struct quick_sort
+    : eval_if<
+          empty<Seq>
+        , identity<Seq>
+        , quick_sort_impl<Seq,Pred>
+        >
+{
+};
+
+
+template <
+      typename Sequence
+    , typename Pred
+    , typename In
+    >
+struct sort_impl
+{
+    typedef typename quick_sort< 
+          Sequence
+        , typename if_na<Pred,less<> >::type
+        >::type result_;
+        
+    typedef typename copy<result_,In>::type type;
+};
+
+template <
+      typename Sequence
+    , typename Pred
+    , typename In
+    >
+struct reverse_sort_impl
+{
+    typedef typename quick_sort< 
+          Sequence
+        , typename if_na<Pred,less<> >::type
+        >::type result_;
+        
+    typedef typename reverse_copy<result_,In>::type type;
+};
+
+}}}
+
+#endif // BOOST_MPL_AUX_SORT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/static_cast.hpp b/gatb-core/thirdparty/boost/mpl/aux_/static_cast.hpp
new file mode 100644
index 0000000..f72d1c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/static_cast.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED
+#define BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \
+ || BOOST_WORKAROUND(__GNUC__, < 3) \
+ || BOOST_WORKAROUND(__MWERKS__, <= 0x3001)
+#   define BOOST_MPL_AUX_STATIC_CAST(T, expr) (T)(expr)
+#else
+#   define BOOST_MPL_AUX_STATIC_CAST(T, expr) static_cast<T>(expr)
+#endif
+
+#endif // BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/template_arity.hpp b/gatb-core/thirdparty/boost/mpl/aux_/template_arity.hpp
new file mode 100644
index 0000000..f011159
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/template_arity.hpp
@@ -0,0 +1,189 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/ttp.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/aux_/template_arity_fwd.hpp>
+#   include <boost/mpl/int.hpp>
+#   if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+#       include <boost/mpl/aux_/type_wrapper.hpp>
+#   endif
+#   else
+#       include <boost/mpl/aux_/has_rebind.hpp>
+#   endif
+#endif
+
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER template_arity.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/range.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/seq/fold_left.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#   define AUX778076_ARITY BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
+
+namespace boost { namespace mpl { namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct arity_tag
+{
+    typedef char (&type)[N + 1];
+};
+
+#   define AUX778076_MAX_ARITY_OP(unused, state, i_) \
+    ( BOOST_PP_CAT(C,i_) > 0 ? BOOST_PP_CAT(C,i_) : state ) \
+/**/
+
+template<
+      BOOST_MPL_PP_PARAMS(AUX778076_ARITY, BOOST_MPL_AUX_NTTP_DECL(int, C))
+    >
+struct max_arity
+{
+    BOOST_STATIC_CONSTANT(int, value = 
+          BOOST_PP_SEQ_FOLD_LEFT(
+              AUX778076_MAX_ARITY_OP
+            , -1
+            , BOOST_MPL_PP_RANGE(1, AUX778076_ARITY)
+            )
+        );
+};
+
+#   undef AUX778076_MAX_ARITY_OP
+
+arity_tag<0>::type arity_helper(...);
+
+#   define BOOST_PP_ITERATION_LIMITS (1, AUX778076_ARITY)
+#   define BOOST_PP_FILENAME_1 <boost/mpl/aux_/template_arity.hpp>
+#   include BOOST_PP_ITERATE()
+
+template< typename F, BOOST_MPL_AUX_NTTP_DECL(int, N) >
+struct template_arity_impl
+{
+    BOOST_STATIC_CONSTANT(int, value = 
+          sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1
+        );
+};
+
+#   define AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION(unused, i_, F) \
+    BOOST_PP_COMMA_IF(i_) template_arity_impl<F,BOOST_PP_INC(i_)>::value \
+/**/
+
+template< typename F >
+struct template_arity
+{
+    BOOST_STATIC_CONSTANT(int, value = (
+          max_arity< BOOST_MPL_PP_REPEAT(
+              AUX778076_ARITY
+            , AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION
+            , F
+            ) >::value
+        ));
+        
+    typedef mpl::int_<value> type;
+};
+
+#   undef AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION
+
+#   undef AUX778076_ARITY
+
+}}}
+
+#   endif // BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING
+#   else // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+#   include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< bool >
+struct template_arity_impl
+{
+    template< typename F > struct result_
+        : mpl::int_<-1>
+    {
+    };
+};
+
+template<>
+struct template_arity_impl<true>
+{
+    template< typename F > struct result_
+        : F::arity
+    {
+    };
+};
+
+template< typename F >
+struct template_arity
+    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >
+        ::template result_<F>
+{
+};
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+template<>
+struct template_arity<int>
+    : mpl::int_<-1>
+{
+};
+#endif
+
+}}}
+
+#   endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      template< BOOST_MPL_PP_PARAMS(i_, typename P) > class F
+    , BOOST_MPL_PP_PARAMS(i_, typename T)
+    >
+typename arity_tag<i_>::type
+arity_helper(type_wrapper< F<BOOST_MPL_PP_PARAMS(i_, T)> >, arity_tag<i_>);
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/template_arity_fwd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/template_arity_fwd.hpp
new file mode 100644
index 0000000..19d63a3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/template_arity_fwd.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename F > struct template_arity;
+
+}}}
+
+#endif // BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/test.hpp b/gatb-core/thirdparty/boost/mpl/aux_/test.hpp
new file mode 100644
index 0000000..8d1dea6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/test.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_AUX_TEST_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/test/test_case.hpp>
+#include <boost/mpl/aux_/test/data.hpp>
+#include <boost/mpl/aux_/test/assert.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+int main()
+{
+    return boost::report_errors();
+}
+
+using namespace boost;
+using namespace mpl;
+
+#endif // BOOST_MPL_AUX_TEST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/test/assert.hpp b/gatb-core/thirdparty/boost/mpl/aux_/test/assert.hpp
new file mode 100644
index 0000000..3bd8ba0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/test/assert.hpp
@@ -0,0 +1,29 @@
+
+#ifndef BOOST_MPL_AUX_TEST_ASSERT_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEST_ASSERT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/assert.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define MPL_ASSERT(pred)                BOOST_MPL_ASSERT(pred)
+#define MPL_ASSERT_NOT(pred)            BOOST_MPL_ASSERT_NOT(pred)
+#define MPL_ASSERT_MSG(c, msg, types)   BOOST_MPL_ASSERT_MSG(c, msg, types)
+#define MPL_ASSERT_RELATION(x, rel, y)  BOOST_MPL_ASSERT_RELATION(x, rel, y)
+
+#define MPL_ASSERT_INSTANTIATION(x) \
+    enum { BOOST_PP_CAT(instantiation_test, __LINE__) = sizeof( x ) } \
+/**/
+
+#endif // BOOST_MPL_AUX_TEST_ASSERT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/test/data.hpp b/gatb-core/thirdparty/boost/mpl/aux_/test/data.hpp
new file mode 100644
index 0000000..373e6c3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/test/data.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_AUX_TEST_DATA_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEST_DATA_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/noncopyable.hpp>
+
+enum enum_ {};
+struct UDT {};
+struct incomplete;
+class abstract { public: virtual ~abstract() = 0; };
+using boost::noncopyable;
+
+#endif // BOOST_MPL_AUX_TEST_DATA_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/test/test_case.hpp b/gatb-core/thirdparty/boost/mpl/aux_/test/test_case.hpp
new file mode 100644
index 0000000..b168a00
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/test/test_case.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_AUX_TEST_TEST_CASE_HPP_INCLUDED
+#define BOOST_MPL_AUX_TEST_TEST_CASE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/cat.hpp>
+
+#define MPL_TEST_CASE() void BOOST_PP_CAT(test,__LINE__)()
+
+#endif // BOOST_MPL_AUX_TEST_TEST_CASE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/traits_lambda_spec.hpp b/gatb-core/thirdparty/boost/mpl/aux_/traits_lambda_spec.hpp
new file mode 100644
index 0000000..4a7ff26
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/traits_lambda_spec.hpp
@@ -0,0 +1,63 @@
+
+#ifndef BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED
+#define BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/sequence_tag_fwd.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+
+#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) /**/
+
+#elif !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+
+#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \
+template<> struct trait<void_> \
+{ \
+    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \
+    { \
+    }; \
+}; \
+/**/
+
+#else
+
+#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \
+template<> struct trait<void_> \
+{ \
+    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \
+    { \
+    }; \
+}; \
+template<> struct trait<int> \
+{ \
+    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \
+    { \
+        typedef int type; \
+    }; \
+}; \
+/**/
+
+#endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+
+#define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(i, trait) \
+    BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \
+    template<> struct trait<non_sequence_tag> {}; \
+/**/
+
+#endif // BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/transform_iter.hpp b/gatb-core/thirdparty/boost/mpl/aux_/transform_iter.hpp
new file mode 100644
index 0000000..e42fcc6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/transform_iter.hpp
@@ -0,0 +1,123 @@
+
+#ifndef BOOST_MPL_AUX_TRANSFORM_ITER_HPP_INCLUDED
+#define BOOST_MPL_AUX_TRANSFORM_ITER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl { 
+
+namespace aux {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename F
+    >
+struct transform_iter
+{
+    typedef Iterator base;
+    typedef forward_iterator_tag category;
+    typedef transform_iter< typename mpl::next<base>::type,LastIterator,F > next;
+    
+    typedef typename apply1<
+          F
+        , typename deref<base>::type
+        >::type type;
+};
+
+template<
+      typename LastIterator
+    , typename F
+    >
+struct transform_iter< LastIterator,LastIterator,F >
+{
+    typedef LastIterator base;
+    typedef forward_iterator_tag category;
+};
+
+#else
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename F
+    >
+struct transform_iter;
+
+template< bool >
+struct transform_iter_impl 
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename F
+        >
+    struct result_
+    {
+        typedef Iterator base;
+        typedef forward_iterator_tag category;
+        typedef transform_iter< typename mpl::next<Iterator>::type,LastIterator,F > next;
+        
+        typedef typename apply1<
+              F
+            , typename deref<Iterator>::type
+            >::type type;
+    };
+};
+
+template<>
+struct transform_iter_impl<true>
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename F
+        >
+    struct result_
+    {
+        typedef Iterator base;
+        typedef forward_iterator_tag category;
+    };
+};
+
+template<
+      typename Iterator
+    , typename LastIterator
+    , typename F
+    >
+struct transform_iter
+    : transform_iter_impl<
+          ::boost::is_same<Iterator,LastIterator>::value
+        >::template result_< Iterator,LastIterator,F >
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} // namespace aux
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, aux::transform_iter)
+
+}}
+
+#endif // BOOST_MPL_AUX_TRANSFORM_ITER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/type_wrapper.hpp b/gatb-core/thirdparty/boost/mpl/aux_/type_wrapper.hpp
new file mode 100644
index 0000000..f3ac307
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/type_wrapper.hpp
@@ -0,0 +1,47 @@
+
+#ifndef BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED
+#define BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Peter Dimov 2000-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct type_wrapper
+{
+    typedef T type;
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+// agurt 08/may/03: a complicated way to extract the wrapped type; need it 
+// mostly for the sake of GCC (3.2.x), which ICEs if you try to extract the 
+// nested 'type' from 'type_wrapper<T>' when the latter was the result of a
+// 'typeof' expression
+template< typename T > struct wrapped_type;
+
+template< typename T > struct wrapped_type< type_wrapper<T> >
+{
+    typedef T type;
+};
+#else
+template< typename W > struct wrapped_type
+{
+    typedef typename W::type type;
+};
+#endif
+
+}}}
+
+#endif // BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/unwrap.hpp b/gatb-core/thirdparty/boost/mpl/aux_/unwrap.hpp
new file mode 100644
index 0000000..caeb97d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/unwrap.hpp
@@ -0,0 +1,51 @@
+
+#ifndef BOOST_MPL_AUX_UNWRAP_HPP_INCLUDED
+#define BOOST_MPL_AUX_UNWRAP_HPP_INCLUDED
+
+// Copyright Peter Dimov and Multi Media Ltd 2001, 2002
+// Copyright David Abrahams 2001
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/ref.hpp>
+#include <boost/mpl/aux_/config/gpu.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename F >
+BOOST_MPL_CFG_GPU_ENABLED
+inline
+F& unwrap(F& f, long)
+{
+    return f;
+}
+
+template< typename F >
+BOOST_MPL_CFG_GPU_ENABLED
+inline
+F&
+unwrap(reference_wrapper<F>& f, int)
+{
+    return f;
+}
+
+template< typename F >
+BOOST_MPL_CFG_GPU_ENABLED
+inline
+F&
+unwrap(reference_wrapper<F> const& f, int)
+{
+    return f;
+}
+
+}}}
+
+#endif // BOOST_MPL_AUX_UNWRAP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/value_wknd.hpp b/gatb-core/thirdparty/boost/mpl/aux_/value_wknd.hpp
new file mode 100644
index 0000000..23fefde
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/value_wknd.hpp
@@ -0,0 +1,89 @@
+
+#ifndef BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED
+#define BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/config/integral.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS) \
+    || defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+
+#   include <boost/mpl/int.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+template< typename C_ > struct value_wknd
+    : C_
+{
+};
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+template<> struct value_wknd<int>
+    : int_<1>
+{
+    using int_<1>::value;
+};
+#endif
+}}}
+
+
+#if !defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+#   define BOOST_MPL_AUX_VALUE_WKND(C) \
+    ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::aux::value_wknd< C > \
+/**/
+#    define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) BOOST_MPL_AUX_VALUE_WKND(C)
+#else
+#   define BOOST_MPL_AUX_VALUE_WKND(C) C
+#   define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) \
+    ::boost::mpl::aux::value_wknd< C > \
+/**/
+#endif
+
+#else // BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS
+
+#   define BOOST_MPL_AUX_VALUE_WKND(C) C
+#   define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) C
+
+#endif
+
+#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+#   define BOOST_MPL_AUX_NESTED_VALUE_WKND(T, C) \
+    BOOST_MPL_AUX_STATIC_CAST(T, C::value) \
+/**/
+#else
+#   define BOOST_MPL_AUX_NESTED_VALUE_WKND(T, C) \
+    BOOST_MPL_AUX_VALUE_WKND(C)::value \
+/**/
+#endif
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct value_type_wknd
+{
+    typedef typename T::value_type type;
+};
+
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+template<> struct value_type_wknd<int>
+{
+    typedef int type;
+};
+#endif
+
+}}}
+
+#endif // BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/aux_/yes_no.hpp b/gatb-core/thirdparty/boost/mpl/aux_/yes_no.hpp
new file mode 100644
index 0000000..21a18a2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/aux_/yes_no.hpp
@@ -0,0 +1,58 @@
+
+#ifndef BOOST_MPL_AUX_YES_NO_HPP_INCLUDED
+#define BOOST_MPL_AUX_YES_NO_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/arrays.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+
+namespace boost { namespace mpl { namespace aux {
+
+typedef char (&no_tag)[1];
+typedef char (&yes_tag)[2];
+
+template< bool C_ > struct yes_no_tag
+{
+    typedef no_tag type;
+};
+
+template<> struct yes_no_tag<true>
+{
+    typedef yes_tag type;
+};
+
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, n) > struct weighted_tag
+{
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    typedef char (&type)[n];
+#else
+    char buf[n];
+    typedef weighted_tag type;
+#endif
+};
+
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+template<> struct weighted_tag<0>
+{
+    typedef char (&type)[1];
+};
+#endif
+
+}}}
+
+#endif // BOOST_MPL_AUX_YES_NO_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/back.hpp b/gatb-core/thirdparty/boost/mpl/back.hpp
new file mode 100644
index 0000000..2778c42
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/back.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_BACK_HPP_INCLUDED
+#define BOOST_MPL_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/back_fwd.hpp>
+#include <boost/mpl/aux_/back_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct back
+    : back_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,back,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, back)
+
+}}
+
+#endif // BOOST_MPL_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/back_fwd.hpp b/gatb-core/thirdparty/boost/mpl/back_fwd.hpp
new file mode 100644
index 0000000..119722c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/back_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_BACK_FWD_HPP_INCLUDED
+#define BOOST_MPL_BACK_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct back_impl;
+template< typename Sequence > struct back;
+
+}}
+
+#endif // BOOST_MPL_BACK_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/back_inserter.hpp b/gatb-core/thirdparty/boost/mpl/back_inserter.hpp
new file mode 100644
index 0000000..8fc4083
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/back_inserter.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_BACK_INSERTER_HPP_INCLUDED
+#define BOOST_MPL_BACK_INSERTER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/inserter.hpp>
+
+namespace boost {
+namespace mpl {
+
+template<
+      typename Sequence
+    >
+struct back_inserter
+    : inserter< Sequence,push_back<> >
+{
+};
+
+}}
+
+#endif // BOOST_MPL_BACK_INSERTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/base.hpp b/gatb-core/thirdparty/boost/mpl/base.hpp
new file mode 100644
index 0000000..8f43849
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/base.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_BASE_HPP_INCLUDED
+#define BOOST_MPL_BASE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct base
+{
+    typedef typename T::base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,base,(T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, base)
+
+}}
+
+#endif // BOOST_MPL_BASE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/begin.hpp b/gatb-core/thirdparty/boost/mpl/begin.hpp
new file mode 100644
index 0000000..15bdf7e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/begin.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_BEGIN_HPP_INCLUDED
+#define BOOST_MPL_BEGIN_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+
+#endif // BOOST_MPL_BEGIN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/begin_end.hpp b/gatb-core/thirdparty/boost/mpl/begin_end.hpp
new file mode 100644
index 0000000..b7074af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/begin_end.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_BEGIN_END_HPP_INCLUDED
+#define BOOST_MPL_BEGIN_END_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/aux_/begin_end_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+// agurt, 13/sep/02: switched from inheritance to typedef; MSVC is more
+// happy this way (less ETI-related errors), and it doesn't affect 
+// anything else
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct begin
+{
+    typedef typename sequence_tag<Sequence>::type tag_;
+    typedef typename begin_impl< tag_ >
+        ::template apply< Sequence >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,begin,(Sequence))
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct end
+{
+    typedef typename sequence_tag<Sequence>::type tag_;
+    typedef typename end_impl< tag_ >
+        ::template apply< Sequence >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,end,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, begin)
+BOOST_MPL_AUX_NA_SPEC(1, end)
+
+}}
+
+#endif // BOOST_MPL_BEGIN_END_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/begin_end_fwd.hpp b/gatb-core/thirdparty/boost/mpl/begin_end_fwd.hpp
new file mode 100644
index 0000000..70ef9ef
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/begin_end_fwd.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED
+#define BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct begin_impl;
+template< typename Tag > struct end_impl;
+
+template< typename Sequence > struct begin;
+template< typename Sequence > struct end;
+
+}}
+
+#endif // BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bind.hpp b/gatb-core/thirdparty/boost/mpl/bind.hpp
new file mode 100644
index 0000000..63ee3f2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bind.hpp
@@ -0,0 +1,551 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_BIND_HPP_INCLUDED
+#define BOOST_MPL_BIND_HPP_INCLUDED
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/bind_fwd.hpp>
+#   include <boost/mpl/placeholders.hpp>
+#   include <boost/mpl/next.hpp>
+#   include <boost/mpl/protect.hpp>
+#   include <boost/mpl/apply_wrap.hpp>
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/arity_spec.hpp>
+#   include <boost/mpl/aux_/type_wrapper.hpp>
+#   include <boost/mpl/aux_/yes_no.hpp>
+#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#       include <boost/type_traits/is_reference.hpp>
+#   endif 
+#endif
+
+#include <boost/mpl/aux_/config/bind.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   if defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+#       define BOOST_MPL_PREPROCESSED_HEADER basic_bind.hpp
+#   else
+#       define BOOST_MPL_PREPROCESSED_HEADER bind.hpp
+#   endif
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>
+#   include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/ext_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/preprocessor/add.hpp>
+#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/ttp.hpp>
+#   include <boost/mpl/aux_/config/dtp.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/inc.hpp>
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+#   define AUX778076_APPLY \
+    BOOST_PP_CAT(apply_wrap,BOOST_MPL_LIMIT_METAFUNCTION_ARITY) \
+    /**/
+
+#   if defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)
+#       define AUX778076_DMC_PARAM() , int dummy_
+#   else
+#       define AUX778076_DMC_PARAM()
+#   endif
+
+#   define AUX778076_BIND_PARAMS(param) \
+    BOOST_MPL_PP_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        ) \
+    /**/
+
+#   define AUX778076_BIND_DEFAULT_PARAMS(param, value) \
+    BOOST_MPL_PP_DEFAULT_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        , value \
+        ) \
+    /**/
+
+#   define AUX778076_BIND_N_PARAMS(n, param) \
+    BOOST_PP_COMMA_IF(n) BOOST_MPL_PP_PARAMS(n, param) \
+    /**/
+
+#   define AUX778076_BIND_N_SPEC_PARAMS(n, param, def) \
+    BOOST_PP_COMMA_IF(n) \
+    BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \
+    /**/
+
+#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+#   define AUX778076_BIND_NESTED_DEFAULT_PARAMS(param, value) \
+    AUX778076_BIND_DEFAULT_PARAMS(param, value) \
+    /**/
+#else
+#   define AUX778076_BIND_NESTED_DEFAULT_PARAMS(param, value) \
+    AUX778076_BIND_PARAMS(param) \
+    /**/
+#endif
+
+namespace aux {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename T, AUX778076_BIND_PARAMS(typename U)
+    >
+struct resolve_bind_arg
+{
+    typedef T type;
+};
+
+#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+
+template<
+      typename T
+    , typename Arg
+    >
+struct replace_unnamed_arg
+{
+    typedef Arg next;
+    typedef T type;
+};
+
+template<
+      typename Arg
+    >
+struct replace_unnamed_arg< arg<-1>,Arg >
+{
+    typedef typename Arg::next next;
+    typedef Arg type;
+};
+
+#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT
+
+template<
+      BOOST_MPL_AUX_NTTP_DECL(int, N), AUX778076_BIND_PARAMS(typename U)
+    >
+struct resolve_bind_arg< arg<N>,AUX778076_BIND_PARAMS(U) >
+{
+    typedef typename AUX778076_APPLY<mpl::arg<N>, AUX778076_BIND_PARAMS(U)>::type type;
+};
+
+#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)
+template<
+      typename F, AUX778076_BIND_PARAMS(typename T), AUX778076_BIND_PARAMS(typename U)
+    >
+struct resolve_bind_arg< bind<F,AUX778076_BIND_PARAMS(T)>,AUX778076_BIND_PARAMS(U) >
+{
+    typedef bind<F,AUX778076_BIND_PARAMS(T)> f_;
+    typedef typename AUX778076_APPLY<f_, AUX778076_BIND_PARAMS(U)>::type type;
+};
+#endif
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+// agurt, 15/jan/02: it's not a intended to be used as a function class, and 
+// MSVC6.5 has problems with 'apply' name here (the code compiles, but doesn't
+// work), so I went with the 'result_' here, and in all other similar cases
+template< bool >
+struct resolve_arg_impl
+{
+    template< typename T, AUX778076_BIND_PARAMS(typename U) > struct result_
+    {
+        typedef T type;
+    };
+};
+
+template<> 
+struct resolve_arg_impl<true>
+{
+    template< typename T, AUX778076_BIND_PARAMS(typename U) > struct result_
+    {
+        typedef typename AUX778076_APPLY<
+              T
+            , AUX778076_BIND_PARAMS(U)
+            >::type type;
+    };
+};
+
+// for 'resolve_bind_arg'
+template< typename T > struct is_bind_template;
+
+template< 
+      typename T, AUX778076_BIND_PARAMS(typename U)
+    >
+struct resolve_bind_arg
+    : resolve_arg_impl< is_bind_template<T>::value >
+            ::template result_< T,AUX778076_BIND_PARAMS(U) >
+{
+};
+
+#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+
+template< typename T > 
+struct replace_unnamed_arg_impl
+{
+    template< typename Arg > struct result_
+    {
+        typedef Arg next;
+        typedef T type;
+    };
+};
+
+template<> 
+struct replace_unnamed_arg_impl< arg<-1> >
+{
+    template< typename Arg > struct result_
+    {
+        typedef typename next<Arg>::type next;
+        typedef Arg type;
+    };
+};
+
+template< typename T, typename Arg > 
+struct replace_unnamed_arg
+    : replace_unnamed_arg_impl<T>::template result_<Arg>
+{
+};
+
+#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT
+
+// agurt, 10/mar/02: the forward declaration has to appear before any of
+// 'is_bind_helper' overloads, otherwise MSVC6.5 issues an ICE on it
+template< BOOST_MPL_AUX_NTTP_DECL(int, arity_) > struct bind_chooser;
+
+aux::no_tag is_bind_helper(...);
+template< typename T > aux::no_tag is_bind_helper(protect<T>*);
+
+// overload for "main" form
+// agurt, 15/mar/02: MSVC 6.5 fails to properly resolve the overload 
+// in case if we use 'aux::type_wrapper< bind<...> >' here, and all 
+// 'bind' instantiations form a complete type anyway
+#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)
+template<
+      typename F, AUX778076_BIND_PARAMS(typename T)
+    >
+aux::yes_tag is_bind_helper(bind<F,AUX778076_BIND_PARAMS(T)>*);
+#endif
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
+aux::yes_tag is_bind_helper(arg<N>*);
+
+template< bool is_ref_ = true >
+struct is_bind_template_impl
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value = false);
+    };
+};
+
+template<>
+struct is_bind_template_impl<false>
+{
+    template< typename T > struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value = 
+              sizeof(aux::is_bind_helper(static_cast<T*>(0))) 
+                == sizeof(aux::yes_tag)
+            );
+    };
+};
+
+template< typename T > struct is_bind_template
+    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >
+        ::template result_<T>
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} // namespace aux
+
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/bind.hpp>))
+#include BOOST_PP_ITERATE()
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS)
+/// if_/eval_if specializations
+#   define AUX778076_SPEC_NAME if_
+#   define BOOST_PP_ITERATION_PARAMS_1 (3,(3, 3, <boost/mpl/bind.hpp>))
+#   include BOOST_PP_ITERATE()
+
+#if !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)
+#   define AUX778076_SPEC_NAME eval_if
+#   define BOOST_PP_ITERATION_PARAMS_1 (3,(3, 3, <boost/mpl/bind.hpp>))
+#   include BOOST_PP_ITERATE()
+#endif
+#endif
+
+// real C++ version is already taken care of
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)
+
+namespace aux {
+// apply_count_args
+#define AUX778076_COUNT_ARGS_PREFIX bind
+#define AUX778076_COUNT_ARGS_DEFAULT na
+#define AUX778076_COUNT_ARGS_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#include <boost/mpl/aux_/count_args.hpp>
+}
+
+// bind
+template<
+      typename F, AUX778076_BIND_PARAMS(typename T) AUX778076_DMC_PARAM()
+    >
+struct bind
+    : aux::bind_chooser<
+          aux::bind_count_args<AUX778076_BIND_PARAMS(T)>::value
+        >::template result_< F,AUX778076_BIND_PARAMS(T) >::type
+{
+};
+
+BOOST_MPL_AUX_ARITY_SPEC(
+      BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
+    , bind
+    )
+
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(
+      BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
+    , bind
+    )
+
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#   undef AUX778076_BIND_NESTED_DEFAULT_PARAMS
+#   undef AUX778076_BIND_N_SPEC_PARAMS
+#   undef AUX778076_BIND_N_PARAMS
+#   undef AUX778076_BIND_DEFAULT_PARAMS
+#   undef AUX778076_BIND_PARAMS
+#   undef AUX778076_DMC_PARAM
+#   undef AUX778076_APPLY
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_BIND_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+
+#   define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if defined(AUX778076_SPEC_NAME)
+
+// lazy metafunction specialization
+template< template< BOOST_MPL_PP_PARAMS(i_, typename T) > class F, typename Tag >
+struct BOOST_PP_CAT(quote,i_);
+
+template< BOOST_MPL_PP_PARAMS(i_, typename T) > struct AUX778076_SPEC_NAME;
+
+template<
+      typename Tag AUX778076_BIND_N_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(bind,i_)< 
+      BOOST_PP_CAT(quote,i_)<AUX778076_SPEC_NAME,Tag>
+    AUX778076_BIND_N_PARAMS(i_,T)
+    >
+{
+    template<
+          AUX778076_BIND_NESTED_DEFAULT_PARAMS(typename U, na)
+        >
+    struct apply
+    {
+     private:
+        typedef mpl::arg<1> n1;
+#       define BOOST_PP_ITERATION_PARAMS_2 (3,(1, i_, <boost/mpl/bind.hpp>))
+#       include BOOST_PP_ITERATE()
+
+        typedef typename AUX778076_SPEC_NAME<
+              typename t1::type
+            , BOOST_MPL_PP_EXT_PARAMS(2, BOOST_PP_INC(i_), t)
+            >::type f_;
+
+     public:
+        typedef typename f_::type type;
+    };
+};
+
+#undef AUX778076_SPEC_NAME
+
+#else // AUX778076_SPEC_NAME
+
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()
+    >
+struct BOOST_PP_CAT(bind,i_)
+{
+    template<
+          AUX778076_BIND_NESTED_DEFAULT_PARAMS(typename U, na)
+        >
+    struct apply
+    {
+     private:
+#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+
+        typedef aux::replace_unnamed_arg< F,mpl::arg<1> > r0;
+        typedef typename r0::type a0;
+        typedef typename r0::next n1;
+        typedef typename aux::resolve_bind_arg<a0,AUX778076_BIND_PARAMS(U)>::type f_;
+        ///
+#   else
+        typedef typename aux::resolve_bind_arg<F,AUX778076_BIND_PARAMS(U)>::type f_;
+
+#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT
+
+#   if i_ > 0
+#       define BOOST_PP_ITERATION_PARAMS_2 (3,(1, i_, <boost/mpl/bind.hpp>))
+#       include BOOST_PP_ITERATE()
+#   endif
+
+     public:
+
+#   define AUX778076_ARG(unused, i_, t) \
+    BOOST_PP_COMMA_IF(i_) \
+    typename BOOST_PP_CAT(t,BOOST_PP_INC(i_))::type \
+/**/
+
+        typedef typename BOOST_PP_CAT(apply_wrap,i_)<
+              f_ 
+            BOOST_PP_COMMA_IF(i_) BOOST_MPL_PP_REPEAT(i_, AUX778076_ARG, t)
+            >::type type;
+
+#   undef AUX778076_ARG
+    };
+};
+
+namespace aux {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T), AUX778076_BIND_PARAMS(typename U)
+    >
+struct resolve_bind_arg<
+      BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)>,AUX778076_BIND_PARAMS(U)
+    >
+{
+    typedef BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)> f_;
+    typedef typename AUX778076_APPLY<f_, AUX778076_BIND_PARAMS(U)>::type type;
+};
+
+#else
+
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T)
+    >
+aux::yes_tag
+is_bind_helper(BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)>*);
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} // namespace aux
+
+BOOST_MPL_AUX_ARITY_SPEC(BOOST_PP_INC(i_), BOOST_PP_CAT(bind,i_))
+BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(BOOST_PP_INC(i_), BOOST_PP_CAT(bind,i_))
+
+#   if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    
+#if i_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+/// primary template (not a specialization!)
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()
+    >
+struct bind
+    : BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T) >
+{
+};
+#else
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()
+    >
+struct bind< F AUX778076_BIND_N_SPEC_PARAMS(i_, T, na) >
+    : BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T) >
+{
+};
+#endif
+
+#   else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+namespace aux {
+
+template<>
+struct bind_chooser<i_>
+{
+    template<
+          typename F, AUX778076_BIND_PARAMS(typename T)
+        >
+    struct result_
+    {
+        typedef BOOST_PP_CAT(bind,i_)< F AUX778076_BIND_N_PARAMS(i_,T) > type;
+    };
+};
+
+} // namespace aux
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#   endif // BOOST_MPL_CFG_NO_BIND_TEMPLATE
+
+#endif // AUX778076_SPEC_NAME
+
+#   undef i_
+
+///// iteration, depth == 2
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+
+#   define j_ BOOST_PP_FRAME_ITERATION(2)
+#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+
+        typedef aux::replace_unnamed_arg< BOOST_PP_CAT(T,j_),BOOST_PP_CAT(n,j_) > BOOST_PP_CAT(r,j_);
+        typedef typename BOOST_PP_CAT(r,j_)::type BOOST_PP_CAT(a,j_);
+        typedef typename BOOST_PP_CAT(r,j_)::next BOOST_PP_CAT(n,BOOST_PP_INC(j_));
+        typedef aux::resolve_bind_arg<BOOST_PP_CAT(a,j_), AUX778076_BIND_PARAMS(U)> BOOST_PP_CAT(t,j_);
+        ///
+#   else
+        typedef aux::resolve_bind_arg< BOOST_PP_CAT(T,j_),AUX778076_BIND_PARAMS(U)> BOOST_PP_CAT(t,j_);
+
+#   endif
+#   undef j_
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/bind_fwd.hpp b/gatb-core/thirdparty/boost/mpl/bind_fwd.hpp
new file mode 100644
index 0000000..4746edd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bind_fwd.hpp
@@ -0,0 +1,99 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_BIND_FWD_HPP_INCLUDED
+#define BOOST_MPL_BIND_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/aux_/na.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/bind.hpp>
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER bind_fwd.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>
+
+#   include <boost/preprocessor/comma_if.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+
+#   if defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)
+#       define AUX778076_DMC_PARAM() , int dummy_ = 0
+#   else
+#       define AUX778076_DMC_PARAM()
+#   endif
+
+#   define AUX778076_BIND_DEFAULT_PARAMS(param, value) \
+    BOOST_MPL_PP_DEFAULT_PARAMS( \
+          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
+        , param \
+        , value \
+        ) \
+    AUX778076_DMC_PARAM() \
+    /**/
+
+#   define AUX778076_BIND_N_PARAMS(n, param) \
+    BOOST_PP_COMMA_IF(n) BOOST_MPL_PP_PARAMS(n, param) \
+    AUX778076_DMC_PARAM() \
+    /**/
+
+#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)
+template<
+      typename F, AUX778076_BIND_DEFAULT_PARAMS(typename T, na)
+    >
+struct bind;
+#endif
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/bind_fwd.hpp>))
+#include BOOST_PP_ITERATE()
+
+#   undef AUX778076_BIND_N_PARAMS
+#   undef AUX778076_BIND_DEFAULT_PARAMS
+#   undef AUX778076_DMC_PARAM
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_BIND_FWD_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      typename F AUX778076_BIND_N_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(bind,i_);
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/bitand.hpp b/gatb-core/thirdparty/boost/mpl/bitand.hpp
new file mode 100644
index 0000000..9c31c79
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bitand.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_BITAND_HPP_INCLUDED
+#define BOOST_MPL_BITAND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2009
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// agurt, 23/jan/10: workaround a conflict with <iso646.h> header's 
+// macros, see http://tinyurl.com/ycwdxco; 'defined(bitand)'
+// has to be checked in a separate condition, otherwise GCC complains 
+// about 'bitand' being an alternative token
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(bitand)
+#   pragma push_macro("bitand")
+#   undef bitand
+#   define bitand(x)
+#endif
+#endif
+#endif
+
+#define AUX778076_OP_NAME   bitand_
+#define AUX778076_OP_PREFIX bitand
+#define AUX778076_OP_TOKEN  &
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(bitand)
+#   pragma pop_macro("bitand")
+#endif
+#endif
+#endif
+
+#endif // BOOST_MPL_BITAND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bitor.hpp b/gatb-core/thirdparty/boost/mpl/bitor.hpp
new file mode 100644
index 0000000..f009743
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bitor.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_BITOR_HPP_INCLUDED
+#define BOOST_MPL_BITOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2009
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// agurt, 23/jan/10: workaround a conflict with <iso646.h> header's 
+// macros, see http://tinyurl.com/ycwdxco; 'defined(bitor)'
+// has to be checked in a separate condition, otherwise GCC complains 
+// about 'bitor' being an alternative token
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(bitor)
+#   pragma push_macro("bitor")
+#   undef bitor
+#   define bitor(x)
+#endif
+#endif
+#endif
+
+#define AUX778076_OP_NAME   bitor_
+#define AUX778076_OP_PREFIX bitor
+#define AUX778076_OP_TOKEN  |
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(bitor)
+#   pragma pop_macro("bitor")
+#endif
+#endif
+#endif
+
+#endif // BOOST_MPL_BITOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bitwise.hpp b/gatb-core/thirdparty/boost/mpl/bitwise.hpp
new file mode 100644
index 0000000..9deb23e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bitwise.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_BITWISE_HPP_INCLUDED
+#define BOOST_MPL_BITWISE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bitand.hpp>
+#include <boost/mpl/bitor.hpp>
+#include <boost/mpl/bitxor.hpp>
+#include <boost/mpl/shift_left.hpp>
+#include <boost/mpl/shift_right.hpp>
+
+#endif // BOOST_MPL_BITWISE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bitxor.hpp b/gatb-core/thirdparty/boost/mpl/bitxor.hpp
new file mode 100644
index 0000000..7f98f17
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bitxor.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_BITXOR_HPP_INCLUDED
+#define BOOST_MPL_BITXOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME   bitxor_
+#define AUX778076_OP_PREFIX bitxor
+#define AUX778076_OP_TOKEN  ^
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_BITXOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bool.hpp b/gatb-core/thirdparty/boost/mpl/bool.hpp
new file mode 100644
index 0000000..0a6180c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bool.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_BOOL_HPP_INCLUDED
+#define BOOST_MPL_BOOL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool_fwd.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< bool C_ > struct bool_
+{
+    BOOST_STATIC_CONSTANT(bool, value = C_);
+    typedef integral_c_tag tag;
+    typedef bool_ type;
+    typedef bool value_type;
+    BOOST_CONSTEXPR operator bool() const { return this->value; }
+};
+
+#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+template< bool C_ >
+bool const bool_<C_>::value;
+#endif
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+#endif // BOOST_MPL_BOOL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/bool_fwd.hpp b/gatb-core/thirdparty/boost/mpl/bool_fwd.hpp
new file mode 100644
index 0000000..e629252
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/bool_fwd.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_BOOL_FWD_HPP_INCLUDED
+#define BOOST_MPL_BOOL_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< bool C_ > struct bool_;
+
+// shorcuts
+typedef bool_<true> true_;
+typedef bool_<false> false_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+BOOST_MPL_AUX_ADL_BARRIER_DECL(bool_)
+BOOST_MPL_AUX_ADL_BARRIER_DECL(true_)
+BOOST_MPL_AUX_ADL_BARRIER_DECL(false_)
+
+#endif // BOOST_MPL_BOOL_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/char.hpp b/gatb-core/thirdparty/boost/mpl/char.hpp
new file mode 100644
index 0000000..08828c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/char.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_CHAR_HPP_INCLUDED
+#define BOOST_MPL_CHAR_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/char_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE char
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_CHAR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/char_fwd.hpp b/gatb-core/thirdparty/boost/mpl/char_fwd.hpp
new file mode 100644
index 0000000..442d0a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/char_fwd.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+#define BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(char, N) > struct char_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(char_)
+
+#endif // BOOST_MPL_CHAR_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/clear.hpp b/gatb-core/thirdparty/boost/mpl/clear.hpp
new file mode 100644
index 0000000..c6b95ed
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/clear.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_CLEAR_HPP_INCLUDED
+#define BOOST_MPL_CLEAR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/aux_/clear_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct clear
+    : clear_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,clear,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, clear)
+
+}}
+
+#endif // BOOST_MPL_CLEAR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/clear_fwd.hpp b/gatb-core/thirdparty/boost/mpl/clear_fwd.hpp
new file mode 100644
index 0000000..d14a1d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/clear_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_CLEAR_FWD_HPP_INCLUDED
+#define BOOST_MPL_CLEAR_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct clear_impl;
+template< typename Sequence > struct clear;
+
+}}
+
+#endif // BOOST_MPL_CLEAR_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/comparison.hpp b/gatb-core/thirdparty/boost/mpl/comparison.hpp
new file mode 100644
index 0000000..99dca9d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/comparison.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_COMPARISON_HPP_INCLUDED
+#define BOOST_MPL_COMPARISON_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/not_equal_to.hpp>
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/less_equal.hpp>
+#include <boost/mpl/greater_equal.hpp>
+
+#endif // BOOST_MPL_COMPARISON_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/contains.hpp b/gatb-core/thirdparty/boost/mpl/contains.hpp
new file mode 100644
index 0000000..02c2aa4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/contains.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_CONTAINS_HPP_INCLUDED
+#define BOOST_MPL_CONTAINS_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/contains_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/contains_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct contains
+    : contains_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,T >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,contains,(Sequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, contains)
+
+}}
+
+#endif // BOOST_MPL_CONTAINS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/contains_fwd.hpp b/gatb-core/thirdparty/boost/mpl/contains_fwd.hpp
new file mode 100644
index 0000000..c7c6672
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/contains_fwd.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_CONTAINS_FWD_HPP_INCLUDED
+#define BOOST_MPL_CONTAINS_FWD_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct contains_impl;
+template< typename Sequence, typename T > struct contains;
+
+}}
+
+#endif // BOOST_MPL_CONTAINS_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/copy.hpp b/gatb-core/thirdparty/boost/mpl/copy.hpp
new file mode 100644
index 0000000..6eafba3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/copy.hpp
@@ -0,0 +1,58 @@
+
+#ifndef BOOST_MPL_COPY_HPP_INCLUDED
+#define BOOST_MPL_COPY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Sequence
+    , typename Inserter
+    >
+struct copy_impl
+    : fold< 
+          Sequence
+        , typename Inserter::state
+        , typename Inserter::operation
+        >
+{
+};
+
+template<
+      typename Sequence
+    , typename Inserter
+    >
+struct reverse_copy_impl
+    : reverse_fold<
+          Sequence
+        , typename Inserter::state
+        , typename Inserter::operation
+        >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(2, copy)
+
+}}
+
+#endif // BOOST_MPL_COPY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/copy_if.hpp b/gatb-core/thirdparty/boost/mpl/copy_if.hpp
new file mode 100644
index 0000000..96d9172
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/copy_if.hpp
@@ -0,0 +1,96 @@
+
+#ifndef BOOST_MPL_COPY_IF_HPP_INCLUDED
+#define BOOST_MPL_COPY_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/protect.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Operation
+    , typename Predicate
+    >
+struct copy_if_op
+{
+    template< typename Sequence, typename T > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : eval_if<
+              typename apply1<Predicate,T>::type
+            , apply2<Operation,Sequence,T>
+            , identity<Sequence>
+            >
+    {
+#else
+    {
+        typedef typename eval_if<
+              typename apply1<Predicate,T>::type
+            , apply2<Operation,Sequence,T>
+            , identity<Sequence>
+            >::type type;
+#endif
+    };
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct copy_if_impl
+    : fold<
+          Sequence
+        , typename Inserter::state
+        , protect< aux::copy_if_op<
+              typename Inserter::operation
+            , Predicate
+            > >
+        >
+{
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct reverse_copy_if_impl
+    : reverse_fold<
+          Sequence
+        , typename Inserter::state
+        , protect< aux::copy_if_op<
+              typename Inserter::operation
+            , Predicate
+            > >
+        >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, copy_if)
+
+}}
+
+#endif // BOOST_MPL_COPY_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/count.hpp b/gatb-core/thirdparty/boost/mpl/count.hpp
new file mode 100644
index 0000000..c845662
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/count.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_COUNT_HPP_INCLUDED
+#define BOOST_MPL_COUNT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/count_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/count_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct count
+    : count_impl< typename sequence_tag<Sequence>::type >
+        ::template apply<Sequence,T>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,count,(Sequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, count)
+
+}}
+
+#endif // BOOST_MPL_COUNT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/count_fwd.hpp b/gatb-core/thirdparty/boost/mpl/count_fwd.hpp
new file mode 100644
index 0000000..7d1ee17
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/count_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_COUNT_FWD_HPP_INCLUDED
+#define BOOST_MPL_COUNT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct count_impl;
+template< typename Sequence, typename T > struct count;
+
+}}
+
+#endif // BOOST_MPL_COUNT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/count_if.hpp b/gatb-core/thirdparty/boost/mpl/count_if.hpp
new file mode 100644
index 0000000..d81c395
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/count_if.hpp
@@ -0,0 +1,79 @@
+
+#ifndef BOOST_MPL_COUNT_IF_HPP_INCLUDED
+#define BOOST_MPL_COUNT_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Predicate >
+struct next_if
+{
+    template<
+          typename N
+        , typename T
+        >
+    struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : eval_if<
+              typename apply1<Predicate,T>::type
+            , next<N>
+            , identity<N>
+            >
+    {
+#else
+    {
+        typedef typename eval_if<
+              typename apply1<Predicate,T>::type
+            , next<N>
+            , identity<N>
+            >::type type;
+#endif
+    };
+};
+
+} // namespace aux
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Predicate)
+    >
+struct count_if
+    : aux::msvc_eti_base< typename fold<
+          Sequence
+        , integral_c<unsigned long,0>
+        , protect< aux::next_if<Predicate> >
+        >::type >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,count_if,(Sequence,Predicate))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, count_if)
+
+}}
+
+#endif // BOOST_MPL_COUNT_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/deque.hpp b/gatb-core/thirdparty/boost/mpl/deque.hpp
new file mode 100644
index 0000000..729bae9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/deque.hpp
@@ -0,0 +1,58 @@
+
+#ifndef BOOST_MPL_DEQUE_HPP_INCLUDED
+#define BOOST_MPL_DEQUE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/vector.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_DEQUE_HEADER \
+    BOOST_PP_CAT(vector, BOOST_MPL_LIMIT_VECTOR_SIZE).hpp \
+    /**/
+#else
+#   define AUX778076_DEQUE_HEADER \
+    BOOST_PP_CAT(vector, BOOST_MPL_LIMIT_VECTOR_SIZE)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/vector/AUX778076_DEQUE_HEADER)
+#   undef AUX778076_DEQUE_HEADER
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER deque.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/vector.hpp>
+
+#   define AUX778076_SEQUENCE_NAME deque
+#   define AUX778076_SEQUENCE_BASE_NAME vector
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_VECTOR_SIZE
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_DEQUE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/deref.hpp b/gatb-core/thirdparty/boost/mpl/deref.hpp
new file mode 100644
index 0000000..1105ec9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/deref.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_DEREF_HPP_INCLUDED
+#define BOOST_MPL_DEREF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/msvc_type.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Iterator)
+    >
+struct deref
+{
+#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)
+    typedef typename Iterator::type type;
+#else
+    typedef typename aux::msvc_type<Iterator>::type type;
+#endif
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,deref,(Iterator))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, deref)
+
+}}
+
+#endif // BOOST_MPL_DEREF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/distance.hpp b/gatb-core/thirdparty/boost/mpl/distance.hpp
new file mode 100644
index 0000000..95f4f33
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/distance.hpp
@@ -0,0 +1,78 @@
+
+#ifndef BOOST_MPL_DISTANCE_HPP_INCLUDED
+#define BOOST_MPL_DISTANCE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/distance_fwd.hpp>
+#include <boost/mpl/iter_fold.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/tag.hpp>
+#include <boost/mpl/apply_wrap.hpp>
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+
+namespace boost { namespace mpl {
+
+// default implementation for forward/bidirectional iterators
+template< typename Tag > struct distance_impl
+{
+    template< typename First, typename Last > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : aux::msvc_eti_base< typename iter_fold<
+              iterator_range<First,Last>
+            , mpl::long_<0>
+            , next<>
+            >::type >
+    {
+#else
+    {
+        typedef typename iter_fold<
+              iterator_range<First,Last>
+            , mpl::long_<0>
+            , next<>
+            >::type type;
+        
+        BOOST_STATIC_CONSTANT(long, value =
+              (iter_fold<
+                  iterator_range<First,Last>
+                , mpl::long_<0>
+                , next<>
+                >::type::value)
+            );
+#endif
+    };
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(First)
+    , typename BOOST_MPL_AUX_NA_PARAM(Last)
+    >
+struct distance
+    : distance_impl< typename tag<First>::type >
+        ::template apply<First, Last>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, distance, (First, Last))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, distance)
+
+}}
+
+#endif // BOOST_MPL_DISTANCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/distance_fwd.hpp b/gatb-core/thirdparty/boost/mpl/distance_fwd.hpp
new file mode 100644
index 0000000..a69a7c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/distance_fwd.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_DISTANCE_FWD_HPP_INCLUDED
+#define BOOST_MPL_DISTANCE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(distance)
+
+template< typename Tag > struct distance_impl;
+template< typename First, typename Last > struct distance;
+
+}}
+
+#endif // BOOST_MPL_DISTANCE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/divides.hpp b/gatb-core/thirdparty/boost/mpl/divides.hpp
new file mode 100644
index 0000000..55c8b0d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/divides.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_DIVIDES_HPP_INCLUDED
+#define BOOST_MPL_DIVIDES_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME divides
+#define AUX778076_OP_TOKEN /
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_DIVIDES_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/empty.hpp b/gatb-core/thirdparty/boost/mpl/empty.hpp
new file mode 100644
index 0000000..1185324
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/empty.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_EMPTY_HPP_INCLUDED
+#define BOOST_MPL_EMPTY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/empty_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct empty
+    : empty_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,empty,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, empty)
+
+}}
+
+#endif // BOOST_MPL_EMPTY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/empty_base.hpp b/gatb-core/thirdparty/boost/mpl/empty_base.hpp
new file mode 100644
index 0000000..cb56ef6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/empty_base.hpp
@@ -0,0 +1,63 @@
+
+#ifndef BOOST_MPL_EMPTY_BASE_HPP_INCLUDED
+#define BOOST_MPL_EMPTY_BASE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_empty.hpp>
+
+namespace boost { namespace mpl {
+
+// empty base class, guaranteed to have no members; inheritance from
+// 'empty_base' through the 'inherit' metafunction is a no-op - see 
+// "mpl/inherit.hpp> header for the details
+struct empty_base {};
+
+template< typename T >
+struct is_empty_base
+    : false_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using false_::value;
+#endif
+};
+
+template<>
+struct is_empty_base<empty_base>
+    : true_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using true_::value;
+#endif
+};
+
+}}
+
+namespace boost {
+
+template<> struct is_empty< mpl::empty_base >
+    : public ::boost::integral_constant<bool,true>
+{
+public:
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,is_empty,(mpl::empty_base))
+};
+
+}
+
+#endif // BOOST_MPL_EMPTY_BASE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/empty_fwd.hpp b/gatb-core/thirdparty/boost/mpl/empty_fwd.hpp
new file mode 100644
index 0000000..551c966
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/empty_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_EMPTY_FWD_HPP_INCLUDED
+#define BOOST_MPL_EMPTY_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct empty_impl;
+template< typename Sequence > struct empty;
+
+}}
+
+#endif // BOOST_MPL_EMPTY_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/empty_sequence.hpp b/gatb-core/thirdparty/boost/mpl/empty_sequence.hpp
new file mode 100644
index 0000000..f32cc6e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/empty_sequence.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_EMPTY_SEQUENCE_HPP_INCLUDED
+#define BOOST_MPL_EMPTY_SEQUENCE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+// Copyright Alexander Nasonov 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+
+namespace boost { namespace mpl {
+
+struct empty_sequence
+{
+    struct tag;
+    typedef empty_sequence type;
+    struct begin { typedef random_access_iterator_tag category; };    
+    typedef begin end;
+};
+
+template<>
+struct size_impl<empty_sequence::tag>
+{
+    template< typename Sequence > struct apply
+        : int_<0>
+    {
+    };
+};
+
+}}
+
+#endif // #ifndef BOOST_MPL_EMPTY_SEQUENCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/end.hpp b/gatb-core/thirdparty/boost/mpl/end.hpp
new file mode 100644
index 0000000..cb8d525
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/end.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_END_HPP_INCLUDED
+#define BOOST_MPL_END_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+
+#endif // BOOST_MPL_END_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/equal.hpp b/gatb-core/thirdparty/boost/mpl/equal.hpp
new file mode 100644
index 0000000..8937ef3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/equal.hpp
@@ -0,0 +1,112 @@
+
+#ifndef BOOST_MPL_EQUAL_HPP_INCLUDED
+#define BOOST_MPL_EQUAL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/iter_fold_if_impl.hpp>
+#include <boost/mpl/aux_/iter_apply.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Predicate
+    , typename LastIterator1
+    , typename LastIterator2
+    >
+struct equal_pred
+{
+    template<
+          typename Iterator2
+        , typename Iterator1
+        >
+    struct apply
+    {
+        typedef typename and_< 
+              not_< is_same<Iterator1,LastIterator1> >
+            , not_< is_same<Iterator2,LastIterator2> >
+            , aux::iter_apply2<Predicate,Iterator1,Iterator2>
+            >::type type;
+    };
+};
+
+template<
+      typename Sequence1
+    , typename Sequence2
+    , typename Predicate
+    >
+struct equal_impl
+{
+    typedef typename begin<Sequence1>::type first1_;
+    typedef typename begin<Sequence2>::type first2_;
+    typedef typename end<Sequence1>::type last1_;
+    typedef typename end<Sequence2>::type last2_;
+
+    typedef aux::iter_fold_if_impl<
+          first1_
+        , first2_
+        , next<>
+        , protect< aux::equal_pred<Predicate,last1_,last2_> >
+        , void_
+        , always<false_>
+        > fold_;
+
+    typedef typename fold_::iterator iter1_;
+    typedef typename fold_::state iter2_;
+    typedef and_<
+          is_same<iter1_,last1_>
+        , is_same<iter2_,last2_>
+        > result_;
+
+    typedef typename result_::type type;
+};
+
+
+} // namespace aux
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence1)
+    , typename BOOST_MPL_AUX_NA_PARAM(Sequence2)
+    , typename Predicate = is_same<_,_>
+    >
+struct equal
+    : aux::msvc_eti_base< 
+          typename aux::equal_impl<Sequence1,Sequence2,Predicate>::type
+        >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,equal,(Sequence1,Sequence2))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, equal)
+
+}}
+
+#endif // BOOST_MPL_EQUAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/equal_to.hpp b/gatb-core/thirdparty/boost/mpl/equal_to.hpp
new file mode 100644
index 0000000..5dfc87d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/equal_to.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_EQUAL_TO_HPP_INCLUDED
+#define BOOST_MPL_EQUAL_TO_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME equal_to
+#define AUX778076_OP_TOKEN ==
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_EQUAL_TO_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/erase.hpp b/gatb-core/thirdparty/boost/mpl/erase.hpp
new file mode 100644
index 0000000..abcfdbd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/erase.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_ERASE_HPP_INCLUDED
+#define BOOST_MPL_ERASE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/erase_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/msvc_typename.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(First)
+    , typename BOOST_MPL_AUX_NA_PARAM(Last)
+    >
+struct erase
+    : erase_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,First,Last >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,erase,(Sequence,First,Last))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3,erase)
+
+}}
+
+#endif // BOOST_MPL_ERASE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/erase_fwd.hpp b/gatb-core/thirdparty/boost/mpl/erase_fwd.hpp
new file mode 100644
index 0000000..44e38ea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/erase_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_ERASE_FWD_HPP_INCLUDED
+#define BOOST_MPL_ERASE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct erase_impl;
+template< typename Sequence, typename First, typename Last > struct erase;
+
+}}
+
+#endif // BOOST_MPL_ERASE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/erase_key.hpp b/gatb-core/thirdparty/boost/mpl/erase_key.hpp
new file mode 100644
index 0000000..0e7b820
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/erase_key.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_ERASE_KEY_HPP_INCLUDED
+#define BOOST_MPL_ERASE_KEY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_key_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/erase_key_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/msvc_typename.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Key)
+    >
+struct erase_key
+    : erase_key_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,Key >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,erase_key,(Sequence,Key))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2,erase_key)
+
+}}
+
+#endif // BOOST_MPL_ERASE_KEY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/erase_key_fwd.hpp b/gatb-core/thirdparty/boost/mpl/erase_key_fwd.hpp
new file mode 100644
index 0000000..54265ee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/erase_key_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED
+#define BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct erase_key_impl;
+template< typename Sequence, typename Key > struct erase_key;
+
+}}
+
+#endif // BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/eval_if.hpp b/gatb-core/thirdparty/boost/mpl/eval_if.hpp
new file mode 100644
index 0000000..e892703
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/eval_if.hpp
@@ -0,0 +1,71 @@
+
+#ifndef BOOST_MPL_EVAL_IF_HPP_INCLUDED
+#define BOOST_MPL_EVAL_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(C)
+    , typename BOOST_MPL_AUX_NA_PARAM(F1)
+    , typename BOOST_MPL_AUX_NA_PARAM(F2)
+    >
+struct eval_if
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+     || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \
+        && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \
+        )
+{
+    typedef typename if_<C,F1,F2>::type f_;
+    typedef typename f_::type type;
+#else
+    : if_<C,F1,F2>::type
+{
+#endif
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,eval_if,(C,F1,F2))
+};
+
+// (almost) copy & paste in order to save one more
+// recursively nested template instantiation to user
+template<
+      bool C
+    , typename F1
+    , typename F2
+    >
+struct eval_if_c
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+     || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \
+        && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \
+        )
+{
+    typedef typename if_c<C,F1,F2>::type f_;
+    typedef typename f_::type type;
+#else
+    : if_c<C,F1,F2>::type
+{
+#endif
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, eval_if)
+
+}}
+
+#endif // BOOST_MPL_EVAL_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/filter_view.hpp b/gatb-core/thirdparty/boost/mpl/filter_view.hpp
new file mode 100644
index 0000000..e2830d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/filter_view.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_FILTER_VIEW_HPP_INCLUDED
+#define BOOST_MPL_FILTER_VIEW_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/filter_iter.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Predicate)
+    >
+struct filter_view
+{
+ private:    
+    typedef typename lambda<Predicate>::type pred_;
+    typedef typename begin<Sequence>::type first_;
+    typedef typename end<Sequence>::type last_;
+
+ public:
+    struct tag;
+    typedef filter_view type;
+    typedef typename aux::next_filter_iter< first_,last_,pred_ >::type begin;
+    typedef aux::filter_iter< last_,last_,pred_ > end;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, filter_view)
+
+}}
+
+#endif // BOOST_MPL_FILTER_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/find.hpp b/gatb-core/thirdparty/boost/mpl/find.hpp
new file mode 100644
index 0000000..31a8b0e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/find.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_FIND_HPP_INCLUDED
+#define BOOST_MPL_FIND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct find
+    : find_if< Sequence,same_as<T> >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,find,(Sequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, find)
+
+}}
+
+#endif // BOOST_MPL_FIND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/find_if.hpp b/gatb-core/thirdparty/boost/mpl/find_if.hpp
new file mode 100644
index 0000000..83a007e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/find_if.hpp
@@ -0,0 +1,50 @@
+
+#ifndef BOOST_MPL_FIND_IF_HPP_INCLUDED
+#define BOOST_MPL_FIND_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/find_if_pred.hpp>
+#include <boost/mpl/arg.hpp>
+#include <boost/mpl/iter_fold_if.hpp>
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(find_if)
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Predicate)
+    >
+struct find_if
+{
+    typedef typename iter_fold_if<
+          Sequence
+        , void
+        , mpl::arg<1> // ignore
+        , protect< aux::find_if_pred<Predicate> >
+        >::type result_;
+
+    typedef typename second<result_>::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,find_if,(Sequence,Predicate))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2,find_if)
+
+}}
+
+#endif // BOOST_MPL_FIND_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/fold.hpp b/gatb-core/thirdparty/boost/mpl/fold.hpp
new file mode 100644
index 0000000..0bc67ef
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/fold.hpp
@@ -0,0 +1,48 @@
+
+#ifndef BOOST_MPL_FOLD_HPP_INCLUDED
+#define BOOST_MPL_FOLD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/O1_size.hpp>
+#include <boost/mpl/aux_/fold_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)
+    >
+struct fold
+{
+    typedef typename aux::fold_impl<
+          ::boost::mpl::O1_size<Sequence>::value
+        , typename begin<Sequence>::type
+        , typename end<Sequence>::type
+        , State
+        , ForwardOp
+        >::state type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,fold,(Sequence,State,ForwardOp))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, fold)
+
+}}
+
+#endif // BOOST_MPL_FOLD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/for_each.hpp b/gatb-core/thirdparty/boost/mpl/for_each.hpp
new file mode 100644
index 0000000..6b40ce1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/for_each.hpp
@@ -0,0 +1,123 @@
+
+#ifndef BOOST_MPL_FOR_EACH_HPP_INCLUDED
+#define BOOST_MPL_FOR_EACH_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/aux_/config/gpu.hpp>
+#include <boost/mpl/aux_/unwrap.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/value_init.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool done = true >
+struct for_each_impl
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename TransformFunc
+        , typename F
+        >
+    BOOST_MPL_CFG_GPU_ENABLED
+    static void execute(
+          Iterator*
+        , LastIterator*
+        , TransformFunc*
+        , F
+        )
+    {
+    }
+};
+
+template<>
+struct for_each_impl<false>
+{
+    template<
+          typename Iterator
+        , typename LastIterator
+        , typename TransformFunc
+        , typename F
+        >
+    BOOST_MPL_CFG_GPU_ENABLED
+    static void execute(
+          Iterator*
+        , LastIterator*
+        , TransformFunc* 
+        , F f
+        )
+    {
+        typedef typename deref<Iterator>::type item;
+        typedef typename apply1<TransformFunc,item>::type arg;
+    
+        // dwa 2002/9/10 -- make sure not to invoke undefined behavior
+        // when we pass arg.
+        value_initialized<arg> x;
+        aux::unwrap(f, 0)(boost::get(x));
+        
+        typedef typename mpl::next<Iterator>::type iter;
+        for_each_impl<boost::is_same<iter,LastIterator>::value>
+            ::execute( static_cast<iter*>(0), static_cast<LastIterator*>(0), static_cast<TransformFunc*>(0), f);
+    }
+};
+
+} // namespace aux
+
+// agurt, 17/mar/02: pointer default parameters are necessary to workaround 
+// MSVC 6.5 function template signature's mangling bug
+template<
+      typename Sequence
+    , typename TransformOp
+    , typename F
+    >
+BOOST_MPL_CFG_GPU_ENABLED
+inline
+void for_each(F f, Sequence* = 0, TransformOp* = 0)
+{
+    BOOST_MPL_ASSERT(( is_sequence<Sequence> ));
+
+    typedef typename begin<Sequence>::type first;
+    typedef typename end<Sequence>::type last;
+
+    aux::for_each_impl< boost::is_same<first,last>::value >
+        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_cast<TransformOp*>(0), f);
+}
+
+template<
+      typename Sequence
+    , typename F
+    >
+BOOST_MPL_CFG_GPU_ENABLED
+inline
+void for_each(F f, Sequence* = 0)
+{
+  // jfalcou: fully qualifying this call so it doesnt clash with phoenix::for_each
+  // ons ome compilers -- done on 02/28/2011
+  boost::mpl::for_each<Sequence, identity<> >(f);
+}
+
+}}
+
+#endif // BOOST_MPL_FOR_EACH_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/front.hpp b/gatb-core/thirdparty/boost/mpl/front.hpp
new file mode 100644
index 0000000..b222ff2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/front.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_FRONT_HPP_INCLUDED
+#define BOOST_MPL_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/aux_/front_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct front
+    : front_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,front,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, front)
+
+}}
+
+#endif // BOOST_MPL_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/front_fwd.hpp b/gatb-core/thirdparty/boost/mpl/front_fwd.hpp
new file mode 100644
index 0000000..f01282a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/front_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_FRONT_FWD_HPP_INCLUDED
+#define BOOST_MPL_FRONT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct front_impl;
+template< typename Sequence > struct front;
+
+}}
+
+#endif // BOOST_MPL_FRONT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/front_inserter.hpp b/gatb-core/thirdparty/boost/mpl/front_inserter.hpp
new file mode 100644
index 0000000..0a6b197
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/front_inserter.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_FRONT_INSERTER_HPP_INCLUDED
+#define BOOST_MPL_FRONT_INSERTER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/inserter.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename Sequence
+    >
+struct front_inserter
+    : inserter< Sequence,push_front<> >
+{
+};
+
+}}
+
+#endif // BOOST_MPL_FRONT_INSERTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/greater.hpp b/gatb-core/thirdparty/boost/mpl/greater.hpp
new file mode 100644
index 0000000..b1f0a2c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/greater.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_GREATER_HPP_INCLUDED
+#define BOOST_MPL_GREATER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME greater
+#define AUX778076_OP_TOKEN >
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_GREATER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/greater_equal.hpp b/gatb-core/thirdparty/boost/mpl/greater_equal.hpp
new file mode 100644
index 0000000..7a06a62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/greater_equal.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_GREATER_EQUAL_HPP_INCLUDED
+#define BOOST_MPL_GREATER_EQUAL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME greater_equal
+#define AUX778076_OP_TOKEN >=
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_GREATER_EQUAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/has_key.hpp b/gatb-core/thirdparty/boost/mpl/has_key.hpp
new file mode 100644
index 0000000..ac3a5c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/has_key.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_HAS_KEY_HPP_INCLUDED
+#define BOOST_MPL_HAS_KEY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_key_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/has_key_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(AssociativeSequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Key)
+    >
+struct has_key
+    : has_key_impl< typename sequence_tag<AssociativeSequence>::type >
+        ::template apply<AssociativeSequence,Key>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,has_key,(AssociativeSequence,Key))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, has_key)
+
+}}
+
+#endif // BOOST_MPL_HAS_KEY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/has_key_fwd.hpp b/gatb-core/thirdparty/boost/mpl/has_key_fwd.hpp
new file mode 100644
index 0000000..54b7ed6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/has_key_fwd.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED
+#define BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct has_key_impl;
+template< typename AssociativeSequence, typename Key > struct has_key;
+
+}}
+
+#endif // BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/has_xxx.hpp b/gatb-core/thirdparty/boost/mpl/has_xxx.hpp
new file mode 100644
index 0000000..82e67dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/has_xxx.hpp
@@ -0,0 +1,647 @@
+
+#ifndef BOOST_MPL_HAS_XXX_HPP_INCLUDED
+#define BOOST_MPL_HAS_XXX_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2006
+// Copyright David Abrahams 2002-2003
+// Copyright Daniel Walker 2007
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/config/gcc.hpp>
+#include <boost/mpl/aux_/config/has_xxx.hpp>
+#include <boost/mpl/aux_/config/msvc_typename.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+
+#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) )
+# include <boost/type_traits/is_class.hpp>
+#endif
+
+#if !defined(BOOST_MPL_CFG_NO_HAS_XXX)
+
+#   if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+// agurt, 11/sep/02: MSVC-specific version (< 7.1), based on a USENET 
+// newsgroup's posting by John Madsen (comp.lang.c++.moderated, 
+// 1999-11-12 19:17:06 GMT); the code is _not_ standard-conforming, but 
+// it works way more reliably than the SFINAE-based implementation
+
+// Modified dwa 8/Oct/02 to handle reference types.
+
+#   include <boost/mpl/if.hpp>
+#   include <boost/mpl/bool.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+struct has_xxx_tag;
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+template< typename U > struct msvc_incomplete_array
+{
+    typedef char (&type)[sizeof(U) + 1];
+};
+#endif
+
+template< typename T >
+struct msvc_is_incomplete
+{
+    // MSVC is capable of some kinds of SFINAE.  If U is an incomplete
+    // type, it won't pick the second overload
+    static char tester(...);
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+    template< typename U >
+    static typename msvc_incomplete_array<U>::type tester(type_wrapper<U>);
+#else
+    template< typename U >
+    static char (& tester(type_wrapper<U>) )[sizeof(U)+1];
+#endif 
+    
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof(tester(type_wrapper<T>())) == 1
+        );
+};
+
+template<>
+struct msvc_is_incomplete<int>
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+}}}
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, default_) \
+template< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \
+struct BOOST_PP_CAT(trait,_impl) : T \
+{ \
+    static boost::mpl::aux::no_tag \
+    test(void(*)(::boost::mpl::aux::has_xxx_tag)); \
+    \
+    static boost::mpl::aux::yes_tag test(...); \
+    \
+    BOOST_STATIC_CONSTANT(bool, value = \
+          sizeof(test(static_cast<void(*)(name)>(0))) \
+            != sizeof(boost::mpl::aux::no_tag) \
+        ); \
+    typedef boost::mpl::bool_<value> type; \
+}; \
+\
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
+struct trait \
+    : boost::mpl::if_c< \
+          boost::mpl::aux::msvc_is_incomplete<T>::value \
+        , boost::mpl::bool_<false> \
+        , BOOST_PP_CAT(trait,_impl)<T> \
+        >::type \
+{ \
+}; \
+\
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \
+BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \
+/**/
+
+#   define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \
+template<> struct trait<T> \
+{ \
+    BOOST_STATIC_CONSTANT(bool, value = false); \
+    typedef boost::mpl::bool_<false> type; \
+}; \
+/**/
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \
+    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \
+    BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \
+/**/
+#else
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \
+    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \
+/**/
+#endif
+
+
+// SFINAE-based implementations below are derived from a USENET newsgroup's 
+// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST)
+
+#   elif BOOST_WORKAROUND(BOOST_MSVC, <= 1400) \
+      || (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800)) && defined(__CUDACC__)) \
+      || BOOST_WORKAROUND(__IBMCPP__, <= 700)
+
+// MSVC 7.1 & MSVC 8.0 & VACPP
+
+// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE
+// applied to partial specialization to fix some apparently random failures 
+// (thanks to Daniel Wallin for researching this!)
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
+template< typename T > \
+struct BOOST_PP_CAT(trait, _msvc_sfinae_helper) \
+{ \
+    typedef void type; \
+};\
+\
+template< typename T, typename U = void > \
+struct BOOST_PP_CAT(trait,_impl_) \
+{ \
+    BOOST_STATIC_CONSTANT(bool, value = false); \
+    typedef boost::mpl::bool_<value> type; \
+}; \
+\
+template< typename T > \
+struct BOOST_PP_CAT(trait,_impl_)< \
+      T \
+    , typename BOOST_PP_CAT(trait, _msvc_sfinae_helper)< typename T::name >::type \
+    > \
+{ \
+    BOOST_STATIC_CONSTANT(bool, value = true); \
+    typedef boost::mpl::bool_<value> type; \
+}; \
+\
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
+struct trait \
+    : BOOST_PP_CAT(trait,_impl_)<T> \
+{ \
+}; \
+/**/
+
+#   elif BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) )
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF(trait, trait_tester, name, default_) \
+template< typename T, bool IS_CLASS > \
+struct trait_tester \
+{ \
+    BOOST_STATIC_CONSTANT( bool,  value = false ); \
+}; \
+template< typename T > \
+struct trait_tester< T, true > \
+{ \
+    struct trait_tester_impl \
+    { \
+        template < class U > \
+        static int  resolve( boost::mpl::aux::type_wrapper<U> const volatile * \
+                           , boost::mpl::aux::type_wrapper<typename U::name >* = 0 ); \
+        static char resolve( ... ); \
+    }; \
+    typedef boost::mpl::aux::type_wrapper<T> t_; \
+    BOOST_STATIC_CONSTANT( bool, value = ( sizeof( trait_tester_impl::resolve( static_cast< t_ * >(0) ) ) == sizeof(int) ) ); \
+}; \
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
+struct trait           \
+{                      \
+    BOOST_STATIC_CONSTANT( bool, value = (trait_tester< T, boost::is_class< T >::value >::value) );     \
+    typedef boost::mpl::bool_< trait< T, fallback_ >::value > type; \
+};
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
+    BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF( trait \
+                                         , BOOST_PP_CAT(trait,_tester)      \
+                                         , name       \
+                                         , default_ ) \
+/**/
+
+#   else // other SFINAE-capable compilers
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
+struct trait \
+{ \
+    struct gcc_3_2_wknd \
+    { \
+        template< typename U > \
+        static boost::mpl::aux::yes_tag test( \
+              boost::mpl::aux::type_wrapper<U> const volatile* \
+            , boost::mpl::aux::type_wrapper<BOOST_MSVC_TYPENAME U::name>* = 0 \
+            ); \
+    \
+        static boost::mpl::aux::no_tag test(...); \
+    }; \
+    \
+    typedef boost::mpl::aux::type_wrapper<T> t_; \
+    BOOST_STATIC_CONSTANT(bool, value = \
+          sizeof(gcc_3_2_wknd::test(static_cast<t_*>(0))) \
+            == sizeof(boost::mpl::aux::yes_tag) \
+        ); \
+    typedef boost::mpl::bool_<value> type; \
+}; \
+/**/
+
+#   endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+
+#else // BOOST_MPL_CFG_NO_HAS_XXX
+
+// placeholder implementation
+
+#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
+struct trait \
+{ \
+    BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \
+    typedef fallback_ type; \
+}; \
+/**/
+
+#endif
+
+#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \
+    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(has_,name), name, false) \
+/**/
+
+
+#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
+
+// Create a boolean Metafunction to detect a nested template
+// member. This implementation is based on a USENET newsgroup's
+// posting by Aleksey Gurtovoy (comp.lang.c++.moderated, 2002-03-19),
+// Rani Sharoni's USENET posting cited above, the non-template has_xxx
+// implementations above, and discussion on the Boost mailing list.
+
+#   if !defined(BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES)
+#     if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#       define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 1
+#     else
+#       define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 0
+#     endif
+#   endif
+
+#   if !defined(BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION)
+#     if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS))
+#       define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 1
+#     else
+#       define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 0
+#     endif
+#   endif
+
+#   if !defined(BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE)
+#     if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#       define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 1
+#     else
+#       define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 0
+#     endif
+#   endif
+
+// NOTE: Many internal implementation macros take a Boost.Preprocessor
+// array argument called args which is of the following form.
+//           ( 4, ( trait, name, max_arity, default_ ) )
+
+#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
+      BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _introspect) \
+    /**/
+
+#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
+      BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _substitute), n) \
+    /**/
+
+#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) \
+      BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _test) \
+    /**/
+
+// Thanks to Guillaume Melquiond for pointing out the need for the
+// "substitute" template as an argument to the overloaded test
+// functions to get SFINAE to work for member templates with the
+// correct name but different number of arguments.
+#   define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE(z, n, args) \
+      template< \
+          template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename V) > class V \
+       > \
+      struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) { \
+      }; \
+    /**/
+
+#   define BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \
+      BOOST_PP_REPEAT( \
+          BOOST_PP_ARRAY_ELEM(2, args) \
+        , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE \
+        , args \
+      ) \
+    /**/
+
+#   if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION
+#     define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \
+        template< typename V > \
+        static boost::mpl::aux::no_tag \
+        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \
+      /**/
+#   else
+#     define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \
+        static boost::mpl::aux::no_tag \
+        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \
+      /**/
+#   endif
+
+#   if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES
+#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT(z, n, args) \
+        template< typename V > \
+        static boost::mpl::aux::yes_tag \
+        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \
+            boost::mpl::aux::type_wrapper< V > const volatile* \
+          , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) < \
+                V::template BOOST_PP_ARRAY_ELEM(1, args) \
+            >* = 0 \
+        ); \
+      /**/
+#     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \
+        BOOST_PP_REPEAT( \
+            BOOST_PP_ARRAY_ELEM(2, args) \
+          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT \
+          , args \
+        ) \
+      /**/
+#   else
+#     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \
+        template< typename V > \
+        static boost::mpl::aux::yes_tag \
+        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \
+            V const volatile* \
+          , member_macro(args, V, T)* = 0 \
+        ); \
+      /**/
+#   endif
+
+#   if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION
+#     define BOOST_MPL_HAS_MEMBER_TEST(args) \
+          sizeof(BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U >(0)) \
+              == sizeof(boost::mpl::aux::yes_tag) \
+      /**/
+#   else
+#     if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES
+#       define BOOST_MPL_HAS_MEMBER_TEST(args) \
+          sizeof( \
+              BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \
+                  static_cast< boost::mpl::aux::type_wrapper< U >* >(0) \
+              ) \
+          ) == sizeof(boost::mpl::aux::yes_tag) \
+        /**/
+#     else
+#       define BOOST_MPL_HAS_MEMBER_TEST(args) \
+          sizeof( \
+              BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \
+                  static_cast< U* >(0) \
+              ) \
+          ) == sizeof(boost::mpl::aux::yes_tag) \
+        /**/
+#     endif
+#   endif
+
+#   define BOOST_MPL_HAS_MEMBER_INTROSPECT( \
+               args, substitute_macro, member_macro \
+           ) \
+      template< typename U > \
+      struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) { \
+          BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \
+          BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \
+          BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \
+          BOOST_STATIC_CONSTANT( \
+              bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \
+          ); \
+          typedef boost::mpl::bool_< value > type; \
+      }; \
+    /**/
+
+#   define BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \
+               args, introspect_macro, substitute_macro, member_macro \
+           ) \
+      template< \
+          typename T \
+        , typename fallback_ \
+              = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
+      > \
+      class BOOST_PP_ARRAY_ELEM(0, args) { \
+          introspect_macro(args, substitute_macro, member_macro) \
+      public: \
+          static const bool value \
+              = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< T >::value; \
+          typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< \
+              T \
+          >::type type; \
+      }; \
+    /**/
+
+// BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE expands to the full
+// implementation of the function-based metafunction. Compile with -E
+// to see the preprocessor output for this macro.
+#   define BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \
+               args, substitute_macro, member_macro \
+           ) \
+      BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \
+          args \
+        , BOOST_MPL_HAS_MEMBER_INTROSPECT \
+        , substitute_macro \
+        , member_macro \
+      ) \
+    /**/
+
+#   if BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE
+
+#     if !defined(BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE)
+#       if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#         define BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE 1
+#       endif
+#     endif
+
+#     if !BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE
+#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
+                   args, n \
+               ) \
+          BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
+        /**/
+#     else
+#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
+                   args, n \
+               ) \
+          BOOST_PP_CAT( \
+              boost_mpl_has_xxx_ \
+            , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
+          ) \
+        /**/
+#     endif
+
+#     define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME( \
+                 args \
+             ) \
+        BOOST_PP_CAT( \
+            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
+                args, 0 \
+            ) \
+          , _tag \
+        ) \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
+                 z, n, args \
+             ) \
+        template< \
+             template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename U) > class U \
+        > \
+        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
+                args, n \
+               ) { \
+            typedef \
+                BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
+                type; \
+        }; \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
+                 args, substitute_macro \
+             ) \
+        typedef void \
+            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
+        BOOST_PP_REPEAT( \
+            BOOST_PP_ARRAY_ELEM(2, args) \
+          , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
+          , args \
+        ) \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE( \
+                 args, member_macro \
+             ) \
+        template< \
+            typename U \
+          , typename V \
+                = BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
+        > \
+        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) { \
+            BOOST_STATIC_CONSTANT(bool, value = false); \
+            typedef boost::mpl::bool_< value > type; \
+        }; \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE( \
+                 z, n, args \
+             ) \
+        template< typename U > \
+        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< \
+            U \
+          , typename \
+                BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
+                    args, n \
+                )< \
+                    BOOST_MSVC_TYPENAME U::BOOST_PP_ARRAY_ELEM(1, args)< > \
+                >::type \
+        > { \
+            BOOST_STATIC_CONSTANT(bool, value = true); \
+            typedef boost::mpl::bool_< value > type; \
+        }; \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE( \
+                 args, member_macro \
+             ) \
+        BOOST_PP_REPEAT( \
+            BOOST_PP_ARRAY_ELEM(2, args) \
+          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE \
+          , args \
+        ) \
+      /**/
+
+#     define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \
+                 args, substitute_macro, member_macro \
+             ) \
+        BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args, member_macro) \
+        BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args, member_macro) \
+        template< typename U > \
+        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
+            : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U > { \
+        }; \
+      /**/
+ 
+// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE expands to the full
+// implementation of the template-based metafunction. Compile with -E
+// to see the preprocessor output for this macro.
+//
+// Note that if BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE is
+// defined BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE needs
+// to be expanded at namespace level before
+// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE can be used.
+#     define BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \
+                 args, substitute_macro, member_macro \
+             ) \
+        BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
+            args, substitute_macro \
+        ) \
+        BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \
+            args \
+          , BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \
+          , substitute_macro \
+          , member_macro \
+        ) \
+      /**/
+
+#   endif // BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE
+
+// Note: In the current implementation the parameter and access macros
+// are no longer expanded.
+#   if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
+        BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \
+            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \
+          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \
+          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \
+        ) \
+      /**/
+#   else
+#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
+        BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \
+            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \
+          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \
+          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \
+        ) \
+      /**/
+#   endif
+
+#else // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
+
+// placeholder implementation
+
+#   define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
+      template< typename T \
+              , typename fallback_ = boost::mpl::bool_< default_ > > \
+      struct trait { \
+          BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \
+          typedef fallback_ type; \
+      }; \
+    /**/
+
+#endif // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
+
+#   define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name) \
+      BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF( \
+          BOOST_PP_CAT(has_, name), name, false \
+      ) \
+    /**/
+
+#endif // BOOST_MPL_HAS_XXX_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/identity.hpp b/gatb-core/thirdparty/boost/mpl/identity.hpp
new file mode 100644
index 0000000..190d2f5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/identity.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_IDENTITY_HPP_INCLUDED
+#define BOOST_MPL_IDENTITY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct identity
+{
+    typedef T type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, identity, (T))
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct make_identity
+{
+    typedef identity<T> type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, make_identity, (T))
+};
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, identity)
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, make_identity)
+
+}}
+
+#endif // BOOST_MPL_IDENTITY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/if.hpp b/gatb-core/thirdparty/boost/mpl/if.hpp
new file mode 100644
index 0000000..b6bdf6c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/if.hpp
@@ -0,0 +1,135 @@
+
+#ifndef BOOST_MPL_IF_HPP_INCLUDED
+#define BOOST_MPL_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/integral.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      bool C
+    , typename T1
+    , typename T2
+    >
+struct if_c
+{
+    typedef T1 type;
+};
+
+template<
+      typename T1
+    , typename T2
+    >
+struct if_c<false,T1,T2>
+{
+    typedef T2 type;
+};
+
+// agurt, 05/sep/04: nondescriptive parameter names for the sake of DigitalMars
+// (and possibly MWCW < 8.0); see http://article.gmane.org/gmane.comp.lib.boost.devel/108959
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    , typename BOOST_MPL_AUX_NA_PARAM(T3)
+    >
+struct if_
+{
+ private:
+    // agurt, 02/jan/03: two-step 'type' definition for the sake of aCC 
+    typedef if_c<
+#if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS)
+          BOOST_MPL_AUX_VALUE_WKND(T1)::value
+#else
+          BOOST_MPL_AUX_STATIC_CAST(bool, BOOST_MPL_AUX_VALUE_WKND(T1)::value)
+#endif
+        , T2
+        , T3
+        > almost_type_;
+ 
+ public:
+    typedef typename almost_type_::type type;
+    
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(T1,T2,T3))
+};
+
+#else
+
+// no partial class template specialization
+
+namespace aux {
+
+template< bool C >
+struct if_impl
+{
+    template< typename T1, typename T2 > struct result_
+    {
+        typedef T1 type;
+    };
+};
+
+template<>
+struct if_impl<false>
+{
+    template< typename T1, typename T2 > struct result_
+    { 
+        typedef T2 type;
+    };
+};
+
+} // namespace aux
+
+template<
+      bool C_
+    , typename T1
+    , typename T2
+    >
+struct if_c
+{
+    typedef typename aux::if_impl< C_ >
+        ::template result_<T1,T2>::type type;
+};
+
+// (almost) copy & paste in order to save one more 
+// recursively nested template instantiation to user
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(C_)
+    , typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct if_
+{
+    enum { msvc_wknd_ = BOOST_MPL_AUX_MSVC_VALUE_WKND(C_)::value };
+
+    typedef typename aux::if_impl< BOOST_MPL_AUX_STATIC_CAST(bool, msvc_wknd_) >
+        ::template result_<T1,T2>::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(C_,T1,T2))
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+BOOST_MPL_AUX_NA_SPEC(3, if_)
+
+}}
+
+#endif // BOOST_MPL_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/index_if.hpp b/gatb-core/thirdparty/boost/mpl/index_if.hpp
new file mode 100644
index 0000000..a44473d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/index_if.hpp
@@ -0,0 +1,60 @@
+
+#ifndef BOOST_MPL_INDEX_IF_HPP_INCLUDED
+#define BOOST_MPL_INDEX_IF_HPP_INCLUDED
+
+// Copyright Eric Friedman 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/find_if_pred.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/iter_fold_if.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Predicate)
+    >
+struct index_if
+{
+    typedef typename iter_fold_if<
+          Sequence
+        , int_<0>
+        , next<>
+        , aux::find_if_pred<Predicate>
+        >::type result_;
+
+    typedef typename end<Sequence>::type not_found_;
+    typedef typename first<result_>::type result_index_;
+    typedef typename second<result_>::type result_iterator_;
+
+    typedef typename if_<
+          is_same< result_iterator_,not_found_ >
+        , void_
+        , result_index_
+        >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,index_if,(Sequence,Predicate))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, index_if)
+
+}}
+
+#endif // BOOST_MPL_INDEX_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/index_of.hpp b/gatb-core/thirdparty/boost/mpl/index_of.hpp
new file mode 100644
index 0000000..cc86a12
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/index_of.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_INDEX_OF_HPP_INCLUDED
+#define BOOST_MPL_INDEX_OF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright Eric Friedman 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/index_if.hpp>
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct index_of
+    : index_if< Sequence,same_as<T> >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,index_of,(Sequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, index_of)
+
+}}
+
+#endif // BOOST_MPL_INDEX_OF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/inherit.hpp b/gatb-core/thirdparty/boost/mpl/inherit.hpp
new file mode 100644
index 0000000..b542737
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/inherit.hpp
@@ -0,0 +1,229 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_INHERIT_HPP_INCLUDED
+#define BOOST_MPL_INHERIT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/empty_base.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER inherit.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#   include <boost/mpl/aux_/preprocessor/enum.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/dtp.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/dec.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+// 'inherit<T1,T2,..,Tn>' metafunction; returns an unspecified class type
+// produced by public derivation from all metafunction's parameters 
+// (T1,T2,..,Tn), except the parameters of 'empty_base' class type; 
+// regardless the position and number of 'empty_base' parameters in the 
+// metafunction's argument list, derivation from them is always a no-op;
+// for instance:
+//      inherit<her>::type == her
+//      inherit<her,my>::type == struct unspecified : her, my {};
+//      inherit<empty_base,her>::type == her
+//      inherit<empty_base,her,empty_base,empty_base>::type == her
+//      inherit<her,empty_base,my>::type == struct unspecified : her, my {};
+//      inherit<empty_base,empty_base>::type == empty_base
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    > 
+struct inherit2
+    : T1, T2
+{
+    typedef inherit2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1,T2))
+};
+
+template< typename T1 > 
+struct inherit2<T1,empty_base>
+{
+    typedef T1 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1,empty_base))
+};
+
+template< typename T2 > 
+struct inherit2<empty_base,T2>
+{
+    typedef T2 type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base,T2))
+};
+
+// needed to disambiguate the previous two in case when both 
+// T1 and T2 == empty_base
+template<> 
+struct inherit2<empty_base,empty_base>
+{
+    typedef empty_base type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base,empty_base))
+};
+
+#else
+
+namespace aux {
+
+template< bool C1, bool C2 >
+struct inherit2_impl
+{
+    template< typename Derived, typename T1, typename T2 > struct result_ 
+        : T1, T2
+    {
+        typedef Derived type_;
+    };
+};
+
+template<>
+struct inherit2_impl<false,true>
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T1
+    {
+        typedef T1 type_;
+    };
+};
+
+template<>
+struct inherit2_impl<true,false>
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+        : T2 
+    {
+        typedef T2 type_;
+    };
+};
+
+template<>
+struct inherit2_impl<true,true>
+{
+    template< typename Derived, typename T1, typename T2 > struct result_
+    {
+        typedef T1 type_;
+    };
+};
+
+} // namespace aux
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    > 
+struct inherit2
+    : aux::inherit2_impl<
+          is_empty_base<T1>::value
+        , is_empty_base<T2>::value
+        >::template result_< inherit2<T1,T2>,T1,T2 >
+{
+    typedef typename inherit2::type_ type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1,T2))
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit2)
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(3, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/inherit.hpp>))
+#include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_INHERIT_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define n_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, na)
+    >
+struct BOOST_PP_CAT(inherit,n_)
+    : inherit2<
+          typename BOOST_PP_CAT(inherit,BOOST_PP_DEC(n_))<
+              BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(n_), T)
+            >::type
+        , BOOST_PP_CAT(T,n_)
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          n_
+        , BOOST_PP_CAT(inherit,n_)
+        , (BOOST_MPL_PP_PARAMS(n_, T))
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(n_, BOOST_PP_CAT(inherit,n_))
+
+#if n_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+/// primary template
+template<
+      BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, empty_base)
+    >
+struct inherit
+    : BOOST_PP_CAT(inherit,n_)<BOOST_MPL_PP_PARAMS(n_, T)>
+{
+};
+
+// 'na' specialization
+template<>
+struct inherit< BOOST_MPL_PP_ENUM(5, na) >
+{
+    template<
+#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+          BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, empty_base)
+#else
+          BOOST_MPL_PP_PARAMS(n_, typename T)
+#endif
+        >
+    struct apply
+        : inherit< BOOST_MPL_PP_PARAMS(n_, T) >
+    {
+    };
+};
+
+BOOST_MPL_AUX_NA_SPEC_LAMBDA(n_, inherit)
+BOOST_MPL_AUX_NA_SPEC_ARITY(n_, inherit)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(n_, n_, inherit)
+#endif
+
+#undef n_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/inherit_linearly.hpp b/gatb-core/thirdparty/boost/mpl/inherit_linearly.hpp
new file mode 100644
index 0000000..fa58480
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/inherit_linearly.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED
+#define BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/empty_base.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Types_)
+    , typename BOOST_MPL_AUX_NA_PARAM(Node_)
+    , typename Root_ = empty_base
+    >
+struct inherit_linearly
+    : fold<Types_,Root_,Node_>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,inherit_linearly,(Types_,Node_,Root_))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, inherit_linearly)
+
+}}
+
+#endif // BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/insert.hpp b/gatb-core/thirdparty/boost/mpl/insert.hpp
new file mode 100644
index 0000000..5e379a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/insert.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_INSERT_HPP_INCLUDED
+#define BOOST_MPL_INSERT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/insert_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Pos_or_T)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct insert
+    : insert_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,Pos_or_T,T >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,insert,(Sequence,Pos_or_T,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, insert)
+
+}}
+
+#endif // BOOST_MPL_INSERT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/insert_fwd.hpp b/gatb-core/thirdparty/boost/mpl/insert_fwd.hpp
new file mode 100644
index 0000000..ba6b161
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/insert_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_INSERT_FWD_HPP_INCLUDED
+#define BOOST_MPL_INSERT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct insert_impl;
+template< typename Sequence, typename Pos_or_T, typename T > struct insert;
+
+}}
+
+#endif // BOOST_MPL_INSERT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/insert_range.hpp b/gatb-core/thirdparty/boost/mpl/insert_range.hpp
new file mode 100644
index 0000000..0c362f5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/insert_range.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_INSERT_RANGE_HPP_INCLUDED
+#define BOOST_MPL_INSERT_RANGE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_range_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/insert_range_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Pos)
+    , typename BOOST_MPL_AUX_NA_PARAM(Range)
+    >
+struct insert_range
+    : insert_range_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,Pos,Range >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,insert_range,(Sequence,Pos,Range))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, insert_range)
+
+}}
+
+#endif // BOOST_MPL_INSERT_RANGE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/insert_range_fwd.hpp b/gatb-core/thirdparty/boost/mpl/insert_range_fwd.hpp
new file mode 100644
index 0000000..d9c946f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/insert_range_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED
+#define BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct insert_range_impl;
+template< typename Sequence, typename Pos, typename Range > struct insert_range;
+
+}}
+
+#endif // BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/inserter.hpp b/gatb-core/thirdparty/boost/mpl/inserter.hpp
new file mode 100644
index 0000000..964df7f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/inserter.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_INSERTER_HPP_INCLUDED
+#define BOOST_MPL_INSERTER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template<
+      typename Sequence
+    , typename Operation
+    >
+struct inserter
+{
+    typedef Sequence    state;
+    typedef Operation   operation;
+};
+
+}}
+
+#endif // BOOST_MPL_INSERTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/int.hpp b/gatb-core/thirdparty/boost/mpl/int.hpp
new file mode 100644
index 0000000..b7fa0a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/int.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_INT_HPP_INCLUDED
+#define BOOST_MPL_INT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/int_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE int
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_INT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/int_fwd.hpp b/gatb-core/thirdparty/boost/mpl/int_fwd.hpp
new file mode 100644
index 0000000..03d20c1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/int_fwd.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_INT_FWD_HPP_INCLUDED
+#define BOOST_MPL_INT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct int_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(int_)
+
+#endif // BOOST_MPL_INT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/integral_c.hpp b/gatb-core/thirdparty/boost/mpl/integral_c.hpp
new file mode 100644
index 0000000..7a692dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/integral_c.hpp
@@ -0,0 +1,51 @@
+
+#ifndef BOOST_MPL_INTEGRAL_C_HPP_INCLUDED
+#define BOOST_MPL_INTEGRAL_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/integral_c_fwd.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__HP_aCC, <= 53800)
+// the type of non-type template arguments may not depend on template arguments
+#   define AUX_WRAPPER_PARAMS(N) typename T, long N
+#else
+#   define AUX_WRAPPER_PARAMS(N) typename T, T N
+#endif
+
+#define AUX_WRAPPER_NAME integral_c
+#define AUX_WRAPPER_VALUE_TYPE T
+#define AUX_WRAPPER_INST(value) AUX_WRAPPER_NAME< T, value >
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+ && !BOOST_WORKAROUND(__BORLANDC__, <= 0x551)
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+// 'bool' constant doesn't have 'next'/'prior' members
+template< bool C >
+struct integral_c<bool, C>
+{
+    BOOST_STATIC_CONSTANT(bool, value = C);
+    typedef integral_c_tag tag;
+    typedef integral_c type;
+    typedef bool value_type;
+    operator bool() const { return this->value; }
+};
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+#endif
+
+#endif // BOOST_MPL_INTEGRAL_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/integral_c_fwd.hpp b/gatb-core/thirdparty/boost/mpl/integral_c_fwd.hpp
new file mode 100644
index 0000000..05e311d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/integral_c_fwd.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED
+#define BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/adl_barrier.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+#if BOOST_WORKAROUND(__HP_aCC, <= 53800)
+// the type of non-type template arguments may not depend on template arguments
+template< typename T, long N > struct integral_c;
+#else
+template< typename T, T N > struct integral_c;
+#endif
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(integral_c)
+
+#endif // BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/integral_c_tag.hpp b/gatb-core/thirdparty/boost/mpl/integral_c_tag.hpp
new file mode 100644
index 0000000..b604692
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/integral_c_tag.hpp
@@ -0,0 +1,26 @@
+
+#ifndef BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED
+#define BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+struct integral_c_tag { BOOST_STATIC_CONSTANT(int, value = 0); };
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(integral_c_tag)
+
+#endif // BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/is_placeholder.hpp b/gatb-core/thirdparty/boost/mpl/is_placeholder.hpp
new file mode 100644
index 0000000..9f79ef1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/is_placeholder.hpp
@@ -0,0 +1,67 @@
+
+#ifndef BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED
+#define BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/arg_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename T >
+struct is_placeholder
+    : bool_<false>
+{
+};
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
+struct is_placeholder< arg<N> >
+    : bool_<true>
+{
+};
+
+#else
+
+namespace aux {
+
+aux::no_tag is_placeholder_helper(...);
+
+template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
+aux::yes_tag is_placeholder_helper(aux::type_wrapper< arg<N> >*);
+
+} // namespace aux
+
+template< typename T >
+struct is_placeholder
+{
+    static aux::type_wrapper<T>* get();
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof(aux::is_placeholder_helper(get())) == sizeof(aux::yes_tag)
+        );
+    
+    typedef bool_<value> type;
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}
+
+#endif // BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/is_sequence.hpp b/gatb-core/thirdparty/boost/mpl/is_sequence.hpp
new file mode 100644
index 0000000..68e036f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/is_sequence.hpp
@@ -0,0 +1,112 @@
+
+#ifndef BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
+#define BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/sequence_tag_fwd.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/has_tag.hpp>
+#include <boost/mpl/aux_/has_begin.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#   include <boost/mpl/aux_/msvc_is_class.hpp>
+#elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+#   include <boost/type_traits/is_class.hpp>
+#endif
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+namespace aux {
+
+// agurt, 11/jun/03: 
+// MSVC 6.5/7.0 fails if 'has_begin' is instantiated on a class type that has a
+// 'begin' member that doesn't name a type; e.g. 'has_begin< std::vector<int> >'
+// would fail; requiring 'T' to have _both_ 'tag' and 'begin' members workarounds
+// the issue for most real-world cases
+template< typename T > struct is_sequence_impl
+    : and_<
+          identity< aux::has_tag<T> >
+        , identity< aux::has_begin<T> >
+        >
+{
+};
+
+} // namespace aux
+        
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct is_sequence
+    : if_<
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+          aux::msvc_is_class<T> 
+#else
+          boost::is_class<T> 
+#endif
+        , aux::is_sequence_impl<T>
+        , bool_<false>
+        >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
+};
+
+#elif defined(BOOST_MPL_CFG_NO_HAS_XXX)
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct is_sequence
+    : bool_<false>
+{
+};
+
+#else
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct is_sequence
+    : not_< is_same< typename begin<T>::type, void_ > >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, is_sequence, (T))
+};
+
+#endif // BOOST_MSVC
+
+#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
+template<> struct is_sequence<int>
+    : bool_<false>
+{
+};
+#endif
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, is_sequence)
+
+}}
+
+#endif // BOOST_MPL_IS_SEQUENCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/iter_fold.hpp b/gatb-core/thirdparty/boost/mpl/iter_fold.hpp
new file mode 100644
index 0000000..1b56b79
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/iter_fold.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_ITER_FOLD_HPP_INCLUDED
+#define BOOST_MPL_ITER_FOLD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/O1_size.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/iter_fold_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)
+    >
+struct iter_fold
+{
+    typedef typename aux::iter_fold_impl<
+          ::boost::mpl::O1_size<Sequence>::value
+        , typename begin<Sequence>::type
+        , typename end<Sequence>::type
+        , State
+        , typename lambda<ForwardOp>::type
+        >::state type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,iter_fold,(Sequence,State,ForwardOp))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, iter_fold)
+
+}}
+
+#endif // BOOST_MPL_ITER_FOLD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/iter_fold_if.hpp b/gatb-core/thirdparty/boost/mpl/iter_fold_if.hpp
new file mode 100644
index 0000000..0115b7b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/iter_fold_if.hpp
@@ -0,0 +1,117 @@
+
+#ifndef BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED
+#define BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright Eric Friedman 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/logical.hpp>
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/aux_/iter_fold_if_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Predicate, typename LastIterator >
+struct iter_fold_if_pred
+{
+    template< typename State, typename Iterator > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : and_<
+              not_< is_same<Iterator,LastIterator> >
+            , apply1<Predicate,Iterator>
+            >
+    {
+#else
+    {
+        typedef and_<
+              not_< is_same<Iterator,LastIterator> >
+            , apply1<Predicate,Iterator>
+            > type;
+#endif
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)
+    , typename BOOST_MPL_AUX_NA_PARAM(ForwardPredicate)
+    , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)
+    , typename BOOST_MPL_AUX_NA_PARAM(BackwardPredicate)
+    >
+struct iter_fold_if
+{
+
+    typedef typename begin<Sequence>::type first_;
+    typedef typename end<Sequence>::type last_;
+
+    typedef typename eval_if<
+          is_na<BackwardPredicate>
+        , if_< is_na<BackwardOp>, always<false_>, always<true_> >
+        , identity<BackwardPredicate>
+        >::type backward_pred_;
+
+// cwpro8 doesn't like 'cut-off' type here (use typedef instead)
+#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+    struct result_ :
+#else
+    typedef
+#endif
+        aux::iter_fold_if_impl<
+          first_
+        , State
+        , ForwardOp
+        , protect< aux::iter_fold_if_pred< ForwardPredicate,last_ > >
+        , BackwardOp
+        , backward_pred_
+        >
+#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
+    { };
+#else
+    result_;
+#endif
+
+public:
+
+    typedef pair<
+          typename result_::state
+        , typename result_::iterator
+        > type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          6
+        , iter_fold_if
+        , (Sequence,State,ForwardOp,ForwardPredicate,BackwardOp,BackwardPredicate)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(6, iter_fold_if)
+
+}}
+
+#endif // BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/iterator_category.hpp b/gatb-core/thirdparty/boost/mpl/iterator_category.hpp
new file mode 100644
index 0000000..d5ea4af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/iterator_category.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_ITERATOR_CATEGORY_HPP_INCLUDED
+#define BOOST_MPL_ITERATOR_CATEGORY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost {  namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Iterator)
+    >
+struct iterator_category
+{
+    typedef typename Iterator::category type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,iterator_category,(Iterator))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, iterator_category)
+
+}}
+
+#endif // BOOST_MPL_ITERATOR_CATEGORY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/iterator_range.hpp b/gatb-core/thirdparty/boost/mpl/iterator_range.hpp
new file mode 100644
index 0000000..a637e22
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/iterator_range.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED
+#define BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+struct iterator_range_tag;
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(First)
+    , typename BOOST_MPL_AUX_NA_PARAM(Last)
+    >
+struct iterator_range
+{
+    typedef iterator_range_tag tag;
+    typedef iterator_range type;
+    typedef First begin;
+    typedef Last end;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,iterator_range,(First,Last))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, iterator_range)
+
+}}
+
+#endif // BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/iterator_tags.hpp b/gatb-core/thirdparty/boost/mpl/iterator_tags.hpp
new file mode 100644
index 0000000..7c3116a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/iterator_tags.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED
+#define BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace mpl {
+
+struct forward_iterator_tag       : int_<0> { typedef forward_iterator_tag type; };
+struct bidirectional_iterator_tag : int_<1> { typedef bidirectional_iterator_tag type; };
+struct random_access_iterator_tag : int_<2> { typedef random_access_iterator_tag type; };
+
+}}
+
+#endif // BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/joint_view.hpp b/gatb-core/thirdparty/boost/mpl/joint_view.hpp
new file mode 100644
index 0000000..cd9cdda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/joint_view.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_JOINT_VIEW_HPP_INCLUDED
+#define BOOST_MPL_JOINT_VIEW_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/joint_iter.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+struct joint_view_tag;
+}
+
+template<>
+struct size_impl< aux::joint_view_tag >
+{
+    template < typename JointView > struct apply
+      : plus<
+            size<typename JointView::sequence1_>
+          , size<typename JointView::sequence2_>
+          >
+    {};
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence1_)
+    , typename BOOST_MPL_AUX_NA_PARAM(Sequence2_)
+    >
+struct joint_view
+{
+    typedef typename mpl::begin<Sequence1_>::type   first1_;
+    typedef typename mpl::end<Sequence1_>::type     last1_;
+    typedef typename mpl::begin<Sequence2_>::type   first2_;
+    typedef typename mpl::end<Sequence2_>::type     last2_;
+
+    // agurt, 25/may/03: for the 'size_traits' implementation above
+    typedef Sequence1_ sequence1_;
+    typedef Sequence2_ sequence2_;
+
+    typedef joint_view type;
+    typedef aux::joint_view_tag tag;
+    typedef joint_iter<first1_,last1_,first2_>  begin;
+    typedef joint_iter<last1_,last1_,last2_>    end;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, joint_view)
+
+}}
+
+#endif // BOOST_MPL_JOINT_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/key_type.hpp b/gatb-core/thirdparty/boost/mpl/key_type.hpp
new file mode 100644
index 0000000..77bb37f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/key_type.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_KEY_TYPE_HPP_INCLUDED
+#define BOOST_MPL_KEY_TYPE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/key_type_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/apply_wrap.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(AssociativeSequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct key_type
+    : apply_wrap2< 
+          key_type_impl< typename sequence_tag<AssociativeSequence>::type >
+        , AssociativeSequence, T>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,key_type,(AssociativeSequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, key_type)
+
+}}
+
+#endif // BOOST_MPL_KEY_TYPE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/key_type_fwd.hpp b/gatb-core/thirdparty/boost/mpl/key_type_fwd.hpp
new file mode 100644
index 0000000..1e86b78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/key_type_fwd.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED
+#define BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct key_type_impl;
+template< typename AssociativeSequence, typename T > struct key_type;
+
+}}
+
+#endif // BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/lambda.hpp b/gatb-core/thirdparty/boost/mpl/lambda.hpp
new file mode 100644
index 0000000..cc8f607
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/lambda.hpp
@@ -0,0 +1,29 @@
+
+#ifndef BOOST_MPL_LAMBDA_HPP_INCLUDED
+#define BOOST_MPL_LAMBDA_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/lambda_fwd.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+#   include <boost/mpl/aux_/full_lambda.hpp>
+#else
+#   include <boost/mpl/aux_/lambda_no_ctps.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#   define BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS
+#endif
+
+#endif // BOOST_MPL_LAMBDA_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/lambda_fwd.hpp b/gatb-core/thirdparty/boost/mpl/lambda_fwd.hpp
new file mode 100644
index 0000000..57b0426
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/lambda_fwd.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED
+#define BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/void_fwd.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+
+#   include <boost/mpl/int.hpp>
+#   include <boost/mpl/aux_/lambda_arity_param.hpp>
+#   include <boost/mpl/aux_/template_arity_fwd.hpp>
+
+namespace boost { namespace mpl {
+
+template< 
+      typename T = na
+    , typename Tag = void_
+    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
+          typename Arity = int_< aux::template_arity<T>::value >
+        )
+    >
+struct lambda;
+
+}}
+
+#else // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
+
+#   include <boost/mpl/bool.hpp>
+
+namespace boost { namespace mpl {
+
+template< 
+      typename T = na
+    , typename Tag = void_
+    , typename Protect = true_
+    > 
+struct lambda;
+
+}}
+
+#endif
+
+#endif // BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/less.hpp b/gatb-core/thirdparty/boost/mpl/less.hpp
new file mode 100644
index 0000000..63da5aa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/less.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LESS_HPP_INCLUDED
+#define BOOST_MPL_LESS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME less
+#define AUX778076_OP_TOKEN <
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_LESS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/less_equal.hpp b/gatb-core/thirdparty/boost/mpl/less_equal.hpp
new file mode 100644
index 0000000..3d668c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/less_equal.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LESS_EQUAL_HPP_INCLUDED
+#define BOOST_MPL_LESS_EQUAL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME less_equal
+#define AUX778076_OP_TOKEN <=
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_LESS_EQUAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/arity.hpp b/gatb-core/thirdparty/boost/mpl/limits/arity.hpp
new file mode 100644
index 0000000..8c3eb36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/arity.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
+#   define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 5
+#endif
+
+#endif // BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/list.hpp b/gatb-core/thirdparty/boost/mpl/limits/list.hpp
new file mode 100644
index 0000000..b22d6a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/list.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_LIST_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_LIST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_LIST_SIZE)
+#   define BOOST_MPL_LIMIT_LIST_SIZE 20
+#endif
+
+#endif // BOOST_MPL_LIMITS_LIST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/map.hpp b/gatb-core/thirdparty/boost/mpl/limits/map.hpp
new file mode 100644
index 0000000..bedba63
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/map.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_MAP_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_MAP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_MAP_SIZE)
+#   define BOOST_MPL_LIMIT_MAP_SIZE 20
+#endif
+
+#endif // BOOST_MPL_LIMITS_MAP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/set.hpp b/gatb-core/thirdparty/boost/mpl/limits/set.hpp
new file mode 100644
index 0000000..dbc9bd0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/set.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_SET_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_SET_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_SET_SIZE)
+#   define BOOST_MPL_LIMIT_SET_SIZE 20
+#endif
+
+#endif // BOOST_MPL_LIMITS_SET_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/string.hpp b/gatb-core/thirdparty/boost/mpl/limits/string.hpp
new file mode 100644
index 0000000..eb85aa3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/string.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
+
+// Copyright Eric Niebler 2009
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $
+// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49239 $
+
+#if !defined(BOOST_MPL_LIMIT_STRING_SIZE)
+#   define BOOST_MPL_LIMIT_STRING_SIZE 32
+#endif
+
+#endif // BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/unrolling.hpp b/gatb-core/thirdparty/boost/mpl/limits/unrolling.hpp
new file mode 100644
index 0000000..6dba942
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/unrolling.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_UNROLLING)
+#   define BOOST_MPL_LIMIT_UNROLLING 4
+#endif
+
+#endif // BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/limits/vector.hpp b/gatb-core/thirdparty/boost/mpl/limits/vector.hpp
new file mode 100644
index 0000000..9007589
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/limits/vector.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_VECTOR_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_VECTOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_LIMIT_VECTOR_SIZE)
+#   define BOOST_MPL_LIMIT_VECTOR_SIZE 20
+#endif
+
+#endif // BOOST_MPL_LIMITS_VECTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list.hpp b/gatb-core/thirdparty/boost/mpl/list.hpp
new file mode 100644
index 0000000..cff8a4d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_LIST_HPP_INCLUDED
+#define BOOST_MPL_LIST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/list.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_LIST_HEADER \
+    BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE).hpp \
+    /**/
+#else
+#   define AUX778076_LIST_HEADER \
+    BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_LIST_HEADER)
+#   undef AUX778076_LIST_HEADER
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/list.hpp>
+
+#   define AUX778076_SEQUENCE_NAME list
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_LIST_SIZE
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_LIST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/O1_size.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/O1_size.hpp
new file mode 100644
index 0000000..ccbc3f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/O1_size.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/O1_size_fwd.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct O1_size_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+        : List::size
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/begin_end.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/begin_end.hpp
new file mode 100644
index 0000000..b568bee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/begin_end.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/list/aux_/iterator.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+#include <boost/mpl/list/aux_/item.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct begin_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+    {
+        typedef l_iter<typename List::type> type;
+    };
+};
+
+template<>
+struct end_impl< aux::list_tag >
+{
+    template< typename > struct apply
+    {
+        typedef l_iter<l_end> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/clear.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/clear.hpp
new file mode 100644
index 0000000..b16162f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/clear.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/list/aux_/item.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct clear_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+    {
+        typedef l_end type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/empty.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/empty.hpp
new file mode 100644
index 0000000..95f9243
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/empty.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct empty_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+        : not_<typename List::size>
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/front.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/front.hpp
new file mode 100644
index 0000000..9bea1fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/front.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct front_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+    {
+        typedef typename List::item type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/include_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/include_preprocessed.hpp
new file mode 100644
index 0000000..4f7cab2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/include_preprocessed.hpp
@@ -0,0 +1,35 @@
+
+// Copyright Aleksey Gurtovoy 2001-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+#   define AUX778076_HEADER \
+    aux_/preprocessed/plain/BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))
+#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_HEADER)
+#   include AUX778076_INCLUDE_STRING
+#   undef AUX778076_INCLUDE_STRING
+#else
+#   include BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_HEADER)
+#endif
+
+#   undef AUX778076_HEADER
+
+#undef BOOST_MPL_PREPROCESSED_HEADER
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/item.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/item.hpp
new file mode 100644
index 0000000..8505deb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/item.hpp
@@ -0,0 +1,55 @@
+
+#ifndef BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename Size
+    , typename T
+    , typename Next
+    >
+struct l_item
+{
+// agurt, 17/jul/03: to facilitate the deficient 'is_sequence' implementation 
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    typedef int begin;
+#endif
+    typedef aux::list_tag tag;
+    typedef l_item type;
+
+    typedef Size size;
+    typedef T item;
+    typedef Next next;
+};
+
+struct l_end
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    typedef int begin;
+#endif
+    typedef aux::list_tag tag;
+    typedef l_end type;
+    typedef long_<0> size;
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/iterator.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/iterator.hpp
new file mode 100644
index 0000000..6b5ea78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/iterator.hpp
@@ -0,0 +1,76 @@
+
+#ifndef BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/list/aux_/item.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Node >
+struct l_iter
+{
+    typedef aux::l_iter_tag tag;
+    typedef forward_iterator_tag category;
+};
+
+template< typename Node >
+struct deref< l_iter<Node> >
+{
+    typedef typename Node::item type;
+};
+
+template< typename Node >
+struct next< l_iter<Node> >
+{
+    typedef l_iter< typename Node::next > type;
+};
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template< typename Node >
+struct l_iter
+{
+    typedef aux::l_iter_tag tag;
+    typedef forward_iterator_tag category;
+    typedef typename Node::item type;
+    typedef l_iter< typename mpl::next<Node>::type > next;
+};
+
+#endif
+
+
+template<> struct l_iter<l_end>
+{
+    typedef aux::l_iter_tag tag;
+    typedef forward_iterator_tag category;
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    typedef na type;
+    typedef l_iter next;
+#endif
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, l_iter)
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/numbered.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/numbered.hpp
new file mode 100644
index 0000000..0cd49a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/numbered.hpp
@@ -0,0 +1,68 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Peter Dimov 2000-2002
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_shifted_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i BOOST_PP_FRAME_ITERATION(1)
+
+#if i == 1
+
+template<
+      BOOST_PP_ENUM_PARAMS(i, typename T)
+    >
+struct list1
+    : l_item<
+          long_<1>
+        , T0
+        , l_end
+        >
+{
+    typedef list1 type;
+};
+
+#else
+
+#   define MPL_AUX_LIST_TAIL(list, i, T) \
+    BOOST_PP_CAT(list,BOOST_PP_DEC(i))< \
+      BOOST_PP_ENUM_SHIFTED_PARAMS(i, T) \
+    > \
+    /**/
+    
+template<
+      BOOST_PP_ENUM_PARAMS(i, typename T)
+    >
+struct BOOST_PP_CAT(list,i)
+    : l_item<
+          long_<i>
+        , T0
+        , MPL_AUX_LIST_TAIL(list,i,T)
+        >
+{
+    typedef BOOST_PP_CAT(list,i) type;
+};
+
+#   undef MPL_AUX_LIST_TAIL
+
+#endif // i == 1
+
+#undef i
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/numbered_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/numbered_c.hpp
new file mode 100644
index 0000000..0006fd6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/numbered_c.hpp
@@ -0,0 +1,71 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_shifted_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i BOOST_PP_FRAME_ITERATION(1)
+
+#if i == 1
+
+template<
+      typename T
+    , BOOST_PP_ENUM_PARAMS(i, T C)
+    >
+struct list1_c
+    : l_item<
+          long_<1>
+        , integral_c<T,C0>
+        , l_end
+        >
+{
+    typedef list1_c type;
+    typedef T value_type;
+};
+
+#else
+
+#   define MPL_AUX_LIST_C_TAIL(list, i, C) \
+    BOOST_PP_CAT(BOOST_PP_CAT(list,BOOST_PP_DEC(i)),_c)<T, \
+      BOOST_PP_ENUM_SHIFTED_PARAMS(i, C) \
+    > \
+    /**/
+    
+template<
+      typename T
+    , BOOST_PP_ENUM_PARAMS(i, T C)
+    >
+struct BOOST_PP_CAT(BOOST_PP_CAT(list,i),_c)
+    : l_item<
+          long_<i>
+        , integral_c<T,C0>
+        , MPL_AUX_LIST_C_TAIL(list,i,C)
+        >
+{
+    typedef BOOST_PP_CAT(BOOST_PP_CAT(list,i),_c) type;
+    typedef T value_type;
+};
+
+#   undef MPL_AUX_LIST_C_TAIL
+
+#endif // i == 1
+
+#undef i
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/pop_front.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/pop_front.hpp
new file mode 100644
index 0000000..46a0414
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/pop_front.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_front_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct pop_front_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+    {
+        typedef typename mpl::next<List>::type type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10.hpp
new file mode 100644
index 0000000..99368d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0
+    >
+struct list1
+    : l_item<
+          long_<1>
+        , T0
+        , l_end
+        >
+{
+    typedef list1 type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct list2
+    : l_item<
+          long_<2>
+        , T0
+        , list1<T1>
+        >
+{
+    typedef list2 type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct list3
+    : l_item<
+          long_<3>
+        , T0
+        , list2< T1,T2 >
+        >
+{
+    typedef list3 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct list4
+    : l_item<
+          long_<4>
+        , T0
+        , list3< T1,T2,T3 >
+        >
+{
+    typedef list4 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct list5
+    : l_item<
+          long_<5>
+        , T0
+        , list4< T1,T2,T3,T4 >
+        >
+{
+    typedef list5 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct list6
+    : l_item<
+          long_<6>
+        , T0
+        , list5< T1,T2,T3,T4,T5 >
+        >
+{
+    typedef list6 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct list7
+    : l_item<
+          long_<7>
+        , T0
+        , list6< T1,T2,T3,T4,T5,T6 >
+        >
+{
+    typedef list7 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct list8
+    : l_item<
+          long_<8>
+        , T0
+        , list7< T1,T2,T3,T4,T5,T6,T7 >
+        >
+{
+    typedef list8 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct list9
+    : l_item<
+          long_<9>
+        , T0
+        , list8< T1,T2,T3,T4,T5,T6,T7,T8 >
+        >
+{
+    typedef list9 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct list10
+    : l_item<
+          long_<10>
+        , T0
+        , list9< T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+        >
+{
+    typedef list10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp
new file mode 100644
index 0000000..7133d71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp
@@ -0,0 +1,164 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list10_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0
+    >
+struct list1_c
+    : l_item<
+          long_<1>
+        , integral_c< T,C0 >
+        , l_end
+        >
+{
+    typedef list1_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1
+    >
+struct list2_c
+    : l_item<
+          long_<2>
+        , integral_c< T,C0 >
+        , list1_c< T,C1 >
+        >
+{
+    typedef list2_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2
+    >
+struct list3_c
+    : l_item<
+          long_<3>
+        , integral_c< T,C0 >
+        , list2_c< T,C1,C2 >
+        >
+{
+    typedef list3_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3
+    >
+struct list4_c
+    : l_item<
+          long_<4>
+        , integral_c< T,C0 >
+        , list3_c< T,C1,C2,C3 >
+        >
+{
+    typedef list4_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4
+    >
+struct list5_c
+    : l_item<
+          long_<5>
+        , integral_c< T,C0 >
+        , list4_c< T,C1,C2,C3,C4 >
+        >
+{
+    typedef list5_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5
+    >
+struct list6_c
+    : l_item<
+          long_<6>
+        , integral_c< T,C0 >
+        , list5_c< T,C1,C2,C3,C4,C5 >
+        >
+{
+    typedef list6_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6
+    >
+struct list7_c
+    : l_item<
+          long_<7>
+        , integral_c< T,C0 >
+        , list6_c< T,C1,C2,C3,C4,C5,C6 >
+        >
+{
+    typedef list7_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7
+    >
+struct list8_c
+    : l_item<
+          long_<8>
+        , integral_c< T,C0 >
+        , list7_c< T,C1,C2,C3,C4,C5,C6,C7 >
+        >
+{
+    typedef list8_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8
+    >
+struct list9_c
+    : l_item<
+          long_<9>
+        , integral_c< T,C0 >
+        , list8_c< T,C1,C2,C3,C4,C5,C6,C7,C8 >
+        >
+{
+    typedef list9_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9
+    >
+struct list10_c
+    : l_item<
+          long_<10>
+        , integral_c< T,C0 >
+        , list9_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+        >
+{
+    typedef list10_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20.hpp
new file mode 100644
index 0000000..750e495
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20.hpp
@@ -0,0 +1,169 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct list11
+    : l_item<
+          long_<11>
+        , T0
+        , list10< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+        >
+{
+    typedef list11 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct list12
+    : l_item<
+          long_<12>
+        , T0
+        , list11< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+        >
+{
+    typedef list12 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct list13
+    : l_item<
+          long_<13>
+        , T0
+        , list12< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+        >
+{
+    typedef list13 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct list14
+    : l_item<
+          long_<14>
+        , T0
+        , list13< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+        >
+{
+    typedef list14 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct list15
+    : l_item<
+          long_<15>
+        , T0
+        , list14< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >
+        >
+{
+    typedef list15 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct list16
+    : l_item<
+          long_<16>
+        , T0
+        , list15< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >
+        >
+{
+    typedef list16 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct list17
+    : l_item<
+          long_<17>
+        , T0
+        , list16< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >
+        >
+{
+    typedef list17 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct list18
+    : l_item<
+          long_<18>
+        , T0
+        , list17< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >
+        >
+{
+    typedef list18 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct list19
+    : l_item<
+          long_<19>
+        , T0
+        , list18< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >
+        >
+{
+    typedef list19 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct list20
+    : l_item<
+          long_<20>
+        , T0
+        , list19< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >
+        >
+{
+    typedef list20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp
new file mode 100644
index 0000000..7f15acf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp
@@ -0,0 +1,173 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list20_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    >
+struct list11_c
+    : l_item<
+          long_<11>
+        , integral_c< T,C0 >
+        , list10_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+        >
+{
+    typedef list11_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11
+    >
+struct list12_c
+    : l_item<
+          long_<12>
+        , integral_c< T,C0 >
+        , list11_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+        >
+{
+    typedef list12_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12
+    >
+struct list13_c
+    : l_item<
+          long_<13>
+        , integral_c< T,C0 >
+        , list12_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+        >
+{
+    typedef list13_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13
+    >
+struct list14_c
+    : l_item<
+          long_<14>
+        , integral_c< T,C0 >
+        , list13_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >
+        >
+{
+    typedef list14_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14
+    >
+struct list15_c
+    : l_item<
+          long_<15>
+        , integral_c< T,C0 >
+        , list14_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >
+        >
+{
+    typedef list15_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15
+    >
+struct list16_c
+    : l_item<
+          long_<16>
+        , integral_c< T,C0 >
+        , list15_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >
+        >
+{
+    typedef list16_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16
+    >
+struct list17_c
+    : l_item<
+          long_<17>
+        , integral_c< T,C0 >
+        , list16_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >
+        >
+{
+    typedef list17_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17
+    >
+struct list18_c
+    : l_item<
+          long_<18>
+        , integral_c< T,C0 >
+        , list17_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >
+        >
+{
+    typedef list18_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18
+    >
+struct list19_c
+    : l_item<
+          long_<19>
+        , integral_c< T,C0 >
+        , list18_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >
+        >
+{
+    typedef list19_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19
+    >
+struct list20_c
+    : l_item<
+          long_<20>
+        , integral_c< T,C0 >
+        , list19_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >
+        >
+{
+    typedef list20_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30.hpp
new file mode 100644
index 0000000..5459101
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30.hpp
@@ -0,0 +1,189 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20
+    >
+struct list21
+    : l_item<
+          long_<21>
+        , T0
+        , list20< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20 >
+        >
+{
+    typedef list21 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21
+    >
+struct list22
+    : l_item<
+          long_<22>
+        , T0
+        , list21< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21 >
+        >
+{
+    typedef list22 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22
+    >
+struct list23
+    : l_item<
+          long_<23>
+        , T0
+        , list22< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22 >
+        >
+{
+    typedef list23 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23
+    >
+struct list24
+    : l_item<
+          long_<24>
+        , T0
+        , list23< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23 >
+        >
+{
+    typedef list24 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    >
+struct list25
+    : l_item<
+          long_<25>
+        , T0
+        , list24< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24 >
+        >
+{
+    typedef list25 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25
+    >
+struct list26
+    : l_item<
+          long_<26>
+        , T0
+        , list25< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25 >
+        >
+{
+    typedef list26 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26
+    >
+struct list27
+    : l_item<
+          long_<27>
+        , T0
+        , list26< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26 >
+        >
+{
+    typedef list27 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27
+    >
+struct list28
+    : l_item<
+          long_<28>
+        , T0
+        , list27< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27 >
+        >
+{
+    typedef list28 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28
+    >
+struct list29
+    : l_item<
+          long_<29>
+        , T0
+        , list28< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28 >
+        >
+{
+    typedef list29 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    >
+struct list30
+    : l_item<
+          long_<30>
+        , T0
+        , list29< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29 >
+        >
+{
+    typedef list30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp
new file mode 100644
index 0000000..5393d79
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp
@@ -0,0 +1,183 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list30_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    >
+struct list21_c
+    : l_item<
+          long_<21>
+        , integral_c< T,C0 >
+        , list20_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20 >
+        >
+{
+    typedef list21_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21
+    >
+struct list22_c
+    : l_item<
+          long_<22>
+        , integral_c< T,C0 >
+        , list21_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21 >
+        >
+{
+    typedef list22_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22
+    >
+struct list23_c
+    : l_item<
+          long_<23>
+        , integral_c< T,C0 >
+        , list22_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22 >
+        >
+{
+    typedef list23_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23
+    >
+struct list24_c
+    : l_item<
+          long_<24>
+        , integral_c< T,C0 >
+        , list23_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23 >
+        >
+{
+    typedef list24_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24
+    >
+struct list25_c
+    : l_item<
+          long_<25>
+        , integral_c< T,C0 >
+        , list24_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24 >
+        >
+{
+    typedef list25_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25
+    >
+struct list26_c
+    : l_item<
+          long_<26>
+        , integral_c< T,C0 >
+        , list25_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25 >
+        >
+{
+    typedef list26_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26
+    >
+struct list27_c
+    : l_item<
+          long_<27>
+        , integral_c< T,C0 >
+        , list26_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26 >
+        >
+{
+    typedef list27_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27
+    >
+struct list28_c
+    : l_item<
+          long_<28>
+        , integral_c< T,C0 >
+        , list27_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27 >
+        >
+{
+    typedef list28_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28
+    >
+struct list29_c
+    : l_item<
+          long_<29>
+        , integral_c< T,C0 >
+        , list28_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28 >
+        >
+{
+    typedef list29_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29
+    >
+struct list30_c
+    : l_item<
+          long_<30>
+        , integral_c< T,C0 >
+        , list29_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29 >
+        >
+{
+    typedef list30_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40.hpp
new file mode 100644
index 0000000..68c6761
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40.hpp
@@ -0,0 +1,209 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30
+    >
+struct list31
+    : l_item<
+          long_<31>
+        , T0
+        , list30< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30 >
+        >
+{
+    typedef list31 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31
+    >
+struct list32
+    : l_item<
+          long_<32>
+        , T0
+        , list31< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31 >
+        >
+{
+    typedef list32 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32
+    >
+struct list33
+    : l_item<
+          long_<33>
+        , T0
+        , list32< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32 >
+        >
+{
+    typedef list33 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33
+    >
+struct list34
+    : l_item<
+          long_<34>
+        , T0
+        , list33< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33 >
+        >
+{
+    typedef list34 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    >
+struct list35
+    : l_item<
+          long_<35>
+        , T0
+        , list34< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34 >
+        >
+{
+    typedef list35 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35
+    >
+struct list36
+    : l_item<
+          long_<36>
+        , T0
+        , list35< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35 >
+        >
+{
+    typedef list36 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36
+    >
+struct list37
+    : l_item<
+          long_<37>
+        , T0
+        , list36< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36 >
+        >
+{
+    typedef list37 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37
+    >
+struct list38
+    : l_item<
+          long_<38>
+        , T0
+        , list37< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37 >
+        >
+{
+    typedef list38 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38
+    >
+struct list39
+    : l_item<
+          long_<39>
+        , T0
+        , list38< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38 >
+        >
+{
+    typedef list39 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    >
+struct list40
+    : l_item<
+          long_<40>
+        , T0
+        , list39< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39 >
+        >
+{
+    typedef list40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp
new file mode 100644
index 0000000..0c51ba2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp
@@ -0,0 +1,193 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list40_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    >
+struct list31_c
+    : l_item<
+          long_<31>
+        , integral_c< T,C0 >
+        , list30_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30 >
+        >
+{
+    typedef list31_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31
+    >
+struct list32_c
+    : l_item<
+          long_<32>
+        , integral_c< T,C0 >
+        , list31_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31 >
+        >
+{
+    typedef list32_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32
+    >
+struct list33_c
+    : l_item<
+          long_<33>
+        , integral_c< T,C0 >
+        , list32_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32 >
+        >
+{
+    typedef list33_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33
+    >
+struct list34_c
+    : l_item<
+          long_<34>
+        , integral_c< T,C0 >
+        , list33_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33 >
+        >
+{
+    typedef list34_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34
+    >
+struct list35_c
+    : l_item<
+          long_<35>
+        , integral_c< T,C0 >
+        , list34_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34 >
+        >
+{
+    typedef list35_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35
+    >
+struct list36_c
+    : l_item<
+          long_<36>
+        , integral_c< T,C0 >
+        , list35_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35 >
+        >
+{
+    typedef list36_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36
+    >
+struct list37_c
+    : l_item<
+          long_<37>
+        , integral_c< T,C0 >
+        , list36_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36 >
+        >
+{
+    typedef list37_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37
+    >
+struct list38_c
+    : l_item<
+          long_<38>
+        , integral_c< T,C0 >
+        , list37_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37 >
+        >
+{
+    typedef list38_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38
+    >
+struct list39_c
+    : l_item<
+          long_<39>
+        , integral_c< T,C0 >
+        , list38_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38 >
+        >
+{
+    typedef list39_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39
+    >
+struct list40_c
+    : l_item<
+          long_<40>
+        , integral_c< T,C0 >
+        , list39_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39 >
+        >
+{
+    typedef list40_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50.hpp
new file mode 100644
index 0000000..4cc22da
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50.hpp
@@ -0,0 +1,229 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40
+    >
+struct list41
+    : l_item<
+          long_<41>
+        , T0
+        , list40< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40 >
+        >
+{
+    typedef list41 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41
+    >
+struct list42
+    : l_item<
+          long_<42>
+        , T0
+        , list41< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41 >
+        >
+{
+    typedef list42 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42
+    >
+struct list43
+    : l_item<
+          long_<43>
+        , T0
+        , list42< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42 >
+        >
+{
+    typedef list43 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43
+    >
+struct list44
+    : l_item<
+          long_<44>
+        , T0
+        , list43< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43 >
+        >
+{
+    typedef list44 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    >
+struct list45
+    : l_item<
+          long_<45>
+        , T0
+        , list44< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44 >
+        >
+{
+    typedef list45 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45
+    >
+struct list46
+    : l_item<
+          long_<46>
+        , T0
+        , list45< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45 >
+        >
+{
+    typedef list46 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46
+    >
+struct list47
+    : l_item<
+          long_<47>
+        , T0
+        , list46< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46 >
+        >
+{
+    typedef list47 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47
+    >
+struct list48
+    : l_item<
+          long_<48>
+        , T0
+        , list47< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47 >
+        >
+{
+    typedef list48 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48
+    >
+struct list49
+    : l_item<
+          long_<49>
+        , T0
+        , list48< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47,T48 >
+        >
+{
+    typedef list49 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48, typename T49
+    >
+struct list50
+    : l_item<
+          long_<50>
+        , T0
+        , list49< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47,T48,T49 >
+        >
+{
+    typedef list50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp
new file mode 100644
index 0000000..28c061d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp
@@ -0,0 +1,203 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/list/list50_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    >
+struct list41_c
+    : l_item<
+          long_<41>
+        , integral_c< T,C0 >
+        , list40_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40 >
+        >
+{
+    typedef list41_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41
+    >
+struct list42_c
+    : l_item<
+          long_<42>
+        , integral_c< T,C0 >
+        , list41_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41 >
+        >
+{
+    typedef list42_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42
+    >
+struct list43_c
+    : l_item<
+          long_<43>
+        , integral_c< T,C0 >
+        , list42_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42 >
+        >
+{
+    typedef list43_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43
+    >
+struct list44_c
+    : l_item<
+          long_<44>
+        , integral_c< T,C0 >
+        , list43_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43 >
+        >
+{
+    typedef list44_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44
+    >
+struct list45_c
+    : l_item<
+          long_<45>
+        , integral_c< T,C0 >
+        , list44_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44 >
+        >
+{
+    typedef list45_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45
+    >
+struct list46_c
+    : l_item<
+          long_<46>
+        , integral_c< T,C0 >
+        , list45_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45 >
+        >
+{
+    typedef list46_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46
+    >
+struct list47_c
+    : l_item<
+          long_<47>
+        , integral_c< T,C0 >
+        , list46_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46 >
+        >
+{
+    typedef list47_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47
+    >
+struct list48_c
+    : l_item<
+          long_<48>
+        , integral_c< T,C0 >
+        , list47_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47 >
+        >
+{
+    typedef list48_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48
+    >
+struct list49_c
+    : l_item<
+          long_<49>
+        , integral_c< T,C0 >
+        , list48_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48 >
+        >
+{
+    typedef list49_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49
+    >
+struct list50_c
+    : l_item<
+          long_<50>
+        , integral_c< T,C0 >
+        , list49_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48,C49 >
+        >
+{
+    typedef list50_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/push_back.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/push_back.hpp
new file mode 100644
index 0000000..8f3b73e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/push_back.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_back_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct has_push_back_impl;
+
+template<>
+struct has_push_back_impl< aux::list_tag >
+{
+    template< typename Seq > struct apply
+        : false_
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/push_front.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/push_front.hpp
new file mode 100644
index 0000000..fcfbe4a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/push_front.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front_fwd.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/list/aux_/item.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct push_front_impl< aux::list_tag >
+{
+    template< typename List, typename T > struct apply
+    {
+        typedef l_item<
+              typename next<typename List::size>::type
+            , T
+            , typename List::type
+            > type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/size.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/size.hpp
new file mode 100644
index 0000000..f5e7fea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/size.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/list/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct size_impl< aux::list_tag >
+{
+    template< typename List > struct apply
+        : List::size
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/aux_/tag.hpp b/gatb-core/thirdparty/boost/mpl/list/aux_/tag.hpp
new file mode 100644
index 0000000..f5ed2bb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/aux_/tag.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED
+#define BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+struct list_tag;
+struct l_iter_tag;
+
+}}}
+
+#endif // BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list0.hpp b/gatb-core/thirdparty/boost/mpl/list/list0.hpp
new file mode 100644
index 0000000..8e06b8d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list0.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_LIST_LIST0_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/list/aux_/push_front.hpp>
+#include <boost/mpl/list/aux_/pop_front.hpp>
+#include <boost/mpl/list/aux_/push_back.hpp>
+#include <boost/mpl/list/aux_/front.hpp>
+#include <boost/mpl/list/aux_/clear.hpp>
+#include <boost/mpl/list/aux_/O1_size.hpp>
+#include <boost/mpl/list/aux_/size.hpp>
+#include <boost/mpl/list/aux_/empty.hpp>
+#include <boost/mpl/list/aux_/begin_end.hpp>
+#include <boost/mpl/list/aux_/item.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Dummy = na > struct list0;
+
+template<> struct list0<na>
+    : l_end
+{
+    typedef l_end type;
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_LIST0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list0_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list0_c.hpp
new file mode 100644
index 0000000..807ca1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list0_c.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/list/list0.hpp>
+#include <boost/mpl/integral_c.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T > struct list0_c
+    : l_end
+{
+    typedef l_end type;
+    typedef T value_type;
+};
+
+}}
+
+#endif // BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list10.hpp b/gatb-core/thirdparty/boost/mpl/list/list10.hpp
new file mode 100644
index 0000000..d32d0d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list10.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST10_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST10_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list0.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list10.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, 10, <boost/mpl/list/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST10_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list10_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list10_c.hpp
new file mode 100644
index 0000000..25c8f9d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list10_c.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list0_c.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list10_c.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, 10, <boost/mpl/list/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list20.hpp b/gatb-core/thirdparty/boost/mpl/list/list20.hpp
new file mode 100644
index 0000000..724cabd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list20.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST20_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST20_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list20.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/list/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST20_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list20_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list20_c.hpp
new file mode 100644
index 0000000..0026f69
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list20_c.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list10_c.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list20_c.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/list/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list30.hpp b/gatb-core/thirdparty/boost/mpl/list/list30.hpp
new file mode 100644
index 0000000..a9004c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list30.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST30_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST30_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list30.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/list/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST30_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list30_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list30_c.hpp
new file mode 100644
index 0000000..c996574
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list30_c.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list20_c.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list30_c.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/list/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list40.hpp b/gatb-core/thirdparty/boost/mpl/list/list40.hpp
new file mode 100644
index 0000000..02f869e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list40.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST40_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST40_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list40.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/list/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST40_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list40_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list40_c.hpp
new file mode 100644
index 0000000..808d599
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list40_c.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list30_c.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list40_c.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/list/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list50.hpp b/gatb-core/thirdparty/boost/mpl/list/list50.hpp
new file mode 100644
index 0000000..f16c68c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list50.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST50_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST50_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list50.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/list/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST50_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list/list50_c.hpp b/gatb-core/thirdparty/boost/mpl/list/list50_c.hpp
new file mode 100644
index 0000000..20692d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list/list50_c.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/list/list40_c.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list50_c.hpp
+#   include <boost/mpl/list/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/list/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/list_c.hpp b/gatb-core/thirdparty/boost/mpl/list_c.hpp
new file mode 100644
index 0000000..6c01fc6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/list_c.hpp
@@ -0,0 +1,60 @@
+
+#ifndef BOOST_MPL_LIST_C_HPP_INCLUDED
+#define BOOST_MPL_LIST_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/list.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_LIST_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE),_c).hpp \
+    /**/
+#else
+#   define AUX778076_LIST_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE),_c)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_LIST_C_HEADER)
+#   undef AUX778076_LIST_C_HEADER
+#   include <climits>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER list_c.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/list.hpp>
+
+#   define AUX778076_SEQUENCE_NAME list_c
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_LIST_SIZE
+#   define AUX778076_SEQUENCE_NAME_N(n) BOOST_PP_CAT(BOOST_PP_CAT(list,n),_c)
+#   define AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_LIST_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/logical.hpp b/gatb-core/thirdparty/boost/mpl/logical.hpp
new file mode 100644
index 0000000..c8236b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/logical.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LOGICAL_HPP_INCLUDED
+#define BOOST_MPL_LOGICAL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+#endif // BOOST_MPL_LOGICAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/long.hpp b/gatb-core/thirdparty/boost/mpl/long.hpp
new file mode 100644
index 0000000..c455267
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/long.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_LONG_HPP_INCLUDED
+#define BOOST_MPL_LONG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE long
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_LONG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/long_fwd.hpp b/gatb-core/thirdparty/boost/mpl/long_fwd.hpp
new file mode 100644
index 0000000..5f62f2b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/long_fwd.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_LONG_FWD_HPP_INCLUDED
+#define BOOST_MPL_LONG_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct long_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(long_)
+
+#endif // BOOST_MPL_LONG_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/lower_bound.hpp b/gatb-core/thirdparty/boost/mpl/lower_bound.hpp
new file mode 100644
index 0000000..75eae9a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/lower_bound.hpp
@@ -0,0 +1,143 @@
+
+#ifndef BOOST_MPL_LOWER_BOUND_HPP_INCLUDED
+#define BOOST_MPL_LOWER_BOUND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#   define BOOST_MPL_CFG_STRIPPED_DOWN_LOWER_BOUND_IMPL
+#endif
+
+#if !defined(BOOST_MPL_CFG_STRIPPED_DOWN_LOWER_BOUND_IMPL)
+#   include <boost/mpl/minus.hpp>
+#   include <boost/mpl/divides.hpp>
+#   include <boost/mpl/size.hpp>
+#   include <boost/mpl/advance.hpp>
+#   include <boost/mpl/begin_end.hpp>
+#   include <boost/mpl/long.hpp>
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/prior.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#else
+#   include <boost/mpl/not.hpp>
+#   include <boost/mpl/find.hpp>
+#   include <boost/mpl/bind.hpp>
+#endif
+
+#include <boost/config.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_STRIPPED_DOWN_LOWER_BOUND_IMPL)
+
+// agurt 23/oct/02: has a wrong complexity etc., but at least it works
+// feel free to contribute a better implementation!
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    , typename pred_ = typename lambda<Predicate>::type
+    >
+struct lower_bound
+    : find_if< Sequence, bind1< not_<>, bind2<pred_,_,T> > >
+{
+};
+
+#else
+
+namespace aux {
+
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct lower_bound_step_impl;
+
+template< 
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct lower_bound_step
+{
+    typedef typename eval_if<
+          Distance
+        , lower_bound_step_impl<Distance,Predicate,T,DeferredIterator>
+        , DeferredIterator
+        >::type type;
+};
+    
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct lower_bound_step_impl
+{
+    typedef typename divides< Distance, long_<2> >::type offset_;
+    typedef typename DeferredIterator::type iter_;
+    typedef typename advance< iter_,offset_ >::type middle_;
+    typedef typename apply2<
+              Predicate
+            , typename deref<middle_>::type
+            , T
+            >::type cond_;
+
+    typedef typename prior< minus< Distance, offset_> >::type step_;
+    typedef lower_bound_step< offset_,Predicate,T,DeferredIterator > step_forward_;
+    typedef lower_bound_step< step_,Predicate,T,next<middle_> > step_backward_;
+    typedef typename eval_if<
+          cond_
+        , step_backward_
+        , step_forward_
+        >::type type;
+};
+
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    >
+struct lower_bound
+{
+ private:
+    typedef typename lambda<Predicate>::type pred_;
+    typedef typename size<Sequence>::type size_;
+
+ public:
+    typedef typename aux::lower_bound_step<
+        size_,pred_,T,begin<Sequence>
+        >::type type;
+};
+
+#endif // BOOST_MPL_CFG_STRIPPED_DOWN_LOWER_BOUND_IMPL
+
+BOOST_MPL_AUX_NA_SPEC(2, lower_bound)
+
+}}
+
+#endif // BOOST_MPL_LOWER_BOUND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map.hpp b/gatb-core/thirdparty/boost/mpl/map.hpp
new file mode 100644
index 0000000..0101296
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_MAP_HPP_INCLUDED
+#define BOOST_MPL_MAP_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/map.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_MAP_HEADER \
+    BOOST_PP_CAT(map, BOOST_MPL_LIMIT_MAP_SIZE).hpp \
+    /**/
+#else
+#   define AUX778076_MAP_HEADER \
+    BOOST_PP_CAT(map, BOOST_MPL_LIMIT_MAP_SIZE)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/map/AUX778076_MAP_HEADER)
+#   undef AUX778076_MAP_HEADER
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/map.hpp>
+
+#   define AUX778076_SEQUENCE_NAME map
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_MAP_SIZE
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_MAP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/at_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/at_impl.hpp
new file mode 100644
index 0000000..03f1258
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/at_impl.hpp
@@ -0,0 +1,144 @@
+
+#ifndef BOOST_MPL_MAP_AUX_AT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_AT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/at_fwd.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/aux_/order_impl.hpp>
+#include <boost/mpl/aux_/overload_names.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/ptr_to_ref.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+#if !defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/pair.hpp>
+#   include <boost/mpl/void.hpp>
+#   include <boost/mpl/aux_/config/static_constant.hpp>
+#endif
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template< typename Map, typename Key >
+struct m_at
+{
+    typedef aux::type_wrapper<Key> key_;
+    typedef __typeof__( BOOST_MPL_AUX_OVERLOAD_CALL_VALUE_BY_KEY(
+          Map
+        , BOOST_MPL_AUX_STATIC_CAST(key_*, 0)
+        ) ) type;
+};
+
+template<>
+struct at_impl< aux::map_tag >
+{
+    template< typename Map, typename Key > struct apply
+        : aux::wrapped_type< typename m_at<
+              Map
+            , Key
+            >::type >
+    {
+    };
+};
+
+// agurt 31/jan/04: two-step implementation for the sake of GCC 3.x
+template< typename Map, long order > 
+struct item_by_order_impl
+{
+    typedef __typeof__( BOOST_MPL_AUX_OVERLOAD_CALL_ITEM_BY_ORDER(
+          Map 
+        , BOOST_MPL_AUX_STATIC_CAST(long_<order>*, 0)
+        ) ) type;
+};
+
+template< typename Map, long order >
+struct item_by_order
+    : aux::wrapped_type<
+          typename item_by_order_impl<Map,order>::type
+        >
+{
+};
+
+#else // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Map, long n > struct m_at
+{
+    typedef void_ type;
+};
+
+#   else
+
+template< long n > struct m_at_impl
+{
+    template< typename Map > struct result_
+    {
+        typedef void_ type;
+    };
+};
+
+template< typename Map, long n > struct m_at
+{
+    typedef typename m_at_impl<n>::result_<Map>::type type;
+};
+
+#   endif
+
+
+template<>
+struct at_impl< aux::map_tag >
+{
+    template< typename Map, typename Key > struct apply
+    {
+        typedef typename m_at< Map, (x_order_impl<Map,Key>::value - 2) >::type item_;       
+        typedef typename eval_if<
+              is_void_<item_>
+            , void_
+            , second<item_>
+            >::type type;
+    };
+};
+
+template< typename Map, long order > struct is_item_masked
+{
+    BOOST_STATIC_CONSTANT(bool, value = 
+          sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(
+              Map
+            , BOOST_MPL_AUX_STATIC_CAST(long_<order>*, 0)
+            ) ) == sizeof(aux::yes_tag)
+        );
+};
+
+template< typename Map, long order > struct item_by_order
+{    
+    typedef typename eval_if_c< 
+          is_item_masked<Map,order>::value
+        , void_
+        , m_at<Map,(order - 2)>
+        >::type type;
+};
+
+#endif
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/begin_end_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/begin_end_impl.hpp
new file mode 100644
index 0000000..aeb72fa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/begin_end_impl.hpp
@@ -0,0 +1,50 @@
+
+#ifndef BOOST_MPL_MAP_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/map/aux_/iterator.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct begin_impl< aux::map_tag >
+{
+    template< typename Map > struct apply
+    {
+        typedef typename next< typename Map::order >::type max_order_;
+        typedef m_iter<
+              Map
+            , next_order<Map,1,max_order_::value>::value
+            , max_order_::value
+            > type;
+    };
+};
+
+template<>
+struct end_impl< aux::map_tag >
+{
+    template< typename Map > struct apply
+    {
+        typedef typename next< typename Map::order >::type max_order_;
+        typedef m_iter< Map,max_order_::value,max_order_::value > type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_BEGIN_END_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/clear_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/clear_impl.hpp
new file mode 100644
index 0000000..226ae89
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/clear_impl.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_MAP_AUX_CLEAR_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_CLEAR_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/map/aux_/map0.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct clear_impl< aux::map_tag >
+{
+    template< typename Map > struct apply
+    {
+        typedef map0<> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_CLEAR_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/contains_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/contains_impl.hpp
new file mode 100644
index 0000000..9400780
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/contains_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_MAP_AUX_CONTAINS_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_CONTAINS_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/contains_fwd.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/map/aux_/at_impl.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct contains_impl< aux::map_tag >
+{
+    template< typename Map, typename Pair > struct apply
+        : is_same< 
+              typename at_impl<aux::map_tag>::apply<
+                  Map
+                , typename Pair::first
+                >::type
+            , typename Pair::second
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_CONTAINS_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/empty_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/empty_impl.hpp
new file mode 100644
index 0000000..ab4fa4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/empty_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_MAP_AUX_EMPTY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_EMPTY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct empty_impl< aux::map_tag >
+{
+    template< typename Map > struct apply
+        : not_< typename Map::size >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_EMPTY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/erase_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/erase_impl.hpp
new file mode 100644
index 0000000..978ca2f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/erase_impl.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_MAP_AUX_ERASE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_ERASE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_fwd.hpp>
+#include <boost/mpl/map/aux_/erase_key_impl.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct erase_impl< aux::map_tag >
+{
+    template< 
+          typename Map
+        , typename Pos
+        , typename unused_
+        > 
+    struct apply
+        : erase_key_impl<aux::map_tag>
+            ::apply<Map,typename Pos::type::first>
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_ERASE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/erase_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/erase_key_impl.hpp
new file mode 100644
index 0000000..5e0775d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/erase_key_impl.hpp
@@ -0,0 +1,53 @@
+
+#ifndef BOOST_MPL_MAP_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_key_fwd.hpp>
+#include <boost/mpl/map/aux_/has_key_impl.hpp>
+#include <boost/mpl/map/aux_/item.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/base.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct erase_key_impl< aux::map_tag >
+{
+    template< 
+          typename Map
+        , typename Key
+        > 
+    struct apply
+        : eval_if< 
+              has_key_impl<aux::map_tag>::apply<Map,Key>
+            , eval_if< 
+                  is_same< Key,typename Map::key_ > 
+                , base<Map>
+                , identity< m_mask<Key,Map> >
+                >
+            , identity<Map>
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/has_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/has_key_impl.hpp
new file mode 100644
index 0000000..a463d8b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/has_key_impl.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/has_key_fwd.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/map/aux_/at_impl.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct has_key_impl< aux::map_tag >
+{
+    template< typename Map, typename Key > struct apply
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+        : is_not_void_< 
+              typename at_impl<aux::map_tag>
+                ::apply<Map,Key>::type
+            >
+#else
+        : bool_< ( x_order_impl<Map,Key>::value > 1 ) >
+#endif
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_HAS_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/include_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/include_preprocessed.hpp
new file mode 100644
index 0000000..07873d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/include_preprocessed.hpp
@@ -0,0 +1,53 @@
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!
+
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+#   define AUX778076_INCLUDE_DIR typeof_based
+#elif defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#   define AUX778076_INCLUDE_DIR no_ctps
+#else
+#   define AUX778076_INCLUDE_DIR plain
+#endif
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_HEADER \
+    AUX778076_INCLUDE_DIR/BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#else
+#   define AUX778076_HEADER \
+    BOOST_PP_CAT(AUX778076_INCLUDE_DIR,/)##BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#endif
+
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))
+#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/map/aux_/preprocessed/AUX778076_HEADER)
+#   include AUX778076_INCLUDE_STRING
+#   undef AUX778076_INCLUDE_STRING
+#else
+#   include BOOST_PP_STRINGIZE(boost/mpl/map/aux_/preprocessed/AUX778076_HEADER)
+#endif
+
+#   undef AUX778076_HEADER
+#   undef AUX778076_INCLUDE_DIR
+
+#undef BOOST_MPL_PREPROCESSED_HEADER
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/insert_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/insert_impl.hpp
new file mode 100644
index 0000000..fb61ed9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/insert_impl.hpp
@@ -0,0 +1,72 @@
+
+#ifndef BOOST_MPL_MAP_AUX_INSERT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_INSERT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/map/aux_/contains_impl.hpp>
+#include <boost/mpl/map/aux_/item.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename Map, typename Pair > 
+struct map_insert_impl
+    : if_< 
+          contains_impl<aux::map_tag>::apply<Map,Pair>
+        , Map
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+        , m_item<
+              typename Pair::first
+            , typename Pair::second
+            , Map
+            >
+#else
+        , m_item<
+              Map::order::value
+            , typename Pair::first
+            , typename Pair::second
+            , Map
+            >
+#endif
+        >
+{
+};
+}
+
+template<>
+struct insert_impl< aux::map_tag >
+{
+    template< 
+          typename Map
+        , typename PosOrKey
+        , typename KeyOrNA
+        > 
+    struct apply
+        : aux::map_insert_impl<
+              Map
+            , typename if_na<KeyOrNA,PosOrKey>::type
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_INSERT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/insert_range_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/insert_range_impl.hpp
new file mode 100644
index 0000000..f1f0437
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/insert_range_impl.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+
+// Copyright Bruno Dutra 2015
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_range_fwd.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/insert.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct insert_range_impl< aux::map_tag >
+{
+    template<
+          typename Sequence
+        , typename /*Pos*/
+        , typename Range
+        >
+    struct apply
+        : fold<Range, Sequence, insert<_1, _2> >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/item.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/item.hpp
new file mode 100644
index 0000000..a0a98ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/item.hpp
@@ -0,0 +1,141 @@
+
+#ifndef BOOST_MPL_MAP_AUX_ITEM_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_ITEM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/prior.hpp>
+#include <boost/mpl/map/aux_/map0.hpp>
+#include <boost/mpl/aux_/order_impl.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/config/arrays.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template< typename Key, typename T, typename Base >
+struct m_item
+    : Base
+{
+    typedef Key         key_;
+    typedef pair<Key,T> item;
+    typedef Base        base;
+    typedef m_item      type;
+    
+    typedef typename next< typename Base::size >::type  size;
+    typedef typename next< typename Base::order >::type order;
+
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+    typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value>::type order_tag_;
+#else
+    typedef char (&order_tag_)[BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value];
+#endif
+
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::type_wrapper<T>, VALUE_BY_KEY, m_item, aux::type_wrapper<Key>* );
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::type_wrapper<item>, ITEM_BY_ORDER, m_item, order* );
+    BOOST_MPL_AUX_MAP_OVERLOAD( order_tag_, ORDER_BY_KEY, m_item, aux::type_wrapper<Key>* );
+};
+
+
+template< typename Key, typename Base >
+struct m_mask
+    : Base
+{
+    typedef void_   key_;
+    typedef Base    base;
+    typedef m_mask  type;
+
+    typedef typename prior< typename Base::size >::type  size;
+    typedef typename x_order_impl<Base,Key>::type key_order_;
+    
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::type_wrapper<void_>, VALUE_BY_KEY, m_mask, aux::type_wrapper<Key>* );
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::type_wrapper<void_>, ITEM_BY_ORDER, m_mask, key_order_* );
+};
+
+#else // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long n, typename Key, typename T, typename Base >
+struct m_item;
+
+#   else
+
+template< long n >
+struct m_item_impl
+{
+    template< typename Key, typename T, typename Base >
+    struct result_;
+};
+
+template< long n, typename Key, typename T, typename Base >
+struct m_item
+    : m_item_impl<n>::result_<Key,T,Base>
+{
+};
+
+
+#   endif
+
+
+template< typename Key, typename T, typename Base >
+struct m_item_
+    : Base
+{
+    typedef Key     key_;
+    typedef Base    base;
+    typedef m_item_ type;
+    
+    typedef typename next< typename Base::size >::type  size;
+    typedef typename next< typename Base::order >::type order;
+
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+    typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value>::type order_tag_;
+#else
+    typedef char (&order_tag_)[BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value];
+#endif
+
+    BOOST_MPL_AUX_MAP_OVERLOAD( order_tag_, ORDER_BY_KEY, m_item_, aux::type_wrapper<Key>* );
+};
+
+template< typename Key, typename Base >
+struct m_mask
+    : Base
+{
+    typedef void_   key_;
+    typedef Base    base;
+    typedef m_mask  type;
+
+    typedef typename prior< typename Base::size >::type  size;
+    typedef typename x_order_impl<Base,Key>::type key_order_;
+    
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::no_tag, ORDER_BY_KEY, m_mask, aux::type_wrapper<Key>* );
+    BOOST_MPL_AUX_MAP_OVERLOAD( aux::yes_tag, IS_MASKED, m_mask, key_order_* );
+};
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_ITEM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/iterator.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/iterator.hpp
new file mode 100644
index 0000000..93d9ebd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/iterator.hpp
@@ -0,0 +1,169 @@
+
+#ifndef BOOST_MPL_MAP_AUX_ITERATOR_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_ITERATOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/map/aux_/map0.hpp>
+#include <boost/mpl/map/aux_/at_impl.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< 
+      typename Map
+    , long order
+    , long max_order
+    >
+struct next_order
+    : if_< 
+          is_void_< typename item_by_order<Map,order>::type >
+        , next_order<Map,(order+1),max_order>
+        , long_<order>
+        >::type
+{
+};
+
+template< 
+      typename Map
+    , long max_order
+    >
+struct next_order<Map,max_order,max_order>
+    : long_<max_order>
+{
+};
+
+
+template< typename Map, long order, long max_order >
+struct m_iter
+{
+    typedef forward_iterator_tag category;
+    typedef typename item_by_order<Map,order>::type type;
+};
+
+template< typename Map, long max_order >
+struct m_iter<Map,max_order,max_order>
+{
+    typedef forward_iterator_tag category;
+};
+
+
+template< typename Map, long order, long max_order > 
+struct next< m_iter<Map,order,max_order> >
+{
+    typedef m_iter<
+          Map
+        , next_order<Map,order+1,max_order>::value
+        , max_order
+        > type;
+};
+
+template< typename Map, long max_order > 
+struct next< m_iter<Map,max_order,max_order> >
+{
+};
+
+#else
+
+template< 
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct next_order;
+
+template< 
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct next_order_impl
+    : if_< 
+          is_void_< typename item_by_order<Map,order>::type >
+        , next_order<Map,(order+1),max_order>
+        , long_<order>
+        >::type
+    {
+    };
+
+template< 
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct next_order
+    : if_c<
+          (order != max_order)
+        , next_order_impl<Map,order,max_order>
+        , long_<order>
+        >::type
+{
+};
+
+
+template<
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct m_iter;
+
+struct m_iter_empty_base {};
+
+template< 
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct m_iter_base
+{
+    typedef typename item_by_order<Map,order>::type type;
+    
+    typedef m_iter<
+          Map
+        , next_order<Map,order+1,max_order>::value
+        , max_order
+        > next;
+};
+
+template<
+      typename Map
+    , BOOST_MPL_AUX_NTTP_DECL(long, order)
+    , BOOST_MPL_AUX_NTTP_DECL(long, max_order)
+    >
+struct m_iter
+  : if_c<
+          (order == max_order)
+        , m_iter_empty_base
+        , m_iter_base<Map,order,max_order>
+        >::type
+{
+    typedef forward_iterator_tag category;
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_ITERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/key_type_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/key_type_impl.hpp
new file mode 100644
index 0000000..f5ce0c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/key_type_impl.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_MAP_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/key_type_fwd.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost {
+namespace mpl {
+
+template<>
+struct key_type_impl< aux::map_tag >
+{
+    template< typename Map, typename T > struct apply
+        : first<T>
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/map0.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/map0.hpp
new file mode 100644
index 0000000..fd885dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/map0.hpp
@@ -0,0 +1,74 @@
+
+#ifndef BOOST_MPL_MAP_AUX_MAP0_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_MAP0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/overload_names.hpp>
+#include <boost/mpl/aux_/config/operators.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING)
+
+#   define BOOST_MPL_AUX_MAP0_OVERLOAD(R, f, X, T) \
+    friend R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \
+/**/
+
+#   define BOOST_MPL_AUX_MAP_OVERLOAD(R, f, X, T) \
+    BOOST_MPL_AUX_MAP0_OVERLOAD(R, f, X, T) \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_MAP0_OVERLOAD(R, f, X, T) \
+    static R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \
+/**/
+
+#   define BOOST_MPL_AUX_MAP_OVERLOAD(R, f, X, T) \
+    BOOST_MPL_AUX_MAP0_OVERLOAD(R, f, X, T); \
+    using Base::BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f) \
+/**/
+
+#endif
+
+
+template< typename Dummy = na > struct map0
+{
+    typedef map0            type;
+    typedef aux::map_tag    tag;
+    typedef void_           key_;
+    typedef long_<1>        order;
+    typedef long_<0>        size;
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+    BOOST_MPL_AUX_MAP0_OVERLOAD( aux::type_wrapper<void_>, VALUE_BY_KEY, map0<>, void const volatile* );
+    BOOST_MPL_AUX_MAP0_OVERLOAD( aux::type_wrapper<void_>, ITEM_BY_ORDER, map0<>, long_<1>* );
+    BOOST_MPL_AUX_MAP0_OVERLOAD( aux::no_tag, ORDER_BY_KEY, map0<>, void const volatile* );
+#else
+    BOOST_MPL_AUX_MAP0_OVERLOAD( aux::no_tag, ORDER_BY_KEY, map0<>, void const volatile* );
+    BOOST_MPL_AUX_MAP0_OVERLOAD( aux::no_tag, IS_MASKED, map0<>, void const volatile* );
+#endif
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_MAP0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/numbered.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/numbered.hpp
new file mode 100644
index 0000000..f4512a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/numbered.hpp
@@ -0,0 +1,110 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#else
+
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   define AUX778076_MAP_TAIL(map, i_, P) \
+    BOOST_PP_CAT(map,i_)< \
+          BOOST_PP_ENUM_PARAMS(i_, P) \
+        > \
+    /**/
+
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<
+      BOOST_PP_ENUM_PARAMS(i_, typename P)
+    >
+struct BOOST_PP_CAT(map,i_)
+    : m_item<
+          typename BOOST_PP_CAT(P,BOOST_PP_DEC(i_))::first
+        , typename BOOST_PP_CAT(P,BOOST_PP_DEC(i_))::second
+        , AUX778076_MAP_TAIL(map,BOOST_PP_DEC(i_),P)
+        >
+{
+    typedef BOOST_PP_CAT(map,i_) type;
+};
+
+#else // "brute force" implementation
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Map>
+struct m_at<Map,BOOST_PP_DEC(i_)>
+{
+    typedef typename Map::BOOST_PP_CAT(item,BOOST_PP_DEC(i_)) type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item<i_,Key,T,Base>
+    : m_item_<Key,T,Base>
+{
+    typedef pair<Key,T> BOOST_PP_CAT(item,BOOST_PP_DEC(i_));
+};
+
+#   else
+
+template<>
+struct m_at_impl<BOOST_PP_DEC(i_)>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::BOOST_PP_CAT(item,BOOST_PP_DEC(i_)) type;
+    };
+};
+
+template<>
+struct m_item_impl<i_>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_<Key,T,Base>
+    {
+        typedef pair<Key,T> BOOST_PP_CAT(item,BOOST_PP_DEC(i_));
+    };
+};
+
+#   endif
+
+template<
+      BOOST_PP_ENUM_PARAMS(i_, typename P)
+    >
+struct BOOST_PP_CAT(map,i_)
+    : m_item<
+          i_
+        , typename BOOST_PP_CAT(P,BOOST_PP_DEC(i_))::first
+        , typename BOOST_PP_CAT(P,BOOST_PP_DEC(i_))::second
+        , AUX778076_MAP_TAIL(map,BOOST_PP_DEC(i_),P)
+        >
+{
+    typedef BOOST_PP_CAT(map,i_) type;
+};
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#   undef AUX778076_MAP_TAIL
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map10.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map10.hpp
new file mode 100644
index 0000000..626c456
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map10.hpp
@@ -0,0 +1,350 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<>
+struct m_at_impl<0>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item0 type;
+    };
+};
+
+template<>
+struct m_item_impl<1>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item0;
+    };
+};
+
+template<
+      typename P0
+    >
+struct map1
+    : m_item<
+          1
+        , typename P0::first
+        , typename P0::second
+        , map0<  >
+        >
+{
+    typedef map1 type;
+};
+
+template<>
+struct m_at_impl<1>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item1 type;
+    };
+};
+
+template<>
+struct m_item_impl<2>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item1;
+    };
+};
+
+template<
+      typename P0, typename P1
+    >
+struct map2
+    : m_item<
+          2
+        , typename P1::first
+        , typename P1::second
+        , map1<P0>
+        >
+{
+    typedef map2 type;
+};
+
+template<>
+struct m_at_impl<2>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item2 type;
+    };
+};
+
+template<>
+struct m_item_impl<3>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item2;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2
+    >
+struct map3
+    : m_item<
+          3
+        , typename P2::first
+        , typename P2::second
+        , map2< P0,P1 >
+        >
+{
+    typedef map3 type;
+};
+
+template<>
+struct m_at_impl<3>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item3 type;
+    };
+};
+
+template<>
+struct m_item_impl<4>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item3;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3
+    >
+struct map4
+    : m_item<
+          4
+        , typename P3::first
+        , typename P3::second
+        , map3< P0,P1,P2 >
+        >
+{
+    typedef map4 type;
+};
+
+template<>
+struct m_at_impl<4>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item4 type;
+    };
+};
+
+template<>
+struct m_item_impl<5>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item4;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    >
+struct map5
+    : m_item<
+          5
+        , typename P4::first
+        , typename P4::second
+        , map4< P0,P1,P2,P3 >
+        >
+{
+    typedef map5 type;
+};
+
+template<>
+struct m_at_impl<5>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item5 type;
+    };
+};
+
+template<>
+struct m_item_impl<6>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item5;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5
+    >
+struct map6
+    : m_item<
+          6
+        , typename P5::first
+        , typename P5::second
+        , map5< P0,P1,P2,P3,P4 >
+        >
+{
+    typedef map6 type;
+};
+
+template<>
+struct m_at_impl<6>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item6 type;
+    };
+};
+
+template<>
+struct m_item_impl<7>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item6;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6
+    >
+struct map7
+    : m_item<
+          7
+        , typename P6::first
+        , typename P6::second
+        , map6< P0,P1,P2,P3,P4,P5 >
+        >
+{
+    typedef map7 type;
+};
+
+template<>
+struct m_at_impl<7>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item7 type;
+    };
+};
+
+template<>
+struct m_item_impl<8>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item7;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7
+    >
+struct map8
+    : m_item<
+          8
+        , typename P7::first
+        , typename P7::second
+        , map7< P0,P1,P2,P3,P4,P5,P6 >
+        >
+{
+    typedef map8 type;
+};
+
+template<>
+struct m_at_impl<8>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item8 type;
+    };
+};
+
+template<>
+struct m_item_impl<9>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item8;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8
+    >
+struct map9
+    : m_item<
+          9
+        , typename P8::first
+        , typename P8::second
+        , map8< P0,P1,P2,P3,P4,P5,P6,P7 >
+        >
+{
+    typedef map9 type;
+};
+
+template<>
+struct m_at_impl<9>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item9 type;
+    };
+};
+
+template<>
+struct m_item_impl<10>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item9;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    >
+struct map10
+    : m_item<
+          10
+        , typename P9::first
+        , typename P9::second
+        , map9< P0,P1,P2,P3,P4,P5,P6,P7,P8 >
+        >
+{
+    typedef map10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map20.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map20.hpp
new file mode 100644
index 0000000..ac9e379
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map20.hpp
@@ -0,0 +1,370 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<>
+struct m_at_impl<10>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item10 type;
+    };
+};
+
+template<>
+struct m_item_impl<11>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item10;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10
+    >
+struct map11
+    : m_item<
+          11
+        , typename P10::first
+        , typename P10::second
+        , map10< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 >
+        >
+{
+    typedef map11 type;
+};
+
+template<>
+struct m_at_impl<11>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item11 type;
+    };
+};
+
+template<>
+struct m_item_impl<12>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item11;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11
+    >
+struct map12
+    : m_item<
+          12
+        , typename P11::first
+        , typename P11::second
+        , map11< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10 >
+        >
+{
+    typedef map12 type;
+};
+
+template<>
+struct m_at_impl<12>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item12 type;
+    };
+};
+
+template<>
+struct m_item_impl<13>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item12;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12
+    >
+struct map13
+    : m_item<
+          13
+        , typename P12::first
+        , typename P12::second
+        , map12< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11 >
+        >
+{
+    typedef map13 type;
+};
+
+template<>
+struct m_at_impl<13>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item13 type;
+    };
+};
+
+template<>
+struct m_item_impl<14>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item13;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13
+    >
+struct map14
+    : m_item<
+          14
+        , typename P13::first
+        , typename P13::second
+        , map13< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12 >
+        >
+{
+    typedef map14 type;
+};
+
+template<>
+struct m_at_impl<14>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item14 type;
+    };
+};
+
+template<>
+struct m_item_impl<15>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item14;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    >
+struct map15
+    : m_item<
+          15
+        , typename P14::first
+        , typename P14::second
+        , map14< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13 >
+        >
+{
+    typedef map15 type;
+};
+
+template<>
+struct m_at_impl<15>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item15 type;
+    };
+};
+
+template<>
+struct m_item_impl<16>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item15;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15
+    >
+struct map16
+    : m_item<
+          16
+        , typename P15::first
+        , typename P15::second
+        , map15< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14 >
+        >
+{
+    typedef map16 type;
+};
+
+template<>
+struct m_at_impl<16>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item16 type;
+    };
+};
+
+template<>
+struct m_item_impl<17>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item16;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16
+    >
+struct map17
+    : m_item<
+          17
+        , typename P16::first
+        , typename P16::second
+        , map16< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15 >
+        >
+{
+    typedef map17 type;
+};
+
+template<>
+struct m_at_impl<17>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item17 type;
+    };
+};
+
+template<>
+struct m_item_impl<18>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item17;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17
+    >
+struct map18
+    : m_item<
+          18
+        , typename P17::first
+        , typename P17::second
+        , map17< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16 >
+        >
+{
+    typedef map18 type;
+};
+
+template<>
+struct m_at_impl<18>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item18 type;
+    };
+};
+
+template<>
+struct m_item_impl<19>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item18;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18
+    >
+struct map19
+    : m_item<
+          19
+        , typename P18::first
+        , typename P18::second
+        , map18< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17 >
+        >
+{
+    typedef map19 type;
+};
+
+template<>
+struct m_at_impl<19>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item19 type;
+    };
+};
+
+template<>
+struct m_item_impl<20>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item19;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    >
+struct map20
+    : m_item<
+          20
+        , typename P19::first
+        , typename P19::second
+        , map19< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18 >
+        >
+{
+    typedef map20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map30.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map30.hpp
new file mode 100644
index 0000000..5aa118f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map30.hpp
@@ -0,0 +1,390 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<>
+struct m_at_impl<20>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item20 type;
+    };
+};
+
+template<>
+struct m_item_impl<21>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item20;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20
+    >
+struct map21
+    : m_item<
+          21
+        , typename P20::first
+        , typename P20::second
+        , map20< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19 >
+        >
+{
+    typedef map21 type;
+};
+
+template<>
+struct m_at_impl<21>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item21 type;
+    };
+};
+
+template<>
+struct m_item_impl<22>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item21;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21
+    >
+struct map22
+    : m_item<
+          22
+        , typename P21::first
+        , typename P21::second
+        , map21< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20 >
+        >
+{
+    typedef map22 type;
+};
+
+template<>
+struct m_at_impl<22>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item22 type;
+    };
+};
+
+template<>
+struct m_item_impl<23>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item22;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22
+    >
+struct map23
+    : m_item<
+          23
+        , typename P22::first
+        , typename P22::second
+        , map22< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21 >
+        >
+{
+    typedef map23 type;
+};
+
+template<>
+struct m_at_impl<23>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item23 type;
+    };
+};
+
+template<>
+struct m_item_impl<24>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item23;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23
+    >
+struct map24
+    : m_item<
+          24
+        , typename P23::first
+        , typename P23::second
+        , map23< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22 >
+        >
+{
+    typedef map24 type;
+};
+
+template<>
+struct m_at_impl<24>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item24 type;
+    };
+};
+
+template<>
+struct m_item_impl<25>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item24;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    >
+struct map25
+    : m_item<
+          25
+        , typename P24::first
+        , typename P24::second
+        , map24< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23 >
+        >
+{
+    typedef map25 type;
+};
+
+template<>
+struct m_at_impl<25>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item25 type;
+    };
+};
+
+template<>
+struct m_item_impl<26>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item25;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25
+    >
+struct map26
+    : m_item<
+          26
+        , typename P25::first
+        , typename P25::second
+        , map25< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24 >
+        >
+{
+    typedef map26 type;
+};
+
+template<>
+struct m_at_impl<26>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item26 type;
+    };
+};
+
+template<>
+struct m_item_impl<27>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item26;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26
+    >
+struct map27
+    : m_item<
+          27
+        , typename P26::first
+        , typename P26::second
+        , map26< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 >
+        >
+{
+    typedef map27 type;
+};
+
+template<>
+struct m_at_impl<27>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item27 type;
+    };
+};
+
+template<>
+struct m_item_impl<28>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item27;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27
+    >
+struct map28
+    : m_item<
+          28
+        , typename P27::first
+        , typename P27::second
+        , map27< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26 >
+        >
+{
+    typedef map28 type;
+};
+
+template<>
+struct m_at_impl<28>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item28 type;
+    };
+};
+
+template<>
+struct m_item_impl<29>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item28;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28
+    >
+struct map29
+    : m_item<
+          29
+        , typename P28::first
+        , typename P28::second
+        , map28< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27 >
+        >
+{
+    typedef map29 type;
+};
+
+template<>
+struct m_at_impl<29>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item29 type;
+    };
+};
+
+template<>
+struct m_item_impl<30>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item29;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    >
+struct map30
+    : m_item<
+          30
+        , typename P29::first
+        , typename P29::second
+        , map29< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28 >
+        >
+{
+    typedef map30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map40.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map40.hpp
new file mode 100644
index 0000000..dca60d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map40.hpp
@@ -0,0 +1,410 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<>
+struct m_at_impl<30>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item30 type;
+    };
+};
+
+template<>
+struct m_item_impl<31>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item30;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30
+    >
+struct map31
+    : m_item<
+          31
+        , typename P30::first
+        , typename P30::second
+        , map30< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29 >
+        >
+{
+    typedef map31 type;
+};
+
+template<>
+struct m_at_impl<31>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item31 type;
+    };
+};
+
+template<>
+struct m_item_impl<32>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item31;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31
+    >
+struct map32
+    : m_item<
+          32
+        , typename P31::first
+        , typename P31::second
+        , map31< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 >
+        >
+{
+    typedef map32 type;
+};
+
+template<>
+struct m_at_impl<32>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item32 type;
+    };
+};
+
+template<>
+struct m_item_impl<33>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item32;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32
+    >
+struct map33
+    : m_item<
+          33
+        , typename P32::first
+        , typename P32::second
+        , map32< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31 >
+        >
+{
+    typedef map33 type;
+};
+
+template<>
+struct m_at_impl<33>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item33 type;
+    };
+};
+
+template<>
+struct m_item_impl<34>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item33;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33
+    >
+struct map34
+    : m_item<
+          34
+        , typename P33::first
+        , typename P33::second
+        , map33< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32 >
+        >
+{
+    typedef map34 type;
+};
+
+template<>
+struct m_at_impl<34>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item34 type;
+    };
+};
+
+template<>
+struct m_item_impl<35>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item34;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    >
+struct map35
+    : m_item<
+          35
+        , typename P34::first
+        , typename P34::second
+        , map34< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33 >
+        >
+{
+    typedef map35 type;
+};
+
+template<>
+struct m_at_impl<35>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item35 type;
+    };
+};
+
+template<>
+struct m_item_impl<36>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item35;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35
+    >
+struct map36
+    : m_item<
+          36
+        , typename P35::first
+        , typename P35::second
+        , map35< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34 >
+        >
+{
+    typedef map36 type;
+};
+
+template<>
+struct m_at_impl<36>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item36 type;
+    };
+};
+
+template<>
+struct m_item_impl<37>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item36;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36
+    >
+struct map37
+    : m_item<
+          37
+        , typename P36::first
+        , typename P36::second
+        , map36< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35 >
+        >
+{
+    typedef map37 type;
+};
+
+template<>
+struct m_at_impl<37>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item37 type;
+    };
+};
+
+template<>
+struct m_item_impl<38>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item37;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37
+    >
+struct map38
+    : m_item<
+          38
+        , typename P37::first
+        , typename P37::second
+        , map37< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36 >
+        >
+{
+    typedef map38 type;
+};
+
+template<>
+struct m_at_impl<38>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item38 type;
+    };
+};
+
+template<>
+struct m_item_impl<39>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item38;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38
+    >
+struct map39
+    : m_item<
+          39
+        , typename P38::first
+        , typename P38::second
+        , map38< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37 >
+        >
+{
+    typedef map39 type;
+};
+
+template<>
+struct m_at_impl<39>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item39 type;
+    };
+};
+
+template<>
+struct m_item_impl<40>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item39;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    >
+struct map40
+    : m_item<
+          40
+        , typename P39::first
+        , typename P39::second
+        , map39< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38 >
+        >
+{
+    typedef map40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map50.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map50.hpp
new file mode 100644
index 0000000..cd81908
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/no_ctps/map50.hpp
@@ -0,0 +1,430 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<>
+struct m_at_impl<40>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item40 type;
+    };
+};
+
+template<>
+struct m_item_impl<41>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item40;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40
+    >
+struct map41
+    : m_item<
+          41
+        , typename P40::first
+        , typename P40::second
+        , map40< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39 >
+        >
+{
+    typedef map41 type;
+};
+
+template<>
+struct m_at_impl<41>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item41 type;
+    };
+};
+
+template<>
+struct m_item_impl<42>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item41;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41
+    >
+struct map42
+    : m_item<
+          42
+        , typename P41::first
+        , typename P41::second
+        , map41< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40 >
+        >
+{
+    typedef map42 type;
+};
+
+template<>
+struct m_at_impl<42>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item42 type;
+    };
+};
+
+template<>
+struct m_item_impl<43>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item42;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42
+    >
+struct map43
+    : m_item<
+          43
+        , typename P42::first
+        , typename P42::second
+        , map42< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41 >
+        >
+{
+    typedef map43 type;
+};
+
+template<>
+struct m_at_impl<43>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item43 type;
+    };
+};
+
+template<>
+struct m_item_impl<44>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item43;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43
+    >
+struct map44
+    : m_item<
+          44
+        , typename P43::first
+        , typename P43::second
+        , map43< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42 >
+        >
+{
+    typedef map44 type;
+};
+
+template<>
+struct m_at_impl<44>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item44 type;
+    };
+};
+
+template<>
+struct m_item_impl<45>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item44;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    >
+struct map45
+    : m_item<
+          45
+        , typename P44::first
+        , typename P44::second
+        , map44< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43 >
+        >
+{
+    typedef map45 type;
+};
+
+template<>
+struct m_at_impl<45>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item45 type;
+    };
+};
+
+template<>
+struct m_item_impl<46>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item45;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45
+    >
+struct map46
+    : m_item<
+          46
+        , typename P45::first
+        , typename P45::second
+        , map45< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44 >
+        >
+{
+    typedef map46 type;
+};
+
+template<>
+struct m_at_impl<46>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item46 type;
+    };
+};
+
+template<>
+struct m_item_impl<47>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item46;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46
+    >
+struct map47
+    : m_item<
+          47
+        , typename P46::first
+        , typename P46::second
+        , map46< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45 >
+        >
+{
+    typedef map47 type;
+};
+
+template<>
+struct m_at_impl<47>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item47 type;
+    };
+};
+
+template<>
+struct m_item_impl<48>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item47;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47
+    >
+struct map48
+    : m_item<
+          48
+        , typename P47::first
+        , typename P47::second
+        , map47< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46 >
+        >
+{
+    typedef map48 type;
+};
+
+template<>
+struct m_at_impl<48>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item48 type;
+    };
+};
+
+template<>
+struct m_item_impl<49>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item48;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48
+    >
+struct map49
+    : m_item<
+          49
+        , typename P48::first
+        , typename P48::second
+        , map48< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47 >
+        >
+{
+    typedef map49 type;
+};
+
+template<>
+struct m_at_impl<49>
+{
+    template< typename Map > struct result_
+    {
+        typedef typename Map::item49 type;
+    };
+};
+
+template<>
+struct m_item_impl<50>
+{
+    template< typename Key, typename T, typename Base > struct result_
+        : m_item_< Key,T,Base >
+    {
+        typedef pair< Key,T > item49;
+    };
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48, typename P49
+    >
+struct map50
+    : m_item<
+          50
+        , typename P49::first
+        , typename P49::second
+        , map49< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47,P48 >
+        >
+{
+    typedef map50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map10.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map10.hpp
new file mode 100644
index 0000000..ce0d2fb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map10.hpp
@@ -0,0 +1,290 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename Map>
+struct m_at< Map,0 >
+{
+    typedef typename Map::item0 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 1,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item0;
+};
+
+template<
+      typename P0
+    >
+struct map1
+    : m_item<
+          1
+        , typename P0::first
+        , typename P0::second
+        , map0<  >
+        >
+{
+    typedef map1 type;
+};
+
+template< typename Map>
+struct m_at< Map,1 >
+{
+    typedef typename Map::item1 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 2,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item1;
+};
+
+template<
+      typename P0, typename P1
+    >
+struct map2
+    : m_item<
+          2
+        , typename P1::first
+        , typename P1::second
+        , map1<P0>
+        >
+{
+    typedef map2 type;
+};
+
+template< typename Map>
+struct m_at< Map,2 >
+{
+    typedef typename Map::item2 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 3,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item2;
+};
+
+template<
+      typename P0, typename P1, typename P2
+    >
+struct map3
+    : m_item<
+          3
+        , typename P2::first
+        , typename P2::second
+        , map2< P0,P1 >
+        >
+{
+    typedef map3 type;
+};
+
+template< typename Map>
+struct m_at< Map,3 >
+{
+    typedef typename Map::item3 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 4,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item3;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3
+    >
+struct map4
+    : m_item<
+          4
+        , typename P3::first
+        , typename P3::second
+        , map3< P0,P1,P2 >
+        >
+{
+    typedef map4 type;
+};
+
+template< typename Map>
+struct m_at< Map,4 >
+{
+    typedef typename Map::item4 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 5,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item4;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    >
+struct map5
+    : m_item<
+          5
+        , typename P4::first
+        , typename P4::second
+        , map4< P0,P1,P2,P3 >
+        >
+{
+    typedef map5 type;
+};
+
+template< typename Map>
+struct m_at< Map,5 >
+{
+    typedef typename Map::item5 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 6,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item5;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5
+    >
+struct map6
+    : m_item<
+          6
+        , typename P5::first
+        , typename P5::second
+        , map5< P0,P1,P2,P3,P4 >
+        >
+{
+    typedef map6 type;
+};
+
+template< typename Map>
+struct m_at< Map,6 >
+{
+    typedef typename Map::item6 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 7,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item6;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6
+    >
+struct map7
+    : m_item<
+          7
+        , typename P6::first
+        , typename P6::second
+        , map6< P0,P1,P2,P3,P4,P5 >
+        >
+{
+    typedef map7 type;
+};
+
+template< typename Map>
+struct m_at< Map,7 >
+{
+    typedef typename Map::item7 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 8,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item7;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7
+    >
+struct map8
+    : m_item<
+          8
+        , typename P7::first
+        , typename P7::second
+        , map7< P0,P1,P2,P3,P4,P5,P6 >
+        >
+{
+    typedef map8 type;
+};
+
+template< typename Map>
+struct m_at< Map,8 >
+{
+    typedef typename Map::item8 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 9,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item8;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8
+    >
+struct map9
+    : m_item<
+          9
+        , typename P8::first
+        , typename P8::second
+        , map8< P0,P1,P2,P3,P4,P5,P6,P7 >
+        >
+{
+    typedef map9 type;
+};
+
+template< typename Map>
+struct m_at< Map,9 >
+{
+    typedef typename Map::item9 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 10,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item9;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    >
+struct map10
+    : m_item<
+          10
+        , typename P9::first
+        , typename P9::second
+        , map9< P0,P1,P2,P3,P4,P5,P6,P7,P8 >
+        >
+{
+    typedef map10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map20.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map20.hpp
new file mode 100644
index 0000000..e0a147c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map20.hpp
@@ -0,0 +1,310 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename Map>
+struct m_at< Map,10 >
+{
+    typedef typename Map::item10 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 11,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item10;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10
+    >
+struct map11
+    : m_item<
+          11
+        , typename P10::first
+        , typename P10::second
+        , map10< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 >
+        >
+{
+    typedef map11 type;
+};
+
+template< typename Map>
+struct m_at< Map,11 >
+{
+    typedef typename Map::item11 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 12,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item11;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11
+    >
+struct map12
+    : m_item<
+          12
+        , typename P11::first
+        , typename P11::second
+        , map11< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10 >
+        >
+{
+    typedef map12 type;
+};
+
+template< typename Map>
+struct m_at< Map,12 >
+{
+    typedef typename Map::item12 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 13,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item12;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12
+    >
+struct map13
+    : m_item<
+          13
+        , typename P12::first
+        , typename P12::second
+        , map12< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11 >
+        >
+{
+    typedef map13 type;
+};
+
+template< typename Map>
+struct m_at< Map,13 >
+{
+    typedef typename Map::item13 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 14,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item13;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13
+    >
+struct map14
+    : m_item<
+          14
+        , typename P13::first
+        , typename P13::second
+        , map13< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12 >
+        >
+{
+    typedef map14 type;
+};
+
+template< typename Map>
+struct m_at< Map,14 >
+{
+    typedef typename Map::item14 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 15,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item14;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    >
+struct map15
+    : m_item<
+          15
+        , typename P14::first
+        , typename P14::second
+        , map14< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13 >
+        >
+{
+    typedef map15 type;
+};
+
+template< typename Map>
+struct m_at< Map,15 >
+{
+    typedef typename Map::item15 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 16,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item15;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15
+    >
+struct map16
+    : m_item<
+          16
+        , typename P15::first
+        , typename P15::second
+        , map15< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14 >
+        >
+{
+    typedef map16 type;
+};
+
+template< typename Map>
+struct m_at< Map,16 >
+{
+    typedef typename Map::item16 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 17,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item16;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16
+    >
+struct map17
+    : m_item<
+          17
+        , typename P16::first
+        , typename P16::second
+        , map16< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15 >
+        >
+{
+    typedef map17 type;
+};
+
+template< typename Map>
+struct m_at< Map,17 >
+{
+    typedef typename Map::item17 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 18,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item17;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17
+    >
+struct map18
+    : m_item<
+          18
+        , typename P17::first
+        , typename P17::second
+        , map17< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16 >
+        >
+{
+    typedef map18 type;
+};
+
+template< typename Map>
+struct m_at< Map,18 >
+{
+    typedef typename Map::item18 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 19,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item18;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18
+    >
+struct map19
+    : m_item<
+          19
+        , typename P18::first
+        , typename P18::second
+        , map18< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17 >
+        >
+{
+    typedef map19 type;
+};
+
+template< typename Map>
+struct m_at< Map,19 >
+{
+    typedef typename Map::item19 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 20,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item19;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    >
+struct map20
+    : m_item<
+          20
+        , typename P19::first
+        , typename P19::second
+        , map19< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18 >
+        >
+{
+    typedef map20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map30.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map30.hpp
new file mode 100644
index 0000000..d2f2e17
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map30.hpp
@@ -0,0 +1,330 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename Map>
+struct m_at< Map,20 >
+{
+    typedef typename Map::item20 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 21,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item20;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20
+    >
+struct map21
+    : m_item<
+          21
+        , typename P20::first
+        , typename P20::second
+        , map20< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19 >
+        >
+{
+    typedef map21 type;
+};
+
+template< typename Map>
+struct m_at< Map,21 >
+{
+    typedef typename Map::item21 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 22,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item21;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21
+    >
+struct map22
+    : m_item<
+          22
+        , typename P21::first
+        , typename P21::second
+        , map21< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20 >
+        >
+{
+    typedef map22 type;
+};
+
+template< typename Map>
+struct m_at< Map,22 >
+{
+    typedef typename Map::item22 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 23,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item22;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22
+    >
+struct map23
+    : m_item<
+          23
+        , typename P22::first
+        , typename P22::second
+        , map22< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21 >
+        >
+{
+    typedef map23 type;
+};
+
+template< typename Map>
+struct m_at< Map,23 >
+{
+    typedef typename Map::item23 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 24,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item23;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23
+    >
+struct map24
+    : m_item<
+          24
+        , typename P23::first
+        , typename P23::second
+        , map23< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22 >
+        >
+{
+    typedef map24 type;
+};
+
+template< typename Map>
+struct m_at< Map,24 >
+{
+    typedef typename Map::item24 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 25,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item24;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    >
+struct map25
+    : m_item<
+          25
+        , typename P24::first
+        , typename P24::second
+        , map24< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23 >
+        >
+{
+    typedef map25 type;
+};
+
+template< typename Map>
+struct m_at< Map,25 >
+{
+    typedef typename Map::item25 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 26,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item25;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25
+    >
+struct map26
+    : m_item<
+          26
+        , typename P25::first
+        , typename P25::second
+        , map25< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24 >
+        >
+{
+    typedef map26 type;
+};
+
+template< typename Map>
+struct m_at< Map,26 >
+{
+    typedef typename Map::item26 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 27,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item26;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26
+    >
+struct map27
+    : m_item<
+          27
+        , typename P26::first
+        , typename P26::second
+        , map26< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 >
+        >
+{
+    typedef map27 type;
+};
+
+template< typename Map>
+struct m_at< Map,27 >
+{
+    typedef typename Map::item27 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 28,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item27;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27
+    >
+struct map28
+    : m_item<
+          28
+        , typename P27::first
+        , typename P27::second
+        , map27< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26 >
+        >
+{
+    typedef map28 type;
+};
+
+template< typename Map>
+struct m_at< Map,28 >
+{
+    typedef typename Map::item28 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 29,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item28;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28
+    >
+struct map29
+    : m_item<
+          29
+        , typename P28::first
+        , typename P28::second
+        , map28< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27 >
+        >
+{
+    typedef map29 type;
+};
+
+template< typename Map>
+struct m_at< Map,29 >
+{
+    typedef typename Map::item29 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 30,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item29;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    >
+struct map30
+    : m_item<
+          30
+        , typename P29::first
+        , typename P29::second
+        , map29< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28 >
+        >
+{
+    typedef map30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map40.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map40.hpp
new file mode 100644
index 0000000..692f014
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map40.hpp
@@ -0,0 +1,350 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename Map>
+struct m_at< Map,30 >
+{
+    typedef typename Map::item30 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 31,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item30;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30
+    >
+struct map31
+    : m_item<
+          31
+        , typename P30::first
+        , typename P30::second
+        , map30< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29 >
+        >
+{
+    typedef map31 type;
+};
+
+template< typename Map>
+struct m_at< Map,31 >
+{
+    typedef typename Map::item31 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 32,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item31;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31
+    >
+struct map32
+    : m_item<
+          32
+        , typename P31::first
+        , typename P31::second
+        , map31< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 >
+        >
+{
+    typedef map32 type;
+};
+
+template< typename Map>
+struct m_at< Map,32 >
+{
+    typedef typename Map::item32 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 33,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item32;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32
+    >
+struct map33
+    : m_item<
+          33
+        , typename P32::first
+        , typename P32::second
+        , map32< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31 >
+        >
+{
+    typedef map33 type;
+};
+
+template< typename Map>
+struct m_at< Map,33 >
+{
+    typedef typename Map::item33 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 34,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item33;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33
+    >
+struct map34
+    : m_item<
+          34
+        , typename P33::first
+        , typename P33::second
+        , map33< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32 >
+        >
+{
+    typedef map34 type;
+};
+
+template< typename Map>
+struct m_at< Map,34 >
+{
+    typedef typename Map::item34 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 35,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item34;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    >
+struct map35
+    : m_item<
+          35
+        , typename P34::first
+        , typename P34::second
+        , map34< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33 >
+        >
+{
+    typedef map35 type;
+};
+
+template< typename Map>
+struct m_at< Map,35 >
+{
+    typedef typename Map::item35 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 36,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item35;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35
+    >
+struct map36
+    : m_item<
+          36
+        , typename P35::first
+        , typename P35::second
+        , map35< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34 >
+        >
+{
+    typedef map36 type;
+};
+
+template< typename Map>
+struct m_at< Map,36 >
+{
+    typedef typename Map::item36 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 37,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item36;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36
+    >
+struct map37
+    : m_item<
+          37
+        , typename P36::first
+        , typename P36::second
+        , map36< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35 >
+        >
+{
+    typedef map37 type;
+};
+
+template< typename Map>
+struct m_at< Map,37 >
+{
+    typedef typename Map::item37 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 38,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item37;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37
+    >
+struct map38
+    : m_item<
+          38
+        , typename P37::first
+        , typename P37::second
+        , map37< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36 >
+        >
+{
+    typedef map38 type;
+};
+
+template< typename Map>
+struct m_at< Map,38 >
+{
+    typedef typename Map::item38 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 39,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item38;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38
+    >
+struct map39
+    : m_item<
+          39
+        , typename P38::first
+        , typename P38::second
+        , map38< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37 >
+        >
+{
+    typedef map39 type;
+};
+
+template< typename Map>
+struct m_at< Map,39 >
+{
+    typedef typename Map::item39 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 40,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item39;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    >
+struct map40
+    : m_item<
+          40
+        , typename P39::first
+        , typename P39::second
+        , map39< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38 >
+        >
+{
+    typedef map40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map50.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map50.hpp
new file mode 100644
index 0000000..3bd2a25
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/plain/map50.hpp
@@ -0,0 +1,370 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename Map>
+struct m_at< Map,40 >
+{
+    typedef typename Map::item40 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 41,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item40;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40
+    >
+struct map41
+    : m_item<
+          41
+        , typename P40::first
+        , typename P40::second
+        , map40< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39 >
+        >
+{
+    typedef map41 type;
+};
+
+template< typename Map>
+struct m_at< Map,41 >
+{
+    typedef typename Map::item41 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 42,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item41;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41
+    >
+struct map42
+    : m_item<
+          42
+        , typename P41::first
+        , typename P41::second
+        , map41< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40 >
+        >
+{
+    typedef map42 type;
+};
+
+template< typename Map>
+struct m_at< Map,42 >
+{
+    typedef typename Map::item42 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 43,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item42;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42
+    >
+struct map43
+    : m_item<
+          43
+        , typename P42::first
+        , typename P42::second
+        , map42< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41 >
+        >
+{
+    typedef map43 type;
+};
+
+template< typename Map>
+struct m_at< Map,43 >
+{
+    typedef typename Map::item43 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 44,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item43;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43
+    >
+struct map44
+    : m_item<
+          44
+        , typename P43::first
+        , typename P43::second
+        , map43< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42 >
+        >
+{
+    typedef map44 type;
+};
+
+template< typename Map>
+struct m_at< Map,44 >
+{
+    typedef typename Map::item44 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 45,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item44;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    >
+struct map45
+    : m_item<
+          45
+        , typename P44::first
+        , typename P44::second
+        , map44< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43 >
+        >
+{
+    typedef map45 type;
+};
+
+template< typename Map>
+struct m_at< Map,45 >
+{
+    typedef typename Map::item45 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 46,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item45;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45
+    >
+struct map46
+    : m_item<
+          46
+        , typename P45::first
+        , typename P45::second
+        , map45< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44 >
+        >
+{
+    typedef map46 type;
+};
+
+template< typename Map>
+struct m_at< Map,46 >
+{
+    typedef typename Map::item46 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 47,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item46;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46
+    >
+struct map47
+    : m_item<
+          47
+        , typename P46::first
+        , typename P46::second
+        , map46< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45 >
+        >
+{
+    typedef map47 type;
+};
+
+template< typename Map>
+struct m_at< Map,47 >
+{
+    typedef typename Map::item47 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 48,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item47;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47
+    >
+struct map48
+    : m_item<
+          48
+        , typename P47::first
+        , typename P47::second
+        , map47< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46 >
+        >
+{
+    typedef map48 type;
+};
+
+template< typename Map>
+struct m_at< Map,48 >
+{
+    typedef typename Map::item48 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 49,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item48;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48
+    >
+struct map49
+    : m_item<
+          49
+        , typename P48::first
+        , typename P48::second
+        , map48< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47 >
+        >
+{
+    typedef map49 type;
+};
+
+template< typename Map>
+struct m_at< Map,49 >
+{
+    typedef typename Map::item49 type;
+};
+
+template< typename Key, typename T, typename Base >
+struct m_item< 50,Key,T,Base >
+    : m_item_< Key,T,Base >
+{
+    typedef pair< Key,T > item49;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48, typename P49
+    >
+struct map50
+    : m_item<
+          50
+        , typename P49::first
+        , typename P49::second
+        , map49< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47,P48 >
+        >
+{
+    typedef map50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp
new file mode 100644
index 0000000..e48e991
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp
@@ -0,0 +1,150 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename P0
+    >
+struct map1
+    : m_item<
+          typename P0::first
+        , typename P0::second
+        , map0<  >
+        >
+{
+    typedef map1 type;
+};
+
+template<
+      typename P0, typename P1
+    >
+struct map2
+    : m_item<
+          typename P1::first
+        , typename P1::second
+        , map1<P0>
+        >
+{
+    typedef map2 type;
+};
+
+template<
+      typename P0, typename P1, typename P2
+    >
+struct map3
+    : m_item<
+          typename P2::first
+        , typename P2::second
+        , map2< P0,P1 >
+        >
+{
+    typedef map3 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3
+    >
+struct map4
+    : m_item<
+          typename P3::first
+        , typename P3::second
+        , map3< P0,P1,P2 >
+        >
+{
+    typedef map4 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    >
+struct map5
+    : m_item<
+          typename P4::first
+        , typename P4::second
+        , map4< P0,P1,P2,P3 >
+        >
+{
+    typedef map5 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5
+    >
+struct map6
+    : m_item<
+          typename P5::first
+        , typename P5::second
+        , map5< P0,P1,P2,P3,P4 >
+        >
+{
+    typedef map6 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6
+    >
+struct map7
+    : m_item<
+          typename P6::first
+        , typename P6::second
+        , map6< P0,P1,P2,P3,P4,P5 >
+        >
+{
+    typedef map7 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7
+    >
+struct map8
+    : m_item<
+          typename P7::first
+        , typename P7::second
+        , map7< P0,P1,P2,P3,P4,P5,P6 >
+        >
+{
+    typedef map8 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8
+    >
+struct map9
+    : m_item<
+          typename P8::first
+        , typename P8::second
+        , map8< P0,P1,P2,P3,P4,P5,P6,P7 >
+        >
+{
+    typedef map9 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    >
+struct map10
+    : m_item<
+          typename P9::first
+        , typename P9::second
+        , map9< P0,P1,P2,P3,P4,P5,P6,P7,P8 >
+        >
+{
+    typedef map10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map20.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map20.hpp
new file mode 100644
index 0000000..bb8d388
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map20.hpp
@@ -0,0 +1,170 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10
+    >
+struct map11
+    : m_item<
+          typename P10::first
+        , typename P10::second
+        , map10< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 >
+        >
+{
+    typedef map11 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11
+    >
+struct map12
+    : m_item<
+          typename P11::first
+        , typename P11::second
+        , map11< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10 >
+        >
+{
+    typedef map12 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12
+    >
+struct map13
+    : m_item<
+          typename P12::first
+        , typename P12::second
+        , map12< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11 >
+        >
+{
+    typedef map13 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13
+    >
+struct map14
+    : m_item<
+          typename P13::first
+        , typename P13::second
+        , map13< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12 >
+        >
+{
+    typedef map14 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    >
+struct map15
+    : m_item<
+          typename P14::first
+        , typename P14::second
+        , map14< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13 >
+        >
+{
+    typedef map15 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15
+    >
+struct map16
+    : m_item<
+          typename P15::first
+        , typename P15::second
+        , map15< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14 >
+        >
+{
+    typedef map16 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16
+    >
+struct map17
+    : m_item<
+          typename P16::first
+        , typename P16::second
+        , map16< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15 >
+        >
+{
+    typedef map17 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17
+    >
+struct map18
+    : m_item<
+          typename P17::first
+        , typename P17::second
+        , map17< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16 >
+        >
+{
+    typedef map18 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18
+    >
+struct map19
+    : m_item<
+          typename P18::first
+        , typename P18::second
+        , map18< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17 >
+        >
+{
+    typedef map19 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    >
+struct map20
+    : m_item<
+          typename P19::first
+        , typename P19::second
+        , map19< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18 >
+        >
+{
+    typedef map20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map30.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map30.hpp
new file mode 100644
index 0000000..6a45c0d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map30.hpp
@@ -0,0 +1,190 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20
+    >
+struct map21
+    : m_item<
+          typename P20::first
+        , typename P20::second
+        , map20< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19 >
+        >
+{
+    typedef map21 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21
+    >
+struct map22
+    : m_item<
+          typename P21::first
+        , typename P21::second
+        , map21< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20 >
+        >
+{
+    typedef map22 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22
+    >
+struct map23
+    : m_item<
+          typename P22::first
+        , typename P22::second
+        , map22< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21 >
+        >
+{
+    typedef map23 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23
+    >
+struct map24
+    : m_item<
+          typename P23::first
+        , typename P23::second
+        , map23< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22 >
+        >
+{
+    typedef map24 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    >
+struct map25
+    : m_item<
+          typename P24::first
+        , typename P24::second
+        , map24< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23 >
+        >
+{
+    typedef map25 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25
+    >
+struct map26
+    : m_item<
+          typename P25::first
+        , typename P25::second
+        , map25< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24 >
+        >
+{
+    typedef map26 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26
+    >
+struct map27
+    : m_item<
+          typename P26::first
+        , typename P26::second
+        , map26< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 >
+        >
+{
+    typedef map27 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27
+    >
+struct map28
+    : m_item<
+          typename P27::first
+        , typename P27::second
+        , map27< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26 >
+        >
+{
+    typedef map28 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28
+    >
+struct map29
+    : m_item<
+          typename P28::first
+        , typename P28::second
+        , map28< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27 >
+        >
+{
+    typedef map29 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    >
+struct map30
+    : m_item<
+          typename P29::first
+        , typename P29::second
+        , map29< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28 >
+        >
+{
+    typedef map30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map40.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map40.hpp
new file mode 100644
index 0000000..6fc4f4b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map40.hpp
@@ -0,0 +1,210 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30
+    >
+struct map31
+    : m_item<
+          typename P30::first
+        , typename P30::second
+        , map30< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29 >
+        >
+{
+    typedef map31 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31
+    >
+struct map32
+    : m_item<
+          typename P31::first
+        , typename P31::second
+        , map31< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 >
+        >
+{
+    typedef map32 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32
+    >
+struct map33
+    : m_item<
+          typename P32::first
+        , typename P32::second
+        , map32< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31 >
+        >
+{
+    typedef map33 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33
+    >
+struct map34
+    : m_item<
+          typename P33::first
+        , typename P33::second
+        , map33< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32 >
+        >
+{
+    typedef map34 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    >
+struct map35
+    : m_item<
+          typename P34::first
+        , typename P34::second
+        , map34< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33 >
+        >
+{
+    typedef map35 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35
+    >
+struct map36
+    : m_item<
+          typename P35::first
+        , typename P35::second
+        , map35< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34 >
+        >
+{
+    typedef map36 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36
+    >
+struct map37
+    : m_item<
+          typename P36::first
+        , typename P36::second
+        , map36< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35 >
+        >
+{
+    typedef map37 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37
+    >
+struct map38
+    : m_item<
+          typename P37::first
+        , typename P37::second
+        , map37< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36 >
+        >
+{
+    typedef map38 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38
+    >
+struct map39
+    : m_item<
+          typename P38::first
+        , typename P38::second
+        , map38< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37 >
+        >
+{
+    typedef map39 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    >
+struct map40
+    : m_item<
+          typename P39::first
+        , typename P39::second
+        , map39< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38 >
+        >
+{
+    typedef map40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map50.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map50.hpp
new file mode 100644
index 0000000..7b3980d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/preprocessed/typeof_based/map50.hpp
@@ -0,0 +1,230 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/map/map50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40
+    >
+struct map41
+    : m_item<
+          typename P40::first
+        , typename P40::second
+        , map40< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39 >
+        >
+{
+    typedef map41 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41
+    >
+struct map42
+    : m_item<
+          typename P41::first
+        , typename P41::second
+        , map41< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40 >
+        >
+{
+    typedef map42 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42
+    >
+struct map43
+    : m_item<
+          typename P42::first
+        , typename P42::second
+        , map42< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41 >
+        >
+{
+    typedef map43 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43
+    >
+struct map44
+    : m_item<
+          typename P43::first
+        , typename P43::second
+        , map43< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42 >
+        >
+{
+    typedef map44 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    >
+struct map45
+    : m_item<
+          typename P44::first
+        , typename P44::second
+        , map44< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43 >
+        >
+{
+    typedef map45 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45
+    >
+struct map46
+    : m_item<
+          typename P45::first
+        , typename P45::second
+        , map45< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44 >
+        >
+{
+    typedef map46 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46
+    >
+struct map47
+    : m_item<
+          typename P46::first
+        , typename P46::second
+        , map46< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45 >
+        >
+{
+    typedef map47 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47
+    >
+struct map48
+    : m_item<
+          typename P47::first
+        , typename P47::second
+        , map47< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46 >
+        >
+{
+    typedef map48 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48
+    >
+struct map49
+    : m_item<
+          typename P48::first
+        , typename P48::second
+        , map48< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47 >
+        >
+{
+    typedef map49 type;
+};
+
+template<
+      typename P0, typename P1, typename P2, typename P3, typename P4
+    , typename P5, typename P6, typename P7, typename P8, typename P9
+    , typename P10, typename P11, typename P12, typename P13, typename P14
+    , typename P15, typename P16, typename P17, typename P18, typename P19
+    , typename P20, typename P21, typename P22, typename P23, typename P24
+    , typename P25, typename P26, typename P27, typename P28, typename P29
+    , typename P30, typename P31, typename P32, typename P33, typename P34
+    , typename P35, typename P36, typename P37, typename P38, typename P39
+    , typename P40, typename P41, typename P42, typename P43, typename P44
+    , typename P45, typename P46, typename P47, typename P48, typename P49
+    >
+struct map50
+    : m_item<
+          typename P49::first
+        , typename P49::second
+        , map49< P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30,P31,P32,P33,P34,P35,P36,P37,P38,P39,P40,P41,P42,P43,P44,P45,P46,P47,P48 >
+        >
+{
+    typedef map50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/size_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/size_impl.hpp
new file mode 100644
index 0000000..fd46a1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/size_impl.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_MAP_AUX_SIZE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_SIZE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct size_impl< aux::map_tag >
+{
+    template< typename Map > struct apply
+        : Map::size
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_SIZE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/tag.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/tag.hpp
new file mode 100644
index 0000000..6e3b7f4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/tag.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_MAP_AUX_TAG_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+struct map_tag;
+
+}}}
+
+#endif // BOOST_MPL_MAP_AUX_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/aux_/value_type_impl.hpp b/gatb-core/thirdparty/boost/mpl/map/aux_/value_type_impl.hpp
new file mode 100644
index 0000000..5451b14
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/aux_/value_type_impl.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_MAP_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MAP_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/value_type_fwd.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+namespace boost {
+namespace mpl {
+
+template<>
+struct value_type_impl< aux::map_tag >
+{
+    template< typename Map, typename T > struct apply
+        : second<T>
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MAP_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map0.hpp b/gatb-core/thirdparty/boost/mpl/map/map0.hpp
new file mode 100644
index 0000000..88ed4b7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map0.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_MAP_MAP0_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/map/aux_/contains_impl.hpp>
+#include <boost/mpl/map/aux_/at_impl.hpp>
+//#include <boost/mpl/map/aux_/O1_size.hpp>
+#include <boost/mpl/map/aux_/insert_impl.hpp>
+#include <boost/mpl/map/aux_/insert_range_impl.hpp>
+#include <boost/mpl/map/aux_/erase_impl.hpp>
+#include <boost/mpl/map/aux_/erase_key_impl.hpp>
+#include <boost/mpl/map/aux_/has_key_impl.hpp>
+#include <boost/mpl/map/aux_/key_type_impl.hpp>
+#include <boost/mpl/map/aux_/value_type_impl.hpp>
+#include <boost/mpl/map/aux_/clear_impl.hpp>
+#include <boost/mpl/map/aux_/size_impl.hpp>
+#include <boost/mpl/map/aux_/empty_impl.hpp>
+#include <boost/mpl/map/aux_/begin_end_impl.hpp>
+#include <boost/mpl/map/aux_/iterator.hpp>
+#include <boost/mpl/map/aux_/item.hpp>
+#include <boost/mpl/map/aux_/map0.hpp>
+#include <boost/mpl/map/aux_/tag.hpp>
+
+#endif // BOOST_MPL_MAP_MAP0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map10.hpp b/gatb-core/thirdparty/boost/mpl/map/map10.hpp
new file mode 100644
index 0000000..7c53f3c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map10.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_MAP10_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP10_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/map/map0.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map10.hpp
+#   include <boost/mpl/map/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, 10, <boost/mpl/map/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_MAP_MAP10_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map20.hpp b/gatb-core/thirdparty/boost/mpl/map/map20.hpp
new file mode 100644
index 0000000..f5e61b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map20.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_MAP20_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP20_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/map/map10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map20.hpp
+#   include <boost/mpl/map/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/map/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_MAP_MAP20_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map30.hpp b/gatb-core/thirdparty/boost/mpl/map/map30.hpp
new file mode 100644
index 0000000..4e632b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map30.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_MAP30_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP30_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/map/map20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map30.hpp
+#   include <boost/mpl/map/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/map/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_MAP_MAP30_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map40.hpp b/gatb-core/thirdparty/boost/mpl/map/map40.hpp
new file mode 100644
index 0000000..db66f7a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map40.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_MAP40_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP40_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/map/map30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map40.hpp
+#   include <boost/mpl/map/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/map/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_MAP_MAP40_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/map/map50.hpp b/gatb-core/thirdparty/boost/mpl/map/map50.hpp
new file mode 100644
index 0000000..1c2ef58
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/map/map50.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_MAP_MAP50_HPP_INCLUDED
+#define BOOST_MPL_MAP_MAP50_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/map/map40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER map50.hpp
+#   include <boost/mpl/map/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/map/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_MAP_MAP50_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/math/fixed_c.hpp b/gatb-core/thirdparty/boost/mpl/math/fixed_c.hpp
new file mode 100644
index 0000000..1d78e51
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/math/fixed_c.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_FIXED_C_HPP_INCLUDED
+#define BOOST_MPL_FIXED_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      long IntegerPart
+    , unsigned long FractionPart
+    >
+struct fixed_c
+{
+    BOOST_STATIC_CONSTANT(long, integer_part = IntegerPart);
+    BOOST_STATIC_CONSTANT(unsigned long, fraction_part = FractionPart);
+    typedef fixed_c<IntegerPart, FractionPart> type;
+    
+    fixed_c() {}
+};
+
+}}
+
+#endif // BOOST_MPL_FIXED_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/math/is_even.hpp b/gatb-core/thirdparty/boost/mpl/math/is_even.hpp
new file mode 100644
index 0000000..a39de5b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/math/is_even.hpp
@@ -0,0 +1,54 @@
+
+#ifndef BOOST_MPL_MATH_IS_EVEN_HPP_INCLUDED
+#define BOOST_MPL_MATH_IS_EVEN_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+namespace aux
+{
+  template <class N>
+  struct is_even_base
+  {
+      enum { value = (N::value % 2) == 0 };
+      typedef bool_<value> type;
+  };
+}
+#endif 
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N)
+    >
+struct is_even
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+  : aux::is_even_base<N>::type
+#else
+  : bool_<((N::value % 2) == 0)>
+#endif 
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_even,(N))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, is_even)
+
+}}
+
+#endif // BOOST_MPL_MATH_IS_EVEN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/math/rational_c.hpp b/gatb-core/thirdparty/boost/mpl/math/rational_c.hpp
new file mode 100644
index 0000000..dd1ac3f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/math/rational_c.hpp
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_MPL_RATIONAL_C_HPP_INCLUDED
+#define BOOST_MPL_RATIONAL_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename IntegerType
+    , IntegerType N
+    , IntegerType D = 1
+    >
+struct rational_c
+{
+    BOOST_STATIC_CONSTANT(IntegerType, numerator = N);
+    BOOST_STATIC_CONSTANT(IntegerType, denominator = D);
+    
+    typedef rational_c<IntegerType,N,D> type;
+    rational_c() {}
+};
+
+}}
+
+#endif // BOOST_MPL_RATIONAL_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/max.hpp b/gatb-core/thirdparty/boost/mpl/max.hpp
new file mode 100644
index 0000000..4a4c8c1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/max.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_MAX_HPP_INCLUDED
+#define BOOST_MPL_MAX_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/min_max.hpp>
+
+#endif // BOOST_MPL_MAX_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/max_element.hpp b/gatb-core/thirdparty/boost/mpl/max_element.hpp
new file mode 100644
index 0000000..33244f3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/max_element.hpp
@@ -0,0 +1,72 @@
+
+#ifndef BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED
+#define BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/iter_fold.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(max_element)
+
+namespace aux {
+
+template< typename Predicate >
+struct select_max
+{
+    template< typename OldIterator, typename Iterator >
+    struct apply
+    {
+        typedef typename apply2<
+              Predicate
+            , typename deref<OldIterator>::type
+            , typename deref<Iterator>::type
+            >::type condition_;
+
+        typedef typename if_<
+              condition_
+            , Iterator
+            , OldIterator
+            >::type type;
+    };
+};
+
+} // namespace aux 
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename Predicate = less<_,_>
+    >
+struct max_element
+    : iter_fold<
+          Sequence
+        , typename begin<Sequence>::type
+        , protect< aux::select_max<Predicate> >
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, max_element)
+
+}}
+
+#endif // BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/min.hpp b/gatb-core/thirdparty/boost/mpl/min.hpp
new file mode 100644
index 0000000..d35c2c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/min.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_MIN_HPP_INCLUDED
+#define BOOST_MPL_MIN_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/min_max.hpp>
+
+#endif // BOOST_MPL_MIN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/min_element.hpp b/gatb-core/thirdparty/boost/mpl/min_element.hpp
new file mode 100644
index 0000000..078ee1d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/min_element.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_MIN_ELEMENT_HPP_INCLUDED
+#define BOOST_MPL_MIN_ELEMENT_HPP_INCLUDED
+
+// Copyright David Abrahams 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/max_element.hpp>
+#include <boost/mpl/not.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(min_element)
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename Predicate = less<_,_>
+    >
+struct min_element
+    : max_element<
+          Sequence
+        , mpl::not_<Predicate>
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, min_element)
+
+}}
+
+#endif // BOOST_MPL_MIN_ELEMENT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/min_max.hpp b/gatb-core/thirdparty/boost/mpl/min_max.hpp
new file mode 100644
index 0000000..77545cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/min_max.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_MIN_MAX_HPP_INCLUDED
+#define BOOST_MPL_MIN_MAX_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct min
+    : if_< less<N1,N2>,N1,N2 >
+{
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N1)
+    , typename BOOST_MPL_AUX_NA_PARAM(N2)
+    >
+struct max
+    : if_< less<N1,N2>,N2,N1 >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, min)
+BOOST_MPL_AUX_NA_SPEC(2, max)
+
+}}
+
+#endif // BOOST_MPL_MIN_MAX_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/minus.hpp b/gatb-core/thirdparty/boost/mpl/minus.hpp
new file mode 100644
index 0000000..9f29f74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/minus.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_MINUS_HPP_INCLUDED
+#define BOOST_MPL_MINUS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME minus
+#define AUX778076_OP_TOKEN -
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_MINUS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/modulus.hpp b/gatb-core/thirdparty/boost/mpl/modulus.hpp
new file mode 100644
index 0000000..5cc2ecc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/modulus.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_MODULUS_HPP_INCLUDED
+#define BOOST_MPL_MODULUS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME modulus
+#define AUX778076_OP_TOKEN %
+#define AUX778076_OP_ARITY 2
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_MODULUS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiplies.hpp b/gatb-core/thirdparty/boost/mpl/multiplies.hpp
new file mode 100644
index 0000000..53c39d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiplies.hpp
@@ -0,0 +1,53 @@
+
+#ifndef BOOST_MPL_MULTIPLIES_HPP_INCLUDED
+#define BOOST_MPL_MULTIPLIES_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/times.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/preprocessor/default_params.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+// backward compatibility header, deprecated
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+#   define AUX778076_OP_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#else
+#   define AUX778076_OP_ARITY 2
+#endif
+
+template<
+      BOOST_MPL_PP_DEFAULT_PARAMS(AUX778076_OP_ARITY, typename N, na)
+    >
+struct multiplies
+    : times< BOOST_MPL_PP_PARAMS(AUX778076_OP_ARITY, N) >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          AUX778076_OP_ARITY
+        , multiplies
+        , ( BOOST_MPL_PP_PARAMS(AUX778076_OP_ARITY, N) )
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(AUX778076_OP_ARITY, multiplies)
+
+#undef AUX778076_OP_ARITY
+
+}}
+
+#endif // BOOST_MPL_MULTIPLIES_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/aux_/count_impl.hpp b/gatb-core/thirdparty/boost/mpl/multiset/aux_/count_impl.hpp
new file mode 100644
index 0000000..6cd4a5b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/aux_/count_impl.hpp
@@ -0,0 +1,82 @@
+
+#ifndef BOOST_MPL_MULTISET_AUX_COUNT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_AUX_COUNT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/multiset/aux_/tag.hpp>
+#include <boost/mpl/count_fwd.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#   include <boost/mpl/if.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#endif
+
+namespace boost { namespace mpl {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+namespace aux {
+template< typename S, typename U >
+struct multiset_count_impl
+    : int_< sizeof(S::key_count(BOOST_MPL_AUX_STATIC_CAST(U*,0))) - 1 >
+{
+};
+
+template< typename S, typename U >
+struct multiset_count_ref_impl
+{
+    typedef U (* u_)();
+    typedef int_< sizeof(S::ref_key_count(BOOST_MPL_AUX_STATIC_CAST(u_,0))) - 1 > type_;
+    BOOST_STATIC_CONSTANT(int, value = type_::value);
+    typedef type_ type;
+};
+}
+
+template<>
+struct count_impl< aux::multiset_tag >
+{
+    template< typename Set, typename Key > struct apply
+        : if_< 
+              is_reference<Key>
+            , aux::multiset_count_ref_impl<Set,Key>
+            , aux::multiset_count_impl<Set,Key>
+            >::type
+    {
+    };
+};
+
+#else
+
+template<>
+struct count_impl< aux::multiset_tag >
+{
+    template< typename Set, typename Key > struct apply
+    {
+        enum { msvc71_wknd_ = sizeof(Set::key_count(BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<Key>*,0))) - 1 };
+        typedef int_< msvc71_wknd_ > type;
+        BOOST_STATIC_CONSTANT(int, value = msvc71_wknd_);
+    };
+};
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+}}
+
+#endif // BOOST_MPL_MULTISET_AUX_COUNT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/aux_/insert_impl.hpp b/gatb-core/thirdparty/boost/mpl/multiset/aux_/insert_impl.hpp
new file mode 100644
index 0000000..208da28
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/aux_/insert_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_MULTISET_AUX_INSERT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_AUX_INSERT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/multiset/aux_/item.hpp>
+#include <boost/mpl/multiset/aux_/tag.hpp>
+#include <boost/mpl/insert_fwd.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct insert_impl< aux::multiset_tag >
+{
+    template< typename Set, typename Key, typename unused_ > struct apply
+    {
+        typedef ms_item<Key,Set> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_MULTISET_AUX_INSERT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/aux_/item.hpp b/gatb-core/thirdparty/boost/mpl/multiset/aux_/item.hpp
new file mode 100644
index 0000000..eca21ad
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/aux_/item.hpp
@@ -0,0 +1,114 @@
+
+#ifndef BOOST_MPL_MULTISET_AUX_ITEM_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_AUX_ITEM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/multiset/aux_/tag.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/config/arrays.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/next.hpp>
+#   include <boost/type_traits/is_same.hpp>
+#endif
+
+
+namespace boost { namespace mpl {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+template< typename T, typename Base >
+struct ms_item
+{
+    typedef aux::multiset_tag tag;
+
+    template< typename U > struct prior_count
+    {
+        enum { msvc70_wknd_ = sizeof(Base::key_count(BOOST_MPL_AUX_STATIC_CAST(U*,0))) };
+        typedef int_< msvc70_wknd_ > count_;
+        typedef typename eval_if< is_same<T,U>, next<count_>, count_ >::type c_;
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+        typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(c_)::value>::type type;
+#else
+        typedef char (&type)[BOOST_MPL_AUX_MSVC_VALUE_WKND(c_)::value];
+#endif
+    };
+
+    template< typename U > struct prior_ref_count
+    {
+        typedef U (* u_)();
+        enum { msvc70_wknd_ = sizeof(Base::ref_key_count(BOOST_MPL_AUX_STATIC_CAST(u_,0))) }; 
+        typedef int_< msvc70_wknd_ > count_;
+        typedef typename eval_if< is_same<T,U>, next<count_>, count_ >::type c_;
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+        typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(c_)::value>::type type;
+#else
+        typedef char (&type)[BOOST_MPL_AUX_MSVC_VALUE_WKND(c_)::value];
+#endif
+    };
+
+    template< typename U >
+    static typename prior_count<U>::type key_count(U*);
+
+    template< typename U >
+    static typename prior_ref_count<U>::type ref_key_count(U (*)());
+};
+
+#else // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+namespace aux {
+template< typename U, typename Base >
+struct prior_key_count
+{
+    enum { msvc71_wknd_ = sizeof(Base::key_count(BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<U>*,0))) }; 
+    typedef int_< msvc71_wknd_ > count_;
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+    typedef typename aux::weighted_tag< BOOST_MPL_AUX_VALUE_WKND(count_)::value >::type type;
+#else
+    typedef char (&type)[count_::value];
+#endif
+};
+}
+
+template< typename T, typename Base >
+struct ms_item
+{
+    typedef aux::multiset_tag tag;
+
+    enum { msvc71_wknd_ = sizeof(Base::key_count(BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<T>*,0))) + 1 };
+    typedef int_< msvc71_wknd_ > count_;
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+    static 
+    typename aux::weighted_tag< BOOST_MPL_AUX_VALUE_WKND(count_)::value >::type
+        key_count(aux::type_wrapper<T>*);
+#else
+    static char (& key_count(aux::type_wrapper<T>*) )[count_::value];
+#endif
+
+    template< typename U >
+    static typename aux::prior_key_count<U,Base>::type key_count(aux::type_wrapper<U>*);
+};
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+}}
+
+#endif // BOOST_MPL_MULTISET_AUX_ITEM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/aux_/multiset0.hpp b/gatb-core/thirdparty/boost/mpl/multiset/aux_/multiset0.hpp
new file mode 100644
index 0000000..e8cb9d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/aux_/multiset0.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_MULTISET_AUX_MULTISET0_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_AUX_MULTISET0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/multiset/aux_/tag.hpp>
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace mpl {
+
+template< int dummy_ = 0 >
+struct multiset0
+{
+    typedef aux::multiset_tag tag;
+
+    typedef int_<1> count_;
+    static char (& key_count(...) )[count_::value];
+    static char (& ref_key_count(...) )[count_::value];
+};
+
+}}
+
+#endif // BOOST_MPL_MULTISET_AUX_MULTISET0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/aux_/tag.hpp b/gatb-core/thirdparty/boost/mpl/multiset/aux_/tag.hpp
new file mode 100644
index 0000000..3988ca1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/aux_/tag.hpp
@@ -0,0 +1,23 @@
+
+#ifndef BOOST_MPL_MULTISET_AUX_TAG_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_AUX_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+struct multiset_tag;
+
+}}}
+
+#endif // BOOST_MPL_MULTISET_AUX_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/multiset/multiset0.hpp b/gatb-core/thirdparty/boost/mpl/multiset/multiset0.hpp
new file mode 100644
index 0000000..62a3c74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/multiset/multiset0.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_MULTISET_MULTISET0_HPP_INCLUDED
+#define BOOST_MPL_MULTISET_MULTISET0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+//#include <boost/mpl/multiset/aux_/at.hpp>
+//#include <boost/mpl/multiset/aux_/front.hpp>
+//#include <boost/mpl/multiset/aux_/push_front.hpp>
+//#include <boost/mpl/multiset/aux_/pop_front.hpp>
+//#include <boost/mpl/multiset/aux_/back.hpp>
+//#include <boost/mpl/multiset/aux_/clear.hpp>
+//#include <boost/mpl/multiset/aux_/O1_size.hpp>
+//#include <boost/mpl/multiset/aux_/size.hpp>
+//#include <boost/mpl/multiset/aux_/empty.hpp>
+//#include <boost/mpl/multiset/aux_/empty.hpp>
+#include <boost/mpl/multiset/aux_/insert_impl.hpp>
+#include <boost/mpl/multiset/aux_/count_impl.hpp>
+//#include <boost/mpl/multiset/aux_/has_key_impl.hpp>
+//#include <boost/mpl/multiset/aux_/begin_end_impl.hpp>
+//#include <boost/mpl/multiset/aux_/iterator.hpp>
+#include <boost/mpl/multiset/aux_/item.hpp>
+#include <boost/mpl/multiset/aux_/multiset0.hpp>
+#include <boost/mpl/multiset/aux_/tag.hpp>
+
+#endif // BOOST_MPL_MULTISET_MULTISET0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/negate.hpp b/gatb-core/thirdparty/boost/mpl/negate.hpp
new file mode 100644
index 0000000..d6aa065
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/negate.hpp
@@ -0,0 +1,81 @@
+
+#ifndef BOOST_MPL_NEGATE_HPP_INCLUDED
+#define BOOST_MPL_NEGATE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/config/integral.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct negate_impl;
+
+template< typename T > struct negate_tag
+{
+    typedef typename T::tag type;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(N)
+    >
+struct negate
+#if !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+    : negate_impl<
+          typename negate_tag<N>::type
+        >::template apply<N>::type
+#else
+    : aux::msvc_eti_base< typename apply_wrap1<
+          negate_impl< typename negate_tag<N>::type >
+        , N
+        >::type >::type
+#endif
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, negate, (N))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, negate)
+
+
+#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+namespace aux {
+template< typename T, T n > struct negate_wknd
+{
+    BOOST_STATIC_CONSTANT(T, value = -n);
+    typedef integral_c<T,value> type;
+};
+}
+#endif
+
+template<>
+struct negate_impl<integral_c_tag>
+{
+#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)
+    template< typename N > struct apply
+        : aux::negate_wknd< typename N::value_type, N::value >
+#else
+    template< typename N > struct apply
+        : integral_c< typename N::value_type, (-N::value) >
+#endif    
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_NEGATE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/next.hpp b/gatb-core/thirdparty/boost/mpl/next.hpp
new file mode 100644
index 0000000..954b222
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/next.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_NEXT_HPP_INCLUDED
+#define BOOST_MPL_NEXT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/next_prior.hpp>
+
+#endif // BOOST_MPL_NEXT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/next_prior.hpp b/gatb-core/thirdparty/boost/mpl/next_prior.hpp
new file mode 100644
index 0000000..d45fa20
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/next_prior.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED
+#define BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/common_name_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_COMMON_NAME_WKND(next)
+BOOST_MPL_AUX_COMMON_NAME_WKND(prior)
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct next
+{
+    typedef typename T::next type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,next,(T))
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct prior
+{
+    typedef typename T::prior type;
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,prior,(T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, next)
+BOOST_MPL_AUX_NA_SPEC(1, prior)
+
+}}
+
+#endif // BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/not.hpp b/gatb-core/thirdparty/boost/mpl/not.hpp
new file mode 100644
index 0000000..d5f6025
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/not.hpp
@@ -0,0 +1,51 @@
+
+#ifndef BOOST_MPL_NOT_HPP_INCLUDED
+#define BOOST_MPL_NOT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/nested_type_wknd.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, C_) > // 'long' is intentional here
+struct not_impl
+    : bool_<!C_>
+{
+};
+
+} // namespace aux
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct not_
+    : aux::not_impl<
+          BOOST_MPL_AUX_NESTED_TYPE_WKND(T)::value
+        >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,not_,(T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1,not_)
+
+}}
+
+#endif // BOOST_MPL_NOT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/not_equal_to.hpp b/gatb-core/thirdparty/boost/mpl/not_equal_to.hpp
new file mode 100644
index 0000000..11ef342
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/not_equal_to.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_NOT_EQUAL_TO_HPP_INCLUDED
+#define BOOST_MPL_NOT_EQUAL_TO_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME not_equal_to
+#define AUX778076_OP_TOKEN !=
+#include <boost/mpl/aux_/comparison_op.hpp>
+
+#endif // BOOST_MPL_NOT_EQUAL_TO_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/numeric_cast.hpp b/gatb-core/thirdparty/boost/mpl/numeric_cast.hpp
new file mode 100644
index 0000000..6541470
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/numeric_cast.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_NUMERIC_CAST_HPP_INCLUDED
+#define BOOST_MPL_NUMERIC_CAST_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+// agurt 21/sep/04: portability macro for the sake of MSVC 6.x-7.0;
+// resolves conflicts with 'boost::numeric_cast' function template.
+// use it in your own code _only_ if you care about compatibility with
+// these outdated compilers!
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570) )
+#   define BOOST_MPL_AUX_NUMERIC_CAST numeric_cast_
+#else
+#   define BOOST_MPL_AUX_NUMERIC_CAST numeric_cast
+#endif
+
+namespace boost { namespace mpl {
+
+// no default implementation; the definition is needed to make MSVC happy
+
+template< typename SourceTag, typename TargetTag > struct BOOST_MPL_AUX_NUMERIC_CAST
+{
+    template< typename N > struct apply;
+};
+
+}}
+
+#endif // BOOST_MPL_NUMERIC_CAST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/or.hpp b/gatb-core/thirdparty/boost/mpl/or.hpp
new file mode 100644
index 0000000..f9704d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/or.hpp
@@ -0,0 +1,61 @@
+
+#ifndef BOOST_MPL_OR_HPP_INCLUDED
+#define BOOST_MPL_OR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   include <boost/mpl/bool.hpp>
+#   include <boost/mpl/aux_/nested_type_wknd.hpp>
+#   include <boost/mpl/aux_/na_spec.hpp>
+#   include <boost/mpl/aux_/lambda_support.hpp>
+#   include <boost/mpl/aux_/config/msvc.hpp>
+
+// agurt, 19/may/04: workaround a conflict with <iso646.h> header's 
+// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(or)'
+// has to be checked in a separate condition, otherwise GCC complains 
+// about 'or' being an alternative token
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(or)
+#   pragma push_macro("or")
+#   undef or
+#   define or(x)
+#endif
+#endif
+#endif
+
+#   define BOOST_MPL_PREPROCESSED_HEADER or.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#if defined(_MSC_VER) && !defined(__clang__)
+#ifndef __GCCXML__
+#if defined(or)
+#   pragma pop_macro("or")
+#endif
+#endif
+#endif
+
+#else
+
+#   define AUX778076_OP_NAME or_
+#   define AUX778076_OP_VALUE1 true
+#   define AUX778076_OP_VALUE2 false
+#   include <boost/mpl/aux_/logical_op.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_OR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/order.hpp b/gatb-core/thirdparty/boost/mpl/order.hpp
new file mode 100644
index 0000000..50da710
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/order.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_ORDER_HPP_INCLUDED
+#define BOOST_MPL_ORDER_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/order_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/order_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(AssociativeSequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Key)
+    >
+struct order
+    : order_impl< typename sequence_tag<AssociativeSequence>::type >
+        ::template apply<AssociativeSequence,Key>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,order,(AssociativeSequence,Key))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, order)
+
+}}
+
+#endif // BOOST_MPL_ORDER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/order_fwd.hpp b/gatb-core/thirdparty/boost/mpl/order_fwd.hpp
new file mode 100644
index 0000000..d89fef1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/order_fwd.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_ORDER_FWD_HPP_INCLUDED
+#define BOOST_MPL_ORDER_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct order_impl;
+template< typename AssociativeSequence, typename Key > struct order;
+
+}}
+
+#endif // BOOST_MPL_ORDER_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pair.hpp b/gatb-core/thirdparty/boost/mpl/pair.hpp
new file mode 100644
index 0000000..67c01d7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pair.hpp
@@ -0,0 +1,70 @@
+
+#ifndef BOOST_MPL_PAIR_HPP_INCLUDED
+#define BOOST_MPL_PAIR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T1)
+    , typename BOOST_MPL_AUX_NA_PARAM(T2)
+    >
+struct pair
+{
+    typedef pair type;
+    typedef T1 first;
+    typedef T2 second;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,pair,(T1,T2))
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(P)
+    >
+struct first
+{
+#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)
+    typedef typename P::first type;
+#else
+    typedef typename aux::msvc_eti_base<P>::first type;
+#endif
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,first,(P))
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(P)
+    >
+struct second
+{
+#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)
+    typedef typename P::second type;
+#else
+    typedef typename aux::msvc_eti_base<P>::second type;
+#endif
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,second,(P))
+};
+
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(2, pair)
+BOOST_MPL_AUX_NA_SPEC(1, first)
+BOOST_MPL_AUX_NA_SPEC(1, second)
+
+}}
+
+#endif // BOOST_MPL_PAIR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pair_view.hpp b/gatb-core/thirdparty/boost/mpl/pair_view.hpp
new file mode 100644
index 0000000..a72cf92
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pair_view.hpp
@@ -0,0 +1,169 @@
+
+#ifndef BOOST_MPL_PAIR_VIEW_HPP_INCLUDED
+#define BOOST_MPL_PAIR_VIEW_HPP_INCLUDED
+
+// Copyright David Abrahams 2003-2004
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/iterator_category.hpp>
+#include <boost/mpl/advance.hpp>
+#include <boost/mpl/distance.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/min_max.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+struct pair_iter_tag;
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Iter1, typename Iter2, typename Category >
+struct pair_iter;
+
+template< typename Category > struct prior_pair_iter
+{
+    template< typename Iter1, typename Iter2 > struct apply
+    {
+        typedef typename mpl::prior<Iter1>::type i1_;
+        typedef typename mpl::prior<Iter2>::type i2_;
+        typedef pair_iter<i1_,i2_,Category> type;
+    };
+};
+
+template<> struct prior_pair_iter<forward_iterator_tag>
+{
+    template< typename Iter1, typename Iter2 > struct apply
+    {
+        typedef pair_iter<Iter1,Iter2,forward_iterator_tag> type;
+    };
+};
+
+#endif
+}
+
+template< 
+      typename Iter1
+    , typename Iter2
+    , typename Category
+    >
+struct pair_iter
+{
+    typedef aux::pair_iter_tag tag;
+    typedef Category category;
+    typedef Iter1 first;
+    typedef Iter2 second;
+    
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    typedef pair< 
+          typename deref<Iter1>::type
+        , typename deref<Iter2>::type
+        > type;
+
+    typedef typename mpl::next<Iter1>::type i1_;
+    typedef typename mpl::next<Iter2>::type i2_;
+    typedef pair_iter<i1_,i2_,Category> next;
+    
+    typedef apply_wrap2< aux::prior_pair_iter<Category>,Iter1,Iter2 >::type prior;
+#endif
+};
+
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Iter1, typename Iter2, typename C >
+struct deref< pair_iter<Iter1,Iter2,C> >
+{
+    typedef pair< 
+          typename deref<Iter1>::type
+        , typename deref<Iter2>::type
+        > type;
+};
+
+template< typename Iter1, typename Iter2, typename C >
+struct next< pair_iter<Iter1,Iter2,C> >
+{
+    typedef typename mpl::next<Iter1>::type i1_;
+    typedef typename mpl::next<Iter2>::type i2_;
+    typedef pair_iter<i1_,i2_,C> type;
+};
+
+template< typename Iter1, typename Iter2, typename C >
+struct prior< pair_iter<Iter1,Iter2,C> >
+{
+    typedef typename mpl::prior<Iter1>::type i1_;
+    typedef typename mpl::prior<Iter2>::type i2_;
+    typedef pair_iter<i1_,i2_,C> type;
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+
+template<> struct advance_impl<aux::pair_iter_tag>
+{
+    template< typename Iter, typename D > struct apply
+    {
+        typedef typename mpl::advance< typename Iter::first,D >::type i1_;
+        typedef typename mpl::advance< typename Iter::second,D >::type i2_;
+        typedef pair_iter<i1_,i2_,typename Iter::category> type;
+    };
+};
+
+template<> struct distance_impl<aux::pair_iter_tag>
+{
+    template< typename Iter1, typename Iter2 > struct apply
+    {
+        // agurt, 10/nov/04: MSVC 6.5 ICE-s on forwarding
+        typedef typename mpl::distance<
+              typename first<Iter1>::type
+            , typename first<Iter2>::type
+            >::type type;
+    };
+};
+
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence1)
+    , typename BOOST_MPL_AUX_NA_PARAM(Sequence2)
+    >
+struct pair_view
+{
+    typedef nested_begin_end_tag tag;
+
+    typedef typename begin<Sequence1>::type iter1_;
+    typedef typename begin<Sequence2>::type iter2_;
+    typedef typename min<
+          typename iterator_category<iter1_>::type
+        , typename iterator_category<iter2_>::type
+        >::type category_;
+    
+    typedef pair_iter<iter1_,iter2_,category_> begin;
+    
+    typedef pair_iter<
+          typename end<Sequence1>::type
+        , typename end<Sequence2>::type
+        , category_
+        > end;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, pair_view)
+
+}}
+
+#endif // BOOST_MPL_PAIR_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/partition.hpp b/gatb-core/thirdparty/boost/mpl/partition.hpp
new file mode 100644
index 0000000..795a39b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/partition.hpp
@@ -0,0 +1,53 @@
+
+#ifndef BOOST_MPL_PARTITION_HPP_INCLUDED
+#define BOOST_MPL_PARTITION_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002-2003
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/stable_partition.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+ 
+template <
+      typename Sequence
+    , typename Pred
+    , typename In1
+    , typename In2
+    >
+struct partition_impl
+    : stable_partition_impl<Sequence,Pred,In1,In2>
+{
+};
+
+template <
+      typename Sequence
+    , typename Pred
+    , typename In1
+    , typename In2
+    >
+struct reverse_partition_impl
+    : reverse_stable_partition_impl<Sequence,Pred,In1,In2>
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, partition)
+
+}}
+
+#endif // BOOST_MPL_PARTITION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/placeholders.hpp b/gatb-core/thirdparty/boost/mpl/placeholders.hpp
new file mode 100644
index 0000000..df0373c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/placeholders.hpp
@@ -0,0 +1,100 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED
+#define BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Peter Dimov 2001-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/arg.hpp>
+#   include <boost/mpl/aux_/adl_barrier.hpp>
+
+#   if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)
+#       define BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(type) \
+        using ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::type; \
+        /**/
+#   else
+#       define BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(type) /**/
+#   endif
+
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER placeholders.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+// watch out for GNU gettext users, who #define _(x)
+#if !defined(_) || defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+typedef arg<-1> _;
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+namespace boost { namespace mpl { 
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;
+}
+
+}}
+#endif
+
+/// agurt, 17/mar/02: one more placeholder for the last 'apply#' 
+/// specialization
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY + 1, <boost/mpl/placeholders.hpp>))
+#include BOOST_PP_ITERATE()
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+typedef arg<i_> BOOST_PP_CAT(_,i_);
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+namespace boost { namespace mpl { 
+
+BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(BOOST_PP_CAT(_,i_))
+
+namespace placeholders {
+using BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::BOOST_PP_CAT(_,i_);
+}
+
+}}
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/plus.hpp b/gatb-core/thirdparty/boost/mpl/plus.hpp
new file mode 100644
index 0000000..455920b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/plus.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_PLUS_HPP_INCLUDED
+#define BOOST_MPL_PLUS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME plus
+#define AUX778076_OP_TOKEN +
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_PLUS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pop_back.hpp b/gatb-core/thirdparty/boost/mpl/pop_back.hpp
new file mode 100644
index 0000000..92fb4f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pop_back.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_POP_BACK_HPP_INCLUDED
+#define BOOST_MPL_POP_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_back_fwd.hpp>
+#include <boost/mpl/aux_/pop_back_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct pop_back
+    : pop_back_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,pop_back,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, pop_back)
+
+}}
+
+#endif // BOOST_MPL_POP_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pop_back_fwd.hpp b/gatb-core/thirdparty/boost/mpl/pop_back_fwd.hpp
new file mode 100644
index 0000000..7095704
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pop_back_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_POP_BACK_FWD_HPP_INCLUDED
+#define BOOST_MPL_POP_BACK_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct pop_back_impl;
+template< typename Sequence > struct pop_back;
+
+}}
+
+#endif // BOOST_MPL_POP_BACK_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pop_front.hpp b/gatb-core/thirdparty/boost/mpl/pop_front.hpp
new file mode 100644
index 0000000..76dfbca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pop_front.hpp
@@ -0,0 +1,39 @@
+
+#ifndef BOOST_MPL_POP_FRONT_HPP_INCLUDED
+#define BOOST_MPL_POP_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_front_fwd.hpp>
+#include <boost/mpl/aux_/pop_front_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct pop_front
+    : pop_front_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,pop_front,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, pop_front)
+
+}}
+
+#endif // BOOST_MPL_POP_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/pop_front_fwd.hpp b/gatb-core/thirdparty/boost/mpl/pop_front_fwd.hpp
new file mode 100644
index 0000000..719c8b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/pop_front_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED
+#define BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct pop_front_impl;
+template< typename Sequence > struct pop_front;
+
+}}
+
+#endif // BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/print.hpp b/gatb-core/thirdparty/boost/mpl/print.hpp
new file mode 100644
index 0000000..e3b0d31
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/print.hpp
@@ -0,0 +1,75 @@
+
+#ifndef BOOST_MPL_PRINT_HPP_INCLUDED
+#define BOOST_MPL_PRINT_HPP_INCLUDED
+
+// Copyright David Abrahams 2003
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace mpl {
+  
+namespace aux {
+#if defined(BOOST_MSVC)
+# pragma warning(push, 3)
+// we only want one warning from MSVC, so turn off the other one
+# pragma warning(disable: 4307)
+#elif defined(__MWERKS__)
+# pragma warn_hidevirtual on
+   struct print_base { virtual void f() {} };
+#endif
+
+#if defined(__EDG_VERSION__)
+  template <class T>
+  struct dependent_unsigned
+  {
+      static const unsigned value = 1;
+  };
+#endif
+} // namespace aux
+
+template <class T>
+struct print
+    : mpl::identity<T>
+#if defined(__MWERKS__)
+    , aux::print_base
+#endif 
+{
+#if defined(__clang__)
+    const int m_x = 1 / (sizeof(T) - sizeof(T));
+#elif defined(BOOST_MSVC)
+    enum { n = sizeof(T) + -1 };
+#elif defined(__MWERKS__)
+    void f(int);
+#else 
+    enum {
+        n =
+# if defined(__EDG_VERSION__)
+           aux::dependent_unsigned<T>::value > -1
+# else 
+           sizeof(T) > -1
+# endif 
+        };
+#endif 
+};
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#elif defined(__MWERKS__)
+# pragma warn_hidevirtual reset
+#endif
+
+}}
+
+#endif // BOOST_MPL_PRINT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/prior.hpp b/gatb-core/thirdparty/boost/mpl/prior.hpp
new file mode 100644
index 0000000..849802c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/prior.hpp
@@ -0,0 +1,19 @@
+
+#ifndef BOOST_MPL_PRIOR_HPP_INCLUDED
+#define BOOST_MPL_PRIOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/next_prior.hpp>
+
+#endif // BOOST_MPL_PRIOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/protect.hpp b/gatb-core/thirdparty/boost/mpl/protect.hpp
new file mode 100644
index 0000000..80574c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/protect.hpp
@@ -0,0 +1,55 @@
+
+#ifndef BOOST_MPL_PROTECT_HPP_INCLUDED
+#define BOOST_MPL_PROTECT_HPP_INCLUDED
+
+// Copyright Peter Dimov 2001
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/arity.hpp>
+#include <boost/mpl/aux_/config/dtp.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    , int not_le_ = 0
+    >
+struct protect : T
+{
+#if BOOST_WORKAROUND(__EDG_VERSION__, == 238)
+    typedef mpl::protect type;
+#else
+    typedef protect type;
+#endif
+};
+
+#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
+namespace aux { 
+template< BOOST_MPL_AUX_NTTP_DECL(int, N), typename T >
+struct arity< protect<T>, N > 
+    : arity<T,N>
+{ 
+};
+} // namespace aux
+#endif
+
+BOOST_MPL_AUX_NA_SPEC_MAIN(1, protect)
+#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
+BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(1, 1, protect)
+#endif
+
+}}
+
+#endif // BOOST_MPL_PROTECT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/push_back.hpp b/gatb-core/thirdparty/boost/mpl/push_back.hpp
new file mode 100644
index 0000000..95a2587
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/push_back.hpp
@@ -0,0 +1,53 @@
+
+#ifndef BOOST_MPL_PUSH_BACK_HPP_INCLUDED
+#define BOOST_MPL_PUSH_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_back_fwd.hpp>
+#include <boost/mpl/aux_/push_back_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct push_back
+    : push_back_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,T >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,push_back,(Sequence,T))
+};
+
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct has_push_back
+    : has_push_back_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,has_push_back,(Sequence))
+};
+
+
+BOOST_MPL_AUX_NA_SPEC(2, push_back)
+BOOST_MPL_AUX_NA_SPEC(1, has_push_back)
+
+}}
+
+#endif // BOOST_MPL_PUSH_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/push_back_fwd.hpp b/gatb-core/thirdparty/boost/mpl/push_back_fwd.hpp
new file mode 100644
index 0000000..7a4f7a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/push_back_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED
+#define BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct push_back_impl;
+template< typename Sequence, typename T > struct push_back;
+
+}}
+
+#endif // BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/push_front.hpp b/gatb-core/thirdparty/boost/mpl/push_front.hpp
new file mode 100644
index 0000000..e4d0dfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/push_front.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_PUSH_FRONT_HPP_INCLUDED
+#define BOOST_MPL_PUSH_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front_fwd.hpp>
+#include <boost/mpl/aux_/push_front_impl.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct push_front
+    : push_front_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence,T >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,push_front,(Sequence,T))
+};
+
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct has_push_front
+    : has_push_front_impl< typename sequence_tag<Sequence>::type >
+        ::template apply< Sequence >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,has_push_front,(Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, push_front)
+BOOST_MPL_AUX_NA_SPEC(1, has_push_front)
+
+}}
+
+#endif // BOOST_MPL_PUSH_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/push_front_fwd.hpp b/gatb-core/thirdparty/boost/mpl/push_front_fwd.hpp
new file mode 100644
index 0000000..d6ad5af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/push_front_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED
+#define BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct push_front_impl;
+template< typename Sequence, typename T > struct push_front;
+
+}}
+
+#endif // BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/quote.hpp b/gatb-core/thirdparty/boost/mpl/quote.hpp
new file mode 100644
index 0000000..242c2e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/quote.hpp
@@ -0,0 +1,151 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_QUOTE_HPP_INCLUDED
+#define BOOST_MPL_QUOTE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/void.hpp>
+#   include <boost/mpl/aux_/has_type.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/bcc.hpp>
+#include <boost/mpl/aux_/config/ttp.hpp>
+
+#if defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \
+    && !defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS)
+#   define BOOST_MPL_CFG_NO_QUOTE_TEMPLATE
+#endif
+
+#if !defined(BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS) \
+    && defined(BOOST_MPL_CFG_NO_HAS_XXX)
+#   define BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER quote.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/params.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/workaround.hpp>
+
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_QUOTE_TEMPLATE)
+
+namespace boost { namespace mpl {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename T, bool has_type_ >
+struct quote_impl
+// GCC has a problem with metafunction forwarding when T is a
+// specialization of a template called 'type'.
+# if BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4)) \
+    && BOOST_WORKAROUND(__GNUC_MINOR__, BOOST_TESTED_AT(0)) \
+    && BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, BOOST_TESTED_AT(2))
+{
+    typedef typename T::type type;
+};
+# else 
+    : T
+{
+};
+# endif 
+
+template< typename T >
+struct quote_impl<T,false>
+{
+    typedef T type;
+};
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template< bool > struct quote_impl
+{
+    template< typename T > struct result_
+        : T
+    {
+    };
+};
+
+template<> struct quote_impl<false>
+{
+    template< typename T > struct result_
+    {
+        typedef T type;
+    };
+};
+
+#endif 
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/quote.hpp>))
+#include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_QUOTE_TEMPLATE
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_QUOTE_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+template<
+      template< BOOST_MPL_PP_PARAMS(i_, typename P) > class F
+    , typename Tag = void_
+    >
+struct BOOST_PP_CAT(quote,i_)
+{
+    template< BOOST_MPL_PP_PARAMS(i_, typename U) > struct apply
+#if defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS)
+    {
+        typedef typename quote_impl<
+              F< BOOST_MPL_PP_PARAMS(i_, U) >
+            , aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value
+            >::type type;
+    };
+#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+        : quote_impl<
+              F< BOOST_MPL_PP_PARAMS(i_, U) >
+            , aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value
+            >
+    {
+    };
+#else
+        : quote_impl< aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value >
+            ::template result_< F< BOOST_MPL_PP_PARAMS(i_, U) > >
+    {
+    };
+#endif
+};
+
+#undef i_
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/range_c.hpp b/gatb-core/thirdparty/boost/mpl/range_c.hpp
new file mode 100644
index 0000000..ba95062
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/range_c.hpp
@@ -0,0 +1,48 @@
+
+#ifndef BOOST_MPL_RANGE_C_HPP_INCLUDED
+#define BOOST_MPL_RANGE_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/aux_/range_c/front.hpp>
+#include <boost/mpl/aux_/range_c/back.hpp>
+#include <boost/mpl/aux_/range_c/size.hpp>
+#include <boost/mpl/aux_/range_c/O1_size.hpp>
+#include <boost/mpl/aux_/range_c/empty.hpp>
+#include <boost/mpl/aux_/range_c/iterator.hpp>
+#include <boost/mpl/aux_/range_c/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T Start
+    , T Finish
+    >
+struct range_c
+{
+    typedef aux::half_open_range_tag tag;
+    typedef T value_type;
+    typedef range_c type;
+
+    typedef integral_c<T,Start> start;
+    typedef integral_c<T,Finish> finish;
+
+    typedef r_iter<start> begin;
+    typedef r_iter<finish> end;
+};
+
+}}
+
+#endif // BOOST_MPL_RANGE_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/remove.hpp b/gatb-core/thirdparty/boost/mpl/remove.hpp
new file mode 100644
index 0000000..9c72f9e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/remove.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_REMOVE_HPP_INCLUDED
+#define BOOST_MPL_REMOVE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/remove_if.hpp>
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Sequence
+    , typename T
+    , typename Inserter 
+    >
+struct remove_impl
+    : remove_if_impl< Sequence, same_as<T>, Inserter >
+{
+};
+
+template<
+      typename Sequence
+    , typename T
+    , typename Inserter 
+    >
+struct reverse_remove_impl
+    : reverse_remove_if_impl< Sequence, same_as<T>, Inserter >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, remove)
+
+}}
+
+#endif // BOOST_MPL_REMOVE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/remove_if.hpp b/gatb-core/thirdparty/boost/mpl/remove_if.hpp
new file mode 100644
index 0000000..bbe6564
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/remove_if.hpp
@@ -0,0 +1,83 @@
+
+#ifndef BOOST_MPL_REMOVE_IF_HPP_INCLUDED
+#define BOOST_MPL_REMOVE_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/protect.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Pred, typename InsertOp > struct remove_if_helper
+{
+    template< typename Sequence, typename U > struct apply
+    {
+        typedef typename eval_if<
+              typename apply1<Pred,U>::type
+            , identity<Sequence>
+            , apply2<InsertOp,Sequence,U>
+            >::type type;
+    };
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct remove_if_impl
+    : fold<
+          Sequence
+        , typename Inserter::state
+        , protect< aux::remove_if_helper<
+              typename lambda<Predicate>::type
+            , typename Inserter::operation
+            > >
+        >
+{
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct reverse_remove_if_impl
+    : reverse_fold<
+          Sequence
+        , typename Inserter::state
+        , protect< aux::remove_if_helper<
+              typename lambda<Predicate>::type
+            , typename Inserter::operation
+            > >
+        >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, remove_if)
+
+}}
+
+#endif // BOOST_MPL_REMOVE_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/replace.hpp b/gatb-core/thirdparty/boost/mpl/replace.hpp
new file mode 100644
index 0000000..bb46dfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/replace.hpp
@@ -0,0 +1,55 @@
+
+#ifndef BOOST_MPL_REPLACE_HPP_INCLUDED
+#define BOOST_MPL_REPLACE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright John R. Bandela 2000-2002
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/replace_if.hpp>
+#include <boost/mpl/same_as.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+      typename Sequence
+    , typename OldType
+    , typename NewType
+    , typename Inserter 
+    >
+struct replace_impl
+    : replace_if_impl< Sequence, same_as<OldType>, NewType, Inserter >
+{
+};
+
+template<
+      typename Sequence
+    , typename OldType
+    , typename NewType
+    , typename Inserter 
+    >
+struct reverse_replace_impl
+    : reverse_replace_if_impl< Sequence, same_as<OldType>, NewType, Inserter >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, replace)
+
+}}
+
+#endif // BOOST_MPL_REPLACE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/replace_if.hpp b/gatb-core/thirdparty/boost/mpl/replace_if.hpp
new file mode 100644
index 0000000..79466c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/replace_if.hpp
@@ -0,0 +1,88 @@
+
+#ifndef BOOST_MPL_REPLACE_IF_HPP_INCLUDED
+#define BOOST_MPL_REPLACE_IF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright John R. Bandela 2000-2002
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Predicate, typename T >
+struct replace_if_op
+{
+    template< typename U > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : if_<
+              typename apply1<Predicate,U>::type
+            , T
+            , U
+            >
+    {
+#else
+    {
+        typedef typename if_<
+              typename apply1<Predicate,U>::type
+            , T
+            , U
+            >::type type;
+#endif
+    };
+};
+
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename T
+    , typename Inserter
+    >
+struct replace_if_impl
+    : transform1_impl<
+          Sequence
+        , protect< aux::replace_if_op<Predicate,T> >
+        , Inserter
+        >
+{
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename T
+    , typename Inserter
+    >
+struct reverse_replace_if_impl
+    : reverse_transform1_impl<
+          Sequence
+        , protect< aux::replace_if_op<Predicate,T> >
+        , Inserter
+        >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, replace_if)
+
+}}
+
+#endif // BOOST_MPL_REPLACE_IF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/reverse.hpp b/gatb-core/thirdparty/boost/mpl/reverse.hpp
new file mode 100644
index 0000000..dd1fc18
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/reverse.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_REVERSE_HPP_INCLUDED
+#define BOOST_MPL_REVERSE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(Inserter)
+    >
+struct reverse
+    : reverse_copy<
+          Sequence
+        , Inserter
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, reverse)
+
+}}
+
+#endif // BOOST_MPL_REVERSE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/reverse_fold.hpp b/gatb-core/thirdparty/boost/mpl/reverse_fold.hpp
new file mode 100644
index 0000000..87c26a9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/reverse_fold.hpp
@@ -0,0 +1,50 @@
+
+#ifndef BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED
+#define BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright David Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/O1_size.hpp>
+#include <boost/mpl/arg.hpp>
+#include <boost/mpl/aux_/reverse_fold_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)
+    , typename ForwardOp = arg<1>
+    >
+struct reverse_fold
+{
+    typedef typename aux::reverse_fold_impl<
+          ::boost::mpl::O1_size<Sequence>::value
+        , typename begin<Sequence>::type
+        , typename end<Sequence>::type
+        , State
+        , BackwardOp
+        , ForwardOp
+        >::state type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,reverse_fold,(Sequence,State,BackwardOp))
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, reverse_fold)
+
+}}
+
+#endif // BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/reverse_iter_fold.hpp b/gatb-core/thirdparty/boost/mpl/reverse_iter_fold.hpp
new file mode 100644
index 0000000..348f295
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/reverse_iter_fold.hpp
@@ -0,0 +1,56 @@
+
+#ifndef BOOST_MPL_ITER_FOLD_BACKWARD_HPP_INCLUDED
+#define BOOST_MPL_ITER_FOLD_BACKWARD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+// Copyright Dave Abrahams 2001-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/O1_size.hpp>
+#include <boost/mpl/arg.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/reverse_iter_fold_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(State)
+    , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)
+    , typename ForwardOp = arg<1>
+    >
+struct reverse_iter_fold
+{
+    typedef typename aux::reverse_iter_fold_impl<
+          ::boost::mpl::O1_size<Sequence>::value
+        , typename begin<Sequence>::type
+        , typename end<Sequence>::type
+        , State
+        , typename lambda<BackwardOp>::type
+        , typename lambda<ForwardOp>::type
+        >::state type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(
+          4
+        , reverse_iter_fold
+        , (Sequence,State,BackwardOp,ForwardOp)
+        )
+};
+
+BOOST_MPL_AUX_NA_SPEC(3, reverse_iter_fold)
+
+}}
+
+#endif // BOOST_MPL_ITER_FOLD_BACKWARD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/same_as.hpp b/gatb-core/thirdparty/boost/mpl/same_as.hpp
new file mode 100644
index 0000000..4be20bc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/same_as.hpp
@@ -0,0 +1,55 @@
+
+#ifndef BOOST_MPL_SAME_AS_HPP_INCLUDED
+#define BOOST_MPL_SAME_AS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+#include <boost/mpl/aux_/config/forwarding.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T1 >
+struct same_as
+{
+    template< typename T2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : is_same<T1,T2>
+    {
+#else
+    {
+        typedef typename is_same<T1,T2>::type type;
+#endif
+    };
+};
+
+template< typename T1 >
+struct not_same_as
+{
+    template< typename T2 > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+        : not_< is_same<T1,T2> >
+    {
+#else
+    {
+        typedef typename not_< is_same<T1,T2> >::type type;
+#endif
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SAME_AS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/sequence_tag.hpp b/gatb-core/thirdparty/boost/mpl/sequence_tag.hpp
new file mode 100644
index 0000000..f87d92b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/sequence_tag.hpp
@@ -0,0 +1,124 @@
+
+#ifndef BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED
+#define BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/sequence_tag_fwd.hpp>
+#include <boost/mpl/aux_/has_tag.hpp>
+#include <boost/mpl/aux_/has_begin.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+// agurt, 27/nov/02: have to use a simplistic 'sequence_tag' implementation
+// on MSVC to avoid dreadful "internal structure overflow" error
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+    || defined(BOOST_MPL_CFG_NO_HAS_XXX)
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct sequence_tag
+{
+    typedef typename Sequence::tag type;
+};
+
+#elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+
+// agurt, 07/feb/03: workaround for what seems to be MSVC 7.0-specific ETI issue
+
+namespace aux {
+
+template< bool >
+struct sequence_tag_impl
+{
+    template< typename Sequence > struct result_
+    {
+        typedef typename Sequence::tag type;
+    };
+};
+
+template<>
+struct sequence_tag_impl<false>
+{
+    template< typename Sequence > struct result_
+    {
+        typedef int type;
+    };
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct sequence_tag
+    : aux::sequence_tag_impl< !aux::is_msvc_eti_arg<Sequence>::value >
+        ::template result_<Sequence>
+{
+};
+
+#else
+
+namespace aux {
+
+template< bool has_tag_, bool has_begin_ >
+struct sequence_tag_impl
+{
+    // agurt 24/nov/02: MSVC 6.5 gets confused in 'sequence_tag_impl<true>' 
+    // specialization below, if we name it 'result_' here
+    template< typename Sequence > struct result2_;
+};
+
+#   define AUX_CLASS_SEQUENCE_TAG_SPEC(has_tag, has_begin, result_type) \
+template<> struct sequence_tag_impl<has_tag,has_begin> \
+{ \
+    template< typename Sequence > struct result2_ \
+    { \
+        typedef result_type type; \
+    }; \
+}; \
+/**/
+
+AUX_CLASS_SEQUENCE_TAG_SPEC(true, true, typename Sequence::tag)
+AUX_CLASS_SEQUENCE_TAG_SPEC(true, false, typename Sequence::tag)
+AUX_CLASS_SEQUENCE_TAG_SPEC(false, true, nested_begin_end_tag)
+AUX_CLASS_SEQUENCE_TAG_SPEC(false, false, non_sequence_tag)
+
+#   undef AUX_CLASS_SEQUENCE_TAG_SPEC
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct sequence_tag
+    : aux::sequence_tag_impl<
+          ::boost::mpl::aux::has_tag<Sequence>::value
+        , ::boost::mpl::aux::has_begin<Sequence>::value
+        >::template result2_<Sequence>
+{
+};
+
+#endif // BOOST_MSVC
+
+BOOST_MPL_AUX_NA_SPEC(1, sequence_tag)
+
+}}
+
+#endif // BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/sequence_tag_fwd.hpp b/gatb-core/thirdparty/boost/mpl/sequence_tag_fwd.hpp
new file mode 100644
index 0000000..4b0ed6f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/sequence_tag_fwd.hpp
@@ -0,0 +1,26 @@
+
+#ifndef BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED
+#define BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+struct nested_begin_end_tag;
+struct non_sequence_tag;
+
+template< typename Sequence > struct sequence_tag;
+
+}}
+
+#endif // BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set.hpp b/gatb-core/thirdparty/boost/mpl/set.hpp
new file mode 100644
index 0000000..75f56dc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_SET_HPP_INCLUDED
+#define BOOST_MPL_SET_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/set.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_SET_HEADER \
+    BOOST_PP_CAT(set, BOOST_MPL_LIMIT_SET_SIZE).hpp \
+    /**/
+#else
+#   define AUX778076_SET_HEADER \
+    BOOST_PP_CAT(set, BOOST_MPL_LIMIT_SET_SIZE)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/set/AUX778076_SET_HEADER)
+#   undef AUX778076_SET_HEADER
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/set.hpp>
+
+#   define AUX778076_SEQUENCE_NAME set
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_SET_SIZE
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_SET_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/at_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/at_impl.hpp
new file mode 100644
index 0000000..89119c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/at_impl.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/at_fwd.hpp>
+#include <boost/mpl/set/aux_/has_key_impl.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/void.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct at_impl< aux::set_tag >
+{
+    template< typename Set, typename T > struct apply
+    {
+        typedef typename if_< 
+              has_key_impl<aux::set_tag>::apply<Set,T>
+            , T
+            , void_
+            >::type type;            
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/begin_end_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/begin_end_impl.hpp
new file mode 100644
index 0000000..2595280
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/begin_end_impl.hpp
@@ -0,0 +1,43 @@
+
+#ifndef BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2007
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/set/aux_/iterator.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct begin_impl< aux::set_tag >
+{
+    template< typename Set > struct apply
+        : s_iter_get<Set,typename Set::item_>
+    {
+    };
+};
+
+template<>
+struct end_impl< aux::set_tag >
+{
+    template< typename Set > struct apply
+    {
+        typedef s_iter< Set,set0<> > type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/clear_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/clear_impl.hpp
new file mode 100644
index 0000000..9c6c760
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/clear_impl.hpp
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/set/aux_/set0.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct clear_impl< aux::set_tag >
+{
+    template< typename Set > struct apply
+    {
+        typedef set0<> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/empty_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/empty_impl.hpp
new file mode 100644
index 0000000..997ff02
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/empty_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct empty_impl< aux::set_tag >
+{
+    template< typename Set > struct apply
+        : not_< typename Set::size >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/erase_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/erase_impl.hpp
new file mode 100644
index 0000000..c4a95b4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/erase_impl.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_fwd.hpp>
+#include <boost/mpl/set/aux_/erase_key_impl.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct erase_impl< aux::set_tag >
+{
+    template< 
+          typename Set
+        , typename Pos
+        , typename unused_
+        > 
+    struct apply
+        : erase_key_impl<aux::set_tag>
+            ::apply<Set,typename Pos::type>
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/erase_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/erase_key_impl.hpp
new file mode 100644
index 0000000..f945d4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/erase_key_impl.hpp
@@ -0,0 +1,53 @@
+
+#ifndef BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2007
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/erase_key_fwd.hpp>
+#include <boost/mpl/set/aux_/has_key_impl.hpp>
+#include <boost/mpl/set/aux_/item.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/base.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct erase_key_impl< aux::set_tag >
+{
+    template< 
+          typename Set
+        , typename T
+        > 
+    struct apply
+        : eval_if< 
+              has_key_impl<aux::set_tag>::apply<Set,T>
+            , eval_if< 
+                  is_same< T,typename Set::item_type_ > 
+                , base<Set>
+                , identity< s_mask<T,typename Set::item_> >
+                >
+            , identity<Set>
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/has_key_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/has_key_impl.hpp
new file mode 100644
index 0000000..bdc3273
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/has_key_impl.hpp
@@ -0,0 +1,60 @@
+
+#ifndef BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/has_key_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/overload_names.hpp>
+#include <boost/mpl/aux_/static_cast.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+#include <boost/mpl/aux_/config/static_constant.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct has_key_impl< aux::set_tag >
+{
+    template< typename Set, typename T > struct apply
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
+    || BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
+    {
+        BOOST_STATIC_CONSTANT(bool, value = 
+              ( sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(
+                    Set
+                  , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<T>*, 0)
+                  ) ) == sizeof(aux::no_tag) )
+            );
+
+        typedef bool_<value> type;
+
+#else // ISO98 C++
+        : bool_< 
+              ( sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(
+                    Set
+                  , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<T>*, 0)
+                  ) ) == sizeof(aux::no_tag) )
+            >
+    {
+#endif
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/include_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/include_preprocessed.hpp
new file mode 100644
index 0000000..ffeb9c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/include_preprocessed.hpp
@@ -0,0 +1,42 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2001-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_HEADER \
+    plain/BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#else
+#   define AUX778076_HEADER \
+    BOOST_PP_CAT(plain,/)##BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#endif
+
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))
+#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/set/aux_/preprocessed/AUX778076_HEADER)
+#   include AUX778076_INCLUDE_STRING
+#   undef AUX778076_INCLUDE_STRING
+#else
+#   include BOOST_PP_STRINGIZE(boost/mpl/set/aux_/preprocessed/AUX778076_HEADER)
+#endif
+
+#   undef AUX778076_HEADER
+
+#undef BOOST_MPL_PREPROCESSED_HEADER
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/insert_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/insert_impl.hpp
new file mode 100644
index 0000000..ff180ac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/insert_impl.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2007
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_fwd.hpp>
+#include <boost/mpl/set/aux_/has_key_impl.hpp>
+#include <boost/mpl/set/aux_/item.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/base.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/aux_/na.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template<  typename Set, typename T > struct set_insert_impl
+    : eval_if< 
+          has_key_impl<aux::set_tag>::apply<Set,T>
+        , identity<Set>
+        , eval_if< 
+              is_same< T,typename Set::last_masked_ > 
+            , base<Set>
+            , identity< s_item<T,typename Set::item_> >
+            >
+        >
+{
+};
+}
+
+template<>
+struct insert_impl< aux::set_tag >
+{
+    template< 
+          typename Set
+        , typename PosOrKey
+        , typename KeyOrNA
+        > 
+    struct apply
+        : aux::set_insert_impl<
+              Set
+            , typename if_na<KeyOrNA,PosOrKey>::type
+            >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/insert_range_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/insert_range_impl.hpp
new file mode 100644
index 0000000..f7150a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/insert_range_impl.hpp
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+
+// Copyright Bruno Dutra 2015
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/insert_range_fwd.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/insert.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct insert_range_impl< aux::set_tag >
+{
+    template<
+          typename Sequence
+        , typename /*Pos*/
+        , typename Range
+        >
+    struct apply
+        : fold<Range, Sequence, insert<_1, _2> >
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/item.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/item.hpp
new file mode 100644
index 0000000..bd5bc95
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/item.hpp
@@ -0,0 +1,82 @@
+
+#ifndef BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2007
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/prior.hpp>
+#include <boost/mpl/set/aux_/set0.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/config/arrays.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T, typename Base >
+struct s_item
+    : Base
+{
+    typedef s_item<T,Base> item_;
+    typedef void_       last_masked_;
+    typedef T           item_type_;
+    typedef typename Base::item_ base;
+    typedef s_item type;
+    
+    typedef typename next< typename Base::size >::type  size;
+    typedef typename next< typename Base::order >::type order;
+
+#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)
+    typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value>::type order_tag_;
+#else
+    typedef char (&order_tag_)[BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value];
+#endif
+
+    BOOST_MPL_AUX_SET_OVERLOAD( order_tag_, ORDER_BY_KEY, s_item, aux::type_wrapper<T>* );
+    BOOST_MPL_AUX_SET_OVERLOAD( aux::no_tag, IS_MASKED, s_item, aux::type_wrapper<T>* );
+};
+
+
+template< typename T, typename Base >
+struct s_mask
+    : Base
+{
+    typedef s_mask<T,Base> item_;
+    typedef T       last_masked_;
+    typedef void_   item_type_;
+    typedef typename Base::item_ base;
+    typedef typename prior< typename Base::size >::type  size;
+    typedef s_mask type;
+
+    BOOST_MPL_AUX_SET_OVERLOAD( aux::yes_tag, IS_MASKED, s_mask, aux::type_wrapper<T>* );
+};
+
+
+template< typename T, typename Base >
+struct s_unmask
+    : Base
+{
+    typedef s_unmask<T,Base> item_;
+    typedef void_   last_masked_;
+    typedef T       item_type_;
+    typedef typename Base::item_ base;
+    typedef typename next< typename Base::size >::type  size;
+
+    BOOST_MPL_AUX_SET_OVERLOAD( aux::no_tag, IS_MASKED, s_unmask, aux::type_wrapper<T>* );
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/iterator.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/iterator.hpp
new file mode 100644
index 0000000..9a58a25
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/iterator.hpp
@@ -0,0 +1,98 @@
+
+#ifndef BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2007
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/set/aux_/set0.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+// used by 's_iter_get'
+template< typename Set, typename Tail > struct s_iter;
+
+template< typename Set, typename Tail > struct s_iter_get
+    : eval_if< 
+          has_key< Set,typename Tail::item_type_ >
+        , identity< s_iter<Set,Tail> >
+        , next< s_iter<Set,Tail> >
+        >
+{
+};
+
+template< typename Set, typename Tail > struct s_iter_impl
+{
+    typedef Tail                        tail_;
+    typedef forward_iterator_tag        category;
+    typedef typename Tail::item_type_   type;
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    typedef typename s_iter_get< Set,typename Tail::base >::type next;
+#endif
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename Set, typename Tail > 
+struct next< s_iter<Set,Tail> >
+    : s_iter_get< Set,typename Tail::base >
+{
+};
+
+template< typename Set > 
+struct next< s_iter<Set,set0<> > >
+{
+    typedef s_iter<Set,set0<> > type;
+};
+
+template< typename Set, typename Tail > struct s_iter
+    : s_iter_impl<Set,Tail>
+{
+};
+
+template< typename Set > struct s_iter<Set, set0<> >
+{
+    typedef forward_iterator_tag category;
+};
+
+#else
+
+template< typename Set >
+struct s_end_iter
+{
+    typedef forward_iterator_tag    category;
+    typedef s_iter<Set,set0<> >     next;
+};
+
+template< typename Set, typename Tail > struct s_iter
+    : if_< 
+          is_same< Tail,set0<> >
+        , s_end_iter<Set>
+        , s_iter_impl<Set,Tail>
+        >::type
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/key_type_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/key_type_impl.hpp
new file mode 100644
index 0000000..8e8a090
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/key_type_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/key_type_fwd.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct key_type_impl< aux::set_tag >
+{
+    template< typename Set, typename T > struct apply
+    {
+        typedef T type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/numbered.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/numbered.hpp
new file mode 100644
index 0000000..edd839d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/numbered.hpp
@@ -0,0 +1,48 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   define AUX778076_SET_TAIL(set, i_, T) \
+    typename BOOST_PP_CAT(set,i_)< \
+          BOOST_PP_ENUM_PARAMS(i_, T) \
+        >::item_                           \
+    /**/
+
+#if i_ > 0
+template<
+      BOOST_PP_ENUM_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(set,i_)
+    : s_item<
+          BOOST_PP_CAT(T,BOOST_PP_DEC(i_))
+        , AUX778076_SET_TAIL(set,BOOST_PP_DEC(i_),T)
+        >
+{
+    typedef BOOST_PP_CAT(set,i_) type;
+};
+#endif
+
+#   undef AUX778076_SET_TAIL
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/numbered_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/numbered_c.hpp
new file mode 100644
index 0000000..130cf5d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/numbered_c.hpp
@@ -0,0 +1,48 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#   define AUX778076_SET_C_TAIL(set, i_, T, C) \
+    BOOST_PP_CAT(BOOST_PP_CAT(set,i_),_c)< \
+          T BOOST_PP_ENUM_TRAILING_PARAMS(i_, C) \
+        > \
+    /**/
+
+template<
+      typename T
+    , BOOST_PP_ENUM_PARAMS(i_, T C)
+    >
+struct BOOST_PP_CAT(BOOST_PP_CAT(set,i_),_c)
+    : s_item<
+          integral_c<T,BOOST_PP_CAT(C,BOOST_PP_DEC(i_))>
+        , AUX778076_SET_C_TAIL(set,BOOST_PP_DEC(i_), T, C)
+        >
+{
+    typedef BOOST_PP_CAT(BOOST_PP_CAT(set,i_),_c) type;
+};
+
+#   undef AUX778076_SET_C_TAIL
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10.hpp
new file mode 100644
index 0000000..2c42b38
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10.hpp
@@ -0,0 +1,140 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0
+    >
+struct set1
+    : s_item<
+          T0
+        , typename set0<  >::item_
+        >
+{
+    typedef set1 type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct set2
+    : s_item<
+          T1
+        , typename set1<T0>::item_
+        >
+{
+    typedef set2 type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct set3
+    : s_item<
+          T2
+        , typename set2< T0,T1 >::item_
+        >
+{
+    typedef set3 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct set4
+    : s_item<
+          T3
+        , typename set3< T0,T1,T2 >::item_
+        >
+{
+    typedef set4 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct set5
+    : s_item<
+          T4
+        , typename set4< T0,T1,T2,T3 >::item_
+        >
+{
+    typedef set5 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct set6
+    : s_item<
+          T5
+        , typename set5< T0,T1,T2,T3,T4 >::item_
+        >
+{
+    typedef set6 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct set7
+    : s_item<
+          T6
+        , typename set6< T0,T1,T2,T3,T4,T5 >::item_
+        >
+{
+    typedef set7 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct set8
+    : s_item<
+          T7
+        , typename set7< T0,T1,T2,T3,T4,T5,T6 >::item_
+        >
+{
+    typedef set8 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct set9
+    : s_item<
+          T8
+        , typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::item_
+        >
+{
+    typedef set9 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct set10
+    : s_item<
+          T9
+        , typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::item_
+        >
+{
+    typedef set10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10_c.hpp
new file mode 100644
index 0000000..e9bdb29
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set10_c.hpp
@@ -0,0 +1,145 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set10_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0
+    >
+struct set1_c
+    : s_item<
+          integral_c< T,C0 >
+        , set0_c<T>
+        >
+{
+    typedef set1_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1
+    >
+struct set2_c
+    : s_item<
+          integral_c< T,C1 >
+        , set1_c< T,C0 >
+        >
+{
+    typedef set2_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2
+    >
+struct set3_c
+    : s_item<
+          integral_c< T,C2 >
+        , set2_c< T,C0,C1 >
+        >
+{
+    typedef set3_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3
+    >
+struct set4_c
+    : s_item<
+          integral_c< T,C3 >
+        , set3_c< T,C0,C1,C2 >
+        >
+{
+    typedef set4_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4
+    >
+struct set5_c
+    : s_item<
+          integral_c< T,C4 >
+        , set4_c< T,C0,C1,C2,C3 >
+        >
+{
+    typedef set5_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5
+    >
+struct set6_c
+    : s_item<
+          integral_c< T,C5 >
+        , set5_c< T,C0,C1,C2,C3,C4 >
+        >
+{
+    typedef set6_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6
+    >
+struct set7_c
+    : s_item<
+          integral_c< T,C6 >
+        , set6_c< T,C0,C1,C2,C3,C4,C5 >
+        >
+{
+    typedef set7_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7
+    >
+struct set8_c
+    : s_item<
+          integral_c< T,C7 >
+        , set7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+        >
+{
+    typedef set8_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8
+    >
+struct set9_c
+    : s_item<
+          integral_c< T,C8 >
+        , set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+        >
+{
+    typedef set9_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9
+    >
+struct set10_c
+    : s_item<
+          integral_c< T,C9 >
+        , set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+        >
+{
+    typedef set10_c type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20.hpp
new file mode 100644
index 0000000..cb4e466
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20.hpp
@@ -0,0 +1,168 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct set11
+    : s_item<
+          T10
+        , typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::item_
+        >
+{
+    typedef set11 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct set12
+    : s_item<
+          T11
+        , typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::item_
+        >
+{
+    typedef set12 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct set13
+    : s_item<
+          T12
+        , typename set12< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
+        , T11 >::item_
+        >
+{
+    typedef set13 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct set14
+    : s_item<
+          T13
+        , typename set13< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12 >::item_
+        >
+{
+    typedef set14 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct set15
+    : s_item<
+          T14
+        , typename set14< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13 >::item_
+        >
+{
+    typedef set15 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct set16
+    : s_item<
+          T15
+        , typename set15< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14 >::item_
+        >
+{
+    typedef set16 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct set17
+    : s_item<
+          T16
+        , typename set16< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15 >::item_
+        >
+{
+    typedef set17 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct set18
+    : s_item<
+          T17
+        , typename set17< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16 >::item_
+        >
+{
+    typedef set18 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct set19
+    : s_item<
+          T18
+        , typename set18< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17 >::item_
+        >
+{
+    typedef set19 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct set20
+    : s_item<
+          T19
+        , typename set19< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18 >::item_
+        >
+{
+    typedef set20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20_c.hpp
new file mode 100644
index 0000000..445b546
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set20_c.hpp
@@ -0,0 +1,154 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set20_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    >
+struct set11_c
+    : s_item<
+          integral_c< T,C10 >
+        , set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+        >
+{
+    typedef set11_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11
+    >
+struct set12_c
+    : s_item<
+          integral_c< T,C11 >
+        , set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+        >
+{
+    typedef set12_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12
+    >
+struct set13_c
+    : s_item<
+          integral_c< T,C12 >
+        , set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+        >
+{
+    typedef set13_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13
+    >
+struct set14_c
+    : s_item<
+          integral_c< T,C13 >
+        , set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+        >
+{
+    typedef set14_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14
+    >
+struct set15_c
+    : s_item<
+          integral_c< T,C14 >
+        , set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >
+        >
+{
+    typedef set15_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15
+    >
+struct set16_c
+    : s_item<
+          integral_c< T,C15 >
+        , set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >
+        >
+{
+    typedef set16_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16
+    >
+struct set17_c
+    : s_item<
+          integral_c< T,C16 >
+        , set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >
+        >
+{
+    typedef set17_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17
+    >
+struct set18_c
+    : s_item<
+          integral_c< T,C17 >
+        , set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >
+        >
+{
+    typedef set18_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18
+    >
+struct set19_c
+    : s_item<
+          integral_c< T,C18 >
+        , set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >
+        >
+{
+    typedef set19_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19
+    >
+struct set20_c
+    : s_item<
+          integral_c< T,C19 >
+        , set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >
+        >
+{
+    typedef set20_c type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30.hpp
new file mode 100644
index 0000000..08f2cda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30.hpp
@@ -0,0 +1,195 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20
+    >
+struct set21
+    : s_item<
+          T20
+        , typename set20< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19 >::item_
+        >
+{
+    typedef set21 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21
+    >
+struct set22
+    : s_item<
+          T21
+        , typename set21< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20 >::item_
+        >
+{
+    typedef set22 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22
+    >
+struct set23
+    : s_item<
+          T22
+        , typename set22< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21 >::item_
+        >
+{
+    typedef set23 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23
+    >
+struct set24
+    : s_item<
+          T23
+        , typename set23< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22 >::item_
+        >
+{
+    typedef set24 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    >
+struct set25
+    : s_item<
+          T24
+        , typename set24< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23 >::item_
+        >
+{
+    typedef set25 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25
+    >
+struct set26
+    : s_item<
+          T25
+        , typename set25< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23
+        , T24 >::item_
+        >
+{
+    typedef set26 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26
+    >
+struct set27
+    : s_item<
+          T26
+        , typename set26< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24
+        , T25 >::item_
+        >
+{
+    typedef set27 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27
+    >
+struct set28
+    : s_item<
+          T27
+        , typename set27< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26 >::item_
+        >
+{
+    typedef set28 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28
+    >
+struct set29
+    : s_item<
+          T28
+        , typename set28< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27 >::item_
+        >
+{
+    typedef set29 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    >
+struct set30
+    : s_item<
+          T29
+        , typename set29< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28 >::item_
+        >
+{
+    typedef set30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30_c.hpp
new file mode 100644
index 0000000..7c0150c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set30_c.hpp
@@ -0,0 +1,164 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set30_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    >
+struct set21_c
+    : s_item<
+          integral_c< T,C20 >
+        , set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >
+        >
+{
+    typedef set21_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21
+    >
+struct set22_c
+    : s_item<
+          integral_c< T,C21 >
+        , set21_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20 >
+        >
+{
+    typedef set22_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22
+    >
+struct set23_c
+    : s_item<
+          integral_c< T,C22 >
+        , set22_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21 >
+        >
+{
+    typedef set23_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23
+    >
+struct set24_c
+    : s_item<
+          integral_c< T,C23 >
+        , set23_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22 >
+        >
+{
+    typedef set24_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24
+    >
+struct set25_c
+    : s_item<
+          integral_c< T,C24 >
+        , set24_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23 >
+        >
+{
+    typedef set25_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25
+    >
+struct set26_c
+    : s_item<
+          integral_c< T,C25 >
+        , set25_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24 >
+        >
+{
+    typedef set26_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26
+    >
+struct set27_c
+    : s_item<
+          integral_c< T,C26 >
+        , set26_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25 >
+        >
+{
+    typedef set27_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27
+    >
+struct set28_c
+    : s_item<
+          integral_c< T,C27 >
+        , set27_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26 >
+        >
+{
+    typedef set28_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28
+    >
+struct set29_c
+    : s_item<
+          integral_c< T,C28 >
+        , set28_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27 >
+        >
+{
+    typedef set29_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29
+    >
+struct set30_c
+    : s_item<
+          integral_c< T,C29 >
+        , set29_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28 >
+        >
+{
+    typedef set30_c type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40.hpp
new file mode 100644
index 0000000..a8571a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40.hpp
@@ -0,0 +1,221 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30
+    >
+struct set31
+    : s_item<
+          T30
+        , typename set30< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29 >::item_
+        >
+{
+    typedef set31 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31
+    >
+struct set32
+    : s_item<
+          T31
+        , typename set31< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30 >::item_
+        >
+{
+    typedef set32 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32
+    >
+struct set33
+    : s_item<
+          T32
+        , typename set32< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31 >::item_
+        >
+{
+    typedef set33 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33
+    >
+struct set34
+    : s_item<
+          T33
+        , typename set33< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32 >::item_
+        >
+{
+    typedef set34 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    >
+struct set35
+    : s_item<
+          T34
+        , typename set34< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33 >::item_
+        >
+{
+    typedef set35 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35
+    >
+struct set36
+    : s_item<
+          T35
+        , typename set35< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34 >::item_
+        >
+{
+    typedef set36 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36
+    >
+struct set37
+    : s_item<
+          T36
+        , typename set36< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35 >::item_
+        >
+{
+    typedef set37 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37
+    >
+struct set38
+    : s_item<
+          T37
+        , typename set37< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36 >::item_
+        >
+{
+    typedef set38 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38
+    >
+struct set39
+    : s_item<
+          T38
+        , typename set38< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37 >::item_
+        >
+{
+    typedef set39 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    >
+struct set40
+    : s_item<
+          T39
+        , typename set39< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37
+        , T38 >::item_
+        >
+{
+    typedef set40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40_c.hpp
new file mode 100644
index 0000000..0b0e49c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set40_c.hpp
@@ -0,0 +1,174 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set40_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    >
+struct set31_c
+    : s_item<
+          integral_c< T,C30 >
+        , set30_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29 >
+        >
+{
+    typedef set31_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31
+    >
+struct set32_c
+    : s_item<
+          integral_c< T,C31 >
+        , set31_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30 >
+        >
+{
+    typedef set32_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32
+    >
+struct set33_c
+    : s_item<
+          integral_c< T,C32 >
+        , set32_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31 >
+        >
+{
+    typedef set33_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33
+    >
+struct set34_c
+    : s_item<
+          integral_c< T,C33 >
+        , set33_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32 >
+        >
+{
+    typedef set34_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34
+    >
+struct set35_c
+    : s_item<
+          integral_c< T,C34 >
+        , set34_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33 >
+        >
+{
+    typedef set35_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35
+    >
+struct set36_c
+    : s_item<
+          integral_c< T,C35 >
+        , set35_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34 >
+        >
+{
+    typedef set36_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36
+    >
+struct set37_c
+    : s_item<
+          integral_c< T,C36 >
+        , set36_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35 >
+        >
+{
+    typedef set37_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37
+    >
+struct set38_c
+    : s_item<
+          integral_c< T,C37 >
+        , set37_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36 >
+        >
+{
+    typedef set38_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38
+    >
+struct set39_c
+    : s_item<
+          integral_c< T,C38 >
+        , set38_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37 >
+        >
+{
+    typedef set39_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39
+    >
+struct set40_c
+    : s_item<
+          integral_c< T,C39 >
+        , set39_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38 >
+        >
+{
+    typedef set40_c type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50.hpp
new file mode 100644
index 0000000..79798ab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50.hpp
@@ -0,0 +1,250 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40
+    >
+struct set41
+    : s_item<
+          T40
+        , typename set40< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38
+        , T39 >::item_
+        >
+{
+    typedef set41 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41
+    >
+struct set42
+    : s_item<
+          T41
+        , typename set41< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40 >::item_
+        >
+{
+    typedef set42 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42
+    >
+struct set43
+    : s_item<
+          T42
+        , typename set42< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41 >::item_
+        >
+{
+    typedef set43 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43
+    >
+struct set44
+    : s_item<
+          T43
+        , typename set43< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42 >::item_
+        >
+{
+    typedef set44 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    >
+struct set45
+    : s_item<
+          T44
+        , typename set44< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43 >::item_
+        >
+{
+    typedef set45 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45
+    >
+struct set46
+    : s_item<
+          T45
+        , typename set45< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43, T44 >::item_
+        >
+{
+    typedef set46 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46
+    >
+struct set47
+    : s_item<
+          T46
+        , typename set46< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43, T44, T45 >::item_
+        >
+{
+    typedef set47 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47
+    >
+struct set48
+    : s_item<
+          T47
+        , typename set47< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43, T44, T45, T46 >::item_
+        >
+{
+    typedef set48 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48
+    >
+struct set49
+    : s_item<
+          T48
+        , typename set48< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43, T44, T45, T46, T47 >::item_
+        >
+{
+    typedef set49 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48, typename T49
+    >
+struct set50
+    : s_item<
+          T49
+        , typename set49< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11
+        , T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25
+        , T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39
+        , T40, T41, T42, T43, T44, T45, T46, T47, T48 >::item_
+        >
+{
+    typedef set50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50_c.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50_c.hpp
new file mode 100644
index 0000000..83627fa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/preprocessed/plain/set50_c.hpp
@@ -0,0 +1,184 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/set/set50_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    >
+struct set41_c
+    : s_item<
+          integral_c< T,C40 >
+        , set40_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39 >
+        >
+{
+    typedef set41_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41
+    >
+struct set42_c
+    : s_item<
+          integral_c< T,C41 >
+        , set41_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40 >
+        >
+{
+    typedef set42_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42
+    >
+struct set43_c
+    : s_item<
+          integral_c< T,C42 >
+        , set42_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41 >
+        >
+{
+    typedef set43_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43
+    >
+struct set44_c
+    : s_item<
+          integral_c< T,C43 >
+        , set43_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42 >
+        >
+{
+    typedef set44_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44
+    >
+struct set45_c
+    : s_item<
+          integral_c< T,C44 >
+        , set44_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43 >
+        >
+{
+    typedef set45_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45
+    >
+struct set46_c
+    : s_item<
+          integral_c< T,C45 >
+        , set45_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44 >
+        >
+{
+    typedef set46_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46
+    >
+struct set47_c
+    : s_item<
+          integral_c< T,C46 >
+        , set46_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45 >
+        >
+{
+    typedef set47_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47
+    >
+struct set48_c
+    : s_item<
+          integral_c< T,C47 >
+        , set47_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46 >
+        >
+{
+    typedef set48_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48
+    >
+struct set49_c
+    : s_item<
+          integral_c< T,C48 >
+        , set48_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47 >
+        >
+{
+    typedef set49_c type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49
+    >
+struct set50_c
+    : s_item<
+          integral_c< T,C49 >
+        , set49_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48 >
+        >
+{
+    typedef set50_c type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/set0.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/set0.hpp
new file mode 100644
index 0000000..65f52a8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/set0.hpp
@@ -0,0 +1,69 @@
+
+#ifndef BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+#include <boost/mpl/aux_/yes_no.hpp>
+#include <boost/mpl/aux_/overload_names.hpp>
+#include <boost/mpl/aux_/config/operators.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING)
+
+#   define BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \
+    friend R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \
+/**/
+
+#   define BOOST_MPL_AUX_SET_OVERLOAD(R, f, X, T) \
+    BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \
+/**/
+
+#else
+
+#   define BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \
+    static R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \
+/**/
+
+#   define BOOST_MPL_AUX_SET_OVERLOAD(R, f, X, T) \
+    BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T); \
+    using Base::BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f) \
+/**/
+
+#endif
+
+template< typename Dummy = na > struct set0
+{
+    typedef set0<>          item_;
+    typedef item_           type;
+    typedef aux::set_tag    tag;
+    typedef void_           last_masked_;
+    typedef void_           item_type_;
+    typedef long_<0>        size;
+    typedef long_<1>        order;
+
+    BOOST_MPL_AUX_SET0_OVERLOAD( aux::no_tag, ORDER_BY_KEY, set0<>, void const volatile* );
+    BOOST_MPL_AUX_SET0_OVERLOAD( aux::yes_tag, IS_MASKED, set0<>, void const volatile* );
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/size_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/size_impl.hpp
new file mode 100644
index 0000000..e865596
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/size_impl.hpp
@@ -0,0 +1,33 @@
+
+#ifndef BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct size_impl< aux::set_tag >
+{
+    template< typename Set > struct apply
+        : Set::size
+    {
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/tag.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/tag.hpp
new file mode 100644
index 0000000..f11fc2b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/tag.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl { namespace aux {
+
+struct set_tag;
+
+}}}
+
+#endif // BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/aux_/value_type_impl.hpp b/gatb-core/thirdparty/boost/mpl/set/aux_/value_type_impl.hpp
new file mode 100644
index 0000000..91cf0d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/aux_/value_type_impl.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
+#define BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/value_type_fwd.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct value_type_impl< aux::set_tag >
+{
+    template< typename Set, typename T > struct apply
+    {
+        typedef T type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set0.hpp b/gatb-core/thirdparty/boost/mpl/set/set0.hpp
new file mode 100644
index 0000000..1c424e4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set0.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_SET_SET0_HPP_INCLUDED
+#define BOOST_MPL_SET_SET0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/set/aux_/at_impl.hpp>
+#include <boost/mpl/set/aux_/clear_impl.hpp>
+//#include <boost/mpl/set/aux_/O1_size.hpp>
+#include <boost/mpl/set/aux_/size_impl.hpp>
+#include <boost/mpl/set/aux_/empty_impl.hpp>
+#include <boost/mpl/set/aux_/insert_impl.hpp>
+#include <boost/mpl/set/aux_/insert_range_impl.hpp>
+#include <boost/mpl/set/aux_/erase_impl.hpp>
+#include <boost/mpl/set/aux_/erase_key_impl.hpp>
+#include <boost/mpl/set/aux_/has_key_impl.hpp>
+#include <boost/mpl/set/aux_/key_type_impl.hpp>
+#include <boost/mpl/set/aux_/value_type_impl.hpp>
+#include <boost/mpl/set/aux_/begin_end_impl.hpp>
+#include <boost/mpl/set/aux_/iterator.hpp>
+#include <boost/mpl/set/aux_/item.hpp>
+#include <boost/mpl/set/aux_/set0.hpp>
+#include <boost/mpl/set/aux_/tag.hpp>
+
+#endif // BOOST_MPL_SET_SET0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set0_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set0_c.hpp
new file mode 100644
index 0000000..7e7f77a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set0_c.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_SET_SET0_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET0_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/set/set0.hpp>
+#include <boost/mpl/integral_c.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T > struct set0_c
+    : set0<>
+{
+    typedef set0_c type;
+    typedef T value_type;
+};
+
+}}
+
+#endif // BOOST_MPL_SET_SET0_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set10.hpp b/gatb-core/thirdparty/boost/mpl/set/set10.hpp
new file mode 100644
index 0000000..fa876b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set10.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_SET_SET10_HPP_INCLUDED
+#define BOOST_MPL_SET_SET10_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set0.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set10.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, 10, <boost/mpl/set/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET10_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set10_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set10_c.hpp
new file mode 100644
index 0000000..34abd98
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set10_c.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_SET_SET10_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET10_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set0_c.hpp>
+#   include <boost/mpl/set/set10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set10_c.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, 10, <boost/mpl/set/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET10_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set20.hpp b/gatb-core/thirdparty/boost/mpl/set/set20.hpp
new file mode 100644
index 0000000..0cdff47
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set20.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_SET_SET20_HPP_INCLUDED
+#define BOOST_MPL_SET_SET20_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set20.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/set/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET20_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set20_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set20_c.hpp
new file mode 100644
index 0000000..e3de044
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set20_c.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_SET_SET20_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET20_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set10_c.hpp>
+#   include <boost/mpl/set/set20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set20_c.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/set/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET20_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set30.hpp b/gatb-core/thirdparty/boost/mpl/set/set30.hpp
new file mode 100644
index 0000000..b034454
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set30.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_SET_SET30_HPP_INCLUDED
+#define BOOST_MPL_SET_SET30_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set30.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/set/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET30_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set30_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set30_c.hpp
new file mode 100644
index 0000000..e006e1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set30_c.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_SET_SET30_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET30_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set20_c.hpp>
+#   include <boost/mpl/set/set30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set30_c.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/set/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET30_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set40.hpp b/gatb-core/thirdparty/boost/mpl/set/set40.hpp
new file mode 100644
index 0000000..5fa2cd0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set40.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_SET_SET40_HPP_INCLUDED
+#define BOOST_MPL_SET_SET40_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set40.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/set/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET40_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set40_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set40_c.hpp
new file mode 100644
index 0000000..bce5a80
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set40_c.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_SET_SET40_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET40_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set30_c.hpp>
+#   include <boost/mpl/set/set40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set40_c.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/set/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET40_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set50.hpp b/gatb-core/thirdparty/boost/mpl/set/set50.hpp
new file mode 100644
index 0000000..0c2bfc0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set50.hpp
@@ -0,0 +1,44 @@
+
+#ifndef BOOST_MPL_SET_SET50_HPP_INCLUDED
+#define BOOST_MPL_SET_SET50_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set50.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/set/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET50_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set/set50_c.hpp b/gatb-core/thirdparty/boost/mpl/set/set50_c.hpp
new file mode 100644
index 0000000..077dbf7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set/set50_c.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_SET_SET50_C_HPP_INCLUDED
+#define BOOST_MPL_SET_SET50_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/set/set40_c.hpp>
+#   include <boost/mpl/set/set50.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set50_c.hpp
+#   include <boost/mpl/set/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/set/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_SET_SET50_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/set_c.hpp b/gatb-core/thirdparty/boost/mpl/set_c.hpp
new file mode 100644
index 0000000..c0f8e37
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/set_c.hpp
@@ -0,0 +1,60 @@
+
+#ifndef BOOST_MPL_SET_C_HPP_INCLUDED
+#define BOOST_MPL_SET_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/set.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_SET_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(set,BOOST_MPL_LIMIT_SET_SIZE),_c).hpp \
+    /**/
+#else
+#   define AUX778076_SET_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(set,BOOST_MPL_LIMIT_SET_SIZE),_c)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/set/AUX778076_SET_C_HEADER)
+#   undef AUX778076_SET_C_HEADER
+#   include <climits>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER set_c.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/set.hpp>
+
+#   define AUX778076_SEQUENCE_NAME set_c
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_SET_SIZE
+#   define AUX778076_SEQUENCE_NAME_N(n) BOOST_PP_CAT(BOOST_PP_CAT(set,n),_c)
+#   define AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_SET_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/shift_left.hpp b/gatb-core/thirdparty/boost/mpl/shift_left.hpp
new file mode 100644
index 0000000..55e4f64
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/shift_left.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_SHIFT_LEFT_HPP_INCLUDED
+#define BOOST_MPL_SHIFT_LEFT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME shift_left
+#define AUX778076_OP_TOKEN <<
+#include <boost/mpl/aux_/shift_op.hpp>
+
+#endif // BOOST_MPL_SHIFT_LEFT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/shift_right.hpp b/gatb-core/thirdparty/boost/mpl/shift_right.hpp
new file mode 100644
index 0000000..1ae1e35
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/shift_right.hpp
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_SHIFT_RIGHT_HPP_INCLUDED
+#define BOOST_MPL_SHIFT_RIGHT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright Jaap Suter 2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME shift_right
+#define AUX778076_OP_TOKEN >>
+#include <boost/mpl/aux_/shift_op.hpp>
+
+#endif // BOOST_MPL_SHIFT_RIGHT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/single_view.hpp b/gatb-core/thirdparty/boost/mpl/single_view.hpp
new file mode 100644
index 0000000..a872bb1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/single_view.hpp
@@ -0,0 +1,38 @@
+
+#ifndef BOOST_MPL_SINGLE_VIEW_HPP_INCLUDED
+#define BOOST_MPL_SINGLE_VIEW_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/single_element_iter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct single_view
+    : iterator_range<
+          aux::sel_iter<T,0>
+        , aux::sel_iter<T,1>
+        >
+{
+};
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, single_view)
+
+}}
+
+#endif // BOOST_MPL_SINGLE_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/size.hpp b/gatb-core/thirdparty/boost/mpl/size.hpp
new file mode 100644
index 0000000..12ffefb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/size.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_SIZE_HPP_INCLUDED
+#define BOOST_MPL_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/aux_/size_impl.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/aux_/msvc_eti_base.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    >
+struct size
+    : aux::msvc_eti_base<
+        typename size_impl< typename sequence_tag<Sequence>::type >
+            ::template apply< Sequence >::type
+      >::type
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, size, (Sequence))
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, size)
+
+}}
+
+#endif // BOOST_MPL_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/size_fwd.hpp b/gatb-core/thirdparty/boost/mpl/size_fwd.hpp
new file mode 100644
index 0000000..c72628d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/size_fwd.hpp
@@ -0,0 +1,24 @@
+
+#ifndef BOOST_MPL_SIZE_FWD_HPP_INCLUDED
+#define BOOST_MPL_SIZE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct size_impl;
+template< typename Sequence > struct size;
+
+}}
+
+#endif // BOOST_MPL_SIZE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/size_t.hpp b/gatb-core/thirdparty/boost/mpl/size_t.hpp
new file mode 100644
index 0000000..99e9b41
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/size_t.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_SIZE_T_HPP_INCLUDED
+#define BOOST_MPL_SIZE_T_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_t_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE std::size_t
+#define AUX_WRAPPER_NAME size_t
+#define AUX_WRAPPER_PARAMS(N) std::size_t N
+
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_SIZE_T_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/size_t_fwd.hpp b/gatb-core/thirdparty/boost/mpl/size_t_fwd.hpp
new file mode 100644
index 0000000..ffdf4b3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/size_t_fwd.hpp
@@ -0,0 +1,28 @@
+
+#ifndef BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED
+#define BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/config.hpp> // make sure 'size_t' is placed into 'std'
+#include <cstddef>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< std::size_t N > struct size_t;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(size_t)
+
+#endif // BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/sizeof.hpp b/gatb-core/thirdparty/boost/mpl/sizeof.hpp
new file mode 100644
index 0000000..cf5e41c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/sizeof.hpp
@@ -0,0 +1,36 @@
+
+#ifndef BOOST_MPL_SIZEOF_HPP_INCLUDED
+#define BOOST_MPL_SIZEOF_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2003
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct sizeof_
+    : mpl::size_t< sizeof(T) >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,sizeof_,(T))
+};
+
+BOOST_MPL_AUX_NA_SPEC_NO_ETI(1, sizeof_)
+
+}}
+
+#endif // BOOST_MPL_SIZEOF_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/sort.hpp b/gatb-core/thirdparty/boost/mpl/sort.hpp
new file mode 100644
index 0000000..961aeab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/sort.hpp
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_SORT_HPP_INCLUDED
+#define BOOST_MPL_SORT_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002-2003
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/sort_impl.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, sort)
+
+}}
+
+#endif // BOOST_MPL_SORT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/stable_partition.hpp b/gatb-core/thirdparty/boost/mpl/stable_partition.hpp
new file mode 100644
index 0000000..e010de3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/stable_partition.hpp
@@ -0,0 +1,75 @@
+
+#ifndef BOOST_MPL_STABLE_PARTITION_HPP_INCLUDED
+#define BOOST_MPL_STABLE_PARTITION_HPP_INCLUDED
+
+// Copyright Eric Friedman 2002-2003
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/protect.hpp>
+#include <boost/mpl/aux_/partition_op.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+#include <boost/mpl/aux_/na.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+ 
+template <
+      typename Sequence
+    , typename Pred
+    , typename In
+    , typename In2
+    , typename In1 = typename if_na<In,In2>::type
+    >
+struct stable_partition_impl
+    : fold<
+          Sequence
+        , pair< typename In1::state, typename In2::state >
+        , protect< partition_op< 
+              Pred
+            , typename In1::operation
+            , typename In2::operation
+            > >
+        >
+{
+};
+
+template <
+      typename Sequence
+    , typename Pred
+    , typename In
+    , typename In2
+    , typename In1 = typename if_na<In,In2>::type
+    >
+struct reverse_stable_partition_impl
+    : reverse_fold<
+          Sequence
+        , pair< typename In1::state, typename In2::state >
+        , protect< partition_op< 
+              Pred
+            , typename In1::operation
+            , typename In2::operation
+            > >
+        >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, stable_partition)
+
+}}
+
+#endif // BOOST_MPL_STABLE_PARTITION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/string.hpp b/gatb-core/thirdparty/boost/mpl/string.hpp
new file mode 100644
index 0000000..345918f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/string.hpp
@@ -0,0 +1,607 @@
+
+#ifndef BOOST_MPL_STRING_HPP_INCLUDED
+#define BOOST_MPL_STRING_HPP_INCLUDED
+
+// Copyright Eric Niebler 2009
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $
+// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49239 $
+//
+// Thanks to:
+//   Dmitry Goncharov for porting this to the Sun compiler
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/predef/other/endian.h>
+#include <boost/mpl/limits/string.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/char.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/insert_range.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/front_inserter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/div.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+#include <iterator> // for bidirectional_iterator_tag
+#include <climits>
+
+namespace boost { namespace mpl
+{
+    #define BOOST_MPL_STRING_MAX_PARAMS                                                             \
+      BOOST_PP_DIV(BOOST_PP_ADD(BOOST_MPL_LIMIT_STRING_SIZE, 3), 4)
+
+    // Low-level bit-twiddling is done by macros. Any implementation-defined behavior of
+    // multi-character literals should be localized to these macros.
+
+    #define BOOST_MPL_MULTICHAR_LENGTH(c)                                                           \
+      (std::size_t)((c<CHAR_MIN) ? 4 : ((c>0xffffff)+(c>0xffff)+(c>0xff)+1))
+
+    #if defined(BOOST_ENDIAN_LITTLE_BYTE) && defined(__SUNPRO_CC)
+
+        #define BOOST_MPL_MULTICHAR_AT(c,i)                                                         \
+          (char)(0xff&((unsigned)(c)>>(8*(std::size_t)(i))))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i)                                                  \
+          ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i)                                                 \
+          (((unsigned)(c)<<8)|(unsigned char)(i))
+
+        #define BOOST_MPL_MULTICHAR_POP_BACK(c)                                                     \
+          (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_POP_FRONT(c)                                                    \
+          ((unsigned)(c)>>8)
+
+    #else
+
+        #define BOOST_MPL_MULTICHAR_AT(c,i)                                                         \
+          (char)(0xff&((unsigned)(c)>>(8*(BOOST_MPL_MULTICHAR_LENGTH(c)-(std::size_t)(i)-1))))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i)                                                  \
+          (((unsigned)(c)<<8)|(unsigned char)(i))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i)                                                 \
+          ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_POP_BACK(c)                                                     \
+          ((unsigned)(c)>>8)
+
+        #define BOOST_MPL_MULTICHAR_POP_FRONT(c)                                                    \
+          (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c))
+
+    #endif
+
+    struct string_tag;
+    struct string_iterator_tag;
+
+    template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_MPL_STRING_MAX_PARAMS, int C, 0)>
+    struct string;
+
+    template<typename Sequence, int I, int J>
+    struct string_iterator;
+
+    template<typename Sequence>
+    struct sequence_tag;
+
+    template<typename Tag>
+    struct size_impl;
+
+    template<>
+    struct size_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z, n, data)                                                                      \
+        + BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C,n))
+
+        #define M1(z, n, data)                                                                      \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+          : mpl::size_t<(0 BOOST_PP_REPEAT_ ## z(n, M0, ~))>                                        \
+        {};
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M1, ~)
+        #undef M0
+        #undef M1
+    };
+
+    template<>
+    struct size_impl<mpl::string_tag>::apply<mpl::string<> >
+      : mpl::size_t<0>
+    {};
+
+    template<typename Tag>
+    struct begin_impl;
+
+    template<>
+    struct begin_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+        {
+            typedef mpl::string_iterator<Sequence, 0, 0> type;
+        };
+    };
+
+    template<typename Tag>
+    struct end_impl;
+
+    template<>
+    struct end_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+        {                                                                                           \
+            typedef mpl::string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, n, 0> type;  \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+        #undef M0
+    };
+
+    template<>
+    struct end_impl<mpl::string_tag>::apply<mpl::string<> >
+    {
+        typedef mpl::string_iterator<mpl::string<>, 0, 0> type;
+    };
+
+    template<typename Tag>
+    struct push_back_impl;
+
+    template<>
+    struct push_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::back_))>
+        struct apply
+        {
+            BOOST_MPL_ASSERT_MSG(
+                (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size<Sequence>::type::value)
+              , PUSH_BACK_FAILED_MPL_STRING_IS_FULL
+              , (Sequence)
+            );
+            // If the above assertion didn't fire, then the string is sparse.
+            // Repack the string and retry the push_back
+            typedef
+                typename mpl::push_back<
+                    typename mpl::copy<
+                        Sequence
+                      , mpl::back_inserter<mpl::string<> >
+                    >::type
+                  , Value
+                >::type
+            type;
+        };
+
+        template<typename Value>
+        struct apply<mpl::string<>, Value, false>
+        {
+            typedef mpl::string<(char)Value::value> type;
+        };
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C), typename Value>                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, false>                    \
+        {                                                                                           \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C)                                   \
+                    BOOST_PP_COMMA_IF(BOOST_PP_DEC(n))                                              \
+                    ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff)                            \
+                    ?BOOST_PP_CAT(C,BOOST_PP_DEC(n))                                                \
+                    :BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n)), Value::value)   \
+                  , ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff)                            \
+                    ?(char)Value::value                                                             \
+                    :0                                                                              \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), typename Value>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), C)
+                  , BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS)), Value::value)
+                >
+            type;
+        };
+    };
+
+    template<typename Tag>
+    struct has_push_back_impl;
+
+    template<>
+    struct has_push_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+          : mpl::true_
+        {};
+    };
+
+    template<typename Tag>
+    struct pop_back_impl;
+
+    template<>
+    struct pop_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+        {                                                                                           \
+            BOOST_MPL_ASSERT_MSG((C0 != 0), POP_BACK_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>));  \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C)                                   \
+                    BOOST_PP_COMMA_IF(BOOST_PP_DEC(n))                                              \
+                    BOOST_MPL_MULTICHAR_POP_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n)))                   \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+        #undef M0
+    };
+
+    template<typename Tag>
+    struct has_pop_back_impl;
+
+    template<>
+    struct has_pop_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+          : mpl::true_
+        {};
+    };
+
+    template<typename Tag>
+    struct push_front_impl;
+
+    template<>
+    struct push_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::front_))>
+        struct apply
+        {
+            BOOST_MPL_ASSERT_MSG(
+                (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size<Sequence>::type::value)
+              , PUSH_FRONT_FAILED_MPL_STRING_IS_FULL
+              , (Sequence)
+            );
+            // If the above assertion didn't fire, then the string is sparse.
+            // Repack the string and retry the push_front.
+            typedef
+                typename mpl::push_front<
+                    typename mpl::reverse_copy<
+                        Sequence
+                      , mpl::front_inserter<string<> >
+                    >::type
+                  , Value
+                >::type
+            type;
+        };
+
+        #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+        template<typename Value>
+        struct apply<mpl::string<>, Value, false>
+        {
+            typedef mpl::string<(char)Value::value> type;
+        };
+        #endif
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C), typename Value>                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, true>                     \
+        {                                                                                           \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    (char)Value::value                                                              \
+                    BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, C)                                        \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), typename Value>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_MPL_MULTICHAR_PUSH_FRONT(C0, Value::value)
+                  , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)
+                >
+            type0;
+
+            #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+            typedef
+                typename mpl::if_<
+                    mpl::empty<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> >
+                  , mpl::string<(char)Value::value>
+                  , type0
+                >::type
+            type;
+            #else
+            typedef type0 type;
+            #endif
+        };
+    };
+
+    template<typename Tag>
+    struct has_push_front_impl;
+
+    template<>
+    struct has_push_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+          : mpl::true_
+        {};
+    };
+
+    template<typename Tag>
+    struct pop_front_impl;
+
+    template<>
+    struct pop_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence, bool B = (1==BOOST_MPL_MULTICHAR_LENGTH(Sequence::front_))>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, true>                            \
+        {                                                                                           \
+            BOOST_MPL_ASSERT_MSG((C0 != 0), POP_FRONT_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>)); \
+            typedef                                                                                 \
+                mpl::string<BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, n, C)>                                \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_MPL_MULTICHAR_POP_FRONT(C0)
+                  , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)
+                >
+            type;
+        };
+    };
+
+    template<typename Tag>
+    struct has_pop_front_impl;
+
+    template<>
+    struct has_pop_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+          : mpl::true_
+        {};
+    };
+
+    template<typename Tag>
+    struct insert_range_impl;
+
+    template<>
+    struct insert_range_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Pos, typename Range>
+        struct apply
+          : mpl::copy<
+                mpl::joint_view<
+                    mpl::iterator_range<
+                        mpl::string_iterator<Sequence, 0, 0>
+                      , Pos
+                    >
+                  , mpl::joint_view<
+                        Range
+                      , mpl::iterator_range<
+                            Pos
+                          , typename mpl::end<Sequence>::type
+                        >
+                    >
+                >
+              , mpl::back_inserter<mpl::string<> >
+            >
+        {};
+    };
+
+    template<typename Tag>
+    struct insert_impl;
+
+    template<>
+    struct insert_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Pos, typename Value>
+        struct apply
+          : mpl::insert_range<Sequence, Pos, mpl::string<(char)Value::value> >
+        {};
+    };
+
+    template<typename Tag>
+    struct erase_impl;
+
+    template<>
+    struct erase_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename First, typename Last>
+        struct apply
+          : mpl::copy<
+                mpl::joint_view<
+                    mpl::iterator_range<
+                        mpl::string_iterator<Sequence, 0, 0>
+                      , First
+                    >
+                  , mpl::iterator_range<
+                        typename mpl::if_na<Last, typename mpl::next<First>::type>::type
+                      , typename mpl::end<Sequence>::type
+                    >
+                >
+              , mpl::back_inserter<mpl::string<> >
+            >
+        {};
+    };
+
+    template<typename Tag>
+    struct clear_impl;
+
+    template<>
+    struct clear_impl<mpl::string_tag>
+    {
+        template<typename>
+        struct apply
+        {
+            typedef mpl::string<> type;
+        };
+    };
+
+    #define M0(z, n, data)                                                                            \
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), int J>                         \
+    struct string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, n, J>   \
+    {                                                                                                 \
+        enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == J + 1) };                   \
+        typedef mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> string;             \
+        typedef std::bidirectional_iterator_tag category;                                             \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n + eomc_, eomc_ ? 0 : J + 1>                                \
+        next;                                                                                         \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n, J - 1>                                                    \
+        prior;                                                                                        \
+        typedef mpl::char_<BOOST_MPL_MULTICHAR_AT(BOOST_PP_CAT(C, n), J)> type;                       \
+    };                                                                                                \
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>                                \
+    struct string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, n, 0>   \
+    {                                                                                                 \
+        enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == 1) };                       \
+        typedef mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> string;             \
+        typedef std::bidirectional_iterator_tag category;                                             \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n + eomc_, !eomc_>                                           \
+        next;                                                                                         \
+        typedef                                                                                       \
+            mpl::string_iterator<                                                                     \
+                string                                                                                \
+              , n - 1                                                                                 \
+              , BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, BOOST_PP_DEC(n))) - 1                      \
+            >                                                                                         \
+        prior;                                                                                        \
+        typedef mpl::char_<BOOST_MPL_MULTICHAR_AT(BOOST_PP_CAT(C, n), 0)> type;                       \
+    };
+
+    BOOST_PP_REPEAT(BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+    #undef M0
+
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>
+    struct string
+    {
+        /// INTERNAL ONLY
+        enum
+        {
+            front_  = C0
+          , back_   = BOOST_PP_CAT(C, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS))
+        };
+
+        typedef char        value_type;
+        typedef string      type;
+        typedef string_tag  tag;
+    };
+
+    namespace aux_
+    {
+        template<typename It, typename End>
+        struct next_unless
+          : mpl::next<It>
+        {};
+
+        template<typename End>
+        struct next_unless<End, End>
+        {
+            typedef End type;
+        };
+
+        template<typename It, typename End>
+        struct deref_unless
+          : mpl::deref<It>
+        {};
+
+        template<typename End>
+        struct deref_unless<End, End>
+        {
+            typedef mpl::char_<'\0'> type;
+        };
+    }
+
+    template<typename Sequence>
+    struct c_str
+    {
+        typedef typename mpl::end<Sequence>::type iend;
+        typedef typename mpl::begin<Sequence>::type i0;
+        #define M0(z, n, data)                                                                      \
+        typedef                                                                                     \
+            typename mpl::aux_::next_unless<BOOST_PP_CAT(i, n), iend>::type                         \
+        BOOST_PP_CAT(i, BOOST_PP_INC(n));
+        BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~)
+        #undef M0
+
+        typedef c_str type;
+        static typename Sequence::value_type const value[BOOST_MPL_LIMIT_STRING_SIZE+1];
+    };
+
+    template<typename Sequence>
+    typename Sequence::value_type const c_str<Sequence>::value[BOOST_MPL_LIMIT_STRING_SIZE+1] =
+    {
+        #define M0(z, n, data)                                                                      \
+        mpl::aux_::deref_unless<BOOST_PP_CAT(i, n), iend>::type::value,
+        BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~)
+        #undef M0
+        '\0'
+    };
+
+}} // namespace boost
+
+#endif // BOOST_MPL_STRING_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/switch.hpp b/gatb-core/thirdparty/boost/mpl/switch.hpp
new file mode 100644
index 0000000..8edc38f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/switch.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_SWITCH_HPP_INCLUDED
+#define BOOST_MPL_SWITCH_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template< 
+      typename BOOST_MPL_AUX_NA_PARAM(Body)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct switch_
+{
+    typedef typename find_if<
+          Body
+        , apply1< lambda< first<_1> >, T >
+        >::type iter_;
+        
+    typedef typename deref<iter_>::type pair_;
+    typedef typename lambda< typename second<pair_>::type >::type f_;
+    typedef typename apply1<f_,T>::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,switch_,(Body,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, switch_)
+
+}}
+
+#endif // BOOST_MPL_SWITCH_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/tag.hpp b/gatb-core/thirdparty/boost/mpl/tag.hpp
new file mode 100644
index 0000000..8586277
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/tag.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_TAG_HPP_INCLUDED
+#define BOOST_MPL_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/has_tag.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T > struct tag_impl
+{
+    typedef typename T::tag type;
+};
+}
+
+template< typename T, typename Default = void_ > struct tag
+#if !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+    : if_< 
+          aux::has_tag<T>
+        , aux::tag_impl<T>
+        , Default
+        >::type
+{
+#else
+{
+    typedef typename eval_if< 
+          aux::has_tag<T>
+        , aux::tag_impl<T>
+        , Default
+        >::type type;
+
+#endif
+};
+
+}}
+
+#endif // BOOST_MPL_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/times.hpp b/gatb-core/thirdparty/boost/mpl/times.hpp
new file mode 100644
index 0000000..f309557
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/times.hpp
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_TIMES_HPP_INCLUDED
+#define BOOST_MPL_TIMES_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#define AUX778076_OP_NAME times
+#define AUX778076_OP_TOKEN *
+#include <boost/mpl/aux_/arithmetic_op.hpp>
+
+#endif // BOOST_MPL_TIMES_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/transform.hpp b/gatb-core/thirdparty/boost/mpl/transform.hpp
new file mode 100644
index 0000000..4d3e2a0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/transform.hpp
@@ -0,0 +1,145 @@
+
+#ifndef BOOST_MPL_TRANSFORM_HPP_INCLUDED
+#define BOOST_MPL_TRANSFORM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/pair_view.hpp>
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux { 
+
+template< 
+      typename Seq
+    , typename Op
+    , typename In
+    >
+struct transform1_impl
+    : fold< 
+          Seq
+        , typename In::state
+        , bind2< typename lambda< typename In::operation >::type
+            , _1
+            , bind1< typename lambda<Op>::type, _2>
+            > 
+        >
+{
+};
+
+template< 
+      typename Seq
+    , typename Op
+    , typename In
+    >
+struct reverse_transform1_impl
+    : reverse_fold< 
+          Seq
+        , typename In::state
+        , bind2< typename lambda< typename In::operation >::type
+            , _1
+            , bind1< typename lambda<Op>::type, _2>
+            > 
+        >
+{
+};
+
+template< 
+      typename Seq1
+    , typename Seq2
+    , typename Op
+    , typename In
+    >
+struct transform2_impl
+    : fold< 
+          pair_view<Seq1,Seq2>
+        , typename In::state
+        , bind2< typename lambda< typename In::operation >::type
+            , _1
+            , bind2<
+                  typename lambda<Op>::type
+                , bind1<first<>,_2>
+                , bind1<second<>,_2>
+                >
+            > 
+        >
+{
+};
+
+template< 
+      typename Seq1
+    , typename Seq2
+    , typename Op
+    , typename In
+    >
+struct reverse_transform2_impl
+    : reverse_fold< 
+          pair_view<Seq1,Seq2>
+        , typename In::state
+        , bind2< typename lambda< typename In::operation >::type
+            , _1
+            , bind2< typename lambda< Op >::type
+                , bind1<first<>,_2>
+                , bind1<second<>,_2>
+                >
+            > 
+        >
+{
+};
+
+} // namespace aux 
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, transform1)                    
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, transform2)
+    
+#define AUX778076_TRANSFORM_DEF(name)                                   \
+template<                                                               \
+      typename BOOST_MPL_AUX_NA_PARAM(Seq1)                             \
+    , typename BOOST_MPL_AUX_NA_PARAM(Seq2OrOperation)                  \
+    , typename BOOST_MPL_AUX_NA_PARAM(OperationOrInserter)              \
+    , typename BOOST_MPL_AUX_NA_PARAM(Inserter)                         \
+    >                                                                   \
+struct name                                                             \
+{                                                                       \
+    typedef typename eval_if<                                           \
+          or_<                                                          \
+              is_na<OperationOrInserter>                                \
+            , is_lambda_expression< Seq2OrOperation >                   \
+            , not_< is_sequence<Seq2OrOperation> >                      \
+            >                                                           \
+        , name##1<Seq1,Seq2OrOperation,OperationOrInserter>             \
+        , name##2<Seq1,Seq2OrOperation,OperationOrInserter,Inserter>    \
+        >::type type;                                                   \
+};                                                                      \
+BOOST_MPL_AUX_NA_SPEC(4, name)                                          \
+/**/
+
+AUX778076_TRANSFORM_DEF(transform)
+AUX778076_TRANSFORM_DEF(reverse_transform)
+
+#undef AUX778076_TRANSFORM_DEF
+
+}}
+
+#endif // BOOST_MPL_TRANSFORM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/transform_view.hpp b/gatb-core/thirdparty/boost/mpl/transform_view.hpp
new file mode 100644
index 0000000..6c0e0b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/transform_view.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_TRANSFORM_VIEW_HPP_INCLUDED
+#define BOOST_MPL_TRANSFORM_VIEW_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/transform_iter.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(F)
+    >
+struct transform_view
+{
+ private:
+    typedef typename lambda<F>::type f_;
+    typedef typename begin<Sequence>::type first_;
+    typedef typename end<Sequence>::type last_;
+ 
+ public:
+    struct tag;
+    typedef transform_view type;
+    typedef aux::transform_iter< first_,last_,f_ > begin;
+    typedef aux::transform_iter< last_,last_,f_ > end;
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, transform_view)
+
+}}
+
+#endif // BOOST_MPL_TRANSFORM_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/unique.hpp b/gatb-core/thirdparty/boost/mpl/unique.hpp
new file mode 100644
index 0000000..80a27da
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/unique.hpp
@@ -0,0 +1,85 @@
+
+#ifndef BOOST_MPL_UNIQUE_HPP_INCLUDED
+#define BOOST_MPL_UNIQUE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+// Copyright John R. Bandela 2000-2002
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/aux_/inserter_algorithm.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_spec.hpp>
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Predicate, typename Operation >
+struct unique_op
+{
+    template< typename Pair, typename T > struct apply
+    {
+        typedef typename Pair::first seq_;
+        typedef typename Pair::second prior_;
+        typedef typename eval_if<
+              and_< is_not_na<prior_>, apply2<Predicate,prior_,T> >
+            , identity<seq_>
+            , apply2<Operation,seq_,T>
+            >::type new_seq_;
+
+        typedef pair<new_seq_,T> type;
+    };
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct unique_impl
+    : first< typename fold<
+          Sequence
+        , pair< typename Inserter::state,na >
+        , protect< aux::unique_op<Predicate,typename Inserter::operation> >
+        >::type >
+{
+};
+
+template<
+      typename Sequence
+    , typename Predicate
+    , typename Inserter
+    >
+struct reverse_unique_impl
+    : first< typename reverse_fold<
+          Sequence
+        , pair< typename Inserter::state,na >
+        , protect< aux::unique_op<Predicate,typename Inserter::operation> >
+        >::type >
+{
+};
+
+} // namespace aux
+
+BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, unique)
+
+}}
+
+#endif // BOOST_MPL_UNIQUE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/unpack_args.hpp b/gatb-core/thirdparty/boost/mpl/unpack_args.hpp
new file mode 100644
index 0000000..f64ace3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/unpack_args.hpp
@@ -0,0 +1,150 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_MPL_UNPACK_ARGS_HPP_INCLUDED
+#define BOOST_MPL_UNPACK_ARGS_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/at.hpp>
+#   include <boost/mpl/size.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/lambda_spec.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER unpack_args.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/arity.hpp>
+#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/mpl/aux_/config/forwarding.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/cat.hpp>
+
+
+namespace boost { namespace mpl {
+
+// local macros, #undef-ined at the end of the header
+
+#   define AUX778076_UNPACK(unused, i, Args) \
+    , typename at_c<Args,i>::type \
+    /**/
+
+#   define AUX778076_UNPACKED_ARGS(n, Args) \
+    BOOST_MPL_PP_REPEAT(n, AUX778076_UNPACK, Args) \
+    /**/
+
+namespace aux {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+template< int size, typename F, typename Args >
+struct unpack_args_impl;
+#else
+template< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl
+{
+    template< typename F, typename Args > struct apply;
+};
+#endif
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/unpack_args.hpp>))
+#include BOOST_PP_ITERATE()
+
+}
+
+template<
+      typename F
+    >
+struct unpack_args
+{
+    template< typename Args > struct apply
+#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+        : aux::unpack_args_impl< size<Args>::value,F,Args >
+#   else
+        : aux::unpack_args_impl< size<Args>::value >
+            ::template apply< F,Args >
+#   endif
+    {
+#else // BOOST_MPL_CFG_NO_NESTED_FORWARDING
+    {
+        typedef typename aux::unpack_args_impl< 
+              size<Args>::value
+            , F
+            , Args
+            >::type type;
+#endif
+    };
+};
+
+BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)
+
+#   undef AUX778076_UNPACK
+#   undef AUX778076_UNPACKED_ARGS
+
+}}
+
+#endif // BOOST_MPL_CFG_USE_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_UNPACK_ARGS_HPP_INCLUDED
+
+///// iteration, depth == 1
+
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
+
+#   define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< typename F, typename Args >
+struct unpack_args_impl<i_,F,Args>
+    : BOOST_PP_CAT(apply,i_)<
+          F
+        AUX778076_UNPACKED_ARGS(i_, Args)
+        >
+{
+};
+
+#else
+
+template<> struct unpack_args_impl<i_>
+{
+    template< typename F, typename Args > struct apply
+        : BOOST_PP_CAT(apply,i_)<
+              F
+            AUX778076_UNPACKED_ARGS(i_, Args)
+            >
+    {
+    };
+};
+
+#endif
+
+#   undef i_
+
+#endif // BOOST_PP_ITERATION_DEPTH()
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/upper_bound.hpp b/gatb-core/thirdparty/boost/mpl/upper_bound.hpp
new file mode 100644
index 0000000..ff943e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/upper_bound.hpp
@@ -0,0 +1,141 @@
+
+#ifndef BOOST_MPL_UPPER_BOUND_HPP_INCLUDED
+#define BOOST_MPL_UPPER_BOUND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#   define BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL
+#endif
+
+#if !defined(BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL)
+#   include <boost/mpl/minus.hpp>
+#   include <boost/mpl/divides.hpp>
+#   include <boost/mpl/size.hpp>
+#   include <boost/mpl/advance.hpp>
+#   include <boost/mpl/begin_end.hpp>
+#   include <boost/mpl/long.hpp>
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/prior.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#else
+#   include <boost/mpl/find.hpp>
+#   include <boost/mpl/bind.hpp>
+#endif
+
+#include <boost/config.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL)
+
+// agurt 23/oct/02: has a wrong complexity etc., but at least it works;
+// feel free to contribute a better implementation!
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    , typename pred_ = typename lambda<Predicate>::type
+    >
+struct upper_bound
+    : find_if< Sequence, bind2<pred_,T,_> >
+{
+};
+
+#else
+
+namespace aux {
+
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step_impl;
+
+template< 
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step
+{
+    typedef typename eval_if<
+          Distance
+        , upper_bound_step_impl<Distance,Predicate,T,DeferredIterator>
+        , DeferredIterator
+        >::type type;
+};
+    
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step_impl
+{
+    typedef typename divides< Distance, long_<2> >::type offset_;
+    typedef typename DeferredIterator::type iter_;
+    typedef typename advance< iter_,offset_ >::type middle_;
+    typedef typename apply2<
+              Predicate
+            , T
+            , typename deref<middle_>::type
+            >::type cond_;
+
+    typedef typename prior< minus< Distance, offset_ > >::type step_;
+    typedef upper_bound_step< offset_,Predicate,T,DeferredIterator > step_forward_;
+    typedef upper_bound_step< step_,Predicate,T,next<middle_> > step_backward_;
+    typedef typename eval_if<
+          cond_
+        , step_forward_
+        , step_backward_
+        >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    >
+struct upper_bound
+{
+ private:
+    typedef typename lambda<Predicate>::type pred_;
+    typedef typename size<Sequence>::type size_;
+
+ public:
+    typedef typename aux::upper_bound_step<
+        size_,pred_,T,begin<Sequence>
+        >::type type;
+};
+
+#endif // BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL
+
+BOOST_MPL_AUX_NA_SPEC(2, upper_bound)
+
+}}
+
+#endif // BOOST_MPL_UPPER_BOUND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/value_type.hpp b/gatb-core/thirdparty/boost/mpl/value_type.hpp
new file mode 100644
index 0000000..5b8c822
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/value_type.hpp
@@ -0,0 +1,42 @@
+
+#ifndef BOOST_MPL_VALUE_TYPE_HPP_INCLUDED
+#define BOOST_MPL_VALUE_TYPE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/value_type_fwd.hpp>
+#include <boost/mpl/sequence_tag.hpp>
+#include <boost/mpl/apply_wrap.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(AssociativeSequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    >
+struct value_type
+    : apply_wrap2<
+          value_type_impl< typename sequence_tag<AssociativeSequence>::type >
+        , AssociativeSequence, T >
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,value_type,(AssociativeSequence,T))
+};
+
+BOOST_MPL_AUX_NA_SPEC(2, value_type)
+    
+}}
+
+#endif // BOOST_MPL_VALUE_TYPE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/value_type_fwd.hpp b/gatb-core/thirdparty/boost/mpl/value_type_fwd.hpp
new file mode 100644
index 0000000..d8635bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/value_type_fwd.hpp
@@ -0,0 +1,25 @@
+
+#ifndef BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED
+#define BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2003-2004
+// Copyright David Abrahams 2003-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct value_type_impl;
+template< typename AssociativeSequence, typename T > struct value_type;
+
+}}
+
+#endif // BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector.hpp b/gatb-core/thirdparty/boost/mpl/vector.hpp
new file mode 100644
index 0000000..479983d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector.hpp
@@ -0,0 +1,57 @@
+
+#ifndef BOOST_MPL_VECTOR_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/vector.hpp>
+#   include <boost/mpl/aux_/na.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_VECTOR_HEADER \
+    BOOST_PP_CAT(vector, BOOST_MPL_LIMIT_VECTOR_SIZE).hpp \
+    /**/
+#else
+#   define AUX778076_VECTOR_HEADER \
+    BOOST_PP_CAT(vector, BOOST_MPL_LIMIT_VECTOR_SIZE)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/vector/AUX778076_VECTOR_HEADER)
+#   undef AUX778076_VECTOR_HEADER
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/vector.hpp>
+
+#   define AUX778076_SEQUENCE_NAME vector
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_VECTOR_SIZE
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_VECTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/O1_size.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/O1_size.hpp
new file mode 100644
index 0000000..ac9e3cf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/O1_size.hpp
@@ -0,0 +1,56 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_O1_SIZE_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_O1_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/O1_size_fwd.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct O1_size_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+        : Vector::size
+    {
+    };
+};
+
+#else
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long N >
+struct O1_size_impl< aux::vector_tag<N> >
+{
+    template< typename Vector > struct apply
+        : mpl::long_<N>
+    {
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_O1_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/at.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/at.hpp
new file mode 100644
index 0000000..0a7583c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/at.hpp
@@ -0,0 +1,116 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/at_fwd.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template< typename Vector, long n_ >
+struct v_at_impl
+{
+    typedef long_< (Vector::lower_bound_::value + n_) > index_;
+    typedef __typeof__( Vector::item_(index_()) ) type;
+};
+
+
+template< typename Vector, long n_ >
+struct v_at
+    : aux::wrapped_type< typename v_at_impl<Vector,n_>::type >
+{
+};
+
+template<>
+struct at_impl< aux::vector_tag >
+{
+    template< typename Vector, typename N > struct apply
+        : v_at<
+              Vector
+            , BOOST_MPL_AUX_VALUE_WKND(N)::value
+            >
+    {
+    };
+};
+
+#else
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+
+template< typename Vector, BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at;
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, n_) >
+struct at_impl< aux::vector_tag<n_> >
+{
+    template< typename Vector, typename N > struct apply
+#if !defined(__BORLANDC__)
+        : v_at<
+              Vector
+            , BOOST_MPL_AUX_VALUE_WKND(N)::value
+            >
+    {
+#else
+    {
+        typedef typename v_at<
+              Vector
+            , BOOST_MPL_AUX_VALUE_WKND(N)::value
+            >::type type;
+#endif
+    };
+};
+
+#   else
+
+namespace aux {
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at_impl
+{
+    template< typename V > struct result_;
+};
+
+// to work around ETI, etc.
+template<> struct v_at_impl<-1>
+{
+    template< typename V > struct result_
+    {
+        typedef void_ type;
+    };
+};
+
+} // namespace aux
+
+template< typename T, BOOST_MPL_AUX_NTTP_DECL(long, n_) >
+struct v_at
+    : aux::v_at_impl<n_>::template result_<T>
+{
+};
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/back.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/back.hpp
new file mode 100644
index 0000000..b66363e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/back.hpp
@@ -0,0 +1,59 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_BACK_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/back_fwd.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/vector/aux_/at.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct back_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+        : v_at<
+              Vector
+            , prior<typename Vector::size>::type::value
+            >
+    {
+    };
+};
+
+#else
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long n_ >
+struct back_impl< aux::vector_tag<n_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/begin_end.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/begin_end.hpp
new file mode 100644
index 0000000..aa34451
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/begin_end.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_BEGIN_END_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_BEGIN_END_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   include <boost/mpl/begin_end_fwd.hpp>
+#   include <boost/mpl/vector/aux_/iterator.hpp>
+#   include <boost/mpl/vector/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct begin_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+    {
+        typedef v_iter<Vector,0> type;
+    };
+};
+
+template<>
+struct end_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+    {
+        typedef v_iter<Vector,Vector::size::value> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#endif // BOOST_MPL_VECTOR_AUX_BEGIN_END_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/clear.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/clear.hpp
new file mode 100644
index 0000000..b06d8be
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/clear.hpp
@@ -0,0 +1,55 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_CLEAR_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_CLEAR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/vector/aux_/vector0.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct clear_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+#else
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long N >
+struct clear_impl< aux::vector_tag<N> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_CLEAR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/empty.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/empty.hpp
new file mode 100644
index 0000000..5490a5f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/empty.hpp
@@ -0,0 +1,68 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_EMPTY_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_EMPTY_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct empty_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+        : is_same<
+              typename Vector::lower_bound_
+            , typename Vector::upper_bound_
+            >
+    {
+    };
+};
+
+#else
+
+template<>
+struct empty_impl< aux::vector_tag<0> >
+{
+    template< typename Vector > struct apply
+        : true_
+    {
+    };
+};
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long N >
+struct empty_impl< aux::vector_tag<N> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_EMPTY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/front.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/front.hpp
new file mode 100644
index 0000000..a358db5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/front.hpp
@@ -0,0 +1,56 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_FRONT_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/vector/aux_/at.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct front_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+        : v_at<Vector,0>
+    {
+    };
+};
+
+#else
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< BOOST_MPL_AUX_NTTP_DECL(long, n_) >
+struct front_impl< aux::vector_tag<n_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/include_preprocessed.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/include_preprocessed.hpp
new file mode 100644
index 0000000..a676116
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/include_preprocessed.hpp
@@ -0,0 +1,55 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2000-2006
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/preprocessor.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+#   define AUX778076_INCLUDE_DIR typeof_based
+#elif defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+   || defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+#   define AUX778076_INCLUDE_DIR no_ctps
+#else
+#   define AUX778076_INCLUDE_DIR plain
+#endif
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_HEADER \
+    AUX778076_INCLUDE_DIR/BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#else
+#   define AUX778076_HEADER \
+    BOOST_PP_CAT(AUX778076_INCLUDE_DIR,/)##BOOST_MPL_PREPROCESSED_HEADER \
+/**/
+#endif
+
+
+#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))
+#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/vector/aux_/preprocessed/AUX778076_HEADER)
+#   include AUX778076_INCLUDE_STRING
+#   undef AUX778076_INCLUDE_STRING
+#else
+#   include BOOST_PP_STRINGIZE(boost/mpl/vector/aux_/preprocessed/AUX778076_HEADER)
+#endif
+
+#   undef AUX778076_HEADER
+#   undef AUX778076_INCLUDE_DIR
+
+#undef BOOST_MPL_PREPROCESSED_HEADER
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/item.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/item.hpp
new file mode 100644
index 0000000..71538ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/item.hpp
@@ -0,0 +1,103 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template< 
+      typename T
+    , typename Base
+    , int at_front = 0
+    >
+struct v_item
+    : Base
+{
+    typedef typename Base::upper_bound_ index_;
+    typedef typename next<index_>::type upper_bound_;
+    typedef typename next<typename Base::size>::type size;
+    typedef Base base;
+    typedef v_item type;
+
+    // agurt 10/sep/04: MWCW <= 9.3 workaround here and below; the compiler
+    // breaks if using declaration comes _before_ the new overload
+    static aux::type_wrapper<T> item_(index_);
+    using Base::item_;
+};
+
+template<
+      typename T
+    , typename Base
+    >
+struct v_item<T,Base,1>
+    : Base
+{
+    typedef typename prior<typename Base::lower_bound_>::type index_;
+    typedef index_ lower_bound_;
+    typedef typename next<typename Base::size>::type size;
+    typedef Base base;
+    typedef v_item type;
+
+    static aux::type_wrapper<T> item_(index_);
+    using Base::item_;
+};
+
+// "erasure" item
+template< 
+      typename Base
+    , int at_front
+    >
+struct v_mask
+    : Base
+{
+    typedef typename prior<typename Base::upper_bound_>::type index_;
+    typedef index_ upper_bound_;
+    typedef typename prior<typename Base::size>::type size;
+    typedef Base base;
+    typedef v_mask type;
+
+    static aux::type_wrapper<void_> item_(index_);
+    using Base::item_;
+};
+
+template< 
+      typename Base
+    >
+struct v_mask<Base,1>
+    : Base
+{
+    typedef typename Base::lower_bound_ index_;
+    typedef typename next<index_>::type lower_bound_;
+    typedef typename prior<typename Base::size>::type size;
+    typedef Base base;
+    typedef v_mask type;
+
+    static aux::type_wrapper<void_> item_(index_);
+    using Base::item_;
+};
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/iterator.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/iterator.hpp
new file mode 100644
index 0000000..32df315
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/iterator.hpp
@@ -0,0 +1,130 @@
+
+#ifndef BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED
+#define BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/vector/aux_/at.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/advance_fwd.hpp>
+#include <boost/mpl/distance_fwd.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/prior.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+#include <boost/mpl/aux_/value_wknd.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+namespace boost { namespace mpl {
+
+template<
+      typename Vector
+    , BOOST_MPL_AUX_NTTP_DECL(long, n_)
+    >
+struct v_iter
+{
+    typedef aux::v_iter_tag tag;
+    typedef random_access_iterator_tag category;
+    typedef typename v_at<Vector,n_>::type type;
+
+    typedef Vector vector_;
+    typedef mpl::long_<n_> pos;
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    enum { 
+          next_ = n_ + 1
+        , prior_ = n_ - 1
+        , pos_ = n_
+    };
+    
+    typedef v_iter<Vector,next_> next;
+    typedef v_iter<Vector,prior_> prior;
+#endif
+
+};
+
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template<
+      typename Vector
+    , BOOST_MPL_AUX_NTTP_DECL(long, n_)
+    >
+struct next< v_iter<Vector,n_> >
+{
+    typedef v_iter<Vector,(n_ + 1)> type;
+};
+
+template<
+      typename Vector
+    , BOOST_MPL_AUX_NTTP_DECL(long, n_)
+    >
+struct prior< v_iter<Vector,n_> >
+{
+    typedef v_iter<Vector,(n_ - 1)> type;
+};
+
+template<
+      typename Vector
+    , BOOST_MPL_AUX_NTTP_DECL(long, n_)
+    , typename Distance
+    >
+struct advance< v_iter<Vector,n_>,Distance>
+{
+    typedef v_iter<
+          Vector
+        , (n_ + BOOST_MPL_AUX_NESTED_VALUE_WKND(long, Distance))
+        > type;
+};
+
+template< 
+      typename Vector
+    , BOOST_MPL_AUX_NTTP_DECL(long, n_)
+    , BOOST_MPL_AUX_NTTP_DECL(long, m_)
+    > 
+struct distance< v_iter<Vector,n_>, v_iter<Vector,m_> >
+    : mpl::long_<(m_ - n_)>
+{
+};
+
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template<> struct advance_impl<aux::v_iter_tag>
+{
+    template< typename Iterator, typename N > struct apply
+    {
+        enum { pos_ = Iterator::pos_, n_ = N::value };
+        typedef v_iter<
+              typename Iterator::vector_
+            , (pos_ + n_)
+            > type;
+    };
+};
+
+template<> struct distance_impl<aux::v_iter_tag>
+{
+    template< typename Iter1, typename Iter2 > struct apply
+    {
+        enum { pos1_ = Iter1::pos_, pos2_ = Iter2::pos_ };
+        typedef long_<( pos2_ - pos1_ )> type;
+        BOOST_STATIC_CONSTANT(long, value = ( pos2_ - pos1_ ));
+    };
+};
+
+#endif
+
+}}
+
+#endif // BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered.hpp
new file mode 100644
index 0000000..b3f0387
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered.hpp
@@ -0,0 +1,218 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_shifted_params.hpp>
+#include <boost/preprocessor/comma_if.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   define AUX778076_VECTOR_TAIL(vector, i_, T) \
+    BOOST_PP_CAT(vector,i_)< \
+          BOOST_PP_ENUM_PARAMS(i_, T) \
+        > \
+    /**/
+
+#if i_ > 0
+template<
+      BOOST_PP_ENUM_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(vector,i_)
+    : v_item<
+          BOOST_PP_CAT(T,BOOST_PP_DEC(i_))
+        , AUX778076_VECTOR_TAIL(vector,BOOST_PP_DEC(i_),T)
+        >
+{
+    typedef BOOST_PP_CAT(vector,i_) type;
+};
+#endif
+
+#   undef AUX778076_VECTOR_TAIL
+
+#else // "brute force" implementation
+
+#   if i_ > 0
+
+template<
+      BOOST_PP_ENUM_PARAMS(i_, typename T)
+    >
+struct BOOST_PP_CAT(vector,i_)
+{
+    typedef aux::vector_tag<i_> tag;
+    typedef BOOST_PP_CAT(vector,i_) type;
+
+#   define AUX778076_VECTOR_ITEM(unused, i_, unused2) \
+    typedef BOOST_PP_CAT(T,i_) BOOST_PP_CAT(item,i_); \
+    /**/
+
+    BOOST_PP_REPEAT(i_, AUX778076_VECTOR_ITEM, unused)
+#   undef AUX778076_VECTOR_ITEM
+    typedef void_ BOOST_PP_CAT(item,i_);
+    typedef BOOST_PP_CAT(T,BOOST_PP_DEC(i_)) back;
+
+    // Borland forces us to use 'type' here (instead of the class name)
+    typedef v_iter<type,0> begin;
+    typedef v_iter<type,i_> end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<BOOST_PP_DEC(i_)> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef BOOST_PP_CAT(vector,i_)<
+              T
+              BOOST_PP_COMMA_IF(BOOST_PP_DEC(i_))
+              BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef BOOST_PP_CAT(vector,BOOST_PP_DEC(i_))<
+              BOOST_PP_ENUM_SHIFTED_PARAMS(i_, typename Vector::item)
+            > type;
+    };
+};
+
+
+template<>
+struct push_back_impl< aux::vector_tag<BOOST_PP_DEC(i_)> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef BOOST_PP_CAT(vector,i_)<
+              BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
+              BOOST_PP_COMMA_IF(BOOST_PP_DEC(i_))
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef BOOST_PP_CAT(vector,BOOST_PP_DEC(i_))<
+              BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
+            > type;
+    };
+};
+
+#   endif // i_ > 0
+
+#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
+
+template< typename V >
+struct v_at<V,i_>
+{
+    typedef typename V::BOOST_PP_CAT(item,i_) type;
+};
+
+#   else
+
+namespace aux {
+template<> struct v_at_impl<i_>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::BOOST_PP_CAT(item,i_) type;
+    };
+};
+}
+
+template<>
+struct at_impl< aux::vector_tag<i_> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+#if i_ > 0
+template<>
+struct front_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+#endif
+
+template<>
+struct size_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+        : long_<i_>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<i_> >
+    : size_impl< aux::vector_tag<i_> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<i_> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered_c.hpp
new file mode 100644
index 0000000..4c159f9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/numbered_c.hpp
@@ -0,0 +1,77 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+#if defined(BOOST_PP_IS_ITERATING)
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/preprocessor/enum_params.hpp>
+#include <boost/preprocessor/enum_shifted_params.hpp>
+#include <boost/preprocessor/comma_if.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define i_ BOOST_PP_FRAME_ITERATION(1)
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   define AUX778076_VECTOR_TAIL(vector, i_, C) \
+    BOOST_PP_CAT(BOOST_PP_CAT(vector,i_),_c)<T \
+          BOOST_PP_COMMA_IF(i_) BOOST_PP_ENUM_PARAMS(i_, C) \
+        > \
+    /**/
+
+#if i_ > 0
+template<
+      typename T
+    , BOOST_PP_ENUM_PARAMS(i_, T C)
+    >
+struct BOOST_PP_CAT(BOOST_PP_CAT(vector,i_),_c)
+    : v_item<
+          integral_c<T,BOOST_PP_CAT(C,BOOST_PP_DEC(i_))>
+        , AUX778076_VECTOR_TAIL(vector,BOOST_PP_DEC(i_),C)
+        >
+{
+    typedef BOOST_PP_CAT(BOOST_PP_CAT(vector,i_),_c) type;
+    typedef T value_type;
+};
+#endif
+
+#   undef AUX778076_VECTOR_TAIL
+
+#else // "brute force" implementation
+
+#   define AUX778076_VECTOR_C_PARAM_FUNC(unused, i_, param) \
+    BOOST_PP_COMMA_IF(i_) \
+    integral_c<T,BOOST_PP_CAT(param,i_)> \
+    /**/
+
+template<
+      typename T
+    , BOOST_PP_ENUM_PARAMS(i_, T C)
+    >
+struct BOOST_PP_CAT(BOOST_PP_CAT(vector,i_),_c)
+    : BOOST_PP_CAT(vector,i_)< BOOST_PP_REPEAT(i_,AUX778076_VECTOR_C_PARAM_FUNC,C) >
+{
+    typedef BOOST_PP_CAT(BOOST_PP_CAT(vector,i_),_c) type;
+    typedef T value_type;
+};
+
+#   undef AUX778076_VECTOR_C_PARAM_FUNC
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#undef i_
+
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_back.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_back.hpp
new file mode 100644
index 0000000..1d95e35
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_back.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_POP_BACK_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_POP_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_back_fwd.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   include <boost/mpl/vector/aux_/item.hpp>
+#   include <boost/mpl/vector/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct pop_back_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+    {
+        typedef v_mask<Vector,0> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#endif // BOOST_MPL_VECTOR_AUX_POP_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_front.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_front.hpp
new file mode 100644
index 0000000..c94b871
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/pop_front.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_POP_FRONT_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_POP_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/pop_front_fwd.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   include <boost/mpl/vector/aux_/item.hpp>
+#   include <boost/mpl/vector/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct pop_front_impl< aux::vector_tag >
+{
+    template< typename Vector > struct apply
+    {
+        typedef v_mask<Vector,1> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#endif // BOOST_MPL_VECTOR_AUX_POP_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10.hpp
new file mode 100644
index 0000000..c79a1ac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10.hpp
@@ -0,0 +1,1528 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template<> struct v_at_impl<0>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item0 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<0> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<0> >
+{
+    template< typename Vector > struct apply
+        : long_<0>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<0> >
+    : size_impl< aux::vector_tag<0> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<0> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0
+    >
+struct vector1
+{
+    typedef aux::vector_tag<1> tag;
+    typedef vector1 type;
+    typedef T0 item0;
+    typedef void_ item1;
+    typedef T0 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,1 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<0> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector1<
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<
+             
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<0> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector1<
+             
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<
+             
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<1>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item1 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<1> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+        : long_<1>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<1> >
+    : size_impl< aux::vector_tag<1> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector2
+{
+    typedef aux::vector_tag<2> tag;
+    typedef vector2 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    
+
+    typedef void_ item2;
+    typedef T1 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,2 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<1> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector2<
+              T
+              ,
+              typename Vector::item0
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector1<
+              typename Vector::item1
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<1> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector2<
+              typename Vector::item0
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector1<
+              typename Vector::item0
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<2>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item2 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<2> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+        : long_<2>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<2> >
+    : size_impl< aux::vector_tag<2> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector3
+{
+    typedef aux::vector_tag<3> tag;
+    typedef vector3 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    
+
+    typedef void_ item3;
+    typedef T2 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,3 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<2> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector3<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector2<
+              typename Vector::item1, typename Vector::item2
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<2> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector3<
+              typename Vector::item0, typename Vector::item1
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector2<
+              typename Vector::item0, typename Vector::item1
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<3>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item3 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<3> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+        : long_<3>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<3> >
+    : size_impl< aux::vector_tag<3> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector4
+{
+    typedef aux::vector_tag<4> tag;
+    typedef vector4 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    
+
+    typedef void_ item4;
+    typedef T3 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,4 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<3> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector4<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector3<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<3> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector4<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector3<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<4>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item4 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<4> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+        : long_<4>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<4> >
+    : size_impl< aux::vector_tag<4> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector5
+{
+    typedef aux::vector_tag<5> tag;
+    typedef vector5 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    
+
+    typedef void_ item5;
+    typedef T4 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,5 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<4> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector5<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector4<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<4> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector5<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector4<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<5>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item5 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<5> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+        : long_<5>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<5> >
+    : size_impl< aux::vector_tag<5> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector6
+{
+    typedef aux::vector_tag<6> tag;
+    typedef vector6 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    
+
+    typedef void_ item6;
+    typedef T5 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,6 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<5> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector6<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector5<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<5> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector6<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector5<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<6>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item6 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<6> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+        : long_<6>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<6> >
+    : size_impl< aux::vector_tag<6> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector7
+{
+    typedef aux::vector_tag<7> tag;
+    typedef vector7 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    
+
+    typedef void_ item7;
+    typedef T6 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,7 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<6> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector7<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector6<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<6> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector7<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector6<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<7>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item7 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<7> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+        : long_<7>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<7> >
+    : size_impl< aux::vector_tag<7> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector8
+{
+    typedef aux::vector_tag<8> tag;
+    typedef vector8 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    
+
+    typedef void_ item8;
+    typedef T7 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,8 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<7> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector8<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector7<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<7> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector8<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector7<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<8>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item8 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<8> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+        : long_<8>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<8> >
+    : size_impl< aux::vector_tag<8> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector9
+{
+    typedef aux::vector_tag<9> tag;
+    typedef vector9 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    
+
+    typedef void_ item9;
+    typedef T8 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,9 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<8> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector9<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector8<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<8> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector9<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector8<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<9>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item9 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<9> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+        : long_<9>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<9> >
+    : size_impl< aux::vector_tag<9> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector10
+{
+    typedef aux::vector_tag<10> tag;
+    typedef vector10 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    
+
+    typedef void_ item10;
+    typedef T9 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,10 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<9> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector10<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector9<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<9> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector10<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector9<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<10>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item10 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<10> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+        : long_<10>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<10> >
+    : size_impl< aux::vector_tag<10> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10_c.hpp
new file mode 100644
index 0000000..8b36f6a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10_c.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0
+    >
+struct vector1_c
+    : vector1< integral_c< T,C0 > >
+{
+    typedef vector1_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1
+    >
+struct vector2_c
+    : vector2< integral_c< T,C0 >, integral_c< T,C1 > >
+{
+    typedef vector2_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2
+    >
+struct vector3_c
+    : vector3< integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 > >
+{
+    typedef vector3_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3
+    >
+struct vector4_c
+    : vector4<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >, integral_c<T
+        , C3> 
+ >
+{
+    typedef vector4_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4
+    >
+struct vector5_c
+    : vector5<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 > 
+ >
+{
+    typedef vector5_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5
+    >
+struct vector6_c
+    : vector6<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 > 
+ >
+{
+    typedef vector6_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6
+    >
+struct vector7_c
+    : vector7<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c<T
+        , C6> 
+ >
+{
+    typedef vector7_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7
+    >
+struct vector8_c
+    : vector8<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 > 
+ >
+{
+    typedef vector8_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8
+    >
+struct vector9_c
+    : vector9<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 > 
+ >
+{
+    typedef vector9_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9
+    >
+struct vector10_c
+    : vector10<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 > 
+ >
+{
+    typedef vector10_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20.hpp
new file mode 100644
index 0000000..eb92a78
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20.hpp
@@ -0,0 +1,1804 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector11
+{
+    typedef aux::vector_tag<11> tag;
+    typedef vector11 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    
+
+    typedef void_ item11;
+    typedef T10 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,11 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<10> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector11<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector10<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<10> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector11<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector10<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<11>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item11 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<11> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+        : long_<11>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<11> >
+    : size_impl< aux::vector_tag<11> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector12
+{
+    typedef aux::vector_tag<12> tag;
+    typedef vector12 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    
+
+    typedef void_ item12;
+    typedef T11 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,12 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<11> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector12<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector11<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<11> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector12<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector11<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<12>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item12 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<12> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+        : long_<12>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<12> >
+    : size_impl< aux::vector_tag<12> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector13
+{
+    typedef aux::vector_tag<13> tag;
+    typedef vector13 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    
+
+    typedef void_ item13;
+    typedef T12 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,13 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<12> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector13<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector12<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<12> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector13<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector12<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<13>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item13 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<13> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+        : long_<13>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<13> >
+    : size_impl< aux::vector_tag<13> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector14
+{
+    typedef aux::vector_tag<14> tag;
+    typedef vector14 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    
+
+    typedef void_ item14;
+    typedef T13 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,14 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<13> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector14<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector13<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<13> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector14<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector13<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<14>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item14 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<14> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+        : long_<14>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<14> >
+    : size_impl< aux::vector_tag<14> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector15
+{
+    typedef aux::vector_tag<15> tag;
+    typedef vector15 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    
+
+    typedef void_ item15;
+    typedef T14 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,15 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<14> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector15<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector14<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<14> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector15<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector14<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<15>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item15 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<15> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+        : long_<15>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<15> >
+    : size_impl< aux::vector_tag<15> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector16
+{
+    typedef aux::vector_tag<16> tag;
+    typedef vector16 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    
+
+    typedef void_ item16;
+    typedef T15 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,16 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<15> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector16<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector15<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<15> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector16<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector15<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<16>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item16 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<16> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+        : long_<16>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<16> >
+    : size_impl< aux::vector_tag<16> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector17
+{
+    typedef aux::vector_tag<17> tag;
+    typedef vector17 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    
+
+    typedef void_ item17;
+    typedef T16 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,17 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<16> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector17<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector16<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<16> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector17<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector16<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<17>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item17 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<17> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+        : long_<17>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<17> >
+    : size_impl< aux::vector_tag<17> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector18
+{
+    typedef aux::vector_tag<18> tag;
+    typedef vector18 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    
+
+    typedef void_ item18;
+    typedef T17 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,18 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<17> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector18<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector17<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<17> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector18<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector17<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<18>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item18 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<18> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+        : long_<18>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<18> >
+    : size_impl< aux::vector_tag<18> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector19
+{
+    typedef aux::vector_tag<19> tag;
+    typedef vector19 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    
+
+    typedef void_ item19;
+    typedef T18 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,19 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<18> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector19<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector18<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<18> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector19<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector18<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<19>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item19 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<19> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+        : long_<19>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<19> >
+    : size_impl< aux::vector_tag<19> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector20
+{
+    typedef aux::vector_tag<20> tag;
+    typedef vector20 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    
+
+    typedef void_ item20;
+    typedef T19 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,20 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<19> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector20<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector19<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<19> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector20<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector19<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<20>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item20 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<20> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+        : long_<20>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<20> >
+    : size_impl< aux::vector_tag<20> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20_c.hpp
new file mode 100644
index 0000000..56ca53f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20_c.hpp
@@ -0,0 +1,195 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    >
+struct vector11_c
+    : vector11<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >, integral_c<T
+        , C10> 
+ >
+{
+    typedef vector11_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11
+    >
+struct vector12_c
+    : vector12<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 > 
+ >
+{
+    typedef vector12_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12
+    >
+struct vector13_c
+    : vector13<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 > 
+ >
+{
+    typedef vector13_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13
+    >
+struct vector14_c
+    : vector14<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >, integral_c<T
+        , C13> 
+ >
+{
+    typedef vector14_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14
+    >
+struct vector15_c
+    : vector15<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 > 
+ >
+{
+    typedef vector15_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15
+    >
+struct vector16_c
+    : vector16<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 > 
+ >
+{
+    typedef vector16_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16
+    >
+struct vector17_c
+    : vector17<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >, integral_c<T
+        , C16> 
+ >
+{
+    typedef vector17_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17
+    >
+struct vector18_c
+    : vector18<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 > 
+ >
+{
+    typedef vector18_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18
+    >
+struct vector19_c
+    : vector19<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 > 
+ >
+{
+    typedef vector19_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19
+    >
+struct vector20_c
+    : vector20<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >, integral_c<T
+        , C19> 
+ >
+{
+    typedef vector20_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30.hpp
new file mode 100644
index 0000000..a685019
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30.hpp
@@ -0,0 +1,2124 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20
+    >
+struct vector21
+{
+    typedef aux::vector_tag<21> tag;
+    typedef vector21 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    
+
+    typedef void_ item21;
+    typedef T20 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,21 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<20> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector21<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector20<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<20> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector21<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector20<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<21>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item21 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<21> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+        : long_<21>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<21> >
+    : size_impl< aux::vector_tag<21> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21
+    >
+struct vector22
+{
+    typedef aux::vector_tag<22> tag;
+    typedef vector22 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    
+
+    typedef void_ item22;
+    typedef T21 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,22 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<21> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector22<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector21<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<21> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector22<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector21<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<22>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item22 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<22> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+        : long_<22>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<22> >
+    : size_impl< aux::vector_tag<22> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22
+    >
+struct vector23
+{
+    typedef aux::vector_tag<23> tag;
+    typedef vector23 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    
+
+    typedef void_ item23;
+    typedef T22 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,23 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<22> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector23<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector22<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<22> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector23<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector22<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<23>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item23 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<23> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+        : long_<23>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<23> >
+    : size_impl< aux::vector_tag<23> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23
+    >
+struct vector24
+{
+    typedef aux::vector_tag<24> tag;
+    typedef vector24 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    
+
+    typedef void_ item24;
+    typedef T23 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,24 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<23> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector24<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector23<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<23> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector24<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector23<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<24>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item24 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<24> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+        : long_<24>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<24> >
+    : size_impl< aux::vector_tag<24> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    >
+struct vector25
+{
+    typedef aux::vector_tag<25> tag;
+    typedef vector25 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    
+
+    typedef void_ item25;
+    typedef T24 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,25 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<24> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector25<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector24<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<24> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector25<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector24<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<25>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item25 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<25> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+        : long_<25>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<25> >
+    : size_impl< aux::vector_tag<25> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25
+    >
+struct vector26
+{
+    typedef aux::vector_tag<26> tag;
+    typedef vector26 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    
+
+    typedef void_ item26;
+    typedef T25 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,26 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<25> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector26<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector25<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<25> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector26<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector25<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<26>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item26 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<26> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+        : long_<26>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<26> >
+    : size_impl< aux::vector_tag<26> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26
+    >
+struct vector27
+{
+    typedef aux::vector_tag<27> tag;
+    typedef vector27 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    
+
+    typedef void_ item27;
+    typedef T26 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,27 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<26> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector27<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector26<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<26> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector27<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector26<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<27>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item27 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<27> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+        : long_<27>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<27> >
+    : size_impl< aux::vector_tag<27> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27
+    >
+struct vector28
+{
+    typedef aux::vector_tag<28> tag;
+    typedef vector28 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    
+
+    typedef void_ item28;
+    typedef T27 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,28 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<27> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector28<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector27<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<27> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector28<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector27<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<28>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item28 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<28> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+        : long_<28>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<28> >
+    : size_impl< aux::vector_tag<28> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28
+    >
+struct vector29
+{
+    typedef aux::vector_tag<29> tag;
+    typedef vector29 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    
+
+    typedef void_ item29;
+    typedef T28 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,29 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<28> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector29<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector28<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<28> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector29<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector28<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<29>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item29 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<29> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+        : long_<29>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<29> >
+    : size_impl< aux::vector_tag<29> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    >
+struct vector30
+{
+    typedef aux::vector_tag<30> tag;
+    typedef vector30 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    
+
+    typedef void_ item30;
+    typedef T29 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,30 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<29> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector30<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector29<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<29> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector30<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector29<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<30>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item30 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<30> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+        : long_<30>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<30> >
+    : size_impl< aux::vector_tag<30> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30_c.hpp
new file mode 100644
index 0000000..6251dbc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30_c.hpp
@@ -0,0 +1,238 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    >
+struct vector21_c
+    : vector21<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 > 
+ >
+{
+    typedef vector21_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21
+    >
+struct vector22_c
+    : vector22<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 > 
+ >
+{
+    typedef vector22_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22
+    >
+struct vector23_c
+    : vector23<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >, integral_c<T
+        , C22> 
+ >
+{
+    typedef vector23_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23
+    >
+struct vector24_c
+    : vector24<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 > 
+ >
+{
+    typedef vector24_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24
+    >
+struct vector25_c
+    : vector25<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 > 
+ >
+{
+    typedef vector25_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25
+    >
+struct vector26_c
+    : vector26<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >, integral_c<T
+        , C25> 
+ >
+{
+    typedef vector26_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26
+    >
+struct vector27_c
+    : vector27<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 > 
+ >
+{
+    typedef vector27_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27
+    >
+struct vector28_c
+    : vector28<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 > 
+ >
+{
+    typedef vector28_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28
+    >
+struct vector29_c
+    : vector29<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >, integral_c<T
+        , C28> 
+ >
+{
+    typedef vector29_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29
+    >
+struct vector30_c
+    : vector30<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 > 
+ >
+{
+    typedef vector30_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40.hpp
new file mode 100644
index 0000000..1ed648a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40.hpp
@@ -0,0 +1,2444 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30
+    >
+struct vector31
+{
+    typedef aux::vector_tag<31> tag;
+    typedef vector31 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    
+
+    typedef void_ item31;
+    typedef T30 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,31 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<30> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector31<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector30<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<30> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector31<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector30<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<31>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item31 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<31> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+        : long_<31>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<31> >
+    : size_impl< aux::vector_tag<31> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31
+    >
+struct vector32
+{
+    typedef aux::vector_tag<32> tag;
+    typedef vector32 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    
+
+    typedef void_ item32;
+    typedef T31 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,32 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<31> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector32<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector31<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<31> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector32<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector31<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<32>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item32 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<32> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+        : long_<32>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<32> >
+    : size_impl< aux::vector_tag<32> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32
+    >
+struct vector33
+{
+    typedef aux::vector_tag<33> tag;
+    typedef vector33 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    
+
+    typedef void_ item33;
+    typedef T32 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,33 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<32> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector33<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector32<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<32> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector33<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector32<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<33>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item33 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<33> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+        : long_<33>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<33> >
+    : size_impl< aux::vector_tag<33> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33
+    >
+struct vector34
+{
+    typedef aux::vector_tag<34> tag;
+    typedef vector34 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    
+
+    typedef void_ item34;
+    typedef T33 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,34 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<33> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector34<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector33<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<33> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector34<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector33<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<34>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item34 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<34> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+        : long_<34>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<34> >
+    : size_impl< aux::vector_tag<34> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    >
+struct vector35
+{
+    typedef aux::vector_tag<35> tag;
+    typedef vector35 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    
+
+    typedef void_ item35;
+    typedef T34 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,35 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<34> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector35<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector34<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<34> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector35<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector34<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<35>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item35 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<35> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+        : long_<35>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<35> >
+    : size_impl< aux::vector_tag<35> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35
+    >
+struct vector36
+{
+    typedef aux::vector_tag<36> tag;
+    typedef vector36 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    
+
+    typedef void_ item36;
+    typedef T35 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,36 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<35> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector36<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector35<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<35> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector36<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector35<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<36>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item36 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<36> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+        : long_<36>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<36> >
+    : size_impl< aux::vector_tag<36> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36
+    >
+struct vector37
+{
+    typedef aux::vector_tag<37> tag;
+    typedef vector37 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    
+
+    typedef void_ item37;
+    typedef T36 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,37 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<36> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector37<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector36<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<36> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector37<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector36<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<37>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item37 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<37> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+        : long_<37>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<37> >
+    : size_impl< aux::vector_tag<37> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37
+    >
+struct vector38
+{
+    typedef aux::vector_tag<38> tag;
+    typedef vector38 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    
+
+    typedef void_ item38;
+    typedef T37 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,38 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<37> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector38<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector37<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<37> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector38<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector37<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<38>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item38 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<38> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+        : long_<38>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<38> >
+    : size_impl< aux::vector_tag<38> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38
+    >
+struct vector39
+{
+    typedef aux::vector_tag<39> tag;
+    typedef vector39 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    
+
+    typedef void_ item39;
+    typedef T38 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,39 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<38> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector39<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector38<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<38> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector39<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector38<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<39>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item39 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<39> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+        : long_<39>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<39> >
+    : size_impl< aux::vector_tag<39> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    >
+struct vector40
+{
+    typedef aux::vector_tag<40> tag;
+    typedef vector40 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    
+
+    typedef void_ item40;
+    typedef T39 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,40 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<39> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector40<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector39<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<39> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector40<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector39<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<40>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item40 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<40> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+        : long_<40>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<40> >
+    : size_impl< aux::vector_tag<40> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40_c.hpp
new file mode 100644
index 0000000..ba0ffa8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40_c.hpp
@@ -0,0 +1,281 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    >
+struct vector31_c
+    : vector31<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 > 
+ >
+{
+    typedef vector31_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31
+    >
+struct vector32_c
+    : vector32<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >, integral_c<T
+        , C31> 
+ >
+{
+    typedef vector32_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32
+    >
+struct vector33_c
+    : vector33<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 > 
+ >
+{
+    typedef vector33_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33
+    >
+struct vector34_c
+    : vector34<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 > 
+ >
+{
+    typedef vector34_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34
+    >
+struct vector35_c
+    : vector35<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >, integral_c<T
+        , C34> 
+ >
+{
+    typedef vector35_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35
+    >
+struct vector36_c
+    : vector36<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 > 
+ >
+{
+    typedef vector36_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36
+    >
+struct vector37_c
+    : vector37<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 > 
+ >
+{
+    typedef vector37_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37
+    >
+struct vector38_c
+    : vector38<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >, integral_c<T
+        , C37> 
+ >
+{
+    typedef vector38_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38
+    >
+struct vector39_c
+    : vector39<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 > 
+ >
+{
+    typedef vector39_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39
+    >
+struct vector40_c
+    : vector40<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 > 
+ >
+{
+    typedef vector40_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50.hpp
new file mode 100644
index 0000000..3da323a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50.hpp
@@ -0,0 +1,2764 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40
+    >
+struct vector41
+{
+    typedef aux::vector_tag<41> tag;
+    typedef vector41 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    
+
+    typedef void_ item41;
+    typedef T40 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,41 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<40> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector41<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector40<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<40> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector41<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector40<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<41>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item41 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<41> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+        : long_<41>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<41> >
+    : size_impl< aux::vector_tag<41> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41
+    >
+struct vector42
+{
+    typedef aux::vector_tag<42> tag;
+    typedef vector42 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    
+
+    typedef void_ item42;
+    typedef T41 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,42 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<41> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector42<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector41<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<41> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector42<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector41<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<42>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item42 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<42> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+        : long_<42>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<42> >
+    : size_impl< aux::vector_tag<42> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42
+    >
+struct vector43
+{
+    typedef aux::vector_tag<43> tag;
+    typedef vector43 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    
+
+    typedef void_ item43;
+    typedef T42 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,43 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<42> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector43<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector42<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<42> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector43<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector42<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<43>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item43 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<43> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+        : long_<43>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<43> >
+    : size_impl< aux::vector_tag<43> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43
+    >
+struct vector44
+{
+    typedef aux::vector_tag<44> tag;
+    typedef vector44 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    
+
+    typedef void_ item44;
+    typedef T43 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,44 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<43> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector44<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector43<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<43> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector44<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector43<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<44>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item44 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<44> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+        : long_<44>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<44> >
+    : size_impl< aux::vector_tag<44> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    >
+struct vector45
+{
+    typedef aux::vector_tag<45> tag;
+    typedef vector45 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    
+
+    typedef void_ item45;
+    typedef T44 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,45 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<44> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector45<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector44<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<44> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector45<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector44<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<45>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item45 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<45> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+        : long_<45>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<45> >
+    : size_impl< aux::vector_tag<45> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45
+    >
+struct vector46
+{
+    typedef aux::vector_tag<46> tag;
+    typedef vector46 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    
+
+    typedef void_ item46;
+    typedef T45 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,46 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<45> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector46<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector45<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<45> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector46<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector45<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<46>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item46 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<46> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+        : long_<46>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<46> >
+    : size_impl< aux::vector_tag<46> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46
+    >
+struct vector47
+{
+    typedef aux::vector_tag<47> tag;
+    typedef vector47 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    
+
+    typedef void_ item47;
+    typedef T46 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,47 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<46> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector47<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector46<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<46> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector47<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector46<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<47>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item47 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<47> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+        : long_<47>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<47> >
+    : size_impl< aux::vector_tag<47> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47
+    >
+struct vector48
+{
+    typedef aux::vector_tag<48> tag;
+    typedef vector48 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    
+
+    typedef void_ item48;
+    typedef T47 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,48 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<47> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector48<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector47<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<47> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector48<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector47<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<48>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item48 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<48> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+        : long_<48>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<48> >
+    : size_impl< aux::vector_tag<48> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48
+    >
+struct vector49
+{
+    typedef aux::vector_tag<49> tag;
+    typedef vector49 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    typedef T48 item48;
+    
+
+    typedef void_ item49;
+    typedef T48 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,49 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<48> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector49<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector48<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47, typename Vector::item48
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<48> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector49<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector48<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<49>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item49 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<49> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+        : long_<49>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<49> >
+    : size_impl< aux::vector_tag<49> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48, typename T49
+    >
+struct vector50
+{
+    typedef aux::vector_tag<50> tag;
+    typedef vector50 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    typedef T48 item48;
+    typedef T49 item49;
+    
+
+    typedef void_ item50;
+    typedef T49 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,50 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<49> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector50<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector49<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47, typename Vector::item48
+            , typename Vector::item49
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<49> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector50<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector49<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+            > type;
+    };
+};
+
+namespace aux {
+template<> struct v_at_impl<50>
+{
+    template< typename V_ > struct result_
+    {
+        typedef typename V_::item50 type;
+    };
+};
+
+}
+
+template<>
+struct at_impl< aux::vector_tag<50> >
+{
+    template< typename V_, typename N > struct apply
+    {
+        typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
+            ::template result_<V_>::type type;
+    };
+};
+
+template<>
+struct front_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::item0 type;
+    };
+};
+
+template<>
+struct back_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef typename Vector::back type;
+    };
+};
+
+template<>
+struct empty_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+        : false_
+    {
+    };
+};
+
+template<>
+struct size_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+        : long_<50>
+    {
+    };
+};
+
+template<>
+struct O1_size_impl< aux::vector_tag<50> >
+    : size_impl< aux::vector_tag<50> >
+{
+};
+
+template<>
+struct clear_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<> type;
+    };
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50_c.hpp
new file mode 100644
index 0000000..e07f2b3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50_c.hpp
@@ -0,0 +1,325 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    >
+struct vector41_c
+    : vector41<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >, integral_c<T
+        , C40> 
+ >
+{
+    typedef vector41_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41
+    >
+struct vector42_c
+    : vector42<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 > 
+ >
+{
+    typedef vector42_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42
+    >
+struct vector43_c
+    : vector43<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 > 
+ >
+{
+    typedef vector43_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43
+    >
+struct vector44_c
+    : vector44<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >, integral_c<T
+        , C43> 
+ >
+{
+    typedef vector44_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44
+    >
+struct vector45_c
+    : vector45<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 > 
+ >
+{
+    typedef vector45_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45
+    >
+struct vector46_c
+    : vector46<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 > 
+ >
+{
+    typedef vector46_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46
+    >
+struct vector47_c
+    : vector47<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >, integral_c<T
+        , C46> 
+ >
+{
+    typedef vector47_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47
+    >
+struct vector48_c
+    : vector48<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 > 
+ >
+{
+    typedef vector48_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48
+    >
+struct vector49_c
+    : vector49<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 >, integral_c< T,C48 > 
+ >
+{
+    typedef vector49_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49
+    >
+struct vector50_c
+    : vector50<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 >, integral_c< T,C48 >, integral_c<T
+        , C49> 
+ >
+{
+    typedef vector50_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp
new file mode 100644
index 0000000..88bbd3b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp
@@ -0,0 +1,829 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template< typename V >
+struct v_at< V,0 >
+{
+    typedef typename V::item0 type;
+};
+
+template<
+      typename T0
+    >
+struct vector1
+{
+    typedef aux::vector_tag<1> tag;
+    typedef vector1 type;
+    typedef T0 item0;
+    typedef void_ item1;
+    typedef T0 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,1 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<0> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector1<
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<
+             
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<0> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector1<
+             
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<1> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector0<
+             
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,1 >
+{
+    typedef typename V::item1 type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector2
+{
+    typedef aux::vector_tag<2> tag;
+    typedef vector2 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    
+
+    typedef void_ item2;
+    typedef T1 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,2 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<1> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector2<
+              T
+              ,
+              typename Vector::item0
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector1<
+              typename Vector::item1
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<1> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector2<
+              typename Vector::item0
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<2> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector1<
+              typename Vector::item0
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,2 >
+{
+    typedef typename V::item2 type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector3
+{
+    typedef aux::vector_tag<3> tag;
+    typedef vector3 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    
+
+    typedef void_ item3;
+    typedef T2 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,3 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<2> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector3<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector2<
+              typename Vector::item1, typename Vector::item2
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<2> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector3<
+              typename Vector::item0, typename Vector::item1
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<3> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector2<
+              typename Vector::item0, typename Vector::item1
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,3 >
+{
+    typedef typename V::item3 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector4
+{
+    typedef aux::vector_tag<4> tag;
+    typedef vector4 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    
+
+    typedef void_ item4;
+    typedef T3 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,4 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<3> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector4<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector3<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<3> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector4<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<4> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector3<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,4 >
+{
+    typedef typename V::item4 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector5
+{
+    typedef aux::vector_tag<5> tag;
+    typedef vector5 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    
+
+    typedef void_ item5;
+    typedef T4 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,5 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<4> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector5<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector4<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<4> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector5<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<5> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector4<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,5 >
+{
+    typedef typename V::item5 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector6
+{
+    typedef aux::vector_tag<6> tag;
+    typedef vector6 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    
+
+    typedef void_ item6;
+    typedef T5 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,6 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<5> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector6<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector5<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<5> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector6<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<6> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector5<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,6 >
+{
+    typedef typename V::item6 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector7
+{
+    typedef aux::vector_tag<7> tag;
+    typedef vector7 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    
+
+    typedef void_ item7;
+    typedef T6 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,7 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<6> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector7<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector6<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<6> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector7<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<7> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector6<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,7 >
+{
+    typedef typename V::item7 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector8
+{
+    typedef aux::vector_tag<8> tag;
+    typedef vector8 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    
+
+    typedef void_ item8;
+    typedef T7 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,8 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<7> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector8<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector7<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<7> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector8<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<8> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector7<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,8 >
+{
+    typedef typename V::item8 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector9
+{
+    typedef aux::vector_tag<9> tag;
+    typedef vector9 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    
+
+    typedef void_ item9;
+    typedef T8 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,9 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<8> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector9<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector8<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<8> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector9<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<9> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector8<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,9 >
+{
+    typedef typename V::item9 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector10
+{
+    typedef aux::vector_tag<10> tag;
+    typedef vector10 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    
+
+    typedef void_ item10;
+    typedef T9 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,10 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<9> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector10<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector9<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<9> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector10<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<10> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector9<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,10 >
+{
+    typedef typename V::item10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10_c.hpp
new file mode 100644
index 0000000..8b36f6a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector10_c.hpp
@@ -0,0 +1,149 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0
+    >
+struct vector1_c
+    : vector1< integral_c< T,C0 > >
+{
+    typedef vector1_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1
+    >
+struct vector2_c
+    : vector2< integral_c< T,C0 >, integral_c< T,C1 > >
+{
+    typedef vector2_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2
+    >
+struct vector3_c
+    : vector3< integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 > >
+{
+    typedef vector3_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3
+    >
+struct vector4_c
+    : vector4<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >, integral_c<T
+        , C3> 
+ >
+{
+    typedef vector4_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4
+    >
+struct vector5_c
+    : vector5<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 > 
+ >
+{
+    typedef vector5_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5
+    >
+struct vector6_c
+    : vector6<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 > 
+ >
+{
+    typedef vector6_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6
+    >
+struct vector7_c
+    : vector7<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c<T
+        , C6> 
+ >
+{
+    typedef vector7_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7
+    >
+struct vector8_c
+    : vector8<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 > 
+ >
+{
+    typedef vector8_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8
+    >
+struct vector9_c
+    : vector9<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 > 
+ >
+{
+    typedef vector9_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9
+    >
+struct vector10_c
+    : vector10<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 > 
+ >
+{
+    typedef vector10_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp
new file mode 100644
index 0000000..8c6c8bb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp
@@ -0,0 +1,1144 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector11
+{
+    typedef aux::vector_tag<11> tag;
+    typedef vector11 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    
+
+    typedef void_ item11;
+    typedef T10 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,11 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<10> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector11<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector10<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<10> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector11<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<11> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector10<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,11 >
+{
+    typedef typename V::item11 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector12
+{
+    typedef aux::vector_tag<12> tag;
+    typedef vector12 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    
+
+    typedef void_ item12;
+    typedef T11 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,12 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<11> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector12<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector11<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<11> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector12<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<12> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector11<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,12 >
+{
+    typedef typename V::item12 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector13
+{
+    typedef aux::vector_tag<13> tag;
+    typedef vector13 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    
+
+    typedef void_ item13;
+    typedef T12 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,13 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<12> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector13<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector12<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<12> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector13<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<13> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector12<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,13 >
+{
+    typedef typename V::item13 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector14
+{
+    typedef aux::vector_tag<14> tag;
+    typedef vector14 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    
+
+    typedef void_ item14;
+    typedef T13 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,14 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<13> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector14<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector13<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<13> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector14<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<14> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector13<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,14 >
+{
+    typedef typename V::item14 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector15
+{
+    typedef aux::vector_tag<15> tag;
+    typedef vector15 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    
+
+    typedef void_ item15;
+    typedef T14 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,15 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<14> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector15<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector14<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<14> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector15<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<15> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector14<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,15 >
+{
+    typedef typename V::item15 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector16
+{
+    typedef aux::vector_tag<16> tag;
+    typedef vector16 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    
+
+    typedef void_ item16;
+    typedef T15 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,16 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<15> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector16<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector15<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<15> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector16<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<16> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector15<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,16 >
+{
+    typedef typename V::item16 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector17
+{
+    typedef aux::vector_tag<17> tag;
+    typedef vector17 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    
+
+    typedef void_ item17;
+    typedef T16 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,17 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<16> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector17<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector16<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<16> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector17<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<17> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector16<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,17 >
+{
+    typedef typename V::item17 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector18
+{
+    typedef aux::vector_tag<18> tag;
+    typedef vector18 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    
+
+    typedef void_ item18;
+    typedef T17 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,18 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<17> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector18<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector17<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<17> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector18<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<18> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector17<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,18 >
+{
+    typedef typename V::item18 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector19
+{
+    typedef aux::vector_tag<19> tag;
+    typedef vector19 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    
+
+    typedef void_ item19;
+    typedef T18 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,19 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<18> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector19<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector18<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<18> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector19<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<19> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector18<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,19 >
+{
+    typedef typename V::item19 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector20
+{
+    typedef aux::vector_tag<20> tag;
+    typedef vector20 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    
+
+    typedef void_ item20;
+    typedef T19 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,20 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<19> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector20<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector19<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<19> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector20<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<20> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector19<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,20 >
+{
+    typedef typename V::item20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20_c.hpp
new file mode 100644
index 0000000..56ca53f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector20_c.hpp
@@ -0,0 +1,195 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    >
+struct vector11_c
+    : vector11<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >, integral_c<T
+        , C10> 
+ >
+{
+    typedef vector11_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11
+    >
+struct vector12_c
+    : vector12<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 > 
+ >
+{
+    typedef vector12_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12
+    >
+struct vector13_c
+    : vector13<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 > 
+ >
+{
+    typedef vector13_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13
+    >
+struct vector14_c
+    : vector14<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >, integral_c<T
+        , C13> 
+ >
+{
+    typedef vector14_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14
+    >
+struct vector15_c
+    : vector15<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 > 
+ >
+{
+    typedef vector15_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15
+    >
+struct vector16_c
+    : vector16<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 > 
+ >
+{
+    typedef vector16_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16
+    >
+struct vector17_c
+    : vector17<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >, integral_c<T
+        , C16> 
+ >
+{
+    typedef vector17_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17
+    >
+struct vector18_c
+    : vector18<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 > 
+ >
+{
+    typedef vector18_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18
+    >
+struct vector19_c
+    : vector19<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 > 
+ >
+{
+    typedef vector19_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19
+    >
+struct vector20_c
+    : vector20<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >, integral_c<T
+        , C19> 
+ >
+{
+    typedef vector20_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30.hpp
new file mode 100644
index 0000000..b7da8e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30.hpp
@@ -0,0 +1,1464 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20
+    >
+struct vector21
+{
+    typedef aux::vector_tag<21> tag;
+    typedef vector21 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    
+
+    typedef void_ item21;
+    typedef T20 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,21 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<20> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector21<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector20<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<20> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector21<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<21> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector20<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,21 >
+{
+    typedef typename V::item21 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21
+    >
+struct vector22
+{
+    typedef aux::vector_tag<22> tag;
+    typedef vector22 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    
+
+    typedef void_ item22;
+    typedef T21 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,22 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<21> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector22<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector21<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<21> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector22<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<22> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector21<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,22 >
+{
+    typedef typename V::item22 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22
+    >
+struct vector23
+{
+    typedef aux::vector_tag<23> tag;
+    typedef vector23 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    
+
+    typedef void_ item23;
+    typedef T22 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,23 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<22> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector23<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector22<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<22> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector23<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<23> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector22<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,23 >
+{
+    typedef typename V::item23 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23
+    >
+struct vector24
+{
+    typedef aux::vector_tag<24> tag;
+    typedef vector24 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    
+
+    typedef void_ item24;
+    typedef T23 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,24 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<23> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector24<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector23<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<23> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector24<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<24> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector23<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,24 >
+{
+    typedef typename V::item24 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    >
+struct vector25
+{
+    typedef aux::vector_tag<25> tag;
+    typedef vector25 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    
+
+    typedef void_ item25;
+    typedef T24 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,25 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<24> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector25<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector24<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<24> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector25<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<25> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector24<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,25 >
+{
+    typedef typename V::item25 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25
+    >
+struct vector26
+{
+    typedef aux::vector_tag<26> tag;
+    typedef vector26 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    
+
+    typedef void_ item26;
+    typedef T25 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,26 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<25> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector26<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector25<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<25> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector26<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<26> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector25<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,26 >
+{
+    typedef typename V::item26 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26
+    >
+struct vector27
+{
+    typedef aux::vector_tag<27> tag;
+    typedef vector27 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    
+
+    typedef void_ item27;
+    typedef T26 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,27 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<26> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector27<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector26<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<26> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector27<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<27> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector26<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,27 >
+{
+    typedef typename V::item27 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27
+    >
+struct vector28
+{
+    typedef aux::vector_tag<28> tag;
+    typedef vector28 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    
+
+    typedef void_ item28;
+    typedef T27 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,28 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<27> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector28<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector27<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<27> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector28<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<28> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector27<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,28 >
+{
+    typedef typename V::item28 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28
+    >
+struct vector29
+{
+    typedef aux::vector_tag<29> tag;
+    typedef vector29 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    
+
+    typedef void_ item29;
+    typedef T28 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,29 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<28> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector29<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector28<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<28> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector29<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<29> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector28<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,29 >
+{
+    typedef typename V::item29 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    >
+struct vector30
+{
+    typedef aux::vector_tag<30> tag;
+    typedef vector30 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    
+
+    typedef void_ item30;
+    typedef T29 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,30 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<29> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector30<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector29<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<29> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector30<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<30> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector29<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,30 >
+{
+    typedef typename V::item30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30_c.hpp
new file mode 100644
index 0000000..6251dbc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector30_c.hpp
@@ -0,0 +1,238 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    >
+struct vector21_c
+    : vector21<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 > 
+ >
+{
+    typedef vector21_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21
+    >
+struct vector22_c
+    : vector22<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 > 
+ >
+{
+    typedef vector22_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22
+    >
+struct vector23_c
+    : vector23<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >, integral_c<T
+        , C22> 
+ >
+{
+    typedef vector23_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23
+    >
+struct vector24_c
+    : vector24<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 > 
+ >
+{
+    typedef vector24_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24
+    >
+struct vector25_c
+    : vector25<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 > 
+ >
+{
+    typedef vector25_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25
+    >
+struct vector26_c
+    : vector26<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >, integral_c<T
+        , C25> 
+ >
+{
+    typedef vector26_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26
+    >
+struct vector27_c
+    : vector27<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 > 
+ >
+{
+    typedef vector27_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27
+    >
+struct vector28_c
+    : vector28<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 > 
+ >
+{
+    typedef vector28_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28
+    >
+struct vector29_c
+    : vector29<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >, integral_c<T
+        , C28> 
+ >
+{
+    typedef vector29_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29
+    >
+struct vector30_c
+    : vector30<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 > 
+ >
+{
+    typedef vector30_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40.hpp
new file mode 100644
index 0000000..7487be4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40.hpp
@@ -0,0 +1,1784 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30
+    >
+struct vector31
+{
+    typedef aux::vector_tag<31> tag;
+    typedef vector31 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    
+
+    typedef void_ item31;
+    typedef T30 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,31 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<30> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector31<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector30<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<30> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector31<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<31> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector30<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,31 >
+{
+    typedef typename V::item31 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31
+    >
+struct vector32
+{
+    typedef aux::vector_tag<32> tag;
+    typedef vector32 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    
+
+    typedef void_ item32;
+    typedef T31 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,32 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<31> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector32<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector31<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<31> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector32<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<32> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector31<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,32 >
+{
+    typedef typename V::item32 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32
+    >
+struct vector33
+{
+    typedef aux::vector_tag<33> tag;
+    typedef vector33 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    
+
+    typedef void_ item33;
+    typedef T32 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,33 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<32> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector33<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector32<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<32> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector33<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<33> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector32<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,33 >
+{
+    typedef typename V::item33 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33
+    >
+struct vector34
+{
+    typedef aux::vector_tag<34> tag;
+    typedef vector34 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    
+
+    typedef void_ item34;
+    typedef T33 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,34 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<33> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector34<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector33<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<33> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector34<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<34> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector33<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,34 >
+{
+    typedef typename V::item34 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    >
+struct vector35
+{
+    typedef aux::vector_tag<35> tag;
+    typedef vector35 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    
+
+    typedef void_ item35;
+    typedef T34 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,35 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<34> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector35<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector34<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<34> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector35<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<35> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector34<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,35 >
+{
+    typedef typename V::item35 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35
+    >
+struct vector36
+{
+    typedef aux::vector_tag<36> tag;
+    typedef vector36 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    
+
+    typedef void_ item36;
+    typedef T35 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,36 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<35> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector36<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector35<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<35> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector36<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<36> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector35<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,36 >
+{
+    typedef typename V::item36 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36
+    >
+struct vector37
+{
+    typedef aux::vector_tag<37> tag;
+    typedef vector37 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    
+
+    typedef void_ item37;
+    typedef T36 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,37 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<36> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector37<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector36<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<36> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector37<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<37> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector36<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,37 >
+{
+    typedef typename V::item37 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37
+    >
+struct vector38
+{
+    typedef aux::vector_tag<38> tag;
+    typedef vector38 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    
+
+    typedef void_ item38;
+    typedef T37 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,38 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<37> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector38<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector37<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<37> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector38<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<38> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector37<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,38 >
+{
+    typedef typename V::item38 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38
+    >
+struct vector39
+{
+    typedef aux::vector_tag<39> tag;
+    typedef vector39 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    
+
+    typedef void_ item39;
+    typedef T38 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,39 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<38> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector39<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector38<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<38> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector39<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<39> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector38<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,39 >
+{
+    typedef typename V::item39 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    >
+struct vector40
+{
+    typedef aux::vector_tag<40> tag;
+    typedef vector40 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    
+
+    typedef void_ item40;
+    typedef T39 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,40 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<39> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector40<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector39<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<39> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector40<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<40> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector39<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,40 >
+{
+    typedef typename V::item40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40_c.hpp
new file mode 100644
index 0000000..ba0ffa8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector40_c.hpp
@@ -0,0 +1,281 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    >
+struct vector31_c
+    : vector31<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 > 
+ >
+{
+    typedef vector31_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31
+    >
+struct vector32_c
+    : vector32<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >, integral_c<T
+        , C31> 
+ >
+{
+    typedef vector32_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32
+    >
+struct vector33_c
+    : vector33<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 > 
+ >
+{
+    typedef vector33_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33
+    >
+struct vector34_c
+    : vector34<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 > 
+ >
+{
+    typedef vector34_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34
+    >
+struct vector35_c
+    : vector35<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >, integral_c<T
+        , C34> 
+ >
+{
+    typedef vector35_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35
+    >
+struct vector36_c
+    : vector36<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 > 
+ >
+{
+    typedef vector36_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36
+    >
+struct vector37_c
+    : vector37<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 > 
+ >
+{
+    typedef vector37_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37
+    >
+struct vector38_c
+    : vector38<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >, integral_c<T
+        , C37> 
+ >
+{
+    typedef vector38_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38
+    >
+struct vector39_c
+    : vector39<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 > 
+ >
+{
+    typedef vector39_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39
+    >
+struct vector40_c
+    : vector40<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 > 
+ >
+{
+    typedef vector40_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50.hpp
new file mode 100644
index 0000000..5a4c6d7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50.hpp
@@ -0,0 +1,2104 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40
+    >
+struct vector41
+{
+    typedef aux::vector_tag<41> tag;
+    typedef vector41 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    
+
+    typedef void_ item41;
+    typedef T40 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,41 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<40> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector41<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector40<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<40> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector41<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<41> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector40<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,41 >
+{
+    typedef typename V::item41 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41
+    >
+struct vector42
+{
+    typedef aux::vector_tag<42> tag;
+    typedef vector42 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    
+
+    typedef void_ item42;
+    typedef T41 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,42 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<41> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector42<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector41<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<41> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector42<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<42> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector41<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,42 >
+{
+    typedef typename V::item42 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42
+    >
+struct vector43
+{
+    typedef aux::vector_tag<43> tag;
+    typedef vector43 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    
+
+    typedef void_ item43;
+    typedef T42 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,43 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<42> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector43<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector42<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<42> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector43<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<43> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector42<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,43 >
+{
+    typedef typename V::item43 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43
+    >
+struct vector44
+{
+    typedef aux::vector_tag<44> tag;
+    typedef vector44 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    
+
+    typedef void_ item44;
+    typedef T43 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,44 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<43> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector44<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector43<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<43> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector44<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<44> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector43<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,44 >
+{
+    typedef typename V::item44 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    >
+struct vector45
+{
+    typedef aux::vector_tag<45> tag;
+    typedef vector45 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    
+
+    typedef void_ item45;
+    typedef T44 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,45 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<44> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector45<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector44<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<44> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector45<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<45> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector44<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,45 >
+{
+    typedef typename V::item45 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45
+    >
+struct vector46
+{
+    typedef aux::vector_tag<46> tag;
+    typedef vector46 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    
+
+    typedef void_ item46;
+    typedef T45 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,46 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<45> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector46<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector45<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<45> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector46<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<46> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector45<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,46 >
+{
+    typedef typename V::item46 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46
+    >
+struct vector47
+{
+    typedef aux::vector_tag<47> tag;
+    typedef vector47 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    
+
+    typedef void_ item47;
+    typedef T46 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,47 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<46> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector47<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector46<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<46> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector47<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<47> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector46<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,47 >
+{
+    typedef typename V::item47 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47
+    >
+struct vector48
+{
+    typedef aux::vector_tag<48> tag;
+    typedef vector48 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    
+
+    typedef void_ item48;
+    typedef T47 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,48 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<47> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector48<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector47<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<47> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector48<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<48> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector47<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,48 >
+{
+    typedef typename V::item48 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48
+    >
+struct vector49
+{
+    typedef aux::vector_tag<49> tag;
+    typedef vector49 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    typedef T48 item48;
+    
+
+    typedef void_ item49;
+    typedef T48 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,49 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<48> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector49<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector48<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47, typename Vector::item48
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<48> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector49<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<49> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector48<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,49 >
+{
+    typedef typename V::item49 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48, typename T49
+    >
+struct vector50
+{
+    typedef aux::vector_tag<50> tag;
+    typedef vector50 type;
+    typedef T0 item0;
+    typedef T1 item1;
+    typedef T2 item2;
+    typedef T3 item3;
+    typedef T4 item4;
+    typedef T5 item5;
+    typedef T6 item6;
+    typedef T7 item7;
+    typedef T8 item8;
+    typedef T9 item9;
+    typedef T10 item10;
+    typedef T11 item11;
+    typedef T12 item12;
+    typedef T13 item13;
+    typedef T14 item14;
+    typedef T15 item15;
+    typedef T16 item16;
+    typedef T17 item17;
+    typedef T18 item18;
+    typedef T19 item19;
+    typedef T20 item20;
+    typedef T21 item21;
+    typedef T22 item22;
+    typedef T23 item23;
+    typedef T24 item24;
+    typedef T25 item25;
+    typedef T26 item26;
+    typedef T27 item27;
+    typedef T28 item28;
+    typedef T29 item29;
+    typedef T30 item30;
+    typedef T31 item31;
+    typedef T32 item32;
+    typedef T33 item33;
+    typedef T34 item34;
+    typedef T35 item35;
+    typedef T36 item36;
+    typedef T37 item37;
+    typedef T38 item38;
+    typedef T39 item39;
+    typedef T40 item40;
+    typedef T41 item41;
+    typedef T42 item42;
+    typedef T43 item43;
+    typedef T44 item44;
+    typedef T45 item45;
+    typedef T46 item46;
+    typedef T47 item47;
+    typedef T48 item48;
+    typedef T49 item49;
+    
+
+    typedef void_ item50;
+    typedef T49 back;
+    typedef v_iter< type,0 > begin;
+    typedef v_iter< type,50 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<49> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector50<
+              T
+              ,
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+            > type;
+    };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector49<
+              typename Vector::item1, typename Vector::item2
+            , typename Vector::item3, typename Vector::item4
+            , typename Vector::item5, typename Vector::item6
+            , typename Vector::item7, typename Vector::item8
+            , typename Vector::item9, typename Vector::item10
+            , typename Vector::item11, typename Vector::item12
+            , typename Vector::item13, typename Vector::item14
+            , typename Vector::item15, typename Vector::item16
+            , typename Vector::item17, typename Vector::item18
+            , typename Vector::item19, typename Vector::item20
+            , typename Vector::item21, typename Vector::item22
+            , typename Vector::item23, typename Vector::item24
+            , typename Vector::item25, typename Vector::item26
+            , typename Vector::item27, typename Vector::item28
+            , typename Vector::item29, typename Vector::item30
+            , typename Vector::item31, typename Vector::item32
+            , typename Vector::item33, typename Vector::item34
+            , typename Vector::item35, typename Vector::item36
+            , typename Vector::item37, typename Vector::item38
+            , typename Vector::item39, typename Vector::item40
+            , typename Vector::item41, typename Vector::item42
+            , typename Vector::item43, typename Vector::item44
+            , typename Vector::item45, typename Vector::item46
+            , typename Vector::item47, typename Vector::item48
+            , typename Vector::item49
+            > type;
+    };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<49> >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef vector50<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+              ,
+              T
+            > type;
+    };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<50> >
+{
+    template< typename Vector > struct apply
+    {
+        typedef vector49<
+              typename Vector::item0, typename Vector::item1
+            , typename Vector::item2, typename Vector::item3
+            , typename Vector::item4, typename Vector::item5
+            , typename Vector::item6, typename Vector::item7
+            , typename Vector::item8, typename Vector::item9
+            , typename Vector::item10, typename Vector::item11
+            , typename Vector::item12, typename Vector::item13
+            , typename Vector::item14, typename Vector::item15
+            , typename Vector::item16, typename Vector::item17
+            , typename Vector::item18, typename Vector::item19
+            , typename Vector::item20, typename Vector::item21
+            , typename Vector::item22, typename Vector::item23
+            , typename Vector::item24, typename Vector::item25
+            , typename Vector::item26, typename Vector::item27
+            , typename Vector::item28, typename Vector::item29
+            , typename Vector::item30, typename Vector::item31
+            , typename Vector::item32, typename Vector::item33
+            , typename Vector::item34, typename Vector::item35
+            , typename Vector::item36, typename Vector::item37
+            , typename Vector::item38, typename Vector::item39
+            , typename Vector::item40, typename Vector::item41
+            , typename Vector::item42, typename Vector::item43
+            , typename Vector::item44, typename Vector::item45
+            , typename Vector::item46, typename Vector::item47
+            , typename Vector::item48
+            > type;
+    };
+};
+
+template< typename V >
+struct v_at< V,50 >
+{
+    typedef typename V::item50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50_c.hpp
new file mode 100644
index 0000000..e07f2b3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/plain/vector50_c.hpp
@@ -0,0 +1,325 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    >
+struct vector41_c
+    : vector41<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >, integral_c<T
+        , C40> 
+ >
+{
+    typedef vector41_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41
+    >
+struct vector42_c
+    : vector42<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 > 
+ >
+{
+    typedef vector42_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42
+    >
+struct vector43_c
+    : vector43<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 > 
+ >
+{
+    typedef vector43_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43
+    >
+struct vector44_c
+    : vector44<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >, integral_c<T
+        , C43> 
+ >
+{
+    typedef vector44_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44
+    >
+struct vector45_c
+    : vector45<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 > 
+ >
+{
+    typedef vector45_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45
+    >
+struct vector46_c
+    : vector46<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 > 
+ >
+{
+    typedef vector46_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46
+    >
+struct vector47_c
+    : vector47<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >, integral_c<T
+        , C46> 
+ >
+{
+    typedef vector47_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47
+    >
+struct vector48_c
+    : vector48<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 > 
+ >
+{
+    typedef vector48_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48
+    >
+struct vector49_c
+    : vector49<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 >, integral_c< T,C48 > 
+ >
+{
+    typedef vector49_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49
+    >
+struct vector50_c
+    : vector50<
+          integral_c< T,C0 >, integral_c< T,C1 >, integral_c< T,C2 >
+        , integral_c< T,C3 >, integral_c< T,C4 >, integral_c< T,C5 >, integral_c< T,C6 >
+        , integral_c< T,C7 >, integral_c< T,C8 >, integral_c< T,C9 >
+        , integral_c< T,C10 >, integral_c< T,C11 >, integral_c< T,C12 >
+        , integral_c< T,C13 >, integral_c< T,C14 >, integral_c< T,C15 >
+        , integral_c< T,C16 >, integral_c< T,C17 >, integral_c< T,C18 >
+        , integral_c< T,C19 >, integral_c< T,C20 >, integral_c< T,C21 >
+        , integral_c< T,C22 >, integral_c< T,C23 >, integral_c< T,C24 >
+        , integral_c< T,C25 >, integral_c< T,C26 >, integral_c< T,C27 >
+        , integral_c< T,C28 >, integral_c< T,C29 >, integral_c< T,C30 >
+        , integral_c< T,C31 >, integral_c< T,C32 >, integral_c< T,C33 >
+        , integral_c< T,C34 >, integral_c< T,C35 >, integral_c< T,C36 >
+        , integral_c< T,C37 >, integral_c< T,C38 >, integral_c< T,C39 >
+        , integral_c< T,C40 >, integral_c< T,C41 >, integral_c< T,C42 >
+        , integral_c< T,C43 >, integral_c< T,C44 >, integral_c< T,C45 >
+        , integral_c< T,C46 >, integral_c< T,C47 >, integral_c< T,C48 >, integral_c<T
+        , C49> 
+ >
+{
+    typedef vector50_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp
new file mode 100644
index 0000000..e4c6407
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp
@@ -0,0 +1,139 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0
+    >
+struct vector1
+    : v_item<
+          T0
+        , vector0<  >
+        >
+{
+    typedef vector1 type;
+};
+
+template<
+      typename T0, typename T1
+    >
+struct vector2
+    : v_item<
+          T1
+        , vector1<T0>
+        >
+{
+    typedef vector2 type;
+};
+
+template<
+      typename T0, typename T1, typename T2
+    >
+struct vector3
+    : v_item<
+          T2
+        , vector2< T0,T1 >
+        >
+{
+    typedef vector3 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3
+    >
+struct vector4
+    : v_item<
+          T3
+        , vector3< T0,T1,T2 >
+        >
+{
+    typedef vector4 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    >
+struct vector5
+    : v_item<
+          T4
+        , vector4< T0,T1,T2,T3 >
+        >
+{
+    typedef vector5 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5
+    >
+struct vector6
+    : v_item<
+          T5
+        , vector5< T0,T1,T2,T3,T4 >
+        >
+{
+    typedef vector6 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6
+    >
+struct vector7
+    : v_item<
+          T6
+        , vector6< T0,T1,T2,T3,T4,T5 >
+        >
+{
+    typedef vector7 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7
+    >
+struct vector8
+    : v_item<
+          T7
+        , vector7< T0,T1,T2,T3,T4,T5,T6 >
+        >
+{
+    typedef vector8 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8
+    >
+struct vector9
+    : v_item<
+          T8
+        , vector8< T0,T1,T2,T3,T4,T5,T6,T7 >
+        >
+{
+    typedef vector9 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    >
+struct vector10
+    : v_item<
+          T9
+        , vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >
+        >
+{
+    typedef vector10 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10_c.hpp
new file mode 100644
index 0000000..18eabc6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10_c.hpp
@@ -0,0 +1,154 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector10_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0
+    >
+struct vector1_c
+    : v_item<
+          integral_c< T,C0 >
+        , vector0_c<T>
+        >
+{
+    typedef vector1_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1
+    >
+struct vector2_c
+    : v_item<
+          integral_c< T,C1 >
+        , vector1_c< T,C0 >
+        >
+{
+    typedef vector2_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2
+    >
+struct vector3_c
+    : v_item<
+          integral_c< T,C2 >
+        , vector2_c< T,C0,C1 >
+        >
+{
+    typedef vector3_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3
+    >
+struct vector4_c
+    : v_item<
+          integral_c< T,C3 >
+        , vector3_c< T,C0,C1,C2 >
+        >
+{
+    typedef vector4_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4
+    >
+struct vector5_c
+    : v_item<
+          integral_c< T,C4 >
+        , vector4_c< T,C0,C1,C2,C3 >
+        >
+{
+    typedef vector5_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5
+    >
+struct vector6_c
+    : v_item<
+          integral_c< T,C5 >
+        , vector5_c< T,C0,C1,C2,C3,C4 >
+        >
+{
+    typedef vector6_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6
+    >
+struct vector7_c
+    : v_item<
+          integral_c< T,C6 >
+        , vector6_c< T,C0,C1,C2,C3,C4,C5 >
+        >
+{
+    typedef vector7_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7
+    >
+struct vector8_c
+    : v_item<
+          integral_c< T,C7 >
+        , vector7_c< T,C0,C1,C2,C3,C4,C5,C6 >
+        >
+{
+    typedef vector8_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8
+    >
+struct vector9_c
+    : v_item<
+          integral_c< T,C8 >
+        , vector8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >
+        >
+{
+    typedef vector9_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9
+    >
+struct vector10_c
+    : v_item<
+          integral_c< T,C9 >
+        , vector9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >
+        >
+{
+    typedef vector10_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp
new file mode 100644
index 0000000..78ccac4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp
@@ -0,0 +1,159 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10
+    >
+struct vector11
+    : v_item<
+          T10
+        , vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >
+        >
+{
+    typedef vector11 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11
+    >
+struct vector12
+    : v_item<
+          T11
+        , vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >
+        >
+{
+    typedef vector12 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12
+    >
+struct vector13
+    : v_item<
+          T12
+        , vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >
+        >
+{
+    typedef vector13 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13
+    >
+struct vector14
+    : v_item<
+          T13
+        , vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >
+        >
+{
+    typedef vector14 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    >
+struct vector15
+    : v_item<
+          T14
+        , vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >
+        >
+{
+    typedef vector15 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15
+    >
+struct vector16
+    : v_item<
+          T15
+        , vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >
+        >
+{
+    typedef vector16 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16
+    >
+struct vector17
+    : v_item<
+          T16
+        , vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >
+        >
+{
+    typedef vector17 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17
+    >
+struct vector18
+    : v_item<
+          T17
+        , vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >
+        >
+{
+    typedef vector18 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18
+    >
+struct vector19
+    : v_item<
+          T18
+        , vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >
+        >
+{
+    typedef vector19 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    >
+struct vector20
+    : v_item<
+          T19
+        , vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >
+        >
+{
+    typedef vector20 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20_c.hpp
new file mode 100644
index 0000000..4bf6742
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20_c.hpp
@@ -0,0 +1,163 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector20_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    >
+struct vector11_c
+    : v_item<
+          integral_c< T,C10 >
+        , vector10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >
+        >
+{
+    typedef vector11_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11
+    >
+struct vector12_c
+    : v_item<
+          integral_c< T,C11 >
+        , vector11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >
+        >
+{
+    typedef vector12_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12
+    >
+struct vector13_c
+    : v_item<
+          integral_c< T,C12 >
+        , vector12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >
+        >
+{
+    typedef vector13_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13
+    >
+struct vector14_c
+    : v_item<
+          integral_c< T,C13 >
+        , vector13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >
+        >
+{
+    typedef vector14_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14
+    >
+struct vector15_c
+    : v_item<
+          integral_c< T,C14 >
+        , vector14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >
+        >
+{
+    typedef vector15_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15
+    >
+struct vector16_c
+    : v_item<
+          integral_c< T,C15 >
+        , vector15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >
+        >
+{
+    typedef vector16_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16
+    >
+struct vector17_c
+    : v_item<
+          integral_c< T,C16 >
+        , vector16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >
+        >
+{
+    typedef vector17_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17
+    >
+struct vector18_c
+    : v_item<
+          integral_c< T,C17 >
+        , vector17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >
+        >
+{
+    typedef vector18_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18
+    >
+struct vector19_c
+    : v_item<
+          integral_c< T,C18 >
+        , vector18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >
+        >
+{
+    typedef vector19_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19
+    >
+struct vector20_c
+    : v_item<
+          integral_c< T,C19 >
+        , vector19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >
+        >
+{
+    typedef vector20_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30.hpp
new file mode 100644
index 0000000..c404990
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30.hpp
@@ -0,0 +1,179 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20
+    >
+struct vector21
+    : v_item<
+          T20
+        , vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >
+        >
+{
+    typedef vector21 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21
+    >
+struct vector22
+    : v_item<
+          T21
+        , vector21< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20 >
+        >
+{
+    typedef vector22 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22
+    >
+struct vector23
+    : v_item<
+          T22
+        , vector22< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21 >
+        >
+{
+    typedef vector23 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23
+    >
+struct vector24
+    : v_item<
+          T23
+        , vector23< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22 >
+        >
+{
+    typedef vector24 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    >
+struct vector25
+    : v_item<
+          T24
+        , vector24< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23 >
+        >
+{
+    typedef vector25 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25
+    >
+struct vector26
+    : v_item<
+          T25
+        , vector25< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24 >
+        >
+{
+    typedef vector26 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26
+    >
+struct vector27
+    : v_item<
+          T26
+        , vector26< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25 >
+        >
+{
+    typedef vector27 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27
+    >
+struct vector28
+    : v_item<
+          T27
+        , vector27< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26 >
+        >
+{
+    typedef vector28 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28
+    >
+struct vector29
+    : v_item<
+          T28
+        , vector28< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27 >
+        >
+{
+    typedef vector29 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    >
+struct vector30
+    : v_item<
+          T29
+        , vector29< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28 >
+        >
+{
+    typedef vector30 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30_c.hpp
new file mode 100644
index 0000000..5741bb4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30_c.hpp
@@ -0,0 +1,173 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector30_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    >
+struct vector21_c
+    : v_item<
+          integral_c< T,C20 >
+        , vector20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >
+        >
+{
+    typedef vector21_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21
+    >
+struct vector22_c
+    : v_item<
+          integral_c< T,C21 >
+        , vector21_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20 >
+        >
+{
+    typedef vector22_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22
+    >
+struct vector23_c
+    : v_item<
+          integral_c< T,C22 >
+        , vector22_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21 >
+        >
+{
+    typedef vector23_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23
+    >
+struct vector24_c
+    : v_item<
+          integral_c< T,C23 >
+        , vector23_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22 >
+        >
+{
+    typedef vector24_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24
+    >
+struct vector25_c
+    : v_item<
+          integral_c< T,C24 >
+        , vector24_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23 >
+        >
+{
+    typedef vector25_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25
+    >
+struct vector26_c
+    : v_item<
+          integral_c< T,C25 >
+        , vector25_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24 >
+        >
+{
+    typedef vector26_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26
+    >
+struct vector27_c
+    : v_item<
+          integral_c< T,C26 >
+        , vector26_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25 >
+        >
+{
+    typedef vector27_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27
+    >
+struct vector28_c
+    : v_item<
+          integral_c< T,C27 >
+        , vector27_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26 >
+        >
+{
+    typedef vector28_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28
+    >
+struct vector29_c
+    : v_item<
+          integral_c< T,C28 >
+        , vector28_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27 >
+        >
+{
+    typedef vector29_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29
+    >
+struct vector30_c
+    : v_item<
+          integral_c< T,C29 >
+        , vector29_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28 >
+        >
+{
+    typedef vector30_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40.hpp
new file mode 100644
index 0000000..debcf70
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40.hpp
@@ -0,0 +1,199 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30
+    >
+struct vector31
+    : v_item<
+          T30
+        , vector30< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29 >
+        >
+{
+    typedef vector31 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31
+    >
+struct vector32
+    : v_item<
+          T31
+        , vector31< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30 >
+        >
+{
+    typedef vector32 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32
+    >
+struct vector33
+    : v_item<
+          T32
+        , vector32< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31 >
+        >
+{
+    typedef vector33 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33
+    >
+struct vector34
+    : v_item<
+          T33
+        , vector33< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32 >
+        >
+{
+    typedef vector34 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    >
+struct vector35
+    : v_item<
+          T34
+        , vector34< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33 >
+        >
+{
+    typedef vector35 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35
+    >
+struct vector36
+    : v_item<
+          T35
+        , vector35< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34 >
+        >
+{
+    typedef vector36 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36
+    >
+struct vector37
+    : v_item<
+          T36
+        , vector36< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35 >
+        >
+{
+    typedef vector37 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37
+    >
+struct vector38
+    : v_item<
+          T37
+        , vector37< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36 >
+        >
+{
+    typedef vector38 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38
+    >
+struct vector39
+    : v_item<
+          T38
+        , vector38< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37 >
+        >
+{
+    typedef vector39 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    >
+struct vector40
+    : v_item<
+          T39
+        , vector39< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38 >
+        >
+{
+    typedef vector40 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40_c.hpp
new file mode 100644
index 0000000..88d742e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40_c.hpp
@@ -0,0 +1,183 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector40_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    >
+struct vector31_c
+    : v_item<
+          integral_c< T,C30 >
+        , vector30_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29 >
+        >
+{
+    typedef vector31_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31
+    >
+struct vector32_c
+    : v_item<
+          integral_c< T,C31 >
+        , vector31_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30 >
+        >
+{
+    typedef vector32_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32
+    >
+struct vector33_c
+    : v_item<
+          integral_c< T,C32 >
+        , vector32_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31 >
+        >
+{
+    typedef vector33_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33
+    >
+struct vector34_c
+    : v_item<
+          integral_c< T,C33 >
+        , vector33_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32 >
+        >
+{
+    typedef vector34_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34
+    >
+struct vector35_c
+    : v_item<
+          integral_c< T,C34 >
+        , vector34_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33 >
+        >
+{
+    typedef vector35_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35
+    >
+struct vector36_c
+    : v_item<
+          integral_c< T,C35 >
+        , vector35_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34 >
+        >
+{
+    typedef vector36_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36
+    >
+struct vector37_c
+    : v_item<
+          integral_c< T,C36 >
+        , vector36_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35 >
+        >
+{
+    typedef vector37_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37
+    >
+struct vector38_c
+    : v_item<
+          integral_c< T,C37 >
+        , vector37_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36 >
+        >
+{
+    typedef vector38_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38
+    >
+struct vector39_c
+    : v_item<
+          integral_c< T,C38 >
+        , vector38_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37 >
+        >
+{
+    typedef vector39_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39
+    >
+struct vector40_c
+    : v_item<
+          integral_c< T,C39 >
+        , vector39_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38 >
+        >
+{
+    typedef vector40_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50.hpp
new file mode 100644
index 0000000..8db06df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50.hpp
@@ -0,0 +1,219 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40
+    >
+struct vector41
+    : v_item<
+          T40
+        , vector40< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39 >
+        >
+{
+    typedef vector41 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41
+    >
+struct vector42
+    : v_item<
+          T41
+        , vector41< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40 >
+        >
+{
+    typedef vector42 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42
+    >
+struct vector43
+    : v_item<
+          T42
+        , vector42< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41 >
+        >
+{
+    typedef vector43 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43
+    >
+struct vector44
+    : v_item<
+          T43
+        , vector43< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42 >
+        >
+{
+    typedef vector44 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    >
+struct vector45
+    : v_item<
+          T44
+        , vector44< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43 >
+        >
+{
+    typedef vector45 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45
+    >
+struct vector46
+    : v_item<
+          T45
+        , vector45< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44 >
+        >
+{
+    typedef vector46 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46
+    >
+struct vector47
+    : v_item<
+          T46
+        , vector46< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45 >
+        >
+{
+    typedef vector47 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47
+    >
+struct vector48
+    : v_item<
+          T47
+        , vector47< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46 >
+        >
+{
+    typedef vector48 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48
+    >
+struct vector49
+    : v_item<
+          T48
+        , vector48< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47 >
+        >
+{
+    typedef vector49 type;
+};
+
+template<
+      typename T0, typename T1, typename T2, typename T3, typename T4
+    , typename T5, typename T6, typename T7, typename T8, typename T9
+    , typename T10, typename T11, typename T12, typename T13, typename T14
+    , typename T15, typename T16, typename T17, typename T18, typename T19
+    , typename T20, typename T21, typename T22, typename T23, typename T24
+    , typename T25, typename T26, typename T27, typename T28, typename T29
+    , typename T30, typename T31, typename T32, typename T33, typename T34
+    , typename T35, typename T36, typename T37, typename T38, typename T39
+    , typename T40, typename T41, typename T42, typename T43, typename T44
+    , typename T45, typename T46, typename T47, typename T48, typename T49
+    >
+struct vector50
+    : v_item<
+          T49
+        , vector49< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47,T48 >
+        >
+{
+    typedef vector50 type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50_c.hpp
new file mode 100644
index 0000000..f56d6af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50_c.hpp
@@ -0,0 +1,193 @@
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Preprocessed version of "boost/mpl/vector/vector50_c.hpp" header
+// -- DO NOT modify by hand!
+
+namespace boost { namespace mpl {
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    >
+struct vector41_c
+    : v_item<
+          integral_c< T,C40 >
+        , vector40_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39 >
+        >
+{
+    typedef vector41_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41
+    >
+struct vector42_c
+    : v_item<
+          integral_c< T,C41 >
+        , vector41_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40 >
+        >
+{
+    typedef vector42_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42
+    >
+struct vector43_c
+    : v_item<
+          integral_c< T,C42 >
+        , vector42_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41 >
+        >
+{
+    typedef vector43_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43
+    >
+struct vector44_c
+    : v_item<
+          integral_c< T,C43 >
+        , vector43_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42 >
+        >
+{
+    typedef vector44_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44
+    >
+struct vector45_c
+    : v_item<
+          integral_c< T,C44 >
+        , vector44_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43 >
+        >
+{
+    typedef vector45_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45
+    >
+struct vector46_c
+    : v_item<
+          integral_c< T,C45 >
+        , vector45_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44 >
+        >
+{
+    typedef vector46_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46
+    >
+struct vector47_c
+    : v_item<
+          integral_c< T,C46 >
+        , vector46_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45 >
+        >
+{
+    typedef vector47_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47
+    >
+struct vector48_c
+    : v_item<
+          integral_c< T,C47 >
+        , vector47_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46 >
+        >
+{
+    typedef vector48_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48
+    >
+struct vector49_c
+    : v_item<
+          integral_c< T,C48 >
+        , vector48_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47 >
+        >
+{
+    typedef vector49_c type;
+    typedef T value_type;
+};
+
+template<
+      typename T
+    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10
+    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20
+    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30
+    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40
+    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49
+    >
+struct vector50_c
+    : v_item<
+          integral_c< T,C49 >
+        , vector49_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48 >
+        >
+{
+    typedef vector50_c type;
+    typedef T value_type;
+};
+
+}}
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/push_back.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/push_back.hpp
new file mode 100644
index 0000000..527828c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/push_back.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_PUSH_BACK_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_PUSH_BACK_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_back_fwd.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   include <boost/mpl/vector/aux_/item.hpp>
+#   include <boost/mpl/vector/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct push_back_impl< aux::vector_tag >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef v_item<T,Vector,0> type;
+    };
+};
+
+}}
+
+#endif 
+
+#endif // BOOST_MPL_VECTOR_AUX_PUSH_BACK_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/push_front.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/push_front.hpp
new file mode 100644
index 0000000..f315de5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/push_front.hpp
@@ -0,0 +1,40 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_PUSH_FRONT_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_PUSH_FRONT_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/push_front_fwd.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+#   include <boost/mpl/vector/aux_/item.hpp>
+#   include <boost/mpl/vector/aux_/tag.hpp>
+
+namespace boost { namespace mpl {
+
+template<>
+struct push_front_impl< aux::vector_tag >
+{
+    template< typename Vector, typename T > struct apply
+    {
+        typedef v_item<T,Vector,1> type;
+    };
+};
+
+}}
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+#endif // BOOST_MPL_VECTOR_AUX_PUSH_FRONT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/size.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/size.hpp
new file mode 100644
index 0000000..c131e88
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/size.hpp
@@ -0,0 +1,49 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_SIZE_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_SIZE_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/vector/aux_/O1_size.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/config/ctps.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+
+template<>
+struct size_impl< aux::vector_tag >
+    : O1_size_impl< aux::vector_tag >
+{
+};
+
+#else
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template< long N >
+struct size_impl< aux::vector_tag<N> >
+    : O1_size_impl< aux::vector_tag<N> >
+{
+};
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+#endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_SIZE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/tag.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/tag.hpp
new file mode 100644
index 0000000..90d16e3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/tag.hpp
@@ -0,0 +1,32 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_TAG_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_TAG_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/config/typeof.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+namespace boost { namespace mpl { namespace aux {
+
+struct v_iter_tag;
+
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+struct vector_tag;
+#else
+template< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct vector_tag;
+#endif
+
+}}}
+
+#endif // BOOST_MPL_VECTOR_AUX_TAG_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/aux_/vector0.hpp b/gatb-core/thirdparty/boost/mpl/vector/aux_/vector0.hpp
new file mode 100644
index 0000000..4026673
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/aux_/vector0.hpp
@@ -0,0 +1,52 @@
+
+#ifndef BOOST_MPL_VECTOR_AUX_VECTOR0_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_AUX_VECTOR0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/mpl/aux_/type_wrapper.hpp>
+
+#include <boost/mpl/vector/aux_/iterator.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+#include <boost/mpl/aux_/config/typeof.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename Dummy = na > struct vector0;
+
+template<> struct vector0<na>
+{
+#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
+    typedef aux::vector_tag tag;
+    typedef vector0         type;
+    typedef long_<32768>    lower_bound_;
+    typedef lower_bound_    upper_bound_;
+    typedef long_<0>        size;
+
+    static aux::type_wrapper<void_> item_(...);
+#else
+    typedef aux::vector_tag<0> tag;
+    typedef vector0 type;
+    typedef void_ item0;
+    
+    typedef v_iter<vector0<>,0> begin;
+    typedef v_iter<vector0<>,0> end;
+#endif
+};
+
+}}
+
+#endif // BOOST_MPL_VECTOR_AUX_VECTOR0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector0.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector0.hpp
new file mode 100644
index 0000000..39759dd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector0.hpp
@@ -0,0 +1,34 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR0_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR0_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/vector/aux_/at.hpp>
+#include <boost/mpl/vector/aux_/front.hpp>
+#include <boost/mpl/vector/aux_/push_front.hpp>
+#include <boost/mpl/vector/aux_/pop_front.hpp>
+#include <boost/mpl/vector/aux_/push_back.hpp>
+#include <boost/mpl/vector/aux_/pop_back.hpp>
+#include <boost/mpl/vector/aux_/back.hpp>
+#include <boost/mpl/vector/aux_/clear.hpp>
+#include <boost/mpl/vector/aux_/O1_size.hpp>
+#include <boost/mpl/vector/aux_/size.hpp>
+#include <boost/mpl/vector/aux_/empty.hpp>
+#include <boost/mpl/vector/aux_/item.hpp>
+#include <boost/mpl/vector/aux_/iterator.hpp>
+#include <boost/mpl/vector/aux_/vector0.hpp>
+#include <boost/mpl/vector/aux_/begin_end.hpp>
+#include <boost/mpl/vector/aux_/tag.hpp>
+
+#endif // BOOST_MPL_VECTOR_VECTOR0_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector0_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector0_c.hpp
new file mode 100644
index 0000000..0e60215
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector0_c.hpp
@@ -0,0 +1,31 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR0_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR0_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/vector/vector0.hpp>
+#include <boost/mpl/integral_c.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename T > struct vector0_c
+    : vector0<>
+{
+    typedef vector0_c type;
+    typedef T value_type;
+};
+
+}}
+
+#endif // BOOST_MPL_VECTOR_VECTOR0_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector10.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector10.hpp
new file mode 100644
index 0000000..53a2a16
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector10.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR10_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR10_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector0.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector10.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(0, 10, <boost/mpl/vector/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR10_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector10_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector10_c.hpp
new file mode 100644
index 0000000..be52d2f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector10_c.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR10_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR10_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector0_c.hpp>
+#   include <boost/mpl/vector/vector10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector10_c.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(1, 10, <boost/mpl/vector/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR10_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector20.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector20.hpp
new file mode 100644
index 0000000..96d1b9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector20.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR20_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR20_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector10.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector20.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/vector/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR20_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector20_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector20_c.hpp
new file mode 100644
index 0000000..3913f26
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector20_c.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR20_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR20_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector10_c.hpp>
+#   include <boost/mpl/vector/vector20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector20_c.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(11, 20, <boost/mpl/vector/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR20_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector30.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector30.hpp
new file mode 100644
index 0000000..b2f0a5e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector30.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR30_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR30_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector20.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector30.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/vector/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR30_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector30_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector30_c.hpp
new file mode 100644
index 0000000..94cdab4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector30_c.hpp
@@ -0,0 +1,47 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR30_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR30_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector20_c.hpp>
+#   include <boost/mpl/vector/vector30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector30_c.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/config.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(21, 30, <boost/mpl/vector/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_USE_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR30_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector40.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector40.hpp
new file mode 100644
index 0000000..2d2ef81
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector40.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR40_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR40_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector30.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector40.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/vector/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR40_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector40_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector40_c.hpp
new file mode 100644
index 0000000..25e2ebf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector40_c.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR40_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR40_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector30_c.hpp>
+#   include <boost/mpl/vector/vector40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector40_c.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(31, 40, <boost/mpl/vector/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR40_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector50.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector50.hpp
new file mode 100644
index 0000000..dc2d5c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector50.hpp
@@ -0,0 +1,45 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector40.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector50.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/vector/aux_/numbered.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector/vector50_c.hpp b/gatb-core/thirdparty/boost/mpl/vector/vector50_c.hpp
new file mode 100644
index 0000000..7388bf4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector/vector50_c.hpp
@@ -0,0 +1,46 @@
+
+#ifndef BOOST_MPL_VECTOR_VECTOR50_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_VECTOR50_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/vector/vector40_c.hpp>
+#   include <boost/mpl/vector/vector50.hpp>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+ && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector50_c.hpp
+#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/aux_/config/typeof.hpp>
+#   include <boost/mpl/aux_/config/ctps.hpp>
+#   include <boost/preprocessor/iterate.hpp>
+
+namespace boost { namespace mpl {
+
+#   define BOOST_PP_ITERATION_PARAMS_1 \
+    (3,(41, 50, <boost/mpl/vector/aux_/numbered_c.hpp>))
+#   include BOOST_PP_ITERATE()
+
+}}
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+
+#endif // BOOST_MPL_VECTOR_VECTOR50_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/vector_c.hpp b/gatb-core/thirdparty/boost/mpl/vector_c.hpp
new file mode 100644
index 0000000..316ce65
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/vector_c.hpp
@@ -0,0 +1,61 @@
+
+#ifndef BOOST_MPL_VECTOR_C_HPP_INCLUDED
+#define BOOST_MPL_VECTOR_C_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#if !defined(BOOST_MPL_PREPROCESSING_MODE)
+#   include <boost/mpl/limits/vector.hpp>
+#   include <boost/mpl/aux_/nttp_decl.hpp>
+#   include <boost/mpl/aux_/config/preprocessor.hpp>
+
+#   include <boost/preprocessor/inc.hpp>
+#   include <boost/preprocessor/cat.hpp>
+#   include <boost/preprocessor/stringize.hpp>
+
+#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)
+#   define AUX778076_VECTOR_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(vector,BOOST_MPL_LIMIT_VECTOR_SIZE),_c).hpp \
+    /**/
+#else
+#   define AUX778076_VECTOR_C_HEADER \
+    BOOST_PP_CAT(BOOST_PP_CAT(vector,BOOST_MPL_LIMIT_VECTOR_SIZE),_c)##.hpp \
+    /**/
+#endif
+
+#   include BOOST_PP_STRINGIZE(boost/mpl/vector/AUX778076_VECTOR_C_HEADER)
+#   undef AUX778076_VECTOR_C_HEADER
+#   include <climits>
+#endif
+
+#include <boost/mpl/aux_/config/use_preprocessed.hpp>
+
+#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
+    && !defined(BOOST_MPL_PREPROCESSING_MODE)
+
+#   define BOOST_MPL_PREPROCESSED_HEADER vector_c.hpp
+#   include <boost/mpl/aux_/include_preprocessed.hpp>
+
+#else
+
+#   include <boost/mpl/limits/vector.hpp>
+
+#   define AUX778076_SEQUENCE_NAME vector_c
+#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_VECTOR_SIZE
+#   define AUX778076_SEQUENCE_NAME_N(n) BOOST_PP_CAT(BOOST_PP_CAT(vector,n),_c)
+#   define AUX778076_SEQUENCE_CONVERT_CN_TO(z,n,TARGET) TARGET(BOOST_PP_CAT(C,n))
+#   define AUX778076_SEQUENCE_INTEGRAL_WRAPPER
+#   include <boost/mpl/aux_/sequence_wrapper.hpp>
+
+#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif // BOOST_MPL_VECTOR_C_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/void.hpp b/gatb-core/thirdparty/boost/mpl/void.hpp
new file mode 100644
index 0000000..3dcbdd1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/void.hpp
@@ -0,0 +1,76 @@
+
+#ifndef BOOST_MPL_VOID_HPP_INCLUDED
+#define BOOST_MPL_VOID_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/void_fwd.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/config/msvc.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+//  [JDG Feb-4-2003] made void_ a complete type to allow it to be
+//  instantiated so that it can be passed in as an object that can be
+//  used to select an overloaded function. Possible use includes signaling
+//  a zero arity functor evaluation call.
+struct void_ { typedef void_ type; };
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+
+namespace boost { namespace mpl {
+
+template< typename T >
+struct is_void_
+    : false_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using false_::value;
+#endif
+};
+
+template<>
+struct is_void_<void_>
+    : true_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using true_::value;
+#endif
+};
+
+template< typename T >
+struct is_not_void_
+    : true_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using true_::value;
+#endif
+};
+
+template<>
+struct is_not_void_<void_>
+    : false_
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    using false_::value;
+#endif
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, is_void_)
+BOOST_MPL_AUX_NA_SPEC(1, is_not_void_)
+
+}}
+
+#endif // BOOST_MPL_VOID_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/void_fwd.hpp b/gatb-core/thirdparty/boost/mpl/void_fwd.hpp
new file mode 100644
index 0000000..86078b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/void_fwd.hpp
@@ -0,0 +1,26 @@
+
+#ifndef BOOST_MPL_VOID_FWD_HPP_INCLUDED
+#define BOOST_MPL_VOID_FWD_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+struct void_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(void_)
+
+#endif // BOOST_MPL_VOID_FWD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/mpl/zip_view.hpp b/gatb-core/thirdparty/boost/mpl/zip_view.hpp
new file mode 100644
index 0000000..d709230
--- /dev/null
+++ b/gatb-core/thirdparty/boost/mpl/zip_view.hpp
@@ -0,0 +1,65 @@
+
+#ifndef BOOST_MPL_ZIP_VIEW_HPP_INCLUDED
+#define BOOST_MPL_ZIP_VIEW_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2000-2010
+// Copyright David Abrahams 2000-2002
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+
+namespace boost { namespace mpl {
+
+template< typename IteratorSeq >
+struct zip_iterator
+{
+    typedef forward_iterator_tag category;
+    typedef typename transform1<
+          IteratorSeq
+        , deref<_1>
+        >::type type;
+
+    typedef zip_iterator<
+          typename transform1<
+                IteratorSeq
+              , mpl::next<_1>
+            >::type
+        > next;
+};
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequences)
+    >
+struct zip_view
+{
+ private:
+    typedef typename transform1< Sequences, mpl::begin<_1> >::type first_ones_;
+    typedef typename transform1< Sequences, mpl::end<_1> >::type last_ones_;
+    
+ public:
+    typedef nested_begin_end_tag tag;
+    typedef zip_view type;
+    typedef zip_iterator<first_ones_> begin;
+    typedef zip_iterator<last_ones_> end;
+};
+
+BOOST_MPL_AUX_NA_SPEC(1, zip_view)
+
+}}
+
+#endif // BOOST_MPL_ZIP_VIEW_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/noncopyable.hpp b/gatb-core/thirdparty/boost/noncopyable.hpp
new file mode 100644
index 0000000..e998ee8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/noncopyable.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NONCOPYABLE_HPP
+#define BOOST_NONCOPYABLE_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/noncopyable.hpp instead.
+
+#include <boost/core/noncopyable.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/preprocessor.hpp b/gatb-core/thirdparty/boost/preprocessor.hpp
new file mode 100644
index 0000000..6f5c822
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor.hpp
@@ -0,0 +1,19 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org/libs/preprocessor for documentation. */
+#
+# ifndef BOOST_PREPROCESSOR_HPP
+# define BOOST_PREPROCESSOR_HPP
+#
+# include <boost/preprocessor/library.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic.hpp
new file mode 100644
index 0000000..b1be781
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic.hpp
@@ -0,0 +1,25 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_HPP
+#
+# include <boost/preprocessor/arithmetic/add.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/div.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/arithmetic/mod.hpp>
+# include <boost/preprocessor/arithmetic/mul.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/add.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/add.hpp
new file mode 100644
index 0000000..5a29f55
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/add.hpp
@@ -0,0 +1,51 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ADD */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ADD(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))
+# else
+#    define BOOST_PP_ADD(x, y) BOOST_PP_ADD_I(x, y)
+#    define BOOST_PP_ADD_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))
+# endif
+#
+# define BOOST_PP_ADD_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I xy
+# else
+#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))
+# endif
+#
+# define BOOST_PP_ADD_O_I(x, y) (BOOST_PP_INC(x), BOOST_PP_DEC(y))
+#
+# /* BOOST_PP_ADD_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))
+# else
+#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_ADD_D_I(d, x, y)
+#    define BOOST_PP_ADD_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/dec.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/dec.hpp
new file mode 100644
index 0000000..0503359
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/dec.hpp
@@ -0,0 +1,288 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_DEC */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_DEC(x) BOOST_PP_DEC_I(x)
+# else
+#    define BOOST_PP_DEC(x) BOOST_PP_DEC_OO((x))
+#    define BOOST_PP_DEC_OO(par) BOOST_PP_DEC_I ## par
+# endif
+#
+# define BOOST_PP_DEC_I(x) BOOST_PP_DEC_ ## x
+#
+# define BOOST_PP_DEC_0 0
+# define BOOST_PP_DEC_1 0
+# define BOOST_PP_DEC_2 1
+# define BOOST_PP_DEC_3 2
+# define BOOST_PP_DEC_4 3
+# define BOOST_PP_DEC_5 4
+# define BOOST_PP_DEC_6 5
+# define BOOST_PP_DEC_7 6
+# define BOOST_PP_DEC_8 7
+# define BOOST_PP_DEC_9 8
+# define BOOST_PP_DEC_10 9
+# define BOOST_PP_DEC_11 10
+# define BOOST_PP_DEC_12 11
+# define BOOST_PP_DEC_13 12
+# define BOOST_PP_DEC_14 13
+# define BOOST_PP_DEC_15 14
+# define BOOST_PP_DEC_16 15
+# define BOOST_PP_DEC_17 16
+# define BOOST_PP_DEC_18 17
+# define BOOST_PP_DEC_19 18
+# define BOOST_PP_DEC_20 19
+# define BOOST_PP_DEC_21 20
+# define BOOST_PP_DEC_22 21
+# define BOOST_PP_DEC_23 22
+# define BOOST_PP_DEC_24 23
+# define BOOST_PP_DEC_25 24
+# define BOOST_PP_DEC_26 25
+# define BOOST_PP_DEC_27 26
+# define BOOST_PP_DEC_28 27
+# define BOOST_PP_DEC_29 28
+# define BOOST_PP_DEC_30 29
+# define BOOST_PP_DEC_31 30
+# define BOOST_PP_DEC_32 31
+# define BOOST_PP_DEC_33 32
+# define BOOST_PP_DEC_34 33
+# define BOOST_PP_DEC_35 34
+# define BOOST_PP_DEC_36 35
+# define BOOST_PP_DEC_37 36
+# define BOOST_PP_DEC_38 37
+# define BOOST_PP_DEC_39 38
+# define BOOST_PP_DEC_40 39
+# define BOOST_PP_DEC_41 40
+# define BOOST_PP_DEC_42 41
+# define BOOST_PP_DEC_43 42
+# define BOOST_PP_DEC_44 43
+# define BOOST_PP_DEC_45 44
+# define BOOST_PP_DEC_46 45
+# define BOOST_PP_DEC_47 46
+# define BOOST_PP_DEC_48 47
+# define BOOST_PP_DEC_49 48
+# define BOOST_PP_DEC_50 49
+# define BOOST_PP_DEC_51 50
+# define BOOST_PP_DEC_52 51
+# define BOOST_PP_DEC_53 52
+# define BOOST_PP_DEC_54 53
+# define BOOST_PP_DEC_55 54
+# define BOOST_PP_DEC_56 55
+# define BOOST_PP_DEC_57 56
+# define BOOST_PP_DEC_58 57
+# define BOOST_PP_DEC_59 58
+# define BOOST_PP_DEC_60 59
+# define BOOST_PP_DEC_61 60
+# define BOOST_PP_DEC_62 61
+# define BOOST_PP_DEC_63 62
+# define BOOST_PP_DEC_64 63
+# define BOOST_PP_DEC_65 64
+# define BOOST_PP_DEC_66 65
+# define BOOST_PP_DEC_67 66
+# define BOOST_PP_DEC_68 67
+# define BOOST_PP_DEC_69 68
+# define BOOST_PP_DEC_70 69
+# define BOOST_PP_DEC_71 70
+# define BOOST_PP_DEC_72 71
+# define BOOST_PP_DEC_73 72
+# define BOOST_PP_DEC_74 73
+# define BOOST_PP_DEC_75 74
+# define BOOST_PP_DEC_76 75
+# define BOOST_PP_DEC_77 76
+# define BOOST_PP_DEC_78 77
+# define BOOST_PP_DEC_79 78
+# define BOOST_PP_DEC_80 79
+# define BOOST_PP_DEC_81 80
+# define BOOST_PP_DEC_82 81
+# define BOOST_PP_DEC_83 82
+# define BOOST_PP_DEC_84 83
+# define BOOST_PP_DEC_85 84
+# define BOOST_PP_DEC_86 85
+# define BOOST_PP_DEC_87 86
+# define BOOST_PP_DEC_88 87
+# define BOOST_PP_DEC_89 88
+# define BOOST_PP_DEC_90 89
+# define BOOST_PP_DEC_91 90
+# define BOOST_PP_DEC_92 91
+# define BOOST_PP_DEC_93 92
+# define BOOST_PP_DEC_94 93
+# define BOOST_PP_DEC_95 94
+# define BOOST_PP_DEC_96 95
+# define BOOST_PP_DEC_97 96
+# define BOOST_PP_DEC_98 97
+# define BOOST_PP_DEC_99 98
+# define BOOST_PP_DEC_100 99
+# define BOOST_PP_DEC_101 100
+# define BOOST_PP_DEC_102 101
+# define BOOST_PP_DEC_103 102
+# define BOOST_PP_DEC_104 103
+# define BOOST_PP_DEC_105 104
+# define BOOST_PP_DEC_106 105
+# define BOOST_PP_DEC_107 106
+# define BOOST_PP_DEC_108 107
+# define BOOST_PP_DEC_109 108
+# define BOOST_PP_DEC_110 109
+# define BOOST_PP_DEC_111 110
+# define BOOST_PP_DEC_112 111
+# define BOOST_PP_DEC_113 112
+# define BOOST_PP_DEC_114 113
+# define BOOST_PP_DEC_115 114
+# define BOOST_PP_DEC_116 115
+# define BOOST_PP_DEC_117 116
+# define BOOST_PP_DEC_118 117
+# define BOOST_PP_DEC_119 118
+# define BOOST_PP_DEC_120 119
+# define BOOST_PP_DEC_121 120
+# define BOOST_PP_DEC_122 121
+# define BOOST_PP_DEC_123 122
+# define BOOST_PP_DEC_124 123
+# define BOOST_PP_DEC_125 124
+# define BOOST_PP_DEC_126 125
+# define BOOST_PP_DEC_127 126
+# define BOOST_PP_DEC_128 127
+# define BOOST_PP_DEC_129 128
+# define BOOST_PP_DEC_130 129
+# define BOOST_PP_DEC_131 130
+# define BOOST_PP_DEC_132 131
+# define BOOST_PP_DEC_133 132
+# define BOOST_PP_DEC_134 133
+# define BOOST_PP_DEC_135 134
+# define BOOST_PP_DEC_136 135
+# define BOOST_PP_DEC_137 136
+# define BOOST_PP_DEC_138 137
+# define BOOST_PP_DEC_139 138
+# define BOOST_PP_DEC_140 139
+# define BOOST_PP_DEC_141 140
+# define BOOST_PP_DEC_142 141
+# define BOOST_PP_DEC_143 142
+# define BOOST_PP_DEC_144 143
+# define BOOST_PP_DEC_145 144
+# define BOOST_PP_DEC_146 145
+# define BOOST_PP_DEC_147 146
+# define BOOST_PP_DEC_148 147
+# define BOOST_PP_DEC_149 148
+# define BOOST_PP_DEC_150 149
+# define BOOST_PP_DEC_151 150
+# define BOOST_PP_DEC_152 151
+# define BOOST_PP_DEC_153 152
+# define BOOST_PP_DEC_154 153
+# define BOOST_PP_DEC_155 154
+# define BOOST_PP_DEC_156 155
+# define BOOST_PP_DEC_157 156
+# define BOOST_PP_DEC_158 157
+# define BOOST_PP_DEC_159 158
+# define BOOST_PP_DEC_160 159
+# define BOOST_PP_DEC_161 160
+# define BOOST_PP_DEC_162 161
+# define BOOST_PP_DEC_163 162
+# define BOOST_PP_DEC_164 163
+# define BOOST_PP_DEC_165 164
+# define BOOST_PP_DEC_166 165
+# define BOOST_PP_DEC_167 166
+# define BOOST_PP_DEC_168 167
+# define BOOST_PP_DEC_169 168
+# define BOOST_PP_DEC_170 169
+# define BOOST_PP_DEC_171 170
+# define BOOST_PP_DEC_172 171
+# define BOOST_PP_DEC_173 172
+# define BOOST_PP_DEC_174 173
+# define BOOST_PP_DEC_175 174
+# define BOOST_PP_DEC_176 175
+# define BOOST_PP_DEC_177 176
+# define BOOST_PP_DEC_178 177
+# define BOOST_PP_DEC_179 178
+# define BOOST_PP_DEC_180 179
+# define BOOST_PP_DEC_181 180
+# define BOOST_PP_DEC_182 181
+# define BOOST_PP_DEC_183 182
+# define BOOST_PP_DEC_184 183
+# define BOOST_PP_DEC_185 184
+# define BOOST_PP_DEC_186 185
+# define BOOST_PP_DEC_187 186
+# define BOOST_PP_DEC_188 187
+# define BOOST_PP_DEC_189 188
+# define BOOST_PP_DEC_190 189
+# define BOOST_PP_DEC_191 190
+# define BOOST_PP_DEC_192 191
+# define BOOST_PP_DEC_193 192
+# define BOOST_PP_DEC_194 193
+# define BOOST_PP_DEC_195 194
+# define BOOST_PP_DEC_196 195
+# define BOOST_PP_DEC_197 196
+# define BOOST_PP_DEC_198 197
+# define BOOST_PP_DEC_199 198
+# define BOOST_PP_DEC_200 199
+# define BOOST_PP_DEC_201 200
+# define BOOST_PP_DEC_202 201
+# define BOOST_PP_DEC_203 202
+# define BOOST_PP_DEC_204 203
+# define BOOST_PP_DEC_205 204
+# define BOOST_PP_DEC_206 205
+# define BOOST_PP_DEC_207 206
+# define BOOST_PP_DEC_208 207
+# define BOOST_PP_DEC_209 208
+# define BOOST_PP_DEC_210 209
+# define BOOST_PP_DEC_211 210
+# define BOOST_PP_DEC_212 211
+# define BOOST_PP_DEC_213 212
+# define BOOST_PP_DEC_214 213
+# define BOOST_PP_DEC_215 214
+# define BOOST_PP_DEC_216 215
+# define BOOST_PP_DEC_217 216
+# define BOOST_PP_DEC_218 217
+# define BOOST_PP_DEC_219 218
+# define BOOST_PP_DEC_220 219
+# define BOOST_PP_DEC_221 220
+# define BOOST_PP_DEC_222 221
+# define BOOST_PP_DEC_223 222
+# define BOOST_PP_DEC_224 223
+# define BOOST_PP_DEC_225 224
+# define BOOST_PP_DEC_226 225
+# define BOOST_PP_DEC_227 226
+# define BOOST_PP_DEC_228 227
+# define BOOST_PP_DEC_229 228
+# define BOOST_PP_DEC_230 229
+# define BOOST_PP_DEC_231 230
+# define BOOST_PP_DEC_232 231
+# define BOOST_PP_DEC_233 232
+# define BOOST_PP_DEC_234 233
+# define BOOST_PP_DEC_235 234
+# define BOOST_PP_DEC_236 235
+# define BOOST_PP_DEC_237 236
+# define BOOST_PP_DEC_238 237
+# define BOOST_PP_DEC_239 238
+# define BOOST_PP_DEC_240 239
+# define BOOST_PP_DEC_241 240
+# define BOOST_PP_DEC_242 241
+# define BOOST_PP_DEC_243 242
+# define BOOST_PP_DEC_244 243
+# define BOOST_PP_DEC_245 244
+# define BOOST_PP_DEC_246 245
+# define BOOST_PP_DEC_247 246
+# define BOOST_PP_DEC_248 247
+# define BOOST_PP_DEC_249 248
+# define BOOST_PP_DEC_250 249
+# define BOOST_PP_DEC_251 250
+# define BOOST_PP_DEC_252 251
+# define BOOST_PP_DEC_253 252
+# define BOOST_PP_DEC_254 253
+# define BOOST_PP_DEC_255 254
+# define BOOST_PP_DEC_256 255
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/detail/div_base.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/detail/div_base.hpp
new file mode 100644
index 0000000..106632a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/detail/div_base.hpp
@@ -0,0 +1,61 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DETAIL_DIV_BASE_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_DETAIL_DIV_BASE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_DIV_BASE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_DIV_BASE(x, y) BOOST_PP_WHILE(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))
+# else
+#    define BOOST_PP_DIV_BASE(x, y) BOOST_PP_DIV_BASE_I(x, y)
+#    define BOOST_PP_DIV_BASE_I(x, y) BOOST_PP_WHILE(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_DIV_BASE_P(d, rxy) BOOST_PP_DIV_BASE_P_IM(d, BOOST_PP_TUPLE_REM_3 rxy)
+#    define BOOST_PP_DIV_BASE_P_IM(d, im) BOOST_PP_DIV_BASE_P_I(d, im)
+# else
+#    define BOOST_PP_DIV_BASE_P(d, rxy) BOOST_PP_DIV_BASE_P_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))
+# endif
+#
+# define BOOST_PP_DIV_BASE_P_I(d, r, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_DIV_BASE_O(d, rxy) BOOST_PP_DIV_BASE_O_IM(d, BOOST_PP_TUPLE_REM_3 rxy)
+#    define BOOST_PP_DIV_BASE_O_IM(d, im) BOOST_PP_DIV_BASE_O_I(d, im)
+# else
+#    define BOOST_PP_DIV_BASE_O(d, rxy) BOOST_PP_DIV_BASE_O_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))
+# endif
+#
+# define BOOST_PP_DIV_BASE_O_I(d, r, x, y) (BOOST_PP_INC(r), BOOST_PP_SUB_D(d, x, y), y)
+#
+# /* BOOST_PP_DIV_BASE_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_DIV_BASE_D(d, x, y) BOOST_PP_WHILE_ ## d(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))
+# else
+#    define BOOST_PP_DIV_BASE_D(d, x, y) BOOST_PP_DIV_BASE_D_I(d, x, y)
+#    define BOOST_PP_DIV_BASE_D_I(d, x, y) BOOST_PP_WHILE_ ## d(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/div.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/div.hpp
new file mode 100644
index 0000000..277596c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/div.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP
+#
+# include <boost/preprocessor/arithmetic/detail/div_base.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_DIV */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_DIV(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y))
+# else
+#    define BOOST_PP_DIV(x, y) BOOST_PP_DIV_I(x, y)
+#    define BOOST_PP_DIV_I(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y))
+# endif
+#
+# /* BOOST_PP_DIV_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_DIV_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y))
+# else
+#    define BOOST_PP_DIV_D(d, x, y) BOOST_PP_DIV_D_I(d, x, y)
+#    define BOOST_PP_DIV_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/inc.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/inc.hpp
new file mode 100644
index 0000000..1597ab8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/inc.hpp
@@ -0,0 +1,288 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_INC */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_INC(x) BOOST_PP_INC_I(x)
+# else
+#    define BOOST_PP_INC(x) BOOST_PP_INC_OO((x))
+#    define BOOST_PP_INC_OO(par) BOOST_PP_INC_I ## par
+# endif
+#
+# define BOOST_PP_INC_I(x) BOOST_PP_INC_ ## x
+#
+# define BOOST_PP_INC_0 1
+# define BOOST_PP_INC_1 2
+# define BOOST_PP_INC_2 3
+# define BOOST_PP_INC_3 4
+# define BOOST_PP_INC_4 5
+# define BOOST_PP_INC_5 6
+# define BOOST_PP_INC_6 7
+# define BOOST_PP_INC_7 8
+# define BOOST_PP_INC_8 9
+# define BOOST_PP_INC_9 10
+# define BOOST_PP_INC_10 11
+# define BOOST_PP_INC_11 12
+# define BOOST_PP_INC_12 13
+# define BOOST_PP_INC_13 14
+# define BOOST_PP_INC_14 15
+# define BOOST_PP_INC_15 16
+# define BOOST_PP_INC_16 17
+# define BOOST_PP_INC_17 18
+# define BOOST_PP_INC_18 19
+# define BOOST_PP_INC_19 20
+# define BOOST_PP_INC_20 21
+# define BOOST_PP_INC_21 22
+# define BOOST_PP_INC_22 23
+# define BOOST_PP_INC_23 24
+# define BOOST_PP_INC_24 25
+# define BOOST_PP_INC_25 26
+# define BOOST_PP_INC_26 27
+# define BOOST_PP_INC_27 28
+# define BOOST_PP_INC_28 29
+# define BOOST_PP_INC_29 30
+# define BOOST_PP_INC_30 31
+# define BOOST_PP_INC_31 32
+# define BOOST_PP_INC_32 33
+# define BOOST_PP_INC_33 34
+# define BOOST_PP_INC_34 35
+# define BOOST_PP_INC_35 36
+# define BOOST_PP_INC_36 37
+# define BOOST_PP_INC_37 38
+# define BOOST_PP_INC_38 39
+# define BOOST_PP_INC_39 40
+# define BOOST_PP_INC_40 41
+# define BOOST_PP_INC_41 42
+# define BOOST_PP_INC_42 43
+# define BOOST_PP_INC_43 44
+# define BOOST_PP_INC_44 45
+# define BOOST_PP_INC_45 46
+# define BOOST_PP_INC_46 47
+# define BOOST_PP_INC_47 48
+# define BOOST_PP_INC_48 49
+# define BOOST_PP_INC_49 50
+# define BOOST_PP_INC_50 51
+# define BOOST_PP_INC_51 52
+# define BOOST_PP_INC_52 53
+# define BOOST_PP_INC_53 54
+# define BOOST_PP_INC_54 55
+# define BOOST_PP_INC_55 56
+# define BOOST_PP_INC_56 57
+# define BOOST_PP_INC_57 58
+# define BOOST_PP_INC_58 59
+# define BOOST_PP_INC_59 60
+# define BOOST_PP_INC_60 61
+# define BOOST_PP_INC_61 62
+# define BOOST_PP_INC_62 63
+# define BOOST_PP_INC_63 64
+# define BOOST_PP_INC_64 65
+# define BOOST_PP_INC_65 66
+# define BOOST_PP_INC_66 67
+# define BOOST_PP_INC_67 68
+# define BOOST_PP_INC_68 69
+# define BOOST_PP_INC_69 70
+# define BOOST_PP_INC_70 71
+# define BOOST_PP_INC_71 72
+# define BOOST_PP_INC_72 73
+# define BOOST_PP_INC_73 74
+# define BOOST_PP_INC_74 75
+# define BOOST_PP_INC_75 76
+# define BOOST_PP_INC_76 77
+# define BOOST_PP_INC_77 78
+# define BOOST_PP_INC_78 79
+# define BOOST_PP_INC_79 80
+# define BOOST_PP_INC_80 81
+# define BOOST_PP_INC_81 82
+# define BOOST_PP_INC_82 83
+# define BOOST_PP_INC_83 84
+# define BOOST_PP_INC_84 85
+# define BOOST_PP_INC_85 86
+# define BOOST_PP_INC_86 87
+# define BOOST_PP_INC_87 88
+# define BOOST_PP_INC_88 89
+# define BOOST_PP_INC_89 90
+# define BOOST_PP_INC_90 91
+# define BOOST_PP_INC_91 92
+# define BOOST_PP_INC_92 93
+# define BOOST_PP_INC_93 94
+# define BOOST_PP_INC_94 95
+# define BOOST_PP_INC_95 96
+# define BOOST_PP_INC_96 97
+# define BOOST_PP_INC_97 98
+# define BOOST_PP_INC_98 99
+# define BOOST_PP_INC_99 100
+# define BOOST_PP_INC_100 101
+# define BOOST_PP_INC_101 102
+# define BOOST_PP_INC_102 103
+# define BOOST_PP_INC_103 104
+# define BOOST_PP_INC_104 105
+# define BOOST_PP_INC_105 106
+# define BOOST_PP_INC_106 107
+# define BOOST_PP_INC_107 108
+# define BOOST_PP_INC_108 109
+# define BOOST_PP_INC_109 110
+# define BOOST_PP_INC_110 111
+# define BOOST_PP_INC_111 112
+# define BOOST_PP_INC_112 113
+# define BOOST_PP_INC_113 114
+# define BOOST_PP_INC_114 115
+# define BOOST_PP_INC_115 116
+# define BOOST_PP_INC_116 117
+# define BOOST_PP_INC_117 118
+# define BOOST_PP_INC_118 119
+# define BOOST_PP_INC_119 120
+# define BOOST_PP_INC_120 121
+# define BOOST_PP_INC_121 122
+# define BOOST_PP_INC_122 123
+# define BOOST_PP_INC_123 124
+# define BOOST_PP_INC_124 125
+# define BOOST_PP_INC_125 126
+# define BOOST_PP_INC_126 127
+# define BOOST_PP_INC_127 128
+# define BOOST_PP_INC_128 129
+# define BOOST_PP_INC_129 130
+# define BOOST_PP_INC_130 131
+# define BOOST_PP_INC_131 132
+# define BOOST_PP_INC_132 133
+# define BOOST_PP_INC_133 134
+# define BOOST_PP_INC_134 135
+# define BOOST_PP_INC_135 136
+# define BOOST_PP_INC_136 137
+# define BOOST_PP_INC_137 138
+# define BOOST_PP_INC_138 139
+# define BOOST_PP_INC_139 140
+# define BOOST_PP_INC_140 141
+# define BOOST_PP_INC_141 142
+# define BOOST_PP_INC_142 143
+# define BOOST_PP_INC_143 144
+# define BOOST_PP_INC_144 145
+# define BOOST_PP_INC_145 146
+# define BOOST_PP_INC_146 147
+# define BOOST_PP_INC_147 148
+# define BOOST_PP_INC_148 149
+# define BOOST_PP_INC_149 150
+# define BOOST_PP_INC_150 151
+# define BOOST_PP_INC_151 152
+# define BOOST_PP_INC_152 153
+# define BOOST_PP_INC_153 154
+# define BOOST_PP_INC_154 155
+# define BOOST_PP_INC_155 156
+# define BOOST_PP_INC_156 157
+# define BOOST_PP_INC_157 158
+# define BOOST_PP_INC_158 159
+# define BOOST_PP_INC_159 160
+# define BOOST_PP_INC_160 161
+# define BOOST_PP_INC_161 162
+# define BOOST_PP_INC_162 163
+# define BOOST_PP_INC_163 164
+# define BOOST_PP_INC_164 165
+# define BOOST_PP_INC_165 166
+# define BOOST_PP_INC_166 167
+# define BOOST_PP_INC_167 168
+# define BOOST_PP_INC_168 169
+# define BOOST_PP_INC_169 170
+# define BOOST_PP_INC_170 171
+# define BOOST_PP_INC_171 172
+# define BOOST_PP_INC_172 173
+# define BOOST_PP_INC_173 174
+# define BOOST_PP_INC_174 175
+# define BOOST_PP_INC_175 176
+# define BOOST_PP_INC_176 177
+# define BOOST_PP_INC_177 178
+# define BOOST_PP_INC_178 179
+# define BOOST_PP_INC_179 180
+# define BOOST_PP_INC_180 181
+# define BOOST_PP_INC_181 182
+# define BOOST_PP_INC_182 183
+# define BOOST_PP_INC_183 184
+# define BOOST_PP_INC_184 185
+# define BOOST_PP_INC_185 186
+# define BOOST_PP_INC_186 187
+# define BOOST_PP_INC_187 188
+# define BOOST_PP_INC_188 189
+# define BOOST_PP_INC_189 190
+# define BOOST_PP_INC_190 191
+# define BOOST_PP_INC_191 192
+# define BOOST_PP_INC_192 193
+# define BOOST_PP_INC_193 194
+# define BOOST_PP_INC_194 195
+# define BOOST_PP_INC_195 196
+# define BOOST_PP_INC_196 197
+# define BOOST_PP_INC_197 198
+# define BOOST_PP_INC_198 199
+# define BOOST_PP_INC_199 200
+# define BOOST_PP_INC_200 201
+# define BOOST_PP_INC_201 202
+# define BOOST_PP_INC_202 203
+# define BOOST_PP_INC_203 204
+# define BOOST_PP_INC_204 205
+# define BOOST_PP_INC_205 206
+# define BOOST_PP_INC_206 207
+# define BOOST_PP_INC_207 208
+# define BOOST_PP_INC_208 209
+# define BOOST_PP_INC_209 210
+# define BOOST_PP_INC_210 211
+# define BOOST_PP_INC_211 212
+# define BOOST_PP_INC_212 213
+# define BOOST_PP_INC_213 214
+# define BOOST_PP_INC_214 215
+# define BOOST_PP_INC_215 216
+# define BOOST_PP_INC_216 217
+# define BOOST_PP_INC_217 218
+# define BOOST_PP_INC_218 219
+# define BOOST_PP_INC_219 220
+# define BOOST_PP_INC_220 221
+# define BOOST_PP_INC_221 222
+# define BOOST_PP_INC_222 223
+# define BOOST_PP_INC_223 224
+# define BOOST_PP_INC_224 225
+# define BOOST_PP_INC_225 226
+# define BOOST_PP_INC_226 227
+# define BOOST_PP_INC_227 228
+# define BOOST_PP_INC_228 229
+# define BOOST_PP_INC_229 230
+# define BOOST_PP_INC_230 231
+# define BOOST_PP_INC_231 232
+# define BOOST_PP_INC_232 233
+# define BOOST_PP_INC_233 234
+# define BOOST_PP_INC_234 235
+# define BOOST_PP_INC_235 236
+# define BOOST_PP_INC_236 237
+# define BOOST_PP_INC_237 238
+# define BOOST_PP_INC_238 239
+# define BOOST_PP_INC_239 240
+# define BOOST_PP_INC_240 241
+# define BOOST_PP_INC_241 242
+# define BOOST_PP_INC_242 243
+# define BOOST_PP_INC_243 244
+# define BOOST_PP_INC_244 245
+# define BOOST_PP_INC_245 246
+# define BOOST_PP_INC_246 247
+# define BOOST_PP_INC_247 248
+# define BOOST_PP_INC_248 249
+# define BOOST_PP_INC_249 250
+# define BOOST_PP_INC_250 251
+# define BOOST_PP_INC_251 252
+# define BOOST_PP_INC_252 253
+# define BOOST_PP_INC_253 254
+# define BOOST_PP_INC_254 255
+# define BOOST_PP_INC_255 256
+# define BOOST_PP_INC_256 256
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/mod.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/mod.hpp
new file mode 100644
index 0000000..62489d1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/mod.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_MOD_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_MOD_HPP
+#
+# include <boost/preprocessor/arithmetic/detail/div_base.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_MOD */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MOD(x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE(x, y))
+# else
+#    define BOOST_PP_MOD(x, y) BOOST_PP_MOD_I(x, y)
+#    define BOOST_PP_MOD_I(x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE(x, y))
+# endif
+#
+# /* BOOST_PP_MOD_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MOD_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE_D(d, x, y))
+# else
+#    define BOOST_PP_MOD_D(d, x, y) BOOST_PP_MOD_D_I(d, x, y)
+#    define BOOST_PP_MOD_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE_D(d, x, y))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/mul.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/mul.hpp
new file mode 100644
index 0000000..f3d9ffc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/mul.hpp
@@ -0,0 +1,53 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_MUL_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_MUL_HPP
+#
+# include <boost/preprocessor/arithmetic/add.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_MUL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MUL(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))
+# else
+#    define BOOST_PP_MUL(x, y) BOOST_PP_MUL_I(x, y)
+#    define BOOST_PP_MUL_I(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))
+# endif
+#
+# define BOOST_PP_MUL_P(d, rxy) BOOST_PP_TUPLE_ELEM(3, 2, rxy)
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_MUL_O(d, rxy) BOOST_PP_MUL_O_IM(d, BOOST_PP_TUPLE_REM_3 rxy)
+#    define BOOST_PP_MUL_O_IM(d, im) BOOST_PP_MUL_O_I(d, im)
+# else
+#    define BOOST_PP_MUL_O(d, rxy) BOOST_PP_MUL_O_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))
+# endif
+#
+# define BOOST_PP_MUL_O_I(d, r, x, y) (BOOST_PP_ADD_D(d, r, x), x, BOOST_PP_DEC(y))
+#
+# /* BOOST_PP_MUL_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MUL_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))
+# else
+#    define BOOST_PP_MUL_D(d, x, y) BOOST_PP_MUL_D_I(d, x, y)
+#    define BOOST_PP_MUL_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/arithmetic/sub.hpp b/gatb-core/thirdparty/boost/preprocessor/arithmetic/sub.hpp
new file mode 100644
index 0000000..5262cda
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/arithmetic/sub.hpp
@@ -0,0 +1,50 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP
+# define BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_SUB */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SUB(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))
+# else
+#    define BOOST_PP_SUB(x, y) BOOST_PP_SUB_I(x, y)
+#    define BOOST_PP_SUB_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))
+# endif
+#
+# define BOOST_PP_SUB_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I xy
+# else
+#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))
+# endif
+#
+# define BOOST_PP_SUB_O_I(x, y) (BOOST_PP_DEC(x), BOOST_PP_DEC(y))
+#
+# /* BOOST_PP_SUB_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))
+# else
+#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_SUB_D_I(d, x, y)
+#    define BOOST_PP_SUB_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array.hpp b/gatb-core/thirdparty/boost/preprocessor/array.hpp
new file mode 100644
index 0000000..3b6a771
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array.hpp
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_HPP
+# define BOOST_PREPROCESSOR_ARRAY_HPP
+#
+# include <boost/preprocessor/array/data.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/enum.hpp>
+# include <boost/preprocessor/array/insert.hpp>
+# include <boost/preprocessor/array/pop_back.hpp>
+# include <boost/preprocessor/array/pop_front.hpp>
+# include <boost/preprocessor/array/push_back.hpp>
+# include <boost/preprocessor/array/push_front.hpp>
+# include <boost/preprocessor/array/remove.hpp>
+# include <boost/preprocessor/array/replace.hpp>
+# include <boost/preprocessor/array/reverse.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/array/to_list.hpp>
+# include <boost/preprocessor/array/to_seq.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/data.hpp b/gatb-core/thirdparty/boost/preprocessor/array/data.hpp
new file mode 100644
index 0000000..10c926a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/data.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_DATA_HPP
+# define BOOST_PREPROCESSOR_ARRAY_DATA_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_DATA */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_TUPLE_ELEM(2, 1, array)
+# else
+#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_ARRAY_DATA_I(array)
+#    define BOOST_PP_ARRAY_DATA_I(array) BOOST_PP_ARRAY_DATA_II array
+#    define BOOST_PP_ARRAY_DATA_II(size, data) data
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/elem.hpp b/gatb-core/thirdparty/boost/preprocessor/array/elem.hpp
new file mode 100644
index 0000000..105ba24
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/elem.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_ELEM_HPP
+# define BOOST_PREPROCESSOR_ARRAY_ELEM_HPP
+#
+# include <boost/preprocessor/array/data.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_ELEM */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))
+# else
+#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_ARRAY_ELEM_I(i, array)
+#    define BOOST_PP_ARRAY_ELEM_I(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/array/enum.hpp
new file mode 100644
index 0000000..9710f9c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/enum.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_ENUM_HPP
+# define BOOST_PREPROCESSOR_ARRAY_ENUM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ARRAY_ENUM */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_ARRAY_ENUM_I(BOOST_PP_TUPLE_REM_CTOR, array)
+#    define BOOST_PP_ARRAY_ENUM_I(m, args) BOOST_PP_ARRAY_ENUM_II(m, args)
+#    define BOOST_PP_ARRAY_ENUM_II(m, args) BOOST_PP_CAT(m ## args,)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_ARRAY_ENUM_I(array)
+#    define BOOST_PP_ARRAY_ENUM_I(array) BOOST_PP_TUPLE_REM_CTOR ## array
+# else
+#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_TUPLE_REM_CTOR array
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/insert.hpp b/gatb-core/thirdparty/boost/preprocessor/array/insert.hpp
new file mode 100644
index 0000000..b8fe5b8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/insert.hpp
@@ -0,0 +1,55 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_INSERT_HPP
+# define BOOST_PREPROCESSOR_ARRAY_INSERT_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/push_back.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/comparison/not_equal.hpp>
+# include <boost/preprocessor/control/deduce_d.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_INSERT */
+#
+# define BOOST_PP_ARRAY_INSERT(array, i, elem) BOOST_PP_ARRAY_INSERT_I(BOOST_PP_DEDUCE_D(), array, i, elem)
+# define BOOST_PP_ARRAY_INSERT_I(d, array, i, elem) BOOST_PP_ARRAY_INSERT_D(d, array, i, elem)
+#
+# /* BOOST_PP_ARRAY_INSERT_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_INSERT_D(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_INSERT_P, BOOST_PP_ARRAY_INSERT_O, (0, i, elem, (0, ()), array)))
+# else
+#    define BOOST_PP_ARRAY_INSERT_D(d, array, i, elem) BOOST_PP_ARRAY_INSERT_D_I(d, array, i, elem)
+#    define BOOST_PP_ARRAY_INSERT_D_I(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_INSERT_P, BOOST_PP_ARRAY_INSERT_O, (0, i, elem, (0, ()), array)))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ARRAY_INSERT_P(d, state) BOOST_PP_ARRAY_INSERT_P_I state
+# else
+#    define BOOST_PP_ARRAY_INSERT_P(d, state) BOOST_PP_ARRAY_INSERT_P_I(nil, nil, nil, BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))
+# endif
+#
+# define BOOST_PP_ARRAY_INSERT_P_I(_i, _ii, _iii, res, arr) BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), BOOST_PP_INC(BOOST_PP_ARRAY_SIZE(arr)))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ARRAY_INSERT_O(d, state) BOOST_PP_ARRAY_INSERT_O_I state
+# else
+#    define BOOST_PP_ARRAY_INSERT_O(d, state) BOOST_PP_ARRAY_INSERT_O_I(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_TUPLE_ELEM(5, 1, state), BOOST_PP_TUPLE_ELEM(5, 2, state), BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))
+# endif
+#
+# define BOOST_PP_ARRAY_INSERT_O_I(n, i, elem, res, arr) (BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), i), BOOST_PP_INC(n), n), i, elem, BOOST_PP_ARRAY_PUSH_BACK(res, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), i), BOOST_PP_ARRAY_ELEM(n, arr), elem)), arr)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/pop_back.hpp b/gatb-core/thirdparty/boost/preprocessor/array/pop_back.hpp
new file mode 100644
index 0000000..29d2a45
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/pop_back.hpp
@@ -0,0 +1,37 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_POP_BACK_HPP
+# define BOOST_PREPROCESSOR_ARRAY_POP_BACK_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/repetition/deduce_z.hpp>
+#
+# /* BOOST_PP_ARRAY_POP_BACK */
+#
+# define BOOST_PP_ARRAY_POP_BACK(array) BOOST_PP_ARRAY_POP_BACK_Z(BOOST_PP_DEDUCE_Z(), array)
+#
+# /* BOOST_PP_ARRAY_POP_BACK_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_POP_BACK_Z(z, array) BOOST_PP_ARRAY_POP_BACK_I(z, BOOST_PP_ARRAY_SIZE(array), array)
+# else
+#    define BOOST_PP_ARRAY_POP_BACK_Z(z, array) BOOST_PP_ARRAY_POP_BACK_Z_D(z, array)
+#    define BOOST_PP_ARRAY_POP_BACK_Z_D(z, array) BOOST_PP_ARRAY_POP_BACK_I(z, BOOST_PP_ARRAY_SIZE(array), array)
+# endif
+#
+# define BOOST_PP_ARRAY_POP_BACK_I(z, size, array) (BOOST_PP_DEC(size), (BOOST_PP_ENUM_ ## z(BOOST_PP_DEC(size), BOOST_PP_ARRAY_POP_BACK_M, array)))
+# define BOOST_PP_ARRAY_POP_BACK_M(z, n, data) BOOST_PP_ARRAY_ELEM(n, data)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/pop_front.hpp b/gatb-core/thirdparty/boost/preprocessor/array/pop_front.hpp
new file mode 100644
index 0000000..7d9069c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/pop_front.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_POP_FRONT_HPP
+# define BOOST_PREPROCESSOR_ARRAY_POP_FRONT_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/repetition/deduce_z.hpp>
+#
+# /* BOOST_PP_ARRAY_POP_FRONT */
+#
+# define BOOST_PP_ARRAY_POP_FRONT(array) BOOST_PP_ARRAY_POP_FRONT_Z(BOOST_PP_DEDUCE_Z(), array)
+#
+# /* BOOST_PP_ARRAY_POP_FRONT_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_POP_FRONT_Z(z, array) BOOST_PP_ARRAY_POP_FRONT_I(z, BOOST_PP_ARRAY_SIZE(array), array)
+# else
+#    define BOOST_PP_ARRAY_POP_FRONT_Z(z, array) BOOST_PP_ARRAY_POP_FRONT_Z_D(z, array)
+#    define BOOST_PP_ARRAY_POP_FRONT_Z_D(z, array) BOOST_PP_ARRAY_POP_FRONT_I(z, BOOST_PP_ARRAY_SIZE(array), array)
+# endif
+#
+# define BOOST_PP_ARRAY_POP_FRONT_I(z, size, array) (BOOST_PP_DEC(size), (BOOST_PP_ENUM_ ## z(BOOST_PP_DEC(size), BOOST_PP_ARRAY_POP_FRONT_M, array)))
+# define BOOST_PP_ARRAY_POP_FRONT_M(z, n, data) BOOST_PP_ARRAY_ELEM(BOOST_PP_INC(n), data)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/push_back.hpp b/gatb-core/thirdparty/boost/preprocessor/array/push_back.hpp
new file mode 100644
index 0000000..6d98d8e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/push_back.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_PUSH_BACK_HPP
+# define BOOST_PREPROCESSOR_ARRAY_PUSH_BACK_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/data.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ARRAY_PUSH_BACK */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_PUSH_BACK(array, elem) BOOST_PP_ARRAY_PUSH_BACK_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+# else
+#    define BOOST_PP_ARRAY_PUSH_BACK(array, elem) BOOST_PP_ARRAY_PUSH_BACK_D(array, elem)
+#    define BOOST_PP_ARRAY_PUSH_BACK_D(array, elem) BOOST_PP_ARRAY_PUSH_BACK_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+# endif
+#
+# define BOOST_PP_ARRAY_PUSH_BACK_I(size, data, elem) (BOOST_PP_INC(size), (BOOST_PP_TUPLE_REM(size) data BOOST_PP_COMMA_IF(size) elem))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/push_front.hpp b/gatb-core/thirdparty/boost/preprocessor/array/push_front.hpp
new file mode 100644
index 0000000..59344c3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/push_front.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_PUSH_FRONT_HPP
+# define BOOST_PREPROCESSOR_ARRAY_PUSH_FRONT_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/data.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ARRAY_PUSH_FRONT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_PUSH_FRONT(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+# else
+#    define BOOST_PP_ARRAY_PUSH_FRONT(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_D(array, elem)
+#    define BOOST_PP_ARRAY_PUSH_FRONT_D(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+# endif
+#
+# define BOOST_PP_ARRAY_PUSH_FRONT_I(size, data, elem) (BOOST_PP_INC(size), (elem BOOST_PP_COMMA_IF(size) BOOST_PP_TUPLE_REM(size) data))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/remove.hpp b/gatb-core/thirdparty/boost/preprocessor/array/remove.hpp
new file mode 100644
index 0000000..0260900
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/remove.hpp
@@ -0,0 +1,54 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_REMOVE_HPP
+# define BOOST_PREPROCESSOR_ARRAY_REMOVE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/push_back.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/comparison/not_equal.hpp>
+# include <boost/preprocessor/control/deduce_d.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_REMOVE */
+#
+# define BOOST_PP_ARRAY_REMOVE(array, i) BOOST_PP_ARRAY_REMOVE_I(BOOST_PP_DEDUCE_D(), array, i)
+# define BOOST_PP_ARRAY_REMOVE_I(d, array, i) BOOST_PP_ARRAY_REMOVE_D(d, array, i)
+#
+# /* BOOST_PP_ARRAY_REMOVE_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_REMOVE_D(d, array, i) BOOST_PP_TUPLE_ELEM(4, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REMOVE_P, BOOST_PP_ARRAY_REMOVE_O, (0, i, (0, ()), array)))
+# else
+#    define BOOST_PP_ARRAY_REMOVE_D(d, array, i) BOOST_PP_ARRAY_REMOVE_D_I(d, array, i)
+#    define BOOST_PP_ARRAY_REMOVE_D_I(d, array, i) BOOST_PP_TUPLE_ELEM(4, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REMOVE_P, BOOST_PP_ARRAY_REMOVE_O, (0, i, (0, ()), array)))
+# endif
+#
+# define BOOST_PP_ARRAY_REMOVE_P(d, st) BOOST_PP_NOT_EQUAL(BOOST_PP_TUPLE_ELEM(4, 0, st), BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(4, 3, st)))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ARRAY_REMOVE_O(d, st) BOOST_PP_ARRAY_REMOVE_O_I st
+# else
+#    define BOOST_PP_ARRAY_REMOVE_O(d, st) BOOST_PP_ARRAY_REMOVE_O_I(BOOST_PP_TUPLE_ELEM(4, 0, st), BOOST_PP_TUPLE_ELEM(4, 1, st), BOOST_PP_TUPLE_ELEM(4, 2, st), BOOST_PP_TUPLE_ELEM(4, 3, st))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_ARRAY_REMOVE_O_I(n, i, res, arr) (BOOST_PP_INC(n), i, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_PUSH_BACK, res BOOST_PP_TUPLE_EAT_2)(res, BOOST_PP_ARRAY_ELEM(n, arr)), arr)
+# else
+#    define BOOST_PP_ARRAY_REMOVE_O_I(n, i, res, arr) (BOOST_PP_INC(n), i, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_PUSH_BACK, BOOST_PP_TUPLE_ELEM_2_0)(res, BOOST_PP_ARRAY_ELEM(n, arr)), arr)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/replace.hpp b/gatb-core/thirdparty/boost/preprocessor/array/replace.hpp
new file mode 100644
index 0000000..10a1f09
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/replace.hpp
@@ -0,0 +1,49 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_REPLACE_HPP
+# define BOOST_PREPROCESSOR_ARRAY_REPLACE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/push_back.hpp>
+# include <boost/preprocessor/comparison/not_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/deduce_d.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_REPLACE */
+#
+# define BOOST_PP_ARRAY_REPLACE(array, i, elem) BOOST_PP_ARRAY_REPLACE_I(BOOST_PP_DEDUCE_D(), array, i, elem)
+# define BOOST_PP_ARRAY_REPLACE_I(d, array, i, elem) BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem)
+#
+# /* BOOST_PP_ARRAY_REPLACE_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REPLACE_P, BOOST_PP_ARRAY_REPLACE_O, (0, i, elem, (0, ()), array)))
+# else
+#    define BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem) BOOST_PP_ARRAY_REPLACE_D_I(d, array, i, elem)
+#    define BOOST_PP_ARRAY_REPLACE_D_I(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REPLACE_P, BOOST_PP_ARRAY_REPLACE_O, (0, i, elem, (0, ()), array)))
+# endif
+#
+# define BOOST_PP_ARRAY_REPLACE_P(d, state) BOOST_PP_NOT_EQUAL(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(5, 4, state)))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ARRAY_REPLACE_O(d, state) BOOST_PP_ARRAY_REPLACE_O_I state
+# else
+#    define BOOST_PP_ARRAY_REPLACE_O(d, state) BOOST_PP_ARRAY_REPLACE_O_I(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_TUPLE_ELEM(5, 1, state), BOOST_PP_TUPLE_ELEM(5, 2, state), BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))
+# endif
+#
+# define BOOST_PP_ARRAY_REPLACE_O_I(n, i, elem, res, arr) (BOOST_PP_INC(n), i, elem, BOOST_PP_ARRAY_PUSH_BACK(res, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_ELEM(n, arr), elem)), arr)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/reverse.hpp b/gatb-core/thirdparty/boost/preprocessor/array/reverse.hpp
new file mode 100644
index 0000000..a6a4f75
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/reverse.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_REVERSE_HPP
+# define BOOST_PREPROCESSOR_ARRAY_REVERSE_HPP
+#
+# include <boost/preprocessor/array/data.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/reverse.hpp>
+#
+# /* BOOST_PP_ARRAY_REVERSE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_REVERSE(array) (BOOST_PP_ARRAY_SIZE(array), BOOST_PP_TUPLE_REVERSE(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array)))
+# else
+#    define BOOST_PP_ARRAY_REVERSE(array) BOOST_PP_ARRAY_REVERSE_I(array)
+#    define BOOST_PP_ARRAY_REVERSE_I(array) (BOOST_PP_ARRAY_SIZE(array), BOOST_PP_TUPLE_REVERSE(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/size.hpp b/gatb-core/thirdparty/boost/preprocessor/array/size.hpp
new file mode 100644
index 0000000..3f370ee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/size.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_SIZE_HPP
+# define BOOST_PREPROCESSOR_ARRAY_SIZE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ARRAY_SIZE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_TUPLE_ELEM(2, 0, array)
+# else
+#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_ARRAY_SIZE_I(array)
+#    define BOOST_PP_ARRAY_SIZE_I(array) BOOST_PP_ARRAY_SIZE_II array
+#    define BOOST_PP_ARRAY_SIZE_II(size, data) size
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/to_list.hpp b/gatb-core/thirdparty/boost/preprocessor/array/to_list.hpp
new file mode 100644
index 0000000..9198561
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/to_list.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_TO_LIST_HPP
+# define BOOST_PREPROCESSOR_ARRAY_TO_LIST_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/to_list.hpp>
+#
+# /* BOOST_PP_ARRAY_TO_LIST */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_ARRAY_TO_LIST_I(BOOST_PP_TUPLE_TO_LIST, array)
+#    define BOOST_PP_ARRAY_TO_LIST_I(m, args) BOOST_PP_ARRAY_TO_LIST_II(m, args)
+#    define BOOST_PP_ARRAY_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_ARRAY_TO_LIST_I(array)
+#    define BOOST_PP_ARRAY_TO_LIST_I(array) BOOST_PP_TUPLE_TO_LIST ## array
+# else
+#    define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_TUPLE_TO_LIST array
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/to_seq.hpp b/gatb-core/thirdparty/boost/preprocessor/array/to_seq.hpp
new file mode 100644
index 0000000..ebcae53
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/to_seq.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_TO_SEQ_HPP
+# define BOOST_PREPROCESSOR_ARRAY_TO_SEQ_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/to_seq.hpp>
+#
+# /* BOOST_PP_ARRAY_TO_SEQ */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_ARRAY_TO_SEQ_I(BOOST_PP_TUPLE_TO_SEQ, array)
+#    define BOOST_PP_ARRAY_TO_SEQ_I(m, args) BOOST_PP_ARRAY_TO_SEQ_II(m, args)
+#    define BOOST_PP_ARRAY_TO_SEQ_II(m, args) BOOST_PP_CAT(m ## args,)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_ARRAY_TO_SEQ_I(array)
+#    define BOOST_PP_ARRAY_TO_SEQ_I(array) BOOST_PP_TUPLE_TO_SEQ ## array
+# else
+#    define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_TUPLE_TO_SEQ array
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/array/to_tuple.hpp b/gatb-core/thirdparty/boost/preprocessor/array/to_tuple.hpp
new file mode 100644
index 0000000..eb83274
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/array/to_tuple.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_TO_TUPLE_HPP
+# define BOOST_PREPROCESSOR_ARRAY_TO_TUPLE_HPP
+#
+# include <boost/preprocessor/array/data.hpp>
+#
+# /* BOOST_PP_ARRAY_TO_TUPLE */
+#
+# define BOOST_PP_ARRAY_TO_TUPLE BOOST_PP_ARRAY_DATA
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/assert_msg.hpp b/gatb-core/thirdparty/boost/preprocessor/assert_msg.hpp
new file mode 100644
index 0000000..924dba1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/assert_msg.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ASSERT_MSG_HPP
+# define BOOST_PREPROCESSOR_ASSERT_MSG_HPP
+#
+# include <boost/preprocessor/debug/assert.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/cat.hpp b/gatb-core/thirdparty/boost/preprocessor/cat.hpp
new file mode 100644
index 0000000..5e52850
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/cat.hpp
@@ -0,0 +1,35 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CAT_HPP
+# define BOOST_PREPROCESSOR_CAT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_CAT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
+# else
+#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_OO((a, b))
+#    define BOOST_PP_CAT_OO(par) BOOST_PP_CAT_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_CAT_I(a, b) a ## b
+# else
+#    define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a ## b)
+#    define BOOST_PP_CAT_II(p, res) res
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comma.hpp b/gatb-core/thirdparty/boost/preprocessor/comma.hpp
new file mode 100644
index 0000000..6e02fb6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comma.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMMA_HPP
+# define BOOST_PREPROCESSOR_COMMA_HPP
+#
+# include <boost/preprocessor/punctuation/comma.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comma_if.hpp b/gatb-core/thirdparty/boost/preprocessor/comma_if.hpp
new file mode 100644
index 0000000..9ceb079
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comma_if.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMMA_IF_HPP
+# define BOOST_PREPROCESSOR_COMMA_IF_HPP
+#
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison.hpp
new file mode 100644
index 0000000..b09ac8f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison.hpp
@@ -0,0 +1,24 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_HPP
+#
+# include <boost/preprocessor/comparison/equal.hpp>
+# include <boost/preprocessor/comparison/greater.hpp>
+# include <boost/preprocessor/comparison/greater_equal.hpp>
+# include <boost/preprocessor/comparison/less.hpp>
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/comparison/not_equal.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/equal.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/equal.hpp
new file mode 100644
index 0000000..d299efe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/equal.hpp
@@ -0,0 +1,34 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP
+#
+# include <boost/preprocessor/comparison/not_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/compl.hpp>
+#
+# /* BOOST_PP_EQUAL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_EQUAL(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))
+# else
+#    define BOOST_PP_EQUAL(x, y) BOOST_PP_EQUAL_I(x, y)
+#    define BOOST_PP_EQUAL_I(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))
+# endif
+#
+# /* BOOST_PP_EQUAL_D */
+#
+# define BOOST_PP_EQUAL_D(d, x, y) BOOST_PP_EQUAL(x, y)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/greater.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/greater.hpp
new file mode 100644
index 0000000..83d2fcf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/greater.hpp
@@ -0,0 +1,38 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_GREATER_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_GREATER_HPP
+#
+# include <boost/preprocessor/comparison/less.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_GREATER */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_GREATER(x, y) BOOST_PP_LESS(y, x)
+# else
+#    define BOOST_PP_GREATER(x, y) BOOST_PP_GREATER_I(x, y)
+#    define BOOST_PP_GREATER_I(x, y) BOOST_PP_LESS(y, x)
+# endif
+#
+# /* BOOST_PP_GREATER_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_GREATER_D(d, x, y) BOOST_PP_LESS_D(d, y, x)
+# else
+#    define BOOST_PP_GREATER_D(d, x, y) BOOST_PP_GREATER_D_I(d, x, y)
+#    define BOOST_PP_GREATER_D_I(d, x, y) BOOST_PP_LESS_D(d, y, x)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/greater_equal.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/greater_equal.hpp
new file mode 100644
index 0000000..beaeaff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/greater_equal.hpp
@@ -0,0 +1,38 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_GREATER_EQUAL_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_GREATER_EQUAL_HPP
+#
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_GREATER_EQUAL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_GREATER_EQUAL(x, y) BOOST_PP_LESS_EQUAL(y, x)
+# else
+#    define BOOST_PP_GREATER_EQUAL(x, y) BOOST_PP_GREATER_EQUAL_I(x, y)
+#    define BOOST_PP_GREATER_EQUAL_I(x, y) BOOST_PP_LESS_EQUAL(y, x)
+# endif
+#
+# /* BOOST_PP_GREATER_EQUAL_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_GREATER_EQUAL_D(d, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)
+# else
+#    define BOOST_PP_GREATER_EQUAL_D(d, x, y) BOOST_PP_GREATER_EQUAL_D_I(d, x, y)
+#    define BOOST_PP_GREATER_EQUAL_D_I(d, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/less.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/less.hpp
new file mode 100644
index 0000000..d91ea3d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/less.hpp
@@ -0,0 +1,46 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_LESS_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_LESS_HPP
+#
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/comparison/not_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bitand.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# /* BOOST_PP_LESS */
+#
+# if BOOST_PP_CONFIG_FLAGS() & (BOOST_PP_CONFIG_MWCC() | BOOST_PP_CONFIG_DMC())
+#    define BOOST_PP_LESS(x, y) BOOST_PP_BITAND(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL(x, y))
+# elif ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LESS(x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL, 0 BOOST_PP_TUPLE_EAT_2)(x, y)
+# else
+#    define BOOST_PP_LESS(x, y) BOOST_PP_LESS_I(x, y)
+#    define BOOST_PP_LESS_I(x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL, 0 BOOST_PP_TUPLE_EAT_2)(x, y)
+# endif
+#
+# /* BOOST_PP_LESS_D */
+#
+# if BOOST_PP_CONFIG_FLAGS() & (BOOST_PP_CONFIG_MWCC() | BOOST_PP_CONFIG_DMC())
+#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_BITAND(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D(d, x, y))
+# elif ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D, 0 BOOST_PP_TUPLE_EAT_3)(d, x, y)
+# else
+#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_LESS_D_I(d, x, y)
+#    define BOOST_PP_LESS_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D, 0 BOOST_PP_TUPLE_EAT_3)(d, x, y)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/less_equal.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/less_equal.hpp
new file mode 100644
index 0000000..1302d54
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/less_equal.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP
+#
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+#
+# /* BOOST_PP_LESS_EQUAL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))
+# else
+#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_LESS_EQUAL_I(x, y)
+#    define BOOST_PP_LESS_EQUAL_I(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))
+# endif
+#
+# /* BOOST_PP_LESS_EQUAL_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))
+# else
+#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_LESS_EQUAL_D_I(d, x, y)
+#    define BOOST_PP_LESS_EQUAL_D_I(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/comparison/not_equal.hpp b/gatb-core/thirdparty/boost/preprocessor/comparison/not_equal.hpp
new file mode 100644
index 0000000..b4b0eae
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/comparison/not_equal.hpp
@@ -0,0 +1,814 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP
+# define BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+#
+# /* BOOST_PP_NOT_EQUAL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_I(x, y)
+# else
+#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_OO((x, y))
+#    define BOOST_PP_NOT_EQUAL_OO(par) BOOST_PP_NOT_EQUAL_I ## par
+# endif
+#
+# define BOOST_PP_NOT_EQUAL_I(x, y) BOOST_PP_CAT(BOOST_PP_NOT_EQUAL_CHECK_, BOOST_PP_NOT_EQUAL_ ## x(0, BOOST_PP_NOT_EQUAL_ ## y))
+#
+# /* BOOST_PP_NOT_EQUAL_D */
+#
+# define BOOST_PP_NOT_EQUAL_D(d, x, y) BOOST_PP_NOT_EQUAL(x, y)
+#
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_0(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_1(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_2(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_3(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_4(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_5(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_6(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_7(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_8(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_9(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_10(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_11(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_12(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_13(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_14(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_15(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_16(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_17(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_18(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_19(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_20(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_21(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_22(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_23(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_24(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_25(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_26(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_27(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_28(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_29(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_30(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_31(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_32(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_33(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_34(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_35(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_36(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_37(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_38(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_39(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_40(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_41(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_42(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_43(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_44(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_45(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_46(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_47(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_48(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_49(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_50(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_51(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_52(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_53(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_54(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_55(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_56(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_57(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_58(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_59(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_60(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_61(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_62(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_63(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_64(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_65(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_66(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_67(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_68(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_69(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_70(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_71(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_72(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_73(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_74(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_75(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_76(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_77(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_78(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_79(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_80(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_81(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_82(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_83(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_84(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_85(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_86(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_87(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_88(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_89(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_90(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_91(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_92(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_93(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_94(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_95(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_96(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_97(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_98(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_99(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_100(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_101(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_102(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_103(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_104(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_105(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_106(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_107(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_108(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_109(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_110(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_111(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_112(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_113(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_114(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_115(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_116(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_117(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_118(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_119(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_120(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_121(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_122(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_123(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_124(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_125(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_126(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_127(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_128(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_129(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_130(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_131(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_132(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_133(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_134(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_135(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_136(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_137(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_138(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_139(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_140(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_141(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_142(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_143(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_144(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_145(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_146(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_147(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_148(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_149(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_150(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_151(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_152(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_153(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_154(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_155(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_156(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_157(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_158(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_159(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_160(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_161(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_162(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_163(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_164(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_165(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_166(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_167(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_168(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_169(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_170(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_171(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_172(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_173(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_174(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_175(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_176(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_177(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_178(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_179(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_180(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_181(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_182(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_183(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_184(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_185(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_186(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_187(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_188(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_189(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_190(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_191(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_192(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_193(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_194(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_195(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_196(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_197(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_198(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_199(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_200(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_201(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_202(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_203(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_204(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_205(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_206(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_207(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_208(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_209(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_210(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_211(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_212(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_213(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_214(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_215(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_216(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_217(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_218(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_219(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_220(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_221(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_222(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_223(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_224(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_225(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_226(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_227(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_228(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_229(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_230(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_231(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_232(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_233(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_234(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_235(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_236(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_237(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_238(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_239(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_240(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_241(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_242(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_243(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_244(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_245(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_246(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_247(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_248(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_249(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_250(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_251(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_252(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_253(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_254(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_255(c, y) 0
+# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_256(c, y) 0
+#
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))
+# else
+#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/config/config.hpp b/gatb-core/thirdparty/boost/preprocessor/config/config.hpp
new file mode 100644
index 0000000..d02eb58
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/config/config.hpp
@@ -0,0 +1,105 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP
+# define BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP
+#
+# /* BOOST_PP_CONFIG_FLAGS */
+#
+# define BOOST_PP_CONFIG_STRICT() 0x0001
+# define BOOST_PP_CONFIG_IDEAL() 0x0002
+#
+# define BOOST_PP_CONFIG_MSVC() 0x0004
+# define BOOST_PP_CONFIG_MWCC() 0x0008
+# define BOOST_PP_CONFIG_BCC() 0x0010
+# define BOOST_PP_CONFIG_EDG() 0x0020
+# define BOOST_PP_CONFIG_DMC() 0x0040
+#
+# ifndef BOOST_PP_CONFIG_FLAGS
+#    if defined(__GCCXML__)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+#    elif defined(__WAVE__)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+#    elif defined(__MWERKS__) && __MWERKS__ >= 0x3200
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+#    elif defined(__EDG__) || defined(__EDG_VERSION__)
+#        if defined(_MSC_VER) && __EDG_VERSION__ >= 308
+#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+#        else
+#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())
+#        endif
+#    elif defined(__MWERKS__)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MWCC())
+#    elif defined(__DMC__)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_DMC())
+#    elif defined(__BORLANDC__) && __BORLANDC__ >= 0x581
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+#    elif defined(__BORLANDC__) || defined(__IBMC__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_BCC())
+#    elif defined(_MSC_VER)
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+#    else
+#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+#    endif
+# endif
+#
+# /* BOOST_PP_CONFIG_EXTENDED_LINE_INFO */
+#
+# ifndef BOOST_PP_CONFIG_EXTENDED_LINE_INFO
+#    define BOOST_PP_CONFIG_EXTENDED_LINE_INFO 0
+# endif
+#
+# /* BOOST_PP_CONFIG_ERRORS */
+#
+# ifndef BOOST_PP_CONFIG_ERRORS
+#    ifdef NDEBUG
+#        define BOOST_PP_CONFIG_ERRORS 0
+#    else
+#        define BOOST_PP_CONFIG_ERRORS 1
+#    endif
+# endif
+#
+# /* BOOST_PP_VARIADICS */
+#
+# if !defined BOOST_PP_VARIADICS
+#    /* variadic support explicitly disabled for all untested compilers */
+#    if defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __clang__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC && !defined __EDG__ || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI
+#        define BOOST_PP_VARIADICS 0
+#    /* VC++ (C/C++) */
+#    elif defined _MSC_VER && _MSC_VER >= 1400 && !defined __EDG__
+#        if _MSC_VER >= 1400
+#            define BOOST_PP_VARIADICS 1
+#            define BOOST_PP_VARIADICS_MSVC 1
+#        else
+#            define BOOST_PP_VARIADICS 0
+#        endif
+#    /* Wave (C/C++), GCC (C++) */
+#    elif defined __WAVE__ && __WAVE_HAS_VARIADICS__ || defined __GNUC__ && __GXX_EXPERIMENTAL_CXX0X__
+#        define BOOST_PP_VARIADICS 1
+#    /* EDG-based (C/C++), GCC (C), and unknown (C/C++) */
+#    elif !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L
+#        define BOOST_PP_VARIADICS 1
+#    else
+#        define BOOST_PP_VARIADICS 0
+#    endif
+# elif !BOOST_PP_VARIADICS + 1 < 2
+#    undef BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADICS 1
+#    if defined _MSC_VER && _MSC_VER >= 1400 && !(defined __EDG__ || defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __clang__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI)
+#        define BOOST_PP_VARIADICS_MSVC 1
+#    endif
+# else
+#    undef BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADICS 0
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/config/limits.hpp b/gatb-core/thirdparty/boost/preprocessor/config/limits.hpp
new file mode 100644
index 0000000..f312f29
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/config/limits.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONFIG_LIMITS_HPP
+# define BOOST_PREPROCESSOR_CONFIG_LIMITS_HPP
+#
+# define BOOST_PP_LIMIT_MAG 256
+# define BOOST_PP_LIMIT_TUPLE 64
+# define BOOST_PP_LIMIT_DIM 3
+# define BOOST_PP_LIMIT_REPEAT 256
+# define BOOST_PP_LIMIT_WHILE 256
+# define BOOST_PP_LIMIT_FOR 256
+# define BOOST_PP_LIMIT_ITERATION 256
+# define BOOST_PP_LIMIT_ITERATION_DIM 3
+# define BOOST_PP_LIMIT_SEQ 256
+# define BOOST_PP_LIMIT_SLOT_SIG 10
+# define BOOST_PP_LIMIT_SLOT_COUNT 5
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control.hpp b/gatb-core/thirdparty/boost/preprocessor/control.hpp
new file mode 100644
index 0000000..809fbd9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_HPP
+# define BOOST_PREPROCESSOR_CONTROL_HPP
+#
+# include <boost/preprocessor/control/deduce_d.hpp>
+# include <boost/preprocessor/control/expr_if.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/control/while.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/deduce_d.hpp b/gatb-core/thirdparty/boost/preprocessor/control/deduce_d.hpp
new file mode 100644
index 0000000..a0276b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/deduce_d.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_DEDUCE_D_HPP
+# define BOOST_PREPROCESSOR_CONTROL_DEDUCE_D_HPP
+#
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+#
+# /* BOOST_PP_DEDUCE_D */
+#
+# define BOOST_PP_DEDUCE_D() BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/detail/dmc/while.hpp b/gatb-core/thirdparty/boost/preprocessor/control/detail/dmc/while.hpp
new file mode 100644
index 0000000..95c3135
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/detail/dmc/while.hpp
@@ -0,0 +1,536 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP
+# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p##(2, s)), p, o, s)
+# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p##(3, s)), p, o, s)
+# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p##(4, s)), p, o, s)
+# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p##(5, s)), p, o, s)
+# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p##(6, s)), p, o, s)
+# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p##(7, s)), p, o, s)
+# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p##(8, s)), p, o, s)
+# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p##(9, s)), p, o, s)
+# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p##(10, s)), p, o, s)
+# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p##(11, s)), p, o, s)
+# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p##(12, s)), p, o, s)
+# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p##(13, s)), p, o, s)
+# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p##(14, s)), p, o, s)
+# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p##(15, s)), p, o, s)
+# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p##(16, s)), p, o, s)
+# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p##(17, s)), p, o, s)
+# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p##(18, s)), p, o, s)
+# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p##(19, s)), p, o, s)
+# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p##(20, s)), p, o, s)
+# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p##(21, s)), p, o, s)
+# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p##(22, s)), p, o, s)
+# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p##(23, s)), p, o, s)
+# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p##(24, s)), p, o, s)
+# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p##(25, s)), p, o, s)
+# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p##(26, s)), p, o, s)
+# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p##(27, s)), p, o, s)
+# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p##(28, s)), p, o, s)
+# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p##(29, s)), p, o, s)
+# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p##(30, s)), p, o, s)
+# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p##(31, s)), p, o, s)
+# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p##(32, s)), p, o, s)
+# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p##(33, s)), p, o, s)
+# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p##(34, s)), p, o, s)
+# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p##(35, s)), p, o, s)
+# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p##(36, s)), p, o, s)
+# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p##(37, s)), p, o, s)
+# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p##(38, s)), p, o, s)
+# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p##(39, s)), p, o, s)
+# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p##(40, s)), p, o, s)
+# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p##(41, s)), p, o, s)
+# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p##(42, s)), p, o, s)
+# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p##(43, s)), p, o, s)
+# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p##(44, s)), p, o, s)
+# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p##(45, s)), p, o, s)
+# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p##(46, s)), p, o, s)
+# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p##(47, s)), p, o, s)
+# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p##(48, s)), p, o, s)
+# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p##(49, s)), p, o, s)
+# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p##(50, s)), p, o, s)
+# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p##(51, s)), p, o, s)
+# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p##(52, s)), p, o, s)
+# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p##(53, s)), p, o, s)
+# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p##(54, s)), p, o, s)
+# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p##(55, s)), p, o, s)
+# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p##(56, s)), p, o, s)
+# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p##(57, s)), p, o, s)
+# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p##(58, s)), p, o, s)
+# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p##(59, s)), p, o, s)
+# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p##(60, s)), p, o, s)
+# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p##(61, s)), p, o, s)
+# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p##(62, s)), p, o, s)
+# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p##(63, s)), p, o, s)
+# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p##(64, s)), p, o, s)
+# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p##(65, s)), p, o, s)
+# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p##(66, s)), p, o, s)
+# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p##(67, s)), p, o, s)
+# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p##(68, s)), p, o, s)
+# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p##(69, s)), p, o, s)
+# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p##(70, s)), p, o, s)
+# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p##(71, s)), p, o, s)
+# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p##(72, s)), p, o, s)
+# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p##(73, s)), p, o, s)
+# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p##(74, s)), p, o, s)
+# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p##(75, s)), p, o, s)
+# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p##(76, s)), p, o, s)
+# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p##(77, s)), p, o, s)
+# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p##(78, s)), p, o, s)
+# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p##(79, s)), p, o, s)
+# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p##(80, s)), p, o, s)
+# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p##(81, s)), p, o, s)
+# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p##(82, s)), p, o, s)
+# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p##(83, s)), p, o, s)
+# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p##(84, s)), p, o, s)
+# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p##(85, s)), p, o, s)
+# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p##(86, s)), p, o, s)
+# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p##(87, s)), p, o, s)
+# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p##(88, s)), p, o, s)
+# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p##(89, s)), p, o, s)
+# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p##(90, s)), p, o, s)
+# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p##(91, s)), p, o, s)
+# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p##(92, s)), p, o, s)
+# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p##(93, s)), p, o, s)
+# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p##(94, s)), p, o, s)
+# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p##(95, s)), p, o, s)
+# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p##(96, s)), p, o, s)
+# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p##(97, s)), p, o, s)
+# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p##(98, s)), p, o, s)
+# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p##(99, s)), p, o, s)
+# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p##(100, s)), p, o, s)
+# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p##(101, s)), p, o, s)
+# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p##(102, s)), p, o, s)
+# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p##(103, s)), p, o, s)
+# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p##(104, s)), p, o, s)
+# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p##(105, s)), p, o, s)
+# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p##(106, s)), p, o, s)
+# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p##(107, s)), p, o, s)
+# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p##(108, s)), p, o, s)
+# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p##(109, s)), p, o, s)
+# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p##(110, s)), p, o, s)
+# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p##(111, s)), p, o, s)
+# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p##(112, s)), p, o, s)
+# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p##(113, s)), p, o, s)
+# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p##(114, s)), p, o, s)
+# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p##(115, s)), p, o, s)
+# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p##(116, s)), p, o, s)
+# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p##(117, s)), p, o, s)
+# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p##(118, s)), p, o, s)
+# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p##(119, s)), p, o, s)
+# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p##(120, s)), p, o, s)
+# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p##(121, s)), p, o, s)
+# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p##(122, s)), p, o, s)
+# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p##(123, s)), p, o, s)
+# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p##(124, s)), p, o, s)
+# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p##(125, s)), p, o, s)
+# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p##(126, s)), p, o, s)
+# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p##(127, s)), p, o, s)
+# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p##(128, s)), p, o, s)
+# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p##(129, s)), p, o, s)
+# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p##(130, s)), p, o, s)
+# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p##(131, s)), p, o, s)
+# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p##(132, s)), p, o, s)
+# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p##(133, s)), p, o, s)
+# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p##(134, s)), p, o, s)
+# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p##(135, s)), p, o, s)
+# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p##(136, s)), p, o, s)
+# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p##(137, s)), p, o, s)
+# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p##(138, s)), p, o, s)
+# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p##(139, s)), p, o, s)
+# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p##(140, s)), p, o, s)
+# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p##(141, s)), p, o, s)
+# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p##(142, s)), p, o, s)
+# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p##(143, s)), p, o, s)
+# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p##(144, s)), p, o, s)
+# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p##(145, s)), p, o, s)
+# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p##(146, s)), p, o, s)
+# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p##(147, s)), p, o, s)
+# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p##(148, s)), p, o, s)
+# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p##(149, s)), p, o, s)
+# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p##(150, s)), p, o, s)
+# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p##(151, s)), p, o, s)
+# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p##(152, s)), p, o, s)
+# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p##(153, s)), p, o, s)
+# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p##(154, s)), p, o, s)
+# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p##(155, s)), p, o, s)
+# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p##(156, s)), p, o, s)
+# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p##(157, s)), p, o, s)
+# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p##(158, s)), p, o, s)
+# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p##(159, s)), p, o, s)
+# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p##(160, s)), p, o, s)
+# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p##(161, s)), p, o, s)
+# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p##(162, s)), p, o, s)
+# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p##(163, s)), p, o, s)
+# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p##(164, s)), p, o, s)
+# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p##(165, s)), p, o, s)
+# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p##(166, s)), p, o, s)
+# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p##(167, s)), p, o, s)
+# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p##(168, s)), p, o, s)
+# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p##(169, s)), p, o, s)
+# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p##(170, s)), p, o, s)
+# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p##(171, s)), p, o, s)
+# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p##(172, s)), p, o, s)
+# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p##(173, s)), p, o, s)
+# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p##(174, s)), p, o, s)
+# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p##(175, s)), p, o, s)
+# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p##(176, s)), p, o, s)
+# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p##(177, s)), p, o, s)
+# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p##(178, s)), p, o, s)
+# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p##(179, s)), p, o, s)
+# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p##(180, s)), p, o, s)
+# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p##(181, s)), p, o, s)
+# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p##(182, s)), p, o, s)
+# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p##(183, s)), p, o, s)
+# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p##(184, s)), p, o, s)
+# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p##(185, s)), p, o, s)
+# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p##(186, s)), p, o, s)
+# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p##(187, s)), p, o, s)
+# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p##(188, s)), p, o, s)
+# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p##(189, s)), p, o, s)
+# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p##(190, s)), p, o, s)
+# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p##(191, s)), p, o, s)
+# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p##(192, s)), p, o, s)
+# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p##(193, s)), p, o, s)
+# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p##(194, s)), p, o, s)
+# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p##(195, s)), p, o, s)
+# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p##(196, s)), p, o, s)
+# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p##(197, s)), p, o, s)
+# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p##(198, s)), p, o, s)
+# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p##(199, s)), p, o, s)
+# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p##(200, s)), p, o, s)
+# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p##(201, s)), p, o, s)
+# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p##(202, s)), p, o, s)
+# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p##(203, s)), p, o, s)
+# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p##(204, s)), p, o, s)
+# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p##(205, s)), p, o, s)
+# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p##(206, s)), p, o, s)
+# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p##(207, s)), p, o, s)
+# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p##(208, s)), p, o, s)
+# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p##(209, s)), p, o, s)
+# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p##(210, s)), p, o, s)
+# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p##(211, s)), p, o, s)
+# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p##(212, s)), p, o, s)
+# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p##(213, s)), p, o, s)
+# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p##(214, s)), p, o, s)
+# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p##(215, s)), p, o, s)
+# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p##(216, s)), p, o, s)
+# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p##(217, s)), p, o, s)
+# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p##(218, s)), p, o, s)
+# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p##(219, s)), p, o, s)
+# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p##(220, s)), p, o, s)
+# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p##(221, s)), p, o, s)
+# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p##(222, s)), p, o, s)
+# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p##(223, s)), p, o, s)
+# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p##(224, s)), p, o, s)
+# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p##(225, s)), p, o, s)
+# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p##(226, s)), p, o, s)
+# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p##(227, s)), p, o, s)
+# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p##(228, s)), p, o, s)
+# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p##(229, s)), p, o, s)
+# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p##(230, s)), p, o, s)
+# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p##(231, s)), p, o, s)
+# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p##(232, s)), p, o, s)
+# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p##(233, s)), p, o, s)
+# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p##(234, s)), p, o, s)
+# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p##(235, s)), p, o, s)
+# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p##(236, s)), p, o, s)
+# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p##(237, s)), p, o, s)
+# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p##(238, s)), p, o, s)
+# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p##(239, s)), p, o, s)
+# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p##(240, s)), p, o, s)
+# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p##(241, s)), p, o, s)
+# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p##(242, s)), p, o, s)
+# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p##(243, s)), p, o, s)
+# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p##(244, s)), p, o, s)
+# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p##(245, s)), p, o, s)
+# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p##(246, s)), p, o, s)
+# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p##(247, s)), p, o, s)
+# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p##(248, s)), p, o, s)
+# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p##(249, s)), p, o, s)
+# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p##(250, s)), p, o, s)
+# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p##(251, s)), p, o, s)
+# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p##(252, s)), p, o, s)
+# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p##(253, s)), p, o, s)
+# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p##(254, s)), p, o, s)
+# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p##(255, s)), p, o, s)
+# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p##(256, s)), p, o, s)
+# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p##(257, s)), p, o, s)
+#
+# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(2, s))
+# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(3, s))
+# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(4, s))
+# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(5, s))
+# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(6, s))
+# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(7, s))
+# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(8, s))
+# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(9, s))
+# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(10, s))
+# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(11, s))
+# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(12, s))
+# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(13, s))
+# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(14, s))
+# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(15, s))
+# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(16, s))
+# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(17, s))
+# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(18, s))
+# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(19, s))
+# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(20, s))
+# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(21, s))
+# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(22, s))
+# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(23, s))
+# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(24, s))
+# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(25, s))
+# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(26, s))
+# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(27, s))
+# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(28, s))
+# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(29, s))
+# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(30, s))
+# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(31, s))
+# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(32, s))
+# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(33, s))
+# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(34, s))
+# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(35, s))
+# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(36, s))
+# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(37, s))
+# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(38, s))
+# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(39, s))
+# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(40, s))
+# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(41, s))
+# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(42, s))
+# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(43, s))
+# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(44, s))
+# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(45, s))
+# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(46, s))
+# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(47, s))
+# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(48, s))
+# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(49, s))
+# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(50, s))
+# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(51, s))
+# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(52, s))
+# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(53, s))
+# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(54, s))
+# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(55, s))
+# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(56, s))
+# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(57, s))
+# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(58, s))
+# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(59, s))
+# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(60, s))
+# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(61, s))
+# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(62, s))
+# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(63, s))
+# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(64, s))
+# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(65, s))
+# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(66, s))
+# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(67, s))
+# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(68, s))
+# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(69, s))
+# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(70, s))
+# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(71, s))
+# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(72, s))
+# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(73, s))
+# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(74, s))
+# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(75, s))
+# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(76, s))
+# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(77, s))
+# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(78, s))
+# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(79, s))
+# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(80, s))
+# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(81, s))
+# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(82, s))
+# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(83, s))
+# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(84, s))
+# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(85, s))
+# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(86, s))
+# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(87, s))
+# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(88, s))
+# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(89, s))
+# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(90, s))
+# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(91, s))
+# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(92, s))
+# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(93, s))
+# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(94, s))
+# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(95, s))
+# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(96, s))
+# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(97, s))
+# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(98, s))
+# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(99, s))
+# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(100, s))
+# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(101, s))
+# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(102, s))
+# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(103, s))
+# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(104, s))
+# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(105, s))
+# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(106, s))
+# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(107, s))
+# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(108, s))
+# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(109, s))
+# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(110, s))
+# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(111, s))
+# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(112, s))
+# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(113, s))
+# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(114, s))
+# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(115, s))
+# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(116, s))
+# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(117, s))
+# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(118, s))
+# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(119, s))
+# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(120, s))
+# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(121, s))
+# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(122, s))
+# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(123, s))
+# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(124, s))
+# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(125, s))
+# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(126, s))
+# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(127, s))
+# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(128, s))
+# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(129, s))
+# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(130, s))
+# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(131, s))
+# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(132, s))
+# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(133, s))
+# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(134, s))
+# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(135, s))
+# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(136, s))
+# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(137, s))
+# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(138, s))
+# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(139, s))
+# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(140, s))
+# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(141, s))
+# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(142, s))
+# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(143, s))
+# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(144, s))
+# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(145, s))
+# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(146, s))
+# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(147, s))
+# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(148, s))
+# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(149, s))
+# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(150, s))
+# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(151, s))
+# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(152, s))
+# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(153, s))
+# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(154, s))
+# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(155, s))
+# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(156, s))
+# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(157, s))
+# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(158, s))
+# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(159, s))
+# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(160, s))
+# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(161, s))
+# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(162, s))
+# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(163, s))
+# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(164, s))
+# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(165, s))
+# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(166, s))
+# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(167, s))
+# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(168, s))
+# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(169, s))
+# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(170, s))
+# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(171, s))
+# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(172, s))
+# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(173, s))
+# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(174, s))
+# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(175, s))
+# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(176, s))
+# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(177, s))
+# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(178, s))
+# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(179, s))
+# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(180, s))
+# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(181, s))
+# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(182, s))
+# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(183, s))
+# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(184, s))
+# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(185, s))
+# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(186, s))
+# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(187, s))
+# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(188, s))
+# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(189, s))
+# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(190, s))
+# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(191, s))
+# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(192, s))
+# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(193, s))
+# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(194, s))
+# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(195, s))
+# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(196, s))
+# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(197, s))
+# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(198, s))
+# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(199, s))
+# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(200, s))
+# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(201, s))
+# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(202, s))
+# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(203, s))
+# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(204, s))
+# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(205, s))
+# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(206, s))
+# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(207, s))
+# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(208, s))
+# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(209, s))
+# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(210, s))
+# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(211, s))
+# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(212, s))
+# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(213, s))
+# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(214, s))
+# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(215, s))
+# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(216, s))
+# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(217, s))
+# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(218, s))
+# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(219, s))
+# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(220, s))
+# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(221, s))
+# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(222, s))
+# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(223, s))
+# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(224, s))
+# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(225, s))
+# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(226, s))
+# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(227, s))
+# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(228, s))
+# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(229, s))
+# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(230, s))
+# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(231, s))
+# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(232, s))
+# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(233, s))
+# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(234, s))
+# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(235, s))
+# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(236, s))
+# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(237, s))
+# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(238, s))
+# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(239, s))
+# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(240, s))
+# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(241, s))
+# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(242, s))
+# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(243, s))
+# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(244, s))
+# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(245, s))
+# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(246, s))
+# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(247, s))
+# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(248, s))
+# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(249, s))
+# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(250, s))
+# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(251, s))
+# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(252, s))
+# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(253, s))
+# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(254, s))
+# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(255, s))
+# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(256, s))
+# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(257, s))
+#
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/detail/edg/while.hpp b/gatb-core/thirdparty/boost/preprocessor/control/detail/edg/while.hpp
new file mode 100644
index 0000000..ce28eb2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/detail/edg/while.hpp
@@ -0,0 +1,534 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP
+# define BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP
+#
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_I(p, o, s)
+# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_I(p, o, s)
+# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_I(p, o, s)
+# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_I(p, o, s)
+# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_I(p, o, s)
+# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_I(p, o, s)
+# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_I(p, o, s)
+# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_I(p, o, s)
+# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_I(p, o, s)
+# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_I(p, o, s)
+# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_I(p, o, s)
+# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_I(p, o, s)
+# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_I(p, o, s)
+# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_I(p, o, s)
+# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_I(p, o, s)
+# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_I(p, o, s)
+# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_I(p, o, s)
+# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_I(p, o, s)
+# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_I(p, o, s)
+# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_I(p, o, s)
+# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_I(p, o, s)
+# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_I(p, o, s)
+# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_I(p, o, s)
+# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_I(p, o, s)
+# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_I(p, o, s)
+# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_I(p, o, s)
+# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_I(p, o, s)
+# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_I(p, o, s)
+# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_I(p, o, s)
+# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_I(p, o, s)
+# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_I(p, o, s)
+# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_I(p, o, s)
+# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_I(p, o, s)
+# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_I(p, o, s)
+# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_I(p, o, s)
+# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_I(p, o, s)
+# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_I(p, o, s)
+# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_I(p, o, s)
+# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_I(p, o, s)
+# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_I(p, o, s)
+# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_I(p, o, s)
+# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_I(p, o, s)
+# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_I(p, o, s)
+# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_I(p, o, s)
+# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_I(p, o, s)
+# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_I(p, o, s)
+# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_I(p, o, s)
+# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_I(p, o, s)
+# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_I(p, o, s)
+# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_I(p, o, s)
+# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_I(p, o, s)
+# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_I(p, o, s)
+# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_I(p, o, s)
+# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_I(p, o, s)
+# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_I(p, o, s)
+# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_I(p, o, s)
+# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_I(p, o, s)
+# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_I(p, o, s)
+# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_I(p, o, s)
+# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_I(p, o, s)
+# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_I(p, o, s)
+# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_I(p, o, s)
+# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_I(p, o, s)
+# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_I(p, o, s)
+# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_I(p, o, s)
+# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_I(p, o, s)
+# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_I(p, o, s)
+# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_I(p, o, s)
+# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_I(p, o, s)
+# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_I(p, o, s)
+# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_I(p, o, s)
+# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_I(p, o, s)
+# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_I(p, o, s)
+# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_I(p, o, s)
+# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_I(p, o, s)
+# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_I(p, o, s)
+# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_I(p, o, s)
+# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_I(p, o, s)
+# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_I(p, o, s)
+# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_I(p, o, s)
+# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_I(p, o, s)
+# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_I(p, o, s)
+# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_I(p, o, s)
+# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_I(p, o, s)
+# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_I(p, o, s)
+# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_I(p, o, s)
+# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_I(p, o, s)
+# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_I(p, o, s)
+# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_I(p, o, s)
+# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_I(p, o, s)
+# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_I(p, o, s)
+# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_I(p, o, s)
+# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_I(p, o, s)
+# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_I(p, o, s)
+# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_I(p, o, s)
+# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_I(p, o, s)
+# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_I(p, o, s)
+# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_I(p, o, s)
+# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_I(p, o, s)
+# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_I(p, o, s)
+# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_I(p, o, s)
+# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_I(p, o, s)
+# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_I(p, o, s)
+# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_I(p, o, s)
+# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_I(p, o, s)
+# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_I(p, o, s)
+# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_I(p, o, s)
+# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_I(p, o, s)
+# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_I(p, o, s)
+# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_I(p, o, s)
+# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_I(p, o, s)
+# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_I(p, o, s)
+# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_I(p, o, s)
+# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_I(p, o, s)
+# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_I(p, o, s)
+# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_I(p, o, s)
+# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_I(p, o, s)
+# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_I(p, o, s)
+# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_I(p, o, s)
+# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_I(p, o, s)
+# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_I(p, o, s)
+# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_I(p, o, s)
+# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_I(p, o, s)
+# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_I(p, o, s)
+# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_I(p, o, s)
+# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_I(p, o, s)
+# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_I(p, o, s)
+# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_I(p, o, s)
+# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_I(p, o, s)
+# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_I(p, o, s)
+# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_I(p, o, s)
+# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_I(p, o, s)
+# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_I(p, o, s)
+# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_I(p, o, s)
+# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_I(p, o, s)
+# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_I(p, o, s)
+# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_I(p, o, s)
+# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_I(p, o, s)
+# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_I(p, o, s)
+# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_I(p, o, s)
+# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_I(p, o, s)
+# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_I(p, o, s)
+# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_I(p, o, s)
+# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_I(p, o, s)
+# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_I(p, o, s)
+# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_I(p, o, s)
+# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_I(p, o, s)
+# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_I(p, o, s)
+# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_I(p, o, s)
+# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_I(p, o, s)
+# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_I(p, o, s)
+# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_I(p, o, s)
+# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_I(p, o, s)
+# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_I(p, o, s)
+# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_I(p, o, s)
+# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_I(p, o, s)
+# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_I(p, o, s)
+# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_I(p, o, s)
+# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_I(p, o, s)
+# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_I(p, o, s)
+# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_I(p, o, s)
+# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_I(p, o, s)
+# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_I(p, o, s)
+# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_I(p, o, s)
+# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_I(p, o, s)
+# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_I(p, o, s)
+# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_I(p, o, s)
+# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_I(p, o, s)
+# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_I(p, o, s)
+# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_I(p, o, s)
+# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_I(p, o, s)
+# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_I(p, o, s)
+# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_I(p, o, s)
+# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_I(p, o, s)
+# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_I(p, o, s)
+# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_I(p, o, s)
+# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_I(p, o, s)
+# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_I(p, o, s)
+# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_I(p, o, s)
+# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_I(p, o, s)
+# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_I(p, o, s)
+# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_I(p, o, s)
+# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_I(p, o, s)
+# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_I(p, o, s)
+# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_I(p, o, s)
+# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_I(p, o, s)
+# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_I(p, o, s)
+# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_I(p, o, s)
+# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_I(p, o, s)
+# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_I(p, o, s)
+# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_I(p, o, s)
+# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_I(p, o, s)
+# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_I(p, o, s)
+# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_I(p, o, s)
+# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_I(p, o, s)
+# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_I(p, o, s)
+# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_I(p, o, s)
+# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_I(p, o, s)
+# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_I(p, o, s)
+# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_I(p, o, s)
+# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_I(p, o, s)
+# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_I(p, o, s)
+# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_I(p, o, s)
+# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_I(p, o, s)
+# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_I(p, o, s)
+# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_I(p, o, s)
+# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_I(p, o, s)
+# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_I(p, o, s)
+# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_I(p, o, s)
+# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_I(p, o, s)
+# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_I(p, o, s)
+# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_I(p, o, s)
+# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_I(p, o, s)
+# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_I(p, o, s)
+# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_I(p, o, s)
+# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_I(p, o, s)
+# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_I(p, o, s)
+# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_I(p, o, s)
+# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_I(p, o, s)
+# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_I(p, o, s)
+# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_I(p, o, s)
+# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_I(p, o, s)
+# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_I(p, o, s)
+# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_I(p, o, s)
+# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_I(p, o, s)
+# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_I(p, o, s)
+# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_I(p, o, s)
+# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_I(p, o, s)
+# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_I(p, o, s)
+# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_I(p, o, s)
+# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_I(p, o, s)
+# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_I(p, o, s)
+# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_I(p, o, s)
+# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_I(p, o, s)
+# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_I(p, o, s)
+# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_I(p, o, s)
+# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_I(p, o, s)
+# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_I(p, o, s)
+# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_I(p, o, s)
+# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_I(p, o, s)
+# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_I(p, o, s)
+# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_I(p, o, s)
+# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_I(p, o, s)
+# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_I(p, o, s)
+# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_I(p, o, s)
+# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_I(p, o, s)
+# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_I(p, o, s)
+# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_I(p, o, s)
+# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_I(p, o, s)
+# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_I(p, o, s)
+# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_I(p, o, s)
+# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_I(p, o, s)
+# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_I(p, o, s)
+# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_I(p, o, s)
+# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_I(p, o, s)
+# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_I(p, o, s)
+#
+# define BOOST_PP_WHILE_1_I(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))
+# define BOOST_PP_WHILE_2_I(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))
+# define BOOST_PP_WHILE_3_I(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))
+# define BOOST_PP_WHILE_4_I(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))
+# define BOOST_PP_WHILE_5_I(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))
+# define BOOST_PP_WHILE_6_I(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))
+# define BOOST_PP_WHILE_7_I(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))
+# define BOOST_PP_WHILE_8_I(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))
+# define BOOST_PP_WHILE_9_I(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))
+# define BOOST_PP_WHILE_10_I(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))
+# define BOOST_PP_WHILE_11_I(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))
+# define BOOST_PP_WHILE_12_I(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))
+# define BOOST_PP_WHILE_13_I(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))
+# define BOOST_PP_WHILE_14_I(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))
+# define BOOST_PP_WHILE_15_I(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))
+# define BOOST_PP_WHILE_16_I(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))
+# define BOOST_PP_WHILE_17_I(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))
+# define BOOST_PP_WHILE_18_I(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))
+# define BOOST_PP_WHILE_19_I(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))
+# define BOOST_PP_WHILE_20_I(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))
+# define BOOST_PP_WHILE_21_I(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))
+# define BOOST_PP_WHILE_22_I(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))
+# define BOOST_PP_WHILE_23_I(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))
+# define BOOST_PP_WHILE_24_I(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))
+# define BOOST_PP_WHILE_25_I(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))
+# define BOOST_PP_WHILE_26_I(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))
+# define BOOST_PP_WHILE_27_I(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))
+# define BOOST_PP_WHILE_28_I(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))
+# define BOOST_PP_WHILE_29_I(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))
+# define BOOST_PP_WHILE_30_I(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))
+# define BOOST_PP_WHILE_31_I(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))
+# define BOOST_PP_WHILE_32_I(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))
+# define BOOST_PP_WHILE_33_I(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))
+# define BOOST_PP_WHILE_34_I(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))
+# define BOOST_PP_WHILE_35_I(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))
+# define BOOST_PP_WHILE_36_I(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))
+# define BOOST_PP_WHILE_37_I(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))
+# define BOOST_PP_WHILE_38_I(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))
+# define BOOST_PP_WHILE_39_I(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))
+# define BOOST_PP_WHILE_40_I(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))
+# define BOOST_PP_WHILE_41_I(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))
+# define BOOST_PP_WHILE_42_I(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))
+# define BOOST_PP_WHILE_43_I(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))
+# define BOOST_PP_WHILE_44_I(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))
+# define BOOST_PP_WHILE_45_I(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))
+# define BOOST_PP_WHILE_46_I(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))
+# define BOOST_PP_WHILE_47_I(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))
+# define BOOST_PP_WHILE_48_I(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))
+# define BOOST_PP_WHILE_49_I(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))
+# define BOOST_PP_WHILE_50_I(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))
+# define BOOST_PP_WHILE_51_I(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))
+# define BOOST_PP_WHILE_52_I(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))
+# define BOOST_PP_WHILE_53_I(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))
+# define BOOST_PP_WHILE_54_I(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))
+# define BOOST_PP_WHILE_55_I(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))
+# define BOOST_PP_WHILE_56_I(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))
+# define BOOST_PP_WHILE_57_I(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))
+# define BOOST_PP_WHILE_58_I(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))
+# define BOOST_PP_WHILE_59_I(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))
+# define BOOST_PP_WHILE_60_I(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))
+# define BOOST_PP_WHILE_61_I(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))
+# define BOOST_PP_WHILE_62_I(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))
+# define BOOST_PP_WHILE_63_I(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))
+# define BOOST_PP_WHILE_64_I(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))
+# define BOOST_PP_WHILE_65_I(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))
+# define BOOST_PP_WHILE_66_I(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))
+# define BOOST_PP_WHILE_67_I(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))
+# define BOOST_PP_WHILE_68_I(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))
+# define BOOST_PP_WHILE_69_I(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))
+# define BOOST_PP_WHILE_70_I(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))
+# define BOOST_PP_WHILE_71_I(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))
+# define BOOST_PP_WHILE_72_I(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))
+# define BOOST_PP_WHILE_73_I(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))
+# define BOOST_PP_WHILE_74_I(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))
+# define BOOST_PP_WHILE_75_I(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))
+# define BOOST_PP_WHILE_76_I(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))
+# define BOOST_PP_WHILE_77_I(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))
+# define BOOST_PP_WHILE_78_I(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))
+# define BOOST_PP_WHILE_79_I(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))
+# define BOOST_PP_WHILE_80_I(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))
+# define BOOST_PP_WHILE_81_I(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))
+# define BOOST_PP_WHILE_82_I(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))
+# define BOOST_PP_WHILE_83_I(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))
+# define BOOST_PP_WHILE_84_I(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))
+# define BOOST_PP_WHILE_85_I(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))
+# define BOOST_PP_WHILE_86_I(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))
+# define BOOST_PP_WHILE_87_I(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))
+# define BOOST_PP_WHILE_88_I(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))
+# define BOOST_PP_WHILE_89_I(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))
+# define BOOST_PP_WHILE_90_I(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))
+# define BOOST_PP_WHILE_91_I(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))
+# define BOOST_PP_WHILE_92_I(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))
+# define BOOST_PP_WHILE_93_I(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))
+# define BOOST_PP_WHILE_94_I(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))
+# define BOOST_PP_WHILE_95_I(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))
+# define BOOST_PP_WHILE_96_I(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))
+# define BOOST_PP_WHILE_97_I(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))
+# define BOOST_PP_WHILE_98_I(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))
+# define BOOST_PP_WHILE_99_I(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))
+# define BOOST_PP_WHILE_100_I(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))
+# define BOOST_PP_WHILE_101_I(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))
+# define BOOST_PP_WHILE_102_I(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))
+# define BOOST_PP_WHILE_103_I(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))
+# define BOOST_PP_WHILE_104_I(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))
+# define BOOST_PP_WHILE_105_I(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))
+# define BOOST_PP_WHILE_106_I(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))
+# define BOOST_PP_WHILE_107_I(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))
+# define BOOST_PP_WHILE_108_I(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))
+# define BOOST_PP_WHILE_109_I(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))
+# define BOOST_PP_WHILE_110_I(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))
+# define BOOST_PP_WHILE_111_I(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))
+# define BOOST_PP_WHILE_112_I(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))
+# define BOOST_PP_WHILE_113_I(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))
+# define BOOST_PP_WHILE_114_I(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))
+# define BOOST_PP_WHILE_115_I(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))
+# define BOOST_PP_WHILE_116_I(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))
+# define BOOST_PP_WHILE_117_I(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))
+# define BOOST_PP_WHILE_118_I(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))
+# define BOOST_PP_WHILE_119_I(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))
+# define BOOST_PP_WHILE_120_I(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))
+# define BOOST_PP_WHILE_121_I(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))
+# define BOOST_PP_WHILE_122_I(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))
+# define BOOST_PP_WHILE_123_I(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))
+# define BOOST_PP_WHILE_124_I(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))
+# define BOOST_PP_WHILE_125_I(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))
+# define BOOST_PP_WHILE_126_I(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))
+# define BOOST_PP_WHILE_127_I(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))
+# define BOOST_PP_WHILE_128_I(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))
+# define BOOST_PP_WHILE_129_I(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))
+# define BOOST_PP_WHILE_130_I(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))
+# define BOOST_PP_WHILE_131_I(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))
+# define BOOST_PP_WHILE_132_I(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))
+# define BOOST_PP_WHILE_133_I(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))
+# define BOOST_PP_WHILE_134_I(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))
+# define BOOST_PP_WHILE_135_I(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))
+# define BOOST_PP_WHILE_136_I(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))
+# define BOOST_PP_WHILE_137_I(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))
+# define BOOST_PP_WHILE_138_I(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))
+# define BOOST_PP_WHILE_139_I(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))
+# define BOOST_PP_WHILE_140_I(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))
+# define BOOST_PP_WHILE_141_I(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))
+# define BOOST_PP_WHILE_142_I(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))
+# define BOOST_PP_WHILE_143_I(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))
+# define BOOST_PP_WHILE_144_I(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))
+# define BOOST_PP_WHILE_145_I(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))
+# define BOOST_PP_WHILE_146_I(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))
+# define BOOST_PP_WHILE_147_I(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))
+# define BOOST_PP_WHILE_148_I(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))
+# define BOOST_PP_WHILE_149_I(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))
+# define BOOST_PP_WHILE_150_I(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))
+# define BOOST_PP_WHILE_151_I(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))
+# define BOOST_PP_WHILE_152_I(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))
+# define BOOST_PP_WHILE_153_I(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))
+# define BOOST_PP_WHILE_154_I(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))
+# define BOOST_PP_WHILE_155_I(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))
+# define BOOST_PP_WHILE_156_I(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))
+# define BOOST_PP_WHILE_157_I(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))
+# define BOOST_PP_WHILE_158_I(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))
+# define BOOST_PP_WHILE_159_I(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))
+# define BOOST_PP_WHILE_160_I(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))
+# define BOOST_PP_WHILE_161_I(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))
+# define BOOST_PP_WHILE_162_I(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))
+# define BOOST_PP_WHILE_163_I(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))
+# define BOOST_PP_WHILE_164_I(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))
+# define BOOST_PP_WHILE_165_I(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))
+# define BOOST_PP_WHILE_166_I(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))
+# define BOOST_PP_WHILE_167_I(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))
+# define BOOST_PP_WHILE_168_I(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))
+# define BOOST_PP_WHILE_169_I(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))
+# define BOOST_PP_WHILE_170_I(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))
+# define BOOST_PP_WHILE_171_I(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))
+# define BOOST_PP_WHILE_172_I(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))
+# define BOOST_PP_WHILE_173_I(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))
+# define BOOST_PP_WHILE_174_I(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))
+# define BOOST_PP_WHILE_175_I(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))
+# define BOOST_PP_WHILE_176_I(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))
+# define BOOST_PP_WHILE_177_I(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))
+# define BOOST_PP_WHILE_178_I(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))
+# define BOOST_PP_WHILE_179_I(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))
+# define BOOST_PP_WHILE_180_I(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))
+# define BOOST_PP_WHILE_181_I(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))
+# define BOOST_PP_WHILE_182_I(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))
+# define BOOST_PP_WHILE_183_I(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))
+# define BOOST_PP_WHILE_184_I(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))
+# define BOOST_PP_WHILE_185_I(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))
+# define BOOST_PP_WHILE_186_I(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))
+# define BOOST_PP_WHILE_187_I(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))
+# define BOOST_PP_WHILE_188_I(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))
+# define BOOST_PP_WHILE_189_I(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))
+# define BOOST_PP_WHILE_190_I(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))
+# define BOOST_PP_WHILE_191_I(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))
+# define BOOST_PP_WHILE_192_I(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))
+# define BOOST_PP_WHILE_193_I(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))
+# define BOOST_PP_WHILE_194_I(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))
+# define BOOST_PP_WHILE_195_I(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))
+# define BOOST_PP_WHILE_196_I(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))
+# define BOOST_PP_WHILE_197_I(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))
+# define BOOST_PP_WHILE_198_I(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))
+# define BOOST_PP_WHILE_199_I(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))
+# define BOOST_PP_WHILE_200_I(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))
+# define BOOST_PP_WHILE_201_I(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))
+# define BOOST_PP_WHILE_202_I(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))
+# define BOOST_PP_WHILE_203_I(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))
+# define BOOST_PP_WHILE_204_I(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))
+# define BOOST_PP_WHILE_205_I(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))
+# define BOOST_PP_WHILE_206_I(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))
+# define BOOST_PP_WHILE_207_I(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))
+# define BOOST_PP_WHILE_208_I(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))
+# define BOOST_PP_WHILE_209_I(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))
+# define BOOST_PP_WHILE_210_I(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))
+# define BOOST_PP_WHILE_211_I(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))
+# define BOOST_PP_WHILE_212_I(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))
+# define BOOST_PP_WHILE_213_I(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))
+# define BOOST_PP_WHILE_214_I(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))
+# define BOOST_PP_WHILE_215_I(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))
+# define BOOST_PP_WHILE_216_I(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))
+# define BOOST_PP_WHILE_217_I(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))
+# define BOOST_PP_WHILE_218_I(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))
+# define BOOST_PP_WHILE_219_I(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))
+# define BOOST_PP_WHILE_220_I(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))
+# define BOOST_PP_WHILE_221_I(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))
+# define BOOST_PP_WHILE_222_I(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))
+# define BOOST_PP_WHILE_223_I(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))
+# define BOOST_PP_WHILE_224_I(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))
+# define BOOST_PP_WHILE_225_I(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))
+# define BOOST_PP_WHILE_226_I(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))
+# define BOOST_PP_WHILE_227_I(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))
+# define BOOST_PP_WHILE_228_I(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))
+# define BOOST_PP_WHILE_229_I(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))
+# define BOOST_PP_WHILE_230_I(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))
+# define BOOST_PP_WHILE_231_I(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))
+# define BOOST_PP_WHILE_232_I(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))
+# define BOOST_PP_WHILE_233_I(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))
+# define BOOST_PP_WHILE_234_I(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))
+# define BOOST_PP_WHILE_235_I(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))
+# define BOOST_PP_WHILE_236_I(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))
+# define BOOST_PP_WHILE_237_I(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))
+# define BOOST_PP_WHILE_238_I(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))
+# define BOOST_PP_WHILE_239_I(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))
+# define BOOST_PP_WHILE_240_I(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))
+# define BOOST_PP_WHILE_241_I(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))
+# define BOOST_PP_WHILE_242_I(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))
+# define BOOST_PP_WHILE_243_I(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))
+# define BOOST_PP_WHILE_244_I(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))
+# define BOOST_PP_WHILE_245_I(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))
+# define BOOST_PP_WHILE_246_I(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))
+# define BOOST_PP_WHILE_247_I(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))
+# define BOOST_PP_WHILE_248_I(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))
+# define BOOST_PP_WHILE_249_I(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))
+# define BOOST_PP_WHILE_250_I(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))
+# define BOOST_PP_WHILE_251_I(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))
+# define BOOST_PP_WHILE_252_I(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))
+# define BOOST_PP_WHILE_253_I(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))
+# define BOOST_PP_WHILE_254_I(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))
+# define BOOST_PP_WHILE_255_I(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))
+# define BOOST_PP_WHILE_256_I(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/detail/msvc/while.hpp b/gatb-core/thirdparty/boost/preprocessor/control/detail/msvc/while.hpp
new file mode 100644
index 0000000..e543e41
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/detail/msvc/while.hpp
@@ -0,0 +1,277 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP
+# define BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP
+#
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))
+# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))
+# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))
+# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))
+# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))
+# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))
+# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))
+# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))
+# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))
+# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))
+# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))
+# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))
+# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))
+# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))
+# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))
+# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))
+# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))
+# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))
+# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))
+# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))
+# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))
+# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))
+# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))
+# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))
+# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))
+# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))
+# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))
+# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))
+# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))
+# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))
+# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))
+# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))
+# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))
+# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))
+# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))
+# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))
+# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))
+# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))
+# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))
+# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))
+# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))
+# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))
+# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))
+# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))
+# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))
+# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))
+# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))
+# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))
+# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))
+# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))
+# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))
+# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))
+# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))
+# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))
+# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))
+# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))
+# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))
+# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))
+# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))
+# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))
+# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))
+# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))
+# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))
+# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))
+# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))
+# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))
+# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))
+# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))
+# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))
+# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))
+# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))
+# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))
+# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))
+# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))
+# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))
+# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))
+# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))
+# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))
+# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))
+# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))
+# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))
+# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))
+# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))
+# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))
+# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))
+# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))
+# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))
+# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))
+# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))
+# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))
+# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))
+# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))
+# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))
+# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))
+# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))
+# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))
+# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))
+# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))
+# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))
+# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))
+# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))
+# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))
+# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))
+# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))
+# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))
+# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))
+# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))
+# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))
+# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))
+# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))
+# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))
+# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))
+# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))
+# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))
+# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))
+# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))
+# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))
+# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))
+# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))
+# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))
+# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))
+# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))
+# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))
+# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))
+# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))
+# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))
+# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))
+# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))
+# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))
+# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))
+# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))
+# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))
+# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))
+# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))
+# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))
+# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))
+# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))
+# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))
+# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))
+# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))
+# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))
+# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))
+# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))
+# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))
+# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))
+# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))
+# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))
+# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))
+# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))
+# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))
+# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))
+# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))
+# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))
+# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))
+# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))
+# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))
+# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))
+# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))
+# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))
+# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))
+# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))
+# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))
+# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))
+# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))
+# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))
+# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))
+# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))
+# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))
+# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))
+# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))
+# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))
+# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))
+# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))
+# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))
+# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))
+# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))
+# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))
+# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))
+# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))
+# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))
+# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))
+# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))
+# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))
+# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))
+# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))
+# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))
+# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))
+# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))
+# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))
+# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))
+# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))
+# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))
+# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))
+# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))
+# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))
+# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))
+# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))
+# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))
+# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))
+# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))
+# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))
+# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))
+# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))
+# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))
+# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))
+# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))
+# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))
+# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))
+# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))
+# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))
+# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))
+# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))
+# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))
+# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))
+# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))
+# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))
+# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))
+# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))
+# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))
+# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))
+# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))
+# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))
+# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))
+# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))
+# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))
+# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))
+# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))
+# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))
+# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))
+# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))
+# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))
+# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))
+# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))
+# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))
+# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))
+# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))
+# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))
+# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))
+# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))
+# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))
+# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))
+# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))
+# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))
+# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))
+# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))
+# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))
+# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))
+# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))
+# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))
+# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))
+# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))
+# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))
+# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))
+# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))
+# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))
+# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/detail/while.hpp b/gatb-core/thirdparty/boost/preprocessor/control/detail/while.hpp
new file mode 100644
index 0000000..7315e1d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/detail/while.hpp
@@ -0,0 +1,536 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP
+# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p(2, s)), p, o, s)
+# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p(3, s)), p, o, s)
+# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p(4, s)), p, o, s)
+# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p(5, s)), p, o, s)
+# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p(6, s)), p, o, s)
+# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p(7, s)), p, o, s)
+# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p(8, s)), p, o, s)
+# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p(9, s)), p, o, s)
+# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p(10, s)), p, o, s)
+# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p(11, s)), p, o, s)
+# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p(12, s)), p, o, s)
+# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p(13, s)), p, o, s)
+# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p(14, s)), p, o, s)
+# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p(15, s)), p, o, s)
+# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p(16, s)), p, o, s)
+# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p(17, s)), p, o, s)
+# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p(18, s)), p, o, s)
+# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p(19, s)), p, o, s)
+# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p(20, s)), p, o, s)
+# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p(21, s)), p, o, s)
+# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p(22, s)), p, o, s)
+# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p(23, s)), p, o, s)
+# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p(24, s)), p, o, s)
+# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p(25, s)), p, o, s)
+# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p(26, s)), p, o, s)
+# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p(27, s)), p, o, s)
+# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p(28, s)), p, o, s)
+# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p(29, s)), p, o, s)
+# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p(30, s)), p, o, s)
+# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p(31, s)), p, o, s)
+# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p(32, s)), p, o, s)
+# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p(33, s)), p, o, s)
+# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p(34, s)), p, o, s)
+# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p(35, s)), p, o, s)
+# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p(36, s)), p, o, s)
+# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p(37, s)), p, o, s)
+# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p(38, s)), p, o, s)
+# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p(39, s)), p, o, s)
+# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p(40, s)), p, o, s)
+# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p(41, s)), p, o, s)
+# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p(42, s)), p, o, s)
+# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p(43, s)), p, o, s)
+# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p(44, s)), p, o, s)
+# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p(45, s)), p, o, s)
+# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p(46, s)), p, o, s)
+# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p(47, s)), p, o, s)
+# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p(48, s)), p, o, s)
+# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p(49, s)), p, o, s)
+# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p(50, s)), p, o, s)
+# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p(51, s)), p, o, s)
+# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p(52, s)), p, o, s)
+# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p(53, s)), p, o, s)
+# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p(54, s)), p, o, s)
+# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p(55, s)), p, o, s)
+# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p(56, s)), p, o, s)
+# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p(57, s)), p, o, s)
+# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p(58, s)), p, o, s)
+# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p(59, s)), p, o, s)
+# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p(60, s)), p, o, s)
+# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p(61, s)), p, o, s)
+# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p(62, s)), p, o, s)
+# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p(63, s)), p, o, s)
+# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p(64, s)), p, o, s)
+# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p(65, s)), p, o, s)
+# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p(66, s)), p, o, s)
+# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p(67, s)), p, o, s)
+# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p(68, s)), p, o, s)
+# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p(69, s)), p, o, s)
+# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p(70, s)), p, o, s)
+# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p(71, s)), p, o, s)
+# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p(72, s)), p, o, s)
+# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p(73, s)), p, o, s)
+# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p(74, s)), p, o, s)
+# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p(75, s)), p, o, s)
+# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p(76, s)), p, o, s)
+# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p(77, s)), p, o, s)
+# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p(78, s)), p, o, s)
+# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p(79, s)), p, o, s)
+# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p(80, s)), p, o, s)
+# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p(81, s)), p, o, s)
+# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p(82, s)), p, o, s)
+# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p(83, s)), p, o, s)
+# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p(84, s)), p, o, s)
+# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p(85, s)), p, o, s)
+# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p(86, s)), p, o, s)
+# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p(87, s)), p, o, s)
+# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p(88, s)), p, o, s)
+# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p(89, s)), p, o, s)
+# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p(90, s)), p, o, s)
+# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p(91, s)), p, o, s)
+# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p(92, s)), p, o, s)
+# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p(93, s)), p, o, s)
+# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p(94, s)), p, o, s)
+# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p(95, s)), p, o, s)
+# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p(96, s)), p, o, s)
+# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p(97, s)), p, o, s)
+# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p(98, s)), p, o, s)
+# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p(99, s)), p, o, s)
+# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p(100, s)), p, o, s)
+# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p(101, s)), p, o, s)
+# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p(102, s)), p, o, s)
+# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p(103, s)), p, o, s)
+# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p(104, s)), p, o, s)
+# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p(105, s)), p, o, s)
+# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p(106, s)), p, o, s)
+# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p(107, s)), p, o, s)
+# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p(108, s)), p, o, s)
+# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p(109, s)), p, o, s)
+# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p(110, s)), p, o, s)
+# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p(111, s)), p, o, s)
+# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p(112, s)), p, o, s)
+# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p(113, s)), p, o, s)
+# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p(114, s)), p, o, s)
+# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p(115, s)), p, o, s)
+# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p(116, s)), p, o, s)
+# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p(117, s)), p, o, s)
+# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p(118, s)), p, o, s)
+# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p(119, s)), p, o, s)
+# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p(120, s)), p, o, s)
+# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p(121, s)), p, o, s)
+# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p(122, s)), p, o, s)
+# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p(123, s)), p, o, s)
+# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p(124, s)), p, o, s)
+# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p(125, s)), p, o, s)
+# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p(126, s)), p, o, s)
+# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p(127, s)), p, o, s)
+# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p(128, s)), p, o, s)
+# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p(129, s)), p, o, s)
+# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p(130, s)), p, o, s)
+# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p(131, s)), p, o, s)
+# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p(132, s)), p, o, s)
+# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p(133, s)), p, o, s)
+# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p(134, s)), p, o, s)
+# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p(135, s)), p, o, s)
+# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p(136, s)), p, o, s)
+# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p(137, s)), p, o, s)
+# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p(138, s)), p, o, s)
+# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p(139, s)), p, o, s)
+# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p(140, s)), p, o, s)
+# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p(141, s)), p, o, s)
+# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p(142, s)), p, o, s)
+# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p(143, s)), p, o, s)
+# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p(144, s)), p, o, s)
+# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p(145, s)), p, o, s)
+# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p(146, s)), p, o, s)
+# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p(147, s)), p, o, s)
+# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p(148, s)), p, o, s)
+# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p(149, s)), p, o, s)
+# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p(150, s)), p, o, s)
+# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p(151, s)), p, o, s)
+# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p(152, s)), p, o, s)
+# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p(153, s)), p, o, s)
+# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p(154, s)), p, o, s)
+# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p(155, s)), p, o, s)
+# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p(156, s)), p, o, s)
+# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p(157, s)), p, o, s)
+# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p(158, s)), p, o, s)
+# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p(159, s)), p, o, s)
+# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p(160, s)), p, o, s)
+# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p(161, s)), p, o, s)
+# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p(162, s)), p, o, s)
+# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p(163, s)), p, o, s)
+# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p(164, s)), p, o, s)
+# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p(165, s)), p, o, s)
+# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p(166, s)), p, o, s)
+# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p(167, s)), p, o, s)
+# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p(168, s)), p, o, s)
+# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p(169, s)), p, o, s)
+# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p(170, s)), p, o, s)
+# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p(171, s)), p, o, s)
+# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p(172, s)), p, o, s)
+# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p(173, s)), p, o, s)
+# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p(174, s)), p, o, s)
+# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p(175, s)), p, o, s)
+# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p(176, s)), p, o, s)
+# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p(177, s)), p, o, s)
+# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p(178, s)), p, o, s)
+# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p(179, s)), p, o, s)
+# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p(180, s)), p, o, s)
+# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p(181, s)), p, o, s)
+# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p(182, s)), p, o, s)
+# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p(183, s)), p, o, s)
+# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p(184, s)), p, o, s)
+# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p(185, s)), p, o, s)
+# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p(186, s)), p, o, s)
+# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p(187, s)), p, o, s)
+# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p(188, s)), p, o, s)
+# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p(189, s)), p, o, s)
+# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p(190, s)), p, o, s)
+# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p(191, s)), p, o, s)
+# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p(192, s)), p, o, s)
+# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p(193, s)), p, o, s)
+# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p(194, s)), p, o, s)
+# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p(195, s)), p, o, s)
+# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p(196, s)), p, o, s)
+# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p(197, s)), p, o, s)
+# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p(198, s)), p, o, s)
+# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p(199, s)), p, o, s)
+# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p(200, s)), p, o, s)
+# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p(201, s)), p, o, s)
+# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p(202, s)), p, o, s)
+# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p(203, s)), p, o, s)
+# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p(204, s)), p, o, s)
+# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p(205, s)), p, o, s)
+# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p(206, s)), p, o, s)
+# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p(207, s)), p, o, s)
+# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p(208, s)), p, o, s)
+# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p(209, s)), p, o, s)
+# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p(210, s)), p, o, s)
+# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p(211, s)), p, o, s)
+# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p(212, s)), p, o, s)
+# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p(213, s)), p, o, s)
+# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p(214, s)), p, o, s)
+# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p(215, s)), p, o, s)
+# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p(216, s)), p, o, s)
+# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p(217, s)), p, o, s)
+# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p(218, s)), p, o, s)
+# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p(219, s)), p, o, s)
+# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p(220, s)), p, o, s)
+# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p(221, s)), p, o, s)
+# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p(222, s)), p, o, s)
+# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p(223, s)), p, o, s)
+# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p(224, s)), p, o, s)
+# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p(225, s)), p, o, s)
+# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p(226, s)), p, o, s)
+# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p(227, s)), p, o, s)
+# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p(228, s)), p, o, s)
+# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p(229, s)), p, o, s)
+# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p(230, s)), p, o, s)
+# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p(231, s)), p, o, s)
+# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p(232, s)), p, o, s)
+# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p(233, s)), p, o, s)
+# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p(234, s)), p, o, s)
+# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p(235, s)), p, o, s)
+# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p(236, s)), p, o, s)
+# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p(237, s)), p, o, s)
+# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p(238, s)), p, o, s)
+# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p(239, s)), p, o, s)
+# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p(240, s)), p, o, s)
+# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p(241, s)), p, o, s)
+# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p(242, s)), p, o, s)
+# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p(243, s)), p, o, s)
+# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p(244, s)), p, o, s)
+# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p(245, s)), p, o, s)
+# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p(246, s)), p, o, s)
+# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p(247, s)), p, o, s)
+# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p(248, s)), p, o, s)
+# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p(249, s)), p, o, s)
+# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p(250, s)), p, o, s)
+# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p(251, s)), p, o, s)
+# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p(252, s)), p, o, s)
+# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p(253, s)), p, o, s)
+# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p(254, s)), p, o, s)
+# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p(255, s)), p, o, s)
+# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p(256, s)), p, o, s)
+# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p(257, s)), p, o, s)
+#
+# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(2, s))
+# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(3, s))
+# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(4, s))
+# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(5, s))
+# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(6, s))
+# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(7, s))
+# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(8, s))
+# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(9, s))
+# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(10, s))
+# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(11, s))
+# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(12, s))
+# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(13, s))
+# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(14, s))
+# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(15, s))
+# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(16, s))
+# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(17, s))
+# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(18, s))
+# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(19, s))
+# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(20, s))
+# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(21, s))
+# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(22, s))
+# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(23, s))
+# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(24, s))
+# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(25, s))
+# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(26, s))
+# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(27, s))
+# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(28, s))
+# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(29, s))
+# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(30, s))
+# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(31, s))
+# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(32, s))
+# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(33, s))
+# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(34, s))
+# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(35, s))
+# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(36, s))
+# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(37, s))
+# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(38, s))
+# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(39, s))
+# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(40, s))
+# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(41, s))
+# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(42, s))
+# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(43, s))
+# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(44, s))
+# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(45, s))
+# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(46, s))
+# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(47, s))
+# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(48, s))
+# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(49, s))
+# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(50, s))
+# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(51, s))
+# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(52, s))
+# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(53, s))
+# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(54, s))
+# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(55, s))
+# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(56, s))
+# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(57, s))
+# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(58, s))
+# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(59, s))
+# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(60, s))
+# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(61, s))
+# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(62, s))
+# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(63, s))
+# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(64, s))
+# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(65, s))
+# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(66, s))
+# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(67, s))
+# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(68, s))
+# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(69, s))
+# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(70, s))
+# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(71, s))
+# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(72, s))
+# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(73, s))
+# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(74, s))
+# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(75, s))
+# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(76, s))
+# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(77, s))
+# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(78, s))
+# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(79, s))
+# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(80, s))
+# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(81, s))
+# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(82, s))
+# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(83, s))
+# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(84, s))
+# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(85, s))
+# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(86, s))
+# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(87, s))
+# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(88, s))
+# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(89, s))
+# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(90, s))
+# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(91, s))
+# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(92, s))
+# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(93, s))
+# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(94, s))
+# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(95, s))
+# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(96, s))
+# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(97, s))
+# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(98, s))
+# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(99, s))
+# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(100, s))
+# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(101, s))
+# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(102, s))
+# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(103, s))
+# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(104, s))
+# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(105, s))
+# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(106, s))
+# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(107, s))
+# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(108, s))
+# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(109, s))
+# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(110, s))
+# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(111, s))
+# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(112, s))
+# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(113, s))
+# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(114, s))
+# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(115, s))
+# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(116, s))
+# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(117, s))
+# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(118, s))
+# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(119, s))
+# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(120, s))
+# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(121, s))
+# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(122, s))
+# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(123, s))
+# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(124, s))
+# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(125, s))
+# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(126, s))
+# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(127, s))
+# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(128, s))
+# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(129, s))
+# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(130, s))
+# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(131, s))
+# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(132, s))
+# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(133, s))
+# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(134, s))
+# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(135, s))
+# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(136, s))
+# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(137, s))
+# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(138, s))
+# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(139, s))
+# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(140, s))
+# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(141, s))
+# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(142, s))
+# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(143, s))
+# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(144, s))
+# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(145, s))
+# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(146, s))
+# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(147, s))
+# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(148, s))
+# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(149, s))
+# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(150, s))
+# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(151, s))
+# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(152, s))
+# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(153, s))
+# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(154, s))
+# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(155, s))
+# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(156, s))
+# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(157, s))
+# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(158, s))
+# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(159, s))
+# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(160, s))
+# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(161, s))
+# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(162, s))
+# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(163, s))
+# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(164, s))
+# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(165, s))
+# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(166, s))
+# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(167, s))
+# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(168, s))
+# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(169, s))
+# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(170, s))
+# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(171, s))
+# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(172, s))
+# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(173, s))
+# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(174, s))
+# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(175, s))
+# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(176, s))
+# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(177, s))
+# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(178, s))
+# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(179, s))
+# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(180, s))
+# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(181, s))
+# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(182, s))
+# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(183, s))
+# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(184, s))
+# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(185, s))
+# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(186, s))
+# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(187, s))
+# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(188, s))
+# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(189, s))
+# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(190, s))
+# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(191, s))
+# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(192, s))
+# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(193, s))
+# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(194, s))
+# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(195, s))
+# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(196, s))
+# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(197, s))
+# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(198, s))
+# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(199, s))
+# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(200, s))
+# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(201, s))
+# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(202, s))
+# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(203, s))
+# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(204, s))
+# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(205, s))
+# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(206, s))
+# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(207, s))
+# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(208, s))
+# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(209, s))
+# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(210, s))
+# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(211, s))
+# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(212, s))
+# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(213, s))
+# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(214, s))
+# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(215, s))
+# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(216, s))
+# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(217, s))
+# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(218, s))
+# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(219, s))
+# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(220, s))
+# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(221, s))
+# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(222, s))
+# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(223, s))
+# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(224, s))
+# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(225, s))
+# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(226, s))
+# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(227, s))
+# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(228, s))
+# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(229, s))
+# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(230, s))
+# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(231, s))
+# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(232, s))
+# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(233, s))
+# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(234, s))
+# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(235, s))
+# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(236, s))
+# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(237, s))
+# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(238, s))
+# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(239, s))
+# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(240, s))
+# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(241, s))
+# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(242, s))
+# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(243, s))
+# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(244, s))
+# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(245, s))
+# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(246, s))
+# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(247, s))
+# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(248, s))
+# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(249, s))
+# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(250, s))
+# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(251, s))
+# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(252, s))
+# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(253, s))
+# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(254, s))
+# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(255, s))
+# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(256, s))
+# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(257, s))
+#
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/expr_if.hpp b/gatb-core/thirdparty/boost/preprocessor/control/expr_if.hpp
new file mode 100644
index 0000000..0e1ab51
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/expr_if.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP
+# define BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+#
+# /* BOOST_PP_EXPR_IF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)
+# else
+#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IF_I(cond, expr)
+#    define BOOST_PP_EXPR_IF_I(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/expr_iif.hpp b/gatb-core/thirdparty/boost/preprocessor/control/expr_iif.hpp
new file mode 100644
index 0000000..58f45a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/expr_iif.hpp
@@ -0,0 +1,31 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP
+# define BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_EXPR_IIF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_I(bit, expr)
+# else
+#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_OO((bit, expr))
+#    define BOOST_PP_EXPR_IIF_OO(par) BOOST_PP_EXPR_IIF_I ## par
+# endif
+#
+# define BOOST_PP_EXPR_IIF_I(bit, expr) BOOST_PP_EXPR_IIF_ ## bit(expr)
+#
+# define BOOST_PP_EXPR_IIF_0(expr)
+# define BOOST_PP_EXPR_IIF_1(expr) expr
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/if.hpp b/gatb-core/thirdparty/boost/preprocessor/control/if.hpp
new file mode 100644
index 0000000..52cfc3d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/if.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_IF_HPP
+# define BOOST_PREPROCESSOR_CONTROL_IF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+#
+# /* BOOST_PP_IF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)
+# else
+#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IF_I(cond, t, f)
+#    define BOOST_PP_IF_I(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/iif.hpp b/gatb-core/thirdparty/boost/preprocessor/control/iif.hpp
new file mode 100644
index 0000000..fd07817
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/iif.hpp
@@ -0,0 +1,34 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_IIF_HPP
+# define BOOST_PREPROCESSOR_CONTROL_IIF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_I(bit, t, f)
+# else
+#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_OO((bit, t, f))
+#    define BOOST_PP_IIF_OO(par) BOOST_PP_IIF_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_ ## bit(t, f)
+# else
+#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_II(BOOST_PP_IIF_ ## bit(t, f))
+#    define BOOST_PP_IIF_II(id) id
+# endif
+#
+# define BOOST_PP_IIF_0(t, f) f
+# define BOOST_PP_IIF_1(t, f) t
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/control/while.hpp b/gatb-core/thirdparty/boost/preprocessor/control/while.hpp
new file mode 100644
index 0000000..e8a65ff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/control/while.hpp
@@ -0,0 +1,312 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_CONTROL_WHILE_HPP
+# define BOOST_PREPROCESSOR_CONTROL_WHILE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/list/fold_left.hpp>
+# include <boost/preprocessor/list/fold_right.hpp>
+# include <boost/preprocessor/logical/bitand.hpp>
+#
+# /* BOOST_PP_WHILE */
+#
+# if 0
+#    define BOOST_PP_WHILE(pred, op, state)
+# endif
+#
+# define BOOST_PP_WHILE BOOST_PP_CAT(BOOST_PP_WHILE_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_CHECK_, BOOST_PP_LIST_FOLD_RIGHT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL))))
+# else
+#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)))
+# endif
+#
+# define BOOST_PP_WHILE_F(d, _) 0
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    include <boost/preprocessor/control/detail/edg/while.hpp>
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    include <boost/preprocessor/control/detail/msvc/while.hpp>
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    include <boost/preprocessor/control/detail/dmc/while.hpp>
+# else
+#    include <boost/preprocessor/control/detail/while.hpp>
+# endif
+#
+# define BOOST_PP_WHILE_257(p, o, s) BOOST_PP_ERROR(0x0001)
+#
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_1(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_2(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_3(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_4(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_5(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_6(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_7(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_8(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_9(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_10(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_11(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_12(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_13(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_14(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_15(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_16(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_17(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_18(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_19(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_20(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_21(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_22(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_23(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_24(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_25(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_26(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_27(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_28(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_29(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_30(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_31(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_32(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_33(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_34(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_35(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_36(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_37(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_38(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_39(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_40(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_41(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_42(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_43(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_44(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_45(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_46(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_47(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_48(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_49(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_50(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_51(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_52(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_53(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_54(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_55(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_56(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_57(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_58(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_59(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_60(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_61(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_62(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_63(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_64(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_65(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_66(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_67(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_68(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_69(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_70(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_71(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_72(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_73(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_74(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_75(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_76(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_77(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_78(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_79(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_80(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_81(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_82(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_83(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_84(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_85(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_86(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_87(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_88(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_89(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_90(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_91(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_92(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_93(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_94(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_95(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_96(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_97(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_98(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_99(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_100(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_101(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_102(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_103(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_104(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_105(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_106(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_107(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_108(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_109(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_110(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_111(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_112(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_113(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_114(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_115(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_116(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_117(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_118(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_119(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_120(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_121(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_122(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_123(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_124(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_125(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_126(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_127(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_128(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_129(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_130(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_131(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_132(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_133(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_134(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_135(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_136(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_137(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_138(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_139(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_140(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_141(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_142(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_143(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_144(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_145(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_146(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_147(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_148(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_149(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_150(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_151(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_152(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_153(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_154(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_155(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_156(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_157(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_158(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_159(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_160(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_161(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_162(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_163(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_164(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_165(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_166(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_167(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_168(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_169(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_170(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_171(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_172(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_173(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_174(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_175(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_176(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_177(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_178(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_179(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_180(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_181(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_182(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_183(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_184(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_185(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_186(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_187(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_188(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_189(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_190(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_191(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_192(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_193(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_194(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_195(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_196(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_197(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_198(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_199(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_200(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_201(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_202(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_203(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_204(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_205(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_206(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_207(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_208(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_209(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_210(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_211(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_212(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_213(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_214(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_215(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_216(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_217(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_218(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_219(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_220(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_221(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_222(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_223(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_224(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_225(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_226(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_227(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_228(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_229(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_230(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_231(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_232(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_233(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_234(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_235(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_236(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_237(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_238(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_239(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_240(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_241(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_242(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_243(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_244(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_245(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_246(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_247(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_248(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_249(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_250(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_251(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_252(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_253(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_254(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_255(p, o, s) 0
+# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_256(p, o, s) 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/debug.hpp b/gatb-core/thirdparty/boost/preprocessor/debug.hpp
new file mode 100644
index 0000000..d09983e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/debug.hpp
@@ -0,0 +1,18 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DEBUG_HPP
+# define BOOST_PREPROCESSOR_DEBUG_HPP
+#
+# include <boost/preprocessor/debug/assert.hpp>
+# include <boost/preprocessor/debug/line.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/debug/assert.hpp b/gatb-core/thirdparty/boost/preprocessor/debug/assert.hpp
new file mode 100644
index 0000000..3380c70
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/debug/assert.hpp
@@ -0,0 +1,44 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DEBUG_ASSERT_HPP
+# define BOOST_PREPROCESSOR_DEBUG_ASSERT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# /* BOOST_PP_ASSERT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ASSERT BOOST_PP_ASSERT_D
+# else
+#    define BOOST_PP_ASSERT(cond) BOOST_PP_ASSERT_D(cond)
+# endif
+#
+# define BOOST_PP_ASSERT_D(cond) BOOST_PP_IIF(BOOST_PP_NOT(cond), BOOST_PP_ASSERT_ERROR, BOOST_PP_TUPLE_EAT_1)(...)
+# define BOOST_PP_ASSERT_ERROR(x, y, z)
+#
+# /* BOOST_PP_ASSERT_MSG */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ASSERT_MSG BOOST_PP_ASSERT_MSG_D
+# else
+#    define BOOST_PP_ASSERT_MSG(cond, msg) BOOST_PP_ASSERT_MSG_D(cond, msg)
+# endif
+#
+# define BOOST_PP_ASSERT_MSG_D(cond, msg) BOOST_PP_EXPR_IIF(BOOST_PP_NOT(cond), msg)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/debug/error.hpp b/gatb-core/thirdparty/boost/preprocessor/debug/error.hpp
new file mode 100644
index 0000000..c8ae5e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/debug/error.hpp
@@ -0,0 +1,33 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DEBUG_ERROR_HPP
+# define BOOST_PREPROCESSOR_DEBUG_ERROR_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_ERROR */
+#
+# if BOOST_PP_CONFIG_ERRORS
+#    define BOOST_PP_ERROR(code) BOOST_PP_CAT(BOOST_PP_ERROR_, code)
+# endif
+#
+# define BOOST_PP_ERROR_0x0000 BOOST_PP_ERROR(0x0000, BOOST_PP_INDEX_OUT_OF_BOUNDS)
+# define BOOST_PP_ERROR_0x0001 BOOST_PP_ERROR(0x0001, BOOST_PP_WHILE_OVERFLOW)
+# define BOOST_PP_ERROR_0x0002 BOOST_PP_ERROR(0x0002, BOOST_PP_FOR_OVERFLOW)
+# define BOOST_PP_ERROR_0x0003 BOOST_PP_ERROR(0x0003, BOOST_PP_REPEAT_OVERFLOW)
+# define BOOST_PP_ERROR_0x0004 BOOST_PP_ERROR(0x0004, BOOST_PP_LIST_FOLD_OVERFLOW)
+# define BOOST_PP_ERROR_0x0005 BOOST_PP_ERROR(0x0005, BOOST_PP_SEQ_FOLD_OVERFLOW)
+# define BOOST_PP_ERROR_0x0006 BOOST_PP_ERROR(0x0006, BOOST_PP_ARITHMETIC_OVERFLOW)
+# define BOOST_PP_ERROR_0x0007 BOOST_PP_ERROR(0x0007, BOOST_PP_DIVISION_BY_ZERO)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/debug/line.hpp b/gatb-core/thirdparty/boost/preprocessor/debug/line.hpp
new file mode 100644
index 0000000..4dd1013
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/debug/line.hpp
@@ -0,0 +1,35 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DEBUG_LINE_HPP
+# define BOOST_PREPROCESSOR_DEBUG_LINE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/stringize.hpp>
+#
+# /* BOOST_PP_LINE */
+#
+# if BOOST_PP_CONFIG_EXTENDED_LINE_INFO
+#    define BOOST_PP_LINE(line, file) line BOOST_PP_CAT(BOOST_PP_LINE_, BOOST_PP_IS_ITERATING)(file)
+#    define BOOST_PP_LINE_BOOST_PP_IS_ITERATING(file) #file
+#    define BOOST_PP_LINE_1(file) BOOST_PP_STRINGIZE(file BOOST_PP_CAT(BOOST_PP_LINE_I_, BOOST_PP_ITERATION_DEPTH())())
+#    define BOOST_PP_LINE_I_1() [BOOST_PP_FRAME_ITERATION(1)]
+#    define BOOST_PP_LINE_I_2() BOOST_PP_LINE_I_1()[BOOST_PP_FRAME_ITERATION(2)]
+#    define BOOST_PP_LINE_I_3() BOOST_PP_LINE_I_2()[BOOST_PP_FRAME_ITERATION(3)]
+#    define BOOST_PP_LINE_I_4() BOOST_PP_LINE_I_3()[BOOST_PP_FRAME_ITERATION(4)]
+#    define BOOST_PP_LINE_I_5() BOOST_PP_LINE_I_4()[BOOST_PP_FRAME_ITERATION(5)]
+# else
+#    define BOOST_PP_LINE(line, file) line __FILE__
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/dec.hpp b/gatb-core/thirdparty/boost/preprocessor/dec.hpp
new file mode 100644
index 0000000..d572064
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/dec.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DEC_HPP
+# define BOOST_PREPROCESSOR_DEC_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/auto_rec.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/auto_rec.hpp
new file mode 100644
index 0000000..39de1d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/auto_rec.hpp
@@ -0,0 +1,293 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#     include <boost/preprocessor/detail/dmc/auto_rec.hpp>
+# else
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP
+# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+#
+# /* BOOST_PP_AUTO_REC */
+#
+# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)
+#
+# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)
+# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)
+#
+# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)
+#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)
+#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)
+#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)
+#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)
+#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)
+#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)
+#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p(1), 1, 2)
+#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p(3), 3, 4)
+#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)
+#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p(5), 5, 6)
+#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p(7), 7, 8)
+#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)
+#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)
+#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p(9), 9, 10)
+#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p(11), 11, 12)
+#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)
+#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p(13), 13, 14)
+#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p(15), 15, 16)
+#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)
+#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)
+#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)
+#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p(17), 17, 18)
+#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p(19), 19, 20)
+#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)
+#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p(21), 21, 22)
+#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p(23), 23, 24)
+#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)
+#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)
+#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p(25), 25, 26)
+#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p(27), 27, 28)
+#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)
+#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p(29), 29, 30)
+#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p(31), 31, 32)
+#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)
+#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)
+#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)
+#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)
+#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p(33), 33, 34)
+#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p(35), 35, 36)
+#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)
+#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p(37), 37, 38)
+#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p(39), 39, 40)
+#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)
+#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)
+#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p(41), 41, 42)
+#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p(43), 43, 44)
+#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)
+#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p(45), 45, 46)
+#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p(47), 47, 48)
+#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)
+#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)
+#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)
+#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p(49), 49, 50)
+#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p(51), 51, 52)
+#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)
+#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p(53), 53, 54)
+#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p(55), 55, 56)
+#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)
+#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)
+#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p(57), 57, 58)
+#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p(59), 59, 60)
+#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)
+#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p(61), 61, 62)
+#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p(63), 63, 64)
+#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)
+#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)
+#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)
+#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)
+#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)
+#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p(65), 65, 66)
+#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p(67), 67, 68)
+#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)
+#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p(69), 69, 70)
+#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p(71), 71, 72)
+#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)
+#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)
+#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p(73), 73, 74)
+#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p(75), 75, 76)
+#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)
+#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p(77), 77, 78)
+#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p(79), 79, 80)
+#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)
+#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)
+#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)
+#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p(81), 81, 82)
+#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p(83), 83, 84)
+#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)
+#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p(85), 85, 86)
+#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p(87), 87, 88)
+#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)
+#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)
+#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p(89), 89, 90)
+#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p(91), 91, 92)
+#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)
+#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p(93), 93, 94)
+#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p(95), 95, 96)
+#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)
+#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)
+#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)
+#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)
+#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p(97), 97, 98)
+#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p(99), 99, 100)
+#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)
+#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p(101), 101, 102)
+#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p(103), 103, 104)
+#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)
+#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)
+#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p(105), 105, 106)
+#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p(107), 107, 108)
+#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)
+#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p(109), 109, 110)
+#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p(111), 111, 112)
+#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)
+#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)
+#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)
+#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p(113), 113, 114)
+#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p(115), 115, 116)
+#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)
+#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p(117), 117, 118)
+#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p(119), 119, 120)
+#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)
+#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)
+#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p(121), 121, 122)
+#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p(123), 123, 124)
+#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)
+#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p(125), 125, 126)
+#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p(127), 127, 128)
+#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)
+#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)
+#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)
+#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)
+#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)
+#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)
+#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p(129), 129, 130)
+#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p(131), 131, 132)
+#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)
+#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p(133), 133, 134)
+#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p(135), 135, 136)
+#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)
+#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)
+#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p(137), 137, 138)
+#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p(139), 139, 140)
+#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)
+#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p(141), 141, 142)
+#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p(143), 143, 144)
+#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)
+#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)
+#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)
+#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p(145), 145, 146)
+#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p(147), 147, 148)
+#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)
+#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p(149), 149, 150)
+#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p(151), 151, 152)
+#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)
+#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)
+#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p(153), 153, 154)
+#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p(155), 155, 156)
+#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)
+#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p(157), 157, 158)
+#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p(159), 159, 160)
+#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)
+#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)
+#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)
+#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)
+#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p(161), 161, 162)
+#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p(163), 163, 164)
+#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)
+#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p(165), 165, 166)
+#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p(167), 167, 168)
+#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)
+#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)
+#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p(169), 169, 170)
+#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p(171), 171, 172)
+#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)
+#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p(173), 173, 174)
+#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p(175), 175, 176)
+#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)
+#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)
+#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)
+#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p(177), 177, 178)
+#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p(179), 179, 180)
+#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)
+#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p(181), 181, 182)
+#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p(183), 183, 184)
+#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)
+#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)
+#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p(185), 185, 186)
+#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p(187), 187, 188)
+#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)
+#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p(189), 189, 190)
+#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p(191), 191, 192)
+#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)
+#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)
+#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)
+#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)
+#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)
+#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p(193), 193, 194)
+#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p(195), 195, 196)
+#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)
+#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p(197), 197, 198)
+#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p(199), 199, 200)
+#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)
+#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)
+#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p(201), 201, 202)
+#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p(203), 203, 204)
+#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)
+#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p(205), 205, 206)
+#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p(207), 207, 208)
+#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)
+#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)
+#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)
+#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p(209), 209, 210)
+#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p(211), 211, 212)
+#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)
+#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p(213), 213, 214)
+#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p(215), 215, 216)
+#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)
+#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)
+#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p(217), 217, 218)
+#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p(219), 219, 220)
+#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)
+#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p(221), 221, 222)
+#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p(223), 223, 224)
+#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)
+#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)
+#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)
+#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)
+#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p(225), 225, 226)
+#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p(227), 227, 228)
+#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)
+#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p(229), 229, 230)
+#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p(231), 231, 232)
+#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)
+#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)
+#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p(233), 233, 234)
+#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p(235), 235, 236)
+#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)
+#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p(237), 237, 238)
+#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p(239), 239, 240)
+#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)
+#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)
+#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)
+#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p(241), 241, 242)
+#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p(243), 243, 244)
+#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)
+#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p(245), 245, 246)
+#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p(247), 247, 248)
+#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)
+#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)
+#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p(249), 249, 250)
+#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p(251), 251, 252)
+#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)
+#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p(253), 253, 254)
+#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p(255), 255, 256)
+#
+# endif
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/check.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/check.hpp
new file mode 100644
index 0000000..63f8ff9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/check.hpp
@@ -0,0 +1,48 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_CHECK_HPP
+# define BOOST_PREPROCESSOR_DETAIL_CHECK_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_CHECK */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_D(x, type)
+# else
+#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_OO((x, type))
+#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_D ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, type x))
+#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)
+#    define BOOST_PP_CHECK_2(res, _) res
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(type x)
+#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)
+#    define BOOST_PP_CHECK_2(chk) BOOST_PP_CHECK_3((BOOST_PP_CHECK_RESULT_ ## chk))
+#    define BOOST_PP_CHECK_3(im) BOOST_PP_CHECK_5(BOOST_PP_CHECK_4 im)
+#    define BOOST_PP_CHECK_4(res, _) res
+#    define BOOST_PP_CHECK_5(res) res
+# else /* DMC */
+#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_OO((type x))
+#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_0 ## par
+#    define BOOST_PP_CHECK_0(chk) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, chk))
+#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)
+#    define BOOST_PP_CHECK_2(res, _) res
+# endif
+#
+# define BOOST_PP_CHECK_RESULT_1 1, BOOST_PP_NIL
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/dmc/auto_rec.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/dmc/auto_rec.hpp
new file mode 100644
index 0000000..37fbe04
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/dmc/auto_rec.hpp
@@ -0,0 +1,286 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP
+# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+#
+# /* BOOST_PP_AUTO_REC */
+#
+# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)
+#
+# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)
+# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)
+# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)
+#
+# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p##(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)
+#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p##(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)
+#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p##(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)
+#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p##(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)
+#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p##(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)
+#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p##(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)
+#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p##(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)
+#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p##(1), 1, 2)
+#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p##(3), 3, 4)
+#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p##(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)
+#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p##(5), 5, 6)
+#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p##(7), 7, 8)
+#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p##(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)
+#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p##(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)
+#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p##(9), 9, 10)
+#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p##(11), 11, 12)
+#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p##(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)
+#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p##(13), 13, 14)
+#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p##(15), 15, 16)
+#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p##(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)
+#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p##(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)
+#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p##(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)
+#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p##(17), 17, 18)
+#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p##(19), 19, 20)
+#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p##(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)
+#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p##(21), 21, 22)
+#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p##(23), 23, 24)
+#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p##(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)
+#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p##(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)
+#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p##(25), 25, 26)
+#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p##(27), 27, 28)
+#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p##(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)
+#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p##(29), 29, 30)
+#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p##(31), 31, 32)
+#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p##(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)
+#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p##(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)
+#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p##(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)
+#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p##(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)
+#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p##(33), 33, 34)
+#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p##(35), 35, 36)
+#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p##(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)
+#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p##(37), 37, 38)
+#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p##(39), 39, 40)
+#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p##(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)
+#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p##(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)
+#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p##(41), 41, 42)
+#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p##(43), 43, 44)
+#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p##(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)
+#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p##(45), 45, 46)
+#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p##(47), 47, 48)
+#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p##(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)
+#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p##(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)
+#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p##(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)
+#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p##(49), 49, 50)
+#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p##(51), 51, 52)
+#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p##(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)
+#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p##(53), 53, 54)
+#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p##(55), 55, 56)
+#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p##(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)
+#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p##(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)
+#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p##(57), 57, 58)
+#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p##(59), 59, 60)
+#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p##(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)
+#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p##(61), 61, 62)
+#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p##(63), 63, 64)
+#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p##(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)
+#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p##(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)
+#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p##(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)
+#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p##(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)
+#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p##(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)
+#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p##(65), 65, 66)
+#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p##(67), 67, 68)
+#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p##(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)
+#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p##(69), 69, 70)
+#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p##(71), 71, 72)
+#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p##(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)
+#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p##(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)
+#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p##(73), 73, 74)
+#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p##(75), 75, 76)
+#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p##(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)
+#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p##(77), 77, 78)
+#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p##(79), 79, 80)
+#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p##(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)
+#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p##(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)
+#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p##(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)
+#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p##(81), 81, 82)
+#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p##(83), 83, 84)
+#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p##(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)
+#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p##(85), 85, 86)
+#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p##(87), 87, 88)
+#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p##(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)
+#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p##(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)
+#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p##(89), 89, 90)
+#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p##(91), 91, 92)
+#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p##(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)
+#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p##(93), 93, 94)
+#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p##(95), 95, 96)
+#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p##(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)
+#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p##(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)
+#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p##(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)
+#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p##(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)
+#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p##(97), 97, 98)
+#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p##(99), 99, 100)
+#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p##(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)
+#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p##(101), 101, 102)
+#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p##(103), 103, 104)
+#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p##(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)
+#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p##(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)
+#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p##(105), 105, 106)
+#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p##(107), 107, 108)
+#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p##(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)
+#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p##(109), 109, 110)
+#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p##(111), 111, 112)
+#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p##(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)
+#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p##(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)
+#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p##(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)
+#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p##(113), 113, 114)
+#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p##(115), 115, 116)
+#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p##(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)
+#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p##(117), 117, 118)
+#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p##(119), 119, 120)
+#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p##(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)
+#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p##(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)
+#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p##(121), 121, 122)
+#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p##(123), 123, 124)
+#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p##(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)
+#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p##(125), 125, 126)
+#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p##(127), 127, 128)
+#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p##(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)
+#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p##(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)
+#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p##(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)
+#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p##(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)
+#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p##(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)
+#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p##(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)
+#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p##(129), 129, 130)
+#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p##(131), 131, 132)
+#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p##(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)
+#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p##(133), 133, 134)
+#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p##(135), 135, 136)
+#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p##(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)
+#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p##(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)
+#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p##(137), 137, 138)
+#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p##(139), 139, 140)
+#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p##(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)
+#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p##(141), 141, 142)
+#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p##(143), 143, 144)
+#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p##(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)
+#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p##(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)
+#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p##(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)
+#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p##(145), 145, 146)
+#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p##(147), 147, 148)
+#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p##(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)
+#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p##(149), 149, 150)
+#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p##(151), 151, 152)
+#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p##(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)
+#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p##(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)
+#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p##(153), 153, 154)
+#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p##(155), 155, 156)
+#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p##(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)
+#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p##(157), 157, 158)
+#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p##(159), 159, 160)
+#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p##(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)
+#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p##(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)
+#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p##(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)
+#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p##(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)
+#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p##(161), 161, 162)
+#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p##(163), 163, 164)
+#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p##(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)
+#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p##(165), 165, 166)
+#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p##(167), 167, 168)
+#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p##(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)
+#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p##(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)
+#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p##(169), 169, 170)
+#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p##(171), 171, 172)
+#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p##(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)
+#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p##(173), 173, 174)
+#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p##(175), 175, 176)
+#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p##(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)
+#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p##(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)
+#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p##(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)
+#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p##(177), 177, 178)
+#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p##(179), 179, 180)
+#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p##(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)
+#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p##(181), 181, 182)
+#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p##(183), 183, 184)
+#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p##(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)
+#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p##(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)
+#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p##(185), 185, 186)
+#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p##(187), 187, 188)
+#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p##(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)
+#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p##(189), 189, 190)
+#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p##(191), 191, 192)
+#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p##(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)
+#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p##(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)
+#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p##(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)
+#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p##(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)
+#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p##(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)
+#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p##(193), 193, 194)
+#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p##(195), 195, 196)
+#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p##(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)
+#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p##(197), 197, 198)
+#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p##(199), 199, 200)
+#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p##(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)
+#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p##(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)
+#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p##(201), 201, 202)
+#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p##(203), 203, 204)
+#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p##(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)
+#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p##(205), 205, 206)
+#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p##(207), 207, 208)
+#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p##(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)
+#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p##(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)
+#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p##(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)
+#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p##(209), 209, 210)
+#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p##(211), 211, 212)
+#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p##(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)
+#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p##(213), 213, 214)
+#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p##(215), 215, 216)
+#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p##(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)
+#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p##(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)
+#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p##(217), 217, 218)
+#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p##(219), 219, 220)
+#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p##(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)
+#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p##(221), 221, 222)
+#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p##(223), 223, 224)
+#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p##(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)
+#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p##(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)
+#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p##(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)
+#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p##(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)
+#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p##(225), 225, 226)
+#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p##(227), 227, 228)
+#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p##(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)
+#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p##(229), 229, 230)
+#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p##(231), 231, 232)
+#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p##(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)
+#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p##(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)
+#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p##(233), 233, 234)
+#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p##(235), 235, 236)
+#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p##(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)
+#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p##(237), 237, 238)
+#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p##(239), 239, 240)
+#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p##(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)
+#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p##(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)
+#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p##(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)
+#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p##(241), 241, 242)
+#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p##(243), 243, 244)
+#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p##(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)
+#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p##(245), 245, 246)
+#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p##(247), 247, 248)
+#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p##(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)
+#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p##(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)
+#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p##(249), 249, 250)
+#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p##(251), 251, 252)
+#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p##(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)
+#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p##(253), 253, 254)
+#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p##(255), 255, 256)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/is_binary.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/is_binary.hpp
new file mode 100644
index 0000000..3428833
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/is_binary.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP
+# define BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/detail/check.hpp>
+#
+# /* BOOST_PP_IS_BINARY */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_IS_BINARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)
+# else
+#    define BOOST_PP_IS_BINARY(x) BOOST_PP_IS_BINARY_I(x)
+#    define BOOST_PP_IS_BINARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)
+# endif
+#
+# define BOOST_PP_IS_BINARY_CHECK(a, b) 1
+# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_BINARY_CHECK 0, BOOST_PP_NIL
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/is_nullary.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/is_nullary.hpp
new file mode 100644
index 0000000..dee4075
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/is_nullary.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP
+# define BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/detail/check.hpp>
+#
+# /* BOOST_PP_IS_NULLARY */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)
+# else
+#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_IS_NULLARY_I(x)
+#    define BOOST_PP_IS_NULLARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)
+# endif
+#
+# define BOOST_PP_IS_NULLARY_CHECK() 1
+# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_NULLARY_CHECK 0, BOOST_PP_NIL
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/is_unary.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/is_unary.hpp
new file mode 100644
index 0000000..e73cdfb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/is_unary.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_IS_UNARY_HPP
+# define BOOST_PREPROCESSOR_DETAIL_IS_UNARY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/detail/check.hpp>
+#
+# /* BOOST_PP_IS_UNARY */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_IS_UNARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_UNARY_CHECK)
+# else
+#    define BOOST_PP_IS_UNARY(x) BOOST_PP_IS_UNARY_I(x)
+#    define BOOST_PP_IS_UNARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_UNARY_CHECK)
+# endif
+#
+# define BOOST_PP_IS_UNARY_CHECK(a) 1
+# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_UNARY_CHECK 0, BOOST_PP_NIL
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/null.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/null.hpp
new file mode 100644
index 0000000..5eb0bd4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/null.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_NULL_HPP
+# define BOOST_PREPROCESSOR_DETAIL_NULL_HPP
+#
+# /* empty file */
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/detail/split.hpp b/gatb-core/thirdparty/boost/preprocessor/detail/split.hpp
new file mode 100644
index 0000000..f28a723
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/detail/split.hpp
@@ -0,0 +1,35 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# ifndef BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP
+# define BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_SPLIT */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I((n, im))
+#    define BOOST_PP_SPLIT_I(par) BOOST_PP_SPLIT_II ## par
+#    define BOOST_PP_SPLIT_II(n, a, b) BOOST_PP_SPLIT_ ## n(a, b)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n((im)))
+#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_II_ ## n)
+#    define BOOST_PP_SPLIT_II_0(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_0 s)
+#    define BOOST_PP_SPLIT_II_1(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_1 s)
+#    define BOOST_PP_SPLIT_ID(id) id
+# else
+#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n)(im)
+#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ ## n
+# endif
+#
+# define BOOST_PP_SPLIT_0(a, b) a
+# define BOOST_PP_SPLIT_1(a, b) b
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/empty.hpp b/gatb-core/thirdparty/boost/preprocessor/empty.hpp
new file mode 100644
index 0000000..116ef74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/empty.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_EMPTY_HPP
+# define BOOST_PREPROCESSOR_EMPTY_HPP
+#
+# include <boost/preprocessor/facilities/empty.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/enum.hpp
new file mode 100644
index 0000000..ae05bb0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_HPP
+# define BOOST_PREPROCESSOR_ENUM_HPP
+#
+# include <boost/preprocessor/repetition/enum.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum_params.hpp b/gatb-core/thirdparty/boost/preprocessor/enum_params.hpp
new file mode 100644
index 0000000..414f8aa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum_params.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_HPP
+# define BOOST_PREPROCESSOR_ENUM_PARAMS_HPP
+#
+# include <boost/preprocessor/repetition/enum_params.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum_params_with_a_default.hpp b/gatb-core/thirdparty/boost/preprocessor/enum_params_with_a_default.hpp
new file mode 100644
index 0000000..fd1ad4c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum_params_with_a_default.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP
+# define BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP
+#
+# include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum_params_with_defaults.hpp b/gatb-core/thirdparty/boost/preprocessor/enum_params_with_defaults.hpp
new file mode 100644
index 0000000..e58fa3e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum_params_with_defaults.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_DEFAULTS_HPP
+# define BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_DEFAULTS_HPP
+#
+# include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum_shifted.hpp b/gatb-core/thirdparty/boost/preprocessor/enum_shifted.hpp
new file mode 100644
index 0000000..aa6a698
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum_shifted.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_SHIFTED_HPP
+# define BOOST_PREPROCESSOR_ENUM_SHIFTED_HPP
+#
+# include <boost/preprocessor/repetition/enum_shifted.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/enum_shifted_params.hpp b/gatb-core/thirdparty/boost/preprocessor/enum_shifted_params.hpp
new file mode 100644
index 0000000..462c642
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/enum_shifted_params.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP
+# define BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP
+#
+# include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/expand.hpp b/gatb-core/thirdparty/boost/preprocessor/expand.hpp
new file mode 100644
index 0000000..8c5d972
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/expand.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_EXPAND_HPP
+# define BOOST_PREPROCESSOR_EXPAND_HPP
+#
+# include <boost/preprocessor/facilities/expand.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/expr_if.hpp b/gatb-core/thirdparty/boost/preprocessor/expr_if.hpp
new file mode 100644
index 0000000..f93e29b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/expr_if.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_EXPR_IF_HPP
+# define BOOST_PREPROCESSOR_EXPR_IF_HPP
+#
+# include <boost/preprocessor/control/expr_if.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities.hpp
new file mode 100644
index 0000000..c20547c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities.hpp
@@ -0,0 +1,23 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_HPP
+#
+# include <boost/preprocessor/facilities/apply.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/expand.hpp>
+# include <boost/preprocessor/facilities/identity.hpp>
+# include <boost/preprocessor/facilities/intercept.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/apply.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/apply.hpp
new file mode 100644
index 0000000..e7d8c36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/apply.hpp
@@ -0,0 +1,34 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_APPLY_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_APPLY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/detail/is_unary.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_APPLY */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_APPLY(x) BOOST_PP_APPLY_I(x)
+#    define BOOST_PP_APPLY_I(x) BOOST_PP_EXPR_IIF(BOOST_PP_IS_UNARY(x), BOOST_PP_TUPLE_REM_1 x)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()
+#    define BOOST_PP_APPLY(x) BOOST_PP_APPLY_I(x)
+#    define BOOST_PP_APPLY_I(x) BOOST_PP_APPLY_ ## x
+#    define BOOST_PP_APPLY_(x) x
+#    define BOOST_PP_APPLY_BOOST_PP_NIL
+# else
+#    define BOOST_PP_APPLY(x) BOOST_PP_EXPR_IIF(BOOST_PP_IS_UNARY(x), BOOST_PP_TUPLE_REM_1 x)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/empty.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/empty.hpp
new file mode 100644
index 0000000..46db190
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/empty.hpp
@@ -0,0 +1,21 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP
+#
+# /* BOOST_PP_EMPTY */
+#
+# define BOOST_PP_EMPTY()
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/expand.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/expand.hpp
new file mode 100644
index 0000000..c8661a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/expand.hpp
@@ -0,0 +1,28 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_I(x)
+# else
+#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_OO((x))
+#    define BOOST_PP_EXPAND_OO(par) BOOST_PP_EXPAND_I ## par
+# endif
+#
+# define BOOST_PP_EXPAND_I(x) x
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/identity.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/identity.hpp
new file mode 100644
index 0000000..13ec4ca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/identity.hpp
@@ -0,0 +1,23 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP
+#
+# include <boost/preprocessor/facilities/empty.hpp>
+#
+# /* BOOST_PP_IDENTITY */
+#
+# define BOOST_PP_IDENTITY(item) item BOOST_PP_EMPTY
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/intercept.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/intercept.hpp
new file mode 100644
index 0000000..41dcc6a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/intercept.hpp
@@ -0,0 +1,277 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP
+#
+# /* BOOST_PP_INTERCEPT */
+#
+# define BOOST_PP_INTERCEPT BOOST_PP_INTERCEPT_
+#
+# define BOOST_PP_INTERCEPT_0
+# define BOOST_PP_INTERCEPT_1
+# define BOOST_PP_INTERCEPT_2
+# define BOOST_PP_INTERCEPT_3
+# define BOOST_PP_INTERCEPT_4
+# define BOOST_PP_INTERCEPT_5
+# define BOOST_PP_INTERCEPT_6
+# define BOOST_PP_INTERCEPT_7
+# define BOOST_PP_INTERCEPT_8
+# define BOOST_PP_INTERCEPT_9
+# define BOOST_PP_INTERCEPT_10
+# define BOOST_PP_INTERCEPT_11
+# define BOOST_PP_INTERCEPT_12
+# define BOOST_PP_INTERCEPT_13
+# define BOOST_PP_INTERCEPT_14
+# define BOOST_PP_INTERCEPT_15
+# define BOOST_PP_INTERCEPT_16
+# define BOOST_PP_INTERCEPT_17
+# define BOOST_PP_INTERCEPT_18
+# define BOOST_PP_INTERCEPT_19
+# define BOOST_PP_INTERCEPT_20
+# define BOOST_PP_INTERCEPT_21
+# define BOOST_PP_INTERCEPT_22
+# define BOOST_PP_INTERCEPT_23
+# define BOOST_PP_INTERCEPT_24
+# define BOOST_PP_INTERCEPT_25
+# define BOOST_PP_INTERCEPT_26
+# define BOOST_PP_INTERCEPT_27
+# define BOOST_PP_INTERCEPT_28
+# define BOOST_PP_INTERCEPT_29
+# define BOOST_PP_INTERCEPT_30
+# define BOOST_PP_INTERCEPT_31
+# define BOOST_PP_INTERCEPT_32
+# define BOOST_PP_INTERCEPT_33
+# define BOOST_PP_INTERCEPT_34
+# define BOOST_PP_INTERCEPT_35
+# define BOOST_PP_INTERCEPT_36
+# define BOOST_PP_INTERCEPT_37
+# define BOOST_PP_INTERCEPT_38
+# define BOOST_PP_INTERCEPT_39
+# define BOOST_PP_INTERCEPT_40
+# define BOOST_PP_INTERCEPT_41
+# define BOOST_PP_INTERCEPT_42
+# define BOOST_PP_INTERCEPT_43
+# define BOOST_PP_INTERCEPT_44
+# define BOOST_PP_INTERCEPT_45
+# define BOOST_PP_INTERCEPT_46
+# define BOOST_PP_INTERCEPT_47
+# define BOOST_PP_INTERCEPT_48
+# define BOOST_PP_INTERCEPT_49
+# define BOOST_PP_INTERCEPT_50
+# define BOOST_PP_INTERCEPT_51
+# define BOOST_PP_INTERCEPT_52
+# define BOOST_PP_INTERCEPT_53
+# define BOOST_PP_INTERCEPT_54
+# define BOOST_PP_INTERCEPT_55
+# define BOOST_PP_INTERCEPT_56
+# define BOOST_PP_INTERCEPT_57
+# define BOOST_PP_INTERCEPT_58
+# define BOOST_PP_INTERCEPT_59
+# define BOOST_PP_INTERCEPT_60
+# define BOOST_PP_INTERCEPT_61
+# define BOOST_PP_INTERCEPT_62
+# define BOOST_PP_INTERCEPT_63
+# define BOOST_PP_INTERCEPT_64
+# define BOOST_PP_INTERCEPT_65
+# define BOOST_PP_INTERCEPT_66
+# define BOOST_PP_INTERCEPT_67
+# define BOOST_PP_INTERCEPT_68
+# define BOOST_PP_INTERCEPT_69
+# define BOOST_PP_INTERCEPT_70
+# define BOOST_PP_INTERCEPT_71
+# define BOOST_PP_INTERCEPT_72
+# define BOOST_PP_INTERCEPT_73
+# define BOOST_PP_INTERCEPT_74
+# define BOOST_PP_INTERCEPT_75
+# define BOOST_PP_INTERCEPT_76
+# define BOOST_PP_INTERCEPT_77
+# define BOOST_PP_INTERCEPT_78
+# define BOOST_PP_INTERCEPT_79
+# define BOOST_PP_INTERCEPT_80
+# define BOOST_PP_INTERCEPT_81
+# define BOOST_PP_INTERCEPT_82
+# define BOOST_PP_INTERCEPT_83
+# define BOOST_PP_INTERCEPT_84
+# define BOOST_PP_INTERCEPT_85
+# define BOOST_PP_INTERCEPT_86
+# define BOOST_PP_INTERCEPT_87
+# define BOOST_PP_INTERCEPT_88
+# define BOOST_PP_INTERCEPT_89
+# define BOOST_PP_INTERCEPT_90
+# define BOOST_PP_INTERCEPT_91
+# define BOOST_PP_INTERCEPT_92
+# define BOOST_PP_INTERCEPT_93
+# define BOOST_PP_INTERCEPT_94
+# define BOOST_PP_INTERCEPT_95
+# define BOOST_PP_INTERCEPT_96
+# define BOOST_PP_INTERCEPT_97
+# define BOOST_PP_INTERCEPT_98
+# define BOOST_PP_INTERCEPT_99
+# define BOOST_PP_INTERCEPT_100
+# define BOOST_PP_INTERCEPT_101
+# define BOOST_PP_INTERCEPT_102
+# define BOOST_PP_INTERCEPT_103
+# define BOOST_PP_INTERCEPT_104
+# define BOOST_PP_INTERCEPT_105
+# define BOOST_PP_INTERCEPT_106
+# define BOOST_PP_INTERCEPT_107
+# define BOOST_PP_INTERCEPT_108
+# define BOOST_PP_INTERCEPT_109
+# define BOOST_PP_INTERCEPT_110
+# define BOOST_PP_INTERCEPT_111
+# define BOOST_PP_INTERCEPT_112
+# define BOOST_PP_INTERCEPT_113
+# define BOOST_PP_INTERCEPT_114
+# define BOOST_PP_INTERCEPT_115
+# define BOOST_PP_INTERCEPT_116
+# define BOOST_PP_INTERCEPT_117
+# define BOOST_PP_INTERCEPT_118
+# define BOOST_PP_INTERCEPT_119
+# define BOOST_PP_INTERCEPT_120
+# define BOOST_PP_INTERCEPT_121
+# define BOOST_PP_INTERCEPT_122
+# define BOOST_PP_INTERCEPT_123
+# define BOOST_PP_INTERCEPT_124
+# define BOOST_PP_INTERCEPT_125
+# define BOOST_PP_INTERCEPT_126
+# define BOOST_PP_INTERCEPT_127
+# define BOOST_PP_INTERCEPT_128
+# define BOOST_PP_INTERCEPT_129
+# define BOOST_PP_INTERCEPT_130
+# define BOOST_PP_INTERCEPT_131
+# define BOOST_PP_INTERCEPT_132
+# define BOOST_PP_INTERCEPT_133
+# define BOOST_PP_INTERCEPT_134
+# define BOOST_PP_INTERCEPT_135
+# define BOOST_PP_INTERCEPT_136
+# define BOOST_PP_INTERCEPT_137
+# define BOOST_PP_INTERCEPT_138
+# define BOOST_PP_INTERCEPT_139
+# define BOOST_PP_INTERCEPT_140
+# define BOOST_PP_INTERCEPT_141
+# define BOOST_PP_INTERCEPT_142
+# define BOOST_PP_INTERCEPT_143
+# define BOOST_PP_INTERCEPT_144
+# define BOOST_PP_INTERCEPT_145
+# define BOOST_PP_INTERCEPT_146
+# define BOOST_PP_INTERCEPT_147
+# define BOOST_PP_INTERCEPT_148
+# define BOOST_PP_INTERCEPT_149
+# define BOOST_PP_INTERCEPT_150
+# define BOOST_PP_INTERCEPT_151
+# define BOOST_PP_INTERCEPT_152
+# define BOOST_PP_INTERCEPT_153
+# define BOOST_PP_INTERCEPT_154
+# define BOOST_PP_INTERCEPT_155
+# define BOOST_PP_INTERCEPT_156
+# define BOOST_PP_INTERCEPT_157
+# define BOOST_PP_INTERCEPT_158
+# define BOOST_PP_INTERCEPT_159
+# define BOOST_PP_INTERCEPT_160
+# define BOOST_PP_INTERCEPT_161
+# define BOOST_PP_INTERCEPT_162
+# define BOOST_PP_INTERCEPT_163
+# define BOOST_PP_INTERCEPT_164
+# define BOOST_PP_INTERCEPT_165
+# define BOOST_PP_INTERCEPT_166
+# define BOOST_PP_INTERCEPT_167
+# define BOOST_PP_INTERCEPT_168
+# define BOOST_PP_INTERCEPT_169
+# define BOOST_PP_INTERCEPT_170
+# define BOOST_PP_INTERCEPT_171
+# define BOOST_PP_INTERCEPT_172
+# define BOOST_PP_INTERCEPT_173
+# define BOOST_PP_INTERCEPT_174
+# define BOOST_PP_INTERCEPT_175
+# define BOOST_PP_INTERCEPT_176
+# define BOOST_PP_INTERCEPT_177
+# define BOOST_PP_INTERCEPT_178
+# define BOOST_PP_INTERCEPT_179
+# define BOOST_PP_INTERCEPT_180
+# define BOOST_PP_INTERCEPT_181
+# define BOOST_PP_INTERCEPT_182
+# define BOOST_PP_INTERCEPT_183
+# define BOOST_PP_INTERCEPT_184
+# define BOOST_PP_INTERCEPT_185
+# define BOOST_PP_INTERCEPT_186
+# define BOOST_PP_INTERCEPT_187
+# define BOOST_PP_INTERCEPT_188
+# define BOOST_PP_INTERCEPT_189
+# define BOOST_PP_INTERCEPT_190
+# define BOOST_PP_INTERCEPT_191
+# define BOOST_PP_INTERCEPT_192
+# define BOOST_PP_INTERCEPT_193
+# define BOOST_PP_INTERCEPT_194
+# define BOOST_PP_INTERCEPT_195
+# define BOOST_PP_INTERCEPT_196
+# define BOOST_PP_INTERCEPT_197
+# define BOOST_PP_INTERCEPT_198
+# define BOOST_PP_INTERCEPT_199
+# define BOOST_PP_INTERCEPT_200
+# define BOOST_PP_INTERCEPT_201
+# define BOOST_PP_INTERCEPT_202
+# define BOOST_PP_INTERCEPT_203
+# define BOOST_PP_INTERCEPT_204
+# define BOOST_PP_INTERCEPT_205
+# define BOOST_PP_INTERCEPT_206
+# define BOOST_PP_INTERCEPT_207
+# define BOOST_PP_INTERCEPT_208
+# define BOOST_PP_INTERCEPT_209
+# define BOOST_PP_INTERCEPT_210
+# define BOOST_PP_INTERCEPT_211
+# define BOOST_PP_INTERCEPT_212
+# define BOOST_PP_INTERCEPT_213
+# define BOOST_PP_INTERCEPT_214
+# define BOOST_PP_INTERCEPT_215
+# define BOOST_PP_INTERCEPT_216
+# define BOOST_PP_INTERCEPT_217
+# define BOOST_PP_INTERCEPT_218
+# define BOOST_PP_INTERCEPT_219
+# define BOOST_PP_INTERCEPT_220
+# define BOOST_PP_INTERCEPT_221
+# define BOOST_PP_INTERCEPT_222
+# define BOOST_PP_INTERCEPT_223
+# define BOOST_PP_INTERCEPT_224
+# define BOOST_PP_INTERCEPT_225
+# define BOOST_PP_INTERCEPT_226
+# define BOOST_PP_INTERCEPT_227
+# define BOOST_PP_INTERCEPT_228
+# define BOOST_PP_INTERCEPT_229
+# define BOOST_PP_INTERCEPT_230
+# define BOOST_PP_INTERCEPT_231
+# define BOOST_PP_INTERCEPT_232
+# define BOOST_PP_INTERCEPT_233
+# define BOOST_PP_INTERCEPT_234
+# define BOOST_PP_INTERCEPT_235
+# define BOOST_PP_INTERCEPT_236
+# define BOOST_PP_INTERCEPT_237
+# define BOOST_PP_INTERCEPT_238
+# define BOOST_PP_INTERCEPT_239
+# define BOOST_PP_INTERCEPT_240
+# define BOOST_PP_INTERCEPT_241
+# define BOOST_PP_INTERCEPT_242
+# define BOOST_PP_INTERCEPT_243
+# define BOOST_PP_INTERCEPT_244
+# define BOOST_PP_INTERCEPT_245
+# define BOOST_PP_INTERCEPT_246
+# define BOOST_PP_INTERCEPT_247
+# define BOOST_PP_INTERCEPT_248
+# define BOOST_PP_INTERCEPT_249
+# define BOOST_PP_INTERCEPT_250
+# define BOOST_PP_INTERCEPT_251
+# define BOOST_PP_INTERCEPT_252
+# define BOOST_PP_INTERCEPT_253
+# define BOOST_PP_INTERCEPT_254
+# define BOOST_PP_INTERCEPT_255
+# define BOOST_PP_INTERCEPT_256
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/is_1.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/is_1.hpp
new file mode 100644
index 0000000..f286dcd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/is_1.hpp
@@ -0,0 +1,23 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2003.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/facilities/is_empty.hpp>
+#
+# /* BOOST_PP_IS_1 */
+#
+# define BOOST_PP_IS_1(x) BOOST_PP_IS_EMPTY(BOOST_PP_CAT(BOOST_PP_IS_1_HELPER_, x))
+# define BOOST_PP_IS_1_HELPER_1
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty.hpp
new file mode 100644
index 0000000..638265c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty.hpp
@@ -0,0 +1,43 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2003.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/detail/split.hpp>
+#
+# /* BOOST_PP_IS_EMPTY */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(x BOOST_PP_IS_EMPTY_HELPER)
+#    define BOOST_PP_IS_EMPTY_I(contents) BOOST_PP_TUPLE_ELEM(2, 1, (BOOST_PP_IS_EMPTY_DEF_ ## contents()))
+#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 1, 1 BOOST_PP_EMPTY
+#    define BOOST_PP_IS_EMPTY_HELPER() , 0
+# else
+#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(BOOST_PP_IS_EMPTY_HELPER x ())
+#        define BOOST_PP_IS_EMPTY_I(test) BOOST_PP_IS_EMPTY_II(BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test)))
+#        define BOOST_PP_IS_EMPTY_II(id) id
+#    else
+#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I((BOOST_PP_IS_EMPTY_HELPER x ()))
+#        define BOOST_PP_IS_EMPTY_I(par) BOOST_PP_IS_EMPTY_II ## par
+#        define BOOST_PP_IS_EMPTY_II(test) BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test))
+#    endif
+#    define BOOST_PP_IS_EMPTY_HELPER() 1
+#    define BOOST_PP_IS_EMPTY_DEF_1 1, BOOST_PP_NIL
+#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 0, BOOST_PP_NIL
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty_or_1.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty_or_1.hpp
new file mode 100644
index 0000000..baa5da9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/is_empty_or_1.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2003.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_OR_1_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_OR_1_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/is_1.hpp>
+# include <boost/preprocessor/facilities/is_empty.hpp>
+#
+# /* BOOST_PP_IS_EMPTY_OR_1 */
+#
+# define BOOST_PP_IS_EMPTY_OR_1(x) \
+    BOOST_PP_IIF( \
+        BOOST_PP_IS_EMPTY(x BOOST_PP_EMPTY()), \
+        1 BOOST_PP_EMPTY, \
+        BOOST_PP_IS_1 \
+    )(x) \
+    /**/
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/facilities/overload.hpp b/gatb-core/thirdparty/boost/preprocessor/facilities/overload.hpp
new file mode 100644
index 0000000..1576316
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/facilities/overload.hpp
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+#
+# /* BOOST_PP_OVERLOAD */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_OVERLOAD(prefix, ...) BOOST_PP_CAT(prefix, BOOST_PP_VARIADIC_SIZE(__VA_ARGS__))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/for.hpp b/gatb-core/thirdparty/boost/preprocessor/for.hpp
new file mode 100644
index 0000000..9ec9cee
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/for.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FOR_HPP
+# define BOOST_PREPROCESSOR_FOR_HPP
+#
+# include <boost/preprocessor/repetition/for.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/identity.hpp b/gatb-core/thirdparty/boost/preprocessor/identity.hpp
new file mode 100644
index 0000000..847dd13
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/identity.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_IDENTITY_HPP
+# define BOOST_PREPROCESSOR_IDENTITY_HPP
+#
+# include <boost/preprocessor/facilities/identity.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/if.hpp b/gatb-core/thirdparty/boost/preprocessor/if.hpp
new file mode 100644
index 0000000..f1783f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/if.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_IF_HPP
+# define BOOST_PREPROCESSOR_IF_HPP
+#
+# include <boost/preprocessor/control/if.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/inc.hpp b/gatb-core/thirdparty/boost/preprocessor/inc.hpp
new file mode 100644
index 0000000..b98d3a6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/inc.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_INC_HPP
+# define BOOST_PREPROCESSOR_INC_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iterate.hpp b/gatb-core/thirdparty/boost/preprocessor/iterate.hpp
new file mode 100644
index 0000000..e720ec8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iterate.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ITERATE_HPP
+# define BOOST_PREPROCESSOR_ITERATE_HPP
+#
+# include <boost/preprocessor/iteration/iterate.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration.hpp
new file mode 100644
index 0000000..1055ac0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration.hpp
@@ -0,0 +1,19 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ITERATION_HPP
+# define BOOST_PREPROCESSOR_ITERATION_HPP
+#
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/iteration/local.hpp>
+# include <boost/preprocessor/iteration/self.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower1.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower1.hpp
new file mode 100644
index 0000000..6694d0b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower1.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_START_1
+#
+# undef BOOST_PP_ITERATION_START_1_DIGIT_1
+# undef BOOST_PP_ITERATION_START_1_DIGIT_2
+# undef BOOST_PP_ITERATION_START_1_DIGIT_3
+# undef BOOST_PP_ITERATION_START_1_DIGIT_4
+# undef BOOST_PP_ITERATION_START_1_DIGIT_5
+# undef BOOST_PP_ITERATION_START_1_DIGIT_6
+# undef BOOST_PP_ITERATION_START_1_DIGIT_7
+# undef BOOST_PP_ITERATION_START_1_DIGIT_8
+# undef BOOST_PP_ITERATION_START_1_DIGIT_9
+# undef BOOST_PP_ITERATION_START_1_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_START_1_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_START_1_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_START_1_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_START_1_DIGIT_3
+#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_1_DIGIT_3, BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)
+# elif BOOST_PP_ITERATION_START_1_DIGIT_2
+#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_START_1 BOOST_PP_ITERATION_START_1_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower2.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower2.hpp
new file mode 100644
index 0000000..ece21fc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower2.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_START_2
+#
+# undef BOOST_PP_ITERATION_START_2_DIGIT_1
+# undef BOOST_PP_ITERATION_START_2_DIGIT_2
+# undef BOOST_PP_ITERATION_START_2_DIGIT_3
+# undef BOOST_PP_ITERATION_START_2_DIGIT_4
+# undef BOOST_PP_ITERATION_START_2_DIGIT_5
+# undef BOOST_PP_ITERATION_START_2_DIGIT_6
+# undef BOOST_PP_ITERATION_START_2_DIGIT_7
+# undef BOOST_PP_ITERATION_START_2_DIGIT_8
+# undef BOOST_PP_ITERATION_START_2_DIGIT_9
+# undef BOOST_PP_ITERATION_START_2_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_START_2_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_START_2_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_START_2_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_START_2_DIGIT_3
+#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_2_DIGIT_3, BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)
+# elif BOOST_PP_ITERATION_START_2_DIGIT_2
+#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_START_2 BOOST_PP_ITERATION_START_2_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower3.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower3.hpp
new file mode 100644
index 0000000..8429eac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower3.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_START_3
+#
+# undef BOOST_PP_ITERATION_START_3_DIGIT_1
+# undef BOOST_PP_ITERATION_START_3_DIGIT_2
+# undef BOOST_PP_ITERATION_START_3_DIGIT_3
+# undef BOOST_PP_ITERATION_START_3_DIGIT_4
+# undef BOOST_PP_ITERATION_START_3_DIGIT_5
+# undef BOOST_PP_ITERATION_START_3_DIGIT_6
+# undef BOOST_PP_ITERATION_START_3_DIGIT_7
+# undef BOOST_PP_ITERATION_START_3_DIGIT_8
+# undef BOOST_PP_ITERATION_START_3_DIGIT_9
+# undef BOOST_PP_ITERATION_START_3_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_START_3_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_START_3_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_START_3_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_START_3_DIGIT_3
+#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_3_DIGIT_3, BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)
+# elif BOOST_PP_ITERATION_START_3_DIGIT_2
+#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_START_3 BOOST_PP_ITERATION_START_3_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower4.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower4.hpp
new file mode 100644
index 0000000..ba0832f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower4.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_START_4
+#
+# undef BOOST_PP_ITERATION_START_4_DIGIT_1
+# undef BOOST_PP_ITERATION_START_4_DIGIT_2
+# undef BOOST_PP_ITERATION_START_4_DIGIT_3
+# undef BOOST_PP_ITERATION_START_4_DIGIT_4
+# undef BOOST_PP_ITERATION_START_4_DIGIT_5
+# undef BOOST_PP_ITERATION_START_4_DIGIT_6
+# undef BOOST_PP_ITERATION_START_4_DIGIT_7
+# undef BOOST_PP_ITERATION_START_4_DIGIT_8
+# undef BOOST_PP_ITERATION_START_4_DIGIT_9
+# undef BOOST_PP_ITERATION_START_4_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_START_4_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_START_4_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_START_4_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_START_4_DIGIT_3
+#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_4_DIGIT_3, BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)
+# elif BOOST_PP_ITERATION_START_4_DIGIT_2
+#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_START_4 BOOST_PP_ITERATION_START_4_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower5.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower5.hpp
new file mode 100644
index 0000000..f4888c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/lower5.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_START_5
+#
+# undef BOOST_PP_ITERATION_START_5_DIGIT_1
+# undef BOOST_PP_ITERATION_START_5_DIGIT_2
+# undef BOOST_PP_ITERATION_START_5_DIGIT_3
+# undef BOOST_PP_ITERATION_START_5_DIGIT_4
+# undef BOOST_PP_ITERATION_START_5_DIGIT_5
+# undef BOOST_PP_ITERATION_START_5_DIGIT_6
+# undef BOOST_PP_ITERATION_START_5_DIGIT_7
+# undef BOOST_PP_ITERATION_START_5_DIGIT_8
+# undef BOOST_PP_ITERATION_START_5_DIGIT_9
+# undef BOOST_PP_ITERATION_START_5_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_START_5_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_START_5_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_START_5_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_START_5_DIGIT_3
+#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_5_DIGIT_3, BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)
+# elif BOOST_PP_ITERATION_START_5_DIGIT_2
+#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_START_5 BOOST_PP_ITERATION_START_5_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper1.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper1.hpp
new file mode 100644
index 0000000..50d0fcf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper1.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_FINISH_1
+#
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_1
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_2
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_3
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_4
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_5
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_6
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_7
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_8
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_9
+# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_FINISH_1_DIGIT_3
+#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_1_DIGIT_3, BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)
+# elif BOOST_PP_ITERATION_FINISH_1_DIGIT_2
+#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_ITERATION_FINISH_1_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper2.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper2.hpp
new file mode 100644
index 0000000..faef6f4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper2.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_FINISH_2
+#
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_1
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_2
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_3
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_4
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_5
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_6
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_7
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_8
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_9
+# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_FINISH_2_DIGIT_3
+#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_2_DIGIT_3, BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)
+# elif BOOST_PP_ITERATION_FINISH_2_DIGIT_2
+#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_ITERATION_FINISH_2_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper3.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper3.hpp
new file mode 100644
index 0000000..38d9ade
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper3.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_FINISH_3
+#
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_1
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_2
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_3
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_4
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_5
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_6
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_7
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_8
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_9
+# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_FINISH_3_DIGIT_3
+#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_3_DIGIT_3, BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)
+# elif BOOST_PP_ITERATION_FINISH_3_DIGIT_2
+#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_ITERATION_FINISH_3_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper4.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper4.hpp
new file mode 100644
index 0000000..7f771c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper4.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_FINISH_4
+#
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_1
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_2
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_3
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_4
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_5
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_6
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_7
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_8
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_9
+# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_FINISH_4_DIGIT_3
+#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_4_DIGIT_3, BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)
+# elif BOOST_PP_ITERATION_FINISH_4_DIGIT_2
+#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_ITERATION_FINISH_4_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper5.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper5.hpp
new file mode 100644
index 0000000..9f27d58
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/bounds/upper5.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_ITERATION_FINISH_5
+#
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_1
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_2
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_3
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_4
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_5
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_6
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_7
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_8
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_9
+# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_ITERATION_FINISH_5_DIGIT_3
+#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_5_DIGIT_3, BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)
+# elif BOOST_PP_ITERATION_FINISH_5_DIGIT_2
+#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)
+# else
+#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_ITERATION_FINISH_5_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/finish.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/finish.hpp
new file mode 100644
index 0000000..0236944
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/finish.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_LOCAL_FE
+#
+# undef BOOST_PP_LOCAL_FE_DIGIT_1
+# undef BOOST_PP_LOCAL_FE_DIGIT_2
+# undef BOOST_PP_LOCAL_FE_DIGIT_3
+# undef BOOST_PP_LOCAL_FE_DIGIT_4
+# undef BOOST_PP_LOCAL_FE_DIGIT_5
+# undef BOOST_PP_LOCAL_FE_DIGIT_6
+# undef BOOST_PP_LOCAL_FE_DIGIT_7
+# undef BOOST_PP_LOCAL_FE_DIGIT_8
+# undef BOOST_PP_LOCAL_FE_DIGIT_9
+# undef BOOST_PP_LOCAL_FE_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_LOCAL_FE_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_LOCAL_FE_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_LOCAL_FE_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_LOCAL_FE_DIGIT_3
+#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_FE_DIGIT_3, BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)
+# elif BOOST_PP_LOCAL_FE_DIGIT_2
+#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)
+# else
+#    define BOOST_PP_LOCAL_FE() BOOST_PP_LOCAL_FE_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward1.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward1.hpp
new file mode 100644
index 0000000..3c6a458
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward1.hpp
@@ -0,0 +1,1342 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if defined(BOOST_PP_ITERATION_LIMITS)
+#    if !defined(BOOST_PP_FILENAME_1)
+#        error BOOST_PP_ERROR:  depth #1 filename is not defined
+#    endif
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>
+#    define BOOST_PP_ITERATION_FLAGS_1() 0
+#    undef BOOST_PP_ITERATION_LIMITS
+# elif defined(BOOST_PP_ITERATION_PARAMS_1)
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_1)
+#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_1)
+#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>
+#    define BOOST_PP_FILENAME_1 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_1)
+#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_1) >= 4
+#        define BOOST_PP_ITERATION_FLAGS_1() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_1)
+#    else
+#        define BOOST_PP_ITERATION_FLAGS_1() 0
+#    endif
+# else
+#    error BOOST_PP_ERROR:  depth #1 iteration boundaries or filename not defined
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 1
+#
+# define BOOST_PP_IS_ITERATING 1
+#
+# if (BOOST_PP_ITERATION_START_1) > (BOOST_PP_ITERATION_FINISH_1)
+#    include <boost/preprocessor/iteration/detail/iter/reverse1.hpp>
+# else
+#    if BOOST_PP_ITERATION_START_1 <= 0 && BOOST_PP_ITERATION_FINISH_1 >= 0
+#        define BOOST_PP_ITERATION_1 0
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 1 && BOOST_PP_ITERATION_FINISH_1 >= 1
+#        define BOOST_PP_ITERATION_1 1
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 2 && BOOST_PP_ITERATION_FINISH_1 >= 2
+#        define BOOST_PP_ITERATION_1 2
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 3 && BOOST_PP_ITERATION_FINISH_1 >= 3
+#        define BOOST_PP_ITERATION_1 3
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 4 && BOOST_PP_ITERATION_FINISH_1 >= 4
+#        define BOOST_PP_ITERATION_1 4
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 5 && BOOST_PP_ITERATION_FINISH_1 >= 5
+#        define BOOST_PP_ITERATION_1 5
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 6 && BOOST_PP_ITERATION_FINISH_1 >= 6
+#        define BOOST_PP_ITERATION_1 6
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 7 && BOOST_PP_ITERATION_FINISH_1 >= 7
+#        define BOOST_PP_ITERATION_1 7
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 8 && BOOST_PP_ITERATION_FINISH_1 >= 8
+#        define BOOST_PP_ITERATION_1 8
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 9 && BOOST_PP_ITERATION_FINISH_1 >= 9
+#        define BOOST_PP_ITERATION_1 9
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 10 && BOOST_PP_ITERATION_FINISH_1 >= 10
+#        define BOOST_PP_ITERATION_1 10
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 11 && BOOST_PP_ITERATION_FINISH_1 >= 11
+#        define BOOST_PP_ITERATION_1 11
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 12 && BOOST_PP_ITERATION_FINISH_1 >= 12
+#        define BOOST_PP_ITERATION_1 12
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 13 && BOOST_PP_ITERATION_FINISH_1 >= 13
+#        define BOOST_PP_ITERATION_1 13
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 14 && BOOST_PP_ITERATION_FINISH_1 >= 14
+#        define BOOST_PP_ITERATION_1 14
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 15 && BOOST_PP_ITERATION_FINISH_1 >= 15
+#        define BOOST_PP_ITERATION_1 15
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 16 && BOOST_PP_ITERATION_FINISH_1 >= 16
+#        define BOOST_PP_ITERATION_1 16
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 17 && BOOST_PP_ITERATION_FINISH_1 >= 17
+#        define BOOST_PP_ITERATION_1 17
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 18 && BOOST_PP_ITERATION_FINISH_1 >= 18
+#        define BOOST_PP_ITERATION_1 18
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 19 && BOOST_PP_ITERATION_FINISH_1 >= 19
+#        define BOOST_PP_ITERATION_1 19
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 20 && BOOST_PP_ITERATION_FINISH_1 >= 20
+#        define BOOST_PP_ITERATION_1 20
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 21 && BOOST_PP_ITERATION_FINISH_1 >= 21
+#        define BOOST_PP_ITERATION_1 21
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 22 && BOOST_PP_ITERATION_FINISH_1 >= 22
+#        define BOOST_PP_ITERATION_1 22
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 23 && BOOST_PP_ITERATION_FINISH_1 >= 23
+#        define BOOST_PP_ITERATION_1 23
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 24 && BOOST_PP_ITERATION_FINISH_1 >= 24
+#        define BOOST_PP_ITERATION_1 24
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 25 && BOOST_PP_ITERATION_FINISH_1 >= 25
+#        define BOOST_PP_ITERATION_1 25
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 26 && BOOST_PP_ITERATION_FINISH_1 >= 26
+#        define BOOST_PP_ITERATION_1 26
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 27 && BOOST_PP_ITERATION_FINISH_1 >= 27
+#        define BOOST_PP_ITERATION_1 27
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 28 && BOOST_PP_ITERATION_FINISH_1 >= 28
+#        define BOOST_PP_ITERATION_1 28
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 29 && BOOST_PP_ITERATION_FINISH_1 >= 29
+#        define BOOST_PP_ITERATION_1 29
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 30 && BOOST_PP_ITERATION_FINISH_1 >= 30
+#        define BOOST_PP_ITERATION_1 30
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 31 && BOOST_PP_ITERATION_FINISH_1 >= 31
+#        define BOOST_PP_ITERATION_1 31
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 32 && BOOST_PP_ITERATION_FINISH_1 >= 32
+#        define BOOST_PP_ITERATION_1 32
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 33 && BOOST_PP_ITERATION_FINISH_1 >= 33
+#        define BOOST_PP_ITERATION_1 33
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 34 && BOOST_PP_ITERATION_FINISH_1 >= 34
+#        define BOOST_PP_ITERATION_1 34
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 35 && BOOST_PP_ITERATION_FINISH_1 >= 35
+#        define BOOST_PP_ITERATION_1 35
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 36 && BOOST_PP_ITERATION_FINISH_1 >= 36
+#        define BOOST_PP_ITERATION_1 36
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 37 && BOOST_PP_ITERATION_FINISH_1 >= 37
+#        define BOOST_PP_ITERATION_1 37
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 38 && BOOST_PP_ITERATION_FINISH_1 >= 38
+#        define BOOST_PP_ITERATION_1 38
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 39 && BOOST_PP_ITERATION_FINISH_1 >= 39
+#        define BOOST_PP_ITERATION_1 39
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 40 && BOOST_PP_ITERATION_FINISH_1 >= 40
+#        define BOOST_PP_ITERATION_1 40
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 41 && BOOST_PP_ITERATION_FINISH_1 >= 41
+#        define BOOST_PP_ITERATION_1 41
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 42 && BOOST_PP_ITERATION_FINISH_1 >= 42
+#        define BOOST_PP_ITERATION_1 42
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 43 && BOOST_PP_ITERATION_FINISH_1 >= 43
+#        define BOOST_PP_ITERATION_1 43
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 44 && BOOST_PP_ITERATION_FINISH_1 >= 44
+#        define BOOST_PP_ITERATION_1 44
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 45 && BOOST_PP_ITERATION_FINISH_1 >= 45
+#        define BOOST_PP_ITERATION_1 45
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 46 && BOOST_PP_ITERATION_FINISH_1 >= 46
+#        define BOOST_PP_ITERATION_1 46
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 47 && BOOST_PP_ITERATION_FINISH_1 >= 47
+#        define BOOST_PP_ITERATION_1 47
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 48 && BOOST_PP_ITERATION_FINISH_1 >= 48
+#        define BOOST_PP_ITERATION_1 48
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 49 && BOOST_PP_ITERATION_FINISH_1 >= 49
+#        define BOOST_PP_ITERATION_1 49
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 50 && BOOST_PP_ITERATION_FINISH_1 >= 50
+#        define BOOST_PP_ITERATION_1 50
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 51 && BOOST_PP_ITERATION_FINISH_1 >= 51
+#        define BOOST_PP_ITERATION_1 51
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 52 && BOOST_PP_ITERATION_FINISH_1 >= 52
+#        define BOOST_PP_ITERATION_1 52
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 53 && BOOST_PP_ITERATION_FINISH_1 >= 53
+#        define BOOST_PP_ITERATION_1 53
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 54 && BOOST_PP_ITERATION_FINISH_1 >= 54
+#        define BOOST_PP_ITERATION_1 54
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 55 && BOOST_PP_ITERATION_FINISH_1 >= 55
+#        define BOOST_PP_ITERATION_1 55
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 56 && BOOST_PP_ITERATION_FINISH_1 >= 56
+#        define BOOST_PP_ITERATION_1 56
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 57 && BOOST_PP_ITERATION_FINISH_1 >= 57
+#        define BOOST_PP_ITERATION_1 57
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 58 && BOOST_PP_ITERATION_FINISH_1 >= 58
+#        define BOOST_PP_ITERATION_1 58
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 59 && BOOST_PP_ITERATION_FINISH_1 >= 59
+#        define BOOST_PP_ITERATION_1 59
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 60 && BOOST_PP_ITERATION_FINISH_1 >= 60
+#        define BOOST_PP_ITERATION_1 60
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 61 && BOOST_PP_ITERATION_FINISH_1 >= 61
+#        define BOOST_PP_ITERATION_1 61
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 62 && BOOST_PP_ITERATION_FINISH_1 >= 62
+#        define BOOST_PP_ITERATION_1 62
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 63 && BOOST_PP_ITERATION_FINISH_1 >= 63
+#        define BOOST_PP_ITERATION_1 63
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 64 && BOOST_PP_ITERATION_FINISH_1 >= 64
+#        define BOOST_PP_ITERATION_1 64
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 65 && BOOST_PP_ITERATION_FINISH_1 >= 65
+#        define BOOST_PP_ITERATION_1 65
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 66 && BOOST_PP_ITERATION_FINISH_1 >= 66
+#        define BOOST_PP_ITERATION_1 66
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 67 && BOOST_PP_ITERATION_FINISH_1 >= 67
+#        define BOOST_PP_ITERATION_1 67
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 68 && BOOST_PP_ITERATION_FINISH_1 >= 68
+#        define BOOST_PP_ITERATION_1 68
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 69 && BOOST_PP_ITERATION_FINISH_1 >= 69
+#        define BOOST_PP_ITERATION_1 69
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 70 && BOOST_PP_ITERATION_FINISH_1 >= 70
+#        define BOOST_PP_ITERATION_1 70
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 71 && BOOST_PP_ITERATION_FINISH_1 >= 71
+#        define BOOST_PP_ITERATION_1 71
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 72 && BOOST_PP_ITERATION_FINISH_1 >= 72
+#        define BOOST_PP_ITERATION_1 72
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 73 && BOOST_PP_ITERATION_FINISH_1 >= 73
+#        define BOOST_PP_ITERATION_1 73
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 74 && BOOST_PP_ITERATION_FINISH_1 >= 74
+#        define BOOST_PP_ITERATION_1 74
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 75 && BOOST_PP_ITERATION_FINISH_1 >= 75
+#        define BOOST_PP_ITERATION_1 75
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 76 && BOOST_PP_ITERATION_FINISH_1 >= 76
+#        define BOOST_PP_ITERATION_1 76
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 77 && BOOST_PP_ITERATION_FINISH_1 >= 77
+#        define BOOST_PP_ITERATION_1 77
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 78 && BOOST_PP_ITERATION_FINISH_1 >= 78
+#        define BOOST_PP_ITERATION_1 78
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 79 && BOOST_PP_ITERATION_FINISH_1 >= 79
+#        define BOOST_PP_ITERATION_1 79
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 80 && BOOST_PP_ITERATION_FINISH_1 >= 80
+#        define BOOST_PP_ITERATION_1 80
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 81 && BOOST_PP_ITERATION_FINISH_1 >= 81
+#        define BOOST_PP_ITERATION_1 81
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 82 && BOOST_PP_ITERATION_FINISH_1 >= 82
+#        define BOOST_PP_ITERATION_1 82
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 83 && BOOST_PP_ITERATION_FINISH_1 >= 83
+#        define BOOST_PP_ITERATION_1 83
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 84 && BOOST_PP_ITERATION_FINISH_1 >= 84
+#        define BOOST_PP_ITERATION_1 84
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 85 && BOOST_PP_ITERATION_FINISH_1 >= 85
+#        define BOOST_PP_ITERATION_1 85
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 86 && BOOST_PP_ITERATION_FINISH_1 >= 86
+#        define BOOST_PP_ITERATION_1 86
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 87 && BOOST_PP_ITERATION_FINISH_1 >= 87
+#        define BOOST_PP_ITERATION_1 87
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 88 && BOOST_PP_ITERATION_FINISH_1 >= 88
+#        define BOOST_PP_ITERATION_1 88
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 89 && BOOST_PP_ITERATION_FINISH_1 >= 89
+#        define BOOST_PP_ITERATION_1 89
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 90 && BOOST_PP_ITERATION_FINISH_1 >= 90
+#        define BOOST_PP_ITERATION_1 90
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 91 && BOOST_PP_ITERATION_FINISH_1 >= 91
+#        define BOOST_PP_ITERATION_1 91
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 92 && BOOST_PP_ITERATION_FINISH_1 >= 92
+#        define BOOST_PP_ITERATION_1 92
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 93 && BOOST_PP_ITERATION_FINISH_1 >= 93
+#        define BOOST_PP_ITERATION_1 93
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 94 && BOOST_PP_ITERATION_FINISH_1 >= 94
+#        define BOOST_PP_ITERATION_1 94
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 95 && BOOST_PP_ITERATION_FINISH_1 >= 95
+#        define BOOST_PP_ITERATION_1 95
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 96 && BOOST_PP_ITERATION_FINISH_1 >= 96
+#        define BOOST_PP_ITERATION_1 96
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 97 && BOOST_PP_ITERATION_FINISH_1 >= 97
+#        define BOOST_PP_ITERATION_1 97
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 98 && BOOST_PP_ITERATION_FINISH_1 >= 98
+#        define BOOST_PP_ITERATION_1 98
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 99 && BOOST_PP_ITERATION_FINISH_1 >= 99
+#        define BOOST_PP_ITERATION_1 99
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 100 && BOOST_PP_ITERATION_FINISH_1 >= 100
+#        define BOOST_PP_ITERATION_1 100
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 101 && BOOST_PP_ITERATION_FINISH_1 >= 101
+#        define BOOST_PP_ITERATION_1 101
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 102 && BOOST_PP_ITERATION_FINISH_1 >= 102
+#        define BOOST_PP_ITERATION_1 102
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 103 && BOOST_PP_ITERATION_FINISH_1 >= 103
+#        define BOOST_PP_ITERATION_1 103
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 104 && BOOST_PP_ITERATION_FINISH_1 >= 104
+#        define BOOST_PP_ITERATION_1 104
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 105 && BOOST_PP_ITERATION_FINISH_1 >= 105
+#        define BOOST_PP_ITERATION_1 105
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 106 && BOOST_PP_ITERATION_FINISH_1 >= 106
+#        define BOOST_PP_ITERATION_1 106
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 107 && BOOST_PP_ITERATION_FINISH_1 >= 107
+#        define BOOST_PP_ITERATION_1 107
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 108 && BOOST_PP_ITERATION_FINISH_1 >= 108
+#        define BOOST_PP_ITERATION_1 108
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 109 && BOOST_PP_ITERATION_FINISH_1 >= 109
+#        define BOOST_PP_ITERATION_1 109
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 110 && BOOST_PP_ITERATION_FINISH_1 >= 110
+#        define BOOST_PP_ITERATION_1 110
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 111 && BOOST_PP_ITERATION_FINISH_1 >= 111
+#        define BOOST_PP_ITERATION_1 111
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 112 && BOOST_PP_ITERATION_FINISH_1 >= 112
+#        define BOOST_PP_ITERATION_1 112
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 113 && BOOST_PP_ITERATION_FINISH_1 >= 113
+#        define BOOST_PP_ITERATION_1 113
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 114 && BOOST_PP_ITERATION_FINISH_1 >= 114
+#        define BOOST_PP_ITERATION_1 114
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 115 && BOOST_PP_ITERATION_FINISH_1 >= 115
+#        define BOOST_PP_ITERATION_1 115
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 116 && BOOST_PP_ITERATION_FINISH_1 >= 116
+#        define BOOST_PP_ITERATION_1 116
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 117 && BOOST_PP_ITERATION_FINISH_1 >= 117
+#        define BOOST_PP_ITERATION_1 117
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 118 && BOOST_PP_ITERATION_FINISH_1 >= 118
+#        define BOOST_PP_ITERATION_1 118
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 119 && BOOST_PP_ITERATION_FINISH_1 >= 119
+#        define BOOST_PP_ITERATION_1 119
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 120 && BOOST_PP_ITERATION_FINISH_1 >= 120
+#        define BOOST_PP_ITERATION_1 120
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 121 && BOOST_PP_ITERATION_FINISH_1 >= 121
+#        define BOOST_PP_ITERATION_1 121
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 122 && BOOST_PP_ITERATION_FINISH_1 >= 122
+#        define BOOST_PP_ITERATION_1 122
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 123 && BOOST_PP_ITERATION_FINISH_1 >= 123
+#        define BOOST_PP_ITERATION_1 123
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 124 && BOOST_PP_ITERATION_FINISH_1 >= 124
+#        define BOOST_PP_ITERATION_1 124
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 125 && BOOST_PP_ITERATION_FINISH_1 >= 125
+#        define BOOST_PP_ITERATION_1 125
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 126 && BOOST_PP_ITERATION_FINISH_1 >= 126
+#        define BOOST_PP_ITERATION_1 126
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 127 && BOOST_PP_ITERATION_FINISH_1 >= 127
+#        define BOOST_PP_ITERATION_1 127
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 128 && BOOST_PP_ITERATION_FINISH_1 >= 128
+#        define BOOST_PP_ITERATION_1 128
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 129 && BOOST_PP_ITERATION_FINISH_1 >= 129
+#        define BOOST_PP_ITERATION_1 129
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 130 && BOOST_PP_ITERATION_FINISH_1 >= 130
+#        define BOOST_PP_ITERATION_1 130
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 131 && BOOST_PP_ITERATION_FINISH_1 >= 131
+#        define BOOST_PP_ITERATION_1 131
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 132 && BOOST_PP_ITERATION_FINISH_1 >= 132
+#        define BOOST_PP_ITERATION_1 132
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 133 && BOOST_PP_ITERATION_FINISH_1 >= 133
+#        define BOOST_PP_ITERATION_1 133
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 134 && BOOST_PP_ITERATION_FINISH_1 >= 134
+#        define BOOST_PP_ITERATION_1 134
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 135 && BOOST_PP_ITERATION_FINISH_1 >= 135
+#        define BOOST_PP_ITERATION_1 135
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 136 && BOOST_PP_ITERATION_FINISH_1 >= 136
+#        define BOOST_PP_ITERATION_1 136
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 137 && BOOST_PP_ITERATION_FINISH_1 >= 137
+#        define BOOST_PP_ITERATION_1 137
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 138 && BOOST_PP_ITERATION_FINISH_1 >= 138
+#        define BOOST_PP_ITERATION_1 138
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 139 && BOOST_PP_ITERATION_FINISH_1 >= 139
+#        define BOOST_PP_ITERATION_1 139
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 140 && BOOST_PP_ITERATION_FINISH_1 >= 140
+#        define BOOST_PP_ITERATION_1 140
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 141 && BOOST_PP_ITERATION_FINISH_1 >= 141
+#        define BOOST_PP_ITERATION_1 141
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 142 && BOOST_PP_ITERATION_FINISH_1 >= 142
+#        define BOOST_PP_ITERATION_1 142
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 143 && BOOST_PP_ITERATION_FINISH_1 >= 143
+#        define BOOST_PP_ITERATION_1 143
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 144 && BOOST_PP_ITERATION_FINISH_1 >= 144
+#        define BOOST_PP_ITERATION_1 144
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 145 && BOOST_PP_ITERATION_FINISH_1 >= 145
+#        define BOOST_PP_ITERATION_1 145
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 146 && BOOST_PP_ITERATION_FINISH_1 >= 146
+#        define BOOST_PP_ITERATION_1 146
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 147 && BOOST_PP_ITERATION_FINISH_1 >= 147
+#        define BOOST_PP_ITERATION_1 147
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 148 && BOOST_PP_ITERATION_FINISH_1 >= 148
+#        define BOOST_PP_ITERATION_1 148
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 149 && BOOST_PP_ITERATION_FINISH_1 >= 149
+#        define BOOST_PP_ITERATION_1 149
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 150 && BOOST_PP_ITERATION_FINISH_1 >= 150
+#        define BOOST_PP_ITERATION_1 150
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 151 && BOOST_PP_ITERATION_FINISH_1 >= 151
+#        define BOOST_PP_ITERATION_1 151
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 152 && BOOST_PP_ITERATION_FINISH_1 >= 152
+#        define BOOST_PP_ITERATION_1 152
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 153 && BOOST_PP_ITERATION_FINISH_1 >= 153
+#        define BOOST_PP_ITERATION_1 153
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 154 && BOOST_PP_ITERATION_FINISH_1 >= 154
+#        define BOOST_PP_ITERATION_1 154
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 155 && BOOST_PP_ITERATION_FINISH_1 >= 155
+#        define BOOST_PP_ITERATION_1 155
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 156 && BOOST_PP_ITERATION_FINISH_1 >= 156
+#        define BOOST_PP_ITERATION_1 156
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 157 && BOOST_PP_ITERATION_FINISH_1 >= 157
+#        define BOOST_PP_ITERATION_1 157
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 158 && BOOST_PP_ITERATION_FINISH_1 >= 158
+#        define BOOST_PP_ITERATION_1 158
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 159 && BOOST_PP_ITERATION_FINISH_1 >= 159
+#        define BOOST_PP_ITERATION_1 159
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 160 && BOOST_PP_ITERATION_FINISH_1 >= 160
+#        define BOOST_PP_ITERATION_1 160
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 161 && BOOST_PP_ITERATION_FINISH_1 >= 161
+#        define BOOST_PP_ITERATION_1 161
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 162 && BOOST_PP_ITERATION_FINISH_1 >= 162
+#        define BOOST_PP_ITERATION_1 162
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 163 && BOOST_PP_ITERATION_FINISH_1 >= 163
+#        define BOOST_PP_ITERATION_1 163
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 164 && BOOST_PP_ITERATION_FINISH_1 >= 164
+#        define BOOST_PP_ITERATION_1 164
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 165 && BOOST_PP_ITERATION_FINISH_1 >= 165
+#        define BOOST_PP_ITERATION_1 165
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 166 && BOOST_PP_ITERATION_FINISH_1 >= 166
+#        define BOOST_PP_ITERATION_1 166
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 167 && BOOST_PP_ITERATION_FINISH_1 >= 167
+#        define BOOST_PP_ITERATION_1 167
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 168 && BOOST_PP_ITERATION_FINISH_1 >= 168
+#        define BOOST_PP_ITERATION_1 168
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 169 && BOOST_PP_ITERATION_FINISH_1 >= 169
+#        define BOOST_PP_ITERATION_1 169
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 170 && BOOST_PP_ITERATION_FINISH_1 >= 170
+#        define BOOST_PP_ITERATION_1 170
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 171 && BOOST_PP_ITERATION_FINISH_1 >= 171
+#        define BOOST_PP_ITERATION_1 171
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 172 && BOOST_PP_ITERATION_FINISH_1 >= 172
+#        define BOOST_PP_ITERATION_1 172
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 173 && BOOST_PP_ITERATION_FINISH_1 >= 173
+#        define BOOST_PP_ITERATION_1 173
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 174 && BOOST_PP_ITERATION_FINISH_1 >= 174
+#        define BOOST_PP_ITERATION_1 174
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 175 && BOOST_PP_ITERATION_FINISH_1 >= 175
+#        define BOOST_PP_ITERATION_1 175
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 176 && BOOST_PP_ITERATION_FINISH_1 >= 176
+#        define BOOST_PP_ITERATION_1 176
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 177 && BOOST_PP_ITERATION_FINISH_1 >= 177
+#        define BOOST_PP_ITERATION_1 177
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 178 && BOOST_PP_ITERATION_FINISH_1 >= 178
+#        define BOOST_PP_ITERATION_1 178
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 179 && BOOST_PP_ITERATION_FINISH_1 >= 179
+#        define BOOST_PP_ITERATION_1 179
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 180 && BOOST_PP_ITERATION_FINISH_1 >= 180
+#        define BOOST_PP_ITERATION_1 180
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 181 && BOOST_PP_ITERATION_FINISH_1 >= 181
+#        define BOOST_PP_ITERATION_1 181
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 182 && BOOST_PP_ITERATION_FINISH_1 >= 182
+#        define BOOST_PP_ITERATION_1 182
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 183 && BOOST_PP_ITERATION_FINISH_1 >= 183
+#        define BOOST_PP_ITERATION_1 183
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 184 && BOOST_PP_ITERATION_FINISH_1 >= 184
+#        define BOOST_PP_ITERATION_1 184
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 185 && BOOST_PP_ITERATION_FINISH_1 >= 185
+#        define BOOST_PP_ITERATION_1 185
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 186 && BOOST_PP_ITERATION_FINISH_1 >= 186
+#        define BOOST_PP_ITERATION_1 186
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 187 && BOOST_PP_ITERATION_FINISH_1 >= 187
+#        define BOOST_PP_ITERATION_1 187
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 188 && BOOST_PP_ITERATION_FINISH_1 >= 188
+#        define BOOST_PP_ITERATION_1 188
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 189 && BOOST_PP_ITERATION_FINISH_1 >= 189
+#        define BOOST_PP_ITERATION_1 189
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 190 && BOOST_PP_ITERATION_FINISH_1 >= 190
+#        define BOOST_PP_ITERATION_1 190
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 191 && BOOST_PP_ITERATION_FINISH_1 >= 191
+#        define BOOST_PP_ITERATION_1 191
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 192 && BOOST_PP_ITERATION_FINISH_1 >= 192
+#        define BOOST_PP_ITERATION_1 192
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 193 && BOOST_PP_ITERATION_FINISH_1 >= 193
+#        define BOOST_PP_ITERATION_1 193
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 194 && BOOST_PP_ITERATION_FINISH_1 >= 194
+#        define BOOST_PP_ITERATION_1 194
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 195 && BOOST_PP_ITERATION_FINISH_1 >= 195
+#        define BOOST_PP_ITERATION_1 195
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 196 && BOOST_PP_ITERATION_FINISH_1 >= 196
+#        define BOOST_PP_ITERATION_1 196
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 197 && BOOST_PP_ITERATION_FINISH_1 >= 197
+#        define BOOST_PP_ITERATION_1 197
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 198 && BOOST_PP_ITERATION_FINISH_1 >= 198
+#        define BOOST_PP_ITERATION_1 198
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 199 && BOOST_PP_ITERATION_FINISH_1 >= 199
+#        define BOOST_PP_ITERATION_1 199
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 200 && BOOST_PP_ITERATION_FINISH_1 >= 200
+#        define BOOST_PP_ITERATION_1 200
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 201 && BOOST_PP_ITERATION_FINISH_1 >= 201
+#        define BOOST_PP_ITERATION_1 201
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 202 && BOOST_PP_ITERATION_FINISH_1 >= 202
+#        define BOOST_PP_ITERATION_1 202
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 203 && BOOST_PP_ITERATION_FINISH_1 >= 203
+#        define BOOST_PP_ITERATION_1 203
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 204 && BOOST_PP_ITERATION_FINISH_1 >= 204
+#        define BOOST_PP_ITERATION_1 204
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 205 && BOOST_PP_ITERATION_FINISH_1 >= 205
+#        define BOOST_PP_ITERATION_1 205
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 206 && BOOST_PP_ITERATION_FINISH_1 >= 206
+#        define BOOST_PP_ITERATION_1 206
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 207 && BOOST_PP_ITERATION_FINISH_1 >= 207
+#        define BOOST_PP_ITERATION_1 207
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 208 && BOOST_PP_ITERATION_FINISH_1 >= 208
+#        define BOOST_PP_ITERATION_1 208
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 209 && BOOST_PP_ITERATION_FINISH_1 >= 209
+#        define BOOST_PP_ITERATION_1 209
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 210 && BOOST_PP_ITERATION_FINISH_1 >= 210
+#        define BOOST_PP_ITERATION_1 210
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 211 && BOOST_PP_ITERATION_FINISH_1 >= 211
+#        define BOOST_PP_ITERATION_1 211
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 212 && BOOST_PP_ITERATION_FINISH_1 >= 212
+#        define BOOST_PP_ITERATION_1 212
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 213 && BOOST_PP_ITERATION_FINISH_1 >= 213
+#        define BOOST_PP_ITERATION_1 213
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 214 && BOOST_PP_ITERATION_FINISH_1 >= 214
+#        define BOOST_PP_ITERATION_1 214
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 215 && BOOST_PP_ITERATION_FINISH_1 >= 215
+#        define BOOST_PP_ITERATION_1 215
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 216 && BOOST_PP_ITERATION_FINISH_1 >= 216
+#        define BOOST_PP_ITERATION_1 216
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 217 && BOOST_PP_ITERATION_FINISH_1 >= 217
+#        define BOOST_PP_ITERATION_1 217
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 218 && BOOST_PP_ITERATION_FINISH_1 >= 218
+#        define BOOST_PP_ITERATION_1 218
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 219 && BOOST_PP_ITERATION_FINISH_1 >= 219
+#        define BOOST_PP_ITERATION_1 219
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 220 && BOOST_PP_ITERATION_FINISH_1 >= 220
+#        define BOOST_PP_ITERATION_1 220
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 221 && BOOST_PP_ITERATION_FINISH_1 >= 221
+#        define BOOST_PP_ITERATION_1 221
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 222 && BOOST_PP_ITERATION_FINISH_1 >= 222
+#        define BOOST_PP_ITERATION_1 222
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 223 && BOOST_PP_ITERATION_FINISH_1 >= 223
+#        define BOOST_PP_ITERATION_1 223
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 224 && BOOST_PP_ITERATION_FINISH_1 >= 224
+#        define BOOST_PP_ITERATION_1 224
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 225 && BOOST_PP_ITERATION_FINISH_1 >= 225
+#        define BOOST_PP_ITERATION_1 225
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 226 && BOOST_PP_ITERATION_FINISH_1 >= 226
+#        define BOOST_PP_ITERATION_1 226
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 227 && BOOST_PP_ITERATION_FINISH_1 >= 227
+#        define BOOST_PP_ITERATION_1 227
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 228 && BOOST_PP_ITERATION_FINISH_1 >= 228
+#        define BOOST_PP_ITERATION_1 228
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 229 && BOOST_PP_ITERATION_FINISH_1 >= 229
+#        define BOOST_PP_ITERATION_1 229
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 230 && BOOST_PP_ITERATION_FINISH_1 >= 230
+#        define BOOST_PP_ITERATION_1 230
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 231 && BOOST_PP_ITERATION_FINISH_1 >= 231
+#        define BOOST_PP_ITERATION_1 231
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 232 && BOOST_PP_ITERATION_FINISH_1 >= 232
+#        define BOOST_PP_ITERATION_1 232
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 233 && BOOST_PP_ITERATION_FINISH_1 >= 233
+#        define BOOST_PP_ITERATION_1 233
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 234 && BOOST_PP_ITERATION_FINISH_1 >= 234
+#        define BOOST_PP_ITERATION_1 234
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 235 && BOOST_PP_ITERATION_FINISH_1 >= 235
+#        define BOOST_PP_ITERATION_1 235
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 236 && BOOST_PP_ITERATION_FINISH_1 >= 236
+#        define BOOST_PP_ITERATION_1 236
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 237 && BOOST_PP_ITERATION_FINISH_1 >= 237
+#        define BOOST_PP_ITERATION_1 237
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 238 && BOOST_PP_ITERATION_FINISH_1 >= 238
+#        define BOOST_PP_ITERATION_1 238
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 239 && BOOST_PP_ITERATION_FINISH_1 >= 239
+#        define BOOST_PP_ITERATION_1 239
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 240 && BOOST_PP_ITERATION_FINISH_1 >= 240
+#        define BOOST_PP_ITERATION_1 240
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 241 && BOOST_PP_ITERATION_FINISH_1 >= 241
+#        define BOOST_PP_ITERATION_1 241
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 242 && BOOST_PP_ITERATION_FINISH_1 >= 242
+#        define BOOST_PP_ITERATION_1 242
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 243 && BOOST_PP_ITERATION_FINISH_1 >= 243
+#        define BOOST_PP_ITERATION_1 243
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 244 && BOOST_PP_ITERATION_FINISH_1 >= 244
+#        define BOOST_PP_ITERATION_1 244
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 245 && BOOST_PP_ITERATION_FINISH_1 >= 245
+#        define BOOST_PP_ITERATION_1 245
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 246 && BOOST_PP_ITERATION_FINISH_1 >= 246
+#        define BOOST_PP_ITERATION_1 246
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 247 && BOOST_PP_ITERATION_FINISH_1 >= 247
+#        define BOOST_PP_ITERATION_1 247
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 248 && BOOST_PP_ITERATION_FINISH_1 >= 248
+#        define BOOST_PP_ITERATION_1 248
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 249 && BOOST_PP_ITERATION_FINISH_1 >= 249
+#        define BOOST_PP_ITERATION_1 249
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 250 && BOOST_PP_ITERATION_FINISH_1 >= 250
+#        define BOOST_PP_ITERATION_1 250
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 251 && BOOST_PP_ITERATION_FINISH_1 >= 251
+#        define BOOST_PP_ITERATION_1 251
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 252 && BOOST_PP_ITERATION_FINISH_1 >= 252
+#        define BOOST_PP_ITERATION_1 252
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 253 && BOOST_PP_ITERATION_FINISH_1 >= 253
+#        define BOOST_PP_ITERATION_1 253
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 254 && BOOST_PP_ITERATION_FINISH_1 >= 254
+#        define BOOST_PP_ITERATION_1 254
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 255 && BOOST_PP_ITERATION_FINISH_1 >= 255
+#        define BOOST_PP_ITERATION_1 255
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+#    if BOOST_PP_ITERATION_START_1 <= 256 && BOOST_PP_ITERATION_FINISH_1 >= 256
+#        define BOOST_PP_ITERATION_1 256
+#        include BOOST_PP_FILENAME_1
+#        undef BOOST_PP_ITERATION_1
+#    endif
+# endif
+#
+# undef BOOST_PP_IS_ITERATING
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 0
+#
+# undef BOOST_PP_ITERATION_START_1
+# undef BOOST_PP_ITERATION_FINISH_1
+# undef BOOST_PP_FILENAME_1
+#
+# undef BOOST_PP_ITERATION_FLAGS_1
+# undef BOOST_PP_ITERATION_PARAMS_1
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward2.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward2.hpp
new file mode 100644
index 0000000..e61a329
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward2.hpp
@@ -0,0 +1,1338 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if defined(BOOST_PP_ITERATION_LIMITS)
+#    if !defined(BOOST_PP_FILENAME_2)
+#        error BOOST_PP_ERROR:  depth #2 filename is not defined
+#    endif
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>
+#    define BOOST_PP_ITERATION_FLAGS_2() 0
+#    undef BOOST_PP_ITERATION_LIMITS
+# elif defined(BOOST_PP_ITERATION_PARAMS_2)
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_2)
+#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_2)
+#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>
+#    define BOOST_PP_FILENAME_2 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_2)
+#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_2) >= 4
+#        define BOOST_PP_ITERATION_FLAGS_2() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_2)
+#    else
+#        define BOOST_PP_ITERATION_FLAGS_2() 0
+#    endif
+# else
+#    error BOOST_PP_ERROR:  depth #2 iteration boundaries or filename not defined
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 2
+#
+# if (BOOST_PP_ITERATION_START_2) > (BOOST_PP_ITERATION_FINISH_2)
+#    include <boost/preprocessor/iteration/detail/iter/reverse2.hpp>
+# else
+#    if BOOST_PP_ITERATION_START_2 <= 0 && BOOST_PP_ITERATION_FINISH_2 >= 0
+#        define BOOST_PP_ITERATION_2 0
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 1 && BOOST_PP_ITERATION_FINISH_2 >= 1
+#        define BOOST_PP_ITERATION_2 1
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 2 && BOOST_PP_ITERATION_FINISH_2 >= 2
+#        define BOOST_PP_ITERATION_2 2
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 3 && BOOST_PP_ITERATION_FINISH_2 >= 3
+#        define BOOST_PP_ITERATION_2 3
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 4 && BOOST_PP_ITERATION_FINISH_2 >= 4
+#        define BOOST_PP_ITERATION_2 4
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 5 && BOOST_PP_ITERATION_FINISH_2 >= 5
+#        define BOOST_PP_ITERATION_2 5
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 6 && BOOST_PP_ITERATION_FINISH_2 >= 6
+#        define BOOST_PP_ITERATION_2 6
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 7 && BOOST_PP_ITERATION_FINISH_2 >= 7
+#        define BOOST_PP_ITERATION_2 7
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 8 && BOOST_PP_ITERATION_FINISH_2 >= 8
+#        define BOOST_PP_ITERATION_2 8
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 9 && BOOST_PP_ITERATION_FINISH_2 >= 9
+#        define BOOST_PP_ITERATION_2 9
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 10 && BOOST_PP_ITERATION_FINISH_2 >= 10
+#        define BOOST_PP_ITERATION_2 10
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 11 && BOOST_PP_ITERATION_FINISH_2 >= 11
+#        define BOOST_PP_ITERATION_2 11
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 12 && BOOST_PP_ITERATION_FINISH_2 >= 12
+#        define BOOST_PP_ITERATION_2 12
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 13 && BOOST_PP_ITERATION_FINISH_2 >= 13
+#        define BOOST_PP_ITERATION_2 13
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 14 && BOOST_PP_ITERATION_FINISH_2 >= 14
+#        define BOOST_PP_ITERATION_2 14
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 15 && BOOST_PP_ITERATION_FINISH_2 >= 15
+#        define BOOST_PP_ITERATION_2 15
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 16 && BOOST_PP_ITERATION_FINISH_2 >= 16
+#        define BOOST_PP_ITERATION_2 16
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 17 && BOOST_PP_ITERATION_FINISH_2 >= 17
+#        define BOOST_PP_ITERATION_2 17
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 18 && BOOST_PP_ITERATION_FINISH_2 >= 18
+#        define BOOST_PP_ITERATION_2 18
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 19 && BOOST_PP_ITERATION_FINISH_2 >= 19
+#        define BOOST_PP_ITERATION_2 19
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 20 && BOOST_PP_ITERATION_FINISH_2 >= 20
+#        define BOOST_PP_ITERATION_2 20
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 21 && BOOST_PP_ITERATION_FINISH_2 >= 21
+#        define BOOST_PP_ITERATION_2 21
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 22 && BOOST_PP_ITERATION_FINISH_2 >= 22
+#        define BOOST_PP_ITERATION_2 22
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 23 && BOOST_PP_ITERATION_FINISH_2 >= 23
+#        define BOOST_PP_ITERATION_2 23
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 24 && BOOST_PP_ITERATION_FINISH_2 >= 24
+#        define BOOST_PP_ITERATION_2 24
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 25 && BOOST_PP_ITERATION_FINISH_2 >= 25
+#        define BOOST_PP_ITERATION_2 25
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 26 && BOOST_PP_ITERATION_FINISH_2 >= 26
+#        define BOOST_PP_ITERATION_2 26
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 27 && BOOST_PP_ITERATION_FINISH_2 >= 27
+#        define BOOST_PP_ITERATION_2 27
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 28 && BOOST_PP_ITERATION_FINISH_2 >= 28
+#        define BOOST_PP_ITERATION_2 28
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 29 && BOOST_PP_ITERATION_FINISH_2 >= 29
+#        define BOOST_PP_ITERATION_2 29
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 30 && BOOST_PP_ITERATION_FINISH_2 >= 30
+#        define BOOST_PP_ITERATION_2 30
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 31 && BOOST_PP_ITERATION_FINISH_2 >= 31
+#        define BOOST_PP_ITERATION_2 31
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 32 && BOOST_PP_ITERATION_FINISH_2 >= 32
+#        define BOOST_PP_ITERATION_2 32
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 33 && BOOST_PP_ITERATION_FINISH_2 >= 33
+#        define BOOST_PP_ITERATION_2 33
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 34 && BOOST_PP_ITERATION_FINISH_2 >= 34
+#        define BOOST_PP_ITERATION_2 34
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 35 && BOOST_PP_ITERATION_FINISH_2 >= 35
+#        define BOOST_PP_ITERATION_2 35
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 36 && BOOST_PP_ITERATION_FINISH_2 >= 36
+#        define BOOST_PP_ITERATION_2 36
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 37 && BOOST_PP_ITERATION_FINISH_2 >= 37
+#        define BOOST_PP_ITERATION_2 37
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 38 && BOOST_PP_ITERATION_FINISH_2 >= 38
+#        define BOOST_PP_ITERATION_2 38
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 39 && BOOST_PP_ITERATION_FINISH_2 >= 39
+#        define BOOST_PP_ITERATION_2 39
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 40 && BOOST_PP_ITERATION_FINISH_2 >= 40
+#        define BOOST_PP_ITERATION_2 40
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 41 && BOOST_PP_ITERATION_FINISH_2 >= 41
+#        define BOOST_PP_ITERATION_2 41
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 42 && BOOST_PP_ITERATION_FINISH_2 >= 42
+#        define BOOST_PP_ITERATION_2 42
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 43 && BOOST_PP_ITERATION_FINISH_2 >= 43
+#        define BOOST_PP_ITERATION_2 43
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 44 && BOOST_PP_ITERATION_FINISH_2 >= 44
+#        define BOOST_PP_ITERATION_2 44
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 45 && BOOST_PP_ITERATION_FINISH_2 >= 45
+#        define BOOST_PP_ITERATION_2 45
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 46 && BOOST_PP_ITERATION_FINISH_2 >= 46
+#        define BOOST_PP_ITERATION_2 46
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 47 && BOOST_PP_ITERATION_FINISH_2 >= 47
+#        define BOOST_PP_ITERATION_2 47
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 48 && BOOST_PP_ITERATION_FINISH_2 >= 48
+#        define BOOST_PP_ITERATION_2 48
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 49 && BOOST_PP_ITERATION_FINISH_2 >= 49
+#        define BOOST_PP_ITERATION_2 49
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 50 && BOOST_PP_ITERATION_FINISH_2 >= 50
+#        define BOOST_PP_ITERATION_2 50
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 51 && BOOST_PP_ITERATION_FINISH_2 >= 51
+#        define BOOST_PP_ITERATION_2 51
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 52 && BOOST_PP_ITERATION_FINISH_2 >= 52
+#        define BOOST_PP_ITERATION_2 52
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 53 && BOOST_PP_ITERATION_FINISH_2 >= 53
+#        define BOOST_PP_ITERATION_2 53
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 54 && BOOST_PP_ITERATION_FINISH_2 >= 54
+#        define BOOST_PP_ITERATION_2 54
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 55 && BOOST_PP_ITERATION_FINISH_2 >= 55
+#        define BOOST_PP_ITERATION_2 55
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 56 && BOOST_PP_ITERATION_FINISH_2 >= 56
+#        define BOOST_PP_ITERATION_2 56
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 57 && BOOST_PP_ITERATION_FINISH_2 >= 57
+#        define BOOST_PP_ITERATION_2 57
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 58 && BOOST_PP_ITERATION_FINISH_2 >= 58
+#        define BOOST_PP_ITERATION_2 58
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 59 && BOOST_PP_ITERATION_FINISH_2 >= 59
+#        define BOOST_PP_ITERATION_2 59
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 60 && BOOST_PP_ITERATION_FINISH_2 >= 60
+#        define BOOST_PP_ITERATION_2 60
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 61 && BOOST_PP_ITERATION_FINISH_2 >= 61
+#        define BOOST_PP_ITERATION_2 61
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 62 && BOOST_PP_ITERATION_FINISH_2 >= 62
+#        define BOOST_PP_ITERATION_2 62
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 63 && BOOST_PP_ITERATION_FINISH_2 >= 63
+#        define BOOST_PP_ITERATION_2 63
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 64 && BOOST_PP_ITERATION_FINISH_2 >= 64
+#        define BOOST_PP_ITERATION_2 64
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 65 && BOOST_PP_ITERATION_FINISH_2 >= 65
+#        define BOOST_PP_ITERATION_2 65
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 66 && BOOST_PP_ITERATION_FINISH_2 >= 66
+#        define BOOST_PP_ITERATION_2 66
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 67 && BOOST_PP_ITERATION_FINISH_2 >= 67
+#        define BOOST_PP_ITERATION_2 67
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 68 && BOOST_PP_ITERATION_FINISH_2 >= 68
+#        define BOOST_PP_ITERATION_2 68
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 69 && BOOST_PP_ITERATION_FINISH_2 >= 69
+#        define BOOST_PP_ITERATION_2 69
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 70 && BOOST_PP_ITERATION_FINISH_2 >= 70
+#        define BOOST_PP_ITERATION_2 70
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 71 && BOOST_PP_ITERATION_FINISH_2 >= 71
+#        define BOOST_PP_ITERATION_2 71
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 72 && BOOST_PP_ITERATION_FINISH_2 >= 72
+#        define BOOST_PP_ITERATION_2 72
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 73 && BOOST_PP_ITERATION_FINISH_2 >= 73
+#        define BOOST_PP_ITERATION_2 73
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 74 && BOOST_PP_ITERATION_FINISH_2 >= 74
+#        define BOOST_PP_ITERATION_2 74
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 75 && BOOST_PP_ITERATION_FINISH_2 >= 75
+#        define BOOST_PP_ITERATION_2 75
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 76 && BOOST_PP_ITERATION_FINISH_2 >= 76
+#        define BOOST_PP_ITERATION_2 76
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 77 && BOOST_PP_ITERATION_FINISH_2 >= 77
+#        define BOOST_PP_ITERATION_2 77
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 78 && BOOST_PP_ITERATION_FINISH_2 >= 78
+#        define BOOST_PP_ITERATION_2 78
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 79 && BOOST_PP_ITERATION_FINISH_2 >= 79
+#        define BOOST_PP_ITERATION_2 79
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 80 && BOOST_PP_ITERATION_FINISH_2 >= 80
+#        define BOOST_PP_ITERATION_2 80
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 81 && BOOST_PP_ITERATION_FINISH_2 >= 81
+#        define BOOST_PP_ITERATION_2 81
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 82 && BOOST_PP_ITERATION_FINISH_2 >= 82
+#        define BOOST_PP_ITERATION_2 82
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 83 && BOOST_PP_ITERATION_FINISH_2 >= 83
+#        define BOOST_PP_ITERATION_2 83
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 84 && BOOST_PP_ITERATION_FINISH_2 >= 84
+#        define BOOST_PP_ITERATION_2 84
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 85 && BOOST_PP_ITERATION_FINISH_2 >= 85
+#        define BOOST_PP_ITERATION_2 85
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 86 && BOOST_PP_ITERATION_FINISH_2 >= 86
+#        define BOOST_PP_ITERATION_2 86
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 87 && BOOST_PP_ITERATION_FINISH_2 >= 87
+#        define BOOST_PP_ITERATION_2 87
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 88 && BOOST_PP_ITERATION_FINISH_2 >= 88
+#        define BOOST_PP_ITERATION_2 88
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 89 && BOOST_PP_ITERATION_FINISH_2 >= 89
+#        define BOOST_PP_ITERATION_2 89
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 90 && BOOST_PP_ITERATION_FINISH_2 >= 90
+#        define BOOST_PP_ITERATION_2 90
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 91 && BOOST_PP_ITERATION_FINISH_2 >= 91
+#        define BOOST_PP_ITERATION_2 91
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 92 && BOOST_PP_ITERATION_FINISH_2 >= 92
+#        define BOOST_PP_ITERATION_2 92
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 93 && BOOST_PP_ITERATION_FINISH_2 >= 93
+#        define BOOST_PP_ITERATION_2 93
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 94 && BOOST_PP_ITERATION_FINISH_2 >= 94
+#        define BOOST_PP_ITERATION_2 94
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 95 && BOOST_PP_ITERATION_FINISH_2 >= 95
+#        define BOOST_PP_ITERATION_2 95
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 96 && BOOST_PP_ITERATION_FINISH_2 >= 96
+#        define BOOST_PP_ITERATION_2 96
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 97 && BOOST_PP_ITERATION_FINISH_2 >= 97
+#        define BOOST_PP_ITERATION_2 97
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 98 && BOOST_PP_ITERATION_FINISH_2 >= 98
+#        define BOOST_PP_ITERATION_2 98
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 99 && BOOST_PP_ITERATION_FINISH_2 >= 99
+#        define BOOST_PP_ITERATION_2 99
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 100 && BOOST_PP_ITERATION_FINISH_2 >= 100
+#        define BOOST_PP_ITERATION_2 100
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 101 && BOOST_PP_ITERATION_FINISH_2 >= 101
+#        define BOOST_PP_ITERATION_2 101
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 102 && BOOST_PP_ITERATION_FINISH_2 >= 102
+#        define BOOST_PP_ITERATION_2 102
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 103 && BOOST_PP_ITERATION_FINISH_2 >= 103
+#        define BOOST_PP_ITERATION_2 103
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 104 && BOOST_PP_ITERATION_FINISH_2 >= 104
+#        define BOOST_PP_ITERATION_2 104
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 105 && BOOST_PP_ITERATION_FINISH_2 >= 105
+#        define BOOST_PP_ITERATION_2 105
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 106 && BOOST_PP_ITERATION_FINISH_2 >= 106
+#        define BOOST_PP_ITERATION_2 106
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 107 && BOOST_PP_ITERATION_FINISH_2 >= 107
+#        define BOOST_PP_ITERATION_2 107
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 108 && BOOST_PP_ITERATION_FINISH_2 >= 108
+#        define BOOST_PP_ITERATION_2 108
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 109 && BOOST_PP_ITERATION_FINISH_2 >= 109
+#        define BOOST_PP_ITERATION_2 109
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 110 && BOOST_PP_ITERATION_FINISH_2 >= 110
+#        define BOOST_PP_ITERATION_2 110
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 111 && BOOST_PP_ITERATION_FINISH_2 >= 111
+#        define BOOST_PP_ITERATION_2 111
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 112 && BOOST_PP_ITERATION_FINISH_2 >= 112
+#        define BOOST_PP_ITERATION_2 112
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 113 && BOOST_PP_ITERATION_FINISH_2 >= 113
+#        define BOOST_PP_ITERATION_2 113
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 114 && BOOST_PP_ITERATION_FINISH_2 >= 114
+#        define BOOST_PP_ITERATION_2 114
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 115 && BOOST_PP_ITERATION_FINISH_2 >= 115
+#        define BOOST_PP_ITERATION_2 115
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 116 && BOOST_PP_ITERATION_FINISH_2 >= 116
+#        define BOOST_PP_ITERATION_2 116
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 117 && BOOST_PP_ITERATION_FINISH_2 >= 117
+#        define BOOST_PP_ITERATION_2 117
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 118 && BOOST_PP_ITERATION_FINISH_2 >= 118
+#        define BOOST_PP_ITERATION_2 118
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 119 && BOOST_PP_ITERATION_FINISH_2 >= 119
+#        define BOOST_PP_ITERATION_2 119
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 120 && BOOST_PP_ITERATION_FINISH_2 >= 120
+#        define BOOST_PP_ITERATION_2 120
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 121 && BOOST_PP_ITERATION_FINISH_2 >= 121
+#        define BOOST_PP_ITERATION_2 121
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 122 && BOOST_PP_ITERATION_FINISH_2 >= 122
+#        define BOOST_PP_ITERATION_2 122
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 123 && BOOST_PP_ITERATION_FINISH_2 >= 123
+#        define BOOST_PP_ITERATION_2 123
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 124 && BOOST_PP_ITERATION_FINISH_2 >= 124
+#        define BOOST_PP_ITERATION_2 124
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 125 && BOOST_PP_ITERATION_FINISH_2 >= 125
+#        define BOOST_PP_ITERATION_2 125
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 126 && BOOST_PP_ITERATION_FINISH_2 >= 126
+#        define BOOST_PP_ITERATION_2 126
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 127 && BOOST_PP_ITERATION_FINISH_2 >= 127
+#        define BOOST_PP_ITERATION_2 127
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 128 && BOOST_PP_ITERATION_FINISH_2 >= 128
+#        define BOOST_PP_ITERATION_2 128
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 129 && BOOST_PP_ITERATION_FINISH_2 >= 129
+#        define BOOST_PP_ITERATION_2 129
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 130 && BOOST_PP_ITERATION_FINISH_2 >= 130
+#        define BOOST_PP_ITERATION_2 130
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 131 && BOOST_PP_ITERATION_FINISH_2 >= 131
+#        define BOOST_PP_ITERATION_2 131
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 132 && BOOST_PP_ITERATION_FINISH_2 >= 132
+#        define BOOST_PP_ITERATION_2 132
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 133 && BOOST_PP_ITERATION_FINISH_2 >= 133
+#        define BOOST_PP_ITERATION_2 133
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 134 && BOOST_PP_ITERATION_FINISH_2 >= 134
+#        define BOOST_PP_ITERATION_2 134
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 135 && BOOST_PP_ITERATION_FINISH_2 >= 135
+#        define BOOST_PP_ITERATION_2 135
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 136 && BOOST_PP_ITERATION_FINISH_2 >= 136
+#        define BOOST_PP_ITERATION_2 136
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 137 && BOOST_PP_ITERATION_FINISH_2 >= 137
+#        define BOOST_PP_ITERATION_2 137
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 138 && BOOST_PP_ITERATION_FINISH_2 >= 138
+#        define BOOST_PP_ITERATION_2 138
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 139 && BOOST_PP_ITERATION_FINISH_2 >= 139
+#        define BOOST_PP_ITERATION_2 139
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 140 && BOOST_PP_ITERATION_FINISH_2 >= 140
+#        define BOOST_PP_ITERATION_2 140
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 141 && BOOST_PP_ITERATION_FINISH_2 >= 141
+#        define BOOST_PP_ITERATION_2 141
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 142 && BOOST_PP_ITERATION_FINISH_2 >= 142
+#        define BOOST_PP_ITERATION_2 142
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 143 && BOOST_PP_ITERATION_FINISH_2 >= 143
+#        define BOOST_PP_ITERATION_2 143
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 144 && BOOST_PP_ITERATION_FINISH_2 >= 144
+#        define BOOST_PP_ITERATION_2 144
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 145 && BOOST_PP_ITERATION_FINISH_2 >= 145
+#        define BOOST_PP_ITERATION_2 145
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 146 && BOOST_PP_ITERATION_FINISH_2 >= 146
+#        define BOOST_PP_ITERATION_2 146
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 147 && BOOST_PP_ITERATION_FINISH_2 >= 147
+#        define BOOST_PP_ITERATION_2 147
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 148 && BOOST_PP_ITERATION_FINISH_2 >= 148
+#        define BOOST_PP_ITERATION_2 148
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 149 && BOOST_PP_ITERATION_FINISH_2 >= 149
+#        define BOOST_PP_ITERATION_2 149
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 150 && BOOST_PP_ITERATION_FINISH_2 >= 150
+#        define BOOST_PP_ITERATION_2 150
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 151 && BOOST_PP_ITERATION_FINISH_2 >= 151
+#        define BOOST_PP_ITERATION_2 151
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 152 && BOOST_PP_ITERATION_FINISH_2 >= 152
+#        define BOOST_PP_ITERATION_2 152
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 153 && BOOST_PP_ITERATION_FINISH_2 >= 153
+#        define BOOST_PP_ITERATION_2 153
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 154 && BOOST_PP_ITERATION_FINISH_2 >= 154
+#        define BOOST_PP_ITERATION_2 154
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 155 && BOOST_PP_ITERATION_FINISH_2 >= 155
+#        define BOOST_PP_ITERATION_2 155
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 156 && BOOST_PP_ITERATION_FINISH_2 >= 156
+#        define BOOST_PP_ITERATION_2 156
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 157 && BOOST_PP_ITERATION_FINISH_2 >= 157
+#        define BOOST_PP_ITERATION_2 157
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 158 && BOOST_PP_ITERATION_FINISH_2 >= 158
+#        define BOOST_PP_ITERATION_2 158
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 159 && BOOST_PP_ITERATION_FINISH_2 >= 159
+#        define BOOST_PP_ITERATION_2 159
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 160 && BOOST_PP_ITERATION_FINISH_2 >= 160
+#        define BOOST_PP_ITERATION_2 160
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 161 && BOOST_PP_ITERATION_FINISH_2 >= 161
+#        define BOOST_PP_ITERATION_2 161
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 162 && BOOST_PP_ITERATION_FINISH_2 >= 162
+#        define BOOST_PP_ITERATION_2 162
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 163 && BOOST_PP_ITERATION_FINISH_2 >= 163
+#        define BOOST_PP_ITERATION_2 163
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 164 && BOOST_PP_ITERATION_FINISH_2 >= 164
+#        define BOOST_PP_ITERATION_2 164
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 165 && BOOST_PP_ITERATION_FINISH_2 >= 165
+#        define BOOST_PP_ITERATION_2 165
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 166 && BOOST_PP_ITERATION_FINISH_2 >= 166
+#        define BOOST_PP_ITERATION_2 166
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 167 && BOOST_PP_ITERATION_FINISH_2 >= 167
+#        define BOOST_PP_ITERATION_2 167
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 168 && BOOST_PP_ITERATION_FINISH_2 >= 168
+#        define BOOST_PP_ITERATION_2 168
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 169 && BOOST_PP_ITERATION_FINISH_2 >= 169
+#        define BOOST_PP_ITERATION_2 169
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 170 && BOOST_PP_ITERATION_FINISH_2 >= 170
+#        define BOOST_PP_ITERATION_2 170
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 171 && BOOST_PP_ITERATION_FINISH_2 >= 171
+#        define BOOST_PP_ITERATION_2 171
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 172 && BOOST_PP_ITERATION_FINISH_2 >= 172
+#        define BOOST_PP_ITERATION_2 172
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 173 && BOOST_PP_ITERATION_FINISH_2 >= 173
+#        define BOOST_PP_ITERATION_2 173
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 174 && BOOST_PP_ITERATION_FINISH_2 >= 174
+#        define BOOST_PP_ITERATION_2 174
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 175 && BOOST_PP_ITERATION_FINISH_2 >= 175
+#        define BOOST_PP_ITERATION_2 175
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 176 && BOOST_PP_ITERATION_FINISH_2 >= 176
+#        define BOOST_PP_ITERATION_2 176
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 177 && BOOST_PP_ITERATION_FINISH_2 >= 177
+#        define BOOST_PP_ITERATION_2 177
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 178 && BOOST_PP_ITERATION_FINISH_2 >= 178
+#        define BOOST_PP_ITERATION_2 178
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 179 && BOOST_PP_ITERATION_FINISH_2 >= 179
+#        define BOOST_PP_ITERATION_2 179
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 180 && BOOST_PP_ITERATION_FINISH_2 >= 180
+#        define BOOST_PP_ITERATION_2 180
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 181 && BOOST_PP_ITERATION_FINISH_2 >= 181
+#        define BOOST_PP_ITERATION_2 181
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 182 && BOOST_PP_ITERATION_FINISH_2 >= 182
+#        define BOOST_PP_ITERATION_2 182
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 183 && BOOST_PP_ITERATION_FINISH_2 >= 183
+#        define BOOST_PP_ITERATION_2 183
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 184 && BOOST_PP_ITERATION_FINISH_2 >= 184
+#        define BOOST_PP_ITERATION_2 184
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 185 && BOOST_PP_ITERATION_FINISH_2 >= 185
+#        define BOOST_PP_ITERATION_2 185
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 186 && BOOST_PP_ITERATION_FINISH_2 >= 186
+#        define BOOST_PP_ITERATION_2 186
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 187 && BOOST_PP_ITERATION_FINISH_2 >= 187
+#        define BOOST_PP_ITERATION_2 187
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 188 && BOOST_PP_ITERATION_FINISH_2 >= 188
+#        define BOOST_PP_ITERATION_2 188
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 189 && BOOST_PP_ITERATION_FINISH_2 >= 189
+#        define BOOST_PP_ITERATION_2 189
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 190 && BOOST_PP_ITERATION_FINISH_2 >= 190
+#        define BOOST_PP_ITERATION_2 190
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 191 && BOOST_PP_ITERATION_FINISH_2 >= 191
+#        define BOOST_PP_ITERATION_2 191
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 192 && BOOST_PP_ITERATION_FINISH_2 >= 192
+#        define BOOST_PP_ITERATION_2 192
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 193 && BOOST_PP_ITERATION_FINISH_2 >= 193
+#        define BOOST_PP_ITERATION_2 193
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 194 && BOOST_PP_ITERATION_FINISH_2 >= 194
+#        define BOOST_PP_ITERATION_2 194
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 195 && BOOST_PP_ITERATION_FINISH_2 >= 195
+#        define BOOST_PP_ITERATION_2 195
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 196 && BOOST_PP_ITERATION_FINISH_2 >= 196
+#        define BOOST_PP_ITERATION_2 196
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 197 && BOOST_PP_ITERATION_FINISH_2 >= 197
+#        define BOOST_PP_ITERATION_2 197
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 198 && BOOST_PP_ITERATION_FINISH_2 >= 198
+#        define BOOST_PP_ITERATION_2 198
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 199 && BOOST_PP_ITERATION_FINISH_2 >= 199
+#        define BOOST_PP_ITERATION_2 199
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 200 && BOOST_PP_ITERATION_FINISH_2 >= 200
+#        define BOOST_PP_ITERATION_2 200
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 201 && BOOST_PP_ITERATION_FINISH_2 >= 201
+#        define BOOST_PP_ITERATION_2 201
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 202 && BOOST_PP_ITERATION_FINISH_2 >= 202
+#        define BOOST_PP_ITERATION_2 202
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 203 && BOOST_PP_ITERATION_FINISH_2 >= 203
+#        define BOOST_PP_ITERATION_2 203
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 204 && BOOST_PP_ITERATION_FINISH_2 >= 204
+#        define BOOST_PP_ITERATION_2 204
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 205 && BOOST_PP_ITERATION_FINISH_2 >= 205
+#        define BOOST_PP_ITERATION_2 205
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 206 && BOOST_PP_ITERATION_FINISH_2 >= 206
+#        define BOOST_PP_ITERATION_2 206
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 207 && BOOST_PP_ITERATION_FINISH_2 >= 207
+#        define BOOST_PP_ITERATION_2 207
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 208 && BOOST_PP_ITERATION_FINISH_2 >= 208
+#        define BOOST_PP_ITERATION_2 208
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 209 && BOOST_PP_ITERATION_FINISH_2 >= 209
+#        define BOOST_PP_ITERATION_2 209
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 210 && BOOST_PP_ITERATION_FINISH_2 >= 210
+#        define BOOST_PP_ITERATION_2 210
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 211 && BOOST_PP_ITERATION_FINISH_2 >= 211
+#        define BOOST_PP_ITERATION_2 211
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 212 && BOOST_PP_ITERATION_FINISH_2 >= 212
+#        define BOOST_PP_ITERATION_2 212
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 213 && BOOST_PP_ITERATION_FINISH_2 >= 213
+#        define BOOST_PP_ITERATION_2 213
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 214 && BOOST_PP_ITERATION_FINISH_2 >= 214
+#        define BOOST_PP_ITERATION_2 214
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 215 && BOOST_PP_ITERATION_FINISH_2 >= 215
+#        define BOOST_PP_ITERATION_2 215
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 216 && BOOST_PP_ITERATION_FINISH_2 >= 216
+#        define BOOST_PP_ITERATION_2 216
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 217 && BOOST_PP_ITERATION_FINISH_2 >= 217
+#        define BOOST_PP_ITERATION_2 217
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 218 && BOOST_PP_ITERATION_FINISH_2 >= 218
+#        define BOOST_PP_ITERATION_2 218
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 219 && BOOST_PP_ITERATION_FINISH_2 >= 219
+#        define BOOST_PP_ITERATION_2 219
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 220 && BOOST_PP_ITERATION_FINISH_2 >= 220
+#        define BOOST_PP_ITERATION_2 220
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 221 && BOOST_PP_ITERATION_FINISH_2 >= 221
+#        define BOOST_PP_ITERATION_2 221
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 222 && BOOST_PP_ITERATION_FINISH_2 >= 222
+#        define BOOST_PP_ITERATION_2 222
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 223 && BOOST_PP_ITERATION_FINISH_2 >= 223
+#        define BOOST_PP_ITERATION_2 223
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 224 && BOOST_PP_ITERATION_FINISH_2 >= 224
+#        define BOOST_PP_ITERATION_2 224
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 225 && BOOST_PP_ITERATION_FINISH_2 >= 225
+#        define BOOST_PP_ITERATION_2 225
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 226 && BOOST_PP_ITERATION_FINISH_2 >= 226
+#        define BOOST_PP_ITERATION_2 226
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 227 && BOOST_PP_ITERATION_FINISH_2 >= 227
+#        define BOOST_PP_ITERATION_2 227
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 228 && BOOST_PP_ITERATION_FINISH_2 >= 228
+#        define BOOST_PP_ITERATION_2 228
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 229 && BOOST_PP_ITERATION_FINISH_2 >= 229
+#        define BOOST_PP_ITERATION_2 229
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 230 && BOOST_PP_ITERATION_FINISH_2 >= 230
+#        define BOOST_PP_ITERATION_2 230
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 231 && BOOST_PP_ITERATION_FINISH_2 >= 231
+#        define BOOST_PP_ITERATION_2 231
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 232 && BOOST_PP_ITERATION_FINISH_2 >= 232
+#        define BOOST_PP_ITERATION_2 232
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 233 && BOOST_PP_ITERATION_FINISH_2 >= 233
+#        define BOOST_PP_ITERATION_2 233
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 234 && BOOST_PP_ITERATION_FINISH_2 >= 234
+#        define BOOST_PP_ITERATION_2 234
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 235 && BOOST_PP_ITERATION_FINISH_2 >= 235
+#        define BOOST_PP_ITERATION_2 235
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 236 && BOOST_PP_ITERATION_FINISH_2 >= 236
+#        define BOOST_PP_ITERATION_2 236
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 237 && BOOST_PP_ITERATION_FINISH_2 >= 237
+#        define BOOST_PP_ITERATION_2 237
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 238 && BOOST_PP_ITERATION_FINISH_2 >= 238
+#        define BOOST_PP_ITERATION_2 238
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 239 && BOOST_PP_ITERATION_FINISH_2 >= 239
+#        define BOOST_PP_ITERATION_2 239
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 240 && BOOST_PP_ITERATION_FINISH_2 >= 240
+#        define BOOST_PP_ITERATION_2 240
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 241 && BOOST_PP_ITERATION_FINISH_2 >= 241
+#        define BOOST_PP_ITERATION_2 241
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 242 && BOOST_PP_ITERATION_FINISH_2 >= 242
+#        define BOOST_PP_ITERATION_2 242
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 243 && BOOST_PP_ITERATION_FINISH_2 >= 243
+#        define BOOST_PP_ITERATION_2 243
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 244 && BOOST_PP_ITERATION_FINISH_2 >= 244
+#        define BOOST_PP_ITERATION_2 244
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 245 && BOOST_PP_ITERATION_FINISH_2 >= 245
+#        define BOOST_PP_ITERATION_2 245
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 246 && BOOST_PP_ITERATION_FINISH_2 >= 246
+#        define BOOST_PP_ITERATION_2 246
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 247 && BOOST_PP_ITERATION_FINISH_2 >= 247
+#        define BOOST_PP_ITERATION_2 247
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 248 && BOOST_PP_ITERATION_FINISH_2 >= 248
+#        define BOOST_PP_ITERATION_2 248
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 249 && BOOST_PP_ITERATION_FINISH_2 >= 249
+#        define BOOST_PP_ITERATION_2 249
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 250 && BOOST_PP_ITERATION_FINISH_2 >= 250
+#        define BOOST_PP_ITERATION_2 250
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 251 && BOOST_PP_ITERATION_FINISH_2 >= 251
+#        define BOOST_PP_ITERATION_2 251
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 252 && BOOST_PP_ITERATION_FINISH_2 >= 252
+#        define BOOST_PP_ITERATION_2 252
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 253 && BOOST_PP_ITERATION_FINISH_2 >= 253
+#        define BOOST_PP_ITERATION_2 253
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 254 && BOOST_PP_ITERATION_FINISH_2 >= 254
+#        define BOOST_PP_ITERATION_2 254
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 255 && BOOST_PP_ITERATION_FINISH_2 >= 255
+#        define BOOST_PP_ITERATION_2 255
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+#    if BOOST_PP_ITERATION_START_2 <= 256 && BOOST_PP_ITERATION_FINISH_2 >= 256
+#        define BOOST_PP_ITERATION_2 256
+#        include BOOST_PP_FILENAME_2
+#        undef BOOST_PP_ITERATION_2
+#    endif
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 1
+#
+# undef BOOST_PP_ITERATION_START_2
+# undef BOOST_PP_ITERATION_FINISH_2
+# undef BOOST_PP_FILENAME_2
+#
+# undef BOOST_PP_ITERATION_FLAGS_2
+# undef BOOST_PP_ITERATION_PARAMS_2
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward3.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward3.hpp
new file mode 100644
index 0000000..e68966f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward3.hpp
@@ -0,0 +1,1338 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if defined(BOOST_PP_ITERATION_LIMITS)
+#    if !defined(BOOST_PP_FILENAME_3)
+#        error BOOST_PP_ERROR:  depth #3 filename is not defined
+#    endif
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>
+#    define BOOST_PP_ITERATION_FLAGS_3() 0
+#    undef BOOST_PP_ITERATION_LIMITS
+# elif defined(BOOST_PP_ITERATION_PARAMS_3)
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_3)
+#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_3)
+#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>
+#    define BOOST_PP_FILENAME_3 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_3)
+#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_3) >= 4
+#        define BOOST_PP_ITERATION_FLAGS_3() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_3)
+#    else
+#        define BOOST_PP_ITERATION_FLAGS_3() 0
+#    endif
+# else
+#    error BOOST_PP_ERROR:  depth #3 iteration boundaries or filename not defined
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 3
+#
+# if (BOOST_PP_ITERATION_START_3) > (BOOST_PP_ITERATION_FINISH_3)
+#    include <boost/preprocessor/iteration/detail/iter/reverse3.hpp>
+# else
+#    if BOOST_PP_ITERATION_START_3 <= 0 && BOOST_PP_ITERATION_FINISH_3 >= 0
+#        define BOOST_PP_ITERATION_3 0
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 1 && BOOST_PP_ITERATION_FINISH_3 >= 1
+#        define BOOST_PP_ITERATION_3 1
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 2 && BOOST_PP_ITERATION_FINISH_3 >= 2
+#        define BOOST_PP_ITERATION_3 2
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 3 && BOOST_PP_ITERATION_FINISH_3 >= 3
+#        define BOOST_PP_ITERATION_3 3
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 4 && BOOST_PP_ITERATION_FINISH_3 >= 4
+#        define BOOST_PP_ITERATION_3 4
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 5 && BOOST_PP_ITERATION_FINISH_3 >= 5
+#        define BOOST_PP_ITERATION_3 5
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 6 && BOOST_PP_ITERATION_FINISH_3 >= 6
+#        define BOOST_PP_ITERATION_3 6
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 7 && BOOST_PP_ITERATION_FINISH_3 >= 7
+#        define BOOST_PP_ITERATION_3 7
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 8 && BOOST_PP_ITERATION_FINISH_3 >= 8
+#        define BOOST_PP_ITERATION_3 8
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 9 && BOOST_PP_ITERATION_FINISH_3 >= 9
+#        define BOOST_PP_ITERATION_3 9
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 10 && BOOST_PP_ITERATION_FINISH_3 >= 10
+#        define BOOST_PP_ITERATION_3 10
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 11 && BOOST_PP_ITERATION_FINISH_3 >= 11
+#        define BOOST_PP_ITERATION_3 11
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 12 && BOOST_PP_ITERATION_FINISH_3 >= 12
+#        define BOOST_PP_ITERATION_3 12
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 13 && BOOST_PP_ITERATION_FINISH_3 >= 13
+#        define BOOST_PP_ITERATION_3 13
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 14 && BOOST_PP_ITERATION_FINISH_3 >= 14
+#        define BOOST_PP_ITERATION_3 14
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 15 && BOOST_PP_ITERATION_FINISH_3 >= 15
+#        define BOOST_PP_ITERATION_3 15
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 16 && BOOST_PP_ITERATION_FINISH_3 >= 16
+#        define BOOST_PP_ITERATION_3 16
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 17 && BOOST_PP_ITERATION_FINISH_3 >= 17
+#        define BOOST_PP_ITERATION_3 17
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 18 && BOOST_PP_ITERATION_FINISH_3 >= 18
+#        define BOOST_PP_ITERATION_3 18
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 19 && BOOST_PP_ITERATION_FINISH_3 >= 19
+#        define BOOST_PP_ITERATION_3 19
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 20 && BOOST_PP_ITERATION_FINISH_3 >= 20
+#        define BOOST_PP_ITERATION_3 20
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 21 && BOOST_PP_ITERATION_FINISH_3 >= 21
+#        define BOOST_PP_ITERATION_3 21
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 22 && BOOST_PP_ITERATION_FINISH_3 >= 22
+#        define BOOST_PP_ITERATION_3 22
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 23 && BOOST_PP_ITERATION_FINISH_3 >= 23
+#        define BOOST_PP_ITERATION_3 23
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 24 && BOOST_PP_ITERATION_FINISH_3 >= 24
+#        define BOOST_PP_ITERATION_3 24
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 25 && BOOST_PP_ITERATION_FINISH_3 >= 25
+#        define BOOST_PP_ITERATION_3 25
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 26 && BOOST_PP_ITERATION_FINISH_3 >= 26
+#        define BOOST_PP_ITERATION_3 26
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 27 && BOOST_PP_ITERATION_FINISH_3 >= 27
+#        define BOOST_PP_ITERATION_3 27
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 28 && BOOST_PP_ITERATION_FINISH_3 >= 28
+#        define BOOST_PP_ITERATION_3 28
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 29 && BOOST_PP_ITERATION_FINISH_3 >= 29
+#        define BOOST_PP_ITERATION_3 29
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 30 && BOOST_PP_ITERATION_FINISH_3 >= 30
+#        define BOOST_PP_ITERATION_3 30
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 31 && BOOST_PP_ITERATION_FINISH_3 >= 31
+#        define BOOST_PP_ITERATION_3 31
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 32 && BOOST_PP_ITERATION_FINISH_3 >= 32
+#        define BOOST_PP_ITERATION_3 32
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 33 && BOOST_PP_ITERATION_FINISH_3 >= 33
+#        define BOOST_PP_ITERATION_3 33
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 34 && BOOST_PP_ITERATION_FINISH_3 >= 34
+#        define BOOST_PP_ITERATION_3 34
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 35 && BOOST_PP_ITERATION_FINISH_3 >= 35
+#        define BOOST_PP_ITERATION_3 35
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 36 && BOOST_PP_ITERATION_FINISH_3 >= 36
+#        define BOOST_PP_ITERATION_3 36
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 37 && BOOST_PP_ITERATION_FINISH_3 >= 37
+#        define BOOST_PP_ITERATION_3 37
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 38 && BOOST_PP_ITERATION_FINISH_3 >= 38
+#        define BOOST_PP_ITERATION_3 38
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 39 && BOOST_PP_ITERATION_FINISH_3 >= 39
+#        define BOOST_PP_ITERATION_3 39
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 40 && BOOST_PP_ITERATION_FINISH_3 >= 40
+#        define BOOST_PP_ITERATION_3 40
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 41 && BOOST_PP_ITERATION_FINISH_3 >= 41
+#        define BOOST_PP_ITERATION_3 41
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 42 && BOOST_PP_ITERATION_FINISH_3 >= 42
+#        define BOOST_PP_ITERATION_3 42
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 43 && BOOST_PP_ITERATION_FINISH_3 >= 43
+#        define BOOST_PP_ITERATION_3 43
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 44 && BOOST_PP_ITERATION_FINISH_3 >= 44
+#        define BOOST_PP_ITERATION_3 44
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 45 && BOOST_PP_ITERATION_FINISH_3 >= 45
+#        define BOOST_PP_ITERATION_3 45
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 46 && BOOST_PP_ITERATION_FINISH_3 >= 46
+#        define BOOST_PP_ITERATION_3 46
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 47 && BOOST_PP_ITERATION_FINISH_3 >= 47
+#        define BOOST_PP_ITERATION_3 47
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 48 && BOOST_PP_ITERATION_FINISH_3 >= 48
+#        define BOOST_PP_ITERATION_3 48
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 49 && BOOST_PP_ITERATION_FINISH_3 >= 49
+#        define BOOST_PP_ITERATION_3 49
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 50 && BOOST_PP_ITERATION_FINISH_3 >= 50
+#        define BOOST_PP_ITERATION_3 50
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 51 && BOOST_PP_ITERATION_FINISH_3 >= 51
+#        define BOOST_PP_ITERATION_3 51
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 52 && BOOST_PP_ITERATION_FINISH_3 >= 52
+#        define BOOST_PP_ITERATION_3 52
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 53 && BOOST_PP_ITERATION_FINISH_3 >= 53
+#        define BOOST_PP_ITERATION_3 53
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 54 && BOOST_PP_ITERATION_FINISH_3 >= 54
+#        define BOOST_PP_ITERATION_3 54
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 55 && BOOST_PP_ITERATION_FINISH_3 >= 55
+#        define BOOST_PP_ITERATION_3 55
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 56 && BOOST_PP_ITERATION_FINISH_3 >= 56
+#        define BOOST_PP_ITERATION_3 56
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 57 && BOOST_PP_ITERATION_FINISH_3 >= 57
+#        define BOOST_PP_ITERATION_3 57
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 58 && BOOST_PP_ITERATION_FINISH_3 >= 58
+#        define BOOST_PP_ITERATION_3 58
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 59 && BOOST_PP_ITERATION_FINISH_3 >= 59
+#        define BOOST_PP_ITERATION_3 59
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 60 && BOOST_PP_ITERATION_FINISH_3 >= 60
+#        define BOOST_PP_ITERATION_3 60
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 61 && BOOST_PP_ITERATION_FINISH_3 >= 61
+#        define BOOST_PP_ITERATION_3 61
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 62 && BOOST_PP_ITERATION_FINISH_3 >= 62
+#        define BOOST_PP_ITERATION_3 62
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 63 && BOOST_PP_ITERATION_FINISH_3 >= 63
+#        define BOOST_PP_ITERATION_3 63
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 64 && BOOST_PP_ITERATION_FINISH_3 >= 64
+#        define BOOST_PP_ITERATION_3 64
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 65 && BOOST_PP_ITERATION_FINISH_3 >= 65
+#        define BOOST_PP_ITERATION_3 65
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 66 && BOOST_PP_ITERATION_FINISH_3 >= 66
+#        define BOOST_PP_ITERATION_3 66
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 67 && BOOST_PP_ITERATION_FINISH_3 >= 67
+#        define BOOST_PP_ITERATION_3 67
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 68 && BOOST_PP_ITERATION_FINISH_3 >= 68
+#        define BOOST_PP_ITERATION_3 68
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 69 && BOOST_PP_ITERATION_FINISH_3 >= 69
+#        define BOOST_PP_ITERATION_3 69
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 70 && BOOST_PP_ITERATION_FINISH_3 >= 70
+#        define BOOST_PP_ITERATION_3 70
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 71 && BOOST_PP_ITERATION_FINISH_3 >= 71
+#        define BOOST_PP_ITERATION_3 71
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 72 && BOOST_PP_ITERATION_FINISH_3 >= 72
+#        define BOOST_PP_ITERATION_3 72
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 73 && BOOST_PP_ITERATION_FINISH_3 >= 73
+#        define BOOST_PP_ITERATION_3 73
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 74 && BOOST_PP_ITERATION_FINISH_3 >= 74
+#        define BOOST_PP_ITERATION_3 74
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 75 && BOOST_PP_ITERATION_FINISH_3 >= 75
+#        define BOOST_PP_ITERATION_3 75
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 76 && BOOST_PP_ITERATION_FINISH_3 >= 76
+#        define BOOST_PP_ITERATION_3 76
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 77 && BOOST_PP_ITERATION_FINISH_3 >= 77
+#        define BOOST_PP_ITERATION_3 77
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 78 && BOOST_PP_ITERATION_FINISH_3 >= 78
+#        define BOOST_PP_ITERATION_3 78
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 79 && BOOST_PP_ITERATION_FINISH_3 >= 79
+#        define BOOST_PP_ITERATION_3 79
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 80 && BOOST_PP_ITERATION_FINISH_3 >= 80
+#        define BOOST_PP_ITERATION_3 80
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 81 && BOOST_PP_ITERATION_FINISH_3 >= 81
+#        define BOOST_PP_ITERATION_3 81
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 82 && BOOST_PP_ITERATION_FINISH_3 >= 82
+#        define BOOST_PP_ITERATION_3 82
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 83 && BOOST_PP_ITERATION_FINISH_3 >= 83
+#        define BOOST_PP_ITERATION_3 83
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 84 && BOOST_PP_ITERATION_FINISH_3 >= 84
+#        define BOOST_PP_ITERATION_3 84
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 85 && BOOST_PP_ITERATION_FINISH_3 >= 85
+#        define BOOST_PP_ITERATION_3 85
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 86 && BOOST_PP_ITERATION_FINISH_3 >= 86
+#        define BOOST_PP_ITERATION_3 86
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 87 && BOOST_PP_ITERATION_FINISH_3 >= 87
+#        define BOOST_PP_ITERATION_3 87
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 88 && BOOST_PP_ITERATION_FINISH_3 >= 88
+#        define BOOST_PP_ITERATION_3 88
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 89 && BOOST_PP_ITERATION_FINISH_3 >= 89
+#        define BOOST_PP_ITERATION_3 89
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 90 && BOOST_PP_ITERATION_FINISH_3 >= 90
+#        define BOOST_PP_ITERATION_3 90
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 91 && BOOST_PP_ITERATION_FINISH_3 >= 91
+#        define BOOST_PP_ITERATION_3 91
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 92 && BOOST_PP_ITERATION_FINISH_3 >= 92
+#        define BOOST_PP_ITERATION_3 92
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 93 && BOOST_PP_ITERATION_FINISH_3 >= 93
+#        define BOOST_PP_ITERATION_3 93
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 94 && BOOST_PP_ITERATION_FINISH_3 >= 94
+#        define BOOST_PP_ITERATION_3 94
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 95 && BOOST_PP_ITERATION_FINISH_3 >= 95
+#        define BOOST_PP_ITERATION_3 95
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 96 && BOOST_PP_ITERATION_FINISH_3 >= 96
+#        define BOOST_PP_ITERATION_3 96
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 97 && BOOST_PP_ITERATION_FINISH_3 >= 97
+#        define BOOST_PP_ITERATION_3 97
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 98 && BOOST_PP_ITERATION_FINISH_3 >= 98
+#        define BOOST_PP_ITERATION_3 98
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 99 && BOOST_PP_ITERATION_FINISH_3 >= 99
+#        define BOOST_PP_ITERATION_3 99
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 100 && BOOST_PP_ITERATION_FINISH_3 >= 100
+#        define BOOST_PP_ITERATION_3 100
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 101 && BOOST_PP_ITERATION_FINISH_3 >= 101
+#        define BOOST_PP_ITERATION_3 101
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 102 && BOOST_PP_ITERATION_FINISH_3 >= 102
+#        define BOOST_PP_ITERATION_3 102
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 103 && BOOST_PP_ITERATION_FINISH_3 >= 103
+#        define BOOST_PP_ITERATION_3 103
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 104 && BOOST_PP_ITERATION_FINISH_3 >= 104
+#        define BOOST_PP_ITERATION_3 104
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 105 && BOOST_PP_ITERATION_FINISH_3 >= 105
+#        define BOOST_PP_ITERATION_3 105
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 106 && BOOST_PP_ITERATION_FINISH_3 >= 106
+#        define BOOST_PP_ITERATION_3 106
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 107 && BOOST_PP_ITERATION_FINISH_3 >= 107
+#        define BOOST_PP_ITERATION_3 107
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 108 && BOOST_PP_ITERATION_FINISH_3 >= 108
+#        define BOOST_PP_ITERATION_3 108
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 109 && BOOST_PP_ITERATION_FINISH_3 >= 109
+#        define BOOST_PP_ITERATION_3 109
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 110 && BOOST_PP_ITERATION_FINISH_3 >= 110
+#        define BOOST_PP_ITERATION_3 110
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 111 && BOOST_PP_ITERATION_FINISH_3 >= 111
+#        define BOOST_PP_ITERATION_3 111
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 112 && BOOST_PP_ITERATION_FINISH_3 >= 112
+#        define BOOST_PP_ITERATION_3 112
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 113 && BOOST_PP_ITERATION_FINISH_3 >= 113
+#        define BOOST_PP_ITERATION_3 113
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 114 && BOOST_PP_ITERATION_FINISH_3 >= 114
+#        define BOOST_PP_ITERATION_3 114
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 115 && BOOST_PP_ITERATION_FINISH_3 >= 115
+#        define BOOST_PP_ITERATION_3 115
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 116 && BOOST_PP_ITERATION_FINISH_3 >= 116
+#        define BOOST_PP_ITERATION_3 116
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 117 && BOOST_PP_ITERATION_FINISH_3 >= 117
+#        define BOOST_PP_ITERATION_3 117
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 118 && BOOST_PP_ITERATION_FINISH_3 >= 118
+#        define BOOST_PP_ITERATION_3 118
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 119 && BOOST_PP_ITERATION_FINISH_3 >= 119
+#        define BOOST_PP_ITERATION_3 119
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 120 && BOOST_PP_ITERATION_FINISH_3 >= 120
+#        define BOOST_PP_ITERATION_3 120
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 121 && BOOST_PP_ITERATION_FINISH_3 >= 121
+#        define BOOST_PP_ITERATION_3 121
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 122 && BOOST_PP_ITERATION_FINISH_3 >= 122
+#        define BOOST_PP_ITERATION_3 122
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 123 && BOOST_PP_ITERATION_FINISH_3 >= 123
+#        define BOOST_PP_ITERATION_3 123
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 124 && BOOST_PP_ITERATION_FINISH_3 >= 124
+#        define BOOST_PP_ITERATION_3 124
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 125 && BOOST_PP_ITERATION_FINISH_3 >= 125
+#        define BOOST_PP_ITERATION_3 125
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 126 && BOOST_PP_ITERATION_FINISH_3 >= 126
+#        define BOOST_PP_ITERATION_3 126
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 127 && BOOST_PP_ITERATION_FINISH_3 >= 127
+#        define BOOST_PP_ITERATION_3 127
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 128 && BOOST_PP_ITERATION_FINISH_3 >= 128
+#        define BOOST_PP_ITERATION_3 128
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 129 && BOOST_PP_ITERATION_FINISH_3 >= 129
+#        define BOOST_PP_ITERATION_3 129
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 130 && BOOST_PP_ITERATION_FINISH_3 >= 130
+#        define BOOST_PP_ITERATION_3 130
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 131 && BOOST_PP_ITERATION_FINISH_3 >= 131
+#        define BOOST_PP_ITERATION_3 131
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 132 && BOOST_PP_ITERATION_FINISH_3 >= 132
+#        define BOOST_PP_ITERATION_3 132
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 133 && BOOST_PP_ITERATION_FINISH_3 >= 133
+#        define BOOST_PP_ITERATION_3 133
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 134 && BOOST_PP_ITERATION_FINISH_3 >= 134
+#        define BOOST_PP_ITERATION_3 134
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 135 && BOOST_PP_ITERATION_FINISH_3 >= 135
+#        define BOOST_PP_ITERATION_3 135
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 136 && BOOST_PP_ITERATION_FINISH_3 >= 136
+#        define BOOST_PP_ITERATION_3 136
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 137 && BOOST_PP_ITERATION_FINISH_3 >= 137
+#        define BOOST_PP_ITERATION_3 137
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 138 && BOOST_PP_ITERATION_FINISH_3 >= 138
+#        define BOOST_PP_ITERATION_3 138
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 139 && BOOST_PP_ITERATION_FINISH_3 >= 139
+#        define BOOST_PP_ITERATION_3 139
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 140 && BOOST_PP_ITERATION_FINISH_3 >= 140
+#        define BOOST_PP_ITERATION_3 140
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 141 && BOOST_PP_ITERATION_FINISH_3 >= 141
+#        define BOOST_PP_ITERATION_3 141
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 142 && BOOST_PP_ITERATION_FINISH_3 >= 142
+#        define BOOST_PP_ITERATION_3 142
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 143 && BOOST_PP_ITERATION_FINISH_3 >= 143
+#        define BOOST_PP_ITERATION_3 143
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 144 && BOOST_PP_ITERATION_FINISH_3 >= 144
+#        define BOOST_PP_ITERATION_3 144
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 145 && BOOST_PP_ITERATION_FINISH_3 >= 145
+#        define BOOST_PP_ITERATION_3 145
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 146 && BOOST_PP_ITERATION_FINISH_3 >= 146
+#        define BOOST_PP_ITERATION_3 146
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 147 && BOOST_PP_ITERATION_FINISH_3 >= 147
+#        define BOOST_PP_ITERATION_3 147
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 148 && BOOST_PP_ITERATION_FINISH_3 >= 148
+#        define BOOST_PP_ITERATION_3 148
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 149 && BOOST_PP_ITERATION_FINISH_3 >= 149
+#        define BOOST_PP_ITERATION_3 149
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 150 && BOOST_PP_ITERATION_FINISH_3 >= 150
+#        define BOOST_PP_ITERATION_3 150
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 151 && BOOST_PP_ITERATION_FINISH_3 >= 151
+#        define BOOST_PP_ITERATION_3 151
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 152 && BOOST_PP_ITERATION_FINISH_3 >= 152
+#        define BOOST_PP_ITERATION_3 152
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 153 && BOOST_PP_ITERATION_FINISH_3 >= 153
+#        define BOOST_PP_ITERATION_3 153
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 154 && BOOST_PP_ITERATION_FINISH_3 >= 154
+#        define BOOST_PP_ITERATION_3 154
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 155 && BOOST_PP_ITERATION_FINISH_3 >= 155
+#        define BOOST_PP_ITERATION_3 155
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 156 && BOOST_PP_ITERATION_FINISH_3 >= 156
+#        define BOOST_PP_ITERATION_3 156
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 157 && BOOST_PP_ITERATION_FINISH_3 >= 157
+#        define BOOST_PP_ITERATION_3 157
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 158 && BOOST_PP_ITERATION_FINISH_3 >= 158
+#        define BOOST_PP_ITERATION_3 158
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 159 && BOOST_PP_ITERATION_FINISH_3 >= 159
+#        define BOOST_PP_ITERATION_3 159
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 160 && BOOST_PP_ITERATION_FINISH_3 >= 160
+#        define BOOST_PP_ITERATION_3 160
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 161 && BOOST_PP_ITERATION_FINISH_3 >= 161
+#        define BOOST_PP_ITERATION_3 161
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 162 && BOOST_PP_ITERATION_FINISH_3 >= 162
+#        define BOOST_PP_ITERATION_3 162
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 163 && BOOST_PP_ITERATION_FINISH_3 >= 163
+#        define BOOST_PP_ITERATION_3 163
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 164 && BOOST_PP_ITERATION_FINISH_3 >= 164
+#        define BOOST_PP_ITERATION_3 164
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 165 && BOOST_PP_ITERATION_FINISH_3 >= 165
+#        define BOOST_PP_ITERATION_3 165
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 166 && BOOST_PP_ITERATION_FINISH_3 >= 166
+#        define BOOST_PP_ITERATION_3 166
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 167 && BOOST_PP_ITERATION_FINISH_3 >= 167
+#        define BOOST_PP_ITERATION_3 167
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 168 && BOOST_PP_ITERATION_FINISH_3 >= 168
+#        define BOOST_PP_ITERATION_3 168
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 169 && BOOST_PP_ITERATION_FINISH_3 >= 169
+#        define BOOST_PP_ITERATION_3 169
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 170 && BOOST_PP_ITERATION_FINISH_3 >= 170
+#        define BOOST_PP_ITERATION_3 170
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 171 && BOOST_PP_ITERATION_FINISH_3 >= 171
+#        define BOOST_PP_ITERATION_3 171
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 172 && BOOST_PP_ITERATION_FINISH_3 >= 172
+#        define BOOST_PP_ITERATION_3 172
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 173 && BOOST_PP_ITERATION_FINISH_3 >= 173
+#        define BOOST_PP_ITERATION_3 173
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 174 && BOOST_PP_ITERATION_FINISH_3 >= 174
+#        define BOOST_PP_ITERATION_3 174
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 175 && BOOST_PP_ITERATION_FINISH_3 >= 175
+#        define BOOST_PP_ITERATION_3 175
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 176 && BOOST_PP_ITERATION_FINISH_3 >= 176
+#        define BOOST_PP_ITERATION_3 176
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 177 && BOOST_PP_ITERATION_FINISH_3 >= 177
+#        define BOOST_PP_ITERATION_3 177
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 178 && BOOST_PP_ITERATION_FINISH_3 >= 178
+#        define BOOST_PP_ITERATION_3 178
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 179 && BOOST_PP_ITERATION_FINISH_3 >= 179
+#        define BOOST_PP_ITERATION_3 179
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 180 && BOOST_PP_ITERATION_FINISH_3 >= 180
+#        define BOOST_PP_ITERATION_3 180
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 181 && BOOST_PP_ITERATION_FINISH_3 >= 181
+#        define BOOST_PP_ITERATION_3 181
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 182 && BOOST_PP_ITERATION_FINISH_3 >= 182
+#        define BOOST_PP_ITERATION_3 182
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 183 && BOOST_PP_ITERATION_FINISH_3 >= 183
+#        define BOOST_PP_ITERATION_3 183
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 184 && BOOST_PP_ITERATION_FINISH_3 >= 184
+#        define BOOST_PP_ITERATION_3 184
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 185 && BOOST_PP_ITERATION_FINISH_3 >= 185
+#        define BOOST_PP_ITERATION_3 185
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 186 && BOOST_PP_ITERATION_FINISH_3 >= 186
+#        define BOOST_PP_ITERATION_3 186
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 187 && BOOST_PP_ITERATION_FINISH_3 >= 187
+#        define BOOST_PP_ITERATION_3 187
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 188 && BOOST_PP_ITERATION_FINISH_3 >= 188
+#        define BOOST_PP_ITERATION_3 188
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 189 && BOOST_PP_ITERATION_FINISH_3 >= 189
+#        define BOOST_PP_ITERATION_3 189
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 190 && BOOST_PP_ITERATION_FINISH_3 >= 190
+#        define BOOST_PP_ITERATION_3 190
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 191 && BOOST_PP_ITERATION_FINISH_3 >= 191
+#        define BOOST_PP_ITERATION_3 191
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 192 && BOOST_PP_ITERATION_FINISH_3 >= 192
+#        define BOOST_PP_ITERATION_3 192
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 193 && BOOST_PP_ITERATION_FINISH_3 >= 193
+#        define BOOST_PP_ITERATION_3 193
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 194 && BOOST_PP_ITERATION_FINISH_3 >= 194
+#        define BOOST_PP_ITERATION_3 194
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 195 && BOOST_PP_ITERATION_FINISH_3 >= 195
+#        define BOOST_PP_ITERATION_3 195
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 196 && BOOST_PP_ITERATION_FINISH_3 >= 196
+#        define BOOST_PP_ITERATION_3 196
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 197 && BOOST_PP_ITERATION_FINISH_3 >= 197
+#        define BOOST_PP_ITERATION_3 197
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 198 && BOOST_PP_ITERATION_FINISH_3 >= 198
+#        define BOOST_PP_ITERATION_3 198
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 199 && BOOST_PP_ITERATION_FINISH_3 >= 199
+#        define BOOST_PP_ITERATION_3 199
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 200 && BOOST_PP_ITERATION_FINISH_3 >= 200
+#        define BOOST_PP_ITERATION_3 200
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 201 && BOOST_PP_ITERATION_FINISH_3 >= 201
+#        define BOOST_PP_ITERATION_3 201
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 202 && BOOST_PP_ITERATION_FINISH_3 >= 202
+#        define BOOST_PP_ITERATION_3 202
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 203 && BOOST_PP_ITERATION_FINISH_3 >= 203
+#        define BOOST_PP_ITERATION_3 203
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 204 && BOOST_PP_ITERATION_FINISH_3 >= 204
+#        define BOOST_PP_ITERATION_3 204
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 205 && BOOST_PP_ITERATION_FINISH_3 >= 205
+#        define BOOST_PP_ITERATION_3 205
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 206 && BOOST_PP_ITERATION_FINISH_3 >= 206
+#        define BOOST_PP_ITERATION_3 206
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 207 && BOOST_PP_ITERATION_FINISH_3 >= 207
+#        define BOOST_PP_ITERATION_3 207
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 208 && BOOST_PP_ITERATION_FINISH_3 >= 208
+#        define BOOST_PP_ITERATION_3 208
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 209 && BOOST_PP_ITERATION_FINISH_3 >= 209
+#        define BOOST_PP_ITERATION_3 209
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 210 && BOOST_PP_ITERATION_FINISH_3 >= 210
+#        define BOOST_PP_ITERATION_3 210
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 211 && BOOST_PP_ITERATION_FINISH_3 >= 211
+#        define BOOST_PP_ITERATION_3 211
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 212 && BOOST_PP_ITERATION_FINISH_3 >= 212
+#        define BOOST_PP_ITERATION_3 212
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 213 && BOOST_PP_ITERATION_FINISH_3 >= 213
+#        define BOOST_PP_ITERATION_3 213
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 214 && BOOST_PP_ITERATION_FINISH_3 >= 214
+#        define BOOST_PP_ITERATION_3 214
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 215 && BOOST_PP_ITERATION_FINISH_3 >= 215
+#        define BOOST_PP_ITERATION_3 215
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 216 && BOOST_PP_ITERATION_FINISH_3 >= 216
+#        define BOOST_PP_ITERATION_3 216
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 217 && BOOST_PP_ITERATION_FINISH_3 >= 217
+#        define BOOST_PP_ITERATION_3 217
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 218 && BOOST_PP_ITERATION_FINISH_3 >= 218
+#        define BOOST_PP_ITERATION_3 218
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 219 && BOOST_PP_ITERATION_FINISH_3 >= 219
+#        define BOOST_PP_ITERATION_3 219
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 220 && BOOST_PP_ITERATION_FINISH_3 >= 220
+#        define BOOST_PP_ITERATION_3 220
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 221 && BOOST_PP_ITERATION_FINISH_3 >= 221
+#        define BOOST_PP_ITERATION_3 221
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 222 && BOOST_PP_ITERATION_FINISH_3 >= 222
+#        define BOOST_PP_ITERATION_3 222
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 223 && BOOST_PP_ITERATION_FINISH_3 >= 223
+#        define BOOST_PP_ITERATION_3 223
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 224 && BOOST_PP_ITERATION_FINISH_3 >= 224
+#        define BOOST_PP_ITERATION_3 224
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 225 && BOOST_PP_ITERATION_FINISH_3 >= 225
+#        define BOOST_PP_ITERATION_3 225
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 226 && BOOST_PP_ITERATION_FINISH_3 >= 226
+#        define BOOST_PP_ITERATION_3 226
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 227 && BOOST_PP_ITERATION_FINISH_3 >= 227
+#        define BOOST_PP_ITERATION_3 227
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 228 && BOOST_PP_ITERATION_FINISH_3 >= 228
+#        define BOOST_PP_ITERATION_3 228
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 229 && BOOST_PP_ITERATION_FINISH_3 >= 229
+#        define BOOST_PP_ITERATION_3 229
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 230 && BOOST_PP_ITERATION_FINISH_3 >= 230
+#        define BOOST_PP_ITERATION_3 230
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 231 && BOOST_PP_ITERATION_FINISH_3 >= 231
+#        define BOOST_PP_ITERATION_3 231
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 232 && BOOST_PP_ITERATION_FINISH_3 >= 232
+#        define BOOST_PP_ITERATION_3 232
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 233 && BOOST_PP_ITERATION_FINISH_3 >= 233
+#        define BOOST_PP_ITERATION_3 233
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 234 && BOOST_PP_ITERATION_FINISH_3 >= 234
+#        define BOOST_PP_ITERATION_3 234
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 235 && BOOST_PP_ITERATION_FINISH_3 >= 235
+#        define BOOST_PP_ITERATION_3 235
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 236 && BOOST_PP_ITERATION_FINISH_3 >= 236
+#        define BOOST_PP_ITERATION_3 236
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 237 && BOOST_PP_ITERATION_FINISH_3 >= 237
+#        define BOOST_PP_ITERATION_3 237
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 238 && BOOST_PP_ITERATION_FINISH_3 >= 238
+#        define BOOST_PP_ITERATION_3 238
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 239 && BOOST_PP_ITERATION_FINISH_3 >= 239
+#        define BOOST_PP_ITERATION_3 239
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 240 && BOOST_PP_ITERATION_FINISH_3 >= 240
+#        define BOOST_PP_ITERATION_3 240
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 241 && BOOST_PP_ITERATION_FINISH_3 >= 241
+#        define BOOST_PP_ITERATION_3 241
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 242 && BOOST_PP_ITERATION_FINISH_3 >= 242
+#        define BOOST_PP_ITERATION_3 242
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 243 && BOOST_PP_ITERATION_FINISH_3 >= 243
+#        define BOOST_PP_ITERATION_3 243
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 244 && BOOST_PP_ITERATION_FINISH_3 >= 244
+#        define BOOST_PP_ITERATION_3 244
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 245 && BOOST_PP_ITERATION_FINISH_3 >= 245
+#        define BOOST_PP_ITERATION_3 245
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 246 && BOOST_PP_ITERATION_FINISH_3 >= 246
+#        define BOOST_PP_ITERATION_3 246
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 247 && BOOST_PP_ITERATION_FINISH_3 >= 247
+#        define BOOST_PP_ITERATION_3 247
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 248 && BOOST_PP_ITERATION_FINISH_3 >= 248
+#        define BOOST_PP_ITERATION_3 248
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 249 && BOOST_PP_ITERATION_FINISH_3 >= 249
+#        define BOOST_PP_ITERATION_3 249
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 250 && BOOST_PP_ITERATION_FINISH_3 >= 250
+#        define BOOST_PP_ITERATION_3 250
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 251 && BOOST_PP_ITERATION_FINISH_3 >= 251
+#        define BOOST_PP_ITERATION_3 251
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 252 && BOOST_PP_ITERATION_FINISH_3 >= 252
+#        define BOOST_PP_ITERATION_3 252
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 253 && BOOST_PP_ITERATION_FINISH_3 >= 253
+#        define BOOST_PP_ITERATION_3 253
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 254 && BOOST_PP_ITERATION_FINISH_3 >= 254
+#        define BOOST_PP_ITERATION_3 254
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 255 && BOOST_PP_ITERATION_FINISH_3 >= 255
+#        define BOOST_PP_ITERATION_3 255
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+#    if BOOST_PP_ITERATION_START_3 <= 256 && BOOST_PP_ITERATION_FINISH_3 >= 256
+#        define BOOST_PP_ITERATION_3 256
+#        include BOOST_PP_FILENAME_3
+#        undef BOOST_PP_ITERATION_3
+#    endif
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 2
+#
+# undef BOOST_PP_ITERATION_START_3
+# undef BOOST_PP_ITERATION_FINISH_3
+# undef BOOST_PP_FILENAME_3
+#
+# undef BOOST_PP_ITERATION_FLAGS_3
+# undef BOOST_PP_ITERATION_PARAMS_3
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward4.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward4.hpp
new file mode 100644
index 0000000..1b4f588
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward4.hpp
@@ -0,0 +1,1338 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if defined(BOOST_PP_ITERATION_LIMITS)
+#    if !defined(BOOST_PP_FILENAME_4)
+#        error BOOST_PP_ERROR:  depth #4 filename is not defined
+#    endif
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>
+#    define BOOST_PP_ITERATION_FLAGS_4() 0
+#    undef BOOST_PP_ITERATION_LIMITS
+# elif defined(BOOST_PP_ITERATION_PARAMS_4)
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_4)
+#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_4)
+#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>
+#    define BOOST_PP_FILENAME_4 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_4)
+#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_4) >= 4
+#        define BOOST_PP_ITERATION_FLAGS_4() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_4)
+#    else
+#        define BOOST_PP_ITERATION_FLAGS_4() 0
+#    endif
+# else
+#    error BOOST_PP_ERROR:  depth #4 iteration boundaries or filename not defined
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 4
+#
+# if (BOOST_PP_ITERATION_START_4) > (BOOST_PP_ITERATION_FINISH_4)
+#    include <boost/preprocessor/iteration/detail/iter/reverse4.hpp>
+# else
+#    if BOOST_PP_ITERATION_START_4 <= 0 && BOOST_PP_ITERATION_FINISH_4 >= 0
+#        define BOOST_PP_ITERATION_4 0
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 1 && BOOST_PP_ITERATION_FINISH_4 >= 1
+#        define BOOST_PP_ITERATION_4 1
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 2 && BOOST_PP_ITERATION_FINISH_4 >= 2
+#        define BOOST_PP_ITERATION_4 2
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 3 && BOOST_PP_ITERATION_FINISH_4 >= 3
+#        define BOOST_PP_ITERATION_4 3
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 4 && BOOST_PP_ITERATION_FINISH_4 >= 4
+#        define BOOST_PP_ITERATION_4 4
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 5 && BOOST_PP_ITERATION_FINISH_4 >= 5
+#        define BOOST_PP_ITERATION_4 5
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 6 && BOOST_PP_ITERATION_FINISH_4 >= 6
+#        define BOOST_PP_ITERATION_4 6
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 7 && BOOST_PP_ITERATION_FINISH_4 >= 7
+#        define BOOST_PP_ITERATION_4 7
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 8 && BOOST_PP_ITERATION_FINISH_4 >= 8
+#        define BOOST_PP_ITERATION_4 8
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 9 && BOOST_PP_ITERATION_FINISH_4 >= 9
+#        define BOOST_PP_ITERATION_4 9
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 10 && BOOST_PP_ITERATION_FINISH_4 >= 10
+#        define BOOST_PP_ITERATION_4 10
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 11 && BOOST_PP_ITERATION_FINISH_4 >= 11
+#        define BOOST_PP_ITERATION_4 11
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 12 && BOOST_PP_ITERATION_FINISH_4 >= 12
+#        define BOOST_PP_ITERATION_4 12
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 13 && BOOST_PP_ITERATION_FINISH_4 >= 13
+#        define BOOST_PP_ITERATION_4 13
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 14 && BOOST_PP_ITERATION_FINISH_4 >= 14
+#        define BOOST_PP_ITERATION_4 14
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 15 && BOOST_PP_ITERATION_FINISH_4 >= 15
+#        define BOOST_PP_ITERATION_4 15
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 16 && BOOST_PP_ITERATION_FINISH_4 >= 16
+#        define BOOST_PP_ITERATION_4 16
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 17 && BOOST_PP_ITERATION_FINISH_4 >= 17
+#        define BOOST_PP_ITERATION_4 17
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 18 && BOOST_PP_ITERATION_FINISH_4 >= 18
+#        define BOOST_PP_ITERATION_4 18
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 19 && BOOST_PP_ITERATION_FINISH_4 >= 19
+#        define BOOST_PP_ITERATION_4 19
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 20 && BOOST_PP_ITERATION_FINISH_4 >= 20
+#        define BOOST_PP_ITERATION_4 20
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 21 && BOOST_PP_ITERATION_FINISH_4 >= 21
+#        define BOOST_PP_ITERATION_4 21
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 22 && BOOST_PP_ITERATION_FINISH_4 >= 22
+#        define BOOST_PP_ITERATION_4 22
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 23 && BOOST_PP_ITERATION_FINISH_4 >= 23
+#        define BOOST_PP_ITERATION_4 23
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 24 && BOOST_PP_ITERATION_FINISH_4 >= 24
+#        define BOOST_PP_ITERATION_4 24
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 25 && BOOST_PP_ITERATION_FINISH_4 >= 25
+#        define BOOST_PP_ITERATION_4 25
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 26 && BOOST_PP_ITERATION_FINISH_4 >= 26
+#        define BOOST_PP_ITERATION_4 26
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 27 && BOOST_PP_ITERATION_FINISH_4 >= 27
+#        define BOOST_PP_ITERATION_4 27
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 28 && BOOST_PP_ITERATION_FINISH_4 >= 28
+#        define BOOST_PP_ITERATION_4 28
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 29 && BOOST_PP_ITERATION_FINISH_4 >= 29
+#        define BOOST_PP_ITERATION_4 29
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 30 && BOOST_PP_ITERATION_FINISH_4 >= 30
+#        define BOOST_PP_ITERATION_4 30
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 31 && BOOST_PP_ITERATION_FINISH_4 >= 31
+#        define BOOST_PP_ITERATION_4 31
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 32 && BOOST_PP_ITERATION_FINISH_4 >= 32
+#        define BOOST_PP_ITERATION_4 32
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 33 && BOOST_PP_ITERATION_FINISH_4 >= 33
+#        define BOOST_PP_ITERATION_4 33
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 34 && BOOST_PP_ITERATION_FINISH_4 >= 34
+#        define BOOST_PP_ITERATION_4 34
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 35 && BOOST_PP_ITERATION_FINISH_4 >= 35
+#        define BOOST_PP_ITERATION_4 35
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 36 && BOOST_PP_ITERATION_FINISH_4 >= 36
+#        define BOOST_PP_ITERATION_4 36
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 37 && BOOST_PP_ITERATION_FINISH_4 >= 37
+#        define BOOST_PP_ITERATION_4 37
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 38 && BOOST_PP_ITERATION_FINISH_4 >= 38
+#        define BOOST_PP_ITERATION_4 38
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 39 && BOOST_PP_ITERATION_FINISH_4 >= 39
+#        define BOOST_PP_ITERATION_4 39
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 40 && BOOST_PP_ITERATION_FINISH_4 >= 40
+#        define BOOST_PP_ITERATION_4 40
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 41 && BOOST_PP_ITERATION_FINISH_4 >= 41
+#        define BOOST_PP_ITERATION_4 41
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 42 && BOOST_PP_ITERATION_FINISH_4 >= 42
+#        define BOOST_PP_ITERATION_4 42
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 43 && BOOST_PP_ITERATION_FINISH_4 >= 43
+#        define BOOST_PP_ITERATION_4 43
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 44 && BOOST_PP_ITERATION_FINISH_4 >= 44
+#        define BOOST_PP_ITERATION_4 44
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 45 && BOOST_PP_ITERATION_FINISH_4 >= 45
+#        define BOOST_PP_ITERATION_4 45
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 46 && BOOST_PP_ITERATION_FINISH_4 >= 46
+#        define BOOST_PP_ITERATION_4 46
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 47 && BOOST_PP_ITERATION_FINISH_4 >= 47
+#        define BOOST_PP_ITERATION_4 47
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 48 && BOOST_PP_ITERATION_FINISH_4 >= 48
+#        define BOOST_PP_ITERATION_4 48
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 49 && BOOST_PP_ITERATION_FINISH_4 >= 49
+#        define BOOST_PP_ITERATION_4 49
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 50 && BOOST_PP_ITERATION_FINISH_4 >= 50
+#        define BOOST_PP_ITERATION_4 50
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 51 && BOOST_PP_ITERATION_FINISH_4 >= 51
+#        define BOOST_PP_ITERATION_4 51
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 52 && BOOST_PP_ITERATION_FINISH_4 >= 52
+#        define BOOST_PP_ITERATION_4 52
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 53 && BOOST_PP_ITERATION_FINISH_4 >= 53
+#        define BOOST_PP_ITERATION_4 53
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 54 && BOOST_PP_ITERATION_FINISH_4 >= 54
+#        define BOOST_PP_ITERATION_4 54
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 55 && BOOST_PP_ITERATION_FINISH_4 >= 55
+#        define BOOST_PP_ITERATION_4 55
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 56 && BOOST_PP_ITERATION_FINISH_4 >= 56
+#        define BOOST_PP_ITERATION_4 56
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 57 && BOOST_PP_ITERATION_FINISH_4 >= 57
+#        define BOOST_PP_ITERATION_4 57
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 58 && BOOST_PP_ITERATION_FINISH_4 >= 58
+#        define BOOST_PP_ITERATION_4 58
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 59 && BOOST_PP_ITERATION_FINISH_4 >= 59
+#        define BOOST_PP_ITERATION_4 59
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 60 && BOOST_PP_ITERATION_FINISH_4 >= 60
+#        define BOOST_PP_ITERATION_4 60
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 61 && BOOST_PP_ITERATION_FINISH_4 >= 61
+#        define BOOST_PP_ITERATION_4 61
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 62 && BOOST_PP_ITERATION_FINISH_4 >= 62
+#        define BOOST_PP_ITERATION_4 62
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 63 && BOOST_PP_ITERATION_FINISH_4 >= 63
+#        define BOOST_PP_ITERATION_4 63
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 64 && BOOST_PP_ITERATION_FINISH_4 >= 64
+#        define BOOST_PP_ITERATION_4 64
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 65 && BOOST_PP_ITERATION_FINISH_4 >= 65
+#        define BOOST_PP_ITERATION_4 65
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 66 && BOOST_PP_ITERATION_FINISH_4 >= 66
+#        define BOOST_PP_ITERATION_4 66
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 67 && BOOST_PP_ITERATION_FINISH_4 >= 67
+#        define BOOST_PP_ITERATION_4 67
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 68 && BOOST_PP_ITERATION_FINISH_4 >= 68
+#        define BOOST_PP_ITERATION_4 68
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 69 && BOOST_PP_ITERATION_FINISH_4 >= 69
+#        define BOOST_PP_ITERATION_4 69
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 70 && BOOST_PP_ITERATION_FINISH_4 >= 70
+#        define BOOST_PP_ITERATION_4 70
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 71 && BOOST_PP_ITERATION_FINISH_4 >= 71
+#        define BOOST_PP_ITERATION_4 71
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 72 && BOOST_PP_ITERATION_FINISH_4 >= 72
+#        define BOOST_PP_ITERATION_4 72
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 73 && BOOST_PP_ITERATION_FINISH_4 >= 73
+#        define BOOST_PP_ITERATION_4 73
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 74 && BOOST_PP_ITERATION_FINISH_4 >= 74
+#        define BOOST_PP_ITERATION_4 74
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 75 && BOOST_PP_ITERATION_FINISH_4 >= 75
+#        define BOOST_PP_ITERATION_4 75
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 76 && BOOST_PP_ITERATION_FINISH_4 >= 76
+#        define BOOST_PP_ITERATION_4 76
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 77 && BOOST_PP_ITERATION_FINISH_4 >= 77
+#        define BOOST_PP_ITERATION_4 77
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 78 && BOOST_PP_ITERATION_FINISH_4 >= 78
+#        define BOOST_PP_ITERATION_4 78
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 79 && BOOST_PP_ITERATION_FINISH_4 >= 79
+#        define BOOST_PP_ITERATION_4 79
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 80 && BOOST_PP_ITERATION_FINISH_4 >= 80
+#        define BOOST_PP_ITERATION_4 80
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 81 && BOOST_PP_ITERATION_FINISH_4 >= 81
+#        define BOOST_PP_ITERATION_4 81
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 82 && BOOST_PP_ITERATION_FINISH_4 >= 82
+#        define BOOST_PP_ITERATION_4 82
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 83 && BOOST_PP_ITERATION_FINISH_4 >= 83
+#        define BOOST_PP_ITERATION_4 83
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 84 && BOOST_PP_ITERATION_FINISH_4 >= 84
+#        define BOOST_PP_ITERATION_4 84
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 85 && BOOST_PP_ITERATION_FINISH_4 >= 85
+#        define BOOST_PP_ITERATION_4 85
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 86 && BOOST_PP_ITERATION_FINISH_4 >= 86
+#        define BOOST_PP_ITERATION_4 86
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 87 && BOOST_PP_ITERATION_FINISH_4 >= 87
+#        define BOOST_PP_ITERATION_4 87
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 88 && BOOST_PP_ITERATION_FINISH_4 >= 88
+#        define BOOST_PP_ITERATION_4 88
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 89 && BOOST_PP_ITERATION_FINISH_4 >= 89
+#        define BOOST_PP_ITERATION_4 89
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 90 && BOOST_PP_ITERATION_FINISH_4 >= 90
+#        define BOOST_PP_ITERATION_4 90
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 91 && BOOST_PP_ITERATION_FINISH_4 >= 91
+#        define BOOST_PP_ITERATION_4 91
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 92 && BOOST_PP_ITERATION_FINISH_4 >= 92
+#        define BOOST_PP_ITERATION_4 92
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 93 && BOOST_PP_ITERATION_FINISH_4 >= 93
+#        define BOOST_PP_ITERATION_4 93
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 94 && BOOST_PP_ITERATION_FINISH_4 >= 94
+#        define BOOST_PP_ITERATION_4 94
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 95 && BOOST_PP_ITERATION_FINISH_4 >= 95
+#        define BOOST_PP_ITERATION_4 95
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 96 && BOOST_PP_ITERATION_FINISH_4 >= 96
+#        define BOOST_PP_ITERATION_4 96
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 97 && BOOST_PP_ITERATION_FINISH_4 >= 97
+#        define BOOST_PP_ITERATION_4 97
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 98 && BOOST_PP_ITERATION_FINISH_4 >= 98
+#        define BOOST_PP_ITERATION_4 98
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 99 && BOOST_PP_ITERATION_FINISH_4 >= 99
+#        define BOOST_PP_ITERATION_4 99
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 100 && BOOST_PP_ITERATION_FINISH_4 >= 100
+#        define BOOST_PP_ITERATION_4 100
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 101 && BOOST_PP_ITERATION_FINISH_4 >= 101
+#        define BOOST_PP_ITERATION_4 101
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 102 && BOOST_PP_ITERATION_FINISH_4 >= 102
+#        define BOOST_PP_ITERATION_4 102
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 103 && BOOST_PP_ITERATION_FINISH_4 >= 103
+#        define BOOST_PP_ITERATION_4 103
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 104 && BOOST_PP_ITERATION_FINISH_4 >= 104
+#        define BOOST_PP_ITERATION_4 104
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 105 && BOOST_PP_ITERATION_FINISH_4 >= 105
+#        define BOOST_PP_ITERATION_4 105
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 106 && BOOST_PP_ITERATION_FINISH_4 >= 106
+#        define BOOST_PP_ITERATION_4 106
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 107 && BOOST_PP_ITERATION_FINISH_4 >= 107
+#        define BOOST_PP_ITERATION_4 107
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 108 && BOOST_PP_ITERATION_FINISH_4 >= 108
+#        define BOOST_PP_ITERATION_4 108
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 109 && BOOST_PP_ITERATION_FINISH_4 >= 109
+#        define BOOST_PP_ITERATION_4 109
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 110 && BOOST_PP_ITERATION_FINISH_4 >= 110
+#        define BOOST_PP_ITERATION_4 110
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 111 && BOOST_PP_ITERATION_FINISH_4 >= 111
+#        define BOOST_PP_ITERATION_4 111
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 112 && BOOST_PP_ITERATION_FINISH_4 >= 112
+#        define BOOST_PP_ITERATION_4 112
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 113 && BOOST_PP_ITERATION_FINISH_4 >= 113
+#        define BOOST_PP_ITERATION_4 113
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 114 && BOOST_PP_ITERATION_FINISH_4 >= 114
+#        define BOOST_PP_ITERATION_4 114
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 115 && BOOST_PP_ITERATION_FINISH_4 >= 115
+#        define BOOST_PP_ITERATION_4 115
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 116 && BOOST_PP_ITERATION_FINISH_4 >= 116
+#        define BOOST_PP_ITERATION_4 116
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 117 && BOOST_PP_ITERATION_FINISH_4 >= 117
+#        define BOOST_PP_ITERATION_4 117
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 118 && BOOST_PP_ITERATION_FINISH_4 >= 118
+#        define BOOST_PP_ITERATION_4 118
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 119 && BOOST_PP_ITERATION_FINISH_4 >= 119
+#        define BOOST_PP_ITERATION_4 119
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 120 && BOOST_PP_ITERATION_FINISH_4 >= 120
+#        define BOOST_PP_ITERATION_4 120
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 121 && BOOST_PP_ITERATION_FINISH_4 >= 121
+#        define BOOST_PP_ITERATION_4 121
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 122 && BOOST_PP_ITERATION_FINISH_4 >= 122
+#        define BOOST_PP_ITERATION_4 122
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 123 && BOOST_PP_ITERATION_FINISH_4 >= 123
+#        define BOOST_PP_ITERATION_4 123
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 124 && BOOST_PP_ITERATION_FINISH_4 >= 124
+#        define BOOST_PP_ITERATION_4 124
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 125 && BOOST_PP_ITERATION_FINISH_4 >= 125
+#        define BOOST_PP_ITERATION_4 125
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 126 && BOOST_PP_ITERATION_FINISH_4 >= 126
+#        define BOOST_PP_ITERATION_4 126
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 127 && BOOST_PP_ITERATION_FINISH_4 >= 127
+#        define BOOST_PP_ITERATION_4 127
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 128 && BOOST_PP_ITERATION_FINISH_4 >= 128
+#        define BOOST_PP_ITERATION_4 128
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 129 && BOOST_PP_ITERATION_FINISH_4 >= 129
+#        define BOOST_PP_ITERATION_4 129
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 130 && BOOST_PP_ITERATION_FINISH_4 >= 130
+#        define BOOST_PP_ITERATION_4 130
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 131 && BOOST_PP_ITERATION_FINISH_4 >= 131
+#        define BOOST_PP_ITERATION_4 131
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 132 && BOOST_PP_ITERATION_FINISH_4 >= 132
+#        define BOOST_PP_ITERATION_4 132
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 133 && BOOST_PP_ITERATION_FINISH_4 >= 133
+#        define BOOST_PP_ITERATION_4 133
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 134 && BOOST_PP_ITERATION_FINISH_4 >= 134
+#        define BOOST_PP_ITERATION_4 134
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 135 && BOOST_PP_ITERATION_FINISH_4 >= 135
+#        define BOOST_PP_ITERATION_4 135
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 136 && BOOST_PP_ITERATION_FINISH_4 >= 136
+#        define BOOST_PP_ITERATION_4 136
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 137 && BOOST_PP_ITERATION_FINISH_4 >= 137
+#        define BOOST_PP_ITERATION_4 137
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 138 && BOOST_PP_ITERATION_FINISH_4 >= 138
+#        define BOOST_PP_ITERATION_4 138
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 139 && BOOST_PP_ITERATION_FINISH_4 >= 139
+#        define BOOST_PP_ITERATION_4 139
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 140 && BOOST_PP_ITERATION_FINISH_4 >= 140
+#        define BOOST_PP_ITERATION_4 140
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 141 && BOOST_PP_ITERATION_FINISH_4 >= 141
+#        define BOOST_PP_ITERATION_4 141
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 142 && BOOST_PP_ITERATION_FINISH_4 >= 142
+#        define BOOST_PP_ITERATION_4 142
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 143 && BOOST_PP_ITERATION_FINISH_4 >= 143
+#        define BOOST_PP_ITERATION_4 143
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 144 && BOOST_PP_ITERATION_FINISH_4 >= 144
+#        define BOOST_PP_ITERATION_4 144
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 145 && BOOST_PP_ITERATION_FINISH_4 >= 145
+#        define BOOST_PP_ITERATION_4 145
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 146 && BOOST_PP_ITERATION_FINISH_4 >= 146
+#        define BOOST_PP_ITERATION_4 146
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 147 && BOOST_PP_ITERATION_FINISH_4 >= 147
+#        define BOOST_PP_ITERATION_4 147
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 148 && BOOST_PP_ITERATION_FINISH_4 >= 148
+#        define BOOST_PP_ITERATION_4 148
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 149 && BOOST_PP_ITERATION_FINISH_4 >= 149
+#        define BOOST_PP_ITERATION_4 149
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 150 && BOOST_PP_ITERATION_FINISH_4 >= 150
+#        define BOOST_PP_ITERATION_4 150
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 151 && BOOST_PP_ITERATION_FINISH_4 >= 151
+#        define BOOST_PP_ITERATION_4 151
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 152 && BOOST_PP_ITERATION_FINISH_4 >= 152
+#        define BOOST_PP_ITERATION_4 152
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 153 && BOOST_PP_ITERATION_FINISH_4 >= 153
+#        define BOOST_PP_ITERATION_4 153
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 154 && BOOST_PP_ITERATION_FINISH_4 >= 154
+#        define BOOST_PP_ITERATION_4 154
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 155 && BOOST_PP_ITERATION_FINISH_4 >= 155
+#        define BOOST_PP_ITERATION_4 155
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 156 && BOOST_PP_ITERATION_FINISH_4 >= 156
+#        define BOOST_PP_ITERATION_4 156
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 157 && BOOST_PP_ITERATION_FINISH_4 >= 157
+#        define BOOST_PP_ITERATION_4 157
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 158 && BOOST_PP_ITERATION_FINISH_4 >= 158
+#        define BOOST_PP_ITERATION_4 158
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 159 && BOOST_PP_ITERATION_FINISH_4 >= 159
+#        define BOOST_PP_ITERATION_4 159
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 160 && BOOST_PP_ITERATION_FINISH_4 >= 160
+#        define BOOST_PP_ITERATION_4 160
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 161 && BOOST_PP_ITERATION_FINISH_4 >= 161
+#        define BOOST_PP_ITERATION_4 161
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 162 && BOOST_PP_ITERATION_FINISH_4 >= 162
+#        define BOOST_PP_ITERATION_4 162
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 163 && BOOST_PP_ITERATION_FINISH_4 >= 163
+#        define BOOST_PP_ITERATION_4 163
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 164 && BOOST_PP_ITERATION_FINISH_4 >= 164
+#        define BOOST_PP_ITERATION_4 164
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 165 && BOOST_PP_ITERATION_FINISH_4 >= 165
+#        define BOOST_PP_ITERATION_4 165
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 166 && BOOST_PP_ITERATION_FINISH_4 >= 166
+#        define BOOST_PP_ITERATION_4 166
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 167 && BOOST_PP_ITERATION_FINISH_4 >= 167
+#        define BOOST_PP_ITERATION_4 167
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 168 && BOOST_PP_ITERATION_FINISH_4 >= 168
+#        define BOOST_PP_ITERATION_4 168
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 169 && BOOST_PP_ITERATION_FINISH_4 >= 169
+#        define BOOST_PP_ITERATION_4 169
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 170 && BOOST_PP_ITERATION_FINISH_4 >= 170
+#        define BOOST_PP_ITERATION_4 170
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 171 && BOOST_PP_ITERATION_FINISH_4 >= 171
+#        define BOOST_PP_ITERATION_4 171
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 172 && BOOST_PP_ITERATION_FINISH_4 >= 172
+#        define BOOST_PP_ITERATION_4 172
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 173 && BOOST_PP_ITERATION_FINISH_4 >= 173
+#        define BOOST_PP_ITERATION_4 173
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 174 && BOOST_PP_ITERATION_FINISH_4 >= 174
+#        define BOOST_PP_ITERATION_4 174
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 175 && BOOST_PP_ITERATION_FINISH_4 >= 175
+#        define BOOST_PP_ITERATION_4 175
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 176 && BOOST_PP_ITERATION_FINISH_4 >= 176
+#        define BOOST_PP_ITERATION_4 176
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 177 && BOOST_PP_ITERATION_FINISH_4 >= 177
+#        define BOOST_PP_ITERATION_4 177
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 178 && BOOST_PP_ITERATION_FINISH_4 >= 178
+#        define BOOST_PP_ITERATION_4 178
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 179 && BOOST_PP_ITERATION_FINISH_4 >= 179
+#        define BOOST_PP_ITERATION_4 179
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 180 && BOOST_PP_ITERATION_FINISH_4 >= 180
+#        define BOOST_PP_ITERATION_4 180
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 181 && BOOST_PP_ITERATION_FINISH_4 >= 181
+#        define BOOST_PP_ITERATION_4 181
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 182 && BOOST_PP_ITERATION_FINISH_4 >= 182
+#        define BOOST_PP_ITERATION_4 182
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 183 && BOOST_PP_ITERATION_FINISH_4 >= 183
+#        define BOOST_PP_ITERATION_4 183
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 184 && BOOST_PP_ITERATION_FINISH_4 >= 184
+#        define BOOST_PP_ITERATION_4 184
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 185 && BOOST_PP_ITERATION_FINISH_4 >= 185
+#        define BOOST_PP_ITERATION_4 185
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 186 && BOOST_PP_ITERATION_FINISH_4 >= 186
+#        define BOOST_PP_ITERATION_4 186
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 187 && BOOST_PP_ITERATION_FINISH_4 >= 187
+#        define BOOST_PP_ITERATION_4 187
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 188 && BOOST_PP_ITERATION_FINISH_4 >= 188
+#        define BOOST_PP_ITERATION_4 188
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 189 && BOOST_PP_ITERATION_FINISH_4 >= 189
+#        define BOOST_PP_ITERATION_4 189
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 190 && BOOST_PP_ITERATION_FINISH_4 >= 190
+#        define BOOST_PP_ITERATION_4 190
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 191 && BOOST_PP_ITERATION_FINISH_4 >= 191
+#        define BOOST_PP_ITERATION_4 191
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 192 && BOOST_PP_ITERATION_FINISH_4 >= 192
+#        define BOOST_PP_ITERATION_4 192
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 193 && BOOST_PP_ITERATION_FINISH_4 >= 193
+#        define BOOST_PP_ITERATION_4 193
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 194 && BOOST_PP_ITERATION_FINISH_4 >= 194
+#        define BOOST_PP_ITERATION_4 194
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 195 && BOOST_PP_ITERATION_FINISH_4 >= 195
+#        define BOOST_PP_ITERATION_4 195
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 196 && BOOST_PP_ITERATION_FINISH_4 >= 196
+#        define BOOST_PP_ITERATION_4 196
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 197 && BOOST_PP_ITERATION_FINISH_4 >= 197
+#        define BOOST_PP_ITERATION_4 197
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 198 && BOOST_PP_ITERATION_FINISH_4 >= 198
+#        define BOOST_PP_ITERATION_4 198
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 199 && BOOST_PP_ITERATION_FINISH_4 >= 199
+#        define BOOST_PP_ITERATION_4 199
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 200 && BOOST_PP_ITERATION_FINISH_4 >= 200
+#        define BOOST_PP_ITERATION_4 200
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 201 && BOOST_PP_ITERATION_FINISH_4 >= 201
+#        define BOOST_PP_ITERATION_4 201
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 202 && BOOST_PP_ITERATION_FINISH_4 >= 202
+#        define BOOST_PP_ITERATION_4 202
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 203 && BOOST_PP_ITERATION_FINISH_4 >= 203
+#        define BOOST_PP_ITERATION_4 203
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 204 && BOOST_PP_ITERATION_FINISH_4 >= 204
+#        define BOOST_PP_ITERATION_4 204
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 205 && BOOST_PP_ITERATION_FINISH_4 >= 205
+#        define BOOST_PP_ITERATION_4 205
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 206 && BOOST_PP_ITERATION_FINISH_4 >= 206
+#        define BOOST_PP_ITERATION_4 206
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 207 && BOOST_PP_ITERATION_FINISH_4 >= 207
+#        define BOOST_PP_ITERATION_4 207
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 208 && BOOST_PP_ITERATION_FINISH_4 >= 208
+#        define BOOST_PP_ITERATION_4 208
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 209 && BOOST_PP_ITERATION_FINISH_4 >= 209
+#        define BOOST_PP_ITERATION_4 209
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 210 && BOOST_PP_ITERATION_FINISH_4 >= 210
+#        define BOOST_PP_ITERATION_4 210
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 211 && BOOST_PP_ITERATION_FINISH_4 >= 211
+#        define BOOST_PP_ITERATION_4 211
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 212 && BOOST_PP_ITERATION_FINISH_4 >= 212
+#        define BOOST_PP_ITERATION_4 212
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 213 && BOOST_PP_ITERATION_FINISH_4 >= 213
+#        define BOOST_PP_ITERATION_4 213
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 214 && BOOST_PP_ITERATION_FINISH_4 >= 214
+#        define BOOST_PP_ITERATION_4 214
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 215 && BOOST_PP_ITERATION_FINISH_4 >= 215
+#        define BOOST_PP_ITERATION_4 215
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 216 && BOOST_PP_ITERATION_FINISH_4 >= 216
+#        define BOOST_PP_ITERATION_4 216
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 217 && BOOST_PP_ITERATION_FINISH_4 >= 217
+#        define BOOST_PP_ITERATION_4 217
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 218 && BOOST_PP_ITERATION_FINISH_4 >= 218
+#        define BOOST_PP_ITERATION_4 218
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 219 && BOOST_PP_ITERATION_FINISH_4 >= 219
+#        define BOOST_PP_ITERATION_4 219
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 220 && BOOST_PP_ITERATION_FINISH_4 >= 220
+#        define BOOST_PP_ITERATION_4 220
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 221 && BOOST_PP_ITERATION_FINISH_4 >= 221
+#        define BOOST_PP_ITERATION_4 221
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 222 && BOOST_PP_ITERATION_FINISH_4 >= 222
+#        define BOOST_PP_ITERATION_4 222
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 223 && BOOST_PP_ITERATION_FINISH_4 >= 223
+#        define BOOST_PP_ITERATION_4 223
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 224 && BOOST_PP_ITERATION_FINISH_4 >= 224
+#        define BOOST_PP_ITERATION_4 224
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 225 && BOOST_PP_ITERATION_FINISH_4 >= 225
+#        define BOOST_PP_ITERATION_4 225
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 226 && BOOST_PP_ITERATION_FINISH_4 >= 226
+#        define BOOST_PP_ITERATION_4 226
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 227 && BOOST_PP_ITERATION_FINISH_4 >= 227
+#        define BOOST_PP_ITERATION_4 227
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 228 && BOOST_PP_ITERATION_FINISH_4 >= 228
+#        define BOOST_PP_ITERATION_4 228
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 229 && BOOST_PP_ITERATION_FINISH_4 >= 229
+#        define BOOST_PP_ITERATION_4 229
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 230 && BOOST_PP_ITERATION_FINISH_4 >= 230
+#        define BOOST_PP_ITERATION_4 230
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 231 && BOOST_PP_ITERATION_FINISH_4 >= 231
+#        define BOOST_PP_ITERATION_4 231
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 232 && BOOST_PP_ITERATION_FINISH_4 >= 232
+#        define BOOST_PP_ITERATION_4 232
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 233 && BOOST_PP_ITERATION_FINISH_4 >= 233
+#        define BOOST_PP_ITERATION_4 233
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 234 && BOOST_PP_ITERATION_FINISH_4 >= 234
+#        define BOOST_PP_ITERATION_4 234
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 235 && BOOST_PP_ITERATION_FINISH_4 >= 235
+#        define BOOST_PP_ITERATION_4 235
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 236 && BOOST_PP_ITERATION_FINISH_4 >= 236
+#        define BOOST_PP_ITERATION_4 236
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 237 && BOOST_PP_ITERATION_FINISH_4 >= 237
+#        define BOOST_PP_ITERATION_4 237
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 238 && BOOST_PP_ITERATION_FINISH_4 >= 238
+#        define BOOST_PP_ITERATION_4 238
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 239 && BOOST_PP_ITERATION_FINISH_4 >= 239
+#        define BOOST_PP_ITERATION_4 239
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 240 && BOOST_PP_ITERATION_FINISH_4 >= 240
+#        define BOOST_PP_ITERATION_4 240
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 241 && BOOST_PP_ITERATION_FINISH_4 >= 241
+#        define BOOST_PP_ITERATION_4 241
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 242 && BOOST_PP_ITERATION_FINISH_4 >= 242
+#        define BOOST_PP_ITERATION_4 242
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 243 && BOOST_PP_ITERATION_FINISH_4 >= 243
+#        define BOOST_PP_ITERATION_4 243
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 244 && BOOST_PP_ITERATION_FINISH_4 >= 244
+#        define BOOST_PP_ITERATION_4 244
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 245 && BOOST_PP_ITERATION_FINISH_4 >= 245
+#        define BOOST_PP_ITERATION_4 245
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 246 && BOOST_PP_ITERATION_FINISH_4 >= 246
+#        define BOOST_PP_ITERATION_4 246
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 247 && BOOST_PP_ITERATION_FINISH_4 >= 247
+#        define BOOST_PP_ITERATION_4 247
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 248 && BOOST_PP_ITERATION_FINISH_4 >= 248
+#        define BOOST_PP_ITERATION_4 248
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 249 && BOOST_PP_ITERATION_FINISH_4 >= 249
+#        define BOOST_PP_ITERATION_4 249
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 250 && BOOST_PP_ITERATION_FINISH_4 >= 250
+#        define BOOST_PP_ITERATION_4 250
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 251 && BOOST_PP_ITERATION_FINISH_4 >= 251
+#        define BOOST_PP_ITERATION_4 251
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 252 && BOOST_PP_ITERATION_FINISH_4 >= 252
+#        define BOOST_PP_ITERATION_4 252
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 253 && BOOST_PP_ITERATION_FINISH_4 >= 253
+#        define BOOST_PP_ITERATION_4 253
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 254 && BOOST_PP_ITERATION_FINISH_4 >= 254
+#        define BOOST_PP_ITERATION_4 254
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 255 && BOOST_PP_ITERATION_FINISH_4 >= 255
+#        define BOOST_PP_ITERATION_4 255
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+#    if BOOST_PP_ITERATION_START_4 <= 256 && BOOST_PP_ITERATION_FINISH_4 >= 256
+#        define BOOST_PP_ITERATION_4 256
+#        include BOOST_PP_FILENAME_4
+#        undef BOOST_PP_ITERATION_4
+#    endif
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 3
+#
+# undef BOOST_PP_ITERATION_START_4
+# undef BOOST_PP_ITERATION_FINISH_4
+# undef BOOST_PP_FILENAME_4
+#
+# undef BOOST_PP_ITERATION_FLAGS_4
+# undef BOOST_PP_ITERATION_PARAMS_4
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward5.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward5.hpp
new file mode 100644
index 0000000..7617607
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/forward5.hpp
@@ -0,0 +1,1338 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if defined(BOOST_PP_ITERATION_LIMITS)
+#    if !defined(BOOST_PP_FILENAME_5)
+#        error BOOST_PP_ERROR:  depth #5 filename is not defined
+#    endif
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)
+#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>
+#    define BOOST_PP_ITERATION_FLAGS_5() 0
+#    undef BOOST_PP_ITERATION_LIMITS
+# elif defined(BOOST_PP_ITERATION_PARAMS_5)
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_5)
+#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>
+#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_5)
+#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>
+#    define BOOST_PP_FILENAME_5 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_5)
+#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_5) >= 4
+#        define BOOST_PP_ITERATION_FLAGS_5() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_5)
+#    else
+#        define BOOST_PP_ITERATION_FLAGS_5() 0
+#    endif
+# else
+#    error BOOST_PP_ERROR:  depth #5 iteration boundaries or filename not defined
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 5
+#
+# if (BOOST_PP_ITERATION_START_5) > (BOOST_PP_ITERATION_FINISH_5)
+#    include <boost/preprocessor/iteration/detail/iter/reverse5.hpp>
+# else
+#    if BOOST_PP_ITERATION_START_5 <= 0 && BOOST_PP_ITERATION_FINISH_5 >= 0
+#        define BOOST_PP_ITERATION_5 0
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 1 && BOOST_PP_ITERATION_FINISH_5 >= 1
+#        define BOOST_PP_ITERATION_5 1
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 2 && BOOST_PP_ITERATION_FINISH_5 >= 2
+#        define BOOST_PP_ITERATION_5 2
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 3 && BOOST_PP_ITERATION_FINISH_5 >= 3
+#        define BOOST_PP_ITERATION_5 3
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 4 && BOOST_PP_ITERATION_FINISH_5 >= 4
+#        define BOOST_PP_ITERATION_5 4
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 5 && BOOST_PP_ITERATION_FINISH_5 >= 5
+#        define BOOST_PP_ITERATION_5 5
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 6 && BOOST_PP_ITERATION_FINISH_5 >= 6
+#        define BOOST_PP_ITERATION_5 6
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 7 && BOOST_PP_ITERATION_FINISH_5 >= 7
+#        define BOOST_PP_ITERATION_5 7
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 8 && BOOST_PP_ITERATION_FINISH_5 >= 8
+#        define BOOST_PP_ITERATION_5 8
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 9 && BOOST_PP_ITERATION_FINISH_5 >= 9
+#        define BOOST_PP_ITERATION_5 9
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 10 && BOOST_PP_ITERATION_FINISH_5 >= 10
+#        define BOOST_PP_ITERATION_5 10
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 11 && BOOST_PP_ITERATION_FINISH_5 >= 11
+#        define BOOST_PP_ITERATION_5 11
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 12 && BOOST_PP_ITERATION_FINISH_5 >= 12
+#        define BOOST_PP_ITERATION_5 12
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 13 && BOOST_PP_ITERATION_FINISH_5 >= 13
+#        define BOOST_PP_ITERATION_5 13
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 14 && BOOST_PP_ITERATION_FINISH_5 >= 14
+#        define BOOST_PP_ITERATION_5 14
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 15 && BOOST_PP_ITERATION_FINISH_5 >= 15
+#        define BOOST_PP_ITERATION_5 15
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 16 && BOOST_PP_ITERATION_FINISH_5 >= 16
+#        define BOOST_PP_ITERATION_5 16
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 17 && BOOST_PP_ITERATION_FINISH_5 >= 17
+#        define BOOST_PP_ITERATION_5 17
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 18 && BOOST_PP_ITERATION_FINISH_5 >= 18
+#        define BOOST_PP_ITERATION_5 18
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 19 && BOOST_PP_ITERATION_FINISH_5 >= 19
+#        define BOOST_PP_ITERATION_5 19
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 20 && BOOST_PP_ITERATION_FINISH_5 >= 20
+#        define BOOST_PP_ITERATION_5 20
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 21 && BOOST_PP_ITERATION_FINISH_5 >= 21
+#        define BOOST_PP_ITERATION_5 21
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 22 && BOOST_PP_ITERATION_FINISH_5 >= 22
+#        define BOOST_PP_ITERATION_5 22
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 23 && BOOST_PP_ITERATION_FINISH_5 >= 23
+#        define BOOST_PP_ITERATION_5 23
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 24 && BOOST_PP_ITERATION_FINISH_5 >= 24
+#        define BOOST_PP_ITERATION_5 24
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 25 && BOOST_PP_ITERATION_FINISH_5 >= 25
+#        define BOOST_PP_ITERATION_5 25
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 26 && BOOST_PP_ITERATION_FINISH_5 >= 26
+#        define BOOST_PP_ITERATION_5 26
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 27 && BOOST_PP_ITERATION_FINISH_5 >= 27
+#        define BOOST_PP_ITERATION_5 27
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 28 && BOOST_PP_ITERATION_FINISH_5 >= 28
+#        define BOOST_PP_ITERATION_5 28
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 29 && BOOST_PP_ITERATION_FINISH_5 >= 29
+#        define BOOST_PP_ITERATION_5 29
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 30 && BOOST_PP_ITERATION_FINISH_5 >= 30
+#        define BOOST_PP_ITERATION_5 30
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 31 && BOOST_PP_ITERATION_FINISH_5 >= 31
+#        define BOOST_PP_ITERATION_5 31
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 32 && BOOST_PP_ITERATION_FINISH_5 >= 32
+#        define BOOST_PP_ITERATION_5 32
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 33 && BOOST_PP_ITERATION_FINISH_5 >= 33
+#        define BOOST_PP_ITERATION_5 33
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 34 && BOOST_PP_ITERATION_FINISH_5 >= 34
+#        define BOOST_PP_ITERATION_5 34
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 35 && BOOST_PP_ITERATION_FINISH_5 >= 35
+#        define BOOST_PP_ITERATION_5 35
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 36 && BOOST_PP_ITERATION_FINISH_5 >= 36
+#        define BOOST_PP_ITERATION_5 36
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 37 && BOOST_PP_ITERATION_FINISH_5 >= 37
+#        define BOOST_PP_ITERATION_5 37
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 38 && BOOST_PP_ITERATION_FINISH_5 >= 38
+#        define BOOST_PP_ITERATION_5 38
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 39 && BOOST_PP_ITERATION_FINISH_5 >= 39
+#        define BOOST_PP_ITERATION_5 39
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 40 && BOOST_PP_ITERATION_FINISH_5 >= 40
+#        define BOOST_PP_ITERATION_5 40
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 41 && BOOST_PP_ITERATION_FINISH_5 >= 41
+#        define BOOST_PP_ITERATION_5 41
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 42 && BOOST_PP_ITERATION_FINISH_5 >= 42
+#        define BOOST_PP_ITERATION_5 42
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 43 && BOOST_PP_ITERATION_FINISH_5 >= 43
+#        define BOOST_PP_ITERATION_5 43
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 44 && BOOST_PP_ITERATION_FINISH_5 >= 44
+#        define BOOST_PP_ITERATION_5 44
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 45 && BOOST_PP_ITERATION_FINISH_5 >= 45
+#        define BOOST_PP_ITERATION_5 45
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 46 && BOOST_PP_ITERATION_FINISH_5 >= 46
+#        define BOOST_PP_ITERATION_5 46
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 47 && BOOST_PP_ITERATION_FINISH_5 >= 47
+#        define BOOST_PP_ITERATION_5 47
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 48 && BOOST_PP_ITERATION_FINISH_5 >= 48
+#        define BOOST_PP_ITERATION_5 48
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 49 && BOOST_PP_ITERATION_FINISH_5 >= 49
+#        define BOOST_PP_ITERATION_5 49
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 50 && BOOST_PP_ITERATION_FINISH_5 >= 50
+#        define BOOST_PP_ITERATION_5 50
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 51 && BOOST_PP_ITERATION_FINISH_5 >= 51
+#        define BOOST_PP_ITERATION_5 51
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 52 && BOOST_PP_ITERATION_FINISH_5 >= 52
+#        define BOOST_PP_ITERATION_5 52
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 53 && BOOST_PP_ITERATION_FINISH_5 >= 53
+#        define BOOST_PP_ITERATION_5 53
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 54 && BOOST_PP_ITERATION_FINISH_5 >= 54
+#        define BOOST_PP_ITERATION_5 54
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 55 && BOOST_PP_ITERATION_FINISH_5 >= 55
+#        define BOOST_PP_ITERATION_5 55
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 56 && BOOST_PP_ITERATION_FINISH_5 >= 56
+#        define BOOST_PP_ITERATION_5 56
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 57 && BOOST_PP_ITERATION_FINISH_5 >= 57
+#        define BOOST_PP_ITERATION_5 57
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 58 && BOOST_PP_ITERATION_FINISH_5 >= 58
+#        define BOOST_PP_ITERATION_5 58
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 59 && BOOST_PP_ITERATION_FINISH_5 >= 59
+#        define BOOST_PP_ITERATION_5 59
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 60 && BOOST_PP_ITERATION_FINISH_5 >= 60
+#        define BOOST_PP_ITERATION_5 60
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 61 && BOOST_PP_ITERATION_FINISH_5 >= 61
+#        define BOOST_PP_ITERATION_5 61
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 62 && BOOST_PP_ITERATION_FINISH_5 >= 62
+#        define BOOST_PP_ITERATION_5 62
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 63 && BOOST_PP_ITERATION_FINISH_5 >= 63
+#        define BOOST_PP_ITERATION_5 63
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 64 && BOOST_PP_ITERATION_FINISH_5 >= 64
+#        define BOOST_PP_ITERATION_5 64
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 65 && BOOST_PP_ITERATION_FINISH_5 >= 65
+#        define BOOST_PP_ITERATION_5 65
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 66 && BOOST_PP_ITERATION_FINISH_5 >= 66
+#        define BOOST_PP_ITERATION_5 66
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 67 && BOOST_PP_ITERATION_FINISH_5 >= 67
+#        define BOOST_PP_ITERATION_5 67
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 68 && BOOST_PP_ITERATION_FINISH_5 >= 68
+#        define BOOST_PP_ITERATION_5 68
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 69 && BOOST_PP_ITERATION_FINISH_5 >= 69
+#        define BOOST_PP_ITERATION_5 69
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 70 && BOOST_PP_ITERATION_FINISH_5 >= 70
+#        define BOOST_PP_ITERATION_5 70
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 71 && BOOST_PP_ITERATION_FINISH_5 >= 71
+#        define BOOST_PP_ITERATION_5 71
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 72 && BOOST_PP_ITERATION_FINISH_5 >= 72
+#        define BOOST_PP_ITERATION_5 72
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 73 && BOOST_PP_ITERATION_FINISH_5 >= 73
+#        define BOOST_PP_ITERATION_5 73
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 74 && BOOST_PP_ITERATION_FINISH_5 >= 74
+#        define BOOST_PP_ITERATION_5 74
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 75 && BOOST_PP_ITERATION_FINISH_5 >= 75
+#        define BOOST_PP_ITERATION_5 75
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 76 && BOOST_PP_ITERATION_FINISH_5 >= 76
+#        define BOOST_PP_ITERATION_5 76
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 77 && BOOST_PP_ITERATION_FINISH_5 >= 77
+#        define BOOST_PP_ITERATION_5 77
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 78 && BOOST_PP_ITERATION_FINISH_5 >= 78
+#        define BOOST_PP_ITERATION_5 78
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 79 && BOOST_PP_ITERATION_FINISH_5 >= 79
+#        define BOOST_PP_ITERATION_5 79
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 80 && BOOST_PP_ITERATION_FINISH_5 >= 80
+#        define BOOST_PP_ITERATION_5 80
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 81 && BOOST_PP_ITERATION_FINISH_5 >= 81
+#        define BOOST_PP_ITERATION_5 81
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 82 && BOOST_PP_ITERATION_FINISH_5 >= 82
+#        define BOOST_PP_ITERATION_5 82
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 83 && BOOST_PP_ITERATION_FINISH_5 >= 83
+#        define BOOST_PP_ITERATION_5 83
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 84 && BOOST_PP_ITERATION_FINISH_5 >= 84
+#        define BOOST_PP_ITERATION_5 84
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 85 && BOOST_PP_ITERATION_FINISH_5 >= 85
+#        define BOOST_PP_ITERATION_5 85
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 86 && BOOST_PP_ITERATION_FINISH_5 >= 86
+#        define BOOST_PP_ITERATION_5 86
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 87 && BOOST_PP_ITERATION_FINISH_5 >= 87
+#        define BOOST_PP_ITERATION_5 87
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 88 && BOOST_PP_ITERATION_FINISH_5 >= 88
+#        define BOOST_PP_ITERATION_5 88
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 89 && BOOST_PP_ITERATION_FINISH_5 >= 89
+#        define BOOST_PP_ITERATION_5 89
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 90 && BOOST_PP_ITERATION_FINISH_5 >= 90
+#        define BOOST_PP_ITERATION_5 90
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 91 && BOOST_PP_ITERATION_FINISH_5 >= 91
+#        define BOOST_PP_ITERATION_5 91
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 92 && BOOST_PP_ITERATION_FINISH_5 >= 92
+#        define BOOST_PP_ITERATION_5 92
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 93 && BOOST_PP_ITERATION_FINISH_5 >= 93
+#        define BOOST_PP_ITERATION_5 93
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 94 && BOOST_PP_ITERATION_FINISH_5 >= 94
+#        define BOOST_PP_ITERATION_5 94
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 95 && BOOST_PP_ITERATION_FINISH_5 >= 95
+#        define BOOST_PP_ITERATION_5 95
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 96 && BOOST_PP_ITERATION_FINISH_5 >= 96
+#        define BOOST_PP_ITERATION_5 96
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 97 && BOOST_PP_ITERATION_FINISH_5 >= 97
+#        define BOOST_PP_ITERATION_5 97
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 98 && BOOST_PP_ITERATION_FINISH_5 >= 98
+#        define BOOST_PP_ITERATION_5 98
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 99 && BOOST_PP_ITERATION_FINISH_5 >= 99
+#        define BOOST_PP_ITERATION_5 99
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 100 && BOOST_PP_ITERATION_FINISH_5 >= 100
+#        define BOOST_PP_ITERATION_5 100
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 101 && BOOST_PP_ITERATION_FINISH_5 >= 101
+#        define BOOST_PP_ITERATION_5 101
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 102 && BOOST_PP_ITERATION_FINISH_5 >= 102
+#        define BOOST_PP_ITERATION_5 102
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 103 && BOOST_PP_ITERATION_FINISH_5 >= 103
+#        define BOOST_PP_ITERATION_5 103
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 104 && BOOST_PP_ITERATION_FINISH_5 >= 104
+#        define BOOST_PP_ITERATION_5 104
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 105 && BOOST_PP_ITERATION_FINISH_5 >= 105
+#        define BOOST_PP_ITERATION_5 105
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 106 && BOOST_PP_ITERATION_FINISH_5 >= 106
+#        define BOOST_PP_ITERATION_5 106
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 107 && BOOST_PP_ITERATION_FINISH_5 >= 107
+#        define BOOST_PP_ITERATION_5 107
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 108 && BOOST_PP_ITERATION_FINISH_5 >= 108
+#        define BOOST_PP_ITERATION_5 108
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 109 && BOOST_PP_ITERATION_FINISH_5 >= 109
+#        define BOOST_PP_ITERATION_5 109
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 110 && BOOST_PP_ITERATION_FINISH_5 >= 110
+#        define BOOST_PP_ITERATION_5 110
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 111 && BOOST_PP_ITERATION_FINISH_5 >= 111
+#        define BOOST_PP_ITERATION_5 111
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 112 && BOOST_PP_ITERATION_FINISH_5 >= 112
+#        define BOOST_PP_ITERATION_5 112
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 113 && BOOST_PP_ITERATION_FINISH_5 >= 113
+#        define BOOST_PP_ITERATION_5 113
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 114 && BOOST_PP_ITERATION_FINISH_5 >= 114
+#        define BOOST_PP_ITERATION_5 114
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 115 && BOOST_PP_ITERATION_FINISH_5 >= 115
+#        define BOOST_PP_ITERATION_5 115
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 116 && BOOST_PP_ITERATION_FINISH_5 >= 116
+#        define BOOST_PP_ITERATION_5 116
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 117 && BOOST_PP_ITERATION_FINISH_5 >= 117
+#        define BOOST_PP_ITERATION_5 117
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 118 && BOOST_PP_ITERATION_FINISH_5 >= 118
+#        define BOOST_PP_ITERATION_5 118
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 119 && BOOST_PP_ITERATION_FINISH_5 >= 119
+#        define BOOST_PP_ITERATION_5 119
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 120 && BOOST_PP_ITERATION_FINISH_5 >= 120
+#        define BOOST_PP_ITERATION_5 120
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 121 && BOOST_PP_ITERATION_FINISH_5 >= 121
+#        define BOOST_PP_ITERATION_5 121
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 122 && BOOST_PP_ITERATION_FINISH_5 >= 122
+#        define BOOST_PP_ITERATION_5 122
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 123 && BOOST_PP_ITERATION_FINISH_5 >= 123
+#        define BOOST_PP_ITERATION_5 123
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 124 && BOOST_PP_ITERATION_FINISH_5 >= 124
+#        define BOOST_PP_ITERATION_5 124
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 125 && BOOST_PP_ITERATION_FINISH_5 >= 125
+#        define BOOST_PP_ITERATION_5 125
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 126 && BOOST_PP_ITERATION_FINISH_5 >= 126
+#        define BOOST_PP_ITERATION_5 126
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 127 && BOOST_PP_ITERATION_FINISH_5 >= 127
+#        define BOOST_PP_ITERATION_5 127
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 128 && BOOST_PP_ITERATION_FINISH_5 >= 128
+#        define BOOST_PP_ITERATION_5 128
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 129 && BOOST_PP_ITERATION_FINISH_5 >= 129
+#        define BOOST_PP_ITERATION_5 129
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 130 && BOOST_PP_ITERATION_FINISH_5 >= 130
+#        define BOOST_PP_ITERATION_5 130
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 131 && BOOST_PP_ITERATION_FINISH_5 >= 131
+#        define BOOST_PP_ITERATION_5 131
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 132 && BOOST_PP_ITERATION_FINISH_5 >= 132
+#        define BOOST_PP_ITERATION_5 132
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 133 && BOOST_PP_ITERATION_FINISH_5 >= 133
+#        define BOOST_PP_ITERATION_5 133
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 134 && BOOST_PP_ITERATION_FINISH_5 >= 134
+#        define BOOST_PP_ITERATION_5 134
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 135 && BOOST_PP_ITERATION_FINISH_5 >= 135
+#        define BOOST_PP_ITERATION_5 135
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 136 && BOOST_PP_ITERATION_FINISH_5 >= 136
+#        define BOOST_PP_ITERATION_5 136
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 137 && BOOST_PP_ITERATION_FINISH_5 >= 137
+#        define BOOST_PP_ITERATION_5 137
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 138 && BOOST_PP_ITERATION_FINISH_5 >= 138
+#        define BOOST_PP_ITERATION_5 138
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 139 && BOOST_PP_ITERATION_FINISH_5 >= 139
+#        define BOOST_PP_ITERATION_5 139
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 140 && BOOST_PP_ITERATION_FINISH_5 >= 140
+#        define BOOST_PP_ITERATION_5 140
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 141 && BOOST_PP_ITERATION_FINISH_5 >= 141
+#        define BOOST_PP_ITERATION_5 141
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 142 && BOOST_PP_ITERATION_FINISH_5 >= 142
+#        define BOOST_PP_ITERATION_5 142
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 143 && BOOST_PP_ITERATION_FINISH_5 >= 143
+#        define BOOST_PP_ITERATION_5 143
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 144 && BOOST_PP_ITERATION_FINISH_5 >= 144
+#        define BOOST_PP_ITERATION_5 144
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 145 && BOOST_PP_ITERATION_FINISH_5 >= 145
+#        define BOOST_PP_ITERATION_5 145
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 146 && BOOST_PP_ITERATION_FINISH_5 >= 146
+#        define BOOST_PP_ITERATION_5 146
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 147 && BOOST_PP_ITERATION_FINISH_5 >= 147
+#        define BOOST_PP_ITERATION_5 147
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 148 && BOOST_PP_ITERATION_FINISH_5 >= 148
+#        define BOOST_PP_ITERATION_5 148
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 149 && BOOST_PP_ITERATION_FINISH_5 >= 149
+#        define BOOST_PP_ITERATION_5 149
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 150 && BOOST_PP_ITERATION_FINISH_5 >= 150
+#        define BOOST_PP_ITERATION_5 150
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 151 && BOOST_PP_ITERATION_FINISH_5 >= 151
+#        define BOOST_PP_ITERATION_5 151
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 152 && BOOST_PP_ITERATION_FINISH_5 >= 152
+#        define BOOST_PP_ITERATION_5 152
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 153 && BOOST_PP_ITERATION_FINISH_5 >= 153
+#        define BOOST_PP_ITERATION_5 153
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 154 && BOOST_PP_ITERATION_FINISH_5 >= 154
+#        define BOOST_PP_ITERATION_5 154
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 155 && BOOST_PP_ITERATION_FINISH_5 >= 155
+#        define BOOST_PP_ITERATION_5 155
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 156 && BOOST_PP_ITERATION_FINISH_5 >= 156
+#        define BOOST_PP_ITERATION_5 156
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 157 && BOOST_PP_ITERATION_FINISH_5 >= 157
+#        define BOOST_PP_ITERATION_5 157
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 158 && BOOST_PP_ITERATION_FINISH_5 >= 158
+#        define BOOST_PP_ITERATION_5 158
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 159 && BOOST_PP_ITERATION_FINISH_5 >= 159
+#        define BOOST_PP_ITERATION_5 159
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 160 && BOOST_PP_ITERATION_FINISH_5 >= 160
+#        define BOOST_PP_ITERATION_5 160
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 161 && BOOST_PP_ITERATION_FINISH_5 >= 161
+#        define BOOST_PP_ITERATION_5 161
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 162 && BOOST_PP_ITERATION_FINISH_5 >= 162
+#        define BOOST_PP_ITERATION_5 162
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 163 && BOOST_PP_ITERATION_FINISH_5 >= 163
+#        define BOOST_PP_ITERATION_5 163
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 164 && BOOST_PP_ITERATION_FINISH_5 >= 164
+#        define BOOST_PP_ITERATION_5 164
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 165 && BOOST_PP_ITERATION_FINISH_5 >= 165
+#        define BOOST_PP_ITERATION_5 165
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 166 && BOOST_PP_ITERATION_FINISH_5 >= 166
+#        define BOOST_PP_ITERATION_5 166
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 167 && BOOST_PP_ITERATION_FINISH_5 >= 167
+#        define BOOST_PP_ITERATION_5 167
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 168 && BOOST_PP_ITERATION_FINISH_5 >= 168
+#        define BOOST_PP_ITERATION_5 168
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 169 && BOOST_PP_ITERATION_FINISH_5 >= 169
+#        define BOOST_PP_ITERATION_5 169
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 170 && BOOST_PP_ITERATION_FINISH_5 >= 170
+#        define BOOST_PP_ITERATION_5 170
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 171 && BOOST_PP_ITERATION_FINISH_5 >= 171
+#        define BOOST_PP_ITERATION_5 171
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 172 && BOOST_PP_ITERATION_FINISH_5 >= 172
+#        define BOOST_PP_ITERATION_5 172
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 173 && BOOST_PP_ITERATION_FINISH_5 >= 173
+#        define BOOST_PP_ITERATION_5 173
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 174 && BOOST_PP_ITERATION_FINISH_5 >= 174
+#        define BOOST_PP_ITERATION_5 174
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 175 && BOOST_PP_ITERATION_FINISH_5 >= 175
+#        define BOOST_PP_ITERATION_5 175
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 176 && BOOST_PP_ITERATION_FINISH_5 >= 176
+#        define BOOST_PP_ITERATION_5 176
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 177 && BOOST_PP_ITERATION_FINISH_5 >= 177
+#        define BOOST_PP_ITERATION_5 177
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 178 && BOOST_PP_ITERATION_FINISH_5 >= 178
+#        define BOOST_PP_ITERATION_5 178
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 179 && BOOST_PP_ITERATION_FINISH_5 >= 179
+#        define BOOST_PP_ITERATION_5 179
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 180 && BOOST_PP_ITERATION_FINISH_5 >= 180
+#        define BOOST_PP_ITERATION_5 180
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 181 && BOOST_PP_ITERATION_FINISH_5 >= 181
+#        define BOOST_PP_ITERATION_5 181
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 182 && BOOST_PP_ITERATION_FINISH_5 >= 182
+#        define BOOST_PP_ITERATION_5 182
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 183 && BOOST_PP_ITERATION_FINISH_5 >= 183
+#        define BOOST_PP_ITERATION_5 183
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 184 && BOOST_PP_ITERATION_FINISH_5 >= 184
+#        define BOOST_PP_ITERATION_5 184
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 185 && BOOST_PP_ITERATION_FINISH_5 >= 185
+#        define BOOST_PP_ITERATION_5 185
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 186 && BOOST_PP_ITERATION_FINISH_5 >= 186
+#        define BOOST_PP_ITERATION_5 186
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 187 && BOOST_PP_ITERATION_FINISH_5 >= 187
+#        define BOOST_PP_ITERATION_5 187
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 188 && BOOST_PP_ITERATION_FINISH_5 >= 188
+#        define BOOST_PP_ITERATION_5 188
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 189 && BOOST_PP_ITERATION_FINISH_5 >= 189
+#        define BOOST_PP_ITERATION_5 189
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 190 && BOOST_PP_ITERATION_FINISH_5 >= 190
+#        define BOOST_PP_ITERATION_5 190
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 191 && BOOST_PP_ITERATION_FINISH_5 >= 191
+#        define BOOST_PP_ITERATION_5 191
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 192 && BOOST_PP_ITERATION_FINISH_5 >= 192
+#        define BOOST_PP_ITERATION_5 192
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 193 && BOOST_PP_ITERATION_FINISH_5 >= 193
+#        define BOOST_PP_ITERATION_5 193
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 194 && BOOST_PP_ITERATION_FINISH_5 >= 194
+#        define BOOST_PP_ITERATION_5 194
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 195 && BOOST_PP_ITERATION_FINISH_5 >= 195
+#        define BOOST_PP_ITERATION_5 195
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 196 && BOOST_PP_ITERATION_FINISH_5 >= 196
+#        define BOOST_PP_ITERATION_5 196
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 197 && BOOST_PP_ITERATION_FINISH_5 >= 197
+#        define BOOST_PP_ITERATION_5 197
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 198 && BOOST_PP_ITERATION_FINISH_5 >= 198
+#        define BOOST_PP_ITERATION_5 198
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 199 && BOOST_PP_ITERATION_FINISH_5 >= 199
+#        define BOOST_PP_ITERATION_5 199
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 200 && BOOST_PP_ITERATION_FINISH_5 >= 200
+#        define BOOST_PP_ITERATION_5 200
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 201 && BOOST_PP_ITERATION_FINISH_5 >= 201
+#        define BOOST_PP_ITERATION_5 201
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 202 && BOOST_PP_ITERATION_FINISH_5 >= 202
+#        define BOOST_PP_ITERATION_5 202
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 203 && BOOST_PP_ITERATION_FINISH_5 >= 203
+#        define BOOST_PP_ITERATION_5 203
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 204 && BOOST_PP_ITERATION_FINISH_5 >= 204
+#        define BOOST_PP_ITERATION_5 204
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 205 && BOOST_PP_ITERATION_FINISH_5 >= 205
+#        define BOOST_PP_ITERATION_5 205
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 206 && BOOST_PP_ITERATION_FINISH_5 >= 206
+#        define BOOST_PP_ITERATION_5 206
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 207 && BOOST_PP_ITERATION_FINISH_5 >= 207
+#        define BOOST_PP_ITERATION_5 207
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 208 && BOOST_PP_ITERATION_FINISH_5 >= 208
+#        define BOOST_PP_ITERATION_5 208
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 209 && BOOST_PP_ITERATION_FINISH_5 >= 209
+#        define BOOST_PP_ITERATION_5 209
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 210 && BOOST_PP_ITERATION_FINISH_5 >= 210
+#        define BOOST_PP_ITERATION_5 210
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 211 && BOOST_PP_ITERATION_FINISH_5 >= 211
+#        define BOOST_PP_ITERATION_5 211
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 212 && BOOST_PP_ITERATION_FINISH_5 >= 212
+#        define BOOST_PP_ITERATION_5 212
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 213 && BOOST_PP_ITERATION_FINISH_5 >= 213
+#        define BOOST_PP_ITERATION_5 213
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 214 && BOOST_PP_ITERATION_FINISH_5 >= 214
+#        define BOOST_PP_ITERATION_5 214
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 215 && BOOST_PP_ITERATION_FINISH_5 >= 215
+#        define BOOST_PP_ITERATION_5 215
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 216 && BOOST_PP_ITERATION_FINISH_5 >= 216
+#        define BOOST_PP_ITERATION_5 216
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 217 && BOOST_PP_ITERATION_FINISH_5 >= 217
+#        define BOOST_PP_ITERATION_5 217
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 218 && BOOST_PP_ITERATION_FINISH_5 >= 218
+#        define BOOST_PP_ITERATION_5 218
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 219 && BOOST_PP_ITERATION_FINISH_5 >= 219
+#        define BOOST_PP_ITERATION_5 219
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 220 && BOOST_PP_ITERATION_FINISH_5 >= 220
+#        define BOOST_PP_ITERATION_5 220
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 221 && BOOST_PP_ITERATION_FINISH_5 >= 221
+#        define BOOST_PP_ITERATION_5 221
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 222 && BOOST_PP_ITERATION_FINISH_5 >= 222
+#        define BOOST_PP_ITERATION_5 222
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 223 && BOOST_PP_ITERATION_FINISH_5 >= 223
+#        define BOOST_PP_ITERATION_5 223
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 224 && BOOST_PP_ITERATION_FINISH_5 >= 224
+#        define BOOST_PP_ITERATION_5 224
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 225 && BOOST_PP_ITERATION_FINISH_5 >= 225
+#        define BOOST_PP_ITERATION_5 225
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 226 && BOOST_PP_ITERATION_FINISH_5 >= 226
+#        define BOOST_PP_ITERATION_5 226
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 227 && BOOST_PP_ITERATION_FINISH_5 >= 227
+#        define BOOST_PP_ITERATION_5 227
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 228 && BOOST_PP_ITERATION_FINISH_5 >= 228
+#        define BOOST_PP_ITERATION_5 228
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 229 && BOOST_PP_ITERATION_FINISH_5 >= 229
+#        define BOOST_PP_ITERATION_5 229
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 230 && BOOST_PP_ITERATION_FINISH_5 >= 230
+#        define BOOST_PP_ITERATION_5 230
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 231 && BOOST_PP_ITERATION_FINISH_5 >= 231
+#        define BOOST_PP_ITERATION_5 231
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 232 && BOOST_PP_ITERATION_FINISH_5 >= 232
+#        define BOOST_PP_ITERATION_5 232
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 233 && BOOST_PP_ITERATION_FINISH_5 >= 233
+#        define BOOST_PP_ITERATION_5 233
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 234 && BOOST_PP_ITERATION_FINISH_5 >= 234
+#        define BOOST_PP_ITERATION_5 234
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 235 && BOOST_PP_ITERATION_FINISH_5 >= 235
+#        define BOOST_PP_ITERATION_5 235
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 236 && BOOST_PP_ITERATION_FINISH_5 >= 236
+#        define BOOST_PP_ITERATION_5 236
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 237 && BOOST_PP_ITERATION_FINISH_5 >= 237
+#        define BOOST_PP_ITERATION_5 237
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 238 && BOOST_PP_ITERATION_FINISH_5 >= 238
+#        define BOOST_PP_ITERATION_5 238
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 239 && BOOST_PP_ITERATION_FINISH_5 >= 239
+#        define BOOST_PP_ITERATION_5 239
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 240 && BOOST_PP_ITERATION_FINISH_5 >= 240
+#        define BOOST_PP_ITERATION_5 240
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 241 && BOOST_PP_ITERATION_FINISH_5 >= 241
+#        define BOOST_PP_ITERATION_5 241
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 242 && BOOST_PP_ITERATION_FINISH_5 >= 242
+#        define BOOST_PP_ITERATION_5 242
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 243 && BOOST_PP_ITERATION_FINISH_5 >= 243
+#        define BOOST_PP_ITERATION_5 243
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 244 && BOOST_PP_ITERATION_FINISH_5 >= 244
+#        define BOOST_PP_ITERATION_5 244
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 245 && BOOST_PP_ITERATION_FINISH_5 >= 245
+#        define BOOST_PP_ITERATION_5 245
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 246 && BOOST_PP_ITERATION_FINISH_5 >= 246
+#        define BOOST_PP_ITERATION_5 246
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 247 && BOOST_PP_ITERATION_FINISH_5 >= 247
+#        define BOOST_PP_ITERATION_5 247
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 248 && BOOST_PP_ITERATION_FINISH_5 >= 248
+#        define BOOST_PP_ITERATION_5 248
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 249 && BOOST_PP_ITERATION_FINISH_5 >= 249
+#        define BOOST_PP_ITERATION_5 249
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 250 && BOOST_PP_ITERATION_FINISH_5 >= 250
+#        define BOOST_PP_ITERATION_5 250
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 251 && BOOST_PP_ITERATION_FINISH_5 >= 251
+#        define BOOST_PP_ITERATION_5 251
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 252 && BOOST_PP_ITERATION_FINISH_5 >= 252
+#        define BOOST_PP_ITERATION_5 252
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 253 && BOOST_PP_ITERATION_FINISH_5 >= 253
+#        define BOOST_PP_ITERATION_5 253
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 254 && BOOST_PP_ITERATION_FINISH_5 >= 254
+#        define BOOST_PP_ITERATION_5 254
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 255 && BOOST_PP_ITERATION_FINISH_5 >= 255
+#        define BOOST_PP_ITERATION_5 255
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+#    if BOOST_PP_ITERATION_START_5 <= 256 && BOOST_PP_ITERATION_FINISH_5 >= 256
+#        define BOOST_PP_ITERATION_5 256
+#        include BOOST_PP_FILENAME_5
+#        undef BOOST_PP_ITERATION_5
+#    endif
+# endif
+#
+# undef BOOST_PP_ITERATION_DEPTH
+# define BOOST_PP_ITERATION_DEPTH() 4
+#
+# undef BOOST_PP_ITERATION_START_5
+# undef BOOST_PP_ITERATION_FINISH_5
+# undef BOOST_PP_FILENAME_5
+#
+# undef BOOST_PP_ITERATION_FLAGS_5
+# undef BOOST_PP_ITERATION_PARAMS_5
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse1.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse1.hpp
new file mode 100644
index 0000000..bf88d2f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse1.hpp
@@ -0,0 +1,1296 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_ITERATION_FINISH_1 <= 256 && BOOST_PP_ITERATION_START_1 >= 256
+#    define BOOST_PP_ITERATION_1 256
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 255 && BOOST_PP_ITERATION_START_1 >= 255
+#    define BOOST_PP_ITERATION_1 255
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 254 && BOOST_PP_ITERATION_START_1 >= 254
+#    define BOOST_PP_ITERATION_1 254
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 253 && BOOST_PP_ITERATION_START_1 >= 253
+#    define BOOST_PP_ITERATION_1 253
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 252 && BOOST_PP_ITERATION_START_1 >= 252
+#    define BOOST_PP_ITERATION_1 252
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 251 && BOOST_PP_ITERATION_START_1 >= 251
+#    define BOOST_PP_ITERATION_1 251
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 250 && BOOST_PP_ITERATION_START_1 >= 250
+#    define BOOST_PP_ITERATION_1 250
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 249 && BOOST_PP_ITERATION_START_1 >= 249
+#    define BOOST_PP_ITERATION_1 249
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 248 && BOOST_PP_ITERATION_START_1 >= 248
+#    define BOOST_PP_ITERATION_1 248
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 247 && BOOST_PP_ITERATION_START_1 >= 247
+#    define BOOST_PP_ITERATION_1 247
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 246 && BOOST_PP_ITERATION_START_1 >= 246
+#    define BOOST_PP_ITERATION_1 246
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 245 && BOOST_PP_ITERATION_START_1 >= 245
+#    define BOOST_PP_ITERATION_1 245
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 244 && BOOST_PP_ITERATION_START_1 >= 244
+#    define BOOST_PP_ITERATION_1 244
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 243 && BOOST_PP_ITERATION_START_1 >= 243
+#    define BOOST_PP_ITERATION_1 243
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 242 && BOOST_PP_ITERATION_START_1 >= 242
+#    define BOOST_PP_ITERATION_1 242
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 241 && BOOST_PP_ITERATION_START_1 >= 241
+#    define BOOST_PP_ITERATION_1 241
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 240 && BOOST_PP_ITERATION_START_1 >= 240
+#    define BOOST_PP_ITERATION_1 240
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 239 && BOOST_PP_ITERATION_START_1 >= 239
+#    define BOOST_PP_ITERATION_1 239
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 238 && BOOST_PP_ITERATION_START_1 >= 238
+#    define BOOST_PP_ITERATION_1 238
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 237 && BOOST_PP_ITERATION_START_1 >= 237
+#    define BOOST_PP_ITERATION_1 237
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 236 && BOOST_PP_ITERATION_START_1 >= 236
+#    define BOOST_PP_ITERATION_1 236
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 235 && BOOST_PP_ITERATION_START_1 >= 235
+#    define BOOST_PP_ITERATION_1 235
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 234 && BOOST_PP_ITERATION_START_1 >= 234
+#    define BOOST_PP_ITERATION_1 234
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 233 && BOOST_PP_ITERATION_START_1 >= 233
+#    define BOOST_PP_ITERATION_1 233
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 232 && BOOST_PP_ITERATION_START_1 >= 232
+#    define BOOST_PP_ITERATION_1 232
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 231 && BOOST_PP_ITERATION_START_1 >= 231
+#    define BOOST_PP_ITERATION_1 231
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 230 && BOOST_PP_ITERATION_START_1 >= 230
+#    define BOOST_PP_ITERATION_1 230
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 229 && BOOST_PP_ITERATION_START_1 >= 229
+#    define BOOST_PP_ITERATION_1 229
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 228 && BOOST_PP_ITERATION_START_1 >= 228
+#    define BOOST_PP_ITERATION_1 228
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 227 && BOOST_PP_ITERATION_START_1 >= 227
+#    define BOOST_PP_ITERATION_1 227
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 226 && BOOST_PP_ITERATION_START_1 >= 226
+#    define BOOST_PP_ITERATION_1 226
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 225 && BOOST_PP_ITERATION_START_1 >= 225
+#    define BOOST_PP_ITERATION_1 225
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 224 && BOOST_PP_ITERATION_START_1 >= 224
+#    define BOOST_PP_ITERATION_1 224
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 223 && BOOST_PP_ITERATION_START_1 >= 223
+#    define BOOST_PP_ITERATION_1 223
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 222 && BOOST_PP_ITERATION_START_1 >= 222
+#    define BOOST_PP_ITERATION_1 222
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 221 && BOOST_PP_ITERATION_START_1 >= 221
+#    define BOOST_PP_ITERATION_1 221
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 220 && BOOST_PP_ITERATION_START_1 >= 220
+#    define BOOST_PP_ITERATION_1 220
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 219 && BOOST_PP_ITERATION_START_1 >= 219
+#    define BOOST_PP_ITERATION_1 219
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 218 && BOOST_PP_ITERATION_START_1 >= 218
+#    define BOOST_PP_ITERATION_1 218
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 217 && BOOST_PP_ITERATION_START_1 >= 217
+#    define BOOST_PP_ITERATION_1 217
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 216 && BOOST_PP_ITERATION_START_1 >= 216
+#    define BOOST_PP_ITERATION_1 216
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 215 && BOOST_PP_ITERATION_START_1 >= 215
+#    define BOOST_PP_ITERATION_1 215
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 214 && BOOST_PP_ITERATION_START_1 >= 214
+#    define BOOST_PP_ITERATION_1 214
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 213 && BOOST_PP_ITERATION_START_1 >= 213
+#    define BOOST_PP_ITERATION_1 213
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 212 && BOOST_PP_ITERATION_START_1 >= 212
+#    define BOOST_PP_ITERATION_1 212
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 211 && BOOST_PP_ITERATION_START_1 >= 211
+#    define BOOST_PP_ITERATION_1 211
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 210 && BOOST_PP_ITERATION_START_1 >= 210
+#    define BOOST_PP_ITERATION_1 210
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 209 && BOOST_PP_ITERATION_START_1 >= 209
+#    define BOOST_PP_ITERATION_1 209
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 208 && BOOST_PP_ITERATION_START_1 >= 208
+#    define BOOST_PP_ITERATION_1 208
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 207 && BOOST_PP_ITERATION_START_1 >= 207
+#    define BOOST_PP_ITERATION_1 207
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 206 && BOOST_PP_ITERATION_START_1 >= 206
+#    define BOOST_PP_ITERATION_1 206
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 205 && BOOST_PP_ITERATION_START_1 >= 205
+#    define BOOST_PP_ITERATION_1 205
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 204 && BOOST_PP_ITERATION_START_1 >= 204
+#    define BOOST_PP_ITERATION_1 204
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 203 && BOOST_PP_ITERATION_START_1 >= 203
+#    define BOOST_PP_ITERATION_1 203
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 202 && BOOST_PP_ITERATION_START_1 >= 202
+#    define BOOST_PP_ITERATION_1 202
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 201 && BOOST_PP_ITERATION_START_1 >= 201
+#    define BOOST_PP_ITERATION_1 201
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 200 && BOOST_PP_ITERATION_START_1 >= 200
+#    define BOOST_PP_ITERATION_1 200
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 199 && BOOST_PP_ITERATION_START_1 >= 199
+#    define BOOST_PP_ITERATION_1 199
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 198 && BOOST_PP_ITERATION_START_1 >= 198
+#    define BOOST_PP_ITERATION_1 198
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 197 && BOOST_PP_ITERATION_START_1 >= 197
+#    define BOOST_PP_ITERATION_1 197
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 196 && BOOST_PP_ITERATION_START_1 >= 196
+#    define BOOST_PP_ITERATION_1 196
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 195 && BOOST_PP_ITERATION_START_1 >= 195
+#    define BOOST_PP_ITERATION_1 195
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 194 && BOOST_PP_ITERATION_START_1 >= 194
+#    define BOOST_PP_ITERATION_1 194
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 193 && BOOST_PP_ITERATION_START_1 >= 193
+#    define BOOST_PP_ITERATION_1 193
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 192 && BOOST_PP_ITERATION_START_1 >= 192
+#    define BOOST_PP_ITERATION_1 192
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 191 && BOOST_PP_ITERATION_START_1 >= 191
+#    define BOOST_PP_ITERATION_1 191
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 190 && BOOST_PP_ITERATION_START_1 >= 190
+#    define BOOST_PP_ITERATION_1 190
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 189 && BOOST_PP_ITERATION_START_1 >= 189
+#    define BOOST_PP_ITERATION_1 189
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 188 && BOOST_PP_ITERATION_START_1 >= 188
+#    define BOOST_PP_ITERATION_1 188
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 187 && BOOST_PP_ITERATION_START_1 >= 187
+#    define BOOST_PP_ITERATION_1 187
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 186 && BOOST_PP_ITERATION_START_1 >= 186
+#    define BOOST_PP_ITERATION_1 186
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 185 && BOOST_PP_ITERATION_START_1 >= 185
+#    define BOOST_PP_ITERATION_1 185
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 184 && BOOST_PP_ITERATION_START_1 >= 184
+#    define BOOST_PP_ITERATION_1 184
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 183 && BOOST_PP_ITERATION_START_1 >= 183
+#    define BOOST_PP_ITERATION_1 183
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 182 && BOOST_PP_ITERATION_START_1 >= 182
+#    define BOOST_PP_ITERATION_1 182
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 181 && BOOST_PP_ITERATION_START_1 >= 181
+#    define BOOST_PP_ITERATION_1 181
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 180 && BOOST_PP_ITERATION_START_1 >= 180
+#    define BOOST_PP_ITERATION_1 180
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 179 && BOOST_PP_ITERATION_START_1 >= 179
+#    define BOOST_PP_ITERATION_1 179
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 178 && BOOST_PP_ITERATION_START_1 >= 178
+#    define BOOST_PP_ITERATION_1 178
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 177 && BOOST_PP_ITERATION_START_1 >= 177
+#    define BOOST_PP_ITERATION_1 177
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 176 && BOOST_PP_ITERATION_START_1 >= 176
+#    define BOOST_PP_ITERATION_1 176
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 175 && BOOST_PP_ITERATION_START_1 >= 175
+#    define BOOST_PP_ITERATION_1 175
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 174 && BOOST_PP_ITERATION_START_1 >= 174
+#    define BOOST_PP_ITERATION_1 174
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 173 && BOOST_PP_ITERATION_START_1 >= 173
+#    define BOOST_PP_ITERATION_1 173
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 172 && BOOST_PP_ITERATION_START_1 >= 172
+#    define BOOST_PP_ITERATION_1 172
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 171 && BOOST_PP_ITERATION_START_1 >= 171
+#    define BOOST_PP_ITERATION_1 171
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 170 && BOOST_PP_ITERATION_START_1 >= 170
+#    define BOOST_PP_ITERATION_1 170
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 169 && BOOST_PP_ITERATION_START_1 >= 169
+#    define BOOST_PP_ITERATION_1 169
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 168 && BOOST_PP_ITERATION_START_1 >= 168
+#    define BOOST_PP_ITERATION_1 168
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 167 && BOOST_PP_ITERATION_START_1 >= 167
+#    define BOOST_PP_ITERATION_1 167
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 166 && BOOST_PP_ITERATION_START_1 >= 166
+#    define BOOST_PP_ITERATION_1 166
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 165 && BOOST_PP_ITERATION_START_1 >= 165
+#    define BOOST_PP_ITERATION_1 165
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 164 && BOOST_PP_ITERATION_START_1 >= 164
+#    define BOOST_PP_ITERATION_1 164
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 163 && BOOST_PP_ITERATION_START_1 >= 163
+#    define BOOST_PP_ITERATION_1 163
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 162 && BOOST_PP_ITERATION_START_1 >= 162
+#    define BOOST_PP_ITERATION_1 162
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 161 && BOOST_PP_ITERATION_START_1 >= 161
+#    define BOOST_PP_ITERATION_1 161
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 160 && BOOST_PP_ITERATION_START_1 >= 160
+#    define BOOST_PP_ITERATION_1 160
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 159 && BOOST_PP_ITERATION_START_1 >= 159
+#    define BOOST_PP_ITERATION_1 159
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 158 && BOOST_PP_ITERATION_START_1 >= 158
+#    define BOOST_PP_ITERATION_1 158
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 157 && BOOST_PP_ITERATION_START_1 >= 157
+#    define BOOST_PP_ITERATION_1 157
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 156 && BOOST_PP_ITERATION_START_1 >= 156
+#    define BOOST_PP_ITERATION_1 156
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 155 && BOOST_PP_ITERATION_START_1 >= 155
+#    define BOOST_PP_ITERATION_1 155
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 154 && BOOST_PP_ITERATION_START_1 >= 154
+#    define BOOST_PP_ITERATION_1 154
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 153 && BOOST_PP_ITERATION_START_1 >= 153
+#    define BOOST_PP_ITERATION_1 153
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 152 && BOOST_PP_ITERATION_START_1 >= 152
+#    define BOOST_PP_ITERATION_1 152
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 151 && BOOST_PP_ITERATION_START_1 >= 151
+#    define BOOST_PP_ITERATION_1 151
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 150 && BOOST_PP_ITERATION_START_1 >= 150
+#    define BOOST_PP_ITERATION_1 150
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 149 && BOOST_PP_ITERATION_START_1 >= 149
+#    define BOOST_PP_ITERATION_1 149
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 148 && BOOST_PP_ITERATION_START_1 >= 148
+#    define BOOST_PP_ITERATION_1 148
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 147 && BOOST_PP_ITERATION_START_1 >= 147
+#    define BOOST_PP_ITERATION_1 147
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 146 && BOOST_PP_ITERATION_START_1 >= 146
+#    define BOOST_PP_ITERATION_1 146
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 145 && BOOST_PP_ITERATION_START_1 >= 145
+#    define BOOST_PP_ITERATION_1 145
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 144 && BOOST_PP_ITERATION_START_1 >= 144
+#    define BOOST_PP_ITERATION_1 144
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 143 && BOOST_PP_ITERATION_START_1 >= 143
+#    define BOOST_PP_ITERATION_1 143
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 142 && BOOST_PP_ITERATION_START_1 >= 142
+#    define BOOST_PP_ITERATION_1 142
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 141 && BOOST_PP_ITERATION_START_1 >= 141
+#    define BOOST_PP_ITERATION_1 141
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 140 && BOOST_PP_ITERATION_START_1 >= 140
+#    define BOOST_PP_ITERATION_1 140
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 139 && BOOST_PP_ITERATION_START_1 >= 139
+#    define BOOST_PP_ITERATION_1 139
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 138 && BOOST_PP_ITERATION_START_1 >= 138
+#    define BOOST_PP_ITERATION_1 138
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 137 && BOOST_PP_ITERATION_START_1 >= 137
+#    define BOOST_PP_ITERATION_1 137
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 136 && BOOST_PP_ITERATION_START_1 >= 136
+#    define BOOST_PP_ITERATION_1 136
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 135 && BOOST_PP_ITERATION_START_1 >= 135
+#    define BOOST_PP_ITERATION_1 135
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 134 && BOOST_PP_ITERATION_START_1 >= 134
+#    define BOOST_PP_ITERATION_1 134
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 133 && BOOST_PP_ITERATION_START_1 >= 133
+#    define BOOST_PP_ITERATION_1 133
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 132 && BOOST_PP_ITERATION_START_1 >= 132
+#    define BOOST_PP_ITERATION_1 132
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 131 && BOOST_PP_ITERATION_START_1 >= 131
+#    define BOOST_PP_ITERATION_1 131
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 130 && BOOST_PP_ITERATION_START_1 >= 130
+#    define BOOST_PP_ITERATION_1 130
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 129 && BOOST_PP_ITERATION_START_1 >= 129
+#    define BOOST_PP_ITERATION_1 129
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 128 && BOOST_PP_ITERATION_START_1 >= 128
+#    define BOOST_PP_ITERATION_1 128
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 127 && BOOST_PP_ITERATION_START_1 >= 127
+#    define BOOST_PP_ITERATION_1 127
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 126 && BOOST_PP_ITERATION_START_1 >= 126
+#    define BOOST_PP_ITERATION_1 126
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 125 && BOOST_PP_ITERATION_START_1 >= 125
+#    define BOOST_PP_ITERATION_1 125
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 124 && BOOST_PP_ITERATION_START_1 >= 124
+#    define BOOST_PP_ITERATION_1 124
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 123 && BOOST_PP_ITERATION_START_1 >= 123
+#    define BOOST_PP_ITERATION_1 123
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 122 && BOOST_PP_ITERATION_START_1 >= 122
+#    define BOOST_PP_ITERATION_1 122
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 121 && BOOST_PP_ITERATION_START_1 >= 121
+#    define BOOST_PP_ITERATION_1 121
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 120 && BOOST_PP_ITERATION_START_1 >= 120
+#    define BOOST_PP_ITERATION_1 120
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 119 && BOOST_PP_ITERATION_START_1 >= 119
+#    define BOOST_PP_ITERATION_1 119
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 118 && BOOST_PP_ITERATION_START_1 >= 118
+#    define BOOST_PP_ITERATION_1 118
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 117 && BOOST_PP_ITERATION_START_1 >= 117
+#    define BOOST_PP_ITERATION_1 117
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 116 && BOOST_PP_ITERATION_START_1 >= 116
+#    define BOOST_PP_ITERATION_1 116
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 115 && BOOST_PP_ITERATION_START_1 >= 115
+#    define BOOST_PP_ITERATION_1 115
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 114 && BOOST_PP_ITERATION_START_1 >= 114
+#    define BOOST_PP_ITERATION_1 114
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 113 && BOOST_PP_ITERATION_START_1 >= 113
+#    define BOOST_PP_ITERATION_1 113
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 112 && BOOST_PP_ITERATION_START_1 >= 112
+#    define BOOST_PP_ITERATION_1 112
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 111 && BOOST_PP_ITERATION_START_1 >= 111
+#    define BOOST_PP_ITERATION_1 111
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 110 && BOOST_PP_ITERATION_START_1 >= 110
+#    define BOOST_PP_ITERATION_1 110
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 109 && BOOST_PP_ITERATION_START_1 >= 109
+#    define BOOST_PP_ITERATION_1 109
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 108 && BOOST_PP_ITERATION_START_1 >= 108
+#    define BOOST_PP_ITERATION_1 108
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 107 && BOOST_PP_ITERATION_START_1 >= 107
+#    define BOOST_PP_ITERATION_1 107
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 106 && BOOST_PP_ITERATION_START_1 >= 106
+#    define BOOST_PP_ITERATION_1 106
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 105 && BOOST_PP_ITERATION_START_1 >= 105
+#    define BOOST_PP_ITERATION_1 105
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 104 && BOOST_PP_ITERATION_START_1 >= 104
+#    define BOOST_PP_ITERATION_1 104
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 103 && BOOST_PP_ITERATION_START_1 >= 103
+#    define BOOST_PP_ITERATION_1 103
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 102 && BOOST_PP_ITERATION_START_1 >= 102
+#    define BOOST_PP_ITERATION_1 102
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 101 && BOOST_PP_ITERATION_START_1 >= 101
+#    define BOOST_PP_ITERATION_1 101
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 100 && BOOST_PP_ITERATION_START_1 >= 100
+#    define BOOST_PP_ITERATION_1 100
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 99 && BOOST_PP_ITERATION_START_1 >= 99
+#    define BOOST_PP_ITERATION_1 99
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 98 && BOOST_PP_ITERATION_START_1 >= 98
+#    define BOOST_PP_ITERATION_1 98
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 97 && BOOST_PP_ITERATION_START_1 >= 97
+#    define BOOST_PP_ITERATION_1 97
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 96 && BOOST_PP_ITERATION_START_1 >= 96
+#    define BOOST_PP_ITERATION_1 96
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 95 && BOOST_PP_ITERATION_START_1 >= 95
+#    define BOOST_PP_ITERATION_1 95
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 94 && BOOST_PP_ITERATION_START_1 >= 94
+#    define BOOST_PP_ITERATION_1 94
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 93 && BOOST_PP_ITERATION_START_1 >= 93
+#    define BOOST_PP_ITERATION_1 93
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 92 && BOOST_PP_ITERATION_START_1 >= 92
+#    define BOOST_PP_ITERATION_1 92
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 91 && BOOST_PP_ITERATION_START_1 >= 91
+#    define BOOST_PP_ITERATION_1 91
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 90 && BOOST_PP_ITERATION_START_1 >= 90
+#    define BOOST_PP_ITERATION_1 90
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 89 && BOOST_PP_ITERATION_START_1 >= 89
+#    define BOOST_PP_ITERATION_1 89
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 88 && BOOST_PP_ITERATION_START_1 >= 88
+#    define BOOST_PP_ITERATION_1 88
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 87 && BOOST_PP_ITERATION_START_1 >= 87
+#    define BOOST_PP_ITERATION_1 87
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 86 && BOOST_PP_ITERATION_START_1 >= 86
+#    define BOOST_PP_ITERATION_1 86
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 85 && BOOST_PP_ITERATION_START_1 >= 85
+#    define BOOST_PP_ITERATION_1 85
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 84 && BOOST_PP_ITERATION_START_1 >= 84
+#    define BOOST_PP_ITERATION_1 84
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 83 && BOOST_PP_ITERATION_START_1 >= 83
+#    define BOOST_PP_ITERATION_1 83
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 82 && BOOST_PP_ITERATION_START_1 >= 82
+#    define BOOST_PP_ITERATION_1 82
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 81 && BOOST_PP_ITERATION_START_1 >= 81
+#    define BOOST_PP_ITERATION_1 81
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 80 && BOOST_PP_ITERATION_START_1 >= 80
+#    define BOOST_PP_ITERATION_1 80
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 79 && BOOST_PP_ITERATION_START_1 >= 79
+#    define BOOST_PP_ITERATION_1 79
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 78 && BOOST_PP_ITERATION_START_1 >= 78
+#    define BOOST_PP_ITERATION_1 78
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 77 && BOOST_PP_ITERATION_START_1 >= 77
+#    define BOOST_PP_ITERATION_1 77
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 76 && BOOST_PP_ITERATION_START_1 >= 76
+#    define BOOST_PP_ITERATION_1 76
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 75 && BOOST_PP_ITERATION_START_1 >= 75
+#    define BOOST_PP_ITERATION_1 75
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 74 && BOOST_PP_ITERATION_START_1 >= 74
+#    define BOOST_PP_ITERATION_1 74
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 73 && BOOST_PP_ITERATION_START_1 >= 73
+#    define BOOST_PP_ITERATION_1 73
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 72 && BOOST_PP_ITERATION_START_1 >= 72
+#    define BOOST_PP_ITERATION_1 72
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 71 && BOOST_PP_ITERATION_START_1 >= 71
+#    define BOOST_PP_ITERATION_1 71
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 70 && BOOST_PP_ITERATION_START_1 >= 70
+#    define BOOST_PP_ITERATION_1 70
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 69 && BOOST_PP_ITERATION_START_1 >= 69
+#    define BOOST_PP_ITERATION_1 69
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 68 && BOOST_PP_ITERATION_START_1 >= 68
+#    define BOOST_PP_ITERATION_1 68
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 67 && BOOST_PP_ITERATION_START_1 >= 67
+#    define BOOST_PP_ITERATION_1 67
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 66 && BOOST_PP_ITERATION_START_1 >= 66
+#    define BOOST_PP_ITERATION_1 66
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 65 && BOOST_PP_ITERATION_START_1 >= 65
+#    define BOOST_PP_ITERATION_1 65
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 64 && BOOST_PP_ITERATION_START_1 >= 64
+#    define BOOST_PP_ITERATION_1 64
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 63 && BOOST_PP_ITERATION_START_1 >= 63
+#    define BOOST_PP_ITERATION_1 63
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 62 && BOOST_PP_ITERATION_START_1 >= 62
+#    define BOOST_PP_ITERATION_1 62
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 61 && BOOST_PP_ITERATION_START_1 >= 61
+#    define BOOST_PP_ITERATION_1 61
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 60 && BOOST_PP_ITERATION_START_1 >= 60
+#    define BOOST_PP_ITERATION_1 60
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 59 && BOOST_PP_ITERATION_START_1 >= 59
+#    define BOOST_PP_ITERATION_1 59
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 58 && BOOST_PP_ITERATION_START_1 >= 58
+#    define BOOST_PP_ITERATION_1 58
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 57 && BOOST_PP_ITERATION_START_1 >= 57
+#    define BOOST_PP_ITERATION_1 57
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 56 && BOOST_PP_ITERATION_START_1 >= 56
+#    define BOOST_PP_ITERATION_1 56
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 55 && BOOST_PP_ITERATION_START_1 >= 55
+#    define BOOST_PP_ITERATION_1 55
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 54 && BOOST_PP_ITERATION_START_1 >= 54
+#    define BOOST_PP_ITERATION_1 54
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 53 && BOOST_PP_ITERATION_START_1 >= 53
+#    define BOOST_PP_ITERATION_1 53
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 52 && BOOST_PP_ITERATION_START_1 >= 52
+#    define BOOST_PP_ITERATION_1 52
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 51 && BOOST_PP_ITERATION_START_1 >= 51
+#    define BOOST_PP_ITERATION_1 51
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 50 && BOOST_PP_ITERATION_START_1 >= 50
+#    define BOOST_PP_ITERATION_1 50
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 49 && BOOST_PP_ITERATION_START_1 >= 49
+#    define BOOST_PP_ITERATION_1 49
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 48 && BOOST_PP_ITERATION_START_1 >= 48
+#    define BOOST_PP_ITERATION_1 48
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 47 && BOOST_PP_ITERATION_START_1 >= 47
+#    define BOOST_PP_ITERATION_1 47
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 46 && BOOST_PP_ITERATION_START_1 >= 46
+#    define BOOST_PP_ITERATION_1 46
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 45 && BOOST_PP_ITERATION_START_1 >= 45
+#    define BOOST_PP_ITERATION_1 45
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 44 && BOOST_PP_ITERATION_START_1 >= 44
+#    define BOOST_PP_ITERATION_1 44
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 43 && BOOST_PP_ITERATION_START_1 >= 43
+#    define BOOST_PP_ITERATION_1 43
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 42 && BOOST_PP_ITERATION_START_1 >= 42
+#    define BOOST_PP_ITERATION_1 42
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 41 && BOOST_PP_ITERATION_START_1 >= 41
+#    define BOOST_PP_ITERATION_1 41
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 40 && BOOST_PP_ITERATION_START_1 >= 40
+#    define BOOST_PP_ITERATION_1 40
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 39 && BOOST_PP_ITERATION_START_1 >= 39
+#    define BOOST_PP_ITERATION_1 39
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 38 && BOOST_PP_ITERATION_START_1 >= 38
+#    define BOOST_PP_ITERATION_1 38
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 37 && BOOST_PP_ITERATION_START_1 >= 37
+#    define BOOST_PP_ITERATION_1 37
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 36 && BOOST_PP_ITERATION_START_1 >= 36
+#    define BOOST_PP_ITERATION_1 36
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 35 && BOOST_PP_ITERATION_START_1 >= 35
+#    define BOOST_PP_ITERATION_1 35
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 34 && BOOST_PP_ITERATION_START_1 >= 34
+#    define BOOST_PP_ITERATION_1 34
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 33 && BOOST_PP_ITERATION_START_1 >= 33
+#    define BOOST_PP_ITERATION_1 33
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 32 && BOOST_PP_ITERATION_START_1 >= 32
+#    define BOOST_PP_ITERATION_1 32
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 31 && BOOST_PP_ITERATION_START_1 >= 31
+#    define BOOST_PP_ITERATION_1 31
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 30 && BOOST_PP_ITERATION_START_1 >= 30
+#    define BOOST_PP_ITERATION_1 30
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 29 && BOOST_PP_ITERATION_START_1 >= 29
+#    define BOOST_PP_ITERATION_1 29
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 28 && BOOST_PP_ITERATION_START_1 >= 28
+#    define BOOST_PP_ITERATION_1 28
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 27 && BOOST_PP_ITERATION_START_1 >= 27
+#    define BOOST_PP_ITERATION_1 27
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 26 && BOOST_PP_ITERATION_START_1 >= 26
+#    define BOOST_PP_ITERATION_1 26
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 25 && BOOST_PP_ITERATION_START_1 >= 25
+#    define BOOST_PP_ITERATION_1 25
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 24 && BOOST_PP_ITERATION_START_1 >= 24
+#    define BOOST_PP_ITERATION_1 24
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 23 && BOOST_PP_ITERATION_START_1 >= 23
+#    define BOOST_PP_ITERATION_1 23
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 22 && BOOST_PP_ITERATION_START_1 >= 22
+#    define BOOST_PP_ITERATION_1 22
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 21 && BOOST_PP_ITERATION_START_1 >= 21
+#    define BOOST_PP_ITERATION_1 21
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 20 && BOOST_PP_ITERATION_START_1 >= 20
+#    define BOOST_PP_ITERATION_1 20
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 19 && BOOST_PP_ITERATION_START_1 >= 19
+#    define BOOST_PP_ITERATION_1 19
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 18 && BOOST_PP_ITERATION_START_1 >= 18
+#    define BOOST_PP_ITERATION_1 18
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 17 && BOOST_PP_ITERATION_START_1 >= 17
+#    define BOOST_PP_ITERATION_1 17
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 16 && BOOST_PP_ITERATION_START_1 >= 16
+#    define BOOST_PP_ITERATION_1 16
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 15 && BOOST_PP_ITERATION_START_1 >= 15
+#    define BOOST_PP_ITERATION_1 15
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 14 && BOOST_PP_ITERATION_START_1 >= 14
+#    define BOOST_PP_ITERATION_1 14
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 13 && BOOST_PP_ITERATION_START_1 >= 13
+#    define BOOST_PP_ITERATION_1 13
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 12 && BOOST_PP_ITERATION_START_1 >= 12
+#    define BOOST_PP_ITERATION_1 12
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 11 && BOOST_PP_ITERATION_START_1 >= 11
+#    define BOOST_PP_ITERATION_1 11
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 10 && BOOST_PP_ITERATION_START_1 >= 10
+#    define BOOST_PP_ITERATION_1 10
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 9 && BOOST_PP_ITERATION_START_1 >= 9
+#    define BOOST_PP_ITERATION_1 9
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 8 && BOOST_PP_ITERATION_START_1 >= 8
+#    define BOOST_PP_ITERATION_1 8
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 7 && BOOST_PP_ITERATION_START_1 >= 7
+#    define BOOST_PP_ITERATION_1 7
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 6 && BOOST_PP_ITERATION_START_1 >= 6
+#    define BOOST_PP_ITERATION_1 6
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 5 && BOOST_PP_ITERATION_START_1 >= 5
+#    define BOOST_PP_ITERATION_1 5
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 4 && BOOST_PP_ITERATION_START_1 >= 4
+#    define BOOST_PP_ITERATION_1 4
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 3 && BOOST_PP_ITERATION_START_1 >= 3
+#    define BOOST_PP_ITERATION_1 3
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 2 && BOOST_PP_ITERATION_START_1 >= 2
+#    define BOOST_PP_ITERATION_1 2
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 1 && BOOST_PP_ITERATION_START_1 >= 1
+#    define BOOST_PP_ITERATION_1 1
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
+# if BOOST_PP_ITERATION_FINISH_1 <= 0 && BOOST_PP_ITERATION_START_1 >= 0
+#    define BOOST_PP_ITERATION_1 0
+#    include BOOST_PP_FILENAME_1
+#    undef BOOST_PP_ITERATION_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse2.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse2.hpp
new file mode 100644
index 0000000..521bd24
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse2.hpp
@@ -0,0 +1,1296 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_ITERATION_FINISH_2 <= 256 && BOOST_PP_ITERATION_START_2 >= 256
+#    define BOOST_PP_ITERATION_2 256
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 255 && BOOST_PP_ITERATION_START_2 >= 255
+#    define BOOST_PP_ITERATION_2 255
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 254 && BOOST_PP_ITERATION_START_2 >= 254
+#    define BOOST_PP_ITERATION_2 254
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 253 && BOOST_PP_ITERATION_START_2 >= 253
+#    define BOOST_PP_ITERATION_2 253
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 252 && BOOST_PP_ITERATION_START_2 >= 252
+#    define BOOST_PP_ITERATION_2 252
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 251 && BOOST_PP_ITERATION_START_2 >= 251
+#    define BOOST_PP_ITERATION_2 251
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 250 && BOOST_PP_ITERATION_START_2 >= 250
+#    define BOOST_PP_ITERATION_2 250
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 249 && BOOST_PP_ITERATION_START_2 >= 249
+#    define BOOST_PP_ITERATION_2 249
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 248 && BOOST_PP_ITERATION_START_2 >= 248
+#    define BOOST_PP_ITERATION_2 248
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 247 && BOOST_PP_ITERATION_START_2 >= 247
+#    define BOOST_PP_ITERATION_2 247
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 246 && BOOST_PP_ITERATION_START_2 >= 246
+#    define BOOST_PP_ITERATION_2 246
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 245 && BOOST_PP_ITERATION_START_2 >= 245
+#    define BOOST_PP_ITERATION_2 245
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 244 && BOOST_PP_ITERATION_START_2 >= 244
+#    define BOOST_PP_ITERATION_2 244
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 243 && BOOST_PP_ITERATION_START_2 >= 243
+#    define BOOST_PP_ITERATION_2 243
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 242 && BOOST_PP_ITERATION_START_2 >= 242
+#    define BOOST_PP_ITERATION_2 242
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 241 && BOOST_PP_ITERATION_START_2 >= 241
+#    define BOOST_PP_ITERATION_2 241
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 240 && BOOST_PP_ITERATION_START_2 >= 240
+#    define BOOST_PP_ITERATION_2 240
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 239 && BOOST_PP_ITERATION_START_2 >= 239
+#    define BOOST_PP_ITERATION_2 239
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 238 && BOOST_PP_ITERATION_START_2 >= 238
+#    define BOOST_PP_ITERATION_2 238
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 237 && BOOST_PP_ITERATION_START_2 >= 237
+#    define BOOST_PP_ITERATION_2 237
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 236 && BOOST_PP_ITERATION_START_2 >= 236
+#    define BOOST_PP_ITERATION_2 236
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 235 && BOOST_PP_ITERATION_START_2 >= 235
+#    define BOOST_PP_ITERATION_2 235
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 234 && BOOST_PP_ITERATION_START_2 >= 234
+#    define BOOST_PP_ITERATION_2 234
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 233 && BOOST_PP_ITERATION_START_2 >= 233
+#    define BOOST_PP_ITERATION_2 233
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 232 && BOOST_PP_ITERATION_START_2 >= 232
+#    define BOOST_PP_ITERATION_2 232
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 231 && BOOST_PP_ITERATION_START_2 >= 231
+#    define BOOST_PP_ITERATION_2 231
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 230 && BOOST_PP_ITERATION_START_2 >= 230
+#    define BOOST_PP_ITERATION_2 230
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 229 && BOOST_PP_ITERATION_START_2 >= 229
+#    define BOOST_PP_ITERATION_2 229
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 228 && BOOST_PP_ITERATION_START_2 >= 228
+#    define BOOST_PP_ITERATION_2 228
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 227 && BOOST_PP_ITERATION_START_2 >= 227
+#    define BOOST_PP_ITERATION_2 227
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 226 && BOOST_PP_ITERATION_START_2 >= 226
+#    define BOOST_PP_ITERATION_2 226
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 225 && BOOST_PP_ITERATION_START_2 >= 225
+#    define BOOST_PP_ITERATION_2 225
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 224 && BOOST_PP_ITERATION_START_2 >= 224
+#    define BOOST_PP_ITERATION_2 224
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 223 && BOOST_PP_ITERATION_START_2 >= 223
+#    define BOOST_PP_ITERATION_2 223
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 222 && BOOST_PP_ITERATION_START_2 >= 222
+#    define BOOST_PP_ITERATION_2 222
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 221 && BOOST_PP_ITERATION_START_2 >= 221
+#    define BOOST_PP_ITERATION_2 221
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 220 && BOOST_PP_ITERATION_START_2 >= 220
+#    define BOOST_PP_ITERATION_2 220
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 219 && BOOST_PP_ITERATION_START_2 >= 219
+#    define BOOST_PP_ITERATION_2 219
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 218 && BOOST_PP_ITERATION_START_2 >= 218
+#    define BOOST_PP_ITERATION_2 218
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 217 && BOOST_PP_ITERATION_START_2 >= 217
+#    define BOOST_PP_ITERATION_2 217
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 216 && BOOST_PP_ITERATION_START_2 >= 216
+#    define BOOST_PP_ITERATION_2 216
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 215 && BOOST_PP_ITERATION_START_2 >= 215
+#    define BOOST_PP_ITERATION_2 215
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 214 && BOOST_PP_ITERATION_START_2 >= 214
+#    define BOOST_PP_ITERATION_2 214
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 213 && BOOST_PP_ITERATION_START_2 >= 213
+#    define BOOST_PP_ITERATION_2 213
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 212 && BOOST_PP_ITERATION_START_2 >= 212
+#    define BOOST_PP_ITERATION_2 212
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 211 && BOOST_PP_ITERATION_START_2 >= 211
+#    define BOOST_PP_ITERATION_2 211
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 210 && BOOST_PP_ITERATION_START_2 >= 210
+#    define BOOST_PP_ITERATION_2 210
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 209 && BOOST_PP_ITERATION_START_2 >= 209
+#    define BOOST_PP_ITERATION_2 209
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 208 && BOOST_PP_ITERATION_START_2 >= 208
+#    define BOOST_PP_ITERATION_2 208
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 207 && BOOST_PP_ITERATION_START_2 >= 207
+#    define BOOST_PP_ITERATION_2 207
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 206 && BOOST_PP_ITERATION_START_2 >= 206
+#    define BOOST_PP_ITERATION_2 206
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 205 && BOOST_PP_ITERATION_START_2 >= 205
+#    define BOOST_PP_ITERATION_2 205
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 204 && BOOST_PP_ITERATION_START_2 >= 204
+#    define BOOST_PP_ITERATION_2 204
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 203 && BOOST_PP_ITERATION_START_2 >= 203
+#    define BOOST_PP_ITERATION_2 203
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 202 && BOOST_PP_ITERATION_START_2 >= 202
+#    define BOOST_PP_ITERATION_2 202
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 201 && BOOST_PP_ITERATION_START_2 >= 201
+#    define BOOST_PP_ITERATION_2 201
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 200 && BOOST_PP_ITERATION_START_2 >= 200
+#    define BOOST_PP_ITERATION_2 200
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 199 && BOOST_PP_ITERATION_START_2 >= 199
+#    define BOOST_PP_ITERATION_2 199
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 198 && BOOST_PP_ITERATION_START_2 >= 198
+#    define BOOST_PP_ITERATION_2 198
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 197 && BOOST_PP_ITERATION_START_2 >= 197
+#    define BOOST_PP_ITERATION_2 197
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 196 && BOOST_PP_ITERATION_START_2 >= 196
+#    define BOOST_PP_ITERATION_2 196
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 195 && BOOST_PP_ITERATION_START_2 >= 195
+#    define BOOST_PP_ITERATION_2 195
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 194 && BOOST_PP_ITERATION_START_2 >= 194
+#    define BOOST_PP_ITERATION_2 194
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 193 && BOOST_PP_ITERATION_START_2 >= 193
+#    define BOOST_PP_ITERATION_2 193
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 192 && BOOST_PP_ITERATION_START_2 >= 192
+#    define BOOST_PP_ITERATION_2 192
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 191 && BOOST_PP_ITERATION_START_2 >= 191
+#    define BOOST_PP_ITERATION_2 191
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 190 && BOOST_PP_ITERATION_START_2 >= 190
+#    define BOOST_PP_ITERATION_2 190
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 189 && BOOST_PP_ITERATION_START_2 >= 189
+#    define BOOST_PP_ITERATION_2 189
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 188 && BOOST_PP_ITERATION_START_2 >= 188
+#    define BOOST_PP_ITERATION_2 188
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 187 && BOOST_PP_ITERATION_START_2 >= 187
+#    define BOOST_PP_ITERATION_2 187
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 186 && BOOST_PP_ITERATION_START_2 >= 186
+#    define BOOST_PP_ITERATION_2 186
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 185 && BOOST_PP_ITERATION_START_2 >= 185
+#    define BOOST_PP_ITERATION_2 185
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 184 && BOOST_PP_ITERATION_START_2 >= 184
+#    define BOOST_PP_ITERATION_2 184
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 183 && BOOST_PP_ITERATION_START_2 >= 183
+#    define BOOST_PP_ITERATION_2 183
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 182 && BOOST_PP_ITERATION_START_2 >= 182
+#    define BOOST_PP_ITERATION_2 182
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 181 && BOOST_PP_ITERATION_START_2 >= 181
+#    define BOOST_PP_ITERATION_2 181
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 180 && BOOST_PP_ITERATION_START_2 >= 180
+#    define BOOST_PP_ITERATION_2 180
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 179 && BOOST_PP_ITERATION_START_2 >= 179
+#    define BOOST_PP_ITERATION_2 179
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 178 && BOOST_PP_ITERATION_START_2 >= 178
+#    define BOOST_PP_ITERATION_2 178
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 177 && BOOST_PP_ITERATION_START_2 >= 177
+#    define BOOST_PP_ITERATION_2 177
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 176 && BOOST_PP_ITERATION_START_2 >= 176
+#    define BOOST_PP_ITERATION_2 176
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 175 && BOOST_PP_ITERATION_START_2 >= 175
+#    define BOOST_PP_ITERATION_2 175
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 174 && BOOST_PP_ITERATION_START_2 >= 174
+#    define BOOST_PP_ITERATION_2 174
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 173 && BOOST_PP_ITERATION_START_2 >= 173
+#    define BOOST_PP_ITERATION_2 173
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 172 && BOOST_PP_ITERATION_START_2 >= 172
+#    define BOOST_PP_ITERATION_2 172
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 171 && BOOST_PP_ITERATION_START_2 >= 171
+#    define BOOST_PP_ITERATION_2 171
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 170 && BOOST_PP_ITERATION_START_2 >= 170
+#    define BOOST_PP_ITERATION_2 170
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 169 && BOOST_PP_ITERATION_START_2 >= 169
+#    define BOOST_PP_ITERATION_2 169
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 168 && BOOST_PP_ITERATION_START_2 >= 168
+#    define BOOST_PP_ITERATION_2 168
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 167 && BOOST_PP_ITERATION_START_2 >= 167
+#    define BOOST_PP_ITERATION_2 167
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 166 && BOOST_PP_ITERATION_START_2 >= 166
+#    define BOOST_PP_ITERATION_2 166
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 165 && BOOST_PP_ITERATION_START_2 >= 165
+#    define BOOST_PP_ITERATION_2 165
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 164 && BOOST_PP_ITERATION_START_2 >= 164
+#    define BOOST_PP_ITERATION_2 164
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 163 && BOOST_PP_ITERATION_START_2 >= 163
+#    define BOOST_PP_ITERATION_2 163
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 162 && BOOST_PP_ITERATION_START_2 >= 162
+#    define BOOST_PP_ITERATION_2 162
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 161 && BOOST_PP_ITERATION_START_2 >= 161
+#    define BOOST_PP_ITERATION_2 161
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 160 && BOOST_PP_ITERATION_START_2 >= 160
+#    define BOOST_PP_ITERATION_2 160
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 159 && BOOST_PP_ITERATION_START_2 >= 159
+#    define BOOST_PP_ITERATION_2 159
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 158 && BOOST_PP_ITERATION_START_2 >= 158
+#    define BOOST_PP_ITERATION_2 158
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 157 && BOOST_PP_ITERATION_START_2 >= 157
+#    define BOOST_PP_ITERATION_2 157
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 156 && BOOST_PP_ITERATION_START_2 >= 156
+#    define BOOST_PP_ITERATION_2 156
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 155 && BOOST_PP_ITERATION_START_2 >= 155
+#    define BOOST_PP_ITERATION_2 155
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 154 && BOOST_PP_ITERATION_START_2 >= 154
+#    define BOOST_PP_ITERATION_2 154
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 153 && BOOST_PP_ITERATION_START_2 >= 153
+#    define BOOST_PP_ITERATION_2 153
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 152 && BOOST_PP_ITERATION_START_2 >= 152
+#    define BOOST_PP_ITERATION_2 152
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 151 && BOOST_PP_ITERATION_START_2 >= 151
+#    define BOOST_PP_ITERATION_2 151
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 150 && BOOST_PP_ITERATION_START_2 >= 150
+#    define BOOST_PP_ITERATION_2 150
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 149 && BOOST_PP_ITERATION_START_2 >= 149
+#    define BOOST_PP_ITERATION_2 149
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 148 && BOOST_PP_ITERATION_START_2 >= 148
+#    define BOOST_PP_ITERATION_2 148
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 147 && BOOST_PP_ITERATION_START_2 >= 147
+#    define BOOST_PP_ITERATION_2 147
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 146 && BOOST_PP_ITERATION_START_2 >= 146
+#    define BOOST_PP_ITERATION_2 146
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 145 && BOOST_PP_ITERATION_START_2 >= 145
+#    define BOOST_PP_ITERATION_2 145
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 144 && BOOST_PP_ITERATION_START_2 >= 144
+#    define BOOST_PP_ITERATION_2 144
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 143 && BOOST_PP_ITERATION_START_2 >= 143
+#    define BOOST_PP_ITERATION_2 143
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 142 && BOOST_PP_ITERATION_START_2 >= 142
+#    define BOOST_PP_ITERATION_2 142
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 141 && BOOST_PP_ITERATION_START_2 >= 141
+#    define BOOST_PP_ITERATION_2 141
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 140 && BOOST_PP_ITERATION_START_2 >= 140
+#    define BOOST_PP_ITERATION_2 140
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 139 && BOOST_PP_ITERATION_START_2 >= 139
+#    define BOOST_PP_ITERATION_2 139
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 138 && BOOST_PP_ITERATION_START_2 >= 138
+#    define BOOST_PP_ITERATION_2 138
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 137 && BOOST_PP_ITERATION_START_2 >= 137
+#    define BOOST_PP_ITERATION_2 137
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 136 && BOOST_PP_ITERATION_START_2 >= 136
+#    define BOOST_PP_ITERATION_2 136
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 135 && BOOST_PP_ITERATION_START_2 >= 135
+#    define BOOST_PP_ITERATION_2 135
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 134 && BOOST_PP_ITERATION_START_2 >= 134
+#    define BOOST_PP_ITERATION_2 134
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 133 && BOOST_PP_ITERATION_START_2 >= 133
+#    define BOOST_PP_ITERATION_2 133
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 132 && BOOST_PP_ITERATION_START_2 >= 132
+#    define BOOST_PP_ITERATION_2 132
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 131 && BOOST_PP_ITERATION_START_2 >= 131
+#    define BOOST_PP_ITERATION_2 131
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 130 && BOOST_PP_ITERATION_START_2 >= 130
+#    define BOOST_PP_ITERATION_2 130
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 129 && BOOST_PP_ITERATION_START_2 >= 129
+#    define BOOST_PP_ITERATION_2 129
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 128 && BOOST_PP_ITERATION_START_2 >= 128
+#    define BOOST_PP_ITERATION_2 128
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 127 && BOOST_PP_ITERATION_START_2 >= 127
+#    define BOOST_PP_ITERATION_2 127
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 126 && BOOST_PP_ITERATION_START_2 >= 126
+#    define BOOST_PP_ITERATION_2 126
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 125 && BOOST_PP_ITERATION_START_2 >= 125
+#    define BOOST_PP_ITERATION_2 125
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 124 && BOOST_PP_ITERATION_START_2 >= 124
+#    define BOOST_PP_ITERATION_2 124
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 123 && BOOST_PP_ITERATION_START_2 >= 123
+#    define BOOST_PP_ITERATION_2 123
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 122 && BOOST_PP_ITERATION_START_2 >= 122
+#    define BOOST_PP_ITERATION_2 122
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 121 && BOOST_PP_ITERATION_START_2 >= 121
+#    define BOOST_PP_ITERATION_2 121
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 120 && BOOST_PP_ITERATION_START_2 >= 120
+#    define BOOST_PP_ITERATION_2 120
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 119 && BOOST_PP_ITERATION_START_2 >= 119
+#    define BOOST_PP_ITERATION_2 119
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 118 && BOOST_PP_ITERATION_START_2 >= 118
+#    define BOOST_PP_ITERATION_2 118
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 117 && BOOST_PP_ITERATION_START_2 >= 117
+#    define BOOST_PP_ITERATION_2 117
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 116 && BOOST_PP_ITERATION_START_2 >= 116
+#    define BOOST_PP_ITERATION_2 116
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 115 && BOOST_PP_ITERATION_START_2 >= 115
+#    define BOOST_PP_ITERATION_2 115
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 114 && BOOST_PP_ITERATION_START_2 >= 114
+#    define BOOST_PP_ITERATION_2 114
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 113 && BOOST_PP_ITERATION_START_2 >= 113
+#    define BOOST_PP_ITERATION_2 113
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 112 && BOOST_PP_ITERATION_START_2 >= 112
+#    define BOOST_PP_ITERATION_2 112
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 111 && BOOST_PP_ITERATION_START_2 >= 111
+#    define BOOST_PP_ITERATION_2 111
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 110 && BOOST_PP_ITERATION_START_2 >= 110
+#    define BOOST_PP_ITERATION_2 110
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 109 && BOOST_PP_ITERATION_START_2 >= 109
+#    define BOOST_PP_ITERATION_2 109
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 108 && BOOST_PP_ITERATION_START_2 >= 108
+#    define BOOST_PP_ITERATION_2 108
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 107 && BOOST_PP_ITERATION_START_2 >= 107
+#    define BOOST_PP_ITERATION_2 107
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 106 && BOOST_PP_ITERATION_START_2 >= 106
+#    define BOOST_PP_ITERATION_2 106
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 105 && BOOST_PP_ITERATION_START_2 >= 105
+#    define BOOST_PP_ITERATION_2 105
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 104 && BOOST_PP_ITERATION_START_2 >= 104
+#    define BOOST_PP_ITERATION_2 104
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 103 && BOOST_PP_ITERATION_START_2 >= 103
+#    define BOOST_PP_ITERATION_2 103
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 102 && BOOST_PP_ITERATION_START_2 >= 102
+#    define BOOST_PP_ITERATION_2 102
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 101 && BOOST_PP_ITERATION_START_2 >= 101
+#    define BOOST_PP_ITERATION_2 101
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 100 && BOOST_PP_ITERATION_START_2 >= 100
+#    define BOOST_PP_ITERATION_2 100
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 99 && BOOST_PP_ITERATION_START_2 >= 99
+#    define BOOST_PP_ITERATION_2 99
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 98 && BOOST_PP_ITERATION_START_2 >= 98
+#    define BOOST_PP_ITERATION_2 98
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 97 && BOOST_PP_ITERATION_START_2 >= 97
+#    define BOOST_PP_ITERATION_2 97
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 96 && BOOST_PP_ITERATION_START_2 >= 96
+#    define BOOST_PP_ITERATION_2 96
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 95 && BOOST_PP_ITERATION_START_2 >= 95
+#    define BOOST_PP_ITERATION_2 95
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 94 && BOOST_PP_ITERATION_START_2 >= 94
+#    define BOOST_PP_ITERATION_2 94
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 93 && BOOST_PP_ITERATION_START_2 >= 93
+#    define BOOST_PP_ITERATION_2 93
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 92 && BOOST_PP_ITERATION_START_2 >= 92
+#    define BOOST_PP_ITERATION_2 92
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 91 && BOOST_PP_ITERATION_START_2 >= 91
+#    define BOOST_PP_ITERATION_2 91
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 90 && BOOST_PP_ITERATION_START_2 >= 90
+#    define BOOST_PP_ITERATION_2 90
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 89 && BOOST_PP_ITERATION_START_2 >= 89
+#    define BOOST_PP_ITERATION_2 89
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 88 && BOOST_PP_ITERATION_START_2 >= 88
+#    define BOOST_PP_ITERATION_2 88
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 87 && BOOST_PP_ITERATION_START_2 >= 87
+#    define BOOST_PP_ITERATION_2 87
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 86 && BOOST_PP_ITERATION_START_2 >= 86
+#    define BOOST_PP_ITERATION_2 86
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 85 && BOOST_PP_ITERATION_START_2 >= 85
+#    define BOOST_PP_ITERATION_2 85
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 84 && BOOST_PP_ITERATION_START_2 >= 84
+#    define BOOST_PP_ITERATION_2 84
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 83 && BOOST_PP_ITERATION_START_2 >= 83
+#    define BOOST_PP_ITERATION_2 83
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 82 && BOOST_PP_ITERATION_START_2 >= 82
+#    define BOOST_PP_ITERATION_2 82
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 81 && BOOST_PP_ITERATION_START_2 >= 81
+#    define BOOST_PP_ITERATION_2 81
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 80 && BOOST_PP_ITERATION_START_2 >= 80
+#    define BOOST_PP_ITERATION_2 80
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 79 && BOOST_PP_ITERATION_START_2 >= 79
+#    define BOOST_PP_ITERATION_2 79
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 78 && BOOST_PP_ITERATION_START_2 >= 78
+#    define BOOST_PP_ITERATION_2 78
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 77 && BOOST_PP_ITERATION_START_2 >= 77
+#    define BOOST_PP_ITERATION_2 77
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 76 && BOOST_PP_ITERATION_START_2 >= 76
+#    define BOOST_PP_ITERATION_2 76
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 75 && BOOST_PP_ITERATION_START_2 >= 75
+#    define BOOST_PP_ITERATION_2 75
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 74 && BOOST_PP_ITERATION_START_2 >= 74
+#    define BOOST_PP_ITERATION_2 74
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 73 && BOOST_PP_ITERATION_START_2 >= 73
+#    define BOOST_PP_ITERATION_2 73
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 72 && BOOST_PP_ITERATION_START_2 >= 72
+#    define BOOST_PP_ITERATION_2 72
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 71 && BOOST_PP_ITERATION_START_2 >= 71
+#    define BOOST_PP_ITERATION_2 71
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 70 && BOOST_PP_ITERATION_START_2 >= 70
+#    define BOOST_PP_ITERATION_2 70
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 69 && BOOST_PP_ITERATION_START_2 >= 69
+#    define BOOST_PP_ITERATION_2 69
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 68 && BOOST_PP_ITERATION_START_2 >= 68
+#    define BOOST_PP_ITERATION_2 68
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 67 && BOOST_PP_ITERATION_START_2 >= 67
+#    define BOOST_PP_ITERATION_2 67
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 66 && BOOST_PP_ITERATION_START_2 >= 66
+#    define BOOST_PP_ITERATION_2 66
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 65 && BOOST_PP_ITERATION_START_2 >= 65
+#    define BOOST_PP_ITERATION_2 65
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 64 && BOOST_PP_ITERATION_START_2 >= 64
+#    define BOOST_PP_ITERATION_2 64
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 63 && BOOST_PP_ITERATION_START_2 >= 63
+#    define BOOST_PP_ITERATION_2 63
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 62 && BOOST_PP_ITERATION_START_2 >= 62
+#    define BOOST_PP_ITERATION_2 62
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 61 && BOOST_PP_ITERATION_START_2 >= 61
+#    define BOOST_PP_ITERATION_2 61
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 60 && BOOST_PP_ITERATION_START_2 >= 60
+#    define BOOST_PP_ITERATION_2 60
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 59 && BOOST_PP_ITERATION_START_2 >= 59
+#    define BOOST_PP_ITERATION_2 59
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 58 && BOOST_PP_ITERATION_START_2 >= 58
+#    define BOOST_PP_ITERATION_2 58
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 57 && BOOST_PP_ITERATION_START_2 >= 57
+#    define BOOST_PP_ITERATION_2 57
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 56 && BOOST_PP_ITERATION_START_2 >= 56
+#    define BOOST_PP_ITERATION_2 56
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 55 && BOOST_PP_ITERATION_START_2 >= 55
+#    define BOOST_PP_ITERATION_2 55
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 54 && BOOST_PP_ITERATION_START_2 >= 54
+#    define BOOST_PP_ITERATION_2 54
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 53 && BOOST_PP_ITERATION_START_2 >= 53
+#    define BOOST_PP_ITERATION_2 53
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 52 && BOOST_PP_ITERATION_START_2 >= 52
+#    define BOOST_PP_ITERATION_2 52
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 51 && BOOST_PP_ITERATION_START_2 >= 51
+#    define BOOST_PP_ITERATION_2 51
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 50 && BOOST_PP_ITERATION_START_2 >= 50
+#    define BOOST_PP_ITERATION_2 50
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 49 && BOOST_PP_ITERATION_START_2 >= 49
+#    define BOOST_PP_ITERATION_2 49
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 48 && BOOST_PP_ITERATION_START_2 >= 48
+#    define BOOST_PP_ITERATION_2 48
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 47 && BOOST_PP_ITERATION_START_2 >= 47
+#    define BOOST_PP_ITERATION_2 47
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 46 && BOOST_PP_ITERATION_START_2 >= 46
+#    define BOOST_PP_ITERATION_2 46
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 45 && BOOST_PP_ITERATION_START_2 >= 45
+#    define BOOST_PP_ITERATION_2 45
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 44 && BOOST_PP_ITERATION_START_2 >= 44
+#    define BOOST_PP_ITERATION_2 44
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 43 && BOOST_PP_ITERATION_START_2 >= 43
+#    define BOOST_PP_ITERATION_2 43
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 42 && BOOST_PP_ITERATION_START_2 >= 42
+#    define BOOST_PP_ITERATION_2 42
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 41 && BOOST_PP_ITERATION_START_2 >= 41
+#    define BOOST_PP_ITERATION_2 41
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 40 && BOOST_PP_ITERATION_START_2 >= 40
+#    define BOOST_PP_ITERATION_2 40
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 39 && BOOST_PP_ITERATION_START_2 >= 39
+#    define BOOST_PP_ITERATION_2 39
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 38 && BOOST_PP_ITERATION_START_2 >= 38
+#    define BOOST_PP_ITERATION_2 38
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 37 && BOOST_PP_ITERATION_START_2 >= 37
+#    define BOOST_PP_ITERATION_2 37
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 36 && BOOST_PP_ITERATION_START_2 >= 36
+#    define BOOST_PP_ITERATION_2 36
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 35 && BOOST_PP_ITERATION_START_2 >= 35
+#    define BOOST_PP_ITERATION_2 35
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 34 && BOOST_PP_ITERATION_START_2 >= 34
+#    define BOOST_PP_ITERATION_2 34
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 33 && BOOST_PP_ITERATION_START_2 >= 33
+#    define BOOST_PP_ITERATION_2 33
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 32 && BOOST_PP_ITERATION_START_2 >= 32
+#    define BOOST_PP_ITERATION_2 32
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 31 && BOOST_PP_ITERATION_START_2 >= 31
+#    define BOOST_PP_ITERATION_2 31
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 30 && BOOST_PP_ITERATION_START_2 >= 30
+#    define BOOST_PP_ITERATION_2 30
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 29 && BOOST_PP_ITERATION_START_2 >= 29
+#    define BOOST_PP_ITERATION_2 29
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 28 && BOOST_PP_ITERATION_START_2 >= 28
+#    define BOOST_PP_ITERATION_2 28
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 27 && BOOST_PP_ITERATION_START_2 >= 27
+#    define BOOST_PP_ITERATION_2 27
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 26 && BOOST_PP_ITERATION_START_2 >= 26
+#    define BOOST_PP_ITERATION_2 26
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 25 && BOOST_PP_ITERATION_START_2 >= 25
+#    define BOOST_PP_ITERATION_2 25
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 24 && BOOST_PP_ITERATION_START_2 >= 24
+#    define BOOST_PP_ITERATION_2 24
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 23 && BOOST_PP_ITERATION_START_2 >= 23
+#    define BOOST_PP_ITERATION_2 23
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 22 && BOOST_PP_ITERATION_START_2 >= 22
+#    define BOOST_PP_ITERATION_2 22
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 21 && BOOST_PP_ITERATION_START_2 >= 21
+#    define BOOST_PP_ITERATION_2 21
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 20 && BOOST_PP_ITERATION_START_2 >= 20
+#    define BOOST_PP_ITERATION_2 20
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 19 && BOOST_PP_ITERATION_START_2 >= 19
+#    define BOOST_PP_ITERATION_2 19
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 18 && BOOST_PP_ITERATION_START_2 >= 18
+#    define BOOST_PP_ITERATION_2 18
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 17 && BOOST_PP_ITERATION_START_2 >= 17
+#    define BOOST_PP_ITERATION_2 17
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 16 && BOOST_PP_ITERATION_START_2 >= 16
+#    define BOOST_PP_ITERATION_2 16
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 15 && BOOST_PP_ITERATION_START_2 >= 15
+#    define BOOST_PP_ITERATION_2 15
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 14 && BOOST_PP_ITERATION_START_2 >= 14
+#    define BOOST_PP_ITERATION_2 14
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 13 && BOOST_PP_ITERATION_START_2 >= 13
+#    define BOOST_PP_ITERATION_2 13
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 12 && BOOST_PP_ITERATION_START_2 >= 12
+#    define BOOST_PP_ITERATION_2 12
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 11 && BOOST_PP_ITERATION_START_2 >= 11
+#    define BOOST_PP_ITERATION_2 11
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 10 && BOOST_PP_ITERATION_START_2 >= 10
+#    define BOOST_PP_ITERATION_2 10
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 9 && BOOST_PP_ITERATION_START_2 >= 9
+#    define BOOST_PP_ITERATION_2 9
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 8 && BOOST_PP_ITERATION_START_2 >= 8
+#    define BOOST_PP_ITERATION_2 8
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 7 && BOOST_PP_ITERATION_START_2 >= 7
+#    define BOOST_PP_ITERATION_2 7
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 6 && BOOST_PP_ITERATION_START_2 >= 6
+#    define BOOST_PP_ITERATION_2 6
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 5 && BOOST_PP_ITERATION_START_2 >= 5
+#    define BOOST_PP_ITERATION_2 5
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 4 && BOOST_PP_ITERATION_START_2 >= 4
+#    define BOOST_PP_ITERATION_2 4
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 3 && BOOST_PP_ITERATION_START_2 >= 3
+#    define BOOST_PP_ITERATION_2 3
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 2 && BOOST_PP_ITERATION_START_2 >= 2
+#    define BOOST_PP_ITERATION_2 2
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 1 && BOOST_PP_ITERATION_START_2 >= 1
+#    define BOOST_PP_ITERATION_2 1
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
+# if BOOST_PP_ITERATION_FINISH_2 <= 0 && BOOST_PP_ITERATION_START_2 >= 0
+#    define BOOST_PP_ITERATION_2 0
+#    include BOOST_PP_FILENAME_2
+#    undef BOOST_PP_ITERATION_2
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse3.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse3.hpp
new file mode 100644
index 0000000..0a65514
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse3.hpp
@@ -0,0 +1,1296 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_ITERATION_FINISH_3 <= 256 && BOOST_PP_ITERATION_START_3 >= 256
+#    define BOOST_PP_ITERATION_3 256
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 255 && BOOST_PP_ITERATION_START_3 >= 255
+#    define BOOST_PP_ITERATION_3 255
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 254 && BOOST_PP_ITERATION_START_3 >= 254
+#    define BOOST_PP_ITERATION_3 254
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 253 && BOOST_PP_ITERATION_START_3 >= 253
+#    define BOOST_PP_ITERATION_3 253
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 252 && BOOST_PP_ITERATION_START_3 >= 252
+#    define BOOST_PP_ITERATION_3 252
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 251 && BOOST_PP_ITERATION_START_3 >= 251
+#    define BOOST_PP_ITERATION_3 251
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 250 && BOOST_PP_ITERATION_START_3 >= 250
+#    define BOOST_PP_ITERATION_3 250
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 249 && BOOST_PP_ITERATION_START_3 >= 249
+#    define BOOST_PP_ITERATION_3 249
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 248 && BOOST_PP_ITERATION_START_3 >= 248
+#    define BOOST_PP_ITERATION_3 248
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 247 && BOOST_PP_ITERATION_START_3 >= 247
+#    define BOOST_PP_ITERATION_3 247
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 246 && BOOST_PP_ITERATION_START_3 >= 246
+#    define BOOST_PP_ITERATION_3 246
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 245 && BOOST_PP_ITERATION_START_3 >= 245
+#    define BOOST_PP_ITERATION_3 245
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 244 && BOOST_PP_ITERATION_START_3 >= 244
+#    define BOOST_PP_ITERATION_3 244
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 243 && BOOST_PP_ITERATION_START_3 >= 243
+#    define BOOST_PP_ITERATION_3 243
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 242 && BOOST_PP_ITERATION_START_3 >= 242
+#    define BOOST_PP_ITERATION_3 242
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 241 && BOOST_PP_ITERATION_START_3 >= 241
+#    define BOOST_PP_ITERATION_3 241
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 240 && BOOST_PP_ITERATION_START_3 >= 240
+#    define BOOST_PP_ITERATION_3 240
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 239 && BOOST_PP_ITERATION_START_3 >= 239
+#    define BOOST_PP_ITERATION_3 239
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 238 && BOOST_PP_ITERATION_START_3 >= 238
+#    define BOOST_PP_ITERATION_3 238
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 237 && BOOST_PP_ITERATION_START_3 >= 237
+#    define BOOST_PP_ITERATION_3 237
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 236 && BOOST_PP_ITERATION_START_3 >= 236
+#    define BOOST_PP_ITERATION_3 236
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 235 && BOOST_PP_ITERATION_START_3 >= 235
+#    define BOOST_PP_ITERATION_3 235
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 234 && BOOST_PP_ITERATION_START_3 >= 234
+#    define BOOST_PP_ITERATION_3 234
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 233 && BOOST_PP_ITERATION_START_3 >= 233
+#    define BOOST_PP_ITERATION_3 233
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 232 && BOOST_PP_ITERATION_START_3 >= 232
+#    define BOOST_PP_ITERATION_3 232
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 231 && BOOST_PP_ITERATION_START_3 >= 231
+#    define BOOST_PP_ITERATION_3 231
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 230 && BOOST_PP_ITERATION_START_3 >= 230
+#    define BOOST_PP_ITERATION_3 230
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 229 && BOOST_PP_ITERATION_START_3 >= 229
+#    define BOOST_PP_ITERATION_3 229
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 228 && BOOST_PP_ITERATION_START_3 >= 228
+#    define BOOST_PP_ITERATION_3 228
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 227 && BOOST_PP_ITERATION_START_3 >= 227
+#    define BOOST_PP_ITERATION_3 227
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 226 && BOOST_PP_ITERATION_START_3 >= 226
+#    define BOOST_PP_ITERATION_3 226
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 225 && BOOST_PP_ITERATION_START_3 >= 225
+#    define BOOST_PP_ITERATION_3 225
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 224 && BOOST_PP_ITERATION_START_3 >= 224
+#    define BOOST_PP_ITERATION_3 224
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 223 && BOOST_PP_ITERATION_START_3 >= 223
+#    define BOOST_PP_ITERATION_3 223
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 222 && BOOST_PP_ITERATION_START_3 >= 222
+#    define BOOST_PP_ITERATION_3 222
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 221 && BOOST_PP_ITERATION_START_3 >= 221
+#    define BOOST_PP_ITERATION_3 221
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 220 && BOOST_PP_ITERATION_START_3 >= 220
+#    define BOOST_PP_ITERATION_3 220
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 219 && BOOST_PP_ITERATION_START_3 >= 219
+#    define BOOST_PP_ITERATION_3 219
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 218 && BOOST_PP_ITERATION_START_3 >= 218
+#    define BOOST_PP_ITERATION_3 218
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 217 && BOOST_PP_ITERATION_START_3 >= 217
+#    define BOOST_PP_ITERATION_3 217
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 216 && BOOST_PP_ITERATION_START_3 >= 216
+#    define BOOST_PP_ITERATION_3 216
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 215 && BOOST_PP_ITERATION_START_3 >= 215
+#    define BOOST_PP_ITERATION_3 215
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 214 && BOOST_PP_ITERATION_START_3 >= 214
+#    define BOOST_PP_ITERATION_3 214
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 213 && BOOST_PP_ITERATION_START_3 >= 213
+#    define BOOST_PP_ITERATION_3 213
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 212 && BOOST_PP_ITERATION_START_3 >= 212
+#    define BOOST_PP_ITERATION_3 212
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 211 && BOOST_PP_ITERATION_START_3 >= 211
+#    define BOOST_PP_ITERATION_3 211
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 210 && BOOST_PP_ITERATION_START_3 >= 210
+#    define BOOST_PP_ITERATION_3 210
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 209 && BOOST_PP_ITERATION_START_3 >= 209
+#    define BOOST_PP_ITERATION_3 209
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 208 && BOOST_PP_ITERATION_START_3 >= 208
+#    define BOOST_PP_ITERATION_3 208
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 207 && BOOST_PP_ITERATION_START_3 >= 207
+#    define BOOST_PP_ITERATION_3 207
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 206 && BOOST_PP_ITERATION_START_3 >= 206
+#    define BOOST_PP_ITERATION_3 206
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 205 && BOOST_PP_ITERATION_START_3 >= 205
+#    define BOOST_PP_ITERATION_3 205
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 204 && BOOST_PP_ITERATION_START_3 >= 204
+#    define BOOST_PP_ITERATION_3 204
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 203 && BOOST_PP_ITERATION_START_3 >= 203
+#    define BOOST_PP_ITERATION_3 203
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 202 && BOOST_PP_ITERATION_START_3 >= 202
+#    define BOOST_PP_ITERATION_3 202
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 201 && BOOST_PP_ITERATION_START_3 >= 201
+#    define BOOST_PP_ITERATION_3 201
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 200 && BOOST_PP_ITERATION_START_3 >= 200
+#    define BOOST_PP_ITERATION_3 200
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 199 && BOOST_PP_ITERATION_START_3 >= 199
+#    define BOOST_PP_ITERATION_3 199
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 198 && BOOST_PP_ITERATION_START_3 >= 198
+#    define BOOST_PP_ITERATION_3 198
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 197 && BOOST_PP_ITERATION_START_3 >= 197
+#    define BOOST_PP_ITERATION_3 197
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 196 && BOOST_PP_ITERATION_START_3 >= 196
+#    define BOOST_PP_ITERATION_3 196
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 195 && BOOST_PP_ITERATION_START_3 >= 195
+#    define BOOST_PP_ITERATION_3 195
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 194 && BOOST_PP_ITERATION_START_3 >= 194
+#    define BOOST_PP_ITERATION_3 194
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 193 && BOOST_PP_ITERATION_START_3 >= 193
+#    define BOOST_PP_ITERATION_3 193
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 192 && BOOST_PP_ITERATION_START_3 >= 192
+#    define BOOST_PP_ITERATION_3 192
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 191 && BOOST_PP_ITERATION_START_3 >= 191
+#    define BOOST_PP_ITERATION_3 191
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 190 && BOOST_PP_ITERATION_START_3 >= 190
+#    define BOOST_PP_ITERATION_3 190
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 189 && BOOST_PP_ITERATION_START_3 >= 189
+#    define BOOST_PP_ITERATION_3 189
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 188 && BOOST_PP_ITERATION_START_3 >= 188
+#    define BOOST_PP_ITERATION_3 188
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 187 && BOOST_PP_ITERATION_START_3 >= 187
+#    define BOOST_PP_ITERATION_3 187
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 186 && BOOST_PP_ITERATION_START_3 >= 186
+#    define BOOST_PP_ITERATION_3 186
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 185 && BOOST_PP_ITERATION_START_3 >= 185
+#    define BOOST_PP_ITERATION_3 185
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 184 && BOOST_PP_ITERATION_START_3 >= 184
+#    define BOOST_PP_ITERATION_3 184
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 183 && BOOST_PP_ITERATION_START_3 >= 183
+#    define BOOST_PP_ITERATION_3 183
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 182 && BOOST_PP_ITERATION_START_3 >= 182
+#    define BOOST_PP_ITERATION_3 182
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 181 && BOOST_PP_ITERATION_START_3 >= 181
+#    define BOOST_PP_ITERATION_3 181
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 180 && BOOST_PP_ITERATION_START_3 >= 180
+#    define BOOST_PP_ITERATION_3 180
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 179 && BOOST_PP_ITERATION_START_3 >= 179
+#    define BOOST_PP_ITERATION_3 179
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 178 && BOOST_PP_ITERATION_START_3 >= 178
+#    define BOOST_PP_ITERATION_3 178
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 177 && BOOST_PP_ITERATION_START_3 >= 177
+#    define BOOST_PP_ITERATION_3 177
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 176 && BOOST_PP_ITERATION_START_3 >= 176
+#    define BOOST_PP_ITERATION_3 176
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 175 && BOOST_PP_ITERATION_START_3 >= 175
+#    define BOOST_PP_ITERATION_3 175
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 174 && BOOST_PP_ITERATION_START_3 >= 174
+#    define BOOST_PP_ITERATION_3 174
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 173 && BOOST_PP_ITERATION_START_3 >= 173
+#    define BOOST_PP_ITERATION_3 173
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 172 && BOOST_PP_ITERATION_START_3 >= 172
+#    define BOOST_PP_ITERATION_3 172
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 171 && BOOST_PP_ITERATION_START_3 >= 171
+#    define BOOST_PP_ITERATION_3 171
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 170 && BOOST_PP_ITERATION_START_3 >= 170
+#    define BOOST_PP_ITERATION_3 170
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 169 && BOOST_PP_ITERATION_START_3 >= 169
+#    define BOOST_PP_ITERATION_3 169
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 168 && BOOST_PP_ITERATION_START_3 >= 168
+#    define BOOST_PP_ITERATION_3 168
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 167 && BOOST_PP_ITERATION_START_3 >= 167
+#    define BOOST_PP_ITERATION_3 167
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 166 && BOOST_PP_ITERATION_START_3 >= 166
+#    define BOOST_PP_ITERATION_3 166
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 165 && BOOST_PP_ITERATION_START_3 >= 165
+#    define BOOST_PP_ITERATION_3 165
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 164 && BOOST_PP_ITERATION_START_3 >= 164
+#    define BOOST_PP_ITERATION_3 164
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 163 && BOOST_PP_ITERATION_START_3 >= 163
+#    define BOOST_PP_ITERATION_3 163
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 162 && BOOST_PP_ITERATION_START_3 >= 162
+#    define BOOST_PP_ITERATION_3 162
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 161 && BOOST_PP_ITERATION_START_3 >= 161
+#    define BOOST_PP_ITERATION_3 161
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 160 && BOOST_PP_ITERATION_START_3 >= 160
+#    define BOOST_PP_ITERATION_3 160
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 159 && BOOST_PP_ITERATION_START_3 >= 159
+#    define BOOST_PP_ITERATION_3 159
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 158 && BOOST_PP_ITERATION_START_3 >= 158
+#    define BOOST_PP_ITERATION_3 158
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 157 && BOOST_PP_ITERATION_START_3 >= 157
+#    define BOOST_PP_ITERATION_3 157
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 156 && BOOST_PP_ITERATION_START_3 >= 156
+#    define BOOST_PP_ITERATION_3 156
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 155 && BOOST_PP_ITERATION_START_3 >= 155
+#    define BOOST_PP_ITERATION_3 155
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 154 && BOOST_PP_ITERATION_START_3 >= 154
+#    define BOOST_PP_ITERATION_3 154
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 153 && BOOST_PP_ITERATION_START_3 >= 153
+#    define BOOST_PP_ITERATION_3 153
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 152 && BOOST_PP_ITERATION_START_3 >= 152
+#    define BOOST_PP_ITERATION_3 152
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 151 && BOOST_PP_ITERATION_START_3 >= 151
+#    define BOOST_PP_ITERATION_3 151
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 150 && BOOST_PP_ITERATION_START_3 >= 150
+#    define BOOST_PP_ITERATION_3 150
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 149 && BOOST_PP_ITERATION_START_3 >= 149
+#    define BOOST_PP_ITERATION_3 149
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 148 && BOOST_PP_ITERATION_START_3 >= 148
+#    define BOOST_PP_ITERATION_3 148
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 147 && BOOST_PP_ITERATION_START_3 >= 147
+#    define BOOST_PP_ITERATION_3 147
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 146 && BOOST_PP_ITERATION_START_3 >= 146
+#    define BOOST_PP_ITERATION_3 146
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 145 && BOOST_PP_ITERATION_START_3 >= 145
+#    define BOOST_PP_ITERATION_3 145
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 144 && BOOST_PP_ITERATION_START_3 >= 144
+#    define BOOST_PP_ITERATION_3 144
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 143 && BOOST_PP_ITERATION_START_3 >= 143
+#    define BOOST_PP_ITERATION_3 143
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 142 && BOOST_PP_ITERATION_START_3 >= 142
+#    define BOOST_PP_ITERATION_3 142
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 141 && BOOST_PP_ITERATION_START_3 >= 141
+#    define BOOST_PP_ITERATION_3 141
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 140 && BOOST_PP_ITERATION_START_3 >= 140
+#    define BOOST_PP_ITERATION_3 140
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 139 && BOOST_PP_ITERATION_START_3 >= 139
+#    define BOOST_PP_ITERATION_3 139
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 138 && BOOST_PP_ITERATION_START_3 >= 138
+#    define BOOST_PP_ITERATION_3 138
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 137 && BOOST_PP_ITERATION_START_3 >= 137
+#    define BOOST_PP_ITERATION_3 137
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 136 && BOOST_PP_ITERATION_START_3 >= 136
+#    define BOOST_PP_ITERATION_3 136
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 135 && BOOST_PP_ITERATION_START_3 >= 135
+#    define BOOST_PP_ITERATION_3 135
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 134 && BOOST_PP_ITERATION_START_3 >= 134
+#    define BOOST_PP_ITERATION_3 134
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 133 && BOOST_PP_ITERATION_START_3 >= 133
+#    define BOOST_PP_ITERATION_3 133
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 132 && BOOST_PP_ITERATION_START_3 >= 132
+#    define BOOST_PP_ITERATION_3 132
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 131 && BOOST_PP_ITERATION_START_3 >= 131
+#    define BOOST_PP_ITERATION_3 131
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 130 && BOOST_PP_ITERATION_START_3 >= 130
+#    define BOOST_PP_ITERATION_3 130
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 129 && BOOST_PP_ITERATION_START_3 >= 129
+#    define BOOST_PP_ITERATION_3 129
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 128 && BOOST_PP_ITERATION_START_3 >= 128
+#    define BOOST_PP_ITERATION_3 128
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 127 && BOOST_PP_ITERATION_START_3 >= 127
+#    define BOOST_PP_ITERATION_3 127
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 126 && BOOST_PP_ITERATION_START_3 >= 126
+#    define BOOST_PP_ITERATION_3 126
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 125 && BOOST_PP_ITERATION_START_3 >= 125
+#    define BOOST_PP_ITERATION_3 125
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 124 && BOOST_PP_ITERATION_START_3 >= 124
+#    define BOOST_PP_ITERATION_3 124
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 123 && BOOST_PP_ITERATION_START_3 >= 123
+#    define BOOST_PP_ITERATION_3 123
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 122 && BOOST_PP_ITERATION_START_3 >= 122
+#    define BOOST_PP_ITERATION_3 122
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 121 && BOOST_PP_ITERATION_START_3 >= 121
+#    define BOOST_PP_ITERATION_3 121
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 120 && BOOST_PP_ITERATION_START_3 >= 120
+#    define BOOST_PP_ITERATION_3 120
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 119 && BOOST_PP_ITERATION_START_3 >= 119
+#    define BOOST_PP_ITERATION_3 119
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 118 && BOOST_PP_ITERATION_START_3 >= 118
+#    define BOOST_PP_ITERATION_3 118
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 117 && BOOST_PP_ITERATION_START_3 >= 117
+#    define BOOST_PP_ITERATION_3 117
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 116 && BOOST_PP_ITERATION_START_3 >= 116
+#    define BOOST_PP_ITERATION_3 116
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 115 && BOOST_PP_ITERATION_START_3 >= 115
+#    define BOOST_PP_ITERATION_3 115
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 114 && BOOST_PP_ITERATION_START_3 >= 114
+#    define BOOST_PP_ITERATION_3 114
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 113 && BOOST_PP_ITERATION_START_3 >= 113
+#    define BOOST_PP_ITERATION_3 113
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 112 && BOOST_PP_ITERATION_START_3 >= 112
+#    define BOOST_PP_ITERATION_3 112
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 111 && BOOST_PP_ITERATION_START_3 >= 111
+#    define BOOST_PP_ITERATION_3 111
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 110 && BOOST_PP_ITERATION_START_3 >= 110
+#    define BOOST_PP_ITERATION_3 110
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 109 && BOOST_PP_ITERATION_START_3 >= 109
+#    define BOOST_PP_ITERATION_3 109
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 108 && BOOST_PP_ITERATION_START_3 >= 108
+#    define BOOST_PP_ITERATION_3 108
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 107 && BOOST_PP_ITERATION_START_3 >= 107
+#    define BOOST_PP_ITERATION_3 107
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 106 && BOOST_PP_ITERATION_START_3 >= 106
+#    define BOOST_PP_ITERATION_3 106
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 105 && BOOST_PP_ITERATION_START_3 >= 105
+#    define BOOST_PP_ITERATION_3 105
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 104 && BOOST_PP_ITERATION_START_3 >= 104
+#    define BOOST_PP_ITERATION_3 104
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 103 && BOOST_PP_ITERATION_START_3 >= 103
+#    define BOOST_PP_ITERATION_3 103
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 102 && BOOST_PP_ITERATION_START_3 >= 102
+#    define BOOST_PP_ITERATION_3 102
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 101 && BOOST_PP_ITERATION_START_3 >= 101
+#    define BOOST_PP_ITERATION_3 101
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 100 && BOOST_PP_ITERATION_START_3 >= 100
+#    define BOOST_PP_ITERATION_3 100
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 99 && BOOST_PP_ITERATION_START_3 >= 99
+#    define BOOST_PP_ITERATION_3 99
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 98 && BOOST_PP_ITERATION_START_3 >= 98
+#    define BOOST_PP_ITERATION_3 98
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 97 && BOOST_PP_ITERATION_START_3 >= 97
+#    define BOOST_PP_ITERATION_3 97
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 96 && BOOST_PP_ITERATION_START_3 >= 96
+#    define BOOST_PP_ITERATION_3 96
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 95 && BOOST_PP_ITERATION_START_3 >= 95
+#    define BOOST_PP_ITERATION_3 95
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 94 && BOOST_PP_ITERATION_START_3 >= 94
+#    define BOOST_PP_ITERATION_3 94
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 93 && BOOST_PP_ITERATION_START_3 >= 93
+#    define BOOST_PP_ITERATION_3 93
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 92 && BOOST_PP_ITERATION_START_3 >= 92
+#    define BOOST_PP_ITERATION_3 92
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 91 && BOOST_PP_ITERATION_START_3 >= 91
+#    define BOOST_PP_ITERATION_3 91
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 90 && BOOST_PP_ITERATION_START_3 >= 90
+#    define BOOST_PP_ITERATION_3 90
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 89 && BOOST_PP_ITERATION_START_3 >= 89
+#    define BOOST_PP_ITERATION_3 89
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 88 && BOOST_PP_ITERATION_START_3 >= 88
+#    define BOOST_PP_ITERATION_3 88
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 87 && BOOST_PP_ITERATION_START_3 >= 87
+#    define BOOST_PP_ITERATION_3 87
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 86 && BOOST_PP_ITERATION_START_3 >= 86
+#    define BOOST_PP_ITERATION_3 86
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 85 && BOOST_PP_ITERATION_START_3 >= 85
+#    define BOOST_PP_ITERATION_3 85
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 84 && BOOST_PP_ITERATION_START_3 >= 84
+#    define BOOST_PP_ITERATION_3 84
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 83 && BOOST_PP_ITERATION_START_3 >= 83
+#    define BOOST_PP_ITERATION_3 83
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 82 && BOOST_PP_ITERATION_START_3 >= 82
+#    define BOOST_PP_ITERATION_3 82
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 81 && BOOST_PP_ITERATION_START_3 >= 81
+#    define BOOST_PP_ITERATION_3 81
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 80 && BOOST_PP_ITERATION_START_3 >= 80
+#    define BOOST_PP_ITERATION_3 80
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 79 && BOOST_PP_ITERATION_START_3 >= 79
+#    define BOOST_PP_ITERATION_3 79
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 78 && BOOST_PP_ITERATION_START_3 >= 78
+#    define BOOST_PP_ITERATION_3 78
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 77 && BOOST_PP_ITERATION_START_3 >= 77
+#    define BOOST_PP_ITERATION_3 77
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 76 && BOOST_PP_ITERATION_START_3 >= 76
+#    define BOOST_PP_ITERATION_3 76
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 75 && BOOST_PP_ITERATION_START_3 >= 75
+#    define BOOST_PP_ITERATION_3 75
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 74 && BOOST_PP_ITERATION_START_3 >= 74
+#    define BOOST_PP_ITERATION_3 74
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 73 && BOOST_PP_ITERATION_START_3 >= 73
+#    define BOOST_PP_ITERATION_3 73
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 72 && BOOST_PP_ITERATION_START_3 >= 72
+#    define BOOST_PP_ITERATION_3 72
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 71 && BOOST_PP_ITERATION_START_3 >= 71
+#    define BOOST_PP_ITERATION_3 71
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 70 && BOOST_PP_ITERATION_START_3 >= 70
+#    define BOOST_PP_ITERATION_3 70
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 69 && BOOST_PP_ITERATION_START_3 >= 69
+#    define BOOST_PP_ITERATION_3 69
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 68 && BOOST_PP_ITERATION_START_3 >= 68
+#    define BOOST_PP_ITERATION_3 68
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 67 && BOOST_PP_ITERATION_START_3 >= 67
+#    define BOOST_PP_ITERATION_3 67
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 66 && BOOST_PP_ITERATION_START_3 >= 66
+#    define BOOST_PP_ITERATION_3 66
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 65 && BOOST_PP_ITERATION_START_3 >= 65
+#    define BOOST_PP_ITERATION_3 65
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 64 && BOOST_PP_ITERATION_START_3 >= 64
+#    define BOOST_PP_ITERATION_3 64
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 63 && BOOST_PP_ITERATION_START_3 >= 63
+#    define BOOST_PP_ITERATION_3 63
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 62 && BOOST_PP_ITERATION_START_3 >= 62
+#    define BOOST_PP_ITERATION_3 62
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 61 && BOOST_PP_ITERATION_START_3 >= 61
+#    define BOOST_PP_ITERATION_3 61
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 60 && BOOST_PP_ITERATION_START_3 >= 60
+#    define BOOST_PP_ITERATION_3 60
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 59 && BOOST_PP_ITERATION_START_3 >= 59
+#    define BOOST_PP_ITERATION_3 59
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 58 && BOOST_PP_ITERATION_START_3 >= 58
+#    define BOOST_PP_ITERATION_3 58
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 57 && BOOST_PP_ITERATION_START_3 >= 57
+#    define BOOST_PP_ITERATION_3 57
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 56 && BOOST_PP_ITERATION_START_3 >= 56
+#    define BOOST_PP_ITERATION_3 56
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 55 && BOOST_PP_ITERATION_START_3 >= 55
+#    define BOOST_PP_ITERATION_3 55
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 54 && BOOST_PP_ITERATION_START_3 >= 54
+#    define BOOST_PP_ITERATION_3 54
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 53 && BOOST_PP_ITERATION_START_3 >= 53
+#    define BOOST_PP_ITERATION_3 53
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 52 && BOOST_PP_ITERATION_START_3 >= 52
+#    define BOOST_PP_ITERATION_3 52
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 51 && BOOST_PP_ITERATION_START_3 >= 51
+#    define BOOST_PP_ITERATION_3 51
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 50 && BOOST_PP_ITERATION_START_3 >= 50
+#    define BOOST_PP_ITERATION_3 50
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 49 && BOOST_PP_ITERATION_START_3 >= 49
+#    define BOOST_PP_ITERATION_3 49
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 48 && BOOST_PP_ITERATION_START_3 >= 48
+#    define BOOST_PP_ITERATION_3 48
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 47 && BOOST_PP_ITERATION_START_3 >= 47
+#    define BOOST_PP_ITERATION_3 47
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 46 && BOOST_PP_ITERATION_START_3 >= 46
+#    define BOOST_PP_ITERATION_3 46
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 45 && BOOST_PP_ITERATION_START_3 >= 45
+#    define BOOST_PP_ITERATION_3 45
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 44 && BOOST_PP_ITERATION_START_3 >= 44
+#    define BOOST_PP_ITERATION_3 44
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 43 && BOOST_PP_ITERATION_START_3 >= 43
+#    define BOOST_PP_ITERATION_3 43
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 42 && BOOST_PP_ITERATION_START_3 >= 42
+#    define BOOST_PP_ITERATION_3 42
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 41 && BOOST_PP_ITERATION_START_3 >= 41
+#    define BOOST_PP_ITERATION_3 41
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 40 && BOOST_PP_ITERATION_START_3 >= 40
+#    define BOOST_PP_ITERATION_3 40
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 39 && BOOST_PP_ITERATION_START_3 >= 39
+#    define BOOST_PP_ITERATION_3 39
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 38 && BOOST_PP_ITERATION_START_3 >= 38
+#    define BOOST_PP_ITERATION_3 38
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 37 && BOOST_PP_ITERATION_START_3 >= 37
+#    define BOOST_PP_ITERATION_3 37
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 36 && BOOST_PP_ITERATION_START_3 >= 36
+#    define BOOST_PP_ITERATION_3 36
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 35 && BOOST_PP_ITERATION_START_3 >= 35
+#    define BOOST_PP_ITERATION_3 35
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 34 && BOOST_PP_ITERATION_START_3 >= 34
+#    define BOOST_PP_ITERATION_3 34
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 33 && BOOST_PP_ITERATION_START_3 >= 33
+#    define BOOST_PP_ITERATION_3 33
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 32 && BOOST_PP_ITERATION_START_3 >= 32
+#    define BOOST_PP_ITERATION_3 32
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 31 && BOOST_PP_ITERATION_START_3 >= 31
+#    define BOOST_PP_ITERATION_3 31
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 30 && BOOST_PP_ITERATION_START_3 >= 30
+#    define BOOST_PP_ITERATION_3 30
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 29 && BOOST_PP_ITERATION_START_3 >= 29
+#    define BOOST_PP_ITERATION_3 29
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 28 && BOOST_PP_ITERATION_START_3 >= 28
+#    define BOOST_PP_ITERATION_3 28
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 27 && BOOST_PP_ITERATION_START_3 >= 27
+#    define BOOST_PP_ITERATION_3 27
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 26 && BOOST_PP_ITERATION_START_3 >= 26
+#    define BOOST_PP_ITERATION_3 26
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 25 && BOOST_PP_ITERATION_START_3 >= 25
+#    define BOOST_PP_ITERATION_3 25
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 24 && BOOST_PP_ITERATION_START_3 >= 24
+#    define BOOST_PP_ITERATION_3 24
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 23 && BOOST_PP_ITERATION_START_3 >= 23
+#    define BOOST_PP_ITERATION_3 23
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 22 && BOOST_PP_ITERATION_START_3 >= 22
+#    define BOOST_PP_ITERATION_3 22
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 21 && BOOST_PP_ITERATION_START_3 >= 21
+#    define BOOST_PP_ITERATION_3 21
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 20 && BOOST_PP_ITERATION_START_3 >= 20
+#    define BOOST_PP_ITERATION_3 20
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 19 && BOOST_PP_ITERATION_START_3 >= 19
+#    define BOOST_PP_ITERATION_3 19
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 18 && BOOST_PP_ITERATION_START_3 >= 18
+#    define BOOST_PP_ITERATION_3 18
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 17 && BOOST_PP_ITERATION_START_3 >= 17
+#    define BOOST_PP_ITERATION_3 17
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 16 && BOOST_PP_ITERATION_START_3 >= 16
+#    define BOOST_PP_ITERATION_3 16
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 15 && BOOST_PP_ITERATION_START_3 >= 15
+#    define BOOST_PP_ITERATION_3 15
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 14 && BOOST_PP_ITERATION_START_3 >= 14
+#    define BOOST_PP_ITERATION_3 14
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 13 && BOOST_PP_ITERATION_START_3 >= 13
+#    define BOOST_PP_ITERATION_3 13
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 12 && BOOST_PP_ITERATION_START_3 >= 12
+#    define BOOST_PP_ITERATION_3 12
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 11 && BOOST_PP_ITERATION_START_3 >= 11
+#    define BOOST_PP_ITERATION_3 11
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 10 && BOOST_PP_ITERATION_START_3 >= 10
+#    define BOOST_PP_ITERATION_3 10
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 9 && BOOST_PP_ITERATION_START_3 >= 9
+#    define BOOST_PP_ITERATION_3 9
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 8 && BOOST_PP_ITERATION_START_3 >= 8
+#    define BOOST_PP_ITERATION_3 8
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 7 && BOOST_PP_ITERATION_START_3 >= 7
+#    define BOOST_PP_ITERATION_3 7
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 6 && BOOST_PP_ITERATION_START_3 >= 6
+#    define BOOST_PP_ITERATION_3 6
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 5 && BOOST_PP_ITERATION_START_3 >= 5
+#    define BOOST_PP_ITERATION_3 5
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 4 && BOOST_PP_ITERATION_START_3 >= 4
+#    define BOOST_PP_ITERATION_3 4
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 3 && BOOST_PP_ITERATION_START_3 >= 3
+#    define BOOST_PP_ITERATION_3 3
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 2 && BOOST_PP_ITERATION_START_3 >= 2
+#    define BOOST_PP_ITERATION_3 2
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 1 && BOOST_PP_ITERATION_START_3 >= 1
+#    define BOOST_PP_ITERATION_3 1
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
+# if BOOST_PP_ITERATION_FINISH_3 <= 0 && BOOST_PP_ITERATION_START_3 >= 0
+#    define BOOST_PP_ITERATION_3 0
+#    include BOOST_PP_FILENAME_3
+#    undef BOOST_PP_ITERATION_3
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse4.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse4.hpp
new file mode 100644
index 0000000..3bcfba0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse4.hpp
@@ -0,0 +1,1296 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_ITERATION_FINISH_4 <= 256 && BOOST_PP_ITERATION_START_4 >= 256
+#    define BOOST_PP_ITERATION_4 256
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 255 && BOOST_PP_ITERATION_START_4 >= 255
+#    define BOOST_PP_ITERATION_4 255
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 254 && BOOST_PP_ITERATION_START_4 >= 254
+#    define BOOST_PP_ITERATION_4 254
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 253 && BOOST_PP_ITERATION_START_4 >= 253
+#    define BOOST_PP_ITERATION_4 253
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 252 && BOOST_PP_ITERATION_START_4 >= 252
+#    define BOOST_PP_ITERATION_4 252
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 251 && BOOST_PP_ITERATION_START_4 >= 251
+#    define BOOST_PP_ITERATION_4 251
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 250 && BOOST_PP_ITERATION_START_4 >= 250
+#    define BOOST_PP_ITERATION_4 250
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 249 && BOOST_PP_ITERATION_START_4 >= 249
+#    define BOOST_PP_ITERATION_4 249
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 248 && BOOST_PP_ITERATION_START_4 >= 248
+#    define BOOST_PP_ITERATION_4 248
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 247 && BOOST_PP_ITERATION_START_4 >= 247
+#    define BOOST_PP_ITERATION_4 247
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 246 && BOOST_PP_ITERATION_START_4 >= 246
+#    define BOOST_PP_ITERATION_4 246
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 245 && BOOST_PP_ITERATION_START_4 >= 245
+#    define BOOST_PP_ITERATION_4 245
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 244 && BOOST_PP_ITERATION_START_4 >= 244
+#    define BOOST_PP_ITERATION_4 244
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 243 && BOOST_PP_ITERATION_START_4 >= 243
+#    define BOOST_PP_ITERATION_4 243
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 242 && BOOST_PP_ITERATION_START_4 >= 242
+#    define BOOST_PP_ITERATION_4 242
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 241 && BOOST_PP_ITERATION_START_4 >= 241
+#    define BOOST_PP_ITERATION_4 241
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 240 && BOOST_PP_ITERATION_START_4 >= 240
+#    define BOOST_PP_ITERATION_4 240
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 239 && BOOST_PP_ITERATION_START_4 >= 239
+#    define BOOST_PP_ITERATION_4 239
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 238 && BOOST_PP_ITERATION_START_4 >= 238
+#    define BOOST_PP_ITERATION_4 238
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 237 && BOOST_PP_ITERATION_START_4 >= 237
+#    define BOOST_PP_ITERATION_4 237
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 236 && BOOST_PP_ITERATION_START_4 >= 236
+#    define BOOST_PP_ITERATION_4 236
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 235 && BOOST_PP_ITERATION_START_4 >= 235
+#    define BOOST_PP_ITERATION_4 235
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 234 && BOOST_PP_ITERATION_START_4 >= 234
+#    define BOOST_PP_ITERATION_4 234
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 233 && BOOST_PP_ITERATION_START_4 >= 233
+#    define BOOST_PP_ITERATION_4 233
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 232 && BOOST_PP_ITERATION_START_4 >= 232
+#    define BOOST_PP_ITERATION_4 232
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 231 && BOOST_PP_ITERATION_START_4 >= 231
+#    define BOOST_PP_ITERATION_4 231
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 230 && BOOST_PP_ITERATION_START_4 >= 230
+#    define BOOST_PP_ITERATION_4 230
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 229 && BOOST_PP_ITERATION_START_4 >= 229
+#    define BOOST_PP_ITERATION_4 229
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 228 && BOOST_PP_ITERATION_START_4 >= 228
+#    define BOOST_PP_ITERATION_4 228
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 227 && BOOST_PP_ITERATION_START_4 >= 227
+#    define BOOST_PP_ITERATION_4 227
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 226 && BOOST_PP_ITERATION_START_4 >= 226
+#    define BOOST_PP_ITERATION_4 226
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 225 && BOOST_PP_ITERATION_START_4 >= 225
+#    define BOOST_PP_ITERATION_4 225
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 224 && BOOST_PP_ITERATION_START_4 >= 224
+#    define BOOST_PP_ITERATION_4 224
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 223 && BOOST_PP_ITERATION_START_4 >= 223
+#    define BOOST_PP_ITERATION_4 223
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 222 && BOOST_PP_ITERATION_START_4 >= 222
+#    define BOOST_PP_ITERATION_4 222
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 221 && BOOST_PP_ITERATION_START_4 >= 221
+#    define BOOST_PP_ITERATION_4 221
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 220 && BOOST_PP_ITERATION_START_4 >= 220
+#    define BOOST_PP_ITERATION_4 220
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 219 && BOOST_PP_ITERATION_START_4 >= 219
+#    define BOOST_PP_ITERATION_4 219
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 218 && BOOST_PP_ITERATION_START_4 >= 218
+#    define BOOST_PP_ITERATION_4 218
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 217 && BOOST_PP_ITERATION_START_4 >= 217
+#    define BOOST_PP_ITERATION_4 217
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 216 && BOOST_PP_ITERATION_START_4 >= 216
+#    define BOOST_PP_ITERATION_4 216
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 215 && BOOST_PP_ITERATION_START_4 >= 215
+#    define BOOST_PP_ITERATION_4 215
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 214 && BOOST_PP_ITERATION_START_4 >= 214
+#    define BOOST_PP_ITERATION_4 214
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 213 && BOOST_PP_ITERATION_START_4 >= 213
+#    define BOOST_PP_ITERATION_4 213
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 212 && BOOST_PP_ITERATION_START_4 >= 212
+#    define BOOST_PP_ITERATION_4 212
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 211 && BOOST_PP_ITERATION_START_4 >= 211
+#    define BOOST_PP_ITERATION_4 211
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 210 && BOOST_PP_ITERATION_START_4 >= 210
+#    define BOOST_PP_ITERATION_4 210
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 209 && BOOST_PP_ITERATION_START_4 >= 209
+#    define BOOST_PP_ITERATION_4 209
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 208 && BOOST_PP_ITERATION_START_4 >= 208
+#    define BOOST_PP_ITERATION_4 208
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 207 && BOOST_PP_ITERATION_START_4 >= 207
+#    define BOOST_PP_ITERATION_4 207
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 206 && BOOST_PP_ITERATION_START_4 >= 206
+#    define BOOST_PP_ITERATION_4 206
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 205 && BOOST_PP_ITERATION_START_4 >= 205
+#    define BOOST_PP_ITERATION_4 205
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 204 && BOOST_PP_ITERATION_START_4 >= 204
+#    define BOOST_PP_ITERATION_4 204
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 203 && BOOST_PP_ITERATION_START_4 >= 203
+#    define BOOST_PP_ITERATION_4 203
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 202 && BOOST_PP_ITERATION_START_4 >= 202
+#    define BOOST_PP_ITERATION_4 202
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 201 && BOOST_PP_ITERATION_START_4 >= 201
+#    define BOOST_PP_ITERATION_4 201
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 200 && BOOST_PP_ITERATION_START_4 >= 200
+#    define BOOST_PP_ITERATION_4 200
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 199 && BOOST_PP_ITERATION_START_4 >= 199
+#    define BOOST_PP_ITERATION_4 199
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 198 && BOOST_PP_ITERATION_START_4 >= 198
+#    define BOOST_PP_ITERATION_4 198
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 197 && BOOST_PP_ITERATION_START_4 >= 197
+#    define BOOST_PP_ITERATION_4 197
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 196 && BOOST_PP_ITERATION_START_4 >= 196
+#    define BOOST_PP_ITERATION_4 196
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 195 && BOOST_PP_ITERATION_START_4 >= 195
+#    define BOOST_PP_ITERATION_4 195
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 194 && BOOST_PP_ITERATION_START_4 >= 194
+#    define BOOST_PP_ITERATION_4 194
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 193 && BOOST_PP_ITERATION_START_4 >= 193
+#    define BOOST_PP_ITERATION_4 193
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 192 && BOOST_PP_ITERATION_START_4 >= 192
+#    define BOOST_PP_ITERATION_4 192
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 191 && BOOST_PP_ITERATION_START_4 >= 191
+#    define BOOST_PP_ITERATION_4 191
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 190 && BOOST_PP_ITERATION_START_4 >= 190
+#    define BOOST_PP_ITERATION_4 190
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 189 && BOOST_PP_ITERATION_START_4 >= 189
+#    define BOOST_PP_ITERATION_4 189
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 188 && BOOST_PP_ITERATION_START_4 >= 188
+#    define BOOST_PP_ITERATION_4 188
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 187 && BOOST_PP_ITERATION_START_4 >= 187
+#    define BOOST_PP_ITERATION_4 187
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 186 && BOOST_PP_ITERATION_START_4 >= 186
+#    define BOOST_PP_ITERATION_4 186
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 185 && BOOST_PP_ITERATION_START_4 >= 185
+#    define BOOST_PP_ITERATION_4 185
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 184 && BOOST_PP_ITERATION_START_4 >= 184
+#    define BOOST_PP_ITERATION_4 184
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 183 && BOOST_PP_ITERATION_START_4 >= 183
+#    define BOOST_PP_ITERATION_4 183
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 182 && BOOST_PP_ITERATION_START_4 >= 182
+#    define BOOST_PP_ITERATION_4 182
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 181 && BOOST_PP_ITERATION_START_4 >= 181
+#    define BOOST_PP_ITERATION_4 181
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 180 && BOOST_PP_ITERATION_START_4 >= 180
+#    define BOOST_PP_ITERATION_4 180
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 179 && BOOST_PP_ITERATION_START_4 >= 179
+#    define BOOST_PP_ITERATION_4 179
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 178 && BOOST_PP_ITERATION_START_4 >= 178
+#    define BOOST_PP_ITERATION_4 178
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 177 && BOOST_PP_ITERATION_START_4 >= 177
+#    define BOOST_PP_ITERATION_4 177
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 176 && BOOST_PP_ITERATION_START_4 >= 176
+#    define BOOST_PP_ITERATION_4 176
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 175 && BOOST_PP_ITERATION_START_4 >= 175
+#    define BOOST_PP_ITERATION_4 175
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 174 && BOOST_PP_ITERATION_START_4 >= 174
+#    define BOOST_PP_ITERATION_4 174
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 173 && BOOST_PP_ITERATION_START_4 >= 173
+#    define BOOST_PP_ITERATION_4 173
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 172 && BOOST_PP_ITERATION_START_4 >= 172
+#    define BOOST_PP_ITERATION_4 172
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 171 && BOOST_PP_ITERATION_START_4 >= 171
+#    define BOOST_PP_ITERATION_4 171
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 170 && BOOST_PP_ITERATION_START_4 >= 170
+#    define BOOST_PP_ITERATION_4 170
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 169 && BOOST_PP_ITERATION_START_4 >= 169
+#    define BOOST_PP_ITERATION_4 169
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 168 && BOOST_PP_ITERATION_START_4 >= 168
+#    define BOOST_PP_ITERATION_4 168
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 167 && BOOST_PP_ITERATION_START_4 >= 167
+#    define BOOST_PP_ITERATION_4 167
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 166 && BOOST_PP_ITERATION_START_4 >= 166
+#    define BOOST_PP_ITERATION_4 166
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 165 && BOOST_PP_ITERATION_START_4 >= 165
+#    define BOOST_PP_ITERATION_4 165
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 164 && BOOST_PP_ITERATION_START_4 >= 164
+#    define BOOST_PP_ITERATION_4 164
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 163 && BOOST_PP_ITERATION_START_4 >= 163
+#    define BOOST_PP_ITERATION_4 163
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 162 && BOOST_PP_ITERATION_START_4 >= 162
+#    define BOOST_PP_ITERATION_4 162
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 161 && BOOST_PP_ITERATION_START_4 >= 161
+#    define BOOST_PP_ITERATION_4 161
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 160 && BOOST_PP_ITERATION_START_4 >= 160
+#    define BOOST_PP_ITERATION_4 160
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 159 && BOOST_PP_ITERATION_START_4 >= 159
+#    define BOOST_PP_ITERATION_4 159
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 158 && BOOST_PP_ITERATION_START_4 >= 158
+#    define BOOST_PP_ITERATION_4 158
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 157 && BOOST_PP_ITERATION_START_4 >= 157
+#    define BOOST_PP_ITERATION_4 157
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 156 && BOOST_PP_ITERATION_START_4 >= 156
+#    define BOOST_PP_ITERATION_4 156
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 155 && BOOST_PP_ITERATION_START_4 >= 155
+#    define BOOST_PP_ITERATION_4 155
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 154 && BOOST_PP_ITERATION_START_4 >= 154
+#    define BOOST_PP_ITERATION_4 154
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 153 && BOOST_PP_ITERATION_START_4 >= 153
+#    define BOOST_PP_ITERATION_4 153
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 152 && BOOST_PP_ITERATION_START_4 >= 152
+#    define BOOST_PP_ITERATION_4 152
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 151 && BOOST_PP_ITERATION_START_4 >= 151
+#    define BOOST_PP_ITERATION_4 151
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 150 && BOOST_PP_ITERATION_START_4 >= 150
+#    define BOOST_PP_ITERATION_4 150
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 149 && BOOST_PP_ITERATION_START_4 >= 149
+#    define BOOST_PP_ITERATION_4 149
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 148 && BOOST_PP_ITERATION_START_4 >= 148
+#    define BOOST_PP_ITERATION_4 148
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 147 && BOOST_PP_ITERATION_START_4 >= 147
+#    define BOOST_PP_ITERATION_4 147
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 146 && BOOST_PP_ITERATION_START_4 >= 146
+#    define BOOST_PP_ITERATION_4 146
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 145 && BOOST_PP_ITERATION_START_4 >= 145
+#    define BOOST_PP_ITERATION_4 145
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 144 && BOOST_PP_ITERATION_START_4 >= 144
+#    define BOOST_PP_ITERATION_4 144
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 143 && BOOST_PP_ITERATION_START_4 >= 143
+#    define BOOST_PP_ITERATION_4 143
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 142 && BOOST_PP_ITERATION_START_4 >= 142
+#    define BOOST_PP_ITERATION_4 142
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 141 && BOOST_PP_ITERATION_START_4 >= 141
+#    define BOOST_PP_ITERATION_4 141
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 140 && BOOST_PP_ITERATION_START_4 >= 140
+#    define BOOST_PP_ITERATION_4 140
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 139 && BOOST_PP_ITERATION_START_4 >= 139
+#    define BOOST_PP_ITERATION_4 139
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 138 && BOOST_PP_ITERATION_START_4 >= 138
+#    define BOOST_PP_ITERATION_4 138
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 137 && BOOST_PP_ITERATION_START_4 >= 137
+#    define BOOST_PP_ITERATION_4 137
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 136 && BOOST_PP_ITERATION_START_4 >= 136
+#    define BOOST_PP_ITERATION_4 136
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 135 && BOOST_PP_ITERATION_START_4 >= 135
+#    define BOOST_PP_ITERATION_4 135
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 134 && BOOST_PP_ITERATION_START_4 >= 134
+#    define BOOST_PP_ITERATION_4 134
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 133 && BOOST_PP_ITERATION_START_4 >= 133
+#    define BOOST_PP_ITERATION_4 133
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 132 && BOOST_PP_ITERATION_START_4 >= 132
+#    define BOOST_PP_ITERATION_4 132
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 131 && BOOST_PP_ITERATION_START_4 >= 131
+#    define BOOST_PP_ITERATION_4 131
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 130 && BOOST_PP_ITERATION_START_4 >= 130
+#    define BOOST_PP_ITERATION_4 130
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 129 && BOOST_PP_ITERATION_START_4 >= 129
+#    define BOOST_PP_ITERATION_4 129
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 128 && BOOST_PP_ITERATION_START_4 >= 128
+#    define BOOST_PP_ITERATION_4 128
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 127 && BOOST_PP_ITERATION_START_4 >= 127
+#    define BOOST_PP_ITERATION_4 127
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 126 && BOOST_PP_ITERATION_START_4 >= 126
+#    define BOOST_PP_ITERATION_4 126
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 125 && BOOST_PP_ITERATION_START_4 >= 125
+#    define BOOST_PP_ITERATION_4 125
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 124 && BOOST_PP_ITERATION_START_4 >= 124
+#    define BOOST_PP_ITERATION_4 124
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 123 && BOOST_PP_ITERATION_START_4 >= 123
+#    define BOOST_PP_ITERATION_4 123
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 122 && BOOST_PP_ITERATION_START_4 >= 122
+#    define BOOST_PP_ITERATION_4 122
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 121 && BOOST_PP_ITERATION_START_4 >= 121
+#    define BOOST_PP_ITERATION_4 121
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 120 && BOOST_PP_ITERATION_START_4 >= 120
+#    define BOOST_PP_ITERATION_4 120
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 119 && BOOST_PP_ITERATION_START_4 >= 119
+#    define BOOST_PP_ITERATION_4 119
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 118 && BOOST_PP_ITERATION_START_4 >= 118
+#    define BOOST_PP_ITERATION_4 118
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 117 && BOOST_PP_ITERATION_START_4 >= 117
+#    define BOOST_PP_ITERATION_4 117
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 116 && BOOST_PP_ITERATION_START_4 >= 116
+#    define BOOST_PP_ITERATION_4 116
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 115 && BOOST_PP_ITERATION_START_4 >= 115
+#    define BOOST_PP_ITERATION_4 115
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 114 && BOOST_PP_ITERATION_START_4 >= 114
+#    define BOOST_PP_ITERATION_4 114
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 113 && BOOST_PP_ITERATION_START_4 >= 113
+#    define BOOST_PP_ITERATION_4 113
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 112 && BOOST_PP_ITERATION_START_4 >= 112
+#    define BOOST_PP_ITERATION_4 112
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 111 && BOOST_PP_ITERATION_START_4 >= 111
+#    define BOOST_PP_ITERATION_4 111
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 110 && BOOST_PP_ITERATION_START_4 >= 110
+#    define BOOST_PP_ITERATION_4 110
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 109 && BOOST_PP_ITERATION_START_4 >= 109
+#    define BOOST_PP_ITERATION_4 109
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 108 && BOOST_PP_ITERATION_START_4 >= 108
+#    define BOOST_PP_ITERATION_4 108
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 107 && BOOST_PP_ITERATION_START_4 >= 107
+#    define BOOST_PP_ITERATION_4 107
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 106 && BOOST_PP_ITERATION_START_4 >= 106
+#    define BOOST_PP_ITERATION_4 106
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 105 && BOOST_PP_ITERATION_START_4 >= 105
+#    define BOOST_PP_ITERATION_4 105
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 104 && BOOST_PP_ITERATION_START_4 >= 104
+#    define BOOST_PP_ITERATION_4 104
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 103 && BOOST_PP_ITERATION_START_4 >= 103
+#    define BOOST_PP_ITERATION_4 103
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 102 && BOOST_PP_ITERATION_START_4 >= 102
+#    define BOOST_PP_ITERATION_4 102
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 101 && BOOST_PP_ITERATION_START_4 >= 101
+#    define BOOST_PP_ITERATION_4 101
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 100 && BOOST_PP_ITERATION_START_4 >= 100
+#    define BOOST_PP_ITERATION_4 100
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 99 && BOOST_PP_ITERATION_START_4 >= 99
+#    define BOOST_PP_ITERATION_4 99
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 98 && BOOST_PP_ITERATION_START_4 >= 98
+#    define BOOST_PP_ITERATION_4 98
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 97 && BOOST_PP_ITERATION_START_4 >= 97
+#    define BOOST_PP_ITERATION_4 97
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 96 && BOOST_PP_ITERATION_START_4 >= 96
+#    define BOOST_PP_ITERATION_4 96
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 95 && BOOST_PP_ITERATION_START_4 >= 95
+#    define BOOST_PP_ITERATION_4 95
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 94 && BOOST_PP_ITERATION_START_4 >= 94
+#    define BOOST_PP_ITERATION_4 94
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 93 && BOOST_PP_ITERATION_START_4 >= 93
+#    define BOOST_PP_ITERATION_4 93
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 92 && BOOST_PP_ITERATION_START_4 >= 92
+#    define BOOST_PP_ITERATION_4 92
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 91 && BOOST_PP_ITERATION_START_4 >= 91
+#    define BOOST_PP_ITERATION_4 91
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 90 && BOOST_PP_ITERATION_START_4 >= 90
+#    define BOOST_PP_ITERATION_4 90
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 89 && BOOST_PP_ITERATION_START_4 >= 89
+#    define BOOST_PP_ITERATION_4 89
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 88 && BOOST_PP_ITERATION_START_4 >= 88
+#    define BOOST_PP_ITERATION_4 88
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 87 && BOOST_PP_ITERATION_START_4 >= 87
+#    define BOOST_PP_ITERATION_4 87
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 86 && BOOST_PP_ITERATION_START_4 >= 86
+#    define BOOST_PP_ITERATION_4 86
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 85 && BOOST_PP_ITERATION_START_4 >= 85
+#    define BOOST_PP_ITERATION_4 85
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 84 && BOOST_PP_ITERATION_START_4 >= 84
+#    define BOOST_PP_ITERATION_4 84
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 83 && BOOST_PP_ITERATION_START_4 >= 83
+#    define BOOST_PP_ITERATION_4 83
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 82 && BOOST_PP_ITERATION_START_4 >= 82
+#    define BOOST_PP_ITERATION_4 82
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 81 && BOOST_PP_ITERATION_START_4 >= 81
+#    define BOOST_PP_ITERATION_4 81
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 80 && BOOST_PP_ITERATION_START_4 >= 80
+#    define BOOST_PP_ITERATION_4 80
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 79 && BOOST_PP_ITERATION_START_4 >= 79
+#    define BOOST_PP_ITERATION_4 79
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 78 && BOOST_PP_ITERATION_START_4 >= 78
+#    define BOOST_PP_ITERATION_4 78
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 77 && BOOST_PP_ITERATION_START_4 >= 77
+#    define BOOST_PP_ITERATION_4 77
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 76 && BOOST_PP_ITERATION_START_4 >= 76
+#    define BOOST_PP_ITERATION_4 76
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 75 && BOOST_PP_ITERATION_START_4 >= 75
+#    define BOOST_PP_ITERATION_4 75
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 74 && BOOST_PP_ITERATION_START_4 >= 74
+#    define BOOST_PP_ITERATION_4 74
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 73 && BOOST_PP_ITERATION_START_4 >= 73
+#    define BOOST_PP_ITERATION_4 73
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 72 && BOOST_PP_ITERATION_START_4 >= 72
+#    define BOOST_PP_ITERATION_4 72
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 71 && BOOST_PP_ITERATION_START_4 >= 71
+#    define BOOST_PP_ITERATION_4 71
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 70 && BOOST_PP_ITERATION_START_4 >= 70
+#    define BOOST_PP_ITERATION_4 70
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 69 && BOOST_PP_ITERATION_START_4 >= 69
+#    define BOOST_PP_ITERATION_4 69
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 68 && BOOST_PP_ITERATION_START_4 >= 68
+#    define BOOST_PP_ITERATION_4 68
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 67 && BOOST_PP_ITERATION_START_4 >= 67
+#    define BOOST_PP_ITERATION_4 67
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 66 && BOOST_PP_ITERATION_START_4 >= 66
+#    define BOOST_PP_ITERATION_4 66
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 65 && BOOST_PP_ITERATION_START_4 >= 65
+#    define BOOST_PP_ITERATION_4 65
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 64 && BOOST_PP_ITERATION_START_4 >= 64
+#    define BOOST_PP_ITERATION_4 64
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 63 && BOOST_PP_ITERATION_START_4 >= 63
+#    define BOOST_PP_ITERATION_4 63
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 62 && BOOST_PP_ITERATION_START_4 >= 62
+#    define BOOST_PP_ITERATION_4 62
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 61 && BOOST_PP_ITERATION_START_4 >= 61
+#    define BOOST_PP_ITERATION_4 61
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 60 && BOOST_PP_ITERATION_START_4 >= 60
+#    define BOOST_PP_ITERATION_4 60
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 59 && BOOST_PP_ITERATION_START_4 >= 59
+#    define BOOST_PP_ITERATION_4 59
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 58 && BOOST_PP_ITERATION_START_4 >= 58
+#    define BOOST_PP_ITERATION_4 58
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 57 && BOOST_PP_ITERATION_START_4 >= 57
+#    define BOOST_PP_ITERATION_4 57
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 56 && BOOST_PP_ITERATION_START_4 >= 56
+#    define BOOST_PP_ITERATION_4 56
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 55 && BOOST_PP_ITERATION_START_4 >= 55
+#    define BOOST_PP_ITERATION_4 55
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 54 && BOOST_PP_ITERATION_START_4 >= 54
+#    define BOOST_PP_ITERATION_4 54
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 53 && BOOST_PP_ITERATION_START_4 >= 53
+#    define BOOST_PP_ITERATION_4 53
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 52 && BOOST_PP_ITERATION_START_4 >= 52
+#    define BOOST_PP_ITERATION_4 52
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 51 && BOOST_PP_ITERATION_START_4 >= 51
+#    define BOOST_PP_ITERATION_4 51
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 50 && BOOST_PP_ITERATION_START_4 >= 50
+#    define BOOST_PP_ITERATION_4 50
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 49 && BOOST_PP_ITERATION_START_4 >= 49
+#    define BOOST_PP_ITERATION_4 49
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 48 && BOOST_PP_ITERATION_START_4 >= 48
+#    define BOOST_PP_ITERATION_4 48
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 47 && BOOST_PP_ITERATION_START_4 >= 47
+#    define BOOST_PP_ITERATION_4 47
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 46 && BOOST_PP_ITERATION_START_4 >= 46
+#    define BOOST_PP_ITERATION_4 46
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 45 && BOOST_PP_ITERATION_START_4 >= 45
+#    define BOOST_PP_ITERATION_4 45
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 44 && BOOST_PP_ITERATION_START_4 >= 44
+#    define BOOST_PP_ITERATION_4 44
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 43 && BOOST_PP_ITERATION_START_4 >= 43
+#    define BOOST_PP_ITERATION_4 43
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 42 && BOOST_PP_ITERATION_START_4 >= 42
+#    define BOOST_PP_ITERATION_4 42
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 41 && BOOST_PP_ITERATION_START_4 >= 41
+#    define BOOST_PP_ITERATION_4 41
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 40 && BOOST_PP_ITERATION_START_4 >= 40
+#    define BOOST_PP_ITERATION_4 40
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 39 && BOOST_PP_ITERATION_START_4 >= 39
+#    define BOOST_PP_ITERATION_4 39
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 38 && BOOST_PP_ITERATION_START_4 >= 38
+#    define BOOST_PP_ITERATION_4 38
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 37 && BOOST_PP_ITERATION_START_4 >= 37
+#    define BOOST_PP_ITERATION_4 37
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 36 && BOOST_PP_ITERATION_START_4 >= 36
+#    define BOOST_PP_ITERATION_4 36
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 35 && BOOST_PP_ITERATION_START_4 >= 35
+#    define BOOST_PP_ITERATION_4 35
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 34 && BOOST_PP_ITERATION_START_4 >= 34
+#    define BOOST_PP_ITERATION_4 34
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 33 && BOOST_PP_ITERATION_START_4 >= 33
+#    define BOOST_PP_ITERATION_4 33
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 32 && BOOST_PP_ITERATION_START_4 >= 32
+#    define BOOST_PP_ITERATION_4 32
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 31 && BOOST_PP_ITERATION_START_4 >= 31
+#    define BOOST_PP_ITERATION_4 31
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 30 && BOOST_PP_ITERATION_START_4 >= 30
+#    define BOOST_PP_ITERATION_4 30
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 29 && BOOST_PP_ITERATION_START_4 >= 29
+#    define BOOST_PP_ITERATION_4 29
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 28 && BOOST_PP_ITERATION_START_4 >= 28
+#    define BOOST_PP_ITERATION_4 28
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 27 && BOOST_PP_ITERATION_START_4 >= 27
+#    define BOOST_PP_ITERATION_4 27
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 26 && BOOST_PP_ITERATION_START_4 >= 26
+#    define BOOST_PP_ITERATION_4 26
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 25 && BOOST_PP_ITERATION_START_4 >= 25
+#    define BOOST_PP_ITERATION_4 25
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 24 && BOOST_PP_ITERATION_START_4 >= 24
+#    define BOOST_PP_ITERATION_4 24
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 23 && BOOST_PP_ITERATION_START_4 >= 23
+#    define BOOST_PP_ITERATION_4 23
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 22 && BOOST_PP_ITERATION_START_4 >= 22
+#    define BOOST_PP_ITERATION_4 22
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 21 && BOOST_PP_ITERATION_START_4 >= 21
+#    define BOOST_PP_ITERATION_4 21
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 20 && BOOST_PP_ITERATION_START_4 >= 20
+#    define BOOST_PP_ITERATION_4 20
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 19 && BOOST_PP_ITERATION_START_4 >= 19
+#    define BOOST_PP_ITERATION_4 19
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 18 && BOOST_PP_ITERATION_START_4 >= 18
+#    define BOOST_PP_ITERATION_4 18
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 17 && BOOST_PP_ITERATION_START_4 >= 17
+#    define BOOST_PP_ITERATION_4 17
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 16 && BOOST_PP_ITERATION_START_4 >= 16
+#    define BOOST_PP_ITERATION_4 16
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 15 && BOOST_PP_ITERATION_START_4 >= 15
+#    define BOOST_PP_ITERATION_4 15
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 14 && BOOST_PP_ITERATION_START_4 >= 14
+#    define BOOST_PP_ITERATION_4 14
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 13 && BOOST_PP_ITERATION_START_4 >= 13
+#    define BOOST_PP_ITERATION_4 13
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 12 && BOOST_PP_ITERATION_START_4 >= 12
+#    define BOOST_PP_ITERATION_4 12
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 11 && BOOST_PP_ITERATION_START_4 >= 11
+#    define BOOST_PP_ITERATION_4 11
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 10 && BOOST_PP_ITERATION_START_4 >= 10
+#    define BOOST_PP_ITERATION_4 10
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 9 && BOOST_PP_ITERATION_START_4 >= 9
+#    define BOOST_PP_ITERATION_4 9
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 8 && BOOST_PP_ITERATION_START_4 >= 8
+#    define BOOST_PP_ITERATION_4 8
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 7 && BOOST_PP_ITERATION_START_4 >= 7
+#    define BOOST_PP_ITERATION_4 7
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 6 && BOOST_PP_ITERATION_START_4 >= 6
+#    define BOOST_PP_ITERATION_4 6
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 5 && BOOST_PP_ITERATION_START_4 >= 5
+#    define BOOST_PP_ITERATION_4 5
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 4 && BOOST_PP_ITERATION_START_4 >= 4
+#    define BOOST_PP_ITERATION_4 4
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 3 && BOOST_PP_ITERATION_START_4 >= 3
+#    define BOOST_PP_ITERATION_4 3
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 2 && BOOST_PP_ITERATION_START_4 >= 2
+#    define BOOST_PP_ITERATION_4 2
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 1 && BOOST_PP_ITERATION_START_4 >= 1
+#    define BOOST_PP_ITERATION_4 1
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
+# if BOOST_PP_ITERATION_FINISH_4 <= 0 && BOOST_PP_ITERATION_START_4 >= 0
+#    define BOOST_PP_ITERATION_4 0
+#    include BOOST_PP_FILENAME_4
+#    undef BOOST_PP_ITERATION_4
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse5.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse5.hpp
new file mode 100644
index 0000000..225a557
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/iter/reverse5.hpp
@@ -0,0 +1,1296 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_ITERATION_FINISH_5 <= 256 && BOOST_PP_ITERATION_START_5 >= 256
+#    define BOOST_PP_ITERATION_5 256
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 255 && BOOST_PP_ITERATION_START_5 >= 255
+#    define BOOST_PP_ITERATION_5 255
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 254 && BOOST_PP_ITERATION_START_5 >= 254
+#    define BOOST_PP_ITERATION_5 254
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 253 && BOOST_PP_ITERATION_START_5 >= 253
+#    define BOOST_PP_ITERATION_5 253
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 252 && BOOST_PP_ITERATION_START_5 >= 252
+#    define BOOST_PP_ITERATION_5 252
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 251 && BOOST_PP_ITERATION_START_5 >= 251
+#    define BOOST_PP_ITERATION_5 251
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 250 && BOOST_PP_ITERATION_START_5 >= 250
+#    define BOOST_PP_ITERATION_5 250
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 249 && BOOST_PP_ITERATION_START_5 >= 249
+#    define BOOST_PP_ITERATION_5 249
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 248 && BOOST_PP_ITERATION_START_5 >= 248
+#    define BOOST_PP_ITERATION_5 248
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 247 && BOOST_PP_ITERATION_START_5 >= 247
+#    define BOOST_PP_ITERATION_5 247
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 246 && BOOST_PP_ITERATION_START_5 >= 246
+#    define BOOST_PP_ITERATION_5 246
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 245 && BOOST_PP_ITERATION_START_5 >= 245
+#    define BOOST_PP_ITERATION_5 245
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 244 && BOOST_PP_ITERATION_START_5 >= 244
+#    define BOOST_PP_ITERATION_5 244
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 243 && BOOST_PP_ITERATION_START_5 >= 243
+#    define BOOST_PP_ITERATION_5 243
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 242 && BOOST_PP_ITERATION_START_5 >= 242
+#    define BOOST_PP_ITERATION_5 242
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 241 && BOOST_PP_ITERATION_START_5 >= 241
+#    define BOOST_PP_ITERATION_5 241
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 240 && BOOST_PP_ITERATION_START_5 >= 240
+#    define BOOST_PP_ITERATION_5 240
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 239 && BOOST_PP_ITERATION_START_5 >= 239
+#    define BOOST_PP_ITERATION_5 239
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 238 && BOOST_PP_ITERATION_START_5 >= 238
+#    define BOOST_PP_ITERATION_5 238
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 237 && BOOST_PP_ITERATION_START_5 >= 237
+#    define BOOST_PP_ITERATION_5 237
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 236 && BOOST_PP_ITERATION_START_5 >= 236
+#    define BOOST_PP_ITERATION_5 236
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 235 && BOOST_PP_ITERATION_START_5 >= 235
+#    define BOOST_PP_ITERATION_5 235
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 234 && BOOST_PP_ITERATION_START_5 >= 234
+#    define BOOST_PP_ITERATION_5 234
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 233 && BOOST_PP_ITERATION_START_5 >= 233
+#    define BOOST_PP_ITERATION_5 233
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 232 && BOOST_PP_ITERATION_START_5 >= 232
+#    define BOOST_PP_ITERATION_5 232
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 231 && BOOST_PP_ITERATION_START_5 >= 231
+#    define BOOST_PP_ITERATION_5 231
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 230 && BOOST_PP_ITERATION_START_5 >= 230
+#    define BOOST_PP_ITERATION_5 230
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 229 && BOOST_PP_ITERATION_START_5 >= 229
+#    define BOOST_PP_ITERATION_5 229
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 228 && BOOST_PP_ITERATION_START_5 >= 228
+#    define BOOST_PP_ITERATION_5 228
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 227 && BOOST_PP_ITERATION_START_5 >= 227
+#    define BOOST_PP_ITERATION_5 227
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 226 && BOOST_PP_ITERATION_START_5 >= 226
+#    define BOOST_PP_ITERATION_5 226
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 225 && BOOST_PP_ITERATION_START_5 >= 225
+#    define BOOST_PP_ITERATION_5 225
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 224 && BOOST_PP_ITERATION_START_5 >= 224
+#    define BOOST_PP_ITERATION_5 224
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 223 && BOOST_PP_ITERATION_START_5 >= 223
+#    define BOOST_PP_ITERATION_5 223
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 222 && BOOST_PP_ITERATION_START_5 >= 222
+#    define BOOST_PP_ITERATION_5 222
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 221 && BOOST_PP_ITERATION_START_5 >= 221
+#    define BOOST_PP_ITERATION_5 221
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 220 && BOOST_PP_ITERATION_START_5 >= 220
+#    define BOOST_PP_ITERATION_5 220
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 219 && BOOST_PP_ITERATION_START_5 >= 219
+#    define BOOST_PP_ITERATION_5 219
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 218 && BOOST_PP_ITERATION_START_5 >= 218
+#    define BOOST_PP_ITERATION_5 218
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 217 && BOOST_PP_ITERATION_START_5 >= 217
+#    define BOOST_PP_ITERATION_5 217
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 216 && BOOST_PP_ITERATION_START_5 >= 216
+#    define BOOST_PP_ITERATION_5 216
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 215 && BOOST_PP_ITERATION_START_5 >= 215
+#    define BOOST_PP_ITERATION_5 215
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 214 && BOOST_PP_ITERATION_START_5 >= 214
+#    define BOOST_PP_ITERATION_5 214
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 213 && BOOST_PP_ITERATION_START_5 >= 213
+#    define BOOST_PP_ITERATION_5 213
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 212 && BOOST_PP_ITERATION_START_5 >= 212
+#    define BOOST_PP_ITERATION_5 212
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 211 && BOOST_PP_ITERATION_START_5 >= 211
+#    define BOOST_PP_ITERATION_5 211
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 210 && BOOST_PP_ITERATION_START_5 >= 210
+#    define BOOST_PP_ITERATION_5 210
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 209 && BOOST_PP_ITERATION_START_5 >= 209
+#    define BOOST_PP_ITERATION_5 209
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 208 && BOOST_PP_ITERATION_START_5 >= 208
+#    define BOOST_PP_ITERATION_5 208
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 207 && BOOST_PP_ITERATION_START_5 >= 207
+#    define BOOST_PP_ITERATION_5 207
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 206 && BOOST_PP_ITERATION_START_5 >= 206
+#    define BOOST_PP_ITERATION_5 206
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 205 && BOOST_PP_ITERATION_START_5 >= 205
+#    define BOOST_PP_ITERATION_5 205
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 204 && BOOST_PP_ITERATION_START_5 >= 204
+#    define BOOST_PP_ITERATION_5 204
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 203 && BOOST_PP_ITERATION_START_5 >= 203
+#    define BOOST_PP_ITERATION_5 203
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 202 && BOOST_PP_ITERATION_START_5 >= 202
+#    define BOOST_PP_ITERATION_5 202
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 201 && BOOST_PP_ITERATION_START_5 >= 201
+#    define BOOST_PP_ITERATION_5 201
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 200 && BOOST_PP_ITERATION_START_5 >= 200
+#    define BOOST_PP_ITERATION_5 200
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 199 && BOOST_PP_ITERATION_START_5 >= 199
+#    define BOOST_PP_ITERATION_5 199
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 198 && BOOST_PP_ITERATION_START_5 >= 198
+#    define BOOST_PP_ITERATION_5 198
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 197 && BOOST_PP_ITERATION_START_5 >= 197
+#    define BOOST_PP_ITERATION_5 197
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 196 && BOOST_PP_ITERATION_START_5 >= 196
+#    define BOOST_PP_ITERATION_5 196
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 195 && BOOST_PP_ITERATION_START_5 >= 195
+#    define BOOST_PP_ITERATION_5 195
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 194 && BOOST_PP_ITERATION_START_5 >= 194
+#    define BOOST_PP_ITERATION_5 194
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 193 && BOOST_PP_ITERATION_START_5 >= 193
+#    define BOOST_PP_ITERATION_5 193
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 192 && BOOST_PP_ITERATION_START_5 >= 192
+#    define BOOST_PP_ITERATION_5 192
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 191 && BOOST_PP_ITERATION_START_5 >= 191
+#    define BOOST_PP_ITERATION_5 191
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 190 && BOOST_PP_ITERATION_START_5 >= 190
+#    define BOOST_PP_ITERATION_5 190
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 189 && BOOST_PP_ITERATION_START_5 >= 189
+#    define BOOST_PP_ITERATION_5 189
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 188 && BOOST_PP_ITERATION_START_5 >= 188
+#    define BOOST_PP_ITERATION_5 188
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 187 && BOOST_PP_ITERATION_START_5 >= 187
+#    define BOOST_PP_ITERATION_5 187
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 186 && BOOST_PP_ITERATION_START_5 >= 186
+#    define BOOST_PP_ITERATION_5 186
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 185 && BOOST_PP_ITERATION_START_5 >= 185
+#    define BOOST_PP_ITERATION_5 185
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 184 && BOOST_PP_ITERATION_START_5 >= 184
+#    define BOOST_PP_ITERATION_5 184
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 183 && BOOST_PP_ITERATION_START_5 >= 183
+#    define BOOST_PP_ITERATION_5 183
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 182 && BOOST_PP_ITERATION_START_5 >= 182
+#    define BOOST_PP_ITERATION_5 182
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 181 && BOOST_PP_ITERATION_START_5 >= 181
+#    define BOOST_PP_ITERATION_5 181
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 180 && BOOST_PP_ITERATION_START_5 >= 180
+#    define BOOST_PP_ITERATION_5 180
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 179 && BOOST_PP_ITERATION_START_5 >= 179
+#    define BOOST_PP_ITERATION_5 179
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 178 && BOOST_PP_ITERATION_START_5 >= 178
+#    define BOOST_PP_ITERATION_5 178
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 177 && BOOST_PP_ITERATION_START_5 >= 177
+#    define BOOST_PP_ITERATION_5 177
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 176 && BOOST_PP_ITERATION_START_5 >= 176
+#    define BOOST_PP_ITERATION_5 176
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 175 && BOOST_PP_ITERATION_START_5 >= 175
+#    define BOOST_PP_ITERATION_5 175
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 174 && BOOST_PP_ITERATION_START_5 >= 174
+#    define BOOST_PP_ITERATION_5 174
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 173 && BOOST_PP_ITERATION_START_5 >= 173
+#    define BOOST_PP_ITERATION_5 173
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 172 && BOOST_PP_ITERATION_START_5 >= 172
+#    define BOOST_PP_ITERATION_5 172
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 171 && BOOST_PP_ITERATION_START_5 >= 171
+#    define BOOST_PP_ITERATION_5 171
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 170 && BOOST_PP_ITERATION_START_5 >= 170
+#    define BOOST_PP_ITERATION_5 170
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 169 && BOOST_PP_ITERATION_START_5 >= 169
+#    define BOOST_PP_ITERATION_5 169
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 168 && BOOST_PP_ITERATION_START_5 >= 168
+#    define BOOST_PP_ITERATION_5 168
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 167 && BOOST_PP_ITERATION_START_5 >= 167
+#    define BOOST_PP_ITERATION_5 167
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 166 && BOOST_PP_ITERATION_START_5 >= 166
+#    define BOOST_PP_ITERATION_5 166
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 165 && BOOST_PP_ITERATION_START_5 >= 165
+#    define BOOST_PP_ITERATION_5 165
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 164 && BOOST_PP_ITERATION_START_5 >= 164
+#    define BOOST_PP_ITERATION_5 164
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 163 && BOOST_PP_ITERATION_START_5 >= 163
+#    define BOOST_PP_ITERATION_5 163
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 162 && BOOST_PP_ITERATION_START_5 >= 162
+#    define BOOST_PP_ITERATION_5 162
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 161 && BOOST_PP_ITERATION_START_5 >= 161
+#    define BOOST_PP_ITERATION_5 161
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 160 && BOOST_PP_ITERATION_START_5 >= 160
+#    define BOOST_PP_ITERATION_5 160
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 159 && BOOST_PP_ITERATION_START_5 >= 159
+#    define BOOST_PP_ITERATION_5 159
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 158 && BOOST_PP_ITERATION_START_5 >= 158
+#    define BOOST_PP_ITERATION_5 158
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 157 && BOOST_PP_ITERATION_START_5 >= 157
+#    define BOOST_PP_ITERATION_5 157
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 156 && BOOST_PP_ITERATION_START_5 >= 156
+#    define BOOST_PP_ITERATION_5 156
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 155 && BOOST_PP_ITERATION_START_5 >= 155
+#    define BOOST_PP_ITERATION_5 155
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 154 && BOOST_PP_ITERATION_START_5 >= 154
+#    define BOOST_PP_ITERATION_5 154
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 153 && BOOST_PP_ITERATION_START_5 >= 153
+#    define BOOST_PP_ITERATION_5 153
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 152 && BOOST_PP_ITERATION_START_5 >= 152
+#    define BOOST_PP_ITERATION_5 152
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 151 && BOOST_PP_ITERATION_START_5 >= 151
+#    define BOOST_PP_ITERATION_5 151
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 150 && BOOST_PP_ITERATION_START_5 >= 150
+#    define BOOST_PP_ITERATION_5 150
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 149 && BOOST_PP_ITERATION_START_5 >= 149
+#    define BOOST_PP_ITERATION_5 149
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 148 && BOOST_PP_ITERATION_START_5 >= 148
+#    define BOOST_PP_ITERATION_5 148
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 147 && BOOST_PP_ITERATION_START_5 >= 147
+#    define BOOST_PP_ITERATION_5 147
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 146 && BOOST_PP_ITERATION_START_5 >= 146
+#    define BOOST_PP_ITERATION_5 146
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 145 && BOOST_PP_ITERATION_START_5 >= 145
+#    define BOOST_PP_ITERATION_5 145
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 144 && BOOST_PP_ITERATION_START_5 >= 144
+#    define BOOST_PP_ITERATION_5 144
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 143 && BOOST_PP_ITERATION_START_5 >= 143
+#    define BOOST_PP_ITERATION_5 143
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 142 && BOOST_PP_ITERATION_START_5 >= 142
+#    define BOOST_PP_ITERATION_5 142
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 141 && BOOST_PP_ITERATION_START_5 >= 141
+#    define BOOST_PP_ITERATION_5 141
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 140 && BOOST_PP_ITERATION_START_5 >= 140
+#    define BOOST_PP_ITERATION_5 140
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 139 && BOOST_PP_ITERATION_START_5 >= 139
+#    define BOOST_PP_ITERATION_5 139
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 138 && BOOST_PP_ITERATION_START_5 >= 138
+#    define BOOST_PP_ITERATION_5 138
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 137 && BOOST_PP_ITERATION_START_5 >= 137
+#    define BOOST_PP_ITERATION_5 137
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 136 && BOOST_PP_ITERATION_START_5 >= 136
+#    define BOOST_PP_ITERATION_5 136
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 135 && BOOST_PP_ITERATION_START_5 >= 135
+#    define BOOST_PP_ITERATION_5 135
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 134 && BOOST_PP_ITERATION_START_5 >= 134
+#    define BOOST_PP_ITERATION_5 134
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 133 && BOOST_PP_ITERATION_START_5 >= 133
+#    define BOOST_PP_ITERATION_5 133
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 132 && BOOST_PP_ITERATION_START_5 >= 132
+#    define BOOST_PP_ITERATION_5 132
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 131 && BOOST_PP_ITERATION_START_5 >= 131
+#    define BOOST_PP_ITERATION_5 131
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 130 && BOOST_PP_ITERATION_START_5 >= 130
+#    define BOOST_PP_ITERATION_5 130
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 129 && BOOST_PP_ITERATION_START_5 >= 129
+#    define BOOST_PP_ITERATION_5 129
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 128 && BOOST_PP_ITERATION_START_5 >= 128
+#    define BOOST_PP_ITERATION_5 128
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 127 && BOOST_PP_ITERATION_START_5 >= 127
+#    define BOOST_PP_ITERATION_5 127
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 126 && BOOST_PP_ITERATION_START_5 >= 126
+#    define BOOST_PP_ITERATION_5 126
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 125 && BOOST_PP_ITERATION_START_5 >= 125
+#    define BOOST_PP_ITERATION_5 125
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 124 && BOOST_PP_ITERATION_START_5 >= 124
+#    define BOOST_PP_ITERATION_5 124
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 123 && BOOST_PP_ITERATION_START_5 >= 123
+#    define BOOST_PP_ITERATION_5 123
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 122 && BOOST_PP_ITERATION_START_5 >= 122
+#    define BOOST_PP_ITERATION_5 122
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 121 && BOOST_PP_ITERATION_START_5 >= 121
+#    define BOOST_PP_ITERATION_5 121
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 120 && BOOST_PP_ITERATION_START_5 >= 120
+#    define BOOST_PP_ITERATION_5 120
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 119 && BOOST_PP_ITERATION_START_5 >= 119
+#    define BOOST_PP_ITERATION_5 119
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 118 && BOOST_PP_ITERATION_START_5 >= 118
+#    define BOOST_PP_ITERATION_5 118
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 117 && BOOST_PP_ITERATION_START_5 >= 117
+#    define BOOST_PP_ITERATION_5 117
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 116 && BOOST_PP_ITERATION_START_5 >= 116
+#    define BOOST_PP_ITERATION_5 116
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 115 && BOOST_PP_ITERATION_START_5 >= 115
+#    define BOOST_PP_ITERATION_5 115
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 114 && BOOST_PP_ITERATION_START_5 >= 114
+#    define BOOST_PP_ITERATION_5 114
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 113 && BOOST_PP_ITERATION_START_5 >= 113
+#    define BOOST_PP_ITERATION_5 113
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 112 && BOOST_PP_ITERATION_START_5 >= 112
+#    define BOOST_PP_ITERATION_5 112
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 111 && BOOST_PP_ITERATION_START_5 >= 111
+#    define BOOST_PP_ITERATION_5 111
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 110 && BOOST_PP_ITERATION_START_5 >= 110
+#    define BOOST_PP_ITERATION_5 110
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 109 && BOOST_PP_ITERATION_START_5 >= 109
+#    define BOOST_PP_ITERATION_5 109
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 108 && BOOST_PP_ITERATION_START_5 >= 108
+#    define BOOST_PP_ITERATION_5 108
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 107 && BOOST_PP_ITERATION_START_5 >= 107
+#    define BOOST_PP_ITERATION_5 107
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 106 && BOOST_PP_ITERATION_START_5 >= 106
+#    define BOOST_PP_ITERATION_5 106
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 105 && BOOST_PP_ITERATION_START_5 >= 105
+#    define BOOST_PP_ITERATION_5 105
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 104 && BOOST_PP_ITERATION_START_5 >= 104
+#    define BOOST_PP_ITERATION_5 104
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 103 && BOOST_PP_ITERATION_START_5 >= 103
+#    define BOOST_PP_ITERATION_5 103
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 102 && BOOST_PP_ITERATION_START_5 >= 102
+#    define BOOST_PP_ITERATION_5 102
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 101 && BOOST_PP_ITERATION_START_5 >= 101
+#    define BOOST_PP_ITERATION_5 101
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 100 && BOOST_PP_ITERATION_START_5 >= 100
+#    define BOOST_PP_ITERATION_5 100
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 99 && BOOST_PP_ITERATION_START_5 >= 99
+#    define BOOST_PP_ITERATION_5 99
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 98 && BOOST_PP_ITERATION_START_5 >= 98
+#    define BOOST_PP_ITERATION_5 98
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 97 && BOOST_PP_ITERATION_START_5 >= 97
+#    define BOOST_PP_ITERATION_5 97
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 96 && BOOST_PP_ITERATION_START_5 >= 96
+#    define BOOST_PP_ITERATION_5 96
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 95 && BOOST_PP_ITERATION_START_5 >= 95
+#    define BOOST_PP_ITERATION_5 95
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 94 && BOOST_PP_ITERATION_START_5 >= 94
+#    define BOOST_PP_ITERATION_5 94
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 93 && BOOST_PP_ITERATION_START_5 >= 93
+#    define BOOST_PP_ITERATION_5 93
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 92 && BOOST_PP_ITERATION_START_5 >= 92
+#    define BOOST_PP_ITERATION_5 92
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 91 && BOOST_PP_ITERATION_START_5 >= 91
+#    define BOOST_PP_ITERATION_5 91
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 90 && BOOST_PP_ITERATION_START_5 >= 90
+#    define BOOST_PP_ITERATION_5 90
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 89 && BOOST_PP_ITERATION_START_5 >= 89
+#    define BOOST_PP_ITERATION_5 89
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 88 && BOOST_PP_ITERATION_START_5 >= 88
+#    define BOOST_PP_ITERATION_5 88
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 87 && BOOST_PP_ITERATION_START_5 >= 87
+#    define BOOST_PP_ITERATION_5 87
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 86 && BOOST_PP_ITERATION_START_5 >= 86
+#    define BOOST_PP_ITERATION_5 86
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 85 && BOOST_PP_ITERATION_START_5 >= 85
+#    define BOOST_PP_ITERATION_5 85
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 84 && BOOST_PP_ITERATION_START_5 >= 84
+#    define BOOST_PP_ITERATION_5 84
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 83 && BOOST_PP_ITERATION_START_5 >= 83
+#    define BOOST_PP_ITERATION_5 83
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 82 && BOOST_PP_ITERATION_START_5 >= 82
+#    define BOOST_PP_ITERATION_5 82
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 81 && BOOST_PP_ITERATION_START_5 >= 81
+#    define BOOST_PP_ITERATION_5 81
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 80 && BOOST_PP_ITERATION_START_5 >= 80
+#    define BOOST_PP_ITERATION_5 80
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 79 && BOOST_PP_ITERATION_START_5 >= 79
+#    define BOOST_PP_ITERATION_5 79
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 78 && BOOST_PP_ITERATION_START_5 >= 78
+#    define BOOST_PP_ITERATION_5 78
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 77 && BOOST_PP_ITERATION_START_5 >= 77
+#    define BOOST_PP_ITERATION_5 77
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 76 && BOOST_PP_ITERATION_START_5 >= 76
+#    define BOOST_PP_ITERATION_5 76
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 75 && BOOST_PP_ITERATION_START_5 >= 75
+#    define BOOST_PP_ITERATION_5 75
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 74 && BOOST_PP_ITERATION_START_5 >= 74
+#    define BOOST_PP_ITERATION_5 74
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 73 && BOOST_PP_ITERATION_START_5 >= 73
+#    define BOOST_PP_ITERATION_5 73
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 72 && BOOST_PP_ITERATION_START_5 >= 72
+#    define BOOST_PP_ITERATION_5 72
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 71 && BOOST_PP_ITERATION_START_5 >= 71
+#    define BOOST_PP_ITERATION_5 71
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 70 && BOOST_PP_ITERATION_START_5 >= 70
+#    define BOOST_PP_ITERATION_5 70
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 69 && BOOST_PP_ITERATION_START_5 >= 69
+#    define BOOST_PP_ITERATION_5 69
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 68 && BOOST_PP_ITERATION_START_5 >= 68
+#    define BOOST_PP_ITERATION_5 68
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 67 && BOOST_PP_ITERATION_START_5 >= 67
+#    define BOOST_PP_ITERATION_5 67
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 66 && BOOST_PP_ITERATION_START_5 >= 66
+#    define BOOST_PP_ITERATION_5 66
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 65 && BOOST_PP_ITERATION_START_5 >= 65
+#    define BOOST_PP_ITERATION_5 65
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 64 && BOOST_PP_ITERATION_START_5 >= 64
+#    define BOOST_PP_ITERATION_5 64
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 63 && BOOST_PP_ITERATION_START_5 >= 63
+#    define BOOST_PP_ITERATION_5 63
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 62 && BOOST_PP_ITERATION_START_5 >= 62
+#    define BOOST_PP_ITERATION_5 62
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 61 && BOOST_PP_ITERATION_START_5 >= 61
+#    define BOOST_PP_ITERATION_5 61
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 60 && BOOST_PP_ITERATION_START_5 >= 60
+#    define BOOST_PP_ITERATION_5 60
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 59 && BOOST_PP_ITERATION_START_5 >= 59
+#    define BOOST_PP_ITERATION_5 59
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 58 && BOOST_PP_ITERATION_START_5 >= 58
+#    define BOOST_PP_ITERATION_5 58
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 57 && BOOST_PP_ITERATION_START_5 >= 57
+#    define BOOST_PP_ITERATION_5 57
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 56 && BOOST_PP_ITERATION_START_5 >= 56
+#    define BOOST_PP_ITERATION_5 56
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 55 && BOOST_PP_ITERATION_START_5 >= 55
+#    define BOOST_PP_ITERATION_5 55
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 54 && BOOST_PP_ITERATION_START_5 >= 54
+#    define BOOST_PP_ITERATION_5 54
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 53 && BOOST_PP_ITERATION_START_5 >= 53
+#    define BOOST_PP_ITERATION_5 53
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 52 && BOOST_PP_ITERATION_START_5 >= 52
+#    define BOOST_PP_ITERATION_5 52
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 51 && BOOST_PP_ITERATION_START_5 >= 51
+#    define BOOST_PP_ITERATION_5 51
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 50 && BOOST_PP_ITERATION_START_5 >= 50
+#    define BOOST_PP_ITERATION_5 50
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 49 && BOOST_PP_ITERATION_START_5 >= 49
+#    define BOOST_PP_ITERATION_5 49
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 48 && BOOST_PP_ITERATION_START_5 >= 48
+#    define BOOST_PP_ITERATION_5 48
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 47 && BOOST_PP_ITERATION_START_5 >= 47
+#    define BOOST_PP_ITERATION_5 47
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 46 && BOOST_PP_ITERATION_START_5 >= 46
+#    define BOOST_PP_ITERATION_5 46
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 45 && BOOST_PP_ITERATION_START_5 >= 45
+#    define BOOST_PP_ITERATION_5 45
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 44 && BOOST_PP_ITERATION_START_5 >= 44
+#    define BOOST_PP_ITERATION_5 44
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 43 && BOOST_PP_ITERATION_START_5 >= 43
+#    define BOOST_PP_ITERATION_5 43
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 42 && BOOST_PP_ITERATION_START_5 >= 42
+#    define BOOST_PP_ITERATION_5 42
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 41 && BOOST_PP_ITERATION_START_5 >= 41
+#    define BOOST_PP_ITERATION_5 41
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 40 && BOOST_PP_ITERATION_START_5 >= 40
+#    define BOOST_PP_ITERATION_5 40
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 39 && BOOST_PP_ITERATION_START_5 >= 39
+#    define BOOST_PP_ITERATION_5 39
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 38 && BOOST_PP_ITERATION_START_5 >= 38
+#    define BOOST_PP_ITERATION_5 38
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 37 && BOOST_PP_ITERATION_START_5 >= 37
+#    define BOOST_PP_ITERATION_5 37
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 36 && BOOST_PP_ITERATION_START_5 >= 36
+#    define BOOST_PP_ITERATION_5 36
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 35 && BOOST_PP_ITERATION_START_5 >= 35
+#    define BOOST_PP_ITERATION_5 35
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 34 && BOOST_PP_ITERATION_START_5 >= 34
+#    define BOOST_PP_ITERATION_5 34
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 33 && BOOST_PP_ITERATION_START_5 >= 33
+#    define BOOST_PP_ITERATION_5 33
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 32 && BOOST_PP_ITERATION_START_5 >= 32
+#    define BOOST_PP_ITERATION_5 32
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 31 && BOOST_PP_ITERATION_START_5 >= 31
+#    define BOOST_PP_ITERATION_5 31
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 30 && BOOST_PP_ITERATION_START_5 >= 30
+#    define BOOST_PP_ITERATION_5 30
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 29 && BOOST_PP_ITERATION_START_5 >= 29
+#    define BOOST_PP_ITERATION_5 29
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 28 && BOOST_PP_ITERATION_START_5 >= 28
+#    define BOOST_PP_ITERATION_5 28
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 27 && BOOST_PP_ITERATION_START_5 >= 27
+#    define BOOST_PP_ITERATION_5 27
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 26 && BOOST_PP_ITERATION_START_5 >= 26
+#    define BOOST_PP_ITERATION_5 26
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 25 && BOOST_PP_ITERATION_START_5 >= 25
+#    define BOOST_PP_ITERATION_5 25
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 24 && BOOST_PP_ITERATION_START_5 >= 24
+#    define BOOST_PP_ITERATION_5 24
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 23 && BOOST_PP_ITERATION_START_5 >= 23
+#    define BOOST_PP_ITERATION_5 23
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 22 && BOOST_PP_ITERATION_START_5 >= 22
+#    define BOOST_PP_ITERATION_5 22
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 21 && BOOST_PP_ITERATION_START_5 >= 21
+#    define BOOST_PP_ITERATION_5 21
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 20 && BOOST_PP_ITERATION_START_5 >= 20
+#    define BOOST_PP_ITERATION_5 20
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 19 && BOOST_PP_ITERATION_START_5 >= 19
+#    define BOOST_PP_ITERATION_5 19
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 18 && BOOST_PP_ITERATION_START_5 >= 18
+#    define BOOST_PP_ITERATION_5 18
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 17 && BOOST_PP_ITERATION_START_5 >= 17
+#    define BOOST_PP_ITERATION_5 17
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 16 && BOOST_PP_ITERATION_START_5 >= 16
+#    define BOOST_PP_ITERATION_5 16
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 15 && BOOST_PP_ITERATION_START_5 >= 15
+#    define BOOST_PP_ITERATION_5 15
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 14 && BOOST_PP_ITERATION_START_5 >= 14
+#    define BOOST_PP_ITERATION_5 14
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 13 && BOOST_PP_ITERATION_START_5 >= 13
+#    define BOOST_PP_ITERATION_5 13
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 12 && BOOST_PP_ITERATION_START_5 >= 12
+#    define BOOST_PP_ITERATION_5 12
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 11 && BOOST_PP_ITERATION_START_5 >= 11
+#    define BOOST_PP_ITERATION_5 11
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 10 && BOOST_PP_ITERATION_START_5 >= 10
+#    define BOOST_PP_ITERATION_5 10
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 9 && BOOST_PP_ITERATION_START_5 >= 9
+#    define BOOST_PP_ITERATION_5 9
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 8 && BOOST_PP_ITERATION_START_5 >= 8
+#    define BOOST_PP_ITERATION_5 8
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 7 && BOOST_PP_ITERATION_START_5 >= 7
+#    define BOOST_PP_ITERATION_5 7
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 6 && BOOST_PP_ITERATION_START_5 >= 6
+#    define BOOST_PP_ITERATION_5 6
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 5 && BOOST_PP_ITERATION_START_5 >= 5
+#    define BOOST_PP_ITERATION_5 5
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 4 && BOOST_PP_ITERATION_START_5 >= 4
+#    define BOOST_PP_ITERATION_5 4
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 3 && BOOST_PP_ITERATION_START_5 >= 3
+#    define BOOST_PP_ITERATION_5 3
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 2 && BOOST_PP_ITERATION_START_5 >= 2
+#    define BOOST_PP_ITERATION_5 2
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 1 && BOOST_PP_ITERATION_START_5 >= 1
+#    define BOOST_PP_ITERATION_5 1
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
+# if BOOST_PP_ITERATION_FINISH_5 <= 0 && BOOST_PP_ITERATION_START_5 >= 0
+#    define BOOST_PP_ITERATION_5 0
+#    include BOOST_PP_FILENAME_5
+#    undef BOOST_PP_ITERATION_5
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/local.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/local.hpp
new file mode 100644
index 0000000..ccddd5e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/local.hpp
@@ -0,0 +1,812 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if !defined(BOOST_PP_LOCAL_LIMITS)
+#    error BOOST_PP_ERROR:  local iteration boundaries are not defined
+# elif !defined(BOOST_PP_LOCAL_MACRO)
+#    error BOOST_PP_ERROR:  local iteration target macro is not defined
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#        define BOOST_PP_LOCAL_S BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)
+#        define BOOST_PP_LOCAL_F BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)
+#    else
+#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)
+#        include <boost/preprocessor/iteration/detail/start.hpp>
+#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)
+#        include <boost/preprocessor/iteration/detail/finish.hpp>
+#        define BOOST_PP_LOCAL_S BOOST_PP_LOCAL_SE()
+#        define BOOST_PP_LOCAL_F BOOST_PP_LOCAL_FE()
+#    endif
+# endif
+#
+# if (BOOST_PP_LOCAL_S) > (BOOST_PP_LOCAL_F)
+#    include <boost/preprocessor/iteration/detail/rlocal.hpp>
+# else
+#    if BOOST_PP_LOCAL_C(0)
+        BOOST_PP_LOCAL_MACRO(0)
+#    endif
+#    if BOOST_PP_LOCAL_C(1)
+        BOOST_PP_LOCAL_MACRO(1)
+#    endif
+#    if BOOST_PP_LOCAL_C(2)
+        BOOST_PP_LOCAL_MACRO(2)
+#    endif
+#    if BOOST_PP_LOCAL_C(3)
+        BOOST_PP_LOCAL_MACRO(3)
+#    endif
+#    if BOOST_PP_LOCAL_C(4)
+        BOOST_PP_LOCAL_MACRO(4)
+#    endif
+#    if BOOST_PP_LOCAL_C(5)
+        BOOST_PP_LOCAL_MACRO(5)
+#    endif
+#    if BOOST_PP_LOCAL_C(6)
+        BOOST_PP_LOCAL_MACRO(6)
+#    endif
+#    if BOOST_PP_LOCAL_C(7)
+        BOOST_PP_LOCAL_MACRO(7)
+#    endif
+#    if BOOST_PP_LOCAL_C(8)
+        BOOST_PP_LOCAL_MACRO(8)
+#    endif
+#    if BOOST_PP_LOCAL_C(9)
+        BOOST_PP_LOCAL_MACRO(9)
+#    endif
+#    if BOOST_PP_LOCAL_C(10)
+        BOOST_PP_LOCAL_MACRO(10)
+#    endif
+#    if BOOST_PP_LOCAL_C(11)
+        BOOST_PP_LOCAL_MACRO(11)
+#    endif
+#    if BOOST_PP_LOCAL_C(12)
+        BOOST_PP_LOCAL_MACRO(12)
+#    endif
+#    if BOOST_PP_LOCAL_C(13)
+        BOOST_PP_LOCAL_MACRO(13)
+#    endif
+#    if BOOST_PP_LOCAL_C(14)
+        BOOST_PP_LOCAL_MACRO(14)
+#    endif
+#    if BOOST_PP_LOCAL_C(15)
+        BOOST_PP_LOCAL_MACRO(15)
+#    endif
+#    if BOOST_PP_LOCAL_C(16)
+        BOOST_PP_LOCAL_MACRO(16)
+#    endif
+#    if BOOST_PP_LOCAL_C(17)
+        BOOST_PP_LOCAL_MACRO(17)
+#    endif
+#    if BOOST_PP_LOCAL_C(18)
+        BOOST_PP_LOCAL_MACRO(18)
+#    endif
+#    if BOOST_PP_LOCAL_C(19)
+        BOOST_PP_LOCAL_MACRO(19)
+#    endif
+#    if BOOST_PP_LOCAL_C(20)
+        BOOST_PP_LOCAL_MACRO(20)
+#    endif
+#    if BOOST_PP_LOCAL_C(21)
+        BOOST_PP_LOCAL_MACRO(21)
+#    endif
+#    if BOOST_PP_LOCAL_C(22)
+        BOOST_PP_LOCAL_MACRO(22)
+#    endif
+#    if BOOST_PP_LOCAL_C(23)
+        BOOST_PP_LOCAL_MACRO(23)
+#    endif
+#    if BOOST_PP_LOCAL_C(24)
+        BOOST_PP_LOCAL_MACRO(24)
+#    endif
+#    if BOOST_PP_LOCAL_C(25)
+        BOOST_PP_LOCAL_MACRO(25)
+#    endif
+#    if BOOST_PP_LOCAL_C(26)
+        BOOST_PP_LOCAL_MACRO(26)
+#    endif
+#    if BOOST_PP_LOCAL_C(27)
+        BOOST_PP_LOCAL_MACRO(27)
+#    endif
+#    if BOOST_PP_LOCAL_C(28)
+        BOOST_PP_LOCAL_MACRO(28)
+#    endif
+#    if BOOST_PP_LOCAL_C(29)
+        BOOST_PP_LOCAL_MACRO(29)
+#    endif
+#    if BOOST_PP_LOCAL_C(30)
+        BOOST_PP_LOCAL_MACRO(30)
+#    endif
+#    if BOOST_PP_LOCAL_C(31)
+        BOOST_PP_LOCAL_MACRO(31)
+#    endif
+#    if BOOST_PP_LOCAL_C(32)
+        BOOST_PP_LOCAL_MACRO(32)
+#    endif
+#    if BOOST_PP_LOCAL_C(33)
+        BOOST_PP_LOCAL_MACRO(33)
+#    endif
+#    if BOOST_PP_LOCAL_C(34)
+        BOOST_PP_LOCAL_MACRO(34)
+#    endif
+#    if BOOST_PP_LOCAL_C(35)
+        BOOST_PP_LOCAL_MACRO(35)
+#    endif
+#    if BOOST_PP_LOCAL_C(36)
+        BOOST_PP_LOCAL_MACRO(36)
+#    endif
+#    if BOOST_PP_LOCAL_C(37)
+        BOOST_PP_LOCAL_MACRO(37)
+#    endif
+#    if BOOST_PP_LOCAL_C(38)
+        BOOST_PP_LOCAL_MACRO(38)
+#    endif
+#    if BOOST_PP_LOCAL_C(39)
+        BOOST_PP_LOCAL_MACRO(39)
+#    endif
+#    if BOOST_PP_LOCAL_C(40)
+        BOOST_PP_LOCAL_MACRO(40)
+#    endif
+#    if BOOST_PP_LOCAL_C(41)
+        BOOST_PP_LOCAL_MACRO(41)
+#    endif
+#    if BOOST_PP_LOCAL_C(42)
+        BOOST_PP_LOCAL_MACRO(42)
+#    endif
+#    if BOOST_PP_LOCAL_C(43)
+        BOOST_PP_LOCAL_MACRO(43)
+#    endif
+#    if BOOST_PP_LOCAL_C(44)
+        BOOST_PP_LOCAL_MACRO(44)
+#    endif
+#    if BOOST_PP_LOCAL_C(45)
+        BOOST_PP_LOCAL_MACRO(45)
+#    endif
+#    if BOOST_PP_LOCAL_C(46)
+        BOOST_PP_LOCAL_MACRO(46)
+#    endif
+#    if BOOST_PP_LOCAL_C(47)
+        BOOST_PP_LOCAL_MACRO(47)
+#    endif
+#    if BOOST_PP_LOCAL_C(48)
+        BOOST_PP_LOCAL_MACRO(48)
+#    endif
+#    if BOOST_PP_LOCAL_C(49)
+        BOOST_PP_LOCAL_MACRO(49)
+#    endif
+#    if BOOST_PP_LOCAL_C(50)
+        BOOST_PP_LOCAL_MACRO(50)
+#    endif
+#    if BOOST_PP_LOCAL_C(51)
+        BOOST_PP_LOCAL_MACRO(51)
+#    endif
+#    if BOOST_PP_LOCAL_C(52)
+        BOOST_PP_LOCAL_MACRO(52)
+#    endif
+#    if BOOST_PP_LOCAL_C(53)
+        BOOST_PP_LOCAL_MACRO(53)
+#    endif
+#    if BOOST_PP_LOCAL_C(54)
+        BOOST_PP_LOCAL_MACRO(54)
+#    endif
+#    if BOOST_PP_LOCAL_C(55)
+        BOOST_PP_LOCAL_MACRO(55)
+#    endif
+#    if BOOST_PP_LOCAL_C(56)
+        BOOST_PP_LOCAL_MACRO(56)
+#    endif
+#    if BOOST_PP_LOCAL_C(57)
+        BOOST_PP_LOCAL_MACRO(57)
+#    endif
+#    if BOOST_PP_LOCAL_C(58)
+        BOOST_PP_LOCAL_MACRO(58)
+#    endif
+#    if BOOST_PP_LOCAL_C(59)
+        BOOST_PP_LOCAL_MACRO(59)
+#    endif
+#    if BOOST_PP_LOCAL_C(60)
+        BOOST_PP_LOCAL_MACRO(60)
+#    endif
+#    if BOOST_PP_LOCAL_C(61)
+        BOOST_PP_LOCAL_MACRO(61)
+#    endif
+#    if BOOST_PP_LOCAL_C(62)
+        BOOST_PP_LOCAL_MACRO(62)
+#    endif
+#    if BOOST_PP_LOCAL_C(63)
+        BOOST_PP_LOCAL_MACRO(63)
+#    endif
+#    if BOOST_PP_LOCAL_C(64)
+        BOOST_PP_LOCAL_MACRO(64)
+#    endif
+#    if BOOST_PP_LOCAL_C(65)
+        BOOST_PP_LOCAL_MACRO(65)
+#    endif
+#    if BOOST_PP_LOCAL_C(66)
+        BOOST_PP_LOCAL_MACRO(66)
+#    endif
+#    if BOOST_PP_LOCAL_C(67)
+        BOOST_PP_LOCAL_MACRO(67)
+#    endif
+#    if BOOST_PP_LOCAL_C(68)
+        BOOST_PP_LOCAL_MACRO(68)
+#    endif
+#    if BOOST_PP_LOCAL_C(69)
+        BOOST_PP_LOCAL_MACRO(69)
+#    endif
+#    if BOOST_PP_LOCAL_C(70)
+        BOOST_PP_LOCAL_MACRO(70)
+#    endif
+#    if BOOST_PP_LOCAL_C(71)
+        BOOST_PP_LOCAL_MACRO(71)
+#    endif
+#    if BOOST_PP_LOCAL_C(72)
+        BOOST_PP_LOCAL_MACRO(72)
+#    endif
+#    if BOOST_PP_LOCAL_C(73)
+        BOOST_PP_LOCAL_MACRO(73)
+#    endif
+#    if BOOST_PP_LOCAL_C(74)
+        BOOST_PP_LOCAL_MACRO(74)
+#    endif
+#    if BOOST_PP_LOCAL_C(75)
+        BOOST_PP_LOCAL_MACRO(75)
+#    endif
+#    if BOOST_PP_LOCAL_C(76)
+        BOOST_PP_LOCAL_MACRO(76)
+#    endif
+#    if BOOST_PP_LOCAL_C(77)
+        BOOST_PP_LOCAL_MACRO(77)
+#    endif
+#    if BOOST_PP_LOCAL_C(78)
+        BOOST_PP_LOCAL_MACRO(78)
+#    endif
+#    if BOOST_PP_LOCAL_C(79)
+        BOOST_PP_LOCAL_MACRO(79)
+#    endif
+#    if BOOST_PP_LOCAL_C(80)
+        BOOST_PP_LOCAL_MACRO(80)
+#    endif
+#    if BOOST_PP_LOCAL_C(81)
+        BOOST_PP_LOCAL_MACRO(81)
+#    endif
+#    if BOOST_PP_LOCAL_C(82)
+        BOOST_PP_LOCAL_MACRO(82)
+#    endif
+#    if BOOST_PP_LOCAL_C(83)
+        BOOST_PP_LOCAL_MACRO(83)
+#    endif
+#    if BOOST_PP_LOCAL_C(84)
+        BOOST_PP_LOCAL_MACRO(84)
+#    endif
+#    if BOOST_PP_LOCAL_C(85)
+        BOOST_PP_LOCAL_MACRO(85)
+#    endif
+#    if BOOST_PP_LOCAL_C(86)
+        BOOST_PP_LOCAL_MACRO(86)
+#    endif
+#    if BOOST_PP_LOCAL_C(87)
+        BOOST_PP_LOCAL_MACRO(87)
+#    endif
+#    if BOOST_PP_LOCAL_C(88)
+        BOOST_PP_LOCAL_MACRO(88)
+#    endif
+#    if BOOST_PP_LOCAL_C(89)
+        BOOST_PP_LOCAL_MACRO(89)
+#    endif
+#    if BOOST_PP_LOCAL_C(90)
+        BOOST_PP_LOCAL_MACRO(90)
+#    endif
+#    if BOOST_PP_LOCAL_C(91)
+        BOOST_PP_LOCAL_MACRO(91)
+#    endif
+#    if BOOST_PP_LOCAL_C(92)
+        BOOST_PP_LOCAL_MACRO(92)
+#    endif
+#    if BOOST_PP_LOCAL_C(93)
+        BOOST_PP_LOCAL_MACRO(93)
+#    endif
+#    if BOOST_PP_LOCAL_C(94)
+        BOOST_PP_LOCAL_MACRO(94)
+#    endif
+#    if BOOST_PP_LOCAL_C(95)
+        BOOST_PP_LOCAL_MACRO(95)
+#    endif
+#    if BOOST_PP_LOCAL_C(96)
+        BOOST_PP_LOCAL_MACRO(96)
+#    endif
+#    if BOOST_PP_LOCAL_C(97)
+        BOOST_PP_LOCAL_MACRO(97)
+#    endif
+#    if BOOST_PP_LOCAL_C(98)
+        BOOST_PP_LOCAL_MACRO(98)
+#    endif
+#    if BOOST_PP_LOCAL_C(99)
+        BOOST_PP_LOCAL_MACRO(99)
+#    endif
+#    if BOOST_PP_LOCAL_C(100)
+        BOOST_PP_LOCAL_MACRO(100)
+#    endif
+#    if BOOST_PP_LOCAL_C(101)
+        BOOST_PP_LOCAL_MACRO(101)
+#    endif
+#    if BOOST_PP_LOCAL_C(102)
+        BOOST_PP_LOCAL_MACRO(102)
+#    endif
+#    if BOOST_PP_LOCAL_C(103)
+        BOOST_PP_LOCAL_MACRO(103)
+#    endif
+#    if BOOST_PP_LOCAL_C(104)
+        BOOST_PP_LOCAL_MACRO(104)
+#    endif
+#    if BOOST_PP_LOCAL_C(105)
+        BOOST_PP_LOCAL_MACRO(105)
+#    endif
+#    if BOOST_PP_LOCAL_C(106)
+        BOOST_PP_LOCAL_MACRO(106)
+#    endif
+#    if BOOST_PP_LOCAL_C(107)
+        BOOST_PP_LOCAL_MACRO(107)
+#    endif
+#    if BOOST_PP_LOCAL_C(108)
+        BOOST_PP_LOCAL_MACRO(108)
+#    endif
+#    if BOOST_PP_LOCAL_C(109)
+        BOOST_PP_LOCAL_MACRO(109)
+#    endif
+#    if BOOST_PP_LOCAL_C(110)
+        BOOST_PP_LOCAL_MACRO(110)
+#    endif
+#    if BOOST_PP_LOCAL_C(111)
+        BOOST_PP_LOCAL_MACRO(111)
+#    endif
+#    if BOOST_PP_LOCAL_C(112)
+        BOOST_PP_LOCAL_MACRO(112)
+#    endif
+#    if BOOST_PP_LOCAL_C(113)
+        BOOST_PP_LOCAL_MACRO(113)
+#    endif
+#    if BOOST_PP_LOCAL_C(114)
+        BOOST_PP_LOCAL_MACRO(114)
+#    endif
+#    if BOOST_PP_LOCAL_C(115)
+        BOOST_PP_LOCAL_MACRO(115)
+#    endif
+#    if BOOST_PP_LOCAL_C(116)
+        BOOST_PP_LOCAL_MACRO(116)
+#    endif
+#    if BOOST_PP_LOCAL_C(117)
+        BOOST_PP_LOCAL_MACRO(117)
+#    endif
+#    if BOOST_PP_LOCAL_C(118)
+        BOOST_PP_LOCAL_MACRO(118)
+#    endif
+#    if BOOST_PP_LOCAL_C(119)
+        BOOST_PP_LOCAL_MACRO(119)
+#    endif
+#    if BOOST_PP_LOCAL_C(120)
+        BOOST_PP_LOCAL_MACRO(120)
+#    endif
+#    if BOOST_PP_LOCAL_C(121)
+        BOOST_PP_LOCAL_MACRO(121)
+#    endif
+#    if BOOST_PP_LOCAL_C(122)
+        BOOST_PP_LOCAL_MACRO(122)
+#    endif
+#    if BOOST_PP_LOCAL_C(123)
+        BOOST_PP_LOCAL_MACRO(123)
+#    endif
+#    if BOOST_PP_LOCAL_C(124)
+        BOOST_PP_LOCAL_MACRO(124)
+#    endif
+#    if BOOST_PP_LOCAL_C(125)
+        BOOST_PP_LOCAL_MACRO(125)
+#    endif
+#    if BOOST_PP_LOCAL_C(126)
+        BOOST_PP_LOCAL_MACRO(126)
+#    endif
+#    if BOOST_PP_LOCAL_C(127)
+        BOOST_PP_LOCAL_MACRO(127)
+#    endif
+#    if BOOST_PP_LOCAL_C(128)
+        BOOST_PP_LOCAL_MACRO(128)
+#    endif
+#    if BOOST_PP_LOCAL_C(129)
+        BOOST_PP_LOCAL_MACRO(129)
+#    endif
+#    if BOOST_PP_LOCAL_C(130)
+        BOOST_PP_LOCAL_MACRO(130)
+#    endif
+#    if BOOST_PP_LOCAL_C(131)
+        BOOST_PP_LOCAL_MACRO(131)
+#    endif
+#    if BOOST_PP_LOCAL_C(132)
+        BOOST_PP_LOCAL_MACRO(132)
+#    endif
+#    if BOOST_PP_LOCAL_C(133)
+        BOOST_PP_LOCAL_MACRO(133)
+#    endif
+#    if BOOST_PP_LOCAL_C(134)
+        BOOST_PP_LOCAL_MACRO(134)
+#    endif
+#    if BOOST_PP_LOCAL_C(135)
+        BOOST_PP_LOCAL_MACRO(135)
+#    endif
+#    if BOOST_PP_LOCAL_C(136)
+        BOOST_PP_LOCAL_MACRO(136)
+#    endif
+#    if BOOST_PP_LOCAL_C(137)
+        BOOST_PP_LOCAL_MACRO(137)
+#    endif
+#    if BOOST_PP_LOCAL_C(138)
+        BOOST_PP_LOCAL_MACRO(138)
+#    endif
+#    if BOOST_PP_LOCAL_C(139)
+        BOOST_PP_LOCAL_MACRO(139)
+#    endif
+#    if BOOST_PP_LOCAL_C(140)
+        BOOST_PP_LOCAL_MACRO(140)
+#    endif
+#    if BOOST_PP_LOCAL_C(141)
+        BOOST_PP_LOCAL_MACRO(141)
+#    endif
+#    if BOOST_PP_LOCAL_C(142)
+        BOOST_PP_LOCAL_MACRO(142)
+#    endif
+#    if BOOST_PP_LOCAL_C(143)
+        BOOST_PP_LOCAL_MACRO(143)
+#    endif
+#    if BOOST_PP_LOCAL_C(144)
+        BOOST_PP_LOCAL_MACRO(144)
+#    endif
+#    if BOOST_PP_LOCAL_C(145)
+        BOOST_PP_LOCAL_MACRO(145)
+#    endif
+#    if BOOST_PP_LOCAL_C(146)
+        BOOST_PP_LOCAL_MACRO(146)
+#    endif
+#    if BOOST_PP_LOCAL_C(147)
+        BOOST_PP_LOCAL_MACRO(147)
+#    endif
+#    if BOOST_PP_LOCAL_C(148)
+        BOOST_PP_LOCAL_MACRO(148)
+#    endif
+#    if BOOST_PP_LOCAL_C(149)
+        BOOST_PP_LOCAL_MACRO(149)
+#    endif
+#    if BOOST_PP_LOCAL_C(150)
+        BOOST_PP_LOCAL_MACRO(150)
+#    endif
+#    if BOOST_PP_LOCAL_C(151)
+        BOOST_PP_LOCAL_MACRO(151)
+#    endif
+#    if BOOST_PP_LOCAL_C(152)
+        BOOST_PP_LOCAL_MACRO(152)
+#    endif
+#    if BOOST_PP_LOCAL_C(153)
+        BOOST_PP_LOCAL_MACRO(153)
+#    endif
+#    if BOOST_PP_LOCAL_C(154)
+        BOOST_PP_LOCAL_MACRO(154)
+#    endif
+#    if BOOST_PP_LOCAL_C(155)
+        BOOST_PP_LOCAL_MACRO(155)
+#    endif
+#    if BOOST_PP_LOCAL_C(156)
+        BOOST_PP_LOCAL_MACRO(156)
+#    endif
+#    if BOOST_PP_LOCAL_C(157)
+        BOOST_PP_LOCAL_MACRO(157)
+#    endif
+#    if BOOST_PP_LOCAL_C(158)
+        BOOST_PP_LOCAL_MACRO(158)
+#    endif
+#    if BOOST_PP_LOCAL_C(159)
+        BOOST_PP_LOCAL_MACRO(159)
+#    endif
+#    if BOOST_PP_LOCAL_C(160)
+        BOOST_PP_LOCAL_MACRO(160)
+#    endif
+#    if BOOST_PP_LOCAL_C(161)
+        BOOST_PP_LOCAL_MACRO(161)
+#    endif
+#    if BOOST_PP_LOCAL_C(162)
+        BOOST_PP_LOCAL_MACRO(162)
+#    endif
+#    if BOOST_PP_LOCAL_C(163)
+        BOOST_PP_LOCAL_MACRO(163)
+#    endif
+#    if BOOST_PP_LOCAL_C(164)
+        BOOST_PP_LOCAL_MACRO(164)
+#    endif
+#    if BOOST_PP_LOCAL_C(165)
+        BOOST_PP_LOCAL_MACRO(165)
+#    endif
+#    if BOOST_PP_LOCAL_C(166)
+        BOOST_PP_LOCAL_MACRO(166)
+#    endif
+#    if BOOST_PP_LOCAL_C(167)
+        BOOST_PP_LOCAL_MACRO(167)
+#    endif
+#    if BOOST_PP_LOCAL_C(168)
+        BOOST_PP_LOCAL_MACRO(168)
+#    endif
+#    if BOOST_PP_LOCAL_C(169)
+        BOOST_PP_LOCAL_MACRO(169)
+#    endif
+#    if BOOST_PP_LOCAL_C(170)
+        BOOST_PP_LOCAL_MACRO(170)
+#    endif
+#    if BOOST_PP_LOCAL_C(171)
+        BOOST_PP_LOCAL_MACRO(171)
+#    endif
+#    if BOOST_PP_LOCAL_C(172)
+        BOOST_PP_LOCAL_MACRO(172)
+#    endif
+#    if BOOST_PP_LOCAL_C(173)
+        BOOST_PP_LOCAL_MACRO(173)
+#    endif
+#    if BOOST_PP_LOCAL_C(174)
+        BOOST_PP_LOCAL_MACRO(174)
+#    endif
+#    if BOOST_PP_LOCAL_C(175)
+        BOOST_PP_LOCAL_MACRO(175)
+#    endif
+#    if BOOST_PP_LOCAL_C(176)
+        BOOST_PP_LOCAL_MACRO(176)
+#    endif
+#    if BOOST_PP_LOCAL_C(177)
+        BOOST_PP_LOCAL_MACRO(177)
+#    endif
+#    if BOOST_PP_LOCAL_C(178)
+        BOOST_PP_LOCAL_MACRO(178)
+#    endif
+#    if BOOST_PP_LOCAL_C(179)
+        BOOST_PP_LOCAL_MACRO(179)
+#    endif
+#    if BOOST_PP_LOCAL_C(180)
+        BOOST_PP_LOCAL_MACRO(180)
+#    endif
+#    if BOOST_PP_LOCAL_C(181)
+        BOOST_PP_LOCAL_MACRO(181)
+#    endif
+#    if BOOST_PP_LOCAL_C(182)
+        BOOST_PP_LOCAL_MACRO(182)
+#    endif
+#    if BOOST_PP_LOCAL_C(183)
+        BOOST_PP_LOCAL_MACRO(183)
+#    endif
+#    if BOOST_PP_LOCAL_C(184)
+        BOOST_PP_LOCAL_MACRO(184)
+#    endif
+#    if BOOST_PP_LOCAL_C(185)
+        BOOST_PP_LOCAL_MACRO(185)
+#    endif
+#    if BOOST_PP_LOCAL_C(186)
+        BOOST_PP_LOCAL_MACRO(186)
+#    endif
+#    if BOOST_PP_LOCAL_C(187)
+        BOOST_PP_LOCAL_MACRO(187)
+#    endif
+#    if BOOST_PP_LOCAL_C(188)
+        BOOST_PP_LOCAL_MACRO(188)
+#    endif
+#    if BOOST_PP_LOCAL_C(189)
+        BOOST_PP_LOCAL_MACRO(189)
+#    endif
+#    if BOOST_PP_LOCAL_C(190)
+        BOOST_PP_LOCAL_MACRO(190)
+#    endif
+#    if BOOST_PP_LOCAL_C(191)
+        BOOST_PP_LOCAL_MACRO(191)
+#    endif
+#    if BOOST_PP_LOCAL_C(192)
+        BOOST_PP_LOCAL_MACRO(192)
+#    endif
+#    if BOOST_PP_LOCAL_C(193)
+        BOOST_PP_LOCAL_MACRO(193)
+#    endif
+#    if BOOST_PP_LOCAL_C(194)
+        BOOST_PP_LOCAL_MACRO(194)
+#    endif
+#    if BOOST_PP_LOCAL_C(195)
+        BOOST_PP_LOCAL_MACRO(195)
+#    endif
+#    if BOOST_PP_LOCAL_C(196)
+        BOOST_PP_LOCAL_MACRO(196)
+#    endif
+#    if BOOST_PP_LOCAL_C(197)
+        BOOST_PP_LOCAL_MACRO(197)
+#    endif
+#    if BOOST_PP_LOCAL_C(198)
+        BOOST_PP_LOCAL_MACRO(198)
+#    endif
+#    if BOOST_PP_LOCAL_C(199)
+        BOOST_PP_LOCAL_MACRO(199)
+#    endif
+#    if BOOST_PP_LOCAL_C(200)
+        BOOST_PP_LOCAL_MACRO(200)
+#    endif
+#    if BOOST_PP_LOCAL_C(201)
+        BOOST_PP_LOCAL_MACRO(201)
+#    endif
+#    if BOOST_PP_LOCAL_C(202)
+        BOOST_PP_LOCAL_MACRO(202)
+#    endif
+#    if BOOST_PP_LOCAL_C(203)
+        BOOST_PP_LOCAL_MACRO(203)
+#    endif
+#    if BOOST_PP_LOCAL_C(204)
+        BOOST_PP_LOCAL_MACRO(204)
+#    endif
+#    if BOOST_PP_LOCAL_C(205)
+        BOOST_PP_LOCAL_MACRO(205)
+#    endif
+#    if BOOST_PP_LOCAL_C(206)
+        BOOST_PP_LOCAL_MACRO(206)
+#    endif
+#    if BOOST_PP_LOCAL_C(207)
+        BOOST_PP_LOCAL_MACRO(207)
+#    endif
+#    if BOOST_PP_LOCAL_C(208)
+        BOOST_PP_LOCAL_MACRO(208)
+#    endif
+#    if BOOST_PP_LOCAL_C(209)
+        BOOST_PP_LOCAL_MACRO(209)
+#    endif
+#    if BOOST_PP_LOCAL_C(210)
+        BOOST_PP_LOCAL_MACRO(210)
+#    endif
+#    if BOOST_PP_LOCAL_C(211)
+        BOOST_PP_LOCAL_MACRO(211)
+#    endif
+#    if BOOST_PP_LOCAL_C(212)
+        BOOST_PP_LOCAL_MACRO(212)
+#    endif
+#    if BOOST_PP_LOCAL_C(213)
+        BOOST_PP_LOCAL_MACRO(213)
+#    endif
+#    if BOOST_PP_LOCAL_C(214)
+        BOOST_PP_LOCAL_MACRO(214)
+#    endif
+#    if BOOST_PP_LOCAL_C(215)
+        BOOST_PP_LOCAL_MACRO(215)
+#    endif
+#    if BOOST_PP_LOCAL_C(216)
+        BOOST_PP_LOCAL_MACRO(216)
+#    endif
+#    if BOOST_PP_LOCAL_C(217)
+        BOOST_PP_LOCAL_MACRO(217)
+#    endif
+#    if BOOST_PP_LOCAL_C(218)
+        BOOST_PP_LOCAL_MACRO(218)
+#    endif
+#    if BOOST_PP_LOCAL_C(219)
+        BOOST_PP_LOCAL_MACRO(219)
+#    endif
+#    if BOOST_PP_LOCAL_C(220)
+        BOOST_PP_LOCAL_MACRO(220)
+#    endif
+#    if BOOST_PP_LOCAL_C(221)
+        BOOST_PP_LOCAL_MACRO(221)
+#    endif
+#    if BOOST_PP_LOCAL_C(222)
+        BOOST_PP_LOCAL_MACRO(222)
+#    endif
+#    if BOOST_PP_LOCAL_C(223)
+        BOOST_PP_LOCAL_MACRO(223)
+#    endif
+#    if BOOST_PP_LOCAL_C(224)
+        BOOST_PP_LOCAL_MACRO(224)
+#    endif
+#    if BOOST_PP_LOCAL_C(225)
+        BOOST_PP_LOCAL_MACRO(225)
+#    endif
+#    if BOOST_PP_LOCAL_C(226)
+        BOOST_PP_LOCAL_MACRO(226)
+#    endif
+#    if BOOST_PP_LOCAL_C(227)
+        BOOST_PP_LOCAL_MACRO(227)
+#    endif
+#    if BOOST_PP_LOCAL_C(228)
+        BOOST_PP_LOCAL_MACRO(228)
+#    endif
+#    if BOOST_PP_LOCAL_C(229)
+        BOOST_PP_LOCAL_MACRO(229)
+#    endif
+#    if BOOST_PP_LOCAL_C(230)
+        BOOST_PP_LOCAL_MACRO(230)
+#    endif
+#    if BOOST_PP_LOCAL_C(231)
+        BOOST_PP_LOCAL_MACRO(231)
+#    endif
+#    if BOOST_PP_LOCAL_C(232)
+        BOOST_PP_LOCAL_MACRO(232)
+#    endif
+#    if BOOST_PP_LOCAL_C(233)
+        BOOST_PP_LOCAL_MACRO(233)
+#    endif
+#    if BOOST_PP_LOCAL_C(234)
+        BOOST_PP_LOCAL_MACRO(234)
+#    endif
+#    if BOOST_PP_LOCAL_C(235)
+        BOOST_PP_LOCAL_MACRO(235)
+#    endif
+#    if BOOST_PP_LOCAL_C(236)
+        BOOST_PP_LOCAL_MACRO(236)
+#    endif
+
+#    if BOOST_PP_LOCAL_C(237)
+        BOOST_PP_LOCAL_MACRO(237)
+#    endif
+#    if BOOST_PP_LOCAL_C(238)
+        BOOST_PP_LOCAL_MACRO(238)
+#    endif
+#    if BOOST_PP_LOCAL_C(239)
+        BOOST_PP_LOCAL_MACRO(239)
+#    endif
+#    if BOOST_PP_LOCAL_C(240)
+        BOOST_PP_LOCAL_MACRO(240)
+#    endif
+#    if BOOST_PP_LOCAL_C(241)
+        BOOST_PP_LOCAL_MACRO(241)
+#    endif
+#    if BOOST_PP_LOCAL_C(242)
+        BOOST_PP_LOCAL_MACRO(242)
+#    endif
+#    if BOOST_PP_LOCAL_C(243)
+        BOOST_PP_LOCAL_MACRO(243)
+#    endif
+#    if BOOST_PP_LOCAL_C(244)
+        BOOST_PP_LOCAL_MACRO(244)
+#    endif
+#    if BOOST_PP_LOCAL_C(245)
+        BOOST_PP_LOCAL_MACRO(245)
+#    endif
+#    if BOOST_PP_LOCAL_C(246)
+        BOOST_PP_LOCAL_MACRO(246)
+#    endif
+#    if BOOST_PP_LOCAL_C(247)
+        BOOST_PP_LOCAL_MACRO(247)
+#    endif
+#    if BOOST_PP_LOCAL_C(248)
+        BOOST_PP_LOCAL_MACRO(248)
+#    endif
+#    if BOOST_PP_LOCAL_C(249)
+        BOOST_PP_LOCAL_MACRO(249)
+#    endif
+#    if BOOST_PP_LOCAL_C(250)
+        BOOST_PP_LOCAL_MACRO(250)
+#    endif
+#    if BOOST_PP_LOCAL_C(251)
+        BOOST_PP_LOCAL_MACRO(251)
+#    endif
+#    if BOOST_PP_LOCAL_C(252)
+        BOOST_PP_LOCAL_MACRO(252)
+#    endif
+#    if BOOST_PP_LOCAL_C(253)
+        BOOST_PP_LOCAL_MACRO(253)
+#    endif
+#    if BOOST_PP_LOCAL_C(254)
+        BOOST_PP_LOCAL_MACRO(254)
+#    endif
+#    if BOOST_PP_LOCAL_C(255)
+        BOOST_PP_LOCAL_MACRO(255)
+#    endif
+#    if BOOST_PP_LOCAL_C(256)
+        BOOST_PP_LOCAL_MACRO(256)
+#    endif
+# endif
+#
+# undef BOOST_PP_LOCAL_LIMITS
+#
+# undef BOOST_PP_LOCAL_S
+# undef BOOST_PP_LOCAL_F
+#
+# undef BOOST_PP_LOCAL_MACRO
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/rlocal.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/rlocal.hpp
new file mode 100644
index 0000000..413afa0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/rlocal.hpp
@@ -0,0 +1,782 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_LOCAL_R(256)
+    BOOST_PP_LOCAL_MACRO(256)
+# endif
+# if BOOST_PP_LOCAL_R(255)
+    BOOST_PP_LOCAL_MACRO(255)
+# endif
+# if BOOST_PP_LOCAL_R(254)
+    BOOST_PP_LOCAL_MACRO(254)
+# endif
+# if BOOST_PP_LOCAL_R(253)
+    BOOST_PP_LOCAL_MACRO(253)
+# endif
+# if BOOST_PP_LOCAL_R(252)
+    BOOST_PP_LOCAL_MACRO(252)
+# endif
+# if BOOST_PP_LOCAL_R(251)
+    BOOST_PP_LOCAL_MACRO(251)
+# endif
+# if BOOST_PP_LOCAL_R(250)
+    BOOST_PP_LOCAL_MACRO(250)
+# endif
+# if BOOST_PP_LOCAL_R(249)
+    BOOST_PP_LOCAL_MACRO(249)
+# endif
+# if BOOST_PP_LOCAL_R(248)
+    BOOST_PP_LOCAL_MACRO(248)
+# endif
+# if BOOST_PP_LOCAL_R(247)
+    BOOST_PP_LOCAL_MACRO(247)
+# endif
+# if BOOST_PP_LOCAL_R(246)
+    BOOST_PP_LOCAL_MACRO(246)
+# endif
+# if BOOST_PP_LOCAL_R(245)
+    BOOST_PP_LOCAL_MACRO(245)
+# endif
+# if BOOST_PP_LOCAL_R(244)
+    BOOST_PP_LOCAL_MACRO(244)
+# endif
+# if BOOST_PP_LOCAL_R(243)
+    BOOST_PP_LOCAL_MACRO(243)
+# endif
+# if BOOST_PP_LOCAL_R(242)
+    BOOST_PP_LOCAL_MACRO(242)
+# endif
+# if BOOST_PP_LOCAL_R(241)
+    BOOST_PP_LOCAL_MACRO(241)
+# endif
+# if BOOST_PP_LOCAL_R(240)
+    BOOST_PP_LOCAL_MACRO(240)
+# endif
+# if BOOST_PP_LOCAL_R(239)
+    BOOST_PP_LOCAL_MACRO(239)
+# endif
+# if BOOST_PP_LOCAL_R(238)
+    BOOST_PP_LOCAL_MACRO(238)
+# endif
+# if BOOST_PP_LOCAL_R(237)
+    BOOST_PP_LOCAL_MACRO(237)
+# endif
+# if BOOST_PP_LOCAL_R(236)
+    BOOST_PP_LOCAL_MACRO(236)
+# endif
+# if BOOST_PP_LOCAL_R(235)
+    BOOST_PP_LOCAL_MACRO(235)
+# endif
+# if BOOST_PP_LOCAL_R(234)
+    BOOST_PP_LOCAL_MACRO(234)
+# endif
+# if BOOST_PP_LOCAL_R(233)
+    BOOST_PP_LOCAL_MACRO(233)
+# endif
+# if BOOST_PP_LOCAL_R(232)
+    BOOST_PP_LOCAL_MACRO(232)
+# endif
+# if BOOST_PP_LOCAL_R(231)
+    BOOST_PP_LOCAL_MACRO(231)
+# endif
+# if BOOST_PP_LOCAL_R(230)
+    BOOST_PP_LOCAL_MACRO(230)
+# endif
+# if BOOST_PP_LOCAL_R(229)
+    BOOST_PP_LOCAL_MACRO(229)
+# endif
+# if BOOST_PP_LOCAL_R(228)
+    BOOST_PP_LOCAL_MACRO(228)
+# endif
+# if BOOST_PP_LOCAL_R(227)
+    BOOST_PP_LOCAL_MACRO(227)
+# endif
+# if BOOST_PP_LOCAL_R(226)
+    BOOST_PP_LOCAL_MACRO(226)
+# endif
+# if BOOST_PP_LOCAL_R(225)
+    BOOST_PP_LOCAL_MACRO(225)
+# endif
+# if BOOST_PP_LOCAL_R(224)
+    BOOST_PP_LOCAL_MACRO(224)
+# endif
+# if BOOST_PP_LOCAL_R(223)
+    BOOST_PP_LOCAL_MACRO(223)
+# endif
+# if BOOST_PP_LOCAL_R(222)
+    BOOST_PP_LOCAL_MACRO(222)
+# endif
+# if BOOST_PP_LOCAL_R(221)
+    BOOST_PP_LOCAL_MACRO(221)
+# endif
+# if BOOST_PP_LOCAL_R(220)
+    BOOST_PP_LOCAL_MACRO(220)
+# endif
+# if BOOST_PP_LOCAL_R(219)
+    BOOST_PP_LOCAL_MACRO(219)
+# endif
+# if BOOST_PP_LOCAL_R(218)
+    BOOST_PP_LOCAL_MACRO(218)
+# endif
+# if BOOST_PP_LOCAL_R(217)
+    BOOST_PP_LOCAL_MACRO(217)
+# endif
+# if BOOST_PP_LOCAL_R(216)
+    BOOST_PP_LOCAL_MACRO(216)
+# endif
+# if BOOST_PP_LOCAL_R(215)
+    BOOST_PP_LOCAL_MACRO(215)
+# endif
+# if BOOST_PP_LOCAL_R(214)
+    BOOST_PP_LOCAL_MACRO(214)
+# endif
+# if BOOST_PP_LOCAL_R(213)
+    BOOST_PP_LOCAL_MACRO(213)
+# endif
+# if BOOST_PP_LOCAL_R(212)
+    BOOST_PP_LOCAL_MACRO(212)
+# endif
+# if BOOST_PP_LOCAL_R(211)
+    BOOST_PP_LOCAL_MACRO(211)
+# endif
+# if BOOST_PP_LOCAL_R(210)
+    BOOST_PP_LOCAL_MACRO(210)
+# endif
+# if BOOST_PP_LOCAL_R(209)
+    BOOST_PP_LOCAL_MACRO(209)
+# endif
+# if BOOST_PP_LOCAL_R(208)
+    BOOST_PP_LOCAL_MACRO(208)
+# endif
+# if BOOST_PP_LOCAL_R(207)
+    BOOST_PP_LOCAL_MACRO(207)
+# endif
+# if BOOST_PP_LOCAL_R(206)
+    BOOST_PP_LOCAL_MACRO(206)
+# endif
+# if BOOST_PP_LOCAL_R(205)
+    BOOST_PP_LOCAL_MACRO(205)
+# endif
+# if BOOST_PP_LOCAL_R(204)
+    BOOST_PP_LOCAL_MACRO(204)
+# endif
+# if BOOST_PP_LOCAL_R(203)
+    BOOST_PP_LOCAL_MACRO(203)
+# endif
+# if BOOST_PP_LOCAL_R(202)
+    BOOST_PP_LOCAL_MACRO(202)
+# endif
+# if BOOST_PP_LOCAL_R(201)
+    BOOST_PP_LOCAL_MACRO(201)
+# endif
+# if BOOST_PP_LOCAL_R(200)
+    BOOST_PP_LOCAL_MACRO(200)
+# endif
+# if BOOST_PP_LOCAL_R(199)
+    BOOST_PP_LOCAL_MACRO(199)
+# endif
+# if BOOST_PP_LOCAL_R(198)
+    BOOST_PP_LOCAL_MACRO(198)
+# endif
+# if BOOST_PP_LOCAL_R(197)
+    BOOST_PP_LOCAL_MACRO(197)
+# endif
+# if BOOST_PP_LOCAL_R(196)
+    BOOST_PP_LOCAL_MACRO(196)
+# endif
+# if BOOST_PP_LOCAL_R(195)
+    BOOST_PP_LOCAL_MACRO(195)
+# endif
+# if BOOST_PP_LOCAL_R(194)
+    BOOST_PP_LOCAL_MACRO(194)
+# endif
+# if BOOST_PP_LOCAL_R(193)
+    BOOST_PP_LOCAL_MACRO(193)
+# endif
+# if BOOST_PP_LOCAL_R(192)
+    BOOST_PP_LOCAL_MACRO(192)
+# endif
+# if BOOST_PP_LOCAL_R(191)
+    BOOST_PP_LOCAL_MACRO(191)
+# endif
+# if BOOST_PP_LOCAL_R(190)
+    BOOST_PP_LOCAL_MACRO(190)
+# endif
+# if BOOST_PP_LOCAL_R(189)
+    BOOST_PP_LOCAL_MACRO(189)
+# endif
+# if BOOST_PP_LOCAL_R(188)
+    BOOST_PP_LOCAL_MACRO(188)
+# endif
+# if BOOST_PP_LOCAL_R(187)
+    BOOST_PP_LOCAL_MACRO(187)
+# endif
+# if BOOST_PP_LOCAL_R(186)
+    BOOST_PP_LOCAL_MACRO(186)
+# endif
+# if BOOST_PP_LOCAL_R(185)
+    BOOST_PP_LOCAL_MACRO(185)
+# endif
+# if BOOST_PP_LOCAL_R(184)
+    BOOST_PP_LOCAL_MACRO(184)
+# endif
+# if BOOST_PP_LOCAL_R(183)
+    BOOST_PP_LOCAL_MACRO(183)
+# endif
+# if BOOST_PP_LOCAL_R(182)
+    BOOST_PP_LOCAL_MACRO(182)
+# endif
+# if BOOST_PP_LOCAL_R(181)
+    BOOST_PP_LOCAL_MACRO(181)
+# endif
+# if BOOST_PP_LOCAL_R(180)
+    BOOST_PP_LOCAL_MACRO(180)
+# endif
+# if BOOST_PP_LOCAL_R(179)
+    BOOST_PP_LOCAL_MACRO(179)
+# endif
+# if BOOST_PP_LOCAL_R(178)
+    BOOST_PP_LOCAL_MACRO(178)
+# endif
+# if BOOST_PP_LOCAL_R(177)
+    BOOST_PP_LOCAL_MACRO(177)
+# endif
+# if BOOST_PP_LOCAL_R(176)
+    BOOST_PP_LOCAL_MACRO(176)
+# endif
+# if BOOST_PP_LOCAL_R(175)
+    BOOST_PP_LOCAL_MACRO(175)
+# endif
+# if BOOST_PP_LOCAL_R(174)
+    BOOST_PP_LOCAL_MACRO(174)
+# endif
+# if BOOST_PP_LOCAL_R(173)
+    BOOST_PP_LOCAL_MACRO(173)
+# endif
+# if BOOST_PP_LOCAL_R(172)
+    BOOST_PP_LOCAL_MACRO(172)
+# endif
+# if BOOST_PP_LOCAL_R(171)
+    BOOST_PP_LOCAL_MACRO(171)
+# endif
+# if BOOST_PP_LOCAL_R(170)
+    BOOST_PP_LOCAL_MACRO(170)
+# endif
+# if BOOST_PP_LOCAL_R(169)
+    BOOST_PP_LOCAL_MACRO(169)
+# endif
+# if BOOST_PP_LOCAL_R(168)
+    BOOST_PP_LOCAL_MACRO(168)
+# endif
+# if BOOST_PP_LOCAL_R(167)
+    BOOST_PP_LOCAL_MACRO(167)
+# endif
+# if BOOST_PP_LOCAL_R(166)
+    BOOST_PP_LOCAL_MACRO(166)
+# endif
+# if BOOST_PP_LOCAL_R(165)
+    BOOST_PP_LOCAL_MACRO(165)
+# endif
+# if BOOST_PP_LOCAL_R(164)
+    BOOST_PP_LOCAL_MACRO(164)
+# endif
+# if BOOST_PP_LOCAL_R(163)
+    BOOST_PP_LOCAL_MACRO(163)
+# endif
+# if BOOST_PP_LOCAL_R(162)
+    BOOST_PP_LOCAL_MACRO(162)
+# endif
+# if BOOST_PP_LOCAL_R(161)
+    BOOST_PP_LOCAL_MACRO(161)
+# endif
+# if BOOST_PP_LOCAL_R(160)
+    BOOST_PP_LOCAL_MACRO(160)
+# endif
+# if BOOST_PP_LOCAL_R(159)
+    BOOST_PP_LOCAL_MACRO(159)
+# endif
+# if BOOST_PP_LOCAL_R(158)
+    BOOST_PP_LOCAL_MACRO(158)
+# endif
+# if BOOST_PP_LOCAL_R(157)
+    BOOST_PP_LOCAL_MACRO(157)
+# endif
+# if BOOST_PP_LOCAL_R(156)
+    BOOST_PP_LOCAL_MACRO(156)
+# endif
+# if BOOST_PP_LOCAL_R(155)
+    BOOST_PP_LOCAL_MACRO(155)
+# endif
+# if BOOST_PP_LOCAL_R(154)
+    BOOST_PP_LOCAL_MACRO(154)
+# endif
+# if BOOST_PP_LOCAL_R(153)
+    BOOST_PP_LOCAL_MACRO(153)
+# endif
+# if BOOST_PP_LOCAL_R(152)
+    BOOST_PP_LOCAL_MACRO(152)
+# endif
+# if BOOST_PP_LOCAL_R(151)
+    BOOST_PP_LOCAL_MACRO(151)
+# endif
+# if BOOST_PP_LOCAL_R(150)
+    BOOST_PP_LOCAL_MACRO(150)
+# endif
+# if BOOST_PP_LOCAL_R(149)
+    BOOST_PP_LOCAL_MACRO(149)
+# endif
+# if BOOST_PP_LOCAL_R(148)
+    BOOST_PP_LOCAL_MACRO(148)
+# endif
+# if BOOST_PP_LOCAL_R(147)
+    BOOST_PP_LOCAL_MACRO(147)
+# endif
+# if BOOST_PP_LOCAL_R(146)
+    BOOST_PP_LOCAL_MACRO(146)
+# endif
+# if BOOST_PP_LOCAL_R(145)
+    BOOST_PP_LOCAL_MACRO(145)
+# endif
+# if BOOST_PP_LOCAL_R(144)
+    BOOST_PP_LOCAL_MACRO(144)
+# endif
+# if BOOST_PP_LOCAL_R(143)
+    BOOST_PP_LOCAL_MACRO(143)
+# endif
+# if BOOST_PP_LOCAL_R(142)
+    BOOST_PP_LOCAL_MACRO(142)
+# endif
+# if BOOST_PP_LOCAL_R(141)
+    BOOST_PP_LOCAL_MACRO(141)
+# endif
+# if BOOST_PP_LOCAL_R(140)
+    BOOST_PP_LOCAL_MACRO(140)
+# endif
+# if BOOST_PP_LOCAL_R(139)
+    BOOST_PP_LOCAL_MACRO(139)
+# endif
+# if BOOST_PP_LOCAL_R(138)
+    BOOST_PP_LOCAL_MACRO(138)
+# endif
+# if BOOST_PP_LOCAL_R(137)
+    BOOST_PP_LOCAL_MACRO(137)
+# endif
+# if BOOST_PP_LOCAL_R(136)
+    BOOST_PP_LOCAL_MACRO(136)
+# endif
+# if BOOST_PP_LOCAL_R(135)
+    BOOST_PP_LOCAL_MACRO(135)
+# endif
+# if BOOST_PP_LOCAL_R(134)
+    BOOST_PP_LOCAL_MACRO(134)
+# endif
+# if BOOST_PP_LOCAL_R(133)
+    BOOST_PP_LOCAL_MACRO(133)
+# endif
+# if BOOST_PP_LOCAL_R(132)
+    BOOST_PP_LOCAL_MACRO(132)
+# endif
+# if BOOST_PP_LOCAL_R(131)
+    BOOST_PP_LOCAL_MACRO(131)
+# endif
+# if BOOST_PP_LOCAL_R(130)
+    BOOST_PP_LOCAL_MACRO(130)
+# endif
+# if BOOST_PP_LOCAL_R(129)
+    BOOST_PP_LOCAL_MACRO(129)
+# endif
+# if BOOST_PP_LOCAL_R(128)
+    BOOST_PP_LOCAL_MACRO(128)
+# endif
+# if BOOST_PP_LOCAL_R(127)
+    BOOST_PP_LOCAL_MACRO(127)
+# endif
+# if BOOST_PP_LOCAL_R(126)
+    BOOST_PP_LOCAL_MACRO(126)
+# endif
+# if BOOST_PP_LOCAL_R(125)
+    BOOST_PP_LOCAL_MACRO(125)
+# endif
+# if BOOST_PP_LOCAL_R(124)
+    BOOST_PP_LOCAL_MACRO(124)
+# endif
+# if BOOST_PP_LOCAL_R(123)
+    BOOST_PP_LOCAL_MACRO(123)
+# endif
+# if BOOST_PP_LOCAL_R(122)
+    BOOST_PP_LOCAL_MACRO(122)
+# endif
+# if BOOST_PP_LOCAL_R(121)
+    BOOST_PP_LOCAL_MACRO(121)
+# endif
+# if BOOST_PP_LOCAL_R(120)
+    BOOST_PP_LOCAL_MACRO(120)
+# endif
+# if BOOST_PP_LOCAL_R(119)
+    BOOST_PP_LOCAL_MACRO(119)
+# endif
+# if BOOST_PP_LOCAL_R(118)
+    BOOST_PP_LOCAL_MACRO(118)
+# endif
+# if BOOST_PP_LOCAL_R(117)
+    BOOST_PP_LOCAL_MACRO(117)
+# endif
+# if BOOST_PP_LOCAL_R(116)
+    BOOST_PP_LOCAL_MACRO(116)
+# endif
+# if BOOST_PP_LOCAL_R(115)
+    BOOST_PP_LOCAL_MACRO(115)
+# endif
+# if BOOST_PP_LOCAL_R(114)
+    BOOST_PP_LOCAL_MACRO(114)
+# endif
+# if BOOST_PP_LOCAL_R(113)
+    BOOST_PP_LOCAL_MACRO(113)
+# endif
+# if BOOST_PP_LOCAL_R(112)
+    BOOST_PP_LOCAL_MACRO(112)
+# endif
+# if BOOST_PP_LOCAL_R(111)
+    BOOST_PP_LOCAL_MACRO(111)
+# endif
+# if BOOST_PP_LOCAL_R(110)
+    BOOST_PP_LOCAL_MACRO(110)
+# endif
+# if BOOST_PP_LOCAL_R(109)
+    BOOST_PP_LOCAL_MACRO(109)
+# endif
+# if BOOST_PP_LOCAL_R(108)
+    BOOST_PP_LOCAL_MACRO(108)
+# endif
+# if BOOST_PP_LOCAL_R(107)
+    BOOST_PP_LOCAL_MACRO(107)
+# endif
+# if BOOST_PP_LOCAL_R(106)
+    BOOST_PP_LOCAL_MACRO(106)
+# endif
+# if BOOST_PP_LOCAL_R(105)
+    BOOST_PP_LOCAL_MACRO(105)
+# endif
+# if BOOST_PP_LOCAL_R(104)
+    BOOST_PP_LOCAL_MACRO(104)
+# endif
+# if BOOST_PP_LOCAL_R(103)
+    BOOST_PP_LOCAL_MACRO(103)
+# endif
+# if BOOST_PP_LOCAL_R(102)
+    BOOST_PP_LOCAL_MACRO(102)
+# endif
+# if BOOST_PP_LOCAL_R(101)
+    BOOST_PP_LOCAL_MACRO(101)
+# endif
+# if BOOST_PP_LOCAL_R(100)
+    BOOST_PP_LOCAL_MACRO(100)
+# endif
+# if BOOST_PP_LOCAL_R(99)
+    BOOST_PP_LOCAL_MACRO(99)
+# endif
+# if BOOST_PP_LOCAL_R(98)
+    BOOST_PP_LOCAL_MACRO(98)
+# endif
+# if BOOST_PP_LOCAL_R(97)
+    BOOST_PP_LOCAL_MACRO(97)
+# endif
+# if BOOST_PP_LOCAL_R(96)
+    BOOST_PP_LOCAL_MACRO(96)
+# endif
+# if BOOST_PP_LOCAL_R(95)
+    BOOST_PP_LOCAL_MACRO(95)
+# endif
+# if BOOST_PP_LOCAL_R(94)
+    BOOST_PP_LOCAL_MACRO(94)
+# endif
+# if BOOST_PP_LOCAL_R(93)
+    BOOST_PP_LOCAL_MACRO(93)
+# endif
+# if BOOST_PP_LOCAL_R(92)
+    BOOST_PP_LOCAL_MACRO(92)
+# endif
+# if BOOST_PP_LOCAL_R(91)
+    BOOST_PP_LOCAL_MACRO(91)
+# endif
+# if BOOST_PP_LOCAL_R(90)
+    BOOST_PP_LOCAL_MACRO(90)
+# endif
+# if BOOST_PP_LOCAL_R(89)
+    BOOST_PP_LOCAL_MACRO(89)
+# endif
+# if BOOST_PP_LOCAL_R(88)
+    BOOST_PP_LOCAL_MACRO(88)
+# endif
+# if BOOST_PP_LOCAL_R(87)
+    BOOST_PP_LOCAL_MACRO(87)
+# endif
+# if BOOST_PP_LOCAL_R(86)
+    BOOST_PP_LOCAL_MACRO(86)
+# endif
+# if BOOST_PP_LOCAL_R(85)
+    BOOST_PP_LOCAL_MACRO(85)
+# endif
+# if BOOST_PP_LOCAL_R(84)
+    BOOST_PP_LOCAL_MACRO(84)
+# endif
+# if BOOST_PP_LOCAL_R(83)
+    BOOST_PP_LOCAL_MACRO(83)
+# endif
+# if BOOST_PP_LOCAL_R(82)
+    BOOST_PP_LOCAL_MACRO(82)
+# endif
+# if BOOST_PP_LOCAL_R(81)
+    BOOST_PP_LOCAL_MACRO(81)
+# endif
+# if BOOST_PP_LOCAL_R(80)
+    BOOST_PP_LOCAL_MACRO(80)
+# endif
+# if BOOST_PP_LOCAL_R(79)
+    BOOST_PP_LOCAL_MACRO(79)
+# endif
+# if BOOST_PP_LOCAL_R(78)
+    BOOST_PP_LOCAL_MACRO(78)
+# endif
+# if BOOST_PP_LOCAL_R(77)
+    BOOST_PP_LOCAL_MACRO(77)
+# endif
+# if BOOST_PP_LOCAL_R(76)
+    BOOST_PP_LOCAL_MACRO(76)
+# endif
+# if BOOST_PP_LOCAL_R(75)
+    BOOST_PP_LOCAL_MACRO(75)
+# endif
+# if BOOST_PP_LOCAL_R(74)
+    BOOST_PP_LOCAL_MACRO(74)
+# endif
+# if BOOST_PP_LOCAL_R(73)
+    BOOST_PP_LOCAL_MACRO(73)
+# endif
+# if BOOST_PP_LOCAL_R(72)
+    BOOST_PP_LOCAL_MACRO(72)
+# endif
+# if BOOST_PP_LOCAL_R(71)
+    BOOST_PP_LOCAL_MACRO(71)
+# endif
+# if BOOST_PP_LOCAL_R(70)
+    BOOST_PP_LOCAL_MACRO(70)
+# endif
+# if BOOST_PP_LOCAL_R(69)
+    BOOST_PP_LOCAL_MACRO(69)
+# endif
+# if BOOST_PP_LOCAL_R(68)
+    BOOST_PP_LOCAL_MACRO(68)
+# endif
+# if BOOST_PP_LOCAL_R(67)
+    BOOST_PP_LOCAL_MACRO(67)
+# endif
+# if BOOST_PP_LOCAL_R(66)
+    BOOST_PP_LOCAL_MACRO(66)
+# endif
+# if BOOST_PP_LOCAL_R(65)
+    BOOST_PP_LOCAL_MACRO(65)
+# endif
+# if BOOST_PP_LOCAL_R(64)
+    BOOST_PP_LOCAL_MACRO(64)
+# endif
+# if BOOST_PP_LOCAL_R(63)
+    BOOST_PP_LOCAL_MACRO(63)
+# endif
+# if BOOST_PP_LOCAL_R(62)
+    BOOST_PP_LOCAL_MACRO(62)
+# endif
+# if BOOST_PP_LOCAL_R(61)
+    BOOST_PP_LOCAL_MACRO(61)
+# endif
+# if BOOST_PP_LOCAL_R(60)
+    BOOST_PP_LOCAL_MACRO(60)
+# endif
+# if BOOST_PP_LOCAL_R(59)
+    BOOST_PP_LOCAL_MACRO(59)
+# endif
+# if BOOST_PP_LOCAL_R(58)
+    BOOST_PP_LOCAL_MACRO(58)
+# endif
+# if BOOST_PP_LOCAL_R(57)
+    BOOST_PP_LOCAL_MACRO(57)
+# endif
+# if BOOST_PP_LOCAL_R(56)
+    BOOST_PP_LOCAL_MACRO(56)
+# endif
+# if BOOST_PP_LOCAL_R(55)
+    BOOST_PP_LOCAL_MACRO(55)
+# endif
+# if BOOST_PP_LOCAL_R(54)
+    BOOST_PP_LOCAL_MACRO(54)
+# endif
+# if BOOST_PP_LOCAL_R(53)
+    BOOST_PP_LOCAL_MACRO(53)
+# endif
+# if BOOST_PP_LOCAL_R(52)
+    BOOST_PP_LOCAL_MACRO(52)
+# endif
+# if BOOST_PP_LOCAL_R(51)
+    BOOST_PP_LOCAL_MACRO(51)
+# endif
+# if BOOST_PP_LOCAL_R(50)
+    BOOST_PP_LOCAL_MACRO(50)
+# endif
+# if BOOST_PP_LOCAL_R(49)
+    BOOST_PP_LOCAL_MACRO(49)
+# endif
+# if BOOST_PP_LOCAL_R(48)
+    BOOST_PP_LOCAL_MACRO(48)
+# endif
+# if BOOST_PP_LOCAL_R(47)
+    BOOST_PP_LOCAL_MACRO(47)
+# endif
+# if BOOST_PP_LOCAL_R(46)
+    BOOST_PP_LOCAL_MACRO(46)
+# endif
+# if BOOST_PP_LOCAL_R(45)
+    BOOST_PP_LOCAL_MACRO(45)
+# endif
+# if BOOST_PP_LOCAL_R(44)
+    BOOST_PP_LOCAL_MACRO(44)
+# endif
+# if BOOST_PP_LOCAL_R(43)
+    BOOST_PP_LOCAL_MACRO(43)
+# endif
+# if BOOST_PP_LOCAL_R(42)
+    BOOST_PP_LOCAL_MACRO(42)
+# endif
+# if BOOST_PP_LOCAL_R(41)
+    BOOST_PP_LOCAL_MACRO(41)
+# endif
+# if BOOST_PP_LOCAL_R(40)
+    BOOST_PP_LOCAL_MACRO(40)
+# endif
+# if BOOST_PP_LOCAL_R(39)
+    BOOST_PP_LOCAL_MACRO(39)
+# endif
+# if BOOST_PP_LOCAL_R(38)
+    BOOST_PP_LOCAL_MACRO(38)
+# endif
+# if BOOST_PP_LOCAL_R(37)
+    BOOST_PP_LOCAL_MACRO(37)
+# endif
+# if BOOST_PP_LOCAL_R(36)
+    BOOST_PP_LOCAL_MACRO(36)
+# endif
+# if BOOST_PP_LOCAL_R(35)
+    BOOST_PP_LOCAL_MACRO(35)
+# endif
+# if BOOST_PP_LOCAL_R(34)
+    BOOST_PP_LOCAL_MACRO(34)
+# endif
+# if BOOST_PP_LOCAL_R(33)
+    BOOST_PP_LOCAL_MACRO(33)
+# endif
+# if BOOST_PP_LOCAL_R(32)
+    BOOST_PP_LOCAL_MACRO(32)
+# endif
+# if BOOST_PP_LOCAL_R(31)
+    BOOST_PP_LOCAL_MACRO(31)
+# endif
+# if BOOST_PP_LOCAL_R(30)
+    BOOST_PP_LOCAL_MACRO(30)
+# endif
+# if BOOST_PP_LOCAL_R(29)
+    BOOST_PP_LOCAL_MACRO(29)
+# endif
+# if BOOST_PP_LOCAL_R(28)
+    BOOST_PP_LOCAL_MACRO(28)
+# endif
+# if BOOST_PP_LOCAL_R(27)
+    BOOST_PP_LOCAL_MACRO(27)
+# endif
+# if BOOST_PP_LOCAL_R(26)
+    BOOST_PP_LOCAL_MACRO(26)
+# endif
+# if BOOST_PP_LOCAL_R(25)
+    BOOST_PP_LOCAL_MACRO(25)
+# endif
+# if BOOST_PP_LOCAL_R(24)
+    BOOST_PP_LOCAL_MACRO(24)
+# endif
+# if BOOST_PP_LOCAL_R(23)
+    BOOST_PP_LOCAL_MACRO(23)
+# endif
+# if BOOST_PP_LOCAL_R(22)
+    BOOST_PP_LOCAL_MACRO(22)
+# endif
+# if BOOST_PP_LOCAL_R(21)
+    BOOST_PP_LOCAL_MACRO(21)
+# endif
+# if BOOST_PP_LOCAL_R(20)
+    BOOST_PP_LOCAL_MACRO(20)
+# endif
+# if BOOST_PP_LOCAL_R(19)
+    BOOST_PP_LOCAL_MACRO(19)
+# endif
+# if BOOST_PP_LOCAL_R(18)
+    BOOST_PP_LOCAL_MACRO(18)
+# endif
+# if BOOST_PP_LOCAL_R(17)
+    BOOST_PP_LOCAL_MACRO(17)
+# endif
+# if BOOST_PP_LOCAL_R(16)
+    BOOST_PP_LOCAL_MACRO(16)
+# endif
+# if BOOST_PP_LOCAL_R(15)
+    BOOST_PP_LOCAL_MACRO(15)
+# endif
+# if BOOST_PP_LOCAL_R(14)
+    BOOST_PP_LOCAL_MACRO(14)
+# endif
+# if BOOST_PP_LOCAL_R(13)
+    BOOST_PP_LOCAL_MACRO(13)
+# endif
+# if BOOST_PP_LOCAL_R(12)
+    BOOST_PP_LOCAL_MACRO(12)
+# endif
+# if BOOST_PP_LOCAL_R(11)
+    BOOST_PP_LOCAL_MACRO(11)
+# endif
+# if BOOST_PP_LOCAL_R(10)
+    BOOST_PP_LOCAL_MACRO(10)
+# endif
+# if BOOST_PP_LOCAL_R(9)
+    BOOST_PP_LOCAL_MACRO(9)
+# endif
+# if BOOST_PP_LOCAL_R(8)
+    BOOST_PP_LOCAL_MACRO(8)
+# endif
+# if BOOST_PP_LOCAL_R(7)
+    BOOST_PP_LOCAL_MACRO(7)
+# endif
+# if BOOST_PP_LOCAL_R(6)
+    BOOST_PP_LOCAL_MACRO(6)
+# endif
+# if BOOST_PP_LOCAL_R(5)
+    BOOST_PP_LOCAL_MACRO(5)
+# endif
+# if BOOST_PP_LOCAL_R(4)
+    BOOST_PP_LOCAL_MACRO(4)
+# endif
+# if BOOST_PP_LOCAL_R(3)
+    BOOST_PP_LOCAL_MACRO(3)
+# endif
+# if BOOST_PP_LOCAL_R(2)
+    BOOST_PP_LOCAL_MACRO(2)
+# endif
+# if BOOST_PP_LOCAL_R(1)
+    BOOST_PP_LOCAL_MACRO(1)
+# endif
+# if BOOST_PP_LOCAL_R(0)
+    BOOST_PP_LOCAL_MACRO(0)
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/self.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/self.hpp
new file mode 100644
index 0000000..757185c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/self.hpp
@@ -0,0 +1,21 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if !defined(BOOST_PP_INDIRECT_SELF)
+#    error BOOST_PP_ERROR:  no indirect file to include
+# endif
+#
+# define BOOST_PP_IS_SELFISH 1
+#
+# include BOOST_PP_INDIRECT_SELF
+#
+# undef BOOST_PP_IS_SELFISH
+# undef BOOST_PP_INDIRECT_SELF
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/detail/start.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/start.hpp
new file mode 100644
index 0000000..cbf0381
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/detail/start.hpp
@@ -0,0 +1,99 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_LOCAL_SE
+#
+# undef BOOST_PP_LOCAL_SE_DIGIT_1
+# undef BOOST_PP_LOCAL_SE_DIGIT_2
+# undef BOOST_PP_LOCAL_SE_DIGIT_3
+# undef BOOST_PP_LOCAL_SE_DIGIT_4
+# undef BOOST_PP_LOCAL_SE_DIGIT_5
+# undef BOOST_PP_LOCAL_SE_DIGIT_6
+# undef BOOST_PP_LOCAL_SE_DIGIT_7
+# undef BOOST_PP_LOCAL_SE_DIGIT_8
+# undef BOOST_PP_LOCAL_SE_DIGIT_9
+# undef BOOST_PP_LOCAL_SE_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_LOCAL_SE_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_LOCAL_SE_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_LOCAL_SE_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_LOCAL_SE_DIGIT_3
+#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_SE_DIGIT_3, BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)
+# elif BOOST_PP_LOCAL_SE_DIGIT_2
+#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)
+# else
+#    define BOOST_PP_LOCAL_SE() BOOST_PP_LOCAL_SE_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/iterate.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/iterate.hpp
new file mode 100644
index 0000000..8f861e7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/iterate.hpp
@@ -0,0 +1,82 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP
+# define BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/array/elem.hpp>
+# include <boost/preprocessor/array/size.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/slot/slot.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_ITERATION_DEPTH */
+#
+# define BOOST_PP_ITERATION_DEPTH() 0
+#
+# /* BOOST_PP_ITERATION */
+#
+# define BOOST_PP_ITERATION() BOOST_PP_CAT(BOOST_PP_ITERATION_, BOOST_PP_ITERATION_DEPTH())
+#
+# /* BOOST_PP_ITERATION_START && BOOST_PP_ITERATION_FINISH */
+#
+# define BOOST_PP_ITERATION_START() BOOST_PP_CAT(BOOST_PP_ITERATION_START_, BOOST_PP_ITERATION_DEPTH())
+# define BOOST_PP_ITERATION_FINISH() BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, BOOST_PP_ITERATION_DEPTH())
+#
+# /* BOOST_PP_ITERATION_FLAGS */
+#
+# define BOOST_PP_ITERATION_FLAGS() (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, BOOST_PP_ITERATION_DEPTH())())
+#
+# /* BOOST_PP_FRAME_ITERATION */
+#
+# define BOOST_PP_FRAME_ITERATION(i) BOOST_PP_CAT(BOOST_PP_ITERATION_, i)
+#
+# /* BOOST_PP_FRAME_START && BOOST_PP_FRAME_FINISH */
+#
+# define BOOST_PP_FRAME_START(i) BOOST_PP_CAT(BOOST_PP_ITERATION_START_, i)
+# define BOOST_PP_FRAME_FINISH(i) BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, i)
+#
+# /* BOOST_PP_FRAME_FLAGS */
+#
+# define BOOST_PP_FRAME_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, i)())
+#
+# /* BOOST_PP_RELATIVE_ITERATION */
+#
+# define BOOST_PP_RELATIVE_ITERATION(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_)
+#
+# define BOOST_PP_RELATIVE_0(m) BOOST_PP_CAT(m, BOOST_PP_ITERATION_DEPTH())
+# define BOOST_PP_RELATIVE_1(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))
+# define BOOST_PP_RELATIVE_2(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))
+# define BOOST_PP_RELATIVE_3(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))))
+# define BOOST_PP_RELATIVE_4(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))))
+#
+# /* BOOST_PP_RELATIVE_START && BOOST_PP_RELATIVE_FINISH */
+#
+# define BOOST_PP_RELATIVE_START(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_START_)
+# define BOOST_PP_RELATIVE_FINISH(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FINISH_)
+#
+# /* BOOST_PP_RELATIVE_FLAGS */
+#
+# define BOOST_PP_RELATIVE_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FLAGS_)())
+#
+# /* BOOST_PP_ITERATE */
+#
+# define BOOST_PP_ITERATE() BOOST_PP_CAT(BOOST_PP_ITERATE_, BOOST_PP_INC(BOOST_PP_ITERATION_DEPTH()))
+#
+# define BOOST_PP_ITERATE_1 <boost/preprocessor/iteration/detail/iter/forward1.hpp>
+# define BOOST_PP_ITERATE_2 <boost/preprocessor/iteration/detail/iter/forward2.hpp>
+# define BOOST_PP_ITERATE_3 <boost/preprocessor/iteration/detail/iter/forward3.hpp>
+# define BOOST_PP_ITERATE_4 <boost/preprocessor/iteration/detail/iter/forward4.hpp>
+# define BOOST_PP_ITERATE_5 <boost/preprocessor/iteration/detail/iter/forward5.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/local.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/local.hpp
new file mode 100644
index 0000000..289fb1a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/local.hpp
@@ -0,0 +1,26 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP
+# define BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/slot/slot.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_LOCAL_ITERATE */
+#
+# define BOOST_PP_LOCAL_ITERATE() <boost/preprocessor/iteration/detail/local.hpp>
+#
+# define BOOST_PP_LOCAL_C(n) (BOOST_PP_LOCAL_S) <= n && (BOOST_PP_LOCAL_F) >= n
+# define BOOST_PP_LOCAL_R(n) (BOOST_PP_LOCAL_F) <= n && (BOOST_PP_LOCAL_S) >= n
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/iteration/self.hpp b/gatb-core/thirdparty/boost/preprocessor/iteration/self.hpp
new file mode 100644
index 0000000..6e0464c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/iteration/self.hpp
@@ -0,0 +1,19 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ITERATION_SELF_HPP
+# define BOOST_PREPROCESSOR_ITERATION_SELF_HPP
+#
+# /* BOOST_PP_INCLUDE_SELF */
+#
+# define BOOST_PP_INCLUDE_SELF() <boost/preprocessor/iteration/detail/self.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/library.hpp b/gatb-core/thirdparty/boost/preprocessor/library.hpp
new file mode 100644
index 0000000..aa5b777
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/library.hpp
@@ -0,0 +1,36 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIBRARY_HPP
+# define BOOST_PREPROCESSOR_LIBRARY_HPP
+#
+# include <boost/preprocessor/arithmetic.hpp>
+# include <boost/preprocessor/array.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/comparison.hpp>
+# include <boost/preprocessor/config/limits.hpp>
+# include <boost/preprocessor/control.hpp>
+# include <boost/preprocessor/debug.hpp>
+# include <boost/preprocessor/facilities.hpp>
+# include <boost/preprocessor/iteration.hpp>
+# include <boost/preprocessor/list.hpp>
+# include <boost/preprocessor/logical.hpp>
+# include <boost/preprocessor/punctuation.hpp>
+# include <boost/preprocessor/repetition.hpp>
+# include <boost/preprocessor/selection.hpp>
+# include <boost/preprocessor/seq.hpp>
+# include <boost/preprocessor/slot.hpp>
+# include <boost/preprocessor/stringize.hpp>
+# include <boost/preprocessor/tuple.hpp>
+# include <boost/preprocessor/variadic.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/limits.hpp b/gatb-core/thirdparty/boost/preprocessor/limits.hpp
new file mode 100644
index 0000000..e264cc3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/limits.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIMITS_HPP
+# define BOOST_PREPROCESSOR_LIMITS_HPP
+#
+# include <boost/preprocessor/config/limits.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list.hpp b/gatb-core/thirdparty/boost/preprocessor/list.hpp
new file mode 100644
index 0000000..ef592c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list.hpp
@@ -0,0 +1,37 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_HPP
+# define BOOST_PREPROCESSOR_LIST_HPP
+#
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/list/append.hpp>
+# include <boost/preprocessor/list/at.hpp>
+# include <boost/preprocessor/list/cat.hpp>
+# include <boost/preprocessor/list/enum.hpp>
+# include <boost/preprocessor/list/filter.hpp>
+# include <boost/preprocessor/list/first_n.hpp>
+# include <boost/preprocessor/list/fold_left.hpp>
+# include <boost/preprocessor/list/fold_right.hpp>
+# include <boost/preprocessor/list/for_each.hpp>
+# include <boost/preprocessor/list/for_each_i.hpp>
+# include <boost/preprocessor/list/for_each_product.hpp>
+# include <boost/preprocessor/list/rest_n.hpp>
+# include <boost/preprocessor/list/reverse.hpp>
+# include <boost/preprocessor/list/size.hpp>
+# include <boost/preprocessor/list/to_array.hpp>
+# include <boost/preprocessor/list/to_seq.hpp>
+# include <boost/preprocessor/list/to_tuple.hpp>
+# include <boost/preprocessor/list/transform.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/adt.hpp b/gatb-core/thirdparty/boost/preprocessor/list/adt.hpp
new file mode 100644
index 0000000..b4f12ba
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/adt.hpp
@@ -0,0 +1,73 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  *
+#  * See http://www.boost.org for most recent version.
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_ADT_HPP
+# define BOOST_PREPROCESSOR_LIST_ADT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/detail/is_binary.hpp>
+# include <boost/preprocessor/logical/compl.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# /* BOOST_PP_LIST_CONS */
+#
+# define BOOST_PP_LIST_CONS(head, tail) (head, tail)
+#
+# /* BOOST_PP_LIST_NIL */
+#
+# define BOOST_PP_LIST_NIL BOOST_PP_NIL
+#
+# /* BOOST_PP_LIST_FIRST */
+#
+# define BOOST_PP_LIST_FIRST(list) BOOST_PP_LIST_FIRST_D(list)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I list
+# else
+#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I ## list
+# endif
+#
+# define BOOST_PP_LIST_FIRST_I(head, tail) head
+#
+# /* BOOST_PP_LIST_REST */
+#
+# define BOOST_PP_LIST_REST(list) BOOST_PP_LIST_REST_D(list)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I list
+# else
+#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I ## list
+# endif
+#
+# define BOOST_PP_LIST_REST_I(head, tail) tail
+#
+# /* BOOST_PP_LIST_IS_CONS */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()
+#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_LIST_IS_CONS_D(list)
+#    define BOOST_PP_LIST_IS_CONS_D(list) BOOST_PP_LIST_IS_CONS_ ## list
+#    define BOOST_PP_LIST_IS_CONS_(head, tail) 1
+#    define BOOST_PP_LIST_IS_CONS_BOOST_PP_NIL 0
+# else
+#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_IS_BINARY(list)
+# endif
+#
+# /* BOOST_PP_LIST_IS_NIL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()
+#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_IS_BINARY(list))
+# else
+#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_LIST_IS_CONS(list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/append.hpp b/gatb-core/thirdparty/boost/preprocessor/list/append.hpp
new file mode 100644
index 0000000..26e9d74
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/append.hpp
@@ -0,0 +1,40 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_APPEND_HPP
+# define BOOST_PREPROCESSOR_LIST_APPEND_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/fold_right.hpp>
+#
+# /* BOOST_PP_LIST_APPEND */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_APPEND(a, b) BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_APPEND_O, b, a)
+# else
+#    define BOOST_PP_LIST_APPEND(a, b) BOOST_PP_LIST_APPEND_I(a, b)
+#    define BOOST_PP_LIST_APPEND_I(a, b) BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_APPEND_O, b, a)
+# endif
+#
+# define BOOST_PP_LIST_APPEND_O(d, s, x) (x, s)
+#
+# /* BOOST_PP_LIST_APPEND_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_APPEND_D(d, a, b) BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_APPEND_O, b, a)
+# else
+#    define BOOST_PP_LIST_APPEND_D(d, a, b) BOOST_PP_LIST_APPEND_D_I(d, a, b)
+#    define BOOST_PP_LIST_APPEND_D_I(d, a, b) BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_APPEND_O, b, a)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/at.hpp b/gatb-core/thirdparty/boost/preprocessor/list/at.hpp
new file mode 100644
index 0000000..125669b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/at.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_AT_HPP
+# define BOOST_PREPROCESSOR_LIST_AT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/list/rest_n.hpp>
+#
+# /* BOOST_PP_LIST_AT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_AT(list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N(index, list))
+# else
+#    define BOOST_PP_LIST_AT(list, index) BOOST_PP_LIST_AT_I(list, index)
+#    define BOOST_PP_LIST_AT_I(list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N(index, list))
+# endif
+#
+# /* BOOST_PP_LIST_AT_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_AT_D(d, list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N_D(d, index, list))
+# else
+#    define BOOST_PP_LIST_AT_D(d, list, index) BOOST_PP_LIST_AT_D_I(d, list, index)
+#    define BOOST_PP_LIST_AT_D_I(d, list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N_D(d, index, list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/cat.hpp b/gatb-core/thirdparty/boost/preprocessor/list/cat.hpp
new file mode 100644
index 0000000..1ef74bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/cat.hpp
@@ -0,0 +1,42 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_CAT_HPP
+# define BOOST_PREPROCESSOR_LIST_CAT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/list/fold_left.hpp>
+#
+# /* BOOST_PP_LIST_CAT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_CAT(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))
+# else
+#    define BOOST_PP_LIST_CAT(list) BOOST_PP_LIST_CAT_I(list)
+#    define BOOST_PP_LIST_CAT_I(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))
+# endif
+#
+# define BOOST_PP_LIST_CAT_O(d, s, x) BOOST_PP_CAT(s, x)
+#
+# /* BOOST_PP_LIST_CAT_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_CAT_D(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))
+# else
+#    define BOOST_PP_LIST_CAT_D(d, list) BOOST_PP_LIST_CAT_D_I(d, list)
+#    define BOOST_PP_LIST_CAT_D_I(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/detail/dmc/fold_left.hpp b/gatb-core/thirdparty/boost/preprocessor/list/detail/dmc/fold_left.hpp
new file mode 100644
index 0000000..844ac5b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/detail/dmc/fold_left.hpp
@@ -0,0 +1,279 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP
+# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP
+#
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_left.hpp b/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_left.hpp
new file mode 100644
index 0000000..ae9524f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_left.hpp
@@ -0,0 +1,536 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP
+# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP
+#
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l)
+#
+# define BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_right.hpp b/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_right.hpp
new file mode 100644
index 0000000..d372d2e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/detail/edg/fold_right.hpp
@@ -0,0 +1,794 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP
+# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP
+#
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l)
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(2, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_2, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(3, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_3, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(4, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_4, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(5, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_5, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(6, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_6, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(7, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_7, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(8, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_8, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(9, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_9, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(10, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_10, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(11, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_11, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(12, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_12, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(13, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_13, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(14, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_14, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(15, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_15, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(16, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_16, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(17, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_17, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(18, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_18, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(19, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_19, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(20, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_20, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(21, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_21, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(22, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_22, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(23, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_23, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(24, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_24, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(25, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_25, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(26, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_26, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(27, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_27, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(28, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_28, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(29, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_29, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(30, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_30, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(31, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_31, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(32, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_32, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(33, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_33, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(34, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_34, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(35, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_35, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(36, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_36, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(37, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_37, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(38, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_38, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(39, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_39, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(40, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_40, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(41, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_41, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(42, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_42, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(43, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_43, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(44, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_44, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(45, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_45, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(46, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_46, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(47, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_47, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(48, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_48, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(49, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_49, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(50, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_50, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(51, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_51, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(52, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_52, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(53, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_53, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(54, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_54, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(55, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_55, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(56, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_56, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(57, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_57, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(58, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_58, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(59, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_59, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(60, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_60, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(61, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_61, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(62, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_62, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(63, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_63, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(64, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_64, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(65, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_65, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(66, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_66, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(67, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_67, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(68, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_68, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(69, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_69, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(70, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_70, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(71, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_71, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(72, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_72, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(73, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_73, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(74, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_74, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(75, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_75, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(76, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_76, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(77, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_77, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(78, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_78, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(79, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_79, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(80, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_80, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(81, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_81, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(82, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_82, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(83, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_83, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(84, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_84, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(85, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_85, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(86, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_86, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(87, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_87, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(88, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_88, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(89, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_89, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(90, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_90, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(91, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_91, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(92, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_92, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(93, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_93, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(94, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_94, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(95, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_95, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(96, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_96, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(97, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_97, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(98, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_98, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(99, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_99, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(100, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_100, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(101, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_101, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(102, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_102, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(103, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_103, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(104, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_104, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(105, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_105, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(106, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_106, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(107, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_107, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(108, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_108, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(109, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_109, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(110, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_110, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(111, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_111, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(112, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_112, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(113, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_113, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(114, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_114, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(115, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_115, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(116, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_116, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(117, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_117, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(118, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_118, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(119, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_119, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(120, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_120, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(121, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_121, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(122, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_122, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(123, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_123, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(124, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_124, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(125, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_125, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(126, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_126, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(127, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_127, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(128, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_128, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(129, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_129, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(130, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_130, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(131, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_131, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(132, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_132, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(133, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_133, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(134, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_134, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(135, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_135, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(136, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_136, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(137, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_137, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(138, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_138, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(139, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_139, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(140, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_140, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(141, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_141, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(142, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_142, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(143, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_143, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(144, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_144, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(145, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_145, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(146, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_146, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(147, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_147, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(148, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_148, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(149, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_149, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(150, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_150, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(151, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_151, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(152, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_152, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(153, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_153, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(154, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_154, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(155, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_155, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(156, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_156, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(157, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_157, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(158, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_158, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(159, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_159, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(160, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_160, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(161, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_161, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(162, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_162, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(163, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_163, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(164, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_164, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(165, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_165, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(166, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_166, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(167, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_167, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(168, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_168, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(169, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_169, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(170, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_170, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(171, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_171, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(172, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_172, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(173, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_173, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(174, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_174, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(175, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_175, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(176, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_176, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(177, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_177, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(178, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_178, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(179, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_179, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(180, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_180, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(181, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_181, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(182, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_182, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(183, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_183, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(184, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_184, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(185, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_185, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(186, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_186, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(187, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_187, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(188, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_188, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(189, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_189, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(190, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_190, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(191, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_191, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(192, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_192, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(193, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_193, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(194, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_194, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(195, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_195, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(196, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_196, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(197, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_197, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(198, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_198, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(199, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_199, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(200, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_200, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(201, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_201, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(202, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_202, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(203, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_203, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(204, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_204, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(205, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_205, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(206, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_206, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(207, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_207, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(208, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_208, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(209, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_209, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(210, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_210, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(211, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_211, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(212, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_212, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(213, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_213, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(214, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_214, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(215, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_215, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(216, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_216, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(217, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_217, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(218, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_218, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(219, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_219, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(220, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_220, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(221, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_221, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(222, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_222, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(223, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_223, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(224, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_224, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(225, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_225, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(226, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_226, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(227, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_227, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(228, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_228, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(229, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_229, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(230, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_230, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(231, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_231, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(232, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_232, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(233, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_233, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(234, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_234, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(235, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_235, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(236, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_236, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(237, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_237, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(238, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_238, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(239, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_239, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(240, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_240, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(241, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_241, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(242, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_242, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(243, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_243, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(244, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_244, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(245, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_245, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(246, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_246, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(247, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_247, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(248, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_248, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(249, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_249, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(250, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_250, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(251, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_251, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(252, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_252, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(253, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_253, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(254, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_254, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(255, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_255, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(256, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_256, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+# define BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(257, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_257, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_left.hpp b/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_left.hpp
new file mode 100644
index 0000000..f5fcab7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_left.hpp
@@ -0,0 +1,279 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP
+# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP
+#
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_right.hpp b/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_right.hpp
new file mode 100644
index 0000000..29146d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/detail/fold_right.hpp
@@ -0,0 +1,277 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP
+# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP
+#
+# include <boost/preprocessor/list/fold_left.hpp>
+# include <boost/preprocessor/list/reverse.hpp>
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1(o, s, BOOST_PP_LIST_REVERSE_D(1, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2(o, s, BOOST_PP_LIST_REVERSE_D(2, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3(o, s, BOOST_PP_LIST_REVERSE_D(3, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4(o, s, BOOST_PP_LIST_REVERSE_D(4, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5(o, s, BOOST_PP_LIST_REVERSE_D(5, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6(o, s, BOOST_PP_LIST_REVERSE_D(6, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7(o, s, BOOST_PP_LIST_REVERSE_D(7, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8(o, s, BOOST_PP_LIST_REVERSE_D(8, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9(o, s, BOOST_PP_LIST_REVERSE_D(9, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10(o, s, BOOST_PP_LIST_REVERSE_D(10, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11(o, s, BOOST_PP_LIST_REVERSE_D(11, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12(o, s, BOOST_PP_LIST_REVERSE_D(12, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13(o, s, BOOST_PP_LIST_REVERSE_D(13, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14(o, s, BOOST_PP_LIST_REVERSE_D(14, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15(o, s, BOOST_PP_LIST_REVERSE_D(15, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16(o, s, BOOST_PP_LIST_REVERSE_D(16, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17(o, s, BOOST_PP_LIST_REVERSE_D(17, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18(o, s, BOOST_PP_LIST_REVERSE_D(18, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19(o, s, BOOST_PP_LIST_REVERSE_D(19, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20(o, s, BOOST_PP_LIST_REVERSE_D(20, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21(o, s, BOOST_PP_LIST_REVERSE_D(21, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22(o, s, BOOST_PP_LIST_REVERSE_D(22, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23(o, s, BOOST_PP_LIST_REVERSE_D(23, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24(o, s, BOOST_PP_LIST_REVERSE_D(24, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25(o, s, BOOST_PP_LIST_REVERSE_D(25, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26(o, s, BOOST_PP_LIST_REVERSE_D(26, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27(o, s, BOOST_PP_LIST_REVERSE_D(27, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28(o, s, BOOST_PP_LIST_REVERSE_D(28, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29(o, s, BOOST_PP_LIST_REVERSE_D(29, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30(o, s, BOOST_PP_LIST_REVERSE_D(30, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31(o, s, BOOST_PP_LIST_REVERSE_D(31, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32(o, s, BOOST_PP_LIST_REVERSE_D(32, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33(o, s, BOOST_PP_LIST_REVERSE_D(33, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34(o, s, BOOST_PP_LIST_REVERSE_D(34, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35(o, s, BOOST_PP_LIST_REVERSE_D(35, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36(o, s, BOOST_PP_LIST_REVERSE_D(36, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37(o, s, BOOST_PP_LIST_REVERSE_D(37, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38(o, s, BOOST_PP_LIST_REVERSE_D(38, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39(o, s, BOOST_PP_LIST_REVERSE_D(39, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40(o, s, BOOST_PP_LIST_REVERSE_D(40, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41(o, s, BOOST_PP_LIST_REVERSE_D(41, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42(o, s, BOOST_PP_LIST_REVERSE_D(42, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43(o, s, BOOST_PP_LIST_REVERSE_D(43, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44(o, s, BOOST_PP_LIST_REVERSE_D(44, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45(o, s, BOOST_PP_LIST_REVERSE_D(45, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46(o, s, BOOST_PP_LIST_REVERSE_D(46, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47(o, s, BOOST_PP_LIST_REVERSE_D(47, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48(o, s, BOOST_PP_LIST_REVERSE_D(48, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49(o, s, BOOST_PP_LIST_REVERSE_D(49, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50(o, s, BOOST_PP_LIST_REVERSE_D(50, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51(o, s, BOOST_PP_LIST_REVERSE_D(51, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52(o, s, BOOST_PP_LIST_REVERSE_D(52, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53(o, s, BOOST_PP_LIST_REVERSE_D(53, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54(o, s, BOOST_PP_LIST_REVERSE_D(54, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55(o, s, BOOST_PP_LIST_REVERSE_D(55, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56(o, s, BOOST_PP_LIST_REVERSE_D(56, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57(o, s, BOOST_PP_LIST_REVERSE_D(57, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58(o, s, BOOST_PP_LIST_REVERSE_D(58, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59(o, s, BOOST_PP_LIST_REVERSE_D(59, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60(o, s, BOOST_PP_LIST_REVERSE_D(60, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61(o, s, BOOST_PP_LIST_REVERSE_D(61, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62(o, s, BOOST_PP_LIST_REVERSE_D(62, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63(o, s, BOOST_PP_LIST_REVERSE_D(63, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64(o, s, BOOST_PP_LIST_REVERSE_D(64, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65(o, s, BOOST_PP_LIST_REVERSE_D(65, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66(o, s, BOOST_PP_LIST_REVERSE_D(66, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67(o, s, BOOST_PP_LIST_REVERSE_D(67, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68(o, s, BOOST_PP_LIST_REVERSE_D(68, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69(o, s, BOOST_PP_LIST_REVERSE_D(69, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70(o, s, BOOST_PP_LIST_REVERSE_D(70, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71(o, s, BOOST_PP_LIST_REVERSE_D(71, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72(o, s, BOOST_PP_LIST_REVERSE_D(72, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73(o, s, BOOST_PP_LIST_REVERSE_D(73, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74(o, s, BOOST_PP_LIST_REVERSE_D(74, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75(o, s, BOOST_PP_LIST_REVERSE_D(75, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76(o, s, BOOST_PP_LIST_REVERSE_D(76, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77(o, s, BOOST_PP_LIST_REVERSE_D(77, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78(o, s, BOOST_PP_LIST_REVERSE_D(78, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79(o, s, BOOST_PP_LIST_REVERSE_D(79, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80(o, s, BOOST_PP_LIST_REVERSE_D(80, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81(o, s, BOOST_PP_LIST_REVERSE_D(81, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82(o, s, BOOST_PP_LIST_REVERSE_D(82, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83(o, s, BOOST_PP_LIST_REVERSE_D(83, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84(o, s, BOOST_PP_LIST_REVERSE_D(84, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85(o, s, BOOST_PP_LIST_REVERSE_D(85, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86(o, s, BOOST_PP_LIST_REVERSE_D(86, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87(o, s, BOOST_PP_LIST_REVERSE_D(87, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88(o, s, BOOST_PP_LIST_REVERSE_D(88, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89(o, s, BOOST_PP_LIST_REVERSE_D(89, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90(o, s, BOOST_PP_LIST_REVERSE_D(90, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91(o, s, BOOST_PP_LIST_REVERSE_D(91, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92(o, s, BOOST_PP_LIST_REVERSE_D(92, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93(o, s, BOOST_PP_LIST_REVERSE_D(93, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94(o, s, BOOST_PP_LIST_REVERSE_D(94, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95(o, s, BOOST_PP_LIST_REVERSE_D(95, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96(o, s, BOOST_PP_LIST_REVERSE_D(96, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97(o, s, BOOST_PP_LIST_REVERSE_D(97, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98(o, s, BOOST_PP_LIST_REVERSE_D(98, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99(o, s, BOOST_PP_LIST_REVERSE_D(99, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100(o, s, BOOST_PP_LIST_REVERSE_D(100, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101(o, s, BOOST_PP_LIST_REVERSE_D(101, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102(o, s, BOOST_PP_LIST_REVERSE_D(102, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103(o, s, BOOST_PP_LIST_REVERSE_D(103, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104(o, s, BOOST_PP_LIST_REVERSE_D(104, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105(o, s, BOOST_PP_LIST_REVERSE_D(105, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106(o, s, BOOST_PP_LIST_REVERSE_D(106, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107(o, s, BOOST_PP_LIST_REVERSE_D(107, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108(o, s, BOOST_PP_LIST_REVERSE_D(108, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109(o, s, BOOST_PP_LIST_REVERSE_D(109, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110(o, s, BOOST_PP_LIST_REVERSE_D(110, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111(o, s, BOOST_PP_LIST_REVERSE_D(111, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112(o, s, BOOST_PP_LIST_REVERSE_D(112, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113(o, s, BOOST_PP_LIST_REVERSE_D(113, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114(o, s, BOOST_PP_LIST_REVERSE_D(114, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115(o, s, BOOST_PP_LIST_REVERSE_D(115, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116(o, s, BOOST_PP_LIST_REVERSE_D(116, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117(o, s, BOOST_PP_LIST_REVERSE_D(117, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118(o, s, BOOST_PP_LIST_REVERSE_D(118, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119(o, s, BOOST_PP_LIST_REVERSE_D(119, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120(o, s, BOOST_PP_LIST_REVERSE_D(120, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121(o, s, BOOST_PP_LIST_REVERSE_D(121, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122(o, s, BOOST_PP_LIST_REVERSE_D(122, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123(o, s, BOOST_PP_LIST_REVERSE_D(123, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124(o, s, BOOST_PP_LIST_REVERSE_D(124, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125(o, s, BOOST_PP_LIST_REVERSE_D(125, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126(o, s, BOOST_PP_LIST_REVERSE_D(126, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127(o, s, BOOST_PP_LIST_REVERSE_D(127, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128(o, s, BOOST_PP_LIST_REVERSE_D(128, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129(o, s, BOOST_PP_LIST_REVERSE_D(129, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130(o, s, BOOST_PP_LIST_REVERSE_D(130, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131(o, s, BOOST_PP_LIST_REVERSE_D(131, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132(o, s, BOOST_PP_LIST_REVERSE_D(132, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133(o, s, BOOST_PP_LIST_REVERSE_D(133, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134(o, s, BOOST_PP_LIST_REVERSE_D(134, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135(o, s, BOOST_PP_LIST_REVERSE_D(135, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136(o, s, BOOST_PP_LIST_REVERSE_D(136, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137(o, s, BOOST_PP_LIST_REVERSE_D(137, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138(o, s, BOOST_PP_LIST_REVERSE_D(138, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139(o, s, BOOST_PP_LIST_REVERSE_D(139, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140(o, s, BOOST_PP_LIST_REVERSE_D(140, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141(o, s, BOOST_PP_LIST_REVERSE_D(141, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142(o, s, BOOST_PP_LIST_REVERSE_D(142, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143(o, s, BOOST_PP_LIST_REVERSE_D(143, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144(o, s, BOOST_PP_LIST_REVERSE_D(144, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145(o, s, BOOST_PP_LIST_REVERSE_D(145, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146(o, s, BOOST_PP_LIST_REVERSE_D(146, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147(o, s, BOOST_PP_LIST_REVERSE_D(147, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148(o, s, BOOST_PP_LIST_REVERSE_D(148, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149(o, s, BOOST_PP_LIST_REVERSE_D(149, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150(o, s, BOOST_PP_LIST_REVERSE_D(150, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151(o, s, BOOST_PP_LIST_REVERSE_D(151, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152(o, s, BOOST_PP_LIST_REVERSE_D(152, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153(o, s, BOOST_PP_LIST_REVERSE_D(153, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154(o, s, BOOST_PP_LIST_REVERSE_D(154, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155(o, s, BOOST_PP_LIST_REVERSE_D(155, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156(o, s, BOOST_PP_LIST_REVERSE_D(156, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157(o, s, BOOST_PP_LIST_REVERSE_D(157, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158(o, s, BOOST_PP_LIST_REVERSE_D(158, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159(o, s, BOOST_PP_LIST_REVERSE_D(159, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160(o, s, BOOST_PP_LIST_REVERSE_D(160, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161(o, s, BOOST_PP_LIST_REVERSE_D(161, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162(o, s, BOOST_PP_LIST_REVERSE_D(162, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163(o, s, BOOST_PP_LIST_REVERSE_D(163, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164(o, s, BOOST_PP_LIST_REVERSE_D(164, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165(o, s, BOOST_PP_LIST_REVERSE_D(165, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166(o, s, BOOST_PP_LIST_REVERSE_D(166, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167(o, s, BOOST_PP_LIST_REVERSE_D(167, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168(o, s, BOOST_PP_LIST_REVERSE_D(168, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169(o, s, BOOST_PP_LIST_REVERSE_D(169, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170(o, s, BOOST_PP_LIST_REVERSE_D(170, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171(o, s, BOOST_PP_LIST_REVERSE_D(171, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172(o, s, BOOST_PP_LIST_REVERSE_D(172, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173(o, s, BOOST_PP_LIST_REVERSE_D(173, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174(o, s, BOOST_PP_LIST_REVERSE_D(174, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175(o, s, BOOST_PP_LIST_REVERSE_D(175, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176(o, s, BOOST_PP_LIST_REVERSE_D(176, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177(o, s, BOOST_PP_LIST_REVERSE_D(177, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178(o, s, BOOST_PP_LIST_REVERSE_D(178, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179(o, s, BOOST_PP_LIST_REVERSE_D(179, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180(o, s, BOOST_PP_LIST_REVERSE_D(180, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181(o, s, BOOST_PP_LIST_REVERSE_D(181, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182(o, s, BOOST_PP_LIST_REVERSE_D(182, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183(o, s, BOOST_PP_LIST_REVERSE_D(183, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184(o, s, BOOST_PP_LIST_REVERSE_D(184, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185(o, s, BOOST_PP_LIST_REVERSE_D(185, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186(o, s, BOOST_PP_LIST_REVERSE_D(186, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187(o, s, BOOST_PP_LIST_REVERSE_D(187, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188(o, s, BOOST_PP_LIST_REVERSE_D(188, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189(o, s, BOOST_PP_LIST_REVERSE_D(189, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190(o, s, BOOST_PP_LIST_REVERSE_D(190, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191(o, s, BOOST_PP_LIST_REVERSE_D(191, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192(o, s, BOOST_PP_LIST_REVERSE_D(192, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193(o, s, BOOST_PP_LIST_REVERSE_D(193, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194(o, s, BOOST_PP_LIST_REVERSE_D(194, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195(o, s, BOOST_PP_LIST_REVERSE_D(195, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196(o, s, BOOST_PP_LIST_REVERSE_D(196, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197(o, s, BOOST_PP_LIST_REVERSE_D(197, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198(o, s, BOOST_PP_LIST_REVERSE_D(198, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199(o, s, BOOST_PP_LIST_REVERSE_D(199, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200(o, s, BOOST_PP_LIST_REVERSE_D(200, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201(o, s, BOOST_PP_LIST_REVERSE_D(201, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202(o, s, BOOST_PP_LIST_REVERSE_D(202, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203(o, s, BOOST_PP_LIST_REVERSE_D(203, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204(o, s, BOOST_PP_LIST_REVERSE_D(204, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205(o, s, BOOST_PP_LIST_REVERSE_D(205, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206(o, s, BOOST_PP_LIST_REVERSE_D(206, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207(o, s, BOOST_PP_LIST_REVERSE_D(207, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208(o, s, BOOST_PP_LIST_REVERSE_D(208, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209(o, s, BOOST_PP_LIST_REVERSE_D(209, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210(o, s, BOOST_PP_LIST_REVERSE_D(210, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211(o, s, BOOST_PP_LIST_REVERSE_D(211, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212(o, s, BOOST_PP_LIST_REVERSE_D(212, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213(o, s, BOOST_PP_LIST_REVERSE_D(213, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214(o, s, BOOST_PP_LIST_REVERSE_D(214, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215(o, s, BOOST_PP_LIST_REVERSE_D(215, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216(o, s, BOOST_PP_LIST_REVERSE_D(216, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217(o, s, BOOST_PP_LIST_REVERSE_D(217, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218(o, s, BOOST_PP_LIST_REVERSE_D(218, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219(o, s, BOOST_PP_LIST_REVERSE_D(219, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220(o, s, BOOST_PP_LIST_REVERSE_D(220, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221(o, s, BOOST_PP_LIST_REVERSE_D(221, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222(o, s, BOOST_PP_LIST_REVERSE_D(222, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223(o, s, BOOST_PP_LIST_REVERSE_D(223, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224(o, s, BOOST_PP_LIST_REVERSE_D(224, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225(o, s, BOOST_PP_LIST_REVERSE_D(225, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226(o, s, BOOST_PP_LIST_REVERSE_D(226, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227(o, s, BOOST_PP_LIST_REVERSE_D(227, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228(o, s, BOOST_PP_LIST_REVERSE_D(228, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229(o, s, BOOST_PP_LIST_REVERSE_D(229, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230(o, s, BOOST_PP_LIST_REVERSE_D(230, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231(o, s, BOOST_PP_LIST_REVERSE_D(231, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232(o, s, BOOST_PP_LIST_REVERSE_D(232, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233(o, s, BOOST_PP_LIST_REVERSE_D(233, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234(o, s, BOOST_PP_LIST_REVERSE_D(234, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235(o, s, BOOST_PP_LIST_REVERSE_D(235, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236(o, s, BOOST_PP_LIST_REVERSE_D(236, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237(o, s, BOOST_PP_LIST_REVERSE_D(237, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238(o, s, BOOST_PP_LIST_REVERSE_D(238, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239(o, s, BOOST_PP_LIST_REVERSE_D(239, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240(o, s, BOOST_PP_LIST_REVERSE_D(240, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241(o, s, BOOST_PP_LIST_REVERSE_D(241, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242(o, s, BOOST_PP_LIST_REVERSE_D(242, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243(o, s, BOOST_PP_LIST_REVERSE_D(243, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244(o, s, BOOST_PP_LIST_REVERSE_D(244, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245(o, s, BOOST_PP_LIST_REVERSE_D(245, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246(o, s, BOOST_PP_LIST_REVERSE_D(246, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247(o, s, BOOST_PP_LIST_REVERSE_D(247, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248(o, s, BOOST_PP_LIST_REVERSE_D(248, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249(o, s, BOOST_PP_LIST_REVERSE_D(249, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250(o, s, BOOST_PP_LIST_REVERSE_D(250, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251(o, s, BOOST_PP_LIST_REVERSE_D(251, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252(o, s, BOOST_PP_LIST_REVERSE_D(252, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253(o, s, BOOST_PP_LIST_REVERSE_D(253, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254(o, s, BOOST_PP_LIST_REVERSE_D(254, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255(o, s, BOOST_PP_LIST_REVERSE_D(255, l))
+# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256(o, s, BOOST_PP_LIST_REVERSE_D(256, l))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/list/enum.hpp
new file mode 100644
index 0000000..1eabea6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/enum.hpp
@@ -0,0 +1,41 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_ENUM_HPP
+# define BOOST_PREPROCESSOR_LIST_ENUM_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/for_each_i.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+#
+# /* BOOST_PP_LIST_ENUM */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_ENUM(list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)
+# else
+#    define BOOST_PP_LIST_ENUM(list) BOOST_PP_LIST_ENUM_I(list)
+#    define BOOST_PP_LIST_ENUM_I(list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)
+# endif
+#
+# define BOOST_PP_LIST_ENUM_O(r, _, i, elem) BOOST_PP_COMMA_IF(i) elem
+#
+# /* BOOST_PP_LIST_ENUM_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_ENUM_R(r, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)
+# else
+#    define BOOST_PP_LIST_ENUM_R(r, list) BOOST_PP_LIST_ENUM_R_I(r, list)
+#    define BOOST_PP_LIST_ENUM_R_I(r, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/filter.hpp b/gatb-core/thirdparty/boost/preprocessor/list/filter.hpp
new file mode 100644
index 0000000..9e0faab
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/filter.hpp
@@ -0,0 +1,54 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FILTER_HPP
+# define BOOST_PREPROCESSOR_LIST_FILTER_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/list/fold_right.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_FILTER */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FILTER(pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))
+# else
+#    define BOOST_PP_LIST_FILTER(pred, data, list) BOOST_PP_LIST_FILTER_I(pred, data, list)
+#    define BOOST_PP_LIST_FILTER_I(pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FILTER_O(d, pdr, elem) BOOST_PP_LIST_FILTER_O_D(d, BOOST_PP_TUPLE_ELEM(3, 0, pdr), BOOST_PP_TUPLE_ELEM(3, 1, pdr), BOOST_PP_TUPLE_ELEM(3, 2, pdr), elem)
+# else
+#    define BOOST_PP_LIST_FILTER_O(d, pdr, elem) BOOST_PP_LIST_FILTER_O_I(d, BOOST_PP_TUPLE_REM_3 pdr, elem)
+#    define BOOST_PP_LIST_FILTER_O_I(d, im, elem) BOOST_PP_LIST_FILTER_O_D(d, im, elem)
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_LIST_FILTER_O_D(d, pred, data, res, elem) (pred, data, BOOST_PP_IF(pred(d, data, elem), (elem, res), res))
+# else
+#    define BOOST_PP_LIST_FILTER_O_D(d, pred, data, res, elem) (pred, data, BOOST_PP_IF(pred##(d, data, elem), (elem, res), res))
+# endif
+#
+# /* BOOST_PP_LIST_FILTER_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FILTER_D(d, pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))
+# else
+#    define BOOST_PP_LIST_FILTER_D(d, pred, data, list) BOOST_PP_LIST_FILTER_D_I(d, pred, data, list)
+#    define BOOST_PP_LIST_FILTER_D_I(d, pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/first_n.hpp b/gatb-core/thirdparty/boost/preprocessor/list/first_n.hpp
new file mode 100644
index 0000000..5e60c50
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/first_n.hpp
@@ -0,0 +1,58 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FIRST_N_HPP
+# define BOOST_PREPROCESSOR_LIST_FIRST_N_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/list/reverse.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_FIRST_N */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FIRST_N(count, list) BOOST_PP_LIST_REVERSE(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))
+# else
+#    define BOOST_PP_LIST_FIRST_N(count, list) BOOST_PP_LIST_FIRST_N_I(count, list)
+#    define BOOST_PP_LIST_FIRST_N_I(count, list) BOOST_PP_LIST_REVERSE(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FIRST_N_P(d, data) BOOST_PP_TUPLE_ELEM(3, 0, data)
+# else
+#    define BOOST_PP_LIST_FIRST_N_P(d, data) BOOST_PP_LIST_FIRST_N_P_I data
+#    define BOOST_PP_LIST_FIRST_N_P_I(c, l, nl) c
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_FIRST_N_O(d, data) BOOST_PP_LIST_FIRST_N_O_D data
+# else
+#    define BOOST_PP_LIST_FIRST_N_O(d, data) BOOST_PP_LIST_FIRST_N_O_D(BOOST_PP_TUPLE_ELEM(3, 0, data), BOOST_PP_TUPLE_ELEM(3, 1, data), BOOST_PP_TUPLE_ELEM(3, 2, data))
+# endif
+#
+# define BOOST_PP_LIST_FIRST_N_O_D(c, l, nl) (BOOST_PP_DEC(c), BOOST_PP_LIST_REST(l), (BOOST_PP_LIST_FIRST(l), nl))
+#
+# /* BOOST_PP_LIST_FIRST_N_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FIRST_N_D(d, count, list) BOOST_PP_LIST_REVERSE_D(d, BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))
+# else
+#    define BOOST_PP_LIST_FIRST_N_D(d, count, list) BOOST_PP_LIST_FIRST_N_D_I(d, count, list)
+#    define BOOST_PP_LIST_FIRST_N_D_I(d, count, list) BOOST_PP_LIST_REVERSE_D(d, BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/fold_left.hpp b/gatb-core/thirdparty/boost/preprocessor/list/fold_left.hpp
new file mode 100644
index 0000000..f235aec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/fold_left.hpp
@@ -0,0 +1,303 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP
+# define BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+#
+# /* BOOST_PP_LIST_FOLD_LEFT */
+#
+# if 0
+#    define BOOST_PP_LIST_FOLD_LEFT(op, state, list)
+# endif
+#
+# define BOOST_PP_LIST_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))
+#
+# define BOOST_PP_LIST_FOLD_LEFT_257(o, s, l) BOOST_PP_ERROR(0x0004)
+#
+# define BOOST_PP_LIST_FOLD_LEFT_D(d, o, s, l) BOOST_PP_LIST_FOLD_LEFT_ ## d(o, s, l)
+# define BOOST_PP_LIST_FOLD_LEFT_2ND BOOST_PP_LIST_FOLD_LEFT
+# define BOOST_PP_LIST_FOLD_LEFT_2ND_D BOOST_PP_LIST_FOLD_LEFT_D
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    include <boost/preprocessor/list/detail/edg/fold_left.hpp>
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    include <boost/preprocessor/list/detail/dmc/fold_left.hpp>
+# else
+#    include <boost/preprocessor/list/detail/fold_left.hpp>
+# endif
+#
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) 0
+# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/fold_right.hpp b/gatb-core/thirdparty/boost/preprocessor/list/fold_right.hpp
new file mode 100644
index 0000000..ce18afe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/fold_right.hpp
@@ -0,0 +1,40 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP
+# define BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+#
+# if 0
+#    define BOOST_PP_LIST_FOLD_RIGHT(op, state, list)
+# endif
+#
+# define BOOST_PP_LIST_FOLD_RIGHT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_257(o, s, l) BOOST_PP_ERROR(0x0004)
+#
+# define BOOST_PP_LIST_FOLD_RIGHT_D(d, o, s, l) BOOST_PP_LIST_FOLD_RIGHT_ ## d(o, s, l)
+# define BOOST_PP_LIST_FOLD_RIGHT_2ND BOOST_PP_LIST_FOLD_RIGHT
+# define BOOST_PP_LIST_FOLD_RIGHT_2ND_D BOOST_PP_LIST_FOLD_RIGHT_D
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    include <boost/preprocessor/list/detail/edg/fold_right.hpp>
+# else
+#    include <boost/preprocessor/list/detail/fold_right.hpp>
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/for_each.hpp b/gatb-core/thirdparty/boost/preprocessor/list/for_each.hpp
new file mode 100644
index 0000000..dd04eaa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/for_each.hpp
@@ -0,0 +1,49 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FOR_EACH_HPP
+# define BOOST_PREPROCESSOR_LIST_FOR_EACH_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/for_each_i.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_FOR_EACH */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH(macro, data, list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)
+# else
+#    define BOOST_PP_LIST_FOR_EACH(macro, data, list) BOOST_PP_LIST_FOR_EACH_X(macro, data, list)
+#    define BOOST_PP_LIST_FOR_EACH_X(macro, data, list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_O(r, md, i, elem) BOOST_PP_LIST_FOR_EACH_O_D(r, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md), elem)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_O(r, md, i, elem) BOOST_PP_LIST_FOR_EACH_O_I(r, BOOST_PP_TUPLE_REM_2 md, elem)
+#    define BOOST_PP_LIST_FOR_EACH_O_I(r, im, elem) BOOST_PP_LIST_FOR_EACH_O_D(r, im, elem)
+# endif
+#
+# define BOOST_PP_LIST_FOR_EACH_O_D(r, m, d, elem) m(r, d, elem)
+#
+# /* BOOST_PP_LIST_FOR_EACH_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_R_X(r, macro, data, list)
+#    define BOOST_PP_LIST_FOR_EACH_R_X(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/for_each_i.hpp b/gatb-core/thirdparty/boost/preprocessor/list/for_each_i.hpp
new file mode 100644
index 0000000..8f02e2e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/for_each_i.hpp
@@ -0,0 +1,65 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP
+# define BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_FOR_EACH_I */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list)
+#    define BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_FOR_EACH_I_P_D x
+#    define BOOST_PP_LIST_FOR_EACH_I_P_D(m, d, l, i) BOOST_PP_LIST_IS_CONS(l)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(4, 2, x))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) BOOST_PP_LIST_FOR_EACH_I_O_D x
+#    define BOOST_PP_LIST_FOR_EACH_I_O_D(m, d, l, i) (m, d, BOOST_PP_LIST_REST(l), BOOST_PP_INC(i))
+# else
+#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) (BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(4, 2, x)), BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 3, x)))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_D(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))
+# else
+#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_REM_4 x)
+#    define BOOST_PP_LIST_FOR_EACH_I_M_I(r, x_e) BOOST_PP_LIST_FOR_EACH_I_M_D(r, x_e)
+# endif
+#
+# define BOOST_PP_LIST_FOR_EACH_I_M_D(r, m, d, l, i) m(r, d, i, BOOST_PP_LIST_FIRST(l))
+#
+# /* BOOST_PP_LIST_FOR_EACH_I_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list)
+#    define BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/for_each_product.hpp b/gatb-core/thirdparty/boost/preprocessor/list/for_each_product.hpp
new file mode 100644
index 0000000..6d5319b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/for_each_product.hpp
@@ -0,0 +1,141 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_FOR_EACH_PRODUCT_HPP
+# define BOOST_PREPROCESSOR_LIST_FOR_EACH_PRODUCT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/list/to_tuple.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/to_list.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+# include <boost/preprocessor/tuple/reverse.hpp>
+#
+# /* BOOST_PP_LIST_FOR_EACH_PRODUCT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple)
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))
+# endif
+#
+# /* BOOST_PP_LIST_FOR_EACH_PRODUCT_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple)
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E(impl, macro, size, lists) impl((BOOST_PP_LIST_FIRST(lists), BOOST_PP_LIST_REST(lists), BOOST_PP_NIL, macro, size), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E(impl, macro, size, lists) BOOST_PP_LIST_FOR_EACH_PRODUCT_E_D(impl, macro, size, lists)
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E_D(impl, macro, size, lists) impl((BOOST_PP_LIST_FIRST(lists), BOOST_PP_LIST_REST(lists), BOOST_PP_NIL, macro, size), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0)
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_P_I data
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P_I(a, b, res, macro, size) BOOST_PP_LIST_IS_CONS(a)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(5, 0, data))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_O_I data
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O_I(a, b, res, macro, size) (BOOST_PP_LIST_REST(a), b, res, macro, size)
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O(r, data) (BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(5, 0, data)), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, BOOST_PP_TUPLE_ELEM(5, 0, data), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_D(r, BOOST_PP_TUPLE_REM_5 data)
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_D(r, data_e) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, data_e)
+# endif
+#
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, a, b, res, macro, size) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_II(r, macro, BOOST_PP_LIST_TO_TUPLE_R(r, (BOOST_PP_LIST_FIRST(a), res)), size)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_II(r, macro, args, size) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_III(r, macro, args, size)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_III(r, macro, args, size) macro(r, BOOST_PP_TUPLE_REVERSE(size, args))
+#
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, i) BOOST_PP_IF(BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(5, 1, data)), BOOST_PP_LIST_FOR_EACH_PRODUCT_N_ ## i, BOOST_PP_LIST_FOR_EACH_PRODUCT_I)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data) BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I data
+# else
+#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data) BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I(BOOST_PP_TUPLE_ELEM(5, 0, data), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))
+# endif
+#
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I(a, b, res, macro, size) (BOOST_PP_LIST_FIRST(b), BOOST_PP_LIST_REST(b), (BOOST_PP_LIST_FIRST(a), res), macro, size)
+#
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 0)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_1(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 1)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_2(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 2)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_3(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 3)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_4(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 4)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_5(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 5)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_6(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 6)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_7(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 7)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_8(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 8)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_9(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 9)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_10(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 10)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_11(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 11)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_12(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 12)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_13(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 13)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_14(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 14)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_15(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 15)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_16(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 16)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_17(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 17)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_18(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 18)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_19(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 19)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_20(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 20)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_21(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 21)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_22(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 22)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_23(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 23)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_24(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 24)(r, data)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_25(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 25)(r, data)
+#
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_0(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_1)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_1(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_2)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_2(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_3)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_3(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_4)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_4(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_5)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_5(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_6)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_6(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_7)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_7(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_8)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_8(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_9)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_9(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_10)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_10(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_11)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_11(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_12)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_12(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_13)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_13(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_14)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_14(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_15)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_15(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_16)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_16(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_17)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_17(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_18)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_18(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_19)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_19(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_20)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_20(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_21)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_21(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_22)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_22(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_23)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_23(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_24)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_24(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_25)
+# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_25(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_26)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/rest_n.hpp b/gatb-core/thirdparty/boost/preprocessor/list/rest_n.hpp
new file mode 100644
index 0000000..b42ee5f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/rest_n.hpp
@@ -0,0 +1,55 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_REST_N_HPP
+# define BOOST_PREPROCESSOR_LIST_REST_N_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_LIST_REST_N */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REST_N(count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))
+# else
+#    define BOOST_PP_LIST_REST_N(count, list) BOOST_PP_LIST_REST_N_I(count, list)
+#    define BOOST_PP_LIST_REST_N_I(count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REST_N_P(d, lc) BOOST_PP_TUPLE_ELEM(2, 1, lc)
+# else
+#    define BOOST_PP_LIST_REST_N_P(d, lc) BOOST_PP_LIST_REST_N_P_I lc
+#    define BOOST_PP_LIST_REST_N_P_I(list, count) count
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REST_N_O(d, lc) (BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(2, 0, lc)), BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2, 1, lc)))
+# else
+#    define BOOST_PP_LIST_REST_N_O(d, lc) BOOST_PP_LIST_REST_N_O_I lc
+#    define BOOST_PP_LIST_REST_N_O_I(list, count) (BOOST_PP_LIST_REST(list), BOOST_PP_DEC(count))
+# endif
+#
+# /* BOOST_PP_LIST_REST_N_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REST_N_D(d, count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))
+# else
+#    define BOOST_PP_LIST_REST_N_D(d, count, list) BOOST_PP_LIST_REST_N_D_I(d, count, list)
+#    define BOOST_PP_LIST_REST_N_D_I(d, count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/reverse.hpp b/gatb-core/thirdparty/boost/preprocessor/list/reverse.hpp
new file mode 100644
index 0000000..651da05
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/reverse.hpp
@@ -0,0 +1,40 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_REVERSE_HPP
+# define BOOST_PREPROCESSOR_LIST_REVERSE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/fold_left.hpp>
+#
+# /* BOOST_PP_LIST_REVERSE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)
+# else
+#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_REVERSE_I(list)
+#    define BOOST_PP_LIST_REVERSE_I(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)
+# endif
+#
+# define BOOST_PP_LIST_REVERSE_O(d, s, x) (x, s)
+#
+# /* BOOST_PP_LIST_REVERSE_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)
+# else
+#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_REVERSE_D_I(d, list)
+#    define BOOST_PP_LIST_REVERSE_D_I(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/size.hpp b/gatb-core/thirdparty/boost/preprocessor/list/size.hpp
new file mode 100644
index 0000000..0757fba
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/size.hpp
@@ -0,0 +1,58 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_SIZE_HPP
+# define BOOST_PREPROCESSOR_LIST_SIZE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_SIZE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_SIZE(list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))
+# else
+#    define BOOST_PP_LIST_SIZE(list) BOOST_PP_LIST_SIZE_I(list)
+#    define BOOST_PP_LIST_SIZE_I(list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_SIZE_P(d, rl) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(2, 1, rl))
+# else
+#    define BOOST_PP_LIST_SIZE_P(d, rl) BOOST_PP_LIST_SIZE_P_I(BOOST_PP_TUPLE_REM_2 rl)
+#    define BOOST_PP_LIST_SIZE_P_I(im) BOOST_PP_LIST_SIZE_P_II(im)
+#    define BOOST_PP_LIST_SIZE_P_II(r, l) BOOST_PP_LIST_IS_CONS(l)
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_SIZE_O(d, rl) (BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(2, 0, rl)), BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(2, 1, rl)))
+# else
+#    define BOOST_PP_LIST_SIZE_O(d, rl) BOOST_PP_LIST_SIZE_O_I(BOOST_PP_TUPLE_REM_2 rl)
+#    define BOOST_PP_LIST_SIZE_O_I(im) BOOST_PP_LIST_SIZE_O_II(im)
+#    define BOOST_PP_LIST_SIZE_O_II(r, l) (BOOST_PP_INC(r), BOOST_PP_LIST_REST(l))
+# endif
+#
+# /* BOOST_PP_LIST_SIZE_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_SIZE_D(d, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))
+# else
+#    define BOOST_PP_LIST_SIZE_D(d, list) BOOST_PP_LIST_SIZE_D_I(d, list)
+#    define BOOST_PP_LIST_SIZE_D_I(d, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/to_array.hpp b/gatb-core/thirdparty/boost/preprocessor/list/to_array.hpp
new file mode 100644
index 0000000..83f8a63
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/to_array.hpp
@@ -0,0 +1,123 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP
+# define BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/list/adt.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_TO_ARRAY */
+#
+# define BOOST_PP_LIST_TO_ARRAY(list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE, list)
+
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_LIST_TO_ARRAY_I(w, list) \
+        BOOST_PP_LIST_TO_ARRAY_II(((BOOST_PP_TUPLE_REM_CTOR( \
+            3, \
+	        w(BOOST_PP_LIST_TO_ARRAY_P, BOOST_PP_LIST_TO_ARRAY_O, (list, 1, (~))) \
+        )))) \
+        /**/
+#    define BOOST_PP_LIST_TO_ARRAY_II(p) BOOST_PP_LIST_TO_ARRAY_II_B(p)
+#    define BOOST_PP_LIST_TO_ARRAY_II_B(p) BOOST_PP_LIST_TO_ARRAY_II_C ## p
+#    define BOOST_PP_LIST_TO_ARRAY_II_C(p) BOOST_PP_LIST_TO_ARRAY_III p
+# else
+#    define BOOST_PP_LIST_TO_ARRAY_I(w, list) \
+        BOOST_PP_LIST_TO_ARRAY_II(BOOST_PP_TUPLE_REM_CTOR( \
+            3, \
+	        w(BOOST_PP_LIST_TO_ARRAY_P, BOOST_PP_LIST_TO_ARRAY_O, (list, 1, (~))) \
+        )) \
+        /**/
+#    define BOOST_PP_LIST_TO_ARRAY_II(im) BOOST_PP_LIST_TO_ARRAY_III(im)
+# endif
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_LIST_TO_ARRAY_III(list, size, tuple) (BOOST_PP_DEC(size), BOOST_PP_LIST_TO_ARRAY_IV tuple)
+#    define BOOST_PP_LIST_TO_ARRAY_IV(_, ...) (__VA_ARGS__)
+# else
+#    define BOOST_PP_LIST_TO_ARRAY_III(list, size, tuple) (BOOST_PP_DEC(size), BOOST_PP_LIST_TO_ARRAY_IV_ ## size tuple)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_2(_, e0)                 (e0)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_3(_, e0, e1)             (e0, e1)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_4(_, e0, e1, e2)         (e0, e1, e2)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_5(_, e0, e1, e2, e3)     (e0, e1, e2, e3)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_6(_, e0, e1, e2, e3, e4) (e0, e1, e2, e3, e4)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_7(_, e0, e1, e2, e3, e4, e5) (e0, e1, e2, e3, e4, e5)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_8(_, e0, e1, e2, e3, e4, e5, e6) (e0, e1, e2, e3, e4, e5, e6)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_9(_, e0, e1, e2, e3, e4, e5, e6, e7) (e0, e1, e2, e3, e4, e5, e6, e7)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_10(_, e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, e1, e2, e3, e4, e5, e6, e7, e8)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_11(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_12(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_13(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_14(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_15(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_16(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_17(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_18(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_19(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_20(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_21(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_22(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_23(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_24(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_25(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_26(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_27(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_28(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_29(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_30(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_31(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_32(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_33(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_34(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_35(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_36(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_37(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_38(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_39(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_40(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_41(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_42(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_43(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_44(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_45(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_46(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_47(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_48(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46)
+#    define BOOST_PP_LIST_TO_ARRAY_IV_49(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_50(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_51(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_52(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_53(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_54(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e4 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_55(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_56(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_57(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_58(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_59(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_60(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_61(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_62(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_63(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e3 [...]
+#    define BOOST_PP_LIST_TO_ARRAY_IV_64(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e3 [...]
+# endif
+# define BOOST_PP_LIST_TO_ARRAY_P(d, state) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(3, 0, state))
+# define BOOST_PP_LIST_TO_ARRAY_O(d, state) BOOST_PP_LIST_TO_ARRAY_O_I state
+# define BOOST_PP_LIST_TO_ARRAY_O_I(list, size, tuple) (BOOST_PP_LIST_REST(list), BOOST_PP_INC(size), (BOOST_PP_TUPLE_REM(size) tuple, BOOST_PP_LIST_FIRST(list)))
+#
+# /* BOOST_PP_LIST_TO_ARRAY_D */
+#
+# define BOOST_PP_LIST_TO_ARRAY_D(d, list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE_ ## d, list)
+#
+# endif /* BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP */
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/to_seq.hpp b/gatb-core/thirdparty/boost/preprocessor/list/to_seq.hpp
new file mode 100644
index 0000000..7425907
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/to_seq.hpp
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* Revised by Paul Mensonides (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP
+# define BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP
+#
+# include <boost/preprocessor/list/for_each.hpp>
+#
+# /* BOOST_PP_LIST_TO_SEQ */
+#
+# define BOOST_PP_LIST_TO_SEQ(list) \
+    BOOST_PP_LIST_FOR_EACH(BOOST_PP_LIST_TO_SEQ_MACRO, ~, list) \
+    /**/
+# define BOOST_PP_LIST_TO_SEQ_MACRO(r, data, elem) (elem)
+#
+# /* BOOST_PP_LIST_TO_SEQ_R */
+#
+# define BOOST_PP_LIST_TO_SEQ_R(r, list) \
+    BOOST_PP_LIST_FOR_EACH_R(r, BOOST_PP_LIST_TO_SEQ_MACRO, ~, list) \
+    /**/
+#
+# endif /* BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP */
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/to_tuple.hpp b/gatb-core/thirdparty/boost/preprocessor/list/to_tuple.hpp
new file mode 100644
index 0000000..557de36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/to_tuple.hpp
@@ -0,0 +1,38 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_TO_TUPLE_HPP
+# define BOOST_PREPROCESSOR_LIST_TO_TUPLE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/enum.hpp>
+#
+# /* BOOST_PP_LIST_TO_TUPLE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_TO_TUPLE(list) (BOOST_PP_LIST_ENUM(list))
+# else
+#    define BOOST_PP_LIST_TO_TUPLE(list) BOOST_PP_LIST_TO_TUPLE_I(list)
+#    define BOOST_PP_LIST_TO_TUPLE_I(list) (BOOST_PP_LIST_ENUM(list))
+# endif
+#
+# /* BOOST_PP_LIST_TO_TUPLE_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_TO_TUPLE_R(r, list) (BOOST_PP_LIST_ENUM_R(r, list))
+# else
+#    define BOOST_PP_LIST_TO_TUPLE_R(r, list) BOOST_PP_LIST_TO_TUPLE_R_I(r, list)
+#    define BOOST_PP_LIST_TO_TUPLE_R_I(r, list) (BOOST_PP_LIST_ENUM_R(r, list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/list/transform.hpp b/gatb-core/thirdparty/boost/preprocessor/list/transform.hpp
new file mode 100644
index 0000000..840f306
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/list/transform.hpp
@@ -0,0 +1,49 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LIST_TRANSFORM_HPP
+# define BOOST_PREPROCESSOR_LIST_TRANSFORM_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/list/fold_right.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_LIST_TRANSFORM */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_TRANSFORM(op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))
+# else
+#    define BOOST_PP_LIST_TRANSFORM(op, data, list) BOOST_PP_LIST_TRANSFORM_I(op, data, list)
+#    define BOOST_PP_LIST_TRANSFORM_I(op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_TRANSFORM_O(d, odr, elem) BOOST_PP_LIST_TRANSFORM_O_D(d, BOOST_PP_TUPLE_ELEM(3, 0, odr), BOOST_PP_TUPLE_ELEM(3, 1, odr), BOOST_PP_TUPLE_ELEM(3, 2, odr), elem)
+# else
+#    define BOOST_PP_LIST_TRANSFORM_O(d, odr, elem) BOOST_PP_LIST_TRANSFORM_O_I(d, BOOST_PP_TUPLE_REM_3 odr, elem)
+#    define BOOST_PP_LIST_TRANSFORM_O_I(d, im, elem) BOOST_PP_LIST_TRANSFORM_O_D(d, im, elem)
+# endif
+#
+# define BOOST_PP_LIST_TRANSFORM_O_D(d, op, data, res, elem) (op, data, (op(d, data, elem), res))
+#
+# /* BOOST_PP_LIST_TRANSFORM_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LIST_TRANSFORM_D(d, op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))
+# else
+#    define BOOST_PP_LIST_TRANSFORM_D(d, op, data, list) BOOST_PP_LIST_TRANSFORM_D_I(d, op, data, list)
+#    define BOOST_PP_LIST_TRANSFORM_D_I(d, op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical.hpp b/gatb-core/thirdparty/boost/preprocessor/logical.hpp
new file mode 100644
index 0000000..040edeb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical.hpp
@@ -0,0 +1,29 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_HPP
+#
+# include <boost/preprocessor/logical/and.hpp>
+# include <boost/preprocessor/logical/bitand.hpp>
+# include <boost/preprocessor/logical/bitnor.hpp>
+# include <boost/preprocessor/logical/bitor.hpp>
+# include <boost/preprocessor/logical/bitxor.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/compl.hpp>
+# include <boost/preprocessor/logical/nor.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+# include <boost/preprocessor/logical/or.hpp>
+# include <boost/preprocessor/logical/xor.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/and.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/and.hpp
new file mode 100644
index 0000000..8590365
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/and.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_AND_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_AND_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/bitand.hpp>
+#
+# /* BOOST_PP_AND */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_AND(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# else
+#    define BOOST_PP_AND(p, q) BOOST_PP_AND_I(p, q)
+#    define BOOST_PP_AND_I(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/bitand.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/bitand.hpp
new file mode 100644
index 0000000..74e9527
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/bitand.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_BITAND */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_I(x, y)
+# else
+#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_OO((x, y))
+#    define BOOST_PP_BITAND_OO(par) BOOST_PP_BITAND_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ ## x ## y
+# else
+#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ID(BOOST_PP_BITAND_ ## x ## y)
+#    define BOOST_PP_BITAND_ID(res) res
+# endif
+#
+# define BOOST_PP_BITAND_00 0
+# define BOOST_PP_BITAND_01 0
+# define BOOST_PP_BITAND_10 0
+# define BOOST_PP_BITAND_11 1
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/bitnor.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/bitnor.hpp
new file mode 100644
index 0000000..110fba8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/bitnor.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_BITNOR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_BITNOR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_BITNOR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_BITNOR(x, y) BOOST_PP_BITNOR_I(x, y)
+# else
+#    define BOOST_PP_BITNOR(x, y) BOOST_PP_BITNOR_OO((x, y))
+#    define BOOST_PP_BITNOR_OO(par) BOOST_PP_BITNOR_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_BITNOR_I(x, y) BOOST_PP_BITNOR_ ## x ## y
+# else
+#    define BOOST_PP_BITNOR_I(x, y) BOOST_PP_BITNOR_ID(BOOST_PP_BITNOR_ ## x ## y)
+#    define BOOST_PP_BITNOR_ID(id) id
+# endif
+#
+# define BOOST_PP_BITNOR_00 1
+# define BOOST_PP_BITNOR_01 0
+# define BOOST_PP_BITNOR_10 0
+# define BOOST_PP_BITNOR_11 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/bitor.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/bitor.hpp
new file mode 100644
index 0000000..c0bc2c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/bitor.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_BITOR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_BITOR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_BITOR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_BITOR(x, y) BOOST_PP_BITOR_I(x, y)
+# else
+#    define BOOST_PP_BITOR(x, y) BOOST_PP_BITOR_OO((x, y))
+#    define BOOST_PP_BITOR_OO(par) BOOST_PP_BITOR_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_BITOR_I(x, y) BOOST_PP_BITOR_ ## x ## y
+# else
+#    define BOOST_PP_BITOR_I(x, y) BOOST_PP_BITOR_ID(BOOST_PP_BITOR_ ## x ## y)
+#    define BOOST_PP_BITOR_ID(id) id
+# endif
+#
+# define BOOST_PP_BITOR_00 0
+# define BOOST_PP_BITOR_01 1
+# define BOOST_PP_BITOR_10 1
+# define BOOST_PP_BITOR_11 1
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/bitxor.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/bitxor.hpp
new file mode 100644
index 0000000..0488aca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/bitxor.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_BITXOR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_BITXOR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_BITXOR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_BITXOR(x, y) BOOST_PP_BITXOR_I(x, y)
+# else
+#    define BOOST_PP_BITXOR(x, y) BOOST_PP_BITXOR_OO((x, y))
+#    define BOOST_PP_BITXOR_OO(par) BOOST_PP_BITXOR_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_BITXOR_I(x, y) BOOST_PP_BITXOR_ ## x ## y
+# else
+#    define BOOST_PP_BITXOR_I(x, y) BOOST_PP_BITXOR_ID(BOOST_PP_BITXOR_ ## x ## y)
+#    define BOOST_PP_BITXOR_ID(id) id
+# endif
+#
+# define BOOST_PP_BITXOR_00 0
+# define BOOST_PP_BITXOR_01 1
+# define BOOST_PP_BITXOR_10 1
+# define BOOST_PP_BITXOR_11 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/bool.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/bool.hpp
new file mode 100644
index 0000000..fc01b5b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/bool.hpp
@@ -0,0 +1,288 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_BOOL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_I(x)
+# else
+#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_OO((x))
+#    define BOOST_PP_BOOL_OO(par) BOOST_PP_BOOL_I ## par
+# endif
+#
+# define BOOST_PP_BOOL_I(x) BOOST_PP_BOOL_ ## x
+#
+# define BOOST_PP_BOOL_0 0
+# define BOOST_PP_BOOL_1 1
+# define BOOST_PP_BOOL_2 1
+# define BOOST_PP_BOOL_3 1
+# define BOOST_PP_BOOL_4 1
+# define BOOST_PP_BOOL_5 1
+# define BOOST_PP_BOOL_6 1
+# define BOOST_PP_BOOL_7 1
+# define BOOST_PP_BOOL_8 1
+# define BOOST_PP_BOOL_9 1
+# define BOOST_PP_BOOL_10 1
+# define BOOST_PP_BOOL_11 1
+# define BOOST_PP_BOOL_12 1
+# define BOOST_PP_BOOL_13 1
+# define BOOST_PP_BOOL_14 1
+# define BOOST_PP_BOOL_15 1
+# define BOOST_PP_BOOL_16 1
+# define BOOST_PP_BOOL_17 1
+# define BOOST_PP_BOOL_18 1
+# define BOOST_PP_BOOL_19 1
+# define BOOST_PP_BOOL_20 1
+# define BOOST_PP_BOOL_21 1
+# define BOOST_PP_BOOL_22 1
+# define BOOST_PP_BOOL_23 1
+# define BOOST_PP_BOOL_24 1
+# define BOOST_PP_BOOL_25 1
+# define BOOST_PP_BOOL_26 1
+# define BOOST_PP_BOOL_27 1
+# define BOOST_PP_BOOL_28 1
+# define BOOST_PP_BOOL_29 1
+# define BOOST_PP_BOOL_30 1
+# define BOOST_PP_BOOL_31 1
+# define BOOST_PP_BOOL_32 1
+# define BOOST_PP_BOOL_33 1
+# define BOOST_PP_BOOL_34 1
+# define BOOST_PP_BOOL_35 1
+# define BOOST_PP_BOOL_36 1
+# define BOOST_PP_BOOL_37 1
+# define BOOST_PP_BOOL_38 1
+# define BOOST_PP_BOOL_39 1
+# define BOOST_PP_BOOL_40 1
+# define BOOST_PP_BOOL_41 1
+# define BOOST_PP_BOOL_42 1
+# define BOOST_PP_BOOL_43 1
+# define BOOST_PP_BOOL_44 1
+# define BOOST_PP_BOOL_45 1
+# define BOOST_PP_BOOL_46 1
+# define BOOST_PP_BOOL_47 1
+# define BOOST_PP_BOOL_48 1
+# define BOOST_PP_BOOL_49 1
+# define BOOST_PP_BOOL_50 1
+# define BOOST_PP_BOOL_51 1
+# define BOOST_PP_BOOL_52 1
+# define BOOST_PP_BOOL_53 1
+# define BOOST_PP_BOOL_54 1
+# define BOOST_PP_BOOL_55 1
+# define BOOST_PP_BOOL_56 1
+# define BOOST_PP_BOOL_57 1
+# define BOOST_PP_BOOL_58 1
+# define BOOST_PP_BOOL_59 1
+# define BOOST_PP_BOOL_60 1
+# define BOOST_PP_BOOL_61 1
+# define BOOST_PP_BOOL_62 1
+# define BOOST_PP_BOOL_63 1
+# define BOOST_PP_BOOL_64 1
+# define BOOST_PP_BOOL_65 1
+# define BOOST_PP_BOOL_66 1
+# define BOOST_PP_BOOL_67 1
+# define BOOST_PP_BOOL_68 1
+# define BOOST_PP_BOOL_69 1
+# define BOOST_PP_BOOL_70 1
+# define BOOST_PP_BOOL_71 1
+# define BOOST_PP_BOOL_72 1
+# define BOOST_PP_BOOL_73 1
+# define BOOST_PP_BOOL_74 1
+# define BOOST_PP_BOOL_75 1
+# define BOOST_PP_BOOL_76 1
+# define BOOST_PP_BOOL_77 1
+# define BOOST_PP_BOOL_78 1
+# define BOOST_PP_BOOL_79 1
+# define BOOST_PP_BOOL_80 1
+# define BOOST_PP_BOOL_81 1
+# define BOOST_PP_BOOL_82 1
+# define BOOST_PP_BOOL_83 1
+# define BOOST_PP_BOOL_84 1
+# define BOOST_PP_BOOL_85 1
+# define BOOST_PP_BOOL_86 1
+# define BOOST_PP_BOOL_87 1
+# define BOOST_PP_BOOL_88 1
+# define BOOST_PP_BOOL_89 1
+# define BOOST_PP_BOOL_90 1
+# define BOOST_PP_BOOL_91 1
+# define BOOST_PP_BOOL_92 1
+# define BOOST_PP_BOOL_93 1
+# define BOOST_PP_BOOL_94 1
+# define BOOST_PP_BOOL_95 1
+# define BOOST_PP_BOOL_96 1
+# define BOOST_PP_BOOL_97 1
+# define BOOST_PP_BOOL_98 1
+# define BOOST_PP_BOOL_99 1
+# define BOOST_PP_BOOL_100 1
+# define BOOST_PP_BOOL_101 1
+# define BOOST_PP_BOOL_102 1
+# define BOOST_PP_BOOL_103 1
+# define BOOST_PP_BOOL_104 1
+# define BOOST_PP_BOOL_105 1
+# define BOOST_PP_BOOL_106 1
+# define BOOST_PP_BOOL_107 1
+# define BOOST_PP_BOOL_108 1
+# define BOOST_PP_BOOL_109 1
+# define BOOST_PP_BOOL_110 1
+# define BOOST_PP_BOOL_111 1
+# define BOOST_PP_BOOL_112 1
+# define BOOST_PP_BOOL_113 1
+# define BOOST_PP_BOOL_114 1
+# define BOOST_PP_BOOL_115 1
+# define BOOST_PP_BOOL_116 1
+# define BOOST_PP_BOOL_117 1
+# define BOOST_PP_BOOL_118 1
+# define BOOST_PP_BOOL_119 1
+# define BOOST_PP_BOOL_120 1
+# define BOOST_PP_BOOL_121 1
+# define BOOST_PP_BOOL_122 1
+# define BOOST_PP_BOOL_123 1
+# define BOOST_PP_BOOL_124 1
+# define BOOST_PP_BOOL_125 1
+# define BOOST_PP_BOOL_126 1
+# define BOOST_PP_BOOL_127 1
+# define BOOST_PP_BOOL_128 1
+# define BOOST_PP_BOOL_129 1
+# define BOOST_PP_BOOL_130 1
+# define BOOST_PP_BOOL_131 1
+# define BOOST_PP_BOOL_132 1
+# define BOOST_PP_BOOL_133 1
+# define BOOST_PP_BOOL_134 1
+# define BOOST_PP_BOOL_135 1
+# define BOOST_PP_BOOL_136 1
+# define BOOST_PP_BOOL_137 1
+# define BOOST_PP_BOOL_138 1
+# define BOOST_PP_BOOL_139 1
+# define BOOST_PP_BOOL_140 1
+# define BOOST_PP_BOOL_141 1
+# define BOOST_PP_BOOL_142 1
+# define BOOST_PP_BOOL_143 1
+# define BOOST_PP_BOOL_144 1
+# define BOOST_PP_BOOL_145 1
+# define BOOST_PP_BOOL_146 1
+# define BOOST_PP_BOOL_147 1
+# define BOOST_PP_BOOL_148 1
+# define BOOST_PP_BOOL_149 1
+# define BOOST_PP_BOOL_150 1
+# define BOOST_PP_BOOL_151 1
+# define BOOST_PP_BOOL_152 1
+# define BOOST_PP_BOOL_153 1
+# define BOOST_PP_BOOL_154 1
+# define BOOST_PP_BOOL_155 1
+# define BOOST_PP_BOOL_156 1
+# define BOOST_PP_BOOL_157 1
+# define BOOST_PP_BOOL_158 1
+# define BOOST_PP_BOOL_159 1
+# define BOOST_PP_BOOL_160 1
+# define BOOST_PP_BOOL_161 1
+# define BOOST_PP_BOOL_162 1
+# define BOOST_PP_BOOL_163 1
+# define BOOST_PP_BOOL_164 1
+# define BOOST_PP_BOOL_165 1
+# define BOOST_PP_BOOL_166 1
+# define BOOST_PP_BOOL_167 1
+# define BOOST_PP_BOOL_168 1
+# define BOOST_PP_BOOL_169 1
+# define BOOST_PP_BOOL_170 1
+# define BOOST_PP_BOOL_171 1
+# define BOOST_PP_BOOL_172 1
+# define BOOST_PP_BOOL_173 1
+# define BOOST_PP_BOOL_174 1
+# define BOOST_PP_BOOL_175 1
+# define BOOST_PP_BOOL_176 1
+# define BOOST_PP_BOOL_177 1
+# define BOOST_PP_BOOL_178 1
+# define BOOST_PP_BOOL_179 1
+# define BOOST_PP_BOOL_180 1
+# define BOOST_PP_BOOL_181 1
+# define BOOST_PP_BOOL_182 1
+# define BOOST_PP_BOOL_183 1
+# define BOOST_PP_BOOL_184 1
+# define BOOST_PP_BOOL_185 1
+# define BOOST_PP_BOOL_186 1
+# define BOOST_PP_BOOL_187 1
+# define BOOST_PP_BOOL_188 1
+# define BOOST_PP_BOOL_189 1
+# define BOOST_PP_BOOL_190 1
+# define BOOST_PP_BOOL_191 1
+# define BOOST_PP_BOOL_192 1
+# define BOOST_PP_BOOL_193 1
+# define BOOST_PP_BOOL_194 1
+# define BOOST_PP_BOOL_195 1
+# define BOOST_PP_BOOL_196 1
+# define BOOST_PP_BOOL_197 1
+# define BOOST_PP_BOOL_198 1
+# define BOOST_PP_BOOL_199 1
+# define BOOST_PP_BOOL_200 1
+# define BOOST_PP_BOOL_201 1
+# define BOOST_PP_BOOL_202 1
+# define BOOST_PP_BOOL_203 1
+# define BOOST_PP_BOOL_204 1
+# define BOOST_PP_BOOL_205 1
+# define BOOST_PP_BOOL_206 1
+# define BOOST_PP_BOOL_207 1
+# define BOOST_PP_BOOL_208 1
+# define BOOST_PP_BOOL_209 1
+# define BOOST_PP_BOOL_210 1
+# define BOOST_PP_BOOL_211 1
+# define BOOST_PP_BOOL_212 1
+# define BOOST_PP_BOOL_213 1
+# define BOOST_PP_BOOL_214 1
+# define BOOST_PP_BOOL_215 1
+# define BOOST_PP_BOOL_216 1
+# define BOOST_PP_BOOL_217 1
+# define BOOST_PP_BOOL_218 1
+# define BOOST_PP_BOOL_219 1
+# define BOOST_PP_BOOL_220 1
+# define BOOST_PP_BOOL_221 1
+# define BOOST_PP_BOOL_222 1
+# define BOOST_PP_BOOL_223 1
+# define BOOST_PP_BOOL_224 1
+# define BOOST_PP_BOOL_225 1
+# define BOOST_PP_BOOL_226 1
+# define BOOST_PP_BOOL_227 1
+# define BOOST_PP_BOOL_228 1
+# define BOOST_PP_BOOL_229 1
+# define BOOST_PP_BOOL_230 1
+# define BOOST_PP_BOOL_231 1
+# define BOOST_PP_BOOL_232 1
+# define BOOST_PP_BOOL_233 1
+# define BOOST_PP_BOOL_234 1
+# define BOOST_PP_BOOL_235 1
+# define BOOST_PP_BOOL_236 1
+# define BOOST_PP_BOOL_237 1
+# define BOOST_PP_BOOL_238 1
+# define BOOST_PP_BOOL_239 1
+# define BOOST_PP_BOOL_240 1
+# define BOOST_PP_BOOL_241 1
+# define BOOST_PP_BOOL_242 1
+# define BOOST_PP_BOOL_243 1
+# define BOOST_PP_BOOL_244 1
+# define BOOST_PP_BOOL_245 1
+# define BOOST_PP_BOOL_246 1
+# define BOOST_PP_BOOL_247 1
+# define BOOST_PP_BOOL_248 1
+# define BOOST_PP_BOOL_249 1
+# define BOOST_PP_BOOL_250 1
+# define BOOST_PP_BOOL_251 1
+# define BOOST_PP_BOOL_252 1
+# define BOOST_PP_BOOL_253 1
+# define BOOST_PP_BOOL_254 1
+# define BOOST_PP_BOOL_255 1
+# define BOOST_PP_BOOL_256 1
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/compl.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/compl.hpp
new file mode 100644
index 0000000..ad4c7a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/compl.hpp
@@ -0,0 +1,36 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_COMPL */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_I(x)
+# else
+#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_OO((x))
+#    define BOOST_PP_COMPL_OO(par) BOOST_PP_COMPL_I ## par
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ ## x
+# else
+#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ID(BOOST_PP_COMPL_ ## x)
+#    define BOOST_PP_COMPL_ID(id) id
+# endif
+#
+# define BOOST_PP_COMPL_0 1
+# define BOOST_PP_COMPL_1 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/nor.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/nor.hpp
new file mode 100644
index 0000000..2c0df4b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/nor.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_NOR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_NOR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/bitnor.hpp>
+#
+# /* BOOST_PP_NOR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_NOR(p, q) BOOST_PP_BITNOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# else
+#    define BOOST_PP_NOR(p, q) BOOST_PP_NOR_I(p, q)
+#    define BOOST_PP_NOR_I(p, q) BOOST_PP_BITNOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/not.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/not.hpp
new file mode 100644
index 0000000..b509d3f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/not.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_NOT_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_NOT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/compl.hpp>
+#
+# /* BOOST_PP_NOT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_NOT(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))
+# else
+#    define BOOST_PP_NOT(x) BOOST_PP_NOT_I(x)
+#    define BOOST_PP_NOT_I(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/or.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/or.hpp
new file mode 100644
index 0000000..88d5207
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/or.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_OR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_OR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/bitor.hpp>
+#
+# /* BOOST_PP_OR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_OR(p, q) BOOST_PP_BITOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# else
+#    define BOOST_PP_OR(p, q) BOOST_PP_OR_I(p, q)
+#    define BOOST_PP_OR_I(p, q) BOOST_PP_BITOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/logical/xor.hpp b/gatb-core/thirdparty/boost/preprocessor/logical/xor.hpp
new file mode 100644
index 0000000..34c00e0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/logical/xor.hpp
@@ -0,0 +1,30 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_LOGICAL_XOR_HPP
+# define BOOST_PREPROCESSOR_LOGICAL_XOR_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/logical/bitxor.hpp>
+#
+# /* BOOST_PP_XOR */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_XOR(p, q) BOOST_PP_BITXOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# else
+#    define BOOST_PP_XOR(p, q) BOOST_PP_XOR_I(p, q)
+#    define BOOST_PP_XOR_I(p, q) BOOST_PP_BITXOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/max.hpp b/gatb-core/thirdparty/boost/preprocessor/max.hpp
new file mode 100644
index 0000000..3a46ed9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/max.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_MAX_HPP
+# define BOOST_PREPROCESSOR_MAX_HPP
+#
+# include <boost/preprocessor/selection/max.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/min.hpp b/gatb-core/thirdparty/boost/preprocessor/min.hpp
new file mode 100644
index 0000000..8d8e9af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/min.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_MIN_HPP
+# define BOOST_PREPROCESSOR_MIN_HPP
+#
+# include <boost/preprocessor/selection/min.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/punctuation.hpp b/gatb-core/thirdparty/boost/preprocessor/punctuation.hpp
new file mode 100644
index 0000000..72da73e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/punctuation.hpp
@@ -0,0 +1,20 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_PUNCTUATION_HPP
+# define BOOST_PREPROCESSOR_PUNCTUATION_HPP
+#
+# include <boost/preprocessor/punctuation/comma.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/punctuation/paren.hpp>
+# include <boost/preprocessor/punctuation/paren_if.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/punctuation/comma.hpp b/gatb-core/thirdparty/boost/preprocessor/punctuation/comma.hpp
new file mode 100644
index 0000000..38c2e0e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/punctuation/comma.hpp
@@ -0,0 +1,21 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP
+# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP
+#
+# /* BOOST_PP_COMMA */
+#
+# define BOOST_PP_COMMA() ,
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/punctuation/comma_if.hpp b/gatb-core/thirdparty/boost/preprocessor/punctuation/comma_if.hpp
new file mode 100644
index 0000000..c711f36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/punctuation/comma_if.hpp
@@ -0,0 +1,31 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP
+# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/punctuation/comma.hpp>
+#
+# /* BOOST_PP_COMMA_IF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()
+# else
+#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_COMMA_IF_I(cond)
+#    define BOOST_PP_COMMA_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/punctuation/paren.hpp b/gatb-core/thirdparty/boost/preprocessor/punctuation/paren.hpp
new file mode 100644
index 0000000..28c18cb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/punctuation/paren.hpp
@@ -0,0 +1,23 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_PUNCTUATION_PAREN_HPP
+# define BOOST_PREPROCESSOR_PUNCTUATION_PAREN_HPP
+#
+# /* BOOST_PP_LPAREN */
+#
+# define BOOST_PP_LPAREN() (
+#
+# /* BOOST_PP_RPAREN */
+#
+# define BOOST_PP_RPAREN() )
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/punctuation/paren_if.hpp b/gatb-core/thirdparty/boost/preprocessor/punctuation/paren_if.hpp
new file mode 100644
index 0000000..1239ec1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/punctuation/paren_if.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_PUNCTUATION_PAREN_IF_HPP
+# define BOOST_PREPROCESSOR_PUNCTUATION_PAREN_IF_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/punctuation/paren.hpp>
+#
+# /* BOOST_PP_LPAREN_IF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_LPAREN_IF(cond) BOOST_PP_IF(cond, BOOST_PP_LPAREN, BOOST_PP_EMPTY)()
+# else
+#    define BOOST_PP_LPAREN_IF(cond) BOOST_PP_LPAREN_IF_I(cond)
+#    define BOOST_PP_LPAREN_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_LPAREN, BOOST_PP_EMPTY)()
+# endif
+#
+# /* BOOST_PP_RPAREN_IF */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_RPAREN_IF(cond) BOOST_PP_IF(cond, BOOST_PP_RPAREN, BOOST_PP_EMPTY)()
+# else
+#    define BOOST_PP_RPAREN_IF(cond) BOOST_PP_RPAREN_IF_I(cond)
+#    define BOOST_PP_RPAREN_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_RPAREN, BOOST_PP_EMPTY)()
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat.hpp
new file mode 100644
index 0000000..7c47ee8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_HPP
+# define BOOST_PREPROCESSOR_REPEAT_HPP
+#
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat_2nd.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat_2nd.hpp
new file mode 100644
index 0000000..030c432
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat_2nd.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_2ND_HPP
+# define BOOST_PREPROCESSOR_REPEAT_2ND_HPP
+#
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat_3rd.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat_3rd.hpp
new file mode 100644
index 0000000..9ab36a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat_3rd.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_3RD_HPP
+# define BOOST_PREPROCESSOR_REPEAT_3RD_HPP
+#
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat_from_to.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to.hpp
new file mode 100644
index 0000000..4ddc3be
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_HPP
+# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_HPP
+#
+# include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_2nd.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_2nd.hpp
new file mode 100644
index 0000000..b833fb5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_2nd.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_2ND_HPP
+# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_2ND_HPP
+#
+# include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_3rd.hpp b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_3rd.hpp
new file mode 100644
index 0000000..8cd776f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repeat_from_to_3rd.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_3RD_HPP
+# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_3RD_HPP
+#
+# include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition.hpp
new file mode 100644
index 0000000..efcd60a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition.hpp
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_HPP
+# define BOOST_PREPROCESSOR_REPETITION_HPP
+#
+# include <boost/preprocessor/repetition/deduce_r.hpp>
+# include <boost/preprocessor/repetition/deduce_z.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+# include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>
+# include <boost/preprocessor/repetition/enum_shifted.hpp>
+# include <boost/preprocessor/repetition/enum_shifted_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing.hpp>
+# include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_r.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_r.hpp
new file mode 100644
index 0000000..e49296a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_r.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP
+#
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+#
+# /* BOOST_PP_DEDUCE_R */
+#
+# define BOOST_PP_DEDUCE_R() BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_z.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_z.hpp
new file mode 100644
index 0000000..14dedc2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/deduce_z.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DEDUCE_Z_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DEDUCE_Z_HPP
+#
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# /* BOOST_PP_DEDUCE_Z */
+#
+# define BOOST_PP_DEDUCE_Z() BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/detail/dmc/for.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/dmc/for.hpp
new file mode 100644
index 0000000..1d907ff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/dmc/for.hpp
@@ -0,0 +1,536 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP
+#
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p##(2, s)), s, p, o, m)
+# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p##(3, s)), s, p, o, m)
+# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p##(4, s)), s, p, o, m)
+# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p##(5, s)), s, p, o, m)
+# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p##(6, s)), s, p, o, m)
+# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p##(7, s)), s, p, o, m)
+# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p##(8, s)), s, p, o, m)
+# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p##(9, s)), s, p, o, m)
+# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p##(10, s)), s, p, o, m)
+# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p##(11, s)), s, p, o, m)
+# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p##(12, s)), s, p, o, m)
+# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p##(13, s)), s, p, o, m)
+# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p##(14, s)), s, p, o, m)
+# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p##(15, s)), s, p, o, m)
+# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p##(16, s)), s, p, o, m)
+# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p##(17, s)), s, p, o, m)
+# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p##(18, s)), s, p, o, m)
+# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p##(19, s)), s, p, o, m)
+# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p##(20, s)), s, p, o, m)
+# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p##(21, s)), s, p, o, m)
+# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p##(22, s)), s, p, o, m)
+# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p##(23, s)), s, p, o, m)
+# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p##(24, s)), s, p, o, m)
+# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p##(25, s)), s, p, o, m)
+# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p##(26, s)), s, p, o, m)
+# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p##(27, s)), s, p, o, m)
+# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p##(28, s)), s, p, o, m)
+# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p##(29, s)), s, p, o, m)
+# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p##(30, s)), s, p, o, m)
+# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p##(31, s)), s, p, o, m)
+# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p##(32, s)), s, p, o, m)
+# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p##(33, s)), s, p, o, m)
+# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p##(34, s)), s, p, o, m)
+# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p##(35, s)), s, p, o, m)
+# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p##(36, s)), s, p, o, m)
+# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p##(37, s)), s, p, o, m)
+# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p##(38, s)), s, p, o, m)
+# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p##(39, s)), s, p, o, m)
+# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p##(40, s)), s, p, o, m)
+# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p##(41, s)), s, p, o, m)
+# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p##(42, s)), s, p, o, m)
+# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p##(43, s)), s, p, o, m)
+# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p##(44, s)), s, p, o, m)
+# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p##(45, s)), s, p, o, m)
+# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p##(46, s)), s, p, o, m)
+# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p##(47, s)), s, p, o, m)
+# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p##(48, s)), s, p, o, m)
+# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p##(49, s)), s, p, o, m)
+# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p##(50, s)), s, p, o, m)
+# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p##(51, s)), s, p, o, m)
+# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p##(52, s)), s, p, o, m)
+# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p##(53, s)), s, p, o, m)
+# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p##(54, s)), s, p, o, m)
+# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p##(55, s)), s, p, o, m)
+# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p##(56, s)), s, p, o, m)
+# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p##(57, s)), s, p, o, m)
+# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p##(58, s)), s, p, o, m)
+# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p##(59, s)), s, p, o, m)
+# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p##(60, s)), s, p, o, m)
+# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p##(61, s)), s, p, o, m)
+# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p##(62, s)), s, p, o, m)
+# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p##(63, s)), s, p, o, m)
+# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p##(64, s)), s, p, o, m)
+# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p##(65, s)), s, p, o, m)
+# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p##(66, s)), s, p, o, m)
+# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p##(67, s)), s, p, o, m)
+# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p##(68, s)), s, p, o, m)
+# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p##(69, s)), s, p, o, m)
+# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p##(70, s)), s, p, o, m)
+# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p##(71, s)), s, p, o, m)
+# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p##(72, s)), s, p, o, m)
+# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p##(73, s)), s, p, o, m)
+# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p##(74, s)), s, p, o, m)
+# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p##(75, s)), s, p, o, m)
+# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p##(76, s)), s, p, o, m)
+# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p##(77, s)), s, p, o, m)
+# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p##(78, s)), s, p, o, m)
+# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p##(79, s)), s, p, o, m)
+# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p##(80, s)), s, p, o, m)
+# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p##(81, s)), s, p, o, m)
+# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p##(82, s)), s, p, o, m)
+# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p##(83, s)), s, p, o, m)
+# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p##(84, s)), s, p, o, m)
+# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p##(85, s)), s, p, o, m)
+# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p##(86, s)), s, p, o, m)
+# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p##(87, s)), s, p, o, m)
+# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p##(88, s)), s, p, o, m)
+# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p##(89, s)), s, p, o, m)
+# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p##(90, s)), s, p, o, m)
+# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p##(91, s)), s, p, o, m)
+# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p##(92, s)), s, p, o, m)
+# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p##(93, s)), s, p, o, m)
+# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p##(94, s)), s, p, o, m)
+# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p##(95, s)), s, p, o, m)
+# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p##(96, s)), s, p, o, m)
+# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p##(97, s)), s, p, o, m)
+# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p##(98, s)), s, p, o, m)
+# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p##(99, s)), s, p, o, m)
+# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p##(100, s)), s, p, o, m)
+# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p##(101, s)), s, p, o, m)
+# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p##(102, s)), s, p, o, m)
+# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p##(103, s)), s, p, o, m)
+# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p##(104, s)), s, p, o, m)
+# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p##(105, s)), s, p, o, m)
+# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p##(106, s)), s, p, o, m)
+# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p##(107, s)), s, p, o, m)
+# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p##(108, s)), s, p, o, m)
+# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p##(109, s)), s, p, o, m)
+# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p##(110, s)), s, p, o, m)
+# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p##(111, s)), s, p, o, m)
+# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p##(112, s)), s, p, o, m)
+# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p##(113, s)), s, p, o, m)
+# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p##(114, s)), s, p, o, m)
+# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p##(115, s)), s, p, o, m)
+# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p##(116, s)), s, p, o, m)
+# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p##(117, s)), s, p, o, m)
+# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p##(118, s)), s, p, o, m)
+# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p##(119, s)), s, p, o, m)
+# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p##(120, s)), s, p, o, m)
+# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p##(121, s)), s, p, o, m)
+# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p##(122, s)), s, p, o, m)
+# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p##(123, s)), s, p, o, m)
+# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p##(124, s)), s, p, o, m)
+# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p##(125, s)), s, p, o, m)
+# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p##(126, s)), s, p, o, m)
+# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p##(127, s)), s, p, o, m)
+# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p##(128, s)), s, p, o, m)
+# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p##(129, s)), s, p, o, m)
+# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p##(130, s)), s, p, o, m)
+# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p##(131, s)), s, p, o, m)
+# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p##(132, s)), s, p, o, m)
+# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p##(133, s)), s, p, o, m)
+# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p##(134, s)), s, p, o, m)
+# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p##(135, s)), s, p, o, m)
+# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p##(136, s)), s, p, o, m)
+# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p##(137, s)), s, p, o, m)
+# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p##(138, s)), s, p, o, m)
+# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p##(139, s)), s, p, o, m)
+# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p##(140, s)), s, p, o, m)
+# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p##(141, s)), s, p, o, m)
+# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p##(142, s)), s, p, o, m)
+# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p##(143, s)), s, p, o, m)
+# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p##(144, s)), s, p, o, m)
+# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p##(145, s)), s, p, o, m)
+# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p##(146, s)), s, p, o, m)
+# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p##(147, s)), s, p, o, m)
+# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p##(148, s)), s, p, o, m)
+# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p##(149, s)), s, p, o, m)
+# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p##(150, s)), s, p, o, m)
+# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p##(151, s)), s, p, o, m)
+# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p##(152, s)), s, p, o, m)
+# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p##(153, s)), s, p, o, m)
+# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p##(154, s)), s, p, o, m)
+# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p##(155, s)), s, p, o, m)
+# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p##(156, s)), s, p, o, m)
+# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p##(157, s)), s, p, o, m)
+# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p##(158, s)), s, p, o, m)
+# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p##(159, s)), s, p, o, m)
+# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p##(160, s)), s, p, o, m)
+# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p##(161, s)), s, p, o, m)
+# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p##(162, s)), s, p, o, m)
+# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p##(163, s)), s, p, o, m)
+# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p##(164, s)), s, p, o, m)
+# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p##(165, s)), s, p, o, m)
+# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p##(166, s)), s, p, o, m)
+# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p##(167, s)), s, p, o, m)
+# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p##(168, s)), s, p, o, m)
+# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p##(169, s)), s, p, o, m)
+# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p##(170, s)), s, p, o, m)
+# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p##(171, s)), s, p, o, m)
+# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p##(172, s)), s, p, o, m)
+# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p##(173, s)), s, p, o, m)
+# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p##(174, s)), s, p, o, m)
+# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p##(175, s)), s, p, o, m)
+# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p##(176, s)), s, p, o, m)
+# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p##(177, s)), s, p, o, m)
+# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p##(178, s)), s, p, o, m)
+# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p##(179, s)), s, p, o, m)
+# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p##(180, s)), s, p, o, m)
+# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p##(181, s)), s, p, o, m)
+# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p##(182, s)), s, p, o, m)
+# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p##(183, s)), s, p, o, m)
+# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p##(184, s)), s, p, o, m)
+# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p##(185, s)), s, p, o, m)
+# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p##(186, s)), s, p, o, m)
+# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p##(187, s)), s, p, o, m)
+# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p##(188, s)), s, p, o, m)
+# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p##(189, s)), s, p, o, m)
+# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p##(190, s)), s, p, o, m)
+# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p##(191, s)), s, p, o, m)
+# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p##(192, s)), s, p, o, m)
+# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p##(193, s)), s, p, o, m)
+# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p##(194, s)), s, p, o, m)
+# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p##(195, s)), s, p, o, m)
+# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p##(196, s)), s, p, o, m)
+# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p##(197, s)), s, p, o, m)
+# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p##(198, s)), s, p, o, m)
+# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p##(199, s)), s, p, o, m)
+# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p##(200, s)), s, p, o, m)
+# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p##(201, s)), s, p, o, m)
+# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p##(202, s)), s, p, o, m)
+# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p##(203, s)), s, p, o, m)
+# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p##(204, s)), s, p, o, m)
+# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p##(205, s)), s, p, o, m)
+# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p##(206, s)), s, p, o, m)
+# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p##(207, s)), s, p, o, m)
+# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p##(208, s)), s, p, o, m)
+# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p##(209, s)), s, p, o, m)
+# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p##(210, s)), s, p, o, m)
+# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p##(211, s)), s, p, o, m)
+# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p##(212, s)), s, p, o, m)
+# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p##(213, s)), s, p, o, m)
+# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p##(214, s)), s, p, o, m)
+# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p##(215, s)), s, p, o, m)
+# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p##(216, s)), s, p, o, m)
+# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p##(217, s)), s, p, o, m)
+# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p##(218, s)), s, p, o, m)
+# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p##(219, s)), s, p, o, m)
+# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p##(220, s)), s, p, o, m)
+# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p##(221, s)), s, p, o, m)
+# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p##(222, s)), s, p, o, m)
+# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p##(223, s)), s, p, o, m)
+# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p##(224, s)), s, p, o, m)
+# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p##(225, s)), s, p, o, m)
+# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p##(226, s)), s, p, o, m)
+# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p##(227, s)), s, p, o, m)
+# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p##(228, s)), s, p, o, m)
+# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p##(229, s)), s, p, o, m)
+# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p##(230, s)), s, p, o, m)
+# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p##(231, s)), s, p, o, m)
+# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p##(232, s)), s, p, o, m)
+# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p##(233, s)), s, p, o, m)
+# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p##(234, s)), s, p, o, m)
+# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p##(235, s)), s, p, o, m)
+# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p##(236, s)), s, p, o, m)
+# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p##(237, s)), s, p, o, m)
+# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p##(238, s)), s, p, o, m)
+# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p##(239, s)), s, p, o, m)
+# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p##(240, s)), s, p, o, m)
+# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p##(241, s)), s, p, o, m)
+# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p##(242, s)), s, p, o, m)
+# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p##(243, s)), s, p, o, m)
+# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p##(244, s)), s, p, o, m)
+# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p##(245, s)), s, p, o, m)
+# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p##(246, s)), s, p, o, m)
+# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p##(247, s)), s, p, o, m)
+# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p##(248, s)), s, p, o, m)
+# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p##(249, s)), s, p, o, m)
+# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p##(250, s)), s, p, o, m)
+# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p##(251, s)), s, p, o, m)
+# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p##(252, s)), s, p, o, m)
+# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p##(253, s)), s, p, o, m)
+# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p##(254, s)), s, p, o, m)
+# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p##(255, s)), s, p, o, m)
+# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p##(256, s)), s, p, o, m)
+# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p##(257, s)), s, p, o, m)
+#
+# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)
+# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)
+# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)
+# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)
+# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)
+# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)
+# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)
+# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)
+# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)
+# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)
+# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)
+# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)
+# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)
+# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)
+# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)
+# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)
+# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)
+# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)
+# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)
+# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)
+# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)
+# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)
+# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)
+# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)
+# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)
+# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)
+# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)
+# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)
+# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)
+# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)
+# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)
+# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)
+# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)
+# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)
+# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)
+# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)
+# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)
+# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)
+# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)
+# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)
+# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)
+# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)
+# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)
+# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)
+# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)
+# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)
+# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)
+# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)
+# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)
+# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)
+# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)
+# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)
+# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)
+# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)
+# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)
+# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)
+# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)
+# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)
+# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)
+# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)
+# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)
+# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)
+# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)
+# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)
+# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)
+# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)
+# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)
+# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)
+# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)
+# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)
+# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)
+# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)
+# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)
+# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)
+# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)
+# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)
+# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)
+# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)
+# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)
+# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)
+# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)
+# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)
+# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)
+# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)
+# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)
+# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)
+# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)
+# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)
+# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)
+# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)
+# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)
+# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)
+# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)
+# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)
+# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)
+# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)
+# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)
+# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)
+# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)
+# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)
+# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)
+# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)
+# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)
+# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)
+# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)
+# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)
+# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)
+# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)
+# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)
+# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)
+# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)
+# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)
+# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)
+# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)
+# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)
+# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)
+# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)
+# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)
+# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)
+# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)
+# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)
+# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)
+# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)
+# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)
+# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)
+# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)
+# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)
+# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)
+# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)
+# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)
+# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)
+# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)
+# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)
+# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)
+# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)
+# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)
+# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)
+# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)
+# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)
+# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)
+# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)
+# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)
+# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)
+# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)
+# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)
+# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)
+# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)
+# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)
+# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)
+# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)
+# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)
+# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)
+# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)
+# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)
+# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)
+# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)
+# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)
+# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)
+# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)
+# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)
+# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)
+# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)
+# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)
+# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)
+# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)
+# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)
+# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)
+# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)
+# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)
+# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)
+# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)
+# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)
+# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)
+# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)
+# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)
+# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)
+# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)
+# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)
+# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)
+# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)
+# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)
+# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)
+# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)
+# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)
+# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)
+# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)
+# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)
+# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)
+# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)
+# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)
+# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)
+# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)
+# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)
+# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)
+# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)
+# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)
+# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)
+# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)
+# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)
+# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)
+# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)
+# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)
+# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)
+# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)
+# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)
+# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)
+# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)
+# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)
+# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)
+# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)
+# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)
+# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)
+# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)
+# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)
+# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)
+# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)
+# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)
+# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)
+# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)
+# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)
+# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)
+# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)
+# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)
+# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)
+# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)
+# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)
+# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)
+# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)
+# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)
+# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)
+# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)
+# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)
+# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)
+# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)
+# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)
+# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)
+# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)
+# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)
+# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)
+# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)
+# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)
+# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)
+# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)
+# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)
+# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)
+# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)
+# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)
+# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)
+# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)
+# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)
+# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)
+# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)
+# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)
+# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)
+# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)
+# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/detail/edg/for.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/edg/for.hpp
new file mode 100644
index 0000000..212921a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/edg/for.hpp
@@ -0,0 +1,534 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP
+#
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_I(s, p, o, m)
+# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_I(s, p, o, m)
+# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_I(s, p, o, m)
+# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_I(s, p, o, m)
+# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_I(s, p, o, m)
+# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_I(s, p, o, m)
+# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_I(s, p, o, m)
+# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_I(s, p, o, m)
+# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_I(s, p, o, m)
+# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_I(s, p, o, m)
+# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_I(s, p, o, m)
+# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_I(s, p, o, m)
+# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_I(s, p, o, m)
+# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_I(s, p, o, m)
+# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_I(s, p, o, m)
+# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_I(s, p, o, m)
+# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_I(s, p, o, m)
+# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_I(s, p, o, m)
+# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_I(s, p, o, m)
+# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_I(s, p, o, m)
+# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_I(s, p, o, m)
+# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_I(s, p, o, m)
+# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_I(s, p, o, m)
+# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_I(s, p, o, m)
+# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_I(s, p, o, m)
+# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_I(s, p, o, m)
+# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_I(s, p, o, m)
+# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_I(s, p, o, m)
+# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_I(s, p, o, m)
+# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_I(s, p, o, m)
+# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_I(s, p, o, m)
+# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_I(s, p, o, m)
+# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_I(s, p, o, m)
+# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_I(s, p, o, m)
+# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_I(s, p, o, m)
+# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_I(s, p, o, m)
+# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_I(s, p, o, m)
+# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_I(s, p, o, m)
+# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_I(s, p, o, m)
+# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_I(s, p, o, m)
+# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_I(s, p, o, m)
+# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_I(s, p, o, m)
+# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_I(s, p, o, m)
+# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_I(s, p, o, m)
+# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_I(s, p, o, m)
+# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_I(s, p, o, m)
+# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_I(s, p, o, m)
+# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_I(s, p, o, m)
+# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_I(s, p, o, m)
+# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_I(s, p, o, m)
+# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_I(s, p, o, m)
+# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_I(s, p, o, m)
+# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_I(s, p, o, m)
+# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_I(s, p, o, m)
+# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_I(s, p, o, m)
+# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_I(s, p, o, m)
+# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_I(s, p, o, m)
+# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_I(s, p, o, m)
+# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_I(s, p, o, m)
+# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_I(s, p, o, m)
+# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_I(s, p, o, m)
+# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_I(s, p, o, m)
+# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_I(s, p, o, m)
+# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_I(s, p, o, m)
+# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_I(s, p, o, m)
+# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_I(s, p, o, m)
+# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_I(s, p, o, m)
+# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_I(s, p, o, m)
+# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_I(s, p, o, m)
+# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_I(s, p, o, m)
+# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_I(s, p, o, m)
+# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_I(s, p, o, m)
+# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_I(s, p, o, m)
+# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_I(s, p, o, m)
+# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_I(s, p, o, m)
+# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_I(s, p, o, m)
+# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_I(s, p, o, m)
+# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_I(s, p, o, m)
+# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_I(s, p, o, m)
+# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_I(s, p, o, m)
+# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_I(s, p, o, m)
+# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_I(s, p, o, m)
+# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_I(s, p, o, m)
+# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_I(s, p, o, m)
+# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_I(s, p, o, m)
+# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_I(s, p, o, m)
+# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_I(s, p, o, m)
+# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_I(s, p, o, m)
+# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_I(s, p, o, m)
+# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_I(s, p, o, m)
+# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_I(s, p, o, m)
+# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_I(s, p, o, m)
+# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_I(s, p, o, m)
+# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_I(s, p, o, m)
+# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_I(s, p, o, m)
+# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_I(s, p, o, m)
+# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_I(s, p, o, m)
+# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_I(s, p, o, m)
+# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_I(s, p, o, m)
+# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_I(s, p, o, m)
+# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_I(s, p, o, m)
+# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_I(s, p, o, m)
+# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_I(s, p, o, m)
+# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_I(s, p, o, m)
+# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_I(s, p, o, m)
+# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_I(s, p, o, m)
+# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_I(s, p, o, m)
+# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_I(s, p, o, m)
+# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_I(s, p, o, m)
+# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_I(s, p, o, m)
+# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_I(s, p, o, m)
+# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_I(s, p, o, m)
+# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_I(s, p, o, m)
+# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_I(s, p, o, m)
+# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_I(s, p, o, m)
+# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_I(s, p, o, m)
+# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_I(s, p, o, m)
+# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_I(s, p, o, m)
+# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_I(s, p, o, m)
+# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_I(s, p, o, m)
+# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_I(s, p, o, m)
+# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_I(s, p, o, m)
+# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_I(s, p, o, m)
+# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_I(s, p, o, m)
+# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_I(s, p, o, m)
+# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_I(s, p, o, m)
+# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_I(s, p, o, m)
+# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_I(s, p, o, m)
+# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_I(s, p, o, m)
+# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_I(s, p, o, m)
+# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_I(s, p, o, m)
+# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_I(s, p, o, m)
+# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_I(s, p, o, m)
+# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_I(s, p, o, m)
+# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_I(s, p, o, m)
+# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_I(s, p, o, m)
+# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_I(s, p, o, m)
+# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_I(s, p, o, m)
+# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_I(s, p, o, m)
+# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_I(s, p, o, m)
+# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_I(s, p, o, m)
+# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_I(s, p, o, m)
+# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_I(s, p, o, m)
+# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_I(s, p, o, m)
+# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_I(s, p, o, m)
+# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_I(s, p, o, m)
+# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_I(s, p, o, m)
+# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_I(s, p, o, m)
+# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_I(s, p, o, m)
+# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_I(s, p, o, m)
+# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_I(s, p, o, m)
+# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_I(s, p, o, m)
+# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_I(s, p, o, m)
+# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_I(s, p, o, m)
+# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_I(s, p, o, m)
+# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_I(s, p, o, m)
+# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_I(s, p, o, m)
+# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_I(s, p, o, m)
+# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_I(s, p, o, m)
+# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_I(s, p, o, m)
+# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_I(s, p, o, m)
+# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_I(s, p, o, m)
+# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_I(s, p, o, m)
+# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_I(s, p, o, m)
+# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_I(s, p, o, m)
+# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_I(s, p, o, m)
+# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_I(s, p, o, m)
+# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_I(s, p, o, m)
+# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_I(s, p, o, m)
+# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_I(s, p, o, m)
+# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_I(s, p, o, m)
+# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_I(s, p, o, m)
+# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_I(s, p, o, m)
+# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_I(s, p, o, m)
+# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_I(s, p, o, m)
+# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_I(s, p, o, m)
+# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_I(s, p, o, m)
+# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_I(s, p, o, m)
+# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_I(s, p, o, m)
+# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_I(s, p, o, m)
+# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_I(s, p, o, m)
+# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_I(s, p, o, m)
+# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_I(s, p, o, m)
+# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_I(s, p, o, m)
+# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_I(s, p, o, m)
+# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_I(s, p, o, m)
+# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_I(s, p, o, m)
+# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_I(s, p, o, m)
+# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_I(s, p, o, m)
+# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_I(s, p, o, m)
+# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_I(s, p, o, m)
+# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_I(s, p, o, m)
+# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_I(s, p, o, m)
+# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_I(s, p, o, m)
+# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_I(s, p, o, m)
+# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_I(s, p, o, m)
+# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_I(s, p, o, m)
+# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_I(s, p, o, m)
+# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_I(s, p, o, m)
+# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_I(s, p, o, m)
+# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_I(s, p, o, m)
+# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_I(s, p, o, m)
+# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_I(s, p, o, m)
+# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_I(s, p, o, m)
+# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_I(s, p, o, m)
+# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_I(s, p, o, m)
+# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_I(s, p, o, m)
+# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_I(s, p, o, m)
+# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_I(s, p, o, m)
+# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_I(s, p, o, m)
+# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_I(s, p, o, m)
+# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_I(s, p, o, m)
+# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_I(s, p, o, m)
+# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_I(s, p, o, m)
+# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_I(s, p, o, m)
+# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_I(s, p, o, m)
+# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_I(s, p, o, m)
+# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_I(s, p, o, m)
+# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_I(s, p, o, m)
+# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_I(s, p, o, m)
+# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_I(s, p, o, m)
+# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_I(s, p, o, m)
+# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_I(s, p, o, m)
+# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_I(s, p, o, m)
+# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_I(s, p, o, m)
+# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_I(s, p, o, m)
+# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_I(s, p, o, m)
+# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_I(s, p, o, m)
+# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_I(s, p, o, m)
+# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_I(s, p, o, m)
+# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_I(s, p, o, m)
+# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_I(s, p, o, m)
+# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_I(s, p, o, m)
+# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_I(s, p, o, m)
+# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_I(s, p, o, m)
+# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_I(s, p, o, m)
+# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_I(s, p, o, m)
+# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_I(s, p, o, m)
+# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_I(s, p, o, m)
+# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_I(s, p, o, m)
+# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_I(s, p, o, m)
+# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_I(s, p, o, m)
+# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_I(s, p, o, m)
+# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_I(s, p, o, m)
+# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_I(s, p, o, m)
+# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_I(s, p, o, m)
+# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_I(s, p, o, m)
+# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_I(s, p, o, m)
+# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_I(s, p, o, m)
+# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_I(s, p, o, m)
+# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_I(s, p, o, m)
+# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_I(s, p, o, m)
+# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_I(s, p, o, m)
+# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_I(s, p, o, m)
+# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_I(s, p, o, m)
+# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_I(s, p, o, m)
+#
+# define BOOST_PP_FOR_1_I(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)
+# define BOOST_PP_FOR_2_I(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)
+# define BOOST_PP_FOR_3_I(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)
+# define BOOST_PP_FOR_4_I(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)
+# define BOOST_PP_FOR_5_I(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)
+# define BOOST_PP_FOR_6_I(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)
+# define BOOST_PP_FOR_7_I(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)
+# define BOOST_PP_FOR_8_I(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)
+# define BOOST_PP_FOR_9_I(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)
+# define BOOST_PP_FOR_10_I(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)
+# define BOOST_PP_FOR_11_I(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)
+# define BOOST_PP_FOR_12_I(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)
+# define BOOST_PP_FOR_13_I(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)
+# define BOOST_PP_FOR_14_I(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)
+# define BOOST_PP_FOR_15_I(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)
+# define BOOST_PP_FOR_16_I(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)
+# define BOOST_PP_FOR_17_I(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)
+# define BOOST_PP_FOR_18_I(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)
+# define BOOST_PP_FOR_19_I(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)
+# define BOOST_PP_FOR_20_I(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)
+# define BOOST_PP_FOR_21_I(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)
+# define BOOST_PP_FOR_22_I(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)
+# define BOOST_PP_FOR_23_I(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)
+# define BOOST_PP_FOR_24_I(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)
+# define BOOST_PP_FOR_25_I(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)
+# define BOOST_PP_FOR_26_I(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)
+# define BOOST_PP_FOR_27_I(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)
+# define BOOST_PP_FOR_28_I(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)
+# define BOOST_PP_FOR_29_I(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)
+# define BOOST_PP_FOR_30_I(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)
+# define BOOST_PP_FOR_31_I(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)
+# define BOOST_PP_FOR_32_I(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)
+# define BOOST_PP_FOR_33_I(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)
+# define BOOST_PP_FOR_34_I(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)
+# define BOOST_PP_FOR_35_I(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)
+# define BOOST_PP_FOR_36_I(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)
+# define BOOST_PP_FOR_37_I(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)
+# define BOOST_PP_FOR_38_I(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)
+# define BOOST_PP_FOR_39_I(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)
+# define BOOST_PP_FOR_40_I(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)
+# define BOOST_PP_FOR_41_I(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)
+# define BOOST_PP_FOR_42_I(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)
+# define BOOST_PP_FOR_43_I(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)
+# define BOOST_PP_FOR_44_I(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)
+# define BOOST_PP_FOR_45_I(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)
+# define BOOST_PP_FOR_46_I(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)
+# define BOOST_PP_FOR_47_I(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)
+# define BOOST_PP_FOR_48_I(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)
+# define BOOST_PP_FOR_49_I(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)
+# define BOOST_PP_FOR_50_I(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)
+# define BOOST_PP_FOR_51_I(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)
+# define BOOST_PP_FOR_52_I(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)
+# define BOOST_PP_FOR_53_I(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)
+# define BOOST_PP_FOR_54_I(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)
+# define BOOST_PP_FOR_55_I(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)
+# define BOOST_PP_FOR_56_I(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)
+# define BOOST_PP_FOR_57_I(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)
+# define BOOST_PP_FOR_58_I(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)
+# define BOOST_PP_FOR_59_I(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)
+# define BOOST_PP_FOR_60_I(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)
+# define BOOST_PP_FOR_61_I(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)
+# define BOOST_PP_FOR_62_I(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)
+# define BOOST_PP_FOR_63_I(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)
+# define BOOST_PP_FOR_64_I(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)
+# define BOOST_PP_FOR_65_I(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)
+# define BOOST_PP_FOR_66_I(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)
+# define BOOST_PP_FOR_67_I(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)
+# define BOOST_PP_FOR_68_I(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)
+# define BOOST_PP_FOR_69_I(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)
+# define BOOST_PP_FOR_70_I(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)
+# define BOOST_PP_FOR_71_I(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)
+# define BOOST_PP_FOR_72_I(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)
+# define BOOST_PP_FOR_73_I(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)
+# define BOOST_PP_FOR_74_I(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)
+# define BOOST_PP_FOR_75_I(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)
+# define BOOST_PP_FOR_76_I(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)
+# define BOOST_PP_FOR_77_I(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)
+# define BOOST_PP_FOR_78_I(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)
+# define BOOST_PP_FOR_79_I(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)
+# define BOOST_PP_FOR_80_I(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)
+# define BOOST_PP_FOR_81_I(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)
+# define BOOST_PP_FOR_82_I(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)
+# define BOOST_PP_FOR_83_I(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)
+# define BOOST_PP_FOR_84_I(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)
+# define BOOST_PP_FOR_85_I(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)
+# define BOOST_PP_FOR_86_I(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)
+# define BOOST_PP_FOR_87_I(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)
+# define BOOST_PP_FOR_88_I(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)
+# define BOOST_PP_FOR_89_I(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)
+# define BOOST_PP_FOR_90_I(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)
+# define BOOST_PP_FOR_91_I(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)
+# define BOOST_PP_FOR_92_I(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)
+# define BOOST_PP_FOR_93_I(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)
+# define BOOST_PP_FOR_94_I(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)
+# define BOOST_PP_FOR_95_I(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)
+# define BOOST_PP_FOR_96_I(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)
+# define BOOST_PP_FOR_97_I(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)
+# define BOOST_PP_FOR_98_I(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)
+# define BOOST_PP_FOR_99_I(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)
+# define BOOST_PP_FOR_100_I(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)
+# define BOOST_PP_FOR_101_I(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)
+# define BOOST_PP_FOR_102_I(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)
+# define BOOST_PP_FOR_103_I(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)
+# define BOOST_PP_FOR_104_I(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)
+# define BOOST_PP_FOR_105_I(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)
+# define BOOST_PP_FOR_106_I(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)
+# define BOOST_PP_FOR_107_I(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)
+# define BOOST_PP_FOR_108_I(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)
+# define BOOST_PP_FOR_109_I(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)
+# define BOOST_PP_FOR_110_I(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)
+# define BOOST_PP_FOR_111_I(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)
+# define BOOST_PP_FOR_112_I(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)
+# define BOOST_PP_FOR_113_I(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)
+# define BOOST_PP_FOR_114_I(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)
+# define BOOST_PP_FOR_115_I(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)
+# define BOOST_PP_FOR_116_I(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)
+# define BOOST_PP_FOR_117_I(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)
+# define BOOST_PP_FOR_118_I(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)
+# define BOOST_PP_FOR_119_I(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)
+# define BOOST_PP_FOR_120_I(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)
+# define BOOST_PP_FOR_121_I(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)
+# define BOOST_PP_FOR_122_I(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)
+# define BOOST_PP_FOR_123_I(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)
+# define BOOST_PP_FOR_124_I(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)
+# define BOOST_PP_FOR_125_I(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)
+# define BOOST_PP_FOR_126_I(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)
+# define BOOST_PP_FOR_127_I(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)
+# define BOOST_PP_FOR_128_I(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)
+# define BOOST_PP_FOR_129_I(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)
+# define BOOST_PP_FOR_130_I(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)
+# define BOOST_PP_FOR_131_I(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)
+# define BOOST_PP_FOR_132_I(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)
+# define BOOST_PP_FOR_133_I(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)
+# define BOOST_PP_FOR_134_I(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)
+# define BOOST_PP_FOR_135_I(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)
+# define BOOST_PP_FOR_136_I(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)
+# define BOOST_PP_FOR_137_I(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)
+# define BOOST_PP_FOR_138_I(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)
+# define BOOST_PP_FOR_139_I(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)
+# define BOOST_PP_FOR_140_I(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)
+# define BOOST_PP_FOR_141_I(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)
+# define BOOST_PP_FOR_142_I(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)
+# define BOOST_PP_FOR_143_I(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)
+# define BOOST_PP_FOR_144_I(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)
+# define BOOST_PP_FOR_145_I(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)
+# define BOOST_PP_FOR_146_I(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)
+# define BOOST_PP_FOR_147_I(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)
+# define BOOST_PP_FOR_148_I(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)
+# define BOOST_PP_FOR_149_I(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)
+# define BOOST_PP_FOR_150_I(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)
+# define BOOST_PP_FOR_151_I(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)
+# define BOOST_PP_FOR_152_I(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)
+# define BOOST_PP_FOR_153_I(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)
+# define BOOST_PP_FOR_154_I(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)
+# define BOOST_PP_FOR_155_I(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)
+# define BOOST_PP_FOR_156_I(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)
+# define BOOST_PP_FOR_157_I(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)
+# define BOOST_PP_FOR_158_I(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)
+# define BOOST_PP_FOR_159_I(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)
+# define BOOST_PP_FOR_160_I(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)
+# define BOOST_PP_FOR_161_I(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)
+# define BOOST_PP_FOR_162_I(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)
+# define BOOST_PP_FOR_163_I(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)
+# define BOOST_PP_FOR_164_I(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)
+# define BOOST_PP_FOR_165_I(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)
+# define BOOST_PP_FOR_166_I(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)
+# define BOOST_PP_FOR_167_I(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)
+# define BOOST_PP_FOR_168_I(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)
+# define BOOST_PP_FOR_169_I(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)
+# define BOOST_PP_FOR_170_I(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)
+# define BOOST_PP_FOR_171_I(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)
+# define BOOST_PP_FOR_172_I(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)
+# define BOOST_PP_FOR_173_I(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)
+# define BOOST_PP_FOR_174_I(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)
+# define BOOST_PP_FOR_175_I(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)
+# define BOOST_PP_FOR_176_I(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)
+# define BOOST_PP_FOR_177_I(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)
+# define BOOST_PP_FOR_178_I(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)
+# define BOOST_PP_FOR_179_I(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)
+# define BOOST_PP_FOR_180_I(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)
+# define BOOST_PP_FOR_181_I(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)
+# define BOOST_PP_FOR_182_I(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)
+# define BOOST_PP_FOR_183_I(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)
+# define BOOST_PP_FOR_184_I(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)
+# define BOOST_PP_FOR_185_I(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)
+# define BOOST_PP_FOR_186_I(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)
+# define BOOST_PP_FOR_187_I(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)
+# define BOOST_PP_FOR_188_I(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)
+# define BOOST_PP_FOR_189_I(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)
+# define BOOST_PP_FOR_190_I(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)
+# define BOOST_PP_FOR_191_I(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)
+# define BOOST_PP_FOR_192_I(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)
+# define BOOST_PP_FOR_193_I(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)
+# define BOOST_PP_FOR_194_I(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)
+# define BOOST_PP_FOR_195_I(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)
+# define BOOST_PP_FOR_196_I(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)
+# define BOOST_PP_FOR_197_I(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)
+# define BOOST_PP_FOR_198_I(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)
+# define BOOST_PP_FOR_199_I(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)
+# define BOOST_PP_FOR_200_I(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)
+# define BOOST_PP_FOR_201_I(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)
+# define BOOST_PP_FOR_202_I(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)
+# define BOOST_PP_FOR_203_I(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)
+# define BOOST_PP_FOR_204_I(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)
+# define BOOST_PP_FOR_205_I(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)
+# define BOOST_PP_FOR_206_I(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)
+# define BOOST_PP_FOR_207_I(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)
+# define BOOST_PP_FOR_208_I(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)
+# define BOOST_PP_FOR_209_I(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)
+# define BOOST_PP_FOR_210_I(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)
+# define BOOST_PP_FOR_211_I(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)
+# define BOOST_PP_FOR_212_I(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)
+# define BOOST_PP_FOR_213_I(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)
+# define BOOST_PP_FOR_214_I(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)
+# define BOOST_PP_FOR_215_I(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)
+# define BOOST_PP_FOR_216_I(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)
+# define BOOST_PP_FOR_217_I(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)
+# define BOOST_PP_FOR_218_I(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)
+# define BOOST_PP_FOR_219_I(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)
+# define BOOST_PP_FOR_220_I(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)
+# define BOOST_PP_FOR_221_I(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)
+# define BOOST_PP_FOR_222_I(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)
+# define BOOST_PP_FOR_223_I(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)
+# define BOOST_PP_FOR_224_I(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)
+# define BOOST_PP_FOR_225_I(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)
+# define BOOST_PP_FOR_226_I(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)
+# define BOOST_PP_FOR_227_I(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)
+# define BOOST_PP_FOR_228_I(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)
+# define BOOST_PP_FOR_229_I(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)
+# define BOOST_PP_FOR_230_I(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)
+# define BOOST_PP_FOR_231_I(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)
+# define BOOST_PP_FOR_232_I(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)
+# define BOOST_PP_FOR_233_I(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)
+# define BOOST_PP_FOR_234_I(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)
+# define BOOST_PP_FOR_235_I(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)
+# define BOOST_PP_FOR_236_I(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)
+# define BOOST_PP_FOR_237_I(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)
+# define BOOST_PP_FOR_238_I(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)
+# define BOOST_PP_FOR_239_I(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)
+# define BOOST_PP_FOR_240_I(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)
+# define BOOST_PP_FOR_241_I(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)
+# define BOOST_PP_FOR_242_I(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)
+# define BOOST_PP_FOR_243_I(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)
+# define BOOST_PP_FOR_244_I(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)
+# define BOOST_PP_FOR_245_I(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)
+# define BOOST_PP_FOR_246_I(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)
+# define BOOST_PP_FOR_247_I(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)
+# define BOOST_PP_FOR_248_I(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)
+# define BOOST_PP_FOR_249_I(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)
+# define BOOST_PP_FOR_250_I(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)
+# define BOOST_PP_FOR_251_I(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)
+# define BOOST_PP_FOR_252_I(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)
+# define BOOST_PP_FOR_253_I(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)
+# define BOOST_PP_FOR_254_I(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)
+# define BOOST_PP_FOR_255_I(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)
+# define BOOST_PP_FOR_256_I(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/detail/for.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/for.hpp
new file mode 100644
index 0000000..2770f2c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/for.hpp
@@ -0,0 +1,536 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP
+#
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/logical/bool.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p(2, s)), s, p, o, m)
+# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p(3, s)), s, p, o, m)
+# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p(4, s)), s, p, o, m)
+# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p(5, s)), s, p, o, m)
+# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p(6, s)), s, p, o, m)
+# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p(7, s)), s, p, o, m)
+# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p(8, s)), s, p, o, m)
+# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p(9, s)), s, p, o, m)
+# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p(10, s)), s, p, o, m)
+# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p(11, s)), s, p, o, m)
+# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p(12, s)), s, p, o, m)
+# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p(13, s)), s, p, o, m)
+# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p(14, s)), s, p, o, m)
+# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p(15, s)), s, p, o, m)
+# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p(16, s)), s, p, o, m)
+# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p(17, s)), s, p, o, m)
+# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p(18, s)), s, p, o, m)
+# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p(19, s)), s, p, o, m)
+# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p(20, s)), s, p, o, m)
+# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p(21, s)), s, p, o, m)
+# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p(22, s)), s, p, o, m)
+# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p(23, s)), s, p, o, m)
+# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p(24, s)), s, p, o, m)
+# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p(25, s)), s, p, o, m)
+# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p(26, s)), s, p, o, m)
+# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p(27, s)), s, p, o, m)
+# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p(28, s)), s, p, o, m)
+# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p(29, s)), s, p, o, m)
+# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p(30, s)), s, p, o, m)
+# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p(31, s)), s, p, o, m)
+# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p(32, s)), s, p, o, m)
+# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p(33, s)), s, p, o, m)
+# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p(34, s)), s, p, o, m)
+# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p(35, s)), s, p, o, m)
+# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p(36, s)), s, p, o, m)
+# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p(37, s)), s, p, o, m)
+# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p(38, s)), s, p, o, m)
+# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p(39, s)), s, p, o, m)
+# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p(40, s)), s, p, o, m)
+# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p(41, s)), s, p, o, m)
+# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p(42, s)), s, p, o, m)
+# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p(43, s)), s, p, o, m)
+# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p(44, s)), s, p, o, m)
+# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p(45, s)), s, p, o, m)
+# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p(46, s)), s, p, o, m)
+# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p(47, s)), s, p, o, m)
+# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p(48, s)), s, p, o, m)
+# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p(49, s)), s, p, o, m)
+# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p(50, s)), s, p, o, m)
+# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p(51, s)), s, p, o, m)
+# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p(52, s)), s, p, o, m)
+# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p(53, s)), s, p, o, m)
+# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p(54, s)), s, p, o, m)
+# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p(55, s)), s, p, o, m)
+# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p(56, s)), s, p, o, m)
+# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p(57, s)), s, p, o, m)
+# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p(58, s)), s, p, o, m)
+# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p(59, s)), s, p, o, m)
+# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p(60, s)), s, p, o, m)
+# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p(61, s)), s, p, o, m)
+# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p(62, s)), s, p, o, m)
+# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p(63, s)), s, p, o, m)
+# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p(64, s)), s, p, o, m)
+# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p(65, s)), s, p, o, m)
+# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p(66, s)), s, p, o, m)
+# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p(67, s)), s, p, o, m)
+# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p(68, s)), s, p, o, m)
+# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p(69, s)), s, p, o, m)
+# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p(70, s)), s, p, o, m)
+# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p(71, s)), s, p, o, m)
+# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p(72, s)), s, p, o, m)
+# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p(73, s)), s, p, o, m)
+# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p(74, s)), s, p, o, m)
+# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p(75, s)), s, p, o, m)
+# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p(76, s)), s, p, o, m)
+# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p(77, s)), s, p, o, m)
+# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p(78, s)), s, p, o, m)
+# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p(79, s)), s, p, o, m)
+# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p(80, s)), s, p, o, m)
+# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p(81, s)), s, p, o, m)
+# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p(82, s)), s, p, o, m)
+# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p(83, s)), s, p, o, m)
+# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p(84, s)), s, p, o, m)
+# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p(85, s)), s, p, o, m)
+# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p(86, s)), s, p, o, m)
+# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p(87, s)), s, p, o, m)
+# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p(88, s)), s, p, o, m)
+# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p(89, s)), s, p, o, m)
+# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p(90, s)), s, p, o, m)
+# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p(91, s)), s, p, o, m)
+# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p(92, s)), s, p, o, m)
+# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p(93, s)), s, p, o, m)
+# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p(94, s)), s, p, o, m)
+# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p(95, s)), s, p, o, m)
+# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p(96, s)), s, p, o, m)
+# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p(97, s)), s, p, o, m)
+# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p(98, s)), s, p, o, m)
+# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p(99, s)), s, p, o, m)
+# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p(100, s)), s, p, o, m)
+# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p(101, s)), s, p, o, m)
+# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p(102, s)), s, p, o, m)
+# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p(103, s)), s, p, o, m)
+# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p(104, s)), s, p, o, m)
+# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p(105, s)), s, p, o, m)
+# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p(106, s)), s, p, o, m)
+# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p(107, s)), s, p, o, m)
+# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p(108, s)), s, p, o, m)
+# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p(109, s)), s, p, o, m)
+# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p(110, s)), s, p, o, m)
+# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p(111, s)), s, p, o, m)
+# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p(112, s)), s, p, o, m)
+# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p(113, s)), s, p, o, m)
+# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p(114, s)), s, p, o, m)
+# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p(115, s)), s, p, o, m)
+# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p(116, s)), s, p, o, m)
+# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p(117, s)), s, p, o, m)
+# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p(118, s)), s, p, o, m)
+# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p(119, s)), s, p, o, m)
+# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p(120, s)), s, p, o, m)
+# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p(121, s)), s, p, o, m)
+# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p(122, s)), s, p, o, m)
+# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p(123, s)), s, p, o, m)
+# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p(124, s)), s, p, o, m)
+# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p(125, s)), s, p, o, m)
+# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p(126, s)), s, p, o, m)
+# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p(127, s)), s, p, o, m)
+# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p(128, s)), s, p, o, m)
+# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p(129, s)), s, p, o, m)
+# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p(130, s)), s, p, o, m)
+# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p(131, s)), s, p, o, m)
+# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p(132, s)), s, p, o, m)
+# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p(133, s)), s, p, o, m)
+# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p(134, s)), s, p, o, m)
+# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p(135, s)), s, p, o, m)
+# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p(136, s)), s, p, o, m)
+# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p(137, s)), s, p, o, m)
+# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p(138, s)), s, p, o, m)
+# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p(139, s)), s, p, o, m)
+# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p(140, s)), s, p, o, m)
+# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p(141, s)), s, p, o, m)
+# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p(142, s)), s, p, o, m)
+# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p(143, s)), s, p, o, m)
+# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p(144, s)), s, p, o, m)
+# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p(145, s)), s, p, o, m)
+# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p(146, s)), s, p, o, m)
+# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p(147, s)), s, p, o, m)
+# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p(148, s)), s, p, o, m)
+# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p(149, s)), s, p, o, m)
+# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p(150, s)), s, p, o, m)
+# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p(151, s)), s, p, o, m)
+# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p(152, s)), s, p, o, m)
+# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p(153, s)), s, p, o, m)
+# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p(154, s)), s, p, o, m)
+# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p(155, s)), s, p, o, m)
+# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p(156, s)), s, p, o, m)
+# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p(157, s)), s, p, o, m)
+# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p(158, s)), s, p, o, m)
+# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p(159, s)), s, p, o, m)
+# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p(160, s)), s, p, o, m)
+# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p(161, s)), s, p, o, m)
+# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p(162, s)), s, p, o, m)
+# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p(163, s)), s, p, o, m)
+# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p(164, s)), s, p, o, m)
+# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p(165, s)), s, p, o, m)
+# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p(166, s)), s, p, o, m)
+# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p(167, s)), s, p, o, m)
+# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p(168, s)), s, p, o, m)
+# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p(169, s)), s, p, o, m)
+# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p(170, s)), s, p, o, m)
+# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p(171, s)), s, p, o, m)
+# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p(172, s)), s, p, o, m)
+# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p(173, s)), s, p, o, m)
+# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p(174, s)), s, p, o, m)
+# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p(175, s)), s, p, o, m)
+# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p(176, s)), s, p, o, m)
+# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p(177, s)), s, p, o, m)
+# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p(178, s)), s, p, o, m)
+# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p(179, s)), s, p, o, m)
+# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p(180, s)), s, p, o, m)
+# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p(181, s)), s, p, o, m)
+# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p(182, s)), s, p, o, m)
+# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p(183, s)), s, p, o, m)
+# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p(184, s)), s, p, o, m)
+# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p(185, s)), s, p, o, m)
+# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p(186, s)), s, p, o, m)
+# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p(187, s)), s, p, o, m)
+# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p(188, s)), s, p, o, m)
+# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p(189, s)), s, p, o, m)
+# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p(190, s)), s, p, o, m)
+# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p(191, s)), s, p, o, m)
+# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p(192, s)), s, p, o, m)
+# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p(193, s)), s, p, o, m)
+# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p(194, s)), s, p, o, m)
+# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p(195, s)), s, p, o, m)
+# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p(196, s)), s, p, o, m)
+# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p(197, s)), s, p, o, m)
+# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p(198, s)), s, p, o, m)
+# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p(199, s)), s, p, o, m)
+# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p(200, s)), s, p, o, m)
+# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p(201, s)), s, p, o, m)
+# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p(202, s)), s, p, o, m)
+# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p(203, s)), s, p, o, m)
+# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p(204, s)), s, p, o, m)
+# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p(205, s)), s, p, o, m)
+# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p(206, s)), s, p, o, m)
+# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p(207, s)), s, p, o, m)
+# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p(208, s)), s, p, o, m)
+# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p(209, s)), s, p, o, m)
+# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p(210, s)), s, p, o, m)
+# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p(211, s)), s, p, o, m)
+# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p(212, s)), s, p, o, m)
+# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p(213, s)), s, p, o, m)
+# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p(214, s)), s, p, o, m)
+# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p(215, s)), s, p, o, m)
+# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p(216, s)), s, p, o, m)
+# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p(217, s)), s, p, o, m)
+# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p(218, s)), s, p, o, m)
+# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p(219, s)), s, p, o, m)
+# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p(220, s)), s, p, o, m)
+# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p(221, s)), s, p, o, m)
+# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p(222, s)), s, p, o, m)
+# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p(223, s)), s, p, o, m)
+# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p(224, s)), s, p, o, m)
+# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p(225, s)), s, p, o, m)
+# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p(226, s)), s, p, o, m)
+# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p(227, s)), s, p, o, m)
+# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p(228, s)), s, p, o, m)
+# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p(229, s)), s, p, o, m)
+# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p(230, s)), s, p, o, m)
+# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p(231, s)), s, p, o, m)
+# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p(232, s)), s, p, o, m)
+# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p(233, s)), s, p, o, m)
+# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p(234, s)), s, p, o, m)
+# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p(235, s)), s, p, o, m)
+# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p(236, s)), s, p, o, m)
+# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p(237, s)), s, p, o, m)
+# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p(238, s)), s, p, o, m)
+# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p(239, s)), s, p, o, m)
+# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p(240, s)), s, p, o, m)
+# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p(241, s)), s, p, o, m)
+# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p(242, s)), s, p, o, m)
+# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p(243, s)), s, p, o, m)
+# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p(244, s)), s, p, o, m)
+# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p(245, s)), s, p, o, m)
+# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p(246, s)), s, p, o, m)
+# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p(247, s)), s, p, o, m)
+# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p(248, s)), s, p, o, m)
+# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p(249, s)), s, p, o, m)
+# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p(250, s)), s, p, o, m)
+# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p(251, s)), s, p, o, m)
+# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p(252, s)), s, p, o, m)
+# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p(253, s)), s, p, o, m)
+# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p(254, s)), s, p, o, m)
+# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p(255, s)), s, p, o, m)
+# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p(256, s)), s, p, o, m)
+# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p(257, s)), s, p, o, m)
+#
+# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)
+# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)
+# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)
+# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)
+# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)
+# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)
+# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)
+# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)
+# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)
+# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)
+# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)
+# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)
+# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)
+# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)
+# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)
+# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)
+# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)
+# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)
+# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)
+# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)
+# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)
+# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)
+# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)
+# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)
+# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)
+# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)
+# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)
+# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)
+# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)
+# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)
+# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)
+# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)
+# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)
+# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)
+# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)
+# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)
+# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)
+# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)
+# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)
+# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)
+# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)
+# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)
+# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)
+# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)
+# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)
+# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)
+# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)
+# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)
+# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)
+# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)
+# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)
+# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)
+# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)
+# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)
+# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)
+# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)
+# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)
+# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)
+# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)
+# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)
+# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)
+# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)
+# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)
+# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)
+# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)
+# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)
+# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)
+# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)
+# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)
+# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)
+# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)
+# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)
+# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)
+# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)
+# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)
+# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)
+# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)
+# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)
+# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)
+# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)
+# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)
+# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)
+# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)
+# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)
+# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)
+# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)
+# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)
+# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)
+# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)
+# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)
+# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)
+# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)
+# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)
+# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)
+# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)
+# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)
+# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)
+# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)
+# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)
+# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)
+# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)
+# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)
+# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)
+# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)
+# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)
+# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)
+# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)
+# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)
+# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)
+# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)
+# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)
+# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)
+# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)
+# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)
+# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)
+# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)
+# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)
+# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)
+# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)
+# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)
+# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)
+# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)
+# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)
+# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)
+# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)
+# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)
+# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)
+# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)
+# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)
+# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)
+# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)
+# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)
+# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)
+# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)
+# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)
+# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)
+# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)
+# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)
+# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)
+# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)
+# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)
+# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)
+# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)
+# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)
+# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)
+# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)
+# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)
+# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)
+# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)
+# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)
+# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)
+# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)
+# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)
+# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)
+# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)
+# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)
+# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)
+# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)
+# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)
+# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)
+# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)
+# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)
+# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)
+# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)
+# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)
+# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)
+# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)
+# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)
+# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)
+# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)
+# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)
+# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)
+# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)
+# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)
+# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)
+# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)
+# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)
+# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)
+# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)
+# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)
+# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)
+# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)
+# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)
+# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)
+# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)
+# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)
+# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)
+# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)
+# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)
+# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)
+# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)
+# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)
+# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)
+# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)
+# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)
+# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)
+# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)
+# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)
+# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)
+# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)
+# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)
+# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)
+# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)
+# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)
+# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)
+# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)
+# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)
+# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)
+# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)
+# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)
+# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)
+# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)
+# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)
+# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)
+# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)
+# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)
+# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)
+# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)
+# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)
+# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)
+# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)
+# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)
+# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)
+# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)
+# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)
+# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)
+# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)
+# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)
+# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)
+# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)
+# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)
+# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)
+# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)
+# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)
+# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)
+# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)
+# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)
+# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)
+# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)
+# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)
+# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)
+# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)
+# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)
+# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)
+# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)
+# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)
+# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)
+# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)
+# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)
+# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)
+# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)
+# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)
+# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)
+# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)
+# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)
+# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/detail/msvc/for.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/msvc/for.hpp
new file mode 100644
index 0000000..35c1996
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/detail/msvc/for.hpp
@@ -0,0 +1,277 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP
+# define BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP
+#
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)
+# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)
+# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)
+# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)
+# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)
+# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)
+# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)
+# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)
+# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)
+# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)
+# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)
+# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)
+# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)
+# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)
+# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)
+# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)
+# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)
+# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)
+# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)
+# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)
+# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)
+# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)
+# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)
+# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)
+# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)
+# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)
+# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)
+# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)
+# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)
+# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)
+# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)
+# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)
+# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)
+# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)
+# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)
+# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)
+# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)
+# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)
+# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)
+# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)
+# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)
+# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)
+# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)
+# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)
+# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)
+# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)
+# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)
+# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)
+# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)
+# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)
+# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)
+# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)
+# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)
+# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)
+# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)
+# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)
+# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)
+# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)
+# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)
+# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)
+# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)
+# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)
+# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)
+# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)
+# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)
+# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)
+# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)
+# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)
+# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)
+# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)
+# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)
+# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)
+# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)
+# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)
+# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)
+# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)
+# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)
+# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)
+# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)
+# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)
+# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)
+# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)
+# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)
+# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)
+# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)
+# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)
+# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)
+# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)
+# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)
+# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)
+# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)
+# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)
+# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)
+# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)
+# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)
+# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)
+# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)
+# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)
+# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)
+# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)
+# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)
+# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)
+# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)
+# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)
+# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)
+# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)
+# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)
+# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)
+# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)
+# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)
+# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)
+# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)
+# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)
+# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)
+# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)
+# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)
+# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)
+# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)
+# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)
+# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)
+# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)
+# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)
+# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)
+# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)
+# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)
+# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)
+# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)
+# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)
+# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)
+# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)
+# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)
+# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)
+# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)
+# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)
+# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)
+# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)
+# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)
+# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)
+# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)
+# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)
+# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)
+# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)
+# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)
+# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)
+# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)
+# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)
+# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)
+# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)
+# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)
+# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)
+# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)
+# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)
+# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)
+# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)
+# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)
+# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)
+# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)
+# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)
+# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)
+# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)
+# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)
+# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)
+# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)
+# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)
+# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)
+# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)
+# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)
+# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)
+# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)
+# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)
+# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)
+# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)
+# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)
+# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)
+# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)
+# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)
+# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)
+# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)
+# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)
+# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)
+# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)
+# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)
+# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)
+# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)
+# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)
+# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)
+# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)
+# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)
+# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)
+# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)
+# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)
+# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)
+# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)
+# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)
+# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)
+# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)
+# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)
+# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)
+# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)
+# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)
+# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)
+# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)
+# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)
+# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)
+# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)
+# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)
+# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)
+# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)
+# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)
+# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)
+# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)
+# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)
+# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)
+# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)
+# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)
+# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)
+# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)
+# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)
+# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)
+# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)
+# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)
+# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)
+# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)
+# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)
+# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)
+# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)
+# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)
+# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)
+# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)
+# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)
+# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)
+# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)
+# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)
+# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)
+# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)
+# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)
+# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)
+# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)
+# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)
+# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)
+# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)
+# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)
+# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)
+# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)
+# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)
+# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)
+# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)
+# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)
+# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)
+# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)
+# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)
+# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)
+# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)
+# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)
+# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)
+# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum.hpp
new file mode 100644
index 0000000..0198cd9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum.hpp
@@ -0,0 +1,66 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM */
+#
+# if 0
+#    define BOOST_PP_ENUM(count, macro, data)
+# endif
+#
+# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))
+#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))
+#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))
+# else
+#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_ENUM_1_I(c, m, d)
+#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_ENUM_2_I(c, m, d)
+#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_ENUM_3_I(c, m, d)
+#    define BOOST_PP_ENUM_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))
+#    define BOOST_PP_ENUM_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))
+#    define BOOST_PP_ENUM_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))
+# endif
+#
+# define BOOST_PP_ENUM_4(c, m, d) BOOST_PP_ERROR(0x0003)
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_M_1_IM(z, n, im) BOOST_PP_ENUM_M_1_I(z, n, im)
+#    define BOOST_PP_ENUM_M_2_IM(z, n, im) BOOST_PP_ENUM_M_2_I(z, n, im)
+#    define BOOST_PP_ENUM_M_3_IM(z, n, im) BOOST_PP_ENUM_M_3_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+# endif
+#
+# define BOOST_PP_ENUM_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)
+# define BOOST_PP_ENUM_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)
+# define BOOST_PP_ENUM_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_binary_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_binary_params.hpp
new file mode 100644
index 0000000..a2c1048
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_binary_params.hpp
@@ -0,0 +1,54 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM_BINARY_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2)
+#    define BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2)
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2) BOOST_PP_COMMA_IF(n) p1 ## n p2 ## n
+# else
+#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(p1, n) BOOST_PP_CAT(p2, n)
+# endif
+#
+# /* BOOST_PP_ENUM_BINARY_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2)
+#    define BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params.hpp
new file mode 100644
index 0000000..65a2369
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params.hpp
@@ -0,0 +1,41 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# /* BOOST_PP_ENUM_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_ENUM_PARAMS_I(count, param)
+#    define BOOST_PP_ENUM_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)
+# endif
+#
+# define BOOST_PP_ENUM_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) param ## n
+#
+# /* BOOST_PP_ENUM_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_ENUM_PARAMS_Z_I(z, count, param)
+#    define BOOST_PP_ENUM_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_a_default.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_a_default.hpp
new file mode 100644
index 0000000..7496df6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_a_default.hpp
@@ -0,0 +1,25 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/intercept.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#
+# /* BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT */
+#
+# define BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(count, param, def) BOOST_PP_ENUM_BINARY_PARAMS(count, param, = def BOOST_PP_INTERCEPT)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_defaults.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_defaults.hpp
new file mode 100644
index 0000000..fa0106f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_params_with_defaults.hpp
@@ -0,0 +1,24 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_DEFAULTS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_DEFAULTS_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#
+# /* BOOST_PP_ENUM_PARAMS_WITH_DEFAULTS */
+#
+# define BOOST_PP_ENUM_PARAMS_WITH_DEFAULTS(count, param, def) BOOST_PP_ENUM_BINARY_PARAMS(count, param, = def)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted.hpp
new file mode 100644
index 0000000..d5b006f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted.hpp
@@ -0,0 +1,68 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM_SHIFTED */
+#
+# if 0
+#    define BOOST_PP_ENUM_SHIFTED(count, macro, data)
+# endif
+#
+# define BOOST_PP_ENUM_SHIFTED BOOST_PP_CAT(BOOST_PP_ENUM_SHIFTED_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))
+#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))
+#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))
+# else
+#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_ENUM_SHIFTED_1_I(c, m, d)
+#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_ENUM_SHIFTED_1_2(c, m, d)
+#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_ENUM_SHIFTED_1_3(c, m, d)
+#    define BOOST_PP_ENUM_SHIFTED_1_I(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))
+#    define BOOST_PP_ENUM_SHIFTED_2_I(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))
+#    define BOOST_PP_ENUM_SHIFTED_3_I(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))
+# endif
+#
+# define BOOST_PP_ENUM_SHIFTED_4(c, m, d) BOOST_PP_ERROR(0x0003)
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, im)
+#    define BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, im)
+#    define BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+# endif
+#
+# define BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)
+# define BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)
+# define BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_binary_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_binary_params.hpp
new file mode 100644
index 0000000..f3d20fc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_binary_params.hpp
@@ -0,0 +1,51 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2005.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_BINARY_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_BINARY_PARAMS_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_I(count, p1, p2)
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))
+# endif
+#
+# define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(p1, BOOST_PP_INC(n)) BOOST_PP_CAT(p2, BOOST_PP_INC(n))
+#
+# /* BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z_I(z, count, p1, p2)
+#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_params.hpp
new file mode 100644
index 0000000..88b2bf4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_shifted_params.hpp
@@ -0,0 +1,44 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# /* BOOST_PP_ENUM_SHIFTED_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param)
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)
+# endif
+#
+# define BOOST_PP_ENUM_SHIFTED_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(param, BOOST_PP_INC(n))
+#
+# /* BOOST_PP_ENUM_SHIFTED_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param)
+#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing.hpp
new file mode 100644
index 0000000..20af2d5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing.hpp
@@ -0,0 +1,63 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM_TRAILING */
+#
+# if 0
+#    define BOOST_PP_ENUM_TRAILING(count, macro, data)
+# endif
+#
+# define BOOST_PP_ENUM_TRAILING BOOST_PP_CAT(BOOST_PP_ENUM_TRAILING_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))
+#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))
+#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))
+# else
+#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_ENUM_TRAILING_1_I(c, m, d)
+#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_ENUM_TRAILING_2_I(c, m, d)
+#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_ENUM_TRAILING_3_I(c, m, d)
+#    define BOOST_PP_ENUM_TRAILING_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))
+#    define BOOST_PP_ENUM_TRAILING_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))
+#    define BOOST_PP_ENUM_TRAILING_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))
+# endif
+#
+# define BOOST_PP_ENUM_TRAILING_4(c, m, d) BOOST_PP_ERROR(0x0003)
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)
+#    define BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, im)
+#    define BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, im)
+#    define BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))
+# endif
+#
+# define BOOST_PP_ENUM_TRAILING_M_1_I(z, n, m, d) , m(z, n, d)
+# define BOOST_PP_ENUM_TRAILING_M_2_I(z, n, m, d) , m(z, n, d)
+# define BOOST_PP_ENUM_TRAILING_M_3_I(z, n, m, d) , m(z, n, d)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_binary_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_binary_params.hpp
new file mode 100644
index 0000000..e201b69
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_binary_params.hpp
@@ -0,0 +1,53 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_BINARY_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_BINARY_PARAMS_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_ENUM_TRAILING_BINARY_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_I(count, p1, p2)
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, im)
+# else
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_II(z, n, p1, p2)
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_II(z, n, p1, p2) , p1 ## n p2 ## n
+# else
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, p1, p2) , BOOST_PP_CAT(p1, n) BOOST_PP_CAT(p2, n)
+# endif
+#
+# /* BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))
+# else
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z_I(z, count, p1, p2)
+#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_params.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_params.hpp
new file mode 100644
index 0000000..f7520db
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/enum_trailing_params.hpp
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP
+# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+#
+# /* BOOST_PP_ENUM_TRAILING_PARAMS */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param)
+#    define BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
+# endif
+#
+# define BOOST_PP_ENUM_TRAILING_PARAMS_M(z, n, param) , param ## n
+#
+# /* BOOST_PP_ENUM_TRAILING_PARAMS_Z */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
+# else
+#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param)
+#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/for.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/for.hpp
new file mode 100644
index 0000000..5a63753
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/for.hpp
@@ -0,0 +1,306 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_FOR_HPP
+# define BOOST_PREPROCESSOR_REPETITION_FOR_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+#
+# /* BOOST_PP_FOR */
+#
+# if 0
+#    define BOOST_PP_FOR(state, pred, op, macro)
+# endif
+#
+# define BOOST_PP_FOR BOOST_PP_CAT(BOOST_PP_FOR_, BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256))
+#
+# define BOOST_PP_FOR_P(n) BOOST_PP_CAT(BOOST_PP_FOR_CHECK_, BOOST_PP_FOR_ ## n(1, BOOST_PP_FOR_SR_P, BOOST_PP_FOR_SR_O, BOOST_PP_FOR_SR_M))
+#
+# define BOOST_PP_FOR_SR_P(r, s) s
+# define BOOST_PP_FOR_SR_O(r, s) 0
+# define BOOST_PP_FOR_SR_M(r, s) BOOST_PP_NIL
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    include <boost/preprocessor/repetition/detail/edg/for.hpp>
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    include <boost/preprocessor/repetition/detail/msvc/for.hpp>
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    include <boost/preprocessor/repetition/detail/dmc/for.hpp>
+# else
+#    include <boost/preprocessor/repetition/detail/for.hpp>
+# endif
+#
+# define BOOST_PP_FOR_257(s, p, o, m) BOOST_PP_ERROR(0x0002)
+#
+# define BOOST_PP_FOR_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_1(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_2(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_3(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_4(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_5(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_6(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_7(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_8(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_9(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_10(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_11(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_12(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_13(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_14(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_15(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_16(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_17(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_18(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_19(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_20(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_21(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_22(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_23(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_24(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_25(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_26(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_27(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_28(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_29(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_30(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_31(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_32(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_33(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_34(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_35(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_36(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_37(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_38(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_39(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_40(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_41(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_42(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_43(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_44(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_45(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_46(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_47(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_48(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_49(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_50(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_51(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_52(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_53(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_54(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_55(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_56(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_57(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_58(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_59(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_60(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_61(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_62(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_63(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_64(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_65(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_66(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_67(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_68(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_69(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_70(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_71(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_72(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_73(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_74(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_75(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_76(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_77(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_78(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_79(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_80(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_81(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_82(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_83(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_84(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_85(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_86(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_87(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_88(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_89(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_90(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_91(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_92(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_93(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_94(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_95(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_96(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_97(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_98(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_99(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_100(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_101(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_102(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_103(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_104(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_105(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_106(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_107(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_108(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_109(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_110(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_111(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_112(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_113(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_114(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_115(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_116(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_117(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_118(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_119(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_120(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_121(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_122(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_123(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_124(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_125(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_126(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_127(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_128(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_129(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_130(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_131(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_132(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_133(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_134(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_135(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_136(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_137(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_138(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_139(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_140(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_141(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_142(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_143(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_144(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_145(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_146(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_147(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_148(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_149(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_150(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_151(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_152(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_153(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_154(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_155(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_156(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_157(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_158(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_159(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_160(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_161(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_162(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_163(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_164(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_165(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_166(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_167(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_168(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_169(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_170(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_171(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_172(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_173(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_174(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_175(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_176(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_177(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_178(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_179(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_180(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_181(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_182(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_183(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_184(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_185(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_186(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_187(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_188(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_189(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_190(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_191(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_192(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_193(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_194(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_195(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_196(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_197(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_198(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_199(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_200(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_201(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_202(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_203(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_204(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_205(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_206(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_207(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_208(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_209(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_210(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_211(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_212(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_213(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_214(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_215(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_216(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_217(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_218(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_219(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_220(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_221(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_222(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_223(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_224(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_225(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_226(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_227(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_228(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_229(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_230(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_231(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_232(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_233(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_234(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_235(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_236(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_237(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_238(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_239(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_240(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_241(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_242(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_243(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_244(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_245(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_246(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_247(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_248(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_249(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_250(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_251(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_252(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_253(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_254(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_255(s, p, o, m) 0
+# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_256(s, p, o, m) 0
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/repeat.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/repeat.hpp
new file mode 100644
index 0000000..0172738
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/repeat.hpp
@@ -0,0 +1,825 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP
+# define BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# /* BOOST_PP_REPEAT */
+#
+# if 0
+#    define BOOST_PP_REPEAT(count, macro, data)
+# endif
+#
+# define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))
+#
+# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1
+# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0
+# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0
+# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0
+#
+# define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)
+# define BOOST_PP_REPEAT_2(c, m, d) BOOST_PP_REPEAT_2_I(c, m, d)
+# define BOOST_PP_REPEAT_3(c, m, d) BOOST_PP_REPEAT_3_I(c, m, d)
+# define BOOST_PP_REPEAT_4(c, m, d) BOOST_PP_ERROR(0x0003)
+#
+# define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)
+# define BOOST_PP_REPEAT_2_I(c, m, d) BOOST_PP_REPEAT_2_ ## c(m, d)
+# define BOOST_PP_REPEAT_3_I(c, m, d) BOOST_PP_REPEAT_3_ ## c(m, d)
+#
+# define BOOST_PP_REPEAT_1ST BOOST_PP_REPEAT_1
+# define BOOST_PP_REPEAT_2ND BOOST_PP_REPEAT_2
+# define BOOST_PP_REPEAT_3RD BOOST_PP_REPEAT_3
+#
+# define BOOST_PP_REPEAT_1_0(m, d)
+# define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)
+# define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)
+# define BOOST_PP_REPEAT_1_3(m, d) BOOST_PP_REPEAT_1_2(m, d) m(2, 2, d)
+# define BOOST_PP_REPEAT_1_4(m, d) BOOST_PP_REPEAT_1_3(m, d) m(2, 3, d)
+# define BOOST_PP_REPEAT_1_5(m, d) BOOST_PP_REPEAT_1_4(m, d) m(2, 4, d)
+# define BOOST_PP_REPEAT_1_6(m, d) BOOST_PP_REPEAT_1_5(m, d) m(2, 5, d)
+# define BOOST_PP_REPEAT_1_7(m, d) BOOST_PP_REPEAT_1_6(m, d) m(2, 6, d)
+# define BOOST_PP_REPEAT_1_8(m, d) BOOST_PP_REPEAT_1_7(m, d) m(2, 7, d)
+# define BOOST_PP_REPEAT_1_9(m, d) BOOST_PP_REPEAT_1_8(m, d) m(2, 8, d)
+# define BOOST_PP_REPEAT_1_10(m, d) BOOST_PP_REPEAT_1_9(m, d) m(2, 9, d)
+# define BOOST_PP_REPEAT_1_11(m, d) BOOST_PP_REPEAT_1_10(m, d) m(2, 10, d)
+# define BOOST_PP_REPEAT_1_12(m, d) BOOST_PP_REPEAT_1_11(m, d) m(2, 11, d)
+# define BOOST_PP_REPEAT_1_13(m, d) BOOST_PP_REPEAT_1_12(m, d) m(2, 12, d)
+# define BOOST_PP_REPEAT_1_14(m, d) BOOST_PP_REPEAT_1_13(m, d) m(2, 13, d)
+# define BOOST_PP_REPEAT_1_15(m, d) BOOST_PP_REPEAT_1_14(m, d) m(2, 14, d)
+# define BOOST_PP_REPEAT_1_16(m, d) BOOST_PP_REPEAT_1_15(m, d) m(2, 15, d)
+# define BOOST_PP_REPEAT_1_17(m, d) BOOST_PP_REPEAT_1_16(m, d) m(2, 16, d)
+# define BOOST_PP_REPEAT_1_18(m, d) BOOST_PP_REPEAT_1_17(m, d) m(2, 17, d)
+# define BOOST_PP_REPEAT_1_19(m, d) BOOST_PP_REPEAT_1_18(m, d) m(2, 18, d)
+# define BOOST_PP_REPEAT_1_20(m, d) BOOST_PP_REPEAT_1_19(m, d) m(2, 19, d)
+# define BOOST_PP_REPEAT_1_21(m, d) BOOST_PP_REPEAT_1_20(m, d) m(2, 20, d)
+# define BOOST_PP_REPEAT_1_22(m, d) BOOST_PP_REPEAT_1_21(m, d) m(2, 21, d)
+# define BOOST_PP_REPEAT_1_23(m, d) BOOST_PP_REPEAT_1_22(m, d) m(2, 22, d)
+# define BOOST_PP_REPEAT_1_24(m, d) BOOST_PP_REPEAT_1_23(m, d) m(2, 23, d)
+# define BOOST_PP_REPEAT_1_25(m, d) BOOST_PP_REPEAT_1_24(m, d) m(2, 24, d)
+# define BOOST_PP_REPEAT_1_26(m, d) BOOST_PP_REPEAT_1_25(m, d) m(2, 25, d)
+# define BOOST_PP_REPEAT_1_27(m, d) BOOST_PP_REPEAT_1_26(m, d) m(2, 26, d)
+# define BOOST_PP_REPEAT_1_28(m, d) BOOST_PP_REPEAT_1_27(m, d) m(2, 27, d)
+# define BOOST_PP_REPEAT_1_29(m, d) BOOST_PP_REPEAT_1_28(m, d) m(2, 28, d)
+# define BOOST_PP_REPEAT_1_30(m, d) BOOST_PP_REPEAT_1_29(m, d) m(2, 29, d)
+# define BOOST_PP_REPEAT_1_31(m, d) BOOST_PP_REPEAT_1_30(m, d) m(2, 30, d)
+# define BOOST_PP_REPEAT_1_32(m, d) BOOST_PP_REPEAT_1_31(m, d) m(2, 31, d)
+# define BOOST_PP_REPEAT_1_33(m, d) BOOST_PP_REPEAT_1_32(m, d) m(2, 32, d)
+# define BOOST_PP_REPEAT_1_34(m, d) BOOST_PP_REPEAT_1_33(m, d) m(2, 33, d)
+# define BOOST_PP_REPEAT_1_35(m, d) BOOST_PP_REPEAT_1_34(m, d) m(2, 34, d)
+# define BOOST_PP_REPEAT_1_36(m, d) BOOST_PP_REPEAT_1_35(m, d) m(2, 35, d)
+# define BOOST_PP_REPEAT_1_37(m, d) BOOST_PP_REPEAT_1_36(m, d) m(2, 36, d)
+# define BOOST_PP_REPEAT_1_38(m, d) BOOST_PP_REPEAT_1_37(m, d) m(2, 37, d)
+# define BOOST_PP_REPEAT_1_39(m, d) BOOST_PP_REPEAT_1_38(m, d) m(2, 38, d)
+# define BOOST_PP_REPEAT_1_40(m, d) BOOST_PP_REPEAT_1_39(m, d) m(2, 39, d)
+# define BOOST_PP_REPEAT_1_41(m, d) BOOST_PP_REPEAT_1_40(m, d) m(2, 40, d)
+# define BOOST_PP_REPEAT_1_42(m, d) BOOST_PP_REPEAT_1_41(m, d) m(2, 41, d)
+# define BOOST_PP_REPEAT_1_43(m, d) BOOST_PP_REPEAT_1_42(m, d) m(2, 42, d)
+# define BOOST_PP_REPEAT_1_44(m, d) BOOST_PP_REPEAT_1_43(m, d) m(2, 43, d)
+# define BOOST_PP_REPEAT_1_45(m, d) BOOST_PP_REPEAT_1_44(m, d) m(2, 44, d)
+# define BOOST_PP_REPEAT_1_46(m, d) BOOST_PP_REPEAT_1_45(m, d) m(2, 45, d)
+# define BOOST_PP_REPEAT_1_47(m, d) BOOST_PP_REPEAT_1_46(m, d) m(2, 46, d)
+# define BOOST_PP_REPEAT_1_48(m, d) BOOST_PP_REPEAT_1_47(m, d) m(2, 47, d)
+# define BOOST_PP_REPEAT_1_49(m, d) BOOST_PP_REPEAT_1_48(m, d) m(2, 48, d)
+# define BOOST_PP_REPEAT_1_50(m, d) BOOST_PP_REPEAT_1_49(m, d) m(2, 49, d)
+# define BOOST_PP_REPEAT_1_51(m, d) BOOST_PP_REPEAT_1_50(m, d) m(2, 50, d)
+# define BOOST_PP_REPEAT_1_52(m, d) BOOST_PP_REPEAT_1_51(m, d) m(2, 51, d)
+# define BOOST_PP_REPEAT_1_53(m, d) BOOST_PP_REPEAT_1_52(m, d) m(2, 52, d)
+# define BOOST_PP_REPEAT_1_54(m, d) BOOST_PP_REPEAT_1_53(m, d) m(2, 53, d)
+# define BOOST_PP_REPEAT_1_55(m, d) BOOST_PP_REPEAT_1_54(m, d) m(2, 54, d)
+# define BOOST_PP_REPEAT_1_56(m, d) BOOST_PP_REPEAT_1_55(m, d) m(2, 55, d)
+# define BOOST_PP_REPEAT_1_57(m, d) BOOST_PP_REPEAT_1_56(m, d) m(2, 56, d)
+# define BOOST_PP_REPEAT_1_58(m, d) BOOST_PP_REPEAT_1_57(m, d) m(2, 57, d)
+# define BOOST_PP_REPEAT_1_59(m, d) BOOST_PP_REPEAT_1_58(m, d) m(2, 58, d)
+# define BOOST_PP_REPEAT_1_60(m, d) BOOST_PP_REPEAT_1_59(m, d) m(2, 59, d)
+# define BOOST_PP_REPEAT_1_61(m, d) BOOST_PP_REPEAT_1_60(m, d) m(2, 60, d)
+# define BOOST_PP_REPEAT_1_62(m, d) BOOST_PP_REPEAT_1_61(m, d) m(2, 61, d)
+# define BOOST_PP_REPEAT_1_63(m, d) BOOST_PP_REPEAT_1_62(m, d) m(2, 62, d)
+# define BOOST_PP_REPEAT_1_64(m, d) BOOST_PP_REPEAT_1_63(m, d) m(2, 63, d)
+# define BOOST_PP_REPEAT_1_65(m, d) BOOST_PP_REPEAT_1_64(m, d) m(2, 64, d)
+# define BOOST_PP_REPEAT_1_66(m, d) BOOST_PP_REPEAT_1_65(m, d) m(2, 65, d)
+# define BOOST_PP_REPEAT_1_67(m, d) BOOST_PP_REPEAT_1_66(m, d) m(2, 66, d)
+# define BOOST_PP_REPEAT_1_68(m, d) BOOST_PP_REPEAT_1_67(m, d) m(2, 67, d)
+# define BOOST_PP_REPEAT_1_69(m, d) BOOST_PP_REPEAT_1_68(m, d) m(2, 68, d)
+# define BOOST_PP_REPEAT_1_70(m, d) BOOST_PP_REPEAT_1_69(m, d) m(2, 69, d)
+# define BOOST_PP_REPEAT_1_71(m, d) BOOST_PP_REPEAT_1_70(m, d) m(2, 70, d)
+# define BOOST_PP_REPEAT_1_72(m, d) BOOST_PP_REPEAT_1_71(m, d) m(2, 71, d)
+# define BOOST_PP_REPEAT_1_73(m, d) BOOST_PP_REPEAT_1_72(m, d) m(2, 72, d)
+# define BOOST_PP_REPEAT_1_74(m, d) BOOST_PP_REPEAT_1_73(m, d) m(2, 73, d)
+# define BOOST_PP_REPEAT_1_75(m, d) BOOST_PP_REPEAT_1_74(m, d) m(2, 74, d)
+# define BOOST_PP_REPEAT_1_76(m, d) BOOST_PP_REPEAT_1_75(m, d) m(2, 75, d)
+# define BOOST_PP_REPEAT_1_77(m, d) BOOST_PP_REPEAT_1_76(m, d) m(2, 76, d)
+# define BOOST_PP_REPEAT_1_78(m, d) BOOST_PP_REPEAT_1_77(m, d) m(2, 77, d)
+# define BOOST_PP_REPEAT_1_79(m, d) BOOST_PP_REPEAT_1_78(m, d) m(2, 78, d)
+# define BOOST_PP_REPEAT_1_80(m, d) BOOST_PP_REPEAT_1_79(m, d) m(2, 79, d)
+# define BOOST_PP_REPEAT_1_81(m, d) BOOST_PP_REPEAT_1_80(m, d) m(2, 80, d)
+# define BOOST_PP_REPEAT_1_82(m, d) BOOST_PP_REPEAT_1_81(m, d) m(2, 81, d)
+# define BOOST_PP_REPEAT_1_83(m, d) BOOST_PP_REPEAT_1_82(m, d) m(2, 82, d)
+# define BOOST_PP_REPEAT_1_84(m, d) BOOST_PP_REPEAT_1_83(m, d) m(2, 83, d)
+# define BOOST_PP_REPEAT_1_85(m, d) BOOST_PP_REPEAT_1_84(m, d) m(2, 84, d)
+# define BOOST_PP_REPEAT_1_86(m, d) BOOST_PP_REPEAT_1_85(m, d) m(2, 85, d)
+# define BOOST_PP_REPEAT_1_87(m, d) BOOST_PP_REPEAT_1_86(m, d) m(2, 86, d)
+# define BOOST_PP_REPEAT_1_88(m, d) BOOST_PP_REPEAT_1_87(m, d) m(2, 87, d)
+# define BOOST_PP_REPEAT_1_89(m, d) BOOST_PP_REPEAT_1_88(m, d) m(2, 88, d)
+# define BOOST_PP_REPEAT_1_90(m, d) BOOST_PP_REPEAT_1_89(m, d) m(2, 89, d)
+# define BOOST_PP_REPEAT_1_91(m, d) BOOST_PP_REPEAT_1_90(m, d) m(2, 90, d)
+# define BOOST_PP_REPEAT_1_92(m, d) BOOST_PP_REPEAT_1_91(m, d) m(2, 91, d)
+# define BOOST_PP_REPEAT_1_93(m, d) BOOST_PP_REPEAT_1_92(m, d) m(2, 92, d)
+# define BOOST_PP_REPEAT_1_94(m, d) BOOST_PP_REPEAT_1_93(m, d) m(2, 93, d)
+# define BOOST_PP_REPEAT_1_95(m, d) BOOST_PP_REPEAT_1_94(m, d) m(2, 94, d)
+# define BOOST_PP_REPEAT_1_96(m, d) BOOST_PP_REPEAT_1_95(m, d) m(2, 95, d)
+# define BOOST_PP_REPEAT_1_97(m, d) BOOST_PP_REPEAT_1_96(m, d) m(2, 96, d)
+# define BOOST_PP_REPEAT_1_98(m, d) BOOST_PP_REPEAT_1_97(m, d) m(2, 97, d)
+# define BOOST_PP_REPEAT_1_99(m, d) BOOST_PP_REPEAT_1_98(m, d) m(2, 98, d)
+# define BOOST_PP_REPEAT_1_100(m, d) BOOST_PP_REPEAT_1_99(m, d) m(2, 99, d)
+# define BOOST_PP_REPEAT_1_101(m, d) BOOST_PP_REPEAT_1_100(m, d) m(2, 100, d)
+# define BOOST_PP_REPEAT_1_102(m, d) BOOST_PP_REPEAT_1_101(m, d) m(2, 101, d)
+# define BOOST_PP_REPEAT_1_103(m, d) BOOST_PP_REPEAT_1_102(m, d) m(2, 102, d)
+# define BOOST_PP_REPEAT_1_104(m, d) BOOST_PP_REPEAT_1_103(m, d) m(2, 103, d)
+# define BOOST_PP_REPEAT_1_105(m, d) BOOST_PP_REPEAT_1_104(m, d) m(2, 104, d)
+# define BOOST_PP_REPEAT_1_106(m, d) BOOST_PP_REPEAT_1_105(m, d) m(2, 105, d)
+# define BOOST_PP_REPEAT_1_107(m, d) BOOST_PP_REPEAT_1_106(m, d) m(2, 106, d)
+# define BOOST_PP_REPEAT_1_108(m, d) BOOST_PP_REPEAT_1_107(m, d) m(2, 107, d)
+# define BOOST_PP_REPEAT_1_109(m, d) BOOST_PP_REPEAT_1_108(m, d) m(2, 108, d)
+# define BOOST_PP_REPEAT_1_110(m, d) BOOST_PP_REPEAT_1_109(m, d) m(2, 109, d)
+# define BOOST_PP_REPEAT_1_111(m, d) BOOST_PP_REPEAT_1_110(m, d) m(2, 110, d)
+# define BOOST_PP_REPEAT_1_112(m, d) BOOST_PP_REPEAT_1_111(m, d) m(2, 111, d)
+# define BOOST_PP_REPEAT_1_113(m, d) BOOST_PP_REPEAT_1_112(m, d) m(2, 112, d)
+# define BOOST_PP_REPEAT_1_114(m, d) BOOST_PP_REPEAT_1_113(m, d) m(2, 113, d)
+# define BOOST_PP_REPEAT_1_115(m, d) BOOST_PP_REPEAT_1_114(m, d) m(2, 114, d)
+# define BOOST_PP_REPEAT_1_116(m, d) BOOST_PP_REPEAT_1_115(m, d) m(2, 115, d)
+# define BOOST_PP_REPEAT_1_117(m, d) BOOST_PP_REPEAT_1_116(m, d) m(2, 116, d)
+# define BOOST_PP_REPEAT_1_118(m, d) BOOST_PP_REPEAT_1_117(m, d) m(2, 117, d)
+# define BOOST_PP_REPEAT_1_119(m, d) BOOST_PP_REPEAT_1_118(m, d) m(2, 118, d)
+# define BOOST_PP_REPEAT_1_120(m, d) BOOST_PP_REPEAT_1_119(m, d) m(2, 119, d)
+# define BOOST_PP_REPEAT_1_121(m, d) BOOST_PP_REPEAT_1_120(m, d) m(2, 120, d)
+# define BOOST_PP_REPEAT_1_122(m, d) BOOST_PP_REPEAT_1_121(m, d) m(2, 121, d)
+# define BOOST_PP_REPEAT_1_123(m, d) BOOST_PP_REPEAT_1_122(m, d) m(2, 122, d)
+# define BOOST_PP_REPEAT_1_124(m, d) BOOST_PP_REPEAT_1_123(m, d) m(2, 123, d)
+# define BOOST_PP_REPEAT_1_125(m, d) BOOST_PP_REPEAT_1_124(m, d) m(2, 124, d)
+# define BOOST_PP_REPEAT_1_126(m, d) BOOST_PP_REPEAT_1_125(m, d) m(2, 125, d)
+# define BOOST_PP_REPEAT_1_127(m, d) BOOST_PP_REPEAT_1_126(m, d) m(2, 126, d)
+# define BOOST_PP_REPEAT_1_128(m, d) BOOST_PP_REPEAT_1_127(m, d) m(2, 127, d)
+# define BOOST_PP_REPEAT_1_129(m, d) BOOST_PP_REPEAT_1_128(m, d) m(2, 128, d)
+# define BOOST_PP_REPEAT_1_130(m, d) BOOST_PP_REPEAT_1_129(m, d) m(2, 129, d)
+# define BOOST_PP_REPEAT_1_131(m, d) BOOST_PP_REPEAT_1_130(m, d) m(2, 130, d)
+# define BOOST_PP_REPEAT_1_132(m, d) BOOST_PP_REPEAT_1_131(m, d) m(2, 131, d)
+# define BOOST_PP_REPEAT_1_133(m, d) BOOST_PP_REPEAT_1_132(m, d) m(2, 132, d)
+# define BOOST_PP_REPEAT_1_134(m, d) BOOST_PP_REPEAT_1_133(m, d) m(2, 133, d)
+# define BOOST_PP_REPEAT_1_135(m, d) BOOST_PP_REPEAT_1_134(m, d) m(2, 134, d)
+# define BOOST_PP_REPEAT_1_136(m, d) BOOST_PP_REPEAT_1_135(m, d) m(2, 135, d)
+# define BOOST_PP_REPEAT_1_137(m, d) BOOST_PP_REPEAT_1_136(m, d) m(2, 136, d)
+# define BOOST_PP_REPEAT_1_138(m, d) BOOST_PP_REPEAT_1_137(m, d) m(2, 137, d)
+# define BOOST_PP_REPEAT_1_139(m, d) BOOST_PP_REPEAT_1_138(m, d) m(2, 138, d)
+# define BOOST_PP_REPEAT_1_140(m, d) BOOST_PP_REPEAT_1_139(m, d) m(2, 139, d)
+# define BOOST_PP_REPEAT_1_141(m, d) BOOST_PP_REPEAT_1_140(m, d) m(2, 140, d)
+# define BOOST_PP_REPEAT_1_142(m, d) BOOST_PP_REPEAT_1_141(m, d) m(2, 141, d)
+# define BOOST_PP_REPEAT_1_143(m, d) BOOST_PP_REPEAT_1_142(m, d) m(2, 142, d)
+# define BOOST_PP_REPEAT_1_144(m, d) BOOST_PP_REPEAT_1_143(m, d) m(2, 143, d)
+# define BOOST_PP_REPEAT_1_145(m, d) BOOST_PP_REPEAT_1_144(m, d) m(2, 144, d)
+# define BOOST_PP_REPEAT_1_146(m, d) BOOST_PP_REPEAT_1_145(m, d) m(2, 145, d)
+# define BOOST_PP_REPEAT_1_147(m, d) BOOST_PP_REPEAT_1_146(m, d) m(2, 146, d)
+# define BOOST_PP_REPEAT_1_148(m, d) BOOST_PP_REPEAT_1_147(m, d) m(2, 147, d)
+# define BOOST_PP_REPEAT_1_149(m, d) BOOST_PP_REPEAT_1_148(m, d) m(2, 148, d)
+# define BOOST_PP_REPEAT_1_150(m, d) BOOST_PP_REPEAT_1_149(m, d) m(2, 149, d)
+# define BOOST_PP_REPEAT_1_151(m, d) BOOST_PP_REPEAT_1_150(m, d) m(2, 150, d)
+# define BOOST_PP_REPEAT_1_152(m, d) BOOST_PP_REPEAT_1_151(m, d) m(2, 151, d)
+# define BOOST_PP_REPEAT_1_153(m, d) BOOST_PP_REPEAT_1_152(m, d) m(2, 152, d)
+# define BOOST_PP_REPEAT_1_154(m, d) BOOST_PP_REPEAT_1_153(m, d) m(2, 153, d)
+# define BOOST_PP_REPEAT_1_155(m, d) BOOST_PP_REPEAT_1_154(m, d) m(2, 154, d)
+# define BOOST_PP_REPEAT_1_156(m, d) BOOST_PP_REPEAT_1_155(m, d) m(2, 155, d)
+# define BOOST_PP_REPEAT_1_157(m, d) BOOST_PP_REPEAT_1_156(m, d) m(2, 156, d)
+# define BOOST_PP_REPEAT_1_158(m, d) BOOST_PP_REPEAT_1_157(m, d) m(2, 157, d)
+# define BOOST_PP_REPEAT_1_159(m, d) BOOST_PP_REPEAT_1_158(m, d) m(2, 158, d)
+# define BOOST_PP_REPEAT_1_160(m, d) BOOST_PP_REPEAT_1_159(m, d) m(2, 159, d)
+# define BOOST_PP_REPEAT_1_161(m, d) BOOST_PP_REPEAT_1_160(m, d) m(2, 160, d)
+# define BOOST_PP_REPEAT_1_162(m, d) BOOST_PP_REPEAT_1_161(m, d) m(2, 161, d)
+# define BOOST_PP_REPEAT_1_163(m, d) BOOST_PP_REPEAT_1_162(m, d) m(2, 162, d)
+# define BOOST_PP_REPEAT_1_164(m, d) BOOST_PP_REPEAT_1_163(m, d) m(2, 163, d)
+# define BOOST_PP_REPEAT_1_165(m, d) BOOST_PP_REPEAT_1_164(m, d) m(2, 164, d)
+# define BOOST_PP_REPEAT_1_166(m, d) BOOST_PP_REPEAT_1_165(m, d) m(2, 165, d)
+# define BOOST_PP_REPEAT_1_167(m, d) BOOST_PP_REPEAT_1_166(m, d) m(2, 166, d)
+# define BOOST_PP_REPEAT_1_168(m, d) BOOST_PP_REPEAT_1_167(m, d) m(2, 167, d)
+# define BOOST_PP_REPEAT_1_169(m, d) BOOST_PP_REPEAT_1_168(m, d) m(2, 168, d)
+# define BOOST_PP_REPEAT_1_170(m, d) BOOST_PP_REPEAT_1_169(m, d) m(2, 169, d)
+# define BOOST_PP_REPEAT_1_171(m, d) BOOST_PP_REPEAT_1_170(m, d) m(2, 170, d)
+# define BOOST_PP_REPEAT_1_172(m, d) BOOST_PP_REPEAT_1_171(m, d) m(2, 171, d)
+# define BOOST_PP_REPEAT_1_173(m, d) BOOST_PP_REPEAT_1_172(m, d) m(2, 172, d)
+# define BOOST_PP_REPEAT_1_174(m, d) BOOST_PP_REPEAT_1_173(m, d) m(2, 173, d)
+# define BOOST_PP_REPEAT_1_175(m, d) BOOST_PP_REPEAT_1_174(m, d) m(2, 174, d)
+# define BOOST_PP_REPEAT_1_176(m, d) BOOST_PP_REPEAT_1_175(m, d) m(2, 175, d)
+# define BOOST_PP_REPEAT_1_177(m, d) BOOST_PP_REPEAT_1_176(m, d) m(2, 176, d)
+# define BOOST_PP_REPEAT_1_178(m, d) BOOST_PP_REPEAT_1_177(m, d) m(2, 177, d)
+# define BOOST_PP_REPEAT_1_179(m, d) BOOST_PP_REPEAT_1_178(m, d) m(2, 178, d)
+# define BOOST_PP_REPEAT_1_180(m, d) BOOST_PP_REPEAT_1_179(m, d) m(2, 179, d)
+# define BOOST_PP_REPEAT_1_181(m, d) BOOST_PP_REPEAT_1_180(m, d) m(2, 180, d)
+# define BOOST_PP_REPEAT_1_182(m, d) BOOST_PP_REPEAT_1_181(m, d) m(2, 181, d)
+# define BOOST_PP_REPEAT_1_183(m, d) BOOST_PP_REPEAT_1_182(m, d) m(2, 182, d)
+# define BOOST_PP_REPEAT_1_184(m, d) BOOST_PP_REPEAT_1_183(m, d) m(2, 183, d)
+# define BOOST_PP_REPEAT_1_185(m, d) BOOST_PP_REPEAT_1_184(m, d) m(2, 184, d)
+# define BOOST_PP_REPEAT_1_186(m, d) BOOST_PP_REPEAT_1_185(m, d) m(2, 185, d)
+# define BOOST_PP_REPEAT_1_187(m, d) BOOST_PP_REPEAT_1_186(m, d) m(2, 186, d)
+# define BOOST_PP_REPEAT_1_188(m, d) BOOST_PP_REPEAT_1_187(m, d) m(2, 187, d)
+# define BOOST_PP_REPEAT_1_189(m, d) BOOST_PP_REPEAT_1_188(m, d) m(2, 188, d)
+# define BOOST_PP_REPEAT_1_190(m, d) BOOST_PP_REPEAT_1_189(m, d) m(2, 189, d)
+# define BOOST_PP_REPEAT_1_191(m, d) BOOST_PP_REPEAT_1_190(m, d) m(2, 190, d)
+# define BOOST_PP_REPEAT_1_192(m, d) BOOST_PP_REPEAT_1_191(m, d) m(2, 191, d)
+# define BOOST_PP_REPEAT_1_193(m, d) BOOST_PP_REPEAT_1_192(m, d) m(2, 192, d)
+# define BOOST_PP_REPEAT_1_194(m, d) BOOST_PP_REPEAT_1_193(m, d) m(2, 193, d)
+# define BOOST_PP_REPEAT_1_195(m, d) BOOST_PP_REPEAT_1_194(m, d) m(2, 194, d)
+# define BOOST_PP_REPEAT_1_196(m, d) BOOST_PP_REPEAT_1_195(m, d) m(2, 195, d)
+# define BOOST_PP_REPEAT_1_197(m, d) BOOST_PP_REPEAT_1_196(m, d) m(2, 196, d)
+# define BOOST_PP_REPEAT_1_198(m, d) BOOST_PP_REPEAT_1_197(m, d) m(2, 197, d)
+# define BOOST_PP_REPEAT_1_199(m, d) BOOST_PP_REPEAT_1_198(m, d) m(2, 198, d)
+# define BOOST_PP_REPEAT_1_200(m, d) BOOST_PP_REPEAT_1_199(m, d) m(2, 199, d)
+# define BOOST_PP_REPEAT_1_201(m, d) BOOST_PP_REPEAT_1_200(m, d) m(2, 200, d)
+# define BOOST_PP_REPEAT_1_202(m, d) BOOST_PP_REPEAT_1_201(m, d) m(2, 201, d)
+# define BOOST_PP_REPEAT_1_203(m, d) BOOST_PP_REPEAT_1_202(m, d) m(2, 202, d)
+# define BOOST_PP_REPEAT_1_204(m, d) BOOST_PP_REPEAT_1_203(m, d) m(2, 203, d)
+# define BOOST_PP_REPEAT_1_205(m, d) BOOST_PP_REPEAT_1_204(m, d) m(2, 204, d)
+# define BOOST_PP_REPEAT_1_206(m, d) BOOST_PP_REPEAT_1_205(m, d) m(2, 205, d)
+# define BOOST_PP_REPEAT_1_207(m, d) BOOST_PP_REPEAT_1_206(m, d) m(2, 206, d)
+# define BOOST_PP_REPEAT_1_208(m, d) BOOST_PP_REPEAT_1_207(m, d) m(2, 207, d)
+# define BOOST_PP_REPEAT_1_209(m, d) BOOST_PP_REPEAT_1_208(m, d) m(2, 208, d)
+# define BOOST_PP_REPEAT_1_210(m, d) BOOST_PP_REPEAT_1_209(m, d) m(2, 209, d)
+# define BOOST_PP_REPEAT_1_211(m, d) BOOST_PP_REPEAT_1_210(m, d) m(2, 210, d)
+# define BOOST_PP_REPEAT_1_212(m, d) BOOST_PP_REPEAT_1_211(m, d) m(2, 211, d)
+# define BOOST_PP_REPEAT_1_213(m, d) BOOST_PP_REPEAT_1_212(m, d) m(2, 212, d)
+# define BOOST_PP_REPEAT_1_214(m, d) BOOST_PP_REPEAT_1_213(m, d) m(2, 213, d)
+# define BOOST_PP_REPEAT_1_215(m, d) BOOST_PP_REPEAT_1_214(m, d) m(2, 214, d)
+# define BOOST_PP_REPEAT_1_216(m, d) BOOST_PP_REPEAT_1_215(m, d) m(2, 215, d)
+# define BOOST_PP_REPEAT_1_217(m, d) BOOST_PP_REPEAT_1_216(m, d) m(2, 216, d)
+# define BOOST_PP_REPEAT_1_218(m, d) BOOST_PP_REPEAT_1_217(m, d) m(2, 217, d)
+# define BOOST_PP_REPEAT_1_219(m, d) BOOST_PP_REPEAT_1_218(m, d) m(2, 218, d)
+# define BOOST_PP_REPEAT_1_220(m, d) BOOST_PP_REPEAT_1_219(m, d) m(2, 219, d)
+# define BOOST_PP_REPEAT_1_221(m, d) BOOST_PP_REPEAT_1_220(m, d) m(2, 220, d)
+# define BOOST_PP_REPEAT_1_222(m, d) BOOST_PP_REPEAT_1_221(m, d) m(2, 221, d)
+# define BOOST_PP_REPEAT_1_223(m, d) BOOST_PP_REPEAT_1_222(m, d) m(2, 222, d)
+# define BOOST_PP_REPEAT_1_224(m, d) BOOST_PP_REPEAT_1_223(m, d) m(2, 223, d)
+# define BOOST_PP_REPEAT_1_225(m, d) BOOST_PP_REPEAT_1_224(m, d) m(2, 224, d)
+# define BOOST_PP_REPEAT_1_226(m, d) BOOST_PP_REPEAT_1_225(m, d) m(2, 225, d)
+# define BOOST_PP_REPEAT_1_227(m, d) BOOST_PP_REPEAT_1_226(m, d) m(2, 226, d)
+# define BOOST_PP_REPEAT_1_228(m, d) BOOST_PP_REPEAT_1_227(m, d) m(2, 227, d)
+# define BOOST_PP_REPEAT_1_229(m, d) BOOST_PP_REPEAT_1_228(m, d) m(2, 228, d)
+# define BOOST_PP_REPEAT_1_230(m, d) BOOST_PP_REPEAT_1_229(m, d) m(2, 229, d)
+# define BOOST_PP_REPEAT_1_231(m, d) BOOST_PP_REPEAT_1_230(m, d) m(2, 230, d)
+# define BOOST_PP_REPEAT_1_232(m, d) BOOST_PP_REPEAT_1_231(m, d) m(2, 231, d)
+# define BOOST_PP_REPEAT_1_233(m, d) BOOST_PP_REPEAT_1_232(m, d) m(2, 232, d)
+# define BOOST_PP_REPEAT_1_234(m, d) BOOST_PP_REPEAT_1_233(m, d) m(2, 233, d)
+# define BOOST_PP_REPEAT_1_235(m, d) BOOST_PP_REPEAT_1_234(m, d) m(2, 234, d)
+# define BOOST_PP_REPEAT_1_236(m, d) BOOST_PP_REPEAT_1_235(m, d) m(2, 235, d)
+# define BOOST_PP_REPEAT_1_237(m, d) BOOST_PP_REPEAT_1_236(m, d) m(2, 236, d)
+# define BOOST_PP_REPEAT_1_238(m, d) BOOST_PP_REPEAT_1_237(m, d) m(2, 237, d)
+# define BOOST_PP_REPEAT_1_239(m, d) BOOST_PP_REPEAT_1_238(m, d) m(2, 238, d)
+# define BOOST_PP_REPEAT_1_240(m, d) BOOST_PP_REPEAT_1_239(m, d) m(2, 239, d)
+# define BOOST_PP_REPEAT_1_241(m, d) BOOST_PP_REPEAT_1_240(m, d) m(2, 240, d)
+# define BOOST_PP_REPEAT_1_242(m, d) BOOST_PP_REPEAT_1_241(m, d) m(2, 241, d)
+# define BOOST_PP_REPEAT_1_243(m, d) BOOST_PP_REPEAT_1_242(m, d) m(2, 242, d)
+# define BOOST_PP_REPEAT_1_244(m, d) BOOST_PP_REPEAT_1_243(m, d) m(2, 243, d)
+# define BOOST_PP_REPEAT_1_245(m, d) BOOST_PP_REPEAT_1_244(m, d) m(2, 244, d)
+# define BOOST_PP_REPEAT_1_246(m, d) BOOST_PP_REPEAT_1_245(m, d) m(2, 245, d)
+# define BOOST_PP_REPEAT_1_247(m, d) BOOST_PP_REPEAT_1_246(m, d) m(2, 246, d)
+# define BOOST_PP_REPEAT_1_248(m, d) BOOST_PP_REPEAT_1_247(m, d) m(2, 247, d)
+# define BOOST_PP_REPEAT_1_249(m, d) BOOST_PP_REPEAT_1_248(m, d) m(2, 248, d)
+# define BOOST_PP_REPEAT_1_250(m, d) BOOST_PP_REPEAT_1_249(m, d) m(2, 249, d)
+# define BOOST_PP_REPEAT_1_251(m, d) BOOST_PP_REPEAT_1_250(m, d) m(2, 250, d)
+# define BOOST_PP_REPEAT_1_252(m, d) BOOST_PP_REPEAT_1_251(m, d) m(2, 251, d)
+# define BOOST_PP_REPEAT_1_253(m, d) BOOST_PP_REPEAT_1_252(m, d) m(2, 252, d)
+# define BOOST_PP_REPEAT_1_254(m, d) BOOST_PP_REPEAT_1_253(m, d) m(2, 253, d)
+# define BOOST_PP_REPEAT_1_255(m, d) BOOST_PP_REPEAT_1_254(m, d) m(2, 254, d)
+# define BOOST_PP_REPEAT_1_256(m, d) BOOST_PP_REPEAT_1_255(m, d) m(2, 255, d)
+#
+# define BOOST_PP_REPEAT_2_0(m, d)
+# define BOOST_PP_REPEAT_2_1(m, d) m(3, 0, d)
+# define BOOST_PP_REPEAT_2_2(m, d) BOOST_PP_REPEAT_2_1(m, d) m(3, 1, d)
+# define BOOST_PP_REPEAT_2_3(m, d) BOOST_PP_REPEAT_2_2(m, d) m(3, 2, d)
+# define BOOST_PP_REPEAT_2_4(m, d) BOOST_PP_REPEAT_2_3(m, d) m(3, 3, d)
+# define BOOST_PP_REPEAT_2_5(m, d) BOOST_PP_REPEAT_2_4(m, d) m(3, 4, d)
+# define BOOST_PP_REPEAT_2_6(m, d) BOOST_PP_REPEAT_2_5(m, d) m(3, 5, d)
+# define BOOST_PP_REPEAT_2_7(m, d) BOOST_PP_REPEAT_2_6(m, d) m(3, 6, d)
+# define BOOST_PP_REPEAT_2_8(m, d) BOOST_PP_REPEAT_2_7(m, d) m(3, 7, d)
+# define BOOST_PP_REPEAT_2_9(m, d) BOOST_PP_REPEAT_2_8(m, d) m(3, 8, d)
+# define BOOST_PP_REPEAT_2_10(m, d) BOOST_PP_REPEAT_2_9(m, d) m(3, 9, d)
+# define BOOST_PP_REPEAT_2_11(m, d) BOOST_PP_REPEAT_2_10(m, d) m(3, 10, d)
+# define BOOST_PP_REPEAT_2_12(m, d) BOOST_PP_REPEAT_2_11(m, d) m(3, 11, d)
+# define BOOST_PP_REPEAT_2_13(m, d) BOOST_PP_REPEAT_2_12(m, d) m(3, 12, d)
+# define BOOST_PP_REPEAT_2_14(m, d) BOOST_PP_REPEAT_2_13(m, d) m(3, 13, d)
+# define BOOST_PP_REPEAT_2_15(m, d) BOOST_PP_REPEAT_2_14(m, d) m(3, 14, d)
+# define BOOST_PP_REPEAT_2_16(m, d) BOOST_PP_REPEAT_2_15(m, d) m(3, 15, d)
+# define BOOST_PP_REPEAT_2_17(m, d) BOOST_PP_REPEAT_2_16(m, d) m(3, 16, d)
+# define BOOST_PP_REPEAT_2_18(m, d) BOOST_PP_REPEAT_2_17(m, d) m(3, 17, d)
+# define BOOST_PP_REPEAT_2_19(m, d) BOOST_PP_REPEAT_2_18(m, d) m(3, 18, d)
+# define BOOST_PP_REPEAT_2_20(m, d) BOOST_PP_REPEAT_2_19(m, d) m(3, 19, d)
+# define BOOST_PP_REPEAT_2_21(m, d) BOOST_PP_REPEAT_2_20(m, d) m(3, 20, d)
+# define BOOST_PP_REPEAT_2_22(m, d) BOOST_PP_REPEAT_2_21(m, d) m(3, 21, d)
+# define BOOST_PP_REPEAT_2_23(m, d) BOOST_PP_REPEAT_2_22(m, d) m(3, 22, d)
+# define BOOST_PP_REPEAT_2_24(m, d) BOOST_PP_REPEAT_2_23(m, d) m(3, 23, d)
+# define BOOST_PP_REPEAT_2_25(m, d) BOOST_PP_REPEAT_2_24(m, d) m(3, 24, d)
+# define BOOST_PP_REPEAT_2_26(m, d) BOOST_PP_REPEAT_2_25(m, d) m(3, 25, d)
+# define BOOST_PP_REPEAT_2_27(m, d) BOOST_PP_REPEAT_2_26(m, d) m(3, 26, d)
+# define BOOST_PP_REPEAT_2_28(m, d) BOOST_PP_REPEAT_2_27(m, d) m(3, 27, d)
+# define BOOST_PP_REPEAT_2_29(m, d) BOOST_PP_REPEAT_2_28(m, d) m(3, 28, d)
+# define BOOST_PP_REPEAT_2_30(m, d) BOOST_PP_REPEAT_2_29(m, d) m(3, 29, d)
+# define BOOST_PP_REPEAT_2_31(m, d) BOOST_PP_REPEAT_2_30(m, d) m(3, 30, d)
+# define BOOST_PP_REPEAT_2_32(m, d) BOOST_PP_REPEAT_2_31(m, d) m(3, 31, d)
+# define BOOST_PP_REPEAT_2_33(m, d) BOOST_PP_REPEAT_2_32(m, d) m(3, 32, d)
+# define BOOST_PP_REPEAT_2_34(m, d) BOOST_PP_REPEAT_2_33(m, d) m(3, 33, d)
+# define BOOST_PP_REPEAT_2_35(m, d) BOOST_PP_REPEAT_2_34(m, d) m(3, 34, d)
+# define BOOST_PP_REPEAT_2_36(m, d) BOOST_PP_REPEAT_2_35(m, d) m(3, 35, d)
+# define BOOST_PP_REPEAT_2_37(m, d) BOOST_PP_REPEAT_2_36(m, d) m(3, 36, d)
+# define BOOST_PP_REPEAT_2_38(m, d) BOOST_PP_REPEAT_2_37(m, d) m(3, 37, d)
+# define BOOST_PP_REPEAT_2_39(m, d) BOOST_PP_REPEAT_2_38(m, d) m(3, 38, d)
+# define BOOST_PP_REPEAT_2_40(m, d) BOOST_PP_REPEAT_2_39(m, d) m(3, 39, d)
+# define BOOST_PP_REPEAT_2_41(m, d) BOOST_PP_REPEAT_2_40(m, d) m(3, 40, d)
+# define BOOST_PP_REPEAT_2_42(m, d) BOOST_PP_REPEAT_2_41(m, d) m(3, 41, d)
+# define BOOST_PP_REPEAT_2_43(m, d) BOOST_PP_REPEAT_2_42(m, d) m(3, 42, d)
+# define BOOST_PP_REPEAT_2_44(m, d) BOOST_PP_REPEAT_2_43(m, d) m(3, 43, d)
+# define BOOST_PP_REPEAT_2_45(m, d) BOOST_PP_REPEAT_2_44(m, d) m(3, 44, d)
+# define BOOST_PP_REPEAT_2_46(m, d) BOOST_PP_REPEAT_2_45(m, d) m(3, 45, d)
+# define BOOST_PP_REPEAT_2_47(m, d) BOOST_PP_REPEAT_2_46(m, d) m(3, 46, d)
+# define BOOST_PP_REPEAT_2_48(m, d) BOOST_PP_REPEAT_2_47(m, d) m(3, 47, d)
+# define BOOST_PP_REPEAT_2_49(m, d) BOOST_PP_REPEAT_2_48(m, d) m(3, 48, d)
+# define BOOST_PP_REPEAT_2_50(m, d) BOOST_PP_REPEAT_2_49(m, d) m(3, 49, d)
+# define BOOST_PP_REPEAT_2_51(m, d) BOOST_PP_REPEAT_2_50(m, d) m(3, 50, d)
+# define BOOST_PP_REPEAT_2_52(m, d) BOOST_PP_REPEAT_2_51(m, d) m(3, 51, d)
+# define BOOST_PP_REPEAT_2_53(m, d) BOOST_PP_REPEAT_2_52(m, d) m(3, 52, d)
+# define BOOST_PP_REPEAT_2_54(m, d) BOOST_PP_REPEAT_2_53(m, d) m(3, 53, d)
+# define BOOST_PP_REPEAT_2_55(m, d) BOOST_PP_REPEAT_2_54(m, d) m(3, 54, d)
+# define BOOST_PP_REPEAT_2_56(m, d) BOOST_PP_REPEAT_2_55(m, d) m(3, 55, d)
+# define BOOST_PP_REPEAT_2_57(m, d) BOOST_PP_REPEAT_2_56(m, d) m(3, 56, d)
+# define BOOST_PP_REPEAT_2_58(m, d) BOOST_PP_REPEAT_2_57(m, d) m(3, 57, d)
+# define BOOST_PP_REPEAT_2_59(m, d) BOOST_PP_REPEAT_2_58(m, d) m(3, 58, d)
+# define BOOST_PP_REPEAT_2_60(m, d) BOOST_PP_REPEAT_2_59(m, d) m(3, 59, d)
+# define BOOST_PP_REPEAT_2_61(m, d) BOOST_PP_REPEAT_2_60(m, d) m(3, 60, d)
+# define BOOST_PP_REPEAT_2_62(m, d) BOOST_PP_REPEAT_2_61(m, d) m(3, 61, d)
+# define BOOST_PP_REPEAT_2_63(m, d) BOOST_PP_REPEAT_2_62(m, d) m(3, 62, d)
+# define BOOST_PP_REPEAT_2_64(m, d) BOOST_PP_REPEAT_2_63(m, d) m(3, 63, d)
+# define BOOST_PP_REPEAT_2_65(m, d) BOOST_PP_REPEAT_2_64(m, d) m(3, 64, d)
+# define BOOST_PP_REPEAT_2_66(m, d) BOOST_PP_REPEAT_2_65(m, d) m(3, 65, d)
+# define BOOST_PP_REPEAT_2_67(m, d) BOOST_PP_REPEAT_2_66(m, d) m(3, 66, d)
+# define BOOST_PP_REPEAT_2_68(m, d) BOOST_PP_REPEAT_2_67(m, d) m(3, 67, d)
+# define BOOST_PP_REPEAT_2_69(m, d) BOOST_PP_REPEAT_2_68(m, d) m(3, 68, d)
+# define BOOST_PP_REPEAT_2_70(m, d) BOOST_PP_REPEAT_2_69(m, d) m(3, 69, d)
+# define BOOST_PP_REPEAT_2_71(m, d) BOOST_PP_REPEAT_2_70(m, d) m(3, 70, d)
+# define BOOST_PP_REPEAT_2_72(m, d) BOOST_PP_REPEAT_2_71(m, d) m(3, 71, d)
+# define BOOST_PP_REPEAT_2_73(m, d) BOOST_PP_REPEAT_2_72(m, d) m(3, 72, d)
+# define BOOST_PP_REPEAT_2_74(m, d) BOOST_PP_REPEAT_2_73(m, d) m(3, 73, d)
+# define BOOST_PP_REPEAT_2_75(m, d) BOOST_PP_REPEAT_2_74(m, d) m(3, 74, d)
+# define BOOST_PP_REPEAT_2_76(m, d) BOOST_PP_REPEAT_2_75(m, d) m(3, 75, d)
+# define BOOST_PP_REPEAT_2_77(m, d) BOOST_PP_REPEAT_2_76(m, d) m(3, 76, d)
+# define BOOST_PP_REPEAT_2_78(m, d) BOOST_PP_REPEAT_2_77(m, d) m(3, 77, d)
+# define BOOST_PP_REPEAT_2_79(m, d) BOOST_PP_REPEAT_2_78(m, d) m(3, 78, d)
+# define BOOST_PP_REPEAT_2_80(m, d) BOOST_PP_REPEAT_2_79(m, d) m(3, 79, d)
+# define BOOST_PP_REPEAT_2_81(m, d) BOOST_PP_REPEAT_2_80(m, d) m(3, 80, d)
+# define BOOST_PP_REPEAT_2_82(m, d) BOOST_PP_REPEAT_2_81(m, d) m(3, 81, d)
+# define BOOST_PP_REPEAT_2_83(m, d) BOOST_PP_REPEAT_2_82(m, d) m(3, 82, d)
+# define BOOST_PP_REPEAT_2_84(m, d) BOOST_PP_REPEAT_2_83(m, d) m(3, 83, d)
+# define BOOST_PP_REPEAT_2_85(m, d) BOOST_PP_REPEAT_2_84(m, d) m(3, 84, d)
+# define BOOST_PP_REPEAT_2_86(m, d) BOOST_PP_REPEAT_2_85(m, d) m(3, 85, d)
+# define BOOST_PP_REPEAT_2_87(m, d) BOOST_PP_REPEAT_2_86(m, d) m(3, 86, d)
+# define BOOST_PP_REPEAT_2_88(m, d) BOOST_PP_REPEAT_2_87(m, d) m(3, 87, d)
+# define BOOST_PP_REPEAT_2_89(m, d) BOOST_PP_REPEAT_2_88(m, d) m(3, 88, d)
+# define BOOST_PP_REPEAT_2_90(m, d) BOOST_PP_REPEAT_2_89(m, d) m(3, 89, d)
+# define BOOST_PP_REPEAT_2_91(m, d) BOOST_PP_REPEAT_2_90(m, d) m(3, 90, d)
+# define BOOST_PP_REPEAT_2_92(m, d) BOOST_PP_REPEAT_2_91(m, d) m(3, 91, d)
+# define BOOST_PP_REPEAT_2_93(m, d) BOOST_PP_REPEAT_2_92(m, d) m(3, 92, d)
+# define BOOST_PP_REPEAT_2_94(m, d) BOOST_PP_REPEAT_2_93(m, d) m(3, 93, d)
+# define BOOST_PP_REPEAT_2_95(m, d) BOOST_PP_REPEAT_2_94(m, d) m(3, 94, d)
+# define BOOST_PP_REPEAT_2_96(m, d) BOOST_PP_REPEAT_2_95(m, d) m(3, 95, d)
+# define BOOST_PP_REPEAT_2_97(m, d) BOOST_PP_REPEAT_2_96(m, d) m(3, 96, d)
+# define BOOST_PP_REPEAT_2_98(m, d) BOOST_PP_REPEAT_2_97(m, d) m(3, 97, d)
+# define BOOST_PP_REPEAT_2_99(m, d) BOOST_PP_REPEAT_2_98(m, d) m(3, 98, d)
+# define BOOST_PP_REPEAT_2_100(m, d) BOOST_PP_REPEAT_2_99(m, d) m(3, 99, d)
+# define BOOST_PP_REPEAT_2_101(m, d) BOOST_PP_REPEAT_2_100(m, d) m(3, 100, d)
+# define BOOST_PP_REPEAT_2_102(m, d) BOOST_PP_REPEAT_2_101(m, d) m(3, 101, d)
+# define BOOST_PP_REPEAT_2_103(m, d) BOOST_PP_REPEAT_2_102(m, d) m(3, 102, d)
+# define BOOST_PP_REPEAT_2_104(m, d) BOOST_PP_REPEAT_2_103(m, d) m(3, 103, d)
+# define BOOST_PP_REPEAT_2_105(m, d) BOOST_PP_REPEAT_2_104(m, d) m(3, 104, d)
+# define BOOST_PP_REPEAT_2_106(m, d) BOOST_PP_REPEAT_2_105(m, d) m(3, 105, d)
+# define BOOST_PP_REPEAT_2_107(m, d) BOOST_PP_REPEAT_2_106(m, d) m(3, 106, d)
+# define BOOST_PP_REPEAT_2_108(m, d) BOOST_PP_REPEAT_2_107(m, d) m(3, 107, d)
+# define BOOST_PP_REPEAT_2_109(m, d) BOOST_PP_REPEAT_2_108(m, d) m(3, 108, d)
+# define BOOST_PP_REPEAT_2_110(m, d) BOOST_PP_REPEAT_2_109(m, d) m(3, 109, d)
+# define BOOST_PP_REPEAT_2_111(m, d) BOOST_PP_REPEAT_2_110(m, d) m(3, 110, d)
+# define BOOST_PP_REPEAT_2_112(m, d) BOOST_PP_REPEAT_2_111(m, d) m(3, 111, d)
+# define BOOST_PP_REPEAT_2_113(m, d) BOOST_PP_REPEAT_2_112(m, d) m(3, 112, d)
+# define BOOST_PP_REPEAT_2_114(m, d) BOOST_PP_REPEAT_2_113(m, d) m(3, 113, d)
+# define BOOST_PP_REPEAT_2_115(m, d) BOOST_PP_REPEAT_2_114(m, d) m(3, 114, d)
+# define BOOST_PP_REPEAT_2_116(m, d) BOOST_PP_REPEAT_2_115(m, d) m(3, 115, d)
+# define BOOST_PP_REPEAT_2_117(m, d) BOOST_PP_REPEAT_2_116(m, d) m(3, 116, d)
+# define BOOST_PP_REPEAT_2_118(m, d) BOOST_PP_REPEAT_2_117(m, d) m(3, 117, d)
+# define BOOST_PP_REPEAT_2_119(m, d) BOOST_PP_REPEAT_2_118(m, d) m(3, 118, d)
+# define BOOST_PP_REPEAT_2_120(m, d) BOOST_PP_REPEAT_2_119(m, d) m(3, 119, d)
+# define BOOST_PP_REPEAT_2_121(m, d) BOOST_PP_REPEAT_2_120(m, d) m(3, 120, d)
+# define BOOST_PP_REPEAT_2_122(m, d) BOOST_PP_REPEAT_2_121(m, d) m(3, 121, d)
+# define BOOST_PP_REPEAT_2_123(m, d) BOOST_PP_REPEAT_2_122(m, d) m(3, 122, d)
+# define BOOST_PP_REPEAT_2_124(m, d) BOOST_PP_REPEAT_2_123(m, d) m(3, 123, d)
+# define BOOST_PP_REPEAT_2_125(m, d) BOOST_PP_REPEAT_2_124(m, d) m(3, 124, d)
+# define BOOST_PP_REPEAT_2_126(m, d) BOOST_PP_REPEAT_2_125(m, d) m(3, 125, d)
+# define BOOST_PP_REPEAT_2_127(m, d) BOOST_PP_REPEAT_2_126(m, d) m(3, 126, d)
+# define BOOST_PP_REPEAT_2_128(m, d) BOOST_PP_REPEAT_2_127(m, d) m(3, 127, d)
+# define BOOST_PP_REPEAT_2_129(m, d) BOOST_PP_REPEAT_2_128(m, d) m(3, 128, d)
+# define BOOST_PP_REPEAT_2_130(m, d) BOOST_PP_REPEAT_2_129(m, d) m(3, 129, d)
+# define BOOST_PP_REPEAT_2_131(m, d) BOOST_PP_REPEAT_2_130(m, d) m(3, 130, d)
+# define BOOST_PP_REPEAT_2_132(m, d) BOOST_PP_REPEAT_2_131(m, d) m(3, 131, d)
+# define BOOST_PP_REPEAT_2_133(m, d) BOOST_PP_REPEAT_2_132(m, d) m(3, 132, d)
+# define BOOST_PP_REPEAT_2_134(m, d) BOOST_PP_REPEAT_2_133(m, d) m(3, 133, d)
+# define BOOST_PP_REPEAT_2_135(m, d) BOOST_PP_REPEAT_2_134(m, d) m(3, 134, d)
+# define BOOST_PP_REPEAT_2_136(m, d) BOOST_PP_REPEAT_2_135(m, d) m(3, 135, d)
+# define BOOST_PP_REPEAT_2_137(m, d) BOOST_PP_REPEAT_2_136(m, d) m(3, 136, d)
+# define BOOST_PP_REPEAT_2_138(m, d) BOOST_PP_REPEAT_2_137(m, d) m(3, 137, d)
+# define BOOST_PP_REPEAT_2_139(m, d) BOOST_PP_REPEAT_2_138(m, d) m(3, 138, d)
+# define BOOST_PP_REPEAT_2_140(m, d) BOOST_PP_REPEAT_2_139(m, d) m(3, 139, d)
+# define BOOST_PP_REPEAT_2_141(m, d) BOOST_PP_REPEAT_2_140(m, d) m(3, 140, d)
+# define BOOST_PP_REPEAT_2_142(m, d) BOOST_PP_REPEAT_2_141(m, d) m(3, 141, d)
+# define BOOST_PP_REPEAT_2_143(m, d) BOOST_PP_REPEAT_2_142(m, d) m(3, 142, d)
+# define BOOST_PP_REPEAT_2_144(m, d) BOOST_PP_REPEAT_2_143(m, d) m(3, 143, d)
+# define BOOST_PP_REPEAT_2_145(m, d) BOOST_PP_REPEAT_2_144(m, d) m(3, 144, d)
+# define BOOST_PP_REPEAT_2_146(m, d) BOOST_PP_REPEAT_2_145(m, d) m(3, 145, d)
+# define BOOST_PP_REPEAT_2_147(m, d) BOOST_PP_REPEAT_2_146(m, d) m(3, 146, d)
+# define BOOST_PP_REPEAT_2_148(m, d) BOOST_PP_REPEAT_2_147(m, d) m(3, 147, d)
+# define BOOST_PP_REPEAT_2_149(m, d) BOOST_PP_REPEAT_2_148(m, d) m(3, 148, d)
+# define BOOST_PP_REPEAT_2_150(m, d) BOOST_PP_REPEAT_2_149(m, d) m(3, 149, d)
+# define BOOST_PP_REPEAT_2_151(m, d) BOOST_PP_REPEAT_2_150(m, d) m(3, 150, d)
+# define BOOST_PP_REPEAT_2_152(m, d) BOOST_PP_REPEAT_2_151(m, d) m(3, 151, d)
+# define BOOST_PP_REPEAT_2_153(m, d) BOOST_PP_REPEAT_2_152(m, d) m(3, 152, d)
+# define BOOST_PP_REPEAT_2_154(m, d) BOOST_PP_REPEAT_2_153(m, d) m(3, 153, d)
+# define BOOST_PP_REPEAT_2_155(m, d) BOOST_PP_REPEAT_2_154(m, d) m(3, 154, d)
+# define BOOST_PP_REPEAT_2_156(m, d) BOOST_PP_REPEAT_2_155(m, d) m(3, 155, d)
+# define BOOST_PP_REPEAT_2_157(m, d) BOOST_PP_REPEAT_2_156(m, d) m(3, 156, d)
+# define BOOST_PP_REPEAT_2_158(m, d) BOOST_PP_REPEAT_2_157(m, d) m(3, 157, d)
+# define BOOST_PP_REPEAT_2_159(m, d) BOOST_PP_REPEAT_2_158(m, d) m(3, 158, d)
+# define BOOST_PP_REPEAT_2_160(m, d) BOOST_PP_REPEAT_2_159(m, d) m(3, 159, d)
+# define BOOST_PP_REPEAT_2_161(m, d) BOOST_PP_REPEAT_2_160(m, d) m(3, 160, d)
+# define BOOST_PP_REPEAT_2_162(m, d) BOOST_PP_REPEAT_2_161(m, d) m(3, 161, d)
+# define BOOST_PP_REPEAT_2_163(m, d) BOOST_PP_REPEAT_2_162(m, d) m(3, 162, d)
+# define BOOST_PP_REPEAT_2_164(m, d) BOOST_PP_REPEAT_2_163(m, d) m(3, 163, d)
+# define BOOST_PP_REPEAT_2_165(m, d) BOOST_PP_REPEAT_2_164(m, d) m(3, 164, d)
+# define BOOST_PP_REPEAT_2_166(m, d) BOOST_PP_REPEAT_2_165(m, d) m(3, 165, d)
+# define BOOST_PP_REPEAT_2_167(m, d) BOOST_PP_REPEAT_2_166(m, d) m(3, 166, d)
+# define BOOST_PP_REPEAT_2_168(m, d) BOOST_PP_REPEAT_2_167(m, d) m(3, 167, d)
+# define BOOST_PP_REPEAT_2_169(m, d) BOOST_PP_REPEAT_2_168(m, d) m(3, 168, d)
+# define BOOST_PP_REPEAT_2_170(m, d) BOOST_PP_REPEAT_2_169(m, d) m(3, 169, d)
+# define BOOST_PP_REPEAT_2_171(m, d) BOOST_PP_REPEAT_2_170(m, d) m(3, 170, d)
+# define BOOST_PP_REPEAT_2_172(m, d) BOOST_PP_REPEAT_2_171(m, d) m(3, 171, d)
+# define BOOST_PP_REPEAT_2_173(m, d) BOOST_PP_REPEAT_2_172(m, d) m(3, 172, d)
+# define BOOST_PP_REPEAT_2_174(m, d) BOOST_PP_REPEAT_2_173(m, d) m(3, 173, d)
+# define BOOST_PP_REPEAT_2_175(m, d) BOOST_PP_REPEAT_2_174(m, d) m(3, 174, d)
+# define BOOST_PP_REPEAT_2_176(m, d) BOOST_PP_REPEAT_2_175(m, d) m(3, 175, d)
+# define BOOST_PP_REPEAT_2_177(m, d) BOOST_PP_REPEAT_2_176(m, d) m(3, 176, d)
+# define BOOST_PP_REPEAT_2_178(m, d) BOOST_PP_REPEAT_2_177(m, d) m(3, 177, d)
+# define BOOST_PP_REPEAT_2_179(m, d) BOOST_PP_REPEAT_2_178(m, d) m(3, 178, d)
+# define BOOST_PP_REPEAT_2_180(m, d) BOOST_PP_REPEAT_2_179(m, d) m(3, 179, d)
+# define BOOST_PP_REPEAT_2_181(m, d) BOOST_PP_REPEAT_2_180(m, d) m(3, 180, d)
+# define BOOST_PP_REPEAT_2_182(m, d) BOOST_PP_REPEAT_2_181(m, d) m(3, 181, d)
+# define BOOST_PP_REPEAT_2_183(m, d) BOOST_PP_REPEAT_2_182(m, d) m(3, 182, d)
+# define BOOST_PP_REPEAT_2_184(m, d) BOOST_PP_REPEAT_2_183(m, d) m(3, 183, d)
+# define BOOST_PP_REPEAT_2_185(m, d) BOOST_PP_REPEAT_2_184(m, d) m(3, 184, d)
+# define BOOST_PP_REPEAT_2_186(m, d) BOOST_PP_REPEAT_2_185(m, d) m(3, 185, d)
+# define BOOST_PP_REPEAT_2_187(m, d) BOOST_PP_REPEAT_2_186(m, d) m(3, 186, d)
+# define BOOST_PP_REPEAT_2_188(m, d) BOOST_PP_REPEAT_2_187(m, d) m(3, 187, d)
+# define BOOST_PP_REPEAT_2_189(m, d) BOOST_PP_REPEAT_2_188(m, d) m(3, 188, d)
+# define BOOST_PP_REPEAT_2_190(m, d) BOOST_PP_REPEAT_2_189(m, d) m(3, 189, d)
+# define BOOST_PP_REPEAT_2_191(m, d) BOOST_PP_REPEAT_2_190(m, d) m(3, 190, d)
+# define BOOST_PP_REPEAT_2_192(m, d) BOOST_PP_REPEAT_2_191(m, d) m(3, 191, d)
+# define BOOST_PP_REPEAT_2_193(m, d) BOOST_PP_REPEAT_2_192(m, d) m(3, 192, d)
+# define BOOST_PP_REPEAT_2_194(m, d) BOOST_PP_REPEAT_2_193(m, d) m(3, 193, d)
+# define BOOST_PP_REPEAT_2_195(m, d) BOOST_PP_REPEAT_2_194(m, d) m(3, 194, d)
+# define BOOST_PP_REPEAT_2_196(m, d) BOOST_PP_REPEAT_2_195(m, d) m(3, 195, d)
+# define BOOST_PP_REPEAT_2_197(m, d) BOOST_PP_REPEAT_2_196(m, d) m(3, 196, d)
+# define BOOST_PP_REPEAT_2_198(m, d) BOOST_PP_REPEAT_2_197(m, d) m(3, 197, d)
+# define BOOST_PP_REPEAT_2_199(m, d) BOOST_PP_REPEAT_2_198(m, d) m(3, 198, d)
+# define BOOST_PP_REPEAT_2_200(m, d) BOOST_PP_REPEAT_2_199(m, d) m(3, 199, d)
+# define BOOST_PP_REPEAT_2_201(m, d) BOOST_PP_REPEAT_2_200(m, d) m(3, 200, d)
+# define BOOST_PP_REPEAT_2_202(m, d) BOOST_PP_REPEAT_2_201(m, d) m(3, 201, d)
+# define BOOST_PP_REPEAT_2_203(m, d) BOOST_PP_REPEAT_2_202(m, d) m(3, 202, d)
+# define BOOST_PP_REPEAT_2_204(m, d) BOOST_PP_REPEAT_2_203(m, d) m(3, 203, d)
+# define BOOST_PP_REPEAT_2_205(m, d) BOOST_PP_REPEAT_2_204(m, d) m(3, 204, d)
+# define BOOST_PP_REPEAT_2_206(m, d) BOOST_PP_REPEAT_2_205(m, d) m(3, 205, d)
+# define BOOST_PP_REPEAT_2_207(m, d) BOOST_PP_REPEAT_2_206(m, d) m(3, 206, d)
+# define BOOST_PP_REPEAT_2_208(m, d) BOOST_PP_REPEAT_2_207(m, d) m(3, 207, d)
+# define BOOST_PP_REPEAT_2_209(m, d) BOOST_PP_REPEAT_2_208(m, d) m(3, 208, d)
+# define BOOST_PP_REPEAT_2_210(m, d) BOOST_PP_REPEAT_2_209(m, d) m(3, 209, d)
+# define BOOST_PP_REPEAT_2_211(m, d) BOOST_PP_REPEAT_2_210(m, d) m(3, 210, d)
+# define BOOST_PP_REPEAT_2_212(m, d) BOOST_PP_REPEAT_2_211(m, d) m(3, 211, d)
+# define BOOST_PP_REPEAT_2_213(m, d) BOOST_PP_REPEAT_2_212(m, d) m(3, 212, d)
+# define BOOST_PP_REPEAT_2_214(m, d) BOOST_PP_REPEAT_2_213(m, d) m(3, 213, d)
+# define BOOST_PP_REPEAT_2_215(m, d) BOOST_PP_REPEAT_2_214(m, d) m(3, 214, d)
+# define BOOST_PP_REPEAT_2_216(m, d) BOOST_PP_REPEAT_2_215(m, d) m(3, 215, d)
+# define BOOST_PP_REPEAT_2_217(m, d) BOOST_PP_REPEAT_2_216(m, d) m(3, 216, d)
+# define BOOST_PP_REPEAT_2_218(m, d) BOOST_PP_REPEAT_2_217(m, d) m(3, 217, d)
+# define BOOST_PP_REPEAT_2_219(m, d) BOOST_PP_REPEAT_2_218(m, d) m(3, 218, d)
+# define BOOST_PP_REPEAT_2_220(m, d) BOOST_PP_REPEAT_2_219(m, d) m(3, 219, d)
+# define BOOST_PP_REPEAT_2_221(m, d) BOOST_PP_REPEAT_2_220(m, d) m(3, 220, d)
+# define BOOST_PP_REPEAT_2_222(m, d) BOOST_PP_REPEAT_2_221(m, d) m(3, 221, d)
+# define BOOST_PP_REPEAT_2_223(m, d) BOOST_PP_REPEAT_2_222(m, d) m(3, 222, d)
+# define BOOST_PP_REPEAT_2_224(m, d) BOOST_PP_REPEAT_2_223(m, d) m(3, 223, d)
+# define BOOST_PP_REPEAT_2_225(m, d) BOOST_PP_REPEAT_2_224(m, d) m(3, 224, d)
+# define BOOST_PP_REPEAT_2_226(m, d) BOOST_PP_REPEAT_2_225(m, d) m(3, 225, d)
+# define BOOST_PP_REPEAT_2_227(m, d) BOOST_PP_REPEAT_2_226(m, d) m(3, 226, d)
+# define BOOST_PP_REPEAT_2_228(m, d) BOOST_PP_REPEAT_2_227(m, d) m(3, 227, d)
+# define BOOST_PP_REPEAT_2_229(m, d) BOOST_PP_REPEAT_2_228(m, d) m(3, 228, d)
+# define BOOST_PP_REPEAT_2_230(m, d) BOOST_PP_REPEAT_2_229(m, d) m(3, 229, d)
+# define BOOST_PP_REPEAT_2_231(m, d) BOOST_PP_REPEAT_2_230(m, d) m(3, 230, d)
+# define BOOST_PP_REPEAT_2_232(m, d) BOOST_PP_REPEAT_2_231(m, d) m(3, 231, d)
+# define BOOST_PP_REPEAT_2_233(m, d) BOOST_PP_REPEAT_2_232(m, d) m(3, 232, d)
+# define BOOST_PP_REPEAT_2_234(m, d) BOOST_PP_REPEAT_2_233(m, d) m(3, 233, d)
+# define BOOST_PP_REPEAT_2_235(m, d) BOOST_PP_REPEAT_2_234(m, d) m(3, 234, d)
+# define BOOST_PP_REPEAT_2_236(m, d) BOOST_PP_REPEAT_2_235(m, d) m(3, 235, d)
+# define BOOST_PP_REPEAT_2_237(m, d) BOOST_PP_REPEAT_2_236(m, d) m(3, 236, d)
+# define BOOST_PP_REPEAT_2_238(m, d) BOOST_PP_REPEAT_2_237(m, d) m(3, 237, d)
+# define BOOST_PP_REPEAT_2_239(m, d) BOOST_PP_REPEAT_2_238(m, d) m(3, 238, d)
+# define BOOST_PP_REPEAT_2_240(m, d) BOOST_PP_REPEAT_2_239(m, d) m(3, 239, d)
+# define BOOST_PP_REPEAT_2_241(m, d) BOOST_PP_REPEAT_2_240(m, d) m(3, 240, d)
+# define BOOST_PP_REPEAT_2_242(m, d) BOOST_PP_REPEAT_2_241(m, d) m(3, 241, d)
+# define BOOST_PP_REPEAT_2_243(m, d) BOOST_PP_REPEAT_2_242(m, d) m(3, 242, d)
+# define BOOST_PP_REPEAT_2_244(m, d) BOOST_PP_REPEAT_2_243(m, d) m(3, 243, d)
+# define BOOST_PP_REPEAT_2_245(m, d) BOOST_PP_REPEAT_2_244(m, d) m(3, 244, d)
+# define BOOST_PP_REPEAT_2_246(m, d) BOOST_PP_REPEAT_2_245(m, d) m(3, 245, d)
+# define BOOST_PP_REPEAT_2_247(m, d) BOOST_PP_REPEAT_2_246(m, d) m(3, 246, d)
+# define BOOST_PP_REPEAT_2_248(m, d) BOOST_PP_REPEAT_2_247(m, d) m(3, 247, d)
+# define BOOST_PP_REPEAT_2_249(m, d) BOOST_PP_REPEAT_2_248(m, d) m(3, 248, d)
+# define BOOST_PP_REPEAT_2_250(m, d) BOOST_PP_REPEAT_2_249(m, d) m(3, 249, d)
+# define BOOST_PP_REPEAT_2_251(m, d) BOOST_PP_REPEAT_2_250(m, d) m(3, 250, d)
+# define BOOST_PP_REPEAT_2_252(m, d) BOOST_PP_REPEAT_2_251(m, d) m(3, 251, d)
+# define BOOST_PP_REPEAT_2_253(m, d) BOOST_PP_REPEAT_2_252(m, d) m(3, 252, d)
+# define BOOST_PP_REPEAT_2_254(m, d) BOOST_PP_REPEAT_2_253(m, d) m(3, 253, d)
+# define BOOST_PP_REPEAT_2_255(m, d) BOOST_PP_REPEAT_2_254(m, d) m(3, 254, d)
+# define BOOST_PP_REPEAT_2_256(m, d) BOOST_PP_REPEAT_2_255(m, d) m(3, 255, d)
+#
+# define BOOST_PP_REPEAT_3_0(m, d)
+# define BOOST_PP_REPEAT_3_1(m, d) m(4, 0, d)
+# define BOOST_PP_REPEAT_3_2(m, d) BOOST_PP_REPEAT_3_1(m, d) m(4, 1, d)
+# define BOOST_PP_REPEAT_3_3(m, d) BOOST_PP_REPEAT_3_2(m, d) m(4, 2, d)
+# define BOOST_PP_REPEAT_3_4(m, d) BOOST_PP_REPEAT_3_3(m, d) m(4, 3, d)
+# define BOOST_PP_REPEAT_3_5(m, d) BOOST_PP_REPEAT_3_4(m, d) m(4, 4, d)
+# define BOOST_PP_REPEAT_3_6(m, d) BOOST_PP_REPEAT_3_5(m, d) m(4, 5, d)
+# define BOOST_PP_REPEAT_3_7(m, d) BOOST_PP_REPEAT_3_6(m, d) m(4, 6, d)
+# define BOOST_PP_REPEAT_3_8(m, d) BOOST_PP_REPEAT_3_7(m, d) m(4, 7, d)
+# define BOOST_PP_REPEAT_3_9(m, d) BOOST_PP_REPEAT_3_8(m, d) m(4, 8, d)
+# define BOOST_PP_REPEAT_3_10(m, d) BOOST_PP_REPEAT_3_9(m, d) m(4, 9, d)
+# define BOOST_PP_REPEAT_3_11(m, d) BOOST_PP_REPEAT_3_10(m, d) m(4, 10, d)
+# define BOOST_PP_REPEAT_3_12(m, d) BOOST_PP_REPEAT_3_11(m, d) m(4, 11, d)
+# define BOOST_PP_REPEAT_3_13(m, d) BOOST_PP_REPEAT_3_12(m, d) m(4, 12, d)
+# define BOOST_PP_REPEAT_3_14(m, d) BOOST_PP_REPEAT_3_13(m, d) m(4, 13, d)
+# define BOOST_PP_REPEAT_3_15(m, d) BOOST_PP_REPEAT_3_14(m, d) m(4, 14, d)
+# define BOOST_PP_REPEAT_3_16(m, d) BOOST_PP_REPEAT_3_15(m, d) m(4, 15, d)
+# define BOOST_PP_REPEAT_3_17(m, d) BOOST_PP_REPEAT_3_16(m, d) m(4, 16, d)
+# define BOOST_PP_REPEAT_3_18(m, d) BOOST_PP_REPEAT_3_17(m, d) m(4, 17, d)
+# define BOOST_PP_REPEAT_3_19(m, d) BOOST_PP_REPEAT_3_18(m, d) m(4, 18, d)
+# define BOOST_PP_REPEAT_3_20(m, d) BOOST_PP_REPEAT_3_19(m, d) m(4, 19, d)
+# define BOOST_PP_REPEAT_3_21(m, d) BOOST_PP_REPEAT_3_20(m, d) m(4, 20, d)
+# define BOOST_PP_REPEAT_3_22(m, d) BOOST_PP_REPEAT_3_21(m, d) m(4, 21, d)
+# define BOOST_PP_REPEAT_3_23(m, d) BOOST_PP_REPEAT_3_22(m, d) m(4, 22, d)
+# define BOOST_PP_REPEAT_3_24(m, d) BOOST_PP_REPEAT_3_23(m, d) m(4, 23, d)
+# define BOOST_PP_REPEAT_3_25(m, d) BOOST_PP_REPEAT_3_24(m, d) m(4, 24, d)
+# define BOOST_PP_REPEAT_3_26(m, d) BOOST_PP_REPEAT_3_25(m, d) m(4, 25, d)
+# define BOOST_PP_REPEAT_3_27(m, d) BOOST_PP_REPEAT_3_26(m, d) m(4, 26, d)
+# define BOOST_PP_REPEAT_3_28(m, d) BOOST_PP_REPEAT_3_27(m, d) m(4, 27, d)
+# define BOOST_PP_REPEAT_3_29(m, d) BOOST_PP_REPEAT_3_28(m, d) m(4, 28, d)
+# define BOOST_PP_REPEAT_3_30(m, d) BOOST_PP_REPEAT_3_29(m, d) m(4, 29, d)
+# define BOOST_PP_REPEAT_3_31(m, d) BOOST_PP_REPEAT_3_30(m, d) m(4, 30, d)
+# define BOOST_PP_REPEAT_3_32(m, d) BOOST_PP_REPEAT_3_31(m, d) m(4, 31, d)
+# define BOOST_PP_REPEAT_3_33(m, d) BOOST_PP_REPEAT_3_32(m, d) m(4, 32, d)
+# define BOOST_PP_REPEAT_3_34(m, d) BOOST_PP_REPEAT_3_33(m, d) m(4, 33, d)
+# define BOOST_PP_REPEAT_3_35(m, d) BOOST_PP_REPEAT_3_34(m, d) m(4, 34, d)
+# define BOOST_PP_REPEAT_3_36(m, d) BOOST_PP_REPEAT_3_35(m, d) m(4, 35, d)
+# define BOOST_PP_REPEAT_3_37(m, d) BOOST_PP_REPEAT_3_36(m, d) m(4, 36, d)
+# define BOOST_PP_REPEAT_3_38(m, d) BOOST_PP_REPEAT_3_37(m, d) m(4, 37, d)
+# define BOOST_PP_REPEAT_3_39(m, d) BOOST_PP_REPEAT_3_38(m, d) m(4, 38, d)
+# define BOOST_PP_REPEAT_3_40(m, d) BOOST_PP_REPEAT_3_39(m, d) m(4, 39, d)
+# define BOOST_PP_REPEAT_3_41(m, d) BOOST_PP_REPEAT_3_40(m, d) m(4, 40, d)
+# define BOOST_PP_REPEAT_3_42(m, d) BOOST_PP_REPEAT_3_41(m, d) m(4, 41, d)
+# define BOOST_PP_REPEAT_3_43(m, d) BOOST_PP_REPEAT_3_42(m, d) m(4, 42, d)
+# define BOOST_PP_REPEAT_3_44(m, d) BOOST_PP_REPEAT_3_43(m, d) m(4, 43, d)
+# define BOOST_PP_REPEAT_3_45(m, d) BOOST_PP_REPEAT_3_44(m, d) m(4, 44, d)
+# define BOOST_PP_REPEAT_3_46(m, d) BOOST_PP_REPEAT_3_45(m, d) m(4, 45, d)
+# define BOOST_PP_REPEAT_3_47(m, d) BOOST_PP_REPEAT_3_46(m, d) m(4, 46, d)
+# define BOOST_PP_REPEAT_3_48(m, d) BOOST_PP_REPEAT_3_47(m, d) m(4, 47, d)
+# define BOOST_PP_REPEAT_3_49(m, d) BOOST_PP_REPEAT_3_48(m, d) m(4, 48, d)
+# define BOOST_PP_REPEAT_3_50(m, d) BOOST_PP_REPEAT_3_49(m, d) m(4, 49, d)
+# define BOOST_PP_REPEAT_3_51(m, d) BOOST_PP_REPEAT_3_50(m, d) m(4, 50, d)
+# define BOOST_PP_REPEAT_3_52(m, d) BOOST_PP_REPEAT_3_51(m, d) m(4, 51, d)
+# define BOOST_PP_REPEAT_3_53(m, d) BOOST_PP_REPEAT_3_52(m, d) m(4, 52, d)
+# define BOOST_PP_REPEAT_3_54(m, d) BOOST_PP_REPEAT_3_53(m, d) m(4, 53, d)
+# define BOOST_PP_REPEAT_3_55(m, d) BOOST_PP_REPEAT_3_54(m, d) m(4, 54, d)
+# define BOOST_PP_REPEAT_3_56(m, d) BOOST_PP_REPEAT_3_55(m, d) m(4, 55, d)
+# define BOOST_PP_REPEAT_3_57(m, d) BOOST_PP_REPEAT_3_56(m, d) m(4, 56, d)
+# define BOOST_PP_REPEAT_3_58(m, d) BOOST_PP_REPEAT_3_57(m, d) m(4, 57, d)
+# define BOOST_PP_REPEAT_3_59(m, d) BOOST_PP_REPEAT_3_58(m, d) m(4, 58, d)
+# define BOOST_PP_REPEAT_3_60(m, d) BOOST_PP_REPEAT_3_59(m, d) m(4, 59, d)
+# define BOOST_PP_REPEAT_3_61(m, d) BOOST_PP_REPEAT_3_60(m, d) m(4, 60, d)
+# define BOOST_PP_REPEAT_3_62(m, d) BOOST_PP_REPEAT_3_61(m, d) m(4, 61, d)
+# define BOOST_PP_REPEAT_3_63(m, d) BOOST_PP_REPEAT_3_62(m, d) m(4, 62, d)
+# define BOOST_PP_REPEAT_3_64(m, d) BOOST_PP_REPEAT_3_63(m, d) m(4, 63, d)
+# define BOOST_PP_REPEAT_3_65(m, d) BOOST_PP_REPEAT_3_64(m, d) m(4, 64, d)
+# define BOOST_PP_REPEAT_3_66(m, d) BOOST_PP_REPEAT_3_65(m, d) m(4, 65, d)
+# define BOOST_PP_REPEAT_3_67(m, d) BOOST_PP_REPEAT_3_66(m, d) m(4, 66, d)
+# define BOOST_PP_REPEAT_3_68(m, d) BOOST_PP_REPEAT_3_67(m, d) m(4, 67, d)
+# define BOOST_PP_REPEAT_3_69(m, d) BOOST_PP_REPEAT_3_68(m, d) m(4, 68, d)
+# define BOOST_PP_REPEAT_3_70(m, d) BOOST_PP_REPEAT_3_69(m, d) m(4, 69, d)
+# define BOOST_PP_REPEAT_3_71(m, d) BOOST_PP_REPEAT_3_70(m, d) m(4, 70, d)
+# define BOOST_PP_REPEAT_3_72(m, d) BOOST_PP_REPEAT_3_71(m, d) m(4, 71, d)
+# define BOOST_PP_REPEAT_3_73(m, d) BOOST_PP_REPEAT_3_72(m, d) m(4, 72, d)
+# define BOOST_PP_REPEAT_3_74(m, d) BOOST_PP_REPEAT_3_73(m, d) m(4, 73, d)
+# define BOOST_PP_REPEAT_3_75(m, d) BOOST_PP_REPEAT_3_74(m, d) m(4, 74, d)
+# define BOOST_PP_REPEAT_3_76(m, d) BOOST_PP_REPEAT_3_75(m, d) m(4, 75, d)
+# define BOOST_PP_REPEAT_3_77(m, d) BOOST_PP_REPEAT_3_76(m, d) m(4, 76, d)
+# define BOOST_PP_REPEAT_3_78(m, d) BOOST_PP_REPEAT_3_77(m, d) m(4, 77, d)
+# define BOOST_PP_REPEAT_3_79(m, d) BOOST_PP_REPEAT_3_78(m, d) m(4, 78, d)
+# define BOOST_PP_REPEAT_3_80(m, d) BOOST_PP_REPEAT_3_79(m, d) m(4, 79, d)
+# define BOOST_PP_REPEAT_3_81(m, d) BOOST_PP_REPEAT_3_80(m, d) m(4, 80, d)
+# define BOOST_PP_REPEAT_3_82(m, d) BOOST_PP_REPEAT_3_81(m, d) m(4, 81, d)
+# define BOOST_PP_REPEAT_3_83(m, d) BOOST_PP_REPEAT_3_82(m, d) m(4, 82, d)
+# define BOOST_PP_REPEAT_3_84(m, d) BOOST_PP_REPEAT_3_83(m, d) m(4, 83, d)
+# define BOOST_PP_REPEAT_3_85(m, d) BOOST_PP_REPEAT_3_84(m, d) m(4, 84, d)
+# define BOOST_PP_REPEAT_3_86(m, d) BOOST_PP_REPEAT_3_85(m, d) m(4, 85, d)
+# define BOOST_PP_REPEAT_3_87(m, d) BOOST_PP_REPEAT_3_86(m, d) m(4, 86, d)
+# define BOOST_PP_REPEAT_3_88(m, d) BOOST_PP_REPEAT_3_87(m, d) m(4, 87, d)
+# define BOOST_PP_REPEAT_3_89(m, d) BOOST_PP_REPEAT_3_88(m, d) m(4, 88, d)
+# define BOOST_PP_REPEAT_3_90(m, d) BOOST_PP_REPEAT_3_89(m, d) m(4, 89, d)
+# define BOOST_PP_REPEAT_3_91(m, d) BOOST_PP_REPEAT_3_90(m, d) m(4, 90, d)
+# define BOOST_PP_REPEAT_3_92(m, d) BOOST_PP_REPEAT_3_91(m, d) m(4, 91, d)
+# define BOOST_PP_REPEAT_3_93(m, d) BOOST_PP_REPEAT_3_92(m, d) m(4, 92, d)
+# define BOOST_PP_REPEAT_3_94(m, d) BOOST_PP_REPEAT_3_93(m, d) m(4, 93, d)
+# define BOOST_PP_REPEAT_3_95(m, d) BOOST_PP_REPEAT_3_94(m, d) m(4, 94, d)
+# define BOOST_PP_REPEAT_3_96(m, d) BOOST_PP_REPEAT_3_95(m, d) m(4, 95, d)
+# define BOOST_PP_REPEAT_3_97(m, d) BOOST_PP_REPEAT_3_96(m, d) m(4, 96, d)
+# define BOOST_PP_REPEAT_3_98(m, d) BOOST_PP_REPEAT_3_97(m, d) m(4, 97, d)
+# define BOOST_PP_REPEAT_3_99(m, d) BOOST_PP_REPEAT_3_98(m, d) m(4, 98, d)
+# define BOOST_PP_REPEAT_3_100(m, d) BOOST_PP_REPEAT_3_99(m, d) m(4, 99, d)
+# define BOOST_PP_REPEAT_3_101(m, d) BOOST_PP_REPEAT_3_100(m, d) m(4, 100, d)
+# define BOOST_PP_REPEAT_3_102(m, d) BOOST_PP_REPEAT_3_101(m, d) m(4, 101, d)
+# define BOOST_PP_REPEAT_3_103(m, d) BOOST_PP_REPEAT_3_102(m, d) m(4, 102, d)
+# define BOOST_PP_REPEAT_3_104(m, d) BOOST_PP_REPEAT_3_103(m, d) m(4, 103, d)
+# define BOOST_PP_REPEAT_3_105(m, d) BOOST_PP_REPEAT_3_104(m, d) m(4, 104, d)
+# define BOOST_PP_REPEAT_3_106(m, d) BOOST_PP_REPEAT_3_105(m, d) m(4, 105, d)
+# define BOOST_PP_REPEAT_3_107(m, d) BOOST_PP_REPEAT_3_106(m, d) m(4, 106, d)
+# define BOOST_PP_REPEAT_3_108(m, d) BOOST_PP_REPEAT_3_107(m, d) m(4, 107, d)
+# define BOOST_PP_REPEAT_3_109(m, d) BOOST_PP_REPEAT_3_108(m, d) m(4, 108, d)
+# define BOOST_PP_REPEAT_3_110(m, d) BOOST_PP_REPEAT_3_109(m, d) m(4, 109, d)
+# define BOOST_PP_REPEAT_3_111(m, d) BOOST_PP_REPEAT_3_110(m, d) m(4, 110, d)
+# define BOOST_PP_REPEAT_3_112(m, d) BOOST_PP_REPEAT_3_111(m, d) m(4, 111, d)
+# define BOOST_PP_REPEAT_3_113(m, d) BOOST_PP_REPEAT_3_112(m, d) m(4, 112, d)
+# define BOOST_PP_REPEAT_3_114(m, d) BOOST_PP_REPEAT_3_113(m, d) m(4, 113, d)
+# define BOOST_PP_REPEAT_3_115(m, d) BOOST_PP_REPEAT_3_114(m, d) m(4, 114, d)
+# define BOOST_PP_REPEAT_3_116(m, d) BOOST_PP_REPEAT_3_115(m, d) m(4, 115, d)
+# define BOOST_PP_REPEAT_3_117(m, d) BOOST_PP_REPEAT_3_116(m, d) m(4, 116, d)
+# define BOOST_PP_REPEAT_3_118(m, d) BOOST_PP_REPEAT_3_117(m, d) m(4, 117, d)
+# define BOOST_PP_REPEAT_3_119(m, d) BOOST_PP_REPEAT_3_118(m, d) m(4, 118, d)
+# define BOOST_PP_REPEAT_3_120(m, d) BOOST_PP_REPEAT_3_119(m, d) m(4, 119, d)
+# define BOOST_PP_REPEAT_3_121(m, d) BOOST_PP_REPEAT_3_120(m, d) m(4, 120, d)
+# define BOOST_PP_REPEAT_3_122(m, d) BOOST_PP_REPEAT_3_121(m, d) m(4, 121, d)
+# define BOOST_PP_REPEAT_3_123(m, d) BOOST_PP_REPEAT_3_122(m, d) m(4, 122, d)
+# define BOOST_PP_REPEAT_3_124(m, d) BOOST_PP_REPEAT_3_123(m, d) m(4, 123, d)
+# define BOOST_PP_REPEAT_3_125(m, d) BOOST_PP_REPEAT_3_124(m, d) m(4, 124, d)
+# define BOOST_PP_REPEAT_3_126(m, d) BOOST_PP_REPEAT_3_125(m, d) m(4, 125, d)
+# define BOOST_PP_REPEAT_3_127(m, d) BOOST_PP_REPEAT_3_126(m, d) m(4, 126, d)
+# define BOOST_PP_REPEAT_3_128(m, d) BOOST_PP_REPEAT_3_127(m, d) m(4, 127, d)
+# define BOOST_PP_REPEAT_3_129(m, d) BOOST_PP_REPEAT_3_128(m, d) m(4, 128, d)
+# define BOOST_PP_REPEAT_3_130(m, d) BOOST_PP_REPEAT_3_129(m, d) m(4, 129, d)
+# define BOOST_PP_REPEAT_3_131(m, d) BOOST_PP_REPEAT_3_130(m, d) m(4, 130, d)
+# define BOOST_PP_REPEAT_3_132(m, d) BOOST_PP_REPEAT_3_131(m, d) m(4, 131, d)
+# define BOOST_PP_REPEAT_3_133(m, d) BOOST_PP_REPEAT_3_132(m, d) m(4, 132, d)
+# define BOOST_PP_REPEAT_3_134(m, d) BOOST_PP_REPEAT_3_133(m, d) m(4, 133, d)
+# define BOOST_PP_REPEAT_3_135(m, d) BOOST_PP_REPEAT_3_134(m, d) m(4, 134, d)
+# define BOOST_PP_REPEAT_3_136(m, d) BOOST_PP_REPEAT_3_135(m, d) m(4, 135, d)
+# define BOOST_PP_REPEAT_3_137(m, d) BOOST_PP_REPEAT_3_136(m, d) m(4, 136, d)
+# define BOOST_PP_REPEAT_3_138(m, d) BOOST_PP_REPEAT_3_137(m, d) m(4, 137, d)
+# define BOOST_PP_REPEAT_3_139(m, d) BOOST_PP_REPEAT_3_138(m, d) m(4, 138, d)
+# define BOOST_PP_REPEAT_3_140(m, d) BOOST_PP_REPEAT_3_139(m, d) m(4, 139, d)
+# define BOOST_PP_REPEAT_3_141(m, d) BOOST_PP_REPEAT_3_140(m, d) m(4, 140, d)
+# define BOOST_PP_REPEAT_3_142(m, d) BOOST_PP_REPEAT_3_141(m, d) m(4, 141, d)
+# define BOOST_PP_REPEAT_3_143(m, d) BOOST_PP_REPEAT_3_142(m, d) m(4, 142, d)
+# define BOOST_PP_REPEAT_3_144(m, d) BOOST_PP_REPEAT_3_143(m, d) m(4, 143, d)
+# define BOOST_PP_REPEAT_3_145(m, d) BOOST_PP_REPEAT_3_144(m, d) m(4, 144, d)
+# define BOOST_PP_REPEAT_3_146(m, d) BOOST_PP_REPEAT_3_145(m, d) m(4, 145, d)
+# define BOOST_PP_REPEAT_3_147(m, d) BOOST_PP_REPEAT_3_146(m, d) m(4, 146, d)
+# define BOOST_PP_REPEAT_3_148(m, d) BOOST_PP_REPEAT_3_147(m, d) m(4, 147, d)
+# define BOOST_PP_REPEAT_3_149(m, d) BOOST_PP_REPEAT_3_148(m, d) m(4, 148, d)
+# define BOOST_PP_REPEAT_3_150(m, d) BOOST_PP_REPEAT_3_149(m, d) m(4, 149, d)
+# define BOOST_PP_REPEAT_3_151(m, d) BOOST_PP_REPEAT_3_150(m, d) m(4, 150, d)
+# define BOOST_PP_REPEAT_3_152(m, d) BOOST_PP_REPEAT_3_151(m, d) m(4, 151, d)
+# define BOOST_PP_REPEAT_3_153(m, d) BOOST_PP_REPEAT_3_152(m, d) m(4, 152, d)
+# define BOOST_PP_REPEAT_3_154(m, d) BOOST_PP_REPEAT_3_153(m, d) m(4, 153, d)
+# define BOOST_PP_REPEAT_3_155(m, d) BOOST_PP_REPEAT_3_154(m, d) m(4, 154, d)
+# define BOOST_PP_REPEAT_3_156(m, d) BOOST_PP_REPEAT_3_155(m, d) m(4, 155, d)
+# define BOOST_PP_REPEAT_3_157(m, d) BOOST_PP_REPEAT_3_156(m, d) m(4, 156, d)
+# define BOOST_PP_REPEAT_3_158(m, d) BOOST_PP_REPEAT_3_157(m, d) m(4, 157, d)
+# define BOOST_PP_REPEAT_3_159(m, d) BOOST_PP_REPEAT_3_158(m, d) m(4, 158, d)
+# define BOOST_PP_REPEAT_3_160(m, d) BOOST_PP_REPEAT_3_159(m, d) m(4, 159, d)
+# define BOOST_PP_REPEAT_3_161(m, d) BOOST_PP_REPEAT_3_160(m, d) m(4, 160, d)
+# define BOOST_PP_REPEAT_3_162(m, d) BOOST_PP_REPEAT_3_161(m, d) m(4, 161, d)
+# define BOOST_PP_REPEAT_3_163(m, d) BOOST_PP_REPEAT_3_162(m, d) m(4, 162, d)
+# define BOOST_PP_REPEAT_3_164(m, d) BOOST_PP_REPEAT_3_163(m, d) m(4, 163, d)
+# define BOOST_PP_REPEAT_3_165(m, d) BOOST_PP_REPEAT_3_164(m, d) m(4, 164, d)
+# define BOOST_PP_REPEAT_3_166(m, d) BOOST_PP_REPEAT_3_165(m, d) m(4, 165, d)
+# define BOOST_PP_REPEAT_3_167(m, d) BOOST_PP_REPEAT_3_166(m, d) m(4, 166, d)
+# define BOOST_PP_REPEAT_3_168(m, d) BOOST_PP_REPEAT_3_167(m, d) m(4, 167, d)
+# define BOOST_PP_REPEAT_3_169(m, d) BOOST_PP_REPEAT_3_168(m, d) m(4, 168, d)
+# define BOOST_PP_REPEAT_3_170(m, d) BOOST_PP_REPEAT_3_169(m, d) m(4, 169, d)
+# define BOOST_PP_REPEAT_3_171(m, d) BOOST_PP_REPEAT_3_170(m, d) m(4, 170, d)
+# define BOOST_PP_REPEAT_3_172(m, d) BOOST_PP_REPEAT_3_171(m, d) m(4, 171, d)
+# define BOOST_PP_REPEAT_3_173(m, d) BOOST_PP_REPEAT_3_172(m, d) m(4, 172, d)
+# define BOOST_PP_REPEAT_3_174(m, d) BOOST_PP_REPEAT_3_173(m, d) m(4, 173, d)
+# define BOOST_PP_REPEAT_3_175(m, d) BOOST_PP_REPEAT_3_174(m, d) m(4, 174, d)
+# define BOOST_PP_REPEAT_3_176(m, d) BOOST_PP_REPEAT_3_175(m, d) m(4, 175, d)
+# define BOOST_PP_REPEAT_3_177(m, d) BOOST_PP_REPEAT_3_176(m, d) m(4, 176, d)
+# define BOOST_PP_REPEAT_3_178(m, d) BOOST_PP_REPEAT_3_177(m, d) m(4, 177, d)
+# define BOOST_PP_REPEAT_3_179(m, d) BOOST_PP_REPEAT_3_178(m, d) m(4, 178, d)
+# define BOOST_PP_REPEAT_3_180(m, d) BOOST_PP_REPEAT_3_179(m, d) m(4, 179, d)
+# define BOOST_PP_REPEAT_3_181(m, d) BOOST_PP_REPEAT_3_180(m, d) m(4, 180, d)
+# define BOOST_PP_REPEAT_3_182(m, d) BOOST_PP_REPEAT_3_181(m, d) m(4, 181, d)
+# define BOOST_PP_REPEAT_3_183(m, d) BOOST_PP_REPEAT_3_182(m, d) m(4, 182, d)
+# define BOOST_PP_REPEAT_3_184(m, d) BOOST_PP_REPEAT_3_183(m, d) m(4, 183, d)
+# define BOOST_PP_REPEAT_3_185(m, d) BOOST_PP_REPEAT_3_184(m, d) m(4, 184, d)
+# define BOOST_PP_REPEAT_3_186(m, d) BOOST_PP_REPEAT_3_185(m, d) m(4, 185, d)
+# define BOOST_PP_REPEAT_3_187(m, d) BOOST_PP_REPEAT_3_186(m, d) m(4, 186, d)
+# define BOOST_PP_REPEAT_3_188(m, d) BOOST_PP_REPEAT_3_187(m, d) m(4, 187, d)
+# define BOOST_PP_REPEAT_3_189(m, d) BOOST_PP_REPEAT_3_188(m, d) m(4, 188, d)
+# define BOOST_PP_REPEAT_3_190(m, d) BOOST_PP_REPEAT_3_189(m, d) m(4, 189, d)
+# define BOOST_PP_REPEAT_3_191(m, d) BOOST_PP_REPEAT_3_190(m, d) m(4, 190, d)
+# define BOOST_PP_REPEAT_3_192(m, d) BOOST_PP_REPEAT_3_191(m, d) m(4, 191, d)
+# define BOOST_PP_REPEAT_3_193(m, d) BOOST_PP_REPEAT_3_192(m, d) m(4, 192, d)
+# define BOOST_PP_REPEAT_3_194(m, d) BOOST_PP_REPEAT_3_193(m, d) m(4, 193, d)
+# define BOOST_PP_REPEAT_3_195(m, d) BOOST_PP_REPEAT_3_194(m, d) m(4, 194, d)
+# define BOOST_PP_REPEAT_3_196(m, d) BOOST_PP_REPEAT_3_195(m, d) m(4, 195, d)
+# define BOOST_PP_REPEAT_3_197(m, d) BOOST_PP_REPEAT_3_196(m, d) m(4, 196, d)
+# define BOOST_PP_REPEAT_3_198(m, d) BOOST_PP_REPEAT_3_197(m, d) m(4, 197, d)
+# define BOOST_PP_REPEAT_3_199(m, d) BOOST_PP_REPEAT_3_198(m, d) m(4, 198, d)
+# define BOOST_PP_REPEAT_3_200(m, d) BOOST_PP_REPEAT_3_199(m, d) m(4, 199, d)
+# define BOOST_PP_REPEAT_3_201(m, d) BOOST_PP_REPEAT_3_200(m, d) m(4, 200, d)
+# define BOOST_PP_REPEAT_3_202(m, d) BOOST_PP_REPEAT_3_201(m, d) m(4, 201, d)
+# define BOOST_PP_REPEAT_3_203(m, d) BOOST_PP_REPEAT_3_202(m, d) m(4, 202, d)
+# define BOOST_PP_REPEAT_3_204(m, d) BOOST_PP_REPEAT_3_203(m, d) m(4, 203, d)
+# define BOOST_PP_REPEAT_3_205(m, d) BOOST_PP_REPEAT_3_204(m, d) m(4, 204, d)
+# define BOOST_PP_REPEAT_3_206(m, d) BOOST_PP_REPEAT_3_205(m, d) m(4, 205, d)
+# define BOOST_PP_REPEAT_3_207(m, d) BOOST_PP_REPEAT_3_206(m, d) m(4, 206, d)
+# define BOOST_PP_REPEAT_3_208(m, d) BOOST_PP_REPEAT_3_207(m, d) m(4, 207, d)
+# define BOOST_PP_REPEAT_3_209(m, d) BOOST_PP_REPEAT_3_208(m, d) m(4, 208, d)
+# define BOOST_PP_REPEAT_3_210(m, d) BOOST_PP_REPEAT_3_209(m, d) m(4, 209, d)
+# define BOOST_PP_REPEAT_3_211(m, d) BOOST_PP_REPEAT_3_210(m, d) m(4, 210, d)
+# define BOOST_PP_REPEAT_3_212(m, d) BOOST_PP_REPEAT_3_211(m, d) m(4, 211, d)
+# define BOOST_PP_REPEAT_3_213(m, d) BOOST_PP_REPEAT_3_212(m, d) m(4, 212, d)
+# define BOOST_PP_REPEAT_3_214(m, d) BOOST_PP_REPEAT_3_213(m, d) m(4, 213, d)
+# define BOOST_PP_REPEAT_3_215(m, d) BOOST_PP_REPEAT_3_214(m, d) m(4, 214, d)
+# define BOOST_PP_REPEAT_3_216(m, d) BOOST_PP_REPEAT_3_215(m, d) m(4, 215, d)
+# define BOOST_PP_REPEAT_3_217(m, d) BOOST_PP_REPEAT_3_216(m, d) m(4, 216, d)
+# define BOOST_PP_REPEAT_3_218(m, d) BOOST_PP_REPEAT_3_217(m, d) m(4, 217, d)
+# define BOOST_PP_REPEAT_3_219(m, d) BOOST_PP_REPEAT_3_218(m, d) m(4, 218, d)
+# define BOOST_PP_REPEAT_3_220(m, d) BOOST_PP_REPEAT_3_219(m, d) m(4, 219, d)
+# define BOOST_PP_REPEAT_3_221(m, d) BOOST_PP_REPEAT_3_220(m, d) m(4, 220, d)
+# define BOOST_PP_REPEAT_3_222(m, d) BOOST_PP_REPEAT_3_221(m, d) m(4, 221, d)
+# define BOOST_PP_REPEAT_3_223(m, d) BOOST_PP_REPEAT_3_222(m, d) m(4, 222, d)
+# define BOOST_PP_REPEAT_3_224(m, d) BOOST_PP_REPEAT_3_223(m, d) m(4, 223, d)
+# define BOOST_PP_REPEAT_3_225(m, d) BOOST_PP_REPEAT_3_224(m, d) m(4, 224, d)
+# define BOOST_PP_REPEAT_3_226(m, d) BOOST_PP_REPEAT_3_225(m, d) m(4, 225, d)
+# define BOOST_PP_REPEAT_3_227(m, d) BOOST_PP_REPEAT_3_226(m, d) m(4, 226, d)
+# define BOOST_PP_REPEAT_3_228(m, d) BOOST_PP_REPEAT_3_227(m, d) m(4, 227, d)
+# define BOOST_PP_REPEAT_3_229(m, d) BOOST_PP_REPEAT_3_228(m, d) m(4, 228, d)
+# define BOOST_PP_REPEAT_3_230(m, d) BOOST_PP_REPEAT_3_229(m, d) m(4, 229, d)
+# define BOOST_PP_REPEAT_3_231(m, d) BOOST_PP_REPEAT_3_230(m, d) m(4, 230, d)
+# define BOOST_PP_REPEAT_3_232(m, d) BOOST_PP_REPEAT_3_231(m, d) m(4, 231, d)
+# define BOOST_PP_REPEAT_3_233(m, d) BOOST_PP_REPEAT_3_232(m, d) m(4, 232, d)
+# define BOOST_PP_REPEAT_3_234(m, d) BOOST_PP_REPEAT_3_233(m, d) m(4, 233, d)
+# define BOOST_PP_REPEAT_3_235(m, d) BOOST_PP_REPEAT_3_234(m, d) m(4, 234, d)
+# define BOOST_PP_REPEAT_3_236(m, d) BOOST_PP_REPEAT_3_235(m, d) m(4, 235, d)
+# define BOOST_PP_REPEAT_3_237(m, d) BOOST_PP_REPEAT_3_236(m, d) m(4, 236, d)
+# define BOOST_PP_REPEAT_3_238(m, d) BOOST_PP_REPEAT_3_237(m, d) m(4, 237, d)
+# define BOOST_PP_REPEAT_3_239(m, d) BOOST_PP_REPEAT_3_238(m, d) m(4, 238, d)
+# define BOOST_PP_REPEAT_3_240(m, d) BOOST_PP_REPEAT_3_239(m, d) m(4, 239, d)
+# define BOOST_PP_REPEAT_3_241(m, d) BOOST_PP_REPEAT_3_240(m, d) m(4, 240, d)
+# define BOOST_PP_REPEAT_3_242(m, d) BOOST_PP_REPEAT_3_241(m, d) m(4, 241, d)
+# define BOOST_PP_REPEAT_3_243(m, d) BOOST_PP_REPEAT_3_242(m, d) m(4, 242, d)
+# define BOOST_PP_REPEAT_3_244(m, d) BOOST_PP_REPEAT_3_243(m, d) m(4, 243, d)
+# define BOOST_PP_REPEAT_3_245(m, d) BOOST_PP_REPEAT_3_244(m, d) m(4, 244, d)
+# define BOOST_PP_REPEAT_3_246(m, d) BOOST_PP_REPEAT_3_245(m, d) m(4, 245, d)
+# define BOOST_PP_REPEAT_3_247(m, d) BOOST_PP_REPEAT_3_246(m, d) m(4, 246, d)
+# define BOOST_PP_REPEAT_3_248(m, d) BOOST_PP_REPEAT_3_247(m, d) m(4, 247, d)
+# define BOOST_PP_REPEAT_3_249(m, d) BOOST_PP_REPEAT_3_248(m, d) m(4, 248, d)
+# define BOOST_PP_REPEAT_3_250(m, d) BOOST_PP_REPEAT_3_249(m, d) m(4, 249, d)
+# define BOOST_PP_REPEAT_3_251(m, d) BOOST_PP_REPEAT_3_250(m, d) m(4, 250, d)
+# define BOOST_PP_REPEAT_3_252(m, d) BOOST_PP_REPEAT_3_251(m, d) m(4, 251, d)
+# define BOOST_PP_REPEAT_3_253(m, d) BOOST_PP_REPEAT_3_252(m, d) m(4, 252, d)
+# define BOOST_PP_REPEAT_3_254(m, d) BOOST_PP_REPEAT_3_253(m, d) m(4, 253, d)
+# define BOOST_PP_REPEAT_3_255(m, d) BOOST_PP_REPEAT_3_254(m, d) m(4, 254, d)
+# define BOOST_PP_REPEAT_3_256(m, d) BOOST_PP_REPEAT_3_255(m, d) m(4, 255, d)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/repetition/repeat_from_to.hpp b/gatb-core/thirdparty/boost/preprocessor/repetition/repeat_from_to.hpp
new file mode 100644
index 0000000..efe539e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/repetition/repeat_from_to.hpp
@@ -0,0 +1,87 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP
+# define BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP
+#
+# include <boost/preprocessor/arithmetic/add.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/while.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_REPEAT_FROM_TO */
+#
+# if 0
+#    define BOOST_PP_REPEAT_FROM_TO(first, last, macro, data)
+# endif
+#
+# define BOOST_PP_REPEAT_FROM_TO BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# define BOOST_PP_REPEAT_FROM_TO_1(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)
+# define BOOST_PP_REPEAT_FROM_TO_2(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)
+# define BOOST_PP_REPEAT_FROM_TO_3(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)
+# define BOOST_PP_REPEAT_FROM_TO_4(f, l, m, dt) BOOST_PP_ERROR(0x0003)
+#
+# define BOOST_PP_REPEAT_FROM_TO_1ST BOOST_PP_REPEAT_FROM_TO_1
+# define BOOST_PP_REPEAT_FROM_TO_2ND BOOST_PP_REPEAT_FROM_TO_2
+# define BOOST_PP_REPEAT_FROM_TO_3RD BOOST_PP_REPEAT_FROM_TO_3
+#
+# /* BOOST_PP_REPEAT_FROM_TO_D */
+#
+# if 0
+#    define BOOST_PP_REPEAT_FROM_TO_D(d, first, last, macro, data)
+# endif
+#
+# define BOOST_PP_REPEAT_FROM_TO_D BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_D_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))
+#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))
+#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))
+# else
+#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt)
+#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt)
+#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt)
+#    define BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))
+#    define BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))
+#    define BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)
+#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)
+#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)
+#    define BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, im)
+#    define BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, im)
+#    define BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, im)
+# else
+#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))
+#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))
+#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))
+# endif
+#
+# define BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_1_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)
+# define BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_2_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)
+# define BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_3_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)
+#
+# define BOOST_PP_REPEAT_FROM_TO_M_1_II(z, n, m, dt) m(z, n, dt)
+# define BOOST_PP_REPEAT_FROM_TO_M_2_II(z, n, m, dt) m(z, n, dt)
+# define BOOST_PP_REPEAT_FROM_TO_M_3_II(z, n, m, dt) m(z, n, dt)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/selection.hpp b/gatb-core/thirdparty/boost/preprocessor/selection.hpp
new file mode 100644
index 0000000..3b67fad
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/selection.hpp
@@ -0,0 +1,18 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SELECTION_HPP
+# define BOOST_PREPROCESSOR_SELECTION_HPP
+#
+# include <boost/preprocessor/selection/max.hpp>
+# include <boost/preprocessor/selection/min.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/selection/max.hpp b/gatb-core/thirdparty/boost/preprocessor/selection/max.hpp
new file mode 100644
index 0000000..407d702
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/selection/max.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SELECTION_MAX_HPP
+# define BOOST_PREPROCESSOR_SELECTION_MAX_HPP
+#
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+#
+# /* BOOST_PP_MAX */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MAX(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)
+# else
+#    define BOOST_PP_MAX(x, y) BOOST_PP_MAX_I(x, y)
+#    define BOOST_PP_MAX_I(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)
+# endif
+#
+# /* BOOST_PP_MAX_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)
+# else
+#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_MAX_D_I(d, x, y)
+#    define BOOST_PP_MAX_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/selection/min.hpp b/gatb-core/thirdparty/boost/preprocessor/selection/min.hpp
new file mode 100644
index 0000000..ee05588
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/selection/min.hpp
@@ -0,0 +1,39 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SELECTION_MIN_HPP
+# define BOOST_PREPROCESSOR_SELECTION_MIN_HPP
+#
+# include <boost/preprocessor/comparison/less_equal.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+#
+# /* BOOST_PP_MIN */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MIN(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(y, x), y, x)
+# else
+#    define BOOST_PP_MIN(x, y) BOOST_PP_MIN_I(x, y)
+#    define BOOST_PP_MIN_I(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(y, x), y, x)
+# endif
+#
+# /* BOOST_PP_MIN_D */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_MIN_D(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, y, x), y, x)
+# else
+#    define BOOST_PP_MIN_D(d, x, y) BOOST_PP_MIN_D_I(d, x, y)
+#    define BOOST_PP_MIN_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, y, x), y, x)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq.hpp b/gatb-core/thirdparty/boost/preprocessor/seq.hpp
new file mode 100644
index 0000000..6d78f43
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq.hpp
@@ -0,0 +1,43 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_HPP
+# define BOOST_PREPROCESSOR_SEQ_HPP
+#
+# include <boost/preprocessor/seq/cat.hpp>
+# include <boost/preprocessor/seq/elem.hpp>
+# include <boost/preprocessor/seq/enum.hpp>
+# include <boost/preprocessor/seq/filter.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/fold_right.hpp>
+# include <boost/preprocessor/seq/for_each.hpp>
+# include <boost/preprocessor/seq/for_each_i.hpp>
+# include <boost/preprocessor/seq/for_each_product.hpp>
+# include <boost/preprocessor/seq/insert.hpp>
+# include <boost/preprocessor/seq/pop_back.hpp>
+# include <boost/preprocessor/seq/pop_front.hpp>
+# include <boost/preprocessor/seq/push_back.hpp>
+# include <boost/preprocessor/seq/push_front.hpp>
+# include <boost/preprocessor/seq/remove.hpp>
+# include <boost/preprocessor/seq/replace.hpp>
+# include <boost/preprocessor/seq/rest_n.hpp>
+# include <boost/preprocessor/seq/reverse.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/seq/subseq.hpp>
+# include <boost/preprocessor/seq/to_array.hpp>
+# include <boost/preprocessor/seq/to_list.hpp>
+# include <boost/preprocessor/seq/to_tuple.hpp>
+# include <boost/preprocessor/seq/transform.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/cat.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/cat.hpp
new file mode 100644
index 0000000..b6b09ff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/cat.hpp
@@ -0,0 +1,49 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_CAT_HPP
+# define BOOST_PREPROCESSOR_SEQ_CAT_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+#
+# /* BOOST_PP_SEQ_CAT */
+#
+# define BOOST_PP_SEQ_CAT(seq) \
+    BOOST_PP_IF( \
+        BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), \
+        BOOST_PP_SEQ_CAT_I, \
+        BOOST_PP_SEQ_HEAD \
+    )(seq) \
+    /**/
+# define BOOST_PP_SEQ_CAT_I(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_CAT_O, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))
+#
+# define BOOST_PP_SEQ_CAT_O(s, st, elem) BOOST_PP_SEQ_CAT_O_I(st, elem)
+# define BOOST_PP_SEQ_CAT_O_I(a, b) a ## b
+#
+# /* BOOST_PP_SEQ_CAT_S */
+#
+# define BOOST_PP_SEQ_CAT_S(s, seq) \
+    BOOST_PP_IF( \
+        BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), \
+        BOOST_PP_SEQ_CAT_S_I_A, \
+        BOOST_PP_SEQ_CAT_S_I_B \
+    )(s, seq) \
+    /**/
+# define BOOST_PP_SEQ_CAT_S_I_A(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_CAT_O, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))
+# define BOOST_PP_SEQ_CAT_S_I_B(s, seq) BOOST_PP_SEQ_HEAD(seq)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/detail/binary_transform.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/detail/binary_transform.hpp
new file mode 100644
index 0000000..373e8a5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/detail/binary_transform.hpp
@@ -0,0 +1,40 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP
+# define BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_BINARY_TRANSFORM */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_I(, seq)
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_I(p, seq) BOOST_PP_SEQ_BINARY_TRANSFORM_II(p ## seq)
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_II(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq)
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
+# else
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
+# endif
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
+# else
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_A(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
+#    define BOOST_PP_SEQ_BINARY_TRANSFORM_B(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
+# endif
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_A0 (BOOST_PP_EAT, ?)
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_B0 (BOOST_PP_EAT, ?)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/detail/split.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/detail/split.hpp
new file mode 100644
index 0000000..7c33931
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/detail/split.hpp
@@ -0,0 +1,284 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP
+# define BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_SEQ_SPLIT */
+#
+# define BOOST_PP_SEQ_SPLIT(n, seq) BOOST_PP_SEQ_SPLIT_D(n, seq)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n seq)
+# else
+#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n ## seq)
+# endif
+#
+# define BOOST_PP_SEQ_SPLIT_1(x) (x),
+# define BOOST_PP_SEQ_SPLIT_2(x) (x) BOOST_PP_SEQ_SPLIT_1
+# define BOOST_PP_SEQ_SPLIT_3(x) (x) BOOST_PP_SEQ_SPLIT_2
+# define BOOST_PP_SEQ_SPLIT_4(x) (x) BOOST_PP_SEQ_SPLIT_3
+# define BOOST_PP_SEQ_SPLIT_5(x) (x) BOOST_PP_SEQ_SPLIT_4
+# define BOOST_PP_SEQ_SPLIT_6(x) (x) BOOST_PP_SEQ_SPLIT_5
+# define BOOST_PP_SEQ_SPLIT_7(x) (x) BOOST_PP_SEQ_SPLIT_6
+# define BOOST_PP_SEQ_SPLIT_8(x) (x) BOOST_PP_SEQ_SPLIT_7
+# define BOOST_PP_SEQ_SPLIT_9(x) (x) BOOST_PP_SEQ_SPLIT_8
+# define BOOST_PP_SEQ_SPLIT_10(x) (x) BOOST_PP_SEQ_SPLIT_9
+# define BOOST_PP_SEQ_SPLIT_11(x) (x) BOOST_PP_SEQ_SPLIT_10
+# define BOOST_PP_SEQ_SPLIT_12(x) (x) BOOST_PP_SEQ_SPLIT_11
+# define BOOST_PP_SEQ_SPLIT_13(x) (x) BOOST_PP_SEQ_SPLIT_12
+# define BOOST_PP_SEQ_SPLIT_14(x) (x) BOOST_PP_SEQ_SPLIT_13
+# define BOOST_PP_SEQ_SPLIT_15(x) (x) BOOST_PP_SEQ_SPLIT_14
+# define BOOST_PP_SEQ_SPLIT_16(x) (x) BOOST_PP_SEQ_SPLIT_15
+# define BOOST_PP_SEQ_SPLIT_17(x) (x) BOOST_PP_SEQ_SPLIT_16
+# define BOOST_PP_SEQ_SPLIT_18(x) (x) BOOST_PP_SEQ_SPLIT_17
+# define BOOST_PP_SEQ_SPLIT_19(x) (x) BOOST_PP_SEQ_SPLIT_18
+# define BOOST_PP_SEQ_SPLIT_20(x) (x) BOOST_PP_SEQ_SPLIT_19
+# define BOOST_PP_SEQ_SPLIT_21(x) (x) BOOST_PP_SEQ_SPLIT_20
+# define BOOST_PP_SEQ_SPLIT_22(x) (x) BOOST_PP_SEQ_SPLIT_21
+# define BOOST_PP_SEQ_SPLIT_23(x) (x) BOOST_PP_SEQ_SPLIT_22
+# define BOOST_PP_SEQ_SPLIT_24(x) (x) BOOST_PP_SEQ_SPLIT_23
+# define BOOST_PP_SEQ_SPLIT_25(x) (x) BOOST_PP_SEQ_SPLIT_24
+# define BOOST_PP_SEQ_SPLIT_26(x) (x) BOOST_PP_SEQ_SPLIT_25
+# define BOOST_PP_SEQ_SPLIT_27(x) (x) BOOST_PP_SEQ_SPLIT_26
+# define BOOST_PP_SEQ_SPLIT_28(x) (x) BOOST_PP_SEQ_SPLIT_27
+# define BOOST_PP_SEQ_SPLIT_29(x) (x) BOOST_PP_SEQ_SPLIT_28
+# define BOOST_PP_SEQ_SPLIT_30(x) (x) BOOST_PP_SEQ_SPLIT_29
+# define BOOST_PP_SEQ_SPLIT_31(x) (x) BOOST_PP_SEQ_SPLIT_30
+# define BOOST_PP_SEQ_SPLIT_32(x) (x) BOOST_PP_SEQ_SPLIT_31
+# define BOOST_PP_SEQ_SPLIT_33(x) (x) BOOST_PP_SEQ_SPLIT_32
+# define BOOST_PP_SEQ_SPLIT_34(x) (x) BOOST_PP_SEQ_SPLIT_33
+# define BOOST_PP_SEQ_SPLIT_35(x) (x) BOOST_PP_SEQ_SPLIT_34
+# define BOOST_PP_SEQ_SPLIT_36(x) (x) BOOST_PP_SEQ_SPLIT_35
+# define BOOST_PP_SEQ_SPLIT_37(x) (x) BOOST_PP_SEQ_SPLIT_36
+# define BOOST_PP_SEQ_SPLIT_38(x) (x) BOOST_PP_SEQ_SPLIT_37
+# define BOOST_PP_SEQ_SPLIT_39(x) (x) BOOST_PP_SEQ_SPLIT_38
+# define BOOST_PP_SEQ_SPLIT_40(x) (x) BOOST_PP_SEQ_SPLIT_39
+# define BOOST_PP_SEQ_SPLIT_41(x) (x) BOOST_PP_SEQ_SPLIT_40
+# define BOOST_PP_SEQ_SPLIT_42(x) (x) BOOST_PP_SEQ_SPLIT_41
+# define BOOST_PP_SEQ_SPLIT_43(x) (x) BOOST_PP_SEQ_SPLIT_42
+# define BOOST_PP_SEQ_SPLIT_44(x) (x) BOOST_PP_SEQ_SPLIT_43
+# define BOOST_PP_SEQ_SPLIT_45(x) (x) BOOST_PP_SEQ_SPLIT_44
+# define BOOST_PP_SEQ_SPLIT_46(x) (x) BOOST_PP_SEQ_SPLIT_45
+# define BOOST_PP_SEQ_SPLIT_47(x) (x) BOOST_PP_SEQ_SPLIT_46
+# define BOOST_PP_SEQ_SPLIT_48(x) (x) BOOST_PP_SEQ_SPLIT_47
+# define BOOST_PP_SEQ_SPLIT_49(x) (x) BOOST_PP_SEQ_SPLIT_48
+# define BOOST_PP_SEQ_SPLIT_50(x) (x) BOOST_PP_SEQ_SPLIT_49
+# define BOOST_PP_SEQ_SPLIT_51(x) (x) BOOST_PP_SEQ_SPLIT_50
+# define BOOST_PP_SEQ_SPLIT_52(x) (x) BOOST_PP_SEQ_SPLIT_51
+# define BOOST_PP_SEQ_SPLIT_53(x) (x) BOOST_PP_SEQ_SPLIT_52
+# define BOOST_PP_SEQ_SPLIT_54(x) (x) BOOST_PP_SEQ_SPLIT_53
+# define BOOST_PP_SEQ_SPLIT_55(x) (x) BOOST_PP_SEQ_SPLIT_54
+# define BOOST_PP_SEQ_SPLIT_56(x) (x) BOOST_PP_SEQ_SPLIT_55
+# define BOOST_PP_SEQ_SPLIT_57(x) (x) BOOST_PP_SEQ_SPLIT_56
+# define BOOST_PP_SEQ_SPLIT_58(x) (x) BOOST_PP_SEQ_SPLIT_57
+# define BOOST_PP_SEQ_SPLIT_59(x) (x) BOOST_PP_SEQ_SPLIT_58
+# define BOOST_PP_SEQ_SPLIT_60(x) (x) BOOST_PP_SEQ_SPLIT_59
+# define BOOST_PP_SEQ_SPLIT_61(x) (x) BOOST_PP_SEQ_SPLIT_60
+# define BOOST_PP_SEQ_SPLIT_62(x) (x) BOOST_PP_SEQ_SPLIT_61
+# define BOOST_PP_SEQ_SPLIT_63(x) (x) BOOST_PP_SEQ_SPLIT_62
+# define BOOST_PP_SEQ_SPLIT_64(x) (x) BOOST_PP_SEQ_SPLIT_63
+# define BOOST_PP_SEQ_SPLIT_65(x) (x) BOOST_PP_SEQ_SPLIT_64
+# define BOOST_PP_SEQ_SPLIT_66(x) (x) BOOST_PP_SEQ_SPLIT_65
+# define BOOST_PP_SEQ_SPLIT_67(x) (x) BOOST_PP_SEQ_SPLIT_66
+# define BOOST_PP_SEQ_SPLIT_68(x) (x) BOOST_PP_SEQ_SPLIT_67
+# define BOOST_PP_SEQ_SPLIT_69(x) (x) BOOST_PP_SEQ_SPLIT_68
+# define BOOST_PP_SEQ_SPLIT_70(x) (x) BOOST_PP_SEQ_SPLIT_69
+# define BOOST_PP_SEQ_SPLIT_71(x) (x) BOOST_PP_SEQ_SPLIT_70
+# define BOOST_PP_SEQ_SPLIT_72(x) (x) BOOST_PP_SEQ_SPLIT_71
+# define BOOST_PP_SEQ_SPLIT_73(x) (x) BOOST_PP_SEQ_SPLIT_72
+# define BOOST_PP_SEQ_SPLIT_74(x) (x) BOOST_PP_SEQ_SPLIT_73
+# define BOOST_PP_SEQ_SPLIT_75(x) (x) BOOST_PP_SEQ_SPLIT_74
+# define BOOST_PP_SEQ_SPLIT_76(x) (x) BOOST_PP_SEQ_SPLIT_75
+# define BOOST_PP_SEQ_SPLIT_77(x) (x) BOOST_PP_SEQ_SPLIT_76
+# define BOOST_PP_SEQ_SPLIT_78(x) (x) BOOST_PP_SEQ_SPLIT_77
+# define BOOST_PP_SEQ_SPLIT_79(x) (x) BOOST_PP_SEQ_SPLIT_78
+# define BOOST_PP_SEQ_SPLIT_80(x) (x) BOOST_PP_SEQ_SPLIT_79
+# define BOOST_PP_SEQ_SPLIT_81(x) (x) BOOST_PP_SEQ_SPLIT_80
+# define BOOST_PP_SEQ_SPLIT_82(x) (x) BOOST_PP_SEQ_SPLIT_81
+# define BOOST_PP_SEQ_SPLIT_83(x) (x) BOOST_PP_SEQ_SPLIT_82
+# define BOOST_PP_SEQ_SPLIT_84(x) (x) BOOST_PP_SEQ_SPLIT_83
+# define BOOST_PP_SEQ_SPLIT_85(x) (x) BOOST_PP_SEQ_SPLIT_84
+# define BOOST_PP_SEQ_SPLIT_86(x) (x) BOOST_PP_SEQ_SPLIT_85
+# define BOOST_PP_SEQ_SPLIT_87(x) (x) BOOST_PP_SEQ_SPLIT_86
+# define BOOST_PP_SEQ_SPLIT_88(x) (x) BOOST_PP_SEQ_SPLIT_87
+# define BOOST_PP_SEQ_SPLIT_89(x) (x) BOOST_PP_SEQ_SPLIT_88
+# define BOOST_PP_SEQ_SPLIT_90(x) (x) BOOST_PP_SEQ_SPLIT_89
+# define BOOST_PP_SEQ_SPLIT_91(x) (x) BOOST_PP_SEQ_SPLIT_90
+# define BOOST_PP_SEQ_SPLIT_92(x) (x) BOOST_PP_SEQ_SPLIT_91
+# define BOOST_PP_SEQ_SPLIT_93(x) (x) BOOST_PP_SEQ_SPLIT_92
+# define BOOST_PP_SEQ_SPLIT_94(x) (x) BOOST_PP_SEQ_SPLIT_93
+# define BOOST_PP_SEQ_SPLIT_95(x) (x) BOOST_PP_SEQ_SPLIT_94
+# define BOOST_PP_SEQ_SPLIT_96(x) (x) BOOST_PP_SEQ_SPLIT_95
+# define BOOST_PP_SEQ_SPLIT_97(x) (x) BOOST_PP_SEQ_SPLIT_96
+# define BOOST_PP_SEQ_SPLIT_98(x) (x) BOOST_PP_SEQ_SPLIT_97
+# define BOOST_PP_SEQ_SPLIT_99(x) (x) BOOST_PP_SEQ_SPLIT_98
+# define BOOST_PP_SEQ_SPLIT_100(x) (x) BOOST_PP_SEQ_SPLIT_99
+# define BOOST_PP_SEQ_SPLIT_101(x) (x) BOOST_PP_SEQ_SPLIT_100
+# define BOOST_PP_SEQ_SPLIT_102(x) (x) BOOST_PP_SEQ_SPLIT_101
+# define BOOST_PP_SEQ_SPLIT_103(x) (x) BOOST_PP_SEQ_SPLIT_102
+# define BOOST_PP_SEQ_SPLIT_104(x) (x) BOOST_PP_SEQ_SPLIT_103
+# define BOOST_PP_SEQ_SPLIT_105(x) (x) BOOST_PP_SEQ_SPLIT_104
+# define BOOST_PP_SEQ_SPLIT_106(x) (x) BOOST_PP_SEQ_SPLIT_105
+# define BOOST_PP_SEQ_SPLIT_107(x) (x) BOOST_PP_SEQ_SPLIT_106
+# define BOOST_PP_SEQ_SPLIT_108(x) (x) BOOST_PP_SEQ_SPLIT_107
+# define BOOST_PP_SEQ_SPLIT_109(x) (x) BOOST_PP_SEQ_SPLIT_108
+# define BOOST_PP_SEQ_SPLIT_110(x) (x) BOOST_PP_SEQ_SPLIT_109
+# define BOOST_PP_SEQ_SPLIT_111(x) (x) BOOST_PP_SEQ_SPLIT_110
+# define BOOST_PP_SEQ_SPLIT_112(x) (x) BOOST_PP_SEQ_SPLIT_111
+# define BOOST_PP_SEQ_SPLIT_113(x) (x) BOOST_PP_SEQ_SPLIT_112
+# define BOOST_PP_SEQ_SPLIT_114(x) (x) BOOST_PP_SEQ_SPLIT_113
+# define BOOST_PP_SEQ_SPLIT_115(x) (x) BOOST_PP_SEQ_SPLIT_114
+# define BOOST_PP_SEQ_SPLIT_116(x) (x) BOOST_PP_SEQ_SPLIT_115
+# define BOOST_PP_SEQ_SPLIT_117(x) (x) BOOST_PP_SEQ_SPLIT_116
+# define BOOST_PP_SEQ_SPLIT_118(x) (x) BOOST_PP_SEQ_SPLIT_117
+# define BOOST_PP_SEQ_SPLIT_119(x) (x) BOOST_PP_SEQ_SPLIT_118
+# define BOOST_PP_SEQ_SPLIT_120(x) (x) BOOST_PP_SEQ_SPLIT_119
+# define BOOST_PP_SEQ_SPLIT_121(x) (x) BOOST_PP_SEQ_SPLIT_120
+# define BOOST_PP_SEQ_SPLIT_122(x) (x) BOOST_PP_SEQ_SPLIT_121
+# define BOOST_PP_SEQ_SPLIT_123(x) (x) BOOST_PP_SEQ_SPLIT_122
+# define BOOST_PP_SEQ_SPLIT_124(x) (x) BOOST_PP_SEQ_SPLIT_123
+# define BOOST_PP_SEQ_SPLIT_125(x) (x) BOOST_PP_SEQ_SPLIT_124
+# define BOOST_PP_SEQ_SPLIT_126(x) (x) BOOST_PP_SEQ_SPLIT_125
+# define BOOST_PP_SEQ_SPLIT_127(x) (x) BOOST_PP_SEQ_SPLIT_126
+# define BOOST_PP_SEQ_SPLIT_128(x) (x) BOOST_PP_SEQ_SPLIT_127
+# define BOOST_PP_SEQ_SPLIT_129(x) (x) BOOST_PP_SEQ_SPLIT_128
+# define BOOST_PP_SEQ_SPLIT_130(x) (x) BOOST_PP_SEQ_SPLIT_129
+# define BOOST_PP_SEQ_SPLIT_131(x) (x) BOOST_PP_SEQ_SPLIT_130
+# define BOOST_PP_SEQ_SPLIT_132(x) (x) BOOST_PP_SEQ_SPLIT_131
+# define BOOST_PP_SEQ_SPLIT_133(x) (x) BOOST_PP_SEQ_SPLIT_132
+# define BOOST_PP_SEQ_SPLIT_134(x) (x) BOOST_PP_SEQ_SPLIT_133
+# define BOOST_PP_SEQ_SPLIT_135(x) (x) BOOST_PP_SEQ_SPLIT_134
+# define BOOST_PP_SEQ_SPLIT_136(x) (x) BOOST_PP_SEQ_SPLIT_135
+# define BOOST_PP_SEQ_SPLIT_137(x) (x) BOOST_PP_SEQ_SPLIT_136
+# define BOOST_PP_SEQ_SPLIT_138(x) (x) BOOST_PP_SEQ_SPLIT_137
+# define BOOST_PP_SEQ_SPLIT_139(x) (x) BOOST_PP_SEQ_SPLIT_138
+# define BOOST_PP_SEQ_SPLIT_140(x) (x) BOOST_PP_SEQ_SPLIT_139
+# define BOOST_PP_SEQ_SPLIT_141(x) (x) BOOST_PP_SEQ_SPLIT_140
+# define BOOST_PP_SEQ_SPLIT_142(x) (x) BOOST_PP_SEQ_SPLIT_141
+# define BOOST_PP_SEQ_SPLIT_143(x) (x) BOOST_PP_SEQ_SPLIT_142
+# define BOOST_PP_SEQ_SPLIT_144(x) (x) BOOST_PP_SEQ_SPLIT_143
+# define BOOST_PP_SEQ_SPLIT_145(x) (x) BOOST_PP_SEQ_SPLIT_144
+# define BOOST_PP_SEQ_SPLIT_146(x) (x) BOOST_PP_SEQ_SPLIT_145
+# define BOOST_PP_SEQ_SPLIT_147(x) (x) BOOST_PP_SEQ_SPLIT_146
+# define BOOST_PP_SEQ_SPLIT_148(x) (x) BOOST_PP_SEQ_SPLIT_147
+# define BOOST_PP_SEQ_SPLIT_149(x) (x) BOOST_PP_SEQ_SPLIT_148
+# define BOOST_PP_SEQ_SPLIT_150(x) (x) BOOST_PP_SEQ_SPLIT_149
+# define BOOST_PP_SEQ_SPLIT_151(x) (x) BOOST_PP_SEQ_SPLIT_150
+# define BOOST_PP_SEQ_SPLIT_152(x) (x) BOOST_PP_SEQ_SPLIT_151
+# define BOOST_PP_SEQ_SPLIT_153(x) (x) BOOST_PP_SEQ_SPLIT_152
+# define BOOST_PP_SEQ_SPLIT_154(x) (x) BOOST_PP_SEQ_SPLIT_153
+# define BOOST_PP_SEQ_SPLIT_155(x) (x) BOOST_PP_SEQ_SPLIT_154
+# define BOOST_PP_SEQ_SPLIT_156(x) (x) BOOST_PP_SEQ_SPLIT_155
+# define BOOST_PP_SEQ_SPLIT_157(x) (x) BOOST_PP_SEQ_SPLIT_156
+# define BOOST_PP_SEQ_SPLIT_158(x) (x) BOOST_PP_SEQ_SPLIT_157
+# define BOOST_PP_SEQ_SPLIT_159(x) (x) BOOST_PP_SEQ_SPLIT_158
+# define BOOST_PP_SEQ_SPLIT_160(x) (x) BOOST_PP_SEQ_SPLIT_159
+# define BOOST_PP_SEQ_SPLIT_161(x) (x) BOOST_PP_SEQ_SPLIT_160
+# define BOOST_PP_SEQ_SPLIT_162(x) (x) BOOST_PP_SEQ_SPLIT_161
+# define BOOST_PP_SEQ_SPLIT_163(x) (x) BOOST_PP_SEQ_SPLIT_162
+# define BOOST_PP_SEQ_SPLIT_164(x) (x) BOOST_PP_SEQ_SPLIT_163
+# define BOOST_PP_SEQ_SPLIT_165(x) (x) BOOST_PP_SEQ_SPLIT_164
+# define BOOST_PP_SEQ_SPLIT_166(x) (x) BOOST_PP_SEQ_SPLIT_165
+# define BOOST_PP_SEQ_SPLIT_167(x) (x) BOOST_PP_SEQ_SPLIT_166
+# define BOOST_PP_SEQ_SPLIT_168(x) (x) BOOST_PP_SEQ_SPLIT_167
+# define BOOST_PP_SEQ_SPLIT_169(x) (x) BOOST_PP_SEQ_SPLIT_168
+# define BOOST_PP_SEQ_SPLIT_170(x) (x) BOOST_PP_SEQ_SPLIT_169
+# define BOOST_PP_SEQ_SPLIT_171(x) (x) BOOST_PP_SEQ_SPLIT_170
+# define BOOST_PP_SEQ_SPLIT_172(x) (x) BOOST_PP_SEQ_SPLIT_171
+# define BOOST_PP_SEQ_SPLIT_173(x) (x) BOOST_PP_SEQ_SPLIT_172
+# define BOOST_PP_SEQ_SPLIT_174(x) (x) BOOST_PP_SEQ_SPLIT_173
+# define BOOST_PP_SEQ_SPLIT_175(x) (x) BOOST_PP_SEQ_SPLIT_174
+# define BOOST_PP_SEQ_SPLIT_176(x) (x) BOOST_PP_SEQ_SPLIT_175
+# define BOOST_PP_SEQ_SPLIT_177(x) (x) BOOST_PP_SEQ_SPLIT_176
+# define BOOST_PP_SEQ_SPLIT_178(x) (x) BOOST_PP_SEQ_SPLIT_177
+# define BOOST_PP_SEQ_SPLIT_179(x) (x) BOOST_PP_SEQ_SPLIT_178
+# define BOOST_PP_SEQ_SPLIT_180(x) (x) BOOST_PP_SEQ_SPLIT_179
+# define BOOST_PP_SEQ_SPLIT_181(x) (x) BOOST_PP_SEQ_SPLIT_180
+# define BOOST_PP_SEQ_SPLIT_182(x) (x) BOOST_PP_SEQ_SPLIT_181
+# define BOOST_PP_SEQ_SPLIT_183(x) (x) BOOST_PP_SEQ_SPLIT_182
+# define BOOST_PP_SEQ_SPLIT_184(x) (x) BOOST_PP_SEQ_SPLIT_183
+# define BOOST_PP_SEQ_SPLIT_185(x) (x) BOOST_PP_SEQ_SPLIT_184
+# define BOOST_PP_SEQ_SPLIT_186(x) (x) BOOST_PP_SEQ_SPLIT_185
+# define BOOST_PP_SEQ_SPLIT_187(x) (x) BOOST_PP_SEQ_SPLIT_186
+# define BOOST_PP_SEQ_SPLIT_188(x) (x) BOOST_PP_SEQ_SPLIT_187
+# define BOOST_PP_SEQ_SPLIT_189(x) (x) BOOST_PP_SEQ_SPLIT_188
+# define BOOST_PP_SEQ_SPLIT_190(x) (x) BOOST_PP_SEQ_SPLIT_189
+# define BOOST_PP_SEQ_SPLIT_191(x) (x) BOOST_PP_SEQ_SPLIT_190
+# define BOOST_PP_SEQ_SPLIT_192(x) (x) BOOST_PP_SEQ_SPLIT_191
+# define BOOST_PP_SEQ_SPLIT_193(x) (x) BOOST_PP_SEQ_SPLIT_192
+# define BOOST_PP_SEQ_SPLIT_194(x) (x) BOOST_PP_SEQ_SPLIT_193
+# define BOOST_PP_SEQ_SPLIT_195(x) (x) BOOST_PP_SEQ_SPLIT_194
+# define BOOST_PP_SEQ_SPLIT_196(x) (x) BOOST_PP_SEQ_SPLIT_195
+# define BOOST_PP_SEQ_SPLIT_197(x) (x) BOOST_PP_SEQ_SPLIT_196
+# define BOOST_PP_SEQ_SPLIT_198(x) (x) BOOST_PP_SEQ_SPLIT_197
+# define BOOST_PP_SEQ_SPLIT_199(x) (x) BOOST_PP_SEQ_SPLIT_198
+# define BOOST_PP_SEQ_SPLIT_200(x) (x) BOOST_PP_SEQ_SPLIT_199
+# define BOOST_PP_SEQ_SPLIT_201(x) (x) BOOST_PP_SEQ_SPLIT_200
+# define BOOST_PP_SEQ_SPLIT_202(x) (x) BOOST_PP_SEQ_SPLIT_201
+# define BOOST_PP_SEQ_SPLIT_203(x) (x) BOOST_PP_SEQ_SPLIT_202
+# define BOOST_PP_SEQ_SPLIT_204(x) (x) BOOST_PP_SEQ_SPLIT_203
+# define BOOST_PP_SEQ_SPLIT_205(x) (x) BOOST_PP_SEQ_SPLIT_204
+# define BOOST_PP_SEQ_SPLIT_206(x) (x) BOOST_PP_SEQ_SPLIT_205
+# define BOOST_PP_SEQ_SPLIT_207(x) (x) BOOST_PP_SEQ_SPLIT_206
+# define BOOST_PP_SEQ_SPLIT_208(x) (x) BOOST_PP_SEQ_SPLIT_207
+# define BOOST_PP_SEQ_SPLIT_209(x) (x) BOOST_PP_SEQ_SPLIT_208
+# define BOOST_PP_SEQ_SPLIT_210(x) (x) BOOST_PP_SEQ_SPLIT_209
+# define BOOST_PP_SEQ_SPLIT_211(x) (x) BOOST_PP_SEQ_SPLIT_210
+# define BOOST_PP_SEQ_SPLIT_212(x) (x) BOOST_PP_SEQ_SPLIT_211
+# define BOOST_PP_SEQ_SPLIT_213(x) (x) BOOST_PP_SEQ_SPLIT_212
+# define BOOST_PP_SEQ_SPLIT_214(x) (x) BOOST_PP_SEQ_SPLIT_213
+# define BOOST_PP_SEQ_SPLIT_215(x) (x) BOOST_PP_SEQ_SPLIT_214
+# define BOOST_PP_SEQ_SPLIT_216(x) (x) BOOST_PP_SEQ_SPLIT_215
+# define BOOST_PP_SEQ_SPLIT_217(x) (x) BOOST_PP_SEQ_SPLIT_216
+# define BOOST_PP_SEQ_SPLIT_218(x) (x) BOOST_PP_SEQ_SPLIT_217
+# define BOOST_PP_SEQ_SPLIT_219(x) (x) BOOST_PP_SEQ_SPLIT_218
+# define BOOST_PP_SEQ_SPLIT_220(x) (x) BOOST_PP_SEQ_SPLIT_219
+# define BOOST_PP_SEQ_SPLIT_221(x) (x) BOOST_PP_SEQ_SPLIT_220
+# define BOOST_PP_SEQ_SPLIT_222(x) (x) BOOST_PP_SEQ_SPLIT_221
+# define BOOST_PP_SEQ_SPLIT_223(x) (x) BOOST_PP_SEQ_SPLIT_222
+# define BOOST_PP_SEQ_SPLIT_224(x) (x) BOOST_PP_SEQ_SPLIT_223
+# define BOOST_PP_SEQ_SPLIT_225(x) (x) BOOST_PP_SEQ_SPLIT_224
+# define BOOST_PP_SEQ_SPLIT_226(x) (x) BOOST_PP_SEQ_SPLIT_225
+# define BOOST_PP_SEQ_SPLIT_227(x) (x) BOOST_PP_SEQ_SPLIT_226
+# define BOOST_PP_SEQ_SPLIT_228(x) (x) BOOST_PP_SEQ_SPLIT_227
+# define BOOST_PP_SEQ_SPLIT_229(x) (x) BOOST_PP_SEQ_SPLIT_228
+# define BOOST_PP_SEQ_SPLIT_230(x) (x) BOOST_PP_SEQ_SPLIT_229
+# define BOOST_PP_SEQ_SPLIT_231(x) (x) BOOST_PP_SEQ_SPLIT_230
+# define BOOST_PP_SEQ_SPLIT_232(x) (x) BOOST_PP_SEQ_SPLIT_231
+# define BOOST_PP_SEQ_SPLIT_233(x) (x) BOOST_PP_SEQ_SPLIT_232
+# define BOOST_PP_SEQ_SPLIT_234(x) (x) BOOST_PP_SEQ_SPLIT_233
+# define BOOST_PP_SEQ_SPLIT_235(x) (x) BOOST_PP_SEQ_SPLIT_234
+# define BOOST_PP_SEQ_SPLIT_236(x) (x) BOOST_PP_SEQ_SPLIT_235
+# define BOOST_PP_SEQ_SPLIT_237(x) (x) BOOST_PP_SEQ_SPLIT_236
+# define BOOST_PP_SEQ_SPLIT_238(x) (x) BOOST_PP_SEQ_SPLIT_237
+# define BOOST_PP_SEQ_SPLIT_239(x) (x) BOOST_PP_SEQ_SPLIT_238
+# define BOOST_PP_SEQ_SPLIT_240(x) (x) BOOST_PP_SEQ_SPLIT_239
+# define BOOST_PP_SEQ_SPLIT_241(x) (x) BOOST_PP_SEQ_SPLIT_240
+# define BOOST_PP_SEQ_SPLIT_242(x) (x) BOOST_PP_SEQ_SPLIT_241
+# define BOOST_PP_SEQ_SPLIT_243(x) (x) BOOST_PP_SEQ_SPLIT_242
+# define BOOST_PP_SEQ_SPLIT_244(x) (x) BOOST_PP_SEQ_SPLIT_243
+# define BOOST_PP_SEQ_SPLIT_245(x) (x) BOOST_PP_SEQ_SPLIT_244
+# define BOOST_PP_SEQ_SPLIT_246(x) (x) BOOST_PP_SEQ_SPLIT_245
+# define BOOST_PP_SEQ_SPLIT_247(x) (x) BOOST_PP_SEQ_SPLIT_246
+# define BOOST_PP_SEQ_SPLIT_248(x) (x) BOOST_PP_SEQ_SPLIT_247
+# define BOOST_PP_SEQ_SPLIT_249(x) (x) BOOST_PP_SEQ_SPLIT_248
+# define BOOST_PP_SEQ_SPLIT_250(x) (x) BOOST_PP_SEQ_SPLIT_249
+# define BOOST_PP_SEQ_SPLIT_251(x) (x) BOOST_PP_SEQ_SPLIT_250
+# define BOOST_PP_SEQ_SPLIT_252(x) (x) BOOST_PP_SEQ_SPLIT_251
+# define BOOST_PP_SEQ_SPLIT_253(x) (x) BOOST_PP_SEQ_SPLIT_252
+# define BOOST_PP_SEQ_SPLIT_254(x) (x) BOOST_PP_SEQ_SPLIT_253
+# define BOOST_PP_SEQ_SPLIT_255(x) (x) BOOST_PP_SEQ_SPLIT_254
+# define BOOST_PP_SEQ_SPLIT_256(x) (x) BOOST_PP_SEQ_SPLIT_255
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/elem.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/elem.hpp
new file mode 100644
index 0000000..9c7a4b2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/elem.hpp
@@ -0,0 +1,304 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_ELEM_HPP
+# define BOOST_PREPROCESSOR_SEQ_ELEM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+#
+# /* BOOST_PP_SEQ_ELEM */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I(i, seq)
+# else
+#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I((i, seq))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II((BOOST_PP_SEQ_ELEM_ ## i seq))
+#    define BOOST_PP_SEQ_ELEM_II(res) BOOST_PP_SEQ_ELEM_IV(BOOST_PP_SEQ_ELEM_III res)
+#    define BOOST_PP_SEQ_ELEM_III(x, _) x BOOST_PP_EMPTY()
+#    define BOOST_PP_SEQ_ELEM_IV(x) x
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_ELEM_I(par) BOOST_PP_SEQ_ELEM_II ## par
+#    define BOOST_PP_SEQ_ELEM_II(i, seq) BOOST_PP_SEQ_ELEM_III(BOOST_PP_SEQ_ELEM_ ## i ## seq)
+#    define BOOST_PP_SEQ_ELEM_III(im) BOOST_PP_SEQ_ELEM_IV(im)
+#    define BOOST_PP_SEQ_ELEM_IV(x, _) x
+# else
+#    if defined(__IBMC__) || defined(__IBMCPP__)
+#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_CAT(BOOST_PP_SEQ_ELEM_ ## i, seq))
+#    else
+#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_SEQ_ELEM_ ## i seq)
+#    endif
+#    define BOOST_PP_SEQ_ELEM_II(im) BOOST_PP_SEQ_ELEM_III(im)
+#    define BOOST_PP_SEQ_ELEM_III(x, _) x
+# endif
+#
+# define BOOST_PP_SEQ_ELEM_0(x) x, BOOST_PP_NIL
+# define BOOST_PP_SEQ_ELEM_1(_) BOOST_PP_SEQ_ELEM_0
+# define BOOST_PP_SEQ_ELEM_2(_) BOOST_PP_SEQ_ELEM_1
+# define BOOST_PP_SEQ_ELEM_3(_) BOOST_PP_SEQ_ELEM_2
+# define BOOST_PP_SEQ_ELEM_4(_) BOOST_PP_SEQ_ELEM_3
+# define BOOST_PP_SEQ_ELEM_5(_) BOOST_PP_SEQ_ELEM_4
+# define BOOST_PP_SEQ_ELEM_6(_) BOOST_PP_SEQ_ELEM_5
+# define BOOST_PP_SEQ_ELEM_7(_) BOOST_PP_SEQ_ELEM_6
+# define BOOST_PP_SEQ_ELEM_8(_) BOOST_PP_SEQ_ELEM_7
+# define BOOST_PP_SEQ_ELEM_9(_) BOOST_PP_SEQ_ELEM_8
+# define BOOST_PP_SEQ_ELEM_10(_) BOOST_PP_SEQ_ELEM_9
+# define BOOST_PP_SEQ_ELEM_11(_) BOOST_PP_SEQ_ELEM_10
+# define BOOST_PP_SEQ_ELEM_12(_) BOOST_PP_SEQ_ELEM_11
+# define BOOST_PP_SEQ_ELEM_13(_) BOOST_PP_SEQ_ELEM_12
+# define BOOST_PP_SEQ_ELEM_14(_) BOOST_PP_SEQ_ELEM_13
+# define BOOST_PP_SEQ_ELEM_15(_) BOOST_PP_SEQ_ELEM_14
+# define BOOST_PP_SEQ_ELEM_16(_) BOOST_PP_SEQ_ELEM_15
+# define BOOST_PP_SEQ_ELEM_17(_) BOOST_PP_SEQ_ELEM_16
+# define BOOST_PP_SEQ_ELEM_18(_) BOOST_PP_SEQ_ELEM_17
+# define BOOST_PP_SEQ_ELEM_19(_) BOOST_PP_SEQ_ELEM_18
+# define BOOST_PP_SEQ_ELEM_20(_) BOOST_PP_SEQ_ELEM_19
+# define BOOST_PP_SEQ_ELEM_21(_) BOOST_PP_SEQ_ELEM_20
+# define BOOST_PP_SEQ_ELEM_22(_) BOOST_PP_SEQ_ELEM_21
+# define BOOST_PP_SEQ_ELEM_23(_) BOOST_PP_SEQ_ELEM_22
+# define BOOST_PP_SEQ_ELEM_24(_) BOOST_PP_SEQ_ELEM_23
+# define BOOST_PP_SEQ_ELEM_25(_) BOOST_PP_SEQ_ELEM_24
+# define BOOST_PP_SEQ_ELEM_26(_) BOOST_PP_SEQ_ELEM_25
+# define BOOST_PP_SEQ_ELEM_27(_) BOOST_PP_SEQ_ELEM_26
+# define BOOST_PP_SEQ_ELEM_28(_) BOOST_PP_SEQ_ELEM_27
+# define BOOST_PP_SEQ_ELEM_29(_) BOOST_PP_SEQ_ELEM_28
+# define BOOST_PP_SEQ_ELEM_30(_) BOOST_PP_SEQ_ELEM_29
+# define BOOST_PP_SEQ_ELEM_31(_) BOOST_PP_SEQ_ELEM_30
+# define BOOST_PP_SEQ_ELEM_32(_) BOOST_PP_SEQ_ELEM_31
+# define BOOST_PP_SEQ_ELEM_33(_) BOOST_PP_SEQ_ELEM_32
+# define BOOST_PP_SEQ_ELEM_34(_) BOOST_PP_SEQ_ELEM_33
+# define BOOST_PP_SEQ_ELEM_35(_) BOOST_PP_SEQ_ELEM_34
+# define BOOST_PP_SEQ_ELEM_36(_) BOOST_PP_SEQ_ELEM_35
+# define BOOST_PP_SEQ_ELEM_37(_) BOOST_PP_SEQ_ELEM_36
+# define BOOST_PP_SEQ_ELEM_38(_) BOOST_PP_SEQ_ELEM_37
+# define BOOST_PP_SEQ_ELEM_39(_) BOOST_PP_SEQ_ELEM_38
+# define BOOST_PP_SEQ_ELEM_40(_) BOOST_PP_SEQ_ELEM_39
+# define BOOST_PP_SEQ_ELEM_41(_) BOOST_PP_SEQ_ELEM_40
+# define BOOST_PP_SEQ_ELEM_42(_) BOOST_PP_SEQ_ELEM_41
+# define BOOST_PP_SEQ_ELEM_43(_) BOOST_PP_SEQ_ELEM_42
+# define BOOST_PP_SEQ_ELEM_44(_) BOOST_PP_SEQ_ELEM_43
+# define BOOST_PP_SEQ_ELEM_45(_) BOOST_PP_SEQ_ELEM_44
+# define BOOST_PP_SEQ_ELEM_46(_) BOOST_PP_SEQ_ELEM_45
+# define BOOST_PP_SEQ_ELEM_47(_) BOOST_PP_SEQ_ELEM_46
+# define BOOST_PP_SEQ_ELEM_48(_) BOOST_PP_SEQ_ELEM_47
+# define BOOST_PP_SEQ_ELEM_49(_) BOOST_PP_SEQ_ELEM_48
+# define BOOST_PP_SEQ_ELEM_50(_) BOOST_PP_SEQ_ELEM_49
+# define BOOST_PP_SEQ_ELEM_51(_) BOOST_PP_SEQ_ELEM_50
+# define BOOST_PP_SEQ_ELEM_52(_) BOOST_PP_SEQ_ELEM_51
+# define BOOST_PP_SEQ_ELEM_53(_) BOOST_PP_SEQ_ELEM_52
+# define BOOST_PP_SEQ_ELEM_54(_) BOOST_PP_SEQ_ELEM_53
+# define BOOST_PP_SEQ_ELEM_55(_) BOOST_PP_SEQ_ELEM_54
+# define BOOST_PP_SEQ_ELEM_56(_) BOOST_PP_SEQ_ELEM_55
+# define BOOST_PP_SEQ_ELEM_57(_) BOOST_PP_SEQ_ELEM_56
+# define BOOST_PP_SEQ_ELEM_58(_) BOOST_PP_SEQ_ELEM_57
+# define BOOST_PP_SEQ_ELEM_59(_) BOOST_PP_SEQ_ELEM_58
+# define BOOST_PP_SEQ_ELEM_60(_) BOOST_PP_SEQ_ELEM_59
+# define BOOST_PP_SEQ_ELEM_61(_) BOOST_PP_SEQ_ELEM_60
+# define BOOST_PP_SEQ_ELEM_62(_) BOOST_PP_SEQ_ELEM_61
+# define BOOST_PP_SEQ_ELEM_63(_) BOOST_PP_SEQ_ELEM_62
+# define BOOST_PP_SEQ_ELEM_64(_) BOOST_PP_SEQ_ELEM_63
+# define BOOST_PP_SEQ_ELEM_65(_) BOOST_PP_SEQ_ELEM_64
+# define BOOST_PP_SEQ_ELEM_66(_) BOOST_PP_SEQ_ELEM_65
+# define BOOST_PP_SEQ_ELEM_67(_) BOOST_PP_SEQ_ELEM_66
+# define BOOST_PP_SEQ_ELEM_68(_) BOOST_PP_SEQ_ELEM_67
+# define BOOST_PP_SEQ_ELEM_69(_) BOOST_PP_SEQ_ELEM_68
+# define BOOST_PP_SEQ_ELEM_70(_) BOOST_PP_SEQ_ELEM_69
+# define BOOST_PP_SEQ_ELEM_71(_) BOOST_PP_SEQ_ELEM_70
+# define BOOST_PP_SEQ_ELEM_72(_) BOOST_PP_SEQ_ELEM_71
+# define BOOST_PP_SEQ_ELEM_73(_) BOOST_PP_SEQ_ELEM_72
+# define BOOST_PP_SEQ_ELEM_74(_) BOOST_PP_SEQ_ELEM_73
+# define BOOST_PP_SEQ_ELEM_75(_) BOOST_PP_SEQ_ELEM_74
+# define BOOST_PP_SEQ_ELEM_76(_) BOOST_PP_SEQ_ELEM_75
+# define BOOST_PP_SEQ_ELEM_77(_) BOOST_PP_SEQ_ELEM_76
+# define BOOST_PP_SEQ_ELEM_78(_) BOOST_PP_SEQ_ELEM_77
+# define BOOST_PP_SEQ_ELEM_79(_) BOOST_PP_SEQ_ELEM_78
+# define BOOST_PP_SEQ_ELEM_80(_) BOOST_PP_SEQ_ELEM_79
+# define BOOST_PP_SEQ_ELEM_81(_) BOOST_PP_SEQ_ELEM_80
+# define BOOST_PP_SEQ_ELEM_82(_) BOOST_PP_SEQ_ELEM_81
+# define BOOST_PP_SEQ_ELEM_83(_) BOOST_PP_SEQ_ELEM_82
+# define BOOST_PP_SEQ_ELEM_84(_) BOOST_PP_SEQ_ELEM_83
+# define BOOST_PP_SEQ_ELEM_85(_) BOOST_PP_SEQ_ELEM_84
+# define BOOST_PP_SEQ_ELEM_86(_) BOOST_PP_SEQ_ELEM_85
+# define BOOST_PP_SEQ_ELEM_87(_) BOOST_PP_SEQ_ELEM_86
+# define BOOST_PP_SEQ_ELEM_88(_) BOOST_PP_SEQ_ELEM_87
+# define BOOST_PP_SEQ_ELEM_89(_) BOOST_PP_SEQ_ELEM_88
+# define BOOST_PP_SEQ_ELEM_90(_) BOOST_PP_SEQ_ELEM_89
+# define BOOST_PP_SEQ_ELEM_91(_) BOOST_PP_SEQ_ELEM_90
+# define BOOST_PP_SEQ_ELEM_92(_) BOOST_PP_SEQ_ELEM_91
+# define BOOST_PP_SEQ_ELEM_93(_) BOOST_PP_SEQ_ELEM_92
+# define BOOST_PP_SEQ_ELEM_94(_) BOOST_PP_SEQ_ELEM_93
+# define BOOST_PP_SEQ_ELEM_95(_) BOOST_PP_SEQ_ELEM_94
+# define BOOST_PP_SEQ_ELEM_96(_) BOOST_PP_SEQ_ELEM_95
+# define BOOST_PP_SEQ_ELEM_97(_) BOOST_PP_SEQ_ELEM_96
+# define BOOST_PP_SEQ_ELEM_98(_) BOOST_PP_SEQ_ELEM_97
+# define BOOST_PP_SEQ_ELEM_99(_) BOOST_PP_SEQ_ELEM_98
+# define BOOST_PP_SEQ_ELEM_100(_) BOOST_PP_SEQ_ELEM_99
+# define BOOST_PP_SEQ_ELEM_101(_) BOOST_PP_SEQ_ELEM_100
+# define BOOST_PP_SEQ_ELEM_102(_) BOOST_PP_SEQ_ELEM_101
+# define BOOST_PP_SEQ_ELEM_103(_) BOOST_PP_SEQ_ELEM_102
+# define BOOST_PP_SEQ_ELEM_104(_) BOOST_PP_SEQ_ELEM_103
+# define BOOST_PP_SEQ_ELEM_105(_) BOOST_PP_SEQ_ELEM_104
+# define BOOST_PP_SEQ_ELEM_106(_) BOOST_PP_SEQ_ELEM_105
+# define BOOST_PP_SEQ_ELEM_107(_) BOOST_PP_SEQ_ELEM_106
+# define BOOST_PP_SEQ_ELEM_108(_) BOOST_PP_SEQ_ELEM_107
+# define BOOST_PP_SEQ_ELEM_109(_) BOOST_PP_SEQ_ELEM_108
+# define BOOST_PP_SEQ_ELEM_110(_) BOOST_PP_SEQ_ELEM_109
+# define BOOST_PP_SEQ_ELEM_111(_) BOOST_PP_SEQ_ELEM_110
+# define BOOST_PP_SEQ_ELEM_112(_) BOOST_PP_SEQ_ELEM_111
+# define BOOST_PP_SEQ_ELEM_113(_) BOOST_PP_SEQ_ELEM_112
+# define BOOST_PP_SEQ_ELEM_114(_) BOOST_PP_SEQ_ELEM_113
+# define BOOST_PP_SEQ_ELEM_115(_) BOOST_PP_SEQ_ELEM_114
+# define BOOST_PP_SEQ_ELEM_116(_) BOOST_PP_SEQ_ELEM_115
+# define BOOST_PP_SEQ_ELEM_117(_) BOOST_PP_SEQ_ELEM_116
+# define BOOST_PP_SEQ_ELEM_118(_) BOOST_PP_SEQ_ELEM_117
+# define BOOST_PP_SEQ_ELEM_119(_) BOOST_PP_SEQ_ELEM_118
+# define BOOST_PP_SEQ_ELEM_120(_) BOOST_PP_SEQ_ELEM_119
+# define BOOST_PP_SEQ_ELEM_121(_) BOOST_PP_SEQ_ELEM_120
+# define BOOST_PP_SEQ_ELEM_122(_) BOOST_PP_SEQ_ELEM_121
+# define BOOST_PP_SEQ_ELEM_123(_) BOOST_PP_SEQ_ELEM_122
+# define BOOST_PP_SEQ_ELEM_124(_) BOOST_PP_SEQ_ELEM_123
+# define BOOST_PP_SEQ_ELEM_125(_) BOOST_PP_SEQ_ELEM_124
+# define BOOST_PP_SEQ_ELEM_126(_) BOOST_PP_SEQ_ELEM_125
+# define BOOST_PP_SEQ_ELEM_127(_) BOOST_PP_SEQ_ELEM_126
+# define BOOST_PP_SEQ_ELEM_128(_) BOOST_PP_SEQ_ELEM_127
+# define BOOST_PP_SEQ_ELEM_129(_) BOOST_PP_SEQ_ELEM_128
+# define BOOST_PP_SEQ_ELEM_130(_) BOOST_PP_SEQ_ELEM_129
+# define BOOST_PP_SEQ_ELEM_131(_) BOOST_PP_SEQ_ELEM_130
+# define BOOST_PP_SEQ_ELEM_132(_) BOOST_PP_SEQ_ELEM_131
+# define BOOST_PP_SEQ_ELEM_133(_) BOOST_PP_SEQ_ELEM_132
+# define BOOST_PP_SEQ_ELEM_134(_) BOOST_PP_SEQ_ELEM_133
+# define BOOST_PP_SEQ_ELEM_135(_) BOOST_PP_SEQ_ELEM_134
+# define BOOST_PP_SEQ_ELEM_136(_) BOOST_PP_SEQ_ELEM_135
+# define BOOST_PP_SEQ_ELEM_137(_) BOOST_PP_SEQ_ELEM_136
+# define BOOST_PP_SEQ_ELEM_138(_) BOOST_PP_SEQ_ELEM_137
+# define BOOST_PP_SEQ_ELEM_139(_) BOOST_PP_SEQ_ELEM_138
+# define BOOST_PP_SEQ_ELEM_140(_) BOOST_PP_SEQ_ELEM_139
+# define BOOST_PP_SEQ_ELEM_141(_) BOOST_PP_SEQ_ELEM_140
+# define BOOST_PP_SEQ_ELEM_142(_) BOOST_PP_SEQ_ELEM_141
+# define BOOST_PP_SEQ_ELEM_143(_) BOOST_PP_SEQ_ELEM_142
+# define BOOST_PP_SEQ_ELEM_144(_) BOOST_PP_SEQ_ELEM_143
+# define BOOST_PP_SEQ_ELEM_145(_) BOOST_PP_SEQ_ELEM_144
+# define BOOST_PP_SEQ_ELEM_146(_) BOOST_PP_SEQ_ELEM_145
+# define BOOST_PP_SEQ_ELEM_147(_) BOOST_PP_SEQ_ELEM_146
+# define BOOST_PP_SEQ_ELEM_148(_) BOOST_PP_SEQ_ELEM_147
+# define BOOST_PP_SEQ_ELEM_149(_) BOOST_PP_SEQ_ELEM_148
+# define BOOST_PP_SEQ_ELEM_150(_) BOOST_PP_SEQ_ELEM_149
+# define BOOST_PP_SEQ_ELEM_151(_) BOOST_PP_SEQ_ELEM_150
+# define BOOST_PP_SEQ_ELEM_152(_) BOOST_PP_SEQ_ELEM_151
+# define BOOST_PP_SEQ_ELEM_153(_) BOOST_PP_SEQ_ELEM_152
+# define BOOST_PP_SEQ_ELEM_154(_) BOOST_PP_SEQ_ELEM_153
+# define BOOST_PP_SEQ_ELEM_155(_) BOOST_PP_SEQ_ELEM_154
+# define BOOST_PP_SEQ_ELEM_156(_) BOOST_PP_SEQ_ELEM_155
+# define BOOST_PP_SEQ_ELEM_157(_) BOOST_PP_SEQ_ELEM_156
+# define BOOST_PP_SEQ_ELEM_158(_) BOOST_PP_SEQ_ELEM_157
+# define BOOST_PP_SEQ_ELEM_159(_) BOOST_PP_SEQ_ELEM_158
+# define BOOST_PP_SEQ_ELEM_160(_) BOOST_PP_SEQ_ELEM_159
+# define BOOST_PP_SEQ_ELEM_161(_) BOOST_PP_SEQ_ELEM_160
+# define BOOST_PP_SEQ_ELEM_162(_) BOOST_PP_SEQ_ELEM_161
+# define BOOST_PP_SEQ_ELEM_163(_) BOOST_PP_SEQ_ELEM_162
+# define BOOST_PP_SEQ_ELEM_164(_) BOOST_PP_SEQ_ELEM_163
+# define BOOST_PP_SEQ_ELEM_165(_) BOOST_PP_SEQ_ELEM_164
+# define BOOST_PP_SEQ_ELEM_166(_) BOOST_PP_SEQ_ELEM_165
+# define BOOST_PP_SEQ_ELEM_167(_) BOOST_PP_SEQ_ELEM_166
+# define BOOST_PP_SEQ_ELEM_168(_) BOOST_PP_SEQ_ELEM_167
+# define BOOST_PP_SEQ_ELEM_169(_) BOOST_PP_SEQ_ELEM_168
+# define BOOST_PP_SEQ_ELEM_170(_) BOOST_PP_SEQ_ELEM_169
+# define BOOST_PP_SEQ_ELEM_171(_) BOOST_PP_SEQ_ELEM_170
+# define BOOST_PP_SEQ_ELEM_172(_) BOOST_PP_SEQ_ELEM_171
+# define BOOST_PP_SEQ_ELEM_173(_) BOOST_PP_SEQ_ELEM_172
+# define BOOST_PP_SEQ_ELEM_174(_) BOOST_PP_SEQ_ELEM_173
+# define BOOST_PP_SEQ_ELEM_175(_) BOOST_PP_SEQ_ELEM_174
+# define BOOST_PP_SEQ_ELEM_176(_) BOOST_PP_SEQ_ELEM_175
+# define BOOST_PP_SEQ_ELEM_177(_) BOOST_PP_SEQ_ELEM_176
+# define BOOST_PP_SEQ_ELEM_178(_) BOOST_PP_SEQ_ELEM_177
+# define BOOST_PP_SEQ_ELEM_179(_) BOOST_PP_SEQ_ELEM_178
+# define BOOST_PP_SEQ_ELEM_180(_) BOOST_PP_SEQ_ELEM_179
+# define BOOST_PP_SEQ_ELEM_181(_) BOOST_PP_SEQ_ELEM_180
+# define BOOST_PP_SEQ_ELEM_182(_) BOOST_PP_SEQ_ELEM_181
+# define BOOST_PP_SEQ_ELEM_183(_) BOOST_PP_SEQ_ELEM_182
+# define BOOST_PP_SEQ_ELEM_184(_) BOOST_PP_SEQ_ELEM_183
+# define BOOST_PP_SEQ_ELEM_185(_) BOOST_PP_SEQ_ELEM_184
+# define BOOST_PP_SEQ_ELEM_186(_) BOOST_PP_SEQ_ELEM_185
+# define BOOST_PP_SEQ_ELEM_187(_) BOOST_PP_SEQ_ELEM_186
+# define BOOST_PP_SEQ_ELEM_188(_) BOOST_PP_SEQ_ELEM_187
+# define BOOST_PP_SEQ_ELEM_189(_) BOOST_PP_SEQ_ELEM_188
+# define BOOST_PP_SEQ_ELEM_190(_) BOOST_PP_SEQ_ELEM_189
+# define BOOST_PP_SEQ_ELEM_191(_) BOOST_PP_SEQ_ELEM_190
+# define BOOST_PP_SEQ_ELEM_192(_) BOOST_PP_SEQ_ELEM_191
+# define BOOST_PP_SEQ_ELEM_193(_) BOOST_PP_SEQ_ELEM_192
+# define BOOST_PP_SEQ_ELEM_194(_) BOOST_PP_SEQ_ELEM_193
+# define BOOST_PP_SEQ_ELEM_195(_) BOOST_PP_SEQ_ELEM_194
+# define BOOST_PP_SEQ_ELEM_196(_) BOOST_PP_SEQ_ELEM_195
+# define BOOST_PP_SEQ_ELEM_197(_) BOOST_PP_SEQ_ELEM_196
+# define BOOST_PP_SEQ_ELEM_198(_) BOOST_PP_SEQ_ELEM_197
+# define BOOST_PP_SEQ_ELEM_199(_) BOOST_PP_SEQ_ELEM_198
+# define BOOST_PP_SEQ_ELEM_200(_) BOOST_PP_SEQ_ELEM_199
+# define BOOST_PP_SEQ_ELEM_201(_) BOOST_PP_SEQ_ELEM_200
+# define BOOST_PP_SEQ_ELEM_202(_) BOOST_PP_SEQ_ELEM_201
+# define BOOST_PP_SEQ_ELEM_203(_) BOOST_PP_SEQ_ELEM_202
+# define BOOST_PP_SEQ_ELEM_204(_) BOOST_PP_SEQ_ELEM_203
+# define BOOST_PP_SEQ_ELEM_205(_) BOOST_PP_SEQ_ELEM_204
+# define BOOST_PP_SEQ_ELEM_206(_) BOOST_PP_SEQ_ELEM_205
+# define BOOST_PP_SEQ_ELEM_207(_) BOOST_PP_SEQ_ELEM_206
+# define BOOST_PP_SEQ_ELEM_208(_) BOOST_PP_SEQ_ELEM_207
+# define BOOST_PP_SEQ_ELEM_209(_) BOOST_PP_SEQ_ELEM_208
+# define BOOST_PP_SEQ_ELEM_210(_) BOOST_PP_SEQ_ELEM_209
+# define BOOST_PP_SEQ_ELEM_211(_) BOOST_PP_SEQ_ELEM_210
+# define BOOST_PP_SEQ_ELEM_212(_) BOOST_PP_SEQ_ELEM_211
+# define BOOST_PP_SEQ_ELEM_213(_) BOOST_PP_SEQ_ELEM_212
+# define BOOST_PP_SEQ_ELEM_214(_) BOOST_PP_SEQ_ELEM_213
+# define BOOST_PP_SEQ_ELEM_215(_) BOOST_PP_SEQ_ELEM_214
+# define BOOST_PP_SEQ_ELEM_216(_) BOOST_PP_SEQ_ELEM_215
+# define BOOST_PP_SEQ_ELEM_217(_) BOOST_PP_SEQ_ELEM_216
+# define BOOST_PP_SEQ_ELEM_218(_) BOOST_PP_SEQ_ELEM_217
+# define BOOST_PP_SEQ_ELEM_219(_) BOOST_PP_SEQ_ELEM_218
+# define BOOST_PP_SEQ_ELEM_220(_) BOOST_PP_SEQ_ELEM_219
+# define BOOST_PP_SEQ_ELEM_221(_) BOOST_PP_SEQ_ELEM_220
+# define BOOST_PP_SEQ_ELEM_222(_) BOOST_PP_SEQ_ELEM_221
+# define BOOST_PP_SEQ_ELEM_223(_) BOOST_PP_SEQ_ELEM_222
+# define BOOST_PP_SEQ_ELEM_224(_) BOOST_PP_SEQ_ELEM_223
+# define BOOST_PP_SEQ_ELEM_225(_) BOOST_PP_SEQ_ELEM_224
+# define BOOST_PP_SEQ_ELEM_226(_) BOOST_PP_SEQ_ELEM_225
+# define BOOST_PP_SEQ_ELEM_227(_) BOOST_PP_SEQ_ELEM_226
+# define BOOST_PP_SEQ_ELEM_228(_) BOOST_PP_SEQ_ELEM_227
+# define BOOST_PP_SEQ_ELEM_229(_) BOOST_PP_SEQ_ELEM_228
+# define BOOST_PP_SEQ_ELEM_230(_) BOOST_PP_SEQ_ELEM_229
+# define BOOST_PP_SEQ_ELEM_231(_) BOOST_PP_SEQ_ELEM_230
+# define BOOST_PP_SEQ_ELEM_232(_) BOOST_PP_SEQ_ELEM_231
+# define BOOST_PP_SEQ_ELEM_233(_) BOOST_PP_SEQ_ELEM_232
+# define BOOST_PP_SEQ_ELEM_234(_) BOOST_PP_SEQ_ELEM_233
+# define BOOST_PP_SEQ_ELEM_235(_) BOOST_PP_SEQ_ELEM_234
+# define BOOST_PP_SEQ_ELEM_236(_) BOOST_PP_SEQ_ELEM_235
+# define BOOST_PP_SEQ_ELEM_237(_) BOOST_PP_SEQ_ELEM_236
+# define BOOST_PP_SEQ_ELEM_238(_) BOOST_PP_SEQ_ELEM_237
+# define BOOST_PP_SEQ_ELEM_239(_) BOOST_PP_SEQ_ELEM_238
+# define BOOST_PP_SEQ_ELEM_240(_) BOOST_PP_SEQ_ELEM_239
+# define BOOST_PP_SEQ_ELEM_241(_) BOOST_PP_SEQ_ELEM_240
+# define BOOST_PP_SEQ_ELEM_242(_) BOOST_PP_SEQ_ELEM_241
+# define BOOST_PP_SEQ_ELEM_243(_) BOOST_PP_SEQ_ELEM_242
+# define BOOST_PP_SEQ_ELEM_244(_) BOOST_PP_SEQ_ELEM_243
+# define BOOST_PP_SEQ_ELEM_245(_) BOOST_PP_SEQ_ELEM_244
+# define BOOST_PP_SEQ_ELEM_246(_) BOOST_PP_SEQ_ELEM_245
+# define BOOST_PP_SEQ_ELEM_247(_) BOOST_PP_SEQ_ELEM_246
+# define BOOST_PP_SEQ_ELEM_248(_) BOOST_PP_SEQ_ELEM_247
+# define BOOST_PP_SEQ_ELEM_249(_) BOOST_PP_SEQ_ELEM_248
+# define BOOST_PP_SEQ_ELEM_250(_) BOOST_PP_SEQ_ELEM_249
+# define BOOST_PP_SEQ_ELEM_251(_) BOOST_PP_SEQ_ELEM_250
+# define BOOST_PP_SEQ_ELEM_252(_) BOOST_PP_SEQ_ELEM_251
+# define BOOST_PP_SEQ_ELEM_253(_) BOOST_PP_SEQ_ELEM_252
+# define BOOST_PP_SEQ_ELEM_254(_) BOOST_PP_SEQ_ELEM_253
+# define BOOST_PP_SEQ_ELEM_255(_) BOOST_PP_SEQ_ELEM_254
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/enum.hpp
new file mode 100644
index 0000000..b63b242
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/enum.hpp
@@ -0,0 +1,288 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_ENUM_HPP
+# define BOOST_PREPROCESSOR_SEQ_ENUM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+#
+# /* BOOST_PP_SEQ_ENUM */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(seq)
+#    define BOOST_PP_SEQ_ENUM_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(BOOST_PP_SEQ_SIZE(seq), seq)
+#    define BOOST_PP_SEQ_ENUM_I(size, seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, size) seq
+# else
+#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq
+# endif
+#
+# define BOOST_PP_SEQ_ENUM_1(x) x
+# define BOOST_PP_SEQ_ENUM_2(x) x, BOOST_PP_SEQ_ENUM_1
+# define BOOST_PP_SEQ_ENUM_3(x) x, BOOST_PP_SEQ_ENUM_2
+# define BOOST_PP_SEQ_ENUM_4(x) x, BOOST_PP_SEQ_ENUM_3
+# define BOOST_PP_SEQ_ENUM_5(x) x, BOOST_PP_SEQ_ENUM_4
+# define BOOST_PP_SEQ_ENUM_6(x) x, BOOST_PP_SEQ_ENUM_5
+# define BOOST_PP_SEQ_ENUM_7(x) x, BOOST_PP_SEQ_ENUM_6
+# define BOOST_PP_SEQ_ENUM_8(x) x, BOOST_PP_SEQ_ENUM_7
+# define BOOST_PP_SEQ_ENUM_9(x) x, BOOST_PP_SEQ_ENUM_8
+# define BOOST_PP_SEQ_ENUM_10(x) x, BOOST_PP_SEQ_ENUM_9
+# define BOOST_PP_SEQ_ENUM_11(x) x, BOOST_PP_SEQ_ENUM_10
+# define BOOST_PP_SEQ_ENUM_12(x) x, BOOST_PP_SEQ_ENUM_11
+# define BOOST_PP_SEQ_ENUM_13(x) x, BOOST_PP_SEQ_ENUM_12
+# define BOOST_PP_SEQ_ENUM_14(x) x, BOOST_PP_SEQ_ENUM_13
+# define BOOST_PP_SEQ_ENUM_15(x) x, BOOST_PP_SEQ_ENUM_14
+# define BOOST_PP_SEQ_ENUM_16(x) x, BOOST_PP_SEQ_ENUM_15
+# define BOOST_PP_SEQ_ENUM_17(x) x, BOOST_PP_SEQ_ENUM_16
+# define BOOST_PP_SEQ_ENUM_18(x) x, BOOST_PP_SEQ_ENUM_17
+# define BOOST_PP_SEQ_ENUM_19(x) x, BOOST_PP_SEQ_ENUM_18
+# define BOOST_PP_SEQ_ENUM_20(x) x, BOOST_PP_SEQ_ENUM_19
+# define BOOST_PP_SEQ_ENUM_21(x) x, BOOST_PP_SEQ_ENUM_20
+# define BOOST_PP_SEQ_ENUM_22(x) x, BOOST_PP_SEQ_ENUM_21
+# define BOOST_PP_SEQ_ENUM_23(x) x, BOOST_PP_SEQ_ENUM_22
+# define BOOST_PP_SEQ_ENUM_24(x) x, BOOST_PP_SEQ_ENUM_23
+# define BOOST_PP_SEQ_ENUM_25(x) x, BOOST_PP_SEQ_ENUM_24
+# define BOOST_PP_SEQ_ENUM_26(x) x, BOOST_PP_SEQ_ENUM_25
+# define BOOST_PP_SEQ_ENUM_27(x) x, BOOST_PP_SEQ_ENUM_26
+# define BOOST_PP_SEQ_ENUM_28(x) x, BOOST_PP_SEQ_ENUM_27
+# define BOOST_PP_SEQ_ENUM_29(x) x, BOOST_PP_SEQ_ENUM_28
+# define BOOST_PP_SEQ_ENUM_30(x) x, BOOST_PP_SEQ_ENUM_29
+# define BOOST_PP_SEQ_ENUM_31(x) x, BOOST_PP_SEQ_ENUM_30
+# define BOOST_PP_SEQ_ENUM_32(x) x, BOOST_PP_SEQ_ENUM_31
+# define BOOST_PP_SEQ_ENUM_33(x) x, BOOST_PP_SEQ_ENUM_32
+# define BOOST_PP_SEQ_ENUM_34(x) x, BOOST_PP_SEQ_ENUM_33
+# define BOOST_PP_SEQ_ENUM_35(x) x, BOOST_PP_SEQ_ENUM_34
+# define BOOST_PP_SEQ_ENUM_36(x) x, BOOST_PP_SEQ_ENUM_35
+# define BOOST_PP_SEQ_ENUM_37(x) x, BOOST_PP_SEQ_ENUM_36
+# define BOOST_PP_SEQ_ENUM_38(x) x, BOOST_PP_SEQ_ENUM_37
+# define BOOST_PP_SEQ_ENUM_39(x) x, BOOST_PP_SEQ_ENUM_38
+# define BOOST_PP_SEQ_ENUM_40(x) x, BOOST_PP_SEQ_ENUM_39
+# define BOOST_PP_SEQ_ENUM_41(x) x, BOOST_PP_SEQ_ENUM_40
+# define BOOST_PP_SEQ_ENUM_42(x) x, BOOST_PP_SEQ_ENUM_41
+# define BOOST_PP_SEQ_ENUM_43(x) x, BOOST_PP_SEQ_ENUM_42
+# define BOOST_PP_SEQ_ENUM_44(x) x, BOOST_PP_SEQ_ENUM_43
+# define BOOST_PP_SEQ_ENUM_45(x) x, BOOST_PP_SEQ_ENUM_44
+# define BOOST_PP_SEQ_ENUM_46(x) x, BOOST_PP_SEQ_ENUM_45
+# define BOOST_PP_SEQ_ENUM_47(x) x, BOOST_PP_SEQ_ENUM_46
+# define BOOST_PP_SEQ_ENUM_48(x) x, BOOST_PP_SEQ_ENUM_47
+# define BOOST_PP_SEQ_ENUM_49(x) x, BOOST_PP_SEQ_ENUM_48
+# define BOOST_PP_SEQ_ENUM_50(x) x, BOOST_PP_SEQ_ENUM_49
+# define BOOST_PP_SEQ_ENUM_51(x) x, BOOST_PP_SEQ_ENUM_50
+# define BOOST_PP_SEQ_ENUM_52(x) x, BOOST_PP_SEQ_ENUM_51
+# define BOOST_PP_SEQ_ENUM_53(x) x, BOOST_PP_SEQ_ENUM_52
+# define BOOST_PP_SEQ_ENUM_54(x) x, BOOST_PP_SEQ_ENUM_53
+# define BOOST_PP_SEQ_ENUM_55(x) x, BOOST_PP_SEQ_ENUM_54
+# define BOOST_PP_SEQ_ENUM_56(x) x, BOOST_PP_SEQ_ENUM_55
+# define BOOST_PP_SEQ_ENUM_57(x) x, BOOST_PP_SEQ_ENUM_56
+# define BOOST_PP_SEQ_ENUM_58(x) x, BOOST_PP_SEQ_ENUM_57
+# define BOOST_PP_SEQ_ENUM_59(x) x, BOOST_PP_SEQ_ENUM_58
+# define BOOST_PP_SEQ_ENUM_60(x) x, BOOST_PP_SEQ_ENUM_59
+# define BOOST_PP_SEQ_ENUM_61(x) x, BOOST_PP_SEQ_ENUM_60
+# define BOOST_PP_SEQ_ENUM_62(x) x, BOOST_PP_SEQ_ENUM_61
+# define BOOST_PP_SEQ_ENUM_63(x) x, BOOST_PP_SEQ_ENUM_62
+# define BOOST_PP_SEQ_ENUM_64(x) x, BOOST_PP_SEQ_ENUM_63
+# define BOOST_PP_SEQ_ENUM_65(x) x, BOOST_PP_SEQ_ENUM_64
+# define BOOST_PP_SEQ_ENUM_66(x) x, BOOST_PP_SEQ_ENUM_65
+# define BOOST_PP_SEQ_ENUM_67(x) x, BOOST_PP_SEQ_ENUM_66
+# define BOOST_PP_SEQ_ENUM_68(x) x, BOOST_PP_SEQ_ENUM_67
+# define BOOST_PP_SEQ_ENUM_69(x) x, BOOST_PP_SEQ_ENUM_68
+# define BOOST_PP_SEQ_ENUM_70(x) x, BOOST_PP_SEQ_ENUM_69
+# define BOOST_PP_SEQ_ENUM_71(x) x, BOOST_PP_SEQ_ENUM_70
+# define BOOST_PP_SEQ_ENUM_72(x) x, BOOST_PP_SEQ_ENUM_71
+# define BOOST_PP_SEQ_ENUM_73(x) x, BOOST_PP_SEQ_ENUM_72
+# define BOOST_PP_SEQ_ENUM_74(x) x, BOOST_PP_SEQ_ENUM_73
+# define BOOST_PP_SEQ_ENUM_75(x) x, BOOST_PP_SEQ_ENUM_74
+# define BOOST_PP_SEQ_ENUM_76(x) x, BOOST_PP_SEQ_ENUM_75
+# define BOOST_PP_SEQ_ENUM_77(x) x, BOOST_PP_SEQ_ENUM_76
+# define BOOST_PP_SEQ_ENUM_78(x) x, BOOST_PP_SEQ_ENUM_77
+# define BOOST_PP_SEQ_ENUM_79(x) x, BOOST_PP_SEQ_ENUM_78
+# define BOOST_PP_SEQ_ENUM_80(x) x, BOOST_PP_SEQ_ENUM_79
+# define BOOST_PP_SEQ_ENUM_81(x) x, BOOST_PP_SEQ_ENUM_80
+# define BOOST_PP_SEQ_ENUM_82(x) x, BOOST_PP_SEQ_ENUM_81
+# define BOOST_PP_SEQ_ENUM_83(x) x, BOOST_PP_SEQ_ENUM_82
+# define BOOST_PP_SEQ_ENUM_84(x) x, BOOST_PP_SEQ_ENUM_83
+# define BOOST_PP_SEQ_ENUM_85(x) x, BOOST_PP_SEQ_ENUM_84
+# define BOOST_PP_SEQ_ENUM_86(x) x, BOOST_PP_SEQ_ENUM_85
+# define BOOST_PP_SEQ_ENUM_87(x) x, BOOST_PP_SEQ_ENUM_86
+# define BOOST_PP_SEQ_ENUM_88(x) x, BOOST_PP_SEQ_ENUM_87
+# define BOOST_PP_SEQ_ENUM_89(x) x, BOOST_PP_SEQ_ENUM_88
+# define BOOST_PP_SEQ_ENUM_90(x) x, BOOST_PP_SEQ_ENUM_89
+# define BOOST_PP_SEQ_ENUM_91(x) x, BOOST_PP_SEQ_ENUM_90
+# define BOOST_PP_SEQ_ENUM_92(x) x, BOOST_PP_SEQ_ENUM_91
+# define BOOST_PP_SEQ_ENUM_93(x) x, BOOST_PP_SEQ_ENUM_92
+# define BOOST_PP_SEQ_ENUM_94(x) x, BOOST_PP_SEQ_ENUM_93
+# define BOOST_PP_SEQ_ENUM_95(x) x, BOOST_PP_SEQ_ENUM_94
+# define BOOST_PP_SEQ_ENUM_96(x) x, BOOST_PP_SEQ_ENUM_95
+# define BOOST_PP_SEQ_ENUM_97(x) x, BOOST_PP_SEQ_ENUM_96
+# define BOOST_PP_SEQ_ENUM_98(x) x, BOOST_PP_SEQ_ENUM_97
+# define BOOST_PP_SEQ_ENUM_99(x) x, BOOST_PP_SEQ_ENUM_98
+# define BOOST_PP_SEQ_ENUM_100(x) x, BOOST_PP_SEQ_ENUM_99
+# define BOOST_PP_SEQ_ENUM_101(x) x, BOOST_PP_SEQ_ENUM_100
+# define BOOST_PP_SEQ_ENUM_102(x) x, BOOST_PP_SEQ_ENUM_101
+# define BOOST_PP_SEQ_ENUM_103(x) x, BOOST_PP_SEQ_ENUM_102
+# define BOOST_PP_SEQ_ENUM_104(x) x, BOOST_PP_SEQ_ENUM_103
+# define BOOST_PP_SEQ_ENUM_105(x) x, BOOST_PP_SEQ_ENUM_104
+# define BOOST_PP_SEQ_ENUM_106(x) x, BOOST_PP_SEQ_ENUM_105
+# define BOOST_PP_SEQ_ENUM_107(x) x, BOOST_PP_SEQ_ENUM_106
+# define BOOST_PP_SEQ_ENUM_108(x) x, BOOST_PP_SEQ_ENUM_107
+# define BOOST_PP_SEQ_ENUM_109(x) x, BOOST_PP_SEQ_ENUM_108
+# define BOOST_PP_SEQ_ENUM_110(x) x, BOOST_PP_SEQ_ENUM_109
+# define BOOST_PP_SEQ_ENUM_111(x) x, BOOST_PP_SEQ_ENUM_110
+# define BOOST_PP_SEQ_ENUM_112(x) x, BOOST_PP_SEQ_ENUM_111
+# define BOOST_PP_SEQ_ENUM_113(x) x, BOOST_PP_SEQ_ENUM_112
+# define BOOST_PP_SEQ_ENUM_114(x) x, BOOST_PP_SEQ_ENUM_113
+# define BOOST_PP_SEQ_ENUM_115(x) x, BOOST_PP_SEQ_ENUM_114
+# define BOOST_PP_SEQ_ENUM_116(x) x, BOOST_PP_SEQ_ENUM_115
+# define BOOST_PP_SEQ_ENUM_117(x) x, BOOST_PP_SEQ_ENUM_116
+# define BOOST_PP_SEQ_ENUM_118(x) x, BOOST_PP_SEQ_ENUM_117
+# define BOOST_PP_SEQ_ENUM_119(x) x, BOOST_PP_SEQ_ENUM_118
+# define BOOST_PP_SEQ_ENUM_120(x) x, BOOST_PP_SEQ_ENUM_119
+# define BOOST_PP_SEQ_ENUM_121(x) x, BOOST_PP_SEQ_ENUM_120
+# define BOOST_PP_SEQ_ENUM_122(x) x, BOOST_PP_SEQ_ENUM_121
+# define BOOST_PP_SEQ_ENUM_123(x) x, BOOST_PP_SEQ_ENUM_122
+# define BOOST_PP_SEQ_ENUM_124(x) x, BOOST_PP_SEQ_ENUM_123
+# define BOOST_PP_SEQ_ENUM_125(x) x, BOOST_PP_SEQ_ENUM_124
+# define BOOST_PP_SEQ_ENUM_126(x) x, BOOST_PP_SEQ_ENUM_125
+# define BOOST_PP_SEQ_ENUM_127(x) x, BOOST_PP_SEQ_ENUM_126
+# define BOOST_PP_SEQ_ENUM_128(x) x, BOOST_PP_SEQ_ENUM_127
+# define BOOST_PP_SEQ_ENUM_129(x) x, BOOST_PP_SEQ_ENUM_128
+# define BOOST_PP_SEQ_ENUM_130(x) x, BOOST_PP_SEQ_ENUM_129
+# define BOOST_PP_SEQ_ENUM_131(x) x, BOOST_PP_SEQ_ENUM_130
+# define BOOST_PP_SEQ_ENUM_132(x) x, BOOST_PP_SEQ_ENUM_131
+# define BOOST_PP_SEQ_ENUM_133(x) x, BOOST_PP_SEQ_ENUM_132
+# define BOOST_PP_SEQ_ENUM_134(x) x, BOOST_PP_SEQ_ENUM_133
+# define BOOST_PP_SEQ_ENUM_135(x) x, BOOST_PP_SEQ_ENUM_134
+# define BOOST_PP_SEQ_ENUM_136(x) x, BOOST_PP_SEQ_ENUM_135
+# define BOOST_PP_SEQ_ENUM_137(x) x, BOOST_PP_SEQ_ENUM_136
+# define BOOST_PP_SEQ_ENUM_138(x) x, BOOST_PP_SEQ_ENUM_137
+# define BOOST_PP_SEQ_ENUM_139(x) x, BOOST_PP_SEQ_ENUM_138
+# define BOOST_PP_SEQ_ENUM_140(x) x, BOOST_PP_SEQ_ENUM_139
+# define BOOST_PP_SEQ_ENUM_141(x) x, BOOST_PP_SEQ_ENUM_140
+# define BOOST_PP_SEQ_ENUM_142(x) x, BOOST_PP_SEQ_ENUM_141
+# define BOOST_PP_SEQ_ENUM_143(x) x, BOOST_PP_SEQ_ENUM_142
+# define BOOST_PP_SEQ_ENUM_144(x) x, BOOST_PP_SEQ_ENUM_143
+# define BOOST_PP_SEQ_ENUM_145(x) x, BOOST_PP_SEQ_ENUM_144
+# define BOOST_PP_SEQ_ENUM_146(x) x, BOOST_PP_SEQ_ENUM_145
+# define BOOST_PP_SEQ_ENUM_147(x) x, BOOST_PP_SEQ_ENUM_146
+# define BOOST_PP_SEQ_ENUM_148(x) x, BOOST_PP_SEQ_ENUM_147
+# define BOOST_PP_SEQ_ENUM_149(x) x, BOOST_PP_SEQ_ENUM_148
+# define BOOST_PP_SEQ_ENUM_150(x) x, BOOST_PP_SEQ_ENUM_149
+# define BOOST_PP_SEQ_ENUM_151(x) x, BOOST_PP_SEQ_ENUM_150
+# define BOOST_PP_SEQ_ENUM_152(x) x, BOOST_PP_SEQ_ENUM_151
+# define BOOST_PP_SEQ_ENUM_153(x) x, BOOST_PP_SEQ_ENUM_152
+# define BOOST_PP_SEQ_ENUM_154(x) x, BOOST_PP_SEQ_ENUM_153
+# define BOOST_PP_SEQ_ENUM_155(x) x, BOOST_PP_SEQ_ENUM_154
+# define BOOST_PP_SEQ_ENUM_156(x) x, BOOST_PP_SEQ_ENUM_155
+# define BOOST_PP_SEQ_ENUM_157(x) x, BOOST_PP_SEQ_ENUM_156
+# define BOOST_PP_SEQ_ENUM_158(x) x, BOOST_PP_SEQ_ENUM_157
+# define BOOST_PP_SEQ_ENUM_159(x) x, BOOST_PP_SEQ_ENUM_158
+# define BOOST_PP_SEQ_ENUM_160(x) x, BOOST_PP_SEQ_ENUM_159
+# define BOOST_PP_SEQ_ENUM_161(x) x, BOOST_PP_SEQ_ENUM_160
+# define BOOST_PP_SEQ_ENUM_162(x) x, BOOST_PP_SEQ_ENUM_161
+# define BOOST_PP_SEQ_ENUM_163(x) x, BOOST_PP_SEQ_ENUM_162
+# define BOOST_PP_SEQ_ENUM_164(x) x, BOOST_PP_SEQ_ENUM_163
+# define BOOST_PP_SEQ_ENUM_165(x) x, BOOST_PP_SEQ_ENUM_164
+# define BOOST_PP_SEQ_ENUM_166(x) x, BOOST_PP_SEQ_ENUM_165
+# define BOOST_PP_SEQ_ENUM_167(x) x, BOOST_PP_SEQ_ENUM_166
+# define BOOST_PP_SEQ_ENUM_168(x) x, BOOST_PP_SEQ_ENUM_167
+# define BOOST_PP_SEQ_ENUM_169(x) x, BOOST_PP_SEQ_ENUM_168
+# define BOOST_PP_SEQ_ENUM_170(x) x, BOOST_PP_SEQ_ENUM_169
+# define BOOST_PP_SEQ_ENUM_171(x) x, BOOST_PP_SEQ_ENUM_170
+# define BOOST_PP_SEQ_ENUM_172(x) x, BOOST_PP_SEQ_ENUM_171
+# define BOOST_PP_SEQ_ENUM_173(x) x, BOOST_PP_SEQ_ENUM_172
+# define BOOST_PP_SEQ_ENUM_174(x) x, BOOST_PP_SEQ_ENUM_173
+# define BOOST_PP_SEQ_ENUM_175(x) x, BOOST_PP_SEQ_ENUM_174
+# define BOOST_PP_SEQ_ENUM_176(x) x, BOOST_PP_SEQ_ENUM_175
+# define BOOST_PP_SEQ_ENUM_177(x) x, BOOST_PP_SEQ_ENUM_176
+# define BOOST_PP_SEQ_ENUM_178(x) x, BOOST_PP_SEQ_ENUM_177
+# define BOOST_PP_SEQ_ENUM_179(x) x, BOOST_PP_SEQ_ENUM_178
+# define BOOST_PP_SEQ_ENUM_180(x) x, BOOST_PP_SEQ_ENUM_179
+# define BOOST_PP_SEQ_ENUM_181(x) x, BOOST_PP_SEQ_ENUM_180
+# define BOOST_PP_SEQ_ENUM_182(x) x, BOOST_PP_SEQ_ENUM_181
+# define BOOST_PP_SEQ_ENUM_183(x) x, BOOST_PP_SEQ_ENUM_182
+# define BOOST_PP_SEQ_ENUM_184(x) x, BOOST_PP_SEQ_ENUM_183
+# define BOOST_PP_SEQ_ENUM_185(x) x, BOOST_PP_SEQ_ENUM_184
+# define BOOST_PP_SEQ_ENUM_186(x) x, BOOST_PP_SEQ_ENUM_185
+# define BOOST_PP_SEQ_ENUM_187(x) x, BOOST_PP_SEQ_ENUM_186
+# define BOOST_PP_SEQ_ENUM_188(x) x, BOOST_PP_SEQ_ENUM_187
+# define BOOST_PP_SEQ_ENUM_189(x) x, BOOST_PP_SEQ_ENUM_188
+# define BOOST_PP_SEQ_ENUM_190(x) x, BOOST_PP_SEQ_ENUM_189
+# define BOOST_PP_SEQ_ENUM_191(x) x, BOOST_PP_SEQ_ENUM_190
+# define BOOST_PP_SEQ_ENUM_192(x) x, BOOST_PP_SEQ_ENUM_191
+# define BOOST_PP_SEQ_ENUM_193(x) x, BOOST_PP_SEQ_ENUM_192
+# define BOOST_PP_SEQ_ENUM_194(x) x, BOOST_PP_SEQ_ENUM_193
+# define BOOST_PP_SEQ_ENUM_195(x) x, BOOST_PP_SEQ_ENUM_194
+# define BOOST_PP_SEQ_ENUM_196(x) x, BOOST_PP_SEQ_ENUM_195
+# define BOOST_PP_SEQ_ENUM_197(x) x, BOOST_PP_SEQ_ENUM_196
+# define BOOST_PP_SEQ_ENUM_198(x) x, BOOST_PP_SEQ_ENUM_197
+# define BOOST_PP_SEQ_ENUM_199(x) x, BOOST_PP_SEQ_ENUM_198
+# define BOOST_PP_SEQ_ENUM_200(x) x, BOOST_PP_SEQ_ENUM_199
+# define BOOST_PP_SEQ_ENUM_201(x) x, BOOST_PP_SEQ_ENUM_200
+# define BOOST_PP_SEQ_ENUM_202(x) x, BOOST_PP_SEQ_ENUM_201
+# define BOOST_PP_SEQ_ENUM_203(x) x, BOOST_PP_SEQ_ENUM_202
+# define BOOST_PP_SEQ_ENUM_204(x) x, BOOST_PP_SEQ_ENUM_203
+# define BOOST_PP_SEQ_ENUM_205(x) x, BOOST_PP_SEQ_ENUM_204
+# define BOOST_PP_SEQ_ENUM_206(x) x, BOOST_PP_SEQ_ENUM_205
+# define BOOST_PP_SEQ_ENUM_207(x) x, BOOST_PP_SEQ_ENUM_206
+# define BOOST_PP_SEQ_ENUM_208(x) x, BOOST_PP_SEQ_ENUM_207
+# define BOOST_PP_SEQ_ENUM_209(x) x, BOOST_PP_SEQ_ENUM_208
+# define BOOST_PP_SEQ_ENUM_210(x) x, BOOST_PP_SEQ_ENUM_209
+# define BOOST_PP_SEQ_ENUM_211(x) x, BOOST_PP_SEQ_ENUM_210
+# define BOOST_PP_SEQ_ENUM_212(x) x, BOOST_PP_SEQ_ENUM_211
+# define BOOST_PP_SEQ_ENUM_213(x) x, BOOST_PP_SEQ_ENUM_212
+# define BOOST_PP_SEQ_ENUM_214(x) x, BOOST_PP_SEQ_ENUM_213
+# define BOOST_PP_SEQ_ENUM_215(x) x, BOOST_PP_SEQ_ENUM_214
+# define BOOST_PP_SEQ_ENUM_216(x) x, BOOST_PP_SEQ_ENUM_215
+# define BOOST_PP_SEQ_ENUM_217(x) x, BOOST_PP_SEQ_ENUM_216
+# define BOOST_PP_SEQ_ENUM_218(x) x, BOOST_PP_SEQ_ENUM_217
+# define BOOST_PP_SEQ_ENUM_219(x) x, BOOST_PP_SEQ_ENUM_218
+# define BOOST_PP_SEQ_ENUM_220(x) x, BOOST_PP_SEQ_ENUM_219
+# define BOOST_PP_SEQ_ENUM_221(x) x, BOOST_PP_SEQ_ENUM_220
+# define BOOST_PP_SEQ_ENUM_222(x) x, BOOST_PP_SEQ_ENUM_221
+# define BOOST_PP_SEQ_ENUM_223(x) x, BOOST_PP_SEQ_ENUM_222
+# define BOOST_PP_SEQ_ENUM_224(x) x, BOOST_PP_SEQ_ENUM_223
+# define BOOST_PP_SEQ_ENUM_225(x) x, BOOST_PP_SEQ_ENUM_224
+# define BOOST_PP_SEQ_ENUM_226(x) x, BOOST_PP_SEQ_ENUM_225
+# define BOOST_PP_SEQ_ENUM_227(x) x, BOOST_PP_SEQ_ENUM_226
+# define BOOST_PP_SEQ_ENUM_228(x) x, BOOST_PP_SEQ_ENUM_227
+# define BOOST_PP_SEQ_ENUM_229(x) x, BOOST_PP_SEQ_ENUM_228
+# define BOOST_PP_SEQ_ENUM_230(x) x, BOOST_PP_SEQ_ENUM_229
+# define BOOST_PP_SEQ_ENUM_231(x) x, BOOST_PP_SEQ_ENUM_230
+# define BOOST_PP_SEQ_ENUM_232(x) x, BOOST_PP_SEQ_ENUM_231
+# define BOOST_PP_SEQ_ENUM_233(x) x, BOOST_PP_SEQ_ENUM_232
+# define BOOST_PP_SEQ_ENUM_234(x) x, BOOST_PP_SEQ_ENUM_233
+# define BOOST_PP_SEQ_ENUM_235(x) x, BOOST_PP_SEQ_ENUM_234
+# define BOOST_PP_SEQ_ENUM_236(x) x, BOOST_PP_SEQ_ENUM_235
+# define BOOST_PP_SEQ_ENUM_237(x) x, BOOST_PP_SEQ_ENUM_236
+# define BOOST_PP_SEQ_ENUM_238(x) x, BOOST_PP_SEQ_ENUM_237
+# define BOOST_PP_SEQ_ENUM_239(x) x, BOOST_PP_SEQ_ENUM_238
+# define BOOST_PP_SEQ_ENUM_240(x) x, BOOST_PP_SEQ_ENUM_239
+# define BOOST_PP_SEQ_ENUM_241(x) x, BOOST_PP_SEQ_ENUM_240
+# define BOOST_PP_SEQ_ENUM_242(x) x, BOOST_PP_SEQ_ENUM_241
+# define BOOST_PP_SEQ_ENUM_243(x) x, BOOST_PP_SEQ_ENUM_242
+# define BOOST_PP_SEQ_ENUM_244(x) x, BOOST_PP_SEQ_ENUM_243
+# define BOOST_PP_SEQ_ENUM_245(x) x, BOOST_PP_SEQ_ENUM_244
+# define BOOST_PP_SEQ_ENUM_246(x) x, BOOST_PP_SEQ_ENUM_245
+# define BOOST_PP_SEQ_ENUM_247(x) x, BOOST_PP_SEQ_ENUM_246
+# define BOOST_PP_SEQ_ENUM_248(x) x, BOOST_PP_SEQ_ENUM_247
+# define BOOST_PP_SEQ_ENUM_249(x) x, BOOST_PP_SEQ_ENUM_248
+# define BOOST_PP_SEQ_ENUM_250(x) x, BOOST_PP_SEQ_ENUM_249
+# define BOOST_PP_SEQ_ENUM_251(x) x, BOOST_PP_SEQ_ENUM_250
+# define BOOST_PP_SEQ_ENUM_252(x) x, BOOST_PP_SEQ_ENUM_251
+# define BOOST_PP_SEQ_ENUM_253(x) x, BOOST_PP_SEQ_ENUM_252
+# define BOOST_PP_SEQ_ENUM_254(x) x, BOOST_PP_SEQ_ENUM_253
+# define BOOST_PP_SEQ_ENUM_255(x) x, BOOST_PP_SEQ_ENUM_254
+# define BOOST_PP_SEQ_ENUM_256(x) x, BOOST_PP_SEQ_ENUM_255
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/filter.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/filter.hpp
new file mode 100644
index 0000000..4596bfe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/filter.hpp
@@ -0,0 +1,54 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FILTER_HPP
+# define BOOST_PREPROCESSOR_SEQ_FILTER_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/expr_if.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_FILTER */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FILTER(pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))
+# else
+#    define BOOST_PP_SEQ_FILTER(pred, data, seq) BOOST_PP_SEQ_FILTER_I(pred, data, seq)
+#    define BOOST_PP_SEQ_FILTER_I(pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FILTER_O(s, st, elem) BOOST_PP_SEQ_FILTER_O_IM(s, BOOST_PP_TUPLE_REM_3 st, elem)
+#    define BOOST_PP_SEQ_FILTER_O_IM(s, im, elem) BOOST_PP_SEQ_FILTER_O_I(s, im, elem)
+# else
+#    define BOOST_PP_SEQ_FILTER_O(s, st, elem) BOOST_PP_SEQ_FILTER_O_I(s, BOOST_PP_TUPLE_ELEM(3, 0, st), BOOST_PP_TUPLE_ELEM(3, 1, st), BOOST_PP_TUPLE_ELEM(3, 2, st), elem)
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#   define BOOST_PP_SEQ_FILTER_O_I(s, pred, data, res, elem) (pred, data, res BOOST_PP_EXPR_IF(pred(s, data, elem), (elem)))
+# else
+#   define BOOST_PP_SEQ_FILTER_O_I(s, pred, data, res, elem) (pred, data, res BOOST_PP_EXPR_IF(pred##(s, data, elem), (elem)))
+# endif
+#
+# /* BOOST_PP_SEQ_FILTER_S */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FILTER_S(s, pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))
+# else
+#    define BOOST_PP_SEQ_FILTER_S(s, pred, data, seq) BOOST_PP_SEQ_FILTER_S_I(s, pred, data, seq)
+#    define BOOST_PP_SEQ_FILTER_S_I(s, pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/first_n.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/first_n.hpp
new file mode 100644
index 0000000..c3c0716
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/first_n.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP
+# define BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/seq/detail/split.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_SEQ_FIRST_N */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))
+# else
+#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_SEQ_FIRST_N_I(n, seq)
+#    define BOOST_PP_SEQ_FIRST_N_I(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/fold_left.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/fold_left.hpp
new file mode 100644
index 0000000..ab051b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/fold_left.hpp
@@ -0,0 +1,1070 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP
+# define BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/debug/error.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+#
+# /* BOOST_PP_SEQ_FOLD_LEFT */
+#
+# if 0
+#    define BOOST_PP_SEQ_FOLD_LEFT(op, state, seq) ...
+# endif
+#
+# define BOOST_PP_SEQ_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256))
+# define BOOST_PP_SEQ_FOLD_LEFT_P(n) BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_CHECK_, BOOST_PP_SEQ_FOLD_LEFT_I_ ## n(BOOST_PP_SEQ_FOLD_LEFT_O, BOOST_PP_NIL, (nil), 1))
+# define BOOST_PP_SEQ_FOLD_LEFT_O(s, st, _) st
+#
+# define BOOST_PP_SEQ_FOLD_LEFT_257(op, st, ss) BOOST_PP_ERROR(0x0005)
+# define BOOST_PP_SEQ_FOLD_LEFT_I_257(op, st, ss, sz) BOOST_PP_ERROR(0x0005)
+#
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_NIL 1
+#
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) 0
+# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) 0
+#
+# define BOOST_PP_SEQ_FOLD_LEFT_F(op, st, ss, sz) st
+#
+# define BOOST_PP_SEQ_FOLD_LEFT_1(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_2(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_3(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_4(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_5(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_6(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_7(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_8(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_9(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_10(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_11(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_12(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_13(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_14(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_15(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_16(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_17(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_18(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_19(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_20(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_21(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_22(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_23(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_24(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_25(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_26(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_27(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_28(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_29(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_30(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_31(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_32(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_33(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_34(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_35(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_36(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_37(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_38(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_39(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_40(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_41(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_42(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_43(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_44(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_45(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_46(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_47(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_48(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_49(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_50(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_51(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_52(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_53(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_54(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_55(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_56(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_57(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_58(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_59(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_60(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_61(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_62(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_63(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_64(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_65(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_66(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_67(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_68(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_69(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_70(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_71(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_72(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_73(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_74(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_75(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_76(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_77(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_78(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_79(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_80(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_81(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_82(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_83(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_84(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_85(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_86(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_87(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_88(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_89(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_90(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_91(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_92(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_93(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_94(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_95(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_96(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_97(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_98(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_99(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_100(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_101(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_102(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_103(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_104(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_105(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_106(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_107(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_108(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_109(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_110(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_111(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_112(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_113(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_114(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_115(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_116(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_117(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_118(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_119(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_120(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_121(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_122(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_123(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_124(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_125(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_126(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_127(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_128(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_129(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_130(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_131(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_132(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_133(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_134(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_135(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_136(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_137(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_138(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_139(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_140(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_141(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_142(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_143(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_144(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_145(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_146(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_147(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_148(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_149(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_150(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_151(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_152(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_153(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_154(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_155(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_156(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_157(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_158(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_159(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_160(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_161(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_162(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_163(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_164(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_165(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_166(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_167(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_168(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_169(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_170(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_171(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_172(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_173(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_174(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_175(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_176(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_177(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_178(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_179(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_180(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_181(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_182(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_183(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_184(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_185(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_186(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_187(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_188(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_189(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_190(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_191(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_192(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_193(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_194(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_195(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_196(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_197(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_198(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_199(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_200(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_201(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_202(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_203(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_204(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_205(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_206(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_207(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_208(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_209(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_210(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_211(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_212(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_213(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_214(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_215(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_216(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_217(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_218(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_219(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_220(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_221(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_222(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_223(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_224(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_225(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_226(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_227(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_228(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_229(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_230(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_231(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_232(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_233(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_234(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_235(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_236(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_237(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_238(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_239(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_240(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_241(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_242(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_243(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_244(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_245(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_246(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_247(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_248(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_249(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_250(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_251(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_252(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_253(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_254(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_255(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_LEFT_256(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, BOOST_PP_SEQ_SIZE(ss))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+# else
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/fold_right.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/fold_right.hpp
new file mode 100644
index 0000000..c2c365b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/fold_right.hpp
@@ -0,0 +1,288 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FOLD_RIGHT_HPP
+# define BOOST_PREPROCESSOR_SEQ_FOLD_RIGHT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/detail/auto_rec.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/reverse.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+#
+# /* BOOST_PP_SEQ_FOLD_RIGHT */
+#
+# if 0
+#    define BOOST_PP_SEQ_FOLD_RIGHT(op, state, seq) ...
+# endif
+#
+# define BOOST_PP_SEQ_FOLD_RIGHT BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_RIGHT_, BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256))
+#
+# define BOOST_PP_SEQ_FOLD_RIGHT_257(op, st, ss) BOOST_PP_ERROR(0x0005)
+#
+# define BOOST_PP_SEQ_FOLD_RIGHT_1(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, BOOST_PP_SEQ_REVERSE_S(2, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_2(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, BOOST_PP_SEQ_REVERSE_S(3, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_3(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, BOOST_PP_SEQ_REVERSE_S(4, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_4(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, BOOST_PP_SEQ_REVERSE_S(5, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_5(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, BOOST_PP_SEQ_REVERSE_S(6, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_6(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, BOOST_PP_SEQ_REVERSE_S(7, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_7(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, BOOST_PP_SEQ_REVERSE_S(8, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_8(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, BOOST_PP_SEQ_REVERSE_S(9, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_9(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, BOOST_PP_SEQ_REVERSE_S(10, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_10(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, BOOST_PP_SEQ_REVERSE_S(11, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_11(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, BOOST_PP_SEQ_REVERSE_S(12, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_12(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, BOOST_PP_SEQ_REVERSE_S(13, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_13(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, BOOST_PP_SEQ_REVERSE_S(14, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_14(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, BOOST_PP_SEQ_REVERSE_S(15, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_15(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, BOOST_PP_SEQ_REVERSE_S(16, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_16(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, BOOST_PP_SEQ_REVERSE_S(17, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_17(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, BOOST_PP_SEQ_REVERSE_S(18, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_18(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, BOOST_PP_SEQ_REVERSE_S(19, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_19(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, BOOST_PP_SEQ_REVERSE_S(20, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_20(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, BOOST_PP_SEQ_REVERSE_S(21, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_21(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, BOOST_PP_SEQ_REVERSE_S(22, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_22(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, BOOST_PP_SEQ_REVERSE_S(23, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_23(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, BOOST_PP_SEQ_REVERSE_S(24, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_24(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, BOOST_PP_SEQ_REVERSE_S(25, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_25(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, BOOST_PP_SEQ_REVERSE_S(26, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_26(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, BOOST_PP_SEQ_REVERSE_S(27, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_27(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, BOOST_PP_SEQ_REVERSE_S(28, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_28(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, BOOST_PP_SEQ_REVERSE_S(29, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_29(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, BOOST_PP_SEQ_REVERSE_S(30, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_30(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, BOOST_PP_SEQ_REVERSE_S(31, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_31(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, BOOST_PP_SEQ_REVERSE_S(32, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_32(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, BOOST_PP_SEQ_REVERSE_S(33, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_33(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, BOOST_PP_SEQ_REVERSE_S(34, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_34(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, BOOST_PP_SEQ_REVERSE_S(35, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_35(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, BOOST_PP_SEQ_REVERSE_S(36, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_36(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, BOOST_PP_SEQ_REVERSE_S(37, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_37(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, BOOST_PP_SEQ_REVERSE_S(38, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_38(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, BOOST_PP_SEQ_REVERSE_S(39, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_39(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, BOOST_PP_SEQ_REVERSE_S(40, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_40(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, BOOST_PP_SEQ_REVERSE_S(41, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_41(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, BOOST_PP_SEQ_REVERSE_S(42, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_42(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, BOOST_PP_SEQ_REVERSE_S(43, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_43(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, BOOST_PP_SEQ_REVERSE_S(44, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_44(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, BOOST_PP_SEQ_REVERSE_S(45, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_45(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, BOOST_PP_SEQ_REVERSE_S(46, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_46(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, BOOST_PP_SEQ_REVERSE_S(47, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_47(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, BOOST_PP_SEQ_REVERSE_S(48, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_48(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, BOOST_PP_SEQ_REVERSE_S(49, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_49(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, BOOST_PP_SEQ_REVERSE_S(50, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_50(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, BOOST_PP_SEQ_REVERSE_S(51, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_51(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, BOOST_PP_SEQ_REVERSE_S(52, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_52(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, BOOST_PP_SEQ_REVERSE_S(53, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_53(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, BOOST_PP_SEQ_REVERSE_S(54, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_54(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, BOOST_PP_SEQ_REVERSE_S(55, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_55(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, BOOST_PP_SEQ_REVERSE_S(56, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_56(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, BOOST_PP_SEQ_REVERSE_S(57, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_57(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, BOOST_PP_SEQ_REVERSE_S(58, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_58(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, BOOST_PP_SEQ_REVERSE_S(59, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_59(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, BOOST_PP_SEQ_REVERSE_S(60, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_60(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, BOOST_PP_SEQ_REVERSE_S(61, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_61(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, BOOST_PP_SEQ_REVERSE_S(62, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_62(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, BOOST_PP_SEQ_REVERSE_S(63, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_63(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, BOOST_PP_SEQ_REVERSE_S(64, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_64(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, BOOST_PP_SEQ_REVERSE_S(65, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_65(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, BOOST_PP_SEQ_REVERSE_S(66, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_66(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, BOOST_PP_SEQ_REVERSE_S(67, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_67(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, BOOST_PP_SEQ_REVERSE_S(68, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_68(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, BOOST_PP_SEQ_REVERSE_S(69, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_69(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, BOOST_PP_SEQ_REVERSE_S(70, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_70(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, BOOST_PP_SEQ_REVERSE_S(71, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_71(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, BOOST_PP_SEQ_REVERSE_S(72, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_72(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, BOOST_PP_SEQ_REVERSE_S(73, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_73(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, BOOST_PP_SEQ_REVERSE_S(74, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_74(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, BOOST_PP_SEQ_REVERSE_S(75, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_75(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, BOOST_PP_SEQ_REVERSE_S(76, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_76(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, BOOST_PP_SEQ_REVERSE_S(77, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_77(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, BOOST_PP_SEQ_REVERSE_S(78, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_78(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, BOOST_PP_SEQ_REVERSE_S(79, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_79(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, BOOST_PP_SEQ_REVERSE_S(80, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_80(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, BOOST_PP_SEQ_REVERSE_S(81, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_81(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, BOOST_PP_SEQ_REVERSE_S(82, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_82(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, BOOST_PP_SEQ_REVERSE_S(83, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_83(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, BOOST_PP_SEQ_REVERSE_S(84, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_84(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, BOOST_PP_SEQ_REVERSE_S(85, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_85(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, BOOST_PP_SEQ_REVERSE_S(86, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_86(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, BOOST_PP_SEQ_REVERSE_S(87, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_87(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, BOOST_PP_SEQ_REVERSE_S(88, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_88(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, BOOST_PP_SEQ_REVERSE_S(89, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_89(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, BOOST_PP_SEQ_REVERSE_S(90, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_90(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, BOOST_PP_SEQ_REVERSE_S(91, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_91(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, BOOST_PP_SEQ_REVERSE_S(92, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_92(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, BOOST_PP_SEQ_REVERSE_S(93, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_93(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, BOOST_PP_SEQ_REVERSE_S(94, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_94(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, BOOST_PP_SEQ_REVERSE_S(95, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_95(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, BOOST_PP_SEQ_REVERSE_S(96, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_96(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, BOOST_PP_SEQ_REVERSE_S(97, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_97(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, BOOST_PP_SEQ_REVERSE_S(98, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_98(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, BOOST_PP_SEQ_REVERSE_S(99, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_99(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, BOOST_PP_SEQ_REVERSE_S(100, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_100(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, BOOST_PP_SEQ_REVERSE_S(101, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_101(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, BOOST_PP_SEQ_REVERSE_S(102, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_102(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, BOOST_PP_SEQ_REVERSE_S(103, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_103(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, BOOST_PP_SEQ_REVERSE_S(104, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_104(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, BOOST_PP_SEQ_REVERSE_S(105, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_105(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, BOOST_PP_SEQ_REVERSE_S(106, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_106(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, BOOST_PP_SEQ_REVERSE_S(107, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_107(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, BOOST_PP_SEQ_REVERSE_S(108, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_108(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, BOOST_PP_SEQ_REVERSE_S(109, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_109(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, BOOST_PP_SEQ_REVERSE_S(110, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_110(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, BOOST_PP_SEQ_REVERSE_S(111, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_111(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, BOOST_PP_SEQ_REVERSE_S(112, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_112(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, BOOST_PP_SEQ_REVERSE_S(113, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_113(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, BOOST_PP_SEQ_REVERSE_S(114, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_114(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, BOOST_PP_SEQ_REVERSE_S(115, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_115(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, BOOST_PP_SEQ_REVERSE_S(116, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_116(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, BOOST_PP_SEQ_REVERSE_S(117, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_117(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, BOOST_PP_SEQ_REVERSE_S(118, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_118(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, BOOST_PP_SEQ_REVERSE_S(119, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_119(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, BOOST_PP_SEQ_REVERSE_S(120, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_120(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, BOOST_PP_SEQ_REVERSE_S(121, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_121(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, BOOST_PP_SEQ_REVERSE_S(122, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_122(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, BOOST_PP_SEQ_REVERSE_S(123, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_123(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, BOOST_PP_SEQ_REVERSE_S(124, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_124(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, BOOST_PP_SEQ_REVERSE_S(125, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_125(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, BOOST_PP_SEQ_REVERSE_S(126, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_126(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, BOOST_PP_SEQ_REVERSE_S(127, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_127(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, BOOST_PP_SEQ_REVERSE_S(128, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_128(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, BOOST_PP_SEQ_REVERSE_S(129, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_129(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, BOOST_PP_SEQ_REVERSE_S(130, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_130(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, BOOST_PP_SEQ_REVERSE_S(131, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_131(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, BOOST_PP_SEQ_REVERSE_S(132, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_132(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, BOOST_PP_SEQ_REVERSE_S(133, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_133(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, BOOST_PP_SEQ_REVERSE_S(134, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_134(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, BOOST_PP_SEQ_REVERSE_S(135, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_135(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, BOOST_PP_SEQ_REVERSE_S(136, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_136(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, BOOST_PP_SEQ_REVERSE_S(137, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_137(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, BOOST_PP_SEQ_REVERSE_S(138, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_138(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, BOOST_PP_SEQ_REVERSE_S(139, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_139(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, BOOST_PP_SEQ_REVERSE_S(140, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_140(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, BOOST_PP_SEQ_REVERSE_S(141, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_141(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, BOOST_PP_SEQ_REVERSE_S(142, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_142(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, BOOST_PP_SEQ_REVERSE_S(143, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_143(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, BOOST_PP_SEQ_REVERSE_S(144, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_144(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, BOOST_PP_SEQ_REVERSE_S(145, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_145(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, BOOST_PP_SEQ_REVERSE_S(146, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_146(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, BOOST_PP_SEQ_REVERSE_S(147, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_147(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, BOOST_PP_SEQ_REVERSE_S(148, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_148(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, BOOST_PP_SEQ_REVERSE_S(149, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_149(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, BOOST_PP_SEQ_REVERSE_S(150, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_150(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, BOOST_PP_SEQ_REVERSE_S(151, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_151(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, BOOST_PP_SEQ_REVERSE_S(152, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_152(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, BOOST_PP_SEQ_REVERSE_S(153, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_153(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, BOOST_PP_SEQ_REVERSE_S(154, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_154(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, BOOST_PP_SEQ_REVERSE_S(155, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_155(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, BOOST_PP_SEQ_REVERSE_S(156, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_156(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, BOOST_PP_SEQ_REVERSE_S(157, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_157(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, BOOST_PP_SEQ_REVERSE_S(158, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_158(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, BOOST_PP_SEQ_REVERSE_S(159, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_159(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, BOOST_PP_SEQ_REVERSE_S(160, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_160(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, BOOST_PP_SEQ_REVERSE_S(161, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_161(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, BOOST_PP_SEQ_REVERSE_S(162, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_162(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, BOOST_PP_SEQ_REVERSE_S(163, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_163(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, BOOST_PP_SEQ_REVERSE_S(164, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_164(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, BOOST_PP_SEQ_REVERSE_S(165, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_165(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, BOOST_PP_SEQ_REVERSE_S(166, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_166(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, BOOST_PP_SEQ_REVERSE_S(167, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_167(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, BOOST_PP_SEQ_REVERSE_S(168, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_168(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, BOOST_PP_SEQ_REVERSE_S(169, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_169(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, BOOST_PP_SEQ_REVERSE_S(170, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_170(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, BOOST_PP_SEQ_REVERSE_S(171, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_171(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, BOOST_PP_SEQ_REVERSE_S(172, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_172(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, BOOST_PP_SEQ_REVERSE_S(173, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_173(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, BOOST_PP_SEQ_REVERSE_S(174, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_174(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, BOOST_PP_SEQ_REVERSE_S(175, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_175(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, BOOST_PP_SEQ_REVERSE_S(176, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_176(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, BOOST_PP_SEQ_REVERSE_S(177, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_177(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, BOOST_PP_SEQ_REVERSE_S(178, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_178(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, BOOST_PP_SEQ_REVERSE_S(179, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_179(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, BOOST_PP_SEQ_REVERSE_S(180, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_180(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, BOOST_PP_SEQ_REVERSE_S(181, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_181(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, BOOST_PP_SEQ_REVERSE_S(182, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_182(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, BOOST_PP_SEQ_REVERSE_S(183, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_183(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, BOOST_PP_SEQ_REVERSE_S(184, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_184(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, BOOST_PP_SEQ_REVERSE_S(185, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_185(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, BOOST_PP_SEQ_REVERSE_S(186, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_186(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, BOOST_PP_SEQ_REVERSE_S(187, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_187(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, BOOST_PP_SEQ_REVERSE_S(188, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_188(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, BOOST_PP_SEQ_REVERSE_S(189, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_189(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, BOOST_PP_SEQ_REVERSE_S(190, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_190(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, BOOST_PP_SEQ_REVERSE_S(191, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_191(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, BOOST_PP_SEQ_REVERSE_S(192, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_192(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, BOOST_PP_SEQ_REVERSE_S(193, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_193(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, BOOST_PP_SEQ_REVERSE_S(194, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_194(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, BOOST_PP_SEQ_REVERSE_S(195, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_195(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, BOOST_PP_SEQ_REVERSE_S(196, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_196(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, BOOST_PP_SEQ_REVERSE_S(197, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_197(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, BOOST_PP_SEQ_REVERSE_S(198, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_198(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, BOOST_PP_SEQ_REVERSE_S(199, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_199(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, BOOST_PP_SEQ_REVERSE_S(200, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_200(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, BOOST_PP_SEQ_REVERSE_S(201, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_201(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, BOOST_PP_SEQ_REVERSE_S(202, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_202(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, BOOST_PP_SEQ_REVERSE_S(203, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_203(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, BOOST_PP_SEQ_REVERSE_S(204, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_204(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, BOOST_PP_SEQ_REVERSE_S(205, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_205(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, BOOST_PP_SEQ_REVERSE_S(206, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_206(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, BOOST_PP_SEQ_REVERSE_S(207, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_207(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, BOOST_PP_SEQ_REVERSE_S(208, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_208(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, BOOST_PP_SEQ_REVERSE_S(209, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_209(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, BOOST_PP_SEQ_REVERSE_S(210, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_210(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, BOOST_PP_SEQ_REVERSE_S(211, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_211(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, BOOST_PP_SEQ_REVERSE_S(212, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_212(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, BOOST_PP_SEQ_REVERSE_S(213, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_213(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, BOOST_PP_SEQ_REVERSE_S(214, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_214(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, BOOST_PP_SEQ_REVERSE_S(215, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_215(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, BOOST_PP_SEQ_REVERSE_S(216, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_216(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, BOOST_PP_SEQ_REVERSE_S(217, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_217(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, BOOST_PP_SEQ_REVERSE_S(218, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_218(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, BOOST_PP_SEQ_REVERSE_S(219, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_219(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, BOOST_PP_SEQ_REVERSE_S(220, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_220(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, BOOST_PP_SEQ_REVERSE_S(221, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_221(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, BOOST_PP_SEQ_REVERSE_S(222, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_222(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, BOOST_PP_SEQ_REVERSE_S(223, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_223(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, BOOST_PP_SEQ_REVERSE_S(224, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_224(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, BOOST_PP_SEQ_REVERSE_S(225, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_225(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, BOOST_PP_SEQ_REVERSE_S(226, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_226(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, BOOST_PP_SEQ_REVERSE_S(227, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_227(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, BOOST_PP_SEQ_REVERSE_S(228, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_228(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, BOOST_PP_SEQ_REVERSE_S(229, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_229(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, BOOST_PP_SEQ_REVERSE_S(230, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_230(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, BOOST_PP_SEQ_REVERSE_S(231, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_231(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, BOOST_PP_SEQ_REVERSE_S(232, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_232(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, BOOST_PP_SEQ_REVERSE_S(233, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_233(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, BOOST_PP_SEQ_REVERSE_S(234, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_234(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, BOOST_PP_SEQ_REVERSE_S(235, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_235(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, BOOST_PP_SEQ_REVERSE_S(236, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_236(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, BOOST_PP_SEQ_REVERSE_S(237, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_237(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, BOOST_PP_SEQ_REVERSE_S(238, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_238(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, BOOST_PP_SEQ_REVERSE_S(239, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_239(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, BOOST_PP_SEQ_REVERSE_S(240, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_240(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, BOOST_PP_SEQ_REVERSE_S(241, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_241(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, BOOST_PP_SEQ_REVERSE_S(242, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_242(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, BOOST_PP_SEQ_REVERSE_S(243, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_243(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, BOOST_PP_SEQ_REVERSE_S(244, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_244(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, BOOST_PP_SEQ_REVERSE_S(245, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_245(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, BOOST_PP_SEQ_REVERSE_S(246, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_246(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, BOOST_PP_SEQ_REVERSE_S(247, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_247(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, BOOST_PP_SEQ_REVERSE_S(248, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_248(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, BOOST_PP_SEQ_REVERSE_S(249, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_249(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, BOOST_PP_SEQ_REVERSE_S(250, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_250(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, BOOST_PP_SEQ_REVERSE_S(251, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_251(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, BOOST_PP_SEQ_REVERSE_S(252, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_252(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, BOOST_PP_SEQ_REVERSE_S(253, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_253(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, BOOST_PP_SEQ_REVERSE_S(254, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_254(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, BOOST_PP_SEQ_REVERSE_S(255, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_255(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, BOOST_PP_SEQ_REVERSE_S(256, ss), BOOST_PP_SEQ_SIZE(ss))
+# define BOOST_PP_SEQ_FOLD_RIGHT_256(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, BOOST_PP_SEQ_REVERSE_S(257, ss), BOOST_PP_SEQ_SIZE(ss))
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/for_each.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/for_each.hpp
new file mode 100644
index 0000000..e997a9a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/for_each.hpp
@@ -0,0 +1,60 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP
+# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_FOR_EACH */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_FOR((macro, data, seq (nil)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq)
+#    define BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq) BOOST_PP_FOR((macro, data, seq (nil)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_P(r, x) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3, 2, x)))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I x
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I(BOOST_PP_TUPLE_ELEM(3, 0, x), BOOST_PP_TUPLE_ELEM(3, 1, x), BOOST_PP_TUPLE_ELEM(3, 2, x))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_O_I(macro, data, seq) (macro, data, BOOST_PP_SEQ_TAIL(seq))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_IM(r, BOOST_PP_TUPLE_REM_3 x)
+#    define BOOST_PP_SEQ_FOR_EACH_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_M_I(r, im)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_I(r, BOOST_PP_TUPLE_ELEM(3, 0, x), BOOST_PP_TUPLE_ELEM(3, 1, x), BOOST_PP_TUPLE_ELEM(3, 2, x))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_M_I(r, macro, data, seq) macro(r, data, BOOST_PP_SEQ_HEAD(seq))
+#
+# /* BOOST_PP_SEQ_FOR_EACH_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq (nil)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq)
+#    define BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq (nil)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/for_each_i.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/for_each_i.hpp
new file mode 100644
index 0000000..c8edf5a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/for_each_i.hpp
@@ -0,0 +1,61 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP
+# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_FOR_EACH_I */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_FOR((macro, data, seq (nil), 0), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq)
+#    define BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq) BOOST_PP_FOR((macro, data, seq (nil), 0), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_I_P(r, x) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 2, x)))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I x
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I(BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_I_O_I(macro, data, seq, i) (macro, data, BOOST_PP_SEQ_TAIL(seq), BOOST_PP_INC(i))
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, BOOST_PP_TUPLE_REM_4 x)
+#    define BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, im)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_I_M_I(r, macro, data, seq, i) macro(r, data, i, BOOST_PP_SEQ_HEAD(seq))
+#
+# /* BOOST_PP_SEQ_FOR_EACH_I_R */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq (nil), 0), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq)
+#    define BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq (nil), 0), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/for_each_product.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/for_each_product.hpp
new file mode 100644
index 0000000..baf22df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/for_each_product.hpp
@@ -0,0 +1,126 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP
+# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/repetition/for.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT */
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT(macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, sets)
+#
+# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT_R */
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_R(r, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, sets)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets)
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I data
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I(cset, rset, res, macro) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(cset))
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 0, data)))
+# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I data
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I(cset, rset, res, macro) (BOOST_PP_SEQ_TAIL(cset), rset, res, macro)
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) (BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(4, 0, data)), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, i) BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 1, data))), BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_ ## i, BOOST_PP_SEQ_FOR_EACH_PRODUCT_I)
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, BOOST_PP_TUPLE_REM_4 data)
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, im) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, im)
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, cset, rset, res, macro) macro(r, BOOST_PP_SEQ_TAIL(res (BOOST_PP_SEQ_HEAD(cset))))
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I data
+# else
+#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))
+# endif
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(cset, rset, res, macro) (BOOST_PP_SEQ_HEAD(rset)(nil), BOOST_PP_SEQ_TAIL(rset), res (BOOST_PP_SEQ_HEAD(cset)), macro)
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 0)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 1)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 2)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 3)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 4)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 5)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 6)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 7)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 8)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 9)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 10)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 11)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 12)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 13)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 14)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 15)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 16)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 17)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 18)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 19)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 20)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 21)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 22)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 23)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 24)(r, data)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 25)(r, data)
+#
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_0(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_1(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_2(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_3(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_4(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_5(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_6(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_7(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_8(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_9(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_10(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_11(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_12(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_13(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_14(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_15(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_16(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_17(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_18(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_19(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_20(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_21(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_22(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_23(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_24(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25)
+# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_25(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_26)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/insert.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/insert.hpp
new file mode 100644
index 0000000..59ce2f4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/insert.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_INSERT_HPP
+# define BOOST_PREPROCESSOR_SEQ_INSERT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/rest_n.hpp>
+#
+# /* BOOST_PP_SEQ_INSERT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_INSERT(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(i, seq)
+# else
+#    define BOOST_PP_SEQ_INSERT(seq, i, elem) BOOST_PP_SEQ_INSERT_I(seq, i, elem)
+#    define BOOST_PP_SEQ_INSERT_I(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(i, seq)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/pop_back.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/pop_back.hpp
new file mode 100644
index 0000000..54200d6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/pop_back.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_POP_BACK_HPP
+# define BOOST_PREPROCESSOR_SEQ_POP_BACK_HPP
+#
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+#
+# /* BOOST_PP_SEQ_POP_BACK */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_POP_BACK(seq) BOOST_PP_SEQ_FIRST_N(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)
+# else
+#    define BOOST_PP_SEQ_POP_BACK(seq) BOOST_PP_SEQ_POP_BACK_I(seq)
+#    define BOOST_PP_SEQ_POP_BACK_I(seq) BOOST_PP_SEQ_FIRST_N(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/pop_front.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/pop_front.hpp
new file mode 100644
index 0000000..7d94eea
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/pop_front.hpp
@@ -0,0 +1,27 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_POP_FRONT_HPP
+# define BOOST_PREPROCESSOR_SEQ_POP_FRONT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+#
+# /* BOOST_PP_SEQ_POP_FRONT */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_POP_FRONT(seq) BOOST_PP_SEQ_TAIL(seq)
+# else
+#    define BOOST_PP_SEQ_POP_FRONT(seq) BOOST_PP_SEQ_POP_FRONT_I(seq)
+#    define BOOST_PP_SEQ_POP_FRONT_I(seq) BOOST_PP_SEQ_TAIL(seq)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/push_back.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/push_back.hpp
new file mode 100644
index 0000000..1938d0b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/push_back.hpp
@@ -0,0 +1,19 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP
+# define BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP
+#
+# /* BOOST_PP_SEQ_PUSH_BACK */
+#
+# define BOOST_PP_SEQ_PUSH_BACK(seq, elem) seq(elem)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/push_front.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/push_front.hpp
new file mode 100644
index 0000000..2ce73ad
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/push_front.hpp
@@ -0,0 +1,19 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_PUSH_FRONT_HPP
+# define BOOST_PREPROCESSOR_SEQ_PUSH_FRONT_HPP
+#
+# /* BOOST_PP_SEQ_PUSH_FRONT */
+#
+# define BOOST_PP_SEQ_PUSH_FRONT(seq, elem) (elem)seq
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/remove.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/remove.hpp
new file mode 100644
index 0000000..d2f77b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/remove.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_REMOVE_HPP
+# define BOOST_PREPROCESSOR_SEQ_REMOVE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/rest_n.hpp>
+#
+# /* BOOST_PP_SEQ_REMOVE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_REMOVE(seq, i) BOOST_PP_SEQ_FIRST_N(i, seq) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)
+# else
+#    define BOOST_PP_SEQ_REMOVE(seq, i) BOOST_PP_SEQ_REMOVE_I(seq, i)
+#    define BOOST_PP_SEQ_REMOVE_I(seq, i) BOOST_PP_SEQ_FIRST_N(i, seq) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/replace.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/replace.hpp
new file mode 100644
index 0000000..d6107a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/replace.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_REPLACE_HPP
+# define BOOST_PREPROCESSOR_SEQ_REPLACE_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/rest_n.hpp>
+#
+# /* BOOST_PP_SEQ_REPLACE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_REPLACE(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)
+# else
+#    define BOOST_PP_SEQ_REPLACE(seq, i, elem) BOOST_PP_SEQ_REPLACE_I(seq, i, elem)
+#    define BOOST_PP_SEQ_REPLACE_I(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/rest_n.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/rest_n.hpp
new file mode 100644
index 0000000..7e589cc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/rest_n.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_REST_N_HPP
+# define BOOST_PREPROCESSOR_SEQ_REST_N_HPP
+#
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/seq/detail/split.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+#
+# /* BOOST_PP_SEQ_REST_N */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), (nil) seq BOOST_PP_EMPTY))()
+# else
+#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_I(n, seq)
+#    define BOOST_PP_SEQ_REST_N_I(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), (nil) seq BOOST_PP_EMPTY))()
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/reverse.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/reverse.hpp
new file mode 100644
index 0000000..338d777
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/reverse.hpp
@@ -0,0 +1,39 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_REVERSE_HPP
+# define BOOST_PREPROCESSOR_SEQ_REVERSE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+#
+# /* BOOST_PP_SEQ_REVERSE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()
+# else
+#    define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_REVERSE_I(seq)
+#    define BOOST_PP_SEQ_REVERSE_I(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()
+# endif
+#
+# define BOOST_PP_SEQ_REVERSE_O(s, state, elem) (elem) state
+#
+# /* BOOST_PP_SEQ_REVERSE_S */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()
+# else
+#    define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_REVERSE_S_I(s, seq)
+#    define BOOST_PP_SEQ_REVERSE_S_I(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/seq.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/seq.hpp
new file mode 100644
index 0000000..f5ca84c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/seq.hpp
@@ -0,0 +1,44 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_SEQ_HPP
+# define BOOST_PREPROCESSOR_SEQ_SEQ_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/elem.hpp>
+#
+# /* BOOST_PP_SEQ_HEAD */
+#
+# define BOOST_PP_SEQ_HEAD(seq) BOOST_PP_SEQ_ELEM(0, seq)
+#
+# /* BOOST_PP_SEQ_TAIL */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_1((seq))
+#    define BOOST_PP_SEQ_TAIL_1(par) BOOST_PP_SEQ_TAIL_2 ## par
+#    define BOOST_PP_SEQ_TAIL_2(seq) BOOST_PP_SEQ_TAIL_I ## seq
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_ID(BOOST_PP_SEQ_TAIL_I seq)
+#    define BOOST_PP_SEQ_TAIL_ID(id) id
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_D(seq)
+#    define BOOST_PP_SEQ_TAIL_D(seq) BOOST_PP_SEQ_TAIL_I seq
+# else
+#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_I seq
+# endif
+#
+# define BOOST_PP_SEQ_TAIL_I(x)
+#
+# /* BOOST_PP_SEQ_NIL */
+#
+# define BOOST_PP_SEQ_NIL(x) (x)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/size.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/size.hpp
new file mode 100644
index 0000000..385c00a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/size.hpp
@@ -0,0 +1,547 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_SIZE_HPP
+# define BOOST_PREPROCESSOR_SEQ_SIZE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I((seq))
+#    define BOOST_PP_SEQ_SIZE_I(par) BOOST_PP_SEQ_SIZE_II ## par
+#    define BOOST_PP_SEQ_SIZE_II(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 ## seq)
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() || BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I(seq)
+#    define BOOST_PP_SEQ_SIZE_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)
+# elif defined(__IBMC__) || defined(__IBMCPP__)
+#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_0, seq))
+# else
+#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)
+# endif
+#
+# define BOOST_PP_SEQ_SIZE_0(_) BOOST_PP_SEQ_SIZE_1
+# define BOOST_PP_SEQ_SIZE_1(_) BOOST_PP_SEQ_SIZE_2
+# define BOOST_PP_SEQ_SIZE_2(_) BOOST_PP_SEQ_SIZE_3
+# define BOOST_PP_SEQ_SIZE_3(_) BOOST_PP_SEQ_SIZE_4
+# define BOOST_PP_SEQ_SIZE_4(_) BOOST_PP_SEQ_SIZE_5
+# define BOOST_PP_SEQ_SIZE_5(_) BOOST_PP_SEQ_SIZE_6
+# define BOOST_PP_SEQ_SIZE_6(_) BOOST_PP_SEQ_SIZE_7
+# define BOOST_PP_SEQ_SIZE_7(_) BOOST_PP_SEQ_SIZE_8
+# define BOOST_PP_SEQ_SIZE_8(_) BOOST_PP_SEQ_SIZE_9
+# define BOOST_PP_SEQ_SIZE_9(_) BOOST_PP_SEQ_SIZE_10
+# define BOOST_PP_SEQ_SIZE_10(_) BOOST_PP_SEQ_SIZE_11
+# define BOOST_PP_SEQ_SIZE_11(_) BOOST_PP_SEQ_SIZE_12
+# define BOOST_PP_SEQ_SIZE_12(_) BOOST_PP_SEQ_SIZE_13
+# define BOOST_PP_SEQ_SIZE_13(_) BOOST_PP_SEQ_SIZE_14
+# define BOOST_PP_SEQ_SIZE_14(_) BOOST_PP_SEQ_SIZE_15
+# define BOOST_PP_SEQ_SIZE_15(_) BOOST_PP_SEQ_SIZE_16
+# define BOOST_PP_SEQ_SIZE_16(_) BOOST_PP_SEQ_SIZE_17
+# define BOOST_PP_SEQ_SIZE_17(_) BOOST_PP_SEQ_SIZE_18
+# define BOOST_PP_SEQ_SIZE_18(_) BOOST_PP_SEQ_SIZE_19
+# define BOOST_PP_SEQ_SIZE_19(_) BOOST_PP_SEQ_SIZE_20
+# define BOOST_PP_SEQ_SIZE_20(_) BOOST_PP_SEQ_SIZE_21
+# define BOOST_PP_SEQ_SIZE_21(_) BOOST_PP_SEQ_SIZE_22
+# define BOOST_PP_SEQ_SIZE_22(_) BOOST_PP_SEQ_SIZE_23
+# define BOOST_PP_SEQ_SIZE_23(_) BOOST_PP_SEQ_SIZE_24
+# define BOOST_PP_SEQ_SIZE_24(_) BOOST_PP_SEQ_SIZE_25
+# define BOOST_PP_SEQ_SIZE_25(_) BOOST_PP_SEQ_SIZE_26
+# define BOOST_PP_SEQ_SIZE_26(_) BOOST_PP_SEQ_SIZE_27
+# define BOOST_PP_SEQ_SIZE_27(_) BOOST_PP_SEQ_SIZE_28
+# define BOOST_PP_SEQ_SIZE_28(_) BOOST_PP_SEQ_SIZE_29
+# define BOOST_PP_SEQ_SIZE_29(_) BOOST_PP_SEQ_SIZE_30
+# define BOOST_PP_SEQ_SIZE_30(_) BOOST_PP_SEQ_SIZE_31
+# define BOOST_PP_SEQ_SIZE_31(_) BOOST_PP_SEQ_SIZE_32
+# define BOOST_PP_SEQ_SIZE_32(_) BOOST_PP_SEQ_SIZE_33
+# define BOOST_PP_SEQ_SIZE_33(_) BOOST_PP_SEQ_SIZE_34
+# define BOOST_PP_SEQ_SIZE_34(_) BOOST_PP_SEQ_SIZE_35
+# define BOOST_PP_SEQ_SIZE_35(_) BOOST_PP_SEQ_SIZE_36
+# define BOOST_PP_SEQ_SIZE_36(_) BOOST_PP_SEQ_SIZE_37
+# define BOOST_PP_SEQ_SIZE_37(_) BOOST_PP_SEQ_SIZE_38
+# define BOOST_PP_SEQ_SIZE_38(_) BOOST_PP_SEQ_SIZE_39
+# define BOOST_PP_SEQ_SIZE_39(_) BOOST_PP_SEQ_SIZE_40
+# define BOOST_PP_SEQ_SIZE_40(_) BOOST_PP_SEQ_SIZE_41
+# define BOOST_PP_SEQ_SIZE_41(_) BOOST_PP_SEQ_SIZE_42
+# define BOOST_PP_SEQ_SIZE_42(_) BOOST_PP_SEQ_SIZE_43
+# define BOOST_PP_SEQ_SIZE_43(_) BOOST_PP_SEQ_SIZE_44
+# define BOOST_PP_SEQ_SIZE_44(_) BOOST_PP_SEQ_SIZE_45
+# define BOOST_PP_SEQ_SIZE_45(_) BOOST_PP_SEQ_SIZE_46
+# define BOOST_PP_SEQ_SIZE_46(_) BOOST_PP_SEQ_SIZE_47
+# define BOOST_PP_SEQ_SIZE_47(_) BOOST_PP_SEQ_SIZE_48
+# define BOOST_PP_SEQ_SIZE_48(_) BOOST_PP_SEQ_SIZE_49
+# define BOOST_PP_SEQ_SIZE_49(_) BOOST_PP_SEQ_SIZE_50
+# define BOOST_PP_SEQ_SIZE_50(_) BOOST_PP_SEQ_SIZE_51
+# define BOOST_PP_SEQ_SIZE_51(_) BOOST_PP_SEQ_SIZE_52
+# define BOOST_PP_SEQ_SIZE_52(_) BOOST_PP_SEQ_SIZE_53
+# define BOOST_PP_SEQ_SIZE_53(_) BOOST_PP_SEQ_SIZE_54
+# define BOOST_PP_SEQ_SIZE_54(_) BOOST_PP_SEQ_SIZE_55
+# define BOOST_PP_SEQ_SIZE_55(_) BOOST_PP_SEQ_SIZE_56
+# define BOOST_PP_SEQ_SIZE_56(_) BOOST_PP_SEQ_SIZE_57
+# define BOOST_PP_SEQ_SIZE_57(_) BOOST_PP_SEQ_SIZE_58
+# define BOOST_PP_SEQ_SIZE_58(_) BOOST_PP_SEQ_SIZE_59
+# define BOOST_PP_SEQ_SIZE_59(_) BOOST_PP_SEQ_SIZE_60
+# define BOOST_PP_SEQ_SIZE_60(_) BOOST_PP_SEQ_SIZE_61
+# define BOOST_PP_SEQ_SIZE_61(_) BOOST_PP_SEQ_SIZE_62
+# define BOOST_PP_SEQ_SIZE_62(_) BOOST_PP_SEQ_SIZE_63
+# define BOOST_PP_SEQ_SIZE_63(_) BOOST_PP_SEQ_SIZE_64
+# define BOOST_PP_SEQ_SIZE_64(_) BOOST_PP_SEQ_SIZE_65
+# define BOOST_PP_SEQ_SIZE_65(_) BOOST_PP_SEQ_SIZE_66
+# define BOOST_PP_SEQ_SIZE_66(_) BOOST_PP_SEQ_SIZE_67
+# define BOOST_PP_SEQ_SIZE_67(_) BOOST_PP_SEQ_SIZE_68
+# define BOOST_PP_SEQ_SIZE_68(_) BOOST_PP_SEQ_SIZE_69
+# define BOOST_PP_SEQ_SIZE_69(_) BOOST_PP_SEQ_SIZE_70
+# define BOOST_PP_SEQ_SIZE_70(_) BOOST_PP_SEQ_SIZE_71
+# define BOOST_PP_SEQ_SIZE_71(_) BOOST_PP_SEQ_SIZE_72
+# define BOOST_PP_SEQ_SIZE_72(_) BOOST_PP_SEQ_SIZE_73
+# define BOOST_PP_SEQ_SIZE_73(_) BOOST_PP_SEQ_SIZE_74
+# define BOOST_PP_SEQ_SIZE_74(_) BOOST_PP_SEQ_SIZE_75
+# define BOOST_PP_SEQ_SIZE_75(_) BOOST_PP_SEQ_SIZE_76
+# define BOOST_PP_SEQ_SIZE_76(_) BOOST_PP_SEQ_SIZE_77
+# define BOOST_PP_SEQ_SIZE_77(_) BOOST_PP_SEQ_SIZE_78
+# define BOOST_PP_SEQ_SIZE_78(_) BOOST_PP_SEQ_SIZE_79
+# define BOOST_PP_SEQ_SIZE_79(_) BOOST_PP_SEQ_SIZE_80
+# define BOOST_PP_SEQ_SIZE_80(_) BOOST_PP_SEQ_SIZE_81
+# define BOOST_PP_SEQ_SIZE_81(_) BOOST_PP_SEQ_SIZE_82
+# define BOOST_PP_SEQ_SIZE_82(_) BOOST_PP_SEQ_SIZE_83
+# define BOOST_PP_SEQ_SIZE_83(_) BOOST_PP_SEQ_SIZE_84
+# define BOOST_PP_SEQ_SIZE_84(_) BOOST_PP_SEQ_SIZE_85
+# define BOOST_PP_SEQ_SIZE_85(_) BOOST_PP_SEQ_SIZE_86
+# define BOOST_PP_SEQ_SIZE_86(_) BOOST_PP_SEQ_SIZE_87
+# define BOOST_PP_SEQ_SIZE_87(_) BOOST_PP_SEQ_SIZE_88
+# define BOOST_PP_SEQ_SIZE_88(_) BOOST_PP_SEQ_SIZE_89
+# define BOOST_PP_SEQ_SIZE_89(_) BOOST_PP_SEQ_SIZE_90
+# define BOOST_PP_SEQ_SIZE_90(_) BOOST_PP_SEQ_SIZE_91
+# define BOOST_PP_SEQ_SIZE_91(_) BOOST_PP_SEQ_SIZE_92
+# define BOOST_PP_SEQ_SIZE_92(_) BOOST_PP_SEQ_SIZE_93
+# define BOOST_PP_SEQ_SIZE_93(_) BOOST_PP_SEQ_SIZE_94
+# define BOOST_PP_SEQ_SIZE_94(_) BOOST_PP_SEQ_SIZE_95
+# define BOOST_PP_SEQ_SIZE_95(_) BOOST_PP_SEQ_SIZE_96
+# define BOOST_PP_SEQ_SIZE_96(_) BOOST_PP_SEQ_SIZE_97
+# define BOOST_PP_SEQ_SIZE_97(_) BOOST_PP_SEQ_SIZE_98
+# define BOOST_PP_SEQ_SIZE_98(_) BOOST_PP_SEQ_SIZE_99
+# define BOOST_PP_SEQ_SIZE_99(_) BOOST_PP_SEQ_SIZE_100
+# define BOOST_PP_SEQ_SIZE_100(_) BOOST_PP_SEQ_SIZE_101
+# define BOOST_PP_SEQ_SIZE_101(_) BOOST_PP_SEQ_SIZE_102
+# define BOOST_PP_SEQ_SIZE_102(_) BOOST_PP_SEQ_SIZE_103
+# define BOOST_PP_SEQ_SIZE_103(_) BOOST_PP_SEQ_SIZE_104
+# define BOOST_PP_SEQ_SIZE_104(_) BOOST_PP_SEQ_SIZE_105
+# define BOOST_PP_SEQ_SIZE_105(_) BOOST_PP_SEQ_SIZE_106
+# define BOOST_PP_SEQ_SIZE_106(_) BOOST_PP_SEQ_SIZE_107
+# define BOOST_PP_SEQ_SIZE_107(_) BOOST_PP_SEQ_SIZE_108
+# define BOOST_PP_SEQ_SIZE_108(_) BOOST_PP_SEQ_SIZE_109
+# define BOOST_PP_SEQ_SIZE_109(_) BOOST_PP_SEQ_SIZE_110
+# define BOOST_PP_SEQ_SIZE_110(_) BOOST_PP_SEQ_SIZE_111
+# define BOOST_PP_SEQ_SIZE_111(_) BOOST_PP_SEQ_SIZE_112
+# define BOOST_PP_SEQ_SIZE_112(_) BOOST_PP_SEQ_SIZE_113
+# define BOOST_PP_SEQ_SIZE_113(_) BOOST_PP_SEQ_SIZE_114
+# define BOOST_PP_SEQ_SIZE_114(_) BOOST_PP_SEQ_SIZE_115
+# define BOOST_PP_SEQ_SIZE_115(_) BOOST_PP_SEQ_SIZE_116
+# define BOOST_PP_SEQ_SIZE_116(_) BOOST_PP_SEQ_SIZE_117
+# define BOOST_PP_SEQ_SIZE_117(_) BOOST_PP_SEQ_SIZE_118
+# define BOOST_PP_SEQ_SIZE_118(_) BOOST_PP_SEQ_SIZE_119
+# define BOOST_PP_SEQ_SIZE_119(_) BOOST_PP_SEQ_SIZE_120
+# define BOOST_PP_SEQ_SIZE_120(_) BOOST_PP_SEQ_SIZE_121
+# define BOOST_PP_SEQ_SIZE_121(_) BOOST_PP_SEQ_SIZE_122
+# define BOOST_PP_SEQ_SIZE_122(_) BOOST_PP_SEQ_SIZE_123
+# define BOOST_PP_SEQ_SIZE_123(_) BOOST_PP_SEQ_SIZE_124
+# define BOOST_PP_SEQ_SIZE_124(_) BOOST_PP_SEQ_SIZE_125
+# define BOOST_PP_SEQ_SIZE_125(_) BOOST_PP_SEQ_SIZE_126
+# define BOOST_PP_SEQ_SIZE_126(_) BOOST_PP_SEQ_SIZE_127
+# define BOOST_PP_SEQ_SIZE_127(_) BOOST_PP_SEQ_SIZE_128
+# define BOOST_PP_SEQ_SIZE_128(_) BOOST_PP_SEQ_SIZE_129
+# define BOOST_PP_SEQ_SIZE_129(_) BOOST_PP_SEQ_SIZE_130
+# define BOOST_PP_SEQ_SIZE_130(_) BOOST_PP_SEQ_SIZE_131
+# define BOOST_PP_SEQ_SIZE_131(_) BOOST_PP_SEQ_SIZE_132
+# define BOOST_PP_SEQ_SIZE_132(_) BOOST_PP_SEQ_SIZE_133
+# define BOOST_PP_SEQ_SIZE_133(_) BOOST_PP_SEQ_SIZE_134
+# define BOOST_PP_SEQ_SIZE_134(_) BOOST_PP_SEQ_SIZE_135
+# define BOOST_PP_SEQ_SIZE_135(_) BOOST_PP_SEQ_SIZE_136
+# define BOOST_PP_SEQ_SIZE_136(_) BOOST_PP_SEQ_SIZE_137
+# define BOOST_PP_SEQ_SIZE_137(_) BOOST_PP_SEQ_SIZE_138
+# define BOOST_PP_SEQ_SIZE_138(_) BOOST_PP_SEQ_SIZE_139
+# define BOOST_PP_SEQ_SIZE_139(_) BOOST_PP_SEQ_SIZE_140
+# define BOOST_PP_SEQ_SIZE_140(_) BOOST_PP_SEQ_SIZE_141
+# define BOOST_PP_SEQ_SIZE_141(_) BOOST_PP_SEQ_SIZE_142
+# define BOOST_PP_SEQ_SIZE_142(_) BOOST_PP_SEQ_SIZE_143
+# define BOOST_PP_SEQ_SIZE_143(_) BOOST_PP_SEQ_SIZE_144
+# define BOOST_PP_SEQ_SIZE_144(_) BOOST_PP_SEQ_SIZE_145
+# define BOOST_PP_SEQ_SIZE_145(_) BOOST_PP_SEQ_SIZE_146
+# define BOOST_PP_SEQ_SIZE_146(_) BOOST_PP_SEQ_SIZE_147
+# define BOOST_PP_SEQ_SIZE_147(_) BOOST_PP_SEQ_SIZE_148
+# define BOOST_PP_SEQ_SIZE_148(_) BOOST_PP_SEQ_SIZE_149
+# define BOOST_PP_SEQ_SIZE_149(_) BOOST_PP_SEQ_SIZE_150
+# define BOOST_PP_SEQ_SIZE_150(_) BOOST_PP_SEQ_SIZE_151
+# define BOOST_PP_SEQ_SIZE_151(_) BOOST_PP_SEQ_SIZE_152
+# define BOOST_PP_SEQ_SIZE_152(_) BOOST_PP_SEQ_SIZE_153
+# define BOOST_PP_SEQ_SIZE_153(_) BOOST_PP_SEQ_SIZE_154
+# define BOOST_PP_SEQ_SIZE_154(_) BOOST_PP_SEQ_SIZE_155
+# define BOOST_PP_SEQ_SIZE_155(_) BOOST_PP_SEQ_SIZE_156
+# define BOOST_PP_SEQ_SIZE_156(_) BOOST_PP_SEQ_SIZE_157
+# define BOOST_PP_SEQ_SIZE_157(_) BOOST_PP_SEQ_SIZE_158
+# define BOOST_PP_SEQ_SIZE_158(_) BOOST_PP_SEQ_SIZE_159
+# define BOOST_PP_SEQ_SIZE_159(_) BOOST_PP_SEQ_SIZE_160
+# define BOOST_PP_SEQ_SIZE_160(_) BOOST_PP_SEQ_SIZE_161
+# define BOOST_PP_SEQ_SIZE_161(_) BOOST_PP_SEQ_SIZE_162
+# define BOOST_PP_SEQ_SIZE_162(_) BOOST_PP_SEQ_SIZE_163
+# define BOOST_PP_SEQ_SIZE_163(_) BOOST_PP_SEQ_SIZE_164
+# define BOOST_PP_SEQ_SIZE_164(_) BOOST_PP_SEQ_SIZE_165
+# define BOOST_PP_SEQ_SIZE_165(_) BOOST_PP_SEQ_SIZE_166
+# define BOOST_PP_SEQ_SIZE_166(_) BOOST_PP_SEQ_SIZE_167
+# define BOOST_PP_SEQ_SIZE_167(_) BOOST_PP_SEQ_SIZE_168
+# define BOOST_PP_SEQ_SIZE_168(_) BOOST_PP_SEQ_SIZE_169
+# define BOOST_PP_SEQ_SIZE_169(_) BOOST_PP_SEQ_SIZE_170
+# define BOOST_PP_SEQ_SIZE_170(_) BOOST_PP_SEQ_SIZE_171
+# define BOOST_PP_SEQ_SIZE_171(_) BOOST_PP_SEQ_SIZE_172
+# define BOOST_PP_SEQ_SIZE_172(_) BOOST_PP_SEQ_SIZE_173
+# define BOOST_PP_SEQ_SIZE_173(_) BOOST_PP_SEQ_SIZE_174
+# define BOOST_PP_SEQ_SIZE_174(_) BOOST_PP_SEQ_SIZE_175
+# define BOOST_PP_SEQ_SIZE_175(_) BOOST_PP_SEQ_SIZE_176
+# define BOOST_PP_SEQ_SIZE_176(_) BOOST_PP_SEQ_SIZE_177
+# define BOOST_PP_SEQ_SIZE_177(_) BOOST_PP_SEQ_SIZE_178
+# define BOOST_PP_SEQ_SIZE_178(_) BOOST_PP_SEQ_SIZE_179
+# define BOOST_PP_SEQ_SIZE_179(_) BOOST_PP_SEQ_SIZE_180
+# define BOOST_PP_SEQ_SIZE_180(_) BOOST_PP_SEQ_SIZE_181
+# define BOOST_PP_SEQ_SIZE_181(_) BOOST_PP_SEQ_SIZE_182
+# define BOOST_PP_SEQ_SIZE_182(_) BOOST_PP_SEQ_SIZE_183
+# define BOOST_PP_SEQ_SIZE_183(_) BOOST_PP_SEQ_SIZE_184
+# define BOOST_PP_SEQ_SIZE_184(_) BOOST_PP_SEQ_SIZE_185
+# define BOOST_PP_SEQ_SIZE_185(_) BOOST_PP_SEQ_SIZE_186
+# define BOOST_PP_SEQ_SIZE_186(_) BOOST_PP_SEQ_SIZE_187
+# define BOOST_PP_SEQ_SIZE_187(_) BOOST_PP_SEQ_SIZE_188
+# define BOOST_PP_SEQ_SIZE_188(_) BOOST_PP_SEQ_SIZE_189
+# define BOOST_PP_SEQ_SIZE_189(_) BOOST_PP_SEQ_SIZE_190
+# define BOOST_PP_SEQ_SIZE_190(_) BOOST_PP_SEQ_SIZE_191
+# define BOOST_PP_SEQ_SIZE_191(_) BOOST_PP_SEQ_SIZE_192
+# define BOOST_PP_SEQ_SIZE_192(_) BOOST_PP_SEQ_SIZE_193
+# define BOOST_PP_SEQ_SIZE_193(_) BOOST_PP_SEQ_SIZE_194
+# define BOOST_PP_SEQ_SIZE_194(_) BOOST_PP_SEQ_SIZE_195
+# define BOOST_PP_SEQ_SIZE_195(_) BOOST_PP_SEQ_SIZE_196
+# define BOOST_PP_SEQ_SIZE_196(_) BOOST_PP_SEQ_SIZE_197
+# define BOOST_PP_SEQ_SIZE_197(_) BOOST_PP_SEQ_SIZE_198
+# define BOOST_PP_SEQ_SIZE_198(_) BOOST_PP_SEQ_SIZE_199
+# define BOOST_PP_SEQ_SIZE_199(_) BOOST_PP_SEQ_SIZE_200
+# define BOOST_PP_SEQ_SIZE_200(_) BOOST_PP_SEQ_SIZE_201
+# define BOOST_PP_SEQ_SIZE_201(_) BOOST_PP_SEQ_SIZE_202
+# define BOOST_PP_SEQ_SIZE_202(_) BOOST_PP_SEQ_SIZE_203
+# define BOOST_PP_SEQ_SIZE_203(_) BOOST_PP_SEQ_SIZE_204
+# define BOOST_PP_SEQ_SIZE_204(_) BOOST_PP_SEQ_SIZE_205
+# define BOOST_PP_SEQ_SIZE_205(_) BOOST_PP_SEQ_SIZE_206
+# define BOOST_PP_SEQ_SIZE_206(_) BOOST_PP_SEQ_SIZE_207
+# define BOOST_PP_SEQ_SIZE_207(_) BOOST_PP_SEQ_SIZE_208
+# define BOOST_PP_SEQ_SIZE_208(_) BOOST_PP_SEQ_SIZE_209
+# define BOOST_PP_SEQ_SIZE_209(_) BOOST_PP_SEQ_SIZE_210
+# define BOOST_PP_SEQ_SIZE_210(_) BOOST_PP_SEQ_SIZE_211
+# define BOOST_PP_SEQ_SIZE_211(_) BOOST_PP_SEQ_SIZE_212
+# define BOOST_PP_SEQ_SIZE_212(_) BOOST_PP_SEQ_SIZE_213
+# define BOOST_PP_SEQ_SIZE_213(_) BOOST_PP_SEQ_SIZE_214
+# define BOOST_PP_SEQ_SIZE_214(_) BOOST_PP_SEQ_SIZE_215
+# define BOOST_PP_SEQ_SIZE_215(_) BOOST_PP_SEQ_SIZE_216
+# define BOOST_PP_SEQ_SIZE_216(_) BOOST_PP_SEQ_SIZE_217
+# define BOOST_PP_SEQ_SIZE_217(_) BOOST_PP_SEQ_SIZE_218
+# define BOOST_PP_SEQ_SIZE_218(_) BOOST_PP_SEQ_SIZE_219
+# define BOOST_PP_SEQ_SIZE_219(_) BOOST_PP_SEQ_SIZE_220
+# define BOOST_PP_SEQ_SIZE_220(_) BOOST_PP_SEQ_SIZE_221
+# define BOOST_PP_SEQ_SIZE_221(_) BOOST_PP_SEQ_SIZE_222
+# define BOOST_PP_SEQ_SIZE_222(_) BOOST_PP_SEQ_SIZE_223
+# define BOOST_PP_SEQ_SIZE_223(_) BOOST_PP_SEQ_SIZE_224
+# define BOOST_PP_SEQ_SIZE_224(_) BOOST_PP_SEQ_SIZE_225
+# define BOOST_PP_SEQ_SIZE_225(_) BOOST_PP_SEQ_SIZE_226
+# define BOOST_PP_SEQ_SIZE_226(_) BOOST_PP_SEQ_SIZE_227
+# define BOOST_PP_SEQ_SIZE_227(_) BOOST_PP_SEQ_SIZE_228
+# define BOOST_PP_SEQ_SIZE_228(_) BOOST_PP_SEQ_SIZE_229
+# define BOOST_PP_SEQ_SIZE_229(_) BOOST_PP_SEQ_SIZE_230
+# define BOOST_PP_SEQ_SIZE_230(_) BOOST_PP_SEQ_SIZE_231
+# define BOOST_PP_SEQ_SIZE_231(_) BOOST_PP_SEQ_SIZE_232
+# define BOOST_PP_SEQ_SIZE_232(_) BOOST_PP_SEQ_SIZE_233
+# define BOOST_PP_SEQ_SIZE_233(_) BOOST_PP_SEQ_SIZE_234
+# define BOOST_PP_SEQ_SIZE_234(_) BOOST_PP_SEQ_SIZE_235
+# define BOOST_PP_SEQ_SIZE_235(_) BOOST_PP_SEQ_SIZE_236
+# define BOOST_PP_SEQ_SIZE_236(_) BOOST_PP_SEQ_SIZE_237
+# define BOOST_PP_SEQ_SIZE_237(_) BOOST_PP_SEQ_SIZE_238
+# define BOOST_PP_SEQ_SIZE_238(_) BOOST_PP_SEQ_SIZE_239
+# define BOOST_PP_SEQ_SIZE_239(_) BOOST_PP_SEQ_SIZE_240
+# define BOOST_PP_SEQ_SIZE_240(_) BOOST_PP_SEQ_SIZE_241
+# define BOOST_PP_SEQ_SIZE_241(_) BOOST_PP_SEQ_SIZE_242
+# define BOOST_PP_SEQ_SIZE_242(_) BOOST_PP_SEQ_SIZE_243
+# define BOOST_PP_SEQ_SIZE_243(_) BOOST_PP_SEQ_SIZE_244
+# define BOOST_PP_SEQ_SIZE_244(_) BOOST_PP_SEQ_SIZE_245
+# define BOOST_PP_SEQ_SIZE_245(_) BOOST_PP_SEQ_SIZE_246
+# define BOOST_PP_SEQ_SIZE_246(_) BOOST_PP_SEQ_SIZE_247
+# define BOOST_PP_SEQ_SIZE_247(_) BOOST_PP_SEQ_SIZE_248
+# define BOOST_PP_SEQ_SIZE_248(_) BOOST_PP_SEQ_SIZE_249
+# define BOOST_PP_SEQ_SIZE_249(_) BOOST_PP_SEQ_SIZE_250
+# define BOOST_PP_SEQ_SIZE_250(_) BOOST_PP_SEQ_SIZE_251
+# define BOOST_PP_SEQ_SIZE_251(_) BOOST_PP_SEQ_SIZE_252
+# define BOOST_PP_SEQ_SIZE_252(_) BOOST_PP_SEQ_SIZE_253
+# define BOOST_PP_SEQ_SIZE_253(_) BOOST_PP_SEQ_SIZE_254
+# define BOOST_PP_SEQ_SIZE_254(_) BOOST_PP_SEQ_SIZE_255
+# define BOOST_PP_SEQ_SIZE_255(_) BOOST_PP_SEQ_SIZE_256
+# define BOOST_PP_SEQ_SIZE_256(_) BOOST_PP_SEQ_SIZE_257
+#
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_0 0
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_1 1
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_2 2
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3 3
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_4 4
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_5 5
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_6 6
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_7 7
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_8 8
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_9 9
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_10 10
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_11 11
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_12 12
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_13 13
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_14 14
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_15 15
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_16 16
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_17 17
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_18 18
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_19 19
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_20 20
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_21 21
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_22 22
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_23 23
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_24 24
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_25 25
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_26 26
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_27 27
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_28 28
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_29 29
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_30 30
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_31 31
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_32 32
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_33 33
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_34 34
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_35 35
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_36 36
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_37 37
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_38 38
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_39 39
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_40 40
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_41 41
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_42 42
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_43 43
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_44 44
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_45 45
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_46 46
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_47 47
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_48 48
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_49 49
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_50 50
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_51 51
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_52 52
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_53 53
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_54 54
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_55 55
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_56 56
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_57 57
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_58 58
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_59 59
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_60 60
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_61 61
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_62 62
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_63 63
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_64 64
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_65 65
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_66 66
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_67 67
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_68 68
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_69 69
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_70 70
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_71 71
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_72 72
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_73 73
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_74 74
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_75 75
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_76 76
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_77 77
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_78 78
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_79 79
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_80 80
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_81 81
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_82 82
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_83 83
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_84 84
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_85 85
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_86 86
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_87 87
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_88 88
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_89 89
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_90 90
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_91 91
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_92 92
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_93 93
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_94 94
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_95 95
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_96 96
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_97 97
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_98 98
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_99 99
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_100 100
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_101 101
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_102 102
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_103 103
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_104 104
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_105 105
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_106 106
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_107 107
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_108 108
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_109 109
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_110 110
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_111 111
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_112 112
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_113 113
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_114 114
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_115 115
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_116 116
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_117 117
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_118 118
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_119 119
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_120 120
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_121 121
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_122 122
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_123 123
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_124 124
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_125 125
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_126 126
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_127 127
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_128 128
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_129 129
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_130 130
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_131 131
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_132 132
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_133 133
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_134 134
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_135 135
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_136 136
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_137 137
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_138 138
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_139 139
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_140 140
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_141 141
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_142 142
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_143 143
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_144 144
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_145 145
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_146 146
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_147 147
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_148 148
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_149 149
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_150 150
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_151 151
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_152 152
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_153 153
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_154 154
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_155 155
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_156 156
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_157 157
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_158 158
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_159 159
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_160 160
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_161 161
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_162 162
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_163 163
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_164 164
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_165 165
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_166 166
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_167 167
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_168 168
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_169 169
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_170 170
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_171 171
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_172 172
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_173 173
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_174 174
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_175 175
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_176 176
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_177 177
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_178 178
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_179 179
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_180 180
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_181 181
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_182 182
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_183 183
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_184 184
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_185 185
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_186 186
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_187 187
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_188 188
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_189 189
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_190 190
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_191 191
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_192 192
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_193 193
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_194 194
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_195 195
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_196 196
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_197 197
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_198 198
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_199 199
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_200 200
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_201 201
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_202 202
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_203 203
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_204 204
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_205 205
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_206 206
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_207 207
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_208 208
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_209 209
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_210 210
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_211 211
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_212 212
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_213 213
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_214 214
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_215 215
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_216 216
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_217 217
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_218 218
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_219 219
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_220 220
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_221 221
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_222 222
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_223 223
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_224 224
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_225 225
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_226 226
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_227 227
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_228 228
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_229 229
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_230 230
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_231 231
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_232 232
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_233 233
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_234 234
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_235 235
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_236 236
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_237 237
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_238 238
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_239 239
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_240 240
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_241 241
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_242 242
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_243 243
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_244 244
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_245 245
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_246 246
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_247 247
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_248 248
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_249 249
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_250 250
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_251 251
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_252 252
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_253 253
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_254 254
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_255 255
+# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_256 256
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/subseq.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/subseq.hpp
new file mode 100644
index 0000000..fb242f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/subseq.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP
+# define BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/rest_n.hpp>
+#
+# /* BOOST_PP_SEQ_SUBSEQ */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))
+# else
+#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_SUBSEQ_I(seq, i, len)
+#    define BOOST_PP_SEQ_SUBSEQ_I(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/to_array.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/to_array.hpp
new file mode 100644
index 0000000..d8a8040
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/to_array.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_TO_ARRAY_HPP
+# define BOOST_PREPROCESSOR_SEQ_TO_ARRAY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/enum.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+#
+# /* BOOST_PP_SEQ_TO_ARRAY */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_TO_ARRAY(seq) (BOOST_PP_SEQ_SIZE(seq), (BOOST_PP_SEQ_ENUM(seq)))
+# else
+#    define BOOST_PP_SEQ_TO_ARRAY(seq) BOOST_PP_SEQ_TO_ARRAY_I(seq)
+#    define BOOST_PP_SEQ_TO_ARRAY_I(seq) (BOOST_PP_SEQ_SIZE(seq), (BOOST_PP_SEQ_ENUM(seq)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/to_list.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/to_list.hpp
new file mode 100644
index 0000000..fa0421b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/to_list.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_TO_LIST_HPP
+# define BOOST_PREPROCESSOR_SEQ_TO_LIST_HPP
+#
+# include <boost/preprocessor/punctuation/comma.hpp>
+# include <boost/preprocessor/punctuation/paren.hpp>
+# include <boost/preprocessor/seq/detail/binary_transform.hpp>
+#
+# /* BOOST_PP_SEQ_TO_LIST */
+#
+# define BOOST_PP_SEQ_TO_LIST(seq) BOOST_PP_SEQ_TO_LIST_I(BOOST_PP_SEQ_BINARY_TRANSFORM(seq))
+# define BOOST_PP_SEQ_TO_LIST_I(bseq) BOOST_PP_SEQ_TO_LIST_A bseq BOOST_PP_NIL BOOST_PP_SEQ_TO_LIST_B bseq
+# define BOOST_PP_SEQ_TO_LIST_A(m, e) m(BOOST_PP_LPAREN() e BOOST_PP_COMMA() BOOST_PP_SEQ_TO_LIST_A_ID)
+# define BOOST_PP_SEQ_TO_LIST_A_ID() BOOST_PP_SEQ_TO_LIST_A
+# define BOOST_PP_SEQ_TO_LIST_B(m, e) m(BOOST_PP_RPAREN() BOOST_PP_SEQ_TO_LIST_B_ID)
+# define BOOST_PP_SEQ_TO_LIST_B_ID() BOOST_PP_SEQ_TO_LIST_B
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/to_tuple.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/to_tuple.hpp
new file mode 100644
index 0000000..ab38eb9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/to_tuple.hpp
@@ -0,0 +1,27 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_TO_TUPLE_HPP
+# define BOOST_PREPROCESSOR_SEQ_TO_TUPLE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/enum.hpp>
+#
+# /* BOOST_PP_SEQ_TO_TUPLE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_TO_TUPLE(seq) (BOOST_PP_SEQ_ENUM(seq))
+# else
+#    define BOOST_PP_SEQ_TO_TUPLE(seq) BOOST_PP_SEQ_TO_TUPLE_I(seq)
+#    define BOOST_PP_SEQ_TO_TUPLE_I(seq) (BOOST_PP_SEQ_ENUM(seq))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/seq/transform.hpp b/gatb-core/thirdparty/boost/preprocessor/seq/transform.hpp
new file mode 100644
index 0000000..79d8108
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/seq/transform.hpp
@@ -0,0 +1,48 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_TRANSFORM_HPP
+# define BOOST_PREPROCESSOR_SEQ_TRANSFORM_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/seq.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_SEQ_TRANSFORM */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_TRANSFORM(op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))
+# else
+#    define BOOST_PP_SEQ_TRANSFORM(op, data, seq) BOOST_PP_SEQ_TRANSFORM_I(op, data, seq)
+#    define BOOST_PP_SEQ_TRANSFORM_I(op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))
+# endif
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()
+#    define BOOST_PP_SEQ_TRANSFORM_O(s, state, elem) BOOST_PP_SEQ_TRANSFORM_O_IM(s, BOOST_PP_TUPLE_REM_3 state, elem)
+#    define BOOST_PP_SEQ_TRANSFORM_O_IM(s, im, elem) BOOST_PP_SEQ_TRANSFORM_O_I(s, im, elem)
+# else
+#    define BOOST_PP_SEQ_TRANSFORM_O(s, state, elem) BOOST_PP_SEQ_TRANSFORM_O_I(s, BOOST_PP_TUPLE_ELEM(3, 0, state), BOOST_PP_TUPLE_ELEM(3, 1, state), BOOST_PP_TUPLE_ELEM(3, 2, state), elem)
+# endif
+#
+# define BOOST_PP_SEQ_TRANSFORM_O_I(s, op, data, res, elem) (op, data, res (op(s, data, elem)))
+#
+# /* BOOST_PP_SEQ_TRANSFORM_S */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#    define BOOST_PP_SEQ_TRANSFORM_S(s, op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))
+# else
+#    define BOOST_PP_SEQ_TRANSFORM_S(s, op, data, seq) BOOST_PP_SEQ_TRANSFORM_S_I(s, op, data, seq)
+#    define BOOST_PP_SEQ_TRANSFORM_S_I(s, op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot.hpp b/gatb-core/thirdparty/boost/preprocessor/slot.hpp
new file mode 100644
index 0000000..fb3c9b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SLOT_HPP
+# define BOOST_PREPROCESSOR_SLOT_HPP
+#
+# include <boost/preprocessor/slot/slot.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/counter.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/counter.hpp
new file mode 100644
index 0000000..d257a64
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/counter.hpp
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2005.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SLOT_COUNTER_HPP
+# define BOOST_PREPROCESSOR_SLOT_COUNTER_HPP
+#
+# include <boost/preprocessor/slot/detail/def.hpp>
+#
+# /* BOOST_PP_COUNTER */
+#
+# define BOOST_PP_COUNTER 0
+#
+# /* BOOST_PP_UPDATE_COUNTER */
+#
+# define BOOST_PP_UPDATE_COUNTER() <boost/preprocessor/slot/detail/counter.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/counter.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/counter.hpp
new file mode 100644
index 0000000..a1c0df1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/counter.hpp
@@ -0,0 +1,269 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2005.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# define BOOST_PP_VALUE BOOST_PP_COUNTER + 1
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_COUNTER
+#
+# undef BOOST_PP_COUNTER_DIGIT_1
+# undef BOOST_PP_COUNTER_DIGIT_2
+# undef BOOST_PP_COUNTER_DIGIT_3
+# undef BOOST_PP_COUNTER_DIGIT_4
+# undef BOOST_PP_COUNTER_DIGIT_5
+# undef BOOST_PP_COUNTER_DIGIT_6
+# undef BOOST_PP_COUNTER_DIGIT_7
+# undef BOOST_PP_COUNTER_DIGIT_8
+# undef BOOST_PP_COUNTER_DIGIT_9
+# undef BOOST_PP_COUNTER_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_COUNTER_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_COUNTER_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_COUNTER_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_COUNTER_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_COUNTER_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_COUNTER_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_COUNTER_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_COUNTER_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_COUNTER_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_COUNTER_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_COUNTER_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_COUNTER_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_COUNTER_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_COUNTER_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_COUNTER_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_COUNTER_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_COUNTER_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_COUNTER_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_COUNTER_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_COUNTER_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_COUNTER_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_COUNTER_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_COUNTER_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_COUNTER_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_COUNTER_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_COUNTER_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_COUNTER_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_COUNTER_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_COUNTER_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_COUNTER_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_COUNTER_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_COUNTER_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_COUNTER_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_COUNTER_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_COUNTER_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_COUNTER_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_COUNTER_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_COUNTER_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_COUNTER_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_COUNTER_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_COUNTER_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_COUNTER_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_COUNTER_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_COUNTER_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_COUNTER_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_COUNTER_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_COUNTER_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_COUNTER_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_COUNTER_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_COUNTER_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_COUNTER_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_COUNTER_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_COUNTER_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_COUNTER_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_COUNTER_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_COUNTER_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_COUNTER_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_COUNTER_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_COUNTER_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_COUNTER_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_COUNTER_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_COUNTER_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_COUNTER_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_COUNTER_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_COUNTER_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_COUNTER_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_COUNTER_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_COUNTER_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_COUNTER_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_COUNTER_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_COUNTER_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_COUNTER_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_COUNTER_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_COUNTER_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_COUNTER_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_COUNTER_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_COUNTER_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_COUNTER_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_COUNTER_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_COUNTER_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_COUNTER_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_COUNTER_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_COUNTER_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_COUNTER_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_COUNTER_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_COUNTER_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_COUNTER_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_COUNTER_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_COUNTER_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_COUNTER_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_COUNTER_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_COUNTER_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_COUNTER_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_COUNTER_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_COUNTER_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_COUNTER_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_COUNTER_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_COUNTER_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_COUNTER_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_COUNTER_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_COUNTER_DIGIT_10
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_10(BOOST_PP_COUNTER_DIGIT_10, BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_9
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_9(BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_8
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_8(BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_7
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_7(BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_6
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_6(BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_5
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_5(BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_4
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_4(BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_3
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_3(BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# elif BOOST_PP_COUNTER_DIGIT_2
+#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_2(BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)
+# else
+#    define BOOST_PP_COUNTER BOOST_PP_COUNTER_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/def.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/def.hpp
new file mode 100644
index 0000000..885099e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/def.hpp
@@ -0,0 +1,49 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP
+# define BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP
+#
+# /* BOOST_PP_SLOT_OFFSET_x */
+#
+# define BOOST_PP_SLOT_OFFSET_10(x) (x) % 1000000000UL
+# define BOOST_PP_SLOT_OFFSET_9(x) BOOST_PP_SLOT_OFFSET_10(x) % 100000000UL
+# define BOOST_PP_SLOT_OFFSET_8(x) BOOST_PP_SLOT_OFFSET_9(x) % 10000000UL
+# define BOOST_PP_SLOT_OFFSET_7(x) BOOST_PP_SLOT_OFFSET_8(x) % 1000000UL
+# define BOOST_PP_SLOT_OFFSET_6(x) BOOST_PP_SLOT_OFFSET_7(x) % 100000UL
+# define BOOST_PP_SLOT_OFFSET_5(x) BOOST_PP_SLOT_OFFSET_6(x) % 10000UL
+# define BOOST_PP_SLOT_OFFSET_4(x) BOOST_PP_SLOT_OFFSET_5(x) % 1000UL
+# define BOOST_PP_SLOT_OFFSET_3(x) BOOST_PP_SLOT_OFFSET_4(x) % 100UL
+# define BOOST_PP_SLOT_OFFSET_2(x) BOOST_PP_SLOT_OFFSET_3(x) % 10UL
+#
+# /* BOOST_PP_SLOT_CC_x */
+#
+# define BOOST_PP_SLOT_CC_2(a, b) BOOST_PP_SLOT_CC_2_D(a, b)
+# define BOOST_PP_SLOT_CC_3(a, b, c) BOOST_PP_SLOT_CC_3_D(a, b, c)
+# define BOOST_PP_SLOT_CC_4(a, b, c, d) BOOST_PP_SLOT_CC_4_D(a, b, c, d)
+# define BOOST_PP_SLOT_CC_5(a, b, c, d, e) BOOST_PP_SLOT_CC_5_D(a, b, c, d, e)
+# define BOOST_PP_SLOT_CC_6(a, b, c, d, e, f) BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f)
+# define BOOST_PP_SLOT_CC_7(a, b, c, d, e, f, g) BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g)
+# define BOOST_PP_SLOT_CC_8(a, b, c, d, e, f, g, h) BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h)
+# define BOOST_PP_SLOT_CC_9(a, b, c, d, e, f, g, h, i) BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i)
+# define BOOST_PP_SLOT_CC_10(a, b, c, d, e, f, g, h, i, j) BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j)
+#
+# define BOOST_PP_SLOT_CC_2_D(a, b) a ## b
+# define BOOST_PP_SLOT_CC_3_D(a, b, c) a ## b ## c
+# define BOOST_PP_SLOT_CC_4_D(a, b, c, d) a ## b ## c ## d
+# define BOOST_PP_SLOT_CC_5_D(a, b, c, d, e) a ## b ## c ## d ## e
+# define BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f) a ## b ## c ## d ## e ## f
+# define BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g) a ## b ## c ## d ## e ## f ## g
+# define BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h) a ## b ## c ## d ## e ## f ## g ## h
+# define BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i) a ## b ## c ## d ## e ## f ## g ## h ## i
+# define BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j) a ## b ## c ## d ## e ## f ## g ## h ## i ## j
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/shared.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/shared.hpp
new file mode 100644
index 0000000..c97ac54
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/shared.hpp
@@ -0,0 +1,247 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PP_VALUE
+#    error BOOST_PP_ERROR:  BOOST_PP_VALUE is not defined
+# endif
+#
+# undef BOOST_PP_SLOT_TEMP_1
+# undef BOOST_PP_SLOT_TEMP_2
+# undef BOOST_PP_SLOT_TEMP_3
+# undef BOOST_PP_SLOT_TEMP_4
+# undef BOOST_PP_SLOT_TEMP_5
+# undef BOOST_PP_SLOT_TEMP_6
+# undef BOOST_PP_SLOT_TEMP_7
+# undef BOOST_PP_SLOT_TEMP_8
+# undef BOOST_PP_SLOT_TEMP_9
+# undef BOOST_PP_SLOT_TEMP_10
+#
+# if (BOOST_PP_VALUE) / 1000000000UL == 0
+#    define BOOST_PP_SLOT_TEMP_10 0
+# elif (BOOST_PP_VALUE) / 1000000000UL == 1
+#    define BOOST_PP_SLOT_TEMP_10 1
+# elif (BOOST_PP_VALUE) / 1000000000UL == 2
+#    define BOOST_PP_SLOT_TEMP_10 2
+# elif (BOOST_PP_VALUE) / 1000000000UL == 3
+#    define BOOST_PP_SLOT_TEMP_10 3
+# elif (BOOST_PP_VALUE) / 1000000000UL == 4
+#    define BOOST_PP_SLOT_TEMP_10 4
+# elif (BOOST_PP_VALUE) / 1000000000UL == 5
+#    define BOOST_PP_SLOT_TEMP_10 5
+# elif (BOOST_PP_VALUE) / 1000000000UL == 6
+#    define BOOST_PP_SLOT_TEMP_10 6
+# elif (BOOST_PP_VALUE) / 1000000000UL == 7
+#    define BOOST_PP_SLOT_TEMP_10 7
+# elif (BOOST_PP_VALUE) / 1000000000UL == 8
+#    define BOOST_PP_SLOT_TEMP_10 8
+# elif (BOOST_PP_VALUE) / 1000000000UL == 9
+#    define BOOST_PP_SLOT_TEMP_10 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 0
+#    define BOOST_PP_SLOT_TEMP_9 0
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 1
+#    define BOOST_PP_SLOT_TEMP_9 1
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 2
+#    define BOOST_PP_SLOT_TEMP_9 2
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 3
+#    define BOOST_PP_SLOT_TEMP_9 3
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 4
+#    define BOOST_PP_SLOT_TEMP_9 4
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 5
+#    define BOOST_PP_SLOT_TEMP_9 5
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 6
+#    define BOOST_PP_SLOT_TEMP_9 6
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 7
+#    define BOOST_PP_SLOT_TEMP_9 7
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 8
+#    define BOOST_PP_SLOT_TEMP_9 8
+# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 9
+#    define BOOST_PP_SLOT_TEMP_9 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 0
+#    define BOOST_PP_SLOT_TEMP_8 0
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 1
+#    define BOOST_PP_SLOT_TEMP_8 1
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 2
+#    define BOOST_PP_SLOT_TEMP_8 2
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 3
+#    define BOOST_PP_SLOT_TEMP_8 3
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 4
+#    define BOOST_PP_SLOT_TEMP_8 4
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 5
+#    define BOOST_PP_SLOT_TEMP_8 5
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 6
+#    define BOOST_PP_SLOT_TEMP_8 6
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 7
+#    define BOOST_PP_SLOT_TEMP_8 7
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 8
+#    define BOOST_PP_SLOT_TEMP_8 8
+# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 9
+#    define BOOST_PP_SLOT_TEMP_8 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 0
+#    define BOOST_PP_SLOT_TEMP_7 0
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 1
+#    define BOOST_PP_SLOT_TEMP_7 1
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 2
+#    define BOOST_PP_SLOT_TEMP_7 2
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 3
+#    define BOOST_PP_SLOT_TEMP_7 3
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 4
+#    define BOOST_PP_SLOT_TEMP_7 4
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 5
+#    define BOOST_PP_SLOT_TEMP_7 5
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 6
+#    define BOOST_PP_SLOT_TEMP_7 6
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 7
+#    define BOOST_PP_SLOT_TEMP_7 7
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 8
+#    define BOOST_PP_SLOT_TEMP_7 8
+# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 9
+#    define BOOST_PP_SLOT_TEMP_7 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 0
+#    define BOOST_PP_SLOT_TEMP_6 0
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 1
+#    define BOOST_PP_SLOT_TEMP_6 1
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 2
+#    define BOOST_PP_SLOT_TEMP_6 2
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 3
+#    define BOOST_PP_SLOT_TEMP_6 3
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 4
+#    define BOOST_PP_SLOT_TEMP_6 4
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 5
+#    define BOOST_PP_SLOT_TEMP_6 5
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 6
+#    define BOOST_PP_SLOT_TEMP_6 6
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 7
+#    define BOOST_PP_SLOT_TEMP_6 7
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 8
+#    define BOOST_PP_SLOT_TEMP_6 8
+# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 9
+#    define BOOST_PP_SLOT_TEMP_6 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 0
+#    define BOOST_PP_SLOT_TEMP_5 0
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 1
+#    define BOOST_PP_SLOT_TEMP_5 1
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 2
+#    define BOOST_PP_SLOT_TEMP_5 2
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 3
+#    define BOOST_PP_SLOT_TEMP_5 3
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 4
+#    define BOOST_PP_SLOT_TEMP_5 4
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 5
+#    define BOOST_PP_SLOT_TEMP_5 5
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 6
+#    define BOOST_PP_SLOT_TEMP_5 6
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 7
+#    define BOOST_PP_SLOT_TEMP_5 7
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 8
+#    define BOOST_PP_SLOT_TEMP_5 8
+# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 9
+#    define BOOST_PP_SLOT_TEMP_5 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 0
+#    define BOOST_PP_SLOT_TEMP_4 0
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 1
+#    define BOOST_PP_SLOT_TEMP_4 1
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 2
+#    define BOOST_PP_SLOT_TEMP_4 2
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 3
+#    define BOOST_PP_SLOT_TEMP_4 3
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 4
+#    define BOOST_PP_SLOT_TEMP_4 4
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 5
+#    define BOOST_PP_SLOT_TEMP_4 5
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 6
+#    define BOOST_PP_SLOT_TEMP_4 6
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 7
+#    define BOOST_PP_SLOT_TEMP_4 7
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 8
+#    define BOOST_PP_SLOT_TEMP_4 8
+# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 9
+#    define BOOST_PP_SLOT_TEMP_4 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 0
+#    define BOOST_PP_SLOT_TEMP_3 0
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 1
+#    define BOOST_PP_SLOT_TEMP_3 1
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 2
+#    define BOOST_PP_SLOT_TEMP_3 2
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 3
+#    define BOOST_PP_SLOT_TEMP_3 3
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 4
+#    define BOOST_PP_SLOT_TEMP_3 4
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 5
+#    define BOOST_PP_SLOT_TEMP_3 5
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 6
+#    define BOOST_PP_SLOT_TEMP_3 6
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 7
+#    define BOOST_PP_SLOT_TEMP_3 7
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 8
+#    define BOOST_PP_SLOT_TEMP_3 8
+# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 9
+#    define BOOST_PP_SLOT_TEMP_3 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 0
+#    define BOOST_PP_SLOT_TEMP_2 0
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 1
+#    define BOOST_PP_SLOT_TEMP_2 1
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 2
+#    define BOOST_PP_SLOT_TEMP_2 2
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 3
+#    define BOOST_PP_SLOT_TEMP_2 3
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 4
+#    define BOOST_PP_SLOT_TEMP_2 4
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 5
+#    define BOOST_PP_SLOT_TEMP_2 5
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 6
+#    define BOOST_PP_SLOT_TEMP_2 6
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 7
+#    define BOOST_PP_SLOT_TEMP_2 7
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 8
+#    define BOOST_PP_SLOT_TEMP_2 8
+# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 9
+#    define BOOST_PP_SLOT_TEMP_2 9
+# endif
+#
+# if BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 0
+#    define BOOST_PP_SLOT_TEMP_1 0
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 1
+#    define BOOST_PP_SLOT_TEMP_1 1
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 2
+#    define BOOST_PP_SLOT_TEMP_1 2
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 3
+#    define BOOST_PP_SLOT_TEMP_1 3
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 4
+#    define BOOST_PP_SLOT_TEMP_1 4
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 5
+#    define BOOST_PP_SLOT_TEMP_1 5
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 6
+#    define BOOST_PP_SLOT_TEMP_1 6
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 7
+#    define BOOST_PP_SLOT_TEMP_1 7
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 8
+#    define BOOST_PP_SLOT_TEMP_1 8
+# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 9
+#    define BOOST_PP_SLOT_TEMP_1 9
+# endif
+#
+# undef BOOST_PP_VALUE
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot1.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot1.hpp
new file mode 100644
index 0000000..b22748e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot1.hpp
@@ -0,0 +1,267 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_SLOT_1
+#
+# undef BOOST_PP_SLOT_1_DIGIT_1
+# undef BOOST_PP_SLOT_1_DIGIT_2
+# undef BOOST_PP_SLOT_1_DIGIT_3
+# undef BOOST_PP_SLOT_1_DIGIT_4
+# undef BOOST_PP_SLOT_1_DIGIT_5
+# undef BOOST_PP_SLOT_1_DIGIT_6
+# undef BOOST_PP_SLOT_1_DIGIT_7
+# undef BOOST_PP_SLOT_1_DIGIT_8
+# undef BOOST_PP_SLOT_1_DIGIT_9
+# undef BOOST_PP_SLOT_1_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_SLOT_1_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_SLOT_1_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_SLOT_1_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_SLOT_1_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_SLOT_1_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_SLOT_1_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_SLOT_1_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_SLOT_1_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_SLOT_1_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_SLOT_1_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_SLOT_1_DIGIT_10
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_1_DIGIT_10, BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_9
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_8
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_7
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_6
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_5
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_4
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_3
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# elif BOOST_PP_SLOT_1_DIGIT_2
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)
+# else
+#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_1_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot2.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot2.hpp
new file mode 100644
index 0000000..5d5258c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot2.hpp
@@ -0,0 +1,267 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_SLOT_2
+#
+# undef BOOST_PP_SLOT_2_DIGIT_1
+# undef BOOST_PP_SLOT_2_DIGIT_2
+# undef BOOST_PP_SLOT_2_DIGIT_3
+# undef BOOST_PP_SLOT_2_DIGIT_4
+# undef BOOST_PP_SLOT_2_DIGIT_5
+# undef BOOST_PP_SLOT_2_DIGIT_6
+# undef BOOST_PP_SLOT_2_DIGIT_7
+# undef BOOST_PP_SLOT_2_DIGIT_8
+# undef BOOST_PP_SLOT_2_DIGIT_9
+# undef BOOST_PP_SLOT_2_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_SLOT_2_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_SLOT_2_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_SLOT_2_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_SLOT_2_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_SLOT_2_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_SLOT_2_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_SLOT_2_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_SLOT_2_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_SLOT_2_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_SLOT_2_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_SLOT_2_DIGIT_10
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_2_DIGIT_10, BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_9
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_8
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_7
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_6
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_5
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_4
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_3
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# elif BOOST_PP_SLOT_2_DIGIT_2
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)
+# else
+#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_2_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot3.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot3.hpp
new file mode 100644
index 0000000..005cf21
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot3.hpp
@@ -0,0 +1,267 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_SLOT_3
+#
+# undef BOOST_PP_SLOT_3_DIGIT_1
+# undef BOOST_PP_SLOT_3_DIGIT_2
+# undef BOOST_PP_SLOT_3_DIGIT_3
+# undef BOOST_PP_SLOT_3_DIGIT_4
+# undef BOOST_PP_SLOT_3_DIGIT_5
+# undef BOOST_PP_SLOT_3_DIGIT_6
+# undef BOOST_PP_SLOT_3_DIGIT_7
+# undef BOOST_PP_SLOT_3_DIGIT_8
+# undef BOOST_PP_SLOT_3_DIGIT_9
+# undef BOOST_PP_SLOT_3_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_SLOT_3_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_SLOT_3_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_SLOT_3_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_SLOT_3_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_SLOT_3_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_SLOT_3_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_SLOT_3_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_SLOT_3_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_SLOT_3_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_SLOT_3_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_SLOT_3_DIGIT_10
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_3_DIGIT_10, BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_9
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_8
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_7
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_6
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_5
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_4
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_3
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# elif BOOST_PP_SLOT_3_DIGIT_2
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)
+# else
+#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_3_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot4.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot4.hpp
new file mode 100644
index 0000000..9aa4d8a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot4.hpp
@@ -0,0 +1,267 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_SLOT_4
+#
+# undef BOOST_PP_SLOT_4_DIGIT_1
+# undef BOOST_PP_SLOT_4_DIGIT_2
+# undef BOOST_PP_SLOT_4_DIGIT_3
+# undef BOOST_PP_SLOT_4_DIGIT_4
+# undef BOOST_PP_SLOT_4_DIGIT_5
+# undef BOOST_PP_SLOT_4_DIGIT_6
+# undef BOOST_PP_SLOT_4_DIGIT_7
+# undef BOOST_PP_SLOT_4_DIGIT_8
+# undef BOOST_PP_SLOT_4_DIGIT_9
+# undef BOOST_PP_SLOT_4_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_SLOT_4_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_SLOT_4_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_SLOT_4_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_SLOT_4_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_SLOT_4_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_SLOT_4_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_SLOT_4_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_SLOT_4_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_SLOT_4_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_SLOT_4_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_SLOT_4_DIGIT_10
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_4_DIGIT_10, BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_9
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_8
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_7
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_6
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_5
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_4
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_3
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# elif BOOST_PP_SLOT_4_DIGIT_2
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)
+# else
+#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_4_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot5.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot5.hpp
new file mode 100644
index 0000000..d17535d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/detail/slot5.hpp
@@ -0,0 +1,267 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include <boost/preprocessor/slot/detail/shared.hpp>
+#
+# undef BOOST_PP_SLOT_5
+#
+# undef BOOST_PP_SLOT_5_DIGIT_1
+# undef BOOST_PP_SLOT_5_DIGIT_2
+# undef BOOST_PP_SLOT_5_DIGIT_3
+# undef BOOST_PP_SLOT_5_DIGIT_4
+# undef BOOST_PP_SLOT_5_DIGIT_5
+# undef BOOST_PP_SLOT_5_DIGIT_6
+# undef BOOST_PP_SLOT_5_DIGIT_7
+# undef BOOST_PP_SLOT_5_DIGIT_8
+# undef BOOST_PP_SLOT_5_DIGIT_9
+# undef BOOST_PP_SLOT_5_DIGIT_10
+#
+# if BOOST_PP_SLOT_TEMP_10 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_10 0
+# elif BOOST_PP_SLOT_TEMP_10 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_10 1
+# elif BOOST_PP_SLOT_TEMP_10 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_10 2
+# elif BOOST_PP_SLOT_TEMP_10 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_10 3
+# elif BOOST_PP_SLOT_TEMP_10 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_10 4
+# elif BOOST_PP_SLOT_TEMP_10 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_10 5
+# elif BOOST_PP_SLOT_TEMP_10 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_10 6
+# elif BOOST_PP_SLOT_TEMP_10 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_10 7
+# elif BOOST_PP_SLOT_TEMP_10 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_10 8
+# elif BOOST_PP_SLOT_TEMP_10 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_10 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_9 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_9 0
+# elif BOOST_PP_SLOT_TEMP_9 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_9 1
+# elif BOOST_PP_SLOT_TEMP_9 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_9 2
+# elif BOOST_PP_SLOT_TEMP_9 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_9 3
+# elif BOOST_PP_SLOT_TEMP_9 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_9 4
+# elif BOOST_PP_SLOT_TEMP_9 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_9 5
+# elif BOOST_PP_SLOT_TEMP_9 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_9 6
+# elif BOOST_PP_SLOT_TEMP_9 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_9 7
+# elif BOOST_PP_SLOT_TEMP_9 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_9 8
+# elif BOOST_PP_SLOT_TEMP_9 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_9 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_8 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_8 0
+# elif BOOST_PP_SLOT_TEMP_8 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_8 1
+# elif BOOST_PP_SLOT_TEMP_8 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_8 2
+# elif BOOST_PP_SLOT_TEMP_8 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_8 3
+# elif BOOST_PP_SLOT_TEMP_8 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_8 4
+# elif BOOST_PP_SLOT_TEMP_8 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_8 5
+# elif BOOST_PP_SLOT_TEMP_8 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_8 6
+# elif BOOST_PP_SLOT_TEMP_8 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_8 7
+# elif BOOST_PP_SLOT_TEMP_8 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_8 8
+# elif BOOST_PP_SLOT_TEMP_8 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_8 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_7 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_7 0
+# elif BOOST_PP_SLOT_TEMP_7 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_7 1
+# elif BOOST_PP_SLOT_TEMP_7 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_7 2
+# elif BOOST_PP_SLOT_TEMP_7 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_7 3
+# elif BOOST_PP_SLOT_TEMP_7 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_7 4
+# elif BOOST_PP_SLOT_TEMP_7 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_7 5
+# elif BOOST_PP_SLOT_TEMP_7 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_7 6
+# elif BOOST_PP_SLOT_TEMP_7 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_7 7
+# elif BOOST_PP_SLOT_TEMP_7 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_7 8
+# elif BOOST_PP_SLOT_TEMP_7 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_7 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_6 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_6 0
+# elif BOOST_PP_SLOT_TEMP_6 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_6 1
+# elif BOOST_PP_SLOT_TEMP_6 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_6 2
+# elif BOOST_PP_SLOT_TEMP_6 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_6 3
+# elif BOOST_PP_SLOT_TEMP_6 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_6 4
+# elif BOOST_PP_SLOT_TEMP_6 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_6 5
+# elif BOOST_PP_SLOT_TEMP_6 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_6 6
+# elif BOOST_PP_SLOT_TEMP_6 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_6 7
+# elif BOOST_PP_SLOT_TEMP_6 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_6 8
+# elif BOOST_PP_SLOT_TEMP_6 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_6 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_5 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_5 0
+# elif BOOST_PP_SLOT_TEMP_5 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_5 1
+# elif BOOST_PP_SLOT_TEMP_5 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_5 2
+# elif BOOST_PP_SLOT_TEMP_5 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_5 3
+# elif BOOST_PP_SLOT_TEMP_5 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_5 4
+# elif BOOST_PP_SLOT_TEMP_5 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_5 5
+# elif BOOST_PP_SLOT_TEMP_5 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_5 6
+# elif BOOST_PP_SLOT_TEMP_5 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_5 7
+# elif BOOST_PP_SLOT_TEMP_5 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_5 8
+# elif BOOST_PP_SLOT_TEMP_5 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_5 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_4 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_4 0
+# elif BOOST_PP_SLOT_TEMP_4 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_4 1
+# elif BOOST_PP_SLOT_TEMP_4 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_4 2
+# elif BOOST_PP_SLOT_TEMP_4 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_4 3
+# elif BOOST_PP_SLOT_TEMP_4 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_4 4
+# elif BOOST_PP_SLOT_TEMP_4 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_4 5
+# elif BOOST_PP_SLOT_TEMP_4 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_4 6
+# elif BOOST_PP_SLOT_TEMP_4 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_4 7
+# elif BOOST_PP_SLOT_TEMP_4 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_4 8
+# elif BOOST_PP_SLOT_TEMP_4 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_4 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_3 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_3 0
+# elif BOOST_PP_SLOT_TEMP_3 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_3 1
+# elif BOOST_PP_SLOT_TEMP_3 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_3 2
+# elif BOOST_PP_SLOT_TEMP_3 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_3 3
+# elif BOOST_PP_SLOT_TEMP_3 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_3 4
+# elif BOOST_PP_SLOT_TEMP_3 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_3 5
+# elif BOOST_PP_SLOT_TEMP_3 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_3 6
+# elif BOOST_PP_SLOT_TEMP_3 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_3 7
+# elif BOOST_PP_SLOT_TEMP_3 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_3 8
+# elif BOOST_PP_SLOT_TEMP_3 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_3 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_2 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_2 0
+# elif BOOST_PP_SLOT_TEMP_2 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_2 1
+# elif BOOST_PP_SLOT_TEMP_2 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_2 2
+# elif BOOST_PP_SLOT_TEMP_2 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_2 3
+# elif BOOST_PP_SLOT_TEMP_2 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_2 4
+# elif BOOST_PP_SLOT_TEMP_2 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_2 5
+# elif BOOST_PP_SLOT_TEMP_2 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_2 6
+# elif BOOST_PP_SLOT_TEMP_2 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_2 7
+# elif BOOST_PP_SLOT_TEMP_2 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_2 8
+# elif BOOST_PP_SLOT_TEMP_2 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_2 9
+# endif
+#
+# if BOOST_PP_SLOT_TEMP_1 == 0
+#    define BOOST_PP_SLOT_5_DIGIT_1 0
+# elif BOOST_PP_SLOT_TEMP_1 == 1
+#    define BOOST_PP_SLOT_5_DIGIT_1 1
+# elif BOOST_PP_SLOT_TEMP_1 == 2
+#    define BOOST_PP_SLOT_5_DIGIT_1 2
+# elif BOOST_PP_SLOT_TEMP_1 == 3
+#    define BOOST_PP_SLOT_5_DIGIT_1 3
+# elif BOOST_PP_SLOT_TEMP_1 == 4
+#    define BOOST_PP_SLOT_5_DIGIT_1 4
+# elif BOOST_PP_SLOT_TEMP_1 == 5
+#    define BOOST_PP_SLOT_5_DIGIT_1 5
+# elif BOOST_PP_SLOT_TEMP_1 == 6
+#    define BOOST_PP_SLOT_5_DIGIT_1 6
+# elif BOOST_PP_SLOT_TEMP_1 == 7
+#    define BOOST_PP_SLOT_5_DIGIT_1 7
+# elif BOOST_PP_SLOT_TEMP_1 == 8
+#    define BOOST_PP_SLOT_5_DIGIT_1 8
+# elif BOOST_PP_SLOT_TEMP_1 == 9
+#    define BOOST_PP_SLOT_5_DIGIT_1 9
+# endif
+#
+# if BOOST_PP_SLOT_5_DIGIT_10
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_5_DIGIT_10, BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_9
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_8
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_7
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_6
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_5
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_4
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_3
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# elif BOOST_PP_SLOT_5_DIGIT_2
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)
+# else
+#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_5_DIGIT_1
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/slot/slot.hpp b/gatb-core/thirdparty/boost/preprocessor/slot/slot.hpp
new file mode 100644
index 0000000..147b097
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/slot/slot.hpp
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SLOT_SLOT_HPP
+# define BOOST_PREPROCESSOR_SLOT_SLOT_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/slot/detail/def.hpp>
+#
+# /* BOOST_PP_ASSIGN_SLOT */
+#
+# define BOOST_PP_ASSIGN_SLOT(i) BOOST_PP_CAT(BOOST_PP_ASSIGN_SLOT_, i)
+#
+# define BOOST_PP_ASSIGN_SLOT_1 <boost/preprocessor/slot/detail/slot1.hpp>
+# define BOOST_PP_ASSIGN_SLOT_2 <boost/preprocessor/slot/detail/slot2.hpp>
+# define BOOST_PP_ASSIGN_SLOT_3 <boost/preprocessor/slot/detail/slot3.hpp>
+# define BOOST_PP_ASSIGN_SLOT_4 <boost/preprocessor/slot/detail/slot4.hpp>
+# define BOOST_PP_ASSIGN_SLOT_5 <boost/preprocessor/slot/detail/slot5.hpp>
+#
+# /* BOOST_PP_SLOT */
+#
+# define BOOST_PP_SLOT(i) BOOST_PP_CAT(BOOST_PP_SLOT_, i)()
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/stringize.hpp b/gatb-core/thirdparty/boost/preprocessor/stringize.hpp
new file mode 100644
index 0000000..64dd5fd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/stringize.hpp
@@ -0,0 +1,33 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_STRINGIZE_HPP
+# define BOOST_PREPROCESSOR_STRINGIZE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_STRINGIZE */
+#
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_A((text))
+#    define BOOST_PP_STRINGIZE_A(arg) BOOST_PP_STRINGIZE_I arg
+# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_OO((text))
+#    define BOOST_PP_STRINGIZE_OO(par) BOOST_PP_STRINGIZE_I ## par
+# else
+#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_I(text)
+# endif
+#
+# define BOOST_PP_STRINGIZE_I(text) #text
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple.hpp
new file mode 100644
index 0000000..0f4976b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple.hpp
@@ -0,0 +1,28 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_HPP
+# define BOOST_PREPROCESSOR_TUPLE_HPP
+#
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/enum.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+# include <boost/preprocessor/tuple/reverse.hpp>
+# include <boost/preprocessor/tuple/size.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+# include <boost/preprocessor/tuple/to_list.hpp>
+# include <boost/preprocessor/tuple/to_seq.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/eat.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/eat.hpp
new file mode 100644
index 0000000..708015e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/eat.hpp
@@ -0,0 +1,106 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002-2011) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_EAT_HPP
+# define BOOST_PREPROCESSOR_TUPLE_EAT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_EAT */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_EAT(...)
+# else
+#    define BOOST_PP_EAT(x)
+# endif
+#
+# /* BOOST_PP_TUPLE_EAT */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_TUPLE_EAT(size) BOOST_PP_EAT
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_I(size)
+#    else
+#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_OO((size))
+#        define BOOST_PP_TUPLE_EAT_OO(par) BOOST_PP_TUPLE_EAT_I ## par
+#    endif
+#    define BOOST_PP_TUPLE_EAT_I(size) BOOST_PP_TUPLE_EAT_ ## size
+# endif
+# define BOOST_PP_TUPLE_EAT_1(e0)
+# define BOOST_PP_TUPLE_EAT_2(e0, e1)
+# define BOOST_PP_TUPLE_EAT_3(e0, e1, e2)
+# define BOOST_PP_TUPLE_EAT_4(e0, e1, e2, e3)
+# define BOOST_PP_TUPLE_EAT_5(e0, e1, e2, e3, e4)
+# define BOOST_PP_TUPLE_EAT_6(e0, e1, e2, e3, e4, e5)
+# define BOOST_PP_TUPLE_EAT_7(e0, e1, e2, e3, e4, e5, e6)
+# define BOOST_PP_TUPLE_EAT_8(e0, e1, e2, e3, e4, e5, e6, e7)
+# define BOOST_PP_TUPLE_EAT_9(e0, e1, e2, e3, e4, e5, e6, e7, e8)
+# define BOOST_PP_TUPLE_EAT_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)
+# define BOOST_PP_TUPLE_EAT_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)
+# define BOOST_PP_TUPLE_EAT_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)
+# define BOOST_PP_TUPLE_EAT_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)
+# define BOOST_PP_TUPLE_EAT_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)
+# define BOOST_PP_TUPLE_EAT_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)
+# define BOOST_PP_TUPLE_EAT_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)
+# define BOOST_PP_TUPLE_EAT_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)
+# define BOOST_PP_TUPLE_EAT_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17)
+# define BOOST_PP_TUPLE_EAT_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18)
+# define BOOST_PP_TUPLE_EAT_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19)
+# define BOOST_PP_TUPLE_EAT_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20)
+# define BOOST_PP_TUPLE_EAT_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21)
+# define BOOST_PP_TUPLE_EAT_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22)
+# define BOOST_PP_TUPLE_EAT_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23)
+# define BOOST_PP_TUPLE_EAT_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24)
+# define BOOST_PP_TUPLE_EAT_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25)
+# define BOOST_PP_TUPLE_EAT_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26)
+# define BOOST_PP_TUPLE_EAT_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27)
+# define BOOST_PP_TUPLE_EAT_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28)
+# define BOOST_PP_TUPLE_EAT_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29)
+# define BOOST_PP_TUPLE_EAT_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30)
+# define BOOST_PP_TUPLE_EAT_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31)
+# define BOOST_PP_TUPLE_EAT_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32)
+# define BOOST_PP_TUPLE_EAT_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33)
+# define BOOST_PP_TUPLE_EAT_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34)
+# define BOOST_PP_TUPLE_EAT_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35)
+# define BOOST_PP_TUPLE_EAT_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36)
+# define BOOST_PP_TUPLE_EAT_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37)
+# define BOOST_PP_TUPLE_EAT_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38)
+# define BOOST_PP_TUPLE_EAT_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39)
+# define BOOST_PP_TUPLE_EAT_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40)
+# define BOOST_PP_TUPLE_EAT_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41)
+# define BOOST_PP_TUPLE_EAT_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42)
+# define BOOST_PP_TUPLE_EAT_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43)
+# define BOOST_PP_TUPLE_EAT_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44)
+# define BOOST_PP_TUPLE_EAT_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45)
+# define BOOST_PP_TUPLE_EAT_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46)
+# define BOOST_PP_TUPLE_EAT_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47)
+# define BOOST_PP_TUPLE_EAT_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48)
+# define BOOST_PP_TUPLE_EAT_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49)
+# define BOOST_PP_TUPLE_EAT_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50)
+# define BOOST_PP_TUPLE_EAT_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51)
+# define BOOST_PP_TUPLE_EAT_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52)
+# define BOOST_PP_TUPLE_EAT_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53)
+# define BOOST_PP_TUPLE_EAT_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54)
+# define BOOST_PP_TUPLE_EAT_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55)
+# define BOOST_PP_TUPLE_EAT_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56)
+# define BOOST_PP_TUPLE_EAT_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57)
+# define BOOST_PP_TUPLE_EAT_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58)
+# define BOOST_PP_TUPLE_EAT_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59)
+# define BOOST_PP_TUPLE_EAT_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60)
+# define BOOST_PP_TUPLE_EAT_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61)
+# define BOOST_PP_TUPLE_EAT_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62)
+# define BOOST_PP_TUPLE_EAT_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63)
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/elem.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/elem.hpp
new file mode 100644
index 0000000..3eba1c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/elem.hpp
@@ -0,0 +1,191 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002-2011) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_ELEM_HPP
+# define BOOST_PREPROCESSOR_TUPLE_ELEM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+# include <boost/preprocessor/variadic/elem.hpp>
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)
+#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_REM tuple)
+#    define BOOST_PP_TUPLE_ELEM_O_3(size, n, tuple) BOOST_PP_TUPLE_ELEM_O_2(n, tuple)
+# else
+#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n), BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size), tuple))
+#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)
+#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)
+#    elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I_OO((size, n, tuple))
+#        define BOOST_PP_TUPLE_ELEM_I_OO(par) BOOST_PP_TUPLE_ELEM_I ## par
+#        define BOOST_PP_TUPLE_ELEM_I(size, n, tuple) BOOST_PP_TUPLE_ELEM_II((n, BOOST_PP_TUPLE_ELEM_E_ ## size ## tuple))
+#        define BOOST_PP_TUPLE_ELEM_II(par) BOOST_PP_TUPLE_ELEM_III_OO(par)
+#        define BOOST_PP_TUPLE_ELEM_III_OO(par) BOOST_PP_TUPLE_ELEM_III ## par
+#        define BOOST_PP_TUPLE_ELEM_III(n, etuple) BOOST_PP_TUPLE_ELEM_ ## n ## etuple
+#    else
+#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size) tuple)
+#        define BOOST_PP_TUPLE_ELEM_I(x) x
+#    endif
+#    define BOOST_PP_TUPLE_ELEM_E_1(e0) (e0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_2(e0, e1) (e0, e1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_3(e0, e1, e2) (e0, e1, e2, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_4(e0, e1, e2, e3) (e0, e1, e2, e3, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_5(e0, e1, e2, e3, e4) (e0, e1, e2, e3, e4, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_6(e0, e1, e2, e3, e4, e5) (e0, e1, e2, e3, e4, e5, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_7(e0, e1, e2, e3, e4, e5, e6) (e0, e1, e2, e3, e4, e5, e6, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, e1, e2, e3, e4, e5, e6, e7, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, e1, e2, e3, e4, e5, e6, e7, e8, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+#    define BOOST_PP_TUPLE_ELEM_E_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,  [...]
+#    define BOOST_PP_TUPLE_ELEM_E_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? [...]
+#    define BOOST_PP_TUPLE_ELEM_E_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ?, ?, ?, ?, ?, ?, ?, ?,  [...]
+#    define BOOST_PP_TUPLE_ELEM_E_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ?, ?, ?, ?, ?, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ?, ? [...]
+#    define BOOST_PP_TUPLE_ELEM_E_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, [...]
+#    define BOOST_PP_TUPLE_ELEM_E_64
+#    define BOOST_PP_TUPLE_ELEM_0(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0
+#    define BOOST_PP_TUPLE_ELEM_1(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e1
+#    define BOOST_PP_TUPLE_ELEM_2(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e2
+#    define BOOST_PP_TUPLE_ELEM_3(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e3
+#    define BOOST_PP_TUPLE_ELEM_4(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e4
+#    define BOOST_PP_TUPLE_ELEM_5(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e5
+#    define BOOST_PP_TUPLE_ELEM_6(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e6
+#    define BOOST_PP_TUPLE_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e7
+#    define BOOST_PP_TUPLE_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e8
+#    define BOOST_PP_TUPLE_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e9
+#    define BOOST_PP_TUPLE_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e10
+#    define BOOST_PP_TUPLE_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e11
+#    define BOOST_PP_TUPLE_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e12
+#    define BOOST_PP_TUPLE_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e13
+#    define BOOST_PP_TUPLE_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e14
+#    define BOOST_PP_TUPLE_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e15
+#    define BOOST_PP_TUPLE_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e16
+#    define BOOST_PP_TUPLE_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e17
+#    define BOOST_PP_TUPLE_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e18
+#    define BOOST_PP_TUPLE_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e19
+#    define BOOST_PP_TUPLE_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e20
+#    define BOOST_PP_TUPLE_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e21
+#    define BOOST_PP_TUPLE_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e22
+#    define BOOST_PP_TUPLE_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e23
+#    define BOOST_PP_TUPLE_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e24
+#    define BOOST_PP_TUPLE_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e25
+#    define BOOST_PP_TUPLE_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e26
+#    define BOOST_PP_TUPLE_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e27
+#    define BOOST_PP_TUPLE_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e28
+#    define BOOST_PP_TUPLE_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e29
+#    define BOOST_PP_TUPLE_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e30
+#    define BOOST_PP_TUPLE_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e31
+#    define BOOST_PP_TUPLE_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e32
+#    define BOOST_PP_TUPLE_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e33
+#    define BOOST_PP_TUPLE_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e34
+#    define BOOST_PP_TUPLE_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e35
+#    define BOOST_PP_TUPLE_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e36
+#    define BOOST_PP_TUPLE_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e37
+#    define BOOST_PP_TUPLE_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e38
+#    define BOOST_PP_TUPLE_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e39
+#    define BOOST_PP_TUPLE_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e40
+#    define BOOST_PP_TUPLE_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e41
+#    define BOOST_PP_TUPLE_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e42
+#    define BOOST_PP_TUPLE_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e43
+#    define BOOST_PP_TUPLE_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e44
+#    define BOOST_PP_TUPLE_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e45
+#    define BOOST_PP_TUPLE_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e46
+#    define BOOST_PP_TUPLE_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e47
+#    define BOOST_PP_TUPLE_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e48
+#    define BOOST_PP_TUPLE_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e49
+#    define BOOST_PP_TUPLE_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e50
+#    define BOOST_PP_TUPLE_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e51
+#    define BOOST_PP_TUPLE_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e52
+#    define BOOST_PP_TUPLE_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e53
+#    define BOOST_PP_TUPLE_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e54
+#    define BOOST_PP_TUPLE_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e55
+#    define BOOST_PP_TUPLE_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e56
+#    define BOOST_PP_TUPLE_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e57
+#    define BOOST_PP_TUPLE_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e58
+#    define BOOST_PP_TUPLE_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e59
+#    define BOOST_PP_TUPLE_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e60
+#    define BOOST_PP_TUPLE_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e61
+#    define BOOST_PP_TUPLE_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e62
+#    define BOOST_PP_TUPLE_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e63
+# endif
+#
+# /* directly used elsewhere in Boost... */
+#
+# define BOOST_PP_TUPLE_ELEM_1_0(a) a
+#
+# define BOOST_PP_TUPLE_ELEM_2_0(a, b) a
+# define BOOST_PP_TUPLE_ELEM_2_1(a, b) b
+#
+# define BOOST_PP_TUPLE_ELEM_3_0(a, b, c) a
+# define BOOST_PP_TUPLE_ELEM_3_1(a, b, c) b
+# define BOOST_PP_TUPLE_ELEM_3_2(a, b, c) c
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/enum.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/enum.hpp
new file mode 100644
index 0000000..4915831
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/enum.hpp
@@ -0,0 +1,22 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_ENUM_HPP
+# define BOOST_PREPROCESSOR_TUPLE_ENUM_HPP
+#
+# include <boost/preprocessor/tuple/rem.hpp>
+#
+# /* BOOST_PP_TUPLE_ENUM */
+#
+# define BOOST_PP_TUPLE_ENUM BOOST_PP_TUPLE_REM_CTOR
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/rem.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/rem.hpp
new file mode 100644
index 0000000..af668a0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/rem.hpp
@@ -0,0 +1,135 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_REM_HPP
+# define BOOST_PREPROCESSOR_TUPLE_REM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+#
+# /* BOOST_PP_REM */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_REM(...) __VA_ARGS__
+# else
+#    define BOOST_PP_REM(x) x
+# endif
+#
+# /* BOOST_PP_TUPLE_REM */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_TUPLE_REM(size) BOOST_PP_REM
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_I(size)
+#    else
+#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_OO((size))
+#        define BOOST_PP_TUPLE_REM_OO(par) BOOST_PP_TUPLE_REM_I ## par
+#    endif
+#    define BOOST_PP_TUPLE_REM_I(size) BOOST_PP_TUPLE_REM_ ## size
+# endif
+# define BOOST_PP_TUPLE_REM_0()
+# define BOOST_PP_TUPLE_REM_1(e0) e0
+# define BOOST_PP_TUPLE_REM_2(e0, e1) e0, e1
+# define BOOST_PP_TUPLE_REM_3(e0, e1, e2) e0, e1, e2
+# define BOOST_PP_TUPLE_REM_4(e0, e1, e2, e3) e0, e1, e2, e3
+# define BOOST_PP_TUPLE_REM_5(e0, e1, e2, e3, e4) e0, e1, e2, e3, e4
+# define BOOST_PP_TUPLE_REM_6(e0, e1, e2, e3, e4, e5) e0, e1, e2, e3, e4, e5
+# define BOOST_PP_TUPLE_REM_7(e0, e1, e2, e3, e4, e5, e6) e0, e1, e2, e3, e4, e5, e6
+# define BOOST_PP_TUPLE_REM_8(e0, e1, e2, e3, e4, e5, e6, e7) e0, e1, e2, e3, e4, e5, e6, e7
+# define BOOST_PP_TUPLE_REM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) e0, e1, e2, e3, e4, e5, e6, e7, e8
+# define BOOST_PP_TUPLE_REM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9
+# define BOOST_PP_TUPLE_REM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10
+# define BOOST_PP_TUPLE_REM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11
+# define BOOST_PP_TUPLE_REM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12
+# define BOOST_PP_TUPLE_REM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13
+# define BOOST_PP_TUPLE_REM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14
+# define BOOST_PP_TUPLE_REM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15
+# define BOOST_PP_TUPLE_REM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16
+# define BOOST_PP_TUPLE_REM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17
+# define BOOST_PP_TUPLE_REM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18
+# define BOOST_PP_TUPLE_REM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19
+# define BOOST_PP_TUPLE_REM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20
+# define BOOST_PP_TUPLE_REM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21
+# define BOOST_PP_TUPLE_REM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22
+# define BOOST_PP_TUPLE_REM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23
+# define BOOST_PP_TUPLE_REM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24
+# define BOOST_PP_TUPLE_REM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25
+# define BOOST_PP_TUPLE_REM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26
+# define BOOST_PP_TUPLE_REM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27
+# define BOOST_PP_TUPLE_REM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28
+# define BOOST_PP_TUPLE_REM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29
+# define BOOST_PP_TUPLE_REM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30
+# define BOOST_PP_TUPLE_REM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31
+# define BOOST_PP_TUPLE_REM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32
+# define BOOST_PP_TUPLE_REM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33
+# define BOOST_PP_TUPLE_REM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34
+# define BOOST_PP_TUPLE_REM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35
+# define BOOST_PP_TUPLE_REM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36
+# define BOOST_PP_TUPLE_REM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37
+# define BOOST_PP_TUPLE_REM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38
+# define BOOST_PP_TUPLE_REM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39
+# define BOOST_PP_TUPLE_REM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40
+# define BOOST_PP_TUPLE_REM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41
+# define BOOST_PP_TUPLE_REM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42
+# define BOOST_PP_TUPLE_REM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43
+# define BOOST_PP_TUPLE_REM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44
+# define BOOST_PP_TUPLE_REM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45
+# define BOOST_PP_TUPLE_REM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46
+# define BOOST_PP_TUPLE_REM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47
+# define BOOST_PP_TUPLE_REM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48
+# define BOOST_PP_TUPLE_REM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e [...]
+# define BOOST_PP_TUPLE_REM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e [...]
+# define BOOST_PP_TUPLE_REM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e [...]
+# define BOOST_PP_TUPLE_REM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e [...]
+# define BOOST_PP_TUPLE_REM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e [...]
+# define BOOST_PP_TUPLE_REM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e [...]
+# define BOOST_PP_TUPLE_REM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e [...]
+# define BOOST_PP_TUPLE_REM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e [...]
+# define BOOST_PP_TUPLE_REM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e [...]
+# define BOOST_PP_TUPLE_REM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e [...]
+# define BOOST_PP_TUPLE_REM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e [...]
+# define BOOST_PP_TUPLE_REM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e [...]
+# define BOOST_PP_TUPLE_REM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e [...]
+# define BOOST_PP_TUPLE_REM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e [...]
+# define BOOST_PP_TUPLE_REM_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e [...]
+#
+# /* BOOST_PP_TUPLE_REM_CTOR */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_REM_CTOR_I(m, args) BOOST_PP_TUPLE_REM_CTOR_II(m, args)
+#        define BOOST_PP_TUPLE_REM_CTOR_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_REM tuple
+#    define BOOST_PP_TUPLE_REM_CTOR_O_2(size, tuple) BOOST_PP_TUPLE_REM_CTOR_O_1(tuple)
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)
+#    else
+#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_D(size, tuple)
+#        define BOOST_PP_TUPLE_REM_CTOR_D(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)
+#    endif
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) ext tuple
+#    else
+#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) BOOST_PP_TUPLE_REM_CTOR_OO((ext, tuple))
+#        define BOOST_PP_TUPLE_REM_CTOR_OO(par) BOOST_PP_TUPLE_REM_CTOR_II ## par
+#        define BOOST_PP_TUPLE_REM_CTOR_II(ext, tuple) ext ## tuple
+#    endif
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/reverse.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/reverse.hpp
new file mode 100644
index 0000000..c4f263a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/reverse.hpp
@@ -0,0 +1,114 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002-2011) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_REVERSE_HPP
+# define BOOST_PREPROCESSOR_TUPLE_REVERSE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+#
+# /* BOOST_PP_TUPLE_REVERSE */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_REVERSE(...) BOOST_PP_TUPLE_REVERSE_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REVERSE_O_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_REVERSE_I(m, args) BOOST_PP_TUPLE_REVERSE_II(m, args)
+#        define BOOST_PP_TUPLE_REVERSE_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_REVERSE(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REVERSE_O_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_REVERSE_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_REVERSE_, BOOST_PP_VARIADIC_SIZE tuple) tuple
+#    define BOOST_PP_TUPLE_REVERSE_O_2(size, tuple) BOOST_PP_TUPLE_REVERSE_O_1(tuple)
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_REVERSE(size, tuple) BOOST_PP_TUPLE_REVERSE_I(size, tuple)
+#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#            define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_ ## s t
+#        else
+#            define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_II(BOOST_PP_TUPLE_REVERSE_ ## s t)
+#            define BOOST_PP_TUPLE_REVERSE_II(res) res
+#        endif
+#    else
+#        define BOOST_PP_TUPLE_REVERSE(size, tuple) BOOST_PP_TUPLE_REVERSE_OO((size, tuple))
+#        define BOOST_PP_TUPLE_REVERSE_OO(par) BOOST_PP_TUPLE_REVERSE_I ## par
+#        define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_ ## s ## t
+#    endif
+# endif
+# define BOOST_PP_TUPLE_REVERSE_1(e0) (e0)
+# define BOOST_PP_TUPLE_REVERSE_2(e0, e1) (e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_3(e0, e1, e2) (e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_4(e0, e1, e2, e3) (e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_5(e0, e1, e2, e3, e4) (e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_6(e0, e1, e2, e3, e4, e5) (e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_7(e0, e1, e2, e3, e4, e5, e6) (e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_8(e0, e1, e2, e3, e4, e5, e6, e7) (e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)
+# define BOOST_PP_TUPLE_REVERSE_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3 [...]
+# define BOOST_PP_TUPLE_REVERSE_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6,  [...]
+# define BOOST_PP_TUPLE_REVERSE_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8 [...]
+# define BOOST_PP_TUPLE_REVERSE_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e [...]
+# define BOOST_PP_TUPLE_REVERSE_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e [...]
+# define BOOST_PP_TUPLE_REVERSE_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e [...]
+# define BOOST_PP_TUPLE_REVERSE_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e [...]
+# define BOOST_PP_TUPLE_REVERSE_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e [...]
+# define BOOST_PP_TUPLE_REVERSE_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e [...]
+# define BOOST_PP_TUPLE_REVERSE_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e [...]
+# define BOOST_PP_TUPLE_REVERSE_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e [...]
+# define BOOST_PP_TUPLE_REVERSE_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e [...]
+# define BOOST_PP_TUPLE_REVERSE_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e [...]
+# define BOOST_PP_TUPLE_REVERSE_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e [...]
+# define BOOST_PP_TUPLE_REVERSE_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e [...]
+# define BOOST_PP_TUPLE_REVERSE_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e63, e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e [...]
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/size.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/size.hpp
new file mode 100644
index 0000000..675c065
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/size.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_SIZE_HPP
+# define BOOST_PREPROCESSOR_TUPLE_SIZE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE tuple,)
+#    else
+#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_VARIADIC_SIZE tuple
+#    endif
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/to_array.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/to_array.hpp
new file mode 100644
index 0000000..1b994f3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/to_array.hpp
@@ -0,0 +1,37 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_TO_ARRAY_HPP
+# define BOOST_PREPROCESSOR_TUPLE_TO_ARRAY_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+#
+# /* BOOST_PP_TUPLE_TO_ARRAY */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_ARRAY_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_TO_ARRAY_I(m, args) BOOST_PP_TUPLE_TO_ARRAY_II(m, args)
+#        define BOOST_PP_TUPLE_TO_ARRAY_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_TO_ARRAY(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_ARRAY_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_TO_ARRAY_1(tuple) (BOOST_PP_VARIADIC_SIZE tuple, tuple)
+#    define BOOST_PP_TUPLE_TO_ARRAY_2(size, tuple) (size, tuple)
+# else
+#    define BOOST_PP_TUPLE_TO_ARRAY(size, tuple) (size, tuple)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/to_list.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/to_list.hpp
new file mode 100644
index 0000000..2a9d6fe
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/to_list.hpp
@@ -0,0 +1,116 @@
+# /* Copyright (C) 2001
+#  * Housemarque Oy
+#  * http://www.housemarque.com
+#  *
+#  * Distributed under the Boost Software License, Version 1.0. (See
+#  * accompanying file LICENSE_1_0.txt or copy at
+#  * http://www.boost.org/LICENSE_1_0.txt)
+#  */
+#
+# /* Revised by Paul Mensonides (2002-2011) */
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP
+# define BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+#
+# /* BOOST_PP_TUPLE_TO_LIST */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_TUPLE_TO_LIST_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_TO_LIST_I(m, args) BOOST_PP_TUPLE_TO_LIST_II(m, args)
+#        define BOOST_PP_TUPLE_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_TO_LIST_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_LIST_, BOOST_PP_VARIADIC_SIZE tuple) tuple
+#    define BOOST_PP_TUPLE_TO_LIST_O_2(size, tuple) BOOST_PP_TUPLE_TO_LIST_O_1(tuple)
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_I(size, tuple)
+#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s t
+#        else
+#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_II(BOOST_PP_TUPLE_TO_LIST_ ## s t)
+#            define BOOST_PP_TUPLE_TO_LIST_II(res) res
+#        endif
+#    else
+#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_OO((size, tuple))
+#        define BOOST_PP_TUPLE_TO_LIST_OO(par) BOOST_PP_TUPLE_TO_LIST_I ## par
+#        define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s ## t
+#    endif
+# endif
+#
+# define BOOST_PP_TUPLE_TO_LIST_1(e0) (e0, BOOST_PP_NIL)
+# define BOOST_PP_TUPLE_TO_LIST_2(e0, e1) (e0, (e1, BOOST_PP_NIL))
+# define BOOST_PP_TUPLE_TO_LIST_3(e0, e1, e2) (e0, (e1, (e2, BOOST_PP_NIL)))
+# define BOOST_PP_TUPLE_TO_LIST_4(e0, e1, e2, e3) (e0, (e1, (e2, (e3, BOOST_PP_NIL))))
+# define BOOST_PP_TUPLE_TO_LIST_5(e0, e1, e2, e3, e4) (e0, (e1, (e2, (e3, (e4, BOOST_PP_NIL)))))
+# define BOOST_PP_TUPLE_TO_LIST_6(e0, e1, e2, e3, e4, e5) (e0, (e1, (e2, (e3, (e4, (e5, BOOST_PP_NIL))))))
+# define BOOST_PP_TUPLE_TO_LIST_7(e0, e1, e2, e3, e4, e5, e6) (e0, (e1, (e2, (e3, (e4, (e5, (e6, BOOST_PP_NIL)))))))
+# define BOOST_PP_TUPLE_TO_LIST_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, BOOST_PP_NIL))))))))
+# define BOOST_PP_TUPLE_TO_LIST_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, BOOST_PP_NIL)))))))))
+# define BOOST_PP_TUPLE_TO_LIST_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, BOOST_PP_NIL))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, BOOST_PP_NIL)))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, BOOST_PP_NIL))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, BOOST_PP_NIL)))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, BOOST_PP_NIL))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, BOOST_PP_NIL)))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, BOOST_PP_NIL))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, BOOST_PP_NIL)))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, BOOST_PP_NIL))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, BOOST_PP_NIL)))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, BOOST_PP_NIL))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, BOOST_PP_NIL)))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, BOOST_PP_NIL))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, BOOST_PP_NIL)))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, BOOST_PP_NIL))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, BOOST_PP_NIL)))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, BOOST_PP_NIL))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, BOOST_PP_NIL)))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, BOOST_PP_NIL))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, BOOST_PP_NIL)))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, BOOST_PP_NIL))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, BOOST_PP_NIL)))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, BOOST_PP_NIL))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, BOOST_PP_NIL)))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, BOOST_PP_NIL))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))
+# define BOOST_PP_TUPLE_TO_LIST_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, BOOST_PP_NIL))))))))))))))))))))))))) [...]
+# define BOOST_PP_TUPLE_TO_LIST_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, BOOST_PP_NIL)))))))))))))) [...]
+# define BOOST_PP_TUPLE_TO_LIST_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, BOOST_PP_NIL))) [...]
+# define BOOST_PP_TUPLE_TO_LIST_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, BOOS [...]
+# define BOOST_PP_TUPLE_TO_LIST_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, [...]
+# define BOOST_PP_TUPLE_TO_LIST_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41,  [...]
+# define BOOST_PP_TUPLE_TO_LIST_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, ( [...]
+# define BOOST_PP_TUPLE_TO_LIST_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e [...]
+# define BOOST_PP_TUPLE_TO_LIST_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e3 [...]
+# define BOOST_PP_TUPLE_TO_LIST_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38 [...]
+# define BOOST_PP_TUPLE_TO_LIST_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, [...]
+# define BOOST_PP_TUPLE_TO_LIST_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36,  [...]
+# define BOOST_PP_TUPLE_TO_LIST_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, ( [...]
+# define BOOST_PP_TUPLE_TO_LIST_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e [...]
+# define BOOST_PP_TUPLE_TO_LIST_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e3 [...]
+# define BOOST_PP_TUPLE_TO_LIST_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33 [...]
+# define BOOST_PP_TUPLE_TO_LIST_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, [...]
+# define BOOST_PP_TUPLE_TO_LIST_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31,  [...]
+# define BOOST_PP_TUPLE_TO_LIST_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, ( [...]
+# define BOOST_PP_TUPLE_TO_LIST_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e [...]
+# define BOOST_PP_TUPLE_TO_LIST_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e2 [...]
+# define BOOST_PP_TUPLE_TO_LIST_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28 [...]
+# define BOOST_PP_TUPLE_TO_LIST_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, [...]
+# define BOOST_PP_TUPLE_TO_LIST_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26,  [...]
+# define BOOST_PP_TUPLE_TO_LIST_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, ( [...]
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/tuple/to_seq.hpp b/gatb-core/thirdparty/boost/preprocessor/tuple/to_seq.hpp
new file mode 100644
index 0000000..1fb7b81
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/tuple/to_seq.hpp
@@ -0,0 +1,114 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002-2011.                             *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_TO_SEQ_HPP
+# define BOOST_PREPROCESSOR_TUPLE_TO_SEQ_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/facilities/overload.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+#
+# /* BOOST_PP_TUPLE_TO_SEQ */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_TUPLE_TO_SEQ(...) BOOST_PP_TUPLE_TO_SEQ_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_SEQ_O_, __VA_ARGS__), (__VA_ARGS__))
+#        define BOOST_PP_TUPLE_TO_SEQ_I(m, args) BOOST_PP_TUPLE_TO_SEQ_II(m, args)
+#        define BOOST_PP_TUPLE_TO_SEQ_II(m, args) BOOST_PP_CAT(m ## args,)
+#    else
+#        define BOOST_PP_TUPLE_TO_SEQ(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_SEQ_O_, __VA_ARGS__)(__VA_ARGS__)
+#    endif
+#    define BOOST_PP_TUPLE_TO_SEQ_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_SEQ_, BOOST_PP_VARIADIC_SIZE tuple) tuple
+#    define BOOST_PP_TUPLE_TO_SEQ_O_2(size, tuple) BOOST_PP_TUPLE_TO_SEQ_O_1(tuple)
+# else
+#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#        define BOOST_PP_TUPLE_TO_SEQ(size, tuple) BOOST_PP_TUPLE_TO_SEQ_I(size, tuple)
+#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#            define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_ ## s t
+#        else
+#            define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_II(BOOST_PP_TUPLE_TO_SEQ_ ## s t)
+#            define BOOST_PP_TUPLE_TO_SEQ_II(res) res
+#        endif
+#    else
+#        define BOOST_PP_TUPLE_TO_SEQ(size, tuple) BOOST_PP_TUPLE_TO_SEQ_OO((size, tuple))
+#        define BOOST_PP_TUPLE_TO_SEQ_OO(par) BOOST_PP_TUPLE_TO_SEQ_I ## par
+#        define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_ ## s ## t
+#    endif
+# endif
+#
+# define BOOST_PP_TUPLE_TO_SEQ_1(e0) (e0)
+# define BOOST_PP_TUPLE_TO_SEQ_2(e0, e1) (e0)(e1)
+# define BOOST_PP_TUPLE_TO_SEQ_3(e0, e1, e2) (e0)(e1)(e2)
+# define BOOST_PP_TUPLE_TO_SEQ_4(e0, e1, e2, e3) (e0)(e1)(e2)(e3)
+# define BOOST_PP_TUPLE_TO_SEQ_5(e0, e1, e2, e3, e4) (e0)(e1)(e2)(e3)(e4)
+# define BOOST_PP_TUPLE_TO_SEQ_6(e0, e1, e2, e3, e4, e5) (e0)(e1)(e2)(e3)(e4)(e5)
+# define BOOST_PP_TUPLE_TO_SEQ_7(e0, e1, e2, e3, e4, e5, e6) (e0)(e1)(e2)(e3)(e4)(e5)(e6)
+# define BOOST_PP_TUPLE_TO_SEQ_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)
+# define BOOST_PP_TUPLE_TO_SEQ_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)
+# define BOOST_PP_TUPLE_TO_SEQ_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)
+# define BOOST_PP_TUPLE_TO_SEQ_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)
+# define BOOST_PP_TUPLE_TO_SEQ_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)
+# define BOOST_PP_TUPLE_TO_SEQ_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)
+# define BOOST_PP_TUPLE_TO_SEQ_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)
+# define BOOST_PP_TUPLE_TO_SEQ_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)
+# define BOOST_PP_TUPLE_TO_SEQ_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)
+# define BOOST_PP_TUPLE_TO_SEQ_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)
+# define BOOST_PP_TUPLE_TO_SEQ_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)
+# define BOOST_PP_TUPLE_TO_SEQ_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)
+# define BOOST_PP_TUPLE_TO_SEQ_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)
+# define BOOST_PP_TUPLE_TO_SEQ_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)
+# define BOOST_PP_TUPLE_TO_SEQ_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)
+# define BOOST_PP_TUPLE_TO_SEQ_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)
+# define BOOST_PP_TUPLE_TO_SEQ_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)
+# define BOOST_PP_TUPLE_TO_SEQ_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)
+# define BOOST_PP_TUPLE_TO_SEQ_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)
+# define BOOST_PP_TUPLE_TO_SEQ_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)
+# define BOOST_PP_TUPLE_TO_SEQ_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)
+# define BOOST_PP_TUPLE_TO_SEQ_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)
+# define BOOST_PP_TUPLE_TO_SEQ_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)
+# define BOOST_PP_TUPLE_TO_SEQ_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)
+# define BOOST_PP_TUPLE_TO_SEQ_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)
+# define BOOST_PP_TUPLE_TO_SEQ_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)
+# define BOOST_PP_TUPLE_TO_SEQ_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)
+# define BOOST_PP_TUPLE_TO_SEQ_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)
+# define BOOST_PP_TUPLE_TO_SEQ_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)
+# define BOOST_PP_TUPLE_TO_SEQ_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)
+# define BOOST_PP_TUPLE_TO_SEQ_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)
+# define BOOST_PP_TUPLE_TO_SEQ_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)
+# define BOOST_PP_TUPLE_TO_SEQ_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)
+# define BOOST_PP_TUPLE_TO_SEQ_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)
+# define BOOST_PP_TUPLE_TO_SEQ_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)
+# define BOOST_PP_TUPLE_TO_SEQ_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)
+# define BOOST_PP_TUPLE_TO_SEQ_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)
+# define BOOST_PP_TUPLE_TO_SEQ_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)
+# define BOOST_PP_TUPLE_TO_SEQ_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)
+# define BOOST_PP_TUPLE_TO_SEQ_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)
+# define BOOST_PP_TUPLE_TO_SEQ_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)
+# define BOOST_PP_TUPLE_TO_SEQ_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e4 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e3 [...]
+# define BOOST_PP_TUPLE_TO_SEQ_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e3 [...]
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic.hpp
new file mode 100644
index 0000000..a28e026
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic.hpp
@@ -0,0 +1,23 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_HPP
+#
+# include <boost/preprocessor/variadic/elem.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+# include <boost/preprocessor/variadic/to_array.hpp>
+# include <boost/preprocessor/variadic/to_list.hpp>
+# include <boost/preprocessor/variadic/to_seq.hpp>
+# include <boost/preprocessor/variadic/to_tuple.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/elem.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/elem.hpp
new file mode 100644
index 0000000..be38a94
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/elem.hpp
@@ -0,0 +1,94 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_VARIADIC_ELEM */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_VARIADIC_ELEM_I(n,__VA_ARGS__)
+#        define BOOST_PP_VARIADIC_ELEM_I(n, ...) BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,),)
+#    else
+#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,)
+#    endif
+#    define BOOST_PP_VARIADIC_ELEM_0(e0, ...) e0
+#    define BOOST_PP_VARIADIC_ELEM_1(e0, e1, ...) e1
+#    define BOOST_PP_VARIADIC_ELEM_2(e0, e1, e2, ...) e2
+#    define BOOST_PP_VARIADIC_ELEM_3(e0, e1, e2, e3, ...) e3
+#    define BOOST_PP_VARIADIC_ELEM_4(e0, e1, e2, e3, e4, ...) e4
+#    define BOOST_PP_VARIADIC_ELEM_5(e0, e1, e2, e3, e4, e5, ...) e5
+#    define BOOST_PP_VARIADIC_ELEM_6(e0, e1, e2, e3, e4, e5, e6, ...) e6
+#    define BOOST_PP_VARIADIC_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, ...) e7
+#    define BOOST_PP_VARIADIC_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, ...) e8
+#    define BOOST_PP_VARIADIC_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ...) e9
+#    define BOOST_PP_VARIADIC_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ...) e10
+#    define BOOST_PP_VARIADIC_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ...) e11
+#    define BOOST_PP_VARIADIC_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ...) e12
+#    define BOOST_PP_VARIADIC_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ...) e13
+#    define BOOST_PP_VARIADIC_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ...) e14
+#    define BOOST_PP_VARIADIC_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ...) e15
+#    define BOOST_PP_VARIADIC_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ...) e16
+#    define BOOST_PP_VARIADIC_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ...) e17
+#    define BOOST_PP_VARIADIC_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ...) e18
+#    define BOOST_PP_VARIADIC_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ...) e19
+#    define BOOST_PP_VARIADIC_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ...) e20
+#    define BOOST_PP_VARIADIC_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ...) e21
+#    define BOOST_PP_VARIADIC_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ...) e22
+#    define BOOST_PP_VARIADIC_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ...) e23
+#    define BOOST_PP_VARIADIC_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ...) e24
+#    define BOOST_PP_VARIADIC_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ...) e25
+#    define BOOST_PP_VARIADIC_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ...) e26
+#    define BOOST_PP_VARIADIC_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ...) e27
+#    define BOOST_PP_VARIADIC_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ...) e28
+#    define BOOST_PP_VARIADIC_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ...) e29
+#    define BOOST_PP_VARIADIC_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ...) e30
+#    define BOOST_PP_VARIADIC_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ...) e31
+#    define BOOST_PP_VARIADIC_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ...) e32
+#    define BOOST_PP_VARIADIC_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ...) e33
+#    define BOOST_PP_VARIADIC_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ...) e34
+#    define BOOST_PP_VARIADIC_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ...) e35
+#    define BOOST_PP_VARIADIC_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ...) e36
+#    define BOOST_PP_VARIADIC_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ...) e37
+#    define BOOST_PP_VARIADIC_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ...) e38
+#    define BOOST_PP_VARIADIC_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ...) e39
+#    define BOOST_PP_VARIADIC_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ...) e40
+#    define BOOST_PP_VARIADIC_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ...) e41
+#    define BOOST_PP_VARIADIC_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ...) e42
+#    define BOOST_PP_VARIADIC_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ...) e43
+#    define BOOST_PP_VARIADIC_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ...) e44
+#    define BOOST_PP_VARIADIC_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ...) e45
+#    define BOOST_PP_VARIADIC_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ...) e46
+#    define BOOST_PP_VARIADIC_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ...) e47
+#    define BOOST_PP_VARIADIC_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ...) e48
+#    define BOOST_PP_VARIADIC_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ...) e49
+#    define BOOST_PP_VARIADIC_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ...) e50
+#    define BOOST_PP_VARIADIC_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ...) e51
+#    define BOOST_PP_VARIADIC_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ...) e52
+#    define BOOST_PP_VARIADIC_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ...) e53
+#    define BOOST_PP_VARIADIC_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ...) e54
+#    define BOOST_PP_VARIADIC_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ...) e55
+#    define BOOST_PP_VARIADIC_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ...) e56
+#    define BOOST_PP_VARIADIC_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ...) e57
+#    define BOOST_PP_VARIADIC_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ...) e58
+#    define BOOST_PP_VARIADIC_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ...) e59
+#    define BOOST_PP_VARIADIC_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ...) e60
+#    define BOOST_PP_VARIADIC_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ...) e61
+#    define BOOST_PP_VARIADIC_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ...) e62
+#    define BOOST_PP_VARIADIC_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, ...) e63
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/size.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/size.hpp
new file mode 100644
index 0000000..b92a5ff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/size.hpp
@@ -0,0 +1,30 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_VARIADIC_SIZE */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)
+#    else
+#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,)
+#    endif
+#    define BOOST_PP_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/to_array.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/to_array.hpp
new file mode 100644
index 0000000..14c2b92
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/to_array.hpp
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_ARRAY_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_TO_ARRAY_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+# if BOOST_PP_VARIADICS_MSVC
+#    include <boost/preprocessor/variadic/size.hpp>
+# endif
+#
+# /* BOOST_PP_VARIADIC_TO_ARRAY */
+#
+# if BOOST_PP_VARIADICS
+#    if BOOST_PP_VARIADICS_MSVC
+#        define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY_2(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),(__VA_ARGS__))
+#    else
+#        define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY((__VA_ARGS__))
+#    endif
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/to_list.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/to_list.hpp
new file mode 100644
index 0000000..43d526a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/to_list.hpp
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_LIST_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_TO_LIST_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/to_list.hpp>
+#
+# /* BOOST_PP_VARIADIC_TO_LIST */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADIC_TO_LIST(...) BOOST_PP_TUPLE_TO_LIST((__VA_ARGS__))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/to_seq.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/to_seq.hpp
new file mode 100644
index 0000000..255af4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/to_seq.hpp
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_SEQ_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_TO_SEQ_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/to_seq.hpp>
+#
+# /* BOOST_PP_VARIADIC_TO_SEQ */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADIC_TO_SEQ(...) BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/variadic/to_tuple.hpp b/gatb-core/thirdparty/boost/preprocessor/variadic/to_tuple.hpp
new file mode 100644
index 0000000..ddb6d8b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/variadic/to_tuple.hpp
@@ -0,0 +1,24 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2011.                                    *
+#  *     (C) Copyright Paul Mensonides 2011.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_TUPLE_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_TO_TUPLE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_VARIADIC_TO_TUPLE */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADIC_TO_TUPLE(...) (__VA_ARGS__)
+# endif
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/while.hpp b/gatb-core/thirdparty/boost/preprocessor/while.hpp
new file mode 100644
index 0000000..4b9c801
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/while.hpp
@@ -0,0 +1,17 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_WHILE_HPP
+# define BOOST_PREPROCESSOR_WHILE_HPP
+#
+# include <boost/preprocessor/control/while.hpp>
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/preprocessor/wstringize.hpp b/gatb-core/thirdparty/boost/preprocessor/wstringize.hpp
new file mode 100644
index 0000000..5d1a83a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/preprocessor/wstringize.hpp
@@ -0,0 +1,29 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2002.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_WSTRINGIZE_HPP
+# define BOOST_PREPROCESSOR_WSTRINGIZE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_WSTRINGIZE */
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+#    define BOOST_PP_WSTRINGIZE(text) BOOST_PP_WSTRINGIZE_I(text)
+# else
+#    define BOOST_PP_WSTRINGIZE(text) BOOST_PP_WSTRINGIZE_OO((text))
+#    define BOOST_PP_WSTRINGIZE_OO(par) BOOST_PP_WSTRINGIZE_I ## par
+# endif
+#
+# define BOOST_PP_WSTRINGIZE_I(text) BOOST_PP_WSTRINGIZE_II(#text)
+# define BOOST_PP_WSTRINGIZE_II(str) L ## str
+#
+# endif
diff --git a/gatb-core/thirdparty/boost/ref.hpp b/gatb-core/thirdparty/boost/ref.hpp
new file mode 100644
index 0000000..17b56ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/ref.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_REF_HPP
+#define BOOST_REF_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/ref.hpp instead.
+
+#include <boost/core/ref.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/static_assert.hpp b/gatb-core/thirdparty/boost/static_assert.hpp
new file mode 100644
index 0000000..d083a9c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/static_assert.hpp
@@ -0,0 +1,195 @@
+//  (C) Copyright John Maddock 2000.
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/static_assert for documentation.
+
+/*
+ Revision history:
+   02 August 2000
+      Initial version.
+*/
+
+#ifndef BOOST_STATIC_ASSERT_HPP
+#define BOOST_STATIC_ASSERT_HPP
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
+//
+// This is horrible, but it seems to be the only we can shut up the
+// "anonymous variadic macros were introduced in C99 [-Wvariadic-macros]"
+// warning that get spewed out otherwise in non-C++11 mode.
+//
+#pragma GCC system_header
+#endif
+
+#ifndef BOOST_NO_CXX11_STATIC_ASSERT
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#     define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
+#  else
+#     define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
+#  endif
+#else
+#     define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
+#endif
+
+#ifdef __BORLANDC__
+//
+// workaround for buggy integral-constant expression support:
+#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))
+// gcc 3.3 and 3.4 don't produce good error messages with the default version:
+#  define BOOST_SA_GCC_WORKAROUND
+#endif
+
+//
+// If the compiler issues warnings about old C style casts,
+// then enable this:
+//
+#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) ((__VA_ARGS__) == 0 ? false : true)
+#  else
+#     define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) == 0 ? false : true)
+#  endif
+#else
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) (bool)(__VA_ARGS__)
+#  else
+#     define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
+#  endif
+#endif
+//
+// If the compiler warns about unused typedefs then enable this:
+//
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
+#  define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
+#else
+#  define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+#endif
+
+#ifndef BOOST_NO_CXX11_STATIC_ASSERT
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#     define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
+#  else
+#     define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
+#  endif
+#else
+
+namespace boost{
+
+// HP aCC cannot deal with missing names for template value parameters
+template <bool x> struct STATIC_ASSERTION_FAILURE;
+
+template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
+
+// HP aCC cannot deal with missing names for template value parameters
+template<int x> struct static_assert_test{};
+
+}
+
+//
+// Implicit instantiation requires that all member declarations be
+// instantiated, but that the definitions are *not* instantiated.
+//
+// It's not particularly clear how this applies to enum's or typedefs;
+// both are described as declarations [7.1.3] and [7.2] in the standard,
+// however some compilers use "delayed evaluation" of one or more of
+// these when implicitly instantiating templates.  We use typedef declarations
+// by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum
+// version gets better results from your compiler...
+//
+// Implementation:
+// Both of these versions rely on sizeof(incomplete_type) generating an error
+// message containing the name of the incomplete type.  We use
+// "STATIC_ASSERTION_FAILURE" as the type name here to generate
+// an eye catching error message.  The result of the sizeof expression is either
+// used as an enum initialiser, or as a template argument depending which version
+// is in use...
+// Note that the argument to the assert is explicitly cast to bool using old-
+// style casts: too many compilers currently have problems with static_cast
+// when used inside integral constant expressions.
+//
+#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
+// __LINE__ macro broken when -ZI is used see Q199057
+// fortunately MSVC ignores duplicate typedef's.
+#define BOOST_STATIC_ASSERT( B ) \
+   typedef ::boost::static_assert_test<\
+      sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\
+      > boost_static_assert_typedef_
+#elif defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
+#define BOOST_STATIC_ASSERT( B ) \
+   typedef ::boost::static_assert_test<\
+      sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
+         BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
+#elif defined(BOOST_MSVC)
+#define BOOST_STATIC_ASSERT(...) \
+   typedef ::boost::static_assert_test<\
+      sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST (__VA_ARGS__) >)>\
+         BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
+#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
+// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error 
+// instead of warning in case of failure
+# define BOOST_STATIC_ASSERT( B ) \
+    typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
+        [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]
+#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && !defined(BOOST_NO_CXX11_VARIADIC_MACROS)
+// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error 
+// instead of warning in case of failure
+# define BOOST_STATIC_ASSERT(...) \
+    typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
+        [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >::value ]
+#elif defined(__sgi)
+// special version for SGI MIPSpro compiler
+#define BOOST_STATIC_ASSERT( B ) \
+   BOOST_STATIC_CONSTANT(bool, \
+     BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \
+   typedef ::boost::static_assert_test<\
+     sizeof(::boost::STATIC_ASSERTION_FAILURE< \
+       BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\
+         BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
+#elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
+// special version for CodeWarrior <= 8.x
+#define BOOST_STATIC_ASSERT( B ) \
+   BOOST_STATIC_CONSTANT(int, \
+     BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
+       sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )
+#else
+// generic version
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#     define BOOST_STATIC_ASSERT( ... ) \
+         typedef ::boost::static_assert_test<\
+            sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >)>\
+               BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+#  else
+#     define BOOST_STATIC_ASSERT( B ) \
+         typedef ::boost::static_assert_test<\
+            sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
+               BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+#  endif
+#endif
+
+#else
+// alternative enum based implementation:
+#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+#    define BOOST_STATIC_ASSERT( ... ) \
+         enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
+            = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( __VA_ARGS__ ) >) }
+#  else
+#    define BOOST_STATIC_ASSERT(B) \
+         enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
+            = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
+#  endif
+#endif
+#endif // defined(BOOST_NO_CXX11_STATIC_ASSERT)
+
+#endif // BOOST_STATIC_ASSERT_HPP
+
+
diff --git a/gatb-core/thirdparty/boost/swap.hpp b/gatb-core/thirdparty/boost/swap.hpp
new file mode 100644
index 0000000..55cafa4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/swap.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_SWAP_HPP
+#define BOOST_SWAP_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/swap.hpp instead.
+
+#include <boost/core/swap.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/throw_exception.hpp b/gatb-core/thirdparty/boost/throw_exception.hpp
new file mode 100644
index 0000000..aa977df
--- /dev/null
+++ b/gatb-core/thirdparty/boost/throw_exception.hpp
@@ -0,0 +1,102 @@
+#ifndef UUID_AA15E74A856F11E08B8D93F24824019B
+#define UUID_AA15E74A856F11E08B8D93F24824019B
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/throw_exception.hpp
+//
+//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//  Copyright (c) 2008-2009 Emil Dotchevski and Reverge Studios, Inc.
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org/libs/utility/throw_exception.html
+//
+
+#include <boost/detail/workaround.hpp>
+#include <boost/config.hpp>
+#include <exception>
+
+#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x593) )
+# define BOOST_EXCEPTION_DISABLE
+#endif
+
+#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1310 )
+# define BOOST_EXCEPTION_DISABLE
+#endif
+
+#if !defined( BOOST_EXCEPTION_DISABLE )
+# include <boost/exception/exception.hpp>
+#if !defined(BOOST_THROW_EXCEPTION_CURRENT_FUNCTION)
+# include <boost/current_function.hpp>
+# define BOOST_THROW_EXCEPTION_CURRENT_FUNCTION BOOST_CURRENT_FUNCTION
+#endif
+# define BOOST_THROW_EXCEPTION(x) ::boost::exception_detail::throw_exception_(x,BOOST_THROW_EXCEPTION_CURRENT_FUNCTION,__FILE__,__LINE__)
+#else
+# define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x)
+#endif
+
+namespace boost
+{
+#ifdef BOOST_NO_EXCEPTIONS
+
+void throw_exception( std::exception const & e ); // user defined
+
+#else
+
+inline void throw_exception_assert_compatibility( std::exception const & ) { }
+
+template<class E> BOOST_NORETURN inline void throw_exception( E const & e )
+{
+    //All boost exceptions are required to derive from std::exception,
+    //to ensure compatibility with BOOST_NO_EXCEPTIONS.
+    throw_exception_assert_compatibility(e);
+
+#ifndef BOOST_EXCEPTION_DISABLE
+    throw enable_current_exception(enable_error_info(e));
+#else
+    throw e;
+#endif
+}
+
+#endif
+
+#if !defined( BOOST_EXCEPTION_DISABLE )
+    namespace
+    exception_detail
+    {
+        template <class E>
+        BOOST_NORETURN
+        void
+        throw_exception_( E const & x, char const * current_function, char const * file, int line )
+        {
+            boost::throw_exception(
+                set_info(
+                    set_info(
+                        set_info(
+                            enable_error_info(x),
+                            throw_function(current_function)),
+                        throw_file(file)),
+                    throw_line(line)));
+        }
+    }
+#endif
+} // namespace boost
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/gatb-core/thirdparty/boost/type_index.hpp b/gatb-core/thirdparty/boost/type_index.hpp
new file mode 100644
index 0000000..dce89d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index.hpp
@@ -0,0 +1,265 @@
+//
+// Copyright (c) Antony Polukhin, 2012-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_HPP
+
+/// \file boost/type_index.hpp
+/// \brief Includes minimal set of headers required to use the Boost.TypeIndex library.
+///
+/// By inclusion of this file most optimal type index classes will be included and used 
+/// as a boost::typeindex::type_index and boost::typeindex::type_info.
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+#if defined(BOOST_TYPE_INDEX_USER_TYPEINDEX)
+#   include BOOST_TYPE_INDEX_USER_TYPEINDEX
+#   ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#       pragma detect_mismatch( "boost__type_index__abi", "user defined type_index class is used: " BOOST_STRINGIZE(BOOST_TYPE_INDEX_USER_TYPEINDEX))
+#   endif
+#elif (!defined(BOOST_NO_RTTI) && !defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)) || defined(BOOST_MSVC)
+#   include <boost/type_index/stl_type_index.hpp>
+#   if defined(BOOST_NO_RTTI) || defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)
+#       include <boost/type_index/detail/stl_register_class.hpp>
+#       ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#           pragma detect_mismatch( "boost__type_index__abi", "RTTI is off - typeid() is used only for templates")
+#       endif
+#   else
+#       ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#           pragma detect_mismatch( "boost__type_index__abi", "RTTI is used")
+#       endif
+#   endif
+#else
+#   include <boost/type_index/ctti_type_index.hpp>
+#   include <boost/type_index/detail/ctti_register_class.hpp>
+#   ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#       pragma detect_mismatch( "boost__type_index__abi", "RTTI is off - using CTTI")
+#   endif
+#endif
+
+#ifndef BOOST_TYPE_INDEX_REGISTER_CLASS
+#define BOOST_TYPE_INDEX_REGISTER_CLASS
+#endif
+
+namespace boost { namespace typeindex {
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// \def BOOST_TYPE_INDEX_FUNCTION_SIGNATURE
+/// BOOST_TYPE_INDEX_FUNCTION_SIGNATURE is used by boost::typeindex::ctti_type_index class to
+/// deduce the name of a type. If your compiler is not recognized
+/// by the TypeIndex library and you wish to work with boost::typeindex::ctti_type_index, you may
+/// define this macro by yourself.
+///
+/// BOOST_TYPE_INDEX_FUNCTION_SIGNATURE must be defined to a compiler specific macro
+/// that outputs the \b whole function signature \b including \b template \b parameters.
+///
+/// If your compiler is not recognised and BOOST_TYPE_INDEX_FUNCTION_SIGNATURE is not defined,
+/// then a compile-time error will arise at any attempt to use boost::typeindex::ctti_type_index classes.
+///
+/// See BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS and BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
+/// for an information of how to tune the implementation to make a nice pretty_name() output.
+#define BOOST_TYPE_INDEX_FUNCTION_SIGNATURE BOOST_CURRENT_FUNCTION
+
+/// \def BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
+/// This is a helper macro for making correct pretty_names() with RTTI off.
+///
+/// BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING macro may be defined to
+/// '(begin_skip, end_skip, runtime_skip, runtime_skip_until)' with parameters for adding a
+/// support for compilers, that by default are not recognized by TypeIndex library.
+///
+/// \b Example:
+///
+/// Imagine the situation when
+/// \code boost::typeindex::ctti_type_index::type_id<int>().pretty_name() \endcode
+/// returns the following string:
+/// \code "static const char *boost::detail::ctti<int>::n() [T = int]" \endcode
+/// and \code boost::typeindex::ctti_type_index::type_id<short>().pretty_name() \endcode returns the following:
+/// \code "static const char *boost::detail::ctti<short>::n() [T = short]" \endcode
+///
+/// As we may see first 39 characters are "static const char *boost::detail::ctti<" and they do not depend on
+/// the type T. After first 39 characters we have a human readable type name which is duplicated at the end
+/// of a string. String always ends on ']', which consumes 1 character.
+///
+/// Now if we define `BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING` to
+/// `(39, 1, false, "")` we'll be getting \code "int>::n() [T = int" \endcode
+/// for `boost::typeindex::ctti_type_index::type_id<int>().pretty_name()` and \code "short>::n() [T = short" \endcode
+/// for `boost::typeindex::ctti_type_index::type_id<short>().pretty_name()`.
+///
+/// Now we need to take additional care of the characters that go before the last mention of our type. We'll
+/// do that by telling the macro that we need to cut off everything that goes before the "T = " including the "T = "
+/// itself:
+///
+/// \code (39, 1, true, "T = ") \endcode
+///
+/// In case of GCC or Clang command line we need to add the following line while compiling all the sources:
+///
+/// \code
+/// -DBOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING='(39, 1, true, "T = ")'
+/// \endcode
+/// \param begin_skip How many characters must be skipped at the beginning of the type holding string.
+/// Must be a compile time constant.
+/// \param end_skip How many characters must be skipped at the end of the type holding string.
+/// Must be a compile time constant.
+/// \param runtime_skip Do we need additional checks at runtime to cut off the more characters.
+/// Must be `true` or `false`.
+/// \param runtime_skip_until Skip all the characters before the following string (including the string itself).
+/// Must be a compile time array of characters.
+///
+/// See [RTTI emulation limitations](boost_typeindex/rtti_emulation_limitations.html) for more info.
+#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (0, 0, false, "")
+
+
+    /// Depending on a compiler flags, optimal implementation of type_index will be used 
+    /// as a default boost::typeindex::type_index.
+    ///
+    /// Could be a boost::typeindex::stl_type_index, boost::typeindex::ctti_type_index or 
+    /// user defined type_index class.
+    ///
+    /// \b See boost::typeindex::type_index_facade for a full description of type_index functions.
+    typedef platform_specific type_index;
+#elif defined(BOOST_TYPE_INDEX_USER_TYPEINDEX)
+    // Nothing to do
+#elif (!defined(BOOST_NO_RTTI) && !defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)) || defined(BOOST_MSVC)
+    typedef boost::typeindex::stl_type_index type_index;
+#else 
+    typedef boost::typeindex::ctti_type_index type_index;
+#endif
+
+/// Depending on a compiler flags, optimal implementation of type_info will be used 
+/// as a default boost::typeindex::type_info.
+///
+/// Could be a std::type_info, boost::typeindex::detail::ctti_data or 
+/// some user defined class.
+///
+/// type_info \b is \b not copyable or default constructible. It is \b not assignable too!
+typedef type_index::type_info_t type_info;
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// \def BOOST_TYPE_INDEX_USER_TYPEINDEX
+/// BOOST_TYPE_INDEX_USER_TYPEINDEX can be defined to the path to header file
+/// with user provided implementation of type_index.
+///
+/// See [Making a custom type_index](boost_typeindex/making_a_custom_type_index.html) section
+/// of documentation for usage example.
+#define BOOST_TYPE_INDEX_USER_TYPEINDEX <full/absolute/path/to/header/with/type_index.hpp>
+
+
+/// \def BOOST_TYPE_INDEX_REGISTER_CLASS
+/// BOOST_TYPE_INDEX_REGISTER_CLASS is used to help to emulate RTTI.
+/// Put this macro into the public section of polymorphic class to allow runtime type detection.
+///
+/// Depending on the typeid() availability this macro will expand to nothing or to virtual helper function
+/// `virtual const type_info& boost_type_info_type_id_runtime_() const noexcept`.
+///
+/// \b Example:
+/// \code
+/// class A {
+/// public:
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+///     virtual ~A(){}
+/// };
+///
+/// struct B: public A {
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+/// };
+///
+/// struct C: public B {
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+/// };
+///
+/// ...
+///
+/// C c1;
+/// A* pc1 = &c1;
+/// assert(boost::typeindex::type_id<C>() == boost::typeindex::type_id_runtime(*pc1));
+/// \endcode
+#define BOOST_TYPE_INDEX_REGISTER_CLASS nothing-or-some-virtual-functions
+
+/// \def BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY
+/// BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY is a helper macro that must be defined if mixing
+/// RTTI on/off modules. See
+/// [Mixing sources with RTTI on and RTTI off](boost_typeindex/mixing_sources_with_rtti_on_and_.html)
+/// section of documentation for more info.
+#define BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY
+
+#endif // defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+
+/// Function to get boost::typeindex::type_index for a type T.
+/// Removes const, volatile && and & modifiers from T.
+///
+/// \b Example:
+/// \code
+/// type_index ti = type_id<int&>();
+/// std::cout << ti.pretty_name();  // Outputs 'int'
+/// \endcode
+///
+/// \tparam T Type for which type_index must be created.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified type T.
+template <class T>
+inline type_index type_id() BOOST_NOEXCEPT {
+    return type_index::type_id<T>();
+}
+
+/// Function for constructing boost::typeindex::type_index instance for type T. 
+/// Does not remove const, volatile, & and && modifiers from T.
+///
+/// If T has no const, volatile, & and && modifiers, then returns exactly 
+/// the same result as in case of calling `type_id<T>()`.
+///
+/// \b Example:
+/// \code
+/// type_index ti = type_id_with_cvr<int&>();
+/// std::cout << ti.pretty_name();  // Outputs 'int&'
+/// \endcode
+///
+/// \tparam T Type for which type_index must be created.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified type T.
+template <class T>
+inline type_index type_id_with_cvr() BOOST_NOEXCEPT {
+    return type_index::type_id_with_cvr<T>();
+}
+
+/// Function that works exactly like C++ typeid(rtti_val) call, but returns boost::type_index.
+///
+/// Retunrs runtime information about specified type.
+///
+/// \b Requirements: RTTI available or Base and Derived classes must be marked with BOOST_TYPE_INDEX_REGISTER_CLASS.
+///
+/// \b Example:
+/// \code
+/// struct Base { virtual ~Base(){} };
+/// struct Derived: public Base  {};
+/// ...
+/// Derived d;
+/// Base& b = d;
+/// type_index ti = type_id_runtime(b);
+/// std::cout << ti.pretty_name();  // Outputs 'Derived'
+/// \endcode
+///
+/// \param runtime_val Varaible which runtime type must be returned.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified variable.
+template <class T>
+inline type_index type_id_runtime(const T& runtime_val) BOOST_NOEXCEPT {
+    return type_index::type_id_runtime(runtime_val);
+}
+
+}} // namespace boost::typeindex
+
+
+
+#endif // BOOST_TYPE_INDEX_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_index/ctti_type_index.hpp b/gatb-core/thirdparty/boost/type_index/ctti_type_index.hpp
new file mode 100644
index 0000000..ac1e5d2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/ctti_type_index.hpp
@@ -0,0 +1,179 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+
+/// \file ctti_type_index.hpp
+/// \brief Contains boost::typeindex::ctti_type_index class.
+///
+/// boost::typeindex::ctti_type_index class can be used as a drop-in replacement 
+/// for std::type_index.
+///
+/// It is used in situations when typeid() method is not available or 
+/// BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY macro is defined.
+
+#include <boost/type_index/type_index_facade.hpp>
+#include <boost/type_index/detail/compile_time_type_info.hpp>
+
+#include <cstring>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex {
+
+namespace detail {
+
+// That's the most trickiest part of the TypeIndex library:
+//      1) we do not want to give user ability to manually construct and compare `struct-that-represents-type`
+//      2) we need to distinguish between `struct-that-represents-type` and `const char*`
+//      3) we need a thread-safe way to have references to instances `struct-that-represents-type`
+//      4) we need a compile-time control to make sure that user does not copy or
+// default construct `struct-that-represents-type`
+//
+// Solution would be the following:
+
+/// \class ctti_data
+/// Standard-layout class with private constructors and assignment operators.
+///
+/// You can not work with this class directly. The  purpose of this class is to hold type info 
+/// \b when \b RTTI \b is \b off and allow ctti_type_index construction from itself.
+///
+/// \b Example:
+/// \code
+/// const detail::ctti_data& foo();
+/// ...
+/// type_index ti = type_index(foo());
+/// std::cout << ti.pretty_name();
+/// \endcode
+class ctti_data {
+#ifndef BOOST_NO_CXX11_DELETED_FUNCTIONS
+public:
+    ctti_data() = delete;
+    ctti_data(const ctti_data&) = delete;
+    ctti_data& operator=(const ctti_data&) = delete;
+#else
+private:
+    ctti_data();
+    ctti_data(const ctti_data&);
+    ctti_data& operator=(const ctti_data&);
+#endif
+};
+
+} // namespace detail
+
+/// Helper method for getting detail::ctti_data of a template parameter T.
+template <class T>
+inline const detail::ctti_data& ctti_construct() BOOST_NOEXCEPT {
+    // Standard C++11, 5.2.10 Reinterpret cast:
+    // An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue
+    // v of type "pointer to T1" is converted to the type "pointer to cv T2", the result is static_cast<cv
+    // T2*>(static_cast<cv void*>(v)) if both T1 and T2 are standard-layout types (3.9) and the alignment
+    // requirements of T2 are no stricter than those of T1, or if either type is void. Converting a prvalue of type
+    // "pointer to T1" to the type "pointer to T2" (where T1 and T2 are object types and where the alignment
+    // requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer
+    // value.
+    //
+    // Alignments are checked in `type_index_test_ctti_alignment.cpp` test.
+    return *reinterpret_cast<const detail::ctti_data*>(boost::detail::ctti<T>::n());
+}
+
+/// \class ctti_type_index
+/// This class is a wrapper that pretends to work exactly like stl_type_index, but does 
+/// not require RTTI support. \b For \b description \b of \b functions \b see type_index_facade.
+///
+/// This class produces slightly longer type names, so consider using stl_type_index 
+/// in situations when typeid() is working.
+class ctti_type_index: public type_index_facade<ctti_type_index, detail::ctti_data> {
+    const detail::ctti_data* data_;
+
+    inline std::size_t get_raw_name_length() const BOOST_NOEXCEPT;
+
+public:
+    typedef detail::ctti_data type_info_t;
+
+    inline ctti_type_index() BOOST_NOEXCEPT
+        : data_(&ctti_construct<void>())
+    {}
+
+    inline ctti_type_index(const type_info_t& data) BOOST_NOEXCEPT
+        : data_(&data)
+    {}
+
+    inline const type_info_t&  type_info() const BOOST_NOEXCEPT;
+    inline const char*  raw_name() const BOOST_NOEXCEPT;
+    inline std::string  pretty_name() const;
+    inline std::size_t  hash_code() const BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id_with_cvr() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id_runtime(const T& variable) BOOST_NOEXCEPT;
+};
+
+
+inline const ctti_type_index::type_info_t& ctti_type_index::type_info() const BOOST_NOEXCEPT {
+    return *data_;
+}
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type no_ref_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_cv<no_ref_t>::type no_cvr_t;
+    return ctti_construct<no_cvr_t>();
+}
+
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id_with_cvr() BOOST_NOEXCEPT {
+    return ctti_construct<T>();
+}
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id_runtime(const T& variable) BOOST_NOEXCEPT {
+    return variable.boost_type_index_type_id_runtime_();
+}
+
+
+inline const char* ctti_type_index::raw_name() const BOOST_NOEXCEPT {
+    return reinterpret_cast<const char*>(data_);
+}
+
+inline std::size_t ctti_type_index::get_raw_name_length() const BOOST_NOEXCEPT {
+    return std::strlen(raw_name() + detail::ctti_skip_size_at_end);
+}
+
+
+inline std::string ctti_type_index::pretty_name() const {
+    std::size_t len = get_raw_name_length();
+    while (raw_name()[len - 1] == ' ') --len; // MSVC sometimes adds whitespaces
+    return std::string(raw_name(), len);
+}
+
+
+inline std::size_t ctti_type_index::hash_code() const BOOST_NOEXCEPT {
+    return boost::hash_range(raw_name(), raw_name() + get_raw_name_length());
+}
+
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_index/detail/compile_time_type_info.hpp b/gatb-core/thirdparty/boost/type_index/detail/compile_time_type_info.hpp
new file mode 100644
index 0000000..635b45d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/detail/compile_time_type_info.hpp
@@ -0,0 +1,144 @@
+//
+// Copyright (c) Antony Polukhin, 2012-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+#define BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+
+/// \file compile_time_type_info.hpp
+/// \brief Contains helper macros and implementation details of boost::typeindex::ctti_type_index.
+/// Not intended for inclusion from user's code. 
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/bool.hpp>
+#include <algorithm>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(begin_skip, end_skip, runtime_skip, runtime_skip_until)   \
+    namespace boost { namespace typeindex { namespace detail {                                                  \
+        BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_begin  = begin_skip;                               \
+        BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_end    = end_skip;                                 \
+        BOOST_STATIC_CONSTEXPR bool ctti_skip_more_at_runtime       = runtime_skip;                             \
+        BOOST_STATIC_CONSTEXPR char ctti_skip_until_runtime[]       = runtime_skip_until;                       \
+    }}} /* namespace boost::typeindex::detail */                                                                \
+    /**/  
+/// @endcond
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+    /* Nothing to document. All the macro docs are moved to <boost/type_index.hpp> */
+#elif defined(BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING)
+
+#   include <boost/preprocessor/facilities/expand.hpp>
+    BOOST_PP_EXPAND( BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING )
+
+#elif defined(_MSC_VER)
+    // sizeof("const char *__cdecl boost::detail::ctti<") - 1, sizeof(">::n(void)") - 1
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 10, false, "")
+#elif defined(__clang__) && defined(__APPLE__)
+    // Someone made __clang_major__ equal to LLVM version rather than compiler version
+    // on APPLE platform.
+    //
+    // Using less efficient solution because there is no good way to detect real version of Clang.
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "???????????>::n() [T = int"
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ")
+#elif defined(__clang__) && (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ == 0))
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof(">::n()") - 1
+    // note: checked on 3.0
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 6, false, "")
+#elif defined(__clang__) && __clang_major__ == 3 && __clang_minor__ > 0
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "int>::n() [T = int"
+    // note: checked on 3.1, 3.4
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ")
+#elif defined(__GNUC__)
+    // sizeof("static const char* boost::detail::ctti<T>::n() [with T = ") - 1, sizeof("]") - 1
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "")
+#else
+    // Deafult code for other platforms... Just skip nothing!
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(0, 0, false, "")
+#endif
+
+#undef BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS
+
+namespace boost { namespace typeindex { namespace detail { 
+    template <bool Condition>
+    inline void assert_compile_time_legths() BOOST_NOEXCEPT {
+        BOOST_STATIC_ASSERT_MSG(
+            Condition,
+            "TypeIndex library is misconfigured for your compiler. "
+            "Please define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct values. See section "
+            "'RTTI emulation limitations' of the documentation for more information."
+        );
+    }
+    
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining_runtime(const char* begin, boost::mpl::false_) BOOST_NOEXCEPT {
+        return begin;
+    }
+
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining_runtime(const char* begin, boost::mpl::true_) BOOST_NOEXCEPT {
+        const char* const it = std::search(
+            begin, begin + ArrayLength,
+            ctti_skip_until_runtime, ctti_skip_until_runtime + sizeof(ctti_skip_until_runtime) - 1
+        );
+        return (it == begin + ArrayLength ? begin : it + sizeof(ctti_skip_until_runtime) - 1);
+    }
+
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining(const char* begin) BOOST_NOEXCEPT {
+        assert_compile_time_legths<(ArrayLength > ctti_skip_size_at_begin + ctti_skip_size_at_end)>();
+        return skip_begining_runtime<ArrayLength - ctti_skip_size_at_begin>(
+            begin + ctti_skip_size_at_begin, 
+            boost::mpl::bool_<ctti_skip_more_at_runtime>()
+        );
+    }
+}}} // namespace boost::typeindex::detail
+
+namespace boost { namespace detail {
+
+/// Noncopyable type_info that does not require RTTI.
+/// CTTI == Compile Time Type Info.
+/// This name must be as short as possible, to avoid code bloat
+template <class T>
+struct ctti {
+
+    /// Returns raw name. Must be as short, as possible, to avoid code bloat
+    static const char* n() BOOST_NOEXCEPT {
+    #if defined(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE)
+        return boost::typeindex::detail::skip_begining< sizeof(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE >(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE);
+    #elif defined(__FUNCSIG__)
+        return boost::typeindex::detail::skip_begining< sizeof(__FUNCSIG__) >(__FUNCSIG__);
+    #elif defined(__PRETTY_FUNCTION__) \
+                || defined(__GNUC__) \
+                || (defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)) \
+                || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) \
+                || (defined(__ICC) && (__ICC >= 600)) \
+                || defined(__ghs__) \
+                || defined(__DMC__)
+
+        return boost::typeindex::detail::skip_begining< sizeof(__PRETTY_FUNCTION__) >(__PRETTY_FUNCTION__);
+    #else
+        BOOST_STATIC_ASSERT_MSG(
+            sizeof(T) && false,
+            "TypeIndex library could not detect your compiler. "
+            "Please make the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro use "
+            "correct compiler macro for getting the whole function name. "
+            "Define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct value after that."
+        );
+    #endif
+    }
+};
+
+}} // namespace boost::detail
+
+#endif // BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_index/detail/ctti_register_class.hpp b/gatb-core/thirdparty/boost/type_index/detail/ctti_register_class.hpp
new file mode 100644
index 0000000..a8cef2c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/detail/ctti_register_class.hpp
@@ -0,0 +1,40 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+#define BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+
+/// \file ctti_register_class.hpp
+/// \brief Contains BOOST_TYPE_INDEX_REGISTER_CLASS macro implementation that uses boost::typeindex::ctti_type_index.
+/// Not intended for inclusion from user's code.
+
+#include <boost/type_index/ctti_type_index.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex { namespace detail {
+
+template <class T>
+inline const ctti_data& ctti_construct_typeid_ref(const T*) BOOST_NOEXCEPT {
+    return ctti_construct<T>();
+}
+
+}}} // namespace boost::typeindex::detail
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CLASS                                                                             \
+    virtual const boost::typeindex::detail::ctti_data& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT {   \
+        return boost::typeindex::detail::ctti_construct_typeid_ref(this);                                           \
+    }                                                                                                               \
+/**/
+/// @endcond
+
+#endif // BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_index/detail/stl_register_class.hpp b/gatb-core/thirdparty/boost/type_index/detail/stl_register_class.hpp
new file mode 100644
index 0000000..95a26f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/detail/stl_register_class.hpp
@@ -0,0 +1,40 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+#define BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+
+/// \file stl_register_class.hpp
+/// \brief Contains BOOST_TYPE_INDEX_REGISTER_CLASS macro implementation that uses boost::typeindex::stl_type_index.
+/// Not intended for inclusion from user's code.
+
+#include <boost/type_index/stl_type_index.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex { namespace detail {
+
+template <class T>
+inline const stl_type_index::type_info_t& stl_construct_typeid_ref(const T*) BOOST_NOEXCEPT {
+    return typeid(T);
+}
+
+}}} // namespace boost::typeindex::detail
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CLASS                                                                                     \
+    virtual const boost::typeindex::stl_type_index::type_info_t& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT { \
+        return boost::typeindex::detail::stl_construct_typeid_ref(this);                                                    \
+    }                                                                                                                       \
+/**/
+/// @endcond
+
+#endif // BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_index/stl_type_index.hpp b/gatb-core/thirdparty/boost/type_index/stl_type_index.hpp
new file mode 100644
index 0000000..c801e70
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/stl_type_index.hpp
@@ -0,0 +1,272 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
+
+/// \file stl_type_index.hpp
+/// \brief Contains boost::typeindex::stl_type_index class.
+///
+/// boost::typeindex::stl_type_index class can be used as a drop-in replacement 
+/// for std::type_index.
+///
+/// It is used in situations when RTTI is enabled or typeid() method is available.
+/// When typeid() is disabled or BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY macro
+/// is defined boost::typeindex::ctti is usually used instead of boost::typeindex::stl_type_index.
+
+#include <boost/type_index/type_index_facade.hpp>
+
+// MSVC is capable of calling typeid(T) even when RTTI is off
+#if defined(BOOST_NO_RTTI) && !defined(BOOST_MSVC)
+#error "File boost/type_index/stl_type_index.ipp is not usable when typeid() is not available."
+#endif
+
+#include <typeinfo>
+#include <cstring>                                  // std::strcmp, std::strlen, std::strstr
+#include <stdexcept>
+#include <boost/static_assert.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/core/demangle.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+
+#if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \
+        || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744)
+#   include <boost/type_traits/is_signed.hpp>
+#   include <boost/type_traits/make_signed.hpp>
+#   include <boost/mpl/identity.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex {
+
+/// \class stl_type_index
+/// This class is a wrapper around std::type_info, that workarounds issues and provides
+/// much more rich interface. \b For \b description \b of \b functions \b see type_index_facade.
+///
+/// This class requires typeid() to work. For cases when RTTI is disabled see ctti_type_index.
+class stl_type_index
+    : public type_index_facade<
+        stl_type_index, 
+        #ifdef BOOST_NO_STD_TYPEINFO
+            type_info
+        #else
+            std::type_info
+        #endif
+    > 
+{
+public:
+#ifdef BOOST_NO_STD_TYPEINFO
+    typedef type_info type_info_t;
+#else
+    typedef std::type_info type_info_t;
+#endif
+
+private:
+    const type_info_t* data_;
+
+public:
+    inline stl_type_index() BOOST_NOEXCEPT
+        : data_(&typeid(void))
+    {}
+
+    inline stl_type_index(const type_info_t& data) BOOST_NOEXCEPT
+        : data_(&data)
+    {}
+
+    inline const type_info_t&  type_info() const BOOST_NOEXCEPT;
+
+    inline const char*  raw_name() const BOOST_NOEXCEPT;
+    inline const char*  name() const BOOST_NOEXCEPT;
+    inline std::string  pretty_name() const;
+
+    inline std::size_t  hash_code() const BOOST_NOEXCEPT;
+    inline bool         equal(const stl_type_index& rhs) const BOOST_NOEXCEPT;
+    inline bool         before(const stl_type_index& rhs) const BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id_with_cvr() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id_runtime(const T& value) BOOST_NOEXCEPT;
+};
+
+inline const stl_type_index::type_info_t& stl_type_index::type_info() const BOOST_NOEXCEPT {
+    return *data_;
+}
+
+
+inline const char* stl_type_index::raw_name() const BOOST_NOEXCEPT {
+#ifdef _MSC_VER
+    return data_->raw_name();
+#else
+    return data_->name();
+#endif
+}
+
+inline const char* stl_type_index::name() const BOOST_NOEXCEPT {
+    return data_->name();
+}
+
+inline std::string stl_type_index::pretty_name() const {
+    static const char cvr_saver_name[] = "boost::typeindex::detail::cvr_saver<";
+    static BOOST_CONSTEXPR_OR_CONST std::string::size_type cvr_saver_name_len = sizeof(cvr_saver_name) - 1;
+
+    // In case of MSVC demangle() is a no-op, and name() already returns demangled name.
+    // In case of GCC and Clang (on non-Windows systems) name() returns mangled name and demangle() undecorates it.
+    const boost::core::scoped_demangled_name demangled_name(data_->name());
+
+    const char* begin = demangled_name.get();
+    if (!begin) {
+        boost::throw_exception(std::runtime_error("Type name demangling failed"));
+    }
+
+    const std::string::size_type len = std::strlen(begin);
+    const char* end = begin + len;
+
+    if (len > cvr_saver_name_len) {
+        const char* b = std::strstr(begin, cvr_saver_name);
+        if (b) {
+            b += cvr_saver_name_len;
+
+            // Trim leading spaces
+            while (*b == ' ') {         // the string is zero terminated, we won't exceed the buffer size
+                ++ b;
+            }
+
+            // Skip the closing angle bracket
+            const char* e = end - 1;
+            while (e > b && *e != '>') {
+                -- e;
+            }
+
+            // Trim trailing spaces
+            while (e > b && *(e - 1) == ' ') {
+                -- e;
+            }
+
+            if (b < e) {
+                // Parsing seems to have succeeded, the type name is not empty
+                begin = b;
+                end = e;
+            }
+        }
+    }
+
+    return std::string(begin, end);
+}
+
+
+inline std::size_t stl_type_index::hash_code() const BOOST_NOEXCEPT {
+#if _MSC_VER > 1600 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5 && defined(__GXX_EXPERIMENTAL_CXX0X__))
+    return data_->hash_code();
+#else
+    return boost::hash_range(raw_name(), raw_name() + std::strlen(raw_name()));
+#endif
+}
+
+
+/// @cond
+
+// for this compiler at least, cross-shared-library type_info
+// comparisons don't work, so we are using typeid(x).name() instead.
+# if (defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5))) \
+    || defined(_AIX) \
+    || (defined(__sgi) && defined(__host_mips)) \
+    || (defined(__hpux) && defined(__HP_aCC)) \
+    || (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC))
+#  define BOOST_CLASSINFO_COMPARE_BY_NAMES
+# endif
+
+/// @endcond
+
+inline bool stl_type_index::equal(const stl_type_index& rhs) const BOOST_NOEXCEPT {
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+    return raw_name() == rhs.raw_name() || !std::strcmp(raw_name(), rhs.raw_name());
+#else
+    return *data_ == *rhs.data_;
+#endif
+}
+
+inline bool stl_type_index::before(const stl_type_index& rhs) const BOOST_NOEXCEPT {
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+    return raw_name() != rhs.raw_name() && std::strcmp(raw_name(), rhs.raw_name()) < 0;
+#else
+    return !!data_->before(*rhs.data_);
+#endif
+}
+
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+#undef BOOST_CLASSINFO_COMPARE_BY_NAMES
+#endif
+
+
+
+template <class T>
+inline stl_type_index stl_type_index::type_id() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type no_ref_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_cv<no_ref_t>::type no_cvr_prefinal_t;
+
+    #  if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \
+        || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744)
+
+        // Old EDG-based compilers seem to mistakenly distinguish 'integral' from 'signed integral'
+        // in typeid() expressions. Full template specialization for 'integral' fixes that issue:
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+            boost::is_signed<no_cvr_prefinal_t>,
+            boost::make_signed<no_cvr_prefinal_t>,
+            boost::mpl::identity<no_cvr_prefinal_t>
+        >::type no_cvr_prefinal_lazy_t;
+
+        typedef BOOST_DEDUCED_TYPENAME no_cvr_prefinal_t::type no_cvr_t;
+    #else
+        typedef no_cvr_prefinal_t no_cvr_t;
+    #endif
+
+    return typeid(no_cvr_t);
+}
+
+namespace detail {
+    template <class T> class cvr_saver{};
+}
+
+template <class T>
+inline stl_type_index stl_type_index::type_id_with_cvr() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+        boost::mpl::or_<boost::is_reference<T>, boost::is_const<T>, boost::is_volatile<T> >,
+        detail::cvr_saver<T>,
+        T
+    >::type type;
+
+    return typeid(type);
+}
+
+
+template <class T>
+inline stl_type_index stl_type_index::type_id_runtime(const T& value) BOOST_NOEXCEPT {
+#ifdef BOOST_NO_RTTI
+    return value.boost_type_index_type_id_runtime_();
+#else
+    return typeid(value);
+#endif
+}
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
diff --git a/gatb-core/thirdparty/boost/type_index/type_index_facade.hpp b/gatb-core/thirdparty/boost/type_index/type_index_facade.hpp
new file mode 100644
index 0000000..931dedc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_index/type_index_facade.hpp
@@ -0,0 +1,300 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2015.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+#define BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+
+#include <boost/config.hpp>
+#include <string>
+#include <cstring>
+
+#if !defined(BOOST_NO_IOSTREAM)
+#if !defined(BOOST_NO_IOSFWD)
+#include <iosfwd>               // for std::basic_ostream
+#else
+#include <ostream>
+#endif
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+// Forward declaration from #include <boost/functional/hash_fwd.hpp>
+namespace boost {
+    template <class It> std::size_t hash_range(It, It);
+}
+
+namespace boost { namespace typeindex {
+
+/// \class type_index_facade
+///
+/// This class takes care about the comparison operators, hash functions and 
+/// ostream operators. Use this class as a public base class for defining new
+/// type_info-conforming classes.
+///
+/// \b Example:
+/// \code
+/// class stl_type_index: public type_index_facade<stl_type_index, std::type_info> 
+/// {
+/// public:
+///     typedef std::type_info type_info_t;
+/// private:
+///     const type_info_t* data_;
+///
+/// public:
+///     stl_type_index(const type_info_t& data) noexcept
+///         : data_(&data)
+///     {}
+/// // ...
+/// };
+/// \endcode
+///
+/// \tparam Derived Class derived from type_index_facade.
+/// \tparam TypeInfo Class that will be used as a base type_info class.
+/// \note Take a look at the protected methods. They are \b not \b defined in type_index_facade. 
+/// Protected member functions raw_name() \b must be defined in Derived class. All the other 
+/// methods are mandatory.
+/// \see 'Making a custom type_index' section for more information about 
+/// creating your own type_index using type_index_facade.
+template <class Derived, class TypeInfo>
+class type_index_facade {
+private:
+    /// @cond
+    const Derived & derived() const BOOST_NOEXCEPT {
+      return *static_cast<Derived const*>(this);
+    }
+    /// @endcond
+public:
+    typedef TypeInfo                                type_info_t;
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Name of a type. By default returns Derived::raw_name().
+    inline const char* name() const BOOST_NOEXCEPT {
+        return derived().raw_name();
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides may throw.
+    /// \return Human readable type name. By default returns Derived::name().
+    inline std::string pretty_name() const {
+        return derived().name();
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return True if two types are equal. By default compares types by raw_name().
+    inline bool equal(const Derived& rhs) const BOOST_NOEXCEPT {
+        const char* const left = derived().raw_name();
+        const char* const right = rhs.raw_name();
+        return left == right || !std::strcmp(left, right);
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return True if rhs is greater than this. By default compares types by raw_name().
+    inline bool before(const Derived& rhs) const BOOST_NOEXCEPT {
+        const char* const left = derived().raw_name();
+        const char* const right = rhs.raw_name();
+        return left != right && std::strcmp(left, right) < 0;
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Hash code of a type. By default hashes types by raw_name().
+    /// \note <boost/functional/hash.hpp> has to be included if this function is used.
+    inline std::size_t hash_code() const BOOST_NOEXCEPT {
+        const char* const name_raw = derived().raw_name();
+        return boost::hash_range(name_raw, name_raw + std::strlen(name_raw));
+    }
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+protected:
+    /// \b Override: This function \b must be redefined in Derived class. Overrides \b must not throw.
+    /// \return Pointer to unredable/raw type name.
+    inline const char* raw_name() const BOOST_NOEXCEPT;
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Const reference to underlying low level type_info_t.
+    inline const type_info_t& type_info() const BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id() will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class. Overrides \b must not throw. 
+    /// Overrides \b must remove const, volatile && and & modifiers from T.
+    /// \tparam T Type for which type_index must be created.
+    /// \return type_index for type T.
+    template <class T>
+    static Derived type_id() BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id_with_cvr() will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class. Overrides \b must not throw. 
+    /// Overrides \b must \b not remove const, volatile && and & modifiers from T.
+    /// \tparam T Type for which type_index must be created.
+    /// \return type_index for type T.
+    template <class T>
+    static Derived type_id_with_cvr() BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id_runtime(const T&) will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class.
+    /// \param variable Variable which runtime type will be stored in type_index.
+    /// \return type_index with runtime type of variable.
+    template <class T>
+    static Derived type_id_runtime(const T& variable) BOOST_NOEXCEPT;
+
+#endif
+
+};
+
+/// @cond
+template <class Derived, class TypeInfo>
+inline bool operator == (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).equal(static_cast<Derived const&>(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).before(static_cast<Derived const&>(rhs));;
+}
+
+
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return rhs < lhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs > rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs < rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs == rhs);
+}
+
+// ######################### COMPARISONS with Derived ############################ //
+template <class Derived, class TypeInfo>
+inline bool operator == (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return Derived(lhs) == rhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return Derived(lhs) < rhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return rhs < Derived(lhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) > rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) < rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) == rhs);
+}
+
+
+template <class Derived, class TypeInfo>
+inline bool operator == (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return lhs == Derived(rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return lhs < Derived(rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return Derived(rhs) < lhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs > Derived(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs < Derived(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs == Derived(rhs));
+}
+
+// ######################### COMPARISONS with Derived END ############################ //
+
+/// @endcond
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// noexcept comparison operators for type_index_facade classes.
+bool operator ==, !=, <, ... (const type_index_facade& lhs, const type_index_facade& rhs) noexcept;
+
+/// noexcept comparison operators for type_index_facade and it's TypeInfo classes.
+bool operator ==, !=, <, ... (const type_index_facade& lhs, const TypeInfo& rhs) noexcept;
+
+/// noexcept comparison operators for type_index_facade's TypeInfo and type_index_facade classes.
+bool operator ==, !=, <, ... (const TypeInfo& lhs, const type_index_facade& rhs) noexcept;
+
+#endif
+
+#ifndef BOOST_NO_IOSTREAM
+#ifdef BOOST_NO_TEMPLATED_IOSTREAMS
+/// @cond
+/// Ostream operator that will output demangled name
+template <class Derived, class TypeInfo>
+inline std::ostream& operator<<(std::ostream& ostr, const type_index_facade<Derived, TypeInfo>& ind) {
+    ostr << static_cast<Derived const&>(ind).pretty_name();
+    return ostr;
+}
+/// @endcond
+#else
+/// Ostream operator that will output demangled name.
+template <class CharT, class TriatT, class Derived, class TypeInfo>
+inline std::basic_ostream<CharT, TriatT>& operator<<(
+    std::basic_ostream<CharT, TriatT>& ostr, 
+    const type_index_facade<Derived, TypeInfo>& ind) 
+{
+    ostr << static_cast<Derived const&>(ind).pretty_name();
+    return ostr;
+}
+#endif // BOOST_NO_TEMPLATED_IOSTREAMS
+#endif // BOOST_NO_IOSTREAM
+
+/// This free function is used by Boost's unordered containers.
+/// \note <boost/functional/hash.hpp> has to be included if this function is used.
+template <class Derived, class TypeInfo>
+inline std::size_t hash_value(const type_index_facade<Derived, TypeInfo>& lhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).hash_code();
+}
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_traits.hpp b/gatb-core/thirdparty/boost/type_traits.hpp
new file mode 100644
index 0000000..398c687
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits.hpp
@@ -0,0 +1,102 @@
+//  (C) Copyright John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//  See boost/type_traits/*.hpp for full copyright notices.
+
+#ifndef BOOST_TYPE_TRAITS_HPP
+#define BOOST_TYPE_TRAITS_HPP
+
+#include "boost/type_traits/add_const.hpp"
+#include "boost/type_traits/add_cv.hpp"
+#include "boost/type_traits/add_lvalue_reference.hpp"
+#include "boost/type_traits/add_pointer.hpp"
+#include "boost/type_traits/add_reference.hpp"
+#include "boost/type_traits/add_rvalue_reference.hpp"
+#include "boost/type_traits/add_volatile.hpp"
+#include "boost/type_traits/aligned_storage.hpp"
+#include "boost/type_traits/alignment_of.hpp"
+#include "boost/type_traits/common_type.hpp"
+#include "boost/type_traits/conditional.hpp"
+#include "boost/type_traits/decay.hpp"
+#include "boost/type_traits/extent.hpp"
+#include "boost/type_traits/floating_point_promotion.hpp"
+#include "boost/type_traits/function_traits.hpp"
+#if !defined(__BORLANDC__) && !defined(__CUDACC__)
+#include "boost/type_traits/has_new_operator.hpp"
+#endif
+#include "boost/type_traits/has_nothrow_assign.hpp"
+#include "boost/type_traits/has_nothrow_constructor.hpp"
+#include "boost/type_traits/has_nothrow_copy.hpp"
+#include "boost/type_traits/has_nothrow_destructor.hpp"
+#include <boost/type_traits/has_operator.hpp>
+#include "boost/type_traits/has_trivial_assign.hpp"
+#include "boost/type_traits/has_trivial_constructor.hpp"
+#include "boost/type_traits/has_trivial_copy.hpp"
+#include "boost/type_traits/has_trivial_destructor.hpp"
+#include "boost/type_traits/has_trivial_move_assign.hpp"
+#include "boost/type_traits/has_trivial_move_constructor.hpp"
+#include "boost/type_traits/has_virtual_destructor.hpp"
+#include "boost/type_traits/is_abstract.hpp"
+#include "boost/type_traits/is_arithmetic.hpp"
+#include "boost/type_traits/is_array.hpp"
+#include "boost/type_traits/is_base_and_derived.hpp"
+#include "boost/type_traits/is_base_of.hpp"
+#include "boost/type_traits/is_class.hpp"
+#include <boost/type_traits/is_complex.hpp>
+#include "boost/type_traits/is_compound.hpp"
+#include "boost/type_traits/is_const.hpp"
+#include "boost/type_traits/is_convertible.hpp"
+#include "boost/type_traits/is_copy_constructible.hpp"
+#include "boost/type_traits/is_copy_assignable.hpp"
+#include "boost/type_traits/is_empty.hpp"
+#include "boost/type_traits/is_enum.hpp"
+#include "boost/type_traits/is_float.hpp"
+#include "boost/type_traits/is_floating_point.hpp"
+#include "boost/type_traits/is_function.hpp"
+#include "boost/type_traits/is_fundamental.hpp"
+#include "boost/type_traits/is_integral.hpp"
+#include "boost/type_traits/is_lvalue_reference.hpp"
+#include "boost/type_traits/is_member_function_pointer.hpp"
+#include "boost/type_traits/is_member_object_pointer.hpp"
+#include "boost/type_traits/is_member_pointer.hpp"
+#include "boost/type_traits/is_nothrow_move_assignable.hpp"
+#include "boost/type_traits/is_nothrow_move_constructible.hpp"
+#include "boost/type_traits/is_object.hpp"
+#include "boost/type_traits/is_pod.hpp"
+#include "boost/type_traits/is_polymorphic.hpp"
+#include "boost/type_traits/is_pointer.hpp"
+#include "boost/type_traits/is_reference.hpp"
+#include "boost/type_traits/is_rvalue_reference.hpp"
+#include "boost/type_traits/is_signed.hpp"
+#include "boost/type_traits/is_same.hpp"
+#include "boost/type_traits/is_scalar.hpp"
+#include "boost/type_traits/is_stateless.hpp"
+#include "boost/type_traits/is_union.hpp"
+#include "boost/type_traits/is_unsigned.hpp"
+#include "boost/type_traits/is_void.hpp"
+#include "boost/type_traits/is_virtual_base_of.hpp"
+#include "boost/type_traits/is_volatile.hpp"
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/make_signed.hpp>
+#include "boost/type_traits/rank.hpp"
+#include "boost/type_traits/remove_bounds.hpp"
+#include "boost/type_traits/remove_extent.hpp"
+#include "boost/type_traits/remove_all_extents.hpp"
+#include "boost/type_traits/remove_const.hpp"
+#include "boost/type_traits/remove_cv.hpp"
+#include "boost/type_traits/remove_pointer.hpp"
+#include "boost/type_traits/remove_reference.hpp"
+#include "boost/type_traits/remove_volatile.hpp"
+#include "boost/type_traits/type_with_alignment.hpp"
+#if !(defined(__sgi) && defined(__EDG_VERSION__) && (__EDG_VERSION__ == 238))
+#include "boost/type_traits/integral_promotion.hpp"
+#include "boost/type_traits/promote.hpp"
+#endif
+
+#include "boost/type_traits/ice.hpp"
+
+#endif // BOOST_TYPE_TRAITS_HPP
diff --git a/gatb-core/thirdparty/boost/type_traits/add_const.hpp b/gatb-core/thirdparty/boost/type_traits/add_const.hpp
new file mode 100644
index 0000000..0a27f8a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_const.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ADD_CONST_HPP_INCLUDED
+#define BOOST_TT_ADD_CONST_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+// * convert a type T to const type - add_const<T>
+// this is not required since the result is always
+// the same as "T const", but it does suppress warnings
+// from some compilers:
+
+#if defined(BOOST_MSVC)
+// This bogus warning will appear when add_const is applied to a
+// const volatile reference because we can't detect const volatile
+// references with MSVC6.
+#   pragma warning(push)
+#   pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_const,T,T const)
+
+#if defined(BOOST_MSVC)
+#   pragma warning(pop)
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_const,T&,T&)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_CONST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/add_cv.hpp b/gatb-core/thirdparty/boost/type_traits/add_cv.hpp
new file mode 100644
index 0000000..66625c6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_cv.hpp
@@ -0,0 +1,46 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_ADD_CV_HPP_INCLUDED
+#define BOOST_TT_ADD_CV_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+// * convert a type T to a const volatile type - add_cv<T>
+// this is not required since the result is always
+// the same as "T const volatile", but it does suppress warnings
+// from some compilers:
+
+#if defined(BOOST_MSVC)
+// This bogus warning will appear when add_volatile is applied to a
+// const volatile reference because we can't detect const volatile
+// references with MSVC6.
+#   pragma warning(push)
+#   pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_cv,T,T const volatile)
+
+#if defined(BOOST_MSVC)
+#   pragma warning(pop)
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_cv,T&,T&)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_CV_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/add_lvalue_reference.hpp b/gatb-core/thirdparty/boost/type_traits/add_lvalue_reference.hpp
new file mode 100644
index 0000000..1d75794
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_lvalue_reference.hpp
@@ -0,0 +1,26 @@
+//  Copyright 2010 John Maddock
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP
+#define BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP
+
+#include <boost/type_traits/add_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost{
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_lvalue_reference,T,typename boost::add_reference<T>::type)
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_lvalue_reference,T&&,T&)
+#endif
+
+}
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif  // BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP
diff --git a/gatb-core/thirdparty/boost/type_traits/add_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/add_pointer.hpp
new file mode 100644
index 0000000..3e0e481
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_pointer.hpp
@@ -0,0 +1,72 @@
+
+// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ADD_POINTER_HPP_INCLUDED
+#define BOOST_TT_ADD_POINTER_HPP_INCLUDED
+
+#include <boost/type_traits/remove_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x5A0)
+//
+// For some reason this implementation stops Borlands compiler
+// from dropping cv-qualifiers, it still fails with references
+// to arrays for some reason though (shrug...) (JM 20021104)
+//
+template <typename T>
+struct add_pointer_impl
+{
+    typedef T* type;
+};
+template <typename T>
+struct add_pointer_impl<T&>
+{
+    typedef T* type;
+};
+template <typename T>
+struct add_pointer_impl<T&const>
+{
+    typedef T* type;
+};
+template <typename T>
+struct add_pointer_impl<T&volatile>
+{
+    typedef T* type;
+};
+template <typename T>
+struct add_pointer_impl<T&const volatile>
+{
+    typedef T* type;
+};
+
+#else
+
+template <typename T>
+struct add_pointer_impl
+{
+    typedef typename remove_reference<T>::type no_ref_type;
+    typedef no_ref_type* type;
+};
+
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_pointer,T,typename boost::detail::add_pointer_impl<T>::type)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/add_reference.hpp b/gatb-core/thirdparty/boost/type_traits/add_reference.hpp
new file mode 100644
index 0000000..5e3efca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_reference.hpp
@@ -0,0 +1,72 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
+#define BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
+
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+
+template <typename T>
+struct add_reference_rvalue_layer
+{
+    typedef T& type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <typename T>
+struct add_reference_rvalue_layer<T&&>
+{
+    typedef T&& type;
+};
+#endif
+
+template <typename T>
+struct add_reference_impl
+{
+    typedef typename add_reference_rvalue_layer<T>::type type;
+};
+
+BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&)
+
+// these full specialisations are always required:
+BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void,void)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const,void const)
+BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void volatile,void volatile)
+BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const volatile,void const volatile)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_reference,T,typename boost::detail::add_reference_impl<T>::type)
+
+// agurt, 07/mar/03: workaround Borland's ill-formed sensitivity to an additional
+// level of indirection, here
+#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/add_rvalue_reference.hpp b/gatb-core/thirdparty/boost/type_traits/add_rvalue_reference.hpp
new file mode 100644
index 0000000..242716f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_rvalue_reference.hpp
@@ -0,0 +1,66 @@
+//  add_rvalue_reference.hpp  ---------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
+#define BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
+
+#include <boost/config.hpp>
+
+//----------------------------------------------------------------------------//
+
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/is_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//                           C++03 implementation of                          //
+//             20.9.7.2 Reference modifications [meta.trans.ref]              //
+//                          Written by Vicente J. Botet Escriba               //
+//                                                                            //
+// If T names an object or function type then the member typedef type
+// shall name T&&; otherwise, type shall name T. [ Note: This rule reflects
+// the semantics of reference collapsing. For example, when a type T names
+// a type T1&, the type add_rvalue_reference<T>::type is not an rvalue
+// reference. -end note ]
+//----------------------------------------------------------------------------//
+
+namespace boost {
+
+namespace type_traits_detail {
+
+    template <typename T, bool b>
+    struct add_rvalue_reference_helper
+    { typedef T   type; };
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename T>
+    struct add_rvalue_reference_helper<T, true>
+    {
+        typedef T&&   type;
+    };
+#endif
+
+    template <typename T>
+    struct add_rvalue_reference_imp
+    {
+       typedef typename boost::type_traits_detail::add_rvalue_reference_helper
+                  <T, (is_void<T>::value == false && is_reference<T>::value == false) >::type type;
+    };
+
+}
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_rvalue_reference,T,typename boost::type_traits_detail::add_rvalue_reference_imp<T>::type)
+
+}  // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif  // BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
+
diff --git a/gatb-core/thirdparty/boost/type_traits/add_volatile.hpp b/gatb-core/thirdparty/boost/type_traits/add_volatile.hpp
new file mode 100644
index 0000000..86b5297
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/add_volatile.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ADD_VOLATILE_HPP_INCLUDED
+#define BOOST_TT_ADD_VOLATILE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+// * convert a type T to volatile type - add_volatile<T>
+// this is not required since the result is always
+// the same as "T volatile", but it does suppress warnings
+// from some compilers:
+
+#if defined(BOOST_MSVC)
+// This bogus warning will appear when add_volatile is applied to a
+// const volatile reference because we can't detect const volatile
+// references with MSVC6.
+#   pragma warning(push)
+#   pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_volatile,T,T volatile)
+
+#if defined(BOOST_MSVC)
+#   pragma warning(pop)
+#endif 
+
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_volatile,T&,T&)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_VOLATILE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/aligned_storage.hpp b/gatb-core/thirdparty/boost/type_traits/aligned_storage.hpp
new file mode 100755
index 0000000..5420f26
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/aligned_storage.hpp
@@ -0,0 +1,13 @@
+
+//  Copyright (C) John Maddock 2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
+#  define BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
+#  include <boost/aligned_storage.hpp>
+#endif // BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/alignment_of.hpp b/gatb-core/thirdparty/boost/type_traits/alignment_of.hpp
new file mode 100644
index 0000000..31a5f38
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/alignment_of.hpp
@@ -0,0 +1,126 @@
+
+//  (C) Copyright John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED
+#define BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <cstddef>
+
+#include <boost/type_traits/intrinsics.hpp>
+// should be the last #include
+#include <boost/type_traits/detail/size_t_trait_def.hpp>
+
+#ifdef BOOST_MSVC
+#   pragma warning(push)
+#   pragma warning(disable: 4121 4512) // alignment is sensitive to packing
+#endif
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
+#pragma option push -Vx- -Ve-
+#endif
+
+namespace boost {
+
+template <typename T> struct alignment_of;
+
+// get the alignment of some arbitrary type:
+namespace detail {
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4324) // structure was padded due to __declspec(align())
+#endif
+template <typename T>
+struct alignment_of_hack
+{
+    char c;
+    T t;
+    alignment_of_hack();
+};
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{
+    BOOST_STATIC_CONSTANT(std::size_t, value = A < S ? A : S);
+};
+
+
+template< typename T >
+struct alignment_of_impl
+{
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)
+    //
+    // With MSVC both the native __alignof operator
+    // and our own logic gets things wrong from time to time :-(
+    // Using a combination of the two seems to make the most of a bad job:
+    //
+    BOOST_STATIC_CONSTANT(std::size_t, value =
+        (::boost::detail::alignment_logic<
+            sizeof(::boost::detail::alignment_of_hack<T>) - sizeof(T),
+            __alignof(T)
+        >::value));
+#elif !defined(BOOST_ALIGNMENT_OF)
+    BOOST_STATIC_CONSTANT(std::size_t, value =
+        (::boost::detail::alignment_logic<
+            sizeof(::boost::detail::alignment_of_hack<T>) - sizeof(T),
+            sizeof(T)
+        >::value));
+#else
+   //
+   // We put this here, rather than in the definition of
+   // alignment_of below, because MSVC's __alignof doesn't
+   // always work in that context for some unexplained reason.
+   // (See type_with_alignment tests for test cases).
+   //
+   BOOST_STATIC_CONSTANT(std::size_t, value = BOOST_ALIGNMENT_OF(T));
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(alignment_of,T,::boost::detail::alignment_of_impl<T>::value)
+
+// references have to be treated specially, assume
+// that a reference is just a special pointer:
+template <typename T>
+struct alignment_of<T&>
+    : public alignment_of<T*>
+{
+};
+#ifdef __BORLANDC__
+// long double gives an incorrect value of 10 (!)
+// unless we do this...
+struct long_double_wrapper{ long double ld; };
+template<> struct alignment_of<long double>
+   : public alignment_of<long_double_wrapper>{};
+#endif
+
+// void has to be treated specially:
+BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void,0)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const,0)
+BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void volatile,0)
+BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const volatile,0)
+#endif
+
+} // namespace boost
+
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#   pragma warning(pop)
+#endif
+
+#include <boost/type_traits/detail/size_t_trait_undef.hpp>
+
+#endif // BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/alignment_traits.hpp b/gatb-core/thirdparty/boost/type_traits/alignment_traits.hpp
new file mode 100644
index 0000000..2ed6934
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/alignment_traits.hpp
@@ -0,0 +1,15 @@
+
+//  (C) Copyright John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED
+#define BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/type_traits/type_with_alignment.hpp>
+
+#endif // BOOST_TT_ALIGNMENT_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/arithmetic_traits.hpp b/gatb-core/thirdparty/boost/type_traits/arithmetic_traits.hpp
new file mode 100644
index 0000000..e4670e6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/arithmetic_traits.hpp
@@ -0,0 +1,20 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines traits classes for arithmetic types:
+//  is_void, is_integral, is_float, is_arithmetic, is_fundamental.
+
+#ifndef BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED
+#define BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_float.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_void.hpp>
+
+#endif // BOOST_TT_ARITHMETIC_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/array_traits.hpp b/gatb-core/thirdparty/boost/type_traits/array_traits.hpp
new file mode 100644
index 0000000..a68ae73
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/array_traits.hpp
@@ -0,0 +1,15 @@
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED
+#define BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+
+#endif // BOOST_TT_ARRAY_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/broken_compiler_spec.hpp b/gatb-core/thirdparty/boost/type_traits/broken_compiler_spec.hpp
new file mode 100644
index 0000000..3a13273
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/broken_compiler_spec.hpp
@@ -0,0 +1,14 @@
+
+//  Copyright 2001-2003 Aleksey Gurtovoy.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED
+#define BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/common_type.hpp b/gatb-core/thirdparty/boost/type_traits/common_type.hpp
new file mode 100644
index 0000000..b52ff16
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/common_type.hpp
@@ -0,0 +1,157 @@
+//  common_type.hpp  ---------------------------------------------------------//
+
+//  Copyright 2008 Howard Hinnant
+//  Copyright 2008 Beman Dawes
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
+#define BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
+
+#include <boost/config.hpp>
+
+#if defined(__SUNPRO_CC) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
+#  define BOOST_COMMON_TYPE_DONT_USE_TYPEOF
+#endif
+#if defined(__IBMCPP__) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
+#  define BOOST_COMMON_TYPE_DONT_USE_TYPEOF
+#endif
+
+//----------------------------------------------------------------------------//
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_COMMON_TYPE_ARITY)
+#define BOOST_COMMON_TYPE_ARITY 3
+#endif
+
+//----------------------------------------------------------------------------//
+#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
+#include <boost/typeof/typeof.hpp>   // boost wonders never cease!
+#endif
+
+//----------------------------------------------------------------------------//
+#ifndef BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) static_assert(CND,MSG)
+#elif defined(BOOST_COMMON_TYPE_USES_MPL_ASSERT)
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES)                                 \
+    BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES)
+#else
+#include <boost/static_assert.hpp>
+#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) BOOST_STATIC_ASSERT(CND)
+#endif
+
+#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) || !defined(BOOST_COMMON_TYPE_USES_MPL_ASSERT)
+#define BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE "must be complete type"
+#endif
+
+#if defined(BOOST_NO_CXX11_DECLTYPE) && defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
+#include <boost/type_traits/detail/common_type_imp.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#endif
+#include <boost/mpl/if.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/type_traits/add_rvalue_reference.hpp>
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//                           C++03 implementation of                          //
+//             20.9.7.6 Other transformations [meta.trans.other]              //
+//                          Written by Howard Hinnant                         //
+//      Adapted for Boost by Beman Dawes, Vicente Botet and  Jeffrey Hellrung //
+//                                                                            //
+//----------------------------------------------------------------------------//
+
+namespace boost {
+
+// prototype
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template<typename... T>
+    struct common_type;
+#else // or no specialization
+    template <class T, class U = void, class V = void>
+    struct common_type
+    {
+    public:
+        typedef typename common_type<typename common_type<T, U>::type, V>::type type;
+    };
+#endif
+
+
+// 1 arg
+    template<typename T>
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    struct common_type<T>
+#else
+    struct common_type<T, void, void>
+
+#endif
+    {
+        BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T));
+    public:
+        typedef T type;
+    };
+
+// 2 args
+namespace type_traits_detail {
+
+    template <class T, class U>
+    struct common_type_2
+    {
+    private:
+        BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T));
+        BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(U) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (U));
+        static bool declval_bool();  // workaround gcc bug; not required by std
+        static typename add_rvalue_reference<T>::type declval_T();  // workaround gcc bug; not required by std
+        static typename add_rvalue_reference<U>::type declval_U();  // workaround gcc bug; not required by std
+        static typename add_rvalue_reference<bool>::type declval_b();  
+
+#if !defined(BOOST_NO_CXX11_DECLTYPE)
+    public:
+        typedef decltype(declval<bool>() ? declval<T>() : declval<U>()) type;
+#elif defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
+    public:
+    typedef typename detail_type_traits_common_type::common_type_impl<
+          typename remove_cv<T>::type,
+          typename remove_cv<U>::type
+      >::type type;
+#else
+    public:
+        typedef BOOST_TYPEOF_TPL(declval_b() ? declval_T() : declval_U()) type;
+#endif
+
+#if defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 3
+    public:
+        void public_dummy_function_just_to_silence_warning();
+#endif
+    };
+
+    template <class T>
+    struct common_type_2<T, T>
+    {
+        typedef T type;
+    };
+    }
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template <class T, class U>
+    struct common_type<T, U>
+#else
+    template <class T, class U>
+    struct common_type<T, U, void>
+#endif
+    : public type_traits_detail::common_type_2<T,U>
+    { };
+
+
+// 3 or more args
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template<typename T, typename U, typename... V>
+    struct common_type<T, U, V...> {
+    public:
+        typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
+    };
+#endif
+}  // namespace boost
+
+#endif  // BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
diff --git a/gatb-core/thirdparty/boost/type_traits/composite_traits.hpp b/gatb-core/thirdparty/boost/type_traits/composite_traits.hpp
new file mode 100644
index 0000000..985a4c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/composite_traits.hpp
@@ -0,0 +1,29 @@
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines traits classes for composite types:
+//  is_array, is_pointer, is_reference, is_member_pointer, is_enum, is_union.
+//
+
+#ifndef BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED
+#define BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_union.hpp>
+
+#endif // BOOST_TT_COMPOSITE_TRAITS_HPP_INCLUDED
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/type_traits/conditional.hpp b/gatb-core/thirdparty/boost/type_traits/conditional.hpp
new file mode 100644
index 0000000..8bbda85
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/conditional.hpp
@@ -0,0 +1,25 @@
+
+//  (C) Copyright John Maddock 2010.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_CONDITIONAL_HPP_INCLUDED
+#define BOOST_TT_CONDITIONAL_HPP_INCLUDED
+
+#include <boost/mpl/if.hpp>
+
+namespace boost {
+
+template <bool b, class T, class U>
+struct conditional : public mpl::if_c<b, T, U>
+{
+};
+
+} // namespace boost
+
+
+#endif // BOOST_TT_CONDITIONAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/config.hpp b/gatb-core/thirdparty/boost/type_traits/config.hpp
new file mode 100644
index 0000000..2e25ad0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/config.hpp
@@ -0,0 +1,72 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_CONFIG_HPP_INCLUDED
+#define BOOST_TT_CONFIG_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
+
+#include <boost/detail/workaround.hpp>
+
+//
+// whenever we have a conversion function with ellipses
+// it needs to be declared __cdecl to suppress compiler
+// warnings from MS and Borland compilers (this *must*
+// appear before we include is_same.hpp below):
+#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))
+#   define BOOST_TT_DECL __cdecl
+#else
+#   define BOOST_TT_DECL /**/
+#endif
+
+# if (BOOST_WORKAROUND(__MWERKS__, < 0x3000)                         \
+    || BOOST_WORKAROUND(__IBMCPP__, < 600 )                         \
+    || BOOST_WORKAROUND(__BORLANDC__, < 0x5A0)                      \
+    || defined(__ghs)                                               \
+    || BOOST_WORKAROUND(__HP_aCC, < 60700)           \
+    || BOOST_WORKAROUND(MPW_CPLUS, BOOST_TESTED_AT(0x890))          \
+    || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580)))       \
+    && defined(BOOST_NO_IS_ABSTRACT)
+
+#   define BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION 1
+
+#endif
+
+#ifndef BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION
+# define BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION 1
+#endif
+
+//
+// define BOOST_TT_TEST_MS_FUNC_SIGS
+// when we want to test __stdcall etc function types with is_function etc
+// (Note, does not work with Borland, even though it does support __stdcall etc):
+//
+#if defined(_MSC_EXTENSIONS) && !defined(__BORLANDC__)
+#  define BOOST_TT_TEST_MS_FUNC_SIGS
+#endif
+
+//
+// define BOOST_TT_NO_CV_FUNC_TEST
+// if tests for cv-qualified member functions don't 
+// work in is_member_function_pointer
+//
+#if BOOST_WORKAROUND(__MWERKS__, < 0x3000) || BOOST_WORKAROUND(__IBMCPP__, <= 600)
+#  define BOOST_TT_NO_CV_FUNC_TEST
+#endif
+
+//
+// Macros that have been deprecated, defined here for backwards compatibility:
+//
+#define BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(x)
+#define BOOST_TT_BROKEN_COMPILER_SPEC(x)
+
+#endif // BOOST_TT_CONFIG_HPP_INCLUDED
+
+
diff --git a/gatb-core/thirdparty/boost/type_traits/conversion_traits.hpp b/gatb-core/thirdparty/boost/type_traits/conversion_traits.hpp
new file mode 100644
index 0000000..c8e5139
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/conversion_traits.hpp
@@ -0,0 +1,17 @@
+
+// Copyright 2000 John Maddock (john at johnmaddock.co.uk)
+// Copyright 2000 Jeremy Siek (jsiek at lsc.nd.edu)
+// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi at cs.utu.fi)
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED
+#define BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_convertible.hpp>
+
+#endif // BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/cv_traits.hpp b/gatb-core/thirdparty/boost/type_traits/cv_traits.hpp
new file mode 100644
index 0000000..5bd6c4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/cv_traits.hpp
@@ -0,0 +1,24 @@
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines traits classes for cv-qualified types:
+//  is_const, is_volatile, remove_const, remove_volatile, remove_cv.
+
+#ifndef BOOST_TT_CV_TRAITS_HPP_INCLUDED
+#define BOOST_TT_CV_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_volatile.hpp>
+#include <boost/type_traits/add_cv.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_volatile.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+#endif // BOOST_TT_CV_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/decay.hpp b/gatb-core/thirdparty/boost/type_traits/decay.hpp
new file mode 100755
index 0000000..c23a9b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/decay.hpp
@@ -0,0 +1,44 @@
+//  (C) Copyright John Maddock & Thorsten Ottosen 2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_DECAY_HPP_INCLUDED
+#define BOOST_TT_DECAY_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/remove_bounds.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost 
+{
+
+    template< class T >
+    struct decay
+    {
+    private:
+        typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type Ty;
+    public:
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if< 
+            is_array<Ty>,
+            mpl::identity<BOOST_DEDUCED_TYPENAME remove_bounds<Ty>::type*>,
+            BOOST_DEDUCED_TYPENAME mpl::eval_if< 
+                is_function<Ty>,
+                add_pointer<Ty>,
+                mpl::identity<Ty>
+            >
+        >::type type;
+    };
+    
+} // namespace boost
+
+
+#endif // BOOST_TT_DECAY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_def.hpp b/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_def.hpp
new file mode 100644
index 0000000..69e4f1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_def.hpp
@@ -0,0 +1,188 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#include <boost/type_traits/detail/template_arity_spec.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/config.hpp>
+
+//
+// Unfortunately some libraries have started using this header without
+// cleaning up afterwards: so we'd better undef the macros just in case 
+// they've been defined already....
+//
+#ifdef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL
+#undef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL
+#undef BOOST_TT_AUX_BOOL_C_BASE
+#undef BOOST_TT_AUX_BOOL_TRAIT_DEF1
+#undef BOOST_TT_AUX_BOOL_TRAIT_DEF2
+#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC1
+#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC2
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1
+#endif
+
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x570)
+#   define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    typedef ::boost::integral_constant<bool,C> type; \
+    enum { value = type::value }; \
+    /**/
+#   define BOOST_TT_AUX_BOOL_C_BASE(C)
+#endif
+
+#ifndef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL
+#   define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) /**/
+#endif
+
+#ifndef BOOST_TT_AUX_BOOL_C_BASE
+#   define BOOST_TT_AUX_BOOL_C_BASE(C) : public ::boost::integral_constant<bool,C>
+#endif 
+
+
+#define BOOST_TT_AUX_BOOL_TRAIT_DEF1(trait,T,C) \
+template< typename T > struct trait \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
+}; \
+\
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
+/**/
+
+
+#define BOOST_TT_AUX_BOOL_TRAIT_DEF2(trait,T1,T2,C) \
+template< typename T1, typename T2 > struct trait \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,trait,(T1,T2)) \
+}; \
+\
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(2,trait) \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_DEF3(trait,T1,T2,T3,C) \
+template< typename T1, typename T2, typename T3 > struct trait \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,trait,(T1,T2,T3)) \
+}; \
+\
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(3,trait) \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,C) \
+template<> struct trait< sp > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(sp)) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_SPEC2(trait,sp1,sp2,C) \
+template<> struct trait< sp1,sp2 > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(trait,sp,C) \
+template<> struct trait##_impl< sp > \
+{ \
+public:\
+    BOOST_STATIC_CONSTANT(bool, value = (C)); \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,sp1,sp2,C) \
+template<> struct trait##_impl< sp1,sp2 > \
+{ \
+public:\
+    BOOST_STATIC_CONSTANT(bool, value = (C)); \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(param,trait,sp,C) \
+template< param > struct trait< sp > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(param1,param2,trait,sp,C) \
+template< param1, param2 > struct trait< sp > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(param,trait,sp1,sp2,C) \
+template< param > struct trait< sp1,sp2 > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(param1,param2,trait,sp1,sp2,C) \
+template< param1, param2 > struct trait< sp1,sp2 > \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+public:\
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(param,trait,sp1,sp2,C) \
+template< param > struct trait##_impl< sp1,sp2 > \
+{ \
+public:\
+    BOOST_STATIC_CONSTANT(bool, value = (C)); \
+}; \
+/**/
+
+#ifndef BOOST_NO_CV_SPECIALIZATIONS
+#   define BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(trait,sp,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp const,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp volatile,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp const volatile,value) \
+    /**/
+#else
+#   define BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(trait,sp,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_SPEC1(trait,sp,value) \
+    /**/
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_undef.hpp b/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_undef.hpp
new file mode 100644
index 0000000..4ac61ef
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/bool_trait_undef.hpp
@@ -0,0 +1,28 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#undef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL
+#undef BOOST_TT_AUX_BOOL_C_BASE
+#undef BOOST_TT_AUX_BOOL_TRAIT_DEF1
+#undef BOOST_TT_AUX_BOOL_TRAIT_DEF2
+#undef BOOST_TT_AUX_BOOL_TRAIT_DEF3
+#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC1
+#undef BOOST_TT_AUX_BOOL_TRAIT_SPEC2
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2
+#undef BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1
+#undef BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/common_type_imp.hpp b/gatb-core/thirdparty/boost/type_traits/detail/common_type_imp.hpp
new file mode 100644
index 0000000..84de8b4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/common_type_imp.hpp
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * boost/type_traits/detail/common_type_imp.hpp
+ *
+ * Copyright 2010, Jeffrey Hellrung.
+ * Distributed under the Boost Software License, Version 1.0.  (See accompanying
+ * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * struct boost::common_type<T,U>
+ *
+ * common_type<T,U>::type is the type of the expression
+ *     b() ? x() : y()
+ * where b() returns a bool, x() has return type T, and y() has return type U.
+ * See
+ *     http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm#common_type
+ *
+ * Note that this evaluates to void if one or both of T and U is void.
+ ******************************************************************************/
+
+#ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMP_HPP
+#define BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMP_HPP
+
+#include <cstddef>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/contains.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/inserter.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/vector/vector0.hpp>
+#include <boost/mpl/vector/vector10.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/make_signed.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/declval.hpp>
+
+namespace boost
+{
+
+namespace detail_type_traits_common_type
+{
+
+/*******************************************************************************
+ * struct propagate_cv< From, To >
+ *
+ * This metafunction propagates cv-qualifiers on type From to type To.
+ ******************************************************************************/
+
+template< class From, class To >
+struct propagate_cv
+{ typedef To type; };
+template< class From, class To >
+struct propagate_cv< const From, To >
+{ typedef To const type; };
+template< class From, class To >
+struct propagate_cv< volatile From, To >
+{ typedef To volatile type; };
+template< class From, class To >
+struct propagate_cv< const volatile From, To >
+{ typedef To const volatile type; };
+
+/*******************************************************************************
+ * struct is_integral_or_enum<T>
+ *
+ * This metafunction determines if T is an integral type which can be made
+ * signed or unsigned.
+ ******************************************************************************/
+
+template< class T >
+struct is_integral_or_enum
+    : public mpl::or_< is_integral<T>, is_enum<T> >
+{ };
+template<>
+struct is_integral_or_enum< bool >
+    : public false_type
+{ };
+
+/*******************************************************************************
+ * struct make_unsigned_soft<T>
+ * struct make_signed_soft<T>
+ *
+ * These metafunction are identical to make_unsigned and make_signed,
+ * respectively, except for special-casing bool.
+ ******************************************************************************/
+
+template< class T >
+struct make_unsigned_soft
+    : public make_unsigned<T>
+{ };
+template<>
+struct make_unsigned_soft< bool >
+{ typedef bool type; };
+
+template< class T >
+struct make_signed_soft
+    : public make_signed<T>
+{ };
+template<>
+struct make_signed_soft< bool >
+{ typedef bool type; };
+
+/*******************************************************************************
+ * struct sizeof_t<N>
+ * typedef ... yes_type
+ * typedef ... no_type
+ *
+ * These types are integral players in the use of the "sizeof trick", i.e., we
+ * can distinguish overload selection by inspecting the size of the return type
+ * of the overload.
+ ******************************************************************************/
+
+template< std::size_t N > struct sizeof_t { char _dummy[N]; };
+typedef sizeof_t<1> yes_type;
+typedef sizeof_t<2> no_type;
+BOOST_MPL_ASSERT_RELATION( sizeof( yes_type ), ==, 1 );
+BOOST_MPL_ASSERT_RELATION( sizeof( no_type ), ==, 2 );
+
+/*******************************************************************************
+ * rvalue_test(T&) -> no_type
+ * rvalue_test(...) -> yes_type
+ *
+ * These overloads are used to determine the rvalue-ness of an expression.
+ ******************************************************************************/
+
+template< class T > no_type rvalue_test(T&);
+yes_type rvalue_test(...);
+
+/*******************************************************************************
+ * struct conversion_test_overloads< Sequence >
+ *
+ * This struct has multiple overloads of the static member function apply, each
+ * one taking a single parameter of a type within the Boost.MPL sequence
+ * Sequence.  Each such apply overload has a return type with sizeof equal to
+ * one plus the index of the parameter type within Sequence.  Thus, we can
+ * deduce the type T of an expression as long as we can generate a finite set of
+ * candidate types containing T via these apply overloads and the "sizeof
+ * trick".
+ ******************************************************************************/
+
+template< class First, class Last, std::size_t Index >
+struct conversion_test_overloads_iterate
+    : public conversion_test_overloads_iterate<
+          typename mpl::next< First >::type, Last, Index + 1
+      >
+{
+    using conversion_test_overloads_iterate<
+        typename mpl::next< First >::type, Last, Index + 1
+    >::apply;
+    static sizeof_t< Index + 1 >
+    apply(typename mpl::deref< First >::type);
+};
+
+template< class Last, std::size_t Index >
+struct conversion_test_overloads_iterate< Last, Last, Index >
+{ static sizeof_t< Index + 1 > apply(...); };
+
+template< class Sequence >
+struct conversion_test_overloads
+    : public conversion_test_overloads_iterate<
+          typename mpl::begin< Sequence >::type,
+          typename mpl::end< Sequence >::type,
+          0
+      >
+{ };
+
+/*******************************************************************************
+ * struct select< Sequence, Index >
+ *
+ * select is synonymous with mpl::at_c unless Index equals the size of the
+ * Boost.MPL Sequence, in which case this evaluates to void.
+ ******************************************************************************/
+
+template<
+    class Sequence, int Index,
+    int N = mpl::size< Sequence >::value
+>
+struct select
+    : public mpl::at_c< Sequence, Index >
+{ };
+template< class Sequence, int N >
+struct select< Sequence, N, N >
+{ typedef void type; };
+
+/*******************************************************************************
+ * class deduce_common_type< T, U, NominalCandidates >
+ * struct nominal_candidates<T,U>
+ * struct common_type_dispatch_on_rvalueness<T,U>
+ * struct common_type_impl<T,U>
+ *
+ * These classes and structs implement the logic behind common_type, which goes
+ * roughly as follows.  Let C be the type of the conditional expression
+ *     declval< bool >() ? declval<T>() : declval<U>()
+ * if C is an rvalue, then:
+ *     let T' and U' be T and U stripped of reference- and cv-qualifiers
+ *     if T' and U' are pointer types, say, T' = V* and U' = W*, then:
+ *         define the set of NominalCandidates to be
+ *             { V*, W*, V'*, W'* }
+ *           where V' is V with whatever cv-qualifiers are on W, and W' is W
+ *           with whatever cv-qualifiers are on V
+ *     else if T' and U' are both integral or enum types, then:
+ *         define the set of NominalCandidates to be
+ *             {
+ *                 unsigned_soft(T'),
+ *                 unsigned_soft(U'),
+ *                 signed_soft(T'),
+ *                 signed_soft(U'),
+ *                 T',
+ *                 U',
+ *                 unsigned int,
+ *                 int
+ *             }
+ *           where unsigned_soft(X) is make_unsigned_soft<X>::type and
+ *           signed_soft(X) is make_signed_soft<X>::type (these are all
+ *           generally necessary to cover the various integral promotion cases)
+ *     else
+ *         define the set of NominalCandidates to be
+ *             { T', U' }
+ * else
+ *     let V and W be T and U stripped of reference-qualifiers
+ *     define the set of NominalCandidates to be
+ *         { V&, W&, V'&, W'& }
+ *     where V' is V with whatever cv-qualifiers are on W, and W' is W with
+ *       whatever cv-qualifiers are on V
+ * define the set of Candidates to be equal to the set of NominalCandidates with
+ * duplicates removed, and use this set of Candidates to determine C using the
+ * conversion_test_overloads struct
+ ******************************************************************************/
+
+template< class T, class U, class NominalCandidates >
+class deduce_common_type
+{
+    typedef typename mpl::copy<
+        NominalCandidates,
+        mpl::inserter<
+            mpl::vector0<>,
+            mpl::if_<
+                mpl::contains< mpl::_1, mpl::_2 >,
+                mpl::_1,
+                mpl::push_back< mpl::_1, mpl::_2 >
+            >
+        >
+    >::type candidate_types;
+    static const int best_candidate_index =
+        sizeof( conversion_test_overloads< candidate_types >::apply(
+            declval< bool >() ? declval<T>() : declval<U>()
+        ) ) - 1;
+public:
+    typedef typename select< candidate_types, best_candidate_index >::type type;
+};
+
+template<
+    class T, class U,
+    class V = typename remove_cv< typename remove_reference<T>::type >::type,
+    class W = typename remove_cv< typename remove_reference<U>::type >::type,
+    bool = is_integral_or_enum<V>::value && is_integral_or_enum<W>::value
+>
+struct nominal_candidates
+{ typedef mpl::vector2<V,W> type; };
+
+template< class T, class U, class V, class W >
+struct nominal_candidates< T, U, V, W, true >
+{
+    typedef boost::mpl::vector8<
+        typename make_unsigned_soft<V>::type,
+        typename make_unsigned_soft<W>::type,
+        typename make_signed_soft<V>::type,
+        typename make_signed_soft<W>::type,
+        V, W, unsigned int, int
+    > type;
+};
+
+template< class T, class U, class V, class W >
+struct nominal_candidates< T, U, V*, W*, false >
+{
+    typedef mpl::vector4<
+        V*, W*,
+        typename propagate_cv<W,V>::type *,
+        typename propagate_cv<V,W>::type *
+    > type;
+};
+
+template<class T, class U, bool b>
+struct common_type_dispatch_on_rvalueness
+    : public deduce_common_type< T, U, typename nominal_candidates<T,U>::type >
+{ };
+
+template< class T, class U >
+struct common_type_dispatch_on_rvalueness< T, U, false >
+{
+private:
+    typedef typename remove_reference<T>::type unrefed_T_type;
+    typedef typename remove_reference<U>::type unrefed_U_type;
+public:
+    typedef typename deduce_common_type<
+        T, U,
+        mpl::vector4<
+            unrefed_T_type &,
+            unrefed_U_type &,
+            typename propagate_cv< unrefed_U_type, unrefed_T_type >::type &,
+            typename propagate_cv< unrefed_T_type, unrefed_U_type >::type &
+        >
+    >::type type;
+};
+
+template< class T, class U >
+struct common_type_impl
+    : public common_type_dispatch_on_rvalueness<T,U, sizeof( ::boost::detail_type_traits_common_type::rvalue_test(
+        declval< bool >() ? declval<T>() : declval<U>() ) ) == sizeof( yes_type ) >
+{ };
+
+template< class T > struct common_type_impl< T, void > { typedef void type; };
+template< class T > struct common_type_impl< void, T > { typedef void type; };
+template<> struct common_type_impl< void, void > { typedef void type; };
+
+} // namespace detail_type_traits_common_type
+
+
+} // namespace boost
+
+#endif // BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_HPP
+
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/cv_traits_impl.hpp b/gatb-core/thirdparty/boost/type_traits/detail/cv_traits_impl.hpp
new file mode 100644
index 0000000..8e995bb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/cv_traits_impl.hpp
@@ -0,0 +1,140 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
+#define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
+
+#include <cstddef>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+
+// implementation helper:
+
+
+namespace boost {
+namespace detail {
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X
+   template <typename T>
+   struct cv_traits_imp
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = false);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+      typedef T unqualified_type;
+   };
+
+   template <typename T>
+   struct cv_traits_imp<T[]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = false);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+      typedef T unqualified_type[];
+   };
+
+   template <typename T>
+   struct cv_traits_imp<const T[]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = true);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+      typedef T unqualified_type[];
+   };
+
+   template <typename T>
+   struct cv_traits_imp<volatile T[]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = false);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+      typedef T unqualified_type[];
+   };
+
+   template <typename T>
+   struct cv_traits_imp<const volatile T[]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = true);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+      typedef T unqualified_type[];
+   };
+
+   template <typename T, std::size_t N>
+   struct cv_traits_imp<T[N]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = false);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+      typedef T unqualified_type[N];
+   };
+
+   template <typename T, std::size_t N>
+   struct cv_traits_imp<const T[N]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = true);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+      typedef T unqualified_type[N];
+   };
+
+   template <typename T, std::size_t N>
+   struct cv_traits_imp<volatile T[N]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = false);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+      typedef T unqualified_type[N];
+   };
+
+   template <typename T, std::size_t N>
+   struct cv_traits_imp<const volatile T[N]>
+   {
+      BOOST_STATIC_CONSTANT(bool, is_const = true);
+      BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+      typedef T unqualified_type[N];
+   };
+
+#else
+#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X *
+template <typename T> struct cv_traits_imp {};
+
+template <typename T>
+struct cv_traits_imp<T*>
+{
+    BOOST_STATIC_CONSTANT(bool, is_const = false);
+    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+    typedef T unqualified_type;
+};
+#endif
+
+template <typename T>
+struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const T)>
+{
+    BOOST_STATIC_CONSTANT(bool, is_const = true);
+    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
+    typedef T unqualified_type;
+};
+
+template <typename T>
+struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(volatile T)>
+{
+    BOOST_STATIC_CONSTANT(bool, is_const = false);
+    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+    typedef T unqualified_type;
+};
+
+template <typename T>
+struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const volatile T)>
+{
+    BOOST_STATIC_CONSTANT(bool, is_const = true);
+    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
+    typedef T unqualified_type;
+};
+
+} // namespace detail
+} // namespace boost 
+
+
+#endif // BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/false_result.hpp b/gatb-core/thirdparty/boost/type_traits/detail/false_result.hpp
new file mode 100644
index 0000000..e65e8bc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/false_result.hpp
@@ -0,0 +1,28 @@
+//  Copyright David Abrahams 2002. 
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
+#define BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace type_traits {
+
+// Utility class which always "returns" false
+struct false_result
+{
+    template <typename T> struct result_
+    {
+        BOOST_STATIC_CONSTANT(bool, value = false);
+    };
+};
+
+}} // namespace boost::type_traits
+
+#endif // BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/has_binary_operator.hpp b/gatb-core/thirdparty/boost/type_traits/detail/has_binary_operator.hpp
new file mode 100644
index 0000000..d82a5ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/has_binary_operator.hpp
@@ -0,0 +1,229 @@
+//  (C) Copyright 2009-2011 Frederic Bron, Robert Stewart, Steven Watanabe & Roman Perepelitsa.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#include <boost/config.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+// cannot include this header without getting warnings of the kind:
+// gcc:
+//    warning: value computed is not used
+//    warning: comparison between signed and unsigned integer expressions
+// msvc:
+//    warning C4018: '<' : signed/unsigned mismatch
+//    warning C4244: '+=' : conversion from 'double' to 'char', possible loss of data
+//    warning C4547: '*' : operator before comma has no effect; expected operator with side-effect
+//    warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
+//    warning C4804: '<' : unsafe use of type 'bool' in operation
+//    warning C4805: '==' : unsafe mix of type 'bool' and type 'char' in operation
+// cannot find another implementation -> declared as system header to suppress these warnings.
+#if defined(__GNUC__)
+#   pragma GCC system_header
+#elif defined(BOOST_MSVC)
+#   pragma warning ( push )
+#   pragma warning ( disable : 4018 4244 4547 4800 4804 4805 4913 )
+#endif
+
+namespace boost {
+namespace detail {
+
+// This namespace ensures that argument-dependent name lookup does not mess things up.
+namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {
+
+// 1. a function to have an instance of type T without requiring T to be default
+// constructible
+template <typename T> T &make();
+
+
+// 2. we provide our operator definition for types that do not have one already
+
+// a type returned from operator BOOST_TT_TRAIT_OP when no such operator is
+// found in the type's own namespace (our own operator is used) so that we have
+// a means to know that our operator was used
+struct no_operator { };
+
+// this class allows implicit conversions and makes the following operator
+// definition less-preferred than any other such operators that might be found
+// via argument-dependent name lookup
+struct any { template <class T> any(T const&); };
+
+// when operator BOOST_TT_TRAIT_OP is not available, this one is used
+no_operator operator BOOST_TT_TRAIT_OP (const any&, const any&);
+
+
+// 3. checks if the operator returns void or not
+// conditions: Lhs!=void and Rhs!=void
+
+// we first redefine "operator," so that we have no compilation error if
+// operator BOOST_TT_TRAIT_OP returns void and we can use the return type of
+// (lhs BOOST_TT_TRAIT_OP rhs, returns_void_t()) to deduce if
+// operator BOOST_TT_TRAIT_OP returns void or not:
+// - operator BOOST_TT_TRAIT_OP returns void   -> (lhs BOOST_TT_TRAIT_OP rhs, returns_void_t()) returns returns_void_t
+// - operator BOOST_TT_TRAIT_OP returns !=void -> (lhs BOOST_TT_TRAIT_OP rhs, returns_void_t()) returns int
+struct returns_void_t { };
+template <typename T> int operator,(const T&, returns_void_t);
+template <typename T> int operator,(const volatile T&, returns_void_t);
+
+// this intermediate trait has member value of type bool:
+// - value==true -> operator BOOST_TT_TRAIT_OP returns void
+// - value==false -> operator BOOST_TT_TRAIT_OP does not return void
+template < typename Lhs, typename Rhs >
+struct operator_returns_void {
+   // overloads of function returns_void make the difference
+   // yes_type and no_type have different size by construction
+   static ::boost::type_traits::yes_type returns_void(returns_void_t);
+   static ::boost::type_traits::no_type returns_void(int);
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::type_traits::yes_type)==sizeof(returns_void((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>(),returns_void_t())))));
+};
+
+
+// 4. checks if the return type is Ret or Ret==dont_care
+// conditions: Lhs!=void and Rhs!=void
+
+struct dont_care { };
+
+template < typename Lhs, typename Rhs, typename Ret, bool Returns_void >
+struct operator_returns_Ret;
+
+template < typename Lhs, typename Rhs >
+struct operator_returns_Ret < Lhs, Rhs, dont_care, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs, typename Rhs >
+struct operator_returns_Ret < Lhs, Rhs, dont_care, false > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs, typename Rhs >
+struct operator_returns_Ret < Lhs, Rhs, void, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs, typename Rhs >
+struct operator_returns_Ret < Lhs, Rhs, void, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Lhs, typename Rhs, typename Ret >
+struct operator_returns_Ret < Lhs, Rhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// otherwise checks if it is convertible to Ret using the sizeof trick
+// based on overload resolution
+// condition: Ret!=void and Ret!=dont_care and the operator does not return void
+template < typename Lhs, typename Rhs, typename Ret >
+struct operator_returns_Ret < Lhs, Rhs, Ret, false > {
+   static ::boost::type_traits::yes_type is_convertible_to_Ret(Ret); // this version is preferred for types convertible to Ret
+   static ::boost::type_traits::no_type is_convertible_to_Ret(...); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(is_convertible_to_Ret(make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 5. checks for operator existence
+// condition: Lhs!=void and Rhs!=void
+
+// checks if our definition of operator BOOST_TT_TRAIT_OP is used or an other
+// existing one;
+// this is done with redefinition of "operator," that returns no_operator or has_operator
+struct has_operator { };
+no_operator operator,(no_operator, has_operator);
+
+template < typename Lhs, typename Rhs >
+struct operator_exists {
+   static ::boost::type_traits::yes_type s_check(has_operator); // this version is preferred when operator exists
+   static ::boost::type_traits::no_type s_check(no_operator); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(s_check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 6. main trait: to avoid any compilation error, this class behaves
+// differently when operator BOOST_TT_TRAIT_OP(Lhs, Rhs) is forbidden by the
+// standard.
+// Forbidden_if is a bool that is:
+// - true when the operator BOOST_TT_TRAIT_OP(Lhs, Rhs) is forbidden by the standard
+//   (would yield compilation error if used)
+// - false otherwise
+template < typename Lhs, typename Rhs, typename Ret, bool Forbidden_if >
+struct trait_impl1;
+
+template < typename Lhs, typename Rhs, typename Ret >
+struct trait_impl1 < Lhs, Rhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Lhs, typename Rhs, typename Ret >
+struct trait_impl1 < Lhs, Rhs, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool,
+      value = (
+         ::boost::type_traits::ice_and<
+            operator_exists < Lhs, Rhs >::value,
+            operator_returns_Ret < Lhs, Rhs, Ret, operator_returns_void < Lhs, Rhs >::value >::value
+         >::value
+      )
+   );
+};
+
+// some specializations needs to be declared for the special void case
+template < typename Rhs, typename Ret >
+struct trait_impl1 < void, Rhs, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Lhs, typename Ret >
+struct trait_impl1 < Lhs, void, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Ret >
+struct trait_impl1 < void, void, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// defines some typedef for convenience
+template < typename Lhs, typename Rhs, typename Ret >
+struct trait_impl {
+   typedef typename ::boost::remove_reference<Lhs>::type Lhs_noref;
+   typedef typename ::boost::remove_reference<Rhs>::type Rhs_noref;
+   typedef typename ::boost::remove_cv<Lhs_noref>::type Lhs_nocv;
+   typedef typename ::boost::remove_cv<Rhs_noref>::type Rhs_nocv;
+   typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Lhs_noref>::type >::type >::type Lhs_noptr;
+   typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Rhs_noref>::type >::type >::type Rhs_noptr;
+   BOOST_STATIC_CONSTANT(bool, value = (trait_impl1 < Lhs_noref, Rhs_noref, Ret, BOOST_TT_FORBIDDEN_IF >::value));
+};
+
+} // namespace impl
+} // namespace detail
+
+// this is the accessible definition of the trait to end user
+BOOST_TT_AUX_BOOL_TRAIT_DEF3(BOOST_TT_TRAIT_NAME, Lhs, Rhs=Lhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl < Lhs, Rhs, Ret >::value))
+
+} // namespace boost
+
+#if defined(BOOST_MSVC)
+#   pragma warning ( pop )
+#endif
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/has_postfix_operator.hpp b/gatb-core/thirdparty/boost/type_traits/detail/has_postfix_operator.hpp
new file mode 100644
index 0000000..e9048e1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/has_postfix_operator.hpp
@@ -0,0 +1,202 @@
+//  (C) Copyright 2009-2011 Frederic Bron, Robert Stewart, Steven Watanabe & Roman Perepelitsa.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#include <boost/config.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+// avoid warnings
+#if defined(__GNUC__)
+#   pragma GCC system_header
+#elif defined(BOOST_MSVC)
+#   pragma warning ( push )
+#   pragma warning ( disable : 4244 4913 )
+#endif
+
+namespace boost {
+namespace detail {
+
+// This namespace ensures that argument-dependent name lookup does not mess things up.
+namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {
+
+// 1. a function to have an instance of type T without requiring T to be default
+// constructible
+template <typename T> T &make();
+
+
+// 2. we provide our operator definition for types that do not have one already
+
+// a type returned from operator BOOST_TT_TRAIT_OP when no such operator is
+// found in the type's own namespace (our own operator is used) so that we have
+// a means to know that our operator was used
+struct no_operator { };
+
+// this class allows implicit conversions and makes the following operator
+// definition less-preferred than any other such operators that might be found
+// via argument-dependent name lookup
+struct any { template <class T> any(T const&); };
+
+// when operator BOOST_TT_TRAIT_OP is not available, this one is used
+no_operator operator BOOST_TT_TRAIT_OP (const any&, int);
+
+
+// 3. checks if the operator returns void or not
+// conditions: Lhs!=void
+
+// we first redefine "operator," so that we have no compilation error if
+// operator BOOST_TT_TRAIT_OP returns void and we can use the return type of
+// (lhs BOOST_TT_TRAIT_OP, returns_void_t()) to deduce if
+// operator BOOST_TT_TRAIT_OP returns void or not:
+// - operator BOOST_TT_TRAIT_OP returns void   -> (lhs BOOST_TT_TRAIT_OP, returns_void_t()) returns returns_void_t
+// - operator BOOST_TT_TRAIT_OP returns !=void -> (lhs BOOST_TT_TRAIT_OP, returns_void_t()) returns int
+struct returns_void_t { };
+template <typename T> int operator,(const T&, returns_void_t);
+template <typename T> int operator,(const volatile T&, returns_void_t);
+
+// this intermediate trait has member value of type bool:
+// - value==true -> operator BOOST_TT_TRAIT_OP returns void
+// - value==false -> operator BOOST_TT_TRAIT_OP does not return void
+template < typename Lhs >
+struct operator_returns_void {
+   // overloads of function returns_void make the difference
+   // yes_type and no_type have different size by construction
+   static ::boost::type_traits::yes_type returns_void(returns_void_t);
+   static ::boost::type_traits::no_type returns_void(int);
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::type_traits::yes_type)==sizeof(returns_void((make<Lhs>() BOOST_TT_TRAIT_OP,returns_void_t())))));
+};
+
+
+// 4. checks if the return type is Ret or Ret==dont_care
+// conditions: Lhs!=void
+
+struct dont_care { };
+
+template < typename Lhs, typename Ret, bool Returns_void >
+struct operator_returns_Ret;
+
+template < typename Lhs >
+struct operator_returns_Ret < Lhs, dont_care, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs >
+struct operator_returns_Ret < Lhs, dont_care, false > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs >
+struct operator_returns_Ret < Lhs, void, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Lhs >
+struct operator_returns_Ret < Lhs, void, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Lhs, typename Ret >
+struct operator_returns_Ret < Lhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// otherwise checks if it is convertible to Ret using the sizeof trick
+// based on overload resolution
+// condition: Ret!=void and Ret!=dont_care and the operator does not return void
+template < typename Lhs, typename Ret >
+struct operator_returns_Ret < Lhs, Ret, false > {
+   static ::boost::type_traits::yes_type is_convertible_to_Ret(Ret); // this version is preferred for types convertible to Ret
+   static ::boost::type_traits::no_type is_convertible_to_Ret(...); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(is_convertible_to_Ret(make<Lhs>() BOOST_TT_TRAIT_OP))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 5. checks for operator existence
+// condition: Lhs!=void
+
+// checks if our definition of operator BOOST_TT_TRAIT_OP is used or an other
+// existing one;
+// this is done with redefinition of "operator," that returns no_operator or has_operator
+struct has_operator { };
+no_operator operator,(no_operator, has_operator);
+
+template < typename Lhs >
+struct operator_exists {
+   static ::boost::type_traits::yes_type s_check(has_operator); // this version is preferred when operator exists
+   static ::boost::type_traits::no_type s_check(no_operator); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(s_check(((make<Lhs>() BOOST_TT_TRAIT_OP),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 6. main trait: to avoid any compilation error, this class behaves
+// differently when operator BOOST_TT_TRAIT_OP(Lhs) is forbidden by the
+// standard.
+// Forbidden_if is a bool that is:
+// - true when the operator BOOST_TT_TRAIT_OP(Lhs) is forbidden by the standard
+//   (would yield compilation error if used)
+// - false otherwise
+template < typename Lhs, typename Ret, bool Forbidden_if >
+struct trait_impl1;
+
+template < typename Lhs, typename Ret >
+struct trait_impl1 < Lhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Lhs, typename Ret >
+struct trait_impl1 < Lhs, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool,
+      value = (
+         ::boost::type_traits::ice_and<
+            operator_exists < Lhs >::value,
+            operator_returns_Ret < Lhs, Ret, operator_returns_void < Lhs >::value >::value
+         >::value
+      )
+   );
+};
+
+// specialization needs to be declared for the special void case
+template < typename Ret >
+struct trait_impl1 < void, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// defines some typedef for convenience
+template < typename Lhs, typename Ret >
+struct trait_impl {
+   typedef typename ::boost::remove_reference<Lhs>::type Lhs_noref;
+   typedef typename ::boost::remove_cv<Lhs_noref>::type Lhs_nocv;
+   typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Lhs_noref>::type >::type >::type Lhs_noptr;
+   BOOST_STATIC_CONSTANT(bool, value = (trait_impl1 < Lhs_noref, Ret, BOOST_TT_FORBIDDEN_IF >::value));
+};
+
+} // namespace impl
+} // namespace detail
+
+// this is the accessible definition of the trait to end user
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(BOOST_TT_TRAIT_NAME, Lhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl< Lhs, Ret >::value))
+
+} // namespace boost
+
+#if defined(BOOST_MSVC)
+#   pragma warning ( pop )
+#endif
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/has_prefix_operator.hpp b/gatb-core/thirdparty/boost/type_traits/detail/has_prefix_operator.hpp
new file mode 100644
index 0000000..e1cf8d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/has_prefix_operator.hpp
@@ -0,0 +1,210 @@
+//  (C) Copyright 2009-2011 Frederic Bron, Robert Stewart, Steven Watanabe & Roman Perepelitsa.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#include <boost/config.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+// cannot include this header without getting warnings of the kind:
+// gcc:
+//    warning: value computed is not used
+//    warning: comparison between signed and unsigned integer expressions
+// msvc:
+//    warning C4146: unary minus operator applied to unsigned type, result still unsigned
+//    warning C4804: '-' : unsafe use of type 'bool' in operation
+// cannot find another implementation -> declared as system header to suppress these warnings.
+#if defined(__GNUC__)
+#   pragma GCC system_header
+#elif defined(BOOST_MSVC)
+#   pragma warning ( push )
+#   pragma warning ( disable : 4146 4804 4913 4244 )
+#endif
+
+namespace boost {
+namespace detail {
+
+// This namespace ensures that argument-dependent name lookup does not mess things up.
+namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {
+
+// 1. a function to have an instance of type T without requiring T to be default
+// constructible
+template <typename T> T &make();
+
+
+// 2. we provide our operator definition for types that do not have one already
+
+// a type returned from operator BOOST_TT_TRAIT_OP when no such operator is
+// found in the type's own namespace (our own operator is used) so that we have
+// a means to know that our operator was used
+struct no_operator { };
+
+// this class allows implicit conversions and makes the following operator
+// definition less-preferred than any other such operators that might be found
+// via argument-dependent name lookup
+struct any { template <class T> any(T const&); };
+
+// when operator BOOST_TT_TRAIT_OP is not available, this one is used
+no_operator operator BOOST_TT_TRAIT_OP (const any&);
+
+
+// 3. checks if the operator returns void or not
+// conditions: Rhs!=void
+
+// we first redefine "operator," so that we have no compilation error if
+// operator BOOST_TT_TRAIT_OP returns void and we can use the return type of
+// (BOOST_TT_TRAIT_OP rhs, returns_void_t()) to deduce if
+// operator BOOST_TT_TRAIT_OP returns void or not:
+// - operator BOOST_TT_TRAIT_OP returns void   -> (BOOST_TT_TRAIT_OP rhs, returns_void_t()) returns returns_void_t
+// - operator BOOST_TT_TRAIT_OP returns !=void -> (BOOST_TT_TRAIT_OP rhs, returns_void_t()) returns int
+struct returns_void_t { };
+template <typename T> int operator,(const T&, returns_void_t);
+template <typename T> int operator,(const volatile T&, returns_void_t);
+
+// this intermediate trait has member value of type bool:
+// - value==true -> operator BOOST_TT_TRAIT_OP returns void
+// - value==false -> operator BOOST_TT_TRAIT_OP does not return void
+template < typename Rhs >
+struct operator_returns_void {
+   // overloads of function returns_void make the difference
+   // yes_type and no_type have different size by construction
+   static ::boost::type_traits::yes_type returns_void(returns_void_t);
+   static ::boost::type_traits::no_type returns_void(int);
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::type_traits::yes_type)==sizeof(returns_void((BOOST_TT_TRAIT_OP make<Rhs>(),returns_void_t())))));
+};
+
+
+// 4. checks if the return type is Ret or Ret==dont_care
+// conditions: Rhs!=void
+
+struct dont_care { };
+
+template < typename Rhs, typename Ret, bool Returns_void >
+struct operator_returns_Ret;
+
+template < typename Rhs >
+struct operator_returns_Ret < Rhs, dont_care, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Rhs >
+struct operator_returns_Ret < Rhs, dont_care, false > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Rhs >
+struct operator_returns_Ret < Rhs, void, true > {
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template < typename Rhs >
+struct operator_returns_Ret < Rhs, void, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Rhs, typename Ret >
+struct operator_returns_Ret < Rhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// otherwise checks if it is convertible to Ret using the sizeof trick
+// based on overload resolution
+// condition: Ret!=void and Ret!=dont_care and the operator does not return void
+template < typename Rhs, typename Ret >
+struct operator_returns_Ret < Rhs, Ret, false > {
+   static ::boost::type_traits::yes_type is_convertible_to_Ret(Ret); // this version is preferred for types convertible to Ret
+   static ::boost::type_traits::no_type is_convertible_to_Ret(...); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(is_convertible_to_Ret(BOOST_TT_TRAIT_OP make<Rhs>()))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 5. checks for operator existence
+// condition: Rhs!=void
+
+// checks if our definition of operator BOOST_TT_TRAIT_OP is used or an other
+// existing one;
+// this is done with redefinition of "operator," that returns no_operator or has_operator
+struct has_operator { };
+no_operator operator,(no_operator, has_operator);
+
+template < typename Rhs >
+struct operator_exists {
+   static ::boost::type_traits::yes_type s_check(has_operator); // this version is preferred when operator exists
+   static ::boost::type_traits::no_type s_check(no_operator); // this version is used otherwise
+
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(s_check(((BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
+};
+
+
+// 6. main trait: to avoid any compilation error, this class behaves
+// differently when operator BOOST_TT_TRAIT_OP(Rhs) is forbidden by the
+// standard.
+// Forbidden_if is a bool that is:
+// - true when the operator BOOST_TT_TRAIT_OP(Rhs) is forbidden by the standard
+//   (would yield compilation error if used)
+// - false otherwise
+template < typename Rhs, typename Ret, bool Forbidden_if >
+struct trait_impl1;
+
+template < typename Rhs, typename Ret >
+struct trait_impl1 < Rhs, Ret, true > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template < typename Rhs, typename Ret >
+struct trait_impl1 < Rhs, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool,
+      value = (
+         ::boost::type_traits::ice_and<
+            operator_exists < Rhs >::value,
+            operator_returns_Ret < Rhs, Ret, operator_returns_void < Rhs >::value >::value
+         >::value
+      )
+   );
+};
+
+// specialization needs to be declared for the special void case
+template < typename Ret >
+struct trait_impl1 < void, Ret, false > {
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+// defines some typedef for convenience
+template < typename Rhs, typename Ret >
+struct trait_impl {
+   typedef typename ::boost::remove_reference<Rhs>::type Rhs_noref;
+   typedef typename ::boost::remove_cv<Rhs_noref>::type Rhs_nocv;
+   typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Rhs_noref>::type >::type >::type Rhs_noptr;
+   BOOST_STATIC_CONSTANT(bool, value = (trait_impl1 < Rhs_noref, Ret, BOOST_TT_FORBIDDEN_IF >::value));
+};
+
+} // namespace impl
+} // namespace detail
+
+// this is the accessible definition of the trait to end user
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(BOOST_TT_TRAIT_NAME, Rhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl < Rhs, Ret >::value))
+
+} // namespace boost
+
+#if defined(BOOST_MSVC)
+#   pragma warning ( pop )
+#endif
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/ice_and.hpp b/gatb-core/thirdparty/boost/type_traits/detail/ice_and.hpp
new file mode 100644
index 0000000..8b461b9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/ice_and.hpp
@@ -0,0 +1,35 @@
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED
+#define BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace type_traits {
+
+template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
+struct ice_and;
+
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_and
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <>
+struct ice_and<true, true, true, true, true, true, true>
+{
+    BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_ICE_AND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/ice_eq.hpp b/gatb-core/thirdparty/boost/type_traits/detail/ice_eq.hpp
new file mode 100644
index 0000000..ea42a60
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/ice_eq.hpp
@@ -0,0 +1,36 @@
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED
+#define BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace type_traits {
+
+template <int b1, int b2>
+struct ice_eq
+{
+    BOOST_STATIC_CONSTANT(bool, value = (b1 == b2));
+};
+
+template <int b1, int b2>
+struct ice_ne
+{
+    BOOST_STATIC_CONSTANT(bool, value = (b1 != b2));
+};
+
+#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+template <int b1, int b2> bool const ice_eq<b1,b2>::value;
+template <int b1, int b2> bool const ice_ne<b1,b2>::value;
+#endif
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_ICE_EQ_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/ice_not.hpp b/gatb-core/thirdparty/boost/type_traits/detail/ice_not.hpp
new file mode 100644
index 0000000..ee1dca0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/ice_not.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED
+#define BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace type_traits {
+
+template <bool b>
+struct ice_not
+{
+    BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template <>
+struct ice_not<true>
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_ICE_NOT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/ice_or.hpp b/gatb-core/thirdparty/boost/type_traits/detail/ice_or.hpp
new file mode 100644
index 0000000..f88d9f6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/ice_or.hpp
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED
+#define BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace type_traits {
+
+template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
+struct ice_or;
+
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_or
+{
+    BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template <>
+struct ice_or<false, false, false, false, false, false, false>
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_ICE_OR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_helper.hpp b/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_helper.hpp
new file mode 100644
index 0000000..1c3b17f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_helper.hpp
@@ -0,0 +1,168 @@
+
+//  Copyright 2000 John Maddock (john at johnmaddock.co.uk)
+//  Copyright 2002 Aleksey Gurtovoy (agurtovoy at meta-comm.com)
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED
+#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+#if defined(BOOST_TT_PREPROCESSING_MODE)
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/enum_params.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#endif
+
+namespace boost {
+namespace type_traits {
+
+template <class R>
+struct is_function_ptr_helper
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+#if !defined(BOOST_TT_PREPROCESSING_MODE)
+// preprocessor-generated part, don't edit by hand!
+
+template <class R >
+struct is_function_ptr_helper<R (*)()> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R >
+struct is_function_ptr_helper<R (*)( ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+#else
+
+#undef BOOST_STATIC_CONSTANT
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3, (0, 25, "boost/type_traits/detail/is_function_ptr_helper.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif // BOOST_TT_PREPROCESSING_MODE
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)
+
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_function_ptr_helper<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))> { BOOST_STATIC_CONSTANT(bool, value = true); };
+@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_function_ptr_helper<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };
+@#endif
+#undef BOOST_PP_COUNTER
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_tester.hpp b/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_tester.hpp
new file mode 100644
index 0000000..2eb8a6f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/is_function_ptr_tester.hpp
@@ -0,0 +1,440 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED
+#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/config.hpp>
+
+#if defined(BOOST_TT_PREPROCESSING_MODE)
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/enum_params.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#endif
+
+namespace boost {
+namespace type_traits {
+
+// Note it is acceptable to use ellipsis here, since the argument will
+// always be a pointer type of some sort (JM 2005/06/04):
+no_type BOOST_TT_DECL is_function_ptr_tester(...);
+
+#if !defined(BOOST_TT_PREPROCESSING_MODE)
+// pre-processed code, don't edit, try GNU cpp with 
+// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename
+
+template <class R >
+yes_type is_function_ptr_tester(R (*)());
+template <class R >
+yes_type is_function_ptr_tester(R (*)( ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R >
+yes_type is_function_ptr_tester(R (__stdcall*)());
+#ifndef _MANAGED
+template <class R >
+yes_type is_function_ptr_tester(R (__fastcall*)());
+#endif
+template <class R >
+yes_type is_function_ptr_tester(R (__cdecl*)());
+#endif
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (*)( T0));
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (*)( T0 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0));
+#ifndef _MANAGED
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0));
+#endif
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0));
+#endif
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1));
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1));
+#endif
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1));
+#endif
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2));
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2));
+#endif
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3));
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+#ifndef _MANAGED
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+#endif
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+#endif
+#else
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3, (0, 25, "boost/type_traits/detail/is_function_ptr_tester.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif // BOOST_TT_PREPROCESSING_MODE
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)
+#undef __stdcall
+#undef __fastcall
+#undef __cdecl
+
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...));
+@#endif
+@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_function_ptr_tester(R (__stdcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+@#ifndef _MANAGED
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_function_ptr_tester(R (__fastcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+@#endif
+template <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_function_ptr_tester(R (__cdecl*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+@#endif
+
+#undef BOOST_PP_COUNTER
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp b/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
new file mode 100644
index 0000000..bd5c591
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
@@ -0,0 +1,713 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED
+#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_TT_PREPROCESSING_MODE)
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/enum_params.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#endif
+
+namespace boost {
+namespace type_traits {
+
+template <typename T>
+struct is_mem_fun_pointer_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+#if !defined(BOOST_TT_PREPROCESSING_MODE)
+// pre-processed code, don't edit, try GNU cpp with 
+// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+#endif
+
+#else
+
+#undef BOOST_STATIC_CONSTANT
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3, (0, 25, "boost/type_traits/detail/is_mem_fun_pointer_impl.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif // BOOST_TT_PREPROCESSING_MODE
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };
+@#endif
+
+@#if !defined(BOOST_TT_NO_CV_FUNC_TEST)
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>
+struct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };
+@#endif
+@#endif
+
+#undef BOOST_PP_COUNTER
+#endif // BOOST_PP_IS_ITERATING
+
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp b/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
new file mode 100644
index 0000000..334a843
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
@@ -0,0 +1,1790 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED
+#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/config.hpp>
+
+#if defined(BOOST_TT_PREPROCESSING_MODE)
+#   include <boost/preprocessor/iterate.hpp>
+#   include <boost/preprocessor/enum_params.hpp>
+#   include <boost/preprocessor/comma_if.hpp>
+#endif
+
+namespace boost {
+namespace type_traits {
+
+no_type BOOST_TT_DECL is_mem_fun_pointer_tester(...);
+
+#if !defined(BOOST_TT_PREPROCESSING_MODE)
+// pre-processed code, don't edit, try GNU cpp with 
+// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...));
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const volatile);
+
+#ifndef _MANAGED
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const volatile);
+
+#endif
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const volatile);
+
+#endif
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const volatile);
+
+#endif
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);
+
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+#endif
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);
+#ifdef BOOST_TT_TEST_MS_FUNC_SIGS
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+#ifndef _MANAGED
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+#endif
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+#endif
+
+#else
+
+#define BOOST_PP_ITERATION_PARAMS_1 \
+    (3, (0, 25, "boost/type_traits/detail/is_mem_fun_pointer_tester.hpp"))
+#include BOOST_PP_ITERATE()
+
+#endif // BOOST_TT_PREPROCESSING_MODE
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED
+
+///// iteration
+
+#else
+#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)
+#undef __stdcall
+#undef __fastcall
+#undef __cdecl
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);
+
+@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...));
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile);
+@#endif
+@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS // Other calling conventions used by MS compatible compilers:
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);
+
+@#ifndef _MANAGED
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);
+
+@#endif
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);
+
+template <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);
+
+@#endif
+
+#undef BOOST_PP_COUNTER
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_def.hpp b/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_def.hpp
new file mode 100644
index 0000000..8cea9b4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_def.hpp
@@ -0,0 +1,51 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#include <boost/type_traits/detail/template_arity_spec.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+#include <boost/mpl/size_t.hpp>
+
+#include <cstddef>
+
+// Obsolete. Remove.
+#define BOOST_TT_AUX_SIZE_T_BASE(C) public ::boost::integral_constant<std::size_t,C>
+#define BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) /**/
+
+
+#define BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(trait,T,C) \
+template< typename T > struct trait \
+    : public ::boost::integral_constant<std::size_t,C> \
+{ \
+public:\
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
+}; \
+\
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
+/**/
+
+#define BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(trait,spec,C) \
+template<> struct trait<spec> \
+    : public ::boost::integral_constant<std::size_t,C> \
+{ \
+public:\
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,C) \
+template< param > struct trait<spec> \
+    : public ::boost::integral_constant<std::size_t,C> \
+{ \
+}; \
+/**/
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_undef.hpp b/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_undef.hpp
new file mode 100644
index 0000000..1694fac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/size_t_trait_undef.hpp
@@ -0,0 +1,16 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#undef BOOST_TT_AUX_SIZE_T_TRAIT_DEF1
+#undef BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1
+#undef BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/template_arity_spec.hpp b/gatb-core/thirdparty/boost/type_traits/detail/template_arity_spec.hpp
new file mode 100644
index 0000000..fe9b422
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/template_arity_spec.hpp
@@ -0,0 +1,31 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/aux_/template_arity_fwd.hpp>
+#include <boost/mpl/aux_/preprocessor/params.hpp>
+#include <boost/mpl/aux_/config/lambda.hpp>
+#include <boost/mpl/aux_/config/overload_resolution.hpp>
+
+#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \
+    && defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION)
+#   define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) \
+namespace mpl { namespace aux { \
+template< BOOST_MPL_PP_PARAMS(i, typename T) > \
+struct template_arity< \
+          name< BOOST_MPL_PP_PARAMS(i, T) > \
+        > \
+    : int_<i> \
+{ \
+}; \
+}} \
+/**/
+#else
+#   define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) /**/
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/type_trait_def.hpp b/gatb-core/thirdparty/boost/type_traits/detail/type_trait_def.hpp
new file mode 100644
index 0000000..bc54696
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/type_trait_def.hpp
@@ -0,0 +1,67 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#include <boost/type_traits/detail/template_arity_spec.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#define BOOST_TT_AUX_TYPE_TRAIT_DEF1(trait,T,result) \
+template< typename T > struct trait \
+{ \
+public:\
+    typedef result type; \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
+}; \
+\
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
+/**/
+
+#define BOOST_TT_AUX_TYPE_TRAIT_SPEC1(trait,spec,result) \
+template<> struct trait<spec> \
+{ \
+public:\
+    typedef result type; \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \
+}; \
+/**/
+
+#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(trait,spec,result) \
+template<> struct trait##_impl<spec> \
+{ \
+public:\
+    typedef result type; \
+}; \
+/**/
+
+#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,result) \
+template< param > struct trait<spec> \
+{ \
+public:\
+    typedef result type; \
+}; \
+/**/
+
+#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(param1,param2,trait,spec,result) \
+template< param1, param2 > struct trait<spec> \
+{ \
+public:\
+    typedef result; \
+}; \
+/**/
+
+#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(param,trait,spec,result) \
+template< param > struct trait##_impl<spec> \
+{ \
+public:\
+    typedef result type; \
+}; \
+/**/
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/type_trait_undef.hpp b/gatb-core/thirdparty/boost/type_traits/detail/type_trait_undef.hpp
new file mode 100644
index 0000000..d8edf66
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/type_trait_undef.hpp
@@ -0,0 +1,19 @@
+
+// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// $Source$
+// $Date$
+// $Revision$
+
+#undef BOOST_TT_AUX_TYPE_TRAIT_DEF1
+#undef BOOST_TT_AUX_TYPE_TRAIT_SPEC1
+#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1
+#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1
+#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2
+#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/wrap.hpp b/gatb-core/thirdparty/boost/type_traits/detail/wrap.hpp
new file mode 100644
index 0000000..d0a75d0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/wrap.hpp
@@ -0,0 +1,18 @@
+//  (C) Copyright David Abrahams 2002. 
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
+#define BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
+
+namespace boost {
+namespace type_traits {
+
+template <class T> struct wrap {};
+
+}} // namespace boost::type_traits
+
+#endif // BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/detail/yes_no_type.hpp b/gatb-core/thirdparty/boost/type_traits/detail/yes_no_type.hpp
new file mode 100644
index 0000000..f583730
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/detail/yes_no_type.hpp
@@ -0,0 +1,26 @@
+
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  macros and helpers for working with integral-constant-expressions.
+
+#ifndef BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED
+#define BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED
+
+namespace boost {
+namespace type_traits {
+
+typedef char yes_type;
+struct no_type
+{
+   char padding[8];
+};
+
+} // namespace type_traits
+} // namespace boost
+
+#endif // BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/extent.hpp b/gatb-core/thirdparty/boost/type_traits/extent.hpp
new file mode 100644
index 0000000..c41f7f2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/extent.hpp
@@ -0,0 +1,141 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_EXTENT_HPP_INCLUDED
+#define BOOST_TT_EXTENT_HPP_INCLUDED
+
+// should be the last #include
+#include <boost/type_traits/detail/size_t_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+#if defined( __CODEGEARC__ )
+    // wrap the impl as main trait provides additional MPL lambda support
+    template < typename T, std::size_t N >
+    struct extent_imp {
+        static const std::size_t value = __array_extent(T, N);
+    };
+
+#else
+
+template <class T, std::size_t N>
+struct extent_imp
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = 0);
+};
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+template <class T, std::size_t R, std::size_t N>
+struct extent_imp<T[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct extent_imp<T const[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct extent_imp<T volatile[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct extent_imp<T const volatile[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+
+template <class T, std::size_t R>
+struct extent_imp<T[R],0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = R);
+};
+
+template <class T, std::size_t R>
+struct extent_imp<T const[R], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = R);
+};
+
+template <class T, std::size_t R>
+struct extent_imp<T volatile[R], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = R);
+};
+
+template <class T, std::size_t R>
+struct extent_imp<T const volatile[R], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = R);
+};
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) && !defined(__MWERKS__)
+template <class T, std::size_t N>
+struct extent_imp<T[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+template <class T, std::size_t N>
+struct extent_imp<T const[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+template <class T, std::size_t N>
+struct extent_imp<T volatile[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+template <class T, std::size_t N>
+struct extent_imp<T const volatile[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::extent_imp<T, N-1>::value));
+};
+template <class T>
+struct extent_imp<T[], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = 0);
+};
+template <class T>
+struct extent_imp<T const[], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = 0);
+};
+template <class T>
+struct extent_imp<T volatile[], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = 0);
+};
+template <class T>
+struct extent_imp<T const volatile[], 0>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = 0);
+};
+#endif
+#endif
+
+#endif  // non-CodeGear implementation
+}   // ::boost::detail
+
+template <class T, std::size_t N = 0>
+struct extent
+   : public ::boost::integral_constant<std::size_t, ::boost::detail::extent_imp<T,N>::value>
+{
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,extent,(T))
+};
+
+} // namespace boost
+
+#include <boost/type_traits/detail/size_t_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/floating_point_promotion.hpp b/gatb-core/thirdparty/boost/type_traits/floating_point_promotion.hpp
new file mode 100644
index 0000000..8b6ae3a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/floating_point_promotion.hpp
@@ -0,0 +1,91 @@
+// Copyright 2005 Alexander Nasonov.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
+#define FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_NO_CV_SPECIALIZATIONS
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/multiplies.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#endif
+
+// Should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace type_traits { namespace detail {
+
+#ifndef BOOST_NO_CV_SPECIALIZATIONS
+
+template<class T>
+struct floating_point_promotion
+{
+    typedef T type;
+};
+
+template<>
+struct floating_point_promotion<float>
+{
+    typedef double type;
+};
+
+template<>
+struct floating_point_promotion<float const>
+{
+    typedef double const type;
+};
+
+template<>
+struct floating_point_promotion<float volatile>
+{
+    typedef double volatile type;
+};
+
+template<>
+struct floating_point_promotion<float const volatile>
+{
+    typedef double const volatile type;
+};
+
+#else
+
+template<class T>
+struct floating_point_promotion
+  : mpl::at<
+        mpl::vector< T, double, double const, double volatile,
+                     double const volatile >
+      , mpl::plus<
+            is_same<T, float>
+          , mpl::multiplies< is_same<T, float const>         , mpl::int_<2> >
+          , mpl::multiplies< is_same<T, float volatile>      , mpl::int_<3> >
+          , mpl::multiplies< is_same<T, float const volatile>, mpl::int_<4> >
+          >
+      >
+{
+};
+
+#endif
+
+} }
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(
+      floating_point_promotion
+    , T
+    , BOOST_DEDUCED_TYPENAME
+        boost::type_traits::detail::floating_point_promotion<T>::type
+    )
+}
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // #ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/function_traits.hpp b/gatb-core/thirdparty/boost/type_traits/function_traits.hpp
new file mode 100644
index 0000000..26d7e05
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/function_traits.hpp
@@ -0,0 +1,174 @@
+
+//  Copyright 2000 John Maddock (john at johnmaddock.co.uk)
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
+#define BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template<typename Function> struct function_traits_helper;
+
+template<typename R>
+struct function_traits_helper<R (*)(void)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 0);
+  typedef R result_type;
+};
+
+template<typename R, typename T1>
+struct function_traits_helper<R (*)(T1)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 1);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T1 argument_type;
+};
+
+template<typename R, typename T1, typename T2>
+struct function_traits_helper<R (*)(T1, T2)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 2);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T1 first_argument_type;
+  typedef T2 second_argument_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3>
+struct function_traits_helper<R (*)(T1, T2, T3)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 3);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4>
+struct function_traits_helper<R (*)(T1, T2, T3, T4)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 4);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 5);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5, typename T6>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 6);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+  typedef T6 arg6_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5, typename T6, typename T7>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 7);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+  typedef T6 arg6_type;
+  typedef T7 arg7_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5, typename T6, typename T7, typename T8>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 8);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+  typedef T6 arg6_type;
+  typedef T7 arg7_type;
+  typedef T8 arg8_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5, typename T6, typename T7, typename T8, typename T9>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 9);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+  typedef T6 arg6_type;
+  typedef T7 arg7_type;
+  typedef T8 arg8_type;
+  typedef T9 arg9_type;
+};
+
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+         typename T5, typename T6, typename T7, typename T8, typename T9,
+         typename T10>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
+{
+  BOOST_STATIC_CONSTANT(unsigned, arity = 10);
+  typedef R result_type;
+  typedef T1 arg1_type;
+  typedef T2 arg2_type;
+  typedef T3 arg3_type;
+  typedef T4 arg4_type;
+  typedef T5 arg5_type;
+  typedef T6 arg6_type;
+  typedef T7 arg7_type;
+  typedef T8 arg8_type;
+  typedef T9 arg9_type;
+  typedef T10 arg10_type;
+};
+
+} // end namespace detail
+
+template<typename Function>
+struct function_traits : 
+  public boost::detail::function_traits_helper<typename boost::add_pointer<Function>::type>
+{
+};
+
+}
+
+#endif // BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_and.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_and.hpp
new file mode 100644
index 0000000..ee3307f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_and.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_AND_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_AND_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_and
+#define BOOST_TT_TRAIT_OP &
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_and_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_and_assign.hpp
new file mode 100644
index 0000000..5b3112a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_and_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_AND_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_AND_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_and_assign
+#define BOOST_TT_TRAIT_OP &=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_or.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_or.hpp
new file mode 100644
index 0000000..922b4ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_or.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_OR_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_OR_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_or
+#define BOOST_TT_TRAIT_OP |
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_or_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_or_assign.hpp
new file mode 100644
index 0000000..5481b92
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_or_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_OR_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_OR_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_or_assign
+#define BOOST_TT_TRAIT_OP |=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_xor.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_xor.hpp
new file mode 100644
index 0000000..883dcf6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_xor.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_XOR_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_XOR_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_xor
+#define BOOST_TT_TRAIT_OP ^
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_bit_xor_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_bit_xor_assign.hpp
new file mode 100644
index 0000000..e2767cc
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_bit_xor_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_BIT_XOR_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_BIT_XOR_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_bit_xor_assign
+#define BOOST_TT_TRAIT_OP ^=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_complement.hpp b/gatb-core/thirdparty/boost/type_traits/has_complement.hpp
new file mode 100644
index 0000000..dafd9f5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_complement.hpp
@@ -0,0 +1,32 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_COMPLEMENT_HPP_INCLUDED
+#define BOOST_TT_HAS_COMPLEMENT_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_complement
+#define BOOST_TT_TRAIT_OP ~
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* pointer */\
+      ::boost::is_pointer< Rhs_noref >::value,\
+      /* fundamental non integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_dereference.hpp b/gatb-core/thirdparty/boost/type_traits/has_dereference.hpp
new file mode 100644
index 0000000..fe48e11
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_dereference.hpp
@@ -0,0 +1,31 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
+#define BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_dereference
+#define BOOST_TT_TRAIT_OP *
+#define BOOST_TT_FORBIDDEN_IF\
+   /* void* or fundamental */\
+   ::boost::type_traits::ice_or<\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value\
+      >::value,\
+      ::boost::is_fundamental< Rhs_nocv >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_divides.hpp b/gatb-core/thirdparty/boost/type_traits/has_divides.hpp
new file mode 100644
index 0000000..277c2da
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_divides.hpp
@@ -0,0 +1,40 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_DIVIDES_HPP_INCLUDED
+#define BOOST_TT_HAS_DIVIDES_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_divides
+#define BOOST_TT_TRAIT_OP /
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer with pointer or fundamental */\
+   ::boost::type_traits::ice_or<\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value\
+      >::value,\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_divides_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_divides_assign.hpp
new file mode 100644
index 0000000..b21a05a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_divides_assign.hpp
@@ -0,0 +1,47 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_DIVIDES_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_DIVIDES_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_divides_assign
+#define BOOST_TT_TRAIT_OP /=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Lhs==const and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and (Rhs==fundamental or Rhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value\
+      >::value,\
+      /* Rhs==pointer and (Lhs==fundamental or Lhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_equal_to.hpp b/gatb-core/thirdparty/boost/type_traits/has_equal_to.hpp
new file mode 100644
index 0000000..c2245c2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_equal_to.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_EQUAL_TO_HPP_INCLUDED
+#define BOOST_TT_HAS_EQUAL_TO_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_equal_to
+#define BOOST_TT_TRAIT_OP ==
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_greater.hpp b/gatb-core/thirdparty/boost/type_traits/has_greater.hpp
new file mode 100644
index 0000000..ce32658
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_greater.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_GREATER_HPP_INCLUDED
+#define BOOST_TT_HAS_GREATER_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_greater
+#define BOOST_TT_TRAIT_OP >
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_greater_equal.hpp b/gatb-core/thirdparty/boost/type_traits/has_greater_equal.hpp
new file mode 100644
index 0000000..681685a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_greater_equal.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_GREATER_EQUAL_HPP_INCLUDED
+#define BOOST_TT_HAS_GREATER_EQUAL_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_greater_equal
+#define BOOST_TT_TRAIT_OP >=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_left_shift.hpp b/gatb-core/thirdparty/boost/type_traits/has_left_shift.hpp
new file mode 100644
index 0000000..88205d9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_left_shift.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LEFT_SHIFT_HPP_INCLUDED
+#define BOOST_TT_HAS_LEFT_SHIFT_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_left_shift
+#define BOOST_TT_TRAIT_OP <<
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_left_shift_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_left_shift_assign.hpp
new file mode 100644
index 0000000..0b3b9b1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_left_shift_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LEFT_SHIFT_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_LEFT_SHIFT_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_left_shift_assign
+#define BOOST_TT_TRAIT_OP <<=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_less.hpp b/gatb-core/thirdparty/boost/type_traits/has_less.hpp
new file mode 100644
index 0000000..e1a045e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_less.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LESS_HPP_INCLUDED
+#define BOOST_TT_HAS_LESS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_less
+#define BOOST_TT_TRAIT_OP <
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_less_equal.hpp b/gatb-core/thirdparty/boost/type_traits/has_less_equal.hpp
new file mode 100644
index 0000000..c633b8b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_less_equal.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LESS_EQUAL_HPP_INCLUDED
+#define BOOST_TT_HAS_LESS_EQUAL_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_less_equal
+#define BOOST_TT_TRAIT_OP <=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_logical_and.hpp b/gatb-core/thirdparty/boost/type_traits/has_logical_and.hpp
new file mode 100644
index 0000000..5bfa1c3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_logical_and.hpp
@@ -0,0 +1,40 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LOGICAL_AND_HPP_INCLUDED
+#define BOOST_TT_HAS_LOGICAL_AND_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_logical_and
+#define BOOST_TT_TRAIT_OP &&
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer with fundamental non convertible to bool */\
+   ::boost::type_traits::ice_or<\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_and<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_convertible< Rhs_nocv, bool >::value >::value\
+         >::value\
+      >::value,\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_and<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_convertible< Lhs_nocv, bool >::value >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_logical_not.hpp b/gatb-core/thirdparty/boost/type_traits/has_logical_not.hpp
new file mode 100644
index 0000000..d36858e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_logical_not.hpp
@@ -0,0 +1,32 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LOGICAL_NOT_HPP_INCLUDED
+#define BOOST_TT_HAS_LOGICAL_NOT_HPP_INCLUDED
+
+#if defined(__GNUC__) && (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ > 40800)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-value"
+#endif
+
+#define BOOST_TT_TRAIT_NAME has_logical_not
+#define BOOST_TT_TRAIT_OP !
+#define BOOST_TT_FORBIDDEN_IF\
+   false
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#if defined(__GNUC__) && (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ > 40800)
+#pragma GCC diagnostic pop
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_logical_or.hpp b/gatb-core/thirdparty/boost/type_traits/has_logical_or.hpp
new file mode 100644
index 0000000..a4ae6c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_logical_or.hpp
@@ -0,0 +1,40 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_LOGICAL_OR_HPP_INCLUDED
+#define BOOST_TT_HAS_LOGICAL_OR_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_logical_or
+#define BOOST_TT_TRAIT_OP ||
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer with fundamental non convertible to bool */\
+   ::boost::type_traits::ice_or<\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_and<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_convertible< Rhs_nocv, bool >::value >::value\
+         >::value\
+      >::value,\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_and<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_convertible< Lhs_nocv, bool >::value >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_minus.hpp b/gatb-core/thirdparty/boost/type_traits/has_minus.hpp
new file mode 100644
index 0000000..cc1d06b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_minus.hpp
@@ -0,0 +1,60 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MINUS_HPP_INCLUDED
+#define BOOST_TT_HAS_MINUS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_minus
+#define BOOST_TT_TRAIT_OP -
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+      >::value,\
+      /* Lhs==void* and (Rhs==fundamental or Rhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value\
+      >::value,\
+      /* Rhs==void* and (Lhs==fundamental or Lhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value\
+      >::value,\
+      /* Lhs=fundamental and Rhs=pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* two different pointers */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_same< Lhs_nocv, Rhs_nocv >::value >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_minus_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_minus_assign.hpp
new file mode 100644
index 0000000..84ba359
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_minus_assign.hpp
@@ -0,0 +1,65 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MINUS_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_MINUS_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_minus_assign
+#define BOOST_TT_TRAIT_OP -=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+      >::value,\
+      /* Lhs==void* and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==void* and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs=fundamental and Rhs=pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* (Lhs==fundamental or Lhs==pointer) and (Rhs==fundamental or Rhs==pointer) and (Lhs==const) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_modulus.hpp b/gatb-core/thirdparty/boost/type_traits/has_modulus.hpp
new file mode 100644
index 0000000..6948728
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_modulus.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MODULUS_HPP_INCLUDED
+#define BOOST_TT_HAS_MODULUS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_modulus
+#define BOOST_TT_TRAIT_OP %
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_modulus_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_modulus_assign.hpp
new file mode 100644
index 0000000..f0531f0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_modulus_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MODULUS_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_MODULUS_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_modulus_assign
+#define BOOST_TT_TRAIT_OP %=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_multiplies.hpp b/gatb-core/thirdparty/boost/type_traits/has_multiplies.hpp
new file mode 100644
index 0000000..4b578c5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_multiplies.hpp
@@ -0,0 +1,40 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MULTIPLIES_HPP_INCLUDED
+#define BOOST_TT_HAS_MULTIPLIES_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_multiplies
+#define BOOST_TT_TRAIT_OP *
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer with pointer or fundamental */\
+   ::boost::type_traits::ice_or<\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value\
+      >::value,\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_multiplies_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_multiplies_assign.hpp
new file mode 100644
index 0000000..1678b7b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_multiplies_assign.hpp
@@ -0,0 +1,47 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_MULTIPLIES_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_MULTIPLIES_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_multiplies_assign
+#define BOOST_TT_TRAIT_OP *=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Lhs==const and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and (Rhs==fundamental or Rhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value\
+      >::value,\
+      /* Rhs==pointer and (Lhs==fundamental or Lhs==pointer) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_negate.hpp b/gatb-core/thirdparty/boost/type_traits/has_negate.hpp
new file mode 100644
index 0000000..452e54a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_negate.hpp
@@ -0,0 +1,25 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NEGATE_HPP_INCLUDED
+#define BOOST_TT_HAS_NEGATE_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_negate
+#define BOOST_TT_TRAIT_OP -
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer */\
+   ::boost::is_pointer< Rhs_noref >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_new_operator.hpp b/gatb-core/thirdparty/boost/type_traits/has_new_operator.hpp
new file mode 100644
index 0000000..c615127
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_new_operator.hpp
@@ -0,0 +1,154 @@
+
+//  (C) Copyright Runar Undheim, Robert Ramey & John Maddock 2008.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
+#define BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
+
+#include <new> // std::nothrow_t
+#include <cstddef> // std::size_t
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+#if defined(new) 
+#  if BOOST_WORKAROUND(BOOST_MSVC, >= 1310)
+#     define BOOST_TT_AUX_MACRO_NEW_DEFINED
+#     pragma push_macro("new")
+#     undef new
+#  else
+#     error "Sorry but you can't include this header if 'new' is defined as a macro."
+#  endif
+#endif
+
+namespace boost {
+namespace detail {
+    template <class U, U x> 
+    struct test;
+
+    template <typename T>
+    struct has_new_operator_impl {
+        template<class U>
+        static type_traits::yes_type check_sig1(
+            U*, 
+            test<
+            void *(*)(std::size_t),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig1(...);
+
+        template<class U>
+        static type_traits::yes_type check_sig2(
+            U*, 
+            test<
+            void *(*)(std::size_t, const std::nothrow_t&),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig2(...);
+
+        template<class U>
+        static type_traits::yes_type check_sig3(
+            U*, 
+            test<
+            void *(*)(std::size_t, void*),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig3(...);
+
+
+        template<class U>
+        static type_traits::yes_type check_sig4(
+            U*, 
+            test<
+            void *(*)(std::size_t),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig4(...);
+
+        template<class U>
+        static type_traits::yes_type check_sig5(
+            U*, 
+            test<
+            void *(*)(std::size_t, const std::nothrow_t&),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig5(...);
+
+        template<class U>
+        static type_traits::yes_type check_sig6(
+            U*, 
+            test<
+            void *(*)(std::size_t, void*),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig6(...);
+
+        // GCC2 won't even parse this template if we embed the computation
+        // of s1 in the computation of value.
+        #ifdef __GNUC__
+            BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl<T>::template check_sig1<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(has_new_operator_impl<T>::template check_sig2<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(has_new_operator_impl<T>::template check_sig3<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(has_new_operator_impl<T>::template check_sig4<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(has_new_operator_impl<T>::template check_sig5<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(has_new_operator_impl<T>::template check_sig6<T>(0)));
+        #else
+            #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+                #pragma warning(push)
+                #pragma warning(disable:6334)
+            #endif
+
+            BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig1<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(check_sig2<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(check_sig3<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(check_sig4<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(check_sig5<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(check_sig6<T>(0)));
+
+            #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+                #pragma warning(pop)
+            #endif
+        #endif
+        BOOST_STATIC_CONSTANT(bool, value = 
+           (::boost::type_traits::ice_or<
+            (s1 == sizeof(type_traits::yes_type)),
+            (s2 == sizeof(type_traits::yes_type)),
+            (s3 == sizeof(type_traits::yes_type)),
+            (s4 == sizeof(type_traits::yes_type)),
+            (s5 == sizeof(type_traits::yes_type)),
+            (s6 == sizeof(type_traits::yes_type))
+           >::value)
+        );
+    };
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_new_operator,T,::boost::detail::has_new_operator_impl<T>::value)
+
+} // namespace boost
+
+#if defined(BOOST_TT_AUX_MACRO_NEW_DEFINED)
+#  pragma pop_macro("new")
+#endif
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_not_equal_to.hpp b/gatb-core/thirdparty/boost/type_traits/has_not_equal_to.hpp
new file mode 100644
index 0000000..e7e3700
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_not_equal_to.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NOT_EQUAL_TO_HPP_INCLUDED
+#define BOOST_TT_HAS_NOT_EQUAL_TO_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_not_equal_to
+#define BOOST_TT_TRAIT_OP !=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::type_traits::ice_not<\
+            ::boost::type_traits::ice_or<\
+               ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
+               ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
+               ::boost::is_void< Lhs_noptr >::value,\
+               ::boost::is_void< Rhs_noptr >::value\
+            >::value\
+         >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_nothrow_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_nothrow_assign.hpp
new file mode 100644
index 0000000..83e5968
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_nothrow_assign.hpp
@@ -0,0 +1,44 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_assign.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <class T>
+struct has_nothrow_assign_imp{
+#ifndef BOOST_HAS_NOTHROW_ASSIGN
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_assign<T>::value);
+#else
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_ASSIGN(T));
+#endif
+};
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_assign,T,::boost::detail::has_nothrow_assign_imp<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_nothrow_constructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_nothrow_constructor.hpp
new file mode 100644
index 0000000..3bc4f80
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_nothrow_constructor.hpp
@@ -0,0 +1,53 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_constructor.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <class T>
+struct has_nothrow_constructor_imp{
+#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_CONSTRUCTOR(T));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_constructor<T>::value);
+#endif
+};
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_constructor,T,::boost::detail::has_nothrow_constructor_imp<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_default_constructor,T,::boost::detail::has_nothrow_constructor_imp<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void volatile,false)
+#endif
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_nothrow_copy.hpp b/gatb-core/thirdparty/boost/type_traits/has_nothrow_copy.hpp
new file mode 100644
index 0000000..9c3c903
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_nothrow_copy.hpp
@@ -0,0 +1,53 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
+#define BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_copy.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <class T>
+struct has_nothrow_copy_imp{
+#ifdef BOOST_HAS_NOTHROW_COPY
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_COPY(T));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_copy<T>::value);
+#endif
+};
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy,T,::boost::detail::has_nothrow_copy_imp<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy_constructor,T,::boost::detail::has_nothrow_copy_imp<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void volatile,false)
+#endif
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_nothrow_destructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_nothrow_destructor.hpp
new file mode 100644
index 0000000..4f5882a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_nothrow_destructor.hpp
@@ -0,0 +1,25 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_destructor.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_destructor,T,::boost::has_trivial_destructor<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_operator.hpp b/gatb-core/thirdparty/boost/type_traits/has_operator.hpp
new file mode 100644
index 0000000..c97a90f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_operator.hpp
@@ -0,0 +1,51 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_OPERATOR_HPP_INCLUDED
+#define BOOST_TT_HAS_OPERATOR_HPP_INCLUDED
+
+#include <boost/type_traits/has_bit_and.hpp>
+#include <boost/type_traits/has_bit_and_assign.hpp>
+#include <boost/type_traits/has_bit_or.hpp>
+#include <boost/type_traits/has_bit_or_assign.hpp>
+#include <boost/type_traits/has_bit_xor.hpp>
+#include <boost/type_traits/has_bit_xor_assign.hpp>
+#include <boost/type_traits/has_complement.hpp>
+#include <boost/type_traits/has_dereference.hpp>
+#include <boost/type_traits/has_divides.hpp>
+#include <boost/type_traits/has_divides_assign.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/type_traits/has_greater.hpp>
+#include <boost/type_traits/has_greater_equal.hpp>
+#include <boost/type_traits/has_left_shift.hpp>
+#include <boost/type_traits/has_left_shift_assign.hpp>
+#include <boost/type_traits/has_less.hpp>
+#include <boost/type_traits/has_less_equal.hpp>
+#include <boost/type_traits/has_logical_and.hpp>
+#include <boost/type_traits/has_logical_not.hpp>
+#include <boost/type_traits/has_logical_or.hpp>
+#include <boost/type_traits/has_minus.hpp>
+#include <boost/type_traits/has_minus_assign.hpp>
+#include <boost/type_traits/has_modulus.hpp>
+#include <boost/type_traits/has_modulus_assign.hpp>
+#include <boost/type_traits/has_multiplies.hpp>
+#include <boost/type_traits/has_multiplies_assign.hpp>
+#include <boost/type_traits/has_negate.hpp>
+#include <boost/type_traits/has_not_equal_to.hpp>
+#include <boost/type_traits/has_plus.hpp>
+#include <boost/type_traits/has_plus_assign.hpp>
+#include <boost/type_traits/has_post_decrement.hpp>
+#include <boost/type_traits/has_post_increment.hpp>
+#include <boost/type_traits/has_pre_decrement.hpp>
+#include <boost/type_traits/has_pre_increment.hpp>
+#include <boost/type_traits/has_right_shift.hpp>
+#include <boost/type_traits/has_right_shift_assign.hpp>
+#include <boost/type_traits/has_unary_minus.hpp>
+#include <boost/type_traits/has_unary_plus.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_plus.hpp b/gatb-core/thirdparty/boost/type_traits/has_plus.hpp
new file mode 100644
index 0000000..70c1200
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_plus.hpp
@@ -0,0 +1,54 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_PLUS_HPP_INCLUDED
+#define BOOST_TT_HAS_PLUS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_plus
+#define BOOST_TT_TRAIT_OP +
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==void* and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==void* and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental and Lhs!=integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_plus_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_plus_assign.hpp
new file mode 100644
index 0000000..6d65204
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_plus_assign.hpp
@@ -0,0 +1,66 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_PLUS_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_PLUS_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_plus_assign
+#define BOOST_TT_TRAIT_OP +=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==void* and Rhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value\
+      >::value,\
+      /* Rhs==void* and Lhs==fundamental */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+      >::value,\
+      /* Rhs==pointer and Lhs==fundamental and Lhs!=bool */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::type_traits::ice_not< ::boost::is_same< Lhs_nocv, bool >::value >::value\
+      >::value,\
+      /* (Lhs==fundamental or Lhs==pointer) and (Rhs==fundamental or Rhs==pointer) and (Lhs==const) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_post_decrement.hpp b/gatb-core/thirdparty/boost/type_traits/has_post_decrement.hpp
new file mode 100644
index 0000000..024acb0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_post_decrement.hpp
@@ -0,0 +1,44 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_POST_DECREMENT_HPP_INCLUDED
+#define BOOST_TT_HAS_POST_DECREMENT_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+
+#define BOOST_TT_TRAIT_NAME has_post_decrement
+#define BOOST_TT_TRAIT_OP --
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* bool */\
+      ::boost::is_same< bool, Lhs_nocv >::value,\
+      /* void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value\
+      >::value,\
+      /* (fundamental or pointer) and const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value,\
+      /* Arrays */ \
+      ::boost::is_array<Lhs_noref>::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_postfix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_post_increment.hpp b/gatb-core/thirdparty/boost/type_traits/has_post_increment.hpp
new file mode 100644
index 0000000..b055607
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_post_increment.hpp
@@ -0,0 +1,44 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_POST_INCREMENT_HPP_INCLUDED
+#define BOOST_TT_HAS_POST_INCREMENT_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+
+#define BOOST_TT_TRAIT_NAME has_post_increment
+#define BOOST_TT_TRAIT_OP ++
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* bool */\
+      ::boost::is_same< bool, Lhs_nocv >::value,\
+      /* void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_void< Lhs_noptr >::value\
+      >::value,\
+      /* (fundamental or pointer) and const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Lhs_nocv >::value,\
+            ::boost::is_pointer< Lhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value,\
+      /* Arrays */ \
+      ::boost::is_array<Lhs_noref>::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_postfix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_pre_decrement.hpp b/gatb-core/thirdparty/boost/type_traits/has_pre_decrement.hpp
new file mode 100644
index 0000000..feb3d9d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_pre_decrement.hpp
@@ -0,0 +1,44 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_PRE_DECREMENT_HPP_INCLUDED
+#define BOOST_TT_HAS_PRE_DECREMENT_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+
+#define BOOST_TT_TRAIT_NAME has_pre_decrement
+#define BOOST_TT_TRAIT_OP --
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* bool */\
+      ::boost::is_same< bool, Rhs_nocv >::value,\
+      /* void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value\
+      >::value,\
+      /* (fundamental or pointer) and const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Rhs_noref >::value\
+      >::value,\
+      /* Arrays */ \
+      ::boost::is_array<Rhs_noref>::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_pre_increment.hpp b/gatb-core/thirdparty/boost/type_traits/has_pre_increment.hpp
new file mode 100644
index 0000000..6a2411d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_pre_increment.hpp
@@ -0,0 +1,44 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_PRE_INCREMENT_HPP_INCLUDED
+#define BOOST_TT_HAS_PRE_INCREMENT_HPP_INCLUDED
+
+#include <boost/type_traits/is_array.hpp>
+
+#define BOOST_TT_TRAIT_NAME has_pre_increment
+#define BOOST_TT_TRAIT_OP ++
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* bool */\
+      ::boost::is_same< bool, Rhs_nocv >::value,\
+      /* void* */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Rhs_noref >::value,\
+         ::boost::is_void< Rhs_noptr >::value\
+      >::value,\
+      /* (fundamental or pointer) and const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::type_traits::ice_or<\
+            ::boost::is_fundamental< Rhs_nocv >::value,\
+            ::boost::is_pointer< Rhs_noref >::value\
+         >::value,\
+         ::boost::is_const< Rhs_noref >::value\
+      >::value,\
+      /* Arrays */ \
+      ::boost::is_array<Rhs_noref>::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_right_shift.hpp b/gatb-core/thirdparty/boost/type_traits/has_right_shift.hpp
new file mode 100644
index 0000000..5735870
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_right_shift.hpp
@@ -0,0 +1,49 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_RIGHT_SHIFT_HPP_INCLUDED
+#define BOOST_TT_HAS_RIGHT_SHIFT_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_right_shift
+#define BOOST_TT_TRAIT_OP >>
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_right_shift_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_right_shift_assign.hpp
new file mode 100644
index 0000000..0536e71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_right_shift_assign.hpp
@@ -0,0 +1,55 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_RIGHT_SHIFT_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_RIGHT_SHIFT_ASSIGN_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_right_shift_assign
+#define BOOST_TT_TRAIT_OP >>=
+#define BOOST_TT_FORBIDDEN_IF\
+   ::boost::type_traits::ice_or<\
+      /* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::type_traits::ice_or<\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
+            ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
+         >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Rhs==fundamental and Lhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_pointer< Lhs_noref >::value\
+      >::value,\
+      /* Lhs==pointer and Rhs==pointer */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_pointer< Lhs_noref >::value,\
+         ::boost::is_pointer< Rhs_noref >::value\
+      >::value,\
+      /* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
+      ::boost::type_traits::ice_and<\
+         ::boost::is_fundamental< Lhs_nocv >::value,\
+         ::boost::is_fundamental< Rhs_nocv >::value,\
+         ::boost::is_const< Lhs_noref >::value\
+      >::value\
+   >::value
+
+
+#include <boost/type_traits/detail/has_binary_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_assign.hpp
new file mode 100644
index 0000000..404b62c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_assign.hpp
@@ -0,0 +1,57 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_assign_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_ASSIGN
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_ASSIGN(T));
+#else
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_and<
+        ::boost::is_pod<T>::value,
+        ::boost::type_traits::ice_not< ::boost::is_const<T>::value >::value,
+      ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
+      >::value));
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_assign,T,::boost::detail::has_trivial_assign_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_constructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_constructor.hpp
new file mode 100644
index 0000000..30dbdd8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_constructor.hpp
@@ -0,0 +1,51 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_ctor_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_CONSTRUCTOR
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_or<
+         ::boost::is_pod<T>::value,
+         BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)
+      >::value));
+#else
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_or<
+         ::boost::is_pod<T>::value,
+         false
+      >::value));
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_constructor,T,::boost::detail::has_trivial_ctor_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_default_constructor,T,::boost::detail::has_trivial_ctor_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_copy.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_copy.hpp
new file mode 100644
index 0000000..1c567cf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_copy.hpp
@@ -0,0 +1,82 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+#ifdef __clang__
+#include <boost/type_traits/is_copy_constructible.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_copy_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_COPY
+#  ifdef __clang__
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_COPY(T) && boost::is_copy_constructible<T>::value);
+#  else
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_COPY(T));
+#  endif
+#else
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_and<
+         ::boost::is_pod<T>::value,
+         ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
+      >::value));
+#endif
+};
+
+#ifdef __clang__
+
+template <typename T, std::size_t N>
+struct has_trivial_copy_impl<T[N]>
+{
+   static const bool value = has_trivial_copy_impl<T>::value;
+};
+
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy,T,::boost::detail::has_trivial_copy_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy_constructor,T,::boost::detail::has_trivial_copy_impl<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void volatile,false)
+#endif
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_destructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_destructor.hpp
new file mode 100644
index 0000000..79d7522
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_destructor.hpp
@@ -0,0 +1,49 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_dtor_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_DESTRUCTOR
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_DESTRUCTOR(T));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::is_pod<T>::value);
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_destructor,T,::boost::detail::has_trivial_dtor_impl<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_move_assign.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_move_assign.hpp
new file mode 100644
index 0000000..db337f7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_move_assign.hpp
@@ -0,0 +1,57 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  (C) Copyright Eric Friedman 2002-2003.
+//  (C) Copyright Antony Polukhin 2013.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_move_assign_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_MOVE_ASSIGN
+   BOOST_STATIC_CONSTANT(bool, value = (BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T)));
+#else
+   BOOST_STATIC_CONSTANT(bool, value =
+           (::boost::type_traits::ice_and<
+              ::boost::is_pod<T>::value,
+              ::boost::type_traits::ice_not< ::boost::is_const<T>::value >::value,
+              ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
+           >::value));
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_move_assign,T,::boost::detail::has_trivial_move_assign_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_trivial_move_constructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_trivial_move_constructor.hpp
new file mode 100644
index 0000000..a341834
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_trivial_move_constructor.hpp
@@ -0,0 +1,57 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  (C) Copyright Eric Friedman 2002-2003.
+//  (C) Copyright Antony Polukhin 2013.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_move_ctor_impl
+{
+#ifdef BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR
+   BOOST_STATIC_CONSTANT(bool, value = (BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)));
+#else
+   BOOST_STATIC_CONSTANT(bool, value =
+           (::boost::type_traits::ice_and<
+              ::boost::is_pod<T>::value,
+              ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
+           >::value));
+#endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_move_constructor,T,::boost::detail::has_trivial_move_ctor_impl<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/has_unary_minus.hpp b/gatb-core/thirdparty/boost/type_traits/has_unary_minus.hpp
new file mode 100644
index 0000000..6b3157f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_unary_minus.hpp
@@ -0,0 +1,25 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_UNARY_MINUS_HPP_INCLUDED
+#define BOOST_TT_HAS_UNARY_MINUS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_unary_minus
+#define BOOST_TT_TRAIT_OP -
+#define BOOST_TT_FORBIDDEN_IF\
+   /* pointer */\
+   ::boost::is_pointer< Rhs_noref >::value
+
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_unary_plus.hpp b/gatb-core/thirdparty/boost/type_traits/has_unary_plus.hpp
new file mode 100644
index 0000000..a61770f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_unary_plus.hpp
@@ -0,0 +1,23 @@
+//  (C) Copyright 2009-2011 Frederic Bron.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_UNARY_PLUS_HPP_INCLUDED
+#define BOOST_TT_HAS_UNARY_PLUS_HPP_INCLUDED
+
+#define BOOST_TT_TRAIT_NAME has_unary_plus
+#define BOOST_TT_TRAIT_OP +
+#define BOOST_TT_FORBIDDEN_IF\
+   false
+
+#include <boost/type_traits/detail/has_prefix_operator.hpp>
+
+#undef BOOST_TT_TRAIT_NAME
+#undef BOOST_TT_TRAIT_OP
+#undef BOOST_TT_FORBIDDEN_IF
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/has_virtual_destructor.hpp b/gatb-core/thirdparty/boost/type_traits/has_virtual_destructor.hpp
new file mode 100644
index 0000000..b741197
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/has_virtual_destructor.hpp
@@ -0,0 +1,29 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_HAS_VIRTUAL_DESTRUCTOR_HPP_INCLUDED
+#define BOOST_TT_HAS_VIRTUAL_DESTRUCTOR_HPP_INCLUDED
+
+#include <boost/type_traits/intrinsics.hpp>
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#ifdef BOOST_HAS_VIRTUAL_DESTRUCTOR
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_virtual_destructor,T,BOOST_HAS_VIRTUAL_DESTRUCTOR(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_virtual_destructor,T,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/ice.hpp b/gatb-core/thirdparty/boost/type_traits/ice.hpp
new file mode 100644
index 0000000..134bc4b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/ice.hpp
@@ -0,0 +1,20 @@
+
+//  (C) Copyright John Maddock and Steve Cleary 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  macros and helpers for working with integral-constant-expressions.
+
+#ifndef BOOST_TT_ICE_HPP_INCLUDED
+#define BOOST_TT_ICE_HPP_INCLUDED
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/type_traits/detail/ice_eq.hpp>
+
+#endif // BOOST_TT_ICE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/integral_constant.hpp b/gatb-core/thirdparty/boost/type_traits/integral_constant.hpp
new file mode 100644
index 0000000..c684771
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/integral_constant.hpp
@@ -0,0 +1,39 @@
+//  (C) Copyright John Maddock 2005. 
+//  Use, modification and distribution are subject to the 
+//  Boost Software License, Version 1.0. (See accompanying file 
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
+#define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
+
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/integral_c.hpp>
+
+namespace boost{
+
+#if defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) || defined(__BORLANDC__)
+template <class T, int val>
+#else
+template <class T, T val>
+#endif
+struct integral_constant : public mpl::integral_c<T, val>
+{
+   typedef integral_constant<T,val> type;
+};
+
+template<> struct integral_constant<bool,true> : public mpl::true_ 
+{
+   typedef integral_constant<bool,true> type;
+};
+template<> struct integral_constant<bool,false> : public mpl::false_ 
+{
+   typedef integral_constant<bool,false> type;
+};
+
+typedef integral_constant<bool,true> true_type;
+typedef integral_constant<bool,false> false_type;
+
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/integral_promotion.hpp b/gatb-core/thirdparty/boost/type_traits/integral_promotion.hpp
new file mode 100644
index 0000000..9c5514b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/integral_promotion.hpp
@@ -0,0 +1,194 @@
+// Copyright 2005 Alexander Nasonov.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef FILE_boost_type_traits_integral_promotion_hpp_INCLUDED
+#define FILE_boost_type_traits_integral_promotion_hpp_INCLUDED
+
+#include <boost/config.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+// Should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace type_traits { namespace detail {
+
+// 4.5/2
+template <class T> struct need_promotion : public boost::is_enum<T> {};
+
+// 4.5/1
+template<> struct need_promotion<char              > : public true_type {};
+template<> struct need_promotion<signed char       > : public true_type {};
+template<> struct need_promotion<unsigned char     > : public true_type {};
+template<> struct need_promotion<signed short int  > : public true_type {};
+template<> struct need_promotion<unsigned short int> : public true_type {};
+
+
+// Specializations for non-standard types.
+// Type is promoted if it's smaller then int.
+
+#define BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(T) \
+    template<> struct need_promotion<T>          \
+        : public integral_constant<bool, (sizeof(T) < sizeof(int))> {};
+
+// Same set of integral types as in boost/type_traits/is_integral.hpp.
+// Please, keep in sync.
+#if (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \
+    || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300))
+// TODO: common macro for this #if. Or better yet, PP SEQ of non-standard types.
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int8          )
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int8 )
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int16         )
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int16)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int32         )
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int32)
+#ifdef __BORLANDC__
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(         __int64)
+#endif
+#endif
+
+#if defined(BOOST_HAS_LONG_LONG)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::ulong_long_type)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::long_long_type )
+#elif defined(BOOST_HAS_MS_INT64)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64)
+BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(         __int64)
+#endif
+
+#undef BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE
+
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+// 4.5/2
+template<> struct need_promotion<wchar_t> : public true_type {};
+#endif
+
+// 4.5/3 (integral bit-field) is not supported.
+
+// 4.5/4
+template<> struct need_promotion<bool> : public true_type {};
+
+
+// Get promoted type by index and cv qualifiers.
+
+template<int Index, int IsConst, int IsVolatile> struct promote_from_index;
+
+#define BOOST_TT_AUX_PROMOTE_FROM_INDEX(N,T)                                   \
+    template<> struct promote_from_index<N,0,0> { typedef T type; };           \
+    template<> struct promote_from_index<N,0,1> { typedef T volatile type; };  \
+    template<> struct promote_from_index<N,1,0> { typedef T const type; };     \
+    template<> struct promote_from_index<N,1,1> { typedef T const volatile type; };
+
+
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(1, int          )
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(2, unsigned int )
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(3, long         )
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(4, unsigned long)
+
+
+// WARNING: integral promotions to non-standard types
+// long long and __int64 are not defined by the standard.
+// Additional specialisations and overloads shouldn't
+// introduce ambiguity, though.
+
+#if defined(BOOST_HAS_LONG_LONG)
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(5, boost::long_long_type )
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(6, boost::ulong_long_type)
+#elif defined(BOOST_HAS_MS_INT64)
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(7, __int64         )
+BOOST_TT_AUX_PROMOTE_FROM_INDEX(8, unsigned __int64)
+#endif
+
+#undef BOOST_TT_AUX_PROMOTE_FROM_INDEX
+
+
+// Define BOOST_TT_AUX_PROMOTED_INDEX_TESTER:
+#if !defined(BOOST_MSVC)
+
+template<int N>
+struct sized_type_for_promotion
+{
+    typedef char (&type)[N];
+};
+
+#define BOOST_TT_AUX_PROMOTED_INDEX_TESTER(I,T) \
+    sized_type_for_promotion<I>::type promoted_index_tester(T);
+
+#else
+
+#define BOOST_TT_AUX_PROMOTED_INDEX_TESTER(I,T) \
+    char (&promoted_index_tester(T))[I];
+
+#endif
+
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(1, int          )
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(2, unsigned int )
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(3, long         )
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(4, unsigned long)
+
+#if defined(BOOST_HAS_LONG_LONG)
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(5, boost::long_long_type )
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(6, boost::ulong_long_type)
+#elif defined(BOOST_HAS_MS_INT64)
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(7, __int64         )
+BOOST_TT_AUX_PROMOTED_INDEX_TESTER(8, unsigned __int64)
+#endif
+
+#undef BOOST_TT_AUX_PROMOTED_INDEX_TESTER
+
+
+// Get an index of promoted type for type T.
+// Precondition: need_promotion<T>
+template<class T>
+struct promoted_index
+{
+    static T testee; // undefined
+    BOOST_STATIC_CONSTANT(int, value = sizeof(promoted_index_tester(+testee)) );
+    // Unary plus promotes testee                    LOOK HERE ---> ^
+};
+
+template<class T>
+struct integral_promotion_impl
+{
+    typedef BOOST_DEDUCED_TYPENAME promote_from_index<
+        (boost::type_traits::detail::promoted_index<T>::value)
+      , (boost::is_const<T>::value)
+      , (boost::is_volatile<T>::value)
+      >::type type;
+};
+
+template<class T>
+struct integral_promotion
+  : public boost::mpl::eval_if<
+        need_promotion<BOOST_DEDUCED_TYPENAME remove_cv<T>::type>
+      , integral_promotion_impl<T>
+      , boost::mpl::identity<T>
+      >
+{
+};
+
+} }
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(
+      integral_promotion
+    , T
+    , BOOST_DEDUCED_TYPENAME
+        boost::type_traits::detail::integral_promotion<T>::type
+    )
+}
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // #ifndef FILE_boost_type_traits_integral_promotion_hpp_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/intrinsics.hpp b/gatb-core/thirdparty/boost/type_traits/intrinsics.hpp
new file mode 100644
index 0000000..e8a87b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/intrinsics.hpp
@@ -0,0 +1,348 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_INTRINSICS_HPP_INCLUDED
+#define BOOST_TT_INTRINSICS_HPP_INCLUDED
+
+#ifndef BOOST_TT_CONFIG_HPP_INCLUDED
+#include <boost/type_traits/config.hpp>
+#endif
+
+//
+// Helper macros for builtin compiler support.
+// If your compiler has builtin support for any of the following
+// traits concepts, then redefine the appropriate macros to pick
+// up on the compiler support:
+//
+// (these should largely ignore cv-qualifiers)
+// BOOST_IS_UNION(T) should evaluate to true if T is a union type
+// BOOST_IS_POD(T) should evaluate to true if T is a POD type
+// BOOST_IS_EMPTY(T) should evaluate to true if T is an empty class type (and not a union)
+// BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
+// BOOST_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
+// BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy
+// BOOST_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
+// BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy
+// BOOST_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
+// BOOST_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
+// BOOST_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
+// BOOST_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
+// BOOST_HAS_VIRTUAL_DESTRUCTOR(T) should evaluate to true T has a virtual destructor
+// BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T) should evaluate to true if T has a non-throwing move constructor.
+// BOOST_IS_NOTHROW_MOVE_ASSIGN(T) should evaluate to true if T has a non-throwing move assignment operator.
+//
+// The following can also be defined: when detected our implementation is greatly simplified.
+//
+// BOOST_IS_ABSTRACT(T) true if T is an abstract type
+// BOOST_IS_BASE_OF(T,U) true if T is a base class of U
+// BOOST_IS_CLASS(T) true if T is a class type (and not a union)
+// BOOST_IS_CONVERTIBLE(T,U) true if T is convertible to U
+// BOOST_IS_ENUM(T) true is T is an enum
+// BOOST_IS_POLYMORPHIC(T) true if T is a polymorphic type
+// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.
+
+#ifdef BOOST_HAS_SGI_TYPE_TRAITS
+    // Hook into SGI's __type_traits class, this will pick up user supplied
+    // specializations as well as SGI - compiler supplied specializations.
+#   include <boost/type_traits/is_same.hpp>
+#   ifdef __NetBSD__
+      // There are two different versions of type_traits.h on NetBSD on Spark
+      // use an implicit include via algorithm instead, to make sure we get
+      // the same version as the std lib:
+#     include <algorithm>
+#   else
+#    include <type_traits.h>
+#   endif
+#   define BOOST_IS_POD(T) ::boost::is_same< typename ::__type_traits<T>::is_POD_type, ::__true_type>::value
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_default_constructor, ::__true_type>::value
+#   define BOOST_HAS_TRIVIAL_COPY(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_copy_constructor, ::__true_type>::value
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_assignment_operator, ::__true_type>::value
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_destructor, ::__true_type>::value
+
+#   ifdef __sgi
+#      define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#   endif
+#endif
+
+#if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000)
+    // Metrowerks compiler is acquiring intrinsic type traits support
+    // post version 8.  We hook into the published interface to pick up
+    // user defined specializations as well as compiler intrinsics as 
+    // and when they become available:
+#   include <msl_utility>
+#   define BOOST_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union<T>::value
+#   define BOOST_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD<T>::value
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor<T>::value
+#   define BOOST_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor<T>::value
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment<T>::value
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor<T>::value
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
+         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_function.hpp>
+
+#   define BOOST_IS_UNION(T) __is_union(T)
+#   define BOOST_IS_POD(T) (__is_pod(T) && __has_trivial_constructor(T))
+#   define BOOST_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T)|| ( ::boost::is_pod<T>::value && !::boost::is_volatile<T>::value))
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) || ( ::boost::is_pod<T>::value && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value))
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) || ::boost::is_pod<T>::value)
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) || ::boost::has_trivial_constructor<T>::value)
+#   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) || ::boost::has_trivial_copy<T>::value)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) || ::boost::has_trivial_assign<T>::value)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+
+#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
+#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
+#   define BOOST_IS_CLASS(T) __is_class(T)
+#   define BOOST_IS_CONVERTIBLE(T,U) ((__is_convertible_to(T,U) || (is_same<T,U>::value && !is_function<U>::value)) && !__is_abstract(U))
+#   define BOOST_IS_ENUM(T) __is_enum(T)
+//  This one doesn't quite always do the right thing:
+//  #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+//  This one fails if the default alignment has been changed with /Zp:
+//  #   define BOOST_ALIGNMENT_OF(T) __alignof(T)
+
+#   if defined(_MSC_VER) && (_MSC_VER >= 1700)
+#       define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) ((__has_trivial_move_constructor(T) || __is_pod(T)) && !::boost::is_volatile<T>::value && !::boost::is_reference<T>::value)
+#       define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) ((__has_trivial_move_assign(T) || __is_pod(T)) && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value && !::boost::is_reference<T>::value)
+#   endif
+#if _MSC_FULL_VER >= 180020827
+#   define BOOST_IS_NOTHROW_MOVE_ASSIGN(T) (__is_nothrow_assignable(T&, T&&))
+#   define BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T) (__is_nothrow_constructible(T, T&&))
+#endif
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if defined(__DMC__) && (__DMC__ >= 0x848)
+// For Digital Mars C++, www.digitalmars.com
+#   define BOOST_IS_UNION(T) (__typeinfo(T) & 0x400)
+#   define BOOST_IS_POD(T) (__typeinfo(T) & 0x800)
+#   define BOOST_IS_EMPTY(T) (__typeinfo(T) & 0x1000)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__typeinfo(T) & 0x10)
+#   define BOOST_HAS_TRIVIAL_COPY(T) (__typeinfo(T) & 0x20)
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__typeinfo(T) & 0x40)
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__typeinfo(T) & 0x8)
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__typeinfo(T) & 0x80)
+#   define BOOST_HAS_NOTHROW_COPY(T) (__typeinfo(T) & 0x100)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__typeinfo(T) & 0x200)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) (__typeinfo(T) & 0x4)
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if defined(BOOST_CLANG) && defined(__has_feature) && !defined(__CUDACC__)
+//
+// Note that these intrinsics are disabled for the CUDA meta-compiler as it appears
+// to not support them, even though the underlying clang compiler does so.
+// This is a rubbish fix as it basically stops type traits from working correctly, 
+// but maybe the best we can do for now.  See https://svn.boost.org/trac/boost/ticket/10694
+//
+#   include <cstddef>
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_volatile.hpp>
+
+#   if __has_feature(is_union)
+#     define BOOST_IS_UNION(T) __is_union(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_pod)
+#     define BOOST_IS_POD(T) __is_pod(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_empty)
+#     define BOOST_IS_EMPTY(T) __is_empty(T)
+#   endif
+#   if __has_feature(has_trivial_constructor)
+#     define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_copy)
+#     define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
+#   endif
+#   if __has_feature(has_trivial_assign)
+#     define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
+#   endif
+#   if __has_feature(has_trivial_destructor)
+#     define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   endif
+#   if __has_feature(has_nothrow_constructor)
+#     define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   endif
+#   if __has_feature(has_nothrow_copy)
+#     define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)
+#   endif
+#   if __has_feature(has_nothrow_assign)
+#     define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
+#   endif
+#   if __has_feature(has_virtual_destructor)
+#     define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#   endif
+#   if __has_feature(is_abstract)
+#     define BOOST_IS_ABSTRACT(T) __is_abstract(T)
+#   endif
+#   if __has_feature(is_base_of)
+#     define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
+#   endif
+#   if __has_feature(is_class)
+#     define BOOST_IS_CLASS(T) __is_class(T)
+#   endif
+#   if __has_feature(is_convertible_to)
+#     define BOOST_IS_CONVERTIBLE(T,U) __is_convertible_to(T,U)
+#   endif
+#   if __has_feature(is_enum)
+#     define BOOST_IS_ENUM(T) __is_enum(T)
+#   endif
+#   if __has_feature(is_polymorphic)
+#     define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+#   endif
+#   if __has_feature(has_trivial_move_constructor)
+#     define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) __has_trivial_move_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_move_assign)
+#     define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) __has_trivial_move_assign(T)
+#   endif
+#   define BOOST_ALIGNMENT_OF(T) __alignof(T)
+#   if __has_feature(is_final)
+#     define BOOST_IS_FINAL(T) __is_final(T)
+#   endif
+
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_volatile.hpp>
+
+#ifdef BOOST_INTEL
+#  define BOOST_INTEL_TT_OPTS || is_pod<T>::value
+#else
+#  define BOOST_INTEL_TT_OPTS
+#endif
+
+#   define BOOST_IS_UNION(T) __is_union(T)
+#   define BOOST_IS_POD(T) __is_pod(T)
+#   define BOOST_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_INTEL_TT_OPTS) && !is_reference<T>::value && ! ::boost::is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS)
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_INTEL_TT_OPTS)
+#   define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+
+#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
+#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
+#   define BOOST_IS_CLASS(T) __is_class(T)
+#   define BOOST_IS_ENUM(T) __is_enum(T)
+#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+#   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)
+      // GCC sometimes lies about alignment requirements
+      // of type double on 32-bit unix platforms, use the
+      // old implementation instead in that case:
+#     define BOOST_ALIGNMENT_OF(T) __alignof__(T)
+#   endif
+#   if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))
+#     define BOOST_IS_FINAL(T) __is_final(T)
+#   endif
+
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_volatile.hpp>
+
+#   define BOOST_IS_UNION(T) __oracle_is_union(T)
+#   define BOOST_IS_POD(T) __oracle_is_pod(T)
+#   define BOOST_IS_EMPTY(T) __oracle_is_empty(T)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__oracle_has_trivial_constructor(T) && ! ::boost::is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_COPY(T) (__oracle_has_trivial_copy(T) && !is_reference<T>::value && ! ::boost::is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __oracle_has_trivial_destructor(T)
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__oracle_has_nothrow_constructor(T) || __oracle_has_trivial_constructor(T) || __oracle_is_trivial(T))
+#   define BOOST_HAS_NOTHROW_COPY(T) ((__oracle_has_nothrow_copy(T) || __oracle_has_trivial_copy(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_reference<T>::value)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__oracle_has_nothrow_assign(T) || __oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_const<T>::value)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __oracle_has_virtual_destructor(T)
+
+#   define BOOST_IS_ABSTRACT(T) __oracle_is_abstract(T)
+//#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
+#   define BOOST_IS_CLASS(T) __oracle_is_class(T)
+#   define BOOST_IS_ENUM(T) __oracle_is_enum(T)
+#   define BOOST_IS_POLYMORPHIC(T) __oracle_is_polymorphic(T)
+#   define BOOST_ALIGNMENT_OF(T) __alignof__(T)
+#   define BOOST_IS_FINAL(T) __oracle_is_final(T)
+
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#if defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_volatile.hpp>
+
+#   define BOOST_IS_UNION(T) __is_union(T)
+#   define BOOST_IS_POD(T) __is_pod(T)
+#   define BOOST_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+
+#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
+#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
+#   define BOOST_IS_CLASS(T) __is_class(T)
+#   define BOOST_IS_ENUM(T) __is_enum(T)
+#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+#   define BOOST_ALIGNMENT_OF(T) __alignof__(T)
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+# if defined(__CODEGEARC__)
+#   include <boost/type_traits/is_same.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_volatile.hpp>
+#   include <boost/type_traits/is_void.hpp>
+
+#   define BOOST_IS_UNION(T) __is_union(T)
+#   define BOOST_IS_POD(T) __is_pod(T)
+#   define BOOST_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))
+#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)
+#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
+#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))
+#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))
+#   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)
+#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
+#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+
+#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
+#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_void<T>::value && !is_void<U>::value)
+#   define BOOST_IS_CLASS(T) __is_class(T)
+#   define BOOST_IS_CONVERTIBLE(T,U) (__is_convertible(T,U) || is_void<U>::value)
+#   define BOOST_IS_ENUM(T) __is_enum(T)
+#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+#   define BOOST_ALIGNMENT_OF(T) alignof(T)
+
+#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
+#endif
+
+#endif // BOOST_TT_INTRINSICS_HPP_INCLUDED
+
+
+
+
+
+
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_abstract.hpp b/gatb-core/thirdparty/boost/type_traits/is_abstract.hpp
new file mode 100644
index 0000000..f1cd92c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_abstract.hpp
@@ -0,0 +1,153 @@
+#ifndef BOOST_TT_IS_ABSTRACT_CLASS_HPP
+#define BOOST_TT_IS_ABSTRACT_CLASS_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// is_abstract_class.hpp:
+//
+//  (C) Copyright 2002 Rani Sharoni (rani_sharoni at hotmail.com) and Robert Ramey
+//  Use, modification and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//  
+//  See http://www.boost.org for updates, documentation, and revision history.
+//
+
+// Compile type discovery whether given type is abstract class or not.
+//
+//   Requires DR 337 to be supported by compiler
+//   (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#337).
+//
+//
+// Believed (Jan 2004) to work on:
+//  - GCC 3.4
+//  - VC++ 7.1
+//  - compilers with new EDG frontend (Intel C++ 7, Comeau 4.3.2)
+//
+// Doesn't work on:
+//  - VC++6, VC++7.0 and less
+//  - GCC 3.3.X and less
+//  - Borland C++ 6 and less
+//      
+//
+// History:
+//  - Originally written by Rani Sharoni, see
+//    http://groups.google.com/groups?selm=df893da6.0207110613.75b2fe90%40posting.google.com
+//    At this time supported by EDG (Intel C++ 7, Comeau 4.3.2) and VC7.1.
+//  - Adapted and added into Boost.Serialization library by Robert Ramey 
+//    (starting with submission #10).
+//  - Jan 2004: GCC 3.4 fixed to support DR337 (Giovanni Bajo).
+//  - Jan 2004: modified to be part of Boost.TypeTraits (Pavel Vozenilek).
+//  - Nov 2004: Christoph Ludwig found that the implementation did not work with
+//              template types and gcc-3.4 or VC7.1, fix due to Christoph Ludwig
+//              and John Maddock.
+//  - Dec 2004: Added new config macro BOOST_NO_IS_ABSTRACT which causes the template
+//              to degrade gracefully, rather than trash the compiler (John Maddock).
+//
+
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_ABSTRACT
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#ifdef BOOST_NO_IS_ABSTRACT
+#include <boost/type_traits/is_polymorphic.hpp>
+#endif
+#endif
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+
+namespace boost {
+namespace detail{
+
+#ifdef BOOST_IS_ABSTRACT
+template <class T>
+struct is_abstract_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_ABSTRACT(T));
+};
+#elif !defined(BOOST_NO_IS_ABSTRACT)
+template<class T>
+struct is_abstract_imp2
+{
+   // Deduction fails if T is void, function type, 
+   // reference type (14.8.2/2)or an abstract class type 
+   // according to review status issue #337
+   //
+   template<class U>
+   static type_traits::no_type check_sig(U (*)[1]);
+   template<class U>
+   static type_traits::yes_type check_sig(...);
+   //
+   // T must be a complete type, further if T is a template then
+   // it must be instantiated in order for us to get the right answer:
+   //
+   BOOST_STATIC_ASSERT(sizeof(T) != 0);
+
+   // GCC2 won't even parse this template if we embed the computation
+   // of s1 in the computation of value.
+#ifdef __GNUC__
+   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(is_abstract_imp2<T>::template check_sig<T>(0)));
+#else
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(push)
+#pragma warning(disable:6334)
+#endif
+   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(check_sig<T>(0)));
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(pop)
+#endif
+#endif
+    
+   BOOST_STATIC_CONSTANT(bool, value = 
+      (s1 == sizeof(type_traits::yes_type)));
+};
+
+template <bool v>
+struct is_abstract_select
+{
+   template <class T>
+   struct rebind
+   {
+      typedef is_abstract_imp2<T> type;
+   };
+};
+template <>
+struct is_abstract_select<false>
+{
+   template <class T>
+   struct rebind
+   {
+      typedef false_type type;
+   };
+};
+
+template <class T>
+struct is_abstract_imp
+{
+   typedef is_abstract_select< ::boost::is_class<T>::value> selector;
+   typedef typename selector::template rebind<T> binder;
+   typedef typename binder::type type;
+
+   BOOST_STATIC_CONSTANT(bool, value = type::value);
+};
+
+#endif
+}
+
+#ifndef BOOST_NO_IS_ABSTRACT
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_abstract_imp<T>::value)
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_polymorphic_imp<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif //BOOST_TT_IS_ABSTRACT_CLASS_HPP
diff --git a/gatb-core/thirdparty/boost/type_traits/is_arithmetic.hpp b/gatb-core/thirdparty/boost/type_traits/is_arithmetic.hpp
new file mode 100644
index 0000000..a1d8c46
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_arithmetic.hpp
@@ -0,0 +1,51 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
+#define BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
+
+#if !defined( __CODEGEARC__ )
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/config.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if !defined(__CODEGEARC__)
+namespace detail {
+
+template< typename T >
+struct is_arithmetic_impl
+{ 
+    BOOST_STATIC_CONSTANT(bool, value = 
+        (::boost::type_traits::ice_or< 
+            ::boost::is_integral<T>::value,
+            ::boost::is_float<T>::value
+        >::value)); 
+};
+
+} // namespace detail
+#endif
+
+//* is a type T an arithmetic type described in the standard (3.9.1p8)
+#if defined(__CODEGEARC__)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,__is_arithmetic(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,::boost::detail::is_arithmetic_impl<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_array.hpp b/gatb-core/thirdparty/boost/type_traits/is_array.hpp
new file mode 100644
index 0000000..c381ca4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_array.hpp
@@ -0,0 +1,50 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+// Some fixes for is_array are based on a newsgroup posting by Jonathan Lundquist.
+
+
+#ifndef BOOST_TT_IS_ARRAY_HPP_INCLUDED
+#define BOOST_TT_IS_ARRAY_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,__is_array(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,false)
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T[N],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const[N],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T volatile[N],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const volatile[N],true)
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T[],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const[],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T volatile[],true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],true)
+#endif
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_ARRAY_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_base_and_derived.hpp b/gatb-core/thirdparty/boost/type_traits/is_base_and_derived.hpp
new file mode 100644
index 0000000..632b699
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_base_and_derived.hpp
@@ -0,0 +1,252 @@
+
+//  (C) Copyright Rani Sharoni 2003.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+ 
+#ifndef BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
+#define BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
+
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_BASE_OF
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#endif
+#include <boost/type_traits/remove_cv.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+#ifndef BOOST_IS_BASE_OF
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) \
+ && !BOOST_WORKAROUND(__SUNPRO_CC , <= 0x540) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \
+ && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+
+                             // The EDG version number is a lower estimate.
+                             // It is not currently known which EDG version
+                             // exactly fixes the problem.
+
+/*************************************************************************
+
+This version detects ambiguous base classes and private base classes
+correctly, and was devised by Rani Sharoni.
+
+Explanation by Terje Slettebo and Rani Sharoni.
+
+Let's take the multiple base class below as an example, and the following
+will also show why there's not a problem with private or ambiguous base
+class:
+
+struct B {};
+struct B1 : B {};
+struct B2 : B {};
+struct D : private B1, private B2 {};
+
+is_base_and_derived<B, D>::value;
+
+First, some terminology:
+
+SC  - Standard conversion
+UDC - User-defined conversion
+
+A user-defined conversion sequence consists of an SC, followed by an UDC,
+followed by another SC. Either SC may be the identity conversion.
+
+When passing the default-constructed Host object to the overloaded check_sig()
+functions (initialization 8.5/14/4/3), we have several viable implicit
+conversion sequences:
+
+For "static no_type check_sig(B const volatile *, int)" we have the conversion
+sequences:
+
+C -> C const (SC - Qualification Adjustment) -> B const volatile* (UDC)
+C -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* ->
+     B const volatile* (SC - Conversion)
+
+For "static yes_type check_sig(D const volatile *, T)" we have the conversion
+sequence:
+
+C -> D const volatile* (UDC)
+
+According to 13.3.3.1/4, in context of user-defined conversion only the
+standard conversion sequence is considered when selecting the best viable
+function, so it only considers up to the user-defined conversion. For the
+first function this means choosing between C -> C const and C -> C, and it
+chooses the latter, because it's a proper subset (13.3.3.2/3/2) of the
+former. Therefore, we have:
+
+C -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* ->
+     B const volatile* (SC - Conversion)
+C -> D const volatile* (UDC)
+
+Here, the principle of the "shortest subsequence" applies again, and it
+chooses C -> D const volatile*. This shows that it doesn't even need to
+consider the multiple paths to B, or accessibility, as that possibility is
+eliminated before it could possibly cause ambiguity or access violation.
+
+If D is not derived from B, it has to choose between C -> C const -> B const
+volatile* for the first function, and C -> D const volatile* for the second
+function, which are just as good (both requires a UDC, 13.3.3.2), had it not
+been for the fact that "static no_type check_sig(B const volatile *, int)" is
+not templated, which makes C -> C const -> B const volatile* the best choice
+(13.3.3/1/4), resulting in "no".
+
+Also, if Host::operator B const volatile* hadn't been const, the two
+conversion sequences for "static no_type check_sig(B const volatile *, int)", in
+the case where D is derived from B, would have been ambiguous.
+
+See also
+http://groups.google.com/groups?selm=df893da6.0301280859.522081f7%40posting.
+google.com and links therein.
+
+*************************************************************************/
+
+template <typename B, typename D>
+struct bd_helper
+{
+   //
+   // This VC7.1 specific workaround stops the compiler from generating
+   // an internal compiler error when compiling with /vmg (thanks to
+   // Aleksey Gurtovoy for figuring out the workaround).
+   //
+#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+    template <typename T>
+    static type_traits::yes_type check_sig(D const volatile *, T);
+    static type_traits::no_type  check_sig(B const volatile *, int);
+#else
+    static type_traits::yes_type check_sig(D const volatile *, long);
+    static type_traits::no_type  check_sig(B const volatile * const&, int);
+#endif
+};
+
+template<typename B, typename D>
+struct is_base_and_derived_impl2
+{
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(push)
+#pragma warning(disable:6334)
+#endif
+    //
+    // May silently do the wrong thing with incomplete types
+    // unless we trap them here:
+    //
+    BOOST_STATIC_ASSERT(sizeof(B) != 0);
+    BOOST_STATIC_ASSERT(sizeof(D) != 0);
+
+    struct Host
+    {
+#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+        operator B const volatile *() const;
+#else
+        operator B const volatile * const&() const;
+#endif
+        operator D const volatile *();
+    };
+
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof(bd_helper<B,D>::check_sig(Host(), 0)) == sizeof(type_traits::yes_type));
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(pop)
+#endif
+};
+
+#else
+
+//
+// broken version:
+//
+template<typename B, typename D>
+struct is_base_and_derived_impl2
+{
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::is_convertible<D*,B*>::value));
+};
+
+#define BOOST_BROKEN_IS_BASE_AND_DERIVED
+
+#endif
+
+template <typename B, typename D>
+struct is_base_and_derived_impl3
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <bool ic1, bool ic2, bool iss>
+struct is_base_and_derived_select
+{
+   template <class T, class U>
+   struct rebind
+   {
+      typedef is_base_and_derived_impl3<T,U> type;
+   };
+};
+
+template <>
+struct is_base_and_derived_select<true,true,false>
+{
+   template <class T, class U>
+   struct rebind
+   {
+      typedef is_base_and_derived_impl2<T,U> type;
+   };
+};
+
+template <typename B, typename D>
+struct is_base_and_derived_impl
+{
+    typedef typename remove_cv<B>::type ncvB;
+    typedef typename remove_cv<D>::type ncvD;
+
+    typedef is_base_and_derived_select<
+       ::boost::is_class<B>::value,
+       ::boost::is_class<D>::value,
+       ::boost::is_same<ncvB,ncvD>::value> selector;
+    typedef typename selector::template rebind<ncvB,ncvD> binder;
+    typedef typename binder::type bound_type;
+
+    BOOST_STATIC_CONSTANT(bool, value = bound_type::value);
+};
+#else
+template <typename B, typename D>
+struct is_base_and_derived_impl
+{
+    typedef typename remove_cv<B>::type ncvB;
+    typedef typename remove_cv<D>::type ncvD;
+
+    BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && ! ::boost::is_same<ncvB,ncvD>::value));
+};
+#endif
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_base_and_derived
+    , Base
+    , Derived
+    , (::boost::detail::is_base_and_derived_impl<Base,Derived>::value)
+    )
+
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived&,false)
+
+#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename Base,is_base_and_derived,Base,Base,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_base_of.hpp b/gatb-core/thirdparty/boost/type_traits/is_base_of.hpp
new file mode 100644
index 0000000..3655b0b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_base_of.hpp
@@ -0,0 +1,49 @@
+
+//  (C) Copyright Rani Sharoni 2003-2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+ 
+#ifndef BOOST_TT_IS_BASE_OF_HPP_INCLUDED
+#define BOOST_TT_IS_BASE_OF_HPP_INCLUDED
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+   namespace detail{
+      template <class B, class D>
+      struct is_base_of_imp
+      {
+          typedef typename remove_cv<B>::type ncvB;
+          typedef typename remove_cv<D>::type ncvD;
+          BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<      
+            (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
+            (::boost::type_traits::ice_and< ::boost::is_same<ncvB,ncvD>::value, ::boost::is_class<ncvB>::value>::value)>::value));
+      };
+   }
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_base_of
+    , Base
+    , Derived
+    , (::boost::detail::is_base_of_imp<Base, Derived>::value))
+
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_base_of_tr1.hpp b/gatb-core/thirdparty/boost/type_traits/is_base_of_tr1.hpp
new file mode 100644
index 0000000..7264f15
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_base_of_tr1.hpp
@@ -0,0 +1,48 @@
+
+//  (C) Copyright Rani Sharoni 2003-2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+ 
+#ifndef BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
+#define BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost { namespace tr1{
+
+   namespace detail{
+      template <class B, class D>
+      struct is_base_of_imp
+      {
+          typedef typename remove_cv<B>::type ncvB;
+          typedef typename remove_cv<D>::type ncvD;
+          BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<      
+            (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
+            (::boost::is_same<ncvB,ncvD>::value)>::value));
+      };
+   }
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_base_of
+    , Base
+    , Derived
+    , (::boost::tr1::detail::is_base_of_imp<Base, Derived>::value))
+
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false)
+
+} } // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_class.hpp b/gatb-core/thirdparty/boost/type_traits/is_class.hpp
new file mode 100644
index 0000000..0675b57
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_class.hpp
@@ -0,0 +1,129 @@
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000-2003.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_CLASS_HPP_INCLUDED
+#define BOOST_TT_IS_CLASS_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_CLASS
+#   include <boost/type_traits/is_union.hpp>
+#   include <boost/type_traits/detail/ice_and.hpp>
+#   include <boost/type_traits/detail/ice_not.hpp>
+
+#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
+#   include <boost/type_traits/detail/yes_no_type.hpp>
+#else
+#   include <boost/type_traits/is_scalar.hpp>
+#   include <boost/type_traits/is_array.hpp>
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_void.hpp>
+#   include <boost/type_traits/is_function.hpp>
+#endif
+
+#endif // BOOST_IS_CLASS
+
+#ifdef __EDG_VERSION__
+#   include <boost/type_traits/remove_cv.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+#ifndef BOOST_IS_CLASS
+#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
+
+// This is actually the conforming implementation which works with
+// abstract classes.  However, enough compilers have trouble with
+// it that most will use the one in
+// boost/type_traits/object_traits.hpp. This implementation
+// actually works with VC7.0, but other interactions seem to fail
+// when we use it.
+
+// is_class<> metafunction due to Paul Mensonides
+// (leavings at attbi.com). For more details:
+// http://groups.google.com/groups?hl=en&selm=000001c1cc83%24e154d5e0%247772e50c%40c161550a&rnum=1
+#if defined(__GNUC__)  && !defined(__EDG_VERSION__)
+
+template <class U> ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));
+template <class U> ::boost::type_traits::no_type is_class_tester(...);
+
+template <typename T>
+struct is_class_impl
+{
+
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::type_traits::ice_and<
+            sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type),
+            ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value
+        >::value)
+        );
+};
+
+#else
+
+template <typename T>
+struct is_class_impl
+{
+    template <class U> static ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));
+    template <class U> static ::boost::type_traits::no_type is_class_tester(...);
+
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::type_traits::ice_and<
+            sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type),
+            ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value
+        >::value)
+        );
+};
+
+#endif
+
+#else
+
+template <typename T>
+struct is_class_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value =
+    (::boost::type_traits::ice_and<
+        ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value,
+        ::boost::type_traits::ice_not< ::boost::is_scalar<T>::value >::value,
+        ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value,
+        ::boost::type_traits::ice_not< ::boost::is_reference<T>::value>::value,
+        ::boost::type_traits::ice_not< ::boost::is_void<T>::value >::value,
+        ::boost::type_traits::ice_not< ::boost::is_function<T>::value >::value
+        >::value));
+};
+
+# endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
+# else // BOOST_IS_CLASS
+template <typename T>
+struct is_class_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_CLASS(T));
+};
+# endif // BOOST_IS_CLASS
+
+} // namespace detail
+
+# ifdef __EDG_VERSION__
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(
+   is_class,T, boost::detail::is_class_impl<typename boost::remove_cv<T>::type>::value)
+# else 
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_class,T,::boost::detail::is_class_impl<T>::value)
+# endif
+    
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_CLASS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_complex.hpp b/gatb-core/thirdparty/boost/type_traits/is_complex.hpp
new file mode 100644
index 0000000..0813dac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_complex.hpp
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2007. 
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_COMPLEX_HPP
+#define BOOST_TT_IS_COMPLEX_HPP
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <complex>
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+
+namespace boost {
+namespace detail{
+
+struct is_convertible_from_tester
+{
+   template <class T>
+   is_convertible_from_tester(const std::complex<T>&);
+};
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_complex,T,(::boost::is_convertible<T, boost::detail::is_convertible_from_tester>::value))
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif //BOOST_TT_IS_COMPLEX_HPP
diff --git a/gatb-core/thirdparty/boost/type_traits/is_compound.hpp b/gatb-core/thirdparty/boost/type_traits/is_compound.hpp
new file mode 100644
index 0000000..bbaaa42
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_compound.hpp
@@ -0,0 +1,46 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_COMPOUND_HPP_INCLUDED
+#define BOOST_TT_IS_COMPOUND_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if !defined( __CODEGEARC__ )
+namespace detail {
+
+template <typename T>
+struct is_compound_impl
+{
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_not<
+         ::boost::is_fundamental<T>::value
+       >::value));
+};
+
+} // namespace detail
+#endif // !defined( __CODEGEARC__ )
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,__is_compound(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,::boost::detail::is_compound_impl<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_COMPOUND_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_const.hpp b/gatb-core/thirdparty/boost/type_traits/is_const.hpp
new file mode 100644
index 0000000..e3e62b6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_const.hpp
@@ -0,0 +1,90 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_CONST_HPP_INCLUDED
+#define BOOST_TT_IS_CONST_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#   include <boost/type_traits/detail/cv_traits_impl.hpp>
+#   ifdef __GNUC__
+#       include <boost/type_traits/is_reference.hpp>
+#   endif
+#   if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+#       include <boost/type_traits/remove_bounds.hpp>
+#   endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,__is_const(T))
+
+#else
+
+namespace detail{
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+template <class T>
+struct is_const_rvalue_filter
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_const);
+#else
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_const);
+#endif
+};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T>
+struct is_const_rvalue_filter<T&&>
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+#endif
+}
+
+//* is a type T  declared const - is_const<T>
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,::boost::detail::is_const_rvalue_filter<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T&,false)
+
+#if  defined(BOOST_ILLEGAL_CV_REFERENCES)
+// these are illegal specialisations; cv-qualifies applied to
+// references have no effect according to [8.3.2p1],
+// C++ Builder requires them though as it treats cv-qualified
+// references as distinct types...
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const volatile,false)
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_CONST_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_convertible.hpp b/gatb-core/thirdparty/boost/type_traits/is_convertible.hpp
new file mode 100644
index 0000000..a844cec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_convertible.hpp
@@ -0,0 +1,494 @@
+
+// Copyright 2000 John Maddock (john at johnmaddock.co.uk)
+// Copyright 2000 Jeremy Siek (jsiek at lsc.nd.edu)
+// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi at cs.utu.fi)
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
+
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_CONVERTIBLE
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_void.hpp>
+#ifndef BOOST_NO_IS_ABSTRACT
+#include <boost/type_traits/is_abstract.hpp>
+#endif
+#include <boost/type_traits/add_lvalue_reference.hpp>
+#include <boost/type_traits/add_rvalue_reference.hpp>
+#include <boost/type_traits/is_function.hpp>
+
+#if defined(__MWERKS__)
+#include <boost/type_traits/remove_reference.hpp>
+#endif
+#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#  include <boost/utility/declval.hpp>
+#endif
+#endif // BOOST_IS_CONVERTIBLE
+
+// should be always the last #include directive
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#ifndef BOOST_IS_CONVERTIBLE
+
+// is one type convertible to another?
+//
+// there are multiple versions of the is_convertible
+// template, almost every compiler seems to require its
+// own version.
+//
+// Thanks to Andrei Alexandrescu for the original version of the
+// conversion detection technique!
+//
+
+namespace detail {
+
+#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+   // This is a C++11 conforming version, place this first and use it wherever possible:
+
+#  define BOOST_TT_CXX11_IS_CONVERTIBLE
+
+   template <class A, class B, class C>
+   struct or_helper
+   {
+      static const bool value = (A::value || B::value || C::value);
+   };
+
+   template<typename From, typename To, bool b = or_helper<boost::is_void<From>, boost::is_function<To>, boost::is_array<To> >::value>
+   struct is_convertible_basic_impl
+   {
+      // Nothing converts to function or array, but void converts to void:
+      static const bool value = is_void<To>::value; 
+   };
+
+   template<typename From, typename To>
+   class is_convertible_basic_impl<From, To, false>
+   {
+      typedef char one;
+      typedef int  two;
+
+      template<typename To1>
+      static void test_aux(To1);
+
+      template<typename From1, typename To1>
+      static decltype(test_aux<To1>(boost::declval<From1>()), one()) test(int);
+
+      template<typename, typename>
+      static two test(...);
+
+   public:
+      static const bool value = sizeof(test<From, To>(0)) == 1;
+   };
+
+#elif defined(__BORLANDC__) && (__BORLANDC__ < 0x560)
+//
+// special version for Borland compilers
+// this version breaks when used for some
+// UDT conversions:
+//
+template <typename From, typename To>
+struct is_convertible_impl
+{
+#pragma option push -w-8074
+    // This workaround for Borland breaks the EDG C++ frontend,
+    // so we only use it for Borland.
+    template <typename T> struct checker
+    {
+        static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
+        static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T);
+    };
+
+    static typename add_lvalue_reference<From>::type  _m_from;
+    static bool const value = sizeof( checker<To>::_m_check(_m_from) )
+        == sizeof(::boost::type_traits::yes_type);
+#pragma option pop
+};
+
+#elif defined(__GNUC__) || defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
+// special version for gcc compiler + recent Borland versions
+// note that this does not pass UDT's through (...)
+
+struct any_conversion
+{
+    template <typename T> any_conversion(const volatile T&);
+    template <typename T> any_conversion(const T&);
+    template <typename T> any_conversion(volatile T&);
+    template <typename T> any_conversion(T&);
+};
+
+template <typename T> struct checker
+{
+    static boost::type_traits::no_type _m_check(any_conversion ...);
+    static boost::type_traits::yes_type _m_check(T, int);
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl
+{
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type;
+    static lvalue_type _m_from;
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6)))
+    static bool const value =
+        sizeof( boost::detail::checker<To>::_m_check(static_cast<rvalue_type>(_m_from), 0) )
+        == sizeof(::boost::type_traits::yes_type);
+#else
+    static bool const value =
+        sizeof( boost::detail::checker<To>::_m_check(_m_from, 0) )
+        == sizeof(::boost::type_traits::yes_type);
+#endif
+};
+
+#elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \
+      || defined(__IBMCPP__) || defined(__HP_aCC)
+//
+// This is *almost* an ideal world implementation as it doesn't rely
+// on undefined behaviour by passing UDT's through (...).
+// Unfortunately it doesn't quite pass all the tests for most compilers (sigh...)
+// Enable this for your compiler if is_convertible_test.cpp will compile it...
+//
+// Note we do not enable this for VC7.1, because even though it passes all the
+// type_traits tests it is known to cause problems when instantiation occurs
+// deep within the instantiation tree :-(
+//
+struct any_conversion
+{
+    template <typename T> any_conversion(const volatile T&);
+    template <typename T> any_conversion(const T&);
+    template <typename T> any_conversion(volatile T&);
+    // we need this constructor to catch references to functions
+    // (which can not be cv-qualified):
+    template <typename T> any_conversion(T&);
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl
+{
+    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);
+    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type; 
+    static lvalue_type _m_from;
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#else
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#endif
+};
+
+#elif defined(__DMC__)
+
+struct any_conversion
+{
+    template <typename T> any_conversion(const volatile T&);
+    template <typename T> any_conversion(const T&);
+    template <typename T> any_conversion(volatile T&);
+    // we need this constructor to catch references to functions
+    // (which can not be cv-qualified):
+    template <typename T> any_conversion(T&);
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl
+{
+    // Using '...' doesn't always work on Digital Mars. This version seems to.
+    template <class T>
+    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion,  float, T);
+    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int);
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type;
+    static lvalue_type _m_from;
+
+    // Static constants sometime cause the conversion of _m_from to To to be
+    // called. This doesn't happen with an enum.
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    enum { value =
+        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0, 0) ) == sizeof(::boost::type_traits::yes_type)
+        };
+#else
+    enum { value =
+        sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type)
+        };
+#endif
+};
+
+#elif defined(__MWERKS__)
+// 
+// CW works with the technique implemented above for EDG, except when From
+// is a function type (or a reference to such a type), in which case
+// any_conversion won't be accepted as a valid conversion. We detect this
+// exceptional situation and channel it through an alternative algorithm.
+//
+
+template <typename From, typename To,bool FromIsFunctionRef>
+struct is_convertible_basic_impl_aux;
+
+struct any_conversion
+{
+    template <typename T> any_conversion(const volatile T&);
+    template <typename T> any_conversion(const T&);
+    template <typename T> any_conversion(volatile T&);
+    template <typename T> any_conversion(T&);
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl_aux<From,To,false /*FromIsFunctionRef*/>
+{
+    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);
+    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type; 
+    static lvalue_type _m_from;
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#else
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#endif
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl_aux<From,To,true /*FromIsFunctionRef*/>
+{
+    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
+    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type;
+    static lvalue_type _m_from;
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#else
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#endif
+};
+
+template <typename From, typename To>
+struct is_convertible_basic_impl:
+  is_convertible_basic_impl_aux<
+    From,To,
+    ::boost::is_function<typename ::boost::remove_reference<From>::type>::value
+  >
+{};
+
+#else
+//
+// This version seems to work pretty well for a wide spectrum of compilers,
+// however it does rely on undefined behaviour by passing UDT's through (...).
+//
+template <typename From, typename To>
+struct is_convertible_basic_impl
+{
+    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
+    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);
+    typedef typename add_lvalue_reference<From>::type lvalue_type;
+    typedef typename add_rvalue_reference<From>::type rvalue_type; 
+    static lvalue_type _m_from;
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4244)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(disable:6334)
+#endif
+#endif
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#else
+    BOOST_STATIC_CONSTANT(bool, value =
+        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)
+        );
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+};
+
+#endif // is_convertible_impl
+
+#if defined(__DMC__)
+// As before, a static constant sometimes causes errors on Digital Mars.
+template <typename From, typename To>
+struct is_convertible_impl
+{
+    enum { value =
+        (::boost::type_traits::ice_and<
+            ::boost::type_traits::ice_or<
+               ::boost::detail::is_convertible_basic_impl<From,To>::value,
+               ::boost::is_void<To>::value
+            >::value,
+            ::boost::type_traits::ice_not<
+               ::boost::is_array<To>::value
+            >::value,
+            ::boost::type_traits::ice_not<
+               ::boost::is_function<To>::value
+            >::value
+        >::value) };
+};
+#elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551
+template <typename From, typename To>
+struct is_convertible_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::type_traits::ice_and<
+            ::boost::type_traits::ice_or<
+               ::boost::detail::is_convertible_basic_impl<From,To>::value,
+               ::boost::is_void<To>::value
+            >::value,
+            ::boost::type_traits::ice_not<
+               ::boost::is_array<To>::value
+            >::value,
+            ::boost::type_traits::ice_not<
+               ::boost::is_function<To>::value
+            >::value
+        >::value)
+        );
+};
+#endif
+
+template <bool trivial1, bool trivial2, bool abstract_target>
+struct is_convertible_impl_select
+{
+   template <class From, class To>
+   struct rebind
+   {
+      typedef is_convertible_impl<From, To> type;
+   };
+};
+
+template <>
+struct is_convertible_impl_select<true, true, false>
+{
+   template <class From, class To>
+   struct rebind
+   {
+      typedef true_type type;
+   };
+};
+
+template <>
+struct is_convertible_impl_select<false, false, true>
+{
+   template <class From, class To>
+   struct rebind
+   {
+      typedef false_type type;
+   };
+};
+
+template <>
+struct is_convertible_impl_select<true, false, true>
+{
+   template <class From, class To>
+   struct rebind
+   {
+      typedef false_type type;
+   };
+};
+
+template <typename From, typename To>
+struct is_convertible_impl_dispatch_base
+{
+#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
+   typedef is_convertible_impl_select< 
+      ::boost::is_arithmetic<From>::value, 
+      ::boost::is_arithmetic<To>::value,
+#if !defined(BOOST_NO_IS_ABSTRACT) && !defined(BOOST_TT_CXX11_IS_CONVERTIBLE)
+      // We need to filter out abstract types, only if we don't have a strictly conforming C++11 version:
+      ::boost::is_abstract<To>::value
+#else
+      false
+#endif
+   > selector;
+#else
+   typedef is_convertible_impl_select<false, false, false> selector;
+#endif
+   typedef typename selector::template rebind<From, To> isc_binder;
+   typedef typename isc_binder::type type;
+};
+
+template <typename From, typename To>
+struct is_convertible_impl_dispatch 
+   : public is_convertible_impl_dispatch_base<From, To>::type
+{};
+
+//
+// Now add the full and partial specialisations
+// for void types, these are common to all the
+// implementation above:
+//
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+#   define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 volatile,value) \
+    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const volatile,value) \
+    /**/
+
+#   define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(trait,spec1,spec2,value) \
+    TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \
+    TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const,spec2,value) \
+    TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 volatile,spec2,value) \
+    TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const volatile,spec2,value) \
+    /**/
+
+    TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(is_convertible,void,void,true)
+
+#   undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2
+#   undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1
+
+#else
+    BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(is_convertible,void,void,true)
+#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS
+
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void,To,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const,To,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void volatile,To,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const volatile,To,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const volatile,false)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,(::boost::detail::is_convertible_impl_dispatch<From,To>::value))
+
+#else
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,BOOST_IS_CONVERTIBLE(From,To))
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_copy_assignable.hpp b/gatb-core/thirdparty/boost/type_traits/is_copy_assignable.hpp
new file mode 100644
index 0000000..48af818
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_copy_assignable.hpp
@@ -0,0 +1,147 @@
+//  (C) Copyright Ion Gaztanaga 2014.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
+#define BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/noncopyable.hpp>
+
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_CXX11_DECLTYPE) \
+   && !defined(BOOST_INTEL_CXX_VERSION) && \
+      !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+#define BOOST_TT_CXX11_IS_COPY_ASSIGNABLE
+#include <boost/utility/declval.hpp>
+#else
+   //For compilers without decltype
+   #include <boost/type_traits/is_const.hpp>
+   #include <boost/type_traits/is_array.hpp>
+   #include <boost/type_traits/add_reference.hpp>
+   #include <boost/type_traits/remove_reference.hpp>
+#endif
+
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <bool DerivedFromNoncopyable, class T>
+struct is_copy_assignable_impl2 {
+
+// Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+//
+// error: function *function_name* cannot be referenced -- it is a deleted function
+// static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+//                                                        ^ 
+//
+// MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+// https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+#if defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE)
+    typedef boost::type_traits::yes_type yes_type;
+    typedef boost::type_traits::no_type  no_type;
+
+    template <class U>
+    static decltype(::boost::declval<U&>() = ::boost::declval<const U&>(), yes_type() ) test(int);
+
+    template <class>
+    static no_type test(...);
+
+    static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
+
+#else
+    static BOOST_DEDUCED_TYPENAME boost::add_reference<T>::type produce();
+
+    template <class T1>
+    static boost::type_traits::no_type test(T1&, typename T1::boost_move_no_copy_constructor_or_assign* = 0);
+
+    static boost::type_traits::yes_type test(...);
+    // If you see errors like this:
+    //
+    //      `'T::operator=(const T&)' is private`
+    //      `boost/type_traits/is_copy_assignable.hpp:NN:M: error: within this context`
+    //
+    // then you are trying to call that macro for a structure defined like that:
+    //
+    //      struct T {
+    //          ...
+    //      private:
+    //          T & operator=(const T &);
+    //          ...
+    //      };
+    //
+    // To fix that you must modify your structure:
+    //
+    //      // C++03 and C++11 version
+    //      struct T: private boost::noncopyable {
+    //          ...
+    //      private:
+    //          T & operator=(const T &);
+    //          ...
+    //      };
+    //
+    //      // C++11 version
+    //      struct T {
+    //          ...
+    //      private:
+    //          T& operator=(const T &) = delete;
+    //          ...
+    //      };
+    BOOST_STATIC_CONSTANT(bool, value = (
+            sizeof(test(produce())) == sizeof(boost::type_traits::yes_type)
+    ));
+   #endif
+};
+
+template <class T>
+struct is_copy_assignable_impl2<true, T> {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <class T>
+struct is_copy_assignable_impl {
+
+#if !defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE)
+    //For compilers without decltype, at least return false on const types, arrays
+    //types derived from boost::noncopyable and types defined as BOOST_MOVEABLE_BUT_NOT_COPYABLE
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type unreferenced_t;
+    BOOST_STATIC_CONSTANT(bool, value = (
+        boost::detail::is_copy_assignable_impl2<
+            boost::is_base_and_derived<boost::noncopyable, T>::value
+            || boost::is_const<unreferenced_t>::value || boost::is_array<unreferenced_t>::value
+            ,T
+        >::value
+    ));
+    #else
+    BOOST_STATIC_CONSTANT(bool, value = (
+        boost::detail::is_copy_assignable_impl2<
+            boost::is_base_and_derived<boost::noncopyable, T>::value,T
+        >::value
+    ));
+    #endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_assignable,T,::boost::detail::is_copy_assignable_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_copy_constructible.hpp b/gatb-core/thirdparty/boost/type_traits/is_copy_constructible.hpp
new file mode 100644
index 0000000..24f5eeb
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_copy_constructible.hpp
@@ -0,0 +1,125 @@
+//  (C) Copyright Antony Polukhin 2013.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_COPY_CONSTRUCTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_COPY_CONSTRUCTIBLE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_rvalue_reference.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/noncopyable.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <bool DerivedFromNoncopyable, class T>
+struct is_copy_constructible_impl2 {
+
+// Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+//
+// error: function *function_name* cannot be referenced -- it is a deleted function
+// static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+//                                                        ^ 
+//
+// MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+// https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_INTEL_CXX_VERSION) && !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+
+#ifdef BOOST_NO_CXX11_DECLTYPE
+    template <class T1>
+    static boost::type_traits::yes_type test(T1&, boost::mpl::int_<sizeof(T1(boost::declval<T1&>()))>* = 0);
+#else
+    template <class T1>
+    static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+#endif
+
+    static boost::type_traits::no_type test(...);
+#else
+    template <class T1>
+    static boost::type_traits::no_type test(T1&, typename T1::boost_move_no_copy_constructor_or_assign* = 0);
+    static boost::type_traits::yes_type test(...);
+#endif
+
+    // If you see errors like this:
+    //
+    //      `'T::T(const T&)' is private`
+    //      `boost/type_traits/is_copy_constructible.hpp:68:5: error: within this context`
+    //
+    // then you are trying to call that macro for a structure defined like that:
+    //
+    //      struct T {
+    //          ...
+    //      private:
+    //          T(const T &);
+    //          ...
+    //      };
+    //
+    // To fix that you must modify your structure:
+    //
+    //      // C++03 and C++11 version
+    //      struct T: private boost::noncopyable {
+    //          ...
+    //      private:
+    //          T(const T &);
+    //          ...
+    //      };
+    //
+    //      // C++11 version
+    //      struct T {
+    //          ...
+    //      private:
+    //          T(const T &) = delete;
+    //          ...
+    //      };
+    BOOST_STATIC_CONSTANT(bool, value = (
+            sizeof(test(
+                boost::declval<BOOST_DEDUCED_TYPENAME boost::add_reference<T>::type>()
+            )) == sizeof(boost::type_traits::yes_type)
+        ||
+            boost::is_rvalue_reference<T>::value
+    ));
+};
+
+template <class T>
+struct is_copy_constructible_impl2<true, T> {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <class T>
+struct is_copy_constructible_impl {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        boost::detail::is_copy_constructible_impl2<
+            boost::is_base_and_derived<boost::noncopyable, T>::value,
+            T
+        >::value
+    ));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_constructible,T,::boost::detail::is_copy_constructible_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_COPY_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_empty.hpp b/gatb-core/thirdparty/boost/type_traits/is_empty.hpp
new file mode 100644
index 0000000..adb239e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_empty.hpp
@@ -0,0 +1,142 @@
+
+// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_EMPTY_HPP_INCLUDED
+#define BOOST_TT_IS_EMPTY_HPP_INCLUDED
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+#   include <boost/type_traits/remove_cv.hpp>
+#   include <boost/type_traits/is_class.hpp>
+#   include <boost/type_traits/add_reference.hpp>
+
+// should be always the last #include directive
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+#ifndef BOOST_INTERNAL_IS_EMPTY
+#define BOOST_INTERNAL_IS_EMPTY(T) false
+#else
+#define BOOST_INTERNAL_IS_EMPTY(T) BOOST_IS_EMPTY(T)
+#endif
+
+namespace boost {
+
+namespace detail {
+
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4624) // destructor could not be generated
+#endif
+
+template <typename T>
+struct empty_helper_t1 : public T
+{
+    empty_helper_t1();  // hh compiler bug workaround
+    int i[256];
+private:
+   // suppress compiler warnings:
+   empty_helper_t1(const empty_helper_t1&);
+   empty_helper_t1& operator=(const empty_helper_t1&);
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+struct empty_helper_t2 { int i[256]; };
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+
+template <typename T, bool is_a_class = false>
+struct empty_helper
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <typename T>
+struct empty_helper<T, true>
+{
+    BOOST_STATIC_CONSTANT(
+        bool, value = (sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2))
+        );
+};
+
+template <typename T>
+struct is_empty_impl
+{
+    typedef typename remove_cv<T>::type cvt;
+    BOOST_STATIC_CONSTANT(
+        bool, value = (
+            ::boost::type_traits::ice_or<
+              ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value
+              , BOOST_INTERNAL_IS_EMPTY(cvt)
+            >::value
+            ));
+};
+
+#else // __BORLANDC__
+
+template <typename T, bool is_a_class, bool convertible_to_int>
+struct empty_helper
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <typename T>
+struct empty_helper<T, true, false>
+{
+    BOOST_STATIC_CONSTANT(bool, value = (
+        sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2)
+        ));
+};
+
+template <typename T>
+struct is_empty_impl
+{
+   typedef typename remove_cv<T>::type cvt;
+   typedef typename add_reference<T>::type r_type;
+
+   BOOST_STATIC_CONSTANT(
+       bool, value = (
+           ::boost::type_traits::ice_or<
+              ::boost::detail::empty_helper<
+                  cvt
+                , ::boost::is_class<T>::value
+                , ::boost::is_convertible< r_type,int>::value
+              >::value
+              , BOOST_INTERNAL_IS_EMPTY(cvt)
+           >::value));
+};
+
+#endif // __BORLANDC__
+
+
+// these help when the compiler has no partial specialization support:
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const volatile,false)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_empty,T,::boost::detail::is_empty_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#undef BOOST_INTERNAL_IS_EMPTY
+
+#endif // BOOST_TT_IS_EMPTY_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_enum.hpp b/gatb-core/thirdparty/boost/type_traits/is_enum.hpp
new file mode 100644
index 0000000..7929c96
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_enum.hpp
@@ -0,0 +1,188 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_ENUM_HPP_INCLUDED
+#define BOOST_TT_IS_ENUM_HPP_INCLUDED
+
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_ENUM
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_array.hpp>
+#ifdef __GNUC__
+#include <boost/type_traits/is_function.hpp>
+#endif
+#include <boost/type_traits/config.hpp>
+#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) 
+#  include <boost/type_traits/is_class.hpp>
+#  include <boost/type_traits/is_union.hpp>
+#endif
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#ifndef BOOST_IS_ENUM
+#if !(defined(__BORLANDC__) && (__BORLANDC__ <= 0x551))
+
+namespace detail {
+
+#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) 
+
+template <typename T>
+struct is_class_or_union
+{
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_or<
+           ::boost::is_class<T>::value
+         , ::boost::is_union<T>::value
+      >::value));
+};
+
+#else
+
+template <typename T>
+struct is_class_or_union
+{
+# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581))// we simply can't detect it this way.
+    BOOST_STATIC_CONSTANT(bool, value = false);
+# else
+    template <class U> static ::boost::type_traits::yes_type is_class_or_union_tester(void(U::*)(void));
+
+#  if BOOST_WORKAROUND(__MWERKS__, <= 0x3000) // no SFINAE
+    static ::boost::type_traits::no_type is_class_or_union_tester(...);
+    BOOST_STATIC_CONSTANT(
+        bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::boost::type_traits::yes_type));
+#  else
+    template <class U>
+    static ::boost::type_traits::no_type is_class_or_union_tester(...);
+    BOOST_STATIC_CONSTANT(
+        bool, value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(::boost::type_traits::yes_type));
+#  endif
+# endif
+};
+#endif
+
+struct int_convertible
+{
+    int_convertible(int);
+};
+
+// Don't evaluate convertibility to int_convertible unless the type
+// is non-arithmetic. This suppresses warnings with GCC.
+template <bool is_typename_arithmetic_or_reference = true>
+struct is_enum_helper
+{
+    template <typename T> struct type
+    {
+        BOOST_STATIC_CONSTANT(bool, value = false);
+    };
+};
+
+template <>
+struct is_enum_helper<false>
+{
+    template <typename T> struct type
+       : public ::boost::is_convertible<typename boost::add_reference<T>::type,::boost::detail::int_convertible>
+    {
+    };
+};
+
+template <typename T> struct is_enum_impl
+{
+   //typedef ::boost::add_reference<T> ar_t;
+   //typedef typename ar_t::type r_type;
+
+#if defined(__GNUC__)
+
+#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
+    
+   // We MUST check for is_class_or_union on conforming compilers in
+   // order to correctly deduce that noncopyable types are not enums
+   // (dwa 2002/04/15)...
+   BOOST_STATIC_CONSTANT(bool, selector =
+      (::boost::type_traits::ice_or<
+           ::boost::is_arithmetic<T>::value
+         , ::boost::is_reference<T>::value
+         , ::boost::is_function<T>::value
+         , is_class_or_union<T>::value
+         , is_array<T>::value
+      >::value));
+#else
+   // ...however, not checking is_class_or_union on non-conforming
+   // compilers prevents a dependency recursion.
+   BOOST_STATIC_CONSTANT(bool, selector =
+      (::boost::type_traits::ice_or<
+           ::boost::is_arithmetic<T>::value
+         , ::boost::is_reference<T>::value
+         , ::boost::is_function<T>::value
+         , is_array<T>::value
+      >::value));
+#endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
+
+#else // !defined(__GNUC__):
+    
+   BOOST_STATIC_CONSTANT(bool, selector =
+      (::boost::type_traits::ice_or<
+           ::boost::is_arithmetic<T>::value
+         , ::boost::is_reference<T>::value
+         , is_class_or_union<T>::value
+         , is_array<T>::value
+      >::value));
+    
+#endif
+
+#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+    typedef ::boost::detail::is_enum_helper<
+          ::boost::detail::is_enum_impl<T>::selector
+        > se_t;
+#else
+    typedef ::boost::detail::is_enum_helper<selector> se_t;
+#endif
+
+    typedef typename se_t::template type<T> helper;
+    BOOST_STATIC_CONSTANT(bool, value = helper::value);
+};
+
+// these help on compilers with no partial specialization support:
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const volatile,false)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,::boost::detail::is_enum_impl<T>::value)
+
+#else // __BORLANDC__
+//
+// buggy is_convertible prevents working
+// implementation of is_enum:
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,false)
+
+#endif
+
+#else // BOOST_IS_ENUM
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,BOOST_IS_ENUM(T))
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_ENUM_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_final.hpp b/gatb-core/thirdparty/boost/type_traits/is_final.hpp
new file mode 100644
index 0000000..36bd62e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_final.hpp
@@ -0,0 +1,41 @@
+
+//  Copyright (c) 2014 Agustin Berge
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_FINAL_HPP_INCLUDED
+#define BOOST_TT_IS_FINAL_HPP_INCLUDED
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+template <typename T> struct is_final_impl
+{
+#ifdef BOOST_IS_FINAL
+   typedef typename remove_cv<T>::type cvt;
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_FINAL(cvt));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = false);
+#endif
+};
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_final,T,::boost::detail::is_final_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_FINAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_float.hpp b/gatb-core/thirdparty/boost/type_traits/is_float.hpp
new file mode 100644
index 0000000..25d16f1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_float.hpp
@@ -0,0 +1,27 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+//* is a type T a floating-point type described in the standard (3.9.1p8)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_float,T,false)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,float,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,double,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,long double,true)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_floating_point.hpp b/gatb-core/thirdparty/boost/type_traits/is_floating_point.hpp
new file mode 100755
index 0000000..2224453
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_floating_point.hpp
@@ -0,0 +1,27 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+//* is a type T a floating-point type described in the standard (3.9.1p8)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_floating_point,T,false)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,float,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,double,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,long double,true)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_function.hpp b/gatb-core/thirdparty/boost/type_traits/is_function.hpp
new file mode 100644
index 0000000..eeb4382
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_function.hpp
@@ -0,0 +1,109 @@
+
+//  Copyright 2000 John Maddock (john at johnmaddock.co.uk)
+//  Copyright 2002 Aleksey Gurtovoy (agurtovoy at meta-comm.com)
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_FUNCTION_HPP_INCLUDED
+#define BOOST_TT_IS_FUNCTION_HPP_INCLUDED
+
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/detail/false_result.hpp>
+#include <boost/config.hpp>
+
+#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
+#   include <boost/type_traits/detail/is_function_ptr_helper.hpp>
+#else
+#   include <boost/type_traits/detail/is_function_ptr_tester.hpp>
+#   include <boost/type_traits/detail/yes_no_type.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+// is a type a function?
+// Please note that this implementation is unnecessarily complex:
+// we could just use !is_convertible<T*, const volatile void*>::value,
+// except that some compilers erroneously allow conversions from
+// function pointers to void*.
+
+namespace boost {
+
+#if !defined( __CODEGEARC__ )
+
+namespace detail {
+
+#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
+template<bool is_ref = true>
+struct is_function_chooser
+    : public ::boost::type_traits::false_result
+{
+};
+
+template <>
+struct is_function_chooser<false>
+{
+    template< typename T > struct result_
+        : public ::boost::type_traits::is_function_ptr_helper<T*>
+    {
+    };
+};
+
+template <typename T>
+struct is_function_impl
+    : public is_function_chooser< ::boost::is_reference<T>::value >
+        ::BOOST_NESTED_TEMPLATE result_<T>
+{
+};
+
+#else
+
+template <typename T>
+struct is_function_impl
+{
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(push)
+#pragma warning(disable:6334)
+#endif
+    static T* t;
+    BOOST_STATIC_CONSTANT(
+        bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t))
+        == sizeof(::boost::type_traits::yes_type)
+        );
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(pop)
+#endif
+};
+
+template <typename T>
+struct is_function_impl<T&> : public false_type
+{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <typename T>
+struct is_function_impl<T&&> : public false_type
+{};
+#endif
+
+#endif
+
+} // namespace detail
+
+#endif // !defined( __CODEGEARC__ )
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,__is_function(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl<T>::value)
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_function,T&&,false)
+#endif
+#endif
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_fundamental.hpp b/gatb-core/thirdparty/boost/type_traits/is_fundamental.hpp
new file mode 100644
index 0000000..138e296
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_fundamental.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED
+#define BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T> 
+struct is_fundamental_impl
+    : public ::boost::type_traits::ice_or< 
+          ::boost::is_arithmetic<T>::value
+        , ::boost::is_void<T>::value
+        >
+{ 
+};
+
+} // namespace detail
+
+//* is a type T a fundamental type described in the standard (3.9.1)
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,__is_fundamental(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,::boost::detail::is_fundamental_impl<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_integral.hpp b/gatb-core/thirdparty/boost/type_traits/is_integral.hpp
new file mode 100644
index 0000000..6bfad49
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_integral.hpp
@@ -0,0 +1,88 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
+#define BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3)
+// as an extension we include long long, as this is likely to be added to the
+// standard at a later date
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,__is_integral(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,false)
+
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned char,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned short,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned int,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned long,true)
+
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed char,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed short,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed int,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed long,true)
+
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,bool,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char,true)
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+// If the following line fails to compile and you're using the Intel
+// compiler, see http://lists.boost.org/MailArchives/boost-users/msg06567.php,
+// and define BOOST_NO_INTRINSIC_WCHAR_T on the command line.
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,wchar_t,true)
+#endif
+
+// Same set of integral types as in boost/type_traits/integral_promotion.hpp.
+// Please, keep in sync. -- Alexander Nasonov
+#if (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \
+    || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300))
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int8,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int8,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int16,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int16,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int32,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int32,true)
+#ifdef __BORLANDC__
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true)
+#endif
+#endif
+
+# if defined(BOOST_HAS_LONG_LONG)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::ulong_long_type,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::long_long_type,true)
+#elif defined(BOOST_HAS_MS_INT64)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true)
+#endif
+        
+#ifdef BOOST_HAS_INT128
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::int128_type,true)
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::uint128_type,true)
+#endif
+#ifndef BOOST_NO_CXX11_CHAR16_T
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char16_t,true)
+#endif
+#ifndef BOOST_NO_CXX11_CHAR32_T
+BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char32_t,true)
+#endif
+
+#endif  // non-CodeGear implementation
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_lvalue_reference.hpp b/gatb-core/thirdparty/boost/type_traits/is_lvalue_reference.hpp
new file mode 100644
index 0000000..0b0130a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_lvalue_reference.hpp
@@ -0,0 +1,56 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_lvalue_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED
+#define BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,__is_reference(T))
+#else
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T&,true)
+
+#if  defined(BOOST_ILLEGAL_CV_REFERENCES)
+// these are illegal specialisations; cv-qualifies applied to
+// references have no effect according to [8.3.2p1],
+// C++ Builder requires them though as it treats cv-qualified
+// references as distinct types...
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& const,true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& volatile,true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& const volatile,true)
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_member_function_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/is_member_function_pointer.hpp
new file mode 100644
index 0000000..d1c3690
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_member_function_pointer.hpp
@@ -0,0 +1,133 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+#define BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
+   //
+   // Note: we use the "workaround" version for MSVC because it works for 
+   // __stdcall etc function types, where as the partial specialisation
+   // version does not do so.
+   //
+#   include <boost/type_traits/detail/is_mem_fun_pointer_impl.hpp>
+#   include <boost/type_traits/remove_cv.hpp>
+#else
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_array.hpp>
+#   include <boost/type_traits/detail/yes_no_type.hpp>
+#   include <boost/type_traits/detail/false_result.hpp>
+#   include <boost/type_traits/detail/ice_or.hpp>
+#   include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,__is_member_function_pointer( T ))
+#elif !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(
+      is_member_function_pointer
+    , T
+    , ::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value
+    )
+
+#else
+
+namespace detail {
+
+#ifndef __BORLANDC__
+
+template <bool>
+struct is_mem_fun_pointer_select
+    : public ::boost::type_traits::false_result
+{
+};
+
+template <>
+struct is_mem_fun_pointer_select<false>
+{
+    template <typename T> struct result_
+    {
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(push)
+#pragma warning(disable:6334)
+#endif
+        static T* make_t;
+        typedef result_<T> self_type;
+
+        BOOST_STATIC_CONSTANT(
+            bool, value = (
+                1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(self_type::make_t))
+            ));
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+#pragma warning(pop)
+#endif
+    };
+};
+
+template <typename T>
+struct is_member_function_pointer_impl
+    : public is_mem_fun_pointer_select<
+          ::boost::type_traits::ice_or<
+              ::boost::is_reference<T>::value
+            , ::boost::is_array<T>::value
+            >::value
+        >::template result_<T>
+{
+};
+
+template <typename T>
+struct is_member_function_pointer_impl<T&> : public false_type{};
+
+#else // Borland C++
+
+template <typename T>
+struct is_member_function_pointer_impl
+{
+   static T* m_t;
+   BOOST_STATIC_CONSTANT(
+              bool, value =
+               (1 == sizeof(type_traits::is_mem_fun_pointer_tester(m_t))) );
+};
+
+template <typename T>
+struct is_member_function_pointer_impl<T&>
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+#endif
+
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const volatile,false)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,::boost::detail::is_member_function_pointer_impl<T>::value)
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_member_object_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/is_member_object_pointer.hpp
new file mode 100755
index 0000000..66b76c9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_member_object_pointer.hpp
@@ -0,0 +1,46 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+#define BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <typename T>
+struct is_member_object_pointer_impl
+{
+   BOOST_STATIC_CONSTANT(
+      bool, value = (::boost::type_traits::ice_and<
+         ::boost::is_member_pointer<T>::value,
+         ::boost::type_traits::ice_not<
+            ::boost::is_member_function_pointer<T>::value
+         >::value
+      >::value ));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_object_pointer,T,::boost::detail::is_member_object_pointer_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_member_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/is_member_pointer.hpp
new file mode 100644
index 0000000..cba31af
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_member_pointer.hpp
@@ -0,0 +1,65 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
+#define BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+#   include <boost/type_traits/is_member_function_pointer.hpp>
+#else
+#   include <boost/type_traits/is_reference.hpp>
+#   include <boost/type_traits/is_array.hpp>
+#   include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>
+#   include <boost/type_traits/detail/yes_no_type.hpp>
+#   include <boost/type_traits/detail/false_result.hpp>
+#   include <boost/type_traits/detail/ice_or.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,__is_member_pointer(T))
+#elif BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
+
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::is_member_function_pointer<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
+
+#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003) && !BOOST_WORKAROUND(__IBMCPP__, <=600)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const,true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*volatile,true)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const volatile,true)
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_assignable.hpp b/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_assignable.hpp
new file mode 100644
index 0000000..3268307
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_assignable.hpp
@@ -0,0 +1,108 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  (C) Copyright Eric Friedman 2002-2003.
+//  (C) Copyright Antony Polukhin 2013.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_NOTHROW_MOVE_ASSIGNABLE_HPP_INCLUDED
+#define BOOST_TT_IS_NOTHROW_MOVE_ASSIGNABLE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/has_trivial_move_assign.hpp>
+#include <boost/type_traits/has_nothrow_assign.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/utility/declval.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+#ifdef BOOST_IS_NOTHROW_MOVE_ASSIGN
+
+template <class T>
+struct is_nothrow_move_assignable_imp{ BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_NOTHROW_MOVE_ASSIGN(T)); };
+template <class T>
+struct is_nothrow_move_assignable_imp<T const>{ BOOST_STATIC_CONSTANT(bool, value = false); };
+template <class T>
+struct is_nothrow_move_assignable_imp<T volatile>{ BOOST_STATIC_CONSTANT(bool, value = false); };
+template <class T>
+struct is_nothrow_move_assignable_imp<T const volatile>{ BOOST_STATIC_CONSTANT(bool, value = false); };
+template <class T>
+struct is_nothrow_move_assignable_imp<T&>{ BOOST_STATIC_CONSTANT(bool, value = false); };
+template <class T>
+struct is_nothrow_move_assignable_imp<T&&>{ BOOST_STATIC_CONSTANT(bool, value = false); };
+
+
+#elif !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR)
+
+template <class T, class Enable = void>
+struct false_or_cpp11_noexcept_move_assignable: public ::boost::false_type {};
+
+template <class T>
+struct false_or_cpp11_noexcept_move_assignable <
+        T,
+        typename ::boost::enable_if_c<sizeof(T) && BOOST_NOEXCEPT_EXPR(::boost::declval<T&>() = ::boost::declval<T>())>::type
+    > : public ::boost::integral_constant<bool, BOOST_NOEXCEPT_EXPR(::boost::declval<T&>() = ::boost::declval<T>())>
+{};
+
+template <class T>
+struct is_nothrow_move_assignable_imp{
+    BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::false_or_cpp11_noexcept_move_assignable<T>::value);
+};
+
+template <class T>
+struct is_nothrow_move_assignable_imp<T const> : public ::boost::false_type {};
+template <class T>
+struct is_nothrow_move_assignable_imp<T volatile> : public ::boost::false_type{};
+template <class T>
+struct is_nothrow_move_assignable_imp<T const volatile> : public ::boost::false_type{};
+template <class T>
+struct is_nothrow_move_assignable_imp<T&> : public ::boost::false_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T>
+struct is_nothrow_move_assignable_imp<T&&> : public ::boost::false_type{};
+#endif
+
+#else
+
+template <class T>
+struct is_nothrow_move_assignable_imp{
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::type_traits::ice_and<
+            ::boost::type_traits::ice_or<
+                ::boost::has_trivial_move_assign<T>::value,
+                ::boost::has_nothrow_assign<T>::value
+            >::value,
+            ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value
+        >::value));
+};
+
+#endif
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_nothrow_move_assignable,T,::boost::detail::is_nothrow_move_assignable_imp<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_NOTHROW_MOVE_ASSIGNABLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_constructible.hpp b/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_constructible.hpp
new file mode 100644
index 0000000..c09d5d1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_nothrow_move_constructible.hpp
@@ -0,0 +1,109 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  (C) Copyright Eric Friedman 2002-2003.
+//  (C) Copyright Antony Polukhin 2013.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_NOTHROW_MOVE_CONSTRUCTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_NOTHROW_MOVE_CONSTRUCTIBLE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/has_trivial_move_constructor.hpp>
+#include <boost/type_traits/has_nothrow_copy.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/utility/enable_if.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+#ifdef BOOST_IS_NOTHROW_MOVE_CONSTRUCT
+
+template <class T>
+struct is_nothrow_move_constructible_imp{
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T));
+};
+
+template <class T>
+struct is_nothrow_move_constructible_imp<volatile T> : public ::boost::false_type {};
+template <class T>
+struct is_nothrow_move_constructible_imp<const volatile T> : public ::boost::false_type{};
+template <class T>
+struct is_nothrow_move_constructible_imp<T&> : public ::boost::false_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T>
+struct is_nothrow_move_constructible_imp<T&&> : public ::boost::false_type{};
+#endif
+
+#elif !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR)
+
+template <class T, class Enable = void>
+struct false_or_cpp11_noexcept_move_constructible: public ::boost::false_type {};
+
+template <class T>
+struct false_or_cpp11_noexcept_move_constructible <
+        T,
+        typename ::boost::enable_if_c<sizeof(T) && BOOST_NOEXCEPT_EXPR(T(::boost::declval<T>()))>::type
+    > : public ::boost::integral_constant<bool, BOOST_NOEXCEPT_EXPR(T(::boost::declval<T>()))>
+{};
+
+template <class T>
+struct is_nothrow_move_constructible_imp{
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::false_or_cpp11_noexcept_move_constructible<T>::value);
+};
+
+template <class T>
+struct is_nothrow_move_constructible_imp<volatile T> : public ::boost::false_type {};
+template <class T>
+struct is_nothrow_move_constructible_imp<const volatile T> : public ::boost::false_type{};
+template <class T>
+struct is_nothrow_move_constructible_imp<T&> : public ::boost::false_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T>
+struct is_nothrow_move_constructible_imp<T&&> : public ::boost::false_type{};
+#endif
+
+#else
+
+template <class T>
+struct is_nothrow_move_constructible_imp{
+    BOOST_STATIC_CONSTANT(bool, value =(
+        ::boost::type_traits::ice_and<
+            ::boost::type_traits::ice_or<
+                ::boost::has_trivial_move_constructor<T>::value,
+                ::boost::has_nothrow_copy<T>::value
+            >::value,
+            ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value
+        >::value));
+};
+
+#endif
+
+}
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_nothrow_move_constructible,T,::boost::detail::is_nothrow_move_constructible_imp<T>::value)
+
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_NOTHROW_MOVE_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_object.hpp b/gatb-core/thirdparty/boost/type_traits/is_object.hpp
new file mode 100644
index 0000000..1d1ae4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_object.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_OBJECT_HPP_INCLUDED
+#define BOOST_TT_IS_OBJECT_HPP_INCLUDED
+
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_object_impl
+{
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_and<
+         ::boost::type_traits::ice_not< ::boost::is_reference<T>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_void<T>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_function<T>::value>::value
+      >::value));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_object,T,::boost::detail::is_object_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_OBJECT_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_pod.hpp b/gatb-core/thirdparty/boost/type_traits/is_pod.hpp
new file mode 100644
index 0000000..820a3ce
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_pod.hpp
@@ -0,0 +1,79 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_POD_HPP_INCLUDED
+#define BOOST_TT_IS_POD_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/is_scalar.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+#ifndef BOOST_IS_POD
+#define BOOST_INTERNAL_IS_POD(T) false
+#else
+#define BOOST_INTERNAL_IS_POD(T) BOOST_IS_POD(T)
+#endif
+
+namespace boost {
+
+// forward declaration, needed by 'is_pod_array_helper' template below
+template< typename T > struct is_POD;
+
+namespace detail {
+
+
+template <typename T> struct is_pod_impl
+{ 
+    BOOST_STATIC_CONSTANT(
+        bool, value =
+        (::boost::type_traits::ice_or<
+            ::boost::is_scalar<T>::value,
+            ::boost::is_void<T>::value,
+            BOOST_INTERNAL_IS_POD(T)
+         >::value));
+};
+
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+template <typename T, std::size_t sz>
+struct is_pod_impl<T[sz]>
+    : public is_pod_impl<T>
+{
+};
+#endif
+
+
+// the following help compilers without partial specialization support:
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void,true)
+
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void volatile,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const volatile,true)
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pod,T,::boost::detail::is_pod_impl<T>::value)
+// is_POD is the old depricated name for this trait, do not use this as it may
+// be removed in future without warning!!
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_POD,T,::boost::is_pod<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#undef BOOST_INTERNAL_IS_POD
+
+#endif // BOOST_TT_IS_POD_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/is_pointer.hpp
new file mode 100644
index 0000000..aad30f2
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_pointer.hpp
@@ -0,0 +1,88 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_POINTER_HPP_INCLUDED
+#define BOOST_TT_IS_POINTER_HPP_INCLUDED
+
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,__is_pointer(T))
+#else
+
+namespace detail {
+
+template< typename T > struct is_pointer_helper
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+#   define TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(helper,sp,result) \
+template< typename T > struct helper<sp> \
+{ \
+    BOOST_STATIC_CONSTANT(bool, value = result); \
+}; \
+/**/
+
+TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(is_pointer_helper,T*,true)
+
+#   undef TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC
+
+template< typename T >
+struct is_pointer_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::type_traits::ice_and<
+        ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value
+            , ::boost::type_traits::ice_not<
+                ::boost::is_member_pointer<T>::value
+                >::value
+            >::value)
+        );
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,::boost::detail::is_pointer_impl<T>::value)
+
+#if defined(__BORLANDC__) && !defined(__COMO__) && (__BORLANDC__ < 0x600)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const volatile,false)
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_polymorphic.hpp b/gatb-core/thirdparty/boost/type_traits/is_polymorphic.hpp
new file mode 100644
index 0000000..aac9851
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_polymorphic.hpp
@@ -0,0 +1,123 @@
+//  (C) Copyright John Maddock 2000. 
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_POLYMORPHIC_HPP
+#define BOOST_TT_IS_POLYMORPHIC_HPP
+
+#include <boost/type_traits/intrinsics.hpp>
+#ifndef BOOST_IS_POLYMORPHIC
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#endif
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif
+
+namespace boost{
+
+#ifndef BOOST_IS_POLYMORPHIC
+
+namespace detail{
+
+template <class T>
+struct is_polymorphic_imp1
+{
+# if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always.
+    typedef char d1, (&d2)[2];
+# else 
+   typedef typename remove_cv<T>::type ncvT;
+   struct d1 : public ncvT
+   {
+      d1();
+#  if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC
+      ~d1()throw();
+#  endif 
+      char padding[256];
+   private:
+      // keep some picky compilers happy:
+      d1(const d1&);
+      d1& operator=(const d1&);
+   };
+   struct d2 : public ncvT
+   {
+      d2();
+      virtual ~d2()throw();
+#  if !defined(BOOST_MSVC) && !defined(__ICL)
+      // for some reason this messes up VC++ when T has virtual bases,
+      // probably likewise for compilers that use the same ABI:
+      struct unique{};
+      virtual void unique_name_to_boost5487629(unique*);
+#  endif
+      char padding[256];
+   private:
+      // keep some picky compilers happy:
+      d2(const d2&);
+      d2& operator=(const d2&);
+   };
+# endif 
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1)));
+};
+
+template <class T>
+struct is_polymorphic_imp2
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <bool is_class>
+struct is_polymorphic_selector
+{
+   template <class T>
+   struct rebind
+   {
+      typedef is_polymorphic_imp2<T> type;
+   };
+};
+
+template <>
+struct is_polymorphic_selector<true>
+{
+   template <class T>
+   struct rebind
+   {
+      typedef is_polymorphic_imp1<T> type;
+   };
+};
+
+template <class T>
+struct is_polymorphic_imp
+{
+   typedef is_polymorphic_selector< ::boost::is_class<T>::value> selector;
+   typedef typename selector::template rebind<T> binder;
+   typedef typename binder::type imp_type;
+   BOOST_STATIC_CONSTANT(bool, value = imp_type::value);
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,::boost::detail::is_polymorphic_imp<T>::value)
+
+#else // BOOST_IS_POLYMORPHIC
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,BOOST_IS_POLYMORPHIC(T))
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/is_reference.hpp b/gatb-core/thirdparty/boost/type_traits/is_reference.hpp
new file mode 100644
index 0000000..49b5f9f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_reference.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000, 2010. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_REFERENCE_HPP_INCLUDED
+#define BOOST_TT_IS_REFERENCE_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/is_lvalue_reference.hpp>
+#include <boost/type_traits/is_rvalue_reference.hpp>
+#include <boost/type_traits/ice.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_reference_impl
+{
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_or<
+         ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value
+       >::value));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,::boost::detail::is_reference_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_rvalue_reference.hpp b/gatb-core/thirdparty/boost/type_traits/is_rvalue_reference.hpp
new file mode 100644
index 0000000..93cd0bf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_rvalue_reference.hpp
@@ -0,0 +1,29 @@
+
+//  (C) John Maddock 2010. 
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED
+#define BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_rvalue_reference,T,false)
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_rvalue_reference,T&&,true)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_same.hpp b/gatb-core/thirdparty/boost/type_traits/is_same.hpp
new file mode 100644
index 0000000..c8987b0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_same.hpp
@@ -0,0 +1,45 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_SAME_HPP_INCLUDED
+#define BOOST_TT_IS_SAME_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_same,T,U,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T,T,true)
+#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
+// without this, Borland's compiler gives the wrong answer for
+// references to arrays:
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T&,T&,true)
+#endif
+
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif  // BOOST_TT_IS_SAME_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/is_scalar.hpp b/gatb-core/thirdparty/boost/type_traits/is_scalar.hpp
new file mode 100644
index 0000000..4af3def
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_scalar.hpp
@@ -0,0 +1,55 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_SCALAR_HPP_INCLUDED
+#define BOOST_TT_IS_SCALAR_HPP_INCLUDED
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_scalar_impl
+{ 
+   BOOST_STATIC_CONSTANT(bool, value =
+      (::boost::type_traits::ice_or<
+         ::boost::is_arithmetic<T>::value,
+         ::boost::is_enum<T>::value,
+         ::boost::is_pointer<T>::value,
+         ::boost::is_member_pointer<T>::value
+      >::value));
+};
+
+// these specializations are only really needed for compilers 
+// without partial specialization support:
+template <> struct is_scalar_impl<void>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+template <> struct is_scalar_impl<void const>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
+template <> struct is_scalar_impl<void volatile>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
+template <> struct is_scalar_impl<void const volatile>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scalar,T,::boost::detail::is_scalar_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_SCALAR_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_signed.hpp b/gatb-core/thirdparty/boost/type_traits/is_signed.hpp
new file mode 100644
index 0000000..5673284
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_signed.hpp
@@ -0,0 +1,136 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_SIGNED_HPP_INCLUDED
+#define BOOST_TT_IS_SIGNED_HPP_INCLUDED
+
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if !defined( __CODEGEARC__ )
+
+namespace detail{
+
+#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) && !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+
+template <class T>
+struct is_signed_values
+{
+   //
+   // Note that we cannot use BOOST_STATIC_CONSTANT here, using enum's
+   // rather than "real" static constants simply doesn't work or give
+   // the correct answer.
+   //
+   typedef typename remove_cv<T>::type no_cv_t;
+   static const no_cv_t minus_one = (static_cast<no_cv_t>(-1));
+   static const no_cv_t zero = (static_cast<no_cv_t>(0));
+};
+
+template <class T>
+struct is_signed_helper
+{
+   typedef typename remove_cv<T>::type no_cv_t;
+   BOOST_STATIC_CONSTANT(bool, value = (!(::boost::detail::is_signed_values<T>::minus_one  > boost::detail::is_signed_values<T>::zero)));
+};
+
+template <bool integral_type>
+struct is_signed_select_helper
+{
+   template <class T>
+   struct rebind
+   {
+      typedef is_signed_helper<T> type;
+   };
+};
+
+template <>
+struct is_signed_select_helper<false>
+{
+   template <class T>
+   struct rebind
+   {
+      typedef false_type type;
+   };
+};
+
+template <class T>
+struct is_signed_imp
+{
+   typedef is_signed_select_helper< 
+      ::boost::type_traits::ice_or<
+         ::boost::is_integral<T>::value,
+         ::boost::is_enum<T>::value>::value 
+   > selector;
+   typedef typename selector::template rebind<T> binder;
+   typedef typename binder::type type;
+   BOOST_STATIC_CONSTANT(bool, value = type::value);
+};
+
+#else
+
+template <class T> struct is_signed_imp : public false_type{};
+template <> struct is_signed_imp<signed char> : public true_type{};
+template <> struct is_signed_imp<const signed char> : public true_type{};
+template <> struct is_signed_imp<volatile signed char> : public true_type{};
+template <> struct is_signed_imp<const volatile signed char> : public true_type{};
+template <> struct is_signed_imp<short> : public true_type{};
+template <> struct is_signed_imp<const short> : public true_type{};
+template <> struct is_signed_imp<volatile short> : public true_type{};
+template <> struct is_signed_imp<const volatile short> : public true_type{};
+template <> struct is_signed_imp<int> : public true_type{};
+template <> struct is_signed_imp<const int> : public true_type{};
+template <> struct is_signed_imp<volatile int> : public true_type{};
+template <> struct is_signed_imp<const volatile int> : public true_type{};
+template <> struct is_signed_imp<long> : public true_type{};
+template <> struct is_signed_imp<const long> : public true_type{};
+template <> struct is_signed_imp<volatile long> : public true_type{};
+template <> struct is_signed_imp<const volatile long> : public true_type{};
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct is_signed_imp<long long> : public true_type{};
+template <> struct is_signed_imp<const long long> : public true_type{};
+template <> struct is_signed_imp<volatile long long> : public true_type{};
+template <> struct is_signed_imp<const volatile long long> : public true_type{};
+#endif
+#if defined(CHAR_MIN) && (CHAR_MIN != 0)
+template <> struct is_signed_imp<char> : public true_type{};
+template <> struct is_signed_imp<const char> : public true_type{};
+template <> struct is_signed_imp<volatile char> : public true_type{};
+template <> struct is_signed_imp<const volatile char> : public true_type{};
+#endif
+#if defined(WCHAR_MIN) && (WCHAR_MIN != 0)
+template <> struct is_signed_imp<wchar_t> : public true_type{};
+template <> struct is_signed_imp<const wchar_t> : public true_type{};
+template <> struct is_signed_imp<volatile wchar_t> : public true_type{};
+template <> struct is_signed_imp<const volatile wchar_t> : public true_type{};
+#endif
+
+#endif
+
+}
+
+#endif // !defined( __CODEGEARC__ )
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,__is_signed(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,::boost::detail::is_signed_imp<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_stateless.hpp b/gatb-core/thirdparty/boost/type_traits/is_stateless.hpp
new file mode 100644
index 0000000..d8d4063
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_stateless.hpp
@@ -0,0 +1,48 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_STATELESS_HPP_INCLUDED
+#define BOOST_TT_IS_STATELESS_HPP_INCLUDED
+
+#include <boost/type_traits/has_trivial_constructor.hpp>
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_empty.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_stateless_impl
+{
+  BOOST_STATIC_CONSTANT(bool, value = 
+    (::boost::type_traits::ice_and<
+       ::boost::has_trivial_constructor<T>::value,
+       ::boost::has_trivial_copy<T>::value,
+       ::boost::has_trivial_destructor<T>::value,
+       ::boost::is_class<T>::value,
+       ::boost::is_empty<T>::value
+     >::value));
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_stateless,T,::boost::detail::is_stateless_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_STATELESS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_union.hpp b/gatb-core/thirdparty/boost/type_traits/is_union.hpp
new file mode 100644
index 0000000..610f162
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_union.hpp
@@ -0,0 +1,57 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_UNION_HPP_INCLUDED
+#define BOOST_TT_IS_UNION_HPP_INCLUDED
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+#ifndef __GNUC__
+template <typename T> struct is_union_impl
+{
+   typedef typename remove_cv<T>::type cvt;
+#ifdef BOOST_IS_UNION
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(cvt));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = false);
+#endif
+};
+#else
+//
+// using remove_cv here generates a whole load of needless
+// warnings with gcc, since it doesn't do any good with gcc
+// in any case (at least at present), just remove it:
+//
+template <typename T> struct is_union_impl
+{
+#ifdef BOOST_IS_UNION
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(T));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = false);
+#endif
+};
+#endif
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_union,T,::boost::detail::is_union_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_UNION_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_unsigned.hpp b/gatb-core/thirdparty/boost/type_traits/is_unsigned.hpp
new file mode 100644
index 0000000..0602838
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_unsigned.hpp
@@ -0,0 +1,135 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_UNSIGNED_HPP_INCLUDED
+#define BOOST_TT_IS_UNSIGNED_HPP_INCLUDED
+
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+#if !defined( __CODEGEARC__ )
+
+namespace detail{
+
+#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) && !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+
+template <class T>
+struct is_unsigned_values
+{
+   //
+   // Note that we cannot use BOOST_STATIC_CONSTANT here, using enum's
+   // rather than "real" static constants simply doesn't work or give
+   // the correct answer.
+   //
+   typedef typename remove_cv<T>::type no_cv_t;
+   static const no_cv_t minus_one = (static_cast<no_cv_t>(-1));
+   static const no_cv_t zero = (static_cast<no_cv_t>(0));
+};
+
+template <class T>
+struct is_ununsigned_helper
+{
+   BOOST_STATIC_CONSTANT(bool, value = (::boost::detail::is_unsigned_values<T>::minus_one > ::boost::detail::is_unsigned_values<T>::zero));
+};
+
+template <bool integral_type>
+struct is_ununsigned_select_helper
+{
+   template <class T>
+   struct rebind
+   {
+      typedef is_ununsigned_helper<T> type;
+   };
+};
+
+template <>
+struct is_ununsigned_select_helper<false>
+{
+   template <class T>
+   struct rebind
+   {
+      typedef false_type type;
+   };
+};
+
+template <class T>
+struct is_unsigned_imp
+{
+   typedef is_ununsigned_select_helper< 
+      ::boost::type_traits::ice_or<
+         ::boost::is_integral<T>::value,
+         ::boost::is_enum<T>::value>::value 
+   > selector;
+   typedef typename selector::template rebind<T> binder;
+   typedef typename binder::type type;
+   BOOST_STATIC_CONSTANT(bool, value = type::value);
+};
+
+#else
+
+template <class T> struct is_unsigned_imp : public false_type{};
+template <> struct is_unsigned_imp<unsigned char> : public true_type{};
+template <> struct is_unsigned_imp<const unsigned char> : public true_type{};
+template <> struct is_unsigned_imp<volatile unsigned char> : public true_type{};
+template <> struct is_unsigned_imp<const volatile unsigned char> : public true_type{};
+template <> struct is_unsigned_imp<unsigned short> : public true_type{};
+template <> struct is_unsigned_imp<const unsigned short> : public true_type{};
+template <> struct is_unsigned_imp<volatile unsigned short> : public true_type{};
+template <> struct is_unsigned_imp<const volatile unsigned short> : public true_type{};
+template <> struct is_unsigned_imp<unsigned int> : public true_type{};
+template <> struct is_unsigned_imp<const unsigned int> : public true_type{};
+template <> struct is_unsigned_imp<volatile unsigned int> : public true_type{};
+template <> struct is_unsigned_imp<const volatile unsigned int> : public true_type{};
+template <> struct is_unsigned_imp<unsigned long> : public true_type{};
+template <> struct is_unsigned_imp<const unsigned long> : public true_type{};
+template <> struct is_unsigned_imp<volatile unsigned long> : public true_type{};
+template <> struct is_unsigned_imp<const volatile unsigned long> : public true_type{};
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct is_unsigned_imp<unsigned long long> : public true_type{};
+template <> struct is_unsigned_imp<const unsigned long long> : public true_type{};
+template <> struct is_unsigned_imp<volatile unsigned long long> : public true_type{};
+template <> struct is_unsigned_imp<const volatile unsigned long long> : public true_type{};
+#endif
+#if defined(CHAR_MIN) && (CHAR_MIN == 0)
+template <> struct is_unsigned_imp<char> : public true_type{};
+template <> struct is_unsigned_imp<const char> : public true_type{};
+template <> struct is_unsigned_imp<volatile char> : public true_type{};
+template <> struct is_unsigned_imp<const volatile char> : public true_type{};
+#endif
+#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+template <> struct is_unsigned_imp<wchar_t> : public true_type{};
+template <> struct is_unsigned_imp<const wchar_t> : public true_type{};
+template <> struct is_unsigned_imp<volatile wchar_t> : public true_type{};
+template <> struct is_unsigned_imp<const volatile wchar_t> : public true_type{};
+#endif
+
+#endif
+
+}
+
+#endif // !defined( __CODEGEARC__ )
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,__is_unsigned(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,::boost::detail::is_unsigned_imp<T>::value)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_virtual_base_of.hpp b/gatb-core/thirdparty/boost/type_traits/is_virtual_base_of.hpp
new file mode 100644
index 0000000..3daad1b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_virtual_base_of.hpp
@@ -0,0 +1,117 @@
+//  (C) Copyright Daniel Frey and Robert Ramey 2009.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+ 
+#ifndef BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED
+#define BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED
+
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+namespace detail {
+
+
+#ifdef BOOST_MSVC
+#pragma warning( push )
+#pragma warning( disable : 4584 4250)
+#elif defined(__GNUC__) && (__GNUC__ >= 4)
+#pragma GCC system_header
+#endif
+
+template<typename Base, typename Derived, typename tag>
+struct is_virtual_base_of_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template<typename Base, typename Derived>
+struct is_virtual_base_of_impl<Base, Derived, mpl::true_>
+{
+   union max_align
+   {
+      unsigned u;
+      unsigned long ul;
+      void* v;
+      double d;
+      long double ld;
+#ifndef BOOST_NO_LONG_LONG
+      long long ll;
+#endif
+   };
+#ifdef __BORLANDC__
+    struct boost_type_traits_internal_struct_X : public virtual Derived, public virtual Base 
+    {
+       boost_type_traits_internal_struct_X();
+       boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&);
+       boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&);
+       ~boost_type_traits_internal_struct_X()throw();
+       max_align data[4];
+    };
+    struct boost_type_traits_internal_struct_Y : public virtual Derived 
+    {
+       boost_type_traits_internal_struct_Y();
+       boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&);
+       boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&);
+       ~boost_type_traits_internal_struct_Y()throw();
+       max_align data[4];
+    };
+#else
+    struct boost_type_traits_internal_struct_X : public Derived, virtual Base 
+    {
+       boost_type_traits_internal_struct_X();
+       boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&);
+       boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&);
+       ~boost_type_traits_internal_struct_X()throw();
+       max_align data[16];
+    };
+    struct boost_type_traits_internal_struct_Y : public Derived 
+    {
+       boost_type_traits_internal_struct_Y();
+       boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&);
+       boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&);
+       ~boost_type_traits_internal_struct_Y()throw();
+       max_align data[16];
+    };
+#endif
+    BOOST_STATIC_CONSTANT(bool, value = (sizeof(boost_type_traits_internal_struct_X)==sizeof(boost_type_traits_internal_struct_Y)));
+};
+
+template<typename Base, typename Derived>
+struct is_virtual_base_of_impl2
+{
+   typedef typename mpl::and_<is_base_of<Base, Derived>, mpl::not_<is_same<Base, Derived> > >::type tag_type;
+   typedef is_virtual_base_of_impl<Base, Derived, tag_type> imp;
+   BOOST_STATIC_CONSTANT(bool, value = imp::value);
+};
+
+#ifdef BOOST_MSVC
+#pragma warning( pop )
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_virtual_base_of
+       , Base
+       , Derived
+       , (::boost::detail::is_virtual_base_of_impl2<Base,Derived>::value) 
+)
+
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived&,false)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/is_void.hpp b/gatb-core/thirdparty/boost/type_traits/is_void.hpp
new file mode 100644
index 0000000..6f6fbff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_void.hpp
@@ -0,0 +1,38 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_VOID_HPP_INCLUDED
+#define BOOST_TT_IS_VOID_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+//* is a type T void - is_void<T>
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,__is_void(T))
+#else
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void,true)
+
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const,true)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void volatile,true)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const volatile,true)
+#endif
+
+#endif  // non-CodeGear implementation
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_VOID_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/is_volatile.hpp b/gatb-core/thirdparty/boost/type_traits/is_volatile.hpp
new file mode 100644
index 0000000..d9839da
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/is_volatile.hpp
@@ -0,0 +1,84 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
+//      Howard Hinnant and John Maddock 2000. 
+//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
+
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, 
+//    is_member_pointer based on the Simulated Partial Specialization work 
+//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or 
+//    http://groups.yahoo.com/group/boost/message/5441 
+//    Some workarounds in here use ideas suggested from "Generic<Programming>: 
+//    Mappings between Types and Values" 
+//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
+
+
+#ifndef BOOST_TT_IS_VOLATILE_HPP_INCLUDED
+#define BOOST_TT_IS_VOLATILE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#   include <boost/type_traits/detail/cv_traits_impl.hpp>
+#   if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+#       include <boost/type_traits/remove_bounds.hpp>
+#   endif
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+template <class T>
+struct is_volatile_rval_filter
+{
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_volatile);
+#else
+   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_volatile);
+#endif
+};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+template <class T>
+struct is_volatile_rval_filter<T&&>
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+#endif
+}
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,__is_volatile(T))
+#else
+
+//* is a type T declared volatile - is_volatile<T>
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,::boost::detail::is_volatile_rval_filter<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T&,false)
+
+#if  defined(BOOST_ILLEGAL_CV_REFERENCES)
+// these are illegal specialisations; cv-qualifies applied to
+// references have no effect according to [8.3.2p1],
+// C++ Builder requires them though as it treats cv-qualified
+// references as distinct types...
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const volatile,false)
+#endif
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_VOLATILE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/make_signed.hpp b/gatb-core/thirdparty/boost/type_traits/make_signed.hpp
new file mode 100644
index 0000000..51cdbb0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/make_signed.hpp
@@ -0,0 +1,151 @@
+
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_MAKE_SIGNED_HPP_INCLUDED
+#define BOOST_TT_MAKE_SIGNED_HPP_INCLUDED
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_volatile.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/static_assert.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <class T>
+struct make_signed_imp
+{
+   BOOST_STATIC_ASSERT(
+      (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value));
+   BOOST_STATIC_ASSERT(
+      (::boost::type_traits::ice_not< ::boost::is_same<
+         typename remove_cv<T>::type, bool>::value>::value));
+
+   typedef typename remove_cv<T>::type t_no_cv;
+   typedef typename mpl::if_c<
+      (::boost::type_traits::ice_and< 
+         ::boost::is_signed<T>::value,
+         ::boost::is_integral<T>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value),
+      T,
+      typename mpl::if_c<
+         (::boost::type_traits::ice_and< 
+            ::boost::is_integral<T>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value>
+         ::value),
+         typename mpl::if_<
+            is_same<t_no_cv, unsigned char>,
+            signed char,
+            typename mpl::if_<
+               is_same<t_no_cv, unsigned short>,
+               signed short,
+               typename mpl::if_<
+                  is_same<t_no_cv, unsigned int>,
+                  int,
+                  typename mpl::if_<
+                     is_same<t_no_cv, unsigned long>,
+                     long,
+#if defined(BOOST_HAS_LONG_LONG)
+#ifdef BOOST_HAS_INT128
+                     typename mpl::if_c<
+                        sizeof(t_no_cv) == sizeof(boost::long_long_type), 
+                        boost::long_long_type, 
+                        boost::int128_type
+                     >::type
+#else
+                     boost::long_long_type
+#endif
+#elif defined(BOOST_HAS_MS_INT64)
+                     __int64
+#else
+                     long
+#endif
+                  >::type
+               >::type
+            >::type
+         >::type,
+         // Not a regular integer type:
+         typename mpl::if_c<
+            sizeof(t_no_cv) == sizeof(unsigned char),
+            signed char,
+            typename mpl::if_c<
+               sizeof(t_no_cv) == sizeof(unsigned short),
+               signed short,
+               typename mpl::if_c<
+                  sizeof(t_no_cv) == sizeof(unsigned int),
+                  int,
+                  typename mpl::if_c<
+                     sizeof(t_no_cv) == sizeof(unsigned long),
+                     long,
+#if defined(BOOST_HAS_LONG_LONG)
+#ifdef BOOST_HAS_INT128
+                     typename mpl::if_c<
+                        sizeof(t_no_cv) == sizeof(boost::long_long_type), 
+                        boost::long_long_type, 
+                        boost::int128_type
+                     >::type
+#else
+                     boost::long_long_type
+#endif
+#elif defined(BOOST_HAS_MS_INT64)
+                     __int64
+#else
+                     long
+#endif
+                  >::type
+               >::type
+            >::type
+         >::type
+      >::type
+   >::type base_integer_type;
+   
+   // Add back any const qualifier:
+   typedef typename mpl::if_<
+      is_const<T>,
+      typename add_const<base_integer_type>::type,
+      base_integer_type
+   >::type const_base_integer_type;
+   
+   // Add back any volatile qualifier:
+   typedef typename mpl::if_<
+      is_volatile<T>,
+      typename add_volatile<const_base_integer_type>::type,
+      const_base_integer_type
+   >::type type;
+};
+
+
+} // namespace detail
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_signed,T,typename boost::detail::make_signed_imp<T>::type)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/make_unsigned.hpp b/gatb-core/thirdparty/boost/type_traits/make_unsigned.hpp
new file mode 100644
index 0000000..239153a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/make_unsigned.hpp
@@ -0,0 +1,151 @@
+
+//  (C) Copyright John Maddock 2007.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
+#define BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_volatile.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
+#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/static_assert.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template <class T>
+struct make_unsigned_imp
+{
+   BOOST_STATIC_ASSERT(
+      (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value));
+   BOOST_STATIC_ASSERT(
+      (::boost::type_traits::ice_not< ::boost::is_same<
+         typename remove_cv<T>::type, bool>::value>::value));
+
+   typedef typename remove_cv<T>::type t_no_cv;
+   typedef typename mpl::if_c<
+      (::boost::type_traits::ice_and< 
+         ::boost::is_unsigned<T>::value,
+         ::boost::is_integral<T>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
+         ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value),
+      T,
+      typename mpl::if_c<
+         (::boost::type_traits::ice_and< 
+            ::boost::is_integral<T>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
+            ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value>
+         ::value),
+         typename mpl::if_<
+            is_same<t_no_cv, signed char>,
+            unsigned char,
+            typename mpl::if_<
+               is_same<t_no_cv, short>,
+               unsigned short,
+               typename mpl::if_<
+                  is_same<t_no_cv, int>,
+                  unsigned int,
+                  typename mpl::if_<
+                     is_same<t_no_cv, long>,
+                     unsigned long,
+#if defined(BOOST_HAS_LONG_LONG)
+#ifdef BOOST_HAS_INT128
+                     typename mpl::if_c<
+                        sizeof(t_no_cv) == sizeof(boost::ulong_long_type), 
+                        boost::ulong_long_type, 
+                        boost::uint128_type
+                     >::type
+#else
+                     boost::ulong_long_type
+#endif
+#elif defined(BOOST_HAS_MS_INT64)
+                     unsigned __int64
+#else
+                     unsigned long
+#endif
+                  >::type
+               >::type
+            >::type
+         >::type,
+         // Not a regular integer type:
+         typename mpl::if_c<
+            sizeof(t_no_cv) == sizeof(unsigned char),
+            unsigned char,
+            typename mpl::if_c<
+               sizeof(t_no_cv) == sizeof(unsigned short),
+               unsigned short,
+               typename mpl::if_c<
+                  sizeof(t_no_cv) == sizeof(unsigned int),
+                  unsigned int,
+                  typename mpl::if_c<
+                     sizeof(t_no_cv) == sizeof(unsigned long),
+                     unsigned long,
+#if defined(BOOST_HAS_LONG_LONG)
+#ifdef BOOST_HAS_INT128
+                     typename mpl::if_c<
+                        sizeof(t_no_cv) == sizeof(boost::ulong_long_type), 
+                        boost::ulong_long_type, 
+                        boost::uint128_type
+                     >::type
+#else
+                     boost::ulong_long_type
+#endif
+#elif defined(BOOST_HAS_MS_INT64)
+                     unsigned __int64
+#else
+                     unsigned long
+#endif
+                  >::type
+               >::type
+            >::type
+         >::type
+      >::type
+   >::type base_integer_type;
+   
+   // Add back any const qualifier:
+   typedef typename mpl::if_<
+      is_const<T>,
+      typename add_const<base_integer_type>::type,
+      base_integer_type
+   >::type const_base_integer_type;
+   
+   // Add back any volatile qualifier:
+   typedef typename mpl::if_<
+      is_volatile<T>,
+      typename add_volatile<const_base_integer_type>::type,
+      const_base_integer_type
+   >::type type;
+};
+
+
+} // namespace detail
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_unsigned,T,typename boost::detail::make_unsigned_imp<T>::type)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/object_traits.hpp b/gatb-core/thirdparty/boost/type_traits/object_traits.hpp
new file mode 100644
index 0000000..c812a62
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/object_traits.hpp
@@ -0,0 +1,33 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines object traits classes:
+//  is_object, is_scalar, is_class, is_compound, is_pod, 
+//  has_trivial_constructor, has_trivial_copy, has_trivial_assign, 
+//  has_trivial_destructor, is_empty.
+//
+
+#ifndef BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED
+#define BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED
+
+#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/type_traits/has_trivial_constructor.hpp>
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/type_traits/has_nothrow_constructor.hpp>
+#include <boost/type_traits/has_nothrow_copy.hpp>
+#include <boost/type_traits/has_nothrow_assign.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_compound.hpp>
+#include <boost/type_traits/is_empty.hpp>
+#include <boost/type_traits/is_object.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_scalar.hpp>
+#include <boost/type_traits/is_stateless.hpp>
+
+#endif // BOOST_TT_OBJECT_TRAITS_HPP_INLCUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/promote.hpp b/gatb-core/thirdparty/boost/type_traits/promote.hpp
new file mode 100644
index 0000000..60f6278
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/promote.hpp
@@ -0,0 +1,40 @@
+// Copyright 2005 Alexander Nasonov.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef FILE_boost_type_traits_promote_hpp_INCLUDED
+#define FILE_boost_type_traits_promote_hpp_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/integral_promotion.hpp>
+#include <boost/type_traits/floating_point_promotion.hpp>
+
+// Should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template<class T>
+struct promote_impl
+  : public integral_promotion<
+        BOOST_DEDUCED_TYPENAME floating_point_promotion<T>::type
+      >
+{
+};
+
+}
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(
+      promote
+    , T
+    , BOOST_DEDUCED_TYPENAME boost::detail::promote_impl<T>::type
+    )
+}
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // #ifndef FILE_boost_type_traits_promote_hpp_INCLUDED
+
diff --git a/gatb-core/thirdparty/boost/type_traits/rank.hpp b/gatb-core/thirdparty/boost/type_traits/rank.hpp
new file mode 100644
index 0000000..33f46c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/rank.hpp
@@ -0,0 +1,89 @@
+
+//  (C) Copyright John Maddock 2005.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_RANK_HPP_INCLUDED
+#define BOOST_TT_RANK_HPP_INCLUDED
+
+// should be the last #include
+#include <boost/type_traits/detail/size_t_trait_def.hpp>
+
+namespace boost {
+
+#if !defined( __CODEGEARC__ )
+
+namespace detail{
+
+template <class T, std::size_t N>
+struct rank_imp
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = N);
+};
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+template <class T, std::size_t R, std::size_t N>
+struct rank_imp<T[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct rank_imp<T const[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct rank_imp<T volatile[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+
+template <class T, std::size_t R, std::size_t N>
+struct rank_imp<T const volatile[R], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+template <class T, std::size_t N>
+struct rank_imp<T[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+template <class T, std::size_t N>
+struct rank_imp<T const[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+template <class T, std::size_t N>
+struct rank_imp<T volatile[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+template <class T, std::size_t N>
+struct rank_imp<T const volatile[], N>
+{
+   BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value));
+};
+#endif
+#endif
+}
+
+#endif // !defined( __CODEGEARC__ )
+
+#if defined( __CODEGEARC__ )
+BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,__array_rank(T))
+#else
+BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,(::boost::detail::rank_imp<T,0>::value))
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/size_t_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/reference_traits.hpp b/gatb-core/thirdparty/boost/type_traits/reference_traits.hpp
new file mode 100644
index 0000000..1607b3d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/reference_traits.hpp
@@ -0,0 +1,15 @@
+//  (C) Copyright David Abrahams Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000-2002.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED
+#define BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_reference.hpp>
+
+#endif // BOOST_TT_REFERENCE_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_all_extents.hpp b/gatb-core/thirdparty/boost/type_traits/remove_all_extents.hpp
new file mode 100644
index 0000000..1409da1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_all_extents.hpp
@@ -0,0 +1,40 @@
+
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_REMOVE_ALL_EXTENTS_HPP_INCLUDED
+#define BOOST_TT_REMOVE_ALL_EXTENTS_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <cstddef>
+#include <boost/detail/workaround.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_all_extents,T,T)
+
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T[N],typename boost::remove_all_extents<T>::type type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const[N],typename boost::remove_all_extents<T const>::type type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T volatile[N],typename boost::remove_all_extents<T volatile>::type type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const volatile[N],typename boost::remove_all_extents<T const volatile>::type type)
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T[],typename boost::remove_all_extents<T>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const[],typename boost::remove_all_extents<T const>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T volatile[],typename boost::remove_all_extents<T volatile>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const volatile[],typename boost::remove_all_extents<T const volatile>::type)
+#endif
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_bounds.hpp b/gatb-core/thirdparty/boost/type_traits/remove_bounds.hpp
new file mode 100644
index 0000000..2d26348
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_bounds.hpp
@@ -0,0 +1,40 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
+#define BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <cstddef>
+#include <boost/detail/workaround.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_bounds,T,T)
+
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T[N],T type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const[N],T const type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T volatile[N],T volatile type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const volatile[N],T const volatile type)
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T[],T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const[],T const)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T volatile[],T volatile)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const volatile[],T const volatile)
+#endif
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_const.hpp b/gatb-core/thirdparty/boost/type_traits/remove_const.hpp
new file mode 100644
index 0000000..1020781
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_const.hpp
@@ -0,0 +1,79 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_REMOVE_CONST_HPP_INCLUDED
+#define BOOST_TT_REMOVE_CONST_HPP_INCLUDED
+
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/detail/cv_traits_impl.hpp>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+
+namespace detail {
+
+template <typename T, bool is_vol>
+struct remove_const_helper
+{
+    typedef T type;
+};
+
+template <typename T>
+struct remove_const_helper<T, true>
+{
+    typedef T volatile type;
+};
+
+
+template <typename T>
+struct remove_const_impl
+{
+    typedef typename remove_const_helper<
+       typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
+        , ::boost::is_volatile<T>::value
+        >::type type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+template <typename T>
+struct remove_const_impl<T&&>
+{
+    typedef T&& type;
+};
+#endif
+
+} // namespace detail
+
+// * convert a type T to non-const type - remove_const<T>
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename boost::detail::remove_const_impl<T>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_const,T&,T&)
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const[N],T type[N])
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const volatile[N],T volatile type[N])
+#endif
+
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_CONST_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_cv.hpp b/gatb-core/thirdparty/boost/type_traits/remove_cv.hpp
new file mode 100644
index 0000000..9ba34a1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_cv.hpp
@@ -0,0 +1,63 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_REMOVE_CV_HPP_INCLUDED
+#define BOOST_TT_REMOVE_CV_HPP_INCLUDED
+
+#include <boost/type_traits/detail/cv_traits_impl.hpp>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+
+namespace detail{
+
+template <class T>
+struct rvalue_ref_filter_rem_cv
+{
+   typedef typename boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+template <class T>
+struct rvalue_ref_filter_rem_cv<T&&>
+{
+   typedef T&& type;
+};
+#endif
+
+}
+
+
+//  convert a type T to a non-cv-qualified type - remove_cv<T>
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::rvalue_ref_filter_rem_cv<T>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_cv,T&,T&)
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const[N],T type[N])
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T volatile[N],T type[N])
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const volatile[N],T type[N])
+#endif
+
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_CV_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_extent.hpp b/gatb-core/thirdparty/boost/type_traits/remove_extent.hpp
new file mode 100644
index 0000000..9c4cdff
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_extent.hpp
@@ -0,0 +1,40 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_REMOVE_EXTENT_HPP_INCLUDED
+#define BOOST_TT_REMOVE_EXTENT_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_extent,T,T)
+
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T[N],T type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const[N],T const type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T volatile[N],T volatile type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const volatile[N],T const volatile type)
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T[],T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const[],T const)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T volatile[],T volatile)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const volatile[],T const volatile)
+#endif
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_pointer.hpp b/gatb-core/thirdparty/boost/type_traits/remove_pointer.hpp
new file mode 100644
index 0000000..fef7068
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_pointer.hpp
@@ -0,0 +1,83 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
+#define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if defined(BOOST_MSVC)
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#endif
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+#ifdef BOOST_MSVC
+
+namespace detail{
+
+   //
+   // We need all this crazy indirection because a type such as:
+   //
+   // T (*const)(U)
+   //
+   // Does not bind to a <T*> or <T*const> partial specialization with VC10 and earlier
+   //
+   template <class T> 
+   struct remove_pointer_imp
+   {
+      typedef T type;
+   };
+
+   template <class T> 
+   struct remove_pointer_imp<T*>
+   {
+      typedef T type;
+   };
+
+   template <class T, bool b> 
+   struct remove_pointer_imp3
+   {
+      typedef typename remove_pointer_imp<typename boost::remove_cv<T>::type>::type type;
+   };
+
+   template <class T> 
+   struct remove_pointer_imp3<T, false>
+   {
+      typedef T type;
+   };
+
+   template <class T> 
+   struct remove_pointer_imp2
+   {
+      typedef typename remove_pointer_imp3<T, ::boost::is_pointer<T>::value>::type type;
+   };
+}
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename boost::detail::remove_pointer_imp2<T>::type)
+
+#else
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T*,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* volatile,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const volatile,T)
+
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_reference.hpp b/gatb-core/thirdparty/boost/type_traits/remove_reference.hpp
new file mode 100644
index 0000000..c59e7e3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_reference.hpp
@@ -0,0 +1,59 @@
+
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED
+#define BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+
+namespace detail{
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+template <class T>
+struct remove_rvalue_ref
+{
+   typedef T type;
+};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T>
+struct remove_rvalue_ref<T&&>
+{
+   typedef T type;
+};
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,typename boost::detail::remove_rvalue_ref<T>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T&,T)
+
+#if defined(BOOST_ILLEGAL_CV_REFERENCES)
+// these are illegal specialisations; cv-qualifies applied to
+// references have no effect according to [8.3.2p1],
+// C++ Builder requires them though as it treats cv-qualified
+// references as distinct types...
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& volatile,T)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const volatile,T)
+#endif
+
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/remove_volatile.hpp b/gatb-core/thirdparty/boost/type_traits/remove_volatile.hpp
new file mode 100644
index 0000000..c202776
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/remove_volatile.hpp
@@ -0,0 +1,77 @@
+
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
+#define BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
+
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/detail/cv_traits_impl.hpp>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <cstddef>
+
+// should be the last #include
+#include <boost/type_traits/detail/type_trait_def.hpp>
+
+namespace boost {
+
+
+namespace detail {
+
+template <typename T, bool is_const>
+struct remove_volatile_helper
+{
+    typedef T type;
+};
+
+template <typename T>
+struct remove_volatile_helper<T,true>
+{
+    typedef T const type;
+};
+
+template <typename T>
+struct remove_volatile_impl
+{
+    typedef typename remove_volatile_helper<
+       typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
+        , ::boost::is_const<T>::value
+        >::type type;
+};
+
+//
+// We can't filter out rvalue_references at the same level as
+// references or we get ambiguities from msvc:
+//
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <typename T>
+struct remove_volatile_impl<T&&>
+{
+    typedef T&& type;
+};
+#endif
+} // namespace detail
+
+// * convert a type T to a non-volatile type - remove_volatile<T>
+
+BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_volatile,T,typename boost::detail::remove_volatile_impl<T>::type)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_volatile,T&,T&)
+#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T volatile[N],T type[N])
+BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T const volatile[N],T const type[N])
+#endif
+
+
+} // namespace boost
+
+#include <boost/type_traits/detail/type_trait_undef.hpp>
+
+#endif // BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/same_traits.hpp b/gatb-core/thirdparty/boost/type_traits/same_traits.hpp
new file mode 100644
index 0000000..dab7dac
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/same_traits.hpp
@@ -0,0 +1,15 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines is_same:
+
+#ifndef BOOST_TT_SAME_TRAITS_HPP_INCLUDED
+#define BOOST_TT_SAME_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/is_same.hpp>
+
+#endif  // BOOST_TT_SAME_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/transform_traits.hpp b/gatb-core/thirdparty/boost/type_traits/transform_traits.hpp
new file mode 100644
index 0000000..7a82f1c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/transform_traits.hpp
@@ -0,0 +1,21 @@
+//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines traits classes for transforming one type to another:
+//  remove_reference, add_reference, remove_bounds, remove_pointer.
+//
+
+#ifndef BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
+#define BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/add_pointer.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_bounds.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#endif // BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
diff --git a/gatb-core/thirdparty/boost/type_traits/transform_traits_spec.hpp b/gatb-core/thirdparty/boost/type_traits/transform_traits_spec.hpp
new file mode 100644
index 0000000..b12b5f8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/transform_traits_spec.hpp
@@ -0,0 +1,14 @@
+
+//  Copyright 2001 Aleksey Gurtovoy.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
+#define BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/config.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/type_traits/type_with_alignment.hpp b/gatb-core/thirdparty/boost/type_traits/type_with_alignment.hpp
new file mode 100644
index 0000000..7eb66a7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/type_traits/type_with_alignment.hpp
@@ -0,0 +1,357 @@
+//  (C) Copyright John Maddock 2000.
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
+#define BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
+
+#include <boost/mpl/if.hpp>
+#include <boost/preprocessor/list/for_each_i.hpp>
+#include <boost/preprocessor/tuple/to_list.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/list/transform.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/config.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+#include <cstddef>
+
+#ifdef BOOST_MSVC
+#   pragma warning(push)
+#   pragma warning(disable: 4121) // alignment is sensitive to packing
+#endif
+
+namespace boost {
+
+#ifndef __BORLANDC__
+
+namespace detail {
+
+class alignment_dummy;
+typedef void (*function_ptr)();
+typedef int (alignment_dummy::*member_ptr);
+typedef int (alignment_dummy::*member_function_ptr)();
+
+#ifdef BOOST_HAS_LONG_LONG
+#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \
+        12, ( \
+        char, short, int, long,  ::boost::long_long_type, float, double, long double \
+        , void*, function_ptr, member_ptr, member_function_ptr))
+#else
+#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \
+        11, ( \
+        char, short, int, long, float, double, long double \
+        , void*, function_ptr, member_ptr, member_function_ptr))
+#endif
+
+#define BOOST_TT_HAS_ONE_T(D,Data,T) boost::detail::has_one_T< T >
+
+#define BOOST_TT_ALIGNMENT_STRUCT_TYPES                         \
+        BOOST_PP_LIST_TRANSFORM(BOOST_TT_HAS_ONE_T,             \
+                                X,                              \
+                                BOOST_TT_ALIGNMENT_BASE_TYPES)
+
+#define BOOST_TT_ALIGNMENT_TYPES                                \
+        BOOST_PP_LIST_APPEND(BOOST_TT_ALIGNMENT_BASE_TYPES,     \
+                             BOOST_TT_ALIGNMENT_STRUCT_TYPES)
+
+//
+// lower_alignment_helper --
+//
+// This template gets instantiated a lot, so use partial
+// specialization when available to reduce the compiler burden.
+//
+template <bool found, std::size_t target, class TestType>
+struct lower_alignment_helper
+{
+    typedef char type;
+    enum { value = true };
+};
+
+template <std::size_t target, class TestType>
+struct lower_alignment_helper<false,target,TestType>
+{
+    enum { value = (alignment_of<TestType>::value == target) };
+    typedef typename mpl::if_c<value, TestType, char>::type type;
+};
+
+#define BOOST_TT_CHOOSE_MIN_ALIGNMENT(R,P,I,T)                                  \
+        typename lower_alignment_helper<                                        \
+          BOOST_PP_CAT(found,I),target,T                                        \
+        >::type BOOST_PP_CAT(t,I);                                              \
+        enum {                                                                  \
+            BOOST_PP_CAT(found,BOOST_PP_INC(I))                                 \
+              = lower_alignment_helper<BOOST_PP_CAT(found,I),target,T >::value  \
+        };
+
+#define BOOST_TT_CHOOSE_T(R,P,I,T) T BOOST_PP_CAT(t,I);
+
+template <typename T>
+struct has_one_T
+{
+  T data;
+};
+
+template <std::size_t target>
+union lower_alignment
+{
+    enum { found0 = false };
+
+    BOOST_PP_LIST_FOR_EACH_I(
+          BOOST_TT_CHOOSE_MIN_ALIGNMENT
+        , ignored
+        , BOOST_TT_ALIGNMENT_TYPES
+        )
+};
+
+union max_align
+{
+    BOOST_PP_LIST_FOR_EACH_I(
+          BOOST_TT_CHOOSE_T
+        , ignored
+        , BOOST_TT_ALIGNMENT_TYPES
+        )
+};
+
+#undef BOOST_TT_ALIGNMENT_BASE_TYPES
+#undef BOOST_TT_HAS_ONE_T
+#undef BOOST_TT_ALIGNMENT_STRUCT_TYPES
+#undef BOOST_TT_ALIGNMENT_TYPES
+#undef BOOST_TT_CHOOSE_MIN_ALIGNMENT
+#undef BOOST_TT_CHOOSE_T
+
+template<std::size_t TAlign, std::size_t Align>
+struct is_aligned
+{
+    BOOST_STATIC_CONSTANT(bool,
+        value = (TAlign >= Align) & (TAlign % Align == 0)
+        );
+};
+
+
+} // namespace detail
+
+template<std::size_t Align>
+struct is_pod< ::boost::detail::lower_alignment<Align> >
+{
+        BOOST_STATIC_CONSTANT(std::size_t, value = true);
+};
+
+// This alignment method originally due to Brian Parker, implemented by David
+// Abrahams, and then ported here by Doug Gregor.
+namespace detail{
+
+template <std::size_t Align>
+class type_with_alignment_imp
+{
+    typedef ::boost::detail::lower_alignment<Align> t1;
+    typedef typename mpl::if_c<
+          ::boost::detail::is_aligned< ::boost::alignment_of<t1>::value,Align >::value
+        , t1
+        , ::boost::detail::max_align
+        >::type align_t;
+
+    BOOST_STATIC_CONSTANT(std::size_t, found = alignment_of<align_t>::value);
+
+    BOOST_STATIC_ASSERT(found >= Align);
+    BOOST_STATIC_ASSERT(found % Align == 0);
+
+ public:
+    typedef align_t type;
+};
+
+}
+
+template <std::size_t Align>
+class type_with_alignment 
+  : public ::boost::detail::type_with_alignment_imp<Align>
+{
+};
+
+#if defined(__GNUC__) || (defined (__SUNPRO_CC) &&  (__SUNPRO_CC >= 0x5130))
+namespace tt_align_ns {
+struct __attribute__((__aligned__(2))) a2 {};
+struct __attribute__((__aligned__(4))) a4 {};
+struct __attribute__((__aligned__(8))) a8 {};
+struct __attribute__((__aligned__(16))) a16 {};
+struct __attribute__((__aligned__(32))) a32 {};
+struct __attribute__((__aligned__(64))) a64 {};
+struct __attribute__((__aligned__(128))) a128 {};
+}
+
+template<> class type_with_alignment<1>  { public: typedef char type; };
+template<> class type_with_alignment<2>  { public: typedef tt_align_ns::a2 type; };
+template<> class type_with_alignment<4>  { public: typedef tt_align_ns::a4 type; };
+template<> class type_with_alignment<8>  { public: typedef tt_align_ns::a8 type; };
+template<> class type_with_alignment<16> { public: typedef tt_align_ns::a16 type; };
+template<> class type_with_alignment<32> { public: typedef tt_align_ns::a32 type; };
+template<> class type_with_alignment<64> { public: typedef tt_align_ns::a64 type; };
+template<> class type_with_alignment<128> { public: typedef tt_align_ns::a128 type; };
+
+namespace detail {
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a2,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a4,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a32,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a64,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a128,true)
+}
+#endif
+#if defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))
+//
+// MSVC supports types which have alignments greater than the normal
+// maximum: these are used for example in the types __m64 and __m128
+// to provide types with alignment requirements which match the SSE
+// registers.  Therefore we extend type_with_alignment<> to support
+// such types, however, we have to be careful to use a builtin type
+// whenever possible otherwise we break previously working code:
+// see http://article.gmane.org/gmane.comp.lib.boost.devel/173011
+// for an example and test case.  Thus types like a8 below will
+// be used *only* if the existing implementation can't provide a type
+// with suitable alignment.  This does mean however, that type_with_alignment<>
+// may return a type which cannot be passed through a function call
+// by value (and neither can any type containing such a type like
+// Boost.Optional).  However, this only happens when we have no choice 
+// in the matter because no other "ordinary" type is available.
+//
+namespace tt_align_ns {
+struct __declspec(align(8)) a8 { 
+   char m[8]; 
+   typedef a8 type;
+};
+struct __declspec(align(16)) a16 { 
+   char m[16]; 
+   typedef a16 type;
+};
+struct __declspec(align(32)) a32 { 
+   char m[32]; 
+   typedef a32 type;
+};
+struct __declspec(align(64)) a64 
+{ 
+   char m[64]; 
+   typedef a64 type;
+};
+struct __declspec(align(128)) a128 { 
+   char m[128]; 
+   typedef a128 type;
+};
+}
+
+template<> class type_with_alignment<8>  
+{ 
+   typedef mpl::if_c<
+      ::boost::alignment_of<boost::detail::max_align>::value < 8,
+      tt_align_ns::a8,
+      boost::detail::type_with_alignment_imp<8> >::type t1; 
+public: 
+   typedef t1::type type;
+};
+template<> class type_with_alignment<16> 
+{ 
+   typedef mpl::if_c<
+      ::boost::alignment_of<boost::detail::max_align>::value < 16,
+      tt_align_ns::a16,
+      boost::detail::type_with_alignment_imp<16> >::type t1; 
+public: 
+   typedef t1::type type;
+};
+template<> class type_with_alignment<32> 
+{ 
+   typedef mpl::if_c<
+      ::boost::alignment_of<boost::detail::max_align>::value < 32,
+      tt_align_ns::a32,
+      boost::detail::type_with_alignment_imp<32> >::type t1; 
+public: 
+   typedef t1::type type;
+};
+template<> class type_with_alignment<64> {
+   typedef mpl::if_c<
+      ::boost::alignment_of<boost::detail::max_align>::value < 64,
+      tt_align_ns::a64,
+      boost::detail::type_with_alignment_imp<64> >::type t1; 
+public: 
+   typedef t1::type type;
+};
+template<> class type_with_alignment<128> {
+   typedef mpl::if_c<
+      ::boost::alignment_of<boost::detail::max_align>::value < 128,
+      tt_align_ns::a128,
+      boost::detail::type_with_alignment_imp<128> >::type t1; 
+public: 
+   typedef t1::type type;
+};
+
+namespace detail {
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a32,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a64,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a128,true)
+}
+#endif
+
+#else
+
+//
+// Borland specific version, we have this for two reasons:
+// 1) The version above doesn't always compile (with the new test cases for example)
+// 2) Because of Borlands #pragma option we can create types with alignments that are
+//    greater that the largest aligned builtin type.
+
+namespace tt_align_ns{
+#pragma option push -a16
+struct a2{ short s; };
+struct a4{ int s; };
+struct a8{ double s; };
+struct a16{ long double s; };
+#pragma option pop
+}
+
+namespace detail {
+
+typedef ::boost::tt_align_ns::a16 max_align;
+
+//#if ! BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a2,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a4,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
+//#endif
+}
+
+template <std::size_t N> struct type_with_alignment
+{
+   // We should never get to here, but if we do use the maximally
+   // aligned type:
+   // BOOST_STATIC_ASSERT(0);
+   typedef tt_align_ns::a16 type;
+};
+template <> struct type_with_alignment<1>{ typedef char type; };
+template <> struct type_with_alignment<2>{ typedef tt_align_ns::a2 type; };
+template <> struct type_with_alignment<4>{ typedef tt_align_ns::a4 type; };
+template <> struct type_with_alignment<8>{ typedef tt_align_ns::a8 type; };
+template <> struct type_with_alignment<16>{ typedef tt_align_ns::a16 type; };
+
+#endif
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#   pragma warning(pop)
+#endif
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
+
+
diff --git a/gatb-core/thirdparty/boost/utility.hpp b/gatb-core/thirdparty/boost/utility.hpp
new file mode 100644
index 0000000..82177c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility.hpp
@@ -0,0 +1,21 @@
+//  Boost utility.hpp header file  -------------------------------------------//
+
+//  Copyright 1999-2003 Aleksey Gurtovoy.  Use, modification, and distribution are
+//  subject to the Boost Software License, Version 1.0.  (See accompanying file
+//  LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
+
+//  See <http://www.boost.org/libs/utility/> for the library's home page.
+
+#ifndef BOOST_UTILITY_HPP
+#define BOOST_UTILITY_HPP
+
+#include <boost/utility/addressof.hpp>
+#include <boost/utility/base_from_member.hpp>
+#include <boost/utility/binary.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/utility/identity_type.hpp>
+#include <boost/checked_delete.hpp>
+#include <boost/next_prior.hpp>
+#include <boost/noncopyable.hpp>
+
+#endif  // BOOST_UTILITY_HPP
diff --git a/gatb-core/thirdparty/boost/utility/addressof.hpp b/gatb-core/thirdparty/boost/utility/addressof.hpp
new file mode 100644
index 0000000..db4da80
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/addressof.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_UTILITY_ADDRESSOF_HPP
+#define BOOST_UTILITY_ADDRESSOF_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/addressof.hpp instead.
+
+#include <boost/core/addressof.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/base_from_member.hpp b/gatb-core/thirdparty/boost/utility/base_from_member.hpp
new file mode 100644
index 0000000..fc0e13c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/base_from_member.hpp
@@ -0,0 +1,171 @@
+//  boost utility/base_from_member.hpp header file  --------------------------//
+
+//  Copyright 2001, 2003, 2004, 2012 Daryle Walker.  Use, modification, and
+//  distribution are subject to the Boost Software License, Version 1.0.  (See
+//  accompanying file LICENSE_1_0.txt or a copy at
+//  <http://www.boost.org/LICENSE_1_0.txt>.)
+
+//  See <http://www.boost.org/libs/utility/> for the library's home page.
+
+#ifndef BOOST_UTILITY_BASE_FROM_MEMBER_HPP
+#define BOOST_UTILITY_BASE_FROM_MEMBER_HPP
+
+#include <boost/config.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+
+//  Base-from-member arity configuration macro  ------------------------------//
+
+// The following macro determines how many arguments will be in the largest
+// constructor template of base_from_member.  Constructor templates will be
+// generated from one argument to this maximum.  Code from other files can read
+// this number if they need to always match the exact maximum base_from_member
+// uses.  The maximum constructor length can be changed by overriding the
+// #defined constant.  Make sure to apply the override, if any, for all source
+// files during project compiling for consistency.
+
+// Contributed by Jonathan Turkanis
+
+#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
+#define BOOST_BASE_FROM_MEMBER_MAX_ARITY  10
+#endif
+
+
+//  An iteration of a constructor template for base_from_member  -------------//
+
+// A macro that should expand to:
+//     template < typename T1, ..., typename Tn >
+//     base_from_member( T1 x1, ..., Tn xn )
+//         : member( x1, ..., xn )
+//         {}
+// This macro should only persist within this file.
+
+#define BOOST_PRIVATE_CTR_DEF( z, n, data )                            \
+    template < BOOST_PP_ENUM_PARAMS(n, typename T) >                   \
+    explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \
+        : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \
+        {}                                                             \
+    /**/
+
+
+namespace boost
+{
+
+namespace detail
+{
+
+//  Type-unmarking class template  -------------------------------------------//
+
+// Type-trait to get the raw type, i.e. the type without top-level reference nor
+// cv-qualification, from a type expression.  Mainly for function arguments, any
+// reference part is stripped first.
+
+// Contributed by Daryle Walker
+
+template < typename T >
+struct remove_cv_ref
+{
+    typedef typename ::boost::remove_cv<typename
+     ::boost::remove_reference<T>::type>::type  type;
+
+};  // boost::detail::remove_cv_ref
+
+//  Unmarked-type comparison class template  ---------------------------------//
+
+// Type-trait to check if two type expressions have the same raw type.
+
+// Contributed by Daryle Walker, based on a work-around by Luc Danton
+
+template < typename T, typename U >
+struct is_related
+    : public ::boost::is_same<
+     typename ::boost::detail::remove_cv_ref<T>::type,
+     typename ::boost::detail::remove_cv_ref<U>::type >
+{};
+
+//  Enable-if-on-unidentical-unmarked-type class template  -------------------//
+
+// Enable-if on the first two type expressions NOT having the same raw type.
+
+// Contributed by Daryle Walker, based on a work-around by Luc Danton
+
+#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+template<typename ...T>
+struct enable_if_unrelated
+    : public ::boost::enable_if_c<true>
+{};
+
+template<typename T, typename U, typename ...U2>
+struct enable_if_unrelated<T, U, U2...>
+    : public ::boost::disable_if< ::boost::detail::is_related<T, U> >
+{};
+#endif
+
+}  // namespace boost::detail
+
+
+//  Base-from-member class template  -----------------------------------------//
+
+// Helper to initialize a base object so a derived class can use this
+// object in the initialization of another base class.  Used by
+// Dietmar Kuehl from ideas by Ron Klatcho to solve the problem of a
+// base class needing to be initialized by a member.
+
+// Contributed by Daryle Walker
+
+template < typename MemberType, int UniqueID = 0 >
+class base_from_member
+{
+protected:
+    MemberType  member;
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
+    !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
+    !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && \
+    !(defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 4))
+    template <typename ...T, typename EnableIf = typename
+     ::boost::detail::enable_if_unrelated<base_from_member, T...>::type>
+    explicit BOOST_CONSTEXPR base_from_member( T&& ...x )
+        BOOST_NOEXCEPT_IF( BOOST_NOEXCEPT_EXPR(::new ((void*) 0) MemberType(
+         static_cast<T&&>(x)... )) )  // no std::is_nothrow_constructible...
+        : member( static_cast<T&&>(x)... )     // ...nor std::forward needed
+        {}
+#else
+    base_from_member()
+        : member()
+        {}
+
+    BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
+     BOOST_PRIVATE_CTR_DEF, _ )
+#endif
+
+};  // boost::base_from_member
+
+template < typename MemberType, int UniqueID >
+class base_from_member<MemberType&, UniqueID>
+{
+protected:
+    MemberType& member;
+
+    explicit BOOST_CONSTEXPR base_from_member( MemberType& x )
+        BOOST_NOEXCEPT
+        : member( x )
+        {}
+
+};  // boost::base_from_member
+
+}  // namespace boost
+
+
+// Undo any private macros
+#undef BOOST_PRIVATE_CTR_DEF
+
+
+#endif  // BOOST_UTILITY_BASE_FROM_MEMBER_HPP
diff --git a/gatb-core/thirdparty/boost/utility/binary.hpp b/gatb-core/thirdparty/boost/utility/binary.hpp
new file mode 100644
index 0000000..8cef146
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/binary.hpp
@@ -0,0 +1,708 @@
+/*=============================================================================
+    Copyright (c) 2005 Matthew Calabrese
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_UTILITY_BINARY_HPP
+#define BOOST_UTILITY_BINARY_HPP
+
+/*=============================================================================
+
+    Binary Literal Utility
+    ______________________
+
+
+    The following code works by converting the input bit pattern into a
+    Boost.Preprocessor sequence, then converting groupings of 3 bits each into
+    the corresponding octal digit, and finally concatenating all of the digits
+    together along with a leading zero. This yields a standard octal literal
+    with the desired value as specified in bits.
+
+==============================================================================*/
+
+#include <boost/preprocessor/control/deduce_d.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/seq/cat.hpp>
+#include <boost/preprocessor/seq/transform.hpp>
+#include <boost/preprocessor/arithmetic/mod.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/control/while.hpp>
+
+#define BOOST_BINARY( bit_groupings )                                          \
+  BOOST_BINARY_LITERAL_D( BOOST_PP_DEDUCE_D(), bit_groupings ) 
+
+#define BOOST_BINARY_U( bit_groupings )                                        \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, U ) 
+
+#define BOOST_BINARY_L( bit_groupings )                                        \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, L ) 
+
+#define BOOST_BINARY_UL( bit_groupings )                                       \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, UL ) 
+
+#define BOOST_BINARY_LU( bit_groupings )                                       \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LU ) 
+
+#define BOOST_BINARY_LL( bit_groupings )                                       \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LL ) 
+
+#define BOOST_BINARY_ULL( bit_groupings )                                      \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, ULL ) 
+
+#define BOOST_BINARY_LLU( bit_groupings )                                      \
+  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LLU ) 
+
+#define BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, suffix )                 \
+  BOOST_SUFFIXED_BINARY_LITERAL_D( BOOST_PP_DEDUCE_D(), bit_groupings, suffix ) 
+
+#define BOOST_SUFFIXED_BINARY_LITERAL_D( d, bit_groupings, suffix )            \
+  BOOST_PP_CAT( BOOST_BINARY_LITERAL_D( d, bit_groupings ), suffix ) 
+
+#define BOOST_BINARY_LITERAL_D( d, bit_groupings )                             \
+  BOOST_PP_SEQ_CAT                                                             \
+  ( (0) BOOST_DETAIL_CREATE_BINARY_LITERAL_OCTAL_SEQUENCE( d, bit_groupings )  \
+  ) 
+
+#define BOOST_DETAIL_CREATE_BINARY_LITERAL_OCTAL_SEQUENCE( d, bit_groupings )  \
+  BOOST_PP_SEQ_TRANSFORM                                                       \
+  ( BOOST_DETAIL_TRIPLE_TO_OCTAL_OPERATION                                     \
+  , BOOST_PP_NIL                                                               \
+  , BOOST_PP_IDENTITY( BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_TRIPLE_SEQUENCE )()\
+    ( BOOST_DETAIL_COMPLETE_TRIPLE_SEQUENCE                                    \
+      (                                                                        \
+        d                                                                      \
+      , BOOST_DETAIL_CREATE_BINARY_LITERAL_BIT_SEQUENCE( d, bit_groupings )    \
+      )                                                                        \
+    )                                                                          \
+  ) 
+
+#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_TRIPLE_SEQUENCE( bit_sequence )   \
+  BOOST_PP_CAT                                                                 \
+  ( BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1 bit_sequence      \
+  , END_BIT                                                                    \
+  ) 
+
+#define BOOST_DETAIL_BITS_PER_OCTIT 3
+
+#define BOOST_DETAIL_COMPLETE_TRIPLE_SEQUENCE( d, incomplete_nibble_sequence ) \
+  BOOST_PP_CAT                                                                 \
+  ( BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_                            \
+  , BOOST_PP_MOD_D( d                                                          \
+                  , BOOST_PP_SEQ_SIZE( incomplete_nibble_sequence )            \
+                  , BOOST_DETAIL_BITS_PER_OCTIT                                \
+                  )                                                            \
+  )                                                                            \
+  incomplete_nibble_sequence 
+
+#define BOOST_DETAIL_FIXED_COMPL( bit )                                        \
+  BOOST_PP_CAT( BOOST_DETAIL_FIXED_COMPL_, bit )
+
+#define BOOST_DETAIL_FIXED_COMPL_0 1 
+
+#define BOOST_DETAIL_FIXED_COMPL_1 0 
+
+#define BOOST_DETAIL_CREATE_BINARY_LITERAL_BIT_SEQUENCE( d, bit_groupings )    \
+  BOOST_PP_EMPTY                                                               \
+  BOOST_PP_CAT( BOOST_PP_WHILE_, d )                                           \
+  ( BOOST_DETAIL_BINARY_LITERAL_PREDICATE                                      \
+  , BOOST_DETAIL_BINARY_LITERAL_OPERATION                                      \
+  , bit_groupings ()                                                           \
+  ) 
+
+#define BOOST_DETAIL_BINARY_LITERAL_PREDICATE( d, state )                      \
+  BOOST_DETAIL_FIXED_COMPL( BOOST_DETAIL_IS_NULLARY_ARGS( state ) ) 
+
+#define BOOST_DETAIL_BINARY_LITERAL_OPERATION( d, state )                      \
+  BOOST_DETAIL_SPLIT_AND_SWAP                                                  \
+  ( BOOST_PP_CAT( BOOST_DETAIL_BINARY_LITERAL_ELEMENT_, state ) ) 
+
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_OPERATION( s, dummy_param, tuple )        \
+  BOOST_DETAIL_TERNARY_TRIPLE_TO_OCTAL tuple 
+
+#define BOOST_DETAIL_TERNARY_TRIPLE_TO_OCTAL( bit2, bit1, bit0 )               \
+  BOOST_DETAIL_TRIPLE_TO_OCTAL_ ## bit2 ## bit1 ## bit0 
+
+#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_1 (0)(0)
+#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_2 (0)
+#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_0  
+
+#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1END_BIT  
+
+#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1( bit )        \
+  ( ( bit, BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_2 
+
+#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_2( bit )        \
+  bit, BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_3 
+
+#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_3( bit )        \
+  bit ) ) BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1 
+
+#define BOOST_DETAIL_SPLIT_AND_SWAP( params )                                  \
+  BOOST_PP_IDENTITY( BOOST_DETAIL_SPLIT_AND_SWAP_PARAMS )()( params )
+
+#define BOOST_DETAIL_SPLIT_AND_SWAP_PARAMS( first_param, second_param )        \
+  second_param first_param 
+
+#define BOOST_DETAIL_LEFT_OF_COMMA( params )                                   \
+  BOOST_PP_IDENTITY( BOOST_DETAIL_FIRST_MACRO_PARAM )()( params ) 
+
+#define BOOST_DETAIL_FIRST_MACRO_PARAM( first_param, second_param )            \
+  first_param 
+
+/* Begin derived concepts from Chaos by Paul Mensonides */
+
+#define BOOST_DETAIL_IS_NULLARY_ARGS( param )                                  \
+  BOOST_DETAIL_LEFT_OF_COMMA                                                   \
+  ( BOOST_PP_CAT( BOOST_DETAIL_IS_NULLARY_ARGS_R_                              \
+                , BOOST_DETAIL_IS_NULLARY_ARGS_C param                         \
+                )                                                              \
+  ) 
+
+#define BOOST_DETAIL_IS_NULLARY_ARGS_C()                                       \
+  1 
+
+#define BOOST_DETAIL_IS_NULLARY_ARGS_R_1                                       \
+  1, BOOST_PP_NIL 
+
+#define BOOST_DETAIL_IS_NULLARY_ARGS_R_BOOST_DETAIL_IS_NULLARY_ARGS_C          \
+  0, BOOST_PP_NIL 
+
+/* End derived concepts from Chaos by Paul Mensonides */
+
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_000 0 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_001 1 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_010 2 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_011 3 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_100 4 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_101 5 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_110 6 
+#define BOOST_DETAIL_TRIPLE_TO_OCTAL_111 7 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0 (0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1 (1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00 (0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01 (0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10 (1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11 (1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00 (0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01 (0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10 (1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11 (1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000 (0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001 (0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010 (0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011 (0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100 (1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101 (1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110 (1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111 (1)(1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000 (0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001 (0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010 (0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011 (0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100 (0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101 (0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110 (0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111 (0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000 (1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001 (1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010 (1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011 (1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100 (1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101 (1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110 (1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111 (1)(1)(1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000 (0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001 (0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010 (0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011 (0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100 (0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101 (0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110 (0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111 (0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000 (0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001 (0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010 (0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011 (0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100 (0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101 (0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110 (0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111 (0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000 (1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001 (1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010 (1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011 (1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100 (1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101 (1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110 (1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111 (1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000 (1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001 (1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010 (1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011 (1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100 (1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101 (1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110 (1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111 (1)(1)(1)(1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000000 (0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000001 (0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000010 (0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000011 (0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000100 (0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000101 (0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000110 (0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000111 (0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001000 (0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001001 (0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001010 (0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001011 (0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001100 (0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001101 (0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001110 (0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001111 (0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010000 (0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010001 (0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010010 (0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010011 (0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010100 (0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010101 (0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010110 (0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010111 (0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011000 (0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011001 (0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011010 (0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011011 (0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011100 (0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011101 (0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011110 (0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011111 (0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100000 (1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100001 (1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100010 (1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100011 (1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100100 (1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100101 (1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100110 (1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100111 (1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101000 (1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101001 (1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101010 (1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101011 (1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101100 (1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101101 (1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101110 (1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101111 (1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110000 (1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110001 (1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110010 (1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110011 (1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110100 (1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110101 (1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110110 (1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110111 (1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111000 (1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111001 (1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111010 (1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111011 (1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111100 (1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111101 (1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111110 (1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111111 (1)(1)(1)(1)(1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000000 (0)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000001 (0)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000010 (0)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000011 (0)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000100 (0)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000101 (0)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000110 (0)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000111 (0)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001000 (0)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001001 (0)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001010 (0)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001011 (0)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001100 (0)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001101 (0)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001110 (0)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001111 (0)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010000 (0)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010001 (0)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010010 (0)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010011 (0)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010100 (0)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010101 (0)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010110 (0)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010111 (0)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011000 (0)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011001 (0)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011010 (0)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011011 (0)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011100 (0)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011101 (0)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011110 (0)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011111 (0)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100000 (0)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100001 (0)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100010 (0)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100011 (0)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100100 (0)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100101 (0)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100110 (0)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100111 (0)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101000 (0)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101001 (0)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101010 (0)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101011 (0)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101100 (0)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101101 (0)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101110 (0)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101111 (0)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110000 (0)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110001 (0)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110010 (0)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110011 (0)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110100 (0)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110101 (0)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110110 (0)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110111 (0)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111000 (0)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111001 (0)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111010 (0)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111011 (0)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111100 (0)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111101 (0)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111110 (0)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111111 (0)(1)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000000 (1)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000001 (1)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000010 (1)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000011 (1)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000100 (1)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000101 (1)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000110 (1)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000111 (1)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001000 (1)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001001 (1)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001010 (1)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001011 (1)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001100 (1)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001101 (1)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001110 (1)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001111 (1)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010000 (1)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010001 (1)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010010 (1)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010011 (1)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010100 (1)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010101 (1)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010110 (1)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010111 (1)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011000 (1)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011001 (1)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011010 (1)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011011 (1)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011100 (1)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011101 (1)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011110 (1)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011111 (1)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100000 (1)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100001 (1)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100010 (1)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100011 (1)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100100 (1)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100101 (1)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100110 (1)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100111 (1)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101000 (1)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101001 (1)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101010 (1)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101011 (1)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101100 (1)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101101 (1)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101110 (1)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101111 (1)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110000 (1)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110001 (1)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110010 (1)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110011 (1)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110100 (1)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110101 (1)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110110 (1)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110111 (1)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111000 (1)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111001 (1)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111010 (1)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111011 (1)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111100 (1)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111101 (1)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111110 (1)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111111 (1)(1)(1)(1)(1)(1)(1), 
+
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000000 (0)(0)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000001 (0)(0)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000010 (0)(0)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000011 (0)(0)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000100 (0)(0)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000101 (0)(0)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000110 (0)(0)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000111 (0)(0)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001000 (0)(0)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001001 (0)(0)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001010 (0)(0)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001011 (0)(0)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001100 (0)(0)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001101 (0)(0)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001110 (0)(0)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001111 (0)(0)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010000 (0)(0)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010001 (0)(0)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010010 (0)(0)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010011 (0)(0)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010100 (0)(0)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010101 (0)(0)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010110 (0)(0)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010111 (0)(0)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011000 (0)(0)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011001 (0)(0)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011010 (0)(0)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011011 (0)(0)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011100 (0)(0)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011101 (0)(0)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011110 (0)(0)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011111 (0)(0)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100000 (0)(0)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100001 (0)(0)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100010 (0)(0)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100011 (0)(0)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100100 (0)(0)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100101 (0)(0)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100110 (0)(0)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100111 (0)(0)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101000 (0)(0)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101001 (0)(0)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101010 (0)(0)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101011 (0)(0)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101100 (0)(0)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101101 (0)(0)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101110 (0)(0)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101111 (0)(0)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110000 (0)(0)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110001 (0)(0)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110010 (0)(0)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110011 (0)(0)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110100 (0)(0)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110101 (0)(0)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110110 (0)(0)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110111 (0)(0)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111000 (0)(0)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111001 (0)(0)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111010 (0)(0)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111011 (0)(0)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111100 (0)(0)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111101 (0)(0)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111110 (0)(0)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111111 (0)(0)(1)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000000 (0)(1)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000001 (0)(1)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000010 (0)(1)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000011 (0)(1)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000100 (0)(1)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000101 (0)(1)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000110 (0)(1)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000111 (0)(1)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001000 (0)(1)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001001 (0)(1)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001010 (0)(1)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001011 (0)(1)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001100 (0)(1)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001101 (0)(1)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001110 (0)(1)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001111 (0)(1)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010000 (0)(1)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010001 (0)(1)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010010 (0)(1)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010011 (0)(1)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010100 (0)(1)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010101 (0)(1)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010110 (0)(1)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010111 (0)(1)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011000 (0)(1)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011001 (0)(1)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011010 (0)(1)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011011 (0)(1)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011100 (0)(1)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011101 (0)(1)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011110 (0)(1)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011111 (0)(1)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100000 (0)(1)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100001 (0)(1)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100010 (0)(1)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100011 (0)(1)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100100 (0)(1)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100101 (0)(1)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100110 (0)(1)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100111 (0)(1)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101000 (0)(1)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101001 (0)(1)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101010 (0)(1)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101011 (0)(1)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101100 (0)(1)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101101 (0)(1)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101110 (0)(1)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101111 (0)(1)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110000 (0)(1)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110001 (0)(1)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110010 (0)(1)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110011 (0)(1)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110100 (0)(1)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110101 (0)(1)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110110 (0)(1)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110111 (0)(1)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111000 (0)(1)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111001 (0)(1)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111010 (0)(1)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111011 (0)(1)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111100 (0)(1)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111101 (0)(1)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111110 (0)(1)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111111 (0)(1)(1)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000000 (1)(0)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000001 (1)(0)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000010 (1)(0)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000011 (1)(0)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000100 (1)(0)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000101 (1)(0)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000110 (1)(0)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000111 (1)(0)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001000 (1)(0)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001001 (1)(0)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001010 (1)(0)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001011 (1)(0)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001100 (1)(0)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001101 (1)(0)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001110 (1)(0)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001111 (1)(0)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010000 (1)(0)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010001 (1)(0)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010010 (1)(0)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010011 (1)(0)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010100 (1)(0)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010101 (1)(0)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010110 (1)(0)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010111 (1)(0)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011000 (1)(0)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011001 (1)(0)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011010 (1)(0)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011011 (1)(0)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011100 (1)(0)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011101 (1)(0)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011110 (1)(0)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011111 (1)(0)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100000 (1)(0)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100001 (1)(0)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100010 (1)(0)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100011 (1)(0)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100100 (1)(0)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100101 (1)(0)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100110 (1)(0)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100111 (1)(0)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101000 (1)(0)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101001 (1)(0)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101010 (1)(0)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101011 (1)(0)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101100 (1)(0)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101101 (1)(0)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101110 (1)(0)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101111 (1)(0)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110000 (1)(0)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110001 (1)(0)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110010 (1)(0)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110011 (1)(0)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110100 (1)(0)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110101 (1)(0)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110110 (1)(0)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110111 (1)(0)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111000 (1)(0)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111001 (1)(0)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111010 (1)(0)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111011 (1)(0)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111100 (1)(0)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111101 (1)(0)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111110 (1)(0)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111111 (1)(0)(1)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000000 (1)(1)(0)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000001 (1)(1)(0)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000010 (1)(1)(0)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000011 (1)(1)(0)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000100 (1)(1)(0)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000101 (1)(1)(0)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000110 (1)(1)(0)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000111 (1)(1)(0)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001000 (1)(1)(0)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001001 (1)(1)(0)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001010 (1)(1)(0)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001011 (1)(1)(0)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001100 (1)(1)(0)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001101 (1)(1)(0)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001110 (1)(1)(0)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001111 (1)(1)(0)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010000 (1)(1)(0)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010001 (1)(1)(0)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010010 (1)(1)(0)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010011 (1)(1)(0)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010100 (1)(1)(0)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010101 (1)(1)(0)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010110 (1)(1)(0)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010111 (1)(1)(0)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011000 (1)(1)(0)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011001 (1)(1)(0)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011010 (1)(1)(0)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011011 (1)(1)(0)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011100 (1)(1)(0)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011101 (1)(1)(0)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011110 (1)(1)(0)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011111 (1)(1)(0)(1)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100000 (1)(1)(1)(0)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100001 (1)(1)(1)(0)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100010 (1)(1)(1)(0)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100011 (1)(1)(1)(0)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100100 (1)(1)(1)(0)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100101 (1)(1)(1)(0)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100110 (1)(1)(1)(0)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100111 (1)(1)(1)(0)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101000 (1)(1)(1)(0)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101001 (1)(1)(1)(0)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101010 (1)(1)(1)(0)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101011 (1)(1)(1)(0)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101100 (1)(1)(1)(0)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101101 (1)(1)(1)(0)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101110 (1)(1)(1)(0)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101111 (1)(1)(1)(0)(1)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110000 (1)(1)(1)(1)(0)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110001 (1)(1)(1)(1)(0)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110010 (1)(1)(1)(1)(0)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110011 (1)(1)(1)(1)(0)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110100 (1)(1)(1)(1)(0)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110101 (1)(1)(1)(1)(0)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110110 (1)(1)(1)(1)(0)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110111 (1)(1)(1)(1)(0)(1)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111000 (1)(1)(1)(1)(1)(0)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111001 (1)(1)(1)(1)(1)(0)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111010 (1)(1)(1)(1)(1)(0)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111011 (1)(1)(1)(1)(1)(0)(1)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111100 (1)(1)(1)(1)(1)(1)(0)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111101 (1)(1)(1)(1)(1)(1)(0)(1), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111110 (1)(1)(1)(1)(1)(1)(1)(0), 
+#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111111 (1)(1)(1)(1)(1)(1)(1)(1), 
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/compare_pointees.hpp b/gatb-core/thirdparty/boost/utility/compare_pointees.hpp
new file mode 100644
index 0000000..7e2515c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/compare_pointees.hpp
@@ -0,0 +1,68 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola at hotmail.com
+//
+#ifndef BOOST_UTILITY_COMPARE_POINTEES_25AGO2003_HPP
+#define BOOST_UTILITY_COMPARE_POINTEES_25AGO2003_HPP
+
+#include<functional>
+
+namespace boost {
+
+// template<class OP> bool equal_pointees(OP const& x, OP const& y);
+// template<class OP> struct equal_pointees_t;
+//
+// Being OP a model of OptionalPointee (either a pointer or an optional):
+//
+// If both x and y have valid pointees, returns the result of (*x == *y)
+// If only one has a valid pointee, returns false.
+// If none have valid pointees, returns true.
+// No-throw
+template<class OptionalPointee>
+inline
+bool equal_pointees ( OptionalPointee const& x, OptionalPointee const& y )
+{
+  return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
+}
+
+template<class OptionalPointee>
+struct equal_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
+{
+  bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
+    { return equal_pointees(x,y) ; }
+} ;
+
+// template<class OP> bool less_pointees(OP const& x, OP const& y);
+// template<class OP> struct less_pointees_t;
+//
+// Being OP a model of OptionalPointee (either a pointer or an optional):
+//
+// If y has not a valid pointee, returns false.
+// ElseIf x has not a valid pointee, returns true.
+// ElseIf both x and y have valid pointees, returns the result of (*x < *y)
+// No-throw
+template<class OptionalPointee>
+inline
+bool less_pointees ( OptionalPointee const& x, OptionalPointee const& y )
+{
+  return !y ? false : ( !x ? true : (*x) < (*y) ) ;
+}
+
+template<class OptionalPointee>
+struct less_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
+{
+  bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
+    { return less_pointees(x,y) ; }
+} ;
+
+} // namespace boost
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/utility/declval.hpp b/gatb-core/thirdparty/boost/utility/declval.hpp
new file mode 100644
index 0000000..a4ab2c8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/declval.hpp
@@ -0,0 +1,44 @@
+//  declval.hpp  -------------------------------------------------------------//
+
+//  Copyright 2010 Vicente J. Botet Escriba
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_UTILITY_DECLVAL_HPP
+#define BOOST_UTILITY_DECLVAL_HPP
+
+#include <boost/config.hpp>
+
+//----------------------------------------------------------------------------//
+
+#include <boost/type_traits/add_rvalue_reference.hpp>
+
+//----------------------------------------------------------------------------//
+//                                                                            //
+//                           C++03 implementation of                          //
+//                   20.2.4 Function template declval [declval]               //
+//                          Written by Vicente J. Botet Escriba               //
+//                                                                            //
+// 1 The library provides the function template declval to simplify the
+// definition of expressions which occur as unevaluated operands.
+// 2 Remarks: If this function is used, the program is ill-formed.
+// 3 Remarks: The template parameter T of declval may be an incomplete type.
+// [ Example:
+//
+// template <class To, class From>
+// decltype(static_cast<To>(declval<From>())) convert(From&&);
+//
+// declares a function template convert which only participates in overloading
+// if the type From can be explicitly converted to type To. For another example
+// see class template common_type (20.9.7.6). -end example ]
+//----------------------------------------------------------------------------//
+
+namespace boost {
+
+    template <typename T>
+    typename add_rvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand
+
+}  // namespace boost
+
+#endif  // BOOST_UTILITY_DECLVAL_HPP
diff --git a/gatb-core/thirdparty/boost/utility/detail/in_place_factory_prefix.hpp b/gatb-core/thirdparty/boost/utility/detail/in_place_factory_prefix.hpp
new file mode 100644
index 0000000..afd76b5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/detail/in_place_factory_prefix.hpp
@@ -0,0 +1,36 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2007, Tobias Schwinger.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola at hotmail.com
+//
+#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
+#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
+
+#include <new>
+#include <cstddef>
+#include <boost/config.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/paren.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+
+#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT(z,n,_) BOOST_PP_CAT(m_a,n) BOOST_PP_LPAREN() BOOST_PP_CAT(a,n) BOOST_PP_RPAREN()
+#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL(z,n,_) BOOST_PP_CAT(A,n) const& BOOST_PP_CAT(m_a,n);
+
+#define BOOST_MAX_INPLACE_FACTORY_ARITY 10
+
+#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/utility/detail/in_place_factory_suffix.hpp b/gatb-core/thirdparty/boost/utility/detail/in_place_factory_suffix.hpp
new file mode 100644
index 0000000..58f48c7
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/detail/in_place_factory_suffix.hpp
@@ -0,0 +1,23 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2007, Tobias Schwinger.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola at hotmail.com
+//
+#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
+#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
+
+#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT
+#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL
+#undef BOOST_MAX_INPLACE_FACTORY_ARITY
+
+#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/utility/detail/result_of_iterate.hpp b/gatb-core/thirdparty/boost/utility/detail/result_of_iterate.hpp
new file mode 100644
index 0000000..5192172
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/detail/result_of_iterate.hpp
@@ -0,0 +1,221 @@
+// Boost result_of library
+
+//  Copyright Douglas Gregor 2004. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  Copyright Daniel Walker, Eric Niebler, Michel Morin 2008-2012.
+//  Use, modification and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
+//  copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org/libs/utility
+#if !defined(BOOST_PP_IS_ITERATING)
+# error Boost result_of - do not include this file!
+#endif
+
+// CWPro8 requires an argument in a function type specialization
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
+# define BOOST_RESULT_OF_ARGS void
+#else
+# define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
+#endif
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>
+    : mpl::if_<
+          mpl::or_< is_pointer<F>, is_member_function_pointer<F> >
+        , boost::detail::tr1_result_of_impl<
+            typename remove_cv<F>::type,
+            typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS),
+            (boost::detail::has_result_type<F>::value)>
+        , boost::detail::tr1_result_of_impl<
+            F,
+            F(BOOST_RESULT_OF_ARGS),
+            (boost::detail::has_result_type<F>::value)> >::type { };
+#endif
+
+#ifdef BOOST_RESULT_OF_USE_DECLTYPE
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct result_of<F(BOOST_RESULT_OF_ARGS)>
+    : detail::cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> { };
+#endif // BOOST_RESULT_OF_USE_DECLTYPE
+
+#ifdef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct result_of<F(BOOST_RESULT_OF_ARGS)>
+    : mpl::if_<mpl::or_<detail::has_result_type<F>, detail::has_result<F> >,
+               tr1_result_of<F(BOOST_RESULT_OF_ARGS)>,
+               detail::cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> >::type { };
+#endif // BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+
+#if defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
+
+namespace detail {
+
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct cpp0x_result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
+    : mpl::if_<
+          is_member_function_pointer<F>
+        , detail::tr1_result_of_impl<
+            typename remove_cv<F>::type,
+            typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false
+          >
+        , detail::cpp0x_result_of_impl<
+              F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))
+          >
+      >::type
+{};
+
+#ifdef BOOST_NO_SFINAE_EXPR
+
+template<typename F>
+struct BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION());
+
+template<typename R BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), typename T)>
+struct BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<R(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T))> {
+    R operator()(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T)) const;
+    typedef result_of_private_type const &(*pfn_t)(...);
+    operator pfn_t() const volatile;
+};
+
+template<typename F>
+struct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION());
+
+template<typename F>
+struct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<F *>
+  : BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<F>
+{};
+
+template<typename F>
+struct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<F &>
+  : BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<F>
+{};
+
+template<typename F>
+struct BOOST_PP_CAT(result_of_select_call_wrapper_type_, BOOST_PP_ITERATION())
+  : mpl::eval_if<
+        is_class<typename remove_reference<F>::type>,
+        result_of_wrap_callable_class<F>,
+        mpl::identity<BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<typename remove_cv<F>::type> >
+    >
+{};
+
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), typename T)>
+struct BOOST_PP_CAT(result_of_is_callable_, BOOST_PP_ITERATION()) {
+    typedef typename BOOST_PP_CAT(result_of_select_call_wrapper_type_, BOOST_PP_ITERATION())<F>::type wrapper_t;
+    static const bool value = (
+        sizeof(result_of_no_type) == sizeof(detail::result_of_is_private_type(
+            (boost::declval<wrapper_t>()(BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)), result_of_weird_type())
+        ))
+    );
+    typedef mpl::bool_<value> type;
+};
+
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), true>
+    : lazy_enable_if<
+          BOOST_PP_CAT(result_of_is_callable_, BOOST_PP_ITERATION())<F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), T)>
+        , cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false>
+      >
+{};
+
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false>
+{
+  typedef decltype(
+    boost::declval<F>()(
+      BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)
+    )
+  ) type;
+};
+
+#else // BOOST_NO_SFINAE_EXPR
+
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)),
+                            typename result_of_always_void<decltype(
+                                boost::declval<F>()(
+                                    BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)
+                                )
+                            )>::type> {
+  typedef decltype(
+    boost::declval<F>()(
+      BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)
+    )
+  ) type;
+};
+
+#endif // BOOST_NO_SFINAE_EXPR
+
+} // namespace detail
+
+#else // defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct result_of<F(BOOST_RESULT_OF_ARGS)>
+    : tr1_result_of<F(BOOST_RESULT_OF_ARGS)> { };
+#endif
+
+#endif // defined(BOOST_RESULT_OF_USE_DECLTYPE)
+
+#undef BOOST_RESULT_OF_ARGS
+
+#if BOOST_PP_ITERATION() >= 1
+
+namespace detail {
+
+template<typename R,  typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
+{
+  typedef R type;
+};
+
+template<typename R,  typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
+{
+  typedef R type;
+};
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+template<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (T0::*)
+                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
+                 FArgs, false>
+{
+  typedef R type;
+};
+
+template<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (T0::*)
+                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
+                     const,
+                 FArgs, false>
+{
+  typedef R type;
+};
+
+template<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (T0::*)
+                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
+                     volatile,
+                 FArgs, false>
+{
+  typedef R type;
+};
+
+template<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct tr1_result_of_impl<R (T0::*)
+                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
+                     const volatile,
+                 FArgs, false>
+{
+  typedef R type;
+};
+#endif
+
+}
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/empty_deleter.hpp b/gatb-core/thirdparty/boost/utility/empty_deleter.hpp
new file mode 100644
index 0000000..91bc47b
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/empty_deleter.hpp
@@ -0,0 +1,43 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2013.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+/*!
+ * \file   empty_deleter.hpp
+ * \author Andrey Semashev
+ * \date   22.04.2007
+ *
+ * This header contains an \c empty_deleter implementation. This is an empty
+ * function object that receives a pointer and does nothing with it.
+ * Such empty deletion strategy may be convenient, for example, when
+ * constructing <tt>shared_ptr</tt>s that point to some object that should not be
+ * deleted (i.e. a variable on the stack or some global singleton, like <tt>std::cout</tt>).
+ */
+
+#ifndef BOOST_UTILITY_EMPTY_DELETER_HPP
+#define BOOST_UTILITY_EMPTY_DELETER_HPP
+
+#include <boost/config.hpp>
+#include <boost/core/null_deleter.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__GNUC__)
+#pragma message "This header is deprecated, use boost/core/null_deleter.hpp instead."
+#elif defined(_MSC_VER)
+#pragma message("This header is deprecated, use boost/core/null_deleter.hpp instead.")
+#endif
+
+namespace boost {
+
+//! A deprecated name for \c null_deleter
+typedef null_deleter empty_deleter;
+
+} // namespace boost
+
+#endif // BOOST_UTILITY_EMPTY_DELETER_HPP
diff --git a/gatb-core/thirdparty/boost/utility/enable_if.hpp b/gatb-core/thirdparty/boost/utility/enable_if.hpp
new file mode 100644
index 0000000..803bfca
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/enable_if.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_UTILITY_ENABLE_IF_HPP
+#define BOOST_UTILITY_ENABLE_IF_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/enable_if.hpp instead.
+
+#include <boost/core/enable_if.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/explicit_operator_bool.hpp b/gatb-core/thirdparty/boost/utility/explicit_operator_bool.hpp
new file mode 100644
index 0000000..9b625cd
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/explicit_operator_bool.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_UTILITY_EXPLICIT_OPERATOR_BOOL_HPP
+#define BOOST_UTILITY_EXPLICIT_OPERATOR_BOOL_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/explicit_operator_bool.hpp instead.
+
+#include <boost/core/explicit_operator_bool.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/identity_type.hpp b/gatb-core/thirdparty/boost/utility/identity_type.hpp
new file mode 100644
index 0000000..4a1f6c4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/identity_type.hpp
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/utility/identity_type
+
+/** @file
+Wrap type expressions with round parenthesis so they can be passed to macros
+even if they contain commas.
+*/
+
+#ifndef BOOST_IDENTITY_TYPE_HPP_
+#define BOOST_IDENTITY_TYPE_HPP_
+
+#include <boost/type_traits/function_traits.hpp>
+
+/**
+ at brief This macro allows to wrap the specified type expression within extra
+round parenthesis so the type can be passed as a single macro parameter even if
+it contains commas (not already wrapped within round parenthesis).
+
+ at Params
+ at Param{parenthesized_type,
+The type expression to be passed as macro parameter wrapped by a single set
+of round parenthesis <c>(...)</c>.
+This type expression can contain an arbitrary number of commas.
+}
+ at EndParams
+
+This macro works on any C++03 compiler (it does not use variadic macros).
+
+This macro must be prefixed by <c>typename</c> when used within templates.
+Note that the compiler will not be able to automatically determine function
+template parameters when they are wrapped with this macro (these parameters
+need to be explicitly specified when calling the function template).
+
+On some compilers (like GCC), using this macro on abstract types requires to
+add and remove a reference to the specified type.
+*/
+#define BOOST_IDENTITY_TYPE(parenthesized_type) \
+    /* must NOT prefix this with `::` to work with parenthesized syntax */ \
+    boost::function_traits< void parenthesized_type >::arg1_type
+
+#endif // #include guard
+
diff --git a/gatb-core/thirdparty/boost/utility/in_place_factory.hpp b/gatb-core/thirdparty/boost/utility/in_place_factory.hpp
new file mode 100644
index 0000000..1a62ace
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/in_place_factory.hpp
@@ -0,0 +1,86 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2007, Tobias Schwinger.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola at hotmail.com
+//
+#ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
+#ifndef BOOST_PP_IS_ITERATING
+
+#include <boost/utility/detail/in_place_factory_prefix.hpp>
+
+namespace boost {
+
+class in_place_factory_base {} ;
+
+#define  BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
+#define  BOOST_PP_FILENAME_1 <boost/utility/in_place_factory.hpp>
+#include BOOST_PP_ITERATE()
+
+} // namespace boost
+
+#include <boost/utility/detail/in_place_factory_suffix.hpp>
+
+#define BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
+#else
+#define N BOOST_PP_ITERATION()
+
+#if N
+template< BOOST_PP_ENUM_PARAMS(N, class A) >
+#endif
+class BOOST_PP_CAT(in_place_factory,N)
+  : 
+  public in_place_factory_base
+{
+public:
+
+  explicit BOOST_PP_CAT(in_place_factory,N)
+      ( BOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) )
+#if N > 0
+    : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
+#endif
+  {}
+
+  template<class T>
+  void* apply(void* address) const
+  {
+    return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
+  }
+
+  template<class T>
+  void* apply(void* address, std::size_t n) const
+  {
+    for(char* next = address = this->BOOST_NESTED_TEMPLATE apply<T>(address);
+        !! --n;)
+      this->BOOST_NESTED_TEMPLATE apply<T>(next = next+sizeof(T));
+    return address; 
+  }
+
+  BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
+};
+
+#if N > 0
+template< BOOST_PP_ENUM_PARAMS(N, class A) >
+inline BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
+in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
+{
+  return BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
+      ( BOOST_PP_ENUM_PARAMS(N, a) );
+}
+#else
+inline in_place_factory0 in_place()
+{
+  return in_place_factory0();
+}
+#endif
+
+#undef N
+#endif
+#endif
+
diff --git a/gatb-core/thirdparty/boost/utility/result_of.hpp b/gatb-core/thirdparty/boost/utility/result_of.hpp
new file mode 100644
index 0000000..206ae30
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/result_of.hpp
@@ -0,0 +1,210 @@
+// Boost result_of library
+
+//  Copyright Douglas Gregor 2004. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org/libs/utility
+#ifndef BOOST_RESULT_OF_HPP
+#define BOOST_RESULT_OF_HPP
+
+#include <boost/config.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#ifndef BOOST_RESULT_OF_NUM_ARGS
+#  define BOOST_RESULT_OF_NUM_ARGS 16
+#endif
+
+// Use the decltype-based version of result_of by default if the compiler
+// supports N3276 <http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf>.
+// The user can force the choice by defining BOOST_RESULT_OF_USE_DECLTYPE,
+// BOOST_RESULT_OF_USE_TR1, or BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK but not more than one!
+#if (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1)) || \
+    (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)) || \
+    (defined(BOOST_RESULT_OF_USE_TR1) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK))
+#  error More than one of BOOST_RESULT_OF_USE_DECLTYPE, BOOST_RESULT_OF_USE_TR1 and \
+  BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK cannot be defined at the same time.
+#endif
+
+#if defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK) && defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
+#  error Cannot fallback to decltype if BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE is not defined.
+#endif
+
+#ifndef BOOST_RESULT_OF_USE_TR1
+#  ifndef BOOST_RESULT_OF_USE_DECLTYPE
+#    ifndef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+#      ifndef BOOST_NO_CXX11_DECLTYPE_N3276 // this implies !defined(BOOST_NO_CXX11_DECLTYPE)
+#        define BOOST_RESULT_OF_USE_DECLTYPE
+#      else
+#        define BOOST_RESULT_OF_USE_TR1
+#      endif
+#    endif
+#  endif
+#endif
+
+namespace boost {
+
+template<typename F> struct result_of;
+template<typename F> struct tr1_result_of; // a TR1-style implementation of result_of
+
+#if !defined(BOOST_NO_SFINAE)
+namespace detail {
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
+
+// Work around a nvcc bug by only defining has_result when it's needed.
+#ifdef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+BOOST_MPL_HAS_XXX_TEMPLATE_DEF(result)
+#endif
+
+template<typename F, typename FArgs, bool HasResultType> struct tr1_result_of_impl;
+
+template<typename F> struct cpp0x_result_of;
+
+#ifdef BOOST_NO_SFINAE_EXPR
+
+// There doesn't seem to be any other way to turn this off such that the presence of
+// the user-defined operator,() below doesn't cause spurious warning all over the place,
+// so unconditionally turn it off.
+#if BOOST_MSVC
+#  pragma warning(disable: 4913) // user defined binary operator ',' exists but no overload could convert all operands, default built-in binary operator ',' used
+#endif
+
+struct result_of_private_type {};
+
+struct result_of_weird_type {
+  friend result_of_private_type operator,(result_of_private_type, result_of_weird_type);
+};
+
+typedef char result_of_yes_type;      // sizeof(result_of_yes_type) == 1
+typedef char (&result_of_no_type)[2]; // sizeof(result_of_no_type)  == 2
+
+template<typename T>
+result_of_no_type result_of_is_private_type(T const &);
+result_of_yes_type result_of_is_private_type(result_of_private_type);
+
+template<typename C>
+struct result_of_callable_class : C {
+    result_of_callable_class();
+    typedef result_of_private_type const &(*pfn_t)(...);
+    operator pfn_t() const volatile;
+};
+
+template<typename C>
+struct result_of_wrap_callable_class {
+  typedef result_of_callable_class<C> type;
+};
+
+template<typename C>
+struct result_of_wrap_callable_class<C const> {
+  typedef result_of_callable_class<C> const type;
+};
+
+template<typename C>
+struct result_of_wrap_callable_class<C volatile> {
+  typedef result_of_callable_class<C> volatile type;
+};
+
+template<typename C>
+struct result_of_wrap_callable_class<C const volatile> {
+  typedef result_of_callable_class<C> const volatile type;
+};
+
+template<typename C>
+struct result_of_wrap_callable_class<C &> {
+  typedef typename result_of_wrap_callable_class<C>::type &type;
+};
+
+template<typename F, bool TestCallability = true> struct cpp0x_result_of_impl;
+
+#else // BOOST_NO_SFINAE_EXPR
+
+template<typename T>
+struct result_of_always_void
+{
+  typedef void type;
+};
+
+template<typename F, typename Enable = void> struct cpp0x_result_of_impl {};
+
+#endif // BOOST_NO_SFINAE_EXPR
+
+template<typename F>
+struct result_of_void_impl
+{
+  typedef void type;
+};
+
+template<typename R>
+struct result_of_void_impl<R (*)(void)>
+{
+  typedef R type;
+};
+
+template<typename R>
+struct result_of_void_impl<R (&)(void)>
+{
+  typedef R type;
+};
+
+// Determine the return type of a function pointer or pointer to member.
+template<typename F, typename FArgs>
+struct result_of_pointer
+  : tr1_result_of_impl<typename remove_cv<F>::type, FArgs, false> { };
+
+template<typename F, typename FArgs>
+struct tr1_result_of_impl<F, FArgs, true>
+{
+  typedef typename F::result_type type;
+};
+
+template<typename FArgs>
+struct is_function_with_no_args : mpl::false_ {};
+
+template<typename F>
+struct is_function_with_no_args<F(void)> : mpl::true_ {};
+
+template<typename F, typename FArgs>
+struct result_of_nested_result : F::template result<FArgs>
+{};
+
+template<typename F, typename FArgs>
+struct tr1_result_of_impl<F, FArgs, false>
+  : mpl::if_<is_function_with_no_args<FArgs>,
+             result_of_void_impl<F>,
+             result_of_nested_result<F, FArgs> >::type
+{};
+
+} // end namespace detail
+
+#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_RESULT_OF_NUM_ARGS,<boost/utility/detail/result_of_iterate.hpp>))
+#include BOOST_PP_ITERATE()
+
+#else
+#  define BOOST_NO_RESULT_OF 1
+#endif
+
+}
+
+#endif // BOOST_RESULT_OF_HPP
diff --git a/gatb-core/thirdparty/boost/utility/string_ref.hpp b/gatb-core/thirdparty/boost/utility/string_ref.hpp
new file mode 100644
index 0000000..9018513
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/string_ref.hpp
@@ -0,0 +1,536 @@
+/*
+   Copyright (c) Marshall Clow 2012-2012.
+
+   Distributed under the Boost Software License, Version 1.0. (See accompanying
+   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+    For more information, see http://www.boost.org
+
+    Based on the StringRef implementation in LLVM (http://llvm.org) and
+    N3422 by Jeffrey Yasskin
+        http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
+
+*/
+
+#ifndef BOOST_STRING_REF_HPP
+#define BOOST_STRING_REF_HPP
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/utility/string_ref_fwd.hpp>
+#include <boost/throw_exception.hpp>
+
+#include <cstddef>
+#include <stdexcept>
+#include <algorithm>
+#include <iterator>
+#include <string>
+#include <iosfwd>
+
+namespace boost {
+
+    namespace detail {
+    //  A helper functor because sometimes we don't have lambdas
+        template <typename charT, typename traits>
+        class string_ref_traits_eq {
+        public:
+            string_ref_traits_eq ( charT ch ) : ch_(ch) {}
+            bool operator () ( charT val ) const { return traits::eq ( ch_, val ); }
+            charT ch_;
+            };
+        }
+
+    template<typename charT, typename traits>
+    class basic_string_ref {
+    public:
+        // types
+        typedef charT value_type;
+        typedef const charT* pointer;
+        typedef const charT& reference;
+        typedef const charT& const_reference;
+        typedef pointer const_iterator; // impl-defined
+        typedef const_iterator iterator;
+        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+        typedef const_reverse_iterator reverse_iterator;
+        typedef std::size_t size_type;
+        typedef std::ptrdiff_t difference_type;
+        static BOOST_CONSTEXPR_OR_CONST size_type npos = size_type(-1);
+
+        // construct/copy
+        BOOST_CONSTEXPR basic_string_ref ()
+            : ptr_(NULL), len_(0) {}
+
+        BOOST_CONSTEXPR basic_string_ref (const basic_string_ref &rhs)
+            : ptr_(rhs.ptr_), len_(rhs.len_) {}
+
+        basic_string_ref& operator=(const basic_string_ref &rhs) {
+            ptr_ = rhs.ptr_;
+            len_ = rhs.len_;
+            return *this;
+            }
+
+        basic_string_ref(const charT* str)
+            : ptr_(str), len_(traits::length(str)) {}
+
+        template<typename Allocator>
+        basic_string_ref(const std::basic_string<charT, traits, Allocator>& str)
+            : ptr_(str.data()), len_(str.length()) {}
+
+        BOOST_CONSTEXPR basic_string_ref(const charT* str, size_type len)
+            : ptr_(str), len_(len) {}
+
+#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+        template<typename Allocator>
+        explicit operator std::basic_string<charT, traits, Allocator>() const {
+            return std::basic_string<charT, traits, Allocator> ( ptr_, len_ );
+            }
+#endif
+
+        std::basic_string<charT, traits> to_string () const {
+            return std::basic_string<charT, traits> ( ptr_, len_ );
+            }
+
+        // iterators
+        BOOST_CONSTEXPR const_iterator   begin() const { return ptr_; }
+        BOOST_CONSTEXPR const_iterator  cbegin() const { return ptr_; }
+        BOOST_CONSTEXPR const_iterator     end() const { return ptr_ + len_; }
+        BOOST_CONSTEXPR const_iterator    cend() const { return ptr_ + len_; }
+                const_reverse_iterator  rbegin() const { return const_reverse_iterator (end()); }
+                const_reverse_iterator crbegin() const { return const_reverse_iterator (end()); }
+                const_reverse_iterator    rend() const { return const_reverse_iterator (begin()); }
+                const_reverse_iterator   crend() const { return const_reverse_iterator (begin()); }
+
+        // capacity
+        BOOST_CONSTEXPR size_type size()     const { return len_; }
+        BOOST_CONSTEXPR size_type length()   const { return len_; }
+        BOOST_CONSTEXPR size_type max_size() const { return len_; }
+        BOOST_CONSTEXPR bool empty()         const { return len_ == 0; }
+
+        // element access
+        BOOST_CONSTEXPR const charT& operator[](size_type pos) const { return ptr_[pos]; }
+
+        const charT& at(size_t pos) const {
+            if ( pos >= len_ )
+                BOOST_THROW_EXCEPTION( std::out_of_range ( "boost::string_ref::at" ) );
+            return ptr_[pos];
+            }
+
+        BOOST_CONSTEXPR const charT& front() const { return ptr_[0]; }
+        BOOST_CONSTEXPR const charT& back()  const { return ptr_[len_-1]; }
+        BOOST_CONSTEXPR const charT* data()  const { return ptr_; }
+
+        // modifiers
+        void clear() { len_ = 0; }
+        void remove_prefix(size_type n) {
+            if ( n > len_ )
+                n = len_;
+            ptr_ += n;
+            len_ -= n;
+            }
+
+        void remove_suffix(size_type n) {
+            if ( n > len_ )
+                n = len_;
+            len_ -= n;
+            }
+
+
+        // basic_string_ref string operations
+        basic_string_ref substr(size_type pos, size_type n=npos) const {
+            if ( pos > size())
+                BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
+            if ( n == npos || pos + n > size())
+                n = size () - pos;
+            return basic_string_ref ( data() + pos, n );
+            }
+
+        int compare(basic_string_ref x) const {
+            const int cmp = traits::compare ( ptr_, x.ptr_, (std::min)(len_, x.len_));
+            return cmp != 0 ? cmp : ( len_ == x.len_ ? 0 : len_ < x.len_ ? -1 : 1 );
+            }
+
+        bool starts_with(charT c) const { return !empty() && traits::eq ( c, front()); }
+        bool starts_with(basic_string_ref x) const {
+            return len_ >= x.len_ && traits::compare ( ptr_, x.ptr_, x.len_ ) == 0;
+            }
+
+        bool ends_with(charT c) const { return !empty() && traits::eq ( c, back()); }
+        bool ends_with(basic_string_ref x) const {
+            return len_ >= x.len_ && traits::compare ( ptr_ + len_ - x.len_, x.ptr_, x.len_ ) == 0;
+            }
+
+        size_type find(basic_string_ref s) const {
+            const_iterator iter = std::search ( this->cbegin (), this->cend (),
+                                                s.cbegin (), s.cend (), traits::eq );
+            return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
+            }
+
+        size_type find(charT c) const {
+            const_iterator iter = std::find_if ( this->cbegin (), this->cend (),
+                                    detail::string_ref_traits_eq<charT, traits> ( c ));
+            return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
+            }
+
+        size_type rfind(basic_string_ref s) const {
+            const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (),
+                                                s.crbegin (), s.crend (), traits::eq );
+            return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
+            }
+
+        size_type rfind(charT c) const {
+            const_reverse_iterator iter = std::find_if ( this->crbegin (), this->crend (),
+                                    detail::string_ref_traits_eq<charT, traits> ( c ));
+            return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
+            }
+
+        size_type find_first_of(charT c) const { return  find (c); }
+        size_type find_last_of (charT c) const { return rfind (c); }
+
+        size_type find_first_of(basic_string_ref s) const {
+            const_iterator iter = std::find_first_of
+                ( this->cbegin (), this->cend (), s.cbegin (), s.cend (), traits::eq );
+            return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
+            }
+
+        size_type find_last_of(basic_string_ref s) const {
+            const_reverse_iterator iter = std::find_first_of
+                ( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq );
+            return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter);
+            }
+
+        size_type find_first_not_of(basic_string_ref s) const {
+            const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s );
+            return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
+            }
+
+        size_type find_first_not_of(charT c) const {
+            for ( const_iterator iter = this->cbegin (); iter != this->cend (); ++iter )
+                if ( !traits::eq ( c, *iter ))
+                    return std::distance ( this->cbegin (), iter );
+            return npos;
+            }
+
+        size_type find_last_not_of(basic_string_ref s) const {
+            const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s );
+            return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
+            }
+
+        size_type find_last_not_of(charT c) const {
+            for ( const_reverse_iterator iter = this->crbegin (); iter != this->crend (); ++iter )
+                if ( !traits::eq ( c, *iter ))
+                    return reverse_distance ( this->crbegin (), iter );
+            return npos;
+            }
+
+    private:
+        template <typename r_iter>
+        size_type reverse_distance ( r_iter first, r_iter last ) const {
+            return len_ - 1 - std::distance ( first, last );
+            }
+
+        template <typename Iterator>
+        Iterator find_not_of ( Iterator first, Iterator last, basic_string_ref s ) const {
+            for ( ; first != last ; ++first )
+                if ( 0 == traits::find ( s.ptr_, s.len_, *first ))
+                    return first;
+            return last;
+            }
+
+
+
+        const charT *ptr_;
+        std::size_t len_;
+        };
+
+
+//  Comparison operators
+//  Equality
+    template<typename charT, typename traits>
+    inline bool operator==(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        if ( x.size () != y.size ()) return false;
+        return x.compare(y) == 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator==(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x == basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator==(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) == y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator==(basic_string_ref<charT, traits> x, const charT * y) {
+        return x == basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator==(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) == y;
+        }
+
+//  Inequality
+    template<typename charT, typename traits>
+    inline bool operator!=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        if ( x.size () != y.size ()) return true;
+        return x.compare(y) != 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator!=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x != basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator!=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) != y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator!=(basic_string_ref<charT, traits> x, const charT * y) {
+        return x != basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator!=(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) != y;
+        }
+
+//  Less than
+    template<typename charT, typename traits>
+    inline bool operator<(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        return x.compare(y) < 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator<(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x < basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator<(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) < y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator<(basic_string_ref<charT, traits> x, const charT * y) {
+        return x < basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator<(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) < y;
+        }
+
+//  Greater than
+    template<typename charT, typename traits>
+    inline bool operator>(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        return x.compare(y) > 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator>(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x > basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator>(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) > y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator>(basic_string_ref<charT, traits> x, const charT * y) {
+        return x > basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator>(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) > y;
+        }
+
+//  Less than or equal to
+    template<typename charT, typename traits>
+    inline bool operator<=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        return x.compare(y) <= 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator<=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x <= basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator<=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) <= y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator<=(basic_string_ref<charT, traits> x, const charT * y) {
+        return x <= basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator<=(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) <= y;
+        }
+
+//  Greater than or equal to
+    template<typename charT, typename traits>
+    inline bool operator>=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+        return x.compare(y) >= 0;
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator>=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+        return x >= basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits, typename Allocator>
+    inline bool operator>=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) >= y;
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator>=(basic_string_ref<charT, traits> x, const charT * y) {
+        return x >= basic_string_ref<charT, traits>(y);
+        }
+
+    template<typename charT, typename traits>
+    inline bool operator>=(const charT * x, basic_string_ref<charT, traits> y) {
+        return basic_string_ref<charT, traits>(x) >= y;
+        }
+
+    namespace detail {
+
+        template<class charT, class traits>
+        inline void insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) {
+            enum { chunk_size = 8 };
+            charT fill_chars[chunk_size];
+            std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill());
+            for (; n >= chunk_size && os.good(); n -= chunk_size)
+                os.write(fill_chars, static_cast< std::size_t >(chunk_size));
+            if (n > 0 && os.good())
+                os.write(fill_chars, n);
+            }
+
+        template<class charT, class traits>
+        void insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) {
+            const std::size_t size = str.size();
+            const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size;
+            const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left;
+            if (!align_left) {
+                detail::insert_fill_chars(os, alignment_size);
+                if (os.good())
+                    os.write(str.data(), size);
+                }
+            else {
+                os.write(str.data(), size);
+                if (os.good())
+                    detail::insert_fill_chars(os, alignment_size);
+                }
+            }
+
+        } // namespace detail
+
+    // Inserter
+    template<class charT, class traits>
+    inline std::basic_ostream<charT, traits>&
+    operator<<(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) {
+        if (os.good()) {
+            const std::size_t size = str.size();
+            const std::size_t w = static_cast< std::size_t >(os.width());
+            if (w <= size)
+                os.write(str.data(), size);
+            else
+                detail::insert_aligned(os, str);
+            os.width(0);
+            }
+        return os;
+        }
+
+#if 0
+    // numeric conversions
+    //
+    //  These are short-term implementations.
+    //  In a production environment, I would rather avoid the copying.
+    //
+    inline int stoi (string_ref str, size_t* idx=0, int base=10) {
+        return std::stoi ( std::string(str), idx, base );
+        }
+
+    inline long stol (string_ref str, size_t* idx=0, int base=10) {
+        return std::stol ( std::string(str), idx, base );
+        }
+
+    inline unsigned long stoul (string_ref str, size_t* idx=0, int base=10) {
+        return std::stoul ( std::string(str), idx, base );
+        }
+
+    inline long long stoll (string_ref str, size_t* idx=0, int base=10) {
+        return std::stoll ( std::string(str), idx, base );
+        }
+
+    inline unsigned long long stoull (string_ref str, size_t* idx=0, int base=10) {
+        return std::stoull ( std::string(str), idx, base );
+        }
+
+    inline float stof (string_ref str, size_t* idx=0) {
+        return std::stof ( std::string(str), idx );
+        }
+
+    inline double stod (string_ref str, size_t* idx=0) {
+        return std::stod ( std::string(str), idx );
+        }
+
+    inline long double stold (string_ref str, size_t* idx=0)  {
+        return std::stold ( std::string(str), idx );
+        }
+
+    inline int  stoi (wstring_ref str, size_t* idx=0, int base=10) {
+        return std::stoi ( std::wstring(str), idx, base );
+        }
+
+    inline long stol (wstring_ref str, size_t* idx=0, int base=10) {
+        return std::stol ( std::wstring(str), idx, base );
+        }
+
+    inline unsigned long stoul (wstring_ref str, size_t* idx=0, int base=10) {
+        return std::stoul ( std::wstring(str), idx, base );
+        }
+
+    inline long long stoll (wstring_ref str, size_t* idx=0, int base=10) {
+        return std::stoll ( std::wstring(str), idx, base );
+        }
+
+    inline unsigned long long stoull (wstring_ref str, size_t* idx=0, int base=10) {
+        return std::stoull ( std::wstring(str), idx, base );
+        }
+
+    inline float  stof (wstring_ref str, size_t* idx=0) {
+        return std::stof ( std::wstring(str), idx );
+        }
+
+    inline double stod (wstring_ref str, size_t* idx=0) {
+        return std::stod ( std::wstring(str), idx );
+        }
+
+    inline long double stold (wstring_ref str, size_t* idx=0) {
+        return std::stold ( std::wstring(str), idx );
+        }
+#endif
+
+}
+
+#if 0
+namespace std {
+    // Hashing
+    template<> struct hash<boost::string_ref>;
+    template<> struct hash<boost::u16string_ref>;
+    template<> struct hash<boost::u32string_ref>;
+    template<> struct hash<boost::wstring_ref>;
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/string_ref_fwd.hpp b/gatb-core/thirdparty/boost/utility/string_ref_fwd.hpp
new file mode 100644
index 0000000..f58b98c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/string_ref_fwd.hpp
@@ -0,0 +1,37 @@
+/*
+   Copyright (c) Marshall Clow 2012-2012.
+
+   Distributed under the Boost Software License, Version 1.0. (See accompanying
+   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+    For more information, see http://www.boost.org
+
+    Based on the StringRef implementation in LLVM (http://llvm.org) and
+    N3422 by Jeffrey Yasskin
+        http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
+
+*/
+
+#ifndef BOOST_STRING_REF_FWD_HPP
+#define BOOST_STRING_REF_FWD_HPP
+
+#include <boost/config.hpp>
+#include <string>
+
+namespace boost {
+
+    template<typename charT, typename traits = std::char_traits<charT> > class basic_string_ref;
+    typedef basic_string_ref<char,     std::char_traits<char> >        string_ref;
+    typedef basic_string_ref<wchar_t,  std::char_traits<wchar_t> >    wstring_ref;
+
+#ifndef BOOST_NO_CXX11_CHAR16_T
+    typedef basic_string_ref<char16_t, std::char_traits<char16_t> > u16string_ref;
+#endif
+
+#ifndef BOOST_NO_CXX11_CHAR32_T
+    typedef basic_string_ref<char32_t, std::char_traits<char32_t> > u32string_ref;
+#endif
+
+}
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/swap.hpp b/gatb-core/thirdparty/boost/utility/swap.hpp
new file mode 100644
index 0000000..dd9ecd9
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/swap.hpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 Glen Fernandes
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_UTILITY_SWAP_HPP
+#define BOOST_UTILITY_SWAP_HPP
+
+// The header file at this path is deprecated;
+// use boost/core/swap.hpp instead.
+
+#include <boost/core/swap.hpp>
+
+#endif
diff --git a/gatb-core/thirdparty/boost/utility/typed_in_place_factory.hpp b/gatb-core/thirdparty/boost/utility/typed_in_place_factory.hpp
new file mode 100644
index 0000000..833a346
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/typed_in_place_factory.hpp
@@ -0,0 +1,77 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2007, Tobias Schwinger.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola at hotmail.com
+//
+#ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_04APR2007_HPP
+#ifndef BOOST_PP_IS_ITERATING
+
+#include <boost/utility/detail/in_place_factory_prefix.hpp>
+
+namespace boost {
+
+class typed_in_place_factory_base {} ;
+
+#define  BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
+#define  BOOST_PP_FILENAME_1 <boost/utility/typed_in_place_factory.hpp>
+#include BOOST_PP_ITERATE()
+
+} // namespace boost
+
+#include <boost/utility/detail/in_place_factory_suffix.hpp>
+
+#define BOOST_UTILITY_TYPED_INPLACE_FACTORY_04APR2007_HPP
+#else 
+#define N BOOST_PP_ITERATION()
+
+template< class T BOOST_PP_ENUM_TRAILING_PARAMS(N,class A) >
+class BOOST_PP_CAT(typed_in_place_factory,N) 
+  : 
+  public typed_in_place_factory_base
+{
+public:
+
+  typedef T value_type;
+
+  explicit BOOST_PP_CAT(typed_in_place_factory,N) 
+      ( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
+#if N > 0
+    : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
+#endif
+  {}
+
+  void* apply (void* address) const
+  {
+    return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
+  }
+
+  void* apply (void* address, std::size_t n) const
+  {
+    for(void* next = address = this->apply(address); !! --n;)
+      this->apply(next = static_cast<char *>(next) + sizeof(T));
+    return address; 
+  }
+
+  BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
+};
+
+template< class T BOOST_PP_ENUM_TRAILING_PARAMS(N, class A) >
+inline BOOST_PP_CAT(typed_in_place_factory,N)<
+    T BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >
+in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
+{
+  return BOOST_PP_CAT(typed_in_place_factory,N)< 
+      T BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >( BOOST_PP_ENUM_PARAMS(N, a) );
+}
+
+#undef N
+#endif
+#endif
+
diff --git a/gatb-core/thirdparty/boost/utility/value_init.hpp b/gatb-core/thirdparty/boost/utility/value_init.hpp
new file mode 100644
index 0000000..9d8de70
--- /dev/null
+++ b/gatb-core/thirdparty/boost/utility/value_init.hpp
@@ -0,0 +1,281 @@
+// (C) Copyright 2002-2008, Fernando Luis Cacciola Carballal.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// 21 Ago 2002 (Created) Fernando Cacciola
+// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
+// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
+// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
+// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
+// 03 Apr 2010 (Added initialized<T>, suggested by Jeffrey Hellrung, fixing #3472) Niels Dekker
+// 30 May 2010 (Made memset call conditional, fixing #3869) Niels Dekker
+//
+#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
+#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
+
+// Note: The implementation of boost::value_initialized had to deal with the
+// fact that various compilers haven't fully implemented value-initialization.
+// The constructor of boost::value_initialized<T> works around these compiler
+// issues, by clearing the bytes of T, before constructing the T object it
+// contains. More details on these issues are at libs/utility/value_init.htm
+
+#include <boost/aligned_storage.hpp>
+#include <boost/config.hpp> // For BOOST_NO_COMPLETE_VALUE_INITIALIZATION.
+#include <boost/detail/workaround.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/cv_traits.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/swap.hpp>
+#include <cstring>
+#include <new>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+// It is safe to ignore the following warning from MSVC 7.1 or higher:
+// "warning C4351: new behavior: elements of array will be default initialized"
+#pragma warning(disable: 4351)
+// It is safe to ignore the following MSVC warning, which may pop up when T is 
+// a const type: "warning C4512: assignment operator could not be generated".
+#pragma warning(disable: 4512)
+#endif
+
+#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION
+  // Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED 
+  // suggests that a workaround should be applied, because of compiler issues 
+  // regarding value-initialization.
+  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
+#endif
+
+// Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND
+// switches the value-initialization workaround either on or off.
+#ifndef BOOST_DETAIL_VALUE_INIT_WORKAROUND
+  #ifdef BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
+  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 1
+  #else
+  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 0
+  #endif
+#endif
+
+namespace boost {
+
+template<class T>
+class initialized
+{
+  private :
+    struct wrapper
+    {
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+      typename
+#endif 
+      remove_const<T>::type data;
+
+      BOOST_GPU_ENABLED
+      wrapper()
+      :
+      data()
+      {
+      }
+
+      BOOST_GPU_ENABLED
+      wrapper(T const & arg)
+      :
+      data(arg)
+      {
+      }
+    };
+
+    mutable
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+      typename
+#endif 
+      aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value>::type x;
+
+    BOOST_GPU_ENABLED
+    wrapper * wrapper_address() const
+    {
+      return static_cast<wrapper *>( static_cast<void*>(&x));
+    }
+
+  public :
+
+    BOOST_GPU_ENABLED
+    initialized()
+    {
+#if BOOST_DETAIL_VALUE_INIT_WORKAROUND
+      std::memset(&x, 0, sizeof(x));
+#endif
+      new (wrapper_address()) wrapper();
+    }
+
+    BOOST_GPU_ENABLED
+    initialized(initialized const & arg)
+    {
+      new (wrapper_address()) wrapper( static_cast<wrapper const &>(*(arg.wrapper_address())));
+    }
+
+    BOOST_GPU_ENABLED
+    explicit initialized(T const & arg)
+    {
+      new (wrapper_address()) wrapper(arg);
+    }
+
+    BOOST_GPU_ENABLED
+    initialized & operator=(initialized const & arg)
+    {
+      // Assignment is only allowed when T is non-const.
+      BOOST_STATIC_ASSERT( ! is_const<T>::value );
+      *wrapper_address() = static_cast<wrapper const &>(*(arg.wrapper_address()));
+      return *this;
+    }
+
+    BOOST_GPU_ENABLED
+    ~initialized()
+    {
+      wrapper_address()->wrapper::~wrapper();
+    }
+
+    BOOST_GPU_ENABLED
+    T const & data() const
+    {
+      return wrapper_address()->data;
+    }
+
+    BOOST_GPU_ENABLED
+    T& data()
+    {
+      return wrapper_address()->data;
+    }
+
+    BOOST_GPU_ENABLED
+    void swap(initialized & arg)
+    {
+      ::boost::swap( this->data(), arg.data() );
+    }
+
+    BOOST_GPU_ENABLED
+    operator T const &() const
+    {
+      return wrapper_address()->data;
+    }
+
+    BOOST_GPU_ENABLED
+    operator T&()
+    {
+      return wrapper_address()->data;
+    }
+
+} ;
+
+template<class T>
+BOOST_GPU_ENABLED
+T const& get ( initialized<T> const& x )
+{
+  return x.data() ;
+}
+
+template<class T>
+BOOST_GPU_ENABLED
+T& get ( initialized<T>& x )
+{
+  return x.data() ;
+}
+
+template<class T>
+BOOST_GPU_ENABLED
+void swap ( initialized<T> & lhs, initialized<T> & rhs )
+{
+  lhs.swap(rhs) ;
+}
+
+template<class T>
+class value_initialized
+{
+  private :
+
+    // initialized<T> does value-initialization by default.
+    initialized<T> m_data;
+
+  public :
+    
+    BOOST_GPU_ENABLED
+    value_initialized()
+    :
+    m_data()
+    { }
+    
+    BOOST_GPU_ENABLED
+    T const & data() const
+    {
+      return m_data.data();
+    }
+
+    BOOST_GPU_ENABLED
+    T& data()
+    {
+      return m_data.data();
+    }
+
+    BOOST_GPU_ENABLED
+    void swap(value_initialized & arg)
+    {
+      m_data.swap(arg.m_data);
+    }
+
+    BOOST_GPU_ENABLED
+    operator T const &() const
+    {
+      return m_data;
+    }
+
+    BOOST_GPU_ENABLED
+    operator T&()
+    {
+      return m_data;
+    }
+} ;
+
+
+template<class T>
+BOOST_GPU_ENABLED
+T const& get ( value_initialized<T> const& x )
+{
+  return x.data() ;
+}
+
+template<class T>
+BOOST_GPU_ENABLED
+T& get ( value_initialized<T>& x )
+{
+  return x.data() ;
+}
+
+template<class T>
+BOOST_GPU_ENABLED
+void swap ( value_initialized<T> & lhs, value_initialized<T> & rhs )
+{
+  lhs.swap(rhs) ;
+}
+
+
+class initialized_value_t
+{
+  public :
+    
+    template <class T> BOOST_GPU_ENABLED operator T() const
+    {
+      return initialized<T>().data();
+    }
+};
+
+initialized_value_t const initialized_value = {} ;
+
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/boost/variant.hpp b/gatb-core/thirdparty/boost/variant.hpp
new file mode 100644
index 0000000..6088c5d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant.hpp
@@ -0,0 +1,27 @@
+//-----------------------------------------------------------------------------
+// boost variant.hpp header file
+// See http://www.boost.org/libs/variant for documentation.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_HPP
+#define BOOST_VARIANT_HPP
+
+// variant "main"
+#include "boost/variant/variant.hpp"
+#include "boost/variant/recursive_variant.hpp"
+#include "boost/variant/recursive_wrapper.hpp"
+
+// common applications
+#include "boost/variant/get.hpp"
+#include "boost/variant/apply_visitor.hpp"
+#include "boost/variant/static_visitor.hpp"
+#include "boost/variant/visitor_ptr.hpp"
+
+#endif // BOOST_VARIANT_HPP
diff --git a/gatb-core/thirdparty/boost/variant/apply_visitor.hpp b/gatb-core/thirdparty/boost/variant/apply_visitor.hpp
new file mode 100644
index 0000000..53bada0
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/apply_visitor.hpp
@@ -0,0 +1,20 @@
+//-----------------------------------------------------------------------------
+// boost variant/apply_visitor.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_APPLY_VISITOR_HPP
+#define BOOST_VARIANT_APPLY_VISITOR_HPP
+
+#include "boost/variant/detail/apply_visitor_unary.hpp"
+#include "boost/variant/detail/apply_visitor_binary.hpp"
+#include "boost/variant/detail/apply_visitor_delayed.hpp"
+
+#endif // BOOST_VARIANT_APPLY_VISITOR_HPP
diff --git a/gatb-core/thirdparty/boost/variant/bad_visit.hpp b/gatb-core/thirdparty/boost/variant/bad_visit.hpp
new file mode 100644
index 0000000..e07657e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/bad_visit.hpp
@@ -0,0 +1,41 @@
+//-----------------------------------------------------------------------------
+// boost variant/bad_visit.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_BAD_VISIT_HPP
+#define BOOST_VARIANT_BAD_VISIT_HPP
+
+#include <exception>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class bad_visit
+//
+// Exception thrown when a visitation attempt via apply_visitor fails due
+// to invalid visited subtype or contents.
+//
+struct bad_visit
+    : std::exception
+{
+public: // std::exception interface
+
+    virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+    {
+        return "boost::bad_visit: "
+               "failed visitation using boost::apply_visitor";
+    }
+
+};
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_BAD_VISIT_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/apply_visitor_binary.hpp b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_binary.hpp
new file mode 100644
index 0000000..e5e22e1
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_binary.hpp
@@ -0,0 +1,280 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/apply_visitor_binary.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003 Eric Friedman
+// Copyright (c) 2014 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_BINARY_HPP
+#define BOOST_VARIANT_DETAIL_APPLY_VISITOR_BINARY_HPP
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/variant/detail/generic_result_type.hpp"
+
+#include "boost/variant/detail/apply_visitor_unary.hpp"
+
+#if BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302))
+#include "boost/utility/enable_if.hpp"
+#include "boost/mpl/not.hpp"
+#include "boost/type_traits/is_const.hpp"
+#endif
+
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+#   include "boost/variant/detail/has_result_type.hpp"
+#endif
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// function template apply_visitor(visitor, visitable1, visitable2)
+//
+// Visits visitable1 and visitable2 such that their values (which we
+// shall call x and y, respectively) are used as arguments in the
+// expression visitor(x, y).
+//
+
+namespace detail { namespace variant {
+
+template <typename Visitor, typename Value1>
+class apply_visitor_binary_invoke
+{
+public: // visitor typedefs
+
+    typedef typename Visitor::result_type
+        result_type;
+
+private: // representation
+
+    Visitor& visitor_;
+    Value1& value1_;
+
+public: // structors
+
+    apply_visitor_binary_invoke(Visitor& visitor, Value1& value1) BOOST_NOEXCEPT
+        : visitor_(visitor)
+        , value1_(value1)
+    {
+    }
+
+public: // visitor interfaces
+
+    template <typename Value2>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(Value2& value2)
+    {
+        return visitor_(value1_, value2);
+    }
+
+private:
+    apply_visitor_binary_invoke& operator=(const apply_visitor_binary_invoke&);
+};
+
+template <typename Visitor, typename Visitable2>
+class apply_visitor_binary_unwrap
+{
+public: // visitor typedefs
+
+    typedef typename Visitor::result_type
+        result_type;
+
+private: // representation
+
+    Visitor& visitor_;
+    Visitable2& visitable2_;
+
+public: // structors
+
+    apply_visitor_binary_unwrap(Visitor& visitor, Visitable2& visitable2) BOOST_NOEXCEPT
+        : visitor_(visitor)
+        , visitable2_(visitable2)
+    {
+    }
+
+public: // visitor interfaces
+
+    template <typename Value1>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(Value1& value1)
+    {
+        apply_visitor_binary_invoke<
+              Visitor
+            , Value1
+            > invoker(visitor_, value1);
+
+        return boost::apply_visitor(invoker, visitable2_);
+    }
+
+private:
+    apply_visitor_binary_unwrap& operator=(const apply_visitor_binary_unwrap&);
+
+};
+
+}} // namespace detail::variant
+
+//
+// nonconst-visitor version:
+//
+
+#if !BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302))
+
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \
+    /**/
+
+#else // EDG-based compilers
+
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \
+    typename enable_if< \
+          mpl::not_< is_const< V > > \
+        , BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \
+        >::type \
+    /**/
+
+#endif // EDG-based compilers workaround
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline
+    BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(Visitor)
+apply_visitor(
+      Visitor& visitor
+    , Visitable1& visitable1, Visitable2& visitable2
+    )
+{
+    ::boost::detail::variant::apply_visitor_binary_unwrap<
+          Visitor, Visitable2
+        > unwrapper(visitor, visitable2);
+
+    return boost::apply_visitor(unwrapper, visitable1);
+}
+
+#undef BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE
+
+//
+// const-visitor version:
+//
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+          typename Visitor::result_type
+        )
+apply_visitor(
+      const Visitor& visitor
+    , Visitable1& visitable1, Visitable2& visitable2
+    )
+{
+    ::boost::detail::variant::apply_visitor_binary_unwrap<
+          const Visitor, Visitable2
+        > unwrapper(visitor, visitable2);
+
+    return boost::apply_visitor(unwrapper, visitable1);
+}
+
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
+//////////////////////////////////////////////////////////////////////////
+// function template apply_visitor(visitor, visitable1, visitable2)
+//
+// C++14 part.
+//
+
+namespace detail { namespace variant {
+
+template <typename Visitor, typename Value1>
+class apply_visitor_binary_invoke_cpp14
+{
+    Visitor& visitor_;
+    Value1& value1_;
+
+public: // structors
+
+    apply_visitor_binary_invoke_cpp14(Visitor& visitor, Value1& value1) BOOST_NOEXCEPT
+        : visitor_(visitor)
+        , value1_(value1)
+    {
+    }
+
+public: // visitor interfaces
+
+    template <typename Value2>
+    decltype(auto) operator()(Value2& value2)
+    {
+        return visitor_(value1_, value2);
+    }
+
+private:
+    apply_visitor_binary_invoke_cpp14& operator=(const apply_visitor_binary_invoke_cpp14&);
+};
+
+template <typename Visitor, typename Visitable2>
+class apply_visitor_binary_unwrap_cpp14
+{
+    Visitor& visitor_;
+    Visitable2& visitable2_;
+
+public: // structors
+
+    apply_visitor_binary_unwrap_cpp14(Visitor& visitor, Visitable2& visitable2) BOOST_NOEXCEPT
+        : visitor_(visitor)
+        , visitable2_(visitable2)
+    {
+    }
+
+public: // visitor interfaces
+
+    template <typename Value1>
+    decltype(auto) operator()(Value1& value1)
+    {
+        apply_visitor_binary_invoke_cpp14<
+              Visitor
+            , Value1
+            > invoker(visitor_, value1);
+
+        return boost::apply_visitor(invoker, visitable2_);
+    }
+
+private:
+    apply_visitor_binary_unwrap_cpp14& operator=(const apply_visitor_binary_unwrap_cpp14&);
+};
+
+}} // namespace detail::variant
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline decltype(auto) apply_visitor(Visitor& visitor, Visitable1& visitable1, Visitable2& visitable2,
+    typename boost::disable_if<
+        boost::detail::variant::has_result_type<Visitor>
+    >::type* = 0)
+{
+    ::boost::detail::variant::apply_visitor_binary_unwrap_cpp14<
+          Visitor, Visitable2
+        > unwrapper(visitor, visitable2);
+
+    return boost::apply_visitor(unwrapper, visitable1);
+}
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline decltype(auto) apply_visitor(const Visitor& visitor, Visitable1& visitable1, Visitable2& visitable2,
+    typename boost::disable_if<
+        boost::detail::variant::has_result_type<Visitor>
+    >::type* = 0)
+{
+    ::boost::detail::variant::apply_visitor_binary_unwrap_cpp14<
+          const Visitor, Visitable2
+        > unwrapper(visitor, visitable2);
+
+    return boost::apply_visitor(unwrapper, visitable1);
+}
+
+#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_BINARY_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/apply_visitor_delayed.hpp b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_delayed.hpp
new file mode 100644
index 0000000..29f4614
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_delayed.hpp
@@ -0,0 +1,151 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/apply_visitor_delayed.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
+#define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
+
+#include "boost/variant/detail/generic_result_type.hpp"
+
+#include "boost/variant/detail/apply_visitor_unary.hpp"
+#include "boost/variant/detail/apply_visitor_binary.hpp"
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+
+
+#include "boost/variant/detail/has_result_type.hpp"
+#include <boost/core/enable_if.hpp>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// function template apply_visitor(visitor)
+//
+// Returns a function object, overloaded for unary and binary usage, that
+// visits its arguments using visitor (or a copy of visitor) via
+//  * apply_visitor( visitor, [argument] )
+// under unary invocation, or
+//  * apply_visitor( visitor, [argument1], [argument2] )
+// under binary invocation.
+//
+// NOTE: Unlike other apply_visitor forms, the visitor object must be
+//   non-const; this prevents user from giving temporary, to disastrous
+//   effect (i.e., returned function object would have dead reference).
+//
+
+template <typename Visitor>
+class apply_visitor_delayed_t
+{
+public: // visitor typedefs
+
+    typedef typename Visitor::result_type
+        result_type;
+
+private: // representation
+
+    Visitor& visitor_;
+
+public: // structors
+
+    explicit apply_visitor_delayed_t(Visitor& visitor) BOOST_NOEXCEPT
+      : visitor_(visitor)
+    {
+    }
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+public: // N-ary visitor interface
+    template <typename... Visitables>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(Visitables&... visitables) const
+    {
+        return apply_visitor(visitor_, visitables...);
+    }
+
+#else // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+public: // unary visitor interface
+
+    template <typename Visitable>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(Visitable& visitable) const
+    {
+        return apply_visitor(visitor_, visitable);
+    }
+
+public: // binary visitor interface
+
+    template <typename Visitable1, typename Visitable2>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(Visitable1& visitable1, Visitable2& visitable2) const
+    {
+        return apply_visitor(visitor_, visitable1, visitable2);
+    }
+
+#endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+private:
+    apply_visitor_delayed_t& operator=(const apply_visitor_delayed_t&);
+
+};
+
+template <typename Visitor>
+inline typename boost::enable_if<
+        boost::detail::variant::has_result_type<Visitor>,
+        apply_visitor_delayed_t<Visitor>
+    >::type apply_visitor(Visitor& visitor)
+{
+    return apply_visitor_delayed_t<Visitor>(visitor);
+}
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) \
+    && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+template <typename Visitor>
+class apply_visitor_delayed_cpp14_t
+{
+private: // representation
+    Visitor& visitor_;
+
+public: // structors
+
+    explicit apply_visitor_delayed_cpp14_t(Visitor& visitor) BOOST_NOEXCEPT
+      : visitor_(visitor)
+    {
+    }
+
+public: // N-ary visitor interface
+    template <typename... Visitables>
+    decltype(auto) operator()(Visitables&... visitables) const
+    {
+        return apply_visitor(visitor_, visitables...);
+    }
+
+private:
+    apply_visitor_delayed_cpp14_t& operator=(const apply_visitor_delayed_cpp14_t&);
+
+};
+
+template <typename Visitor>
+inline  typename boost::disable_if<
+        boost::detail::variant::has_result_type<Visitor>,
+        apply_visitor_delayed_cpp14_t<Visitor>
+    >::type apply_visitor(Visitor& visitor)
+{
+    return apply_visitor_delayed_cpp14_t<Visitor>(visitor);
+}
+
+#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+            // && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/apply_visitor_unary.hpp b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_unary.hpp
new file mode 100644
index 0000000..63c21a3
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/apply_visitor_unary.hpp
@@ -0,0 +1,173 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/apply_visitor_unary.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003 Eric Friedman
+// Copyright (c) 2014 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_UNARY_HPP
+#define BOOST_VARIANT_DETAIL_APPLY_VISITOR_UNARY_HPP
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/variant/detail/generic_result_type.hpp"
+
+#if BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302))
+#include "boost/core/enable_if.hpp"
+#include "boost/mpl/not.hpp"
+#include "boost/type_traits/is_const.hpp"
+#endif
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+#   include <boost/mpl/distance.hpp>
+#   include <boost/mpl/advance.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/size.hpp>
+#   include <boost/utility/declval.hpp>
+#   include <boost/core/enable_if.hpp>
+#   include "boost/variant/detail/has_result_type.hpp"
+#endif
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// function template apply_visitor(visitor, visitable)
+//
+// Visits visitable with visitor.
+//
+
+//
+// nonconst-visitor version:
+//
+
+#if !BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302))
+
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \
+    /**/
+
+#else // EDG-based compilers
+
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \
+    typename enable_if< \
+          mpl::not_< is_const< V > > \
+        , BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \
+        >::type \
+    /**/
+
+#endif // EDG-based compilers workaround
+
+template <typename Visitor, typename Visitable>
+inline
+    BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(Visitor)
+apply_visitor(Visitor& visitor, Visitable& visitable)
+{
+    return visitable.apply_visitor(visitor);
+}
+
+#undef BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE
+
+//
+// const-visitor version:
+//
+
+template <typename Visitor, typename Visitable>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+apply_visitor(const Visitor& visitor, Visitable& visitable)
+{
+    return visitable.apply_visitor(visitor);
+}
+
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
+// C++14
+namespace detail { namespace variant {
+
+// This class serves only metaprogramming purposes. none of its methods must be called at runtime!
+template <class Visitor, class Variant>
+struct result_multideduce1 {
+    typedef typename Variant::types                 types;
+    typedef typename boost::mpl::begin<types>::type begin_it;
+    typedef typename boost::mpl::advance<
+        begin_it, boost::mpl::int_<boost::mpl::size<types>::type::value - 1>
+    >::type                                         last_it;
+
+    // For metaprogramming purposes ONLY! Do not use this method (and class) at runtime!
+    static Visitor& vis() BOOST_NOEXCEPT {
+        // Functions that work with lambdas must be defined in same translation unit.
+        // Because of that, we can not use `boost::decval<Visitor&>()` here.
+        Visitor&(*f)() = 0; // pointer to function
+        return f();
+    }
+
+    static decltype(auto) deduce_impl(last_it, unsigned /*helper*/) {
+        typedef typename boost::mpl::deref<last_it>::type value_t;
+        return vis()( boost::declval< value_t& >() );
+    }
+
+    template <class It>
+    static decltype(auto) deduce_impl(It, unsigned helper) {
+        typedef typename boost::mpl::next<It>::type next_t;
+        typedef typename boost::mpl::deref<It>::type value_t;
+        if (helper == boost::mpl::distance<begin_it, It>::type::value) {
+            return deduce_impl(next_t(), ++helper);
+        }
+
+        return vis()( boost::declval< value_t& >() );
+    }
+
+    static decltype(auto) deduce() {
+        return deduce_impl(begin_it(), 0);
+    }
+};
+
+template <class Visitor, class Variant>
+struct result_wrapper1
+{
+    typedef decltype(result_multideduce1<Visitor, Variant>::deduce()) result_type;
+
+    Visitor& visitor_;
+    explicit result_wrapper1(Visitor& visitor) BOOST_NOEXCEPT
+        : visitor_(visitor)
+    {}
+
+    template <class T>
+    result_type operator()(T& val) const {
+        return visitor_(val);
+    }
+};
+
+}} // namespace detail::variant
+
+template <typename Visitor, typename Visitable>
+inline decltype(auto) apply_visitor(Visitor& visitor, Visitable& visitable,
+    typename boost::disable_if<
+        boost::detail::variant::has_result_type<Visitor>
+    >::type* = 0)
+{
+    boost::detail::variant::result_wrapper1<Visitor, Visitable> cpp14_vis(visitor);
+    return visitable.apply_visitor(cpp14_vis);
+}
+
+template <typename Visitor, typename Visitable>
+inline decltype(auto) apply_visitor(const Visitor& visitor, Visitable& visitable,
+    typename boost::disable_if<
+        boost::detail::variant::has_result_type<Visitor>
+    >::type* = 0)
+{
+    boost::detail::variant::result_wrapper1<const Visitor, Visitable> cpp14_vis(visitor);
+    return visitable.apply_visitor(cpp14_vis);
+}
+
+#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_UNARY_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/backup_holder.hpp b/gatb-core/thirdparty/boost/variant/detail/backup_holder.hpp
new file mode 100644
index 0000000..1ccf160
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/backup_holder.hpp
@@ -0,0 +1,95 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/backup_holder.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_BACKUP_HOLDER_HPP
+#define BOOST_VARIANT_DETAIL_BACKUP_HOLDER_HPP
+
+#include "boost/config.hpp"
+#include "boost/assert.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+template <typename T>
+class backup_holder
+{
+private: // representation
+
+    T* backup_;
+
+public: // structors
+
+    ~backup_holder() BOOST_NOEXCEPT
+    {
+        delete backup_;
+    }
+
+    explicit backup_holder(T* backup) BOOST_NOEXCEPT
+        : backup_(backup)
+    {
+    }
+
+    backup_holder(const backup_holder&);
+
+public: // modifiers
+
+    backup_holder& operator=(const backup_holder& rhs)
+    {
+        *backup_ = rhs.get();
+        return *this;
+    }
+
+    backup_holder& operator=(const T& rhs)
+    {
+        *backup_ = rhs;
+        return *this;
+    }
+
+    void swap(backup_holder& rhs) BOOST_NOEXCEPT
+    {
+        T* tmp = rhs.backup_;
+        rhs.backup_ = this->backup_;
+        this->backup_ = tmp;
+    }
+
+public: // queries
+
+    T& get() BOOST_NOEXCEPT
+    {
+        return *backup_;
+    }
+
+    const T& get() const BOOST_NOEXCEPT
+    {
+        return *backup_;
+    }
+
+};
+
+template <typename T>
+backup_holder<T>::backup_holder(const backup_holder&)
+    : backup_(0)
+{
+    // not intended for copy, but do not want to prohibit syntactically
+    BOOST_ASSERT(false);
+}
+
+template <typename T>
+void swap(backup_holder<T>& lhs, backup_holder<T>& rhs) BOOST_NOEXCEPT
+{
+    lhs.swap(rhs);
+}
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_BACKUP_HOLDER_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/bool_trait_def.hpp b/gatb-core/thirdparty/boost/variant/detail/bool_trait_def.hpp
new file mode 100644
index 0000000..823a79a
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/bool_trait_def.hpp
@@ -0,0 +1,30 @@
+//-----------------------------------------------------------------------------
+// boost/variant/detail/bool_trait_def.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Needed until move-related traits incorporated into type_traits library.
+// no include guards, the header is intended for multiple inclusion!
+
+// should be the last #include
+#include "boost/type_traits/detail/bool_trait_def.hpp"
+
+#define BOOST_VARIANT_TT_AUX_BOOL_TRAIT_DEF1(trait,T,C) \
+template< typename T > struct trait \
+    BOOST_TT_AUX_BOOL_C_BASE(C) \
+{ \
+    BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
+}; \
+/**/
+
+#define BOOST_VARIANT_TT_AUX_TRAIT_SUFFIX(arity, name) \
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(arity, name) \
+/**/
diff --git a/gatb-core/thirdparty/boost/variant/detail/bool_trait_undef.hpp b/gatb-core/thirdparty/boost/variant/detail/bool_trait_undef.hpp
new file mode 100644
index 0000000..9b8fb54
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/bool_trait_undef.hpp
@@ -0,0 +1,21 @@
+//-----------------------------------------------------------------------------
+// boost/variant/detail/bool_trait_undef.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Needed until move-related traits incorporated into type_traits library.
+// no include guards, the header is intended for multiple inclusion!
+
+// should be the last #include
+#include "boost/type_traits/detail/bool_trait_undef.hpp"
+
+
+#undef BOOST_VARIANT_TT_AUX_BOOL_TRAIT_DEF1
+#undef BOOST_VARIANT_TT_AUX_TRAIT_SUFFIX
diff --git a/gatb-core/thirdparty/boost/variant/detail/cast_storage.hpp b/gatb-core/thirdparty/boost/variant/detail/cast_storage.hpp
new file mode 100644
index 0000000..24feed6
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/cast_storage.hpp
@@ -0,0 +1,42 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/cast_storage.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_CAST_STORAGE_HPP
+#define BOOST_VARIANT_DETAIL_CAST_STORAGE_HPP
+
+#include "boost/config.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) function template cast_storage
+//
+// Casts the given storage to the specified type, but with qualification.
+//
+
+template <typename T>
+inline T& cast_storage(void* storage)
+{
+    return *static_cast<T*>(storage);
+}
+
+template <typename T>
+inline const T& cast_storage(const void* storage)
+{
+    return *static_cast<const T*>(storage);
+}
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_CAST_STORAGE_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/config.hpp b/gatb-core/thirdparty/boost/variant/detail/config.hpp
new file mode 100644
index 0000000..84564a4
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/config.hpp
@@ -0,0 +1,37 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/config.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_CONFIG_HPP
+#define BOOST_VARIANT_DETAIL_CONFIG_HPP
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING
+//
+#if BOOST_WORKAROUND(__MWERKS__, <= 0x3201) \
+ || BOOST_WORKAROUND(BOOST_INTEL, <= 700) \
+ && !defined(BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING)
+#   define BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND
+//
+#if !defined(BOOST_NO_SFINAE) \
+ && !BOOST_WORKAROUND(BOOST_INTEL, <= 700) \
+ && !defined(BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND)
+#   define BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND
+#endif
+
+#endif // BOOST_VARIANT_DETAIL_CONFIG_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/element_index.hpp b/gatb-core/thirdparty/boost/variant/detail/element_index.hpp
new file mode 100644
index 0000000..8ea92ec
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/element_index.hpp
@@ -0,0 +1,63 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/element_index.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2014-2015 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
+#define BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
+
+#include "boost/config.hpp"
+#include "boost/variant/recursive_wrapper_fwd.hpp"
+#include "boost/variant/variant_fwd.hpp"
+
+#include "boost/type_traits/remove_cv.hpp"
+#include "boost/type_traits/remove_reference.hpp"
+#include "boost/mpl/find_if.hpp"
+
+namespace boost { namespace detail { namespace variant {
+
+template <class VariantElement, class T>
+struct variant_element_functor :
+    boost::mpl::or_<
+        boost::is_same<VariantElement, T>,
+        boost::is_same<VariantElement, boost::recursive_wrapper<T> >,
+        boost::is_same<VariantElement, T& >
+    >
+{};
+
+template <class Types, class T>
+struct element_iterator_impl :
+    boost::mpl::find_if<
+        Types,
+        boost::mpl::or_<
+            variant_element_functor<boost::mpl::_1, T>,
+            variant_element_functor<boost::mpl::_1, typename boost::remove_cv<T>::type >
+        >
+    >
+{};
+
+template <class Variant, class T>
+struct element_iterator :
+    element_iterator_impl< typename Variant::types, typename boost::remove_reference<T>::type >
+{};
+
+template <class Variant, class T>
+struct holds_element :
+    boost::mpl::not_<
+        boost::is_same<
+            typename boost::mpl::end<typename Variant::types>::type,
+            typename element_iterator<Variant, T>::type
+        >
+    >
+{};
+
+
+}}} // namespace boost::detail::variant
+
+#endif // BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/enable_recursive.hpp b/gatb-core/thirdparty/boost/variant/detail/enable_recursive.hpp
new file mode 100644
index 0000000..a974b4f
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/enable_recursive.hpp
@@ -0,0 +1,133 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/enable_recursive.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
+#define BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
+
+#include "boost/variant/detail/enable_recursive_fwd.hpp"
+#include "boost/variant/variant_fwd.hpp"
+
+#if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
+#   include "boost/mpl/apply.hpp"
+#   include "boost/mpl/eval_if.hpp"
+#   include "boost/mpl/lambda.hpp"
+#endif
+
+#include "boost/variant/detail/substitute.hpp"
+#include "boost/mpl/aux_/config/ctps.hpp"
+#include "boost/mpl/bool_fwd.hpp"
+#include "boost/mpl/if.hpp"
+#include "boost/mpl/or.hpp"
+#include "boost/type_traits/is_pointer.hpp"
+#include "boost/type_traits/is_reference.hpp"
+#include "boost/type_traits/is_same.hpp"
+
+#include "boost/variant/recursive_wrapper.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+#   define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
+    substitute< T , Dest , Source > \
+    /**/
+
+#else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class template rebind1
+//
+// Limited workaround in case 'substitute' metafunction unavailable.
+//
+
+template <typename T, typename U1>
+struct rebind1
+{
+private:
+    typedef typename mpl::lambda<
+          mpl::identity<T>
+        >::type le_;
+
+public:
+    typedef typename mpl::eval_if<
+          is_same< le_, mpl::identity<T> >
+        , le_ // identity<T>
+        , mpl::apply1<le_, U1>
+        >::type type;
+};
+
+#   define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
+    rebind1< T , Dest > \
+    /**/
+
+#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction enable_recursive
+//
+// See boost/variant/detail/enable_recursive_fwd.hpp for more information.
+//
+
+
+template <typename T, typename RecursiveVariant, typename NoWrapper>
+struct enable_recursive
+    : BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
+          T, RecursiveVariant, ::boost::recursive_variant_
+        )
+{
+};
+
+template <typename T, typename RecursiveVariant>
+struct enable_recursive< T,RecursiveVariant,mpl::false_ >
+{
+private: // helpers, for metafunction result (below)
+
+    typedef typename BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
+          T, RecursiveVariant, ::boost::recursive_variant_
+        )::type t_;
+
+public: // metafunction result
+
+    // [Wrap with recursive_wrapper only if rebind really changed something:]
+    typedef typename mpl::if_<
+          mpl::or_<
+              is_same< t_,T >
+            , is_reference<t_>
+            , is_pointer<t_>
+            >
+        , t_
+        , boost::recursive_wrapper<t_>
+        >::type type;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction class quoted_enable_recursive
+//
+// Same behavior as enable_recursive metafunction (see above).
+//
+template <typename RecursiveVariant, typename NoWrapper>
+struct quoted_enable_recursive
+{
+    template <typename T>
+    struct apply
+        : enable_recursive<T, RecursiveVariant, NoWrapper>
+    {
+    };
+};
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/enable_recursive_fwd.hpp b/gatb-core/thirdparty/boost/variant/detail/enable_recursive_fwd.hpp
new file mode 100644
index 0000000..39a6b71
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/enable_recursive_fwd.hpp
@@ -0,0 +1,87 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/enable_recursive_fwd.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP
+#define BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP
+
+#include "boost/mpl/aux_/config/ctps.hpp"
+
+#include "boost/mpl/bool_fwd.hpp"
+
+#   include "boost/mpl/bool.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) tag recursive_flag
+//
+// Signifies that the variant should perform recursive substituion.
+//
+
+
+template <typename T>
+struct recursive_flag
+{
+    typedef T type;
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction is_recursive_flag
+//
+// Signifies that the variant should perform recursive substituion.
+//
+
+
+template <typename T>
+struct is_recursive_flag
+    : mpl::false_
+{
+};
+
+template <typename T>
+struct is_recursive_flag< recursive_flag<T> >
+    : mpl::true_
+{
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction enable_recursive
+//
+// Attempts recursive_variant_ tag substitution, wrapping with
+// boost::recursive_wrapper if substituion occurs w/ non-indirect result
+// (i.e., not a reference or pointer) *and* NoWrapper is false_.
+//
+template <
+      typename T
+    , typename RecursiveVariant
+    , typename NoWrapper = mpl::false_
+    >
+struct enable_recursive;
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction class quoted_enable_recursive
+//
+// Same behavior as enable_recursive metafunction (see above).
+//
+template <
+      typename RecursiveVariant
+    , typename NoWrapper = mpl::false_
+    >
+struct quoted_enable_recursive;
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/forced_return.hpp b/gatb-core/thirdparty/boost/variant/detail/forced_return.hpp
new file mode 100644
index 0000000..522b796
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/forced_return.hpp
@@ -0,0 +1,102 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/forced_return.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP
+#define BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP
+
+#include "boost/config.hpp"
+#include "boost/variant/detail/generic_result_type.hpp"
+#include "boost/assert.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) function template forced_return
+//
+// Logical error to permit invocation at runtime, but (artificially) satisfies
+// compile-time requirement of returning a result value.
+//
+
+#if !defined(BOOST_MSVC)                                \
+ && !defined(BOOST_NO_VOID_RETURNS)
+
+// "standard" implementation:
+
+template <typename T>
+inline T forced_return()
+{
+    // logical error: should never be here! (see above)
+    BOOST_ASSERT(false);
+
+    T (*dummy_function_ptr)() = 0;
+    return dummy_function_ptr();
+}
+
+template <>
+inline void forced_return<void>()
+{
+    // logical error: should never be here! (see above)
+    BOOST_ASSERT(false);
+}
+
+#elif !defined(BOOST_MSVC)
+
+// workaround implementation
+//
+// TODO: Determine the most efficient way to handle this -- as below? by
+// throwing? by recursive call to forced_return itself? etc.
+//
+
+template <typename T>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T)
+forced_return()
+{
+    // logical error: should never be here! (see above)
+    BOOST_ASSERT(false);
+
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) (*dummy)() = 0;
+    return dummy();
+}
+
+#else // defined(BOOST_MSVC)
+
+# pragma warning( push )
+# pragma warning( disable : 4702 ) // unreachable code
+// msvc-specific implementation
+//
+// Leverages __declspec(noreturn) for optimized implementation.
+//
+
+__declspec(noreturn)
+inline void forced_return_no_return() {};
+
+template <typename T>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T)
+forced_return()
+{
+    // logical error: should never be here! (see above)
+    BOOST_ASSERT(false);
+
+    forced_return_no_return();
+}
+
+# pragma warning( pop )
+
+#endif // BOOST_MSVC optimization
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/generic_result_type.hpp b/gatb-core/thirdparty/boost/variant/detail/generic_result_type.hpp
new file mode 100644
index 0000000..b3fbb19
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/generic_result_type.hpp
@@ -0,0 +1,88 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/generic_result_type.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP
+#define BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP
+
+#include "boost/config.hpp"
+
+//////////////////////////////////////////////////////////////////////////
+// (workaround) macro BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE
+//
+// On compilers with BOOST_NO_VOID_RETURNS, this macro provides a route
+// to a single syntax for dealing with template functions that may (but
+// not necessarily) return nothing (i.e. void).
+//
+// BOOST_VARIANT_AUX_RETURN_VOID provided for compilers w/ (erroneous?)
+// warnings about non-void functions not returning a value.
+//
+
+#if !defined(BOOST_NO_VOID_RETURNS)
+
+#define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \
+    T   \
+    /**/
+
+#define BOOST_VARIANT_AUX_RETURN_VOID  \
+    /**/
+
+#define BOOST_VARIANT_AUX_RETURN_VOID_TYPE \
+    void    \
+    /**/
+
+#else // defined(BOOST_NO_VOID_RETURNS)
+
+namespace boost {
+namespace detail { namespace variant {
+
+struct fake_return_void
+{
+    fake_return_void()
+    {
+    }
+
+    template <typename T>
+    fake_return_void(const T&)
+    {
+    }
+};
+
+template <typename T>
+struct no_void_returns_helper
+{
+    typedef T type;
+};
+
+template <>
+struct no_void_returns_helper<void>
+{
+    typedef fake_return_void type;
+};
+
+}} // namespace detail::variant
+} // namespace boost
+
+#define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \
+    BOOST_DEDUCED_TYPENAME                                           \
+        ::boost::detail::variant::no_void_returns_helper< T >::type  \
+    /**/
+
+#define BOOST_VARIANT_AUX_RETURN_VOID  \
+    return ::boost::detail::variant::fake_return_void()     \
+    /**/
+
+#define BOOST_VARIANT_AUX_RETURN_VOID_TYPE  \
+    ::boost::detail::variant::fake_return_void
+
+#endif // BOOST_NO_VOID_RETURNS workaround
+
+#endif // BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/has_result_type.hpp b/gatb-core/thirdparty/boost/variant/detail/has_result_type.hpp
new file mode 100644
index 0000000..8ec3d36
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/has_result_type.hpp
@@ -0,0 +1,37 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/has_result_type.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2014-2015 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+#define BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+
+#include "boost/config.hpp"
+#include "boost/type_traits/remove_reference.hpp"
+
+
+namespace boost { namespace detail { namespace variant {
+
+template <typename T >
+struct has_result_type {
+private:
+    typedef char                      yes;
+    typedef struct { char array[2]; } no;
+
+    template<typename C> static yes test(typename boost::remove_reference<typename C::result_type>::type*);
+    template<typename C> static no  test(...);
+
+public:
+    BOOST_STATIC_CONSTANT(bool, value = sizeof(test<T>(0)) == sizeof(yes));
+};
+
+}}} // namespace boost::detail::variant
+
+#endif // BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/hash_variant.hpp b/gatb-core/thirdparty/boost/variant/detail/hash_variant.hpp
new file mode 100644
index 0000000..958662e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/hash_variant.hpp
@@ -0,0 +1,47 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/hash_variant.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2011
+// Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_HASH_VARIANT_FUNCTION_HPP
+#define BOOST_HASH_VARIANT_FUNCTION_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant/variant_fwd.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/functional/hash_fwd.hpp>
+
+namespace boost {
+
+    namespace detail { namespace variant {
+        struct variant_hasher: public boost::static_visitor<std::size_t> {
+            template <class T>
+            std::size_t operator()(T const& val) const {
+                boost::hash<T> hasher;
+                return hasher(val);
+            }
+        };
+    }}
+
+    template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
+    std::size_t hash_value(variant< BOOST_VARIANT_ENUM_PARAMS(T) > const& val) {
+        std::size_t seed = boost::apply_visitor(detail::variant::variant_hasher(), val);
+        hash_combine(seed, val.which());
+        return seed;
+    }
+}
+
+#endif
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/initializer.hpp b/gatb-core/thirdparty/boost/variant/detail/initializer.hpp
new file mode 100644
index 0000000..f6f425e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/initializer.hpp
@@ -0,0 +1,249 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/initializer.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_INITIALIZER_HPP
+#define BOOST_VARIANT_DETAIL_INITIALIZER_HPP
+
+#include <new> // for placement new
+
+#include "boost/config.hpp"
+
+#include "boost/call_traits.hpp"
+#include "boost/detail/reference_content.hpp"
+#include "boost/variant/recursive_wrapper_fwd.hpp"
+#include "boost/variant/detail/move.hpp"
+
+#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+#   include "boost/mpl/aux_/value_wknd.hpp"
+#   include "boost/mpl/int.hpp"
+#   include "boost/mpl/iter_fold.hpp"
+#   include "boost/mpl/next.hpp"
+#   include "boost/mpl/deref.hpp"
+#   include "boost/mpl/pair.hpp"
+#   include "boost/mpl/protect.hpp"
+#else
+#   include "boost/variant/variant_fwd.hpp"
+#   include "boost/preprocessor/cat.hpp"
+#   include "boost/preprocessor/enum.hpp"
+#   include "boost/preprocessor/repeat.hpp"
+#endif
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) support to simulate standard overload resolution rules
+//
+// The below initializers allows variant to follow standard overload
+// resolution rules over the specified set of bounded types.
+//
+// On compilers where using declarations in class templates can correctly
+// avoid name hiding, use an optimal solution based on the variant's typelist.
+//
+// Otherwise, use a preprocessor workaround based on knowledge of the fixed
+// size of the variant's psuedo-variadic template parameter list.
+//
+
+#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+// (detail) quoted metafunction make_initializer_node
+//
+// Exposes a pair whose first type is a node in the initializer hierarchy.
+//
+struct make_initializer_node
+{
+    template <typename BaseIndexPair, typename Iterator>
+    struct apply
+    {
+    private: // helpers, for metafunction result (below)
+
+        typedef typename BaseIndexPair::first
+            base;
+        typedef typename BaseIndexPair::second
+            index;
+
+        class initializer_node
+            : public base
+        {
+        private: // helpers, for static functions (below)
+
+            typedef typename mpl::deref<Iterator>::type
+                recursive_enabled_T;
+            typedef typename unwrap_recursive<recursive_enabled_T>::type
+                public_T;
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+            typedef boost::is_reference<public_T> 
+                is_reference_content_t;
+
+            typedef typename boost::mpl::if_<is_reference_content_t, public_T, const public_T& >::type 
+                param_T;
+
+            template <class T> struct disable_overload{};
+
+            typedef typename boost::mpl::if_<is_reference_content_t, disable_overload<public_T>, public_T&& >::type 
+                param2_T;
+#else
+            typedef typename call_traits<public_T>::param_type
+                param_T;
+#endif
+
+        public: // static functions
+
+            using base::initialize;
+
+            static int initialize(void* dest, param_T operand)
+            {
+                typedef typename boost::detail::make_reference_content<
+                      recursive_enabled_T
+                    >::type internal_T;
+
+                new(dest) internal_T(operand);
+                return BOOST_MPL_AUX_VALUE_WKND(index)::value; // which
+            }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES            
+            static int initialize(void* dest, param2_T operand)
+            {
+                // This assert must newer trigger, because all the reference contents are
+                // handled by the initilize(void* dest, param_T operand) function above
+                BOOST_ASSERT(!is_reference_content_t::value);
+
+                typedef typename boost::mpl::if_<is_reference_content_t, param2_T, recursive_enabled_T>::type value_T;
+                new(dest) value_T( boost::detail::variant::move(operand) );
+                return BOOST_MPL_AUX_VALUE_WKND(index)::value; // which
+            }
+#endif
+        };
+
+        friend class initializer_node;
+
+    public: // metafunction result
+
+        typedef mpl::pair<
+              initializer_node
+            , typename mpl::next< index >::type
+            > type;
+
+    };
+};
+
+// (detail) class initializer_root
+//
+// Every level of the initializer hierarchy must expose the name
+// "initialize," so initializer_root provides a dummy function:
+//
+class initializer_root
+{
+public: // static functions
+
+    static void initialize();
+
+};
+
+#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+    // Obsolete. Remove.
+    #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_PARAMS \
+          BOOST_VARIANT_ENUM_PARAMS(typename recursive_enabled_T) \
+    /**/
+
+    // Obsolete. Remove.
+    #define BOOST_VARIANT_AUX_PP_INITIALIZER_DEFINE_PARAM_T(N) \
+        typedef typename unwrap_recursive< \
+              BOOST_PP_CAT(recursive_enabled_T,N) \
+            >::type BOOST_PP_CAT(public_T,N); \
+        typedef typename call_traits< \
+              BOOST_PP_CAT(public_T,N) \
+            >::param_type BOOST_PP_CAT(param_T,N); \
+    /**/
+
+template < BOOST_VARIANT_ENUM_PARAMS(typename recursive_enabled_T) >
+struct preprocessor_list_initializer
+{
+public: // static functions
+
+    #define BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION(z,N,_) \
+        typedef typename unwrap_recursive< \
+              BOOST_PP_CAT(recursive_enabled_T,N) \
+            >::type BOOST_PP_CAT(public_T,N); \
+        typedef typename call_traits< \
+              BOOST_PP_CAT(public_T,N) \
+            >::param_type BOOST_PP_CAT(param_T,N); \
+        static int initialize( \
+              void* dest \
+            , BOOST_PP_CAT(param_T,N) operand \
+            ) \
+        { \
+            typedef typename boost::detail::make_reference_content< \
+                  BOOST_PP_CAT(recursive_enabled_T,N) \
+                >::type internal_T; \
+            \
+            new(dest) internal_T(operand); \
+            return (N); /*which*/ \
+        } \
+        /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_LIMIT_TYPES
+        , BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION
+        , _
+        )
+
+    #undef BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION
+
+};
+
+#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
+
+}} // namespace detail::variant
+} // namespace boost
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_AUX_INITIALIZER_T
+//
+// Given both the variant's typelist and a basename for forming the list of
+// bounded types (i.e., T becomes T1, T2, etc.), exposes the initializer
+// most appropriate to the current compiler.
+//
+
+#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+#define BOOST_VARIANT_AUX_INITIALIZER_T( mpl_seq, typename_base ) \
+    ::boost::mpl::iter_fold< \
+          mpl_seq \
+        , ::boost::mpl::pair< \
+              ::boost::detail::variant::initializer_root \
+            , ::boost::mpl::int_<0> \
+            > \
+        , ::boost::mpl::protect< \
+              ::boost::detail::variant::make_initializer_node \
+            > \
+        >::type::first \
+    /**/
+
+#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+    // Obsolete. Remove.
+    #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_ARGS(typename_base) \
+          BOOST_VARIANT_ENUM_PARAMS(typename_base) \
+        /**/
+
+#define BOOST_VARIANT_AUX_INITIALIZER_T( mpl_seq, typename_base ) \
+    ::boost::detail::variant::preprocessor_list_initializer< \
+          BOOST_VARIANT_ENUM_PARAMS(typename_base) \
+        > \
+    /**/
+
+#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
+
+#endif // BOOST_VARIANT_DETAIL_INITIALIZER_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/make_variant_list.hpp b/gatb-core/thirdparty/boost/variant/detail/make_variant_list.hpp
new file mode 100644
index 0000000..37d725c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/make_variant_list.hpp
@@ -0,0 +1,73 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/make_variant_list.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003 Eric Friedman, Itay Maman
+// Copyright (c) 2013 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_MAKE_VARIANT_LIST_HPP
+#define BOOST_VARIANT_DETAIL_MAKE_VARIANT_LIST_HPP
+
+#include "boost/variant/variant_fwd.hpp"
+
+#include "boost/mpl/list.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/enum.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction make_variant_list
+//
+// Provides a MPL-compatible sequence with the specified non-void types
+// as arguments.
+//
+// Rationale: see class template convert_void (variant_fwd.hpp) and using-
+// declaration workaround (below).
+//
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+template < typename... T >
+struct make_variant_list
+{
+    typedef typename mpl::list< T... >::type type;
+};
+
+#else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
+struct make_variant_list
+{
+public: // metafunction result
+
+    // [Define a macro to convert any void(NN) tags to mpl::void...]
+#   define BOOST_VARIANT_AUX_CONVERT_VOID(z, N,_)  \
+        typename convert_void< BOOST_PP_CAT(T,N) >::type
+
+    // [...so that the specified types can be passed to mpl::list...]
+    typedef typename mpl::list< 
+          BOOST_PP_ENUM(
+              BOOST_VARIANT_LIMIT_TYPES
+            , BOOST_VARIANT_AUX_CONVERT_VOID
+            , _
+            )
+        >::type type;
+
+    // [...and, finally, the conversion macro can be undefined:]
+#   undef BOOST_VARIANT_AUX_CONVERT_VOID
+
+};
+
+#endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MAKE_VARIANT_LIST_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/move.hpp b/gatb-core/thirdparty/boost/variant/detail/move.hpp
new file mode 100644
index 0000000..0b12adf
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/move.hpp
@@ -0,0 +1,53 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/move.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+//  Copyright (c) 2002-2003 Eric Friedman
+//  Copyright (c) 2002 by Andrei Alexandrescu
+//  Copyright (c) 2013-2014 Antony Polukhin
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file derivative of MoJO. Much thanks to Andrei for his initial work.
+//  See <http://www.cuj.com/experts/2102/alexandr.htm> for information on MOJO.
+//  Re-issued here under the Boost Software License, with permission of the original
+//  author (Andrei Alexandrescu).
+
+
+#ifndef BOOST_VARIANT_DETAIL_MOVE_HPP
+#define BOOST_VARIANT_DETAIL_MOVE_HPP
+
+#include <iterator> // for iterator_traits
+#include <new> // for placement new
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/move/move.hpp"
+#include "boost/move/adl_move_swap.hpp"
+
+namespace boost { namespace detail { namespace variant {
+
+using boost::move;
+
+//////////////////////////////////////////////////////////////////////////
+// function template move_swap
+//
+// Swaps using Koenig lookup but falls back to move-swap for primitive
+// types and on non-conforming compilers.
+//
+
+template <typename T>
+inline void move_swap(T& lhs, T& rhs)
+{
+    ::boost::adl_move_swap(lhs, rhs);
+}
+
+}}} // namespace boost::detail::variant
+
+#endif // BOOST_VARIANT_DETAIL_MOVE_HPP
+
+
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp11_based.hpp b/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp11_based.hpp
new file mode 100644
index 0000000..370db83
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp11_based.hpp
@@ -0,0 +1,183 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via variadic templates and std::tuple
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant/detail/apply_visitor_unary.hpp>
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+
+#if defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_HDR_TUPLE)
+#   error "This file requires <tuple> and variadic templates support"
+#endif
+
+#include <tuple>
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    // Implementing some of the C++14 features in C++11
+    template <std::size_t... I> class index_sequence {};
+
+    template <std::size_t N, std::size_t... I> 
+    struct make_index_sequence 
+        : make_index_sequence<N-1, N-1, I...> 
+    {};
+    template <std::size_t... I> 
+    struct make_index_sequence<0, I...> 
+        : index_sequence<I...> 
+    {};
+
+    template <class... Types>
+    std::tuple<Types&...> forward_as_tuple_simple(Types&... args) BOOST_NOEXCEPT
+    {
+        return std::tuple<Types&...>(args...);
+    }
+
+    // Implementing some of the helper tuple methods
+    template <std::size_t... I, typename Tuple>
+    std::tuple<typename std::tuple_element<I + 1, Tuple>::type...> 
+        tuple_tail_impl(const Tuple& tpl, index_sequence<I...>)
+    {
+        return std::tuple<
+            typename std::tuple_element<I + 1, Tuple>::type...
+        > (std::get<I + 1>(tpl)...);
+    }
+
+    template <typename Head, typename... Tail>
+    std::tuple<Tail...> tuple_tail(const std::tuple<Head, Tail...>& tpl)
+    {
+        return tuple_tail_impl(tpl, make_index_sequence<sizeof...(Tail)>());
+    }
+
+
+
+    // Forward declaration
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer;
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    inline one_by_one_visitor_and_value_referer<Visitor, Visitables, Values... >
+        make_one_by_one_visitor_and_value_referer(
+            Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+        )
+    {
+        return one_by_one_visitor_and_value_referer<Visitor, Visitables, Values... > (
+            visitor, visitables, values
+        );
+    }
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+        Visitables                      visitables_;
+
+    public: // structors
+        one_by_one_visitor_and_value_referer(
+                    Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+            , visitables_(visitables)
+        {}
+
+    public: // visitor interfaces
+        typedef typename Visitor::result_type result_type;
+
+        template <typename Value>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(Value& value) const
+        {
+            return ::boost::apply_visitor(
+                make_one_by_one_visitor_and_value_referer(
+                    visitor_,
+                    tuple_tail(visitables_),
+                    std::tuple_cat(values_, std::tuple<Value&>(value))
+                )
+                , std::get<0>(visitables_) // getting Head element
+            );
+        }
+
+    private:
+        one_by_one_visitor_and_value_referer& operator=(const one_by_one_visitor_and_value_referer&);
+    };
+
+    template <typename Visitor, typename... Values>
+    class one_by_one_visitor_and_value_referer<Visitor, std::tuple<>, Values...>
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+
+    public:
+        one_by_one_visitor_and_value_referer(
+                    Visitor& visitor, std::tuple<> /*visitables*/, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+        {}
+
+        typedef typename Visitor::result_type result_type;
+
+        template <class Tuple, std::size_t... I>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) do_call(Tuple t, index_sequence<I...>) const {
+            return visitor_(std::get<I>(t)...);
+        }
+
+        template <typename Value>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(Value& value) const
+        {
+            return do_call(
+                std::tuple_cat(values_, std::tuple<Value&>(value)),
+                make_index_sequence<sizeof...(Values) + 1>()
+            );
+        }
+    };
+
+}} // namespace detail::variant
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+        apply_visitor(const Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+    
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+        apply_visitor(Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp14_based.hpp b/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp14_based.hpp
new file mode 100644
index 0000000..a2af328
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/multivisitors_cpp14_based.hpp
@@ -0,0 +1,142 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via variadic templates, std::tuple
+//  and decltype(auto)
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant/detail/multivisitors_cpp14_based.hpp>
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    // Forward declaration
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14;
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    inline one_by_one_visitor_and_value_referer_cpp14<Visitor, Visitables, Values... >
+        make_one_by_one_visitor_and_value_referer_cpp14(
+            Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+        )
+    {
+        return one_by_one_visitor_and_value_referer_cpp14<Visitor, Visitables, Values... > (
+            visitor, visitables, values
+        );
+    }
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+        Visitables                      visitables_;
+
+    public: // structors
+        one_by_one_visitor_and_value_referer_cpp14(
+                    Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+            , visitables_(visitables)
+        {}
+
+    public: // visitor interfaces
+        template <typename Value>
+        decltype(auto) operator()(Value& value) const
+        {
+            return ::boost::apply_visitor(
+                make_one_by_one_visitor_and_value_referer_cpp14(
+                    visitor_,
+                    tuple_tail(visitables_),
+                    std::tuple_cat(values_, std::tuple<Value&>(value))
+                )
+                , std::get<0>(visitables_) // getting Head element
+            );
+        }
+
+    private:
+        one_by_one_visitor_and_value_referer_cpp14& operator=(const one_by_one_visitor_and_value_referer_cpp14&);
+    };
+
+    template <typename Visitor, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14<Visitor, std::tuple<>, Values...>
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+
+    public:
+        one_by_one_visitor_and_value_referer_cpp14(
+                    Visitor& visitor, std::tuple<> /*visitables*/, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+        {}
+
+        template <class Tuple, std::size_t... I>
+        decltype(auto) do_call(Tuple t, index_sequence<I...>) const {
+            return visitor_(std::get<I>(t)...);
+        }
+
+        template <typename Value>
+        decltype(auto) operator()(Value& value) const
+        {
+            return do_call(
+                std::tuple_cat(values_, std::tuple<Value&>(value)),
+                make_index_sequence<sizeof...(Values) + 1>()
+            );
+        }
+    };
+
+}} // namespace detail::variant
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline decltype(auto) apply_visitor(const Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn,
+        typename boost::disable_if<
+            boost::detail::variant::has_result_type<Visitor>
+        >::type* = 0)
+    {
+        return boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer_cpp14(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+    
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline decltype(auto) apply_visitor(Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn,
+        typename boost::disable_if<
+            boost::detail::variant::has_result_type<Visitor>
+        >::type* = 0)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer_cpp14(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/multivisitors_preprocessor_based.hpp b/gatb-core/thirdparty/boost/variant/detail/multivisitors_preprocessor_based.hpp
new file mode 100644
index 0000000..746df18
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/multivisitors_preprocessor_based.hpp
@@ -0,0 +1,143 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via preprocessor magic
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/bind.hpp>
+
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+
+#ifndef BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS
+#   define BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS 4
+#endif
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    struct two_variables_holder {
+    private:
+        VisitorT&       visitor_;
+        Visitable1T&    visitable1_;
+        Visitable2T&    visitable2_;
+
+        // required to suppress warnings and ensure that we do not copy
+        // this visitor
+        two_variables_holder& operator=(const two_variables_holder&);
+
+    public:
+        typedef BOOST_DEDUCED_TYPENAME VisitorT::result_type result_type;
+
+        explicit two_variables_holder(VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2) BOOST_NOEXCEPT 
+            : visitor_(visitor)
+            , visitable1_(visitable1)
+            , visitable2_(visitable2)
+        {}
+
+#define BOOST_VARIANT_OPERATOR_BEG()                            \
+    return ::boost::apply_visitor(                              \
+    ::boost::bind<result_type>(boost::ref(visitor_), _1, _2     \
+    /**/
+
+#define BOOST_VARIANT_OPERATOR_END()                            \
+    ), visitable1_, visitable2_);                               \
+    /**/
+
+#define BOOST_VARANT_VISITORS_VARIABLES_PRINTER(z, n, data)     \
+    BOOST_PP_COMMA() boost::ref( BOOST_PP_CAT(vis, n) )         \
+    /**/
+
+#define BOOST_VARIANT_VISIT(z, n, data)                                                     \
+    template <BOOST_PP_ENUM_PARAMS(BOOST_PP_ADD(n, 1), class VisitableUnwrapped)>           \
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(                          \
+        BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ADD(n, 1), VisitableUnwrapped, & vis)          \
+    ) const                                                                                 \
+    {                                                                                       \
+        BOOST_VARIANT_OPERATOR_BEG()                                                        \
+        BOOST_PP_REPEAT(BOOST_PP_ADD(n, 1), BOOST_VARANT_VISITORS_VARIABLES_PRINTER, ~)     \
+        BOOST_VARIANT_OPERATOR_END()                                                        \
+    }                                                                                       \
+    /**/
+
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, ~)
+#undef BOOST_VARIANT_OPERATOR_BEG
+#undef BOOST_VARIANT_OPERATOR_END
+#undef BOOST_VARANT_VISITORS_VARIABLES_PRINTER
+#undef BOOST_VARIANT_VISIT
+
+    };
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    inline two_variables_holder<VisitorT, Visitable1T, Visitable2T> make_two_variables_holder(
+            VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2
+        ) BOOST_NOEXCEPT
+    {
+        return two_variables_holder<VisitorT, Visitable1T, Visitable2T>(visitor, visitable1, visitable2);
+    }
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    inline two_variables_holder<const VisitorT, Visitable1T, Visitable2T> make_two_variables_holder(
+            const VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2
+        ) BOOST_NOEXCEPT
+    {
+        return two_variables_holder<const VisitorT, Visitable1T, Visitable2T>(visitor, visitable1, visitable2);
+    }
+
+}} // namespace detail::variant
+
+#define BOOST_VARIANT_APPLY_VISITOR_BEG()                                               \
+    return ::boost::apply_visitor(                                                      \
+            boost::detail::variant::make_two_variables_holder(visitor, var0 , var1),    \
+            var2                                                                        \
+    /**/
+
+#define BOOST_VARIANT_APPLY_VISITOR_END()                       \
+    );                                                          \
+    /**/
+
+#define BOOST_VARANT_VISITORS_VARIABLES_PRINTER(z, n, data)     \
+    BOOST_PP_COMMA() BOOST_PP_CAT(var, BOOST_PP_ADD(n, 3))      \
+    /**/
+
+#define BOOST_VARIANT_VISIT(z, n, data)                                                                 \
+    template <class Visitor BOOST_PP_COMMA() BOOST_PP_ENUM_PARAMS(BOOST_PP_ADD(n, 3), class T)>         \
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(BOOST_DEDUCED_TYPENAME Visitor::result_type) apply_visitor( \
+        data BOOST_PP_COMMA() BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ADD(n, 3), T, & var)     \
+    )                                                                                                   \
+    {                                                                                                   \
+        BOOST_VARIANT_APPLY_VISITOR_BEG()                                                               \
+        BOOST_PP_REPEAT(n, BOOST_VARANT_VISITORS_VARIABLES_PRINTER, ~)                                  \
+        BOOST_VARIANT_APPLY_VISITOR_END()                                                               \
+    }                                                                                                   \
+    /**/
+
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, const Visitor& visitor)
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, Visitor& visitor)
+
+#undef BOOST_VARIANT_APPLY_VISITOR_BEG
+#undef BOOST_VARIANT_APPLY_VISITOR_END
+#undef BOOST_VARANT_VISITORS_VARIABLES_PRINTER
+#undef BOOST_VARIANT_VISIT
+    
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+
diff --git a/gatb-core/thirdparty/boost/variant/detail/over_sequence.hpp b/gatb-core/thirdparty/boost/variant/detail/over_sequence.hpp
new file mode 100644
index 0000000..ff20a01
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/over_sequence.hpp
@@ -0,0 +1,58 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/over_sequence.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Portions Copyright (C) 2002 David Abrahams
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP
+#define BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP
+
+#include "boost/mpl/aux_/config/ctps.hpp"
+
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class over_sequence
+//
+// Wrapper used to indicate bounded types for variant are from type sequence.
+//
+template <typename Types>
+struct over_sequence
+{
+    typedef Types type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction is_over_sequence (modeled on code by David Abrahams)
+//
+// Indicates whether the specified type is of form over_sequence<...> or not.
+//
+
+
+template <typename T>
+struct is_over_sequence
+    : mpl::false_
+{
+};
+
+template <typename Types>
+struct is_over_sequence< over_sequence<Types> >
+    : mpl::true_
+{
+};
+
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/substitute.hpp b/gatb-core/thirdparty/boost/variant/detail/substitute.hpp
new file mode 100644
index 0000000..d82720e
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/substitute.hpp
@@ -0,0 +1,253 @@
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+///// header body
+
+//-----------------------------------------------------------------------------
+// boost variant/detail/substitute.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
+#define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
+
+#include "boost/mpl/aux_/config/ctps.hpp"
+
+#include "boost/variant/detail/substitute_fwd.hpp"
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+#include "boost/mpl/aux_/lambda_arity_param.hpp"
+#include "boost/mpl/aux_/preprocessor/params.hpp"
+#include "boost/mpl/aux_/preprocessor/repeat.hpp"
+#include "boost/mpl/int_fwd.hpp"
+#include "boost/mpl/limits/arity.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/empty.hpp"
+#include "boost/preprocessor/arithmetic/inc.hpp"
+#include "boost/preprocessor/iterate.hpp"
+
+namespace boost {
+namespace detail { namespace variant {
+
+#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction substitute
+//
+// Substitutes one type for another in the given type expression.
+//
+
+//
+// primary template
+//
+template <
+      typename T, typename Dest, typename Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
+          typename Arity /* = ... (see substitute_fwd.hpp) */
+        )
+    >
+struct substitute
+{
+    typedef T type;
+};
+
+//
+// tag substitution specializations
+//
+
+#define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
+    template <typename Dest, typename Source> \
+    struct substitute< \
+          CV_ Source \
+        , Dest \
+        , Source \
+          BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
+        > \
+    { \
+        typedef CV_ Dest type; \
+    }; \
+    /**/
+
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
+
+#undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
+
+//
+// pointer specializations
+//
+#define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
+    template <typename T, typename Dest, typename Source> \
+    struct substitute< \
+          T * CV_ \
+        , Dest \
+        , Source \
+          BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
+        > \
+    { \
+        typedef typename substitute< \
+              T, Dest, Source \
+            >::type * CV_ type; \
+    }; \
+    /**/
+
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
+BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
+
+#undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
+
+//
+// reference specializations
+//
+template <typename T, typename Dest, typename Source>
+struct substitute<
+      T&
+    , Dest
+    , Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
+    >
+{
+    typedef typename substitute<
+          T, Dest, Source
+        >::type & type;
+};
+
+//
+// template expression (i.e., F<...>) specializations
+//
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+template <
+      template <typename...> class F
+    , typename... Ts
+    , typename Dest
+    , typename Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
+    >
+struct substitute<
+      F<Ts...>
+    , Dest
+    , Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
+    >
+{
+    typedef F<typename substitute<
+          Ts, Dest, Source
+        >::type...> type;
+};
+#endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+#define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \
+    typedef typename substitute< \
+          BOOST_PP_CAT(U,N), Dest, Source \
+        >::type BOOST_PP_CAT(u,N); \
+    /**/
+
+#define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \
+    BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \
+    /**/
+
+#define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
+#define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"
+#include BOOST_PP_ITERATE()
+
+#undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL
+#undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF
+
+#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
+
+///// iteration, depth == 1
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+#define i BOOST_PP_FRAME_ITERATION(1)
+
+#if i > 0
+
+//
+// template specializations
+//
+template <
+      template < BOOST_MPL_PP_PARAMS(i,typename P) > class T
+    , BOOST_MPL_PP_PARAMS(i,typename U)
+    , typename Dest
+    , typename Source
+    >
+struct substitute<
+      T< BOOST_MPL_PP_PARAMS(i,U) >
+    , Dest
+    , Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>)
+    >
+{
+private:
+    BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
+
+public:
+    typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;
+};
+
+//
+// function specializations
+//
+template <
+      typename R
+    , BOOST_MPL_PP_PARAMS(i,typename U)
+    , typename Dest
+    , typename Source
+    >
+struct substitute<
+      R (*)( BOOST_MPL_PP_PARAMS(i,U) )
+    , Dest
+    , Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
+    >
+{
+private:
+    typedef typename substitute< R, Dest, Source >::type r;
+    BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
+
+public:
+    typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );
+};
+
+#elif i == 0
+
+//
+// zero-arg function specialization
+//
+template <
+      typename R, typename Dest, typename Source
+    >
+struct substitute<
+      R (*)( void )
+    , Dest
+    , Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
+    >
+{
+private:
+    typedef typename substitute< R, Dest, Source >::type r;
+
+public:
+    typedef r (*type)( void );
+};
+
+#endif // i
+
+#undef i
+#endif // BOOST_PP_IS_ITERATING
diff --git a/gatb-core/thirdparty/boost/variant/detail/substitute_fwd.hpp b/gatb-core/thirdparty/boost/variant/detail/substitute_fwd.hpp
new file mode 100644
index 0000000..8084cb8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/substitute_fwd.hpp
@@ -0,0 +1,58 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/substitute_fwd.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_FWD_HPP
+#define BOOST_VARIANT_DETAIL_SUBSTITUTE_FWD_HPP
+
+#include "boost/mpl/aux_/lambda_arity_param.hpp"
+#include "boost/mpl/aux_/template_arity.hpp"
+#include "boost/mpl/int_fwd.hpp"
+
+
+///////////////////////////////////////////////////////////////////////////////
+// BOOST_VARIANT_DETAIL_NO_SUBSTITUTE
+//
+// Defined if 'substitute' is not implementable on the current compiler.
+//
+
+#include "boost/mpl/aux_/config/ctps.hpp"
+#include "boost/mpl/aux_/config/ttp.hpp"
+
+#if defined(BOOST_NO_TEMPLATE_TEMPLATE_PARAMETERS) \
+ && !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+#   define BOOST_VARIANT_DETAIL_NO_SUBSTITUTE
+#endif
+
+namespace boost {
+namespace detail { namespace variant {
+
+#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction substitute
+//
+// Substitutes one type for another in the given type expression.
+//
+template <
+      typename T, typename Dest, typename Source
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
+          typename Arity = mpl::int_< mpl::aux::template_arity<T>::value >
+        )
+    >
+struct substitute;
+
+#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+}} // namespace detail::variant
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/variant_io.hpp b/gatb-core/thirdparty/boost/variant/detail/variant_io.hpp
new file mode 100644
index 0000000..192a3de
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/variant_io.hpp
@@ -0,0 +1,95 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/variant_io.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
+#define BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
+
+#include <iosfwd> // for std::basic_ostream forward declare
+
+#include "boost/variant/variant_fwd.hpp"
+
+#include "boost/detail/templated_streams.hpp"
+#include "boost/variant/static_visitor.hpp"
+
+namespace boost {
+
+///////////////////////////////////////////////////////////////////////////////
+// function template operator<<
+//
+// Outputs the content of the given variant to the given ostream.
+//
+
+// forward declare (allows output of embedded variant< variant< ... >, ... >)
+template <
+      BOOST_TEMPLATED_STREAM_ARGS(E,T)
+    BOOST_TEMPLATED_STREAM_COMMA
+      BOOST_VARIANT_ENUM_PARAMS(typename U)
+    >
+inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
+      BOOST_TEMPLATED_STREAM(ostream, E,T)& out
+    , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs
+    );
+
+namespace detail { namespace variant {
+
+template <typename OStream>
+class printer
+    : public boost::static_visitor<>
+{
+private: // representation
+
+    OStream& out_;
+
+public: // structors
+
+    explicit printer(OStream& out)
+        : out_( out )
+    {
+    }
+
+public: // visitor interface
+
+    template <typename T>
+    void operator()(const T& operand) const
+    {
+        out_ << operand;
+    }
+
+private:
+    printer& operator=(const printer&);
+
+};
+
+}} // namespace detail::variant
+
+template <
+      BOOST_TEMPLATED_STREAM_ARGS(E,T)
+    BOOST_TEMPLATED_STREAM_COMMA
+      BOOST_VARIANT_ENUM_PARAMS(typename U)
+    >
+inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
+      BOOST_TEMPLATED_STREAM(ostream, E,T)& out
+    , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs
+    )
+{
+    detail::variant::printer<
+          BOOST_TEMPLATED_STREAM(ostream, E,T)
+        > visitor(out);
+
+    rhs.apply_visitor(visitor);
+
+    return out;
+}
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
diff --git a/gatb-core/thirdparty/boost/variant/detail/visitation_impl.hpp b/gatb-core/thirdparty/boost/variant/detail/visitation_impl.hpp
new file mode 100644
index 0000000..a36cae5
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/detail/visitation_impl.hpp
@@ -0,0 +1,277 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/visitation_impl.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_VISITATION_IMPL_HPP
+#define BOOST_VARIANT_DETAIL_VISITATION_IMPL_HPP
+
+#include "boost/config.hpp"
+
+#include "boost/variant/detail/backup_holder.hpp"
+#include "boost/variant/detail/cast_storage.hpp"
+#include "boost/variant/detail/forced_return.hpp"
+#include "boost/variant/detail/generic_result_type.hpp"
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+
+#include "boost/mpl/eval_if.hpp"
+#include "boost/mpl/bool.hpp"
+#include "boost/mpl/identity.hpp"
+#include "boost/mpl/int.hpp"
+#include "boost/mpl/next.hpp"
+#include "boost/mpl/deref.hpp"
+#include "boost/mpl/or.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/inc.hpp"
+#include "boost/preprocessor/repeat.hpp"
+#include "boost/type_traits/is_same.hpp"
+#include "boost/type_traits/has_nothrow_copy.hpp"
+#include "boost/type_traits/is_nothrow_move_constructible.hpp"
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) 
+# pragma warning (push) 
+# pragma warning (disable : 4702) //unreachable code 
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// BOOST_VARIANT_VISITATION_UNROLLING_LIMIT
+//
+// Unrolls variant's visitation mechanism to reduce template instantiation
+// and potentially increase runtime performance. (TODO: Investigate further.)
+//
+#if !defined(BOOST_VARIANT_VISITATION_UNROLLING_LIMIT)
+
+#ifndef BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+#   include "boost/mpl/limits/list.hpp"
+#   define BOOST_VARIANT_VISITATION_UNROLLING_LIMIT   \
+        BOOST_MPL_LIMIT_LIST_SIZE
+#else
+#   define BOOST_VARIANT_VISITATION_UNROLLING_LIMIT   \
+        BOOST_VARIANT_LIMIT_TYPES
+#endif
+
+#endif
+
+namespace boost {
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class apply_visitor_unrolled
+//
+// Tag type indicates when visitation_impl is unrolled.
+//
+struct apply_visitor_unrolled {};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class template visitation_impl_step
+//
+// "Never ending" iterator range facilitates visitation_impl unrolling.
+//
+
+
+template <typename Iter, typename LastIter>
+struct visitation_impl_step
+{
+    typedef typename mpl::deref<Iter>::type type;
+
+    typedef typename mpl::next<Iter>::type next_iter;
+    typedef visitation_impl_step<
+          next_iter, LastIter
+        > next;
+};
+
+template <typename LastIter>
+struct visitation_impl_step< LastIter,LastIter >
+{
+    typedef apply_visitor_unrolled type;
+    typedef visitation_impl_step next;
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) function template visitation_impl_invoke
+//
+// Invokes the given visitor on the specified type in the given storage.
+//
+
+template <typename Visitor, typename VoidPtrCV, typename T>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl_invoke_impl(
+      int, Visitor& visitor, VoidPtrCV storage, T*
+    , mpl::true_// never_uses_backup
+    )
+{
+    return visitor.internal_visit(
+          cast_storage<T>(storage), 1L
+        );
+}
+
+template <typename Visitor, typename VoidPtrCV, typename T>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl_invoke_impl(
+      int internal_which, Visitor& visitor, VoidPtrCV storage, T*
+    , mpl::false_// never_uses_backup
+    )
+{
+    if (internal_which >= 0)
+    {
+        return visitor.internal_visit(
+              cast_storage<T>(storage), 1L
+            );
+    }
+    else
+    {
+        return visitor.internal_visit(
+              cast_storage< backup_holder<T> >(storage), 1L
+            );
+    }
+}
+
+template <typename Visitor, typename VoidPtrCV, typename T, typename NoBackupFlag>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl_invoke(
+      int internal_which, Visitor& visitor, VoidPtrCV storage, T* t
+    , NoBackupFlag
+    , int
+    )
+{
+    typedef typename mpl::or_<
+          NoBackupFlag
+        , is_nothrow_move_constructible<T>
+        , has_nothrow_copy<T>
+        >::type never_uses_backup;
+
+    return (visitation_impl_invoke_impl)(
+          internal_which, visitor, storage, t
+        , never_uses_backup()
+        );
+}
+
+template <typename Visitor, typename VoidPtrCV, typename NBF>
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl_invoke(int, Visitor&, VoidPtrCV, apply_visitor_unrolled*, NBF, long)
+{
+    // should never be here at runtime!
+    typedef typename Visitor::result_type result_type;
+    return ::boost::detail::variant::forced_return< result_type >();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) function template visitation_impl
+//
+// Invokes the given visitor on the type in the given variant storage.
+//
+
+template <
+      typename W, typename S
+    , typename Visitor, typename VPCV
+    , typename NBF
+    >
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl(
+      int, int, Visitor&, VPCV
+    , mpl::true_ // is_apply_visitor_unrolled
+    , NBF, W* = 0, S* = 0
+    )
+{
+    // should never be here at runtime!
+    typedef typename Visitor::result_type result_type;
+    return ::boost::detail::variant::forced_return< result_type >();
+}
+
+template <
+      typename Which, typename step0
+    , typename Visitor, typename VoidPtrCV
+    , typename NoBackupFlag
+    >
+inline
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+visitation_impl(
+      const int internal_which, const int logical_which
+    , Visitor& visitor, VoidPtrCV storage
+    , mpl::false_ // is_apply_visitor_unrolled
+    , NoBackupFlag no_backup_flag
+    , Which* = 0, step0* = 0
+    )
+{
+    // Typedef apply_visitor_unrolled steps and associated types...
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_TYPEDEF(z, N, _) \
+    typedef typename BOOST_PP_CAT(step,N)::type BOOST_PP_CAT(T,N); \
+    typedef typename BOOST_PP_CAT(step,N)::next \
+        BOOST_PP_CAT(step, BOOST_PP_INC(N)); \
+    /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_VISITATION_UNROLLING_LIMIT
+        , BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_TYPEDEF
+        , _
+        )
+
+#   undef BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_TYPEDEF
+
+    // ...switch on the target which-index value...
+    switch (logical_which)
+    {
+
+    // ...applying the appropriate case:
+#   define BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE(z, N, _) \
+    case (Which::value + (N)): \
+        return (visitation_impl_invoke)( \
+              internal_which, visitor, storage \
+            , static_cast<BOOST_PP_CAT(T,N)*>(0) \
+            , no_backup_flag, 1L \
+            ); \
+    /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_VISITATION_UNROLLING_LIMIT
+        , BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE
+        , _
+        )
+
+#   undef BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE
+
+    default: break;
+    }
+
+    // If not handled in this iteration, continue unrolling:
+    typedef mpl::int_<
+          Which::value + (BOOST_VARIANT_VISITATION_UNROLLING_LIMIT)
+        > next_which;
+
+    typedef BOOST_PP_CAT(step, BOOST_VARIANT_VISITATION_UNROLLING_LIMIT)
+        next_step;
+
+    typedef typename next_step::type next_type;
+    typedef typename is_same< next_type,apply_visitor_unrolled >::type
+        is_apply_visitor_unrolled;
+
+    return visitation_impl(
+          internal_which, logical_which
+        , visitor, storage
+        , is_apply_visitor_unrolled()
+        , no_backup_flag
+        , static_cast<next_which*>(0), static_cast<next_step*>(0)
+        );
+}
+
+}} // namespace detail::variant
+} // namespace boost
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)  
+# pragma warning(pop)  
+#endif 
+
+#endif // BOOST_VARIANT_DETAIL_VISITATION_IMPL_HPP
diff --git a/gatb-core/thirdparty/boost/variant/get.hpp b/gatb-core/thirdparty/boost/variant/get.hpp
new file mode 100644
index 0000000..3188a65
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/get.hpp
@@ -0,0 +1,305 @@
+//-----------------------------------------------------------------------------
+// boost variant/get.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003 Eric Friedman, Itay Maman
+// Copyright (c) 2014 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_GET_HPP
+#define BOOST_VARIANT_GET_HPP
+
+#include <exception>
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/static_assert.hpp"
+#include "boost/throw_exception.hpp"
+#include "boost/utility/addressof.hpp"
+#include "boost/variant/variant_fwd.hpp"
+#include "boost/variant/detail/element_index.hpp"
+
+#include "boost/type_traits/add_reference.hpp"
+#include "boost/type_traits/add_pointer.hpp"
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class bad_get
+//
+// The exception thrown in the event of a failed get of a value.
+//
+class BOOST_SYMBOL_VISIBLE bad_get
+    : public std::exception
+{
+public: // std::exception implementation
+
+    virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+    {
+        return "boost::bad_get: "
+               "failed value get using boost::get";
+    }
+
+};
+
+//////////////////////////////////////////////////////////////////////////
+// function template get<T>
+//
+// Retrieves content of given variant object if content is of type T.
+// Otherwise: pointer ver. returns 0; reference ver. throws bad_get.
+//
+
+namespace detail { namespace variant {
+
+// (detail) class template get_visitor
+//
+// Generic static visitor that: if the value is of the specified type,
+// returns a pointer to the value it visits; else a null pointer.
+//
+template <typename T>
+struct get_visitor
+{
+private: // private typedefs
+
+    typedef typename add_pointer<T>::type pointer;
+    typedef typename add_reference<T>::type reference;
+
+public: // visitor typedefs
+
+    typedef pointer result_type;
+
+public: // visitor interfaces
+
+    pointer operator()(reference operand) const BOOST_NOEXCEPT
+    {
+        return boost::addressof(operand);
+    }
+
+    template <typename U>
+    pointer operator()(const U&) const BOOST_NOEXCEPT
+    {
+        return static_cast<pointer>(0);
+    }
+};
+
+}} // namespace detail::variant
+
+#ifndef BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE
+#   if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)
+#   else
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)  \
+        , t* = 0
+#   endif
+#endif
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// relaxed_get<U>(variant) methods
+//
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_visitor<U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_visitor<const U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    U_ptr result = relaxed_get<U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_get());
+    return *result;
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    U_ptr result = relaxed_get<const U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_get());
+    return *result;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// strict_get<U>(variant) methods
+//
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::get<U>(boost::variant<T...>*) will always return NULL"
+    );
+
+    return relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, const U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::get<U>(const boost::variant<T...>*) will always return NULL"
+    );
+
+    return relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::get<U>(boost::variant<T...>&) will always throw boost::bad_get exception"
+    );
+
+    return relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, const U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::get<U>(const boost::variant<T...>&) will always throw boost::bad_get exception"
+    );
+
+    return relaxed_get<U>(operand);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// get<U>(variant) methods
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return relaxed_get<U>(operand);
+#else
+    return strict_get<U>(operand);
+#endif
+
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return relaxed_get<U>(operand);
+#else
+    return strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return relaxed_get<U>(operand);
+#else
+    return strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return relaxed_get<U>(operand);
+#else
+    return strict_get<U>(operand);
+#endif
+}
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_GET_HPP
diff --git a/gatb-core/thirdparty/boost/variant/multivisitors.hpp b/gatb-core/thirdparty/boost/variant/multivisitors.hpp
new file mode 100644
index 0000000..9e24950
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/multivisitors.hpp
@@ -0,0 +1,32 @@
+//  Boost.Varaint
+//  Multivisitors defined here 
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_MULTIVISITORS_HPP
+#define BOOST_VARIANT_MULTIVISITORS_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_HDR_TUPLE)
+#   include <boost/variant/detail/multivisitors_cpp11_based.hpp>
+#   if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+#       include <boost/variant/detail/multivisitors_cpp14_based.hpp>
+#   endif
+#else
+#   include <boost/variant/detail/multivisitors_preprocessor_based.hpp>
+#endif
+
+#endif // BOOST_VARIANT_MULTIVISITORS_HPP
+
diff --git a/gatb-core/thirdparty/boost/variant/polymorphic_get.hpp b/gatb-core/thirdparty/boost/variant/polymorphic_get.hpp
new file mode 100644
index 0000000..05d9b0d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/polymorphic_get.hpp
@@ -0,0 +1,344 @@
+//-----------------------------------------------------------------------------
+// boost variant/polymorphic_get.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2013-2015 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_POLYMORPHIC_GET_HPP
+#define BOOST_VARIANT_POLYMORPHIC_GET_HPP
+
+#include <exception>
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/static_assert.hpp"
+#include "boost/throw_exception.hpp"
+#include "boost/utility/addressof.hpp"
+#include "boost/variant/variant_fwd.hpp"
+#include "boost/variant/get.hpp"
+
+#include "boost/type_traits/add_reference.hpp"
+#include "boost/type_traits/add_pointer.hpp"
+#include "boost/type_traits/is_base_of.hpp"
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class bad_polymorphic_get
+//
+// The exception thrown in the event of a failed get of a value.
+//
+class BOOST_SYMBOL_VISIBLE bad_polymorphic_get
+    : public bad_get
+{
+public: // std::exception implementation
+
+    virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+    {
+        return "boost::bad_polymorphic_get: "
+               "failed value get using boost::polymorphic_get";
+    }
+
+};
+
+//////////////////////////////////////////////////////////////////////////
+// function template get<T>
+//
+// Retrieves content of given variant object if content is of type T.
+// Otherwise: pointer ver. returns 0; reference ver. throws bad_get.
+//
+
+namespace detail { namespace variant {
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic metafunctions to detect index of a value
+//
+
+template <class Types, class T>
+struct element_polymorphic_iterator_impl :
+    boost::mpl::find_if<
+        Types,
+        boost::mpl::or_<
+            variant_element_functor<boost::mpl::_1, T>,
+            variant_element_functor<boost::mpl::_1, typename boost::remove_cv<T>::type >,
+            boost::is_base_of<T, boost::mpl::_1>
+        >
+    >
+{};
+
+template <class Variant, class T>
+struct holds_element_polymorphic :
+    boost::mpl::not_<
+        boost::is_same<
+            typename boost::mpl::end<typename Variant::types>::type,
+            typename element_polymorphic_iterator_impl<typename Variant::types, typename boost::remove_reference<T>::type >::type
+        >
+    >
+{};
+
+// (detail) class template get_polymorphic_visitor
+//
+// Generic static visitor that: if the value is of the specified
+// type or of a type derived from specified, returns a pointer
+// to the value it visits; else a null pointer.
+//
+template <typename Base>
+struct get_polymorphic_visitor
+{
+private: // private typedefs
+    typedef get_polymorphic_visitor<Base>       this_type;
+    typedef typename add_pointer<Base>::type    pointer;
+    typedef typename add_reference<Base>::type  reference;
+
+    pointer get(reference operand, boost::true_type) const BOOST_NOEXCEPT
+    {
+        return boost::addressof(operand);
+    }
+
+    template <class T>
+    pointer get(T&, boost::false_type) const BOOST_NOEXCEPT
+    {
+        return static_cast<pointer>(0);
+    }
+
+public: // visitor interfaces
+    typedef pointer result_type;
+
+    template <typename U>
+    pointer operator()(U& operand) const BOOST_NOEXCEPT
+    {
+        typedef boost::integral_constant<
+            bool,
+            boost::mpl::or_<
+                boost::is_base_of<Base, U>,
+                boost::is_same<Base, U>,
+                boost::is_same<typename boost::remove_cv<Base>::type, U >
+            >::value
+        > tag_t;
+
+        return this_type::get(operand, tag_t());
+    }
+};
+
+}} // namespace detail::variant
+
+#ifndef BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE
+#   if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)
+#   else
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)  \
+        , t* = 0
+#   endif
+#endif
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_relaxed_get
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_polymorphic_visitor<U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_polymorphic_visitor<const U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    U_ptr result = polymorphic_relaxed_get<U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_polymorphic_get());
+    return *result;
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    U_ptr result = polymorphic_relaxed_get<const U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_polymorphic_get());
+    return *result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_strict_get
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(boost::variant<T...>*) will always return NULL"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(const boost::variant<T...>*) will always return NULL"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(boost::variant<T...>&) will always throw boost::bad_polymorphic_get exception"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(const boost::variant<T...>&) will always throw boost::bad_polymorphic_get exception"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_get<U>(variant) methods
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+} // namespace boost
+
+#endif // BOOST_VARIANT_POLYMORPHIC_GET_HPP
diff --git a/gatb-core/thirdparty/boost/variant/recursive_variant.hpp b/gatb-core/thirdparty/boost/variant/recursive_variant.hpp
new file mode 100644
index 0000000..cb5eb4c
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/recursive_variant.hpp
@@ -0,0 +1,209 @@
+//-----------------------------------------------------------------------------
+// boost variant/recursive_variant.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003 Eric Friedman
+// Copyright (c) 2013 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_RECURSIVE_VARIANT_HPP
+#define BOOST_VARIANT_RECURSIVE_VARIANT_HPP
+
+#include "boost/variant/variant_fwd.hpp"
+#include "boost/variant/detail/enable_recursive.hpp"
+#include "boost/variant/detail/substitute_fwd.hpp"
+#include "boost/variant/detail/make_variant_list.hpp"
+#include "boost/variant/detail/over_sequence.hpp"
+
+#include "boost/mpl/aux_/lambda_arity_param.hpp"
+
+#include "boost/mpl/equal.hpp"
+#include "boost/mpl/eval_if.hpp"
+#include "boost/mpl/identity.hpp"
+#include "boost/mpl/if.hpp"
+#include "boost/mpl/protect.hpp"
+#include "boost/mpl/transform.hpp"
+#include "boost/type_traits/is_same.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/repeat.hpp"
+
+#include "boost/mpl/bool.hpp"
+#include "boost/mpl/is_sequence.hpp"
+#include "boost/variant/variant.hpp"
+
+namespace boost {
+
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction specialization substitute
+//
+// Handles embedded variant types when substituting for recursive_variant_.
+//
+
+#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+template <
+      BOOST_VARIANT_ENUM_PARAMS(typename T)
+    , typename RecursiveVariant
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
+    >
+struct substitute<
+      ::boost::variant<
+          recursive_flag< T0 >
+        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+        >
+    , RecursiveVariant
+    , ::boost::recursive_variant_
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
+    >
+{
+    typedef ::boost::variant<
+          recursive_flag< T0 >
+        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+        > type;
+};
+
+template <
+      BOOST_VARIANT_ENUM_PARAMS(typename T)
+    , typename RecursiveVariant
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
+    >
+struct substitute<
+      ::boost::variant<
+          ::boost::detail::variant::over_sequence< T0 >
+        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+        >
+    , RecursiveVariant
+    , ::boost::recursive_variant_
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
+    >
+{
+private:
+
+    typedef T0 initial_types;
+
+    typedef typename mpl::transform<
+          initial_types
+        , mpl::protect< quoted_enable_recursive<RecursiveVariant,mpl::true_> >
+        >::type types;
+
+public:
+
+    typedef typename mpl::if_<
+          mpl::equal<initial_types, types, ::boost::is_same<mpl::_1, mpl::_2> >
+        , ::boost::variant<
+              ::boost::detail::variant::over_sequence< T0 >
+            , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+            >
+        , ::boost::variant< over_sequence<types> >
+        >::type type;
+};
+
+template <
+      BOOST_VARIANT_ENUM_PARAMS(typename T)
+    , typename RecursiveVariant
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
+    >
+struct substitute<
+      ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >
+    , RecursiveVariant
+    , ::boost::recursive_variant_
+      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
+    >
+{
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+    
+    typedef ::boost::variant<
+        typename enable_recursive<   
+              T0              
+            , RecursiveVariant               
+            , mpl::true_                     
+        >::type,
+        typename enable_recursive<   
+              TN              
+            , RecursiveVariant               
+            , mpl::true_                     
+        >::type...  
+    > type;
+
+#else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+private: // helpers, for metafunction result (below)
+
+    #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS(z,N,_)  \
+        typedef typename enable_recursive<   \
+              BOOST_PP_CAT(T,N)              \
+            , RecursiveVariant               \
+            , mpl::true_                     \
+            >::type BOOST_PP_CAT(wknd_T,N);  \
+        /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_LIMIT_TYPES
+        , BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
+        , _
+        )
+
+    #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
+
+public: // metafunction result
+
+    typedef ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(wknd_T) > type;
+#endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
+};
+
+#else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+//
+// no specializations: embedded variants unsupported on these compilers!
+//
+
+#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
+
+}} // namespace detail::variant
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_recursive_variant
+//
+// See docs and boost/variant/variant_fwd.hpp for more information.
+//
+template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
+struct make_recursive_variant
+{
+public: // metafunction result
+
+    typedef boost::variant<
+          detail::variant::recursive_flag< T0 >
+        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+        > type;
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_recursive_variant_over
+//
+// See docs and boost/variant/variant_fwd.hpp for more information.
+//
+template <typename Types>
+struct make_recursive_variant_over
+{
+private: // precondition assertions
+
+    BOOST_STATIC_ASSERT(( ::boost::mpl::is_sequence<Types>::value ));
+
+public: // metafunction result
+
+    typedef typename make_recursive_variant<
+          detail::variant::over_sequence< Types >
+        >::type type;
+
+};
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_RECURSIVE_VARIANT_HPP
diff --git a/gatb-core/thirdparty/boost/variant/recursive_wrapper.hpp b/gatb-core/thirdparty/boost/variant/recursive_wrapper.hpp
new file mode 100644
index 0000000..f3b88d8
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/recursive_wrapper.hpp
@@ -0,0 +1,158 @@
+//-----------------------------------------------------------------------------
+// boost variant/recursive_wrapper.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_RECURSIVE_WRAPPER_HPP
+#define BOOST_VARIANT_RECURSIVE_WRAPPER_HPP
+
+#include "boost/variant/recursive_wrapper_fwd.hpp"
+#include "boost/variant/detail/move.hpp"
+#include "boost/checked_delete.hpp"
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class template recursive_wrapper
+//
+// See docs and recursive_wrapper_fwd.hpp for more information.
+//
+
+template <typename T>
+class recursive_wrapper
+{
+public: // typedefs
+
+    typedef T type;
+
+private: // representation
+
+    T* p_;
+
+public: // structors
+
+    ~recursive_wrapper();
+    recursive_wrapper();
+
+    recursive_wrapper(const recursive_wrapper& operand);
+    recursive_wrapper(const T& operand);
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 
+    recursive_wrapper(recursive_wrapper&& operand);
+    recursive_wrapper(T&& operand);
+#endif
+
+private: // helpers, for modifiers (below)
+
+    void assign(const T& rhs);
+
+public: // modifiers
+
+    recursive_wrapper& operator=(const recursive_wrapper& rhs)
+    {
+        assign( rhs.get() );
+        return *this;
+    }
+
+    recursive_wrapper& operator=(const T& rhs)
+    {
+        assign( rhs );
+        return *this;
+    }
+
+    void swap(recursive_wrapper& operand) BOOST_NOEXCEPT
+    {
+        T* temp = operand.p_;
+        operand.p_ = p_;
+        p_ = temp;
+    }
+
+    
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 
+    recursive_wrapper& operator=(recursive_wrapper&& rhs) BOOST_NOEXCEPT
+    {
+        swap(rhs);
+        return *this;
+    }
+
+    recursive_wrapper& operator=(T&& rhs)
+    {
+        get() = detail::variant::move(rhs);
+        return *this;
+    }
+#endif
+
+public: // queries
+
+    T& get() { return *get_pointer(); }
+    const T& get() const { return *get_pointer(); }
+
+    T* get_pointer() { return p_; }
+    const T* get_pointer() const { return p_; }
+
+};
+
+template <typename T>
+recursive_wrapper<T>::~recursive_wrapper()
+{
+    boost::checked_delete(p_);
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper()
+    : p_(new T)
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(const recursive_wrapper& operand)
+    : p_(new T( operand.get() ))
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(const T& operand)
+    : p_(new T(operand))
+{
+}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(recursive_wrapper&& operand)
+    : p_(new T( detail::variant::move(operand.get()) ))
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(T&& operand)
+    : p_(new T( detail::variant::move(operand) ))
+{
+}
+#endif
+
+template <typename T>
+void recursive_wrapper<T>::assign(const T& rhs)
+{
+    this->get() = rhs;
+}
+
+// function template swap
+//
+// Swaps two recursive_wrapper<T> objects of the same type T.
+//
+template <typename T>
+inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) BOOST_NOEXCEPT
+{
+    lhs.swap(rhs);
+}
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_RECURSIVE_WRAPPER_HPP
diff --git a/gatb-core/thirdparty/boost/variant/recursive_wrapper_fwd.hpp b/gatb-core/thirdparty/boost/variant/recursive_wrapper_fwd.hpp
new file mode 100644
index 0000000..b46774d
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/recursive_wrapper_fwd.hpp
@@ -0,0 +1,99 @@
+//-----------------------------------------------------------------------------
+// boost variant/recursive_wrapper_fwd.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002
+// Eric Friedman, Itay Maman
+//
+// Portions Copyright (C) 2002 David Abrahams
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
+#define BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
+
+#include "boost/mpl/aux_/config/ctps.hpp"
+#include "boost/mpl/aux_/lambda_support.hpp"
+#include <boost/type_traits/integral_constant.hpp>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class template recursive_wrapper
+//
+// Enables recursive types in templates by breaking cyclic dependencies.
+//
+// For example:
+//
+//   class my;
+//
+//   typedef variant< int, recursive_wrapper<my> > var;
+//
+//   class my {
+//     var var_;
+//     ...
+//   };
+//
+template <typename T> class recursive_wrapper;
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction is_recursive_wrapper (modeled on code by David Abrahams)
+//
+// True iff specified type matches recursive_wrapper<T>.
+//
+
+namespace detail {
+
+
+template <typename T>
+struct is_recursive_wrapper_impl
+    : mpl::false_
+{
+};
+
+template <typename T>
+struct is_recursive_wrapper_impl< recursive_wrapper<T> >
+    : mpl::true_
+{
+};
+
+
+} // namespace detail
+
+template< typename T > struct is_recursive_wrapper
+    : public ::boost::integral_constant<bool,(::boost::detail::is_recursive_wrapper_impl<T>::value)>
+{
+public:
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_recursive_wrapper,(T))
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction unwrap_recursive
+//
+// If specified type T matches recursive_wrapper<U>, then U; else T.
+//
+
+
+template <typename T>
+struct unwrap_recursive
+{
+    typedef T type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,unwrap_recursive,(T))
+};
+
+template <typename T>
+struct unwrap_recursive< recursive_wrapper<T> >
+{
+    typedef T type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,unwrap_recursive,(T))
+};
+
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/variant/static_visitor.hpp b/gatb-core/thirdparty/boost/variant/static_visitor.hpp
new file mode 100644
index 0000000..27f5674
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/static_visitor.hpp
@@ -0,0 +1,95 @@
+//-----------------------------------------------------------------------------
+// boost variant/static_visitor.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_STATIC_VISITOR_HPP
+#define BOOST_VARIANT_STATIC_VISITOR_HPP
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+
+#include "boost/mpl/if.hpp"
+#include "boost/type_traits/is_base_and_derived.hpp"
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class template static_visitor
+//
+// An empty base class that typedefs the return type of a deriving static
+// visitor. The class is analogous to std::unary_function in this role.
+//
+
+namespace detail {
+
+    struct is_static_visitor_tag { };
+
+    typedef void static_visitor_default_return;
+
+} // namespace detail
+
+template <typename R = ::boost::detail::static_visitor_default_return>
+class static_visitor
+    : public detail::is_static_visitor_tag
+{
+public: // typedefs
+
+    typedef R result_type;
+
+protected: // for use as base class only
+#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
+    static_visitor() = default;
+    ~static_visitor() = default;
+#else
+    static_visitor()  BOOST_NOEXCEPT { }
+    ~static_visitor()  BOOST_NOEXCEPT { }
+#endif
+};
+
+//////////////////////////////////////////////////////////////////////////
+// metafunction is_static_visitor
+//
+// Value metafunction indicates whether the specified type derives from
+// static_visitor<...>.
+//
+// NOTE #1: This metafunction does NOT check whether the specified type
+//  fulfills the requirements of the StaticVisitor concept.
+//
+// NOTE #2: This template never needs to be specialized!
+//
+
+namespace detail {
+
+template <typename T>
+struct is_static_visitor_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value = 
+        (::boost::is_base_and_derived< 
+            detail::is_static_visitor_tag,
+            T
+        >::value));
+};
+
+} // namespace detail
+
+template< typename T > struct is_static_visitor
+	: public ::boost::integral_constant<bool,(::boost::detail::is_static_visitor_impl<T>::value)>
+{
+public:
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_static_visitor,(T))
+};
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_STATIC_VISITOR_HPP
diff --git a/gatb-core/thirdparty/boost/variant/variant.hpp b/gatb-core/thirdparty/boost/variant/variant.hpp
new file mode 100644
index 0000000..c4857ed
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/variant.hpp
@@ -0,0 +1,2415 @@
+//-----------------------------------------------------------------------------
+// boost variant/variant.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003 Eric Friedman, Itay Maman
+// Copyright (c) 2012-2014 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Thanks to Adam Romanek for providing patches for exception-disabled env.
+
+#ifndef BOOST_VARIANT_VARIANT_HPP
+#define BOOST_VARIANT_VARIANT_HPP
+
+#include <cstddef> // for std::size_t
+#include <new> // for placement new
+
+#include "boost/type_index.hpp"
+
+#include "boost/variant/detail/config.hpp"
+#include "boost/mpl/aux_/value_wknd.hpp"
+
+#include "boost/variant/variant_fwd.hpp"
+#include "boost/variant/detail/backup_holder.hpp"
+#include "boost/variant/detail/enable_recursive_fwd.hpp"
+#include "boost/variant/detail/forced_return.hpp"
+#include "boost/variant/detail/initializer.hpp"
+#include "boost/variant/detail/make_variant_list.hpp"
+#include "boost/variant/detail/over_sequence.hpp"
+#include "boost/variant/detail/visitation_impl.hpp"
+#include "boost/variant/detail/hash_variant.hpp"
+
+#include "boost/variant/detail/generic_result_type.hpp"
+#include "boost/variant/detail/move.hpp"
+
+#include "boost/detail/no_exceptions_support.hpp"
+#include "boost/detail/reference_content.hpp"
+#include "boost/aligned_storage.hpp"
+#include "boost/blank.hpp"
+#include "boost/math/common_factor_ct.hpp"
+#include "boost/static_assert.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/repeat.hpp"
+#include "boost/type_traits/alignment_of.hpp"
+#include "boost/type_traits/add_const.hpp"
+#include "boost/type_traits/has_nothrow_constructor.hpp"
+#include "boost/type_traits/has_nothrow_copy.hpp"
+#include "boost/type_traits/is_nothrow_move_assignable.hpp"
+#include "boost/type_traits/is_nothrow_move_constructible.hpp"
+#include "boost/type_traits/is_const.hpp"
+#include "boost/type_traits/is_same.hpp"
+#include "boost/type_traits/is_rvalue_reference.hpp"
+#include "boost/utility/enable_if.hpp"
+#include "boost/utility/declval.hpp"
+#include "boost/variant/recursive_wrapper_fwd.hpp"
+#include "boost/variant/static_visitor.hpp"
+
+#include "boost/mpl/assert.hpp"
+#include "boost/mpl/begin_end.hpp"
+#include "boost/mpl/bool.hpp"
+#include "boost/mpl/deref.hpp"
+#include "boost/mpl/empty.hpp"
+#include "boost/mpl/eval_if.hpp"
+#include "boost/mpl/find_if.hpp"
+#include "boost/mpl/fold.hpp"
+#include "boost/mpl/front.hpp"
+#include "boost/mpl/identity.hpp"
+#include "boost/mpl/if.hpp"
+#include "boost/mpl/int.hpp"
+#include "boost/mpl/is_sequence.hpp"
+#include "boost/mpl/iterator_range.hpp"
+#include "boost/mpl/iter_fold_if.hpp"
+#include "boost/mpl/logical.hpp"
+#include "boost/mpl/max_element.hpp"
+#include "boost/mpl/next.hpp"
+#include "boost/mpl/not.hpp"
+#include "boost/mpl/pair.hpp"
+#include "boost/mpl/protect.hpp"
+#include "boost/mpl/push_front.hpp"
+#include "boost/mpl/same_as.hpp"
+#include "boost/mpl/size_t.hpp"
+#include "boost/mpl/sizeof.hpp"
+#include "boost/mpl/transform.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+// Implementation Macros:
+//
+// BOOST_VARIANT_VISITATION_UNROLLING_LIMIT
+//   Defined in boost/variant/detail/visitation_impl.hpp.
+//
+// BOOST_VARIANT_MINIMIZE_SIZE
+//   When #defined, implementation employs all known means to minimize the
+//   size of variant obje   cts. However, often unsuccessful due to alignment
+//   issues, and potentially harmful to runtime speed, so not enabled by
+//   default. (TODO: Investigate further.)
+
+#if defined(BOOST_VARIANT_MINIMIZE_SIZE)
+#   include <climits> // for SCHAR_MAX
+#   include "boost/mpl/eval_if.hpp"
+#   include "boost/mpl/equal_to.hpp"
+#   include "boost/mpl/identity.hpp"
+#   include "boost/mpl/int.hpp"
+#   include "boost/mpl/if.hpp"
+#   include "boost/mpl/less.hpp"
+#   include "boost/mpl/long.hpp"
+#   include "boost/mpl/O1_size.hpp"
+#endif
+
+
+namespace boost {
+
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction max_value
+//
+// Finds the maximum value of the unary metafunction F over Sequence.
+//
+template <typename Sequence, typename F>
+struct max_value
+{
+private: // helpers, for metafunction result (below)
+
+    typedef typename mpl::transform1<Sequence, F>::type transformed_;
+    typedef typename mpl::max_element<transformed_
+          
+        >::type max_it;
+
+public: // metafunction result
+
+    typedef typename mpl::deref<max_it>::type
+        type;
+
+};
+
+struct add_alignment
+{
+    template <typename State, typename Item>
+    struct apply
+        : mpl::size_t<
+              ::boost::math::static_lcm<
+                  BOOST_MPL_AUX_VALUE_WKND(State)::value
+                , ::boost::alignment_of<Item>::value
+                >::value
+            >
+    {};
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction find_fallback_type
+//
+// Provides a fallback (i.e., nothrow default-constructible) type from the
+// specified sequence, or no_fallback_type if not found.
+//
+// This implementation is designed to prefer boost::blank over other potential
+// fallback types, regardless of its position in the specified sequence.
+//
+
+class no_fallback_type;
+
+struct find_fallback_type_pred
+{
+    template <typename Iterator>
+    struct apply
+    {
+    private:
+        typedef typename mpl::deref<Iterator>::type t_;
+
+    public:
+        typedef mpl::not_< has_nothrow_constructor<t_> > type;
+    };
+};
+
+template <typename Types>
+struct find_fallback_type
+{
+private: // helpers, for metafunction result (below)
+
+    typedef typename mpl::end<Types>::type end_it;
+
+    // [Find the first suitable fallback type...]
+
+    typedef typename mpl::iter_fold_if<
+          Types
+        , mpl::int_<0>, mpl::protect< mpl::next<> >
+        , mpl::protect< find_fallback_type_pred >
+        >::type first_result_;
+
+    typedef typename first_result_::first first_result_index;
+    typedef typename first_result_::second first_result_it;
+
+    // [...now search the rest of the sequence for boost::blank...]
+
+    typedef typename mpl::iter_fold_if<
+          mpl::iterator_range< first_result_it,end_it >
+        , first_result_index, mpl::protect< mpl::next<> >
+        , mpl::protect< mpl::not_same_as<boost::blank> >
+        >::type second_result_;
+
+    typedef typename second_result_::second second_result_it;
+
+public: // metafunction result
+
+    // [...and return the results of the search:]
+    typedef typename mpl::eval_if<
+          is_same< second_result_it,end_it >
+        , mpl::if_<
+              is_same< first_result_it,end_it >
+            , mpl::pair< no_fallback_type,no_fallback_type >
+            , first_result_
+            >
+        , mpl::identity< second_result_ >
+        >::type type;
+
+};
+
+#ifndef BOOST_NO_CXX11_NOEXCEPT
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction is_variant_move_noexcept_constructible
+//
+// Returns true_type if all the types are nothrow move constructible.
+//
+template <class Types>
+struct is_variant_move_noexcept_constructible {
+    typedef typename boost::mpl::find_if<
+        Types, mpl::not_<boost::is_nothrow_move_constructible<boost::mpl::_1> >
+    >::type iterator_t;
+
+    typedef typename boost::mpl::end<Types>::type end_t;
+    typedef typename boost::is_same<
+        iterator_t, end_t
+    >::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction is_variant_move_noexcept_assignable
+//
+// Returns true_type if all the types are nothrow move constructible.
+//
+template <class Types>
+struct is_variant_move_noexcept_assignable {
+    typedef typename boost::mpl::find_if<
+        Types, mpl::not_<boost::is_nothrow_move_assignable<boost::mpl::_1> >
+    >::type iterator_t;
+
+    typedef typename boost::mpl::end<Types>::type end_t;
+    typedef typename boost::is_same<
+        iterator_t, end_t
+    >::type type;
+};
+#endif // BOOST_NO_CXX11_NOEXCEPT
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) metafunction make_storage
+//
+// Provides an aligned storage type capable of holding any of the types
+// specified in the given type-sequence.
+//
+
+template <typename Types, typename NeverUsesBackupFlag>
+struct make_storage
+{
+private: // helpers, for metafunction result (below)
+
+    typedef typename mpl::eval_if<
+          NeverUsesBackupFlag
+        , mpl::identity< Types >
+        , mpl::push_front<
+              Types, backup_holder<void*>
+            >
+        >::type types;
+
+    typedef typename max_value<
+          types, mpl::sizeof_<mpl::_1>
+        >::type max_size;
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))
+
+    typedef typename mpl::fold<
+          types
+        , mpl::size_t<1>
+        , add_alignment
+        >::type max_alignment;
+
+#else // borland
+
+    // temporary workaround -- use maximal alignment
+    typedef mpl::size_t< -1 > max_alignment;
+
+#endif // borland workaround
+
+public: // metafunction result
+
+    typedef ::boost::aligned_storage<
+          BOOST_MPL_AUX_VALUE_WKND(max_size)::value
+        , BOOST_MPL_AUX_VALUE_WKND(max_alignment)::value
+        > type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class destroyer
+//
+// Internal visitor that destroys the value it visits.
+//
+struct destroyer
+    : public static_visitor<>
+{
+public: // visitor interfaces
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(T& operand, int) const BOOST_NOEXCEPT
+    {
+        operand.~T(); // must be noexcept
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551)) || \
+    BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+        operand; // suppresses warnings
+#endif
+
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class template known_get
+//
+// Visitor that returns a reference to content of the specified type.
+//
+// Precondition: visited variant MUST contain logical content of type T.
+//
+template <typename T>
+class known_get
+    : public static_visitor<T&>
+{
+
+public: // visitor interface
+
+    T& operator()(T& operand) const BOOST_NOEXCEPT
+    {
+        return operand;
+    }
+
+    template <typename U>
+    T& operator()(U&) const
+    {
+        // logical error to be here: see precondition above
+        return ::boost::detail::variant::forced_return< T& >();
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class copy_into
+//
+// Internal visitor that copies the value it visits into the given buffer.
+//
+class copy_into
+    : public static_visitor<>
+{
+private: // representation
+
+    void* storage_;
+
+public: // structors
+
+    explicit copy_into(void* storage) BOOST_NOEXCEPT
+        : storage_(storage)
+    {
+    }
+
+public: // internal visitor interface
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(boost::detail::variant::backup_holder<T>& operand, long) const
+    {
+        new(storage_) T( operand.get() );
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(const boost::detail::variant::backup_holder<T>& operand, long) const
+    {
+        new(storage_) T( operand.get() );
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(const T& operand, int) const
+    {
+        new(storage_) T(operand);
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class move_into
+//
+// Internal visitor that moves the value it visits into the given buffer.
+//
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+class move_into
+    : public static_visitor<>
+{
+private: // representation
+
+    void* storage_;
+
+public: // structors
+
+    explicit move_into(void* storage) BOOST_NOEXCEPT
+        : storage_(storage)
+    {
+    }
+
+public: // internal visitor interface
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(boost::detail::variant::backup_holder<T>& operand, long) const
+    {
+        new(storage_) T( ::boost::detail::variant::move(operand.get()) );
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(T& operand, int) const BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(T(boost::declval<T>())))
+    {
+        new(storage_) T(::boost::detail::variant::move(operand));
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+};
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class assign_storage
+//
+// Internal visitor that assigns the given storage (which must be a
+// constructed value of the same type) to the value it visits.
+//
+struct assign_storage
+    : public static_visitor<>
+{
+private: // representation
+
+    const void* rhs_storage_;
+
+public: // structors
+
+    explicit assign_storage(const void* rhs_storage) BOOST_NOEXCEPT
+        : rhs_storage_(rhs_storage)
+    {
+    }
+
+public: // internal visitor interfaces
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(backup_holder<T>& lhs_content, long) const
+    {
+        lhs_content.get()
+            = static_cast< const backup_holder<T>* >(rhs_storage_)->get();
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(const backup_holder<T>& lhs_content, long) const
+    {
+        lhs_content.get()
+            = static_cast< const backup_holder<T>* >(rhs_storage_)->get();
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(T& lhs_content, int) const
+    {
+        // NOTE TO USER :
+        // Compile error here indicates one of variant's bounded types does
+        // not meet the requirements of the Assignable concept. Thus,
+        // variant is not Assignable.
+        //
+        // Hint: Are any of the bounded types const-qualified or references?
+        //
+        lhs_content = *static_cast< const T* >(rhs_storage_);
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class move_storage
+//
+// Internal visitor that moves the given storage (which must be a
+// constructed value of the same type) to the value it visits.
+//
+struct move_storage
+    : public static_visitor<>
+{
+private: // representation
+
+    void* rhs_storage_;
+
+public: // structors
+
+    explicit move_storage(void* rhs_storage) BOOST_NOEXCEPT
+        : rhs_storage_(rhs_storage)
+    {
+    }
+
+public: // internal visitor interfaces
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(backup_holder<T>& lhs_content, long) const
+    {
+        lhs_content.get()
+            = ::boost::detail::variant::move(static_cast<backup_holder<T>* >(rhs_storage_)->get());
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(const backup_holder<T>& lhs_content, long) const
+    {
+        lhs_content.get()
+            = ::boost::detail::variant::move(static_cast<backup_holder<T>* >(rhs_storage_)->get());
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(T& lhs_content, int) const
+    {
+        // NOTE TO USER :
+        // Compile error here indicates one of variant's bounded types does
+        // not meet the requirements of the Assignable concept. Thus,
+        // variant is not Assignable.
+        //
+        // Hint: Are any of the bounded types const-qualified or references?
+        //
+        lhs_content = ::boost::detail::variant::move(*static_cast<T* >(rhs_storage_));
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class direct_assigner
+//
+// Generic static visitor that: if and only if the visited value is of the
+// specified type, assigns the given value to the visited value and returns
+// true; else returns false.
+//
+template <typename T>
+class direct_assigner
+    : public static_visitor<bool>
+{
+private: // representation
+
+    const T& rhs_;
+
+public: // structors
+
+    explicit direct_assigner(const T& rhs) BOOST_NOEXCEPT
+        : rhs_(rhs)
+    {
+    }
+
+public: // visitor interface
+
+    bool operator()(T& lhs)
+    {
+        lhs = rhs_;
+        return true;
+    }
+
+    template <typename U>
+    bool operator()(U&) BOOST_NOEXCEPT
+    {
+        return false;
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+private:
+    // silence MSVC warning C4512: assignment operator could not be generated
+    direct_assigner& operator= (direct_assigner const&);
+#endif
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class direct_mover
+//
+// Generic static visitor that: if and only if the visited value is of the
+// specified type, move assigns the given value to the visited value and returns
+// true; else returns false.
+//
+template <typename T>
+class direct_mover
+    : public static_visitor<bool>
+{
+private: // representation
+
+    T& rhs_;
+
+public: // structors
+
+    explicit direct_mover(T& rhs) BOOST_NOEXCEPT
+        : rhs_(rhs)
+    {
+    }
+
+public: // visitor interface
+
+    bool operator()(T& lhs)
+    {
+        lhs = ::boost::detail::variant::move(rhs_);
+        return true;
+    }
+
+    template <typename U>
+    bool operator()(U&) BOOST_NOEXCEPT
+    {
+        return false;
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+private:
+    // silence MSVC warning C4512: assignment operator could not be generated
+    direct_mover& operator= (direct_mover const&);
+#endif
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class backup_assigner
+//
+// Internal visitor that "assigns" the given value to the visited value,
+// using backup to recover if the destroy-copy sequence fails.
+//
+// NOTE: This needs to be a friend of variant, as it needs access to
+// indicate_which, indicate_backup_which, etc.
+//
+template <typename Variant>
+class backup_assigner
+    : public static_visitor<>
+{
+private: // representation
+
+    Variant& lhs_;
+    int rhs_which_;
+    const void* rhs_content_;
+    void (*copy_rhs_content_)(void*, const void*);
+
+public: // structors
+
+    template<class RhsT>
+    backup_assigner(Variant& lhs, int rhs_which, const RhsT& rhs_content)
+        : lhs_(lhs)
+        , rhs_which_(rhs_which)
+        , rhs_content_(&rhs_content)
+        , copy_rhs_content_(&construct_impl<RhsT>)
+    {
+    }
+
+private: // helpers, for visitor interface (below)
+
+    template<class RhsT>
+    static void construct_impl(void* addr, const void* obj)
+    {
+        new(addr) RhsT(*static_cast<const RhsT*>(obj));
+    }
+
+    template <typename LhsT>
+    void backup_assign_impl(
+          backup_holder<LhsT>& lhs_content
+        , mpl::false_ // is_nothrow_move_constructible
+        , long
+        )
+    {
+        // Move lhs content to backup...
+        backup_holder<LhsT> backup_lhs_content(0);
+        backup_lhs_content.swap(lhs_content); // nothrow
+
+        // ...destroy lhs content...
+        lhs_content.~backup_holder<LhsT>(); // nothrow
+
+        BOOST_TRY
+        {
+            // ...and attempt to copy rhs content into lhs storage:
+            copy_rhs_content_(lhs_.storage_.address(), rhs_content_);
+        }
+        BOOST_CATCH (...)
+        {
+            // In case of failure, copy backup pointer to lhs storage...
+            new(lhs_.storage_.address())
+                    backup_holder<LhsT>( 0 ); // nothrow
+
+            static_cast<backup_holder<LhsT>* >(lhs_.storage_.address())
+                    ->swap(backup_lhs_content); // nothrow
+
+            // ...and rethrow:
+            BOOST_RETHROW;
+        }
+        BOOST_CATCH_END
+
+        // In case of success, indicate new content type:
+        lhs_.indicate_which(rhs_which_); // nothrow
+    }
+
+    template <typename LhsT>
+    void backup_assign_impl(
+          LhsT& lhs_content
+        , mpl::true_ // is_nothrow_move_constructible
+        , int
+        )
+    {
+        // Move lhs content to backup...
+        LhsT backup_lhs_content(
+              ::boost::detail::variant::move(lhs_content)
+            ); // nothrow
+
+        // ...destroy lhs content...
+        lhs_content.~LhsT(); // nothrow
+
+        BOOST_TRY
+        {
+            // ...and attempt to copy rhs content into lhs storage:
+            copy_rhs_content_(lhs_.storage_.address(), rhs_content_);
+        }
+        BOOST_CATCH (...)
+        {
+            // In case of failure, restore backup content to lhs storage...
+            new(lhs_.storage_.address())
+                LhsT(
+                      ::boost::detail::variant::move(backup_lhs_content)
+                    ); // nothrow
+
+            // ...and rethrow:
+            BOOST_RETHROW;
+        }
+        BOOST_CATCH_END
+
+        // In case of success, indicate new content type:
+        lhs_.indicate_which(rhs_which_); // nothrow
+    }
+
+    template <typename LhsT>
+    void backup_assign_impl(
+          LhsT& lhs_content
+        , mpl::false_ // is_nothrow_move_constructible
+        , int
+        )
+    {
+        // Backup lhs content...
+        LhsT* backup_lhs_ptr = new LhsT(lhs_content);
+
+        // ...destroy lhs content...
+        lhs_content.~LhsT(); // nothrow
+
+        BOOST_TRY
+        {
+            // ...and attempt to copy rhs content into lhs storage:
+            copy_rhs_content_(lhs_.storage_.address(), rhs_content_);
+        }
+        BOOST_CATCH (...)
+        {
+            // In case of failure, copy backup pointer to lhs storage...
+            new(lhs_.storage_.address())
+                backup_holder<LhsT>( backup_lhs_ptr ); // nothrow
+
+            // ...indicate now using backup...
+            lhs_.indicate_backup_which( lhs_.which() ); // nothrow
+
+            // ...and rethrow:
+            BOOST_RETHROW;
+        }
+        BOOST_CATCH_END
+
+        // In case of success, indicate new content type...
+        lhs_.indicate_which(rhs_which_); // nothrow
+
+        // ...and delete backup:
+        delete backup_lhs_ptr; // nothrow
+    }
+
+public: // visitor interface
+
+    template <typename LhsT>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    internal_visit(LhsT& lhs_content, int)
+    {
+        typedef typename is_nothrow_move_constructible<LhsT>::type
+            nothrow_move;
+
+        backup_assign_impl( lhs_content, nothrow_move(), 1L);
+
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+private:
+    // silence MSVC warning C4512: assignment operator could not be generated
+    backup_assigner& operator= (backup_assigner const&);
+#endif
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class swap_with
+//
+// Visitor that swaps visited value with content of given variant.
+//
+// Precondition: Given variant MUST have same logical type as visited value.
+//
+template <typename Variant>
+struct swap_with
+    : public static_visitor<>
+{
+private: // representation
+
+    Variant& toswap_;
+
+public: // structors
+
+    explicit swap_with(Variant& toswap) BOOST_NOEXCEPT
+        : toswap_(toswap)
+    {
+    }
+
+public: // internal visitor interfaces
+
+    template <typename T>
+    void operator()(T& operand) const
+    {
+        // Since the precondition ensures types are same, get T...
+        known_get<T> getter;
+        T& other = toswap_.apply_visitor(getter);
+
+        // ...and swap:
+        ::boost::detail::variant::move_swap( operand, other );
+    }
+
+private:
+    swap_with& operator=(const swap_with&);
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class reflect
+//
+// Generic static visitor that performs a typeid on the value it visits.
+//
+
+class reflect
+    : public static_visitor<const boost::typeindex::type_info&>
+{
+public: // visitor interfaces
+
+    template <typename T>
+    const boost::typeindex::type_info& operator()(const T&) const BOOST_NOEXCEPT
+    {
+        return boost::typeindex::type_id<T>().type_info();
+    }
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class comparer
+//
+// Generic static visitor that compares the content of the given lhs variant
+// with the visited rhs content using Comp.
+//
+// Precondition: lhs.which() == rhs.which()
+//
+template <typename Variant, typename Comp>
+class comparer
+    : public static_visitor<bool>
+{
+private: // representation
+
+    const Variant& lhs_;
+
+public: // structors
+
+    explicit comparer(const Variant& lhs) BOOST_NOEXCEPT
+        : lhs_(lhs)
+    {
+    }
+
+public: // visitor interfaces
+
+    template <typename T>
+    bool operator()(const T& rhs_content) const
+    {
+        // Since the precondition ensures lhs and rhs types are same, get T...
+        known_get<const T> getter;
+        const T& lhs_content = lhs_.apply_visitor(getter);
+
+        // ...and compare lhs and rhs contents:
+        return Comp()(lhs_content, rhs_content);
+    }
+
+private:
+    comparer& operator=(const comparer&);
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class equal_comp
+//
+// Generic function object compares lhs with rhs using operator==.
+//
+struct equal_comp
+{
+    template <typename T>
+    bool operator()(const T& lhs, const T& rhs) const
+    {
+        return lhs == rhs;
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class less_comp
+//
+// Generic function object compares lhs with rhs using operator<.
+//
+struct less_comp
+{
+    template <typename T>
+    bool operator()(const T& lhs, const T& rhs) const
+    {
+        return lhs < rhs;
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class template invoke_visitor
+//
+// Internal visitor that invokes the given visitor using:
+//  * for wrappers (e.g., recursive_wrapper), the wrapper's held value.
+//  * for all other values, the value itself.
+//
+template <typename Visitor>
+class invoke_visitor
+{
+private: // representation
+
+    Visitor& visitor_;
+
+public: // visitor typedefs
+
+    typedef typename Visitor::result_type
+        result_type;
+
+public: // structors
+
+    explicit invoke_visitor(Visitor& visitor) BOOST_NOEXCEPT
+        : visitor_(visitor)
+    {
+    }
+
+#if !defined(BOOST_NO_VOID_RETURNS)
+
+public: // internal visitor interfaces
+
+    template <typename T>
+    result_type internal_visit(T& operand, int)
+    {
+        return visitor_(operand);
+    }
+
+#   if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0564))
+    template <typename T>
+    result_type internal_visit(const T& operand, int)
+    {
+        return visitor_(operand);
+    }
+#   endif
+
+#else // defined(BOOST_NO_VOID_RETURNS)
+
+private: // helpers, for internal visitor interfaces (below)
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    visit_impl(T& operand, mpl::false_)
+    {
+        return visitor_(operand);
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    visit_impl(T& operand, mpl::true_)
+    {
+        visitor_(operand);
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+public: // internal visitor interfaces
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(T& operand, int)
+    {
+        typedef typename is_same<result_type, void>::type
+            has_void_result_type;
+
+        return visit_impl(operand, has_void_result_type());
+    }
+
+#endif // BOOST_NO_VOID_RETURNS) workaround
+
+public: // internal visitor interfaces, cont.
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(boost::recursive_wrapper<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(const boost::recursive_wrapper<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(boost::detail::reference_content<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(const boost::detail::reference_content<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(boost::detail::variant::backup_holder<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+    template <typename T>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    internal_visit(const boost::detail::variant::backup_holder<T>& operand, long)
+    {
+        return internal_visit( operand.get(), 1L );
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+private:
+    // silence MSVC warning C4512: assignment operator could not be generated
+    invoke_visitor& operator= (invoke_visitor const&);
+#endif
+};
+
+}} // namespace detail::variant
+
+///////////////////////////////////////////////////////////////////////////////
+// class template variant (concept inspired by Andrei Alexandrescu)
+//
+// See docs and boost/variant/variant_fwd.hpp for more information.
+//
+template <
+      typename T0_
+    , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)
+    >
+class variant
+{
+private: // helpers, for typedefs (below)
+
+    typedef variant wknd_self_t;
+
+    struct is_recursive_
+        : detail::variant::is_recursive_flag<T0_>
+    {
+    };
+
+    typedef typename mpl::eval_if<
+          is_recursive_
+        , T0_
+        , mpl::identity< T0_ >
+        >::type unwrapped_T0_;
+
+    struct is_sequence_based_
+        : detail::variant::is_over_sequence<unwrapped_T0_>
+    {
+    };
+
+#if !defined(BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
+
+private: // helpers, for typedefs (below)
+
+    typedef typename mpl::eval_if<
+          is_sequence_based_
+        , unwrapped_T0_ // over_sequence<...>::type
+        , detail::variant::make_variant_list<
+              unwrapped_T0_
+            , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
+            >
+        >::type specified_types;
+
+    BOOST_STATIC_ASSERT((
+          ::boost::mpl::not_< mpl::empty<specified_types> >::value
+        ));
+
+    typedef typename mpl::eval_if<
+          is_recursive_
+        , mpl::transform<
+              specified_types
+            , mpl::protect<
+                  detail::variant::quoted_enable_recursive<wknd_self_t>
+                >
+            >
+        , mpl::identity< specified_types >
+        >::type recursive_enabled_types;
+
+public: // public typedefs
+
+    typedef typename mpl::transform<
+          recursive_enabled_types
+        , unwrap_recursive<mpl::_1>
+        >::type types;
+
+private: // internal typedefs
+
+    typedef typename mpl::transform<
+          recursive_enabled_types
+        , mpl::protect< detail::make_reference_content<> >
+        >::type internal_types;
+
+    typedef typename mpl::front<
+          internal_types
+        >::type internal_T0;
+
+#else // defined(BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
+
+private: // helpers, for typedefs (below)
+
+    typedef unwrapped_T0_ T0;
+
+    #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS(z,N,_) \
+        typedef typename mpl::eval_if< \
+              is_recursive_ \
+            , detail::variant::enable_recursive< \
+                  BOOST_PP_CAT(T,N) \
+                , wknd_self_t \
+                > \
+            , mpl::identity< BOOST_PP_CAT(T,N) > \
+            >::type BOOST_PP_CAT(recursive_enabled_T,N); \
+        /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_LIMIT_TYPES
+        , BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
+        , _
+        )
+
+    #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
+
+    #define BOOST_VARIANT_AUX_UNWRAP_RECURSIVE_TYPEDEFS(z,N,_) \
+        typedef typename unwrap_recursive< \
+              BOOST_PP_CAT(recursive_enabled_T,N) \
+            >::type BOOST_PP_CAT(public_T,N); \
+        /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_LIMIT_TYPES
+        , BOOST_VARIANT_AUX_UNWRAP_RECURSIVE_TYPEDEFS
+        , _
+        )
+
+    #undef BOOST_VARIANT_AUX_UNWRAP_RECURSIVE_TYPEDEFS
+
+public: // public typedefs
+
+    typedef typename detail::variant::make_variant_list<
+          BOOST_VARIANT_ENUM_PARAMS(public_T)
+        >::type types;
+
+private: // helpers, for internal typedefs (below)
+
+    #define BOOST_VARIANT_AUX_MAKE_REFERENCE_CONTENT_TYPEDEFS(z,N,_) \
+        typedef detail::make_reference_content< \
+              BOOST_PP_CAT(recursive_enabled_T,N) \
+            >::type BOOST_PP_CAT(internal_T,N); \
+        /**/
+
+    BOOST_PP_REPEAT(
+          BOOST_VARIANT_LIMIT_TYPES
+        , BOOST_VARIANT_AUX_MAKE_REFERENCE_CONTENT_TYPEDEFS
+        , _
+        )
+
+    #undef BOOST_VARIANT_AUX_MAKE_REFERENCE_CONTENT_TYPEDEFS
+
+private: // internal typedefs
+
+    typedef typename detail::variant::make_variant_list<
+          BOOST_VARIANT_ENUM_PARAMS(internal_T)
+        >::type internal_types;
+
+private: // static precondition assertions
+
+    // NOTE TO USER :
+    // variant< type-sequence > syntax is not supported on this compiler!
+    //
+    BOOST_MPL_ASSERT_NOT(( is_sequence_based_ ));
+
+#endif // BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT workaround
+
+private: // helpers, for representation (below)
+
+    typedef typename detail::variant::find_fallback_type<
+          internal_types
+        >::type fallback_type_result_;
+
+    typedef typename fallback_type_result_::first
+        fallback_type_index_;
+    typedef typename fallback_type_result_::second
+        fallback_type_;
+
+    struct has_fallback_type_
+        : mpl::not_<
+              is_same< fallback_type_, detail::variant::no_fallback_type >
+            >
+    {
+    };
+
+    typedef has_fallback_type_
+        never_uses_backup_flag;
+
+    typedef typename detail::variant::make_storage<
+          internal_types, never_uses_backup_flag
+        >::type storage_t;
+
+#ifndef BOOST_NO_CXX11_NOEXCEPT
+    typedef typename detail::variant::is_variant_move_noexcept_constructible<
+        internal_types
+    > variant_move_noexcept_constructible;
+
+    typedef typename detail::variant::is_variant_move_noexcept_assignable<
+        internal_types
+    > variant_move_noexcept_assignable;
+
+#endif
+
+private: // helpers, for representation (below)
+
+    // which_ on:
+    // * [0,  size<internal_types>) indicates stack content
+    // * [-size<internal_types>, 0) indicates pointer to heap backup
+    // if which_ >= 0:
+    // * then which() -> which_
+    // * else which() -> -(which_ + 1)
+
+#if !defined(BOOST_VARIANT_MINIMIZE_SIZE)
+
+    typedef int which_t;
+
+#else // defined(BOOST_VARIANT_MINIMIZE_SIZE)
+
+    // [if O1_size available, then attempt which_t size optimization...]
+    // [select signed char if fewer than SCHAR_MAX types, else signed int:]
+    typedef typename mpl::eval_if<
+          mpl::equal_to< mpl::O1_size<internal_types>, mpl::long_<-1> >
+        , mpl::identity< int >
+        , mpl::if_<
+              mpl::less< mpl::O1_size<internal_types>, mpl::int_<SCHAR_MAX> >
+            , signed char
+            , int
+            >
+        >::type which_t;
+
+#endif // BOOST_VARIANT_MINIMIZE_SIZE switch
+
+// representation -- private when possible
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+    private:
+#else
+    public:
+#endif
+
+    which_t which_;
+    storage_t storage_;
+
+    void indicate_which(int which_arg) BOOST_NOEXCEPT
+    {
+        which_ = static_cast<which_t>( which_arg );
+    }
+
+    void indicate_backup_which(int which_arg) BOOST_NOEXCEPT
+    {
+        which_ = static_cast<which_t>( -(which_arg + 1) );
+    }
+
+private: // helpers, for queries (below)
+
+    bool using_backup() const BOOST_NOEXCEPT
+    {
+        return which_ < 0;
+    }
+
+public: // queries
+
+    int which() const BOOST_NOEXCEPT
+    {
+        // If using heap backup...
+        if (using_backup())
+            // ...then return adjusted which_:
+            return -(which_ + 1);
+
+        // Otherwise, return which_ directly:
+        return which_;
+    }
+
+private: // helpers, for structors (below)
+
+    struct initializer
+        : BOOST_VARIANT_AUX_INITIALIZER_T(
+              recursive_enabled_types, recursive_enabled_T
+            )
+    {
+    };
+
+    void destroy_content() BOOST_NOEXCEPT
+    {
+        detail::variant::destroyer visitor;
+        this->internal_apply_visitor(visitor);
+    }
+
+public: // structors
+
+    ~variant() BOOST_NOEXCEPT
+    {
+        destroy_content();
+    }
+
+    variant() BOOST_NOEXCEPT_IF(boost::has_nothrow_constructor<internal_T0>::value)
+    {
+#ifdef _MSC_VER
+#pragma warning( push )
+// behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized 
+#pragma warning( disable : 4345 ) 
+#endif
+        // NOTE TO USER :
+        // Compile error from here indicates that the first bound
+        // type is not default-constructible, and so variant cannot
+        // support its own default-construction.
+        //
+        new( storage_.address() ) internal_T0();
+        indicate_which(0); // zero is the index of the first bounded type
+#ifdef _MSC_VER
+#pragma warning( pop )
+#endif
+    }
+
+private: // helpers, for structors, cont. (below)
+
+    class convert_copy_into
+        : public static_visitor<int>
+    {
+    private: // representation
+
+        void* storage_;
+
+    public: // structors
+
+        explicit convert_copy_into(void* storage) BOOST_NOEXCEPT
+            : storage_(storage)
+        {
+        }
+
+    public: // internal visitor interfaces (below)
+
+        template <typename T>
+        int internal_visit(T& operand, int) const
+        {
+            // NOTE TO USER :
+            // Compile error here indicates one of the source variant's types 
+            // cannot be unambiguously converted to the destination variant's
+            // types (or that no conversion exists).
+            //
+            return initializer::initialize(storage_, operand);
+        }
+
+#   if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0564))
+        template <typename T>
+        result_type internal_visit(const T& operand, int) const
+        {
+            return initializer::initialize(storage_, operand);
+        }
+#   endif
+
+        template <typename T>
+        int internal_visit(boost::detail::reference_content<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::detail::reference_content<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(boost::detail::variant::backup_holder<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::detail::variant::backup_holder<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(boost::recursive_wrapper<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::recursive_wrapper<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+    };
+
+    friend class convert_copy_into;
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    class convert_move_into
+        : public static_visitor<int>
+    {
+    private: // representation
+
+        void* storage_;
+
+    public: // structors
+
+        explicit convert_move_into(void* storage) BOOST_NOEXCEPT
+            : storage_(storage)
+        {
+        }
+
+    public: // internal visitor interfaces (below)
+
+        template <typename T>
+        int internal_visit(T& operand, int) const
+        {
+            // NOTE TO USER :
+            // Compile error here indicates one of the source variant's types 
+            // cannot be unambiguously converted to the destination variant's
+            // types (or that no conversion exists).
+            //
+            return initializer::initialize(storage_, detail::variant::move(operand) );
+        }
+
+        template <typename T>
+        int internal_visit(boost::detail::reference_content<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::detail::reference_content<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(boost::detail::variant::backup_holder<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::detail::variant::backup_holder<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(boost::recursive_wrapper<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+
+        template <typename T>
+        int internal_visit(const boost::recursive_wrapper<T>& operand, long) const
+        {
+            return internal_visit( operand.get(), 1L );
+        }
+    };
+
+    friend class convert_move_into;
+#endif
+
+private: // helpers, for structors, below 
+
+    template <typename T>
+    void convert_construct(
+          T& operand
+        , int
+        , mpl::false_ = mpl::false_() // is_foreign_variant
+        )
+    {
+        // NOTE TO USER :
+        // Compile error here indicates that the given type is not 
+        // unambiguously convertible to one of the variant's types
+        // (or that no conversion exists).
+        //
+        indicate_which(
+              initializer::initialize(
+                  storage_.address()
+                , operand
+                )
+            );
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <typename T>
+    typename boost::enable_if<boost::is_rvalue_reference<T&&> >::type convert_construct(
+          T&& operand
+        , int
+        , mpl::false_ = mpl::false_() // is_foreign_variant
+        )
+    {
+        // NOTE TO USER :
+        // Compile error here indicates that the given type is not 
+        // unambiguously convertible to one of the variant's types
+        // (or that no conversion exists).
+        //
+        indicate_which(
+              initializer::initialize(
+                  storage_.address()
+                , detail::variant::move(operand)
+                )
+            );
+    }
+#endif
+
+    template <typename Variant>
+    void convert_construct(
+          Variant& operand
+        , long
+        , mpl::true_// is_foreign_variant
+        )
+    {
+        convert_copy_into visitor(storage_.address());
+        indicate_which(
+              operand.internal_apply_visitor(visitor)
+            );
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <typename Variant>
+    typename boost::enable_if<boost::is_rvalue_reference<Variant&&> >::type convert_construct(
+          Variant&& operand
+        , long
+        , mpl::true_// is_foreign_variant
+        )
+    {
+        convert_move_into visitor(storage_.address());
+        indicate_which(
+              operand.internal_apply_visitor(visitor)
+            );
+    }
+#endif
+
+    template <typename Variant>
+    void convert_construct_variant(Variant& operand)
+    {
+        // [Determine if the given variant is itself a bounded type, or if its
+        //  content needs to be converted (i.e., it is a 'foreign' variant):]
+        //
+
+        typedef typename mpl::find_if<
+              types
+            , is_same<
+                  add_const<mpl::_1>
+                , const Variant
+                >
+            >::type found_it;
+
+        typedef typename mpl::end<types>::type not_found;
+        typedef typename is_same<
+              found_it, not_found
+            >::type is_foreign_variant;
+
+        // Convert construct from operand:
+        convert_construct(
+              operand, 1L
+            , is_foreign_variant()
+            );
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <typename Variant>
+    typename boost::enable_if<boost::is_rvalue_reference<Variant&&> >::type convert_construct_variant(Variant&& operand)
+    {
+        // [Determine if the given variant is itself a bounded type, or if its
+        //  content needs to be converted (i.e., it is a 'foreign' variant):]
+        //
+
+        typedef typename mpl::find_if<
+              types
+            , is_same<
+                  add_const<mpl::_1>
+                , const Variant
+                >
+            >::type found_it;
+
+        typedef typename mpl::end<types>::type not_found;
+        typedef typename is_same<
+              found_it, not_found
+            >::type is_foreign_variant;
+
+        // Convert move construct from operand:
+        convert_construct(
+              detail::variant::move(operand), 1L
+            , is_foreign_variant()
+            );
+    }
+#endif
+
+    template <BOOST_VARIANT_ENUM_PARAMS(typename U)>
+    void convert_construct(
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(U)>& operand
+        , long
+        )
+    {
+        convert_construct_variant(operand);
+    }
+
+    template <BOOST_VARIANT_ENUM_PARAMS(typename U)>
+    void convert_construct(
+          const boost::variant<BOOST_VARIANT_ENUM_PARAMS(U)>& operand
+        , long
+        )
+    {
+        convert_construct_variant(operand);    
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <BOOST_VARIANT_ENUM_PARAMS(typename U)>
+    void convert_construct(
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(U)>&& operand
+        , long
+        )
+    {
+        convert_construct_variant( detail::variant::move(operand) );    
+    }
+#endif
+
+public: // structors, cont.
+
+#if !defined(BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING)
+
+    template <typename T>
+    variant(const T& operand)
+    {
+        convert_construct(operand, 1L);
+    }
+
+    template <typename T>
+    variant(T& operand)
+    {
+        convert_construct(operand, 1L);
+    }
+
+#elif defined(BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND)
+
+    // For compilers that cannot distinguish between T& and const T& in
+    // template constructors, but do fully support SFINAE, we can workaround:
+
+    template <typename T>
+    variant(const T& operand)
+    {
+        convert_construct(operand, 1L);
+    }
+
+    template <typename T>
+    variant(
+          T& operand
+        , typename enable_if<
+              mpl::not_< is_const<T> >
+            , void
+            >::type* = 0
+        )
+    {
+        convert_construct(operand, 1L);
+    }
+
+#else // !defined(BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND)
+
+    // For compilers that cannot distinguish between T& and const T& in
+    // template constructors, and do NOT support SFINAE, we can't workaround:
+
+    template <typename T>
+    variant(const T& operand)
+    {
+        convert_construct(operand, 1L);
+    }
+#endif // BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING workarounds
+    
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <class T>
+    variant(T&& operand, typename boost::enable_if<boost::is_rvalue_reference<T&&> >::type* = 0, 
+        typename boost::disable_if<boost::is_const<T> >::type* = 0)
+    {
+        convert_construct( detail::variant::move(operand), 1L);
+    }
+#endif
+
+public: // structors, cont.
+
+    // [MSVC6 requires copy constructor appear after template constructors]
+    variant(const variant& operand)
+    {
+        // Copy the value of operand into *this...
+        detail::variant::copy_into visitor( storage_.address() );
+        operand.internal_apply_visitor(visitor);
+
+        // ...and activate the *this's primary storage on success:
+        indicate_which(operand.which());
+    }
+    
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    variant(variant&& operand) BOOST_NOEXCEPT_IF(variant_move_noexcept_constructible::type::value)
+    {
+        // Move the value of operand into *this...
+        detail::variant::move_into visitor( storage_.address() );
+        operand.internal_apply_visitor(visitor);
+
+        // ...and activate the *this's primary storage on success:
+        indicate_which(operand.which());
+    }
+#endif
+
+private: // helpers, for modifiers (below)
+
+#   if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+    template <typename Variant>
+    friend class detail::variant::backup_assigner;
+#   endif
+
+    // class assigner
+    //
+    // Internal visitor that "assigns" the visited value to the given variant
+    // by appropriate destruction and copy-construction.
+    //
+
+    class assigner
+        : public static_visitor<>
+    {
+    protected: // representation
+
+        variant& lhs_;
+        const int rhs_which_;
+
+    public: // structors
+
+        assigner(variant& lhs, int rhs_which) BOOST_NOEXCEPT
+            : lhs_(lhs)
+            , rhs_which_(rhs_which)
+        {
+        }
+
+    protected: // helpers, for internal visitor interface (below)
+
+        template <typename RhsT, typename B1, typename B2>
+        void assign_impl(
+              const RhsT& rhs_content
+            , mpl::true_ // has_nothrow_copy
+            , B1 // is_nothrow_move_constructible
+            , B2 // has_fallback_type
+            ) const BOOST_NOEXCEPT
+        {
+            // Destroy lhs's content...
+            lhs_.destroy_content(); // nothrow
+
+            // ...copy rhs content into lhs's storage...
+            new(lhs_.storage_.address())
+                RhsT( rhs_content ); // nothrow
+
+            // ...and indicate new content type:
+            lhs_.indicate_which(rhs_which_); // nothrow
+        }
+
+        template <typename RhsT, typename B>
+        void assign_impl(
+              const RhsT& rhs_content
+            , mpl::false_ // has_nothrow_copy
+            , mpl::true_ // is_nothrow_move_constructible
+            , B // has_fallback_type
+            ) const
+        {
+            // Attempt to make a temporary copy (so as to move it below)...
+            RhsT temp(rhs_content);
+
+            // ...and upon success destroy lhs's content...
+            lhs_.destroy_content(); // nothrow
+
+            // ...move the temporary copy into lhs's storage...
+            new(lhs_.storage_.address())
+                RhsT( detail::variant::move(temp) ); // nothrow
+
+            // ...and indicate new content type:
+            lhs_.indicate_which(rhs_which_); // nothrow
+        }
+
+        void construct_fallback() const BOOST_NOEXCEPT {
+            // In case of failure, default-construct fallback type in lhs's storage...
+            new (lhs_.storage_.address())
+                fallback_type_; // nothrow
+
+            // ...indicate construction of fallback type...
+            lhs_.indicate_which(
+                  BOOST_MPL_AUX_VALUE_WKND(fallback_type_index_)::value
+                ); // nothrow
+        }
+
+        template <typename RhsT>
+        void assign_impl(
+              const RhsT& rhs_content
+            , mpl::false_ // has_nothrow_copy
+            , mpl::false_ // is_nothrow_move_constructible
+            , mpl::true_ // has_fallback_type
+            ) const
+        {
+            // Destroy lhs's content...
+            lhs_.destroy_content(); // nothrow
+
+            BOOST_TRY
+            {
+                // ...and attempt to copy rhs's content into lhs's storage:
+                new(lhs_.storage_.address())
+                    RhsT( rhs_content );
+            }
+            BOOST_CATCH (...)
+            {
+                construct_fallback();
+
+                // ...and rethrow:
+                BOOST_RETHROW;
+            }
+            BOOST_CATCH_END
+
+            // In the event of success, indicate new content type:
+            lhs_.indicate_which(rhs_which_); // nothrow
+        }
+
+        template <typename RhsT>
+        void assign_impl(
+              const RhsT& rhs_content
+            , mpl::false_ // has_nothrow_copy
+            , mpl::false_ // is_nothrow_move_constructible
+            , mpl::false_ // has_fallback_type
+            ) const
+        {
+            detail::variant::backup_assigner<wknd_self_t>
+                visitor(lhs_, rhs_which_, rhs_content);
+            lhs_.internal_apply_visitor(visitor);
+        }
+
+    public: // internal visitor interfaces
+
+        template <typename RhsT>
+            BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+        internal_visit(const RhsT& rhs_content, int) const
+        {
+            typedef typename has_nothrow_copy<RhsT>::type
+                nothrow_copy;
+            typedef typename mpl::or_< // reduces compile-time
+                  nothrow_copy
+                , is_nothrow_move_constructible<RhsT>
+                >::type nothrow_move_constructor;
+
+            assign_impl(
+                  rhs_content
+                , nothrow_copy()
+                , nothrow_move_constructor()
+                , has_fallback_type_()
+                );
+
+            BOOST_VARIANT_AUX_RETURN_VOID;
+        }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        assigner& operator= (assigner const&);
+#endif
+    };
+    
+    friend class assigner;
+   
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    // class move_assigner
+    //
+    // Internal visitor that "move assigns" the visited value to the given variant
+    // by appropriate destruction and move-construction.
+    //
+
+    class move_assigner
+        : public assigner
+    {
+    public: // structors
+
+        move_assigner(variant& lhs, int rhs_which) BOOST_NOEXCEPT
+            : assigner(lhs, rhs_which)
+        {
+        }
+
+    private: // helpers, for internal visitor interface (below)
+        
+        template <typename RhsT, typename B2>
+        void assign_impl(
+              RhsT& rhs_content
+            , mpl::true_ // has_nothrow_copy
+            , mpl::false_ // is_nothrow_move_constructible
+            , B2 // has_fallback_type
+            ) const BOOST_NOEXCEPT
+        {
+            assigner::assign_impl(rhs_content, mpl::true_(), mpl::false_(), B2());
+        }
+
+        template <typename RhsT, typename B, typename B2>
+        void assign_impl(
+              RhsT& rhs_content
+            , B // has_nothrow_copy
+            , mpl::true_ // is_nothrow_move_constructible
+            , B2 // has_fallback_type
+            ) const BOOST_NOEXCEPT
+        {
+            // ...destroy lhs's content...
+            assigner::lhs_.destroy_content(); // nothrow
+
+            // ...move the rhs_content into lhs's storage...
+            new(assigner::lhs_.storage_.address())
+                RhsT( detail::variant::move(rhs_content) ); // nothrow
+
+            // ...and indicate new content type:
+            assigner::lhs_.indicate_which(assigner::rhs_which_); // nothrow
+        }
+
+        template <typename RhsT>
+        void assign_impl(
+              RhsT& rhs_content
+            , mpl::false_ // has_nothrow_copy
+            , mpl::false_ // is_nothrow_move_constructible
+            , mpl::true_ // has_fallback_type
+            ) const
+        {
+            // Destroy lhs's content...
+            assigner::lhs_.destroy_content(); // nothrow
+
+            BOOST_TRY
+            {
+                // ...and attempt to copy rhs's content into lhs's storage:
+                new(assigner::lhs_.storage_.address())
+                    RhsT( detail::variant::move(rhs_content) );
+            }
+            BOOST_CATCH (...)
+            {
+                assigner::construct_fallback();
+
+                // ...and rethrow:
+                BOOST_RETHROW;
+            }
+            BOOST_CATCH_END
+
+            // In the event of success, indicate new content type:
+            assigner::lhs_.indicate_which(assigner::rhs_which_); // nothrow
+        }
+        
+        template <typename RhsT>
+        void assign_impl(
+              RhsT& rhs_content
+            , mpl::false_ // has_nothrow_copy
+            , mpl::false_ // is_nothrow_move_constructible
+            , mpl::false_ // has_fallback_type
+            ) const
+        {
+            assigner::assign_impl(rhs_content, mpl::false_(), mpl::false_(), mpl::false_());
+        }
+
+    public: // internal visitor interfaces
+
+        template <typename RhsT>
+            BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+        internal_visit(RhsT& rhs_content, int) const
+        {
+            typedef typename is_nothrow_move_constructible<RhsT>::type
+                nothrow_move_constructor;
+            typedef typename mpl::or_< // reduces compile-time
+                  nothrow_move_constructor
+                , has_nothrow_copy<RhsT>
+                >::type nothrow_copy;
+
+            assign_impl(
+                  rhs_content
+                , nothrow_copy()
+                , nothrow_move_constructor()
+                , has_fallback_type_()
+                );
+
+            BOOST_VARIANT_AUX_RETURN_VOID;
+        }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1600))
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        move_assigner& operator= (move_assigner const&);
+#endif
+    };
+
+    friend class move_assigner;
+#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
+
+    void variant_assign(const variant& rhs)
+    {
+        // If the contained types are EXACTLY the same...
+        if (which_ == rhs.which_)
+        {
+            // ...then assign rhs's storage to lhs's content:
+            detail::variant::assign_storage visitor(rhs.storage_.address());
+            this->internal_apply_visitor(visitor);
+        }
+        else
+        {
+            // Otherwise, perform general (copy-based) variant assignment:
+            assigner visitor(*this, rhs.which());
+            rhs.internal_apply_visitor(visitor); 
+        }
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    void variant_assign(variant&& rhs)
+    {
+        // If the contained types are EXACTLY the same...
+        if (which_ == rhs.which_)
+        {
+            // ...then move rhs's storage to lhs's content:
+            detail::variant::move_storage visitor(rhs.storage_.address());
+            this->internal_apply_visitor(visitor);
+        }
+        else
+        {
+            // Otherwise, perform general (move-based) variant assignment:
+            move_assigner visitor(*this, rhs.which());
+            rhs.internal_apply_visitor(visitor); 
+        }
+    }
+#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
+
+private: // helpers, for modifiers (below)
+
+    template <typename T>
+    void assign(const T& rhs)
+    {
+        // If direct T-to-T assignment is not possible...
+        detail::variant::direct_assigner<T> direct_assign(rhs);
+        if (this->apply_visitor(direct_assign) == false)
+        {
+            // ...then convert rhs to variant and assign:
+            //
+            // While potentially inefficient, the following construction of a
+            // variant allows T as any type convertible to one of the bounded
+            // types without excessive code redundancy.
+            //
+            variant temp(rhs);
+            variant_assign( detail::variant::move(temp) );
+        }
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <typename T>
+    void move_assign(T&& rhs)
+    {
+        // If direct T-to-T move assignment is not possible...
+        detail::variant::direct_mover<T> direct_move(rhs);
+        if (this->apply_visitor(direct_move) == false)
+        {
+            // ...then convert rhs to variant and assign:
+            //
+            // While potentially inefficient, the following construction of a
+            // variant allows T as any type convertible to one of the bounded
+            // types without excessive code redundancy.
+            //
+            variant temp( detail::variant::move(rhs) );
+            variant_assign( detail::variant::move(temp) );
+        }
+    }
+#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
+
+public: // modifiers
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    template <class T>
+    typename boost::enable_if_c<boost::is_rvalue_reference<T&&>::value && !boost::is_const<T>::value, variant& >::type 
+        operator=(T&& rhs) 
+    {
+        move_assign( detail::variant::move(rhs) );
+        return *this;
+    }
+#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
+
+    template <typename T>
+    variant& operator=(const T& rhs)
+    {
+        assign(rhs);
+        return *this;
+    }
+
+    // [MSVC6 requires copy assign appear after templated operator=]
+    variant& operator=(const variant& rhs)
+    {
+        variant_assign(rhs);
+        return *this;
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    variant& operator=(variant&& rhs) 
+#if !defined(__GNUC__) || (__GNUC__ != 4) || (__GNUC_MINOR__ > 6)
+        BOOST_NOEXCEPT_IF(variant_move_noexcept_constructible::type::value && variant_move_noexcept_assignable::type::value)
+#endif
+    {
+        variant_assign( detail::variant::move(rhs) );
+        return *this;
+    }
+#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
+
+    void swap(variant& rhs)
+    {
+        // If the contained types are the same...
+        if (which() == rhs.which())
+        {
+            // ...then swap the values directly:
+            detail::variant::swap_with<variant> visitor(rhs);
+            this->apply_visitor(visitor);
+        }
+        else
+        {
+            // ...otherwise, perform general variant swap:
+            variant tmp( detail::variant::move(rhs) );
+            rhs = detail::variant::move(*this);
+            *this = detail::variant::move(tmp);
+        }
+    }
+
+public: // queries
+
+    //
+    // NOTE: member which() defined above.
+    //
+
+    bool empty() const BOOST_NOEXCEPT
+    {
+        return false;
+    }
+
+    const boost::typeindex::type_info& type() const
+    {
+        detail::variant::reflect visitor;
+        return this->apply_visitor(visitor);
+    }
+
+public: // prevent comparison with foreign types
+
+// Obsolete. Remove.
+#   define BOOST_VARIANT_AUX_FAIL_COMPARISON_RETURN_TYPE \
+    void
+
+    template <typename U>
+    void operator==(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+    template <typename U>
+    void operator<(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+    template <typename U>
+    void operator!=(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+    template <typename U>
+    void operator>(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+    template <typename U>
+    void operator<=(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+    template <typename U>
+    void operator>=(const U&) const
+    {
+        BOOST_STATIC_ASSERT( false && sizeof(U) );
+    }
+
+public: // comparison operators
+
+    // [MSVC6 requires these operators appear after template operators]
+
+    bool operator==(const variant& rhs) const
+    {
+        if (this->which() != rhs.which())
+            return false;
+
+        detail::variant::comparer<
+              variant, detail::variant::equal_comp
+            > visitor(*this);
+        return rhs.apply_visitor(visitor);
+    }
+
+    bool operator<(const variant& rhs) const
+    {
+        //
+        // Dirk Schreib suggested this collating order.
+        //
+
+        if (this->which() != rhs.which())
+            return this->which() < rhs.which();
+
+        detail::variant::comparer<
+              variant, detail::variant::less_comp
+            > visitor(*this);
+        return rhs.apply_visitor(visitor);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////
+    // comparison operators != > <= >=
+    inline bool operator!=(const variant& rhs) const
+    {
+        return !(*this == rhs);
+    }
+
+    inline bool operator>(const variant& rhs) const
+    {
+        return rhs < *this;
+    }
+
+    inline bool operator<=(const variant& rhs) const
+    {
+        return !(*this > rhs);
+    }
+
+    inline bool operator>=(const variant& rhs) const
+    {
+        return !(*this < rhs);
+    }
+
+// helpers, for visitation support (below) -- private when possible
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+
+    template < BOOST_VARIANT_ENUM_PARAMS(typename U) >
+    friend class variant;
+
+private:
+
+#else// defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+
+public:
+
+#endif// !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+
+    template <typename Visitor, typename VoidPtrCV>
+    static
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+              typename Visitor::result_type
+            )
+    internal_apply_visitor_impl(
+          int internal_which
+        , int logical_which
+        , Visitor& visitor
+        , VoidPtrCV storage
+        )
+    {
+        typedef mpl::int_<0> first_which;
+        typedef typename mpl::begin<internal_types>::type first_it;
+        typedef typename mpl::end<internal_types>::type last_it;
+
+        typedef detail::variant::visitation_impl_step<
+              first_it, last_it
+            > first_step;
+
+        return detail::variant::visitation_impl(
+              internal_which, logical_which
+            , visitor, storage, mpl::false_()
+            , never_uses_backup_flag()
+            , static_cast<first_which*>(0), static_cast<first_step*>(0)
+            );
+    }
+
+    template <typename Visitor>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+              typename Visitor::result_type
+            )
+    internal_apply_visitor(Visitor& visitor)
+    {
+        return internal_apply_visitor_impl(
+              which_, which(), visitor, storage_.address()
+            );
+    }
+
+    template <typename Visitor>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+              typename Visitor::result_type
+            )
+    internal_apply_visitor(Visitor& visitor) const
+    {
+        return internal_apply_visitor_impl(
+              which_, which(), visitor, storage_.address()
+            );
+    }
+
+public: // visitation support
+
+    template <typename Visitor>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+              typename Visitor::result_type
+            )
+    apply_visitor(Visitor& visitor)
+    {
+        detail::variant::invoke_visitor<Visitor> invoker(visitor);
+        return this->internal_apply_visitor(invoker);
+    }
+
+    template <typename Visitor>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(
+              typename Visitor::result_type
+            )
+    apply_visitor(Visitor& visitor) const
+    {
+        detail::variant::invoke_visitor<Visitor> invoker(visitor);
+        return this->internal_apply_visitor(invoker);
+    }
+
+}; // class variant
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_variant_over
+//
+// See docs and boost/variant/variant_fwd.hpp for more information.
+//
+template <typename Types>
+struct make_variant_over
+{
+private: // precondition assertions
+
+    BOOST_STATIC_ASSERT(( ::boost::mpl::is_sequence<Types>::value ));
+
+public: // metafunction result
+
+    typedef variant<
+          detail::variant::over_sequence< Types >
+        > type;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// function template swap
+//
+// Swaps two variants of the same type (i.e., identical specification).
+//
+template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline void swap(
+      variant< BOOST_VARIANT_ENUM_PARAMS(T) >& lhs
+    , variant< BOOST_VARIANT_ENUM_PARAMS(T) >& rhs
+    )
+{
+    lhs.swap(rhs);
+}
+
+} // namespace boost
+
+// implementation additions
+
+#if !defined(BOOST_NO_IOSTREAM)
+#include "boost/variant/detail/variant_io.hpp"
+#endif // BOOST_NO_IOSTREAM
+
+#endif // BOOST_VARIANT_VARIANT_HPP
diff --git a/gatb-core/thirdparty/boost/variant/variant_fwd.hpp b/gatb-core/thirdparty/boost/variant/variant_fwd.hpp
new file mode 100644
index 0000000..4bf90aa
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/variant_fwd.hpp
@@ -0,0 +1,333 @@
+//-----------------------------------------------------------------------------
+// boost variant/variant_fwd.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2003 Eric Friedman, Itay Maman
+// Copyright (c) 2013 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_VARIANT_FWD_HPP
+#define BOOST_VARIANT_VARIANT_FWD_HPP
+
+#include "boost/variant/detail/config.hpp"
+
+#include "boost/blank_fwd.hpp"
+#include "boost/mpl/arg.hpp"
+#include "boost/mpl/limits/arity.hpp"
+#include "boost/mpl/aux_/na.hpp"
+#include "boost/preprocessor/cat.hpp"
+#include "boost/preprocessor/enum.hpp"
+#include "boost/preprocessor/enum_params.hpp"
+#include "boost/preprocessor/enum_shifted_params.hpp"
+#include "boost/preprocessor/repeat.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_NO_REFERENCE_SUPPORT
+//
+// Defined if variant does not support references as bounded types. 
+//
+#if defined(BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING) \
+ && !defined(BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND) \
+ && !defined(BOOST_VARIANT_NO_REFERENCE_SUPPORT)
+#   define BOOST_VARIANT_NO_REFERENCE_SUPPORT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT
+//
+// Defined if variant does not support make_variant_over (see below). 
+//
+#if defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+#   define BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
+//
+// Defined if make_recursive_variant cannot be supported as documented.
+//
+// Note: Currently, MPL lambda facility is used as workaround if defined, and
+// so only types declared w/ MPL lambda workarounds will work.
+//
+
+#include "boost/variant/detail/substitute_fwd.hpp"
+
+#if defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE) \
+  && !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
+#   define BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
+#endif
+
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+//
+
+/* 
+    GCC before 4.0 had no variadic tempaltes; 
+    GCC 4.6 has incomplete implementation of variadic templates.
+
+    MSVC2013 has variadic templates, but they have issues.
+
+    NOTE: Clang compiler defines __GNUC__
+*/
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) \
+  || (!defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) \
+  || (defined(_MSC_VER) && (_MSC_VER <= 1900)) \
+  || defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE) \
+  || defined (BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
+
+#ifndef BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+#   define BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+#endif
+
+#endif
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_VARIANT_CLASS_OR_TYPENAME_TO_SEQ_class class)(
+#define BOOST_VARIANT_CLASS_OR_TYPENAME_TO_SEQ_typename typename)(
+
+#define BOOST_VARIANT_CLASS_OR_TYPENAME_TO_VARIADIC_class class...
+#define BOOST_VARIANT_CLASS_OR_TYPENAME_TO_VARIADIC_typename typename...
+
+#define ARGS_VARIADER_1(x) x ## N...
+#define ARGS_VARIADER_2(x) BOOST_VARIANT_CLASS_OR_TYPENAME_TO_VARIADIC_ ## x ## N
+
+#define BOOST_VARIANT_MAKE_VARIADIC(sequence, x)        BOOST_VARIANT_MAKE_VARIADIC_I(BOOST_PP_SEQ_SIZE(sequence), x)
+#define BOOST_VARIANT_MAKE_VARIADIC_I(argscount, x)     BOOST_VARIANT_MAKE_VARIADIC_II(argscount, x)
+#define BOOST_VARIANT_MAKE_VARIADIC_II(argscount, orig) ARGS_VARIADER_ ## argscount(orig)
+
+///////////////////////////////////////////////////////////////////////////////
+// BOOST_VARIANT_ENUM_PARAMS and BOOST_VARIANT_ENUM_SHIFTED_PARAMS
+//
+// Convenience macro for enumeration of variant params.
+// When variadic templates are available expands:
+//      BOOST_VARIANT_ENUM_PARAMS(class Something)      => class Something0, class... SomethingN
+//      BOOST_VARIANT_ENUM_PARAMS(typename Something)   => typename Something0, typename... SomethingN
+//      BOOST_VARIANT_ENUM_PARAMS(Something)            => Something0, SomethingN...
+//      BOOST_VARIANT_ENUM_PARAMS(Something)            => Something0, SomethingN...
+//      BOOST_VARIANT_ENUM_SHIFTED_PARAMS(class Something)      => class... SomethingN
+//      BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Something)   => typename... SomethingN
+//      BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Something)            => SomethingN...
+//      BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Something)            => SomethingN...
+//
+// Rationale: Cleaner, simpler code for clients of variant library. Minimal 
+// code modifications to move from C++03 to C++11.
+//
+// With BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES defined
+// will be used BOOST_VARIANT_ENUM_PARAMS and BOOST_VARIANT_ENUM_SHIFTED_PARAMS from below `#else`
+//
+
+#define BOOST_VARIANT_ENUM_PARAMS(x) \
+    x ## 0, \
+    BOOST_VARIANT_MAKE_VARIADIC( (BOOST_VARIANT_CLASS_OR_TYPENAME_TO_SEQ_ ## x), x) \
+    /**/
+
+#define BOOST_VARIANT_ENUM_SHIFTED_PARAMS(x) \
+    BOOST_VARIANT_MAKE_VARIADIC( (BOOST_VARIANT_CLASS_OR_TYPENAME_TO_SEQ_ ## x), x) \
+    /**/
+
+#else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_LIMIT_TYPES
+//
+// Implementation-defined preprocessor symbol describing the actual
+// length of variant's pseudo-variadic template parameter list.
+//
+#include "boost/mpl/limits/list.hpp"
+#define BOOST_VARIANT_LIMIT_TYPES \
+    BOOST_MPL_LIMIT_LIST_SIZE
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_RECURSIVE_VARIANT_MAX_ARITY
+//
+// Exposes maximum allowed arity of class templates with recursive_variant
+// arguments. That is,
+//   make_recursive_variant< ..., T<[1], recursive_variant_, ... [N]> >.
+//
+#include "boost/mpl/limits/arity.hpp"
+#define BOOST_VARIANT_RECURSIVE_VARIANT_MAX_ARITY \
+    BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_ENUM_PARAMS
+//
+// Convenience macro for enumeration of BOOST_VARIANT_LIMIT_TYPES params.
+//
+// Rationale: Cleaner, simpler code for clients of variant library.
+//
+#define BOOST_VARIANT_ENUM_PARAMS( param )  \
+    BOOST_PP_ENUM_PARAMS(BOOST_VARIANT_LIMIT_TYPES, param)
+
+///////////////////////////////////////////////////////////////////////////////
+// macro BOOST_VARIANT_ENUM_SHIFTED_PARAMS
+//
+// Convenience macro for enumeration of BOOST_VARIANT_LIMIT_TYPES-1 params.
+//
+#define BOOST_VARIANT_ENUM_SHIFTED_PARAMS( param )  \
+    BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_VARIANT_LIMIT_TYPES, param)
+
+#endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
+
+
+namespace boost {
+
+namespace detail { namespace variant {
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) class void_ and class template convert_void
+// 
+// Provides the mechanism by which void(NN) types are converted to
+// mpl::void_ (and thus can be passed to mpl::list).
+//
+// Rationale: This is particularly needed for the using-declarations
+// workaround (below), but also to avoid associating mpl namespace with
+// variant in argument dependent lookups (which used to happen because of
+// defaulting of template parameters to mpl::void_).
+//
+
+struct void_;
+
+template <typename T>
+struct convert_void
+{
+    typedef T type;
+};
+
+template <>
+struct convert_void< void_ >
+{
+    typedef mpl::na type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// (workaround) BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
+//
+// Needed to work around compilers that don't support using-declaration
+// overloads. (See the variant::initializer workarounds below.)
+//
+
+#if defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+// (detail) tags voidNN -- NN defined on [0, BOOST_VARIANT_LIMIT_TYPES)
+//
+// Defines void types that are each unique and specializations of
+// convert_void that yields mpl::na for each voidNN type.
+//
+
+#define BOOST_VARIANT_DETAIL_DEFINE_VOID_N(z,N,_)          \
+    struct BOOST_PP_CAT(void,N);                           \
+                                                           \
+    template <>                                            \
+    struct convert_void< BOOST_PP_CAT(void,N) >            \
+    {                                                      \
+        typedef mpl::na type;                              \
+    };                                                     \
+    /**/
+
+BOOST_PP_REPEAT(
+      BOOST_VARIANT_LIMIT_TYPES
+    , BOOST_VARIANT_DETAIL_DEFINE_VOID_N
+    , _
+    )
+
+#undef BOOST_VARIANT_DETAIL_DEFINE_VOID_N
+
+#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
+
+}} // namespace detail::variant
+
+#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+#   define BOOST_VARIANT_AUX_DECLARE_PARAMS BOOST_VARIANT_ENUM_PARAMS(typename T)
+#else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
+
+///////////////////////////////////////////////////////////////////////////////
+// (detail) macro BOOST_VARIANT_AUX_DECLARE_PARAM
+//
+// Template parameter list for variant and recursive_variant declarations.
+//
+
+#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+#   define BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL(z, N, T) \
+    typename BOOST_PP_CAT(T,N) = detail::variant::void_ \
+    /**/
+
+#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
+
+#   define BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL(z, N, T) \
+    typename BOOST_PP_CAT(T,N) = BOOST_PP_CAT(detail::variant::void,N) \
+    /**/
+
+#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
+
+#define BOOST_VARIANT_AUX_DECLARE_PARAMS \
+    BOOST_PP_ENUM( \
+          BOOST_VARIANT_LIMIT_TYPES \
+        , BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL \
+        , T \
+        ) \
+    /**/
+
+#endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
+
+///////////////////////////////////////////////////////////////////////////////
+// class template variant (concept inspired by Andrei Alexandrescu)
+//
+// Efficient, type-safe bounded discriminated union.
+//
+// Preconditions:
+//  - Each type must be unique.
+//  - No type may be const-qualified.
+//
+// Proper declaration form:
+//   variant<types>    (where types is a type-sequence)
+// or
+//   variant<T0,T1,...,Tn>  (where T0 is NOT a type-sequence)
+//
+template < BOOST_VARIANT_AUX_DECLARE_PARAMS > class variant;
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_recursive_variant
+//
+// Exposes a boost::variant with recursive_variant_ tags (below) substituted
+// with the variant itself (wrapped as needed with boost::recursive_wrapper).
+//
+template < BOOST_VARIANT_AUX_DECLARE_PARAMS > struct make_recursive_variant;
+
+#undef BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL
+#undef BOOST_VARIANT_AUX_DECLARE_PARAMS
+
+///////////////////////////////////////////////////////////////////////////////
+// type recursive_variant_
+//
+// Tag type indicates where recursive variant substitution should occur.
+//
+#if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
+    struct recursive_variant_ {};
+#else
+    typedef mpl::arg<1> recursive_variant_;
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_variant_over
+//
+// Result is a variant w/ types of the specified type sequence.
+//
+template <typename Types> struct make_variant_over;
+
+///////////////////////////////////////////////////////////////////////////////
+// metafunction make_recursive_variant_over
+//
+// Result is a recursive variant w/ types of the specified type sequence.
+//
+template <typename Types> struct make_recursive_variant_over;
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_VARIANT_FWD_HPP
diff --git a/gatb-core/thirdparty/boost/variant/visitor_ptr.hpp b/gatb-core/thirdparty/boost/variant/visitor_ptr.hpp
new file mode 100644
index 0000000..4ddb921
--- /dev/null
+++ b/gatb-core/thirdparty/boost/variant/visitor_ptr.hpp
@@ -0,0 +1,117 @@
+//-----------------------------------------------------------------------------
+// boost variant/visitor_ptr.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_VISITOR_PTR_HPP
+#define BOOST_VARIANT_VISITOR_PTR_HPP
+
+#include "boost/variant/bad_visit.hpp"
+#include "boost/variant/static_visitor.hpp"
+
+#include "boost/mpl/eval_if.hpp"
+#include "boost/mpl/identity.hpp"
+#include "boost/throw_exception.hpp"
+#include "boost/type_traits/add_reference.hpp"
+#include "boost/type_traits/is_reference.hpp"
+#include "boost/type_traits/is_void.hpp"
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// function template visitor_ptr
+//
+// Adapts a function pointer for use as visitor capable of handling
+// values of a single type. Throws bad_visit if inappropriately applied.
+//
+template <typename T, typename R>
+class visitor_ptr_t
+    : public static_visitor<R>
+{
+private: // representation
+
+    typedef R (*visitor_t)(T);
+
+    visitor_t visitor_;
+
+public: // typedefs
+
+    typedef R result_type;
+
+private: // private typedefs
+
+    typedef typename mpl::eval_if<
+          is_reference<T>
+        , mpl::identity<T>
+        , add_reference<const T>
+        >::type argument_fwd_type;
+
+public: // structors
+
+    explicit visitor_ptr_t(visitor_t visitor) BOOST_NOEXCEPT
+      : visitor_(visitor)
+    {
+    }
+
+public: // static visitor interfaces
+
+    template <typename U>
+    result_type operator()(const U&) const
+    {
+        boost::throw_exception(bad_visit());
+    }
+
+#if !defined(BOOST_NO_VOID_RETURNS)
+
+public: // static visitor interfaces, cont.
+
+    result_type operator()(argument_fwd_type operand) const
+    {
+        return visitor_(operand);
+    }
+
+#else // defined(BOOST_NO_VOID_RETURNS)
+
+private: // helpers, for static visitor interfaces (below)
+
+    result_type execute_impl(argument_fwd_type operand, mpl::false_) const
+    {
+        return visitor_(operand);
+    }
+
+        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
+    execute_impl(argument_fwd_type operand, mpl::true_) const
+    {
+        visitor_(operand);
+        BOOST_VARIANT_AUX_RETURN_VOID;
+    }
+
+public: // static visitor interfaces, cont.
+
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
+    operator()(argument_fwd_type operand) const
+    {
+        typedef typename is_void<result_type>::type has_void_result;
+        return execute_impl(operand, has_void_result());
+    }
+
+#endif // BOOST_NO_VOID_RETURNS workaround
+
+};
+
+template <typename R, typename T>
+inline visitor_ptr_t<T,R> visitor_ptr(R (*visitor)(T))
+{
+    return visitor_ptr_t<T,R>(visitor);
+}
+
+} // namespace boost
+
+#endif// BOOST_VISITOR_VISITOR_PTR_HPP
diff --git a/gatb-core/thirdparty/hdf5/ACKNOWLEDGMENTS b/gatb-core/thirdparty/hdf5/ACKNOWLEDGMENTS
new file mode 100644
index 0000000..f1b5b45
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/ACKNOWLEDGMENTS
@@ -0,0 +1,18 @@
+Acknowledgments - November 2010
+-------------------------------
+
+We would like to thank the following people who have contributed directly
+or indirectly to HDF5:
+
+Werner Benger, for contributing code used to add support for the Windows 
+Threading library included in the 1.8.6 release.
+
+John A. Biddiscombe, Mike Jackson, and Sean McBride for contributing and
+testing CMake code included in the HDF5 1.8.5 distribution.
+
+The HDF5 community for helping shape the development of HDF5 by contributing
+bug reports and patches, joining in on forum discussions, and continually
+supporting our software.
+
+Finally, we'd like to thank all organizations whose funding has made HDF5 
+possible.
diff --git a/gatb-core/thirdparty/hdf5/CMakeFilters.cmake b/gatb-core/thirdparty/hdf5/CMakeFilters.cmake
new file mode 100644
index 0000000..262317e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/CMakeFilters.cmake
@@ -0,0 +1,130 @@
+
+include (ExternalProject)
+#option (HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO GIT SVN TGZ)" "NO")
+set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO SVN TGZ)")
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
+if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  option (ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" 1)
+  option (SZIP_USE_EXTERNAL "Use External Library Building for SZIP" 1)
+  if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT")
+    set (ZLIB_URL ${ZLIB_GIT_URL} CACHE STRING "Path to zlib git repository")
+    set (ZLIB_BRANCH ${ZLIB_GIT_BRANCH})
+    set (SZIP_URL ${SZIP_GIT_URL} CACHE STRING "Path to szip git repository")
+    set (SZIP_BRANCH ${SZIP_GIT_BRANCH})
+  elseif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN")
+    set (ZLIB_URL ${ZLIB_SVN_URL} CACHE STRING "Path to zlib Subversion repository")
+    set (SZIP_URL ${SZIP_SVN_URL} CACHE STRING "Path to szip Subversion repository")
+  elseif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+    if (NOT TGZPATH)
+      set (TGZPATH ${HDF5_SOURCE_DIR})
+    endif (NOT TGZPATH)
+    set (ZLIB_URL ${TGZPATH}/${ZLIB_TGZ_NAME})
+    set (SZIP_URL ${TGZPATH}/${SZIP_TGZ_NAME})
+  else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT")
+    set (ZLIB_USE_EXTERNAL 0)
+    set (SZIP_USE_EXTERNAL 0)
+  endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT")
+endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+
+#-----------------------------------------------------------------------------
+# Option for ZLib support
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" OFF)
+if (HDF5_ENABLE_Z_LIB_SUPPORT)
+  if (NOT H5_ZLIB_HEADER)
+    if (NOT ZLIB_USE_EXTERNAL)
+      find_package (ZLIB NAMES ${ZLIB_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS static shared)
+      if (NOT ZLIB_FOUND)
+        find_package (ZLIB) # Legacy find
+        if (ZLIB_FOUND)
+          set (LINK_LIBS ${LINK_LIBS} ${ZLIB_LIBRARIES})
+          set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${ZLIB_LIBRARIES})
+        endif (ZLIB_FOUND)
+      endif (NOT ZLIB_FOUND)
+    endif (NOT ZLIB_USE_EXTERNAL)
+    if (ZLIB_FOUND)
+      set (H5_HAVE_FILTER_DEFLATE 1)
+      set (H5_HAVE_ZLIB_H 1)
+      set (H5_HAVE_LIBZ 1)
+      set (H5_ZLIB_HEADER "zlib.h")
+      set (ZLIB_INCLUDE_DIR_GEN ${ZLIB_INCLUDE_DIR})
+      set (ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR})
+    else (ZLIB_FOUND)
+      if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+        EXTERNAL_ZLIB_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
+        set (H5_HAVE_FILTER_DEFLATE 1)
+        set (H5_HAVE_ZLIB_H 1)
+        set (H5_HAVE_LIBZ 1)
+        message (STATUS "Filter ZLIB is built")
+      else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+        #message (FATAL_ERROR " ZLib is Required for ZLib support in HDF5") # let's be more relaxed here for GATB: if Zlib is not found, don't insist and we'll just compile without zlib
+	message(STATUS "zlib not found, compiling without zlib support")
+	set (H5_GATB_GIVE_UP_ZLIB 1)
+      endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+    endif (ZLIB_FOUND)
+  else (NOT H5_ZLIB_HEADER)
+    # This project is being called from within another and ZLib is already configured
+    set (H5_HAVE_FILTER_DEFLATE 1)
+    set (H5_HAVE_ZLIB_H 1)
+    set (H5_HAVE_LIBZ 1)
+  endif (NOT H5_ZLIB_HEADER)
+  if (NOT H5_GATB_GIVE_UP_ZLIB)
+	  if (H5_HAVE_FILTER_DEFLATE)
+	    set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} DEFLATE")
+	  endif (H5_HAVE_FILTER_DEFLATE)
+	  if (BUILD_SHARED_LIBS)
+	    set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${ZLIB_SHARED_LIBRARY})
+	  endif (BUILD_SHARED_LIBS)
+	  set (LINK_LIBS ${LINK_LIBS} ${ZLIB_STATIC_LIBRARY})
+	  INCLUDE_DIRECTORIES (${ZLIB_INCLUDE_DIRS})
+	  message (STATUS "Filter ZLIB is ON")
+   endif (NOT H5_GATB_GIVE_UP_ZLIB)
+endif (HDF5_ENABLE_Z_LIB_SUPPORT)
+
+#-----------------------------------------------------------------------------
+# Option for SzLib support
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_SZIP_SUPPORT "Use SZip Filter" OFF)
+if (HDF5_ENABLE_SZIP_SUPPORT)
+  option (HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding" OFF)
+  if (NOT SZIP_USE_EXTERNAL)
+    find_package (SZIP NAMES ${SZIP_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS static shared)
+    if (NOT SZIP_FOUND)
+      find_package (SZIP) # Legacy find
+      if (SZIP_FOUND)
+        set (LINK_LIBS ${LINK_LIBS} ${SZIP_LIBRARIES})
+        set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${SZIP_LIBRARIES})
+      endif (SZIP_FOUND)
+    endif (NOT SZIP_FOUND)
+  endif (NOT SZIP_USE_EXTERNAL)
+  if (SZIP_FOUND)
+    set (H5_HAVE_FILTER_SZIP 1)
+    set (H5_HAVE_SZLIB_H 1)
+    set (H5_HAVE_LIBSZ 1)
+    set (SZIP_INCLUDE_DIR_GEN ${SZIP_INCLUDE_DIR})
+    set (SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIRS} ${SZIP_INCLUDE_DIR})
+  else (SZIP_FOUND)
+    if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+      EXTERNAL_SZIP_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT} ${HDF5_ENABLE_SZIP_ENCODING})
+      set (H5_HAVE_FILTER_SZIP 1)
+      set (H5_HAVE_SZLIB_H 1)
+      set (H5_HAVE_LIBSZ 1)
+      message (STATUS "Filter SZIP is built")
+    else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+      message (FATAL_ERROR "SZIP is Required for SZIP support in HDF5")
+    endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  endif (SZIP_FOUND)
+  if (BUILD_SHARED_LIBS)
+    set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${SZIP_SHARED_LIBRARY})
+  endif (BUILD_SHARED_LIBS)
+  set (LINK_LIBS ${LINK_LIBS} ${SZIP_STATIC_LIBRARY})
+  INCLUDE_DIRECTORIES (${SZIP_INCLUDE_DIRS})
+  message (STATUS "Filter SZIP is ON")
+  if (H5_HAVE_FILTER_SZIP)
+    set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} DECODE")
+  endif (H5_HAVE_FILTER_SZIP)
+  if (HDF5_ENABLE_SZIP_ENCODING)
+    set (H5_HAVE_SZIP_ENCODER 1)
+    set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} ENCODE")
+  endif (HDF5_ENABLE_SZIP_ENCODING)
+endif (HDF5_ENABLE_SZIP_SUPPORT)
diff --git a/gatb-core/thirdparty/hdf5/CMakeInstallation.cmake b/gatb-core/thirdparty/hdf5/CMakeInstallation.cmake
new file mode 100644
index 0000000..140bac3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/CMakeInstallation.cmake
@@ -0,0 +1,603 @@
+include (CMakePackageConfigHelpers)
+
+#-----------------------------------------------------------------------------
+# Check for Installation Utilities
+#-----------------------------------------------------------------------------
+if (WIN32)
+  set (PF_ENV_EXT "(x86)")
+  find_program (NSIS_EXECUTABLE NSIS.exe PATHS "$ENV{ProgramFiles}\\NSIS" "$ENV{ProgramFiles${PF_ENV_EXT}}\\NSIS")
+  if(NOT CPACK_WIX_ROOT)
+    file(TO_CMAKE_PATH "$ENV{WIX}" CPACK_WIX_ROOT)
+  endif()
+  find_program (WIX_EXECUTABLE candle  PATHS "${CPACK_WIX_ROOT}/bin")
+endif (WIN32)
+
+#-----------------------------------------------------------------------------
+# Add file(s) to CMake Install
+#-----------------------------------------------------------------------------
+if (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+  install (
+      FILES ${PROJECT_BINARY_DIR}/H5pubconf.h
+      DESTINATION ${HDF5_INSTALL_INCLUDE_DIR}
+      COMPONENT headers
+  )
+endif (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+
+#-----------------------------------------------------------------------------
+# Add Target(s) to CMake Install for import into other projects
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  install (
+      EXPORT ${HDF5_EXPORTED_TARGETS}
+      DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
+      FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
+      NAMESPACE ${HDF5_PACKAGE}::
+      COMPONENT configinstall
+  )
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+#-----------------------------------------------------------------------------
+# Export all exported targets to the build tree for use by parent project
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  export (
+      TARGETS ${HDF5_LIBRARIES_TO_EXPORT} ${HDF5_LIB_DEPENDENCIES} ${HDF5_UTILS_TO_EXPORT}
+      FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
+      NAMESPACE ${HDF5_PACKAGE}::
+  )
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+#-----------------------------------------------------------------------------
+# Set includes needed for build
+#-----------------------------------------------------------------------------
+set (HDF5_INCLUDES_BUILD_TIME
+    ${HDF5_SRC_DIR} ${HDF5_CPP_SRC_DIR} ${HDF5_HL_SRC_DIR}
+    ${HDF5_TOOLS_SRC_DIR} ${HDF5_BINARY_DIR}
+)
+
+#-----------------------------------------------------------------------------
+# Set variables needed for installation
+#-----------------------------------------------------------------------------
+set (HDF5_VERSION_STRING ${HDF5_PACKAGE_VERSION})
+set (HDF5_VERSION_MAJOR  ${HDF5_PACKAGE_VERSION_MAJOR})
+set (HDF5_VERSION_MINOR  ${HDF5_PACKAGE_VERSION_MINOR})
+
+#-----------------------------------------------------------------------------
+# Configure the hdf5-config.cmake file for the build directory
+#-----------------------------------------------------------------------------
+set (INCLUDE_INSTALL_DIR ${HDF5_INSTALL_INCLUDE_DIR})
+set (SHARE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_INSTALL_CMAKE_DIR}" )
+set (CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" )
+configure_package_config_file (
+    ${HDF_RESOURCES_DIR}/hdf5-config.cmake.in
+    "${HDF5_BINARY_DIR}/${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake"
+    INSTALL_DESTINATION "${HDF5_INSTALL_CMAKE_DIR}"
+    PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR
+    INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
+)
+
+#-----------------------------------------------------------------------------
+# Configure the hdf5-config.cmake file for the install directory
+#-----------------------------------------------------------------------------
+set (INCLUDE_INSTALL_DIR ${HDF5_INSTALL_INCLUDE_DIR})
+set (SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${HDF5_INSTALL_CMAKE_DIR}" )
+set (CURRENT_BUILD_DIR "${CMAKE_INSTALL_PREFIX}" )
+configure_package_config_file (
+    ${HDF_RESOURCES_DIR}/hdf5-config.cmake.in
+    "${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake"
+    INSTALL_DESTINATION "${HDF5_INSTALL_CMAKE_DIR}"
+    PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR
+)
+
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  install (
+      FILES ${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake
+      DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
+      COMPONENT configinstall
+  )
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+#-----------------------------------------------------------------------------
+# Configure the hdf5-config-version .cmake file for the install directory
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  configure_file (
+      ${HDF_RESOURCES_DIR}/hdf5-config-version.cmake.in
+      ${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-config-version.cmake @ONLY
+  )
+  install (
+      FILES ${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-config-version.cmake
+      DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
+      COMPONENT configinstall
+  )
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+#-----------------------------------------------------------------------------
+# Configure the libhdf5.settings file for the lib info
+#-----------------------------------------------------------------------------
+if (H5_WORDS_BIGENDIAN)
+  set (BYTESEX big-endian)
+else (H5_WORDS_BIGENDIAN)
+  set (BYTESEX little-endian)
+endif (H5_WORDS_BIGENDIAN)
+configure_file (
+    ${HDF_RESOURCES_DIR}/libhdf5.settings.cmake.in
+    ${HDF5_BINARY_DIR}/libhdf5.settings @ONLY
+)
+install (
+    FILES ${HDF5_BINARY_DIR}/libhdf5.settings
+    DESTINATION ${HDF5_INSTALL_LIB_DIR}
+    COMPONENT libraries
+)
+
+#-----------------------------------------------------------------------------
+# Configure the HDF518_Examples.cmake file and the examples
+#-----------------------------------------------------------------------------
+option (HDF5_PACK_EXAMPLES  "Package the HDF5 Library Examples Compressed File" OFF)
+if (HDF5_PACK_EXAMPLES)
+  configure_file (
+      ${HDF_RESOURCES_DIR}/HDF518_Examples.cmake.in
+      ${HDF5_BINARY_DIR}/HDF518_Examples.cmake @ONLY
+  )
+  install (
+      FILES ${HDF5_BINARY_DIR}/HDF518_Examples.cmake
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      COMPONENT hdfdocuments
+  )
+  if (EXISTS "${HDF5_EXAMPLES_COMPRESSED_DIR}/${HDF5_EXAMPLES_COMPRESSED}")
+    execute_process(
+        COMMAND ${CMAKE_COMMAND} -E tar xzf ${HDF5_EXAMPLES_COMPRESSED_DIR}/${HDF5_EXAMPLES_COMPRESSED}
+    )
+    install (
+      DIRECTORY ${HDF5_BINARY_DIR}/HDF5Examples
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      USE_SOURCE_PERMISSIONS
+      COMPONENT hdfdocuments
+    )
+    install (
+        FILES
+            ${HDF5_SOURCE_DIR}/release_docs/USING_CMake_Examples.txt
+        DESTINATION ${HDF5_INSTALL_DATA_DIR}
+        COMPONENT hdfdocuments
+    )
+  endif (EXISTS "${HDF5_EXAMPLES_COMPRESSED_DIR}/${HDF5_EXAMPLES_COMPRESSED}")
+endif (HDF5_PACK_EXAMPLES)
+
+#-----------------------------------------------------------------------------
+# Configure the README.txt file for the binary package
+#-----------------------------------------------------------------------------
+HDF_README_PROPERTIES(HDF5_BUILD_FORTRAN)
+
+#-----------------------------------------------------------------------------
+# Configure the COPYING.txt file for the windows binary package
+#-----------------------------------------------------------------------------
+if (WIN32)
+  configure_file (${HDF5_SOURCE_DIR}/COPYING ${HDF5_BINARY_DIR}/COPYING.txt @ONLY)
+endif (WIN32)
+
+#-----------------------------------------------------------------------------
+# Add Document File(s) to CMake Install
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  install (
+      FILES
+          ${HDF5_SOURCE_DIR}/COPYING
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      COMPONENT hdfdocuments
+  )
+  if (EXISTS "${HDF5_SOURCE_DIR}/release_docs" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/release_docs")
+    set (release_files
+        ${HDF5_SOURCE_DIR}/release_docs/USING_HDF5_CMake.txt
+        ${HDF5_SOURCE_DIR}/release_docs/COPYING
+        ${HDF5_SOURCE_DIR}/release_docs/RELEASE.txt
+    )
+    if (WIN32)
+      set (release_files
+          ${release_files}
+          ${HDF5_SOURCE_DIR}/release_docs/USING_HDF5_VS.txt
+      )
+    endif (WIN32)
+    if (HDF5_PACK_INSTALL_DOCS)
+      set (release_files
+          ${release_files}
+          ${HDF5_SOURCE_DIR}/release_docs/INSTALL_CMake.txt
+          ${HDF5_SOURCE_DIR}/release_docs/HISTORY-1_8.txt
+          ${HDF5_SOURCE_DIR}/release_docs/INSTALL
+      )
+      if (WIN32)
+        set (release_files
+            ${release_files}
+            ${HDF5_SOURCE_DIR}/release_docs/INSTALL_Windows.txt
+        )
+      endif (WIN32)
+      if (CYGWIN)
+        set (release_files
+            ${release_files}
+            ${HDF5_SOURCE_DIR}/release_docs/INSTALL_Cygwin.txt
+        )
+      endif (CYGWIN)
+      if (HDF5_ENABLE_PARALLEL)
+        set (release_files
+            ${release_files}
+            ${HDF5_SOURCE_DIR}/release_docs/INSTALL_parallel
+        )
+      endif (HDF5_ENABLE_PARALLEL)
+    endif (HDF5_PACK_INSTALL_DOCS)
+    install (
+        FILES ${release_files}
+        DESTINATION ${HDF5_INSTALL_DATA_DIR}
+        COMPONENT hdfdocuments
+    )
+  endif (EXISTS "${HDF5_SOURCE_DIR}/release_docs" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/release_docs")
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  if (CMAKE_HOST_UNIX)
+    set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/HDF_Group/${HDF5_PACKAGE_NAME}/${HDF5_PACKAGE_VERSION}"
+      CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
+  else (CMAKE_HOST_UNIX)
+    GetDefaultWindowsPrefixBase(CMAKE_GENERIC_PROGRAM_FILES)
+    set (CMAKE_INSTALL_PREFIX
+      "${CMAKE_GENERIC_PROGRAM_FILES}/HDF_Group/${HDF5_PACKAGE_NAME}/${HDF5_PACKAGE_VERSION}"
+      CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
+    set (CMAKE_GENERIC_PROGRAM_FILES)
+  endif (CMAKE_HOST_UNIX)
+endif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+#-----------------------------------------------------------------------------
+# Set the cpack variables
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
+  set (CPACK_PACKAGE_VENDOR "HDF_Group")
+  set (CPACK_PACKAGE_NAME "${HDF5_PACKAGE_NAME}")
+  if (CDASH_LOCAL)
+    set (CPACK_PACKAGE_VERSION "${HDF5_PACKAGE_VERSION}")
+  else (CDASH_LOCAL)
+    set (CPACK_PACKAGE_VERSION "${HDF5_PACKAGE_VERSION_STRING}")
+  endif (CDASH_LOCAL)
+  set (CPACK_PACKAGE_VERSION_MAJOR "${HDF5_PACKAGE_VERSION_MAJOR}")
+  set (CPACK_PACKAGE_VERSION_MINOR "${HDF5_PACKAGE_VERSION_MINOR}")
+  set (CPACK_PACKAGE_VERSION_PATCH "")
+  if (EXISTS "${HDF5_SOURCE_DIR}/release_docs")
+    set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt")
+    set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/COPYING")
+    set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt")
+  endif (EXISTS "${HDF5_SOURCE_DIR}/release_docs")
+  set (CPACK_PACKAGE_RELOCATABLE TRUE)
+  if (OVERRIDE_INSTALL_VERSION)
+    set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${OVERRIDE_INSTALL_VERSION}")
+  else (OVERRIDE_INSTALL_VERSION)
+    set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${CPACK_PACKAGE_VERSION}")
+  endif (OVERRIDE_INSTALL_VERSION)
+  set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}/hdf.bmp")
+
+  set (CPACK_GENERATOR "TGZ")
+  if (WIN32)
+    set (CPACK_GENERATOR "ZIP")
+
+    if (NSIS_EXECUTABLE)
+      list (APPEND CPACK_GENERATOR "NSIS")
+    endif (NSIS_EXECUTABLE)
+    # Installers for 32- vs. 64-bit CMake:
+    #  - Root install directory (displayed to end user at installer-run time)
+    #  - "NSIS package/display name" (text used in the installer GUI)
+    #  - Registry key used to store info about the installation
+    set (CPACK_NSIS_PACKAGE_NAME "${HDF5_PACKAGE_STRING}")
+    if (CMAKE_CL_64)
+      set (CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
+      set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION} (Win64)")
+    else (CMAKE_CL_64)
+      set (CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
+      set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
+    endif (CMAKE_CL_64)
+    # set the install/unistall icon used for the installer itself
+    # There is a bug in NSI that does not handle full unix paths properly.
+    set (CPACK_NSIS_MUI_ICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.ico")
+    set (CPACK_NSIS_MUI_UNIICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.ico")
+    # set the package header icon for MUI
+    set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.bmp")
+    set (CPACK_NSIS_DISPLAY_NAME "${CPACK_NSIS_PACKAGE_NAME}")
+    if (OVERRIDE_INSTALL_VERSION)
+      set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${OVERRIDE_INSTALL_VERSION}")
+    else (OVERRIDE_INSTALL_VERSION)
+      set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${CPACK_PACKAGE_VERSION}")
+    endif (OVERRIDE_INSTALL_VERSION)
+    set (CPACK_NSIS_CONTACT "${HDF5_PACKAGE_BUGREPORT}")
+    set (CPACK_NSIS_MODIFY_PATH ON)
+
+    if (WIX_EXECUTABLE)
+      list (APPEND CPACK_GENERATOR "WIX")
+    endif (WIX_EXECUTABLE)
+#WiX variables
+    set (CPACK_WIX_UNINSTALL "1")
+# .. variable:: CPACK_WIX_LICENSE_RTF
+#  RTF License File
+#
+#  If CPACK_RESOURCE_FILE_LICENSE has an .rtf extension it is used as-is.
+#
+#  If CPACK_RESOURCE_FILE_LICENSE has an .txt extension it is implicitly
+#  converted to RTF by the WiX Generator.
+#  The expected encoding of the .txt file is UTF-8.
+#
+#  With CPACK_WIX_LICENSE_RTF you can override the license file used by the
+#  WiX Generator in case CPACK_RESOURCE_FILE_LICENSE is in an unsupported
+#  format or the .txt -> .rtf conversion does not work as expected.
+    set (CPACK_RESOURCE_FILE_LICENSE "${HDF5_BINARY_DIR}/COPYING.txt")
+# .. variable:: CPACK_WIX_PRODUCT_ICON
+#  The Icon shown next to the program name in Add/Remove programs.
+    set(CPACK_WIX_PRODUCT_ICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.ico")
+#
+# .. variable:: CPACK_WIX_UI_BANNER
+#
+#  The bitmap will appear at the top of all installer pages other than the
+#  welcome and completion dialogs.
+#
+#  If set, this image will replace the default banner image.
+#
+#  This image must be 493 by 58 pixels.
+#
+# .. variable:: CPACK_WIX_UI_DIALOG
+#
+#  Background bitmap used on the welcome and completion dialogs.
+#
+#  If this variable is set, the installer will replace the default dialog
+#  image.
+#
+#  This image must be 493 by 312 pixels.
+#
+    set(CPACK_WIX_PROPERTY_ARPCOMMENTS "HDF5 (Hierarchical Data Format 5) Software Library and Utilities")
+    set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT "${HDF5_PACKAGE_URL}")
+    set(CPACK_WIX_PROPERTY_ARPHELPLINK "${HDF5_PACKAGE_BUGREPORT}")
+    if (BUILD_SHARED_LIBS)
+      set(CPACK_WIX_PATCH_FILE "${HDF_RESOURCES_DIR}/patch.xml")
+    endif (BUILD_SHARED_LIBS)
+  elseif (APPLE)
+    list (APPEND CPACK_GENERATOR "STGZ")
+    list (APPEND CPACK_GENERATOR "DragNDrop")
+    set (CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE ON)
+    set (CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}")
+    set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}/hdf.icns")
+
+    option (HDF5_PACK_MACOSX_FRAMEWORK  "Package the HDF5 Library in a Frameworks" OFF)
+    if (HDF5_PACK_MACOSX_FRAMEWORK AND HDF5_BUILD_FRAMEWORKS)
+      set (CPACK_BUNDLE_NAME "${HDF5_PACKAGE_STRING}")
+      set (CPACK_BUNDLE_LOCATION "/")    # make sure CMAKE_INSTALL_PREFIX ends in /
+      set (CMAKE_INSTALL_PREFIX "/${CPACK_BUNDLE_NAME}.framework/Versions/${CPACK_PACKAGE_VERSION}/${CPACK_PACKAGE_NAME}/")
+      set (CPACK_BUNDLE_ICON "${HDF_RESOURCES_EXT_DIR}/hdf.icns")
+      set (CPACK_BUNDLE_PLIST "${HDF5_BINARY_DIR}/CMakeFiles/Info.plist")
+      set (CPACK_SHORT_VERSION_STRING "${CPACK_PACKAGE_VERSION}")
+      #-----------------------------------------------------------------------------
+      # Configure the Info.plist file for the install bundle
+      #-----------------------------------------------------------------------------
+      configure_file (
+          ${HDF_RESOURCES_DIR}/CPack.Info.plist.in
+          ${HDF5_BINARY_DIR}/CMakeFiles/Info.plist @ONLY
+      )
+      configure_file (
+          ${HDF_RESOURCES_DIR}/PkgInfo.in
+          ${HDF5_BINARY_DIR}/CMakeFiles/PkgInfo @ONLY
+      )
+      configure_file (
+          ${HDF_RESOURCES_EXT_DIR}/version.plist.in
+          ${HDF5_BINARY_DIR}/CMakeFiles/version.plist @ONLY
+      )
+      install (
+          FILES ${HDF5_BINARY_DIR}/CMakeFiles/PkgInfo
+          DESTINATION ..
+      )
+    endif (HDF5_PACK_MACOSX_FRAMEWORK AND HDF5_BUILD_FRAMEWORKS)
+  else (WIN32)
+    list (APPEND CPACK_GENERATOR "STGZ")
+    set (CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}")
+    set (CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE ON)
+
+    set (CPACK_DEBIAN_PACKAGE_SECTION "Libraries")
+    set (CPACK_DEBIAN_PACKAGE_MAINTAINER "${HDF5_PACKAGE_BUGREPORT}")
+
+#    list (APPEND CPACK_GENERATOR "RPM")
+    set (CPACK_RPM_PACKAGE_RELEASE "1")
+    set (CPACK_RPM_COMPONENT_INSTALL ON)
+    set (CPACK_RPM_PACKAGE_RELOCATABLE ON)
+    set (CPACK_RPM_PACKAGE_LICENSE "BSD-style")
+    set (CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
+    set (CPACK_RPM_PACKAGE_URL "${HDF5_PACKAGE_URL}")
+    set (CPACK_RPM_PACKAGE_SUMMARY "HDF5 is a unique technology suite that makes possible the management of extremely large and complex data collections.")
+    set (CPACK_RPM_PACKAGE_DESCRIPTION
+        "The HDF5 technology suite includes:
+
+    * A versatile data model that can represent very complex data objects and a wide variety of metadata.
+
+    * A completely portable file format with no limit on the number or size of data objects in the collection.
+
+    * A software library that runs on a range of computational platforms, from laptops to massively parallel systems, and implements a high-level API with C, C++, Fortran 90, and Java interfaces.
+
+    * A rich set of integrated performance features that allow for access time and storage space optimizations.
+
+    * Tools and applications for managing, manipulating, viewing, and analyzing the data in the collection.
+
+The HDF5 data model, file format, API, library, and tools are open and distributed without charge.
+"
+    )
+
+    #-----------------------------------------------------------------------------
+    # Configure the spec file for the install RPM
+    #-----------------------------------------------------------------------------
+#    configure_file ("${HDF5_RESOURCES_DIR}/hdf5.spec.in" "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_PACKAGE_NAME}.spec" @ONLY IMMEDIATE)
+#    set (CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_PACKAGE_NAME}.spec")
+  endif (WIN32)
+
+  # By default, do not warn when built on machines using only VS Express:
+  if (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
+    set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
+  endif (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
+  include (InstallRequiredSystemLibraries)
+
+  set (CPACK_INSTALL_CMAKE_PROJECTS "${HDF5_BINARY_DIR};HDF5;ALL;/")
+
+  if (HDF5_PACKAGE_EXTLIBS)
+    if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+      if (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+        if (WIN32)
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;ALL;/")
+        else (WIN32)
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;libraries;/")
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;headers;/")
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;configinstall;/")
+        endif (WIN32)
+      endif (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+      if (SZIP_FOUND AND SZIP_USE_EXTERNAL)
+        if (WIN32)
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;ALL;/")
+        else (WIN32)
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;libraries;/")
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;headers;/")
+          set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;configinstall;/")
+        endif (WIN32)
+      endif (SZIP_FOUND AND SZIP_USE_EXTERNAL)
+    endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  endif (HDF5_PACKAGE_EXTLIBS)
+
+  include (CPack)
+
+  cpack_add_install_type(Full DISPLAY_NAME "Everything")
+  cpack_add_install_type(Developer)
+
+  cpack_add_component_group(Runtime)
+
+  cpack_add_component_group(Documents
+      EXPANDED
+      DESCRIPTION "Release notes for developing HDF5 applications"
+  )
+
+  cpack_add_component_group(Development
+      EXPANDED
+      DESCRIPTION "All of the tools you'll need to develop HDF5 applications"
+  )
+
+  cpack_add_component_group(Applications
+      EXPANDED
+      DESCRIPTION "Tools for HDF5 files"
+  )
+
+  #---------------------------------------------------------------------------
+  # Now list the cpack commands
+  #---------------------------------------------------------------------------
+  cpack_add_component (libraries
+      DISPLAY_NAME "HDF5 Libraries"
+      GROUP Runtime
+      INSTALL_TYPES Full Developer User
+  )
+  cpack_add_component (headers
+      DISPLAY_NAME "HDF5 Headers"
+      DEPENDS libraries
+      GROUP Development
+      INSTALL_TYPES Full Developer
+  )
+  cpack_add_component (hdfdocuments
+      DISPLAY_NAME "HDF5 Documents"
+      GROUP Documents
+      INSTALL_TYPES Full Developer
+  )
+  cpack_add_component (configinstall
+      DISPLAY_NAME "HDF5 CMake files"
+      HIDDEN
+      DEPENDS libraries
+      GROUP Development
+      INSTALL_TYPES Full Developer User
+  )
+
+  if (HDF5_BUILD_FORTRAN)
+    cpack_add_component (fortlibraries
+        DISPLAY_NAME "HDF5 Fortran Libraries"
+        DEPENDS libraries
+        GROUP Runtime
+        INSTALL_TYPES Full Developer User
+    )
+    cpack_add_component (fortheaders
+        DISPLAY_NAME "HDF5 Fortran Headers"
+        DEPENDS fortlibraries
+        GROUP Development
+        INSTALL_TYPES Full Developer
+    )
+  endif (HDF5_BUILD_FORTRAN)
+
+  if (HDF5_BUILD_CPP_LIB)
+    cpack_add_component (cpplibraries
+        DISPLAY_NAME "HDF5 C++ Libraries"
+        DEPENDS libraries
+        GROUP Runtime
+        INSTALL_TYPES Full Developer User
+    )
+    cpack_add_component (cppheaders
+        DISPLAY_NAME "HDF5 C++ Headers"
+        DEPENDS cpplibraries
+        GROUP Development
+        INSTALL_TYPES Full Developer
+    )
+  endif (HDF5_BUILD_CPP_LIB)
+
+  if (HDF5_BUILD_TOOLS)
+    cpack_add_component (toolsapplications
+        DISPLAY_NAME "HDF5 Tools Applications"
+        DEPENDS toolslibraries
+        GROUP Applications
+        INSTALL_TYPES Full Developer User
+    )
+    cpack_add_component (toolslibraries
+        DISPLAY_NAME "HDF5 Tools Libraries"
+        DEPENDS libraries
+        GROUP Runtime
+        INSTALL_TYPES Full Developer User
+    )
+    cpack_add_component (toolsheaders
+        DISPLAY_NAME "HDF5 Tools Headers"
+        DEPENDS toolslibraries
+        GROUP Development
+        INSTALL_TYPES Full Developer
+    )
+  endif (HDF5_BUILD_TOOLS)
+
+  if (HDF5_BUILD_HL_LIB)
+    cpack_add_component (hllibraries
+        DISPLAY_NAME "HDF5 HL Libraries"
+        DEPENDS libraries
+        GROUP Runtime
+        INSTALL_TYPES Full Developer User
+    )
+    cpack_add_component (hlheaders
+        DISPLAY_NAME "HDF5 HL Headers"
+        DEPENDS hllibraries
+        GROUP Development
+        INSTALL_TYPES Full Developer
+    )
+    cpack_add_component (hltoolsapplications
+        DISPLAY_NAME "HDF5 HL Tools Applications"
+        DEPENDS hllibraries
+        GROUP Applications
+        INSTALL_TYPES Full Developer User
+    )
+    if (HDF5_BUILD_CPP_LIB)
+      cpack_add_component (hlcpplibraries
+          DISPLAY_NAME "HDF5 HL C++ Libraries"
+          DEPENDS hllibraries
+          GROUP Runtime
+          INSTALL_TYPES Full Developer User
+      )
+      cpack_add_component (hlcppheaders
+          DISPLAY_NAME "HDF5 HL C++ Headers"
+          DEPENDS hlcpplibraries
+          GROUP Development
+          INSTALL_TYPES Full Developer
+      )
+    endif (HDF5_BUILD_CPP_LIB)
+    if (HDF5_BUILD_FORTRAN)
+      cpack_add_component (hlfortlibraries
+          DISPLAY_NAME "HDF5 HL Fortran Libraries"
+          DEPENDS fortlibraries
+          GROUP Runtime
+          INSTALL_TYPES Full Developer User
+      )
+    endif (HDF5_BUILD_FORTRAN)
+  endif (HDF5_BUILD_HL_LIB)
+
+endif (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
diff --git a/gatb-core/thirdparty/hdf5/CMakeLists.txt b/gatb-core/thirdparty/hdf5/CMakeLists.txt
new file mode 100644
index 0000000..5895136
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/CMakeLists.txt
@@ -0,0 +1,813 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5 C CXX)
+
+#-----------------------------------------------------------------------------
+# Instructions for use : Normal Build
+#
+# For standard build of HDF5 libraries,tests and tools.
+# Run cmake using the HDF5 source tree to generate a build tree.
+# Enable/Disable options according to requirements and
+# set CMAKE_INSTALL_PREFIX to the required install path.
+# Make install can be used to install all components for system-wide use.
+#
+if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
+    MESSAGE(FATAL_ERROR "\nERROR! ${PROJECT_NAME} DOES NOT SUPPORT IN SOURCE BUILDS!\n"
+      "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
+      " == CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}\n"
+      "NEXT STEPS:\n"
+      "(1) Delete the CMakeCache.txt file and the CMakeFiles/ directory\n"
+      "     under the source directory for ${PROJECT_NAME}, otherwise you\n"
+      "     will not be able to configure ${PROJECT_NAME} correctly!\n"
+      "      * For example, on linux machines do:\n"
+      "        $ rm -r CMakeCache.txt CMakeFiles/\n"
+      "(2) Create a different directory and configure ${PROJECT_NAME} in that directory.\n"
+      "      * For example, on linux machines do:\n"
+      "        $ mkdir MY_BUILD\n"
+      "        $ cd MY_BUILD\n"
+      "        $ cmake [OPTIONS] ..\n"
+      )
+endif ()
+
+#-----------------------------------------------------------------------------
+# Instructions for use : Sub-Project Build
+#
+# To include HDF5 as a sub-project within another project.
+# Set HDF5_EXTERNALLY_CONFIGURED to 1 in the parent project and
+# supply values for the following variables...
+#
+# HDF5_EXPORTED_TARGETS :
+#   Set this to the name of the targets variable which controls exports
+#   If unset (because parent project does not support/use the
+#   install (EXPORT target...) syntax), then targets are not configured
+#   for export during install.
+#
+# HDF5_LIB_DEPENDENCIES :
+#   If the build of HDF5 libs is being customized, then rules for the
+#   dependencies of the HDF5 libs may be 'incomplete', add additional
+#   dependencies to this variable so that external projects pick them up
+#
+# HDF5_EXTERNAL_LIB_PREFIX :
+#   If the parent project needs to install hdf libraries, but avoid
+#   name conflicts with system versions, then a prefix may be added
+#   to ensure that the correct versions configured are used.
+#
+# HDF5_INSTALL_BIN_DIR, HDF5_INSTALL_LIB_DIR, HDF5_INSTALL_INCLUDE_DIR, HDF5_INSTALL_DATA_DIR :
+#   Customize the 'bin', 'lib', 'include', and 'share' installation directories.
+#
+# HDF5_INSTALL_NO_DEVELOPMENT :
+#   Set to true to skip installation of headers and CMake package files.
+#
+# Consider this example from the ParaView project, it builds its own zlib
+# library and tells HDF5 to add it as a dependency - this ensures that
+# any project making use of this build of HDF5 will use the correct zlib
+#
+#   # Tell hdf5 that we are manually overriding certain settings
+#   set (HDF5_EXTERNALLY_CONFIGURED 1)
+#   # Avoid duplicating names of installed libraries
+#   set (HDF5_EXTERNAL_LIB_PREFIX "vtk")
+#   # Export configuration to this export variable
+#   set (HDF5_EXPORTED_TARGETS "paraview-targets")
+#
+#   # Setup all necessary overrides for zlib so that HDF5 uses our
+#   # internally compiled zlib rather than any other version
+#   if (HDF5_ENABLE_Z_LIB_SUPPORT)
+#     # We must tell the main HDF5 library that it depends on our zlib
+#     set (HDF5_LIB_DEPENDENCIES vtkzlib)
+#     # Override the zlib header file
+#     if (VTK_USE_SYSTEM_ZLIB)
+#       set (H5_ZLIB_HEADER "zlib.h")
+#     else (VTK_USE_SYSTEM_ZLIB)
+#       set (H5_ZLIB_HEADER "vtk_zlib.h")
+#       # Set vars that FindZlib would have set if used in sub project
+#       set (ZLIB_INCLUDE_DIRS "${VTK_ZLIB_INCLUDE_DIRS}")
+#       set (ZLIB_LIBRARIES vtkzlib)
+#     endif (VTK_USE_SYSTEM_ZLIB)
+#   endif (HDF5_ENABLE_Z_LIB_SUPPORT)
+#
+#   # Add the sub project
+#   add_subdirectory (Utilities/hdf5-1.8)
+#-----------------------------------------------------------------------------
+string(TIMESTAMP CONFIG_DATE "%Y-%m-%d")
+
+#-----------------------------------------------------------------------------
+# Allow Visual Studio solution directories
+#-----------------------------------------------------------------------------
+# Provide a way for Visual Studio Express users to turn OFF the new FOLDER
+# organization feature. Default to ON for non-Express users. Express users must
+# explicitly turn off this option to build HDF5 in the Express IDE...
+#
+option (HDF5_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON)
+mark_as_advanced (HDF5_USE_FOLDERS)
+if (HDF5_USE_FOLDERS)
+  set_property (GLOBAL PROPERTY USE_FOLDERS ON)
+endif (HDF5_USE_FOLDERS)
+option (HDF5_NO_PACKAGES "CPACK - Disable packaging" OFF)
+mark_as_advanced (HDF5_NO_PACKAGES)
+option (ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF)
+mark_as_advanced (ALLOW_UNSUPPORTED)
+
+#-----------------------------------------------------------------------------
+# Set the core names of all the libraries
+#-----------------------------------------------------------------------------
+set (HDF5_LIB_CORENAME              "hdf5")
+set (HDF5_TEST_LIB_CORENAME         "hdf5_test")
+set (HDF5_CPP_LIB_CORENAME          "hdf5_cpp")
+set (HDF5_HL_LIB_CORENAME           "hdf5_hl")
+set (HDF5_HL_CPP_LIB_CORENAME       "hdf5_hl_cpp")
+set (HDF5_TOOLS_LIB_CORENAME        "hdf5_tools")
+set (HDF5_F90_LIB_CORENAME          "hdf5_fortran")
+set (HDF5_F90_C_LIB_CORENAME        "hdf5_f90cstub")
+set (HDF5_F90_TEST_LIB_CORENAME     "hdf5_test_fortran")
+set (HDF5_F90_C_TEST_LIB_CORENAME   "hdf5_test_f90cstub")
+set (HDF5_HL_F90_LIB_CORENAME       "hdf5_hl_fortran")
+set (HDF5_HL_F90_C_LIB_CORENAME     "hdf5_hl_f90cstub")
+
+#-----------------------------------------------------------------------------
+# Set the true names of all the libraries if customized by external project
+#-----------------------------------------------------------------------------
+set (HDF5_LIB_NAME              "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_LIB_CORENAME}")
+set (HDF5_TEST_LIB_NAME         "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TEST_LIB_CORENAME}")
+set (HDF5_CPP_LIB_NAME          "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_CPP_LIB_CORENAME}")
+set (HDF5_HL_LIB_NAME           "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_HL_LIB_CORENAME}")
+set (HDF5_HL_CPP_LIB_NAME       "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_HL_CPP_LIB_CORENAME}")
+set (HDF5_TOOLS_LIB_NAME        "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOLS_LIB_CORENAME}")
+set (HDF5_F90_LIB_NAME          "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_F90_LIB_CORENAME}")
+set (HDF5_F90_C_LIB_NAME        "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_F90_C_LIB_CORENAME}")
+set (HDF5_F90_TEST_LIB_NAME     "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_F90_TEST_LIB_CORENAME}")
+set (HDF5_F90_C_TEST_LIB_NAME   "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_F90_C_TEST_LIB_CORENAME}")
+set (HDF5_HL_F90_LIB_NAME       "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_HL_F90_LIB_CORENAME}")
+set (HDF5_HL_F90_C_LIB_NAME     "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_HL_F90_C_LIB_CORENAME}")
+
+#-----------------------------------------------------------------------------
+# Set the target names of all the libraries
+#-----------------------------------------------------------------------------
+set (HDF5_LIB_TARGET              "${HDF5_LIB_CORENAME}")
+set (HDF5_TEST_LIB_TARGET         "${HDF5_TEST_LIB_CORENAME}")
+set (HDF5_CPP_LIB_TARGET          "${HDF5_CPP_LIB_CORENAME}")
+set (HDF5_HL_LIB_TARGET           "${HDF5_HL_LIB_CORENAME}")
+set (HDF5_HL_CPP_LIB_TARGET       "${HDF5_HL_CPP_LIB_CORENAME}")
+set (HDF5_TOOLS_LIB_TARGET        "${HDF5_TOOLS_LIB_CORENAME}")
+set (HDF5_F90_LIB_TARGET          "${HDF5_F90_LIB_CORENAME}")
+set (HDF5_F90_C_LIB_TARGET        "${HDF5_F90_C_LIB_CORENAME}")
+set (HDF5_F90_TEST_LIB_TARGET     "${HDF5_F90_TEST_LIB_CORENAME}")
+set (HDF5_F90_C_TEST_LIB_TARGET   "${HDF5_F90_C_TEST_LIB_CORENAME}")
+set (HDF5_HL_F90_LIB_TARGET       "${HDF5_HL_F90_LIB_CORENAME}")
+set (HDF5_HL_F90_C_LIB_TARGET     "${HDF5_HL_F90_C_LIB_CORENAME}")
+set (HDF5_LIBSH_TARGET            "${HDF5_LIB_CORENAME}-shared")
+set (HDF5_TEST_LIBSH_TARGET       "${HDF5_TEST_LIB_CORENAME}-shared")
+set (HDF5_CPP_LIBSH_TARGET        "${HDF5_CPP_LIB_CORENAME}-shared")
+set (HDF5_HL_LIBSH_TARGET         "${HDF5_HL_LIB_CORENAME}-shared")
+set (HDF5_HL_CPP_LIBSH_TARGET     "${HDF5_HL_CPP_LIB_CORENAME}-shared")
+set (HDF5_TOOLS_LIBSH_TARGET      "${HDF5_TOOLS_LIB_CORENAME}-shared")
+set (HDF5_F90_LIBSH_TARGET        "${HDF5_F90_LIB_CORENAME}-shared")
+set (HDF5_F90_C_LIBSH_TARGET      "${HDF5_F90_C_LIB_CORENAME}-shared")
+set (HDF5_F90_TEST_LIBSH_TARGET   "${HDF5_F90_TEST_LIB_CORENAME}-shared")
+set (HDF5_F90_C_TEST_LIBSH_TARGET "${HDF5_F90_C_TEST_LIB_CORENAME}-shared")
+set (HDF5_HL_F90_LIBSH_TARGET     "${HDF5_HL_F90_LIB_CORENAME}-shared")
+set (HDF5_HL_F90_C_LIBSH_TARGET   "${HDF5_HL_F90_C_LIB_CORENAME}-shared")
+
+#-----------------------------------------------------------------------------
+# Define some CMake variables for use later in the project
+#-----------------------------------------------------------------------------
+set (HDF_RESOURCES_DIR       ${HDF5_SOURCE_DIR}/config/cmake)
+set (HDF_RESOURCES_EXT_DIR   ${HDF5_SOURCE_DIR}/config/cmake_ext_mod)
+set (HDF5_SRC_DIR            ${HDF5_SOURCE_DIR}/src)
+set (HDF5_TEST_SRC_DIR       ${HDF5_SOURCE_DIR}/test)
+set (HDF5_CPP_SRC_DIR        ${HDF5_SOURCE_DIR}/c++)
+set (HDF5_CPP_TST_DIR        ${HDF5_SOURCE_DIR}/c++/test)
+set (HDF5_HL_SRC_DIR         ${HDF5_SOURCE_DIR}/hl)
+set (HDF5_HL_CPP_SRC_DIR     ${HDF5_SOURCE_DIR}/hl/c++)
+set (HDF5_HL_TOOLS_DIR       ${HDF5_SOURCE_DIR}/hl/tools)
+set (HDF5_TOOLS_DIR          ${HDF5_SOURCE_DIR}/tools)
+set (HDF5_TOOLS_SRC_DIR      ${HDF5_SOURCE_DIR}/tools)
+set (HDF5_PERFORM_SRC_DIR    ${HDF5_SOURCE_DIR}/tools/perform)
+set (HDF5_F90_SRC_DIR        ${HDF5_SOURCE_DIR}/fortran)
+
+if (APPLE)
+  option (HDF5_BUILD_FRAMEWORKS "TRUE to build as frameworks libraries, FALSE to build according to BUILD_SHARED_LIBS" FALSE)
+endif (APPLE)
+
+if (NOT HDF5_INSTALL_BIN_DIR)
+  set (HDF5_INSTALL_BIN_DIR bin)
+endif (NOT HDF5_INSTALL_BIN_DIR)
+if (NOT HDF5_INSTALL_LIB_DIR)
+  if (APPLE)
+    set (HDF5_INSTALL_FMWK_DIR ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
+  endif (APPLE)
+  set (HDF5_INSTALL_LIB_DIR lib)
+endif (NOT HDF5_INSTALL_LIB_DIR)
+if (NOT HDF5_INSTALL_INCLUDE_DIR)
+  set (HDF5_INSTALL_INCLUDE_DIR include)
+endif (NOT HDF5_INSTALL_INCLUDE_DIR)
+if (NOT HDF5_INSTALL_DATA_DIR)
+  if (NOT WIN32)
+    if (APPLE)
+      if (HDF5_BUILD_FRAMEWORKS)
+        set (HDF5_INSTALL_EXTRA_DIR ../SharedSupport)
+      else (HDF5_BUILD_FRAMEWORKS)
+        set (HDF5_INSTALL_EXTRA_DIR share)
+      endif (HDF5_BUILD_FRAMEWORKS)
+      set (HDF5_INSTALL_FWRK_DIR ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
+    endif (APPLE)
+    set (HDF5_INSTALL_DATA_DIR share)
+    set (HDF5_INSTALL_CMAKE_DIR share/cmake)
+  else (NOT WIN32)
+    set (HDF5_INSTALL_DATA_DIR ".")
+    set (HDF5_INSTALL_CMAKE_DIR cmake)
+  endif (NOT WIN32)
+endif (NOT HDF5_INSTALL_DATA_DIR)
+
+if(DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}")
+  set (CMAKE_PREFIX_PATH ${ADDITIONAL_CMAKE_PREFIX_PATH} ${CMAKE_PREFIX_PATH})
+endif(DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}")
+
+#-----------------------------------------------------------------------------
+# parse the full version number from H5public.h and include in H5_VERS_INFO
+#-----------------------------------------------------------------------------
+file (READ ${HDF5_SRC_DIR}/H5public.h _h5public_h_contents)
+string (REGEX REPLACE ".*#define[ \t]+H5_VERS_MAJOR[ \t]+([0-9]*).*$"
+    "\\1" H5_VERS_MAJOR ${_h5public_h_contents})
+string (REGEX REPLACE ".*#define[ \t]+H5_VERS_MINOR[ \t]+([0-9]*).*$"
+    "\\1" H5_VERS_MINOR ${_h5public_h_contents})
+string (REGEX REPLACE ".*#define[ \t]+H5_VERS_RELEASE[ \t]+([0-9]*).*$"
+    "\\1" H5_VERS_RELEASE ${_h5public_h_contents})
+string (REGEX REPLACE ".*#define[ \t]+H5_VERS_SUBRELEASE[ \t]+\"([0-9A-Za-z._]*)\".*$"
+    "\\1" H5_VERS_SUBRELEASE ${_h5public_h_contents})
+#message (STATUS "VERSION: ${H5_VERS_MAJOR}.${H5_VERS_MINOR}.${H5_VERS_RELEASE}-${H5_VERS_SUBRELEASE}")
+
+#-----------------------------------------------------------------------------
+# parse the full soversion number from config/lt_vers.am and include in H5_SOVERS_INFO
+#-----------------------------------------------------------------------------
+file (READ ${HDF5_SOURCE_DIR}/config/lt_vers.am _lt_vers_am_contents)
+string (REGEX REPLACE ".*LT_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_SOVERS_MAJOR ${H5_SOVERS_INTERFACE}-${H5_SOVERS_RELEASE})
+message (STATUS "SOVERSION: ${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_TOOLS_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_TOOLS_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_TOOLS_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_TOOLS_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_TOOLS_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_TOOLS_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_TOOLS_SOVERS_MAJOR ${H5_TOOLS_SOVERS_INTERFACE}-${H5_TOOLS_SOVERS_RELEASE})
+message (STATUS "SOVERSION_TOOLS: ${H5_TOOLS_SOVERS_MAJOR}.${H5_TOOLS_SOVERS_RELEASE}.${H5_TOOLS_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_CXX_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_CXX_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_CXX_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_CXX_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_CXX_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_CXX_SOVERS_MAJOR ${H5_CXX_SOVERS_INTERFACE}-${H5_CXX_SOVERS_RELEASE})
+message (STATUS "SOVERSION_CXX: ${H5_CXX_SOVERS_MAJOR}.${H5_CXX_SOVERS_RELEASE}.${H5_CXX_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_F_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_F_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_F_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_F_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_F_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_F_SOVERS_MAJOR ${H5_F_SOVERS_INTERFACE}-${H5_F_SOVERS_RELEASE})
+message (STATUS "SOVERSION_F: ${H5_F_SOVERS_MAJOR}.${H5_F_SOVERS_RELEASE}.${H5_F_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_HL_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_HL_SOVERS_MAJOR ${H5_HL_SOVERS_INTERFACE}-${H5_HL_SOVERS_RELEASE})
+message (STATUS "SOVERSION_HL: ${H5_HL_SOVERS_MAJOR}.${H5_HL_SOVERS_RELEASE}.${H5_HL_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_HL_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_CXX_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_CXX_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_CXX_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_CXX_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_CXX_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_HL_CXX_SOVERS_MAJOR ${H5_HL_CXX_SOVERS_INTERFACE}-${H5_HL_CXX_SOVERS_RELEASE})
+message (STATUS "SOVERSION_HL_CXX: ${H5_HL_CXX_SOVERS_MAJOR}.${H5_HL_CXX_SOVERS_RELEASE}.${H5_HL_CXX_SOVERS_MINOR}")
+string (REGEX REPLACE ".*LT_HL_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_F_SOVERS_INTERFACE ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_F_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_F_SOVERS_MINOR ${_lt_vers_am_contents})
+string (REGEX REPLACE ".*LT_HL_F_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
+    "\\1" H5_HL_F_SOVERS_RELEASE ${_lt_vers_am_contents})
+MATH (EXPR H5_HL_F_SOVERS_MAJOR ${H5_HL_F_SOVERS_INTERFACE}-${H5_HL_F_SOVERS_RELEASE})
+message (STATUS "SOVERSION_HL_F: ${H5_HL_F_SOVERS_MAJOR}.${H5_HL_F_SOVERS_RELEASE}.${H5_HL_F_SOVERS_MINOR}")
+
+#-----------------------------------------------------------------------------
+# Basic HDF5 stuff here
+#-----------------------------------------------------------------------------
+set (HDF5_PACKAGE "hdf5")
+set (HDF5_PACKAGE_NAME "HDF5")
+set (HDF5_PACKAGE_VERSION "${H5_VERS_MAJOR}.${H5_VERS_MINOR}.${H5_VERS_RELEASE}")
+set (HDF5_PACKAGE_VERSION_MAJOR "${H5_VERS_MAJOR}.${H5_VERS_MINOR}")
+set (HDF5_PACKAGE_VERSION_MINOR "${H5_VERS_RELEASE}")
+if (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
+  set (HDF5_PACKAGE_VERSION_STRING "${HDF5_PACKAGE_VERSION}-${H5_VERS_SUBRELEASE}")
+else (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
+  set (HDF5_PACKAGE_VERSION_STRING "${HDF5_PACKAGE_VERSION}")
+endif (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
+set (HDF5_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
+set (HDF5_TOOLS_PACKAGE_SOVERSION "${H5_TOOLS_SOVERS_MAJOR}.${H5_TOOLS_SOVERS_RELEASE}.${H5_TOOLS_SOVERS_MINOR}")
+set (HDF5_CXX_PACKAGE_SOVERSION "${H5_CXX_SOVERS_MAJOR}.${H5_CXX_SOVERS_RELEASE}.${H5_CXX_SOVERS_MINOR}")
+set (HDF5_F_PACKAGE_SOVERSION "${H5_F_SOVERS_MAJOR}.${H5_F_SOVERS_RELEASE}.${H5_F_SOVERS_MINOR}")
+set (HDF5_HL_PACKAGE_SOVERSION "${H5_HL_SOVERS_MAJOR}.${H5_HL_SOVERS_RELEASE}.${H5_HL_SOVERS_MINOR}")
+set (HDF5_HL_CXX_PACKAGE_SOVERSION "${H5_HL_CXX_SOVERS_MAJOR}.${H5_HL_CXX_SOVERS_RELEASE}.${H5_HL_CXX_SOVERS_MINOR}")
+set (HDF5_HL_F_PACKAGE_SOVERSION "${H5_HL_F_SOVERS_MAJOR}.${H5_HL_F_SOVERS_RELEASE}.${H5_HL_F_SOVERS_MINOR}")
+set (HDF5_PACKAGE_STRING "${HDF5_PACKAGE_NAME} ${HDF5_PACKAGE_VERSION_STRING}")
+set (HDF5_PACKAGE_TARNAME "${HDF5_PACKAGE}${HDF_PACKAGE_EXT}")
+set (HDF5_PACKAGE_URL "http://www.hdfgroup.org")
+set (HDF5_PACKAGE_BUGREPORT "help at hdfgroup.org")
+
+#-----------------------------------------------------------------------------
+# Include some macros for reusable code
+#-----------------------------------------------------------------------------
+include (${HDF_RESOURCES_EXT_DIR}/HDFMacros.cmake)
+include (${HDF_RESOURCES_EXT_DIR}/HDFLibMacros.cmake)
+include (${HDF_RESOURCES_DIR}/HDF5Macros.cmake)
+
+#-----------------------------------------------------------------------------
+# Setup output Directories
+#-----------------------------------------------------------------------------
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  set (CMAKE_RUNTIME_OUTPUT_DIRECTORY
+      ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Executables."
+  )
+  set (CMAKE_LIBRARY_OUTPUT_DIRECTORY
+      ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Libraries"
+  )
+  set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY
+      ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all static libraries."
+  )
+  set (CMAKE_Fortran_MODULE_DIRECTORY
+      ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all fortran modules."
+  )
+  if (WIN32)
+    set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE})
+  else (WIN32)
+    set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+  endif (WIN32)
+else (NOT HDF5_EXTERNALLY_CONFIGURED)
+  # if we are externally configured, but the project uses old cmake scripts
+  # this may not be set and utilities like H5detect will fail
+  if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+    set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
+  endif (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+
+#-----------------------------------------------------------------------------
+# Targets built within this project are exported at Install time for use
+# by other projects using FindHDF5.
+#-----------------------------------------------------------------------------
+#if (NOT HDF5_EXPORTED_TARGETS)
+#  set (HDF5_EXPORTED_TARGETS "hdf5-targets")
+#endif (NOT HDF5_EXPORTED_TARGETS)
+
+#-----------------------------------------------------------------------------
+# To include a library in the list exported by the project AT BUILD TIME,
+# add it to this variable. This is NOT used by Make Install, but for projects
+# which include hdf5 as a sub-project within their build tree
+#-----------------------------------------------------------------------------
+set_global_variable (HDF5_LIBRARIES_TO_EXPORT "")
+set_global_variable (HDF5_UTILS_TO_EXPORT "")
+
+set (EXTERNAL_HEADER_LIST "")
+set (EXTERNAL_LIBRARY_LIST "")
+set (EXTERNAL_LIBRARYDLL_LIST "")
+
+#-----------------------------------------------------------------------------
+# Run all the CMake configuration tests for our build environment
+#-----------------------------------------------------------------------------
+include (${HDF_RESOURCES_DIR}/ConfigureChecks.cmake)
+
+set (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
+
+#-----------------------------------------------------------------------------
+# Mac OS X Options
+#-----------------------------------------------------------------------------
+if (HDF5_BUILD_FRAMEWORKS AND NOT BUILD_SHARED_LIBS)
+  set (BUILD_SHARED_LIBS ON CACHE BOOL "Build Shared Libraries")
+endif (HDF5_BUILD_FRAMEWORKS AND NOT BUILD_SHARED_LIBS)
+
+#-----------------------------------------------------------------------------
+# Option to Build Shared and Static libs, default is static
+#-----------------------------------------------------------------------------
+option (BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
+set (H5_ENABLE_SHARED_LIB NO)
+if (BUILD_SHARED_LIBS)
+  set (H5_ENABLE_SHARED_LIB YES)
+  set (LINK_SHARED_LIBS ${LINK_LIBS})
+endif (BUILD_SHARED_LIBS)
+set (H5_ENABLE_STATIC_LIB YES)
+set (CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+#-----------------------------------------------------------------------------
+# Option to Build Static executables
+#-----------------------------------------------------------------------------
+option (BUILD_STATIC_EXECS "Build Static Executabless" OFF)
+if (BUILD_STATIC_EXECS)
+  if (NOT WIN32)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
+  endif (NOT WIN32)
+endif (BUILD_STATIC_EXECS)
+
+#-----------------------------------------------------------------------------
+# Option to use code coverage
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF)
+if (HDF5_ENABLE_COVERAGE)
+  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
+  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
+  set (LDFLAGS "${LDFLAGS} -fprofile-arcs -ftest-coverage")
+endif (HDF5_ENABLE_COVERAGE)
+
+#-----------------------------------------------------------------------------
+# Option to indicate using dmalloc
+#-----------------------------------------------------------------------------
+# option (HDF5_ENABLE_USING_DMALLOC "Indicate that dmalloc is used" OFF)
+# if (HDF5_ENABLE_USING_DMALLOC)
+#   find_package (DMALLOC)
+#   set (H5_HAVE_DMALLOC DMALLOC_FOUND)
+# endif (HDF5_ENABLE_USING_DMALLOC)
+
+#-----------------------------------------------------------------------------
+# Option to indicate using a memory checker
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_USING_MEMCHECKER "Indicate that a memory checker is used" OFF)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  set (H5_USING_MEMCHECKER 1)
+endif (HDF5_ENABLE_USING_MEMCHECKER)
+
+#-----------------------------------------------------------------------------
+# Option to use deprecated public API symbols
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_DEPRECATED_SYMBOLS "Enable deprecated public API symbols" ON)
+if (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+  set (H5_NO_DEPRECATED_SYMBOLS 0)
+else (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+  set (H5_NO_DEPRECATED_SYMBOLS 1)
+endif (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+
+#-----------------------------------------------------------------------------
+# When building utility executables that generate other (source) files :
+# we make use of the following variables defined in the root CMakeLists.
+# Certain systems may add /Debug or /Release to output paths
+# and we need to call the executable from inside the CMake configuration
+#-----------------------------------------------------------------------------
+set (EXE_EXT "")
+if (WIN32)
+  set (EXE_EXT ".exe")
+  if (NOT CYGWIN)
+    add_definitions (-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
+    add_definitions (-D_CRT_SECURE_NO_WARNINGS)
+    add_definitions (-D_CONSOLE)
+  endif (NOT CYGWIN)
+endif (WIN32)
+
+if (MSVC)
+  set (CMAKE_MFC_FLAG 0)
+  set (WIN_COMPILE_FLAGS "")
+  set (WIN_LINK_FLAGS "")
+endif (MSVC)
+
+set (MAKE_SYSTEM)
+if (CMAKE_BUILD_TOOL MATCHES "make")
+  set (MAKE_SYSTEM 1)
+endif (CMAKE_BUILD_TOOL MATCHES "make")
+
+set (CFG_INIT "/${CMAKE_CFG_INTDIR}")
+if (MAKE_SYSTEM)
+  set (CFG_INIT "")
+endif (MAKE_SYSTEM)
+
+#-----------------------------------------------------------------------------
+# Add some definitions for Debug Builds
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_TRACE "Enable API tracing capability" OFF)
+mark_as_advanced (HDF5_ENABLE_TRACE)
+if (CMAKE_BUILD_TYPE MATCHES Debug)
+  add_definitions (-DDEBUG)
+  # Enable tracing of the API
+  if (HDF5_ENABLE_TRACE)
+    add_definitions (-DH5_DEBUG_API )
+  endif (HDF5_ENABLE_TRACE)
+  # Enable instrumenting of the library's internal operations
+  option (HDF5_ENABLE_INSTRUMENT "Instrument The library" OFF)
+  if (HDF5_ENABLE_INSTRUMENT)
+    set (H5_HAVE_INSTRUMENTED_LIBRARY 1)
+  endif (HDF5_ENABLE_INSTRUMENT)
+  mark_as_advanced (HDF5_ENABLE_INSTRUMENT)
+else (CMAKE_BUILD_TYPE MATCHES Debug)
+  add_definitions (-DNDEBUG)
+  if (HDF5_ENABLE_TRACE)
+    add_definitions (-DH5_DEBUG_API )
+  endif (HDF5_ENABLE_TRACE)
+endif (CMAKE_BUILD_TYPE MATCHES Debug)
+
+#-----------------------------------------------------------------------------
+# Option to embed library info into executables
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_EMBEDDED_LIBINFO "embed library info into executables" ON)
+if (HDF5_ENABLE_EMBEDDED_LIBINFO)
+  set (H5_HAVE_EMBEDDED_LIBINFO 1)
+endif (HDF5_ENABLE_EMBEDDED_LIBINFO)
+
+include (${HDF_RESOURCES_DIR}/HDFCompilerFlags.cmake)
+
+#-----------------------------------------------------------------------------
+# All libs/tests/examples need the main include directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_BINARY_DIR} ${HDF5_SRC_DIR} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+
+#-----------------------------------------------------------------------------
+# Option to Enable MPI Parallel
+#-----------------------------------------------------------------------------
+set (CMAKE_MODULE_PATH ${HDF_RESOURCES_DIR} ${HDF_RESOURCES_EXT_DIR} ${CMAKE_MODULE_PATH})
+option (HDF5_ENABLE_PARALLEL "Enable parallel build (requires MPI)" OFF)
+if (HDF5_ENABLE_PARALLEL)
+  include (FindMPI)
+  INCLUDE_DIRECTORIES (${MPI_C_INCLUDE_PATH})
+  if (MPI_C_FOUND)
+    set (H5_HAVE_PARALLEL 1)
+    # MPI checks, only do these if MPI_C_FOUND is true, otherwise they always fail
+    # and once set, they are cached as false and not regenerated
+    set (CMAKE_REQUIRED_LIBRARIES "${MPI_C_LIBRARIES}" )
+    # Used by Fortran + MPI
+    CHECK_SYMBOL_EXISTS (MPI_Comm_c2f "${MPI_C_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Comm)
+    CHECK_SYMBOL_EXISTS (MPI_Info_c2f "${MPI_C_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Info)
+  else (MPI_C_FOUND)
+    message (STATUS "Parallel libraries not found")
+  endif (MPI_C_FOUND)
+endif (HDF5_ENABLE_PARALLEL)
+
+# Parallel IO usage requires MPI to be Linked and Included
+if (H5_HAVE_PARALLEL)
+  set (LINK_LIBS ${LINK_LIBS} ${MPI_C_LIBRARIES})
+  set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${MPI_C_LIBRARIES})
+  if (MPI_C_LINK_FLAGS)
+    set (CMAKE_EXE_LINKER_FLAGS "${MPI_C_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+  endif (MPI_C_LINK_FLAGS)
+endif (H5_HAVE_PARALLEL)
+
+set (DEFAULT_API_VERSION "v18")
+#-----------------------------------------------------------------------------
+# Option to use 1.6.x API
+#-----------------------------------------------------------------------------
+option (HDF5_USE_16_API_DEFAULT "Use the HDF5 1.6.x API by default" OFF)
+set (H5_USE_16_API_DEFAULT 0)
+if (HDF5_USE_16_API_DEFAULT)
+  set (H5_USE_16_API_DEFAULT 1)
+  set (DEFAULT_API_VERSION "v16")
+endif (HDF5_USE_16_API_DEFAULT)
+
+#-----------------------------------------------------------------------------
+# Include user macros
+#-----------------------------------------------------------------------------
+include (UserMacros.cmake)
+
+#-----------------------------------------------------------------------------
+# Include filter (zlib, szip, etc.) macros
+#-----------------------------------------------------------------------------
+include (CMakeFilters.cmake)
+
+#-----------------------------------------------------------------------------
+# Option for external libraries on windows
+#-----------------------------------------------------------------------------
+option (HDF5_PACKAGE_EXTLIBS "CPACK - include external libraries" OFF)
+if (NOT HDF5_EXTERNALLY_CONFIGURED)
+  if (HDF5_PACKAGE_EXTLIBS)
+    set (HDF5_NO_PACKAGES OFF CACHE BOOL "CPACK - Disable packaging" FORCE)
+    if (HDF5_ENABLE_Z_LIB_SUPPORT AND ZLIB_FOUND)
+      PACKAGE_ZLIB_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
+    endif (HDF5_ENABLE_Z_LIB_SUPPORT AND ZLIB_FOUND)
+
+    if (HDF5_ENABLE_SZIP_SUPPORT AND SZIP_FOUND)
+      PACKAGE_SZIP_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
+    endif (HDF5_ENABLE_SZIP_SUPPORT AND SZIP_FOUND)
+  endif (HDF5_PACKAGE_EXTLIBS)
+endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+#-----------------------------------------------------------------------------
+# Option to use threadsafe
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_THREADSAFE "Enable thread-safety" OFF)
+if (HDF5_ENABLE_THREADSAFE)
+  # check for unsupported options
+  message (STATUS " **** thread-safety option not supported with static library **** ")
+  message (STATUS " **** thread-safety option will not be used building static library **** ")
+  if (HDF5_ENABLE_PARALLEL)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** parallel and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported parallel and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_ENABLE_PARALLEL)
+  if (HDF5_BUILD_FORTRAN)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** Fortran and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported Fortran and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_FORTRAN)
+  if (HDF5_BUILD_CPP_LIB)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** C++ and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported C++ and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_CPP_LIB)
+  if (HDF5_BUILD_HL_LIB)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** HL and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported HL and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_HL_LIB)
+  if (H5_HAVE_IOEO)
+    message (STATUS " **** Win32 threads requires WINVER>=0x600 (Windows Vista/7/8) **** ")
+    set (H5_HAVE_WIN_THREADS 1)
+  else (H5_HAVE_IOEO)
+    if (NOT H5_HAVE_PTHREAD_H)
+      message (FATAL_ERROR " **** thread-safe option requires Win32 threads or Pthreads **** ")
+    endif (NOT H5_HAVE_PTHREAD_H)
+  endif (H5_HAVE_IOEO)
+  set(THREADS_PREFER_PTHREAD_FLAG ON)
+  find_package(Threads)
+  if (NOT Threads_FOUND)
+    message (STATUS " **** thread-safe package not found - threads still might work **** ")
+  endif (NOT Threads_FOUND)
+endif (HDF5_ENABLE_THREADSAFE)
+
+#-----------------------------------------------------------------------------
+# Add the HDF5 Library Target to the build
+#-----------------------------------------------------------------------------
+add_subdirectory (${HDF5_SOURCE_DIR}/src ${PROJECT_BINARY_DIR}/src)
+
+if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  if (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+    ADD_DEPENDENCIES (${HDF5_LIB_TARGET} ZLIB)
+    if (BUILD_SHARED_LIBS)
+      add_dependencies (${HDF5_LIBSH_TARGET} ZLIB)
+    endif (BUILD_SHARED_LIBS)
+  endif (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+  if (SZIP_FOUND AND SZIP_USE_EXTERNAL)
+    ADD_DEPENDENCIES (${HDF5_LIB_TARGET} SZIP)
+    if (BUILD_SHARED_LIBS)
+      add_dependencies (${HDF5_LIBSH_TARGET} SZIP)
+    endif (BUILD_SHARED_LIBS)
+  endif (SZIP_FOUND AND SZIP_USE_EXTERNAL)
+endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+
+#-----------------------------------------------------------------------------
+# Dashboard and Testing Settings
+#-----------------------------------------------------------------------------
+option (BUILD_TESTING "Build HDF5 Unit Testing" ON)
+if (BUILD_TESTING)
+  set (DART_TESTING_TIMEOUT 1200
+      CACHE INTEGER
+      "Timeout in seconds for each test (default 1200=20minutes)"
+  )
+
+  option (HDF5_TEST_VFD "Execute tests with different VFDs" OFF)
+  mark_as_advanced (HDF5_TEST_VFD)
+  if (HDF5_TEST_VFD)
+    option (HDF5_TEST_FHEAP_VFD "Execute tests with different VFDs" ON)
+    mark_as_advanced (HDF5_TEST_FHEAP_VFD)
+  endif (HDF5_TEST_VFD)
+
+  option (HDF_TEST_EXPRESS "Control testing framework (0-3)" "0")
+  mark_as_advanced (HDF_TEST_EXPRESS)
+
+  enable_testing ()
+  include (CTest)
+
+  include (${HDF5_SOURCE_DIR}/CTestConfig.cmake)
+  configure_file (${HDF_RESOURCES_DIR}/CTestCustom.cmake ${HDF5_BINARY_DIR}/CTestCustom.ctest @ONLY)
+
+  if (NOT HDF5_EXTERNALLY_CONFIGURED)
+    if (EXISTS "${HDF5_SOURCE_DIR}/test" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/test")
+      add_subdirectory (${HDF5_SOURCE_DIR}/tools/lib ${PROJECT_BINARY_DIR}/tools/lib)
+      add_subdirectory (${HDF5_SOURCE_DIR}/test      ${PROJECT_BINARY_DIR}/test)
+    endif (EXISTS "${HDF5_SOURCE_DIR}/test" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/test")
+    if (H5_HAVE_PARALLEL)
+      if (EXISTS "${HDF5_SOURCE_DIR}/testpar" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/testpar")
+        add_subdirectory (${HDF5_SOURCE_DIR}/testpar ${PROJECT_BINARY_DIR}/testpar)
+      endif (EXISTS "${HDF5_SOURCE_DIR}/testpar" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/testpar")
+    endif (H5_HAVE_PARALLEL)
+  endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+endif (BUILD_TESTING)
+
+#-----------------------------------------------------------------------------
+# Option to build HDF5 Tools
+#-----------------------------------------------------------------------------
+if (EXISTS "${HDF5_SOURCE_DIR}/tools" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/tools")
+  option (HDF5_BUILD_TOOLS  "Build HDF5 Tools" ON)
+  if (HDF5_BUILD_TOOLS)
+    add_subdirectory (${HDF5_SOURCE_DIR}/tools ${PROJECT_BINARY_DIR}/tools)
+  endif (HDF5_BUILD_TOOLS)
+endif (EXISTS "${HDF5_SOURCE_DIR}/tools" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/tools")
+
+#-----------------------------------------------------------------------------
+# Option to build examples
+#-----------------------------------------------------------------------------
+if (EXISTS "${HDF5_SOURCE_DIR}/examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/examples")
+  option (HDF5_BUILD_EXAMPLES  "Build HDF5 Library Examples" ON)
+  if (HDF5_BUILD_EXAMPLES)
+    add_subdirectory (${HDF5_SOURCE_DIR}/examples ${PROJECT_BINARY_DIR}/examples)
+  endif (HDF5_BUILD_EXAMPLES)
+endif (EXISTS "${HDF5_SOURCE_DIR}/examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/examples")
+
+#-----------------------------------------------------------------------------
+# Option to build High Level API's
+#-----------------------------------------------------------------------------
+if (EXISTS "${HDF5_SOURCE_DIR}/hl" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl")
+  option (HDF5_BUILD_HL_LIB  "Build HIGH Level HDF5 Library" ON)
+  if (HDF5_BUILD_HL_LIB)
+    set (H5_INCLUDE_HL 1)
+    add_subdirectory (${HDF5_SOURCE_DIR}/hl ${PROJECT_BINARY_DIR}/hl)
+  endif (HDF5_BUILD_HL_LIB)
+endif (EXISTS "${HDF5_SOURCE_DIR}/hl" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl")
+
+#-----------------------------------------------------------------------------
+# Option to build Fortran bindings/tests/examples
+# Make sure this appears before the CONFIGURE_FILE step
+# so that fortran name mangling is detected before writing H5pubconf.h
+#-----------------------------------------------------------------------------
+# Set default name mangling : overridden by Fortran detection in fortran dir
+set (H5_FC_FUNC  "H5_FC_FUNC(name,NAME) name ## _")
+set (H5_FC_FUNC_ "H5_FC_FUNC_(name,NAME) name ## _")
+if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/fortran")
+  option (HDF5_BUILD_FORTRAN "Build FORTRAN support" OFF)
+  option (SKIP_HDF5_FORTRAN_SHARED "Do not build the fortran shared libraries" OFF)
+  if (HDF5_BUILD_FORTRAN)
+    if (BUILD_SHARED_LIBS AND APPLE)
+      if (NOT ALLOW_UNSUPPORTED)
+        message (STATUS " **** Shared FORTRAN libraries are unsupported **** ")
+        set (SKIP_HDF5_FORTRAN_SHARED ON)
+      else (NOT ALLOW_UNSUPPORTED)
+        message (STATUS " **** Allowing unsupported Fortran shared libraries **** ")
+      endif (NOT ALLOW_UNSUPPORTED)
+    endif (BUILD_SHARED_LIBS AND APPLE)
+    option (HDF5_ENABLE_F2003 "Enable FORTRAN 2003 Standard" ON)
+    include (${HDF_RESOURCES_EXT_DIR}/HDFUseFortran.cmake)
+    if (HDF5_ENABLE_F2003)
+      if (NOT FORTRAN_HAVE_ISO_C_BINDING)
+        set (HDF5_ENABLE_F2003 OFF)
+      endif (NOT FORTRAN_HAVE_ISO_C_BINDING)
+    endif (HDF5_ENABLE_F2003)
+
+    add_subdirectory (${HDF5_SOURCE_DIR}/fortran ${PROJECT_BINARY_DIR}/fortran)
+    if (HDF5_BUILD_HL_LIB)
+      if (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
+        #-- Build the High Level Fortran source codes
+        add_subdirectory (${HDF5_SOURCE_DIR}/hl/fortran ${PROJECT_BINARY_DIR}/hl/fortran)
+      endif (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
+    endif (HDF5_BUILD_HL_LIB)
+  endif (HDF5_BUILD_FORTRAN)
+endif (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/fortran")
+
+#-----------------------------------------------------------------------------
+# Option to build HDF5 C++ Library
+#-----------------------------------------------------------------------------
+if (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++")
+  option (HDF5_BUILD_CPP_LIB  "Build HDF5 C++ Library" ON)
+  if (HDF5_BUILD_CPP_LIB)
+    # check for unsupported options
+    if (HDF5_ENABLE_PARALLEL)
+      if (NOT ALLOW_UNSUPPORTED)
+        message (FATAL_ERROR " **** Parallel and C++ options are mutually exclusive **** ")
+      else (NOT ALLOW_UNSUPPORTED)
+        message (STATUS " **** Allowing unsupported Parallel and C++ options **** ")
+      endif (NOT ALLOW_UNSUPPORTED)
+    endif (HDF5_ENABLE_PARALLEL)
+    if (CMAKE_NO_STD_NAMESPACE)
+      set (H5_NO_STD 1)
+    endif (CMAKE_NO_STD_NAMESPACE)
+    add_subdirectory (${HDF5_SOURCE_DIR}/c++ ${PROJECT_BINARY_DIR}/c++)
+    if (HDF5_BUILD_HL_LIB)
+      if (EXISTS "${HDF5_SOURCE_DIR}/hl/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/c++")
+        #-- Build the High Level Fortran source codes
+        add_subdirectory (${HDF5_SOURCE_DIR}/hl/c++ ${PROJECT_BINARY_DIR}/hl/c++)
+      endif (EXISTS "${HDF5_SOURCE_DIR}/hl/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/c++")
+    endif (HDF5_BUILD_HL_LIB)
+  endif (HDF5_BUILD_CPP_LIB)
+endif (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++")
+
+#-----------------------------------------------------------------------------
+# Check if Fortran's default real is double precision. If it is and HL is
+# being built then configure should fail due to bug HDFFV-889.
+#-----------------------------------------------------------------------------
+ if (HDF5_BUILD_FORTRAN AND HDF5_BUILD_HL_LIB )
+   if (NOT FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
+     message (FATAL_ERROR " **** Fortran high-level routines are not supported when the default REAL is DOUBLE PRECISION, use HDF5_BUILD_HL_LIB:BOOL=OFF **** ")
+   endif (NOT FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
+ endif (HDF5_BUILD_FORTRAN AND HDF5_BUILD_HL_LIB )
+
+#-----------------------------------------------------------------------------
+# Generate the H5pubconf.h file containing user settings needed by compilation
+#-----------------------------------------------------------------------------
+configure_file (${HDF_RESOURCES_DIR}/H5pubconf.h.in ${HDF5_BINARY_DIR}/H5pubconf.h @ONLY)
+
+include (CMakeInstallation.cmake)
diff --git a/gatb-core/thirdparty/hdf5/COPYING b/gatb-core/thirdparty/hdf5/COPYING
new file mode 100644
index 0000000..76dee1c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/COPYING
@@ -0,0 +1,92 @@
+
+Copyright Notice and License Terms for 
+HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+-----------------------------------------------------------------------------
+
+HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+Copyright 2006-2014 by The HDF Group.
+
+NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted for any purpose (including commercial purposes) 
+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 materials provided with the distribution.
+
+3. In addition, redistributions of modified forms of the source or binary 
+   code must carry prominent notices stating that the original code was 
+   changed and the date of the change.
+
+4. All publications or advertising materials mentioning features or use of 
+   this software are asked, but not required, to acknowledge that it was 
+   developed by The HDF Group and by the National Center for Supercomputing 
+   Applications at the University of Illinois at Urbana-Champaign and 
+   credit the contributors.
+
+5. Neither the name of The HDF Group, the name of the University, nor the 
+   name of any Contributor may be used to endorse or promote products derived 
+   from this software without specific prior written permission from 
+   The HDF Group, the University, or the Contributor, respectively.
+
+DISCLAIMER: 
+THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS 
+"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.  In no 
+event shall The HDF Group or the Contributors be liable for any damages 
+suffered by the users arising out of the use of this software, even if 
+advised of the possibility of such damage. 
+
+-----------------------------------------------------------------------------
+-----------------------------------------------------------------------------
+
+Contributors:   National Center for Supercomputing Applications (NCSA) at 
+the University of Illinois, Fortner Software, Unidata Program Center (netCDF), 
+The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), 
+and Digital Equipment Corporation (DEC).
+
+-----------------------------------------------------------------------------
+
+Portions of HDF5 were developed with support from the Lawrence Berkeley 
+National Laboratory (LBNL) and the United States Department of Energy 
+under Prime Contract No. DE-AC02-05CH11231.
+
+-----------------------------------------------------------------------------
+
+Portions of HDF5 were developed with support from the University of 
+California, Lawrence Livermore National Laboratory (UC LLNL).  
+The following statement applies to those portions of the product and must 
+be retained in any redistribution of source code, binaries, documentation, 
+and/or accompanying materials:
+
+   This work was partially produced at the University of California, 
+   Lawrence Livermore National Laboratory (UC LLNL) under contract 
+   no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy 
+   (DOE) and The Regents of the University of California (University) 
+   for the operation of UC LLNL.
+
+   DISCLAIMER: 
+   This work was prepared as an account of work sponsored by an agency of 
+   the United States Government. Neither the United States Government nor 
+   the University of California nor any of their employees, makes any 
+   warranty, express or implied, or assumes any liability or responsibility 
+   for the accuracy, completeness, or usefulness of any information, 
+   apparatus, product, or process disclosed, or represents that its use 
+   would not infringe privately- owned rights. Reference herein to any 
+   specific commercial products, process, or service by trade name, 
+   trademark, manufacturer, or otherwise, does not necessarily constitute 
+   or imply its endorsement, recommendation, or favoring by the United 
+   States Government or the University of California. The views and 
+   opinions of authors expressed herein do not necessarily state or reflect 
+   those of the United States Government or the University of California, 
+   and shall not be used for advertising or product endorsement purposes.
+-----------------------------------------------------------------------------
+
+
diff --git a/gatb-core/thirdparty/hdf5/CTestConfig.cmake b/gatb-core/thirdparty/hdf5/CTestConfig.cmake
new file mode 100644
index 0000000..9e95b4c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/CTestConfig.cmake
@@ -0,0 +1,32 @@
+## This file should be placed in the root directory of your project.
+## Then modify the CMakeLists.txt file in the root directory of your
+## project to incorporate the testing dashboard.
+## # The following are required to uses Dart and the Cdash dashboard
+##   ENABLE_TESTING()
+##   INCLUDE(CTest)
+set (CTEST_PROJECT_NAME "HDF5")
+set (CTEST_NIGHTLY_START_TIME "18:00:00 CST")
+
+set (CTEST_DROP_METHOD "http")
+if (CDASH_LOCAL)
+  set (CTEST_DROP_SITE "cdash-internal.hdfgroup.org")
+  set (CTEST_DROP_LOCATION "/submit.php?project=HDF5.1.8")
+else (CDASH_LOCAL)
+  set (CTEST_DROP_SITE "cdash.hdfgroup.org")
+  set (CTEST_DROP_LOCATION "/submit.php?project=HDF518")
+endif (CDASH_LOCAL)
+set (CTEST_DROP_SITE_CDASH TRUE)
+
+set (UPDATE_TYPE git)
+set (VALGRIND_COMMAND "/usr/bin/valgrind")
+set (VALGRIND_COMMAND_OPTIONS "-v --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe")
+set (CTEST_MEMORYCHECK_COMMAND "/usr/bin/valgrind")
+set (CTEST_MEMORYCHECK_COMMAND_OPTIONS "-v --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe")
+
+set (CTEST_TEST_TIMEOUT 1200 CACHE STRING 
+    "Maximum time allowed before CTest will kill the test.") 
+set (DART_TESTING_TIMEOUT 1200 CACHE STRING 
+    "Maximum time allowed before CTest will kill the test." FORCE)
+
+SET(CTEST_SUBMIT_RETRY_DELAY 20 CACHE STRING
+    "How long to wait between timed-out CTest submissions.")
diff --git a/gatb-core/thirdparty/hdf5/README.txt b/gatb-core/thirdparty/hdf5/README.txt
new file mode 100644
index 0000000..7da8038
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/README.txt
@@ -0,0 +1,38 @@
+HDF5 version 1.8.13 released on 2014-05-05
+Please refer to the release_docs/INSTALL file for installation instructions.
+------------------------------------------------------------------------------
+
+This release is fully functional for the API described in the documentation. 
+See the RELEASE.txt file in the release_docs/ directory for information 
+specific to this release of the library.  Several INSTALL* files can also be 
+found in the release_docs/ directory:  INSTALL contains instructions for 
+compiling and installing the library;  INSTALL_parallel contains instructions 
+for installing the parallel version of the library;  similarly-named files
+contain instructions for VMS and several environments on MS Windows systems. 
+
+Documentation for this release can be found at the following URL:
+    http://www.hdfgroup.org/HDF5/doc/.
+
+The following  mailing lists are currently set up for HDF5 Library users:
+
+    news        - For announcements of HDF5 related developments,
+                  not a discussion list.
+
+    hdf-forum   - For general discussion of the HDF5 library with
+                  other users.
+
+To subscribe to a list, send mail to "<list>-subscribe at lists.hdfgroup.org".
+where <list> is the name of the list.  For example, send a request 
+to subscribe to the 'news' mail list to the following address:
+    news-subscribe at lists.hdfgroup.org
+
+Messages sent to the list should be addressed to "<list>@lists.hdfgroup.org".
+
+Periodic code snapshots are provided at the following URL:
+    ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf5/snapshots
+Please read the README.txt file in that directory before working with a 
+library snapshot.
+
+The HDF5 website is located at http://hdfgroup.org/HDF5/
+
+Bugs should be reported to help at hdfgroup.org.
diff --git a/gatb-core/thirdparty/hdf5/UserMacros.cmake b/gatb-core/thirdparty/hdf5/UserMacros.cmake
new file mode 100644
index 0000000..65ea5d4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/UserMacros.cmake
@@ -0,0 +1,22 @@
+########################################################
+#  Include file for user options
+########################################################
+
+#-----------------------------------------------------------------------------
+#------------------- E X A M P L E   B E G I N--------------------------------
+#-----------------------------------------------------------------------------
+# Option to Build with User Defined Values
+#-----------------------------------------------------------------------------
+MACRO (MACRO_USER_DEFINED_LIBS)
+  set (USER_DEFINED_VALUE "FALSE")
+ENDMACRO (MACRO_USER_DEFINED_LIBS)
+
+#-------------------------------------------------------------------------------
+option (BUILD_USER_DEFINED_LIBS "Build With User Defined Values" OFF)
+if (BUILD_USER_DEFINED_LIBS)
+  MACRO_USER_DEFINED_LIBS ()
+endif (BUILD_USER_DEFINED_LIBS)
+#-----------------------------------------------------------------------------
+#------------------- E X A M P L E   E N D -----------------------------------
+#-----------------------------------------------------------------------------
+ 
\ No newline at end of file
diff --git a/gatb-core/thirdparty/hdf5/config/BlankForm b/gatb-core/thirdparty/hdf5/config/BlankForm
new file mode 100644
index 0000000..31116bf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/BlankForm
@@ -0,0 +1,138 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+
+
+#----------------------------------------------------------------------------
+# Compiler flags. The CPPFLAGS values should not include package debug
+# flags like `-DH5G_DEBUG' since these are added with the
+# `--enable-debug' switch of configure.
+#----------------------------------------------------------------------------
+
+
+# Choosing a C Compiler
+# ---------------------
+#
+# The user should be able to specify the compiler by setting the CC
+# environment variable to the name of the compiler and any switches it 
+# requires for proper operation.  If CC is unset then this script may
+# set it.  If CC is unset by time this script completes then configure 
+# will try `gcc' and `cc' in that order (perhaps some others too).
+#
+# Note: Code later in this file may depend on the value of $CC_BASENAME
+#       in order to distinguish between different compilers when
+#       deciding which compiler command-line switches to use.  This
+#       variable is set based on the incoming value of $CC and is only
+#       used within this file.
+
+if test "X-" =  "X-$CC"; then
+    CC="/some/default/compiler/named/foo -ansi"
+    CC_BASENAME=foo
+fi
+
+
+# C Compiler and Preprocessor Flags
+# ---------------------------------
+#
+# Flags that end with `_CFLAGS' are always passed to the compiler.
+# Flags that end with `_CPPFLAGS' are passed to the compiler when
+# compiling but not when linking.
+#
+# DEBUG_CFLAGS		Flags to pass to the compiler to create a
+# DEBUG_CPPFLAGS	library suitable for use with debugging
+#			tools. Usually this list will exclude
+#			optimization switches (like `-O') and include
+#			switches that turn on symbolic debugging
+#			support (like `-g').
+#
+# PROD_CFLAGS		Flags to pass to the compiler to create a
+# PROD_CPPFLAGS		production version of the library.  These
+#			usualy exclude symbolic debugging switches
+#			(like `-g') and include optimization switches
+#			(like `-O').
+#
+# PROFILE_CFLAGS	Flags to pass to the compiler to create a
+# PROFILE_CPPFLAGS	library suitable for performance testing (like 
+# 			`-pg').  This may or may not include debugging 
+# 			or production flags.
+#			
+# H5_CFLAGS		Flags can be added to this variable which
+#			might already be partially initialized.  These 
+#			flags will always be passed to the compiler
+#			and should include switches to turn on full
+#			warnings.  HDF5 attempts to be ANSI and Posix
+#			compliant and employ good programming
+#			practices resulting in few if any
+#			warnings.
+#
+#			Warning flags do not have to be added to H5_CFLAGS
+#			variable if the compiler is the GNU gcc
+#			compiler or a descendent of gcc such as EGCS or PGCC.
+#
+# AM_CFLAGS             Flags added directly into this variable will
+#                       be propogated to the compiler wrapper scripts (h5cc,
+#                       h5c++, et cetera) in addition to being used to compile 
+#                       the library.
+#
+# These flags should be set according to the compiler being used.
+# There are two ways to check the compiler.  You can try using `-v' or 
+# `--version' to see if the compiler will print a version string.  You 
+# can use the value of $CC_BASENAME which is the base name of the
+# first word in $CC (note that the value of CC may have changed
+# above).
+
+case $CC_BASENAME in
+    gcc)
+	H5_CFLAGS="$H5_CFLAGS -Wsign-compare" #Only works for some versions
+	DEBUG_CFLAGS="-g -fverbose-asm"
+	DEBUG_CPPFLAGS=
+	PROD_CFLAGS="-O3 -fomit-frame-pointer"
+	PROD_CPPFLAGS=
+	PROFILE_CFLAGS="-pg"
+	PROFILE_CPPFLAGS=
+	;;
+
+    *)
+	H5_CFLAGS="$H5_CFLAGS -ansi"
+	DEBUG_CFLAGS="-g"
+	DEBUG_CPPFLAGS=
+	PROD_CFLAGS="-O"
+	PROD_CPPFLAGS=
+	PROFILE_CFLAGS="-pg"
+	PROFILE_CPPFLAGS=
+	;;
+esac
+
+
+
+# Overriding Configure Tests
+# --------------------------
+#
+# Values for overriding configuration tests when cross compiling.
+# This includes compiling on some machines where the serial front end
+# compiles for a parallel back end.
+
+# Set this to `yes' or `no' depending on whether the target is big
+# endian or little endian.
+#ac_cv_c_bigendian=${ac_cv_c_bigendian='yes'}
+
+# Set this to the width required by printf() to print type `long
+# long'.  For instance, if the format would be `%lld' then set it to
+# `ll' or if the format would be `%qd' set it to `q'.
+#hdf5_cv_printf_ll=${hdf5_cv_printf_ll='ll'}
diff --git a/gatb-core/thirdparty/hdf5/config/COPYING b/gatb-core/thirdparty/hdf5/config/COPYING
new file mode 100644
index 0000000..6903daf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/COPYING
@@ -0,0 +1,16 @@
+
+  Copyright by  The HDF Group and 
+                The Board of Trustees of the University of Illinois. 
+  All rights reserved. 
+
+  The files and subdirectories in this directory are part of HDF5.  
+  The full HDF5 copyright notice, including terms governing use, 
+  modification, and redistribution, is contained in the files COPYING 
+  and Copyright.html.  COPYING can be found at the root of the source 
+  code distribution tree; Copyright.html can be found at the root 
+  level of an installed copy of the electronic HDF5 document set and 
+  is linked from the top-level documents page.  It can also be found 
+  at http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not 
+  have access to either file, you may request a copy from 
+  help at hdfgroup.org. 
+
diff --git a/gatb-core/thirdparty/hdf5/config/Makefile.am.blank b/gatb-core/thirdparty/hdf5/config/Makefile.am.blank
new file mode 100644
index 0000000..a54c734
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/Makefile.am.blank
@@ -0,0 +1,69 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+##
+## Makefile.am
+## Run automake to generate a Makefile.in from this file.
+#
+# HDF5 Library Makefile(.in)
+#
+
+## Makefile.am template
+## When automake is run, it scans configure.ac to find all Makefiles used by
+## the build that come from Makefile.in files.  If there are Makefile.am's 
+## in any of those locations, it parses the Makefile.am's to produce
+## Makefile.in's, which configure uses to create Makefiles.
+##
+## Comments in the Makefile.am with two pound signs will be stripped by
+## automake, comments with one pound sign will be passed through to the
+## Makefile.in (and thence into the Makefile).  Be warned, though, that
+## automake tends to move things around in the Makefile.in, lines in the
+## Makefile.in aren't always in the order they were in the Makefile.am.
+##
+## Almost all Makefile.am's in hdf5 include commence.am and conclude.am; these
+## files are treated as if they were included textually in the Makefile.am when
+## automake processes it.  Commence.am also includes a (mostly) comprehensive
+## list of make targets.
+##
+
+include $(top_srcdir)/config/commence.am
+
+# Add include directories to the C preprocessor flags
+AM_CPPFLAGS+=-I$(top_srcdir)/src
+
+# Our main targets, the library foo.la and the programs bar and baz
+lib_LTLIBRARIES=foo.la
+bin_PROGRAMS=bar baz
+
+# Helper programs and test programs
+noinst_PROGRAMS=helper
+check_PROGRAMS=test1 test2
+check_SCRIPTS=runtest
+
+# Remove files generated by tests during 'make check-clean'
+CHECK_CLEANFILES=test1.h5 test2.h5
+
+# library sources
+foo_la_SOURCES= source1.c source2.c anothersource.c                   \
+        sourceonanotherline.c
+
+# program sources
+bar_SOURCES= bar.c barsource.c
+test2_SOURCES= asdf.c jkl.c
+
+# Link with the main HDF5 library and foo.la when building other targets.
+# It's important that libhdf5 comes last, since foo.la depends on it.
+LDADD=foo.la $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/gatb-core/thirdparty/hdf5/config/apple b/gatb-core/thirdparty/hdf5/config/apple
new file mode 100644
index 0000000..5203695
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/apple
@@ -0,0 +1,178 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# The default compiler is `clang'.
+# No support for OS older than darwin 10.X.
+if test "X-" = "X-$CC"; then
+    case "$host_os" in
+	darwin10.*)	# Snow Leopard. Use gcc/g++ because clang++ is not available.
+	    CC=gcc
+	    CC_BASENAME=gcc
+	    ;;
+	*)
+	    CC=clang
+	    CC_BASENAME=clang
+
+	    # Production
+	    PROD_CFLAGS="-O3" 
+	    PROD_CPPFLAGS=
+
+	    # Debug
+	    DEBUG_CFLAGS="-g -O0"
+	    DEBUG_CPPFLAGS=
+
+	    # Profile
+	    # Use this for profiling with gprof
+	    # Just "-g" for now. More later.
+	    PROFILE_CFLAGS="-g"
+	    PROFILE_CPPFLAGS=
+	    ;;
+    esac
+fi
+
+# Figure out compiler flags
+. $srcdir/config/gnu-flags
+# temp patch: if GCC 4.2.1 is used in Lion or Mountain Lion systems, do not
+# use -O option as it causes failures in test/dt_arith.
+case "$host_os" in
+    darwin1[12].*)   # lion & mountain lion
+	#echo cc_vendor=$cc_vendor'-'cc_version=$cc_version
+	case "$cc_vendor-$cc_version" in
+	    gcc-4.2.1)
+		# Remove any -O flags
+		#echo PROD_CFLAGS=$PROD_CFLAGS
+		PROD_CFLAGS="`echo $PROD_CFLAGS | sed -e 's/-O[0-3]*//'`"
+		#echo new PROD_CFLAGS=$PROD_CFLAGS
+		;;
+	esac
+	;;
+esac
+ 
+. $srcdir/config/intel-flags
+if test "X-" = "X-$FC"; then
+    case $CC_BASENAME in
+        clang)
+	    # clang has no fortran compiler. Use gfortran.
+            FC=gfortran
+            FC_BASENAME=gfortran
+            ;;
+        gcc*)
+            FC=gfortran
+            FC_BASENAME=gfortran
+            ;;
+        icc*)
+            FC=ifort
+            FC_BASENAME=ifort
+            ;;
+    esac
+fi
+
+if test "X-" = "X-$CXX"; then
+    case $CC_BASENAME in
+        clang)
+            CXX=clang++
+            CXX_BASENAME=clang++
+            ;;
+        gcc)
+            CXX=g++
+            CXX_BASENAME=g++
+            ;;
+        icc)
+            CXX=icpc
+            CXX_BASENAME=icpc
+            ;;
+    esac
+fi
+
+case $CXX_BASENAME in
+    clang++)
+	PROD_CXXFLAGS="-O3"
+	DEBUG_CXXFLAGS="-g -O0"
+	# Use this for profiling with gprof
+	# Just "-g" for now. More later.
+	PROFILE_CXXFLAGS="-g"
+	;;
+esac
+
+# compiler version strings
+case $CC in
+    clang)
+        cc_version_info=`$CC $CFLAGS $H5_CFLAGS --version 2>&1 |\
+            grep 'Apple' | sed 's/(.*//'`
+        ;;
+
+    *gcc*)
+        cc_version_info=`$CC $CFLAGS $H5_CFLAGS --version 2>&1 | grep -v 'PathScale' |\
+            grep 'GCC' | sed 's/.*\((GCC) [-a-z0-9\. ]*.*\)/\1/'`
+        ;;
+
+    *icc*)
+        cc_version_info=`$CC $CCFLAGS $H5_CCFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+
+    *)
+        echo "No match to get cc_version_info for $CC"
+        ;;
+esac
+# Figure out Fortran compiler flags and version strings
+case $FC in
+    *gfortran*)
+        . $srcdir/config/gnu-fflags
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS --version 2>&1 |\
+            grep 'GCC' | sed 's/\(.*(GCC) [-a-z0-9\. ]*\).*/\1/'`
+        ;;
+
+    *ifc*|*ifort*)
+        . $srcdir/config/intel-fflags
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+
+     *)
+        echo "No match to get fc_version_info and flags for $FC"
+        ;;
+
+esac
+
+# get c++ version info
+case $CXX in
+    clang++)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS --version 2>&1 |\
+            grep 'Apple' | sed 's/(.*//'`
+        ;;
+
+    *g++*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS --version 2>&1 |\
+            grep 'GCC' | sed 's/.*\((GCC) [-a-z0-9\. ]*.*\)/\1/'`
+        ;;
+
+   *icpc*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+
+    *)
+        echo "No match to get cxx_version_info for $CXX"
+        ;;
+esac
+
diff --git a/gatb-core/thirdparty/hdf5/config/cce-fflags b/gatb-core/thirdparty/hdf5/config/cce-fflags
new file mode 100644
index 0000000..896e711
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cce-fflags
@@ -0,0 +1,73 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# Cray Compiling Environment (CCE) compiler or a derivative.  It is careful not to do anything
+# if the compiler is not Cray; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for cce
+# unless a compiler version is already known
+#
+#   cc_vendor:    The compiler name: Cray
+#   cc_version:   Version number: 8.3.0
+#
+if test X = "X$f9x_flags_set"; then
+    f9x_version="`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 |grep 'Cray'`"
+    if test X != "X$f9x_version"; then
+        f9x_vendor=cce
+        f9x_version=`echo $f9x_version |sed 's/.*Version \([-a-z0-9\.\-]*\).*/\1/'`
+        echo "compiler '$FC' is Cray $f9x_vendor-$f9x_version"
+	fc_version_info=$f9x_version
+    fi
+fi
+
+# Common Cray flags for various situations
+if test "X-cce" = "X-$f9x_vendor"; then
+    # Insert section about version specific problems from compiler flags here,
+    # if necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # General
+    H5_FCFLAGS="${H5_FCFLAGS} -hnocaf"
+
+    # Production
+    # -Wl,-s to remove all symbols for smaller file
+    PROD_FCFLAGS="-O3 -Wl,-s"
+
+    # Debug
+    DEBUG_FCFLAGS="-g -O0"
+
+    # Profile
+    # Use this for profiling with gprof
+    PROFILE_FCFLAGS="-g -p"
+
+    # Flags are set
+    f9x_flags_set=yes
+fi
+
+# Clear f9x info if no flags set
+if test "X-$f9x_flags_set" = "X-"; then
+    f9x_vendor=
+    f9x_version=
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/cce-flags b/gatb-core/thirdparty/hdf5/config/cce-flags
new file mode 100644
index 0000000..a34fcbe
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cce-flags
@@ -0,0 +1,79 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# Cray Compiling Environment (CCE) compiler or a derivative.  It is careful not to do anything
+# if the compiler is not Cray; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for cce
+# unless a compiler version is already known
+#
+#   cc_vendor:    The compiler name: Cray
+#   cc_version:   Version number: 8.3.0
+#
+if test X = "X$cc_flags_set"; then
+    cc_version="`$CC $CFLAGS $H5_CFLAGS -V 2>&1 |grep 'Cray'`"
+    if test X != "X$cc_version"; then
+        cc_vendor=cce
+        cc_version=`echo $cc_version |sed 's/.*Version \([-a-z0-9\.\-]*\).*/\1/'`
+        echo "compiler '$CC' is Cray $cc_vendor-$cc_version"
+	cc_version_info=$cc_version
+	cxx_version_info=$cc_version
+    fi
+fi
+
+# Common Cray flags for various situations
+if test "X-cce" = "X-$cc_vendor"; then
+    # Insert section about version specific problems from compiler flags here,
+    # if necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # General
+    # Default to C99 standard.
+    H5_CFLAGS="${H5_CFLAGS:--hc99 $arch}"
+
+    # Production
+    # -Wl,-s to remove all symbols for smaller file
+    PROD_CFLAGS="-O3 -Wl,-s"
+    PROD_CPPFLAGS=
+
+    # Debug
+    DEBUG_CFLAGS="-g -O0"
+    DEBUG_CPPFLAGS=
+
+    # Profile
+    # Use this for profiling with gprof
+    PROFILE_CFLAGS="-g -p"
+    PROFILE_CPPFLAGS=
+
+    # Flags are set
+    cc_flags_set=yes
+
+fi
+
+# Clear cc info if no flags set
+if test "X-$cc_flags_set" = "X-"; then
+    cc_vendor=
+    cc_version=
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/CPack.Info.plist.in b/gatb-core/thirdparty/hdf5/config/cmake/CPack.Info.plist.in
new file mode 100644
index 0000000..08d371b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/CPack.Info.plist.in
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>English</string>
+  <key>CFBundleExecutable</key>
+  <string>@CPACK_PACKAGE_FILE_NAME@</string>
+  <key>CFBundleIconFile</key>
+  <string>@CPACK_BUNDLE_ICON@</string>
+  <key>CFBundleIdentifier</key>
+  <string>org. at CPACK_PACKAGE_VENDOR@. at CPACK_PACKAGE_NAME@@CPACK_MODULE_VERSION_SUFFIX@</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>@CPACK_PACKAGE_VERSIO@</string>
+  <key>CFBundleShortVersionString</key>
+  <string>@CPACK_SHORT_VERSION_STRING@</string>
+  <key>CSResourcesFileMapped</key>
+  <true/>
+</dict>
+</plist>
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/CTestCustom.cmake b/gatb-core/thirdparty/hdf5/config/cmake/CTestCustom.cmake
new file mode 100644
index 0000000..8d80f19
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/CTestCustom.cmake
@@ -0,0 +1,215 @@
+set (CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 3000)
+ 
+set (CTEST_CUSTOM_WARNING_EXCEPTION
+    ${CTEST_CUSTOM_WARNING_EXCEPTION}
+    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning C4090:"
+    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning:[ \t]*passing argument"
+    "H5detect.c[0-9 \t:]*warning:[ \t]*passing argument"
+    "note.*expected.*void.*but argument is of type.*volatile"
+    "H5Tconv.c[0-9 \t:]*warning:[ \t]*comparison is always false due to limited range of data type"
+    "H5Ztrans.c.[0-9]+.[ \t]*:[ \t]*warning C4244"
+    "SZIP.src.*:[ \t]*warning"
+    "POSIX name for this item is deprecated"
+    "disabling jobserver mode"
+    "config.cmake.xlatefile.c"
+    "warning.*implicit declaration of function"
+    "note: expanded from macro"
+#    "fpp:[ \t]*warning:[ \t]*cannot remove H5_DEBUG_API - not a predefined macro"
+)
+ 
+set (CTEST_CUSTOM_MEMCHECK_IGNORE
+    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
+    H5TEST-flush1           #designed to fail
+    H5TEST-flush2           #designed to need flush1
+    H5TEST-error_test       #uses runTest.cmake
+    H5TEST-err_compat       #uses runTest.cmake
+    H5TEST-links_env        #uses runTest.cmake
+    H5TEST-testlibinfo      #uses grepTest.cmake
+    H5TEST-clear-testhdf5-objects
+    H5TEST-clear-objects
+    H5TEST-clear-cache-objects
+    H5TEST-clear-cache_api-objects
+    H5TEST-clear-cache_tagging-objects
+    H5TEST-clear-ttsafe-objects
+    H5TEST-clear-err_compat-objects
+    H5TEST-clear-error_test-objects
+    H5TEST-clear-links_env-objects
+    PERFORM_h5perform-clear-objects
+    HL_TOOLS-clear-objects
+    HL_test-clear-objects
+    HL_fortran_test-clear-objects
+    ######### tools/h5copy #########
+    H5COPY-clearall-objects
+    ######### tools/h5diff #########
+    H5DIFF-clearall-objects
+    ######### tools/h5dump #########
+    H5DUMP-clearall-objects
+    H5DUMP_PACKED_BITS-clearall-objects
+    H5DUMP-XML-clearall-objects
+    ######### tools/h5import #########
+    H5IMPORT-clear-objects
+    ######### tools/h5jam #########
+    H5JAM-SETUP-N_twithub_u10_c-clear-objects
+    H5JAM-SETUP-N_twithub_u10_c
+    H5JAM-N_twithub_u10_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub_u10_c
+    H5JAM-CHECKFILE-N_twithub_u10_c-clear-objects
+    H5JAM-SETUP-N_twithub_u511_c-clear-objects
+    H5JAM-SETUP-N_twithub_u511_c
+    H5JAM-N_twithub_u511_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub_u511_c
+    H5JAM-CHECKFILE-N_twithub_u511_c-clear-objects
+    H5JAM-SETUP-N_twithub_u512_c-clear-objects
+    H5JAM-SETUP-N_twithub_u512_c
+    H5JAM-N_twithub_u512_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub_u512_c
+    H5JAM-CHECKFILE-N_twithub_u512_c-clear-objects
+    H5JAM-SETUP-N_twithub_u513_c-clear-objects
+    H5JAM-SETUP-N_twithub_u513_c
+    H5JAM-N_twithub_u513_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub_u513_c
+    H5JAM-CHECKFILE-N_twithub_u513_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u10_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u10_c
+    H5JAM-N_twithub513_u10_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub513_u10_c
+    H5JAM-CHECKFILE-N_twithub513_u10_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u511_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u511_c
+    H5JAM-N_twithub513_u511_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub513_u511_c
+    H5JAM-CHECKFILE-N_twithub513_u511_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u512_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u512_c
+    H5JAM-N_twithub513_u512_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub513_u512_c
+    H5JAM-CHECKFILE-N_twithub513_u512_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u513_c-clear-objects
+    H5JAM-SETUP-N_twithub513_u513_c
+    H5JAM-N_twithub513_u513_c-clear-objects
+    H5JAM-NONE_COPY-N_twithub513_u513_c
+    H5JAM-CHECKFILE-N_twithub513_u513_c-clear-objects
+    H5JAM-CHECKFILE-twithub_u10_c-clear-objects
+    H5JAM-twithub_u511_c-clear-objects
+    H5JAM-CHECKFILE-twithub_u511_c-clear-objects
+    H5JAM-twithub_u512_c-clear-objects
+    H5JAM-CHECKFILE-twithub_u512_c-clear-objects
+    H5JAM-twithub_u513_c-clear-objects
+    H5JAM-CHECKFILE-twithub_u513_c-clear-objects
+    H5JAM-twithub513_u10_c-clear-objects
+    H5JAM-CHECKFILE-twithub513_u10_c-clear-objects
+    H5JAM-twithub513_u511_c-clear-objects
+    H5JAM-CHECKFILE-twithub513_u511_c-clear-objects
+    H5JAM-twithub513_u512_c-clear-objects
+    H5JAM-CHECKFILE-twithub513_u512_c-clear-objects
+    H5JAM-twithub513_u513_c-clear-objects
+    H5JAM-CHECKFILE-twithub513_u513_c-clear-objects
+    H5JAM-SETUP-twithub_tall-clear-objects
+    H5JAM-SETUP-twithub_tall
+    H5JAM-UNJAM-twithub_tall-clear-objects
+    H5JAM-UNJAM_D-twithub_tall-clear-objects
+    H5JAM-CHECKFILE-twithub_tall-clear-objects
+    H5JAM-SETUP-twithub513_tall-clear-objects
+    H5JAM-SETUP-twithub513_tall
+    H5JAM-UNJAM-twithub513_tall-clear-objects
+    H5JAM-UNJAM_D-twithub513_tall-clear-objects
+    H5JAM-CHECKFILE-twithub513_tall-clear-objects
+    H5JAM-SETUP-N_twithub_tall-clear-objects
+    H5JAM-SETUP-N_twithub_tall
+    H5JAM-UNJAM-N_twithub_tall-clear-objects
+    H5JAM-UNJAM_D-N_twithub_tall-clear-objects
+    H5JAM-CHECKFILE-N_twithub_tall-clear-objects
+    H5JAM-SETUP-N_twithub513_tall-clear-objects
+    H5JAM-SETUP-N_twithub513_tall
+    H5JAM-UNJAM-N_twithub513_tall-clear-objects
+    H5JAM-UNJAM_D-N_twithub513_tall-clear-objects
+    H5JAM-CHECKFILE-N_twithub513_tall-clear-objects
+    H5JAM-SETUP-D_twithub_tall-clear-objects
+    H5JAM-SETUP-D_twithub_tall
+    H5JAM-UNJAM-D_twithub_tall-clear-objects
+    H5JAM-UNJAM_D-D_twithub_tall-clear-objects
+    H5JAM-CHECKFILE-D_twithub_tall-clear-objects
+    H5JAM-SETUP-D_twithub513_tall-clear-objects
+    H5JAM-SETUP-D_twithub513_tall
+    H5JAM-UNJAM-D_twithub513_tall-clear-objects
+    H5JAM-UNJAM_D-D_twithub513_tall-clear-objects
+    H5JAM-CHECKFILE-D_twithub513_tall-clear-objects
+    H5JAM-CHECKFILE-ta_u513-clear-objects
+    H5JAM-twithub_u10-clear-objects
+    H5JAM-CHECKFILE-twithub_u10-clear-objects
+    H5JAM-twithub_u511-clear-objects
+    H5JAM-CHECKFILE-twithub_u511-clear-objects
+    H5JAM-twithub_u512-clear-objects
+    H5JAM-CHECKFILE-twithub_u512-clear-objects
+    H5JAM-twithub_u513-clear-objects
+    H5JAM-CHECKFILE-twithub_u513-clear-objects
+    H5JAM-twithub513_u10-clear-objects
+    H5JAM-CHECKFILE-twithub513_u10-clear-objects
+    H5JAM-twithub513_u511-clear-objects
+    H5JAM-CHECKFILE-twithub513_u511-clear-objects
+    H5JAM-twithub513_u512-clear-objects
+    H5JAM-CHECKFILE-twithub513_u512-clear-objects
+    H5JAM-twithub513_u513-clear-objects
+    H5JAM-CHECKFILE-twithub513_u513-clear-objects
+    H5JAM-twithub_u10_c-clear-objects
+    H5JAM-tall_u10-clear-objects
+    H5JAM-CHECKFILE-tall_u10-clear-objects
+    H5JAM-tall_u511-clear-objects
+    H5JAM-CHECKFILE-tall_u511-clear-objects
+    H5JAM-tall_u512-clear-objects
+    H5JAM-CHECKFILE-tall_u512-clear-objects
+    H5JAM-tall_u513-clear-objects
+    H5JAM-CHECKFILE-tall_u513-clear-objects
+    H5JAM-SETUP-ta_u10-clear-objects
+    H5JAM-SETUP-ta_u10
+    H5JAM-ta_u10-clear-objects
+    H5JAM-NONE_COPY-ta_u10
+    H5JAM-CHECKFILE-ta_u10-clear-objects
+    H5JAM-SETUP-ta_u511-clear-objects
+    H5JAM-SETUP-ta_u511
+    H5JAM-ta_u511-clear-objects
+    H5JAM-NONE_COPY-ta_u511
+    H5JAM-CHECKFILE-ta_u511-clear-objects
+    H5JAM-SETUP-ta_u512-clear-objects
+    H5JAM-SETUP-ta_u512
+    H5JAM-ta_u512-clear-objects
+    H5JAM-NONE_COPY-ta_u512
+    H5JAM-CHECKFILE-ta_u512-clear-objects
+    H5JAM-SETUP-ta_u513-clear-objects
+    H5JAM-SETUP-ta_u513
+    H5JAM-ta_u513-clear-objects
+    H5JAM-NONE_COPY-ta_u513
+    ######### tools/h5ls #########
+    H5LS-clearall-objects
+    ######### tools/h5repack #########
+    H5REPACK-clearall-objects
+    H5REPACK-gzip_verbose_filters                       #uses runTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset2_chunk_20x10            #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT_ALL-chunk_20x10              #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset2_conti                  #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT_ALL-conti                    #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset2_compa                  #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT_ALL-compa                    #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_compa_conti             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_compa_chunk             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_compa_compa             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_conti_compa             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_conti_chunk             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-dset_conti_conti             #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-chunk_compa                  #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-chunk_conti                  #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-chunk_18x13                  #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-contig_small_compa           #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT-contig_small_fixed_compa     #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT_ALL-layout_long_switches     #uses grepTest.cmake
+    H5REPACK_VERIFY_LAYOUT_ALL-layout_short_switches    #uses grepTest.cmake
+    H5REPACK-plugin
+    ######### tools/h5stat #########
+    H5STAT-clearall-objects
+    ######### tools/misc #########
+    H5REPART-clearall-objects
+    H5MKGRP-clearall-objects
+    ######### examples #########
+    EXAMPLES-clear-objects
+    CPP_ex-clear-objects
+)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/ConfigureChecks.cmake b/gatb-core/thirdparty/hdf5/config/cmake/ConfigureChecks.cmake
new file mode 100644
index 0000000..606fae9
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/ConfigureChecks.cmake
@@ -0,0 +1,269 @@
+#-----------------------------------------------------------------------------
+# Include all the necessary files for macros
+#-----------------------------------------------------------------------------
+set (HDF_PREFIX "H5")
+include (${HDF_RESOURCES_EXT_DIR}/ConfigureChecks.cmake)
+
+#-----------------------------------------------------------------------------
+# Option to Clear File Buffers before write --enable-clear-file-buffers
+#-----------------------------------------------------------------------------
+option (HDF5_Enable_Clear_File_Buffers "Securely clear file buffers before writing to file" ON)
+if (HDF5_Enable_Clear_File_Buffers)
+  set (H5_CLEAR_MEMORY 1)
+endif (HDF5_Enable_Clear_File_Buffers)
+MARK_AS_ADVANCED (HDF5_Enable_Clear_File_Buffers)
+
+#-----------------------------------------------------------------------------
+# Option for --enable-strict-format-checks
+#-----------------------------------------------------------------------------
+option (HDF5_STRICT_FORMAT_CHECKS "Whether to perform strict file format checks" OFF)
+if (HDF5_STRICT_FORMAT_CHECKS)
+  set (H5_STRICT_FORMAT_CHECKS 1)
+endif (HDF5_STRICT_FORMAT_CHECKS)
+MARK_AS_ADVANCED (HDF5_STRICT_FORMAT_CHECKS)
+
+#-----------------------------------------------------------------------------
+# Option for --enable-metadata-trace-file
+#-----------------------------------------------------------------------------
+option (HDF5_METADATA_TRACE_FILE "Enable metadata trace file collection" OFF)
+if (HDF5_METADATA_TRACE_FILE)
+  set (H5_METADATA_TRACE_FILE 1)
+endif (HDF5_METADATA_TRACE_FILE)
+MARK_AS_ADVANCED (HDF5_METADATA_TRACE_FILE)
+
+# ----------------------------------------------------------------------
+# Decide whether the data accuracy has higher priority during data
+# conversions.  If not, some hard conversions will still be prefered even
+# though the data may be wrong (for example, some compilers don't
+# support denormalized floating values) to maximize speed.
+#
+option (HDF5_WANT_DATA_ACCURACY "IF data accuracy is guaranteed during data conversions" ON)
+if (HDF5_WANT_DATA_ACCURACY)
+  set (H5_WANT_DATA_ACCURACY 1)
+endif (HDF5_WANT_DATA_ACCURACY)
+MARK_AS_ADVANCED (HDF5_WANT_DATA_ACCURACY)
+
+# ----------------------------------------------------------------------
+# Decide whether the presence of user's exception handling functions is
+# checked and data conversion exceptions are returned.  This is mainly
+# for the speed optimization of hard conversions.  Soft conversions can
+# actually benefit little.
+#
+option (HDF5_WANT_DCONV_EXCEPTION "exception handling functions is checked during data conversions" ON)
+if (HDF5_WANT_DCONV_EXCEPTION)
+  set (H5_WANT_DCONV_EXCEPTION 1)
+endif (HDF5_WANT_DCONV_EXCEPTION)
+MARK_AS_ADVANCED (HDF5_WANT_DCONV_EXCEPTION)
+
+# ----------------------------------------------------------------------
+# Check if they would like the function stack support compiled in
+#
+option (HDF5_ENABLE_CODESTACK "Enable the function stack tracing (for developer debugging)." OFF)
+if (HDF5_ENABLE_CODESTACK)
+  set (H5_HAVE_CODESTACK 1)
+endif (HDF5_ENABLE_CODESTACK)
+MARK_AS_ADVANCED (HDF5_ENABLE_CODESTACK)
+
+#-----------------------------------------------------------------------------
+#  Are we going to use HSIZE_T
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_HSIZET "Enable datasets larger than memory" ON)
+if (HDF5_ENABLE_HSIZET)
+  set (${HDF_PREFIX}_HAVE_LARGE_HSIZET 1)
+endif (HDF5_ENABLE_HSIZET)
+
+# so far we have no check for this
+set (H5_HAVE_TMPFILE 1)
+
+# TODO --------------------------------------------------------------------------
+# Should the Default Virtual File Driver be compiled?
+# This is hard-coded now but option should added to match configure
+#
+set (H5_DEFAULT_VFD H5FD_SEC2)
+
+if (NOT DEFINED "H5_DEFAULT_PLUGINDIR")
+  if (WINDOWS)
+    set (H5_DEFAULT_PLUGINDIR "%ALLUSERSPROFILE%\\\\hdf5\\\\lib\\\\plugin")
+  else (WINDOWS)
+    set (H5_DEFAULT_PLUGINDIR "/usr/local/hdf5/lib/plugin")
+  endif (WINDOWS)
+endif (NOT DEFINED "H5_DEFAULT_PLUGINDIR")
+
+if (WINDOWS)
+  set (H5_HAVE_WINDOWS 1)
+  # ----------------------------------------------------------------------
+  # Set the flag to indicate that the machine has window style pathname,
+  # that is, "drive-letter:\" (e.g. "C:") or "drive-letter:/" (e.g. "C:/").
+  # (This flag should be _unset_ for all machines, except for Windows)
+  set (H5_HAVE_WINDOW_PATH 1)
+endif (WINDOWS)
+
+# ----------------------------------------------------------------------
+# END of WINDOWS Hard code Values
+# ----------------------------------------------------------------------
+
+CHECK_FUNCTION_EXISTS (difftime          H5_HAVE_DIFFTIME)
+
+# Find the library containing clock_gettime()
+if (NOT WINDOWS)
+  CHECK_FUNCTION_EXISTS(clock_gettime CLOCK_GETTIME_IN_LIBC)
+  CHECK_LIBRARY_EXISTS(rt clock_gettime "" CLOCK_GETTIME_IN_LIBRT)
+  CHECK_LIBRARY_EXISTS(posix4 clock_gettime "" CLOCK_GETTIME_IN_LIBPOSIX4)
+  if (CLOCK_GETTIME_IN_LIBC)
+    set (H5_HAVE_CLOCK_GETTIME 1)
+  elseif (CLOCK_GETTIME_IN_LIBRT)
+    set (H5_HAVE_CLOCK_GETTIME 1)
+    list (APPEND LINK_LIBS rt)
+  elseif (CLOCK_GETTIME_IN_LIBPOSIX4)
+    set (H5_HAVE_CLOCK_GETTIME 1)
+    list (APPEND LINK_LIBS posix4)
+  endif (CLOCK_GETTIME_IN_LIBC)
+endif (NOT WINDOWS)
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+#  Check if Direct I/O driver works
+#-----------------------------------------------------------------------------
+if (NOT WINDOWS)
+  option (HDF5_ENABLE_DIRECT_VFD "Build the Direct I/O Virtual File Driver" ON)
+  if (HDF5_ENABLE_DIRECT_VFD)
+    set (msg "Performing TEST_DIRECT_VFD_WORKS")
+    set (MACRO_CHECK_FUNCTION_DEFINITIONS "-DTEST_DIRECT_VFD_WORKS -D_GNU_SOURCE ${CMAKE_REQUIRED_FLAGS}")
+    TRY_RUN (TEST_DIRECT_VFD_WORKS_RUN   TEST_DIRECT_VFD_WORKS_COMPILE
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+        OUTPUT_VARIABLE OUTPUT
+    )
+    if (TEST_DIRECT_VFD_WORKS_COMPILE)
+      if (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
+        HDF_FUNCTION_TEST (HAVE_DIRECT)
+        set (CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
+        add_definitions ("-D_GNU_SOURCE")
+      else (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
+        set (TEST_DIRECT_VFD_WORKS "" CACHE INTERNAL ${msg})
+        message (STATUS "${msg}... no")
+        file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+              "Test TEST_DIRECT_VFD_WORKS Run failed with the following output and exit code:\n ${OUTPUT}\n"
+        )
+      endif (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
+    else (TEST_DIRECT_VFD_WORKS_COMPILE )
+      set (TEST_DIRECT_VFD_WORKS "" CACHE INTERNAL ${msg})
+      message (STATUS "${msg}... no")
+      file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+          "Test TEST_DIRECT_VFD_WORKS Compile failed with the following output:\n ${OUTPUT}\n"
+      )
+    endif (TEST_DIRECT_VFD_WORKS_COMPILE)
+  endif (HDF5_ENABLE_DIRECT_VFD)
+endif (NOT WINDOWS)
+
+
+#-----------------------------------------------------------------------------
+# Macro to determine the various conversion capabilities
+#-----------------------------------------------------------------------------
+MACRO (H5ConversionTests TEST msg)
+  if ("${TEST}" MATCHES "^${TEST}$")
+   # message (STATUS "===> ${TEST}")
+    TRY_RUN (${TEST}_RUN   ${TEST}_COMPILE
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_DIR}/ConversionTests.c
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-D${TEST}_TEST
+        OUTPUT_VARIABLE OUTPUT
+    )
+    if (${TEST}_COMPILE)
+      if (${TEST}_RUN  MATCHES 0)
+        set (${TEST} 1 CACHE INTERNAL ${msg})
+        message (STATUS "${msg}... yes")
+      else (${TEST}_RUN  MATCHES 0)
+        set (${TEST} "" CACHE INTERNAL ${msg})
+        message (STATUS "${msg}... no")
+        file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+              "Test ${TEST} Run failed with the following output and exit code:\n ${OUTPUT}\n"
+        )
+      endif (${TEST}_RUN  MATCHES 0)
+    else (${TEST}_COMPILE )
+      set (${TEST} "" CACHE INTERNAL ${msg})
+      message (STATUS "${msg}... no")
+      file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+          "Test ${TEST} Compile failed with the following output:\n ${OUTPUT}\n"
+      )
+    endif (${TEST}_COMPILE)
+
+  endif ("${TEST}" MATCHES "^${TEST}$")
+ENDMACRO (H5ConversionTests)
+
+#-----------------------------------------------------------------------------
+# Macro to make some of the conversion tests easier to write/read
+#-----------------------------------------------------------------------------
+MACRO (H5MiscConversionTest  VAR TEST msg)
+  if ("${TEST}" MATCHES "^${TEST}$")
+    if (${VAR})
+      set (${TEST} 1 CACHE INTERNAL ${msg})
+      message (STATUS "${msg}... yes")
+    else (${VAR})
+      set (${TEST} "" CACHE INTERNAL ${msg})
+      message (STATUS "${msg}... no")
+    endif (${VAR})
+  endif ("${TEST}" MATCHES "^${TEST}$")
+ENDMACRO (H5MiscConversionTest)
+
+#-----------------------------------------------------------------------------
+# Check various conversion capabilities
+#-----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# Set the flag to indicate that the machine is using a special algorithm to convert
+# 'long double' to '(unsigned) long' values.  (This flag should only be set for 
+# the IBM Power6 Linux.  When the bit sequence of long double is 
+# 0x4351ccf385ebc8a0bfcc2a3c3d855620, the converted value of (unsigned)long 
+# is 0x004733ce17af227f, not the same as the library's conversion to 0x004733ce17af2282.
+# The machine's conversion gets the correct value.  We define the macro and disable
+# this kind of test until we figure out what algorithm they use.
+#
+H5ConversionTests (H5_LDOUBLE_TO_LONG_SPECIAL  "Checking IF your system converts long double to (unsigned) long values with special algorithm")
+# ----------------------------------------------------------------------
+# Set the flag to indicate that the machine is using a special algorithm
+# to convert some values of '(unsigned) long' to 'long double' values.  
+# (This flag should be off for all machines, except for IBM Power6 Linux, 
+# when the bit sequences are 003fff..., 007fff..., 00ffff..., 01ffff..., 
+# ..., 7fffff..., the compiler uses a unknown algorithm.  We define a 
+# macro and skip the test for now until we know about the algorithm.
+#
+H5ConversionTests (H5_LONG_TO_LDOUBLE_SPECIAL "Checking IF your system can convert (unsigned) long to long double values with special algorithm")
+# ----------------------------------------------------------------------
+# Set the flag to indicate that the machine can accurately convert
+# 'long double' to '(unsigned) long long' values.  (This flag should be set for
+# all machines, except for Mac OS 10.4 and SGI IRIX64 6.5.  When the bit sequence
+# of long double is 0x4351ccf385ebc8a0bfcc2a3c..., the values of (unsigned)long long
+# start to go wrong on these two machines.  Adjusting it higher to
+# 0x4351ccf385ebc8a0dfcc... or 0x4351ccf385ebc8a0ffcc... will make the converted
+# values wildly wrong.  This test detects this wrong behavior and disable the test.
+#
+H5ConversionTests (H5_LDOUBLE_TO_LLONG_ACCURATE "Checking IF correctly converting long double to (unsigned) long long values")
+# ----------------------------------------------------------------------
+# Set the flag to indicate that the machine can accurately convert
+# '(unsigned) long long' to 'long double' values.  (This flag should be set for
+# all machines, except for Mac OS 10.4, when the bit sequences are 003fff...,
+# 007fff..., 00ffff..., 01ffff..., ..., 7fffff..., the converted values are twice
+# as big as they should be.
+#
+H5ConversionTests (H5_LLONG_TO_LDOUBLE_CORRECT "Checking IF correctly converting (unsigned) long long to long double values")
+# ----------------------------------------------------------------------
+# Check if pointer alignments are enforced
+#
+H5ConversionTests (H5_NO_ALIGNMENT_RESTRICTIONS "Checking IF alignment restrictions are strictly enforced")
+
+# -----------------------------------------------------------------------
+# wrapper script variables
+# 
+set (prefix ${CMAKE_INSTALL_PREFIX})
+set (exec_prefix "\${prefix}")
+set (libdir "${exec_prefix}/lib")
+set (includedir "\${prefix}/include")
+set (host_os ${CMAKE_HOST_SYSTEM_NAME})
+set (CC ${CMAKE_C_COMPILER})
+set (CXX ${CMAKE_CXX_COMPILER})
+set (FC ${CMAKE_Fortran_COMPILER})
+foreach (LINK_LIB ${LINK_LIBS})
+  set (LIBS "${LIBS} -l${LINK_LIB}")
+endforeach (LINK_LIB ${LINK_LIBS})
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/ConversionTests.c b/gatb-core/thirdparty/hdf5/config/cmake/ConversionTests.c
new file mode 100644
index 0000000..b8946a8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/ConversionTests.c
@@ -0,0 +1,267 @@
+#ifdef H5_LDOUBLE_TO_LONG_SPECIAL_TEST
+
+#include <string.h>
+#include <stdlib.h>
+
+int main(void)
+{
+    long double         ld = 20041683600089727.779961L;
+    long                ll;
+    unsigned long       ull;
+    unsigned char       s[16];
+    unsigned char       s2[8];
+    int                 ret = 1;
+
+    if(sizeof(long double) == 16 && sizeof(long) == 8) {
+	/*make sure the long double type has 16 bytes in size and
+	 * 11 bits of exponent.  If it is,
+	 *the bit sequence should be like below.  It's not
+	 *a decent way to check but this info isn't available. */
+	memcpy(s, &ld, 16);
+	if(s[0]==0x43 && s[1]==0x51 && s[2]==0xcc && s[3]==0xf3 &&
+		s[4]==0x85 && s[5]==0xeb && s[6]==0xc8 && s[7]==0xa0 &&
+		s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
+
+	    /* Assign the hexadecimal value of long double type. */
+	    s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
+	    s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
+	    s[8]=0xbf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
+	    s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
+
+	    memcpy(&ld, s, 16);
+
+	    ll = (long)ld;
+	    memcpy(s2, &ll, 8);
+
+	    /* The library's algorithm converts it to 0x 00 47 33 ce 17 af 22 82
+	     * and gets wrong value 20041683600089730 on the IBM Power6 Linux.
+	     * But the IBM Power6 Linux converts it to 0x00 47 33 ce 17 af 22 7f
+	     * and gets the correct value 20041683600089727.  It uses some special
+	     * algorithm.  We're going to define the macro and skip the test until
+	     * we can figure out how they do it. */
+	    if(s2[0]==0x00 && s2[1]==0x47 && s2[2]==0x33 && s2[3]==0xce &&
+		    s2[4]==0x17 && s2[5]==0xaf && s2[6]==0x22 && s2[7]==0x7f)
+		ret = 0;
+
+	    ull = (unsigned long)ld;
+	    memcpy(s2, &ull, 8);
+
+	    /* The unsigned long is the same as signed long. */
+	    if(s2[0]==0x00 && s2[1]==0x47 && s2[2]==0x33 && s2[3]==0xce &&
+		    s2[4]==0x17 && s2[5]==0xaf && s2[6]==0x22 && s2[7]==0x7f)
+		ret = 0;
+	}
+    }
+
+done:
+    exit(ret);
+}
+
+#endif
+
+#ifdef H5_LONG_TO_LDOUBLE_SPECIAL_TEST
+
+#include <string.h>
+#include <stdlib.h>
+
+int main(void)
+{
+    long double         ld;
+    long                ll;
+    unsigned long       ull;
+    unsigned char       s[16];
+    int                 flag=0, ret=1;
+
+    /*Determine if long double has 16 byte in size, 11 bit exponent, and
+     *the bias is 0x3ff */
+    if(sizeof(long double) == 16) {
+	ld = 1.0L;
+	memcpy(s, &ld, 16);
+	if(s[0]==0x3f && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
+		s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00)
+	    flag = 1;
+    }
+
+    if(flag==1 && sizeof(long)==8) {
+	ll = 0x003fffffffffffffL;
+	ld = (long double)ll;
+	memcpy(s, &ld, 16);
+	/* The library converts the value to 0x434fffffffffffff8000000000000000.
+	 * In decimal it is 18014398509481982.000000, one value short of the original.
+	 * The IBM Power6 Linux converts it to 0x4350000000000000bff0000000000000.
+	 * The value is correct in decimal. It uses some special
+	 * algorithm.  We're going to define the macro and skip the test until
+	 * we can figure out how they do it. */
+	if(s[0]==0x43 && s[1]==0x50 && s[2]==0x00 && s[3]==0x00 &&
+		s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
+		s[8]==0xbf && s[9]==0xf0 && s[10]==0x00 && s[11]==0x00 &&
+		s[12]==0x00 && s[13]==0x00 && s[14]==0x00 && s[15]==0x00)
+	    ret = 0;
+    }
+    if(flag==1 && sizeof(unsigned long)==8) {
+	ull = 0xffffffffffffffffUL;
+	ld = (long double)ull;
+	memcpy(s, &ld, 16);
+	/* Use a different value from signed long to test. The problem is the same
+	 * for both long and unsigned long. The value is 18446744073709551615.
+	 * The library converts the value to 0x43effffffffffffffe000000000000000.
+	 * In decimal it's 18446744073709548544.000000, very different from the original.
+	 * The IBM Power6 Linux converts it to 0x43f0000000000000bff0000000000000.
+	 * The value is correct in decimal. It uses some special
+	 * algorithm.  We're going to define the macro and skip the test until
+	 * we can figure out how they do it. */
+	if(s[0]==0x43 && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
+		s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
+		s[8]==0xbf && s[9]==0xf0 && s[10]==0x00 && s[11]==0x00 &&
+		s[12]==0x00 && s[13]==0x00 && s[14]==0x00 && s[15]==0x00)
+	    ret = 0;
+    }
+done:
+    exit(ret);
+}
+
+#endif
+
+#ifdef H5_LDOUBLE_TO_LLONG_ACCURATE_TEST
+
+#include <string.h>
+#include <stdlib.h>
+
+int main(void)
+{
+    long double         ld = 20041683600089727.779961L;
+    long long           ll;
+    unsigned long long  ull;
+    unsigned char       s[16];
+    int                 ret = 0;
+
+    if(sizeof(long double) == 16) {
+        /*make sure the long double type is the same as the failing type
+         *which has 16 bytes in size and 11 bits of exponent.  If it is,
+         *the bit sequence should be like below.  It's not
+         *a decent way to check but this info isn't available. */
+        memcpy(s, &ld, 16);
+        if(s[0]==0x43 && s[1]==0x51 && s[2]==0xcc && s[3]==0xf3 &&
+            s[4]==0x85 && s[5]==0xeb && s[6]==0xc8 && s[7]==0xa0 &&
+            s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
+
+            /*slightly adjust the bit sequence (s[8]=0xdf).  The converted
+             *values will go wild on Mac OS 10.4 and IRIX64 6.5.*/
+            s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
+            s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
+            s[8]=0xdf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
+            s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
+
+            memcpy(&ld, s, 16);
+            ll = (long long)ld;
+            ull = (unsigned long long)ld;
+
+            if(ll != 20041683600089728 || ull != 20041683600089728)
+                ret = 1;
+        }
+    }
+done:
+    exit(ret);
+}
+#endif
+
+#ifdef H5_LLONG_TO_LDOUBLE_CORRECT_TEST
+
+#include <string.h>
+#include <stdlib.h>
+
+int main(void)
+{
+    long double         ld;
+    long long           ll;
+    unsigned long long  ull;
+    unsigned char       s[16];
+    int                 flag=0, ret=0;
+
+    /*Determine if long double has 16 byte in size, 11 bit exponent, and
+     *the bias is 0x3ff */
+    if(sizeof(long double) == 16) {
+        ld = 1.0L;
+        memcpy(s, &ld, 16);
+        if(s[0]==0x3f && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
+            s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00)
+            flag = 1;
+    }
+
+    if(flag==1 && sizeof(long long)==8) {
+        ll = 0x01ffffffffffffffLL;
+        ld = (long double)ll;
+        memcpy(s, &ld, 16);
+        /*Check if the bit sequence is as supposed to be*/
+        if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
+            s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
+            s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
+            ret = 1;
+    }
+    if(flag==1 && sizeof(unsigned long long)==8) {
+        ull = 0x01ffffffffffffffULL;
+        ld = (long double)ull;
+        memcpy(s, &ld, 16);
+        if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
+            s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
+            s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
+            ret = 1;
+    }
+done:
+    exit(ret);
+}
+#endif
+
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS_TEST
+
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct {
+    size_t len;
+    void *p;
+} hvl_t;
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+extern "C"
+#  endif
+int FC_DUMMY_MAIN()
+{ return 1;}
+#endif
+#endif
+int
+main ()
+{
+
+    char *chp = "beefs";
+    char **chpp = malloc (2 * sizeof (char *));
+    char **chpp2;
+    hvl_t vl = { 12345, (void *) chp };
+    hvl_t *vlp;
+    hvl_t *vlp2;
+
+    memcpy ((void *) ((char *) chpp + 1), &chp, sizeof (char *));
+    chpp2 = (char **) ((char *) chpp + 1);
+    if (strcmp (*chpp2, chp)) {
+        free (chpp);
+        return 1;
+    }
+    free (chpp);
+
+    vlp = malloc (2 * sizeof (hvl_t));
+    memcpy ((void *) ((char *) vlp + 1), &vl, sizeof (hvl_t));
+    vlp2 = (hvl_t *) ((char *) vlp + 1);
+    if (vlp2->len != vl.len || vlp2->p != vl.p) {
+        free (vlp);
+        return 1;
+    }
+    free (vlp);
+
+  ;
+  return 0;
+}
+
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/H5cxx_config.h.in b/gatb-core/thirdparty/hdf5/config/cmake/H5cxx_config.h.in
new file mode 100644
index 0000000..c4e1c03
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/H5cxx_config.h.in
@@ -0,0 +1,5 @@
+/* src/H5cxx_config.h.in Created manually. */
+
+/* Define if offsetof extension is present */
+#cmakedefine HAVE_OFFSETOF ${HAVE_OFFSETOF}
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/H5pubconf.h.in b/gatb-core/thirdparty/hdf5/config/cmake/H5pubconf.h.in
new file mode 100644
index 0000000..13740ea
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/H5pubconf.h.in
@@ -0,0 +1,628 @@
+/* H5pubconf.h  Generated By CMake during the configuration */
+
+#ifndef H5_CONFIG_H_
+#define H5_CONFIG_H_
+
+/* Define if the Windows virtual file driver should be compiled */
+#cmakedefine H5_HAVE_WINDOWS @H5_HAVE_WINDOWS@
+
+/* Define if using MinGW */
+#cmakedefine H5_HAVE_MINGW @H5_HAVE_MINGW@
+
+/* Define if on the Windows platform and default WIN32 API */
+#cmakedefine H5_HAVE_WIN32_API @H5_HAVE_WIN32_API@
+
+/* Define if using a Windows compiler (i.e. Visual Studio) */
+#cmakedefine H5_HAVE_VISUAL_STUDIO @H5_HAVE_VISUAL_STUDIO@
+
+/* Define if building universal (internal helper macro) */
+#cmakedefine H5_AC_APPLE_UNIVERSAL_BUILD @H5_AC_APPLE_UNIVERSAL_BUILD@
+
+/* Define if the memory buffers being written to disk should be cleared before
+   writing. */
+#cmakedefine H5_CLEAR_MEMORY @H5_CLEAR_MEMORY@
+
+/* Define if C++ compiler recognizes offsetof */
+#cmakedefine H5_CXX_HAVE_OFFSETOF @H5_CXX_HAVE_OFFSETOF@
+
+/* Define the default plugins path to compile */
+#cmakedefine H5_DEFAULT_PLUGINDIR "@H5_DEFAULT_PLUGINDIR@"
+
+/* Define if `dev_t' is a scalar */
+#cmakedefine H5_DEV_T_IS_SCALAR @H5_DEV_T_IS_SCALAR@
+
+/* Define to dummy `main' function (if any) required to link to the Fortran
+   libraries. */
+#cmakedefine H5_FC_DUMMY_MAIN @H5_FC_DUMMY_MAIN@
+
+/* Define if F77 and FC dummy `main' functions are identical. */
+#cmakedefine H5_FC_DUMMY_MAIN_EQ_F77 @H5_FC_DUMMY_MAIN_EQ_F77@
+
+/* Define to a macro mangling the given C identifier (in lower and upper
+   case), which must not contain underscores, for linking with Fortran. */
+#define @H5_FC_FUNC@
+
+/* As FC_FUNC, but for C identifiers containing underscores. */
+#define @H5_FC_FUNC_@
+
+/* Define to 1 if you have the `alarm' function. */
+#cmakedefine H5_HAVE_ALARM @H5_HAVE_ALARM@
+
+/* Define to 1 if you have the `asprintf' function. */
+#cmakedefine H5_HAVE_ASPRINTF @H5_HAVE_ASPRINTF@
+
+/* Define if the __attribute__(()) extension is present */
+#cmakedefine H5_HAVE_ATTRIBUTE @H5_HAVE_ATTRIBUTE@
+
+/* Define if the compiler understands C99 designated initialization of structs
+   and unions */
+#cmakedefine H5_HAVE_C99_DESIGNATED_INITIALIZER @H5_HAVE_C99_DESIGNATED_INITIALIZER@
+
+/* Define if the compiler understands the __func__ keyword */
+#cmakedefine H5_HAVE_C99_FUNC @H5_HAVE_C99_FUNC@
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#cmakedefine H5_HAVE_CLOCK_GETTIME @H5_HAVE_CLOCK_GETTIME@
+
+/* Define if the function stack tracing code is to be compiled in */
+#cmakedefine H5_HAVE_CODESTACK @H5_HAVE_CODESTACK@
+
+/* Define if Darwin or Mac OS X */
+#cmakedefine H5_HAVE_DARWIN @H5_HAVE_DARWIN@
+
+/* Define to 1 if you have the `difftime' function. */
+#cmakedefine H5_HAVE_DIFFTIME @H5_HAVE_DIFFTIME@
+
+/* Define if the direct I/O virtual file driver should be compiled */
+#cmakedefine H5_HAVE_DIRECT @H5_HAVE_DIRECT@
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#cmakedefine H5_HAVE_DIRENT_H @H5_HAVE_DIRENT_H@
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#cmakedefine H5_HAVE_DLFCN_H @H5_HAVE_DLFCN_H@
+
+/* Define to 1 if you have the <dmalloc.h> header file. */
+#cmakedefine H5_HAVE_DMALLOC_H @H5_HAVE_DMALLOC_H@
+
+/* Define if library information should be embedded in the executables */
+#cmakedefine H5_HAVE_EMBEDDED_LIBINFO @H5_HAVE_EMBEDDED_LIBINFO@
+
+/* Define to 1 if you have the <features.h> header file. */
+#cmakedefine H5_HAVE_FEATURES_H @H5_HAVE_FEATURES_H@
+
+/* Define if support for deflate (zlib) filter is enabled */
+#cmakedefine H5_HAVE_FILTER_DEFLATE @H5_HAVE_FILTER_DEFLATE@
+
+/* Define if support for szip filter is enabled */
+#cmakedefine H5_HAVE_FILTER_SZIP @H5_HAVE_FILTER_SZIP@
+
+/* Define to 1 if you have the `fork' function. */
+#cmakedefine H5_HAVE_FORK @H5_HAVE_FORK@
+
+/* Define to 1 if you have the `frexpf' function. */
+#cmakedefine H5_HAVE_FREXPF @H5_HAVE_FREXPF@
+
+/* Define to 1 if you have the `frexpl' function. */
+#cmakedefine H5_HAVE_FREXPL @H5_HAVE_FREXPL@
+
+/* Define to 1 if you have the `fseeko' function. */
+#cmakedefine H5_HAVE_FSEEKO @H5_HAVE_FSEEKO@
+
+/* Define to 1 if you have the `fseeko64' function. */
+#cmakedefine H5_HAVE_FSEEKO64 @H5_HAVE_FSEEKO64@
+
+/* Define to 1 if you have the `fstat64' function. */
+#cmakedefine H5_HAVE_FSTAT64 @H5_HAVE_FSTAT64@
+
+/* Define to 1 if you have the `ftello' function. */
+#cmakedefine H5_HAVE_FTELLO @H5_HAVE_FTELLO@
+
+/* Define to 1 if you have the `ftello64' function. */
+#cmakedefine H5_HAVE_FTELLO64 @H5_HAVE_FTELLO64@
+
+/* Define to 1 if you have the `ftruncate64' function. */
+#cmakedefine H5_HAVE_FTRUNCATE64 @H5_HAVE_FTRUNCATE64@
+
+/* Define if the compiler understands the __FUNCTION__ keyword */
+#cmakedefine H5_HAVE_FUNCTION @H5_HAVE_FUNCTION@
+
+/* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */
+#cmakedefine H5_HAVE_GETCONSOLESCREENBUFFERINFO @H5_HAVE_GETCONSOLESCREENBUFFERINFO@
+
+/* Define to 1 if you have the `gethostname' function. */
+#cmakedefine H5_HAVE_GETHOSTNAME @H5_HAVE_GETHOSTNAME@
+
+/* Define to 1 if you have the `getpwuid' function. */
+#cmakedefine H5_HAVE_GETPWUID @H5_HAVE_GETPWUID@
+
+/* Define to 1 if you have the `getrusage' function. */
+#cmakedefine H5_HAVE_GETRUSAGE @H5_HAVE_GETRUSAGE@
+
+/* Define to 1 if you have the `gettextinfo' function. */
+#cmakedefine H5_HAVE_GETTEXTINFO @H5_HAVE_GETTEXTINFO@
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#cmakedefine H5_HAVE_GETTIMEOFDAY @H5_HAVE_GETTIMEOFDAY@
+
+/* Define if the compiler understands inline */
+#cmakedefine H5_HAVE_INLINE @H5_HAVE_INLINE@
+
+/* Define if library will contain instrumentation to detect correct
+   optimization operation */
+#cmakedefine H5_HAVE_INSTRUMENTED_LIBRARY @H5_HAVE_INSTRUMENTED_LIBRARY@
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine H5_HAVE_INTTYPES_H @H5_HAVE_INTTYPES_H@
+
+/* Define to 1 if you have the `ioctl' function. */
+#cmakedefine H5_HAVE_IOCTL @H5_HAVE_IOCTL@
+
+/* Define to 1 if you have the <io.h> header file. */
+#cmakedefine H5_HAVE_IO_H @H5_HAVE_IO_H@
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#cmakedefine H5_HAVE_LIBDL @H5_HAVE_LIBDL@
+
+/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */
+#cmakedefine H5_HAVE_LIBDMALLOC @H5_HAVE_LIBDMALLOC@
+
+/* Define to 1 if you have the `m' library (-lm). */
+#cmakedefine H5_HAVE_LIBM @H5_HAVE_LIBM@
+
+/* Define to 1 if you have the `mpe' library (-lmpe). */
+#cmakedefine H5_HAVE_LIBMPE @H5_HAVE_LIBMPE@
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#cmakedefine H5_HAVE_LIBPTHREAD @H5_HAVE_LIBPTHREAD@
+
+/* Define to 1 if you have the `sz' library (-lsz). */
+#cmakedefine H5_HAVE_LIBSZ @H5_HAVE_LIBSZ@
+
+/* Define to 1 if you have the `ws2_32' library (-lws2_32). */
+#cmakedefine H5_HAVE_LIBWS2_32 @H5_HAVE_LIBWS2_32@
+
+/* Define to 1 if you have the `z' library (-lz). */
+#cmakedefine H5_HAVE_LIBZ @H5_HAVE_LIBZ@
+
+/* Define to 1 if you have the `longjmp' function. */
+#cmakedefine H5_HAVE_LONGJMP @H5_HAVE_LONGJMP@
+
+/* Define to 1 if you have the `lseek64' function. */
+#cmakedefine H5_HAVE_LSEEK64 @H5_HAVE_LSEEK64@
+
+/* Define to 1 if you have the `lstat' function. */
+#cmakedefine H5_HAVE_LSTAT @H5_HAVE_LSTAT@
+
+/* Define to 1 if you have the <mach/mach_time.h> header file. */
+#cmakedefine H5_HAVE_MACH_MACH_TIME_H @H5_HAVE_MACH_MACH_TIME_H@
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine H5_HAVE_MEMORY_H @H5_HAVE_MEMORY_H@
+
+/* Define if we have MPE support */
+#cmakedefine H5_HAVE_MPE @H5_HAVE_MPE@
+
+/* Define to 1 if you have the <mpe.h> header file. */
+#cmakedefine H5_HAVE_MPE_H @H5_HAVE_MPE_H@
+
+/* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */
+#cmakedefine H5_HAVE_MPI_MULTI_LANG_Comm @H5_HAVE_MPI_MULTI_LANG_Comm@
+
+/* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */
+#cmakedefine H5_HAVE_MPI_MULTI_LANG_Info @H5_HAVE_MPI_MULTI_LANG_Info@
+
+/* Define if we have parallel support */
+#cmakedefine H5_HAVE_PARALLEL @H5_HAVE_PARALLEL@
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#cmakedefine H5_HAVE_PTHREAD_H @H5_HAVE_PTHREAD_H@
+
+/* Define to 1 if you have the 'InitOnceExecuteOnce' function. */
+#cmakedefine H5_HAVE_WIN_THREADS @H5_HAVE_WIN_THREADS@
+
+/* Define to 1 if you have the `random' function. */
+#cmakedefine H5_HAVE_RANDOM @H5_HAVE_RANDOM@
+
+/* Define to 1 if you have the `rand_r' function. */
+#cmakedefine H5_HAVE_RAND_R @H5_HAVE_RAND_R@
+
+/* Define to 1 if you have the `setjmp' function. */
+#cmakedefine H5_HAVE_SETJMP @H5_HAVE_SETJMP@
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#cmakedefine H5_HAVE_SETJMP_H @H5_HAVE_SETJMP_H@
+
+/* Define to 1 if you have the `setsysinfo' function. */
+#cmakedefine H5_HAVE_SETSYSINFO @H5_HAVE_SETSYSINFO@
+
+/* Define to 1 if you have the `siglongjmp' function. */
+#cmakedefine H5_HAVE_SIGLONGJMP @H5_HAVE_SIGLONGJMP@
+
+/* Define to 1 if you have the `signal' function. */
+#cmakedefine H5_HAVE_SIGNAL @H5_HAVE_SIGNAL@
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#cmakedefine H5_HAVE_SIGPROCMASK @H5_HAVE_SIGPROCMASK@
+
+/* Define to 1 if you have the `sigsetjmp' function. */
+#cmakedefine H5_HAVE_SIGSETJMP @H5_HAVE_SIGSETJMP@
+
+/* Define to 1 if you have the `snprintf' function. */
+#cmakedefine H5_HAVE_SNPRINTF @H5_HAVE_SNPRINTF@
+
+/* Define to 1 if you have the `srandom' function. */
+#cmakedefine H5_HAVE_SRANDOM @H5_HAVE_SRANDOM@
+
+/* Define to 1 if you have the `stat64' function. */
+#cmakedefine H5_HAVE_STAT64 @H5_HAVE_STAT64@
+
+/* Define if `struct stat' has the `st_blocks' field */
+#cmakedefine H5_HAVE_STAT_ST_BLOCKS @H5_HAVE_STAT_ST_BLOCKS@
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#cmakedefine H5_HAVE_STDDEF_H @H5_HAVE_STDDEF_H@
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine H5_HAVE_STDINT_H @H5_HAVE_STDINT_H@
+
+/* Define to 1 if you have the <stdint.h> header file for Cplusplus. */
+#cmakedefine H5_HAVE_STDINT_H_CXX @H5_HAVE_STDINT_H_CXX@
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine H5_HAVE_STDLIB_H @H5_HAVE_STDLIB_H@
+
+/* Define to 1 if you have the `strdup' function. */
+#cmakedefine H5_HAVE_STRDUP @H5_HAVE_STRDUP@
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine H5_HAVE_STRINGS_H @H5_HAVE_STRINGS_H@
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine H5_HAVE_STRING_H @H5_HAVE_STRING_H@
+
+/* Define if `struct text_info' is defined */
+#cmakedefine H5_HAVE_STRUCT_TEXT_INFO @H5_HAVE_STRUCT_TEXT_INFO@
+
+/* Define if `struct videoconfig' is defined */
+#cmakedefine H5_HAVE_STRUCT_VIDEOCONFIG @H5_HAVE_STRUCT_VIDEOCONFIG@
+
+/* Define to 1 if you have the `symlink' function. */
+#cmakedefine H5_HAVE_SYMLINK @H5_HAVE_SYMLINK@
+
+/* Define to 1 if you have the `system' function. */
+#cmakedefine H5_HAVE_SYSTEM @H5_HAVE_SYSTEM@
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#cmakedefine H5_HAVE_SYS_IOCTL_H @H5_HAVE_SYS_IOCTL_H@
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#cmakedefine H5_HAVE_SYS_RESOURCE_H @H5_HAVE_SYS_RESOURCE_H@
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#cmakedefine H5_HAVE_SYS_SOCKET_H @H5_HAVE_SYS_SOCKET_H@
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine H5_HAVE_SYS_STAT_H @H5_HAVE_SYS_STAT_H@
+
+/* Define to 1 if you have the <sys/timeb.h> header file. */
+#cmakedefine H5_HAVE_SYS_TIMEB_H @H5_HAVE_SYS_TIMEB_H@
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#cmakedefine H5_HAVE_SYS_TIME_H @H5_HAVE_SYS_TIME_H@
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine H5_HAVE_SYS_TYPES_H @H5_HAVE_SYS_TYPES_H@
+
+/* Define to 1 if you have the <szlib.h> header file. */
+#cmakedefine H5_HAVE_SZLIB_H @H5_HAVE_SZLIB_H@
+
+/* Define if we have thread safe support */
+#cmakedefine H5_HAVE_THREADSAFE @H5_HAVE_THREADSAFE@
+
+/* Define if `timezone' is a global variable */
+#cmakedefine H5_HAVE_TIMEZONE @H5_HAVE_TIMEZONE@
+
+/* Define if the ioctl TIOCGETD is defined */
+#cmakedefine H5_HAVE_TIOCGETD @H5_HAVE_TIOCGETD@
+
+/* Define if the ioctl TIOGWINSZ is defined */
+#cmakedefine H5_HAVE_TIOCGWINSZ @H5_HAVE_TIOCGWINSZ@
+
+/* Define to 1 if you have the `tmpfile' function. */
+#cmakedefine H5_HAVE_TMPFILE @H5_HAVE_TMPFILE@
+
+/* Define if `tm_gmtoff' is a member of `struct tm' */
+#cmakedefine H5_HAVE_TM_GMTOFF @H5_HAVE_TM_GMTOFF@
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine H5_HAVE_UNISTD_H @H5_HAVE_UNISTD_H@
+
+/* Define to 1 if you have the `vasprintf' function. */
+#cmakedefine H5_HAVE_VASPRINTF @H5_HAVE_VASPRINTF@
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#cmakedefine H5_HAVE_VSNPRINTF @H5_HAVE_VSNPRINTF@
+
+/* Define to 1 if you have the `waitpid' function. */
+#cmakedefine H5_HAVE_WAITPID @H5_HAVE_WAITPID@
+
+/* Define if your system has window style path name. */
+#cmakedefine H5_HAVE_WINDOW_PATH @H5_HAVE_WINDOW_PATH@
+
+/* Define to 1 if you have the <winsock.h> header file. */
+#cmakedefine H5_HAVE_WINSOCK2_H @H5_HAVE_WINSOCK2_H@
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#cmakedefine H5_HAVE_ZLIB_H @H5_HAVE_ZLIB_H@
+
+/* Define to 1 if you have the `_getvideoconfig' function. */
+#cmakedefine H5_HAVE__GETVIDEOCONFIG @H5_HAVE__GETVIDEOCONFIG@
+
+/* Define to 1 if you have the `_scrsize' function. */
+#cmakedefine H5_HAVE__SCRSIZE @H5_HAVE__SCRSIZE@
+
+/* Define if the compiler understands __inline */
+#cmakedefine H5_HAVE___INLINE @H5_HAVE___INLINE@
+
+/* Define if the compiler understands __inline__ */
+#cmakedefine H5_HAVE___INLINE__ @H5_HAVE___INLINE__@
+
+/* Define if HDF5's high-level library headers should be included in hdf5.h */
+#cmakedefine H5_INCLUDE_HL @H5_INCLUDE_HL@
+
+/* Define if your system can convert long double to (unsigned) long long
+   values correctly. */
+#cmakedefine H5_LDOUBLE_TO_LLONG_ACCURATE @H5_LDOUBLE_TO_LLONG_ACCURATE@
+
+/* Define if your system converts long double to (unsigned) long values with
+   special algorithm. */
+#cmakedefine H5_LDOUBLE_TO_LONG_SPECIAL @H5_LDOUBLE_TO_LONG_SPECIAL@
+
+/* Define if your system can convert (unsigned) long long to long double
+   values correctly. */
+#cmakedefine H5_LLONG_TO_LDOUBLE_CORRECT @H5_LLONG_TO_LDOUBLE_CORRECT@
+
+/* Define if your system can convert (unsigned) long to long double values
+   with special algorithm. */
+#cmakedefine H5_LONG_TO_LDOUBLE_SPECIAL @H5_LONG_TO_LDOUBLE_SPECIAL@
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#cmakedefine H5_LT_OBJDIR @H5_LT_OBJDIR@
+
+/* Define if the metadata trace file code is to be compiled in */
+#cmakedefine H5_METADATA_TRACE_FILE @H5_METADATA_TRACE_FILE@
+
+/* Define if we can violate pointer alignment restrictions */
+#cmakedefine H5_NO_ALIGNMENT_RESTRICTIONS @H5_NO_ALIGNMENT_RESTRICTIONS@
+
+/* Define if deprecated public API symbols are disabled */
+#cmakedefine H5_NO_DEPRECATED_SYMBOLS @H5_NO_DEPRECATED_SYMBOLS@
+
+/* Name of package */
+#define H5_PACKAGE "@HDF5_PACKAGE@"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define H5_PACKAGE_BUGREPORT "@HDF5_PACKAGE_BUGREPORT@"
+
+/* Define to the full name of this package. */
+#define H5_PACKAGE_NAME "@HDF5_PACKAGE_NAME@"
+
+/* Define to the full name and version of this package. */
+#define H5_PACKAGE_STRING "@HDF5_PACKAGE_STRING@"
+
+/* Define to the one symbol short name of this package. */
+#define H5_PACKAGE_TARNAME "@HDF5_PACKAGE_TARNAME@"
+
+/* Define to the home page for this package. */
+#define H5_PACKAGE_URL "@HDF5_PACKAGE_URL@"
+
+/* Define to the version of this package. */
+#define H5_PACKAGE_VERSION "@HDF5_PACKAGE_VERSION_STRING@"
+
+/* Width for printf() for type `long long' or `__int64', use `ll' */
+#cmakedefine H5_PRINTF_LL_WIDTH @H5_PRINTF_LL_WIDTH@
+
+/* The size of `char', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_CHAR @H5_SIZEOF_CHAR@
+
+/* The size of `double', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_DOUBLE @H5_SIZEOF_DOUBLE@
+
+/* The size of `float', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_FLOAT @H5_SIZEOF_FLOAT@
+
+/* The size of `int', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT @H5_SIZEOF_INT@
+
+/* The size of `int16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT16_T @H5_SIZEOF_INT16_T@
+
+/* The size of `int32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT32_T @H5_SIZEOF_INT32_T@
+
+/* The size of `int64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT64_T @H5_SIZEOF_INT64_T@
+
+/* The size of `int8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT8_T @H5_SIZEOF_INT8_T@
+
+/* The size of `int_fast16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_FAST16_T @H5_SIZEOF_INT_FAST16_T@
+
+/* The size of `int_fast32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_FAST32_T @H5_SIZEOF_INT_FAST32_T@
+
+/* The size of `int_fast64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_FAST64_T @H5_SIZEOF_INT_FAST64_T@
+
+/* The size of `int_fast8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_FAST8_T @H5_SIZEOF_INT_FAST8_T@
+
+/* The size of `int_least16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_LEAST16_T @H5_SIZEOF_INT_LEAST16_T@
+
+/* The size of `int_least32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_LEAST32_T @H5_SIZEOF_INT_LEAST32_T@
+
+/* The size of `int_least64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_LEAST64_T @H5_SIZEOF_INT_LEAST64_T@
+
+/* The size of `int_least8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_INT_LEAST8_T @H5_SIZEOF_INT_LEAST8_T@
+
+#if !defined(__APPLE__)
+/* The size of `size_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_SIZE_T @H5_SIZEOF_SIZE_T@
+
+/* The size of `ssize_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_SSIZE_T @H5_SIZEOF_SSIZE_T@
+
+/* The size of `long', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_LONG @H5_SIZEOF_LONG@
+
+#else
+   # if defined(__LP64__) && __LP64__
+  #define H5_SIZEOF_LONG 8
+  #define H5_SIZEOF_SIZE_T 8
+  #define H5_SIZEOF_SSIZE_T 8
+  # else
+  #define H5_SIZEOF_LONG 4
+  #define H5_SIZEOF_SIZE_T 4
+  #define H5_SIZEOF_SSIZE_T 4
+  # endif
+
+#endif
+
+/* The size of `long double', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_LONG_DOUBLE @H5_SIZEOF_LONG_DOUBLE@
+
+/* Define size of long long and/or __int64 bit integer type only if the type
+   exists.  */
+#if !defined(__APPLE__)
+ #cmakedefine H5_SIZEOF_LONG_LONG @H5_SIZEOF_LONG_LONG@
+#else
+ #define H5_SIZEOF_LONG_LONG 8
+#endif
+
+/* The size of `off64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_OFF64_T @H5_SIZEOF_OFF64_T@
+
+/* The size of `off_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_OFF_T @H5_SIZEOF_OFF_T@
+
+/* The size of `ptrdiff_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_PTRDIFF_T @H5_SIZEOF_PTRDIFF_T@
+
+/* The size of `short', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_SHORT @H5_SIZEOF_SHORT@
+
+/* The size of `uint16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT16_T @H5_SIZEOF_UINT16_T@
+
+/* The size of `uint32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT32_T @H5_SIZEOF_UINT32_T@
+
+/* The size of `uint64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT64_T @H5_SIZEOF_UINT64_T@
+
+/* The size of `uint8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT8_T @H5_SIZEOF_UINT8_T@
+
+/* The size of `uint_fast16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_FAST16_T @H5_SIZEOF_UINT_FAST16_T@
+
+/* The size of `uint_fast32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_FAST32_T @H5_SIZEOF_UINT_FAST32_T@
+
+/* The size of `uint_fast64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_FAST64_T @H5_SIZEOF_UINT_FAST64_T@
+
+/* The size of `uint_fast8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_FAST8_T @H5_SIZEOF_UINT_FAST8_T@
+
+/* The size of `uint_least16_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_LEAST16_T @H5_SIZEOF_UINT_LEAST16_T@
+
+/* The size of `uint_least32_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_LEAST32_T @H5_SIZEOF_UINT_LEAST32_T@
+
+/* The size of `uint_least64_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_LEAST64_T @H5_SIZEOF_UINT_LEAST64_T@
+
+/* The size of `uint_least8_t', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UINT_LEAST8_T @H5_SIZEOF_UINT_LEAST8_T@
+
+/* The size of `unsigned', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_UNSIGNED @H5_SIZEOF_UNSIGNED@
+
+/* The size of `__int64', as computed by sizeof. */
+#define H5_SIZEOF___INT64 @H5_SIZEOF___INT64@
+
+/* Define to 1 if you have the ANSI C header files. */
+#cmakedefine H5_STDC_HEADERS @H5_STDC_HEADERS@
+
+/* Define if strict file format checks are enabled */
+#cmakedefine H5_STRICT_FORMAT_CHECKS @H5_STRICT_FORMAT_CHECKS@
+
+/* Define if your system supports pthread_attr_setscope(&attribute,
+   PTHREAD_SCOPE_SYSTEM) call. */
+#cmakedefine H5_SYSTEM_SCOPE_THREADS @H5_SYSTEM_SCOPE_THREADS@
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#cmakedefine H5_TIME_WITH_SYS_TIME @H5_TIME_WITH_SYS_TIME@
+
+/* Define using v1.6 public API symbols by default */
+#cmakedefine H5_USE_16_API_DEFAULT @H5_USE_16_API_DEFAULT@
+
+/* Define if a memory checking tool will be used on the library, to cause
+   library to be very picky about memory operations and also disable the
+   internal free list manager code. */
+#cmakedefine H5_USING_MEMCHECKER @H5_USING_MEMCHECKER@
+
+/* Version number of package */
+#define H5_VERSION "@HDF5_PACKAGE_VERSION_STRING@"
+
+/* Data accuracy is prefered to speed during data conversions */
+#cmakedefine H5_WANT_DATA_ACCURACY @H5_WANT_DATA_ACCURACY@
+
+/* Check exception handling functions during data conversions */
+#cmakedefine H5_WANT_DCONV_EXCEPTION @H5_WANT_DCONV_EXCEPTION@
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if !defined(__APPLE__)
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#else
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#endif
+
+#cmakedefine WORDS_BIGENDIAN @H5_WORDS_BIGENDIANR@
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#cmakedefine H5__FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#cmakedefine H5__LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#cmakedefine H5_const
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#cmakedefine H5_off_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#cmakedefine H5_ptrdiff_t
+
+/* Define to `unsigned long' if <sys/types.h> does not define. */
+#cmakedefine H5_size_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#cmakedefine H5_ssize_t
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/HDF518_Examples.cmake.in b/gatb-core/thirdparty/hdf5/config/cmake/HDF518_Examples.cmake.in
new file mode 100644
index 0000000..e1cb781
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/HDF518_Examples.cmake.in
@@ -0,0 +1,200 @@
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+###############################################################################################################
+# This script will build and run the examples from a folder
+# Execute from a command line:
+#     ctest -S HDF518_Examples.cmake,OPTION=VALUE -C Release -VV -O test.log
+###############################################################################################################
+
+set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
+set(CTEST_DASHBOARD_ROOT ${CTEST_SCRIPT_DIRECTORY})
+
+# handle input parameters to script.
+#INSTALLDIR - HDF5-1.8 root folder
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
+#CTEST_SOURCE_NAME - name of source folder; HDF4Examples
+#STATIC_LIBRARIES - Default is YES
+#FORTRAN_LIBRARIES - Default is NO
+##NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac)
+if(DEFINED CTEST_SCRIPT_ARG)
+    # transform ctest script arguments of the form
+    # script.ctest,var1=value1,var2=value2
+    # to variables with the respective names set to the respective values
+    string(REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
+    foreach(current_var ${script_args})
+        if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
+            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
+        endif()
+    endforeach()
+endif()
+if(NOT DEFINED INSTALLDIR)
+    set(INSTALLDIR "@CMAKE_INSTALL_PREFIX@")
+endif()
+if(NOT DEFINED CTEST_CONFIGURATION_TYPE)
+    set(CTEST_CONFIGURATION_TYPE "Release")
+endif()
+if(NOT DEFINED CTEST_SOURCE_NAME)
+    set(CTEST_SOURCE_NAME "HDF5Examples")
+endif()
+if(NOT DEFINED STATIC_LIBRARIES)
+    set(STATICLIBRARIES "YES")
+else(NOT DEFINED STATIC_LIBRARIES)
+    set(STATICLIBRARIES "NO")
+endif()
+if(NOT DEFINED FORTRAN_LIBRARIES)
+    set(FORTRANLIBRARIES "NO")
+else(NOT DEFINED FORTRAN_LIBRARIES)
+    set(FORTRANLIBRARIES "YES")
+endif()
+if(NOT DEFINED HDF_LOCAL)
+    set(CDASH_LOCAL "NO")
+else(NOT HDF_LOCAL)
+    set(CDASH_LOCAL "YES")
+endif()
+if(NOT DEFINED CTEST_SITE)
+    set(CTEST_SITE "local")
+endif()
+if(NOT DEFINED CTEST_BUILD_NAME)
+    set(CTEST_BUILD_NAME "examples")
+endif()
+set(BUILD_OPTIONS "${BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
+
+#TAR_SOURCE - name of tarfile
+#if(NOT DEFINED TAR_SOURCE)
+#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.2.1-Source")
+#endif()
+
+###############################################################################################################
+#     Adjust the following SET Commands as needed
+###############################################################################################################
+if(WIN32)
+  if(${STATICLIBRARIES})
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
+  endif()
+  set(ENV{HDF5_DIR} "${INSTALLDIR}/cmake")
+  set(CTEST_BINARY_NAME ${CTEST_SOURCE_NAME}\\build)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
+else(WIN32)
+  if(${STATICLIBRARIES})
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
+  endif()
+  set(ENV{HDF5_DIR} "${INSTALLDIR}/share/cmake")
+  set(ENV{LD_LIBRARY_PATH} "${INSTALLDIR}/lib")
+  set(CTEST_BINARY_NAME ${CTEST_SOURCE_NAME}/build)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
+endif(WIN32)
+if(${FORTRANLIBRARIES})
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
+else()
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+endif()
+if(${CDASH_LOCAL})
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCDASH_LOCAL:BOOL=ON")
+endif()
+set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HDF_PACKAGE_EXT@")
+
+###############################################################################################################
+# For any comments please contact cdashhelp at hdfgroup.org
+#
+###############################################################################################################
+
+#-----------------------------------------------------------------------------
+# MAC machines need special option
+#-----------------------------------------------------------------------------
+if(APPLE)
+  # Compiler choice
+  execute_process(COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
+  execute_process(COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(ENV{CC} "${XCODE_CC}")
+  set(ENV{CXX} "${XCODE_CXX}")
+  if(NOT NO_MAC_FORTRAN)
+    # Shared fortran is not supported, build static
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
+  else()
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+  endif()
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
+endif()
+
+#-----------------------------------------------------------------------------
+set(CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
+## --------------------------
+if(CTEST_USE_TAR_SOURCE)
+  ## Uncompress source if tar or zip file provided
+  ## --------------------------
+  if(WIN32)
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_USE_TAR_SOURCE}.zip]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}\\${CTEST_USE_TAR_SOURCE}.zip RESULT_VARIABLE rv)
+  else()
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_USE_TAR_SOURCE}.tar]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar RESULT_VARIABLE rv)
+  endif()
+
+  if(NOT rv EQUAL 0)
+    message(STATUS "extracting... [error-(${rv}) clean up]")
+    file(REMOVE_RECURSE "${CTEST_SOURCE_DIRECTORY}")
+    message(FATAL_ERROR "error: extract of ${CTEST_SOURCE_NAME} failed")
+  endif()
+endif(CTEST_USE_TAR_SOURCE)
+
+#-----------------------------------------------------------------------------
+## Clear the build directory
+## --------------------------
+set(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
+if (EXISTS "${CTEST_BINARY_DIRECTORY}" AND IS_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+  ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
+else ()
+  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+endif ()
+
+# Use multiple CPU cores to build
+include(ProcessorCount)
+ProcessorCount(N)
+if(NOT N EQUAL 0)
+  if(NOT WIN32)
+    set(CTEST_BUILD_FLAGS -j${N})
+  endif()
+  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
+endif()
+set (CTEST_CONFIGURE_COMMAND
+    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+)
+
+#-----------------------------------------------------------------------------
+## -- set output to english
+set($ENV{LC_MESSAGES}  "en_EN")
+
+#-----------------------------------------------------------------------------
+configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
+## NORMAL process
+## --------------------------
+ctest_start (Experimental)
+ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
+if(${res} LESS 0 OR ${res} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Configure: ${res}\n")
+endif()
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Configure Notes)
+endif()
+ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND APPEND RETURN_VALUE res NUMBER_ERRORS errval)
+if(${res} LESS 0 OR ${res} GREATER 0 OR ${errval} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed ${errval} Build: ${res}\n")
+endif()
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Build)
+endif()
+ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+if(${res} LESS 0 OR ${res} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Tests: ${res}\n")
+endif()
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Test)
+endif()
+if(${res} LESS 0 OR ${res} GREATER 0)
+  message (FATAL_ERROR "tests FAILED")
+endif()
+#-----------------------------------------------------------------------------
+##############################################################################################################
+message(STATUS "DONE")
\ No newline at end of file
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/HDF5Macros.cmake b/gatb-core/thirdparty/hdf5/config/cmake/HDF5Macros.cmake
new file mode 100644
index 0000000..d88e672
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/HDF5Macros.cmake
@@ -0,0 +1,49 @@
+#-------------------------------------------------------------------------------
+macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
+  set (LIB_OUT_NAME "${libname}")
+  # SOVERSION passed in ARGN when shared
+  if (${libtype} MATCHES "SHARED")
+    if (ARGN)
+      set (PACKAGE_SOVERSION ${ARGN})
+    else (ARGN)
+      set (PACKAGE_SOVERSION ${HDF5_PACKAGE_SOVERSION})
+    endif (ARGN)
+    if (WIN32)
+      set (LIBHDF_VERSION ${HDF5_PACKAGE_VERSION_MAJOR})
+    else (WIN32)
+      set (LIBHDF_VERSION ${HDF5_PACKAGE_VERSION})
+    endif (WIN32)
+    set_target_properties (${libtarget} PROPERTIES VERSION ${LIBHDF_VERSION})
+    if (WIN32)
+        set (${LIB_OUT_NAME} "${LIB_OUT_NAME}-${PACKAGE_SOVERSION}")
+    else (WIN32)
+        set_target_properties (${libtarget} PROPERTIES SOVERSION ${PACKAGE_SOVERSION})
+    endif (WIN32)
+  endif (${libtype} MATCHES "SHARED")
+  HDF_SET_LIB_OPTIONS (${libtarget} ${LIB_OUT_NAME} ${libtype})
+
+  #-- Apple Specific install_name for libraries
+  if (APPLE)
+    option (HDF5_BUILD_WITH_INSTALL_NAME "Build with library install_name set to the installation path" OFF)
+    if (HDF5_BUILD_WITH_INSTALL_NAME)
+      set_target_properties (${libtarget} PROPERTIES
+          LINK_FLAGS "-current_version ${HDF5_PACKAGE_VERSION} -compatibility_version ${HDF5_PACKAGE_VERSION}"
+          INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
+          BUILD_WITH_INSTALL_RPATH ${HDF5_BUILD_WITH_INSTALL_NAME}
+      )
+    endif (HDF5_BUILD_WITH_INSTALL_NAME)
+    if (HDF5_BUILD_FRAMEWORKS)
+      if (${libtype} MATCHES "SHARED")
+        # adapt target to build frameworks instead of dylibs
+        set_target_properties(${libtarget} PROPERTIES
+            XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
+            FRAMEWORK TRUE
+            FRAMEWORK_VERSION ${HDF5_PACKAGE_VERSION_MAJOR}
+            MACOSX_FRAMEWORK_IDENTIFIER org.hdfgroup.${libtarget}
+            MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${HDF5_PACKAGE_VERSION_MAJOR}
+            MACOSX_FRAMEWORK_BUNDLE_VERSION ${HDF5_PACKAGE_VERSION_MAJOR})
+      endif (${libtype} MATCHES "SHARED")
+    endif (HDF5_BUILD_FRAMEWORKS)
+  endif (APPLE)
+
+endmacro (H5_SET_LIB_OPTIONS)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/HDFCompilerFlags.cmake b/gatb-core/thirdparty/hdf5/config/cmake/HDFCompilerFlags.cmake
new file mode 100644
index 0000000..c637c73
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/HDFCompilerFlags.cmake
@@ -0,0 +1,274 @@
+#-----------------------------------------------------------------------------
+# Compiler specific flags : Shouldn't there be compiler tests for these
+#-----------------------------------------------------------------------------
+if (CMAKE_COMPILER_IS_GNUCC)
+  if (CMAKE_BUILD_TYPE MATCHES Debug)
+    set (CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS} -std=c99")
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Og -ftrapv -fno-common")
+    endif ()
+  else (CMAKE_BUILD_TYPE MATCHES Debug)
+    set (CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS} -std=c99")
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstdarg-opt")
+    endif ()
+  endif (CMAKE_BUILD_TYPE MATCHES Debug)
+endif (CMAKE_COMPILER_IS_GNUCC)
+if (CMAKE_COMPILER_IS_GNUCXX)
+  if (CMAKE_BUILD_TYPE MATCHES Debug)
+    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS} -std=c99")
+    if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
+      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og -ftrapv -fno-common")
+    endif ()
+  else (CMAKE_BUILD_TYPE MATCHES Debug)
+    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS} -std=c99")
+    if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
+      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstdarg-opt")
+    endif ()
+  endif (CMAKE_BUILD_TYPE MATCHES Debug)
+endif (CMAKE_COMPILER_IS_GNUCXX)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to disable compiler warnings
+#-----------------------------------------------------------------------------
+option (HDF5_DISABLE_COMPILER_WARNINGS "Disable compiler warnings" OFF)
+if (HDF5_DISABLE_COMPILER_WARNINGS)
+  # MSVC uses /w to suppress warnings.  It also complains if another
+  # warning level is given, so remove it.
+  if (MSVC)
+    set (HDF5_WARNINGS_BLOCKED 1)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /w")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w")
+  endif (MSVC)
+  if (WIN32)
+    add_definitions (-D_CRT_SECURE_NO_WARNINGS)
+  endif (WIN32)
+  # Borland uses -w- to suppress warnings.
+  if (BORLAND)
+    set (HDF5_WARNINGS_BLOCKED 1)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
+  endif (BORLAND)
+
+  # Most compilers use -w to suppress warnings.
+  if (NOT HDF5_WARNINGS_BLOCKED)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
+  endif (NOT HDF5_WARNINGS_BLOCKED)
+endif (HDF5_DISABLE_COMPILER_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# CDash is configured to only allow 3000 warnings, so
+# break into groups (from the config/gnu-flags file)
+#-----------------------------------------------------------------------------
+if (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
+  if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline")
+  else (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -erroff=%none -DBSD_COMP")
+  endif (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # set (H5_CFLAGS "${H5_CFLAGS} -Wtraditional")
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # set (H5_CFLAGS "${H5_CFLAGS} -Wtraditional-conversion")
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #set (H5_CFLAGS "${H5_CFLAGS} -Wfloat-equal -Wmissing-format-attribute -Wpadded")
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wfloat-equal -Wmissing-format-attribute")
+
+    # Append warning flags from gcc-3.2* case
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wmissing-noreturn -Wpacked -Wdisabled-optimization")
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wformat=2")
+
+    # The "unreachable code" warning appears to be reliable now...
+    # (this warning was removed in gcc 4.5+)
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
+      set (H5_CFLAGS1 "${H5_CFLAGS1} -Wunreachable-code")
+    endif()
+
+    # Append warning flags from gcc-3.3* case
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wendif-labels")
+
+    # Append warning flags from gcc-3.4* case
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch")
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros")
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wunsafe-loop-optimizations -Wc++-compat")
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wstrict-overflow")
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wlogical-op -Wlarger-than=2048 -Wvla")
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    set (H5_CFLAGS4 "${H5_CFLAGS4} -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat")
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5)
+      set (H5_CFLAGS4 "${H5_CFLAGS4} -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants")
+    endif()
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6)
+      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines")
+    endif()
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
+      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn")
+    endif()
+
+    # Append more extra warning flags that only gcc 4.8+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8)
+      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wsuggest-attribute=format")
+    endif()
+
+    # Append more extra warning flags that only gcc 4.9+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9)
+      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wdate-time -Wopenmp-simd")
+    endif()
+
+    # (There was no release of gcc 5.0)
+
+    # Append more extra warning flags that only gcc 5.1+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.1)
+      set (H5_CFLAGS6 "${H5_CFLAGS6} -Warray-bounds=2 -Wc99-c11-compat")
+    endif()
+
+endif (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable all warnings
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_ALL_WARNINGS "Enable all warnings" OFF)
+if (HDF5_ENABLE_ALL_WARNINGS)
+  if (MSVC)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall")
+  else (MSVC)
+    if (CMAKE_COMPILER_IS_GNUCC)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic ${H5_CFLAGS1} ${H5_CFLAGS2} ${H5_CFLAGS3} ${H5_CFLAGS4}")
+    endif (CMAKE_COMPILER_IS_GNUCC)
+  endif (MSVC)
+endif (HDF5_ENABLE_ALL_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPZERO_WARNINGS "Enable group zero warnings" OFF)
+if (HDF5_ENABLE_GROUPZERO_WARNINGS)
+  if (MSVC)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W1")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W1")
+  else (MSVC)
+    if (CMAKE_COMPILER_IS_GNUCC)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic")
+    endif (CMAKE_COMPILER_IS_GNUCC)
+  endif (MSVC)
+endif (HDF5_ENABLE_GROUPZERO_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPONE_WARNINGS "Enable group one warnings" OFF)
+if (HDF5_ENABLE_GROUPONE_WARNINGS)
+  if (MSVC)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W2")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2")
+  else (MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS1}")
+  endif (MSVC)
+endif (HDF5_ENABLE_GROUPONE_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPTWO_WARNINGS "Enable group two warnings" OFF)
+if (HDF5_ENABLE_GROUPTWO_WARNINGS)
+  if (MSVC)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+  else (MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS2}")
+  endif (MSVC)
+endif (HDF5_ENABLE_GROUPTWO_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPTHREE_WARNINGS "Enable group three warnings" OFF)
+if (HDF5_ENABLE_GROUPTHREE_WARNINGS)
+  if (MSVC)
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
+    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
+  else (MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS3}")
+  endif (MSVC)
+endif (HDF5_ENABLE_GROUPTHREE_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPFOUR_WARNINGS "Enable group four warnings" OFF)
+if (HDF5_ENABLE_GROUPFOUR_WARNINGS)
+  if (NOT MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS4}")
+  endif (NOT MSVC)
+endif (HDF5_ENABLE_GROUPFOUR_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPFIVE_WARNINGS "Enable group five warnings" OFF)
+if (HDF5_ENABLE_GROUPFIVE_WARNINGS)
+  if (NOT MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS5}")
+  endif (NOT MSVC)
+endif (HDF5_ENABLE_GROUPFIVE_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# Option to allow the user to enable warnings by groups
+#-----------------------------------------------------------------------------
+option (HDF5_ENABLE_GROUPSIX_WARNINGS "Enable group six warnings" OFF)
+if (HDF5_ENABLE_GROUPSIX_WARNINGS)
+  if (NOT MSVC)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS6}")
+  endif (NOT MSVC)
+endif (HDF5_ENABLE_GROUPSIX_WARNINGS)
+
+#-----------------------------------------------------------------------------
+# This is in here to help some of the GCC based IDES like Eclipse
+# and code blocks parse the compiler errors and warnings better.
+#-----------------------------------------------------------------------------
+if (CMAKE_COMPILER_IS_GNUCC)
+  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")
+endif (CMAKE_COMPILER_IS_GNUCC)
+if (CMAKE_COMPILER_IS_GNUCXX)
+  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
+endif (CMAKE_COMPILER_IS_GNUCXX)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/PkgInfo.in b/gatb-core/thirdparty/hdf5/config/cmake/PkgInfo.in
new file mode 100644
index 0000000..e530f88
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/PkgInfo.in
@@ -0,0 +1 @@
+FMWK????
\ No newline at end of file
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/README.txt.cmake.in b/gatb-core/thirdparty/hdf5/config/cmake/README.txt.cmake.in
new file mode 100644
index 0000000..9bd9eb2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/README.txt.cmake.in
@@ -0,0 +1,67 @@
+ at HDF5_PACKAGE_NAME@ version @HDF5_PACKAGE_VERSION_STRING@
+------------------------------------------------------------------------------
+
+This directory contains the binary (release) distribution of
+ at HDF5_PACKAGE_NAME@ @HDF5_PACKAGE_VERSION_MAJOR@ that was compiled on;
+    @BINARY_PLATFORM at .
+
+It was built with the following options:
+    -- @LIB_TYPE@ C/C++/Fortran libraries
+    -- SZIP (encoder enabled) and ZLIB
+    -- @LIB_TYPE@ HDF5 tools
+
+The contents of this directory are:
+
+    COPYING                 - Copyright notice
+    README.txt              - This file
+    @HDF5_PACKAGE_NAME at -@HDF5_PACKAGE_VERSION at -@BINARY_SYSTEM_NAME at .@BINARY_INSTALL_ENDING@    - HDF5 Install Package
+
+Installation
+===========================================================================
+1. Execute @HDF5_PACKAGE_NAME at -@HDF5_PACKAGE_VERSION at -@BINARY_SYSTEM_NAME at .@BINARY_INSTALL_ENDING@
+2. Follow prompts
+===========================================================================
+
+After Installation
+===========================================================================
+The examples folder, HDF5Examples, located in the
+HDF5 install folder, can be built and tested with CMake and the supplied
+HDF518_Examples.cmake file. The HDF518_Examples.cmake expects HDF5 to have
+been installed in the default location with above compilers. Also, the CMake 
+utility should be installed.
+
+To test the installation with the examples;
+    Create a directory to run the examples.
+    Copy HDF5Examples folder to this directory.
+    Copy HDF518_Examples.cmake to this directory.
+    The default source folder is defined as "HDF5Examples". It can be changed
+        with the CTEST_SOURCE_NAME script option.
+    The default installation folder is defined as "@CMAKE_INSTALL_PREFIX@".
+        It can be changed with the INSTALLDIR script option.
+    The default ctest configuration is defined as "Release". It can be changed
+        with the CTEST_CONFIGURATION_TYPE script option. Note that this must
+        be the same as the value used with the -C command line option.
+    The default build configuration is defined to build and use static libraries.
+        Shared libraries can be used with the STATICLIBRARIES script option set to "NO".
+    Other options can be changed by editing the HDF518_Examples.cmake file.
+
+    If the defaults are okay, execute from this directory:
+        ctest -S HDF518_Examples.cmake -C Release -V -O test.log
+    If the defaults need change, execute from this directory:
+        ctest -S HDF518_Examples.cmake,CTEST_SOURCE_NAME=MyExamples,INSTALLDIR=MyLocation -C Release -V -O test.log
+
+When executed, the ctest script will save the results to the log file, test.log, as
+indicated by the ctest command. If you wish the to see more build and test information,
+add "-VV" to the ctest command. The output should show;
+      100% tests passed, 0 tests failed out of 156.
+
+For more information see USING_CMake_Examples.txt in the install folder.
+===========================================================================
+
+Documentation for this release can be found at the following URL:
+    http://www.hdfgroup.org/HDF5/doc/.
+
+See the HDF5 home page for further details:
+    http://hdfgroup.org/HDF5/
+
+Bugs should be reported to help at hdfgroup.org.
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/UserMacros/Windows_MT.cmake b/gatb-core/thirdparty/hdf5/config/cmake/UserMacros/Windows_MT.cmake
new file mode 100644
index 0000000..a54f22c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/UserMacros/Windows_MT.cmake
@@ -0,0 +1,41 @@
+########################################################
+#  Include file for user options
+########################################################
+
+# To use this option, copy both the macro and option code
+# into the root UserMacros.cmake file. 
+# OR add an include to the root UserMacros.cmake file:
+# INCLUDE(path_to_file/WINDOWS_MT.cmake)
+
+#-----------------------------------------------------------------------------
+# Option to Build with Static CRT libraries on Windows
+#-------------------------------------------------------------------------------
+MACRO (TARGET_STATIC_CRT_FLAGS)
+  if (MSVC AND NOT BUILD_SHARED_LIBS)
+    foreach (flag_var
+        CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+        CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
+        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+      if (${flag_var} MATCHES "/MD")
+        string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+      endif (${flag_var} MATCHES "/MD")
+    endforeach (flag_var)
+    foreach (flag_var
+        CMAKE_Fortran_FLAGS CMAKE_Fortran_FLAGS_DEBUG CMAKE_Fortran_FLAGS_RELEASE
+        CMAKE_Fortran_FLAGS_MINSIZEREL CMAKE_Fortran_FLAGS_RELWITHDEBINFO)
+      if (${flag_var} MATCHES "/libs:dll")
+        string (REGEX REPLACE "/libs:dll" "/libs:static" ${flag_var} "${${flag_var}}")
+      endif (${flag_var} MATCHES "/libs:dll")
+    endforeach (flag_var)
+    set (WIN_COMPILE_FLAGS "")
+    set (WIN_LINK_FLAGS "/NODEFAULTLIB:MSVCRT")
+  endif (MSVC AND NOT BUILD_SHARED_LIBS)
+ENDMACRO (TARGET_STATIC_CRT_FLAGS)
+
+#-----------------------------------------------------------------------------
+option (BUILD_STATIC_CRT_LIBS "Build With Static CRT Libraries" OFF)
+if (BUILD_STATIC_CRT_LIBS)
+  TARGET_STATIC_CRT_FLAGS ()
+endif (BUILD_STATIC_CRT_LIBS)
+ 
\ No newline at end of file
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/cacheinit.cmake b/gatb-core/thirdparty/hdf5/config/cmake/cacheinit.cmake
new file mode 100644
index 0000000..5fbee62
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/cacheinit.cmake
@@ -0,0 +1,62 @@
+# This is the CMakeCache file.
+
+########################
+# EXTERNAL cache entries
+########################
+
+set (CMAKE_INSTALL_FRAMEWORK_PREFIX "Library/Frameworks" CACHE STRING "Frameworks installation directory" FORCE)
+
+set (HDF_PACKAGE_EXT "" CACHE STRING "Name of HDF package extension" FORCE)
+
+set (HDF5_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE)
+
+set (HDF5_BUILD_GENERATORS OFF CACHE BOOL "Build Test Generators" FORCE)
+
+set (HDF5_ENABLE_Z_LIB_SUPPORT ON CACHE BOOL "Enable Zlib Filters" FORCE)
+
+set (HDF5_ENABLE_SZIP_SUPPORT ON CACHE BOOL "Use SZip Filter" FORCE)
+
+set (HDF5_ENABLE_SZIP_ENCODING ON CACHE BOOL "Use SZip Encoding" FORCE)
+
+set (HDF5_ENABLE_HSIZET ON CACHE BOOL "Enable datasets larger than memory" FORCE)
+
+set (ALLOW_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
+
+set (HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable deprecated public API symbols" FORCE)
+
+set (HDF5_ENABLE_DIRECT_VFD OFF CACHE BOOL "Build the Direct I/O Virtual File Driver" FORCE)
+
+set (HDF5_ENABLE_PARALLEL OFF CACHE BOOL "Enable parallel build (requires MPI)" FORCE)
+
+set (MPIEXEC_MAX_NUMPROCS "3" CACHE STRING "Minimum number of processes for HDF parallel tests" FORCE)
+
+set (HDF5_BUILD_PARALLEL_ALL OFF CACHE BOOL "Build Parallel Programs" FORCE)
+
+set (HDF5_ENABLE_COVERAGE OFF CACHE BOOL "Enable code coverage for Libraries and Programs" FORCE)
+
+set (HDF5_ENABLE_USING_MEMCHECKER OFF CACHE BOOL "Indicate that a memory checker is used" FORCE)
+
+set (HDF5_DISABLE_COMPILER_WARNINGS OFF CACHE BOOL "Disable compiler warnings" FORCE)
+
+set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs." FORCE)
+
+set (HDF5_USE_16_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.6.x API by default" FORCE)
+
+set (HDF5_ENABLE_THREADSAFE OFF CACHE BOOL "(WINDOWS)Enable Threadsafety" FORCE)
+
+set (HDF_TEST_EXPRESS "2" CACHE STRING "Control testing framework (0-3)" FORCE)
+
+set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libraries" FORCE)
+
+set (HDF5_NO_PACKAGES OFF CACHE BOOL "CPACK - Disable packaging" FORCE)
+
+set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO GIT SVN TGZ)" FORCE)
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
+
+set (ZLIB_TGZ_NAME "ZLib.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE)
+
+set (SZIP_TGZ_NAME "SZip.tar.gz" CACHE STRING "Use SZip from compressed file" FORCE)
+
+set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE)
+
+set (SZIP_PACKAGE_NAME "szip" CACHE STRING "Name of SZIP package" FORCE)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config-version.cmake.in b/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config-version.cmake.in
new file mode 100644
index 0000000..5911fa7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config-version.cmake.in
@@ -0,0 +1,47 @@
+#-----------------------------------------------------------------------------
+# HDF5 Version file for install directory
+#-----------------------------------------------------------------------------
+#
+# The created file sets PACKAGE_VERSION_EXACT if the current version string and
+# the requested version string are exactly the same and it sets
+# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
+# but only if the requested major.minor version is the same as the current one.
+# The variable HDF5_VERSION_STRING must be set before calling configure_file().
+
+set (PACKAGE_VERSION "@HDF5_VERSION_STRING@")
+
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" )
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  if ("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "@H5_VERS_MAJOR@")
+    
+    # exact match for version @H5_VERS_MAJOR at .@H5_VERS_MINOR@
+    if ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
+    
+      # compatible with any version @H5_VERS_MAJOR at .@H5_VERS_MINOR at .x
+      set (PACKAGE_VERSION_COMPATIBLE TRUE) 
+        
+      if ("${PACKAGE_FIND_VERSION_PATCH}" STREQUAL "@H5_VERS_RELEASE@")
+        set (PACKAGE_VERSION_EXACT TRUE)
+   
+        if ("${PACKAGE_FIND_VERSION_TWEAK}" STREQUAL "@H5_VERS_SUBRELEASE@")
+          # not using this yet
+        endif ("${PACKAGE_FIND_VERSION_TWEAK}" STREQUAL "@H5_VERS_SUBRELEASE@")
+      endif ("${PACKAGE_FIND_VERSION_PATCH}" STREQUAL "@H5_VERS_RELEASE@")
+    else ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
+      set (PACKAGE_VERSION_COMPATIBLE FALSE) 
+    endif ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
+  endif ("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "@H5_VERS_MAJOR@")
+endif()
+
+# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
+if("${CMAKE_SIZEOF_VOID_P}"  STREQUAL ""  OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "")
+   return()
+endif()
+
+# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
+if(NOT "${CMAKE_SIZEOF_VOID_P}" STREQUAL "@CMAKE_SIZEOF_VOID_P@")
+  math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8")
+  set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
+  set(PACKAGE_VERSION_UNSUITABLE TRUE)
+endif()
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config.cmake.in b/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config.cmake.in
new file mode 100644
index 0000000..3584315
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/hdf5-config.cmake.in
@@ -0,0 +1,160 @@
+#-----------------------------------------------------------------------------
+# HDF5 Config file for compiling against hdf5 build/install directory
+#-----------------------------------------------------------------------------
+ at PACKAGE_INIT@
+
+string(TOUPPER @HDF5_PACKAGE@ HDF5_PACKAGE_NAME)
+
+set (${HDF5_PACKAGE_NAME}_VALID_COMPONENTS
+    static
+    shared
+    C
+    CXX
+    Fortran
+    HL
+    CXX_HL
+    Fortran_HL
+    Tools
+)
+
+#-----------------------------------------------------------------------------
+# User Options
+#-----------------------------------------------------------------------------
+set (${HDF5_PACKAGE_NAME}_ENABLE_PARALLEL @HDF5_ENABLE_PARALLEL@)
+set (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN   @HDF5_BUILD_FORTRAN@)
+set (${HDF5_PACKAGE_NAME}_ENABLE_F2003    @HDF5_ENABLE_F2003@)
+set (${HDF5_PACKAGE_NAME}_BUILD_CPP_LIB   @HDF5_BUILD_CPP_LIB@)
+set (${HDF5_PACKAGE_NAME}_BUILD_TOOLS     @HDF5_BUILD_TOOLS@)
+set (${HDF5_PACKAGE_NAME}_BUILD_HL_LIB    @HDF5_BUILD_HL_LIB@)
+set (${HDF5_PACKAGE_NAME}_ENABLE_Z_LIB_SUPPORT @HDF5_ENABLE_Z_LIB_SUPPORT@)
+set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_SUPPORT  @HDF5_ENABLE_SZIP_SUPPORT@)
+set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_ENCODING @HDF5_ENABLE_SZIP_ENCODING@)
+set (${HDF5_PACKAGE_NAME}_BUILD_SHARED_LIBS    @BUILD_SHARED_LIBS@)
+set (${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS      @HDF5_PACKAGE_EXTLIBS@)
+set (${HDF5_PACKAGE_NAME}_EXPORT_LIBRARIES @HDF5_LIBRARIES_TO_EXPORT@)
+
+#-----------------------------------------------------------------------------
+# Dependencies
+#-----------------------------------------------------------------------------
+if (${HDF5_PACKAGE_NAME}_ENABLE_PARALLEL)
+  set (${HDF5_PACKAGE_NAME}_MPI_C_INCLUDE_PATH "@MPI_C_INCLUDE_PATH@")
+  set (${HDF5_PACKAGE_NAME}_MPI_C_LIBRARIES    "@MPI_C_LIBRARIES@")
+endif ()
+
+#-----------------------------------------------------------------------------
+# Directories
+#-----------------------------------------------------------------------------
+set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@" "${${HDF5_PACKAGE_NAME}_MPI_C_INCLUDE_PATH}")
+
+set (${HDF5_PACKAGE_NAME}_SHARE_DIR "@PACKAGE_SHARE_INSTALL_DIR@")
+set_and_check (${HDF5_PACKAGE_NAME}_BUILD_DIR "@PACKAGE_CURRENT_BUILD_DIR@")
+
+if (${HDF5_PACKAGE_NAME}_BUILD_CPP_LIB)
+  set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_CPP "@PACKAGE_INCLUDE_INSTALL_DIR@")
+endif ()
+
+if (${HDF5_PACKAGE_NAME}_BUILD_HL_LIB)
+  set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_HL "@PACKAGE_INCLUDE_INSTALL_DIR@")
+endif ()
+
+if (${HDF5_PACKAGE_NAME}_BUILD_HL_LIB AND ${HDF5_PACKAGE_NAME}_BUILD_CPP_LIB)
+  set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_HL_CPP "@PACKAGE_INCLUDE_INSTALL_DIR@")
+endif ()
+
+if (${HDF5_PACKAGE_NAME}_BUILD_TOOLS)
+  set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_TOOLS "@PACKAGE_INCLUDE_INSTALL_DIR@")
+  set_and_check (${HDF5_PACKAGE_NAME}_TOOLS_DIR "@PACKAGE_CURRENT_BUILD_DIR@/bin")
+endif ()
+
+#-----------------------------------------------------------------------------
+# Version Strings
+#-----------------------------------------------------------------------------
+set (HDF5_VERSION_STRING @HDF5_VERSION_STRING@)
+set (HDF5_VERSION_MAJOR  @HDF5_VERSION_MAJOR@)
+set (HDF5_VERSION_MINOR  @HDF5_VERSION_MINOR@)
+
+#-----------------------------------------------------------------------------
+# Don't include targets if this file is being picked up by another
+# project which has already built hdf5 as a subproject
+#-----------------------------------------------------------------------------
+if (NOT TARGET "@HDF5_PACKAGE@")
+  if (${HDF5_PACKAGE_NAME}_ENABLE_Z_LIB_SUPPORT AND ${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS AND NOT TARGET "zlib")
+    include (@PACKAGE_SHARE_INSTALL_DIR@/@ZLIB_PACKAGE_NAME@@HDF_PACKAGE_EXT at -targets.cmake)
+  endif ()
+  if (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_SUPPORT AND ${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS AND NOT TARGET "szip")
+    include (@PACKAGE_SHARE_INSTALL_DIR@/@SZIP_PACKAGE_NAME@@HDF_PACKAGE_EXT at -targets.cmake)
+  endif ()
+  include (@PACKAGE_SHARE_INSTALL_DIR@/@HDF5_PACKAGE@@HDF_PACKAGE_EXT at -targets.cmake)
+endif ()
+
+# Handle default component(static) :
+if (NOT ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS)
+    set (${HDF5_PACKAGE_NAME}_LIB_TYPE)
+    set (${HDF5_PACKAGE_NAME}_FIND_COMPONENTS C HL static)
+    set (${HDF5_PACKAGE_NAME}_FIND_REQUIRED_static_C true)
+endif ()
+
+# Handle requested components:
+list (REMOVE_DUPLICATES ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS)
+foreach (comp IN LISTS ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS)
+  if (${comp} STREQUAL "shared")
+    list (REMOVE_ITEM ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS ${comp})
+    set (${HDF5_PACKAGE_NAME}_LIB_TYPE ${${HDF5_PACKAGE_NAME}_LIB_TYPE} ${comp})
+
+    if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN)
+      set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_FORTRAN "@PACKAGE_INCLUDE_INSTALL_DIR@/shared")
+    endif ()
+  elseif (${comp} STREQUAL "static")
+    list (REMOVE_ITEM ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS ${comp})
+    set (${HDF5_PACKAGE_NAME}_LIB_TYPE ${${HDF5_PACKAGE_NAME}_LIB_TYPE} ${comp})
+
+    if (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN)
+      set (${HDF5_PACKAGE_NAME}_INCLUDE_DIR_FORTRAN "@PACKAGE_INCLUDE_INSTALL_DIR@/static")
+    endif ()
+  endif ()
+endforeach ()
+foreach (libtype IN LISTS ${HDF5_PACKAGE_NAME}_LIB_TYPE)
+  foreach (comp IN LISTS ${HDF5_PACKAGE_NAME}_FIND_COMPONENTS)
+    set (hdf5_comp2)
+    if (${comp} STREQUAL "C")
+      set (hdf5_comp "hdf5")
+    elseif (${comp} STREQUAL "CXX")
+      set (hdf5_comp "hdf5_cpp")
+    elseif (${comp} STREQUAL "HL")
+      set (hdf5_comp "hdf5_hl")
+    elseif (${comp} STREQUAL "CXX_HL")
+      set (hdf5_comp "hdf5_hl_cpp")
+    elseif (${comp} STREQUAL "Tools")
+      set (hdf5_comp "hdf5_tools")
+    elseif (${comp} STREQUAL "Fortran")
+      set (hdf5_comp2 "hdf5_f90cstub")
+      set (hdf5_comp "hdf5_fortran")
+    elseif (${comp} STREQUAL "Fortran_HL")
+      set (hdf5_comp2 "hdf5_hl_f90cstub")
+      set (hdf5_comp "hdf5_hl_fortran")
+    endif ()
+    list (FIND ${HDF5_PACKAGE_NAME}_EXPORT_LIBRARIES "${hdf5_comp}-${libtype}" HAVE_COMP)
+    if (${HAVE_COMP} LESS 0)
+      set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 0)
+    else ()
+      if (hdf5_comp2)
+        list (FIND ${HDF5_PACKAGE_NAME}_EXPORT_LIBRARIES "${hdf5_comp2}-${libtype}" HAVE_COMP2)
+        if (${HAVE_COMP2} LESS 0)
+          set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 0)
+        else ()
+          set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 1)
+          string(TOUPPER ${HDF5_PACKAGE_NAME}_${comp}_${libtype}_LIBRARY COMP_LIBRARY)
+          set (${COMP_LIBRARY} ${${COMP_LIBRARY}} @HDF5_PACKAGE@::${hdf5_comp2}-${libtype} @HDF5_PACKAGE@::${hdf5_comp}-${libtype})
+        endif ()
+      else ()
+        set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 1)
+        string(TOUPPER ${HDF5_PACKAGE_NAME}_${comp}_${libtype}_LIBRARY COMP_LIBRARY)
+        set (${COMP_LIBRARY} ${${COMP_LIBRARY}} @HDF5_PACKAGE@::${hdf5_comp}-${libtype})
+      endif ()
+    endif ()
+  endforeach ()
+endforeach ()
+
+foreach (libtype IN LISTS ${HDF5_PACKAGE_NAME}_LIB_TYPE)
+  check_required_components(${HDF5_PACKAGE_NAME}_${libtype})
+endforeach ()
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/libhdf5.settings.cmake.in b/gatb-core/thirdparty/hdf5/config/cmake/libhdf5.settings.cmake.in
new file mode 100644
index 0000000..8ef67a5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/libhdf5.settings.cmake.in
@@ -0,0 +1,71 @@
+      SUMMARY OF THE HDF5 CONFIGURATION
+      =================================
+
+General Information:
+-------------------
+                   HDF5 Version: @HDF5_PACKAGE_VERSION_STRING@
+                  Configured on: @CONFIG_DATE@
+                  Configured by: @CMAKE_GENERATOR@
+                 Configure mode: CMAKE @CMAKE_VERSION@
+                    Host system: @CMAKE_HOST_SYSTEM@
+              Uname information: @CMAKE_SYSTEM_NAME@
+                       Byte sex: @BYTESEX@
+                      Libraries: @BUILD_NAME_EXT@
+             Installation point: @CMAKE_INSTALL_PREFIX@
+
+Compiling Options:
+------------------
+               Compilation Mode: @CMAKE_BUILD_TYPE@
+                     C Compiler: @CMAKE_C_COMPILER@
+                         CFLAGS: @CMAKE_C_FLAGS@
+                      H5_CFLAGS: @H5_CFLAGS@
+                      AM_CFLAGS: @AM_CFLAGS@
+                       CPPFLAGS: @CPPFLAGS@
+                    H5_CPPFLAGS: @H5_CPPFLAGS@
+                    AM_CPPFLAGS: @AM_CPPFLAGS@
+               Shared C Library: @H5_ENABLE_SHARED_LIB@
+               Static C Library: @H5_ENABLE_STATIC_LIB@
+  Statically Linked Executables: @BUILD_STATIC_EXECS@
+                        LDFLAGS: @CMAKE_SHARED_LINKER_FLAGS@
+                     AM_LDFLAGS: @AM_LDFLAGS@
+                Extra libraries: @LINK_LIBS@
+                       Archiver: @CMAKE_AR@
+                         Ranlib: @CMAKE_RANLIB@
+              Debugged Packages: @DEBUG_PKG@
+                    API Tracing: @HDF5_ENABLE_TRACE@
+
+Languages:
+----------
+                        Fortran: @HDF5_BUILD_FORTRAN@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               Fortran Compiler: @CMAKE_Fortran_COMPILER@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@          Fortran 2003 Compiler: @HDF5_ENABLE_F2003@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@                  Fortran Flags: @CMAKE_Fortran_FLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               H5 Fortran Flags: @H5_FCFLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               AM Fortran Flags: @AM_FCFLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@         Shared Fortran Library: @H5_ENABLE_SHARED_LIB@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@         Static Fortran Library: YES
+
+                            C++: @HDF5_BUILD_CPP_LIB@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   C++ Compiler: @CMAKE_CXX_COMPILER@
+ at BUILD_CXX_CONDITIONAL_TRUE@                      C++ Flags: @CMAKE_CXX_FLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   H5 C++ Flags: @H5_CXXFLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   AM C++ Flags: @AM_CXXFLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@             Shared C++ Library: @H5_ENABLE_SHARED_LIB@
+ at BUILD_CXX_CONDITIONAL_TRUE@             Static C++ Library: YES
+
+Features:
+---------
+                  Parallel HDF5: @HDF5_ENABLE_PARALLEL@
+             High Level library: @HDF5_BUILD_HL_LIB@
+                   Threadsafety: @HDF5_ENABLE_THREADSAFE@
+            Default API Mapping: @DEFAULT_API_VERSION@
+ With Deprecated Public Symbols: @HDF5_ENABLE_DEPRECATED_SYMBOLS@
+         I/O filters (external): @EXTERNAL_FILTERS@
+                            MPE: @H5_HAVE_LIBLMPE@
+                     Direct VFD: @H5_HAVE_DIRECT@
+                        dmalloc: @H5_HAVE_LIBDMALLOC@
+Clear file buffers before write: @HDF5_Enable_Clear_File_Buffers@
+           Using memory checker: @HDF5_ENABLE_USING_MEMCHECKER@
+         Function Stack Tracing: @HDF5_ENABLE_CODESTACK@
+      Strict File Format Checks: @HDF5_STRICT_FORMAT_CHECKS@
+   Optimization Instrumentation: @HDF5_Enable_Instrument@
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/mccacheinit.cmake b/gatb-core/thirdparty/hdf5/config/cmake/mccacheinit.cmake
new file mode 100644
index 0000000..991614a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/mccacheinit.cmake
@@ -0,0 +1,76 @@
+# This is the CMakeCache file.
+
+########################
+# EXTERNAL cache entries
+########################
+
+set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries" FORCE)
+
+set (BUILD_TESTING ON CACHE BOOL "Build HDF5 Unit Testing" FORCE)
+
+set (HDF_PACKAGE_EXT "" CACHE STRING "Name of HDF package extension" FORCE)
+
+set (HDF5_BUILD_CPP_LIB ON CACHE BOOL "Build HDF5 C++ Library" FORCE)
+
+set (HDF5_BUILD_EXAMPLES ON CACHE BOOL "Build HDF5 Library Examples" FORCE)
+
+set (HDF5_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE)
+
+set (HDF5_ENABLE_F2003 ON CACHE BOOL "Enable FORTRAN 2003 Standard" FORCE)
+
+set (HDF5_BUILD_HL_LIB ON CACHE BOOL "Build HIGH Level HDF5 Library" FORCE)
+
+set (HDF5_BUILD_TOOLS ON CACHE BOOL "Build HDF5 Tools" FORCE)
+
+set (HDF5_BUILD_GENERATORS OFF CACHE BOOL "Build Test Generators" FORCE)
+
+set (HDF5_ENABLE_Z_LIB_SUPPORT ON CACHE BOOL "Enable Zlib Filters" FORCE)
+
+set (HDF5_ENABLE_SZIP_SUPPORT ON CACHE BOOL "Use SZip Filter" FORCE)
+
+set (HDF5_ENABLE_SZIP_ENCODING ON CACHE BOOL "Use SZip Encoding" FORCE)
+
+set (HDF5_ENABLE_HSIZET ON CACHE BOOL "Enable datasets larger than memory" FORCE)
+
+set (ALLOW_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
+
+set (HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable deprecated public API symbols" FORCE)
+
+set (HDF5_ENABLE_DIRECT_VFD OFF CACHE BOOL "Build the Direct I/O Virtual File Driver" FORCE)
+
+set (HDF5_ENABLE_PARALLEL OFF CACHE BOOL "Enable parallel build (requires MPI)" FORCE)
+
+set (MPIEXEC_MAX_NUMPROCS "3" CACHE STRING "Minimum number of processes for HDF parallel tests" FORCE)
+
+set (HDF5_BUILD_PARALLEL_ALL OFF CACHE BOOL "Build Parallel Programs" FORCE)
+
+set (HDF5_ENABLE_COVERAGE OFF CACHE BOOL "Enable code coverage for Libraries and Programs" FORCE)
+
+set (HDF5_ENABLE_USING_MEMCHECKER ON CACHE BOOL "Indicate that a memory checker is used" FORCE)
+
+set (HDF5_DISABLE_COMPILER_WARNINGS OFF CACHE BOOL "Disable compiler warnings" FORCE)
+
+set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs." FORCE)
+
+set (HDF5_USE_16_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.6.x API by default" FORCE)
+
+set (HDF5_ENABLE_THREADSAFE OFF CACHE BOOL "(WINDOWS)Enable Threadsafety" FORCE)
+
+set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libraries" FORCE)
+
+set (HDF5_NO_PACKAGES ON CACHE BOOL "CPACK - Disable packaging" FORCE)
+
+set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO GIT SVN TGZ)" FORCE)
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
+
+set (ZLIB_TGZ_NAME "ZLib.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE)
+
+set (SZIP_TGZ_NAME "SZip.tar.gz" CACHE STRING "Use SZip from compressed file" FORCE)
+
+set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Debug" FORCE)
+
+set (CTEST_CONFIGURATION_TYPE "Debug" CACHE STRING "Build Debug" FORCE)
+
+set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE)
+
+set (SZIP_PACKAGE_NAME "szip" CACHE STRING "Name of SZIP package" FORCE)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/patch.xml b/gatb-core/thirdparty/hdf5/config/cmake/patch.xml
new file mode 100644
index 0000000..70571c5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/patch.xml
@@ -0,0 +1,11 @@
+<CPackWiXPatch>
+	<CPackWiXFragment Id="CM_CP_libraries.bin.hdf5.dll">
+        <Environment Id="PATH" 
+             Name="PATH" 
+             Value="[CM_DP_libraries.bin]" 
+             Permanent="no" 
+             Part="last" 
+             Action="set" 
+             System="yes"/>
+	</CPackWiXFragment>
+</CPackWiXPatch>
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/scripts/CTestScript.cmake b/gatb-core/thirdparty/hdf5/config/cmake/scripts/CTestScript.cmake
new file mode 100755
index 0000000..75e61ee
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/scripts/CTestScript.cmake
@@ -0,0 +1,296 @@
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+########################################################
+# This dashboard is maintained by The HDF Group
+# For any comments please contact cdashhelp at hdfgroup.org
+#
+########################################################
+# -----------------------------------------------------------
+# -- Get environment
+# -----------------------------------------------------------
+if(NOT SITE_OS_NAME)
+  ## machine name not provided - attempt to discover with uname
+  ## -- set hostname
+  ## --------------------------
+  find_program(HOSTNAME_CMD NAMES hostname)
+  exec_program(${HOSTNAME_CMD} ARGS OUTPUT_VARIABLE HOSTNAME)
+  set(CTEST_SITE  "${HOSTNAME}${CTEST_SITE_EXT}")
+  find_program(UNAME NAMES uname)
+  macro(getuname name flag)
+    exec_program("${UNAME}" ARGS "${flag}" OUTPUT_VARIABLE "${name}")
+  endmacro(getuname)
+
+  getuname(osname -s)
+  getuname(osrel  -r)
+  getuname(cpu    -m)
+  message(STATUS "Dashboard script uname output: ${osname}-${osrel}-${cpu}\n")
+
+  set(CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}")
+  if(USE_AUTOTOOLS)
+    set(CTEST_BUILD_NAME  "AT-${CTEST_BUILD_NAME}")
+  endif()
+  if(SITE_BUILDNAME_SUFFIX)
+    set(CTEST_BUILD_NAME  "${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX}")
+  endif()
+  set(BUILD_OPTIONS "${ADD_BUILD_OPTIONS}")
+else(NOT SITE_OS_NAME)
+  ## machine name provided
+  ## --------------------------
+  if(CMAKE_HOST_UNIX)
+    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_OS_BITS}-${SITE_COMPILER_NAME}-${SITE_COMPILER_VERSION}")
+  else()
+    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_COMPILER_NAME}")
+  endif()
+  if(SITE_BUILDNAME_SUFFIX)
+    set(CTEST_BUILD_NAME "${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX}")
+  endif()
+  set(BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
+endif(NOT SITE_OS_NAME)
+
+#-----------------------------------------------------------------------------
+# MAC machines need special option
+#-----------------------------------------------------------------------------
+if(APPLE)
+  # Compiler choice
+  execute_process(COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
+  execute_process(COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(ENV{CC} "${XCODE_CC}")
+  set(ENV{CXX} "${XCODE_CXX}")
+
+  if(NOT NO_MAC_FORTRAN)
+    # Shared fortran is not supported, build static 
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
+  else(NOT NO_MAC_FORTRAN)
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
+  endif(NOT NO_MAC_FORTRAN)
+
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
+endif(APPLE)
+
+#-----------------------------------------------------------------------------
+set(NEED_REPOSITORY_CHECKOUT 0)
+set(CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
+if(CTEST_USE_TAR_SOURCE)
+  ## Uncompress source if tar file provided
+  ## --------------------------
+  if(WIN32)
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} x ${CTEST_DASHBOARD_ROOT}\\${CTEST_USE_TAR_SOURCE}.zip]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}\\${CTEST_USE_TAR_SOURCE}.zip RESULT_VARIABLE rv)
+  else()
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar RESULT_VARIABLE rv)
+  endif()
+
+  if(NOT rv EQUAL 0)
+    message(STATUS "extracting... [error-(${rv}) clean up]")
+    file(REMOVE_RECURSE "${CTEST_SOURCE_DIRECTORY}")
+    message(FATAL_ERROR "error: extract of ${CTEST_USE_TAR_SOURCE} failed")
+  endif()
+
+  file(RENAME ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE} ${CTEST_SOURCE_DIRECTORY})
+  set(LOCAL_SKIP_UPDATE "TRUE")
+else(CTEST_USE_TAR_SOURCE)
+  if(LOCAL_UPDATE)
+    if(CTEST_USE_GIT_SOURCE)
+      find_program(CTEST_GIT_COMMAND NAMES git git.cmd)
+      set(CTEST_GIT_UPDATE_OPTIONS)
+
+      if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
+        set(NEED_REPOSITORY_CHECKOUT 1)
+      endif()
+
+      if(${NEED_REPOSITORY_CHECKOUT})
+        if(REPOSITORY_BRANCH)
+          set(CTEST_GIT_options "clone \"${REPOSITORY_URL}\" --branch  \"${REPOSITORY_BRANCH}\" --single-branch \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
+        else()
+          set(CTEST_GIT_options "clone \"${REPOSITORY_URL}\" \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
+        endif()
+        set(CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} ${CTEST_GIT_options}")
+      else()
+        set(CTEST_GIT_options "pull")
+      endif()
+      set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
+    else(CTEST_USE_GIT_SOURCE)
+      ## --------------------------
+      ## use subversion to get source
+      #-----------------------------------------------------------------------------
+      ## cygwin does not handle the find_package() call
+      ## --------------------------
+      set(CTEST_UPDATE_COMMAND "SVNCommand")
+      if(NOT SITE_CYGWIN})
+        find_package (Subversion)
+        set(CTEST_SVN_COMMAND "${Subversion_SVN_EXECUTABLE}")
+        set(CTEST_UPDATE_COMMAND "${Subversion_SVN_EXECUTABLE}")
+      else()
+        set(CTEST_SVN_COMMAND "/usr/bin/svn")
+        set(CTEST_UPDATE_COMMAND "/usr/bin/svn")
+      endif()
+
+      if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
+        set(NEED_REPOSITORY_CHECKOUT 1)
+      endif()
+
+      if(NOT CTEST_REPO_VERSION)
+        set(CTEST_REPO_VERSION "HEAD")
+      endif()
+      if(${NEED_REPOSITORY_CHECKOUT})
+        set(CTEST_CHECKOUT_COMMAND
+            "\"${CTEST_SVN_COMMAND}\" co ${REPOSITORY_URL} \"${CTEST_SOURCE_DIRECTORY}\" -r ${CTEST_REPO_VERSION}")
+      else()
+        if(CTEST_REPO_VERSION)
+          set(CTEST_SVN_UPDATE_OPTIONS "-r ${CTEST_REPO_VERSION}")
+        endif()
+      endif()
+    endif(CTEST_USE_GIT_SOURCE)
+  endif(LOCAL_UPDATE)
+endif(CTEST_USE_TAR_SOURCE)
+
+#-----------------------------------------------------------------------------
+## Clear the build directory
+## --------------------------
+set(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
+if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}")
+  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+else()
+  ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
+endif()
+
+# Use multiple CPU cores to build
+include(ProcessorCount)
+ProcessorCount(N)
+if(NOT N EQUAL 0)
+  if(NOT WIN32)
+    set(CTEST_BUILD_FLAGS -j${N})
+  endif()
+  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
+endif()
+
+#-----------------------------------------------------------------------------
+# Send the main script as a note.
+list(APPEND CTEST_NOTES_FILES
+    "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
+    "${CMAKE_CURRENT_LIST_FILE}"
+    "${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake"
+)
+
+#-----------------------------------------------------------------------------
+# Check for required variables.
+# --------------------------
+foreach(req
+    CTEST_CMAKE_GENERATOR
+    CTEST_SITE
+    CTEST_BUILD_NAME
+  )
+  if(NOT DEFINED ${req})
+    message(FATAL_ERROR "The containing script must set ${req}")
+  endif()
+endforeach(req)
+
+#-----------------------------------------------------------------------------
+# Initialize the CTEST commands
+#------------------------------
+if(LOCAL_MEMCHECK_TEST)
+  find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
+  set (CTEST_CONFIGURE_COMMAND
+      "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/mccacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+  )
+else()
+  if(LOCAL_COVERAGE_TEST)
+    find_program(CTEST_COVERAGE_COMMAND NAMES gcov)
+  endif()
+  set (CTEST_CONFIGURE_COMMAND
+      "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+  )
+endif()
+
+#-----------------------------------------------------------------------------
+## -- set output to english
+set($ENV{LC_MESSAGES}  "en_EN")
+
+# Print summary information.
+foreach(v
+    CTEST_SITE
+    CTEST_BUILD_NAME
+    CTEST_SOURCE_DIRECTORY
+    CTEST_BINARY_DIRECTORY
+    CTEST_CMAKE_GENERATOR
+    CTEST_CONFIGURATION_TYPE
+    CTEST_GIT_COMMAND
+    CTEST_CHECKOUT_COMMAND
+    CTEST_CONFIGURE_COMMAND
+    CTEST_SCRIPT_DIRECTORY
+    CTEST_USE_LAUNCHERS
+  )
+  set(vars "${vars}  ${v}=[${${v}}]\n")
+endforeach(v)
+message(STATUS "Dashboard script configuration:\n${vars}\n")
+
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+  ## NORMAL process
+  ## -- LOCAL_UPDATE updates the source folder from svn
+  ## -- LOCAL_SUBMIT reports to CDash server
+  ## -- LOCAL_SKIP_TEST skips the test process (only builds)
+  ## -- LOCAL_MEMCHECK_TEST executes the Valgrind testing
+  ## -- LOCAL_COVERAGE_TEST executes code coverage process
+  ## --------------------------
+  ctest_start (${MODEL} TRACK ${MODEL})
+  if(LOCAL_UPDATE)
+    ctest_update (SOURCE "${CTEST_SOURCE_DIRECTORY}")
+  endif()
+  configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+  ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
+  ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
+  if(LOCAL_SUBMIT)
+    ctest_submit (PARTS Update Configure Notes)
+  endif()
+  if(${res} LESS 0 OR ${res} GREATER 0)
+    file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Configure: ${res}\n")
+  endif()
+
+  ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND RETURN_VALUE res NUMBER_ERRORS errval)
+  if(LOCAL_SUBMIT)
+    ctest_submit (PARTS Build)
+  endif()
+  if(${res} LESS 0 OR ${res} GREATER 0 OR ${errval} GREATER 0)
+    file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed ${errval} Build: ${res}\n")
+  endif()
+
+  if(NOT LOCAL_SKIP_TEST)
+    if(NOT LOCAL_MEMCHECK_TEST)
+      ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+      if(LOCAL_SUBMIT)
+        ctest_submit (PARTS Test)
+      endif()
+      if(${res} LESS 0 OR ${res} GREATER 0)
+        file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Tests: ${res}\n")
+      endif()
+    else()
+      ctest_memcheck (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args})
+      if(LOCAL_SUBMIT)
+        ctest_submit (PARTS MemCheck)
+      endif()
+    endif()
+    if(LOCAL_COVERAGE_TEST)
+      ctest_coverage (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
+      if(LOCAL_SUBMIT)
+        ctest_submit (PARTS Coverage)
+      endif()
+    endif()
+  endif(NOT LOCAL_SKIP_TEST)
+
+  if(NOT LOCAL_MEMCHECK_TEST AND NOT LOCAL_NO_PACKAGE AND NOT LOCAL_SKIP_BUILD)
+    ##-----------------------------------------------
+    ## Package the product
+    ##-----------------------------------------------
+    execute_process(COMMAND cpack -C ${CTEST_CONFIGURATION_TYPE} -V
+      WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY}
+      RESULT_VARIABLE cpackResult
+      OUTPUT_VARIABLE cpackLog
+      ERROR_VARIABLE cpackLog.err
+    )
+    file(WRITE ${CTEST_BINARY_DIRECTORY}/cpack.log "${cpackLog.err}" "${cpackLog}")
+    if(cpackResult GREATER 0)
+      file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed packaging: ${cpackResult}:${cpackLog.err} \n")
+    endif()
+  endif()
+#-----------------------------------------------------------------------------
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/scripts/HDF518config.cmake b/gatb-core/thirdparty/hdf5/config/cmake/scripts/HDF518config.cmake
new file mode 100755
index 0000000..55e4667
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/scripts/HDF518config.cmake
@@ -0,0 +1,266 @@
+#############################################################################################
+### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE                                       ###
+### BUILD_GENERATOR required [Unix, VS2015, VS201564, VS2013, VS201364, VS2012, VS201264] ###
+### ctest -S HDF518config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf518.log      ###
+#############################################################################################
+
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+############################################################################
+# Usage:
+#     ctest -S HDF518config.cmake,OPTION=VALUE -C Release -VV -O test.log
+# where valid options for OPTION are:
+#     BUILD_GENERATOR - The cmake build generator:
+#            Unix    * Unix Makefiles
+#            VS2015    * Visual Studio 14 2015
+#            VS201564 * Visual Studio 14 2015 Win64
+#            VS2013    * Visual Studio 12 2013
+#            VS201364 * Visual Studio 12 2013 Win64
+#            VS2012    * Visual Studio 11 2012
+#            VS201264 * Visual Studio 11 2012 Win64
+#
+#     INSTALLDIR  -  root folder where hdf5 is installed
+#     CTEST_CONFIGURATION_TYPE  - Release, Debug, etc
+#     CTEST_SOURCE_NAME  -  source folder
+#     STATIC_LIBRARIES  -  Build/use static libraries
+#     FORTRAN_LIBRARIES -  Build/use fortran libraries
+#     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
+##############################################################################
+
+set(CTEST_SOURCE_VERSION 1.8.18)
+set(CTEST_SOURCE_VERSEXT "")
+
+##############################################################################
+# handle input parameters to script.
+#BUILD_GENERATOR - which CMake generator to use, required
+#INSTALLDIR - HDF5-1.8 root folder
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
+#CTEST_SOURCE_NAME - name of source folder; HDF5-1.8.16
+#STATIC_LIBRARIES - Default is YES
+#FORTRAN_LIBRARIES - Default is NO
+#NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
+if(DEFINED CTEST_SCRIPT_ARG)
+    # transform ctest script arguments of the form
+    # script.ctest,var1=value1,var2=value2
+    # to variables with the respective names set to the respective values
+    string(REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
+    foreach(current_var ${script_args})
+        if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
+            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
+        endif()
+    endforeach()
+endif()
+
+# build generator must be defined
+if(NOT DEFINED BUILD_GENERATOR)
+  message(FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
+else()
+  if(${BUILD_GENERATOR} STREQUAL "Unix")
+    set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201564")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015 Win64")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013 Win64")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012 Win64")
+  else()
+    message(FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
+  endif()
+endif()
+
+if(NOT DEFINED INSTALLDIR)
+  if(WIN32)
+    set(INSTALLDIR "C:\\Program\ Files\\HDF_Group\\HDF5\\${CTEST_SOURCE_VERSION}")
+  else()
+    set(INSTALLDIR "${CTEST_SCRIPT_DIRECTORY}/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
+  endif()
+endif()
+if(NOT DEFINED CTEST_CONFIGURATION_TYPE)
+    set(CTEST_CONFIGURATION_TYPE "Release")
+endif()
+if(NOT DEFINED CTEST_SOURCE_NAME)
+    set(CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+endif()
+if(NOT DEFINED STATIC_LIBRARIES)
+    set(STATICLIBRARIES "YES")
+else()
+    set(STATICLIBRARIES "NO")
+endif()
+if(NOT DEFINED FORTRAN_LIBRARIES)
+    set(FORTRANLIBRARIES "NO")
+else()
+    set(FORTRANLIBRARIES "YES")
+endif()
+
+set(CTEST_BINARY_NAME "build")
+set(CTEST_DASHBOARD_ROOT "${CTEST_SCRIPT_DIRECTORY}")
+if(WIN32)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
+else()
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
+endif()
+
+###################################################################
+#########       Following describes compiler           ############
+if(WIN32)
+  set(SITE_OS_NAME "Windows")
+  set(SITE_OS_VERSION "WIN7")
+  if(${BUILD_GENERATOR} STREQUAL "VS201564")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2015")
+    set(SITE_COMPILER_VERSION "14")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2015")
+    set(SITE_COMPILER_VERSION "14")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2013")
+    set(SITE_COMPILER_VERSION "12")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2013")
+    set(SITE_COMPILER_VERSION "12")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2012")
+    set(SITE_COMPILER_VERSION "11")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2012")
+    set(SITE_COMPILER_VERSION "11")
+  endif()
+##  Set the following to unique id your computer  ##
+  set(CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
+else()
+##  Set the following to unique id your computer  ##
+  if(APPLE)
+    set(CTEST_SITE "MAC.XXXX")
+  else()
+    set(CTEST_SITE "LINUX.XXXX")
+  endif()
+endif()
+###################################################################
+
+###################################################################
+#########       Following is for submission to CDash   ############
+###################################################################
+set(MODEL "Experimental")
+###################################################################
+
+###################################################################
+#####       Following controls CDash submission               #####
+#set(LOCAL_SUBMIT "TRUE")
+#####       Following controls test process                   #####
+#set(LOCAL_SKIP_TEST "TRUE")
+#set(LOCAL_MEMCHECK_TEST "TRUE")
+#set(LOCAL_COVERAGE_TEST "TRUE")
+#####       Following controls cpack command                  #####
+#set(LOCAL_NO_PACKAGE "TRUE")
+#####       Following controls source update                  #####
+#set(LOCAL_UPDATE "TRUE")
+set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/branches/hdf5_1_8_18")
+#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
+#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")
+###################################################################
+
+###################################################################
+####  Change default configuration of options in config/cmake/cacheinit.cmake file ###
+####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")
+
+###################################################################
+if(${STATICLIBRARIES})
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
+  #########       Following describes computer           ############
+  ## following is optional to describe build                       ##
+  set(SITE_BUILDNAME_SUFFIX "STATIC")
+endif()
+###################################################################
+
+### uncomment/comment and change the following lines for other configuration options
+
+####      ext libraries       ####
+### ext libs from tgz
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=TGZ -DTGZPATH:PATH=${CTEST_SCRIPT_DIRECTORY}")
+### ext libs from svn
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=SVN")
+### ext libs on system
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_LIBRARY:FILEPATH=some_location/lib/zlib.lib -DZLIB_INCLUDE_DIR:PATH=some_location/include")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSZIP_LIBRARY:FILEPATH=some_location/lib/szlib.lib -DSZIP_INCLUDE_DIR:PATH=some_location/include")
+### disable ext libs building
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF")
+####      fortran       ####
+if(${FORTRANLIBRARIES})
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON")
+  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=ON")
+else()
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
+  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=OFF")
+endif()
+
+### disable test program builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_TESTING:BOOL=OFF")
+
+### disable packaging
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_NO_PACKAGES:BOOL=ON")
+### Create install package with external libraries (szip, zlib, jpeg)
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACKAGE_EXTLIBS:BOOL=ON")
+
+### change install prefix
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH='${INSTALLDIR}'")
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCTEST_CONFIGURATION_TYPE:STRING=$ENV{CMAKE_CONFIG_TYPE}")
+
+###################################################################
+
+if(WIN32)
+  include(${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+else()
+  include(${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
+  if(APPLE)
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+  else()
+    if(CYGWIN)
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+    else()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+    endif()
+  endif()
+endif()
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/userblockTest.cmake b/gatb-core/thirdparty/hdf5/config/cmake/userblockTest.cmake
new file mode 100644
index 0000000..0775cbe
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/userblockTest.cmake
@@ -0,0 +1,120 @@
+# userblockTest.cmake executes a command and captures the output in a file. File is then compared
+# against a reference file. Exit status of command can also be compared.
+
+# arguments checking
+if (NOT TEST_PROGRAM)
+  message (FATAL_ERROR "Require TEST_PROGRAM tellub to be defined")
+endif (NOT TEST_PROGRAM)
+if (NOT TEST_GET_PROGRAM)
+  message (FATAL_ERROR "Require TEST_GET_PROGRAM getub to be defined")
+endif (NOT TEST_GET_PROGRAM)
+if (NOT TEST_FOLDER)
+  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
+endif (NOT TEST_FOLDER)
+if (NOT TEST_HFILE)
+  message (FATAL_ERROR "Require TEST_HFILE the hdf file to be defined")
+endif (NOT TEST_HFILE)
+if (NOT TEST_UFILE)
+  message (FATAL_ERROR "Require TEST_UFILE the ub file to be defined")
+endif (NOT TEST_UFILE)
+if (NOT TEST_CHECKUB)
+  message (STATUS "Require TEST_CHECKUB - YES or NO - to be defined")
+endif (NOT TEST_CHECKUB)
+#if (NOT TEST_EXPECT)
+#  message (STATUS "Require TEST_EXPECT to be defined")
+#endif (NOT TEST_EXPECT)
+#if (NOT TEST_OFILE)
+#  message (FATAL_ERROR "Require TEST_OFILE the original hdf file to be defined")
+#endif (NOT TEST_OFILE)
+
+set (TEST_U_STRING_LEN 0)
+set (TEST_O_STRING_LEN 0)
+set (TEST_H_STRING_LEN 0)
+set (TEST_STRING_SIZE 0)
+
+if (TEST_CHECKUB STREQUAL "YES")
+  # find the length of the user block to check
+  #s1=`cat $ufile | wc -c | sed -e 's/ //g'`
+  file (STRINGS ${TEST_FOLDER}/${TEST_UFILE} TEST_U_STRING)
+  string (LENGTH ${TEST_U_STRING} TEST_U_STRING_LEN)
+
+  # Get the size of the original user block, if any.
+  if (TEST_OFILE)
+    # 'tellub' calls H5Fget_user_block to get the size
+    #  of the user block
+    #s2=`$JAM_BIN/tellub $origfile`
+    EXECUTE_PROCESS (
+        COMMAND ${TEST_PROGRAM} ${TEST_OFILE}
+        WORKING_DIRECTORY ${TEST_FOLDER}
+        RESULT_VARIABLE TEST_RESULT
+        OUTPUT_FILE ${TEST_HFILE}.len.txt
+        OUTPUT_VARIABLE TEST_OUT
+        ERROR_VARIABLE TEST_ERROR
+    )
+    if (NOT ${TEST_RESULT} STREQUAL "0")
+      message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} ${TEST_OFILE} is: ${TEST_ERROR}")
+    endif (NOT ${TEST_RESULT} STREQUAL "0")
+    file (READ ${TEST_HFILE}.len.txt TEST_O_STRING_LEN)
+  endif (TEST_OFILE)
+
+  MATH( EXPR TEST_STRING_SIZE "${TEST_U_STRING_LEN} + ${TEST_O_STRING_LEN}" )
+
+  if (NOT TEST_O_STRING_LEN STREQUAL "0")
+    #$JAM_BIN/getub -c $s2 $origfile > $cmpfile
+    EXECUTE_PROCESS (
+        COMMAND ${TEST_GET_PROGRAM} -c ${TEST_O_STRING_LEN} ${TEST_OFILE}
+        WORKING_DIRECTORY ${TEST_FOLDER}
+        RESULT_VARIABLE TEST_RESULT
+        OUTPUT_FILE ${TEST_HFILE}-ub.cmp
+        OUTPUT_VARIABLE TEST_OUT
+        ERROR_VARIABLE TEST_ERROR
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    #cat $ufile >> $cmpfile
+    file (STRINGS ${TEST_UFILE} TEST_STREAM NEWLINE_CONSUME)
+    file (APPEND ${TEST_HFILE}-ub.cmp "${TEST_STREAM}")
+  else (NOT TEST_O_STRING_LEN STREQUAL "0")
+    file (STRINGS ${TEST_UFILE} TEST_STREAM NEWLINE_CONSUME)
+    file (WRITE ${TEST_HFILE}-ub.cmp ${TEST_STREAM})
+  endif (NOT TEST_O_STRING_LEN STREQUAL "0")
+
+  #$JAM_BIN/getub -c $size $hfile > $tfile
+  EXECUTE_PROCESS (
+      COMMAND ${TEST_GET_PROGRAM} -c ${TEST_STRING_SIZE} ${TEST_HFILE}
+      WORKING_DIRECTORY ${TEST_FOLDER}
+      RESULT_VARIABLE TEST_RESULT
+      OUTPUT_FILE ${TEST_HFILE}.cmp
+      OUTPUT_VARIABLE TEST_OUT
+      ERROR_VARIABLE TEST_ERROR
+      OUTPUT_STRIP_TRAILING_WHITESPACE
+  )
+
+  # now compare the outputs
+  EXECUTE_PROCESS (
+      COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_HFILE}-ub.cmp ${TEST_HFILE}.cmp
+      RESULT_VARIABLE TEST_RESULT
+  )
+
+  message (STATUS "COMPARE Result: ${TEST_RESULT}: ${TEST_STRING_SIZE}=${TEST_U_STRING_LEN}+${TEST_O_STRING_LEN}")
+  # if the return value is !=${TEST_EXPECT} bail out
+  if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+    message (FATAL_ERROR "Failed: The output of ${TEST_HFILE}-ub did not match ${TEST_HFILE}.\n${TEST_ERROR}")
+  endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+else (TEST_CHECKUB STREQUAL "YES")
+    # call 'ubsize' to get the size of the user block
+    #ubsize=`$JAM_BIN/tellub $hfile`
+    EXECUTE_PROCESS (
+        COMMAND ${TEST_PROGRAM} ${TEST_HFILE}
+        WORKING_DIRECTORY ${TEST_FOLDER}
+        RESULT_VARIABLE TEST_H_STRING_LEN
+        OUTPUT_VARIABLE TEST_OUT
+        ERROR_VARIABLE TEST_ERROR
+    )
+  if (NOT TEST_H_STRING_LEN STREQUAL "0")
+    message (FATAL_ERROR "Failed: The output of ${TEST_HFILE} was NOT empty")
+  endif (NOT TEST_H_STRING_LEN STREQUAL "0")
+endif (TEST_CHECKUB STREQUAL "YES")
+
+# everything went fine...
+message ("Passed: The output of CHECK matched expectation")
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake/vfdTest.cmake b/gatb-core/thirdparty/hdf5/config/cmake/vfdTest.cmake
new file mode 100644
index 0000000..10f0a7b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake/vfdTest.cmake
@@ -0,0 +1,50 @@
+# vfdTest.cmake executes a command and captures the output in a file. Command uses specified VFD.
+# Exit status of command can also be compared.
+
+# arguments checking
+if (NOT TEST_PROGRAM)
+  message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
+endif (NOT TEST_PROGRAM)
+#if (NOT TEST_ARGS)
+#  message (STATUS "Require TEST_ARGS to be defined")
+#endif (NOT TEST_ARGS)
+#if (NOT TEST_EXPECT)
+#  message (STATUS "Require TEST_EXPECT to be defined")
+#endif (NOT TEST_EXPECT)
+if (NOT TEST_FOLDER)
+  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
+endif (NOT TEST_FOLDER)
+if (NOT TEST_VFD)
+  message (FATAL_ERROR "Require TEST_VFD to be defined")
+endif (NOT TEST_VFD)
+
+set (ERROR_APPEND 1)
+
+message (STATUS "USING ${TEST_VFD} ON COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
+
+set (ENV{HDF5_DRIVER} "${TEST_VFD}")
+# run the test program, capture the stdout/stderr and the result var
+EXECUTE_PROCESS (
+    COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
+    WORKING_DIRECTORY ${TEST_FOLDER}
+    OUTPUT_FILE ${TEST_OUTPUT}_${TEST_VFD}.out
+    ERROR_FILE ${TEST_OUTPUT}_${TEST_VFD}.err
+    OUTPUT_VARIABLE TEST_OUT
+    ERROR_VARIABLE TEST_ERROR
+)
+
+message (STATUS "COMMAND Result: ${TEST_RESULT}")
+
+if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err TEST_STREAM)
+  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.out "${TEST_STREAM}")
+endif (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err)
+
+# if the return value is !=${TEST_EXPECT} bail out
+if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+  message ( FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
+endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+
+# everything went fine...
+message ("Passed: The ${TEST_PROGRAM} program used vfd ${TEST_VFD}")
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CTestCustom.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CTestCustom.cmake
new file mode 100644
index 0000000..025bce4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CTestCustom.cmake
@@ -0,0 +1,16 @@
+set (CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 3000)
+ 
+set (CTEST_CUSTOM_WARNING_EXCEPTION
+    ${CTEST_CUSTOM_WARNING_EXCEPTION}
+    "note.*expected.*void.*but argument is of type.*volatile"
+    "SZIP.src.*:[ \t]*warning"
+    "jpeg.src.*:[ \t]*warning"
+    "POSIX name for this item is deprecated"
+    "disabling jobserver mode"
+    "warning.*implicit declaration of function"
+    "note: expanded from macro"
+)
+ 
+set (CTEST_CUSTOM_MEMCHECK_IGNORE
+    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
+)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CheckTypeSize.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CheckTypeSize.cmake
new file mode 100644
index 0000000..5095a27
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/CheckTypeSize.cmake
@@ -0,0 +1,50 @@
+#
+# Check if the type exists and determine size of type.  if the type
+# exists, the size will be stored to the variable.
+#
+# CHECK_TYPE_SIZE - macro which checks the size of type
+# VARIABLE - variable to store size if the type exists.
+# HAVE_${VARIABLE} - does the variable exists or not
+#
+
+MACRO (HDF_CHECK_TYPE_SIZE TYPE VARIABLE)
+  set (CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 1)
+  if ("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
+    set (MACRO_CHECK_TYPE_SIZE_FLAGS 
+        "-DCHECK_TYPE_SIZE_TYPE=\"${TYPE}\" ${CMAKE_REQUIRED_FLAGS}"
+    )
+    foreach (def HAVE_SYS_TYPES_H HAVE_STDINT_H HAVE_STDDEF_H HAVE_INTTYPES_H)
+      if ("${def}")
+        set (MACRO_CHECK_TYPE_SIZE_FLAGS "${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
+      endif ("${def}")
+    endforeach (def)
+
+    message (STATUS "Check size of ${TYPE}")
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_TYPE_SIZE_ADD_LIBRARIES 
+          "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}"
+      )
+    endif (CMAKE_REQUIRED_LIBRARIES)
+    try_run (${VARIABLE} HAVE_${VARIABLE}
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_EXT_DIR}/CheckTypeSize.c
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_TYPE_SIZE_FLAGS}
+        "${CHECK_TYPE_SIZE_ADD_LIBRARIES}"
+        OUTPUT_VARIABLE OUTPUT
+    )
+    if (HAVE_${VARIABLE})
+      message (STATUS "Check size of ${TYPE} - done")
+      file (APPEND
+          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeOutput.log 
+          "Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n"
+      )
+    else (HAVE_${VARIABLE})
+      message (STATUS "Check size of ${TYPE} - failed")
+      file (APPEND
+          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log 
+          "Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\n\n"
+      )
+    endif (HAVE_${VARIABLE})
+  endif ("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
+  set (CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS)
+ENDMACRO (HDF_CHECK_TYPE_SIZE)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/ConfigureChecks.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/ConfigureChecks.cmake
new file mode 100644
index 0000000..9589295
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/ConfigureChecks.cmake
@@ -0,0 +1,749 @@
+#-----------------------------------------------------------------------------
+# Include all the necessary files for macros
+#-----------------------------------------------------------------------------
+include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
+include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
+include (${CMAKE_ROOT}/Modules/CheckIncludeFileCXX.cmake)
+include (${CMAKE_ROOT}/Modules/CheckIncludeFiles.cmake)
+include (${CMAKE_ROOT}/Modules/CheckLibraryExists.cmake)
+include (${CMAKE_ROOT}/Modules/CheckSymbolExists.cmake)
+include (${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
+include (${CMAKE_ROOT}/Modules/CheckVariableExists.cmake)
+include (${CMAKE_ROOT}/Modules/CheckFortranFunctionExists.cmake)
+include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
+if(CMAKE_CXX_COMPILER)
+  include (${CMAKE_ROOT}/Modules/TestForSTDNamespace.cmake)
+endif(CMAKE_CXX_COMPILER)
+
+#-----------------------------------------------------------------------------
+# APPLE/Darwin setup
+#-----------------------------------------------------------------------------
+if (APPLE)
+  list (LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LENGTH)
+  if (ARCH_LENGTH GREATER 1)
+    set (CMAKE_OSX_ARCHITECTURES "" CACHE STRING "" FORCE)
+    message(FATAL_ERROR "Building Universal Binaries on OS X is NOT supported by the HDF5 project. This is"
+    "due to technical reasons. The best approach would be build each architecture in separate directories"
+    "and use the 'lipo' tool to combine them into a single executable or library. The 'CMAKE_OSX_ARCHITECTURES'"
+    "variable has been set to a blank value which will build the default architecture for this system.")
+  endif ()
+  set (${HDF_PREFIX}_AC_APPLE_UNIVERSAL_BUILD 0)
+endif (APPLE)
+
+# Check for Darwin (not just Apple - we also want to catch OpenDarwin)
+if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+    set (${HDF_PREFIX}_HAVE_DARWIN 1)
+endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+
+# Check for Solaris
+if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    set (${HDF_PREFIX}_HAVE_SOLARIS 1)
+endif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+
+#-----------------------------------------------------------------------------
+# This MACRO checks IF the symbol exists in the library and IF it
+# does, it appends library to the list.
+#-----------------------------------------------------------------------------
+set (LINK_LIBS "")
+MACRO (CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE)
+  CHECK_LIBRARY_EXISTS ("${LIBRARY};${LINK_LIBS}" ${SYMBOL} "" ${VARIABLE})
+  if (${VARIABLE})
+    set (LINK_LIBS ${LINK_LIBS} ${LIBRARY})
+  endif (${VARIABLE})
+ENDMACRO (CHECK_LIBRARY_EXISTS_CONCAT)
+
+# ----------------------------------------------------------------------
+# WINDOWS Hard code Values
+# ----------------------------------------------------------------------
+
+set (WINDOWS)
+if (WIN32)
+  if (MINGW)
+    set (${HDF_PREFIX}_HAVE_MINGW 1)
+    set (WINDOWS 1) # MinGW tries to imitate Windows
+    set (CMAKE_REQUIRED_FLAGS "-DWIN32_LEAN_AND_MEAN=1 -DNOGDI=1")
+  endif (MINGW)
+  set (${HDF_PREFIX}_HAVE_WIN32_API 1)
+  set (CMAKE_REQUIRED_LIBRARIES "ws2_32.lib;wsock32.lib")
+  if (NOT UNIX AND NOT MINGW)
+    set (WINDOWS 1)
+    set (CMAKE_REQUIRED_FLAGS "/DWIN32_LEAN_AND_MEAN=1 /DNOGDI=1")
+    if (MSVC)
+      set (${HDF_PREFIX}_HAVE_VISUAL_STUDIO 1)
+    endif (MSVC)
+  endif (NOT UNIX AND NOT MINGW)
+endif (WIN32)
+
+if (WINDOWS)
+  set (${HDF_PREFIX}_HAVE_STDDEF_H 1)
+  set (${HDF_PREFIX}_HAVE_SYS_STAT_H 1)
+  set (${HDF_PREFIX}_HAVE_SYS_TYPES_H 1)
+  set (${HDF_PREFIX}_HAVE_LIBM 1)
+  set (${HDF_PREFIX}_HAVE_STRDUP 1)
+  set (${HDF_PREFIX}_HAVE_SYSTEM 1)
+  set (${HDF_PREFIX}_HAVE_LONGJMP 1)
+  if (NOT MINGW)
+    set (${HDF_PREFIX}_HAVE_GETHOSTNAME 1)
+  endif (NOT MINGW)
+  if (NOT UNIX AND NOT CYGWIN AND NOT MINGW)
+    set (${HDF_PREFIX}_HAVE_GETCONSOLESCREENBUFFERINFO 1)
+  endif (NOT UNIX AND NOT CYGWIN AND NOT MINGW)
+  set (${HDF_PREFIX}_HAVE_FUNCTION 1)
+  set (${HDF_PREFIX}_GETTIMEOFDAY_GIVES_TZ 1)
+  set (${HDF_PREFIX}_HAVE_TIMEZONE 1)
+  set (${HDF_PREFIX}_HAVE_GETTIMEOFDAY 1)
+  if (MINGW)
+    set (${HDF_PREFIX}_HAVE_WINSOCK2_H 1)
+  endif (MINGW)
+  set (${HDF_PREFIX}_HAVE_LIBWS2_32 1)
+  set (${HDF_PREFIX}_HAVE_LIBWSOCK32 1)
+endif (WINDOWS)
+
+# ----------------------------------------------------------------------
+# END of WINDOWS Hard code Values
+# ----------------------------------------------------------------------
+
+if (CYGWIN)
+  set (${HDF_PREFIX}_HAVE_LSEEK64 0)
+endif (CYGWIN)
+
+#-----------------------------------------------------------------------------
+#  Check for the math library "m"
+#-----------------------------------------------------------------------------
+if (NOT WINDOWS)
+  CHECK_LIBRARY_EXISTS_CONCAT ("m" ceil     ${HDF_PREFIX}_HAVE_LIBM)
+  CHECK_LIBRARY_EXISTS_CONCAT ("dl" dlopen     ${HDF_PREFIX}_HAVE_LIBDL)
+  CHECK_LIBRARY_EXISTS_CONCAT ("ws2_32" WSAStartup  ${HDF_PREFIX}_HAVE_LIBWS2_32)
+  CHECK_LIBRARY_EXISTS_CONCAT ("wsock32" gethostbyname ${HDF_PREFIX}_HAVE_LIBWSOCK32)
+endif (NOT WINDOWS)
+
+# UCB (BSD) compatibility library
+CHECK_LIBRARY_EXISTS_CONCAT ("ucb"    gethostname  ${HDF_PREFIX}_HAVE_LIBUCB)
+
+# For other tests to use the same libraries
+set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LINK_LIBS})
+
+set (USE_INCLUDES "")
+if (WINDOWS)
+  set (USE_INCLUDES ${USE_INCLUDES} "windows.h")
+endif (WINDOWS)
+
+if (NOT WINDOWS)
+  TEST_BIG_ENDIAN (${HDF_PREFIX}_WORDS_BIGENDIAN)
+endif (NOT WINDOWS)
+
+# For other specific tests, use this MACRO.
+MACRO (HDF_FUNCTION_TEST OTHER_TEST)
+  if ("${HDF_PREFIX}_${OTHER_TEST}" MATCHES "^${HDF_PREFIX}_${OTHER_TEST}$")
+    set (MACRO_CHECK_FUNCTION_DEFINITIONS "-D${OTHER_TEST} ${CMAKE_REQUIRED_FLAGS}")
+    set (OTHER_TEST_ADD_LIBRARIES)
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (OTHER_TEST_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    endif (CMAKE_REQUIRED_LIBRARIES)
+
+    foreach (def
+        HAVE_SYS_TIME_H
+        HAVE_UNISTD_H
+        HAVE_SYS_TYPES_H
+        HAVE_SYS_SOCKET_H
+    )
+      if ("${${HDF_PREFIX}_${def}}")
+        set (MACRO_CHECK_FUNCTION_DEFINITIONS "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D${def}")
+      endif ("${${HDF_PREFIX}_${def}}")
+    endforeach (def)
+
+    if (LARGEFILE)
+      set (MACRO_CHECK_FUNCTION_DEFINITIONS
+          "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
+      )
+    endif (LARGEFILE)
+
+    #message (STATUS "Performing ${OTHER_TEST}")
+    TRY_COMPILE (${OTHER_TEST}
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+        "${OTHER_TEST_ADD_LIBRARIES}"
+        OUTPUT_VARIABLE OUTPUT
+    )
+    if (${OTHER_TEST})
+      set (${HDF_PREFIX}_${OTHER_TEST} 1 CACHE INTERNAL "Other test ${FUNCTION}")
+      message (STATUS "Performing Other Test ${OTHER_TEST} - Success")
+    else (${OTHER_TEST})
+      message (STATUS "Performing Other Test ${OTHER_TEST} - Failed")
+      set (${HDF_PREFIX}_${OTHER_TEST} "" CACHE INTERNAL "Other test ${FUNCTION}")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+          "Performing Other Test ${OTHER_TEST} failed with the following output:\n"
+          "${OUTPUT}\n"
+      )
+    endif (${OTHER_TEST})
+  endif ("${HDF_PREFIX}_${OTHER_TEST}" MATCHES "^${HDF_PREFIX}_${OTHER_TEST}$")
+ENDMACRO (HDF_FUNCTION_TEST)
+
+#-----------------------------------------------------------------------------
+# Check for these functions before the time headers are checked
+#-----------------------------------------------------------------------------
+HDF_FUNCTION_TEST (STDC_HEADERS)
+
+#-----------------------------------------------------------------------------
+# Check IF header file exists and add it to the list.
+#-----------------------------------------------------------------------------
+MACRO (CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE)
+  CHECK_INCLUDE_FILES ("${USE_INCLUDES};${FILE}" ${VARIABLE})
+  if (${VARIABLE})
+    set (USE_INCLUDES ${USE_INCLUDES} ${FILE})
+  endif (${VARIABLE})
+ENDMACRO (CHECK_INCLUDE_FILE_CONCAT)
+
+#-----------------------------------------------------------------------------
+#  Check for the existence of certain header files
+#-----------------------------------------------------------------------------
+CHECK_INCLUDE_FILE_CONCAT ("sys/resource.h"  ${HDF_PREFIX}_HAVE_SYS_RESOURCE_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/time.h"      ${HDF_PREFIX}_HAVE_SYS_TIME_H)
+CHECK_INCLUDE_FILE_CONCAT ("unistd.h"        ${HDF_PREFIX}_HAVE_UNISTD_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/ioctl.h"     ${HDF_PREFIX}_HAVE_SYS_IOCTL_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/stat.h"      ${HDF_PREFIX}_HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/socket.h"    ${HDF_PREFIX}_HAVE_SYS_SOCKET_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/types.h"     ${HDF_PREFIX}_HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILE_CONCAT ("stddef.h"        ${HDF_PREFIX}_HAVE_STDDEF_H)
+CHECK_INCLUDE_FILE_CONCAT ("setjmp.h"        ${HDF_PREFIX}_HAVE_SETJMP_H)
+CHECK_INCLUDE_FILE_CONCAT ("features.h"      ${HDF_PREFIX}_HAVE_FEATURES_H)
+CHECK_INCLUDE_FILE_CONCAT ("dirent.h"        ${HDF_PREFIX}_HAVE_DIRENT_H)
+CHECK_INCLUDE_FILE_CONCAT ("stdint.h"        ${HDF_PREFIX}_HAVE_STDINT_H)
+
+# IF the c compiler found stdint, check the C++ as well. On some systems this
+# file will be found by C but not C++, only do this test IF the C++ compiler
+# has been initialized (e.g. the project also includes some c++)
+if (${HDF_PREFIX}_HAVE_STDINT_H AND CMAKE_CXX_COMPILER_LOADED)
+  CHECK_INCLUDE_FILE_CXX ("stdint.h" ${HDF_PREFIX}_HAVE_STDINT_H_CXX)
+  if (NOT ${HDF_PREFIX}_HAVE_STDINT_H_CXX)
+    set (${HDF_PREFIX}_HAVE_STDINT_H "" CACHE INTERNAL "Have includes HAVE_STDINT_H")
+    set (USE_INCLUDES ${USE_INCLUDES} "stdint.h")
+  endif (NOT ${HDF_PREFIX}_HAVE_STDINT_H_CXX)
+endif (${HDF_PREFIX}_HAVE_STDINT_H AND CMAKE_CXX_COMPILER_LOADED)
+
+# Darwin
+CHECK_INCLUDE_FILE_CONCAT ("mach/mach_time.h" ${HDF_PREFIX}_HAVE_MACH_MACH_TIME_H)
+
+# Windows
+CHECK_INCLUDE_FILE_CONCAT ("io.h"            ${HDF_PREFIX}_HAVE_IO_H)
+if (NOT CYGWIN)
+  CHECK_INCLUDE_FILE_CONCAT ("winsock2.h"      ${HDF_PREFIX}_HAVE_WINSOCK2_H)
+endif (NOT CYGWIN)
+CHECK_INCLUDE_FILE_CONCAT ("sys/timeb.h"     ${HDF_PREFIX}_HAVE_SYS_TIMEB_H)
+
+if (CMAKE_SYSTEM_NAME MATCHES "OSF")
+  CHECK_INCLUDE_FILE_CONCAT ("sys/sysinfo.h" ${HDF_PREFIX}_HAVE_SYS_SYSINFO_H)
+  CHECK_INCLUDE_FILE_CONCAT ("sys/proc.h"    ${HDF_PREFIX}_HAVE_SYS_PROC_H)
+else (CMAKE_SYSTEM_NAME MATCHES "OSF")
+  set (${HDF_PREFIX}_HAVE_SYS_SYSINFO_H "" CACHE INTERNAL "" FORCE)
+  set (${HDF_PREFIX}_HAVE_SYS_PROC_H    "" CACHE INTERNAL "" FORCE)
+endif (CMAKE_SYSTEM_NAME MATCHES "OSF")
+
+CHECK_INCLUDE_FILE_CONCAT ("globus/common.h" ${HDF_PREFIX}_HAVE_GLOBUS_COMMON_H)
+CHECK_INCLUDE_FILE_CONCAT ("pdb.h"           ${HDF_PREFIX}_HAVE_PDB_H)
+CHECK_INCLUDE_FILE_CONCAT ("pthread.h"       ${HDF_PREFIX}_HAVE_PTHREAD_H)
+CHECK_INCLUDE_FILE_CONCAT ("srbclient.h"     ${HDF_PREFIX}_HAVE_SRBCLIENT_H)
+CHECK_INCLUDE_FILE_CONCAT ("string.h"        ${HDF_PREFIX}_HAVE_STRING_H)
+CHECK_INCLUDE_FILE_CONCAT ("strings.h"       ${HDF_PREFIX}_HAVE_STRINGS_H)
+CHECK_INCLUDE_FILE_CONCAT ("stdlib.h"        ${HDF_PREFIX}_HAVE_STDLIB_H)
+CHECK_INCLUDE_FILE_CONCAT ("memory.h"        ${HDF_PREFIX}_HAVE_MEMORY_H)
+CHECK_INCLUDE_FILE_CONCAT ("dlfcn.h"         ${HDF_PREFIX}_HAVE_DLFCN_H)
+CHECK_INCLUDE_FILE_CONCAT ("inttypes.h"      ${HDF_PREFIX}_HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILE_CONCAT ("netinet/in.h"    ${HDF_PREFIX}_HAVE_NETINET_IN_H)
+
+#-----------------------------------------------------------------------------
+#  Check for large file support
+#-----------------------------------------------------------------------------
+
+# The linux-lfs option is deprecated.
+set (LINUX_LFS 0)
+
+set (HDF_EXTRA_C_FLAGS)
+set (HDF_EXTRA_FLAGS)
+if (NOT WINDOWS)
+  # Might want to check explicitly for Linux and possibly Cygwin
+  # instead of checking for not Solaris or Darwin.
+  if (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN)
+  # Linux Specific flags
+  # This was originally defined as _POSIX_SOURCE which was updated to
+  # _POSIX_C_SOURCE=199506L to expose a greater amount of POSIX
+  # functionality so clock_gettime and CLOCK_MONOTONIC are defined
+  # correctly. This was later updated to 200112L so that
+  # posix_memalign() is visible for the direct VFD code on Linux
+  # systems.
+  # POSIX feature information can be found in the gcc manual at:
+  # http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
+  set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200112L)
+
+  # Need to add this so that O_DIRECT is visible for the direct
+  # VFD on Linux systems.
+  set (HDF_EXTRA_C_FLAGS -D_GNU_SOURCE)
+
+  option (HDF_ENABLE_LARGE_FILE "Enable support for large (64-bit) files on Linux." ON)
+  if (HDF_ENABLE_LARGE_FILE)
+    set (msg "Performing TEST_LFS_WORKS")
+    TRY_RUN (TEST_LFS_WORKS_RUN   TEST_LFS_WORKS_COMPILE
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-DTEST_LFS_WORKS
+        OUTPUT_VARIABLE OUTPUT
+    )
+
+    # The LARGEFILE definitions were from the transition period
+    # and are probably no longer needed. The FILE_OFFSET_BITS
+    # check should be generalized for all POSIX systems as it
+    # is in the Autotools.
+    if (TEST_LFS_WORKS_COMPILE)
+      if (TEST_LFS_WORKS_RUN  MATCHES 0)
+        set (TEST_LFS_WORKS 1 CACHE INTERNAL ${msg})
+        set (LARGEFILE 1)
+        set (HDF_EXTRA_FLAGS ${HDF_EXTRA_FLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE)
+        message (STATUS "${msg}... yes")
+      else (TEST_LFS_WORKS_RUN  MATCHES 0)
+        set (TEST_LFS_WORKS "" CACHE INTERNAL ${msg})
+        message (STATUS "${msg}... no")
+        file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+              "Test TEST_LFS_WORKS Run failed with the following output and exit code:\n ${OUTPUT}\n"
+        )
+      endif (TEST_LFS_WORKS_RUN  MATCHES 0)
+    else (TEST_LFS_WORKS_COMPILE )
+      set (TEST_LFS_WORKS "" CACHE INTERNAL ${msg})
+      message (STATUS "${msg}... no")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+          "Test TEST_LFS_WORKS Compile failed with the following output:\n ${OUTPUT}\n"
+      )
+    endif (TEST_LFS_WORKS_COMPILE)
+  endif (HDF_ENABLE_LARGE_FILE)
+  set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${HDF_EXTRA_FLAGS})
+  endif (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN)
+endif (NOT WINDOWS)
+
+add_definitions (${HDF_EXTRA_FLAGS})
+
+#-----------------------------------------------------------------------------
+# Check for HAVE_OFF64_T functionality
+#-----------------------------------------------------------------------------
+if (NOT WINDOWS OR MINGW)
+  HDF_FUNCTION_TEST (HAVE_OFF64_T)
+  if (${HDF_PREFIX}_HAVE_OFF64_T)
+    CHECK_FUNCTION_EXISTS (lseek64            ${HDF_PREFIX}_HAVE_LSEEK64)
+    CHECK_FUNCTION_EXISTS (fseeko64           ${HDF_PREFIX}_HAVE_FSEEKO64)
+    CHECK_FUNCTION_EXISTS (ftello64           ${HDF_PREFIX}_HAVE_FTELLO64)
+    CHECK_FUNCTION_EXISTS (ftruncate64        ${HDF_PREFIX}_HAVE_FTRUNCATE64)
+  endif (${HDF_PREFIX}_HAVE_OFF64_T)
+
+  CHECK_FUNCTION_EXISTS (fseeko               ${HDF_PREFIX}_HAVE_FSEEKO)
+  CHECK_FUNCTION_EXISTS (ftello               ${HDF_PREFIX}_HAVE_FTELLO)
+
+  HDF_FUNCTION_TEST (HAVE_STAT64_STRUCT)
+  if (HAVE_STAT64_STRUCT)
+    CHECK_FUNCTION_EXISTS (fstat64            ${HDF_PREFIX}_HAVE_FSTAT64)
+    CHECK_FUNCTION_EXISTS (stat64             ${HDF_PREFIX}_HAVE_STAT64)
+  endif (HAVE_STAT64_STRUCT)
+endif (NOT WINDOWS OR MINGW)
+
+#-----------------------------------------------------------------------------
+#  Check the size in bytes of all the int and float types
+#-----------------------------------------------------------------------------
+MACRO (HDF_CHECK_TYPE_SIZE type var)
+  set (aType ${type})
+  set (aVar  ${var})
+#  message (STATUS "Checking size of ${aType} and storing into ${aVar}")
+  CHECK_TYPE_SIZE (${aType}   ${aVar})
+  if (NOT ${aVar})
+    set (${aVar} 0 CACHE INTERNAL "SizeOf for ${aType}")
+#    message (STATUS "Size of ${aType} was NOT Found")
+  endif (NOT ${aVar})
+ENDMACRO (HDF_CHECK_TYPE_SIZE)
+
+HDF_CHECK_TYPE_SIZE (char           ${HDF_PREFIX}_SIZEOF_CHAR)
+HDF_CHECK_TYPE_SIZE (short          ${HDF_PREFIX}_SIZEOF_SHORT)
+HDF_CHECK_TYPE_SIZE (int            ${HDF_PREFIX}_SIZEOF_INT)
+HDF_CHECK_TYPE_SIZE (unsigned       ${HDF_PREFIX}_SIZEOF_UNSIGNED)
+if (NOT APPLE)
+  HDF_CHECK_TYPE_SIZE (long         ${HDF_PREFIX}_SIZEOF_LONG)
+endif (NOT APPLE)
+HDF_CHECK_TYPE_SIZE ("long long"    ${HDF_PREFIX}_SIZEOF_LONG_LONG)
+HDF_CHECK_TYPE_SIZE (__int64        ${HDF_PREFIX}_SIZEOF___INT64)
+if (NOT ${HDF_PREFIX}_SIZEOF___INT64)
+  set (${HDF_PREFIX}_SIZEOF___INT64 0)
+endif (NOT ${HDF_PREFIX}_SIZEOF___INT64)
+
+HDF_CHECK_TYPE_SIZE (float          ${HDF_PREFIX}_SIZEOF_FLOAT)
+HDF_CHECK_TYPE_SIZE (double         ${HDF_PREFIX}_SIZEOF_DOUBLE)
+HDF_CHECK_TYPE_SIZE ("long double"  ${HDF_PREFIX}_SIZEOF_LONG_DOUBLE)
+
+HDF_CHECK_TYPE_SIZE (int8_t         ${HDF_PREFIX}_SIZEOF_INT8_T)
+HDF_CHECK_TYPE_SIZE (uint8_t        ${HDF_PREFIX}_SIZEOF_UINT8_T)
+HDF_CHECK_TYPE_SIZE (int_least8_t   ${HDF_PREFIX}_SIZEOF_INT_LEAST8_T)
+HDF_CHECK_TYPE_SIZE (uint_least8_t  ${HDF_PREFIX}_SIZEOF_UINT_LEAST8_T)
+HDF_CHECK_TYPE_SIZE (int_fast8_t    ${HDF_PREFIX}_SIZEOF_INT_FAST8_T)
+HDF_CHECK_TYPE_SIZE (uint_fast8_t   ${HDF_PREFIX}_SIZEOF_UINT_FAST8_T)
+
+HDF_CHECK_TYPE_SIZE (int16_t        ${HDF_PREFIX}_SIZEOF_INT16_T)
+HDF_CHECK_TYPE_SIZE (uint16_t       ${HDF_PREFIX}_SIZEOF_UINT16_T)
+HDF_CHECK_TYPE_SIZE (int_least16_t  ${HDF_PREFIX}_SIZEOF_INT_LEAST16_T)
+HDF_CHECK_TYPE_SIZE (uint_least16_t ${HDF_PREFIX}_SIZEOF_UINT_LEAST16_T)
+HDF_CHECK_TYPE_SIZE (int_fast16_t   ${HDF_PREFIX}_SIZEOF_INT_FAST16_T)
+HDF_CHECK_TYPE_SIZE (uint_fast16_t  ${HDF_PREFIX}_SIZEOF_UINT_FAST16_T)
+
+HDF_CHECK_TYPE_SIZE (int32_t        ${HDF_PREFIX}_SIZEOF_INT32_T)
+HDF_CHECK_TYPE_SIZE (uint32_t       ${HDF_PREFIX}_SIZEOF_UINT32_T)
+HDF_CHECK_TYPE_SIZE (int_least32_t  ${HDF_PREFIX}_SIZEOF_INT_LEAST32_T)
+HDF_CHECK_TYPE_SIZE (uint_least32_t ${HDF_PREFIX}_SIZEOF_UINT_LEAST32_T)
+HDF_CHECK_TYPE_SIZE (int_fast32_t   ${HDF_PREFIX}_SIZEOF_INT_FAST32_T)
+HDF_CHECK_TYPE_SIZE (uint_fast32_t  ${HDF_PREFIX}_SIZEOF_UINT_FAST32_T)
+
+HDF_CHECK_TYPE_SIZE (int64_t        ${HDF_PREFIX}_SIZEOF_INT64_T)
+HDF_CHECK_TYPE_SIZE (uint64_t       ${HDF_PREFIX}_SIZEOF_UINT64_T)
+HDF_CHECK_TYPE_SIZE (int_least64_t  ${HDF_PREFIX}_SIZEOF_INT_LEAST64_T)
+HDF_CHECK_TYPE_SIZE (uint_least64_t ${HDF_PREFIX}_SIZEOF_UINT_LEAST64_T)
+HDF_CHECK_TYPE_SIZE (int_fast64_t   ${HDF_PREFIX}_SIZEOF_INT_FAST64_T)
+HDF_CHECK_TYPE_SIZE (uint_fast64_t  ${HDF_PREFIX}_SIZEOF_UINT_FAST64_T)
+
+if (NOT APPLE)
+  HDF_CHECK_TYPE_SIZE (size_t       ${HDF_PREFIX}_SIZEOF_SIZE_T)
+  HDF_CHECK_TYPE_SIZE (ssize_t      ${HDF_PREFIX}_SIZEOF_SSIZE_T)
+  if (NOT ${HDF_PREFIX}_SIZEOF_SSIZE_T)
+    set (${HDF_PREFIX}_SIZEOF_SSIZE_T 0)
+  endif (NOT ${HDF_PREFIX}_SIZEOF_SSIZE_T)
+  if (NOT WINDOWS)
+    HDF_CHECK_TYPE_SIZE (ptrdiff_t    ${HDF_PREFIX}_SIZEOF_PTRDIFF_T)
+  endif (NOT WINDOWS)
+endif (NOT APPLE)
+
+HDF_CHECK_TYPE_SIZE (off_t          ${HDF_PREFIX}_SIZEOF_OFF_T)
+HDF_CHECK_TYPE_SIZE (off64_t        ${HDF_PREFIX}_SIZEOF_OFF64_T)
+if (NOT ${HDF_PREFIX}_SIZEOF_OFF64_T)
+  set (${HDF_PREFIX}_SIZEOF_OFF64_T 0)
+endif (NOT ${HDF_PREFIX}_SIZEOF_OFF64_T)
+
+#-----------------------------------------------------------------------------
+# Extra C99 types
+#-----------------------------------------------------------------------------
+
+# _Bool type support
+CHECK_INCLUDE_FILE_CONCAT (stdbool.h    ${HDF_PREFIX}_HAVE_STDBOOL_H)
+if (HAVE_STDBOOL_H)
+  set (CMAKE_EXTRA_INCLUDE_FILES stdbool.h)
+  HDF_CHECK_TYPE_SIZE (bool         ${HDF_PREFIX}_SIZEOF_BOOL)
+else (HAVE_STDBOOL_H)
+  HDF_CHECK_TYPE_SIZE (_Bool        ${HDF_PREFIX}_SIZEOF_BOOL)
+endif (HAVE_STDBOOL_H)
+
+if (NOT WINDOWS)
+  #-----------------------------------------------------------------------------
+  # Check if the dev_t type is a scalar type
+  #-----------------------------------------------------------------------------
+  HDF_FUNCTION_TEST (DEV_T_IS_SCALAR)
+
+  # ----------------------------------------------------------------------
+  # Check for MONOTONIC_TIMER support (used in clock_gettime).  This has
+  # to be done after any POSIX/BSD defines to ensure that the test gets
+  # the correct POSIX level on linux.
+  CHECK_VARIABLE_EXISTS (CLOCK_MONOTONIC HAVE_CLOCK_MONOTONIC)
+
+  #-----------------------------------------------------------------------------
+  # Check a bunch of time functions
+  #-----------------------------------------------------------------------------
+  CHECK_FUNCTION_EXISTS (gettimeofday      ${HDF_PREFIX}_HAVE_GETTIMEOFDAY)
+  foreach (test
+      HAVE_TM_GMTOFF
+      HAVE___TM_GMTOFF
+#      HAVE_TIMEZONE
+      HAVE_STRUCT_TIMEZONE
+      GETTIMEOFDAY_GIVES_TZ
+      TIME_WITH_SYS_TIME
+      HAVE_TM_ZONE
+      HAVE_STRUCT_TM_TM_ZONE
+  )
+    HDF_FUNCTION_TEST (${test})
+  endforeach (test)
+  if (NOT CYGWIN AND NOT MINGW)
+      HDF_FUNCTION_TEST (HAVE_TIMEZONE)
+#      HDF_FUNCTION_TEST (HAVE_STAT_ST_BLOCKS)
+  endif (NOT CYGWIN AND NOT MINGW)
+
+  # ----------------------------------------------------------------------
+  # Does the struct stat have the st_blocks field?  This field is not Posix.
+  #
+  HDF_FUNCTION_TEST (HAVE_STAT_ST_BLOCKS)
+
+  # ----------------------------------------------------------------------
+  # How do we figure out the width of a tty in characters?
+  #
+  CHECK_FUNCTION_EXISTS (ioctl             ${HDF_PREFIX}_HAVE_IOCTL)
+  HDF_FUNCTION_TEST (HAVE_STRUCT_VIDEOCONFIG)
+  HDF_FUNCTION_TEST (HAVE_STRUCT_TEXT_INFO)
+  CHECK_FUNCTION_EXISTS (_getvideoconfig   ${HDF_PREFIX}_HAVE__GETVIDEOCONFIG)
+  CHECK_FUNCTION_EXISTS (gettextinfo       ${HDF_PREFIX}_HAVE_GETTEXTINFO)
+  CHECK_FUNCTION_EXISTS (_scrsize          ${HDF_PREFIX}_HAVE__SCRSIZE)
+  if (NOT CYGWIN AND NOT MINGW)
+    CHECK_FUNCTION_EXISTS (GetConsoleScreenBufferInfo    ${HDF_PREFIX}_HAVE_GETCONSOLESCREENBUFFERINFO)
+  endif (NOT CYGWIN AND NOT MINGW)
+  CHECK_SYMBOL_EXISTS (TIOCGWINSZ "sys/ioctl.h" ${HDF_PREFIX}_HAVE_TIOCGWINSZ)
+  CHECK_SYMBOL_EXISTS (TIOCGETD   "sys/ioctl.h" ${HDF_PREFIX}_HAVE_TIOCGETD)
+
+  # ----------------------------------------------------------------------
+  # cygwin user credentials are different then on linux
+  #
+  if (NOT CYGWIN AND NOT MINGW)
+    CHECK_FUNCTION_EXISTS (getpwuid        ${HDF_PREFIX}_HAVE_GETPWUID)
+  endif (NOT CYGWIN AND NOT MINGW)
+endif (NOT WINDOWS)
+
+#-----------------------------------------------------------------------------
+# Check for some functions that are used
+#
+CHECK_FUNCTION_EXISTS (alarm             ${HDF_PREFIX}_HAVE_ALARM)
+CHECK_FUNCTION_EXISTS (fork              ${HDF_PREFIX}_HAVE_FORK)
+CHECK_FUNCTION_EXISTS (frexpf            ${HDF_PREFIX}_HAVE_FREXPF)
+CHECK_FUNCTION_EXISTS (frexpl            ${HDF_PREFIX}_HAVE_FREXPL)
+
+CHECK_FUNCTION_EXISTS (gethostname       ${HDF_PREFIX}_HAVE_GETHOSTNAME)
+CHECK_FUNCTION_EXISTS (getrusage         ${HDF_PREFIX}_HAVE_GETRUSAGE)
+CHECK_FUNCTION_EXISTS (lstat             ${HDF_PREFIX}_HAVE_LSTAT)
+
+CHECK_FUNCTION_EXISTS (rand_r            ${HDF_PREFIX}_HAVE_RAND_R)
+CHECK_FUNCTION_EXISTS (random            ${HDF_PREFIX}_HAVE_RANDOM)
+CHECK_FUNCTION_EXISTS (setsysinfo        ${HDF_PREFIX}_HAVE_SETSYSINFO)
+
+CHECK_FUNCTION_EXISTS (signal            ${HDF_PREFIX}_HAVE_SIGNAL)
+CHECK_FUNCTION_EXISTS (longjmp           ${HDF_PREFIX}_HAVE_LONGJMP)
+CHECK_FUNCTION_EXISTS (setjmp            ${HDF_PREFIX}_HAVE_SETJMP)
+CHECK_FUNCTION_EXISTS (siglongjmp        ${HDF_PREFIX}_HAVE_SIGLONGJMP)
+CHECK_FUNCTION_EXISTS (sigsetjmp         ${HDF_PREFIX}_HAVE_SIGSETJMP)
+CHECK_FUNCTION_EXISTS (sigprocmask       ${HDF_PREFIX}_HAVE_SIGPROCMASK)
+
+CHECK_FUNCTION_EXISTS (snprintf          ${HDF_PREFIX}_HAVE_SNPRINTF)
+CHECK_FUNCTION_EXISTS (srandom           ${HDF_PREFIX}_HAVE_SRANDOM)
+CHECK_FUNCTION_EXISTS (strdup            ${HDF_PREFIX}_HAVE_STRDUP)
+CHECK_FUNCTION_EXISTS (symlink           ${HDF_PREFIX}_HAVE_SYMLINK)
+CHECK_FUNCTION_EXISTS (system            ${HDF_PREFIX}_HAVE_SYSTEM)
+
+CHECK_FUNCTION_EXISTS (tmpfile           ${HDF_PREFIX}_HAVE_TMPFILE)
+CHECK_FUNCTION_EXISTS (asprintf          ${HDF_PREFIX}_HAVE_ASPRINTF)
+CHECK_FUNCTION_EXISTS (vasprintf         ${HDF_PREFIX}_HAVE_VASPRINTF)
+CHECK_FUNCTION_EXISTS (waitpid           ${HDF_PREFIX}_HAVE_WAITPID)
+
+CHECK_FUNCTION_EXISTS (vsnprintf         ${HDF_PREFIX}_HAVE_VSNPRINTF)
+if (NOT WINDOWS)
+  if (${HDF_PREFIX}_HAVE_VSNPRINTF)
+    HDF_FUNCTION_TEST (VSNPRINTF_WORKS)
+  endif (${HDF_PREFIX}_HAVE_VSNPRINTF)
+endif (NOT WINDOWS)
+
+#-----------------------------------------------------------------------------
+# sigsetjmp is special; may actually be a macro
+#-----------------------------------------------------------------------------
+if (NOT ${HDF_PREFIX}_HAVE_SIGSETJMP)
+  if (${HDF_PREFIX}_HAVE_SETJMP_H)
+    CHECK_SYMBOL_EXISTS (sigsetjmp "setjmp.h" ${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
+    if (${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
+      set (${HDF_PREFIX}_HAVE_SIGSETJMP 1)
+    endif (${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
+  endif (${HDF_PREFIX}_HAVE_SETJMP_H)
+endif (NOT ${HDF_PREFIX}_HAVE_SIGSETJMP)
+
+#-----------------------------------------------------------------------------
+# Check a bunch of other functions
+#-----------------------------------------------------------------------------
+if (NOT WINDOWS)
+  foreach (test
+      HAVE_ATTRIBUTE
+      HAVE_C99_FUNC
+#      STDC_HEADERS
+      HAVE_FUNCTION
+      HAVE_C99_DESIGNATED_INITIALIZER
+      SYSTEM_SCOPE_THREADS
+      HAVE_SOCKLEN_T
+      CXX_HAVE_OFFSETOF
+  )
+    HDF_FUNCTION_TEST (${test})
+  endforeach (test)
+endif (NOT WINDOWS)
+
+# For other CXX specific tests, use this MACRO.
+MACRO (HDF_CXX_FUNCTION_TEST OTHER_TEST)
+  if ("${OTHER_TEST}" MATCHES "^${OTHER_TEST}$")
+    set (MACRO_CHECK_FUNCTION_DEFINITIONS "-D${OTHER_TEST} ${CMAKE_REQUIRED_FLAGS}")
+    set (OTHER_TEST_ADD_LIBRARIES)
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (OTHER_TEST_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    endif (CMAKE_REQUIRED_LIBRARIES)
+
+    foreach (def
+        HAVE_SYS_TIME_H
+        HAVE_UNISTD_H
+        HAVE_SYS_TYPES_H
+        HAVE_SYS_SOCKET_H
+    )
+      if ("${${HDF_PREFIX}_${def}}")
+        set (MACRO_CHECK_FUNCTION_DEFINITIONS "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D${def}")
+      endif ("${${HDF_PREFIX}_${def}}")
+    endforeach (def)
+
+    if (LARGEFILE)
+      set (MACRO_CHECK_FUNCTION_DEFINITIONS
+          "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
+      )
+    endif (LARGEFILE)
+
+    #message (STATUS "Performing ${OTHER_TEST}")
+    TRY_COMPILE (${OTHER_TEST}
+        ${CMAKE_BINARY_DIR}
+        ${HDF_RESOURCES_EXT_DIR}/HDFCXXTests.cpp
+        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+        "${OTHER_TEST_ADD_LIBRARIES}"
+        OUTPUT_VARIABLE OUTPUT
+    )
+    if (${OTHER_TEST} EQUAL 0)
+      set (${OTHER_TEST} 1 CACHE INTERNAL "CXX test ${FUNCTION}")
+      message (STATUS "Performing CXX Test ${OTHER_TEST} - Success")
+    else (${OTHER_TEST} EQUAL 0)
+      message (STATUS "Performing CXX Test ${OTHER_TEST} - Failed")
+      set (${OTHER_TEST} "" CACHE INTERNAL "CXX test ${FUNCTION}")
+      file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+          "Performing CXX Test ${OTHER_TEST} failed with the following output:\n"
+          "${OUTPUT}\n"
+      )
+    endif (${OTHER_TEST} EQUAL 0)
+  endif ("${OTHER_TEST}" MATCHES "^${OTHER_TEST}$")
+ENDMACRO (HDF_CXX_FUNCTION_TEST)
+
+#-----------------------------------------------------------------------------
+# Check a bunch of cxx functions
+#-----------------------------------------------------------------------------
+if (CMAKE_CXX_COMPILER_LOADED)
+  foreach (test
+      OLD_HEADER_FILENAME
+      ${HDF_PREFIX}_NO_NAMESPACE
+      ${HDF_PREFIX}_NO_STD
+      BOOL_NOTDEFINED
+      NO_STATIC_CAST
+  )
+    HDF_CXX_FUNCTION_TEST (${test})
+  endforeach (test)
+endif (CMAKE_CXX_COMPILER_LOADED)
+
+#-----------------------------------------------------------------------------
+# Check if InitOnceExecuteOnce is available
+#-----------------------------------------------------------------------------
+if (WINDOWS)
+  if (NOT HDF_NO_IOEO_TEST)
+  message (STATUS "Checking for InitOnceExecuteOnce:")
+  if ("${${HDF_PREFIX}_HAVE_IOEO}" MATCHES "^${${HDF_PREFIX}_HAVE_IOEO}$")
+    if (LARGEFILE)
+      set (CMAKE_REQUIRED_DEFINITIONS
+          "${CURRENT_TEST_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
+      )
+    endif (LARGEFILE)
+    set (MACRO_CHECK_FUNCTION_DEFINITIONS
+      "-DHAVE_IOEO ${CMAKE_REQUIRED_FLAGS}")
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES
+        "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    else (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES)
+    endif (CMAKE_REQUIRED_LIBRARIES)
+    if (CMAKE_REQUIRED_INCLUDES)
+      set (CHECK_C_SOURCE_COMPILES_ADD_INCLUDES
+        "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
+    else (CMAKE_REQUIRED_INCLUDES)
+      set (CHECK_C_SOURCE_COMPILES_ADD_INCLUDES)
+    endif (CMAKE_REQUIRED_INCLUDES)
+
+    TRY_RUN(HAVE_IOEO_EXITCODE HAVE_IOEO_COMPILED
+      ${CMAKE_BINARY_DIR}
+      ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
+      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
+      -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
+      "${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}"
+      "${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}"
+      COMPILE_OUTPUT_VARIABLE OUTPUT)
+    # if it did not compile make the return value fail code of 1
+    if (NOT HAVE_IOEO_COMPILED)
+      set (HAVE_IOEO_EXITCODE 1)
+    endif (NOT HAVE_IOEO_COMPILED)
+    # if the return value was 0 then it worked
+    if ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
+      set (${HDF_PREFIX}_HAVE_IOEO 1 CACHE INTERNAL "Test InitOnceExecuteOnce")
+      message (STATUS "Performing Test InitOnceExecuteOnce - Success")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+        "Performing C SOURCE FILE Test InitOnceExecuteOnce succeded with the following output:\n"
+        "${OUTPUT}\n"
+        "Return value: ${HAVE_IOEO}\n")
+    else ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
+      if (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+        set (${HDF_PREFIX}_HAVE_IOEO "${HAVE_IOEO_EXITCODE}")
+      else (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+        set (${HDF_PREFIX}_HAVE_IOEO "" CACHE INTERNAL "Test InitOnceExecuteOnce")
+      endif (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+
+      message (STATUS "Performing Test InitOnceExecuteOnce - Failed")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+        "Performing InitOnceExecuteOnce Test  failed with the following output:\n"
+        "${OUTPUT}\n"
+        "Return value: ${HAVE_IOEO_EXITCODE}\n")
+    endif ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
+  endif ("${${HDF_PREFIX}_HAVE_IOEO}" MATCHES "^${${HDF_PREFIX}_HAVE_IOEO}$")
+  endif (NOT HDF_NO_IOEO_TEST)
+endif (WINDOWS)
+
+#-----------------------------------------------------------------------------
+# Determine how 'inline' is used
+#-----------------------------------------------------------------------------
+foreach (inline_test inline __inline__ __inline)
+  string (TOUPPER ${inline_test} INLINE_TEST_MACRO)
+  HDF_FUNCTION_TEST (HAVE_${INLINE_TEST_MACRO})
+endforeach (inline_test)
+
+#-----------------------------------------------------------------------------
+# Check how to print a Long Long integer
+#-----------------------------------------------------------------------------
+if (NOT ${HDF_PREFIX}_PRINTF_LL_WIDTH OR ${HDF_PREFIX}_PRINTF_LL_WIDTH MATCHES "unknown")
+  set (PRINT_LL_FOUND 0)
+  message (STATUS "Checking for appropriate format for 64 bit long:")
+  set (CURRENT_TEST_DEFINITIONS "-DPRINTF_LL_WIDTH")
+  if (${HDF_PREFIX}_SIZEOF_LONG_LONG)
+    set (CURRENT_TEST_DEFINITIONS "${CURRENT_TEST_DEFINITIONS} -DHAVE_LONG_LONG")
+  endif (${HDF_PREFIX}_SIZEOF_LONG_LONG)
+  TRY_RUN (${HDF_PREFIX}_PRINTF_LL_TEST_RUN   ${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE
+      ${CMAKE_BINARY_DIR}
+      ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
+      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CURRENT_TEST_DEFINITIONS}
+      OUTPUT_VARIABLE OUTPUT
+  )
+  if (${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE)
+    if (${HDF_PREFIX}_PRINTF_LL_TEST_RUN MATCHES 0)
+      string(REGEX REPLACE ".*PRINTF_LL_WIDTH=\\[(.*)\\].*" "\\1" ${HDF_PREFIX}_PRINTF_LL "${OUTPUT}")
+      set (${HDF_PREFIX}_PRINTF_LL_WIDTH "\"${${HDF_PREFIX}_PRINTF_LL}\"" CACHE INTERNAL "Width for printf for type `long long' or `__int64', us. `ll")
+      set (PRINT_LL_FOUND 1)
+    else (${HDF_PREFIX}_PRINTF_LL_TEST_RUN MATCHES 0)
+      message ("Width test failed with result: ${${HDF_PREFIX}_PRINTF_LL_TEST_RUN}")
+    endif (${HDF_PREFIX}_PRINTF_LL_TEST_RUN MATCHES 0)
+  else (${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE)
+    file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+        "Test ${HDF_PREFIX}_PRINTF_LL_WIDTH failed with the following output:\n ${OUTPUT}\n"
+    )
+  endif (${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE)
+
+  if (PRINT_LL_FOUND)
+    message (STATUS "Checking for appropriate format for 64 bit long: found ${${HDF_PREFIX}_PRINTF_LL_WIDTH}")
+  else (PRINT_LL_FOUND)
+    message (STATUS "Checking for appropriate format for 64 bit long: not found")
+    set (${HDF_PREFIX}_PRINTF_LL_WIDTH "\"unknown\"" CACHE INTERNAL
+        "Width for printf for type `long long' or `__int64', us. `ll"
+    )
+  endif (PRINT_LL_FOUND)
+endif (NOT ${HDF_PREFIX}_PRINTF_LL_WIDTH OR ${HDF_PREFIX}_PRINTF_LL_WIDTH MATCHES "unknown")
+
+# ----------------------------------------------------------------------
+# Set the flag to indicate that the machine can handle converting
+# denormalized floating-point values.
+# (This flag should be set for all machines, except for the Crays, where
+# the cache value is set in it's config file)
+#
+set (${HDF_PREFIX}_CONVERT_DENORMAL_FLOAT 1)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindMPI.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindMPI.cmake
new file mode 100644
index 0000000..1a02f82
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindMPI.cmake
@@ -0,0 +1,684 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
+#.rst:
+# FindMPI
+# -------
+#
+# Find a Message Passing Interface (MPI) implementation
+#
+# The Message Passing Interface (MPI) is a library used to write
+# high-performance distributed-memory parallel applications, and is
+# typically deployed on a cluster.  MPI is a standard interface (defined
+# by the MPI forum) for which many implementations are available.  All
+# of them have somewhat different include paths, libraries to link
+# against, etc., and this module tries to smooth out those differences.
+#
+# Variables
+# ^^^^^^^^^
+#
+# This module will set the following variables per language in your
+# project, where <lang> is one of C, CXX, or Fortran:
+#
+# ::
+#
+#    MPI_<lang>_FOUND           TRUE if FindMPI found MPI flags for <lang>
+#    MPI_<lang>_COMPILER        MPI Compiler wrapper for <lang>
+#    MPI_<lang>_COMPILE_FLAGS   Compilation flags for MPI programs
+#    MPI_<lang>_INCLUDE_PATH    Include path(s) for MPI header
+#    MPI_<lang>_LINK_FLAGS      Linking flags for MPI programs
+#    MPI_<lang>_LIBRARIES       All libraries to link MPI programs against
+#
+# Additionally, FindMPI sets the following variables for running MPI
+# programs from the command line:
+#
+# ::
+#
+#    MPIEXEC                    Executable for running MPI programs
+#    MPIEXEC_NUMPROC_FLAG       Flag to pass to MPIEXEC before giving
+#                               it the number of processors to run on
+#    MPIEXEC_PREFLAGS           Flags to pass to MPIEXEC directly
+#                               before the executable to run.
+#    MPIEXEC_POSTFLAGS          Flags to pass to MPIEXEC after other flags
+#
+# Usage
+# ^^^^^
+#
+# To use this module, simply call FindMPI from a CMakeLists.txt file, or
+# run ``find_package(MPI)``, then run CMake.  If you are happy with the
+# auto-detected configuration for your language, then you're done.  If
+# not, you have two options:
+#
+# ::
+#
+#    1. Set MPI_<lang>_COMPILER to the MPI wrapper (mpicc, etc.) of your
+#       choice and reconfigure.  FindMPI will attempt to determine all the
+#       necessary variables using THAT compiler's compile and link flags.
+#    2. If this fails, or if your MPI implementation does not come with
+#       a compiler wrapper, then set both MPI_<lang>_LIBRARIES and
+#       MPI_<lang>_INCLUDE_PATH.  You may also set any other variables
+#       listed above, but these two are required.  This will circumvent
+#       autodetection entirely.
+#
+# When configuration is successful, ``MPI_<lang>_COMPILER`` will be set to
+# the compiler wrapper for <lang>, if it was found.  ``MPI_<lang>_FOUND``
+# and other variables above will be set if any MPI implementation was
+# found for <lang>, regardless of whether a compiler was found.
+#
+# When using ``MPIEXEC`` to execute MPI applications, you should typically
+# use all of the ``MPIEXEC`` flags as follows:
+#
+# ::
+#
+#    ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} PROCS
+#      ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS
+#
+# where ``PROCS`` is the number of processors on which to execute the
+# program, ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to
+# pass to the MPI program.
+#
+# Backward Compatibility
+# ^^^^^^^^^^^^^^^^^^^^^^
+#
+# For backward compatibility with older versions of FindMPI, these
+# variables are set, but deprecated:
+#
+# ::
+#
+#    MPI_FOUND           MPI_COMPILER        MPI_LIBRARY
+#    MPI_COMPILE_FLAGS   MPI_INCLUDE_PATH    MPI_EXTRA_LIBRARY
+#    MPI_LINK_FLAGS      MPI_LIBRARIES
+#
+# In new projects, please use the ``MPI_<lang>_XXX`` equivalents.
+
+# include this to handle the QUIETLY and REQUIRED arguments
+include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
+include(GetPrerequisites)
+
+#
+# This part detects MPI compilers, attempting to wade through the mess of compiler names in
+# a sensible way.
+#
+# The compilers are detected in this order:
+#
+# 1. Try to find the most generic available MPI compiler, as this is usually set up by
+#    cluster admins.  e.g., if plain old mpicc is available, we'll use it and assume it's
+#    the right compiler.
+#
+# 2. If a generic mpicc is NOT found, then we attempt to find one that matches
+#    CMAKE_<lang>_COMPILER_ID. e.g. if you are using XL compilers, we'll try to find mpixlc
+#    and company, but not mpiicc.  This hopefully prevents toolchain mismatches.
+#
+# If you want to force a particular MPI compiler other than what we autodetect (e.g. if you
+# want to compile regular stuff with GNU and parallel stuff with Intel), you can always set
+# your favorite MPI_<lang>_COMPILER explicitly and this stuff will be ignored.
+#
+
+# Start out with the generic MPI compiler names, as these are most commonly used.
+set(_MPI_C_COMPILER_NAMES                  mpicc    mpcc      mpicc_r mpcc_r)
+set(_MPI_CXX_COMPILER_NAMES                mpicxx   mpiCC     mpcxx   mpCC    mpic++   mpc++
+                                           mpicxx_r mpiCC_r   mpcxx_r mpCC_r  mpic++_r mpc++_r)
+set(_MPI_Fortran_COMPILER_NAMES            mpif95   mpif95_r  mpf95   mpf95_r
+                                           mpif90   mpif90_r  mpf90   mpf90_r
+                                           mpif77   mpif77_r  mpf77   mpf77_r)
+
+# GNU compiler names
+set(_MPI_GNU_C_COMPILER_NAMES              mpigcc mpgcc mpigcc_r mpgcc_r)
+set(_MPI_GNU_CXX_COMPILER_NAMES            mpig++ mpg++ mpig++_r mpg++_r)
+set(_MPI_GNU_Fortran_COMPILER_NAMES        mpigfortran mpgfortran mpigfortran_r mpgfortran_r
+                                           mpig77 mpig77_r mpg77 mpg77_r)
+
+# Intel MPI compiler names
+set(_MPI_Intel_C_COMPILER_NAMES            mpiicc)
+set(_MPI_Intel_CXX_COMPILER_NAMES          mpiicpc  mpiicxx mpiic++ mpiiCC)
+set(_MPI_Intel_Fortran_COMPILER_NAMES      mpiifort mpiif95 mpiif90 mpiif77)
+
+# PGI compiler names
+set(_MPI_PGI_C_COMPILER_NAMES              mpipgcc mppgcc)
+set(_MPI_PGI_CXX_COMPILER_NAMES            mpipgCC mppgCC)
+set(_MPI_PGI_Fortran_COMPILER_NAMES        mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77)
+
+# XLC MPI Compiler names
+set(_MPI_XL_C_COMPILER_NAMES               mpxlc      mpxlc_r    mpixlc     mpixlc_r)
+set(_MPI_XL_CXX_COMPILER_NAMES             mpixlcxx   mpixlC     mpixlc++   mpxlcxx   mpxlc++   mpixlc++   mpxlCC
+                                           mpixlcxx_r mpixlC_r   mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r)
+set(_MPI_XL_Fortran_COMPILER_NAMES         mpixlf95   mpixlf95_r mpxlf95 mpxlf95_r
+                                           mpixlf90   mpixlf90_r mpxlf90 mpxlf90_r
+                                           mpixlf77   mpixlf77_r mpxlf77 mpxlf77_r
+                                           mpixlf     mpixlf_r   mpxlf   mpxlf_r)
+
+# append vendor-specific compilers to the list if we either don't know the compiler id,
+# or if we know it matches the regular compiler.
+foreach (lang C CXX Fortran)
+  foreach (id GNU Intel PGI XL)
+    if (NOT CMAKE_${lang}_COMPILER_ID OR CMAKE_${lang}_COMPILER_ID STREQUAL id)
+      list(APPEND _MPI_${lang}_COMPILER_NAMES ${_MPI_${id}_${lang}_COMPILER_NAMES})
+    endif()
+    unset(_MPI_${id}_${lang}_COMPILER_NAMES)    # clean up the namespace here
+  endforeach()
+endforeach()
+
+
+# Names to try for MPI exec
+set(_MPI_EXEC_NAMES                        mpiexec mpirun lamexec srun)
+
+# Grab the path to MPI from the registry if we're on windows.
+set(_MPI_PREFIX_PATH)
+if(WIN32)
+  # MSMPI
+  file(TO_CMAKE_PATH "$ENV{MSMPI_BIN}" msmpi_bin_path) # The default path ends with a '\' and doesn't mix with ';' when appending.
+  list(APPEND _MPI_PREFIX_PATH "${msmpi_bin_path}")
+  unset(msmpi_bin_path)
+  list(APPEND _MPI_PREFIX_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MPI;InstallRoot]/Bin")
+  list(APPEND _MPI_PREFIX_PATH "$ENV{MSMPI_INC}/..") # The SDK is installed separately from the runtime
+  # MPICH
+  list(APPEND _MPI_PREFIX_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/..")
+  list(APPEND _MPI_PREFIX_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]")
+  list(APPEND _MPI_PREFIX_PATH "$ENV{ProgramW6432}/MPICH2/")
+endif()
+
+# Build a list of prefixes to search for MPI.
+foreach(SystemPrefixDir ${CMAKE_SYSTEM_PREFIX_PATH})
+  foreach(MpiPackageDir ${_MPI_PREFIX_PATH})
+    if(EXISTS ${SystemPrefixDir}/${MpiPackageDir})
+      list(APPEND _MPI_PREFIX_PATH "${SystemPrefixDir}/${MpiPackageDir}")
+    endif()
+  endforeach()
+endforeach()
+
+function (_mpi_check_compiler compiler options cmdvar resvar)
+  execute_process(
+    COMMAND "${compiler}" ${options}
+    OUTPUT_VARIABLE  cmdline OUTPUT_STRIP_TRAILING_WHITESPACE
+    ERROR_VARIABLE   cmdline ERROR_STRIP_TRAILING_WHITESPACE
+    RESULT_VARIABLE  success)
+  # Intel MPI 5.0.1 will return a zero return code even when the
+  # argument to the MPI compiler wrapper is unknown.  Attempt to
+  # catch this case.
+  if(cmdline MATCHES "undefined reference" OR cmdline MATCHES "unrecognized")
+    set(success 255 )
+  endif()
+  set(${cmdvar} "${cmdline}" PARENT_SCOPE)
+  set(${resvar} "${success}" PARENT_SCOPE)
+endfunction()
+
+#
+# interrogate_mpi_compiler(lang try_libs)
+#
+# Attempts to extract compiler and linker args from an MPI compiler. The arguments set
+# by this function are:
+#
+#   MPI_<lang>_INCLUDE_PATH    MPI_<lang>_LINK_FLAGS     MPI_<lang>_FOUND
+#   MPI_<lang>_COMPILE_FLAGS   MPI_<lang>_LIBRARIES
+#
+# MPI_<lang>_COMPILER must be set beforehand to the absolute path to an MPI compiler for
+# <lang>.  Additionally, MPI_<lang>_INCLUDE_PATH and MPI_<lang>_LIBRARIES may be set
+# to skip autodetection.
+#
+# If try_libs is TRUE, this will also attempt to find plain MPI libraries in the usual
+# way.  In general, this is not as effective as interrogating the compilers, as it
+# ignores language-specific flags and libraries.  However, some MPI implementations
+# (Windows implementations) do not have compiler wrappers, so this approach must be used.
+#
+function (interrogate_mpi_compiler lang try_libs)
+  # MPI_${lang}_NO_INTERROGATE will be set to a compiler name when the *regular* compiler was
+  # discovered to be the MPI compiler.  This happens on machines like the Cray XE6 that use
+  # modules to set cc, CC, and ftn to the MPI compilers.  If the user force-sets another MPI
+  # compiler, MPI_${lang}_COMPILER won't be equal to MPI_${lang}_NO_INTERROGATE, and we'll
+  # inspect that compiler anew.  This allows users to set new compilers w/o rm'ing cache.
+  string(COMPARE NOTEQUAL "${MPI_${lang}_NO_INTERROGATE}" "${MPI_${lang}_COMPILER}" interrogate)
+
+  # If MPI is set already in the cache, don't bother with interrogating the compiler.
+  if (interrogate AND ((NOT MPI_${lang}_INCLUDE_PATH) OR (NOT MPI_${lang}_LIBRARIES)))
+    if (MPI_${lang}_COMPILER)
+      # Check whether the -showme:compile option works. This indicates that we have either OpenMPI
+      # or a newer version of LAM-MPI, and implies that -showme:link will also work.
+      _mpi_check_compiler("${MPI_${lang}_COMPILER}" "-showme:compile" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN)
+      if (MPI_COMPILER_RETURN EQUAL 0)
+        # If we appear to have -showme:compile, then we should
+        # also have -showme:link. Try it.
+        execute_process(
+          COMMAND ${MPI_${lang}_COMPILER} -showme:link
+          OUTPUT_VARIABLE  MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
+          ERROR_VARIABLE   MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
+          RESULT_VARIABLE  MPI_COMPILER_RETURN)
+
+        if (MPI_COMPILER_RETURN EQUAL 0)
+          # We probably have -showme:incdirs and -showme:libdirs as well,
+          # so grab that while we're at it.
+          execute_process(
+            COMMAND ${MPI_${lang}_COMPILER} -showme:incdirs
+            OUTPUT_VARIABLE  MPI_INCDIRS OUTPUT_STRIP_TRAILING_WHITESPACE
+            ERROR_VARIABLE   MPI_INCDIRS ERROR_STRIP_TRAILING_WHITESPACE)
+
+          execute_process(
+            COMMAND ${MPI_${lang}_COMPILER} -showme:libdirs
+            OUTPUT_VARIABLE  MPI_LIBDIRS OUTPUT_STRIP_TRAILING_WHITESPACE
+            ERROR_VARIABLE   MPI_LIBDIRS ERROR_STRIP_TRAILING_WHITESPACE)
+
+        else()
+          # reset things here if something went wrong.
+          set(MPI_COMPILE_CMDLINE)
+          set(MPI_LINK_CMDLINE)
+        endif()
+      endif ()
+
+      # Older versions of LAM-MPI have "-showme". Try to find that.
+      if (NOT MPI_COMPILER_RETURN EQUAL 0)
+        _mpi_check_compiler("${MPI_${lang}_COMPILER}" "-showme" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN)
+      endif()
+
+      # MVAPICH uses -compile-info and -link-info.  Try them.
+      if (NOT MPI_COMPILER_RETURN EQUAL 0)
+        _mpi_check_compiler("${MPI_${lang}_COMPILER}" "-compile-info" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN)
+
+        # If we have compile-info, also have link-info.
+        if (MPI_COMPILER_RETURN EQUAL 0)
+          execute_process(
+            COMMAND ${MPI_${lang}_COMPILER} -link-info
+            OUTPUT_VARIABLE  MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE
+            ERROR_VARIABLE   MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE
+            RESULT_VARIABLE  MPI_COMPILER_RETURN)
+        endif()
+
+        # make sure we got compile and link.  Reset vars if something's wrong.
+        if (NOT MPI_COMPILER_RETURN EQUAL 0)
+          set(MPI_COMPILE_CMDLINE)
+          set(MPI_LINK_CMDLINE)
+        endif()
+      endif()
+
+      # MPICH just uses "-show". Try it.
+      if (NOT MPI_COMPILER_RETURN EQUAL 0)
+        _mpi_check_compiler("${MPI_${lang}_COMPILER}" "-show" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN)
+      endif()
+
+      if (MPI_COMPILER_RETURN EQUAL 0)
+        # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE
+        # into MPI_LINK_CMDLINE, if we didn't find the link line.
+        if (NOT MPI_LINK_CMDLINE)
+          set(MPI_LINK_CMDLINE ${MPI_COMPILE_CMDLINE})
+        endif()
+      else()
+        message(STATUS "Unable to determine MPI from MPI driver ${MPI_${lang}_COMPILER}")
+        set(MPI_COMPILE_CMDLINE)
+        set(MPI_LINK_CMDLINE)
+      endif()
+
+      # Here, we're done with the interrogation part, and we'll try to extract args we care
+      # about from what we learned from the compiler wrapper scripts.
+
+      # If interrogation came back with something, extract our variable from the MPI command line
+      if (MPI_COMPILE_CMDLINE OR MPI_LINK_CMDLINE)
+        # Extract compile flags from the compile command line.
+        string(REGEX MATCHALL "(^| )-[Df]([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_FLAGS "${MPI_COMPILE_CMDLINE}")
+        set(MPI_COMPILE_FLAGS_WORK)
+
+        foreach(FLAG ${MPI_ALL_COMPILE_FLAGS})
+          if (MPI_COMPILE_FLAGS_WORK)
+            string(APPEND MPI_COMPILE_FLAGS_WORK " ${FLAG}")
+          else()
+            set(MPI_COMPILE_FLAGS_WORK ${FLAG})
+          endif()
+        endforeach()
+
+        # Extract include paths from compile command line
+        string(REGEX MATCHALL "(^| )-I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}")
+        foreach(IPATH ${MPI_ALL_INCLUDE_PATHS})
+          string(REGEX REPLACE "^ ?-I" "" IPATH ${IPATH})
+          string(REPLACE "//" "/" IPATH ${IPATH})
+          list(APPEND MPI_INCLUDE_PATH_WORK ${IPATH})
+        endforeach()
+
+        # try using showme:incdirs if extracting didn't work.
+        if (NOT MPI_INCLUDE_PATH_WORK)
+          set(MPI_INCLUDE_PATH_WORK ${MPI_INCDIRS})
+          separate_arguments(MPI_INCLUDE_PATH_WORK)
+        endif()
+
+        # If all else fails, just search for mpi.h in the normal include paths.
+        if (NOT MPI_INCLUDE_PATH_WORK)
+          set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+          find_path(MPI_HEADER_PATH mpi.h
+            HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+            PATH_SUFFIXES include)
+          set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
+        endif()
+
+        # Extract linker paths from the link command line
+        string(REGEX MATCHALL "(^| |-Wl,)(-L|/LIBPATH:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}")
+        set(MPI_LINK_PATH)
+        foreach(LPATH ${MPI_ALL_LINK_PATHS})
+          string(REGEX REPLACE "^(| |-Wl,)(-L|/LIBPATH:)" "" LPATH ${LPATH})
+          string(REPLACE "//" "/" LPATH ${LPATH})
+          list(APPEND MPI_LINK_PATH ${LPATH})
+        endforeach()
+
+        # try using showme:libdirs if extracting didn't work.
+        if (NOT MPI_LINK_PATH)
+          set(MPI_LINK_PATH ${MPI_LIBDIRS})
+          separate_arguments(MPI_LINK_PATH)
+        endif()
+
+        # Extract linker flags from the link command line
+        string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}")
+        set(MPI_LINK_FLAGS_WORK)
+        foreach(FLAG ${MPI_ALL_LINK_FLAGS})
+          if (MPI_LINK_FLAGS_WORK)
+            string(APPEND MPI_LINK_FLAGS_WORK " ${FLAG}")
+          else()
+            set(MPI_LINK_FLAGS_WORK ${FLAG})
+          endif()
+        endforeach()
+
+        # Extract the set of libraries to link against from the link command
+        # line
+        string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}")
+        if(WIN32)
+          # The intel wrappers on windows link against static versions of the MPI libraries.
+          # The static libraries are simply listed on the command line without -l.
+          # For instance: " icl ... impi.lib "
+          string(REGEX MATCHALL "(^| )([^\" ]+)\\.lib" tmp "${MPI_LINK_CMDLINE}")
+          list(APPEND MPI_LIBNAMES ${tmp})
+        endif()
+
+        # add the compiler implicit directories because some compilers
+        # such as the intel compiler have libraries that show up
+        # in the showme list that can only be found in the implicit
+        # link directories of the compiler.
+        if (DEFINED CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES)
+          string(APPEND MPI_LINK_PATH
+            ";${CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES}")
+        endif ()
+
+        # Determine full path names for all of the libraries that one needs
+        # to link against in an MPI program
+        foreach(LIB ${MPI_LIBNAMES})
+          string(REGEX REPLACE "^ ?-l" "" LIB ${LIB})
+          if(WIN32)
+            string(REGEX REPLACE "\\.lib$" "" LIB ${LIB})
+          endif()
+          string(STRIP ${LIB} LIB)
+          # MPI_LIB is cached by find_library, but we don't want that.  Clear it first.
+          set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+          find_library(MPI_LIB NAMES ${LIB} HINTS ${MPI_LINK_PATH})
+
+          if (MPI_LIB)
+            list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})
+          elseif (NOT MPI_FIND_QUIETLY)
+            message(WARNING "Unable to find MPI library ${LIB}")
+          endif()
+        endforeach()
+
+        # Sanity check MPI_LIBRARIES to make sure there are enough libraries
+        list(LENGTH MPI_LIBRARIES_WORK MPI_NUMLIBS)
+        list(LENGTH MPI_LIBNAMES MPI_NUMLIBS_EXPECTED)
+        if (NOT MPI_NUMLIBS EQUAL MPI_NUMLIBS_EXPECTED)
+          set(MPI_LIBRARIES_WORK "MPI_${lang}_LIBRARIES-NOTFOUND")
+        endif()
+      endif()
+
+    elseif(try_libs)
+      # If we didn't have an MPI compiler script to interrogate, attempt to find everything
+      # with plain old find functions.  This is nasty because MPI implementations have LOTS of
+      # different library names, so this section isn't going to be very generic.  We need to
+      # make sure it works for MS MPI, though, since there are no compiler wrappers for that.
+      find_path(MPI_HEADER_PATH mpi.h
+        HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+        PATH_SUFFIXES include Inc)
+      set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
+
+      # Decide between 32-bit and 64-bit libraries for Microsoft's MPI
+      if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
+        set(MS_MPI_ARCH_DIR x64)
+        set(MS_MPI_ARCH_DIR2 amd64)
+      else()
+        set(MS_MPI_ARCH_DIR x86)
+        set(MS_MPI_ARCH_DIR2 i386)
+      endif()
+
+      set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+      find_library(MPI_LIB
+        NAMES         mpi mpich mpich2 msmpi
+        HINTS         ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+        PATH_SUFFIXES lib lib/${MS_MPI_ARCH_DIR} Lib Lib/${MS_MPI_ARCH_DIR} lib/${MS_MPI_ARCH_DIR2} Lib/${MS_MPI_ARCH_DIR2})
+      set(MPI_LIBRARIES_WORK ${MPI_LIB})
+
+      # Right now, we only know about the extra libs for C++.
+      # We could add Fortran here (as there is usually libfmpich, etc.), but
+      # this really only has to work with MS MPI on Windows.
+      # Assume that other MPI's are covered by the compiler wrappers.
+      if (${lang} STREQUAL CXX)
+        set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+        find_library(MPI_LIB
+          NAMES         mpi++ mpicxx cxx mpi_cxx
+          HINTS         ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+          PATH_SUFFIXES lib)
+        if (MPI_LIBRARIES_WORK AND MPI_LIB)
+          list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})
+        endif()
+      endif()
+
+      if (${lang} STREQUAL Fortran)
+        set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+        find_path(MPI_HEADER_PATH mpifptr.h
+          HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+          PATH_SUFFIXES include include/${MS_MPI_ARCH_DIR} include/${MS_MPI_ARCH_DIR2} Inc Inc/${MS_MPI_ARCH_DIR} Inc/${MS_MPI_ARCH_DIR2})
+        if (MPI_INCLUDE_PATH_WORK AND MPI_HEADER_PATH)
+          list(APPEND MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
+        endif()
+        
+        set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+        find_library(MPI_LIB
+          NAMES         fmpi fmpich fmpich2 fmpich2g msmpifec msmpifmc
+          HINTS         ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
+          PATH_SUFFIXES lib lib/${MS_MPI_ARCH_DIR} Lib Lib/${MS_MPI_ARCH_DIR})
+        if (MPI_LIBRARIES_WORK AND MPI_LIB)
+          list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})
+        endif()
+      endif()
+
+      if (NOT MPI_LIBRARIES_WORK)
+        set(MPI_LIBRARIES_WORK "MPI_${lang}_LIBRARIES-NOTFOUND")
+      endif()
+    endif()
+
+    # If we found MPI, set up all of the appropriate cache entries
+    set(MPI_${lang}_COMPILE_FLAGS ${MPI_COMPILE_FLAGS_WORK} CACHE STRING "MPI ${lang} compilation flags"         FORCE)
+    set(MPI_${lang}_INCLUDE_PATH  ${MPI_INCLUDE_PATH_WORK}  CACHE STRING "MPI ${lang} include path"              FORCE)
+    set(MPI_${lang}_LINK_FLAGS    ${MPI_LINK_FLAGS_WORK}    CACHE STRING "MPI ${lang} linking flags"             FORCE)
+    set(MPI_${lang}_LIBRARIES     ${MPI_LIBRARIES_WORK}     CACHE STRING "MPI ${lang} libraries to link against" FORCE)
+    mark_as_advanced(MPI_${lang}_COMPILE_FLAGS MPI_${lang}_INCLUDE_PATH MPI_${lang}_LINK_FLAGS MPI_${lang}_LIBRARIES)
+
+    # clear out our temporary lib/header detectionv variable here.
+    set(MPI_LIB         "MPI_LIB-NOTFOUND"         CACHE INTERNAL "Scratch variable for MPI lib detection"    FORCE)
+    set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE INTERNAL "Scratch variable for MPI header detection" FORCE)
+  endif()
+
+  # finally set a found variable for each MPI language
+  if (MPI_${lang}_INCLUDE_PATH AND MPI_${lang}_LIBRARIES)
+    set(MPI_${lang}_FOUND TRUE PARENT_SCOPE)
+  else()
+    set(MPI_${lang}_FOUND FALSE PARENT_SCOPE)
+  endif()
+endfunction()
+
+
+# This function attempts to compile with the regular compiler, to see if MPI programs
+# work with it.  This is a last ditch attempt after we've tried interrogating mpicc and
+# friends, and after we've tried to find generic libraries.  Works on machines like
+# Cray XE6, where the modules environment changes what MPI version cc, CC, and ftn use.
+function(try_regular_compiler lang success)
+  set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
+  if (${lang} STREQUAL Fortran)
+    set(test_file ${scratch_directory}/cmake_mpi_test.f90)
+    file(WRITE ${test_file}
+      "program hello\n"
+      "include 'mpif.h'\n"
+      "integer ierror\n"
+      "call MPI_INIT(ierror)\n"
+      "call MPI_FINALIZE(ierror)\n"
+      "end\n")
+  else()
+    if (${lang} STREQUAL CXX)
+      set(test_file ${scratch_directory}/cmake_mpi_test.cpp)
+    else()
+      set(test_file ${scratch_directory}/cmake_mpi_test.c)
+    endif()
+    file(WRITE ${test_file}
+      "#include <mpi.h>\n"
+      "int main(int argc, char **argv) {\n"
+      "  MPI_Init(&argc, &argv);\n"
+      "  MPI_Finalize();\n"
+      "}\n")
+  endif()
+  try_compile(compiler_has_mpi ${scratch_directory} ${test_file})
+  if (compiler_has_mpi)
+    set(MPI_${lang}_NO_INTERROGATE ${CMAKE_${lang}_COMPILER} CACHE STRING "Whether to interrogate MPI ${lang} compiler" FORCE)
+    set(MPI_${lang}_COMPILER       ${CMAKE_${lang}_COMPILER} CACHE STRING "MPI ${lang} compiler"                        FORCE)
+    set(MPI_${lang}_COMPILE_FLAGS  ""                        CACHE STRING "MPI ${lang} compilation flags"               FORCE)
+    set(MPI_${lang}_INCLUDE_PATH   ""                        CACHE STRING "MPI ${lang} include path"                    FORCE)
+    set(MPI_${lang}_LINK_FLAGS     ""                        CACHE STRING "MPI ${lang} linking flags"                   FORCE)
+    set(MPI_${lang}_LIBRARIES      ""                        CACHE STRING "MPI ${lang} libraries to link against"       FORCE)
+  endif()
+  set(${success} ${compiler_has_mpi} PARENT_SCOPE)
+  unset(compiler_has_mpi CACHE)
+endfunction()
+
+# End definitions, commence real work here.
+
+# Most mpi distros have some form of mpiexec which gives us something we can reliably look for.
+find_program(MPIEXEC
+  NAMES ${_MPI_EXEC_NAMES}
+  HINTS ${MPI_HOME} $ENV{MPI_HOME}
+  PATHS ${_MPI_PREFIX_PATH}
+  PATH_SUFFIXES bin
+  DOC "Executable for running MPI programs.")
+
+# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin).
+# This gives us a fairly reliable base directory to search for /bin /lib and /include from.
+get_filename_component(_MPI_BASE_DIR "${MPIEXEC}" PATH)
+get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH)
+
+set(MPIEXEC_NUMPROC_FLAG "-np" CACHE STRING "Flag used by MPI to specify the number of processes for MPIEXEC; the next option will be the number of processes.")
+set(MPIEXEC_PREFLAGS     ""    CACHE STRING "These flags will be directly before the executable that is being run by MPIEXEC.")
+set(MPIEXEC_POSTFLAGS    ""    CACHE STRING "These flags will come after all flags given to MPIEXEC.")
+set(MPIEXEC_MAX_NUMPROCS "2"   CACHE STRING "Maximum number of processors available to run MPI applications.")
+mark_as_advanced(MPIEXEC MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS)
+
+
+#=============================================================================
+# Backward compatibility input hacks.  Propagate the FindMPI hints to C and
+# CXX if the respective new versions are not defined.  Translate the old
+# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${lang}_LIBRARIES.
+#
+# Once we find the new variables, we translate them back into their old
+# equivalents below.
+foreach (lang C CXX)
+  # Old input variables.
+  set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS)
+
+  # Set new vars based on their old equivalents, if the new versions are not already set.
+  foreach (var ${_MPI_OLD_INPUT_VARS})
+    if (NOT MPI_${lang}_${var} AND MPI_${var})
+      set(MPI_${lang}_${var} "${MPI_${var}}")
+    endif()
+  endforeach()
+
+  # Special handling for MPI_LIBRARY and MPI_EXTRA_LIBRARY, which we nixed in the
+  # new FindMPI.  These need to be merged into MPI_<lang>_LIBRARIES
+  if (NOT MPI_${lang}_LIBRARIES AND (MPI_LIBRARY OR MPI_EXTRA_LIBRARY))
+    set(MPI_${lang}_LIBRARIES ${MPI_LIBRARY} ${MPI_EXTRA_LIBRARY})
+  endif()
+endforeach()
+#=============================================================================
+
+
+# This loop finds the compilers and sends them off for interrogation.
+foreach (lang C CXX Fortran)
+  if (CMAKE_${lang}_COMPILER_WORKS)
+    # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler.
+    if (MPI_${lang}_COMPILER)
+      if (NOT IS_ABSOLUTE "${MPI_${lang}_COMPILER}")
+        # Get rid of our default list of names and just search for the name the user wants.
+        set(_MPI_${lang}_COMPILER_NAMES ${MPI_${lang}_COMPILER})
+        set(MPI_${lang}_COMPILER "MPI_${lang}_COMPILER-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
+      endif()
+      # If the user specifies a compiler, we don't want to try to search libraries either.
+      set(try_libs FALSE)
+    else()
+      set(try_libs TRUE)
+    endif()
+
+    find_program(MPI_${lang}_COMPILER
+      NAMES  ${_MPI_${lang}_COMPILER_NAMES}
+      HINTS  ${_MPI_BASE_DIR}/bin
+      PATHS  ${_MPI_PREFIX_PATH}
+      )
+    interrogate_mpi_compiler(${lang} ${try_libs})
+    mark_as_advanced(MPI_${lang}_COMPILER)
+
+    # last ditch try -- if nothing works so far, just try running the regular compiler and
+    # see if we can create an MPI executable.
+    set(regular_compiler_worked 0)
+    if (NOT MPI_${lang}_LIBRARIES OR NOT MPI_${lang}_INCLUDE_PATH)
+      try_regular_compiler(${lang} regular_compiler_worked)
+    endif()
+
+    set(MPI_${lang}_FIND_QUIETLY ${MPI_FIND_QUIETLY})
+    set(MPI_${lang}_FIND_REQUIRED ${MPI_FIND_REQUIRED})
+    set(MPI_${lang}_FIND_VERSION ${MPI_FIND_VERSION})
+    set(MPI_${lang}_FIND_VERSION_EXACT ${MPI_FIND_VERSION_EXACT})
+
+    if (regular_compiler_worked)
+      find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_COMPILER)
+    else()
+      find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_LIBRARIES MPI_${lang}_INCLUDE_PATH)
+    endif()
+  endif()
+endforeach()
+
+
+#=============================================================================
+# More backward compatibility stuff
+#
+# Bare MPI sans ${lang} vars are set to CXX then C, depending on what was found.
+# This mimics the behavior of the old language-oblivious FindMPI.
+set(_MPI_OLD_VARS FOUND COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES)
+if (MPI_CXX_FOUND)
+  foreach (var ${_MPI_OLD_VARS})
+    set(MPI_${var} ${MPI_CXX_${var}})
+  endforeach()
+elseif (MPI_C_FOUND)
+  foreach (var ${_MPI_OLD_VARS})
+    set(MPI_${var} ${MPI_C_${var}})
+  endforeach()
+else()
+  # Note that we might still have found Fortran, but you'll need to use MPI_Fortran_FOUND
+  set(MPI_FOUND FALSE)
+endif()
+
+# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache.
+if (MPI_LIBRARIES)
+  list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK)
+  set(MPI_LIBRARY ${MPI_LIBRARY_WORK} CACHE FILEPATH "MPI library to link against" FORCE)
+else()
+  set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND" CACHE FILEPATH "MPI library to link against" FORCE)
+endif()
+
+list(LENGTH MPI_LIBRARIES MPI_NUMLIBS)
+if (MPI_NUMLIBS GREATER 1)
+  set(MPI_EXTRA_LIBRARY_WORK ${MPI_LIBRARIES})
+  list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0)
+  set(MPI_EXTRA_LIBRARY ${MPI_EXTRA_LIBRARY_WORK} CACHE STRING "Extra MPI libraries to link against" FORCE)
+else()
+  set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND" CACHE STRING "Extra MPI libraries to link against" FORCE)
+endif()
+#=============================================================================
+
+# unset these vars to cleanup namespace
+unset(_MPI_OLD_VARS)
+unset(_MPI_PREFIX_PATH)
+unset(_MPI_BASE_DIR)
+foreach (lang C CXX Fortran)
+  unset(_MPI_${lang}_COMPILER_NAMES)
+endforeach()
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindSZIP.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindSZIP.cmake
new file mode 100644
index 0000000..5f0f031
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/FindSZIP.cmake
@@ -0,0 +1,172 @@
+
+# - Find SZIP library
+# - Derived from the FindTiff.cmake that is included with cmake
+# Find the native SZIP includes and library
+# This module defines
+#  SZIP_INCLUDE_DIRS, where to find tiff.h, etc.
+#  SZIP_LIBRARIES, libraries to link against to use SZIP.
+#  SZIP_FOUND, If false, do not try to use SZIP.
+#    also defined, but not for general use are
+#  SZIP_LIBRARY, where to find the SZIP library.
+#  SZIP_LIBRARY_DEBUG - Debug version of SZIP library
+#  SZIP_LIBRARY_RELEASE - Release Version of SZIP library
+
+# message (STATUS "Finding SZIP library and headers..." )
+
+############################################
+#
+# Check the existence of the libraries.
+#
+############################################
+# This macro was taken directly from the FindQt4.cmake file that is included
+# with the CMake distribution. This is NOT my work. All work was done by the
+# original authors of the FindQt4.cmake file. Only minor modifications were
+# made to remove references to Qt and make this file more generally applicable
+#########################################################################
+
+MACRO (SZIP_ADJUST_LIB_VARS basename)
+  if (${basename}_INCLUDE_DIR)
+
+    # if only the release version was found, set the debug variable also to the release version
+    if (${basename}_LIBRARY_RELEASE AND NOT ${basename}_LIBRARY_DEBUG)
+      set (${basename}_LIBRARY_DEBUG ${${basename}_LIBRARY_RELEASE})
+      set (${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE})
+      set (${basename}_LIBRARIES     ${${basename}_LIBRARY_RELEASE})
+    endif (${basename}_LIBRARY_RELEASE AND NOT ${basename}_LIBRARY_DEBUG)
+
+    # if only the debug version was found, set the release variable also to the debug version
+    if (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
+      set (${basename}_LIBRARY_RELEASE ${${basename}_LIBRARY_DEBUG})
+      set (${basename}_LIBRARY         ${${basename}_LIBRARY_DEBUG})
+      set (${basename}_LIBRARIES       ${${basename}_LIBRARY_DEBUG})
+    endif (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
+    if (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
+      # if the generator supports configuration types then set
+      # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
+      if (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+        set (${basename}_LIBRARY       optimized ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
+      else (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+        # if there are no configuration types and CMAKE_BUILD_TYPE has no value
+        # then just use the release libraries
+        set (${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE} )
+      endif (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+      set (${basename}_LIBRARIES       optimized ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
+    endif (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
+
+    set (${basename}_LIBRARY ${${basename}_LIBRARY} CACHE FILEPATH "The ${basename} library")
+
+    if (${basename}_LIBRARY)
+      set (${basename}_FOUND 1)
+    endif (${basename}_LIBRARY)
+
+  endif (${basename}_INCLUDE_DIR )
+
+  # Make variables changeble to the advanced user
+  MARK_AS_ADVANCED (${basename}_LIBRARY ${basename}_LIBRARY_RELEASE ${basename}_LIBRARY_DEBUG ${basename}_INCLUDE_DIR )
+ENDMACRO (SZIP_ADJUST_LIB_VARS)
+
+
+# Look for the header file.
+set (SZIP_INCLUDE_SEARCH_DIRS
+    $ENV{SZIP_INSTALL}/include
+    $ENV{SZIP_INSTALL}/include/szip
+    /usr/include
+    /usr/include/szip
+)
+
+set (SZIP_LIB_SEARCH_DIRS
+    $ENV{SZIP_INSTALL}/lib
+    /usr/lib
+)
+
+set (SZIP_BIN_SEARCH_DIRS
+    $ENV{SZIP_INSTALL}/bin
+    /usr/bin
+)
+
+FIND_PATH (SZIP_INCLUDE_DIR
+    NAMES szlib.h
+    PATHS ${SZIP_INCLUDE_SEARCH_DIRS}
+    NO_DEFAULT_PATH
+)
+
+if (WIN32)
+    set (SZIP_SEARCH_DEBUG_NAMES "sz_d;libsz_d")
+    set (SZIP_SEARCH_RELEASE_NAMES "sz;libsz;libszip")
+else (WIN32)
+    set (SZIP_SEARCH_DEBUG_NAMES "sz_d")
+    set (SZIP_SEARCH_RELEASE_NAMES "sz;szip")
+endif (WIN32)
+
+# Look for the library.
+FIND_LIBRARY (SZIP_LIBRARY_DEBUG
+    NAMES ${SZIP_SEARCH_DEBUG_NAMES}
+    PATHS ${SZIP_LIB_SEARCH_DIRS}
+    NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY (SZIP_LIBRARY_RELEASE
+    NAMES ${SZIP_SEARCH_RELEASE_NAMES}
+    PATHS ${SZIP_LIB_SEARCH_DIRS}
+    NO_DEFAULT_PATH
+)
+
+SZIP_ADJUST_LIB_VARS (SZIP)
+
+if (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
+  set (SZIP_FOUND 1)
+  set (SZIP_LIBRARIES ${SZIP_LIBRARY})
+  set (SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIR})
+  if (SZIP_LIBRARY_DEBUG)
+    get_filename_component (SZIP_LIBRARY_PATH ${SZIP_LIBRARY_DEBUG} PATH)
+    set (SZIP_LIB_DIR  ${SZIP_LIBRARY_PATH})
+  elseif (SZIP_LIBRARY_RELEASE)
+    get_filename_component (SZIP_LIBRARY_PATH ${SZIP_LIBRARY_RELEASE} PATH)
+    set (SZIP_LIB_DIR  ${SZIP_LIBRARY_PATH})
+  endif (SZIP_LIBRARY_DEBUG)
+
+else (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
+  set (SZIP_FOUND 0)
+  set (SZIP_LIBRARIES)
+  set (SZIP_INCLUDE_DIRS)
+endif (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
+
+# Report the results.
+if (NOT SZIP_FOUND)
+  set (SZIP_DIR_MESSAGE
+      "SZip was not found. Make sure SZIP_LIBRARY and SZIP_INCLUDE_DIR are set or set the SZIP_INSTALL environment variable."
+  )
+  if (NOT SZIP_FIND_QUIETLY)
+    message (STATUS "${SZIP_DIR_MESSAGE}")
+  else (NOT SZIP_FIND_QUIETLY)
+    if (SZIP_FIND_REQUIRED)
+      message (FATAL_ERROR "SZip was NOT found and is Required by this project")
+    endif (SZIP_FIND_REQUIRED)
+  endif (NOT SZIP_FIND_QUIETLY)
+endif (NOT SZIP_FOUND)
+
+if (SZIP_FOUND)
+  include (CheckSymbolExists)
+  #############################################
+  # Find out if SZIP was build using dll's
+  #############################################
+  # Save required variable
+  set (CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
+  set (CMAKE_REQUIRED_FLAGS_SAVE    ${CMAKE_REQUIRED_FLAGS})
+  # Add SZIP_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES
+  set (CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};${SZIP_INCLUDE_DIRS}")
+
+  # Restore CMAKE_REQUIRED_INCLUDES and CMAKE_REQUIRED_FLAGS variables
+  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
+  set (CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})
+  #
+  #############################################
+endif (SZIP_FOUND)
+
+if (FIND_SZIP_DEBUG)
+  message (STATUS "SZIP_INCLUDE_DIR: ${SZIP_INCLUDE_DIR}")
+  message (STATUS "SZIP_INCLUDE_DIRS: ${SZIP_INCLUDE_DIRS}")
+  message (STATUS "SZIP_LIBRARY_DEBUG: ${SZIP_LIBRARY_DEBUG}")
+  message (STATUS "SZIP_LIBRARY_RELEASE: ${SZIP_LIBRARY_RELEASE}")
+  message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
+endif (FIND_SZIP_DEBUG)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/GetTimeOfDayTest.cpp b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/GetTimeOfDayTest.cpp
new file mode 100644
index 0000000..3b5bf60
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/GetTimeOfDayTest.cpp
@@ -0,0 +1,15 @@
+#if defined (TRY_SYS_TIME_H)
+#include <sys/time.h>
+/* #include <time.h> */
+#endif
+
+
+#if defined (TRY_TIME_H)
+#include <time.h>
+#endif
+
+int main(int argc, char **argv) {
+	  struct timeval t1;
+	  gettimeofday(&t1, 0x00);
+	return 0;
+}
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFCXXTests.cpp b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFCXXTests.cpp
new file mode 100644
index 0000000..6b47421
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFCXXTests.cpp
@@ -0,0 +1,56 @@
+
+#ifdef OLD_HEADER_FILENAME
+
+#include <iostream>
+
+int main(void) { return 0; }
+
+#endif
+
+
+#ifdef HDF_NO_NAMESPACE
+
+namespace HDF {
+int fnord;
+}
+
+int main(void) {
+   using namespace HDF;
+   fnord = 37;
+   return 0;
+}
+
+#endif
+
+#ifdef HDF_NO_STD
+
+#include <string>
+
+using namespace std;
+
+int main(void) {
+   string myString("testing namespace std");
+   return 0;
+}
+
+#endif
+
+#ifdef BOOL_NOTDEFINED
+int main(void) {
+   bool flag;
+   return 0;
+}
+
+#endif
+
+#ifdef NO_STATIC_CAST
+
+int main(void) {
+   float test_float;
+   int test_int;
+   test_float = 37.0;
+   test_int = static_cast <int> (test_float);
+   return 0;
+}
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFLibMacros.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFLibMacros.cmake
new file mode 100644
index 0000000..2145a3d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFLibMacros.cmake
@@ -0,0 +1,271 @@
+#-------------------------------------------------------------------------------
+macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
+  # May need to build JPEG with PIC on x64 machines with gcc
+  # Need to use CMAKE_ANSI_CFLAGS define so that compiler test works
+
+  if (${compress_type} MATCHES "SVN")
+    EXTERNALPROJECT_ADD (JPEG
+        SVN_REPOSITORY ${JPEG_URL}
+        # [SVN_REVISION rev]
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DJPEG_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DJPEG_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
+    )
+  elseif (${compress_type} MATCHES "GIT")
+    EXTERNALPROJECT_ADD (JPEG
+        GIT_REPOSITORY ${JPEG_URL}
+        GIT_TAG ${JPEG_BRANCH}
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DJPEG_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DJPEG_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
+    )
+  elseif (${compress_type} MATCHES "TGZ")
+    EXTERNALPROJECT_ADD (JPEG
+        URL ${JPEG_URL}
+        URL_MD5 ""
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DJPEG_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DJPEG_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
+    )
+  endif (${compress_type} MATCHES "SVN")
+  externalproject_get_property (JPEG BINARY_DIR SOURCE_DIR)
+
+##include (${BINARY_DIR}/${JPEG_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
+# Create imported target jpeg-static
+  add_library(jpeg-static STATIC IMPORTED)
+  HDF_IMPORT_SET_LIB_OPTIONS (jpeg-static "jpeg" STATIC "")
+  add_dependencies (JPEG jpeg-static)
+  set (JPEG_STATIC_LIBRARY "jpeg-static")
+  set (JPEG_LIBRARIES ${JPEG_static_LIBRARY})
+  if (BUILD_SHARED_LIBS)
+    # Create imported target jpeg-shared
+    add_library(jpeg-shared SHARED IMPORTED)
+    HDF_IMPORT_SET_LIB_OPTIONS (jpeg-shared "jpeg" SHARED "")
+    add_dependencies (JPEG jpeg-shared)
+    set (JPEG_SHARED_LIBRARY "jpeg-shared")
+    set (JPEG_LIBRARIES ${JPEG_LIBRARIES} ${JPEG_shared_LIBRARY})
+  endif (BUILD_SHARED_LIBS)
+
+  set (JPEG_INCLUDE_DIR_GEN "${BINARY_DIR}")
+  set (JPEG_INCLUDE_DIR "${SOURCE_DIR}/src")
+  set (JPEG_FOUND 1)
+  set (JPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIR_GEN} ${JPEG_INCLUDE_DIR})
+endmacro (EXTERNAL_JPEG_LIBRARY)
+
+#-------------------------------------------------------------------------------
+macro (PACKAGE_JPEG_LIBRARY compress_type)
+  add_custom_target (JPEG-GenHeader-Copy ALL
+      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${JPEG_INCLUDE_DIR_GEN}/jconfig.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/
+      COMMENT "Copying ${JPEG_INCLUDE_DIR_GEN}/jconfig.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
+  )
+  set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/jconfig.h)
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+    add_dependencies (JPEG-GenHeader-Copy JPEG)
+  endif (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+endmacro (PACKAGE_JPEG_LIBRARY)
+
+#-------------------------------------------------------------------------------
+macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
+  if (${compress_type} MATCHES "SVN")
+    EXTERNALPROJECT_ADD (SZIP
+        SVN_REPOSITORY ${SZIP_URL}
+        # [SVN_REVISION rev]
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DSZIP_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DSZIP_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+            -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
+    )
+  elseif (${compress_type} MATCHES "GIT")
+    EXTERNALPROJECT_ADD (SZIP
+        GIT_REPOSITORY ${SZIP_URL}
+        GIT_TAG ${SZIP_BRANCH}
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DSZIP_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DSZIP_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+            -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
+    )
+  elseif (${compress_type} MATCHES "TGZ")
+    EXTERNALPROJECT_ADD (SZIP
+        URL ${SZIP_URL}
+        URL_MD5 ""
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DSZIP_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DSZIP_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+            -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
+    )
+  endif (${compress_type} MATCHES "SVN")
+  externalproject_get_property (SZIP BINARY_DIR SOURCE_DIR)
+
+##include (${BINARY_DIR}/${SZIP_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
+# Create imported target szip-static
+  add_library(szip-static STATIC IMPORTED)
+  HDF_IMPORT_SET_LIB_OPTIONS (szip-static "szip" STATIC "")
+  add_dependencies (SZIP szip-static)
+  set (SZIP_STATIC_LIBRARY "szip-static")
+  set (SZIP_LIBRARIES ${SZIP_static_LIBRARY})
+  if (BUILD_SHARED_LIBS)
+    # Create imported target szip-shared
+    add_library(szip-shared SHARED IMPORTED)
+    HDF_IMPORT_SET_LIB_OPTIONS (szip-shared "szip" SHARED "")
+    add_dependencies (SZIP szip-shared)
+    set (SZIP_SHARED_LIBRARY "szip-shared")
+    set (SZIP_LIBRARIES ${SZIP_LIBRARIES} ${SZIP_shared_LIBRARY})
+  endif (BUILD_SHARED_LIBS)
+
+  set (SZIP_INCLUDE_DIR_GEN "${BINARY_DIR}")
+  set (SZIP_INCLUDE_DIR "${SOURCE_DIR}/src")
+  set (SZIP_FOUND 1)
+  set (SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIR_GEN} ${SZIP_INCLUDE_DIR})
+endmacro (EXTERNAL_SZIP_LIBRARY)
+
+#-------------------------------------------------------------------------------
+macro (PACKAGE_SZIP_LIBRARY compress_type)
+  add_custom_target (SZIP-GenHeader-Copy ALL
+      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SZIP_INCLUDE_DIR_GEN}/SZconfig.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/
+      COMMENT "Copying ${SZIP_INCLUDE_DIR_GEN}/SZconfig.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
+  )
+  set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/SZconfig.h)
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+    add_dependencies (SZIP-GenHeader-Copy SZIP)
+  endif (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+endmacro (PACKAGE_SZIP_LIBRARY)
+
+#-------------------------------------------------------------------------------
+macro (EXTERNAL_ZLIB_LIBRARY compress_type)
+  if (${compress_type} MATCHES "SVN")
+    EXTERNALPROJECT_ADD (ZLIB
+        SVN_REPOSITORY ${ZLIB_URL}
+        # [SVN_REVISION rev]
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DZLIB_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DZLIB_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+    )
+  elseif (${compress_type} MATCHES "GIT")
+    EXTERNALPROJECT_ADD (ZLIB
+        GIT_REPOSITORY ${ZLIB_URL}
+        GIT_TAG ${ZLIB_BRANCH}
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DZLIB_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DZLIB_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+    )
+  elseif (${compress_type} MATCHES "TGZ")
+    EXTERNALPROJECT_ADD (ZLIB
+        URL ${ZLIB_URL}
+        URL_MD5 ""
+        INSTALL_COMMAND ""
+        CMAKE_ARGS
+            -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+            -DZLIB_PACKAGE_EXT:STRING=${HDF_PACKAGE_EXT}
+            -DZLIB_EXTERNALLY_CONFIGURED:BOOL=OFF
+            -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
+            -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+            -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+            -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
+    )
+  endif (${compress_type} MATCHES "SVN")
+  externalproject_get_property (ZLIB BINARY_DIR SOURCE_DIR)
+
+  if (WIN32)
+    set (ZLIB_LIB_NAME "zlib")
+  else (WIN32)
+    set (ZLIB_LIB_NAME "z")
+  endif (WIN32)
+##include (${BINARY_DIR}/${ZLIB_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
+# Create imported target zlib-static
+  add_library(zlib-static STATIC IMPORTED)
+  HDF_IMPORT_SET_LIB_OPTIONS (zlib-static ${ZLIB_LIB_NAME} STATIC "")
+  add_dependencies (ZLIB zlib-static)
+  set (ZLIB_STATIC_LIBRARY "zlib-static")
+  set (ZLIB_LIBRARIES ${ZLIB_static_LIBRARY})
+  if (BUILD_SHARED_LIBS)
+    # Create imported target zlib-shared
+    add_library(zlib-shared SHARED IMPORTED)
+    HDF_IMPORT_SET_LIB_OPTIONS (zlib-shared ${ZLIB_LIB_NAME} SHARED "")
+    add_dependencies (ZLIB zlib-shared)
+    set (ZLIB_SHARED_LIBRARY "zlib-shared")
+    set (ZLIB_LIBRARIES ${ZLIB_LIBRARIES} ${ZLIB_SHARED_LIBRARY})
+  endif (BUILD_SHARED_LIBS)
+
+  set (ZLIB_INCLUDE_DIR_GEN "${BINARY_DIR}")
+  set (ZLIB_INCLUDE_DIR "${SOURCE_DIR}")
+  set (ZLIB_FOUND 1)
+  set (ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR_GEN} ${ZLIB_INCLUDE_DIR})
+endmacro (EXTERNAL_ZLIB_LIBRARY)
+
+#-------------------------------------------------------------------------------
+macro (PACKAGE_ZLIB_LIBRARY compress_type)
+  add_custom_target (ZLIB-GenHeader-Copy ALL
+      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${ZLIB_INCLUDE_DIR_GEN}/zconf.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/
+      COMMENT "Copying ${ZLIB_INCLUDE_DIR_GEN}/zconf.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
+  )
+  set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/zconf.h)
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+    add_dependencies (ZLIB-GenHeader-Copy ZLIB)
+  endif (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+endmacro (PACKAGE_ZLIB_LIBRARY)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFMacros.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFMacros.cmake
new file mode 100644
index 0000000..1d6b49a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFMacros.cmake
@@ -0,0 +1,291 @@
+#-------------------------------------------------------------------------------
+macro (SET_GLOBAL_VARIABLE name value)
+  set (${name} ${value} CACHE INTERNAL "Used to pass variables between directories" FORCE)
+endmacro (SET_GLOBAL_VARIABLE)
+
+#-------------------------------------------------------------------------------
+macro (IDE_GENERATED_PROPERTIES SOURCE_PATH HEADERS SOURCES)
+  #set(source_group_path "Source/AIM/${NAME}")
+  string (REPLACE "/" "\\\\" source_group_path ${SOURCE_PATH})
+  source_group (${source_group_path} FILES ${HEADERS} ${SOURCES})
+
+  #-- The following is needed if we ever start to use OS X Frameworks but only
+  #--  works on CMake 2.6 and greater
+  #set_property (SOURCE ${HEADERS}
+  #       PROPERTY MACOSX_PACKAGE_LOCATION Headers/${NAME}
+  #)
+endmacro (IDE_GENERATED_PROPERTIES)
+
+#-------------------------------------------------------------------------------
+macro (IDE_SOURCE_PROPERTIES SOURCE_PATH HEADERS SOURCES)
+  #  install (FILES ${HEADERS}
+  #       DESTINATION include/R3D/${NAME}
+  #       COMPONENT Headers
+  #  )
+
+  string (REPLACE "/" "\\\\" source_group_path ${SOURCE_PATH}  )
+  source_group (${source_group_path} FILES ${HEADERS} ${SOURCES})
+
+  #-- The following is needed if we ever start to use OS X Frameworks but only
+  #--  works on CMake 2.6 and greater
+  #set_property (SOURCE ${HEADERS}
+  #       PROPERTY MACOSX_PACKAGE_LOCATION Headers/${NAME}
+  #)
+endmacro (IDE_SOURCE_PROPERTIES)
+
+#-------------------------------------------------------------------------------
+macro (TARGET_NAMING libtarget libtype)
+  if (${libtype} MATCHES "SHARED")
+    set_target_properties (${libtarget} PROPERTIES OUTPUT_NAME "${libtarget}${ARGN}")
+  endif (${libtype} MATCHES "SHARED")
+endmacro (TARGET_NAMING)
+
+#-------------------------------------------------------------------------------
+macro (INSTALL_TARGET_PDB libtarget targetdestination targetcomponent)
+  if (WIN32 AND MSVC)
+    get_target_property (target_name ${libtarget} OUTPUT_NAME_RELWITHDEBINFO)
+    install (
+      FILES
+          ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${target_name}.pdb
+      DESTINATION
+          ${targetdestination}
+      CONFIGURATIONS RelWithDebInfo
+      COMPONENT ${targetcomponent}
+  )
+  endif (WIN32 AND MSVC)
+endmacro (INSTALL_TARGET_PDB)
+
+#-------------------------------------------------------------------------------
+macro (INSTALL_PROGRAM_PDB progtarget targetdestination targetcomponent)
+  if (WIN32 AND MSVC)
+    get_target_property (target_name ${progtarget} OUTPUT_NAME_RELWITHDEBINFO)
+    get_target_property (target_prefix ${progtarget} PREFIX)
+    install (
+      FILES
+          ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${target_prefix}${target_name}.pdb
+      DESTINATION
+          ${targetdestination}
+      CONFIGURATIONS RelWithDebInfo
+      COMPONENT ${targetcomponent}
+  )
+  endif (WIN32 AND MSVC)
+endmacro (INSTALL_PROGRAM_PDB)
+
+#-------------------------------------------------------------------------------
+macro (HDF_SET_LIB_OPTIONS libtarget libname libtype)
+  if (${libtype} MATCHES "SHARED")
+    if (WIN32)
+      set (LIB_RELEASE_NAME "${libname}")
+      set (LIB_DEBUG_NAME "${libname}_D")
+    else (WIN32)
+      set (LIB_RELEASE_NAME "${libname}")
+      set (LIB_DEBUG_NAME "${libname}_debug")
+    endif (WIN32)
+  else (${libtype} MATCHES "SHARED")
+    if (WIN32)
+      set (LIB_RELEASE_NAME "lib${libname}")
+      set (LIB_DEBUG_NAME "lib${libname}_D")
+    else (WIN32)
+      set (LIB_RELEASE_NAME "${libname}")
+      set (LIB_DEBUG_NAME "${libname}_debug")
+    endif (WIN32)
+  endif (${libtype} MATCHES "SHARED")
+
+  set_target_properties (${libtarget}
+      PROPERTIES
+      OUTPUT_NAME_DEBUG          ${LIB_DEBUG_NAME}
+      OUTPUT_NAME_RELEASE        ${LIB_RELEASE_NAME}
+      OUTPUT_NAME_MINSIZEREL     ${LIB_RELEASE_NAME}
+      OUTPUT_NAME_RELWITHDEBINFO ${LIB_RELEASE_NAME}
+  )
+
+  #----- Use MSVC Naming conventions for Shared Libraries
+  if (MINGW AND ${libtype} MATCHES "SHARED")
+    set_target_properties (${libtarget}
+        PROPERTIES
+        IMPORT_SUFFIX ".lib"
+        IMPORT_PREFIX ""
+        PREFIX ""
+    )
+  endif (MINGW AND ${libtype} MATCHES "SHARED")
+
+endmacro (HDF_SET_LIB_OPTIONS)
+
+#-------------------------------------------------------------------------------
+macro (HDF_IMPORT_SET_LIB_OPTIONS libtarget libname libtype libversion)
+  HDF_SET_LIB_OPTIONS (${libtarget} ${libname} ${libtype})
+
+  if (${importtype} MATCHES "IMPORT")
+    set (importprefix "${CMAKE_STATIC_LIBRARY_PREFIX}")
+  endif (${importtype} MATCHES "IMPORT")
+  if (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+    set (IMPORT_LIB_NAME ${LIB_DEBUG_NAME})
+  else (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+    set (IMPORT_LIB_NAME ${LIB_RELEASE_NAME})
+  endif (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+
+  if (${libtype} MATCHES "SHARED")
+    if (WIN32)
+      if (MINGW)
+        set_target_properties (${libtarget} PROPERTIES
+            IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${IMPORT_LIB_NAME}.lib"
+            IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
+        )
+      else (MINGW)
+        set_target_properties (${libtarget} PROPERTIES
+            IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}"
+            IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
+         )
+      endif (MINGW)
+    else (WIN32)
+      if (CYGWIN)
+        set_target_properties (${libtarget} PROPERTIES
+            IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}"
+            IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
+        )
+      else (CYGWIN)
+        set_target_properties (${libtarget} PROPERTIES
+            IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
+            IMPORTED_SONAME "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}.${libversion}"
+            SOVERSION "${libversion}"
+        )
+      endif (CYGWIN)
+    endif (WIN32)
+  else (${libtype} MATCHES "SHARED")
+    if (WIN32 AND NOT MINGW)
+      set_target_properties (${libtarget} PROPERTIES
+          IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${IMPORT_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+      )
+    else (WIN32 AND NOT MINGW)
+      set_target_properties (${libtarget} PROPERTIES
+          IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_STATIC_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+      )
+    endif (WIN32 AND NOT MINGW)
+  endif (${libtype} MATCHES "SHARED")
+
+endmacro (HDF_IMPORT_SET_LIB_OPTIONS)
+
+#-------------------------------------------------------------------------------
+macro (TARGET_C_PROPERTIES wintarget libtype addcompileflags addlinkflags)
+  if (MSVC)
+    TARGET_MSVC_PROPERTIES (${wintarget} ${libtype} "${addcompileflags} ${WIN_COMPILE_FLAGS}" "${addlinkflags} ${WIN_LINK_FLAGS}")
+  else (MSVC)
+    set_target_properties (${wintarget}
+        PROPERTIES
+            COMPILE_FLAGS "${addcompileflags}"
+            LINK_FLAGS "${addlinkflags}"
+    )
+  endif (MSVC)
+endmacro (TARGET_C_PROPERTIES)
+
+#-------------------------------------------------------------------------------
+macro (TARGET_MSVC_PROPERTIES wintarget libtype addcompileflags addlinkflags)
+  if (MSVC)
+    set_target_properties (${wintarget}
+        PROPERTIES
+            COMPILE_FLAGS "${addcompileflags}"
+            LINK_FLAGS "${addlinkflags}"
+    )
+  endif (MSVC)
+endmacro (TARGET_MSVC_PROPERTIES)
+
+#-------------------------------------------------------------------------------
+macro (TARGET_FORTRAN_PROPERTIES forttarget libtype addcompileflags addlinkflags)
+  if (WIN32)
+    TARGET_FORTRAN_WIN_PROPERTIES (${forttarget} ${libtype} "${addcompileflags} ${WIN_COMPILE_FLAGS}" "${addlinkflags} ${WIN_LINK_FLAGS}")
+  endif (WIN32)
+endmacro (TARGET_FORTRAN_PROPERTIES)
+
+#-------------------------------------------------------------------------------
+macro (TARGET_FORTRAN_WIN_PROPERTIES forttarget libtype addcompileflags addlinkflags)
+  if (MSVC)
+    if (${libtype} MATCHES "SHARED")
+      set_target_properties (${forttarget}
+          PROPERTIES
+              COMPILE_FLAGS "/dll ${addcompileflags}"
+              LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}"
+      )
+    else (${libtype} MATCHES "SHARED")
+      set_target_properties (${forttarget}
+          PROPERTIES
+              COMPILE_FLAGS "${addcompileflags}"
+              LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}"
+      )
+    endif (${libtype} MATCHES "SHARED")
+  endif (MSVC)
+endmacro (TARGET_FORTRAN_WIN_PROPERTIES)
+
+#-----------------------------------------------------------------------------
+# Configure the README.txt file for the binary package
+#-----------------------------------------------------------------------------
+macro (HDF_README_PROPERTIES target_fortran)
+  set (BINARY_SYSTEM_NAME ${CMAKE_SYSTEM_NAME})
+  set (BINARY_PLATFORM "${CMAKE_SYSTEM_NAME}")
+  if (WIN32)
+    set (BINARY_EXAMPLE_ENDING "zip")
+    set (BINARY_INSTALL_ENDING "msi")
+    if (CMAKE_CL_64)
+      set (BINARY_SYSTEM_NAME "win64")
+    else (CMAKE_CL_64)
+      set (BINARY_SYSTEM_NAME "win32")
+    endif (CMAKE_CL_64)
+    if (${CMAKE_SYSTEM_VERSION} MATCHES "6.1")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM} 7")
+    elseif (${CMAKE_SYSTEM_VERSION} MATCHES "6.2")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM} 8")
+    elseif (${CMAKE_SYSTEM_VERSION} MATCHES "6.3")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM} 10")
+    endif (${CMAKE_SYSTEM_VERSION} MATCHES "6.1")
+    set (BINARY_PLATFORM "${BINARY_PLATFORM} ${MSVC_C_ARCHITECTURE_ID}")
+    if (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2010")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "15.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2008")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "17.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2012")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "18.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2013")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "19.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2015")
+    else (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO ${CMAKE_C_COMPILER_VERSION}")
+    endif (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+  elseif (APPLE)
+    set (BINARY_EXAMPLE_ENDING "tar.gz")
+    set (BINARY_INSTALL_ENDING "dmg")
+    set (BINARY_PLATFORM "${BINARY_PLATFORM} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
+    set (BINARY_PLATFORM "${BINARY_PLATFORM}, using ${CMAKE_C_COMPILER_ID} C ${CMAKE_C_COMPILER_VERSION}")
+  else (WIN32)
+    set (BINARY_EXAMPLE_ENDING "tar.gz")
+    set (BINARY_INSTALL_ENDING "sh")
+    set (BINARY_PLATFORM "${BINARY_PLATFORM} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
+    set (BINARY_PLATFORM "${BINARY_PLATFORM}, using ${CMAKE_C_COMPILER_ID} C ${CMAKE_C_COMPILER_VERSION}")
+  endif (WIN32)
+
+  if (target_fortran)
+    set (BINARY_PLATFORM "${BINARY_PLATFORM} / ${CMAKE_Fortran_COMPILER_ID} Fortran")
+  endif (target_fortran)
+
+  if (BUILD_SHARED_LIBS)
+    set (LIB_TYPE "Static and Shared")
+  else (BUILD_SHARED_LIBS)
+    set (LIB_TYPE "Static")
+  endif (BUILD_SHARED_LIBS)
+
+  configure_file (
+      ${HDF_RESOURCES_DIR}/README.txt.cmake.in
+      ${CMAKE_BINARY_DIR}/README.txt @ONLY
+  )
+endmacro (HDF_README_PROPERTIES)
+
+macro (HDFTEST_COPY_FILE src dest target)
+    add_custom_command(
+        OUTPUT  "${dest}"
+        COMMAND "${CMAKE_COMMAND}"
+        ARGS     -E copy_if_different "${src}" "${dest}"
+        DEPENDS "${src}"
+    )
+    list (APPEND ${target}_list "${dest}")
+endmacro ()
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFTests.c b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFTests.c
new file mode 100644
index 0000000..8478d1b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFTests.c
@@ -0,0 +1,472 @@
+#define SIMPLE_TEST(x) int main(){ x; return 0; }
+
+#ifdef HAVE_C99_DESIGNATED_INITIALIZER
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+extern "C"
+#  endif
+int FC_DUMMY_MAIN()
+{ return 1;}
+#endif
+#endif
+int
+main ()
+{
+
+  typedef struct
+  {
+    int x;
+    union
+    {
+      int i;
+      double d;
+    }u;
+  }di_struct_t;
+  di_struct_t x =
+  { 0,
+    { .d = 0.0}};
+  ;
+  return 0;
+}
+
+#endif
+
+#ifdef HAVE_C99_FUNC
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+ const char *fname = __func__;
+  ;
+  return 0;
+}
+
+#endif
+
+#ifdef VSNPRINTF_WORKS
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int test_vsnprintf(const char *fmt,...)
+{
+    va_list     ap;
+    char *s = malloc(16);
+    int ret;
+
+    va_start(ap, fmt);
+    ret=vsnprintf(s,16,"%s",ap);
+    va_end(ap);
+
+    return(ret!=42 ? 1 : 0);
+}
+
+int main(void)
+{
+    return(test_vsnprintf("%s","A string that is longer than 16 characters"));
+}
+#endif
+
+
+#ifdef TIME_WITH_SYS_TIME
+/* Time with sys/time test */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+
+#endif
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+int main() { return 0; }
+#endif /* STDC_HEADERS */
+
+
+#ifdef HAVE_ATTRIBUTE
+
+#if 0
+static void test int __attribute((unused)) var)
+{
+  int __attribute__((unused)) x = var;
+}
+
+int main(void)
+{
+  test(19);
+}
+
+#else
+int
+main ()
+{
+int __attribute__((unused)) x
+  ;
+  return 0;
+}
+#endif
+
+
+#endif /* HAVE_ATTRIBUTE */
+
+#ifdef HAVE_FUNCTION
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+(void)__FUNCTION__
+  ;
+  return 0;
+}
+
+#endif /* HAVE_FUNCTION */
+
+#ifdef HAVE_TM_GMTOFF
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+SIMPLE_TEST(struct tm tm; tm.tm_gmtoff=0);
+
+#endif /* HAVE_TM_GMTOFF */
+
+#ifdef HAVE___TM_GMTOFF
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+SIMPLE_TEST(struct tm tm; tm.__tm_gmtoff=0);
+
+#endif /* HAVE_TM_GMTOFF */
+
+#ifdef HAVE_TIMEZONE
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+SIMPLE_TEST(timezone=0);
+
+#endif /* HAVE_TIMEZONE */
+
+#ifdef HAVE_STRUCT_TIMEZONE
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+SIMPLE_TEST(struct timezone tz; tz.tz_minuteswest=0);
+
+#endif /* HAVE_STRUCT_TIMEZONE */
+
+#ifdef HAVE_STAT_ST_BLOCKS
+
+#include <sys/stat.h>
+SIMPLE_TEST(struct stat sb; sb.st_blocks=0);
+
+#endif /* HAVE_STAT_ST_BLOCKS */
+
+#ifdef PRINTF_LL_WIDTH
+
+#ifdef HAVE_LONG_LONG
+#  define LL_TYPE long long
+#else /* HAVE_LONG_LONG */
+#  define LL_TYPE __int64
+#endif /* HAVE_LONG_LONG */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(void)
+{
+  char *llwidthArgs[] = { "I64", "l64", "l", "L", "q", "ll", NULL };
+  char *s = malloc(128);
+  char **currentArg = NULL;
+  LL_TYPE x = (LL_TYPE)1048576 * (LL_TYPE)1048576;
+  for (currentArg = llwidthArgs; *currentArg != NULL; currentArg++)
+    {
+    char formatString[64];
+    sprintf(formatString, "%%%sd", *currentArg);
+    sprintf(s, formatString, x);
+    if (strcmp(s, "1099511627776") == 0)
+      {
+      printf("PRINTF_LL_WIDTH=[%s]\n", *currentArg);
+      return 0;
+      }
+    }
+  return 1;
+}
+
+#endif /* PRINTF_LL_WIDTH */
+
+#ifdef SYSTEM_SCOPE_THREADS
+#include <stdlib.h>
+#include <pthread.h>
+
+int main(void)
+{
+    pthread_attr_t attribute;
+    int ret;
+
+    pthread_attr_init(&attribute);
+    ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
+    if (ret==0)
+        return 0;
+    return 1;
+}
+
+#endif /* SYSTEM_SCOPE_THREADS */
+
+#ifdef HAVE_SOCKLEN_T
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+SIMPLE_TEST(socklen_t foo);
+
+#endif /* HAVE_SOCKLEN_T */
+
+#ifdef DEV_T_IS_SCALAR
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+int main ()
+{
+  dev_t d1, d2;
+  if(d1==d2)
+    return 0;
+  return 1;
+}
+
+#endif /* DEV_T_IS_SCALAR */
+
+#ifdef HAVE_OFF64_T
+#include <sys/types.h>
+int main()
+{
+  off64_t n = 0;
+  return (int)n;
+}
+#endif
+
+#ifdef HAVE_STAT64_STRUCT
+#include <sys/types.h>
+#include <sys/stat.h>],
+struct stat64 sb;
+int main()
+{
+  return 0;
+}
+#endif
+
+#ifdef TEST_DIRECT_VFD_WORKS
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+int main(void)
+{
+   int fid;
+   if((fid=open("tst_file", O_CREAT | O_TRUNC | O_DIRECT, 0755))<0)
+       return 1;
+   close(fid);
+   remove("tst_file");
+   return 0;
+}
+#endif
+
+#ifdef HAVE_DIRECT
+       SIMPLE_TEST(posix_memalign());
+#endif
+
+#ifdef HAVE_DEFAULT_SOURCE
+/* check default source */
+#include <features.h>
+
+int
+main(void)
+{
+#ifdef __GLIBC_PREREQ
+  return __GLIBC_PREREQ(2,19);
+#else
+  return 0;
+#endif /* defined(__GLIBC_PREREQ) */
+}
+#endif
+
+#ifdef TEST_LFS_WORKS
+/* Return 0 when LFS is available and 1 otherwise.  */
+#define _LARGEFILE_SOURCE
+#define _LARGEFILE64_SOURCE
+#define _LARGE_FILES
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+  /* check that off_t can hold 2^63 - 1 and perform basic operations... */
+#define OFF_T_64 (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  if (OFF_T_64 % 2147483647 != 1)
+    return 1;
+
+  /* stat breaks on SCO OpenServer */
+  struct stat buf;
+  stat( argv[0], &buf );
+  if (!S_ISREG(buf.st_mode))
+    return 2;
+
+  FILE *file = fopen( argv[0], "r" );
+  off_t offset = ftello( file );
+  fseek( file, offset, SEEK_CUR );
+  fclose( file );
+  return 0;
+}
+#endif
+
+#ifdef GETTIMEOFDAY_GIVES_TZ
+#include <time.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+int main(void)
+{
+ struct timeval tv;
+ struct timezone tz;
+ tz.tz_minuteswest = 7777;  /* Initialize to an unreasonable number */
+ tz.tz_dsttime = 7;
+ gettimeofday(&tv, &tz);
+    /* Check whether the function returned any value at all */
+ if(tz.tz_minuteswest == 7777 && tz.tz_dsttime == 7)
+     return 1;
+ else return 0;
+}
+#endif
+
+#ifdef CXX_HAVE_OFFSETOF
+
+#include <stdio.h>
+#include <stddef.h>
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+extern "C"
+#  endif
+int FC_DUMMY_MAIN()
+{ return 1;}
+#endif
+#endif
+int
+main ()
+{
+
+  struct index_st
+  {
+    unsigned char type;
+    unsigned char num;
+    unsigned int len;
+  };
+  typedef struct index_st index_t;
+  int x,y;
+  x = offsetof(struct index_st, len);
+  y = offsetof(index_t, num)
+
+  ;
+  return 0;
+}
+
+#endif
+
+#ifdef HAVE_IOEO
+
+#include <windows.h>
+typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
+int main ()
+{
+	PGNSI pGNSI;
+	pGNSI = (PGNSI) GetProcAddress(
+      GetModuleHandle(TEXT("kernel32.dll")), 
+      "InitOnceExecuteOnce");
+	if(NULL == pGNSI)
+		return 1;
+	else
+		return 0;
+}
+
+#endif /* HAVE_IOEO */
+
+#ifdef HAVE_STRUCT_VIDEOCONFIG
+
+SIMPLE_TEST(struct videoconfig w; w.numtextcols=0);
+
+#endif /* HAVE_TM_GMTOFF */
+
+#ifdef HAVE_STRUCT_TEXT_INFO
+
+SIMPLE_TEST(struct text_info w; w.screenwidth=0);
+
+#endif /* HAVE_TM_GMTOFF */
+
+#if defined( HAVE_INLINE ) || defined( HAVE___INLINE__ ) || defined( HAVE___INLINE )
+#ifndef __cplusplus
+#if defined( HAVE_INLINE )
+#  define INLINE_KW inline
+#elif defined ( HAVE___INLINE__ )
+#  define INLINE_KW __inline__
+#elif defined ( HAVE___INLINE )
+#  define INLINE_KW __inline
+#endif /* HAVE_INLINE */
+typedef int foo_t;
+static INLINE_KW foo_t static_foo () { return 0; }
+INLINE_KW foo_t foo () {return 0; }
+int main(void) { return 0; }
+#endif /* __cplusplus */
+#endif /* defined( HAVE_INLINE ) || defined( HAVE___INLINE__ ) || defined( HAVE___INLINE ) */
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFUseFortran.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFUseFortran.cmake
new file mode 100644
index 0000000..275f2ea
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/HDFUseFortran.cmake
@@ -0,0 +1,179 @@
+#
+# This file provides functions for Fortran support.
+#
+#-------------------------------------------------------------------------------
+ENABLE_LANGUAGE (Fortran)
+
+#-----------------------------------------------------------------------------
+# Detect name mangling convention used between Fortran and C
+#-----------------------------------------------------------------------------
+include (FortranCInterface)
+FortranCInterface_HEADER (
+    ${CMAKE_BINARY_DIR}/FCMangle.h
+    MACRO_NAMESPACE "H5_FC_"
+    SYMBOL_NAMESPACE "H5_FC_"
+)
+
+file (STRINGS ${CMAKE_BINARY_DIR}/FCMangle.h CONTENTS REGEX "H5_FC_GLOBAL\\(.*,.*\\) +(.*)")
+string (REGEX MATCH "H5_FC_GLOBAL\\(.*,.*\\) +(.*)" RESULT ${CONTENTS})
+set (H5_FC_FUNC "H5_FC_FUNC(name,NAME) ${CMAKE_MATCH_1}")
+
+file (STRINGS ${CMAKE_BINARY_DIR}/FCMangle.h CONTENTS REGEX "H5_FC_GLOBAL_\\(.*,.*\\) +(.*)")
+string (REGEX MATCH "H5_FC_GLOBAL_\\(.*,.*\\) +(.*)" RESULT ${CONTENTS})
+set (H5_FC_FUNC_ "H5_FC_FUNC_(name,NAME) ${CMAKE_MATCH_1}")
+
+#-----------------------------------------------------------------------------
+# The provided CMake Fortran macros don't provide a general check function
+# so this one is used for a sizeof test.
+#-----------------------------------------------------------------------------
+MACRO (CHECK_FORTRAN_FEATURE FUNCTION CODE VARIABLE)
+    message (STATUS "Testing Fortran ${FUNCTION}")
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
+          "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    else (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
+    endif (CMAKE_REQUIRED_LIBRARIES)
+    file (WRITE
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f90
+        "${CODE}"
+    )
+    TRY_COMPILE (RESULT_VAR
+        ${CMAKE_BINARY_DIR}
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f90
+        CMAKE_FLAGS "${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}"
+        OUTPUT_VARIABLE OUTPUT
+    )
+
+#    message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+#    message ( "Test result ${OUTPUT}")
+#    message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+
+    if (${RESULT_VAR})
+      set (${VARIABLE} 1 CACHE INTERNAL "Have Fortran function ${FUNCTION}")
+      message (STATUS "Testing Fortran ${FUNCTION} - OK")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+          "Determining if the Fortran ${FUNCTION} exists passed with the following output:\n"
+          "${OUTPUT}\n\n"
+      )
+    else ()
+      message (STATUS "Testing Fortran ${FUNCTION} - Fail")
+      set (${VARIABLE} 0 CACHE INTERNAL "Have Fortran function ${FUNCTION}")
+      file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+          "Determining if the Fortran ${FUNCTION} exists failed with the following output:\n"
+          "${OUTPUT}\n\n")
+    endif ()
+
+ENDMACRO (CHECK_FORTRAN_FEATURE)
+
+#-----------------------------------------------------------------------------
+# Configure Checks which require Fortran compilation must go in here
+# not in the main ConfigureChecks.cmake files, because if the user has
+# no Fortran compiler, problems arise.
+#
+# Be careful with leading spaces here, do not remove them.
+#-----------------------------------------------------------------------------
+
+# Check for Non-standard extension intrinsic function SIZEOF
+set(FORTRAN_HAVE_SIZEOF FALSE)
+CHECK_FORTRAN_FEATURE(sizeof
+  "
+       PROGRAM main
+       i = sizeof(x)
+       END PROGRAM
+  "
+  FORTRAN_HAVE_SIZEOF
+)
+
+# Check for F2008 standard intrinsic function C_SIZEOF
+set(FORTRAN_HAVE_C_SIZEOF FALSE)
+CHECK_FORTRAN_FEATURE(c_sizeof
+  "
+       PROGRAM main
+         USE ISO_C_BINDING
+         INTEGER(C_INT) :: a
+         INTEGER(C_SIZE_T) :: result
+         result = c_sizeof(a)
+       END PROGRAM
+  "
+  FORTRAN_HAVE_C_SIZEOF
+)
+
+# Check for F2008 standard intrinsic function STORAGE_SIZE
+CHECK_FORTRAN_FEATURE(storage_size
+  "
+       PROGRAM main
+         INTEGER :: a
+         INTEGER :: result
+         result = storage_size(a)
+       END PROGRAM
+  "
+  FORTRAN_HAVE_STORAGE_SIZE
+)
+
+# Check for F2008 standard intrinsic module "ISO_FORTRAN_ENV"
+set(HAVE_ISO_FORTRAN_ENV FALSE)
+CHECK_FORTRAN_FEATURE(ISO_FORTRAN_ENV
+  "
+       PROGRAM main
+         USE, INTRINSIC :: ISO_FORTRAN_ENV
+       END PROGRAM
+  "
+  HAVE_ISO_FORTRAN_ENV
+)
+
+set(FORTRAN_DEFAULT_REAL_NOT_DOUBLE FALSE)
+CHECK_FORTRAN_FEATURE(RealIsNotDouble
+  "
+       MODULE type_mod
+         INTERFACE h5t
+           MODULE PROCEDURE h5t_real
+           MODULE PROCEDURE h5t_dble
+         END INTERFACE
+       CONTAINS
+         SUBROUTINE h5t_real(r)
+           REAL :: r
+         END SUBROUTINE h5t_real
+         SUBROUTINE h5t_dble(d)
+           DOUBLE PRECISION :: d
+         END SUBROUTINE h5t_dble
+       END MODULE type_mod
+       PROGRAM main
+         USE type_mod
+         REAL :: r
+         DOUBLE PRECISION :: d
+         CALL h5t(r)
+         CALL h5t(d)
+       END PROGRAM main
+  "
+  FORTRAN_DEFAULT_REAL_NOT_DOUBLE
+)
+
+#-----------------------------------------------------------------------------
+# Checks if the ISO_C_BINDING module meets all the requirements
+#-----------------------------------------------------------------------------
+set(FORTRAN_HAVE_ISO_C_BINDING FALSE)
+CHECK_FORTRAN_FEATURE(iso_c_binding
+  "
+       PROGRAM main
+            USE iso_c_binding
+            IMPLICIT NONE
+            TYPE(C_PTR) :: ptr
+            TYPE(C_FUNPTR) :: funptr
+            INTEGER(C_INT64_T) :: c_int64_type
+            CHARACTER(LEN=80, KIND=c_char), TARGET :: ichr
+            ptr = C_LOC(ichr(1:1))
+       END PROGRAM
+  "
+  FORTRAN_HAVE_ISO_C_BINDING
+)
+
+#-----------------------------------------------------------------------------
+# Add debug information (intel Fortran : JB)
+#-----------------------------------------------------------------------------
+if (CMAKE_Fortran_COMPILER MATCHES ifort)
+    if (WIN32)
+        set (CMAKE_Fortran_FLAGS_DEBUG "/debug:full /dbglibs " CACHE "flags" STRING FORCE)
+        set (CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE "flags" STRING FORCE)
+    endif (WIN32)
+endif (CMAKE_Fortran_COMPILER MATCHES ifort)
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.InstallOptions.ini.in b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.InstallOptions.ini.in
new file mode 100644
index 0000000..9954f28
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.InstallOptions.ini.in
@@ -0,0 +1,37 @@
+[Settings]
+NumFields=5
+
+[Field 1]
+Type=label
+Text=By default the @CPACK_PACKAGE_NAME@ bin directory is added to the system PATH. This allows shared library (dll) discovery (if installed) and running HDF5 tools from the command line.
+Left=0
+Right=-1
+Top=0
+Bottom=20
+
+[Field 2]
+Type=radiobutton
+Text=Do not add @CPACK_PACKAGE_NAME@ to the system PATH
+Left=0
+Right=-1
+Top=30
+Bottom=40
+State=0
+
+[Field 3]
+Type=radiobutton
+Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for all users
+Left=0
+Right=-1
+Top=40
+Bottom=50
+State=1
+
+[Field 4]
+Type=radiobutton
+Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for current user
+Left=0
+Right=-1
+Top=50
+Bottom=60
+State=0
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.template.in b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.template.in
new file mode 100644
index 0000000..ecced05
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/NSIS.template.in
@@ -0,0 +1,974 @@
+; CPack install script designed for a nmake build
+
+;--------------------------------
+; You must define these values
+
+  !define VERSION "@CPACK_PACKAGE_VERSION@"
+  !define PATCH  "@CPACK_PACKAGE_VERSION_PATCH@"
+  !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
+
+;--------------------------------
+;Variables
+
+  Var MUI_TEMP
+  Var STARTMENU_FOLDER
+  Var SV_ALLUSERS
+  Var START_MENU
+  Var DO_NOT_ADD_TO_PATH
+  Var ADD_TO_PATH_ALL_USERS
+  Var ADD_TO_PATH_CURRENT_USER
+  Var INSTALL_DESKTOP
+  Var IS_DEFAULT_INSTALLDIR
+;--------------------------------
+;Include Modern UI
+
+  !include "MUI.nsh"
+
+  ;Default installation folder
+  InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+;--------------------------------
+;General
+
+  ;Name and file
+  Name "@CPACK_NSIS_PACKAGE_NAME@"
+  OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
+
+  ;Set compression
+  SetCompressor @CPACK_NSIS_COMPRESSOR@
+
+ at CPACK_NSIS_DEFINES@
+
+  !include Sections.nsh
+
+;--- Component support macros: ---
+; The code for the add/remove functionality is from:
+;   http://nsis.sourceforge.net/Add/Remove_Functionality
+; It has been modified slightly and extended to provide
+; inter-component dependencies.
+Var AR_SecFlags
+Var AR_RegFlags
+ at CPACK_NSIS_SECTION_SELECTED_VARS@
+
+; Loads the "selected" flag for the section named SecName into the
+; variable VarName.
+!macro LoadSectionSelectedIntoVar SecName VarName
+ SectionGetFlags ${${SecName}} $${VarName}
+ IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits
+!macroend
+
+; Loads the value of a variable... can we get around this?
+!macro LoadVar VarName
+  IntOp $R0 0 + $${VarName}
+!macroend
+
+; Sets the value of a variable
+!macro StoreVar VarName IntValue
+  IntOp $${VarName} 0 + ${IntValue}
+!macroend
+
+!macro InitSection SecName
+  ;  This macro reads component installed flag from the registry and
+  ;changes checked state of the section on the components page.
+  ;Input: section index constant name specified in Section command.
+
+  ClearErrors
+  ;Reading component status from registry
+  ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed"
+  IfErrors "default_${SecName}"
+    ;Status will stay default if registry value not found
+    ;(component was never installed)
+  IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
+  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags
+  IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off
+  IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit
+
+  ; Note whether this component was installed before
+  !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
+  IntOp $R0 $AR_RegFlags & $AR_RegFlags
+
+  ;Writing modified flags
+  SectionSetFlags ${${SecName}} $AR_SecFlags
+
+ "default_${SecName}:"
+ !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
+!macroend
+
+!macro FinishSection SecName
+  ;  This macro reads section flag set by user and removes the section
+  ;if it is not selected.
+  ;Then it writes component installed flag to registry
+  ;Input: section index constant name specified in Section command.
+
+  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags
+  ;Checking lowest bit:
+  IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}
+  IntCmp $AR_SecFlags 1 "leave_${SecName}"
+    ;Section is not selected:
+    ;Calling Section uninstall macro and writing zero installed flag
+    !insertmacro "Remove_${${SecName}}"
+    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
+  "Installed" 0
+    Goto "exit_${SecName}"
+
+ "leave_${SecName}:"
+    ;Section is selected:
+    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
+  "Installed" 1
+
+ "exit_${SecName}:"
+!macroend
+
+!macro RemoveSection_CPack SecName
+  ;  This macro is used to call section's Remove_... macro
+  ;from the uninstaller.
+  ;Input: section index constant name specified in Section command.
+
+  !insertmacro "Remove_${${SecName}}"
+!macroend
+
+; Determine whether the selection of SecName changed
+!macro MaybeSelectionChanged SecName
+  !insertmacro LoadVar ${SecName}_selected
+  SectionGetFlags ${${SecName}} $R1
+  IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
+
+  ; See if the status has changed:
+  IntCmp $R0 $R1 "${SecName}_unchanged"
+  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
+
+  IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
+  !insertmacro "Deselect_required_by_${SecName}"
+  goto "${SecName}_unchanged"
+
+  "${SecName}_was_selected:"
+  !insertmacro "Select_${SecName}_depends"
+
+  "${SecName}_unchanged:"
+!macroend
+;--- End of Add/Remove macros ---
+
+;--------------------------------
+;Interface Settings
+
+  !define MUI_HEADERIMAGE
+  !define MUI_ABORTWARNING
+
+;--------------------------------
+; path functions
+
+!verbose 3
+!include "WinMessages.NSH"
+!verbose 4
+
+;----------------------------------------
+; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
+;----------------------------------------
+!verbose 3
+!include "WinMessages.NSH"
+!verbose 4
+;====================================================
+; get_NT_environment
+;     Returns: the selected environment
+;     Output : head of the stack
+;====================================================
+!macro select_NT_profile UN
+Function ${UN}select_NT_profile
+   StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single
+      DetailPrint "Selected environment for all users"
+      Push "all"
+      Return
+   environment_single:
+      DetailPrint "Selected environment for current user only."
+      Push "current"
+      Return
+FunctionEnd
+!macroend
+!insertmacro select_NT_profile ""
+!insertmacro select_NT_profile "un."
+;----------------------------------------------------
+!define NT_current_env 'HKCU "Environment"'
+!define NT_all_env     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+
+!ifndef WriteEnvStr_RegKey
+  !ifdef ALL_USERS
+    !define WriteEnvStr_RegKey \
+       'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+  !else
+    !define WriteEnvStr_RegKey 'HKCU "Environment"'
+  !endif
+!endif
+
+; AddToPath - Adds the given dir to the search path.
+;        Input - head of the stack
+;        Note - Win9x systems requires reboot
+
+Function AddToPath
+  Exch $0
+  Push $1
+  Push $2
+  Push $3
+
+  # don't add if the path doesn't exist
+  IfFileExists "$0\*.*" "" AddToPath_done
+
+  ReadEnvStr $1 PATH
+  ; if the path is too long for a NSIS variable NSIS will return a 0
+  ; length string.  If we find that, then warn and skip any path
+  ; modification as it will trash the existing path.
+  StrLen $2 $1
+  IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done
+    CheckPathLength_ShowPathWarning:
+    Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!"
+    Goto AddToPath_done
+  CheckPathLength_Done:
+  Push "$1;"
+  Push "$0;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  Push "$1;"
+  Push "$0\;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  GetFullPathName /SHORT $3 $0
+  Push "$1;"
+  Push "$3;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  Push "$1;"
+  Push "$3\;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+
+  Call IsNT
+  Pop $1
+  StrCmp $1 1 AddToPath_NT
+    ; Not on NT
+    StrCpy $1 $WINDIR 2
+    FileOpen $1 "$1\autoexec.bat" a
+    FileSeek $1 -1 END
+    FileReadByte $1 $2
+    IntCmp $2 26 0 +2 +2 # DOS EOF
+      FileSeek $1 -1 END # write over EOF
+    FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
+    FileClose $1
+    SetRebootFlag true
+    Goto AddToPath_done
+
+  AddToPath_NT:
+    StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey
+      ReadRegStr $1 ${NT_current_env} "PATH"
+      Goto DoTrim
+    ReadAllKey:
+      ReadRegStr $1 ${NT_all_env} "PATH"
+    DoTrim:
+    StrCmp $1 "" AddToPath_NTdoIt
+      Push $1
+      Call Trim
+      Pop $1
+      StrCpy $0 "$1;$0"
+    AddToPath_NTdoIt:
+      StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey
+        WriteRegExpandStr ${NT_current_env} "PATH" $0
+        Goto DoSend
+      WriteAllKey:
+        WriteRegExpandStr ${NT_all_env} "PATH" $0
+      DoSend:
+      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+  AddToPath_done:
+    Pop $3
+    Pop $2
+    Pop $1
+    Pop $0
+FunctionEnd
+
+
+; RemoveFromPath - Remove a given dir from the path
+;     Input: head of the stack
+
+Function un.RemoveFromPath
+  Exch $0
+  Push $1
+  Push $2
+  Push $3
+  Push $4
+  Push $5
+  Push $6
+
+  IntFmt $6 "%c" 26 # DOS EOF
+
+  Call un.IsNT
+  Pop $1
+  StrCmp $1 1 unRemoveFromPath_NT
+    ; Not on NT
+    StrCpy $1 $WINDIR 2
+    FileOpen $1 "$1\autoexec.bat" r
+    GetTempFileName $4
+    FileOpen $2 $4 w
+    GetFullPathName /SHORT $0 $0
+    StrCpy $0 "SET PATH=%PATH%;$0"
+    Goto unRemoveFromPath_dosLoop
+
+    unRemoveFromPath_dosLoop:
+      FileRead $1 $3
+      StrCpy $5 $3 1 -1 # read last char
+      StrCmp $5 $6 0 +2 # if DOS EOF
+        StrCpy $3 $3 -1 # remove DOS EOF so we can compare
+      StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "" unRemoveFromPath_dosLoopEnd
+      FileWrite $2 $3
+      Goto unRemoveFromPath_dosLoop
+      unRemoveFromPath_dosLoopRemoveLine:
+        SetRebootFlag true
+        Goto unRemoveFromPath_dosLoop
+
+    unRemoveFromPath_dosLoopEnd:
+      FileClose $2
+      FileClose $1
+      StrCpy $1 $WINDIR 2
+      Delete "$1\autoexec.bat"
+      CopyFiles /SILENT $4 "$1\autoexec.bat"
+      Delete $4
+      Goto unRemoveFromPath_done
+
+  unRemoveFromPath_NT:
+    StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey
+      ReadRegStr $1 ${NT_current_env} "PATH"
+      Goto unDoTrim
+    unReadAllKey:
+      ReadRegStr $1 ${NT_all_env} "PATH"
+    unDoTrim:
+    StrCpy $5 $1 1 -1 # copy last char
+    StrCmp $5 ";" +2 # if last char != ;
+      StrCpy $1 "$1;" # append ;
+    Push $1
+    Push "$0;"
+    Call un.StrStr ; Find `$0;` in $1
+    Pop $2 ; pos of our dir
+    StrCmp $2 "" unRemoveFromPath_done
+      ; else, it is in path
+      # $0 - path to add
+      # $1 - path var
+      StrLen $3 "$0;"
+      StrLen $4 $2
+      StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
+      StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
+      StrCpy $3 $5$6
+
+      StrCpy $5 $3 1 -1 # copy last char
+      StrCmp $5 ";" 0 +2 # if last char == ;
+        StrCpy $3 $3 -1 # remove last char
+
+      StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey
+        WriteRegExpandStr ${NT_current_env} "PATH" $3
+        Goto unDoSend
+      unWriteAllKey:
+        WriteRegExpandStr ${NT_all_env} "PATH" $3
+      unDoSend:
+      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+  unRemoveFromPath_done:
+    Pop $6
+    Pop $5
+    Pop $4
+    Pop $3
+    Pop $2
+    Pop $1
+    Pop $0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Uninstall sutff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+###########################################
+#            Utility Functions            #
+###########################################
+
+;====================================================
+; IsNT - Returns 1 if the current system is NT, 0
+;        otherwise.
+;     Output: head of the stack
+;====================================================
+; IsNT
+; no input
+; output, top of the stack = 1 if NT or 0 if not
+;
+; Usage:
+;   Call IsNT
+;   Pop $R0
+;  ($R0 at this point is 1 or 0)
+
+!macro IsNT un
+Function ${un}IsNT
+  Push $0
+  ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+  StrCmp $0 "" 0 IsNT_yes
+  ; we are not NT.
+  Pop $0
+  Push 0
+  Return
+
+  IsNT_yes:
+    ; NT!!!
+    Pop $0
+    Push 1
+FunctionEnd
+!macroend
+!insertmacro IsNT ""
+!insertmacro IsNT "un."
+
+; StrStr
+; input, top of stack = string to search for
+;        top of stack-1 = string to search in
+; output, top of stack (replaces with the portion of the string remaining)
+; modifies no other variables.
+;
+; Usage:
+;   Push "this is a long ass string"
+;   Push "ass"
+;   Call StrStr
+;   Pop $R0
+;  ($R0 at this point is "ass string")
+
+!macro StrStr un
+Function ${un}StrStr
+Exch $R1 ; st=haystack,old$R1, $R1=needle
+  Exch    ; st=old$R1,haystack
+  Exch $R2 ; st=old$R1,old$R2, $R2=haystack
+  Push $R3
+  Push $R4
+  Push $R5
+  StrLen $R3 $R1
+  StrCpy $R4 0
+  ; $R1=needle
+  ; $R2=haystack
+  ; $R3=len(needle)
+  ; $R4=cnt
+  ; $R5=tmp
+  loop:
+    StrCpy $R5 $R2 $R3 $R4
+    StrCmp $R5 $R1 done
+    StrCmp $R5 "" done
+    IntOp $R4 $R4 + 1
+    Goto loop
+done:
+  StrCpy $R1 $R2 "" $R4
+  Pop $R5
+  Pop $R4
+  Pop $R3
+  Pop $R2
+  Exch $R1
+FunctionEnd
+!macroend
+!insertmacro StrStr ""
+!insertmacro StrStr "un."
+
+Function Trim ; Added by Pelaca
+	Exch $R1
+	Push $R2
+Loop:
+	StrCpy $R2 "$R1" 1 -1
+	StrCmp "$R2" " " RTrim
+	StrCmp "$R2" "$\n" RTrim
+	StrCmp "$R2" "$\r" RTrim
+	StrCmp "$R2" ";" RTrim
+	GoTo Done
+RTrim:
+	StrCpy $R1 "$R1" -1
+	Goto Loop
+Done:
+	Pop $R2
+	Exch $R1
+FunctionEnd
+
+Function ConditionalAddToRegisty
+  Pop $0
+  Pop $1
+  StrCmp "$0" "" ConditionalAddToRegisty_EmptyString
+    WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \
+    "$1" "$0"
+    ;MessageBox MB_OK "Set Registry: '$1' to '$0'"
+    DetailPrint "Set install registry entry: '$1' to '$0'"
+  ConditionalAddToRegisty_EmptyString:
+FunctionEnd
+
+;--------------------------------
+
+!ifdef CPACK_USES_DOWNLOAD
+Function DownloadFile
+    IfFileExists $INSTDIR\* +2
+    CreateDirectory $INSTDIR
+    Pop $0
+
+    ; Skip if already downloaded
+    IfFileExists $INSTDIR\$0 0 +2
+    Return
+
+    StrCpy $1 "@CPACK_DOWNLOAD_SITE@"
+
+  try_again:
+    NSISdl::download "$1/$0" "$INSTDIR\$0"
+
+    Pop $1
+    StrCmp $1 "success" success
+    StrCmp $1 "Cancelled" cancel
+    MessageBox MB_OK "Download failed: $1"
+  cancel:
+    Return
+  success:
+FunctionEnd
+!endif
+
+;--------------------------------
+; Installation types
+ at CPACK_NSIS_INSTALLATION_TYPES@
+
+;--------------------------------
+; Component sections
+ at CPACK_NSIS_COMPONENT_SECTIONS@
+
+;--------------------------------
+; Define some macro setting for the gui
+ at CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
+ at CPACK_NSIS_INSTALLER_ICON_CODE@
+ at CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
+ at CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@
+
+;--------------------------------
+;Pages
+  !insertmacro MUI_PAGE_WELCOME
+
+  !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
+  Page custom InstallOptionsPage
+  !insertmacro MUI_PAGE_DIRECTORY
+
+  ;Start Menu Folder Page Configuration
+  !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
+  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+  !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
+
+  @CPACK_NSIS_PAGE_COMPONENTS@
+
+  !insertmacro MUI_PAGE_INSTFILES
+  !insertmacro MUI_PAGE_FINISH
+
+  !insertmacro MUI_UNPAGE_CONFIRM
+  !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+  !insertmacro MUI_LANGUAGE "English" ;first language is the default language
+  !insertmacro MUI_LANGUAGE "Albanian"
+  !insertmacro MUI_LANGUAGE "Arabic"
+  !insertmacro MUI_LANGUAGE "Basque"
+  !insertmacro MUI_LANGUAGE "Belarusian"
+  !insertmacro MUI_LANGUAGE "Bosnian"
+  !insertmacro MUI_LANGUAGE "Breton"
+  !insertmacro MUI_LANGUAGE "Bulgarian"
+  !insertmacro MUI_LANGUAGE "Croatian"
+  !insertmacro MUI_LANGUAGE "Czech"
+  !insertmacro MUI_LANGUAGE "Danish"
+  !insertmacro MUI_LANGUAGE "Dutch"
+  !insertmacro MUI_LANGUAGE "Estonian"
+  !insertmacro MUI_LANGUAGE "Farsi"
+  !insertmacro MUI_LANGUAGE "Finnish"
+  !insertmacro MUI_LANGUAGE "French"
+  !insertmacro MUI_LANGUAGE "German"
+  !insertmacro MUI_LANGUAGE "Greek"
+  !insertmacro MUI_LANGUAGE "Hebrew"
+  !insertmacro MUI_LANGUAGE "Hungarian"
+  !insertmacro MUI_LANGUAGE "Icelandic"
+  !insertmacro MUI_LANGUAGE "Indonesian"
+  !insertmacro MUI_LANGUAGE "Irish"
+  !insertmacro MUI_LANGUAGE "Italian"
+  !insertmacro MUI_LANGUAGE "Japanese"
+  !insertmacro MUI_LANGUAGE "Korean"
+  !insertmacro MUI_LANGUAGE "Kurdish"
+  !insertmacro MUI_LANGUAGE "Latvian"
+  !insertmacro MUI_LANGUAGE "Lithuanian"
+  !insertmacro MUI_LANGUAGE "Luxembourgish"
+  !insertmacro MUI_LANGUAGE "Macedonian"
+  !insertmacro MUI_LANGUAGE "Malay"
+  !insertmacro MUI_LANGUAGE "Mongolian"
+  !insertmacro MUI_LANGUAGE "Norwegian"
+  !insertmacro MUI_LANGUAGE "Polish"
+  !insertmacro MUI_LANGUAGE "Portuguese"
+  !insertmacro MUI_LANGUAGE "PortugueseBR"
+  !insertmacro MUI_LANGUAGE "Romanian"
+  !insertmacro MUI_LANGUAGE "Russian"
+  !insertmacro MUI_LANGUAGE "Serbian"
+  !insertmacro MUI_LANGUAGE "SerbianLatin"
+  !insertmacro MUI_LANGUAGE "SimpChinese"
+  !insertmacro MUI_LANGUAGE "Slovak"
+  !insertmacro MUI_LANGUAGE "Slovenian"
+  !insertmacro MUI_LANGUAGE "Spanish"
+  !insertmacro MUI_LANGUAGE "Swedish"
+  !insertmacro MUI_LANGUAGE "Thai"
+  !insertmacro MUI_LANGUAGE "TradChinese"
+  !insertmacro MUI_LANGUAGE "Turkish"
+  !insertmacro MUI_LANGUAGE "Ukrainian"
+  !insertmacro MUI_LANGUAGE "Welsh"
+
+
+;--------------------------------
+;Reserve Files
+
+  ;These files should be inserted before other files in the data block
+  ;Keep these lines before any File command
+  ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)
+
+  ReserveFile "NSIS.InstallOptions.ini"
+  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+;--------------------------------
+;Installer Sections
+
+Section "-Core installation"
+  ;Use the entire tree produced by the INSTALL target.  Keep the
+  ;list of directories here in sync with the RMDir commands below.
+  SetOutPath "$INSTDIR"
+  @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@
+  @CPACK_NSIS_FULL_INSTALL@
+
+  ;Store installation folder
+  WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
+
+  ;Create uninstaller
+  WriteUninstaller "$INSTDIR\Uninstall.exe"
+  Push "DisplayName"
+  Push "@CPACK_NSIS_DISPLAY_NAME@"
+  Call ConditionalAddToRegisty
+  Push "DisplayVersion"
+  Push "@CPACK_PACKAGE_VERSION@"
+  Call ConditionalAddToRegisty
+  Push "Publisher"
+  Push "@CPACK_PACKAGE_VENDOR@"
+  Call ConditionalAddToRegisty
+  Push "UninstallString"
+  Push "$INSTDIR\Uninstall.exe"
+  Call ConditionalAddToRegisty
+  Push "NoRepair"
+  Push "1"
+  Call ConditionalAddToRegisty
+
+  !ifdef CPACK_NSIS_ADD_REMOVE
+  ;Create add/remove functionality
+  Push "ModifyPath"
+  Push "$INSTDIR\AddRemove.exe"
+  Call ConditionalAddToRegisty
+  !else
+  Push "NoModify"
+  Push "1"
+  Call ConditionalAddToRegisty
+  !endif
+
+  ; Optional registration
+  Push "DisplayIcon"
+  Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
+  Call ConditionalAddToRegisty
+  Push "HelpLink"
+  Push "@CPACK_NSIS_HELP_LINK@"
+  Call ConditionalAddToRegisty
+  Push "URLInfoAbout"
+  Push "@CPACK_NSIS_URL_INFO_ABOUT@"
+  Call ConditionalAddToRegisty
+  Push "Contact"
+  Push "@CPACK_NSIS_CONTACT@"
+  Call ConditionalAddToRegisty
+  !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State"
+  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+  ;Create shortcuts
+  CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
+ at CPACK_NSIS_CREATE_ICONS@
+ at CPACK_NSIS_CREATE_ICONS_EXTRA@
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+
+  ;Read a value from an InstallOptions INI file
+  !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State"
+  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State"
+  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State"
+
+  ; Write special uninstall registry entries
+  Push "StartMenu"
+  Push "$STARTMENU_FOLDER"
+  Call ConditionalAddToRegisty
+  Push "DoNotAddToPath"
+  Push "$DO_NOT_ADD_TO_PATH"
+  Call ConditionalAddToRegisty
+  Push "AddToPathAllUsers"
+  Push "$ADD_TO_PATH_ALL_USERS"
+  Call ConditionalAddToRegisty
+  Push "AddToPathCurrentUser"
+  Push "$ADD_TO_PATH_CURRENT_USER"
+  Call ConditionalAddToRegisty
+  Push "InstallToDesktop"
+  Push "$INSTALL_DESKTOP"
+  Call ConditionalAddToRegisty
+
+  !insertmacro MUI_STARTMENU_WRITE_END
+
+ at CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
+
+SectionEnd
+
+Section "-Add to path"
+  Push $INSTDIR\bin
+  StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath
+  StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0
+    Call AddToPath
+  doNotAddToPath:
+SectionEnd
+
+;--------------------------------
+; Create custom pages
+Function InstallOptionsPage
+  !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@"
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"
+
+FunctionEnd
+
+;--------------------------------
+; determine admin versus local install
+Function un.onInit
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors noLM
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" 0 +3
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Admin group'
+    Goto done
+  StrCmp $1 "Power" 0 +3
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Power Users group'
+    Goto done
+
+  noLM:
+    ;Get installation folder from registry if available
+
+  done:
+
+FunctionEnd
+
+;--- Add/Remove callback functions: ---
+!macro SectionList MacroName
+  ;This macro used to perform operation on multiple sections.
+  ;List all of your components in following manner here.
+ at CPACK_NSIS_COMPONENT_SECTION_LIST@
+!macroend
+
+Section -FinishComponents
+  ;Removes unselected components and writes component status to registry
+  !insertmacro SectionList "FinishSection"
+
+!ifdef CPACK_NSIS_ADD_REMOVE
+  ; Get the name of the installer executable
+  System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
+  StrCpy $R3 $R0
+
+  ; Strip off the last 13 characters, to see if we have AddRemove.exe
+  StrLen $R1 $R0
+  IntOp $R1 $R0 - 13
+  StrCpy $R2 $R0 13 $R1
+  StrCmp $R2 "AddRemove.exe" addremove_installed
+
+  ; We're not running AddRemove.exe, so install it
+  CopyFiles $R3 $INSTDIR\AddRemove.exe
+
+  addremove_installed:
+!endif
+SectionEnd
+;--- End of Add/Remove callback functions ---
+
+;--------------------------------
+; Component dependencies
+Function .onSelChange
+  !insertmacro SectionList MaybeSelectionChanged
+FunctionEnd
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+  ReadRegStr $START_MENU SHCTX \
+   "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu"
+  ;MessageBox MB_OK "Start menu is in: $START_MENU"
+  ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath"
+  ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers"
+  ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser"
+  ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"
+  ReadRegStr $INSTALL_DESKTOP SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop"
+  ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
+
+ at CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
+
+  ;Remove files we installed.
+  ;Keep the list of directories here in sync with the File commands above.
+ at CPACK_NSIS_DELETE_FILES@
+ at CPACK_NSIS_DELETE_DIRECTORIES@
+
+!ifdef CPACK_NSIS_ADD_REMOVE
+  ;Remove the add/remove program
+  Delete "$INSTDIR\AddRemove.exe"
+!endif
+
+  ;Remove the uninstaller itself.
+  Delete "$INSTDIR\Uninstall.exe"
+  DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  ;Remove the installation directory if it is empty.
+  RMDir "$INSTDIR"
+
+  ; Remove the registry entries.
+  DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  ; Removes all optional components
+  !insertmacro SectionList "RemoveSection_CPack"
+
+  !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
+
+  Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
+ at CPACK_NSIS_DELETE_ICONS@
+ at CPACK_NSIS_DELETE_ICONS_EXTRA@
+
+  ;Delete empty start menu parent diretories
+  StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
+
+  startMenuDeleteLoop:
+    ClearErrors
+    RMDir $MUI_TEMP
+    GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
+
+    IfErrors startMenuDeleteLoopDone
+
+    StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop
+  startMenuDeleteLoopDone:
+
+  ; If the user changed the shortcut, then untinstall may not work. This should
+  ; try to fix it.
+  StrCpy $MUI_TEMP "$START_MENU"
+  Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
+ at CPACK_NSIS_DELETE_ICONS_EXTRA@
+
+  ;Delete empty start menu parent diretories
+  StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
+
+  secondStartMenuDeleteLoop:
+    ClearErrors
+    RMDir $MUI_TEMP
+    GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
+
+    IfErrors secondStartMenuDeleteLoopDone
+
+    StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop
+  secondStartMenuDeleteLoopDone:
+
+  DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  Push $INSTDIR\bin
+  StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0
+    Call un.RemoveFromPath
+  doNotRemoveFromPath:
+SectionEnd
+
+;--------------------------------
+; determine admin versus local install
+; Is install for "AllUsers" or "JustMe"?
+; Default to "JustMe" - set to "AllUsers" if admin or on Win9x
+; This function is used for the very first "custom page" of the installer.
+; This custom page does not show up visibly, but it executes prior to the
+; first visible page and sets up $INSTDIR properly...
+; Choose different default installation folder based on SV_ALLUSERS...
+; "Program Files" for AllUsers, "My Documents" for JustMe...
+
+Function .onInit
+  StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst
+
+  ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString"
+  StrCmp $0 "" inst
+
+  MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
+  "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \
+  IDYES uninst IDNO inst
+  Abort
+
+;Run the uninstaller
+uninst:
+  ClearErrors
+  StrLen $2 "\Uninstall.exe"
+  StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path
+  ExecWait '$0 _?=$3' ;Do not copy the uninstaller to a temp file
+
+  IfErrors uninst_failed inst
+uninst_failed:
+  MessageBox MB_OK|MB_ICONSTOP "Uninstall failed."
+  Abort
+
+
+inst:
+  ; Reads components status for registry
+  !insertmacro SectionList "InitSection"
+
+  ; check to see if /D has been used to change
+  ; the install directory by comparing it to the
+  ; install directory that is expected to be the
+  ; default
+  StrCpy $IS_DEFAULT_INSTALLDIR 0
+  StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2
+    StrCpy $IS_DEFAULT_INSTALLDIR 1
+
+  StrCpy $SV_ALLUSERS "JustMe"
+  ; if default install dir then change the default
+  ; if it is installed for JustMe
+  StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
+    StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors noLM
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" 0 +4
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Admin group'
+    StrCpy $SV_ALLUSERS "AllUsers"
+    Goto done
+  StrCmp $1 "Power" 0 +4
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Power Users group'
+    StrCpy $SV_ALLUSERS "AllUsers"
+    Goto done
+
+  noLM:
+    StrCpy $SV_ALLUSERS "AllUsers"
+    ;Get installation folder from registry if available
+
+  done:
+  StrCmp $SV_ALLUSERS "AllUsers" 0 +3
+    StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
+      StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+  StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage
+    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini"
+
+  noOptionsPage:
+FunctionEnd
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/grepTest.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/grepTest.cmake
new file mode 100644
index 0000000..a090057
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/grepTest.cmake
@@ -0,0 +1,64 @@
+# grepTest.cmake executes a command and captures the output in a file. File is then compared
+# against a reference file. Exit status of command can also be compared.
+
+# arguments checking
+if (NOT TEST_PROGRAM)
+  message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
+endif (NOT TEST_PROGRAM)
+#if (NOT TEST_ARGS)
+#  message (STATUS "Require TEST_ARGS to be defined")
+#endif (NOT TEST_ARGS)
+if (NOT TEST_FOLDER)
+  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
+endif (NOT TEST_FOLDER)
+if (NOT TEST_OUTPUT)
+  message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
+endif (NOT TEST_OUTPUT)
+#if (NOT TEST_EXPECT)
+#  message (STATUS "Require TEST_EXPECT to be defined")
+#endif (NOT TEST_EXPECT)
+if (NOT TEST_FILTER)
+  message (STATUS "Require TEST_FILTER to be defined")
+endif (NOT TEST_FILTER)
+if (NOT TEST_REFERENCE)
+  message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
+endif (NOT TEST_REFERENCE)
+
+message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
+
+# run the test program, capture the stdout/stderr and the result var
+execute_process (
+    COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
+    WORKING_DIRECTORY ${TEST_FOLDER}
+    RESULT_VARIABLE TEST_RESULT
+    OUTPUT_FILE ${TEST_OUTPUT}
+    ERROR_FILE ${TEST_OUTPUT}.err
+    OUTPUT_VARIABLE TEST_OUT
+    ERROR_VARIABLE TEST_ERROR
+)
+
+message (STATUS "COMMAND Result: ${TEST_RESULT}")
+message (STATUS "COMMAND Error: ${TEST_ERROR}")
+
+# now grep the output with the reference
+file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+
+# TEST_REFERENCE should always be matched
+string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM})
+string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_RESULT)
+if (${TEST_RESULT} STREQUAL "0")
+  message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}")
+endif (${TEST_RESULT} STREQUAL "0")
+
+string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM})
+if (${TEST_EXPECT} STREQUAL "1")
+  # TEST_EXPECT (1) interperts TEST_FILTER as NOT to match
+  string (LENGTH "${TEST_MATCH}" TEST_RESULT)
+  if (NOT ${TEST_RESULT} STREQUAL "0")
+    message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}")
+  endif (NOT ${TEST_RESULT} STREQUAL "0")
+endif (${TEST_EXPECT} STREQUAL "1")
+
+# everything went fine...
+message ("Passed: The output of ${TEST_PROGRAM} matched")
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.bmp b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.bmp
new file mode 100644
index 0000000..9e9e4aa
Binary files /dev/null and b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.bmp differ
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.icns b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.icns
new file mode 100644
index 0000000..66f025d
Binary files /dev/null and b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.icns differ
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.ico b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.ico
new file mode 100644
index 0000000..26abc96
Binary files /dev/null and b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/hdf.ico differ
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/prunTest.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/prunTest.cmake
new file mode 100644
index 0000000..38ecb7e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/prunTest.cmake
@@ -0,0 +1,145 @@
+# runTest.cmake executes a command and captures the output in a file. File is then compared
+# against a reference file. Exit status of command can also be compared.
+cmake_policy(SET CMP0007 NEW)
+
+# arguments checking
+if (NOT TEST_PROGRAM)
+  message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
+endif (NOT TEST_PROGRAM)
+#if (NOT TEST_ARGS)
+#  message (STATUS "Require TEST_ARGS to be defined")
+#endif (NOT TEST_ARGS)
+if (NOT TEST_FOLDER)
+  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
+endif (NOT TEST_FOLDER)
+if (NOT TEST_OUTPUT)
+  message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
+endif (NOT TEST_OUTPUT)
+#if (NOT TEST_EXPECT)
+#  message (STATUS "Require TEST_EXPECT to be defined")
+#endif (NOT TEST_EXPECT)
+#if (NOT TEST_FILTER)
+#  message (STATUS "Require TEST_FILTER to be defined")
+#endif (NOT TEST_FILTER)
+if (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
+  message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
+endif (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
+
+set (ERROR_APPEND 1)
+
+message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
+
+if (TEST_ENV_VAR)
+  set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}")
+endif (TEST_ENV_VAR)
+
+# run the test program, capture the stdout/stderr and the result var
+EXECUTE_PROCESS (
+    COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
+    WORKING_DIRECTORY ${TEST_FOLDER}
+    RESULT_VARIABLE TEST_RESULT
+    OUTPUT_FILE ${TEST_OUTPUT}
+    ERROR_FILE ${TEST_OUTPUT}.err
+    OUTPUT_VARIABLE TEST_OUT
+    ERROR_VARIABLE TEST_ERROR
+)
+
+message (STATUS "COMMAND Result: ${TEST_RESULT}")
+
+file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
+file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
+
+if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
+  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+
+if (TEST_APPEND)
+  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_ERROR}\n")
+endif (TEST_APPEND)
+
+message (STATUS "COMMAND Error: ${TEST_ERROR}")
+
+if (TEST_MASK)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  STRING(REGEX REPLACE "Storage:[^\n]+\n" "Storage:   <details removed for portability>\n" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif (TEST_MASK)
+
+if (TEST_MASK_MOD)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  STRING(REGEX REPLACE "Modified:[^\n]+\n" "Modified:  XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif (TEST_MASK_MOD)
+
+if (TEST_MASK_ERROR)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  STRING(REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE " line [0-9]*" " line (number)" TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE "v[1-9]*[.][0-9]*[.]" "version (number)." TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE "H5Eget_auto[1-2]*" "H5Eget_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
+  STRING(REGEX REPLACE "H5Eset_auto[1-2]*" "H5Eset_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif (TEST_MASK_ERROR)
+
+if (TEST_FILTER)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  STRING(REGEX REPLACE "${TEST_FILTER}" "" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif (TEST_FILTER)
+
+#if (TEST_REF_FILTER)
+#  message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}")
+#  file (READ ${TEST_FOLDER}/P_${TEST_REFERENCE} TEST_STREAM)
+#  STRING(REGEX REPLACE "${TEST_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}")
+#  file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
+#endif (TEST_REF_FILTER)
+
+if (NOT TEST_SKIP_COMPARE)
+  if (WIN32 AND NOT MINGW)
+    file (READ ${TEST_FOLDER}/P_${TEST_REFERENCE} TEST_STREAM)
+    file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
+  endif (WIN32 AND NOT MINGW)
+
+  # now compare the output with the reference
+  EXECUTE_PROCESS (
+      COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/P_${TEST_REFERENCE}
+      RESULT_VARIABLE TEST_RESULT
+  )
+  if (NOT ${TEST_RESULT} STREQUAL 0)
+  set (TEST_RESULT 0)
+  file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
+  LIST (LENGTH test_act len_act)
+  file (STRINGS ${TEST_FOLDER}/P_${TEST_REFERENCE} test_ref)
+  LIST (LENGTH test_ref len_ref)
+  if (NOT ${len_act} STREQUAL "0")
+    MATH (EXPR _FP_LEN "${len_ref} - 1")
+    foreach (line RANGE 0 ${_FP_LEN})
+      LIST (GET test_act ${line} str_act)
+      LIST (GET test_ref ${line} str_ref)
+      if (NOT "${str_act}" STREQUAL "${str_ref}")
+        if (NOT "${str_act}" STREQUAL "")
+          set (TEST_RESULT 1)
+          message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+         endif (NOT "${str_act}" STREQUAL "")
+      endif (NOT "${str_act}" STREQUAL "${str_ref}")
+    endforeach (line RANGE 0 ${_FP_LEN})
+  endif (NOT ${len_act} STREQUAL "0")
+  if (NOT ${len_act} STREQUAL ${len_ref})
+    set (TEST_RESULT 1)
+  endif (NOT ${len_act} STREQUAL ${len_ref})
+  endif (NOT ${TEST_RESULT} STREQUAL 0)
+
+  message (STATUS "COMPARE Result: ${TEST_RESULT}")
+
+  # again, if return value is !=0 scream and shout
+  if (NOT ${TEST_RESULT} STREQUAL 0)
+    message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match P_${TEST_REFERENCE}")
+  endif (NOT ${TEST_RESULT} STREQUAL 0)
+endif (NOT TEST_SKIP_COMPARE)
+
+# everything went fine...
+message ("Passed: The output of ${TEST_PROGRAM} matches P_${TEST_REFERENCE}")
+
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/runTest.cmake b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/runTest.cmake
new file mode 100644
index 0000000..1d8b12e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/runTest.cmake
@@ -0,0 +1,241 @@
+# runTest.cmake executes a command and captures the output in a file. File is then compared
+# against a reference file. Exit status of command can also be compared.
+cmake_policy(SET CMP0007 NEW)
+
+# arguments checking
+if (NOT TEST_PROGRAM)
+  message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
+endif ()
+#if (NOT TEST_ARGS)
+#  message (STATUS "Require TEST_ARGS to be defined")
+#endif ()
+if (NOT TEST_FOLDER)
+  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
+endif ()
+if (NOT TEST_OUTPUT)
+  message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
+endif ()
+if (NOT TEST_EXPECT)
+  message (STATUS "Require TEST_EXPECT to be defined")
+endif ()
+#if (NOT TEST_FILTER)
+#  message (STATUS "Require TEST_FILTER to be defined")
+#endif ()
+if (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
+  message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT})
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT})
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+endif ()
+
+# if there is not an error reference file add the error output to the stdout file
+if (NOT TEST_ERRREF)
+  set (ERROR_APPEND 1)
+endif ()
+
+message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
+
+if (TEST_ENV_VAR)
+  set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}")
+endif ()
+
+if (NOT TEST_INPUT)
+  # run the test program, capture the stdout/stderr and the result var
+  execute_process (
+      COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
+      WORKING_DIRECTORY ${TEST_FOLDER}
+      RESULT_VARIABLE TEST_RESULT
+      OUTPUT_FILE ${TEST_OUTPUT}
+      ERROR_FILE ${TEST_OUTPUT}.err
+      OUTPUT_VARIABLE TEST_OUT
+      ERROR_VARIABLE TEST_ERROR
+  )
+else ()
+  # run the test program with stdin, capture the stdout/stderr and the result var
+  execute_process (
+      COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
+      WORKING_DIRECTORY ${TEST_FOLDER}
+      RESULT_VARIABLE TEST_RESULT
+      INPUT_FILE ${TEST_INPUT}
+      OUTPUT_FILE ${TEST_OUTPUT}
+      ERROR_FILE ${TEST_OUTPUT}.err
+      OUTPUT_VARIABLE TEST_OUT
+      ERROR_VARIABLE TEST_ERROR
+  )
+endif ()
+
+message (STATUS "COMMAND Result: ${TEST_RESULT}")
+
+# if the .err file exists and ERRROR_APPEND is enabled
+if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
+  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif ()
+
+# append the test result status with a predefined text
+if (TEST_APPEND)
+  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n")
+endif ()
+
+# if the return value is !=${TEST_EXPECT} bail out
+if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+  message ( FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
+endif ()
+
+message (STATUS "COMMAND Error: ${TEST_ERROR}")
+
+# if the output file needs Storage text removed
+if (TEST_MASK)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:   <details removed for portability>\n" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif ()
+
+# if the output file needs Modified text removed
+if (TEST_MASK_MOD)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+   string (REGEX REPLACE "Modified:[^\n]+\n" "Modified:  XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif ()
+
+# if the output file or the .err file needs to mask out error stack info
+if (TEST_MASK_ERROR)
+  if (NOT TEST_ERRREF)
+    # the error stack has been appended to the output file
+    file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  else ()
+    # the error stack remains in the .err file
+    file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
+  endif ()
+  string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE " line [0-9]*" " line (number)" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "v[1-9]*[.][0-9]*[.]" "version (number)." TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "H5Eget_auto[1-2]*" "H5Eget_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "H5Eset_auto[1-2]*" "H5Eset_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
+  # write back the changes to the original files
+  if (NOT TEST_ERRREF)
+    file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+  else ()
+    file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}")
+  endif ()
+endif (TEST_MASK_ERROR)
+
+# remove text from the output file
+if (TEST_FILTER)
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  string (REGEX REPLACE "${TEST_FILTER}" "" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
+endif ()
+
+# compare output files to references unless this must be skipped
+if (NOT TEST_SKIP_COMPARE)
+  if (WIN32 AND NOT MINGW)
+    file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
+    file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}")
+  endif ()
+
+  # now compare the output with the reference
+  execute_process (
+      COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE}
+      RESULT_VARIABLE TEST_RESULT
+  )
+  if (NOT ${TEST_RESULT} STREQUAL 0)
+    set (TEST_RESULT 0)
+    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
+    list (LENGTH test_act len_act)
+    file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref)
+    list (LENGTH test_ref len_ref)
+    if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+      math (EXPR _FP_LEN "${len_ref} - 1")
+      foreach (line RANGE 0 ${_FP_LEN})
+        list (GET test_act ${line} str_act)
+        list (GET test_ref ${line} str_ref)
+        if (NOT "${str_act}" STREQUAL "${str_ref}")
+          if (NOT "${str_act}" STREQUAL "")
+            set (TEST_RESULT 1)
+            message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+          endif ()
+        endif ()
+      endforeach ()
+    else ()
+      if (${len_act} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty")
+      endif ()
+      if (${len_ref} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty")
+      endif ()
+    endif ()
+    if (NOT ${len_act} STREQUAL ${len_ref})
+      set (TEST_RESULT 1)
+    endif ()
+  endif (NOT ${TEST_RESULT} STREQUAL 0)
+
+  message (STATUS "COMPARE Result: ${TEST_RESULT}")
+
+  # again, if return value is !=0 scream and shout
+  if (NOT ${TEST_RESULT} STREQUAL 0)
+    message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}")
+  endif ()
+
+  # now compare the .err file with the error reference, if supplied
+  if (TEST_ERRREF)
+    if (WIN32 AND NOT MINGW)
+      file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM)
+      file (WRITE ${TEST_FOLDER}/${TEST_ERRREF} "${TEST_STREAM}")
+    endif ()
+
+    # now compare the error output with the error reference
+    execute_process (
+        COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF}
+        RESULT_VARIABLE TEST_RESULT
+    )
+    if (NOT ${TEST_RESULT} STREQUAL 0)
+      set (TEST_RESULT 0)
+      file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act)
+      list (LENGTH test_act len_act)
+      file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref)
+      list (LENGTH test_ref len_ref)
+      math (EXPR _FP_LEN "${len_ref} - 1")
+      if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+        math (EXPR _FP_LEN "${len_ref} - 1")
+        foreach (line RANGE 0 ${_FP_LEN})
+          list (GET test_act ${line} str_act)
+          list (GET test_ref ${line} str_ref)
+          if (NOT "${str_act}" STREQUAL "${str_ref}")
+            if (NOT "${str_act}" STREQUAL "")
+              set (TEST_RESULT 1)
+              message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+             endif ()
+          endif ()
+        endforeach (line RANGE 0 ${_FP_LEN})
+      else ()
+        if (${len_act} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty")
+        endif ()
+        if (${len_ref} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty")
+        endif ()
+      endif()
+      if (NOT ${len_act} STREQUAL ${len_ref})
+        set (TEST_RESULT 1)
+      endif ()
+    endif ()
+
+    message (STATUS "COMPARE Result: ${TEST_RESULT}")
+
+    # again, if return value is !=0 scream and shout
+    if (NOT ${TEST_RESULT} STREQUAL 0)
+      message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}")
+    endif ()
+  endif (TEST_ERRREF)
+endif (NOT TEST_SKIP_COMPARE)
+
+# everything went fine...
+message ("Passed: The output of ${TEST_PROGRAM} matches ${TEST_REFERENCE}")
diff --git a/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/version.plist.in b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/version.plist.in
new file mode 100644
index 0000000..817d89e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cmake_ext_mod/version.plist.in
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<plist version="1.0">
+<dict>
+    <key>BuildVersion</key>
+    <string>@CPACK_PACKAGE_VERSION_MAJOR@</string>
+    <key>CFBundleShortVersionString</key>
+    <string>@CPACK_APPLE_GUI_SHORT_VERSION_STRING@</string>
+    <key>CFBundleVersion</key>
+    <string>@CPACK_APPLE_GUI_SHORT_VERSION_STRING@</string>
+    <key>ProjectName</key>
+    <string>@CPACK_APPLE_GUI_BUNDLE_NAME@</string>
+    <key>SourceVersion</key>
+    <string>@CPACK_PACKAGE_VERSION_MINOR@</string>
+</dict>
+</plist>
diff --git a/gatb-core/thirdparty/hdf5/config/commence.am b/gatb-core/thirdparty/hdf5/config/commence.am
new file mode 100644
index 0000000..554c9fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/commence.am
@@ -0,0 +1,105 @@
+## config/commence.am
+## (Use double hashes for copyright notice so that automake treats it as
+## comments and does not pass it to Makefile.in)
+## Copyright by The HDF Group.
+## Copyright by the Board of Trustees of the University of Illinois.
+## All rights reserved.
+##
+## This file is part of HDF5.  The full HDF5 copyright notice, including
+## terms governing use, modification, and redistribution, is contained in
+## the files COPYING and Copyright.html.  COPYING can be found at the root
+## of the source code distribution tree; Copyright.html can be found at the
+## root level of an installed copy of the electronic HDF5 document set and
+## is linked from the top-level documents page.  It can also be found at
+## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+## access to either file, you may request a copy from help at hdfgroup.org.
+
+
+## Textually included in the beginning of every HDF5 Makefile.am
+## Contains definitions, etc. used across multiple Makefiles.
+
+# Shell commands used in Makefiles
+RM=rm -f
+CP=cp
+
+# Some machines need a command to run executables; this is that command
+# so that our tests will run.
+# We use RUNEXEC instead of RUNSERIAL directly because it may be that
+# some tests need to be run with a different command.  Older versions
+# of the makefiles used the command
+# $(LIBTOOL) --mode=execute
+# in some directories, for instance.
+RUNEXEC=$(RUNSERIAL)
+
+# Libraries to link to while building
+LIBHDF5=$(top_builddir)/src/libhdf5.la
+LIBH5TEST=$(top_builddir)/test/libh5test.la
+LIBH5F=$(top_builddir)/fortran/src/libhdf5_fortran.la
+LIBH5FTEST=$(top_builddir)/fortran/test/libh5test_fortran.la
+LIBH5CPP=$(top_builddir)/c++/src/libhdf5_cpp.la
+LIBH5TOOLS=$(top_builddir)/tools/lib/libh5tools.la
+LIBH5_HL=$(top_builddir)/hl/src/libhdf5_hl.la
+LIBH5F_HL=$(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la
+LIBH5CPP_HL=$(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la
+
+# Install directories that automake doesn't know about
+docdir = $(exec_prefix)/doc
+
+# Note that in svn revision 19400 the '/' after DESTDIR in H5* variables below  
+# has been removed. According to the official description of DESTDIR by Gnu at 
+# http://www.gnu.org/prep/standards/html_node/DESTDIR.html, DESTDIR is 
+# prepended to the normal and complete install path that it precedes for the 
+# purpose of installing in a temporary directory which is useful for building 
+# rpms and other packages.  The '/' after ${DESTDIR} will be followed by another 
+# '/' at the beginning of the normal install path.  When DESTDIR is empty the  
+# path then begins with '//', which is incorrect and causes problems at least for 
+# Cygwin.   
+
+# Scripts used to build examples
+# If only shared libraries have been installed, have h5cc build examples with
+# shared libraries instead of static libraries
+H5CC=${DESTDIR}$(bindir)/h5cc
+H5CC_PP=${DESTDIR}$(bindir)/h5pcc
+H5FC=${DESTDIR}$(bindir)/h5fc
+H5FC_PP=${DESTDIR}$(bindir)/h5pfc
+H5CPP=${DESTDIR}$(bindir)/h5c++
+  
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles 
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+# This applies to FCFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS as well.
+
+AM_CFLAGS=@AM_CFLAGS@ @H5_CFLAGS@
+AM_FCFLAGS=@AM_FCFLAGS@ @H5_FCFLAGS@
+AM_CXXFLAGS=@AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_CPPFLAGS=@AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_LDFLAGS=@AM_LDFLAGS@ @H5_LDFLAGS@
+
+ACLOCAL_AMFLAGS="-I m4"
+
+# The trace script; this is used on source files from the C library to
+# insert tracing macros.
+TRACE=perl $(top_srcdir)/bin/trace
+
+# Make sure that these variables are exported to the Makefiles
+F9XMODEXT=@F9XMODEXT@
+F9XMODFLAG=@F9XMODFLAG@
+
+# .chkexe files are used to mark tests that have run successfully.
+# .chklog files are output from those tests.
+# *.clog and *.clog2 are from the MPE option.
+CHECK_CLEANFILES=*.chkexe *.chklog *.clog *.clog2
+
+# List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
+# This tells the Makefiles that these targets are not files to be built but
+# commands that should be executed even if a file with the same name already
+# exists.
+.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \
+        build-tests check-clean check-install check-p check-s check-vfd \
+        install-doc lib progs tests uninstall-doc _exec_check-s _test help
+
+help:
+	@$(top_srcdir)/bin/makehelp
+
diff --git a/gatb-core/thirdparty/hdf5/config/conclude.am b/gatb-core/thirdparty/hdf5/config/conclude.am
new file mode 100644
index 0000000..1ba56fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/conclude.am
@@ -0,0 +1,235 @@
+## config/conclude.am
+## (Use double hashes for copyright notice so that automake treats it as
+## comments and does not pass it to Makefile.in)
+## Copyright by The HDF Group.
+## Copyright by the Board of Trustees of the University of Illinois.
+## All rights reserved.
+##
+## This file is part of HDF5.  The full HDF5 copyright notice, including
+## terms governing use, modification, and redistribution, is contained in
+## the files COPYING and Copyright.html.  COPYING can be found at the root
+## of the source code distribution tree; Copyright.html can be found at the
+## root level of an installed copy of the electronic HDF5 document set and
+## is linked from the top-level documents page.  It can also be found at
+## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+## access to either file, you may request a copy from help at hdfgroup.org.
+
+
+## Textually included at the end of most HDF5 Makefiles.am.
+## Contains build rules.
+
+# Automake needs to be taught how to build lib, progs, and tests targets.
+# These will be filled in automatically for the most part (e.g.,
+# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
+# EXTRA_TEST variables are supplied to allow the user to force targets to
+# be built at certain times. 
+LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
+      $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+TESTS = $(TEST_PROG) $(TEST_SCRIPT) $(EXTRA_TEST) 
+
+TEST_EXTENSIONS = .sh
+SH_LOG_COMPILER = $(SHELL)
+AM_SH_LOG_FLAGS =
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-lib: $(LIB)
+build-progs: $(LIB) $(PROGS)
+build-tests: $(LIB) $(PROGS) $(chk_TESTS)
+
+# General rule for recursive building targets.
+# BUILT_SOURCES contain targets that need to be built before anything else
+# in the directory (e.g., for Fortran type detection)
+lib progs tests check-s check-p :: $(BUILT_SOURCES)
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# General rule for recursive cleaning targets.  Like the rule above,
+# but doesn't require building BUILT_SOURCES.
+check-clean ::
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# Tell Automake to build tests when the user types `make all' (this is
+# not its default behavior).  Also build EXTRA_LIB and EXTRA_PROG since
+# Automake won't build them automatically, either.
+all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(chk_TESTS)
+
+# make install-doc doesn't do anything outside of doc directory, but
+# Makefiles should recognize it.
+# UPDATE: docs no longer reside in this build tree, so this target
+# is depreciated.
+install-doc uninstall-doc:
+	@echo "Nothing to be done."
+
+# clean up files generated by tests so they can be re-run.
+build-check-clean:
+	$(RM) -rf $(CHECK_CLEANFILES)
+
+# run check-clean whenever mostlyclean is run
+mostlyclean-local: build-check-clean
+
+# check-install is just a synonym for installcheck
+check-install: installcheck
+
+# Run each test in order, passing $(TEST_FLAGS) to the program.
+# Since tests are done in a shell loop, "make -i" does apply inside it.
+# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop.
+# The timestamps give a rough idea how much time the tests use.
+#
+# Note that targets in chk_TESTS (defined above) will be built when the user
+# types 'make tests' or 'make check', but only programs in TEST_PROG,
+# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed.
+check-TESTS: test
+
+test _test:
+	@$(MAKE) build-check-s
+	@$(MAKE) build-check-p
+
+# Actual execution of check-s.
+build-check-s: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	   echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@$(MAKE) $(AM_MAKEFLAGS) _exec_check-s
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	    echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+TEST_PROG_CHKEXE=$(TEST_PROG:=.chkexe_)
+TEST_PROG_PARA_CHKEXE=$(TEST_PROG_PARA:=.chkexe_)
+TEST_SCRIPT_CHKSH=$(TEST_SCRIPT:=.chkexe_)
+TEST_SCRIPT_PARA_CHKSH=$(TEST_SCRIPT_PARA:=.chkexe_)
+
+_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH)
+
+# The dummy.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \
+	   tname=$(@:.chkexe_=)$(EXEEXT);\
+	   log=$(@:.chkexe_=.chklog); \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\
+	      else \
+	         echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(RUNEXEC) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $(@:.chkexe_=.chkexe) || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	fi
+ 
+# The dummysh.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \
+	   cmd=$(@:.chkexe_=);\
+	   tname=`basename $$cmd`;\
+	   chkname=`basename $(@:.chkexe_=.chkexe)`;\
+	   log=`basename $(@:.chkexe_=.chklog)`; \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      else \
+	         echo "Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)"           \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $${chkname} || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	   echo "============================"; \
+	fi
+
+# Actual execution of check-p.
+build-check-p: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	   echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@if test -n "$(TEST_PROG_PARA)"; then                                \
+	    echo "**** Hint ****";                                            \
+	    echo "Parallel test files reside in the current directory"        \
+	         "by default.";                                               \
+	    echo "Set HDF5_PARAPREFIX to use another directory. E.g.,";       \
+	    echo "    HDF5_PARAPREFIX=/PFS/user/me";                          \
+	    echo "    export HDF5_PARAPREFIX";                                \
+	    echo "    make check";                                            \
+	    echo "**** end of Hint ****";                                     \
+	fi
+	@for test in $(TEST_PROG_PARA) dummy; do                             \
+	   if test $$test != dummy; then                                      \
+	      $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \
+	      RUNEXEC="$(RUNPARALLEL)" || exit 1; \
+	   fi;                                                                \
+	done
+	@for test in $(TEST_SCRIPT_PARA) dummy; do                           \
+	  if test $$test != dummy; then                                      \
+	    $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \
+	  fi;                                                                 \
+	done
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	    echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+# Run test with different Virtual File Driver
+check-vfd: $(LIB) $(PROGS) $(chk_TESTS)
+	@for vfd in $(VFD_LIST) dummy; do                                     \
+	    if test $$vfd != dummy; then                                      \
+	        echo "============================";                          \
+	        echo "Testing Virtual File Driver $$vfd";                     \
+	        echo "============================";                          \
+	        $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1;                \
+	        HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1;    \
+	    fi;                                                               \
+	done
diff --git a/gatb-core/thirdparty/hdf5/config/cygwin b/gatb-core/thirdparty/hdf5/config/cygwin
new file mode 100644
index 0000000..7423403
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/cygwin
@@ -0,0 +1,24 @@
+#              -*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# Use the linux-gnulibc1 file.
+. $srcdir/config/linux-gnulibc1
diff --git a/gatb-core/thirdparty/hdf5/config/examples.am b/gatb-core/thirdparty/hdf5/config/examples.am
new file mode 100644
index 0000000..8597a16
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/examples.am
@@ -0,0 +1,122 @@
+## config/examples.am
+## (Use double hashes for copyright notice so that automake treats it as
+## comments and does not pass it to Makefile.in)
+## Copyright by The HDF Group.
+## Copyright by the Board of Trustees of the University of Illinois.
+## All rights reserved.
+##
+## This file is part of HDF5.  The full HDF5 copyright notice, including
+## terms governing use, modification, and redistribution, is contained in
+## the files COPYING and Copyright.html.  COPYING can be found at the root
+## of the source code distribution tree; Copyright.html can be found at the
+## root level of an installed copy of the electronic HDF5 document set and
+## is linked from the top-level documents page.  It can also be found at
+## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+## access to either file, you may request a copy from help at hdfgroup.org.
+
+## Textually included near the end of HDF5 Makefiles in example directories.
+## Contains boilerplate for building, installing, and cleaning example
+## programs.
+
+# We can't tell automake about example programs, because they need to be
+# built using h5cc (or h5fc, etc.) instead of the standard compilers.
+# This creates some extra work for us.
+
+## The Makefile.am that includes this boilerplate needs to define the
+## following:
+##
+## TEST_PROG and TEST_PROG_PARA
+## We assume that all test programs in this directory are examples.
+##
+## INSTALL_FILES
+## The source files that the examples use which should be installed.
+## INSTALL_SCRIPT_FILES
+## INSTALL_TOP_SCRIPT_FILES
+## INSTALL_TOP_FILES
+##
+## EXAMPLEDIR
+## The directory into which examples should be installed. 
+##
+## Build rules for $(EXTRA_PROG).
+## Dependencies for example programs.
+## Automake will supply neither of these.
+##
+
+# Assume that all tests in this directory are examples, and tell
+# conclude.am when to build them.
+EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
+
+# We need to tell automake what to clean
+MOSTLYCLEANFILES=*.raw *.meta *.o
+CHECK_CLEANFILES+=*.h5
+CLEANFILES=$(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
+
+# How to create EXAMPLEDIR if it doesn't already exist
+$(EXAMPLEDIR):
+	-$(top_srcdir)/bin/mkdirs $@
+$(EXAMPLETOPDIR):
+	-$(top_srcdir)/bin/mkdirs $@
+
+# Install and uninstall rules.  We install the source files, not the
+# example programs themselves.
+install-data-local:
+	@$(MAKE) $(AM_MAKEFLAGS) install-examples
+uninstall-local:
+	@$(MAKE) $(AM_MAKEFLAGS) uninstall-examples
+
+install-examples: $(EXAMPLEDIR) $(INSTALL_FILES) 
+	@for f in X $(INSTALL_FILES); do                                     \
+	  if test $$f != X; then                                             \
+	    (set -x; $(INSTALL) $(srcdir)/$$f $(EXAMPLEDIR)/. || exit 1);    \
+            chmod a-x $(EXAMPLEDIR)/$$f;                                     \
+	  fi;                                                                \
+	done
+	@for f in X $(INSTALL_SCRIPT_FILES); do                                   \
+	  if test $$f != X; then                                             \
+	    (set -x; $(INSTALL) $$f $(EXAMPLEDIR)/. || exit 1);\
+	  fi;                                                                \
+	done
+	@for f in X $(INSTALL_TOP_FILES); do                       \
+	  if test $$f != X; then                                             \
+	    (set -x; $(INSTALL) $(srcdir)/$$f $(EXAMPLETOPDIR)/. || exit 1); \
+            chmod a-x $(EXAMPLETOPDIR)/$$f;\
+	  fi;                                                                \
+	done
+	@for f in X $(INSTALL_TOP_SCRIPT_FILES); do                       \
+	  if test $$f != X; then                                             \
+	    (set -x; $(INSTALL) $(srcdir)/$$f $(EXAMPLETOPDIR)/. || exit 1); \
+	  fi;                                                                \
+	done
+
+uninstall-examples:
+	@if test -n "$(INSTALL_FILES)" -a -d $(EXAMPLEDIR); then             \
+	  set -x; cd $(EXAMPLEDIR) && $(RM) $(INSTALL_FILES);                \
+	fi
+	@if test -n "$(INSTALL_SCRIPT_FILES)" -a -d $(EXAMPLEDIR); then           \
+	  set -x; cd $(EXAMPLEDIR) && $(RM) $(INSTALL_SCRIPT_FILES);              \
+	fi
+	@if test -n "$(INSTALL_TOP_FILES)" -a -d $(EXAMPLETOPDIR); then    \
+	  set -x; cd $(EXAMPLETOPDIR) && $(RM) $(INSTALL_TOP_FILES);       \
+	fi
+	@if test -n "$(INSTALL_TOP_SCRIPT_FILES)" -a -d $(EXAMPLETOPDIR); then    \
+	  set -x; cd $(EXAMPLETOPDIR) && $(RM) $(INSTALL_TOP_SCRIPT_FILES);       \
+	fi
+
+installcheck-local:
+	@if test "$(STATIC_SHARED)" = "static, shared"; then               \
+	  H5CCFLAGS="-shlib" $(MAKE) $(AM_MAKEFLAGS) check;                \
+	  $(MAKE) $(AM_MAKEFLAGS) clean;                                   \
+	  H5CCFLAGS="" $(MAKE) $(AM_MAKEFLAGS) check;                      \
+	elif test "$(STATIC_SHARED)" = "shared"; then                     \
+	  H5CCFLAGS="-shlib" $(MAKE) $(AM_MAKEFLAGS) check;                \
+	else                                                              \
+	  $(MAKE) $(AM_MAKEFLAGS) check;                                   \
+	fi 
+	@if test "$(INSTALL_FILES)" -a $(TEST_EXAMPLES_SCRIPT) -a -d $(EXAMPLEDIR); then \
+	    echo "============================";                                         \
+	    echo "Testing $(TEST_EXAMPLES_SCRIPT)";                                      \
+	    echo "============================";                                         \
+	    (cd $(EXAMPLEDIR);                                                           \
+	     /bin/sh ./$(TEST_EXAMPLES_SCRIPT);)                                                   \
+	fi
+
diff --git a/gatb-core/thirdparty/hdf5/config/freebsd b/gatb-core/thirdparty/hdf5/config/freebsd
new file mode 100644
index 0000000..e42ca60
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/freebsd
@@ -0,0 +1,58 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# The default compiler is `gcc'
+if test "X-" = "X-$CC"; then
+  CC=gcc
+  CC_BASENAME=gcc
+fi
+
+# Figure out C compiler flags
+. $srcdir/config/gnu-flags
+
+# Figure out Intel C compiler flags
+. $srcdir/config/intel-flags
+
+# The default Fortran 90 compiler
+if test "X-" = "X-$FC"; then
+    case $CC_BASENAME in
+        gcc*|pgcc*)
+            FC=gfortran40
+            FC_BASENAME=gfortran40
+            ;;
+        icc*)
+            FC=ifort
+            FC_BASENAME=ifort
+            ;;
+        mpicc*)
+            FC=mpif90
+            FC_BASENAME=mpif90
+            ;;
+    esac
+fi
+
+# Figure out FORTRAN compiler flags
+. $srcdir/config/gnu-fflags
+
+# Figure out Intel F90 compiler flags
+. $srcdir/config/intel-fflags
+
diff --git a/gatb-core/thirdparty/hdf5/config/gnu-fflags b/gatb-core/thirdparty/hdf5/config/gnu-fflags
new file mode 100644
index 0000000..1d6caa1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/gnu-fflags
@@ -0,0 +1,99 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# GNU g95/gfortran compiler or a derivative.  It is careful not to do anything
+# if the compiler is not GNU; otherwise `f9x_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for GNU fortran
+# gfortran unless a compiler version is already known
+#
+#   f9x_vendor:    The compiler name: gfortran
+#   f9x_version:   Version number: 5.0-2, 5.2-2
+#
+if test X = "X$f9x_flags_set"; then
+    f9x_version="`$FC $FCFLAGS $H5_FCFLAGS -v 2>&1 |grep 'gcc version' |\
+	        sed 's/.*gcc version \([-a-z0-9\.]*\).*/\1/'`"
+    if test X != "X$f9x_version"; then
+#        is_mpi="`$FC $FCFLAGS $H5_FCFLAGS -help 2>&1 |grep 'link MPI'`"
+        f9x_vendor=`echo $f9x_version |sed 's/\([a-z]*\).*/\1/'`
+        f9x_version=`echo $f9x_version |sed 's/[-a-z]//g'`
+        if test X = "X$f9x_vendor" -a X != "X$f9x_version"; then
+            f9x_vendor=gfortran
+        fi
+        if test "-" != "$f9x_vendor-$f9x_version"; then
+            echo "compiler '$FC' is GNU $f9x_vendor-$f9x_version"
+        fi
+
+        # Some version numbers
+        f9x_vers_major=`echo $f9x_version | cut -f1 -d.`
+        f9x_vers_minor=`echo $f9x_version | cut -f2 -d.`
+        f9x_vers_patch=`echo $f9x_version | cut -f3 -d.`
+        test -n "$f9x_vers_major" || f9x_vers_major=0
+        test -n "$f9x_vers_minor" || f9x_vers_minor=0
+        test -n "$f9x_vers_patch" || f9x_vers_patch=0
+        f9x_vers_all=`expr $f9x_vers_major '*' 1000000 + $f9x_vers_minor '*' 1000 + $f9x_vers_patch`
+    fi
+fi
+
+# Common GNU flags for various situations
+if test "X-gfortran" = "X-$f9x_vendor"; then
+    # Insert section about version specific problems from gnu-flags here, if
+    # necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # Host-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "`hostname`" in
+    #    sleipnir.ncsa.uiuc.edu)
+    #        arch="$arch -pipe"
+    #        ;;
+    #esac
+
+    # General
+    FC_BASENAME=gfortran40
+    F9XSUFFIXFLAG=""
+    FSEARCH_DIRS=""
+    H5_FCFLAGS="$H5_FCFLAGS -pedantic -Wall -Wconversion -Wunderflow -Wimplicit-interface -W"
+
+    # Production
+    PROD_FCFLAGS="-O2 -s"
+
+    # Debug
+    DEBUG_FCFLAGS="-g -fbounds-check"
+
+    # Profile
+    PROFILE_FCFLAGS="-g -pg"
+
+    # Flags are set
+    f9x_flags_set=yes
+fi
+
+# Clear f9x info if no flags set
+if test "X-$f9x_flags_set" = "X-"; then
+  f9x_vendor=
+  f9x_version=
+fi
+
diff --git a/gatb-core/thirdparty/hdf5/config/gnu-flags b/gatb-core/thirdparty/hdf5/config/gnu-flags
new file mode 100644
index 0000000..e7f8f14
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/gnu-flags
@@ -0,0 +1,826 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# GNU gcc compiler or a derivative.  It is careful not to do anything
+# if the compiler is not GNU; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for gcc
+# unless a compiler version is already known
+#
+#   cc_vendor:    The compiler name: gcc
+#   cc_version:   Version number: 2.91.60, 2.7.2.1
+#
+if test X = "X$cc_flags_set"; then
+    # PathScale compiler spits out gcc version string too. Need to
+    # filter it out.
+    # icc beginning with version 12 includes a "gcc version compatiblilty"
+    # string, causing the gcc H5_CFLAGS to be erroneously added.  The line
+    # "grep -v 'icc version'" causes the discarding of any output
+    # containing 'icc version'.  The cc_version for icc is correctly determined
+    # and flags added in the intel-flags script.
+    cc_version="`$CC $CFLAGS $H5_CFLAGS -v 2>&1 | grep -v 'PathScale' |\
+        grep -v 'icc version' |\
+        grep 'gcc version' | sed 's/.*gcc version \([-a-z0-9\.]*\).*/\1/'`"
+    cc_vendor=`echo $cc_version |sed 's/\([a-z]*\).*/\1/'`
+    cc_version=`echo $cc_version |sed 's/[-a-z]//g'`
+    if test X = "X$cc_vendor" -a X != "X$cc_version"; then
+	cc_vendor=gcc
+    fi
+    if test "-" != "$cc_vendor-$cc_version"; then
+	echo "compiler '$CC' is GNU $cc_vendor-$cc_version"
+    fi
+
+    # Some version numbers
+    cc_vers_major=`echo $cc_version | cut -f1 -d.`
+    cc_vers_minor=`echo $cc_version | cut -f2 -d.`
+    cc_vers_patch=`echo $cc_version | cut -f3 -d.`
+    test -n "$cc_vers_major" || cc_vers_major=0
+    test -n "$cc_vers_minor" || cc_vers_minor=0
+    test -n "$cc_vers_patch" || cc_vers_patch=0
+    cc_vers_all=`expr $cc_vers_major '*' 1000000 + $cc_vers_minor '*' 1000 + $cc_vers_patch`
+fi
+
+# Common GCC flags for various situations
+case "$cc_vendor-$cc_version" in
+  gcc*)
+    # Architecture-specific flags
+    arch=
+    case "$host_os-$host_cpu" in
+        # FreeBSD sets the information from "uname -m" to the general machine
+        # architecture, not the specific CPU for the machine, so even our
+        # Pentium II Xeon server is set to "i386".  Once we know we are on a FreeBSD
+        # machine, use the "sysctl" command to get the CPU hardware model.
+        freebsd*-i386)
+            host_cpu_model=`sysctl -n hw.model`
+            case "$host_cpu_model" in
+                # Hmm.. this might not catch Celerons, but it won't hurt them either...
+                *Pro*|*II*|*III*|*IV*|*Athlon*)
+                    # architecture-specific optimizations cause problems
+                    # for some users who build binaries to be used on
+                    # multiple architectures.
+                    # arch="-march=i686"
+                ;;
+            esac
+            ;;
+
+        *-i686)
+                    # architecture-specific optimizations cause problems
+                    # for some users who build binaries to be used on
+                    # multiple architectures.
+                    # arch="-march=i686"
+            ;;
+    esac
+
+    # Host-specific flags
+    case "`hostname`" in
+        sleipnir.ncsa.uiuc.edu)
+            arch="$arch -pipe"
+            ;;
+    esac
+
+    # General
+    H5_CFLAGS="$H5_CFLAGS $arch -std=c99 -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline"
+
+    # Production
+    case "$cc_vendor-$cc_version" in
+      gcc-[34].*)
+        PROD_CFLAGS="-O3"
+        ;;
+      gcc-5.*)
+        PROD_CFLAGS="-O3 -fstdarg-opt"
+        ;;
+      *)
+        PROD_CFLAGS="-O -finline-functions"
+        ;;
+    esac
+    PROD_CPPFLAGS=
+
+    # Debug
+    case "$cc_vendor-$cc_version" in
+      gcc-5.*)
+        DEBUG_CFLAGS="-Og -g -ftrapv -fno-common"
+        ;;
+      *)
+        DEBUG_CFLAGS="-g"
+        ;;
+    esac
+    #DEBUG_CFLAGS="$DEBUG_CFLAGS -fsanitize=undefined"
+    DEBUG_CPPFLAGS=
+
+    # Try out the new "stack protector" feature introduced in gcc 4.1
+    # (We should also think about adding some of the other memory protection options)
+    #DEBUG_CFLAGS="$DEBUG_CFLAGS -Wstack-protector -fstack-protector-all"
+
+    # Profile
+    PROFILE_CFLAGS="-Og -g -pg"
+    PROFILE_CPPFLAGS=
+
+    # Flags are set
+    cc_flags_set=yes
+    ;;
+esac
+
+# Version specific GCC flags
+#
+# Please follow the pattern below by adding new versions at the top, copying
+# the information from the previous version and adding modifications to that.
+case "$cc_vendor-$cc_version" in
+
+# Closer to the gcc 5.2 release, we should check for additional flags to
+# include and break it out into it's own section, like the other versions
+# below. -QAK
+  gcc-5*)
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional-conversion"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+
+    # Append more extra warning flags that only gcc 4.8+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+
+    # Append more extra warning flags that only gcc 4.9+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdate-time -Wopenmp-simd"
+
+    # (There was no release of gcc 5.0)
+
+    # Append more extra warning flags that only gcc 5.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Warray-bounds=2 -Wc99-c11-compat"
+    ;;
+
+  gcc-4.9*)
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional-conversion"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+
+    # Append more extra warning flags that only gcc 4.8+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+
+    # Append more extra warning flags that only gcc 4.9+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdate-time -Wopenmp-simd"
+    ;;
+
+  gcc-4.8*)
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional-conversion"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+
+    # Append more extra warning flags that only gcc 4.8+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+    ;;
+
+  gcc-4.7*)
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional-conversion"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    # (this warning was removed in gcc 4.5+)
+    #H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    ;;
+
+  gcc-4.6*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    # (this warning was removed in gcc 4.5+)
+    #H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-aliasing -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    ;;
+
+  gcc-4.5*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    # (this warning was removed in gcc 4.5+)
+    #H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-aliasing -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+    ;;
+
+  gcc-4.4*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
+
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+    ;;
+
+  gcc-4.3*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat -Wvolatile-register-var"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wvla"
+    ;;
+
+  gcc-4.2*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc 4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat -Wvolatile-register-var"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    ;;
+
+  gcc-4.1.*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc 4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat -Wvolatile-register-var"
+    ;;
+
+  gcc-4.0*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # The "format=2" warning generates too many warnings about valid
+    # usage in the library.
+    #CFLAGS="$CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    #CFLAGS="$CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc 4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Wnonnull -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+    ;;
+
+  gcc-3.4*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # The "format=2" warning generates too many warnings about valid
+    # usage in the library.
+    #CFLAGS="$CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    #CFLAGS="$CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append more extra warning flags that only gcc3.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+    ;;
+
+  gcc-3.3*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # The "format=2" warning generates too many warnings about valid
+    # usage in the library.
+    #CFLAGS="$CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    #CFLAGS="$CFLAGS -Wunreachable-code"
+
+    # Append more extra warning flags that only gcc3.3+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+    ;;
+
+  gcc-3.2*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append more extra warning flags that only gcc3.2+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+
+    # The "format=2" warning generates too many warnings about valid
+    # usage in the library.
+    #CFLAGS="$CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning does not appear to be reliable yet...
+    #CFLAGS="$CFLAGS -Wunreachable-code"
+    ;;
+
+  gcc-3*)
+    # Disable warnings about using 'long long' type
+    H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
+
+    # Append some extra warning flags that only gcc3+ know about
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+    ;;
+esac
+
+# Clear cc info if no flags set
+if test "X$cc_flags_set" = "X"; then
+  cc_vendor=
+  cc_version=
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/ibm-aix b/gatb-core/thirdparty/hdf5/config/ibm-aix
new file mode 100644
index 0000000..28498e2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/ibm-aix
@@ -0,0 +1,150 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+# Configuration file for building on the IBM AIX platforms.
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+
+# Use AIX supplied C compiler by default, xlc for serial, mpcc_r for parallel.
+# Make sure this is applied to other API compile options such as C++.
+if test "X-" =  "X-$CC"; then
+  if test "X-$enable_parallel" = "X-yes"; then
+    CC=mpcc_r
+    CC_BASENAME=mpcc_r
+  else
+    CC=xlc
+    CC_BASENAME=xlc
+  fi
+fi
+
+# Define RUNPARALLEL if parallel mode is enabled or a parallel compiler used.
+# Define RUNSERIAL: Temporary patch for Bug 1678. -q32 binary default to run
+# with smaller memory.
+# Ask for more memory so that "make check" will pass. Not necessary for -q64
+# mode but it does no harm.
+if test "X-$enable_parallel" = "X-yes" -o X-$CC_BASENAME = X-mpcc_r; then
+    RUNPARALLEL=${RUNPARALLEL="env MP_PROCS=\$\${NPROCS:=6} MP_TASKS_PER_NODE=\$\${NPROCS:=6} poe"}
+fi
+
+# The default Fortran 90 compiler
+
+if test "X-" = "X-$FC"; then
+  if test "X-$enable_parallel" = "X-yes"; then
+    FC=mpxlf90_r
+  else
+    FC=xlf90
+  fi
+fi
+
+# While we try to avoid setting FCFLAGS directly for use in compilation, in 
+# this case we need the -k flag present for some configure checks. As such, 
+# the configure script saves the user's set FCFLAGS before running, and 
+# restores them when complete. We must then set up both FCFLAGS and H5_FCFLAGS 
+# to ensure the flag is present for both configure as well as for the build.
+if test "X-" = "X-$f9x_flags_set"; then
+  F9XSUFFIXFLAG="-qsuffix=f=f90"
+  FCFLAGS="$FCFLAGS ${F9XSUFFIXFLAG}"
+  H5_FCFLAGS="$H5_FCFLAGS ${F9XSUFFIXFLAG}"
+  FSEARCH_DIRS="-I./ -I../src"
+  DEBUG_FCFLAGS="-g"
+  PROD_FCFLAGS="-O"
+  PROFILE_FCFLAGS="-g -pg"
+  f9x_flags_set=yes
+fi
+
+# The default C++ compiler
+
+# Use AIX supplied C++ compiler by default.
+CXX=${CXX=xlC}
+
+# Added -qweaksymbol to suppress linker messages warning of duplicate
+# symbols; these warnings are harmless. - BMR
+H5_CXXFLAGS="$H5_CXXFLAGS -qweaksymbol"
+AM_CXXFLAGS="$AM_CXXFLAGS"
+
+
+#----------------------------------------------------------------------------
+# Compiler flags. The CPPFLAGS values should not include package debug
+# flags like `-DH5G_DEBUG' since these are added with the
+# `--enable-debug' switch of configure.
+
+case $CC_BASENAME in
+  xlc|xlc-*|xlc_r|xlc_r-*|mpcc_r|mpcc_r-*)
+    . $srcdir/config/ibm-flags
+    ;;
+
+  gcc)
+    . $srcdir/config/gnu-flags
+    ;;
+
+  *)
+    H5_CFLAGS="$H5_CFLAGS -ansi"
+    DEBUG_CFLAGS="-g"
+    DEBUG_CPPFLAGS=
+    PROD_CFLAGS="-O"
+    PROD_CPPFLAGS=
+    PROFILE_CFLAGS="-pg"
+    PROFILE_CPPFLAGS=
+    ;;
+esac
+
+#----------------------------------------------------------------------------
+# Values for overriding configuration tests when cross compiling.
+# This includes compiling on some machines where the serial front end
+# compiles for a parallel back end.
+
+# Set this to `yes' or `no' depending on whether the target is big
+# endian or little endian.
+hdf5_cv_printf_ll=${hdf5_cv_printf_ll='ll'}
+ac_cv_c_bigendian=${ac_cv_c_bigendian='yes'}
+ac_cv_header_stdc=${ac_cv_header_stdc='yes'}
+ac_cv_header_sys_ioctl_h=${ac_cv_header_sys_ioctl_h=yes}
+
+# cache the sizeof of "standard C types" so that configure can run faster.
+ac_cv_sizeof_char=${ac_cv_sizeof_char=1}
+ac_cv_sizeof_short=${ac_cv_sizeof_short=2}
+ac_cv_sizeof_int=${ac_cv_sizeof_int=4}
+ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long=8}
+# Do not cache __int64 since it is not a standard C type and some compilers
+# (e.g., gcc) does not support it.
+ac_cv_sizeof_float=${ac_cv_sizeof_float=4}
+ac_cv_sizeof_double=${ac_cv_sizeof_double=8}
+ac_cv_sizeof_long_double=${ac_cv_sizeof_long_double=8}
+ac_cv_sizeof_int8_t=${ac_cv_sizeof_int8_t=1}
+ac_cv_sizeof_uint8_t=${ac_cv_sizeof_uint8_t=1}
+ac_cv_sizeof_int_least8_t=${ac_cv_sizeof_int_least8_t=1}
+ac_cv_sizeof_uint_least8_t=${ac_cv_sizeof_uint_least8_t=1}
+# Do not cache int_fast8_t since the vendor changes often.
+ac_cv_sizeof_int16_t=${ac_cv_sizeof_int16_t=2}
+ac_cv_sizeof_uint16_t=${ac_cv_sizeof_uint16_t=2}
+ac_cv_sizeof_int_least16_t=${ac_cv_sizeof_int_least16_t=2}
+ac_cv_sizeof_uint_least16_t=${ac_cv_sizeof_uint_least16_t=2}
+# Do not cache int_fast16_t since the vendor changes often.
+ac_cv_sizeof_int32_t=${ac_cv_sizeof_int32_t=4}
+ac_cv_sizeof_uint32_t=${ac_cv_sizeof_uint32_t=4}
+ac_cv_sizeof_int_least32_t=${ac_cv_sizeof_int_least32_t=4}
+ac_cv_sizeof_uint_least32_t=${ac_cv_sizeof_uint_least32_t=4}
+ac_cv_sizeof_int_fast32_t=${ac_cv_sizeof_int_fast32_t=4}
+ac_cv_sizeof_uint_fast32_t=${ac_cv_sizeof_uint_fast32_t=4}
+ac_cv_sizeof_int64_t=${ac_cv_sizeof_int64_t=8}
+ac_cv_sizeof_uint64_t=${ac_cv_sizeof_uint64_t=8}
+ac_cv_sizeof_int_least64_t=${ac_cv_sizeof_int_least64_t=8}
+ac_cv_sizeof_uint_least64_t=${ac_cv_sizeof_uint_least64_t=8}
+ac_cv_sizeof_int_fast64_t=${ac_cv_sizeof_int_fast64_t=8}
+ac_cv_sizeof_uint_fast64_t=${ac_cv_sizeof_uint_fast64_t=8}
+
+# Don't cache long since it varies between 32 and 64 bits
+#ac_cv_sizeof_long=${ac_cv_sizeof_long=4}
diff --git a/gatb-core/thirdparty/hdf5/config/ibm-flags b/gatb-core/thirdparty/hdf5/config/ibm-flags
new file mode 100644
index 0000000..462372d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/ibm-flags
@@ -0,0 +1,108 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# IBM XL compiler or a derivative.  It is careful not to do anything
+# if the compiler is not IBM; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for XL compiler
+# unless a compiler version is already defined.
+#
+#   cc_vendor:       The compiler product name: XL
+#   cc_version:      Version number: 10.1
+#   cc_version_info: More descriptive version information
+#
+if test X = "X$cc_flags_set"; then
+    # Verify this is an IBM XL compiler
+    cc_version="`$CC $CFLAGS -qversion 2>&1 | grep 'IBM XL C/C++'`"
+    if test X != "X$cc_version"; then
+        cc_vendor="XL"
+	cc_version="`$CC $CFLAGS -qversion 2>&1 | sed -n 's/Version: \([0-9\.]*\).*/\1/p'`"
+	cc_version_info="IBM XL C/C++ $cc_version"
+        echo "compiler '$CC' is IBM $cc_vendor-$cc_version"
+
+        # Some more version numbers.
+        # XL version numbers are of the form: "major.minor.X.Y"
+	# (Need to find out the official meaning of the 4 components.)
+        cc_vers_major=`echo $cc_version | cut -f1 -d.`
+        cc_vers_minor=`echo $cc_version | cut -f2 -d.`
+        cc_vers_patch=`echo $cc_version | cut -f3 -d.`
+        test -n "$cc_vers_major" || cc_vers_major=0
+        test -n "$cc_vers_minor" || cc_vers_minor=0
+        test -n "$cc_vers_patch" || cc_vers_patch=0
+        cc_vers_all=`expr \( \( $cc_vers_major \* 100 + $cc_vers_minor \) \* 100 \) + $cc_vers_patch`
+    fi
+fi
+
+# Common XL flags for various situations
+if test "XL" = "$cc_vendor"; then
+    # Insert section about version specific problems from gnu-flags here, if
+    # necessary.
+
+    # Turn off shared lib option.  It causes some test suite to fail.
+    enable_shared="${enable_shared:-no}"
+    # Make sure this is applied to other API compile options such as C++.
+    AM_CFLAGS="$AM_CFLAGS"
+    # -qflag=w:w makes the lowest level of reported compile issues to be "warning"
+    # instead of "information". This suppresses a very large number of messages
+    # concerning the portability of __inline__.
+    H5_CFLAGS="-qlanglvl=stdc99 -qflag=w:w $H5_CFLAGS"
+    DEBUG_CFLAGS="-g -qfullpath"
+    DEBUG_CPPFLAGS=
+    # -O causes test/dtypes to fail badly. Turn it off for now.
+    PROD_CFLAGS=""
+    PROD_CPPFLAGS=
+    PROFILE_CFLAGS="-g -qfullpath -pg"
+    PROFILE_CPPFLAGS=
+    # Flags are set
+    cc_flags_set=yes
+fi
+
+# Clear cc info if no flags set
+if test "X-$cc_flags_set" = "X-"; then
+  cc_vendor=
+  cc_version=
+  cc_version_info=
+fi
+
+
+# get fortran version info
+if test X != X$FC; then
+    # Verify this is an IBM XL compiler
+    fc_version="`$FC $FCFLAGS -qversion 2>&1 | grep 'IBM XL Fortran'`"
+    if test X != "X$fc_version"; then
+        fc_vendor="XL"
+	fc_version="`$FC $FCFLAGS -qversion 2>&1 | sed -n 's/Version: \([0-9\.]*\).*/\1/p'`"
+	fc_version_info="IBM XL Fortran $fc_version"
+        echo "compiler '$FC' is IBM $fc_vendor-$fc_version"
+
+    fi
+fi
+
+
+# get c++ version info
+if test X != X$CXX; then
+    # Verify this is an IBM XL compiler
+    cxx_version="`$CXX $CXXFLAGS -qversion 2>&1 | grep 'IBM XL C/C++'`"
+    if test X != "X$cxx_version"; then
+        cxx_vendor="XL"
+	cxx_version="`$CXX $CXXFLAGS -qversion 2>&1 | sed -n 's/Version: \([0-9\.]*\).*/\1/p'`"
+	cxx_version_info="IBM XL C/C++ $cxx_version"
+        echo "compiler '$CXX' is IBM $cxx_vendor-$cxx_version"
+
+    fi
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/intel-fflags b/gatb-core/thirdparty/hdf5/config/intel-fflags
new file mode 100644
index 0000000..3e33fc9
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/intel-fflags
@@ -0,0 +1,95 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# Intel ifort compiler or a derivative.  It is careful not to do anything
+# if the compiler is not Intel; otherwise `f9x_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for ifort
+# ifort unless a compiler version is already known
+#
+#   f9x_vendor:    The compiler name: ifort
+#   f9x_version:   Version number: 8.0
+#
+if test X = "X$f9x_flags_set"; then
+    f9x_version="`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 |grep '^Intel'`"
+    if test X != "X$f9x_version"; then
+        f9x_vendor=ifort
+        f9x_version="`echo $f9x_version |sed 's/.*Version \([-a-z0-9\.\-]*\).*/\1/'`"
+        echo "compiler '$FC' is Intel $f9x_vendor-$f9x_version"
+
+        # Some version numbers
+        # Intel version numbers are of the form: "major.minor"
+        f9x_vers_major=`echo $f9x_version | cut -f1 -d.`
+        f9x_vers_minor=`echo $f9x_version | cut -f2 -d.`
+        #f9x_vers_patch=`echo $f9x_version | cut -f2 -d.`
+        test -n "$f9x_vers_major" || f9x_vers_major=0
+        test -n "$f9x_vers_minor" || f9x_vers_minor=0
+        test -n "$f9x_vers_patch" || f9x_vers_patch=0
+        f9x_vers_all=`expr $f9x_vers_major '*' 1000000 + $f9x_vers_minor '*' 1000 + $f9x_vers_patch`
+    fi
+fi
+
+# Common Intel flags for various situations
+if test "X-ifort" = "X-$f9x_vendor"; then
+    # Insert section about version specific problems from gnu-flags here, if
+    # necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # Host-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "`hostname`" in
+    #    sleipnir.ncsa.uiuc.edu)
+    #        arch="$arch -pipe"
+    #        ;;
+    #esac
+
+    # General
+    FC_BASENAME=ifort
+    F9XSUFFIXFLAG=""
+    FSEARCH_DIRS=""
+    H5_FCFLAGS="$H5_FCFLAGS"
+
+    # Production
+    PROD_FCFLAGS="-O3"
+
+    # Debug
+    DEBUG_FCFLAGS="-g -check all"
+
+    # Profile
+    # Use this for profiling with gprof
+    PROFILE_FCFLAGS="-g -p"
+
+    # Flags are set
+    f9x_flags_set=yes
+fi
+
+# Clear f9x info if no flags set
+if test "X-$f9x_flags_set" = "X-"; then
+  f9x_vendor=
+  f9x_version=
+fi
+
+
diff --git a/gatb-core/thirdparty/hdf5/config/intel-flags b/gatb-core/thirdparty/hdf5/config/intel-flags
new file mode 100644
index 0000000..3187daf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/intel-flags
@@ -0,0 +1,115 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# Intel icc compiler or a derivative.  It is careful not to do anything
+# if the compiler is not Intel; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for icc
+# icc unless a compiler version is already known
+#
+#   cc_vendor:    The compiler name: icc
+#   cc_version:   Version number: 8.0
+#
+if test X = "X$cc_flags_set"; then
+    cc_version="`$CC $CFLAGS $H5_CFLAGS -V 2>&1 |grep 'Version'`"
+    if test X != "X$cc_version"; then
+        cc_vendor=icc
+        cc_version=`echo $cc_version |sed 's/.*Version \([-a-z0-9\.\-]*\).*/\1/'`
+        echo "compiler '$CC' is Intel $cc_vendor-$cc_version"
+
+        # Some version numbers
+        # Intel version numbers are of the form: "major.minor"
+        cc_vers_major=`echo $cc_version | cut -f1 -d.`
+        cc_vers_minor=`echo $cc_version | cut -f2 -d.`
+        #cc_vers_patch=`echo $cc_version | cut -f2 -d.`
+        test -n "$cc_vers_major" || cc_vers_major=0
+        test -n "$cc_vers_minor" || cc_vers_minor=0
+        test -n "$cc_vers_patch" || cc_vers_patch=0
+        cc_vers_all=`expr $cc_vers_major '*' 1000000 + $cc_vers_minor '*' 1000 + $cc_vers_patch`
+    fi
+fi
+
+# Common Intel flags for various situations
+if test "X-icc" = "X-$cc_vendor"; then
+    # Insert section about version specific problems from compiler flags here,
+    # if necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # Host-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "`hostname`" in
+    #    sleipnir.ncsa.uiuc.edu)
+    #        arch="$arch -pipe"
+    #        ;;
+    #esac
+
+    # General
+    # Default to C99 standard.
+    H5_CFLAGS="${H5_CFLAGS:--std=c99 $arch}"
+
+    # Production is set to default; see settings for specific version further down
+    PROD_CFLAGS="-O" 
+    PROD_CPPFLAGS=
+
+    # Debug
+    DEBUG_CFLAGS="-Wcheck -Wall -g -O0"
+    DEBUG_CPPFLAGS=
+
+    # Profile
+    # Use this for profiling with gprof
+    PROFILE_CFLAGS="-g -p"
+    PROFILE_CPPFLAGS=
+
+    # Flags are set
+    cc_flags_set=yes
+
+fi
+
+# Version specific ICC flags
+#
+# Please follow the pattern below by adding new versions at the top, copying
+# the information from the previous version and adding modifications to that.
+# The default at the bottom will apply if no earlier version matches.
+case "$cc_vendor-$cc_version" in
+    icc-10*)
+        PROD_CFLAGS="-O1 -Wl,-s"
+        ;;
+    icc-8.0*)
+	# v8.0 -O3 infinite loops when compiling test/tselect.c. Use -O2.
+	PROD_CFLAGS="-O2 -Wl,-s"
+	;;
+    icc-*)
+        # -s became obsolete; we also fixed bugs that allow us to enable higher level
+        # of optimization starting with 1.8.7
+        PROD_CFLAGS="-O3"
+        ;;
+esac
+
+# Clear cc info if no flags set
+if test "X-$cc_flags_set" = "X-"; then
+    cc_vendor=
+    cc_version=
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/linux-gnu b/gatb-core/thirdparty/hdf5/config/linux-gnu
new file mode 100644
index 0000000..912a93b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/linux-gnu
@@ -0,0 +1,19 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This is the same as linux-gnulibc1
+
+. $srcdir/config/linux-gnulibc1
diff --git a/gatb-core/thirdparty/hdf5/config/linux-gnuaout b/gatb-core/thirdparty/hdf5/config/linux-gnuaout
new file mode 100644
index 0000000..912a93b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/linux-gnuaout
@@ -0,0 +1,19 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This is the same as linux-gnulibc1
+
+. $srcdir/config/linux-gnulibc1
diff --git a/gatb-core/thirdparty/hdf5/config/linux-gnulibc1 b/gatb-core/thirdparty/hdf5/config/linux-gnulibc1
new file mode 100644
index 0000000..d1f89af
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/linux-gnulibc1
@@ -0,0 +1,247 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# The default compiler is `gcc'.
+if test -z "$CC"; then
+    if test "X-$enable_parallel" = "X-yes"; then
+	# default to use mpicc which is the defacto MPI compiler name
+	CC=mpicc
+	CC_BASENAME=mpicc
+    else
+	CC=gcc
+	CC_BASENAME=gcc
+    fi
+fi
+
+# Figure out GNU C compiler flags
+. $srcdir/config/gnu-flags
+
+# Figure out PGI C compiler flags
+. $srcdir/config/pgi-flags
+
+# Figure out CCE C compiler flags
+. $srcdir/config/cce-flags
+
+# Figure out Intel C compiler flags
+. $srcdir/config/intel-flags
+
+# Use default Fortran 90 compiler according to what C compiler is used.
+if test "X-" = "X-$FC"; then
+    case $CC_BASENAME in
+        gcc*)
+            FC=gfortran
+            FC_BASENAME=gfortran
+            ;;
+	pgcc*)
+            FC=pgf90
+            FC_BASENAME=pgf90
+            ;;
+        icc*)
+            FC=ifort
+            FC_BASENAME=ifort
+            ;;
+        mpicc*)
+            FC=mpif90
+            FC_BASENAME=mpif90
+            ;;
+    esac
+else
+    case $FC in
+        # The PGI and Intel compilers are automatically detected below
+        ifc*|ifort*|pgf90*)
+            ;;
+
+        *f95*)
+            # Figure out which compiler we are using: pgf90 or Absoft f95
+            RM='rm -f'
+            tmpfile=/tmp/cmpver.$$
+            $FC -V >$tmpfile
+            if test -s "$tmpfile"; then 
+                if( grep -s 'Absoft' $tmpfile > /dev/null) then
+                    FC_BASENAME=f95
+                fi 
+                if( grep -s 'pgf90' $tmpfile > /dev/null) then
+                    FC_BASENAME=pgf90
+                fi 
+            fi
+            $RM $tmpfile
+            fc_version_info=`$FC -V | grep Absoft`
+            ;;
+
+         *)
+            ;;
+    esac
+fi
+
+# Figure out PGI FC compiler flags
+. $srcdir/config/pgi-fflags
+
+# Figure out CCE FC compiler flags
+. $srcdir/config/cce-fflags
+
+# Figure out Intel FC compiler flags
+. $srcdir/config/intel-fflags
+
+case $FC_BASENAME in
+    #
+    # Absoft compiler
+    #
+    f95)
+        # Set required flag for compiling C stubs
+        H5_CFLAGS="$H5_CFLAGS" 
+
+        F9XSUFFIXFLAG=""
+# We force compiler to use upper case for external names 
+# (just in case since this should be a default EIP)
+        H5_FCFLAGS="$H5_FCFLAGS"
+        FSEARCH_DIRS=""
+        DEBUG_FCFLAGS="-g"
+        PROD_FCFLAGS="-O"
+        PROFILE_FCFLAGS="-g -pg"
+        f9x_flags_set=yes
+        ;;
+
+esac  
+
+# The default C++ compiler
+
+# The default compiler is `g++'.
+if test -z "$CXX"; then
+  CXX=g++
+  CXX_BASENAME=g++
+fi
+
+# compiler version strings
+
+# check if the compiler_version_info is already set
+if test -z "$cc_version_info"; then
+
+case $CC in
+    # whatever matches *pgcc* will also match *gcc*, so this one must come first
+    *pgcc*)
+        cc_version_info=`$CC $CFLAGS $H5_CFLAGS -V 2>&1 | grep 'pgcc'`
+        ;;
+
+    *gcc*)
+        cc_version_info=`$CC $CFLAGS $H5_CFLAGS --version 2>&1 | grep -v 'PathScale' |\
+            grep 'GCC' | sed 's/\(.*(GCC) [-a-z0-9\. ]*\).*/\1/'`
+        ;;
+    # this must come before *icc* for the same reason
+    *mpicc*)
+        cc_version_info=`$CC $CCFLAGS $H5_CCFLAGS -v 2>&1 | grep 'version' |\
+            sed 's/^[a-z0-9]* for //' |\
+            sed 's/\"/\\\"/g' |\
+            sed 's/^\([a-z]* \)/ built with \1/1'`
+        cc_version_info=`echo $cc_version_info`
+        ;; 
+
+    *icc*)
+        cc_version_info=`$CC $CCFLAGS $H5_CCFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+
+    *)
+        echo "No match to get cc_version_info for $CC"
+        ;;
+esac
+
+fi
+
+# get fortran version info
+# check if the compiler_version_info is already set
+if test -z "$fc_version_info"; then
+case $FC in
+    *gfortran*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS --version 2>&1 |\
+            grep 'GCC' | sed 's/\(.*(GCC) [-a-z0-9\. ]*\).*/\1/'`
+        ;;
+
+    *mpif90*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS -v 2>&1 | grep 'version' |\
+            sed 's/^[a-z0-9]* for //' |\
+            sed 's/\"/\\\"/g' |\
+            sed 's/^\([a-z]* \)/ built with \1/1'`
+        fc_version_info=`echo $fc_version_info`
+        ;;
+
+    *ifc*|*ifort*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+
+    *f95*)
+        # Figure out which compiler we are using: pgf90 or Absoft f95
+        RM='rm -f'
+        tmpfile=/tmp/cmpver.$$
+        $FC -V >$tmpfile
+        if test -s "$tmpfile"; then 
+            if( grep -s 'Absoft' $tmpfile > /dev/null) then
+                FC_BASENAME=f95
+            fi 
+        fi
+        $RM $tmpfile
+        fc_version_info=`$FC -V | grep Absoft`
+        ;;
+
+    *g95*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS --version 2>&1 |\
+            grep 'GCC'` 
+        ;;
+
+    *pgf90*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 | grep 'pgf90'`
+        ;;
+
+     *)
+        echo "No match to get fc_version_info for $FC"
+        ;;
+esac
+fi
+
+# get c++ version info
+# check if the compiler_version_info is already set
+if test -z "$cxx_version_info"; then
+case $CXX in
+    *g++*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS --version 2>&1 |\
+            grep 'GCC' | sed 's/\(.*(GCC) [-a-z0-9\. ]*\).*/\1/'`
+        ;;
+    *icpc*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS -V 2>&1 | grep 'Version' |\
+            sed 's/\(Intel.* Compiler\).*\( Version [a-z0-9\.]*\).*\( Build [0-9]*\)/\1\2\3/'`
+        ;;
+    *pgCC*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS -V 2>&1 | grep 'pgCC'`
+        ;;
+
+    *mpicxx*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS -v 2>&1 | grep 'version' |\
+            sed 's/^[a-z0-9]* for //' |\
+            sed 's/^\([a-z]* \)/ built with \1/1'`
+        cxx_version_info=`echo $cxx_version_info`
+        ;; 
+
+    *)
+        echo "No match to get cxx_version_info for $CXX"
+        ;;
+esac
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/linux-gnulibc2 b/gatb-core/thirdparty/hdf5/config/linux-gnulibc2
new file mode 100644
index 0000000..76526b8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/linux-gnulibc2
@@ -0,0 +1,24 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# Same as with gnulibc1 for now
+. $srcdir/config/linux-gnulibc1
diff --git a/gatb-core/thirdparty/hdf5/config/lt_vers.am b/gatb-core/thirdparty/hdf5/config/lt_vers.am
new file mode 100644
index 0000000..ba8f9db
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/lt_vers.am
@@ -0,0 +1,82 @@
+## config/lt_vers.am
+## (Use double hashes for copyright notice so that automake treats it as
+## comments and does not pass it to Makefile.in)
+## Copyright by The HDF Group.
+## Copyright by the Board of Trustees of the University of Illinois.
+## All rights reserved.
+##
+## This file is part of HDF5.  The full HDF5 copyright notice, including
+## terms governing use, modification, and redistribution, is contained in
+## the files COPYING and Copyright.html.  COPYING can be found at the root
+## of the source code distribution tree; Copyright.html can be found at the
+## root level of an installed copy of the electronic HDF5 document set and
+## is linked from the top-level documents page.  It can also be found at
+## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+## access to either file, you may request a copy from help at hdfgroup.org.
+##
+# Add libtool shared library version numbers to the HDF5 library
+# See libtool versioning documentation online.
+# After making changes, run bin/reconfigure to update other configure related
+# files like Makefile.in.
+LT_VERS_INTERFACE = 12
+LT_VERS_REVISION = 1
+LT_VERS_AGE = 2
+
+## If the API changes *at all*, increment LT_VERS_INTERFACE and
+## reset LT_VERS_REVISION to 0.
+##
+## If the API changes but no function signatures are removed or
+## changed, also increment LT_VERS_AGE.
+## If any functions are removed from the API, or their signatures
+## are changed reset LT_VERS_AGE to 0 to indicate that previous
+## versions of the API are not necessarily compatible with this
+## version.
+##
+## If the source changes but there are no API changes, increment
+## LT_VERS_REVISION.  This will happen automatically when
+## bin/h5vers is run, but doing it manually shouldn't hurt
+## anything.
+##
+## Note that this versioning system doesn't attempt to handle
+## the effects of the H5_V1_x_COMPAT flag.
+
+## Version numbers for wrapper shared library files.
+LT_CXX_VERS_INTERFACE = 13
+LT_CXX_VERS_REVISION = 0
+LT_CXX_VERS_AGE = 0
+
+LT_F_VERS_INTERFACE = 10
+LT_F_VERS_REVISION = 4
+LT_F_VERS_AGE = 0
+
+LT_HL_VERS_INTERFACE = 11
+LT_HL_VERS_REVISION = 1
+LT_HL_VERS_AGE = 1
+
+LT_HL_CXX_VERS_INTERFACE = 12
+LT_HL_CXX_VERS_REVISION = 0
+LT_HL_CXX_VERS_AGE = 1
+
+LT_HL_F_VERS_INTERFACE = 10
+LT_HL_F_VERS_REVISION = 3
+LT_HL_F_VERS_AGE = 0
+
+LT_TOOLS_VERS_INTERFACE = 10
+LT_TOOLS_VERS_REVISION = 4
+LT_TOOLS_VERS_AGE = 0
+
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+
diff --git a/gatb-core/thirdparty/hdf5/config/pgi-fflags b/gatb-core/thirdparty/hdf5/config/pgi-fflags
new file mode 100644
index 0000000..6cb8930
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/pgi-fflags
@@ -0,0 +1,106 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# PGI pgf90 compiler or a derivative.  It is careful not to do anything
+# if the compiler is not PGI; otherwise `f9x_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for pgf90
+# pgf90 unless a compiler version is already known
+#
+#   f9x_vendor:    The compiler name: pgf90
+#   f9x_version:   Version number: 5.0-2, 5.2-2
+#
+if test X = "X$f9x_flags_set"; then
+    f9x_version="`$FC $FCFLAGS -V 2>&1 |grep '^pgf90 '`"
+    if test X != "X$f9x_version"; then
+        is_mpi="`$FC $FCFLAGS -help 2>&1 |grep 'link MPI'`"
+        f9x_vendor=`echo $f9x_version |sed 's/\([a-z0-9]*\).*/\1/'`
+        f9x_version=`echo $f9x_version |sed 's/pgf90 \([-a-z0-9\.\-]*\).*/\1/'`
+        echo "compiler '$FC' is PGI $f9x_vendor-$f9x_version"
+
+        # Some version numbers
+        # PGI version numbers are of the form: "major.minor-patch"
+        f9x_vers_major=`echo $f9x_version | cut -f1 -d.`
+        f9x_vers_minor=`echo $f9x_version | cut -f2 -d. | cut -f1 -d-`
+        f9x_vers_patch=`echo $f9x_version | cut -f2 -d. | cut -f2 -d-`
+        test -n "$f9x_vers_major" || f9x_vers_major=0
+        test -n "$f9x_vers_minor" || f9x_vers_minor=0
+        test -n "$f9x_vers_patch" || f9x_vers_patch=0
+        f9x_vers_all=`expr $f9x_vers_major '*' 1000000 + $f9x_vers_minor '*' 1000 + $f9x_vers_patch`
+    fi
+fi
+
+# Common PGI flags for various situations
+if test "X-pgf90" = "X-$f9x_vendor"; then
+    # Insert section about version specific problems from gnu-flags here, if
+    # necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # Host-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "`hostname`" in
+    #    sleipnir.ncsa.uiuc.edu)
+    #        arch="$arch -pipe"
+    #        ;;
+    #esac
+
+    # General
+    FC_BASENAME=pgf90
+    F9XSUFFIXFLAG=""
+    FSEARCH_DIRS=""
+    # Uncomment the following to add something specific for FCFLAGS.
+    #FCFLAGS="$FCFLAGS"
+
+    # Production
+    # Check for MPI wrapper being used and tweak down compiler options
+    # Comment out the Tweaking since it caused problems to mpich1.2.6.
+    # Need to investigate the reasons to tweak.
+    #if test "X-" == "X-$is_mpi"; then
+    #    PROD_FCFLAGS="-fast -s -Mnoframe"
+    #else
+    #    PROD_FCFLAGS="-O2 -s"
+    #fi
+    PROD_FCFLAGS="-fast -s -Mnoframe"
+
+    # Debug
+    DEBUG_FCFLAGS="-g -Mbounds -Mchkptr -Mdclchk"
+
+    # Profile
+    PROFILE_FCFLAGS="-g -Mprof=func,line"
+    # Use this for profiling with gprof
+    #PROFILE_FCFLAGS="-g -pg"
+
+    # Flags are set
+    f9x_flags_set=yes
+fi
+
+# Clear f9x info if no flags set
+if test "X-$f9x_flags_set" = "X-"; then
+  f9x_vendor=
+  f9x_version=
+fi
+
+
diff --git a/gatb-core/thirdparty/hdf5/config/pgi-flags b/gatb-core/thirdparty/hdf5/config/pgi-flags
new file mode 100644
index 0000000..29e6f05
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/pgi-flags
@@ -0,0 +1,108 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file should be sourced into configure if the compiler is the
+# PGI pgcc compiler or a derivative.  It is careful not to do anything
+# if the compiler is not PGI; otherwise `cc_flags_set' is set to `yes'
+#
+
+# Get the compiler version in a way that works for pgcc
+# pgcc unless a compiler version is already known
+#
+#   cc_vendor:    The compiler name: pgcc
+#   cc_version:   Version number: 5.0-2, 5.2-2
+#
+if test X = "X$cc_flags_set"; then
+    cc_version="`$CC $CFLAGS -V 2>&1 |grep '^pgcc '`"
+    if test X != "X$cc_version"; then
+        is_mpi="`$CC $CFLAGS -help 2>&1 |grep 'MPI'`"
+        cc_vendor=`echo $cc_version |sed 's/\([a-z]*\).*/\1/'`
+        cc_version=`echo $cc_version |sed 's/pgcc \([-a-z0-9\.\-]*\).*/\1/'`
+        echo "compiler '$CC' is PGI $cc_vendor-$cc_version"
+
+        # Some version numbers
+        # PGI version numbers are of the form: "major.minor-patch"
+        cc_vers_major=`echo $cc_version | cut -f1 -d.`
+        cc_vers_minor=`echo $cc_version | cut -f2 -d. | cut -f1 -d-`
+        cc_vers_patch=`echo $cc_version | cut -f2 -d. | cut -f2 -d-`
+        test -n "$cc_vers_major" || cc_vers_major=0
+        test -n "$cc_vers_minor" || cc_vers_minor=0
+        test -n "$cc_vers_patch" || cc_vers_patch=0
+        cc_vers_all=`expr $cc_vers_major '*' 1000000 + $cc_vers_minor '*' 1000 + $cc_vers_patch`
+    fi
+fi
+
+# Common PGI flags for various situations
+if test "X-pgcc" = "X-$cc_vendor"; then
+    # Insert section about version specific problems from gnu-flags here, if
+    # necessary.
+
+    arch=
+    # Architecture-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "$host_os-$host_cpu" in
+    #    *-i686)
+    #        arch="-march=i686"
+    #        ;;
+    #esac
+
+    # Host-specific flags
+    # Nothing currently. (Uncomment code below and modify to add any)
+    #case "`hostname`" in
+    #    sleipnir.ncsa.uiuc.edu)
+    #        arch="$arch -pipe"
+    #        ;;
+    #esac
+
+    # General
+    H5_CFLAGS="$H5_CFLAGS $arch -c99 -Minform=inform"
+
+    # Production
+    case "$cc_vendor-$cc_version" in
+      # Tweak down compiler optimizations for v10.6, it has a bug
+      pgcc-10.6*)
+        PROD_CFLAGS="-O1 -s"
+        ;;
+      # Tweak down compiler optimizations for v9.x
+      pgcc-9.*)
+        PROD_CFLAGS="-O1 -s"
+        ;;
+      *)
+        PROD_CFLAGS="-fast -s"
+        ;;
+    esac
+    PROD_CPPFLAGS=
+
+    # Debug
+    DEBUG_CFLAGS="-g -Mbounds"
+    DEBUG_CPPFLAGS=
+
+    # Profile
+    PROFILE_CFLAGS="-g -Mprof=func,line"
+    # Use this for profiling with gprof
+    #PROFILE_CFLAGS="-g -pg"
+    PROFILE_CPPFLAGS=
+
+    # Flags are set
+    cc_flags_set=yes
+
+fi
+
+# Clear cc info if no flags set
+if test "X-$cc_flags_set" = "X-"; then
+  cc_vendor=
+  cc_version=
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/site-specific/BlankForm b/gatb-core/thirdparty/hdf5/config/site-specific/BlankForm
new file mode 100644
index 0000000..c31383c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/site-specific/BlankForm
@@ -0,0 +1,47 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script. It is processed shortly
+# after configure starts and defines is used to define environment
+# variables which a specific machine may need
+
+# Files in this directory should be named:
+#
+#		host-$hostname
+#
+# where $hostname is the output from the `hostname' command.
+
+# Specifying Extra Library Directories
+# ------------------------------------
+#
+# The user should be able to specify extra library directories for the
+# LDFLAGS macro. The compiler may not be set up to recognize those
+# directories as valid library directories
+
+if test -f "/usr/ncsa/lib"; then
+   LDFLAGS="/usr/ncsa/lib"
+fi
+
+# Specifying Extra Include Directories
+# ------------------------------------
+#
+# The user should be able to specify extra include directories for the
+# CPPFLAGS macro. The compiler may not be set up to recognize those
+# directories as valid include directories
+
+if test -f "/usr/ncsa/include"; then
+   CPPFLAGS="/usr/ncsa/include"
+fi
diff --git a/gatb-core/thirdparty/hdf5/config/solaris b/gatb-core/thirdparty/hdf5/config/solaris
new file mode 100644
index 0000000..310c373
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/config/solaris
@@ -0,0 +1,159 @@
+#							-*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details
+
+# The default compiler is `sunpro cc'
+if test "X-" =  "X-$CC"; then
+  CC=cc
+  CC_BASENAME=cc
+fi
+
+# Try gcc compiler flags
+. $srcdir/config/gnu-flags
+
+# Try solaris native compiler flags
+if test "X-" = "X-$cc_flags_set"; then
+  H5_CFLAGS="$H5_CFLAGS -erroff=%none -DBSD_COMP"
+  # -g produces rather slow code. "-g -O" produces much faster code with some
+  # loss of debugger functions such as not able to print local variables.
+  DEBUG_CFLAGS="-g -O"
+  DEBUG_CPPFLAGS=
+  PROD_CFLAGS="-O -s"
+  PROD_CPPFLAGS=
+  PROFILE_CFLAGS=-xpg
+  PROFILE_CPPFLAGS=
+  cc_flags_set=yes
+# Special linking flag is needed to build with Fortran on Solaris 5.9
+    system_version="`uname -r`"
+    case "$system_version" in
+	5.9*)
+	    # Need the xopenmp flag to build the Fortran library
+	    if test X-$enable_fortran = X-yes; then
+		AM_LDFLAGS="$AM_LDFLAGS -xopenmp=stubs"
+	    fi
+	    ;;
+    esac
+
+  # Turn off optimization flag for SUNpro compiler versions 4.x which
+  # have an optimization bug.  Version 5.0 works.
+  ($CC -V 2>&1) | grep -s 'cc: .* C 4\.' >/dev/null 2>&1 \
+       && PROD_CFLAGS="`echo $PROD_CFLAGS | sed -e 's/-O//'`"
+fi
+
+LIBS="$LIBS"
+
+# The default Fortran 90 compiler
+
+if test "X-" = "X-$FC"; then
+  FC=f90
+fi
+
+if test "X-" = "X-$f9x_flags_set"; then
+  F9XSUFFIXFLAG=""
+  FSEARCH_DIRS=""
+  H5_FCFLAGS="$H5_FCFLAGS"
+  # -g produces rather slow code. "-g -O" produces much faster code with some
+  # loss of debugger functions such as not able to print local variables.
+  DEBUG_FCFLAGS="-g -O"
+  PROD_FCFLAGS="-O2"
+  PROFILE_FCFLAGS=""
+  f9x_flags_set=yes
+fi
+
+# The default C++ compiler
+
+# The default compiler is `sunpro cc'
+if test -z "$CXX"; then
+  CXX=CC
+  CXX_BASENAME=CC
+fi
+
+# Try gcc compiler flags
+#. $srcdir/config/gnu-flags
+
+cxx_version="`$CXX -V 2>&1 |grep 'WorkShop' |\
+                sed 's/.*WorkShop.*C++ \([0-9\.]*\).*/\1/'`"
+
+cxx_vers_major=`echo $cxx_version | cut -f1 -d.`
+cxx_vers_minor=`echo $cxx_version | cut -f2 -d.`
+cxx_vers_patch=`echo $cxx_version | cut -f3 -d.`
+
+# Specify the "-features=tmplife" if the compiler can handle this...
+if test -n "$cxx_version"; then
+  if test $cxx_vers_major -ge 5 -a $cxx_vers_minor -ge 3 -o $cxx_vers_major -gt 5; then
+    H5_CXXFLAGS="$H5_CXXFLAGS -features=tmplife"
+  fi
+fi
+
+# Try solaris native compiler flags
+if test -z "$cxx_flags_set"; then
+  H5_CXXFLAGS="$H5_CXXFLAGS -instances=static"
+  H5_CPPFLAGS="$H5_CPPFLAGS -LANG:std"
+  # -g produces rather slow code. "-g -O" produces much faster code with some
+  # loss of debugger functions such as not able to print local variables.
+  DEBUG_CXXFLAGS="-g -O"
+  DEBUG_CPPFLAGS=
+  PROD_CXXFLAGS="-O -s"
+  PROD_CPPFLAGS=
+  PROFILE_CXXFLAGS=-xpg
+  PROFILE_CPPFLAGS=
+  cxx_flags_set=yes
+fi
+
+# compiler version strings
+case $CC in
+    *cc*)
+        cc_version_info=`$CC $CFLAGS $H5_CFLAGS -V 2>&1 | grep 'Sun' |\
+            sed 's/.*\(Sun .*\)/\1 /'`
+        ;;
+
+    *)
+        echo "No match to get cc_version_info for $CC"
+        ;;
+esac
+echo "C compiler '$CC' is $cc_version_info"
+
+case $FC in
+    # The PGI and Intel compilers are automatically detected below
+    *f90*)
+        fc_version_info=`$FC $FCFLAGS $H5_FCFLAGS -V 2>&1 | grep 'Sun' |\
+            sed 's/.*\(Sun .*\)/\1 /'`
+        ;;
+
+     *)
+        echo "No match to get fc_version_info for $FC"
+        ;;
+esac
+echo "Fortran compiler '$FC' is $fc_version_info"
+
+# get c++ version info
+case $CXX in
+    *CC*)
+        cxx_version_info=`$CXX $CXXFLAGS $H5_CXXFLAGS -V 2>&1 | grep 'Sun' |\
+            sed 's/.*\(Sun .*\)/\1 /'`
+        ;;
+
+    *)
+        echo "No match to get cxx_version_info for $CXX"
+        ;;
+esac
+
+
diff --git a/gatb-core/thirdparty/hdf5/src/CMakeLists.txt b/gatb-core/thirdparty/hdf5/src/CMakeLists.txt
new file mode 100644
index 0000000..75754fe
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/CMakeLists.txt
@@ -0,0 +1,787 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_SRC C CXX)
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-----------------------------------------------------------------------------
+# List Source Files
+#-----------------------------------------------------------------------------
+set (H5_SRCS
+    ${HDF5_SRC_DIR}/H5.c
+    ${HDF5_SRC_DIR}/H5checksum.c
+    ${HDF5_SRC_DIR}/H5dbg.c
+    ${HDF5_SRC_DIR}/H5system.c
+    ${HDF5_SRC_DIR}/H5timer.c
+    ${HDF5_SRC_DIR}/H5trace.c
+)
+
+set (H5_HDRS
+    ${HDF5_SRC_DIR}/hdf5.h
+    ${HDF5_SRC_DIR}/H5api_adpt.h
+    ${HDF5_SRC_DIR}/H5public.h
+    ${HDF5_SRC_DIR}/H5version.h
+    ${HDF5_SRC_DIR}/H5overflow.h
+)
+IDE_GENERATED_PROPERTIES ("H5" "${H5_HDRS}" "${H5_SRCS}" )
+
+set (H5A_SRCS
+    ${HDF5_SRC_DIR}/H5A.c
+    ${HDF5_SRC_DIR}/H5Abtree2.c
+    ${HDF5_SRC_DIR}/H5Adense.c
+    ${HDF5_SRC_DIR}/H5Adeprec.c
+    ${HDF5_SRC_DIR}/H5Aint.c
+    ${HDF5_SRC_DIR}/H5Atest.c
+)
+
+set (H5A_HDRS
+    ${HDF5_SRC_DIR}/H5Apkg.h
+    ${HDF5_SRC_DIR}/H5Apublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5A" "${H5A_HDRS}" "${H5A_SRCS}" )
+
+set (H5AC_SRCS
+    ${HDF5_SRC_DIR}/H5AC.c
+)
+
+set (H5AC_HDRS
+    ${HDF5_SRC_DIR}/H5ACpkg.h
+    ${HDF5_SRC_DIR}/H5ACpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5AC" "${H5AC_HDRS}" "${H5AC_SRCS}" )
+
+set (H5B_SRCS
+    ${HDF5_SRC_DIR}/H5B.c
+    ${HDF5_SRC_DIR}/H5B2.c
+    ${HDF5_SRC_DIR}/H5B2cache.c
+    ${HDF5_SRC_DIR}/H5B2dbg.c
+    ${HDF5_SRC_DIR}/H5B2hdr.c
+    ${HDF5_SRC_DIR}/H5B2int.c
+    ${HDF5_SRC_DIR}/H5B2stat.c
+    ${HDF5_SRC_DIR}/H5B2test.c
+    ${HDF5_SRC_DIR}/H5Bcache.c
+    ${HDF5_SRC_DIR}/H5Bdbg.c
+)
+
+set (H5B_HDRS
+    ${HDF5_SRC_DIR}/H5B2pkg.h
+    ${HDF5_SRC_DIR}/H5B2public.h
+    ${HDF5_SRC_DIR}/H5Bpkg.h
+    ${HDF5_SRC_DIR}/H5Bpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5B" "${H5B_HDRS}" "${H5B_SRCS}" )
+
+set (H5D_SRCS
+    ${HDF5_SRC_DIR}/H5D.c
+    ${HDF5_SRC_DIR}/H5Dcompact.c
+    ${HDF5_SRC_DIR}/H5Dbtree.c
+    ${HDF5_SRC_DIR}/H5Dchunk.c
+    ${HDF5_SRC_DIR}/H5Dcontig.c
+    ${HDF5_SRC_DIR}/H5Ddbg.c
+    ${HDF5_SRC_DIR}/H5Ddeprec.c
+    ${HDF5_SRC_DIR}/H5Defl.c
+    ${HDF5_SRC_DIR}/H5Dfill.c
+    ${HDF5_SRC_DIR}/H5Dint.c
+    ${HDF5_SRC_DIR}/H5Dio.c
+    ${HDF5_SRC_DIR}/H5Dlayout.c
+    ${HDF5_SRC_DIR}/H5Dmpio.c
+    ${HDF5_SRC_DIR}/H5Doh.c
+    ${HDF5_SRC_DIR}/H5Dscatgath.c
+    ${HDF5_SRC_DIR}/H5Dselect.c
+    ${HDF5_SRC_DIR}/H5Dtest.c
+)
+
+set (H5D_HDRS
+    ${HDF5_SRC_DIR}/H5Dpkg.h
+    ${HDF5_SRC_DIR}/H5Dpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5D" "${H5D_HDRS}" "${H5D_SRCS}" )
+
+set (H5E_SRCS
+    ${HDF5_SRC_DIR}/H5E.c
+    ${HDF5_SRC_DIR}/H5Edeprec.c
+    ${HDF5_SRC_DIR}/H5Eint.c
+)
+
+set (H5E_HDRS
+    ${HDF5_SRC_DIR}/H5Edefin.h
+    ${HDF5_SRC_DIR}/H5Einit.h
+    ${HDF5_SRC_DIR}/H5Epkg.h
+    ${HDF5_SRC_DIR}/H5Epubgen.h
+    ${HDF5_SRC_DIR}/H5Epublic.h
+    ${HDF5_SRC_DIR}/H5Eterm.h
+)
+IDE_GENERATED_PROPERTIES ("H5E" "${H5E_HDRS}" "${H5E_SRCS}" )
+
+set (H5F_SRCS
+    ${HDF5_SRC_DIR}/H5F.c
+    ${HDF5_SRC_DIR}/H5Fint.c
+    ${HDF5_SRC_DIR}/H5Faccum.c
+    ${HDF5_SRC_DIR}/H5Fcwfs.c
+    ${HDF5_SRC_DIR}/H5Fdbg.c
+    ${HDF5_SRC_DIR}/H5Fefc.c
+    ${HDF5_SRC_DIR}/H5Ffake.c
+    ${HDF5_SRC_DIR}/H5Fio.c
+    ${HDF5_SRC_DIR}/H5Fmount.c
+    ${HDF5_SRC_DIR}/H5Fmpi.c
+    ${HDF5_SRC_DIR}/H5Fquery.c
+    ${HDF5_SRC_DIR}/H5Fsfile.c
+    ${HDF5_SRC_DIR}/H5Fsuper.c
+    ${HDF5_SRC_DIR}/H5Fsuper_cache.c
+    ${HDF5_SRC_DIR}/H5Ftest.c
+)
+
+set (H5F_HDRS
+    ${HDF5_SRC_DIR}/H5Fpkg.h
+    ${HDF5_SRC_DIR}/H5Fpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5F" "${H5F_HDRS}" "${H5F_SRCS}" )
+
+set (H5FD_SRCS
+    ${HDF5_SRC_DIR}/H5FD.c
+    ${HDF5_SRC_DIR}/H5FDcore.c
+    ${HDF5_SRC_DIR}/H5FDdirect.c
+    ${HDF5_SRC_DIR}/H5FDfamily.c
+    ${HDF5_SRC_DIR}/H5FDint.c
+    ${HDF5_SRC_DIR}/H5FDlog.c
+    ${HDF5_SRC_DIR}/H5FDmpi.c
+    ${HDF5_SRC_DIR}/H5FDmpio.c
+    ${HDF5_SRC_DIR}/H5FDmulti.c
+    ${HDF5_SRC_DIR}/H5FDsec2.c
+    ${HDF5_SRC_DIR}/H5FDspace.c
+    ${HDF5_SRC_DIR}/H5FDstdio.c
+)
+
+set (H5FD_HDRS
+    ${HDF5_SRC_DIR}/H5FDcore.h
+    ${HDF5_SRC_DIR}/H5FDdirect.h
+    ${HDF5_SRC_DIR}/H5FDfamily.h
+    ${HDF5_SRC_DIR}/H5FDlog.h
+    ${HDF5_SRC_DIR}/H5FDmpi.h
+    ${HDF5_SRC_DIR}/H5FDmpio.h
+    ${HDF5_SRC_DIR}/H5FDmulti.h
+    ${HDF5_SRC_DIR}/H5FDpkg.h
+    ${HDF5_SRC_DIR}/H5FDpublic.h
+    ${HDF5_SRC_DIR}/H5FDsec2.h
+    ${HDF5_SRC_DIR}/H5FDstdio.h
+)
+IDE_GENERATED_PROPERTIES ("H5FD" "${H5FD_HDRS}" "${H5FD_SRCS}" )
+
+set (H5FS_SRCS
+    ${HDF5_SRC_DIR}/H5FS.c
+    ${HDF5_SRC_DIR}/H5FScache.c
+    ${HDF5_SRC_DIR}/H5FSdbg.c
+    ${HDF5_SRC_DIR}/H5FSsection.c
+    ${HDF5_SRC_DIR}/H5FSstat.c
+    ${HDF5_SRC_DIR}/H5FStest.c
+)
+
+set (H5FS_HDRS
+    ${HDF5_SRC_DIR}/H5FSpkg.h
+    ${HDF5_SRC_DIR}/H5FSpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5FS" "${H5FS_HDRS}" "${H5FS_SRCS}" )
+
+set (H5G_SRCS
+    ${HDF5_SRC_DIR}/H5G.c
+    ${HDF5_SRC_DIR}/H5Gbtree2.c
+    ${HDF5_SRC_DIR}/H5Gcache.c
+    ${HDF5_SRC_DIR}/H5Gcompact.c
+    ${HDF5_SRC_DIR}/H5Gdense.c
+    ${HDF5_SRC_DIR}/H5Gdeprec.c
+    ${HDF5_SRC_DIR}/H5Gent.c
+    ${HDF5_SRC_DIR}/H5Gint.c
+    ${HDF5_SRC_DIR}/H5Glink.c
+    ${HDF5_SRC_DIR}/H5Gloc.c
+    ${HDF5_SRC_DIR}/H5Gname.c
+    ${HDF5_SRC_DIR}/H5Gnode.c
+    ${HDF5_SRC_DIR}/H5Gobj.c
+    ${HDF5_SRC_DIR}/H5Goh.c
+    ${HDF5_SRC_DIR}/H5Groot.c
+    ${HDF5_SRC_DIR}/H5Gstab.c
+    ${HDF5_SRC_DIR}/H5Gtest.c
+    ${HDF5_SRC_DIR}/H5Gtraverse.c
+)
+
+set (H5G_HDRS
+    ${HDF5_SRC_DIR}/H5Gpkg.h
+    ${HDF5_SRC_DIR}/H5Gpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5G" "${H5G_HDRS}" "${H5G_SRCS}" )
+
+set (H5HF_SRCS
+    ${HDF5_SRC_DIR}/H5HF.c
+    ${HDF5_SRC_DIR}/H5HFbtree2.c
+    ${HDF5_SRC_DIR}/H5HFcache.c
+    ${HDF5_SRC_DIR}/H5HFdbg.c
+    ${HDF5_SRC_DIR}/H5HFdblock.c
+    ${HDF5_SRC_DIR}/H5HFdtable.c
+    ${HDF5_SRC_DIR}/H5HFhdr.c
+    ${HDF5_SRC_DIR}/H5HFhuge.c
+    ${HDF5_SRC_DIR}/H5HFiblock.c
+    ${HDF5_SRC_DIR}/H5HFiter.c
+    ${HDF5_SRC_DIR}/H5HFman.c
+    ${HDF5_SRC_DIR}/H5HFsection.c
+    ${HDF5_SRC_DIR}/H5HFspace.c
+    ${HDF5_SRC_DIR}/H5HFstat.c
+    ${HDF5_SRC_DIR}/H5HFtest.c
+    ${HDF5_SRC_DIR}/H5HFtiny.c
+)
+
+set (H5HF_HDRS
+    ${HDF5_SRC_DIR}/H5HFpkg.h
+    ${HDF5_SRC_DIR}/H5HFpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5HF" "${H5HF_HDRS}" "${H5HF_SRCS}" )
+
+set (H5HG_SRCS
+    ${HDF5_SRC_DIR}/H5HG.c
+    ${HDF5_SRC_DIR}/H5HGcache.c
+    ${HDF5_SRC_DIR}/H5HGdbg.c
+    ${HDF5_SRC_DIR}/H5HGquery.c
+)
+
+set (H5HG_HDRS
+    ${HDF5_SRC_DIR}/H5HGpkg.h
+    ${HDF5_SRC_DIR}/H5HGpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5HG" "${H5HG_HDRS}" "${H5HG_SRCS}" )
+
+set (H5HL_SRCS
+    ${HDF5_SRC_DIR}/H5HL.c
+    ${HDF5_SRC_DIR}/H5HLcache.c
+    ${HDF5_SRC_DIR}/H5HLdbg.c
+    ${HDF5_SRC_DIR}/H5HLint.c
+)
+
+set (H5HL_HDRS
+    ${HDF5_SRC_DIR}/H5HLpkg.h
+    ${HDF5_SRC_DIR}/H5HLpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5HL" "${H5HL_HDRS}" "${H5HL_SRCS}" )
+
+set (H5MF_SRCS
+    ${HDF5_SRC_DIR}/H5MF.c
+    ${HDF5_SRC_DIR}/H5MFaggr.c
+    ${HDF5_SRC_DIR}/H5MFdbg.c
+    ${HDF5_SRC_DIR}/H5MFsection.c
+)
+
+set (H5MF_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5MF" "${H5MF_HDRS}" "${H5MF_SRCS}" )
+
+set (H5MP_SRCS
+    ${HDF5_SRC_DIR}/H5MP.c
+    ${HDF5_SRC_DIR}/H5MPtest.c
+)
+
+set (H5MP_HDRS
+    ${HDF5_SRC_DIR}/H5MPpkg.h
+)
+IDE_GENERATED_PROPERTIES ("H5MP" "${H5MP_HDRS}" "${H5MP_SRCS}" )
+
+set (H5O_SRCS
+    ${HDF5_SRC_DIR}/H5O.c
+    ${HDF5_SRC_DIR}/H5Oainfo.c
+    ${HDF5_SRC_DIR}/H5Oalloc.c
+    ${HDF5_SRC_DIR}/H5Oattr.c
+    ${HDF5_SRC_DIR}/H5Oattribute.c
+    ${HDF5_SRC_DIR}/H5Obogus.c
+    ${HDF5_SRC_DIR}/H5Obtreek.c
+    ${HDF5_SRC_DIR}/H5Ocache.c
+    ${HDF5_SRC_DIR}/H5Ochunk.c
+    ${HDF5_SRC_DIR}/H5Ocont.c
+    ${HDF5_SRC_DIR}/H5Ocopy.c
+    ${HDF5_SRC_DIR}/H5Odbg.c
+    ${HDF5_SRC_DIR}/H5Odrvinfo.c
+    ${HDF5_SRC_DIR}/H5Odtype.c
+    ${HDF5_SRC_DIR}/H5Oefl.c
+    ${HDF5_SRC_DIR}/H5Ofill.c
+    ${HDF5_SRC_DIR}/H5Oginfo.c
+    ${HDF5_SRC_DIR}/H5Olayout.c
+    ${HDF5_SRC_DIR}/H5Olinfo.c
+    ${HDF5_SRC_DIR}/H5Olink.c
+    ${HDF5_SRC_DIR}/H5Omessage.c
+    ${HDF5_SRC_DIR}/H5Omtime.c
+    ${HDF5_SRC_DIR}/H5Oname.c
+    ${HDF5_SRC_DIR}/H5Onull.c
+    ${HDF5_SRC_DIR}/H5Opline.c
+    ${HDF5_SRC_DIR}/H5Orefcount.c
+    ${HDF5_SRC_DIR}/H5Osdspace.c
+    ${HDF5_SRC_DIR}/H5Oshared.c
+    ${HDF5_SRC_DIR}/H5Oshmesg.c
+    ${HDF5_SRC_DIR}/H5Ostab.c
+    ${HDF5_SRC_DIR}/H5Otest.c
+    ${HDF5_SRC_DIR}/H5Ounknown.c
+)
+
+set (H5O_HDRS
+    ${HDF5_SRC_DIR}/H5Opkg.h
+    ${HDF5_SRC_DIR}/H5Opublic.h
+    ${HDF5_SRC_DIR}/H5Oshared.h
+)
+IDE_GENERATED_PROPERTIES ("H5O" "${H5O_HDRS}" "${H5O_SRCS}" )
+
+set (H5P_SRCS
+    ${HDF5_SRC_DIR}/H5P.c
+    ${HDF5_SRC_DIR}/H5Pacpl.c
+    ${HDF5_SRC_DIR}/H5Pdapl.c
+    ${HDF5_SRC_DIR}/H5Pdcpl.c
+    ${HDF5_SRC_DIR}/H5Pdeprec.c
+    ${HDF5_SRC_DIR}/H5Pdxpl.c
+    ${HDF5_SRC_DIR}/H5Pfapl.c
+    ${HDF5_SRC_DIR}/H5Pfcpl.c
+    ${HDF5_SRC_DIR}/H5Pfmpl.c
+    ${HDF5_SRC_DIR}/H5Pgcpl.c
+    ${HDF5_SRC_DIR}/H5Pint.c
+    ${HDF5_SRC_DIR}/H5Plapl.c
+    ${HDF5_SRC_DIR}/H5Plcpl.c
+    ${HDF5_SRC_DIR}/H5Pocpl.c
+    ${HDF5_SRC_DIR}/H5Pocpypl.c
+    ${HDF5_SRC_DIR}/H5Pstrcpl.c
+    ${HDF5_SRC_DIR}/H5Ptest.c
+)
+
+set (H5P_HDRS
+    ${HDF5_SRC_DIR}/H5Ppkg.h
+    ${HDF5_SRC_DIR}/H5Ppublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5P" "${H5P_HDRS}" "${H5P_SRCS}" )
+
+set (H5PL_SRCS
+    ${HDF5_SRC_DIR}/H5PL.c
+)
+
+set (H5PL_HDRS
+    ${HDF5_SRC_DIR}/H5PLextern.h
+    ${HDF5_SRC_DIR}/H5PLpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5PL" "${H5PL_HDRS}" "${H5PL_SRCS}" )
+
+
+set (H5R_SRCS
+    ${HDF5_SRC_DIR}/H5R.c
+    ${HDF5_SRC_DIR}/H5Rdeprec.c
+)
+set (H5R_HDRS
+    ${HDF5_SRC_DIR}/H5Rpkg.h
+    ${HDF5_SRC_DIR}/H5Rpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5R" "${H5R_HDRS}" "${H5R_SRCS}" )
+
+
+set (H5RC_SRCS
+    ${HDF5_SRC_DIR}/H5RC.c
+)
+set (H5RC_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5RC" "${H5RC_HDRS}" "${H5RC_SRCS}" )
+
+
+set (H5RS_SRCS
+    ${HDF5_SRC_DIR}/H5RS.c
+)
+set (H5RS_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5RS" "${H5RS_HDRS}" "${H5RS_SRCS}" )
+
+set (H5S_SRCS
+    ${HDF5_SRC_DIR}/H5S.c
+    ${HDF5_SRC_DIR}/H5Sall.c
+    ${HDF5_SRC_DIR}/H5Sdbg.c
+    ${HDF5_SRC_DIR}/H5Shyper.c
+    ${HDF5_SRC_DIR}/H5Smpio.c
+    ${HDF5_SRC_DIR}/H5Snone.c
+    ${HDF5_SRC_DIR}/H5Spoint.c
+    ${HDF5_SRC_DIR}/H5Sselect.c
+    ${HDF5_SRC_DIR}/H5Stest.c
+)
+
+set (H5S_HDRS
+    ${HDF5_SRC_DIR}/H5Spkg.h
+    ${HDF5_SRC_DIR}/H5Spublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5S" "${H5S_HDRS}" "${H5S_SRCS}" )
+
+set (H5SM_SRCS
+    ${HDF5_SRC_DIR}/H5SM.c
+    ${HDF5_SRC_DIR}/H5SMbtree2.c
+    ${HDF5_SRC_DIR}/H5SMcache.c
+    ${HDF5_SRC_DIR}/H5SMmessage.c
+    ${HDF5_SRC_DIR}/H5SMtest.c
+)
+
+set (H5SM_HDRS
+    ${HDF5_SRC_DIR}/H5SMpkg.h
+)
+IDE_GENERATED_PROPERTIES ("H5SM" "${H5SM_HDRS}" "${H5SM_SRCS}" )
+
+set (H5T_SRCS
+    ${HDF5_SRC_DIR}/H5T.c
+    ${HDF5_SRC_DIR}/H5Tarray.c
+    ${HDF5_SRC_DIR}/H5Tbit.c
+    ${HDF5_SRC_DIR}/H5Tcommit.c
+    ${HDF5_SRC_DIR}/H5Tcompound.c
+    ${HDF5_SRC_DIR}/H5Tconv.c
+    ${HDF5_SRC_DIR}/H5Tcset.c
+    ${HDF5_SRC_DIR}/H5Tdbg.c
+    ${HDF5_SRC_DIR}/H5Tdeprec.c
+    ${HDF5_SRC_DIR}/H5Tenum.c
+    ${HDF5_SRC_DIR}/H5Tfields.c
+    ${HDF5_SRC_DIR}/H5Tfixed.c
+    ${HDF5_SRC_DIR}/H5Tfloat.c
+    ${HDF5_SRC_DIR}/H5Tnative.c
+    ${HDF5_SRC_DIR}/H5Toffset.c
+    ${HDF5_SRC_DIR}/H5Toh.c
+    ${HDF5_SRC_DIR}/H5Topaque.c
+    ${HDF5_SRC_DIR}/H5Torder.c
+    ${HDF5_SRC_DIR}/H5Tpad.c
+    ${HDF5_SRC_DIR}/H5Tprecis.c
+    ${HDF5_SRC_DIR}/H5Tstrpad.c
+    ${HDF5_SRC_DIR}/H5Tvisit.c
+    ${HDF5_SRC_DIR}/H5Tvlen.c
+)
+
+set (H5T_HDRS
+    ${HDF5_SRC_DIR}/H5Tpkg.h
+    ${HDF5_SRC_DIR}/H5Tpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5T" "${H5T_HDRS}" "${H5T_SRCS}" )
+
+set (H5Z_SRCS
+    ${HDF5_SRC_DIR}/H5Z.c
+    ${HDF5_SRC_DIR}/H5Zdeflate.c
+    ${HDF5_SRC_DIR}/H5Zfletcher32.c
+    ${HDF5_SRC_DIR}/H5Znbit.c
+    ${HDF5_SRC_DIR}/H5Zscaleoffset.c
+    ${HDF5_SRC_DIR}/H5Zshuffle.c
+    ${HDF5_SRC_DIR}/H5Zszip.c
+    ${HDF5_SRC_DIR}/H5Ztrans.c
+)
+if (H5_ZLIB_HEADER)
+  SET_PROPERTY(SOURCE ${HDF5_SRC_DIR}/H5Zdeflate.c PROPERTY
+      COMPILE_DEFINITIONS H5_ZLIB_HEADER="${H5_ZLIB_HEADER}")
+endif (H5_ZLIB_HEADER)
+
+
+set (H5Z_HDRS
+    ${HDF5_SRC_DIR}/H5Zpkg.h
+    ${HDF5_SRC_DIR}/H5Zpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5Z" "${H5Z_HDRS}" "${H5Z_SRCS}" )
+
+set (common_SRCS
+    ${H5_SRCS}
+    ${H5A_SRCS}
+    ${H5AC_SRCS}
+    ${H5B_SRCS}
+    ${H5D_SRCS}
+    ${H5E_SRCS}
+    ${H5F_SRCS}
+    ${H5FD_SRCS}
+    ${H5FS_SRCS}
+    ${H5G_SRCS}
+    ${H5HF_SRCS}
+    ${H5HG_SRCS}
+    ${H5HL_SRCS}
+    ${H5MF_SRCS}
+    ${H5MP_SRCS}
+    ${H5O_SRCS}
+    ${H5P_SRCS}
+    ${H5PL_SRCS}
+    ${H5R_SRCS}
+    ${H5RC_SRCS}
+    ${H5RS_SRCS}
+    ${H5S_SRCS}
+    ${H5SM_SRCS}
+    ${H5T_SRCS}
+    ${H5Z_SRCS}
+    ${HDF5_SRC_DIR}/H5C.c
+    ${HDF5_SRC_DIR}/H5CS.c
+    ${HDF5_SRC_DIR}/H5FL.c
+    ${HDF5_SRC_DIR}/H5FO.c
+    ${HDF5_SRC_DIR}/H5HP.c
+    ${HDF5_SRC_DIR}/H5I.c
+    ${HDF5_SRC_DIR}/H5Itest.c
+    ${HDF5_SRC_DIR}/H5L.c
+    ${HDF5_SRC_DIR}/H5Lexternal.c
+    ${HDF5_SRC_DIR}/H5MM.c
+    ${HDF5_SRC_DIR}/H5R.c
+    ${HDF5_SRC_DIR}/H5RC.c
+    ${HDF5_SRC_DIR}/H5Rdeprec.c
+    ${HDF5_SRC_DIR}/H5RS.c
+    ${HDF5_SRC_DIR}/H5SL.c
+    ${HDF5_SRC_DIR}/H5ST.c
+    ${HDF5_SRC_DIR}/H5TS.c
+    ${HDF5_SRC_DIR}/H5VM.c
+    ${HDF5_SRC_DIR}/H5WB.c
+)
+
+set (H5_PUBLIC_HEADERS
+    ${H5_HDRS}
+    ${H5A_HDRS}
+    ${H5AC_HDRS}
+    ${H5B_HDRS}
+    ${H5D_HDRS}
+    ${H5E_HDRS}
+    ${H5F_HDRS}
+    ${H5FD_HDRS}
+    ${H5FS_HDRS}
+    ${H5G_HDRS}
+    ${H5HF_HDRS}
+    ${H5HG_HDRS}
+    ${H5HL_HDRS}
+    ${H5MF_HDRS}
+    ${H5MP_HDRS}
+    ${H5O_HDRS}
+    ${H5P_HDRS}
+    ${H5PL_HDRS}
+    ${H5R_HDRS}
+    ${H5S_HDRS}
+    ${H5SM_HDRS}
+    ${H5T_HDRS}
+    ${H5Z_HDRS}
+    ${HDF5_SRC_DIR}/H5Cpkg.h
+    ${HDF5_SRC_DIR}/H5Cpublic.h
+    ${HDF5_SRC_DIR}/H5Ipkg.h
+    ${HDF5_SRC_DIR}/H5Ipublic.h
+    ${HDF5_SRC_DIR}/H5Lpkg.h
+    ${HDF5_SRC_DIR}/H5Lpublic.h
+    ${HDF5_SRC_DIR}/H5MMpublic.h
+    ${HDF5_SRC_DIR}/H5Rpkg.h
+    ${HDF5_SRC_DIR}/H5Rpublic.h
+)
+
+# --------------------------------------------------------------------
+# If we are compiling on Windows then add the windows specific files
+# --------------------------------------------------------------------
+if (WIN32)
+  set (common_SRCS  ${common_SRCS}  ${HDF5_SRC_DIR}/H5FDwindows.c)
+  set (H5_PUBLIC_HEADERS ${H5_PUBLIC_HEADERS}  ${HDF5_SRC_DIR}/H5FDwindows.h)
+endif (WIN32)
+
+set (H5_PRIVATE_HEADERS
+    ${HDF5_SRC_DIR}/H5private.h
+    ${HDF5_SRC_DIR}/H5Aprivate.h
+    ${HDF5_SRC_DIR}/H5ACprivate.h
+    ${HDF5_SRC_DIR}/H5B2private.h
+    ${HDF5_SRC_DIR}/H5Bprivate.h
+    ${HDF5_SRC_DIR}/H5CSprivate.h
+    ${HDF5_SRC_DIR}/H5Dprivate.h
+    ${HDF5_SRC_DIR}/H5Eprivate.h
+    ${HDF5_SRC_DIR}/H5FDprivate.h
+    ${HDF5_SRC_DIR}/H5Fprivate.h
+    ${HDF5_SRC_DIR}/H5FLprivate.h
+    ${HDF5_SRC_DIR}/H5FOprivate.h
+    ${HDF5_SRC_DIR}/H5MFprivate.h
+    ${HDF5_SRC_DIR}/H5MMprivate.h
+    ${HDF5_SRC_DIR}/H5Cprivate.h
+    ${HDF5_SRC_DIR}/H5FSprivate.h
+    ${HDF5_SRC_DIR}/H5Gprivate.h
+    ${HDF5_SRC_DIR}/H5HFprivate.h
+    ${HDF5_SRC_DIR}/H5HGprivate.h
+    ${HDF5_SRC_DIR}/H5HLprivate.h
+    ${HDF5_SRC_DIR}/H5HPprivate.h
+    ${HDF5_SRC_DIR}/H5Iprivate.h
+    ${HDF5_SRC_DIR}/H5Lprivate.h
+    ${HDF5_SRC_DIR}/H5MPprivate.h
+    ${HDF5_SRC_DIR}/H5Oprivate.h
+    ${HDF5_SRC_DIR}/H5Pprivate.h
+    ${HDF5_SRC_DIR}/H5PLprivate.h
+    ${HDF5_SRC_DIR}/H5RCprivate.h
+    ${HDF5_SRC_DIR}/H5Rprivate.h
+    ${HDF5_SRC_DIR}/H5RSprivate.h
+    ${HDF5_SRC_DIR}/H5SLprivate.h
+    ${HDF5_SRC_DIR}/H5SMprivate.h
+    ${HDF5_SRC_DIR}/H5Sprivate.h
+    ${HDF5_SRC_DIR}/H5STprivate.h
+    ${HDF5_SRC_DIR}/H5Tprivate.h
+    ${HDF5_SRC_DIR}/H5TSprivate.h
+    ${HDF5_SRC_DIR}/H5VMprivate.h
+    ${HDF5_SRC_DIR}/H5WBprivate.h
+    ${HDF5_SRC_DIR}/H5Zprivate.h
+    ${HDF5_SRC_DIR}/H5win32defs.h
+)
+
+#-----------------------------------------------------------------------------
+# Setup the H5Detect utility which generates H5Tinit with platform
+# specific type checks inside
+#-----------------------------------------------------------------------------
+add_executable (H5detect ${HDF5_SRC_DIR}/H5detect.c)
+TARGET_C_PROPERTIES (H5detect STATIC " " " ")
+if (MSVC OR MINGW)
+  target_link_libraries (H5detect "ws2_32.lib")
+endif (MSVC OR MINGW)
+
+set (CMD $<TARGET_FILE:H5detect>)
+add_custom_command (
+    OUTPUT ${HDF5_BINARY_DIR}/H5Tinit.c
+    COMMAND ${CMD}
+    ARGS > ${HDF5_BINARY_DIR}/H5Tinit.c
+    DEPENDS H5detect
+)
+
+add_executable (H5make_libsettings ${HDF5_SRC_DIR}/H5make_libsettings.c)
+TARGET_C_PROPERTIES (H5make_libsettings STATIC " " " ")
+if (MSVC OR MINGW)
+  target_link_libraries (H5make_libsettings "ws2_32.lib")
+endif (MSVC OR MINGW)
+
+set (CMD $<TARGET_FILE:H5make_libsettings>)
+add_custom_command (
+    OUTPUT ${HDF5_BINARY_DIR}/H5lib_settings.c
+    COMMAND ${CMD}
+    ARGS > ${HDF5_BINARY_DIR}/H5lib_settings.c
+    DEPENDS H5make_libsettings
+    WORKING_DIRECTORY ${HDF5_BINARY_DIR}
+)
+
+if (GENERATE_ERROR_HEADERS)
+  find_package (Perl)
+  if (PERL_FOUND)
+    add_custom_command (
+        OUTPUT ${HDF5_BINARY_DIR}/H5Edefin.h
+        PRE_BUILD
+        COMMAND ${PERL_EXECUTABLE}
+        ARGS ${HDF5_SOURCE_DIR}/bin/make_err ${HDF5_SOURCE_DIR}/src/H5err.txt
+        DEPENDS ${HDF5_SOURCE_DIR}/src/H5err.txt
+        COMMENT " Creating err header"
+    )
+
+    add_custom_command (
+        OUTPUT ${HDF5_BINARY_DIR}/H5version.h
+        PRE_BUILD
+        COMMAND ${PERL_EXECUTABLE}
+        ARGS ${HDF5_SOURCE_DIR}/bin/make_vers ${HDF5_SOURCE_DIR}/src/H5vers.txt
+        DEPENDS ${HDF5_SOURCE_DIR}/src/H5vers.txt
+       COMMENT " Creating API version macro"
+    )
+
+    add_custom_command (
+        OUTPUT ${HDF5_BINARY_DIR}/H5overflow.h
+        PRE_BUILD
+        COMMAND ${PERL_EXECUTABLE}
+        ARGS ${HDF5_SOURCE_DIR}/bin/make_overflow ${HDF5_SOURCE_DIR}/src/H5overflow.txt
+        DEPENDS ${HDF5_SOURCE_DIR}/src/H5overflow.txt
+        COMMENT " Creating Assignment overflow macro"
+    )
+
+    add_custom_target(run_perl_scripts ALL
+        DEPENDS ${HDF5_BINARY_DIR}/H5Edefin.h ${HDF5_BINARY_DIR}/H5version.h ${HDF5_BINARY_DIR}/H5overflow.h
+    )
+  else (PERL_FOUND)
+    message (STATUS "Cannot generate headers - perl not found")
+  endif (PERL_FOUND)
+endif (GENERATE_ERROR_HEADERS)
+
+#-----------------------------------------------------------------------------
+# Add H5Tinit source to build - generated by H5Detect/CMake at configure time
+#-----------------------------------------------------------------------------
+set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5Tinit.c)
+set_source_files_properties (${HDF5_BINARY_DIR}/H5Tinit.c GENERATED)
+set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5lib_settings.c)
+set_source_files_properties (${HDF5_BINARY_DIR}/H5lib_settings.c GENERATED)
+set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5Edefin.h)
+set_source_files_properties (${HDF5_BINARY_DIR}/H5Edefin.h GENERATED)
+set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5version.h)
+set_source_files_properties (${HDF5_BINARY_DIR}/H5version.h GENERATED)
+set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5overflow.h)
+set_source_files_properties (${HDF5_BINARY_DIR}/H5overflow.h GENERATED)
+
+add_library (${HDF5_LIB_TARGET} STATIC ${common_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS})
+TARGET_C_PROPERTIES (${HDF5_LIB_TARGET} STATIC " " " ")
+target_link_libraries (${HDF5_LIB_TARGET} ${LINK_LIBS})
+if (NOT WIN32)
+  target_link_libraries (${HDF5_LIB_TARGET} dl)
+endif (NOT WIN32)
+if (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+  target_link_libraries (${HDF5_LIB_TARGET} ${MPI_C_LIBRARIES})
+endif (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+set_global_variable (HDF5_LIBRARIES_TO_EXPORT ${HDF5_LIB_TARGET})
+H5_SET_LIB_OPTIONS (${HDF5_LIB_TARGET} ${HDF5_LIB_NAME} STATIC)
+set_target_properties (${HDF5_LIB_TARGET} PROPERTIES
+    FOLDER libraries
+    INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
+)
+
+option (HDF5_ENABLE_DEBUG_APIS "Turn on extra debug output in all packages" OFF)
+if (HDF5_ENABLE_DEBUG_APIS)
+  set_target_properties (${HDF5_LIB_TARGET} PROPERTIES
+      COMPILE_DEFINITIONS
+          "H5Z_DEBUG;H5VM_DEBUG;H5T_DEBUG;H5S_DEBUG;H5P_DEBUG;H5O_DEBUG;H5MM_DEBUG;H5MF_DEBUG;H5I_DEBUG;H5HL_DEBUG;H5HG_DEBUG;H5G_DEBUG;H5F_DEBUG;H5E_DEBUG;H5D_DEBUG;H5B_DEBUG;H5AC_DEBUG"
+  )
+endif (HDF5_ENABLE_DEBUG_APIS)
+set (install_targets ${HDF5_LIB_TARGET})
+
+if (BUILD_SHARED_LIBS)
+  add_library (${HDF5_LIBSH_TARGET} SHARED ${common_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS})
+  TARGET_C_PROPERTIES (${HDF5_LIBSH_TARGET} SHARED " " " ")
+  target_link_libraries (${HDF5_LIBSH_TARGET} ${LINK_SHARED_LIBS})
+  if (NOT WIN32)
+    target_link_libraries (${HDF5_LIBSH_TARGET} dl)
+  endif (NOT WIN32)
+  if (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+    target_link_libraries (${HDF5_LIBSH_TARGET} ${MPI_C_LIBRARIES})
+  endif (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+  set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_LIBSH_TARGET}")
+  H5_SET_LIB_OPTIONS (${HDF5_LIBSH_TARGET} ${HDF5_LIB_NAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+  set_target_properties (${HDF5_LIBSH_TARGET} PROPERTIES
+      FOLDER libraries
+      COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
+      INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
+      INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
+  )
+  if (HDF5_ENABLE_THREADSAFE)
+    set_property (TARGET ${HDF5_LIBSH_TARGET}
+        APPEND PROPERTY COMPILE_DEFINITIONS
+            "H5_HAVE_THREADSAFE"
+    )
+    target_link_libraries (${HDF5_LIBSH_TARGET} Threads::Threads)
+  endif (HDF5_ENABLE_THREADSAFE)
+
+  if (HDF5_ENABLE_DEBUG_APIS)
+    set_property (TARGET ${HDF5_LIBSH_TARGET}
+        APPEND PROPERTY COMPILE_DEFINITIONS
+            "H5Z_DEBUG;H5VM_DEBUG;H5T_DEBUG;H5S_DEBUG;H5P_DEBUG;H5O_DEBUG;H5MM_DEBUG;H5MF_DEBUG;H5I_DEBUG;H5HL_DEBUG;H5HG_DEBUG;H5G_DEBUG;H5F_DEBUG;H5E_DEBUG;H5D_DEBUG;H5B_DEBUG;H5AC_DEBUG"
+    )
+  endif (HDF5_ENABLE_DEBUG_APIS)
+  set (install_targets ${install_targets} ${HDF5_LIBSH_TARGET})
+endif (BUILD_SHARED_LIBS)
+
+#-----------------------------------------------------------------------------
+# Add file(s) to CMake Install
+#-----------------------------------------------------------------------------
+if (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+  install (
+      FILES
+          ${H5_PUBLIC_HEADERS}
+      DESTINATION
+          ${HDF5_INSTALL_INCLUDE_DIR}
+      COMPONENT
+          headers
+  )
+endif (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+
+#-----------------------------------------------------------------------------
+# Add Target(s) to CMake Install for import into other projects
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_TARGET_PDB (${HDF5_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} libraries)
+  endif (BUILD_SHARED_LIBS)
+
+  install (
+      TARGETS
+          ${install_targets}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      LIBRARY DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
+      ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT libraries
+      FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT libraries
+      INCLUDES DESTINATION include
+  )
+endif (HDF5_EXPORTED_TARGETS)
diff --git a/gatb-core/thirdparty/hdf5/src/COPYING b/gatb-core/thirdparty/hdf5/src/COPYING
new file mode 100644
index 0000000..6903daf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/COPYING
@@ -0,0 +1,16 @@
+
+  Copyright by  The HDF Group and 
+                The Board of Trustees of the University of Illinois. 
+  All rights reserved. 
+
+  The files and subdirectories in this directory are part of HDF5.  
+  The full HDF5 copyright notice, including terms governing use, 
+  modification, and redistribution, is contained in the files COPYING 
+  and Copyright.html.  COPYING can be found at the root of the source 
+  code distribution tree; Copyright.html can be found at the root 
+  level of an installed copy of the electronic HDF5 document set and 
+  is linked from the top-level documents page.  It can also be found 
+  at http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not 
+  have access to either file, you may request a copy from 
+  help at hdfgroup.org. 
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5.c b/gatb-core/thirdparty/hdf5/src/H5.c
new file mode 100644
index 0000000..e13c42c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5.c
@@ -0,0 +1,1060 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"         /* Datasets                             */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5FLprivate.h"        /* Free lists                           */
+#include "H5Lprivate.h"         /* Links                                */
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5SLprivate.h"        /* Skip lists                           */
+#include "H5Tprivate.h"         /* Datatypes                            */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static void H5_debug_mask(const char*);
+#ifdef H5_HAVE_PARALLEL
+static int H5_mpi_delete_cb(MPI_Comm comm, int keyval, void *attr_val, int *flag);
+#endif /*H5_HAVE_PARALLEL*/
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* statically initialize block for pthread_once call used in initializing */
+/* the first global mutex                                                 */
+#ifdef H5_HAVE_THREADSAFE
+H5_api_t H5_g;
+#else
+hbool_t H5_libinit_g = FALSE;   /* Library hasn't been initialized */
+#endif
+
+#ifdef H5_HAVE_MPE
+hbool_t H5_MPEinit_g = FALSE;	/* MPE Library hasn't been initialized */
+#endif
+
+char			H5_lib_vers_info_g[] = H5_VERS_INFO;
+static hbool_t          H5_dont_atexit_g = FALSE;
+H5_debug_t		H5_debug_g;		/*debugging info	*/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+/*--------------------------------------------------------------------------
+ * NAME
+ *   H5_init_library -- Initialize library-global information
+ * USAGE
+ *    herr_t H5_init_library()
+ *
+ * RETURNS
+ *    Non-negative on success/Negative on failure
+ *
+ * DESCRIPTION
+ *    Initializes any library-global data or routines.
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5_init_library(void)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef H5_HAVE_PARALLEL
+    {
+	int mpi_initialized;
+	int mpi_finalized;
+        int mpi_code;
+
+	MPI_Initialized(&mpi_initialized);
+	MPI_Finalized(&mpi_finalized);
+
+#ifdef H5_HAVE_MPE
+        /* Initialize MPE instrumentation library. */
+        if (!H5_MPEinit_g) {
+            int mpe_code;
+            if (mpi_initialized && !mpi_finalized) {
+                mpe_code = MPE_Init_log();
+                HDassert(mpe_code >=0);
+                H5_MPEinit_g = TRUE;
+            }
+        }
+#endif /*H5_HAVE_MPE*/
+
+        /* add an attribute on MPI_COMM_SELF to call H5_term_library
+           when it is destroyed, i.e. on MPI_Finalize */
+        if (mpi_initialized && !mpi_finalized) {
+            int key_val;
+
+            if(MPI_SUCCESS != (mpi_code = MPI_Comm_create_keyval(MPI_NULL_COPY_FN, 
+                                                                 (MPI_Comm_delete_attr_function *)H5_mpi_delete_cb, 
+                                                                 &key_val, NULL)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Comm_create_keyval failed", mpi_code)
+
+            if(MPI_SUCCESS != (mpi_code = MPI_Comm_set_attr(MPI_COMM_SELF, key_val, NULL)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Comm_set_attr failed", mpi_code)
+
+            if(MPI_SUCCESS != (mpi_code = MPI_Comm_free_keyval(&key_val)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Comm_free_keyval failed", mpi_code)
+        }
+    }
+#endif /*H5_HAVE_PARALLEL*/
+
+    /*
+     * Make sure the package information is updated.
+     */
+    HDmemset(&H5_debug_g, 0, sizeof H5_debug_g);
+    H5_debug_g.pkg[H5_PKG_A].name = "a";
+    H5_debug_g.pkg[H5_PKG_AC].name = "ac";
+    H5_debug_g.pkg[H5_PKG_B].name = "b";
+    H5_debug_g.pkg[H5_PKG_D].name = "d";
+    H5_debug_g.pkg[H5_PKG_E].name = "e";
+    H5_debug_g.pkg[H5_PKG_F].name = "f";
+    H5_debug_g.pkg[H5_PKG_G].name = "g";
+    H5_debug_g.pkg[H5_PKG_HG].name = "hg";
+    H5_debug_g.pkg[H5_PKG_HL].name = "hl";
+    H5_debug_g.pkg[H5_PKG_I].name = "i";
+    H5_debug_g.pkg[H5_PKG_MF].name = "mf";
+    H5_debug_g.pkg[H5_PKG_MM].name = "mm";
+    H5_debug_g.pkg[H5_PKG_O].name = "o";
+    H5_debug_g.pkg[H5_PKG_P].name = "p";
+    H5_debug_g.pkg[H5_PKG_S].name = "s";
+    H5_debug_g.pkg[H5_PKG_T].name = "t";
+    H5_debug_g.pkg[H5_PKG_V].name = "v";
+    H5_debug_g.pkg[H5_PKG_Z].name = "z";
+
+    /*
+     * Install atexit() library cleanup routines unless the H5dont_atexit()
+     * has been called.  Once we add something to the atexit() list it stays
+     * there permanently, so we set H5_dont_atexit_g after we add it to prevent
+     * adding it again later if the library is cosed and reopened.
+     */
+    if (!H5_dont_atexit_g) {
+
+#if defined(H5_HAVE_THREADSAFE) && defined(H5_HAVE_WIN_THREADS)
+        /* Clean up Win32 thread resources. Pthreads automatically cleans up.
+         * This must be entered before the library cleanup code so it's
+         * executed in LIFO order (i.e., last).
+         */
+	    (void)HDatexit(H5TS_win32_process_exit);
+#endif /* H5_HAVE_THREADSAFE && H5_HAVE_WIN_THREADS */
+
+        /* Normal library termination code */
+        (void)HDatexit(H5_term_library);
+
+        H5_dont_atexit_g = TRUE;
+    } /* end if */
+
+    /*
+     * Initialize interfaces that might not be able to initialize themselves
+     * soon enough.  The file & dataset interfaces must be initialized because
+     * calling H5P_create() might require the file/dataset property classes to be
+     * initialized.  The property interface must be initialized before the file
+     * & dataset interfaces though, in order to provide them with the proper
+     * property classes.
+     * The link interface needs to be initialized so that link property lists
+     * have their properties registered.
+     */
+    if(H5E_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize error interface")
+    if(H5P_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize property list interface")
+    if(H5T_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize datatype interface")
+    if(H5D_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize dataset interface")
+    if(H5AC_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize metadata caching interface")
+    if(H5L_init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize link interface")
+
+    /* Debugging? */
+    H5_debug_mask("-all");
+    H5_debug_mask(HDgetenv("HDF5_DEBUG"));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5_init_library() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_term_library
+ *
+ * Purpose:	Terminate interfaces in a well-defined order due to
+ *		dependencies among the interfaces, then terminate
+ *		library-specific data.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5_term_library(void)
+{
+    int	pending, ntries = 0, n;
+    size_t	at = 0;
+    char	loop[1024];
+    H5E_auto2_t func;
+
+#ifdef H5_HAVE_THREADSAFE
+    /* explicit locking of the API */
+    H5_FIRST_THREAD_INIT
+    H5_API_LOCK
+#endif
+
+    /* Don't do anything if the library is already closed */
+    if(!(H5_INIT_GLOBAL))
+	goto done;
+
+    /* Check if we should display error output */
+    (void)H5Eget_auto2(H5E_DEFAULT, &func, NULL);
+
+    /*
+     * Terminate each interface. The termination functions return a positive
+     * value if they do something that might affect some other interface in a
+     * way that would necessitate some cleanup work in the other interface.
+     */
+#define DOWN(F)								      \
+    (((n = H5##F##_term_interface()) && (at + 8) < sizeof loop)?	      \
+     (sprintf(loop + at, "%s%s", (at ? "," : ""), #F),			      \
+      at += HDstrlen(loop + at),					      \
+      n):                                                                     \
+     ((n > 0 && (at + 5) < sizeof loop) ?				      \
+     (sprintf(loop + at, "..."),					      \
+      at += HDstrlen(loop + at),					      \
+     n) : n))
+
+    do {
+	pending = 0;
+        /* Try to organize these so the "higher" level components get shut
+         * down before "lower" level components that they might rely on. -QAK
+         */
+	pending += DOWN(R);
+	pending += DOWN(D);
+	pending += DOWN(L);
+	pending += DOWN(G);
+	pending += DOWN(A);
+	pending += DOWN(S);
+	pending += DOWN(T);
+        /* Don't shut down the file code until objects in files are shut down */
+        if(pending == 0)
+            pending += DOWN(F);
+
+        /* Don't shut down "low-level" components until "high-level" components
+         * have successfully shut down.  This prevents property lists and IDs
+         * from being closed "out from underneath" of the high-level objects
+         * that depend on them. -QAK
+         */
+        if(pending == 0) {
+            pending += DOWN(AC);
+            pending += DOWN(Z);
+            pending += DOWN(FD);
+            pending += DOWN(P);
+            pending += DOWN(PL);
+
+            /* Don't shut down the error code until other APIs which use it are shut down */
+            if(pending == 0)
+                pending += DOWN(E);
+            /* Don't shut down the ID code until other APIs which use them are shut down */
+            if(pending == 0)
+                pending += DOWN(I);
+            /* Don't shut down the skip list code until everything that uses it is down */
+            if(pending == 0)
+                pending += DOWN(SL);
+            /* Don't shut down the free list code until _everything_ else is down */
+            if(pending == 0)
+                pending += DOWN(FL);
+        }
+    } while(pending && ntries++ < 100);
+
+    if(pending) {
+        /* Only display the error message if the user is interested in them. */
+        if(func) {
+            fprintf(stderr, "HDF5: infinite loop closing library\n");
+            fprintf(stderr, "      %s\n", loop);
+#ifndef NDEBUG
+            HDabort();
+#endif /* NDEBUG */
+        } /* end if */
+    } /* end if */
+
+#ifdef H5_HAVE_MPE
+    /* Close MPE instrumentation library.  May need to move this
+     * down if any of the below code involves using the instrumentation code.
+     */
+    if(H5_MPEinit_g) {
+	int mpi_initialized;
+	int mpi_finalized;
+	int mpe_code;
+
+	MPI_Initialized(&mpi_initialized);
+	MPI_Finalized(&mpi_finalized);
+
+        if (mpi_initialized && !mpi_finalized) {
+	    mpe_code = MPE_Finish_log("h5log");
+	    HDassert(mpe_code >=0);
+	} /* end if */
+	H5_MPEinit_g = FALSE;	/* turn it off no matter what */
+    } /* end if */
+#endif
+
+    /* Free open debugging streams */
+    while(H5_debug_g.open_stream) {
+        H5_debug_open_stream_t  *tmp_open_stream;
+
+        tmp_open_stream = H5_debug_g.open_stream;
+        (void)HDfclose(H5_debug_g.open_stream->stream);
+        H5_debug_g.open_stream = H5_debug_g.open_stream->next;
+        (void)H5MM_free(tmp_open_stream);
+    } /* end while */
+
+    /* Mark library as closed */
+    H5_INIT_GLOBAL = FALSE;
+done:
+#ifdef H5_HAVE_THREADSAFE
+    H5_API_UNLOCK
+#endif /* H5_HAVE_THREADSAFE */
+    return;
+} /* end H5_term_library() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5dont_atexit
+ *
+ * Purpose:	Indicates that the library is not to clean up after itself
+ *		when the application exits by calling exit() or returning
+ *		from main().  This function must be called before any other
+ *		HDF5 function or constant is used or it will have no effect.
+ *
+ *		If this function is used then certain memory buffers will not
+ *		be de-allocated nor will open files be flushed automatically.
+ *		The application may still call H5close() explicitly to
+ *		accomplish these things.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative if this function is called more than
+ *				once or if it is called too late.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5dont_atexit(void)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API_NOINIT_NOERR_NOFS
+    H5TRACE0("e","");
+
+    if(H5_dont_atexit_g)
+        ret_value = FAIL;
+    else
+        H5_dont_atexit_g = TRUE;
+
+    FUNC_LEAVE_API_NOFS(ret_value)
+} /* end H5dont_atexit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5garbage_collect
+ *
+ * Purpose:	Walks through all the garbage collection routines for the
+ *		library, which are supposed to free any unused memory they have
+ *		allocated.
+ *
+ *      These should probably be registered dynamicly in a linked list of
+ *          functions to call, but there aren't that many right now, so we
+ *          hard-wire them...
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 11, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5garbage_collect(void)
+{
+    herr_t                  ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE0("e","");
+
+    /* Call the garbage collection routines in the library */
+    if(H5FL_garbage_coll()<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect objects")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5garbage_collect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5set_free_list_limits
+ *
+ * Purpose:	Sets limits on the different kinds of free lists.  Setting a value
+ *      of -1 for a limit means no limit of that type.  These limits are global
+ *      for the entire library.  Each "global" limit only applies to free lists
+ *      of that type, so if an application sets a limit of 1 MB on each of the
+ *      global lists, up to 3 MB of total storage might be allocated (1MB on
+ *      each of regular, array and block type lists).
+ *
+ *      The settings for block free lists are duplicated to factory free lists.
+ *      Factory free list limits cannot be set independently currently.
+ *
+ * Parameters:
+ *  int reg_global_lim;  IN: The limit on all "regular" free list memory used
+ *  int reg_list_lim;    IN: The limit on memory used in each "regular" free list
+ *  int arr_global_lim;  IN: The limit on all "array" free list memory used
+ *  int arr_list_lim;    IN: The limit on memory used in each "array" free list
+ *  int blk_global_lim;  IN: The limit on all "block" free list memory used
+ *  int blk_list_lim;    IN: The limit on memory used in each "block" free list
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, August 2, 2000
+ *
+ * Modifications:   Neil Fortner
+ *                  Wednesday, April 8, 2009
+ *                  Added support for factory free lists
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_lim,
+    int arr_list_lim, int blk_global_lim, int blk_list_lim)
+{
+    herr_t                  ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "IsIsIsIsIsIs", reg_global_lim, reg_list_lim, arr_global_lim,
+             arr_list_lim, blk_global_lim, blk_list_lim);
+
+    /* Call the free list function to actually set the limits */
+    if(H5FL_set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim,
+            blk_global_lim, blk_list_lim, blk_global_lim, blk_list_lim)<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "can't set garbage collection limits")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5set_free_list_limits() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_debug_mask
+ *
+ * Purpose:	Set runtime debugging flags according to the string S.  The
+ *		string should contain file numbers and package names
+ *		separated by other characters. A file number applies to all
+ *		following package names up to the next file number. The
+ *		initial file number is `2' (the standard error stream). Each
+ *		package name can be preceded by a `+' or `-' to add or remove
+ *		the package from the debugging list (`+' is the default). The
+ *		special name `all' means all packages.
+ *
+ *		The name `trace' indicates that API tracing is to be turned
+ *		on or off.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August 19, 1998
+ *
+ * Modifications:
+ *              Robb Matzke, 2002-08-08
+ *              Accepts the `ttop' word. If enabled then show only the
+ *              top level API calls, otherwise show all API calls.  Also
+ *              turns on tracing as if the `trace' word was present.
+ *-------------------------------------------------------------------------
+ */
+static void
+H5_debug_mask(const char *s)
+{
+    FILE	*stream = stderr;
+    char	pkg_name[32], *rest;
+    size_t	i;
+    hbool_t	clear;
+
+    while (s && *s) {
+	if (HDisalpha(*s) || '-'==*s || '+'==*s) {
+	    /* Enable or Disable debugging? */
+	    if ('-'==*s) {
+		clear = TRUE;
+		s++;
+	    } else if ('+'==*s) {
+		clear = FALSE;
+		s++;
+	    } else {
+		clear = FALSE;
+	    }
+
+	    /* Get the name */
+	    for (i=0; HDisalpha(*s); i++, s++)
+		if (i<sizeof pkg_name)
+                    pkg_name[i] = *s;
+	    pkg_name[MIN(sizeof(pkg_name)-1, i)] = '\0';
+
+	    /* Trace, all, or one? */
+	    if (!HDstrcmp(pkg_name, "trace")) {
+		H5_debug_g.trace = clear ? NULL : stream;
+            } else if (!HDstrcmp(pkg_name, "ttop")) {
+                H5_debug_g.trace = stream;
+                H5_debug_g.ttop = (hbool_t)!clear;
+            } else if (!HDstrcmp(pkg_name, "ttimes")) {
+                H5_debug_g.trace = stream;
+                H5_debug_g.ttimes = (hbool_t)!clear;
+	    } else if (!HDstrcmp(pkg_name, "all")) {
+		for (i=0; i<(size_t)H5_NPKGS; i++)
+		    H5_debug_g.pkg[i].stream = clear ? NULL : stream;
+	    } else {
+		for (i=0; i<(size_t)H5_NPKGS; i++) {
+		    if (!HDstrcmp(H5_debug_g.pkg[i].name, pkg_name)) {
+			H5_debug_g.pkg[i].stream = clear ? NULL : stream;
+			break;
+		    }
+		}
+		if (i>=(size_t)H5_NPKGS)
+		    fprintf(stderr, "HDF5_DEBUG: ignored %s\n", pkg_name);
+	    }
+
+	} else if (HDisdigit(*s)) {
+	    int fd = (int)HDstrtol(s, &rest, 0);
+	    H5_debug_open_stream_t *open_stream;
+
+	    if((stream = HDfdopen(fd, "w")) != NULL) {
+	        (void)HDsetvbuf(stream, NULL, _IOLBF, (size_t)0);
+
+	        if(NULL == (open_stream = (H5_debug_open_stream_t *)H5MM_malloc(sizeof(H5_debug_open_stream_t)))) {
+                    (void)HDfclose(stream);
+                    return;
+                } /* end if */
+
+                open_stream->stream = stream;
+                open_stream->next = H5_debug_g.open_stream;
+                H5_debug_g.open_stream = open_stream;
+            } /* end if */
+	    s = rest;
+	} else {
+	    s++;
+	}
+    }
+} /* end H5_debug_mask() */
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_mpi_delete_cb
+ *
+ * Purpose:	Callback attribute on MPI_COMM_SELF to terminate the HDF5 
+ *              library when the communicator is destroyed, i.e. on MPI_Finalize.
+ *
+ * Return:	MPI_SUCCESS
+ *
+ * Programmer:	Mohamad Chaarawi, February 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int H5_mpi_delete_cb(MPI_Comm H5_ATTR_UNUSED comm, int H5_ATTR_UNUSED keyval, void H5_ATTR_UNUSED *attr_val, int H5_ATTR_UNUSED *flag)
+{
+    H5_term_library();
+    return MPI_SUCCESS;
+}
+#endif /*H5_HAVE_PARALLEL*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5get_libversion
+ *
+ * Purpose:	Returns the library version numbers through arguments. MAJNUM
+ *		will be the major revision number of the library, MINNUM the
+ *		minor revision number, and RELNUM the release revision number.
+ *
+ * Note:	When printing an HDF5 version number it should be printed as
+ *
+ * 		printf("%u.%u.%u", maj, min, rel)		or
+ *		printf("version %u.%u release %u", maj, min, rel)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Unknown
+ *
+ * Modifications:
+ * 	Robb Matzke, 4 Mar 1998
+ *	Now use "normal" data types for the interface.  Any of the arguments
+ *	may be null pointers
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5get_libversion(unsigned *majnum, unsigned *minnum, unsigned *relnum)
+{
+    herr_t                  ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "*Iu*Iu*Iu", majnum, minnum, relnum);
+
+    /* Set the version information */
+    if (majnum) *majnum = H5_VERS_MAJOR;
+    if (minnum) *minnum = H5_VERS_MINOR;
+    if (relnum) *relnum = H5_VERS_RELEASE;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5get_libversion() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5check_version
+ *
+ * Purpose:	Verifies that the arguments match the version numbers
+ *		compiled into the library.  This function is intended to be
+ *		called from user to verify that the versions of header files
+ *		compiled into the application match the version of the hdf5
+ *		library.
+ *
+ * Return:	Success:	SUCCEED
+ *
+ *		Failure:	abort()
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, April 21, 1998
+ *
+ * Modifications:
+ *	Albert Cheng, May 12, 2001
+ *	Added verification of H5_VERS_INFO.
+ *
+ *-------------------------------------------------------------------------
+ */
+#define VERSION_MISMATCH_WARNING \
+    "Warning! ***HDF5 library version mismatched error***\n" \
+    "The HDF5 header files used to compile this application do not match\n" \
+    "the version used by the HDF5 library to which this application is linked.\n" \
+    "Data corruption or segmentation faults may occur if the application continues.\n" \
+    "This can happen when an application was compiled by one version of HDF5 but\n" \
+    "linked with a different version of static or shared HDF5 library.\n" \
+    "You should recompile the application or check your shared library related\n" \
+    "settings such as 'LD_LIBRARY_PATH'.\n"
+
+herr_t
+H5check_version(unsigned majnum, unsigned minnum, unsigned relnum)
+{
+    char	lib_str[256];
+    char	substr[] = H5_VERS_SUBRELEASE;
+    static int	checked = 0;            /* If we've already checked the version info */
+    static unsigned int	disable_version_check = 0;      /* Set if the version check should be disabled */
+    static const char *version_mismatch_warning = VERSION_MISMATCH_WARNING;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API_NOINIT_NOERR_NOFS
+    H5TRACE3("e", "IuIuIu", majnum, minnum, relnum);
+
+    /* Don't check again, if we already have */
+    if (checked)
+	HGOTO_DONE(SUCCEED)
+
+    {    const char *s;  /* Environment string for disabling version check */
+
+        /* Allow different versions of the header files and library? */
+        s = HDgetenv ("HDF5_DISABLE_VERSION_CHECK");
+
+        if (s && HDisdigit(*s))
+            disable_version_check = (unsigned int)HDstrtol (s, NULL, 0);
+    }
+
+    if (H5_VERS_MAJOR!=majnum || H5_VERS_MINOR!=minnum ||
+            H5_VERS_RELEASE!=relnum) {
+        switch (disable_version_check) {
+	case 0:
+	    HDfprintf(stderr, "%s%s", version_mismatch_warning,
+		     "You can, at your own risk, disable this warning by setting the environment\n"
+		     "variable 'HDF5_DISABLE_VERSION_CHECK' to a value of '1'.\n"
+		     "Setting it to 2 or higher will suppress the warning messages totally.\n");
+	    /* Mention the versions we are referring to */
+	    HDfprintf (stderr, "Headers are %u.%u.%u, library is %u.%u.%u\n",
+		     majnum, minnum, relnum,
+		     (unsigned)H5_VERS_MAJOR, (unsigned)H5_VERS_MINOR, (unsigned)H5_VERS_RELEASE);
+	    /* Show library settings if available */
+	    HDfprintf (stderr, "%s", H5libhdf5_settings);
+
+	    /* Bail out now. */
+	    HDfputs ("Bye...\n", stderr);
+	    HDabort ();
+	case 1:
+	    /* continue with a warning */
+	    /* Note that the warning message is embedded in the format string.*/
+            HDfprintf (stderr,
+                     "%s'HDF5_DISABLE_VERSION_CHECK' "
+                     "environment variable is set to %d, application will\n"
+                     "continue at your own risk.\n",
+		     version_mismatch_warning, disable_version_check);
+	    /* Mention the versions we are referring to */
+	    HDfprintf (stderr, "Headers are %u.%u.%u, library is %u.%u.%u\n",
+		     majnum, minnum, relnum,
+		     (unsigned)H5_VERS_MAJOR, (unsigned)H5_VERS_MINOR, (unsigned)H5_VERS_RELEASE);
+	    /* Show library settings if available */
+	    HDfprintf (stderr, "%s", H5libhdf5_settings);
+	    break;
+	default:
+	    /* 2 or higer: continue silently */
+	    break;
+        } /* end switch */
+
+    } /* end if */
+
+    /* Indicate that the version check has been performed */
+    checked = 1;
+
+    if (!disable_version_check){
+	/*
+	 * Verify if H5_VERS_INFO is consistent with the other version information.
+	 * Check only the first sizeof(lib_str) char.  Assume the information
+	 * will fit within this size or enough significance.
+	 */
+	HDsnprintf(lib_str, sizeof(lib_str), "HDF5 library version: %d.%d.%d",
+	    H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE);
+	if(*substr) {
+	    HDstrncat(lib_str, "-", 1);
+	    HDstrncat(lib_str, substr, (sizeof(lib_str) - HDstrlen(lib_str)) - 1);
+	} /* end if */
+	if (HDstrcmp(lib_str, H5_lib_vers_info_g)){
+	    HDfputs ("Warning!  Library version information error.\n"
+		     "The HDF5 library version information are not "
+		     "consistent in its source code.\nThis is NOT a fatal error "
+		     "but should be corrected.  Setting the environment\n"
+		     "variable 'HDF5_DISABLE_VERSION_CHECK' to a value of 1 "
+		     "will suppress\nthis warning.\n",
+		     stderr);
+	    HDfprintf (stderr, "Library version information are:\n"
+		     "H5_VERS_MAJOR=%d, H5_VERS_MINOR=%d, H5_VERS_RELEASE=%d, "
+		     "H5_VERS_SUBRELEASE=%s,\nH5_VERS_INFO=%s\n",
+		     H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
+		     H5_VERS_SUBRELEASE, H5_VERS_INFO);
+	} /* end if */
+    }
+
+done:
+    FUNC_LEAVE_API_NOFS(ret_value)
+} /* end H5check_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5open
+ *
+ * Purpose:     Initialize the library.  This is normally called
+ *              automatically, but if you find that an HDF5 library function
+ *              is failing inexplicably, then try calling this function
+ *              first.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5open(void)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE0("e","");
+    /* all work is done by FUNC_ENTER() */
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5close
+ *
+ * Purpose:	Terminate the library and release all resources.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, January 30, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5close(void)
+{
+    /*
+     * Don't call normal FUNC_ENTER() since we don't want to initialize the
+     * whole library just to release it all right away.  It is safe to call
+     * this function for an uninitialized library.
+     */
+    FUNC_ENTER_API_NOINIT_NOERR_NOFS
+    H5TRACE0("e","");
+
+    H5_term_library();
+
+    FUNC_LEAVE_API_NOFS(SUCCEED)
+} /* end H5close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5allocate_memory
+ *
+ * Purpose:	    Allocate a memory buffer with the semantics of malloc().
+ *
+ *              NOTE: This function is intended for use with filter
+ *              plugins so that all allocation and free operations
+ *              use the same memory allocator. It is not intended for
+ *              use as a general memory allocator in applications.
+ *
+ * Parameters:
+ *
+ *      size:   The size of the buffer.
+ *
+ *      clear:  Whether or not to memset the buffer to 0.
+ *
+ * Return:
+ *
+ *      Success:    A pointer to the allocated buffer.
+ *  
+ *      Failure:    NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5allocate_memory(size_t size, hbool_t clear)
+{
+    void *ret_value = NULL;
+
+    FUNC_ENTER_API_NOINIT;
+    H5TRACE2("*x", "zb", size, clear);
+
+    if(clear)
+        ret_value = H5MM_calloc(size);
+    else
+        ret_value = H5MM_malloc(size);
+
+    FUNC_LEAVE_API(ret_value)
+
+} /* end H5allocate_memory() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5resize_memory
+ *
+ * Purpose:	    Resize a memory buffer with the semantics of realloc().
+ *
+ *              NOTE: This function is intended for use with filter
+ *              plugins so that all allocation and free operations
+ *              use the same memory allocator. It is not intended for
+ *              use as a general memory allocator in applications.
+ *
+ * Parameters:
+ *
+ *      mem:    The buffer to be resized.
+ *
+ *      size:   The size of the buffer.
+ *
+ * Return:
+ *
+ *      Success:    A pointer to the resized buffer.
+ *  
+ *      Failure:    NULL (the input buffer will be unchanged)
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5resize_memory(void *mem, size_t size)
+{
+    void *ret_value = NULL;
+
+    FUNC_ENTER_API_NOINIT;
+    H5TRACE2("*x", "*xz", mem, size);
+
+    ret_value = H5MM_realloc(mem, size);
+
+    FUNC_LEAVE_API(ret_value)
+
+} /* end H5resize_memory() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5free_memory
+ *
+ * Purpose:	    Frees memory allocated by the library that it is the user's
+ *              responsibility to free.  Ensures that the same library
+ *              that was used to allocate the memory frees it.  Passing
+ *              NULL pointers is allowed.
+ *
+ * Return:	    SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5free_memory(void *mem)
+{
+    FUNC_ENTER_API_NOINIT;
+    H5TRACE1("e", "*x", mem);
+
+    /* At this time, it is impossible for this to fail. */
+    HDfree(mem);
+
+    FUNC_LEAVE_API(SUCCEED)
+
+} /* end H5free_memory() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5is_library_threadsafe
+ *
+ * Purpose:	    Checks to see if the library was built with thread-safety
+ *              enabled.
+ *
+ * Return:	    SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5is_library_threadsafe(hbool_t *is_ts)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_API_NOINIT
+    H5TRACE1("e", "*b", is_ts);
+
+    HDassert(is_ts);
+ 
+#ifdef H5_HAVE_THREADSAFE
+    *is_ts = TRUE;
+#else /* H5_HAVE_THREADSAFE */
+    *is_ts = FALSE;
+#endif /* H5_HAVE_THREADSAFE */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5is_library_threadsafe() */
+
+

+#if defined(H5_HAVE_THREADSAFE) && defined(H5_BUILT_AS_DYNAMIC_LIB) \
+    && defined(H5_HAVE_WIN32_API) && defined(H5_HAVE_WIN_THREADS)
+/*-------------------------------------------------------------------------
+ * Function:    DllMain
+ *
+ * Purpose:     Handles various conditions in the library on Windows.
+ *
+ *    NOTE:     The main purpose of this is for handling Win32 thread cleanup
+ *              on thread/process detach.
+ *
+ * Return:      TRUE on success, FALSE on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+BOOL WINAPI
+DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved)
+{
+    /* Don't add our function enter/leave macros since this function will be
+     * called before the library is initialized.
+     *
+     * NOTE: Do NOT call any CRT functions in DllMain!
+     * This includes any functions that are called by from here!
+     */
+
+    BOOL fOkay = TRUE;
+
+    switch(fdwReason)
+    {
+    case DLL_PROCESS_ATTACH:
+        break;
+
+    case DLL_PROCESS_DETACH:
+        break;
+
+    case DLL_THREAD_ATTACH:
+#ifdef H5_HAVE_WIN_THREADS
+        if(H5TS_win32_thread_enter() < 0)
+            fOkay = FALSE;
+#endif /* H5_HAVE_WIN_THREADS */
+        break;
+
+    case DLL_THREAD_DETACH:
+#ifdef H5_HAVE_WIN_THREADS
+        if(H5TS_win32_thread_exit() < 0)
+            fOkay = FALSE;
+#endif /* H5_HAVE_WIN_THREADS */
+        break;
+
+    default:
+        /* Shouldn't get here */
+        fOkay = FALSE;
+        break;
+    }
+
+    return fOkay;
+}
+#endif /* H5_HAVE_WIN32_API && H5_BUILT_AS_DYNAMIC_LIB && H5_HAVE_WIN_THREADS && H5_HAVE_THREADSAFE*/
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5A.c b/gatb-core/thirdparty/hdf5/src/H5A.c
new file mode 100644
index 0000000..f1a6408
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5A.c
@@ -0,0 +1,1697 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg	*/
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	*/
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5A_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"		/* Object headers			*/
+#include "H5Sprivate.h"		/* Dataspace functions			*/
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Object header iterator callbacks */
+/* Data structure for callback for locating the index by name */
+typedef struct H5A_iter_cb1 {
+    const char *name;
+    int idx;
+} H5A_iter_cb1;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare the free lists of H5A_t */
+H5FL_DEFINE(H5A_t);
+
+/* Declare the free lists for H5A_shared_t's */
+H5FL_DEFINE(H5A_shared_t);
+
+/* Declare a free list to manage blocks of type conversion data */
+H5FL_BLK_DEFINE(attr_buf);
+
+/* Attribute ID class */
+static const H5I_class_t H5I_ATTR_CLS[1] = {{
+    H5I_ATTR,                   /* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,                          /* # of reserved IDs for class */
+    (H5I_free_t)H5A_close       /* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_init() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5A_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5A_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5A_init_interface(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Create attribute ID type.
+     */
+    if(H5I_register_type(H5I_ATTR_CLS) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_init_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_term_interface
+ PURPOSE
+    Terminate various H5A objects
+ USAGE
+    void H5A_term_interface()
+ RETURNS
+ DESCRIPTION
+    Release any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5A_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_ATTR) > 0) {
+	    (void)H5I_clear_type(H5I_ATTR, FALSE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Close deprecated interface */
+            n += H5A__term_deprec_interface();
+
+	    /* Destroy the attribute object id group */
+	    (void)H5I_dec_type_ref(H5I_ATTR);
+            n++; /*H5I*/
+
+	    /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* H5A_term_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Acreate2
+ PURPOSE
+    Creates an attribute on an object
+ USAGE
+    hid_t H5Acreate2(loc_id, attr_name, type_id, space_id, acpl_id,
+            aapl_id)
+        hid_t loc_id;       IN: Object (dataset or group) to be attached to
+        const char *attr_name;  IN: Name of attribute to locate and open
+        hid_t type_id;          IN: ID of datatype for attribute
+        hid_t space_id;         IN: ID of dataspace for attribute
+        hid_t acpl_id;          IN: ID of creation property list (currently not used)
+        hid_t aapl_id;          IN: Attribute access property list
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function creates an attribute which is attached to the object
+    specified with 'loc_id'.  The name specified with 'attr_name' for
+    each attribute for an object must be unique for that object.  The 'type_id'
+    and 'space_id' are created with the H5T and H5S interfaces respectively.
+    The 'aapl_id' property list is currently unused, but will be used in the
+    future for optional attribute access properties.  The attribute ID returned
+    from this function must be released with H5Aclose or resource leaks will
+    develop.
+
+--------------------------------------------------------------------------*/
+/* ARGSUSED */
+hid_t
+H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
+    hid_t acpl_id, hid_t H5_ATTR_UNUSED aapl_id)
+{
+    H5A_t	        *attr = NULL;           /* Attribute created */
+    H5G_loc_t           loc;                    /* Object location */
+    H5T_t		*type;                  /* Datatype to use for attribute */
+    H5S_t		*space;                 /* Dataspace to use for attribute */
+    hid_t		ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("i", "i*siiii", loc_id, attr_name, type_id, space_id, acpl_id, aapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, FAIL, "no write intent on file")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Go do the real work for attaching the attribute to the dataset */
+    if(NULL == (attr = H5A_create(&loc, attr_name, type, space, acpl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute")
+
+    /* Register the new attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0 && attr && H5A_close(attr) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Acreate2() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Acreate_by_name
+ PURPOSE
+    Creates an attribute on an object
+ USAGE
+    hid_t H5Acreate_by_name(loc_id, obj_name, attr_name, type_id, space_id, acpl_id,
+            aapl_id, lapl_id)
+        hid_t loc_id;       IN: Object (dataset or group) to be attached to
+        const char *obj_name;   IN: Name of object relative to location
+        const char *attr_name;  IN: Name of attribute to locate and open
+        hid_t type_id;          IN: ID of datatype for attribute
+        hid_t space_id;         IN: ID of dataspace for attribute
+        hid_t acpl_id;          IN: ID of creation property list (currently not used)
+        hid_t aapl_id;          IN: Attribute access property list
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function creates an attribute which is attached to the object
+    specified with 'loc_id/obj_name'.  The name specified with 'attr_name' for
+    each attribute for an object must be unique for that object.  The 'type_id'
+    and 'space_id' are created with the H5T and H5S interfaces respectively.
+    The 'aapl_id' property list is currently unused, but will be used in the
+    future for optional attribute access properties.  The attribute ID returned
+    from this function must be released with H5Aclose or resource leaks will
+    develop.
+
+--------------------------------------------------------------------------*/
+/* ARGSUSED */
+hid_t
+H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t H5_ATTR_UNUSED aapl_id,
+    hid_t lapl_id)
+{
+    H5A_t	        *attr = NULL;           /* Attribute created */
+    H5G_loc_t           loc;                    /* Object location */
+    H5G_loc_t           obj_loc;                /* Location used to open group */
+    H5G_name_t          obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t           obj_oloc;            	/* Opened object object location */
+    hbool_t             loc_found = FALSE;      /* Entry at 'obj_name' found */
+    H5T_t		*type;                  /* Datatype to use for attribute */
+    H5S_t		*space;                 /* Dataspace to use for attribute */
+    hid_t		ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("i", "i*s*siiiii", loc_id, obj_name, attr_name, type_id, space_id,
+             acpl_id, aapl_id, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, FAIL, "no write intent on file")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Go do the real work for attaching the attribute to the dataset */
+    if(NULL == (attr = H5A_create(&obj_loc, attr_name, type, space, acpl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute")
+
+    /* Register the new attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+    if(ret_value < 0 && attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Acreate_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aopen
+ PURPOSE
+    Opens an attribute for an object by looking up the attribute name
+ USAGE
+    hid_t H5Aopen(loc_id, attr_name, aapl_id)
+        hid_t loc_id;           IN: Object that attribute is attached to
+        const char *attr_name;  IN: Name of attribute to locate and open
+        hid_t aapl_id;          IN: Attribute access property list
+ RETURNS
+    ID of attribute on success, negative on failure
+
+ DESCRIPTION
+        This function opens an existing attribute for access.  The attribute
+    name specified is used to look up the corresponding attribute for the
+    object.  The attribute ID returned from this function must be released with
+    H5Aclose or resource leaks will develop.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aopen(hid_t loc_id, const char *attr_name, hid_t H5_ATTR_UNUSED aapl_id)
+{
+    H5G_loc_t    	loc;            /* Object location */
+    H5A_t               *attr = NULL;   /* Attribute opened */
+    hid_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*si", loc_id, attr_name, aapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+
+    /* Read in attribute from object header */
+    if(NULL == (attr = H5O_attr_open_by_name(loc.oloc, attr_name, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to load attribute info from object header for attribute: '%s'", attr_name)
+
+    /* Finish initializing attribute */
+    if(H5A_open_common(&loc, attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to initialize attribute")
+
+    /* Register the attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aopen() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aopen_by_name
+ PURPOSE
+    Opens an attribute for an object by looking up the attribute name
+ USAGE
+    hid_t H5Aopen_by_name(loc_id, obj_name, attr_name, aapl_id, lapl_id)
+        hid_t loc_id;           IN: Object that attribute is attached to
+        const char *obj_name;   IN: Name of object relative to location
+        const char *attr_name;  IN: Name of attribute to locate and open
+        hid_t aapl_id;          IN: Attribute access property list
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+    ID of attribute on success, negative on failure
+
+ DESCRIPTION
+        This function opens an existing attribute for access.  The attribute
+    name specified is used to look up the corresponding attribute for the
+    object.  The attribute ID returned from this function must be released with
+    H5Aclose or resource leaks will develop.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    hid_t H5_ATTR_UNUSED aapl_id, hid_t lapl_id)
+{
+    H5G_loc_t    	loc;            /* Object location */
+    H5A_t               *attr = NULL;   /* Attribute opened */
+    hid_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("i", "i*s*sii", loc_id, obj_name, attr_name, aapl_id, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Open the attribute on the object header */
+    if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
+
+    /* Register the attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aopen_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aopen_by_idx
+ PURPOSE
+    Opens the n'th attribute for an object, according to the order within
+    an index
+ USAGE
+    hid_t H5Aopen_by_idx(loc_id, obj_ame, idx_type, order, n, aapl_id, lapl_id)
+        hid_t loc_id;           IN: Object that attribute is attached to
+        const char *obj_name;   IN: Name of object relative to location
+        H5_index_t idx_type;    IN: Type of index to use
+        H5_iter_order_t order;  IN: Order to iterate over index
+        hsize_t n;              IN: Index (0-based) attribute to open
+        hid_t aapl_id;          IN: Attribute access property list
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+    ID of attribute on success, negative on failure
+
+ DESCRIPTION
+        This function opens an existing attribute for access.  The attribute
+    index specified is used to look up the corresponding attribute for the
+    object.  The attribute ID returned from this function must be released with
+    H5Aclose or resource leaks will develop.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t H5_ATTR_UNUSED aapl_id, hid_t lapl_id)
+{
+    H5A_t       *attr = NULL;   /* Attribute opened */
+    H5G_loc_t	loc;	        /* Object location */
+    hid_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("i", "i*sIiIohii", loc_id, obj_name, idx_type, order, n, aapl_id,
+             lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Open the attribute in the object header */
+    if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open attribute")
+
+    /* Register the attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aopen_by_idx() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Awrite
+ PURPOSE
+    Write out data to an attribute
+ USAGE
+    herr_t H5Awrite (attr_id, dtype_id, buf)
+        hid_t attr_id;       IN: Attribute to write
+        hid_t dtype_id;       IN: Memory datatype of buffer
+        const void *buf;     IN: Buffer of data to write
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function writes a complete attribute to disk.
+--------------------------------------------------------------------------*/
+herr_t
+H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
+{
+    H5A_t *attr;                /* Attribute object for ID */
+    H5T_t *mem_type;            /* Memory datatype */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
+
+    /* check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+    if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(NULL == buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
+
+    /* Go write the actual data to the attribute */
+    if((ret_value = H5A_write(attr, mem_type, buf, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Awrite() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aread
+ PURPOSE
+    Read in data from an attribute
+ USAGE
+    herr_t H5Aread (attr_id, dtype_id, buf)
+        hid_t attr_id;       IN: Attribute to read
+        hid_t dtype_id;       IN: Memory datatype of buffer
+        void *buf;           IN: Buffer for data to read
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function reads a complete attribute from disk.
+--------------------------------------------------------------------------*/
+herr_t
+H5Aread(hid_t attr_id, hid_t dtype_id, void *buf)
+{
+    H5A_t *attr;                /* Attribute object for ID */
+    H5T_t *mem_type;            /* Memory datatype */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
+
+    /* check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+    if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(NULL == buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
+
+    /* Go write the actual data to the attribute */
+    if((ret_value = H5A_read(attr, mem_type, buf, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "unable to read attribute")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aread() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aget_space
+ PURPOSE
+    Gets a copy of the dataspace for an attribute
+ USAGE
+    hid_t H5Aget_space (attr_id)
+        hid_t attr_id;       IN: Attribute to get dataspace of
+ RETURNS
+    A dataspace ID on success, negative on failure
+
+ DESCRIPTION
+        This function retrieves a copy of the dataspace for an attribute.
+    The dataspace ID returned from this function must be released with H5Sclose
+    or resource leaks will develop.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aget_space(hid_t attr_id)
+{
+    H5A_t	*attr;                  /* Attribute object for ID */
+    H5S_t      *ds = NULL;
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", attr_id);
+
+    /* check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    if(NULL == (ds = H5A_get_space(attr)))
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get space ID of attribute")
+
+    /* Atomize */
+    if((ret_value = H5I_register(H5I_DATASPACE, ds, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    if(ret_value < 0) {
+        if(ds && (H5S_close(ds) < 0))
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aget_space() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aget_type
+ PURPOSE
+    Gets a copy of the datatype for an attribute
+ USAGE
+    hid_t H5Aget_type (attr_id)
+        hid_t attr_id;       IN: Attribute to get datatype of
+ RETURNS
+    A datatype ID on success, negative on failure
+
+ DESCRIPTION
+        This function retrieves a copy of the datatype for an attribute.
+    The datatype ID returned from this function must be released with H5Tclose
+    or resource leaks will develop.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aget_type(hid_t attr_id)
+{
+    H5A_t	*attr;          /* Attribute object for ID */
+    H5T_t      *dt = NULL;
+    hid_t	 ret_value;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", attr_id);
+
+    /* check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    if(NULL == (dt = H5A_get_type(attr)))
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get space ID of attribute")
+
+    /* Create an atom */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    if(ret_value < 0) {
+        if(dt && (H5T_close(dt) < 0))
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aget_type() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aget_create_plist
+ PURPOSE
+    Gets a copy of the creation property list for an attribute
+ USAGE
+    hssize_t H5Aget_create_plist (attr_id, buf_size, buf)
+        hid_t attr_id;      IN: Attribute to get name of
+ RETURNS
+    This function returns the ID of a copy of the attribute's creation
+    property list, or negative on failure.
+
+ ERRORS
+
+ DESCRIPTION
+        This function returns a copy of the creation property list for
+    an attribute.  The resulting ID must be closed with H5Pclose() or
+    resource leaks will occur.
+--------------------------------------------------------------------------*/
+hid_t
+H5Aget_create_plist(hid_t attr_id)
+{
+    H5A_t		*attr;               /* Attribute object for ID */
+    hid_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", attr_id);
+
+    HDassert(H5P_LST_ATTRIBUTE_CREATE_ID_g != -1);
+
+    /* Get attribute and default attribute creation property list*/
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    if((ret_value = H5A_get_create_plist(attr)) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get creation property list for attr")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_create_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aget_name
+ PURPOSE
+    Gets a copy of the name for an attribute
+ USAGE
+    hssize_t H5Aget_name (attr_id, buf_size, buf)
+        hid_t attr_id;      IN: Attribute to get name of
+        size_t buf_size;    IN: The size of the buffer to store the string in.
+        char *buf;          IN: Buffer to store name in
+ RETURNS
+    This function returns the length of the attribute's name (which may be
+    longer than 'buf_size') on success or negative for failure.
+
+ DESCRIPTION
+        This function retrieves the name of an attribute for an attribute ID.
+    Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string
+    terminator.  If the name of the attribute is longer than 'buf_size'-1,
+    the string terminator is stored in the last position of the buffer to
+    properly terminate the string.
+--------------------------------------------------------------------------*/
+ssize_t
+H5Aget_name(hid_t attr_id, size_t buf_size, char *buf)
+{
+    H5A_t		*my_attr;               /* Attribute object for ID */
+    ssize_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "iz*s", attr_id, buf_size, buf);
+
+    /* check arguments */
+    if(NULL == (my_attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+    if(!buf && buf_size)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer")
+
+    /* Call private function in turn */
+    if(0 > (ret_value = H5A_get_name(my_attr, buf_size, buf)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get attribute name")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aget_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aget_name_by_idx
+ *
+ * Purpose:	Retrieve name of an attribute, according to the
+ *		order within an index.
+ *
+ *              Same pattern of behavior as H5Iget_name.
+ *
+ * Return:	Success:	Non-negative length of name, with information
+ *				in NAME buffer
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February  8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, char *name /*out*/, size_t size,
+    hid_t lapl_id)
+{
+    H5G_loc_t   loc;            /* Object location */
+    H5A_t	*attr = NULL;   /* Attribute object for name */
+    ssize_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("Zs", "i*sIiIohxzi", loc_id, obj_name, idx_type, order, n, name, size,
+             lapl_id);
+
+    /* Check args */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Open the attribute on the object header */
+    if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
+
+    /* Get the length of the name */
+    ret_value = (ssize_t)HDstrlen(attr->shared->name);
+
+    /* Copy the name into the user's buffer, if given */
+    if(name) {
+        HDstrncpy(name, attr->shared->name, MIN((size_t)(ret_value + 1), size));
+        if((size_t)ret_value >= size)
+            name[size - 1]='\0';
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(attr && H5A_close(attr) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aget_storage_size
+ *
+ * Purpose:	Returns the amount of storage size that is required for this
+ *		attribute.
+ *
+ * Return:	Success:	The amount of storage size allocated for the
+ *				attribute.  The return value may be zero
+ *                              if no data has been stored.
+ *
+ *		Failure:	Zero
+ *
+ * Programmer:	Raymond Lu
+ *              October 23, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5Aget_storage_size(hid_t attr_id)
+{
+    H5A_t	*attr;               /* Attribute object for ID */
+    hsize_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE1("h", "i", attr_id);
+
+    /* Check args */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an attribute")
+
+    /* Set return value */
+    ret_value = attr->shared->data_size;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_storage_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aget_info
+ *
+ * Purpose:	Retrieve information about an attribute.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Aget_info(hid_t attr_id, H5A_info_t *ainfo)
+{
+    H5A_t	*attr;                  /* Attribute object for name */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", attr_id, ainfo);
+
+    /* Check args */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    /* Get the attribute information */
+    if(H5A_get_info(attr, ainfo) < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aget_info_by_name
+ *
+ * Purpose:	Retrieve information about an attribute by name.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    H5A_info_t *ainfo, hid_t lapl_id)
+{
+    H5G_loc_t   loc;                    /* Object location */
+    H5A_t	*attr = NULL;           /* Attribute object for name */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*s*s*xi", loc_id, obj_name, attr_name, ainfo, lapl_id);
+
+    /* Check args */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(NULL == ainfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid info pointer")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Open the attribute on the object header */
+    if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
+
+    /* Get the attribute information */
+    if(H5A_get_info(attr, ainfo) < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
+
+done:
+    /* Cleanup on failure */
+    if(attr && H5A_close(attr) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_info_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aget_info_by_idx
+ *
+ * Purpose:	Retrieve information about an attribute, according to the
+ *		order within an index.
+ *
+ * Return:	Success:	Non-negative with information in AINFO
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February  8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, H5A_info_t *ainfo, hid_t lapl_id)
+{
+    H5G_loc_t   loc;                    /* Object location */
+    H5A_t	*attr = NULL;           /* Attribute object for name */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIoh*xi", loc_id, obj_name, idx_type, order, n, ainfo,
+             lapl_id);
+
+    /* Check args */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(NULL == ainfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid info pointer")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Open the attribute on the object header */
+    if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
+
+    /* Get the attribute information */
+    if(H5A_get_info(attr, ainfo) < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
+
+done:
+    /* Release resources */
+    if(attr && H5A_close(attr) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Aget_info_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Arename
+ *
+ * Purpose:     Rename an attribute
+ *
+ * Return:	Success:             Non-negative
+ *		Failure:             Negative
+ *
+ * Programmer:	Raymond Lu
+ *              October 23, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Arename(hid_t loc_id, const char *old_name, const char *new_name)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*s", loc_id, old_name, new_name);
+
+    /* check arguments */
+    if(!old_name || !new_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "name is nil")
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+
+    /* Avoid thrashing things if the names are the same */
+    if(HDstrcmp(old_name, new_name)) {
+        H5G_loc_t	loc;	                /* Object location */
+  
+        if(H5G_loc(loc_id, & loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+        /* Call private attribute rename routine */
+        if(H5O_attr_rename(loc.oloc, H5AC_dxpl_id, old_name, new_name) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Arename() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Arename_by_name
+ *
+ * Purpose:     Rename an attribute
+ *
+ * Return:	Success:             Non-negative
+ *		Failure:             Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name,
+    const char *new_attr_name, hid_t lapl_id)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*s*s*si", loc_id, obj_name, old_attr_name, new_attr_name,
+             lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!old_attr_name || !*old_attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no old attribute name")
+    if(!new_attr_name || !*new_attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new attribute name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Avoid thrashing things if the names are the same */
+    if(HDstrcmp(old_attr_name, new_attr_name)) {
+        H5G_loc_t loc;                /* Object location */
+
+        if(H5G_loc(loc_id, & loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+        /* Call private attribute rename routine */
+        if(H5A_rename_by_name(loc, obj_name, old_attr_name, new_attr_name, lapl_id, H5AC_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Arename_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aiterate2
+ PURPOSE
+    Calls a user's function for each attribute on an object
+ USAGE
+    herr_t H5Aiterate2(loc_id, idx_type, order, idx, op, op_data)
+        hid_t loc_id;           IN: Base location for object
+        H5_index_t idx_type;    IN: Type of index to use
+        H5_iter_order_t order;  IN: Order to iterate over index
+        hsize_t *idx;           IN/OUT: Starting (IN) & Ending (OUT) attribute
+                                    in index & order
+        H5A_operator2_t op;     IN: User's function to pass each attribute to
+        void *op_data;          IN/OUT: User's data to pass through to iterator
+                                    operator function
+ RETURNS
+        Returns a negative value if an error occurs, the return value of the
+    last operator if it was non-zero (which can be a negative value), or zero
+    if all attributes were processed.
+
+ DESCRIPTION
+        This function interates over the attributes of dataset or group
+    specified with 'loc_id' & 'obj_name'.  For each attribute of the object,
+    the 'op_data' and some additional information (specified below) are passed
+    to the 'op' function.  The iteration begins with the '*idx'
+    object in the group and the next attribute to be processed by the operator
+    is returned in '*idx'.
+        The operation receives the ID for the group or dataset being iterated
+    over ('loc_id'), the name of the current attribute about the object
+    ('attr_name'), the attribute's "info" struct ('ainfo') and the pointer to
+    the operator data passed in to H5Aiterate2 ('op_data').  The return values
+    from an operator are:
+        A. Zero causes the iterator to continue, returning zero when all
+            attributes have been processed.
+        B. Positive causes the iterator to immediately return that positive
+            value, indicating short-circuit success.  The iterator can be
+            restarted at the next attribute.
+        C. Negative causes the iterator to immediately return that value,
+            indicating failure.  The iterator can be restarted at the next
+            attribute.
+--------------------------------------------------------------------------*/
+herr_t
+H5Aiterate2(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t *idx, H5A_operator2_t op, void *op_data)
+{
+    H5A_attr_iter_op_t attr_op; /* Attribute operator */
+    hsize_t	start_idx;      /* Index of attribute to start iterating at */
+    hsize_t	last_attr;      /* Index of last attribute examined */
+    herr_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iIiIo*hx*x", loc_id, idx_type, order, idx, op, op_data);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+
+    /* Build attribute operator info */
+    attr_op.op_type = H5A_ATTR_OP_APP2;
+    attr_op.u.app_op2 = op;
+
+    /* Call attribute iteration routine */
+    last_attr = start_idx = (idx ? *idx : 0);
+    if((ret_value = H5O_attr_iterate(loc_id, H5AC_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0)
+        HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
+
+    /* Set the last attribute information */
+    if(idx)
+        *idx = last_attr;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aiterate2() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aiterate_by_name
+ PURPOSE
+    Calls a user's function for each attribute on an object
+ USAGE
+    herr_t H5Aiterate2(loc_id, obj_name, idx_type, order, idx, op, op_data, lapl_id)
+        hid_t loc_id;           IN: Base location for object
+        const char *obj_name;   IN: Name of object relative to location
+        H5_index_t idx_type;    IN: Type of index to use
+        H5_iter_order_t order;  IN: Order to iterate over index
+        hsize_t *idx;           IN/OUT: Starting (IN) & Ending (OUT) attribute
+                                    in index & order
+        H5A_operator2_t op;     IN: User's function to pass each attribute to
+        void *op_data;          IN/OUT: User's data to pass through to iterator
+                                    operator function
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+        Returns a negative value if an error occurs, the return value of the
+    last operator if it was non-zero (which can be a negative value), or zero
+    if all attributes were processed.
+
+ DESCRIPTION
+        This function interates over the attributes of dataset or group
+    specified with 'loc_id' & 'obj_name'.  For each attribute of the object,
+    the 'op_data' and some additional information (specified below) are passed
+    to the 'op' function.  The iteration begins with the '*idx'
+    object in the group and the next attribute to be processed by the operator
+    is returned in '*idx'.
+        The operation receives the ID for the group or dataset being iterated
+    over ('loc_id'), the name of the current attribute about the object
+    ('attr_name'), the attribute's "info" struct ('ainfo') and the pointer to
+    the operator data passed in to H5Aiterate_by_name ('op_data').  The return values
+    from an operator are:
+        A. Zero causes the iterator to continue, returning zero when all
+            attributes have been processed.
+        B. Positive causes the iterator to immediately return that positive
+            value, indicating short-circuit success.  The iterator can be
+            restarted at the next attribute.
+        C. Negative causes the iterator to immediately return that value,
+            indicating failure.  The iterator can be restarted at the next
+            attribute.
+--------------------------------------------------------------------------*/
+herr_t
+H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;	        /* Object location */
+    H5G_loc_t   obj_loc;        /* Location used to open group */
+    H5G_name_t  obj_path;       /* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;       /* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    hid_t       obj_loc_id = (-1);      /* ID for object located */
+    H5A_attr_iter_op_t attr_op; /* Attribute operator */
+    hsize_t	start_idx;      /* Index of attribute to start iterating at */
+    hsize_t	last_attr;      /* Index of last attribute examined */
+    herr_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("e", "i*sIiIo*hx*xi", loc_id, obj_name, idx_type, order, idx, op,
+             op_data, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Open the object */
+    if((obj_loc_id = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_ind_dxpl_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+    /* Build attribute operator info */
+    attr_op.op_type = H5A_ATTR_OP_APP2;
+    attr_op.u.app_op2 = op;
+
+    /* Call attribute iteration routine */
+    last_attr = start_idx = (idx ? *idx : 0);
+    if((ret_value = H5O_attr_iterate(obj_loc_id, H5AC_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0)
+        HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
+
+    /* Set the last attribute information */
+    if(idx)
+        *idx = last_attr;
+
+done:
+    /* Release resources */
+    if(obj_loc_id > 0) {
+        if(H5I_dec_app_ref(obj_loc_id) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    } /* end if */
+    else if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aiterate_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Adelete
+ PURPOSE
+    Deletes an attribute from a location
+ USAGE
+    herr_t H5Adelete(loc_id, name)
+        hid_t loc_id;       IN: Object (dataset or group) to have attribute deleted from
+        const char *name;   IN: Name of attribute to delete
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function removes the named attribute from a dataset or group.
+--------------------------------------------------------------------------*/
+herr_t
+H5Adelete(hid_t loc_id, const char *name)
+{
+    H5G_loc_t	loc;		        /* Object location */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", loc_id, name);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Delete the attribute from the location */
+    if(H5O_attr_remove(loc.oloc, name, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Adelete() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Adelete_by_name
+ PURPOSE
+    Deletes an attribute from a location
+ USAGE
+    herr_t H5Adelete_by_name(loc_id, obj_name, attr_name, lapl_id)
+        hid_t loc_id;           IN: Base location for object
+        const char *obj_name;   IN: Name of object relative to location
+        const char *attr_name;  IN: Name of attribute to delete
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function removes the named attribute from an object.
+--------------------------------------------------------------------------*/
+herr_t
+H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;		        /* Object location */
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*s*si", loc_id, obj_name, attr_name, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Delete the attribute from the location */
+    if(H5O_attr_remove(obj_loc.oloc, attr_name, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Adelete_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Adelete_by_idx
+ PURPOSE
+    Deletes an attribute from a location, according to the order within an index
+ USAGE
+    herr_t H5Adelete_by_idx(loc_id, obj_name, idx_type, order, n, lapl_id)
+        hid_t loc_id;           IN: Base location for object
+        const char *obj_name;   IN: Name of object relative to location
+        H5_index_t idx_type;    IN: Type of index to use
+        H5_iter_order_t order;  IN: Order to iterate over index
+        hsize_t n;              IN: Offset within index
+        hid_t lapl_id;          IN: Link access property list
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+        This function removes an attribute from an object, using the IDX_TYPE
+    index to delete the N'th attribute in ORDER direction in the index.  The
+    object is specified relative to the LOC_ID with the OBJ_NAME path.  To
+    remove an attribute on the object specified by LOC_ID, pass in "." for
+    OBJ_NAME.  The link access property list, LAPL_ID, controls aspects of
+    the group hierarchy traversal when using the OBJ_NAME to locate the final
+    object to operate on.
+--------------------------------------------------------------------------*/
+herr_t
+H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t lapl_id)
+{
+    H5G_loc_t	loc;		        /* Object location */
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*sIiIohi", loc_id, obj_name, idx_type, order, n, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Delete the attribute from the location */
+    if(H5O_attr_remove_by_idx(obj_loc.oloc, idx_type, order, n, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Adelete_by_idx() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aclose
+ PURPOSE
+    Close an attribute ID
+ USAGE
+    herr_t H5Aclose (attr_id)
+        hid_t attr_id;       IN: Attribute to release access to
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function releases an attribute from use.  Further use of the
+    attribute ID will result in undefined behavior.
+--------------------------------------------------------------------------*/
+herr_t
+H5Aclose(hid_t attr_id)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", attr_id);
+
+    /* check arguments */
+    if(NULL == H5I_object_verify(attr_id, H5I_ATTR))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    /* Decrement references to that atom (and close it) */
+    if(H5I_dec_app_ref(attr_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "can't close attribute")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aexists
+ *
+ * Purpose:	Checks if an attribute with a given name exists on an opened
+ *              object.
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Aexists(hid_t obj_id, const char *attr_name)
+{
+    H5G_loc_t   loc;                    /* Object location */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "i*s", obj_id, attr_name);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(obj_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(obj_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+
+    /* Check if the attribute exists */
+    if((ret_value = H5O_attr_exists(loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aexists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Aexists_by_name
+ *
+ * Purpose:	Checks if an attribute with a given name exists on an object.
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    hid_t lapl_id)
+{
+    H5G_loc_t   loc;                    /* Object location */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("t", "i*s*si", loc_id, obj_name, attr_name, lapl_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
+    if(!attr_name || !*attr_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    if((ret_value = H5A_exists_by_name(loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aexists_by_name() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5AC.c b/gatb-core/thirdparty/hdf5/src/H5AC.c
new file mode 100644
index 0000000..481d7a1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5AC.c
@@ -0,0 +1,4986 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5AC.c
+ *                      Jul  9 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Functions in this file implement a cache for
+ *                      things which exist on disk.  All "things" associated
+ *                      with a particular HDF file share the same cache; each
+ *                      HDF file has it's own cache.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5AC_PACKAGE            /*suppress error about including H5ACpkg  */
+#define H5C_PACKAGE             /*suppress error about including H5Cpkg   */
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5AC_init_interface
+
+#ifdef H5_HAVE_PARALLEL
+#include <mpi.h>
+#endif /* H5_HAVE_PARALLEL */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACpkg.h"		/* Metadata cache			*/
+#include "H5Cpkg.h"             /* Cache                                */
+#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+
+#ifdef H5_HAVE_PARALLEL
+
+/* Declare a free list to manage the H5AC_aux_t struct */
+H5FL_DEFINE_STATIC(H5AC_aux_t);
+
+#endif /* H5_HAVE_PARALLEL */
+
+/****************************************************************************
+ *
+ * structure H5AC_slist_entry_t
+ *
+ * The dirty entry list maintained via the d_slist_ptr field of H5AC_aux_t
+ * and the cleaned entry list maintained via the c_slist_ptr field of
+ * H5AC_aux_t are just lists of the file offsets of the dirty/cleaned
+ * entries.  Unfortunately, the slist code makes us define a dynamically
+ * allocated structure to store these offsets in.  This structure serves
+ * that purpose.  Its fields are as follows:
+ *
+ * magic:       Unsigned 32 bit integer always set to
+ *		H5AC__H5AC_SLIST_ENTRY_T_MAGIC.  This field is used to
+ *		validate pointers to instances of H5AC_slist_entry_t.
+ *
+ * addr:	file offset of a metadata entry.  Entries are added to this
+ *		list (if they aren't there already) when they are marked
+ *		dirty in an unprotect, inserted, or moved.  They are
+ *		removed when they appear in a clean entries broadcast.
+ *
+ ****************************************************************************/
+
+#ifdef H5_HAVE_PARALLEL
+
+#define H5AC__H5AC_SLIST_ENTRY_T_MAGIC        0x00D0A02
+
+typedef struct H5AC_slist_entry_t
+{
+    uint32_t    magic;
+
+    haddr_t     addr;
+} H5AC_slist_entry_t;
+
+/* Declare a free list to manage the H5AC_slist_entry_t struct */
+H5FL_DEFINE_STATIC(H5AC_slist_entry_t);
+
+#endif /* H5_HAVE_PARALLEL */
+
+
+/*
+ * Private file-scope variables.
+ */
+
+/* Default dataset transfer property list for metadata I/O calls */
+/* (Collective set, "block before metadata write" set and "library internal" set) */
+/* (Global variable definition, declaration is in H5ACprivate.h also) */
+hid_t H5AC_dxpl_id=(-1);
+
+/* Dataset transfer property list for independent metadata I/O calls */
+/* (just "library internal" set - i.e. independent transfer mode) */
+/* (Global variable definition, declaration is in H5ACprivate.h also) */
+H5P_genplist_t *H5AC_ind_dxpl_g = NULL;
+hid_t H5AC_ind_dxpl_id=(-1);
+
+
+/*
+ * Private file-scope function declarations:
+ */
+
+static herr_t H5AC_check_if_write_permitted(const H5F_t *f,
+                                            hid_t dxpl_id,
+                                            hbool_t * write_permitted_ptr);
+
+static herr_t H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
+                                           H5C_auto_size_ctl_t * int_conf_ptr);
+
+#ifdef H5_HAVE_PARALLEL
+static herr_t H5AC_broadcast_candidate_list(H5AC_t * cache_ptr,
+                                            int * num_entries_ptr,
+                                            haddr_t ** haddr_buf_ptr_ptr);
+
+static herr_t H5AC_broadcast_clean_list(H5AC_t * cache_ptr);
+
+static herr_t H5AC_construct_candidate_list(H5AC_t * cache_ptr,
+                                            H5AC_aux_t * aux_ptr,
+                                            int sync_point_op);
+
+static herr_t H5AC_copy_candidate_list_to_buffer(H5AC_t * cache_ptr,
+                                        int * num_entries_ptr,
+                                        haddr_t ** haddr_buf_ptr_ptr,
+					size_t * MPI_Offset_buf_size_ptr,
+                                        MPI_Offset ** MPI_Offset_buf_ptr_ptr);
+
+static herr_t H5AC_flush_entries(H5F_t *f);
+
+static herr_t H5AC_log_deleted_entry(H5AC_t * cache_ptr,
+                                     H5AC_info_t * entry_ptr,
+                                     haddr_t addr,
+                                     unsigned int flags);
+
+static herr_t H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr,
+                                     haddr_t addr);
+
+static herr_t H5AC_log_flushed_entry(H5C_t * cache_ptr,
+                                     haddr_t addr,
+                                     hbool_t was_dirty,
+                                     unsigned flags,
+                                     int type_id);
+
+static herr_t H5AC_log_moved_entry(const H5F_t * f,
+                                     haddr_t old_addr,
+                                     haddr_t new_addr);
+
+static herr_t H5AC_log_inserted_entry(H5AC_t * cache_ptr,
+                                      H5AC_info_t * entry_ptr);
+
+static herr_t H5AC_propagate_and_apply_candidate_list(H5F_t  * f,
+                                                      hid_t    dxpl_id,
+                                                      H5AC_t * cache_ptr);
+
+static herr_t H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t  * f,
+                                                           hid_t dxpl_id,
+                                                           H5AC_t * cache_ptr);
+
+static herr_t H5AC_receive_candidate_list(H5AC_t * cache_ptr,
+                                          int * num_entries_ptr,
+                                          haddr_t ** haddr_buf_ptr_ptr);
+
+static herr_t H5AC_receive_and_apply_clean_list(H5F_t  * f,
+                                                hid_t    primary_dxpl_id,
+                                                hid_t    secondary_dxpl_id,
+                                                H5AC_t * cache_ptr);
+
+static herr_t H5AC_tidy_cache_0_lists(H5AC_t * cache_ptr,
+                                      int num_candidates,
+                                      haddr_t * candidates_list_ptr);
+
+herr_t H5AC_rsp__dist_md_write__flush(H5F_t *f, 
+                                      hid_t dxpl_id, 
+                                      H5AC_t * cache_ptr);
+
+herr_t H5AC_rsp__dist_md_write__flush_to_min_clean(H5F_t *f, 
+                                                   hid_t dxpl_id, 
+                                                   H5AC_t * cache_ptr);
+
+herr_t H5AC_rsp__p0_only__flush(H5F_t *f, 
+                                hid_t dxpl_id, 
+                                H5AC_t * cache_ptr);
+
+herr_t H5AC_rsp__p0_only__flush_to_min_clean(H5F_t *f, 
+                                             hid_t dxpl_id, 
+                                             H5AC_t * cache_ptr);
+
+static herr_t H5AC_run_sync_point(H5F_t *f, 
+                                  hid_t dxpl_id, 
+		                  int sync_point_op);
+
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC_init
+ *
+ * Purpose:	Initialize the interface from some other layer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 18, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_init(void)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC_init_interface
+ *
+ * Purpose:	Initialize interface-specific information
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 18, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC_init_interface(void)
+{
+#ifdef H5_HAVE_PARALLEL
+    H5P_genplist_t  *xfer_plist;    /* Dataset transfer property list object */
+    unsigned coll_meta_write;       /* "collective metadata write" property value */
+#endif /* H5_HAVE_PARALLEL */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5_HAVE_PARALLEL
+    /* Sanity check */
+    HDassert(H5P_CLS_DATASET_XFER_g != NULL);
+
+    /* Get an ID for the collective H5AC dxpl */
+    if((H5AC_dxpl_id = H5P_create_id(H5P_CLS_DATASET_XFER_g, FALSE)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list")
+
+    /* Get the property list object */
+    if (NULL == (xfer_plist = (H5P_genplist_t *)H5I_object(H5AC_dxpl_id)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object")
+
+    /* Insert 'collective metadata write' property */
+    coll_meta_write = 1;
+    if(H5P_insert(xfer_plist, H5AC_COLLECTIVE_META_WRITE_NAME, H5AC_COLLECTIVE_META_WRITE_SIZE, &coll_meta_write,
+                  NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
+
+    /* Get an ID for the independent H5AC dxpl */
+    if((H5AC_ind_dxpl_id = H5P_create_id(H5P_CLS_DATASET_XFER_g, FALSE)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list")
+
+    /* Get the property list object */
+    if(NULL == (H5AC_ind_dxpl_g = (H5P_genplist_t *)H5I_object(H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object")
+
+    /* Insert 'collective metadata write' property */
+    coll_meta_write = 0;
+    if(H5P_insert(H5AC_ind_dxpl_g, H5AC_COLLECTIVE_META_WRITE_NAME, H5AC_COLLECTIVE_META_WRITE_SIZE, &coll_meta_write,
+            NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
+#else /* H5_HAVE_PARALLEL */
+    /* Sanity check */
+    HDassert(H5P_LST_DATASET_XFER_ID_g!=(-1));
+
+    H5AC_dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    H5AC_ind_dxpl_id = H5P_DATASET_XFER_DEFAULT;
+
+    /* Get the property list objects for the IDs */
+    if (NULL == (H5AC_ind_dxpl_g = (H5P_genplist_t *)H5I_object(H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list object")
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC_term_interface
+ *
+ * Purpose:	Terminate this interface.
+ *
+ * Return:	Success:	Positive if anything was done that might
+ *				affect other interfaces; zero otherwise.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 18, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5AC_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (H5_interface_initialize_g) {
+#ifdef H5_HAVE_PARALLEL
+        if(H5AC_dxpl_id > 0 || H5AC_ind_dxpl_id > 0) {
+            /* Indicate more work to do */
+            n = 1; /* H5I */
+
+            /* Close H5AC dxpl */
+            if(H5I_dec_ref(H5AC_dxpl_id) < 0 ||
+                    H5I_dec_ref(H5AC_ind_dxpl_id) < 0)
+                H5E_clear_stack(NULL); /*ignore error*/
+            else {
+                /* Reset static IDs */
+                H5AC_dxpl_id = (-1);
+                H5AC_ind_dxpl_id = (-1);
+
+                /* Reset interface initialization flag */
+                H5_interface_initialize_g = 0;
+            } /* end else */
+        } /* end if */
+        else
+#else /* H5_HAVE_PARALLEL */
+            /* Reset static IDs */
+            H5AC_dxpl_id=(-1);
+            H5AC_ind_dxpl_id=(-1);
+#endif /* H5_HAVE_PARALLEL */
+            /* Reset interface initialization flag */
+            H5_interface_initialize_g = 0;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5AC_term_interface() */
+
+static const char * H5AC_entry_type_names[H5AC_NTYPES] =
+{
+    "B-tree nodes",
+    "symbol table nodes",
+    "local heap prefixes",
+    "local heap data blocks",
+    "global heaps",
+    "object headers",
+    "object header chunks",
+    "v2 B-tree headers",
+    "v2 B-tree internal nodes",
+    "v2 B-tree leaf nodes",
+    "fractal heap headers",
+    "fractal heap direct blocks",
+    "fractal heap indirect blocks",
+    "free space headers",
+    "free space sections",
+    "shared OH message master table",
+    "shared OH message index",
+    "superblock",
+    "test entry"	/* for testing only -- not used for actual files */
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_create
+ *
+ * Purpose:     Initialize the cache just after a file is opened.  The
+ *              SIZE_HINT is the number of cache slots desired.  If you
+ *              pass an invalid value then H5AC_NSLOTS is used.  You can
+ *              turn off caching by using 1 for the SIZE_HINT value.
+ *
+ * Return:      Success:        Number of slots actually used.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_create(const H5F_t *f,
+            H5AC_cache_config_t *config_ptr)
+{
+#ifdef H5_HAVE_PARALLEL
+    char 	 prefix[H5C__PREFIX_LEN] = "";
+    H5AC_aux_t * aux_ptr = NULL;
+#endif /* H5_HAVE_PARALLEL */
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(NULL == f->shared->cache);
+    HDassert(config_ptr != NULL) ;
+    HDcompile_assert(NELMTS(H5AC_entry_type_names) == H5AC_NTYPES);
+    HDcompile_assert(H5C__MAX_NUM_TYPE_IDS == H5AC_NTYPES);
+
+    if(H5AC_validate_config(config_ptr) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration")
+
+#ifdef H5_HAVE_PARALLEL
+    if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
+        MPI_Comm	 mpi_comm;
+        int		 mpi_rank;
+        int	 	 mpi_size;
+
+        if(MPI_COMM_NULL == (mpi_comm = H5F_mpi_get_comm(f)))
+            HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get MPI communicator")
+
+        if((mpi_rank = H5F_mpi_get_rank(f)) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi rank")
+
+        if((mpi_size = H5F_mpi_get_size(f)) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi size")
+
+        if(NULL == (aux_ptr = H5FL_CALLOC(H5AC_aux_t)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate H5AC auxilary structure.")
+
+        aux_ptr->magic = H5AC__H5AC_AUX_T_MAGIC;
+        aux_ptr->mpi_comm = mpi_comm;
+        aux_ptr->mpi_rank = mpi_rank;
+        aux_ptr->mpi_size = mpi_size;
+        aux_ptr->write_permitted = FALSE;
+        aux_ptr->dirty_bytes_threshold = H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD;
+        aux_ptr->dirty_bytes = 0;
+        aux_ptr->metadata_write_strategy = H5AC__DEFAULT_METADATA_WRITE_STRATEGY;
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+        aux_ptr->dirty_bytes_propagations = 0;
+        aux_ptr->unprotect_dirty_bytes = 0;
+        aux_ptr->unprotect_dirty_bytes_updates = 0;
+        aux_ptr->insert_dirty_bytes = 0;
+        aux_ptr->insert_dirty_bytes_updates = 0;
+        aux_ptr->move_dirty_bytes = 0;
+        aux_ptr->move_dirty_bytes_updates = 0;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+        aux_ptr->d_slist_ptr = NULL;
+        aux_ptr->d_slist_len = 0;
+        aux_ptr->c_slist_ptr = NULL;
+        aux_ptr->c_slist_len = 0;
+        aux_ptr->candidate_slist_ptr = NULL;
+        aux_ptr->candidate_slist_len = 0;
+        aux_ptr->write_done = NULL;
+        aux_ptr->sync_point_done = NULL;
+
+        sprintf(prefix, "%d:", mpi_rank);
+
+        if(mpi_rank == 0) {
+            if(NULL == (aux_ptr->d_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create dirtied entry list.")
+
+            if(NULL == (aux_ptr->c_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create cleaned entry list.")
+        } /* end if */
+
+        /* construct the candidate slist for all processes.
+         * when the distributed strategy is selected as all processes
+         * will use it in the case of a flush.
+         */
+        if(NULL == (aux_ptr->candidate_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create candidate entry list.")
+
+        if(aux_ptr != NULL) {
+            if(aux_ptr->mpi_rank == 0) {
+                f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
+                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
+                                        (H5AC_NTYPES - 1),
+                                        (const char **)H5AC_entry_type_names,
+                                        H5AC_check_if_write_permitted,
+                                        TRUE,
+                                        H5AC_log_flushed_entry,
+                                        (void *)aux_ptr);
+            } else {
+                f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
+                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
+                                        (H5AC_NTYPES - 1),
+                                        (const char **)H5AC_entry_type_names,
+                                        H5AC_check_if_write_permitted,
+                                        TRUE,
+                                        NULL,
+                                        (void *)aux_ptr);
+            }
+        } else {
+            f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
+                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
+                                        (H5AC_NTYPES - 1),
+                                        (const char **)H5AC_entry_type_names,
+                                        H5AC_check_if_write_permitted,
+                                        TRUE,
+                                        NULL,
+                                        NULL);
+        }
+    } else {
+#endif /* H5_HAVE_PARALLEL */
+        /* The default max cache size and min clean size will frequently be
+         * overwritten shortly by the subsequent set resize config call.
+         *                                             -- JRM
+         */
+        f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
+                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
+                                        (H5AC_NTYPES - 1),
+                                        (const char **)H5AC_entry_type_names,
+                                        H5AC_check_if_write_permitted,
+                                        TRUE,
+                                        NULL,
+                                        NULL);
+#ifdef H5_HAVE_PARALLEL
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+    if(NULL == f->shared->cache)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+#ifdef H5_HAVE_PARALLEL
+    if(aux_ptr != NULL) {
+        if(H5C_set_prefix(f->shared->cache, prefix) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "H5C_set_prefix() failed")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    if(H5AC_set_cache_auto_resize_config(f->shared->cache, config_ptr) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "auto resize configuration failed")
+
+done:
+#ifdef H5_HAVE_PARALLEL
+    /* if there is a failure, try to tidy up the auxilary structure */
+    if(ret_value < 0) {
+        if(aux_ptr != NULL) {
+            if(aux_ptr->d_slist_ptr != NULL)
+                H5SL_close(aux_ptr->d_slist_ptr);
+
+            if(aux_ptr->c_slist_ptr != NULL)
+                H5SL_close(aux_ptr->c_slist_ptr);
+
+            if(aux_ptr->candidate_slist_ptr != NULL)
+                H5SL_close(aux_ptr->candidate_slist_ptr);
+
+            aux_ptr->magic = 0;
+            aux_ptr = H5FL_FREE(H5AC_aux_t, aux_ptr);
+        } /* end if */
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_dest
+ *
+ * Purpose:     Flushes all data to disk and destroys the cache.
+ *              This function fails if any object are protected since the
+ *              resulting file might not be consistent.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_dest(H5F_t *f, hid_t dxpl_id)
+{
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t * aux_ptr = NULL;
+#endif /* H5_HAVE_PARALLEL */
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared->cache);
+
+#if H5AC_DUMP_STATS_ON_CLOSE
+    /* Dump debugging info */
+    H5AC_stats(f);
+#endif /* H5AC_DUMP_STATS_ON_CLOSE */
+
+#if H5AC__TRACE_FILE_ENABLED
+    if(H5AC_close_trace_file(f->shared->cache) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_close_trace_file() failed.")
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+#ifdef H5_HAVE_PARALLEL
+    aux_ptr = (struct H5AC_aux_t *)(f->shared->cache->aux_ptr);
+    if(aux_ptr)
+        /* Sanity check */
+        HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    /* Attempt to flush all entries from rank 0 & Bcast clean list to other ranks */
+    if(H5AC_flush_entries(f) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Destroy the cache */
+    if(H5C_dest(f, dxpl_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't destroy cache")
+    f->shared->cache = NULL;
+
+#ifdef H5_HAVE_PARALLEL
+    if(aux_ptr != NULL) {
+        if(aux_ptr->d_slist_ptr != NULL)
+            H5SL_close(aux_ptr->d_slist_ptr);
+        if(aux_ptr->c_slist_ptr != NULL)
+            H5SL_close(aux_ptr->c_slist_ptr);
+        if(aux_ptr->candidate_slist_ptr != NULL)
+            H5SL_close(aux_ptr->candidate_slist_ptr);
+        aux_ptr->magic = 0;
+        aux_ptr = H5FL_FREE(H5AC_aux_t, aux_ptr);
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_expunge_entry
+ *
+ * Purpose:	Expunge the target entry from the cache without writing it
+ * 		to disk even if it is dirty.  The entry must not be either
+ * 		pinned or protected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/30/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_expunge_entry(H5F_t *f,
+		   hid_t dxpl_id,
+		   const H5AC_class_t *type,
+		   haddr_t addr,
+                   unsigned flags)
+{
+    herr_t  result;
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t  ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(type->clear);
+    HDassert(type->dest);
+    HDassert(H5F_addr_defined(addr));
+
+#if H5AC__TRACE_FILE_ENABLED
+{
+    H5AC_t * cache_ptr = f->shared->cache;
+
+    /* For the expunge entry call, only the addr, and type id are really
+     * necessary in the trace file.  Write the return value to catch occult
+     * errors.
+     */
+    if ( ( cache_ptr != NULL ) &&
+         ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) &&
+         ( trace_file_ptr != NULL ) ) {
+
+        sprintf(trace, "H5AC_expunge_entry 0x%lx %d",
+	        (unsigned long)addr,
+		(int)(type->id));
+    }
+}
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    result = H5C_expunge_entry(f,
+		               dxpl_id,
+                               H5AC_dxpl_id,
+                               type,
+                               addr,
+                               flags);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
+                    "H5C_expunge_entry() failed.")
+    }
+
+done:
+
+#if H5AC__TRACE_FILE_ENABLED
+    if ( trace_file_ptr != NULL ) {
+
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_expunge_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_flush
+ *
+ * Purpose:	Flush (and possibly destroy) the metadata cache associated
+ *		with the specified file.
+ *
+ *		If the cache contains protected entries, the function will
+ *		fail, as protected entries cannot be flushed.  However
+ *		all unprotected entries should be flushed before the
+ *		function returns failure.
+ *
+ * Return:      Non-negative on success/Negative on failure if there was a
+ *              request to flush all items and something was protected.
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_flush(H5F_t *f, hid_t dxpl_id)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char 	  trace[128] = "";
+    FILE *	  trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t	  ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the flush, only the flags are really necessary in the trace file.
+     * Write the result to catch occult errors.
+     */
+    if((f != NULL) &&
+            (f->shared != NULL) &&
+            (f->shared->cache != NULL) &&
+            (H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
+            (trace_file_ptr != NULL))
+	sprintf(trace, "H5AC_flush");
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Attempt to flush all entries from rank 0 & Bcast clean list to other ranks */
+    if(H5AC_flush_entries(f) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Flush the cache */
+    if(H5C_flush_cache(f, dxpl_id, H5AC_dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush cache.")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL)
+        HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_entry_status
+ *
+ * Purpose:     Given a file address, determine whether the metadata
+ * 		cache contains an entry at that location.  If it does,
+ * 		also determine whether the entry is dirty, protected,
+ * 		pinned, etc. and return that information to the caller
+ * 		in *status_ptr.
+ *
+ * 		If the specified entry doesn't exist, set *status_ptr
+ * 		to zero.
+ *
+ * 		On error, the value of *status_ptr is undefined.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/27/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_entry_status(const H5F_t *f,
+                      haddr_t    addr,
+		      unsigned * status_ptr)
+{
+    hbool_t	in_cache;
+    hbool_t	is_dirty;
+    hbool_t	is_protected;
+    hbool_t	is_pinned;
+    size_t	entry_size;
+    unsigned	status = 0;
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((f == NULL) || (!H5F_addr_defined(addr)) || (status_ptr == NULL))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.")
+
+    if(H5C_get_entry_status(f, addr, &entry_size, &in_cache, &is_dirty,
+            &is_protected, &is_pinned) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_entry_status() failed.")
+
+    if(in_cache) {
+	status |= H5AC_ES__IN_CACHE;
+	if(is_dirty)
+	    status |= H5AC_ES__IS_DIRTY;
+	if(is_protected)
+	    status |= H5AC_ES__IS_PROTECTED;
+	if(is_pinned)
+	    status |= H5AC_ES__IS_PINNED;
+    } /* end if */
+
+    *status_ptr = status;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_get_entry_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_insert_entry
+ *
+ * Purpose:     Adds the specified thing to the cache.  The thing need not
+ *              exist on disk yet, but it must have an address and disk
+ *              space reserved.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, void *thing, unsigned int flags)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char          	trace[128] = "";
+    size_t              trace_entry_size = 0;
+    FILE *        	trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(type->flush);
+    HDassert(type->size);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(thing);
+
+    /* Check for invalid access request */
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "no write intent on file")
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the insert, only the addr, size, type id and flags are really
+     * necessary in the trace file.  Write the result to catch occult
+     * errors.
+     *
+     * Note that some data is not available right now -- put what we can
+     * in the trace buffer now, and fill in the rest at the end.
+     */
+    if ( ( f != NULL ) &&
+         ( f->shared != NULL ) &&
+         ( f->shared->cache != NULL ) &&
+         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
+         ( trace_file_ptr != NULL ) ) {
+
+        sprintf(trace, "H5AC_insert_entry 0x%lx %d 0x%x",
+	        (unsigned long)addr,
+		type->id,
+		flags);
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    /* Insert entry into metadata cache */
+    if(H5C_insert_entry(f, dxpl_id, H5AC_dxpl_id, type, addr, thing, flags) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C_insert_entry() failed")
+
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL) {
+        /* make note of the entry size */
+        trace_entry_size = ((H5C_cache_entry_t *)thing)->size;
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_aux_t *aux_ptr;
+
+    if(NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr)) {
+        /* Log the new entry */
+        if(H5AC_log_inserted_entry(f->shared->cache, (H5AC_info_t *)thing) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5AC_log_inserted_entry() failed")
+
+        /* Check if we should try to flush */
+        if(aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)
+            if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+    } /* end if */
+}
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL) {
+	HDfprintf(trace_file_ptr, "%s %d %d\n", trace,
+                  (int)trace_entry_size,
+		  (int)ret_value);
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_insert_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_mark_entry_dirty
+ *
+ * Purpose:	Mark a pinned or protected entry as dirty.  The target
+ * 		entry MUST be either pinned, protected, or both.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/16/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_mark_entry_dirty(void *thing)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char          	trace[128] = "";
+    FILE *        	trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the mark pinned or protected entry dirty call, only the addr
+     * is really necessary in the trace file.  Write the result to catch
+     * occult errors.
+     */
+    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
+            (NULL != trace_file_ptr))
+        sprintf(trace, "%s 0x%lx", FUNC,
+	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_info_t *entry_ptr = (H5AC_info_t *)thing;
+    H5C_t *cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) &&
+             (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) {
+        if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry")
+    } /* end if */
+}
+#endif /* H5_HAVE_PARALLEL */
+
+    if(H5C_mark_entry_dirty(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't mark pinned or protected entry dirty")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_mark_entry_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_move_entry
+ *
+ * Purpose:     Use this function to notify the cache that an object's
+ *              file address changed.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t new_addr)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char          	trace[128] = "";
+    FILE *        	trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t        * aux_ptr;
+#endif /* H5_HAVE_PARALLEL */
+    herr_t ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(H5F_addr_defined(old_addr));
+    HDassert(H5F_addr_defined(new_addr));
+    HDassert(H5F_addr_ne(old_addr, new_addr));
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the move call, only the old addr and new addr are really
+     * necessary in the trace file.  Include the type id so we don't have to
+     * look it up.  Also write the result to catch occult errors.
+     */
+    if ( ( f != NULL ) &&
+         ( f->shared != NULL ) &&
+         ( f->shared->cache != NULL ) &&
+         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
+         ( trace_file_ptr != NULL ) ) {
+
+        sprintf(trace, "H5AC_move_entry 0x%lx 0x%lx %d",
+	        (unsigned long)old_addr,
+		(unsigned long)new_addr,
+		(int)(type->id));
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Log moving the entry */
+    if(NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr)) {
+        if(H5AC_log_moved_entry(f, old_addr, new_addr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log moved entry")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    if(H5C_move_entry(f->shared->cache, type, old_addr, new_addr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "H5C_move_entry() failed.")
+
+#ifdef H5_HAVE_PARALLEL
+    /* Check if we should try to flush */
+    if(NULL != aux_ptr && aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold) {
+        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_move_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_pin_protected_entry()
+ *
+ * Purpose:	Pin a protected cache entry.  The entry must be protected
+ *              at the time of call, and must be unpinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/27/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_pin_protected_entry(void *thing)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char        trace[128] = "";
+    FILE *      trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the pin protected entry call, only the addr is really necessary
+     * in the trace file.  Also write the result to catch occult errors.
+     */
+    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
+            (NULL != trace_file_ptr))
+        sprintf(trace, "%s 0x%lx", FUNC,
+	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    if(H5C_pin_protected_entry(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "can't pin entry")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_pin_protected_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_protect
+ *
+ * Purpose:     If the target entry is not in the cache, load it.  If
+ *		necessary, attempt to evict one or more entries to keep
+ *		the cache within its maximum size.
+ *
+ *		Mark the target entry as protected, and return its address
+ *		to the caller.  The caller must call H5AC_unprotect() when
+ *		finished with the entry.
+ *
+ *		While it is protected, the entry may not be either evicted
+ *		or flushed -- nor may it be accessed by another call to
+ *		H5AC_protect.  Any attempt to do so will result in a failure.
+ *
+ * Return:      Success:        Ptr to the object.
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Sep  2 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5AC_protect(H5F_t *f,
+             hid_t dxpl_id,
+             const H5AC_class_t *type,
+             haddr_t addr,
+	     void *udata,
+             H5AC_protect_t rw)
+{
+    unsigned		protect_flags = H5C__NO_FLAGS_SET;
+    void *		thing = (void *)NULL;
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    size_t		trace_entry_size = 0;
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    void *		ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(type->flush);
+    HDassert(type->load);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Check for invalid access request */
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR) && rw == H5AC_WRITE)
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "no write intent on file")
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the protect call, only the addr and type id is really necessary
+     * in the trace file.  Include the size of the entry protected as a
+     * sanity check.  Also indicate whether the call was successful to
+     * catch occult errors.
+     */
+    if ( ( f != NULL ) &&
+         ( f->shared != NULL ) &&
+         ( f->shared->cache != NULL ) &&
+         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
+         ( trace_file_ptr != NULL ) ) {
+
+	const char * rw_string;
+
+        if ( rw == H5AC_WRITE ) {
+
+	    rw_string = "H5AC_WRITE";
+
+	} else if ( rw == H5AC_READ ) {
+
+	    rw_string = "H5AC_READ";
+
+	} else {
+
+	    rw_string = "???";
+	}
+
+        sprintf(trace, "H5AC_protect 0x%lx %d %s",
+	        (unsigned long)addr,
+		(int)(type->id),
+		rw_string);
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    if ( rw == H5AC_READ ) {
+
+	protect_flags |= H5C__READ_ONLY_FLAG;
+    }
+
+    thing = H5C_protect(f,
+		        dxpl_id,
+                        H5AC_dxpl_id,
+			type,
+			addr,
+			udata,
+			protect_flags);
+
+    if ( thing == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_protect() failed.")
+    }
+
+#if H5AC__TRACE_FILE_ENABLED
+    if ( trace_file_ptr != NULL ) {
+
+        /* make note of the entry size */
+        trace_entry_size = ((H5C_cache_entry_t *)thing)->size;
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    /* Set return value */
+    ret_value = thing;
+
+done:
+
+#if H5AC__TRACE_FILE_ENABLED
+    if ( trace_file_ptr != NULL ) {
+
+	HDfprintf(trace_file_ptr, "%s %d %d\n", trace,
+                  (int)trace_entry_size,
+                  (int)(ret_value != NULL));
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_resize_entry
+ *
+ * Purpose:	Resize a pinned or protected entry.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/5/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_resize_entry(void *thing, size_t new_size)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char          	trace[128] = "";
+    FILE *        	trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the resize pinned entry call, only the addr, and new_size are
+     * really necessary in the trace file. Write the result to catch
+     * occult errors.
+     */
+    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
+            (NULL != trace_file_ptr))
+        sprintf(trace, "%s 0x%lx %d", FUNC,
+	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr),
+		(int)new_size);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    if(H5C_resize_entry(thing, new_size) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry")
+
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_info_t * entry_ptr = (H5AC_info_t *)thing;
+    H5C_t *cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) {
+        if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry")
+    } /* end if */
+}
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_resize_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_unpin_entry()
+ *
+ * Purpose:	Unpin a cache entry.  The entry must be unprotected at
+ * 		the time of call, and must be pinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/11/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_unpin_entry(void *thing)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the unpin entry call, only the addr is really necessary
+     * in the trace file.  Also write the result to catch occult errors.
+     */
+    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
+            (NULL != trace_file_ptr))
+        sprintf(trace, "%s 0x%lx", FUNC,
+	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    if(H5C_unpin_entry(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "can't unpin entry")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_unpin_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_unprotect
+ *
+ * Purpose:	Undo an H5AC_protect() call -- specifically, mark the
+ *		entry as unprotected, remove it from the protected list,
+ *		and give it back to the replacement policy.
+ *
+ *		The TYPE and ADDR arguments must be the same as those in
+ *		the corresponding call to H5AC_protect() and the THING
+ *		argument must be the value returned by that call to
+ *		H5AC_protect().
+ *
+ *		If the deleted flag is TRUE, simply remove the target entry
+ *		from the cache, clear it, and free it without writing it to
+ *		disk.
+ *
+ *		This verion of the function is a complete re-write to
+ *		use the new metadata cache.  While there isn't all that
+ *		much difference between the old and new Purpose sections,
+ *		the original version is given below.
+ *
+ *		Original purpose section:
+ *
+ *		This function should be called to undo the effect of
+ *              H5AC_protect().  The TYPE and ADDR arguments should be the
+ *              same as the corresponding call to H5AC_protect() and the
+ *              THING argument should be the value returned by H5AC_protect().
+ *              If the DELETED flag is set, then this object has been deleted
+ *              from the file and should not be returned to the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Sep  2 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
+    void *thing, unsigned flags)
+{
+    hbool_t		dirtied;
+    hbool_t		deleted;
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t        * aux_ptr = NULL;
+#endif /* H5_HAVE_PARALLEL */
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    herr_t              ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(type->clear);
+    HDassert(type->flush);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(thing);
+    HDassert( ((H5AC_info_t *)thing)->addr == addr );
+    HDassert( ((H5AC_info_t *)thing)->type == type );
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the unprotect call, only the addr, type id, flags, and possible
+     * new size are really necessary in the trace file.  Write the return
+     * value to catch occult errors.
+     */
+    if ( ( f != NULL ) &&
+         ( f->shared != NULL ) &&
+         ( f->shared->cache != NULL ) &&
+         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
+         ( trace_file_ptr != NULL ) ) {
+
+        sprintf(trace, "H5AC_unprotect 0x%lx %d",
+	        (unsigned long)addr,
+		(int)(type->id));
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    dirtied = (hbool_t)( ( (flags & H5AC__DIRTIED_FLAG) == H5AC__DIRTIED_FLAG ) ||
+		( ((H5AC_info_t *)thing)->dirtied ) );
+    deleted = (hbool_t)( (flags & H5C__DELETED_FLAG) == H5C__DELETED_FLAG );
+
+    /* Check if the size changed out from underneath us, if we're not deleting
+     *  the entry.
+     */
+    if(dirtied && !deleted) {
+        size_t		curr_size = 0;
+
+        if((type->size)(f, thing, &curr_size) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
+
+        if(((H5AC_info_t *)thing)->size != curr_size)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADSIZE, FAIL, "size of entry changed")
+    } /* end if */
+
+#ifdef H5_HAVE_PARALLEL
+    if((dirtied) && (((H5AC_info_t *)thing)->is_dirty == FALSE) &&
+            (NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr))) {
+        if(H5AC_log_dirtied_entry((H5AC_info_t *)thing, addr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log dirtied entry")
+    } /* end if */
+
+    if((deleted) &&
+            (NULL != (aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr))) &&
+            (aux_ptr->mpi_rank == 0)) {
+        if(H5AC_log_deleted_entry(f->shared->cache, (H5AC_info_t *)thing, addr, flags) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5AC_log_deleted_entry() failed.")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    if(H5C_unprotect(f, dxpl_id, H5AC_dxpl_id, type, addr, thing, flags) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5C_unprotect() failed.")
+
+#ifdef H5_HAVE_PARALLEL
+    /* Check if we should try to flush */
+    if((aux_ptr != NULL) && (aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)) {
+        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %x %d\n",
+		  trace, (unsigned)flags, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    HA5C_set_sync_point_done_callback
+ *
+ * Purpose:     Set the value of the sync_point_done callback.  This 
+ *		callback is used by the parallel test code to verify
+ *		that the expected writes and only the expected writes
+ *		take place during a sync point.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/9/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_set_sync_point_done_callback(H5C_t * cache_ptr,
+    void (* sync_point_done)(int num_writes, haddr_t * written_entries_tbl))
+{
+    H5AC_aux_t * aux_ptr;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(cache_ptr && (cache_ptr->magic == H5C__H5C_T_MAGIC));
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    aux_ptr->sync_point_done = sync_point_done;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC_set_sync_point_done_callback() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    HA5C_set_write_done_callback
+ *
+ * Purpose:     Set the value of the write_done callback.  This callback
+ *              is used to improve performance of the parallel test bed
+ *              for the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/11/06
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_set_write_done_callback(H5C_t * cache_ptr,
+                             void (* write_done)(void))
+{
+    H5AC_aux_t * aux_ptr;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(cache_ptr && (cache_ptr->magic == H5C__H5C_T_MAGIC));
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    aux_ptr->write_done = write_done;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC_set_write_done_callback() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_stats
+ *
+ * Purpose:     Prints statistics about the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, October 30, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_stats(const H5F_t *f)
+{
+    herr_t		ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    /* at present, this can't fail */
+    (void)H5C_stats(f->shared->cache, H5F_OPEN_NAME(f), FALSE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_dump_cache
+ *
+ * Purpose:     Dumps a summary of the contents of the metadata cache
+ *              to stdout.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              Sunday, October 10, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_dump_cache(const H5F_t *f)
+{
+    herr_t              ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    if ( H5C_dump_cache(f->shared->cache, H5F_OPEN_NAME(f)) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_dump_cache() failed.")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_dump_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_cache_auto_resize_config
+ *
+ * Purpose:     Wrapper function for H5C_get_cache_auto_resize_config().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              3/10/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr,
+                                  H5AC_cache_config_t *config_ptr)
+{
+    herr_t result;
+    herr_t ret_value = SUCCEED;      /* Return value */
+    hbool_t evictions_enabled;
+    H5C_auto_size_ctl_t internal_config;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL )
+         ||
+#ifdef H5_HAVE_PARALLEL
+         ( ( cache_ptr->aux_ptr != NULL )
+           &&
+           ( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic
+             !=
+             H5AC__H5AC_AUX_T_MAGIC
+           )
+         )
+         ||
+#endif /* H5_HAVE_PARALLEL */
+         ( config_ptr == NULL )
+         ||
+         ( config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION )
+       )
+    {
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Bad cache_ptr or config_ptr on entry.")
+
+    }
+
+    result = H5C_get_cache_auto_resize_config((const H5C_t *)cache_ptr,
+					      &internal_config);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_get_cache_auto_resize_config() failed.")
+    }
+
+    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_resize_enabled() failed.")
+
+    if ( internal_config.rpt_fcn == NULL ) {
+
+        config_ptr->rpt_fcn_enabled = FALSE;
+
+    } else {
+
+	config_ptr->rpt_fcn_enabled = TRUE;
+    }
+
+    config_ptr->open_trace_file        = FALSE;
+    config_ptr->close_trace_file       = FALSE;
+    config_ptr->trace_file_name[0]     = '\0';
+    config_ptr->evictions_enabled      = evictions_enabled;
+    config_ptr->set_initial_size       = internal_config.set_initial_size;
+    config_ptr->initial_size           = internal_config.initial_size;
+    config_ptr->min_clean_fraction     = internal_config.min_clean_fraction;
+    config_ptr->max_size               = internal_config.max_size;
+    config_ptr->min_size               = internal_config.min_size;
+    config_ptr->epoch_length           = (long)(internal_config.epoch_length);
+    config_ptr->incr_mode              = internal_config.incr_mode;
+    config_ptr->lower_hr_threshold     = internal_config.lower_hr_threshold;
+    config_ptr->increment              = internal_config.increment;
+    config_ptr->apply_max_increment    = internal_config.apply_max_increment;
+    config_ptr->max_increment          = internal_config.max_increment;
+    config_ptr->decr_mode              = internal_config.decr_mode;
+    config_ptr->upper_hr_threshold     = internal_config.upper_hr_threshold;
+    config_ptr->flash_incr_mode        = internal_config.flash_incr_mode;
+    config_ptr->flash_multiple         = internal_config.flash_multiple;
+    config_ptr->flash_threshold        = internal_config.flash_threshold;
+    config_ptr->decrement              = internal_config.decrement;
+    config_ptr->apply_max_decrement    = internal_config.apply_max_decrement;
+    config_ptr->max_decrement          = internal_config.max_decrement;
+    config_ptr->epochs_before_eviction =
+                                  (int)(internal_config.epochs_before_eviction);
+    config_ptr->apply_empty_reserve    = internal_config.apply_empty_reserve;
+    config_ptr->empty_reserve          = internal_config.empty_reserve;
+
+#ifdef H5_HAVE_PARALLEL
+    if ( cache_ptr->aux_ptr != NULL ) {
+
+        config_ptr->dirty_bytes_threshold =
+	    ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold;
+	config_ptr->metadata_write_strategy = 
+	    ((H5AC_aux_t *)(cache_ptr->aux_ptr))->metadata_write_strategy;
+
+    } else {
+#endif /* H5_HAVE_PARALLEL */
+
+        config_ptr->dirty_bytes_threshold = 
+		H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD;
+	config_ptr->metadata_write_strategy = 
+		H5AC__DEFAULT_METADATA_WRITE_STRATEGY;
+
+#ifdef H5_HAVE_PARALLEL
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_get_cache_auto_resize_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_cache_size
+ *
+ * Purpose:     Wrapper function for H5C_get_cache_size().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              3/11/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_cache_size(H5AC_t * cache_ptr,
+                    size_t * max_size_ptr,
+                    size_t * min_clean_size_ptr,
+                    size_t * cur_size_ptr,
+                    int32_t * cur_num_entries_ptr)
+{
+    herr_t result;
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    result = H5C_get_cache_size((H5C_t *)cache_ptr,
+				max_size_ptr,
+				min_clean_size_ptr,
+				cur_size_ptr,
+				cur_num_entries_ptr);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_get_cache_size() failed.")
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_get_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_cache_hit_rate
+ *
+ * Purpose:     Wrapper function for H5C_get_cache_hit_rate().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              3/10/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, double * hit_rate_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5C_get_cache_hit_rate((H5C_t *)cache_ptr, hit_rate_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_hit_rate() failed.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_get_cache_hit_rate() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_reset_cache_hit_rate_stats()
+ *
+ * Purpose:     Wrapper function for H5C_reset_cache_hit_rate_stats().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 3/10/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr)
+{
+    herr_t result;
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    result = H5C_reset_cache_hit_rate_stats((H5C_t *)cache_ptr);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_reset_cache_hit_rate_stats() failed.")
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_reset_cache_hit_rate_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_set_cache_auto_resize_config
+ *
+ * Purpose:     Wrapper function for H5C_set_cache_auto_resize_config().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              3/10/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr,
+                                  H5AC_cache_config_t *config_ptr)
+{
+    herr_t              result;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+    H5C_auto_size_ctl_t internal_config;
+#if H5AC__TRACE_FILE_ENABLED
+    H5AC_cache_config_t trace_config = H5AC__DEFAULT_CACHE_CONFIG;
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr );
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* Make note of the new configuration.  Don't look up the trace file
+     * pointer, as that may change before we use it.
+     */
+    if ( config_ptr != NULL ) {
+
+        trace_config = *config_ptr;
+
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    if ( ( cache_ptr == NULL )
+#ifdef H5_HAVE_PARALLEL
+         ||
+         ( ( cache_ptr->aux_ptr != NULL )
+           &&
+           (
+             ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic
+             !=
+             H5AC__H5AC_AUX_T_MAGIC
+           )
+         )
+#endif /* H5_HAVE_PARALLEL */
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.")
+    }
+
+    result = H5AC_validate_config(config_ptr);
+
+    if ( result != SUCCEED ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration");
+    }
+
+    if ( config_ptr->open_trace_file ) {
+
+	FILE * file_ptr = NULL;
+
+	if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) {
+
+	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+			"H5C_get_trace_file_ptr() failed.")
+	}
+
+	if ( ( ! ( config_ptr->close_trace_file ) ) &&
+	     ( file_ptr != NULL ) ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                        "Trace file already open.")
+        }
+    }
+
+    if ( config_ptr->close_trace_file ) {
+
+	if ( H5AC_close_trace_file(cache_ptr) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "H5AC_close_trace_file() failed.")
+	}
+    }
+
+    if ( config_ptr->open_trace_file ) {
+
+        if ( H5AC_open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0 )
+	{
+
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                        "H5AC_open_trace_file() failed.")
+	}
+    }
+
+    if(H5AC_ext_config_2_int_config(config_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_ext_config_2_int_config() failed.")
+
+    if(H5C_set_cache_auto_resize_config(cache_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_cache_auto_resize_config() failed.")
+
+    if(H5C_set_evictions_enabled(cache_ptr, config_ptr->evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_evictions_enabled() failed.")
+
+#ifdef H5_HAVE_PARALLEL
+    if ( cache_ptr->aux_ptr != NULL ) {
+
+        ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold =
+            config_ptr->dirty_bytes_threshold;
+
+        ((H5AC_aux_t *)(cache_ptr->aux_ptr))->metadata_write_strategy =
+            config_ptr->metadata_write_strategy;
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the set cache auto resize config call, only the contents
+     * of the config is necessary in the trace file. Write the return
+     * value to catch occult errors.
+     */
+    if ( ( cache_ptr != NULL ) &&
+         ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) &&
+         ( trace_file_ptr != NULL ) ) {
+
+	HDfprintf(trace_file_ptr,
+                  "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %f %f %d %d %d %f %f %d %d %d %d %f %d %d %d\n",
+		  "H5AC_set_cache_auto_resize_config",
+		  trace_config.version,
+		  (int)(trace_config.rpt_fcn_enabled),
+		  (int)(trace_config.open_trace_file),
+		  (int)(trace_config.close_trace_file),
+		  trace_config.trace_file_name,
+		  (int)(trace_config.evictions_enabled),
+		  (int)(trace_config.set_initial_size),
+		  (int)(trace_config.initial_size),
+		  trace_config.min_clean_fraction,
+		  (int)(trace_config.max_size),
+		  (int)(trace_config.min_size),
+		  trace_config.epoch_length,
+		  (int)(trace_config.incr_mode),
+		  trace_config.lower_hr_threshold,
+		  trace_config.increment,
+		  (int)(trace_config.flash_incr_mode),
+		  trace_config.flash_multiple,
+		  trace_config.flash_threshold,
+		  (int)(trace_config.apply_max_increment),
+		  (int)(trace_config.max_increment),
+		  (int)(trace_config.decr_mode),
+		  trace_config.upper_hr_threshold,
+		  trace_config.decrement,
+		  (int)(trace_config.apply_max_decrement),
+		  (int)(trace_config.max_decrement),
+		  trace_config.epochs_before_eviction,
+		  (int)(trace_config.apply_empty_reserve),
+		  trace_config.empty_reserve,
+		  trace_config.dirty_bytes_threshold,
+		  trace_config.metadata_write_strategy,
+		  (int)ret_value);
+    }
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_set_cache_auto_resize_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_validate_config()
+ *
+ * Purpose:     Run a sanity check on the contents of the supplied
+ *		instance of H5AC_cache_config_t.
+ *
+ *              Do nothing and return SUCCEED if no errors are detected,
+ *              and flag an error and return FAIL otherwise.
+ *
+ *		At present, this function operates by packing the data
+ *		from the instance of H5AC_cache_config_t into an instance
+ *		of H5C_auto_size_ctl_t, and then calling
+ *		H5C_validate_resize_config().  As H5AC_cache_config_t and
+ *		H5C_auto_size_ctl_t diverge, we may have to change this.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/6/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_validate_config(H5AC_cache_config_t * config_ptr)
+{
+    H5C_auto_size_ctl_t internal_config;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
+
+    if(config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.")
+
+    if((config_ptr->rpt_fcn_enabled != TRUE) && (config_ptr->rpt_fcn_enabled != FALSE))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->rpt_fcn_enabled must be either TRUE or FALSE.")
+
+    if((config_ptr->open_trace_file != TRUE) && (config_ptr->open_trace_file != FALSE))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->open_trace_file must be either TRUE or FALSE.")
+
+    if((config_ptr->close_trace_file != TRUE) && (config_ptr->close_trace_file != FALSE))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->close_trace_file must be either TRUE or FALSE.")
+
+    /* don't bother to test trace_file_name unless open_trace_file is TRUE */
+    if(config_ptr->open_trace_file) {
+        size_t	        name_len;
+
+	/* Can't really test the trace_file_name field without trying to
+	 * open the file, so we will content ourselves with a couple of
+	 * sanity checks on the length of the file name.
+	 */
+	name_len = HDstrlen(config_ptr->trace_file_name);
+
+	if(name_len == 0) {
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name is empty.")
+        } else if(name_len > H5AC__MAX_TRACE_FILE_NAME_LEN) {
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name too long.")
+	}
+    }
+
+    if ( ( config_ptr->evictions_enabled != TRUE ) &&
+         ( config_ptr->evictions_enabled != FALSE ) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+            "config_ptr->evictions_enabled must be either TRUE or FALSE.")
+    }
+
+    if ( ( config_ptr->evictions_enabled == FALSE ) &&
+	 ( ( config_ptr->incr_mode != H5C_incr__off ) ||
+	   ( config_ptr->flash_incr_mode != H5C_flash_incr__off ) ||
+	   ( config_ptr->decr_mode != H5C_decr__off ) ) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                    "Can't disable evictions while auto-resize is enabled.")
+    }
+
+    if(config_ptr->dirty_bytes_threshold < H5AC__MIN_DIRTY_BYTES_THRESHOLD) {
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too small.")
+    } else if(config_ptr->dirty_bytes_threshold > H5AC__MAX_DIRTY_BYTES_THRESHOLD) {
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too big.")
+    }
+
+    if((config_ptr->metadata_write_strategy != H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY) &&
+         (config_ptr->metadata_write_strategy != H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->metadata_write_strategy out of range.")
+
+    if(H5AC_ext_config_2_int_config(config_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_ext_config_2_int_config() failed.")
+
+    if(H5C_validate_resize_config(&internal_config, H5C_RESIZE_CFG__VALIDATE_ALL) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error(s) in new config.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_validate_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_close_trace_file()
+ *
+ * Purpose:     If a trace file is open, stop logging calls to the cache,
+ *              and close the file.
+ *
+ *              Note that the function does nothing if there is no trace
+ *              file.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_close_trace_file(H5AC_t * cache_ptr)
+
+{
+    herr_t   ret_value = SUCCEED;    /* Return value */
+    FILE *   trace_file_ptr = NULL;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( cache_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.")
+    }
+
+    if ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		    "H5C_get_trace_file_ptr() failed.")
+    }
+
+    if ( trace_file_ptr != NULL ) {
+
+        if ( H5C_set_trace_file_ptr(cache_ptr, NULL) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "H5C_set_trace_file_ptr() failed.")
+         }
+
+        if ( HDfclose(trace_file_ptr) != 0 ) {
+
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, \
+                        "can't close metadata cache trace file")
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_close_trace_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_open_trace_file()
+ *
+ * Purpose:     Open a trace file, and start logging calls to the cache.
+ *
+ * 		This logging is done at the H5C level, and will only take
+ * 		place if H5C_TRACE_FILE_ENABLED (defined in H5Cprivate.h)
+ * 		is TRUE.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/1/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_open_trace_file(H5AC_t * cache_ptr,
+		     const char * trace_file_name)
+{
+    herr_t   ret_value = SUCCEED;    /* Return value */
+    char     file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 2];
+    FILE *   file_ptr = NULL;
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t * aux_ptr = NULL;
+#endif /* H5_HAVE_PARALLEL */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+
+    if ( cache_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr NULL on entry.")
+    }
+
+    if ( trace_file_name == NULL ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+		    "NULL trace_file_name on entry.")
+    }
+
+    if ( HDstrlen(trace_file_name) > H5AC__MAX_TRACE_FILE_NAME_LEN ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trace file name too long.")
+    }
+
+    if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		    "H5C_get_trace_file_ptr() failed.")
+    }
+
+    if ( file_ptr != NULL ) {
+
+        HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "trace file already open.")
+    }
+
+#ifdef H5_HAVE_PARALLEL
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    if ( cache_ptr->aux_ptr == NULL ) {
+
+        sprintf(file_name, "%s", trace_file_name);
+
+    } else {
+
+	if ( aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr->magic.")
+	}
+
+        sprintf(file_name, "%s.%d", trace_file_name, aux_ptr->mpi_rank);
+
+    }
+
+    if ( HDstrlen(file_name) >
+         H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		    "cooked trace file name too long.")
+    }
+
+#else /* H5_HAVE_PARALLEL */
+
+    HDsnprintf(file_name, 
+               (size_t)(H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1), 
+               "%s", trace_file_name);
+
+#endif /* H5_HAVE_PARALLEL */
+
+    if ( (file_ptr = HDfopen(file_name, "w")) == NULL ) {
+
+	/* trace file open failed */
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.")
+    }
+
+    HDfprintf(file_ptr, "### HDF5 metadata cache trace file ###\n");
+
+    if ( H5C_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		    "H5C_set_trace_file_ptr() failed.")
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_open_trace_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_add_candidate()
+ *
+ * Purpose:     Add the supplied metadata entry address to the candidate
+ *		list.  Verify that each entry added does not appear in 
+ *		the list prior to its insertion.
+ *
+ *		This function is intended for used in constructing list
+ *		of entried to be flushed during sync points.  It shouldn't
+ *		be called anywhere else.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_add_candidate(H5AC_t * cache_ptr,
+                   haddr_t addr)
+{
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy ==
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+    HDassert( aux_ptr->candidate_slist_ptr != NULL );
+
+    /* If the supplied address appears in the candidate list, scream and die. */
+    if(NULL != H5SL_search(aux_ptr->candidate_slist_ptr, (void *)(&addr)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry already in candidate slist.")
+
+    /* otherwise, construct an entry for the supplied address, and insert
+     * it into the candidate slist.
+     */
+    if(NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "Can't allocate candidate slist entry .")
+
+    slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
+    slist_entry_ptr->addr  = addr;
+
+    if(H5SL_insert(aux_ptr->candidate_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
+
+    aux_ptr->candidate_slist_len += 1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_add_candidate() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*************************************************************************/
+/**************************** Private Functions: *************************/
+/*************************************************************************/
+
+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_broadcast_candidate_list()
+ *
+ * Purpose:     Broadcast the contents of the process 0 candidate entry
+ *		slist.  In passing, also remove all entries from said
+ *		list.  As the application of this will be handled by 
+ *		the same functions on all processes, construct and 
+ *		return a copy of the list in the same format as that
+ *		received by the other processes.  Note that if this
+ *		copy is returned in *haddr_buf_ptr_ptr, the caller 
+ *		must free it.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_broadcast_candidate_list(H5AC_t * cache_ptr,
+                              int * num_entries_ptr,
+                              haddr_t ** haddr_buf_ptr_ptr)
+{
+    hbool_t		 success = FALSE;
+    H5AC_aux_t         * aux_ptr = NULL;
+    haddr_t            * haddr_buf_ptr = NULL;
+    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
+    size_t		 buf_size = 0;
+    int                  mpi_result;
+    int			 chk_num_entries = 0;
+    int			 num_entries = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->mpi_rank == 0 );
+    HDassert( aux_ptr->metadata_write_strategy ==
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+    HDassert( aux_ptr->candidate_slist_ptr != NULL );
+    HDassert( H5SL_count(aux_ptr->candidate_slist_ptr) ==
+		    (size_t)(aux_ptr->candidate_slist_len) );
+    HDassert( num_entries_ptr != NULL );
+    HDassert( *num_entries_ptr == 0 );
+    HDassert( haddr_buf_ptr_ptr != NULL );
+    HDassert( *haddr_buf_ptr_ptr == NULL );
+
+    /* First broadcast the number of entries in the list so that the
+     * receivers can set up buffers to receive them.  If there aren't
+     * any, we are done.
+     */
+    num_entries = aux_ptr->candidate_slist_len;
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
+
+    if(num_entries > 0) {
+        /* convert the candidate list into the format we
+         * are used to receiving from process 0, and also load it 
+         * into a buffer for transmission.
+         */
+        if(H5AC_copy_candidate_list_to_buffer(cache_ptr, &chk_num_entries,
+                &haddr_buf_ptr, &buf_size, &MPI_Offset_buf_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
+
+        HDassert( chk_num_entries == num_entries );
+        HDassert( haddr_buf_ptr != NULL );
+        HDassert( MPI_Offset_buf_ptr != NULL );
+        HDassert( aux_ptr->candidate_slist_len == 0 );
+
+        /* Now broadcast the list of candidate entries -- if there is one.
+         *
+         * The peculiar structure of the following call to MPI_Bcast is
+         * due to MPI's (?) failure to believe in the MPI_Offset type.
+         * Thus the element type is MPI_BYTE, with size equal to the
+         * buf_size computed above.
+         */
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
+    } /* end if */
+
+    success = TRUE;
+
+done:
+    if(MPI_Offset_buf_ptr != NULL)
+        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
+
+    if(success) {
+        /* Pass the number of entries and the buffer pointer 
+         * back to the caller.  Do this so that we can use the same code
+         * to apply the candidate list to all the processes.
+         */
+        *num_entries_ptr = num_entries;
+        *haddr_buf_ptr_ptr = haddr_buf_ptr;
+    } else if(haddr_buf_ptr != NULL) {
+        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_broadcast_candidate_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_broadcast_clean_list()
+ *
+ * Purpose:     Broadcast the contents of the process 0 cleaned entry
+ *		slist.  In passing, also remove all entries from said
+ *		list, and also remove any matching entries from the dirtied
+ *		slist.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_broadcast_clean_list(H5AC_t * cache_ptr)
+{
+    herr_t               ret_value = SUCCEED;    /* Return value */
+    haddr_t		 addr;
+    haddr_t	       * addr_buf_ptr = NULL;
+    H5AC_aux_t         * aux_ptr = NULL;
+    H5SL_node_t        * slist_node_ptr = NULL;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    MPI_Offset         * buf_ptr = NULL;
+    size_t		 buf_size;
+    int                  i = 0;
+    int                  mpi_result;
+    int			 num_entries = 0;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->mpi_rank == 0 );
+    HDassert( aux_ptr->c_slist_ptr != NULL );
+    HDassert( H5SL_count(aux_ptr->c_slist_ptr) ==
+		    (size_t)(aux_ptr->c_slist_len) );
+
+
+    /* First broadcast the number of entries in the list so that the
+     * receives can set up a buffer to receive them.  If there aren't
+     * any, we are done.
+     */
+    num_entries = aux_ptr->c_slist_len;
+
+    mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm);
+
+    if ( mpi_result != MPI_SUCCESS ) {
+
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
+
+    }
+
+    if ( num_entries > 0 )
+    {
+        /* allocate a buffer to store the list of entry base addresses in */
+
+        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
+
+        buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size);
+
+        if ( buf_ptr == NULL ) {
+
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                        "memory allocation failed for clean entry buffer")
+        }
+
+        /* if the sync_point_done callback is defined, allocate the
+         * addr buffer as well.
+         */
+        if ( aux_ptr->sync_point_done != NULL ) {
+
+            addr_buf_ptr = (haddr_t *)H5MM_malloc((size_t)num_entries * sizeof(haddr_t));
+
+            if ( addr_buf_ptr == NULL ) {
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                            "memory allocation failed for addr buffer")
+            }
+        }
+
+
+        /* now load the entry base addresses into the buffer, emptying the
+         * cleaned entry list in passing
+         */
+
+        while ( NULL != (slist_node_ptr = H5SL_first(aux_ptr->c_slist_ptr) ) )
+        {
+            slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_item(slist_node_ptr);
+
+            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+
+            HDassert( i < num_entries );
+
+            addr = slist_entry_ptr->addr;
+
+            if ( addr_buf_ptr != NULL ) {
+
+                addr_buf_ptr[i] = addr;
+            }
+
+            if ( H5FD_mpi_haddr_to_MPIOff(addr, &(buf_ptr[i])) < 0 ) {
+
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \
+                            "can't convert from haddr to MPI off")
+            }
+
+            i++;
+
+            /* now remove the entry from the cleaned entry list */
+            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))
+                 != slist_entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
+                            "Can't delete entry from cleaned entry slist.")
+            }
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->c_slist_len -= 1;
+
+            HDassert( aux_ptr->c_slist_len >= 0 );
+
+            /* and also remove the matching entry from the dirtied list
+             * if it exists.
+             */
+            if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL) {
+                HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
+                HDassert( slist_entry_ptr->addr == addr );
+
+                if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
+
+                slist_entry_ptr->magic = 0;
+                slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+                aux_ptr->d_slist_len -= 1;
+
+                HDassert( aux_ptr->d_slist_len >= 0 );
+            } /* end if */
+        } /* while */
+
+
+        /* Now broadcast the list of cleaned entries -- if there is one.
+         *
+         * The peculiar structure of the following call to MPI_Bcast is
+         * due to MPI's (?) failure to believe in the MPI_Offset type.
+         * Thus the element type is MPI_BYTE, with size equal to the
+         * buf_size computed above.
+         */
+
+        mpi_result = MPI_Bcast((void *)buf_ptr, (int)buf_size, MPI_BYTE, 0,
+                               aux_ptr->mpi_comm);
+
+        if ( mpi_result != MPI_SUCCESS ) {
+
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
+        }
+    }
+
+    if(aux_ptr->sync_point_done != NULL)
+        (aux_ptr->sync_point_done)(num_entries, addr_buf_ptr);
+
+done:
+    if(buf_ptr != NULL)
+        buf_ptr = (MPI_Offset *)H5MM_xfree((void *)buf_ptr);
+    if(addr_buf_ptr != NULL)
+        addr_buf_ptr = (haddr_t *)H5MM_xfree((void *)addr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_broadcast_clean_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_check_if_write_permitted
+ *
+ * Purpose:     Determine if a write is permitted under the current
+ *		circumstances, and set *write_permitted_ptr accordingly.
+ *		As a general rule it is, but when we are running in parallel
+ *		mode with collective I/O, we must ensure that a read cannot
+ *		cause a write.
+ *
+ *		In the event of failure, the value of *write_permitted_ptr
+ *		is undefined.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 5/15/04
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_check_if_write_permitted(const H5F_t *f,
+                              hid_t H5_ATTR_UNUSED dxpl_id,
+                              hbool_t * write_permitted_ptr)
+#else /* H5_HAVE_PARALLEL */
+static herr_t
+H5AC_check_if_write_permitted(const H5F_t H5_ATTR_UNUSED * f,
+                              hid_t H5_ATTR_UNUSED dxpl_id,
+                              hbool_t * write_permitted_ptr)
+#endif /* H5_HAVE_PARALLEL */
+{
+    hbool_t		write_permitted = TRUE;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t *	aux_ptr = NULL;
+#endif /* H5_HAVE_PARALLEL */
+
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef H5_HAVE_PARALLEL
+    HDassert( f != NULL );
+    HDassert( f->shared != NULL );
+    HDassert( f->shared->cache != NULL );
+
+    aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr);
+
+    if ( aux_ptr != NULL ) {
+
+        HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+        if ( ( aux_ptr->mpi_rank == 0 ) ||
+             ( aux_ptr->metadata_write_strategy ==
+               H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED ) ) {
+
+	    write_permitted = aux_ptr->write_permitted;
+
+        } else {
+
+	    write_permitted = FALSE;
+	}
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+    *write_permitted_ptr = write_permitted;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_check_if_write_permitted() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_construct_candidate_list()
+ *
+ * Purpose:     In the parallel case when the metadata_write_strategy is 
+ *		H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, process 0 uses
+ *		this function to construct the list of cache entries to 
+ *		be flushed.  This list is then propagated to the other 
+ *		caches, and then flushed in a distributed fashion.
+ *
+ *		The sync_point_op parameter is used to determine the extent
+ *		of the flush.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_construct_candidate_list(H5AC_t * cache_ptr,
+                              H5AC_aux_t * aux_ptr,
+                              int sync_point_op)
+{
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy ==
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE ) ||
+              ( aux_ptr->mpi_rank == 0 ) );
+    HDassert( aux_ptr->d_slist_ptr != NULL );
+    HDassert( aux_ptr->c_slist_ptr != NULL );
+    HDassert( aux_ptr->c_slist_len == 0 );
+    HDassert( aux_ptr->candidate_slist_ptr != NULL );
+    HDassert( aux_ptr->candidate_slist_len == 0 );
+    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN ) ||
+              ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE ) );
+
+    switch(sync_point_op) {
+	case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+            if(H5C_construct_candidate_list__min_clean((H5C_t *)cache_ptr) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__min_clean() failed.")
+	    break;
+
+	case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+            if(H5C_construct_candidate_list__clean_cache((H5C_t *)cache_ptr) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__clean_cache() failed.")
+	    break;
+
+        default:
+	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown sync point operation.")
+	    break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_construct_candidate_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_copy_candidate_list_to_buffer
+ *
+ * Purpose:     Allocate buffer(s) and copy the contents of the candidate
+ *		entry slist into it (them).  In passing, remove all 
+ *		entries from the candidate slist.  Note that the 
+ *		candidate slist must not be empty.
+ *
+ *		If MPI_Offset_buf_ptr_ptr is not NULL, allocate a buffer
+ *		of MPI_Offset, copy the contents of the candidate
+ *		entry list into it with the appropriate conversions, 
+ *		and return the base address of the buffer in 
+ *		*MPI_Offset_buf_ptr.  Note that this is the buffer
+ *		used by process 0 to transmit the list of entries to 
+ *		be flushed to all other processes (in this file group).
+ *
+ *		Similarly, allocate a buffer of haddr_t, load the contents
+ *		of the candidate list into this buffer, and return its 
+ *		base address in *haddr_buf_ptr_ptr.  Note that this 
+ *		latter buffer is constructed unconditionally.  
+ *
+ *		In passing, also remove all entries from the candidate
+ *		entry slist.
+ *
+ * Return:	Return SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 4/19/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_copy_candidate_list_to_buffer(H5AC_t * cache_ptr,
+                                   int * num_entries_ptr,
+                                   haddr_t ** haddr_buf_ptr_ptr,
+                                   size_t * MPI_Offset_buf_size_ptr,
+                                   MPI_Offset ** MPI_Offset_buf_ptr_ptr)
+{
+    herr_t               ret_value = SUCCEED;    /* Return value */
+    hbool_t		 success = FALSE;
+    haddr_t		 addr;
+    H5AC_aux_t         * aux_ptr = NULL;
+    H5SL_node_t        * slist_node_ptr = NULL;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
+    haddr_t            * haddr_buf_ptr = NULL;
+    size_t		 buf_size;
+    int                  i = 0;
+    int			 num_entries = 0;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy ==
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+    HDassert( aux_ptr->candidate_slist_ptr != NULL );
+    HDassert( H5SL_count(aux_ptr->candidate_slist_ptr) ==
+		    (size_t)(aux_ptr->candidate_slist_len) );
+    HDassert( aux_ptr->candidate_slist_len > 0 );
+    HDassert( num_entries_ptr != NULL );
+    HDassert( *num_entries_ptr == 0 );
+    HDassert( haddr_buf_ptr_ptr != NULL );
+    HDassert( *haddr_buf_ptr_ptr == NULL );
+
+    num_entries = aux_ptr->candidate_slist_len;
+
+    /* allocate a buffer(s) to store the list of candidate entry 
+     * base addresses in 
+     */
+    if(MPI_Offset_buf_ptr_ptr != NULL) {
+        HDassert( MPI_Offset_buf_size_ptr != NULL );
+
+        /* allocate a buffer of MPI_Offset */
+        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
+        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for MPI_Offset buffer")
+    } /* end if */
+
+    /* allocate a buffer of haddr_t */
+    if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
+
+    /* now load the entry base addresses into the buffer, emptying the
+     * candidate entry list in passing
+     */
+    while(NULL != (slist_node_ptr = H5SL_first(aux_ptr->candidate_slist_ptr))) {
+        slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_item(slist_node_ptr);
+
+        HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+        HDassert( i < num_entries );
+
+        addr = slist_entry_ptr->addr;
+        haddr_buf_ptr[i] = addr;
+        if(MPI_Offset_buf_ptr != NULL) {
+            if(H5FD_mpi_haddr_to_MPIOff(addr, &(MPI_Offset_buf_ptr[i])) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
+        } /* end if */
+
+        i++;
+
+        /* now remove the entry from the cleaned entry list */
+        if(H5SL_remove(aux_ptr->candidate_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from candidate entry slist.")
+
+        slist_entry_ptr->magic = 0;
+        slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+        aux_ptr->candidate_slist_len -= 1;
+
+        HDassert( aux_ptr->candidate_slist_len >= 0 );
+    } /* while */
+    HDassert( aux_ptr->candidate_slist_len == 0 );
+
+    success = TRUE;
+
+done:
+    if(success) {
+        /* Pass the number of entries and the buffer pointer 
+         * back to the caller.
+         */
+        *num_entries_ptr = num_entries;
+        *haddr_buf_ptr_ptr = haddr_buf_ptr;
+
+        if(MPI_Offset_buf_ptr_ptr != NULL) {
+            HDassert( MPI_Offset_buf_ptr != NULL);
+	    *MPI_Offset_buf_size_ptr = buf_size;
+	    *MPI_Offset_buf_ptr_ptr = MPI_Offset_buf_ptr;
+        } /* end if */
+    } /* end if */
+    else {
+        if(MPI_Offset_buf_ptr != NULL)
+            MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
+        if(haddr_buf_ptr != NULL)
+            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_copy_candidate_list_to_buffer() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_ext_config_2_int_config()
+ *
+ * Purpose:     Utility function to translate an instance of
+ *		H5AC_cache_config_t to an instance of H5C_auto_size_ctl_t.
+ *
+ *		Places translation in *int_conf_ptr and returns SUCCEED
+ *		if successful.  Returns FAIL on failure.
+ *
+ *		Does only minimal sanity checking.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/26/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
+                             H5C_auto_size_ctl_t * int_conf_ptr)
+{
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( ext_conf_ptr == NULL ) ||
+         ( ext_conf_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) ||
+         ( int_conf_ptr == NULL ) ) {
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Bad ext_conf_ptr or inf_conf_ptr on entry.")
+    }
+
+    int_conf_ptr->version                = H5C__CURR_AUTO_SIZE_CTL_VER;
+
+    if ( ext_conf_ptr->rpt_fcn_enabled ) {
+
+        int_conf_ptr->rpt_fcn            = H5C_def_auto_resize_rpt_fcn;
+
+    } else {
+
+        int_conf_ptr->rpt_fcn            = NULL;
+    }
+
+    int_conf_ptr->set_initial_size       = ext_conf_ptr->set_initial_size;
+    int_conf_ptr->initial_size           = ext_conf_ptr->initial_size;
+    int_conf_ptr->min_clean_fraction     = ext_conf_ptr->min_clean_fraction;
+    int_conf_ptr->max_size               = ext_conf_ptr->max_size;
+    int_conf_ptr->min_size               = ext_conf_ptr->min_size;
+    int_conf_ptr->epoch_length           = (int64_t)(ext_conf_ptr->epoch_length);
+
+    int_conf_ptr->incr_mode              = ext_conf_ptr->incr_mode;
+    int_conf_ptr->lower_hr_threshold     = ext_conf_ptr->lower_hr_threshold;
+    int_conf_ptr->increment              = ext_conf_ptr->increment;
+    int_conf_ptr->apply_max_increment    = ext_conf_ptr->apply_max_increment;
+    int_conf_ptr->max_increment          = ext_conf_ptr->max_increment;
+    int_conf_ptr->flash_incr_mode        = ext_conf_ptr->flash_incr_mode;
+    int_conf_ptr->flash_multiple         = ext_conf_ptr->flash_multiple;
+    int_conf_ptr->flash_threshold        = ext_conf_ptr->flash_threshold;
+
+    int_conf_ptr->decr_mode              = ext_conf_ptr->decr_mode;
+    int_conf_ptr->upper_hr_threshold     = ext_conf_ptr->upper_hr_threshold;
+    int_conf_ptr->decrement              = ext_conf_ptr->decrement;
+    int_conf_ptr->apply_max_decrement    = ext_conf_ptr->apply_max_decrement;
+    int_conf_ptr->max_decrement          = ext_conf_ptr->max_decrement;
+    int_conf_ptr->epochs_before_eviction = (int32_t)(ext_conf_ptr->epochs_before_eviction);
+    int_conf_ptr->apply_empty_reserve    = ext_conf_ptr->apply_empty_reserve;
+    int_conf_ptr->empty_reserve          = ext_conf_ptr->empty_reserve;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_ext_config_2_int_config() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_log_deleted_entry()
+ *
+ * Purpose:     Log an entry for which H5C__DELETED_FLAG has been set.
+ *
+ *		If mpi_rank is 0, we must make sure that the entry doesn't
+ *		appear in the cleaned or dirty entry lists.  Otherwise,
+ *		we have nothing to do.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_log_deleted_entry(H5AC_t * cache_ptr,
+                       H5AC_info_t * entry_ptr,
+                       haddr_t addr,
+                       unsigned int flags)
+{
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    HDassert( entry_ptr != NULL );
+    HDassert( entry_ptr->addr == addr );
+
+    HDassert( (flags & H5C__DELETED_FLAG) != 0 );
+
+    if(aux_ptr->mpi_rank == 0) {
+        HDassert( aux_ptr->d_slist_ptr != NULL );
+        HDassert( aux_ptr->c_slist_ptr != NULL );
+
+        /* if the entry appears in the dirtied entry slist, remove it. */
+        if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL) {
+            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert(slist_entry_ptr->addr == addr);
+
+            if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->d_slist_len -= 1;
+
+            HDassert( aux_ptr->d_slist_len >= 0 );
+        } /* end if */
+
+        /* if the entry appears in the cleaned entry slist, remove it. */
+        if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr))) != NULL) {
+            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert(slist_entry_ptr->addr == addr);
+
+            if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from cleaned entry slist.")
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->c_slist_len -= 1;
+
+            HDassert( aux_ptr->c_slist_len >= 0 );
+        } /* end if */
+    } /* if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_log_deleted_entry() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_log_dirtied_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a newly dirtied entry.
+ *
+ *		If mpi_rank isnt 0, this simply means adding the size
+ *		of the entries to the dirty_bytes count.
+ *
+ *		If mpi_rank is 0, we must first check to see if the entry
+ *		appears in the dirty entries slist.  If it is, do nothing.
+ *		If it isn't, add the size to th dirty_bytes count, add the
+ *		entry to the dirty entries slist, and remove it from the
+ *		cleaned list (if it is present there).
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr,
+                       haddr_t addr)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( entry_ptr );
+    HDassert( entry_ptr->addr == addr );
+    HDassert( entry_ptr->is_dirty == FALSE );
+
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    if ( aux_ptr->mpi_rank == 0 ) {
+        H5AC_slist_entry_t * slist_entry_ptr;
+
+        HDassert( aux_ptr->d_slist_ptr != NULL );
+        HDassert( aux_ptr->c_slist_ptr != NULL );
+
+        if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) {
+
+            /* insert the address of the entry in the dirty entry list, and
+             * add its size to the dirty_bytes count.
+             */
+            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                            "Can't allocate dirty slist entry .")
+            }
+
+            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
+            slist_entry_ptr->addr  = addr;
+
+            if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr,
+                             &(slist_entry_ptr->addr)) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
+                            "can't insert entry into dirty entry slist.")
+            }
+
+            aux_ptr->d_slist_len += 1;
+            aux_ptr->dirty_bytes += entry_ptr->size;
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+	    aux_ptr->unprotect_dirty_bytes += entry_ptr->size;
+	    aux_ptr->unprotect_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+        }
+
+        if(H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL) {
+            /* the entry is dirty.  If it exists on the cleaned entries list,
+             * remove it.
+             */
+            if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr))) != NULL) {
+                HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+                HDassert(slist_entry_ptr->addr == addr);
+
+                if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from clean entry slist.")
+
+                slist_entry_ptr->magic = 0;
+                slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+                aux_ptr->c_slist_len -= 1;
+
+                HDassert( aux_ptr->c_slist_len >= 0 );
+            } /* end if */
+        } /* end if */
+    } else {
+
+        aux_ptr->dirty_bytes += entry_ptr->size;
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+        aux_ptr->unprotect_dirty_bytes += entry_size;
+        aux_ptr->unprotect_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_log_dirtied_entry() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_log_flushed_entry()
+ *
+ * Purpose:     Update the clean entry slist for the flush of an entry --
+ *		specifically, if the entry has been cleared, remove it
+ * 		from both the cleaned and dirtied lists if it is present.
+ *		Otherwise, if the entry was dirty, insert the indicated
+ *		entry address in the clean slist if it isn't there already.
+ *
+ *		This function is only used in PHDF5, and should only
+ *		be called for the process with mpi rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_log_flushed_entry(H5C_t * cache_ptr,
+                       haddr_t addr,
+                       hbool_t was_dirty,
+                       unsigned flags,
+                       int H5_ATTR_UNUSED type_id)
+{
+    herr_t               ret_value = SUCCEED;    /* Return value */
+    hbool_t		 cleared;
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->mpi_rank == 0 );
+    HDassert( aux_ptr->c_slist_ptr != NULL );
+
+    cleared = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0 );
+
+    if ( cleared ) {
+
+        /* If the entry has been cleared, must remove it from both the
+         * cleaned list and the dirtied list.
+         */
+
+        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
+				H5SL_search(aux_ptr->c_slist_ptr,
+                                            (void *)(&addr))) != NULL ) {
+
+            HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert( slist_entry_ptr->addr == addr );
+
+            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))
+                 != slist_entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
+                            "Can't delete entry from clean entry slist.")
+            }
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->c_slist_len -= 1;
+
+            HDassert( aux_ptr->c_slist_len >= 0 );
+        }
+
+        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
+                 H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL ) {
+
+            HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert( slist_entry_ptr->addr == addr );
+
+            if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr))
+                 != slist_entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
+                            "Can't delete entry from dirty entry slist.")
+            }
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->d_slist_len -= 1;
+
+            HDassert( aux_ptr->d_slist_len >= 0 );
+        }
+    } else if ( was_dirty ) {
+
+        if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) == NULL ) {
+
+            /* insert the address of the entry in the clean entry list. */
+
+            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                            "Can't allocate clean slist entry .")
+            }
+
+            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
+            slist_entry_ptr->addr  = addr;
+
+            if ( H5SL_insert(aux_ptr->c_slist_ptr, slist_entry_ptr,
+                             &(slist_entry_ptr->addr)) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
+                            "can't insert entry into clean entry slist.")
+            }
+
+            aux_ptr->c_slist_len += 1;
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5AC_log_flushed_entry() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_log_inserted_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a newly inserted entry.
+ *
+ *		If mpi_rank isnt 0, this simply means adding the size
+ *		of the entry to the dirty_bytes count.
+ *
+ *		If mpi_rank is 0, we must also add the entry to the
+ *		dirty entries slist.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/30/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_log_inserted_entry(H5AC_t * cache_ptr,
+                        H5AC_info_t * entry_ptr)
+{
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    HDassert( entry_ptr != NULL );
+
+    if(aux_ptr->mpi_rank == 0) {
+        H5AC_slist_entry_t * slist_entry_ptr;
+
+        HDassert(aux_ptr->d_slist_ptr != NULL);
+        HDassert(aux_ptr->c_slist_ptr != NULL);
+
+        if(NULL != H5SL_search(aux_ptr->d_slist_ptr, (void *)(&entry_ptr->addr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry already in dirty slist.")
+
+        /* insert the address of the entry in the dirty entry list, and
+         * add its size to the dirty_bytes count.
+         */
+        if(NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "Can't allocate dirty slist entry .")
+
+        slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
+        slist_entry_ptr->addr  = entry_ptr->addr;
+
+        if(H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0 )
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
+
+        aux_ptr->d_slist_len += 1;
+
+        if(NULL != H5SL_search(aux_ptr->c_slist_ptr, (void *)(&entry_ptr->addr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry in clean slist.")
+    } /* end if */
+
+    aux_ptr->dirty_bytes += entry_ptr->size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+    aux_ptr->insert_dirty_bytes += size;
+    aux_ptr->insert_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_log_inserted_entry() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_log_moved_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a moved entry.
+ *
+ *		WARNING
+ *
+ *		At present, the way that the move call is used ensures
+ *		that the moved entry is present in all caches by
+ *		moving in a collective operation and immediately after
+ *		unprotecting the target entry.
+ *
+ *		This function uses this invarient, and will cause arcane
+ *		failures if it is not met.  If maintaining this invarient
+ *		becomes impossible, we will have to rework this function
+ *		extensively, and likely include a bit of IPC for
+ *		synchronization.  A better option might be to subsume
+ *		move in the unprotect operation.
+ *
+ *		Given that the target entry is in all caches, the function
+ *		proceeds as follows:
+ *
+ *		For processes with mpi rank other 0, it simply checks to
+ *		see if the entry was dirty prior to the move, and adds
+ *		the entries size to the dirty bytes count.
+ *
+ *		In the process with mpi rank 0, the function first checks
+ *		to see if the entry was dirty prior to the move.  If it
+ *		was, and if the entry doesn't appear in the dirtied list
+ *		under its old address, it adds the entry's size to the
+ *		dirty bytes count.
+ *
+ *		The rank 0 process then removes any references to the
+ *		entry under its old address from the cleands and dirtied
+ *		lists, and inserts an entry in the dirtied list under the
+ *		new address.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/30/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_log_moved_entry(const H5F_t *f,
+                       haddr_t old_addr,
+                       haddr_t new_addr)
+{
+    H5AC_t *             cache_ptr;
+    hbool_t		 entry_in_cache;
+    hbool_t		 entry_dirty;
+    size_t               entry_size;
+    H5AC_aux_t         * aux_ptr = NULL;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = (H5AC_t *)f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    /* get entry status, size, etc here */
+    if ( H5C_get_entry_status(f, old_addr, &entry_size, &entry_in_cache,
+                              &entry_dirty, NULL, NULL) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get entry status.")
+
+    } else if ( ! entry_in_cache ) {
+
+        HDassert( entry_in_cache );
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry not in cache.")
+    }
+
+    if ( aux_ptr->mpi_rank == 0 ) {
+
+        HDassert( aux_ptr->d_slist_ptr != NULL );
+        HDassert( aux_ptr->c_slist_ptr != NULL );
+
+        /* if the entry appears in the cleaned entry slist, under its old
+         * address, remove it.
+         */
+        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
+	      H5SL_search(aux_ptr->c_slist_ptr, (void *)(&old_addr))) != NULL ) {
+
+            HDassert( slist_entry_ptr->magic ==
+                          H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
+            HDassert( slist_entry_ptr->addr == old_addr );
+
+            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&old_addr))
+                               != slist_entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
+                            "Can't delete entry from cleaned entry slist.")
+            }
+
+            slist_entry_ptr->magic = 0;
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+            aux_ptr->c_slist_len -= 1;
+
+            HDassert( aux_ptr->c_slist_len >= 0 );
+        }
+
+        /* if the entry appears in the dirtied entry slist under its old
+         * address, remove it, but don't free it. Set addr to new_addr.
+         */
+        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
+	      H5SL_search(aux_ptr->d_slist_ptr, (void *)(&old_addr))) != NULL ) {
+
+            HDassert( slist_entry_ptr->magic ==
+                      H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
+            HDassert( slist_entry_ptr->addr == old_addr );
+
+            if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&old_addr))
+                != slist_entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
+                            "Can't delete entry from dirty entry slist.")
+            }
+
+            slist_entry_ptr->addr = new_addr;
+
+            aux_ptr->d_slist_len -= 1;
+
+            HDassert( aux_ptr->d_slist_len >= 0 );
+
+        } else {
+
+             /* otherwise, allocate a new entry that is ready
+              * for insertion, and increment dirty_bytes.
+              *
+              * Note that the fact that the entry wasn't in the dirtied
+              * list under its old address implies that it must have
+              * been clean to start with.
+              */
+
+            HDassert( !entry_dirty );
+
+            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                            "Can't allocate dirty slist entry .")
+            }
+
+            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
+            slist_entry_ptr->addr  = new_addr;
+
+            aux_ptr->dirty_bytes += entry_size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+            aux_ptr->move_dirty_bytes += entry_size;
+            aux_ptr->move_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+        }
+
+        /* verify that there is no entry at new_addr in the dirty slist */
+        if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&new_addr)) != NULL ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "dirty slist already contains entry at new_addr.")
+        }
+
+        /* insert / reinsert the entry in the dirty slist */
+        if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr,
+                         &(slist_entry_ptr->addr)) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
+                        "can't insert entry into dirty entry slist.")
+        }
+
+        aux_ptr->d_slist_len += 1;
+
+    } else if ( ! entry_dirty ) {
+
+        aux_ptr->dirty_bytes += entry_size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+        aux_ptr->move_dirty_bytes += entry_size;
+        aux_ptr->move_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_log_moved_entry() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_propagate_and_apply_candidate_list
+ *
+ * Purpose:     Prior to the addition of support for multiple metadata 
+ *		write strategies, in PHDF5, only the metadata cache with 
+ *		mpi rank 0 was allowed to write to file.  All other 
+ *		metadata caches on processes with rank greater than 0 
+ *		were required to retain dirty entries until they were 
+ *		notified that the entry was clean.
+ *
+ *		This constraint is relaxed with the distributed 
+ *		metadata write strategy, in which a list of candidate
+ *		metadata cache entries is constructed by the process 0
+ *		cache and then distributed to the caches of all the other
+ *		processes.  Once the listed is distributed, many (if not 
+ *		all) processes writing writing a unique subset of the 
+ *		entries, and marking the remainder clean.  The subsets 
+ *		are chosen so that each entry in the list of candidates 
+ *		is written by exactly one cache, and all entries are 
+ *		marked as being clean in all caches.
+ *
+ *		While the list of candidate cache entries is prepared 
+ *		elsewhere, this function is the main routine for distributing
+ *		and applying the list.  It must be run simultaniously on 
+ *		all processes that have the relevant file open.  To ensure
+ *		proper synchronization, there is a barrier at the beginning 
+ *		of this function.
+ *
+ *		At present, this function is called under one of two 
+ *		circumstances:
+ *
+ *		1) Dirty byte creation exceeds some user specified value.
+ *
+ *		   While metadata reads may occur independently, all
+ *		   operations writing metadata must be collective.  Thus
+ *		   all metadata caches see the same sequence of operations,
+ *                 and therefore the same dirty data creation.
+ *
+ *		   This fact is used to synchronize the caches for purposes
+ *                 of propagating the list of candidate entries, by simply 
+ *		   calling this function from all caches whenever some user 
+ *		   specified threshold on dirty data is exceeded.  (the 
+ *		   process 0 cache creates the candidate list just before 
+ *		   calling this function).
+ *
+ *		2) Under direct user control -- this operation must be
+ *		   collective.
+ *
+ *              The operations to be managed by this function are as
+ * 		follows:
+ *
+ *		All processes:
+ *
+ *		1) Participate in an opening barrier.
+ *
+ *		For the process with mpi rank 0:
+ *
+ *		1) Load the contents of the candidate list 
+ *		   (candidate_slist_ptr) into a buffer, and broadcast that
+ *		   buffer to all the other caches.  Clear the candidate
+ *		   list in passing.
+ *
+ *		If there is a positive number of candidates, proceed with 
+ *		the following:
+ *
+ *		2) Apply the candidate entry list.
+ *
+ *		3) Particpate in a closing barrier.
+ *
+ *		4) Remove from the dirty list (d_slist_ptr) and from the 
+ *		   flushed and still clean entries list (c_slist_ptr),  
+ *                 all addresses that appeared in the candidate list, as
+ *		   these entries are now clean.
+ *
+ *
+ *		For all processes with mpi rank greater than 0:
+ *
+ *		1) Receive the candidate entry list broadcast
+ *
+ *		If there is a positive number of candidates, proceed with 
+ *		the following:
+ *
+ *		2) Apply the candidate entry list.
+ *
+ *		3) Particpate in a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_propagate_and_apply_candidate_list(H5F_t  * f,
+                                        hid_t    dxpl_id,
+                                        H5AC_t * cache_ptr)
+{
+    int		         mpi_code;
+    int	                 num_candidates = 0;
+    haddr_t            * candidates_list_ptr = NULL;
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+
+    /* to prevent "messages from the future" we must synchronize all
+     * processes before we write any entries.
+     */
+    if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
+
+    if(aux_ptr->mpi_rank == 0) {
+        if(H5AC_broadcast_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast candidate slist.")
+
+        HDassert( aux_ptr->candidate_slist_len == 0 );
+    } /* end if */
+    else {
+        if(H5AC_receive_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive candidate broadcast.")
+    } /* end else */
+
+    if(num_candidates > 0) {
+        herr_t	         result;
+
+        /* all processes apply the candidate list.  
+         * H5C_apply_candidate_list() handles the details of 
+         * distributing the writes across the processes.
+         */
+
+        aux_ptr->write_permitted = TRUE;
+
+        result = H5C_apply_candidate_list(f,
+                                          dxpl_id,
+                                          dxpl_id,
+                                          cache_ptr,
+                                          num_candidates,
+                                          candidates_list_ptr,
+                                          aux_ptr->mpi_rank,
+                                          aux_ptr->mpi_size);
+
+        aux_ptr->write_permitted = FALSE;
+
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
+
+	if(aux_ptr->write_done != NULL)
+	    (aux_ptr->write_done)();
+
+        /* to prevent "messages from the past" we must synchronize all
+         * processes again before we go on.
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 2", mpi_code)
+
+        if(aux_ptr->mpi_rank == 0) {
+            if(H5AC_tidy_cache_0_lists(cache_ptr, num_candidates, candidates_list_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
+        } /* end if */
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done != NULL)
+        (aux_ptr->sync_point_done)(num_candidates, candidates_list_ptr);
+
+done:
+    if(candidates_list_ptr != NULL)
+        candidates_list_ptr = (haddr_t *)H5MM_xfree((void *)candidates_list_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_propagate_and_apply_candidate_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_propagate_flushed_and_still_clean_entries_list
+ *
+ * Purpose:     In PHDF5, if the process 0 only metadata write strategy
+ *		is selected, only the metadata cache with mpi rank 0 is 
+ *		allowed to write to file.  All other metadata caches on 
+ *		processes with rank greater than 0 must retain dirty 
+ *		entries until they are notified that the entry is now 
+ *		clean.
+ *
+ *		This function is the main routine for handling this 
+ *		notification proceedure.  It must be called 
+ *		simultaniously on all processes that have the relevant 
+ *		file open.  To this end, it is called only during a 
+ *		sync point, with a barrier prior to the call.
+ *
+ *		Note that any metadata entry writes by process 0 will
+ *		occur after the barrier and just before this call.
+ *
+ *		Typicaly, calls to this function will be triggered in
+ *		one of two ways:
+ *
+ *		1) Dirty byte creation exceeds some user specified value.
+ *
+ *		   While metadata reads may occur independently, all
+ *		   operations writing metadata must be collective.  Thus
+ *		   all metadata caches see the same sequence of operations,
+ *                 and therefore the same dirty data creation.
+ *
+ *		   This fact is used to synchronize the caches for purposes
+ *                 of propagating the list of flushed and still clean
+ *		   entries, by simply calling this function from all
+ *		   caches whenever some user specified threshold on dirty
+ *		   data is exceeded.
+ *
+ *		2) Under direct user control -- this operation must be
+ *		   collective.
+ *
+ *              The operations to be managed by this function are as
+ * 		follows:
+ *
+ *		For the process with mpi rank 0:
+ *
+ *		1) Load the contents of the flushed and still clean entries
+ *		   list (c_slist_ptr) into a buffer, and broadcast that
+ *		   buffer to all the other caches.
+ *
+ *		2) Clear the flushed and still clean entries list
+ *                 (c_slist_ptr).
+ *
+ *
+ *		For all processes with mpi rank greater than 0:
+ *
+ *		1) Receive the flushed and still clean entries list broadcast
+ *
+ *		2) Mark the specified entries as clean.
+ *
+ *
+ *		For all processes:
+ *
+ *		1) Reset the dirtied bytes count to 0.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              July 5, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t  * f,
+                                                    hid_t    dxpl_id,
+                                                    H5AC_t * cache_ptr)
+{
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
+
+    if(aux_ptr->mpi_rank == 0) {
+        if(H5AC_broadcast_clean_list(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast clean slist.")
+        HDassert( aux_ptr->c_slist_len == 0 );
+    } /* end if */
+    else {
+        if(H5AC_receive_and_apply_clean_list(f, dxpl_id, H5AC_dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive and/or process clean slist broadcast.")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_propagate_flushed_and_still_clean_entries_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_receive_and_apply_clean_list()
+ *
+ * Purpose:     Receive the list of cleaned entries from process 0,
+ *		and mark the specified entries as clean.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank greater than 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/4/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_receive_and_apply_clean_list(H5F_t  * f,
+                                  hid_t    primary_dxpl_id,
+                                  hid_t    secondary_dxpl_id,
+                                  H5AC_t * cache_ptr)
+{
+    H5AC_aux_t         * aux_ptr;
+    haddr_t	       * haddr_buf_ptr = NULL;
+    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
+    int                  mpi_result;
+    int			 num_entries = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+    HDassert( f->shared->cache == cache_ptr );
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->mpi_rank != 0 );
+
+    /* First receive the number of entries in the list so that we
+     * can set up a buffer to receive them.  If there aren't
+     * any, we are done.
+     */
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
+
+    if(num_entries > 0) {
+        size_t buf_size;
+        int i;
+
+        /* allocate buffers to store the list of entry base addresses in */
+        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
+        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for receive buffer")
+        if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
+
+        /* Now receive the list of cleaned entries
+         *
+         * The peculiar structure of the following call to MPI_Bcast is
+         * due to MPI's (?) failure to believe in the MPI_Offset type.
+         * Thus the element type is MPI_BYTE, with size equal to the
+         * buf_size computed above.
+         */
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
+
+        /* translate the MPI_Offsets to haddr_t */
+        i = 0;
+        while(i < num_entries) {
+            haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]);
+
+            if(haddr_buf_ptr[i] == HADDR_UNDEF)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert MPI off to haddr")
+
+            i++;
+        } /* end while */
+
+        /* mark the indicated entries as clean */
+        if(H5C_mark_entries_as_clean(f, primary_dxpl_id, secondary_dxpl_id,
+                (int32_t)num_entries, &(haddr_buf_ptr[0])) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't mark entries clean.")
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done != NULL)
+        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
+
+done:
+    if(MPI_Offset_buf_ptr != NULL)
+        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
+    if(haddr_buf_ptr != NULL)
+        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_receive_and_apply_clean_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_receive_candidate_list()
+ *
+ * Purpose:     Receive the list of candidate entries from process 0,
+ *		and return it in a buffer pointed to by *haddr_buf_ptr_ptr.
+ *		Note that the caller must free this buffer if it is 
+ *		returned.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank greater than 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_receive_candidate_list(H5AC_t * cache_ptr,
+                            int * num_entries_ptr,
+                            haddr_t ** haddr_buf_ptr_ptr)
+{
+    hbool_t		 success = FALSE;
+    H5AC_aux_t         * aux_ptr;
+    haddr_t	       * haddr_buf_ptr = NULL;
+    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
+    int                  mpi_result;
+    int			 num_entries;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->mpi_rank != 0 );
+    HDassert( aux_ptr-> metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+
+    HDassert( num_entries_ptr != NULL );
+    HDassert( *num_entries_ptr == 0 );
+
+    HDassert( haddr_buf_ptr_ptr != NULL );
+    HDassert( *haddr_buf_ptr_ptr == NULL );
+
+
+    /* First receive the number of entries in the list so that we
+     * can set up a buffer to receive them.  If there aren't
+     * any, we are done.
+     */
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
+
+    if(num_entries > 0) {
+        size_t buf_size;
+        int i;
+
+        /* allocate buffers to store the list of entry base addresses in */
+        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
+
+        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for receive buffer")
+        if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
+
+        /* Now receive the list of candidate entries
+         *
+         * The peculiar structure of the following call to MPI_Bcast is
+         * due to MPI's (?) failure to believe in the MPI_Offset type.
+         * Thus the element type is MPI_BYTE, with size equal to the
+         * buf_size computed above.
+         */
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
+
+        /* translate the MPI_Offsets to haddr_t */
+        i = 0;
+        while(i < num_entries) {
+            haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]);
+
+            if(haddr_buf_ptr[i] == HADDR_UNDEF)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert MPI off to haddr")
+
+            i++;
+        } /* end while */
+    } /* end if */
+
+    success = TRUE;
+
+done:
+    if(MPI_Offset_buf_ptr != NULL)
+        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
+
+    if(success) {
+        /* finally, pass the number of entries and the buffer pointer 
+         * back to the caller.  Do this so that we can use the same code
+         * to apply the candidate list to all the processes.
+         */
+        *num_entries_ptr = num_entries;
+        *haddr_buf_ptr_ptr = haddr_buf_ptr;
+    } /* end if */
+    else {
+        if(haddr_buf_ptr != NULL)
+            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_receive_candidate_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_rsp__dist_md_write__flush
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		that is triggered by a flush -- which in turn must have been
+ *		triggered by either a flush API call or a file close --
+ *		when the distributed metadata write strategy is selected.  
+ *
+ *		Upon entry, each process generates it own candidate list, 
+ *              being a sorted list of all dirty metadata entries currently 
+ *		in the metadata cache.  Note that this list must be idendical 
+ *		across all processes, as all processes see the same stream 
+ *		of dirty metadata coming in, and use the same lists of 
+ *		candidate entries at each sync point.  (At first glance, this 
+ *		argument sounds circular, but think of it in the sense of
+ *		a recursive proof).
+ *
+ *		If this this list is empty, we are done, and the function 
+ *		returns
+ *
+ *		Otherwise, after the sorted list dirty metadata entries is 
+ *		constructed, each process uses the same algorithm to assign 
+ *		each entry on the candidate list to exactly one process for 
+ *		flushing.
+ *
+ *		At this point, all processes participate in a barrier to
+ *		avoid messages from the past/future bugs.
+ *
+ *		Each process then flushes the entries assigned to it, and 
+ *		marks all other entries on the candidate list as clean.
+ *
+ *		Finally, all processes participate in a second barrier to 
+ *		avoid messages from the past/future bugs.
+ *
+ *		At the end of this process, process 0 and only process 0
+ *		must tidy up its lists of dirtied and cleaned entries.   
+ *		These lists are not used in the distributed metadata write
+ *		strategy, but they must be maintained should we shift 
+ *		to a strategy that uses them.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_rsp__dist_md_write__flush(H5F_t *f, 
+                               hid_t dxpl_id, 
+                               H5AC_t * cache_ptr)
+{
+    int		 mpi_code;
+    int          num_entries = 0;
+    haddr_t    * haddr_buf_ptr = NULL;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+    HDassert( f->shared->cache == cache_ptr );
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+
+    /* first construct the candidate list -- initially, this will be in the 
+     * form of a skip list.  We will convert it later.
+     */
+    if(H5C_construct_candidate_list__clean_cache(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
+
+    if(aux_ptr->candidate_slist_len > 0) {
+        herr_t	 result;
+
+        /* convert the candidate list into the format we
+         * are used to receiving from process 0.
+         */
+        if(H5AC_copy_candidate_list_to_buffer(cache_ptr, &num_entries, &haddr_buf_ptr, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
+
+        /* initial sync point barrier */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
+
+        /* apply the candidate list */
+        aux_ptr->write_permitted = TRUE;
+
+        result = H5C_apply_candidate_list(f,
+                                          dxpl_id,
+                                          dxpl_id,
+                                          cache_ptr,
+                                          num_entries,
+                                          haddr_buf_ptr,
+                                          aux_ptr->mpi_rank,
+                                          aux_ptr->mpi_size);
+
+        aux_ptr->write_permitted = FALSE;
+
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
+
+        /* this code exists primarily for the test bed -- it allows us to
+         * enforce posix semantics on the server that pretends to be a 
+         * file system in our parallel tests.
+         */
+        if(aux_ptr->write_done != NULL)
+            (aux_ptr->write_done)();
+
+        /* final sync point barrier */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
+
+	/* if this is process zero, tidy up the dirtied,
+         * and flushed and still clean lists.
+         */
+        if(aux_ptr->mpi_rank == 0) {
+            if(H5AC_tidy_cache_0_lists(cache_ptr, num_entries, haddr_buf_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
+        } /* end if */
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done != NULL)
+        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
+
+done:
+    if(haddr_buf_ptr != NULL)
+        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_rsp__dist_md_write__flush() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_rsp__dist_md_write__flush_to_min_clean
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		triggered by the accumulation of dirty metadata (as 
+ *		opposed to a flush call to the API) when the distributed
+ *		metadata write strategy is selected.
+ *
+ *		After invocation and initial sanity checking this function
+ *		first checks to see if evictions are enabled -- if they 
+ *		are not, the function does nothing and returns.
+ *
+ *		Otherwise, process zero constructs a list of entries to 
+ *		be flushed in order to bring the process zero cache back
+ *		within its min clean requirement.  Note that this list 
+ *		(the candidate list) may be empty.
+ *
+ *              Then, all processes participate in a barrier.
+ *
+ *		After the barrier, process 0 broadcasts the number of 
+ *		entries in the candidate list prepared above, and all 
+ *		other processes receive this number.
+ *
+ *		If this number is zero, we are done, and the function
+ *		returns without further action.
+ *
+ *		Otherwise, process 0 broadcasts the sorted list of 
+ *		candidate entries, and all other processes receive it.
+ *
+ *		Then, each process uses the same algorithm to assign 
+ *		each entry on the candidate list to exactly one process 
+ *		for flushing.
+ *
+ *		Each process then flushes the entries assigned to it, and 
+ *		marks all other entries on the candidate list as clean.
+ *
+ *		Finally, all processes participate in a second barrier to 
+ *		avoid messages from the past/future bugs.
+ *
+ *		At the end of this process, process 0 and only process 0
+ *		must tidy up its lists of dirtied and cleaned entries.   
+ *		These lists are not used in the distributed metadata write
+ *		strategy, but they must be maintained should we shift 
+ *		to a strategy that uses them.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_rsp__dist_md_write__flush_to_min_clean(H5F_t *f, 
+                                            hid_t dxpl_id, 
+                                            H5AC_t * cache_ptr)
+{
+    hbool_t 	 evictions_enabled;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+    HDassert( f->shared->cache == cache_ptr );
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+
+    /* Query if evictions are allowed */
+    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
+
+    if(evictions_enabled) {
+        /* construct candidate list -- process 0 only */
+        if(aux_ptr->mpi_rank == 0) {
+            if(H5AC_construct_candidate_list(cache_ptr, aux_ptr, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
+        } /* mpi rank == 0 */
+
+        /* propagate and apply candidate list -- all processes */
+        if(H5AC_propagate_and_apply_candidate_list(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate and apply candidate list.")
+    } /* evictions enabled */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_rsp__dist_md_write__flush_to_min_clean() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_rsp__p0_only__flush
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		that is triggered a flush -- which in turn must have been
+ *		triggered by either a flush API call or a file close -- 
+ *		when the process 0 only metadata write strategy is selected.  
+ *
+ *              First, all processes participate in a barrier.
+ *
+ *		Then process zero flushes all dirty entries, and broadcasts
+ *		they number of clean entries (if any) to all the other 
+ *		caches.
+ *
+ *		If this number is zero, we are done.
+ *
+ *		Otherwise, process 0 broadcasts the list of cleaned 
+ *		entries, and all other processes which are part of this
+ *		file group receive it, and mark the listed entries as
+ *		clean in their caches.
+ *
+ *		Since all processes have the same set of dirty 
+ *		entries at the beginning of the sync point, and all
+ *		entries that will be written are written before 
+ *		process zero broadcasts the number of cleaned entries,
+ *		there is no need for a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_rsp__p0_only__flush(H5F_t *f, 
+                         hid_t dxpl_id, 
+                         H5AC_t * cache_ptr)
+{
+    int		 mpi_code;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+    HDassert( f->shared->cache == cache_ptr );
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY );
+
+
+    /* to prevent "messages from the future" we must 
+     * synchronize all processes before we start the flush.  
+     * Hence the following barrier.
+     */
+    if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
+
+    /* Flush data to disk, from rank 0 process */
+    if(aux_ptr->mpi_rank == 0) {
+        herr_t        result;
+
+        aux_ptr->write_permitted = TRUE;
+
+        result = H5C_flush_cache(f, dxpl_id, dxpl_id, H5AC__NO_FLAGS_SET);
+
+        aux_ptr->write_permitted = FALSE;
+
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+
+        if(aux_ptr->write_done != NULL)
+            (aux_ptr->write_done)();
+    } /* end if */
+
+    /* Propagate cleaned entries to other ranks. */
+    if(H5AC_propagate_flushed_and_still_clean_entries_list(f, H5AC_dxpl_id, cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_rsp__p0_only__flush() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_rsp__p0_only__flush_to_min_clean
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		triggered by the accumulation of dirty metadata (as 
+ *		opposed to a flush call to the API) when the process 0
+ *		only metadata write strategy is selected.
+ *
+ *		After invocation and initial sanity checking this function
+ *		first checks to see if evictions are enabled -- if they 
+ *		are not, the function does nothing and returns.
+ *
+ *              Otherwise, all processes participate in a barrier.
+ *
+ *		After the barrier, if this is process 0, the function 
+ *		causes the cache to flush sufficient entries to get the 
+ *		cache back within its minimum clean fraction, and broadcast 
+ *		the number of entries which have been flushed since 
+ *		the last sync point, and are still clean.
+ *
+ *		If this number is zero, we are done.
+ *
+ *		Otherwise, process 0 broadcasts the list of cleaned 
+ *		entries, and all other processes which are part of this
+ *		file group receive it, and mark the listed entries as
+ *		clean in their caches.
+ *
+ *		Since all processes have the same set of dirty 
+ *		entries at the beginning of the sync point, and all
+ *		entries that will be written are written before 
+ *		process zero broadcasts the number of cleaned entries,
+ *		there is no need for a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_rsp__p0_only__flush_to_min_clean(H5F_t *f, 
+                                      hid_t dxpl_id, 
+                                      H5AC_t * cache_ptr)
+{
+    hbool_t 	 evictions_enabled;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+    HDassert( f->shared->cache == cache_ptr );
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY );
+
+    /* Query if evictions are allowed */
+    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
+
+    /* Flush if evictions are allowed -- following call
+     * will cause process 0 to flush to min clean size,
+     * and then propagate the newly clean entries to the
+     * other processes.
+     *
+     * Otherwise, do nothing.
+     */
+    if(evictions_enabled) {
+        int          mpi_code;
+
+        /* to prevent "messages from the future" we must synchronize all
+         * processes before we start the flush.  This synchronization may
+         * already be done -- hence the do_barrier parameter.
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
+
+        if(0 == aux_ptr->mpi_rank) {
+            herr_t	 result;
+
+            /* here, process 0 flushes as many entries as necessary to 
+             * comply with the currently specified min clean size.
+             * Note that it is quite possible that no entries will be 
+             * flushed.
+             */
+            aux_ptr->write_permitted = TRUE;
+
+            result = H5C_flush_to_min_clean(f, dxpl_id, H5AC_dxpl_id);
+
+            aux_ptr->write_permitted = FALSE;
+
+            if(result < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_to_min_clean() failed.")
+
+            /* this call exists primarily for the test code -- it is used
+ 	     * to enforce POSIX semantics on the process used to simulate
+ 	     * reads and writes in t_cache.c.
+             */
+            if(aux_ptr->write_done != NULL)
+                (aux_ptr->write_done)();
+        } /* end if */
+
+        if(H5AC_propagate_flushed_and_still_clean_entries_list(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_rsp__p0_only__flush_to_min_clean() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_run_sync_point
+ *
+ * Purpose:     Top level routine for managing a sync point between all
+ *		meta data caches in the parallel case.  Since all caches 
+ *		see the same sequence of dirty metadata, we simply count
+ *		bytes of dirty metadata, and run a sync point whenever the
+ *		number of dirty bytes of metadata seen since the last
+ *		sync point exceeds a threshold that is common across all
+ *		processes.  We also run sync points in response to 
+ *		HDF5 API calls triggering either a flush or a file close.
+ *
+ *		In earlier versions of PHDF5, only the metadata cache with 
+ *		mpi rank 0 was allowed to write to file.  All other 
+ *		metadata caches on processes with rank greater than 0 were
+ *		required to retain dirty entries until they were notified 
+ *		that the entry is was clean.
+ *
+ *		This function was created to make it easier for us to 
+ *		experiment with other options, as it is a single point 
+ *		for the execution of sync points.  
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              March 11, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_run_sync_point(H5F_t *f, 
+                    hid_t dxpl_id, 
+		    int sync_point_op)
+{
+    H5AC_t * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f != NULL );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+
+    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN ) ||
+              ( sync_point_op == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED ) );
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+    HDfprintf(stdout,
+              "%d:H5AC_propagate...:%d: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n",
+              (int)(aux_ptr->mpi_rank),
+              (int)(aux_ptr->dirty_bytes_propagations),
+              (int)(aux_ptr->unprotect_dirty_bytes),
+              (int)(aux_ptr->unprotect_dirty_bytes_updates),
+              (int)(aux_ptr->insert_dirty_bytes),
+              (int)(aux_ptr->insert_dirty_bytes_updates),
+              (int)(aux_ptr->rename_dirty_bytes),
+              (int)(aux_ptr->rename_dirty_bytes_updates));
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+    switch(aux_ptr->metadata_write_strategy) {
+        case H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
+	    switch(sync_point_op) {
+                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+	            if(H5AC_rsp__p0_only__flush_to_min_clean(f, dxpl_id, cache_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__p0_only__flush_to_min_clean() failed.")
+		    break;
+
+		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+	            if(H5AC_rsp__p0_only__flush(f, dxpl_id, cache_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__p0_only__flush() failed.")
+		    break;
+
+		default:
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
+		    break;
+	    } /* end switch */
+	    break;
+
+	case H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
+	    switch(sync_point_op) {
+                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+	            if(H5AC_rsp__dist_md_write__flush_to_min_clean(f, dxpl_id, cache_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__dist_md_write__flush() failed.")
+		    break;
+
+		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+	            if(H5AC_rsp__dist_md_write__flush(f, dxpl_id, cache_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__dist_md_write__flush() failed.")
+		    break;
+
+		default:
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
+		    break;
+	    } /* end switch */
+	    break;
+
+	default:
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown metadata write strategy.")
+	    break;
+    } /* end switch */
+
+    /* reset the dirty bytes count */
+    aux_ptr->dirty_bytes = 0;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+    aux_ptr->dirty_bytes_propagations     += 1;
+    aux_ptr->unprotect_dirty_bytes         = 0;
+    aux_ptr->unprotect_dirty_bytes_updates = 0;
+    aux_ptr->insert_dirty_bytes            = 0;
+    aux_ptr->insert_dirty_bytes_updates    = 0;
+    aux_ptr->rename_dirty_bytes            = 0;
+    aux_ptr->rename_dirty_bytes_updates    = 0;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_run_sync_point() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_tidy_cache_0_lists()
+ *
+ * Purpose:     In the distributed metadata write strategy, not all dirty
+ *		entries are written by process 0 -- thus we must tidy
+ *		up the dirtied, and flushed and still clean lists 
+ *		maintained by process zero after each sync point.
+ *
+ *		This procedure exists to tend to this issue.
+ *
+ *		At this point, all entries that process 0 cleared should
+ *		have been removed from both the dirty and flushed and 
+ *		still clean lists, and entries that process 0 has flushed
+ *		should have been removed from the dirtied list and added
+ *		to the flushed and still clean list.
+ *
+ *		However, since the distributed metadata write strategy
+ *		doesn't make use of these lists, the objective is simply
+ *		to maintain these lists in consistent state that allows
+ *		them to be used should the metadata write strategy change
+ *		to one that uses these lists.
+ *
+ *		Thus for our purposes, all we need to do is remove from 
+ *		the dirtied and flushed and still clean lists all
+ *		references to entries that appear in the candidate list.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              4/20/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+static herr_t
+H5AC_tidy_cache_0_lists(H5AC_t * cache_ptr,
+                        int num_candidates,
+                        haddr_t * candidates_list_ptr)
+
+{
+    int                  i;
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    HDassert( aux_ptr != NULL );
+    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( aux_ptr->metadata_write_strategy == 
+              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
+    HDassert( aux_ptr->mpi_rank == 0 );
+    HDassert( num_candidates > 0 );
+    HDassert( candidates_list_ptr != NULL );
+
+    /* clean up dirtied and flushed and still clean lists by removing 
+     * all entries on the candidate list.  Cleared entries should 
+     * have been removed from both the dirty and cleaned lists at 
+     * this point, flushed entries should have been added to the 
+     * cleaned list.  However, for this metadata write strategy, 
+     * we just want to remove all references to the candidate entries.
+     */
+    for(i = 0; i < num_candidates; i++) {
+        H5AC_slist_entry_t * d_slist_entry_ptr;
+        H5AC_slist_entry_t * c_slist_entry_ptr;
+        haddr_t              addr;
+
+        addr = candidates_list_ptr[i];
+
+        /* addr must be either on the dirtied list, or on the flushed 
+         * and still clean list.  Remove it.
+         */
+        d_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)&addr);
+        if(d_slist_entry_ptr != NULL) {
+            HDassert(d_slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert(d_slist_entry_ptr->addr == addr);
+
+            if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != d_slist_entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
+
+            d_slist_entry_ptr->magic = 0;
+            d_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, d_slist_entry_ptr);
+
+            aux_ptr->d_slist_len -= 1;
+
+            HDassert(aux_ptr->d_slist_len >= 0);
+        } /* end if */
+
+        c_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)&addr);
+        if(c_slist_entry_ptr != NULL) {
+            HDassert(c_slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
+            HDassert(c_slist_entry_ptr->addr == addr);
+
+            if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != c_slist_entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from clean entry slist.")
+
+            c_slist_entry_ptr->magic = 0;
+            c_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, c_slist_entry_ptr);
+
+            aux_ptr->c_slist_len -= 1;
+
+            HDassert( aux_ptr->c_slist_len >= 0 );
+        } /* end if */
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_tidy_cache_0_lists() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_flush_entries
+ *
+ * Purpose:     Flush the metadata cache associated with the specified file,
+ *              only writing from rank 0, but propagating the cleaned entries
+ *              to all ranks.
+ *
+ * Return:      Non-negative on success/Negative on failure if there was a
+ *              request to flush all items and something was protected.
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 22 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5AC_flush_entries(H5F_t *f)
+{
+    herr_t        ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(f->shared->cache);
+
+    /* Check if we have >1 ranks */
+    if(f->shared->cache->aux_ptr) {
+        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_CACHE) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_flush_entries() */
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5ACpkg.h b/gatb-core/thirdparty/hdf5/src/H5ACpkg.h
new file mode 100644
index 0000000..ad768ef
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5ACpkg.h
@@ -0,0 +1,390 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: John Mainzer -- 4/19/06
+ *
+ * Purpose:     This file contains declarations which are normally visible
+ *              only within the H5AC package (just H5AC.c at present).
+ *
+ *		Source files outside the H5AC package should include
+ *		H5ACprivate.h instead.
+ *
+ *		The one exception to this rule is testpar/t_cache.c.  The
+ *		test code is easier to write if it can look at H5AC_aux_t.
+ *		Indeed, this is the main reason why this file was created.
+ *
+ */
+
+#ifndef H5AC_PACKAGE
+#error "Do not include this file outside the H5AC package!"
+#endif
+
+#ifndef _H5ACpkg_H
+#define _H5ACpkg_H
+
+/* Get package's private header */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+
+
+/* Get needed headers */
+#include "H5Cprivate.h"         /* Cache                                */
+#include "H5SLprivate.h"        /* Skip lists */
+
+
+#define H5AC_DEBUG_DIRTY_BYTES_CREATION	0
+
+#ifdef H5_HAVE_PARALLEL
+
+/* the following #defined are used to specify the operation required
+ * at a sync point.
+ */
+
+#define H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN		0
+#define H5AC_SYNC_POINT_OP__FLUSH_CACHE			1
+
+#endif /* H5_HAVE_PARALLEL */
+
+/*-------------------------------------------------------------------------
+ *  It is a bit difficult to set ranges of allowable values on the
+ *  dirty_bytes_threshold field of H5AC_aux_t.  The following are
+ *  probably broader than they should be.
+ *-------------------------------------------------------------------------
+ */
+
+#define H5AC__MIN_DIRTY_BYTES_THRESHOLD		(int32_t) \
+						(H5C__MIN_MAX_CACHE_SIZE / 2)
+#define H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD	(256 * 1024)
+#define H5AC__MAX_DIRTY_BYTES_THRESHOLD   	(int32_t) \
+						(H5C__MAX_MAX_CACHE_SIZE / 4)
+
+
+/****************************************************************************
+ *
+ * structure H5AC_aux_t
+ *
+ * While H5AC has become a wrapper for the cache implemented in H5C.c, there
+ * are some features of the metadata cache that are specific to it, and which
+ * therefore do not belong in the more generic H5C cache code.
+ *
+ * In particular, there is the matter of synchronizing writes from the
+ * metadata cache to disk in the PHDF5 case.
+ *
+ * Prior to this update, the presumption was that all metadata caches would
+ * write the same data at the same time since all operations modifying
+ * metadata must be performed collectively.  Given this assumption, it was
+ * safe to allow only the writes from process 0 to actually make it to disk,
+ * while metadata writes from all other processes were discarded.
+ *
+ * Unfortunately, this presumption is in error as operations that read
+ * metadata need not be collective, but can change the location of dirty
+ * entries in the metadata cache LRU lists.  This can result in the same
+ * metadata write operation triggering writes from the metadata caches on
+ * some processes, but not all (causing a hang), or in different sets of
+ * entries being written from different caches (potentially resulting in
+ * metadata corruption in the file).
+ *
+ * To deal with this issue, I decided to apply a paradigm shift to the way
+ * metadata is written to disk.
+ *
+ * With this set of changes, only the metadata cache on process 0 is able
+ * to write metadata to disk, although metadata caches on all other
+ * processes can read metadata from disk as before.
+ *
+ * To keep all the other caches from getting plugged up with dirty metadata,
+ * process 0 periodically broadcasts a list of entries that it has flushed
+ * since that last notice, and which are currently clean.  The other caches
+ * mark these entries as clean as well, which allows them to evict the
+ * entries as needed.
+ *
+ * One obvious problem in this approach is synchronizing the broadcasts
+ * and receptions, as different caches may see different amounts of
+ * activity.
+ *
+ * The current solution is for the caches to track the number of bytes
+ * of newly generated dirty metadata, and to broadcast and receive
+ * whenever this value exceeds some user specified threshold.
+ *
+ * Maintaining this count is easy for all processes not on process 0 --
+ * all that is necessary is to add the size of the entry to the total
+ * whenever there is an insertion, a move of a previously clean entry,
+ * or whever a previously clean entry is marked dirty in an unprotect.
+ *
+ * On process 0, we have to be careful not to count dirty bytes twice.
+ * If an entry is marked dirty, flushed, and marked dirty again, all
+ * within a single reporting period, it only th first marking should
+ * be added to the dirty bytes generated tally, as that is all that
+ * the other processes will see.
+ *
+ * At present, this structure exists to maintain the fields needed to
+ * implement the above scheme, and thus is only used in the parallel
+ * case.  However, other uses may arise in the future.
+ *
+ * Instance of this structure are associated with metadata caches via
+ * the aux_ptr field of H5C_t (see H5Cpkg.h).  The H5AC code is
+ * responsible for allocating, maintaining, and discarding instances
+ * of H5AC_aux_t.
+ *
+ * The remainder of this header comments documents the individual fields
+ * of the structure.
+ *
+ *                                              JRM - 6/27/05
+ *
+ * magic:       Unsigned 32 bit integer always set to
+ *		H5AC__H5AC_AUX_T_MAGIC.  This field is used to validate
+ *		pointers to instances of H5AC_aux_t.
+ *
+ * mpi_comm:	MPI communicator associated with the file for which the
+ *		cache has been created.
+ *
+ * mpi_rank:	MPI rank of this process within mpi_comm.
+ *
+ * mpi_size:	Number of processes in mpi_comm.
+ *
+ * write_permitted:  Boolean flag used to control whether the cache
+ *		is permitted to write to file.
+ *
+ * dirty_bytes_threshold: Integer field containing the dirty bytes
+ *		generation threashold.  Whenever dirty byte creation
+ *		exceeds this value, the metadata cache on process 0
+ *		broadcasts a list of the entries it has flushed since
+ *		the last broadcast (or since the beginning of execution)
+ *		and which are currently clean (if they are still in the
+ *		cache)
+ *
+ *		Similarly, metadata caches on processes other than process
+ *		0 will attempt to receive a list of clean entries whenever
+ *		the threshold is exceeded.
+ *
+ * dirty_bytes:  Integer field containing the number of bytes of dirty
+ *		metadata generated since the beginning of the computation,
+ *		or (more typically) since the last clean entries list
+ *		broadcast.  This field is reset to zero after each such
+ *		broadcast.
+ *
+ * metadata_write_strategy: Integer code indicating how we will be 
+ *		writing the metadata.  In the first incarnation of 
+ *		this code, all writes were done from process 0.  This
+ *		field exists to facilitate experiments with other 
+ *		strategies.
+ *
+ * dirty_bytes_propagations: This field only exists when the
+ *		H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of times the cleaned list
+ *		has been propagated from process 0 to the other
+ *		processes.
+ *
+ * unprotect_dirty_bytes:  This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of dirty bytes created
+ *		via unprotect operations since the last time the cleaned
+ *		list was propagated.
+ *
+ * unprotect_dirty_bytes_updates: This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of times dirty bytes have
+ *		been created via unprotect operations since the last time
+ *		the cleaned list was propagated.
+ *
+ * insert_dirty_bytes:  This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of dirty bytes created
+ *		via insert operations since the last time the cleaned
+ *		list was propagated.
+ *
+ * insert_dirty_bytes_updates:  This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of times dirty bytes have
+ *		been created via insert operations since the last time
+ *		the cleaned list was propagated.
+ *
+ * move_dirty_bytes:  This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of dirty bytes created
+ *		via move operations since the last time the cleaned
+ *		list was propagated.
+ *
+ * move_dirty_bytes_updates:  This field only exists when the
+ *              H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
+ *
+ *		It is used to track the number of times dirty bytes have
+ *		been created via move operations since the last time
+ *		the cleaned list was propagated.
+ *
+ * Things have changed a bit since the following four fields were defined.
+ * If metadata_write_strategy is H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY,
+ * all comments hold as before -- with the caviate that pending further 
+ * coding, the process 0 metadata cache is forbidden to flush entries outside
+ * of a sync point.
+ *
+ * However, for different metadata write strategies, these fields are used
+ * only to maintain the correct dirty byte count on process zero -- and in
+ * most if not all cases, this is redundant, as process zero will be barred
+ * from flushing entries outside of a sync point.
+ *
+ *						JRM -- 3/16/10
+ *
+ * d_slist_ptr:  Pointer to an instance of H5SL_t used to maintain a list
+ *		of entries that have been dirtied since the last time they
+ *		were listed in a clean entries broadcast.  This list is
+ *		only maintained by the metadata cache on process 0 -- it
+ *		it used to maintain a view of the dirty entries as seen
+ *		by the other caches, so as to keep the dirty bytes count
+ *		in synchronization with them.
+ *
+ *		Thus on process 0, the dirty_bytes count is incremented
+ *		only if either
+ *
+ *		1) an entry is inserted in the metadata cache, or
+ *
+ *		2) a previously clean entry is moved, and it does not
+ *		   already appear in the dirty entry list, or
+ *
+ *		3) a previously clean entry is unprotected with the
+ *		   dirtied flag set and the entry does not already appear
+ *		   in the dirty entry list.
+ *
+ *		Entries are added to the dirty entry list whever they cause
+ *		the dirty bytes count to be increased.  They are removed
+ *		when they appear in a clean entries broadcast.  Note that
+ *		moves must be reflected in the dirty entry list.
+ *
+ *		To reitterate, this field is only used on process 0 -- it
+ *		should be NULL on all other processes.
+ *
+ * d_slist_len: Integer field containing the number of entries in the
+ *		dirty entry list.  This field should always contain the
+ *		value 0 on all processes other than process 0.  It exists
+ *		primarily for sanity checking.
+ *
+ * c_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list
+ *		of entries that were dirty, have been flushed
+ *		to disk since the last clean entries broadcast, and are
+ *		still clean.  Since only process 0 can write to disk, this
+ *		list only exists on process 0.
+ *
+ *		In essence, this slist is used to assemble the contents of
+ *		the next clean entries broadcast.  The list emptied after
+ *		each broadcast.
+ *
+ * c_slist_len: Integer field containing the number of entries in the clean
+ *		entries list (*c_slist_ptr).  This field should always
+ *		contain the value 0 on all processes other than process 0.
+ *		It exists primarily for sanity checking.
+ *
+ * The following two fields are used only when metadata_write_strategy
+ * is H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED.
+ *
+ * candidate_slist_ptr: Pointer to an instance of H5SL_t used by process 0
+ *		to construct a list of entries to be flushed at this sync
+ *		point.  This list is then broadcast to the other processes,
+ *		which then either flush or mark clean all entries on it.
+ *
+ * candidate_slist_len: Integer field containing the number of entries on the
+ *		candidate list.  It exists primarily for sanity checking.
+ *
+ * write_done:  In the parallel test bed, it is necessary to ensure that
+ *              all writes to the server process from cache 0 complete
+ *              before it enters the barrier call with the other caches.
+ *
+ *              The write_done callback allows t_cache to do this without
+ *              requiring an ACK on each write.  Since these ACKs greatly
+ *              increase the run time on some platforms, this is a
+ *              significant optimization.
+ *
+ *              This field must be set to NULL when the callback is not
+ *              needed.
+ *
+ *		Note: This field has been extended for use by all processes
+ *		      with the addition of support for the distributed 
+ *		      metadata write strategy.        
+ *                                                     JRM -- 5/9/10
+ *
+ * sync_point_done:  In the parallel test bed, it is necessary to verify
+ *		that the expected writes, and only the expected writes,
+ *		have taken place at the end of each sync point.
+ *
+ *		The sync_point_done callback allows t_cache to perform 
+ *		this verification.  The field is set to NULL when the 
+ *		callback is not needed.
+ *
+ ****************************************************************************/
+
+#ifdef H5_HAVE_PARALLEL
+
+#define H5AC__H5AC_AUX_T_MAGIC        (unsigned)0x00D0A01
+
+typedef struct H5AC_aux_t
+{
+    uint32_t	magic;
+
+    MPI_Comm	mpi_comm;
+
+    int		mpi_rank;
+
+    int		mpi_size;
+
+    hbool_t	write_permitted;
+
+    int32_t	dirty_bytes_threshold;
+
+    int32_t	dirty_bytes;
+
+    int32_t	metadata_write_strategy;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+
+    int32_t	dirty_bytes_propagations;
+
+    int32_t     unprotect_dirty_bytes;
+    int32_t     unprotect_dirty_bytes_updates;
+
+    int32_t     insert_dirty_bytes;
+    int32_t     insert_dirty_bytes_updates;
+
+    int32_t     move_dirty_bytes;
+    int32_t     move_dirty_bytes_updates;
+
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+    H5SL_t *	d_slist_ptr;
+
+    int32_t	d_slist_len;
+
+    H5SL_t *	c_slist_ptr;
+
+    int32_t	c_slist_len;
+
+    H5SL_t *	candidate_slist_ptr;
+
+    int32_t	candidate_slist_len;
+
+    void	(* write_done)(void);
+
+    void	(* sync_point_done)(int num_writes, 
+                                    haddr_t * written_entries_tbl);
+
+} H5AC_aux_t; /* struct H5AC_aux_t */
+
+#endif /* H5_HAVE_PARALLEL */
+
+#endif /* _H5ACpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5ACprivate.h b/gatb-core/thirdparty/hdf5/src/H5ACprivate.h
new file mode 100644
index 0000000..724d44a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5ACprivate.h
@@ -0,0 +1,369 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5ACprivate.h
+ *			Jul  9 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Constants and typedefs available to the rest of the
+ *			library.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5ACprivate_H
+#define _H5ACprivate_H
+
+#include "H5ACpublic.h"		/*public prototypes			*/
+
+/* Pivate headers needed by this header */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Cprivate.h"		/* Cache				*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+#ifdef H5_METADATA_TRACE_FILE
+#define H5AC__TRACE_FILE_ENABLED	1
+#else /* H5_METADATA_TRACE_FILE */
+#define H5AC__TRACE_FILE_ENABLED	0
+#endif /* H5_METADATA_TRACE_FILE */
+
+/* Types of metadata objects cached */
+typedef enum {
+    H5AC_BT_ID = 0, 	/*B-tree nodes				     */
+    H5AC_SNODE_ID,	/*symbol table nodes			     */
+    H5AC_LHEAP_PRFX_ID, /*local heap prefix			     */
+    H5AC_LHEAP_DBLK_ID, /*local heap data block			     */
+    H5AC_GHEAP_ID,	/*global heap				     */
+    H5AC_OHDR_ID,	/*object header				     */
+    H5AC_OHDR_CHK_ID,	/*object header chunk			     */
+    H5AC_BT2_HDR_ID,	/*v2 B-tree header			     */
+    H5AC_BT2_INT_ID,	/*v2 B-tree internal node		     */
+    H5AC_BT2_LEAF_ID,	/*v2 B-tree leaf node			     */
+    H5AC_FHEAP_HDR_ID,	/*fractal heap header			     */
+    H5AC_FHEAP_DBLOCK_ID, /*fractal heap direct block		     */
+    H5AC_FHEAP_IBLOCK_ID, /*fractal heap indirect block		     */
+    H5AC_FSPACE_HDR_ID,	/*free space header			     */
+    H5AC_FSPACE_SINFO_ID,/*free space sections			     */
+    H5AC_SOHM_TABLE_ID, /*shared object header message master table  */
+    H5AC_SOHM_LIST_ID,  /*shared message index stored as a list      */
+    H5AC_SUPERBLOCK_ID, /* file superblock                           */
+    H5AC_TEST_ID,	/*test entry -- not used for actual files    */
+    H5AC_NTYPES		/* Number of types, must be last             */
+} H5AC_type_t;
+
+/* H5AC_DUMP_STATS_ON_CLOSE should always be FALSE when
+ * H5C_COLLECT_CACHE_STATS is FALSE.
+ *
+ * When H5C_COLLECT_CACHE_STATS is TRUE, H5AC_DUMP_STATS_ON_CLOSE must
+ * be FALSE for "make check" to succeed, but may be set to TRUE at other
+ * times for debugging purposes.
+ *
+ * Hence the following, somewhat odd set of #defines.
+ */
+#if H5C_COLLECT_CACHE_STATS
+
+#define H5AC_DUMP_STATS_ON_CLOSE	0
+
+#else /* H5C_COLLECT_CACHE_STATS */
+
+#define H5AC_DUMP_STATS_ON_CLOSE	0
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+/* Default max metadata cache size and min clean size are give here.
+ * At present, these are the same as those given in H5Cprivate.h.
+ */
+
+#define H5AC__DEFAULT_MAX_CACHE_SIZE	H5C__DEFAULT_MAX_CACHE_SIZE
+#define H5AC__DEFAULT_MIN_CLEAN_SIZE	H5C__DEFAULT_MIN_CLEAN_SIZE
+
+
+/*
+ * Class methods pertaining to caching.	 Each type of cached object will
+ * have a constant variable with permanent life-span that describes how
+ * to cache the object.	 That variable will be of type H5AC_class_t and
+ * have the following required fields...
+ *
+ * LOAD:	Loads an object from disk to memory.  The function
+ *		should allocate some data structure and return it.
+ *
+ * FLUSH:	Writes some data structure back to disk.  It would be
+ *		wise for the data structure to include dirty flags to
+ *		indicate whether it really needs to be written.	 This
+ *		function is also responsible for freeing memory allocated
+ *		by the LOAD method if the DEST argument is non-zero (by
+ *              calling the DEST method).
+ *
+ * DEST:	Just frees memory allocated by the LOAD method.
+ *
+ * CLEAR:	Just marks object as non-dirty.
+ *
+ * SIZE:	Report the size (on disk) of the specified cache object.
+ *		Note that the space allocated on disk may not be contiguous.
+ */
+
+#define H5AC_CALLBACK__NO_FLAGS_SET             H5C_CALLBACK__NO_FLAGS_SET
+#define H5AC_CALLBACK__SIZE_CHANGED_FLAG	H5C_CALLBACK__SIZE_CHANGED_FLAG
+#define H5AC_CALLBACK__MOVED_FLAG             H5C_CALLBACK__MOVED_FLAG
+
+typedef H5C_load_func_t		H5AC_load_func_t;
+typedef H5C_flush_func_t	H5AC_flush_func_t;
+typedef H5C_dest_func_t		H5AC_dest_func_t;
+typedef H5C_clear_func_t	H5AC_clear_func_t;
+typedef H5C_size_func_t		H5AC_size_func_t;
+
+typedef H5C_class_t			H5AC_class_t;
+
+
+/* The H5AC_NSLOTS #define is now obsolete, as the metadata cache no longer
+ * uses slots.  However I am leaving it in for now to avoid modifying the
+ * interface between the metadata cache and the rest of HDF.  It should
+ * be removed when we get to dealing with the size_hint parameter in
+ * H5AC_create().
+ *						JRM - 5/20/04
+ *
+ * Old comment on H5AC_NSLOTS follows:
+ *
+ * A cache has a certain number of entries.  Objects are mapped into a
+ * cache entry by hashing the object's file address.  Each file has its
+ * own cache, an array of slots.
+ */
+#define H5AC_NSLOTS     10330           /* The library "likes" this number... */
+
+
+typedef H5C_cache_entry_t		H5AC_info_t;
+
+
+/*===----------------------------------------------------------------------===
+ *                             Protect Types
+ *===----------------------------------------------------------------------===
+ *
+ * These are for the wrapper functions to H5AC_protect. They specify what
+ * type of operation you're planning on doing to the metadata. The
+ * Flexible Parallel HDF5 locking can then act accordingly.
+ */
+
+typedef enum H5AC_protect_t {
+    H5AC_WRITE,                 /* Protect object for writing                */
+    H5AC_READ                   /* Protect object for reading                */
+} H5AC_protect_t;
+
+
+/* Typedef for metadata cache (defined in H5Cpkg.h) */
+typedef H5C_t	H5AC_t;
+
+/* Metadata specific properties for FAPL */
+/* (Only used for parallel I/O) */
+#ifdef H5_HAVE_PARALLEL
+/* Definitions for "collective metadata write" property */
+#define H5AC_COLLECTIVE_META_WRITE_NAME         "H5AC_collective_metadata_write"
+#define H5AC_COLLECTIVE_META_WRITE_SIZE         sizeof(unsigned)
+#define H5AC_COLLECTIVE_META_WRITE_DEF          0
+#endif /* H5_HAVE_PARALLEL */
+
+/* Dataset transfer property list for flush calls */
+/* (Collective set, "block before metadata write" set and "library internal" set) */
+/* (Global variable declaration, definition is in H5AC.c) */
+extern hid_t H5AC_dxpl_id;
+
+/* Dataset transfer property list for independent metadata I/O calls */
+/* (just "library internal" set - i.e. independent transfer mode) */
+/* (Global variable declaration, definition is in H5AC.c) */
+extern H5P_genplist_t *H5AC_ind_dxpl_g;
+extern hid_t H5AC_ind_dxpl_id;
+
+
+/* Default cache configuration. */
+
+#define H5AC__DEFAULT_METADATA_WRITE_STRATEGY   \
+                                H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED
+
+#ifdef H5_HAVE_PARALLEL
+#define H5AC__DEFAULT_CACHE_CONFIG                                            \
+{                                                                             \
+  /* int         version                = */ H5AC__CURR_CACHE_CONFIG_VERSION, \
+  /* hbool_t     rpt_fcn_enabled        = */ FALSE,                           \
+  /* hbool_t     open_trace_file        = */ FALSE,                           \
+  /* hbool_t     close_trace_file       = */ FALSE,                           \
+  /* char        trace_file_name[]      = */ "",                              \
+  /* hbool_t     evictions_enabled      = */ TRUE,                            \
+  /* hbool_t     set_initial_size       = */ TRUE,                            \
+  /* size_t      initial_size           = */ ( 2 * 1024 * 1024),              \
+  /* double      min_clean_fraction     = */ 0.3,                             \
+  /* size_t      max_size               = */ (32 * 1024 * 1024),              \
+  /* size_t      min_size               = */ (1 * 1024 * 1024),               \
+  /* long int    epoch_length           = */ 50000,                           \
+  /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,             \
+  /* double      lower_hr_threshold     = */ 0.9F,                            \
+  /* double      increment              = */ 2.0F,                            \
+  /* hbool_t     apply_max_increment    = */ TRUE,                            \
+  /* size_t      max_increment          = */ (4 * 1024 * 1024),               \
+  /* enum H5C_cache_flash_incr_mode       */                                  \
+  /*                    flash_incr_mode = */ H5C_flash_incr__add_space,       \
+  /* double      flash_multiple         = */ 1.0F,                            \
+  /* double      flash_threshold        = */ 0.25F,                            \
+  /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, \
+  /* double      upper_hr_threshold     = */ H5_DOUBLE(0.999),                 \
+  /* double      decrement              = */ 0.9F,                            \
+  /* hbool_t     apply_max_decrement    = */ TRUE,                            \
+  /* size_t      max_decrement          = */ (1 * 1024 * 1024),               \
+  /* int         epochs_before_eviction = */ 3,                               \
+  /* hbool_t     apply_empty_reserve    = */ TRUE,                            \
+  /* double      empty_reserve          = */ 0.1F,                            \
+  /* int	 dirty_bytes_threshold  = */ (256 * 1024),                    \
+  /* int	metadata_write_strategy = */                                  \
+				       H5AC__DEFAULT_METADATA_WRITE_STRATEGY  \
+}
+#else /* H5_HAVE_PARALLEL */
+#define H5AC__DEFAULT_CACHE_CONFIG                                            \
+{                                                                             \
+  /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,     \
+  /* hbool_t     rpt_fcn_enabled        = */ FALSE,                           \
+  /* hbool_t     open_trace_file        = */ FALSE,                           \
+  /* hbool_t     close_trace_file       = */ FALSE,                           \
+  /* char        trace_file_name[]      = */ "",                              \
+  /* hbool_t     evictions_enabled      = */ TRUE,                            \
+  /* hbool_t     set_initial_size       = */ TRUE,                            \
+  /* size_t      initial_size           = */ ( 2 * 1024 * 1024),              \
+  /* double      min_clean_fraction     = */ 0.01F,                           \
+  /* size_t      max_size               = */ (32 * 1024 * 1024),              \
+  /* size_t      min_size               = */ ( 1 * 1024 * 1024),              \
+  /* long int    epoch_length           = */ 50000,                           \
+  /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,             \
+  /* double      lower_hr_threshold     = */ 0.9F,                            \
+  /* double      increment              = */ 2.0F,                            \
+  /* hbool_t     apply_max_increment    = */ TRUE,                            \
+  /* size_t      max_increment          = */ (4 * 1024 * 1024),               \
+  /* enum H5C_cache_flash_incr_mode       */                                  \
+  /*                    flash_incr_mode = */ H5C_flash_incr__add_space,       \
+  /* double      flash_multiple         = */ 1.4F,                            \
+  /* double      flash_threshold        = */ 0.25F,                           \
+  /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,\
+  /* double      upper_hr_threshold     = */ H5_DOUBLE(0.999),                \
+  /* double      decrement              = */ 0.9F,                            \
+  /* hbool_t     apply_max_decrement    = */ TRUE,                            \
+  /* size_t      max_decrement          = */ (1 * 1024 * 1024),               \
+  /* int         epochs_before_eviction = */ 3,                               \
+  /* hbool_t     apply_empty_reserve    = */ TRUE,                            \
+  /* double      empty_reserve          = */ 0.1F,                            \
+  /* int	 dirty_bytes_threshold  = */ (256 * 1024),                    \
+  /* int	metadata_write_strategy = */                                  \
+				       H5AC__DEFAULT_METADATA_WRITE_STRATEGY  \
+}
+#endif /* H5_HAVE_PARALLEL */
+
+
+/*
+ * Library prototypes.
+ */
+
+/* #defines of flags used in the flags parameters in some of the
+ * following function calls.  Note that they are just copies of
+ * the equivalent flags from H5Cprivate.h.
+ */
+
+#define H5AC__NO_FLAGS_SET		  H5C__NO_FLAGS_SET
+#define H5AC__SET_FLUSH_MARKER_FLAG	  H5C__SET_FLUSH_MARKER_FLAG
+#define H5AC__DELETED_FLAG		  H5C__DELETED_FLAG
+#define H5AC__DIRTIED_FLAG		  H5C__DIRTIED_FLAG
+#define H5AC__PIN_ENTRY_FLAG		  H5C__PIN_ENTRY_FLAG
+#define H5AC__UNPIN_ENTRY_FLAG		  H5C__UNPIN_ENTRY_FLAG
+#define H5AC__FLUSH_INVALIDATE_FLAG	  H5C__FLUSH_INVALIDATE_FLAG
+#define H5AC__FLUSH_CLEAR_ONLY_FLAG	  H5C__FLUSH_CLEAR_ONLY_FLAG
+#define H5AC__FLUSH_MARKED_ENTRIES_FLAG   H5C__FLUSH_MARKED_ENTRIES_FLAG
+#define H5AC__FLUSH_IGNORE_PROTECTED_FLAG H5C__FLUSH_IGNORE_PROTECTED_FLAG
+#define H5AC__FREE_FILE_SPACE_FLAG	  H5C__FREE_FILE_SPACE_FLAG
+#define H5AC__TAKE_OWNERSHIP_FLAG         H5C__TAKE_OWNERSHIP_FLAG
+
+
+/* #defines of flags used to report entry status in the
+ * H5AC_get_entry_status() call.
+ */
+
+#define H5AC_ES__IN_CACHE	0x0001
+#define H5AC_ES__IS_DIRTY	0x0002
+#define H5AC_ES__IS_PROTECTED	0x0004
+#define H5AC_ES__IS_PINNED	0x0008
+
+
+/* external function declarations: */
+
+H5_DLL herr_t H5AC_init(void);
+H5_DLL herr_t H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr);
+H5_DLL herr_t H5AC_get_entry_status(const H5F_t *f, haddr_t addr,
+				    unsigned * status_ptr);
+H5_DLL herr_t H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
+                       haddr_t addr, void *thing, unsigned int flags);
+H5_DLL herr_t H5AC_pin_protected_entry(void *thing);
+H5_DLL void * H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
+    haddr_t addr, void *udata, H5AC_protect_t rw);
+H5_DLL herr_t H5AC_resize_entry(void *thing, size_t new_size);
+H5_DLL herr_t H5AC_unpin_entry(void *thing);
+H5_DLL herr_t H5AC_unprotect(H5F_t *f, hid_t dxpl_id,
+                             const H5AC_class_t *type, haddr_t addr,
+			     void *thing, unsigned flags);
+H5_DLL herr_t H5AC_flush(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5AC_mark_entry_dirty(void *thing);
+H5_DLL herr_t H5AC_move_entry(H5F_t *f, const H5AC_class_t *type,
+			   haddr_t old_addr, haddr_t new_addr);
+
+H5_DLL herr_t H5AC_dest(H5F_t *f, hid_t dxpl_id);
+
+H5_DLL herr_t H5AC_expunge_entry(H5F_t *f, hid_t dxpl_id,
+                                 const H5AC_class_t *type, haddr_t addr,
+                                 unsigned flags);
+
+H5_DLL herr_t H5AC_set_sync_point_done_callback(H5C_t *cache_ptr,
+    void (*sync_point_done)(int num_writes, haddr_t *written_entries_tbl));
+
+H5_DLL herr_t H5AC_set_write_done_callback(H5C_t * cache_ptr,
+                                           void (* write_done)(void));
+H5_DLL herr_t H5AC_stats(const H5F_t *f);
+
+H5_DLL herr_t H5AC_dump_cache(const H5F_t *f);
+
+H5_DLL herr_t H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr,
+                                               H5AC_cache_config_t *config_ptr);
+
+H5_DLL herr_t H5AC_get_cache_size(H5AC_t * cache_ptr,
+                                  size_t * max_size_ptr,
+                                  size_t * min_clean_size_ptr,
+                                  size_t * cur_size_ptr,
+                                  int32_t * cur_num_entries_ptr);
+
+H5_DLL herr_t H5AC_get_cache_hit_rate(H5AC_t * cache_ptr,
+                                      double * hit_rate_ptr);
+
+H5_DLL herr_t H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr);
+
+H5_DLL herr_t H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr,
+                                               H5AC_cache_config_t *config_ptr);
+
+H5_DLL herr_t H5AC_validate_config(H5AC_cache_config_t * config_ptr);
+
+H5_DLL herr_t H5AC_close_trace_file( H5AC_t * cache_ptr);
+
+H5_DLL herr_t H5AC_open_trace_file(H5AC_t * cache_ptr,
+		                   const char * trace_file_name);
+
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5AC_add_candidate(H5AC_t * cache_ptr, haddr_t addr);
+#endif /* H5_HAVE_PARALLEL */
+
+#endif /* !_H5ACprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5ACpublic.h b/gatb-core/thirdparty/hdf5/src/H5ACpublic.h
new file mode 100644
index 0000000..639179c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5ACpublic.h
@@ -0,0 +1,508 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5ACpublic.h
+ *                      Jul 10 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public include file for cache functions.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5ACpublic_H
+#define _H5ACpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Cpublic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****************************************************************************
+ *
+ * structure H5AC_cache_config_t
+ *
+ * H5AC_cache_config_t is a public structure intended for use in public APIs.
+ * At least in its initial incarnation, it is basicaly a copy of struct
+ * H5C_auto_size_ctl_t, minus the report_fcn field, and plus the
+ * dirty_bytes_threshold field.
+ *
+ * The report_fcn field is omitted, as including it would require us to
+ * make H5C_t structure public.
+ *
+ * The dirty_bytes_threshold field does not appear in H5C_auto_size_ctl_t,
+ * as synchronization between caches on different processes is handled at
+ * the H5AC level, not at the level of H5C.  Note however that there is
+ * considerable interaction between this value and the other fields in this
+ * structure.
+ *
+ * Similarly, the open_trace_file, close_trace_file, and trace_file_name
+ * fields do not appear in H5C_auto_size_ctl_t, as most trace file
+ * issues are handled at the H5AC level.  The one exception is storage of
+ * the pointer to the trace file, which is handled by H5C.
+ *
+ * The structure is in H5ACpublic.h as we may wish to allow different
+ * configuration options for metadata and raw data caches.
+ *
+ * The fields of the structure are discussed individually below:
+ *
+ * version: Integer field containing the version number of this version
+ *      of the H5AC_cache_config_t structure.  Any instance of
+ *      H5AC_cache_config_t passed to the cache must have a known
+ *      version number, or an error will be flagged.
+ *
+ * rpt_fcn_enabled: Boolean field used to enable and disable the default
+ *	reporting function.  This function is invoked every time the
+ *	automatic cache resize code is run, and reports on its activities.
+ *
+ *	This is a debugging function, and should normally be turned off.
+ *
+ * open_trace_file: Boolean field indicating whether the trace_file_name
+ * 	field should be used to open a trace file for the cache.
+ *
+ * 	The trace file is a debuging feature that allow the capture of
+ * 	top level metadata cache requests for purposes of debugging and/or
+ * 	optimization.  This field should normally be set to FALSE, as
+ * 	trace file collection imposes considerable overhead.
+ *
+ * 	This field should only be set to TRUE when the trace_file_name
+ * 	contains the full path of the desired trace file, and either
+ * 	there is no open trace file on the cache, or the close_trace_file
+ * 	field is also TRUE.
+ *
+ * close_trace_file: Boolean field indicating whether the current trace
+ * 	file (if any) should be closed.
+ *
+ * 	See the above comments on the open_trace_file field.  This field
+ * 	should be set to FALSE unless there is an open trace file on the
+ * 	cache that you wish to close.
+ *
+ * trace_file_name: Full path of the trace file to be opened if the
+ * 	open_trace_file field is TRUE.
+ *
+ * 	In the parallel case, an ascii representation of the mpi rank of
+ * 	the process will be appended to the file name to yield a unique
+ * 	trace file name for each process.
+ *
+ * 	The length of the path must not exceed H5AC__MAX_TRACE_FILE_NAME_LEN
+ * 	characters.
+ *
+ * evictions_enabled:  Boolean field used to either report the current
+ * 	evictions enabled status of the cache, or to set the cache's
+ *	evictions enabled status.
+ *
+ * 	In general, the metadata cache should always be allowed to
+ * 	evict entries.  However, in some cases it is advantageous to
+ * 	disable evictions briefly, and thereby postpone metadata
+ * 	writes.  However, this must be done with care, as the cache
+ * 	can grow quickly.  If you do this, re-enable evictions as
+ * 	soon as possible and monitor cache size.
+ *
+ * 	At present, evictions can only be disabled if automatic
+ * 	cache resizing is also disabled (that is, ( incr_mode ==
+ *	H5C_incr__off ) && ( decr_mode == H5C_decr__off )).  There
+ *	is no logical reason why this should be so, but it simplifies
+ *	implementation and testing, and I can't think of any reason
+ *	why it would be desireable.  If you can think of one, I'll
+ *	revisit the issue.
+ *
+ * set_initial_size: Boolean flag indicating whether the size of the
+ *      initial size of the cache is to be set to the value given in
+ *      the initial_size field.  If set_initial_size is FALSE, the
+ *      initial_size field is ignored.
+ *
+ * initial_size: If enabled, this field contain the size the cache is
+ *      to be set to upon receipt of this structure.  Needless to say,
+ *      initial_size must lie in the closed interval [min_size, max_size].
+ *
+ * min_clean_fraction: double in the range 0 to 1 indicating the fraction
+ *      of the cache that is to be kept clean.  This field is only used
+ *      in parallel mode.  Typical values are 0.1 to 0.5.
+ *
+ * max_size: Maximum size to which the cache can be adjusted.  The
+ *      supplied value must fall in the closed interval
+ *      [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE].  Also, max_size must
+ *      be greater than or equal to min_size.
+ *
+ * min_size: Minimum size to which the cache can be adjusted.  The
+ *      supplied value must fall in the closed interval
+ *      [H5C__MIN_MAX_CACHE_SIZE, H5C__MAX_MAX_CACHE_SIZE].  Also, min_size
+ *      must be less than or equal to max_size.
+ *
+ * epoch_length: Number of accesses on the cache over which to collect
+ *      hit rate stats before running the automatic cache resize code,
+ *      if it is enabled.
+ *
+ *      At the end of an epoch, we discard prior hit rate data and start
+ *      collecting afresh.  The epoch_length must lie in the closed
+ *      interval [H5C__MIN_AR_EPOCH_LENGTH, H5C__MAX_AR_EPOCH_LENGTH].
+ *
+ *
+ * Cache size increase control fields:
+ *
+ * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose
+ *      value indicates how we determine whether the cache size should be
+ *      increased.  At present there are two possible values:
+ *
+ *      H5C_incr__off:  Don't attempt to increase the size of the cache
+ *              automatically.
+ *
+ *              When this increment mode is selected, the remaining fields
+ *              in the cache size increase section ar ignored.
+ *
+ *      H5C_incr__threshold: Attempt to increase the size of the cache
+ *              whenever the average hit rate over the last epoch drops
+ *              below the value supplied in the lower_hr_threshold
+ *              field.
+ *
+ *              Note that this attempt will fail if the cache is already
+ *              at its maximum size, or if the cache is not already using
+ *              all available space.
+ *
+ *      Note that you must set decr_mode to H5C_incr__off if you
+ *      disable metadata cache entry evictions.
+ *
+ * lower_hr_threshold: Lower hit rate threshold.  If the increment mode
+ *      (incr_mode) is H5C_incr__threshold and the hit rate drops below the
+ *      value supplied in this field in an epoch, increment the cache size by
+ *      size_increment.  Note that cache size may not be incremented above
+ *      max_size, and that the increment may be further restricted by the
+ *      max_increment field if it is enabled.
+ *
+ *      When enabled, this field must contain a value in the range [0.0, 1.0].
+ *      Depending on the incr_mode selected, it may also have to be less than
+ *      upper_hr_threshold.
+ *
+ * increment:  Double containing the multiplier used to derive the new
+ *      cache size from the old if a cache size increment is triggered.
+ *      The increment must be greater than 1.0, and should not exceed 2.0.
+ *
+ *      The new cache size is obtained my multiplying the current max cache
+ *      size by the increment, and then clamping to max_size and to stay
+ *      within the max_increment as necessary.
+ *
+ * apply_max_increment:  Boolean flag indicating whether the max_increment
+ *      field should be used to limit the maximum cache size increment.
+ *
+ * max_increment: If enabled by the apply_max_increment field described
+ *      above, this field contains the maximum number of bytes by which the
+ *      cache size can be increased in a single re-size.
+ *
+ * flash_incr_mode:  Instance of the H5C_cache_flash_incr_mode enumerated
+ *      type whose value indicates whether and by which algorithm we should
+ *      make flash increases in the size of the cache to accomodate insertion
+ *      of large entries and large increases in the size of a single entry.
+ *
+ *      The addition of the flash increment mode was occasioned by performance
+ *      problems that appear when a local heap is increased to a size in excess
+ *      of the current cache size.  While the existing re-size code dealt with
+ *      this eventually, performance was very bad for the remainder of the
+ *      epoch.
+ *
+ *      At present, there are two possible values for the flash_incr_mode:
+ *
+ *      H5C_flash_incr__off:  Don't perform flash increases in the size of
+ *              the cache.
+ *
+ *      H5C_flash_incr__add_space:  Let x be either the size of a newly
+ *              newly inserted entry, or the number of bytes by which the
+ *              size of an existing entry has been increased.
+ *
+ *              If
+ *                      x > flash_threshold * current max cache size,
+ *
+ *              increase the current maximum cache size by x * flash_multiple
+ *              less any free space in the cache, and star a new epoch.  For
+ *              now at least, pay no attention to the maximum increment.
+ *
+ *      In both of the above cases, the flash increment pays no attention to
+ *      the maximum increment (at least in this first incarnation), but DOES
+ *      stay within max_size.
+ *
+ *      With a little thought, it should be obvious that the above flash
+ *      cache size increase algorithm is not sufficient for all circumstances
+ *      -- for example, suppose the user round robins through
+ *      (1/flash_threshold) +1 groups, adding one data set to each on each
+ *      pass.  Then all will increase in size at about the same time, requiring
+ *      the max cache size to at least double to maintain acceptable
+ *      performance, however the above flash increment algorithm will not be
+ *      triggered.
+ *
+ *      Hopefully, the add space algorithms detailed above will be sufficient
+ *      for the performance problems encountered to date.  However, we should
+ *      expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ *      H5C_flash_incr__add_space section of the discussion of the
+ *      flash_incr_mode section.  This field is ignored unless flash_incr_mode
+ *      is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache
+ *      size is multiplied to obtain the size threshold for the add_space flash
+ *      increment algorithm.  The field is ignored unless flash_incr_mode is
+ *      H5C_flash_incr__add_space.
+ *
+ *
+ * Cache size decrease control fields:
+ *
+ * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose
+ *      value indicates how we determine whether the cache size should be
+ *      decreased.  At present there are four possibilities.
+ *
+ *      H5C_decr__off:  Don't attempt to decrease the size of the cache
+ *              automatically.
+ *
+ *              When this increment mode is selected, the remaining fields
+ *              in the cache size decrease section are ignored.
+ *
+ *      H5C_decr__threshold: Attempt to decrease the size of the cache
+ *              whenever the average hit rate over the last epoch rises
+ *              above the value supplied in the upper_hr_threshold
+ *              field.
+ *
+ *      H5C_decr__age_out:  At the end of each epoch, search the cache for
+ *              entries that have not been accessed for at least the number
+ *              of epochs specified in the epochs_before_eviction field, and
+ *              evict these entries.  Conceptually, the maximum cache size
+ *              is then decreased to match the new actual cache size.  However,
+ *              this reduction may be modified by the min_size, the
+ *              max_decrement, and/or the empty_reserve.
+ *
+ *      H5C_decr__age_out_with_threshold:  Same as age_out, but we only
+ *              attempt to reduce the cache size when the hit rate observed
+ *              over the last epoch exceeds the value provided in the
+ *              upper_hr_threshold field.
+ *
+ *      Note that you must set decr_mode to H5C_decr__off if you
+ *      disable metadata cache entry evictions.
+ *
+ * upper_hr_threshold: Upper hit rate threshold.  The use of this field
+ *      varies according to the current decr_mode:
+ *
+ *      H5C_decr__off or H5C_decr__age_out:  The value of this field is
+ *              ignored.
+ *
+ *      H5C_decr__threshold:  If the hit rate exceeds this threshold in any
+ *              epoch, attempt to decrement the cache size by size_decrement.
+ *
+ *              Note that cache size may not be decremented below min_size.
+ *
+ *              Note also that if the upper_threshold is 1.0, the cache size
+ *              will never be reduced.
+ *
+ *      H5C_decr__age_out_with_threshold:  If the hit rate exceeds this
+ *              threshold in any epoch, attempt to reduce the cache size
+ *              by evicting entries that have not been accessed for more
+ *              than the specified number of epochs.
+ *
+ * decrement: This field is only used when the decr_mode is
+ *      H5C_decr__threshold.
+ *
+ *      The field is a double containing the multiplier used to derive the
+ *      new cache size from the old if a cache size decrement is triggered.
+ *      The decrement must be in the range 0.0 (in which case the cache will
+ *      try to contract to its minimum size) to 1.0 (in which case the
+ *      cache will never shrink).
+ *
+ * apply_max_decrement:  Boolean flag used to determine whether decrements
+ *      in cache size are to be limited by the max_decrement field.
+ *
+ * max_decrement: Maximum number of bytes by which the cache size can be
+ *      decreased in a single re-size.  Note that decrements may also be
+ *      restricted by the min_size of the cache, and (in age out modes) by
+ *      the empty_reserve field.
+ *
+ * epochs_before_eviction:  Integer field used in H5C_decr__age_out and
+ *      H5C_decr__age_out_with_threshold decrement modes.
+ *
+ *      This field contains the number of epochs an entry must remain
+ *      unaccessed before it is evicted in an attempt to reduce the
+ *      cache size.  If applicable, this field must lie in the range
+ *      [1, H5C__MAX_EPOCH_MARKERS].
+ *
+ * apply_empty_reserve:  Boolean field controlling whether the empty_reserve
+ *      field is to be used in computing the new cache size when the
+ *      decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold.
+ *
+ * empty_reserve:  To avoid a constant racheting down of cache size by small
+ *      amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold
+ *      modes, this field allows one to require that any cache size
+ *      reductions leave the specified fraction of unused space in the cache.
+ *
+ *      The value of this field must be in the range [0.0, 1.0].  I would
+ *      expect typical values to be in the range of 0.01 to 0.1.
+ *
+ *
+ * Parallel Configuration Fields:
+ *
+ * In PHDF5, all operations that modify metadata must be executed collectively.
+ *
+ * We used to think that this was enough to ensure consistency across the
+ * metadata caches, but since we allow processes to read metadata individually,
+ * the order of dirty entries in the LRU list can vary across processes,
+ * which can result in inconsistencies between the caches.
+ *
+ * PHDF5 uses several strategies to prevent such inconsistencies in metadata,
+ * all of which use the fact that the same stream of dirty metadata is seen
+ * by all processes for purposes of synchronization.  This is done by 
+ * having each process count the number of bytes of dirty metadata generated,
+ * and then running a "sync point" whenever this count exceeds a user 
+ * specified threshold (see dirty_bytes_threshold below).
+ *
+ * The current metadata write strategy is indicated by the 
+ * metadata_write_strategy field.  The possible values of this field, along
+ * with the associated metadata write strategies are discussed below.
+ *
+ * dirty_bytes_threshold:  Threshold of dirty byte creation used to
+ * 	synchronize updates between caches. (See above for outline and
+ *	motivation.)
+ *
+ *	This value MUST be consistant across all processes accessing the
+ *	file.  This field is ignored unless HDF5 has been compiled for
+ *	parallel.
+ *
+ * metadata_write_strategy: Integer field containing a code indicating the
+ *	desired metadata write strategy.  The valid values of this field
+ *	are enumerated and discussed below:
+ *
+ *
+ *	H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
+ *
+ *	When metadata_write_strategy is set to this value, only process 
+ *	zero is allowed to write dirty metadata to disk.  All other 
+ *	processes must retain dirty metadata until they are informed at
+ *	a sync point that the dirty metadata in question has been written
+ *	to disk.
+ *
+ *	When the sync point is reached (or when there is a user generated
+ *	flush), process zero flushes sufficient entries to bring it into
+ *	complience with its min clean size (or flushes all dirty entries in
+ *	the case of a user generated flush), broad casts the list of 
+ *	entries just cleaned to all the other processes, and then exits
+ *	the sync point.
+ *
+ *	Upon receipt of the broadcast, the other processes mark the indicated
+ *	entries as clean, and leave the sync point as well.
+ *
+ *
+ *	H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
+ *
+ *	In the distributed metadata write strategy, process zero still makes
+ *	the decisions as to what entries should be flushed, but the actual 
+ *	flushes are distributed across the processes in the computation to 
+ *	the extent possible.
+ *
+ *	In this strategy, when a sync point is triggered (either by dirty
+ *	metadata creation or manual flush), all processes enter a barrier.
+ *
+ *	On the other side of the barrier, process 0 constructs an ordered
+ *	list of the entries to be flushed, and then broadcasts this list
+ *	to the caches in all the processes.
+ *
+ *	All processes then scan the list of entries to be flushed, flushing
+ *	some, and marking the rest as clean.  The algorithm for this purpose
+ *	ensures that each entry in the list is flushed exactly once, and 
+ *	all are marked clean in each cache.
+ *
+ *	Note that in the case of a flush of the cache, no message passing
+ *	is necessary, as all processes have the same list of dirty entries, 
+ *	and all of these entries must be flushed.  Thus in this case it is 
+ *	sufficient for each process to sort its list of dirty entries after 
+ *	leaving the initial barrier, and use this list as if it had been 
+ *	received from process zero.
+ *
+ *	To avoid possible messages from the past/future, all caches must
+ *	wait until all caches are done before leaving the sync point.
+ *      
+ ****************************************************************************/
+
+#define H5AC__CURR_CACHE_CONFIG_VERSION 	1
+#define H5AC__MAX_TRACE_FILE_NAME_LEN		1024
+
+#define H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY    0
+#define H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED       1
+
+typedef struct H5AC_cache_config_t
+{
+    /* general configuration fields: */
+    int                      version;
+
+    hbool_t		     rpt_fcn_enabled;
+
+    hbool_t		     open_trace_file;
+    hbool_t                  close_trace_file;
+    char                     trace_file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + 1];
+
+    hbool_t                  evictions_enabled;
+
+    hbool_t                  set_initial_size;
+    size_t                   initial_size;
+
+    double                   min_clean_fraction;
+
+    size_t                   max_size;
+    size_t                   min_size;
+
+    long int                 epoch_length;
+
+
+    /* size increase control fields: */
+    enum H5C_cache_incr_mode incr_mode;
+
+    double                   lower_hr_threshold;
+
+    double                   increment;
+
+    hbool_t                  apply_max_increment;
+    size_t                   max_increment;
+
+    enum H5C_cache_flash_incr_mode      flash_incr_mode;
+    double                              flash_multiple;
+    double                              flash_threshold;
+
+
+    /* size decrease control fields: */
+    enum H5C_cache_decr_mode decr_mode;
+
+    double                   upper_hr_threshold;
+
+    double                   decrement;
+
+    hbool_t                  apply_max_decrement;
+    size_t                   max_decrement;
+
+    int                      epochs_before_eviction;
+
+    hbool_t                  apply_empty_reserve;
+    double                   empty_reserve;
+
+
+    /* parallel configuration fields: */
+    int                      dirty_bytes_threshold;
+    int                      metadata_write_strategy;
+
+} H5AC_cache_config_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5Abtree2.c b/gatb-core/thirdparty/hdf5/src/H5Abtree2.c
new file mode 100644
index 0000000..483c329
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Abtree2.c
@@ -0,0 +1,554 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Abtree2.c
+ *			Dec  4 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		v2 B-tree callbacks for indexing attributes on objects
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5SMprivate.h"	/* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/*
+ * Data exchange structure for dense attribute storage.  This structure is
+ * passed through the fractal heap layer to compare attributes.
+ */
+typedef struct H5A_fh_ud_cmp_t {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    const char  *name;                  /* Name of attribute to compare      */
+    const H5A_dense_bt2_name_rec_t *record;     /* v2 B-tree record for attribute */
+    H5A_bt2_found_t found_op;           /* Callback when correct attribute is found */
+    void        *found_op_data;         /* Callback data when correct attribute is found */
+
+    /* upward */
+    int         cmp;                    /* Comparison of two attribute names */
+} H5A_fh_ud_cmp_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* v2 B-tree function callbacks */
+
+/* v2 B-tree driver callbacks for 'creation order' index */
+static herr_t H5A_dense_btree2_corder_store(void *native, const void *udata);
+static herr_t H5A_dense_btree2_corder_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5A_dense_btree2_corder_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5A_dense_btree2_corder_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5A_dense_btree2_corder_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+/* v2 B-tree driver callbacks for 'name' index */
+static herr_t H5A_dense_btree2_name_store(void *native, const void *udata);
+static herr_t H5A_dense_btree2_name_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5A_dense_btree2_name_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5A_dense_btree2_name_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5A_dense_btree2_name_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+/* Fractal heap function callbacks */
+static herr_t H5A_dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+/* v2 B-tree class for indexing 'name' field of attributes */
+const H5B2_class_t H5A_BT2_NAME[1]={{  /* B-tree class information */
+    H5B2_ATTR_DENSE_NAME_ID,           /* Type of B-tree */
+    "H5B2_ATTR_DENSE_NAME_ID",         /* Name of B-tree class */
+    sizeof(H5A_dense_bt2_name_rec_t),  /* Size of native record */
+    NULL,                              /* Create client callback context */
+    NULL,                              /* Destroy client callback context */
+    H5A_dense_btree2_name_store,       /* Record storage callback */
+    H5A_dense_btree2_name_compare,     /* Record comparison callback */
+    H5A_dense_btree2_name_encode,      /* Record encoding callback */
+    H5A_dense_btree2_name_decode,      /* Record decoding callback */
+    H5A_dense_btree2_name_debug,       /* Record debugging callback */
+    NULL,                              /* Create debugging context */
+    NULL                               /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for indexing 'creation order' field of attributes */
+const H5B2_class_t H5A_BT2_CORDER[1]={{ /* B-tree class information */
+    H5B2_ATTR_DENSE_CORDER_ID,         /* Type of B-tree */
+    "H5B2_ATTR_DENSE_CORDER_ID",       /* Name of B-tree class */
+    sizeof(H5A_dense_bt2_corder_rec_t),/* Size of native record */
+    NULL,                              /* Create client callback context */
+    NULL,                              /* Destroy client callback context */
+    H5A_dense_btree2_corder_store,     /* Record storage callback */
+    H5A_dense_btree2_corder_compare,   /* Record comparison callback */
+    H5A_dense_btree2_corder_encode,    /* Record encoding callback */
+    H5A_dense_btree2_corder_decode,    /* Record decoding callback */
+    H5A_dense_btree2_corder_debug,     /* Record debugging callback */
+    NULL,                              /* Create debugging context */
+    NULL                               /* Destroy debugging context */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_fh_name_cmp
+ *
+ * Purpose:	Compares the name of a attribute in a fractal heap to another
+ *              name
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_fh_name_cmp(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5A_fh_ud_cmp_t *udata = (H5A_fh_ud_cmp_t *)_udata;         /* User data for 'op' callback */
+    H5A_t *attr = NULL;                 /* Pointer to attribute created from heap object */
+    hbool_t took_ownership = FALSE;     /* Whether the "found" operator took ownership of the attribute */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode attribute information */
+    if(NULL == (attr = (H5A_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_ATTR_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "can't decode attribute")
+
+    /* Compare the string values */
+    udata->cmp = HDstrcmp(udata->name, attr->shared->name);
+
+    /* Check for correct attribute & callback to make */
+    if(udata->cmp == 0 && udata->found_op) {
+        /* Check whether we should "reconstitute" the shared message info */
+        if(udata->record->flags & H5O_MSG_FLAG_SHARED)
+            H5SM_reconstitute(&(attr->sh_loc), udata->f, H5O_ATTR_ID, udata->record->id);
+
+        /* Set the creation order index for the attribute */
+        attr->shared->crt_idx = udata->record->corder;
+
+        /* Make callback */
+        if((udata->found_op)(attr, &took_ownership, udata->found_op_data) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTOPERATE, FAIL, "attribute found callback failed")
+    } /* end if */
+
+done:
+    /* Release the space allocated for the attrbute */
+    if(attr && !took_ownership)
+        H5O_msg_free(H5O_ATTR_ID, attr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_fh_name_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_name_store
+ *
+ * Purpose:	Store user information into native record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_name_store(void *_nrecord, const void *_udata)
+{
+    const H5A_bt2_ud_ins_t *udata = (const H5A_bt2_ud_ins_t *)_udata;
+    H5A_dense_bt2_name_rec_t *nrecord = (H5A_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Copy user information info native record */
+    nrecord->id = udata->id;
+    nrecord->flags = udata->common.flags;
+    nrecord->corder = udata->common.corder;
+    nrecord->hash = udata->common.name_hash;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_name_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_name_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec, int *result)
+{
+    const H5A_bt2_ud_common_t *bt2_udata = (const H5A_bt2_ud_common_t *)_bt2_udata;
+    const H5A_dense_bt2_name_rec_t *bt2_rec = (const H5A_dense_bt2_name_rec_t *)_bt2_rec;
+    herr_t ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(bt2_udata);
+    HDassert(bt2_rec);
+
+    /* Check hash value */
+    if(bt2_udata->name_hash < bt2_rec->hash)
+        *result = (-1);
+    else if(bt2_udata->name_hash > bt2_rec->hash)
+        *result = 1;
+    else {
+        H5A_fh_ud_cmp_t fh_udata;       /* User data for fractal heap 'op' callback */
+        H5HF_t *fheap;                  /* Fractal heap handle to use for finding object */
+
+        /* Sanity check */
+        HDassert(bt2_udata->name_hash == bt2_rec->hash);
+
+        /* Prepare user data for callback */
+        /* down */
+        fh_udata.f = bt2_udata->f;
+        fh_udata.dxpl_id = bt2_udata->dxpl_id;
+        fh_udata.name = bt2_udata->name;
+        fh_udata.record = bt2_rec;
+        fh_udata.found_op = bt2_udata->found_op;
+        fh_udata.found_op_data = bt2_udata->found_op_data;
+
+        /* up */
+        fh_udata.cmp = 0;
+
+        /* Check for attribute in shared storage */
+        if(bt2_rec->flags & H5O_MSG_FLAG_SHARED)
+            fheap = bt2_udata->shared_fheap;
+        else
+            fheap = bt2_udata->fheap;
+        HDassert(fheap);
+
+        /* Check if the user's attribute and the B-tree's attribute have the same name */
+        if(H5HF_op(fheap, bt2_udata->dxpl_id, &bt2_rec->id, H5A_dense_fh_name_cmp, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+        /* Callback will set comparison value */
+        *result = fh_udata.cmp;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_dense_btree2_name_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_name_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    const H5A_dense_bt2_name_rec_t *nrecord = (const H5A_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Encode the record's fields */
+    HDmemcpy(raw, nrecord->id.id, (size_t)H5O_FHEAP_ID_LEN);
+    raw += H5O_FHEAP_ID_LEN;
+    *raw++ = nrecord->flags;
+    UINT32ENCODE(raw, nrecord->corder)
+    UINT32ENCODE(raw, nrecord->hash)
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_name_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_name_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    H5A_dense_bt2_name_rec_t *nrecord = (H5A_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Decode the record's fields */
+    HDmemcpy(nrecord->id.id, raw, (size_t)H5O_FHEAP_ID_LEN);
+    raw += H5O_FHEAP_ID_LEN;
+    nrecord->flags = *raw++;
+    UINT32DECODE(raw, nrecord->corder)
+    UINT32DECODE(raw, nrecord->hash)
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_name_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_name_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_name_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+{
+    const H5A_dense_bt2_name_rec_t *nrecord = (const H5A_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%016Hx, %02x, %u, %08lx}\n", indent, "", fwidth,
+        "Record:",
+        (hsize_t)nrecord->id.val, (unsigned)nrecord->flags, (unsigned)nrecord->corder, (unsigned long)nrecord->hash);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_name_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_corder_store
+ *
+ * Purpose:	Store user information into native record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_corder_store(void *_nrecord, const void *_udata)
+{
+    const H5A_bt2_ud_ins_t *udata = (const H5A_bt2_ud_ins_t *)_udata;
+    H5A_dense_bt2_corder_rec_t *nrecord = (H5A_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Copy user information info native record */
+    nrecord->id = udata->id;
+    nrecord->flags = udata->common.flags;
+    nrecord->corder = udata->common.corder;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_corder_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_corder_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec, int *result)
+{
+    const H5A_bt2_ud_common_t *bt2_udata = (const H5A_bt2_ud_common_t *)_bt2_udata;
+    const H5A_dense_bt2_corder_rec_t *bt2_rec = (const H5A_dense_bt2_corder_rec_t *)_bt2_rec;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(bt2_udata);
+    HDassert(bt2_rec);
+
+    /* Check creation order value */
+    if(bt2_udata->corder < bt2_rec->corder)
+        *result = -1;
+    else if(bt2_udata->corder > bt2_rec->corder)
+        *result = 1;
+    else
+        *result = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_corder_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_corder_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    const H5A_dense_bt2_corder_rec_t *nrecord = (const H5A_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Encode the record's fields */
+    HDmemcpy(raw, nrecord->id.id, (size_t)H5O_FHEAP_ID_LEN);
+    raw += H5O_FHEAP_ID_LEN;
+    *raw++ = nrecord->flags;
+    UINT32ENCODE(raw, nrecord->corder)
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_corder_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_corder_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    H5A_dense_bt2_corder_rec_t *nrecord = (H5A_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Decode the record's fields */
+    HDmemcpy(nrecord->id.id, raw, (size_t)H5O_FHEAP_ID_LEN);
+    raw += H5O_FHEAP_ID_LEN;
+    nrecord->flags = *raw++;
+    UINT32DECODE(raw, nrecord->corder)
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_corder_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_btree2_corder_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_btree2_corder_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+{
+    const H5A_dense_bt2_corder_rec_t *nrecord = (const H5A_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%016Hx, %02x, %u}\n", indent, "", fwidth,
+        "Record:",
+        (hsize_t)nrecord->id.val, (unsigned)nrecord->flags, (unsigned)nrecord->corder);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5A_dense_btree2_corder_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Adense.c b/gatb-core/thirdparty/hdf5/src/H5Adense.c
new file mode 100644
index 0000000..a5d35fc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Adense.c
@@ -0,0 +1,1908 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Adense.c
+ *			Dec  4 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Routines for operating on "dense" attribute storage
+ *                      for an object.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"		/* Object headers			*/
+#include "H5SMprivate.h"	/* Shared object header messages        */
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* v2 B-tree creation macros for 'name' field index */
+#define H5A_NAME_BT2_NODE_SIZE          512
+#define H5A_NAME_BT2_MERGE_PERC         40
+#define H5A_NAME_BT2_SPLIT_PERC         100
+
+/* v2 B-tree creation macros for 'corder' field index */
+#define H5A_CORDER_BT2_NODE_SIZE        512
+#define H5A_CORDER_BT2_MERGE_PERC       40
+#define H5A_CORDER_BT2_SPLIT_PERC       100
+
+/* Size of stack buffer for serialized attributes */
+#define H5A_ATTR_BUF_SIZE               128
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/*
+ * Data exchange structure for dense attribute storage.  This structure is
+ * passed through the v2 B-tree layer when modifying the attribute data value.
+ */
+typedef struct H5A_bt2_od_wrt_t {
+    /* downward */
+    H5F_t  *f;                  /* Pointer to file that fractal heap is in */
+    hid_t dxpl_id;              /* DXPL for operation */
+    H5HF_t *fheap;              /* Fractal heap handle to operate on */
+    H5HF_t *shared_fheap;       /* Fractal heap handle for shared messages */
+    H5A_t  *attr;               /* Attribute to write */
+    haddr_t corder_bt2_addr;    /* v2 B-tree address of creation order index */
+} H5A_bt2_od_wrt_t;
+
+/*
+ * Data exchange structure to pass through the v2 B-tree layer for the
+ * H5B2_iterate function when iterating over densely stored attributes.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    H5HF_t      *shared_fheap;          /* Fractal heap handle for shared messages */
+    hsize_t     count;                  /* # of attributes examined          */
+
+    /* downward (from application) */
+    hid_t       loc_id;                 /* Object ID for application callback */
+    hsize_t     skip;                   /* Number of attributes to skip      */
+    const H5A_attr_iter_op_t *attr_op;  /* Callback for each attribute       */
+    void        *op_data;               /* Callback data for each attribute  */
+
+    /* upward */
+    int         op_ret;                 /* Return value from callback        */
+} H5A_bt2_ud_it_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when copying an attribute stored in densely stored attributes.
+ * (or the shared message heap)
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    const H5A_dense_bt2_name_rec_t *record;     /* v2 B-tree record for attribute */
+
+    /* upward */
+    H5A_t  *attr;                       /* Copy of attribute                 */
+} H5A_fh_ud_cp_t;
+
+/*
+ * Data exchange structure for dense attribute storage.  This structure is
+ * passed through the v2 B-tree layer when removing attributes.
+ */
+typedef struct H5A_bt2_ud_rm_t {
+    /* downward */
+    H5A_bt2_ud_common_t common;         /* Common info for B-tree user data (must be first) */
+    haddr_t corder_bt2_addr;            /* v2 B-tree address of creation order index */
+} H5A_bt2_ud_rm_t;
+
+/*
+ * Data exchange structure for dense attribute storage.  This structure is
+ * passed through the v2 B-tree layer when removing attributes by index.
+ */
+typedef struct H5A_bt2_ud_rmbi_t {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    H5HF_t      *shared_fheap;          /* Fractal heap handle for shared messages */
+    H5_index_t  idx_type;               /* Index type for operation */
+    haddr_t     other_bt2_addr;         /* v2 B-tree address of "other" index */
+} H5A_bt2_ud_rmbi_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_create
+ *
+ * Purpose:	Creates dense attribute storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_create(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo)
+{
+    H5HF_create_t fheap_cparam;         /* Fractal heap creation parameters */
+    H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for names */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+
+    /* Set fractal heap creation parameters */
+/* XXX: Give some control of these to applications? */
+    HDmemset(&fheap_cparam, 0, sizeof(fheap_cparam));
+    fheap_cparam.managed.width = H5O_FHEAP_MAN_WIDTH;
+    fheap_cparam.managed.start_block_size = H5O_FHEAP_MAN_START_BLOCK_SIZE;
+    fheap_cparam.managed.max_direct_size = H5O_FHEAP_MAN_MAX_DIRECT_SIZE;
+    fheap_cparam.managed.max_index = H5O_FHEAP_MAN_MAX_INDEX;
+    fheap_cparam.managed.start_root_rows = H5O_FHEAP_MAN_START_ROOT_ROWS;
+    fheap_cparam.checksum_dblocks = H5O_FHEAP_CHECKSUM_DBLOCKS;
+    fheap_cparam.max_man_size = H5O_FHEAP_MAX_MAN_SIZE;
+
+    /* Create fractal heap for storing attributes */
+    if(NULL == (fheap = H5HF_create(f, dxpl_id, &fheap_cparam)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create fractal heap")
+
+    /* Retrieve the heap's address in the file */
+    if(H5HF_get_heap_addr(fheap, &ainfo->fheap_addr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGETSIZE, FAIL, "can't get fractal heap address")
+#ifdef QAK
+HDfprintf(stderr, "%s: ainfo->fheap_addr = %a\n", FUNC, ainfo->fheap_addr);
+#endif /* QAK */
+
+#ifndef NDEBUG
+{
+    size_t fheap_id_len;                /* Fractal heap ID length */
+
+    /* Retrieve the heap's ID length in the file */
+    if(H5HF_get_id_len(fheap, &fheap_id_len) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGETSIZE, FAIL, "can't get fractal heap ID length")
+    HDassert(fheap_id_len == H5O_FHEAP_ID_LEN);
+#ifdef QAK
+HDfprintf(stderr, "%s: fheap_id_len = %Zu\n", FUNC, fheap_id_len);
+#endif /* QAK */
+}
+#endif /* NDEBUG */
+
+    /* Create the name index v2 B-tree */
+    HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
+    bt2_cparam.cls = H5A_BT2_NAME;
+    bt2_cparam.node_size = (size_t)H5A_NAME_BT2_NODE_SIZE;
+    bt2_cparam.rrec_size = 4 +          /* Name's hash value */
+            4 +                         /* Creation order index */
+            1 +                         /* Message flags */
+            H5O_FHEAP_ID_LEN;           /* Fractal heap ID */
+    bt2_cparam.split_percent = H5A_NAME_BT2_SPLIT_PERC;
+    bt2_cparam.merge_percent = H5A_NAME_BT2_MERGE_PERC;
+    if(NULL == (bt2_name = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create v2 B-tree for name index")
+
+    /* Retrieve the v2 B-tree's address in the file */
+    if(H5B2_get_addr(bt2_name, &ainfo->name_bt2_addr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get v2 B-tree address for name index")
+#ifdef QAK
+HDfprintf(stderr, "%s: ainfo->name_bt2_addr = %a\n", FUNC, ainfo->name_bt2_addr);
+#endif /* QAK */
+
+    /* Check if we should create a creation order index v2 B-tree */
+    if(ainfo->index_corder) {
+        /* Create the creation order index v2 B-tree */
+        HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
+        bt2_cparam.cls = H5A_BT2_CORDER;
+        bt2_cparam.node_size = (size_t)H5A_CORDER_BT2_NODE_SIZE;
+        bt2_cparam.rrec_size = 4 +      /* Creation order index */
+                1 +                     /* Message flags */
+                H5O_FHEAP_ID_LEN;       /* Fractal heap ID */
+        bt2_cparam.split_percent = H5A_CORDER_BT2_SPLIT_PERC;
+        bt2_cparam.merge_percent = H5A_CORDER_BT2_MERGE_PERC;
+        if(NULL == (bt2_corder = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create v2 B-tree for creation order index")
+
+        /* Retrieve the v2 B-tree's address in the file */
+        if(H5B2_get_addr(bt2_corder, &ainfo->corder_bt2_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get v2 B-tree address for creation order index")
+#ifdef QAK
+HDfprintf(stderr, "%s: ainfo->corder_bt2_addr = %a\n", FUNC, ainfo->corder_bt2_addr);
+#endif /* QAK */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_fnd_cb
+ *
+ * Purpose:	Callback when an attribute is located in an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_fnd_cb(const H5A_t *attr, hbool_t *took_ownership, void *_user_attr)
+{
+    H5A_t const **user_attr = (H5A_t const **)_user_attr; /* User data from v2 B-tree attribute lookup */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(attr);
+    HDassert(user_attr);
+
+    /* Take over attribute ownership */
+    *user_attr = attr;
+    *took_ownership = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5A__dense_fnd_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_open
+ *
+ * Purpose:	Open an attribute in dense storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_dense_open(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+{
+    H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    htri_t attr_exists;                 /* Attribute exists in v2 B-tree */
+    H5A_t *ret_value = NULL;            /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(name);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to open fractal heap")
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to open v2 B-tree for name index")
+
+    /* Create the "udata" information for v2 B-tree record find */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.shared_fheap = shared_fheap;
+    udata.name = name;
+    udata.name_hash = H5_checksum_lookup3(name, HDstrlen(name), 0);
+    udata.flags = 0;
+    udata.corder = 0;
+    udata.found_op = H5A__dense_fnd_cb;       /* v2 B-tree comparison callback */
+    udata.found_op_data = &ret_value;
+
+    /* Find & copy the attribute in the 'name' index */
+    if((attr_exists = H5B2_find(bt2_name, dxpl_id, &udata, NULL, NULL)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "can't search for attribute in name index")
+    else if(attr_exists == FALSE)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "can't locate attribute in name index")
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, NULL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, NULL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, NULL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_insert
+ *
+ * Purpose:	Insert an attribute into dense storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, H5A_t *attr)
+{
+    H5A_bt2_ud_ins_t udata;             /* User data for v2 B-tree insertion */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle for attributes */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order index */
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for attribute data */
+    uint8_t attr_buf[H5A_ATTR_BUF_SIZE]; /* Buffer for serializing message */
+    unsigned mesg_flags = 0;            /* Flags for storing message */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(attr);
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+        htri_t shared_mesg;             /* Should this message be stored in the Shared Message table? */
+
+        /* Check if message is already shared */
+        if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error determining if message is shared")
+        else if(shared_mesg > 0)
+            /* Mark the message as shared */
+            mesg_flags |= H5O_MSG_FLAG_SHARED;
+        else {
+            /* Should this attribute be written as a SOHM? */
+            if(H5SM_try_share(f, dxpl_id, NULL, 0, H5O_ATTR_ID, attr, &mesg_flags) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
+
+            /* Attributes can't be "unique be shareable" yet */
+            HDassert(!(mesg_flags & H5O_MSG_FLAG_SHAREABLE));
+        } /* end else */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Check for inserting shared attribute */
+    if(mesg_flags & H5O_MSG_FLAG_SHARED) {
+        /* Sanity check */
+        HDassert(attr_sharable);
+
+        /* Use heap ID for shared message heap */
+        udata.id = attr->sh_loc.u.heap_id;
+    } /* end if */
+    else {
+        void *attr_ptr;         /* Pointer to serialized message */
+        size_t attr_size;       /* Size of serialized attribute in the heap */
+
+        /* Find out the size of buffer needed for serialized message */
+        if((attr_size = H5O_msg_raw_size(f, H5O_ATTR_ID, FALSE, attr)) == 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGETSIZE, FAIL, "can't get message size")
+
+        /* Wrap the local buffer for serialized attributes */
+        if(NULL == (wb = H5WB_wrap(attr_buf, sizeof(attr_buf))))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for attribute */
+        if(NULL == (attr_ptr = H5WB_actual(wb, attr_size)))
+            HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Create serialized form of attribute or shared message */
+        if(H5O_msg_encode(f, H5O_ATTR_ID, FALSE, (unsigned char *)attr_ptr, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute")
+
+        /* Insert the serialized attribute into the fractal heap */
+        /* (sets the heap ID in the user data) */
+        if(H5HF_insert(fheap, dxpl_id, attr_size, attr_ptr, &udata.id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to insert attribute into fractal heap")
+    } /* end else */
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Create the callback information for v2 B-tree record insertion */
+    udata.common.f = f;
+    udata.common.dxpl_id = dxpl_id;
+    udata.common.fheap = fheap;
+    udata.common.shared_fheap = shared_fheap;
+    udata.common.name = attr->shared->name;
+    udata.common.name_hash = H5_checksum_lookup3(attr->shared->name, HDstrlen(attr->shared->name), 0);
+    H5_CHECKED_ASSIGN(udata.common.flags, uint8_t, mesg_flags, unsigned);
+    udata.common.corder = attr->shared->crt_idx;
+    udata.common.found_op = NULL;
+    udata.common.found_op_data = NULL;
+    /* udata.id already set */
+
+    /* Insert attribute into 'name' tracking v2 B-tree */
+    if(H5B2_insert(bt2_name, dxpl_id, &udata) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to insert record into v2 B-tree")
+
+    /* Check if we should create a creation order index v2 B-tree record */
+    if(ainfo->index_corder) {
+        /* Open the creation order index v2 B-tree */
+        HDassert(H5F_addr_defined(ainfo->corder_bt2_addr));
+        if(NULL == (bt2_corder = H5B2_open(f, dxpl_id, ainfo->corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Insert the record into the creation order index v2 B-tree */
+        if(H5B2_insert(bt2_corder, dxpl_id, &udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to insert record into v2 B-tree")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_write_bt2_cb2
+ *
+ * Purpose:	v2 B-tree 'modify' callback to update the record for a creation
+ *		order index
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_write_bt2_cb2(void *_record, void *_op_data, hbool_t *changed)
+{
+    H5A_dense_bt2_corder_rec_t *record = (H5A_dense_bt2_corder_rec_t *)_record; /* Record from B-tree */
+    H5O_fheap_id_t *new_heap_id = (H5O_fheap_id_t *)_op_data;       /* "op data" from v2 B-tree modify */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(record);
+    HDassert(new_heap_id);
+
+    /* Update record's heap ID */
+    record->id = *new_heap_id;
+
+    /* Note that the record changed */
+    *changed = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5A__dense_write_bt2_cb2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_write_bt2_cb
+ *
+ * Purpose:	v2 B-tree 'modify' callback to update the data for an attribute
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_write_bt2_cb(void *_record, void *_op_data, hbool_t *changed)
+{
+    H5A_dense_bt2_name_rec_t *record = (H5A_dense_bt2_name_rec_t *)_record; /* Record from B-tree */
+    H5A_bt2_od_wrt_t *op_data = (H5A_bt2_od_wrt_t *)_op_data;       /* "op data" from v2 B-tree modify */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order index */
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for attribute data */
+    uint8_t attr_buf[H5A_ATTR_BUF_SIZE]; /* Buffer for serializing attribute */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(record);
+    HDassert(op_data);
+
+    /* Check for modifying shared attribute */
+    if(record->flags & H5O_MSG_FLAG_SHARED) {
+        /* Update the shared attribute in the SOHM info */
+        if(H5O_attr_update_shared(op_data->f, op_data->dxpl_id, NULL, op_data->attr, NULL) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute in shared storage")
+
+        /* Update record's heap ID */
+        record->id = op_data->attr->sh_loc.u.heap_id;
+
+        /* Check if we need to modify the creation order index with new heap ID */
+        if(H5F_addr_defined(op_data->corder_bt2_addr)) {
+            H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
+
+            /* Open the creation order index v2 B-tree */
+            if(NULL == (bt2_corder = H5B2_open(op_data->f, op_data->dxpl_id, op_data->corder_bt2_addr, NULL)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+            /* Create the "udata" information for v2 B-tree record modify */
+            udata.f = op_data->f;
+            udata.dxpl_id = op_data->dxpl_id;
+            udata.fheap = NULL;
+            udata.shared_fheap = NULL;
+            udata.name = NULL;
+            udata.name_hash = 0;
+            udata.flags = 0;
+            udata.corder = op_data->attr->shared->crt_idx;
+            udata.found_op = NULL;
+            udata.found_op_data = NULL;
+
+            /* Modify record for creation order index */
+            if(H5B2_modify(bt2_corder, op_data->dxpl_id, &udata, H5A__dense_write_bt2_cb2, &op_data->attr->sh_loc.u.heap_id) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to modify record in v2 B-tree")
+        } /* end if */
+
+        /* Note that the record changed */
+        *changed = TRUE;
+    } /* end if */
+    else {
+        void *attr_ptr;         /* Pointer to serialized message */
+        size_t attr_size;       /* Size of serialized attribute in the heap */
+
+        /* Find out the size of buffer needed for serialized attribute */
+        if((attr_size = H5O_msg_raw_size(op_data->f, H5O_ATTR_ID, FALSE, op_data->attr)) == 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGETSIZE, FAIL, "can't get attribute size")
+
+        /* Wrap the local buffer for serialized attributes */
+        if(NULL == (wb = H5WB_wrap(attr_buf, sizeof(attr_buf))))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for attribute */
+        if(NULL == (attr_ptr = H5WB_actual(wb, attr_size)))
+            HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Create serialized form of attribute */
+        if(H5O_msg_encode(op_data->f, H5O_ATTR_ID, FALSE, (unsigned char *)attr_ptr, op_data->attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute")
+
+/* Sanity check */
+#ifndef NDEBUG
+{
+    size_t obj_len;             /* Length of existing encoded attribute */
+
+    if(H5HF_get_obj_len(op_data->fheap, op_data->dxpl_id, &record->id, &obj_len) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGETSIZE, FAIL, "can't get object size")
+    HDassert(obj_len == attr_size);
+}
+#endif /* NDEBUG */
+        /* Update existing attribute in heap */
+        /* (might be more efficient as fractal heap 'op' callback, but leave that for later -QAK) */
+        if(H5HF_write(op_data->fheap, op_data->dxpl_id, &record->id, changed, attr_ptr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute in heap")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(bt2_corder && H5B2_close(bt2_corder, op_data->dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_write_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_write
+ *
+ * Purpose:	Modify an attribute in dense storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, H5A_t *attr)
+{
+    H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
+    H5A_bt2_od_wrt_t op_data;           /* "Op data" for v2 B-tree modify */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(H5F_addr_defined(ainfo->fheap_addr));
+    HDassert(H5F_addr_defined(ainfo->name_bt2_addr));
+    HDassert(attr);
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Create the "udata" information for v2 B-tree record modify */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.shared_fheap = shared_fheap;
+    udata.name = attr->shared->name;
+    udata.name_hash = H5_checksum_lookup3(attr->shared->name, HDstrlen(attr->shared->name), 0);
+    udata.flags = 0;
+    udata.corder = 0;
+    udata.found_op = NULL;
+    udata.found_op_data = NULL;
+
+    /* Create the "op_data" for the v2 B-tree record 'modify' callback */
+    op_data.f = f;
+    op_data.dxpl_id = dxpl_id;
+    op_data.fheap = fheap;
+    op_data.shared_fheap = shared_fheap;
+    op_data.attr = attr;
+    op_data.corder_bt2_addr = ainfo->corder_bt2_addr;
+
+    /* Modify attribute through 'name' tracking v2 B-tree */
+    if(H5B2_modify(bt2_name, dxpl_id, &udata, H5A__dense_write_bt2_cb, &op_data) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to modify record in v2 B-tree")
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_copy_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator, to make copy of attribute
+ *              for calling routine
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  5 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_copy_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5A_fh_ud_cp_t *udata = (H5A_fh_ud_cp_t *)_udata;       /* User data for fractal heap 'op' callback */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Decode attribute information & keep a copy */
+    /* (we make a copy instead of calling the user/library callback directly in
+     *  this routine because this fractal heap 'op' callback routine is called
+     *  with the direct block protected and if the callback routine invokes an
+     *  HDF5 routine, it could attempt to re-protect that direct block for the
+     *  heap, causing the HDF5 routine called to fail)
+     */
+    if(NULL == (udata->attr = (H5A_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_ATTR_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, FAIL, "can't decode attribute")
+
+    /* Set the creation order index for the attribute */
+    udata->attr->shared->crt_idx = udata->record->corder;
+
+    /* Check whether we should "reconstitute" the shared message info */
+    if(udata->record->flags & H5O_MSG_FLAG_SHARED)
+        H5SM_reconstitute(&(udata->attr->sh_loc), udata->f, H5O_ATTR_ID, udata->record->id);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_copy_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_rename
+ *
+ * Purpose:	Rename an attribute in dense storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  3 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_rename(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *old_name,
+    const char *new_name)
+{
+    H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5A_t *attr_copy = NULL;            /* Copy of attribute to rename */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    htri_t shared_mesg;                 /* Should this message be stored in the Shared Message table? */
+    htri_t attr_exists;                 /* Attribute exists in v2 B-tree */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(old_name);
+    HDassert(new_name);
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Create the "udata" information for v2 B-tree record modify */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.shared_fheap = shared_fheap;
+    udata.name = old_name;
+    udata.name_hash = H5_checksum_lookup3(old_name, HDstrlen(old_name), 0);
+    udata.flags = 0;
+    udata.corder = 0;
+    udata.found_op = H5A__dense_fnd_cb;       /* v2 B-tree comparison callback */
+    udata.found_op_data = &attr_copy;
+
+    /* Get copy of attribute through 'name' tracking v2 B-tree */
+    if((attr_exists = H5B2_find(bt2_name, dxpl_id, &udata, NULL, NULL)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't search for attribute in name index")
+    else if(attr_exists == FALSE)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't locate attribute in name index")
+    HDassert(attr_copy);
+
+    /* Check if message is already shared */
+    if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr_copy)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error determining if message is shared")
+    else if(shared_mesg > 0) {
+        /* Reset shared status of copy */
+        /* (so it will get shared again if necessary) */
+        attr_copy->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
+    } /* end if */
+
+    /* Change name of attribute */
+    H5MM_xfree(attr_copy->shared->name);
+    attr_copy->shared->name = H5MM_xstrdup(new_name);
+
+    /* Recompute the version to encode the attribute with */
+    if(H5A_set_version(f, attr_copy) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "unable to update attribute version")
+
+    /* Insert renamed attribute back into dense storage */
+    /* (Possibly making it shared) */
+    if(H5A_dense_insert(f, dxpl_id, ainfo, attr_copy) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to add to dense storage")
+
+    /* Was this attribute shared? */
+    if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr_copy)) > 0) {
+        hsize_t attr_rc;                /* Attribute's ref count in shared message storage */
+
+        /* Retrieve ref count for shared attribute */
+        if(H5SM_get_refcount(f, dxpl_id, H5O_ATTR_ID, &attr_copy->sh_loc, &attr_rc) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count")
+
+        /* If the newly shared attribute needs to share "ownership" of the shared
+         *      components (ie. its reference count is 1), increment the reference
+         *      count on any shared components of the attribute, so that they won't
+         *      be removed from the file.  (Essentially a "copy on write" operation).
+         *
+         *      *ick* -QAK, 2007/01/08
+         */
+        if(attr_rc == 1) {
+            /* Increment reference count on attribute components */
+            if(H5O_attr_link(f, dxpl_id, NULL, attr_copy) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust attribute link count")
+        } /* end if */
+    } /* end if */
+    else if(shared_mesg == 0) {
+        /* Increment reference count on attribute components */
+        /* (so that they aren't deleted when the attribute is removed shortly) */
+        if(H5O_attr_link(f, dxpl_id, NULL, attr_copy) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust attribute link count")
+    } /* end if */
+    else if(shared_mesg < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
+
+    /* Delete old attribute from dense storage */
+    if(H5A_dense_remove(f, dxpl_id, ainfo, old_name) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute in dense storage")
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(attr_copy)
+        H5O_msg_free(H5O_ATTR_ID, attr_copy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_rename() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_iterate_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense attribute storage iterator
+ *
+ * Return:	H5_ITER_ERROR/H5_ITER_CONT/H5_ITER_STOP
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  5 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_iterate_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5A_dense_bt2_name_rec_t *record = (const H5A_dense_bt2_name_rec_t *)_record; /* Record from B-tree */
+    H5A_bt2_ud_it_t *bt2_udata = (H5A_bt2_ud_it_t *)_bt2_udata;         /* User data for callback */
+    herr_t ret_value = H5_ITER_CONT;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check for skipping attributes */
+    if(bt2_udata->skip > 0)
+        --bt2_udata->skip;
+    else {
+        H5A_fh_ud_cp_t fh_udata;        /* User data for fractal heap 'op' callback */
+        H5HF_t *fheap;                  /* Fractal heap handle for attribute storage */
+
+        /* Check for iterating over shared attribute */
+        if(record->flags & H5O_MSG_FLAG_SHARED)
+            fheap = bt2_udata->shared_fheap;
+        else
+            fheap = bt2_udata->fheap;
+
+        /* Prepare user data for callback */
+        /* down */
+        fh_udata.f = bt2_udata->f;
+        fh_udata.dxpl_id = bt2_udata->dxpl_id;
+        fh_udata.record = record;
+        fh_udata.attr = NULL;
+
+        /* Call fractal heap 'op' routine, to copy the attribute information */
+        if(H5HF_op(fheap, bt2_udata->dxpl_id, &record->id, H5A__dense_copy_fh_cb, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPERATE, H5_ITER_ERROR, "heap op callback failed")
+
+        /* Check which type of callback to make */
+        switch(bt2_udata->attr_op->op_type) {
+            case H5A_ATTR_OP_APP2:
+            {
+                H5A_info_t ainfo;               /* Info for attribute */
+
+                /* Get the attribute information */
+                if(H5A_get_info(fh_udata.attr, &ainfo) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info")
+
+                /* Make the application callback */
+                ret_value = (bt2_udata->attr_op->u.app_op2)(bt2_udata->loc_id, fh_udata.attr->shared->name, &ainfo, bt2_udata->op_data);
+                break;
+            }
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+            case H5A_ATTR_OP_APP:
+                /* Make the application callback */
+                ret_value = (bt2_udata->attr_op->u.app_op)(bt2_udata->loc_id, fh_udata.attr->shared->name, bt2_udata->op_data);
+                break;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+            case H5A_ATTR_OP_LIB:
+                /* Call the library's callback */
+                ret_value = (bt2_udata->attr_op->u.lib_op)(fh_udata.attr, bt2_udata->op_data);
+                break;
+
+            default:
+                HDassert("unknown attribute op type" && 0);
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unsupported attribute op type")
+#endif /* NDEBUG */
+        } /* end switch */
+
+        /* Release the space allocated for the attribute */
+        H5O_msg_free(H5O_ATTR_ID, fh_udata.attr);
+    } /* end else */
+
+    /* Increment the number of attributes passed through */
+    /* (whether we skipped them or not) */
+    bt2_udata->count++;
+
+    /* Check for callback failure and pass along return value */
+    if(ret_value < 0)
+        HERROR(H5E_ATTR, H5E_CANTNEXT, "iteration operator failed");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_iterate_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_iterate
+ *
+ * Purpose:	Iterate over attributes in dense storage structures for an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  5 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id, const H5O_ainfo_t *ainfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_attr,
+    const H5A_attr_iter_op_t *attr_op, void *op_data)
+{
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
+    herr_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(H5F_addr_defined(ainfo->fheap_addr));
+    HDassert(H5F_addr_defined(ainfo->name_bt2_addr));
+    HDassert(attr_op);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Check if "native" order is OK - since names are hashed, getting them
+         *      in strictly increasing or decreasing order requires building a
+         *      table and sorting it.
+         */
+        if(order == H5_ITER_NATIVE) {
+            HDassert(H5F_addr_defined(ainfo->name_bt2_addr));
+            bt2_addr = ainfo->name_bt2_addr;
+        } /* end if */
+        else
+            bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links, a table will be built.
+         */
+        bt2_addr = ainfo->corder_bt2_addr;
+    } /* end else */
+
+    /* Check on iteration order */
+    if(order == H5_ITER_NATIVE && H5F_addr_defined(bt2_addr)) {
+        H5A_bt2_ud_it_t udata;              /* User data for iterator callback */
+        htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Check if attributes are shared in this file */
+        if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+        /* Get handle for shared message heap, if attributes are sharable */
+        if(attr_sharable) {
+            haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+            /* Retrieve the address of the shared message's fractal heap */
+            if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+            /* Check if there are any shared messages currently */
+            if(H5F_addr_defined(shared_fheap_addr)) {
+                /* Open the fractal heap for shared header messages */
+                if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+            } /* end if */
+        } /* end if */
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Construct the user data for v2 B-tree iterator callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.shared_fheap = shared_fheap;
+        udata.loc_id = loc_id;
+        udata.skip = skip;
+        udata.count = 0;
+        udata.attr_op = attr_op;
+        udata.op_data = op_data;
+
+        /* Iterate over the records in the v2 B-tree's "native" order */
+        /* (by hash of name) */
+        if((ret_value = H5B2_iterate(bt2, dxpl_id, H5A__dense_iterate_bt2_cb, &udata)) < 0)
+            HERROR(H5E_ATTR, H5E_BADITER, "attribute iteration failed");
+
+        /* Update the last attribute examined, if requested */
+        if(last_attr)
+            *last_attr = udata.count;
+    } /* end if */
+    else {
+        /* Build the table of attributes for this object */
+        /* (build table using the name index, but sort according to idx_type) */
+        if(H5A_dense_build_table(f, dxpl_id, ainfo, idx_type, order, &atable) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error building table of attributes")
+
+        /* Iterate over attributes in table */
+        if((ret_value = H5A_attr_iterate_table(&atable, skip, last_attr, loc_id, attr_op, op_data)) < 0)
+            HERROR(H5E_ATTR, H5E_CANTNEXT, "iteration operator failed");
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(atable.attrs && H5A_attr_release_table(&atable) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_remove_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense attribute storage record removal
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_remove_bt2_cb(const void *_record, void *_udata)
+{
+    const H5A_dense_bt2_name_rec_t *record = (const H5A_dense_bt2_name_rec_t *)_record;
+    H5A_bt2_ud_rm_t *udata = (H5A_bt2_ud_rm_t *)_udata;         /* User data for callback */
+    H5A_t *attr = *(H5A_t **)udata->common.found_op_data;  /* Pointer to attribute to remove */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order index */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check for removing the link from the creation order index */
+    if(H5F_addr_defined(udata->corder_bt2_addr)) {
+        /* Open the creation order index v2 B-tree */
+        if(NULL == (bt2_corder = H5B2_open(udata->common.f, udata->common.dxpl_id, udata->corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Set up the user data for the v2 B-tree 'record remove' callback */
+        udata->common.corder = attr->shared->crt_idx;
+
+        /* Remove the record from the creation order index v2 B-tree */
+        if(H5B2_remove(bt2_corder, udata->common.dxpl_id, udata, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove attribute from creation order index v2 B-tree")
+    } /* end if */
+
+    /* Check for removing shared attribute */
+    if(record->flags & H5O_MSG_FLAG_SHARED) {
+        /* Decrement the reference count on the shared attribute message */
+        if(H5SM_delete(udata->common.f, udata->common.dxpl_id, NULL, &(attr->sh_loc)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to delete shared attribute")
+    } /* end if */
+    else {
+        /* Perform the deletion action on the attribute */
+        /* (takes care of shared & committed datatype/dataspace components) */
+        if(H5O_attr_delete(udata->common.f, udata->common.dxpl_id, NULL, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+
+        /* Remove record from fractal heap */
+        if(H5HF_remove(udata->common.fheap, udata->common.dxpl_id, &record->id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove attribute from fractal heap")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(bt2_corder && H5B2_close(bt2_corder, udata->common.dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_remove_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_remove
+ *
+ * Purpose:	Remove an attribute from the dense storage of an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+{
+    H5A_bt2_ud_rm_t udata;              /* User data for v2 B-tree record removal */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5A_t *attr_copy = NULL;            /* Copy of attribute to remove */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(name && *name);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Set up the user data for the v2 B-tree 'record remove' callback */
+    udata.common.f = f;
+    udata.common.dxpl_id = dxpl_id;
+    udata.common.fheap = fheap;
+    udata.common.shared_fheap = shared_fheap;
+    udata.common.name = name;
+    udata.common.name_hash = H5_checksum_lookup3(name, HDstrlen(name), 0);
+    udata.common.found_op = H5A__dense_fnd_cb;       /* v2 B-tree comparison callback */
+    udata.common.found_op_data = &attr_copy;
+    udata.corder_bt2_addr = ainfo->corder_bt2_addr;
+
+    /* Remove the record from the name index v2 B-tree */
+    if(H5B2_remove(bt2_name, dxpl_id, &udata, H5A__dense_remove_bt2_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove attribute from name index v2 B-tree")
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(attr_copy)
+        H5O_msg_free_real(H5O_MSG_ATTR, attr_copy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_remove_by_idx_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense attribute storage record removal by index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 14 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_remove_by_idx_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    H5HF_t *fheap;                      /* Fractal heap handle */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    const H5A_dense_bt2_name_rec_t *record = (const H5A_dense_bt2_name_rec_t *)_record; /* v2 B-tree record */
+    H5A_bt2_ud_rmbi_t *bt2_udata = (H5A_bt2_ud_rmbi_t *)_bt2_udata;         /* User data for callback */
+    H5A_fh_ud_cp_t fh_udata;            /* User data for fractal heap 'op' callback */
+    H5O_shared_t sh_loc;                /* Shared message info for attribute */
+    hbool_t use_sh_loc;                 /* Whether to use the attribute's shared location or the separate one */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Set up the user data for fractal heap 'op' callback */
+    fh_udata.f = bt2_udata->f;
+    fh_udata.dxpl_id = bt2_udata->dxpl_id;
+    fh_udata.record = record;
+    fh_udata.attr = NULL;
+
+    /* Get correct fractal heap handle to use for operations */
+    if(record->flags & H5O_MSG_FLAG_SHARED)
+        fheap = bt2_udata->shared_fheap;
+    else
+        fheap = bt2_udata->fheap;
+
+    /* Check whether to make a copy of the attribute or just need the shared location info */
+    if(H5F_addr_defined(bt2_udata->other_bt2_addr) || !(record->flags & H5O_MSG_FLAG_SHARED)) {
+        /* Call fractal heap 'op' routine, to make copy of attribute to remove */
+        if(H5HF_op(fheap, bt2_udata->dxpl_id, &record->id, H5A__dense_copy_fh_cb, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPERATE, FAIL, "attribute removal callback failed")
+        HDassert(fh_udata.attr);
+
+        /* Use the attribute's shared location */
+        use_sh_loc = FALSE;
+    } /* end if */
+    else {
+        /* Create a shared message location from the heap ID for this record */
+        H5SM_reconstitute(&sh_loc, bt2_udata->f, H5O_ATTR_ID, record->id);
+
+        /* Use the separate shared location */
+        use_sh_loc = TRUE;
+    } /* end else */
+
+    /* Check for removing the link from the "other" index (creation order, when name used and vice versa) */
+    if(H5F_addr_defined(bt2_udata->other_bt2_addr)) {
+        H5A_bt2_ud_common_t other_bt2_udata;    /* Info for B-tree callbacks */
+
+        /* Determine the index being used */
+        if(bt2_udata->idx_type == H5_INDEX_NAME) {
+            /* Set up the user data for the v2 B-tree 'record remove' callback */
+            other_bt2_udata.corder = fh_udata.attr->shared->crt_idx;
+        } /* end if */
+        else {
+            HDassert(bt2_udata->idx_type == H5_INDEX_CRT_ORDER);
+
+            /* Set up the user data for the v2 B-tree 'record remove' callback */
+            other_bt2_udata.f = bt2_udata->f;
+            other_bt2_udata.dxpl_id = bt2_udata->dxpl_id;
+            other_bt2_udata.fheap = bt2_udata->fheap;
+            other_bt2_udata.shared_fheap = bt2_udata->shared_fheap;
+            other_bt2_udata.name = fh_udata.attr->shared->name;
+            other_bt2_udata.name_hash = H5_checksum_lookup3(fh_udata.attr->shared->name, HDstrlen(fh_udata.attr->shared->name), 0);
+            other_bt2_udata.found_op = NULL;
+            other_bt2_udata.found_op_data = NULL;
+        } /* end else */
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(bt2_udata->f, bt2_udata->dxpl_id, bt2_udata->other_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Set the common information for the v2 B-tree remove operation */
+
+        /* Remove the record from the "other" index v2 B-tree */
+        if(H5B2_remove(bt2, bt2_udata->dxpl_id, &other_bt2_udata, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove record from 'other' index v2 B-tree")
+    } /* end if */
+
+    /* Check for removing shared attribute */
+    if(record->flags & H5O_MSG_FLAG_SHARED) {
+        H5O_shared_t *sh_loc_ptr;       /* Pointer to shared message info for attribute */
+
+        /* Set up pointer to correct shared location */
+        if(use_sh_loc)
+            sh_loc_ptr = &sh_loc;
+        else
+            sh_loc_ptr = &(fh_udata.attr->sh_loc);
+
+        /* Decrement the reference count on the shared attribute message */
+        if(H5SM_delete(bt2_udata->f, bt2_udata->dxpl_id, NULL, sh_loc_ptr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to delete shared attribute")
+    } /* end if */
+    else {
+        /* Perform the deletion action on the attribute */
+        /* (takes care of shared & committed datatype/dataspace components) */
+        if(H5O_attr_delete(bt2_udata->f, bt2_udata->dxpl_id, NULL, fh_udata.attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+
+        /* Remove record from fractal heap */
+        if(H5HF_remove(fheap, bt2_udata->dxpl_id, &record->id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove attribute from fractal heap")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(bt2 && H5B2_close(bt2, bt2_udata->dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(fh_udata.attr)
+        H5O_msg_free(H5O_ATTR_ID, fh_udata.attr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_remove_by_idx_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_remove_by_idx
+ *
+ * Purpose:	Remove an attribute from the dense storage of an object,
+ *		according to the order within an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 14 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n)
+{
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t bt2_addr;                   /* Address of v2 B-tree to use for operation */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Check if "native" order is OK - since names are hashed, getting them
+         *      in strictly increasing or decreasing order requires building a
+         *      table and sorting it.
+         */
+        if(order == H5_ITER_NATIVE) {
+            bt2_addr = ainfo->name_bt2_addr;
+            HDassert(H5F_addr_defined(bt2_addr));
+        } /* end if */
+        else
+            bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links, a table will be built.
+         */
+        bt2_addr = ainfo->corder_bt2_addr;
+    } /* end else */
+
+    /* If there is an index defined for the field, use it */
+    if(H5F_addr_defined(bt2_addr)) {
+        H5A_bt2_ud_rmbi_t udata;        /* User data for v2 B-tree record removal */
+        htri_t attr_sharable;           /* Flag indicating attributes are sharable */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Check if attributes are shared in this file */
+        if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+        /* Get handle for shared message heap, if attributes are sharable */
+        if(attr_sharable) {
+            haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+            /* Retrieve the address of the shared message's fractal heap */
+            if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+            /* Check if there are any shared messages currently */
+            if(H5F_addr_defined(shared_fheap_addr)) {
+                /* Open the fractal heap for shared header messages */
+                if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+            } /* end if */
+        } /* end if */
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Set up the user data for the v2 B-tree 'record remove' callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.shared_fheap = shared_fheap;
+        udata.idx_type = idx_type;
+        udata.other_bt2_addr = idx_type == H5_INDEX_NAME ? ainfo->corder_bt2_addr : ainfo->name_bt2_addr;
+
+        /* Remove the record from the name index v2 B-tree */
+        if(H5B2_remove_by_idx(bt2, dxpl_id, order, n, H5A__dense_remove_by_idx_bt2_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTREMOVE, FAIL, "unable to remove attribute from v2 B-tree index")
+    } /* end if */
+    else {
+        /* Build the table of attributes for this object */
+        /* (build table using the name index, but sort according to idx_type) */
+        if(H5A_dense_build_table(f, dxpl_id, ainfo, idx_type, order, &atable) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error building table of attributes")
+
+        /* Check for skipping too many attributes */
+        if(n >= atable.nattrs)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+
+        /* Delete appropriate attribute from dense storage */
+        if(H5A_dense_remove(f, dxpl_id, ainfo, ((atable.attrs[n])->shared)->name) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute in dense storage")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(atable.attrs && H5A_attr_release_table(&atable) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_exists
+ *
+ * Purpose:	Check if an attribute exists in dense storage structures for
+ *              an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+{
+    H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5HF_t *shared_fheap = NULL;        /* Fractal heap handle for shared header messages */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t attr_sharable;               /* Flag indicating attributes are sharable */
+    htri_t ret_value = TRUE;            /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(name);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Check if attributes are shared in this file */
+    if((attr_sharable = H5SM_type_shared(f, H5O_ATTR_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't determine if attributes are shared")
+
+    /* Get handle for shared message heap, if attributes are sharable */
+    if(attr_sharable) {
+        haddr_t shared_fheap_addr;      /* Address of fractal heap to use */
+
+        /* Retrieve the address of the shared message's fractal heap */
+        if(H5SM_get_fheap_addr(f, dxpl_id, H5O_ATTR_ID, &shared_fheap_addr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get shared message heap address")
+
+        /* Check if there are any shared messages currently */
+        if(H5F_addr_defined(shared_fheap_addr)) {
+            /* Open the fractal heap for shared header messages */
+            if(NULL == (shared_fheap = H5HF_open(f, dxpl_id, shared_fheap_addr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+        } /* end if */
+    } /* end if */
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Create the "udata" information for v2 B-tree record 'find' */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.shared_fheap = shared_fheap;
+    udata.name = name;
+    udata.name_hash = H5_checksum_lookup3(name, HDstrlen(name), 0);
+    udata.flags = 0;
+    udata.corder = 0;
+    udata.found_op = NULL;       /* v2 B-tree comparison callback */
+    udata.found_op_data = NULL;
+
+    /* Find the attribute in the 'name' index */
+    if((ret_value = H5B2_find(bt2_name, dxpl_id, &udata, NULL, NULL)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't search for attribute in name index")
+
+done:
+    /* Release resources */
+    if(shared_fheap && H5HF_close(shared_fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_exists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__dense_delete_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense attribute storage deletion
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  3 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__dense_delete_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5A_dense_bt2_name_rec_t *record = (const H5A_dense_bt2_name_rec_t *)_record; /* Record from B-tree */
+    H5A_bt2_ud_common_t *bt2_udata = (H5A_bt2_ud_common_t *)_bt2_udata;         /* User data for callback */
+    H5A_t *attr = NULL;                 /* Attribute being removed */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check for shared attribute */
+    if(record->flags & H5O_MSG_FLAG_SHARED) {
+        H5O_shared_t sh_mesg;   /* Temporary shared message info */
+
+        /* "reconstitute" the shared message info for the attribute */
+        H5SM_reconstitute(&sh_mesg, bt2_udata->f, H5O_ATTR_ID, record->id);
+
+        /* Decrement the reference count on the shared attribute message */
+        if(H5SM_delete(bt2_udata->f, bt2_udata->dxpl_id, NULL, &sh_mesg) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to delete shared attribute")
+    } /* end if */
+    else {
+        H5A_fh_ud_cp_t fh_udata;            /* User data for fractal heap 'op' callback */
+
+        /* Prepare user data for callback */
+        /* down */
+        fh_udata.f = bt2_udata->f;
+        fh_udata.dxpl_id = bt2_udata->dxpl_id;
+        fh_udata.record = record;
+        /* up */
+        fh_udata.attr = NULL;
+
+        /* Call fractal heap 'op' routine, to copy the attribute information */
+        if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, &record->id, H5A__dense_copy_fh_cb, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTOPERATE, FAIL, "heap op callback failed")
+        attr = fh_udata.attr;
+
+        /* Perform the deletion action on the attribute */
+        /* (takes care of shared/committed datatype & dataspace components) */
+        if(H5O_attr_delete(bt2_udata->f, bt2_udata->dxpl_id, NULL, fh_udata.attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(attr)
+        H5O_msg_free_real(H5O_MSG_ATTR, attr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__dense_delete_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_delete
+ *
+ * Purpose:	Delete all dense storage structures for attributes on an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_delete(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo)
+{
+    H5A_bt2_ud_common_t udata;          /* v2 B-tree user data for deleting attributes */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ainfo);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo->fheap_addr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Create the "udata" information for v2 B-tree 'delete' */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.shared_fheap = NULL;
+    udata.name = NULL;
+    udata.name_hash = 0;
+    udata.flags = 0;
+    udata.found_op = NULL;       /* v2 B-tree comparison callback */
+    udata.found_op_data = NULL;
+
+    /* Delete name index v2 B-tree */
+    if(H5B2_delete(f, dxpl_id, ainfo->name_bt2_addr, NULL, H5A__dense_delete_bt2_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree for name index")
+    ainfo->name_bt2_addr = HADDR_UNDEF;
+
+    /* Release resources */
+    if(H5HF_close(fheap, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    fheap = NULL;
+
+    /* Check if we should delete the creation order index v2 B-tree */
+    if(H5F_addr_defined(ainfo->corder_bt2_addr)) {
+        /* Delete the creation order index, without adjusting the ref. count on the attributes  */
+        if(H5B2_delete(f, dxpl_id, ainfo->corder_bt2_addr, NULL, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree for creation order index")
+        ainfo->corder_bt2_addr = HADDR_UNDEF;
+    } /* end if */
+
+    /* Delete fractal heap */
+    if(H5HF_delete(f, dxpl_id, ainfo->fheap_addr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")
+    ainfo->fheap_addr = HADDR_UNDEF;
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Adeprec.c b/gatb-core/thirdparty/hdf5/src/H5Adeprec.c
new file mode 100644
index 0000000..247b4b5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Adeprec.c
@@ -0,0 +1,461 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Adeprec.c
+ *		November 27 2006
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5A interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg   */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	*/
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5A__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes				*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5A__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5A__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5A_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5A__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5A_init())
+} /* H5A__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5A__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5A__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5A__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5A__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Acreate1
+ PURPOSE
+    Creates an attribute on an object
+ USAGE
+    hid_t H5Acreate1(loc_id, name, type_id, space_id, plist_id)
+        hid_t loc_id;       IN: Object (dataset or group) to be attached to
+        const char *name;   IN: Name of attribute to create
+        hid_t type_id;      IN: ID of datatype for attribute
+        hid_t space_id;     IN: ID of dataspace for attribute
+        hid_t plist_id;     IN: ID of creation property list (currently not used)
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+        This function creates an attribute which is attached to the object
+    specified with 'location_id'.  The name specified with 'name' for each
+    attribute for an object must be unique for that object.  The 'type_id'
+    and 'space_id' are created with the H5T and H5S interfaces respectively.
+    The attribute ID returned from this function must be released with H5Aclose
+    or resource leaks will develop.
+
+ NOTE
+    Deprecated in favor of H5Acreate2
+
+--------------------------------------------------------------------------*/
+hid_t
+H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
+	  hid_t plist_id)
+{
+    H5A_t	        *attr = NULL;           /* Attribute created */
+    H5G_loc_t           loc;                    /* Object location */
+    H5T_t		*type;                  /* Datatype to use for attribute */
+    H5S_t		*space;                 /* Dataspace to use for attribute */
+    hid_t		ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, plist_id);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, FAIL, "no write intent on file")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Go do the real work for attaching the attribute to the dataset */
+    if(NULL==(attr = H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute")
+
+    /* Register the new attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Acreate1() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aopen_name
+ PURPOSE
+    Opens an attribute for an object by looking up the attribute name
+ USAGE
+    hid_t H5Aopen_name (loc_id, name)
+        hid_t loc_id;       IN: Object (dataset or group) to be attached to
+        const char *name;   IN: Name of attribute to locate and open
+ RETURNS
+    ID of attribute on success, negative on failure
+
+ DESCRIPTION
+        This function opens an existing attribute for access.  The attribute
+    name specified is used to look up the corresponding attribute for the
+    object.  The attribute ID returned from this function must be released with
+    H5Aclose or resource leaks will develop.
+        The location object may be either a group or a dataset, both of
+    which may have any sort of attribute.
+ NOTE
+    Deprecated in favor of H5Aopen
+--------------------------------------------------------------------------*/
+hid_t
+H5Aopen_name(hid_t loc_id, const char *name)
+{
+    H5G_loc_t    	loc;            /* Object location */
+    H5A_t               *attr = NULL;   /* Attribute opened */
+    hid_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "i*s", loc_id, name);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Open the attribute on the object header */
+    if(NULL == (attr = H5A_open_by_name(&loc, ".", name, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute: '%s'", name)
+
+    /* Register the attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aopen_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aopen_idx
+ PURPOSE
+    Opens the n'th attribute for an object
+ USAGE
+    hid_t H5Aopen_idx (loc_id, idx)
+        hid_t loc_id;       IN: Object that attribute is attached to
+        unsigned idx;       IN: Index (0-based) attribute to open
+ RETURNS
+    ID of attribute on success, negative on failure
+
+ DESCRIPTION
+        This function opens an existing attribute for access.  The attribute
+    index specified is used to look up the corresponding attribute for the
+    object.  The attribute ID returned from this function must be released with
+    H5Aclose or resource leaks will develop.
+        The location object may be either a group or a dataset, both of
+    which may have any sort of attribute.
+ NOTE
+    Deprecated in favor of H5Aopen_by_idx
+--------------------------------------------------------------------------*/
+hid_t
+H5Aopen_idx(hid_t loc_id, unsigned idx)
+{
+    H5G_loc_t	loc;	        /* Object location */
+    H5A_t       *attr = NULL;   /* Attribute opened */
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "iIu", loc_id, idx);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Open the attribute in the object header */
+    if(NULL == (attr = H5A_open_by_idx(&loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open attribute")
+
+    /* Register the attribute and get an ID for it */
+    if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
+
+done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
+
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aopen_idx() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aget_num_attrs
+ PURPOSE
+    Determines the number of attributes attached to an object
+ NOTE
+    Deprecated in favor of H5Oget_info[_by_idx]
+ USAGE
+    int H5Aget_num_attrs (loc_id)
+        hid_t loc_id;       IN: Object (dataset or group) to be queried
+ RETURNS
+    Number of attributes on success, negative on failure
+ DESCRIPTION
+        This function returns the number of attributes attached to a dataset or
+    group, 'location_id'.
+ NOTE
+    Deprecated in favor of H5Oget_info
+--------------------------------------------------------------------------*/
+int
+H5Aget_num_attrs(hid_t loc_id)
+{
+    H5O_loc_t    	*loc;	/* Object location for attribute */
+    void           	*obj;
+    int			ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", loc_id);
+
+    /* check arguments */
+    if(H5I_BADID == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad location ID")
+    if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+    if(NULL == (obj = H5I_object(loc_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADATOM, FAIL, "illegal object atom")
+    switch(H5I_get_type (loc_id)) {
+        case H5I_DATASET:
+            if(NULL == (loc = H5D_oloc((H5D_t*)obj)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get location for object")
+            break;
+
+        case H5I_DATATYPE:
+            if(NULL == (loc = H5T_oloc((H5T_t*)obj)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "target datatype is not committed")
+            break;
+
+        case H5I_GROUP:
+            if(NULL == (loc = H5G_oloc((H5G_t*)obj)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get location for object")
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "inappropriate attribute target")
+    } /*lint !e788 All appropriate cases are covered */
+
+    /* Look up the # of attributes for the object */
+    if((ret_value = H5O_attr_count(loc, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "can't get attribute count for object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aget_num_attrs() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Aiterate1
+ PURPOSE
+    Calls a user's function for each attribute on an object
+ USAGE
+    herr_t H5Aiterate1(loc_id, attr_num, op, data)
+        hid_t loc_id;       IN: Object (dataset or group) to be iterated over
+        unsigned *attr_num; IN/OUT: Starting (IN) & Ending (OUT) attribute number
+        H5A_operator1_t op;  IN: User's function to pass each attribute to
+        void *op_data;      IN/OUT: User's data to pass through to iterator operator function
+ RETURNS
+        Returns a negative value if something is wrong, the return value of the
+    last operator if it was non-zero, or zero if all attributes were processed.
+
+ DESCRIPTION
+        This function interates over the attributes of dataset or group
+    specified with 'loc_id'.  For each attribute of the object, the
+    'op_data' and some additional information (specified below) are passed
+    to the 'op' function.  The iteration begins with the '*attr_number'
+    object in the group and the next attribute to be processed by the operator
+    is returned in '*attr_number'.
+        The operation receives the ID for the group or dataset being iterated
+    over ('loc_id'), the name of the current attribute about the object
+    ('attr_name') and the pointer to the operator data passed in to H5Aiterate
+    ('op_data').  The return values from an operator are:
+        A. Zero causes the iterator to continue, returning zero when all
+            attributes have been processed.
+        B. Positive causes the iterator to immediately return that positive
+            value, indicating short-circuit success.  The iterator can be
+            restarted at the next attribute.
+        C. Negative causes the iterator to immediately return that value,
+            indicating failure.  The iterator can be restarted at the next
+            attribute.
+ NOTE
+    Deprecated in favor of H5Aiterate2
+--------------------------------------------------------------------------*/
+herr_t
+H5Aiterate1(hid_t loc_id, unsigned *attr_num, H5A_operator1_t op, void *op_data)
+{
+    H5A_attr_iter_op_t  attr_op;        /* Attribute operator */
+    hsize_t		start_idx;      /* Index of attribute to start iterating at */
+    hsize_t		last_attr;      /* Index of last attribute examined */
+    herr_t	        ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*Iux*x", loc_id, attr_num, op, op_data);
+
+    /* check arguments */
+    if(H5I_ATTR == H5I_get_type(loc_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
+
+    /* Build attribute operator info */
+    attr_op.op_type = H5A_ATTR_OP_APP;
+    attr_op.u.app_op = op;
+
+    /* Call attribute iteration routine */
+    last_attr = start_idx = (hsize_t)(attr_num ? *attr_num : 0);
+    if((ret_value = H5O_attr_iterate(loc_id, H5AC_ind_dxpl_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, start_idx, &last_attr, &attr_op, op_data)) < 0)
+        HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
+
+    /* Set the last attribute information */
+    if(attr_num)
+        *attr_num = (unsigned)last_attr;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Aiterate1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Aint.c b/gatb-core/thirdparty/hdf5/src/H5Aint.c
new file mode 100644
index 0000000..5c5be39
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Aint.c
@@ -0,0 +1,2426 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Aint.c
+ *			Dec 18 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal routines for managing attributes.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Data exchange structure to use when building table of compact attributes for an object */
+typedef struct {
+    H5F_t       *f;             /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;        /* DXPL for operation                */
+    H5A_attr_table_t *atable;   /* Pointer to attribute table to build */
+    size_t curr_attr;           /* Current attribute to operate on */
+    hbool_t bogus_crt_idx;      /* Whether bogus creation index values need to be set */
+} H5A_compact_bt_ud_t;
+
+/* Data exchange structure to use when building table of dense attributes for an object */
+typedef struct {
+    H5A_attr_table_t *atable;   /* Pointer to attribute table to build */
+    size_t curr_attr;           /* Current attribute to operate on */
+} H5A_dense_bt_ud_t;
+
+/* Data exchange structure to use when copying an attribute from _SRC to _DST */
+typedef struct {
+    const H5O_ainfo_t *ainfo;   /* dense information    */
+    H5F_t *file;                /* file                 */
+    hbool_t *recompute_size;    /* Flag to indicate if size changed */
+    H5O_copy_t *cpy_info;       /* Information on copying options   */
+    hid_t dxpl_id;              /* DXPL for operation               */
+    const H5O_loc_t *oloc_src;
+    H5O_loc_t *oloc_dst;
+} H5A_dense_file_cp_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5A__compact_build_table_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/);
+static herr_t H5A_dense_build_table_cb(const H5A_t *attr, void *_udata);
+static int H5A__attr_cmp_name_inc(const void *attr1, const void *attr2);
+static int H5A__attr_cmp_name_dec(const void *attr1, const void *attr2);
+static int H5A__attr_cmp_corder_inc(const void *attr1, const void *attr2);
+static int H5A__attr_cmp_corder_dec(const void *attr1, const void *attr2);
+static herr_t H5A__attr_sort_table(H5A_attr_table_t *atable, H5_index_t idx_type,
+    H5_iter_order_t order);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+typedef H5A_t*	H5A_t_ptr;
+H5FL_SEQ_DEFINE(H5A_t_ptr);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_create
+ *
+ * Purpose:
+ *      This is the guts of creating an attribute.
+ * Usage:
+ *  hid_t H5A_create(ent, name, type, space)
+ *      const H5G_entry_t *ent;   IN: Pointer to symbol table entry for object to attribute
+ *      const char *name;   IN: Name of attribute
+ *      H5T_t *type;        IN: Datatype of attribute
+ *      H5S_t *space;       IN: Dataspace of attribute
+ *      hid_t acpl_id       IN: Attribute creation property list
+ *
+ * Return: attribute structure on success, NULL on Failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		April 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
+    const H5S_t *space, hid_t acpl_id, hid_t dxpl_id)
+{
+    H5A_t	*attr = NULL;   /* Attribute created */
+    hssize_t	snelmts;	/* elements in attribute */
+    size_t	nelmts;		/* elements in attribute */
+    htri_t      tri_ret;        /* htri_t return value */
+    H5A_t	*ret_value = NULL; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(loc);
+    HDassert(name);
+    HDassert(type);
+    HDassert(space);
+
+    /* Check for existing attribute with same name */
+    /* (technically, the "attribute create" operation will fail for a duplicated
+     *  name, but it's going to be hard to unwind all the special cases on
+     *  failure, so just check first, for now - QAK)
+     */
+    if((tri_ret = H5O_attr_exists(loc->oloc, name, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "error checking attributes")
+    else if(tri_ret > 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, NULL, "attribute already exists")
+
+    /* Check if the dataspace has an extent set (or is NULL) */
+    if(!(H5S_has_extent(space)))
+        HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, NULL, "dataspace extent has not been set")
+
+    /* Check if the datatype is "sensible" for use in a dataset */
+    if(H5T_is_sensible(type) != TRUE)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADTYPE, NULL, "datatype is not sensible")
+
+    /* Build the attribute information */
+    if(NULL == (attr = H5FL_CALLOC(H5A_t)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, NULL, "memory allocation failed for attribute info")
+
+    if(NULL == (attr->shared = H5FL_CALLOC(H5A_shared_t)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, NULL, "can't allocate shared attr structure")
+
+    /* If the creation property list is H5P_DEFAULT, use the default character encoding */
+    if(acpl_id == H5P_DEFAULT)
+        attr->shared->encoding = H5F_DEFAULT_CSET;
+    else {
+        H5P_genplist_t  *ac_plist;      /* ACPL Property list */
+
+        /* Get a local copy of the attribute creation property list */
+        if(NULL == (ac_plist = (H5P_genplist_t *)H5I_object(acpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
+
+        if(H5P_get(ac_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->shared->encoding)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get character encoding flag")
+    } /* end else */
+
+    /* Copy the attribute name */
+    attr->shared->name = H5MM_xstrdup(name);
+
+    /* Copy datatype */
+    if(NULL == (attr->shared->dt = H5T_copy(type, H5T_COPY_ALL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't get shared datatype info")
+
+    /* Convert a datatype (if committed) to a transient type if the committed datatype's file
+       location is different from the file location where the attribute will be created */
+    if(H5T_convert_committed_datatype(attr->shared->dt, loc->oloc->file) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't get shared datatype info")
+
+    /* Mark datatype as being on disk now */
+    if(H5T_set_loc(attr->shared->dt, loc->oloc->file, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+    /* Set the latest format for datatype, if requested */
+    if(H5F_USE_LATEST_FORMAT(loc->oloc->file))
+        if(H5T_set_latest_version(attr->shared->dt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of datatype")
+
+    /* Copy the dataspace for the attribute */
+    attr->shared->ds = H5S_copy(space, FALSE, TRUE);
+
+    /* Set the latest format for dataspace, if requested */
+    if(H5F_USE_LATEST_FORMAT(loc->oloc->file))
+        if(H5S_set_latest_version(attr->shared->ds) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of dataspace")
+
+    /* Copy the object header information */
+    if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to copy entry")
+
+    /* Deep copy of the group hierarchy path */
+    if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy path")
+
+    /* Check if any of the pieces should be (or are already) shared in the
+     * SOHM table
+     */
+    if(H5SM_try_share(attr->oloc.file, dxpl_id, NULL, 0, H5O_DTYPE_ID, attr->shared->dt, NULL) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, NULL, "trying to share datatype failed")
+    if(H5SM_try_share(attr->oloc.file, dxpl_id, NULL, 0, H5O_SDSPACE_ID, attr->shared->ds, NULL) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, NULL, "trying to share dataspace failed")
+
+    /* Check whether datatype is committed & increment ref count
+     * (to maintain ref. count incr/decr similarity with "shared message"
+     *      type of datatype sharing)
+     */
+    if(H5T_committed(attr->shared->dt)) {
+        /* Increment the reference count on the shared datatype */
+        if(H5T_link(attr->shared->dt, 1, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, NULL, "unable to adjust shared datatype link count")
+    } /* end if */
+
+    /* Compute the size of pieces on disk.  This is either the size of the
+     * datatype and dataspace messages themselves, or the size of the "shared"
+     * messages if either or both of them are shared.
+     */
+    attr->shared->dt_size = H5O_msg_raw_size(attr->oloc.file, H5O_DTYPE_ID, FALSE, attr->shared->dt);
+    attr->shared->ds_size = H5O_msg_raw_size(attr->oloc.file, H5O_SDSPACE_ID, FALSE, attr->shared->ds);
+
+    /* Get # of elements for attribute's dataspace */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, NULL, "dataspace is invalid")
+    H5_CHECKED_ASSIGN(nelmts, size_t, snelmts, hssize_t);
+
+    HDassert(attr->shared->dt_size > 0);
+    HDassert(attr->shared->ds_size > 0);
+    attr->shared->data_size = nelmts * H5T_GET_SIZE(attr->shared->dt);
+
+    /* Hold the symbol table entry (and file) open */
+    if(H5O_open(&(attr->oloc)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to open")
+    attr->obj_opened = TRUE;
+
+    /* Set the version to encode the attribute with */
+    if(H5A_set_version(attr->oloc.file, attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, NULL, "unable to update attribute version")
+
+    /* Insert the attribute into the object header */
+    if(H5O_attr_create(&(attr->oloc), dxpl_id, attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, NULL, "unable to create attribute in object header")
+
+    ret_value = attr;
+
+done:
+    if(NULL == ret_value && attr && H5A_close(attr))
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5A_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_open_common
+ *
+ * Purpose:
+ *      Finishes initializing an attributes the open
+ *
+ * Usage:
+ *  herr_t H5A_open_common(loc, name, dxpl_id)
+ *      const H5G_loc_t *loc;   IN: Pointer to group location for object
+ *      H5A_t *attr;            IN/OUT: Pointer to attribute to initialize
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		December 18, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_open_common(const H5G_loc_t *loc, H5A_t *attr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(loc);
+    HDassert(attr);
+
+#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG)
+    /* Clear object location */
+    if(H5O_loc_reset(&(attr->oloc)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to reset location")
+#endif /* H5_USING_MEMCHECKER */
+
+    /* Free any previous group hier. path */
+    if(H5G_name_free(&(attr->path)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path")
+
+    /* Deep copy of the symbol table entry */
+    if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry")
+
+    /* Deep copy of the group hier. path */
+    if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy entry")
+
+    /* Hold the symbol table entry (and file) open */
+    if(H5O_open(&(attr->oloc)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open")
+    attr->obj_opened = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_open_common() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_open_by_idx
+ *
+ * Purpose: 	Open an attribute according to its index order
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		April 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    H5A_t       *attr = NULL;           /* Attribute from object header */
+    H5A_t       *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(loc);
+    HDassert(obj_name);
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(loc, obj_name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "object not found")
+    loc_found = TRUE;
+
+    /* Read in attribute from object header */
+    if(NULL == (attr = H5O_attr_open_by_idx(obj_loc.oloc, idx_type, order, n, dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to load attribute info from object header")
+
+    /* Finish initializing attribute */
+    if(H5A_open_common(&obj_loc, attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
+
+    /* Set return value */
+    ret_value = attr;
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't free location")
+
+    /* Cleanup on failure */
+    if(ret_value == NULL)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_open_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_open_by_name
+ *
+ * Purpose:	Open an attribute in an object header, according to it's name
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		December 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_name,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    H5A_t       *attr = NULL;           /* Attribute from object header */
+    H5A_t       *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(obj_name);
+    HDassert(attr_name);
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(loc, obj_name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "object not found")
+    loc_found = TRUE;
+
+    /* Read in attribute from object header */
+    if(NULL == (attr = H5O_attr_open_by_name(obj_loc.oloc, attr_name, dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to load attribute info from object header")
+
+    /* Finish initializing attribute */
+    if(H5A_open_common(loc, attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
+
+    /* Set return value */
+    ret_value = attr;
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't free location")
+
+    /* Cleanup on failure */
+    if(ret_value == NULL)
+        if(attr && H5A_close(attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_open_by_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_write
+ PURPOSE
+    Actually write out data to an attribute
+ USAGE
+    herr_t H5A_write (attr, mem_type, buf)
+        H5A_t *attr;         IN: Attribute to write
+        const H5T_t *mem_type;     IN: Memory datatype of buffer
+        const void *buf;           IN: Buffer of data to write
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+    This function writes a complete attribute to disk.
+--------------------------------------------------------------------------*/
+herr_t
+H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
+{
+    uint8_t		*tconv_buf = NULL;	/* datatype conv buffer */
+    hbool_t             tconv_owned = FALSE;    /* Whether the datatype conv buffer is owned by attribute */
+    uint8_t		*bkg_buf = NULL;	/* temp conversion buffer */
+    hssize_t		snelmts;		/* elements in attribute */
+    size_t		nelmts;		    	/* elements in attribute */
+    H5T_path_t		*tpath = NULL;		/* conversion information*/
+    hid_t		src_id = -1, dst_id = -1;/* temporary type atoms */
+    size_t		src_type_size;		/* size of source type	*/
+    size_t		dst_type_size;		/* size of destination type*/
+    size_t		buf_size;		/* desired buffer size	*/
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(attr);
+    HDassert(mem_type);
+    HDassert(buf);
+
+    /* Get # of elements for attribute's dataspace */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
+    H5_CHECKED_ASSIGN(nelmts, size_t, snelmts, hssize_t);
+
+    /* If there's actually data elements for the attribute, make a copy of the data passed in */
+    if(nelmts > 0) {
+        /* Get the memory and file datatype sizes */
+        src_type_size = H5T_GET_SIZE(mem_type);
+        dst_type_size = H5T_GET_SIZE(attr->shared->dt);
+
+        /* Convert memory buffer into disk buffer */
+        /* Set up type conversion function */
+        if(NULL == (tpath = H5T_path_find(mem_type, attr->shared->dt, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
+
+        /* Check for type conversion required */
+        if(!H5T_path_noop(tpath)) {
+            if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL), FALSE)) < 0 ||
+                    (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL), FALSE)) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+            /* Get the maximum buffer size needed and allocate it */
+            buf_size = nelmts * MAX(src_type_size, dst_type_size);
+            if(NULL == (tconv_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+            if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+            /* Copy the user's data into the buffer for conversion */
+            HDmemcpy(tconv_buf, buf, (src_type_size * nelmts));
+
+            /* Perform datatype conversion */
+            if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
+
+            /* Free the previous attribute data buffer, if there is one */
+            if(attr->shared->data)
+                attr->shared->data = H5FL_BLK_FREE(attr_buf, attr->shared->data);
+
+            /* Set the pointer to the attribute data to the converted information */
+            attr->shared->data = tconv_buf;
+            tconv_owned = TRUE;
+        } /* end if */
+        /* No type conversion necessary */
+        else {
+            HDassert(dst_type_size == src_type_size);
+
+            /* Allocate the attribute buffer, if there isn't one */
+            if(attr->shared->data == NULL)
+                if(NULL == (attr->shared->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Copy the attribute data into the user's buffer */
+            HDmemcpy(attr->shared->data, buf, (dst_type_size * nelmts));
+        } /* end else */
+
+        /* Modify the attribute in the object header */
+        if(H5O_attr_write(&(attr->oloc), dxpl_id, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to modify attribute")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(tconv_buf && !tconv_owned)
+        tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
+    if(bkg_buf)
+        bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_write() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_read
+ PURPOSE
+    Actually read in data from an attribute
+ USAGE
+    herr_t H5A_read (attr, mem_type, buf)
+        H5A_t *attr;         IN: Attribute to read
+        const H5T_t *mem_type;     IN: Memory datatype of buffer
+        void *buf;           IN: Buffer for data to read
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+    This function reads a complete attribute from disk.
+--------------------------------------------------------------------------*/
+herr_t
+H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id)
+{
+    uint8_t		*tconv_buf = NULL;	/* datatype conv buffer*/
+    uint8_t		*bkg_buf = NULL;	/* background buffer */
+    hssize_t		snelmts;		/* elements in attribute */
+    size_t		nelmts;			/* elements in attribute*/
+    H5T_path_t		*tpath = NULL;		/* type conversion info	*/
+    hid_t		src_id = -1, dst_id = -1;/* temporary type atoms*/
+    size_t		src_type_size;		/* size of source type 	*/
+    size_t		dst_type_size;		/* size of destination type */
+    size_t		buf_size;		/* desired buffer size	*/
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(attr);
+    HDassert(mem_type);
+    HDassert(buf);
+
+    /* Create buffer for data to store on disk */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
+    H5_CHECKED_ASSIGN(nelmts, size_t, snelmts, hssize_t);
+
+    if(nelmts > 0) {
+        /* Get the memory and file datatype sizes */
+        src_type_size = H5T_GET_SIZE(attr->shared->dt);
+        dst_type_size = H5T_GET_SIZE(mem_type);
+
+        /* Check if the attribute has any data yet, if not, fill with zeroes */
+        if(attr->obj_opened && !attr->shared->data)
+            HDmemset(buf, 0, (dst_type_size * nelmts));
+        else {  /* Attribute exists and has a value */
+            /* Convert memory buffer into disk buffer */
+            /* Set up type conversion function */
+            if(NULL == (tpath = H5T_path_find(attr->shared->dt, mem_type, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
+
+            /* Check for type conversion required */
+            if(!H5T_path_noop(tpath)) {
+                if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL), FALSE)) < 0 ||
+                        (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL), FALSE)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+                /* Get the maximum buffer size needed and allocate it */
+                buf_size = nelmts * MAX(src_type_size, dst_type_size);
+                if(NULL == (tconv_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
+                if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                /* Copy the attribute data into the buffer for conversion */
+                HDmemcpy(tconv_buf, attr->shared->data, (src_type_size * nelmts));
+
+                /* Perform datatype conversion.  */
+                if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
+
+                /* Copy the converted data into the user's buffer */
+                HDmemcpy(buf, tconv_buf, (dst_type_size * nelmts));
+            } /* end if */
+            /* No type conversion necessary */
+            else {
+                HDassert(dst_type_size == src_type_size);
+
+                /* Copy the attribute data into the user's buffer */
+                HDmemcpy(buf, attr->shared->data, (dst_type_size * nelmts));
+            } /* end else */
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(tconv_buf)
+        tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
+    if(bkg_buf)
+	bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_get_space
+ *
+ * Purpose:	Returns dataspace of the attribute.
+ *
+ * Return:	Success:	dataspace
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		March, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_t *
+H5A_get_space(H5A_t *attr)
+{
+    H5S_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(attr);
+
+    /* Copy the attribute's dataspace */
+    if(NULL == (ret_value = H5S_copy(attr->shared->ds, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to copy dataspace")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_get_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_get_type
+ *
+ * Purpose:	Returns datatype of the dataset.
+ *
+ * Return:	Success:	datatype
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		March, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5A_get_type(H5A_t *attr)
+{
+    H5T_t *dt = NULL;
+    H5T_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(attr);
+
+    /* Patch the datatype's "top level" file pointer */
+    if(H5T_patch_file(attr->shared->dt, attr->oloc.file) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to patch datatype's file pointer")
+
+    /*
+     * Copy the attribute's datatype.  If the type is a named type then
+     * reopen the type before returning it to the user. Make the type
+     * read-only.
+     */
+    if(NULL == (dt = H5T_copy(attr->shared->dt, H5T_COPY_REOPEN)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to copy datatype")
+
+    /* Mark any datatypes as being in memory now */
+    if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+    /* Lock copied type */
+    if(H5T_lock(dt, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to lock transient datatype")
+
+    ret_value = dt;
+
+done:
+    if(!ret_value && dt && (H5T_close(dt) < 0))
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_get_type() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_get_create_plist
+ PURPOSE
+    private version of H5Aget_create_plist
+ RETURNS
+    This function returns the ID of a copy of the attribute's creation
+    property list, or negative on failure.
+
+ ERRORS
+
+ DESCRIPTION
+        This function returns a copy of the creation property list for
+    an attribute.  The resulting ID must be closed with H5Pclose() or
+    resource leaks will occur.
+--------------------------------------------------------------------------*/
+hid_t
+H5A_get_create_plist(H5A_t* attr)
+{
+    H5P_genplist_t      *plist;              /* Default property list */
+    hid_t               new_plist_id;        /* ID of ACPL to return */
+    H5P_genplist_t      *new_plist;          /* ACPL to return */
+    hid_t               ret_value;
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(H5P_LST_ATTRIBUTE_CREATE_ID_g)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get default ACPL")
+
+    /* Create the property list object to return */
+    if((new_plist_id = H5P_copy_plist(plist, TRUE)) < 0)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy attribute creation properties")
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_plist_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Set the character encoding on the new property list */
+    if(H5P_set(new_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->shared->encoding)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set character encoding")
+
+    ret_value = new_plist_id;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Aget_create_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_get_name
+ PURPOSE
+    Private function for H5Aget_name.  Gets a copy of the name for an
+    attribute
+ RETURNS
+    This function returns the length of the attribute's name (which may be
+    longer than 'buf_size') on success or negative for failure.
+ DESCRIPTION
+        This function retrieves the name of an attribute for an attribute ID.
+    Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string
+    terminator.  If the name of the attribute is longer than 'buf_size'-1,
+    the string terminator is stored in the last position of the buffer to
+    properly terminate the string.
+--------------------------------------------------------------------------*/
+ssize_t
+H5A_get_name(H5A_t *attr, size_t buf_size, char *buf)
+{
+    size_t              copy_len, nbytes;
+    ssize_t		ret_value;
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* get the real attribute length */
+    nbytes = HDstrlen(attr->shared->name);
+    HDassert((ssize_t)nbytes >= 0); /*overflow, pretty unlikely --rpm*/
+
+    /* compute the string length which will fit into the user's buffer */
+    copy_len = MIN(buf_size - 1, nbytes);
+
+    /* Copy all/some of the name */
+    if(buf && copy_len > 0) {
+        HDmemcpy(buf, attr->shared->name, copy_len);
+
+        /* Terminate the string */
+        buf[copy_len]='\0';
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (ssize_t)nbytes;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_get_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_get_info
+ *
+ * Purpose:	Retrieve information about an attribute.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Check args */
+    HDassert(attr);
+    HDassert(ainfo);
+
+    /* Set info for attribute */
+    ainfo->cset = attr->shared->encoding;
+    ainfo->data_size = attr->shared->data_size;
+    if(attr->shared->crt_idx == H5O_MAX_CRT_ORDER_IDX) {
+        ainfo->corder_valid = FALSE;
+        ainfo->corder = 0;
+    } /* end if */
+    else {
+        ainfo->corder_valid = TRUE;
+        ainfo->corder = attr->shared->crt_idx;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5A_get_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_copy
+ *
+ * Purpose:	Copies attribute OLD_ATTR.
+ *
+ * Return:	Success:	Pointer to a new copy of the OLD_ATTR argument.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ * Modification:Raymond Lu
+ *              4 June 2008
+ *              Changed some attribute information to be shared.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr)
+{
+    H5A_t	*new_attr = NULL;
+    hbool_t     allocated_attr = FALSE;   /* Whether the attribute was allocated */
+    H5A_t	*ret_value = NULL;        /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(old_attr);
+
+    /* Allocate attribute structure */
+    if(_new_attr == NULL) {
+        if(NULL == (new_attr = H5FL_CALLOC(H5A_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        allocated_attr = TRUE;
+    } /* end if */
+    else
+        new_attr = _new_attr;
+
+    /* Copy the top level of the attribute */
+    new_attr->sh_loc = old_attr->sh_loc;
+
+    /* Deep copy of the group hierarchy path */
+    if(H5G_name_copy(&(new_attr->path), &(old_attr->path), H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy path")
+
+    /* Share some attribute information */
+    new_attr->shared = old_attr->shared;
+
+    /* Increment reference count for shared object */
+    new_attr->shared->nrefs++;
+
+    /* Don't open the object header for a copy */
+    new_attr->obj_opened = FALSE;
+
+    /* Set the return value */
+    ret_value = new_attr;
+
+done:
+    if(ret_value == NULL)
+        if(allocated_attr && new_attr && H5A_close(new_attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_free
+ *
+ * Purpose:	Frees all memory associated with an attribute, but does not
+ *              free the H5A_t structure (which should be done in H5T_close).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, November 15, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_free(H5A_t *attr)
+{
+    herr_t ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(attr);
+
+    /* Free dynamicly allocated items */
+    if(attr->shared->name) {
+        H5MM_xfree(attr->shared->name);
+        attr->shared->name = NULL;
+    }
+    if(attr->shared->dt) {
+        if(H5T_close(attr->shared->dt) < 0)
+	    HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info")
+        attr->shared->dt = NULL;
+    }
+    if(attr->shared->ds) {
+        if(H5S_close(attr->shared->ds) < 0)
+	    HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info")
+        attr->shared->ds = NULL;
+    }
+    if(attr->shared->data)
+        attr->shared->data = H5FL_BLK_FREE(attr_buf, attr->shared->data);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_close
+ *
+ * Purpose:	Frees an attribute and all associated memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              4 June 2008
+ *              Changed some attribute object information to be shared.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_close(H5A_t *attr)
+{
+    herr_t ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(attr);
+    HDassert(attr->shared);
+
+    /* Close the object's symbol-table entry */
+    if(attr->obj_opened && (H5O_close(&(attr->oloc)) < 0))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info")
+
+    /* Reference count can be 0.  It only happens when H5A_create fails. */
+    if(attr->shared->nrefs <= 1) {
+        /* Free dynamicly allocated items */
+        if(H5A_free(attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
+
+        /* Destroy shared attribute struct */
+        attr->shared = H5FL_FREE(H5A_shared_t, attr->shared);
+    } /* end if */
+    else {
+        /* There are other references to the shared part of the attribute.
+         * Only decrement the reference count. */
+        --attr->shared->nrefs;
+    } /* end else */
+
+    /* Free group hierarchy path */
+    if(H5G_name_free(&(attr->path)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path")
+
+    attr->shared = NULL;
+    attr = H5FL_FREE(H5A_t, attr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_oloc
+ *
+ * Purpose:	Return the object location for an attribute.  It's the
+ *		object location for the object to which the attribute
+ *		belongs, not the attribute itself.
+ *
+ * Return:	Success:	Ptr to entry
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, August  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_loc_t *
+H5A_oloc(H5A_t *attr)
+{
+    H5O_loc_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(attr);
+
+    /* Set return value */
+    ret_value = &(attr->oloc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_nameof
+ *
+ * Purpose:	Return the group hier. path for an attribute.  It's the
+ *		group hier. path for the object to which the attribute
+ *		belongs, not the attribute itself.
+ *
+ * Return:	Success:	Ptr to entry
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_name_t *
+H5A_nameof(H5A_t *attr)
+{
+    H5G_name_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(attr);
+
+    /* Set return value */
+    ret_value=&(attr->path);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_nameof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_type
+ *
+ * Purpose:     Return the datatype for an attribute.
+ *
+ * Return:      Success:        Ptr to entry
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, November  11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5A_type(const H5A_t *attr)
+{
+    H5T_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(attr);
+
+    /* Set return value */
+    ret_value = attr->shared->dt;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_exists_by_name
+ *
+ * Purpose:	Private version of H5Aexists_by_name
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name,
+                   hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Check if the attribute exists */
+    if((ret_value = H5O_attr_exists(obj_loc.oloc, attr_name, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists")
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_exists_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__compact_build_table_cb
+ *
+ * Purpose:	Object header iterator callback routine to copy attribute
+ *              into table.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2006
+ *
+ * Modification:Raymond Lu
+ *              24 June 2008
+ *              Changed the table of attribute objects to be the table of
+ *              pointers to attribute objects for the ease of operation.
+ *
+ *	Vailin Choi; September 2011
+ *	Change "oh_modified" from boolean to unsigned
+ *	(See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__compact_build_table_cb(H5O_t H5_ATTR_UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned sequence, unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5A_compact_bt_ud_t *udata = (H5A_compact_bt_ud_t *)_udata;   /* Operator user data */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(mesg);
+
+    /* Re-allocate the table if necessary */
+    if(udata->curr_attr == udata->atable->nattrs) {
+        H5A_t **new_table;          /* New table for attributes */
+        size_t new_table_size;      /* Number of attributes in new table */
+
+        /* Allocate larger table */
+        new_table_size = MAX(1, 2 * udata->atable->nattrs);
+        if(NULL == (new_table = (H5A_t **)H5FL_SEQ_REALLOC(H5A_t_ptr, udata->atable->attrs, new_table_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "unable to extend attribute table")
+
+        /* Update table information in user data */
+        udata->atable->attrs = new_table;
+        udata->atable->nattrs = new_table_size;
+    } /* end if */
+
+    /* Copy attribute into table */
+    if(NULL == (udata->atable->attrs[udata->curr_attr] = H5A_copy(NULL, (const H5A_t *)mesg->native)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute")
+
+    /* Assign [somewhat arbitrary] creation order value, if requested */
+    if(udata->bogus_crt_idx)
+        ((udata->atable->attrs[udata->curr_attr])->shared)->crt_idx = sequence;
+
+    /* Increment current attribute */
+    udata->curr_attr++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__compact_build_table_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_compact_build_table
+ *
+ * Purpose:     Builds a table containing a sorted list of attributes for
+ *              an object
+ *
+ * Note:	Used for building table of attributes in non-native iteration
+ *              order for an index
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 18, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_compact_build_table(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_index_t idx_type,
+    H5_iter_order_t order, H5A_attr_table_t *atable)
+{
+    H5A_compact_bt_ud_t udata;                  /* User data for iteration callback */
+    H5O_mesg_operator_t op;             /* Wrapper for operator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(atable);
+
+    /* Initialize table */
+    atable->attrs = NULL;
+    atable->nattrs = 0;
+
+    /* Set up user data for iteration */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.atable = atable;
+    udata.curr_attr = 0;
+    udata.bogus_crt_idx = (hbool_t)((oh->version == H5O_VERSION_1 ||
+            !(oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)) ? TRUE : FALSE);
+
+    /* Iterate over existing attributes, checking for attribute with same name */
+    op.op_type = H5O_MESG_OP_LIB;
+    op.u.lib_op = H5A__compact_build_table_cb;
+    if(H5O_msg_iterate_real(f, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error building attribute table")
+
+    /* Correct # of attributes in table */
+    atable->nattrs = udata.curr_attr;
+
+    /* Don't sort an empty table. */
+    if(atable->nattrs > 0) {
+        /* Sort attribute table in correct iteration order */
+        if(H5A__attr_sort_table(atable, idx_type, order) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTSORT, FAIL, "error sorting attribute table")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_compact_build_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_build_table_cb
+ *
+ * Purpose:	Callback routine for building table of attributes from dense
+ *              attribute storage.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_build_table_cb(const H5A_t *attr, void *_udata)
+{
+    H5A_dense_bt_ud_t *udata = (H5A_dense_bt_ud_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(attr);
+    HDassert(udata);
+    HDassert(udata->curr_attr < udata->atable->nattrs);
+
+    /* Allocate attribute for entry in the table */
+    if(NULL == (udata->atable->attrs[udata->curr_attr] = H5FL_CALLOC(H5A_t)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, H5_ITER_ERROR, "can't allocate attribute")
+
+    /* Copy attribute information.  Share the attribute object in copying. */
+    if(NULL == H5A_copy(udata->atable->attrs[udata->curr_attr], attr))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute")
+
+    /* Increment number of attributes stored */
+    udata->curr_attr++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_build_table_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_dense_build_table
+ *
+ * Purpose:     Builds a table containing a sorted list of attributes for
+ *              an object
+ *
+ * Note:	Used for building table of attributes in non-native iteration
+ *              order for an index.  Uses the "name" index to retrieve records,
+ *		but the 'idx_type' index for sorting them.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_build_table(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    H5_index_t idx_type, H5_iter_order_t order, H5A_attr_table_t *atable)
+{
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    hsize_t nrec;                       /* # of records in v2 B-tree */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(H5F_addr_defined(ainfo->fheap_addr));
+    HDassert(H5F_addr_defined(ainfo->name_bt2_addr));
+    HDassert(atable);
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Retrieve # of records in "name" B-tree */
+    /* (should be same # of records in all indices) */
+    if(H5B2_get_nrec(bt2_name, &nrec) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve # of records in index")
+
+    /* Set size of table */
+    H5_CHECK_OVERFLOW(nrec, /* From: */ hsize_t, /* To: */ size_t);
+    atable->nattrs = (size_t)nrec;
+
+    /* Allocate space for the table entries */
+    if(atable->nattrs > 0) {
+        H5A_dense_bt_ud_t udata;       /* User data for iteration callback */
+        H5A_attr_iter_op_t attr_op;    /* Attribute operator */
+
+        /* Allocate the table to store the attributes */
+        if((atable->attrs = (H5A_t **)H5FL_SEQ_CALLOC(H5A_t_ptr, atable->nattrs)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Set up user data for iteration */
+        udata.atable = atable;
+        udata.curr_attr = 0;
+
+        /* Build iterator operator */
+        attr_op.op_type = H5A_ATTR_OP_LIB;
+        attr_op.u.lib_op = H5A_dense_build_table_cb;
+
+        /* Iterate over the links in the group, building a table of the link messages */
+        if(H5A_dense_iterate(f, dxpl_id, (hid_t)0, ainfo, H5_INDEX_NAME,
+                H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, &udata) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
+
+        /* Sort attribute table in correct iteration order */
+        if(H5A__attr_sort_table(atable, idx_type, order) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTSORT, FAIL, "error sorting attribute table")
+    } /* end if */
+    else
+        atable->attrs = NULL;
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_build_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__attr_cmp_name_inc
+ *
+ * Purpose:	Callback routine for comparing two attribute names, in
+ *              increasing alphabetic order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              first argument is considered to be respectively less than,
+ *              equal to, or greater than the second.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *              (i.e. same as strcmp())
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5A__attr_cmp_name_inc(const void *attr1, const void *attr2)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(HDstrcmp((*(const H5A_t * const *)attr1)->shared->name,
+            (*(const H5A_t * const *)attr2)->shared->name))
+} /* end H5A__attr_cmp_name_inc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__attr_cmp_name_dec
+ *
+ * Purpose:	Callback routine for comparing two attribute names, in
+ *              decreasing alphabetic order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              second argument is considered to be respectively less than,
+ *              equal to, or greater than the first.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *              (i.e. opposite of strcmp())
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb  8 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5A__attr_cmp_name_dec(const void *attr1, const void *attr2)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(HDstrcmp((*(const H5A_t * const *)attr2)->shared->name,
+            (*(const H5A_t * const *)attr1)->shared->name))
+} /* end H5A__attr_cmp_name_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__attr_cmp_corder_inc
+ *
+ * Purpose:	Callback routine for comparing two attributes, in
+ *              increasing creation order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              first argument is considered to be respectively less than,
+ *              equal to, or greater than the second.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb  8 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5A__attr_cmp_corder_inc(const void *attr1, const void *attr2)
+{
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if((*(const H5A_t * const *)attr1)->shared->crt_idx < (*(const H5A_t * const *)attr2)->shared->crt_idx)
+        ret_value = -1;
+    else if((*(const H5A_t * const *)attr1)->shared->crt_idx > (*(const H5A_t * const *)attr2)->shared->crt_idx)
+        ret_value = 1;
+    else
+        ret_value = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__attr_cmp_corder_inc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__attr_cmp_corder_dec
+ *
+ * Purpose:	Callback routine for comparing two attributes, in
+ *              decreasing creation order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              second argument is considered to be respectively less than,
+ *              equal to, or greater than the first.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb  8 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5A__attr_cmp_corder_dec(const void *attr1, const void *attr2)
+{
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if((*(const H5A_t * const *)attr1)->shared->crt_idx < (*(const H5A_t * const *)attr2)->shared->crt_idx)
+        ret_value = 1;
+    else if((*(const H5A_t * const *)attr1)->shared->crt_idx > (*(const H5A_t * const *)attr2)->shared->crt_idx)
+        ret_value = -1;
+    else
+        ret_value = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__attr_cmp_corder_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A__attr_sort_table
+ *
+ * Purpose:     Sort table containing a list of attributes for an object
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A__attr_sort_table(H5A_attr_table_t *atable, H5_index_t idx_type,
+    H5_iter_order_t order)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(atable);
+
+    /* Pick appropriate comparison routine */
+    if(idx_type == H5_INDEX_NAME) {
+        if(order == H5_ITER_INC)
+            HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A__attr_cmp_name_inc);
+        else if(order == H5_ITER_DEC)
+            HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A__attr_cmp_name_dec);
+        else
+            HDassert(order == H5_ITER_NATIVE);
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+        if(order == H5_ITER_INC)
+            HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A__attr_cmp_corder_inc);
+        else if(order == H5_ITER_DEC)
+            HDqsort(atable->attrs, atable->nattrs, sizeof(H5A_t*), H5A__attr_cmp_corder_dec);
+        else
+            HDassert(order == H5_ITER_NATIVE);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5A__attr_sort_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_attr_iterate_table
+ *
+ * Purpose:     Iterate over table containing a list of attributes for an object,
+ *              making appropriate callbacks
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 18, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_attr_iterate_table(const H5A_attr_table_t *atable, hsize_t skip,
+    hsize_t *last_attr, hid_t loc_id, const H5A_attr_iter_op_t *attr_op,
+    void *op_data)
+{
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(atable);
+    HDassert(attr_op);
+
+    /* Skip over attributes, if requested */
+    if(last_attr)
+        *last_attr = skip;
+
+    /* Iterate over attribute messages */
+    H5_CHECKED_ASSIGN(u, size_t, skip, hsize_t)
+    for(; u < atable->nattrs && !ret_value; u++) {
+        /* Check which type of callback to make */
+        switch(attr_op->op_type) {
+            case H5A_ATTR_OP_APP2:
+            {
+                H5A_info_t ainfo;               /* Info for attribute */
+
+                /* Get the attribute information */
+                if(H5A_get_info(atable->attrs[u], &ainfo) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info")
+
+                /* Make the application callback */
+                ret_value = (attr_op->u.app_op2)(loc_id, ((atable->attrs[u])->shared)->name, &ainfo, op_data);
+                break;
+            }
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+            case H5A_ATTR_OP_APP:
+                /* Make the application callback */
+                ret_value = (attr_op->u.app_op)(loc_id, ((atable->attrs[u])->shared)->name, op_data);
+                break;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+            case H5A_ATTR_OP_LIB:
+                /* Call the library's callback */
+                ret_value = (attr_op->u.lib_op)((atable->attrs[u]), op_data);
+                break;
+
+            default:
+                HDassert("unknown attribute op type" && 0);
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unsupported attribute op type")
+#endif /* NDEBUG */
+        } /* end switch */
+
+        /* Increment the number of entries passed through */
+        if(last_attr)
+            (*last_attr)++;
+    } /* end for */
+
+    /* Check for callback failure and pass along return value */
+    if(ret_value < 0)
+        HERROR(H5E_ATTR, H5E_CANTNEXT, "iteration operator failed");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_attr_iterate_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	  H5A_attr_release_table
+ *
+ * Purpose:       Release table containing a list of attributes for an object
+ *
+ * Return:	  Success:        Non-negative
+ *		  Failure:	Negative
+ *
+ * Programmer:	  Quincey Koziol
+ *	          Dec 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_attr_release_table(H5A_attr_table_t *atable)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(atable);
+
+    /* Release attribute info, if any. */
+    if(atable->nattrs > 0) {
+        size_t      u;               /* Local index variable */
+
+        /* Free attribute message information */
+        for(u = 0; u < atable->nattrs; u++)
+            if(atable->attrs[u] && H5A_close(atable->attrs[u]) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute")
+    } /* end if */
+    else
+        HDassert(atable->attrs == NULL);
+
+    atable->attrs = (H5A_t **)H5FL_SEQ_FREE(H5A_t_ptr, atable->attrs);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_attr_release_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_get_ainfo
+ *
+ * Purpose:     Retrieves the "attribute info" message for an object.  Also
+ *              sets the number of attributes correctly, if it isn't set up yet.
+ *
+ * Return:	Success:	TRUE/FALSE whether message was found & retrieved
+ *              Failure:        FAIL if error occurred
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 11 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5A_get_ainfo(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_ainfo_t *ainfo)
+{
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(ainfo);
+
+    /* Check if the "attribute info" message exists */
+    if((ret_value = H5O_msg_exists_oh(oh, H5O_AINFO_ID)) < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "unable to check object header")
+    if(ret_value > 0) {
+        /* Retrieve the "attribute info" structure */
+        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_AINFO_ID, ainfo))
+	    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't read AINFO message")
+
+        /* Check if we don't know how many attributes there are */
+        if(ainfo->nattrs == HSIZET_MAX) {
+            /* Check if we are using "dense" attribute storage */
+            if(H5F_addr_defined(ainfo->fheap_addr)) {
+                /* Open the name index v2 B-tree */
+                if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo->name_bt2_addr, NULL)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+                /* Retrieve # of records in "name" B-tree */
+                /* (should be same # of records in all indices) */
+                if(H5B2_get_nrec(bt2_name, &ainfo->nattrs) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve # of records in index")
+            } /* end if */
+            else
+                /* Retrieve # of attributes from object header */
+                ainfo->nattrs = oh->attr_msgs_seen;
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_get_ainfo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_set_version
+ *
+ * Purpose:     Sets the correct version to encode attribute with.
+ *              Chooses the oldest version possible, unless the "use the
+ *              latest format" flag is set.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Jul 17 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_set_version(const H5F_t *f, H5A_t *attr)
+{
+    hbool_t type_shared, space_shared;  /* Flags to indicate that shared messages are used for this attribute */
+    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(attr);
+
+    /* Get the file's 'use the latest version of the format' flag */
+    use_latest_format = H5F_USE_LATEST_FORMAT(f);
+
+    /* Check whether datatype and dataspace are shared */
+    if(H5O_msg_is_shared(H5O_DTYPE_ID, attr->shared->dt) > 0)
+        type_shared = TRUE;
+    else
+        type_shared = FALSE;
+
+    if(H5O_msg_is_shared(H5O_SDSPACE_ID, attr->shared->ds) > 0)
+        space_shared = TRUE;
+    else
+        space_shared = FALSE;
+
+    /* Check which version to encode attribute with */
+    if(use_latest_format)
+        attr->shared->version = H5O_ATTR_VERSION_LATEST;      /* Write out latest version of format */
+    else if(attr->shared->encoding != H5T_CSET_ASCII)
+        attr->shared->version = H5O_ATTR_VERSION_3;   /* Write version which includes the character encoding */
+    else if(type_shared || space_shared)
+        attr->shared->version = H5O_ATTR_VERSION_2;   /* Write out version with flag for indicating shared datatype or dataspace */
+    else
+        attr->shared->version = H5O_ATTR_VERSION_1;   /* Write out basic version */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5A_set_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_attr_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ *              Note that this function assumes that it is copying *all*
+ *              the attributes in the object, specifically when it copies
+ *              the creation order from source to destination.  If this is
+ *              to be used to copy only a single attribute, then the
+ *              creation order must be handled differently.  -NAF
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              November 1, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_size,
+    H5O_copy_t *cpy_info, hid_t dxpl_id)
+{
+    H5A_t        *attr_dst = NULL;
+
+    /* for dataype conversion */
+    hid_t       tid_src = -1;           /* Datatype ID for source datatype */
+    hid_t       tid_dst = -1;           /* Datatype ID for destination datatype */
+    hid_t       tid_mem = -1;           /* Datatype ID for memory datatype */
+    void       *buf = NULL;             /* Buffer for copying data */
+    void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
+    void       *bkg_buf = NULL;     	/* Background buffer */
+    hid_t       buf_sid = -1;           /* ID for buffer dataspace */
+
+    H5A_t       *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(attr_src);
+    HDassert(file_dst);
+    HDassert(cpy_info);
+    HDassert(!cpy_info->copy_without_attr);
+
+    /* Allocate space for the destination message */
+    if(NULL == (attr_dst = H5FL_CALLOC(H5A_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the top level of the attribute */
+    *attr_dst = *attr_src;
+
+    if(NULL == (attr_dst->shared = H5FL_CALLOC(H5A_shared_t)))
+        HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure")
+
+    /* Don't have an opened group location for copy */
+    H5O_loc_reset(&(attr_dst->oloc));
+    H5G_name_reset(&(attr_dst->path));
+    attr_dst->obj_opened = FALSE;
+
+    /* Reference count for the header message in the cache */
+    attr_dst->shared->nrefs = 1;
+
+    /* Copy attribute's name */
+    attr_dst->shared->name = H5MM_strdup(attr_src->shared->name);
+    HDassert(attr_dst->shared->name);
+    attr_dst->shared->encoding = attr_src->shared->encoding;
+
+    /* Copy attribute's datatype */
+    /* If source is named, we will keep dst as named, but we will not actually
+     * copy the target and update the message until post copy */
+    if(NULL == (attr_dst->shared->dt = H5T_copy(attr_src->shared->dt, H5T_COPY_ALL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "cannot copy datatype")
+
+    /* Set the location of the destination datatype */
+    if(H5T_set_loc(attr_dst->shared->dt, file_dst, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "cannot mark datatype on disk")
+
+    if(!H5T_committed(attr_src->shared->dt)) {
+        /* If the datatype is not named, it may have been shared in the
+         * source file's heap.  Un-share it for now. We'll try to shared
+         * it in the destination file below.
+         */
+        if(H5O_msg_reset_share(H5O_DTYPE_ID, attr_dst->shared->dt) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset datatype sharing")
+    } /* end if */
+
+    /* Copy the dataspace for the attribute. Make sure the maximal dimension is also copied.
+     * Otherwise the comparison in the test may complain about it. SLU 2011/4/12 */
+    attr_dst->shared->ds = H5S_copy(attr_src->shared->ds, FALSE, TRUE);
+    HDassert(attr_dst->shared->ds);
+
+    /* Reset the dataspace's sharing in the source file before trying to share
+     * it in the destination.
+     */
+    if(H5O_msg_reset_share(H5O_SDSPACE_ID, attr_dst->shared->ds) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset dataspace sharing")
+
+    /* Simulate trying to share both the datatype and dataset, to determine the
+     * final size of the messages.  This does nothing if the datatype is
+     * committed or sharing is disabled.
+     */
+    if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_DEFER, H5O_DTYPE_ID, attr_dst->shared->dt, NULL) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute datatype")
+    if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_DEFER, H5O_SDSPACE_ID, attr_dst->shared->ds, NULL) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute dataspace")
+
+    /* Compute the sizes of the datatype and dataspace. This is their raw
+     * size unless they're shared.
+     */
+    attr_dst->shared->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, FALSE, attr_dst->shared->dt);
+    HDassert(attr_dst->shared->dt_size > 0);
+    attr_dst->shared->ds_size = H5O_msg_raw_size(file_dst, H5O_SDSPACE_ID, FALSE, attr_dst->shared->ds);
+    HDassert(attr_dst->shared->ds_size > 0);
+
+    /* Check whether to recompute the size of the attribute */
+    /* (happens when the datatype or dataspace changes sharing status) */
+    if(attr_dst->shared->dt_size != attr_src->shared->dt_size || attr_dst->shared->ds_size != attr_src->shared->ds_size)
+        *recompute_size = TRUE;
+
+    /* Compute the size of the data */
+    /* NOTE: This raises warnings. If we are going to be serious about
+     * expecting overflow here, we should implement testing similar to
+     * that described in CERT bulletins INT30-C and INT32-C.
+     */
+    H5_CHECKED_ASSIGN(attr_dst->shared->data_size, size_t, H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds) * H5T_get_size(attr_dst->shared->dt), hssize_t);
+
+    /* Copy (& convert) the data, if necessary */
+    if(attr_src->shared->data) {
+        if(NULL == (attr_dst->shared->data = H5FL_BLK_MALLOC(attr_buf, attr_dst->shared->data_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Check if we need to convert data */
+        if(H5T_detect_class(attr_src->shared->dt, H5T_VLEN, FALSE) > 0) {
+            H5T_path_t  *tpath_src_mem, *tpath_mem_dst;   /* Datatype conversion paths */
+            H5T_t *dt_mem;              /* Memory datatype */
+            size_t src_dt_size;         /* Source datatype size */
+            size_t tmp_dt_size;         /* Temp. datatype size */
+            size_t max_dt_size;         /* Max atatype size */
+            H5S_t *buf_space;           /* Dataspace describing buffer */
+            hsize_t buf_dim;            /* Dimension for buffer */
+            size_t nelmts;              /* Number of elements in buffer */
+            size_t buf_size;            /* Size of copy buffer */
+
+            /* Create datatype ID for src datatype */
+            if((tid_src = H5I_register(H5I_DATATYPE, attr_src->shared->dt, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register source file datatype")
+
+            /* create a memory copy of the variable-length datatype */
+            if(NULL == (dt_mem = H5T_copy(attr_src->shared->dt, H5T_COPY_TRANSIENT)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy")
+            if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register memory datatype")
+
+            /* create variable-length datatype at the destinaton file */
+            if((tid_dst = H5I_register(H5I_DATATYPE, attr_dst->shared->dt, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register destination file datatype")
+
+            /* Set up the conversion functions */
+            if(NULL == (tpath_src_mem = H5T_path_find(attr_src->shared->dt, dt_mem, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between src and mem datatypes")
+            if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, attr_dst->shared->dt, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between mem and dst datatypes")
+
+            /* Determine largest datatype size */
+            if(0 == (src_dt_size = H5T_get_size(attr_src->shared->dt)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size")
+            if(0 == (tmp_dt_size = H5T_get_size(dt_mem)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size")
+            max_dt_size = MAX(src_dt_size, tmp_dt_size);
+            if(0 == (tmp_dt_size = H5T_get_size(attr_dst->shared->dt)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size")
+            max_dt_size = MAX(max_dt_size, tmp_dt_size);
+
+            /* Set number of whole elements that fit in buffer */
+            if(0 == (nelmts = attr_src->shared->data_size / src_dt_size))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "element size too large")
+
+            /* Set up number of bytes to copy, and initial buffer size */
+            buf_size = nelmts * max_dt_size;
+
+            /* Create dataspace for number of elements in buffer */
+            buf_dim = nelmts;
+
+            /* Create the space and set the initial extent */
+            if(NULL == (buf_space = H5S_create_simple((unsigned)1, &buf_dim, NULL)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, NULL, "can't create simple dataspace")
+
+            /* Atomize */
+            if((buf_sid = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) {
+                H5S_close(buf_space);
+                HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, NULL, "unable to register dataspace ID")
+            } /* end if */
+
+            /* Allocate memory for recclaim buf */
+            if(NULL == (reclaim_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk")
+
+            /* Allocate memory for copying the chunk */
+            if(NULL == (buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk")
+
+            HDmemcpy(buf, attr_src->shared->data, attr_src->shared->data_size);
+
+            /* Allocate background memory */
+            if(H5T_path_bkg(tpath_src_mem) || H5T_path_bkg(tpath_mem_dst)) {
+                if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+            }
+
+            /* Convert from source file to memory */
+            if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, bkg_buf, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed")
+
+            HDmemcpy(reclaim_buf, buf, buf_size);
+
+            /* Set background buffer to all zeros */
+            if(bkg_buf)
+                HDmemset(bkg_buf, 0, buf_size);
+
+            /* Convert from memory to destination file */
+            if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, bkg_buf, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed")
+
+            HDmemcpy(attr_dst->shared->data, buf, attr_dst->shared->data_size);
+
+            if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_BADITER, NULL, "unable to reclaim variable-length data")
+        }  /* end if */
+        else {
+            HDassert(attr_dst->shared->data_size == attr_src->shared->data_size);
+            HDmemcpy(attr_dst->shared->data, attr_src->shared->data, attr_src->shared->data_size);
+        } /* end else */
+    } /* end if(attr_src->shared->data) */
+
+    /* Copy the creation order */
+    attr_dst->shared->crt_idx = attr_src->shared->crt_idx;
+
+    /* Recompute the version to encode the destination attribute */
+    if(H5A_set_version(file_dst, attr_dst) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, NULL, "unable to update attribute version")
+
+    /* Recompute the destination attribute's size, if it's a different version */
+    if(attr_src->shared->version != attr_dst->shared->version)
+        *recompute_size = TRUE;
+
+    /* Set return value */
+    ret_value = attr_dst;
+
+done:
+    if(buf_sid > 0 && H5I_dec_ref(buf_sid) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary dataspace ID")
+    if(tid_src > 0)
+        /* Don't decrement ID, we want to keep underlying datatype */
+        if(NULL == H5I_remove(tid_src))
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID")
+    if(tid_dst > 0)
+        /* Don't decrement ID, we want to keep underlying datatype */
+        if(NULL == H5I_remove(tid_dst))
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID")
+    if(tid_mem > 0)
+        /* Decrement the memory datatype ID, it's transient */
+        if(H5I_dec_ref(tid_mem) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID")
+    if(buf)
+        buf = H5FL_BLK_FREE(attr_buf, buf);
+    if(reclaim_buf)
+        reclaim_buf = H5FL_BLK_FREE(attr_buf, reclaim_buf);
+    if(bkg_buf)
+        bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
+
+    /* Release destination attribute information on failure */
+    if(!ret_value && attr_dst && H5A_close(attr_dst) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_attr_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_attr_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files.
+ *              We have to copy the values of a reference attribute in the
+ *              post copy because H5O_post_copy_file() fails at the case that
+ *              an object may have a reference attribute that points to the
+ *              object itself.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              March 6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *attr_src,
+    H5O_loc_t *dst_oloc, const H5A_t *attr_dst, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    H5F_t  *file_src, *file_dst;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(src_oloc);
+    HDassert(dst_oloc);
+    HDassert(attr_dst);
+    HDassert(attr_src);
+
+    file_src = src_oloc->file;
+    file_dst = dst_oloc->file;
+
+    HDassert(file_src);
+    HDassert(file_dst);
+
+    if(H5T_committed(attr_src->shared->dt)) {
+        H5O_loc_t         *src_oloc_dt;           /* Pointer to source datatype's object location */
+        H5O_loc_t         *dst_oloc_dt;           /* Pointer to dest. datatype's object location */
+
+        /* Get group entries for source & destination */
+        src_oloc_dt = H5T_oloc(attr_src->shared->dt);
+        HDassert(src_oloc_dt);
+        dst_oloc_dt = H5T_oloc(attr_dst->shared->dt);
+        HDassert(dst_oloc_dt);
+
+        /* Reset object location for new object */
+        H5O_loc_reset(dst_oloc_dt);
+        dst_oloc_dt->file = file_dst;
+
+        /* Copy the shared object from source to destination */
+        if(H5O_copy_header_map(src_oloc_dt, dst_oloc_dt, dxpl_id, cpy_info, FALSE, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+        /* Update shared message info from named datatype info */
+        H5T_update_shared(attr_dst->shared->dt);
+    } /* end if */
+
+    /* Try to share both the datatype and dataset.  This does nothing if the
+     * datatype is committed or sharing is disabled.
+     */
+    if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_WAS_DEFERRED, H5O_DTYPE_ID, attr_dst->shared->dt, NULL) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "can't share attribute datatype")
+    if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_WAS_DEFERRED, H5O_SDSPACE_ID, attr_dst->shared->ds, NULL) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "can't share attribute dataspace")
+
+    /* Only need to fix reference attribute with real data being copied to
+     *  another file.
+     */
+    if((NULL != attr_dst->shared->data) && (H5T_get_class(attr_dst->shared->dt, FALSE) == H5T_REFERENCE) ) {
+
+        /* copy object pointed by reference. The current implementation does not
+         *  deal with nested reference such as reference in a compound structure
+         */
+
+        /* Check for expanding references */
+        if(cpy_info->expand_ref) {
+            size_t ref_count;
+
+            /* Determine # of reference elements to copy */
+            ref_count = attr_dst->shared->data_size / H5T_get_size(attr_dst->shared->dt);
+
+            /* Copy objects referenced in source buffer to destination file and set destination elements */
+            if(H5O_copy_expand_ref(file_src, attr_dst->shared->data, dxpl_id,
+                    file_dst, attr_dst->shared->data, ref_count, H5T_get_ref_type(attr_dst->shared->dt), cpy_info) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy reference attribute")
+        } /* end if */
+        else
+            /* Reset value to zero */
+            HDmemset(attr_dst->shared->data, 0, attr_dst->shared->data_size);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_attr_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_dense_post_copy_file_cb
+ *
+ * Purpose:     Callback routine for copying a dense attribute from SRC to DST.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Peter Cao
+ *              xcao at hdfgroup.org
+ *              July 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5A_dense_post_copy_file_cb(const H5A_t *attr_src, void *_udata)
+{
+    H5A_dense_file_cp_ud_t *udata = (H5A_dense_file_cp_ud_t *)_udata;
+    H5A_t *attr_dst = NULL;
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(attr_src);
+    HDassert(udata);
+    HDassert(udata->ainfo);
+    HDassert(udata->file);
+    HDassert(udata->cpy_info);
+
+    if(NULL == (attr_dst = H5A_attr_copy_file(attr_src, udata->file,
+            udata->recompute_size, udata->cpy_info,  udata->dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute")
+
+    if(H5A_attr_post_copy_file(udata->oloc_src, attr_src, udata->oloc_dst, attr_dst,
+            udata->dxpl_id, udata->cpy_info) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute")
+
+    /* Reset shared location information */
+    if(H5O_msg_reset_share(H5O_ATTR_ID, attr_dst) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to reset attribute sharing")
+
+    /* Insert attribute into dense storage */
+    if(H5A_dense_insert(udata->file, udata->dxpl_id, udata->ainfo, attr_dst) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to add to dense storage")
+
+done:
+    if(attr_dst && H5A_close(attr_dst) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close destination attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_post_copy_file_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5A_dense_post_copy_file_all
+ *
+ * Purpose:     Copy all dense attributes from SRC to DST.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Peter Cao
+ *              xcao at hdfgroup.org
+ *              July 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t *ainfo_src,
+    H5O_loc_t *dst_oloc, H5O_ainfo_t *ainfo_dst, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    H5A_dense_file_cp_ud_t udata;       /* User data for iteration callback */
+    H5A_attr_iter_op_t attr_op;         /* Attribute operator */
+    hbool_t recompute_size = FALSE;     /* recompute the size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(ainfo_src);
+    HDassert(ainfo_dst);
+
+    udata.ainfo = ainfo_dst;                  /* Destination dense information    */
+    udata.file = dst_oloc->file;              /* Destination file                 */
+    udata.recompute_size = &recompute_size;   /* Flag to indicate if size changed */
+    udata.cpy_info = cpy_info;                /* Information on copying options   */
+    udata.dxpl_id = dxpl_id;                  /* DXPL for operation               */
+    udata.oloc_src = src_oloc;
+    udata.oloc_dst = dst_oloc;
+
+    attr_op.op_type = H5A_ATTR_OP_LIB;
+    attr_op.u.lib_op = H5A_dense_post_copy_file_cb;
+
+
+     if(H5A_dense_iterate(src_oloc->file, dxpl_id, (hid_t)0, ainfo_src, H5_INDEX_NAME,
+            H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, &udata) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_dense_post_copy_file_all */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_rename_by_name
+ *
+ * Purpose:     Private version of H5Arename_by_name
+ *
+ * Return:	Success:             Non-negative
+ *		Failure:             Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              February 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_rename_by_name(H5G_loc_t loc, const char *obj_name, const char *old_attr_name,
+                   const char *new_attr_name, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Avoid thrashing things if the names are the same */
+    if(HDstrcmp(old_attr_name, new_attr_name)) {
+        /* Set up opened group location to fill in */
+        obj_loc.oloc = &obj_oloc;
+        obj_loc.path = &obj_path;
+        H5G_loc_reset(&obj_loc);
+
+        /* Find the object's location */
+        if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
+        loc_found = TRUE;
+
+        /* Call attribute rename routine */
+        if(H5O_attr_rename(obj_loc.oloc, dxpl_id, old_attr_name, new_attr_name) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_rename_by_name() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Apkg.h b/gatb-core/thirdparty/hdf5/src/H5Apkg.h
new file mode 100644
index 0000000..f5e588c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Apkg.h
@@ -0,0 +1,280 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol
+ *              Monday, Apr 20
+ *
+ * Purpose:     This file contains declarations which are visible only within
+ *              the H5A package.  Source files outside the H5A package should
+ *              include H5Aprivate.h instead.
+ */
+#ifndef H5A_PACKAGE
+#error "Do not include this file outside the H5A package!"
+#endif
+
+#ifndef _H5Apkg_H
+#define _H5Apkg_H
+
+/*
+ * Define this to enable debugging.
+ */
+#ifdef NDEBUG
+#  undef H5A_DEBUG
+#endif
+
+/* Get package's private header */
+#include "H5Aprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5B2private.h"	/* v2 B-trees				*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5HFprivate.h"	/* Fractal heaps			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Sprivate.h"		/* Dataspace				*/
+#include "H5Tprivate.h"		/* Datatype functions			*/
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* This is the initial version, which does not have support for shared datatypes */
+#define H5O_ATTR_VERSION_1	1
+
+/* This version allows support for shared datatypes & dataspaces by adding a
+ *      'flag' byte indicating when those components are shared.  This version
+ *      also dropped the alignment on all the components.
+ */
+#define H5O_ATTR_VERSION_2	2
+
+/* Add support for different character encodings of attribute names */
+#define H5O_ATTR_VERSION_3      3
+
+/* The latest version of the format.  Look through the 'encode', 'decode'
+ *      and 'size' message callbacks for places to change when updating this.
+ */
+#define H5O_ATTR_VERSION_LATEST H5O_ATTR_VERSION_3
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+/* Define the shared attribute structure */
+typedef struct H5A_shared_t {
+    uint8_t     version;    /* Version to encode attribute with */
+
+    char        *name;      /* Attribute's name */
+    H5T_cset_t  encoding;   /* Character encoding of attribute name */
+
+    H5T_t       *dt;        /* Attribute's datatype */
+    size_t      dt_size;    /* Size of datatype on disk */
+
+    H5S_t       *ds;        /* Attribute's dataspace */
+    size_t      ds_size;    /* Size of dataspace on disk */
+
+    void        *data;      /* Attribute data (on a temporary basis) */
+    size_t      data_size;  /* Size of data on disk */
+    H5O_msg_crt_idx_t crt_idx;  /* Attribute's creation index in the object header */
+    unsigned	nrefs;		/* Ref count for times this object is refered	*/
+} H5A_shared_t;
+
+/* Define the main attribute structure */
+struct H5A_t {
+    H5O_shared_t sh_loc;     /* Shared message info (must be first) */
+    H5O_loc_t    oloc;       /* Object location for object attribute is on */
+    hbool_t      obj_opened; /* Object header entry opened? */
+    H5G_name_t   path;       /* Group hierarchy path */
+    H5A_shared_t *shared;    /* Shared attribute information */
+};
+
+/* Typedefs for "dense" attribute storage */
+/* (fractal heap & v2 B-tree info) */
+
+/* Typedef for native 'name' field index records in the v2 B-tree */
+/* (Keep 'id' field first so generic record handling in callbacks works) */
+typedef struct H5A_dense_bt2_name_rec_t {
+    H5O_fheap_id_t id;                  /* Heap ID for attribute */
+    uint8_t flags;                      /* Object header message flags for attribute */
+    H5O_msg_crt_idx_t corder;           /* 'creation order' field value */
+    uint32_t hash;                      /* Hash of 'name' field value */
+} H5A_dense_bt2_name_rec_t;
+
+/* Typedef for native 'creation order' field index records in the v2 B-tree */
+/* (Keep 'id' field first so generic record handling in callbacks works) */
+typedef struct H5A_dense_bt2_corder_rec_t {
+    H5O_fheap_id_t id;                  /* Heap ID for attribute */
+    uint8_t flags;                      /* Object header message flags for attribute */
+    H5O_msg_crt_idx_t corder;           /* 'creation order' field value */
+} H5A_dense_bt2_corder_rec_t;
+
+/* Define the 'found' callback function pointer for matching an attribute record in a v2 B-tree */
+typedef herr_t (*H5A_bt2_found_t)(const H5A_t *attr, hbool_t *took_ownership, void *op_data);
+
+/*
+ * Common data exchange structure for dense attribute storage.  This structure
+ * is passed through the v2 B-tree layer to the methods for the objects
+ * to which the v2 B-tree points.
+ */
+typedef struct H5A_bt2_ud_common_t {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    H5HF_t      *shared_fheap;          /* Fractal heap handle for shared messages */
+    const char  *name;                  /* Name of attribute to compare      */
+    uint32_t    name_hash;              /* Hash of name of attribute to compare */
+    uint8_t     flags;                  /* Flags for attribute storage location */
+    H5O_msg_crt_idx_t corder;           /* Creation order value of attribute to compare */
+    H5A_bt2_found_t found_op;           /* Callback when correct attribute is found */
+    void        *found_op_data;         /* Callback data when correct attribute is found */
+} H5A_bt2_ud_common_t;
+
+/*
+ * Data exchange structure for dense attribute storage.  This structure is
+ * passed through the v2 B-tree layer when inserting attributes.
+ */
+typedef struct H5A_bt2_ud_ins_t {
+    /* downward */
+    H5A_bt2_ud_common_t common;         /* Common info for B-tree user data (must be first) */
+    H5O_fheap_id_t id;                  /* Heap ID of attribute to insert    */
+} H5A_bt2_ud_ins_t;
+
+/* Data structure to hold table of attributes for an object */
+typedef struct {
+    size_t      nattrs;         /* # of attributes in table */
+    H5A_t       **attrs;        /* Pointer to array of attribute pointers */
+} H5A_attr_table_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* Declare extern the free list for H5A_t's */
+H5FL_EXTERN(H5A_t);
+
+/* Declare the external free lists for H5A_shared_t's */
+H5FL_EXTERN(H5A_shared_t);
+
+/* Declare extern a free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(attr_buf);
+
+/* The v2 B-tree class for indexing 'name' field on attributes */
+H5_DLLVAR const H5B2_class_t H5A_BT2_NAME[1];
+
+/* The v2 B-tree class for indexing 'creation order' field on attributes */
+H5_DLLVAR const H5B2_class_t H5A_BT2_CORDER[1];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Function prototypes for H5A package scope */
+H5_DLL herr_t H5A_init(void);
+H5_DLL herr_t H5A__term_deprec_interface(void);
+H5_DLL H5A_t *H5A_create(const H5G_loc_t *loc, const char *name,
+    const H5T_t *type, const H5S_t *space, hid_t acpl_id, hid_t dxpl_id);
+H5_DLL H5A_t *H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name,
+    const char *attr_name, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL H5A_t *H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5A_open_common(const H5G_loc_t *loc, H5A_t *attr);
+H5_DLL herr_t H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id);
+H5_DLL herr_t H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id);
+H5_DLL ssize_t H5A_get_name(H5A_t *attr, size_t buf_size, char *buf);
+H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr);
+H5_DLL herr_t H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo);
+H5_DLL hid_t H5A_get_create_plist(H5A_t* attr);
+H5_DLL herr_t H5A_free(H5A_t *attr);
+H5_DLL herr_t H5A_close(H5A_t *attr);
+H5_DLL htri_t H5A_get_ainfo(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_ainfo_t *ainfo);
+H5_DLL herr_t H5A_set_version(const H5F_t *f, H5A_t *attr);
+H5_DLL herr_t H5A_rename_by_name(H5G_loc_t loc, const char *obj_name, const char *old_attr_name,
+    const char *new_attr_name, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL htri_t H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name,
+    hid_t lapl_id, hid_t dxpl_id);
+
+/* Attribute "dense" storage routines */
+H5_DLL herr_t H5A_dense_create(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo);
+H5_DLL H5A_t *H5A_dense_open(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name);
+H5_DLL herr_t H5A_dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    H5A_t *attr);
+H5_DLL herr_t H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    H5A_t *attr);
+H5_DLL herr_t H5A_dense_rename(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *old_name, const char *new_name);
+H5_DLL herr_t H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id,
+    const H5O_ainfo_t *ainfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t skip, hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op,
+    void *op_data);
+H5_DLL herr_t H5A_dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name);
+H5_DLL herr_t H5A_dense_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n);
+H5_DLL htri_t H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name);
+H5_DLL herr_t H5A_dense_delete(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo);
+
+
+/* Attribute table operations */
+H5_DLL herr_t H5A_compact_build_table(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5_index_t idx_type, H5_iter_order_t order, H5A_attr_table_t *atable);
+H5_DLL herr_t H5A_dense_build_table(H5F_t *f, hid_t dxpl_id,
+    const H5O_ainfo_t *ainfo, H5_index_t idx_type, H5_iter_order_t order,
+    H5A_attr_table_t *atable);
+H5_DLL herr_t H5A_attr_iterate_table(const H5A_attr_table_t *atable,
+    hsize_t skip, hsize_t *last_attr, hid_t loc_id,
+    const H5A_attr_iter_op_t *attr_op, void *op_data);
+H5_DLL herr_t H5A_attr_release_table(H5A_attr_table_t *atable);
+
+/* Attribute operations */
+H5_DLL herr_t H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr);
+H5_DLL H5A_t *H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name,
+    hid_t dxpl_id);
+H5_DLL H5A_t *H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t dxpl_id);
+H5_DLL herr_t H5O_attr_update_shared(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+        H5A_t *attr, H5O_shared_t *sh_mesg);
+H5_DLL herr_t H5O_attr_write(const H5O_loc_t *loc, hid_t dxpl_id,
+    H5A_t *attr);
+H5_DLL herr_t H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id,
+    const char *old_name, const char *new_name);
+H5_DLL herr_t H5O_attr_remove(const H5O_loc_t *loc, const char *name,
+    hid_t dxpl_id);
+H5_DLL herr_t H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t dxpl_id);
+H5_DLL htri_t H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id);
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL int H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+H5_DLL H5A_t *H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_size,
+    H5O_copy_t *cpy_info, hid_t dxpl_id);
+H5_DLL herr_t H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *mesg_src,
+    H5O_loc_t *dst_oloc, const H5A_t *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
+H5_DLL herr_t H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t * ainfo_src,
+    H5O_loc_t *dst_oloc, H5O_ainfo_t *ainfo_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
+
+
+/* Testing functions */
+#ifdef H5A_TESTING
+H5_DLL htri_t H5A_is_shared_test(hid_t aid);
+H5_DLL herr_t H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count);
+#endif /* H5A_TESTING */
+
+#endif /* _H5Apkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Aprivate.h b/gatb-core/thirdparty/hdf5/src/H5Aprivate.h
new file mode 100644
index 0000000..6b62692
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Aprivate.h
@@ -0,0 +1,91 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5D module
+ */
+#ifndef _H5Aprivate_H
+#define _H5Aprivate_H
+
+/* Include package's public header */
+#include "H5Apublic.h"
+
+/* Private headers needed by this file */
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Oprivate.h"         /* Object headers                       */
+#include "H5Sprivate.h"         /* Dataspace                            */
+#include "H5Tprivate.h"         /* Datatypes                            */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Forward references of package typedefs */
+typedef struct H5A_t H5A_t;
+
+/* Attribute iteration operator for internal library callbacks */
+typedef herr_t (*H5A_lib_iterate_t)(const H5A_t *attr, void *op_data);
+
+/* Describe kind of callback to make for each attribute */
+typedef enum H5A_attr_iter_op_type_t {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    H5A_ATTR_OP_APP,                /* Application callback */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    H5A_ATTR_OP_APP2,               /* Revised application callback */
+    H5A_ATTR_OP_LIB                 /* Library internal callback */
+} H5A_attr_iter_op_type_t;
+
+typedef struct H5A_attr_iter_op_t {
+    H5A_attr_iter_op_type_t op_type;
+    union {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        H5A_operator1_t app_op;         /* Application callback for each attribute */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+        H5A_operator2_t app_op2;        /* Revised application callback for each attribute */
+        H5A_lib_iterate_t lib_op;       /* Library internal callback for each attribute */
+    } u;
+} H5A_attr_iter_op_t;
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General attribute routines */
+H5_DLL struct H5O_loc_t *H5A_oloc(H5A_t *attr);
+H5_DLL H5G_name_t *H5A_nameof(H5A_t *attr);
+H5_DLL H5T_t *H5A_type(const H5A_t *attr);
+H5_DLL H5T_t *H5A_get_type(H5A_t *attr);
+H5_DLL H5S_t *H5A_get_space(H5A_t *attr);
+H5_DLL herr_t H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc,
+    hid_t dxpl_id, H5_index_t idx_type, H5_iter_order_t order, hsize_t skip,
+    hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op, void *op_data);
+H5_DLL herr_t H5O_attr_iterate(hid_t loc_id, hid_t dxpl_id, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t skip, hsize_t *last_attr,
+    const H5A_attr_iter_op_t *op, void *op_data);
+
+#endif /* _H5Aprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Apublic.h b/gatb-core/thirdparty/hdf5/src/H5Apublic.h
new file mode 100644
index 0000000..99ca90e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Apublic.h
@@ -0,0 +1,120 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5A module.
+ */
+#ifndef _H5Apublic_H
+#define _H5Apublic_H
+
+/* Public headers needed by this file */
+#include "H5Ipublic.h"		/* IDs			  		*/
+#include "H5Opublic.h"		/* Object Headers			*/
+#include "H5Tpublic.h"		/* Datatypes				*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Information struct for attribute (for H5Aget_info/H5Aget_info_by_idx) */
+typedef struct {
+    hbool_t             corder_valid;   /* Indicate if creation order is valid */
+    H5O_msg_crt_idx_t   corder;         /* Creation order                 */
+    H5T_cset_t          cset;           /* Character set of attribute name */
+    hsize_t             data_size;      /* Size of raw data		  */
+} H5A_info_t;
+
+/* Typedef for H5Aiterate2() callbacks */
+typedef herr_t (*H5A_operator2_t)(hid_t location_id/*in*/,
+    const char *attr_name/*in*/, const H5A_info_t *ainfo/*in*/, void *op_data/*in,out*/);
+
+/* Public function prototypes */
+H5_DLL hid_t   H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id,
+    hid_t space_id, hid_t acpl_id, hid_t aapl_id);
+H5_DLL hid_t   H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
+    hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t aapl_id, hid_t lapl_id);
+H5_DLL hid_t   H5Aopen(hid_t obj_id, const char *attr_name, hid_t aapl_id);
+H5_DLL hid_t   H5Aopen_by_name(hid_t loc_id, const char *obj_name,
+    const char *attr_name, hid_t aapl_id, hid_t lapl_id);
+H5_DLL hid_t   H5Aopen_by_idx(hid_t loc_id, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t aapl_id,
+    hid_t lapl_id);
+H5_DLL herr_t  H5Awrite(hid_t attr_id, hid_t type_id, const void *buf);
+H5_DLL herr_t  H5Aread(hid_t attr_id, hid_t type_id, void *buf);
+H5_DLL herr_t  H5Aclose(hid_t attr_id);
+H5_DLL hid_t   H5Aget_space(hid_t attr_id);
+H5_DLL hid_t   H5Aget_type(hid_t attr_id);
+H5_DLL hid_t   H5Aget_create_plist(hid_t attr_id);
+H5_DLL ssize_t H5Aget_name(hid_t attr_id, size_t buf_size, char *buf);
+H5_DLL ssize_t H5Aget_name_by_idx(hid_t loc_id, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    char *name /*out*/, size_t size, hid_t lapl_id);
+H5_DLL hsize_t H5Aget_storage_size(hid_t attr_id);
+H5_DLL herr_t  H5Aget_info(hid_t attr_id, H5A_info_t *ainfo /*out*/);
+H5_DLL herr_t  H5Aget_info_by_name(hid_t loc_id, const char *obj_name,
+    const char *attr_name, H5A_info_t *ainfo /*out*/, hid_t lapl_id);
+H5_DLL herr_t  H5Aget_info_by_idx(hid_t loc_id, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    H5A_info_t *ainfo /*out*/, hid_t lapl_id);
+H5_DLL herr_t  H5Arename(hid_t loc_id, const char *old_name, const char *new_name);
+H5_DLL herr_t  H5Arename_by_name(hid_t loc_id, const char *obj_name,
+    const char *old_attr_name, const char *new_attr_name, hid_t lapl_id);
+H5_DLL herr_t  H5Aiterate2(hid_t loc_id, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data);
+H5_DLL herr_t  H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data,
+    hid_t lapd_id);
+H5_DLL herr_t  H5Adelete(hid_t loc_id, const char *name);
+H5_DLL herr_t  H5Adelete_by_name(hid_t loc_id, const char *obj_name,
+    const char *attr_name, hid_t lapl_id);
+H5_DLL herr_t  H5Adelete_by_idx(hid_t loc_id, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id);
+H5_DLL htri_t H5Aexists(hid_t obj_id, const char *attr_name);
+H5_DLL htri_t H5Aexists_by_name(hid_t obj_id, const char *obj_name,
+    const char *attr_name, hid_t lapl_id);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+
+/* Typedefs */
+
+/* Typedef for H5Aiterate1() callbacks */
+typedef herr_t (*H5A_operator1_t)(hid_t location_id/*in*/,
+    const char *attr_name/*in*/, void *operator_data/*in,out*/);
+
+
+/* Function prototypes */
+H5_DLL hid_t   H5Acreate1(hid_t loc_id, const char *name, hid_t type_id,
+    hid_t space_id, hid_t acpl_id);
+H5_DLL hid_t   H5Aopen_name(hid_t loc_id, const char *name);
+H5_DLL hid_t   H5Aopen_idx(hid_t loc_id, unsigned idx);
+H5_DLL int     H5Aget_num_attrs(hid_t loc_id);
+H5_DLL herr_t  H5Aiterate1(hid_t loc_id, unsigned *attr_num, H5A_operator1_t op,
+    void *op_data);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5Apublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Atest.c b/gatb-core/thirdparty/hdf5/src/H5Atest.c
new file mode 100644
index 0000000..19b5547
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Atest.c
@@ -0,0 +1,150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Atest.c
+ *			Dec 18 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Attribute testing routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+#define H5A_TESTING		/*suppress warning about H5A testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5SMprivate.h"        /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_is_shared_test
+ *
+ * Purpose:     Check if an attribute is shared
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5A_is_shared_test(hid_t attr_id)
+{
+    H5A_t	*attr;                  /* Attribute object for ID */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    /* Check if attribute is shared */
+    ret_value = H5O_msg_is_shared(H5O_ATTR_ID, attr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_is_shared_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5A_get_shared_rc_test
+ *
+ * Purpose:     Retrieve the refcount for a shared attribute
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Dec 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count)
+{
+    H5A_t	*attr;                  /* Attribute object for ID */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+    /* Sanity check */
+    HDassert(H5O_msg_is_shared(H5O_ATTR_ID, attr));
+
+    /* Retrieve ref count for shared or shareable attribute */
+    if(H5SM_get_refcount(attr->oloc.file, H5AC_ind_dxpl_id, H5O_ATTR_ID,
+            &attr->sh_loc, ref_count) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_get_shared_rc_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B.c b/gatb-core/thirdparty/hdf5/src/H5B.c
new file mode 100644
index 0000000..534118e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B.c
@@ -0,0 +1,2104 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B.c
+ *			Jul 10 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Implements balanced, sibling-linked, N-ary trees
+ *			capable of storing any type of data with unique key
+ *			values.
+ *
+ *			A B-link-tree is a balanced tree where each node has
+ *			a pointer to its left and right siblings.  A
+ *			B-link-tree is a rooted tree having the following
+ *			properties:
+ *
+ *			1. Every node, x, has the following fields:
+ *
+ *			   a. level[x], the level in the tree at which node
+ *			      x appears.  Leaf nodes are at level zero.
+ *
+ *			   b. n[x], the number of children pointed to by the
+ *			      node.  Internal nodes point to subtrees while
+ *			      leaf nodes point to arbitrary data.
+ *
+ *			   c. The child pointers themselves, child[x,i] such
+ *			      that 0 <= i < n[x].
+ *
+ *			   d. n[x]+1 key values stored in increasing
+ *			      order:
+ *
+ *				key[x,0] < key[x,1] < ... < key[x,n[x]].
+ *
+ *			   e. left[x] is a pointer to the node's left sibling
+ *			      or the null pointer if this is the left-most
+ *			      node at this level in the tree.
+ *
+ *			   f. right[x] is a pointer to the node's right
+ *			      sibling or the null pointer if this is the
+ *			      right-most node at this level in the tree.
+ *
+ *			3. The keys key[x,i] partition the key spaces of the
+ *			   children of x:
+ *
+ *			      key[x,i] <= key[child[x,i],j] <= key[x,i+1]
+ *
+ *			   for any valid combination of i and j.
+ *
+ *			4. There are lower and upper bounds on the number of
+ *			   child pointers a node can contain.  These bounds
+ *			   can be expressed in terms of a fixed integer k>=2
+ *			   called the `minimum degree' of the B-tree.
+ *
+ *			   a. Every node other than the root must have at least
+ *			      k child pointers and k+1 keys.  If the tree is
+ *			      nonempty, the root must have at least one child
+ *			      pointer and two keys.
+ *
+ *			   b. Every node can contain at most 2k child pointers
+ *			      and 2k+1 keys.  A node is `full' if it contains
+ *			      exactly 2k child pointers and 2k+1 keys.
+ *
+ *			5. When searching for a particular value, V, and
+ *			   key[V] = key[x,i] for some node x and entry i,
+ *			   then:
+ *
+ *			   a. If i=0 the child[0] is followed.
+ *
+ *			   b. If i=n[x] the child[n[x]-1] is followed.
+ *
+ *			   c. Otherwise, the child that is followed
+ *			      (either child[x,i-1] or child[x,i]) is
+ *			      determined by the type of object to which the
+ *			      leaf nodes of the tree point and is controlled
+ *			      by the key comparison function registered for
+ *			      that type of B-tree.
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bpkg.h"		/* B-link trees				*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Pprivate.h"         /* Property lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+#define H5B_SIZEOF_HDR(F)						      \
+   (H5_SIZEOF_MAGIC +		/*magic number				  */  \
+    4 +				/*type, level, num entries		  */  \
+    2*H5F_SIZEOF_ADDR(F))	/*left and right sibling addresses	  */
+
+/* Default initializer for H5B_ins_ud_t */
+#define H5B_INS_UD_T_NULL {NULL, HADDR_UNDEF, H5AC__NO_FLAGS_SET}
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* "user data" for iterating over B-tree (collects B-tree metadata size) */
+typedef struct H5B_iter_ud_t {
+    H5B_info_t *bt_info;        /* Information about B-tree */
+    void    *udata;             /* Node type's 'udata' for loading & iterator callback */
+} H5B_info_ud_t;
+
+/* Convenience struct for the arguments needed to unprotect a b-tree after a
+ * call to H5B_iterate_helper() or H5B_split() */
+typedef struct H5B_ins_ud_t {
+    H5B_t       *bt;            /* B-tree */
+    haddr_t     addr;           /* B-tree address */
+    unsigned    cache_flags;    /* Cache flags for H5AC_unprotect() */
+} H5B_ins_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static H5B_ins_t H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+				   const H5B_class_t *type,
+				   uint8_t *lt_key,
+				   hbool_t *lt_key_changed,
+				   uint8_t *md_key, void *udata,
+				   uint8_t *rt_key,
+				   hbool_t *rt_key_changed,
+				   H5B_ins_ud_t *split_bt_ud/*out*/);
+static herr_t H5B_insert_child(H5B_t *bt, unsigned *bt_flags,
+                               unsigned idx, haddr_t child,
+			       H5B_ins_t anchor, const void *md_key);
+static herr_t H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+                        unsigned idx, void *udata,
+                        H5B_ins_ud_t *split_bt_ud/*out*/);
+static H5B_t * H5B_copy(const H5B_t *old_bt);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the haddr_t sequence information */
+H5FL_SEQ_DEFINE(haddr_t);
+
+/* Declare a PQ free list to manage the native block information */
+H5FL_BLK_DEFINE(native_block);
+
+/* Declare a free list to manage the H5B_t struct */
+H5FL_DEFINE(H5B_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5B_shared_t struct */
+H5FL_DEFINE_STATIC(H5B_shared_t);
+
+/* Declare a free list to manage the raw page information */
+H5FL_BLK_DEFINE_STATIC(page);
+
+/* Declare a free list to manage the native key offset sequence information */
+H5FL_SEQ_DEFINE_STATIC(size_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_create
+ *
+ * Purpose:	Creates a new empty B-tree leaf node.  The UDATA pointer is
+ *		passed as an argument to the sizeof_rkey() method for the
+ *		B-tree.
+ *
+ * Return:	Success:	Non-negative, and the address of new node is
+ *				returned through the ADDR_P argument.
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata,
+	   haddr_t *addr_p/*out*/)
+{
+    H5B_t		*bt = NULL;
+    H5B_shared_t        *shared=NULL;        /* Pointer to shared B-tree info */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(addr_p);
+
+    /*
+     * Allocate file and memory data structures.
+     */
+    if(NULL == (bt = H5FL_MALLOC(H5B_t)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for B-tree root node")
+    HDmemset(&bt->cache_info, 0, sizeof(H5AC_info_t));
+    bt->level = 0;
+    bt->left = HADDR_UNDEF;
+    bt->right = HADDR_UNDEF;
+    bt->nchildren = 0;
+    if(NULL == (bt->rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree node buffer")
+    H5RC_INC(bt->rc_shared);
+    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    if(NULL == (bt->native = H5FL_BLK_MALLOC(native_block, shared->sizeof_keys)) ||
+            NULL == (bt->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for B-tree root node")
+    if(HADDR_UNDEF == (*addr_p = H5MF_alloc(f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)shared->sizeof_rnode)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "file allocation failed for B-tree root node")
+
+    /*
+     * Cache the new B-tree node.
+     */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_BT, *addr_p, bt, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree root node to cache")
+#ifdef H5B_DEBUG
+    H5B_assert(f, dxpl_id, *addr_p, shared->type, udata);
+#endif
+
+done:
+    if(ret_value < 0) {
+        if(shared && shared->sizeof_rnode>0) {
+            H5_CHECK_OVERFLOW(shared->sizeof_rnode,size_t,hsize_t);
+            (void)H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, *addr_p, (hsize_t)shared->sizeof_rnode);
+        } /* end if */
+	if(bt)
+            /* Destroy B-tree node */
+            if(H5B_node_dest(bt) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_create() */        /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_find
+ *
+ * Purpose:	Locate the specified information in a B-tree and return
+ *		that information by filling in fields of the caller-supplied
+ *		UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ * Note:	This function does not follow the left/right sibling
+ *		pointers since it assumes that all nodes can be reached
+ *		from the parent node.
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success (if found, values returned
+ *              through the UDATA argument). Negative on failure (if not found,
+ *              UDATA is undefined).
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
+{
+    H5B_t	*bt = NULL;
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned    idx = 0, lt = 0, rt;    /* Final, left & right key indices */
+    int	        cmp = 1;                /* Key comparison value */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(type->decode);
+    HDassert(type->cmp3);
+    HDassert(type->found);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /*
+     * Perform a binary search to locate the child which contains
+     * the thing for which we're searching.
+     */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
+
+    rt = bt->nchildren;
+    while(lt < rt && cmp) {
+	idx = (lt + rt) / 2;
+	/* compare */
+	if((cmp = (type->cmp3)(H5B_NKEY(bt, shared, idx), udata, H5B_NKEY(bt, shared, (idx + 1)))) < 0)
+	    rt = idx;
+	else
+	    lt = idx + 1;
+    } /* end while */
+    /* Check if not found */
+    if(cmp)
+	HGOTO_DONE(FALSE)
+
+    /*
+     * Follow the link to the subtree or to the data node.
+     */
+    HDassert(idx < bt->nchildren);
+
+    if(bt->level > 0) {
+	if((ret_value = H5B_find(f, dxpl_id, type, bt->child[idx], udata)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "can't lookup key in subtree")
+    } /* end if */
+    else {
+	if((ret_value = (type->found)(f, dxpl_id, bt->child[idx], H5B_NKEY(bt, shared, idx), udata)) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "can't lookup key in leaf node")
+    } /* end else */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_split
+ *
+ * Purpose:	Split a single node into two nodes.  The old node will
+ *		contain the left children and the new node will contain the
+ *		right children.
+ *
+ *		The UDATA pointer is passed to the sizeof_rkey() method but is
+ *		otherwise unused.
+ *
+ *		The BT_UD argument is a pointer to a protected B-tree
+ *		node.
+ *
+ * Return:	Non-negative on success (The address of the new node is
+ *              returned through the NEW_ADDR argument). Negative on failure.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul  3 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
+    void *udata, H5B_ins_ud_t *split_bt_ud/*out*/)
+{
+    H5P_genplist_t *dx_plist;           /* Data transfer property list */
+    H5B_shared_t  *shared;              /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned	nleft, nright;          /* Number of keys in left & right halves */
+    double      split_ratios[3];        /* B-tree split ratios */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(bt_ud);
+    HDassert(bt_ud->bt);
+    HDassert(H5F_addr_defined(bt_ud->addr));
+    HDassert(split_bt_ud);
+    HDassert(!split_bt_ud->bt);
+
+    /*
+     * Initialize variables.
+     */
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt_ud->bt->rc_shared);
+    HDassert(shared);
+    HDassert(bt_ud->bt->nchildren == shared->two_k);
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dx_plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Get B-tree split ratios */
+    if(H5P_get(dx_plist, H5D_XFER_BTREE_SPLIT_RATIO_NAME, &split_ratios[0]) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree split ratios")
+
+#ifdef H5B_DEBUG
+    if(H5DEBUG(B)) {
+	const char *side;
+
+	if(!H5F_addr_defined(bt_ud->bt->left) && !H5F_addr_defined(bt_ud->bt->right))
+	    side = "ONLY";
+	else if(!H5F_addr_defined(bt_ud->bt->right))
+	    side = "RIGHT";
+	else if(!H5F_addr_defined(bt_ud->bt->left))
+	    side = "LEFT";
+	else
+	    side = "MIDDLE";
+	fprintf(H5DEBUG(B), "H5B_split: %3u {%5.3f,%5.3f,%5.3f} %6s",
+		shared->two_k, split_ratios[0], split_ratios[1], split_ratios[2], side);
+    }
+#endif
+
+    /*
+     * Decide how to split the children of the old node among the old node
+     * and the new node.
+     */
+    if(!H5F_addr_defined(bt_ud->bt->right))
+	nleft = (unsigned)((double)shared->two_k * split_ratios[2]);	/*right*/
+    else if(!H5F_addr_defined(bt_ud->bt->left))
+	nleft = (unsigned)((double)shared->two_k * split_ratios[0]);	/*left*/
+    else
+	nleft = (unsigned)((double)shared->two_k * split_ratios[1]);	/*middle*/
+
+    /*
+     * Keep the new child in the same node as the child that split.  This can
+     * result in nodes that have an unused child when data is written
+     * sequentially, but it simplifies stuff below.
+     */
+    if(idx < nleft && nleft == shared->two_k)
+	--nleft;
+    else if(idx >= nleft && 0 == nleft)
+	nleft++;
+    nright = shared->two_k - nleft;
+#ifdef H5B_DEBUG
+    if(H5DEBUG(B))
+	fprintf(H5DEBUG(B), " split %3d/%-3d\n", nleft, nright);
+#endif
+
+    /*
+     * Create the new B-tree node.
+     */
+    if(H5B_create(f, dxpl_id, shared->type, udata, &split_bt_ud->addr/*out*/) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create B-tree")
+    cache_udata.f = f;
+    cache_udata.type = shared->type;
+    cache_udata.rc_shared = bt_ud->bt->rc_shared;
+    if(NULL == (split_bt_ud->bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, split_bt_ud->addr, &cache_udata, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree")
+    split_bt_ud->bt->level = bt_ud->bt->level;
+
+    /*
+     * Copy data from the old node to the new node.
+     */
+
+    split_bt_ud->cache_flags = H5AC__DIRTIED_FLAG;
+    HDmemcpy(split_bt_ud->bt->native,
+	     bt_ud->bt->native + nleft * shared->type->sizeof_nkey,
+	     (nright + 1) * shared->type->sizeof_nkey);
+    HDmemcpy(split_bt_ud->bt->child,
+            &bt_ud->bt->child[nleft],
+            nright * sizeof(haddr_t));
+
+    split_bt_ud->bt->nchildren = nright;
+
+    /*
+     * Truncate the old node.
+     */
+    bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+    bt_ud->bt->nchildren = nleft;
+
+    /*
+     * Update other sibling pointers.
+     */
+    split_bt_ud->bt->left = bt_ud->addr;
+    split_bt_ud->bt->right = bt_ud->bt->right;
+
+    if(H5F_addr_defined(bt_ud->bt->right)) {
+        H5B_t   *tmp_bt;
+
+        if(NULL == (tmp_bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt_ud->bt->right, &cache_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load right sibling")
+
+        tmp_bt->left = split_bt_ud->addr;
+
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt_ud->bt->right, tmp_bt, H5AC__DIRTIED_FLAG) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
+    bt_ud->bt->right = split_bt_ud->addr;
+
+done:
+    if(ret_value < 0) {
+        if(split_bt_ud->bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, split_bt_ud->addr, split_bt_ud->bt, split_bt_ud->cache_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+        split_bt_ud->bt = NULL;
+        split_bt_ud->addr = HADDR_UNDEF;
+        split_bt_ud->cache_flags = H5AC__NO_FLAGS_SET;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_split() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_insert
+ *
+ * Purpose:	Adds a new item to the B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
+{
+    /*
+     * These are defined this way to satisfy alignment constraints.
+     */
+    uint64_t	_lt_key[128], _md_key[128], _rt_key[128];
+    uint8_t	*lt_key=(uint8_t*)_lt_key;
+    uint8_t	*md_key=(uint8_t*)_md_key;
+    uint8_t	*rt_key=(uint8_t*)_rt_key;
+
+    hbool_t	lt_key_changed = FALSE, rt_key_changed = FALSE;
+    haddr_t     old_root_addr = HADDR_UNDEF;
+    unsigned	level;
+    H5B_ins_ud_t bt_ud = H5B_INS_UD_T_NULL; /* (Old) root node */
+    H5B_ins_ud_t split_bt_ud = H5B_INS_UD_T_NULL; /* Split B-tree node */
+    H5B_t       *new_root_bt = NULL;    /* New root node */
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    H5B_ins_t	my_ins = H5B_INS_ERROR;
+    herr_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(type);
+    HDassert(type->sizeof_nkey <= sizeof _lt_key);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /* Protect the root node */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    bt_ud.addr = addr;
+    if(NULL == (bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to locate root of B-tree")
+
+    /* Insert the object */
+    if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &bt_ud, type, lt_key,
+            &lt_key_changed, md_key, udata, rt_key, &rt_key_changed,
+            &split_bt_ud/*out*/)) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to insert key")
+
+    /* Check if the root node split */
+    if(H5B_INS_NOOP == my_ins) {
+        HDassert(!split_bt_ud.bt);
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
+    HDassert(H5B_INS_RIGHT == my_ins);
+    HDassert(split_bt_ud.bt);
+    HDassert(H5F_addr_defined(split_bt_ud.addr));
+
+    /* Get level of old root */
+    level = bt_ud.bt->level;
+
+    /* update left and right keys */
+    if(!lt_key_changed)
+	HDmemcpy(lt_key, H5B_NKEY(bt_ud.bt,shared,0), type->sizeof_nkey);
+    if(!rt_key_changed)
+	HDmemcpy(rt_key, H5B_NKEY(split_bt_ud.bt,shared,split_bt_ud.bt->nchildren), type->sizeof_nkey);
+
+    /*
+     * Copy the old root node to some other file location and make the new root
+     * at the old root's previous address.  This prevents the B-tree from
+     * "moving".
+     */
+    H5_CHECK_OVERFLOW(shared->sizeof_rnode,size_t,hsize_t);
+    if(HADDR_UNDEF == (old_root_addr = H5MF_alloc(f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)shared->sizeof_rnode)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "unable to allocate file space to move root")
+
+    /*
+     * Move the node to the new location
+     */
+
+    /* Make a copy of the old root information */
+    if(NULL == (new_root_bt = H5B_copy(bt_ud.bt)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to copy old root")
+
+    /* Unprotect the old root so we can move it.  Also force it to be marked
+     * dirty so it is written to the new location. */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt_ud.addr, bt_ud.bt, H5AC__DIRTIED_FLAG) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release old root")
+    bt_ud.bt = NULL;  /* Make certain future references will be caught */
+
+    /* Move the location of the old root on the disk */
+    if(H5AC_move_entry(f, H5AC_BT, bt_ud.addr, old_root_addr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to move B-tree root node")
+    bt_ud.addr = old_root_addr;
+
+    /* Update the split b-tree's left pointer to point to the new location */
+    split_bt_ud.bt->left = bt_ud.addr;
+    split_bt_ud.cache_flags |= H5AC__DIRTIED_FLAG;
+
+    /* clear the old root info at the old address (we already copied it) */
+    new_root_bt->left = HADDR_UNDEF;
+    new_root_bt->right = HADDR_UNDEF;
+
+    /* Set the new information for the copy */
+    new_root_bt->level = level + 1;
+    new_root_bt->nchildren = 2;
+
+    new_root_bt->child[0] = bt_ud.addr;
+    HDmemcpy(H5B_NKEY(new_root_bt, shared, 0), lt_key, shared->type->sizeof_nkey);
+
+    new_root_bt->child[1] = split_bt_ud.addr;
+    HDmemcpy(H5B_NKEY(new_root_bt, shared, 1), md_key, shared->type->sizeof_nkey);
+    HDmemcpy(H5B_NKEY(new_root_bt, shared, 2), rt_key, shared->type->sizeof_nkey);
+
+    /* Insert the modified copy of the old root into the file again */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_BT, addr, new_root_bt, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to add old B-tree root node to cache")
+
+done:
+    if(ret_value < 0)
+        if(new_root_bt && H5B_node_dest(new_root_bt) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to free B-tree root node");
+
+    if(bt_ud.bt)
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt_ud.addr, bt_ud.bt, bt_ud.cache_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to unprotect old root")
+
+    if(split_bt_ud.bt)
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, split_bt_ud.addr, split_bt_ud.bt, split_bt_ud.cache_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to unprotect new child")
+
+#ifdef H5B_DEBUG
+    if(ret_value >= 0)
+        H5B_assert(f, dxpl_id, addr, type, udata);
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_insert_child
+ *
+ * Purpose:	Insert a child to the left or right of child[IDX] depending
+ *		on whether ANCHOR is H5B_INS_LEFT or H5B_INS_RIGHT. The BT
+ *		argument is a pointer to a protected B-tree node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul  8 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B_insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx,
+    haddr_t child, H5B_ins_t anchor, const void *md_key)
+{
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    uint8_t             *base;          /* Base offset for move */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(bt);
+    HDassert(bt_flags);
+    HDassert(H5F_addr_defined(child));
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    HDassert(bt->nchildren < shared->two_k);
+
+    /* Check for inserting right-most key into node (common when just appending
+     * records to an unlimited dimension chunked dataset)
+     */
+    base = H5B_NKEY(bt, shared, (idx + 1));
+    if((idx + 1) == bt->nchildren) {
+        /* Make room for the new key */
+        HDmemcpy(base + shared->type->sizeof_nkey, base,
+                  shared->type->sizeof_nkey);   /* No overlap possible - memcpy() OK */
+        HDmemcpy(base, md_key, shared->type->sizeof_nkey);
+
+        /* The MD_KEY is the left key of the new node */
+        if(H5B_INS_RIGHT == anchor)
+            idx++;  /* Don't have to memmove() child addresses down, just add new child */
+        else
+            /* Make room for the new child address */
+            bt->child[idx + 1] = bt->child[idx];
+    } /* end if */
+    else {
+        /* Make room for the new key */
+        HDmemmove(base + shared->type->sizeof_nkey, base,
+                  (bt->nchildren - idx) * shared->type->sizeof_nkey);
+        HDmemcpy(base, md_key, shared->type->sizeof_nkey);
+
+        /* The MD_KEY is the left key of the new node */
+        if(H5B_INS_RIGHT == anchor)
+            idx++;
+
+        /* Make room for the new child address */
+        HDmemmove(bt->child + idx + 1, bt->child + idx,
+                  (bt->nchildren - idx) * sizeof(haddr_t));
+    } /* end if */
+
+    bt->child[idx] = child;
+    bt->nchildren += 1;
+
+    /* Mark node as dirty */
+    *bt_flags |= H5AC__DIRTIED_FLAG;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B_insert_child() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_insert_helper
+ *
+ * Purpose:	Inserts the item UDATA into the tree rooted at ADDR and having
+ *		the specified type.
+ *
+ *		On return, if LT_KEY_CHANGED is non-zero, then LT_KEY is
+ *		the new native left key.  Similarily for RT_KEY_CHANGED
+ *		and RT_KEY.
+ *
+ *		If the node splits, then MD_KEY contains the key that
+ *		was split between the two nodes (that is, the key that
+ *		appears as the max key in the left node and the min key
+ *		in the right node).
+ *
+ * Return:	Success:	A B-tree operation.  The address of the new
+ *				node, if the node splits, is returned through
+ *				the NEW_NODE_P argument. The new node is always
+ *				to the right of the previous node.  This
+ *				function is called recursively and the return
+ *				value influences the behavior of the caller.
+ *				See also, declaration of H5B_ins_t.
+ *
+ *		Failure:	H5B_INS_ERROR
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_ins_t
+H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+                  const H5B_class_t *type,
+                  uint8_t *lt_key, hbool_t *lt_key_changed,
+                  uint8_t *md_key, void *udata,
+		  uint8_t *rt_key, hbool_t *rt_key_changed,
+		  H5B_ins_ud_t *split_bt_ud/*out*/)
+{
+    H5B_t       *bt;                    /* Convenience pointer to B-tree */
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned	lt = 0, idx = 0, rt;    /* Left, final & right index values */
+    int         cmp = -1;               /* Key comparison value */
+    H5B_ins_ud_t child_bt_ud = H5B_INS_UD_T_NULL; /* Child B-tree */
+    H5B_ins_ud_t new_child_bt_ud = H5B_INS_UD_T_NULL; /* Newly split child B-tree */
+    H5B_ins_t	my_ins = H5B_INS_ERROR;
+    H5B_ins_t	ret_value = H5B_INS_ERROR;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments
+     */
+    HDassert(f);
+    HDassert(bt_ud);
+    HDassert(bt_ud->bt);
+    HDassert(H5F_addr_defined(bt_ud->addr));
+    HDassert(type);
+    HDassert(type->decode);
+    HDassert(type->cmp3);
+    HDassert(type->new_node);
+    HDassert(lt_key);
+    HDassert(lt_key_changed);
+    HDassert(rt_key);
+    HDassert(rt_key_changed);
+    HDassert(split_bt_ud);
+    HDassert(!split_bt_ud->bt);
+    HDassert(!H5F_addr_defined(split_bt_ud->addr));
+    HDassert(split_bt_ud->cache_flags == H5AC__NO_FLAGS_SET);
+
+    bt = bt_ud->bt;
+
+    *lt_key_changed = FALSE;
+    *rt_key_changed = FALSE;
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, H5B_INS_ERROR, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /*
+     * Use a binary search to find the child that will receive the new
+     * data.  When the search completes IDX points to the child that
+     * should get the new data.
+     */
+    rt = bt->nchildren;
+
+    while(lt < rt && cmp) {
+	idx = (lt + rt) / 2;
+	if((cmp = (type->cmp3)(H5B_NKEY(bt, shared, idx), udata, H5B_NKEY(bt, shared, idx + 1))) < 0)
+	    rt = idx;
+	else
+	    lt = idx + 1;
+    } /* end while */
+
+    /* Set up user data for cache callbacks */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+
+    if(0 == bt->nchildren) {
+	/*
+	 * The value being inserted will be the only value in this tree. We
+	 * must necessarily be at level zero.
+	 */
+	HDassert(0 == bt->level);
+	if((type->new_node)(f, dxpl_id, H5B_INS_FIRST, H5B_NKEY(bt, shared, 0), udata,
+			     H5B_NKEY(bt, shared, 1), bt->child + 0/*out*/) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, H5B_INS_ERROR, "unable to create leaf node")
+	bt->nchildren = 1;
+        bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+	idx = 0;
+
+	if(type->follow_min) {
+	    if((int)(my_ins = (type->insert)(f, dxpl_id, bt->child[idx], H5B_NKEY(bt, shared, idx),
+                     lt_key_changed, md_key, udata, H5B_NKEY(bt, shared, idx + 1),
+                     rt_key_changed, &new_child_bt_ud.addr/*out*/)) < 0)
+		HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "unable to insert first leaf node")
+	} /* end if */
+        else
+	    my_ins = H5B_INS_NOOP;
+    } else if(cmp < 0 && idx == 0) {
+        if(bt->level > 0) {
+            /*
+             * The value being inserted is less than any value in this tree.
+             * Follow the minimum branch out of this node to a subtree.
+             */
+            child_bt_ud.addr = bt->child[idx];
+            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
+
+            if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+                    H5B_NKEY(bt,shared,idx), lt_key_changed, md_key,
+                    udata, H5B_NKEY(bt, shared, idx + 1), rt_key_changed,
+                    &new_child_bt_ud/*out*/)) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert minimum subtree")
+        } else if(type->follow_min) {
+            /*
+             * The value being inserted is less than any leaf node out of this
+             * current node.  Follow the minimum branch to a leaf node and let
+             * the subclass handle the problem.
+             */
+            if((int)(my_ins = (type->insert)(f, dxpl_id, bt->child[idx], H5B_NKEY(bt, shared, idx),
+                    lt_key_changed, md_key, udata, H5B_NKEY(bt, shared, idx + 1),
+                    rt_key_changed, &new_child_bt_ud.addr/*out*/)) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert minimum leaf node")
+        } else {
+            /*
+             * The value being inserted is less than any leaf node out of the
+             * current node. Create a new minimum leaf node out of this B-tree
+             * node. This node is not empty (handled above).
+             */
+            my_ins = H5B_INS_LEFT;
+            HDmemcpy(md_key, H5B_NKEY(bt,shared,idx), type->sizeof_nkey);
+            if((type->new_node)(f, dxpl_id, H5B_INS_LEFT, H5B_NKEY(bt, shared, idx), udata,
+                    md_key, &new_child_bt_ud.addr/*out*/) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert minimum leaf node")
+            *lt_key_changed = TRUE;
+        } /* end else */
+
+#ifdef H5_STRICT_FORMAT_CHECKS
+        /* Since we are to the left of the leftmost key there must not be a left
+         * sibling */
+        if(H5F_addr_defined(bt->left))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "internal error: likely corrupt key values")
+#endif /* H5_STRICT_FORMAT_CHECKS */
+    } else if(cmp > 0 && idx + 1 >= bt->nchildren) {
+        if (bt->level > 0) {
+            /*
+            * The value being inserted is larger than any value in this tree.
+            * Follow the maximum branch out of this node to a subtree.
+            */
+            idx = bt->nchildren - 1;
+            child_bt_ud.addr = bt->child[idx];
+            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
+
+            if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+                    H5B_NKEY(bt, shared, idx), lt_key_changed, md_key, udata,
+                    H5B_NKEY(bt, shared, idx + 1), rt_key_changed,
+                    &new_child_bt_ud/*out*/)) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert maximum subtree")
+        } else if(type->follow_max) {
+            /*
+             * The value being inserted is larger than any leaf node out of the
+             * current node.  Follow the maximum branch to a leaf node and let
+             * the subclass handle the problem.
+             */
+            idx = bt->nchildren - 1;
+            if((int)(my_ins = (type->insert)(f, dxpl_id, bt->child[idx], H5B_NKEY(bt, shared, idx),
+                    lt_key_changed, md_key, udata, H5B_NKEY(bt, shared, idx + 1),
+                    rt_key_changed, &new_child_bt_ud.addr/*out*/)) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert maximum leaf node")
+        } else {
+            /*
+             * The value being inserted is larger than any leaf node out of the
+             * current node.  Create a new maximum leaf node out of this B-tree
+             * node.
+             */
+            idx = bt->nchildren - 1;
+            my_ins = H5B_INS_RIGHT;
+            HDmemcpy(md_key, H5B_NKEY(bt, shared, idx + 1), type->sizeof_nkey);
+            if((type->new_node)(f, dxpl_id, H5B_INS_RIGHT, md_key, udata,
+                    H5B_NKEY(bt, shared, idx + 1), &new_child_bt_ud.addr/*out*/) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert maximum leaf node")
+            *rt_key_changed = TRUE;
+        } /* end else */
+
+#ifdef H5_STRICT_FORMAT_CHECKS
+        /* Since we are to the right of the rightmost key there must not be a
+         * right sibling */
+        if(H5F_addr_defined(bt->right))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "internal error: likely corrupt key values")
+#endif /* H5_STRICT_FORMAT_CHECKS */
+    } else if(cmp) {
+	/*
+	 * We couldn't figure out which branch to follow out of this node. THIS
+	 * IS A MAJOR PROBLEM THAT NEEDS TO BE FIXED --rpm.
+	 */
+	HDassert("INTERNAL HDF5 ERROR (contact rpm)" && 0);
+#ifdef NDEBUG
+	HDabort();
+#endif /* NDEBUG */
+    } else if(bt->level > 0) {
+	/*
+	 * Follow a branch out of this node to another subtree.
+	 */
+	HDassert(idx < bt->nchildren);
+	child_bt_ud.addr = bt->child[idx];
+        if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
+
+	if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+                H5B_NKEY(bt, shared, idx), lt_key_changed, md_key, udata,
+                H5B_NKEY(bt, shared, idx + 1), rt_key_changed, &new_child_bt_ud/*out*/)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert subtree")
+    } else {
+	/*
+	 * Follow a branch out of this node to a leaf node of some other type.
+	 */
+	HDassert(idx < bt->nchildren);
+	if((int)(my_ins = (type->insert)(f, dxpl_id, bt->child[idx], H5B_NKEY(bt, shared, idx),
+                  lt_key_changed, md_key, udata, H5B_NKEY(bt, shared, idx + 1),
+                  rt_key_changed, &new_child_bt_ud.addr/*out*/)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert leaf node")
+    }
+    HDassert((int)my_ins >= 0);
+
+    /*
+     * Update the left and right keys of the current node.
+     */
+    if(*lt_key_changed) {
+        bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+        if(idx > 0) {
+            HDassert(type->critical_key == H5B_LEFT);
+            HDassert(!(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins));
+            *lt_key_changed = FALSE;
+        } /* end if */
+        else
+            HDmemcpy(lt_key, H5B_NKEY(bt, shared, idx), type->sizeof_nkey);
+    } /* end if */
+    if(*rt_key_changed) {
+        bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+        if(idx + 1 < bt->nchildren) {
+            HDassert(type->critical_key == H5B_RIGHT);
+            HDassert(!(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins));
+            *rt_key_changed = FALSE;
+        } /* end if */
+        else
+            HDmemcpy(rt_key, H5B_NKEY(bt, shared, idx + 1), type->sizeof_nkey);
+    } /* end if */
+
+    /*
+     * Handle changes/additions to children
+     */
+    if(H5B_INS_CHANGE == my_ins) {
+	/*
+	 * The insertion simply changed the address for the child.
+	 */
+	HDassert(!child_bt_ud.bt);
+	HDassert(bt->level == 0);
+	bt->child[idx] = new_child_bt_ud.addr;
+        bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+    } else if(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins) {
+        hbool_t *tmp_bt_flags_ptr = NULL;
+        H5B_t	*tmp_bt;
+
+	/*
+	 * If this node is full then split it before inserting the new child.
+	 */
+	if(bt->nchildren == shared->two_k) {
+	    if(H5B_split(f, dxpl_id, bt_ud, idx, udata, split_bt_ud/*out*/) < 0)
+		HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, H5B_INS_ERROR, "unable to split node")
+	    if(idx < bt->nchildren) {
+		tmp_bt = bt;
+                tmp_bt_flags_ptr = &bt_ud->cache_flags;
+	    } else {
+		idx -= bt->nchildren;
+		tmp_bt = split_bt_ud->bt;
+                tmp_bt_flags_ptr = &split_bt_ud->cache_flags;
+	    }
+	} /* end if */
+        else {
+	    tmp_bt = bt;
+            tmp_bt_flags_ptr = &bt_ud->cache_flags;
+	} /* end else */
+
+	/* Insert the child */
+	if(H5B_insert_child(tmp_bt, tmp_bt_flags_ptr, idx, new_child_bt_ud.addr, my_ins, md_key) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert child")
+    } /* end else-if */
+
+    /*
+     * If this node split, return the mid key (the one that is shared
+     * by the left and right node).
+     */
+    if(split_bt_ud->bt) {
+	HDmemcpy(md_key, H5B_NKEY(split_bt_ud->bt, shared, 0), type->sizeof_nkey);
+	ret_value = H5B_INS_RIGHT;
+#ifdef H5B_DEBUG
+	/*
+	 * The max key in the original left node must be equal to the min key
+	 * in the new node.
+	 */
+	cmp = (type->cmp2)(H5B_NKEY(bt, shared, bt->nchildren), udata,
+			    H5B_NKEY(split_bt_ud->bt, shared, 0));
+	HDassert(0 == cmp);
+#endif
+    } /* end if */
+    else
+	ret_value = H5B_INS_NOOP;
+
+done:
+    if(child_bt_ud.bt)
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, child_bt_ud.bt, child_bt_ud.cache_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to unprotect child")
+
+    if(new_child_bt_ud.bt)
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, new_child_bt_ud.addr, new_child_bt_ud.bt, new_child_bt_ud.cache_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to unprotect new child")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_insert_helper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_iterate_helper
+ *
+ * Purpose:	Calls the list callback for each leaf node of the
+ *		B-tree, passing it the caller's UDATA structure.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+    H5B_operator_t op, void *udata)
+{
+    H5B_t               *bt = NULL;     /* Pointer to current B-tree node */
+    H5RC_t	        *rc_shared;     /* Ref-counted shared info */
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    H5B_cache_ud_t      cache_udata;    /* User-data for metadata cache callback */
+    unsigned            u;              /* Local index variable */
+    herr_t              ret_value = H5_ITER_CONT; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(op);
+    HDassert(udata);
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /* Protect the initial/current node */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load B-tree node")
+
+    /* Iterate over node's children */
+    for(u = 0; u < bt->nchildren && ret_value == H5_ITER_CONT; u++) {
+        if(bt->level > 0)
+            ret_value = H5B_iterate_helper(f, dxpl_id, type, bt->child[u], op, udata);
+        else
+            ret_value = (*op)(f, dxpl_id, H5B_NKEY(bt, shared, u), bt->child[u], H5B_NKEY(bt, shared, u + 1), udata);
+        if(ret_value < 0)
+            HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed");
+    } /* end for */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_iterate_helper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_iterate
+ *
+ * Purpose:	Calls the list callback for each leaf node of the
+ *		B-tree, passing it the UDATA structure.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+    H5B_operator_t op, void *udata)
+{
+    herr_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(op);
+    HDassert(udata);
+
+    /* Iterate over the B-tree records */
+    if((ret_value = H5B_iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
+        HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_remove_helper
+ *
+ * Purpose:	The recursive part of removing an item from a B-tree.  The
+ *		sub B-tree that is being considered is located at ADDR and
+ *		the item to remove is described by UDATA.  If the removed
+ *		item falls at the left or right end of the current level then
+ *		it might be necessary to adjust the left and/or right keys
+ *		(LT_KEY and/or RT_KEY) to to indicate that they changed by
+ * 		setting LT_KEY_CHANGED and/or RT_KEY_CHANGED.
+ *
+ * Return:	Success:	A B-tree operation, see comments for
+ *				H5B_ins_t declaration.  This function is
+ *				called recursively and the return value
+ *				influences the actions of the caller. It is
+ *				also called by H5B_remove().
+ *
+ *		Failure:	H5B_INS_ERROR, a negative value.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, September 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_ins_t
+H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
+		  int level, uint8_t *lt_key/*out*/,
+		  hbool_t *lt_key_changed/*out*/, void *udata,
+		  uint8_t *rt_key/*out*/, hbool_t *rt_key_changed/*out*/)
+{
+    H5B_t	*bt = NULL, *sibling = NULL;
+    unsigned	bt_flags = H5AC__NO_FLAGS_SET;
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned    idx = 0, lt = 0, rt;    /* Final, left & right indices */
+    int         cmp = 1;                /* Key comparison value */
+    H5B_ins_t	ret_value = H5B_INS_ERROR;
+
+    FUNC_ENTER_NOAPI(H5B_INS_ERROR)
+
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(type);
+    HDassert(type->decode);
+    HDassert(type->cmp3);
+    HDassert(lt_key && lt_key_changed);
+    HDassert(udata);
+    HDassert(rt_key && rt_key_changed);
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, H5B_INS_ERROR, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /*
+     * Perform a binary search to locate the child which contains the thing
+     * for which we're searching.
+     */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load B-tree node")
+
+    rt = bt->nchildren;
+    while(lt < rt && cmp) {
+	idx = (lt + rt) / 2;
+	if((cmp = (type->cmp3)(H5B_NKEY(bt, shared, idx), udata, H5B_NKEY(bt, shared, idx + 1))) < 0)
+	    rt = idx;
+	else
+	    lt = idx + 1;
+    } /* end while */
+    if(cmp)
+	HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, H5B_INS_ERROR, "B-tree key not found")
+
+    /*
+     * Follow the link to the subtree or to the data node.  The return value
+     * will be one of H5B_INS_ERROR, H5B_INS_NOOP, or H5B_INS_REMOVE.
+     */
+    HDassert(idx < bt->nchildren);
+    if(bt->level > 0) {
+	/* We're at an internal node -- call recursively */
+	if((int)(ret_value = H5B_remove_helper(f, dxpl_id,
+                 bt->child[idx], type, level + 1, H5B_NKEY(bt, shared, idx)/*out*/,
+                 lt_key_changed/*out*/, udata, H5B_NKEY(bt, shared, idx + 1)/*out*/,
+                 rt_key_changed/*out*/)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, H5B_INS_ERROR, "key not found in subtree")
+    } else if(type->remove) {
+	/*
+	 * We're at a leaf node but the leaf node points to an object that
+	 * has a removal method.  Pass the removal request to the pointed-to
+	 * object and let it decide how to progress.
+	 */
+	if((int)(ret_value = (type->remove)(f, dxpl_id,
+                  bt->child[idx], H5B_NKEY(bt, shared, idx), lt_key_changed, udata,
+                  H5B_NKEY(bt, shared, idx + 1), rt_key_changed)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, H5B_INS_ERROR, "key not found in leaf node")
+    } else {
+	/*
+	 * We're at a leaf node which points to an object that has no removal
+	 * method.  The best we can do is to leave the object alone but
+	 * remove the B-tree reference to the object.
+	 */
+	*lt_key_changed = FALSE;
+	*rt_key_changed = FALSE;
+	ret_value = H5B_INS_REMOVE;
+    }
+
+    /*
+     * Update left and right key dirty bits if the subtree indicates that they
+     * have changed.  If the subtree's left key changed and the subtree is the
+     * left-most child of the current node then we must update the key in our
+     * parent and indicate that it changed.  Similarly, if the right subtree
+     * key changed and it's the right most key of this node we must update
+     * our right key and indicate that it changed.
+     */
+    if(*lt_key_changed) {
+        HDassert(type->critical_key == H5B_LEFT);
+        bt_flags |= H5AC__DIRTIED_FLAG;
+
+        if(idx > 0)
+            /* Don't propagate change out of this B-tree node */
+            *lt_key_changed = FALSE;
+        else
+            HDmemcpy(lt_key, H5B_NKEY(bt, shared, idx), type->sizeof_nkey);
+    } /* end if */
+    if(*rt_key_changed) {
+        HDassert(type->critical_key == H5B_RIGHT);
+        bt_flags |= H5AC__DIRTIED_FLAG;
+        if(idx + 1 < bt->nchildren)
+            /* Don't propagate change out of this B-tree node */
+            *rt_key_changed = FALSE;
+        else
+            HDmemcpy(rt_key, H5B_NKEY(bt, shared, idx + 1), type->sizeof_nkey);
+    } /* end if */
+
+    /*
+     * If the subtree returned H5B_INS_REMOVE then we should remove the
+     * subtree entry from the current node.  There are four cases:
+     */
+    if(H5B_INS_REMOVE == ret_value) {
+        /* Clients should not change keys when a node is removed.  This function
+         * will handle it as appropriate, based on the value of bt->critical_key
+         */
+        HDassert(!(*lt_key_changed));
+        HDassert(!(*rt_key_changed));
+
+        if(1 == bt->nchildren) {
+            /*
+             * The subtree is the only child of this node.  Discard both
+             * keys and the subtree pointer. Free this node (unless it's the
+             * root node) and return H5B_INS_REMOVE.
+             */
+            /* Only delete the node if it is not the root node.  Note that this
+             * "level" is the opposite of bt->level */
+            if(level > 0) {
+                /* Fix siblings, making sure that the keys remain consistent
+                 * between siblings.  Overwrite the key that that is not
+                 * "critical" for any child in its node to maintain this
+                 * consistency (and avoid breaking key/child consistency) */
+                if(H5F_addr_defined(bt->left)) {
+                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC_WRITE)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node from tree")
+
+                    /* Copy right-most key from deleted node to right-most key
+                     * in its left neighbor, but only if it is not the critical
+                     * key for the right-most child of the left neighbor */
+                    if(type->critical_key == H5B_LEFT)
+                        HDmemcpy(H5B_NKEY(sibling, shared, sibling->nchildren),
+                                H5B_NKEY(bt, shared, 1), type->sizeof_nkey);
+
+                    sibling->right = bt->right;
+
+                    if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->left, sibling, H5AC__DIRTIED_FLAG) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree")
+                    sibling = NULL;   /* Make certain future references will be caught */
+                } /* end if */
+                if(H5F_addr_defined(bt->right)) {
+                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC_WRITE)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to unlink node from tree")
+
+                    /* Copy left-most key from deleted node to left-most key in
+                     * its right neighbor, but only if it is not the critical
+                     * key for the left-most child of the right neighbor */
+                    if(type->critical_key == H5B_RIGHT)
+                        HDmemcpy(H5B_NKEY(sibling, shared, 0),
+                                H5B_NKEY(bt, shared, 0), type->sizeof_nkey);
+
+                    sibling->left = bt->left;
+
+                    if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->right, sibling, H5AC__DIRTIED_FLAG) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree")
+                    sibling = NULL;   /* Make certain future references will be caught */
+                } /* end if */
+
+                /* Update bt struct */
+                bt->left = HADDR_UNDEF;
+                bt->right = HADDR_UNDEF;
+                bt->nchildren = 0;
+
+                /* Delete the node from disk (via the metadata cache) */
+                bt_flags |= H5AC__DIRTIED_FLAG;
+                H5_CHECK_OVERFLOW(shared->sizeof_rnode, size_t, hsize_t);
+                if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, bt_flags | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0) {
+                    bt = NULL;
+                    bt_flags = H5AC__NO_FLAGS_SET;
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to free B-tree node")
+                } /* end if */
+                bt = NULL;
+                bt_flags = H5AC__NO_FLAGS_SET;
+            } else {
+                /* We removed the last child in the root node, set the level
+                 * back to 0 (as well as nchildren) */
+                bt->nchildren = 0;
+                bt->level = 0;
+                bt_flags |= H5AC__DIRTIED_FLAG;
+            } /* end else */
+        } else if(0 == idx) {
+            /*
+             * The subtree is the left-most child of this node. We update the
+             * key and child arrays and lt_key as appropriate, depending on the
+             * status of bt->critical_key.  Return H5B_INS_NOOP.
+             */
+            if(type->critical_key == H5B_LEFT) {
+                /* Slide all keys down 1, update lt_key */
+                HDmemmove(H5B_NKEY(bt, shared, 0), H5B_NKEY(bt, shared, 1),
+                        bt->nchildren * type->sizeof_nkey);
+                HDmemcpy(lt_key, H5B_NKEY(bt, shared, 0), type->sizeof_nkey);
+                *lt_key_changed = TRUE;
+            } else
+                /* Slide all but the leftmost 2 keys down, leaving the leftmost
+                 * key intact (the right key of the leftmost child is
+                 * overwritten) */
+                HDmemmove(H5B_NKEY(bt, shared, 1), H5B_NKEY(bt, shared, 2),
+                        (bt->nchildren - 1) * type->sizeof_nkey);
+
+            HDmemmove(bt->child,
+                    bt->child + 1,
+                    (bt->nchildren - 1) * sizeof(haddr_t));
+
+            bt->nchildren -= 1;
+            bt_flags |= H5AC__DIRTIED_FLAG;
+            ret_value = H5B_INS_NOOP;
+        } else if(idx + 1 == bt->nchildren) {
+            /*
+             * The subtree is the right-most child of this node. We update the
+             * key and child arrays and rt_key as appropriate, depending on the
+             * status of bt->critical_key.  Return H5B_INS_NOOP.
+             */
+            if(type->critical_key == H5B_LEFT)
+                /* Slide the rightmost key down one, overwriting the left key of
+                 * the deleted (righmost) child */
+                HDmemmove(H5B_NKEY(bt, shared, bt->nchildren - 1),
+                        H5B_NKEY(bt, shared, bt->nchildren), type->sizeof_nkey);
+            else {
+                /* Just update rt_key */
+                HDmemcpy(rt_key, H5B_NKEY(bt, shared, bt->nchildren - 1),
+                        type->sizeof_nkey);
+                *rt_key_changed = TRUE;
+            } /* end else */
+
+            bt->nchildren -= 1;
+            bt_flags |= H5AC__DIRTIED_FLAG;
+            ret_value = H5B_INS_NOOP;
+        } else {
+            /*
+             * There are subtrees out of this node to both the left and right of
+             * the subtree being removed.  The subtree and its critical key are
+             * removed from this node and all keys and nodes to the right are
+             * shifted left by one place.  The subtree has already been freed.
+             * Return H5B_INS_NOOP.
+             */
+            if(type->critical_key == H5B_LEFT)
+                HDmemmove(H5B_NKEY(bt, shared, idx),
+                        H5B_NKEY(bt, shared, idx + 1),
+                        (bt->nchildren - idx) * type->sizeof_nkey);
+            else
+                HDmemmove(H5B_NKEY(bt, shared, idx + 1),
+                        H5B_NKEY(bt, shared, idx + 2),
+                        (bt->nchildren - 1 - idx) * type->sizeof_nkey);
+
+            HDmemmove(bt->child + idx,
+                    bt->child + idx + 1,
+                    (bt->nchildren - 1 - idx) * sizeof(haddr_t));
+
+            bt->nchildren -= 1;
+            bt_flags |= H5AC__DIRTIED_FLAG;
+            ret_value = H5B_INS_NOOP;
+        } /* end else */
+    } else /* H5B_INS_REMOVE != ret_value */
+        ret_value = H5B_INS_NOOP;
+
+    /* Patch keys in neighboring trees if necessary */
+    if(*lt_key_changed && H5F_addr_defined(bt->left)) {
+        HDassert(type->critical_key == H5B_LEFT);
+        HDassert(level > 0);
+
+        /* Update the rightmost key in the left sibling */
+        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to protect node")
+
+        HDmemcpy(H5B_NKEY(sibling, shared, sibling->nchildren),
+                H5B_NKEY(bt, shared, 0), type->sizeof_nkey);
+
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->left, sibling, H5AC__DIRTIED_FLAG) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree")
+        sibling = NULL;   /* Make certain future references will be caught */
+    } /* end if */
+    else if(*rt_key_changed && H5F_addr_defined(bt->right)) {
+        HDassert(type->critical_key == H5B_RIGHT);
+        HDassert(level > 0);
+
+        /* Update the lefttmost key in the right sibling */
+        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to protect node")
+
+        HDmemcpy(H5B_NKEY(sibling, shared, 0),
+                H5B_NKEY(bt, shared, bt->nchildren), type->sizeof_nkey);
+
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->right, sibling, H5AC__DIRTIED_FLAG) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree")
+        sibling = NULL;   /* Make certain future references will be caught */
+    } /* end else */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, bt_flags) < 0)
+	HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_remove_helper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_remove
+ *
+ * Purpose:	Removes an item from a B-tree.
+ *
+ * Note:	The current version does not attempt to rebalance the tree.
+ *              (Read the paper Yao & Lehman paper for details on why)
+ *
+ * Return:	Non-negative on success/Negative on failure (failure includes
+ *		not being able to find the object which is to be removed).
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, September 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_remove(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
+{
+    /* These are defined this way to satisfy alignment constraints */
+    uint64_t	_lt_key[128], _rt_key[128];
+    uint8_t	*lt_key = (uint8_t*)_lt_key;	/*left key*/
+    uint8_t	*rt_key = (uint8_t*)_rt_key;	/*right key*/
+    hbool_t	lt_key_changed = FALSE;		/*left key changed?*/
+    hbool_t	rt_key_changed = FALSE;		/*right key changed?*/
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(type);
+    HDassert(type->sizeof_nkey <= sizeof _lt_key);
+    HDassert(H5F_addr_defined(addr));
+
+    /* The actual removal */
+    if(H5B_remove_helper(f, dxpl_id, addr, type, 0, lt_key, &lt_key_changed,
+			  udata, rt_key, &rt_key_changed) == H5B_INS_ERROR)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to remove entry from B-tree")
+
+#ifdef H5B_DEBUG
+    H5B_assert(f, dxpl_id, addr, type, udata);
+#endif
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_delete
+ *
+ * Purpose:	Deletes an entire B-tree from the file, calling the 'remove'
+ *              callbacks for each node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
+{
+    H5B_t	*bt = NULL;             /* B-tree node being operated on */
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(type);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /* Lock this B-tree node into memory for now */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
+
+    /* Iterate over all children in tree, deleting them */
+    if(bt->level > 0) {
+        /* Iterate over all children in node, deleting them */
+        for(u = 0; u < bt->nchildren; u++)
+            if(H5B_delete(f, dxpl_id, type, bt->child[u], udata) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "unable to delete B-tree node")
+
+    } /* end if */
+    else {
+        hbool_t lt_key_changed, rt_key_changed; /* Whether key changed (unused here, just for callback) */
+
+        /* Check for removal callback */
+        if(type->remove) {
+            /* Iterate over all entries in node, calling callback */
+            for(u = 0; u < bt->nchildren; u++) {
+                /* Call user's callback for each entry */
+                if((type->remove)(f, dxpl_id,
+                          bt->child[u], H5B_NKEY(bt, shared, u), &lt_key_changed, udata,
+                          H5B_NKEY(bt, shared, u + 1), &rt_key_changed) < H5B_INS_NOOP)
+                    HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "can't remove B-tree node")
+            } /* end for */
+        } /* end if */
+    } /* end else */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node in cache")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_shared_new
+ *
+ * Purpose:	Allocates & constructs a shared v1 B-tree struct for client.
+ *
+ * Return:	Success:	non-NULL pointer to struct allocated
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May 27 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B_shared_t *
+H5B_shared_new(const H5F_t *f, const H5B_class_t *type, size_t sizeof_rkey)
+{
+    H5B_shared_t *shared = NULL;        /* New shared B-tree struct */
+    size_t	u;                      /* Local index variable */
+    H5B_shared_t *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(type);
+
+    /* Allocate space for the shared structure */
+    if(NULL == (shared = H5FL_CALLOC(H5B_shared_t)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for shared B-tree info")
+
+    /* Set up the "global" information for this file's groups */
+    shared->type = type;
+    shared->two_k = 2 * H5F_KVALUE(f, type);
+    shared->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    shared->sizeof_len = H5F_SIZEOF_SIZE(f);
+    shared->sizeof_rkey = sizeof_rkey;
+    HDassert(shared->sizeof_rkey);
+    shared->sizeof_keys = (shared->two_k + 1) * type->sizeof_nkey;
+    shared->sizeof_rnode = ((size_t)H5B_SIZEOF_HDR(f) + /*node header	*/
+	    shared->two_k * H5F_SIZEOF_ADDR(f) +	/*child pointers */
+	    (shared->two_k + 1) * shared->sizeof_rkey);	/*keys		*/
+    HDassert(shared->sizeof_rnode);
+
+    /* Allocate shared buffers */
+    if(NULL == (shared->page = H5FL_BLK_MALLOC(page, shared->sizeof_rnode)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree page")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(shared->page, 0, shared->sizeof_rnode);
+#endif /* H5_CLEAR_MEMORY */
+    if(NULL == (shared->nkey = H5FL_SEQ_MALLOC(size_t, (size_t)(2 * H5F_KVALUE(f, type) + 1))))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree native keys")
+
+    /* Initialize the offsets into the native key buffer */
+    for(u = 0; u < (2 * H5F_KVALUE(f, type) + 1); u++)
+        shared->nkey[u] = u * type->sizeof_nkey;
+
+    /* Set return value */
+    ret_value = shared;
+
+done:
+    if(NULL == ret_value)
+        if(shared) {
+            if(shared->page)
+                shared->page = H5FL_BLK_FREE(page, shared->page);
+            if(shared->nkey)
+                shared->nkey = H5FL_SEQ_FREE(size_t, shared->nkey);
+            shared = H5FL_FREE(H5B_shared_t, shared);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_shared_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_shared_free
+ *
+ * Purpose:	Free B-tree shared info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 27, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_shared_free(void *_shared)
+{
+    H5B_shared_t *shared = (H5B_shared_t *)_shared;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the raw B-tree node buffer */
+    shared->page = H5FL_BLK_FREE(page, shared->page);
+
+    /* Free the B-tree native key offsets buffer */
+    shared->nkey = H5FL_SEQ_FREE(size_t, shared->nkey);
+
+    /* Free the shared B-tree info */
+    shared = H5FL_FREE(H5B_shared_t, shared);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B_shared_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_copy
+ *
+ * Purpose:	Deep copies an existing H5B_t node.
+ *
+ * Return:	Success:	Pointer to H5B_t object.
+ *
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 18 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_t *
+H5B_copy(const H5B_t *old_bt)
+{
+    H5B_t		*new_node = NULL;
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    H5B_t		*ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(old_bt);
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(old_bt->rc_shared);
+    HDassert(shared);
+
+    /* Allocate memory for the new H5B_t object */
+    if(NULL == (new_node = H5FL_MALLOC(H5B_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree root node")
+
+    /* Copy the main structure */
+    HDmemcpy(new_node, old_bt, sizeof(H5B_t));
+
+    /* Reset cache info */
+    HDmemset(&new_node->cache_info, 0, sizeof(H5AC_info_t));
+
+    if(NULL == (new_node->native = H5FL_BLK_MALLOC(native_block, shared->sizeof_keys)) ||
+            NULL == (new_node->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree root node")
+
+    /* Copy the other structures */
+    HDmemcpy(new_node->native, old_bt->native, shared->sizeof_keys);
+    HDmemcpy(new_node->child, old_bt->child, (sizeof(haddr_t) * shared->two_k));
+
+    /* Increment the ref-count on the raw page */
+    H5RC_INC(new_node->rc_shared);
+
+    /* Set return value */
+    ret_value = new_node;
+
+done:
+    if(NULL == ret_value) {
+        if(new_node) {
+	    new_node->native = H5FL_BLK_FREE(native_block, new_node->native);
+	    new_node->child = H5FL_SEQ_FREE(haddr_t, new_node->child);
+	    new_node = H5FL_FREE(H5B_t, new_node);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_get_info_helper
+ *
+ * Purpose:	Walks the B-tree nodes, getting information for all of them.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun  3 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+    const H5B_info_ud_t *info_udata)
+{
+    H5B_t *bt = NULL;           /* Pointer to current B-tree node */
+    H5RC_t *rc_shared;          /* Ref-counted shared info */
+    H5B_shared_t *shared;       /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata; /* User-data for metadata cache callback */
+    unsigned level;		/* Node level			     */
+    size_t sizeof_rnode;	/* Size of raw (disk) node	     */
+    haddr_t next_addr;          /* Address of next node to the right */
+    haddr_t left_child;         /* Address of left-most child in node */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(info_udata);
+    HDassert(info_udata->bt_info);
+    HDassert(info_udata->udata);
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, info_udata->udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /* Get the raw node size for iteration */
+    sizeof_rnode = shared->sizeof_rnode;
+
+    /* Protect the initial/current node */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
+
+    /* Cache information from this node */
+    left_child = bt->child[0];
+    next_addr = bt->right;
+    level = bt->level;
+
+    /* Update B-tree info */
+    info_udata->bt_info->size += sizeof_rnode;
+    info_udata->bt_info->num_nodes++;
+
+    /* Release current node */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    bt = NULL;
+
+    /*
+     * Follow the right-sibling pointer from node to node until we've
+     *      processed all nodes.
+     */
+    while(H5F_addr_defined(next_addr)) {
+        /* Protect the next node to the right */
+        addr = next_addr;
+        if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "B-tree node")
+
+        /* Cache information from this node */
+        next_addr = bt->right;
+
+        /* Update B-tree info */
+        info_udata->bt_info->size += sizeof_rnode;
+        info_udata->bt_info->num_nodes++;
+
+        /* Unprotect node */
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+        bt = NULL;
+    } /* end while */
+
+    /* Check for another "row" of B-tree nodes to iterate over */
+    if(level > 0) {
+	/* Keep following the left-most child until we reach a leaf node. */
+	if(H5B_get_info_helper(f, dxpl_id, type, left_child, info_udata) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "unable to list B-tree node")
+    } /* end if */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_get_info_helper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B_get_info
+ *
+ * Purpose:     Return the amount of storage used for the btree.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              June 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_get_info(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+    H5B_info_t *bt_info, H5B_operator_t op, void *udata)
+{
+    H5B_info_ud_t       info_udata;     /* User-data for B-tree size iteration */
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+    HDassert(bt_info);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Portably initialize B-tree info struct */
+    HDmemset(bt_info, 0, sizeof(*bt_info));
+
+    /* Set up internal user-data for the B-tree 'get info' helper routine */
+    info_udata.bt_info = bt_info;
+    info_udata.udata = udata;
+
+    /* Iterate over the B-tree nodes */
+    if(H5B_get_info_helper(f, dxpl_id, type, addr, &info_udata) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADITER, FAIL, "B-tree iteration failed")
+
+    /* Iterate over the B-tree records, making any "leaf" callbacks */
+    /* (Only if operator defined) */
+    if(op)
+        if((ret_value = H5B_iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
+            HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_get_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B_valid
+ *
+ * Purpose:     Attempt to load a B-tree node.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              March 17, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5B_valid(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr)
+{
+    H5B_t               *bt = NULL;             /* The B-tree */
+    H5RC_t	        *rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t        *shared;                /* Pointer to shared B-tree info */
+    H5B_cache_ud_t      cache_udata;            /* User-data for metadata cache callback */
+    htri_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(type);
+
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, FAIL, "address is undefined")
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, NULL)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /*
+     * Load the tree node.
+     */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree node")
+
+done:
+    /* Release the node */
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_valid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B_node_dest
+ *
+ * Purpose:     Destroy/release a B-tree node
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 26, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_node_dest(H5B_t *bt)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(bt);
+    HDassert(bt->rc_shared);
+
+    bt->child = H5FL_SEQ_FREE(haddr_t, bt->child);
+    bt->native = H5FL_BLK_FREE(native_block, bt->native);
+    H5RC_DEC(bt->rc_shared);
+    bt = H5FL_FREE(H5B_t, bt);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B_node_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2.c b/gatb-core/thirdparty/hdf5/src/H5B2.c
new file mode 100644
index 0000000..1a3223d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2.c
@@ -0,0 +1,1408 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2.c
+ *			Jan 31 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implements a B-tree, with several modifications from
+ *                      the "standard" methods.
+ *
+ *                      Please see the documentation in:
+ *                      doc/html/TechNotes/Btrees.html for a full description
+ *                      of how they work, etc.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* v2 B-tree client ID to class mapping */
+
+/* Remember to add client ID to H5B2_subid_t in H5B2private.h when adding a new
+ * client class..
+ */
+extern const H5B2_class_t H5B2_TEST[1];
+extern const H5B2_class_t H5HF_HUGE_BT2_INDIR[1];
+extern const H5B2_class_t H5HF_HUGE_BT2_FILT_INDIR[1];
+extern const H5B2_class_t H5HF_HUGE_BT2_DIR[1];
+extern const H5B2_class_t H5HF_HUGE_BT2_FILT_DIR[1];
+extern const H5B2_class_t H5G_BT2_NAME[1];
+extern const H5B2_class_t H5G_BT2_CORDER[1];
+extern const H5B2_class_t H5SM_INDEX[1];
+extern const H5B2_class_t H5A_BT2_NAME[1];
+extern const H5B2_class_t H5A_BT2_CORDER[1];
+
+const H5B2_class_t *const H5B2_client_class_g[] = {
+    H5B2_TEST,			/* 0 - H5B2_TEST_ID 			*/
+    H5HF_HUGE_BT2_INDIR,	/* 1 - H5B2_FHEAP_HUGE_INDIR_ID 	*/
+    H5HF_HUGE_BT2_FILT_INDIR,	/* 2 - H5B2_FHEAP_HUGE_FILT_INDIR_ID 	*/
+    H5HF_HUGE_BT2_DIR,		/* 3 - H5B2_FHEAP_HUGE_DIR_ID 		*/
+    H5HF_HUGE_BT2_FILT_DIR,	/* 4 - H5B2_FHEAP_HUGE_FILT_DIR_ID 	*/
+    H5G_BT2_NAME,		/* 5 - H5B2_GRP_DENSE_NAME_ID 		*/
+    H5G_BT2_CORDER,		/* 6 - H5B2_GRP_DENSE_CORDER_ID 	*/
+    H5SM_INDEX,			/* 7 - H5B2_SOHM_INDEX_ID 		*/
+    H5A_BT2_NAME,		/* 8 - H5B2_ATTR_DENSE_NAME_ID 		*/
+    H5A_BT2_CORDER,		/* 9 - H5B2_ATTR_DENSE_CORDER_ID 	*/
+};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5B2_t struct */
+H5FL_DEFINE_STATIC(H5B2_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_create
+ *
+ * Purpose:	Creates a new empty B-tree in the file.
+ *
+ * Return:	Non-negative on success (with address of new B-tree
+ *              filled in), negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 31 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_t *
+H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam, void *ctx_udata)
+{
+    H5B2_t      *bt2 = NULL;            /* Pointer to the B-tree */
+    H5B2_hdr_t  *hdr = NULL;            /* Pointer to the B-tree header */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    haddr_t     hdr_addr;               /* B-tree header address */
+    H5B2_t      *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+    /* H5B2 interface sanity check */
+    HDcompile_assert(H5B2_NUM_BTREE_ID == NELMTS(H5B2_client_class_g));
+
+    /* Create shared v2 B-tree header */
+    if(HADDR_UNDEF == (hdr_addr = H5B2_hdr_create(f, dxpl_id, cparam, ctx_udata)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't create v2 B-tree header")
+
+    /* Create v2 B-tree wrapper */
+    if(NULL == (bt2 = H5FL_MALLOC(H5B2_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for v2 B-tree info")
+
+    /* Look up the B-tree header */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = ctx_udata;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load B-tree header")
+
+    /* Point v2 B-tree wrapper at header and bump it's ref count */
+    bt2->hdr = hdr;
+    if(H5B2_hdr_incr(bt2->hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment reference count on shared v2 B-tree header")
+
+    /* Increment # of files using this v2 B-tree header */
+    if(H5B2_hdr_fuse_incr(bt2->hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment file reference count on shared v2 B-tree header")
+
+    /* Set file pointer for this v2 B-tree open context */
+    bt2->f = f;
+
+    /* Set the return value */
+    ret_value = bt2;
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to release v2 B-tree header")
+    if(!ret_value && bt2)
+        if(H5B2_close(bt2, dxpl_id) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTCLOSEOBJ, NULL, "unable to close v2 B-tree")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_open
+ *
+ * Purpose:	Opens an existing v2 B-tree in the file.
+ *
+ * Return:	Pointer to v2 B-tree wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 15 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_t *
+H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata)
+{
+    H5B2_t	*bt2 = NULL;            /* Pointer to the B-tree */
+    H5B2_hdr_t	*hdr = NULL;            /* Pointer to the B-tree header */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    H5B2_t	*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Look up the B-tree header */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = ctx_udata;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load B-tree header")
+
+    /* Check for pending heap deletion */
+    if(hdr->pending_delete)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTOPENOBJ, NULL, "can't open v2 B-tree pending deletion")
+
+    /* Create v2 B-tree info */
+    if(NULL == (bt2 = H5FL_MALLOC(H5B2_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for v2 B-tree info")
+
+    /* Point v2 B-tree wrapper at header */
+    bt2->hdr = hdr;
+    if(H5B2_hdr_incr(bt2->hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment reference count on shared v2 B-tree header")
+
+    /* Increment # of files using this v2 B-tree header */
+    if(H5B2_hdr_fuse_incr(bt2->hdr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment file reference count on shared v2 B-tree header")
+
+    /* Set file pointer for this v2 B-tree open context */
+    bt2->f = f;
+
+    /* Set the return value */
+    ret_value = bt2;
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to release v2 B-tree header")
+    if(!ret_value && bt2)
+        if(H5B2_close(bt2, dxpl_id) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTCLOSEOBJ, NULL, "unable to close v2 B-tree")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_insert
+ *
+ * Purpose:	Adds a new record to the B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_insert(H5B2_t *bt2, hid_t dxpl_id, void *udata)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(udata);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Check if the root node is allocated yet */
+    if(!H5F_addr_defined(hdr->root.addr)) {
+        /* Create root node as leaf node in B-tree */
+        if(H5B2_create_leaf(hdr, dxpl_id, &(hdr->root)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create root node")
+    } /* end if */
+    /* Check if we need to split the root node (equiv. to a 1->2 node split) */
+    else if(hdr->root.node_nrec == hdr->node_info[hdr->depth].split_nrec) {
+        /* Split root node */
+        if(H5B2_split_root(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split root node")
+    } /* end if */
+
+    /* Attempt to insert record into B-tree */
+    if(hdr->depth > 0) {
+        if(H5B2_insert_internal(hdr, dxpl_id, hdr->depth, NULL, &hdr->root, H5B2_POS_ROOT, udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_insert_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
+    } /* end else */
+
+    /* Mark B-tree header as dirty */
+    if(H5B2_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_get_addr
+ *
+ * Purpose:	Get the address of a v2 B-tree
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  5 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_get_addr(const H5B2_t *bt2, haddr_t *addr_p)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(bt2);
+    HDassert(addr_p);
+
+    /* Retrieve the header address for this v2 B-tree */
+    *addr_p = bt2->hdr->addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_iterate
+ *
+ * Purpose:	Iterate over all the records in the B-tree, in "in-order"
+ *		order, making a callback for each record.
+ *
+ *              If the callback returns non-zero, the iteration breaks out
+ *              without finishing all the records.
+ *
+ * Return:	Value from callback: non-negative on success, negative on error
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 11 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_iterate(H5B2_t *bt2, hid_t dxpl_id, H5B2_operator_t op, void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(op);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Iterate through records */
+    if(hdr->root.node_nrec > 0) {
+        /* Iterate through nodes */
+        if((ret_value = H5B2_iterate_node(hdr, dxpl_id, hdr->depth, &hdr->root, op, op_data)) < 0)
+            HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_find
+ *
+ * Purpose:	Locate the specified information in a B-tree and return
+ *		that information by calling the provided 'OP' routine with an
+ *		OP_DATA pointer.  The UDATA parameter points to data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              If 'OP' is NULL, then this routine just returns "TRUE" when
+ *              a record is present in the B-tree.
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
+    void *op_data)
+{
+    H5B2_hdr_t  *hdr;                   /* Pointer to the B-tree header */
+    H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
+    unsigned    depth;                  /* Current depth of the tree */
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx;                    /* Location of record which matches key */
+    H5B2_nodepos_t curr_pos;            /* Position of the current node */
+    htri_t      ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Make copy of the root node pointer to start search with */
+    curr_node_ptr = hdr->root;
+
+    /* Check for empty tree */
+    if(curr_node_ptr.node_nrec == 0)
+        HGOTO_DONE(FALSE)
+
+    /* Check record against min & max records in tree, to attempt to quickly
+     *  find candidates or avoid further searching.
+     */
+    if(hdr->min_native_rec != NULL) {
+        if((hdr->cls->compare)(udata, hdr->min_native_rec, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp < 0)
+            HGOTO_DONE(FALSE) 	/* Less than the least record--not found */ 
+	else if(cmp == 0) { /* Record is found */
+	    if(op && (op)(hdr->min_native_rec, op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+	    HGOTO_DONE(TRUE)
+	} /* end if */
+    } /* end if */
+    if(hdr->max_native_rec != NULL) {
+	if((hdr->cls->compare)(udata, hdr->max_native_rec, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp > 0)
+            HGOTO_DONE(FALSE) 	/* Less than the least record--not found */ 
+	else if(cmp == 0) { /* Record is found */
+	    if(op && (op)(hdr->max_native_rec, op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+	    HGOTO_DONE(TRUE)
+	} /* end if */
+    } /* end if */
+
+    /* Current depth of the tree */
+    depth = hdr->depth;
+
+    /* Walk down B-tree to find record or leaf node where record is located */
+    cmp = -1;
+    curr_pos = H5B2_POS_ROOT;
+    while(depth > 0) {
+        H5B2_internal_t *internal;          /* Pointer to internal node in B-tree */
+        H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
+
+        /* Lock B-tree current node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
+
+        /* Locate node pointer for child */
+        if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                               udata, &idx, &cmp) < 0) {
+            /* Unlock current node before failing */
+            H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET);
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        }
+
+        if(cmp > 0)
+            idx++;
+
+        if(cmp != 0) {
+            /* Get node pointer for next node to search */
+            next_node_ptr=internal->node_ptrs[idx];
+
+            /* Set the position of the next node */
+            if(H5B2_POS_MIDDLE != curr_pos) {
+                if(idx == 0) {
+                    if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                        curr_pos = H5B2_POS_LEFT;
+                    else
+                        curr_pos = H5B2_POS_MIDDLE;
+                } /* end if */
+                else if(idx == internal->nrec) {
+                    if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                        curr_pos = H5B2_POS_RIGHT;
+                    else
+                        curr_pos = H5B2_POS_MIDDLE;
+                } /* end if */
+                else
+                    curr_pos = H5B2_POS_MIDDLE;
+            } /* end if */
+
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Set pointer to next node to load */
+            curr_node_ptr = next_node_ptr;
+        } /* end if */
+        else {
+            /* Make callback for current record */
+            if(op && (op)(H5B2_INT_NREC(internal, hdr, idx), op_data) < 0) {
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+            } /* end if */
+
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Indicate record found */
+            HGOTO_DONE(TRUE)
+        } /* end else */
+
+        /* Decrement depth we're at in B-tree */
+        depth--;
+    } /* end while */
+
+    {
+        H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
+
+        /* Lock B-tree leaf node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Locate record */
+        if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, 
+                               udata, &idx, &cmp) < 0) {
+            /* unlock current node before failing */
+            H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET);
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        }
+
+        if(cmp != 0) {
+            /* Unlock leaf node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Record not found */
+            HGOTO_DONE(FALSE)
+        } /* end if */
+        else {
+            /* Make callback for current record */
+            if(op && (op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0) {
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+            } /* end if */
+
+            /* Check for record being the min or max for the tree */
+            /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+            if(H5B2_POS_MIDDLE != curr_pos) {
+                if(idx == 0) {
+                    if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                        if(hdr->min_native_rec == NULL)
+                            if(NULL == (hdr->min_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
+                        HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+                    } /* end if */
+                } /* end if */
+                if(idx == (unsigned)(leaf->nrec - 1)) {
+                    if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                        if(hdr->max_native_rec == NULL)
+                            if(NULL == (hdr->max_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
+                        HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+        } /* end else */
+
+        /* Unlock current node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end block */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_index
+ *
+ * Purpose:	Locate the IDX'th record in a B-tree according to the
+ *              ordering used by the B-tree.  The IDX values are 0-based.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
+    H5B2_found_t op, void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
+    unsigned    depth;                  /* Current depth of the tree */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(op);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Make copy of the root node pointer to start search with */
+    curr_node_ptr = hdr->root;
+
+    /* Check for empty tree */
+    if(curr_node_ptr.node_nrec == 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree has no records")
+
+    /* Check for index greater than the number of records in the tree */
+    if(idx >= curr_node_ptr.all_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree doesn't have that many records")
+
+    /* Current depth of the tree */
+    depth = hdr->depth;
+
+    /* Check for reverse indexing and map requested index to appropriate forward index */
+    if(order == H5_ITER_DEC)
+        idx = curr_node_ptr.all_nrec - (idx + 1);
+
+    /* Walk down B-tree to find record or leaf node where record is located */
+    while(depth > 0) {
+        H5B2_internal_t *internal;          /* Pointer to internal node in B-tree */
+        H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
+        unsigned u;                         /* Local index variable */
+
+        /* Lock B-tree current node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
+
+        /* Search for record with correct index */
+        for(u = 0; u < internal->nrec; u++) {
+            /* Check if record is in child node */
+            if(internal->node_ptrs[u].all_nrec > idx) {
+                /* Get node pointer for next node to search */
+                next_node_ptr = internal->node_ptrs[u];
+
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                /* Set pointer to next node to load */
+                curr_node_ptr = next_node_ptr;
+
+                /* Break out of for loop */
+                break;
+            } /* end if */
+
+            /* Check if record is in this node */
+            if(internal->node_ptrs[u].all_nrec == idx) {
+                /* Make callback for current record */
+                if((op)(H5B2_INT_NREC(internal, hdr, u), op_data) < 0) {
+                    /* Unlock current node */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                    HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+                } /* end if */
+
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                HGOTO_DONE(SUCCEED);
+            } /* end if */
+
+            /* Decrement index we are looking for to account for the node we
+             * just advanced past.
+             */
+            idx -= (internal->node_ptrs[u].all_nrec + 1);
+        } /* end for */
+
+        /* Check last node pointer */
+        if(u == internal->nrec) {
+            /* Check if record is in child node */
+            if(internal->node_ptrs[u].all_nrec > idx) {
+                /* Get node pointer for next node to search */
+                next_node_ptr = internal->node_ptrs[u];
+
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                /* Set pointer to next node to load */
+                curr_node_ptr = next_node_ptr;
+            } /* end if */
+            else
+                /* Index that is greater than the number of records in the tree? */
+                HDassert("Index off end of tree??" && 0);
+        } /* end if */
+
+        /* Decrement depth we're at in B-tree */
+        depth--;
+    } /* end while */
+
+    {
+        H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
+
+        /* Lock B-tree leaf node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Sanity check index */
+        HDassert(idx < leaf->nrec);
+
+        /* Make callback for correct record */
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0) {
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
+        } /* end if */
+
+        /* Unlock current node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end block */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove
+ *
+ * Purpose:	Removes a record from a B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 25 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_remove_t op,
+    void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Check for empty B-tree */
+    if(0 == hdr->root.all_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
+
+    /* Attempt to remove record from B-tree */
+    if(hdr->depth > 0) {
+        hbool_t depth_decreased = FALSE;  /* Flag to indicate whether the depth of the B-tree decreased */
+
+        if(H5B2_remove_internal(hdr, dxpl_id, &depth_decreased, NULL, hdr->depth,
+                &(hdr->cache_info), NULL, H5B2_POS_ROOT, &hdr->root, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
+
+        /* Check for decreasing the depth of the B-tree */
+        if(depth_decreased) {
+            /* Destroy free list factories for previous depth */
+            if(hdr->node_info[hdr->depth].nat_rec_fac)
+                if(H5FL_fac_term(hdr->node_info[hdr->depth].nat_rec_fac) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy node's native record block factory")
+            if(hdr->node_info[hdr->depth].node_ptr_fac)
+                if(H5FL_fac_term(hdr->node_info[hdr->depth].node_ptr_fac) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy node's node pointer block factory")
+
+            HDassert((uint16_t)(hdr->depth - depth_decreased) < hdr->depth);
+            hdr->depth = (uint16_t)(hdr->depth - depth_decreased);
+        } /* end for */
+    } /* end if */
+    else {
+        if(H5B2_remove_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
+    } /* end else */
+
+    /* Decrement # of records in B-tree */
+    hdr->root.all_nrec--;
+
+    /* Mark B-tree header as dirty */
+    if(H5B2_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove_by_idx
+ *
+ * Purpose:	Removes the n'th record from a B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order,
+    hsize_t idx, H5B2_remove_t op, void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Check for empty B-tree */
+    if(0 == hdr->root.all_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
+
+    /* Check for index greater than the number of records in the tree */
+    if(idx >= hdr->root.all_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree doesn't have that many records")
+
+    /* Check for reverse indexing and map requested index to appropriate forward index */
+    if(H5_ITER_DEC == order)
+        idx = hdr->root.all_nrec - (idx + 1);
+
+    /* Attempt to remove record from B-tree */
+    if(hdr->depth > 0) {
+        hbool_t depth_decreased = FALSE;  /* Flag to indicate whether the depth of the B-tree decreased */
+
+        if(H5B2_remove_internal_by_idx(hdr, dxpl_id, &depth_decreased, NULL, hdr->depth,
+                &(hdr->cache_info), NULL, &hdr->root, H5B2_POS_ROOT, idx, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
+
+        /* Check for decreasing the depth of the B-tree */
+        if(depth_decreased) {
+            /* Destroy free list factories for previous depth */
+            if(hdr->node_info[hdr->depth].nat_rec_fac)
+                if(H5FL_fac_term(hdr->node_info[hdr->depth].nat_rec_fac) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy node's native record block factory")
+            if(hdr->node_info[hdr->depth].node_ptr_fac)
+                if(H5FL_fac_term(hdr->node_info[hdr->depth].node_ptr_fac) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy node's node pointer block factory")
+
+            HDassert((uint16_t)(hdr->depth - depth_decreased) < hdr->depth);
+            hdr->depth = (uint16_t)(hdr->depth - depth_decreased);
+        } /* end for */
+    } /* end if */
+    else {
+        if(H5B2_remove_leaf_by_idx(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, (unsigned)idx, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
+    } /* end else */
+
+    /* Decrement # of records in B-tree */
+    hdr->root.all_nrec--;
+
+    /* Mark B-tree header as dirty */
+    if(H5B2_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_get_nrec
+ *
+ * Purpose:	Retrieves the number of records in a B-tree
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 25 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_get_nrec(const H5B2_t *bt2, hsize_t *nrec)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(nrec);
+
+    /* Get B-tree number of records */
+    *nrec = bt2->hdr->root.all_nrec;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_get_nrec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_neighbor
+ *
+ * Purpose:	Locate a record relative to the specified information in a
+ *              B-tree and return that information by filling in fields of the
+ *              caller-supplied UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              The RANGE indicates whether to search for records less than or
+ *              equal to, or greater than or equal to the information passed
+ *              in with UDATA.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  8 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_neighbor(H5B2_t *bt2, hid_t dxpl_id, H5B2_compare_t range, void *udata,
+    H5B2_found_t op, void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(op);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Check for empty tree */
+    if(!H5F_addr_defined(hdr->root.addr))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree has no records")
+
+    /* Attempt to find neighbor record in B-tree */
+    if(hdr->depth > 0) {
+        if(H5B2_neighbor_internal(hdr, dxpl_id, hdr->depth, &hdr->root, NULL, range, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_neighbor_leaf(hdr, dxpl_id, &hdr->root, NULL, range, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree leaf node")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_neighbor() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_modify
+ *
+ * Purpose:	Locate the specified information in a B-tree and modify it.
+ *		The UDATA points to additional data passed
+ *		to the key comparison function for locating the record to
+ *              modify.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to modify information about
+ *              the record.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 10 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
+    void *op_data)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
+    H5B2_nodepos_t curr_pos;            /* Position of current node */
+    unsigned    depth;                  /* Current depth of the tree */
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx;                    /* Location of record which matches key */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(op);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Make copy of the root node pointer to start search with */
+    curr_node_ptr = hdr->root;
+
+    /* Check for empty tree */
+    if(0 == curr_node_ptr.node_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree has no records")
+
+    /* Current depth of the tree */
+    depth = hdr->depth;
+
+    /* Walk down B-tree to find record or leaf node where record is located */
+    cmp = -1;
+    curr_pos = H5B2_POS_ROOT;
+    while(depth > 0) {
+        unsigned internal_flags = H5AC__NO_FLAGS_SET;
+        H5B2_internal_t *internal;          /* Pointer to internal node in B-tree */
+        H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
+
+        /* Lock B-tree current node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
+
+        /* Locate node pointer for child */
+        if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                               udata, &idx, &cmp) < 0) {
+            /* Unlock current node */
+            H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET);
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        }
+
+        if(cmp > 0)
+            idx++;
+
+        if(cmp != 0) {
+            /* Get node pointer for next node to search */
+            next_node_ptr = internal->node_ptrs[idx];
+
+            /* Set the position of the next node */
+            if(H5B2_POS_MIDDLE != curr_pos) {
+                if(idx == 0) {
+                    if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                        curr_pos = H5B2_POS_LEFT;
+                    else
+                        curr_pos = H5B2_POS_MIDDLE;
+                } /* end if */
+                else if(idx == internal->nrec) {
+                    if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                        curr_pos = H5B2_POS_RIGHT;
+                    else
+                        curr_pos = H5B2_POS_MIDDLE;
+                } /* end if */
+                else
+                    curr_pos = H5B2_POS_MIDDLE;
+            } /* end if */
+
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Set pointer to next node to load */
+            curr_node_ptr = next_node_ptr;
+        } /* end if */
+        else {
+            hbool_t changed;            /* Whether the 'modify' callback changed the record */
+
+            /* Make callback for current record */
+            if((op)(H5B2_INT_NREC(internal, hdr, idx), op_data, &changed) < 0) {
+                /* Make certain that the callback didn't modify the value if it failed */
+                HDassert(changed == FALSE);
+
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree find operation")
+            } /* end if */
+
+            /* Mark the node as dirty if it changed */
+            internal_flags |= changed ? H5AC__DIRTIED_FLAG : 0;
+
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, internal_flags) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            HGOTO_DONE(SUCCEED);
+        } /* end else */
+
+        /* Decrement depth we're at in B-tree */
+        depth--;
+    } /* end while */
+
+    {
+        H5B2_leaf_t *leaf;      /* Pointer to leaf node in B-tree */
+        unsigned leaf_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting the leaf node */
+        hbool_t changed = FALSE;/* Whether the 'modify' callback changed the record */
+
+        /* Lock B-tree leaf node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Locate record */
+        if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, 
+                               udata, &idx, &cmp) < 0) {
+            H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET);
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        }
+
+        if(cmp != 0) {
+            /* Unlock leaf node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Note: don't push error on stack, leave that to next higher level,
+             *      since many times the B-tree is searched in order to determine
+             *      if an object exists in the B-tree or not. -QAK
+             */
+#ifdef OLD_WAY
+                HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "key not found in leaf node")
+#else /* OLD_WAY */
+                HGOTO_DONE(FAIL)
+#endif /* OLD_WAY */
+        } /* end if */
+        else {
+            /* Make callback for current record */
+            if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data, &changed) < 0) {
+                /* Make certain that the callback didn't modify the value if it failed */
+                HDassert(changed == FALSE);
+
+                /* Unlock current node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree find operation")
+            } /* end if */
+
+            /* Check for modified record being the min or max for the tree */
+            /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+            if(H5B2_POS_MIDDLE != curr_pos) {
+                if(idx == 0) {
+                    if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                        if(hdr->min_native_rec == NULL)
+                            if(NULL == (hdr->min_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
+                        HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+                    } /* end if */
+                } /* end if */
+                if(idx == (unsigned)(leaf->nrec - 1)) {
+                    if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                        if(hdr->max_native_rec == NULL)
+                            if(NULL == (hdr->max_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
+                        HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+        } /* end else */
+
+        /* Mark the node as dirty if it changed */
+        leaf_flags |= (changed ? H5AC__DIRTIED_FLAG : 0);
+
+        /* Unlock current node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, leaf_flags) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_modify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_close
+ *
+ * Purpose:	Close a v2 B-tree
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 15 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_close(H5B2_t *bt2, hid_t dxpl_id)
+{
+    haddr_t bt2_addr = HADDR_UNDEF;     /* Address of v2 B-tree (for deletion) */
+    hbool_t pending_delete = FALSE;     /* Whether the v2 B-tree is pending deletion */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(bt2->f);
+
+    /* Decrement file reference & check if this is the last open v2 B-tree using the shared B-tree header */
+    if(0 == H5B2_hdr_fuse_decr(bt2->hdr)) {
+        /* Set the shared v2 B-tree header's file context for this operation */
+        bt2->hdr->f = bt2->f;
+
+        /* Check for pending B-tree deletion */
+        if(bt2->hdr->pending_delete) {
+            /* Set local info, so B-tree deletion can occur after decrementing the
+             *  header's ref count
+             */
+            pending_delete = TRUE;
+            bt2_addr = bt2->hdr->addr;
+        } /* end if */
+    } /* end if */
+
+    /* Check for pending v2 B-tree deletion */
+    if(pending_delete) {
+        H5B2_hdr_t *hdr;            /* Another pointer to v2 B-tree header */
+
+        /* Sanity check */
+        HDassert(H5F_addr_defined(bt2_addr));
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Header's status in the metadata cache */
+
+    /* Check the header's status in the metadata cache */
+    if(H5AC_get_entry_status(bt2->f, bt2_addr, &hdr_status) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to check metadata cache status for v2 B-tree header, address = %llu", (unsigned long long)bt2_addr)
+
+    /* Sanity checks on header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PINNED);
+    HDassert(!(hdr_status & H5AC_ES__IS_PROTECTED));
+}
+#endif /* NDEBUG */
+
+        /* Lock the v2 B-tree header into memory */
+        /* (OK to pass in NULL for callback context, since we know the header must be in the cache) */
+        if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(bt2->f, dxpl_id, H5AC_BT2_HDR, bt2_addr, NULL, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect v2 B-tree header")
+
+        /* Set the shared v2 B-tree header's file context for this operation */
+        hdr->f = bt2->f;
+
+        /* Decrement the reference count on the B-tree header */
+        /* (don't put in H5B2_hdr_fuse_decr() as the B-tree header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5B2_hdr_decr(bt2->hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement reference count on shared v2 B-tree header")
+
+        /* Delete v2 B-tree, starting with header (unprotects header) */
+        if(H5B2_hdr_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree")
+    } /* end if */
+    else {
+        /* Decrement the reference count on the B-tree header */
+        /* (don't put in H5B2_hdr_fuse_decr() as the B-tree header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5B2_hdr_decr(bt2->hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement reference count on shared v2 B-tree header")
+
+    } /* end else */
+
+    /* Release the v2 B-tree wrapper */
+    bt2 = H5FL_FREE(H5B2_t, bt2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_delete
+ *
+ * Purpose:	Delete an entire B-tree from a file.
+ *
+ *              The 'OP' routine is called for each record and the
+ *              OP_DATA pointer, to allow caller to perform an operation as
+ *              each record is removed from the B-tree.
+ *
+ *              If 'OP' is NULL, the records are just removed in the process
+ *              of deleting the B-tree.
+ *
+ * Note:	The records are _not_ guaranteed to be visited in order.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata,
+    H5B2_remove_t op, void *op_data)
+{
+    H5B2_hdr_t	*hdr = NULL;            /* Pointer to the B-tree header */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Lock the v2 B-tree header into memory */
+#ifdef QAK
+HDfprintf(stderr, "%s: addr = %a\n", FUNC, addr);
+#endif /* QAK */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = ctx_udata;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect v2 B-tree header")
+
+    /* Remember the callback & context for later */
+    hdr->remove_op = op;
+    hdr->remove_op_data = op_data;
+
+    /* Check for files using shared v2 B-tree header */
+    if(hdr->file_rc)
+        hdr->pending_delete = TRUE;
+    else {
+        /* Set the shared v2 B-tree header's file context for this operation */
+        hdr->f = f;
+
+        /* Delete v2 B-tree now, starting with header (unprotects header) */
+        if(H5B2_hdr_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree")
+        hdr = NULL;
+    } /* end if */
+
+done:
+    /* Unprotect the header, if an error occurred */
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release v2 B-tree header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2cache.c b/gatb-core/thirdparty/hdf5/src/H5B2cache.c
new file mode 100644
index 0000000..d649f74
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2cache.c
@@ -0,0 +1,1125 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5B2cache.c
+ *              Jan 31 2005
+ *              Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:     Implement v2 B-tree metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* B-tree format version #'s */
+#define H5B2_HDR_VERSION 0              /* Header */
+#define H5B2_INT_VERSION 0              /* Internal node */
+#define H5B2_LEAF_VERSION 0             /* Leaf node */
+
+/* Size of stack buffer for serialized headers */
+#define H5B2_HDR_BUF_SIZE               128
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache callbacks */
+static H5B2_hdr_t *H5B2__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5B2__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5B2__cache_hdr_dest(H5F_t *f, H5B2_hdr_t *hdr);
+static herr_t H5B2__cache_hdr_clear(H5F_t *f, H5B2_hdr_t *hdr, hbool_t destroy);
+static herr_t H5B2__cache_hdr_size(const H5F_t *f, const H5B2_hdr_t *hdr, size_t *size_ptr);
+static H5B2_internal_t *H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5B2__cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *i, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5B2__cache_internal_dest(H5F_t *f, H5B2_internal_t *internal);
+static herr_t H5B2__cache_internal_clear(H5F_t *f, H5B2_internal_t *i, hbool_t destroy);
+static herr_t H5B2__cache_internal_size(const H5F_t *f, const H5B2_internal_t *i, size_t *size_ptr);
+static H5B2_leaf_t *H5B2__cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5B2__cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *l, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5B2__cache_leaf_dest(H5F_t *f, H5B2_leaf_t *leaf);
+static herr_t H5B2__cache_leaf_clear(H5F_t *f, H5B2_leaf_t *l, hbool_t destroy);
+static herr_t H5B2__cache_leaf_size(const H5F_t *f, const H5B2_leaf_t *l, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5B2 inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_BT2_HDR[1] = {{
+    H5AC_BT2_HDR_ID,
+    (H5AC_load_func_t)H5B2__cache_hdr_load,
+    (H5AC_flush_func_t)H5B2__cache_hdr_flush,
+    (H5AC_dest_func_t)H5B2__cache_hdr_dest,
+    (H5AC_clear_func_t)H5B2__cache_hdr_clear,
+    (H5AC_size_func_t)H5B2__cache_hdr_size,
+}};
+
+/* H5B2 inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_BT2_INT[1] = {{
+    H5AC_BT2_INT_ID,
+    (H5AC_load_func_t)H5B2__cache_internal_load,
+    (H5AC_flush_func_t)H5B2__cache_internal_flush,
+    (H5AC_dest_func_t)H5B2__cache_internal_dest,
+    (H5AC_clear_func_t)H5B2__cache_internal_clear,
+    (H5AC_size_func_t)H5B2__cache_internal_size,
+}};
+
+/* H5B2 inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_BT2_LEAF[1] = {{
+    H5AC_BT2_LEAF_ID,
+    (H5AC_load_func_t)H5B2__cache_leaf_load,
+    (H5AC_flush_func_t)H5B2__cache_leaf_flush,
+    (H5AC_dest_func_t)H5B2__cache_leaf_dest,
+    (H5AC_clear_func_t)H5B2__cache_leaf_clear,
+    (H5AC_size_func_t)H5B2__cache_leaf_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_load
+ *
+ * Purpose:	Loads a B-tree header from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 1 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B2_hdr_t *
+H5B2__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5B2_hdr_t		*hdr = NULL;    /* B-tree header */
+    H5B2_hdr_cache_ud_t *udata = (H5B2_hdr_cache_ud_t *)_udata;
+    H5B2_create_t       cparam;         /* B-tree creation parameters */
+    H5B2_subid_t        id;		/* ID of B-tree class, as found in file */
+    uint16_t            depth;          /* Depth of B-tree */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
+    uint8_t             hdr_buf[H5B2_HDR_BUF_SIZE]; /* Buffer for header */
+    uint8_t		*buf;           /* Pointer to header buffer */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    H5B2_hdr_t		*ret_value;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Allocate new B-tree header and reset cache info */
+    if(NULL == (hdr = H5B2_hdr_alloc(udata->f)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "allocation failed for B-tree header")
+
+    /* Wrap the local buffer for serialized header info */
+    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for header */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->hdr_size)))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read header from disk */
+    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, hdr->hdr_size, dxpl_id, buf) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree header")
+
+    /* Get temporary pointer to serialized header */
+    p = buf;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree header signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5B2_HDR_VERSION)
+	HGOTO_ERROR(H5E_BTREE, H5E_BADRANGE, NULL, "wrong B-tree header version")
+
+    /* B-tree class */
+    id = (H5B2_subid_t)*p++;
+    if(id >= H5B2_NUM_BTREE_ID)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
+
+    /* Node size (in bytes) */
+    UINT32DECODE(p, cparam.node_size);
+
+    /* Raw key size (in bytes) */
+    UINT16DECODE(p, cparam.rrec_size);
+
+    /* Depth of tree */
+    UINT16DECODE(p, depth);
+
+    /* Split & merge %s */
+    cparam.split_percent = *p++;
+    cparam.merge_percent = *p++;
+
+    /* Root node pointer */
+    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(hdr->root.addr));
+    UINT16DECODE(p, hdr->root.node_nrec);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->root.all_nrec);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(p - (const uint8_t *)buf) == hdr->hdr_size);
+
+    /* Compute checksum on entire header */
+    computed_chksum = H5_checksum_metadata(buf, (hdr->hdr_size - H5B2_SIZEOF_CHKSUM), 0);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 B-tree header")
+
+    /* Initialize B-tree header info */
+    cparam.cls = H5B2_client_class_g[id];
+    if(H5B2_hdr_init(hdr, &cparam, udata->ctx_udata, depth) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't initialize B-tree header info")
+
+    /* Set the B-tree header's address */
+    hdr->addr = addr;
+
+    /* Set return value */
+    ret_value = hdr;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && hdr)
+        if(H5B2_hdr_free(hdr) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, NULL, "can't release v2 B-tree header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_flush
+ *
+ * Purpose:	Flushes a dirty B-tree header to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 1 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
+    H5B2_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5WB_t      *wb = NULL;             /* Wrapped buffer for header data */
+    uint8_t     hdr_buf[H5B2_HDR_BUF_SIZE]; /* Buffer for header */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(hdr);
+
+    if(hdr->cache_info.is_dirty) {
+        uint8_t	*buf;           /* Pointer to header buffer */
+        uint8_t *p;             /* Pointer into raw data buffer */
+        uint32_t metadata_chksum; /* Computed metadata checksum value */
+
+        /* Set the B-tree header's file context for this operation */
+        hdr->f = f;
+
+        /* Wrap the local buffer for serialized header info */
+        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for header */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->hdr_size)))
+            HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to serialized header */
+        p = buf;
+
+        /* Magic number */
+        HDmemcpy(p, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5B2_HDR_VERSION;
+
+        /* B-tree type */
+        *p++ = hdr->cls->id;
+
+        /* Node size (in bytes) */
+        UINT32ENCODE(p, hdr->node_size);
+
+        /* Raw key size (in bytes) */
+        UINT16ENCODE(p, hdr->rrec_size);
+
+        /* Depth of tree */
+        UINT16ENCODE(p, hdr->depth);
+
+        /* Split & merge %s */
+        H5_CHECK_OVERFLOW(hdr->split_percent, /* From: */ unsigned, /* To: */ uint8_t);
+        *p++ = (uint8_t)hdr->split_percent;
+        H5_CHECK_OVERFLOW(hdr->merge_percent, /* From: */ unsigned, /* To: */ uint8_t);
+        *p++ = (uint8_t)hdr->merge_percent;
+
+        /* Root node pointer */
+        H5F_addr_encode(f, &p, hdr->root.addr);
+        UINT16ENCODE(p, hdr->root.node_nrec);
+        H5F_ENCODE_LENGTH(f, p, hdr->root.all_nrec);
+
+        /* Compute metadata checksum */
+        metadata_chksum = H5_checksum_metadata(buf, (hdr->hdr_size - H5B2_SIZEOF_CHKSUM), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+        /* Write the B-tree header. */
+        HDassert((size_t)(p - buf) == hdr->hdr_size);
+        if(H5F_block_write(f, H5FD_MEM_BTREE, addr, hdr->hdr_size, dxpl_id, buf) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree header to disk")
+
+        hdr->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5B2__cache_hdr_dest(f, hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree header")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_hdr_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_dest
+ *
+ * Purpose:	Destroys a B-tree header in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 1 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_dest(H5F_t *f, H5B2_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(hdr->rc == 0);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!hdr->cache_info.free_file_space_on_destroy || H5F_addr_defined(hdr->cache_info.addr));
+
+    /* Check for freeing file space for B-tree header */
+    if(hdr->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, hdr->cache_info.addr, (hsize_t)hdr->hdr_size) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree header")
+    } /* end if */
+
+    /* Release B-tree header info */
+    if(H5B2_hdr_free(hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree header info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_hdr_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_clear
+ *
+ * Purpose:	Mark a B-tree header in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  1 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_clear(H5F_t *f, H5B2_hdr_t *hdr, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Reset the dirty flag.  */
+    hdr->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5B2__cache_hdr_dest(f, hdr) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_hdr_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__cache_hdr_size
+ *
+ * Purpose:     Compute the size in bytes of a B-tree header
+ *              on disk, and return it in *size_ptr.  On failure,
+ *              the value of *size_ptr is undefined.
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Feb 1 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_hdr_t *hdr, size_t *size_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(hdr);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = hdr->hdr_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2__cache_hdr_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_internal_load
+ *
+ * Purpose:	Loads a B-tree internal node from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree internal node.
+ *              Failure:        NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B2_internal_t *
+H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5B2_internal_cache_ud_t *udata = (H5B2_internal_cache_ud_t *)_udata;     /* Pointer to user data */
+    H5B2_internal_t	*internal = NULL;       /* Internal node read */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    uint8_t		*native;        /* Pointer to native record info */
+    H5B2_node_ptr_t	*int_node_ptr;  /* Pointer to node pointer info */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    unsigned		u;              /* Local index variable */
+    H5B2_internal_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Allocate new internal node and reset cache info */
+    if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Set the B-tree header's file context for this operation */
+    udata->hdr->f = f;
+
+    /* Increment ref. count on B-tree header */
+    if(H5B2_hdr_incr(udata->hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment ref. count on B-tree header")
+
+    /* Share B-tree information */
+    internal->hdr = udata->hdr;
+
+    /* Read header from disk */
+    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, udata->hdr->node_size, dxpl_id, udata->hdr->page) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree internal node")
+
+    p = udata->hdr->page;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree internal node signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5B2_INT_VERSION)
+	HGOTO_ERROR(H5E_BTREE, H5E_BADRANGE, NULL, "wrong B-tree internal node version")
+
+    /* B-tree type */
+    if(*p++ != (uint8_t)udata->hdr->cls->id)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (internal->int_native = (uint8_t *)H5FL_FAC_MALLOC(udata->hdr->node_info[udata->depth].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal native keys")
+
+    /* Allocate space for the node pointers in memory */
+    if(NULL == (internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(udata->hdr->node_info[udata->depth].node_ptr_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal node pointers")
+
+    /* Set the number of records in the leaf & it's depth */
+    internal->nrec = udata->nrec;
+    internal->depth = udata->depth;
+
+    /* Deserialize records for internal node */
+    native = internal->int_native;
+    for(u = 0; u < internal->nrec; u++) {
+        /* Decode record */
+        if((udata->hdr->cls->decode)(p, native, udata->hdr->cb_ctx) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode B-tree record")
+
+        /* Move to next record */
+        p += udata->hdr->rrec_size;
+        native += udata->hdr->cls->nrec_size;
+    } /* end for */
+
+    /* Deserialize node pointers for internal node */
+    int_node_ptr = internal->node_ptrs;
+    for(u = 0; u < (unsigned)(internal->nrec + 1); u++) {
+        /* Decode node pointer */
+        H5F_addr_decode(udata->f, (const uint8_t **)&p, &(int_node_ptr->addr));
+        UINT64DECODE_VAR(p, int_node_ptr->node_nrec, udata->hdr->max_nrec_size);
+        if(udata->depth > 1)
+            UINT64DECODE_VAR(p, int_node_ptr->all_nrec, udata->hdr->node_info[udata->depth - 1].cum_max_nrec_size)
+        else
+            int_node_ptr->all_nrec = int_node_ptr->node_nrec;
+
+        /* Move to next node pointer */
+        int_node_ptr++;
+    } /* end for */
+
+    /* Compute checksum on internal node */
+    computed_chksum = H5_checksum_metadata(udata->hdr->page, (size_t)(p - (const uint8_t *)udata->hdr->page), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check parsing */
+    HDassert((size_t)(p - (const uint8_t *)udata->hdr->page) <= udata->hdr->node_size);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 internal node")
+
+    /* Set return value */
+    ret_value = internal;
+
+done:
+    if(!ret_value && internal)
+        if(H5B2_internal_free(internal) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree internal node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_internal_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_internal_flush
+ *
+ * Purpose:	Flushes a dirty B-tree internal node to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *internal, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(internal);
+    HDassert(internal->hdr);
+
+    if(internal->cache_info.is_dirty) {
+        uint8_t *p;             /* Pointer into raw data buffer */
+        uint8_t *native;        /* Pointer to native record info */
+        H5B2_node_ptr_t *int_node_ptr;      /* Pointer to node pointer info */
+        uint32_t metadata_chksum; /* Computed metadata checksum value */
+        unsigned u;             /* Local index variable */
+
+        /* Set the B-tree header's file context for this operation */
+        internal->hdr->f = f;
+
+        p = internal->hdr->page;
+
+        /* Magic number */
+        HDmemcpy(p, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5B2_INT_VERSION;
+
+        /* B-tree type */
+        *p++ = internal->hdr->cls->id;
+        HDassert((size_t)(p - internal->hdr->page) == (H5B2_INT_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
+
+        /* Serialize records for internal node */
+        native = internal->int_native;
+        for(u = 0; u < internal->nrec; u++) {
+            /* Encode record */
+            if((internal->hdr->cls->encode)(p, native, internal->hdr->cb_ctx) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
+
+            /* Move to next record */
+            p += internal->hdr->rrec_size;
+            native += internal->hdr->cls->nrec_size;
+        } /* end for */
+
+        /* Serialize node pointers for internal node */
+        int_node_ptr = internal->node_ptrs;
+        for(u = 0; u < (unsigned)(internal->nrec + 1); u++) {
+            /* Encode node pointer */
+            H5F_addr_encode(f, &p, int_node_ptr->addr);
+            UINT64ENCODE_VAR(p, int_node_ptr->node_nrec, internal->hdr->max_nrec_size);
+            if(internal->depth > 1)
+                UINT64ENCODE_VAR(p, int_node_ptr->all_nrec, internal->hdr->node_info[internal->depth - 1].cum_max_nrec_size);
+
+            /* Move to next node pointer */
+            int_node_ptr++;
+        } /* end for */
+
+        /* Compute metadata checksum */
+        metadata_chksum = H5_checksum_metadata(internal->hdr->page, (size_t)(p - internal->hdr->page), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+	/* Write the B-tree internal node */
+        HDassert((size_t)(p - internal->hdr->page) <= internal->hdr->node_size);
+	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, internal->hdr->node_size, dxpl_id, internal->hdr->page) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree internal node to disk")
+
+	internal->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5B2__cache_internal_dest(f, internal) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_internal_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_internal_dest
+ *
+ * Purpose:	Destroys a B-tree internal node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_internal_dest(H5F_t *f, H5B2_internal_t *internal)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(internal);
+    HDassert(internal->hdr);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!internal->cache_info.free_file_space_on_destroy || H5F_addr_defined(internal->cache_info.addr));
+
+    /* Check for freeing file space for B-tree internal node */
+    if(internal->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, internal->cache_info.addr, (hsize_t)internal->hdr->node_size) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree internal node")
+    } /* end if */
+
+    /* Release v2 b-tree internal node */
+    if(H5B2_internal_free(internal) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_internal_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_internal_clear
+ *
+ * Purpose:	Mark a B-tree internal node in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_internal_clear(H5F_t *f, H5B2_internal_t *internal, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(internal);
+
+    /* Reset the dirty flag.  */
+    internal->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5B2__cache_internal_dest(f, internal) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_internal_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_internal_size
+ *
+ * Purpose:	Compute the size in bytes of a B-tree internal node
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_internal_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_internal_t *internal, size_t *size_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check arguments */
+    HDassert(internal);
+    HDassert(internal->hdr);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = internal->hdr->node_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2__cache_internal_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_load
+ *
+ * Purpose:	Loads a B-tree leaf from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree leaf node.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B2_leaf_t *
+H5B2__cache_leaf_load(H5F_t H5_ATTR_UNUSED *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5B2_leaf_cache_ud_t *udata = (H5B2_leaf_cache_ud_t *)_udata;
+    H5B2_leaf_t		*leaf = NULL;   /* Pointer to lead node loaded */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    uint8_t		*native;        /* Pointer to native keys */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    unsigned		u;              /* Local index variable */
+    H5B2_leaf_t		*ret_value;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Allocate new leaf node and reset cache info */
+    if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Set the B-tree header's file context for this operation */
+    udata->hdr->f = udata->f;
+
+    /* Increment ref. count on B-tree header */
+    if(H5B2_hdr_incr(udata->hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment ref. count on B-tree header")
+
+    /* Share B-tree header information */
+    leaf->hdr = udata->hdr;
+
+    /* Read header from disk */
+    if(H5F_block_read(udata->f, H5FD_MEM_BTREE, addr, udata->hdr->node_size, dxpl_id, udata->hdr->page) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree leaf node")
+
+    p = udata->hdr->page;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5B2_LEAF_VERSION)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node version")
+
+    /* B-tree type */
+    if(*p++ != (uint8_t)udata->hdr->cls->id)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(udata->hdr->node_info[0].nat_rec_fac)))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree leaf native keys")
+
+    /* Set the number of records in the leaf */
+    leaf->nrec = udata->nrec;
+
+    /* Deserialize records for leaf node */
+    native = leaf->leaf_native;
+    for(u = 0; u < leaf->nrec; u++) {
+        /* Decode record */
+        if((udata->hdr->cls->decode)(p, native, udata->hdr->cb_ctx) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, NULL, "unable to decode B-tree record")
+
+        /* Move to next record */
+        p += udata->hdr->rrec_size;
+        native += udata->hdr->cls->nrec_size;
+    } /* end for */
+
+    /* Compute checksum on internal node */
+    computed_chksum = H5_checksum_metadata(udata->hdr->page, (size_t)(p - (const uint8_t *)udata->hdr->page), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check parsing */
+    HDassert((size_t)(p - (const uint8_t *)udata->hdr->page) <= udata->hdr->node_size);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 leaf node")
+
+    /* Set return value */
+    ret_value = leaf;
+
+done:
+    if(!ret_value && leaf)
+        if(H5B2_leaf_free(leaf) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree leaf node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_leaf_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_flush
+ *
+ * Purpose:	Flushes a dirty B-tree leaf node to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *leaf, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(leaf);
+    HDassert(leaf->hdr);
+
+    if(leaf->cache_info.is_dirty) {
+        uint8_t *p;             /* Pointer into raw data buffer */
+        uint8_t *native;        /* Pointer to native keys */
+        uint32_t metadata_chksum; /* Computed metadata checksum value */
+        unsigned u;             /* Local index variable */
+
+        /* Set the B-tree header's file context for this operation */
+        leaf->hdr->f = f;
+
+        p = leaf->hdr->page;
+
+        /* magic number */
+        HDmemcpy(p, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* version # */
+        *p++ = H5B2_LEAF_VERSION;
+
+        /* b-tree type */
+        *p++ = leaf->hdr->cls->id;
+        HDassert((size_t)(p - leaf->hdr->page) == (H5B2_LEAF_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
+
+        /* Serialize records for leaf node */
+        native = leaf->leaf_native;
+        for(u = 0; u < leaf->nrec; u++) {
+            /* Encode record */
+            if((leaf->hdr->cls->encode)(p, native, leaf->hdr->cb_ctx) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
+
+            /* Move to next record */
+            p += leaf->hdr->rrec_size;
+            native += leaf->hdr->cls->nrec_size;
+        } /* end for */
+
+        /* Compute metadata checksum */
+        metadata_chksum = H5_checksum_metadata(leaf->hdr->page, (size_t)(p - leaf->hdr->page), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+	/* Write the B-tree leaf node */
+        HDassert((size_t)(p - leaf->hdr->page) <= leaf->hdr->node_size);
+	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, leaf->hdr->node_size, dxpl_id, leaf->hdr->page) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree leaf node to disk")
+
+	leaf->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5B2__cache_leaf_dest(f, leaf) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_leaf_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_dest
+ *
+ * Purpose:	Destroys a B-tree leaf node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_leaf_dest(H5F_t *f, H5B2_leaf_t *leaf)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(leaf);
+    HDassert(leaf->hdr);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!leaf->cache_info.free_file_space_on_destroy || H5F_addr_defined(leaf->cache_info.addr));
+
+    /* Check for freeing file space for B-tree leaf node */
+    if(leaf->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, leaf->cache_info.addr, (hsize_t)leaf->hdr->node_size) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree leaf node")
+    } /* end if */
+
+    /* Destroy v2 b-tree leaf node */
+    if(H5B2_leaf_free(leaf) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_leaf_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_clear
+ *
+ * Purpose:	Mark a B-tree leaf node in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_leaf_clear(H5F_t *f, H5B2_leaf_t *leaf, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(leaf);
+
+    /* Reset the dirty flag.  */
+    leaf->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5B2__cache_leaf_dest(f, leaf) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_leaf_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_size
+ *
+ * Purpose:	Compute the size in bytes of a B-tree leaf node
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_leaf_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_leaf_t *leaf, size_t *size_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check arguments */
+    HDassert(leaf);
+    HDassert(leaf->hdr);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = leaf->hdr->node_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2__cache_leaf_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2dbg.c b/gatb-core/thirdparty/hdf5/src/H5B2dbg.c
new file mode 100644
index 0000000..3e5d55a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2dbg.c
@@ -0,0 +1,434 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2dbg.c
+ *			Feb  2 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Dump debugging information about a v2 B-tree.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_debug
+ *
+ * Purpose:	Prints debugging info about a B-tree header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+    const H5B2_class_t *type, haddr_t obj_addr)
+{
+    H5B2_hdr_t	*hdr = NULL;            /* B-tree header info */
+    void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
+    unsigned    u;                      /* Local index variable */
+    char        temp_str[128];          /* Temporary string, for formatting */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(type);
+    HDassert((type->crt_dbg_ctx && type->dst_dbg_ctx) ||
+        (NULL == type->crt_dbg_ctx && NULL == type->dst_dbg_ctx));
+
+    /* Check for debugging context callback available */
+    if(type->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = (type->crt_dbg_ctx)(f, dxpl_id, obj_addr)))
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
+    } /* end if */
+
+    /*
+     * Load the B-tree header.
+     */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = dbg_ctx;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header")
+
+    /* Set file pointer for this B-tree operation */
+    hdr->f = f;
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sv2 B-tree Header...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of node:",
+	      hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of raw (disk) record:",
+	      hdr->rrec_size);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Dirty flag:",
+	      hdr->cache_info.is_dirty ? "True" : "False");
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Depth:",
+	      hdr->depth);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of records in tree:",
+	      hdr->root.all_nrec);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of records in root node:",
+	      hdr->root.node_nrec);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of root node:",
+	      hdr->root.addr);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Split percent:",
+	      hdr->split_percent);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Merge percent:",
+	      hdr->merge_percent);
+
+    /* Print relevant node info */
+    HDfprintf(stream, "%*sNode Info: (max_nrec/split_nrec/merge_nrec)\n", indent, "");
+    for(u = 0; u < (unsigned)(hdr->depth + 1); u++) {
+        HDsnprintf(temp_str, sizeof(temp_str), "Depth %u:", u);
+        HDfprintf(stream, "%*s%-*s (%u/%u/%u)\n", indent + 3, "", MAX(0, fwidth - 3),
+            temp_str,
+            hdr->node_info[u].max_nrec, hdr->node_info[u].split_nrec, hdr->node_info[u].merge_nrec);
+    } /* end for */
+
+done:
+    if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
+    if(hdr) {
+        hdr->f = NULL;
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_int_debug
+ *
+ * Purpose:	Prints debugging info about a B-tree internal node
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+    const H5B2_class_t *type, haddr_t hdr_addr, unsigned nrec, unsigned depth, haddr_t obj_addr)
+{
+    H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
+    H5B2_internal_t	*internal = NULL;   /* B-tree internal node */
+    void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
+    unsigned	u;                      /* Local index variable */
+    char        temp_str[128];          /* Temporary string, for formatting */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    herr_t      ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(type);
+    HDassert((type->crt_dbg_ctx && type->dst_dbg_ctx) ||
+        (NULL == type->crt_dbg_ctx && NULL == type->dst_dbg_ctx));
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(nrec > 0);
+
+    /* Check for debugging context callback available */
+    if(type->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = (type->crt_dbg_ctx)(f, dxpl_id, obj_addr)))
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
+    } /* end if */
+
+    /*
+     * Load the B-tree header.
+     */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = dbg_ctx;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header")
+
+    /* Set file pointer for this B-tree operation */
+    hdr->f = f;
+
+    /*
+     * Load the B-tree internal node
+     */
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, addr, nrec, depth, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree internal node")
+
+    /* Print opening message */
+    if(internal->depth == 1)
+        HDfprintf(stream, "%*sv2 B-tree Internal 'Leaf' Node...\n", indent, "");
+    else
+        HDfprintf(stream, "%*sv2 B-tree Internal 'Branch' Node...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of node:",
+	      hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of raw (disk) record:",
+	      hdr->rrec_size);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Dirty flag:",
+	      internal->cache_info.is_dirty ? "True" : "False");
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of records in node:",
+	      internal->nrec);
+
+    /* Print all node pointers and records */
+    for(u = 0; u < internal->nrec; u++) {
+        /* Print node pointer */
+        HDsnprintf(temp_str, sizeof(temp_str), "Node pointer #%u: (all/node/addr)", u);
+        HDfprintf(stream, "%*s%-*s (%Hu/%u/%a)\n", indent + 3, "", MAX(0, fwidth - 3),
+                  temp_str,
+                  internal->node_ptrs[u].all_nrec,
+                  internal->node_ptrs[u].node_nrec,
+                  internal->node_ptrs[u].addr);
+
+        /* Print record */
+        HDsnprintf(temp_str, sizeof(temp_str), "Record #%u:", u);
+        HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                  temp_str);
+        HDassert(H5B2_INT_NREC(internal, hdr, u));
+        (void)(type->debug)(stream, f, dxpl_id, indent + 6, MAX (0, fwidth-6),
+            H5B2_INT_NREC(internal, hdr, u), dbg_ctx);
+    } /* end for */
+
+    /* Print final node pointer */
+    HDsnprintf(temp_str, sizeof(temp_str), "Node pointer #%u: (all/node/addr)", u);
+    HDfprintf(stream, "%*s%-*s (%Hu/%u/%a)\n", indent + 3, "", MAX(0, fwidth - 3),
+              temp_str,
+              internal->node_ptrs[u].all_nrec,
+              internal->node_ptrs[u].node_nrec,
+              internal->node_ptrs[u].addr);
+
+done:
+    if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
+    if(hdr) {
+        hdr->f = NULL;
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
+    } /* end if */
+    if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, addr, internal, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree internal node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_int_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_leaf_debug
+ *
+ * Purpose:	Prints debugging info about a B-tree leaf node
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  7 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+    const H5B2_class_t *type, haddr_t hdr_addr, unsigned nrec, haddr_t obj_addr)
+{
+    H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
+    H5B2_leaf_t	*leaf = NULL;           /* B-tree leaf node */
+    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
+    unsigned	u;                      /* Local index variable */
+    char        temp_str[128];          /* Temporary string, for formatting */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(type);
+    HDassert((type->crt_dbg_ctx && type->dst_dbg_ctx) ||
+        (NULL == type->crt_dbg_ctx && NULL == type->dst_dbg_ctx));
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(nrec > 0);
+
+    /* Check for debugging context callback available */
+    if(type->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = (type->crt_dbg_ctx)(f, dxpl_id, obj_addr)))
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
+    } /* end if */
+
+    /*
+     * Load the B-tree header.
+     */
+    cache_udata.f = f;
+    cache_udata.ctx_udata = dbg_ctx;
+    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree header")
+
+    /* Set file pointer for this B-tree operation */
+    hdr->f = f;
+
+    /*
+     * Load the B-tree leaf node
+     */
+    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, addr, nrec, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sv2 B-tree Leaf Node...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of node:",
+	      hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of raw (disk) record:",
+	      hdr->rrec_size);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Dirty flag:",
+	      leaf->cache_info.is_dirty ? "True" : "False");
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of records in node:",
+	      leaf->nrec);
+
+    /* Print all node pointers and records */
+    for(u = 0; u < leaf->nrec; u++) {
+        /* Print record */
+        HDsnprintf(temp_str, sizeof(temp_str), "Record #%u:", u);
+        HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                  temp_str);
+        HDassert(H5B2_LEAF_NREC(leaf, hdr, u));
+        (void)(type->debug)(stream, f, dxpl_id, indent + 6, MAX (0, fwidth-6),
+            H5B2_LEAF_NREC(leaf, hdr, u), dbg_ctx);
+    } /* end for */
+
+done:
+    if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
+    if(hdr) {
+        hdr->f = NULL;
+        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
+    } /* end if */
+    if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree leaf node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_leaf_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2hdr.c b/gatb-core/thirdparty/hdf5/src/H5B2hdr.c
new file mode 100644
index 0000000..d28c263
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2hdr.c
@@ -0,0 +1,616 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2int.c
+ *			Feb 27 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Internal routines for managing v2 B-trees.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Number of records that fit into leaf node */
+#define H5B2_NUM_LEAF_REC(n, r) \
+    (((n) - H5B2_LEAF_PREFIX_SIZE) / (r))
+
+/* Uncomment this macro to enable extra sanity checking */
+/* #define H5B2_DEBUG */
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5B2_hdr_t struct */
+H5FL_DEFINE_STATIC(H5B2_hdr_t);
+
+/* Declare a free list to manage B-tree node pages to/from disk */
+H5FL_BLK_DEFINE_STATIC(node_page);
+
+/* Declare a free list to manage the 'size_t' sequence information */
+H5FL_SEQ_DEFINE_STATIC(size_t);
+
+/* Declare a free list to manage the 'H5B2_node_info_t' sequence information */
+H5FL_SEQ_DEFINE(H5B2_node_info_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_init
+ *
+ * Purpose:	Allocate & initialize B-tree header info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
+    uint16_t depth)
+{
+    size_t sz_max_nrec;                 /* Temporary variable for range checking */
+    unsigned u_max_nrec_size;           /* Temporary variable for range checking */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(cparam);
+    HDassert(cparam->cls);
+    HDassert((cparam->cls->crt_context && cparam->cls->dst_context) ||
+        (NULL == cparam->cls->crt_context && NULL == cparam->cls->dst_context));
+    HDassert(cparam->node_size > 0);
+    HDassert(cparam->rrec_size > 0);
+    HDassert(cparam->merge_percent > 0 && cparam->merge_percent <= 100);
+    HDassert(cparam->split_percent > 0 && cparam->split_percent <= 100);
+    HDassert(cparam->merge_percent < (cparam->split_percent / 2));
+
+    /* Initialize basic information */
+    hdr->rc = 0;
+    hdr->pending_delete = FALSE;
+
+    /* Assign dynamic information */
+    hdr->depth = depth;
+
+    /* Assign user's information */
+    hdr->split_percent = cparam->split_percent;
+    hdr->merge_percent = cparam->merge_percent;
+    hdr->node_size = cparam->node_size;
+    hdr->rrec_size = cparam->rrec_size;
+
+    /* Assign common type information */
+    hdr->cls = cparam->cls;
+
+    /* Allocate "page" for node I/O */
+    if(NULL == (hdr->page = H5FL_BLK_MALLOC(node_page, hdr->node_size)))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(hdr->page, 0, hdr->node_size);
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Allocate array of node info structs */
+    if(NULL == (hdr->node_info = H5FL_SEQ_MALLOC(H5B2_node_info_t, (size_t)(hdr->depth + 1))))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize leaf node info */
+    sz_max_nrec = H5B2_NUM_LEAF_REC(hdr->node_size, hdr->rrec_size);
+    H5_CHECKED_ASSIGN(hdr->node_info[0].max_nrec, unsigned, sz_max_nrec, size_t)
+    hdr->node_info[0].split_nrec = (hdr->node_info[0].max_nrec * hdr->split_percent) / 100;
+    hdr->node_info[0].merge_nrec = (hdr->node_info[0].max_nrec * hdr->merge_percent) / 100;
+    hdr->node_info[0].cum_max_nrec = hdr->node_info[0].max_nrec;
+    hdr->node_info[0].cum_max_nrec_size = 0;
+    if(NULL == (hdr->node_info[0].nat_rec_fac = H5FL_fac_init(hdr->cls->nrec_size * hdr->node_info[0].max_nrec)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't create node native key block factory")
+    hdr->node_info[0].node_ptr_fac = NULL;
+
+    /* Allocate array of pointers to internal node native keys */
+    /* (uses leaf # of records because its the largest) */
+    if(NULL == (hdr->nat_off = H5FL_SEQ_MALLOC(size_t, (size_t)hdr->node_info[0].max_nrec)))
+        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize offsets in native key block */
+    /* (uses leaf # of records because its the largest) */
+    for(u = 0; u < hdr->node_info[0].max_nrec; u++)
+        hdr->nat_off[u] = hdr->cls->nrec_size * u;
+
+    /* Compute size to store # of records in each node */
+    /* (uses leaf # of records because its the largest) */
+    u_max_nrec_size = H5VM_limit_enc_size((uint64_t)hdr->node_info[0].max_nrec);
+    H5_CHECKED_ASSIGN(hdr->max_nrec_size, uint8_t, u_max_nrec_size, unsigned)
+    HDassert(hdr->max_nrec_size <= H5B2_SIZEOF_RECORDS_PER_NODE);
+
+    /* Initialize internal node info */
+    if(depth > 0) {
+        for(u = 1; u < (unsigned)(depth + 1); u++) {
+            sz_max_nrec = H5B2_NUM_INT_REC(hdr, u);
+            H5_CHECKED_ASSIGN(hdr->node_info[u].max_nrec, unsigned, sz_max_nrec, size_t)
+            HDassert(hdr->node_info[u].max_nrec <= hdr->node_info[u - 1].max_nrec);
+
+            hdr->node_info[u].split_nrec = (hdr->node_info[u].max_nrec * hdr->split_percent) / 100;
+            hdr->node_info[u].merge_nrec = (hdr->node_info[u].max_nrec * hdr->merge_percent) / 100;
+
+            hdr->node_info[u].cum_max_nrec = ((hdr->node_info[u].max_nrec + 1) *
+                hdr->node_info[u - 1].cum_max_nrec) + hdr->node_info[u].max_nrec;
+            u_max_nrec_size = H5VM_limit_enc_size((uint64_t)hdr->node_info[u].cum_max_nrec);
+            H5_CHECKED_ASSIGN(hdr->node_info[u].cum_max_nrec_size, uint8_t, u_max_nrec_size, unsigned)
+
+            if(NULL == (hdr->node_info[u].nat_rec_fac = H5FL_fac_init(hdr->cls->nrec_size * hdr->node_info[u].max_nrec)))
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't create node native key block factory")
+            if(NULL == (hdr->node_info[u].node_ptr_fac = H5FL_fac_init(sizeof(H5B2_node_ptr_t) * (hdr->node_info[u].max_nrec + 1))))
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't create internal 'branch' node node pointer block factory")
+        } /* end for */
+    } /* end if */
+
+    /* Create the callback context, if the callback exists */
+    if(hdr->cls->crt_context) {
+        if(NULL == (hdr->cb_ctx = (*hdr->cls->crt_context)(ctx_udata)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, FAIL, "unable to create v2 B-tree client callback context")
+    } /* end if */
+
+done:
+    if(ret_value < 0)
+        if(H5B2_hdr_free(hdr) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free shared v2 B-tree info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_alloc
+ *
+ * Purpose:	Allocate B-tree header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_hdr_t *
+H5B2_hdr_alloc(H5F_t *f)
+{
+    H5B2_hdr_t *hdr = NULL;             /* v2 B-tree header */
+    H5B2_hdr_t *ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5FL_CALLOC(H5B2_hdr_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree header")
+
+    /* Assign non-zero information */
+    hdr->f = f;
+    hdr->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    hdr->sizeof_size = H5F_SIZEOF_SIZE(f);
+    hdr->hdr_size = H5B2_HEADER_SIZE(hdr);
+    hdr->root.addr = HADDR_UNDEF;
+
+    /* Set return value */
+    ret_value = hdr;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_create
+ *
+ * Purpose:	Create new fractal heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5B2_hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
+    void *ctx_udata)
+{
+    H5B2_hdr_t *hdr = NULL;     /* The new v2 B-tree header information */
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+    /* Allocate v2 B-tree header */
+    if(NULL == (hdr = H5B2_hdr_alloc(f)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed for B-tree header")
+
+    /* Initialize shared B-tree info */
+    if(H5B2_hdr_init(hdr, cparam, ctx_udata, (uint16_t)0) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, HADDR_UNDEF, "can't create shared B-tree info")
+
+    /* Allocate space for the header on disk */
+    if(HADDR_UNDEF == (hdr->addr = H5MF_alloc(f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->hdr_size)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, HADDR_UNDEF, "file allocation failed for B-tree header")
+
+    /* Cache the new B-tree node */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_BT2_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, HADDR_UNDEF, "can't add B-tree header to cache")
+
+    /* Set address of v2 B-tree header to return */
+    ret_value = hdr->addr;
+
+done:
+    if(!H5F_addr_defined(ret_value) && hdr)
+        if(H5B2_hdr_free(hdr) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, HADDR_UNDEF, "unable to release v2 B-tree header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_incr
+ *
+ * Purpose:	Increment reference count on B-tree header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 13 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_incr(H5B2_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(hdr);
+
+    /* Mark header as un-evictable when a B-tree node is depending on it */
+    if(hdr->rc == 0)
+        if(H5AC_pin_protected_entry(hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPIN, FAIL, "unable to pin v2 B-tree header")
+
+    /* Increment reference count on B-tree header */
+    hdr->rc++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_incr_hdr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_decr
+ *
+ * Purpose:	Decrement reference count on B-tree header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 13 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_decr(H5B2_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->rc > 0);
+
+    /* Decrement reference count on B-tree header */
+    hdr->rc--;
+
+    /* Mark header as evictable again when no nodes depend on it */
+    if(hdr->rc == 0)
+        if(H5AC_unpin_entry(hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin v2 B-tree header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_hdr_fuse_incr
+ *
+ * Purpose:     Increment file reference count on shared v2 B-tree header
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Increment file reference count on shared header */
+    hdr->file_rc++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2_hdr_fuse_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_hdr_fuse_decr
+ *
+ * Purpose:     Decrement file reference count on shared v2 B-tree header
+ *
+ * Return:      The file's reference count after the decrement. (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->file_rc);
+
+    /* Decrement file reference count on shared header */
+    hdr->file_rc--;
+
+    FUNC_LEAVE_NOAPI(hdr->file_rc)
+} /* end H5B2_hdr_fuse_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_dirty
+ *
+ * Purpose:	Mark B-tree header as dirty
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 13 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_dirty(H5B2_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Mark B-tree header as dirty in cache */
+    if(H5AC_mark_entry_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark v2 B-tree header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_free
+ *
+ * Purpose:	Free B-tree header info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_free(H5B2_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Destroy the callback context */
+    if(hdr->cb_ctx) {
+        if((*hdr->cls->dst_context)(hdr->cb_ctx) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "can't destroy v2 B-tree client callback context")
+        hdr->cb_ctx = NULL;
+    } /* end if */
+
+    /* Free the B-tree node buffer */
+    if(hdr->page)
+        hdr->page = H5FL_BLK_FREE(node_page, hdr->page);
+
+    /* Free the array of offsets into the native key block */
+    if(hdr->nat_off)
+        hdr->nat_off = H5FL_SEQ_FREE(size_t, hdr->nat_off);
+
+    /* Release the node info */
+    if(hdr->node_info) {
+        unsigned u;             /* Local index variable */
+
+        /* Destroy free list factories */
+        for(u = 0; u < (unsigned)(hdr->depth + 1); u++) {
+            if(hdr->node_info[u].nat_rec_fac)
+                if(H5FL_fac_term(hdr->node_info[u].nat_rec_fac) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "can't destroy node's native record block factory")
+            if(hdr->node_info[u].node_ptr_fac)
+                if(H5FL_fac_term(hdr->node_info[u].node_ptr_fac) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "can't destroy node's node pointer block factory")
+        } /* end for */
+
+        /* Free the array of node info structs */
+        hdr->node_info = H5FL_SEQ_FREE(H5B2_node_info_t, hdr->node_info);
+    } /* end if */
+
+    /* Release the min & max record info, if set */
+    if(hdr->min_native_rec) {
+	HDfree(hdr->min_native_rec);
+	hdr->min_native_rec = NULL;
+    } /* end if */
+    if(hdr->max_native_rec) {
+	HDfree(hdr->max_native_rec);
+	hdr->max_native_rec = NULL;
+    } /* end if */
+
+    /* Free B-tree header info */
+    hdr = H5FL_FREE(H5B2_hdr_t, hdr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_hdr_delete
+ *
+ * Purpose:	Delete a v2 B-tree, starting with the header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 15 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id)
+{
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;  /* Flags for unprotecting v2 B-tree header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(hdr);
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* v2 B-tree header's status in the metadata cache */
+
+    /* Check the v2 B-tree header's status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, hdr->addr, &hdr_status) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to check metadata cache status for v2 B-tree header")
+
+    /* Sanity checks on v2 B-tree header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PROTECTED);
+} /* end block */
+#endif /* NDEBUG */
+
+    /* Delete all nodes in B-tree */
+    if(H5F_addr_defined(hdr->root.addr))
+        if(H5B2_delete_node(hdr, dxpl_id, hdr->depth, &hdr->root, hdr->remove_op, hdr->remove_op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete B-tree nodes")
+
+    /* Indicate that the heap header should be deleted & file space freed */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    /* Unprotect the header with appropriate flags */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_HDR, hdr->addr, hdr, cache_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_hdr_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2int.c b/gatb-core/thirdparty/hdf5/src/H5B2int.c
new file mode 100644
index 0000000..2a5fc38
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2int.c
@@ -0,0 +1,3332 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2int.c
+ *			Feb 27 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Internal routines for managing v2 B-trees.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Uncomment this macro to enable extra sanity checking */
+/* #define H5B2_DEBUG */
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Helper functions */
+static herr_t H5B2_create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *node_ptr, unsigned depth);
+static herr_t H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
+static herr_t H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned idx);
+static herr_t H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
+static herr_t H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
+static herr_t H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
+static herr_t H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr,
+    unsigned idx, void *swap_loc);
+#ifdef H5B2_DEBUG
+static herr_t H5B2_assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf);
+static herr_t H5B2_assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t *leaf2);
+static herr_t H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal);
+static herr_t H5B2_assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2);
+#endif /* H5B2_DEBUG */
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5B2_internal_t struct */
+H5FL_DEFINE(H5B2_internal_t);
+
+/* Declare a free list to manage the H5B2_leaf_t struct */
+H5FL_DEFINE(H5B2_leaf_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the 'H5B2_node_info_t' sequence information */
+H5FL_SEQ_EXTERN(H5B2_node_info_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_locate_record
+ *
+ * Purpose:	Performs a binary search to locate a record in a sorted
+ *              array of records.
+ *
+ *              Sets *IDX to location of record greater than or equal to
+ *              record to locate.
+ *
+ * Return:	Comparison value for insertion location.  Negative for record
+ *              to locate being less than value in *IDX.  Zero for record to
+ *              locate equal to value in *IDX.  Positive for record to locate
+ *              being greater than value in *IDX (which should only happen when
+ *              record to locate is greater than all records to search).
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
+                    const uint8_t *native, const void *udata, unsigned *idx, int *cmp)
+{
+    unsigned	lo = 0, hi;     /* Low & high index values */
+    unsigned    my_idx = 0;     /* Final index value */
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    *cmp = -1;
+
+    hi = nrec;
+    while(lo < hi && *cmp) {
+	my_idx = (lo + hi) / 2;
+	if((type->compare)(udata, native + rec_off[my_idx], cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+	if(*cmp < 0)
+	    hi = my_idx;
+	else
+	    lo = my_idx + 1;
+    }
+
+    *idx = my_idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_locate_record */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_split1
+ *
+ * Purpose:	Perform a 1->2 node split
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 28 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
+    void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
+    uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
+    uint8_t *left_native, *right_native;/* Pointers to childs' native records */
+    H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
+    uint16_t mid_record;                /* Index of "middle" record in current node */
+    uint16_t old_node_nrec;             /* Number of records in internal node split */
+    unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+
+    /* Slide records in parent node up one space, to make room for promoted record */
+    if(idx < internal->nrec) {
+        HDmemmove(H5B2_INT_NREC(internal, hdr, idx + 1), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size * (internal->nrec - idx));
+        HDmemmove(&(internal->node_ptrs[idx + 2]), &(internal->node_ptrs[idx + 1]), sizeof(H5B2_node_ptr_t) * (internal->nrec - idx));
+    } /* end if */
+
+    /* Check for the kind of B-tree node to split */
+    if(depth > 1) {
+        H5B2_internal_t *left_int = NULL, *right_int = NULL;       /* Pointers to old & new internal nodes */
+
+        /* Create new internal node */
+        internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec = 0;
+        if(H5B2_create_internal(hdr, dxpl_id, &(internal->node_ptrs[idx + 1]), (depth - 1)) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node")
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_INT;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Protect both leaves */
+        if(NULL == (left_int = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (right_int = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* More setup for child nodes */
+        left_child = left_int;
+        right_child = right_int;
+        left_nrec = &(left_int->nrec);
+        right_nrec = &(right_int->nrec);
+        left_native = left_int->int_native;
+        right_native = right_int->int_native;
+        left_node_ptrs = left_int->node_ptrs;
+        right_node_ptrs = right_int->node_ptrs;
+    } /* end if */
+    else {
+        H5B2_leaf_t *left_leaf = NULL, *right_leaf = NULL;       /* Pointers to old & new leaf nodes */
+
+        /* Create new leaf node */
+        internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec = 0;
+        if(H5B2_create_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx + 1])) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new leaf node")
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Protect both leaves */
+        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for child nodes */
+        left_child = left_leaf;
+        right_child = right_leaf;
+        left_nrec = &(left_leaf->nrec);
+        right_nrec = &(right_leaf->nrec);
+        left_native = left_leaf->leaf_native;
+        right_native = right_leaf->leaf_native;
+    } /* end if */
+
+    /* Get the number of records in node to split */
+    old_node_nrec = internal->node_ptrs[idx].node_nrec;
+
+    /* Determine "middle" record to promote to internal node */
+    mid_record = old_node_nrec / 2;
+
+    /* Copy "upper half" of records to new child */
+    HDmemcpy(H5B2_NAT_NREC(right_native, hdr, 0),
+            H5B2_NAT_NREC(left_native, hdr, mid_record + (unsigned)1),
+            hdr->cls->nrec_size * (old_node_nrec - (mid_record + (unsigned)1)));
+
+    /* Copy "upper half" of node pointers, if the node is an internal node */
+    if(depth > 1)
+        HDmemcpy(&(right_node_ptrs[0]), &(left_node_ptrs[mid_record + (unsigned)1]),
+                sizeof(H5B2_node_ptr_t) * (size_t)(old_node_nrec - mid_record));
+
+    /* Copy "middle" record to internal node */
+    HDmemcpy(H5B2_INT_NREC(internal, hdr, idx), H5B2_NAT_NREC(left_native, hdr, mid_record), hdr->cls->nrec_size);
+
+    /* Mark nodes as dirty */
+    left_child_flags |= H5AC__DIRTIED_FLAG;
+    right_child_flags |= H5AC__DIRTIED_FLAG;
+
+    /* Update record counts in child nodes */
+    internal->node_ptrs[idx].node_nrec = *left_nrec = mid_record;
+    internal->node_ptrs[idx + 1].node_nrec = *right_nrec = (uint16_t)(old_node_nrec - (mid_record + 1));
+
+    /* Determine total number of records in new child nodes */
+    if(depth > 1) {
+        unsigned u;             /* Local index variable */
+        hsize_t new_left_all_nrec;     /* New total number of records in left child */
+        hsize_t new_right_all_nrec;    /* New total number of records in right child */
+
+        /* Compute total of all records in each child node */
+        new_left_all_nrec = internal->node_ptrs[idx].node_nrec;
+        for(u = 0; u < (*left_nrec + (unsigned)1); u++)
+            new_left_all_nrec += left_node_ptrs[u].all_nrec;
+
+        new_right_all_nrec = internal->node_ptrs[idx + 1].node_nrec;
+        for(u = 0; u < (*right_nrec + (unsigned)1); u++)
+            new_right_all_nrec += right_node_ptrs[u].all_nrec;
+
+        internal->node_ptrs[idx].all_nrec = new_left_all_nrec;
+        internal->node_ptrs[idx + 1].all_nrec = new_right_all_nrec;
+    } /* end if */
+    else {
+        internal->node_ptrs[idx].all_nrec = internal->node_ptrs[idx].node_nrec;
+        internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec;
+    } /* end else */
+
+    /* Update # of records in parent node */
+    internal->nrec++;
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+    /* Update grandparent info */
+    curr_node_ptr->node_nrec++;
+
+    /* Mark grandparent as dirty, if given */
+    if(parent_cache_info_flags_ptr)
+        *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1) {
+        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+    } /* end if */
+    else {
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+    } /* end else */
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release child nodes (marked as dirty) */
+    if(left_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, left_addr, left_child, left_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
+    if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_split1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_split_root
+ *
+ * Purpose:	Split the root node
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
+{
+    H5B2_internal_t *new_root = NULL;   /* Pointer to new root node */
+    unsigned new_root_flags = H5AC__NO_FLAGS_SET;   /* Cache flags for new root node */
+    H5B2_node_ptr_t old_root_ptr;       /* Old node pointer to root node in B-tree */
+    size_t sz_max_nrec;                 /* Temporary variable for range checking */
+    unsigned u_max_nrec_size;           /* Temporary variable for range checking */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+
+    /* Update depth of B-tree */
+    hdr->depth++;
+
+    /* Re-allocate array of node info structs */
+    if(NULL == (hdr->node_info = H5FL_SEQ_REALLOC(H5B2_node_info_t, hdr->node_info, (size_t)(hdr->depth + 1))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Update node info for new depth of tree */
+    sz_max_nrec = H5B2_NUM_INT_REC(hdr, hdr->depth);
+    H5_CHECKED_ASSIGN(hdr->node_info[hdr->depth].max_nrec, unsigned, sz_max_nrec, size_t)
+    hdr->node_info[hdr->depth].split_nrec = (hdr->node_info[hdr->depth].max_nrec * hdr->split_percent) / 100;
+    hdr->node_info[hdr->depth].merge_nrec = (hdr->node_info[hdr->depth].max_nrec * hdr->merge_percent) / 100;
+    hdr->node_info[hdr->depth].cum_max_nrec = ((hdr->node_info[hdr->depth].max_nrec + 1) *
+        hdr->node_info[hdr->depth - 1].cum_max_nrec) + hdr->node_info[hdr->depth].max_nrec;
+    u_max_nrec_size = H5VM_limit_enc_size((uint64_t)hdr->node_info[hdr->depth].cum_max_nrec);
+    H5_CHECKED_ASSIGN(hdr->node_info[hdr->depth].cum_max_nrec_size, uint8_t, u_max_nrec_size, unsigned)
+    if(NULL == (hdr->node_info[hdr->depth].nat_rec_fac = H5FL_fac_init(hdr->cls->nrec_size * hdr->node_info[hdr->depth].max_nrec)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create node native key block factory")
+    if(NULL == (hdr->node_info[hdr->depth].node_ptr_fac = H5FL_fac_init(sizeof(H5B2_node_ptr_t) * (hdr->node_info[hdr->depth].max_nrec + 1))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create internal 'branch' node node pointer block factory")
+
+    /* Keep old root node pointer info */
+    old_root_ptr = hdr->root;
+
+    /* Create new internal node to use as root */
+    hdr->root.node_nrec = 0;
+    if(H5B2_create_internal(hdr, dxpl_id, &(hdr->root), hdr->depth) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node")
+
+    /* Protect new root node */
+    if(NULL == (new_root = H5B2_protect_internal(hdr, dxpl_id, hdr->root.addr, hdr->root.node_nrec, hdr->depth, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Set first node pointer in root node to old root node pointer info */
+    new_root->node_ptrs[0] = old_root_ptr;
+
+    /* Split original root node */
+    if(H5B2_split1(hdr, dxpl_id, hdr->depth, &(hdr->root), NULL, new_root, &new_root_flags, 0) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split old root node")
+
+done:
+    /* Release new root node (marked as dirty) */
+    if(new_root && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, hdr->root.addr, new_root, new_root_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree internal node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_split_root() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_redistribute2
+ *
+ * Purpose:	Redistribute records between two nodes
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned idx)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
+    void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
+    uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
+    uint8_t *left_native, *right_native;    /* Pointers to childs' native records */
+    H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
+    hssize_t left_moved_nrec = 0, right_moved_nrec = 0; /* Number of records moved, for internal redistrib */
+    unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    herr_t ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(internal);
+
+    /* Check for the kind of B-tree node to redistribute */
+    if(depth > 1) {
+        H5B2_internal_t *left_internal;         /* Pointer to left internal node */
+        H5B2_internal_t *right_internal;        /* Pointer to right internal node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_INT;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock left & right B-tree child nodes */
+        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for child nodes */
+        left_child = left_internal;
+        right_child = right_internal;
+        left_nrec = &(left_internal->nrec);
+        right_nrec = &(right_internal->nrec);
+        left_native = left_internal->int_native;
+        right_native = right_internal->int_native;
+        left_node_ptrs = left_internal->node_ptrs;
+        right_node_ptrs = right_internal->node_ptrs;
+    } /* end if */
+    else {
+        H5B2_leaf_t *left_leaf;         /* Pointer to left leaf node */
+        H5B2_leaf_t *right_leaf;        /* Pointer to right leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock left & right B-tree child nodes */
+        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for child nodes */
+        left_child = left_leaf;
+        right_child = right_leaf;
+        left_nrec = &(left_leaf->nrec);
+        right_nrec = &(right_leaf->nrec);
+        left_native = left_leaf->leaf_native;
+        right_native = right_leaf->leaf_native;
+    } /* end else */
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1) {
+        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+    } /* end if */
+    else {
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+    } /* end else */
+#endif /* H5B2_DEBUG */
+
+    /* Determine whether to shuffle records left or right */
+    if(*left_nrec < *right_nrec) {
+        /* Moving record from right node to left */
+
+        uint16_t new_right_nrec = (uint16_t)(*left_nrec + *right_nrec) / 2;             /* New number of records for right child */
+        uint16_t move_nrec = (uint16_t)(*right_nrec - new_right_nrec);      /* Number of records to move from right node to left */
+
+        /* Copy record from parent node down into left child */
+        HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+        /* See if we need to move records from right node */
+        if(move_nrec > 1)
+            HDmemcpy(H5B2_NAT_NREC(left_native, hdr, (*left_nrec + 1)), H5B2_NAT_NREC(right_native, hdr, 0), hdr->cls->nrec_size * (size_t)(move_nrec - 1));
+
+        /* Move record from right node into parent node */
+        HDmemcpy(H5B2_INT_NREC(internal, hdr, idx), H5B2_NAT_NREC(right_native, hdr, (move_nrec - 1)), hdr->cls->nrec_size);
+
+        /* Slide records in right node down */
+        HDmemmove(H5B2_NAT_NREC(right_native, hdr, 0), H5B2_NAT_NREC(right_native, hdr, move_nrec), hdr->cls->nrec_size * new_right_nrec);
+
+        /* Handle node pointers, if we have an internal node */
+        if(depth > 1) {
+            hsize_t moved_nrec=move_nrec;   /* Total number of records moved, for internal redistrib */
+            unsigned u;             /* Local index variable */
+
+            /* Count the number of records being moved */
+            for(u=0; u<move_nrec; u++)
+                moved_nrec += right_node_ptrs[u].all_nrec;
+
+            H5_CHECKED_ASSIGN(left_moved_nrec, hssize_t, moved_nrec, hsize_t)
+            right_moved_nrec -= (hssize_t)moved_nrec;
+
+            /* Copy node pointers from right node to left */
+            HDmemcpy(&(left_node_ptrs[*left_nrec+1]),&(right_node_ptrs[0]),sizeof(H5B2_node_ptr_t)*move_nrec);
+
+            /* Slide node pointers in right node down */
+            HDmemmove(&(right_node_ptrs[0]), &(right_node_ptrs[move_nrec]), sizeof(H5B2_node_ptr_t) * (new_right_nrec + (unsigned)1));
+        } /* end if */
+
+        /* Update number of records in child nodes */
+        *left_nrec = (uint16_t)(*left_nrec + move_nrec);
+        *right_nrec = new_right_nrec;
+
+        /* Mark nodes as dirty */
+        left_child_flags |= H5AC__DIRTIED_FLAG;
+        right_child_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+    else {
+        /* Moving record from left node to right */
+
+        uint16_t new_left_nrec = (uint16_t)(*left_nrec + *right_nrec) / 2;    /* New number of records for left child */
+        uint16_t move_nrec = (uint16_t)(*left_nrec - new_left_nrec);        /* Number of records to move from left node to right */
+
+        /* Slide records in right node up */
+        HDmemmove(H5B2_NAT_NREC(right_native, hdr, move_nrec),
+                H5B2_NAT_NREC(right_native, hdr, 0),
+                hdr->cls->nrec_size * (*right_nrec));
+
+        /* Copy record from parent node down into right child */
+        HDmemcpy(H5B2_NAT_NREC(right_native, hdr, (move_nrec - 1)), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+        /* See if we need to move records from left node */
+        if(move_nrec > 1)
+            HDmemcpy(H5B2_NAT_NREC(right_native, hdr, 0), H5B2_NAT_NREC(left_native, hdr, ((*left_nrec - move_nrec) + 1)), hdr->cls->nrec_size * (size_t)(move_nrec - 1));
+
+        /* Move record from left node into parent node */
+        HDmemcpy(H5B2_INT_NREC(internal, hdr, idx), H5B2_NAT_NREC(left_native, hdr, (*left_nrec - move_nrec)), hdr->cls->nrec_size);
+
+        /* Handle node pointers, if we have an internal node */
+        if(depth > 1) {
+            hsize_t moved_nrec = move_nrec;   /* Total number of records moved, for internal redistrib */
+            unsigned u;             /* Local index variable */
+
+            /* Slide node pointers in right node up */
+            HDmemmove(&(right_node_ptrs[move_nrec]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
+
+            /* Copy node pointers from left node to right */
+            HDmemcpy(&(right_node_ptrs[0]), &(left_node_ptrs[new_left_nrec + 1]), sizeof(H5B2_node_ptr_t) * move_nrec);
+
+            /* Count the number of records being moved */
+            for(u = 0; u < move_nrec; u++)
+                moved_nrec += right_node_ptrs[u].all_nrec;
+
+            left_moved_nrec -= (hssize_t)moved_nrec;
+            H5_CHECKED_ASSIGN(right_moved_nrec, hssize_t, moved_nrec, hsize_t)
+        } /* end if */
+
+        /* Update number of records in child nodes */
+        *left_nrec = new_left_nrec;
+        *right_nrec = (uint16_t)(*right_nrec + move_nrec);
+
+        /* Mark nodes as dirty */
+        left_child_flags |= H5AC__DIRTIED_FLAG;
+        right_child_flags |= H5AC__DIRTIED_FLAG;
+    } /* end else */
+
+    /* Update # of records in child nodes */
+    internal->node_ptrs[idx].node_nrec = *left_nrec;
+    internal->node_ptrs[idx + 1].node_nrec = *right_nrec;
+
+    /* Update total # of records in child B-trees */
+    if(depth > 1) {
+        internal->node_ptrs[idx].all_nrec = (hsize_t)((hssize_t)internal->node_ptrs[idx].all_nrec + left_moved_nrec);
+        internal->node_ptrs[idx + 1].all_nrec = (hsize_t)((hssize_t)internal->node_ptrs[idx + 1].all_nrec + right_moved_nrec);
+    } /* end if */
+    else {
+        internal->node_ptrs[idx].all_nrec = internal->node_ptrs[idx].node_nrec;
+        internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec;
+    } /* end else */
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1) {
+        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+    } /* end if */
+    else {
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+    } /* end else */
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release child nodes (marked as dirty) */
+    if(left_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, left_addr, left_child, left_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+    if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_redistribute2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_redistribute3
+ *
+ * Purpose:	Redistribute records between three nodes
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
+{
+    H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL; /* Pointers to childs' node pointer info */
+    H5B2_node_ptr_t *middle_node_ptrs = NULL; /* Pointers to childs' node pointer info */
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
+    haddr_t middle_addr;                /* Address of middle child node */
+    void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
+    void *middle_child = NULL;          /* Pointers to middle child node */
+    uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
+    uint16_t *middle_nrec;              /* Pointers to middle child # of records */
+    uint8_t *left_native, *right_native;    /* Pointers to childs' native records */
+    uint8_t *middle_native;             /* Pointers to middle child's native records */
+    hssize_t left_moved_nrec = 0, right_moved_nrec = 0; /* Number of records moved, for internal split */
+    hssize_t middle_moved_nrec = 0;     /* Number of records moved, for internal split */
+    unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned middle_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+
+    /* Check for the kind of B-tree node to redistribute */
+    if(depth > 1) {
+        H5B2_internal_t *left_internal;         /* Pointer to left internal node */
+        H5B2_internal_t *middle_internal;       /* Pointer to middle internal node */
+        H5B2_internal_t *right_internal;        /* Pointer to right internal node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_INT;
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        middle_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (middle_internal = H5B2_protect_internal(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* More setup for child nodes */
+        left_child = left_internal;
+        middle_child = middle_internal;
+        right_child = right_internal;
+        left_nrec = &(left_internal->nrec);
+        middle_nrec = &(middle_internal->nrec);
+        right_nrec = &(right_internal->nrec);
+        left_native = left_internal->int_native;
+        middle_native = middle_internal->int_native;
+        right_native = right_internal->int_native;
+        left_node_ptrs = left_internal->node_ptrs;
+        middle_node_ptrs = middle_internal->node_ptrs;
+        right_node_ptrs = right_internal->node_ptrs;
+    } /* end if */
+    else {
+        H5B2_leaf_t *left_leaf;         /* Pointer to left leaf node */
+        H5B2_leaf_t *middle_leaf;       /* Pointer to middle leaf node */
+        H5B2_leaf_t *right_leaf;        /* Pointer to right leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        middle_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (middle_leaf = H5B2_protect_leaf(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for child nodes */
+        left_child = left_leaf;
+        middle_child = middle_leaf;
+        right_child = right_leaf;
+        left_nrec = &(left_leaf->nrec);
+        middle_nrec = &(middle_leaf->nrec);
+        right_nrec = &(right_leaf->nrec);
+        left_native = left_leaf->leaf_native;
+        middle_native = middle_leaf->leaf_native;
+        right_native = right_leaf->leaf_native;
+    } /* end else */
+
+    /* Redistribute records */
+    {
+        /* Compute new # of records in each node */
+        unsigned total_nrec = (unsigned)(*left_nrec + *middle_nrec + *right_nrec + 2);
+        uint16_t new_middle_nrec = (uint16_t)(total_nrec - 2) / 3;
+        uint16_t new_left_nrec = (uint16_t)((total_nrec - 2) - new_middle_nrec) / 2;
+        uint16_t new_right_nrec = (uint16_t)((total_nrec - 2) - (unsigned)(new_left_nrec + new_middle_nrec));
+        uint16_t curr_middle_nrec = *middle_nrec;
+
+        /* Sanity check rounding */
+        HDassert(new_middle_nrec <= new_left_nrec);
+        HDassert(new_middle_nrec <= new_right_nrec);
+
+        /* Move records into left node */
+        if(new_left_nrec > *left_nrec) {
+            uint16_t moved_middle_nrec = 0;      /* Number of records moved into left node */
+
+            /* Move left parent record down to left node */
+            HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec), H5B2_INT_NREC(internal, hdr, idx - 1), hdr->cls->nrec_size);
+
+            /* Move records from middle node into left node */
+            if((new_left_nrec - 1) > *left_nrec) {
+                moved_middle_nrec = (uint16_t)(new_left_nrec - (*left_nrec + 1));
+                HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec + 1), H5B2_NAT_NREC(middle_native, hdr, 0), hdr->cls->nrec_size * moved_middle_nrec);
+            } /* end if */
+
+            /* Move record from middle node up to parent node */
+            HDmemcpy(H5B2_INT_NREC(internal, hdr, idx - 1), H5B2_NAT_NREC(middle_native, hdr, moved_middle_nrec), hdr->cls->nrec_size);
+            moved_middle_nrec++;
+
+            /* Slide records in middle node down */
+            HDmemmove(H5B2_NAT_NREC(middle_native, hdr, 0), H5B2_NAT_NREC(middle_native, hdr, moved_middle_nrec), hdr->cls->nrec_size * (size_t)(*middle_nrec - moved_middle_nrec));
+
+            /* Move node pointers also if this is an internal node */
+            if(depth > 1) {
+                hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
+                unsigned move_nptrs;    /* Number of node pointers to move */
+                unsigned u;             /* Local index variable */
+
+                /* Move middle node pointers into left node */
+                move_nptrs = (unsigned)(new_left_nrec - *left_nrec);
+                HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(middle_node_ptrs[0]), sizeof(H5B2_node_ptr_t)*move_nptrs);
+
+                /* Count the number of records being moved into the left node */
+                for(u = 0, moved_nrec = 0; u < move_nptrs; u++)
+                    moved_nrec += middle_node_ptrs[u].all_nrec;
+                left_moved_nrec = (hssize_t)(moved_nrec + move_nptrs);
+                middle_moved_nrec -= (hssize_t)(moved_nrec + move_nptrs);
+
+                /* Slide the node pointers in middle node down */
+                HDmemmove(&(middle_node_ptrs[0]), &(middle_node_ptrs[move_nptrs]), sizeof(H5B2_node_ptr_t) * ((*middle_nrec - move_nptrs) + 1));
+            } /* end if */
+
+            /* Update the current number of records in middle node */
+            curr_middle_nrec = (uint16_t)(curr_middle_nrec - moved_middle_nrec);
+
+            /* Mark nodes as dirty */
+            left_child_flags |= H5AC__DIRTIED_FLAG;
+            middle_child_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* Move records into right node */
+        if(new_right_nrec > *right_nrec) {
+            unsigned right_nrec_move = (unsigned)(new_right_nrec - *right_nrec); /* Number of records to move out of right node */
+
+            /* Slide records in right node up */
+            HDmemmove(H5B2_NAT_NREC(right_native, hdr, right_nrec_move), H5B2_NAT_NREC(right_native, hdr, 0), hdr->cls->nrec_size * (*right_nrec));
+
+            /* Move right parent record down to right node */
+            HDmemcpy(H5B2_NAT_NREC(right_native, hdr, right_nrec_move - 1), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+            /* Move records from middle node into right node */
+            if(right_nrec_move > 1)
+                HDmemcpy(H5B2_NAT_NREC(right_native, hdr, 0), H5B2_NAT_NREC(middle_native, hdr, ((curr_middle_nrec - right_nrec_move) + 1)), hdr->cls->nrec_size * (right_nrec_move - 1));
+
+            /* Move record from middle node up to parent node */
+            HDmemcpy(H5B2_INT_NREC(internal, hdr, idx), H5B2_NAT_NREC(middle_native, hdr, (curr_middle_nrec - right_nrec_move)), hdr->cls->nrec_size);
+
+            /* Move node pointers also if this is an internal node */
+            if(depth > 1) {
+                hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
+                unsigned u;             /* Local index variable */
+
+                /* Slide the node pointers in right node up */
+                HDmemmove(&(right_node_ptrs[right_nrec_move]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
+
+                /* Move middle node pointers into right node */
+                HDmemcpy(&(right_node_ptrs[0]), &(middle_node_ptrs[(curr_middle_nrec - right_nrec_move) + 1]), sizeof(H5B2_node_ptr_t) * right_nrec_move);
+
+                /* Count the number of records being moved into the right node */
+                for(u = 0, moved_nrec = 0; u < right_nrec_move; u++)
+                    moved_nrec += right_node_ptrs[u].all_nrec;
+                right_moved_nrec = (hssize_t)(moved_nrec + right_nrec_move);
+                middle_moved_nrec -= (hssize_t)(moved_nrec + right_nrec_move);
+            } /* end if */
+
+            /* Update the current number of records in middle node */
+            curr_middle_nrec = (uint16_t)(curr_middle_nrec - right_nrec_move);
+
+            /* Mark nodes as dirty */
+            middle_child_flags |= H5AC__DIRTIED_FLAG;
+            right_child_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* Move records out of left node */
+        if(new_left_nrec < *left_nrec) {
+            unsigned left_nrec_move = (unsigned)(*left_nrec - new_left_nrec); /* Number of records to move out of left node */
+
+            /* Slide middle records up */
+            HDmemmove(H5B2_NAT_NREC(middle_native, hdr, left_nrec_move), H5B2_NAT_NREC(middle_native, hdr, 0), hdr->cls->nrec_size * curr_middle_nrec);
+
+            /* Move left parent record down to middle node */
+            HDmemcpy(H5B2_NAT_NREC(middle_native, hdr, left_nrec_move - 1), H5B2_INT_NREC(internal, hdr, idx - 1), hdr->cls->nrec_size);
+
+            /* Move left records to middle node */
+            if(left_nrec_move > 1)
+                HDmemmove(H5B2_NAT_NREC(middle_native, hdr, 0), H5B2_NAT_NREC(left_native, hdr, new_left_nrec + 1), hdr->cls->nrec_size * (left_nrec_move - 1));
+
+            /* Move left parent record up from left node */
+            HDmemcpy(H5B2_INT_NREC(internal, hdr, idx - 1), H5B2_NAT_NREC(left_native, hdr, new_left_nrec), hdr->cls->nrec_size);
+
+            /* Move node pointers also if this is an internal node */
+            if(depth > 1) {
+                hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
+                unsigned u;             /* Local index variable */
+
+                /* Slide the node pointers in middle node up */
+                HDmemmove(&(middle_node_ptrs[left_nrec_move]), &(middle_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(curr_middle_nrec + 1));
+
+                /* Move left node pointers into middle node */
+                HDmemcpy(&(middle_node_ptrs[0]), &(left_node_ptrs[new_left_nrec + 1]), sizeof(H5B2_node_ptr_t) * left_nrec_move);
+
+                /* Count the number of records being moved into the left node */
+                for(u = 0, moved_nrec = 0; u < left_nrec_move; u++)
+                    moved_nrec += middle_node_ptrs[u].all_nrec;
+                left_moved_nrec -= (hssize_t)(moved_nrec + left_nrec_move);
+                middle_moved_nrec += (hssize_t)(moved_nrec + left_nrec_move);
+            } /* end if */
+
+            /* Update the current number of records in middle node */
+            curr_middle_nrec = (uint16_t)(curr_middle_nrec + left_nrec_move);
+
+            /* Mark nodes as dirty */
+            left_child_flags |= H5AC__DIRTIED_FLAG;
+            middle_child_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* Move records out of right node */
+        if(new_right_nrec < *right_nrec) {
+            unsigned right_nrec_move = (unsigned)(*right_nrec - new_right_nrec); /* Number of records to move out of right node */
+
+            /* Move right parent record down to middle node */
+            HDmemcpy(H5B2_NAT_NREC(middle_native, hdr, curr_middle_nrec), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+            /* Move right records to middle node */
+            HDmemmove(H5B2_NAT_NREC(middle_native, hdr, (curr_middle_nrec + 1)), H5B2_NAT_NREC(right_native, hdr, 0), hdr->cls->nrec_size * (right_nrec_move - 1));
+
+            /* Move right parent record up from right node */
+            HDmemcpy(H5B2_INT_NREC(internal, hdr, idx), H5B2_NAT_NREC(right_native, hdr, right_nrec_move - 1), hdr->cls->nrec_size);
+
+            /* Slide right records down */
+            HDmemmove(H5B2_NAT_NREC(right_native, hdr, 0), H5B2_NAT_NREC(right_native, hdr, right_nrec_move), hdr->cls->nrec_size * new_right_nrec);
+
+            /* Move node pointers also if this is an internal node */
+            if(depth > 1) {
+                hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
+                unsigned u;             /* Local index variable */
+
+                /* Move right node pointers into middle node */
+                HDmemcpy(&(middle_node_ptrs[curr_middle_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * right_nrec_move);
+
+                /* Count the number of records being moved into the right node */
+                for(u = 0, moved_nrec = 0; u < right_nrec_move; u++)
+                    moved_nrec += right_node_ptrs[u].all_nrec;
+                right_moved_nrec -= (hssize_t)(moved_nrec + right_nrec_move);
+                middle_moved_nrec += (hssize_t)(moved_nrec + right_nrec_move);
+
+                /* Slide the node pointers in right node down */
+                HDmemmove(&(right_node_ptrs[0]), &(right_node_ptrs[right_nrec_move]), sizeof(H5B2_node_ptr_t) * (size_t)(new_right_nrec + 1));
+            } /* end if */
+
+            /* Mark nodes as dirty */
+            middle_child_flags |= H5AC__DIRTIED_FLAG;
+            right_child_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* Update # of records in nodes */
+        *left_nrec = new_left_nrec;
+        *middle_nrec = new_middle_nrec;
+        *right_nrec = new_right_nrec;
+    } /* end block */
+
+    /* Update # of records in child nodes */
+    internal->node_ptrs[idx - 1].node_nrec = *left_nrec;
+    internal->node_ptrs[idx].node_nrec = *middle_nrec;
+    internal->node_ptrs[idx + 1].node_nrec = *right_nrec;
+
+    /* Update total # of records in child B-trees */
+    if(depth > 1) {
+        internal->node_ptrs[idx - 1].all_nrec = (hsize_t)((hssize_t)internal->node_ptrs[idx - 1].all_nrec + left_moved_nrec);
+        internal->node_ptrs[idx].all_nrec = (hsize_t)((hssize_t)internal->node_ptrs[idx].all_nrec + middle_moved_nrec);
+        internal->node_ptrs[idx + 1].all_nrec = (hsize_t)((hssize_t)internal->node_ptrs[idx + 1].all_nrec + right_moved_nrec);
+    } /* end if */
+    else {
+        internal->node_ptrs[idx - 1].all_nrec = internal->node_ptrs[idx - 1].node_nrec;
+        internal->node_ptrs[idx].all_nrec = internal->node_ptrs[idx].node_nrec;
+        internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec;
+    } /* end else */
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef QAK
+{
+    unsigned u;
+
+    HDfprintf(stderr, "%s: Internal records:\n", FUNC);
+    for(u = 0; u < internal->nrec; u++) {
+        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
+        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_INT_NREC(internal, hdr, u), NULL);
+    } /* end for */
+
+    HDfprintf(stderr, "%s: Left Child records:\n", FUNC);
+    for(u = 0; u < *left_nrec; u++) {
+        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
+        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(left_native, hdr, u), NULL);
+    } /* end for */
+
+    HDfprintf(stderr, "%s: Middle Child records:\n", FUNC);
+    for(u = 0; u < *middle_nrec; u++) {
+        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
+        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(middle_native, hdr, u), NULL);
+    } /* end for */
+
+    HDfprintf(stderr, "%s: Right Child records:\n", FUNC);
+    for(u = 0; u < *right_nrec; u++) {
+        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
+        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(right_native, hdr, u), NULL);
+    } /* end for */
+
+    for(u = 0; u < internal->nrec + 1; u++)
+        HDfprintf(stderr, "%s: internal->node_ptrs[%u] = (%Hu/%u/%a)\n", FUNC, u, internal->node_ptrs[u].all_nrec, internal->node_ptrs[u].node_nrec, internal->node_ptrs[u].addr);
+    if(depth > 1) {
+        for(u = 0; u < *left_nrec + 1; u++)
+            HDfprintf(stderr, "%s: left_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, left_node_ptrs[u].all_nrec, left_node_ptrs[u].node_nrec, left_node_ptrs[u].addr);
+        for(u = 0; u < *middle_nrec + 1; u++)
+            HDfprintf(stderr, "%s: middle_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, middle_node_ptrs[u].all_nrec, middle_node_ptrs[u].node_nrec, middle_node_ptrs[u].addr);
+        for(u = 0; u < *right_nrec + 1; u++)
+            HDfprintf(stderr, "%s: right_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, right_node_ptrs[u].all_nrec, right_node_ptrs[u].node_nrec, right_node_ptrs[u].addr);
+    } /* end if */
+}
+#endif /* QAK */
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1) {
+        H5B2_assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)left_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)right_child);
+        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)middle_child);
+    } /* end if */
+    else {
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)middle_child, (H5B2_leaf_t *)right_child);
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+    } /* end else */
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Unlock child nodes (marked as dirty) */
+    if(left_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, left_addr, left_child, left_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+    if(middle_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, middle_addr, middle_child, middle_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+    if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_redistribute3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_merge2
+ *
+ * Purpose:	Perform a 2->1 node merge
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
+    void *left_child = NULL, *right_child = NULL;     /* Pointers to left & right child nodes */
+    uint16_t *left_nrec, *right_nrec;   /* Pointers to left & right child # of records */
+    uint8_t *left_native, *right_native;    /* Pointers to left & right children's native records */
+    H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
+    unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+
+    /* Check for the kind of B-tree node to split */
+    if(depth > 1) {
+        H5B2_internal_t *left_internal;         /* Pointer to left internal node */
+        H5B2_internal_t *right_internal;        /* Pointer to right internal node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_INT;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock left & right B-tree child nodes */
+        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* More setup for accessing child node information */
+        left_child = left_internal;
+        right_child = right_internal;
+        left_nrec = &(left_internal->nrec);
+        right_nrec = &(right_internal->nrec);
+        left_native = left_internal->int_native;
+        right_native = right_internal->int_native;
+        left_node_ptrs = left_internal->node_ptrs;
+        right_node_ptrs = right_internal->node_ptrs;
+    } /* end if */
+    else {
+        H5B2_leaf_t *left_leaf;         /* Pointer to left leaf node */
+        H5B2_leaf_t *right_leaf;        /* Pointer to right leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        left_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock left & right B-tree child nodes */
+        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for accessing child node information */
+        left_child = left_leaf;
+        right_child = right_leaf;
+        left_nrec = &(left_leaf->nrec);
+        right_nrec = &(right_leaf->nrec);
+        left_native = left_leaf->leaf_native;
+        right_native = right_leaf->leaf_native;
+    } /* end else */
+
+    /* Redistribute records into left node */
+    {
+        /* Copy record from parent node to proper location */
+        HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+        /* Copy records from right node to left node */
+        HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec + 1), H5B2_NAT_NREC(right_native, hdr, 0), hdr->cls->nrec_size * (*right_nrec));
+
+        /* Copy node pointers from right node into left node */
+        if(depth > 1)
+            HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
+
+        /* Update # of records in left node */
+        *left_nrec = (uint16_t)(*left_nrec + *right_nrec + 1);
+
+        /* Mark nodes as dirty */
+        left_child_flags |= H5AC__DIRTIED_FLAG;
+        right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+    } /* end block */
+
+    /* Update # of records in child nodes */
+    internal->node_ptrs[idx].node_nrec = *left_nrec;
+
+    /* Update total # of records in child B-trees */
+    internal->node_ptrs[idx].all_nrec += internal->node_ptrs[idx + 1].all_nrec + 1;
+
+    /* Slide records in parent node down, to eliminate demoted record */
+    if((idx + 1) < internal->nrec) {
+        HDmemmove(H5B2_INT_NREC(internal, hdr, idx), H5B2_INT_NREC(internal, hdr, idx + 1), hdr->cls->nrec_size * (internal->nrec - (idx + 1)));
+        HDmemmove(&(internal->node_ptrs[idx + 1]), &(internal->node_ptrs[idx + 2]), sizeof(H5B2_node_ptr_t) * (internal->nrec - (idx + 1)));
+    } /* end if */
+
+    /* Update # of records in parent node */
+    internal->nrec--;
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+    /* Update grandparent info */
+    curr_node_ptr->node_nrec--;
+
+    /* Mark grandparent as dirty, if given */
+    if(parent_cache_info_flags_ptr)
+        *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1)
+        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child);
+    else
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)left_child);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Unlock left node (marked as dirty) */
+    if(left_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, left_addr, left_child, left_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    /* Delete right node & remove from cache (marked as dirty) */
+    if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_merge2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_merge3
+ *
+ * Purpose:	Perform a 3->2 node merge
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
+    haddr_t middle_addr;                /* Address of middle child node */
+    void *left_child = NULL, *right_child = NULL;     /* Pointers to left & right child nodes */
+    void *middle_child = NULL;          /* Pointer to middle child node */
+    uint16_t *left_nrec, *right_nrec;   /* Pointers to left & right child # of records */
+    uint16_t *middle_nrec;              /* Pointer to middle child # of records */
+    uint8_t *left_native, *right_native;    /* Pointers to left & right children's native records */
+    uint8_t *middle_native;             /* Pointer to middle child's native records */
+    H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
+    H5B2_node_ptr_t *middle_node_ptrs = NULL;/* Pointer to child's node pointer info */
+    hsize_t middle_moved_nrec;          /* Number of records moved, for internal split */
+    unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned middle_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+
+    /* Check for the kind of B-tree node to split */
+    if(depth > 1) {
+        H5B2_internal_t *left_internal;         /* Pointer to left internal node */
+        H5B2_internal_t *middle_internal;       /* Pointer to middle internal node */
+        H5B2_internal_t *right_internal;        /* Pointer to right internal node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_INT;
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        middle_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (middle_internal = H5B2_protect_internal(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* More setup for accessing child node information */
+        left_child = left_internal;
+        middle_child = middle_internal;
+        right_child = right_internal;
+        left_nrec = &(left_internal->nrec);
+        middle_nrec = &(middle_internal->nrec);
+        right_nrec = &(right_internal->nrec);
+        left_native = left_internal->int_native;
+        middle_native = middle_internal->int_native;
+        right_native = right_internal->int_native;
+        left_node_ptrs = left_internal->node_ptrs;
+        middle_node_ptrs = middle_internal->node_ptrs;
+        right_node_ptrs = right_internal->node_ptrs;
+    } /* end if */
+    else {
+        H5B2_leaf_t *left_leaf;         /* Pointer to left leaf node */
+        H5B2_leaf_t *middle_leaf;       /* Pointer to middle leaf node */
+        H5B2_leaf_t *right_leaf;        /* Pointer to right leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        middle_addr = internal->node_ptrs[idx].addr;
+        right_addr = internal->node_ptrs[idx + 1].addr;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (middle_leaf = H5B2_protect_leaf(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for accessing child node information */
+        left_child = left_leaf;
+        middle_child = middle_leaf;
+        right_child = right_leaf;
+        left_nrec = &(left_leaf->nrec);
+        middle_nrec = &(middle_leaf->nrec);
+        right_nrec = &(right_leaf->nrec);
+        left_native = left_leaf->leaf_native;
+        middle_native = middle_leaf->leaf_native;
+        right_native = right_leaf->leaf_native;
+    } /* end else */
+
+    /* Redistribute records into left node */
+    {
+        unsigned total_nrec = (unsigned)(*left_nrec + *middle_nrec + *right_nrec + 2);
+        unsigned middle_nrec_move = ((total_nrec - 1) / 2) - *left_nrec;
+
+        /* Set the base number of records moved from middle node */
+        middle_moved_nrec = middle_nrec_move;
+
+        /* Copy record from parent node to proper location in left node */
+        HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec), H5B2_INT_NREC(internal, hdr, idx - 1), hdr->cls->nrec_size);
+
+        /* Copy records from middle node to left node */
+        HDmemcpy(H5B2_NAT_NREC(left_native, hdr, *left_nrec + 1), H5B2_NAT_NREC(middle_native, hdr, 0), hdr->cls->nrec_size * (middle_nrec_move - 1));
+
+        /* Copy record from middle node to proper location in parent node */
+        HDmemcpy(H5B2_INT_NREC(internal, hdr, idx - 1), H5B2_NAT_NREC(middle_native, hdr, (middle_nrec_move - 1)), hdr->cls->nrec_size);
+
+        /* Slide records in middle node down */
+        HDmemmove(H5B2_NAT_NREC(middle_native, hdr, 0), H5B2_NAT_NREC(middle_native, hdr, middle_nrec_move), hdr->cls->nrec_size * (*middle_nrec - middle_nrec_move));
+
+        /* Move node pointers also if this is an internal node */
+        if(depth > 1) {
+            unsigned u;         /* Local index variable */
+
+            /* Copy node pointers from middle node into left node */
+            HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(middle_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * middle_nrec_move);
+
+            /* Count the number of records being moved into the left node */
+            for(u = 0; u < middle_nrec_move; u++)
+                middle_moved_nrec += middle_node_ptrs[u].all_nrec;
+
+            /* Slide the node pointers in middle node down */
+            HDmemmove(&(middle_node_ptrs[0]), &(middle_node_ptrs[middle_nrec_move]), sizeof(H5B2_node_ptr_t) * (size_t)((unsigned)(*middle_nrec + 1) - middle_nrec_move));
+        } /* end if */
+
+        /* Update # of records in left & middle nodes */
+        *left_nrec = (uint16_t)(*left_nrec + middle_nrec_move);
+        *middle_nrec = (uint16_t)(*middle_nrec - middle_nrec_move);
+
+        /* Mark nodes as dirty */
+        left_child_flags |= H5AC__DIRTIED_FLAG;
+        middle_child_flags |= H5AC__DIRTIED_FLAG;
+    } /* end block */
+
+    /* Redistribute records into middle node */
+    {
+        /* Copy record from parent node to proper location in middle node */
+        HDmemcpy(H5B2_NAT_NREC(middle_native, hdr, *middle_nrec), H5B2_INT_NREC(internal, hdr, idx), hdr->cls->nrec_size);
+
+        /* Copy records from right node to middle node */
+        HDmemcpy(H5B2_NAT_NREC(middle_native, hdr, *middle_nrec + 1), H5B2_NAT_NREC(right_native, hdr, 0), hdr->cls->nrec_size * (*right_nrec));
+
+        /* Move node pointers also if this is an internal node */
+        if(depth > 1)
+            /* Copy node pointers from right node into middle node */
+            HDmemcpy(&(middle_node_ptrs[*middle_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
+
+        /* Update # of records in middle node */
+        *middle_nrec = (uint16_t)(*middle_nrec + (*right_nrec + 1));
+
+        /* Mark nodes as dirty */
+        middle_child_flags |= H5AC__DIRTIED_FLAG;
+        right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+    } /* end block */
+
+    /* Update # of records in child nodes */
+    internal->node_ptrs[idx - 1].node_nrec = *left_nrec;
+    internal->node_ptrs[idx].node_nrec = *middle_nrec;
+
+    /* Update total # of records in child B-trees */
+    internal->node_ptrs[idx - 1].all_nrec += middle_moved_nrec;
+    internal->node_ptrs[idx].all_nrec += (internal->node_ptrs[idx + 1].all_nrec + 1) - middle_moved_nrec;
+
+    /* Slide records in parent node down, to eliminate demoted record */
+    if((idx + 1) < internal->nrec) {
+        HDmemmove(H5B2_INT_NREC(internal, hdr, idx), H5B2_INT_NREC(internal, hdr, idx + 1), hdr->cls->nrec_size * (internal->nrec - (idx + 1)));
+        HDmemmove(&(internal->node_ptrs[idx + 1]), &(internal->node_ptrs[idx + 2]), sizeof(H5B2_node_ptr_t) * (internal->nrec - (idx + 1)));
+    } /* end if */
+
+    /* Update # of records in parent node */
+    internal->nrec--;
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+    /* Update grandparent info */
+    curr_node_ptr->node_nrec--;
+
+    /* Mark grandparent as dirty, if given */
+    if(parent_cache_info_flags_ptr)
+        *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1) {
+        H5B2_assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
+        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child);
+    } /* end if */
+    else {
+        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)middle_child);
+    } /* end else */
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Unlock left & middle nodes (marked as dirty) */
+    if(left_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, left_addr, left_child, left_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+    if(middle_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, middle_addr, middle_child, middle_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    /* Delete right node & remove from cache (marked as dirty) */
+    if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_merge3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_swap_leaf
+ *
+ * Purpose:	Swap a record in a node with a record in a leaf node
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr,
+    unsigned idx, void *swap_loc)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t child_addr;                 /* Address of child node */
+    void *child = NULL;                 /* Pointer to child node */
+    uint8_t *child_native;              /* Pointer to child's native records */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+    HDassert(idx <= internal->nrec);
+
+    /* Check for the kind of B-tree node to swap */
+    if(depth > 1) {
+        H5B2_internal_t *child_internal;        /* Pointer to internal node */
+
+        /* Setup information for unlocking child node */
+        child_class = H5AC_BT2_INT;
+        child_addr = internal->node_ptrs[idx].addr;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (child_internal = H5B2_protect_internal(hdr, dxpl_id, child_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* More setup for accessing child node information */
+        child = child_internal;
+        child_native = child_internal->int_native;
+    } /* end if */
+    else {
+        H5B2_leaf_t *child_leaf;        /* Pointer to leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+        child_addr = internal->node_ptrs[idx].addr;
+
+        /* Lock B-tree child node */
+        if(NULL == (child_leaf = H5B2_protect_leaf(hdr, dxpl_id, child_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* More setup for accessing child node information */
+        child = child_leaf;
+        child_native = child_leaf->leaf_native;
+    } /* end else */
+
+    /* Swap records (use disk page as temporary buffer) */
+    HDmemcpy(hdr->page, H5B2_NAT_NREC(child_native, hdr, 0), hdr->cls->nrec_size);
+    HDmemcpy(H5B2_NAT_NREC(child_native, hdr, 0), swap_loc, hdr->cls->nrec_size);
+    HDmemcpy(swap_loc, hdr->page, hdr->cls->nrec_size);
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    if(depth > 1)
+        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)child);
+    else
+        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)child);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Unlock child node */
+    if(child && H5AC_unprotect(hdr->f, dxpl_id, child_class, child_addr, child, H5AC__DIRTIED_FLAG) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_swap_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_insert_leaf
+ *
+ * Purpose:	Adds a new record to a B-tree leaf node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_nodepos_t curr_pos, void *udata)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx;                    /* Location of record which matches key */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Must have a leaf node with enough space to insert a record now */
+    HDassert(curr_node_ptr->node_nrec < hdr->node_info[0].max_nrec);
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+
+    /* Check for inserting into empty leaf */
+    if(leaf->nrec == 0)
+        idx = 0;
+    else {
+        /* Find correct location to insert this record */
+        if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp == 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+        if(cmp > 0)
+            idx++;
+
+        /* Make room for new record */
+        if(idx < leaf->nrec)
+            HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx + 1), H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size * (leaf->nrec - idx));
+    } /* end else */
+
+    /* Make callback to store record in native form */
+    if((hdr->cls->store)(H5B2_LEAF_NREC(leaf, hdr, idx), udata) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into leaf node")
+
+    /* Update record count for node pointer to current node */
+    curr_node_ptr->all_nrec++;
+    curr_node_ptr->node_nrec++;
+
+    /* Update record count for current node */
+    leaf->nrec++;
+
+    /* Check for new record being the min or max for the tree */
+    /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec == NULL)
+                    if(NULL == (hdr->min_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
+                HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec == NULL)
+                    if(NULL == (hdr->max_native_rec = (uint8_t *)HDmalloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
+                HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the B-tree leaf node (marked as dirty) */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, H5AC__DIRTIED_FLAG) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_insert_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_insert_internal
+ *
+ * Purpose:	Adds a new record to a B-tree node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    unsigned *parent_cache_info_flags_ptr, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_nodepos_t curr_pos, void *udata)
+{
+    H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
+    unsigned internal_flags = H5AC__NO_FLAGS_SET;
+    unsigned    idx;                    /* Location of record which matches key */
+    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Split or redistribute child node pointers, if necessary */
+    {
+        int         cmp;        /* Comparison value of records */
+        unsigned retries;       /* Number of times to attempt redistribution */
+        size_t      split_nrec; /* Number of records to split node at */
+
+        /* Locate node pointer for child */
+        if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                               udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp == 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+        if(cmp > 0)
+            idx++;
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for insertion to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a split */
+        retries = 2;
+
+        /* Determine the correct number of records to split child node at */
+        split_nrec = hdr->node_info[depth - 1].split_nrec;
+
+        /* Preemptively split/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == split_nrec) {
+            /* Attempt to redistribute records among children */
+            if(idx == 0) {    /* Left-most child */
+                if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec < split_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
+                } /* end else */
+            } /* end if */
+            else if(idx == internal->nrec) { /* Right-most child */
+                if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec < split_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
+                } /* end else */
+            } /* end if */
+            else { /* Middle child */
+                if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec < split_nrec) ||
+                            (internal->node_ptrs[idx - 1].node_nrec < split_nrec))) {
+                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
+                } /* end else */
+            } /* end else */
+
+            /* Locate node pointer for child (after split/redistribute) */
+            /* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
+            if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                                   udata, &idx, &cmp) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+            if(cmp == 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+            if(cmp > 0)
+                idx++;
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+    } /* end block */
+
+    /* Check if this node is left/right-most */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                next_pos = H5B2_POS_LEFT;
+        } /* end if */
+        else if(idx == internal->nrec) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                next_pos = H5B2_POS_RIGHT;
+        } /* end else */
+    } /* end if */
+
+    /* Attempt to insert node */
+    if(depth > 1) {
+        if(H5B2_insert_internal(hdr, dxpl_id, (depth - 1), &internal_flags, &internal->node_ptrs[idx], next_pos, udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_insert_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], next_pos, udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
+    } /* end else */
+
+    /* Update record count for node pointer to current node */
+    curr_node_ptr->all_nrec++;
+
+    /* Mark node as dirty */
+    internal_flags |= H5AC__DIRTIED_FLAG;
+
+done:
+    /* Release the B-tree internal node */
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_insert_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_create_leaf
+ *
+ * Purpose:	Creates empty leaf node of a B-tree and update node pointer
+ *              to point to it.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr)
+{
+    H5B2_leaf_t *leaf = NULL;           /* Pointer to new leaf node created */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+
+    /* Allocate memory for leaf information */
+    if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf info")
+
+    /* Set metadata cache info */
+    HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Increment ref. count on B-tree header */
+    if(H5B2_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, FAIL, "can't increment ref. count on B-tree header")
+
+    /* Share B-tree header information */
+    leaf->hdr = hdr;
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[0].nat_rec_fac)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf native keys")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(leaf->leaf_native, 0, hdr->cls->nrec_size * hdr->node_info[0].max_nrec);
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Set number of records */
+    leaf->nrec = 0;
+
+    /* Allocate space on disk for the leaf */
+    if(HADDR_UNDEF == (node_ptr->addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree leaf node")
+
+    /* Cache the new B-tree node */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree leaf to cache")
+
+done:
+    if(ret_value < 0) {
+	if(leaf)
+            if(H5B2_leaf_free(leaf) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree leaf node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_create_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_protect_leaf
+ *
+ * Purpose:	"Protect" an leaf node in the metadata cache
+ *
+ * Return:	Pointer to leaf node on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May  5 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_leaf_t *
+H5B2_protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr, unsigned nrec,
+    H5AC_protect_t rw)
+{
+    H5B2_leaf_cache_ud_t udata;         /* User-data for callback */
+    H5B2_leaf_t *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Set up user data for callback */
+    udata.f = hdr->f;
+    udata.hdr = hdr;
+    H5_CHECKED_ASSIGN(udata.nrec, uint16_t, nrec, unsigned)
+
+    /* Protect the leaf node */
+    if(NULL == (ret_value = (H5B2_leaf_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_LEAF, addr, &udata, rw)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree leaf node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_protect_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_create_internal
+ *
+ * Purpose:	Creates empty internal node of a B-tree and update node pointer
+ *              to point to it.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr,
+    unsigned depth)
+{
+    H5B2_internal_t *internal = NULL;   /* Pointer to new internal node created */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+    HDassert(depth > 0);
+
+    /* Allocate memory for internal node information */
+    if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal info")
+
+    /* Set metadata cache info */
+    HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Increment ref. count on B-tree header */
+    if(H5B2_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, FAIL, "can't increment ref. count on B-tree header")
+
+    /* Share B-tree header information */
+    internal->hdr = hdr;
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (internal->int_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(internal->int_native, 0, hdr->cls->nrec_size * hdr->node_info[depth].max_nrec);
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Allocate space for the node pointers in memory */
+    if(NULL == (internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (hdr->node_info[depth].max_nrec + 1));
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Set number of records & depth of the node */
+    internal->nrec = 0;
+    internal->depth = (uint16_t)depth;
+
+    /* Allocate space on disk for the internal node */
+    if(HADDR_UNDEF == (node_ptr->addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree internal node")
+
+    /* Cache the new B-tree node */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree internal node to cache")
+
+done:
+    if(ret_value < 0) {
+	if(internal)
+            if(H5B2_internal_free(internal) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_create_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_protect_internal
+ *
+ * Purpose:	"Protect" an internal node in the metadata cache
+ *
+ * Return:	Pointer to internal node on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_internal_t *
+H5B2_protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
+    unsigned nrec, unsigned depth, H5AC_protect_t rw)
+{
+    H5B2_internal_cache_ud_t udata;     /* User data to pass through to cache 'deserialize' callback */
+    H5B2_internal_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(depth > 0);
+
+    /* Set up user data for callback */
+    udata.f = hdr->f;
+    udata.hdr = hdr;
+    H5_CHECKED_ASSIGN(udata.nrec, uint16_t, nrec, unsigned)
+    H5_CHECKED_ASSIGN(udata.depth, uint16_t, depth, unsigned)
+
+    /* Protect the internal node */
+    if(NULL == (ret_value = (H5B2_internal_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_INT, addr, &udata, rw)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree internal node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_protect_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_iterate_node
+ *
+ * Purpose:	Iterate over all the records from a B-tree node, in "in-order"
+ *		order, making a callback for each record.
+ *
+ *              If the callback returns non-zero, the iteration breaks out
+ *              without finishing all the records.
+ *
+ * Return:	Value from callback, non-negative on success, negative on error
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 11 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *curr_node, H5B2_operator_t op, void *op_data)
+{
+    const H5AC_class_t *curr_node_class = NULL; /* Pointer to current node's class info */
+    void *node = NULL;                  /* Pointers to current node */
+    uint8_t *node_native;               /* Pointers to node's native records */
+    uint8_t *native = NULL;             /* Pointers to copy of node's native records */
+    H5B2_node_ptr_t *node_ptrs = NULL;  /* Pointers to node's node pointers */
+    unsigned u;                         /* Local index */
+    herr_t ret_value = H5_ITER_CONT;    /* Iterator return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node);
+    HDassert(op);
+
+    /* Protect current node & set up variables */
+    if(depth > 0) {
+        H5B2_internal_t *internal;     /* Pointer to internal node */
+
+        /* Lock the current B-tree node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_INT;
+        node = internal;
+        node_native = internal->int_native;
+
+        /* Allocate space for the node pointers in memory */
+        if(NULL == (node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
+
+        /* Copy the node pointers */
+        HDmemcpy(node_ptrs, internal->node_ptrs, (sizeof(H5B2_node_ptr_t) * (size_t)(curr_node->node_nrec + 1)));
+    } /* end if */
+    else {
+        H5B2_leaf_t *leaf;             /* Pointer to leaf node */
+
+        /* Lock the current B-tree node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_LEAF;
+        node = leaf;
+        node_native = leaf->leaf_native;
+    } /* end else */
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
+
+    /* Copy the native keys */
+    HDmemcpy(native, node_native, (hdr->cls->nrec_size * curr_node->node_nrec));
+
+    /* Unlock the node */
+    if(H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    node = NULL;
+
+    /* Iterate through records, in order */
+    for(u = 0; u < curr_node->node_nrec && !ret_value; u++) {
+        /* Descend into child node, if current node is an internal node */
+        if(depth > 0) {
+            if((ret_value = H5B2_iterate_node(hdr, dxpl_id, (depth - 1), &(node_ptrs[u]), op, op_data)) < 0)
+                HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
+        } /* end if */
+
+        /* Make callback for current record */
+        if(!ret_value) {
+            if((ret_value = (op)(H5B2_NAT_NREC(native, hdr, u), op_data)) < 0)
+                HERROR(H5E_BTREE, H5E_CANTLIST, "iterator function failed");
+        } /* end if */
+    } /* end for */
+
+    /* Descend into last child node, if current node is an internal node */
+    if(!ret_value && depth > 0) {
+        if((ret_value = H5B2_iterate_node(hdr, dxpl_id, (depth - 1), &(node_ptrs[u]), op, op_data)) < 0)
+            HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
+    } /* end if */
+
+done:
+    /* Release the node pointers & native records, if they were copied */
+    if(node_ptrs)
+        node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_FREE(hdr->node_info[depth].node_ptr_fac, node_ptrs);
+    if(native)
+        native = (uint8_t *)H5FL_FAC_FREE(hdr->node_info[depth].nat_rec_fac, native);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_iterate_node() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove_leaf
+ *
+ * Purpose:	Removes a record from a B-tree leaf node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_nodepos_t curr_pos, void *udata, H5B2_remove_t op, void *op_data)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
+    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
+    unsigned    idx;                    /* Location of record which matches key */
+    int         cmp;                    /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    leaf_addr = curr_node_ptr->addr;
+    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, leaf_addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+
+    /* Find correct location to remove this record */
+    if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp != 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
+
+    /* Check for invalidating the min/max record for the tree */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec) {
+                    HDfree(hdr->min_native_rec);
+                    hdr->min_native_rec = NULL;
+                } /* end if */
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec) {
+                    HDfree(hdr->max_native_rec);
+                    hdr->max_native_rec = NULL;
+                } /* end if */
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    /* Make 'remove' callback if there is one */
+    if(op)
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
+
+    /* Update number of records in node */
+    leaf->nrec--;
+
+    /* Mark leaf node as dirty also */
+    leaf_flags |= H5AC__DIRTIED_FLAG;
+
+    if(leaf->nrec > 0) {
+        /* Pack record out of leaf */
+        if(idx < leaf->nrec)
+            HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx), H5B2_LEAF_NREC(leaf, hdr, (idx + 1)), hdr->cls->nrec_size * (leaf->nrec - idx));
+    } /* end if */
+    else {
+        /* Let the cache know that the object is deleted */
+        leaf_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+        /* Reset address of parent node pointer */
+        curr_node_ptr->addr = HADDR_UNDEF;
+    } /* end else */
+
+    /* Update record count for parent of leaf node */
+    curr_node_ptr->node_nrec--;
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove_internal
+ *
+ * Purpose:	Removes a record from a B-tree node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
+    void *swap_loc, unsigned depth, H5AC_info_t *parent_cache_info,
+    unsigned *parent_cache_info_flags_ptr, H5B2_nodepos_t curr_pos,
+    H5B2_node_ptr_t *curr_node_ptr, void *udata, H5B2_remove_t op, void *op_data)
+{
+    H5AC_info_t *new_cache_info;        /* Pointer to new cache info */
+    unsigned *new_cache_info_flags_ptr = NULL;
+    H5B2_node_ptr_t *new_node_ptr;      /* Pointer to new node pointer */
+    H5B2_internal_t *internal;          /* Pointer to internal node */
+    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;  /* Position of next node */
+    unsigned internal_flags = H5AC__NO_FLAGS_SET;
+    haddr_t internal_addr;              /* Address of internal node */
+    size_t      merge_nrec;             /* Number of records to merge node at */
+    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(parent_cache_info);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    internal_addr = curr_node_ptr->addr;
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Determine the correct number of records to merge at */
+    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
+
+    /* Check for needing to collapse the root node */
+    /* (The root node is the only internal node allowed to have 1 record) */
+    if(internal->nrec == 1 &&
+            ((internal->node_ptrs[0].node_nrec + internal->node_ptrs[1].node_nrec) <= ((merge_nrec * 2) + 1))) {
+
+        /* Merge children of root node */
+        if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                parent_cache_info_flags_ptr, internal, &internal_flags, 0) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+
+        /* Let the cache know that the object is deleted */
+        internal_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+        /* Reset information in header's root node pointer */
+        curr_node_ptr->addr = internal->node_ptrs[0].addr;
+        curr_node_ptr->node_nrec = internal->node_ptrs[0].node_nrec;
+
+        /* Indicate that the level of the B-tree decreased */
+        *depth_decreased = TRUE;
+
+        /* Set pointers for advancing to child node */
+        new_cache_info = parent_cache_info;
+        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
+        new_node_ptr = curr_node_ptr;
+
+        /* Set flag to indicate root was collapsed */
+        collapsed_root = TRUE;
+
+        /* Indicate position of next node */
+        next_pos = H5B2_POS_ROOT;
+    } /* end if */
+    /* Merge or redistribute child node pointers, if necessary */
+    else {
+        unsigned idx;           /* Location of record which matches key */
+        int cmp = 0;            /* Comparison value of records */
+        unsigned retries;       /* Number of times to attempt redistribution */
+
+        /* Locate node pointer for child */
+        if(swap_loc)
+            idx = 0;
+        else {
+            if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                                   udata, &idx, &cmp) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+            if(cmp >= 0)
+                idx++;
+        } /* end else */
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for removal to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a merge */
+        retries = 2;
+
+        /* Preemptively merge/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
+            /* Attempt to redistribute records among children */
+            /* (NOTE: These 2-node redistributions should actually get the
+             *  record to promote from the node with more records. - QAK)
+             */
+            /* (NOTE: This code is the same in both H5B2_remove_internal() and
+             *  H5B2_remove_internal_by_idx(), fix bugs in both places! - QAK)
+             */
+            if(idx == 0) {    /* Left-most child */
+                if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec > merge_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end if */
+            else if(idx == internal->nrec) { /* Right-most child */
+                if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec > merge_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, (idx - 1)) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end if */
+            else { /* Middle child */
+                if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec > merge_nrec) ||
+                            (internal->node_ptrs[idx - 1].node_nrec > merge_nrec))) {
+                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge3(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end else */
+
+            /* Locate node pointer for child (after merge/redistribute) */
+            if(swap_loc)
+                idx = 0;
+            else {
+/* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
+                if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+                if(cmp >= 0)
+                    idx++;
+            } /* end else */
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+
+        /* Handle deleting a record from an internal node */
+        if(!swap_loc && cmp == 0)
+            swap_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+
+        /* Swap record to delete with record from leaf, if we are the last internal node */
+        if(swap_loc && depth == 1)
+            if(H5B2_swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "Can't swap records in B-tree")
+
+        /* Set pointers for advancing to child node */
+        new_cache_info_flags_ptr = &internal_flags;
+        new_cache_info = &internal->cache_info;
+        new_node_ptr = &internal->node_ptrs[idx];
+
+        /* Indicate position of next node */
+        if(H5B2_POS_MIDDLE != curr_pos) {
+            if(idx == 0) {
+                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_LEFT;
+            } /* end if */
+            else if(idx == internal->nrec) {
+                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_RIGHT;
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Attempt to remove record from child node */
+    if(depth > 1) {
+        if(H5B2_remove_internal(hdr, dxpl_id, depth_decreased, swap_loc, depth - 1,
+                new_cache_info, new_cache_info_flags_ptr, next_pos, new_node_ptr, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_remove_leaf(hdr, dxpl_id, new_node_ptr, next_pos, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
+    } /* end else */
+
+    /* Update record count for node pointer to current node */
+    if(!collapsed_root)
+        new_node_ptr->all_nrec--;
+
+    /* Mark node as dirty */
+    internal_flags |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release the B-tree internal node */
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, internal_addr, internal, internal_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove_leaf_by_idx
+ *
+ * Purpose:	Removes a record from a B-tree leaf node, according to the
+ *              offset in the B-tree records.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+    unsigned idx, H5B2_remove_t op, void *op_data)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
+    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock B-tree leaf node */
+    leaf_addr = curr_node_ptr->addr;
+    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, leaf_addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+    HDassert(idx < leaf->nrec);
+
+    /* Check for invalidating the min/max record for the tree */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec) {
+                    HDfree(hdr->min_native_rec);
+                    hdr->min_native_rec = NULL;
+                } /* end if */
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec) {
+                    HDfree(hdr->max_native_rec);
+                    hdr->max_native_rec = NULL;
+                } /* end if */
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    /* Make 'remove' callback if there is one */
+    if(op)
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
+
+    /* Update number of records in node */
+    leaf->nrec--;
+
+    /* Mark leaf node as dirty also */
+    leaf_flags |= H5AC__DIRTIED_FLAG;
+
+    if(leaf->nrec > 0) {
+        /* Pack record out of leaf */
+        if(idx < leaf->nrec)
+            HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx), H5B2_LEAF_NREC(leaf, hdr, (idx + 1)), hdr->cls->nrec_size * (leaf->nrec - idx));
+    } /* end if */
+    else {
+        /* Let the cache know that the object is deleted */
+        leaf_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+        /* Reset address of parent node pointer */
+        curr_node_ptr->addr = HADDR_UNDEF;
+    } /* end else */
+
+    /* Update record count for parent of leaf node */
+    curr_node_ptr->node_nrec--;
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove_leaf_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_remove_internal_by_idx
+ *
+ * Purpose:	Removes a record from a B-tree node, according to the offset
+ *              in the B-tree records
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+    H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, hsize_t n,
+    H5B2_remove_t op, void *op_data)
+{
+    H5AC_info_t *new_cache_info;        /* Pointer to new cache info */
+    unsigned *new_cache_info_flags_ptr = NULL;
+    H5B2_node_ptr_t *new_node_ptr;      /* Pointer to new node pointer */
+    H5B2_internal_t *internal;          /* Pointer to internal node */
+    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;  /* Position of next node */
+    unsigned internal_flags = H5AC__NO_FLAGS_SET;
+    haddr_t internal_addr;              /* Address of internal node */
+    size_t      merge_nrec;             /* Number of records to merge node at */
+    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(parent_cache_info);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    internal_addr = curr_node_ptr->addr;
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+    HDassert(internal->nrec == curr_node_ptr->node_nrec);
+    HDassert(depth == hdr->depth || internal->nrec > 1);
+
+    /* Determine the correct number of records to merge at */
+    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
+
+    /* Check for needing to collapse the root node */
+    /* (The root node is the only internal node allowed to have 1 record) */
+    if(internal->nrec == 1 &&
+            ((internal->node_ptrs[0].node_nrec + internal->node_ptrs[1].node_nrec) <= ((merge_nrec * 2) + 1))) {
+        HDassert(depth == hdr->depth);
+
+        /* Merge children of root node */
+        if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                parent_cache_info_flags_ptr, internal, &internal_flags, 0) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+
+        /* Let the cache know that the object is deleted */
+        internal_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+        /* Reset information in header's root node pointer */
+        curr_node_ptr->addr = internal->node_ptrs[0].addr;
+        curr_node_ptr->node_nrec = internal->node_ptrs[0].node_nrec;
+
+        /* Indicate that the level of the B-tree decreased */
+        *depth_decreased = TRUE;
+
+        /* Set pointers for advancing to child node */
+        new_cache_info = parent_cache_info;
+        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
+        new_node_ptr = curr_node_ptr;
+
+        /* Set flag to indicate root was collapsed */
+        collapsed_root = TRUE;
+
+        /* Indicate position of next node */
+        next_pos = H5B2_POS_ROOT;
+    } /* end if */
+    /* Merge or redistribute child node pointers, if necessary */
+    else {
+        hsize_t orig_n = n;     /* Original index looked for */
+        unsigned idx;           /* Location of record which matches key */
+        hbool_t found = FALSE;  /* Comparison value of records */
+        unsigned retries;       /* Number of times to attempt redistribution */
+
+        /* Locate node pointer for child */
+        if(swap_loc)
+            idx = 0;
+        else {
+            /* Search for record with correct index */
+            for(idx = 0; idx < internal->nrec; idx++) {
+                /* Check which child node contains indexed record */
+                if(internal->node_ptrs[idx].all_nrec >= n) {
+                    /* Check if record is in this node */
+                    if(internal->node_ptrs[idx].all_nrec == n) {
+                        /* Indicate the record was found and that the index
+                         *      in child nodes is zero from now on
+                         */
+                        found = TRUE;
+                        n = 0;
+
+                        /* Increment to next record */
+                        idx++;
+                    } /* end if */
+
+                    /* Break out of loop early */
+                    break;
+                } /* end if */
+
+                /* Decrement index we are looking for to account for the node we
+                 * just advanced past.
+                 */
+                n -= (internal->node_ptrs[idx].all_nrec + 1);
+            } /* end for */
+        } /* end else */
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for removal to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a merge */
+        retries = 2;
+
+        /* Preemptively merge/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
+            /* Attempt to redistribute records among children */
+            /* (NOTE: These 2-node redistributions should actually get the
+             *  record to promote from the node with more records. - QAK)
+             */
+            /* (NOTE: This code is the same in both H5B2_remove_internal() and
+             *  H5B2_remove_internal_by_idx(), fix bugs in both places! - QAK)
+             */
+            if(idx == 0) {    /* Left-most child */
+                if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec > merge_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end if */
+            else if(idx == internal->nrec) { /* Right-most child */
+                if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec > merge_nrec)) {
+                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, (idx - 1)) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end if */
+            else { /* Middle child */
+                if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec > merge_nrec) ||
+                            (internal->node_ptrs[idx - 1].node_nrec > merge_nrec))) {
+                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
+                } /* end if */
+                else {
+                    if(H5B2_merge3(hdr, dxpl_id, depth, curr_node_ptr,
+                           parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
+                } /* end else */
+            } /* end else */
+
+            /* Locate node pointer for child (after merge/redistribute) */
+            if(swap_loc)
+                idx = 0;
+            else {
+                /* Count from the orginal index value again */
+                n = orig_n;
+
+                /* Reset "found" flag - the record may have shifted during the
+                 *      redistribute/merge
+                 */
+                found = FALSE;
+
+                /* Search for record with correct index */
+                for(idx = 0; idx < internal->nrec; idx++) {
+                    /* Check which child node contains indexed record */
+                    if(internal->node_ptrs[idx].all_nrec >= n) {
+                        /* Check if record is in this node */
+                        if(internal->node_ptrs[idx].all_nrec == n) {
+                            /* Indicate the record was found and that the index
+                             *      in child nodes is zero from now on
+                             */
+                            found = TRUE;
+                            n = 0;
+
+                            /* Increment to next record */
+                            idx++;
+                        } /* end if */
+
+                        /* Break out of loop early */
+                        break;
+                    } /* end if */
+
+                    /* Decrement index we are looking for to account for the node we
+                     * just advanced past.
+                     */
+                    n -= (internal->node_ptrs[idx].all_nrec + 1);
+                } /* end for */
+            } /* end else */
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+
+        /* Handle deleting a record from an internal node */
+        if(!swap_loc && found)
+            swap_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+
+        /* Swap record to delete with record from leaf, if we are the last internal node */
+        if(swap_loc && depth == 1)
+            if(H5B2_swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "can't swap records in B-tree")
+
+        /* Set pointers for advancing to child node */
+        new_cache_info_flags_ptr = &internal_flags;
+        new_cache_info = &internal->cache_info;
+        new_node_ptr = &internal->node_ptrs[idx];
+
+        /* Indicate position of next node */
+        if(H5B2_POS_MIDDLE != curr_pos) {
+            if(idx == 0) {
+                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_LEFT;
+            } /* end if */
+            else if(idx == internal->nrec) {
+                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_RIGHT;
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Attempt to remove record from child node */
+    if(depth > 1) {
+        if(H5B2_remove_internal_by_idx(hdr, dxpl_id, depth_decreased, swap_loc, depth - 1,
+                new_cache_info, new_cache_info_flags_ptr, new_node_ptr, next_pos, n, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_remove_leaf_by_idx(hdr, dxpl_id, new_node_ptr, next_pos, (unsigned)n, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
+    } /* end else */
+
+    /* Update record count for node pointer to child node */
+    if(!collapsed_root)
+        new_node_ptr->all_nrec--;
+
+    /* Mark node as dirty */
+    internal_flags |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release the B-tree internal node */
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, internal_addr, internal, internal_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_remove_internal_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_neighbor_leaf
+ *
+ * Purpose:	Locate a record relative to the specified information in a
+ *              B-tree leaf node and return that information by filling in
+ *              fields of the
+ *              caller-supplied UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              The RANGE indicates whether to search for records less than or
+ *              equal to, or greater than or equal to the information passed
+ *              in with UDATA.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    void *neighbor_loc, H5B2_compare_t comp, void *udata, H5B2_found_t op,
+    void *op_data)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    unsigned    idx;                    /* Location of record which matches key */
+    int         cmp = 0;                /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(op);
+
+    /* Lock current B-tree node */
+    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, H5AC_READ)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Locate node pointer for child */
+    if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp > 0)
+        idx++;
+    else
+        if(cmp == 0 && comp == H5B2_COMPARE_GREATER)
+            idx++;
+
+    /* Set the neighbor location, if appropriate */
+    if(comp == H5B2_COMPARE_LESS) {
+        if(idx > 0)
+            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx - 1);
+    } /* end if */
+    else {
+        HDassert(comp == H5B2_COMPARE_GREATER);
+
+        if(idx < leaf->nrec)
+            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx);
+    } /* end else */
+
+    /* Make callback if neighbor record has been found */
+    if(neighbor_loc) {
+        /* Make callback for current record */
+        if((op)(neighbor_loc, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree neighbor operation")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree")
+
+done:
+    /* Release the B-tree internal node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_neighbor_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_neighbor_internal
+ *
+ * Purpose:	Locate a record relative to the specified information in a
+ *              B-tree internal node and return that information by filling in
+ *              fields of the
+ *              caller-supplied UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              The RANGE indicates whether to search for records less than or
+ *              equal to, or greater than or equal to the information passed
+ *              in with UDATA.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc, H5B2_compare_t comp,
+    void *udata, H5B2_found_t op, void *op_data)
+{
+    H5B2_internal_t *internal;          /* Pointer to internal node */
+    unsigned    idx;                    /* Location of record which matches key */
+    int         cmp = 0;                /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(op);
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_READ)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Locate node pointer for child */
+    if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                           udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp > 0)
+        idx++;
+
+    /* Set the neighbor location, if appropriate */
+    if(comp == H5B2_COMPARE_LESS) {
+        if(idx > 0)
+            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+    } /* end if */
+    else {
+        HDassert(comp == H5B2_COMPARE_GREATER);
+
+        if(idx < internal->nrec)
+            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx);
+    } /* end else */
+
+    /* Attempt to find neighboring record */
+    if(depth > 1) {
+        if(H5B2_neighbor_internal(hdr, dxpl_id, depth - 1, &internal->node_ptrs[idx], neighbor_loc, comp, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree internal node")
+    } /* end if */
+    else {
+        if(H5B2_neighbor_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], neighbor_loc, comp, udata, op, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree leaf node")
+    } /* end else */
+
+done:
+    /* Release the B-tree internal node */
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_neighbor_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_delete_node
+ *
+ * Purpose:	Iterate over all the nodes in a B-tree node deleting them
+ *		after they no longer have any children
+ *
+ * Return:	Value from callback, non-negative on success, negative on error
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *curr_node, H5B2_remove_t op, void *op_data)
+{
+    const H5AC_class_t *curr_node_class = NULL; /* Pointer to current node's class info */
+    void *node = NULL;                  /* Pointers to current node */
+    uint8_t *native;                    /* Pointers to node's native records */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node);
+
+    if(depth > 0) {
+        H5B2_internal_t *internal;     /* Pointer to internal node */
+        unsigned u;                    /* Local index */
+
+        /* Lock the current B-tree node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_INT;
+        node = internal;
+        native = internal->int_native;
+
+        /* Descend into children */
+        for(u = 0; u < internal->nrec + (unsigned)1; u++)
+            if(H5B2_delete_node(hdr, dxpl_id, (depth - 1), &(internal->node_ptrs[u]), op, op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node descent failed")
+    } /* end if */
+    else {
+        H5B2_leaf_t *leaf;             /* Pointer to leaf node */
+
+        /* Lock the current B-tree node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_LEAF;
+        node = leaf;
+        native = leaf->leaf_native;
+    } /* end else */
+
+    /* If there's a callback defined, iterate over the records in this node */
+    if(op) {
+        unsigned u;             /* Local index */
+
+        /* Iterate through records in this node */
+        for(u = 0; u < curr_node->node_nrec; u++) {
+            /* Make callback for each record */
+            if((op)(H5B2_NAT_NREC(native, hdr, u), op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "iterator function failed")
+        } /* end for */
+    } /* end if */
+
+done:
+    /* Unlock & delete current node */
+    if(node && H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_delete_node() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_node_size
+ *
+ * Purpose:     Iterate over all the records from a B-tree node, collecting
+ *		btree storage info.
+ *
+ * Return:      non-negative on success, negative on error
+ *
+ * Programmer:  Vailin Choi
+ *              July 12 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *curr_node, hsize_t *btree_size)
+{
+    H5B2_internal_t 	*internal = NULL;     	/* Pointer to internal node */
+    herr_t 		ret_value = SUCCEED;  	/* Iterator return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node);
+    HDassert(btree_size);
+    HDassert(depth > 0);
+
+    /* Lock the current B-tree node */
+    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Recursively descend into child nodes, if we are above the "twig" level in the B-tree */
+    if(depth > 1) {
+        unsigned 	u;                      /* Local index */
+
+        /* Descend into children */
+        for(u = 0; u < internal->nrec + (unsigned)1; u++)
+            if(H5B2_node_size(hdr, dxpl_id, (depth - 1), &(internal->node_ptrs[u]), btree_size) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node iteration failed")
+    } /* end if */
+    else /* depth is 1: count all the leaf nodes from this node */
+        *btree_size += (hsize_t)(internal->nrec + 1) * hdr->node_size;
+
+    /* Count this node */
+    *btree_size += hdr->node_size;
+
+done:
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_node_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_internal_free
+ *
+ * Purpose:	Destroys a B-tree internal node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_internal_free(H5B2_internal_t *internal)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(internal);
+
+    /* Release internal node's native key buffer */
+    if(internal->int_native)
+        internal->int_native = (uint8_t *)H5FL_FAC_FREE(internal->hdr->node_info[internal->depth].nat_rec_fac, internal->int_native);
+
+    /* Release internal node's node pointer buffer */
+    if(internal->node_ptrs)
+        internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_FREE(internal->hdr->node_info[internal->depth].node_ptr_fac, internal->node_ptrs);
+
+    /* Decrement ref. count on B-tree header */
+    if(H5B2_hdr_decr(internal->hdr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
+
+    /* Free B-tree internal node info */
+    internal = H5FL_FREE(H5B2_internal_t, internal);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_internal_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_leaf_free
+ *
+ * Purpose:	Destroys a B-tree leaf node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_leaf_free(H5B2_leaf_t *leaf)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(leaf);
+
+    /* Release leaf's native key buffer */
+    if(leaf->leaf_native)
+        leaf->leaf_native = (uint8_t *)H5FL_FAC_FREE(leaf->hdr->node_info[0].nat_rec_fac, leaf->leaf_native);
+
+    /* Decrement ref. count on B-tree header */
+    if(H5B2_hdr_decr(leaf->hdr) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
+
+    /* Free B-tree leaf node info */
+    leaf = H5FL_FREE(H5B2_leaf_t, leaf);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_leaf_free() */
+
+#ifdef H5B2_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_assert_leaf
+ *
+ * Purpose:	Verify than a leaf node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf)
+{
+    /* General sanity checking on node */
+    HDassert(leaf->nrec <= hdr->node_info->split_nrec);
+
+    return(0);
+} /* end H5B2_assert_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_assert_leaf2
+ *
+ * Purpose:	Verify than a leaf node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t H5_ATTR_UNUSED *leaf2)
+{
+    /* General sanity checking on node */
+    HDassert(leaf->nrec <= hdr->node_info->split_nrec);
+
+    return(0);
+} /* end H5B2_assert_leaf2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_assert_internal
+ *
+ * Purpose:	Verify than an internal node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal)
+{
+    hsize_t tot_all_nrec;       /* Total number of records at or below this node */
+    uint16_t u, v;               /* Local index variables */
+
+    /* General sanity checking on node */
+    HDassert(internal->nrec <= hdr->node_info->split_nrec);
+
+    /* Sanity checking on node pointers */
+    tot_all_nrec = internal->nrec;
+    for(u = 0; u < internal->nrec + 1; u++) {
+        tot_all_nrec += internal->node_ptrs[u].all_nrec;
+
+        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
+        HDassert(internal->node_ptrs[u].addr > 0);
+        for(v = 0; v < u; v++)
+            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
+    } /* end for */
+
+    /* Sanity check all_nrec total in parent */
+    if(parent_all_nrec > 0)
+        HDassert(tot_all_nrec == parent_all_nrec);
+
+    return(0);
+} /* end H5B2_assert_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_assert_internal2
+ *
+ * Purpose:	Verify than internal nodes are mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2)
+{
+    hsize_t tot_all_nrec;       /* Total number of records at or below this node */
+    uint16_t u, v;       /* Local index variables */
+
+    /* General sanity checking on node */
+    HDassert(internal->nrec <= hdr->node_info->split_nrec);
+
+    /* Sanity checking on node pointers */
+    tot_all_nrec =internal->nrec;
+    for(u =0; u < internal->nrec + 1; u++) {
+        tot_all_nrec += internal->node_ptrs[u].all_nrec;
+
+        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
+        HDassert(internal->node_ptrs[u].addr > 0);
+        for(v = 0; v < u; v++)
+            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
+        for(v = 0; v < internal2->nrec + 1; v++)
+            HDassert(internal->node_ptrs[u].addr != internal2->node_ptrs[v].addr);
+    } /* end for */
+
+    /* Sanity check all_nrec total in parent */
+    if(parent_all_nrec > 0)
+        HDassert(tot_all_nrec == parent_all_nrec);
+
+    return(0);
+} /* end H5B2_assert_internal2() */
+#endif /* H5B2_DEBUG */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2pkg.h b/gatb-core/thirdparty/hdf5/src/H5B2pkg.h
new file mode 100644
index 0000000..e4a5d1c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2pkg.h
@@ -0,0 +1,378 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Monday, January 31, 2005
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5B2 package.  Source files outside the H5B2 package should
+ *		include H5B2private.h instead.
+ */
+#ifndef H5B2_PACKAGE
+#error "Do not include this file outside the H5B2 package!"
+#endif
+
+#ifndef _H5B2pkg_H
+#define _H5B2pkg_H
+
+/* Get package's private header */
+#include "H5B2private.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Size of storage for number of records per node (on disk) */
+#define H5B2_SIZEOF_RECORDS_PER_NODE    (unsigned)2
+
+/* Size of a "tree pointer" (on disk) */
+/* (essentially, the largest internal pointer allowed) */
+#define H5B2_TREE_POINTER_SIZE(h)       (                                     \
+    (h)->sizeof_addr +                                                        \
+    H5B2_SIZEOF_RECORDS_PER_NODE +                                            \
+    (h)->sizeof_size                                                          \
+    )
+
+/* Size of a internal node pointer (on disk) */
+#define H5B2_INT_POINTER_SIZE(h, d) (                                         \
+    (unsigned)(h)->sizeof_addr  /* Address of child node */                   \
+    + (h)->max_nrec_size        /* # of records in child node */              \
+    + (h)->node_info[(d) - 1].cum_max_nrec_size /* Total # of records in child & below */ \
+    )
+
+/* Size of checksum information (on disk) */
+#define H5B2_SIZEOF_CHKSUM      4
+
+/* Format overhead for all v2 B-tree metadata in the file */
+#define H5B2_METADATA_PREFIX_SIZE (                                           \
+    (unsigned)H5_SIZEOF_MAGIC   /* Signature */                               \
+    + (unsigned)1 /* Version */                                               \
+    + (unsigned)1 /* Tree type */                                             \
+    + (unsigned)H5B2_SIZEOF_CHKSUM /* Metadata checksum */                    \
+    )
+
+/* Size of the v2 B-tree header on disk */
+#define H5B2_HEADER_SIZE(h)   (                                             \
+    /* General metadata fields */                                             \
+    H5B2_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Header specific fields */                                              \
+    + (unsigned)4 /* Node size, in bytes */                                   \
+    + (unsigned)2 /* Record size, in bytes */                                 \
+    + (unsigned)2 /* Depth of tree */                                         \
+    + (unsigned)1 /* Split % of full (as integer, ie. "98" means 98%) */      \
+    + (unsigned)1 /* Merge % of full (as integer, ie. "98" means 98%) */      \
+    + H5B2_TREE_POINTER_SIZE(h)  /* Node pointer to root node in tree */      \
+    )
+
+/* Size of the v2 B-tree internal node prefix */
+#define H5B2_INT_PREFIX_SIZE (                                                \
+    /* General metadata fields */                                             \
+    H5B2_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Header specific fields */                                              \
+    /* <none> */                                                              \
+    )
+
+/* Size of the v2 B-tree leaf node prefix */
+#define H5B2_LEAF_PREFIX_SIZE (                                               \
+    /* General metadata fields */                                             \
+    H5B2_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Header specific fields */                                              \
+    /* <none> */                                                              \
+    )
+
+/* Macro to retrieve pointer to i'th native record for native record buffer */
+#define H5B2_NAT_NREC(b, hdr, idx)  ((b) + (hdr)->nat_off[(idx)])
+
+/* Macro to retrieve pointer to i'th native record for internal node */
+#define H5B2_INT_NREC(i, hdr, idx)  H5B2_NAT_NREC((i)->int_native, (hdr), (idx))
+
+/* Macro to retrieve pointer to i'th native record for leaf node */
+#define H5B2_LEAF_NREC(l, hdr, idx)  H5B2_NAT_NREC((l)->leaf_native, (hdr), (idx))
+
+/* Number of records that fit into internal node */
+/* (accounts for extra node pointer by counting it in with the prefix bytes) */
+#define H5B2_NUM_INT_REC(h, d) \
+    (((h)->node_size - (H5B2_INT_PREFIX_SIZE + H5B2_INT_POINTER_SIZE(h, d))) / ((h)->rrec_size + H5B2_INT_POINTER_SIZE(h, d)))
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* A "node pointer" to another B-tree node */
+typedef struct {
+    haddr_t     addr;           /* Address of other node */
+    uint16_t    node_nrec;      /* Number of records used in node pointed to */
+    hsize_t     all_nrec;       /* Number of records in node pointed to and all it's children */
+} H5B2_node_ptr_t;
+
+/* Information about a node at a given depth */
+typedef struct {
+    unsigned    max_nrec;       /* Max. number of records in node */
+    unsigned    split_nrec;     /* Number of records to split node at */
+    unsigned    merge_nrec;     /* Number of records to merge node at */
+    hsize_t     cum_max_nrec;   /* Cumulative max. # of records below this node's depth */
+    uint8_t     cum_max_nrec_size; /* Size to store cumulative max. # of records for this node (in bytes) */
+    H5FL_fac_head_t *nat_rec_fac;   /* Factory for native record blocks */
+    H5FL_fac_head_t *node_ptr_fac;  /* Factory for node pointer blocks */
+} H5B2_node_info_t;
+
+/* The B-tree header information */
+typedef struct H5B2_hdr_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Internal B-tree information (stored) */
+    H5B2_node_ptr_t root;       /* Node pointer to root node in B-tree        */
+
+    /* Information set by user (stored) */
+    uint8_t     split_percent;  /* Percent full at which to split the node, when inserting */
+    uint8_t     merge_percent;  /* Percent full at which to merge the node, when deleting */
+    uint32_t    node_size;      /* Size of B-tree nodes, in bytes             */
+    uint32_t    rrec_size;      /* Size of "raw" (on disk) record, in bytes   */
+
+    /* Dynamic information (stored) */
+    uint16_t	depth;		/* B-tree's overall depth                     */
+
+    /* Derived information from user's information (not stored) */
+    uint8_t     max_nrec_size;  /* Size to store max. # of records in any node (in bytes) */
+
+    /* Shared internal data structures (not stored) */
+    H5F_t       *f;             /* Pointer to the file that the B-tree is in */
+    haddr_t     addr;           /* Address of B-tree header in the file */
+    size_t      hdr_size;       /* Size of the B-tree header on disk */
+    size_t      rc;             /* Reference count of nodes using this header */
+    size_t      file_rc;        /* Reference count of files using this header */
+    hbool_t     pending_delete; /* B-tree is pending deletion */
+    uint8_t     sizeof_size;    /* Size of file sizes */
+    uint8_t     sizeof_addr;    /* Size of file addresses */
+    H5B2_remove_t remove_op;    /* Callback operator for deleting B-tree */
+    void        *remove_op_data;/* B-tree deletion callback's context */
+    uint8_t	*page;	        /* Common disk page for I/O */
+    size_t      *nat_off;       /* Array of offsets of native records */
+    H5B2_node_info_t *node_info; /* Table of node info structs for current depth of B-tree */
+    uint8_t     *min_native_rec;   /* Pointer to minimum native record                  */
+    uint8_t     *max_native_rec;   /* Pointer to maximum native record                  */
+
+    /* Client information (not stored) */
+    const H5B2_class_t *cls;	/* Class of B-tree client */
+    void        *cb_ctx;        /* Client callback context */
+} H5B2_hdr_t;
+
+/* B-tree leaf node information */
+typedef struct H5B2_leaf_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Internal B-tree information */
+    H5B2_hdr_t	*hdr;		/* Pointer to the [pinned] v2 B-tree header   */
+    uint8_t     *leaf_native;   /* Pointer to native records                  */
+    uint16_t    nrec;           /* Number of records in node                  */
+} H5B2_leaf_t;
+
+/* B-tree internal node information */
+typedef struct H5B2_internal_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Internal B-tree information */
+    H5B2_hdr_t	*hdr;		/* Pointer to the [pinned] v2 B-tree header   */
+    uint8_t     *int_native;    /* Pointer to native records                  */
+    H5B2_node_ptr_t *node_ptrs; /* Pointer to node pointers                   */
+    uint16_t    nrec;           /* Number of records in node                  */
+    uint16_t    depth;          /* Depth of this node in the B-tree           */
+} H5B2_internal_t;
+
+/* v2 B-tree */
+struct H5B2_t {
+    H5B2_hdr_t  *hdr;           /* Pointer to internal v2 B-tree header info */
+    H5F_t      *f;              /* Pointer to file for v2 B-tree */
+};
+
+/* Node position, for min/max determination */
+typedef enum H5B2_nodepos_t {
+    H5B2_POS_ROOT,              /* Node is root (i.e. both right & left-most in tree) */
+    H5B2_POS_RIGHT,             /* Node is right-most in tree, at a given depth */
+    H5B2_POS_LEFT,              /* Node is left-most in tree, at a given depth */
+    H5B2_POS_MIDDLE             /* Node is neither right or left-most in tree */
+} H5B2_nodepos_t;
+
+/* Callback info for loading a free space header into the cache */
+typedef struct H5B2_hdr_cache_ud_t {
+    H5F_t *f;                   /* File that v2 b-tree header is within */
+    void *ctx_udata;            /* User-data for protecting */
+} H5B2_hdr_cache_ud_t;
+
+/* Callback info for loading a free space internal node into the cache */
+typedef struct H5B2_internal_cache_ud_t {
+    H5F_t *f;                   /* File that v2 b-tree header is within */
+    H5B2_hdr_t *hdr;            /* v2 B-tree header */
+    unsigned nrec;              /* Number of records in node to load */
+    unsigned depth;             /* Depth of node to load */
+} H5B2_internal_cache_ud_t;
+
+/* Callback info for loading a free space leaf node into the cache */
+typedef struct H5B2_leaf_cache_ud_t {
+    H5F_t *f;                   /* File that v2 b-tree header is within */
+    H5B2_hdr_t *hdr;            /* v2 B-tree header */
+    unsigned nrec;              /* Number of records in node to load */
+} H5B2_leaf_cache_ud_t;
+
+#ifdef H5B2_TESTING
+/* Node information for testing */
+typedef struct {
+    unsigned depth;             /* Depth of node */
+    unsigned nrec;              /* Number of records in node */
+} H5B2_node_info_test_t;
+#endif /* H5B2_TESTING */
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5B2 header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_BT2_HDR[1];
+
+/* H5B2 internal node inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_BT2_INT[1];
+
+/* H5B2 leaf node inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_BT2_LEAF[1];
+
+/* Declare a free list to manage the H5B2_internal_t struct */
+H5FL_EXTERN(H5B2_internal_t);
+
+/* Declare a free list to manage the H5B2_leaf_t struct */
+H5FL_EXTERN(H5B2_leaf_t);
+
+/* Internal v2 B-tree testing class */
+#ifdef H5B2_TESTING
+H5_DLLVAR const H5B2_class_t H5B2_TEST[1];
+#endif /* H5B2_TESTING */
+
+/* Array of v2 B-tree client ID -> client class mappings */
+extern const H5B2_class_t *const H5B2_client_class_g[H5B2_NUM_BTREE_ID];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Routines for managing B-tree header info */
+H5_DLL H5B2_hdr_t *H5B2_hdr_alloc(H5F_t *f);
+H5_DLL haddr_t H5B2_hdr_create(H5F_t *f, hid_t dxpl_id,
+    const H5B2_create_t *cparam, void *ctx_udata);
+H5_DLL herr_t H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam,
+    void *ctx_udata, uint16_t depth);
+H5_DLL herr_t H5B2_hdr_incr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2_hdr_decr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr);
+H5_DLL size_t H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2_hdr_dirty(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id);
+
+/* Routines for operating on leaf nodes */
+H5B2_leaf_t *H5B2_protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
+    unsigned nrec, H5AC_protect_t rw);
+
+/* Routines for operating on internal nodes */
+H5_DLL H5B2_internal_t *H5B2_protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t addr, unsigned nrec, unsigned depth, H5AC_protect_t rw);
+
+/* Routines for allocating nodes */
+H5_DLL herr_t H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5B2_create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *node_ptr);
+
+/* Routines for releasing structures */
+H5_DLL herr_t H5B2_hdr_free(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2_leaf_free(H5B2_leaf_t *l);
+H5_DLL herr_t H5B2_internal_free(H5B2_internal_t *i);
+
+/* Routines for inserting records */
+H5_DLL herr_t H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned depth, unsigned *parent_cache_info_flags_ptr,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *udata);
+H5_DLL herr_t H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *udata);
+
+/* Routines for iterating over nodes/records */
+H5_DLL herr_t H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *curr_node, H5B2_operator_t op, void *op_data);
+H5_DLL herr_t H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned depth, const H5B2_node_ptr_t *curr_node, hsize_t *op_data);
+
+/* Routines for locating records */
+H5_DLL int H5B2_locate_record(const H5B2_class_t *type, unsigned nrec,
+    size_t *rec_off, const uint8_t *native, const void *udata, unsigned *idx, int *result);
+H5_DLL herr_t H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned depth, H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc,
+    H5B2_compare_t comp, void *udata, H5B2_found_t op, void *op_data);
+H5_DLL herr_t H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc,
+    H5B2_compare_t comp, void *udata, H5B2_found_t op, void *op_data);
+
+/* Routines for removing records */
+H5_DLL herr_t H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+    H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
+    H5B2_nodepos_t curr_pos, H5B2_node_ptr_t *curr_node_ptr, void *udata,
+    H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+    void *udata, H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+    H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, hsize_t n,
+    H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+    unsigned idx, H5B2_remove_t op, void *op_data);
+
+/* Routines for deleting nodes */
+H5_DLL herr_t H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *curr_node, H5B2_remove_t op, void *op_data);
+
+/* Debugging routines for dumping file structures */
+H5_DLL herr_t H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5B2_class_t *type, haddr_t obj_addr);
+H5_DLL herr_t H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5B2_class_t *type,
+    haddr_t hdr_addr, unsigned nrec, unsigned depth, haddr_t obj_addr);
+H5_DLL herr_t H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5B2_class_t *type,
+    haddr_t hdr_addr, unsigned nrec, haddr_t obj_addr);
+
+/* Testing routines */
+#ifdef H5B2_TESTING
+H5_DLL herr_t H5B2_get_root_addr_test(H5B2_t *bt2, haddr_t *root_addr);
+H5_DLL int H5B2_get_node_depth_test(H5B2_t *bt2, hid_t dxpl_id, void *udata);
+H5_DLL herr_t H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id,
+    void *udata, H5B2_node_info_test_t *ninfo);
+#endif /* H5B2_TESTING */
+
+#endif /* _H5B2pkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2private.h b/gatb-core/thirdparty/hdf5/src/H5B2private.h
new file mode 100644
index 0000000..fd9bf0e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2private.h
@@ -0,0 +1,158 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2private.h
+ *			Jan 31 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Private header for library accessible B-tree routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5B2private_H
+#define _H5B2private_H
+
+/* Include package's public header */
+#include "H5B2public.h"
+
+/* Private headers needed by this file */
+#include "H5Fprivate.h"		/* File access				*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* B-tree IDs for various internal things. */
+typedef enum H5B2_subid_t {
+    H5B2_TEST_ID	 = 0,	/* B-tree is for testing (do not use for actual data) */
+    H5B2_FHEAP_HUGE_INDIR_ID, 	/* B-tree is for fractal heap indirectly accessed, non-filtered 'huge' objects */
+    H5B2_FHEAP_HUGE_FILT_INDIR_ID, /* B-tree is for fractal heap indirectly accessed, filtered 'huge' objects */
+    H5B2_FHEAP_HUGE_DIR_ID, 	/* B-tree is for fractal heap directly accessed, non-filtered 'huge' objects */
+    H5B2_FHEAP_HUGE_FILT_DIR_ID, /* B-tree is for fractal heap directly accessed, filtered 'huge' objects */
+    H5B2_GRP_DENSE_NAME_ID,     /* B-tree is for indexing 'name' field for "dense" link storage in groups */
+    H5B2_GRP_DENSE_CORDER_ID,   /* B-tree is for indexing 'creation order' field for "dense" link storage in groups */
+    H5B2_SOHM_INDEX_ID,         /* B-tree is an index for shared object header messages */
+    H5B2_ATTR_DENSE_NAME_ID,    /* B-tree is for indexing 'name' field for "dense" attribute storage on objects */
+    H5B2_ATTR_DENSE_CORDER_ID,  /* B-tree is for indexing 'creation order' field for "dense" attribute storage on objects */
+    H5B2_NUM_BTREE_ID           /* Number of B-tree IDs (must be last)  */
+} H5B2_subid_t;
+
+/* Define the operator callback function pointer for H5B2_iterate() */
+typedef int (*H5B2_operator_t)(const void *record, void *op_data);
+
+/* Define the 'found' callback function pointer for H5B2_find(), H5B2_neighbor() & H5B2_index() */
+typedef herr_t (*H5B2_found_t)(const void *record, void *op_data);
+
+/* Define the 'modify' callback function pointer for H5B2_modify() */
+typedef herr_t (*H5B2_modify_t)(void *record, void *op_data, hbool_t *changed);
+
+/* Define the 'remove' callback function pointer for H5B2_remove() & H5B2_delete() */
+typedef herr_t (*H5B2_remove_t)(const void *record, void *op_data);
+
+/* Comparisons for H5B2_neighbor() call */
+typedef enum H5B2_compare_t {
+    H5B2_COMPARE_LESS,            /* Records with keys less than query value */
+    H5B2_COMPARE_GREATER          /* Records with keys greater than query value */
+} H5B2_compare_t;
+
+/*
+ * Each class of object that can be pointed to by a B-tree has a
+ * variable of this type that contains class variables and methods.
+ */
+typedef struct H5B2_class_t H5B2_class_t;
+struct H5B2_class_t {
+    H5B2_subid_t id;		/* ID of B-tree class, as found in file */
+    const char *name;		/* Name of B-tree class, for debugging */
+    size_t nrec_size;           /* Size of native (memory) record */
+
+    /* Extensible array client callback methods */
+    void *(*crt_context)(void *udata);          /* Create context for other client callbacks */
+    herr_t (*dst_context)(void *ctx);           /* Destroy client callback context */
+    herr_t (*store)(void *nrecord, const void *udata);              	/* Store application record in native record table */
+    herr_t (*compare)(const void *rec1, const void *rec2, int *result); /* Compare two native records */
+    herr_t (*encode)(uint8_t *raw, const void *record, void *ctx);  	/* Encode record from native form to disk storage form */
+    herr_t (*decode)(const uint8_t *raw, void *record, void *ctx);  	/* Decode record from disk storage form to native form */
+    herr_t (*debug)(FILE *stream, const H5F_t *f, hid_t dxpl_id,    	/* Print a record for debugging */
+        int indent, int fwidth, const void *record, const void *ctx);
+    void *(*crt_dbg_ctx)(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr); 	/* Create debugging context */
+    herr_t (*dst_dbg_ctx)(void *dbg_ctx);       /* Destroy debugging context */
+};
+
+/* v2 B-tree creation parameters */
+typedef struct H5B2_create_t {
+    const H5B2_class_t *cls;            /* v2 B-tree client class */
+    uint32_t node_size;                 /* Size of each node (in bytes) */
+    uint32_t rrec_size;                 /* Size of raw record (in bytes) */
+    uint8_t split_percent;              /* % full to split nodes */
+    uint8_t merge_percent;              /* % full to merge nodes */
+} H5B2_create_t;
+
+/* v2 B-tree metadata statistics info */
+typedef struct H5B2_stat_t {
+    unsigned depth;             /* Depth of B-tree */
+    hsize_t nrecords;          /* Number of records */
+} H5B2_stat_t;
+
+/* v2 B-tree info (forward decl - defined in H5B2pkg.h) */
+typedef struct H5B2_t H5B2_t;
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+H5_DLL H5B2_t *H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
+    void *ctx_udata);
+H5_DLL H5B2_t *H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata);
+H5_DLL herr_t H5B2_get_addr(const H5B2_t *bt2, haddr_t *addr/*out*/);
+H5_DLL herr_t H5B2_insert(H5B2_t *bt2, hid_t dxpl_id, void *udata);
+H5_DLL herr_t H5B2_iterate(H5B2_t *bt2, hid_t dxpl_id, H5B2_operator_t op,
+    void *op_data);
+H5_DLL htri_t H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata,
+    H5B2_found_t op, void *op_data);
+H5_DLL herr_t H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order,
+    hsize_t idx, H5B2_found_t op, void *op_data);
+H5_DLL herr_t H5B2_neighbor(H5B2_t *bt2, hid_t dxpl_id, H5B2_compare_t range,
+    void *udata, H5B2_found_t op, void *op_data);
+H5_DLL herr_t H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata,
+    H5B2_modify_t op, void *op_data);
+H5_DLL herr_t H5B2_remove(H5B2_t *b2, hid_t dxpl_id, void *udata,
+    H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id,
+    H5_iter_order_t order, hsize_t idx, H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2_get_nrec(const H5B2_t *bt2, hsize_t *nrec);
+H5_DLL herr_t H5B2_size(H5B2_t *bt2, hid_t dxpl_id,
+    hsize_t *btree_size);
+H5_DLL herr_t H5B2_close(H5B2_t *bt2, hid_t dxpl_id);
+H5_DLL herr_t H5B2_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    void *ctx_udata, H5B2_remove_t op, void *op_data);
+
+/* Statistics routines */
+H5_DLL herr_t H5B2_stat_info(H5B2_t *bt2, H5B2_stat_t *info);
+
+#endif /* _H5B2private_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2public.h b/gatb-core/thirdparty/hdf5/src/H5B2public.h
new file mode 100644
index 0000000..43ec5d7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2public.h
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5B2public.h
+ *                      Jan 31 2005
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Public declarations for the v2 B-tree package.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5B2public_H
+#define _H5B2public_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/**********************************/
+/* Public API Function Prototypes */
+/**********************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5B2public_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2stat.c b/gatb-core/thirdparty/hdf5/src/H5B2stat.c
new file mode 100644
index 0000000..5d159ed
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2stat.c
@@ -0,0 +1,149 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Monday, March  6, 2006
+ *
+ * Purpose:     v2 B-tree metadata statistics functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE        /* Suppress error about including H5B2pkg   */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5B2pkg.h"        /* v2 B-trees                               */
+#include "H5Eprivate.h"     /* Error handling                           */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_stat_info
+ *
+ * Purpose:     Retrieve metadata statistics for a v2 B-tree
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, March  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_stat_info(H5B2_t *bt2, H5B2_stat_t *info)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(info);
+
+    /* Get information about the B-tree */
+    info->depth = bt2->hdr->depth;
+    info->nrecords = bt2->hdr->root.all_nrec;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_stat_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_size
+ *
+ * Purpose:     Iterate over all the records in the B-tree, collecting
+ *              storage info.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              June 19 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_size(H5B2_t *bt2, hid_t dxpl_id, hsize_t *btree_size)
+{
+    H5B2_hdr_t  *hdr;                   /* Pointer to the B-tree header */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(btree_size);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Add size of header to B-tree metadata total */
+    *btree_size += hdr->hdr_size;
+
+    /* Iterate through records */
+    if(hdr->root.node_nrec > 0) {
+        /* Check for root node being a leaf */
+        if(hdr->depth == 0)
+            *btree_size += hdr->node_size;
+        else
+            /* Iterate through nodes */
+            if(H5B2_node_size(hdr, dxpl_id, hdr->depth, &hdr->root, btree_size) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node iteration failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5B2test.c b/gatb-core/thirdparty/hdf5/src/H5B2test.c
new file mode 100644
index 0000000..dde0e71
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5B2test.c
@@ -0,0 +1,541 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Thursday, February  3, 2005
+ *
+ * Purpose:	v2 B-tree testing functions.
+ *
+ */
+
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#define H5B2_TESTING		/*suppress warning about H5B2 testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* v2 B-tree client callback context */
+typedef struct H5B2_test_ctx_t {
+    uint8_t     sizeof_size;    /* Size of file sizes */
+} H5B2_test_ctx_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static void *H5B2_test_crt_context(void *udata);
+static herr_t H5B2_test_dst_context(void *ctx);
+static herr_t H5B2_test_store(void *nrecord, const void *udata);
+static herr_t H5B2_test_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5B2_test_encode(uint8_t *raw, const void *nrecord, void *ctx);
+static herr_t H5B2_test_decode(const uint8_t *raw, void *nrecord, void *ctx);
+static herr_t H5B2_test_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+static void *H5B2_test_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+const H5B2_class_t H5B2_TEST[1]={{   /* B-tree class information */
+    H5B2_TEST_ID,               /* Type of B-tree */
+    "H5B2_TEST_ID",             /* Name of B-tree class */
+    sizeof(hsize_t),            /* Size of native record */
+    H5B2_test_crt_context,      /* Create client callback context */
+    H5B2_test_dst_context,      /* Destroy client callback context */
+    H5B2_test_store,            /* Record storage callback */
+    H5B2_test_compare,          /* Record comparison callback */
+    H5B2_test_encode,           /* Record encoding callback */
+    H5B2_test_decode,           /* Record decoding callback */
+    H5B2_test_debug,            /* Record debugging callback */
+    H5B2_test_crt_dbg_context,  /* Create debugging context */
+    H5B2_test_dst_context       /* Destroy debugging context */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+/* Declare a free list to manage the H5B2_test_ctx_t struct */
+H5FL_DEFINE_STATIC(H5B2_test_ctx_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_crt_context
+ *
+ * Purpose:	Create client callback context
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5B2_test_crt_context(void *_f)
+{
+    H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
+    H5B2_test_ctx_t *ctx;       /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5B2_test_ctx_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of lengths in the file */
+    ctx->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_test_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_dst_context
+ *
+ * Purpose:	Destroy client callback context
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_dst_context(void *_ctx)
+{
+    H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Release callback context */
+    ctx = H5FL_FREE(H5B2_test_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_store
+ *
+ * Purpose:	Store native information into record for B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_store(void *nrecord, const void *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *(hsize_t *)nrecord = *(const hsize_t *)udata;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_compare(const void *rec1, const void *rec2, int *result)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *result = (int)(*(const hssize_t *)rec1 - *(const hssize_t *)rec2);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_encode(uint8_t *raw, const void *nrecord, void *_ctx)
+{
+    H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    H5F_ENCODE_LENGTH_LEN(raw, *(const hsize_t *)nrecord, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, February  4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_decode(const uint8_t *raw, void *nrecord, void *_ctx)
+{
+    H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    H5F_DECODE_LENGTH_LEN(raw, *(hsize_t *)nrecord, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, February  4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2_test_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *record,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert (record);
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth, "Record:",
+        *(const hsize_t *)record);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_test_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_test_crt_dbg_context
+ *
+ * Purpose:	Create context for debugging callback
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5B2_test_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+{
+    H5B2_test_ctx_t *ctx;       /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5B2_test_ctx_t)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses & lengths in the file */
+    ctx->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_test_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_get_root_addr_test
+ *
+ * Purpose:	Retrieve the root node's address
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, February 26, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_get_root_addr_test(H5B2_t *bt2, haddr_t *root_addr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(bt2);
+    HDassert(root_addr);
+
+    /* Get B-tree root addr */
+    *root_addr = bt2->hdr->root.addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2_get_root_addr_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_get_node_info_test
+ *
+ * Purpose:	Determine information about a node holding a record in the B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 31, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
+    H5B2_node_info_test_t *ninfo)
+{
+    H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
+    H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
+    unsigned    depth;                  /* Current depth of the tree */
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx;                    /* Location of record which matches key */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+
+    /* Set the shared v2 B-tree header's file context for this operation */
+    bt2->hdr->f = bt2->f;
+
+    /* Get the v2 B-tree header */
+    hdr = bt2->hdr;
+
+    /* Make copy of the root node pointer to start search with */
+    curr_node_ptr = hdr->root;
+
+    /* Current depth of the tree */
+    depth = hdr->depth;
+
+    /* Check for empty tree */
+    if(0 == curr_node_ptr.node_nrec)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "B-tree has no records")
+
+    /* Walk down B-tree to find record or leaf node where record is located */
+    cmp = -1;
+    while(depth > 0 && cmp != 0) {
+        H5B2_internal_t *internal;          /* Pointer to internal node in B-tree */
+        H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
+
+        /* Lock B-tree current node */
+        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
+
+        /* Locate node pointer for child */
+        if(H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                               udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+        if(cmp > 0)
+            idx++;
+
+        if(cmp != 0) {
+            /* Get node pointer for next node to search */
+            next_node_ptr = internal->node_ptrs[idx];
+
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Set pointer to next node to load */
+            curr_node_ptr = next_node_ptr;
+        } /* end if */
+        else {
+            /* Unlock current node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+            /* Fill in information about the node */
+            ninfo->depth = depth;
+            ninfo->nrec = curr_node_ptr.node_nrec;
+
+            /* Indicate success */
+            HGOTO_DONE(SUCCEED)
+        } /* end else */
+
+        /* Decrement depth we're at in B-tree */
+        depth--;
+    } /* end while */
+
+    {
+        H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
+
+        /* Lock B-tree leaf node */
+        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+        /* Locate record */
+        if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, 
+                               udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+        /* Unlock current node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+        /* Indicate the depth that the record was found */
+        if(cmp != 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record not in B-tree")
+    } /* end block */
+
+    /* Fill in information about the leaf node */
+    ninfo->depth = depth;
+    ninfo->nrec = curr_node_ptr.node_nrec;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_get_node_info_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2_get_node_depth_test
+ *
+ * Purpose:	Determine the depth of a node holding a record in the B-tree
+ *
+ * Note:	Just a simple wrapper around the H5B2_get_node_info_test() routine
+ *
+ * Return:	Success:	non-negative depth of the node where the record
+ *                              was found
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, August 26, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5B2_get_node_depth_test(H5B2_t *bt2, hid_t dxpl_id, void *udata)
+{
+    H5B2_node_info_test_t ninfo;        /* Node information */
+    int		ret_value;              /* Return information */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(bt2);
+
+    /* Get information abou the node */
+    if(H5B2_get_node_info_test(bt2, dxpl_id, udata, &ninfo) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "error looking up node info")
+
+    /* Set return value */
+    ret_value = ninfo.depth;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2_get_node_depth_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Bcache.c b/gatb-core/thirdparty/hdf5/src/H5Bcache.c
new file mode 100644
index 0000000..b66204c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Bcache.c
@@ -0,0 +1,410 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Bcache.c
+ *			Oct 31 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implement B-tree metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B_PACKAGE		/*suppress error about including H5Bpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bpkg.h"		/* B-link trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache callbacks */
+static H5B_t *H5B__load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5B__flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B_t *b, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5B__dest(H5F_t *f, H5B_t *bt);
+static herr_t H5B__clear(H5F_t *f, H5B_t *b, hbool_t destroy);
+static herr_t H5B__compute_size(const H5F_t *f, const H5B_t *bt, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5B inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_BT[1] = {{
+    H5AC_BT_ID,
+    (H5AC_load_func_t)H5B__load,
+    (H5AC_flush_func_t)H5B__flush,
+    (H5AC_dest_func_t)H5B__dest,
+    (H5AC_clear_func_t)H5B__clear,
+    (H5AC_size_func_t)H5B__compute_size,
+}};
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B__load
+ *
+ * Purpose:	Loads a B-tree node from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree node.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_t *
+H5B__load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5B_t *bt = NULL;           /* Pointer to the deserialized B-tree node */
+    H5B_cache_ud_t *udata = (H5B_cache_ud_t *)_udata;       /* User data for callback */
+    H5B_shared_t *shared;       /* Pointer to shared B-tree info */
+    const uint8_t *p;           /* Pointer into raw data buffer */
+    uint8_t *native;            /* Pointer to native keys */
+    unsigned u;                 /* Local index variable */
+    H5B_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    if(NULL == (bt = H5FL_MALLOC(H5B_t)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate B-tree struct")
+    HDmemset(&bt->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Set & increment the ref-counted "shared" B-tree information for the node */
+    bt->rc_shared = udata->rc_shared;
+    H5RC_INC(bt->rc_shared);
+
+    /* Get a pointer to the shared info, for convenience */
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+
+    /* Allocate space for the native keys and child addresses */
+    if(NULL == (bt->native = H5FL_BLK_MALLOC(native_block, shared->sizeof_keys)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate buffer for native keys")
+    if(NULL == (bt->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate buffer for child addresses")
+
+    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->sizeof_rnode, dxpl_id, shared->page) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree node")
+
+    /* Set the pointer into the raw data buffer */
+    p = shared->page;
+
+    /* magic number */
+    if(HDmemcmp(p, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree signature")
+    p += 4;
+
+    /* node type and level */
+    if(*p++ != (uint8_t)udata->type->id)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree node type")
+    bt->level = *p++;
+
+    /* entries used */
+    UINT16DECODE(p, bt->nchildren);
+
+    /* Check if bt->nchildren is greater than two_k */
+    if(bt->nchildren > shared->two_k)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "number of children is greater than maximum")
+
+    /* sibling pointers */
+    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(bt->left));
+    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(bt->right));
+
+    /* the child/key pairs */
+    native = bt->native;
+    for(u = 0; u < bt->nchildren; u++) {
+        /* Decode native key value */
+        if((udata->type->decode)(shared, p, native) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode key")
+        p += shared->sizeof_rkey;
+        native += udata->type->sizeof_nkey;
+
+        /* Decode address value */
+        H5F_addr_decode(udata->f, (const uint8_t **)&p, bt->child + u);
+    } /* end for */
+
+    /* Decode final key */
+    if(bt->nchildren > 0) {
+        /* Decode native key value */
+        if((udata->type->decode)(shared, p, native) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode key")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = bt;
+
+done:
+    if(!ret_value && bt)
+        if(H5B_node_dest(bt) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B__load() */  /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B__flush
+ *
+ * Purpose:	Flushes a dirty B-tree node to disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B__flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B_t *bt, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5B_shared_t *shared;       /* Pointer to shared B-tree info */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(bt);
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    HDassert(shared->type);
+    HDassert(shared->type->encode);
+
+    if(bt->cache_info.is_dirty) {
+        uint8_t    *p;              /* Pointer into raw data buffer */
+        uint8_t    *native;         /* Pointer to native keys */
+        unsigned    u;              /* Local index variable */
+
+        p = shared->page;
+
+        /* magic number */
+        HDmemcpy(p, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += 4;
+
+        /* node type and level */
+        *p++ = (uint8_t)shared->type->id;
+        H5_CHECK_OVERFLOW(bt->level, unsigned, uint8_t);
+        *p++ = (uint8_t)bt->level;
+
+        /* entries used */
+        UINT16ENCODE(p, bt->nchildren);
+
+        /* sibling pointers */
+        H5F_addr_encode(f, &p, bt->left);
+        H5F_addr_encode(f, &p, bt->right);
+
+        /* child keys and pointers */
+        native = bt->native;
+        for(u = 0; u < bt->nchildren; ++u) {
+            /* encode the key */
+            if(shared->type->encode(shared, p, native) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
+            p += shared->sizeof_rkey;
+            native += shared->type->sizeof_nkey;
+
+            /* encode the child address */
+            H5F_addr_encode(f, &p, bt->child[u]);
+        } /* end for */
+        if(bt->nchildren > 0) {
+            /* Encode the final key */
+            if(shared->type->encode(shared, p, native) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
+        } /* end if */
+
+	/*
+         * Write the disk page.	We always write the header, but we don't
+         * bother writing data for the child entries that don't exist or
+         * for the final unchanged children.
+	 */
+	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, shared->sizeof_rnode, dxpl_id, shared->page) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree node to disk")
+
+	bt->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5B__dest(f, bt) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B__flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B__dest
+ *
+ * Purpose:	Destroys a B-tree node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B__dest(H5F_t *f, H5B_t *bt)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(bt);
+    HDassert(bt->rc_shared);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!bt->cache_info.free_file_space_on_destroy || H5F_addr_defined(bt->cache_info.addr));
+
+    /* Check for freeing file space for B-tree node */
+    if(bt->cache_info.free_file_space_on_destroy) {
+        H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+
+        /* Get the pointer to the shared B-tree info */
+        shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+        HDassert(shared);
+
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, bt->cache_info.addr, (hsize_t)shared->sizeof_rnode) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree node")
+    } /* end if */
+
+    /* Destroy B-tree node */
+    if(H5B_node_dest(bt) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B__dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B__clear
+ *
+ * Purpose:	Mark a B-tree node in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 20 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B__clear(H5F_t *f, H5B_t *bt, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(bt);
+
+    /* Reset the dirty flag.  */
+    bt->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5B__dest(f, bt) < 0)
+	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B__clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B__compute_size
+ *
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *		H5B_t on disk, and return it in *len_ptr.  On failure,
+ *		the value of *len_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B__compute_size(const H5F_t H5_ATTR_UNUSED *f, const H5B_t *bt, size_t *size_ptr)
+{
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(bt);
+    HDassert(bt->rc_shared);
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    HDassert(shared->type);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = shared->sizeof_rnode;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B__compute_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Bdbg.c b/gatb-core/thirdparty/hdf5/src/H5Bdbg.c
new file mode 100644
index 0000000..3fb7dd8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Bdbg.c
@@ -0,0 +1,290 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Bdbg.c
+ *			Dec 11 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Debugging routines for B-link tree package.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bpkg.h"		/* B-link trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_debug
+ *
+ * Purpose:	Prints debugging info about a B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  4 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+	  const H5B_class_t *type, void *udata)
+{
+    H5B_t	*bt = NULL;
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    unsigned	u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(type);
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /*
+     * Load the tree node.
+     */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Tree type ID:",
+	      ((shared->type->id) == H5B_SNODE_ID ? "H5B_SNODE_ID" :
+            ((shared->type->id) == H5B_CHUNK_ID ? "H5B_CHUNK_ID" : "Unknown!")));
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of node:",
+	      shared->sizeof_rnode);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of raw (disk) key:",
+	      shared->sizeof_rkey);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Dirty flag:",
+	      bt->cache_info.is_dirty ? "True" : "False");
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Level:",
+	      bt->level);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of left sibling:",
+	      bt->left);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of right sibling:",
+	      bt->right);
+    HDfprintf(stream, "%*s%-*s %u (%u)\n", indent, "", fwidth,
+	      "Number of children (max):",
+	      bt->nchildren, shared->two_k);
+
+    /*
+     * Print the child addresses
+     */
+    for(u = 0; u < bt->nchildren; u++) {
+	HDfprintf(stream, "%*sChild %d...\n", indent, "", u);
+	HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Address:", bt->child[u]);
+
+        /* If there is a key debugging routine, use it to display the left & right keys */
+	if(type->debug_key) {
+            /* Decode the 'left' key & print it */
+            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Left Key:");
+            HDassert(H5B_NKEY(bt,shared,u));
+	    (void)(type->debug_key)(stream, indent + 6, MAX(0, fwidth - 6),
+			      H5B_NKEY(bt, shared, u), udata);
+
+            /* Decode the 'right' key & print it */
+            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Right Key:");
+            HDassert(H5B_NKEY(bt, shared, u + 1));
+	    (void)(type->debug_key)(stream, indent + 6, MAX (0, fwidth - 6),
+			      H5B_NKEY(bt, shared, u + 1), udata);
+	} /* end if */
+    } /* end for */
+
+done:
+    if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B_assert
+ *
+ * Purpose:	Verifies that the tree is structured correctly.
+ *
+ * Return:	Success:	SUCCEED
+ *
+ *		Failure:	aborts if something is wrong.
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5B_DEBUG
+herr_t
+H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void *udata)
+{
+    H5B_t	*bt = NULL;
+    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
+    int	        ncell, cmp;
+    static int	ncalls = 0;
+    herr_t	status;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    /* A queue of child data */
+    struct child_t {
+	haddr_t			addr;
+	unsigned		level;
+	struct child_t	       *next;
+    } *head = NULL, *tail = NULL, *prev = NULL, *cur = NULL, *tmp = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(0 == ncalls++) {
+	if(H5DEBUG(B))
+	    fprintf(H5DEBUG(B), "H5B: debugging B-trees (expensive)\n");
+    } /* end if */
+
+    /* Get shared info for B-tree */
+    if(NULL == (rc_shared = (type->get_shared)(f, udata)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    HDassert(shared);
+
+    /* Initialize the queue */
+    cache_udata.f = f;
+    cache_udata.type = type;
+    cache_udata.rc_shared = rc_shared;
+    bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ);
+    HDassert(bt);
+    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    cur = (struct child_t *)H5MM_calloc(sizeof(struct child_t));
+    HDassert(cur);
+    cur->addr = addr;
+    cur->level = bt->level;
+    head = tail = cur;
+
+    status = H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET);
+    HDassert(status >= 0);
+    bt = NULL;    /* Make certain future references will be caught */
+
+    /*
+     * Do a breadth-first search of the tree.  New nodes are added to the end
+     * of the queue as the `cur' pointer is advanced toward the end.  We don't
+     * remove any nodes from the queue because we need them in the uniqueness
+     * test.
+     */
+    for(ncell = 0; cur; ncell++) {
+	bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, &cache_udata, H5AC_READ);
+	HDassert(bt);
+
+	/* Check node header */
+	HDassert(bt->level == cur->level);
+	if(cur->next && cur->next->level == bt->level)
+	    HDassert(H5F_addr_eq(bt->right, cur->next->addr));
+	else
+	    HDassert(!H5F_addr_defined(bt->right));
+	if(prev && prev->level == bt->level)
+	    HDassert(H5F_addr_eq(bt->left, prev->addr));
+	else
+	    HDassert(!H5F_addr_defined(bt->left));
+
+	if(cur->level > 0) {
+            unsigned u;
+
+	    for(u = 0; u < bt->nchildren; u++) {
+		/*
+		 * Check that child nodes haven't already been seen.  If they
+		 * have then the tree has a cycle.
+		 */
+		for(tmp = head; tmp; tmp = tmp->next)
+		    HDassert(H5F_addr_ne(tmp->addr, bt->child[u]));
+
+		/* Add the child node to the end of the queue */
+		tmp = (struct child_t *)H5MM_calloc(sizeof(struct child_t));
+		HDassert(tmp);
+		tmp->addr = bt->child[u];
+		tmp->level = bt->level - 1;
+		tail->next = tmp;
+		tail = tmp;
+
+		/* Check that the keys are monotonically increasing */
+		cmp = (type->cmp2)(H5B_NKEY(bt, shared, u), udata, H5B_NKEY(bt, shared, u + 1));
+		HDassert(cmp < 0);
+	    } /* end for */
+	} /* end if */
+
+	/* Release node */
+	status = H5AC_unprotect(f, dxpl_id, H5AC_BT, cur->addr, bt, H5AC__NO_FLAGS_SET);
+	HDassert(status >= 0);
+        bt = NULL;    /* Make certain future references will be caught */
+
+	/* Advance current location in queue */
+	prev = cur;
+	cur = cur->next;
+    } /* end for */
+
+    /* Free all entries from queue */
+    while(head) {
+	tmp = head->next;
+	H5MM_xfree(head);
+	head = tmp;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B_assert() */
+#endif /* H5B_DEBUG */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Bpkg.h b/gatb-core/thirdparty/hdf5/src/H5Bpkg.h
new file mode 100644
index 0000000..46e2b28
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Bpkg.h
@@ -0,0 +1,98 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Thursday, May 15, 2003
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5B package.  Source files outside the H5B package should
+ *		include H5Bprivate.h instead.
+ */
+#ifndef H5B_PACKAGE
+#error "Do not include this file outside the H5B package!"
+#endif
+
+#ifndef _H5Bpkg_H
+#define _H5Bpkg_H
+
+/* Get package's private header */
+#include "H5Bprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5FLprivate.h"        /* Free Lists                           */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Get the native key at a given index */
+#define H5B_NKEY(b, shared, idx)  ((b)->native + (shared)->nkey[(idx)])
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* The B-tree node as stored in memory...  */
+typedef struct H5B_t {
+    H5AC_info_t        cache_info;     /* Information for H5AC cache functions */
+                                        /* _must_ be first field in structure */
+    H5RC_t		*rc_shared;	/*ref-counted shared info	     */
+    unsigned		level;		/*node level			     */
+    unsigned		nchildren;	/*number of child pointers	     */
+    haddr_t		left;		/*address of left sibling	     */
+    haddr_t		right;		/*address of right sibling	     */
+    uint8_t		*native;	/*array of keys in native format     */
+    haddr_t		*child;		/*2k child pointers		     */
+} H5B_t;
+
+/* Callback info for loading a B-tree node into the cache */
+typedef struct H5B_cache_ud_t {
+    H5F_t *f;                           /* File that B-tree node is within   */
+    const struct H5B_class_t *type;     /* Type of tree			     */
+    H5RC_t *rc_shared;                  /* Ref-counted shared info	     */
+} H5B_cache_ud_t;
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5B header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_BT[1];
+
+/* Declare a free list to manage the haddr_t sequence information */
+H5FL_SEQ_EXTERN(haddr_t);
+
+/* Declare a PQ free list to manage the native block information */
+H5FL_BLK_EXTERN(native_block);
+
+/* Declare a free list to manage the H5B_t struct */
+H5FL_EXTERN(H5B_t);
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+H5_DLL herr_t H5B_node_dest(H5B_t *bt);
+#ifdef H5B_DEBUG
+herr_t H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
+			 void *udata);
+#endif
+
+#endif /*_H5Bpkg_H*/
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Bprivate.h b/gatb-core/thirdparty/hdf5/src/H5Bprivate.h
new file mode 100644
index 0000000..83a357b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Bprivate.h
@@ -0,0 +1,181 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Bprivate.h
+ *			Jul 10 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Private non-prototype header.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5Bprivate_H
+#define _H5Bprivate_H
+
+#include "H5Bpublic.h"		/*API prototypes			     */
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5RCprivate.h"	/* Reference counted object functions	*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/*
+ * Feature: Define this constant if you want to check B-tree consistency
+ *	    after each B-tree operation.  Note that this slows down the
+ *	    library considerably! Debugging the B-tree depends on assert()
+ *	    being enabled.
+ */
+#ifdef NDEBUG
+#  undef H5B_DEBUG
+#endif
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* B-tree IDs for various internal things. */
+/* Note - if more of these are added, any 'K' values (for internal or leaf
+ * nodes) they use will need to be stored in the file somewhere. -QAK
+ */
+typedef enum H5B_subid_t {
+    H5B_SNODE_ID	 = 0,	/*B-tree is for symbol table nodes	     */
+    H5B_CHUNK_ID	 = 1,	/*B-tree is for chunked dataset storage	     */
+    H5B_NUM_BTREE_ID            /* Number of B-tree key IDs (must be last)   */
+} H5B_subid_t;
+
+/* Define return values from B-tree insertion callbacks */
+typedef enum H5B_ins_t {
+    H5B_INS_ERROR	 = -1,	/*error return value			     */
+    H5B_INS_NOOP	 = 0,	/*insert made no changes		     */
+    H5B_INS_LEFT	 = 1,	/*insert new node to left of cur node	     */
+    H5B_INS_RIGHT	 = 2,	/*insert new node to right of cur node	     */
+    H5B_INS_CHANGE	 = 3,	/*change child address for cur node	     */
+    H5B_INS_FIRST	 = 4,	/*insert first node in (sub)tree	     */
+    H5B_INS_REMOVE	 = 5	/*remove current node			     */
+} H5B_ins_t;
+
+/* Enum for specifying the direction of the critical key in relation to the
+ * child */
+typedef enum H5B_dir_t {
+    H5B_LEFT            = 0,    /* Critical key is to the left */
+    H5B_RIGHT           = 1     /* Critical key is to the right */
+} H5B_dir_t;
+
+/* Define the operator callback function pointer for H5B_iterate() */
+typedef int (*H5B_operator_t)(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+                                        const void *_rt_key, void *_udata);
+
+/* Each B-tree has certain information that can be shared across all
+ * the instances of nodes in that B-tree.
+ */
+typedef struct H5B_shared_t {
+    const struct H5B_class_t	*type;	/* Type of tree			     */
+    unsigned            two_k;          /* 2*"K" value for tree's nodes      */
+    size_t		sizeof_rkey;	/* Size of raw (disk) key	     */
+    size_t		sizeof_rnode;	/* Size of raw (disk) node	     */
+    size_t		sizeof_keys;	/* Size of native (memory) key node  */
+    size_t              sizeof_addr;    /* Size of file address (in bytes)   */
+    size_t              sizeof_len;     /* Size of file lengths (in bytes)   */
+    uint8_t	        *page;	        /* Disk page */
+    size_t              *nkey;          /* Offsets of each native key in native key buffer */
+} H5B_shared_t;
+
+/*
+ * Each class of object that can be pointed to by a B-link tree has a
+ * variable of this type that contains class variables and methods.  Each
+ * tree has a K (1/2 rank) value on a per-file basis.  The file_create_parms
+ * has an array of K values indexed by the `id' class field below.  The
+ * array is initialized with the HDF5_BTREE_K_DEFAULT macro.
+ */
+
+typedef struct H5B_class_t {
+    H5B_subid_t id;					/*id as found in file*/
+    size_t	sizeof_nkey;			/*size of native (memory) key*/
+    H5RC_t *    (*get_shared)(const H5F_t*, const void*);    /*shared info for node */
+    herr_t	(*new_node)(H5F_t*, hid_t, H5B_ins_t, void*, void*, void*, haddr_t*);
+    int         (*cmp2)(void*, void*, void*);	    /*compare 2 keys */
+    int         (*cmp3)(void*, void*, void*);	    /*compare 3 keys */
+    htri_t	(*found)(H5F_t*, hid_t, haddr_t, const void*, void*);
+
+    /* insert new data */
+    H5B_ins_t	(*insert)(H5F_t*, hid_t, haddr_t, void*, hbool_t*, void*, void*,
+			  void*, hbool_t*, haddr_t*);
+
+    /* min insert uses min leaf, not new(), similarily for max insert */
+    hbool_t	follow_min;
+    hbool_t	follow_max;
+
+    /* The direction of the key that is intrinsically associated with each node */
+    H5B_dir_t   critical_key;
+
+    /* remove existing data */
+    H5B_ins_t	(*remove)(H5F_t*, hid_t, haddr_t, void*, hbool_t*, void*, void*,
+			  hbool_t*);
+
+    /* encode, decode, debug key values */
+    herr_t	(*decode)(const H5B_shared_t*, const uint8_t*, void*);
+    herr_t	(*encode)(const H5B_shared_t*, uint8_t*, const void*);
+    herr_t	(*debug_key)(FILE*, int, int, const void*, const void*);
+} H5B_class_t;
+
+/* Information about B-tree */
+typedef struct H5B_info_t {
+    hsize_t     size;           /* Size of B-tree nodes */
+    hsize_t     num_nodes;      /* Number of B-tree nodes */
+} H5B_info_t;
+
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+H5_DLL herr_t H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    void *udata, haddr_t *addr_p/*out*/);
+H5_DLL herr_t H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, void *udata);
+H5_DLL herr_t H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, void *udata);
+H5_DLL herr_t H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, H5B_operator_t op, void *udata);
+H5_DLL herr_t H5B_get_info(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, H5B_info_t *bt_info, H5B_operator_t op, void *udata);
+H5_DLL herr_t H5B_remove(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, void *udata);
+H5_DLL herr_t H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr, void *udata);
+H5_DLL H5B_shared_t *H5B_shared_new(const H5F_t *f, const H5B_class_t *type,
+    size_t sizeof_rkey);
+H5_DLL herr_t H5B_shared_free(void *_shared);
+H5_DLL herr_t H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream,
+    int indent, int fwidth, const H5B_class_t *type, void *udata);
+H5_DLL htri_t H5B_valid(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type,
+    haddr_t addr);
+#endif /* _H5Bprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Bpublic.h b/gatb-core/thirdparty/hdf5/src/H5Bpublic.h
new file mode 100644
index 0000000..0016996
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Bpublic.h
@@ -0,0 +1,41 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Bproto.h
+ *                      Jul 10 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public declarations for the H5B package.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Bpublic_H
+#define _H5Bpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5C.c b/gatb-core/thirdparty/hdf5/src/H5C.c
new file mode 100644
index 0000000..03fe3d4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5C.c
@@ -0,0 +1,8557 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5C.c
+ *              June 1 2004
+ *              John Mainzer
+ *
+ * Purpose:     Functions in this file implement a generic cache for
+ *              things which exist on disk, and which may be
+ *	 	unambiguously referenced by their disk addresses.
+ *
+ *              The code in this module was initially written in
+ *		support of a complete re-write of the metadata cache
+ *		in H5AC.c  However, other uses for the cache code
+ *		suggested themselves, and thus this file was created
+ *		in an attempt to support re-use.
+ *
+ *		For a detailed overview of the cache, please see the
+ *		header comment for H5C_t in H5Cpkg.h.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**************************************************************************
+ *
+ *				To Do:
+ *
+ *	Code Changes:
+ *
+ *	 - Remove extra functionality in H5C_flush_single_entry()?
+ *
+ *	 - Change protect/unprotect to lock/unlock.
+ *
+ *	 - Flush entries in increasing address order in
+ *	   H5C_make_space_in_cache().
+ *
+ *	 - Also in H5C_make_space_in_cache(), use high and low water marks
+ *	   to reduce the number of I/O calls.
+ *
+ *	 - When flushing, attempt to combine contiguous entries to reduce
+ *	   I/O overhead.  Can't do this just yet as some entries are not
+ *	   contiguous.  Do this in parallel only or in serial as well?
+ *
+ *	 - Create MPI type for dirty objects when flushing in parallel.
+ *
+ *	 - Now that TBBT routines aren't used, fix nodes in memory to
+ *         point directly to the skip list node from the LRU list, eliminating
+ *         skip list lookups when evicting objects from the cache.
+ *
+ *	Tests:
+ *
+ *	 - Trim execution time.  (This is no longer a major issue with the
+ *	   shift from the TBBT to a hash table for indexing.)
+ *
+ *	 - Add random tests.
+ *
+ **************************************************************************/
+
+#define H5C_PACKAGE		/*suppress error about including H5Cpkg   */
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#ifdef H5_HAVE_PARALLEL
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#endif /* H5_HAVE_PARALLEL */
+#include "H5Cpkg.h"		/* Cache				*/
+#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+
+/*
+ * Private file-scope variables.
+ */
+
+/* Declare a free list to manage the H5C_t struct */
+H5FL_DEFINE_STATIC(H5C_t);
+
+
+/*
+ * Private file-scope function declarations:
+ */
+
+static herr_t H5C__auto_adjust_cache_size(H5F_t * f,
+                                          hid_t primary_dxpl_id,
+                                          hid_t secondary_dxpl_id,
+                                          hbool_t write_permitted,
+                                          hbool_t * first_flush_ptr);
+
+static herr_t H5C__autoadjust__ageout(H5F_t * f,
+                                      double hit_rate,
+                                      enum H5C_resize_status * status_ptr,
+                                      size_t * new_max_cache_size_ptr,
+                                      hid_t primary_dxpl_id,
+                                      hid_t secondary_dxpl_id,
+                                      hbool_t write_permitted,
+                                      hbool_t * first_flush_ptr);
+
+static herr_t H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr);
+
+static herr_t H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
+                                                    hid_t primary_dxpl_id,
+                                                    hid_t secondary_dxpl_id,
+                                                    hbool_t write_permitted,
+                                                    hbool_t * first_flush_ptr);
+
+static herr_t H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr);
+
+static herr_t H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr);
+
+static herr_t H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr);
+
+static herr_t H5C__flash_increase_cache_size(H5C_t * cache_ptr,
+                                             size_t old_entry_size,
+                                             size_t new_entry_size);
+
+static herr_t H5C_flush_single_entry(H5F_t *       	 f,
+                                     hid_t               primary_dxpl_id,
+                                     hid_t               secondary_dxpl_id,
+                                     const H5C_class_t * type_ptr,
+                                     haddr_t             addr,
+                                     unsigned            flags,
+                                     hbool_t *           first_flush_ptr,
+                                     hbool_t    del_entry_from_slist_on_destroy);
+
+static herr_t H5C_flush_invalidate_cache(H5F_t *  f,
+	                                 hid_t    primary_dxpl_id,
+				         hid_t    secondary_dxpl_id,
+					 unsigned flags);
+
+static void * H5C_load_entry(H5F_t *             f,
+                             hid_t               dxpl_id,
+                             const H5C_class_t * type,
+                             haddr_t             addr,
+                             void *              udata);
+
+static herr_t H5C_make_space_in_cache(H5F_t * f,
+                                      hid_t   primary_dxpl_id,
+                                      hid_t   secondary_dxpl_id,
+                                      size_t  space_needed,
+                                      hbool_t write_permitted,
+                                      hbool_t * first_flush_ptr);
+#if H5C_DO_EXTREME_SANITY_CHECKS
+static herr_t H5C_validate_lru_list(H5C_t * cache_ptr);
+static herr_t H5C_verify_not_in_index(H5C_t * cache_ptr,
+                                      H5C_cache_entry_t * entry_ptr);
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+

+/****************************************************************************
+ *
+ * #defines and declarations for epoch marker cache entries.
+ *
+ * As a strategy for automatic cache size reduction, the cache may insert
+ * marker entries in the LRU list at the end of each epoch.  These markers
+ * are then used to identify entries that have not been accessed for n
+ * epochs so that they can be evicted from the cache.
+ *
+ ****************************************************************************/
+
+/* Note that H5C__MAX_EPOCH_MARKERS is defined in H5Cpkg.h, not here because
+ * it is needed to dimension arrays in H5C_t.
+ */
+
+#define H5C__EPOCH_MARKER_TYPE	H5C__MAX_NUM_TYPE_IDS
+
+static void *H5C_epoch_marker_load(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+                                   void *udata);
+static herr_t H5C_epoch_marker_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
+                                     haddr_t addr, void *thing,
+				     unsigned *flags_ptr);
+static herr_t H5C_epoch_marker_dest(H5F_t *f, void *thing);
+static herr_t H5C_epoch_marker_clear(H5F_t *f, void *thing, hbool_t dest);
+static herr_t H5C_epoch_marker_notify(H5C_notify_action_t action, void *thing);
+static herr_t H5C_epoch_marker_size(const H5F_t *f, const void *thing, size_t *size_ptr);
+
+const H5C_class_t epoch_marker_class =
+{
+    /* id    = */ H5C__EPOCH_MARKER_TYPE,
+    /* load  = */ &H5C_epoch_marker_load,
+    /* flush = */ &H5C_epoch_marker_flush,
+    /* dest  = */ &H5C_epoch_marker_dest,
+    /* clear = */ &H5C_epoch_marker_clear,
+    /* size  = */ &H5C_epoch_marker_size
+};
+
+/***************************************************************************
+ * Class functions for H5C__EPOCH_MAKER_TYPE:
+ *
+ * None of these functions should ever be called, so there is no point in
+ * documenting them separately.
+ *                                                     JRM - 11/16/04
+ *
+ ***************************************************************************/
+
+static void *
+H5C_epoch_marker_load(H5F_t H5_ATTR_UNUSED * f,
+                      hid_t H5_ATTR_UNUSED dxpl_id,
+                      haddr_t H5_ATTR_UNUSED addr,
+                      void H5_ATTR_UNUSED * udata)
+{
+    void * ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "called unreachable fcn.")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5C_epoch_marker_flush(H5F_t H5_ATTR_UNUSED *f,
+                       hid_t H5_ATTR_UNUSED dxpl_id,
+                       hbool_t H5_ATTR_UNUSED dest,
+                       haddr_t H5_ATTR_UNUSED addr,
+                       void H5_ATTR_UNUSED *thing,
+		       unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5C_epoch_marker_dest(H5F_t H5_ATTR_UNUSED * f,
+                      void H5_ATTR_UNUSED * thing)
+{
+    herr_t ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5C_epoch_marker_clear(H5F_t H5_ATTR_UNUSED * f,
+                       void H5_ATTR_UNUSED * thing,
+                       hbool_t H5_ATTR_UNUSED dest)
+{
+    herr_t ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5C_epoch_marker_notify(H5C_notify_action_t H5_ATTR_UNUSED action,
+                       void H5_ATTR_UNUSED * thing)
+{
+    herr_t ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5C_epoch_marker_size(const H5F_t H5_ATTR_UNUSED * f,
+                      const void H5_ATTR_UNUSED * thing,
+                      size_t H5_ATTR_UNUSED * size_ptr)
+{
+    herr_t ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_apply_candidate_list
+ *
+ * Purpose:     Apply the supplied candidate list.
+ *
+ *		We used to do this by simply having each process write 
+ *		every mpi_size-th entry in the candidate list, starting 
+ *		at index mpi_rank, and mark all the others clean.  
+ *
+ *		However, this can cause unnecessary contention in a file 
+ *		system by increasing the number of processes writing to 
+ *		adjacent locations in the HDF5 file.
+ *
+ *		To attempt to minimize this, we now arange matters such 
+ *		that each process writes n adjacent entries in the 
+ *		candidate list, and marks all others clean.  We must do
+ *		this in such a fashion as to guarantee that each entry 
+ *		on the candidate list is written by exactly one process, 
+ *		and marked clean by all others.  
+ *
+ *		To do this, first construct a table mapping mpi_rank
+ *		to the index of the first entry in the candidate list to
+ *		be written by the process of that mpi_rank, and then use
+ *		the table to control which entries are written and which
+ *		are marked as clean as a function of the mpi_rank.
+ *
+ *		Note that the table must be identical on all processes, as
+ *		all see the same candidate list, mpi_size, and mpi_rank --
+ *		the inputs used to construct the table.  
+ *
+ *		We construct the table as follows.  Let:
+ *
+ *			n = num_candidates / mpi_size;
+ *
+ *			m = num_candidates % mpi_size;
+ *
+ *		Now allocate an array of integers of length mpi_size + 1, 
+ *		and call this array candidate_assignment_table. 
+ *
+ *		Conceptually, if the number of candidates is a multiple
+ *		of the mpi_size, we simply pass through the candidate list
+ *		and assign n entries to each process to flush, with the 
+ *		index of the first entry to flush in the location in 
+ *		the candidate_assignment_table indicated by the mpi_rank
+ *		of the process.  
+ *
+ *		In the more common case in which the candidate list isn't 
+ *		isn't a multiple of the mpi_size, we pretend it is, and 
+ *		give num_candidates % mpi_size processes one extra entry
+ *		each to make things work out.
+ *
+ *		Once the table is constructed, we determine the first and
+ *		last entry this process is to flush as follows:
+ *
+ *	 	first_entry_to_flush = candidate_assignment_table[mpi_rank]
+ *
+ *		last_entry_to_flush = 
+ *			candidate_assignment_table[mpi_rank + 1] - 1;
+ *		
+ *		With these values determined, we simply scan through the 
+ *		candidate list, marking all entries in the range 
+ *		[first_entry_to_flush, last_entry_to_flush] for flush,
+ *		and all others to be cleaned.
+ *
+ *		Finally, we scan the LRU from tail to head, flushing 
+ *		or marking clean the candidate entries as indicated.
+ *		If necessary, we scan the pinned list as well.
+ *
+ *		Note that this function will fail if any protected or 
+ *		clean entries appear on the candidate list.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ * Modifications:
+ *
+ *		Heavily reworked to have each process flush a group of 
+ *		adjacent entries.
+ *						JRM -- 4/15/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+#define H5C_APPLY_CANDIDATE_LIST__DEBUG 0
+herr_t
+H5C_apply_candidate_list(H5F_t * f,
+                         hid_t primary_dxpl_id,
+                         hid_t secondary_dxpl_id,
+                         H5C_t * cache_ptr,
+                         int num_candidates,
+                         haddr_t * candidates_list_ptr,
+                         int mpi_rank,
+                         int mpi_size)
+{
+    hbool_t             first_flush = FALSE;
+    int                 i;
+    int			m;
+    int			n;
+    int			first_entry_to_flush;
+    int			last_entry_to_flush;
+    int			entries_to_clear = 0;
+    int			entries_to_flush = 0;
+    int			entries_cleared = 0;
+    int			entries_flushed = 0;
+    int			entries_examined = 0;
+    int			initial_list_len;
+    int               * candidate_assignment_table = NULL;
+    haddr_t		addr;
+    H5C_cache_entry_t *	clear_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	flush_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    haddr_t		last_addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    char		tbl_buf[1024];
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( num_candidates > 0 );
+    HDassert( num_candidates <= cache_ptr->slist_len );
+    HDassert( candidates_list_ptr != NULL );
+    HDassert( 0 <= mpi_rank );
+    HDassert( mpi_rank < mpi_size );
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: setting up candidate assignment table.\n", 
+              FUNC, mpi_rank);
+    for ( i = 0; i < 1024; i++ ) tbl_buf[i] = '\0';
+    sprintf(&(tbl_buf[0]), "candidate list = ");
+    for ( i = 0; i < num_candidates; i++ )
+    {
+        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " 0x%llx", 
+                (long long)(*(candidates_list_ptr + i)));
+    }
+    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
+    HDfprintf(stdout, "%s", tbl_buf);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    n = num_candidates / mpi_size;
+    m = num_candidates % mpi_size;
+    HDassert(n >= 0);
+
+    if(NULL == (candidate_assignment_table = (int *)H5MM_malloc(sizeof(int) * (size_t)(mpi_size + 1))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for candidate assignment table")
+
+    candidate_assignment_table[0] = 0;
+    candidate_assignment_table[mpi_size] = num_candidates;
+
+    if(m == 0) { /* mpi_size is an even divisor of num_candidates */
+        HDassert(n > 0);
+        for(i = 1; i < mpi_size; i++)
+            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
+    } /* end if */
+    else { 
+        for(i = 1; i <= m; i++)
+            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n + 1;
+
+        if(num_candidates < mpi_size) {
+            for(i = m + 1; i < mpi_size; i++)
+                candidate_assignment_table[i] = num_candidates;
+        } /* end if */
+        else {
+            for(i = m + 1; i < mpi_size; i++)
+                candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
+        } /* end else */
+    } /* end else */
+    HDassert((candidate_assignment_table[mpi_size - 1] + n) == num_candidates);
+
+#if H5C_DO_SANITY_CHECKS
+    /* verify that the candidate assignment table has the expected form */
+    for ( i = 1; i < mpi_size - 1; i++ ) 
+    {
+        int a, b;
+
+        a = candidate_assignment_table[i] - candidate_assignment_table[i - 1];
+        b = candidate_assignment_table[i + 1] - candidate_assignment_table[i];
+
+        HDassert( n + 1 >= a );
+        HDassert( a >= b );
+        HDassert( b >= n );
+    }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    first_entry_to_flush = candidate_assignment_table[mpi_rank];
+    last_entry_to_flush = candidate_assignment_table[mpi_rank + 1] - 1;
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    for ( i = 0; i < 1024; i++ )
+        tbl_buf[i] = '\0';
+    sprintf(&(tbl_buf[0]), "candidate assignment table = ");
+    for(i = 0; i <= mpi_size; i++)
+        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " %d", candidate_assignment_table[i]);
+    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
+    HDfprintf(stdout, "%s", tbl_buf);
+
+    HDfprintf(stdout, "%s:%d: flush entries [%d, %d].\n", 
+              FUNC, mpi_rank, first_entry_to_flush, last_entry_to_flush);
+
+    HDfprintf(stdout, "%s:%d: marking entries.\n", FUNC, mpi_rank);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    for(i = 0; i < num_candidates; i++) {
+        addr = candidates_list_ptr[i];
+        HDassert( H5F_addr_defined(addr) );
+
+#if H5C_DO_SANITY_CHECKS
+        if ( i > 0 ) {
+            if ( last_addr == addr ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Duplicate entry in cleaned list.\n")
+            } else if ( last_addr > addr ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "candidate list not sorted.\n")
+            }
+        }
+
+        last_addr = addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+        if(entry_ptr == NULL) {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed candidate entry not in cache?!?!?.")
+        } else if(!entry_ptr->is_dirty) {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not dirty?!?!?.")
+        } else if ( entry_ptr->is_protected ) {
+            /* For now at least, we can't deal with protected entries.
+             * If we encounter one, scream and die.  If it becomes an
+             * issue, we should be able to work around this. 
+             */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry is protected?!?!?.")
+        } else {
+            /* determine whether the entry is to be cleared or flushed,
+             * and mark it accordingly.  We will scan the protected and 
+             * pinned list shortly, and clear or flush according to these
+             * markings.  
+             */
+            if((i >= first_entry_to_flush) && (i <= last_entry_to_flush)) {
+                entries_to_flush++;
+                entry_ptr->flush_immediately = TRUE;
+            } /* end if */
+            else {
+                entries_to_clear++;
+                entry_ptr->clear_on_unprotect = TRUE;
+            } /* end else */
+        } /* end else */
+    } /* end for */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: num candidates/to clear/to flush = %d/%d/%d.\n", 
+              FUNC, mpi_rank, (int)num_candidates, (int)entries_to_clear,
+              (int)entries_to_flush);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+
+    /* We have now marked all the entries on the candidate list for 
+     * either flush or clear -- now scan the LRU and the pinned list
+     * for these entries and do the deed.
+     *
+     * Note that we are doing things in this round about manner so as
+     * to preserve the order of the LRU list to the best of our ability.
+     * If we don't do this, my experiments indicate that we will have a
+     * noticably poorer hit ratio as a result.
+     */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: scanning LRU list. len = %d.\n", FUNC, mpi_rank,
+              (int)(cache_ptr->LRU_list_len));
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    entries_examined = 0;
+    initial_list_len = cache_ptr->LRU_list_len;
+    entry_ptr = cache_ptr->LRU_tail_ptr;
+
+    while((entry_ptr != NULL) && (entries_examined <= initial_list_len) &&
+            ((entries_cleared + entries_flushed) < num_candidates)) {
+        if(entry_ptr->clear_on_unprotect) {
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_cleared++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+    HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank, 
+              (long long)clear_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+            if(H5C_flush_single_entry(f,
+                                      primary_dxpl_id,
+                                      secondary_dxpl_id,
+                                      clear_ptr->type,
+                                      clear_ptr->addr,
+                                      H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                      &first_flush,
+                                      TRUE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else if(entry_ptr->flush_immediately) {
+            entry_ptr->flush_immediately = FALSE;
+            flush_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_flushed++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+    HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank, 
+              (long long)flush_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+            if(H5C_flush_single_entry(f,
+                                      primary_dxpl_id,
+                                      secondary_dxpl_id,
+                                      flush_ptr->type,
+                                      flush_ptr->addr,
+                                      H5C__NO_FLAGS_SET,
+                                      &first_flush,
+                                      TRUE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else {
+            entry_ptr = entry_ptr->prev;
+        }
+
+        entries_examined++;
+    } /* end while */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: entries examined/cleared/flushed = %d/%d/%d.\n", 
+              FUNC, mpi_rank, entries_examined, 
+              entries_cleared, entries_flushed);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    /* It is also possible that some of the cleared entries are on the
+     * pinned list.  Must scan that also.
+     */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: scanning pinned entry list. len = %d\n", 
+             FUNC, mpi_rank, (int)(cache_ptr->pel_len));
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    entry_ptr = cache_ptr->pel_head_ptr;
+    while((entry_ptr != NULL) &&
+            ((entries_cleared + entries_flushed) < num_candidates)) {
+        if(entry_ptr->clear_on_unprotect) {
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->next;
+            entries_cleared++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+            HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank, 
+                      (long long)clear_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+            if(H5C_flush_single_entry(f,
+                                      primary_dxpl_id,
+                                      secondary_dxpl_id,
+                                      clear_ptr->type,
+                                      clear_ptr->addr,
+                                      H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                      &first_flush,
+                                      TRUE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else if(entry_ptr->flush_immediately) {
+            entry_ptr->flush_immediately = FALSE;
+            flush_ptr = entry_ptr;
+            entry_ptr = entry_ptr->next;
+            entries_flushed++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+            HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank, 
+                      (long long)flush_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+            if(H5C_flush_single_entry(f,
+                                      primary_dxpl_id,
+                                      secondary_dxpl_id,
+                                      flush_ptr->type,
+                                      flush_ptr->addr,
+                                      H5C__NO_FLAGS_SET,
+                                      &first_flush,
+                                      TRUE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else {
+            entry_ptr = entry_ptr->next;
+        }
+    } /* end while */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, 
+              "%s:%d: pel entries examined/cleared/flushed = %d/%d/%d.\n", 
+              FUNC, mpi_rank, entries_examined, 
+              entries_cleared, entries_flushed);
+    HDfprintf(stdout, "%s:%d: done.\n", FUNC, mpi_rank);
+
+    HDfsync(stdout);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    if((entries_flushed != entries_to_flush) || (entries_cleared != entries_to_clear))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry count mismatch.")
+
+done:
+    if(candidate_assignment_table != NULL)
+        candidate_assignment_table = (int *)H5MM_xfree((void *)candidate_assignment_table);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_apply_candidate_list() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_construct_candidate_list__clean_cache
+ *
+ * Purpose:     Construct the list of entries that should be flushed to 
+ *		clean all entries in the cache.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
+{
+    size_t              space_needed;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* As a sanity check, set space needed to the size of the skip list.
+     * This should be the sum total of the sizes of all the dirty entries
+     * in the metadata cache.
+     */
+    space_needed = cache_ptr->slist_size;
+
+    /* Recall that while we shouldn't have any protected entries at this
+     * point, it is possible that some dirty entries may reside on the
+     * pinned list at this point.
+     */
+    HDassert( cache_ptr->slist_size <= 
+              (cache_ptr->dLRU_list_size + cache_ptr->pel_size) );
+    HDassert( cache_ptr->slist_len  <= 
+              (cache_ptr->dLRU_list_len + cache_ptr->pel_len) );
+
+    if(space_needed > 0) { /* we have work to do */
+        H5C_cache_entry_t *entry_ptr;
+        int     nominated_entries_count = 0;
+        size_t  nominated_entries_size = 0;
+        haddr_t	nominated_addr;
+
+        HDassert( cache_ptr->slist_len > 0 );
+
+        /* Scan the dirty LRU list from tail forward and nominate sufficient
+         * entries to free up the necessary space. 
+         */
+        entry_ptr = cache_ptr->dLRU_tail_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL)) {
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( entry_ptr->ro_ref_count == 0 );
+            HDassert( entry_ptr->is_dirty );
+            HDassert( entry_ptr->in_slist );
+
+            nominated_addr = entry_ptr->addr;
+            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(1).")
+
+            nominated_entries_size += entry_ptr->size;
+            nominated_entries_count++;
+            entry_ptr = entry_ptr->aux_prev;
+        } /* end while */
+        HDassert( entry_ptr == NULL );
+
+        /* it is possible that there are some dirty entries on the 
+         * protected entry list as well -- scan it too if necessary
+         */
+        entry_ptr = cache_ptr->pel_head_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL)) {
+            if(entry_ptr->is_dirty) {
+                HDassert( ! (entry_ptr->is_protected) );
+                HDassert( ! (entry_ptr->is_read_only) );
+                HDassert( entry_ptr->ro_ref_count == 0 );
+                HDassert( entry_ptr->is_dirty );
+                HDassert( entry_ptr->in_slist );
+
+                nominated_addr = entry_ptr->addr;
+                if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(2).")
+
+                nominated_entries_size += entry_ptr->size;
+                nominated_entries_count++;
+            } /* end if */
+
+            entry_ptr = entry_ptr->next;
+        } /* end while */
+
+        HDassert( nominated_entries_count == cache_ptr->slist_len );
+        HDassert( nominated_entries_size == space_needed );
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_construct_candidate_list__clean_cache() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_construct_candidate_list__min_clean
+ *
+ * Purpose:     Construct the list of entries that should be flushed to 
+ *		get the cache back within its min clean constraints.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr)
+{
+    size_t              space_needed = 0;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* compute the number of bytes (if any) that must be flushed to get the 
+     * cache back within its min clean constraints.
+     */
+    if(cache_ptr->max_cache_size > cache_ptr->index_size) {
+        if(((cache_ptr->max_cache_size - cache_ptr->index_size) +
+               cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size)
+            space_needed = 0;
+        else
+            space_needed = cache_ptr->min_clean_size -
+                ((cache_ptr->max_cache_size - cache_ptr->index_size) +
+                 cache_ptr->cLRU_list_size);
+    } /* end if */
+    else {
+        if(cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size)
+           space_needed = 0;
+        else
+            space_needed = cache_ptr->min_clean_size -
+                           cache_ptr->cLRU_list_size;
+    } /* end else */
+
+    if(space_needed > 0) { /* we have work to do */
+        H5C_cache_entry_t *entry_ptr;
+        int    nominated_entries_count = 0;
+        size_t nominated_entries_size = 0;
+
+        HDassert( cache_ptr->slist_len > 0 );
+
+        /* Scan the dirty LRU list from tail forward and nominate sufficient
+         * entries to free up the necessary space. 
+         */
+        entry_ptr = cache_ptr->dLRU_tail_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL)) {
+            haddr_t		nominated_addr;
+
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( entry_ptr->ro_ref_count == 0 );
+            HDassert( entry_ptr->is_dirty );
+            HDassert( entry_ptr->in_slist );
+
+            nominated_addr = entry_ptr->addr;
+            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed.")
+
+            nominated_entries_size += entry_ptr->size;
+            nominated_entries_count++;
+            entry_ptr = entry_ptr->aux_prev;
+        } /* end while */
+        HDassert( nominated_entries_count <= cache_ptr->slist_len );
+        HDassert( nominated_entries_size >= space_needed );
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_construct_candidate_list__min_clean() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_create
+ *
+ * Purpose:     Allocate, initialize, and return the address of a new
+ *		instance of H5C_t.
+ *
+ *		In general, the max_cache_size parameter must be positive,
+ *		and the min_clean_size parameter must lie in the closed
+ *		interval [0, max_cache_size].
+ *
+ *		The check_write_permitted parameter must either be NULL,
+ *		or point to a function of type H5C_write_permitted_func_t.
+ *		If it is NULL, the cache will use the write_permitted
+ *		flag to determine whether writes are permitted.
+ *
+ * Return:      Success:        Pointer to the new instance.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+H5C_t *
+H5C_create(size_t		      max_cache_size,
+           size_t		      min_clean_size,
+           int			      max_type_id,
+           const char *		      (* type_name_table_ptr),
+           H5C_write_permitted_func_t check_write_permitted,
+           hbool_t		      write_permitted,
+           H5C_log_flush_func_t       log_flush,
+           void *                     aux_ptr)
+{
+    int i;
+    H5C_t * cache_ptr = NULL;
+    H5C_t * ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert( max_cache_size >= H5C__MIN_MAX_CACHE_SIZE );
+    HDassert( max_cache_size <= H5C__MAX_MAX_CACHE_SIZE );
+    HDassert( min_clean_size <= max_cache_size );
+
+    HDassert( max_type_id >= 0 );
+    HDassert( max_type_id < H5C__MAX_NUM_TYPE_IDS );
+    HDassert( type_name_table_ptr );
+
+    HDassert( ( write_permitted == TRUE ) || ( write_permitted == FALSE ) );
+
+    for ( i = 0; i <= max_type_id; i++ ) {
+
+        HDassert( (type_name_table_ptr)[i] );
+        HDassert( HDstrlen(( type_name_table_ptr)[i]) > 0 );
+    }
+
+    if ( NULL == (cache_ptr = H5FL_CALLOC(H5C_t)) ) {
+
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
+                    "memory allocation failed")
+    }
+
+    if ( (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list.")
+    }
+
+    /* If we get this far, we should succeed.  Go ahead and initialize all
+     * the fields.
+     */
+
+    cache_ptr->magic 				= H5C__H5C_T_MAGIC;
+
+    cache_ptr->flush_in_progress		= FALSE;
+
+    cache_ptr->trace_file_ptr			= NULL;
+
+    cache_ptr->aux_ptr				= aux_ptr;
+
+    cache_ptr->max_type_id			= max_type_id;
+
+    cache_ptr->type_name_table_ptr		= type_name_table_ptr;
+
+    cache_ptr->max_cache_size			= max_cache_size;
+    cache_ptr->min_clean_size			= min_clean_size;
+
+    cache_ptr->check_write_permitted		= check_write_permitted;
+    cache_ptr->write_permitted			= write_permitted;
+
+    cache_ptr->log_flush			= log_flush;
+
+    cache_ptr->evictions_enabled		= TRUE;
+
+    cache_ptr->index_len			= 0;
+    cache_ptr->index_size			= (size_t)0;
+    cache_ptr->clean_index_size			= (size_t)0;
+    cache_ptr->dirty_index_size			= (size_t)0;
+
+    cache_ptr->slist_len			= 0;
+    cache_ptr->slist_size			= (size_t)0;
+
+#if H5C_DO_SANITY_CHECKS
+    cache_ptr->slist_len_increase		= 0;
+    cache_ptr->slist_size_increase		= 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
+    {
+        (cache_ptr->index)[i] = NULL;
+    }
+
+    cache_ptr->pl_len				= 0;
+    cache_ptr->pl_size				= (size_t)0;
+    cache_ptr->pl_head_ptr			= NULL;
+    cache_ptr->pl_tail_ptr			= NULL;
+
+    cache_ptr->pel_len				= 0;
+    cache_ptr->pel_size				= (size_t)0;
+    cache_ptr->pel_head_ptr			= NULL;
+    cache_ptr->pel_tail_ptr			= NULL;
+
+    cache_ptr->LRU_list_len			= 0;
+    cache_ptr->LRU_list_size			= (size_t)0;
+    cache_ptr->LRU_head_ptr			= NULL;
+    cache_ptr->LRU_tail_ptr			= NULL;
+
+    cache_ptr->cLRU_list_len			= 0;
+    cache_ptr->cLRU_list_size			= (size_t)0;
+    cache_ptr->cLRU_head_ptr			= NULL;
+    cache_ptr->cLRU_tail_ptr			= NULL;
+
+    cache_ptr->dLRU_list_len			= 0;
+    cache_ptr->dLRU_list_size			= (size_t)0;
+    cache_ptr->dLRU_head_ptr			= NULL;
+    cache_ptr->dLRU_tail_ptr			= NULL;
+
+    cache_ptr->size_increase_possible		= FALSE;
+    cache_ptr->flash_size_increase_possible     = FALSE;
+    cache_ptr->flash_size_increase_threshold    = 0;
+    cache_ptr->size_decrease_possible		= FALSE;
+    cache_ptr->resize_enabled			= FALSE;
+    cache_ptr->cache_full			= FALSE;
+    cache_ptr->size_decreased			= FALSE;
+
+    (cache_ptr->resize_ctl).version		= H5C__CURR_AUTO_SIZE_CTL_VER;
+    (cache_ptr->resize_ctl).rpt_fcn		= NULL;
+    (cache_ptr->resize_ctl).set_initial_size	= FALSE;
+    (cache_ptr->resize_ctl).initial_size	= H5C__DEF_AR_INIT_SIZE;
+    (cache_ptr->resize_ctl).min_clean_fraction	= H5C__DEF_AR_MIN_CLEAN_FRAC;
+    (cache_ptr->resize_ctl).max_size		= H5C__DEF_AR_MAX_SIZE;
+    (cache_ptr->resize_ctl).min_size		= H5C__DEF_AR_MIN_SIZE;
+    (cache_ptr->resize_ctl).epoch_length	= H5C__DEF_AR_EPOCH_LENGTH;
+
+    (cache_ptr->resize_ctl).incr_mode		= H5C_incr__off;
+    (cache_ptr->resize_ctl).lower_hr_threshold	= H5C__DEF_AR_LOWER_THRESHHOLD;
+    (cache_ptr->resize_ctl).increment	        = H5C__DEF_AR_INCREMENT;
+    (cache_ptr->resize_ctl).apply_max_increment	= TRUE;
+    (cache_ptr->resize_ctl).max_increment	= H5C__DEF_AR_MAX_INCREMENT;
+
+    (cache_ptr->resize_ctl).flash_incr_mode     = H5C_flash_incr__off;
+    (cache_ptr->resize_ctl).flash_multiple      = 1.0f;
+    (cache_ptr->resize_ctl).flash_threshold     = 0.25f;
+
+    (cache_ptr->resize_ctl).decr_mode		= H5C_decr__off;
+    (cache_ptr->resize_ctl).upper_hr_threshold	= H5C__DEF_AR_UPPER_THRESHHOLD;
+    (cache_ptr->resize_ctl).decrement	        = H5C__DEF_AR_DECREMENT;
+    (cache_ptr->resize_ctl).apply_max_decrement	= TRUE;
+    (cache_ptr->resize_ctl).max_decrement	= H5C__DEF_AR_MAX_DECREMENT;
+    (cache_ptr->resize_ctl).epochs_before_eviction = H5C__DEF_AR_EPCHS_B4_EVICT;
+    (cache_ptr->resize_ctl).apply_empty_reserve = TRUE;
+    (cache_ptr->resize_ctl).empty_reserve	= H5C__DEF_AR_EMPTY_RESERVE;
+
+    cache_ptr->epoch_markers_active		= 0;
+
+    /* no need to initialize the ring buffer itself */
+    cache_ptr->epoch_marker_ringbuf_first	= 1;
+    cache_ptr->epoch_marker_ringbuf_last	= 0;
+    cache_ptr->epoch_marker_ringbuf_size	= 0;
+
+    for ( i = 0; i < H5C__MAX_EPOCH_MARKERS; i++ )
+    {
+        (cache_ptr->epoch_marker_active)[i]		 = FALSE;
+#ifndef NDEBUG
+        ((cache_ptr->epoch_markers)[i]).magic		 =
+					       H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
+        ((cache_ptr->epoch_markers)[i]).addr		 = (haddr_t)i;
+        ((cache_ptr->epoch_markers)[i]).size		 = (size_t)0;
+        ((cache_ptr->epoch_markers)[i]).type		 = &epoch_marker_class;
+        ((cache_ptr->epoch_markers)[i]).is_dirty	 = FALSE;
+        ((cache_ptr->epoch_markers)[i]).dirtied		 = FALSE;
+        ((cache_ptr->epoch_markers)[i]).is_protected	 = FALSE;
+	((cache_ptr->epoch_markers)[i]).is_read_only	 = FALSE;
+	((cache_ptr->epoch_markers)[i]).ro_ref_count	 = 0;
+        ((cache_ptr->epoch_markers)[i]).is_pinned	 = FALSE;
+        ((cache_ptr->epoch_markers)[i]).in_slist	 = FALSE;
+        ((cache_ptr->epoch_markers)[i]).ht_next		 = NULL;
+        ((cache_ptr->epoch_markers)[i]).ht_prev		 = NULL;
+        ((cache_ptr->epoch_markers)[i]).next		 = NULL;
+        ((cache_ptr->epoch_markers)[i]).prev		 = NULL;
+        ((cache_ptr->epoch_markers)[i]).aux_next	 = NULL;
+        ((cache_ptr->epoch_markers)[i]).aux_prev	 = NULL;
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+        ((cache_ptr->epoch_markers)[i]).accesses	 = 0;
+        ((cache_ptr->epoch_markers)[i]).clears		 = 0;
+        ((cache_ptr->epoch_markers)[i]).flushes		 = 0;
+        ((cache_ptr->epoch_markers)[i]).pins		 = 0;
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+    }
+
+    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+        /* this should be impossible... */
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
+                    "H5C_reset_cache_hit_rate_stats failed.")
+    }
+
+    H5C_stats__reset(cache_ptr);
+
+    cache_ptr->prefix[0]			= '\0';  /* empty string */
+
+    /* Set return value */
+    ret_value = cache_ptr;
+
+done:
+
+    if ( ret_value == 0 ) {
+
+        if ( cache_ptr != NULL ) {
+
+            if ( cache_ptr->slist_ptr != NULL )
+                H5SL_close(cache_ptr->slist_ptr);
+
+            cache_ptr->magic = 0;
+            cache_ptr = H5FL_FREE(H5C_t, cache_ptr);
+
+        } /* end if */
+
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_def_auto_resize_rpt_fcn
+ *
+ * Purpose:     Print results of a automatic cache resize.
+ *
+ *		This function should only be used where HDprintf() behaves
+ *		well -- i.e. not on Windows.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *		10/27/04
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
+#ifndef NDEBUG
+                            int32_t version,
+#else /* NDEBUG */
+                            int32_t H5_ATTR_UNUSED version,
+#endif /* NDEBUG */
+                            double hit_rate,
+                            enum H5C_resize_status status,
+                            size_t old_max_cache_size,
+                            size_t new_max_cache_size,
+                            size_t old_min_clean_size,
+                            size_t new_min_clean_size)
+{
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( version == H5C__CURR_AUTO_RESIZE_RPT_FCN_VER );
+
+    switch ( status )
+    {
+        case in_spec:
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- no change. (hit rate = %lf)\n",
+                      cache_ptr->prefix, hit_rate);
+            break;
+
+        case increase:
+            HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold );
+            HDassert( old_max_cache_size < new_max_cache_size );
+
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n",
+                      cache_ptr->prefix, hit_rate,
+                      (cache_ptr->resize_ctl).lower_hr_threshold);
+
+            HDfprintf(stdout,
+                    "%s	cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n",
+                    cache_ptr->prefix,
+                    old_max_cache_size,
+                    old_min_clean_size,
+                    new_max_cache_size,
+                    new_min_clean_size);
+            break;
+
+        case flash_increase:
+            HDassert( old_max_cache_size < new_max_cache_size );
+
+            HDfprintf(stdout,
+                    "%sflash cache resize(%d) -- size threshold = %Zu.\n",
+                    cache_ptr->prefix,
+                    (int)((cache_ptr->resize_ctl).flash_incr_mode),
+                    cache_ptr->flash_size_increase_threshold);
+
+            HDfprintf(stdout,
+                  "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n",
+                   cache_ptr->prefix,
+                   old_max_cache_size,
+                   old_min_clean_size,
+                   new_max_cache_size,
+                   new_min_clean_size);
+                break;
+
+        case decrease:
+            HDassert( old_max_cache_size > new_max_cache_size );
+
+            switch ( (cache_ptr->resize_ctl).decr_mode )
+            {
+                case H5C_decr__off:
+                    HDfprintf(stdout,
+                              "%sAuto cache resize -- decrease off.  HR = %lf\n",
+                              cache_ptr->prefix, hit_rate);
+                    break;
+
+                case H5C_decr__threshold:
+                    HDassert( hit_rate >
+                              (cache_ptr->resize_ctl).upper_hr_threshold );
+
+                    HDfprintf(stdout,
+                              "%sAuto cache resize -- decrease by threshold.  HR = %lf > %6.5lf\n",
+                              cache_ptr->prefix, hit_rate,
+                              (cache_ptr->resize_ctl).upper_hr_threshold);
+
+                    HDfprintf(stdout, "%sout of bounds high (%6.5lf).\n",
+                              cache_ptr->prefix,
+                              (cache_ptr->resize_ctl).upper_hr_threshold);
+                    break;
+
+                case H5C_decr__age_out:
+                    HDfprintf(stdout,
+                              "%sAuto cache resize -- decrease by ageout.  HR = %lf\n",
+                              cache_ptr->prefix, hit_rate);
+                    break;
+
+                case H5C_decr__age_out_with_threshold:
+                    HDassert( hit_rate >
+                              (cache_ptr->resize_ctl).upper_hr_threshold );
+
+                    HDfprintf(stdout,
+                              "%sAuto cache resize -- decrease by ageout with threshold. HR = %lf > %6.5lf\n",
+                              cache_ptr->prefix, hit_rate,
+                              (cache_ptr->resize_ctl).upper_hr_threshold);
+                    break;
+
+                default:
+                    HDfprintf(stdout,
+                              "%sAuto cache resize -- decrease by unknown mode.  HR = %lf\n",
+                              cache_ptr->prefix, hit_rate);
+            }
+
+            HDfprintf(stdout,
+                      "%s	cache size decreased from (%Zu/%Zu) to (%Zu/%Zu).\n",
+                      cache_ptr->prefix,
+                      old_max_cache_size,
+                      old_min_clean_size,
+                      new_max_cache_size,
+                      new_min_clean_size);
+            break;
+
+        case at_max_size:
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n",
+                      cache_ptr->prefix, hit_rate,
+                      (cache_ptr->resize_ctl).lower_hr_threshold);
+            HDfprintf(stdout,
+                      "%s	cache already at maximum size so no change.\n",
+                      cache_ptr->prefix);
+            break;
+
+        case at_min_size:
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- hit rate (%lf) -- can't decrease.\n",
+                      cache_ptr->prefix, hit_rate);
+            HDfprintf(stdout, "%s	cache already at minimum size.\n",
+                      cache_ptr->prefix);
+            break;
+
+        case increase_disabled:
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- increase disabled -- HR = %lf.",
+                      cache_ptr->prefix, hit_rate);
+            break;
+
+        case decrease_disabled:
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- decrease disabled -- HR = %lf.\n",
+                      cache_ptr->prefix, hit_rate);
+            break;
+
+        case not_full:
+            HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold );
+
+            HDfprintf(stdout,
+                      "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n",
+                      cache_ptr->prefix, hit_rate,
+                      (cache_ptr->resize_ctl).lower_hr_threshold);
+            HDfprintf(stdout,
+                      "%s	cache not full so no increase in size.\n",
+                      cache_ptr->prefix);
+            break;
+
+        default:
+            HDfprintf(stdout, "%sAuto cache resize -- unknown status code.\n",
+                      cache_ptr->prefix);
+            break;
+    }
+
+    return;
+
+} /* H5C_def_auto_resize_rpt_fcn() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dest
+ *
+ * Purpose:     Flush all data to disk and destroy the cache.
+ *
+ *              This function fails if any object are protected since the
+ *              resulting file might not be consistent.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the destroy (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  This is useful in the metadata
+ *		cache, but may not be needed elsewhere.  If so, just use the
+ *		same dxpl_id for both parameters.
+ *
+ *		Note that *cache_ptr has been freed upon successful return.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *		6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_dest(H5F_t * f,
+         hid_t	 primary_dxpl_id,
+         hid_t	 secondary_dxpl_id)
+{
+    H5C_t * cache_ptr = f->shared->cache;
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Flush and invalidate all cache entries */
+    if(H5C_flush_invalidate_cache(f, primary_dxpl_id, secondary_dxpl_id,
+                H5C__NO_FLAGS_SET) < 0 )
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+
+    if(cache_ptr->slist_ptr != NULL) {
+        H5SL_close(cache_ptr->slist_ptr);
+        cache_ptr->slist_ptr = NULL;
+    } /* end if */
+
+    cache_ptr->magic = 0;
+
+    cache_ptr = H5FL_FREE(H5C_t, cache_ptr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_dest() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_expunge_entry
+ *
+ * Purpose:     Use this function to tell the cache to expunge an entry
+ * 		from the cache without writing it to disk even if it is
+ * 		dirty.  The entry may not be either pinned or protected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/29/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_expunge_entry(H5F_t *             f,
+                  hid_t               primary_dxpl_id,
+                  hid_t               secondary_dxpl_id,
+                  const H5C_class_t * type,
+                  haddr_t 	      addr,
+                  unsigned 	      flags)
+{
+    H5C_t *		cache_ptr;
+    herr_t		result;
+    hbool_t		first_flush = TRUE;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( type->clear );
+    HDassert( type->dest );
+    HDassert( H5F_addr_defined(addr) );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+    if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) {
+
+        /* the target doesn't exist in the cache, so we are done. */
+        HGOTO_DONE(SUCCEED)
+    }
+
+    HDassert( entry_ptr->addr == addr );
+    HDassert( entry_ptr->type == type );
+
+    if ( entry_ptr->is_protected ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
+		    "Target entry is protected.")
+    }
+
+    if ( entry_ptr->is_pinned ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
+		    "Target entry is pinned.")
+    }
+
+    /* Pass along 'free file space' flag to cache client */
+    entry_ptr->free_file_space_on_destroy = ( (flags & H5C__FREE_FILE_SPACE_FLAG) != 0 );
+
+    /* If we get this far, call H5C_flush_single_entry() with the
+     * H5C__FLUSH_INVALIDATE_FLAG and the H5C__FLUSH_CLEAR_ONLY_FLAG.
+     * This will clear the entry, and then delete it from the cache.
+     */
+    result = H5C_flush_single_entry(f,
+                                    primary_dxpl_id,
+                                    secondary_dxpl_id,
+                                    entry_ptr->type,
+                                    entry_ptr->addr,
+                                    H5C__FLUSH_INVALIDATE_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                    &first_flush,
+                                    TRUE);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
+                    "H5C_flush_single_entry() failed.")
+    }
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_expunge_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_cache
+ *
+ * Purpose:	Flush (and possibly destroy) the entries contained in the
+ *		specified cache.
+ *
+ *		If the cache contains protected entries, the function will
+ *		fail, as protected entries cannot be flushed.  However
+ *		all unprotected entries should be flushed before the
+ *		function returns failure.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the flush (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  This is useful in the metadata
+ *		cache, but may not be needed elsewhere.  If so, just use the
+ *		same dxpl_id for both parameters.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		a request to flush all items and something was protected.
+ *
+ * Programmer:  John Mainzer
+ *		6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_flush_cache(H5F_t *f, hid_t primary_dxpl_id, hid_t secondary_dxpl_id, unsigned flags)
+{
+    H5C_t * cache_ptr = f->shared->cache;
+    herr_t              status;
+    herr_t		ret_value = SUCCEED;
+    hbool_t             destroy;
+    hbool_t		flushed_entries_last_pass;
+    hbool_t		flush_marked_entries;
+    hbool_t		first_flush = TRUE;
+    hbool_t		ignore_protected;
+    hbool_t		tried_to_flush_protected_entry = FALSE;
+    int32_t		passes = 0;
+    int32_t		protected_entries = 0;
+    H5SL_node_t * 	node_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	next_entry_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    int64_t		flushed_entries_count;
+    size_t		flushed_entries_size;
+    int64_t		initial_slist_len;
+    size_t              initial_slist_size;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->slist_ptr );
+
+    ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 );
+
+    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
+
+    /* note that flush_marked_entries is set to FALSE if destroy is TRUE */
+    flush_marked_entries = ( ( (flags & H5C__FLUSH_MARKED_ENTRIES_FLAG) != 0 )
+                             &&
+                             ( ! destroy )
+                           );
+
+    HDassert( ! ( destroy && ignore_protected ) );
+
+    HDassert( ! ( cache_ptr->flush_in_progress ) );
+
+    cache_ptr->flush_in_progress = TRUE;
+
+    if ( destroy ) {
+
+        status = H5C_flush_invalidate_cache(f,
+			                    primary_dxpl_id,
+					    secondary_dxpl_id,
+					    flags);
+
+        if ( status < 0 ) {
+
+            /* This shouldn't happen -- if it does, we are toast so
+             * just scream and die.
+             */
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+			"flush invalidate failed.")
+        }
+    } else {
+	/* When we are only flushing marked entries, the slist will usually
+	 * still contain entries when we have flushed everything we should.
+	 * Thus we track whether we have flushed any entries in the last
+	 * pass, and terminate if we haven't.
+	 */
+
+	flushed_entries_last_pass = TRUE;
+
+        while ( ( passes < H5C__MAX_PASSES_ON_FLUSH ) &&
+		( cache_ptr->slist_len != 0 ) &&
+		( protected_entries == 0 ) &&
+		( flushed_entries_last_pass ) )
+	{
+	    flushed_entries_last_pass = FALSE;
+            node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+            if ( node_ptr != NULL ) {
+
+                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+                if ( next_entry_ptr == NULL ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		                "next_entry_ptr == NULL 1 ?!?!");
+                }
+#ifndef NDEBUG
+		HDassert( next_entry_ptr->magic ==
+                          H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+	        HDassert( next_entry_ptr->is_dirty );
+                HDassert( next_entry_ptr->in_slist );
+
+            } else {
+
+                next_entry_ptr = NULL;
+
+            }
+
+	    HDassert( node_ptr != NULL );
+
+#if H5C_DO_SANITY_CHECKS
+	    /* For sanity checking, try to verify that the skip list has
+	     * the expected size and number of entries at the end of each
+	     * internal while loop (see below).
+	     *
+	     * Doing this get a bit tricky, as depending on flags, we may
+	     * or may not flush all the entries in the slist.
+	     *
+	     * To make things more entertaining, with the advent of the
+	     * fractal heap, the entry flush callback can cause entries
+	     * to be dirtied, resized, and/or moved.
+	     *
+	     * To deal with this, we first make note of the initial
+	     * skip list length and size:
+	     */
+            initial_slist_len = cache_ptr->slist_len;
+            initial_slist_size = cache_ptr->slist_size;
+
+	    /* We then zero counters that we use to track the number
+	     * and total size of entries flushed:
+	     */
+            flushed_entries_count = 0;
+            flushed_entries_size = 0;
+
+	    /* As mentioned above, there is the possibility that
+	     * entries will be dirtied, resized, and/or flushed during
+	     * our pass through the skip list.  To capture the number
+	     * of entries added, and the skip list size delta,
+	     * zero the slist_len_increase and slist_size_increase of
+	     * the cache's instance of H5C_t.  These fields will be
+	     * updated elsewhere to account for slist insertions and/or
+	     * dirty entry size changes.
+	     */
+	    cache_ptr->slist_len_increase = 0;
+	    cache_ptr->slist_size_increase = 0;
+
+	    /* at the end of the loop, use these values to compute the
+	     * expected slist length and size and compare this with the
+	     * value recorded in the cache's instance of H5C_t.
+	     */
+#endif /* H5C_DO_SANITY_CHECKS */
+
+	    while ( node_ptr != NULL )
+	    {
+                entry_ptr = next_entry_ptr;
+
+                /* With the advent of the fractal heap, it is possible
+		 * that the flush callback will dirty and/or resize
+		 * other entries in the cache.  In particular, while
+		 * Quincey has promised me that this will never happen,
+		 * it is possible that the flush callback for an
+		 * entry may protect an entry that is not in the cache,
+		 * perhaps causing the cache to flush and possibly
+		 * evict the entry associated with node_ptr to make
+		 * space for the new entry.
+		 *
+		 * Thus we do a bit of extra sanity checking on entry_ptr,
+		 * and break out of this scan of the skip list if we
+		 * detect minor problems.  We have a bit of leaway on the
+		 * number of passes though the skip list, so this shouldn't
+		 * be an issue in the flush in and of itself, as it should
+		 * be all but impossible for this to happen more than once
+		 * in any flush.
+		 *
+		 * Observe that that breaking out of the scan early
+		 * shouldn't break the sanity checks just after the end
+		 * of this while loop.
+		 *
+		 * If an entry has merely been marked clean and removed from
+		 * the s-list, we simply break out of the scan.
+		 *
+		 * If the entry has been evicted, we flag an error and
+		 * exit.
+		 */
+#ifndef NDEBUG
+		if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                "entry_ptr->magic invalid ?!?!");
+
+	        } else
+#endif /* NDEBUG */
+		if ( ( ! entry_ptr->is_dirty ) ||
+                     ( ! entry_ptr->in_slist ) ) {
+
+                    /* the s-list has been modified out from under us.
+                     * set node_ptr to NULL and break out of the loop.
+                     */
+                    node_ptr = NULL;
+                    break;
+                }
+
+                /* increment node pointer now, before we delete its target
+                 * from the slist.
+                 */
+                node_ptr = H5SL_next(node_ptr);
+
+                if ( node_ptr != NULL ) {
+                    next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+                    if ( next_entry_ptr == NULL ) {
+                        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                    "next_entry_ptr == NULL 2 ?!?!");
+		    }
+#ifndef NDEBUG
+		    HDassert( next_entry_ptr->magic ==
+                              H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+                    HDassert( next_entry_ptr->is_dirty );
+                    HDassert( next_entry_ptr->in_slist );
+                } else {
+                    next_entry_ptr = NULL;
+                }
+
+                HDassert( entry_ptr != NULL );
+                HDassert( entry_ptr->in_slist );
+
+                if ( ( ! flush_marked_entries ) ||
+                     ( entry_ptr->flush_marker ) ) {
+
+                    if ( entry_ptr->is_protected ) {
+
+                        /* we probably have major problems -- but lets flush
+                         * everything we can before we decide whether to flag
+                         * an error.
+                         */
+                        tried_to_flush_protected_entry = TRUE;
+	                protected_entries++;
+
+                    } else if ( entry_ptr->is_pinned ) {
+			/* Test to see if we are can flush the entry now.
+			 * If we can, go ahead and flush.  Note that we
+			 * aren't trying to do a destroy here, so that
+			 * is not an issue.
+			 */
+                        if ( TRUE ) { /* When we get to multithreaded cache,
+                                       * we will need either locking code,
+                                       * and/or a test to see if the entry
+                                       * is in flushable condition here.
+                                       */
+#if H5C_DO_SANITY_CHECKS
+                            flushed_entries_count++;
+                            flushed_entries_size += entry_ptr->size;
+#endif /* H5C_DO_SANITY_CHECKS */
+                            status = H5C_flush_single_entry(f,
+                                                            primary_dxpl_id,
+                                                            secondary_dxpl_id,
+                                                            NULL,
+                                                            entry_ptr->addr,
+                                                            flags,
+                                                            &first_flush,
+                                                            FALSE);
+                            if ( status < 0 ) {
+
+                                /* This shouldn't happen -- if it does, we are
+			         * toast so just scream and die.
+                                 */
+                                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                            "dirty pinned entry flush failed.")
+                            }
+			    flushed_entries_last_pass = TRUE;
+			}
+                    } else {
+#if H5C_DO_SANITY_CHECKS
+                        flushed_entries_count++;
+			flushed_entries_size += entry_ptr->size;
+#endif /* H5C_DO_SANITY_CHECKS */
+                        status = H5C_flush_single_entry(f,
+                                                        primary_dxpl_id,
+                                                        secondary_dxpl_id,
+                                                        NULL,
+                                                        entry_ptr->addr,
+                                                        flags,
+                                                        &first_flush,
+                                                        FALSE);
+                        if ( status < 0 ) {
+
+                            /* This shouldn't happen -- if it does, we are
+			     * toast so just scream and die.
+                             */
+                            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                        "Can't flush entry.")
+                        }
+			flushed_entries_last_pass = TRUE;
+                    }
+                }
+            } /* while ( node_ptr != NULL ) */
+
+#if H5C_DO_SANITY_CHECKS
+            /* Verify that the slist size and length are as expected. */
+
+	    HDassert( (initial_slist_len + cache_ptr->slist_len_increase -
+                       flushed_entries_count) == cache_ptr->slist_len );
+	    HDassert( (initial_slist_size + cache_ptr->slist_size_increase -
+		       flushed_entries_size) == cache_ptr->slist_size );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+	    passes++;
+
+	} /* while */
+
+        HDassert( protected_entries <= cache_ptr->pl_len );
+
+        if ( ( ( cache_ptr->pl_len > 0 ) && ( !ignore_protected ) )
+             ||
+             ( tried_to_flush_protected_entry ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+		        "cache has protected items")
+        }
+
+	if ( ( cache_ptr->slist_len != 0 ) &&
+	     ( passes >= H5C__MAX_PASSES_ON_FLUSH ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+		        "flush pass limit exceeded.")
+	}
+
+#if H5C_DO_SANITY_CHECKS
+        if ( ! flush_marked_entries ) {
+
+            HDassert( cache_ptr->slist_len == 0 );
+            HDassert( cache_ptr->slist_size == 0 );
+        }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    }
+
+done:
+
+    cache_ptr->flush_in_progress = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_flush_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_to_min_clean
+ *
+ * Purpose:	Flush dirty entries until the caches min clean size is
+ *		attained.
+ *
+ *		This function is used in the implementation of the
+ *		metadata cache in PHDF5.  To avoid "messages from the
+ *		future", the cache on process 0 can't be allowed to
+ *		flush entries until the other processes have reached
+ *		the same point in the calculation.  If this constraint
+ *		is not met, it is possible that the other processes will
+ *		read metadata generated at a future point in the
+ *		computation.
+ *
+ *
+ * Return:      Non-negative on success/Negative on failure or if
+ *		write is not permitted.
+ *
+ * Programmer:  John Mainzer
+ *		9/16/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_flush_to_min_clean(H5F_t * f,
+                       hid_t   primary_dxpl_id,
+                       hid_t   secondary_dxpl_id)
+{
+    H5C_t *            cache_ptr;
+    herr_t      	result;
+    hbool_t		first_flush = TRUE;
+    hbool_t		write_permitted;
+#if 0 /* modified code -- commented out for now */
+    int			i;
+    int			flushed_entries_count = 0;
+    size_t		flushed_entries_size = 0;
+    size_t		space_needed = 0;
+    haddr_t	      * flushed_entries_list = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+#endif /* JRM */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if ( cache_ptr->check_write_permitted != NULL ) {
+
+        result = (cache_ptr->check_write_permitted)(f,
+                                                    primary_dxpl_id,
+                                                    &write_permitted);
+
+        if ( result < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "Can't get write_permitted")
+        }
+    } else {
+
+        write_permitted = cache_ptr->write_permitted;
+    }
+
+    if ( ! write_permitted ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "cache write is not permitted!?!\n");
+    }
+#if 1 /* original code */
+    result = H5C_make_space_in_cache(f,
+                                     primary_dxpl_id,
+                                     secondary_dxpl_id,
+                                     (size_t)0,
+                                     write_permitted,
+                                     &first_flush);
+
+    if ( result < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_make_space_in_cache failed.")
+    }
+#else /* modified code -- commented out for now */
+    if ( cache_ptr->max_cache_size > cache_ptr->index_size ) {
+
+        if ( ((cache_ptr->max_cache_size - cache_ptr->index_size) +
+               cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size ) {
+
+            space_needed = 0;
+
+        } else {
+
+            space_needed = cache_ptr->min_clean_size -
+                ((cache_ptr->max_cache_size - cache_ptr->index_size) +
+                 cache_ptr->cLRU_list_size);
+        }
+    } else {
+
+        if ( cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size ) {
+
+           space_needed = 0;
+
+        } else {
+
+            space_needed = cache_ptr->min_clean_size -
+                           cache_ptr->cLRU_list_size;
+        }
+    }
+
+    if ( space_needed > 0 ) { /* we have work to do */
+
+        HDassert( cache_ptr->slist_len > 0 );
+
+        /* allocate an array to keep a list of the entries that we
+         * mark for flush.  We need this list to touch up the LRU
+         * list after the flush.
+         */
+        flushed_entries_list = (haddr_t *)H5MM_malloc(sizeof(haddr_t) *
+                                              (size_t)(cache_ptr->slist_len));
+
+        if ( flushed_entries_list == NULL ) {
+
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+                        "memory allocation failed for flushed entries list")
+        }
+
+        /* Scan the dirty LRU list from tail forward and mark sufficient
+         * entries to free up the necessary space.  Keep a list of the
+         * entries marked in the order in which they are encountered.
+         */
+        entry_ptr = cache_ptr->dLRU_tail_ptr;
+
+        while ( ( flushed_entries_size < space_needed ) &&
+                ( flushed_entries_count < cache_ptr->slist_len ) &&
+                ( entry_ptr != NULL ) )
+        {
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( entry_ptr->ro_ref_count == 0 );
+            HDassert( entry_ptr->is_dirty );
+            HDassert( entry_ptr->in_slist );
+
+            entry_ptr->flush_marker = TRUE;
+            flushed_entries_size += entry_ptr->size;
+            flushed_entries_list[flushed_entries_count] = entry_ptr->addr;
+            flushed_entries_count++;
+            entry_ptr = entry_ptr->aux_prev;
+        }
+
+        HDassert( flushed_entries_count <= cache_ptr->slist_len );
+        HDassert( flushed_entries_size >= space_needed );
+
+
+        /* Flush the marked entries */
+	result = H5C_flush_cache(f, primary_dxpl_id, secondary_dxpl_id,
+                                 H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_IGNORE_PROTECTED_FLAG);
+
+        if ( result < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_cache failed.")
+        }
+
+        /* Now touch up the LRU list so as to place the flushed entries in
+         * the order they they would be in if we had flushed them in the
+         * order we encountered them in.
+         */
+
+        i = 0;
+        while ( i < flushed_entries_count )
+        {
+            H5C__SEARCH_INDEX_NO_STATS(cache_ptr, flushed_entries_list[i], \
+                                       entry_ptr, FAIL)
+
+	    /* At present, the above search must always succeed.  However,
+             * that may change.  Write the code so we need only remove the
+             * following assert in that event.
+             */
+            HDassert( entry_ptr != NULL );
+            H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, FAIL)
+            i++;
+        }
+    } /* if ( space_needed > 0 ) */
+#endif /* end modified code -- commented out for now */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_to_min_clean() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_auto_resize_config
+ *
+ * Purpose:	Copy the current configuration of the cache automatic
+ *		re-sizing function into the instance of H5C_auto_size_ctl_t
+ *		pointed to by config_ptr.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/8/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr,
+                                 H5C_auto_size_ctl_t *config_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( config_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad config_ptr on entry.")
+    }
+
+    *config_ptr = cache_ptr->resize_ctl;
+
+    config_ptr->set_initial_size = FALSE;
+    config_ptr->initial_size = cache_ptr->max_cache_size;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_cache_auto_resize_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_size
+ *
+ * Purpose:	Return the cache maximum size, the minimum clean size, the
+ *		current size, and the current number of entries in
+ *              *max_size_ptr, *min_clean_size_ptr, *cur_size_ptr, and
+ *		*cur_num_entries_ptr respectively.  If any of these
+ *		parameters are NULL, skip that value.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/8/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_cache_size(H5C_t * cache_ptr,
+                   size_t * max_size_ptr,
+                   size_t * min_clean_size_ptr,
+                   size_t * cur_size_ptr,
+                   int32_t * cur_num_entries_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( max_size_ptr != NULL ) {
+
+        *max_size_ptr = cache_ptr->max_cache_size;
+    }
+
+    if ( min_clean_size_ptr != NULL ) {
+
+        *min_clean_size_ptr = cache_ptr->min_clean_size;
+    }
+
+    if ( cur_size_ptr != NULL ) {
+
+        *cur_size_ptr = cache_ptr->index_size;
+    }
+
+    if ( cur_num_entries_ptr != NULL ) {
+
+        *cur_num_entries_ptr = cache_ptr->index_len;
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_hit_rate
+ *
+ * Purpose:	Compute and return the current cache hit rate in
+ *              *hit_rate_ptr.  If there have been no accesses since the
+ *              last time the cache hit rate stats were reset, set
+ *		*hit_rate_ptr to 0.0.  On error, *hit_rate_ptr is
+ *		undefined.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/7/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_cache_hit_rate(H5C_t * cache_ptr,
+                       double * hit_rate_ptr)
+
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( hit_rate_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad hit_rate_ptr on entry.")
+    }
+
+    HDassert( cache_ptr->cache_hits >= 0 );
+    HDassert( cache_ptr->cache_accesses >= cache_ptr->cache_hits );
+
+    if ( cache_ptr->cache_accesses > 0 ) {
+
+        *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) /
+                         ((double)(cache_ptr->cache_accesses));
+
+    } else {
+
+        *hit_rate_ptr = 0.0f;
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_cache_hit_rate() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_get_entry_status
+ *
+ * Purpose:     This function is used to determine whether the cache
+ *		contains an entry with the specified base address.  If
+ *		the entry exists, it also reports some status information
+ *		on the entry.
+ *
+ *		Status information is reported in the locations pointed
+ *		to by the size_ptr, in_cache_ptr, is_dirty_ptr, and
+ *		is_protected_ptr.  While in_cache_ptr must be defined,
+ *		the remaining pointers may be NULL, in which case the
+ *		associated data is not reported.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_entry_status(const H5F_t *f,
+                     haddr_t   addr,
+                     size_t *  size_ptr,
+                     hbool_t * in_cache_ptr,
+                     hbool_t * is_dirty_ptr,
+                     hbool_t * is_protected_ptr,
+		     hbool_t * is_pinned_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( in_cache_ptr != NULL );
+
+    /* this test duplicates two of the above asserts, but we need an
+     * invocation of HGOTO_ERROR to keep the compiler happy.
+     */
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+    if ( entry_ptr == NULL ) {
+
+        /* the entry doesn't exist in the cache -- report this
+         * and quit.
+         */
+        *in_cache_ptr = FALSE;
+
+    } else {
+
+        *in_cache_ptr = TRUE;
+
+        if ( size_ptr != NULL ) {
+
+            *size_ptr = entry_ptr->size;
+        }
+
+        if ( is_dirty_ptr != NULL ) {
+
+            *is_dirty_ptr = entry_ptr->is_dirty;
+        }
+
+        if ( is_protected_ptr != NULL ) {
+
+            *is_protected_ptr = entry_ptr->is_protected;
+        }
+
+        if ( is_pinned_ptr != NULL ) {
+
+            *is_pinned_ptr = entry_ptr->is_pinned;
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_entry_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_evictions_enabled()
+ *
+ * Purpose:     Copy the current value of cache_ptr->evictions_enabled into
+ *              *evictions_enabled_ptr.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              7/27/07
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_evictions_enabled(const H5C_t *cache_ptr,
+                          hbool_t * evictions_enabled_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( evictions_enabled_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Bad evictions_enabled_ptr on entry.")
+    }
+
+    *evictions_enabled_ptr = cache_ptr->evictions_enabled;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_evictions_enabled() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_trace_file_ptr
+ *
+ * Purpose:     Get the trace_file_ptr field from the cache.
+ *
+ *              This field will either be NULL (which indicates that trace
+ *              file logging is turned off), or contain a pointer to the
+ *              open file to which trace file data is to be written.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_trace_file_ptr(const H5C_t *cache_ptr, FILE **trace_file_ptr_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(trace_file_ptr_ptr);
+
+    *trace_file_ptr_ptr = cache_ptr->trace_file_ptr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_get_trace_file_ptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_trace_file_ptr_from_entry
+ *
+ * Purpose:     Get the trace_file_ptr field from the cache, via an entry.
+ *
+ *              This field will either be NULL (which indicates that trace
+ *              file logging is turned off), or contain a pointer to the
+ *              open file to which trace file data is to be written.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              6/9/08
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
+    FILE **trace_file_ptr_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->cache_ptr);
+
+    H5C_get_trace_file_ptr(entry_ptr->cache_ptr, trace_file_ptr_ptr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_get_trace_file_ptr_from_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_insert_entry
+ *
+ * Purpose:     Adds the specified thing to the cache.  The thing need not
+ *              exist on disk yet, but it must have an address and disk
+ *              space reserved.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the insertion (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  This is useful in the
+ *		metadata cache, but may not be needed elsewhere.  If so,
+ *		just use the same dxpl_id for both parameters.
+ *
+ *		The primary_dxpl_id is the dxpl_id passed to the
+ *		check_write_permitted function if such a function has been
+ *		provided.
+ *
+ *		Observe that this function cannot occasion a read.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *		6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_insert_entry(H5F_t *             f,
+                 hid_t		     primary_dxpl_id,
+                 hid_t		     secondary_dxpl_id,
+                 const H5C_class_t * type,
+                 haddr_t 	     addr,
+                 void *		     thing,
+                 unsigned int        flags)
+{
+    H5C_t *             cache_ptr;
+    herr_t		result;
+    herr_t		ret_value = SUCCEED;    /* Return value */
+    hbool_t		first_flush = TRUE;
+    hbool_t		insert_pinned;
+    hbool_t             set_flush_marker;
+    hbool_t		write_permitted = TRUE;
+    size_t		empty_space;
+    H5C_cache_entry_t *	entry_ptr;
+    H5C_cache_entry_t *	test_entry_ptr;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( type->flush );
+    HDassert( type->size );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( thing );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( H5C_verify_not_in_index(cache_ptr, (H5C_cache_entry_t *)thing) < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "thing already in index.\n");
+    }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "LRU sanity check failed.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
+    insert_pinned    = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
+
+    entry_ptr = (H5C_cache_entry_t *)thing;
+
+    /* verify that the new entry isn't already in the hash table -- scream
+     * and die if it is.
+     */
+
+    H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
+
+    if ( test_entry_ptr != NULL ) {
+
+        if ( test_entry_ptr == entry_ptr ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+                        "entry already in cache.")
+
+        } else {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+                        "duplicate entry in cache.")
+        }
+    }
+
+#ifndef NDEBUG
+    entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
+    entry_ptr->cache_ptr = cache_ptr;
+    entry_ptr->addr  = addr;
+    entry_ptr->type  = type;
+
+    entry_ptr->is_protected = FALSE;
+    entry_ptr->is_read_only = FALSE;
+    entry_ptr->ro_ref_count = 0;
+
+    entry_ptr->is_pinned = insert_pinned;
+
+    /* newly inserted entries are assumed to be dirty */
+    entry_ptr->is_dirty = TRUE;
+
+    /* not protected, so can't be dirtied */
+    entry_ptr->dirtied  = FALSE;
+
+    /* Retrieve the size of the thing */
+    if((type->size)(f, thing, &(entry_ptr->size)) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
+    HDassert(entry_ptr->size > 0 &&  entry_ptr->size < H5C_MAX_ENTRY_SIZE);
+
+    entry_ptr->in_slist = FALSE;
+
+#ifdef H5_HAVE_PARALLEL
+    entry_ptr->clear_on_unprotect = FALSE;
+    entry_ptr->flush_immediately = FALSE;
+#endif /* H5_HAVE_PARALLEL */
+
+    entry_ptr->flush_in_progress = FALSE;
+    entry_ptr->destroy_in_progress = FALSE;
+    entry_ptr->free_file_space_on_destroy = FALSE;
+
+    entry_ptr->ht_next = NULL;
+    entry_ptr->ht_prev = NULL;
+
+    entry_ptr->next = NULL;
+    entry_ptr->prev = NULL;
+
+    entry_ptr->aux_next = NULL;
+    entry_ptr->aux_prev = NULL;
+
+    H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+
+    if ( ( cache_ptr->flash_size_increase_possible ) &&
+         ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+        result = H5C__flash_increase_cache_size(cache_ptr, 0, entry_ptr->size);
+
+        if ( result < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+                        "H5C__flash_increase_cache_size failed.")
+        }
+    }
+
+    if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
+
+       empty_space = 0;
+
+    } else {
+
+       empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
+
+    }
+
+    if ( ( cache_ptr->evictions_enabled )
+	 &&
+         ( ( (cache_ptr->index_size + entry_ptr->size) >
+	     cache_ptr->max_cache_size
+	   )
+	   ||
+	   (
+	     ( ( empty_space + cache_ptr->clean_index_size ) <
+	       cache_ptr->min_clean_size )
+	   )
+	 )
+       ) {
+
+        size_t space_needed;
+
+	if ( empty_space <= entry_ptr->size ) {
+
+            cache_ptr->cache_full = TRUE;
+	}
+
+        if ( cache_ptr->check_write_permitted != NULL ) {
+
+            result = (cache_ptr->check_write_permitted)(f,
+                                                        primary_dxpl_id,
+                                                        &write_permitted);
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+                            "Can't get write_permitted")
+            }
+        } else {
+
+            write_permitted = cache_ptr->write_permitted;
+        }
+
+        HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE );
+
+        space_needed = entry_ptr->size;
+
+        if ( space_needed > cache_ptr->max_cache_size ) {
+
+            space_needed = cache_ptr->max_cache_size;
+        }
+
+        /* Note that space_needed is just the amount of space that
+         * needed to insert the new entry without exceeding the cache
+         * size limit.  The subsequent call to H5C_make_space_in_cache()
+         * may evict the entries required to free more or less space
+         * depending on conditions.  It MAY be less if the cache is
+         * currently undersized, or more if the cache is oversized.
+         *
+         * The cache can exceed its maximum size limit via the following
+         * mechanisms:
+         *
+         * First, it is possible for the cache to grow without
+         * bound as long as entries are protected and not unprotected.
+         *
+         * Second, when writes are not permitted it is also possible
+         * for the cache to grow without bound.
+         *
+         * Finally, we usually don't check to see if the cache is
+         * oversized at the end of an unprotect.  As a result, it is
+         * possible to have a vastly oversized cache with no protected
+         * entries as long as all the protects preceed the unprotects.
+         *
+         * Since items 1 and 2 are not changing any time soon, I see
+         * no point in worrying about the third.
+         */
+
+        result = H5C_make_space_in_cache(f,
+                                         primary_dxpl_id,
+                                         secondary_dxpl_id,
+                                         space_needed,
+                                         write_permitted,
+                                         &first_flush);
+
+        if ( result < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+                        "H5C_make_space_in_cache failed.")
+        }
+    }
+
+    H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
+
+    /* New entries are presumed to be dirty, so this if statement is
+     * unnecessary.  Rework it once the rest of the code changes are
+     * in and tested.   -- JRM
+     */
+    if ( entry_ptr->is_dirty ) {
+
+        entry_ptr->flush_marker = set_flush_marker;
+        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+
+    } else {
+
+        entry_ptr->flush_marker = FALSE;
+    }
+
+    H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL)
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "LRU sanity check failed.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "LRU sanity check failed.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_insert_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_mark_entries_as_clean
+ *
+ * Purpose:     When the H5C code is used to implement the metadata caches
+ *		in PHDF5, only the cache with MPI_rank 0 is allowed to
+ *		actually write entries to disk -- all other caches must
+ *		retain dirty entries until they are advised that the
+ *		entries are clean.
+ *
+ *		This function exists to allow the H5C code to receive these
+ *		notifications.
+ *
+ *		The function receives a list of entry base addresses
+ *		which must refer to dirty entries in the cache.  If any
+ *		of the entries are either clean or don't exist, the
+ *		function flags an error.
+ *
+ *		The function scans the list of entries and flushes all
+ *		those that are currently unprotected with the
+ *		H5C__FLUSH_CLEAR_ONLY_FLAG.  Those that are currently
+ *		protected are flagged for clearing when they are
+ *		unprotected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/5/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+herr_t
+H5C_mark_entries_as_clean(H5F_t *  f,
+                          hid_t     primary_dxpl_id,
+                          hid_t     secondary_dxpl_id,
+                          int32_t   ce_array_len,
+                          haddr_t * ce_array_ptr)
+{
+    H5C_t *             cache_ptr;
+    hbool_t		first_flush = TRUE;
+    int			entries_cleared;
+    int			entries_examined;
+    int                 i;
+    int			initial_list_len;
+    haddr_t		addr;
+#if H5C_DO_SANITY_CHECKS
+    int			pinned_entries_marked = 0;
+    int			protected_entries_marked = 0;
+    int			other_entries_marked = 0;
+    haddr_t		last_addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+    H5C_cache_entry_t *	clear_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+    cache_ptr = f->shared->cache;
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    HDassert( ce_array_len > 0 );
+    HDassert( ce_array_ptr != NULL );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HDassert(0);
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    for ( i = 0; i < ce_array_len; i++ )
+    {
+        addr = ce_array_ptr[i];
+
+#if H5C_DO_SANITY_CHECKS
+        if ( i == 0 ) {
+
+            last_addr = addr;
+
+        } else {
+
+            if ( last_addr == addr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Duplicate entry in cleaned list.\n");
+
+            } else if ( last_addr > addr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "cleaned list not sorted.\n");
+            }
+        }
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HDassert(0);
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        HDassert( H5F_addr_defined(addr) );
+
+        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+        if ( entry_ptr == NULL ) {
+#if H5C_DO_SANITY_CHECKS
+	    HDfprintf(stdout,
+                  "H5C_mark_entries_as_clean: entry[%d] = %ld not in cache.\n",
+                      (int)i,
+                      (long)addr);
+#endif /* H5C_DO_SANITY_CHECKS */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "Listed entry not in cache?!?!?.")
+
+        } else if ( ! entry_ptr->is_dirty ) {
+
+#if H5C_DO_SANITY_CHECKS
+	    HDfprintf(stdout,
+                      "H5C_mark_entries_as_clean: entry %ld is not dirty!?!\n",
+                      (long)addr);
+#endif /* H5C_DO_SANITY_CHECKS */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "Listed entry not dirty?!?!?.")
+#if 0 /* original code */
+        } else if ( entry_ptr->is_protected ) {
+
+            entry_ptr->clear_on_unprotect = TRUE;
+
+        } else {
+
+            if ( H5C_flush_single_entry(f,
+                                        primary_dxpl_id,
+                                        secondary_dxpl_id,
+                                        entry_ptr->type,
+                                        addr,
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                        &first_flush,
+                                        TRUE) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+            }
+        }
+#else /* modified code */
+        } else {
+            /* Mark the entry to be cleared on unprotect.  We will
+             * scan the LRU list shortly, and clear all those entries
+             * not currently protected.
+             */
+            entry_ptr->clear_on_unprotect = TRUE;
+#if H5C_DO_SANITY_CHECKS
+	    if ( entry_ptr->is_protected ) {
+
+		protected_entries_marked++;
+
+	    } else if ( entry_ptr->is_pinned ) {
+
+		pinned_entries_marked++;
+
+	    } else {
+
+		other_entries_marked++;
+	    }
+#endif /* H5C_DO_SANITY_CHECKS */
+        }
+#endif /* end modified code */
+    }
+#if 1 /* modified code */
+    /* Scan through the LRU list from back to front, and flush the
+     * entries whose clear_on_unprotect flags are set.  Observe that
+     * any protected entries will not be on the LRU, and therefore
+     * will not be flushed at this time.
+     */
+
+    entries_cleared = 0;
+    entries_examined = 0;
+    initial_list_len = cache_ptr->LRU_list_len;
+    entry_ptr = cache_ptr->LRU_tail_ptr;
+
+    while ( ( entry_ptr != NULL ) &&
+            ( entries_examined <= initial_list_len ) &&
+            ( entries_cleared < ce_array_len ) )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_cleared++;
+
+            if ( H5C_flush_single_entry(f,
+                                        primary_dxpl_id,
+                                        secondary_dxpl_id,
+                                        clear_ptr->type,
+                                        clear_ptr->addr,
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                        &first_flush,
+                                        TRUE) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+            }
+        } else {
+
+            entry_ptr = entry_ptr->prev;
+        }
+        entries_examined++;
+    }
+
+#if H5C_DO_SANITY_CHECKS
+    HDassert( entries_cleared == other_entries_marked );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    /* It is also possible that some of the cleared entries are on the
+     * pinned list.  Must scan that also.
+     */
+
+    entry_ptr = cache_ptr->pel_head_ptr;
+
+    while ( entry_ptr != NULL )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->next;
+            entries_cleared++;
+
+            if ( H5C_flush_single_entry(f,
+                                        primary_dxpl_id,
+                                        secondary_dxpl_id,
+                                        clear_ptr->type,
+                                        clear_ptr->addr,
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                        &first_flush,
+                                        TRUE) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+            }
+        } else {
+
+            entry_ptr = entry_ptr->next;
+        }
+    }
+
+#if H5C_DO_SANITY_CHECKS
+    HDassert( entries_cleared == pinned_entries_marked + other_entries_marked );
+    HDassert( entries_cleared + protected_entries_marked == ce_array_len );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    HDassert( ( entries_cleared == ce_array_len ) ||
+              ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) );
+
+#if H5C_DO_SANITY_CHECKS
+    i = 0;
+    entry_ptr = cache_ptr->pl_head_ptr;
+    while ( entry_ptr != NULL )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            i++;
+        }
+        entry_ptr = entry_ptr->next;
+    }
+    HDassert( (entries_cleared + i) == ce_array_len );
+#endif /* H5C_DO_SANITY_CHECKS */
+#endif /* modified code */
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HDassert(0);
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_mark_entries_as_clean() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_mark_entry_dirty
+ *
+ * Purpose:	Mark a pinned or protected entry as dirty.  The target entry
+ * 		MUST be either pinned or protected, and MAY be both.
+ *
+ * 		In the protected case, this call is the functional
+ * 		equivalent of setting the H5C__DIRTIED_FLAG on an unprotect
+ * 		call.
+ *
+ * 		In the pinned but not protected case, if the entry is not
+ * 		already dirty, the function places function marks the entry
+ * 		dirty and places it on the skip list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/15/06
+ *
+ * 		JRM -- 11/5/08
+ * 		Added call to H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY() to
+ * 		update the new clean_index_size and dirty_index_size
+ * 		fields of H5C_t in the case that the entry was clean
+ * 		prior to this call, and is pinned and not protected.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_mark_entry_dirty(void *thing)
+{
+    H5C_t *             cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(H5F_addr_defined(entry_ptr->addr));
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    if ( entry_ptr->is_protected ) {
+	HDassert( ! ((entry_ptr)->is_read_only) );
+
+        /* set the dirtied flag */
+        entry_ptr->dirtied = TRUE;
+
+    } else if ( entry_ptr->is_pinned ) {
+        hbool_t		was_pinned_unprotected_and_clean;
+
+	was_pinned_unprotected_and_clean = ! ( entry_ptr->is_dirty );
+
+        /* mark the entry as dirty if it isn't already */
+        entry_ptr->is_dirty = TRUE;
+
+	if ( was_pinned_unprotected_and_clean ) {
+
+	    H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr);
+	}
+
+        if ( ! (entry_ptr->in_slist) ) {
+
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+        }
+
+        H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+
+    } else {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, \
+                    "Entry is neither pinned nor protected??")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_mark_entry_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_move_entry
+ *
+ * Purpose:     Use this function to notify the cache that an entry's
+ *              file address changed.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *              JRM -- 11/5/08
+ *              On review this function looks like no change is needed to
+ *              support the new clean_index_size and dirty_index_size
+ *              fields of H5C_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_move_entry(H5C_t *	     cache_ptr,
+                 const H5C_class_t * type,
+                 haddr_t 	     old_addr,
+	         haddr_t 	     new_addr)
+{
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+    hbool_t			was_dirty;
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	test_entry_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    hbool_t			removed_entry_from_slist = FALSE;
+#endif /* H5C_DO_SANITY_CHECKS */
+    herr_t			ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( H5F_addr_defined(old_addr) );
+    HDassert( H5F_addr_defined(new_addr) );
+    HDassert( H5F_addr_ne(old_addr, new_addr) );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    H5C__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL)
+
+    if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) {
+
+        /* the old item doesn't exist in the cache, so we are done. */
+        HGOTO_DONE(SUCCEED)
+    }
+
+    HDassert( entry_ptr->addr == old_addr );
+    HDassert( entry_ptr->type == type );
+
+    if ( entry_ptr->is_protected ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
+		    "Target entry is protected.")
+    }
+
+    H5C__SEARCH_INDEX(cache_ptr, new_addr, test_entry_ptr, FAIL)
+
+    if ( test_entry_ptr != NULL ) { /* we are hosed */
+
+        if ( test_entry_ptr->type == type ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
+                        "Target already moved & reinserted???.")
+
+        } else {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
+                        "New address already in use?.")
+
+        }
+    }
+
+    /* If we get this far we have work to do.  Remove *entry_ptr from
+     * the hash table (and skip list if necessary), change its address to the
+     * new address, mark it as dirty (if it isn't already) and then re-insert.
+     *
+     * Update the replacement policy for a hit to avoid an eviction before
+     * the moved entry is touched.  Update stats for a move.
+     *
+     * Note that we do not check the size of the cache, or evict anything.
+     * Since this is a simple re-name, cache size should be unaffected.
+     *
+     * Check to see if the target entry is in the process of being destroyed
+     * before we delete from the index, etc.  If it is, all we do is
+     * change the addr.  If the entry is only in the process of being flushed,
+     * don't mark it as dirty either, lest we confuse the flush call back.
+     */
+
+    if ( ! ( entry_ptr->destroy_in_progress ) ) {
+
+        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
+
+        if ( entry_ptr->in_slist ) {
+
+            HDassert( cache_ptr->slist_ptr );
+
+            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+
+#if H5C_DO_SANITY_CHECKS
+
+            removed_entry_from_slist = TRUE;
+
+#endif /* H5C_DO_SANITY_CHECKS */
+        }
+    }
+
+    entry_ptr->addr = new_addr;
+
+    if ( ! ( entry_ptr->destroy_in_progress ) ) {
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+        was_dirty = entry_ptr->is_dirty;
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+	if ( ! ( entry_ptr->flush_in_progress ) ) {
+
+            entry_ptr->is_dirty = TRUE;
+	}
+
+        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
+
+	if ( ! ( entry_ptr->flush_in_progress ) ) {
+
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+
+#if H5C_DO_SANITY_CHECKS
+
+            if ( removed_entry_from_slist ) {
+
+		/* we just removed the entry from the slist.  Thus we
+		 * must touch up cache_ptr->slist_len_increase and
+		 * cache_ptr->slist_size_increase to keep from skewing
+		 * the sanity checks.
+		 */
+		HDassert( cache_ptr->slist_len_increase > 1 );
+		HDassert( cache_ptr->slist_size_increase > entry_ptr->size );
+
+		cache_ptr->slist_len_increase -= 1;
+		cache_ptr->slist_size_increase -= entry_ptr->size;
+	    }
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+            H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, FAIL)
+	}
+    }
+
+    H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_move_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_resize_entry
+ *
+ * Purpose:	Resize a pinned or protected entry.
+ *
+ * 		Resizing an entry dirties it, so if the entry is not
+ * 		already dirty, the function places the entry on the
+ * 		skip list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/5/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_resize_entry(void *thing, size_t new_size)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(H5F_addr_defined(entry_ptr->addr));
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check for usage errors */
+    if(new_size <= 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "New size is non-positive.")
+    if(!(entry_ptr->is_pinned || entry_ptr->is_protected))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "Entry isn't pinned or protected??")
+
+    /* update for change in entry size if necessary */
+    if ( entry_ptr->size != new_size ) {
+        hbool_t		was_clean;
+
+        /* make note of whether the entry was clean to begin with */
+        was_clean = ! ( entry_ptr->is_dirty );
+
+        /* mark the entry as dirty if it isn't already */
+        entry_ptr->is_dirty = TRUE;
+
+        /* do a flash cache size increase if appropriate */
+        if ( cache_ptr->flash_size_increase_possible ) {
+
+            if ( new_size > entry_ptr->size ) {
+                size_t             	size_increase;
+
+                size_increase = new_size - entry_ptr->size;
+
+                if(size_increase >= cache_ptr->flash_size_increase_threshold) {
+                    if(H5C__flash_increase_cache_size(cache_ptr, entry_ptr->size, new_size) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "flash cache increase failed")
+                }
+            }
+        }
+
+        /* update the pinned and/or protected entry list */
+        if(entry_ptr->is_pinned) {
+            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
+                                            (cache_ptr->pel_size), \
+                                            (entry_ptr->size), (new_size))
+        } /* end if */
+        if(entry_ptr->is_protected) {
+            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \
+                                            (cache_ptr->pl_size), \
+                                            (entry_ptr->size), (new_size))
+        } /* end if */
+
+        /* update the hash table */
+	H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\
+                                          (new_size), (entry_ptr), (was_clean));
+
+        /* if the entry is in the skip list, update that too */
+        if ( entry_ptr->in_slist ) {
+	    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\
+                                              (new_size));
+        } /* end if */
+
+        /* update statistics just before changing the entry size */
+	H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \
+                                                (new_size));
+
+	/* finally, update the entry size proper */
+	entry_ptr->size = new_size;
+
+        if(!entry_ptr->in_slist) {
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+        } /* end if */
+
+        if(entry_ptr->is_pinned) {
+            H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_resize_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_pin_protected_entry()
+ *
+ * Purpose:	Pin a protected cache entry.  The entry must be protected
+ * 		at the time of call, and must be unpinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/26/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_pin_protected_entry(void *thing)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; /* Pointer to entry to pin */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(H5F_addr_defined(entry_ptr->addr));
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    if ( ! ( entry_ptr->is_protected ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected")
+    }
+
+    if ( entry_ptr->is_pinned ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry is already pinned")
+    }
+
+    entry_ptr->is_pinned = TRUE;
+
+    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_pin_protected_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_protect
+ *
+ * Purpose:     If the target entry is not in the cache, load it.  If
+ *		necessary, attempt to evict one or more entries to keep
+ *		the cache within its maximum size.
+ *
+ *		Mark the target entry as protected, and return its address
+ *		to the caller.  The caller must call H5C_unprotect() when
+ *		finished with the entry.
+ *
+ *		While it is protected, the entry may not be either evicted
+ *		or flushed -- nor may it be accessed by another call to
+ *		H5C_protect.  Any attempt to do so will result in a failure.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the insertion (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  This is useful in the
+ *		metadata cache, but may not be needed elsewhere.  If so,
+ *		just use the same dxpl_id for both parameters.
+ *
+ *		All reads are performed with the primary_dxpl_id.
+ *
+ *		Similarly, the primary_dxpl_id is passed to the
+ *		check_write_permitted function if it is called.
+ *
+ * Return:      Success:        Ptr to the desired entry
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer -  6/2/04
+ *
+ * 		JRM -- 11/13/08
+ * 		Modified function to call H5C_make_space_in_cache() when
+ * 		the min_clean_size is violated, not just when there isn't
+ * 		enough space for and entry that has just been loaded.
+ *
+ *              The purpose of this modification is to avoid "metadata
+ *              blizzards" in the write only case.  In such instances,
+ *              the cache was allowed to fill with dirty metadata.  When
+ *              we finally needed to evict an entry to make space, we had
+ *              to flush out a whole cache full of metadata -- which has
+ *              interesting performance effects.  We hope to avoid (or
+ *              perhaps more accurately hide) this effect by maintaining
+ *              the min_clean_size, which should force us to start flushing
+ *              entries long before we actually have to evict something
+ *              to make space.
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5C_protect(H5F_t *		f,
+            hid_t	        primary_dxpl_id,
+            hid_t	        secondary_dxpl_id,
+            const H5C_class_t * type,
+            haddr_t 	        addr,
+            void *              udata,
+	    unsigned		flags)
+{
+    H5C_t *		cache_ptr;
+    hbool_t		hit;
+    hbool_t		first_flush;
+    hbool_t		have_write_permitted = FALSE;
+    hbool_t		read_only = FALSE;
+    hbool_t		write_permitted;
+    herr_t		result;
+    size_t		empty_space;
+    void *		thing;
+    H5C_cache_entry_t *	entry_ptr;
+    void *		ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( type->flush );
+    HDassert( type->load );
+    HDassert( H5F_addr_defined(addr) );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+	HDassert(0);
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
+                    "LRU sanity check failed.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    if ( (flags & H5C__READ_ONLY_FLAG) != 0 )
+    {
+	read_only = TRUE;
+    }
+
+    /* first check to see if the target is in cache */
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, NULL)
+
+    if ( entry_ptr != NULL ) {
+
+        /* Check for trying to load the wrong type of entry from an address */
+        if(entry_ptr->type != type)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, NULL, "incorrect cache entry type")
+
+        hit = TRUE;
+	thing = (void *)entry_ptr;
+
+    } else {
+
+        /* must try to load the entry from disk. */
+
+        hit = FALSE;
+
+        thing = H5C_load_entry(f, primary_dxpl_id, type, addr, udata);
+
+        if ( thing == NULL ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't load entry")
+        }
+
+        entry_ptr = (H5C_cache_entry_t *)thing;
+
+        /* If the entry is very large, and we are configured to allow it,
+         * we may wish to perform a flash cache size increase.
+         */
+        if ( ( cache_ptr->flash_size_increase_possible ) &&
+             ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+            result = H5C__flash_increase_cache_size(cache_ptr, 0,
+                                                     entry_ptr->size);
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                            "H5C__flash_increase_cache_size failed.")
+             }
+        }
+
+        if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
+
+           empty_space = 0;
+
+        } else {
+
+           empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
+
+        }
+
+	/* try to free up if necceary and if evictions are permitted.  Note
+	 * that if evictions are enabled, we will call H5C_make_space_in_cache()
+	 * regardless if the min_free_space requirement is not met.
+	 */
+
+        if ( ( cache_ptr->evictions_enabled ) &&
+             ( ( (cache_ptr->index_size + entry_ptr->size) >
+	         cache_ptr->max_cache_size)
+	       ||
+	       ( ( empty_space + cache_ptr->clean_index_size ) <
+	         cache_ptr->min_clean_size )
+	     )
+           ) {
+
+            size_t space_needed;
+
+	    if ( empty_space <= entry_ptr->size ) {
+
+                cache_ptr->cache_full = TRUE;
+
+	    }
+
+            if ( cache_ptr->check_write_permitted != NULL ) {
+
+                result = (cache_ptr->check_write_permitted)(f,
+                                                            primary_dxpl_id,
+                                                            &write_permitted);
+
+                if ( result < 0 ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                               "Can't get write_permitted 1")
+
+                } else {
+
+                    have_write_permitted = TRUE;
+
+                    first_flush = TRUE;
+                }
+            } else {
+
+                write_permitted = cache_ptr->write_permitted;
+
+                have_write_permitted = TRUE;
+
+                first_flush = TRUE;
+            }
+
+            HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE );
+
+            space_needed = entry_ptr->size;
+
+            if ( space_needed > cache_ptr->max_cache_size ) {
+
+                space_needed = cache_ptr->max_cache_size;
+            }
+
+            /* Note that space_needed is just the amount of space that
+             * needed to insert the new entry without exceeding the cache
+             * size limit.  The subsequent call to H5C_make_space_in_cache()
+             * may evict the entries required to free more or less space
+             * depending on conditions.  It MAY be less if the cache is
+             * currently undersized, or more if the cache is oversized.
+             *
+             * The cache can exceed its maximum size limit via the following
+             * mechanisms:
+             *
+             * First, it is possible for the cache to grow without
+             * bound as long as entries are protected and not unprotected.
+             *
+             * Second, when writes are not permitted it is also possible
+             * for the cache to grow without bound.
+	     *
+	     * Third, the user may choose to disable evictions -- causing
+	     * the cache to grow without bound until evictions are
+	     * re-enabled.
+             *
+             * Finally, we usually don't check to see if the cache is
+             * oversized at the end of an unprotect.  As a result, it is
+             * possible to have a vastly oversized cache with no protected
+             * entries as long as all the protects preceed the unprotects.
+             *
+             * Since items 1, 2, and 3 are not changing any time soon, I
+             * see no point in worrying about the fourth.
+             */
+
+            result = H5C_make_space_in_cache(f, primary_dxpl_id,
+                                             secondary_dxpl_id,
+                                             space_needed, write_permitted,
+                                             &first_flush);
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                            "H5C_make_space_in_cache failed 1.")
+            }
+        }
+
+        /* Insert the entry in the hash table.  It can't be dirty yet, so
+         * we don't even check to see if it should go in the skip list.
+         *
+         * This is no longer true -- due to a bug fix, we may modify
+         * data on load to repair a file.
+         */
+        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL)
+
+        if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) {
+
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, NULL)
+        }
+
+        /* insert the entry in the data structures used by the replacement
+         * policy.  We are just going to take it out again when we update
+         * the replacement policy for a protect, but this simplifies the
+         * code.  If we do this often enough, we may want to optimize this.
+         */
+        H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, NULL)
+    }
+
+    HDassert( entry_ptr->addr == addr );
+    HDassert( entry_ptr->type == type );
+
+    if ( entry_ptr->is_protected ) {
+
+	if ( ( read_only ) && ( entry_ptr->is_read_only ) ) {
+
+	    HDassert( entry_ptr->ro_ref_count > 0 );
+
+	    (entry_ptr->ro_ref_count)++;
+
+	} else {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                        "Target already protected & not read only?!?.")
+	}
+    } else {
+
+    	H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, NULL)
+
+    	entry_ptr->is_protected = TRUE;
+
+	if ( read_only ) {
+
+	    entry_ptr->is_read_only = TRUE;
+	    entry_ptr->ro_ref_count = 1;
+	}
+
+    	entry_ptr->dirtied = FALSE;
+    }
+
+    H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit)
+
+    H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
+
+    ret_value = thing;
+
+    if ( ( cache_ptr->evictions_enabled ) &&
+         ( ( cache_ptr->size_decreased ) ||
+           ( ( cache_ptr->resize_enabled ) &&
+             ( cache_ptr->cache_accesses >=
+               (cache_ptr->resize_ctl).epoch_length ) ) ) ) {
+
+        if ( ! have_write_permitted ) {
+
+            if ( cache_ptr->check_write_permitted != NULL ) {
+
+                result = (cache_ptr->check_write_permitted)(f,
+                                                            primary_dxpl_id,
+                                                            &write_permitted);
+
+                if ( result < 0 ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                               "Can't get write_permitted 2")
+
+                } else {
+
+                    have_write_permitted = TRUE;
+
+                    first_flush = TRUE;
+                }
+            } else {
+
+                write_permitted = cache_ptr->write_permitted;
+
+                have_write_permitted = TRUE;
+
+                first_flush = TRUE;
+            }
+        }
+
+        if ( ( cache_ptr->resize_enabled ) &&
+             ( cache_ptr->cache_accesses >=
+               (cache_ptr->resize_ctl).epoch_length ) ) {
+
+            result = H5C__auto_adjust_cache_size(f,
+                                                 primary_dxpl_id,
+                                                 secondary_dxpl_id,
+                                                 write_permitted,
+                                                 &first_flush);
+            if ( result != SUCCEED ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                            "Cache auto-resize failed.")
+            }
+        }
+
+        if ( cache_ptr->size_decreased  ) {
+
+            cache_ptr->size_decreased = FALSE;
+
+            /* check to see if the cache is now oversized due to the cache
+             * size reduction.  If it is, try to evict enough entries to
+             * bring the cache size down to the current maximum cache size.
+	     *
+	     * Also, if the min_clean_size requirement is not met, we
+	     * should also call H5C_make_space_in_cache() to bring us
+	     * into complience.
+             */
+
+            if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
+
+               empty_space = 0;
+
+            } else {
+
+               empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
+
+            }
+
+            if ( ( cache_ptr->index_size > cache_ptr->max_cache_size )
+	         ||
+	         ( ( empty_space + cache_ptr->clean_index_size ) <
+	           cache_ptr->min_clean_size) ) {
+
+		if ( cache_ptr->index_size > cache_ptr->max_cache_size ) {
+
+                    cache_ptr->cache_full = TRUE;
+		}
+
+                result = H5C_make_space_in_cache(f, primary_dxpl_id,
+                                                 secondary_dxpl_id,
+                                                 (size_t)0, write_permitted,
+                                                 &first_flush);
+
+                if ( result < 0 ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+                                "H5C_make_space_in_cache failed 2.")
+                }
+            }
+        }
+    }
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_protect() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_reset_cache_hit_rate_stats()
+ *
+ * Purpose:     Reset the cache hit rate computation fields.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 10/5/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr)
+{
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    cache_ptr->cache_hits		= 0;
+    cache_ptr->cache_accesses		= 0;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_reset_cache_hit_rate_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_cache_auto_resize_config
+ *
+ * Purpose:	Set the cache automatic resize configuration to the
+ *		provided values if they are in range, and fail if they
+ *		are not.
+ *
+ *		If the new configuration enables automatic cache resizing,
+ *		coerce the cache max size and min clean size into agreement
+ *		with the new policy and re-set the full cache hit rate
+ *		stats.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/8/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_cache_auto_resize_config(H5C_t *cache_ptr,
+                                 H5C_auto_size_ctl_t *config_ptr)
+{
+    herr_t	result;
+    size_t      new_max_cache_size;
+    size_t      new_min_clean_size;
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( config_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.")
+    }
+
+    if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.")
+    }
+
+    /* check general configuration section of the config: */
+    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
+                                   H5C_RESIZE_CFG__VALIDATE_GENERAL) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
+                    "error in general configuration fields of new config.")
+    }
+
+    /* check size increase control fields of the config: */
+    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
+                                   H5C_RESIZE_CFG__VALIDATE_INCREMENT) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
+                    "error in the size increase control fields of new config.")
+    }
+
+    /* check size decrease control fields of the config: */
+    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
+                                   H5C_RESIZE_CFG__VALIDATE_DECREMENT) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
+                    "error in the size decrease control fields of new config.")
+    }
+
+    /* check for conflicts between size increase and size decrease controls: */
+    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
+                                   H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) ) {
+
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
+                    "conflicting threshold fields in new config.")
+    }
+
+    /* will set the increase possible fields to FALSE later if needed */
+    cache_ptr->size_increase_possible       = TRUE;
+    cache_ptr->flash_size_increase_possible = TRUE;
+    cache_ptr->size_decrease_possible       = TRUE;
+
+    switch ( config_ptr->incr_mode )
+    {
+        case H5C_incr__off:
+            cache_ptr->size_increase_possible = FALSE;
+            break;
+
+        case H5C_incr__threshold:
+            if ( ( config_ptr->lower_hr_threshold <= (double)0.0f ) ||
+                 ( config_ptr->increment <= (double)1.0f ) ||
+                 ( ( config_ptr->apply_max_increment ) &&
+                   ( config_ptr->max_increment <= 0 ) ) ) {
+
+                 cache_ptr->size_increase_possible = FALSE;
+            }
+            break;
+
+        default: /* should be unreachable */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.")
+    }
+
+    /* logically, this is were configuration for flash cache size increases
+     * should go.  However, this configuration depends on max_cache_size, so
+     * we wait until the end of the function, when this field is set.
+     */
+
+    switch ( config_ptr->decr_mode )
+    {
+        case H5C_decr__off:
+            cache_ptr->size_decrease_possible = FALSE;
+            break;
+
+        case H5C_decr__threshold:
+            if ( ( config_ptr->upper_hr_threshold >= (double)1.0f ) ||
+                 ( config_ptr->decrement >= (double)1.0f ) ||
+                 ( ( config_ptr->apply_max_decrement ) &&
+                   ( config_ptr->max_decrement <= 0 ) ) ) {
+
+                cache_ptr->size_decrease_possible = FALSE;
+            }
+            break;
+
+        case H5C_decr__age_out:
+            if ( ( ( config_ptr->apply_empty_reserve ) &&
+                   ( config_ptr->empty_reserve >= (double)1.0f ) ) ||
+                 ( ( config_ptr->apply_max_decrement ) &&
+                   ( config_ptr->max_decrement <= 0 ) ) ) {
+
+                cache_ptr->size_decrease_possible = FALSE;
+            }
+            break;
+
+        case H5C_decr__age_out_with_threshold:
+            if ( ( ( config_ptr->apply_empty_reserve ) &&
+                   ( config_ptr->empty_reserve >= (double)1.0f ) ) ||
+                 ( ( config_ptr->apply_max_decrement ) &&
+                   ( config_ptr->max_decrement <= 0 ) ) ||
+                 ( config_ptr->upper_hr_threshold >= (double)1.0f ) ) {
+
+                cache_ptr->size_decrease_possible = FALSE;
+            }
+            break;
+
+        default: /* should be unreachable */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown decr_mode?!?!?.")
+    }
+
+    if ( config_ptr->max_size == config_ptr->min_size ) {
+
+        cache_ptr->size_increase_possible = FALSE;
+	cache_ptr->flash_size_increase_possible = FALSE;
+        cache_ptr->size_decrease_possible = FALSE;
+    }
+
+    /* flash_size_increase_possible is intentionally omitted from the
+     * following:
+     */
+    cache_ptr->resize_enabled = cache_ptr->size_increase_possible ||
+                                cache_ptr->size_decrease_possible;
+
+    cache_ptr->resize_ctl = *config_ptr;
+
+    /* Resize the cache to the supplied initial value if requested, or as
+     * necessary to force it within the bounds of the current automatic
+     * cache resizing configuration.
+     *
+     * Note that the min_clean_fraction may have changed, so we
+     * go through the exercise even if the current size is within
+     * range and an initial size has not been provided.
+     */
+    if ( (cache_ptr->resize_ctl).set_initial_size ) {
+
+        new_max_cache_size = (cache_ptr->resize_ctl).initial_size;
+    }
+    else if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).max_size ) {
+
+        new_max_cache_size = (cache_ptr->resize_ctl).max_size;
+    }
+    else if ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).min_size ) {
+
+        new_max_cache_size = (cache_ptr->resize_ctl).min_size;
+
+    } else {
+
+        new_max_cache_size = cache_ptr->max_cache_size;
+    }
+
+    new_min_clean_size = (size_t)
+                         ((double)new_max_cache_size *
+                          ((cache_ptr->resize_ctl).min_clean_fraction));
+
+
+    /* since new_min_clean_size is of type size_t, we have
+     *
+     * 	( 0 <= new_min_clean_size )
+     *
+     * by definition.
+     */
+    HDassert( new_min_clean_size <= new_max_cache_size );
+    HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size );
+    HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size );
+
+    if ( new_max_cache_size < cache_ptr->max_cache_size ) {
+
+        cache_ptr->size_decreased = TRUE;
+    }
+
+    cache_ptr->max_cache_size = new_max_cache_size;
+    cache_ptr->min_clean_size = new_min_clean_size;
+
+    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+        /* this should be impossible... */
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_reset_cache_hit_rate_stats failed.")
+    }
+
+    /* remove excess epoch markers if any */
+    if ( ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) ||
+         ( config_ptr->decr_mode == H5C_decr__age_out ) ) {
+
+        if ( cache_ptr->epoch_markers_active >
+             (cache_ptr->resize_ctl).epochs_before_eviction ) {
+
+            result =
+                H5C__autoadjust__ageout__remove_excess_markers(cache_ptr);
+
+            if ( result != SUCCEED ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "can't remove excess epoch markers.")
+            }
+        }
+    } else if ( cache_ptr->epoch_markers_active > 0 ) {
+
+        result = H5C__autoadjust__ageout__remove_all_markers(cache_ptr);
+
+        if ( result != SUCCEED ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "error removing all epoch markers.")
+        }
+    }
+
+    /* configure flash size increase facility.  We wait until the
+     * end of the function, as we need the max_cache_size set before
+     * we start to keep things simple.
+     *
+     * If we haven't already ruled out flash cache size increases above,
+     * go ahead and configure it.
+     */
+
+    if ( cache_ptr->flash_size_increase_possible ) {
+
+        switch ( config_ptr->flash_incr_mode )
+        {
+            case H5C_flash_incr__off:
+                cache_ptr->flash_size_increase_possible = FALSE;
+                break;
+
+            case H5C_flash_incr__add_space:
+                cache_ptr->flash_size_increase_possible = TRUE;
+                cache_ptr->flash_size_increase_threshold =
+                    (size_t)
+                    (((double)(cache_ptr->max_cache_size)) *
+                     ((cache_ptr->resize_ctl).flash_threshold));
+                break;
+
+            default: /* should be unreachable */
+                 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                             "Unknown flash_incr_mode?!?!?.")
+                 break;
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_set_cache_auto_resize_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_evictions_enabled()
+ *
+ * Purpose:     Set cache_ptr->evictions_enabled to the value of the
+ *              evictions enabled parameter.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              7/27/07
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_evictions_enabled(H5C_t *cache_ptr,
+                          hbool_t evictions_enabled)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    if ( ( evictions_enabled != TRUE ) && ( evictions_enabled != FALSE ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Bad evictions_enabled on entry.")
+    }
+
+    /* There is no fundamental reason why we should not permit
+     * evictions to be disabled while automatic resize is enabled.
+     * However, I can't think of any good reason why one would
+     * want to, and allowing it would greatly complicate testing
+     * the feature.  Hence the following:
+     */
+    if ( ( evictions_enabled != TRUE ) &&
+         ( ( cache_ptr->resize_ctl.incr_mode != H5C_incr__off ) ||
+	   ( cache_ptr->resize_ctl.decr_mode != H5C_decr__off ) ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Can't disable evictions when auto resize enabled.")
+    }
+
+    cache_ptr->evictions_enabled = evictions_enabled;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_set_evictions_enabled() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_prefix
+ *
+ * Purpose:     Set the values of the prefix field of H5C_t.  This
+ *		filed is used to label some debugging output.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_prefix(H5C_t * cache_ptr, char * prefix)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( ( cache_ptr == NULL ) ||
+         ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ||
+         ( prefix == NULL ) ||
+         ( HDstrlen(prefix) >= H5C__PREFIX_LEN ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.")
+    }
+
+    HDstrncpy(&(cache_ptr->prefix[0]), prefix, (size_t)(H5C__PREFIX_LEN));
+
+    cache_ptr->prefix[H5C__PREFIX_LEN - 1] = '\0';
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_set_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_trace_file_ptr
+ *
+ * Purpose:     Set the trace_file_ptr field for the cache.
+ *
+ *              This field must either be NULL (which turns of trace
+ *              file logging), or be a pointer to an open file to which
+ *              trace file data is to be written.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_trace_file_ptr(H5C_t * cache_ptr,
+                       FILE * trace_file_ptr)
+{
+    herr_t		ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* This would normally be an assert, but we need to use an HGOTO_ERROR
+     * call to shut up the compiler.
+     */
+    if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr")
+    }
+
+    cache_ptr->trace_file_ptr = trace_file_ptr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_set_trace_file_ptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_stats
+ *
+ * Purpose:     Prints statistics about the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *		JRM -- 11/13/08
+ *		Added code displaying the max_clean_index_size and
+ *		max_dirty_index_size.
+ *
+ *              MAM -- 01/06/09
+ *              Added code displaying the calls_to_msic,
+ *              total_entries_skipped_in_msic, total_entries_scanned_in_msic,
+ *              and max_entries_skipped_in_msic fields.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_stats(H5C_t * cache_ptr,
+          const char *  cache_name,
+          hbool_t
+#if !H5C_COLLECT_CACHE_STATS
+          H5_ATTR_UNUSED
+#endif /* H5C_COLLECT_CACHE_STATS */
+          display_detailed_stats)
+{
+    herr_t	ret_value = SUCCEED;   /* Return value */
+
+#if H5C_COLLECT_CACHE_STATS
+    int		i;
+    int64_t     total_hits = 0;
+    int64_t     total_misses = 0;
+    int64_t	total_write_protects = 0;
+    int64_t	total_read_protects = 0;
+    int64_t	max_read_protects = 0;
+    int64_t     total_insertions = 0;
+    int64_t     total_pinned_insertions = 0;
+    int64_t     total_clears = 0;
+    int64_t     total_flushes = 0;
+    int64_t     total_evictions = 0;
+    int64_t     total_moves = 0;
+    int64_t     total_entry_flush_moves = 0;
+    int64_t     total_cache_flush_moves = 0;
+    int64_t	total_size_increases = 0;
+    int64_t	total_size_decreases = 0;
+    int64_t	total_entry_flush_size_changes = 0;
+    int64_t	total_cache_flush_size_changes = 0;
+    int64_t	total_pins = 0;
+    int64_t	total_unpins = 0;
+    int64_t	total_dirty_pins = 0;
+    int64_t	total_pinned_flushes = 0;
+    int64_t	total_pinned_clears = 0;
+    int32_t     aggregate_max_accesses = 0;
+    int32_t     aggregate_min_accesses = 1000000;
+    int32_t     aggregate_max_clears = 0;
+    int32_t     aggregate_max_flushes = 0;
+    size_t      aggregate_max_size = 0;
+    int32_t	aggregate_max_pins = 0;
+    double      hit_rate;
+    double	average_successful_search_depth = 0.0;
+    double	average_failed_search_depth = 0.0;
+    double      average_entries_skipped_per_calls_to_msic = 0.0;
+    double      average_entries_scanned_per_calls_to_msic = 0.0;
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* This would normally be an assert, but we need to use an HGOTO_ERROR
+     * call to shut up the compiler.
+     */
+    if ( ( ! cache_ptr ) ||
+         ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ||
+         ( !cache_name ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or cache_name")
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+
+    for ( i = 0; i <= cache_ptr->max_type_id; i++ ) {
+
+        total_hits              += cache_ptr->hits[i];
+        total_misses            += cache_ptr->misses[i];
+	total_write_protects	+= cache_ptr->write_protects[i];
+	total_read_protects	+= cache_ptr->read_protects[i];
+	if ( max_read_protects < cache_ptr->max_read_protects[i] ) {
+	    max_read_protects = cache_ptr->max_read_protects[i];
+	}
+        total_insertions        += cache_ptr->insertions[i];
+        total_pinned_insertions += cache_ptr->pinned_insertions[i];
+        total_clears            += cache_ptr->clears[i];
+        total_flushes           += cache_ptr->flushes[i];
+        total_evictions         += cache_ptr->evictions[i];
+        total_moves           += cache_ptr->moves[i];
+	total_entry_flush_moves
+				+= cache_ptr->entry_flush_moves[i];
+	total_cache_flush_moves
+				+= cache_ptr->cache_flush_moves[i];
+        total_size_increases    += cache_ptr->size_increases[i];
+        total_size_decreases    += cache_ptr->size_decreases[i];
+    	total_entry_flush_size_changes
+				+= cache_ptr->entry_flush_size_changes[i];
+    	total_cache_flush_size_changes
+				+= cache_ptr->cache_flush_size_changes[i];
+	total_pins              += cache_ptr->pins[i];
+	total_unpins            += cache_ptr->unpins[i];
+	total_dirty_pins        += cache_ptr->dirty_pins[i];
+	total_pinned_flushes    += cache_ptr->pinned_flushes[i];
+	total_pinned_clears     += cache_ptr->pinned_clears[i];
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    if ( aggregate_max_accesses < cache_ptr->max_accesses[i] )
+        aggregate_max_accesses = cache_ptr->max_accesses[i];
+    if ( aggregate_min_accesses > aggregate_max_accesses )
+        aggregate_min_accesses = aggregate_max_accesses;
+    if ( aggregate_min_accesses > cache_ptr->min_accesses[i] )
+        aggregate_min_accesses = cache_ptr->min_accesses[i];
+    if ( aggregate_max_clears < cache_ptr->max_clears[i] )
+        aggregate_max_clears = cache_ptr->max_clears[i];
+    if ( aggregate_max_flushes < cache_ptr->max_flushes[i] )
+        aggregate_max_flushes = cache_ptr->max_flushes[i];
+    if ( aggregate_max_size < cache_ptr->max_size[i] )
+        aggregate_max_size = cache_ptr->max_size[i];
+    if ( aggregate_max_pins < cache_ptr->max_pins[i] )
+        aggregate_max_pins = cache_ptr->max_pins[i];
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+    }
+
+    if ( ( total_hits > 0 ) || ( total_misses > 0 ) ) {
+
+        hit_rate = 100.0 * ((double)(total_hits)) /
+                   ((double)(total_hits + total_misses));
+    } else {
+        hit_rate = 0.0;
+    }
+
+    if ( cache_ptr->successful_ht_searches > 0 ) {
+
+        average_successful_search_depth =
+            ((double)(cache_ptr->total_successful_ht_search_depth)) /
+            ((double)(cache_ptr->successful_ht_searches));
+    }
+
+    if ( cache_ptr->failed_ht_searches > 0 ) {
+
+        average_failed_search_depth =
+            ((double)(cache_ptr->total_failed_ht_search_depth)) /
+            ((double)(cache_ptr->failed_ht_searches));
+    }
+
+
+    HDfprintf(stdout, "\n%sH5C: cache statistics for %s\n",
+              cache_ptr->prefix, cache_name);
+
+    HDfprintf(stdout, "\n");
+
+    HDfprintf(stdout,
+              "%s  hash table insertion / deletions   = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->total_ht_insertions),
+              (long)(cache_ptr->total_ht_deletions));
+
+    HDfprintf(stdout,
+              "%s  HT successful / failed searches    = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->successful_ht_searches),
+              (long)(cache_ptr->failed_ht_searches));
+
+    HDfprintf(stdout,
+              "%s  Av. HT suc / failed search depth   = %f / %f\n",
+              cache_ptr->prefix,
+              average_successful_search_depth,
+              average_failed_search_depth);
+
+    HDfprintf(stdout,
+             "%s  current (max) index size / length  = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->index_size),
+              (long)(cache_ptr->max_index_size),
+              (long)(cache_ptr->index_len),
+              (long)(cache_ptr->max_index_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) clean/dirty idx size = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->clean_index_size),
+              (long)(cache_ptr->max_clean_index_size),
+              (long)(cache_ptr->dirty_index_size),
+              (long)(cache_ptr->max_dirty_index_size));
+
+    HDfprintf(stdout,
+             "%s  current (max) slist size / length  = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->slist_size),
+              (long)(cache_ptr->max_slist_size),
+              (long)(cache_ptr->slist_len),
+              (long)(cache_ptr->max_slist_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) PL size / length     = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->pl_size),
+              (long)(cache_ptr->max_pl_size),
+              (long)(cache_ptr->pl_len),
+              (long)(cache_ptr->max_pl_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) PEL size / length    = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->pel_size),
+              (long)(cache_ptr->max_pel_size),
+              (long)(cache_ptr->pel_len),
+              (long)(cache_ptr->max_pel_len));
+
+    HDfprintf(stdout,
+              "%s  current LRU list size / length     = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->LRU_list_size),
+              (long)(cache_ptr->LRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  current clean LRU size / length    = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->cLRU_list_size),
+              (long)(cache_ptr->cLRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  current dirty LRU size / length    = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->dLRU_list_size),
+              (long)(cache_ptr->dLRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  Total hits / misses / hit_rate     = %ld / %ld / %f\n",
+              cache_ptr->prefix,
+              (long)total_hits,
+              (long)total_misses,
+              hit_rate);
+
+    HDfprintf(stdout,
+              "%s  Total write / read (max) protects  = %ld / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)total_write_protects,
+              (long)total_read_protects,
+              (long)max_read_protects);
+
+    HDfprintf(stdout,
+              "%s  Total clears / flushes / evictions = %ld / %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_clears,
+              (long)total_flushes,
+              (long)total_evictions);
+
+    HDfprintf(stdout,
+	      "%s  Total insertions(pinned) / moves = %ld(%ld) / %ld\n",
+              cache_ptr->prefix,
+              (long)total_insertions,
+              (long)total_pinned_insertions,
+              (long)total_moves);
+
+    HDfprintf(stdout,
+	      "%s  Total entry / cache flush moves  = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_entry_flush_moves,
+              (long)total_cache_flush_moves);
+
+    HDfprintf(stdout, "%s  Total entry size incrs / decrs     = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_size_increases,
+              (long)total_size_decreases);
+
+    HDfprintf(stdout, "%s  Ttl entry/cache flush size changes = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_entry_flush_size_changes,
+              (long)total_cache_flush_size_changes);
+
+    HDfprintf(stdout,
+	      "%s  Total entry pins (dirty) / unpins  = %ld (%ld) / %ld\n",
+              cache_ptr->prefix,
+              (long)total_pins,
+	      (long)total_dirty_pins,
+              (long)total_unpins);
+
+    HDfprintf(stdout, "%s  Total pinned flushes / clears      = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_pinned_flushes,
+              (long)total_pinned_clears);
+
+    HDfprintf(stdout, "%s  MSIC: (make space in cache) calls  = %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->calls_to_msic));
+
+    if (cache_ptr->calls_to_msic > 0) {
+        average_entries_skipped_per_calls_to_msic =
+            (((double)(cache_ptr->total_entries_skipped_in_msic)) /
+            ((double)(cache_ptr->calls_to_msic)));
+    }
+
+    HDfprintf(stdout, "%s  MSIC: Average/max entries skipped  = %lf / %ld\n",
+              cache_ptr->prefix,
+              (float)average_entries_skipped_per_calls_to_msic,
+              (long)(cache_ptr->max_entries_skipped_in_msic));
+
+    if (cache_ptr->calls_to_msic > 0) {
+        average_entries_scanned_per_calls_to_msic =
+            (((double)(cache_ptr->total_entries_scanned_in_msic)) /
+            ((double)(cache_ptr->calls_to_msic)));
+    }
+
+    HDfprintf(stdout, "%s  MSIC: Average/max entries scanned  = %lf / %ld\n",
+              cache_ptr->prefix,
+              (float)average_entries_scanned_per_calls_to_msic,
+              (long)(cache_ptr->max_entries_scanned_in_msic));
+
+    HDfprintf(stdout, "%s  MSIC: Scanned to make space(evict) = %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->entries_scanned_to_make_space));
+
+    HDfprintf(stdout, "%s  MSIC: Scanned to satisfy min_clean = %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->total_entries_scanned_in_msic -
+                            cache_ptr->entries_scanned_to_make_space));
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+    HDfprintf(stdout, "%s  aggregate max / min accesses       = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_accesses,
+              (int)aggregate_min_accesses);
+
+    HDfprintf(stdout, "%s  aggregate max_clears / max_flushes = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_clears,
+              (int)aggregate_max_flushes);
+
+    HDfprintf(stdout, "%s  aggregate max_size / max_pins      = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_size,
+	      (int)aggregate_max_pins);
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if ( display_detailed_stats )
+    {
+
+        for ( i = 0; i <= cache_ptr->max_type_id; i++ ) {
+
+            HDfprintf(stdout, "\n");
+
+            HDfprintf(stdout, "%s  Stats on %s:\n",
+                      cache_ptr->prefix,
+                      ((cache_ptr->type_name_table_ptr))[i]);
+
+            if ( ( cache_ptr->hits[i] > 0 ) || ( cache_ptr->misses[i] > 0 ) ) {
+
+                hit_rate = 100.0 * ((double)(cache_ptr->hits[i])) /
+                          ((double)(cache_ptr->hits[i] + cache_ptr->misses[i]));
+            } else {
+                hit_rate = 0.0;
+            }
+
+            HDfprintf(stdout,
+                      "%s    hits / misses / hit_rate       = %ld / %ld / %f\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->hits[i]),
+                      (long)(cache_ptr->misses[i]),
+                      hit_rate);
+
+            HDfprintf(stdout,
+                      "%s    write / read (max) protects    = %ld / %ld (%d)\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->write_protects[i]),
+                      (long)(cache_ptr->read_protects[i]),
+                      (int)(cache_ptr->max_read_protects[i]));
+
+            HDfprintf(stdout,
+                     "%s    clears / flushes / evictions   = %ld / %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->clears[i]),
+                      (long)(cache_ptr->flushes[i]),
+                      (long)(cache_ptr->evictions[i]));
+
+            HDfprintf(stdout,
+                      "%s    insertions(pinned) / moves   = %ld(%ld) / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->insertions[i]),
+                      (long)(cache_ptr->pinned_insertions[i]),
+                      (long)(cache_ptr->moves[i]));
+
+            HDfprintf(stdout,
+                      "%s    entry / cache flush moves    = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->entry_flush_moves[i]),
+                      (long)(cache_ptr->cache_flush_moves[i]));
+
+            HDfprintf(stdout,
+                      "%s    size increases / decreases     = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->size_increases[i]),
+                      (long)(cache_ptr->size_decreases[i]));
+
+            HDfprintf(stdout,
+                      "%s    entry/cache flush size changes = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->entry_flush_size_changes[i]),
+                      (long)(cache_ptr->cache_flush_size_changes[i]));
+
+
+            HDfprintf(stdout,
+                      "%s    entry pins / unpins            = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->pins[i]),
+                      (long)(cache_ptr->unpins[i]));
+
+            HDfprintf(stdout,
+                      "%s    entry dirty pins/pin'd flushes  = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->dirty_pins[i]),
+                      (long)(cache_ptr->pinned_flushes[i]));
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+            HDfprintf(stdout,
+                      "%s    entry max / min accesses       = %d / %d\n",
+                      cache_ptr->prefix,
+                      cache_ptr->max_accesses[i],
+                      cache_ptr->min_accesses[i]);
+
+            HDfprintf(stdout,
+                      "%s    entry max_clears / max_flushes = %d / %d\n",
+                      cache_ptr->prefix,
+                      cache_ptr->max_clears[i],
+                      cache_ptr->max_flushes[i]);
+
+            HDfprintf(stdout,
+                      "%s    entry max_size / max_pins      = %d / %d\n",
+                      cache_ptr->prefix,
+                      (int)(cache_ptr->max_size[i]),
+		      (int)(cache_ptr->max_pins[i]));
+
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+        }
+    }
+
+    HDfprintf(stdout, "\n");
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_stats() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_stats__reset
+ *
+ * Purpose:     Reset the stats fields to their initial values.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer, 4/28/04
+ *
+ *		JRM 11/13/08
+ *		Added initialization for the new max_clean_index_size and
+ *		max_dirty_index_size fields.
+ *
+ *              MAM -- 01/06/09
+ *              Added code to initalize the calls_to_msic,
+ *              total_entries_skipped_in_msic, total_entries_scanned_in_msic,
+ *              and max_entries_skipped_in_msic fields.
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+#ifndef NDEBUG
+H5C_stats__reset(H5C_t * cache_ptr)
+#else /* NDEBUG */
+#if H5C_COLLECT_CACHE_STATS
+H5C_stats__reset(H5C_t * cache_ptr)
+#else /* H5C_COLLECT_CACHE_STATS */
+H5C_stats__reset(H5C_t H5_ATTR_UNUSED * cache_ptr)
+#endif /* H5C_COLLECT_CACHE_STATS */
+#endif /* NDEBUG */
+{
+#if H5C_COLLECT_CACHE_STATS
+    int i;
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+#if H5C_COLLECT_CACHE_STATS
+    for ( i = 0; i <= cache_ptr->max_type_id; i++ )
+    {
+        cache_ptr->hits[i]			= 0;
+        cache_ptr->misses[i]			= 0;
+        cache_ptr->write_protects[i]		= 0;
+        cache_ptr->read_protects[i]		= 0;
+        cache_ptr->max_read_protects[i]		= 0;
+        cache_ptr->insertions[i]		= 0;
+        cache_ptr->pinned_insertions[i]		= 0;
+        cache_ptr->clears[i]			= 0;
+        cache_ptr->flushes[i]			= 0;
+        cache_ptr->evictions[i]	 		= 0;
+        cache_ptr->moves[i]	 		= 0;
+        cache_ptr->entry_flush_moves[i]	= 0;
+        cache_ptr->cache_flush_moves[i]	= 0;
+        cache_ptr->pins[i]	 		= 0;
+        cache_ptr->unpins[i]	 		= 0;
+        cache_ptr->dirty_pins[i]	 	= 0;
+        cache_ptr->pinned_flushes[i]	 	= 0;
+        cache_ptr->pinned_clears[i]	 	= 0;
+        cache_ptr->size_increases[i] 		= 0;
+        cache_ptr->size_decreases[i] 		= 0;
+	cache_ptr->entry_flush_size_changes[i]	= 0;
+	cache_ptr->cache_flush_size_changes[i]	= 0;
+    }
+
+    cache_ptr->total_ht_insertions		= 0;
+    cache_ptr->total_ht_deletions		= 0;
+    cache_ptr->successful_ht_searches		= 0;
+    cache_ptr->total_successful_ht_search_depth	= 0;
+    cache_ptr->failed_ht_searches		= 0;
+    cache_ptr->total_failed_ht_search_depth	= 0;
+
+    cache_ptr->max_index_len			= 0;
+    cache_ptr->max_index_size			= (size_t)0;
+    cache_ptr->max_clean_index_size		= (size_t)0;
+    cache_ptr->max_dirty_index_size		= (size_t)0;
+
+    cache_ptr->max_slist_len			= 0;
+    cache_ptr->max_slist_size			= (size_t)0;
+
+    cache_ptr->max_pl_len			= 0;
+    cache_ptr->max_pl_size			= (size_t)0;
+
+    cache_ptr->max_pel_len			= 0;
+    cache_ptr->max_pel_size			= (size_t)0;
+
+    cache_ptr->calls_to_msic                    = 0;
+    cache_ptr->total_entries_skipped_in_msic    = 0;
+    cache_ptr->total_entries_scanned_in_msic    = 0;
+    cache_ptr->max_entries_skipped_in_msic      = 0;
+    cache_ptr->max_entries_scanned_in_msic      = 0;
+    cache_ptr->entries_scanned_to_make_space    = 0;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+    for ( i = 0; i <= cache_ptr->max_type_id; i++ )
+    {
+        cache_ptr->max_accesses[i]		= 0;
+        cache_ptr->min_accesses[i]		= 1000000;
+        cache_ptr->max_clears[i]		= 0;
+        cache_ptr->max_flushes[i]		= 0;
+        cache_ptr->max_size[i]			= (size_t)0;
+        cache_ptr->max_pins[i]			= 0;
+    }
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    return;
+
+} /* H5C_stats__reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dump_cache
+ *
+ * Purpose:     Print a summary of the contents of the metadata cache for
+ *              debugging purposes.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/10/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_dump_cache(H5C_t * cache_ptr,
+               const char *  cache_name)
+{
+    herr_t              ret_value = SUCCEED;   /* Return value */
+    int                 i;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    H5SL_t *            slist_ptr = NULL;
+    H5SL_node_t *       node_ptr = NULL;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_name != NULL );
+
+    /* First, create a skip list */
+    slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL);
+
+    if ( slist_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create skip list.")
+    }
+
+    /* Next, scan the index, and insert all entries in the skip list.
+     * Do this, as we want to display cache entries in increasing address
+     * order.
+     */
+    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) {
+
+        entry_ptr = cache_ptr->index[i];
+
+        while ( entry_ptr != NULL ) {
+
+            HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+
+            if ( H5SL_insert(slist_ptr, entry_ptr, &(entry_ptr->addr)) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \
+                            "Can't insert entry in skip list")
+            }
+
+            entry_ptr = entry_ptr->ht_next;
+        }
+    }
+
+    /* If we get this far, all entries in the cache are listed in the
+     * skip list -- scan the skip list generating the desired output.
+     */
+
+    HDfprintf(stdout, "\n\nDump of metadata cache \"%s\".\n", cache_name);
+    HDfprintf(stdout,
+        "Num:   Addr:           Len:    Type:   Prot:   Pinned: Dirty:\n");
+
+    i = 0;
+
+    node_ptr = H5SL_first(slist_ptr);
+
+    if ( node_ptr != NULL ) {
+
+        entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+    } else {
+
+        entry_ptr = NULL;
+    }
+
+    while ( entry_ptr != NULL ) {
+
+        HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+
+        HDfprintf(stdout,
+            "%s%d       0x%08llx        0x%3llx %2d     %d      %d      %d\n",
+             cache_ptr->prefix, i,
+             (long long)(entry_ptr->addr),
+             (long long)(entry_ptr->size),
+             (int)(entry_ptr->type->id),
+             (int)(entry_ptr->is_protected),
+             (int)(entry_ptr->is_pinned),
+             (int)(entry_ptr->is_dirty));
+
+        /* increment node_ptr before we delete its target */
+        node_ptr = H5SL_next(node_ptr);
+
+        /* remove the first item in the skip list */
+        if ( H5SL_remove(slist_ptr, &(entry_ptr->addr)) != entry_ptr ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \
+                        "Can't delete entry from skip list.")
+        }
+
+        if ( node_ptr != NULL ) {
+
+            entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+        } else {
+
+            entry_ptr = NULL;
+        }
+
+        i++;
+    }
+
+    HDfprintf(stdout, "\n\n");
+
+    /* Finally, discard the skip list */
+
+    HDassert( H5SL_count(slist_ptr) == 0 );
+
+    H5SL_close(slist_ptr);
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_dump_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_unpin_entry()
+ *
+ * Purpose:	Unpin a cache entry.  The entry must be unprotected at
+ * 		the time of call, and must be pinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/22/06
+ *
+ * Modifications:
+ *
+ * 		JRM -- 4/26/06
+ *		Modified routine to allow it to operate on protected
+ *		entries.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unpin_entry(void *_entry_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_entry_ptr; /* Pointer to entry to unpin */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(entry_ptr);
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    if ( ! ( entry_ptr->is_pinned ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry isn't pinned")
+    }
+
+    if ( ! ( entry_ptr->is_protected ) ) {
+
+        H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, FAIL)
+    }
+
+    entry_ptr->is_pinned = FALSE;
+
+    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_unpin_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_unprotect
+ *
+ * Purpose:	Undo an H5C_protect() call -- specifically, mark the
+ *		entry as unprotected, remove it from the protected list,
+ *		and give it back to the replacement policy.
+ *
+ *		The TYPE and ADDR arguments must be the same as those in
+ *		the corresponding call to H5C_protect() and the THING
+ *		argument must be the value returned by that call to
+ *		H5C_protect().
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the unprotect (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  Since an uprotect cannot
+ *		occasion a write at present, all this is moot for now.
+ *		However, things change, and in any case,
+ *		H5C_flush_single_entry() needs primary_dxpl_id and
+ *		secondary_dxpl_id in its parameter list.
+ *
+ *		The function can't cause a read either, so the dxpl_id
+ *		parameters are moot in this case as well.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *		If the deleted flag is TRUE, simply remove the target entry
+ *		from the cache, clear it, and free it without writing it to
+ *		disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unprotect(H5F_t *		  f,
+              hid_t		  primary_dxpl_id,
+              hid_t		  secondary_dxpl_id,
+              const H5C_class_t * type,
+              haddr_t		  addr,
+              void *		  thing,
+              unsigned int        flags)
+{
+    H5C_t *		cache_ptr;
+    hbool_t		deleted;
+    hbool_t		dirtied;
+    hbool_t             set_flush_marker;
+    hbool_t		pin_entry;
+    hbool_t		unpin_entry;
+    hbool_t		free_file_space;
+    hbool_t		take_ownership;
+    hbool_t 		was_clean;
+#ifdef H5_HAVE_PARALLEL
+    hbool_t		clear_entry = FALSE;
+#endif /* H5_HAVE_PARALLEL */
+    H5C_cache_entry_t *	entry_ptr;
+    H5C_cache_entry_t *	test_entry_ptr;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    deleted          = ( (flags & H5C__DELETED_FLAG) != 0 );
+    dirtied          = ( (flags & H5C__DIRTIED_FLAG) != 0 );
+    set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
+    pin_entry        = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
+    unpin_entry      = ( (flags & H5C__UNPIN_ENTRY_FLAG) != 0 );
+    free_file_space  = ( (flags & H5C__FREE_FILE_SPACE_FLAG) != 0 );
+    take_ownership   = ( (flags & H5C__TAKE_OWNERSHIP_FLAG) != 0 );
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( type->clear );
+    HDassert( type->flush );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( thing );
+    HDassert( ! ( pin_entry && unpin_entry ) );
+    HDassert( ( ! free_file_space ) || ( deleted ) );   /* deleted flag must accompany free_file_space */
+    HDassert( ( ! take_ownership ) || ( deleted ) );    /* deleted flag must accompany take_ownership */
+    HDassert( ! ( free_file_space && take_ownership ) );    /* can't have both free_file_space & take_ownership */
+
+    entry_ptr = (H5C_cache_entry_t *)thing;
+
+    HDassert( entry_ptr->addr == addr );
+    HDassert( entry_ptr->type == type );
+
+    /* also set the dirtied variable if the dirtied field is set in
+     * the entry.
+     */
+    dirtied |= entry_ptr->dirtied;
+    was_clean = ! ( entry_ptr->is_dirty );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+
+    /* if the entry has multiple read only protects, just decrement
+     * the ro_ref_counter.  Don't actually unprotect until the ref count
+     * drops to zero.
+     */
+    if ( entry_ptr->ro_ref_count > 1 ) {
+
+	HDassert( entry_ptr->is_protected );
+        HDassert( entry_ptr->is_read_only );
+
+	if ( dirtied ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                        "Read only entry modified(1)??")
+	}
+
+	(entry_ptr->ro_ref_count)--;
+
+        /* Pin or unpin the entry as requested. */
+        if ( pin_entry ) {
+
+            if ( entry_ptr->is_pinned ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \
+                            "Entry already pinned???")
+            }
+	    entry_ptr->is_pinned = TRUE;
+	    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+
+        } else if ( unpin_entry ) {
+
+            if ( ! ( entry_ptr->is_pinned ) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \
+			    "Entry already unpinned???")
+            }
+	    entry_ptr->is_pinned = FALSE;
+	    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+
+        }
+
+    } else {
+
+	if ( entry_ptr->is_read_only ) {
+
+	    HDassert( entry_ptr->ro_ref_count == 1 );
+
+	    if ( dirtied ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "Read only entry modified(2)??")
+	    }
+
+	    entry_ptr->is_read_only = FALSE;
+	    entry_ptr->ro_ref_count = 0;
+	}
+
+#ifdef H5_HAVE_PARALLEL
+        /* When the H5C code is used to implement the metadata cache in the
+         * PHDF5 case, only the cache on process 0 is allowed to write to file.
+         * All the other metadata caches must hold dirty entries until they
+         * are told that the entries are clean.
+         *
+         * The clear_on_unprotect flag in the H5C_cache_entry_t structure
+         * exists to deal with the case in which an entry is protected when
+         * its cache receives word that the entry is now clean.  In this case,
+         * the clear_on_unprotect flag is set, and the entry is flushed with
+         * the H5C__FLUSH_CLEAR_ONLY_FLAG.
+         *
+         * All this is a bit awkward, but until the metadata cache entries
+         * are contiguous, with only one dirty flag, we have to let the supplied
+         * functions deal with the reseting the is_dirty flag.
+         */
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            HDassert( entry_ptr->is_dirty );
+
+            entry_ptr->clear_on_unprotect = FALSE;
+
+            if ( ! dirtied ) {
+
+                clear_entry = TRUE;
+            }
+        }
+#endif /* H5_HAVE_PARALLEL */
+
+        if ( ! (entry_ptr->is_protected) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "Entry already unprotected??")
+        }
+
+        /* mark the entry as dirty if appropriate */
+        entry_ptr->is_dirty = ( (entry_ptr->is_dirty) || dirtied );
+
+        if ( ( was_clean ) && ( entry_ptr->is_dirty ) ) {
+
+	    H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
+	}
+
+        /* Pin or unpin the entry as requested. */
+        if ( pin_entry ) {
+
+            if ( entry_ptr->is_pinned ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \
+                            "Entry already pinned???")
+            }
+	    entry_ptr->is_pinned = TRUE;
+	    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+
+        } else if ( unpin_entry ) {
+
+            if ( ! ( entry_ptr->is_pinned ) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \
+			    "Entry already unpinned???")
+            }
+	    entry_ptr->is_pinned = FALSE;
+	    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+
+        }
+
+        /* H5C__UPDATE_RP_FOR_UNPROTECT will place the unprotected entry on
+         * the pinned entry list if entry_ptr->is_pinned is TRUE.
+         */
+        H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, FAIL)
+
+        entry_ptr->is_protected = FALSE;
+
+        /* if the entry is dirty, 'or' its flush_marker with the set flush flag,
+         * and then add it to the skip list if it isn't there already.
+         */
+
+        if ( entry_ptr->is_dirty ) {
+
+            entry_ptr->flush_marker |= set_flush_marker;
+
+            if ( ! (entry_ptr->in_slist) ) {
+
+                H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+            }
+        }
+
+        /* this implementation of the "deleted" option is a bit inefficient, as
+         * we re-insert the entry to be deleted into the replacement policy
+         * data structures, only to remove them again.  Depending on how often
+         * we do this, we may want to optimize a bit.
+         *
+         * On the other hand, this implementation is reasonably clean, and
+         * makes good use of existing code.
+         *                                             JRM - 5/19/04
+         */
+        if ( deleted ) {
+
+            /* the following first flush flag will never be used as we are
+             * calling H5C_flush_single_entry with both the
+             * H5C__FLUSH_CLEAR_ONLY_FLAG and H5C__FLUSH_INVALIDATE_FLAG flags.
+	     * However, it is needed for the function call.
+             */
+            hbool_t	dummy_first_flush = TRUE;
+            unsigned    flush_flags = (H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                         H5C__FLUSH_INVALIDATE_FLAG);
+
+	    /* we can't delete a pinned entry */
+	    HDassert ( ! (entry_ptr->is_pinned ) );
+
+            /* verify that the target entry is in the cache. */
+
+            H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
+
+            if ( test_entry_ptr == NULL ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "entry not in hash table?!?.")
+            }
+            else if ( test_entry_ptr != entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "hash table contains multiple entries for addr?!?.")
+            }
+
+            /* Pass along 'free file space' flag to cache client */
+
+            entry_ptr->free_file_space_on_destroy = free_file_space;
+
+            /* Set the "take ownership" flag for the flush, if needed */
+            if ( take_ownership) {
+
+                flush_flags |= H5C__TAKE_OWNERSHIP_FLAG;
+            }
+
+            if ( H5C_flush_single_entry(f,
+                                        primary_dxpl_id,
+                                        secondary_dxpl_id,
+                                        type,
+                                        addr,
+                                        flush_flags,
+                                        &dummy_first_flush,
+                                        TRUE) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush.")
+            }
+        }
+#ifdef H5_HAVE_PARALLEL
+        else if ( clear_entry ) {
+
+            /* the following first flush flag will never be used as we are
+             * calling H5C_flush_single_entry with the
+	     * H5C__FLUSH_CLEAR_ONLY_FLAG flag.  However, it is needed for
+	     * the function call.
+             */
+            hbool_t		dummy_first_flush = TRUE;
+
+            /* verify that the target entry is in the cache. */
+
+            H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
+
+            if ( test_entry_ptr == NULL ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "entry not in hash table?!?.")
+            }
+            else if ( test_entry_ptr != entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+                            "hash table contains multiple entries for addr?!?.")
+            }
+
+            if ( H5C_flush_single_entry(f,
+                                        primary_dxpl_id,
+                                        secondary_dxpl_id,
+                                        type,
+                                        addr,
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+                                        &dummy_first_flush,
+                                        TRUE) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear.")
+            }
+        }
+#endif /* H5_HAVE_PARALLEL */
+    }
+
+    H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "LRU sanity check failed.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_validate_resize_config()
+ *
+ * Purpose:	Run a sanity check on the specified sections of the
+ *		provided instance of struct H5C_auto_size_ctl_t.
+ *
+ *		Do nothing and return SUCCEED if no errors are detected,
+ *		and flag an error and return FAIL otherwise.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/23/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
+                           unsigned int tests)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if ( config_ptr == NULL ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.")
+    }
+
+    if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.")
+    }
+
+
+    if ( (tests & H5C_RESIZE_CFG__VALIDATE_GENERAL) != 0 ) {
+
+        if ( ( config_ptr->set_initial_size != TRUE ) &&
+             ( config_ptr->set_initial_size != FALSE ) ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                        "set_initial_size must be either TRUE or FALSE");
+        }
+
+        if ( config_ptr->max_size > H5C__MAX_MAX_CACHE_SIZE ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "max_size too big");
+        }
+
+        if ( config_ptr->min_size < H5C__MIN_MAX_CACHE_SIZE ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size too small");
+        }
+
+        if ( config_ptr->min_size > config_ptr->max_size ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size > max_size");
+        }
+
+        if ( ( config_ptr->set_initial_size ) &&
+             ( ( config_ptr->initial_size < config_ptr->min_size ) ||
+               ( config_ptr->initial_size > config_ptr->max_size ) ) ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                  "initial_size must be in the interval [min_size, max_size]");
+        }
+
+        if ( ( config_ptr->min_clean_fraction < (double)0.0f ) ||
+             ( config_ptr->min_clean_fraction > (double)1.0f ) ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                  "min_clean_fraction must be in the interval [0.0, 1.0]");
+        }
+
+        if ( config_ptr->epoch_length < H5C__MIN_AR_EPOCH_LENGTH ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too small");
+        }
+
+        if ( config_ptr->epoch_length > H5C__MAX_AR_EPOCH_LENGTH ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too big");
+        }
+    } /* H5C_RESIZE_CFG__VALIDATE_GENERAL */
+
+
+    if ( (tests & H5C_RESIZE_CFG__VALIDATE_INCREMENT) != 0 ) {
+
+        if ( ( config_ptr->incr_mode != H5C_incr__off ) &&
+             ( config_ptr->incr_mode != H5C_incr__threshold ) ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid incr_mode");
+        }
+
+        if ( config_ptr->incr_mode == H5C_incr__threshold ) {
+
+            if ( ( config_ptr->lower_hr_threshold < (double)0.0f ) ||
+                 ( config_ptr->lower_hr_threshold > (double)1.0f ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                    "lower_hr_threshold must be in the range [0.0, 1.0]");
+            }
+
+            if ( config_ptr->increment < (double)1.0f ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "increment must be greater than or equal to 1.0");
+            }
+
+            if ( ( config_ptr->apply_max_increment != TRUE ) &&
+                 ( config_ptr->apply_max_increment != FALSE ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "apply_max_increment must be either TRUE or FALSE");
+            }
+
+            /* no need to check max_increment, as it is a size_t,
+             * and thus must be non-negative.
+             */
+        } /* H5C_incr__threshold */
+
+        switch ( config_ptr->flash_incr_mode )
+        {
+            case H5C_flash_incr__off:
+                /* nothing to do here */
+                break;
+
+            case H5C_flash_incr__add_space:
+                if ( ( config_ptr->flash_multiple < (double)0.1f ) ||
+                     ( config_ptr->flash_multiple > (double)10.0f ) ) {
+
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                        "flash_multiple must be in the range [0.1, 10.0]");
+                }
+
+                if ( ( config_ptr->flash_threshold < (double)0.1f ) ||
+                     ( config_ptr->flash_threshold > (double)1.0f ) ) {
+
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                           "flash_threshold must be in the range [0.1, 1.0]");
+                }
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "Invalid flash_incr_mode");
+                break;
+        }
+    } /* H5C_RESIZE_CFG__VALIDATE_INCREMENT */
+
+
+    if ( (tests & H5C_RESIZE_CFG__VALIDATE_DECREMENT) != 0 ) {
+
+        if ( ( config_ptr->decr_mode != H5C_decr__off ) &&
+             ( config_ptr->decr_mode != H5C_decr__threshold ) &&
+             ( config_ptr->decr_mode != H5C_decr__age_out ) &&
+             ( config_ptr->decr_mode != H5C_decr__age_out_with_threshold )
+           ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid decr_mode");
+        }
+
+        if ( config_ptr->decr_mode == H5C_decr__threshold ) {
+
+            if ( config_ptr->upper_hr_threshold > (double)1.0f ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "upper_hr_threshold must be <= 1.0");
+            }
+
+            if ( ( config_ptr->decrement > (double)1.0f ) ||
+                 ( config_ptr->decrement < (double)0.0f ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "decrement must be in the interval [0.0, 1.0]");
+            }
+
+            /* no need to check max_decrement as it is a size_t
+             * and thus must be non-negative.
+             */
+        } /* H5C_decr__threshold */
+
+        if ( ( config_ptr->decr_mode == H5C_decr__age_out ) ||
+             ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold )
+           ) {
+
+            if ( config_ptr->epochs_before_eviction < 1 ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "epochs_before_eviction must be positive");
+            }
+
+            if ( config_ptr->epochs_before_eviction > H5C__MAX_EPOCH_MARKERS ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "epochs_before_eviction too big");
+            }
+
+            if ( ( config_ptr->apply_empty_reserve != TRUE ) &&
+                 ( config_ptr->apply_empty_reserve != FALSE ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "apply_empty_reserve must be either TRUE or FALSE");
+            }
+
+            if ( ( config_ptr->apply_empty_reserve ) &&
+                 ( ( config_ptr->empty_reserve > (double)1.0f ) ||
+                   ( config_ptr->empty_reserve < (double)0.0f ) ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                            "empty_reserve must be in the interval [0.0, 1.0]");
+            }
+
+            /* no need to check max_decrement as it is a size_t
+             * and thus must be non-negative.
+             */
+        } /* H5C_decr__age_out || H5C_decr__age_out_with_threshold */
+
+        if ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) {
+
+            if ( ( config_ptr->upper_hr_threshold > (double)1.0f ) ||
+                 ( config_ptr->upper_hr_threshold < (double)0.0f ) ) {
+
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                       "upper_hr_threshold must be in the interval [0.0, 1.0]");
+            }
+        } /* H5C_decr__age_out_with_threshold */
+
+    } /* H5C_RESIZE_CFG__VALIDATE_DECREMENT */
+
+
+    if ( (tests & H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) != 0 ) {
+
+        if ( ( config_ptr->incr_mode == H5C_incr__threshold )
+             &&
+             ( ( config_ptr->decr_mode == H5C_decr__threshold )
+               ||
+               ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold )
+             )
+             &&
+             ( config_ptr->lower_hr_threshold
+               >=
+               config_ptr->upper_hr_threshold
+             )
+           ) {
+
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+                        "conflicting threshold fields in config.")
+        }
+    } /* H5C_RESIZE_CFG__VALIDATE_INTERACTIONS */
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_validate_resize_config() */
+
+

+/*************************************************************************/
+/**************************** Private Functions: *************************/
+/*************************************************************************/
+
+/*-------------------------------------------------------------------------
+ *
+ * Function:	H5C__auto_adjust_cache_size
+ *
+ * Purpose:    	Obtain the current full cache hit rate, and compare it
+ *		with the hit rate thresholds for modifying cache size.
+ *		If one of the thresholds has been crossed, adjusts the
+ *		size of the cache accordingly.
+ *
+ *		The function then resets the full cache hit rate
+ *		statistics, and exits.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		an attempt to flush a protected item.
+ *
+ *
+ * Programmer:  John Mainzer, 10/7/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__auto_adjust_cache_size(H5F_t * f,
+                            hid_t primary_dxpl_id,
+                            hid_t secondary_dxpl_id,
+                            hbool_t write_permitted,
+                            hbool_t * first_flush_ptr)
+{
+    H5C_t *			cache_ptr = f->shared->cache;
+    herr_t			result;
+    hbool_t			inserted_epoch_marker = FALSE;
+    size_t			new_max_cache_size = 0;
+    size_t			old_max_cache_size = 0;
+    size_t			new_min_clean_size = 0;
+    size_t			old_min_clean_size = 0;
+    double			hit_rate;
+    enum H5C_resize_status	status = in_spec; /* will change if needed */
+    herr_t			ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->cache_accesses >=
+              (cache_ptr->resize_ctl).epoch_length );
+    HDassert( (double)0.0f <= (cache_ptr->resize_ctl).min_clean_fraction );
+    HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= (double)100.0f );
+
+    if ( !cache_ptr->resize_enabled ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.")
+    }
+
+    HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C_incr__off ) || \
+              ( (cache_ptr->resize_ctl).decr_mode != H5C_decr__off ) );
+
+    if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
+    }
+
+    HDassert( ( (double)0.0f <= hit_rate ) && ( hit_rate <= (double)1.0f ) );
+
+    switch ( (cache_ptr->resize_ctl).incr_mode )
+    {
+        case H5C_incr__off:
+            if ( cache_ptr->size_increase_possible ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                           "size_increase_possible but H5C_incr__off?!?!?")
+            }
+            break;
+
+        case H5C_incr__threshold:
+            if ( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ) {
+
+                if ( ! cache_ptr->size_increase_possible ) {
+
+                    status = increase_disabled;
+
+                } else if ( cache_ptr->max_cache_size >=
+                            (cache_ptr->resize_ctl).max_size ) {
+
+                    HDassert( cache_ptr->max_cache_size == \
+                              (cache_ptr->resize_ctl).max_size );
+                    status = at_max_size;
+
+                } else if ( ! cache_ptr->cache_full ) {
+
+                    status = not_full;
+
+                } else {
+
+                    new_max_cache_size = (size_t)
+                                     (((double)(cache_ptr->max_cache_size)) *
+                                      (cache_ptr->resize_ctl).increment);
+
+                    /* clip to max size if necessary */
+                    if ( new_max_cache_size >
+                         (cache_ptr->resize_ctl).max_size ) {
+
+                        new_max_cache_size = (cache_ptr->resize_ctl).max_size;
+                    }
+
+                    /* clip to max increment if necessary */
+                    if ( ( (cache_ptr->resize_ctl).apply_max_increment ) &&
+                         ( (cache_ptr->max_cache_size +
+                            (cache_ptr->resize_ctl).max_increment) <
+                           new_max_cache_size ) ) {
+
+                        new_max_cache_size = cache_ptr->max_cache_size +
+                                         (cache_ptr->resize_ctl).max_increment;
+                    }
+
+                    status = increase;
+                }
+            }
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.")
+    }
+
+    /* If the decr_mode is either age out or age out with threshold, we
+     * must run the marker maintenance code, whether we run the size
+     * reduction code or not.  We do this in two places -- here we
+     * insert a new marker if the number of active epoch markers is
+     * is less than the the current epochs before eviction, and after
+     * the ageout call, we cycle the markers.
+     *
+     * However, we can't call the ageout code or cycle the markers
+     * unless there was a full complement of markers in place on
+     * entry.  The inserted_epoch_marker flag is used to track this.
+     */
+
+    if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out )
+           ||
+           ( (cache_ptr->resize_ctl).decr_mode ==
+              H5C_decr__age_out_with_threshold
+           )
+         )
+         &&
+         ( cache_ptr->epoch_markers_active <
+           (cache_ptr->resize_ctl).epochs_before_eviction
+         )
+       ) {
+
+        result = H5C__autoadjust__ageout__insert_new_marker(cache_ptr);
+
+        if ( result != SUCCEED ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "can't insert new epoch marker.")
+
+        } else {
+
+            inserted_epoch_marker = TRUE;
+        }
+    }
+
+    /* don't run the cache size decrease code unless the cache size
+     * increase code is disabled, or the size increase code sees no need
+     * for action.  In either case, status == in_spec at this point.
+     */
+
+    if ( status == in_spec ) {
+
+        switch ( (cache_ptr->resize_ctl).decr_mode )
+        {
+            case H5C_decr__off:
+                break;
+
+            case H5C_decr__threshold:
+                if ( hit_rate > (cache_ptr->resize_ctl).upper_hr_threshold ) {
+
+                    if ( ! cache_ptr->size_decrease_possible ) {
+
+                        status = decrease_disabled;
+
+                    } else if ( cache_ptr->max_cache_size <=
+                                (cache_ptr->resize_ctl).min_size ) {
+
+                        HDassert( cache_ptr->max_cache_size ==
+                                  (cache_ptr->resize_ctl).min_size );
+                        status = at_min_size;
+
+                    } else {
+
+                        new_max_cache_size = (size_t)
+                                 (((double)(cache_ptr->max_cache_size)) *
+                                  (cache_ptr->resize_ctl).decrement);
+
+                        /* clip to min size if necessary */
+                        if ( new_max_cache_size <
+                             (cache_ptr->resize_ctl).min_size ) {
+
+                            new_max_cache_size =
+                                (cache_ptr->resize_ctl).min_size;
+                        }
+
+                        /* clip to max decrement if necessary */
+                        if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) &&
+                             ( ((cache_ptr->resize_ctl).max_decrement +
+                                new_max_cache_size) <
+                               cache_ptr->max_cache_size ) ) {
+
+                            new_max_cache_size = cache_ptr->max_cache_size -
+                                         (cache_ptr->resize_ctl).max_decrement;
+                        }
+
+                        status = decrease;
+                    }
+                }
+                break;
+
+            case H5C_decr__age_out_with_threshold:
+            case H5C_decr__age_out:
+                if ( ! inserted_epoch_marker ) {
+
+                    if ( ! cache_ptr->size_decrease_possible ) {
+
+                        status = decrease_disabled;
+
+                    } else {
+
+                        result = H5C__autoadjust__ageout(f,
+                                                         hit_rate,
+                                                         &status,
+                                                         &new_max_cache_size,
+                                                         primary_dxpl_id,
+                                                         secondary_dxpl_id,
+                                                         write_permitted,
+                                                         first_flush_ptr);
+
+                        if ( result != SUCCEED ) {
+
+                            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                        "ageout code failed.")
+                        }
+                    }
+                }
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.")
+        }
+    }
+
+    /* cycle the epoch markers here if appropriate */
+    if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out )
+           ||
+           ( (cache_ptr->resize_ctl).decr_mode ==
+              H5C_decr__age_out_with_threshold
+           )
+         )
+         &&
+         ( ! inserted_epoch_marker )
+       ) {
+
+        /* move last epoch marker to the head of the LRU list */
+        result = H5C__autoadjust__ageout__cycle_epoch_marker(cache_ptr);
+
+        if ( result != SUCCEED ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "error cycling epoch marker.")
+        }
+    }
+
+    if ( ( status == increase ) || ( status == decrease ) ) {
+
+        old_max_cache_size = cache_ptr->max_cache_size;
+        old_min_clean_size = cache_ptr->min_clean_size;
+
+        new_min_clean_size = (size_t)
+                             ((double)new_max_cache_size *
+                              ((cache_ptr->resize_ctl).min_clean_fraction));
+
+        /* new_min_clean_size is of size_t, and thus must be non-negative.
+         * Hence we have
+         *
+         * 	( 0 <= new_min_clean_size ).
+         *
+ 	 * by definition.
+         */
+        HDassert( new_min_clean_size <= new_max_cache_size );
+        HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size );
+        HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size );
+
+        cache_ptr->max_cache_size = new_max_cache_size;
+        cache_ptr->min_clean_size = new_min_clean_size;
+
+        if ( status == increase ) {
+
+            cache_ptr->cache_full = FALSE;
+
+        } else if ( status == decrease ) {
+
+            cache_ptr->size_decreased = TRUE;
+        }
+
+	/* update flash cache size increase fields as appropriate */
+	if ( cache_ptr->flash_size_increase_possible ) {
+
+            switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+            {
+                case H5C_flash_incr__off:
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                     "flash_size_increase_possible but H5C_flash_incr__off?!")
+                    break;
+
+                case H5C_flash_incr__add_space:
+                    cache_ptr->flash_size_increase_threshold =
+                        (size_t)
+                        (((double)(cache_ptr->max_cache_size)) *
+                         ((cache_ptr->resize_ctl).flash_threshold));
+                     break;
+
+                default: /* should be unreachable */
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                "Unknown flash_incr_mode?!?!?.")
+                    break;
+            }
+        }
+    }
+
+    if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
+
+        (*((cache_ptr->resize_ctl).rpt_fcn))
+            (cache_ptr,
+             H5C__CURR_AUTO_RESIZE_RPT_FCN_VER,
+             hit_rate,
+             status,
+             old_max_cache_size,
+             new_max_cache_size,
+             old_min_clean_size,
+             new_min_clean_size);
+    }
+
+    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+        /* this should be impossible... */
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "H5C_reset_cache_hit_rate_stats failed.")
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__auto_adjust_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout
+ *
+ * Purpose:     Implement the ageout automatic cache size decrement
+ *		algorithm.  Note that while this code evicts aged out
+ *		entries, the code does not change the maximum cache size.
+ *		Instead, the function simply computes the new value (if
+ *		any change is indicated) and reports this value in
+ *		*new_max_cache_size_ptr.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *              an attempt to flush a protected item.
+ *
+ *
+ * Programmer:  John Mainzer, 11/18/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout(H5F_t * f,
+                        double hit_rate,
+                        enum H5C_resize_status * status_ptr,
+                        size_t * new_max_cache_size_ptr,
+                        hid_t primary_dxpl_id,
+                        hid_t secondary_dxpl_id,
+                        hbool_t write_permitted,
+                        hbool_t * first_flush_ptr)
+{
+    H5C_t *     cache_ptr = f->shared->cache;
+    herr_t	result;
+    size_t	test_size;
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( ( status_ptr ) && ( *status_ptr == in_spec ) );
+    HDassert( ( new_max_cache_size_ptr ) && ( *new_max_cache_size_ptr == 0 ) );
+
+    /* remove excess epoch markers if any */
+    if ( cache_ptr->epoch_markers_active >
+         (cache_ptr->resize_ctl).epochs_before_eviction ) {
+
+        result = H5C__autoadjust__ageout__remove_excess_markers(cache_ptr);
+
+        if ( result != SUCCEED ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "can't remove excess epoch markers.")
+        }
+    }
+
+    if ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out )
+         ||
+         ( ( (cache_ptr->resize_ctl).decr_mode ==
+              H5C_decr__age_out_with_threshold
+               )
+           &&
+           ( hit_rate >= (cache_ptr->resize_ctl).upper_hr_threshold )
+         )
+       ) {
+
+        if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).min_size ){
+
+            /* evict aged out cache entries if appropriate... */
+            if(H5C__autoadjust__ageout__evict_aged_out_entries(f, primary_dxpl_id,
+                    secondary_dxpl_id, write_permitted, first_flush_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error flushing aged out entries.")
+
+            /* ... and then reduce cache size if appropriate */
+            if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+
+                if ( (cache_ptr->resize_ctl).apply_empty_reserve ) {
+
+                    test_size = (size_t)(((double)cache_ptr->index_size) /
+                                (1 - (cache_ptr->resize_ctl).empty_reserve));
+
+                    if ( test_size < cache_ptr->max_cache_size ) {
+
+                        *status_ptr = decrease;
+                        *new_max_cache_size_ptr = test_size;
+                    }
+                } else {
+
+                    *status_ptr = decrease;
+                    *new_max_cache_size_ptr = cache_ptr->index_size;
+                }
+
+                if ( *status_ptr == decrease ) {
+
+                    /* clip to min size if necessary */
+                    if ( *new_max_cache_size_ptr <
+                         (cache_ptr->resize_ctl).min_size ) {
+
+                        *new_max_cache_size_ptr =
+                                (cache_ptr->resize_ctl).min_size;
+                    }
+
+                    /* clip to max decrement if necessary */
+                    if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) &&
+                         ( ((cache_ptr->resize_ctl).max_decrement +
+                            *new_max_cache_size_ptr) <
+                           cache_ptr->max_cache_size ) ) {
+
+                        *new_max_cache_size_ptr = cache_ptr->max_cache_size -
+                                         (cache_ptr->resize_ctl).max_decrement;
+                    }
+                }
+            }
+        } else {
+
+            *status_ptr = at_min_size;
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout__cycle_epoch_marker
+ *
+ * Purpose:     Remove the oldest epoch marker from the LRU list,
+ *		and reinsert it at the head of the LRU list.  Also
+ *		remove the epoch marker's index from the head of the
+ *		ring buffer, and re-insert it at the tail of the ring
+ *		buffer.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 11/22/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr)
+{
+    herr_t                      ret_value = SUCCEED;      /* Return value */
+    int i;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if ( cache_ptr->epoch_markers_active <= 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "No active epoch markers on entry?!?!?.")
+    }
+
+    /* remove the last marker from both the ring buffer and the LRU list */
+
+    i = cache_ptr->epoch_marker_ringbuf[cache_ptr->epoch_marker_ringbuf_first];
+
+    cache_ptr->epoch_marker_ringbuf_first =
+            (cache_ptr->epoch_marker_ringbuf_first + 1) %
+            (H5C__MAX_EPOCH_MARKERS + 1);
+
+    cache_ptr->epoch_marker_ringbuf_size -= 1;
+
+    if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
+    }
+
+    if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
+    }
+
+    H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
+                    (cache_ptr)->LRU_head_ptr, \
+                    (cache_ptr)->LRU_tail_ptr, \
+                    (cache_ptr)->LRU_list_len, \
+                    (cache_ptr)->LRU_list_size, \
+                    (FAIL))
+
+    /* now, re-insert it at the head of the LRU list, and at the tail of
+     * the ring buffer.
+     */
+
+    HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
+    HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
+    HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL );
+
+    cache_ptr->epoch_marker_ringbuf_last =
+        (cache_ptr->epoch_marker_ringbuf_last + 1) %
+        (H5C__MAX_EPOCH_MARKERS + 1);
+
+    (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i;
+
+    cache_ptr->epoch_marker_ringbuf_size += 1;
+
+    if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.")
+    }
+
+    H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \
+                     (cache_ptr)->LRU_head_ptr, \
+                     (cache_ptr)->LRU_tail_ptr, \
+                     (cache_ptr)->LRU_list_len, \
+                     (cache_ptr)->LRU_list_size, \
+                     (FAIL))
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout__cycle_epoch_marker() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout__evict_aged_out_entries
+ *
+ * Purpose:     Evict clean entries in the cache that haven't
+ *		been accessed for at least
+ *              (cache_ptr->resize_ctl).epochs_before_eviction epochs,
+ *      	and flush dirty entries that haven't been accessed for
+ *		that amount of time.
+ *
+ *		Depending on configuration, the function will either
+ *		flush or evict all such entries, or all such entries it
+ *		encounters until it has freed the maximum amount of space
+ *		allowed under the maximum decrement.
+ *
+ *		If we are running in parallel mode, writes may not be
+ *		permitted.  If so, the function simply skips any dirty
+ *		entries it may encounter.
+ *
+ *		The function makes no attempt to maintain the minimum
+ *		clean size, as there is no guarantee that the cache size
+ *		will be changed.
+ *
+ *		If there is no cache size change, the minimum clean size
+ *		constraint will be met through a combination of clean
+ *		entries and free space in the cache.
+ *
+ *		If there is a cache size reduction, the minimum clean size
+ *		will be re-calculated, and will be enforced the next time
+ *		we have to make space in the cache.
+ *
+ *              The primary_dxpl_id and secondary_dxpl_id parameters
+ *              specify the dxpl_ids used depending on the value of
+ *		*first_flush_ptr.  The idea is to use the primary_dxpl_id
+ *		on the first write in a sequence of writes, and to use
+ *		the secondary_dxpl_id on all subsequent writes.
+ *
+ *              This is useful in the metadata cache, but may not be
+ *		needed elsewhere.  If so, just use the same dxpl_id for
+ *		both parameters.
+ *
+ *              Observe that this function cannot occasion a read.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 11/22/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
+                                                hid_t   primary_dxpl_id,
+                                                hid_t   secondary_dxpl_id,
+                                                hbool_t write_permitted,
+                                                hbool_t * first_flush_ptr)
+{
+    H5C_t *		cache_ptr = f->shared->cache;
+    herr_t              result;
+    size_t		eviction_size_limit;
+    size_t		bytes_evicted = 0;
+    hbool_t		prev_is_dirty = FALSE;
+    H5C_cache_entry_t * entry_ptr;
+    H5C_cache_entry_t * next_ptr;
+    H5C_cache_entry_t * prev_ptr;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* if there is a limit on the amount that the cache size can be decrease
+     * in any one round of the cache size reduction algorithm, load that
+     * limit into eviction_size_limit.  Otherwise, set eviction_size_limit
+     * to the equivalent of infinity.  The current size of the index will
+     * do nicely.
+     */
+    if ( (cache_ptr->resize_ctl).apply_max_decrement ) {
+
+        eviction_size_limit = (cache_ptr->resize_ctl).max_decrement;
+
+    } else {
+
+        eviction_size_limit = cache_ptr->index_size; /* i.e. infinity */
+    }
+
+    if ( write_permitted ) {
+
+        entry_ptr = cache_ptr->LRU_tail_ptr;
+
+        while ( ( entry_ptr != NULL ) &&
+                ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
+                ( bytes_evicted < eviction_size_limit ) )
+        {
+            HDassert( ! (entry_ptr->is_protected) );
+
+	    next_ptr = entry_ptr->next;
+            prev_ptr = entry_ptr->prev;
+
+	    if ( prev_ptr != NULL ) {
+
+                prev_is_dirty = prev_ptr->is_dirty;
+            }
+
+            if ( entry_ptr->is_dirty ) {
+
+                result = H5C_flush_single_entry(f,
+                                                primary_dxpl_id,
+                                                secondary_dxpl_id,
+                                                entry_ptr->type,
+                                                entry_ptr->addr,
+                                                H5C__NO_FLAGS_SET,
+                                                first_flush_ptr,
+                                                FALSE);
+            } else {
+
+                bytes_evicted += entry_ptr->size;
+
+                result = H5C_flush_single_entry(f,
+                                                primary_dxpl_id,
+                                                secondary_dxpl_id,
+                                                entry_ptr->type,
+                                                entry_ptr->addr,
+                                                H5C__FLUSH_INVALIDATE_FLAG,
+                                                first_flush_ptr,
+                                                TRUE);
+            }
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                            "unable to flush entry")
+            }
+
+            if ( prev_ptr != NULL ) {
+#ifndef NDEBUG
+                if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+                    /* something horrible has happened to *prev_ptr --
+                     * scream and die.
+                     */
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                "*prev_ptr corrupt")
+
+                } else
+#endif /* NDEBUG */
+		if ( ( prev_ptr->is_dirty != prev_is_dirty )
+                         ||
+                         ( prev_ptr->next != next_ptr )
+                         ||
+                         ( prev_ptr->is_protected )
+                         ||
+                         ( prev_ptr->is_pinned ) ) {
+
+                    /* something has happened to the LRU -- start over
+		     * from the tail.
+                     */
+                    entry_ptr = cache_ptr->LRU_tail_ptr;
+
+                } else {
+
+                    entry_ptr = prev_ptr;
+
+                }
+	    } else {
+
+		entry_ptr = NULL;
+
+	    }
+        } /* end while */
+
+        /* for now at least, don't bother to maintain the minimum clean size,
+         * as the cache should now be less than its maximum size.  Due to
+         * the vaguries of the cache size reduction algorthim, we may not
+         * reduce the size of the cache.
+         *
+         * If we do, we will calculate a new minimum clean size, which will
+         * be enforced the next time we try to make space in the cache.
+         *
+         * If we don't, no action is necessary, as we have just evicted and/or
+         * or flushed a bunch of entries and therefore the sum of the clean
+         * and free space in the cache must be greater than or equal to the
+         * min clean space requirement (assuming that requirement was met on
+         * entry).
+         */
+
+    } else /* ! write_permitted */  {
+
+        /* since we are not allowed to write, all we can do is evict
+         * any clean entries that we may encounter before we either
+         * hit the eviction size limit, or encounter the epoch marker.
+         *
+         * If we are operating read only, this isn't an issue, as there
+         * will not be any dirty entries.
+         *
+         * If we are operating in R/W mode, all the dirty entries we
+         * skip will be flushed the next time we attempt to make space
+         * when writes are permitted.  This may have some local
+         * performance implications, but it shouldn't cause any net
+         * slowdown.
+         */
+
+        HDassert( H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS );
+
+        entry_ptr = cache_ptr->LRU_tail_ptr;
+
+        while ( ( entry_ptr != NULL ) &&
+                ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
+                ( bytes_evicted < eviction_size_limit ) )
+        {
+            HDassert( ! (entry_ptr->is_protected) );
+
+            prev_ptr = entry_ptr->prev;
+
+            if ( ! (entry_ptr->is_dirty) ) {
+
+                result = H5C_flush_single_entry(f,
+                                                primary_dxpl_id,
+                                                secondary_dxpl_id,
+                                                entry_ptr->type,
+                                                entry_ptr->addr,
+                                                H5C__FLUSH_INVALIDATE_FLAG,
+                                                first_flush_ptr,
+                                                TRUE);
+
+                if ( result < 0 ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                "unable to flush clean entry")
+                }
+            }
+            /* just skip the entry if it is dirty, as we can't do
+             * anything with it now since we can't write.
+             */
+
+            entry_ptr = prev_ptr;
+
+        } /* end while */
+    }
+
+    if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+
+        cache_ptr->cache_full = FALSE;
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout__evict_aged_out_entries() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout__insert_new_marker
+ *
+ * Purpose:     Find an unused marker cache entry, mark it as used, and
+ *		insert it at the head of the LRU list.  Also add the
+ *		marker's index in the epoch_markers array.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 11/19/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr)
+{
+    herr_t                      ret_value = SUCCEED;      /* Return value */
+    int i;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if ( cache_ptr->epoch_markers_active >=
+         (cache_ptr->resize_ctl).epochs_before_eviction ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "Already have a full complement of markers.")
+    }
+
+    /* find an unused marker */
+    i = 0;
+    while ( ( (cache_ptr->epoch_marker_active)[i] ) &&
+            ( i < H5C__MAX_EPOCH_MARKERS ) )
+    {
+        i++;
+    }
+
+    if(i >= H5C__MAX_EPOCH_MARKERS)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't find unused marker.")
+
+    HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
+    HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
+    HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL );
+
+    (cache_ptr->epoch_marker_active)[i] = TRUE;
+
+    cache_ptr->epoch_marker_ringbuf_last =
+        (cache_ptr->epoch_marker_ringbuf_last + 1) %
+        (H5C__MAX_EPOCH_MARKERS + 1);
+
+    (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i;
+
+    cache_ptr->epoch_marker_ringbuf_size += 1;
+
+    if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.")
+    }
+
+    H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \
+                     (cache_ptr)->LRU_head_ptr, \
+                     (cache_ptr)->LRU_tail_ptr, \
+                     (cache_ptr)->LRU_list_len, \
+                     (cache_ptr)->LRU_list_size, \
+                     (FAIL))
+
+    cache_ptr->epoch_markers_active += 1;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout__insert_new_marker() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout__remove_all_markers
+ *
+ * Purpose:     Remove all epoch markers from the LRU list and mark them
+ *		as inactive.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 11/22/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr)
+{
+    herr_t                      ret_value = SUCCEED;      /* Return value */
+    int i;
+    int ring_buf_index;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    while ( cache_ptr->epoch_markers_active > 0 )
+    {
+        /* get the index of the last epoch marker in the LRU list
+         * and remove it from the ring buffer.
+         */
+
+        ring_buf_index = cache_ptr->epoch_marker_ringbuf_first;
+        i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index];
+
+        cache_ptr->epoch_marker_ringbuf_first =
+            (cache_ptr->epoch_marker_ringbuf_first + 1) %
+            (H5C__MAX_EPOCH_MARKERS + 1);
+
+        cache_ptr->epoch_marker_ringbuf_size -= 1;
+
+        if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
+        }
+
+        if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
+        }
+
+        /* remove the epoch marker from the LRU list */
+        H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
+                        (cache_ptr)->LRU_head_ptr, \
+                        (cache_ptr)->LRU_tail_ptr, \
+                        (cache_ptr)->LRU_list_len, \
+                        (cache_ptr)->LRU_list_size, \
+                        (FAIL))
+
+        /* mark the epoch marker as unused. */
+        (cache_ptr->epoch_marker_active)[i] = FALSE;
+
+        HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
+        HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
+        HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL );
+
+        /* decrement the number of active epoch markers */
+        cache_ptr->epoch_markers_active -= 1;
+
+        HDassert( cache_ptr->epoch_markers_active == \
+                  cache_ptr->epoch_marker_ringbuf_size );
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout__remove_all_markers() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__autoadjust__ageout__remove_excess_markers
+ *
+ * Purpose:     Remove epoch markers from the end of the LRU list and
+ *		mark them as inactive until the number of active markers
+ *		equals the the current value of
+ *		(cache_ptr->resize_ctl).epochs_before_eviction.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 11/19/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr)
+{
+    herr_t	ret_value = SUCCEED;      /* Return value */
+    int		i;
+    int		ring_buf_index;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if ( cache_ptr->epoch_markers_active <=
+         (cache_ptr->resize_ctl).epochs_before_eviction ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "no excess markers on entry.")
+    }
+
+    while ( cache_ptr->epoch_markers_active >
+            (cache_ptr->resize_ctl).epochs_before_eviction )
+    {
+        /* get the index of the last epoch marker in the LRU list
+         * and remove it from the ring buffer.
+         */
+
+        ring_buf_index = cache_ptr->epoch_marker_ringbuf_first;
+        i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index];
+
+        cache_ptr->epoch_marker_ringbuf_first =
+            (cache_ptr->epoch_marker_ringbuf_first + 1) %
+            (H5C__MAX_EPOCH_MARKERS + 1);
+
+        cache_ptr->epoch_marker_ringbuf_size -= 1;
+
+        if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
+        }
+
+        if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
+        }
+
+        /* remove the epoch marker from the LRU list */
+        H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
+                        (cache_ptr)->LRU_head_ptr, \
+                        (cache_ptr)->LRU_tail_ptr, \
+                        (cache_ptr)->LRU_list_len, \
+                        (cache_ptr)->LRU_list_size, \
+                        (FAIL))
+
+        /* mark the epoch marker as unused. */
+        (cache_ptr->epoch_marker_active)[i] = FALSE;
+
+        HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
+        HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
+        HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL );
+
+        /* decrement the number of active epoch markers */
+        cache_ptr->epoch_markers_active -= 1;
+
+        HDassert( cache_ptr->epoch_markers_active == \
+                  cache_ptr->epoch_marker_ringbuf_size );
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__autoadjust__ageout__remove_excess_markers() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__flash_increase_cache_size
+ *
+ * Purpose:     If there is not at least new_entry_size - old_entry_size
+ *              bytes of free space in the cache and the current
+ *              max_cache_size is less than (cache_ptr->resize_ctl).max_size,
+ *              perform a flash increase in the cache size and then reset
+ *              the full cache hit rate statistics, and exit.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 12/31/07
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__flash_increase_cache_size(H5C_t * cache_ptr,
+                               size_t old_entry_size,
+                               size_t new_entry_size)
+{
+    size_t                     new_max_cache_size = 0;
+    size_t                     old_max_cache_size = 0;
+    size_t                     new_min_clean_size = 0;
+    size_t                     old_min_clean_size = 0;
+    size_t                     space_needed;
+    enum H5C_resize_status     status = flash_increase;  /* may change */
+    double                     hit_rate;
+    herr_t                     ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->flash_size_increase_possible );
+    HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold );
+    HDassert( old_entry_size < new_entry_size );
+
+    if ( old_entry_size >= new_entry_size ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "old_entry_size >= new_entry_size")
+    }
+
+    space_needed = new_entry_size - old_entry_size;
+
+    if ( ( (cache_ptr->index_size + space_needed) >
+                            cache_ptr->max_cache_size ) &&
+         ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).max_size ) ) {
+
+        /* we have work to do */
+
+        switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+        {
+            case H5C_flash_incr__off:
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                   "flash_size_increase_possible but H5C_flash_incr__off?!")
+                break;
+
+            case H5C_flash_incr__add_space:
+                if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+
+                    HDassert( (cache_ptr->max_cache_size - cache_ptr->index_size)
+                               < space_needed );
+                    space_needed -= cache_ptr->max_cache_size -
+			            cache_ptr->index_size;
+                }
+                space_needed =
+                    (size_t)(((double)space_needed) *
+                             (cache_ptr->resize_ctl).flash_multiple);
+
+                new_max_cache_size = cache_ptr->max_cache_size + space_needed;
+
+                break;
+
+            default: /* should be unreachable */
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Unknown flash_incr_mode?!?!?.")
+                break;
+        }
+
+        if ( new_max_cache_size > (cache_ptr->resize_ctl).max_size ) {
+
+            new_max_cache_size = (cache_ptr->resize_ctl).max_size;
+        }
+
+        HDassert( new_max_cache_size > cache_ptr->max_cache_size );
+
+        new_min_clean_size = (size_t)
+                             ((double)new_max_cache_size *
+                              ((cache_ptr->resize_ctl).min_clean_fraction));
+
+        HDassert( new_min_clean_size <= new_max_cache_size );
+
+        old_max_cache_size = cache_ptr->max_cache_size;
+        old_min_clean_size = cache_ptr->min_clean_size;
+
+        cache_ptr->max_cache_size = new_max_cache_size;
+        cache_ptr->min_clean_size = new_min_clean_size;
+
+        /* update flash cache size increase fields as appropriate */
+        HDassert ( cache_ptr->flash_size_increase_possible );
+
+        switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+        {
+            case H5C_flash_incr__off:
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "flash_size_increase_possible but H5C_flash_incr__off?!")
+                break;
+
+            case H5C_flash_incr__add_space:
+                cache_ptr->flash_size_increase_threshold =
+                    (size_t)
+                    (((double)(cache_ptr->max_cache_size)) *
+                     ((cache_ptr->resize_ctl).flash_threshold));
+                break;
+
+            default: /* should be unreachable */
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Unknown flash_incr_mode?!?!?.")
+                break;
+        }
+
+        /* note that we don't cycle the epoch markers.  We can
+	 * argue either way as to whether we should, but for now
+	 * we don't.
+	 */
+
+        if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
+
+            /* get the hit rate for the reporting function.  Should still
+             * be good as we havent reset the hit rate statistics.
+             */
+            if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
+            }
+
+            (*((cache_ptr->resize_ctl).rpt_fcn))
+                (cache_ptr,
+                 H5C__CURR_AUTO_RESIZE_RPT_FCN_VER,
+                 hit_rate,
+                 status,
+                 old_max_cache_size,
+                 new_max_cache_size,
+                 old_min_clean_size,
+                 new_min_clean_size);
+        }
+
+        if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+            /* this should be impossible... */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "H5C_reset_cache_hit_rate_stats failed.")
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__flash_increase_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_invalidate_cache
+ *
+ * Purpose:	Flush and destroy the entries contained in the target
+ *		cache.
+ *
+ *		If the cache contains protected entries, the function will
+ *		fail, as protected entries cannot be either flushed or
+ *		destroyed.  However all unprotected entries should be
+ *		flushed and destroyed before the function returns failure.
+ *
+ *		While pinned entries can usually be flushed, they cannot
+ *		be destroyed.  However, they should be unpinned when all
+ *		the entries that reference them have been destroyed (thus
+ *		reduding the pinned entry's reference count to 0, allowing
+ *		it to be unpinned).
+ *
+ *		If pinned entries are present, the function makes repeated
+ *		passes through the cache, flushing all dirty entries
+ *		(including the pinned dirty entries where permitted) and
+ *		destroying all unpinned entries.  This process is repeated
+ *		until either the cache is empty, or the number of pinned
+ *		entries stops decreasing on each pass.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the flush (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		a request to flush all items and something was protected.
+ *
+ * Programmer:  John Mainzer
+ *		3/24/065
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_flush_invalidate_cache(H5F_t * f,
+                           hid_t    primary_dxpl_id,
+                           hid_t    secondary_dxpl_id,
+			   unsigned flags)
+{
+    H5C_t *		cache_ptr = f->shared->cache;
+    herr_t              status;
+    hbool_t		first_flush = TRUE;
+    int32_t		protected_entries = 0;
+    int32_t		i;
+    int32_t		cur_pel_len;
+    int32_t		old_pel_len;
+    int32_t		passes = 0;
+    unsigned		cooked_flags;
+    H5SL_node_t * 	node_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	next_entry_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    int64_t		actual_slist_len = 0;
+    int64_t		initial_slist_len = 0;
+    size_t              actual_slist_size = 0;
+    size_t              initial_slist_size = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->slist_ptr );
+
+    /* Filter out the flags that are not relevant to the flush/invalidate.
+     * At present, only the H5C__FLUSH_CLEAR_ONLY_FLAG is kept.
+     */
+    cooked_flags = flags & H5C__FLUSH_CLEAR_ONLY_FLAG;
+
+    /* remove ageout markers if present */
+    if ( cache_ptr->epoch_markers_active > 0 ) {
+
+        status = H5C__autoadjust__ageout__remove_all_markers(cache_ptr);
+
+        if ( status != SUCCEED ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "error removing all epoch markers.")
+        }
+    }
+
+    /* The flush proceedure here is a bit strange.
+     *
+     * In the outer while loop we make at least one pass through the
+     * cache, and then repeat until either all the pinned entries
+     * unpin themselves, or until the number of pinned entries stops
+     * declining.  In this later case, we scream and die.
+     *
+     * Since the fractal heap can dirty, resize, and/or move entries
+     * in is flush callback, it is possible that the cache will still
+     * contain dirty entries at this point.  If so, we must make up to
+     * H5C__MAX_PASSES_ON_FLUSH more passes through the skip list
+     * to allow it to empty.  If is is not empty at this point, we again
+     * scream and die.
+     *
+     * Further, since clean entries can be dirtied, resized, and/or moved
+     * as the result of a flush call back (either the entries own, or that
+     * for some other cache entry), we can no longer promise to flush
+     * the cache entries in increasing address order.
+     *
+     * Instead, we just do the best we can -- making a pass through
+     * the skip list, and then a pass through the "clean" entries, and
+     * then repeating as needed.  Thus it is quite possible that an
+     * entry will be evicted from the cache only to be re-loaded later
+     * in the flush process (From what Quincey tells me, the pin
+     * mechanism makes this impossible, but even it it is true now,
+     * we shouldn't count on it in the future.)
+     *
+     * The bottom line is that entries will probably be flushed in close
+     * to increasing address order, but there are no guarantees.
+     */
+
+    cur_pel_len = cache_ptr->pel_len;
+    old_pel_len = cache_ptr->pel_len;
+
+    while ( cache_ptr->index_len > 0 )
+    {
+	/* first, try to flush-destroy any dirty entries.   Do this by
+	 * making a scan through the slist.  Note that new dirty entries
+	 * may be created by the flush call backs.  Thus it is possible
+	 * that the slist will not be empty after we finish the scan.
+	 */
+
+        if ( cache_ptr->slist_len == 0 ) {
+
+            node_ptr = NULL;
+            HDassert( cache_ptr->slist_size == 0 );
+
+        } else {
+
+            node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+            if ( node_ptr == NULL ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "slist_len != 0 && node_ptr == NULL");
+            }
+
+            next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+            if ( next_entry_ptr == NULL ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "next_entry_ptr == NULL 1 ?!?!");
+            }
+#ifndef NDEBUG
+	    HDassert( next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+            HDassert( next_entry_ptr->is_dirty );
+            HDassert( next_entry_ptr->in_slist );
+
+        }
+
+#if H5C_DO_SANITY_CHECKS
+        /* Depending on circumstances, H5C_flush_single_entry() will
+         * remove dirty entries from the slist as it flushes them.
+         * Thus for sanity checks we must make note of the initial
+         * slist length and size before we do any flushes.
+         */
+        initial_slist_len = cache_ptr->slist_len;
+        initial_slist_size = cache_ptr->slist_size;
+
+        /* There is also the possibility that entries will be
+         * dirtied, resized, and/or moved as the result of
+         * calls to the flush callbacks.  We use the slist_len_increase
+         * and slist_size_increase increase fields in struct H5C_t
+         * to track these changes for purpose of sanity checking.
+         * To this end, we must zero these fields before we start
+         * the pass through the slist.
+         */
+        cache_ptr->slist_len_increase = 0;
+        cache_ptr->slist_size_increase = 0;
+
+	/* Finally, reset the actual_slist_len and actual_slist_size
+	 * fields to zero, as these fields are used to accumulate
+	 * the slist lenght and size that we see as we scan through
+	 * the slist.
+	 */
+	actual_slist_len = 0;
+	actual_slist_size = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        while ( node_ptr != NULL )
+        {
+            entry_ptr = next_entry_ptr;
+
+            /* With the advent of the fractal heap, it is possible
+             * that the flush callback will dirty and/or resize
+             * other entries in the cache.  In particular, while
+             * Quincey has promised me that this will never happen,
+             * it is possible that the flush callback for an
+             * entry may protect an entry that is not in the cache,
+             * perhaps causing the cache to flush and possibly
+             * evict the entry associated with node_ptr to make
+             * space for the new entry.
+             *
+             * Thus we do a bit of extra sanity checking on entry_ptr,
+             * and break out of this scan of the skip list if we
+             * detect major problems.  We have a bit of leaway on the
+             * number of passes though the skip list, so this shouldn't
+             * be an issue in the flush in and of itself, as it should
+             * be all but impossible for this to happen more than once
+             * in any flush.
+             *
+             * Observe that that breaking out of the scan early
+             * shouldn't break the sanity checks just after the end
+	     * of this while loop.
+	     *
+	     * If an entry has merely been marked clean and removed from
+	     * the s-list, we simply break out of the scan.
+	     *
+	     * If the entry has been evicted, we flag an error and
+	     * exit.
+             */
+#ifndef NDEBUG
+	    if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "entry_ptr->magic is invalid ?!?!");
+
+	    } else
+#endif /* NDEBUG */
+	    if ( ( ! entry_ptr->is_dirty ) ||
+                 ( ! entry_ptr->in_slist ) ) {
+
+                /* the s-list has been modified out from under us.
+	         * break out of the loop.
+                 */
+                break;
+            }
+
+            /* increment node pointer now, before we delete its target
+             * from the slist.
+             */
+            node_ptr = H5SL_next(node_ptr);
+            if ( node_ptr != NULL ) {
+
+                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+                if ( next_entry_ptr == NULL ) {
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                "next_entry_ptr == NULL 2 ?!?!");
+	        }
+#ifndef NDEBUG
+		HDassert( next_entry_ptr->magic ==
+                          H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+                HDassert( next_entry_ptr->is_dirty );
+                HDassert( next_entry_ptr->in_slist );
+
+            } else {
+
+                next_entry_ptr = NULL;
+	    }
+
+            /* Note that we now remove nodes from the slist as we flush
+	     * the associated entries, instead of leaving them there
+	     * until we are done, and then destroying all nodes in
+             * the slist.
+             *
+             * While this optimization used to be easy, with the possibility
+             * of new entries being added to the slist in the midst of the
+             * flush, we must keep the slist in cannonical form at all
+             * times.
+             */
+
+            HDassert( entry_ptr != NULL );
+            HDassert( entry_ptr->in_slist );
+
+#if H5C_DO_SANITY_CHECKS
+            /* update actual_slist_len & actual_slist_size before
+	     * the flush.  Note that the entry will be removed
+	     * from the slist after the flush, and thus may be
+	     * resized by the flush callback.  This is OK, as
+	     * we will catch the size delta in
+	     * cache_ptr->slist_size_increase.
+	     *
+	     * Note that we include pinned entries in this count, even
+	     * though we will not actually flush them.
+	     */
+            actual_slist_len++;
+            actual_slist_size += entry_ptr->size;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+            if ( entry_ptr->is_protected ) {
+
+                /* we have major problems -- but lets flush
+                 * everything we can before we flag an error.
+                 */
+	        protected_entries++;
+
+            } else if ( entry_ptr->is_pinned ) {
+
+		/* Test to see if we are can flush the entry now.
+                 * If we can, go ahead and flush, but don't tell
+                 * H5C_flush_single_entry() to destroy the entry
+                 * as pinned entries can't be evicted.
+                 */
+		if ( TRUE ) { /* When we get to multithreaded cache,
+			       * we will need either locking code, and/or
+			       * a test to see if the entry is in flushable
+			       * condition here.
+			       */
+
+                    status = H5C_flush_single_entry(f,
+                                                    primary_dxpl_id,
+                                                    secondary_dxpl_id,
+                                                    NULL,
+                                                    entry_ptr->addr,
+                                                    H5C__NO_FLAGS_SET,
+                                                    &first_flush,
+                                                    FALSE);
+                    if ( status < 0 ) {
+
+                        /* This shouldn't happen -- if it does, we are toast
+                         * so just scream and die.
+                         */
+
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                    "dirty pinned entry flush failed.")
+                    }
+                }
+            } else {
+
+                status = H5C_flush_single_entry(f,
+                                                primary_dxpl_id,
+                                                secondary_dxpl_id,
+                                                NULL,
+                                                entry_ptr->addr,
+                                                (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG),
+                                                &first_flush,
+                                                TRUE);
+                if ( status < 0 ) {
+
+                    /* This shouldn't happen -- if it does, we are toast so
+                     * just scream and die.
+                     */
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                "dirty entry flush destroy failed.")
+                }
+            }
+        } /* end while loop scanning skip list */
+
+#if H5C_DO_SANITY_CHECKS
+	/* It is possible that entries were added to the slist during
+	 * the scan, either before or after scan pointer.  The following
+	 * asserts take this into account.
+         *
+         * Don't bother with the sanity checks if node_ptr != NULL, as
+         * in this case we broke out of the loop because it got changed
+         * out from under us.
+         */
+
+	if ( node_ptr == NULL ) {
+
+            HDassert( (actual_slist_len + cache_ptr->slist_len) ==
+		      (initial_slist_len + cache_ptr->slist_len_increase) );
+            HDassert( (actual_slist_size + cache_ptr->slist_size) ==
+		      (initial_slist_size + cache_ptr->slist_size_increase) );
+	}
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        /* Since we are doing a destroy, we must make a pass through
+         * the hash table and try to flush - destroy all entries that
+         * remain.
+	 *
+	 * It used to be that all entries remaining in the cache at
+	 * this point had to be clean, but with the fractal heap mods
+	 * this may not be the case.  If so, we will flush entries out
+	 * of increasing address order.
+	 *
+	 * Writes to disk are possible here.
+         */
+        for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
+        {
+	    next_entry_ptr = cache_ptr->index[i];
+
+            while ( next_entry_ptr != NULL )
+            {
+                entry_ptr = next_entry_ptr;
+
+                next_entry_ptr = entry_ptr->ht_next;
+#ifndef NDEBUG
+		HDassert ( ( next_entry_ptr == NULL ) ||
+                           ( next_entry_ptr->magic ==
+                             H5C__H5C_CACHE_ENTRY_T_MAGIC ) );
+#endif /* NDEBUG */
+                if ( entry_ptr->is_protected ) {
+#ifndef NDEBUG
+                    HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+
+                    /* we have major problems -- but lets flush and destroy
+                     * everything we can before we flag an error.
+                     */
+	            protected_entries++;
+
+                    if ( ! entry_ptr->in_slist ) {
+
+                        HDassert( !(entry_ptr->is_dirty) );
+                    }
+                } else if ( ! ( entry_ptr->is_pinned ) ) {
+
+                    status = H5C_flush_single_entry(f,
+                                                    primary_dxpl_id,
+                                                    secondary_dxpl_id,
+                                                    NULL,
+                                                    entry_ptr->addr,
+                                                    (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG),
+                                                    &first_flush,
+                                                    TRUE);
+                    if ( status < 0 ) {
+
+                        /* This shouldn't happen -- if it does, we are toast so
+                         * just scream and die.
+                         */
+
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                    "Entry flush destroy failed.")
+                    }
+                }
+	        /* We can't do anything if the entry is pinned.  The
+		 * hope is that the entry will be unpinned as the
+		 * result of destroys of entries that reference it.
+		 *
+		 * We detect this by noting the change in the number
+		 * of pinned entries from pass to pass.  If it stops
+		 * shrinking before it hits zero, we scream and die.
+		 */
+                /* if the flush function on the entry we last evicted
+                 * loaded an entry into cache (as Quincey has promised me
+                 * it never will), and if the cache was full, it is
+                 * possible that *next_entry_ptr was flushed or evicted.
+                 *
+                 * Test to see if this happened here.  Note that if this
+		 * test is triggred, we are accessing a deallocated piece
+		 * of dynamically allocated memory, so we just scream and
+		 * die.
+                 */
+#ifndef NDEBUG
+                if ( ( next_entry_ptr != NULL ) &&
+                     ( next_entry_ptr->magic !=
+                       H5C__H5C_CACHE_ENTRY_T_MAGIC ) ) {
+
+                    /* Something horrible has happened to
+                     * *next_entry_ptr -- scream and die.
+                     */
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                                "next_entry_ptr->magic is invalid?!?!?.")
+                }
+#endif /* NDEBUG */
+            } /* end while loop scanning hash table bin */
+        } /* end for loop scanning hash table */
+
+	old_pel_len = cur_pel_len;
+	cur_pel_len = cache_ptr->pel_len;
+
+	if ( ( cur_pel_len > 0 ) && ( cur_pel_len >= old_pel_len ) ) {
+
+	   /* The number of pinned entries is positive, and it is not
+	    * declining.  Scream and die.
+	    */
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                        "Pinned entry count not decreasing, cur_pel_len = %d, old_pel_len = %d", (int)cur_pel_len, (int)old_pel_len)
+
+        } else if ( ( cur_pel_len == 0 ) && ( old_pel_len == 0 ) ) {
+
+	    /* increment the pass count */
+	    passes++;
+	}
+
+	if ( passes >= H5C__MAX_PASSES_ON_FLUSH ) {
+
+	    /* we have exceeded the maximum number of passes through the
+	     * cache to flush and destroy all entries.  Scream and die.
+	     */
+
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+	                "Maximum passes on flush exceeded.")
+	}
+    } /* main while loop */
+
+    /* Invariants, after destroying all entries in the hash table */
+    HDassert( cache_ptr->index_size == 0 );
+    HDassert( cache_ptr->clean_index_size == 0 );
+    HDassert( cache_ptr->dirty_index_size == 0 );
+    HDassert( cache_ptr->slist_len == 0 );
+    HDassert( cache_ptr->slist_size == 0 );
+    HDassert( cache_ptr->pel_len == 0 );
+    HDassert( cache_ptr->pel_size == 0 );
+    HDassert( cache_ptr->pl_len == 0 );
+    HDassert( cache_ptr->pl_size == 0 );
+    HDassert( cache_ptr->LRU_list_len == 0 );
+    HDassert( cache_ptr->LRU_list_size == 0 );
+
+
+    HDassert( protected_entries <= cache_ptr->pl_len );
+
+    if ( protected_entries > 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+	            "Cache has protected entries.")
+
+    } else if ( cur_pel_len > 0 ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+	            "Can't unpin all pinned entries.")
+
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_flush_invalidate_cache() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_flush_single_entry
+ *
+ * Purpose:     Flush or clear (and evict if requested) the cache entry
+ *		with the specified address and type.  If the type is NULL,
+ *		any unprotected entry at the specified address will be
+ *		flushed (and possibly evicted).
+ *
+ *		Attempts to flush a protected entry will result in an
+ *		error.
+ *
+ *		*first_flush_ptr should be true if only one
+ *		flush is contemplated before the next load, or if this
+ *		is the first of a sequence of flushes that will be
+ *		completed before the next load.  *first_flush_ptr is set
+ *		to false if a flush actually takes place, and should be
+ *		left false until the end of the sequence.
+ *
+ *		The primary_dxpl_id is used if *first_flush_ptr is TRUE
+ *		on entry, and a flush actually takes place.  The
+ *		secondary_dxpl_id is used in any subsequent flush where
+ *		*first_flush_ptr is FALSE on entry.
+ *
+ *		If the H5C__FLUSH_INVALIDATE_FLAG flag is set, the entry will
+ *		be cleared and not flushed -- in the case *first_flush_ptr,
+ *		primary_dxpl_id, and secondary_dxpl_id are all irrelevent,
+ *		and the call can't be part of a sequence of flushes.
+ *
+ *		If the caller knows the address of the TBBT node at
+ *		which the target entry resides, it can avoid a lookup
+ *		by supplying that address in the tgt_node_ptr parameter.
+ *		If this parameter is NULL, the function will do a TBBT
+ *		search for the entry instead.
+ *
+ *		The function does nothing silently if there is no entry
+ *		at the supplied address, or if the entry found has the
+ *		wrong type.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		an attempt to flush a protected item.
+ *
+ * Programmer:  John Mainzer, 5/5/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_flush_single_entry(H5F_t *	   	   f,
+                       hid_t 		   primary_dxpl_id,
+                       hid_t 		   secondary_dxpl_id,
+                       const H5C_class_t * type_ptr,
+                       haddr_t		   addr,
+                       unsigned	     	   flags,
+                       hbool_t *	   first_flush_ptr,
+                       hbool_t		   del_entry_from_slist_on_destroy)
+{
+    H5C_t *	     	cache_ptr = f->shared->cache;
+    hbool_t		destroy;
+    hbool_t		clear_only;
+    hbool_t		take_ownership;
+    hbool_t		was_dirty;
+    hbool_t		destroy_entry;
+    herr_t		status;
+    int			type_id;
+    unsigned		flush_flags = H5C_CALLBACK__NO_FLAGS_SET;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( first_flush_ptr );
+
+    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
+    clear_only = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0);
+    take_ownership = ( (flags & H5C__TAKE_OWNERSHIP_FLAG) != 0);
+
+    /* Set the flag for destroying the entry, based on the 'take ownership'
+     *  and 'destroy' flags
+     */
+    if(take_ownership)
+        destroy_entry = FALSE;
+    else
+        destroy_entry = destroy;
+
+    /* attempt to find the target entry in the hash table */
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+#if H5C_DO_SANITY_CHECKS
+    if ( entry_ptr != NULL ) {
+
+        HDassert( ! ( ( destroy ) && ( entry_ptr->is_pinned ) ) );
+
+        if ( entry_ptr->in_slist ) {
+
+            if ( ( ( entry_ptr->flush_marker ) && ( ! entry_ptr->is_dirty ) ) ||
+                 ( entry_ptr->addr != addr ) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "entry in slist failed sanity checks.")
+            }
+        } else {
+
+            if ( ( entry_ptr->is_dirty ) ||
+                 ( entry_ptr->flush_marker ) ||
+                 ( entry_ptr->addr != addr ) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "entry failed sanity checks.")
+            }
+        }
+    }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    if ( ( entry_ptr != NULL ) && ( entry_ptr->is_protected ) )
+    {
+
+        /* Attempt to flush a protected entry -- scream and die. */
+        HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, \
+                    "Attempt to flush a protected entry.")
+    }
+
+    if ( ( entry_ptr != NULL ) &&
+         ( ( type_ptr == NULL ) || ( type_ptr->id == entry_ptr->type->id ) ) )
+    {
+        /* we have work to do */
+
+	/* We will set flush_in_progress back to FALSE at the end if the
+	 * entry still exists at that point.
+	 */
+	entry_ptr->flush_in_progress = TRUE;
+
+#ifdef H5_HAVE_PARALLEL
+#ifndef NDEBUG
+        /* If MPI based VFD is used, do special parallel I/O sanity checks.
+         * Note that we only do these sanity checks when the clear_only flag
+         * is not set, and the entry to be flushed is dirty.  Don't bother
+         * otherwise as no file I/O can result.
+         */
+        if(!clear_only && entry_ptr->is_dirty &&
+                H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
+            H5P_genplist_t *dxpl;       /* Dataset transfer property list */
+            unsigned coll_meta;         /* Collective metadata write flag */
+
+            /* Get the dataset transfer property list */
+            if(NULL == (dxpl = H5I_object(primary_dxpl_id)))
+                HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+            /* Get the collective metadata write property */
+            if(H5P_get(dxpl, H5AC_COLLECTIVE_META_WRITE_NAME, &coll_meta) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't retrieve xfer mode")
+
+            /* Sanity check collective metadata write flag */
+            HDassert(coll_meta);
+        } /* end if */
+#endif /* NDEBUG */
+#endif /* H5_HAVE_PARALLEL */
+
+        was_dirty = entry_ptr->is_dirty;
+        type_id = entry_ptr->type->id;
+
+        entry_ptr->flush_marker = FALSE;
+
+        if ( clear_only ) {
+            H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
+        } else {
+            H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
+        }
+
+        if ( destroy ) {
+            H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)
+        }
+
+        /* Always remove the entry from the hash table on a destroy.  On a
+         * flush with destroy, it is cheaper to discard the skip list all at
+         * once rather than remove the entries one by one, so we only delete
+         * from the slist only if requested.
+         *
+         * We must do deletions now as the callback routines will free the
+         * entry if destroy is true.
+	 *
+	 * Note that it is possible that the entry will be moved during
+	 * its call to flush.  This will upset H5C_move_entry() if we
+	 * don't tell it that it doesn't have to worry about updating the
+	 * index and SLIST.  Use the destroy_in_progress field for this
+	 * purpose.
+         */
+        if ( destroy ) {
+
+            entry_ptr->destroy_in_progress = TRUE;
+
+            H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
+
+            if ( ( entry_ptr->in_slist ) &&
+                 ( del_entry_from_slist_on_destroy ) ) {
+
+                H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+            }
+        }
+
+        /* Update the replacement policy for the flush or eviction.
+         * Again, do this now so we don't have to reference freed
+         * memory in the destroy case.
+         */
+        if ( destroy ) { /* AKA eviction */
+
+            H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL)
+
+        } else {
+
+            H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL)
+        }
+
+        /* Clear the dirty flag only, if requested */
+        if ( clear_only ) {
+
+	    if ( destroy ) {
+#ifndef NDEBUG
+		/* we are about to call the clear callback with the
+		 * destroy flag set -- this will result in *entry_ptr
+		 * being freed.  Set the magic field to bad magic
+		 * so we can detect a freed cache entry if we see
+		 * one.
+		 */
+		entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
+#endif /* NDEBUG */
+                entry_ptr->cache_ptr = NULL;
+	    }
+            /* Call the callback routine to clear all dirty flags for object */
+            if ( (entry_ptr->type->clear)(f, entry_ptr, destroy_entry) < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear entry")
+            }
+        } else {
+
+#if H5C_DO_SANITY_CHECKS
+            if ( ( entry_ptr->is_dirty ) &&
+                 ( cache_ptr->check_write_permitted == NULL ) &&
+                 ( ! (cache_ptr->write_permitted) ) ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Write when writes are always forbidden!?!?!")
+            }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+	    if ( destroy ) {
+#ifndef NDEBUG
+	        /* we are about to call the flush callback with the
+	         * destroy flag set -- this will result in *entry_ptr
+	         * being freed.  Set the magic field to bad magic
+	         * so we can detect a freed cache entry if we see
+	         * one.
+	         */
+	        entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
+#endif /* NDEBUG */
+                entry_ptr->cache_ptr = NULL;
+	    }
+
+            /* Only block for all the processes on the first piece of metadata
+             */
+
+            if ( *first_flush_ptr && entry_ptr->is_dirty ) {
+
+                status = (entry_ptr->type->flush)(f, primary_dxpl_id, destroy_entry,
+                                                 entry_ptr->addr, entry_ptr,
+						 &flush_flags);
+                *first_flush_ptr = FALSE;
+
+            } else {
+
+                status = (entry_ptr->type->flush)(f, secondary_dxpl_id,
+                                                 destroy_entry, entry_ptr->addr,
+                                                 entry_ptr, &flush_flags);
+            }
+
+            if ( status < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                            "unable to flush entry")
+            }
+
+#ifdef H5_HAVE_PARALLEL
+            if ( flush_flags != H5C_CALLBACK__NO_FLAGS_SET ) {
+
+                /* In the parallel case, flush operations can
+		 * cause problems.  If they occur, scream and
+		 * die.
+		 *
+		 * At present, in the parallel case, the aux_ptr
+		 * will only be set if there is more than one
+		 * process.  Thus we can use this to detect
+		 * the parallel case.
+		 *
+		 * This works for now, but if we start using the
+		 * aux_ptr for other purposes, we will have to
+		 * change this test accordingly.
+		 *
+		 * NB: While this test detects entryies that attempt
+		 *     to resize or move themselves during a flush
+		 *     in the parallel case, it will not detect an
+		 *     entry that dirties, resizes, and/or moves
+		 *     other entries during its flush.
+		 *
+		 *     From what Quincey tells me, this test is
+		 *     sufficient for now, as any flush routine that
+		 *     does the latter will also do the former.
+		 *
+		 *     If that ceases to be the case, further
+		 *     tests will be necessary.
+		 */
+		if ( cache_ptr->aux_ptr != NULL ) {
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+		        "resize/move in serialize occured in parallel case.")
+
+		}
+	    }
+#endif /* H5_HAVE_PARALLEL */
+        }
+
+        if ( ( ! destroy ) && ( entry_ptr->in_slist ) ) {
+
+            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+
+        }
+
+	if ( ( ! destroy ) && ( was_dirty ) ) {
+
+            H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr);
+        }
+
+        if ( ! destroy ) { /* i.e. if the entry still exists */
+
+            HDassert( !(entry_ptr->is_dirty) );
+            HDassert( !(entry_ptr->flush_marker) );
+            HDassert( !(entry_ptr->in_slist) );
+            HDassert( !(entry_ptr->is_protected) );
+            HDassert( !(entry_ptr->is_read_only) );
+            HDassert( (entry_ptr->ro_ref_count) == 0 );
+
+	    if ( (flush_flags & H5C_CALLBACK__SIZE_CHANGED_FLAG) != 0 ) {
+
+		/* The entry size changed as a result of the flush.
+		 *
+		 * Most likely, the entry was compressed, and the
+		 * new version is of a different size than the old.
+		 *
+		 * In any case, we must update entry and cache size
+		 * accordingly.
+		 */
+		size_t new_size;
+
+                if ( (entry_ptr->type->size)(f, (void *)entry_ptr, &new_size)
+                     < 0 ) {
+
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, \
+                                "Can't get entry size after flush")
+                }
+
+		if ( new_size != entry_ptr->size ) {
+
+                    HDassert( entry_ptr->size < H5C_MAX_ENTRY_SIZE );
+
+                    /* update the hash table for the size change
+		     * We pass TRUE as the was_clean parameter, as we
+		     * have already updated the clean and dirty index
+		     * size fields for the fact that the entry has
+		     * been flushed. (See above call to
+		     * H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN()).
+		     */
+	            H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), \
+				                      (entry_ptr->size), \
+                                                      (new_size), \
+						      (entry_ptr), \
+						      (TRUE))
+
+		    /* The entry can't be protected since we just flushed it.
+		     * Thus we must update the replacement policy data
+		     * structures for the size change.  The macro deals
+		     * with the pinned case.
+		     */
+		    H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, \
+				                   new_size)
+
+		    /* The entry can't be in the slist, so no need to update
+		     * the slist for the size change.
+		     */
+
+		    /* update stats for the size change */
+		    H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, \
+				                            entry_ptr, \
+							    new_size)
+
+		    /* finally, update the entry size proper */
+		    entry_ptr->size = new_size;
+		}
+	    }
+
+	    if ( (flush_flags & H5C_CALLBACK__MOVED_FLAG) != 0 ) {
+
+		/* The entry was moved as the result of the flush.
+		 *
+		 * Most likely, the entry was compressed, and the
+		 * new version is larger than the old and thus had
+		 * to be relocated.
+		 *
+		 * At preset, all processing for this case is
+		 * handled elsewhere.  But lets keep the if statement
+		 * around just in case.
+		 */
+
+	    }
+
+	    entry_ptr->flush_in_progress = FALSE;
+        }
+
+        if ( cache_ptr->log_flush ) {
+
+            status = (cache_ptr->log_flush)(cache_ptr, addr, was_dirty,
+                                            flags, type_id);
+
+            if ( status < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                            "log_flush callback failed.")
+            }
+        }
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_single_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_load_entry
+ *
+ * Purpose:     Attempt to load the entry at the specified disk address
+ *		and with the specified type into memory.  If successful.
+ *		return the in memory address of the entry.  Return NULL
+ *		on failure.
+ *
+ *		Note that this function simply loads the entry into
+ *		core.  It does not insert it into the cache.
+ *
+ * Return:      Non-NULL on success / NULL on failure.
+ *
+ * Programmer:  John Mainzer, 5/18/04
+ *
+ *		QAK -- 1/31/08
+ *		Added initialization for the new free_file_space_on_destroy
+ *		field.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5C_load_entry(H5F_t *             f,
+               hid_t               dxpl_id,
+               const H5C_class_t * type,
+               haddr_t             addr,
+               void *              udata)
+{
+    void *		thing = NULL;   /* Pointer to thing loaded */
+    H5C_cache_entry_t *	entry;          /* Alias for thing loaded, as cache entry */
+    void *		ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(type);
+    HDassert(type->load);
+    HDassert(type->size);
+    HDassert(H5F_addr_defined(addr));
+
+    if(NULL == (thing = (type->load)(f, dxpl_id, addr, udata)))
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "unable to load entry")
+
+
+    entry = (H5C_cache_entry_t *)thing;
+
+    /* In general, an entry should be clean just after it is loaded.
+     *
+     * However, when this code is used in the metadata cache, it is
+     * possible that object headers will be dirty at this point, as
+     * the load function will alter object headers if necessary to
+     * fix an old bug.
+     *
+     * To support this bug fix, I have replace the old assert:
+     *
+     * 	HDassert( entry->is_dirty == FALSE );
+     *
+     * with:
+     *
+     * 	HDassert( ( entry->is_dirty == FALSE ) || ( type->id == 5 ) );
+     *
+     * Note that type id 5 is associated with object headers in the metadata
+     * cache.
+     *
+     * When we get to using H5C for other purposes, we may wish to
+     * tighten up the assert so that the loophole only applies to the
+     * metadata cache.
+     */
+
+    HDassert( ( entry->is_dirty == FALSE ) || ( type->id == 5 ) );
+#ifndef NDEBUG
+    entry->magic                = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
+    entry->cache_ptr            = f->shared->cache;
+    entry->addr                 = addr;
+    entry->type                 = type;
+    entry->is_protected         = FALSE;
+    entry->is_read_only         = FALSE;
+    entry->ro_ref_count         = 0;
+    entry->in_slist             = FALSE;
+    entry->flush_marker         = FALSE;
+#ifdef H5_HAVE_PARALLEL
+    entry->clear_on_unprotect   = FALSE;
+    entry->flush_immediately    = FALSE;
+#endif /* H5_HAVE_PARALLEL */
+    entry->flush_in_progress    = FALSE;
+    entry->destroy_in_progress  = FALSE;
+    entry->free_file_space_on_destroy = FALSE;
+
+    if((type->size)(f, thing, &(entry->size)) < 0)
+
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, NULL, "Can't get size of thing")
+
+    HDassert( entry->size < H5C_MAX_ENTRY_SIZE );
+
+    entry->next                 = NULL;
+    entry->prev                 = NULL;
+
+    entry->aux_next             = NULL;
+    entry->aux_prev             = NULL;
+
+    H5C__RESET_CACHE_ENTRY_STATS(entry);
+
+    ret_value = thing;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_load_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_make_space_in_cache
+ *
+ * Purpose:     Attempt to evict cache entries until the index_size
+ *		is at least needed_space below max_cache_size.
+ *
+ *		In passing, also attempt to bring cLRU_list_size to a
+ *		value greater than min_clean_size.
+ *
+ *		Depending on circumstances, both of these goals may
+ *		be impossible, as in parallel mode, we must avoid generating
+ *		a write as part of a read (to avoid deadlock in collective
+ *		I/O), and in all cases, it is possible (though hopefully
+ *		highly unlikely) that the protected list may exceed the
+ *		maximum size of the cache.
+ *
+ *		Thus the function simply does its best, returning success
+ *		unless an error is encountered.
+ *
+ *		The primary_dxpl_id and secondary_dxpl_id parameters
+ *		specify the dxpl_ids used on the first write occasioned
+ *		by the call (primary_dxpl_id), and on all subsequent
+ *		writes (secondary_dxpl_id).  This is useful in the metadata
+ *		cache, but may not be needed elsewhere.  If so, just use the
+ *		same dxpl_id for both parameters.
+ *
+ *		Observe that this function cannot occasion a read.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 5/14/04
+ *
+ *              JRM -- 11/13/08
+ *              Modified function to always observe the min_clean_size
+ *              whether we are maintaining the clean and dirt LRU lists
+ *              or not.  To do this, we had to add the new clean_index_size
+ *              and dirty_index_size fields to H5C_t, and supporting code
+ *              as needed throughout the cache.
+ *
+ *              The purpose of this modification is to avoid "metadata
+ *              blizzards" in the write only case.  In such instances,
+ *              the cache was allowed to fill with dirty metadata.  When
+ *              we finally needed to evict an entry to make space, we had
+ *              to flush out a whole cache full of metadata -- which has
+ *              interesting performance effects.  We hope to avoid (or
+ *              perhaps more accurately hide) this effect by maintaining
+ *              the min_clean_size, which should force us to start flushing
+ *              entries long before we actually have to evict something
+ *              to make space.
+ *
+ *              MAM -- 01/06/09
+ *              Added code to maintain clean_entries_skipped and total_entries
+ *              scanned statistics.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_make_space_in_cache(H5F_t *	f,
+                        hid_t	primary_dxpl_id,
+                        hid_t	secondary_dxpl_id,
+		        size_t	space_needed,
+                        hbool_t	write_permitted,
+                        hbool_t * first_flush_ptr)
+{
+    H5C_t *		cache_ptr = f->shared->cache;
+    herr_t		result;
+#if H5C_COLLECT_CACHE_STATS
+    int32_t             clean_entries_skipped = 0;
+    int32_t             total_entries_scanned = 0;
+#endif /* H5C_COLLECT_CACHE_STATS */
+    int32_t		entries_examined = 0;
+    int32_t		initial_list_len;
+    size_t		empty_space;
+    hbool_t		prev_is_dirty = FALSE;
+    hbool_t             didnt_flush_entry = FALSE;
+    H5C_cache_entry_t *	entry_ptr;
+    H5C_cache_entry_t *	prev_ptr;
+    H5C_cache_entry_t *	next_ptr;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( first_flush_ptr != NULL );
+    HDassert( ( *first_flush_ptr == TRUE ) || ( *first_flush_ptr == FALSE ) );
+    HDassert( cache_ptr->index_size ==
+	      (cache_ptr->clean_index_size + cache_ptr->dirty_index_size) );
+
+    if ( write_permitted ) {
+
+        initial_list_len = cache_ptr->LRU_list_len;
+
+        entry_ptr = cache_ptr->LRU_tail_ptr;
+
+	if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
+
+	   empty_space = 0;
+
+	} else {
+
+	   empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
+
+	}
+
+        while ( ( ( (cache_ptr->index_size + space_needed)
+                    >
+                    cache_ptr->max_cache_size
+                  )
+		  ||
+		  (
+		    ( empty_space + cache_ptr->clean_index_size )
+		    <
+		    ( cache_ptr->min_clean_size )
+                  )
+		)
+                &&
+                ( entries_examined <= (2 * initial_list_len) )
+                &&
+                ( entry_ptr != NULL )
+              )
+        {
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( (entry_ptr->ro_ref_count) == 0 );
+
+	    next_ptr = entry_ptr->next;
+            prev_ptr = entry_ptr->prev;
+
+	    if ( prev_ptr != NULL ) {
+
+		prev_is_dirty = prev_ptr->is_dirty;
+	    }
+
+            if ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) {
+
+                didnt_flush_entry = FALSE;
+
+                if ( entry_ptr->is_dirty ) {
+
+#if H5C_COLLECT_CACHE_STATS
+                    if ( (cache_ptr->index_size + space_needed)
+                           >
+                          cache_ptr->max_cache_size ) {
+
+                        cache_ptr->entries_scanned_to_make_space++;
+                    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+                    result = H5C_flush_single_entry(f,
+                                                    primary_dxpl_id,
+                                                    secondary_dxpl_id,
+                                                    entry_ptr->type,
+                                                    entry_ptr->addr,
+                                                    H5C__NO_FLAGS_SET,
+                                                    first_flush_ptr,
+                                                    FALSE);
+                } else if ( (cache_ptr->index_size + space_needed)
+                              >
+                             cache_ptr->max_cache_size ) {
+#if H5C_COLLECT_CACHE_STATS
+                    cache_ptr->entries_scanned_to_make_space++;
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+                    result = H5C_flush_single_entry(f,
+                                                    primary_dxpl_id,
+                                                    secondary_dxpl_id,
+                                                    entry_ptr->type,
+                                                    entry_ptr->addr,
+                                                    H5C__FLUSH_INVALIDATE_FLAG,
+                                                    first_flush_ptr,
+                                                    TRUE);
+                } else {
+
+                    /* We have enough space so don't flush clean entry.
+                     * Set result to SUCCEED to avoid triggering the error
+                     * code below.
+                     */
+#if H5C_COLLECT_CACHE_STATS
+                    clean_entries_skipped++;
+#endif /* H5C_COLLECT_CACHE_STATS */
+                    didnt_flush_entry = TRUE;
+                    result = SUCCEED;
+
+                }
+
+#if H5C_COLLECT_CACHE_STATS
+                total_entries_scanned++;
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+            } else {
+
+                /* Skip epoch markers.  Set result to SUCCEED to avoid
+                 * triggering the error code below.
+                 */
+                didnt_flush_entry = TRUE;
+                result = SUCCEED;
+            }
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                            "unable to flush entry")
+            }
+
+	    if ( prev_ptr != NULL ) {
+#ifndef NDEBUG
+		if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+		    /* something horrible has happened to *prev_ptr --
+		     * scream and die.
+		     */
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+				"*prev_ptr corrupt 1")
+
+                }
+#endif /* NDEBUG */
+		if ( didnt_flush_entry ) {
+
+		    /* epoch markers don't get flushed, so the sanity checks
+		     * on normal entries will fail -- thus just set entry_ptr
+		     * to prev_ptr and go on.
+		     */
+                    entry_ptr = prev_ptr;
+
+		} else if ( ( prev_ptr->is_dirty != prev_is_dirty )
+		            ||
+		            ( prev_ptr->next != next_ptr )
+		            ||
+		            ( prev_ptr->is_protected )
+		            ||
+		            ( prev_ptr->is_pinned ) ) {
+
+		    /* something has happened to the LRU -- start over
+		     * from the tail.
+		     */
+	            entry_ptr = cache_ptr->LRU_tail_ptr;
+
+		} else {
+
+		    entry_ptr = prev_ptr;
+
+		}
+	    } else {
+
+		entry_ptr = NULL;
+
+	    }
+
+	    entries_examined++;
+
+	    if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
+
+	       empty_space = 0;
+
+	    } else {
+
+	       empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
+
+	    }
+
+	    HDassert( cache_ptr->index_size ==
+	              (cache_ptr->clean_index_size +
+		       cache_ptr->dirty_index_size) );
+
+	}
+
+#if H5C_COLLECT_CACHE_STATS
+        cache_ptr->calls_to_msic++;
+
+        cache_ptr->total_entries_skipped_in_msic += clean_entries_skipped;
+        cache_ptr->total_entries_scanned_in_msic += total_entries_scanned;
+
+        if ( clean_entries_skipped > cache_ptr->max_entries_skipped_in_msic ) {
+
+            cache_ptr->max_entries_skipped_in_msic = clean_entries_skipped;
+        }
+
+        if ( total_entries_scanned > cache_ptr->max_entries_scanned_in_msic ) {
+
+            cache_ptr->max_entries_scanned_in_msic = total_entries_scanned;
+        }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+	HDassert( ( entries_examined > (2 * initial_list_len) ) ||
+		  ( (cache_ptr->pl_size + cache_ptr->pel_size + cache_ptr->min_clean_size) >
+		    cache_ptr->max_cache_size ) ||
+		  ( ( cache_ptr->clean_index_size + empty_space )
+		    >= cache_ptr->min_clean_size ) );
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+        HDassert( ( entries_examined > (2 * initial_list_len) ) ||
+		  ( cache_ptr->cLRU_list_size <= cache_ptr->clean_index_size ) );
+        HDassert( ( entries_examined > (2 * initial_list_len) ) ||
+		  ( cache_ptr->dLRU_list_size <= cache_ptr->dirty_index_size ) );
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+    } else {
+
+        HDassert( H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS );
+
+        initial_list_len = cache_ptr->cLRU_list_len;
+        entry_ptr = cache_ptr->cLRU_tail_ptr;
+
+        while ( ( (cache_ptr->index_size + space_needed)
+                  >
+                  cache_ptr->max_cache_size
+                )
+                &&
+                ( entries_examined <= initial_list_len )
+                &&
+                ( entry_ptr != NULL )
+              )
+        {
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( (entry_ptr->ro_ref_count) == 0 );
+            HDassert( ! (entry_ptr->is_dirty) );
+
+            prev_ptr = entry_ptr->aux_prev;
+
+            result = H5C_flush_single_entry(f,
+                                            primary_dxpl_id,
+                                            secondary_dxpl_id,
+                                            entry_ptr->type,
+                                            entry_ptr->addr,
+                                            H5C__FLUSH_INVALIDATE_FLAG,
+                                            first_flush_ptr,
+                                            TRUE);
+
+            if ( result < 0 ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                            "unable to flush entry")
+            }
+
+            entry_ptr = prev_ptr;
+	    entries_examined++;
+        }
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_make_space_in_cache() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_validate_lru_list
+ *
+ * Purpose:     Debugging function that scans the LRU list for errors.
+ *
+ *		If an error is detected, the function generates a
+ *		diagnostic and returns FAIL.  If no error is detected,
+ *		the function returns SUCCEED.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 7/14/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5C_DO_EXTREME_SANITY_CHECKS
+
+static herr_t
+H5C_validate_lru_list(H5C_t * cache_ptr)
+{
+    herr_t		ret_value = SUCCEED;      /* Return value */
+    int32_t             len = 0;
+    size_t              size = 0;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if ( ( ( cache_ptr->LRU_head_ptr == NULL )
+           ||
+           ( cache_ptr->LRU_tail_ptr == NULL )
+         )
+         &&
+         ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed")
+    }
+
+    if ( ( cache_ptr->LRU_list_len < 0 ) || ( cache_ptr->LRU_list_size < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed")
+    }
+
+    if ( ( cache_ptr->LRU_list_len == 1 )
+         &&
+         ( ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr )
+           ||
+           ( cache_ptr->LRU_head_ptr == NULL )
+           ||
+           ( cache_ptr->LRU_head_ptr->size != cache_ptr->LRU_list_size )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 3 failed")
+    }
+
+    if ( ( cache_ptr->LRU_list_len >= 1 )
+         &&
+         ( ( cache_ptr->LRU_head_ptr == NULL )
+           ||
+           ( cache_ptr->LRU_head_ptr->prev != NULL )
+           ||
+           ( cache_ptr->LRU_tail_ptr == NULL )
+           ||
+           ( cache_ptr->LRU_tail_ptr->next != NULL )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed")
+    }
+
+    entry_ptr = cache_ptr->LRU_head_ptr;
+    while ( entry_ptr != NULL )
+    {
+
+        if ( ( entry_ptr != cache_ptr->LRU_head_ptr ) &&
+             ( ( entry_ptr->prev == NULL ) ||
+               ( entry_ptr->prev->next != entry_ptr ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed")
+        }
+
+        if ( ( entry_ptr != cache_ptr->LRU_tail_ptr ) &&
+             ( ( entry_ptr->next == NULL ) ||
+               ( entry_ptr->next->prev != entry_ptr ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed")
+        }
+
+        len++;
+        size += entry_ptr->size;
+        entry_ptr = entry_ptr->next;
+    }
+
+    if ( ( cache_ptr->LRU_list_len != len ) ||
+         ( cache_ptr->LRU_list_size != size ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+    }
+
+done:
+
+    if ( ret_value != SUCCEED ) {
+
+        HDassert(0);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_validate_lru_list() */
+
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_verify_not_in_index
+ *
+ * Purpose:     Debugging function that scans the hash table to verify
+ *		that the specified instance of H5C_cache_entry_t is not
+ *		present.
+ *
+ *		If an error is detected, the function generates a
+ *		diagnostic and returns FAIL.  If no error is detected,
+ *		the function returns SUCCEED.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 7/14/05
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5C_DO_EXTREME_SANITY_CHECKS
+
+static herr_t
+H5C_verify_not_in_index(H5C_t * cache_ptr,
+                        H5C_cache_entry_t * entry_ptr)
+{
+    herr_t		ret_value = SUCCEED;      /* Return value */
+    int32_t             i;
+    int32_t             depth;
+    H5C_cache_entry_t *	scan_ptr = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( entry_ptr != NULL );
+
+    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
+    {
+        depth = 0;
+        scan_ptr = cache_ptr->index[i];
+
+        while ( scan_ptr != NULL )
+        {
+            if ( scan_ptr == entry_ptr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Entry already in index.")
+            }
+            depth++;
+            scan_ptr = scan_ptr->ht_next;
+        }
+    }
+
+done:
+
+    if ( ret_value != SUCCEED ) {
+
+        HDassert(0);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_verify_not_in_index() */
+
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5CS.c b/gatb-core/thirdparty/hdf5/src/H5CS.c
new file mode 100644
index 0000000..29182ce
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5CS.c
@@ -0,0 +1,327 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Provides internal function tracing in the form of a stack.
+ *		The FUNC_ENTER() macro adds the function name to the function
+ *              stack whenever a function is entered.
+ *		As the functions return with FUNC_LEAVE,
+ *		entries are removed from the stack.
+ *
+ *		A function stack has a fixed maximum size.  If this size is
+ *		exceeded then the stack will be truncated and only the
+ *		first called functions will have entries on the stack. This is
+ *		expected to be a rare condition.
+ *
+ */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5CSprivate.h"	/* Function stack			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+#ifdef H5_HAVE_CODESTACK
+
+#ifdef H5_HAVE_THREADSAFE
+/*
+ * The per-thread function stack. pthread_once() initializes a special
+ * key that will be used by all threads to create a stack specific to
+ * each thread individually. The association of stacks to threads will
+ * be handled by the pthread library.
+ *
+ * In order for this macro to work, H5CS_get_my_stack() must be preceeded
+ * by "H5CS_t *fstack =".
+ */
+static H5CS_t *H5CS_get_stack(void);
+#define H5CS_get_my_stack()  H5CS_get_stack()
+#else /* H5_HAVE_THREADSAFE */
+/*
+ * The function stack.  Eventually we'll have some sort of global table so each
+ * thread has it's own stack.  The stacks will be created on demand when the
+ * thread first calls H5CS_push().  */
+H5CS_t		H5CS_stack_g[1];
+#define H5CS_get_my_stack()	(H5CS_stack_g+0)
+#endif /* H5_HAVE_THREADSAFE */
+
+

+#ifdef H5_HAVE_THREADSAFE
+/*-------------------------------------------------------------------------
+ * Function:	H5CS_get_stack
+ *
+ * Purpose:	Support function for H5CS_get_my_stack() to initialize and
+ *              acquire per-thread function stack.
+ *
+ * Return:	Success:	function stack (H5CS_t *)
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              February 6, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5CS_t *
+H5CS_get_stack(void)
+{
+    H5CS_t *fstack;
+
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    fstack = H5TS_get_thread_local_value(H5TS_funcstk_key_g);
+    if (!fstack) {
+        /* No associated value with current thread - create one */
+#ifdef H5_HAVE_WIN_THREADS
+        fstack = (H5CS_t *)LocalAlloc(LPTR, sizeof(H5CS_t)); /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
+#else
+        fstack = (H5CS_t *)HDmalloc(sizeof(H5CS_t)); /* Don't use H5MM_malloc() here, it causes infinite recursion */
+#endif /* H5_HAVE_WIN_THREADS */
+        HDassert(fstack);
+
+        /* Set the thread-specific info */
+        fstack->nused=0;
+
+        /* (It's not necessary to release this in this API, it is
+         *      released by the "key destructor" set up in the H5TS
+         *      routines.  See calls to pthread_key_create() in H5TS.c -QAK)
+         */
+        H5TS_set_thread_local_value(H5TS_funcstk_key_g, (void *)fstack);
+    }
+
+    FUNC_LEAVE_NOAPI_NOFS(fstack);
+} /* end H5CS_get_stack() */
+#endif  /* H5_HAVE_THREADSAFE */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_print_stack
+ *
+ * Purpose:	Prints a function stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February 6, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_print_stack(const H5CS_t *fstack, FILE *stream)
+{
+    const int	indent = 2;             /* Indention level */
+    int         i;                      /* Local index ariable */
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(fstack);
+
+    /* Default to outputting information to stderr */
+    if (!stream)
+        stream = stderr;
+
+    HDfprintf (stream, "HDF5-DIAG: Function stack from %s ", H5_lib_vers_info_g);
+    /* try show the process or thread id in multiple processes cases*/
+#ifdef H5_HAVE_THREADSAFE
+    HDfprintf (stream, "thread %lu.", HDpthread_self_ulong());
+#else  /* H5_HAVE_THREADSAFE */
+    HDfprintf (stream, "thread 0.");
+#endif  /* H5_HAVE_THREADSAFE */
+    if (fstack && fstack->nused>0)
+        HDfprintf (stream, "  Back trace follows.");
+    HDfputc ('\n', stream);
+
+    for (i=fstack->nused-1; i>=0; --i)
+        HDfprintf(stream, "%*s#%03d: Routine: %s\n", indent, "", i, fstack->slot[i]);
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_print_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_print
+ *
+ * Purpose:	Prints the default function stack in some default way.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February 6, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_print(FILE *stream)
+{
+    H5CS_t	*fstack = H5CS_get_my_stack (); /* Get the correct function stack */
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(fstack);
+
+    H5CS_print_stack(fstack, stream);
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_print() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_push
+ *
+ * Purpose:	Pushes a new record onto function stack for the current
+ *		thread.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, February 6, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_push(const char *func_name)
+{
+    H5CS_t	*fstack = H5CS_get_my_stack ();
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(fstack);
+    HDassert(func_name);
+
+    /*
+     * Push the function if there's room.  Otherwise just increment count
+     */
+    if (fstack->nused<H5CS_NSLOTS)
+	fstack->slot[fstack->nused] = func_name;
+    fstack->nused++;
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_push() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_pop
+ *
+ * Purpose:	Pops a record off function stack for the current thread.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, February 6, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_pop(void)
+{
+    H5CS_t	*fstack = H5CS_get_my_stack ();
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(fstack);
+    HDassert(fstack->nused>0);
+
+    /* Pop the function. */
+    fstack->nused--;
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_pop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_copy_stack
+ *
+ * Purpose:	Makes a copy of the current stack
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, August 9, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_copy_stack(H5CS_t *new_stack)
+{
+    H5CS_t	*old_stack = H5CS_get_my_stack ();
+    unsigned    u;                      /* Local index variable */
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(old_stack);
+
+    /* Copy old stack to new one, duplicating the strings */
+    for(u = 0; u < old_stack->nused; u++)
+        new_stack->slot[u] = H5MM_strdup(old_stack->slot[u]);
+    new_stack->nused = old_stack->nused;
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_copy_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5CS_close_stack
+ *
+ * Purpose:	Closes a copy of a stack
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, August 9, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CS_close_stack(H5CS_t *stack)
+{
+    unsigned    u;                      /* Local index variable */
+
+    /* Don't push this function on the function stack... :-) */
+    FUNC_ENTER_NOAPI_NOERR_NOFS
+
+    /* Sanity check */
+    HDassert(stack);
+
+    /* Free strings on stack */
+    for(u = 0; u < stack->nused; u++)
+        stack->slot[u] = H5MM_xfree((void *)stack->slot[u]);
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+} /* end H5CS_close_stack() */
+
+#endif /* H5_HAVE_CODESTACK */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5CSprivate.h b/gatb-core/thirdparty/hdf5/src/H5CSprivate.h
new file mode 100644
index 0000000..13f3b66
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5CSprivate.h
@@ -0,0 +1,44 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ *  Header file for function stacks, etc.
+ */
+#ifndef _H5CSprivate_H
+#define _H5CSprivate_H
+
+#ifdef NOT_YET
+#include "H5CSpublic.h"
+#endif /* NOT_YET */
+
+/* Private headers needed by this file */
+#include "H5private.h"
+
+#define H5CS_NSLOTS	48	/*number of slots in an function stack	     */
+
+/* A function stack */
+typedef struct H5CS_t {
+    unsigned	nused;			        /*num slots currently used in stack  */
+    const char *slot[H5CS_NSLOTS];	/*array of function records	     */
+} H5CS_t;
+
+H5_DLL herr_t H5CS_push (const char *func_name);
+H5_DLL herr_t H5CS_pop (void);
+H5_DLL herr_t H5CS_print (FILE *stream);
+H5_DLL herr_t H5CS_print_stack (const H5CS_t *stack, FILE *stream);
+H5_DLL herr_t H5CS_copy_stack (H5CS_t *stack);
+H5_DLL herr_t H5CS_close_stack (H5CS_t *stack);
+
+#endif /* _H5CSprivate_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Cpkg.h b/gatb-core/thirdparty/hdf5/src/H5Cpkg.h
new file mode 100644
index 0000000..af39dfb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Cpkg.h
@@ -0,0 +1,3566 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: John Mainzer -- 10/12/04
+ *
+ * Purpose:     This file contains declarations which are normally visible
+ *              only within the H5C package.
+ *
+ *		Source files outside the H5C package should include
+ *		H5Cprivate.h instead.
+ *
+ *		The one exception to this rule is test/cache.c.  The test
+ *		code is easier to write if it can look at the cache's
+ *		internal data structures.  Indeed, this is the main
+ *		reason why this file was created.
+ */
+
+#ifndef H5C_PACKAGE
+#error "Do not include this file outside the H5C package!"
+#endif
+
+#ifndef _H5Cpkg_H
+#define _H5Cpkg_H
+
+
+/* Get package's private header */
+#include "H5Cprivate.h"
+
+
+/* Get needed headers */
+#include "H5SLprivate.h"        /* Skip lists */
+
+/* With the introduction of the fractal heap, it is now possible for
+ * entries to be dirtied, resized, and/or moved in the flush callbacks.
+ * As a result, on flushes, it may be necessary to make multiple passes
+ * through the slist before it is empty.  The H5C__MAX_PASSES_ON_FLUSH
+ * #define is used to set an upper limit on the number of passes.
+ * The current value was obtained via personal communication with
+ * Quincey.  I have applied a fudge factor of 2.
+ *
+ *						-- JRM
+ */
+
+#define H5C__MAX_PASSES_ON_FLUSH	4
+
+
+
+/****************************************************************************
+ *
+ * structure H5C_t
+ *
+ * Catchall structure for all variables specific to an instance of the cache.
+ *
+ * While the individual fields of the structure are discussed below, the
+ * following overview may be helpful.
+ *
+ * Entries in the cache are stored in an instance of H5TB_TREE, indexed on
+ * the entry's disk address.  While the H5TB_TREE is less efficient than
+ * hash table, it keeps the entries in address sorted order.  As flushes
+ * in parallel mode are more efficient if they are issued in increasing
+ * address order, this is a significant benefit.  Also the H5TB_TREE code
+ * was readily available, which reduced development time.
+ *
+ * While the cache was designed with multiple replacement policies in mind,
+ * at present only a modified form of LRU is supported.
+ *
+ *                                              JRM - 4/26/04
+ *
+ * Profiling has indicated that searches in the instance of H5TB_TREE are
+ * too expensive.  To deal with this issue, I have augmented the cache
+ * with a hash table in which all entries will be stored.  Given the
+ * advantages of flushing entries in increasing address order, the TBBT
+ * is retained, but only dirty entries are stored in it.  At least for
+ * now, we will leave entries in the TBBT after they are flushed.
+ *
+ * Note that index_size and index_len now refer to the total size of
+ * and number of entries in the hash table.
+ *
+ *						JRM - 7/19/04
+ *
+ * The TBBT has since been replaced with a skip list.  This change
+ * greatly predates this note.
+ *
+ *						JRM - 9/26/05
+ *
+ * magic:	Unsigned 32 bit integer always set to H5C__H5C_T_MAGIC. 
+ * 		This field is used to validate pointers to instances of
+ * 		H5C_t.
+ *
+ * flush_in_progress: Boolean flag indicating whether a flush is in
+ * 		progress.
+ *
+ * trace_file_ptr:  File pointer pointing to the trace file, which is used
+ *              to record cache operations for use in simulations and design
+ *              studies.  This field will usually be NULL, indicating that
+ *              no trace file should be recorded.
+ *
+ *              Since much of the code supporting the parallel metadata
+ *              cache is in H5AC, we don't write the trace file from
+ *              H5C.  Instead, H5AC reads the trace_file_ptr as needed.
+ *
+ *              When we get to using H5C in other places, we may add
+ *              code to write trace file data at the H5C level as well.
+ *
+ * aux_ptr:	Pointer to void used to allow wrapper code to associate
+ *		its data with an instance of H5C_t.  The H5C cache code
+ *		sets this field to NULL, and otherwise leaves it alone.
+ *
+ * max_type_id:	Integer field containing the maximum type id number assigned
+ *		to a type of entry in the cache.  All type ids from 0 to
+ *		max_type_id inclusive must be defined.  The names of the
+ *		types are stored in the type_name_table discussed below, and
+ *		indexed by the ids.
+ *
+ * type_name_table_ptr: Pointer to an array of pointer to char of length
+ *              max_type_id + 1.  The strings pointed to by the entries
+ *              in the array are the names of the entry types associated
+ *              with the indexing type IDs.
+ *
+ * max_cache_size:  Nominal maximum number of bytes that may be stored in the
+ *              cache.  This value should be viewed as a soft limit, as the
+ *              cache can exceed this value under the following circumstances:
+ *
+ *              a) All entries in the cache are protected, and the cache is
+ *                 asked to insert a new entry.  In this case the new entry
+ *                 will be created.  If this causes the cache to exceed
+ *                 max_cache_size, it will do so.  The cache will attempt
+ *                 to reduce its size as entries are unprotected.
+ *
+ *              b) When running in parallel mode, the cache may not be
+ *		   permitted to flush a dirty entry in response to a read.
+ *		   If there are no clean entries available to evict, the
+ *		   cache will exceed its maximum size.  Again the cache
+ *                 will attempt to reduce its size to the max_cache_size
+ *                 limit on the next cache write.
+ *
+ *		c) When an entry increases in size, the cache may exceed
+ *		   the max_cache_size limit until the next time the cache
+ *		   attempts to load or insert an entry.
+ *
+ * min_clean_size: Nominal minimum number of clean bytes in the cache.
+ *              The cache attempts to maintain this number of bytes of
+ *              clean data so as to avoid case b) above.  Again, this is
+ *              a soft limit.
+ *
+ *
+ * In addition to the call back functions required for each entry, the
+ * cache requires the following call back functions for this instance of
+ * the cache as a whole:
+ *
+ * check_write_permitted:  In certain applications, the cache may not
+ *		be allowed to write to disk at certain time.  If specified,
+ *		the check_write_permitted function is used to determine if
+ *		a write is permissible at any given point in time.
+ *
+ *		If no such function is specified (i.e. this field is NULL),
+ *		the cache uses the following write_permitted field to
+ *		determine whether writes are permitted.
+ *
+ * write_permitted: If check_write_permitted is NULL, this boolean flag
+ *		indicates whether writes are permitted.
+ *
+ * log_flush:	If provided, this function is called whenever a dirty
+ *		entry is flushed to disk.
+ *
+ *
+ * In cases where memory is plentiful, and performance is an issue, it
+ * is useful to disable all cache evictions, and thereby postpone metadata
+ * writes.  The following field is used to implement this.
+ *
+ * evictions_enabled:  Boolean flag that is initialized to TRUE.  When
+ * 		this flag is set to FALSE, the metadata cache will not
+ * 		attempt to evict entries to make space for newly protected
+ * 		entries, and instead the will grow without limit.
+ * 		
+ * 		Needless to say, this feature must be used with care.
+ *
+ *
+ * The cache requires an index to facilitate searching for entries.  The
+ * following fields support that index.
+ *
+ * index_len:   Number of entries currently in the hash table used to index
+ *		the cache.
+ *
+ * index_size:  Number of bytes of cache entries currently stored in the
+ *              hash table used to index the cache.
+ *
+ *              This value should not be mistaken for footprint of the
+ *              cache in memory.  The average cache entry is small, and
+ *              the cache has a considerable overhead.  Multiplying the
+ *              index_size by two should yield a conservative estimate
+ *              of the cache's memory footprint.
+ *
+ * clean_index_size: Number of bytes of clean entries currently stored in
+ * 		the hash table.  Note that the index_size field (above)
+ *		is also the sum of the sizes of all entries in the cache.
+ *		Thus we should have the invarient that clean_index_size +
+ *		dirty_index_size == index_size.
+ *
+ *		WARNING:
+ *
+ *		1) The clean_index_size field is not maintained by the
+ *		   index macros, as the hash table doesn't care whether
+ *		   the entry is clean or dirty.  Instead the field is
+ *		   maintained in the H5C__UPDATE_RP macros.
+ *
+ *		2) The value of the clean_index_size must not be mistaken
+ *		   for the current clean size of the cache.  Rather, the
+ *		   clean size of the cache is the current value of
+ *		   clean_index_size plus the amount of empty space (if any)
+ *                 in the cache.
+ *
+ * dirty_index_size: Number of bytes of dirty entries currently stored in
+ * 		the hash table.  Note that the index_size field (above)
+ *		is also the sum of the sizes of all entries in the cache.
+ *		Thus we should have the invarient that clean_index_size +
+ *		dirty_index_size == index_size.
+ *
+ *		WARNING:
+ *
+ *		1) The dirty_index_size field is not maintained by the
+ *		   index macros, as the hash table doesn't care whether
+ *		   the entry is clean or dirty.  Instead the field is
+ *		   maintained in the H5C__UPDATE_RP macros.
+ *
+ * index:	Array of pointer to H5C_cache_entry_t of size
+ *		H5C__HASH_TABLE_LEN.  At present, this value is a power
+ *		of two, not the usual prime number.
+ *
+ *		I hope that the variable size of cache elements, the large
+ *		hash table size, and the way in which HDF5 allocates space
+ *		will combine to avoid problems with periodicity.  If so, we
+ *		can use a trivial hash function (a bit-and and a 3 bit left
+ *		shift) with some small savings.
+ *
+ *		If not, it will become evident in the statistics. Changing
+ *		to the usual prime number length hash table will require
+ *		changing the H5C__HASH_FCN macro and the deletion of the
+ *		H5C__HASH_MASK #define.  No other changes should be required.
+ *
+ *
+ * When we flush the cache, we need to write entries out in increasing
+ * address order.  An instance of a skip list is used to store dirty entries in
+ * sorted order.  Whether it is cheaper to sort the dirty entries as needed,
+ * or to maintain the list is an open question.  At a guess, it depends
+ * on how frequently the cache is flushed.  We will see how it goes.
+ *
+ * For now at least, I will not remove dirty entries from the list as they
+ * are flushed. (this has been changed -- dirty entries are now removed from
+ * the skip list as they are flushed.  JRM - 10/25/05)
+ *
+ * slist_len:   Number of entries currently in the skip list
+ *              used to maintain a sorted list of dirty entries in the
+ *              cache.
+ *
+ * slist_size:  Number of bytes of cache entries currently stored in the
+ *              skip list used to maintain a sorted list of
+ *              dirty entries in the cache.
+ *
+ * slist_ptr:   pointer to the instance of H5SL_t used maintain a sorted
+ *              list of dirty entries in the cache.  This sorted list has
+ *              two uses:
+ *
+ *              a) It allows us to flush dirty entries in increasing address
+ *                 order, which results in significant savings.
+ *
+ *              b) It facilitates checking for adjacent dirty entries when
+ *                 attempting to evict entries from the cache.  While we
+ *                 don't use this at present, I hope that this will allow
+ *                 some optimizations when I get to it.
+ *
+ * With the addition of the fractal heap, the cache must now deal with
+ * the case in which entries may be dirtied, moved, or have their sizes
+ * changed during a flush.  To allow sanity checks in this situation, the
+ * following two fields have been added.  They are only compiled in when
+ * H5C_DO_SANITY_CHECKS is TRUE.
+ *
+ * slist_len_increase: Number of entries that have been added to the
+ * 		slist since the last time this field was set to zero.
+ *
+ * slist_size_increase: Total size of all entries that have been added
+ * 		to the slist since the last time this field was set to
+ * 		zero.
+ *
+ *
+ * When a cache entry is protected, it must be removed from the LRU
+ * list(s) as it cannot be either flushed or evicted until it is unprotected.
+ * The following fields are used to implement the protected list (pl).
+ *
+ * pl_len:      Number of entries currently residing on the protected list.
+ *
+ * pl_size:     Number of bytes of cache entries currently residing on the
+ *              protected list.
+ *
+ * pl_head_ptr: Pointer to the head of the doubly linked list of protected
+ *              entries.  Note that cache entries on this list are linked
+ *              by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * pl_tail_ptr: Pointer to the tail of the doubly linked list of protected
+ *              entries.  Note that cache entries on this list are linked
+ *              by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * For very frequently used entries, the protect/unprotect overhead can
+ * become burdensome.  To avoid this overhead, I have modified the cache
+ * to allow entries to be "pinned".  A pinned entry is similar to a
+ * protected entry, in the sense that it cannot be evicted, and that
+ * the entry can be modified at any time.
+ *
+ * Pinning an entry has the following implications:
+ *
+ *	1) A pinned entry cannot be evicted.  Thus unprotected
+ *         pinned entries reside in the pinned entry list, instead
+ *         of the LRU list(s) (or other lists maintained by the current
+ *         replacement policy code).
+ *
+ *      2) A pinned entry can be accessed or modified at any time.
+ *         Therefore, the cache must check with the entry owner
+ *         before flushing it.  If permission is denied, the
+ *         cache just skips the entry in the flush.
+ *
+ *      3) A pinned entry can be marked as dirty (and possibly
+ *         change size) while it is unprotected.
+ *
+ *      4) The flush-destroy code must allow pinned entries to
+ *         be unpinned (and possibly unprotected) during the
+ *         flush.
+ *
+ * Since pinned entries cannot be evicted, they must be kept on a pinned
+ * entry list, instead of being entrusted to the replacement policy code.
+ *
+ * Maintaining the pinned entry list requires the following fields:
+ *
+ * pel_len:	Number of entries currently residing on the pinned
+ * 		entry list.
+ *
+ * pel_size:	Number of bytes of cache entries currently residing on
+ * 		the pinned entry list.
+ *
+ * pel_head_ptr: Pointer to the head of the doubly linked list of pinned
+ * 		but not protected entries.  Note that cache entries on
+ * 		this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * pel_tail_ptr: Pointer to the tail of the doubly linked list of pinned
+ * 		but not protected entries.  Note that cache entries on
+ * 		this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * The cache must have a replacement policy, and the fields supporting this
+ * policy must be accessible from this structure.
+ *
+ * While there has been interest in several replacement policies for
+ * this cache, the initial development schedule is tight.  Thus I have
+ * elected to support only a modified LRU policy for the first cut.
+ *
+ * To further simplify matters, I have simply included the fields needed
+ * by the modified LRU in this structure.  When and if we add support for
+ * other policies, it will probably be easiest to just add the necessary
+ * fields to this structure as well -- we only create one instance of this
+ * structure per file, so the overhead is not excessive.
+ *
+ *
+ * Fields supporting the modified LRU policy:
+ *
+ * See most any OS text for a discussion of the LRU replacement policy.
+ *
+ * When operating in parallel mode, we must ensure that a read does not
+ * cause a write.  If it does, the process will hang, as the write will
+ * be collective and the other processes will not know to participate.
+ *
+ * To deal with this issue, I have modified the usual LRU policy by adding
+ * clean and dirty LRU lists to the usual LRU list.
+ *
+ * The clean LRU list is simply the regular LRU list with all dirty cache
+ * entries removed.
+ *
+ * Similarly, the dirty LRU list is the regular LRU list with all the clean
+ * cache entries removed.
+ *
+ * When reading in parallel mode, we evict from the clean LRU list only.
+ * This implies that we must try to ensure that the clean LRU list is
+ * reasonably well stocked at all times.
+ *
+ * We attempt to do this by trying to flush enough entries on each write
+ * to keep the cLRU_list_size >= min_clean_size.
+ *
+ * Even if we start with a completely clean cache, a sequence of protects
+ * without unprotects can empty the clean LRU list.  In this case, the
+ * cache must grow temporarily.  At the next write, we will attempt to
+ * evict enough entries to reduce index_size to less than max_cache_size.
+ * While this will usually be possible, all bets are off if enough entries
+ * are protected.
+ *
+ * Discussions of the individual fields used by the modified LRU replacement
+ * policy follow:
+ *
+ * LRU_list_len:  Number of cache entries currently on the LRU list.
+ *
+ *              Observe that LRU_list_len + pl_len must always equal
+ *              index_len.
+ *
+ * LRU_list_size:  Number of bytes of cache entries currently residing on the
+ *              LRU list.
+ *
+ *              Observe that LRU_list_size + pl_size must always equal
+ *              index_size.
+ *
+ * LRU_head_ptr:  Pointer to the head of the doubly linked LRU list.  Cache
+ *              entries on this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * LRU_tail_ptr:  Pointer to the tail of the doubly linked LRU list.  Cache
+ *              entries on this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * cLRU_list_len: Number of cache entries currently on the clean LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * cLRU_list_size:  Number of bytes of cache entries currently residing on
+ *              the clean LRU list.
+ *
+ *              Observe that cLRU_list_size + dLRU_list_size must always
+ *              equal LRU_list_size.
+ *
+ * cLRU_head_ptr:  Pointer to the head of the doubly linked clean LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * cLRU_tail_ptr:  Pointer to the tail of the doubly linked clean LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * dLRU_list_len: Number of cache entries currently on the dirty LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * dLRU_list_size:  Number of cache entries currently on the dirty LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * dLRU_head_ptr:  Pointer to the head of the doubly linked dirty LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * dLRU_tail_ptr:  Pointer to the tail of the doubly linked dirty LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * Automatic cache size adjustment:
+ *
+ * While the default cache size is adequate for most cases, we can run into
+ * cases where the default is too small.  Ideally, we will let the user
+ * adjust the cache size as required.  However, this is not possible in all
+ * cases.  Thus I have added automatic cache size adjustment code.
+ *
+ * The configuration for the automatic cache size adjustment is stored in
+ * the structure described below:
+ *
+ * size_increase_possible:  Depending on the configuration data given
+ *		in the resize_ctl field, it may or may not be possible
+ *		to increase the size of the cache.  Rather than test for
+ *		all the ways this can happen, we simply set this flag when
+ *		we receive a new configuration.
+ *
+ * flash_size_increase_possible: Depending on the configuration data given
+ *              in the resize_ctl field, it may or may not be possible
+ *              for a flash size increase to occur.  We set this flag
+ *              whenever we receive a new configuration so as to avoid
+ *              repeated calculations.
+ *
+ * flash_size_increase_threshold: If a flash cache size increase is possible,
+ *              this field is used to store the minimum size of a new entry
+ *              or size increase needed to trigger a flash cache size
+ *              increase.  Note that this field must be updated whenever
+ *              the size of the cache is changed.
+ *
+ * size_decrease_possible:  Depending on the configuration data given
+ *              in the resize_ctl field, it may or may not be possible
+ *              to decrease the size of the cache.  Rather than test for
+ *              all the ways this can happen, we simply set this flag when
+ *              we receive a new configuration.
+ *
+ * cache_full:	Boolean flag used to keep track of whether the cache is
+ *		full, so we can refrain from increasing the size of a
+ *		cache which hasn't used up the space alotted to it.
+ *
+ *		The field is initialized to FALSE, and then set to TRUE
+ *		whenever we attempt to make space in the cache.
+ *
+ * resize_enabled:  This is another convenience flag which is set whenever
+ *		a new set of values for resize_ctl are provided.  Very
+ *		simply,
+ *
+ *		    resize_enabled = size_increase_possible ||
+ *                                   size_decrease_possible;
+ *
+ * size_decreased:  Boolean flag set to TRUE whenever the maximun cache
+ *		size is decreased.  The flag triggers a call to
+ *		H5C_make_space_in_cache() on the next call to H5C_protect().
+ *
+ * resize_ctl:	Instance of H5C_auto_size_ctl_t containing configuration
+ * 		data for automatic cache resizing.
+ *
+ * epoch_markers_active:  Integer field containing the number of epoch
+ *		markers currently in use in the LRU list.  This value
+ *		must be in the range [0, H5C__MAX_EPOCH_MARKERS - 1].
+ *
+ * epoch_marker_active:  Array of boolean of length H5C__MAX_EPOCH_MARKERS.
+ *		This array is used to track which epoch markers are currently
+ *		in use.
+ *
+ * epoch_marker_ringbuf:  Array of int of length H5C__MAX_EPOCH_MARKERS + 1.
+ *
+ *		To manage the epoch marker cache entries, it is necessary
+ *		to track their order in the LRU list.  This is done with
+ *		epoch_marker_ringbuf.  When markers are inserted at the
+ *		head of the LRU list, the index of the marker in the
+ *		epoch_markers array is inserted at the tail of the ring
+ *		buffer.  When it becomes the epoch_marker_active'th marker
+ *		in the LRU list, it will have worked its way to the head
+ *		of the ring buffer as well.  This allows us to remove it
+ *		without scanning the LRU list if such is required.
+ *
+ * epoch_marker_ringbuf_first: Integer field containing the index of the
+ *		first entry in the ring buffer.
+ *
+ * epoch_marker_ringbuf_last: Integer field containing the index of the
+ *		last entry in the ring buffer.
+ *
+ * epoch_marker_ringbuf_size: Integer field containing the number of entries
+ *		in the ring buffer.
+ *
+ * epoch_markers:  Array of instances of H5C_cache_entry_t of length
+ *		H5C__MAX_EPOCH_MARKERS.  The entries are used as markers
+ *		in the LRU list to identify cache entries that haven't
+ *		been accessed for some (small) specified number of
+ *		epochs.  These entries (if any) can then be evicted and
+ *		the cache size reduced -- ideally without evicting any
+ *		of the current working set.  Needless to say, the epoch
+ *		length and the number of epochs before an unused entry
+ *		must be chosen so that all, or almost all, the working
+ *		set will be accessed before the limit.
+ *
+ *		Epoch markers only appear in the LRU list, never in
+ *		the index or slist.  While they are of type
+ *		H5C__EPOCH_MARKER_TYPE, and have associated class
+ *		functions, these functions should never be called.
+ *
+ *		The addr fields of these instances of H5C_cache_entry_t
+ *		are set to the index of the instance in the epoch_markers
+ *		array, the size is set to 0, and the type field points
+ *		to the constant structure epoch_marker_class defined
+ *		in H5C.c.  The next and prev fields are used as usual
+ *		to link the entry into the LRU list.
+ *
+ *		All other fields are unused.
+ *
+ *
+ * Cache hit rate collection fields:
+ *
+ * We supply the current cache hit rate on request, so we must keep a
+ * simple cache hit rate computation regardless of whether statistics
+ * collection is enabled.  The following fields support this capability.
+ *
+ * cache_hits: Number of cache hits since the last time the cache hit
+ *	rate statistics were reset.  Note that when automatic cache
+ *	re-sizing is enabled, this field will be reset every automatic
+ *	resize epoch.
+ *
+ * cache_accesses: Number of times the cache has been accessed while
+ *	since the last since the last time the cache hit rate statistics
+ *	were reset.  Note that when automatic cache re-sizing is enabled,
+ *	this field will be reset every automatic resize epoch.
+ *
+ *
+ * Statistics collection fields:
+ *
+ * When enabled, these fields are used to collect statistics as described
+ * below.  The first set are collected only when H5C_COLLECT_CACHE_STATS
+ * is true.
+ *
+ * hits:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been in cache when requested in
+ *		the current epoch.
+ *
+ * misses:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has not been in cache when
+ *		requested in the current epoch.
+ *
+ * write_protects:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an entry with
+ * 		type id equal to the array index has been write protected
+ * 		in the current epoch.
+ *
+ * 		Observe that (hits + misses) = (write_protects + read_protects).
+ *
+ * read_protects: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an entry with
+ * 		type id equal to the array index has been read protected in
+ * 		the current epoch.
+ *
+ *              Observe that (hits + misses) = (write_protects + read_protects).
+ *
+ * max_read_protects:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ * 		The cells are used to maximum number of simultaneous read
+ * 		protects on any entry with type id equal to the array index
+ * 		in the current epoch.
+ *
+ * insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been inserted into the
+ *		cache in the current epoch.
+ *
+ * pinned_insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been inserted
+ * 		pinned into the cache in the current epoch.
+ *
+ * clears:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been cleared in the current
+ *		epoch.
+ *
+ * flushes:     Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been written to disk in the
+ *              current epoch.
+ *
+ * evictions:   Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been evicted from the cache in
+ *		the current epoch.
+ *
+ * moves:     Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been moved in the current
+ *		epoch.
+ *
+ * entry_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been moved
+ * 		during its flush callback in the current epoch.
+ *
+ * cache_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been moved
+ * 		during a cache flush in the current epoch.
+ *
+ * pins:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been pinned in the current
+ *		epoch.
+ *
+ * unpins:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been unpinned in the current
+ *		epoch.
+ *
+ * dirty_pins:	Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been marked dirty while pinned
+ *		in the current epoch.
+ *
+ * pinned_flushes:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an  entry
+ * 		with type id equal to the array index has been flushed while
+ * 		pinned in the current epoch.
+ *
+ * pinned_cleared:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an  entry
+ * 		with type id equal to the array index has been cleared while
+ * 		pinned in the current epoch.
+ *
+ * size_increases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ *		The cells are used to record the number of times an entry
+ *		with type id equal to the array index has increased in
+ *		size in the current epoch.
+ *
+ * size_decreases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ *		The cells are used to record the number of times an entry
+ *		with type id equal to the array index has decreased in
+ *		size in the current epoch.
+ *
+ * entry_flush_size_changes:  Array of int64 of length
+ * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
+ * 		the number of times an entry with type id equal to the
+ * 		array index has changed size while in its flush callback.
+ *
+ * cache_flush_size_changes:  Array of int64 of length
+ * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
+ * 		the number of times an entry with type id equal to the
+ * 		array index has changed size during a cache flush
+ *
+ * total_ht_insertions: Number of times entries have been inserted into the
+ *		hash table in the current epoch.
+ *
+ * total_ht_deletions: Number of times entries have been deleted from the
+ *              hash table in the current epoch.
+ *
+ * successful_ht_searches: int64 containing the total number of successful
+ *		searches of the hash table in the current epoch.
+ *
+ * total_successful_ht_search_depth: int64 containing the total number of
+ *		entries other than the targets examined in successful
+ *		searches of the hash table in the current epoch.
+ *
+ * failed_ht_searches: int64 containing the total number of unsuccessful
+ *              searches of the hash table in the current epoch.
+ *
+ * total_failed_ht_search_depth: int64 containing the total number of
+ *              entries examined in unsuccessful searches of the hash
+ *		table in the current epoch.
+ *
+ * max_index_len:  Largest value attained by the index_len field in the
+ *              current epoch.
+ *
+ * max_index_size:  Largest value attained by the index_size field in the
+ *              current epoch.
+ *
+ * max_clean_index_size: Largest value attained by the clean_index_size field
+ * 		in the current epoch.
+ *
+ * max_dirty_index_size: Largest value attained by the dirty_index_size field
+ * 		in the current epoch.
+ *
+ * max_slist_len:  Largest value attained by the slist_len field in the
+ *              current epoch.
+ *
+ * max_slist_size:  Largest value attained by the slist_size field in the
+ *              current epoch.
+ *
+ * max_pl_len:  Largest value attained by the pl_len field in the
+ *              current epoch.
+ *
+ * max_pl_size: Largest value attained by the pl_size field in the
+ *              current epoch.
+ *
+ * max_pel_len: Largest value attained by the pel_len field in the
+ *              current epoch.
+ *
+ * max_pel_size: Largest value attained by the pel_size field in the
+ *              current epoch.
+ *
+ * calls_to_msic: Total number of calls to H5C_make_space_in_cache
+ *
+ * total_entries_skipped_in_msic: Number of clean entries skipped while
+ *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
+ *
+ * total_entries_scanned_in_msic: Number of clean entries skipped while
+ *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
+ *
+ * max_entries_skipped_in_msic: Maximum number of clean entries skipped
+ *              in any one call to H5C_make_space_in_cache().
+ *
+ * max_entries_scanned_in_msic: Maximum number of entries scanned over
+ *              in any one call to H5C_make_space_in_cache().
+ *
+ * entries_scanned_to_make_space: Number of entries scanned only when looking
+ *              for entries to evict in order to make space in cache.
+
+ * The remaining stats are collected only when both H5C_COLLECT_CACHE_STATS
+ * and H5C_COLLECT_CACHE_ENTRY_STATS are true.
+ *
+ * max_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been
+ *		accessed in the current epoch.
+ *
+ * min_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the minimum number of times any single
+ *		entry with type id equal to the array index has been
+ *		accessed in the current epoch.
+ *
+ * max_clears:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been cleared
+ *		in the current epoch.
+ *
+ * max_flushes: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been
+ *		flushed in the current epoch.
+ *
+ * max_size:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *              are used to record the maximum size of any single entry
+ *		with type id equal to the array index that has resided in
+ *		the cache in the current epoch.
+ *
+ * max_pins:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *              are used to record the maximum number of times that any single
+ *              entry with type id equal to the array index that has been
+ *              marked as pinned in the cache in the current epoch.
+ *
+ *
+ * Fields supporting testing:
+ *
+ * prefix	Array of char used to prefix debugging output.  The
+ *		field is intended to allow marking of output of with
+ *		the processes mpi rank.
+ *
+ ****************************************************************************/
+
+#define H5C__HASH_TABLE_LEN     (64 * 1024) /* must be a power of 2 */
+
+#define H5C__H5C_T_MAGIC	0x005CAC0E
+#define H5C__MAX_NUM_TYPE_IDS	19
+#define H5C__PREFIX_LEN		32
+
+struct H5C_t
+{
+    uint32_t			magic;
+
+    hbool_t			flush_in_progress;
+
+    FILE *			trace_file_ptr;
+
+    void *			aux_ptr;
+
+    int32_t			max_type_id;
+    const char *                (* type_name_table_ptr);
+
+    size_t                      max_cache_size;
+    size_t                      min_clean_size;
+
+    H5C_write_permitted_func_t	check_write_permitted;
+    hbool_t			write_permitted;
+
+    H5C_log_flush_func_t	log_flush;
+
+    hbool_t			evictions_enabled;
+
+    int32_t                     index_len;
+    size_t                      index_size;
+    size_t 			clean_index_size;
+    size_t			dirty_index_size;
+    H5C_cache_entry_t *		(index[H5C__HASH_TABLE_LEN]);
+
+
+    int32_t                     slist_len;
+    size_t                      slist_size;
+    H5SL_t *                    slist_ptr;
+#if H5C_DO_SANITY_CHECKS
+    int64_t			slist_len_increase;
+    int64_t			slist_size_increase;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    int32_t                     pl_len;
+    size_t                      pl_size;
+    H5C_cache_entry_t *	        pl_head_ptr;
+    H5C_cache_entry_t *  	pl_tail_ptr;
+
+    int32_t                     pel_len;
+    size_t                      pel_size;
+    H5C_cache_entry_t *	        pel_head_ptr;
+    H5C_cache_entry_t *  	pel_tail_ptr;
+
+    int32_t                     LRU_list_len;
+    size_t                      LRU_list_size;
+    H5C_cache_entry_t *		LRU_head_ptr;
+    H5C_cache_entry_t *		LRU_tail_ptr;
+
+    int32_t                     cLRU_list_len;
+    size_t                      cLRU_list_size;
+    H5C_cache_entry_t *		cLRU_head_ptr;
+    H5C_cache_entry_t *		cLRU_tail_ptr;
+
+    int32_t                     dLRU_list_len;
+    size_t                      dLRU_list_size;
+    H5C_cache_entry_t *		dLRU_head_ptr;
+    H5C_cache_entry_t *	        dLRU_tail_ptr;
+
+    hbool_t			size_increase_possible;
+    hbool_t			flash_size_increase_possible;
+    size_t			flash_size_increase_threshold;
+    hbool_t			size_decrease_possible;
+    hbool_t			resize_enabled;
+    hbool_t			cache_full;
+    hbool_t			size_decreased;
+    H5C_auto_size_ctl_t		resize_ctl;
+
+    int32_t			epoch_markers_active;
+    hbool_t			epoch_marker_active[H5C__MAX_EPOCH_MARKERS];
+    int32_t			epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1];
+    int32_t			epoch_marker_ringbuf_first;
+    int32_t			epoch_marker_ringbuf_last;
+    int32_t			epoch_marker_ringbuf_size;
+    H5C_cache_entry_t		epoch_markers[H5C__MAX_EPOCH_MARKERS];
+
+    int64_t			cache_hits;
+    int64_t			cache_accesses;
+
+#if H5C_COLLECT_CACHE_STATS
+
+    /* stats fields */
+    int64_t                     hits[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     misses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     write_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     insertions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     evictions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     entry_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     cache_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     unpins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     size_increases[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     size_decreases[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
+
+    int64_t			total_ht_insertions;
+    int64_t			total_ht_deletions;
+    int64_t			successful_ht_searches;
+    int64_t			total_successful_ht_search_depth;
+    int64_t			failed_ht_searches;
+    int64_t			total_failed_ht_search_depth;
+
+    int32_t                     max_index_len;
+    size_t                      max_index_size;
+    size_t                      max_clean_index_size;
+    size_t                      max_dirty_index_size;
+
+    int32_t                     max_slist_len;
+    size_t                      max_slist_size;
+
+    int32_t                     max_pl_len;
+    size_t                      max_pl_size;
+
+    int32_t                     max_pel_len;
+    size_t                      max_pel_size;
+
+    int64_t                     calls_to_msic;
+    int64_t                     total_entries_skipped_in_msic;
+    int64_t                     total_entries_scanned_in_msic;
+    int32_t                     max_entries_skipped_in_msic;
+    int32_t                     max_entries_scanned_in_msic;
+    int64_t                     entries_scanned_to_make_space;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+    int32_t                     max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     min_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    size_t                      max_size[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_pins[H5C__MAX_NUM_TYPE_IDS + 1];
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    char			prefix[H5C__PREFIX_LEN];
+};
+
+

+/****************************************************************************/
+/***************************** Macro Definitions ****************************/
+/****************************************************************************/
+
+/****************************************************************************
+ *
+ * We maintain doubly linked lists of instances of H5C_cache_entry_t for a
+ * variety of reasons -- protected list, LRU list, and the clean and dirty
+ * LRU lists at present.  The following macros support linking and unlinking
+ * of instances of H5C_cache_entry_t by both their regular and auxilary next
+ * and previous pointers.
+ *
+ * The size and length fields are also maintained.
+ *
+ * Note that the relevant pair of prev and next pointers are presumed to be
+ * NULL on entry in the insertion macros.
+ *
+ * Finally, observe that the sanity checking macros evaluate to the empty
+ * string when H5C_DO_SANITY_CHECKS is FALSE.  They also contain calls
+ * to the HGOTO_ERROR macro, which may not be appropriate in all cases.
+ * If so, we will need versions of the insertion and deletion macros which
+ * do not reference the sanity checking macros.
+ *							JRM - 5/5/04
+ *
+ * Changes:
+ *
+ *  - Removed the line:
+ *
+ *        ( ( (Size) == (entry_ptr)->size ) && ( (len) != 1 ) ) ||
+ *
+ *    from the H5C__DLL_PRE_REMOVE_SC macro.  With the addition of the
+ *    epoch markers used in the age out based cache size reduction algorithm,
+ *    this invarient need not hold, as the epoch markers are of size 0.
+ *
+ *    One could argue that I should have given the epoch markers a positive
+ *    size, but this would break the index_size = LRU_list_size + pl_size
+ *    + pel_size invarient.
+ *
+ *    Alternatively, I could pass the current decr_mode in to the macro,
+ *    and just skip the check whenever epoch markers may be in use.
+ *
+ *    However, any size errors should be caught when the cache is flushed
+ *    and destroyed.  Until we are tracking such an error, this should be
+ *    good enough.
+ *                                                     JRM - 12/9/04
+ *
+ *
+ *  - In the H5C__DLL_PRE_INSERT_SC macro, replaced the lines:
+ *
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
+ *
+ *    with:
+ *
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
+ *
+ *    Epoch markers have size 0, so we can now have a non-empty list with
+ *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
+ *    in the sanity check.  Since "Size" is typically a size_t, it can't
+ *    take on negative values, and thus the revised clause "( (Size) < 0 )"
+ *    caused compiler warnings.
+ *                                                     JRM - 12/22/04
+ *
+ *  - In the H5C__DLL_SC macro, replaced the lines:
+ *
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) || ( (cache_ptr)->size <= 0 ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
+ *
+ *    with
+ *
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
+ *
+ *    Epoch markers have size 0, so we can now have a non-empty list with
+ *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
+ *    in the sanity check.  Since "Size" is typically a size_t, it can't
+ *    take on negative values, and thus the revised clause "( (Size) < 0 )"
+ *    caused compiler warnings.
+ *                                                     JRM - 1/10/05
+ *
+ *  - Added the H5C__DLL_UPDATE_FOR_SIZE_CHANGE macro and the associated
+ *    sanity checking macros.  These macro are used to update the size of
+ *    a DLL when one of its entries changes size.
+ *
+ *							JRM - 9/8/05
+ *
+ ****************************************************************************/
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+if ( ( (head_ptr) == NULL ) ||                                               \
+     ( (tail_ptr) == NULL ) ||                                               \
+     ( (entry_ptr) == NULL ) ||                                              \
+     ( (len) <= 0 ) ||                                                       \
+     ( (Size) < (entry_ptr)->size ) ||                                       \
+     ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (len) == 1 ) &&                                                     \
+       ( ! ( ( (head_ptr) == (entry_ptr) ) &&                                \
+             ( (tail_ptr) == (entry_ptr) ) &&                                \
+             ( (entry_ptr)->next == NULL ) &&                                \
+             ( (entry_ptr)->prev == NULL ) &&                                \
+             ( (Size) == (entry_ptr)->size )                                 \
+           )                                                                 \
+       )                                                                     \
+     )                                                                       \
+   ) {                                                                       \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed")     \
+}
+
+#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)                   \
+if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&           \
+       ( (head_ptr) != (tail_ptr) )                                      \
+     ) ||                                                                \
+     ( (len) < 0 ) ||                                                    \
+     ( (Size) < 0 ) ||                                                   \
+     ( ( (len) == 1 ) &&                                                 \
+       ( ( (head_ptr) != (tail_ptr) ) ||                                 \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )        \
+       )                                                                 \
+     ) ||                                                                \
+     ( ( (len) >= 1 ) &&                                                 \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||       \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )          \
+       )                                                                 \
+     )                                                                   \
+   ) {                                                                   \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed")  \
+}
+
+#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+if ( ( (entry_ptr) == NULL ) ||                                              \
+     ( (entry_ptr)->next != NULL ) ||                                        \
+     ( (entry_ptr)->prev != NULL ) ||                                        \
+     ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&               \
+       ( (head_ptr) != (tail_ptr) )                                          \
+     ) ||                                                                    \
+     ( (len) < 0 ) ||                                                        \
+     ( ( (len) == 1 ) &&                                                     \
+       ( ( (head_ptr) != (tail_ptr) ) ||                                     \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )            \
+       )                                                                     \
+     ) ||                                                                    \
+     ( ( (len) >= 1 ) &&                                                     \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||           \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )              \
+       )                                                                     \
+     )                                                                       \
+   ) {                                                                       \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed")     \
+}
+
+#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
+if ( ( (dll_len) <= 0 ) ||                                                    \
+     ( (dll_size) <= 0 ) ||                                                   \
+     ( (old_size) <= 0 ) ||                                                   \
+     ( (old_size) > (dll_size) ) ||                                           \
+     ( (new_size) <= 0 ) ||                                                   \
+     ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) {               \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \
+}
+
+#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
+if ( ( (new_size) > (dll_size) ) ||                                            \
+     ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) {                \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+        H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,    \
+                               fail_val)                                    \
+        if ( (head_ptr) == NULL )                                           \
+        {                                                                   \
+           (head_ptr) = (entry_ptr);                                        \
+           (tail_ptr) = (entry_ptr);                                        \
+        }                                                                   \
+        else                                                                \
+        {                                                                   \
+           (tail_ptr)->next = (entry_ptr);                                  \
+           (entry_ptr)->prev = (tail_ptr);                                  \
+           (tail_ptr) = (entry_ptr);                                        \
+        }                                                                   \
+        (len)++;                                                            \
+        (Size) += (entry_ptr)->size;
+
+#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+        H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,     \
+                               fail_val)                                     \
+        if ( (head_ptr) == NULL )                                            \
+        {                                                                    \
+           (head_ptr) = (entry_ptr);                                         \
+           (tail_ptr) = (entry_ptr);                                         \
+        }                                                                    \
+        else                                                                 \
+        {                                                                    \
+           (head_ptr)->prev = (entry_ptr);                                   \
+           (entry_ptr)->next = (head_ptr);                                   \
+           (head_ptr) = (entry_ptr);                                         \
+        }                                                                    \
+        (len)++;                                                             \
+        (Size) += entry_ptr->size;
+
+#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+        H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size,    \
+                               fail_val)                                    \
+        {                                                                   \
+           if ( (head_ptr) == (entry_ptr) )                                 \
+           {                                                                \
+              (head_ptr) = (entry_ptr)->next;                               \
+              if ( (head_ptr) != NULL )                                     \
+              {                                                             \
+                 (head_ptr)->prev = NULL;                                   \
+              }                                                             \
+           }                                                                \
+           else                                                             \
+           {                                                                \
+              (entry_ptr)->prev->next = (entry_ptr)->next;                  \
+           }                                                                \
+           if ( (tail_ptr) == (entry_ptr) )                                 \
+           {                                                                \
+              (tail_ptr) = (entry_ptr)->prev;                               \
+              if ( (tail_ptr) != NULL )                                     \
+              {                                                             \
+                 (tail_ptr)->next = NULL;                                   \
+              }                                                             \
+           }                                                                \
+           else                                                             \
+           {                                                                \
+              (entry_ptr)->next->prev = (entry_ptr)->prev;                  \
+           }                                                                \
+           entry_ptr->next = NULL;                                          \
+           entry_ptr->prev = NULL;                                          \
+           (len)--;                                                         \
+           (Size) -= entry_ptr->size;                                       \
+        }
+
+#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \
+        H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)     \
+	(dll_size) -= (old_size);                                              \
+	(dll_size) += (new_size);                                              \
+        H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
+if ( ( (hd_ptr) == NULL ) ||                                                   \
+     ( (tail_ptr) == NULL ) ||                                                 \
+     ( (entry_ptr) == NULL ) ||                                                \
+     ( (len) <= 0 ) ||                                                         \
+     ( (Size) < (entry_ptr)->size ) ||                                         \
+     ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) ||            \
+     ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
+     ( ( (len) == 1 ) &&                                                       \
+       ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) &&   \
+             ( (entry_ptr)->aux_next == NULL ) &&                              \
+             ( (entry_ptr)->aux_prev == NULL ) &&                              \
+             ( (Size) == (entry_ptr)->size )                                   \
+           )                                                                   \
+       )                                                                       \
+     )                                                                         \
+   ) {                                                                         \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed")   \
+}
+
+#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                  \
+if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&              \
+       ( (head_ptr) != (tail_ptr) )                                         \
+     ) ||                                                                   \
+     ( (len) < 0 ) ||                                                       \
+     ( (Size) < 0 ) ||                                                      \
+     ( ( (len) == 1 ) &&                                                    \
+       ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                 \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )           \
+       )                                                                    \
+     ) ||                                                                   \
+     ( ( (len) >= 1 ) &&                                                    \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) ||      \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )         \
+       )                                                                    \
+     )                                                                      \
+   ) {                                                                      \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \
+}
+
+#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
+if ( ( (entry_ptr) == NULL ) ||                                                \
+     ( (entry_ptr)->aux_next != NULL ) ||                                      \
+     ( (entry_ptr)->aux_prev != NULL ) ||                                      \
+     ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&                   \
+       ( (hd_ptr) != (tail_ptr) )                                              \
+     ) ||                                                                      \
+     ( (len) < 0 ) ||                                                          \
+     ( ( (len) == 1 ) &&                                                       \
+       ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                      \
+         ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) )                  \
+       )                                                                       \
+     ) ||                                                                      \
+     ( ( (len) >= 1 ) &&                                                       \
+       ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) ||             \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )            \
+       )                                                                       \
+     )                                                                         \
+   ) {                                                                         \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed")   \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
+#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
+        H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,   \
+                                   fail_val)                                   \
+        if ( (head_ptr) == NULL )                                              \
+        {                                                                      \
+           (head_ptr) = (entry_ptr);                                           \
+           (tail_ptr) = (entry_ptr);                                           \
+        }                                                                      \
+        else                                                                   \
+        {                                                                      \
+           (tail_ptr)->aux_next = (entry_ptr);                                 \
+           (entry_ptr)->aux_prev = (tail_ptr);                                 \
+           (tail_ptr) = (entry_ptr);                                           \
+        }                                                                      \
+        (len)++;                                                               \
+        (Size) += entry_ptr->size;
+
+#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv)   \
+        H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
+                                   fv)                                       \
+        if ( (head_ptr) == NULL )                                            \
+        {                                                                    \
+           (head_ptr) = (entry_ptr);                                         \
+           (tail_ptr) = (entry_ptr);                                         \
+        }                                                                    \
+        else                                                                 \
+        {                                                                    \
+           (head_ptr)->aux_prev = (entry_ptr);                               \
+           (entry_ptr)->aux_next = (head_ptr);                               \
+           (head_ptr) = (entry_ptr);                                         \
+        }                                                                    \
+        (len)++;                                                             \
+        (Size) += entry_ptr->size;
+
+#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv)    \
+        H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
+                                   fv)                                       \
+        {                                                                    \
+           if ( (head_ptr) == (entry_ptr) )                                  \
+           {                                                                 \
+              (head_ptr) = (entry_ptr)->aux_next;                            \
+              if ( (head_ptr) != NULL )                                      \
+              {                                                              \
+                 (head_ptr)->aux_prev = NULL;                                \
+              }                                                              \
+           }                                                                 \
+           else                                                              \
+           {                                                                 \
+              (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next;       \
+           }                                                                 \
+           if ( (tail_ptr) == (entry_ptr) )                                  \
+           {                                                                 \
+              (tail_ptr) = (entry_ptr)->aux_prev;                            \
+              if ( (tail_ptr) != NULL )                                      \
+              {                                                              \
+                 (tail_ptr)->aux_next = NULL;                                \
+              }                                                              \
+           }                                                                 \
+           else                                                              \
+           {                                                                 \
+              (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev;       \
+           }                                                                 \
+           entry_ptr->aux_next = NULL;                                       \
+           entry_ptr->aux_prev = NULL;                                       \
+           (len)--;                                                          \
+           (Size) -= entry_ptr->size;                                        \
+        }
+
+

+/***********************************************************************
+ *
+ * Stats collection macros
+ *
+ * The following macros must handle stats collection when this collection
+ * is enabled, and evaluate to the empty string when it is not.
+ *
+ * The sole exception to this rule is
+ * H5C__UPDATE_CACHE_HIT_RATE_STATS(), which is always active as
+ * the cache hit rate stats are always collected and available.
+ *
+ * Changes:
+ *
+ * 	JRM -- 3/21/06
+ * 	Added / updated macros for pinned entry related stats.
+ *
+ * 	JRM -- 8/9/06
+ * 	More pinned entry stats related updates.
+ *
+ * 	JRM -- 3/31/07
+ * 	Updated H5C__UPDATE_STATS_FOR_PROTECT() to keep stats on
+ * 	read and write protects.
+ *
+ *      MAM -- 1/15/09
+ *      Created H5C__UPDATE_MAX_INDEX_SIZE_STATS to contain
+ *      common code within macros that update the maximum
+ *      index, clean_index, and dirty_index statistics fields.
+ *
+ ***********************************************************************/
+
+#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
+        (cache_ptr->cache_accesses)++;                   \
+        if ( hit ) {                                     \
+            (cache_ptr->cache_hits)++;                   \
+        }                                                \
+
+#if H5C_COLLECT_CACHE_STATS
+
+#define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
+        if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size )       \
+            (cache_ptr)->max_index_size = (cache_ptr)->index_size;         \
+        if ( (cache_ptr)->clean_index_size >                               \
+                (cache_ptr)->max_clean_index_size )                        \
+            (cache_ptr)->max_clean_index_size =                            \
+                (cache_ptr)->clean_index_size;                             \
+        if ( (cache_ptr)->dirty_index_size >                               \
+                (cache_ptr)->max_dirty_index_size )                        \
+            (cache_ptr)->max_dirty_index_size =                            \
+                (cache_ptr)->dirty_index_size;
+
+#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
+	(((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)                   \
+        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )   \
+	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;     \
+        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
+	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;   \
+	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+
+#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)               \
+	if ( cache_ptr->flush_in_progress ) {                            \
+            ((cache_ptr)->cache_flush_moves[(entry_ptr)->type->id])++; \
+	}                                                                \
+        if ( entry_ptr->flush_in_progress ) {                            \
+            ((cache_ptr)->entry_flush_moves[(entry_ptr)->type->id])++; \
+	}                                                                \
+	(((cache_ptr)->moves)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
+	if ( cache_ptr->flush_in_progress ) {                                  \
+            ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++;  \
+	}                                                                      \
+        if ( entry_ptr->flush_in_progress ) {                                  \
+            ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++;  \
+	}                                                                      \
+	if ( (entry_ptr)->size < (new_size) ) {                                \
+	    ((cache_ptr)->size_increases[(entry_ptr)->type->id])++;            \
+            H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
+            if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )       \
+                (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;         \
+            if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )             \
+                (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;               \
+	} else if ( (entry_ptr)->size > (new_size) ) {                         \
+	    ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++;            \
+	}
+
+#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
+	(cache_ptr)->total_ht_insertions++;
+
+#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
+	(cache_ptr)->total_ht_deletions++;
+
+#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)  \
+	if ( success ) {                                            \
+	    (cache_ptr)->successful_ht_searches++;                  \
+	    (cache_ptr)->total_successful_ht_search_depth += depth; \
+	} else {                                                    \
+	    (cache_ptr)->failed_ht_searches++;                      \
+	    (cache_ptr)->total_failed_ht_search_depth += depth;     \
+	}
+
+#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
+	((cache_ptr)->unpins)[(entry_ptr)->type->id]++;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
+        (entry_ptr)->accesses = 0;              \
+        (entry_ptr)->clears   = 0;              \
+        (entry_ptr)->flushes  = 0;              \
+	(entry_ptr)->pins     = 0;
+
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)            \
+	(((cache_ptr)->clears)[(entry_ptr)->type->id])++;            \
+        if ( (entry_ptr)->is_pinned ) {                              \
+	    (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \
+	}                                                            \
+        ((entry_ptr)->clears)++;
+
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)             \
+	(((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
+        if ( (entry_ptr)->is_pinned ) {                               \
+	    (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
+	}                                                             \
+        ((entry_ptr)->flushes)++;
+
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)        \
+	(((cache_ptr)->evictions)[(entry_ptr)->type->id])++;        \
+        if ( (entry_ptr)->accesses >                                \
+             ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] ) { \
+            ((cache_ptr)->max_accesses)[(entry_ptr)->type->id]      \
+                = (entry_ptr)->accesses;                            \
+        }                                                           \
+        if ( (entry_ptr)->accesses <                                \
+             ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] ) { \
+            ((cache_ptr)->min_accesses)[(entry_ptr)->type->id]      \
+                = (entry_ptr)->accesses;                            \
+        }                                                           \
+        if ( (entry_ptr)->clears >                                  \
+             ((cache_ptr)->max_clears)[(entry_ptr)->type->id] ) {   \
+            ((cache_ptr)->max_clears)[(entry_ptr)->type->id]        \
+                 = (entry_ptr)->clears;                             \
+        }                                                           \
+        if ( (entry_ptr)->flushes >                                 \
+             ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] ) {  \
+            ((cache_ptr)->max_flushes)[(entry_ptr)->type->id]       \
+                 = (entry_ptr)->flushes;                            \
+        }                                                           \
+        if ( (entry_ptr)->size >                                    \
+             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {     \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id]          \
+                 = (entry_ptr)->size;                               \
+        }                                                           \
+        if ( (entry_ptr)->pins >                                    \
+             ((cache_ptr)->max_pins)[(entry_ptr)->type->id] ) {     \
+            ((cache_ptr)->max_pins)[(entry_ptr)->type->id]          \
+                 = (entry_ptr)->pins;                               \
+        }
+
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)            \
+	(((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
+	if ( (entry_ptr)->is_pinned ) {                                  \
+	    (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
+	    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
+            (entry_ptr)->pins++;                                         \
+	    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+	        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+	    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+	        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
+	}                                                                \
+        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
+	    (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
+        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
+        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
+	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
+        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
+	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;       \
+        if ( (entry_ptr)->size >                                         \
+             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {          \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id]               \
+                 = (entry_ptr)->size;                                    \
+        }
+
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)             \
+	if ( hit )                                                           \
+            ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                    \
+	else                                                                 \
+            ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                  \
+        if ( ! ((entry_ptr)->is_read_only) ) {                               \
+	    ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;          \
+	} else {                                                             \
+	    ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;           \
+	    if ( ((entry_ptr)->ro_ref_count) >                               \
+		 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \
+	        ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =    \
+			((entry_ptr)->ro_ref_count);                         \
+	    }                                                                \
+	}                                                                    \
+        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )           \
+            (cache_ptr)->max_index_len = (cache_ptr)->index_len;             \
+        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                          \
+        if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                 \
+            (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                   \
+        if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )               \
+            (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;                 \
+        if ( (entry_ptr)->size >                                             \
+             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {              \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id]                   \
+                 = (entry_ptr)->size;                                        \
+        }                                                                    \
+        ((entry_ptr)->accesses)++;
+
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)          \
+	((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
+        (entry_ptr)->pins++;                                     \
+	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
+	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
+	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
+	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+
+#else /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)             \
+        if ( (entry_ptr)->is_pinned ) {                               \
+	    (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++;  \
+	}                                                             \
+	(((cache_ptr)->clears)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)             \
+	(((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
+        if ( (entry_ptr)->is_pinned ) {                               \
+	    (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
+	}
+
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \
+	(((cache_ptr)->evictions)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)            \
+	(((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
+	if ( (entry_ptr)->is_pinned ) {                                  \
+	    (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
+	    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
+	    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+	        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+	    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+	        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
+	}                                                                \
+        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
+	    (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
+        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
+        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
+	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
+        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
+	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;
+
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)             \
+	if ( hit )                                                           \
+            ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                    \
+	else                                                                 \
+            ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                  \
+        if ( ! ((entry_ptr)->is_read_only) ) {                               \
+	    ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;          \
+	} else {                                                             \
+	    ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;           \
+	    if ( ((entry_ptr)->ro_ref_count) >                               \
+		 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \
+	        ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =    \
+			((entry_ptr)->ro_ref_count);                         \
+	    }                                                                \
+	}                                                                    \
+        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )           \
+            (cache_ptr)->max_index_len = (cache_ptr)->index_len;             \
+        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                          \
+        if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                 \
+            (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                   \
+        if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )               \
+            (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;
+
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)          \
+	((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
+	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
+	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
+	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
+	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+#else /* H5C_COLLECT_CACHE_STATS */
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)
+#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+

+/***********************************************************************
+ *
+ * Hash table access and manipulation macros:
+ *
+ * The following macros handle searches, insertions, and deletion in
+ * the hash table.
+ *
+ * When modifying these macros, remember to modify the similar macros
+ * in tst/cache.c
+ *
+ * Changes:
+ *
+ *   - Updated existing index macros and sanity check macros to maintain
+ *     the clean_index_size and dirty_index_size fields of H5C_t.  Also
+ *     added macros to allow us to track entry cleans and dirties.
+ *
+ *     						JRM -- 11/5/08
+ *
+ ***********************************************************************/
+
+/* H5C__HASH_TABLE_LEN is defined in H5Cpkg.h.  It mut be a power of two. */
+
+#define H5C__HASH_MASK		((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
+
+#define H5C__HASH_FCN(x)	(int)(((x) & H5C__HASH_MASK) >> 3)
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
+if ( ( (cache_ptr) == NULL ) ||                               \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||            \
+     ( (entry_ptr) == NULL ) ||                               \
+     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||             \
+     ( (entry_ptr)->ht_next != NULL ) ||                      \
+     ( (entry_ptr)->ht_prev != NULL ) ||                      \
+     ( (entry_ptr)->size <= 0 ) ||                            \
+     ( (k = H5C__HASH_FCN((entry_ptr)->addr)) < 0 ) ||        \
+     ( k >= H5C__HASH_TABLE_LEN ) ||                          \
+     ( (cache_ptr)->index_size !=                             \
+       ((cache_ptr)->clean_index_size +                       \
+	(cache_ptr)->dirty_index_size) ) ) {                  \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,              \
+               "Pre HT insert SC failed")                     \
+}
+
+#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
+     ( (cache_ptr)->index_len < 1 ) ||                                  \
+     ( (entry_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                 \
+     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||                       \
+     ( (entry_ptr)->size <= 0 ) ||                                      \
+     ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) ||                        \
+     ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) ||     \
+     ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]         \
+       == NULL ) ||                                                     \
+     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]       \
+       != (entry_ptr) ) &&                                              \
+       ( (entry_ptr)->ht_prev == NULL ) ) ||                            \
+     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] ==    \
+         (entry_ptr) ) &&                                               \
+       ( (entry_ptr)->ht_prev != NULL ) ) ||                            \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+	(cache_ptr)->dirty_index_size) ) ) {                            \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Pre HT remove SC failed") \
+}
+
+/* (Keep in sync w/H5C_TEST__PRE_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
+#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                    \
+if ( ( (cache_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
+     ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( ! H5F_addr_defined(Addr) ) ||                                        \
+     ( H5C__HASH_FCN(Addr) < 0 ) ||                                         \
+     ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) {                     \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \
+}
+
+/* (Keep in sync w/H5C_TEST__POST_SUC_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
+#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+if ( ( (cache_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
+     ( (cache_ptr)->index_len < 1 ) ||                                      \
+     ( (entry_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                     \
+     ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( H5F_addr_ne((entry_ptr)->addr, (Addr)) ) ||                          \
+     ( (entry_ptr)->size <= 0 ) ||                                          \
+     ( ((cache_ptr)->index)[k] == NULL ) ||                                 \
+     ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) &&                        \
+       ( (entry_ptr)->ht_prev == NULL ) ) ||                                \
+     ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) &&                        \
+       ( (entry_ptr)->ht_prev != NULL ) ) ||                                \
+     ( ( (entry_ptr)->ht_prev != NULL ) &&                                  \
+       ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) ||                \
+     ( ( (entry_ptr)->ht_next != NULL ) &&                                  \
+       ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) {               \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                            \
+                "Post successful HT search SC failed")                      \
+}
+
+/* (Keep in sync w/H5C_TEST__POST_HT_SHIFT_TO_FRONT macro in test/cache_common.h -QAK) */
+#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
+if ( ( (cache_ptr) == NULL ) ||                                        \
+     ( ((cache_ptr)->index)[k] != (entry_ptr) ) ||                     \
+     ( (entry_ptr)->ht_prev != NULL ) ) {                              \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                       \
+                "Post HT shift to front SC failed")                    \
+}
+
+#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                         entry_ptr, was_clean)          \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->index_len <= 0 ) ||                                 \
+     ( (cache_ptr)->index_size <= 0 ) ||                                \
+     ( (new_size) <= 0 ) ||                                             \
+     ( (old_size) > (cache_ptr)->index_size ) ||                        \
+     ( (new_size) <= 0 ) ||                                             \
+     ( ( (cache_ptr)->index_len == 1 ) &&                               \
+       ( (cache_ptr)->index_size != (old_size) ) ) ||                   \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+        (cache_ptr)->dirty_index_size) ) ||                             \
+     ( (entry_ptr == NULL) ) ||                                         \
+     ( ( !( was_clean ) ||                                              \
+	    ( (cache_ptr)->clean_index_size < (old_size) ) ) &&         \
+	  ( ( (was_clean) ) ||                                          \
+	    ( (cache_ptr)->dirty_index_size < (old_size) ) ) ) ||       \
+     ( (entry_ptr) == NULL ) ) {                                        \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                            \
+                "Pre HT entry size change SC failed")                   \
+}
+
+#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,  \
+		                          entry_ptr)                      \
+if ( ( (cache_ptr) == NULL ) ||                                           \
+     ( (cache_ptr)->index_len <= 0 ) ||                                   \
+     ( (cache_ptr)->index_size <= 0 ) ||                                  \
+     ( (new_size) > (cache_ptr)->index_size ) ||                          \
+     ( (cache_ptr)->index_size !=                                         \
+	  ((cache_ptr)->clean_index_size +                                \
+           (cache_ptr)->dirty_index_size) ) ||                            \
+     ( ( !((entry_ptr)->is_dirty ) ||                                     \
+	    ( (cache_ptr)->dirty_index_size < (new_size) ) ) &&           \
+	  ( ( ((entry_ptr)->is_dirty)  ) ||                               \
+	    ( (cache_ptr)->clean_index_size < (new_size) ) ) ) ||         \
+     ( ( (cache_ptr)->index_len == 1 ) &&                                 \
+       ( (cache_ptr)->index_size != (new_size) ) ) ) {                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                              \
+                "Post HT entry size change SC failed")                    \
+}
+
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)           \
+if (                                                                          \
+    ( (cache_ptr) == NULL ) ||                                                \
+    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
+    ( (cache_ptr)->index_len <= 0 ) ||                                        \
+    ( (entry_ptr) == NULL ) ||                                                \
+    ( (entry_ptr)->is_dirty != FALSE ) ||                                     \
+    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
+    ( (cache_ptr)->dirty_index_size < (entry_ptr)->size ) ||                  \
+    ( (cache_ptr)->index_size !=                                              \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ) {  \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
+                "Pre HT update for entry clean SC failed")                    \
+}
+
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)           \
+if (                                                                          \
+    ( (cache_ptr) == NULL ) ||                                                \
+    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
+    ( (cache_ptr)->index_len <= 0 ) ||                                        \
+    ( (entry_ptr) == NULL ) ||                                                \
+    ( (entry_ptr)->is_dirty != TRUE ) ||                                      \
+    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
+    ( (cache_ptr)->clean_index_size < (entry_ptr)->size ) ||                  \
+    ( (cache_ptr)->index_size !=                                              \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ) {  \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
+                "Pre HT update for entry dirty SC failed")                    \
+}
+
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)        \
+if ( (cache_ptr)->index_size !=                                             \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) {  \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
+                "Post HT update for entry clean SC failed")                 \
+}
+
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)        \
+if ( (cache_ptr)->index_size !=                                             \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) {  \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
+                "Post HT update for entry dirty SC failed")                 \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
+#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)
+#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val)
+#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                         entry_ptr, was_clean)
+#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                          entry_ptr)
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
+{                                                            \
+    int k;                                                   \
+    H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)    \
+    k = H5C__HASH_FCN((entry_ptr)->addr);                    \
+    if ( ((cache_ptr)->index)[k] == NULL )                   \
+    {                                                        \
+        ((cache_ptr)->index)[k] = (entry_ptr);               \
+    }                                                        \
+    else                                                     \
+    {                                                        \
+        (entry_ptr)->ht_next = ((cache_ptr)->index)[k];      \
+        (entry_ptr)->ht_next->ht_prev = (entry_ptr);         \
+        ((cache_ptr)->index)[k] = (entry_ptr);               \
+    }                                                        \
+    (cache_ptr)->index_len++;                                \
+    (cache_ptr)->index_size += (entry_ptr)->size;            \
+    if ( (entry_ptr)->is_dirty ) {                           \
+        (cache_ptr)->dirty_index_size += (entry_ptr)->size;  \
+    } else {                                                 \
+	(cache_ptr)->clean_index_size += (entry_ptr)->size;  \
+    }                                                        \
+    H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)            \
+}
+
+#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)          \
+{                                                             \
+    int k;                                                    \
+    H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)               \
+    k = H5C__HASH_FCN((entry_ptr)->addr);                     \
+    if ( (entry_ptr)->ht_next )                               \
+    {                                                         \
+        (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
+    }                                                         \
+    if ( (entry_ptr)->ht_prev )                               \
+    {                                                         \
+        (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
+    }                                                         \
+    if ( ((cache_ptr)->index)[k] == (entry_ptr) )             \
+    {                                                         \
+        ((cache_ptr)->index)[k] = (entry_ptr)->ht_next;       \
+    }                                                         \
+    (entry_ptr)->ht_next = NULL;                              \
+    (entry_ptr)->ht_prev = NULL;                              \
+    (cache_ptr)->index_len--;                                 \
+    (cache_ptr)->index_size -= (entry_ptr)->size;             \
+    if ( (entry_ptr)->is_dirty ) {                            \
+        (cache_ptr)->dirty_index_size -= (entry_ptr)->size;   \
+    } else {                                                  \
+	(cache_ptr)->clean_index_size -= (entry_ptr)->size;   \
+    }                                                         \
+    H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)              \
+}
+
+#define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val)             \
+{                                                                           \
+    int k;                                                                  \
+    int depth = 0;                                                          \
+    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
+    k = H5C__HASH_FCN(Addr);                                                \
+    entry_ptr = ((cache_ptr)->index)[k];                                    \
+    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) )     \
+    {                                                                       \
+        (entry_ptr) = (entry_ptr)->ht_next;                                 \
+        (depth)++;                                                          \
+    }                                                                       \
+    if ( entry_ptr )                                                        \
+    {                                                                       \
+        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+        if ( entry_ptr != ((cache_ptr)->index)[k] )                         \
+        {                                                                   \
+            if ( (entry_ptr)->ht_next )                                     \
+            {                                                               \
+                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
+            }                                                               \
+            HDassert( (entry_ptr)->ht_prev != NULL );                       \
+            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
+            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
+            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
+            (entry_ptr)->ht_prev = NULL;                                    \
+            ((cache_ptr)->index)[k] = (entry_ptr);                          \
+            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
+        }                                                                   \
+    }                                                                       \
+    H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth)  \
+}
+
+#define H5C__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val)    \
+{                                                                           \
+    int k;                                                                  \
+    int depth = 0;                                                          \
+    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
+    k = H5C__HASH_FCN(Addr);                                                \
+    entry_ptr = ((cache_ptr)->index)[k];                                    \
+    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) )     \
+    {                                                                       \
+        (entry_ptr) = (entry_ptr)->ht_next;                                 \
+        (depth)++;                                                          \
+    }                                                                       \
+    if ( entry_ptr )                                                        \
+    {                                                                       \
+        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+        if ( entry_ptr != ((cache_ptr)->index)[k] )                         \
+        {                                                                   \
+            if ( (entry_ptr)->ht_next )                                     \
+            {                                                               \
+                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
+            }                                                               \
+            HDassert( (entry_ptr)->ht_prev != NULL );                       \
+            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
+            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
+            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
+            (entry_ptr)->ht_prev = NULL;                                    \
+            ((cache_ptr)->index)[k] = (entry_ptr);                          \
+            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
+        }                                                                   \
+    }                                                                       \
+}
+
+#define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr)   \
+{                                                                 \
+    H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr);  \
+    (cache_ptr)->dirty_index_size -= (entry_ptr)->size;           \
+    (cache_ptr)->clean_index_size += (entry_ptr)->size;           \
+    H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr); \
+}
+
+#define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)   \
+{                                                                 \
+    H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr);  \
+    (cache_ptr)->clean_index_size -= (entry_ptr)->size;           \
+    (cache_ptr)->dirty_index_size += (entry_ptr)->size;           \
+    H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr); \
+}
+
+#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size, \
+		                          entry_ptr, was_clean)          \
+{                                                                        \
+    H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,      \
+		                     entry_ptr, was_clean)               \
+    (cache_ptr)->index_size -= (old_size);                               \
+    (cache_ptr)->index_size += (new_size);                               \
+    if ( was_clean ) {                                                   \
+        (cache_ptr)->clean_index_size -= (old_size);                     \
+    } else {                                                             \
+	(cache_ptr)->dirty_index_size -= (old_size);                     \
+    }                                                                    \
+    if ( (entry_ptr)->is_dirty ) {                                       \
+        (cache_ptr)->dirty_index_size += (new_size);                     \
+    } else {                                                             \
+	(cache_ptr)->clean_index_size += (new_size);                     \
+    }                                                                    \
+    H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,     \
+                                      entry_ptr)                         \
+}
+
+

+/**************************************************************************
+ *
+ * Skip list insertion and deletion macros:
+ *
+ * These used to be functions, but I converted them to macros to avoid some
+ * function call overhead.
+ *
+ **************************************************************************/
+
+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__INSERT_ENTRY_IN_SLIST
+ *
+ * Purpose:     Insert the specified instance of H5C_cache_entry_t into
+ *		the skip list in the specified instance of H5C_t.  Update
+ *		the associated length and size fields.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/10/04
+ *
+ * Modifications:
+ *
+ *		JRM -- 7/21/04
+ *		Updated function to set the in_tree flag when inserting
+ *		an entry into the tree.  Also modified the function to
+ *		update the tree size and len fields instead of the similar
+ *		index fields.
+ *
+ *		All of this is part of the modifications to support the
+ *		hash table.
+ *
+ *		JRM -- 7/27/04
+ *		Converted the function H5C_insert_entry_in_tree() into
+ *		the macro H5C__INSERT_ENTRY_IN_TREE in the hopes of
+ *		wringing a little more speed out of the cache.
+ *
+ *		Note that we don't bother to check if the entry is already
+ *		in the tree -- if it is, H5SL_insert() will fail.
+ *
+ *		QAK -- 11/27/04
+ *		Switched over to using skip list routines.
+ *
+ *		JRM -- 6/27/06
+ *		Added fail_val parameter.
+ *
+ *		JRM -- 8/25/06
+ *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *
+ *		This version maintains the slist_len_increase and
+ *		slist_size_increase fields that are used in sanity
+ *		checks in the flush routines.
+ *
+ *		All this is needed as the fractal heap needs to be
+ *		able to dirty, resize and/or move entries during the
+ *		flush.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
+{                                                                              \
+    HDassert( (cache_ptr) );                                                   \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
+    HDassert( (entry_ptr) );                                                   \
+    HDassert( (entry_ptr)->size > 0 );                                         \
+    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
+    HDassert( !((entry_ptr)->in_slist) );                                      \
+                                                                               \
+    if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr)    \
+                                                                         < 0 ) \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
+                    "Can't insert entry in skip list")                         \
+                                                                               \
+    (entry_ptr)->in_slist = TRUE;                                              \
+    (cache_ptr)->slist_len++;                                                  \
+    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
+    (cache_ptr)->slist_len_increase++;                                         \
+    (cache_ptr)->slist_size_increase += (entry_ptr)->size;                     \
+                                                                               \
+    HDassert( (cache_ptr)->slist_len > 0 );                                    \
+    HDassert( (cache_ptr)->slist_size > 0 );                                   \
+                                                                               \
+} /* H5C__INSERT_ENTRY_IN_SLIST */
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
+{                                                                              \
+    HDassert( (cache_ptr) );                                                   \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
+    HDassert( (entry_ptr) );                                                   \
+    HDassert( (entry_ptr)->size > 0 );                                         \
+    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
+    HDassert( !((entry_ptr)->in_slist) );                                      \
+                                                                               \
+    if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr)    \
+                                                                         < 0 ) \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
+                    "Can't insert entry in skip list")                         \
+                                                                               \
+    (entry_ptr)->in_slist = TRUE;                                              \
+    (cache_ptr)->slist_len++;                                                  \
+    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
+                                                                               \
+    HDassert( (cache_ptr)->slist_len > 0 );                                    \
+    HDassert( (cache_ptr)->slist_size > 0 );                                   \
+                                                                               \
+} /* H5C__INSERT_ENTRY_IN_SLIST */
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__REMOVE_ENTRY_FROM_SLIST
+ *
+ * Purpose:     Remove the specified instance of H5C_cache_entry_t from the
+ *		index skip list in the specified instance of H5C_t.  Update
+ *		the associated length and size fields.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/10/04
+ *
+ * Modifications:
+ *
+ *		JRM -- 7/21/04
+ *		Updated function for the addition of the hash table.
+ *
+ *		JRM - 7/27/04
+ *		Converted from the function H5C_remove_entry_from_tree()
+ *		to the macro H5C__REMOVE_ENTRY_FROM_TREE in the hopes of
+ *		wringing a little more performance out of the cache.
+ *
+ *		QAK -- 11/27/04
+ *		Switched over to using skip list routines.
+ *
+ *		JRM -- 3/28/07
+ *		Updated sanity checks for the new is_read_only and
+ *		ro_ref_count fields in H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)          \
+{                                                                   \
+    HDassert( (cache_ptr) );                                        \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );             \
+    HDassert( (entry_ptr) );                                        \
+    HDassert( !((entry_ptr)->is_protected) );                       \
+    HDassert( !((entry_ptr)->is_read_only) );                       \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                   \
+    HDassert( (entry_ptr)->size > 0 );                              \
+    HDassert( (entry_ptr)->in_slist );                              \
+    HDassert( (cache_ptr)->slist_ptr );                             \
+                                                                    \
+    if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr)    \
+         != (entry_ptr) )                                           \
+                                                                    \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL,                  \
+                    "Can't delete entry from skip list.")           \
+                                                                    \
+    HDassert( (cache_ptr)->slist_len > 0 );                         \
+    (cache_ptr)->slist_len--;                                       \
+    HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size );       \
+    (cache_ptr)->slist_size -= (entry_ptr)->size;                   \
+    (entry_ptr)->in_slist = FALSE;                                  \
+} /* H5C__REMOVE_ENTRY_FROM_SLIST */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE
+ *
+ * Purpose:     Update cache_ptr->slist_size for a change in the size of
+ *		and entry in the slist.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 9/07/05
+ *
+ * Modifications:
+ *
+ *		JRM -- 8/27/06
+ *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *
+ *		This version maintains the slist_size_increase field
+ *		that are used in sanity checks in the flush routines.
+ *
+ *		All this is needed as the fractal heap needs to be
+ *		able to dirty, resize and/or move entries during the
+ *		flush.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
+{                                                                        \
+    HDassert( (cache_ptr) );                                             \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                  \
+    HDassert( (old_size) > 0 );                                          \
+    HDassert( (new_size) > 0 );                                          \
+    HDassert( (old_size) <= (cache_ptr)->slist_size );                   \
+    HDassert( (cache_ptr)->slist_len > 0 );                              \
+    HDassert( ((cache_ptr)->slist_len > 1) ||                            \
+              ( (cache_ptr)->slist_size == (old_size) ) );               \
+                                                                         \
+    (cache_ptr)->slist_size -= (old_size);                               \
+    (cache_ptr)->slist_size += (new_size);                               \
+                                                                         \
+    (cache_ptr)->slist_size_increase -= (int64_t)(old_size);             \
+    (cache_ptr)->slist_size_increase += (int64_t)(new_size);             \
+                                                                         \
+    HDassert( (new_size) <= (cache_ptr)->slist_size );                   \
+    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                          \
+              ( (cache_ptr)->slist_size == (new_size) ) );               \
+} /* H5C__REMOVE_ENTRY_FROM_SLIST */
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
+{                                                                        \
+    HDassert( (cache_ptr) );                                             \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                  \
+    HDassert( (old_size) > 0 );                                          \
+    HDassert( (new_size) > 0 );                                          \
+    HDassert( (old_size) <= (cache_ptr)->slist_size );                   \
+    HDassert( (cache_ptr)->slist_len > 0 );                              \
+    HDassert( ((cache_ptr)->slist_len > 1) ||                            \
+              ( (cache_ptr)->slist_size == (old_size) ) );               \
+                                                                         \
+    (cache_ptr)->slist_size -= (old_size);                               \
+    (cache_ptr)->slist_size += (new_size);                               \
+                                                                         \
+    HDassert( (new_size) <= (cache_ptr)->slist_size );                   \
+    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                          \
+              ( (cache_ptr)->slist_size == (new_size) ) );               \
+} /* H5C__REMOVE_ENTRY_FROM_SLIST */
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+

+/**************************************************************************
+ *
+ * Replacement policy update macros:
+ *
+ * These used to be functions, but I converted them to macros to avoid some
+ * function call overhead.
+ *
+ **************************************************************************/
+
+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS
+ *
+ * Purpose:     For efficiency, we sometimes change the order of flushes --
+ *		but doing so can confuse the replacement policy.  This
+ *		macro exists to allow us to specify an entry as the
+ *		most recently touched so we can repair any such
+ *		confusion.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the macro
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 10/13/05
+ *
+ * Modifications:
+ *
+ *		JRM -- 3/20/06
+ *		Modified macro to ignore pinned entries.  Pinned entries
+ *		do not appear in the data structures maintained by the
+ *		replacement policy code, and thus this macro has nothing
+ *		to do if called for such an entry.
+ *
+ *		JRM -- 3/28/07
+ *		Added sanity checks using the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the head.\
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* Use the dirty flag to infer whether the entry is on the clean or \
+         * dirty LRU list, and remove it.  Then insert it at the head of    \
+         * the same LRU list.                                               \
+         *                                                                  \
+         * At least initially, all entries should be clean.  That may       \
+         * change, so we may as well deal with both cases now.              \
+         */                                                                 \
+                                                                            \
+        if ( (entry_ptr)->is_dirty ) {                                      \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
+                                (cache_ptr)->dLRU_tail_ptr,                 \
+                                (cache_ptr)->dLRU_list_len,                 \
+                                (cache_ptr)->dLRU_list_size, (fail_val))    \
+                                                                            \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,   \
+                                 (cache_ptr)->dLRU_tail_ptr,                \
+                                 (cache_ptr)->dLRU_list_len,                \
+                                 (cache_ptr)->dLRU_list_size, (fail_val))   \
+        } else {                                                            \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
+                                (cache_ptr)->cLRU_tail_ptr,                 \
+                                (cache_ptr)->cLRU_list_len,                 \
+                                (cache_ptr)->cLRU_list_size, (fail_val))    \
+                                                                            \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,   \
+                                 (cache_ptr)->cLRU_tail_ptr,                \
+                                 (cache_ptr)->cLRU_list_len,                \
+                                 (cache_ptr)->cLRU_list_size, (fail_val))   \
+        }                                                                   \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the head \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_EVICTION
+ *
+ * Purpose:     Update the replacement policy data structures for an
+ *		eviction of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 5/10/04
+ *
+ * Modifications:
+ *
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_eviction() to the
+ *		macro H5C__UPDATE_RP_FOR_EVICTION in an effort to squeeze
+ *		a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		the pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/20/06
+ *		Pinned entries can't be evicted, so this entry should never
+ *		be called on a pinned entry.  Added assert to verify this.
+ *
+ *		JRM -- 3/28/07
+ *		Added sanity checks for the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( !((entry_ptr)->is_pinned) );                                   \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    /* modified LRU specific code */                                         \
+                                                                             \
+    /* remove the entry from the LRU list. */                                \
+                                                                             \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
+                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
+                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+                                                                             \
+    /* If the entry is clean when it is evicted, it should be on the         \
+     * clean LRU list, if it was dirty, it should be on the dirty LRU list.  \
+     * Remove it from the appropriate list according to the value of the     \
+     * dirty flag.                                                           \
+     */                                                                      \
+                                                                             \
+    if ( (entry_ptr)->is_dirty ) {                                           \
+                                                                             \
+        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,         \
+                            (cache_ptr)->dLRU_tail_ptr,                      \
+                            (cache_ptr)->dLRU_list_len,                      \
+                            (cache_ptr)->dLRU_list_size, (fail_val))         \
+    } else {                                                                 \
+        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,         \
+                            (cache_ptr)->cLRU_tail_ptr,                      \
+                            (cache_ptr)->cLRU_list_len,                      \
+                            (cache_ptr)->cLRU_list_size, (fail_val))         \
+    }                                                                        \
+                                                                             \
+} /* H5C__UPDATE_RP_FOR_EVICTION */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( !((entry_ptr)->is_pinned) );                                   \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    /* modified LRU specific code */                                         \
+                                                                             \
+    /* remove the entry from the LRU list. */                                \
+                                                                             \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
+                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
+                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+                                                                             \
+} /* H5C__UPDATE_RP_FOR_EVICTION */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_FLUSH
+ *
+ * Purpose:     Update the replacement policy data structures for a flush
+ *		of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/6/04
+ *
+ * Modifications:
+ *
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_flush() to the
+ *		macro H5C__UPDATE_RP_FOR_FLUSH in an effort to squeeze
+ *		a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two versions, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/20/06
+ *		While pinned entries can be flushed, they don't reside in
+ *		the replacement policy data structures when unprotected.
+ *		Thus I modified this macro to do nothing if the entry is
+ *		pinned.
+ *
+ *		JRM - 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the      \
+	 * head.                                                            \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* since the entry is being flushed or cleared, one would think     \
+	 * that it must be dirty -- but that need not be the case.  Use the \
+	 * dirty flag to infer whether the entry is on the clean or dirty   \
+	 * LRU list, and remove it.  Then insert it at the head of the      \
+	 * clean LRU list.                                                  \
+         *                                                                  \
+         * The function presumes that a dirty entry will be either cleared  \
+	 * or flushed shortly, so it is OK if we put a dirty entry on the   \
+	 * clean LRU list.                                                  \
+         */                                                                 \
+                                                                            \
+        if ( (entry_ptr)->is_dirty ) {                                      \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
+                                (cache_ptr)->dLRU_tail_ptr,                 \
+                                (cache_ptr)->dLRU_list_len,                 \
+                                (cache_ptr)->dLRU_list_size, (fail_val))    \
+        } else {                                                            \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
+                                (cache_ptr)->cLRU_tail_ptr,                 \
+                                (cache_ptr)->cLRU_list_len,                 \
+                                (cache_ptr)->cLRU_list_size, (fail_val))    \
+        }                                                                   \
+                                                                            \
+        H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,       \
+                             (cache_ptr)->cLRU_tail_ptr,                    \
+                             (cache_ptr)->cLRU_list_len,                    \
+                             (cache_ptr)->cLRU_list_size, (fail_val))       \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__UPDATE_RP_FOR_FLUSH */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the      \
+	 * head.                                                            \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__UPDATE_RP_FOR_FLUSH */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_INSERTION
+ *
+ * Purpose:     Update the replacement policy data structures for an
+ *		insertion of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/17/04
+ *
+ * Modifications:
+ *
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_insertion() to the
+ *		macro H5C__UPDATE_RP_FOR_INSERTION in an effort to squeeze
+ *		a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/10/06
+ *		This macro should never be called on a pinned entry.
+ *		Inserted an assert to verify this.
+ *
+ *		JRM - 8/9/06
+ *		Not any more.  We must now allow insertion of pinned
+ *		entries.  Updated macro to support this.
+ *
+ *		JRM - 3/28/07
+ *		Added sanity checks using the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( !((entry_ptr)->is_protected) );                              \
+    HDassert( !((entry_ptr)->is_read_only) );                              \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+                                                                           \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* insert the entry at the head of the clean or dirty LRU list as  \
+         * appropriate.                                                    \
+         */                                                                \
+                                                                           \
+        if ( entry_ptr->is_dirty ) {                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
+                                 (cache_ptr)->dLRU_tail_ptr,               \
+                                 (cache_ptr)->dLRU_list_len,               \
+                                 (cache_ptr)->dLRU_list_size, (fail_val))  \
+        } else {                                                           \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
+                                 (cache_ptr)->cLRU_tail_ptr,               \
+                                 (cache_ptr)->cLRU_list_len,               \
+                                 (cache_ptr)->cLRU_list_size, (fail_val))  \
+        }                                                                  \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+}
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( !((entry_ptr)->is_protected) );                              \
+    HDassert( !((entry_ptr)->is_read_only) );                              \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+	                                                                   \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+}
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_PROTECT
+ *
+ * Purpose:     Update the replacement policy data structures for a
+ *		protect of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from any data
+ *		structures used by the replacement policy, and add the
+ *		entry to the protected list.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/17/04
+ *
+ * Modifications:
+ *
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_protect() to the
+ *		macro H5C__UPDATE_RP_FOR_PROTECT in an effort to squeeze
+ *		a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/17/06
+ *		Modified macro to attempt to remove pinned entriese from
+ *		the pinned entry list instead of from the data structures
+ *		maintained by the replacement policy.
+ *
+ *		JRM - 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+									  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                        (cache_ptr)->pel_tail_ptr, 			  \
+			(cache_ptr)->pel_len,                             \
+                        (cache_ptr)->pel_size, (fail_val))                \
+        HDassert( (cache_ptr)->pel_len >= 0 );                            \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+        /* remove the entry from the LRU list. */                         \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                        (cache_ptr)->LRU_tail_ptr,                        \
+			(cache_ptr)->LRU_list_len,                        \
+                        (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                          \
+        /* Similarly, remove the entry from the clean or dirty LRU list   \
+         * as appropriate.                                                \
+         */                                                               \
+                                                                          \
+        if ( (entry_ptr)->is_dirty ) {                                    \
+                                                                          \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
+                                (cache_ptr)->dLRU_tail_ptr,               \
+                                (cache_ptr)->dLRU_list_len,               \
+                                (cache_ptr)->dLRU_list_size, (fail_val))  \
+                                                                          \
+        } else {                                                          \
+                                                                          \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
+                                (cache_ptr)->cLRU_tail_ptr,               \
+                                (cache_ptr)->cLRU_list_len,               \
+                                (cache_ptr)->cLRU_list_size, (fail_val))  \
+        }                                                                 \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+    /* Regardless of the replacement policy, or whether the entry is      \
+     * pinned, now add the entry to the protected list.                   \
+     */                                                                   \
+                                                                          \
+    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
+                    (cache_ptr)->pl_tail_ptr,                             \
+                    (cache_ptr)->pl_len,                                  \
+                    (cache_ptr)->pl_size, (fail_val))                     \
+} /* H5C__UPDATE_RP_FOR_PROTECT */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+									  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                        (cache_ptr)->pel_tail_ptr, 			  \
+			(cache_ptr)->pel_len,                             \
+                        (cache_ptr)->pel_size, (fail_val))                \
+        HDassert( (cache_ptr)->pel_len >= 0 );                            \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+        /* remove the entry from the LRU list. */                         \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                        (cache_ptr)->LRU_tail_ptr,                        \
+			(cache_ptr)->LRU_list_len,                        \
+                        (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+    /* Regardless of the replacement policy, or whether the entry is      \
+     * pinned, now add the entry to the protected list.                   \
+     */                                                                   \
+                                                                          \
+    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
+                    (cache_ptr)->pl_tail_ptr,                             \
+                    (cache_ptr)->pl_len,                                  \
+                    (cache_ptr)->pl_size, (fail_val))                     \
+} /* H5C__UPDATE_RP_FOR_PROTECT */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_MOVE
+ *
+ * Purpose:     Update the replacement policy data structures for a
+ *		move of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/17/04
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+	                                                                     \
+        /* modified LRU specific code */                                     \
+                                                                             \
+        /* remove the entry from the LRU list, and re-insert it at the head. \
+	 */                                                                  \
+                                                                             \
+            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
+                             (cache_ptr)->LRU_tail_ptr,                      \
+			     (cache_ptr)->LRU_list_len,                      \
+                             (cache_ptr)->LRU_list_size, (fail_val))         \
+                                                                             \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                         (cache_ptr)->LRU_tail_ptr,                          \
+			 (cache_ptr)->LRU_list_len,                          \
+                         (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                             \
+            /* remove the entry from either the clean or dirty LUR list as   \
+             * indicated by the was_dirty parameter                          \
+             */                                                              \
+            if ( was_dirty ) {                                               \
+                                                                             \
+                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
+				     (cache_ptr)->dLRU_head_ptr,             \
+                                     (cache_ptr)->dLRU_tail_ptr,             \
+                                     (cache_ptr)->dLRU_list_len,             \
+                                     (cache_ptr)->dLRU_list_size,            \
+				     (fail_val))                             \
+                                                                             \
+            } else {                                                         \
+                                                                             \
+                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
+				     (cache_ptr)->cLRU_head_ptr,             \
+                                     (cache_ptr)->cLRU_tail_ptr,             \
+                                     (cache_ptr)->cLRU_list_len,             \
+                                     (cache_ptr)->cLRU_list_size,            \
+				     (fail_val))                             \
+            }                                                                \
+                                                                             \
+            /* insert the entry at the head of either the clean or dirty     \
+	     * LRU list as appropriate.                                      \
+             */                                                              \
+                                                                             \
+            if ( (entry_ptr)->is_dirty ) {                                   \
+                                                                             \
+                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
+				      (cache_ptr)->dLRU_head_ptr,            \
+                                      (cache_ptr)->dLRU_tail_ptr,            \
+                                      (cache_ptr)->dLRU_list_len,            \
+                                      (cache_ptr)->dLRU_list_size,           \
+				      (fail_val))                            \
+                                                                             \
+            } else {                                                         \
+                                                                             \
+                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
+				      (cache_ptr)->cLRU_head_ptr,            \
+                                      (cache_ptr)->cLRU_tail_ptr,            \
+                                      (cache_ptr)->cLRU_list_len,            \
+                                      (cache_ptr)->cLRU_list_size,           \
+				      (fail_val))                            \
+            }                                                                \
+                                                                             \
+            /* End modified LRU specific code. */                            \
+        }                                                                    \
+} /* H5C__UPDATE_RP_FOR_MOVE */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+	                                                                     \
+        /* modified LRU specific code */                                     \
+                                                                             \
+        /* remove the entry from the LRU list, and re-insert it at the head. \
+	 */                                                                  \
+                                                                             \
+            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
+                             (cache_ptr)->LRU_tail_ptr,                      \
+			     (cache_ptr)->LRU_list_len,                      \
+                             (cache_ptr)->LRU_list_size, (fail_val))         \
+                                                                             \
+            H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,         \
+                              (cache_ptr)->LRU_tail_ptr,                     \
+			      (cache_ptr)->LRU_list_len,                     \
+                              (cache_ptr)->LRU_list_size, (fail_val))        \
+                                                                             \
+            /* End modified LRU specific code. */                            \
+        }                                                                    \
+} /* H5C__UPDATE_RP_FOR_MOVE */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_SIZE_CHANGE
+ *
+ * Purpose:     Update the replacement policy data structures for a
+ *		size change of the specified cache entry.
+ *
+ *		To do this, determine if the entry is pinned.  If it is,
+ *		update the size of the pinned entry list.
+ *
+ *		If it isn't pinned, the entry must handled by the
+ *		replacement policy.  Update the appropriate replacement
+ *		policy data structures.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 8/23/06
+ *
+ * Modifications:
+ *
+ * 		JRM -- 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+    HDassert( new_size > 0 );                                             \
+				  					  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
+			                (cache_ptr)->pel_size,            \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+	                                                                  \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+	/* Update the size of the LRU list */                             \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
+			                (cache_ptr)->LRU_list_size,       \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+        /* Similarly, update the size of the clean or dirty LRU list as   \
+	 * appropriate.  At present, the entry must be clean, but that    \
+	 * could change.                                                  \
+         */                                                               \
+                                                                          \
+        if ( (entry_ptr)->is_dirty ) {                                    \
+                                                                          \
+	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len,   \
+			                    (cache_ptr)->dLRU_list_size,  \
+			                    (entry_ptr)->size,            \
+					    (new_size));                  \
+                                                                          \
+        } else {                                                          \
+                                                                          \
+	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len,   \
+			                    (cache_ptr)->cLRU_list_size,  \
+			                    (entry_ptr)->size,            \
+					    (new_size));                  \
+        }                                                                 \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+    HDassert( new_size > 0 );                                             \
+				  					  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
+			                (cache_ptr)->pel_size,            \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+	/* Update the size of the LRU list */                             \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
+			                (cache_ptr)->LRU_list_size,       \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_UNPIN
+ *
+ * Purpose:     Update the replacement policy data structures for an
+ *		unpin of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from the protected
+ *		entry list, and re-insert it in the data structures used
+ *		by the current replacement policy.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the macro
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 3/22/06
+ *
+ * Modifications:
+ *
+ *		JRM -- 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
+{                                                                      \
+    HDassert( (cache_ptr) );                                           \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
+    HDassert( (entry_ptr) );                                           \
+    HDassert( !((entry_ptr)->is_protected) );                          \
+    HDassert( !((entry_ptr)->is_read_only) );                          \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
+    HDassert( (entry_ptr)->is_pinned);                                 \
+    HDassert( (entry_ptr)->size > 0 );                                 \
+                                                                       \
+    /* Regardless of the replacement policy, remove the entry from the \
+     * pinned entry list.                                              \
+     */                                                                \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
+                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
+                    (cache_ptr)->pel_size, (fail_val))                 \
+    HDassert( (cache_ptr)->pel_len >= 0 );                             \
+                                                                       \
+        /* modified LRU specific code */                               \
+                                                                       \
+        /* insert the entry at the head of the LRU list. */            \
+                                                                       \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
+                         (cache_ptr)->LRU_tail_ptr,                    \
+                         (cache_ptr)->LRU_list_len,                    \
+                         (cache_ptr)->LRU_list_size, (fail_val))       \
+                                                                       \
+        /* Similarly, insert the entry at the head of either the clean \
+         * or dirty LRU list as appropriate.                           \
+         */                                                            \
+                                                                       \
+        if ( (entry_ptr)->is_dirty ) {                                 \
+                                                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
+			          (cache_ptr)->dLRU_head_ptr,          \
+                                  (cache_ptr)->dLRU_tail_ptr,          \
+                                  (cache_ptr)->dLRU_list_len,          \
+                                  (cache_ptr)->dLRU_list_size,         \
+			          (fail_val))                          \
+                                                                       \
+        } else {                                                       \
+                                                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
+			          (cache_ptr)->cLRU_head_ptr,          \
+                                  (cache_ptr)->cLRU_tail_ptr,          \
+                                  (cache_ptr)->cLRU_list_len,          \
+                                  (cache_ptr)->cLRU_list_size,         \
+			          (fail_val))                          \
+         }                                                             \
+                                                                       \
+        /* End modified LRU specific code. */                          \
+                                                                       \
+} /* H5C__UPDATE_RP_FOR_UNPIN */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
+{                                                                      \
+    HDassert( (cache_ptr) );                                           \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
+    HDassert( (entry_ptr) );                                           \
+    HDassert( !((entry_ptr)->is_protected) );                          \
+    HDassert( !((entry_ptr)->is_read_only) );                          \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
+    HDassert( (entry_ptr)->is_pinned);                                 \
+    HDassert( (entry_ptr)->size > 0 );                                 \
+                                                                       \
+    /* Regardless of the replacement policy, remove the entry from the \
+     * pinned entry list.                                              \
+     */                                                                \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
+                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
+                    (cache_ptr)->pel_size, (fail_val))                 \
+    HDassert( (cache_ptr)->pel_len >= 0 );                             \
+                                                                       \
+        /* modified LRU specific code */                               \
+                                                                       \
+        /* insert the entry at the head of the LRU list. */            \
+                                                                       \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
+                         (cache_ptr)->LRU_tail_ptr,                    \
+                         (cache_ptr)->LRU_list_len,                    \
+                         (cache_ptr)->LRU_list_size, (fail_val))       \
+                                                                       \
+        /* End modified LRU specific code. */                          \
+                                                                       \
+} /* H5C__UPDATE_RP_FOR_UNPIN */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_UNPROTECT
+ *
+ * Purpose:     Update the replacement policy data structures for an
+ *		unprotect of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from the protected
+ *		list, and re-insert it in the data structures used by the
+ *		current replacement policy.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/19/04
+ *
+ * Modifications:
+ *
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_unprotect() to
+ *		the macro H5C__UPDATE_RP_FOR_UNPROTECT in an effort to
+ *		squeeze a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/17/06
+ *		Modified macro to put pinned entries on the pinned entry
+ *		list instead of inserting them in the data structures
+ *		maintained by the replacement policy.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( (entry_ptr)->is_protected);                                  \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    /* Regardless of the replacement policy, remove the entry from the     \
+     * protected list.                                                     \
+     */                                                                    \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
+                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
+                    (cache_ptr)->pl_size, (fail_val))                      \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+                                                                           \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+                         (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* Similarly, insert the entry at the head of either the clean or  \
+         * dirty LRU list as appropriate.                                  \
+         */                                                                \
+                                                                           \
+        if ( (entry_ptr)->is_dirty ) {                                     \
+                                                                           \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
+                                 (cache_ptr)->dLRU_tail_ptr,               \
+                                 (cache_ptr)->dLRU_list_len,               \
+                                 (cache_ptr)->dLRU_list_size, (fail_val))  \
+                                                                           \
+        } else {                                                           \
+                                                                           \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
+                                 (cache_ptr)->cLRU_tail_ptr,               \
+                                 (cache_ptr)->cLRU_list_len,               \
+                                 (cache_ptr)->cLRU_list_size, (fail_val))  \
+        }                                                                  \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+                                                                           \
+} /* H5C__UPDATE_RP_FOR_UNPROTECT */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( (entry_ptr)->is_protected);                                  \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    /* Regardless of the replacement policy, remove the entry from the     \
+     * protected list.                                                     \
+     */                                                                    \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
+                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
+                    (cache_ptr)->pl_size, (fail_val))                      \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+                                                                           \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+                         (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+} /* H5C__UPDATE_RP_FOR_UNPROTECT */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+
+#endif /* _H5Cpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Cprivate.h b/gatb-core/thirdparty/hdf5/src/H5Cprivate.h
new file mode 100644
index 0000000..44e3d4d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Cprivate.h
@@ -0,0 +1,1141 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Cprivate.h
+ *			6/3/04
+ *			John Mainzer
+ *
+ * Purpose:		Constants and typedefs available to the rest of the
+ *			library.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5Cprivate_H
+#define _H5Cprivate_H
+
+#include "H5Cpublic.h"		/* public prototypes		        */
+
+/* Pivate headers needed by this header */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Fprivate.h"		/* File access				*/
+
+
+#define H5C_DO_SANITY_CHECKS		0
+#define H5C_DO_EXTREME_SANITY_CHECKS	0
+
+/* This sanity checking constant was picked out of the air.  Increase
+ * or decrease it if appropriate.  Its purposes is to detect corrupt
+ * object sizes, so it probably doesn't matter if it is a bit big.
+ *
+ *					JRM - 5/17/04
+ */
+#define H5C_MAX_ENTRY_SIZE		((size_t)(32 * 1024 * 1024))
+
+/* H5C_COLLECT_CACHE_STATS controls overall collection of statistics
+ * on cache activity.  In general, this #define should be set to 0.
+ */
+#define H5C_COLLECT_CACHE_STATS	0
+
+/* H5C_COLLECT_CACHE_ENTRY_STATS controls collection of statistics
+ * in individual cache entries.
+ *
+ * H5C_COLLECT_CACHE_ENTRY_STATS should only be defined to true if
+ * H5C_COLLECT_CACHE_STATS is also defined to true.
+ */
+#if H5C_COLLECT_CACHE_STATS
+
+#define H5C_COLLECT_CACHE_ENTRY_STATS	1
+
+#else
+
+#define H5C_COLLECT_CACHE_ENTRY_STATS	0
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+#ifdef H5_HAVE_PARALLEL
+
+/* we must maintain the clean and dirty LRU lists when we are compiled
+ * with parallel support.
+ */
+#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  1
+
+#else /* H5_HAVE_PARALLEL */
+
+/* The clean and dirty LRU lists don't buy us anything here -- we may
+ * want them on for testing on occasion, but in general they should be
+ * off.
+ */
+#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  0
+
+#endif /* H5_HAVE_PARALLEL */
+
+
+/* Typedef for the main structure for the cache (defined in H5Cpkg.h) */
+
+typedef struct H5C_t H5C_t;
+
+
+/*
+ * Class methods pertaining to caching.	 Each type of cached object will
+ * have a constant variable with permanent life-span that describes how
+ * to cache the object.	 That variable will be of type H5C_class_t and
+ * have the following required fields...
+ *
+ * LOAD:	Loads an object from disk to memory.  The function
+ *		should allocate some data structure and return it.
+ *
+ * FLUSH:	Writes some data structure back to disk.  It would be
+ *		wise for the data structure to include dirty flags to
+ *		indicate whether it really needs to be written.	 This
+ *		function is also responsible for freeing memory allocated
+ *		by the LOAD method if the DEST argument is non-zero (by
+ *              calling the DEST method).
+ *
+ * DEST:	Just frees memory allocated by the LOAD method.
+ *
+ * CLEAR:	Just marks object as non-dirty.
+ *
+ * SIZE:	Report the size (on disk) of the specified cache object.
+ *		Note that the space allocated on disk may not be contiguous.
+ */
+
+#define H5C_CALLBACK__NO_FLAGS_SET		0x0
+#define H5C_CALLBACK__SIZE_CHANGED_FLAG		0x1
+#define H5C_CALLBACK__MOVED_FLAG		0x2
+
+/* Actions that can be reported to 'notify' client callback */
+typedef enum H5C_notify_action_t {
+    H5C_NOTIFY_ACTION_AFTER_INSERT,     /* Entry has been added to the cache */
+                                        /* (could be loaded from file with
+                                         *      'protect' call, or inserted
+                                         *      with 'set' call)
+                                         */
+    H5C_NOTIFY_ACTION_BEFORE_EVICT      /* Entry is about to be evicted from cache */
+} H5C_notify_action_t;
+
+typedef void *(*H5C_load_func_t)(H5F_t *f,
+                                 hid_t dxpl_id,
+                                 haddr_t addr,
+                                 void *udata);
+typedef herr_t (*H5C_flush_func_t)(H5F_t *f,
+                                   hid_t dxpl_id,
+                                   hbool_t dest,
+                                   haddr_t addr,
+                                   void *thing,
+				   unsigned * flags_ptr);
+typedef herr_t (*H5C_dest_func_t)(H5F_t *f,
+                                  void *thing);
+typedef herr_t (*H5C_clear_func_t)(H5F_t *f,
+                                   void *thing,
+                                   hbool_t dest);
+typedef herr_t (*H5C_notify_func_t)(H5C_notify_action_t action,
+                                 void *thing);
+typedef herr_t (*H5C_size_func_t)(const H5F_t *f,
+                                  const void *thing,
+                                  size_t *size_ptr);
+
+typedef struct H5C_class_t {
+    int			id;
+    H5C_load_func_t	load;
+    H5C_flush_func_t	flush;
+    H5C_dest_func_t	dest;
+    H5C_clear_func_t	clear;
+    H5C_size_func_t	size;
+} H5C_class_t;
+
+
+/* Type defintions of call back functions used by the cache as a whole */
+
+typedef herr_t (*H5C_write_permitted_func_t)(const H5F_t *f,
+                                             hid_t dxpl_id,
+                                             hbool_t * write_permitted_ptr);
+
+typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
+                                       haddr_t addr,
+                                       hbool_t was_dirty,
+                                       unsigned flags,
+                                       int type_id);
+
+/* Upper and lower limits on cache size.  These limits are picked
+ * out of a hat -- you should be able to change them as necessary.
+ *
+ * However, if you need a very big cache, you should also increase the
+ * size of the hash table (H5C__HASH_TABLE_LEN in H5Cpkg.h).  The current
+ * upper bound on cache size is rather large for the current hash table
+ * size.
+ */
+
+#define H5C__MAX_MAX_CACHE_SIZE		((size_t)(128 * 1024 * 1024))
+#define H5C__MIN_MAX_CACHE_SIZE		((size_t)(1024))
+
+
+/* Default max cache size and min clean size are give here to make
+ * them generally accessable.
+ */
+
+#define H5C__DEFAULT_MAX_CACHE_SIZE     ((size_t)(4 * 1024 * 1024))
+#define H5C__DEFAULT_MIN_CLEAN_SIZE     ((size_t)(2 * 1024 * 1024))
+
+
+/****************************************************************************
+ *
+ * structure H5C_cache_entry_t
+ *
+ * Instances of the H5C_cache_entry_t structure are used to store cache
+ * entries in a hash table and sometimes in a skip list.
+ * See H5SL.c for the particulars of the skip list.
+ *
+ * In typical application, this structure is the first field in a
+ * structure to be cached.  For historical reasons, the external module
+ * is responsible for managing the is_dirty field (this is no longer
+ * completely true.  See the comment on the is_dirty field for details).
+ * All other fields are managed by the cache.
+ *
+ * The fields of this structure are discussed individually below:
+ *
+ *						JRM - 4/26/04
+ *
+ * magic:	Unsigned 32 bit integer that must always be set to
+ *              H5C__H5C_CACHE_ENTRY_T_MAGIC when the entry is valid.
+ *              The field must be set to H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC
+ *              just before the entry is freed.
+ *
+ *              This is necessary, as the LRU list can be changed out
+ *              from under H5C_make_space_in_cache() by the flush
+ *              callback which may change the size of an existing entry,
+ *              and/or load a new entry while serializing the target entry.
+ *
+ *              This in turn can cause a recursive call to
+ *              H5C_make_space_in_cache() which may either flush or evict
+ *              the next entry that the first invocation of that function
+ *              was about to examine.
+ *
+ *              The magic field allows H5C_make_space_in_cache() to
+ *              detect this case, and re-start its scan from the bottom
+ *              of the LRU when this situation occurs.
+ *
+ *              This field is only compiled in debug mode.
+ *
+ * addr:	Base address of the cache entry on disk.
+ *
+ * size:	Length of the cache entry on disk.  Note that unlike normal
+ *		caches, the entries in this cache are of variable length.
+ *		The entries should never overlap, and when we do writebacks,
+ *		we will want to writeback adjacent entries where possible.
+ *
+ *		NB: At present, entries need not be contiguous on disk.  Until
+ *		    we fix this, we can't do much with writing back adjacent
+ *		    entries.
+ *
+ * type:	Pointer to the instance of H5C_class_t containing pointers
+ *		to the methods for cache entries of the current type.  This
+ *		field should be NULL when the instance of H5C_cache_entry_t
+ *		is not in use.
+ *
+ *		The name is not particularly descriptive, but is retained
+ *		to avoid changes in existing code.
+ *
+ * is_dirty:	Boolean flag indicating whether the contents of the cache
+ *		entry has been modified since the last time it was written
+ *		to disk.
+ *
+ *		NOTE: For historical reasons, this field is not maintained
+ *		      by the cache.  Instead, the module using the cache
+ *		      sets this flag when it modifies the entry, and the
+ *		      flush and clear functions supplied by that module
+ *		      reset the dirty when appropriate.
+ *
+ *		      This is a bit quirky, so we may want to change this
+ *		      someday.  However it will require a change in the
+ *		      cache interface.
+ *
+ *		Update: Management of the is_dirty field has been largely
+ *		      moved into the cache.  The only remaining exceptions
+ *		      are the flush and clear functions supplied by the
+ *		      modules using the cache.  These still clear the
+ *		      is_dirty field as before.  -- JRM 7/5/05
+ *
+ * dirtied:	Boolean flag used to indicate that the entry has been
+ * 		dirtied while protected.
+ *
+ * 		This field is set to FALSE in the protect call, and may
+ * 		be set to TRUE by the
+ * 		H5C_mark_entry_dirty()
+ * 		call at an time prior to the unprotect call.
+ *
+ * 		The H5C_mark_entry_dirty() call exists
+ * 		as a convenience function for the fractal heap code which
+ * 		may not know if an entry is protected or pinned, but knows
+ * 		that is either protected or pinned.  The dirtied field was
+ * 		added as in the parallel case, it is necessary to know
+ * 		whether a protected entry was dirty prior to the protect call.
+ *
+ * is_protected: Boolean flag indicating whether this entry is protected
+ *		(or locked, to use more conventional terms).  When it is
+ *		protected, the entry cannot be flushed or accessed until
+ *		it is unprotected (or unlocked -- again to use more
+ *		conventional terms).
+ *
+ *		Note that protected entries are removed from the LRU lists
+ *		and inserted on the protected list.
+ *
+ * is_read_only: Boolean flag that is only meaningful if is_protected is
+ * 		TRUE.  In this circumstance, it indicates whether the
+ * 		entry has been protected read only, or read/write.
+ *
+ * 		If the entry has been protected read only (i.e. is_protected
+ * 		and is_read_only are both TRUE), we allow the entry to be
+ * 		protected more than once.
+ *
+ *		In this case, the number of readers is maintained in the
+ *		ro_ref_count field (see below), and unprotect calls simply
+ *		decrement that field until it drops to zero, at which point
+ *		the entry is actually unprotected.
+ *
+ * ro_ref_count: Integer field used to maintain a count of the number of
+ * 		outstanding read only protects on this entry.  This field
+ * 		must be zero whenever either is_protected or is_read_only
+ * 		are TRUE.
+ *
+ * is_pinned:	Boolean flag indicating whether the entry has been pinned
+ * 		in the cache.
+ *
+ * 		For very hot entries, the protect / unprotect overhead
+ * 		can become excessive.  Thus the cache has been extended
+ * 		to allow an entry to be "pinned" in the cache.
+ *
+ * 		Pinning an entry in the cache has several implications:
+ *
+ * 		1) A pinned entry cannot be evicted.  Thus unprotected
+ * 		   pinned entries must be stored in the pinned entry
+ * 		   list, instead of being managed by the replacement
+ * 		   policy code (LRU at present).
+ *
+ * 		2) A pinned entry can be accessed or modified at any time.
+ * 		   Therefore, the cache must check with the entry owner
+ * 		   before flushing it.  If permission is denied, the
+ * 		   cache does not flush the entry.
+ *
+ * 		3) A pinned entry can be marked as dirty (and possibly
+ *		   change size) while it is unprotected.
+ *
+ *		4) The flush-destroy code must allow pinned entries to
+ *		   be unpinned (and possibly unprotected) during the
+ *		   flush.
+ *
+ *		   					JRM -- 3/16/06
+ *
+ * in_slist:	Boolean flag indicating whether the entry is in the skip list
+ *		As a general rule, entries are placed in the list when they
+ *              are marked dirty.  However they may remain in the list after
+ *              being flushed.
+ *
+ *              Update: Dirty entries are now removed from the skip list
+ *			when they are flushed.
+ *
+ * flush_marker:  Boolean flag indicating that the entry is to be flushed
+ *		the next time H5C_flush_cache() is called with the
+ *		H5C__FLUSH_MARKED_ENTRIES_FLAG.  The flag is reset when
+ *		the entry is flushed for whatever reason.
+ *
+ * clear_on_unprotect:  Boolean flag used only in PHDF5.  When H5C is used
+ *		to implement the metadata cache In the parallel case, only
+ *		the cache with mpi rank 0 is allowed to actually write to
+ *		file -- all other caches must retain dirty entries until they
+ *		are advised that the entry is clean.
+ *
+ *		This flag is used in the case that such an advisory is
+ *		received when the entry is protected.  If it is set when an
+ *		entry is unprotected, and the dirtied flag is not set in
+ *		the unprotect, the entry's is_dirty flag is reset by flushing
+ *		it with the H5C__FLUSH_CLEAR_ONLY_FLAG.
+ *
+ * flush_immediately:  Boolean flag used only in Phdf5 -- and then only 
+ *		for H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED.
+ *
+ *		When a destributed metadata write is triggered at a 
+ *		sync point, this field is used to mark entries that 
+ *		must be flushed before leaving the sync point.  At all
+ *		other times, this field should be set to FALSE.
+ *
+ * flush_in_progress:  Boolean flag that is set to true iff the entry
+ * 		is in the process of being flushed.  This allows the cache
+ * 		to detect when a call is the result of a flush callback.
+ *
+ * destroy_in_progress:  Boolean flag that is set to true iff the entry
+ * 		is in the process of being flushed and destroyed.
+ *
+ * free_file_space_on_destroy:  Boolean flag that is set to true iff the entry
+ * 		is in the process of being flushed and destroyed and the file
+ *              space used by the object should be freed by the cache client's
+ *              'dest' callback routine.
+ *
+ *
+ * Fields supporting the hash table:
+ *
+ * Fields in the cache are indexed by a more or less conventional hash table.
+ * If there are multiple entries in any hash bin, they are stored in a doubly
+ * linked list.
+ *
+ * ht_next:	Next pointer used by the hash table to store multiple
+ *		entries in a single hash bin.  This field points to the
+ *		next entry in the doubly linked list of entries in the
+ *		hash bin, or NULL if there is no next entry.
+ *
+ * ht_prev:     Prev pointer used by the hash table to store multiple
+ *              entries in a single hash bin.  This field points to the
+ *              previous entry in the doubly linked list of entries in
+ *		the hash bin, or NULL if there is no previuos entry.
+ *
+ *
+ * Fields supporting replacement policies:
+ *
+ * The cache must have a replacement policy, and it will usually be
+ * necessary for this structure to contain fields supporting that policy.
+ *
+ * While there has been interest in several replacement policies for
+ * this cache, the initial development schedule is tight.  Thus I have
+ * elected to support only a modified LRU policy for the first cut.
+ *
+ * When additional replacement policies are added, the fields in this
+ * section will be used in different ways or not at all.  Thus the
+ * documentation of these fields is repeated for each replacement policy.
+ *
+ * Modified LRU:
+ *
+ * When operating in parallel mode, we must ensure that a read does not
+ * cause a write.  If it does, the process will hang, as the write will
+ * be collective and the other processes will not know to participate.
+ *
+ * To deal with this issue, I have modified the usual LRU policy by adding
+ * clean and dirty LRU lists to the usual LRU list.  When reading in
+ * parallel mode, we evict from the clean LRU list only.  This implies
+ * that we must try to ensure that the clean LRU list is reasonably well
+ * stocked.  See the comments on H5C_t in H5Cpkg.h for more details.
+ *
+ * Note that even if we start with a completely clean cache, a sequence
+ * of protects without unprotects can empty the clean LRU list.  In this
+ * case, the cache must grow temporarily.  At the next write, we will
+ * attempt to evict enough entries to get the cache down to its nominal
+ * maximum size.
+ *
+ * The use of the replacement policy fields under the Modified LRU policy
+ * is discussed below:
+ *
+ * next:	Next pointer in either the LRU or the protected list,
+ *		depending on the current value of protected.  If there
+ *		is no next entry on the list, this field should be set
+ *		to NULL.
+ *
+ * prev:	Prev pointer in either the LRU or the protected list,
+ *		depending on the current value of protected.  If there
+ *		is no previous entry on the list, this field should be
+ *		set to NULL.
+ *
+ * aux_next:	Next pointer on either the clean or dirty LRU lists.
+ *		This entry should be NULL when protected is true.  When
+ *		protected is false, and dirty is true, it should point
+ *		to the next item on the dirty LRU list.  When protected
+ *		is false, and dirty is false, it should point to the
+ *		next item on the clean LRU list.  In either case, when
+ *		there is no next item, it should be NULL.
+ *
+ * aux_prev:	Previous pointer on either the clean or dirty LRU lists.
+ *		This entry should be NULL when protected is true.  When
+ *		protected is false, and dirty is true, it should point
+ *		to the previous item on the dirty LRU list.  When protected
+ *		is false, and dirty is false, it should point to the
+ *		previous item on the clean LRU list.  In either case, when
+ *		there is no previous item, it should be NULL.
+ *
+ *
+ * Fields supporting metadata journaling:
+ *
+ * last_trans:	unit64_t containing the ID of the last transaction in
+ * 		which this entry was dirtied.  If journaling is disabled,
+ * 		or if the entry has never been dirtied in a transaction,
+ * 		this field should be set to zero.  Once we notice that
+ * 		the specified transaction has made it to disk, we will
+ * 		reset this field to zero as well.
+ *
+ * 		We must maintain this field, as to avoid messages from
+ * 		the future, we must not flush a dirty entry to disk
+ * 		until the last transaction in which it was dirtied
+ * 		has made it to disk in the journal file.
+ *
+ * trans_next:  Next pointer in the entries modified in the current
+ * 		transaction list.  This field should always be null
+ * 		unless journaling is enabled, the entry is dirty,
+ * 		and last_trans field contains the current transaction
+ * 		number.  Even if all these conditions are fulfilled,
+ * 		the field will still be NULL if this is the last
+ * 		entry on the list.
+ *
+ * trans_prev:  Previous pointer in the entries modified in the current
+ * 		transaction list.  This field should always be null
+ * 		unless journaling is enabled, the entry is dirty,
+ * 		and last_trans field contains the current transaction
+ * 		number.  Even if all these conditions are fulfilled,
+ * 		the field will still be NULL if this is the first
+ * 		entry on the list.
+ *
+ *
+ * Cache entry stats collection fields:
+ *
+ * These fields should only be compiled in when both H5C_COLLECT_CACHE_STATS
+ * and H5C_COLLECT_CACHE_ENTRY_STATS are true.  When present, they allow
+ * collection of statistics on individual cache entries.
+ *
+ * accesses:	int32_t containing the number of times this cache entry has
+ *		been referenced in its lifetime.
+ *
+ * clears:	int32_t containing the number of times this cache entry has
+ *              been cleared in its life time.
+ *
+ * flushes:	int32_t containing the number of times this cache entry has
+ *              been flushed to file in its life time.
+ *
+ * pins:	int32_t containing the number of times this cache entry has
+ * 		been pinned in cache in its life time.
+ *
+ ****************************************************************************/
+
+#ifndef NDEBUG
+#define H5C__H5C_CACHE_ENTRY_T_MAGIC		0x005CAC0A
+#define H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC	0xDeadBeef
+#endif /* NDEBUG */
+
+typedef struct H5C_cache_entry_t
+{
+#ifndef NDEBUG
+    uint32_t			magic;
+#endif /* NDEBUG */
+    H5C_t *                     cache_ptr;
+    haddr_t			addr;
+    size_t			size;
+    const H5C_class_t *		type;
+    hbool_t			is_dirty;
+    hbool_t			dirtied;
+    hbool_t			is_protected;
+    hbool_t			is_read_only;
+    int				ro_ref_count;
+    hbool_t			is_pinned;
+    hbool_t			in_slist;
+    hbool_t			flush_marker;
+#ifdef H5_HAVE_PARALLEL
+    hbool_t			clear_on_unprotect;
+    hbool_t		flush_immediately;
+#endif /* H5_HAVE_PARALLEL */
+    hbool_t			flush_in_progress;
+    hbool_t			destroy_in_progress;
+    hbool_t		free_file_space_on_destroy;
+
+    /* fields supporting the hash table: */
+
+    struct H5C_cache_entry_t *	ht_next;
+    struct H5C_cache_entry_t *	ht_prev;
+
+    /* fields supporting replacement policies: */
+
+    struct H5C_cache_entry_t *	next;
+    struct H5C_cache_entry_t *	prev;
+    struct H5C_cache_entry_t *	aux_next;
+    struct H5C_cache_entry_t *	aux_prev;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+    /* cache entry stats fields */
+
+    int32_t			accesses;
+    int32_t			clears;
+    int32_t			flushes;
+    int32_t			pins;
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+} H5C_cache_entry_t;
+
+
+/****************************************************************************
+ *
+ * structure H5C_auto_size_ctl_t
+ *
+ * Instances of H5C_auto_size_ctl_t are used to get and set the control
+ * fields for automatic cache re-sizing.
+ *
+ * The fields of the structure are discussed individually below:
+ *
+ * version: Integer field containing the version number of this version
+ *	of the H5C_auto_size_ctl_t structure.  Any instance of
+ *	H5C_auto_size_ctl_t passed to the cache must have a known
+ *	version number, or an error will be flagged.
+ *
+ * report_fcn:  Pointer to the function that is to be called to report
+ *      activities each time the auto cache resize code is executed.  If the
+ *	field is NULL, no call is made.
+ *
+ *	If the field is not NULL, it must contain the address of a function
+ *	of type H5C_auto_resize_report_fcn.
+ *
+ * set_initial_size: Boolean flag indicating whether the size of the
+ *	initial size of the cache is to be set to the value given in
+ *	the initial_size field.  If set_initial_size is FALSE, the
+ *	initial_size field is ignored.
+ *
+ * initial_size: If enabled, this field contain the size the cache is
+ *	to be set to upon receipt of this structure.  Needless to say,
+ *	initial_size must lie in the closed interval [min_size, max_size].
+ *
+ * min_clean_fraction: double in the range 0 to 1 indicating the fraction
+ *	of the cache that is to be kept clean.  This field is only used
+ *	in parallel mode.  Typical values are 0.1 to 0.5.
+ *
+ * max_size: Maximum size to which the cache can be adjusted.  The
+ *	supplied value must fall in the closed interval
+ *	[MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE].  Also, max_size must
+ *	be greater than or equal to min_size.
+ *
+ * min_size: Minimum size to which the cache can be adjusted.  The
+ *      supplied value must fall in the closed interval
+ *      [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE].  Also, min_size must
+ *	be less than or equal to max_size.
+ *
+ * epoch_length: Number of accesses on the cache over which to collect
+ *	hit rate stats before running the automatic cache resize code,
+ *      if it is enabled.
+ *
+ *	At the end of an epoch, we discard prior hit rate data and start
+ * 	collecting afresh.  The epoch_length must lie in the closed
+ *	interval [H5C__MIN_AR_EPOCH_LENGTH, H5C__MAX_AR_EPOCH_LENGTH].
+ *
+ *
+ * Cache size increase control fields:
+ *
+ * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose
+ *	value indicates how we determine whether the cache size should be
+ *	increased.  At present there are two possible values:
+ *
+ *	H5C_incr__off:	Don't attempt to increase the size of the cache
+ *		automatically.
+ *
+ *		When this increment mode is selected, the remaining fields
+ *		in the cache size increase section ar ignored.
+ *
+ *	H5C_incr__threshold: Attempt to increase the size of the cache
+ *		whenever the average hit rate over the last epoch drops
+ *		below the value supplied in the lower_hr_threshold
+ *		field.
+ *
+ *		Note that this attempt will fail if the cache is already
+ *		at its maximum size, or if the cache is not already using
+ *		all available space.
+ *
+ * lower_hr_threshold: Lower hit rate threshold.  If the increment mode
+ *	(incr_mode) is H5C_incr__threshold and the hit rate drops below the
+ *	value supplied in this field in an epoch, increment the cache size by
+ *	size_increment.  Note that cache size may not be incremented above
+ *	max_size, and that the increment may be further restricted by the
+ *	max_increment field if it is enabled.
+ *
+ *	When enabled, this field must contain a value in the range [0.0, 1.0].
+ *	Depending on the incr_mode selected, it may also have to be less than
+ *	upper_hr_threshold.
+ *
+ * increment:  Double containing the multiplier used to derive the new
+ *	cache size from the old if a cache size increment is triggered.
+ *      The increment must be greater than 1.0, and should not exceed 2.0.
+ *
+ *	The new cache size is obtained by multiplying the current max cache
+ *	size by the increment, and then clamping to max_size and to stay
+ *	within the max_increment as necessary.
+ *
+ * apply_max_increment:  Boolean flag indicating whether the max_increment
+ *	field should be used to limit the maximum cache size increment.
+ *
+ * max_increment: If enabled by the apply_max_increment field described
+ *	above, this field contains the maximum number of bytes by which the
+ *	cache size can be increased in a single re-size.
+ *
+ * flash_incr_mode:  Instance of the H5C_cache_flash_incr_mode enumerated
+ *      type whose value indicates whether and by what algorithm we should
+ *      make flash increases in the size of the cache to accomodate insertion
+ *      of large entries and large increases in the size of a single entry.
+ *
+ *      The addition of the flash increment mode was occasioned by performance
+ *      problems that appear when a local heap is increased to a size in excess
+ *      of the current cache size.  While the existing re-size code dealt with
+ *      this eventually, performance was very bad for the remainder of the
+ *      epoch.
+ *
+ *      At present, there are two possible values for the flash_incr_mode:
+ *
+ *      H5C_flash_incr__off:  Don't perform flash increases in the size of
+ *              the cache.
+ *
+ *      H5C_flash_incr__add_space:  Let x be either the size of a newly
+ *              newly inserted entry, or the number of bytes by which the
+ *              size of an existing entry has been increased.
+ *
+ *              If
+ *                   x > flash_threshold * current max cache size,
+ *
+ *              increase the current maximum cache size by x * flash_multiple
+ *              less any free space in the cache, and start a new epoch.  For
+ *              now at least, pay no attention to the maximum increment.
+ *
+ *
+ *      With a little thought, it should be obvious that the above flash
+ *      cache size increase algorithm is not sufficient for all
+ *      circumstances -- for example, suppose the user round robins through
+ *      (1/flash_threshold) +1 groups, adding one data set to each on each
+ *      pass.  Then all will increase in size at about the same time, requiring
+ *      the max cache size to at least double to maintain acceptable
+ *      performance, however the above flash increment algorithm will not be
+ *      triggered.
+ *
+ *      Hopefully, the add space algorithm detailed above will be sufficient
+ *      for the performance problems encountered to date.  However, we should
+ *      expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ *      H5C_flash_incr__add_space section of the discussion of the
+ *      flash_incr_mode section.  This field is ignored unless flash_incr_mode
+ *      is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache
+ * 	size is multiplied to obtain the size threshold for the add_space
+ * 	flash increment algorithm.  The field is ignored unless
+ * 	flash_incr_mode is H5C_flash_incr__add_space.
+ *
+ *
+ * Cache size decrease control fields:
+ *
+ * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose
+ *	value indicates how we determine whether the cache size should be
+ *	decreased.  At present there are four possibilities.
+ *
+ *	H5C_decr__off:	Don't attempt to decrease the size of the cache
+ *		automatically.
+ *
+ *		When this increment mode is selected, the remaining fields
+ *		in the cache size decrease section are ignored.
+ *
+ *	H5C_decr__threshold: Attempt to decrease the size of the cache
+ *		whenever the average hit rate over the last epoch rises
+ *		above the value	supplied in the upper_hr_threshold
+ *		field.
+ *
+ *	H5C_decr__age_out:  At the end of each epoch, search the cache for
+ *		entries that have not been accessed for at least the number
+ *		of epochs specified in the epochs_before_eviction field, and
+ *		evict these entries.  Conceptually, the maximum cache size
+ *		is then decreased to match the new actual cache size.  However,
+ *		this reduction may be modified by the min_size, the
+ *		max_decrement, and/or the empty_reserve.
+ *
+ *	H5C_decr__age_out_with_threshold:  Same as age_out, but we only
+ *		attempt to reduce the cache size when the hit rate observed
+ *		over the last epoch exceeds the value provided in the
+ *		upper_hr_threshold field.
+ *
+ * upper_hr_threshold: Upper hit rate threshold.  The use of this field
+ *	varies according to the current decr_mode:
+ *
+ *	H5C_decr__off or H5C_decr__age_out:  The value of this field is
+ *		ignored.
+ *
+ *	H5C_decr__threshold:  If the hit rate exceeds this threshold in any
+ *		epoch, attempt to decrement the cache size by size_decrement.
+ *
+ *		Note that cache size may not be decremented below min_size.
+ *
+ *		Note also that if the upper_threshold is 1.0, the cache size
+ *		will never be reduced.
+ *
+ *	H5C_decr__age_out_with_threshold:  If the hit rate exceeds this
+ *		threshold in any epoch, attempt to reduce the cache size
+ *		by evicting entries that have not been accessed for more
+ *		than the specified number of epochs.
+ *
+ * decrement: This field is only used when the decr_mode is
+ *	H5C_decr__threshold.
+ *
+ *	The field is a double containing the multiplier used to derive the
+ *	new cache size from the old if a cache size decrement is triggered.
+ *	The decrement must be in the range 0.0 (in which case the cache will
+ *      try to contract to its minimum size) to 1.0 (in which case the
+ *      cache will never shrink).
+ *
+ * apply_max_decrement:  Boolean flag used to determine whether decrements
+ *	in cache size are to be limited by the max_decrement field.
+ *
+ * max_decrement: Maximum number of bytes by which the cache size can be
+ *	decreased in a single re-size.  Note that decrements may also be
+ *	restricted by the min_size of the cache, and (in age out modes) by
+ *	the empty_reserve field.
+ *
+ * epochs_before_eviction:  Integer field used in H5C_decr__age_out and
+ *	H5C_decr__age_out_with_threshold decrement modes.
+ *
+ *	This field contains the number of epochs an entry must remain
+ *	unaccessed before it is evicted in an attempt to reduce the
+ *	cache size.  If applicable, this field must lie in the range
+ *	[1, H5C__MAX_EPOCH_MARKERS].
+ *
+ * apply_empty_reserve:  Boolean field controlling whether the empty_reserve
+ *	field is to be used in computing the new cache size when the
+ *	decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold.
+ *
+ * empty_reserve:  To avoid a constant racheting down of cache size by small
+ *	amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold
+ *	modes, this field allows one to require that any cache size
+ *	reductions leave the specified fraction of unused space in the cache.
+ *
+ *	The value of this field must be in the range [0.0, 1.0].  I would
+ *	expect typical values to be in the range of 0.01 to 0.1.
+ *
+ ****************************************************************************/
+
+#define H5C_RESIZE_CFG__VALIDATE_GENERAL        0x1
+#define H5C_RESIZE_CFG__VALIDATE_INCREMENT      0x2
+#define H5C_RESIZE_CFG__VALIDATE_DECREMENT      0x4
+#define H5C_RESIZE_CFG__VALIDATE_INTERACTIONS   0x8
+#define H5C_RESIZE_CFG__VALIDATE_ALL      \
+(                                         \
+    H5C_RESIZE_CFG__VALIDATE_GENERAL |    \
+    H5C_RESIZE_CFG__VALIDATE_INCREMENT |  \
+    H5C_RESIZE_CFG__VALIDATE_DECREMENT |  \
+    H5C_RESIZE_CFG__VALIDATE_INTERACTIONS \
+)
+
+#define H5C__CURR_AUTO_SIZE_CTL_VER		1
+#define H5C__CURR_AUTO_RESIZE_RPT_FCN_VER	1
+
+#define H5C__MAX_EPOCH_MARKERS  		10
+
+#define H5C__DEF_AR_UPPER_THRESHHOLD		0.9999f
+#define H5C__DEF_AR_LOWER_THRESHHOLD		0.9f
+#define H5C__DEF_AR_MAX_SIZE			((size_t)(16 * 1024 * 1024))
+#define H5C__DEF_AR_INIT_SIZE			((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_MIN_SIZE			((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_MIN_CLEAN_FRAC		0.5f
+#define H5C__DEF_AR_INCREMENT			2.0f
+#define H5C__DEF_AR_MAX_INCREMENT		((size_t)( 2 * 1024 * 1024))
+#define H5C__DEF_AR_FLASH_MULTIPLE              1.0f
+#define H5C__DEV_AR_FLASH_THRESHOLD             0.25f
+#define H5C__DEF_AR_DECREMENT			0.9f
+#define H5C__DEF_AR_MAX_DECREMENT		((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_EPCHS_B4_EVICT		3
+#define H5C__DEF_AR_EMPTY_RESERVE		0.05f
+#define H5C__MIN_AR_EPOCH_LENGTH		100
+#define H5C__DEF_AR_EPOCH_LENGTH		50000
+#define H5C__MAX_AR_EPOCH_LENGTH		1000000
+
+enum H5C_resize_status
+{
+    in_spec,
+    increase,
+    flash_increase,
+    decrease,
+    at_max_size,
+    at_min_size,
+    increase_disabled,
+    decrease_disabled,
+    not_full
+}; /* enum H5C_resize_conditions */
+
+typedef void (*H5C_auto_resize_rpt_fcn)(H5C_t * cache_ptr,
+                                        int32_t version,
+                                        double hit_rate,
+                                        enum H5C_resize_status status,
+                                        size_t old_max_cache_size,
+                                        size_t new_max_cache_size,
+                                        size_t old_min_clean_size,
+                                        size_t new_min_clean_size);
+
+typedef struct H5C_auto_size_ctl_t
+{
+    /* general configuration fields: */
+    int32_t				version;
+    H5C_auto_resize_rpt_fcn		rpt_fcn;
+
+    hbool_t				set_initial_size;
+    size_t				initial_size;
+
+    double				min_clean_fraction;
+
+    size_t				max_size;
+    size_t				min_size;
+
+    int64_t				epoch_length;
+
+
+    /* size increase control fields: */
+    enum H5C_cache_incr_mode		incr_mode;
+
+    double				lower_hr_threshold;
+
+    double				increment;
+
+    hbool_t				apply_max_increment;
+    size_t				max_increment;
+
+    enum H5C_cache_flash_incr_mode      flash_incr_mode;
+    double                              flash_multiple;
+    double                              flash_threshold;
+
+
+    /* size decrease control fields: */
+    enum H5C_cache_decr_mode		decr_mode;
+
+    double				upper_hr_threshold;
+
+    double				decrement;
+
+    hbool_t				apply_max_decrement;
+    size_t				max_decrement;
+
+    int32_t				epochs_before_eviction;
+
+    hbool_t				apply_empty_reserve;
+    double				empty_reserve;
+
+} H5C_auto_size_ctl_t;
+
+
+/*
+ * Library prototypes.
+ */
+
+/* #defines of flags used in the flags parameters in some of the
+ * following function calls.  Note that not all flags are applicable
+ * to all function calls.  Flags that don't apply to a particular
+ * function are ignored in that function.
+ *
+ * These flags apply to all function calls:
+ *
+ * 	H5C__NO_FLAGS_SET (generic "no flags set" for all fcn calls)
+ *
+ *
+ * These flags apply to H5C_insert_entry():
+ *
+ * 	H5C__SET_FLUSH_MARKER_FLAG
+ * 	H5C__PIN_ENTRY_FLAG
+ *
+ * These flags apply to H5C_protect()
+ *
+ * 	H5C__READ_ONLY_FLAG
+ *
+ * These flags apply to H5C_unprotect():
+ *
+ * 	H5C__SET_FLUSH_MARKER_FLAG
+ * 	H5C__DELETED_FLAG
+ * 	H5C__DIRTIED_FLAG
+ * 	H5C__PIN_ENTRY_FLAG
+ * 	H5C__UNPIN_ENTRY_FLAG
+ * 	H5C__FREE_FILE_SPACE_FLAG
+ *      H5C__TAKE_OWNERSHIP_FLAG
+ *
+ * These flags apply to H5C_expunge_entry():
+ *
+ * 	H5C__FREE_FILE_SPACE_FLAG
+ *
+ * These flags apply to H5C_flush_cache():
+ *
+ * 	H5C__FLUSH_INVALIDATE_FLAG
+ * 	H5C__FLUSH_CLEAR_ONLY_FLAG
+ * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
+ *	H5C__FLUSH_IGNORE_PROTECTED_FLAG (can't use this flag in combination
+ *					  with H5C__FLUSH_INVALIDATE_FLAG)
+ *
+ * These flags apply to H5C_flush_single_entry():
+ *
+ * 	H5C__FLUSH_INVALIDATE_FLAG
+ * 	H5C__FLUSH_CLEAR_ONLY_FLAG
+ * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
+ *      H5C__TAKE_OWNERSHIP_FLAG
+ */
+
+#define H5C__NO_FLAGS_SET			0x0000
+#define H5C__SET_FLUSH_MARKER_FLAG		0x0001
+#define H5C__DELETED_FLAG			0x0002
+#define H5C__DIRTIED_FLAG			0x0004
+#define H5C__PIN_ENTRY_FLAG			0x0008
+#define H5C__UNPIN_ENTRY_FLAG			0x0010
+#define H5C__FLUSH_INVALIDATE_FLAG		0x0020
+#define H5C__FLUSH_CLEAR_ONLY_FLAG		0x0040
+#define H5C__FLUSH_MARKED_ENTRIES_FLAG		0x0080
+#define H5C__FLUSH_IGNORE_PROTECTED_FLAG	0x0100
+#define H5C__READ_ONLY_FLAG			0x0200
+#define H5C__FREE_FILE_SPACE_FLAG		0x0800
+#define H5C__TAKE_OWNERSHIP_FLAG		0x1000
+
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5C_apply_candidate_list(H5F_t * f,
+                                       hid_t primary_dxpl_id,
+                                       hid_t secondary_dxpl_id,
+                                       H5C_t * cache_ptr,
+                                       int num_candidates,
+                                       haddr_t * candidates_list_ptr,
+                                       int mpi_rank,
+                                       int mpi_size);
+
+H5_DLL herr_t H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr);
+
+H5_DLL herr_t H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr);
+#endif /* H5_HAVE_PARALLEL */
+
+H5_DLL H5C_t * H5C_create(size_t                     max_cache_size,
+                          size_t                     min_clean_size,
+                          int                        max_type_id,
+			  const char *               (* type_name_table_ptr),
+                          H5C_write_permitted_func_t check_write_permitted,
+                          hbool_t                    write_permitted,
+                          H5C_log_flush_func_t       log_flush,
+                          void *                     aux_ptr);
+
+H5_DLL void H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
+                                        int32_t version,
+                                        double hit_rate,
+                                        enum H5C_resize_status status,
+                                        size_t old_max_cache_size,
+                                        size_t new_max_cache_size,
+                                        size_t old_min_clean_size,
+                                        size_t new_min_clean_size);
+
+H5_DLL herr_t H5C_dest(H5F_t * f,
+                       hid_t   primary_dxpl_id,
+                       hid_t   secondary_dxpl_id);
+
+H5_DLL herr_t H5C_expunge_entry(H5F_t *             f,
+		                hid_t               primary_dxpl_id,
+                                hid_t               secondary_dxpl_id,
+                                const H5C_class_t * type,
+                                haddr_t             addr,
+                                unsigned            flags);
+
+H5_DLL herr_t H5C_flush_cache(H5F_t *  f,
+                              hid_t    primary_dxpl_id,
+                              hid_t    secondary_dxpl_id,
+                              unsigned flags);
+
+H5_DLL herr_t H5C_flush_to_min_clean(H5F_t * f,
+                                     hid_t   primary_dxpl_id,
+                                     hid_t   secondary_dxpl_id);
+
+H5_DLL herr_t H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr,
+                                               H5C_auto_size_ctl_t *config_ptr);
+
+H5_DLL herr_t H5C_get_cache_size(H5C_t * cache_ptr,
+                                 size_t * max_size_ptr,
+                                 size_t * min_clean_size_ptr,
+                                 size_t * cur_size_ptr,
+                                 int32_t * cur_num_entries_ptr);
+
+H5_DLL herr_t H5C_get_cache_hit_rate(H5C_t * cache_ptr,
+                                     double * hit_rate_ptr);
+
+H5_DLL herr_t H5C_get_entry_status(const H5F_t *f,
+                                   haddr_t   addr,
+                                   size_t *  size_ptr,
+                                   hbool_t * in_cache_ptr,
+                                   hbool_t * is_dirty_ptr,
+                                   hbool_t * is_protected_ptr,
+				   hbool_t * is_pinned_ptr);
+
+H5_DLL herr_t H5C_get_evictions_enabled(const H5C_t * cache_ptr,
+                                        hbool_t * evictions_enabled_ptr);
+
+H5_DLL herr_t H5C_get_trace_file_ptr(const H5C_t *cache_ptr,
+    FILE **trace_file_ptr_ptr);
+H5_DLL herr_t H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
+    FILE **trace_file_ptr_ptr);
+
+H5_DLL herr_t H5C_insert_entry(H5F_t *             f,
+                               hid_t               primary_dxpl_id,
+                               hid_t               secondary_dxpl_id,
+                               const H5C_class_t * type,
+                               haddr_t             addr,
+                               void *              thing,
+                               unsigned int        flags);
+
+H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t *  f,
+                                        hid_t    primary_dxpl_id,
+                                        hid_t    secondary_dxpl_id,
+                                        int32_t  ce_array_len,
+                                        haddr_t *ce_array_ptr);
+
+H5_DLL herr_t H5C_mark_entry_dirty(void *thing);
+
+H5_DLL herr_t H5C_move_entry(H5C_t *             cache_ptr,
+                               const H5C_class_t * type,
+                               haddr_t             old_addr,
+                               haddr_t             new_addr);
+
+H5_DLL herr_t H5C_pin_protected_entry(void *thing);
+
+H5_DLL void * H5C_protect(H5F_t *             f,
+                          hid_t               primary_dxpl_id,
+                          hid_t               secondary_dxpl_id,
+			  const H5C_class_t * type,
+                          haddr_t             addr,
+                          void *              udata,
+                          unsigned            flags);
+
+H5_DLL herr_t H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr);
+
+H5_DLL herr_t H5C_resize_entry(void *thing, size_t new_size);
+
+H5_DLL herr_t H5C_set_cache_auto_resize_config(H5C_t *cache_ptr,
+                                               H5C_auto_size_ctl_t *config_ptr);
+
+H5_DLL herr_t H5C_set_evictions_enabled(H5C_t *cache_ptr,
+                                        hbool_t evictions_enabled);
+
+H5_DLL herr_t H5C_set_prefix(H5C_t * cache_ptr, char * prefix);
+
+H5_DLL herr_t H5C_set_trace_file_ptr(H5C_t * cache_ptr,
+		                     FILE * trace_file_ptr);
+
+H5_DLL herr_t H5C_stats(H5C_t * cache_ptr,
+                        const char * cache_name,
+                        hbool_t display_detailed_stats);
+
+H5_DLL void H5C_stats__reset(H5C_t * cache_ptr);
+
+H5_DLL herr_t H5C_dump_cache(H5C_t * cache_ptr,
+                             const char *  cache_name);
+
+H5_DLL herr_t H5C_unpin_entry(void *thing);
+
+H5_DLL herr_t H5C_unprotect(H5F_t *             f,
+                            hid_t               primary_dxpl_id,
+                            hid_t               secondary_dxpl_id,
+                            const H5C_class_t * type,
+                            haddr_t             addr,
+                            void *              thing,
+                            unsigned int        flags);
+
+H5_DLL herr_t H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
+                                         unsigned int tests);
+
+#endif /* !_H5Cprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Cpublic.h b/gatb-core/thirdparty/hdf5/src/H5Cpublic.h
new file mode 100644
index 0000000..39ebbe3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Cpublic.h
@@ -0,0 +1,61 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Cpublic.h
+ *              June 4, 2005
+ *              John Mainzer
+ *
+ * Purpose:     Public include file for cache functions.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Cpublic_H
+#define _H5Cpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum H5C_cache_incr_mode
+{
+    H5C_incr__off,
+    H5C_incr__threshold
+};
+
+enum H5C_cache_flash_incr_mode
+{
+     H5C_flash_incr__off,
+     H5C_flash_incr__add_space
+};
+
+enum H5C_cache_decr_mode
+{
+    H5C_decr__off,
+    H5C_decr__threshold,
+    H5C_decr__age_out,
+    H5C_decr__age_out_with_threshold
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5D.c b/gatb-core/thirdparty/hdf5/src/H5D.c
new file mode 100644
index 0000000..cd3d989
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5D.c
@@ -0,0 +1,1004 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5D__init_pub_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern the free list to manage blocks of VL data */
+H5FL_BLK_EXTERN(vlen_vl_buf);
+
+/* Declare extern the free list to manage other blocks of VL data */
+H5FL_BLK_EXTERN(vlen_fl_buf);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__init_pub_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5D__init_pub_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5D_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__init_pub_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5D_init())
+} /* H5D__init_pub_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__term_pub_interface -- Terminate interface
+USAGE
+    herr_t H5D__term_pub_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5D__term_pub_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5D__term_pub_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dcreate2
+ *
+ * Purpose:	Creates a new dataset named NAME at LOC_ID, opens the
+ *		dataset for access, and associates with that dataset constant
+ *		and initial persistent properties including the type of each
+ *		datapoint as stored in the file (TYPE_ID), the size of the
+ *		dataset (SPACE_ID), and other initial miscellaneous
+ *		properties (DCPL_ID).
+ *
+ *		All arguments are copied into the dataset, so the caller is
+ *		allowed to derive new types, dataspaces, and creation
+ *		parameters from the old ones and reuse them in calls to
+ *		create other datasets.
+ *
+ * Return:	Success:	The object ID of the new dataset.  At this
+ *				point, the dataset is ready to receive its
+ *				raw data.  Attempting to read raw data from
+ *				the dataset will probably return the fill
+ *				value.	The dataset should be closed when the
+ *				caller is no longer interested in it.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
+    hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id)
+{
+    H5G_loc_t	   loc;                 /* Object location to insert dataset into */
+    H5D_t	   *dset = NULL;        /* New dataset's info */
+    const H5S_t    *space;              /* Dataspace for dataset */
+    hid_t           ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("i", "i*siiiii", loc_id, name, type_id, space_id, lcpl_id, dcpl_id,
+             dapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID")
+    if(H5I_DATATYPE != H5I_get_type(type_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype ID")
+    if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace ID")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == lcpl_id)
+        lcpl_id = H5P_LINK_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link creation property list")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == dcpl_id)
+        dcpl_id = H5P_DATASET_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dcpl_id, H5P_DATASET_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset create property list ID")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == dapl_id)
+        dapl_id = H5P_DATASET_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dapl_id, H5P_DATASET_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list")
+
+    /* Create the new dataset & get its ID */
+    if(NULL == (dset = H5D__create_named(&loc, name, type_id, space, lcpl_id, dcpl_id, dapl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset")
+    if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset")
+
+done:
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dcreate2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dcreate_anon
+ *
+ * Purpose:	Creates a new dataset named NAME at LOC_ID, opens the
+ *		dataset for access, and associates with that dataset constant
+ *		and initial persistent properties including the type of each
+ *		datapoint as stored in the file (TYPE_ID), the size of the
+ *		dataset (SPACE_ID), and other initial miscellaneous
+ *		properties (DCPL_ID).
+ *
+ *		All arguments are copied into the dataset, so the caller is
+ *		allowed to derive new types, dataspaces, and creation
+ *		parameters from the old ones and reuse them in calls to
+ *		create other datasets.
+ *
+ *              The resulting ID should be linked into the file with
+ *              H5Olink or it will be deleted when closed.
+ *
+ * Return:	Success:	The object ID of the new dataset.  At this
+ *				point, the dataset is ready to receive its
+ *				raw data.  Attempting to read raw data from
+ *				the dataset will probably return the fill
+ *				value.	The dataset should be linked into
+ *                              the group hierarchy before being closed or
+ *                              it will be deleted.  The dataset should be
+ *                              closed when the caller is no longer interested
+ *                              in it.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	James Laird
+ *		Tuesday, January 24, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id,
+    hid_t dapl_id)
+{
+    H5G_loc_t	   loc;                 /* Object location to insert dataset into */
+    H5D_t	   *dset = NULL;        /* New dataset's info */
+    const H5S_t    *space;              /* Dataspace for dataset */
+    hid_t           ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("i", "iiiii", loc_id, type_id, space_id, dcpl_id, dapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID")
+    if(H5I_DATATYPE != H5I_get_type(type_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype ID")
+    if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace ID")
+    if(H5P_DEFAULT == dcpl_id)
+        dcpl_id = H5P_DATASET_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dcpl_id, H5P_DATASET_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset create property list ID")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == dapl_id)
+        dapl_id = H5P_DATASET_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dapl_id, H5P_DATASET_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list")
+
+    /* build and open the new dataset */
+    if(NULL == (dset = H5D__create(loc.oloc->file, type_id, space, dcpl_id, dapl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset")
+
+    /* Register the new dataset to get an ID for it */
+    if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset")
+
+done:
+    /* Release the dataset's object header, if it was created */
+    if(dset) {
+        H5O_loc_t *oloc;         /* Object location for dataset */
+
+        /* Get the new dataset's object location */
+        if(NULL == (oloc = H5D_oloc(dset)))
+            HDONE_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get object location of dataset")
+
+        /* Decrement refcount on dataset's object header in memory */
+        if(H5O_dec_rc_by_loc(oloc, H5AC_dxpl_id) < 0)
+           HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+    } /* end if */
+
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dcreate_anon() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dopen2
+ *
+ * Purpose:	Finds a dataset named NAME at LOC_ID, opens it, and returns
+ *		its ID.	 The dataset should be close when the caller is no
+ *		longer interested in it.
+ *
+ *              Takes a dataset access property list
+ *
+ * Return:	Success:	A new dataset ID
+ *		Failure:	FAIL
+ *
+ * Programmer:	James Laird
+ *		Thursday, July 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
+{
+    H5D_t       *dset = NULL;
+    H5G_loc_t	 loc;		        /* Object location of group */
+    H5G_loc_t	 dset_loc;		/* Object location of dataset */
+    H5G_name_t   path;            	/* Dataset group hier. path */
+    H5O_loc_t    oloc;            	/* Dataset object location */
+    H5O_type_t   obj_type;              /* Type of object at location */
+    hbool_t      loc_found = FALSE;     /* Location at 'name' found */
+    hid_t        dxpl_id = H5AC_ind_dxpl_id;    /* dxpl to use to open datset */
+    hid_t        ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*si", loc_id, name, dapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == dapl_id)
+        dapl_id = H5P_DATASET_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dapl_id, H5P_DATASET_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list")
+
+    /* Set up dataset location to fill in */
+    dset_loc.oloc = &oloc;
+    dset_loc.path = &path;
+    H5G_loc_reset(&dset_loc);
+
+    /* Find the dataset object */
+    if(H5G_loc_find(&loc, name, &dset_loc, dapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
+    loc_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_DATASET)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Open the dataset */
+    if(NULL == (dset = H5D_open(&dset_loc, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
+
+    /* Register an atom for the dataset */
+    if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom")
+
+done:
+    if(ret_value < 0) {
+        if(dset) {
+            if(H5D_close(dset) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+        } /* end if */
+        else {
+            if(loc_found && H5G_loc_free(&dset_loc) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't free location")
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dopen2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dclose
+ *
+ * Purpose:	Closes access to a dataset (DATASET_ID) and releases
+ *		resources used by it. It is illegal to subsequently use that
+ *		same dataset ID in calls to other dataset functions.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dclose(hid_t dset_id)
+{
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", dset_id);
+
+    /* Check args */
+    if(NULL == H5I_object_verify(dset_id, H5I_DATASET))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /*
+     * Decrement the counter on the dataset.  It will be freed if the count
+     * reaches zero.  
+     *
+     * Pass in TRUE for the 3rd parameter to tell the function to remove
+     * dataset's ID even though the freeing function might fail.  Please
+     * see the comments in H5I_dec_ref for details. (SLU - 2010/9/7)
+     */
+    if(H5I_dec_app_ref_always_close(dset_id) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't decrement count on dataset ID")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_space
+ *
+ * Purpose:	Returns a copy of the file dataspace for a dataset.
+ *
+ * Return:	Success:	ID for a copy of the dataspace.  The data
+ *				space should be released by calling
+ *				H5Sclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January 28, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dget_space(hid_t dset_id)
+{
+    H5D_t	*dset = NULL;
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if((ret_value = H5D_get_space(dset)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get dataspace")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_space_status
+ *
+ * Purpose:	Returns the status of dataspace allocation.
+ *
+ * Return:
+ *		Success:	Non-negative
+ *
+ *		Failture:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation)
+{
+    H5D_t 	*dset = NULL;
+    herr_t 	ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Ds", dset_id, allocation);
+
+    /* Check arguments */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Read dataspace address and return */
+    if(H5D__get_space_status(dset, allocation, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get space status")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_type
+ *
+ * Purpose:	Returns a copy of the file datatype for a dataset.
+ *
+ * Return:	Success:	ID for a copy of the datatype.	 The data
+ *				type should be released by calling
+ *				H5Tclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, February  3, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dget_type(hid_t dset_id)
+{
+
+    H5D_t	*dset;                  /* Dataset */
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if((ret_value = H5D_get_type(dset)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get dataspace")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dget_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_create_plist
+ *
+ * Purpose:	Returns a copy of the dataset creation property list.
+ *
+ * Return:	Success:	ID for a copy of the dataset creation
+ *				property list.  The template should be
+ *				released by calling H5P_close().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, February  3, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dget_create_plist(hid_t dset_id)
+{
+    H5D_t		*dataset;                  /* Dataset structure */
+    hid_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dataset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if((ret_value = H5D_get_create_plist(dataset)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "Can't get creation plist")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dget_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_access_plist
+ *
+ * Purpose:	Returns a copy of the dataset creation property list.
+ *
+ * Description: H5Dget_access_plist returns the dataset access property
+ *      list identifier of the specified dataset.
+ *
+ *      The chunk cache parameters in the returned property lists will be
+ *      those used by the dataset.  If the properties in the file access
+ *      property list were used to determine the dataset’s chunk cache
+ *      configuration, then those properties will be present in the
+ *      returned dataset access property list.  If the dataset does not
+ *      use a chunked layout, then the chunk cache properties will be set
+ *      to the default.  The chunk cache properties in the returned list
+ *      are considered to be “set”, and any use of this list will override
+ *      the corresponding properties in the file’s file access property
+ *      list.
+ *
+ *      All link access properties in the returned list will be set to the
+ *      default values.
+ *
+ * Return:	Success:	ID for a copy of the dataset access
+ *				property list.  The template should be
+ *				released by calling H5Pclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Neil Fortner
+ *		Wednesday, October 29, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dget_access_plist(hid_t dset_id)
+{
+    H5D_t           *dset;          /* Dataset structure */
+    hid_t           ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", dset_id);
+
+    /* Check args */
+    if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if((ret_value = H5D_get_access_plist(dset)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "Can't get access plist")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dget_access_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_storage_size
+ *
+ * Purpose:	Returns the amount of storage that is required for the
+ *		dataset. For chunked datasets this is the number of allocated
+ *		chunks times the chunk size.
+ *
+ * Return:	Success:	The amount of storage space allocated for the
+ *				dataset, not counting meta data. The return
+ *				value may be zero if no data has been stored.
+ *
+ *		Failure:	Zero
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 21, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5Dget_storage_size(hid_t dset_id)
+{
+    H5D_t	*dset;          /* Dataset to query */
+    hsize_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE1("h", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a dataset")
+
+    /* Set return value */
+    if(H5D__get_storage_size(dset, H5AC_ind_dxpl_id, &ret_value) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, 0, "can't get size of dataset's storage")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dget_storage_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dget_offset
+ *
+ * Purpose:	Returns the address of dataset in file.
+ *
+ * Return:	Success:        the address of dataset
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:  Raymond Lu
+ *              November 6, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5Dget_offset(hid_t dset_id)
+{
+    H5D_t	*dset;          /* Dataset to query */
+    haddr_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(HADDR_UNDEF)
+    H5TRACE1("a", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, HADDR_UNDEF, "not a dataset")
+
+    /* Set return value */
+    ret_value = H5D__get_offset(dset);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dget_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Diterate
+ *
+ * Purpose:	This routine iterates over all the elements selected in a memory
+ *      buffer.  The callback function is called once for each element selected
+ *      in the dataspace.  The selection in the dataspace is modified so
+ *      that any elements already iterated over are removed from the selection
+ *      if the iteration is interrupted (by the H5D_operator_t function
+ *      returning non-zero) in the "middle" of the iteration and may be
+ *      re-started by the user where it left off.
+ *
+ *      NOTE: Until "subtracting" elements from a selection is implemented,
+ *          the selection is not modified.
+ *
+ * Parameters:
+ *      void *buf;          IN/OUT: Pointer to the buffer in memory containing
+ *                              the elements to iterate over.
+ *      hid_t type_id;      IN: Datatype ID for the elements stored in BUF.
+ *      hid_t space_id;     IN: Dataspace ID for BUF, also contains the
+ *                              selection to iterate over.
+ *      H5D_operator_t op; IN: Function pointer to the routine to be
+ *                              called for each element in BUF iterated over.
+ *      void *operator_data;    IN/OUT: Pointer to any user-defined data
+ *                              associated with the operation.
+ *
+ * Operation information:
+ *      H5D_operator_t is defined as:
+ *          typedef herr_t (*H5D_operator_t)(void *elem, hid_t type_id,
+ *              unsigned ndim, const hsize_t *point, void *operator_data);
+ *
+ *      H5D_operator_t parameters:
+ *          void *elem;         IN/OUT: Pointer to the element in memory containing
+ *                                  the current point.
+ *          hid_t type_id;      IN: Datatype ID for the elements stored in ELEM.
+ *          unsigned ndim;       IN: Number of dimensions for POINT array
+ *          const hsize_t *point; IN: Array containing the location of the element
+ *                                  within the original dataspace.
+ *          void *operator_data;    IN/OUT: Pointer to any user-defined data
+ *                                  associated with the operation.
+ *
+ *      The return values from an operator are:
+ *          Zero causes the iterator to continue, returning zero when all
+ *              elements have been processed.
+ *          Positive causes the iterator to immediately return that positive
+ *              value, indicating short-circuit success.  The iterator can be
+ *              restarted at the next element.
+ *          Negative causes the iterator to immediately return that value,
+ *              indicating failure. The iterator can be restarted at the next
+ *              element.
+ *
+ * Return:	Returns the return value of the last operator if it was non-zero,
+ *          or zero if all elements were processed. Otherwise returns a
+ *          negative value.
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, June 11, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Diterate(void *buf, hid_t type_id, hid_t space_id, H5D_operator_t op,
+        void *operator_data)
+{
+    H5T_t *type;                /* Datatype */
+    H5S_t *space;               /* Dataspace for iteration */
+    H5S_sel_iter_op_t dset_op;  /* Operator for iteration */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*xiix*x", buf, type_id, space_id, op, operator_data);
+
+    /* Check args */
+    if(NULL == op)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid operator")
+    if(NULL == buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer")
+    if(H5I_DATATYPE != H5I_get_type(type_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid datatype")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataspace")
+    if(!(H5S_has_extent(space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace does not have extent set")
+
+    dset_op.op_type = H5S_SEL_ITER_OP_APP;
+    dset_op.u.app_op.op = op;
+    dset_op.u.app_op.type_id = type_id;
+
+    ret_value = H5S_select_iterate(buf, type, space, &dset_op, operator_data);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Diterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dvlen_reclaim
+ *
+ * Purpose:	Frees the buffers allocated for storing variable-length data
+ *      in memory.  Only frees the VL data in the selection defined in the
+ *      dataspace.  The dataset transfer property list is required to find the
+ *      correct allocation/free methods for the VL data in the buffer.
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, June 10, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf)
+{
+    H5S_t *space;               /* Dataspace for iteration */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iii*x", type_id, space_id, plist_id, buf);
+
+    /* Check args */
+    if(H5I_DATATYPE != H5I_get_type(type_id) || buf == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataspace")
+    if(!(H5S_has_extent(space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace does not have extent set")
+
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if(H5P_DEFAULT == plist_id)
+        plist_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(plist_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
+
+    /* Call internal routine */
+    ret_value = H5D_vlen_reclaim(type_id, space, plist_id, buf);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Dvlen_reclaim() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dvlen_get_buf_size
+ *
+ * Purpose:	This routine checks the number of bytes required to store the VL
+ *      data from the dataset, using the space_id for the selection in the
+ *      dataset on disk and the type_id for the memory representation of the
+ *      VL data, in memory.  The *size value is modified according to how many
+ *      bytes are required to store the VL data in memory.
+ *
+ * Implementation: This routine actually performs the read with a custom
+ *      memory manager which basically just counts the bytes requested and
+ *      uses a temporary memory buffer (through the H5FL API) to make certain
+ *      enough space is available to perform the read.  Then the temporary
+ *      buffer is released and the number of bytes allocated is returned.
+ *      Kinda kludgy, but easier than the other method of trying to figure out
+ *      the sizes without actually reading the data in... - QAK
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, August 11, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
+        hsize_t *size)
+{
+    H5D_vlen_bufsize_t vlen_bufsize = {0, 0, 0, 0, 0, 0, 0};
+    H5D_t *dset;                /* Dataset for operation */
+    H5S_t *fspace = NULL;       /* Dataset's dataspace */
+    H5S_t *mspace = NULL;       /* Memory dataspace */
+    char bogus;                 /* bogus value to pass to H5Diterate() */
+    H5S_t *space;               /* Dataspace for iteration */
+    H5P_genplist_t  *plist;     /* Property list */
+    H5T_t *type;                /* Datatype */
+    H5S_sel_iter_op_t dset_op;  /* Operator for iteration */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iii*h", dataset_id, type_id, space_id, size);
+
+    /* Check args */
+    if(H5I_DATASET != H5I_get_type(dataset_id) ||
+            H5I_DATATYPE != H5I_get_type(type_id) || size == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
+    if(NULL == (dset = (H5D_t *)H5I_object(dataset_id)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataspace")
+    if(!(H5S_has_extent(space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace does not have extent set")
+
+    /* Save the dataset */
+    vlen_bufsize.dset = dset;
+
+    /* Get a copy of the dataset's dataspace */
+    if(NULL == (fspace = H5S_copy(dset->shared->space, FALSE, TRUE)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to get dataspace")
+    vlen_bufsize.fspace = fspace;
+
+    /* Create a scalar for the memory dataspace */
+    if(NULL == (mspace = H5S_create(H5S_SCALAR)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create dataspace")
+    vlen_bufsize.mspace = mspace;
+
+    /* Grab the temporary buffers required */
+    if(NULL == (vlen_bufsize.fl_tbuf = H5FL_BLK_MALLOC(vlen_fl_buf, (size_t)1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "no temporary buffers available")
+    if(NULL == (vlen_bufsize.vl_tbuf = H5FL_BLK_MALLOC(vlen_vl_buf, (size_t)1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "no temporary buffers available")
+
+    /* Change to the custom memory allocation routines for reading VL data */
+    if((vlen_bufsize.xfer_pid = H5P_create_id(H5P_CLS_DATASET_XFER_g, FALSE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "no dataset xfer plists available")
+
+    /* Get the property list struct */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(vlen_bufsize.xfer_pid)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Set the memory manager to the special allocation routine */
+    if(H5P_set_vlen_mem_manager(plist, H5D__vlen_get_buf_size_alloc, &vlen_bufsize, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set VL data allocation routine")
+
+    /* Set the initial number of bytes required */
+    vlen_bufsize.size = 0;
+
+    /* Call H5S_select_iterate with args, etc. */
+    dset_op.op_type = H5S_SEL_ITER_OP_APP;
+    dset_op.u.app_op.op = H5D__vlen_get_buf_size;
+    dset_op.u.app_op.type_id = type_id;
+
+    ret_value = H5S_select_iterate(&bogus, type, space, &dset_op, &vlen_bufsize);
+
+    /* Get the size if we succeeded */
+    if(ret_value >= 0)
+        *size = vlen_bufsize.size;
+
+done:
+    if(fspace && H5S_close(fspace) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+    if(mspace && H5S_close(mspace) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+    if(vlen_bufsize.fl_tbuf != NULL)
+        vlen_bufsize.fl_tbuf = H5FL_BLK_FREE(vlen_fl_buf, vlen_bufsize.fl_tbuf);
+    if(vlen_bufsize.vl_tbuf != NULL)
+        vlen_bufsize.vl_tbuf = H5FL_BLK_FREE(vlen_vl_buf, vlen_bufsize.vl_tbuf);
+    if(vlen_bufsize.xfer_pid > 0 && H5I_dec_ref(vlen_bufsize.xfer_pid) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement ref count on property list")
+
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Dvlen_get_buf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dset_extent
+ *
+ * Purpose:	Modifies the dimensions of a dataset.
+ *		Can change to a smaller dimension.
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:  Pedro Vicente, pvn at ncsa.uiuc.edu
+ *              April 9, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dset_extent(hid_t dset_id, const hsize_t size[])
+{
+    H5D_t *dset;                /* Dataset for this operation */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", dset_id, size);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(!size)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified")
+
+    /* Private function */
+    if(H5D__set_extent(dset, size, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extend dataset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dset_extent() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dbtree.c b/gatb-core/thirdparty/hdf5/src/H5Dbtree.c
new file mode 100644
index 0000000..a4cdc2f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dbtree.c
@@ -0,0 +1,1484 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Robb Matzke <matzke at llnl.gov>
+ *	       	Wednesday, October  8, 1997
+ *
+ * Purpose:	v1 B-tree indexed (chunked) I/O functions.  The chunks are
+ *              given a multi-dimensional index which is used as a lookup key
+ *              in a B-tree that maps chunk index to disk address.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bprivate.h"		/* B-link trees				*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Sprivate.h"         /* Dataspaces                           */
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/*
+ * Given a B-tree node return the dimensionality of the chunks pointed to by
+ * that node.
+ */
+#define H5D_BTREE_NDIMS(X)	(((X)->sizeof_rkey-8)/8)
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/*
+ * B-tree key.	A key contains the minimum logical N-dimensional coordinates and
+ * the logical size of the chunk to which this key refers.  The
+ * fastest-varying dimension is assumed to reference individual bytes of the
+ * array, so a 100-element 1-d array of 4-byte integers would really be a 2-d
+ * array with the slow varying dimension of size 100 and the fast varying
+ * dimension of size 4 (the storage dimensionality has very little to do with
+ * the real dimensionality).
+ *
+ * Only the first few values of the OFFSET and SIZE fields are actually
+ * stored on disk, depending on the dimensionality.
+ *
+ * The chunk's file address is part of the B-tree and not part of the key.
+ */
+typedef struct H5D_btree_key_t {
+    uint32_t	nbytes;				/*size of stored data	*/
+    hsize_t	offset[H5O_LAYOUT_NDIMS];	/*logical offset to start*/
+    unsigned	filter_mask;			/*excluded filters	*/
+} H5D_btree_key_t;
+
+/* B-tree callback info for iteration over chunks */
+typedef struct H5D_btree_it_ud_t {
+    H5D_chunk_common_ud_t common;		/* Common info for B-tree user data (must be first) */
+    H5D_chunk_cb_func_t cb;                     /* Chunk callback routine */
+    void		*udata;	                /* User data for chunk callback routine */
+} H5D_btree_it_ud_t;
+
+/* B-tree callback info for debugging */
+typedef struct H5D_btree_dbg_t {
+    H5D_chunk_common_ud_t common;               /* Common info for B-tree user data (must be first) */
+    unsigned            ndims;                  /* Number of dimensions */
+} H5D_btree_dbg_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store,
+    unsigned ndims);
+
+/* B-tree iterator callbacks */
+static int H5D__btree_idx_iterate_cb(H5F_t *f, hid_t dxpl_id, const void *left_key,
+    haddr_t addr, const void *right_key, void *_udata);
+
+/* B-tree callbacks */
+static H5RC_t *H5D__btree_get_shared(const H5F_t *f, const void *_udata);
+static herr_t H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key,
+    void *_udata, void *_rt_key, haddr_t *addr_p /*out*/);
+static int H5D__btree_cmp2(void *_lt_key, void *_udata, void *_rt_key);
+static int H5D__btree_cmp3(void *_lt_key, void *_udata, void *_rt_key);
+static htri_t H5D__btree_found(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    const void *_lt_key, void *_udata);
+static H5B_ins_t H5D__btree_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    void *_lt_key, hbool_t *lt_key_changed, void *_md_key, void *_udata,
+    void *_rt_key, hbool_t *rt_key_changed, haddr_t *new_node/*out*/);
+static H5B_ins_t H5D__btree_remove( H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    void *_lt_key, hbool_t *lt_key_changed, void *_udata, void *_rt_key,
+    hbool_t *rt_key_changed);
+static herr_t H5D__btree_decode_key(const H5B_shared_t *shared, const uint8_t *raw,
+    void *_key);
+static herr_t H5D__btree_encode_key(const H5B_shared_t *shared, uint8_t *raw,
+    const void *_key);
+static herr_t H5D__btree_debug_key(FILE *stream, int indent, int fwidth,
+    const void *key, const void *udata);
+
+/* Chunked layout indexing callbacks */
+static herr_t H5D__btree_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+static herr_t H5D__btree_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__btree_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__btree_idx_insert(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static herr_t H5D__btree_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static int H5D__btree_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__btree_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__btree_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__btree_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__btree_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id);
+static herr_t H5D__btree_idx_size(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *size);
+static herr_t H5D__btree_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__btree_idx_dump(const H5O_storage_chunk_t *storage,
+    FILE *stream);
+static herr_t H5D__btree_idx_dest(const H5D_chk_idx_info_t *idx_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* v1 B-tree indexed chunk I/O ops */
+const H5D_chunk_ops_t H5D_COPS_BTREE[1] = {{
+    H5D__btree_idx_init,
+    H5D__btree_idx_create,
+    H5D__btree_idx_is_space_alloc,
+    H5D__btree_idx_insert,
+    H5D__btree_idx_get_addr,
+    NULL,
+    H5D__btree_idx_iterate,
+    H5D__btree_idx_remove,
+    H5D__btree_idx_delete,
+    H5D__btree_idx_copy_setup,
+    H5D__btree_idx_copy_shutdown,
+    H5D__btree_idx_size,
+    H5D__btree_idx_reset,
+    H5D__btree_idx_dump,
+    H5D__btree_idx_dest
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* inherits B-tree like properties from H5B */
+H5B_class_t H5B_BTREE[1] = {{
+    H5B_CHUNK_ID,		/*id			*/
+    sizeof(H5D_btree_key_t),	/*sizeof_nkey		*/
+    H5D__btree_get_shared,	/*get_shared		*/
+    H5D__btree_new_node,	/*new			*/
+    H5D__btree_cmp2,		/*cmp2			*/
+    H5D__btree_cmp3,		/*cmp3			*/
+    H5D__btree_found,		/*found			*/
+    H5D__btree_insert,		/*insert		*/
+    FALSE,			/*follow min branch?	*/
+    FALSE,			/*follow max branch?	*/
+    H5B_LEFT,                   /*critical key          */
+    H5D__btree_remove,		/*remove		*/
+    H5D__btree_decode_key,	/*decode		*/
+    H5D__btree_encode_key,	/*encode		*/
+    H5D__btree_debug_key	/*debug			*/
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_get_shared
+ *
+ * Purpose:	Returns the shared B-tree info for the specified UDATA.
+ *
+ * Return:	Success:	Pointer to the raw B-tree page for this dataset
+ *
+ *		Failure:	Can't fail
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, July  5, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static H5RC_t *
+H5D__btree_get_shared(const H5F_t H5_ATTR_UNUSED *f, const void *_udata)
+{
+    const H5D_chunk_common_ud_t *udata = (const H5D_chunk_common_ud_t *) _udata;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(udata);
+    HDassert(udata->storage);
+    HDassert(udata->storage->idx_type == H5D_CHUNK_BTREE);
+    HDassert(udata->storage->u.btree.shared);
+
+    /* Return the pointer to the ref-count object */
+    FUNC_LEAVE_NOAPI(udata->storage->u.btree.shared)
+} /* end H5D__btree_get_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_new_node
+ *
+ * Purpose:	Adds a new entry to an i-storage B-tree.  We can assume that
+ *		the domain represented by UDATA doesn't intersect the domain
+ *		already represented by the B-tree.
+ *
+ * Return:	Success:	Non-negative. The address of leaf is returned
+ *				through the ADDR argument.  It is also added
+ *				to the UDATA.
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, October 14, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
+		    void *_lt_key, void *_udata, void *_rt_key,
+		    haddr_t *addr_p/*out*/)
+{
+    H5D_btree_key_t	*lt_key = (H5D_btree_key_t *) _lt_key;
+    H5D_btree_key_t	*rt_key = (H5D_btree_key_t *) _rt_key;
+    H5D_chunk_ud_t	*udata = (H5D_chunk_ud_t *) _udata;
+    unsigned		u;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(f);
+    HDassert(lt_key);
+    HDassert(rt_key);
+    HDassert(udata);
+    HDassert(udata->common.layout->ndims > 0 && udata->common.layout->ndims < H5O_LAYOUT_NDIMS);
+    HDassert(addr_p);
+
+    /* Allocate new storage */
+    HDassert(udata->nbytes > 0);
+    H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
+    if(HADDR_UNDEF == (*addr_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
+        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "couldn't allocate new file storage")
+    udata->addr = *addr_p;
+
+    /*
+     * The left key describes the storage of the UDATA chunk being
+     * inserted into the tree.
+     */
+    lt_key->nbytes = udata->nbytes;
+    lt_key->filter_mask = udata->filter_mask;
+    for(u = 0; u < udata->common.layout->ndims; u++)
+        lt_key->offset[u] = udata->common.offset[u];
+
+    /*
+     * The right key might already be present.  If not, then add a zero-width
+     * chunk.
+     */
+    if(H5B_INS_LEFT != op) {
+        rt_key->nbytes = 0;
+        rt_key->filter_mask = 0;
+        for(u = 0; u < udata->common.layout->ndims; u++) {
+            HDassert(udata->common.offset[u] + udata->common.layout->dim[u] >
+                udata->common.offset[u]);
+            rt_key->offset[u] = udata->common.offset[u] + udata->common.layout->dim[u];
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_new_node() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_cmp2
+ *
+ * Purpose:	Compares two keys sort of like strcmp().  The UDATA pointer
+ *		is only to supply extra information not carried in the keys
+ *		(in this case, the dimensionality) and is not compared
+ *		against the keys.
+ *
+ * Return:	Success:	-1 if LT_KEY is less than RT_KEY;
+ *				1 if LT_KEY is greater than RT_KEY;
+ *				0 if LT_KEY and RT_KEY are equal.
+ *
+ *		Failure:	FAIL (same as LT_KEY<RT_KEY)
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, November  6, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__btree_cmp2(void *_lt_key, void *_udata, void *_rt_key)
+{
+    H5D_btree_key_t	*lt_key = (H5D_btree_key_t *) _lt_key;
+    H5D_btree_key_t	*rt_key = (H5D_btree_key_t *) _rt_key;
+    H5D_chunk_common_ud_t	*udata = (H5D_chunk_common_ud_t *) _udata;
+    int		ret_value;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(lt_key);
+    HDassert(rt_key);
+    HDassert(udata);
+    HDassert(udata->layout->ndims > 0 && udata->layout->ndims <= H5O_LAYOUT_NDIMS);
+
+    /* Compare the offsets but ignore the other fields */
+    ret_value = H5VM_vector_cmp_u(udata->layout->ndims, lt_key->offset, rt_key->offset);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_cmp2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_cmp3
+ *
+ * Purpose:	Compare the requested datum UDATA with the left and right
+ *		keys of the B-tree.
+ *
+ * Return:	Success:	negative if the min_corner of UDATA is less
+ *				than the min_corner of LT_KEY.
+ *
+ *				positive if the min_corner of UDATA is
+ *				greater than or equal the min_corner of
+ *				RT_KEY.
+ *
+ *				zero otherwise.	 The min_corner of UDATA is
+ *				not necessarily contained within the address
+ *				space represented by LT_KEY, but a key that
+ *				would describe the UDATA min_corner address
+ *				would fall lexicographically between LT_KEY
+ *				and RT_KEY.
+ *
+ *		Failure:	FAIL (same as UDATA < LT_KEY)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, October  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__btree_cmp3(void *_lt_key, void *_udata, void *_rt_key)
+{
+    H5D_btree_key_t	*lt_key = (H5D_btree_key_t *) _lt_key;
+    H5D_btree_key_t	*rt_key = (H5D_btree_key_t *) _rt_key;
+    H5D_chunk_common_ud_t	*udata = (H5D_chunk_common_ud_t *) _udata;
+    int		ret_value = 0;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(lt_key);
+    HDassert(rt_key);
+    HDassert(udata);
+    HDassert(udata->layout->ndims > 0 && udata->layout->ndims <= H5O_LAYOUT_NDIMS);
+
+    /* Special case for faster checks on 1-D chunks */
+    /* (Checking for ndims==2 because last dimension is the datatype size) */
+    /* The additional checking for the right key is necessary due to the */
+    /* slightly odd way the library initializes the right-most node in the */
+    /* indexed storage B-tree... */
+    /* (Dump the B-tree with h5debug to look at it) -QAK */
+    if(udata->layout->ndims == 2) {
+        if(udata->offset[0] > rt_key->offset[0])
+            ret_value = 1;
+        else if(udata->offset[0] == rt_key->offset[0] &&
+                udata->offset[1] >= rt_key->offset[1])
+            ret_value = 1;
+        else if(udata->offset[0] < lt_key->offset[0])
+            ret_value = (-1);
+    } /* end if */
+    else {
+        if(H5VM_vector_ge_u(udata->layout->ndims, udata->offset, rt_key->offset))
+            ret_value = 1;
+        else if(H5VM_vector_lt_u(udata->layout->ndims, udata->offset, lt_key->offset))
+            ret_value = (-1);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_cmp3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_found
+ *
+ * Purpose:	This function is called when the B-tree search engine has
+ *		found the leaf entry that points to a chunk of storage that
+ *		contains the beginning of the logical address space
+ *		represented by UDATA.  The LT_KEY is the left key (the one
+ *		that describes the chunk) and RT_KEY is the right key (the
+ *		one that describes the next or last chunk).
+ *
+ * Note:	It's possible that the chunk isn't really found.  For
+ *		instance, in a sparse dataset the requested chunk might fall
+ *		between two stored chunks in which case this function is
+ *		called with the maximum stored chunk indices less than the
+ *		requested chunk indices.
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success with information about the
+ *              chunk returned through the UDATA argument. Negative on failure.
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, October  9, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static htri_t
+H5D__btree_found(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, const void *_lt_key,
+		 void *_udata)
+{
+    H5D_chunk_ud_t	   *udata = (H5D_chunk_ud_t *) _udata;
+    const H5D_btree_key_t *lt_key = (const H5D_btree_key_t *) _lt_key;
+    unsigned		u;
+    htri_t      ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+    HDassert(lt_key);
+
+    /* Is this *really* the requested chunk? */
+    for(u = 0; u < udata->common.layout->ndims; u++)
+        if(udata->common.offset[u] >= lt_key->offset[u] + udata->common.layout->dim[u])
+            HGOTO_DONE(FALSE)
+
+    /* Initialize return values */
+    HDassert(lt_key->nbytes > 0);
+    udata->addr = addr;
+    udata->nbytes = lt_key->nbytes;
+    udata->filter_mask = lt_key->filter_mask;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_insert
+ *
+ * Purpose:	This function is called when the B-tree insert engine finds
+ *		the node to use to insert new data.  The UDATA argument
+ *		points to a struct that describes the logical addresses being
+ *		added to the file.  This function allocates space for the
+ *		data and returns information through UDATA describing a
+ *		file chunk to receive (part of) the data.
+ *
+ *		The LT_KEY is always the key describing the chunk of file
+ *		memory at address ADDR. On entry, UDATA describes the logical
+ *		addresses for which storage is being requested (through the
+ *		`offset' and `size' fields). On return, UDATA describes the
+ *		logical addresses contained in a chunk on disk.
+ *
+ * Return:	Success:	An insertion command for the caller, one of
+ *				the H5B_INS_* constants.  The address of the
+ *				new chunk is returned through the NEW_NODE
+ *				argument.
+ *
+ *		Failure:	H5B_INS_ERROR
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, October  9, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static H5B_ins_t
+H5D__btree_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
+		  hbool_t *lt_key_changed,
+		  void *_md_key, void *_udata, void *_rt_key,
+		  hbool_t H5_ATTR_UNUSED *rt_key_changed,
+		  haddr_t *new_node_p/*out*/)
+{
+    H5D_btree_key_t	*lt_key = (H5D_btree_key_t *) _lt_key;
+    H5D_btree_key_t	*md_key = (H5D_btree_key_t *) _md_key;
+    H5D_btree_key_t	*rt_key = (H5D_btree_key_t *) _rt_key;
+    H5D_chunk_ud_t	*udata = (H5D_chunk_ud_t *) _udata;
+    int		cmp;
+    unsigned		u;
+    H5B_ins_t		ret_value;
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(lt_key);
+    HDassert(lt_key_changed);
+    HDassert(md_key);
+    HDassert(udata);
+    HDassert(rt_key);
+    HDassert(new_node_p);
+
+    cmp = H5D__btree_cmp3(lt_key, udata, rt_key);
+    HDassert(cmp <= 0);
+
+    if(cmp < 0) {
+        /* Negative indices not supported yet */
+        HGOTO_ERROR(H5E_STORAGE, H5E_UNSUPPORTED, H5B_INS_ERROR, "internal error")
+
+    } else if(H5VM_vector_eq_u(udata->common.layout->ndims,
+				udata->common.offset, lt_key->offset) &&
+	       lt_key->nbytes > 0) {
+        /*
+         * Already exists.  If the new size is not the same as the old size
+         * then we should reallocate storage.
+         */
+        if(lt_key->nbytes != udata->nbytes) {
+/* Currently, the old chunk data is "thrown away" after the space is reallocated,
+ * so avoid data copy in H5MF_realloc() call by just free'ing the space and
+ * allocating new space.
+ *
+ * This should keep the file smaller also, by freeing the space and then
+ * allocating new space, instead of vice versa (in H5MF_realloc).
+ *
+ * QAK - 11/19/2002
+ */
+#ifdef OLD_WAY
+            if(HADDR_UNDEF == (*new_node_p = H5MF_realloc(f, H5FD_MEM_DRAW, addr,
+                      (hsize_t)lt_key->nbytes, (hsize_t)udata->nbytes)))
+                HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "unable to reallocate chunk storage")
+#else /* OLD_WAY */
+            H5_CHECK_OVERFLOW(lt_key->nbytes, uint32_t, hsize_t);
+            if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes) < 0)
+                HGOTO_ERROR(H5E_STORAGE, H5E_CANTFREE, H5B_INS_ERROR, "unable to free chunk")
+            H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
+            if(HADDR_UNDEF == (*new_node_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
+                HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "unable to reallocate chunk")
+#endif /* OLD_WAY */
+            lt_key->nbytes = udata->nbytes;
+            lt_key->filter_mask = udata->filter_mask;
+            *lt_key_changed = TRUE;
+            udata->addr = *new_node_p;
+            ret_value = H5B_INS_CHANGE;
+        } else {
+            udata->addr = addr;
+            ret_value = H5B_INS_NOOP;
+        }
+
+    } else if (H5VM_hyper_disjointp(udata->common.layout->ndims,
+				   lt_key->offset, udata->common.layout->dim,
+				   udata->common.offset, udata->common.layout->dim)) {
+        HDassert(H5VM_hyper_disjointp(udata->common.layout->ndims,
+				   rt_key->offset, udata->common.layout->dim,
+				   udata->common.offset, udata->common.layout->dim));
+        /*
+         * Split this node, inserting the new new node to the right of the
+         * current node.  The MD_KEY is where the split occurs.
+         */
+        md_key->nbytes = udata->nbytes;
+        md_key->filter_mask = udata->filter_mask;
+        for(u = 0; u < udata->common.layout->ndims; u++) {
+            HDassert(0 == udata->common.offset[u] % udata->common.layout->dim[u]);
+            md_key->offset[u] = udata->common.offset[u];
+        } /* end for */
+
+        /*
+         * Allocate storage for the new chunk
+         */
+        H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
+        if(HADDR_UNDEF == (*new_node_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
+            HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "file allocation failed")
+        udata->addr = *new_node_p;
+        ret_value = H5B_INS_RIGHT;
+
+    } else {
+        HGOTO_ERROR(H5E_IO, H5E_UNSUPPORTED, H5B_INS_ERROR, "internal error")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_remove
+ *
+ * Purpose:	Removes chunks that are no longer necessary in the B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer: Robb Matzke
+ *             Pedro Vicente, pvn at ncsa.uiuc.edu
+ * 		March 28, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static H5B_ins_t
+H5D__btree_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ ,
+	hbool_t *lt_key_changed /*out */ ,
+	void H5_ATTR_UNUSED * _udata /*in,out */ ,
+	void H5_ATTR_UNUSED * _rt_key /*in,out */ ,
+	hbool_t *rt_key_changed /*out */ )
+{
+    H5D_btree_key_t    *lt_key = (H5D_btree_key_t *)_lt_key;
+    H5B_ins_t ret_value=H5B_INS_REMOVE; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Remove raw data chunk from file */
+    H5_CHECK_OVERFLOW(lt_key->nbytes, uint32_t, hsize_t);
+    if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes) < 0)
+        HGOTO_ERROR(H5E_STORAGE, H5E_CANTFREE, H5B_INS_ERROR, "unable to free chunk")
+
+    /* Mark keys as unchanged */
+    *lt_key_changed = FALSE;
+    *rt_key_changed = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_decode_key
+ *
+ * Purpose:	Decodes a raw key into a native key for the B-tree
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, October 10, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key)
+{
+    H5D_btree_key_t	*key = (H5D_btree_key_t *) _key;
+    size_t		ndims;
+    unsigned		u;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check args */
+    HDassert(shared);
+    HDassert(raw);
+    HDassert(key);
+    ndims = H5D_BTREE_NDIMS(shared);
+    HDassert(ndims <= H5O_LAYOUT_NDIMS);
+
+    /* decode */
+    UINT32DECODE(raw, key->nbytes);
+    UINT32DECODE(raw, key->filter_mask);
+    for(u = 0; u < ndims; u++)
+	UINT64DECODE(raw, key->offset[u]);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__btree_decode_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_encode_key
+ *
+ * Purpose:	Encode a key from native format to raw format.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, October 10, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key)
+{
+    const H5D_btree_key_t *key = (const H5D_btree_key_t *)_key;
+    size_t		ndims;
+    unsigned		u;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check args */
+    HDassert(shared);
+    HDassert(raw);
+    HDassert(key);
+    ndims = H5D_BTREE_NDIMS(shared);
+    HDassert(ndims <= H5O_LAYOUT_NDIMS);
+
+    /* encode */
+    UINT32ENCODE(raw, key->nbytes);
+    UINT32ENCODE(raw, key->filter_mask);
+    for(u = 0; u < ndims; u++)
+	UINT64ENCODE(raw, key->offset[u]);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__btree_encode_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_debug_key
+ *
+ * Purpose:	Prints a key.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5D__btree_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
+    const void *_udata)
+{
+    const H5D_btree_key_t	*key = (const H5D_btree_key_t *)_key;
+    const H5D_btree_dbg_t	*udata = (const H5D_btree_dbg_t *)_udata;
+    unsigned		u;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(key);
+
+    HDfprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth, "Chunk size:", (unsigned)key->nbytes);
+    HDfprintf(stream, "%*s%-*s 0x%08x\n", indent, "", fwidth, "Filter mask:", key->filter_mask);
+    HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Logical offset:");
+    for(u = 0; u < udata->ndims; u++)
+        HDfprintf(stream, "%s%Hd", u?", ":"", key->offset[u]);
+    HDfputs("}\n", stream);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__btree_debug_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_shared_create
+ *
+ * Purpose:	Create & initialize B-tree shared info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 27, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store, unsigned ndims)
+{
+    H5B_shared_t *shared;               /* Shared B-tree node info */
+    size_t	sizeof_rkey;	        /* Size of raw (disk) key	     */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Set the raw key size */
+    sizeof_rkey = 4 +			/*storage size		*/
+                4 +			/*filter mask		*/
+                ndims * 8;		/*dimension indices	*/
+
+    /* Allocate & initialize global info for the shared structure */
+    if(NULL == (shared = H5B_shared_new(f, H5B_BTREE, sizeof_rkey)))
+	HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed for shared B-tree info")
+
+    /* Set up the "local" information for this dataset's chunks */
+        /* <none> */
+
+    /* Make shared B-tree info reference counted */
+    if(NULL == (store->u.btree.shared = H5RC_create(shared, H5B_shared_free)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for shared B-tree info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_shared_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_init
+ *
+ * Purpose:	Initialize the indexing information for a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, May 18, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_init(const H5D_chk_idx_info_t *idx_info, const H5S_t H5_ATTR_UNUSED *space,
+    haddr_t dset_ohdr_addr)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(dset_ohdr_addr));
+
+    idx_info->storage->u.btree.dset_ohdr_addr = dset_ohdr_addr;
+
+    /* Allocate the shared structure */
+    if(H5D__btree_shared_create(idx_info->f, idx_info->storage, idx_info->layout->ndims) < 0)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_create
+ *
+ * Purpose:	Creates a new indexed-storage B-tree and initializes the
+ *		layout struct with information about the storage.  The
+ *		struct should be immediately written to the object header.
+ *
+ *		This function must be called before passing LAYOUT to any of
+ *		the other indexed storage functions!
+ *
+ * Return:	Non-negative on success (with the LAYOUT argument initialized
+ *		and ready to write to an object header). Negative on failure.
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, October 21, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    H5D_chunk_common_ud_t udata;        /* User data for B-tree callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+
+    /* Initialize "user" data for B-tree callbacks, etc. */
+    udata.layout = idx_info->layout;
+    udata.storage = idx_info->storage;
+
+    /* Create the v1 B-tree for the chunk index */
+    if(H5B_create(idx_info->f, idx_info->dxpl_id, H5B_BTREE, &udata, &(idx_info->storage->idx_addr)/*out*/) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create B-tree")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for index method
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__btree_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    hbool_t ret_value;          /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    /* Set return value */
+    ret_value = (hbool_t)H5F_addr_defined(storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_insert
+ *
+ * Purpose:	Create the chunk it if it doesn't exist, or reallocate the
+ *              chunk if its size changed.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /*
+     * Create the chunk it if it doesn't exist, or reallocate the chunk if
+     * its size changed.
+     */
+    if(H5B_insert(idx_info->f, idx_info->dxpl_id, H5B_BTREE, idx_info->storage->idx_addr, udata) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to allocate chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__btree_idx_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk if file space has been
+ *		assigned.  Save the retrieved information in the udata
+ *		supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Albert Cheng
+ *              June 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->layout->ndims > 0);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Go get the chunk information from the B-tree */
+    if(H5B_find(idx_info->f, idx_info->dxpl_id, H5B_BTREE, idx_info->storage->idx_addr, udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__btree_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_iterate_cb
+ *
+ * Purpose:	Translate the B-tree specific chunk record into a generic
+ *              form and make the callback to the generic chunk callback
+ *              routine.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static int
+H5D__btree_idx_iterate_cb(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    const void *_lt_key, haddr_t addr, const void H5_ATTR_UNUSED *_rt_key,
+    void *_udata)
+{
+    H5D_btree_it_ud_t	*udata = (H5D_btree_it_ud_t *)_udata; /* User data */
+    const H5D_btree_key_t	*lt_key = (const H5D_btree_key_t *)_lt_key; /* B-tree key for chunk */
+    H5D_chunk_rec_t chunk_rec;  /* Generic chunk record for callback */
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check for memcpy() */
+    HDcompile_assert(offsetof(H5D_chunk_rec_t, nbytes) == offsetof(H5D_btree_key_t, nbytes));
+    HDcompile_assert(sizeof(chunk_rec.nbytes) == sizeof(lt_key->nbytes));
+    HDcompile_assert(offsetof(H5D_chunk_rec_t, offset) == offsetof(H5D_btree_key_t, offset));
+    HDcompile_assert(sizeof(chunk_rec.offset) == sizeof(lt_key->offset));
+    HDcompile_assert(offsetof(H5D_chunk_rec_t, filter_mask) == offsetof(H5D_btree_key_t, filter_mask));
+    HDcompile_assert(sizeof(chunk_rec.filter_mask) == sizeof(lt_key->filter_mask));
+
+    /* Compose generic chunk record for callback */
+    HDmemcpy(&chunk_rec, lt_key, sizeof(*lt_key));
+    chunk_rec.chunk_addr = addr;
+
+    /* Make "generic chunk" callback */
+    if((ret_value = (udata->cb)(&chunk_rec, udata->udata)) < 0)
+        HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__btree_idx_iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_iterate
+ *
+ * Purpose:	Iterate over the chunks in an index, making a callback
+ *              for each one.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__btree_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5D_btree_it_ud_t	udata;  /* User data for B-tree iterator callback */
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+
+    /* Initialize userdata */
+    HDmemset(&udata, 0, sizeof udata);
+    udata.common.layout = idx_info->layout;
+    udata.common.storage = idx_info->storage;
+    udata.cb = chunk_cb;
+    udata.udata = chunk_udata;
+
+    /* Iterate over existing chunks */
+    if((ret_value = H5B_iterate(idx_info->f, idx_info->dxpl_id, H5B_BTREE, idx_info->storage->idx_addr, H5D__btree_idx_iterate_cb, &udata)) < 0)
+        HERROR(H5E_DATASET, H5E_BADITER, "unable to iterate over chunk B-tree");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_remove
+ *
+ * Purpose:	Remove chunk from index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t *udata)
+{
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Remove the chunk from the v1 B-tree index and release the space for the
+     * chunk (in the B-tree callback).
+     */
+    if(H5B_remove(idx_info->f, idx_info->dxpl_id, H5B_BTREE, idx_info->storage->idx_addr, udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to remove chunk entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__btree_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_delete
+ *
+ * Purpose:	Delete index and raw data storage for entire dataset
+ *              (i.e. all chunks)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    /* Check if the index data structure has been allocated */
+    if(H5F_addr_defined(idx_info->storage->idx_addr)) {
+        H5O_storage_chunk_t tmp_storage;  /* Local copy of storage info */
+        H5D_chunk_common_ud_t udata;            /* User data for B-tree operations */
+
+        /* Set up temporary chunked storage info */
+        tmp_storage = *idx_info->storage;
+
+        /* Set up the shared structure */
+        if(H5D__btree_shared_create(idx_info->f, &tmp_storage, idx_info->layout->ndims) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
+
+        /* Set up B-tree user data */
+        HDmemset(&udata, 0, sizeof udata);
+        udata.layout = idx_info->layout;
+        udata.storage = &tmp_storage;
+
+        /* Delete entire B-tree */
+        if(H5B_delete(idx_info->f, idx_info->dxpl_id, H5B_BTREE, tmp_storage.idx_addr, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to delete chunk B-tree")
+
+        /* Release the shared B-tree page */
+        if(NULL == tmp_storage.u.btree.shared)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "ref-counted page nil")
+        if(H5RC_DEC(tmp_storage.u.btree.shared) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 29, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+    HDassert(!H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Create shared B-tree info for each file */
+    if(H5D__btree_shared_create(idx_info_src->f, idx_info_src->storage, idx_info_src->layout->ndims) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for source shared B-tree info")
+    if(H5D__btree_shared_create(idx_info_dst->f, idx_info_dst->storage, idx_info_dst->layout->ndims) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for destination shared B-tree info")
+
+    /* Create the root of the B-tree that describes chunked storage in the dest. file */
+    if(H5D__btree_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+    HDassert(H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_copy_shutdown
+ *
+ * Purpose:	Shutdown any information from copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 29, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst,
+    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(storage_src);
+    HDassert(storage_dst);
+
+    /* Decrement refcount on shared B-tree info */
+    if(H5RC_DEC(storage_src->u.btree.shared) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement ref-counted page")
+    if(H5RC_DEC(storage_dst->u.btree.shared) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement ref-counted page")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_copy_shutdown() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__btree_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *              June 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
+{
+    H5D_chunk_common_ud_t udata;              /* User-data for loading B-tree nodes */
+    H5B_info_t bt_info;                 /* B-tree info */
+    hbool_t shared_init = FALSE;        /* Whether shared B-tree info is initialized */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(index_size);
+
+    /* Initialize the shared info for the B-tree traversal */
+    if(H5D__btree_shared_create(idx_info->f, idx_info->storage, idx_info->layout->ndims) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
+    shared_init = TRUE;
+
+    /* Initialize B-tree node user-data */
+    HDmemset(&udata, 0, sizeof udata);
+    udata.layout = idx_info->layout;
+    udata.storage = idx_info->storage;
+
+    /* Get metadata information for B-tree */
+    if(H5B_get_info(idx_info->f, idx_info->dxpl_id, H5B_BTREE, idx_info->storage->idx_addr, &bt_info, NULL, &udata) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to iterate over chunk B-tree")
+
+    /* Set the size of the B-tree */
+    *index_size = bt_info.size;
+
+done:
+    if(shared_init) {
+        if(NULL == idx_info->storage->u.btree.shared)
+            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
+        if(H5RC_DEC(idx_info->storage->u.btree.shared) < 0)
+            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr)
+	storage->idx_addr = HADDR_UNDEF;
+    storage->u.btree.shared = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__btree_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_dump
+ *
+ * Purpose:	Dump indexing information to a stream.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__btree_idx_dump() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree_idx_dest
+ *
+ * Purpose:	Release indexing information in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_idx_dest(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    /* Free the raw B-tree node buffer */
+    if(NULL == idx_info->storage->u.btree.shared)
+        HGOTO_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
+    if(H5RC_DEC(idx_info->storage->u.btree.shared) < 0)
+	HGOTO_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_idx_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_btree_debug
+ *
+ * Purpose:	Debugs a B-tree node for indexed raw data storage.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_btree_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
+		 int fwidth, unsigned ndims)
+{
+    H5D_btree_dbg_t     udata;          /* User data for B-tree callback */
+    H5O_storage_chunk_t storage;        /* Storage information for B-tree callback */
+    hbool_t     shared_init = FALSE;    /* Whether B-tree shared info is initialized */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Reset "fake" storage info */
+    HDmemset(&storage, 0, sizeof(storage));
+    storage.idx_type = H5D_CHUNK_BTREE;
+
+    /* Allocate the shared structure */
+    if(H5D__btree_shared_create(f, &storage, ndims) < 0)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
+    shared_init = TRUE;
+
+    /* Set up user data for callback */
+    udata.common.layout = NULL;
+    udata.common.storage = &storage;
+    udata.common.offset = NULL;
+    udata.ndims = ndims;
+
+    /* Dump the records for the B-tree */
+    (void)H5B_debug(f, dxpl_id, addr, stream, indent, fwidth, H5B_BTREE, &udata);
+
+done:
+    if(shared_init) {
+        /* Free the raw B-tree node buffer */
+        if(NULL == storage.u.btree.shared)
+            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
+        else
+            if(H5RC_DEC(storage.u.btree.shared) < 0)
+                HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_btree_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dchunk.c b/gatb-core/thirdparty/hdf5/src/H5Dchunk.c
new file mode 100644
index 0000000..3bac996
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dchunk.c
@@ -0,0 +1,5354 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Quincey Koziol <koziol at hdfgroup.org>
+ *	       	Thursday, April 24, 2008
+ *
+ * Purpose:	Abstract indexed (chunked) I/O functions.  The logical
+ *		multi-dimensional data space is regularly partitioned into
+ *		same-sized "chunks", the first of which is aligned with the
+ *		logical origin.  The chunks are indexed by different methods,
+ *		that map a chunk index to disk address.  Each chunk can be
+ *              compressed independently and the chunks may move around in the
+ *              file as their storage requirements change.
+ *
+ * Cache:	Disk I/O is performed in units of chunks and H5MF_alloc()
+ *		contains code to optionally align chunks on disk block
+ *		boundaries for performance.
+ *
+ *		The chunk cache is an extendible hash indexed by a function
+ *		of storage B-tree address and chunk N-dimensional offset
+ *		within the dataset.  Collisions are not resolved -- one of
+ *		the two chunks competing for the hash slot must be preempted
+ *		from the cache.  All entries in the hash also participate in
+ *		a doubly-linked list and entries are penalized by moving them
+ *		toward the front of the list.  When a new chunk is about to
+ *		be added to the cache the heap is pruned by preempting
+ *		entries near the front of the list to make room for the new
+ *		entry which is added to the end of the list.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#ifdef H5_HAVE_PARALLEL
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#endif /* H5_HAVE_PARALLEL */
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Macros for iterating over chunks to operate on */
+#define H5D_CHUNK_GET_FIRST_NODE(map) (map->use_single ? (H5SL_node_t *)(1) : H5SL_first(map->sel_chunks))
+#define H5D_CHUNK_GET_NODE_INFO(map, node)  (map->use_single ? map->single_chunk_info : (H5D_chunk_info_t *)H5SL_item(node))
+#define H5D_CHUNK_GET_NEXT_NODE(map, node)  (map->use_single ? (H5SL_node_t *)NULL : H5SL_next(node))
+
+/*
+ * Feature: If this constant is defined then every cache preemption and load
+ *	    causes a character to be printed on the standard error stream:
+ *
+ *     `.': Entry was preempted because it has been completely read or
+ *	    completely written but not partially read and not partially
+ *	    written. This is often a good reason for preemption because such
+ *	    a chunk will be unlikely to be referenced in the near future.
+ *
+ *     `:': Entry was preempted because it hasn't been used recently.
+ *
+ *     `#': Entry was preempted because another chunk collided with it. This
+ *	    is usually a relatively bad thing.  If there are too many of
+ *	    these then the number of entries in the cache can be increased.
+ *
+ *       c: Entry was preempted because the file is closing.
+ *
+ *	 w: A chunk read operation was eliminated because the library is
+ *	    about to write new values to the entire chunk.  This is a good
+ *	    thing, especially on files where the chunk size is the same as
+ *	    the disk block size, chunks are aligned on disk block boundaries,
+ *	    and the operating system can also eliminate a read operation.
+ */
+
+/*#define H5D_CHUNK_DEBUG */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Callback info for iteration to prune chunks */
+typedef struct H5D_chunk_it_ud1_t {
+    H5D_chunk_common_ud_t common;       /* Common info for B-tree user data (must be first) */
+    const H5D_chk_idx_info_t *idx_info; /* Chunked index info */
+    const H5D_io_info_t *io_info;       /* I/O info for dataset operation */
+    const hsize_t	*space_dim;	/* New dataset dimensions	*/
+    const hbool_t       *shrunk_dim;    /* Dimensions which have been shrunk */
+    H5S_t               *chunk_space;   /* Dataspace for a chunk */
+    uint32_t            elmts_per_chunk;/* Elements in chunk */
+    hsize_t             *hyper_start;   /* Starting location of hyperslab */
+    H5D_fill_buf_info_t fb_info;        /* Dataset's fill buffer info */
+    hbool_t             fb_info_init;   /* Whether the fill value buffer has been initialized */
+} H5D_chunk_it_ud1_t;
+
+/* Callback info for iteration to obtain chunk address and the index of the chunk for all chunks in the B-tree. */
+typedef struct H5D_chunk_it_ud2_t {
+    /* down */
+    H5D_chunk_common_ud_t common;               /* Common info for B-tree user data (must be first) */
+
+    /* up */
+    haddr_t             *chunk_addr;            /* Array of chunk addresses to fill in */
+} H5D_chunk_it_ud2_t;
+
+/* Callback info for iteration to copy data */
+typedef struct H5D_chunk_it_ud3_t {
+    H5D_chunk_common_ud_t common;           /* Common info for B-tree user data (must be first) */
+    H5F_t               *file_src;              /* Source file for copy */
+    H5D_chk_idx_info_t  *idx_info_dst;          /* Dest. chunk index info object */
+    void                *buf;                   /* Buffer to hold chunk data for read/write */
+    void                *bkg;                   /* Buffer for background information during type conversion */
+    size_t              buf_size;               /* Buffer size */
+    hbool_t             do_convert;             /* Whether to perform type conversions */
+
+    /* needed for converting variable-length data */
+    hid_t               tid_src;                /* Datatype ID for source datatype */
+    hid_t               tid_dst;                /* Datatype ID for destination datatype */
+    hid_t               tid_mem;                /* Datatype ID for memory datatype */
+    const H5T_t         *dt_src;                /* Source datatype */
+    H5T_path_t          *tpath_src_mem;         /* Datatype conversion path from source file to memory */
+    H5T_path_t          *tpath_mem_dst;         /* Datatype conversion path from memory to dest. file */
+    void                *reclaim_buf;           /* Buffer for reclaiming data */
+    size_t              reclaim_buf_size;       /* Reclaim buffer size */
+    uint32_t            nelmts;                 /* Number of elements in buffer */
+    H5S_t               *buf_space;             /* Dataspace describing buffer */
+
+    /* needed for compressed variable-length data */
+    const H5O_pline_t   *pline;                 /* Filter pipeline */
+
+    /* needed for copy object pointed by refs */
+    H5O_copy_t          *cpy_info;              /* Copy options */
+} H5D_chunk_it_ud3_t;
+
+/* Callback info for iteration to dump index */
+typedef struct H5D_chunk_it_ud4_t {
+    FILE		*stream;		/* Output stream	*/
+    hbool_t             header_displayed;       /* Node's header is displayed? */
+    unsigned            ndims;                  /* Number of dimensions for chunk/dataset */
+} H5D_chunk_it_ud4_t;
+
+/* Callback info for nonexistent readvv operation */
+typedef struct H5D_chunk_readvv_ud_t {
+    unsigned char *rbuf;        /* Read buffer to initialize */
+    const H5D_t *dset;          /* Dataset to operate on */
+    hid_t dxpl_id;              /* DXPL for operation */
+} H5D_chunk_readvv_ud_t;
+
+/* Callback info for file selection iteration */
+typedef struct H5D_chunk_file_iter_ud_t {
+    H5D_chunk_map_t *fm;                /* File->memory chunk mapping info */
+#ifdef H5_HAVE_PARALLEL
+    const H5D_io_info_t *io_info;       /* I/O info for operation */
+#endif /* H5_HAVE_PARALLEL */
+} H5D_chunk_file_iter_ud_t;
+
+#ifdef H5_HAVE_PARALLEL
+/* information to construct a collective I/O operation for filling chunks */
+typedef struct H5D_chunk_coll_info_t {
+    size_t num_io;       /* Number of write operations */
+    haddr_t *addr;       /* array of the file addresses of the write operation */
+} H5D_chunk_coll_info_t;
+#endif /* H5_HAVE_PARALLEL */
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Chunked layout operation callbacks */
+static herr_t H5D__chunk_construct(H5F_t *f, H5D_t *dset);
+static herr_t H5D__chunk_io_init(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+static herr_t H5D__chunk_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm);
+static herr_t H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm);
+static herr_t H5D__chunk_flush(H5D_t *dset, hid_t dxpl_id);
+static herr_t H5D__chunk_io_term(const H5D_chunk_map_t *fm);
+static herr_t H5D__chunk_cinfo_cache_reset(H5D_chunk_cached_t *last);
+
+/* "Nonexistent" layout operation callback */
+static ssize_t
+H5D__nonexistent_readvv(const H5D_io_info_t *io_info,
+    size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+
+/* Helper routines */
+static herr_t H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims,
+    const hsize_t *curr_dims);
+static void *H5D__chunk_alloc(size_t size, const H5O_pline_t *pline);
+static void *H5D__chunk_xfree(void *chk, const H5O_pline_t *pline);
+static void *H5D__chunk_realloc(void *chk, size_t size,
+    const H5O_pline_t *pline);
+static herr_t H5D__chunk_cinfo_cache_update(H5D_chunk_cached_t *last,
+    const H5D_chunk_ud_t *udata);
+static hbool_t H5D__chunk_cinfo_cache_found(const H5D_chunk_cached_t *last,
+    H5D_chunk_ud_t *udata);
+static herr_t H5D__free_chunk_info(void *item, void *key, void *opdata);
+static herr_t H5D__create_chunk_map_single(H5D_chunk_map_t *fm,
+    const H5D_io_info_t *io_info);
+static herr_t H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm,
+    const H5D_io_info_t *io_info);
+static herr_t H5D__create_chunk_mem_map_hyper(const H5D_chunk_map_t *fm);
+static herr_t H5D__chunk_file_cb(void *elem, const H5T_t *type, unsigned ndims,
+    const hsize_t *coords, void *fm);
+static herr_t H5D__chunk_mem_cb(void *elem, const H5T_t *type, unsigned ndims,
+    const hsize_t *coords, void *fm);
+static herr_t H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id,
+    const H5D_dxpl_cache_t *dxpl_cache, H5D_rdcc_ent_t *ent, hbool_t reset);
+static herr_t H5D__chunk_cache_evict(const H5D_t *dset, hid_t dxpl_id,
+    const H5D_dxpl_cache_t *dxpl_cache, H5D_rdcc_ent_t *ent, hbool_t flush);
+static herr_t H5D__chunk_cache_prune(const H5D_t *dset, hid_t dxpl_id,
+    const H5D_dxpl_cache_t *dxpl_cache, size_t size);
+static herr_t H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata);
+#ifdef H5_HAVE_PARALLEL
+static herr_t H5D__chunk_collective_fill(const H5D_t *dset, hid_t dxpl_id,
+    H5D_chunk_coll_info_t *chunk_info, size_t chunk_size, const void *fill_buf);
+#endif /* H5_HAVE_PARALLEL */
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Chunked storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_CHUNK[1] = {{
+    H5D__chunk_construct,
+    H5D__chunk_init,
+    H5D__chunk_is_space_alloc,
+    H5D__chunk_io_init,
+    H5D__chunk_read,
+    H5D__chunk_write,
+#ifdef H5_HAVE_PARALLEL
+    H5D__chunk_collective_read,
+    H5D__chunk_collective_write,
+#endif /* H5_HAVE_PARALLEL */
+    NULL,
+    NULL,
+    H5D__chunk_flush,
+    H5D__chunk_io_term
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* "nonexistent" storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_NONEXISTENT[1] = {{
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+#ifdef H5_HAVE_PARALLEL
+    NULL,
+    NULL,
+#endif /* H5_HAVE_PARALLEL */
+    H5D__nonexistent_readvv,
+    NULL,
+    NULL,
+    NULL
+}};
+
+/* Declare a free list to manage the H5F_rdcc_ent_ptr_t sequence information */
+H5FL_SEQ_DEFINE_STATIC(H5D_rdcc_ent_ptr_t);
+
+/* Declare a free list to manage H5D_rdcc_ent_t objects */
+H5FL_DEFINE_STATIC(H5D_rdcc_ent_t);
+
+/* Declare a free list to manage the H5D_chunk_info_t struct */
+H5FL_DEFINE(H5D_chunk_info_t);
+
+/* Declare a free list to manage the chunk sequence information */
+H5FL_BLK_DEFINE_STATIC(chunk);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_direct_write
+ *
+ * Purpose:	Internal routine to write a chunk 
+ *              directly into the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              30 July 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, hsize_t *offset, 
+     uint32_t data_size, const void *buf)
+{
+    const H5O_layout_t *layout = &(dset->shared->layout);       /* Dataset layout */
+    H5D_chunk_ud_t udata;               /* User data for querying chunk info */
+    hsize_t chunk_idx;
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    const H5D_rdcc_t       *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
+    int         space_ndims;    /* Dataset's space rank */
+    hsize_t     space_dim[H5O_LAYOUT_NDIMS];    /* Dataset's dataspace dimensions */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Allocate data space and initialize it if it hasn't been. */
+    if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
+ 	/* Allocate storage */
+        if(H5D__alloc_storage(dset, dxpl_id, H5D_ALLOC_WRITE, FALSE, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
+
+    /* Retrieve the dataset dimensions */
+    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim, NULL)) < 0)
+         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple dataspace info")
+
+    /* Calculate the index of this chunk */
+    if(H5VM_chunk_index((unsigned)space_ndims, offset,
+	layout->u.chunk.dim, layout->u.chunk.down_chunks, &chunk_idx) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
+
+    /* Find out the file address of the chunk */
+    if(H5D__chunk_lookup(dset, dxpl_id, offset, chunk_idx, &udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+
+    udata.filter_mask = filters;
+
+    /* Check if the chunk needs to be 'inserted' (could exist already and
+     *      the 'insert' operation could resize it)
+     */
+    {
+	H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+
+	/* Compose chunked index info struct */
+	idx_info.f = dset->oloc.file;
+	idx_info.dxpl_id = dxpl_id;
+	idx_info.pline = &(dset->shared->dcpl_cache.pline);
+	idx_info.layout = &(dset->shared->layout.u.chunk);
+	idx_info.storage = &(dset->shared->layout.storage.u.chunk);
+
+	/* Set up the size of chunk for user data */
+	udata.nbytes = data_size;
+
+        /* Create the chunk it if it doesn't exist, or reallocate the chunk
+         *  if its size changed.
+         */
+	if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+
+	/* Make sure the address of the chunk is returned. */
+	if(!H5F_addr_defined(udata.addr))
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "chunk address isn't defined")
+    } /* end if */
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Evict the entry from the cache if present, but do not flush
+     * it to disk */
+    if(UINT_MAX != udata.idx_hint)
+        if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], FALSE) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
+
+    /* Write the data to the file */
+    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, data_size, dxpl_id, buf) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_direct_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_set_info_real
+ *
+ * Purpose:	Internal routine to set the information about chunks for a dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims, const hsize_t *curr_dims)
+{
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(layout);
+    HDassert(ndims > 0);
+    HDassert(curr_dims);
+
+    /* Compute the # of chunks in dataset dimensions */
+    for(u = 0, layout->nchunks = 1; u < ndims; u++) {
+        /* Round up to the next integer # of chunks, to accomodate partial chunks */
+	layout->chunks[u] = ((curr_dims[u] + layout->dim[u]) - 1) / layout->dim[u];
+
+        /* Accumulate the # of chunks */
+	layout->nchunks *= layout->chunks[u];
+    } /* end for */
+
+    /* Get the "down" sizes for each dimension */
+    if(H5VM_array_down(ndims, layout->chunks, layout->down_chunks) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't compute 'down' chunk size value")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_set_info_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_set_info
+ *
+ * Purpose:	Sets the information about chunks for a dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_set_info(const H5D_t *dset)
+{
+    hsize_t curr_dims[H5O_LAYOUT_NDIMS];    /* Curr. size of dataset dimensions */
+    int sndims;                 /* Rank of dataspace */
+    unsigned ndims;             /* Rank of dataspace */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(dset);
+
+    /* Get the dim info for dataset */
+    if((sndims = H5S_get_simple_extent_dims(dset->shared->space, curr_dims, NULL)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
+    H5_CHECKED_ASSIGN(ndims, unsigned, sndims, int);
+
+    /* Set the base layout information */
+    if(H5D__chunk_set_info_real(&dset->shared->layout.u.chunk, ndims, curr_dims) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout's chunk info")
+
+    /* Call the index's "resize" callback */
+    if(dset->shared->layout.storage.u.chunk.ops->resize && (dset->shared->layout.storage.u.chunk.ops->resize)(&dset->shared->layout.u.chunk) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to resize chunk index information")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_set_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_construct
+ *
+ * Purpose:	Constructs new chunked layout information for dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_construct(H5F_t H5_ATTR_UNUSED *f, H5D_t *dset)
+{
+    const H5T_t *type = dset->shared->type;      /* Convenience pointer to dataset's datatype */
+    hsize_t max_dims[H5O_LAYOUT_NDIMS];          /* Maximum size of data in elements */
+    hsize_t dims[H5O_LAYOUT_NDIMS];              /* Dimension size of data in elements */
+    uint64_t chunk_size;        /* Size of chunk in bytes */
+    int ndims;                  /* Rank of dataspace */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(dset);
+
+    /* Check for invalid chunk dimension rank */
+    if(0 == dset->shared->layout.u.chunk.ndims)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "no chunk information set?")
+
+    /* Set up layout information */
+    if((ndims = H5S_GET_EXTENT_NDIMS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get rank")
+    if(dset->shared->layout.u.chunk.ndims != (unsigned)ndims)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "dimensionality of chunks doesn't match the dataspace")
+
+    /* Increment # of chunk dimensions, to account for datatype size as last element */
+    dset->shared->layout.u.chunk.ndims++;
+    HDassert((unsigned)(dset->shared->layout.u.chunk.ndims) <= NELMTS(dset->shared->layout.u.chunk.dim));
+
+    /* Chunked storage is not compatible with external storage (currently) */
+    if(dset->shared->dcpl_cache.efl.nused > 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "external storage not supported with chunked layout")
+
+    /* Set the last dimension of the chunk size to the size of the datatype */
+    dset->shared->layout.u.chunk.dim[dset->shared->layout.u.chunk.ndims - 1] = (uint32_t)H5T_GET_SIZE(type);
+
+    /* Get local copy of dataset dimensions (for sanity checking) */
+    if(H5S_get_simple_extent_dims(dset->shared->space, dims, max_dims) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to query maximum dimensions")
+
+    /* Sanity check dimensions */
+    for(u = 0; u < dset->shared->layout.u.chunk.ndims - 1; u++) {
+        /* Don't allow zero-sized chunk dimensions */
+        if(0 == dset->shared->layout.u.chunk.dim[u])
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be > 0, dim = %u ", u)
+
+        /*
+         * The chunk size of a dimension with a fixed size cannot exceed
+         * the maximum dimension size. If any dimension size is zero, there
+         * will be no such restriction.
+         */
+        if(dims[u] && max_dims[u] != H5S_UNLIMITED && max_dims[u] < dset->shared->layout.u.chunk.dim[u])
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be <= maximum dimension size for fixed-sized dimensions")
+    } /* end for */
+
+    /* Compute the total size of a chunk */
+    /* (Use 64-bit value to ensure that we can detect >4GB chunks) */
+    for(u = 1, chunk_size = (uint64_t)dset->shared->layout.u.chunk.dim[0]; u < dset->shared->layout.u.chunk.ndims; u++)
+        chunk_size *= (uint64_t)dset->shared->layout.u.chunk.dim[u];
+
+    /* Check for chunk larger than can be represented in 32-bits */
+    /* (Chunk size is encoded in 32-bit value in v1 B-tree records) */
+    if(chunk_size > (uint64_t)0xffffffff)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be < 4GB")
+
+    /* Retain computed chunk size */
+    H5_CHECKED_ASSIGN(dset->shared->layout.u.chunk.size, uint32_t, chunk_size, uint64_t);
+
+    /* Reset address and pointer of the array struct for the chunked storage index */
+    if(H5D_chunk_idx_reset(&dset->shared->layout.storage.u.chunk, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to reset chunked storage index")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_construct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_init
+ *
+ * Purpose:	Initialize the raw data chunk cache for a dataset.  This is
+ *		called when the dataset is initialized.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, May 18, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, hid_t dapl_id)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);   /* Convenience pointer to dataset's chunk cache */
+    H5P_genplist_t *dapl;               /* Data access property list object pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(dset);
+
+    if(NULL == (dapl = (H5P_genplist_t *)H5I_object(dapl_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for fapl ID");
+
+    /* Use the properties in dapl_id if they have been set, otherwise use the properties from the file */
+    if(H5P_get(dapl, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, &rdcc->nslots) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache number of slots");
+    if(rdcc->nslots == H5D_CHUNK_CACHE_NSLOTS_DEFAULT)
+        rdcc->nslots = H5F_RDCC_NSLOTS(f);
+
+    if(H5P_get(dapl, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, &rdcc->nbytes_max) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache byte size");
+    if(rdcc->nbytes_max == H5D_CHUNK_CACHE_NBYTES_DEFAULT)
+        rdcc->nbytes_max = H5F_RDCC_NBYTES(f);
+
+    if(H5P_get(dapl, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, &rdcc->w0) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get preempt read chunks");
+    if(rdcc->w0 < 0)
+        rdcc->w0 = H5F_RDCC_W0(f);
+
+    /* If nbytes_max or nslots is 0, set them both to 0 and avoid allocating space */
+    if(!rdcc->nbytes_max || !rdcc->nslots)
+        rdcc->nbytes_max = rdcc->nslots = 0;
+    else {
+        rdcc->slot = H5FL_SEQ_CALLOC(H5D_rdcc_ent_ptr_t, rdcc->nslots);
+        if(NULL == rdcc->slot)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Reset any cached chunk info for this dataset */
+        H5D__chunk_cinfo_cache_reset(&(rdcc->last));
+    } /* end else */
+
+    /* Compose chunked index info struct */
+    idx_info.f = f;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Allocate any indexing structures */
+    if(dset->shared->layout.storage.u.chunk.ops->init && (dset->shared->layout.storage.u.chunk.ops->init)(&idx_info, dset->shared->space, dset->oloc.addr) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
+
+    /* Set the number of chunks in dataset, etc. */
+    if(H5D__chunk_set_info(dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set # of chunks for dataset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for layout
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5D__chunk_is_space_alloc(const H5O_storage_t *storage)
+{
+    hbool_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+
+    /* Query index layer */
+    ret_value = (storage->u.chunk.ops->is_space_alloc)(&storage->u.chunk);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_io_init
+ *
+ * Purpose:	Performs initialization before any sort of I/O on the raw data
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm)
+{
+    const H5D_t *dataset = io_info->dset;     /* Local pointer to dataset info */
+    const H5T_t *mem_type = type_info->mem_type;        /* Local pointer to memory datatype */
+    H5S_t *tmp_mspace = NULL;   /* Temporary memory dataspace */
+    hssize_t old_offset[H5O_LAYOUT_NDIMS];  /* Old selection offset */
+    htri_t file_space_normalized = FALSE;   /* File dataspace was normalized */
+    H5T_t *file_type = NULL;    /* Temporary copy of file datatype for iteration */
+    hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
+    unsigned f_ndims;           /* The number of dimensions of the file's dataspace */
+    int sm_ndims;               /* The number of dimensions of the memory buffer's dataspace (signed) */
+    H5SL_node_t *curr_node;     /* Current node in skip list */
+    H5S_sel_type fsel_type;     /* Selection type on disk */
+    char bogus;                 /* "bogus" buffer to pass to selection iterator */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED;	/* Return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Get layout for dataset */
+    fm->layout = &(dataset->shared->layout);
+    fm->nelmts = nelmts;
+
+    /* Check if the memory space is scalar & make equivalent memory space */
+    if((sm_ndims = H5S_GET_EXTENT_NDIMS(mem_space)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimension number")
+    /* Set the number of dimensions for the memory dataspace */
+    H5_CHECKED_ASSIGN(fm->m_ndims, unsigned, sm_ndims, int);
+
+    /* Get dim number and dimensionality for each dataspace */
+    fm->f_ndims = f_ndims = dataset->shared->layout.u.chunk.ndims - 1;
+    if(H5S_get_simple_extent_dims(file_space, fm->f_dims, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality")
+
+    /* Normalize hyperslab selections by adjusting them by the offset */
+    /* (It might be worthwhile to normalize both the file and memory dataspaces
+     * before any (contiguous, chunked, etc) file I/O operation, in order to
+     * speed up hyperslab calculations by removing the extra checks and/or
+     * additions involving the offset and the hyperslab selection -QAK)
+     */
+    if((file_space_normalized = H5S_hyper_normalize_offset((H5S_t *)file_space, old_offset)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to normalize dataspace by offset")
+
+    /* Decide the number of chunks in each dimension*/
+    for(u = 0; u < f_ndims; u++) {
+        /* Keep the size of the chunk dimensions as hsize_t for various routines */
+        fm->chunk_dim[u] = fm->layout->u.chunk.dim[u];
+    } /* end for */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Calculate total chunk in file map*/
+    fm->select_chunk = NULL;
+    if(io_info->using_mpi_vfd) {
+        H5_CHECK_OVERFLOW(fm->layout->u.chunk.nchunks, hsize_t, size_t);
+        if(fm->layout->u.chunk.nchunks) {
+            if(NULL == (fm->select_chunk = (H5D_chunk_info_t **)H5MM_calloc((size_t)fm->layout->u.chunk.nchunks * sizeof(H5D_chunk_info_t *))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate chunk info")
+        }
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+
+    /* Initialize "last chunk" information */
+    fm->last_index = (hsize_t)-1;
+    fm->last_chunk_info = NULL;
+
+    /* Point at the dataspaces */
+    fm->file_space = file_space;
+    fm->mem_space = mem_space;
+
+    /* Special case for only one element in selection */
+    /* (usually appending a record) */
+    if(nelmts == 1
+#ifdef H5_HAVE_PARALLEL
+            && !(io_info->using_mpi_vfd)
+#endif /* H5_HAVE_PARALLEL */
+            && H5S_SEL_ALL != H5S_GET_SELECT_TYPE(file_space)) {
+        /* Initialize skip list for chunk selections */
+        fm->sel_chunks = NULL;
+        fm->use_single = TRUE;
+
+        /* Initialize single chunk dataspace */
+        if(NULL == dataset->shared->cache.chunk.single_space) {
+            /* Make a copy of the dataspace for the dataset */
+            if((dataset->shared->cache.chunk.single_space = H5S_copy(file_space, TRUE, FALSE)) == NULL)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy file space")
+
+            /* Resize chunk's dataspace dimensions to size of chunk */
+            if(H5S_set_extent_real(dataset->shared->cache.chunk.single_space, fm->chunk_dim) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't adjust chunk dimensions")
+
+            /* Set the single chunk dataspace to 'all' selection */
+            if(H5S_select_all(dataset->shared->cache.chunk.single_space, TRUE) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSELECT, FAIL, "unable to set all selection")
+        } /* end if */
+        fm->single_space = dataset->shared->cache.chunk.single_space;
+        HDassert(fm->single_space);
+
+        /* Allocate the single chunk information */
+        if(NULL == dataset->shared->cache.chunk.single_chunk_info) {
+            if(NULL == (dataset->shared->cache.chunk.single_chunk_info = H5FL_MALLOC(H5D_chunk_info_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate chunk info")
+        } /* end if */
+        fm->single_chunk_info = dataset->shared->cache.chunk.single_chunk_info;
+        HDassert(fm->single_chunk_info);
+
+        /* Reset chunk template information */
+        fm->mchunk_tmpl = NULL;
+
+        /* Set up chunk mapping for single element */
+        if(H5D__create_chunk_map_single(fm, io_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create chunk selections for single element")
+    } /* end if */
+    else {
+        hbool_t sel_hyper_flag;         /* Whether file selection is a hyperslab */
+
+        /* Initialize skip list for chunk selections */
+        if(NULL == dataset->shared->cache.chunk.sel_chunks) {
+            if(NULL == (dataset->shared->cache.chunk.sel_chunks = H5SL_create(H5SL_TYPE_HSIZE, NULL)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't create skip list for chunk selections")
+        } /* end if */
+        fm->sel_chunks = dataset->shared->cache.chunk.sel_chunks;
+        HDassert(fm->sel_chunks);
+
+        /* We are not using single element mode */
+        fm->use_single = FALSE;
+
+        /* Get type of selection on disk & in memory */
+        if((fsel_type = H5S_GET_SELECT_TYPE(file_space)) < H5S_SEL_NONE)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to get type of selection")
+        if((fm->msel_type = H5S_GET_SELECT_TYPE(mem_space)) < H5S_SEL_NONE)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to get type of selection")
+
+        /* If the selection is NONE or POINTS, set the flag to FALSE */
+        if(fsel_type == H5S_SEL_POINTS || fsel_type == H5S_SEL_NONE)
+            sel_hyper_flag = FALSE;
+        else
+            sel_hyper_flag = TRUE;
+
+        /* Check if file selection is a not a hyperslab selection */
+        if(sel_hyper_flag) {
+            /* Build the file selection for each chunk */
+            if(H5D__create_chunk_file_map_hyper(fm, io_info) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create file chunk selections")
+
+            /* Clean file chunks' hyperslab span "scratch" information */
+            curr_node = H5SL_first(fm->sel_chunks);
+            while(curr_node) {
+                H5D_chunk_info_t *chunk_info;   /* Pointer chunk information */
+
+                /* Get pointer to chunk's information */
+                chunk_info = (H5D_chunk_info_t *)H5SL_item(curr_node);
+                HDassert(chunk_info);
+
+                /* Clean hyperslab span's "scratch" information */
+                if(H5S_hyper_reset_scratch(chunk_info->fspace) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset span scratch info")
+
+                /* Get the next chunk node in the skip list */
+                curr_node = H5SL_next(curr_node);
+            } /* end while */
+        } /* end if */
+        else {
+            H5S_sel_iter_op_t iter_op;  /* Operator for iteration */
+            H5D_chunk_file_iter_ud_t udata;     /* User data for iteration */
+
+            /* Create temporary datatypes for selection iteration */
+            if(NULL == (file_type = H5T_copy(dataset->shared->type, H5T_COPY_ALL)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, FAIL, "unable to copy file datatype")
+
+            /* Initialize the user data */
+            udata.fm = fm;
+#ifdef H5_HAVE_PARALLEL
+            udata.io_info = io_info;
+#endif /* H5_HAVE_PARALLEL */
+
+            iter_op.op_type = H5S_SEL_ITER_OP_LIB;
+            iter_op.u.lib_op = H5D__chunk_file_cb;
+
+            /* Spaces might not be the same shape, iterate over the file selection directly */
+            if(H5S_select_iterate(&bogus, file_type, file_space, &iter_op, &udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create file chunk selections")
+
+            /* Reset "last chunk" info */
+            fm->last_index = (hsize_t)-1;
+            fm->last_chunk_info = NULL;
+        } /* end else */
+
+        /* Build the memory selection for each chunk */
+        if(sel_hyper_flag && H5S_select_shape_same(file_space, mem_space) == TRUE) {
+            /* Reset chunk template information */
+            fm->mchunk_tmpl = NULL;
+
+            /* If the selections are the same shape, use the file chunk information
+             * to generate the memory chunk information quickly.
+             */
+            if(H5D__create_chunk_mem_map_hyper(fm) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create memory chunk selections")
+        } /* end if */
+        else {
+            H5S_sel_iter_op_t iter_op;  /* Operator for iteration */
+            size_t elmt_size;           /* Memory datatype size */
+
+            /* Make a copy of equivalent memory space */
+            if((tmp_mspace = H5S_copy(mem_space, TRUE, FALSE)) == NULL)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy memory space")
+
+            /* De-select the mem space copy */
+            if(H5S_select_none(tmp_mspace) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to de-select memory space")
+
+            /* Save chunk template information */
+            fm->mchunk_tmpl = tmp_mspace;
+
+            /* Create temporary datatypes for selection iteration */
+            if(!file_type) {
+                if(NULL == (file_type = H5T_copy(dataset->shared->type, H5T_COPY_ALL)))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, FAIL, "unable to copy file datatype")
+            } /* end if */
+
+            /* Create selection iterator for memory selection */
+            if(0 == (elmt_size = H5T_get_size(mem_type)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "datatype size invalid")
+            if(H5S_select_iter_init(&(fm->mem_iter), mem_space, elmt_size) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+            iter_init = TRUE;	/* Selection iteration info has been initialized */
+
+            iter_op.op_type = H5S_SEL_ITER_OP_LIB;
+            iter_op.u.lib_op = H5D__chunk_mem_cb;
+
+            /* Spaces aren't the same shape, iterate over the memory selection directly */
+            if(H5S_select_iterate(&bogus, file_type, file_space, &iter_op, fm) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create memory chunk selections")
+
+            /* Clean up hyperslab stuff, if necessary */
+            if(fm->msel_type != H5S_SEL_POINTS) {
+                /* Clean memory chunks' hyperslab span "scratch" information */
+                curr_node = H5SL_first(fm->sel_chunks);
+                while(curr_node) {
+                    H5D_chunk_info_t *chunk_info;   /* Pointer chunk information */
+
+                    /* Get pointer to chunk's information */
+                    chunk_info = (H5D_chunk_info_t *)H5SL_item(curr_node);
+                    HDassert(chunk_info);
+
+                    /* Clean hyperslab span's "scratch" information */
+                    if(H5S_hyper_reset_scratch(chunk_info->mspace) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset span scratch info")
+
+                    /* Get the next chunk node in the skip list */
+                    curr_node = H5SL_next(curr_node);
+                } /* end while */
+            } /* end if */
+        } /* end else */
+    } /* end else */
+
+done:
+    /* Release the [potentially partially built] chunk mapping information if an error occurs */
+    if(ret_value < 0) {
+        if(tmp_mspace && !fm->mchunk_tmpl) {
+            if(H5S_close(tmp_mspace) < 0)
+                HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "can't release memory chunk dataspace template")
+        } /* end if */
+
+        if(H5D__chunk_io_term(fm) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release chunk mapping")
+    } /* end if */
+
+    /* Reset the global dataspace info */
+    fm->file_space = NULL;
+    fm->mem_space = NULL;
+
+    if(iter_init && H5S_SELECT_ITER_RELEASE(&(fm->mem_iter)) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(file_type && (H5T_close(file_type) < 0))
+        HDONE_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Can't free temporary datatype")
+    if(file_space_normalized) {
+        /* (Casting away const OK -QAK) */
+        if(H5S_hyper_denormalize_offset((H5S_t *)file_space, old_offset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to normalize dataspace by offset")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_io_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_alloc
+ *
+ * Purpose:	Allocate space for a chunk in memory.  This routine allocates
+ *              memory space for non-filtered chunks from a block free list
+ *              and uses malloc()/free() for filtered chunks.
+ *
+ * Return:	Pointer to memory for chunk on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              April 22, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__chunk_alloc(size_t size, const H5O_pline_t *pline)
+{
+    void *ret_value = NULL;		/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(size);
+    HDassert(pline);
+
+    if(pline->nused > 0)
+        ret_value = H5MM_malloc(size);
+    else
+        ret_value = H5FL_BLK_MALLOC(chunk, size);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_xfree
+ *
+ * Purpose:	Free space for a chunk in memory.  This routine allocates
+ *              memory space for non-filtered chunks from a block free list
+ *              and uses malloc()/free() for filtered chunks.
+ *
+ * Return:	NULL (never fails)
+ *
+ * Programmer:	Quincey Koziol
+ *              April 22, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__chunk_xfree(void *chk, const H5O_pline_t *pline)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(pline);
+
+    if(chk) {
+        if(pline->nused > 0)
+            H5MM_xfree(chk);
+        else
+            chk = H5FL_BLK_FREE(chunk, chk);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(NULL)
+} /* H5D__chunk_xfree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_realloc
+ *
+ * Purpose:     Reallocate space for a chunk in memory.  This routine allocates
+ *              memory space for non-filtered chunks from a block free list
+ *              and uses malloc()/free() for filtered chunks.
+ *
+ * Return:      Pointer to memory for chunk on success/NULL on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 3, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__chunk_realloc(void *chk, size_t size, const H5O_pline_t *pline)
+{
+    void *ret_value = NULL;             /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(size);
+    HDassert(pline);
+
+    if(pline->nused > 0)
+        ret_value = H5MM_realloc(chk, size);
+    else
+        ret_value = H5FL_BLK_REALLOC(chunk, chk, size);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_realloc() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__free_chunk_info
+ PURPOSE
+    Internal routine to destroy a chunk info node
+ USAGE
+    void H5D__free_chunk_info(chunk_info)
+        void *chunk_info;    IN: Pointer to chunk info to destroy
+ RETURNS
+    No return value
+ DESCRIPTION
+    Releases all the memory for a chunk info node.  Called by H5SL_free
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__free_chunk_info(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *opdata)
+{
+    H5D_chunk_info_t *chunk_info = (H5D_chunk_info_t *)item;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(chunk_info);
+
+    /* Close the chunk's file dataspace, if it's not shared */
+    if(!chunk_info->fspace_shared)
+        (void)H5S_close(chunk_info->fspace);
+    else
+        H5S_select_all(chunk_info->fspace, TRUE);
+
+    /* Close the chunk's memory dataspace, if it's not shared */
+    if(!chunk_info->mspace_shared && chunk_info->mspace)
+        (void)H5S_close(chunk_info->mspace);
+
+    /* Free the actual chunk info */
+    chunk_info = H5FL_FREE(H5D_chunk_info_t, chunk_info);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5D__free_chunk_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__create_chunk_map_single
+ *
+ * Purpose:	Create chunk selections when appending a single record
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, November 20, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__create_chunk_map_single(H5D_chunk_map_t *fm, const H5D_io_info_t
+#ifndef H5_HAVE_PARALLEL
+    H5_ATTR_UNUSED
+#endif /* H5_HAVE_PARALLEL */
+    *io_info)
+{
+    H5D_chunk_info_t *chunk_info;           /* Chunk information to insert into skip list */
+    hsize_t     sel_start[H5O_LAYOUT_NDIMS]; /* Offset of low bound of file selection */
+    hsize_t     sel_end[H5O_LAYOUT_NDIMS];  /* Offset of high bound of file selection */
+    unsigned    u;                          /* Local index variable */
+    herr_t	ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(fm->f_ndims > 0);
+
+    /* Get coordinate for selection */
+    if(H5S_SELECT_BOUNDS(fm->file_space, sel_start, sel_end) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get file selection bound info")
+
+    /* Initialize the 'single chunk' file & memory chunk information */
+    chunk_info = fm->single_chunk_info;
+    chunk_info->chunk_points = 1;
+
+    /* Set chunk location & hyperslab size */
+    for(u = 0; u < fm->f_ndims; u++) {
+        HDassert(sel_start[u] == sel_end[u]);
+        chunk_info->coords[u] = (sel_start[u] / fm->layout->u.chunk.dim[u]) * fm->layout->u.chunk.dim[u];
+    } /* end for */
+    chunk_info->coords[fm->f_ndims] = 0;
+
+    /* Calculate the index of this chunk */
+    if(H5VM_chunk_index(fm->f_ndims, chunk_info->coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_info->index) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+
+    /* Copy selection for file's dataspace into chunk dataspace */
+    if(H5S_select_copy(fm->single_space, fm->file_space, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy file selection")
+
+    /* Move selection back to have correct offset in chunk */
+    if(H5S_SELECT_ADJUST_U(fm->single_space, chunk_info->coords) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't adjust chunk selection")
+
+#ifdef H5_HAVE_PARALLEL
+    /* store chunk selection information */
+    if(io_info->using_mpi_vfd)
+        fm->select_chunk[chunk_info->index] = chunk_info;
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Set the file dataspace for the chunk to the shared 'single' dataspace */
+    chunk_info->fspace = fm->single_space;
+
+    /* Indicate that the chunk's file dataspace is shared */
+    chunk_info->fspace_shared = TRUE;
+
+    /* Just point at the memory dataspace & selection */
+    /* (Casting away const OK -QAK) */
+    chunk_info->mspace = (H5S_t *)fm->mem_space;
+
+    /* Indicate that the chunk's memory dataspace is shared */
+    chunk_info->mspace_shared = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__create_chunk_map_single() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__create_chunk_file_map_hyper
+ *
+ * Purpose:	Create all chunk selections in file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, May 29, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
+#ifndef H5_HAVE_PARALLEL
+    H5_ATTR_UNUSED
+#endif /* H5_HAVE_PARALLEL */
+    *io_info)
+{
+    hsize_t     sel_start[H5O_LAYOUT_NDIMS];   /* Offset of low bound of file selection */
+    hsize_t     sel_end[H5O_LAYOUT_NDIMS];   /* Offset of high bound of file selection */
+    hsize_t     sel_points;                 /* Number of elements in file selection */
+    hsize_t     start_coords[H5O_LAYOUT_NDIMS];   /* Starting coordinates of selection */
+    hsize_t     coords[H5O_LAYOUT_NDIMS];   /* Current coordinates of chunk */
+    hsize_t     end[H5O_LAYOUT_NDIMS];      /* Current coordinates of chunk */
+    hsize_t     chunk_index;                /* Index of chunk */
+    int         curr_dim;                   /* Current dimension to increment */
+    unsigned    u;                          /* Local index variable */
+    herr_t	ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(fm->f_ndims>0);
+
+    /* Get number of elements selected in file */
+    sel_points = fm->nelmts;
+
+    /* Get bounding box for selection (to reduce the number of chunks to iterate over) */
+    if(H5S_SELECT_BOUNDS(fm->file_space, sel_start, sel_end) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get file selection bound info")
+
+    /* Set initial chunk location & hyperslab size */
+    for(u = 0; u < fm->f_ndims; u++) {
+        start_coords[u] = (sel_start[u] / fm->layout->u.chunk.dim[u]) * fm->layout->u.chunk.dim[u];
+        coords[u] = start_coords[u];
+        end[u] = (coords[u] + fm->chunk_dim[u]) - 1;
+    } /* end for */
+
+    /* Calculate the index of this chunk */
+    if(H5VM_chunk_index(fm->f_ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+
+    /* Iterate through each chunk in the dataset */
+    while(sel_points) {
+        /* Check for intersection of temporary chunk and file selection */
+        /* (Casting away const OK - QAK) */
+        if(TRUE == H5S_hyper_intersect_block((H5S_t *)fm->file_space, coords, end)) {
+            H5S_t *tmp_fchunk;                  /* Temporary file dataspace */
+            H5D_chunk_info_t *new_chunk_info;   /* chunk information to insert into skip list */
+            hssize_t    schunk_points;          /* Number of elements in chunk selection */
+
+            /* Create "temporary" chunk for selection operations (copy file space) */
+            if(NULL == (tmp_fchunk = H5S_copy(fm->file_space, TRUE, FALSE)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy memory space")
+
+            /* Make certain selections are stored in span tree form (not "optimized hyperslab" or "all") */
+            if(H5S_hyper_convert(tmp_fchunk) < 0) {
+                (void)H5S_close(tmp_fchunk);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to convert selection to span trees")
+            } /* end if */
+
+            /* "AND" temporary chunk and current chunk */
+            if(H5S_select_hyperslab(tmp_fchunk,H5S_SELECT_AND,coords,NULL,fm->chunk_dim,NULL) < 0) {
+                (void)H5S_close(tmp_fchunk);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't create chunk selection")
+            } /* end if */
+
+            /* Resize chunk's dataspace dimensions to size of chunk */
+            if(H5S_set_extent_real(tmp_fchunk,fm->chunk_dim) < 0) {
+                (void)H5S_close(tmp_fchunk);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't adjust chunk dimensions")
+            } /* end if */
+
+            /* Move selection back to have correct offset in chunk */
+            if(H5S_SELECT_ADJUST_U(tmp_fchunk, coords) < 0) {
+                (void)H5S_close(tmp_fchunk);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't adjust chunk selection")
+            } /* end if */
+
+            /* Add temporary chunk to the list of chunks */
+
+            /* Allocate the file & memory chunk information */
+            if (NULL==(new_chunk_info = H5FL_MALLOC(H5D_chunk_info_t))) {
+                (void)H5S_close(tmp_fchunk);
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate chunk info")
+            } /* end if */
+
+            /* Initialize the chunk information */
+
+            /* Set the chunk index */
+            new_chunk_info->index=chunk_index;
+
+#ifdef H5_HAVE_PARALLEL
+            /* Store chunk selection information, for multi-chunk I/O */
+            if(io_info->using_mpi_vfd)
+                fm->select_chunk[chunk_index] = new_chunk_info;
+#endif /* H5_HAVE_PARALLEL */
+
+            /* Set the file chunk dataspace */
+            new_chunk_info->fspace = tmp_fchunk;
+            new_chunk_info->fspace_shared = FALSE;
+
+            /* Set the memory chunk dataspace */
+            new_chunk_info->mspace=NULL;
+            new_chunk_info->mspace_shared = FALSE;
+
+            /* Copy the chunk's coordinates */
+            HDmemcpy(new_chunk_info->coords, coords, sizeof(hsize_t) * fm->f_ndims);
+            new_chunk_info->coords[fm->f_ndims] = 0;
+
+            /* Insert the new chunk into the skip list */
+            if(H5SL_insert(fm->sel_chunks, new_chunk_info, &new_chunk_info->index) < 0) {
+                H5D__free_chunk_info(new_chunk_info, NULL, NULL);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert chunk into skip list")
+            } /* end if */
+
+            /* Get number of elements selected in chunk */
+            if((schunk_points = H5S_GET_SELECT_NPOINTS(tmp_fchunk)) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get file selection # of elements")
+            H5_CHECKED_ASSIGN(new_chunk_info->chunk_points, uint32_t, schunk_points, hssize_t);
+
+            /* Decrement # of points left in file selection */
+            sel_points -= (hsize_t)schunk_points;
+
+            /* Leave if we are done */
+            if(sel_points == 0)
+                HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+        /* Increment chunk index */
+        chunk_index++;
+
+        /* Set current increment dimension */
+        curr_dim=(int)fm->f_ndims-1;
+
+        /* Increment chunk location in fastest changing dimension */
+        H5_CHECK_OVERFLOW(fm->chunk_dim[curr_dim],hsize_t,hssize_t);
+        coords[curr_dim]+=fm->chunk_dim[curr_dim];
+        end[curr_dim]+=fm->chunk_dim[curr_dim];
+
+        /* Bring chunk location back into bounds, if necessary */
+        if(coords[curr_dim] > sel_end[curr_dim]) {
+            do {
+                /* Reset current dimension's location to 0 */
+                coords[curr_dim] = start_coords[curr_dim]; /*lint !e771 The start_coords will always be initialized */
+                end[curr_dim] = (coords[curr_dim] + fm->chunk_dim[curr_dim]) - 1;
+
+                /* Decrement current dimension */
+                curr_dim--;
+
+                /* Increment chunk location in current dimension */
+                coords[curr_dim] += fm->chunk_dim[curr_dim];
+                end[curr_dim] = (coords[curr_dim] + fm->chunk_dim[curr_dim]) - 1;
+            } while(coords[curr_dim] > sel_end[curr_dim]);
+
+            /* Re-calculate the index of this chunk */
+            if(H5VM_chunk_index(fm->f_ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+        } /* end if */
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__create_chunk_file_map_hyper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__create_chunk_mem_map_hyper
+ *
+ * Purpose:	Create all chunk selections in memory by copying the file
+ *              chunk selections and adjusting their offsets to be correct
+ *              for the memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, May 29, 2003
+ *
+ * Assumptions: That the file and memory selections are the same shape.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__create_chunk_mem_map_hyper(const H5D_chunk_map_t *fm)
+{
+    H5SL_node_t *curr_node;                 /* Current node in skip list */
+    hsize_t    file_sel_start[H5O_LAYOUT_NDIMS];    /* Offset of low bound of file selection */
+    hsize_t    file_sel_end[H5O_LAYOUT_NDIMS];  /* Offset of high bound of file selection */
+    hsize_t    mem_sel_start[H5O_LAYOUT_NDIMS]; /* Offset of low bound of file selection */
+    hsize_t    mem_sel_end[H5O_LAYOUT_NDIMS];   /* Offset of high bound of file selection */
+    hssize_t adjust[H5O_LAYOUT_NDIMS];      /* Adjustment to make to all file chunks */
+    hssize_t chunk_adjust[H5O_LAYOUT_NDIMS];  /* Adjustment to make to a particular chunk */
+    unsigned    u;                          /* Local index variable */
+    herr_t	ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(fm->f_ndims>0);
+
+    /* Check for all I/O going to a single chunk */
+    if(H5SL_count(fm->sel_chunks)==1) {
+        H5D_chunk_info_t *chunk_info;   /* Pointer to chunk information */
+
+        /* Get the node */
+        curr_node=H5SL_first(fm->sel_chunks);
+
+        /* Get pointer to chunk's information */
+        chunk_info = (H5D_chunk_info_t *)H5SL_item(curr_node);
+        HDassert(chunk_info);
+
+        /* Just point at the memory dataspace & selection */
+        /* (Casting away const OK -QAK) */
+        chunk_info->mspace = (H5S_t *)fm->mem_space;
+
+        /* Indicate that the chunk's memory space is shared */
+        chunk_info->mspace_shared = TRUE;
+    } /* end if */
+    else {
+        /* Get bounding box for file selection */
+        if(H5S_SELECT_BOUNDS(fm->file_space, file_sel_start, file_sel_end) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get file selection bound info")
+
+        /* Get bounding box for memory selection */
+        if(H5S_SELECT_BOUNDS(fm->mem_space, mem_sel_start, mem_sel_end) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get file selection bound info")
+
+        /* Calculate the adjustment for memory selection from file selection */
+        HDassert(fm->m_ndims==fm->f_ndims);
+        for(u=0; u<fm->f_ndims; u++) {
+            H5_CHECK_OVERFLOW(file_sel_start[u],hsize_t,hssize_t);
+            H5_CHECK_OVERFLOW(mem_sel_start[u],hsize_t,hssize_t);
+            adjust[u]=(hssize_t)file_sel_start[u]-(hssize_t)mem_sel_start[u];
+        } /* end for */
+
+        /* Iterate over each chunk in the chunk list */
+        curr_node=H5SL_first(fm->sel_chunks);
+        while(curr_node) {
+            H5D_chunk_info_t *chunk_info;   /* Pointer to chunk information */
+
+            /* Get pointer to chunk's information */
+            chunk_info = (H5D_chunk_info_t *)H5SL_item(curr_node);
+            HDassert(chunk_info);
+
+            /* Copy the information */
+
+            /* Copy the memory dataspace */
+            if((chunk_info->mspace = H5S_copy(fm->mem_space, TRUE, FALSE)) == NULL)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy memory space")
+
+            /* Release the current selection */
+            if(H5S_SELECT_RELEASE(chunk_info->mspace) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection")
+
+            /* Copy the file chunk's selection */
+            if(H5S_select_copy(chunk_info->mspace,chunk_info->fspace,FALSE) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy selection")
+
+            /* Compensate for the chunk offset */
+            for(u=0; u<fm->f_ndims; u++) {
+                H5_CHECK_OVERFLOW(chunk_info->coords[u],hsize_t,hssize_t);
+                chunk_adjust[u]=adjust[u]-(hssize_t)chunk_info->coords[u]; /*lint !e771 The adjust array will always be initialized */
+            } /* end for */
+
+            /* Adjust the selection */
+            if(H5S_hyper_adjust_s(chunk_info->mspace,chunk_adjust) < 0) /*lint !e772 The chunk_adjust array will always be initialized */
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't adjust chunk selection")
+
+            /* Get the next chunk node in the skip list */
+            curr_node=H5SL_next(curr_node);
+        } /* end while */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__create_chunk_mem_map_hyper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_file_cb
+ *
+ * Purpose:	Callback routine for file selection iterator.  Used when
+ *              creating selections in file for each point selected.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, July 23, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_file_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type, unsigned ndims, const hsize_t *coords, void *_udata)
+{
+    H5D_chunk_file_iter_ud_t *udata = (H5D_chunk_file_iter_ud_t *)_udata;       /* User data for operation */
+    H5D_chunk_map_t      *fm = udata->fm;       /* File<->memory chunk mapping info */
+    H5D_chunk_info_t *chunk_info;               /* Chunk information for current chunk */
+    hsize_t     coords_in_chunk[H5O_LAYOUT_NDIMS];        /* Coordinates of element in chunk */
+    hsize_t     chunk_index;                    /* Chunk index */
+    unsigned    u;                              /* Local index variable */
+    herr_t	ret_value = SUCCEED;            /* Return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Calculate the index of this chunk */
+    if(H5VM_chunk_index(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+
+    /* Find correct chunk in file & memory skip list */
+    if(chunk_index==fm->last_index) {
+        /* If the chunk index is the same as the last chunk index we used,
+         * get the cached info to operate on.
+         */
+        chunk_info = fm->last_chunk_info;
+    } /* end if */
+    else {
+        /* If the chunk index is not the same as the last chunk index we used,
+         * find the chunk in the skip list.
+         */
+        /* Get the chunk node from the skip list */
+        if(NULL == (chunk_info = (H5D_chunk_info_t *)H5SL_search(fm->sel_chunks, &chunk_index))) {
+            H5S_t *fspace;                      /* Memory chunk's dataspace */
+
+            /* Allocate the file & memory chunk information */
+            if (NULL==(chunk_info = H5FL_MALLOC (H5D_chunk_info_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate chunk info")
+
+            /* Initialize the chunk information */
+
+            /* Set the chunk index */
+            chunk_info->index=chunk_index;
+
+            /* Create a dataspace for the chunk */
+            if((fspace = H5S_create_simple(fm->f_ndims,fm->chunk_dim,NULL))==NULL) {
+                chunk_info = H5FL_FREE(H5D_chunk_info_t, chunk_info);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create dataspace for chunk")
+            } /* end if */
+
+            /* De-select the chunk space */
+            if(H5S_select_none(fspace) < 0) {
+                (void)H5S_close(fspace);
+                chunk_info = H5FL_FREE(H5D_chunk_info_t, chunk_info);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to de-select dataspace")
+            } /* end if */
+
+            /* Set the file chunk dataspace */
+            chunk_info->fspace = fspace;
+            chunk_info->fspace_shared = FALSE;
+
+            /* Set the memory chunk dataspace */
+            chunk_info->mspace = NULL;
+            chunk_info->mspace_shared = FALSE;
+
+            /* Set the number of selected elements in chunk to zero */
+            chunk_info->chunk_points = 0;
+
+            /* Compute the chunk's coordinates */
+            for(u = 0; u < fm->f_ndims; u++) {
+                H5_CHECK_OVERFLOW(fm->layout->u.chunk.dim[u], hsize_t, hssize_t);
+                chunk_info->coords[u] = (coords[u] / (hssize_t)fm->layout->u.chunk.dim[u]) * (hssize_t)fm->layout->u.chunk.dim[u];
+            } /* end for */
+            chunk_info->coords[fm->f_ndims] = 0;
+
+            /* Insert the new chunk into the skip list */
+            if(H5SL_insert(fm->sel_chunks,chunk_info,&chunk_info->index) < 0) {
+                    H5D__free_chunk_info(chunk_info,NULL,NULL);
+                HGOTO_ERROR(H5E_DATASPACE,H5E_CANTINSERT,FAIL,"can't insert chunk into skip list")
+            } /* end if */
+        } /* end if */
+
+#ifdef H5_HAVE_PARALLEL
+        /* Store chunk selection information, for collective multi-chunk I/O */
+        if(udata->io_info->using_mpi_vfd)
+            fm->select_chunk[chunk_index] = chunk_info;
+#endif /* H5_HAVE_PARALLEL */
+
+        /* Update the "last chunk seen" information */
+        fm->last_index = chunk_index;
+        fm->last_chunk_info = chunk_info;
+    } /* end else */
+
+    /* Get the offset of the element within the chunk */
+    for(u = 0; u < fm->f_ndims; u++)
+        coords_in_chunk[u] = coords[u] - chunk_info->coords[u];
+
+    /* Add point to file selection for chunk */
+    if(H5S_select_elements(chunk_info->fspace, H5S_SELECT_APPEND, (size_t)1, coords_in_chunk) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "unable to select element")
+
+    /* Increment the number of elemented selected in chunk */
+    chunk_info->chunk_points++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_file_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_mem_cb
+ *
+ * Purpose:	Callback routine for file selection iterator.  Used when
+ *              creating selections in memory for each chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Thursday, April 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5D__chunk_mem_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type, unsigned ndims, const hsize_t *coords, void *_fm)
+{
+    H5D_chunk_map_t      *fm = (H5D_chunk_map_t *)_fm;  /* File<->memory chunk mapping info */
+    H5D_chunk_info_t *chunk_info;               /* Chunk information for current chunk */
+    hsize_t    coords_in_mem[H5O_LAYOUT_NDIMS];        /* Coordinates of element in memory */
+    hsize_t     chunk_index;                    /* Chunk index */
+    herr_t	ret_value = SUCCEED;            /* Return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Calculate the index of this chunk */
+    if(H5VM_chunk_index(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+
+    /* Find correct chunk in file & memory skip list */
+    if(chunk_index == fm->last_index) {
+        /* If the chunk index is the same as the last chunk index we used,
+         * get the cached spaces to operate on.
+         */
+        chunk_info = fm->last_chunk_info;
+    } /* end if */
+    else {
+        /* If the chunk index is not the same as the last chunk index we used,
+         * find the chunk in the skip list.
+         */
+        /* Get the chunk node from the skip list */
+        if(NULL == (chunk_info = (H5D_chunk_info_t *)H5SL_search(fm->sel_chunks, &chunk_index)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_NOTFOUND, FAIL, "can't locate chunk in skip list")
+
+        /* Check if the chunk already has a memory space */
+        if(NULL == chunk_info->mspace) {
+            /* Copy the template memory chunk dataspace */
+            if(NULL == (chunk_info->mspace = H5S_copy(fm->mchunk_tmpl, FALSE, FALSE)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy file space")
+        } /* end else */
+
+        /* Update the "last chunk seen" information */
+        fm->last_index = chunk_index;
+        fm->last_chunk_info = chunk_info;
+    } /* end else */
+
+    /* Get coordinates of selection iterator for memory */
+    if(H5S_SELECT_ITER_COORDS(&fm->mem_iter, coords_in_mem) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator coordinates")
+
+    /* Add point to memory selection for chunk */
+    if(fm->msel_type == H5S_SEL_POINTS) {
+        if(H5S_select_elements(chunk_info->mspace, H5S_SELECT_APPEND, (size_t)1, coords_in_mem) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "unable to select element")
+    } /* end if */
+    else {
+        if(H5S_hyper_add_span_element(chunk_info->mspace, fm->m_ndims, coords_in_mem) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "unable to select element")
+    } /* end else */
+
+    /* Move memory selection iterator to next element in selection */
+    if(H5S_SELECT_ITER_NEXT(&fm->mem_iter, (size_t)1) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to move to next iterator location")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_mem_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_cacheable
+ *
+ * Purpose:	A small internal function to if it's possible to load the
+ *              chunk into cache.
+ *
+ * Return:	TRUE or FALSE
+ *
+ * Programmer:	Raymond Lu
+ *		17 July 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr, hbool_t write_op)
+{
+    const H5D_t *dataset = io_info->dset; /* Local pointer to dataset info */
+    htri_t ret_value = FAIL;            /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(io_info);
+    HDassert(dataset);
+
+    /* Must bring the whole chunk in if there are any filters */
+    if(dataset->shared->dcpl_cache.pline.nused > 0)
+        ret_value = TRUE;
+    else {
+#ifdef H5_HAVE_PARALLEL
+         /* If MPI based VFD is used and the file is opened for write access, must
+          *         bypass the chunk-cache scheme because other MPI processes could
+          *         be writing to other elements in the same chunk.  Do a direct
+          *         write-through of only the elements requested.
+          */
+        if(io_info->using_mpi_vfd && (H5F_ACC_RDWR & H5F_INTENT(dataset->oloc.file)))
+            ret_value = FALSE;
+        else {
+#endif /* H5_HAVE_PARALLEL */
+            /* If the chunk is too large to keep in the cache and if we don't
+             * need to write the fill value, then don't load the chunk into the
+             * cache, just write the data to it directly.
+             */
+            H5_CHECK_OVERFLOW(dataset->shared->layout.u.chunk.size, uint32_t, size_t);
+            if((size_t)dataset->shared->layout.u.chunk.size > dataset->shared->cache.chunk.nbytes_max) {
+                if(write_op && !H5F_addr_defined(caddr)) {
+                    const H5O_fill_t *fill = &(dataset->shared->dcpl_cache.fill); /* Fill value info */
+                    H5D_fill_value_t fill_status;    /* Fill value status */
+
+                    /* Revtrieve the fill value status */
+                    if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+                    /* If the fill value needs to be written then we will need
+                     * to use the cache to write the fill value */
+                    if(fill->fill_time == H5D_FILL_TIME_ALLOC ||
+                            (fill->fill_time == H5D_FILL_TIME_IFSET &&
+                            (fill_status == H5D_FILL_VALUE_USER_DEFINED ||
+                             fill_status == H5D_FILL_VALUE_DEFAULT)))
+                        ret_value = TRUE;
+                    else
+                        ret_value = FALSE;
+                } else
+                    ret_value = FALSE;
+            } else
+                ret_value = TRUE;
+#ifdef H5_HAVE_PARALLEL
+        } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_cacheable() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_read
+ *
+ * Purpose:	Read from a chunked dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Thursday, April 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t *fm)
+{
+    H5SL_node_t *chunk_node;            /* Current node in chunk skip list */
+    H5D_io_info_t nonexistent_io_info;  /* "nonexistent" I/O info object */
+    H5D_io_info_t ctg_io_info;          /* Contiguous I/O info object */
+    H5D_storage_t ctg_store;            /* Chunk storage information as contiguous dataset */
+    H5D_io_info_t cpt_io_info;          /* Compact I/O info object */
+    H5D_storage_t cpt_store;            /* Chunk storage information as compact dataset */
+    hbool_t     cpt_dirty;              /* Temporary placeholder for compact storage "dirty" flag */
+    uint32_t    src_accessed_bytes = 0; /* Total accessed size in a chunk */
+    hbool_t     skip_missing_chunks = FALSE;    /* Whether to skip missing chunks */
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.rbuf);
+    HDassert(type_info);
+    HDassert(fm);
+
+    /* Set up "nonexistent" I/O info object */
+    HDmemcpy(&nonexistent_io_info, io_info, sizeof(nonexistent_io_info));
+    nonexistent_io_info.layout_ops = *H5D_LOPS_NONEXISTENT;
+
+    /* Set up contiguous I/O info object */
+    HDmemcpy(&ctg_io_info, io_info, sizeof(ctg_io_info));
+    ctg_io_info.store = &ctg_store;
+    ctg_io_info.layout_ops = *H5D_LOPS_CONTIG;
+
+    /* Initialize temporary contiguous storage info */
+    H5_CHECKED_ASSIGN(ctg_store.contig.dset_size, hsize_t, io_info->dset->shared->layout.u.chunk.size, uint32_t);
+
+    /* Set up compact I/O info object */
+    HDmemcpy(&cpt_io_info, io_info, sizeof(cpt_io_info));
+    cpt_io_info.store = &cpt_store;
+    cpt_io_info.layout_ops = *H5D_LOPS_COMPACT;
+
+    /* Initialize temporary compact storage info */
+    cpt_store.compact.dirty = &cpt_dirty;
+
+    {
+        const H5O_fill_t *fill = &(io_info->dset->shared->dcpl_cache.fill);    /* Fill value info */
+        H5D_fill_value_t fill_status;       /* Fill value status */
+
+        /* Check the fill value status */
+        if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+        /* If we are never to return fill values, or if we would return them
+         * but they aren't set, set the flag to skip missing chunks.
+         */
+        if(fill->fill_time == H5D_FILL_TIME_NEVER ||
+                (fill->fill_time == H5D_FILL_TIME_IFSET &&
+                 fill_status != H5D_FILL_VALUE_USER_DEFINED &&
+                 fill_status != H5D_FILL_VALUE_DEFAULT))
+            skip_missing_chunks = TRUE;
+    }
+
+    /* Iterate through nodes in chunk skip list */
+    chunk_node = H5D_CHUNK_GET_FIRST_NODE(fm);
+    while(chunk_node) {
+        H5D_chunk_info_t *chunk_info;   /* Chunk information */
+        H5D_io_info_t *chk_io_info;     /* Pointer to I/O info object for this chunk */
+        void *chunk;                    /* Pointer to locked chunk buffer */
+        H5D_chunk_ud_t udata;		/* B-tree pass-through	*/
+        htri_t cacheable;               /* Whether the chunk is cacheable */
+
+        /* Get the actual chunk information from the skip list node */
+        chunk_info = H5D_CHUNK_GET_NODE_INFO(fm, chunk_node);
+
+        /* Get the info for the chunk in the file */
+        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords, chunk_info->index, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+
+        /* Check for non-existant chunk & skip it if appropriate */
+        if(H5F_addr_defined(udata.addr) || UINT_MAX != udata.idx_hint
+                || !skip_missing_chunks) {
+            /* Load the chunk into cache and lock it. */
+            if((cacheable = H5D__chunk_cacheable(io_info, udata.addr, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if chunk is cacheable")
+            if(cacheable) {
+                /* Pass in chunk's coordinates in a union. */
+                io_info->store->chunk.offset = chunk_info->coords;
+                io_info->store->chunk.index = chunk_info->index;
+
+                /* Compute # of bytes accessed in chunk */
+                H5_CHECK_OVERFLOW(type_info->src_type_size, /*From:*/ size_t, /*To:*/ uint32_t);
+                src_accessed_bytes = chunk_info->chunk_points * (uint32_t)type_info->src_type_size;
+
+                /* Lock the chunk into the cache */
+                if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, FALSE)))
+                    HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk")
+
+                /* Set up the storage buffer information for this chunk */
+                cpt_store.compact.buf = chunk;
+
+                /* Point I/O info at contiguous I/O info for this chunk */
+                chk_io_info = &cpt_io_info;
+            } /* end if */
+            else if(H5F_addr_defined(udata.addr)) {
+                /* Set up the storage address information for this chunk */
+                ctg_store.contig.dset_addr = udata.addr;
+
+                /* No chunk cached */
+                chunk = NULL;
+
+                /* Point I/O info at temporary I/O info for this chunk */
+                chk_io_info = &ctg_io_info;
+            } /* end else if */
+            else {
+                /* No chunk cached */
+                chunk = NULL;
+
+                /* Point I/O info at "nonexistent" I/O info for this chunk */
+                chk_io_info = &nonexistent_io_info;
+            } /* end else */
+
+            /* Perform the actual read operation */
+            if((io_info->io_ops.single_read)(chk_io_info, type_info,
+                    (hsize_t)chunk_info->chunk_points, chunk_info->fspace, chunk_info->mspace) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "chunked read failed")
+
+            /* Release the cache lock on the chunk. */
+            if(chunk && H5D__chunk_unlock(io_info, &udata, FALSE, chunk, src_accessed_bytes) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk")
+        } /* end if */
+
+        /* Advance to next chunk in list */
+        chunk_node = H5D_CHUNK_GET_NEXT_NODE(fm, chunk_node);
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_write
+ *
+ * Purpose:	Writes to a chunked dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Thursday, April 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t *fm)
+{
+    H5SL_node_t *chunk_node;            /* Current node in chunk skip list */
+    H5D_io_info_t ctg_io_info;          /* Contiguous I/O info object */
+    H5D_storage_t ctg_store;            /* Chunk storage information as contiguous dataset */
+    H5D_io_info_t cpt_io_info;          /* Compact I/O info object */
+    H5D_storage_t cpt_store;            /* Chunk storage information as compact dataset */
+    hbool_t     cpt_dirty;              /* Temporary placeholder for compact storage "dirty" flag */
+    uint32_t    dst_accessed_bytes = 0; /* Total accessed size in a chunk */
+    herr_t	ret_value = SUCCEED;	/* Return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.wbuf);
+    HDassert(type_info);
+    HDassert(fm);
+
+    /* Set up contiguous I/O info object */
+    HDmemcpy(&ctg_io_info, io_info, sizeof(ctg_io_info));
+    ctg_io_info.store = &ctg_store;
+    ctg_io_info.layout_ops = *H5D_LOPS_CONTIG;
+
+    /* Initialize temporary contiguous storage info */
+    H5_CHECKED_ASSIGN(ctg_store.contig.dset_size, hsize_t, io_info->dset->shared->layout.u.chunk.size, uint32_t);
+
+    /* Set up compact I/O info object */
+    HDmemcpy(&cpt_io_info, io_info, sizeof(cpt_io_info));
+    cpt_io_info.store = &cpt_store;
+    cpt_io_info.layout_ops = *H5D_LOPS_COMPACT;
+
+    /* Initialize temporary compact storage info */
+    cpt_store.compact.dirty = &cpt_dirty;
+
+    /* Iterate through nodes in chunk skip list */
+    chunk_node = H5D_CHUNK_GET_FIRST_NODE(fm);
+    while(chunk_node) {
+        H5D_chunk_info_t *chunk_info;   /* Chunk information */
+        H5D_io_info_t *chk_io_info;     /* Pointer to I/O info object for this chunk */
+        void *chunk;                    /* Pointer to locked chunk buffer */
+        H5D_chunk_ud_t udata;		/* Index pass-through	*/
+        htri_t cacheable;               /* Whether the chunk is cacheable */
+
+        /* Get the actual chunk information from the skip list node */
+        chunk_info = H5D_CHUNK_GET_NODE_INFO(fm, chunk_node);
+
+        /* Load the chunk into cache.  But if the whole chunk is written,
+         * simply allocate space instead of load the chunk. */
+        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords, chunk_info->index, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+        if((cacheable = H5D__chunk_cacheable(io_info, udata.addr, TRUE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if chunk is cacheable")
+        if(cacheable) {
+            hbool_t entire_chunk = TRUE;       /* Whether whole chunk is selected */
+
+            /* Pass in chunk's coordinates in a union. */
+            io_info->store->chunk.offset = chunk_info->coords;
+            io_info->store->chunk.index = chunk_info->index;
+
+            /* Compute # of bytes accessed in chunk */
+            H5_CHECK_OVERFLOW(type_info->dst_type_size, /*From:*/ size_t, /*To:*/ uint32_t);
+            dst_accessed_bytes = chunk_info->chunk_points * (uint32_t)type_info->dst_type_size;
+
+            /* Determine if we will access all the data in the chunk */
+            if(dst_accessed_bytes != ctg_store.contig.dset_size ||
+                    (chunk_info->chunk_points * type_info->src_type_size) != ctg_store.contig.dset_size)
+                entire_chunk = FALSE;
+
+            /* Lock the chunk into the cache */
+            if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, entire_chunk)))
+                HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk")
+
+            /* Set up the storage buffer information for this chunk */
+            cpt_store.compact.buf = chunk;
+
+            /* Point I/O info at main I/O info for this chunk */
+            chk_io_info = &cpt_io_info;
+        } /* end if */
+        else {
+            /* If the chunk hasn't been allocated on disk, do so now. */
+            if(!H5F_addr_defined(udata.addr)) {
+                H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+
+                /* Compose chunked index info struct */
+                idx_info.f = io_info->dset->oloc.file;
+                idx_info.dxpl_id = io_info->dxpl_id;
+                idx_info.pline = &(io_info->dset->shared->dcpl_cache.pline);
+                idx_info.layout = &(io_info->dset->shared->layout.u.chunk);
+                idx_info.storage = &(io_info->dset->shared->layout.storage.u.chunk);
+
+                /* Set up the size of chunk for user data */
+                udata.nbytes = io_info->dset->shared->layout.u.chunk.size;
+
+                /* Create the chunk */
+                if((io_info->dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+
+                /* Make sure the address of the chunk is returned. */
+                if(!H5F_addr_defined(udata.addr))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "chunk address isn't defined")
+
+                /* Cache the new chunk information */
+                H5D__chunk_cinfo_cache_update(&io_info->dset->shared->cache.chunk.last, &udata);
+            } /* end if */
+
+            /* Set up the storage address information for this chunk */
+            ctg_store.contig.dset_addr = udata.addr;
+
+            /* No chunk cached */
+            chunk = NULL;
+
+            /* Point I/O info at temporary I/O info for this chunk */
+            chk_io_info = &ctg_io_info;
+        } /* end else */
+
+        /* Perform the actual write operation */
+        if((io_info->io_ops.single_write)(chk_io_info, type_info,
+                (hsize_t)chunk_info->chunk_points, chunk_info->fspace, chunk_info->mspace) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "chunked write failed")
+
+        /* Release the cache lock on the chunk. */
+        if(chunk && H5D__chunk_unlock(io_info, &udata, TRUE, chunk, dst_accessed_bytes) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk")
+
+        /* Advance to next chunk in list */
+        chunk_node = H5D_CHUNK_GET_NEXT_NODE(fm, chunk_node);
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_flush
+ *
+ * Purpose:	Writes all dirty chunks to disk and optionally preempts them
+ *		from the cache.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_flush(H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    H5D_rdcc_t *rdcc = &(dset->shared->cache.chunk);
+    H5D_rdcc_ent_t	*ent, *next;
+    unsigned		nerrors = 0;    /* Count of any errors encountered when flushing chunks */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Flush any data caught in sieve buffer */
+    if(H5D__flush_sieve_buf(dset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush sieve buffer")
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Loop over all entries in the chunk cache */
+    for(ent = rdcc->head; ent; ent = next) {
+	next = ent->next;
+        if(H5D__chunk_flush_entry(dset, dxpl_id, dxpl_cache, ent, FALSE) < 0)
+            nerrors++;
+    } /* end for */
+    if(nerrors)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_io_term
+ *
+ * Purpose:	Destroy I/O operation information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, May 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_io_term(const H5D_chunk_map_t *fm)
+{
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Single element I/O vs. multiple element I/O cleanup */
+    if(fm->use_single) {
+        /* Sanity checks */
+        HDassert(fm->sel_chunks == NULL);
+        HDassert(fm->single_chunk_info);
+        HDassert(fm->single_chunk_info->fspace_shared);
+        HDassert(fm->single_chunk_info->mspace_shared);
+
+        /* Reset the selection for the single element I/O */
+        H5S_select_all(fm->single_space, TRUE);
+    } /* end if */
+    else {
+        /* Release the nodes on the list of selected chunks */
+        if(fm->sel_chunks)
+            if(H5SL_free(fm->sel_chunks, H5D__free_chunk_info, NULL) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTNEXT, FAIL, "can't iterate over chunks")
+    } /* end else */
+
+    /* Free the memory chunk dataspace template */
+    if(fm->mchunk_tmpl)
+        if(H5S_close(fm->mchunk_tmpl) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "can't release memory chunk dataspace template")
+#ifdef H5_HAVE_PARALLEL
+    if(fm->select_chunk)
+        H5MM_xfree(fm->select_chunk);
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_io_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_chunk_idx_reset
+ *
+ * Purpose:	Reset index information
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_chunk_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(storage);
+    HDassert(storage->ops);
+
+    /* Reset index structures */
+    if((storage->ops->reset)(storage, reset_addr) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset chunk index info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_chunk_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_cinfo_cache_reset
+ *
+ * Purpose:	Reset the cached chunk info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              November 27, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_cinfo_cache_reset(H5D_chunk_cached_t *last)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDassert(last);
+
+    /* Indicate that the cached info is not valid */
+    last->valid = FALSE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__chunk_cinfo_cache_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_cinfo_cache_update
+ *
+ * Purpose:	Update the cached chunk info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              November 27, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_cinfo_cache_update(H5D_chunk_cached_t *last, const H5D_chunk_ud_t *udata)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(last);
+    HDassert(udata);
+    HDassert(udata->common.layout);
+    HDassert(udata->common.storage);
+    HDassert(udata->common.offset);
+
+    /* Stored the information to cache */
+    HDmemcpy(last->offset, udata->common.offset, sizeof(hsize_t) * udata->common.layout->ndims);
+    last->nbytes = udata->nbytes;
+    last->filter_mask = udata->filter_mask;
+    last->addr = udata->addr;
+
+    /* Indicate that the cached info is valid */
+    last->valid = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__chunk_cinfo_cache_update() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_cinfo_cache_found
+ *
+ * Purpose:	Look for chunk info in cache
+ *
+ * Return:	TRUE/FALSE/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              November 27, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__chunk_cinfo_cache_found(const H5D_chunk_cached_t *last, H5D_chunk_ud_t *udata)
+{
+    hbool_t ret_value = FALSE;          /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(last);
+    HDassert(udata);
+    HDassert(udata->common.layout);
+    HDassert(udata->common.storage);
+    HDassert(udata->common.offset);
+
+    /* Check if the cached information is what is desired */
+    if(last->valid) {
+        unsigned    u;                      /* Local index variable */
+
+        /* Check that the offset is the same */
+        for(u = 0; u < udata->common.layout->ndims; u++)
+            if(last->offset[u] != udata->common.offset[u])
+                HGOTO_DONE(FALSE)
+
+        /* Retrieve the information from the cache */
+        udata->nbytes = last->nbytes;
+        udata->filter_mask = last->filter_mask;
+        udata->addr = last->addr;
+
+        /* Indicate that the data was found */
+        HGOTO_DONE(TRUE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_cinfo_cache_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_create
+ *
+ * Purpose:	Creates a new chunked storage index and initializes the
+ *		layout information with information about the storage.  The
+ *		layout info should be immediately written to the object header.
+ *
+ * Return:	Non-negative on success (with the layout information initialized
+ *		and ready to write to an object header). Negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_create(const H5D_t *dset /*in,out*/, hid_t dxpl_id)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset);
+    HDassert(H5D_CHUNKED == dset->shared->layout.type);
+    HDassert(dset->shared->layout.u.chunk.ndims > 0 && dset->shared->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+#ifndef NDEBUG
+{
+    unsigned u;                         /* Local index variable */
+
+    for(u = 0; u < dset->shared->layout.u.chunk.ndims; u++)
+	HDassert(dset->shared->layout.u.chunk.dim[u] > 0);
+}
+#endif
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Create the index for the chunks */
+    if((dset->shared->layout.storage.u.chunk.ops->create)(&idx_info) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create chunk index")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_lookup
+ *
+ * Purpose:	Loops up a chunk in cache and on disk, and retrieves
+ *              information about that chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Albert Cheng
+ *              June 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_lookup(const H5D_t *dset, hid_t dxpl_id, const hsize_t *chunk_offset,
+    hsize_t chunk_idx, H5D_chunk_ud_t *udata)
+{
+    H5D_rdcc_ent_t  *ent = NULL;        /* Cache entry */
+    hbool_t         found = FALSE;      /* In cache? */
+    unsigned        u;                  /* Counter */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dset);
+    HDassert(dset->shared->layout.u.chunk.ndims > 0);
+    HDassert(chunk_offset);
+    HDassert(udata);
+
+    /* Initialize the query information about the chunk we are looking for */
+    udata->common.layout = &(dset->shared->layout.u.chunk);
+    udata->common.storage = &(dset->shared->layout.storage.u.chunk);
+    udata->common.offset = chunk_offset;
+    udata->common.rdcc = &(dset->shared->cache.chunk);
+
+    /* Reset information about the chunk we are looking for */
+    udata->nbytes = 0;
+    udata->filter_mask = 0;
+    udata->addr = HADDR_UNDEF;
+
+    /* Check for chunk in cache */
+    if(dset->shared->cache.chunk.nslots > 0) {
+        udata->idx_hint = H5D_CHUNK_HASH(dset->shared, chunk_idx);
+        ent = dset->shared->cache.chunk.slot[udata->idx_hint];
+
+        if(ent)
+            for(u = 0, found = TRUE; u < dset->shared->layout.u.chunk.ndims - 1;
+                    u++)
+                if(chunk_offset[u] != ent->offset[u]) {
+                    found = FALSE;
+                    break;
+                } /* end if */
+    } /* end if */
+
+    /* Find chunk addr */
+    if(found)
+        udata->addr = ent->chunk_addr;
+    else {
+        /* Invalidate idx_hint, to signal that the chunk is not in cache */
+        udata->idx_hint = UINT_MAX;
+
+        /* Check for cached information */
+        if(!H5D__chunk_cinfo_cache_found(&dset->shared->cache.chunk.last, udata)) {
+            H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+
+            /* Compose chunked index info struct */
+            idx_info.f = dset->oloc.file;
+            idx_info.dxpl_id = dxpl_id;
+            idx_info.pline = &dset->shared->dcpl_cache.pline;
+            idx_info.layout = &dset->shared->layout.u.chunk;
+            idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+            /* Go get the chunk information */
+            if((dset->shared->layout.storage.u.chunk.ops->get_addr)(&idx_info, udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query chunk address")
+
+            /* Cache the information retrieved */
+            H5D__chunk_cinfo_cache_update(&dset->shared->cache.chunk.last, udata);
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_flush_entry
+ *
+ * Purpose:	Writes a chunk to disk.  If RESET is non-zero then the
+ *		entry is cleared -- it's slightly faster to flush a chunk if
+ *		the RESET flag is turned on because it results in one fewer
+ *		memory copy.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t *dxpl_cache,
+    H5D_rdcc_ent_t *ent, hbool_t reset)
+{
+    void	*buf = NULL;	        /* Temporary buffer		*/
+    hbool_t	point_of_no_return = FALSE;
+    herr_t	ret_value = SUCCEED;	/* Return value			*/
+
+    FUNC_ENTER_STATIC
+
+    HDassert(dset);
+    HDassert(dset->shared);
+    HDassert(dxpl_cache);
+    HDassert(ent);
+    HDassert(!ent->locked);
+
+    buf = ent->chunk;
+    if(ent->dirty && !ent->deleted) {
+        H5D_chunk_ud_t 	udata;		/* pass through B-tree		*/
+        hbool_t must_insert = FALSE;    /* Whether the chunk must go through the "insert" method */
+
+        /* Set up user data for index callbacks */
+        udata.common.layout = &dset->shared->layout.u.chunk;
+        udata.common.storage = &dset->shared->layout.storage.u.chunk;
+        udata.common.offset = ent->offset;
+        udata.common.rdcc = &(dset->shared->cache.chunk);
+        udata.filter_mask = 0;
+        udata.nbytes = dset->shared->layout.u.chunk.size;
+        udata.addr = ent->chunk_addr;
+
+        /* Should the chunk be filtered before writing it to disk? */
+        if(dset->shared->dcpl_cache.pline.nused) {
+            size_t alloc = udata.nbytes;        /* Bytes allocated for BUF	*/
+            size_t nbytes;                      /* Chunk size (in bytes) */
+
+            if(!reset) {
+                /*
+                 * Copy the chunk to a new buffer before running it through
+                 * the pipeline because we'll want to save the original buffer
+                 * for later.
+                 */
+                H5_CHECKED_ASSIGN(alloc, size_t, udata.nbytes, uint32_t);
+                if(NULL == (buf = H5MM_malloc(alloc)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline")
+                HDmemcpy(buf, ent->chunk, udata.nbytes);
+            } /* end if */
+            else {
+                /*
+                 * If we are reseting and something goes wrong after this
+                 * point then it's too late to recover because we may have
+                 * destroyed the original data by calling H5Z_pipeline().
+                 * The only safe option is to continue with the reset
+                 * even if we can't write the data to disk.
+                 */
+                point_of_no_return = TRUE;
+                ent->chunk = NULL;
+            } /* end else */
+            H5_CHECKED_ASSIGN(nbytes, size_t, udata.nbytes, uint32_t);
+            if(H5Z_pipeline(&(dset->shared->dcpl_cache.pline), 0, &(udata.filter_mask), dxpl_cache->err_detect,
+                     dxpl_cache->filter_cb, &nbytes, &alloc, &buf) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "output pipeline failed")
+#if H5_SIZEOF_SIZE_T > 4
+            /* Check for the chunk expanding too much to encode in a 32-bit value */
+            if(nbytes > ((size_t)0xffffffff))
+                HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "chunk too large for 32-bit length")
+#endif /* H5_SIZEOF_SIZE_T > 4 */
+            H5_CHECKED_ASSIGN(udata.nbytes, uint32_t, nbytes, size_t);
+
+            /* Indicate that the chunk must go through 'insert' method */
+            must_insert = TRUE;
+        } /* end if */
+        else if(!H5F_addr_defined(udata.addr))
+            /* Indicate that the chunk must go through 'insert' method */
+            must_insert = TRUE;
+
+        /* Check if the chunk needs to be 'inserted' (could exist already and
+         *      the 'insert' operation could resize it)
+         */
+        if(must_insert) {
+            H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+
+            /* Compose chunked index info struct */
+            idx_info.f = dset->oloc.file;
+            idx_info.dxpl_id = dxpl_id;
+            idx_info.pline = &dset->shared->dcpl_cache.pline;
+            idx_info.layout = &dset->shared->layout.u.chunk;
+            idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+            /* Create the chunk it if it doesn't exist, or reallocate the chunk
+             *  if its size changed.
+             */
+            if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+
+            /* Update the chunk entry's address, in case it was allocated or relocated */
+            ent->chunk_addr = udata.addr;
+        } /* end if */
+
+        /* Write the data to the file */
+        HDassert(H5F_addr_defined(udata.addr));
+        if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, udata.nbytes, dxpl_id, buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
+
+        /* Cache the chunk's info, in case it's accessed again shortly */
+        H5D__chunk_cinfo_cache_update(&dset->shared->cache.chunk.last, &udata);
+
+        /* Mark cache entry as clean */
+        ent->dirty = FALSE;
+
+        /* Increment # of flushed entries */
+        dset->shared->cache.chunk.stats.nflushes++;
+    } /* end if */
+
+    /* Reset, but do not free or removed from list */
+    if(reset) {
+        point_of_no_return = FALSE;
+        if(buf == ent->chunk)
+            buf = NULL;
+        if(ent->chunk != NULL)
+            ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
+    } /* end if */
+
+done:
+    /* Free the temp buffer only if it's different than the entry chunk */
+    if(buf != ent->chunk)
+        H5MM_xfree(buf);
+
+    /*
+     * If we reached the point of no return then we have no choice but to
+     * reset the entry.  This can only happen if RESET is true but the
+     * output pipeline failed.  Do not free the entry or remove it from the
+     * list.
+     */
+    if(ret_value < 0 && point_of_no_return) {
+        if(ent->chunk)
+            ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_flush_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_cache_evict
+ *
+ * Purpose:     Preempts the specified entry from the cache, flushing it to
+ *              disk if necessary.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_cache_evict(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t *dxpl_cache,
+    H5D_rdcc_ent_t *ent, hbool_t flush)
+{
+    H5D_rdcc_t *rdcc = &(dset->shared->cache.chunk);
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(dset);
+    HDassert(dxpl_cache);
+    HDassert(ent);
+    HDassert(!ent->locked);
+    HDassert(ent->idx < rdcc->nslots);
+
+    if(flush) {
+	/* Flush */
+	if(H5D__chunk_flush_entry(dset, dxpl_id, dxpl_cache, ent, TRUE) < 0)
+	    HDONE_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot flush indexed storage buffer")
+    } /* end if */
+    else {
+        /* Don't flush, just free chunk */
+	if(ent->chunk != NULL)
+	    ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
+    } /* end else */
+
+    /* Unlink from list */
+    if(ent->prev)
+	ent->prev->next = ent->next;
+    else
+	rdcc->head = ent->next;
+    if(ent->next)
+	ent->next->prev = ent->prev;
+    else
+	rdcc->tail = ent->prev;
+    ent->prev = ent->next = NULL;
+
+    /* Remove from cache */
+    rdcc->slot[ent->idx] = NULL;
+    ent->idx = UINT_MAX;
+    rdcc->nbytes_used -= dset->shared->layout.u.chunk.size;
+    --rdcc->nused;
+
+    /* Free */
+    ent = H5FL_FREE(H5D_rdcc_ent_t, ent);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_cache_evict() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_cache_prune
+ *
+ * Purpose:	Prune the cache by preempting some things until the cache has
+ *		room for something which is SIZE bytes.  Only unlocked
+ *		entries are considered for preemption.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_cache_prune(const H5D_t *dset, hid_t dxpl_id,
+    const H5D_dxpl_cache_t *dxpl_cache, size_t size)
+{
+    const H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);
+    size_t		total = rdcc->nbytes_max;
+    const int		nmeth = 2;	/*number of methods		*/
+    int		        w[1];		/*weighting as an interval	*/
+    H5D_rdcc_ent_t	*p[2], *cur;	/*list pointers			*/
+    H5D_rdcc_ent_t	*n[2];		/*list next pointers		*/
+    int		nerrors = 0;            /* Accumulated error count during preemptions */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Preemption is accomplished by having multiple pointers (currently two)
+     * slide down the list beginning at the head. Pointer p(N+1) will start
+     * traversing the list when pointer pN reaches wN percent of the original
+     * list.  In other words, preemption method N gets to consider entries in
+     * approximate least recently used order w0 percent before method N+1
+     * where 100% means tha method N will run to completion before method N+1
+     * begins.  The pointers participating in the list traversal are each
+     * given a chance at preemption before any of the pointers are advanced.
+     */
+    w[0] = (int)(rdcc->nused * rdcc->w0);
+    p[0] = rdcc->head;
+    p[1] = NULL;
+
+    while((p[0] || p[1]) && (rdcc->nbytes_used + size) > total) {
+        int i;          /* Local index variable */
+
+	/* Introduce new pointers */
+	for(i = 0; i < nmeth - 1; i++)
+            if(0 == w[i])
+                p[i + 1] = rdcc->head;
+
+	/* Compute next value for each pointer */
+	for(i = 0; i < nmeth; i++)
+            n[i] = p[i] ? p[i]->next : NULL;
+
+	/* Give each method a chance */
+	for(i = 0; i < nmeth && (rdcc->nbytes_used + size) > total; i++) {
+	    if(0 == i && p[0] && !p[0]->locked &&
+                    ((0 == p[0]->rd_count && 0 == p[0]->wr_count) ||
+                     (0 == p[0]->rd_count && dset->shared->layout.u.chunk.size == p[0]->wr_count) ||
+                     (dset->shared->layout.u.chunk.size == p[0]->rd_count && 0 == p[0]->wr_count))) {
+		/*
+		 * Method 0: Preempt entries that have been completely written
+		 * and/or completely read but not entries that are partially
+		 * written or partially read.
+		 */
+		cur = p[0];
+	    } else if(1 == i && p[1] && !p[1]->locked) {
+		/*
+		 * Method 1: Preempt the entry without regard to
+		 * considerations other than being locked.  This is the last
+		 * resort preemption.
+		 */
+		cur = p[1];
+	    } else {
+		/* Nothing to preempt at this point */
+		cur = NULL;
+	    }
+
+	    if(cur) {
+                int j;          /* Local index variable */
+
+		for(j = 0; j < nmeth; j++) {
+		    if(p[j] == cur)
+                        p[j] = NULL;
+		    if(n[j] == cur)
+                        n[j] = cur->next;
+		} /* end for */
+		if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, cur, TRUE) < 0)
+                    nerrors++;
+	    } /* end if */
+	} /* end for */
+
+	/* Advance pointers */
+	for(i = 0; i < nmeth; i++)
+            p[i] = n[i];
+	for(i = 0; i < nmeth - 1; i++)
+            w[i] -= 1;
+    } /* end while */
+
+    if(nerrors)
+	HGOTO_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to preempt one or more raw data cache entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_cache_prune() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_lock
+ *
+ * Purpose:	Return a pointer to a dataset chunk.  The pointer points
+ *		directly into the chunk cache and should not be freed
+ *		by the caller but will be valid until it is unlocked.  The
+ *		input value IDX_HINT is used to speed up cache lookups and
+ *		it's output value should be given to H5D__chunk_unlock().
+ *		IDX_HINT is ignored if it is out of range, and if it points
+ *		to the wrong entry then we fall back to the normal search
+ *		method.
+ *
+ *		If RELAX is non-zero and the chunk isn't in the cache then
+ *		don't try to read it from the file, but just allocate an
+ *		uninitialized buffer to hold the result.  This is intended
+ *		for output functions that are about to overwrite the entire
+ *		chunk.
+ *
+ * Return:	Success:	Ptr to a file chunk.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
+    hbool_t relax)
+{
+    const H5D_t         *dset = io_info->dset;  /* Local pointer to the dataset info */
+    const H5O_pline_t   *pline = &(dset->shared->dcpl_cache.pline); /* I/O pipeline info - always equal to the pline passed to H5D__chunk_alloc */
+    const H5O_layout_t  *layout = &(dset->shared->layout); /* Dataset layout */
+    const H5O_fill_t    *fill = &(dset->shared->dcpl_cache.fill); /* Fill value info */
+    H5D_fill_buf_info_t fb_info;                /* Dataset's fill buffer info */
+    hbool_t             fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    H5D_rdcc_t		*rdcc = &(dset->shared->cache.chunk); /*raw data chunk cache*/
+    H5D_rdcc_ent_t	*ent = NULL;		/*cache entry		*/
+    haddr_t             chunk_addr = HADDR_UNDEF; /* Address of chunk on disk */
+    size_t		chunk_size;		/*size of a chunk	*/
+    void		*chunk = NULL;		/*the file chunk	*/
+    void		*ret_value;	        /*return value		*/
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(io_info);
+    HDassert(io_info->dxpl_cache);
+    HDassert(io_info->store);
+    HDassert(udata);
+    HDassert(dset);
+    HDassert(TRUE == H5P_isa_class(io_info->dxpl_id, H5P_DATASET_XFER));
+
+    /* Get the chunk's size */
+    HDassert(layout->u.chunk.size > 0);
+    H5_CHECKED_ASSIGN(chunk_size, size_t, layout->u.chunk.size, uint32_t);
+
+    /* Check if the chunk is in the cache */
+    if(UINT_MAX != udata->idx_hint) {
+        /* Sanity check */
+        HDassert(udata->idx_hint < rdcc->nslots);
+        HDassert(rdcc->slot[udata->idx_hint]);
+
+        /* Get the entry */
+        ent = rdcc->slot[udata->idx_hint];
+
+#ifndef NDEBUG
+{
+        unsigned		u;			/*counters		*/
+
+        /* Make sure this is the right chunk */
+        for(u = 0; u < layout->u.chunk.ndims; u++)
+            HDassert(io_info->store->chunk.offset[u] == ent->offset[u]);
+}
+#endif /* NDEBUG */
+
+        /*
+         * Already in the cache.  Count a hit.
+         */
+        rdcc->stats.nhits++;
+    } /* end if */
+    else if(relax) {
+        /*
+         * Not in the cache, but we're about to overwrite the whole thing
+         * anyway, so just allocate a buffer for it but don't initialize that
+         * buffer with the file contents. Count this as a hit instead of a
+         * miss because we saved ourselves lots of work.
+         */
+        rdcc->stats.nhits++;
+
+        /* Still save the chunk address so the cache stays consistent */
+        chunk_addr = udata->addr;
+
+        if(NULL == (chunk = H5D__chunk_alloc(chunk_size, pline)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+
+        /* In the case that some dataset functions look through this data,
+         * clear it to all 0s. */
+        HDmemset(chunk, 0, chunk_size);
+    } /* end if */
+    else {
+        /*
+         * Not in the cache.  Count this as a miss if it's in the file
+         *      or an init if it isn't.
+         */
+
+        /* Save the chunk address */
+        chunk_addr = udata->addr;
+
+        /* Check if the chunk exists on disk */
+        if(H5F_addr_defined(chunk_addr)) {
+            size_t		chunk_alloc = 0;		/*allocated chunk size	*/
+
+            /* Chunk size on disk isn't [likely] the same size as the final chunk
+             * size in memory, so allocate memory big enough. */
+            H5_CHECKED_ASSIGN(chunk_alloc, size_t, udata->nbytes, uint32_t);
+            if(NULL == (chunk = H5D__chunk_alloc(chunk_alloc, pline)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+            if(H5F_block_read(dset->oloc.file, H5FD_MEM_DRAW, chunk_addr, chunk_alloc, io_info->dxpl_id, chunk) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "unable to read raw data chunk")
+
+            if(pline->nused) {
+                if(H5Z_pipeline(pline, H5Z_FLAG_REVERSE, &(udata->filter_mask), io_info->dxpl_cache->err_detect,
+                        io_info->dxpl_cache->filter_cb, &chunk_alloc, &chunk_alloc, &chunk) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, NULL, "data pipeline read failed")
+                H5_CHECKED_ASSIGN(udata->nbytes, uint32_t, chunk_alloc, size_t);
+            } /* end if */
+
+            /* Increment # of cache misses */
+            rdcc->stats.nmisses++;
+        } /* end if */
+        else {
+            H5D_fill_value_t	fill_status;
+
+            /* Sanity check */
+            HDassert(fill->alloc_time != H5D_ALLOC_TIME_EARLY);
+
+            /* Chunk size on disk isn't [likely] the same size as the final chunk
+             * size in memory, so allocate memory big enough. */
+            if(NULL == (chunk = H5D__chunk_alloc(chunk_size, pline)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+
+            if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't tell if fill value defined")
+
+            if(fill->fill_time == H5D_FILL_TIME_ALLOC ||
+                    (fill->fill_time == H5D_FILL_TIME_IFSET &&
+                     (fill_status == H5D_FILL_VALUE_USER_DEFINED ||
+                      fill_status == H5D_FILL_VALUE_DEFAULT))) {
+                /*
+                 * The chunk doesn't exist in the file.  Replicate the fill
+                 * value throughout the chunk, if the fill value is defined.
+                 */
+
+                /* Initialize the fill value buffer */
+                /* (use the compact dataset storage buffer as the fill value buffer) */
+                if(H5D__fill_init(&fb_info, chunk, NULL, NULL, NULL, NULL,
+                        &dset->shared->dcpl_cache.fill, dset->shared->type,
+                        dset->shared->type_id, (size_t)0, chunk_size, io_info->dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't initialize fill buffer info")
+                fb_info_init = TRUE;
+
+                /* Check for VL datatype & non-default fill value */
+                if(fb_info.has_vlen_fill_type)
+                    /* Fill the buffer with VL datatype fill values */
+                    if(H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, io_info->dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, NULL, "can't refill fill value buffer")
+            } /* end if */
+            else
+                HDmemset(chunk, 0, chunk_size);
+
+            /* Increment # of creations */
+            rdcc->stats.ninits++;
+        } /* end else */
+    } /* end else */
+    HDassert(chunk_size > 0);
+
+    if(ent) {
+        /*
+         * The chunk is not at the beginning of the cache; move it backward
+         * by one slot.  This is how we implement the LRU preemption
+         * algorithm.
+         */
+        HDassert(ent);
+        if(ent->next) {
+            if(ent->next->next)
+                ent->next->next->prev = ent;
+            else
+                rdcc->tail = ent;
+            ent->next->prev = ent->prev;
+            if(ent->prev)
+                ent->prev->next = ent->next;
+            else
+                rdcc->head = ent->next;
+            ent->prev = ent->next;
+            ent->next = ent->next->next;
+            ent->prev->next = ent;
+        } /* end if */
+    } /* end if */
+    else if(rdcc->nslots > 0 && chunk_size <= rdcc->nbytes_max) {
+        /* Calculate the index */
+        udata->idx_hint = H5D_CHUNK_HASH(dset->shared, io_info->store->chunk.index);
+
+        /* Add the chunk to the cache only if the slot is not already locked */
+        ent = rdcc->slot[udata->idx_hint];
+        if(!ent || !ent->locked) {
+            /* Preempt enough things from the cache to make room */
+            if(ent) {
+                if(H5D__chunk_cache_evict(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, ent, TRUE) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk from cache")
+            } /* end if */
+            if(H5D__chunk_cache_prune(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, chunk_size) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk(s) from cache")
+
+            /* Create a new entry */
+            if(NULL == (ent = H5FL_CALLOC(H5D_rdcc_ent_t)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate raw data chunk entry")
+
+            /* Initialize the new entry */
+            ent->chunk_addr = chunk_addr;
+            HDmemcpy(ent->offset, io_info->store->chunk.offset, sizeof(hsize_t) * layout->u.chunk.ndims);
+            H5_CHECKED_ASSIGN(ent->rd_count, uint32_t, chunk_size, size_t);
+            H5_CHECKED_ASSIGN(ent->wr_count, uint32_t, chunk_size, size_t);
+            ent->chunk = (uint8_t *)chunk;
+
+            /* Add it to the cache */
+            HDassert(NULL == rdcc->slot[udata->idx_hint]);
+            rdcc->slot[udata->idx_hint] = ent;
+            ent->idx = udata->idx_hint;
+            rdcc->nbytes_used += chunk_size;
+            rdcc->nused++;
+
+            /* Add it to the linked list */
+            if(rdcc->tail) {
+                rdcc->tail->next = ent;
+                ent->prev = rdcc->tail;
+                rdcc->tail = ent;
+            } /* end if */
+            else
+                rdcc->head = rdcc->tail = ent;
+        } /* end if */
+        else
+            /* We did not add the chunk to cache */
+            ent = NULL;
+    } /* end else */
+
+    if(!ent)
+        /*
+         * The chunk cannot be placed in cache so we don't cache it. This is the
+         * reason all those arguments have to be repeated for the unlock
+         * function.
+         */
+        udata->idx_hint = UINT_MAX;
+
+    /* Lock the chunk into the cache */
+    if(ent) {
+        HDassert(!ent->locked);
+        ent->locked = TRUE;
+        chunk = ent->chunk;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = chunk;
+
+done:
+    /* Release the fill buffer info, if it's been initialized */
+    if(fb_info_init && H5D__fill_term(&fb_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, NULL, "Can't release fill buffer info")
+
+    /* Release the chunk allocated, on error */
+    if(!ret_value)
+        if(chunk)
+            chunk = H5D__chunk_xfree(chunk, pline);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_unlock
+ *
+ * Purpose:	Unlocks a previously locked chunk. The LAYOUT, COMP, and
+ *		OFFSET arguments should be the same as for H5D__chunk_lock().
+ *		The DIRTY argument should be set to non-zero if the chunk has
+ *		been modified since it was locked. The IDX_HINT argument is
+ *		the returned index hint from the lock operation and BUF is
+ *		the return value from the lock.
+ *
+ *		The NACCESSED argument should be the number of bytes accessed
+ *		for reading or writing (depending on the value of DIRTY).
+ *		It's only purpose is to provide additional information to the
+ *		preemption policy.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_unlock(const H5D_io_info_t *io_info, const H5D_chunk_ud_t *udata,
+    hbool_t dirty, void *chunk, uint32_t naccessed)
+{
+    const H5O_layout_t *layout = &(io_info->dset->shared->layout); /* Dataset layout */
+    const H5D_rdcc_t	*rdcc = &(io_info->dset->shared->cache.chunk);
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(io_info);
+    HDassert(udata);
+
+    if(UINT_MAX == udata->idx_hint) {
+        /*
+         * It's not in the cache, probably because it's too big.  If it's
+         * dirty then flush it to disk.  In any case, free the chunk.
+         * Note: we have to copy the layout and filter messages so we
+         *	 don't discard the `const' qualifier.
+         */
+        if(dirty) {
+            H5D_rdcc_ent_t fake_ent;         /* "fake" chunk cache entry */
+
+            HDmemset(&fake_ent, 0, sizeof(fake_ent));
+            fake_ent.dirty = TRUE;
+            HDmemcpy(fake_ent.offset, io_info->store->chunk.offset, layout->u.chunk.ndims * sizeof(fake_ent.offset[0]));
+            HDassert(layout->u.chunk.size > 0);
+            fake_ent.chunk_addr = udata->addr;
+            fake_ent.chunk = (uint8_t *)chunk;
+
+            if(H5D__chunk_flush_entry(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, &fake_ent, TRUE) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot flush indexed storage buffer")
+        } /* end if */
+        else {
+            if(chunk)
+                chunk = H5D__chunk_xfree(chunk, &(io_info->dset->shared->dcpl_cache.pline));
+        } /* end else */
+    } /* end if */
+    else {
+        H5D_rdcc_ent_t	*ent;   /* Chunk's entry in the cache */
+
+        /* Sanity check */
+	HDassert(udata->idx_hint < rdcc->nslots);
+	HDassert(rdcc->slot[udata->idx_hint]);
+	HDassert(rdcc->slot[udata->idx_hint]->chunk == chunk);
+
+        /*
+         * It's in the cache so unlock it.
+         */
+        ent = rdcc->slot[udata->idx_hint];
+        HDassert(ent->locked);
+        if(dirty) {
+            ent->dirty = TRUE;
+            ent->wr_count -= MIN(ent->wr_count, naccessed);
+        } /* end if */
+        else
+            ent->rd_count -= MIN(ent->rd_count, naccessed);
+        ent->locked = FALSE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_unlock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_allocated_cb
+ *
+ * Purpose:	Simply counts the number of chunks for a dataset.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 21, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static int
+H5D__chunk_allocated_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    hsize_t *nbytes = (hsize_t *)_udata;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    *(hsize_t *)nbytes += chunk_rec->nbytes;
+
+    FUNC_LEAVE_NOAPI(H5_ITER_CONT)
+} /* H5D__chunk_allocated_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_allocated
+ *
+ * Purpose:	Return the number of bytes allocated in the file for storage
+ *		of raw data in the chunked dataset
+ *
+ * Return:	Success:	Number of bytes stored in all chunks.
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_allocated(H5D_t *dset, hid_t dxpl_id, hsize_t *nbytes)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    const H5D_rdcc_t   *rdcc = &(dset->shared->cache.chunk);	/* Raw data chunk cache */
+    H5D_rdcc_ent_t     *ent;            /* Cache entry  */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    hsize_t chunk_bytes = 0;            /* Number of bytes allocated for chunks */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dset);
+    HDassert(dset->shared);
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Search for cached chunks that haven't been written out */
+    for(ent = rdcc->head; ent; ent = ent->next) {
+        /* Flush the chunk out to disk, to make certain the size is correct later */
+        if(H5D__chunk_flush_entry(dset, dxpl_id, dxpl_cache, ent, FALSE) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot flush indexed storage buffer")
+    } /* end for */
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Iterate over the chunks */
+    if((dset->shared->layout.storage.u.chunk.ops->iterate)(&idx_info, H5D__chunk_allocated_cb, &chunk_bytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve allocated chunk information from index")
+
+    /* Set number of bytes for caller */
+    *nbytes = chunk_bytes;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_allocated() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_allocate
+ *
+ * Purpose:	Allocate file space for all chunks that are not allocated yet.
+ *		Return SUCCEED if all needed allocation succeed, otherwise
+ *		FAIL.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Albert Cheng
+ *		June 26, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
+    hsize_t old_dim[])
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    const H5D_chunk_ops_t *ops = dset->shared->layout.storage.u.chunk.ops;      /* Chunk operations */
+    hsize_t     min_unalloc[H5O_LAYOUT_NDIMS]; /* First chunk in each dimension that is unallocated */
+    hsize_t     max_unalloc[H5O_LAYOUT_NDIMS]; /* Last chunk in each dimension that is unallocated */
+    hsize_t	chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */
+    size_t	orig_chunk_size; /* Original size of chunk in bytes */
+    size_t      chunk_size;      /* Actual size of chunk in bytes, possibly filtered */
+    unsigned    filter_mask = 0; /* Filter mask for chunks that have them */
+    const H5O_layout_t *layout = &(dset->shared->layout);       /* Dataset layout */
+    const H5O_pline_t *pline = &(dset->shared->dcpl_cache.pline);    /* I/O pipeline info */
+    const H5O_fill_t *fill = &(dset->shared->dcpl_cache.fill);    /* Fill value info */
+    H5D_fill_value_t fill_status; /* The fill value status */
+    hbool_t     should_fill = FALSE; /* Whether fill values should be written */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+#ifdef H5_HAVE_PARALLEL
+    hbool_t     blocks_written = FALSE; /* Flag to indicate that chunk was actually written */
+    hbool_t     using_mpi = FALSE;    /* Flag to indicate that the file is being accessed with an MPI-capable file driver */
+    H5D_chunk_coll_info_t chunk_info; /* chunk address information for doing I/O */
+#endif /* H5_HAVE_PARALLEL */
+    hbool_t	carry;          /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
+    int         space_ndims;    /* Dataset's space rank */
+    hsize_t     space_dim[H5O_LAYOUT_NDIMS];    /* Dataset's dataspace dimensions */
+    const uint32_t *chunk_dim = layout->u.chunk.dim; /* Convenience pointer to chunk dimensions */
+    int         op_dim;                 /* Current operationg dimension */
+    H5D_fill_buf_info_t fb_info;        /* Dataset's fill buffer info */
+    hbool_t     fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset && H5D_CHUNKED == layout->type);
+    HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
+
+    /* Retrieve the dataset dimensions */
+    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim, NULL)) < 0)
+         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple dataspace info")
+    space_dim[space_ndims] = layout->u.chunk.dim[space_ndims];
+
+    /* The last dimension in chunk_offset is always 0 */
+    chunk_offset[space_ndims] = (hsize_t)0;
+
+    /* Check if any space dimensions are 0, if so we do not have to do anything
+     */
+    for(op_dim=0; op_dim<space_ndims; op_dim++)
+        if(space_dim[op_dim] == 0) {
+            /* Reset any cached chunk info for this dataset */
+            H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Retrieve MPI parameters */
+    if(H5F_HAS_FEATURE(dset->oloc.file, H5FD_FEAT_HAS_MPI)) {
+        /* Set the MPI-capable file driver flag */
+        using_mpi = TRUE;
+
+        /* init chunk info stuff for collective I/O */
+        chunk_info.num_io = 0;
+        chunk_info.addr = NULL;
+    } /* end if */
+#endif  /* H5_HAVE_PARALLEL */
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Get original chunk size */
+    H5_CHECKED_ASSIGN(orig_chunk_size, size_t, layout->u.chunk.size, uint32_t);
+
+    /* Check the dataset's fill-value status */
+    if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+    /* If we are filling the dataset on allocation or "if set" and
+     * the fill value _is_ set, _and_ we are not overwriting the new blocks,
+     * or if there are any pipeline filters defined,
+     * set the "should fill" flag
+     */
+    if((!full_overwrite && (fill->fill_time == H5D_FILL_TIME_ALLOC ||
+            (fill->fill_time == H5D_FILL_TIME_IFSET &&
+             (fill_status == H5D_FILL_VALUE_USER_DEFINED ||
+              fill_status == H5D_FILL_VALUE_DEFAULT))))
+            || pline->nused > 0)
+        should_fill = TRUE;
+
+    /* Check if fill values should be written to chunks */
+    if(should_fill) {
+        /* Initialize the fill value buffer */
+        /* (delay allocating fill buffer for VL datatypes until refilling) */
+        /* (casting away const OK - QAK) */
+        if(H5D__fill_init(&fb_info, NULL, (H5MM_allocate_t)H5D__chunk_alloc,
+                (void *)pline, (H5MM_free_t)H5D__chunk_xfree, (void *)pline,
+                &dset->shared->dcpl_cache.fill, dset->shared->type,
+                dset->shared->type_id, (size_t)0, orig_chunk_size, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
+        fb_info_init = TRUE;
+
+        /* Check if there are filters which need to be applied to the chunk */
+        /* (only do this in advance when the chunk info can be re-used (i.e.
+         *      it doesn't contain any non-default VL datatype fill values)
+         */
+        if(!fb_info.has_vlen_fill_type && pline->nused > 0) {
+            size_t buf_size = orig_chunk_size;
+
+            /* Push the chunk through the filters */
+            if(H5Z_pipeline(pline, 0, &filter_mask, dxpl_cache->err_detect, dxpl_cache->filter_cb, &orig_chunk_size, &buf_size, &fb_info.fill_buf) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "output pipeline failed")
+#if H5_SIZEOF_SIZE_T > 4
+            /* Check for the chunk expanding too much to encode in a 32-bit value */
+            if(orig_chunk_size > ((size_t)0xffffffff))
+                HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "chunk too large for 32-bit length")
+#endif /* H5_SIZEOF_SIZE_T > 4 */
+        } /* end if */
+    } /* end if */
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Calculate the minimum and maximum chunk offsets in each dimension.  Note
+     * that we assume here that all elements of space_dim are > 0.  This is
+     * checked at the top of this function */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        min_unalloc[op_dim] = ((old_dim[op_dim] + chunk_dim[op_dim] - 1)
+                / chunk_dim[op_dim]) * chunk_dim[op_dim];
+        max_unalloc[op_dim] = ((space_dim[op_dim] - 1) / chunk_dim[op_dim])
+                * chunk_dim[op_dim];
+    } /* end for */
+
+    /* Loop over all chunks */
+    /* The algorithm is:
+     *  For each dimension:
+     *   -Allocate all chunks in the new dataspace that are beyond the original
+     *    dataspace in the operating dimension, except those that have already
+     *    been allocated.
+     *
+     * This is accomplished mainly using the min_unalloc and max_unalloc arrays.
+     * min_unalloc represents the lowest offset in each dimension of chunks that
+     * have not been allocated (whether or not they need to be).  max_unalloc
+     * represents the highest offset in each dimension of chunks in the new
+     * dataset that have not been allocated by this routine (they may have been
+     * allocated previously).
+     *
+     * Every time the algorithm finishes allocating chunks allocated beyond a
+     * certain dimension, max_unalloc is updated in order to avoid allocating
+     * those chunks again.
+     */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        H5D_chunk_ud_t udata;   /* User data for querying chunk info */
+        int i;                  /* Local index variable */
+
+        /* Check if allocation along this dimension is really necessary */
+        if(min_unalloc[op_dim] > max_unalloc[op_dim])
+            continue;
+        else {
+            /* Reset the chunk offset indices */
+            HDmemset(chunk_offset, 0, ((unsigned)space_ndims * sizeof(chunk_offset[0])));
+            chunk_offset[op_dim] = min_unalloc[op_dim];
+
+            carry = FALSE;
+        } /* end else */
+
+        while(!carry) {
+            /* Reset size of chunk in bytes, in case filtered size changes */
+            chunk_size = orig_chunk_size;
+
+#ifndef NDEBUG
+            /* None of the chunks should be allocated */
+            {
+                hsize_t chunk_idx;
+
+                /* Calculate the index of this chunk */
+                if(H5VM_chunk_index((unsigned)space_ndims, chunk_offset,
+                        layout->u.chunk.dim, layout->u.chunk.down_chunks,
+                        &chunk_idx) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
+
+                if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+
+                HDassert(!H5F_addr_defined(udata.addr));
+            } /* end block */
+
+            /* Make sure the chunk is really in the dataset and outside the
+             * original dimensions */
+            {
+                unsigned u;             /* Local index variable */
+                hbool_t outside_orig = FALSE;
+
+                for(u = 0; u < (unsigned)space_ndims; u++) {
+                    HDassert(chunk_offset[u] < space_dim[u]);
+                    if(chunk_offset[u] >= old_dim[u])
+                        outside_orig = TRUE;
+                } /* end for */
+                HDassert(outside_orig);
+            } /* end block */
+#endif /* NDEBUG */
+
+            /* Check for VL datatype & non-default fill value */
+            if(fb_info_init && fb_info.has_vlen_fill_type) {
+                /* Sanity check */
+                HDassert(should_fill);
+#ifdef H5_HAVE_PARALLEL
+                HDassert(!using_mpi);   /* Can't write VL datatypes in parallel currently */
+#endif
+
+                /* Check to make sure the buffer is large enough.  It is
+                 * possible (though ill-advised) for the filter to shrink the
+                 * buffer. */
+                if(fb_info.fill_buf_size < orig_chunk_size) {
+                    if(NULL == (fb_info.fill_buf = H5D__chunk_realloc(
+                            fb_info.fill_buf, orig_chunk_size, pline)))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for raw data chunk")
+                    fb_info.fill_buf_size = orig_chunk_size;
+                } /* end if */
+
+                /* Fill the buffer with VL datatype fill values */
+                if(H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
+
+                /* Check if there are filters which need to be applied to the chunk */
+                if(pline->nused > 0) {
+                    size_t nbytes = orig_chunk_size;
+
+                    /* Push the chunk through the filters */
+                    if(H5Z_pipeline(pline, 0, &filter_mask, dxpl_cache->err_detect, dxpl_cache->filter_cb, &nbytes, &fb_info.fill_buf_size, &fb_info.fill_buf) < 0)
+                        HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "output pipeline failed")
+
+#if H5_SIZEOF_SIZE_T > 4
+                    /* Check for the chunk expanding too much to encode in a 32-bit value */
+                    if(nbytes > ((size_t)0xffffffff))
+                        HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "chunk too large for 32-bit length")
+#endif /* H5_SIZEOF_SIZE_T > 4 */
+
+                    /* Keep the number of bytes the chunk turned in to */
+                    chunk_size = nbytes;
+                } /* end if */
+            } /* end if */
+
+            /* Initialize the chunk information */
+            udata.common.layout = &layout->u.chunk;
+            udata.common.storage = &layout->storage.u.chunk;
+            udata.common.offset = chunk_offset;
+            udata.common.rdcc = NULL;
+            H5_CHECKED_ASSIGN(udata.nbytes, uint32_t, chunk_size, size_t);
+            udata.filter_mask = filter_mask;
+            udata.addr = HADDR_UNDEF;
+
+            /* Allocate the chunk with all processes */
+            if((ops->insert)(&idx_info, &udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert record into chunk index")
+            HDassert(H5F_addr_defined(udata.addr));
+
+            /* Check if fill values should be written to chunks */
+            if(should_fill) {
+                /* Sanity check */
+                HDassert(fb_info_init);
+                HDassert(udata.nbytes == chunk_size);
+
+#ifdef H5_HAVE_PARALLEL
+                /* Check if this file is accessed with an MPI-capable file driver */
+                if(using_mpi) {
+                    /* collect all chunk addresses to be written to
+                       write collectively at the end */
+                    /* allocate/resize address array if no more space left */
+                    if(0 == chunk_info.num_io % 1024) {
+                        if(NULL == (chunk_info.addr = (haddr_t *)HDrealloc
+                                    (chunk_info.addr, (chunk_info.num_io + 1024) * sizeof(haddr_t))))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed for chunk addresses");
+                    } /* end if */
+
+                    /* Store the chunk's address for later */
+                    chunk_info.addr[chunk_info.num_io] = udata.addr;
+                    chunk_info.num_io++;
+
+                    /* Indicate that blocks will be written */
+                    blocks_written = TRUE;
+                } /* end if */
+                else {
+#endif /* H5_HAVE_PARALLEL */
+                    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, chunk_size, 
+                                       dxpl_id, fb_info.fill_buf) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
+#ifdef H5_HAVE_PARALLEL
+                } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+            } /* end if */
+
+            /* Increment indices */
+            carry = TRUE;
+            for(i = ((int)space_ndims - 1); i >= 0; --i) {
+                chunk_offset[i] += chunk_dim[i];
+                if(chunk_offset[i] > max_unalloc[i]) {
+                    if(i == op_dim)
+                        chunk_offset[i] = min_unalloc[i];
+                    else
+                        chunk_offset[i] = 0;
+		} /* end if */
+                else {
+                    carry = FALSE;
+                    break;
+                } /* end else */
+            } /* end for */
+        } /* end while(!carry) */
+
+        /* Adjust max_unalloc so we don't allocate the same chunk twice.  Also
+         * check if this dimension started from 0 (and hence allocated all of
+         * the chunks. */
+        if(min_unalloc[op_dim] == 0)
+            break;
+        else
+            max_unalloc[op_dim] = min_unalloc[op_dim] - chunk_dim[op_dim];
+    } /* end for(op_dim=0...) */
+
+#ifdef H5_HAVE_PARALLEL
+    /* do final collective I/O */
+    if(using_mpi && blocks_written) {
+        if(H5D__chunk_collective_fill(dset, dxpl_id, &chunk_info, chunk_size, fb_info.fill_buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Reset any cached chunk info for this dataset */
+    H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+
+done:
+    /* Release the fill buffer info, if it's been initialized */
+    if(fb_info_init && H5D__fill_term(&fb_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+#ifdef H5_HAVE_PARALLEL
+    if(using_mpi) {
+        if(chunk_info.addr)
+            HDfree(chunk_info.addr);
+    } /* end if */
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_allocate() */
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_collective_fill
+ *
+ * Purpose:     Use MPIO collective write to fill the chunks (if number of
+ *              chunks to fill is greater than the number of MPI procs; 
+ *              otherwise use independent I/O).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ * 		July 30, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_collective_fill(const H5D_t *dset, hid_t dxpl_id,
+    H5D_chunk_coll_info_t *chunk_info, size_t chunk_size, const void *fill_buf)
+{
+    MPI_Comm	mpi_comm = MPI_COMM_NULL;	/* MPI communicator for file */
+    int         mpi_rank = (-1);    /* This process's rank  */
+    int         mpi_size = (-1);    /* MPI Comm size  */
+    int         mpi_code;           /* MPI return code */
+    size_t      num_blocks;         /* Number of blocks between processes. */
+    size_t      leftover_blocks;    /* Number of leftover blocks to handle */
+    int         blocks, leftover, block_len; /* converted to int for MPI */
+    MPI_Aint    *chunk_disp_array = NULL;
+    int         *block_lens = NULL;
+    MPI_Datatype mem_type, file_type;
+    hid_t       data_dxpl_id = -1;  /* DXPL ID to use for raw data I/O operations */
+    int         i;                  /* Local index variable */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the MPI communicator */
+    if(MPI_COMM_NULL == (mpi_comm = H5F_mpi_get_comm(dset->oloc.file)))
+        HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator")
+
+    /* Get the MPI rank */
+    if((mpi_rank = H5F_mpi_get_rank(dset->oloc.file)) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank")
+
+    /* Get the MPI size */
+    if((mpi_size = H5F_mpi_get_size(dset->oloc.file)) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI size")
+
+    /* Get a copy of the DXPL, to modify */
+    if((data_dxpl_id = H5P_copy_plist((H5P_genplist_t *)H5I_object(dxpl_id), TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property list")
+
+    /* Distribute evenly the number of blocks between processes. */
+    num_blocks = chunk_info->num_io / mpi_size; /* value should be the same on all procs */
+
+    /* after evenly distributing the blocks between processes, are
+       there any leftover blocks for each individual process
+       (round-robin) */
+    leftover_blocks = chunk_info->num_io % mpi_size;
+
+    /* Cast values to types needed by MPI */
+    H5_CHECKED_ASSIGN(blocks, int, num_blocks, size_t);
+    H5_CHECKED_ASSIGN(leftover, int, leftover_blocks, size_t);
+    H5_CHECKED_ASSIGN(block_len, int,  chunk_size, size_t);
+
+    /* Allocate buffers */
+    /* (MSC - should not need block_lens if MPI_type_create_hindexed_block is working) */
+    if(NULL == (block_lens = (int *)H5MM_malloc((blocks + 1) * sizeof(int))))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk lengths buffer")
+    if(NULL == (chunk_disp_array = (MPI_Aint *)H5MM_malloc((blocks + 1) * sizeof(MPI_Aint))))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk file displacement buffer")
+
+    for(i = 0 ; i < blocks ; i++) {
+        /* store the chunk address as an MPI_Aint */
+        chunk_disp_array[i] = (MPI_Aint)(chunk_info->addr[i + mpi_rank*blocks]);
+
+        /* MSC - should not need this if MPI_type_create_hindexed_block is working */
+        block_lens[i] = block_len;
+
+        /* make sure that the addresses in the datatype are
+           monotonically non decreasing */
+        if(i)
+            HDassert(chunk_disp_array[i] > chunk_disp_array[i - 1]);
+    } /* end if */
+
+    /* calculate if there are any leftover blocks after evenly
+       distributing. If there are, then round robin the distribution
+       to processes 0 -> leftover. */
+    if(leftover && leftover > mpi_rank) {
+        chunk_disp_array[blocks] = (MPI_Aint)chunk_info->addr[blocks*mpi_size + mpi_rank];        
+        block_lens[blocks] = block_len;
+        blocks++;
+    }
+
+    /* MSC
+     * should not have a special case for blocks == 0, but ompi (as of 1.8.1) has a bug 
+     * in file_set_view when a zero size datatype is create with hindexed or hvector.
+     */
+    if(0 == blocks) {
+        mpi_code = MPI_Type_contiguous(0, MPI_BYTE, &file_type);
+        if(mpi_code != MPI_SUCCESS)
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
+        mpi_code = MPI_Type_contiguous(0, MPI_BYTE, &mem_type);
+        if(mpi_code != MPI_SUCCESS)
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
+    }
+    else {
+        /* MSC 
+         * should use this if MPI_type_create_hindexed block is working 
+         * mpi_code = MPI_Type_create_hindexed_block(blocks, block_len, chunk_disp_array, MPI_BYTE, &file_type);
+         */
+        mpi_code = MPI_Type_create_hindexed(blocks, block_lens, chunk_disp_array, 
+                                            MPI_BYTE, &file_type);
+        if(mpi_code != MPI_SUCCESS)
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
+        mpi_code = MPI_Type_create_hvector(blocks, block_len, 0, MPI_BYTE, &mem_type);
+        if(mpi_code != MPI_SUCCESS)
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hvector failed", mpi_code)
+    }
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&file_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&mem_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+
+    /* set MPI-IO VFD properties */
+    {
+        H5FD_mpio_xfer_t xfer_mode = H5FD_MPIO_COLLECTIVE;
+        H5P_genplist_t  *plist;      /* Property list pointer */
+
+        if(NULL == (plist = H5P_object_verify(data_dxpl_id, H5P_DATASET_XFER)))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dataset transfer list")
+
+        /* Set buffer MPI type */
+        if(H5P_set(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &mem_type) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+
+        /* Set File MPI type */
+        if(H5P_set(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+
+        /* set transfer mode */
+        if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
+    }
+
+    /* low level write */
+    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, (haddr_t)0, (blocks) ? (size_t)1 : (size_t)0, 
+                       data_dxpl_id, fill_buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
+
+    /* Barrier so processes don't race ahead */
+    if(MPI_SUCCESS != (mpi_code = MPI_Barrier(mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
+
+done:
+    if(data_dxpl_id > 0 && H5I_dec_ref(data_dxpl_id) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't free property list")
+
+    /* free things */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&file_type)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&mem_type)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+    H5MM_xfree(chunk_disp_array);
+    H5MM_xfree(block_lens);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_collective_fill() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_prune_fill
+ *
+ * Purpose:	Write the fill value to the parts of the chunk that are no
+ *              longer part of the dataspace
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Pedro Vicente, pvn at ncsa.uiuc.edu
+ * 		March 26, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata)
+{
+    const H5D_io_info_t *io_info = udata->io_info; /* Local pointer to I/O info */
+    const H5D_t *dset = io_info->dset;  /* Local pointer to the dataset info */
+    const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset's layout */
+    unsigned    rank = udata->common.layout->ndims - 1; /* Dataset rank */
+    const hsize_t *chunk_offset = io_info->store->chunk.offset; /* Chunk offset */
+    H5S_sel_iter_t chunk_iter;          /* Memory selection iteration info */
+    hssize_t    sel_nelmts;             /* Number of elements in selection */
+    hsize_t     count[H5O_LAYOUT_NDIMS]; /* Element count of hyperslab */
+    size_t      chunk_size;             /*size of a chunk       */
+    void        *chunk;	                /* The file chunk  */
+    H5D_chunk_ud_t chk_udata;           /* User data for locking chunk */
+    uint32_t    bytes_accessed;         /* Bytes accessed in chunk */
+    hbool_t     chunk_iter_init = FALSE; /* Whether the chunk iterator has been initialized */
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the chunk's size */
+    HDassert(layout->u.chunk.size > 0);
+    H5_CHECKED_ASSIGN(chunk_size, size_t, layout->u.chunk.size, uint32_t);
+
+    /* Get the info for the chunk in the file */
+    if(H5D__chunk_lookup(dset, io_info->dxpl_id, chunk_offset, io_info->store->chunk.index, &chk_udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+
+    /* If this chunk does not exist in cache or on disk, no need to do anything
+     */
+    if(!H5F_addr_defined(chk_udata.addr) && UINT_MAX == chk_udata.idx_hint)
+        HGOTO_DONE(SUCCEED)
+
+    /* Initialize the fill value buffer, if necessary */
+    if(!udata->fb_info_init) {
+        H5_CHECK_OVERFLOW(udata->elmts_per_chunk, uint32_t, size_t);
+        if(H5D__fill_init(&udata->fb_info, NULL, NULL, NULL, NULL, NULL,
+                &dset->shared->dcpl_cache.fill,
+                dset->shared->type, dset->shared->type_id, (size_t)udata->elmts_per_chunk,
+                chunk_size, io_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
+        udata->fb_info_init = TRUE;
+    } /* end if */
+
+    /* Compute the # of elements to leave with existing value, in each dimension */
+    for(u = 0; u < rank; u++) {
+        count[u] = MIN(layout->u.chunk.dim[u], (udata->space_dim[u]
+                - chunk_offset[u]));
+        HDassert(count[u] > 0);
+    } /* end for */
+
+    /* Select all elements in chunk, to begin with */
+    if(H5S_select_all(udata->chunk_space, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSELECT, FAIL, "unable to select space")
+
+    /* "Subtract out" the elements to keep */
+    if(H5S_select_hyperslab(udata->chunk_space, H5S_SELECT_NOTB, udata->hyper_start, NULL, count, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSELECT, FAIL, "unable to select hyperslab")
+
+    /* Lock the chunk into the cache, to get a pointer to the chunk buffer */
+    if(NULL == (chunk = (void *)H5D__chunk_lock(io_info, &chk_udata, FALSE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to lock raw data chunk")
+
+
+    /* Fill the selection in the memory buffer */
+    /* Use the size of the elements in the chunk directly instead of */
+    /* relying on the fill.size, which might be set to 0 if there is */
+    /* no fill-value defined for the dataset -QAK */
+
+    /* Get the number of elements in the selection */
+    sel_nelmts = H5S_GET_SELECT_NPOINTS(udata->chunk_space);
+    HDassert(sel_nelmts >= 0);
+    H5_CHECK_OVERFLOW(sel_nelmts, hssize_t, size_t);
+
+    /* Check for VL datatype & non-default fill value */
+    if(udata->fb_info.has_vlen_fill_type)
+        /* Re-fill the buffer to use for this I/O operation */
+        if(H5D__fill_refill_vl(&udata->fb_info, (size_t)sel_nelmts, io_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
+
+    /* Create a selection iterator for scattering the elements to memory buffer */
+    if(H5S_select_iter_init(&chunk_iter, udata->chunk_space, layout->u.chunk.dim[rank]) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunk selection information")
+    chunk_iter_init = TRUE;
+
+    /* Scatter the data into memory */
+    if(H5D__scatter_mem(udata->fb_info.fill_buf, udata->chunk_space, &chunk_iter, (size_t)sel_nelmts, io_info->dxpl_cache, chunk/*out*/) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "scatter failed")
+
+
+    /* The number of bytes accessed in the chunk */
+    /* (i.e. the bytes replaced with fill values) */
+    H5_CHECK_OVERFLOW(sel_nelmts, hssize_t, uint32_t);
+    bytes_accessed = (uint32_t)sel_nelmts * layout->u.chunk.dim[rank];
+
+    /* Release lock on chunk */
+    if(H5D__chunk_unlock(io_info, &chk_udata, TRUE, chunk, bytes_accessed) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock raw data chunk")
+
+done:
+    /* Release the selection iterator */
+    if(chunk_iter_init && H5S_SELECT_ITER_RELEASE(&chunk_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_prune_fill */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_prune_by_extent
+ *
+ * Purpose:	This function searches for chunks that are no longer necessary
+ *              both in the raw data cache and in the chunk index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Pedro Vicente, pvn at ncsa.uiuc.edu
+ * Algorithm:	Robb Matzke
+ * 		March 27, 2002
+ *
+ * The algorithm is:
+ *
+ *  For chunks that are no longer necessary:
+ *
+ *  1. Search in the raw data cache for each chunk
+ *  2. If found then preempt it from the cache
+ *  3. Search in the B-tree for each chunk
+ *  4. If found then remove it from the B-tree and deallocate file storage for the chunk
+ *
+ * This example shows a 2d dataset of 90x90 with a chunk size of 20x20.
+ *
+ *
+ *     0         20        40        60        80    90   100
+ *    0 +---------+---------+---------+---------+-----+...+
+ *      |:::::X::::::::::::::         :         :     |   :
+ *      |:::::::X::::::::::::         :         :     |   :   Key
+ *      |::::::::::X:::::::::         :         :     |   :   --------
+ *      |::::::::::::X:::::::         :         :     |   :  +-+ Dataset
+ *    20+::::::::::::::::::::.........:.........:.....+...:  | | Extent
+ *      |         :::::X:::::         :         :     |   :  +-+
+ *      |         :::::::::::         :         :     |   :
+ *      |         :::::::::::         :         :     |   :  ... Chunk
+ *      |         :::::::X:::         :         :     |   :  : : Boundary
+ *    40+.........:::::::::::.........:.........:.....+...:  :.:
+ *      |         :         :         :         :     |   :
+ *      |         :         :         :         :     |   :  ... Allocated
+ *      |         :         :         :         :     |   :  ::: & Filled
+ *      |         :         :         :         :     |   :  ::: Chunk
+ *    60+.........:.........:.........:.........:.....+...:
+ *      |         :         :::::::X:::         :     |   :   X  Element
+ *      |         :         :::::::::::         :     |   :      Written
+ *      |         :         :::::::::::         :     |   :
+ *      |         :         :::::::::::         :     |   :
+ *    80+.........:.........:::::::::::.........:.....+...:   O  Fill Val
+ *      |         :         :         :::::::::::     |   :      Explicitly
+ *      |         :         :         ::::::X::::     |   :      Written
+ *    90+---------+---------+---------+---------+-----+   :
+ *      :         :         :         :::::::::::         :
+ *   100:.........:.........:.........:::::::::::.........:
+ *
+ *
+ * We have 25 total chunks for this dataset, 5 of which have space
+ * allocated in the file because they were written to one or more
+ * elements. These five chunks (and only these five) also have entries in
+ * the storage B-tree for this dataset.
+ *
+ * Now lets say we want to shrink the dataset down to 70x70:
+ *
+ *
+ *      0         20        40        60   70   80    90   100
+ *    0 +---------+---------+---------+----+----+-----+...+
+ *      |:::::X::::::::::::::         :    |    :     |   :
+ *      |:::::::X::::::::::::         :    |    :     |   :    Key
+ *      |::::::::::X:::::::::         :    |    :     |   :    --------
+ *      |::::::::::::X:::::::         :    |    :     |   :   +-+ Dataset
+ *    20+::::::::::::::::::::.........:....+....:.....|...:   | | Extent
+ *      |         :::::X:::::         :    |    :     |   :   +-+
+ *      |         :::::::::::         :    |    :     |   :
+ *      |         :::::::::::         :    |    :     |   :   ... Chunk
+ *      |         :::::::X:::         :    |    :     |   :   : : Boundary
+ *    40+.........:::::::::::.........:....+....:.....|...:   :.:
+ *      |         :         :         :    |    :     |   :
+ *      |         :         :         :    |    :     |   :   ... Allocated
+ *      |         :         :         :    |    :     |   :   ::: & Filled
+ *      |         :         :         :    |    :     |   :   ::: Chunk
+ *    60+.........:.........:.........:....+....:.....|...:
+ *      |         :         :::::::X:::    |    :     |   :    X  Element
+ *      |         :         :::::::::::    |    :     |   :       Written
+ *      +---------+---------+---------+----+    :     |   :
+ *      |         :         :::::::::::         :     |   :
+ *    80+.........:.........:::::::::X:.........:.....|...:    O  Fill Val
+ *      |         :         :         :::::::::::     |   :       Explicitly
+ *      |         :         :         ::::::X::::     |   :       Written
+ *    90+---------+---------+---------+---------+-----+   :
+ *      :         :         :         :::::::::::         :
+ *   100:.........:.........:.........:::::::::::.........:
+ *
+ *
+ * That means that the nine chunks along the bottom and right side should
+ * no longer exist. Of those nine chunks, (0,80), (20,80), (40,80),
+ * (60,80), (80,80), (80,60), (80,40), (80,20), and (80,0), one is actually allocated
+ * that needs to be released.
+ * To release the chunks, we traverse the B-tree to obtain a list of unused
+ * allocated chunks, and then call H5B_remove() for each chunk.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
+{
+    hsize_t                 min_mod_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of first chunk to modify in each dimension */
+    hsize_t                 max_mod_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of last chunk to modify in each dimension */
+    hssize_t                max_fill_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of last chunk that might be filled in each dimension */
+    hbool_t                 fill_dim[H5O_LAYOUT_NDIMS]; /* Whether the plane of edge chunks in this dimension needs to be filled */
+    hbool_t                 dims_outside_fill[H5O_LAYOUT_NDIMS]; /* Dimensions in chunk offset outside fill dimensions */
+    int                     ndims_outside_fill = 0; /* Number of dimensions in chunk offset outside fill dimensions */
+    hbool_t                 has_fill = FALSE;   /* Whether there are chunks that must be filled */
+    H5D_chk_idx_info_t      idx_info;           /* Chunked index info */
+    H5D_io_info_t           chk_io_info;        /* Chunked I/O info object */
+    H5D_storage_t           chk_store;          /* Chunk storage information */
+    H5D_dxpl_cache_t        _dxpl_cache;        /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t       *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    const H5O_layout_t     *layout = &(dset->shared->layout);   /* Dataset's layout */
+    const H5D_rdcc_t       *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
+    H5D_rdcc_ent_t         *ent = NULL;	        /* Cache entry  */
+    int                     space_ndims;        /* Dataset's space rank */
+    hsize_t                 space_dim[H5O_LAYOUT_NDIMS]; /* Current dataspace dimensions */
+    int                     op_dim;             /* Current operationg dimension */
+    hbool_t                 shrunk_dim[H5O_LAYOUT_NDIMS]; /* Dimensions which have shrunk */
+    H5D_chunk_it_ud1_t      udata;      /* Chunk index iterator user data */
+    hbool_t                 udata_init = FALSE; /* Whether the chunk index iterator user data has been initialized */
+    H5D_chunk_common_ud_t   idx_udata;          /* User data for index removal routine */
+    H5D_chunk_ud_t          chk_udata;          /* User data for getting chunk info */
+    H5S_t                  *chunk_space = NULL;         /* Dataspace for a chunk */
+    hsize_t                 chunk_dim[H5O_LAYOUT_NDIMS];   /* Chunk dimensions */
+    hsize_t                 chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */
+    hsize_t                 hyper_start[H5O_LAYOUT_NDIMS];  /* Starting location of hyperslab */
+    uint32_t                elmts_per_chunk;    /* Elements in chunk */
+    hbool_t                 carry;              /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
+    unsigned                u;	                /* Local index variable */
+    herr_t                  ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset && H5D_CHUNKED == layout->type);
+    HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    HDassert(dxpl_cache);
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Go get the rank & dimensions (including the element size) */
+    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim,
+            NULL)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+    space_dim[space_ndims] = layout->u.chunk.dim[space_ndims];
+
+    /* The last dimension in chunk_offset is always 0 */
+    chunk_offset[space_ndims] = (hsize_t)0;
+
+    /* Check if any old dimensions are 0, if so we do not have to do anything */
+    for(op_dim=0; op_dim<space_ndims; op_dim++)
+        if(old_dim[op_dim] == 0) {
+            /* Reset any cached chunk info for this dataset */
+            H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+    /* Round up to the next integer # of chunks, to accomodate partial chunks */
+    /* Use current dims because the indices have already been updated! -NAF */
+    /* (also compute the number of elements per chunk) */
+    /* (also copy the chunk dimensions into 'hsize_t' array for creating dataspace) */
+    /* (also compute the dimensions which have been shrunk) */
+    elmts_per_chunk = 1;
+    for(u = 0; u < (unsigned)space_ndims; u++) {
+        elmts_per_chunk *= layout->u.chunk.dim[u];
+	chunk_dim[u] = layout->u.chunk.dim[u];
+	shrunk_dim[u] = space_dim[u] < old_dim[u];
+    } /* end for */
+
+    /* Create a dataspace for a chunk & set the extent */
+    if(NULL == (chunk_space = H5S_create_simple((unsigned)space_ndims, chunk_dim, NULL)))
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+    /* Reset hyperslab start array */
+    /* (hyperslabs will always start from origin) */
+    HDmemset(hyper_start, 0, sizeof(hyper_start));
+
+    /* Set up chunked I/O info object, for operations on chunks (in callback)
+     * Note that we only need to set chunk_offset once, as the array's address
+     * will never change. */
+    chk_store.chunk.offset = chunk_offset;
+    H5D_BUILD_IO_INFO_RD(&chk_io_info, dset, dxpl_cache, dxpl_id, &chk_store, NULL);
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Initialize the user data for the iteration */
+    HDmemset(&udata, 0, sizeof udata);
+    udata.common.layout = &layout->u.chunk;
+    udata.common.storage = &layout->storage.u.chunk;
+    udata.common.rdcc = rdcc;
+    udata.io_info = &chk_io_info;
+    udata.idx_info = &idx_info;
+    udata.space_dim = space_dim;
+    udata.shrunk_dim = shrunk_dim;
+    udata.elmts_per_chunk = elmts_per_chunk;
+    udata.chunk_space = chunk_space;
+    udata.hyper_start = hyper_start;
+    udata_init = TRUE;
+
+    /* Initialize user data for removal */
+    idx_udata.layout = &layout->u.chunk;
+    idx_udata.storage = &layout->storage.u.chunk;
+
+    /*
+     * Determine the chunks which need to be filled or removed
+     */
+    HDmemset(min_mod_chunk_off, 0, sizeof(min_mod_chunk_off));
+    HDmemset(max_mod_chunk_off, 0, sizeof(max_mod_chunk_off));
+    for(op_dim = 0; op_dim < space_ndims; op_dim++) {
+        /* Calculate the largest offset of chunks that might need to be
+         * modified in this dimension */
+        max_mod_chunk_off[op_dim] = chunk_dim[op_dim] * ((old_dim[op_dim] - 1)
+                / chunk_dim[op_dim]);
+
+        /* Calculate the largest offset of chunks that might need to be
+         * filled in this dimension */
+        if(0 == space_dim[op_dim])
+            max_fill_chunk_off[op_dim] = -1;
+        else
+            max_fill_chunk_off[op_dim] = (hssize_t)(chunk_dim[op_dim]
+                    * ((MIN(space_dim[op_dim], old_dim[op_dim]) - 1)
+                    / chunk_dim[op_dim]));
+
+        if(shrunk_dim[op_dim]) {
+            /* Calculate the smallest offset of chunks that might need to be
+             * modified in this dimension.  Note that this array contains
+             * garbage for all dimensions which are not shrunk.  These locations
+             * must not be read from! */
+            min_mod_chunk_off[op_dim] = chunk_dim[op_dim] * (space_dim[op_dim]
+                    / chunk_dim[op_dim]);
+
+            /* Determine if we need to fill chunks in this dimension */
+            if((hssize_t)min_mod_chunk_off[op_dim] == max_fill_chunk_off[op_dim]) {
+                fill_dim[op_dim] = TRUE;
+                has_fill = TRUE;
+            } /* end if */
+            else
+                fill_dim[op_dim] = FALSE;
+        } /* end if */
+        else
+            fill_dim[op_dim] = FALSE;
+    } /* end for */
+
+    /* Check the cache for any entries that are outside the bounds.  Mark these
+     * entries as deleted so they are not flushed to disk accidentally.  This is
+     * only necessary if there are chunks that need to be filled. */
+    if(has_fill)
+        for(ent = rdcc->head; ent; ent = ent->next)
+            /* Check for chunk offset outside of new dimensions */
+            for(u = 0; u < (unsigned)space_ndims; u++)
+                if((hsize_t)ent->offset[u] >= space_dim[u]) {
+                    /* Mark the entry as "deleted" */
+                    ent->deleted = TRUE;
+                    break;
+                } /* end if */
+
+    /* Main loop: fill or remove chunks */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        /* Check if modification along this dimension is really necessary */
+        if(!shrunk_dim[op_dim])
+            continue;
+        else {
+            HDassert((hsize_t) max_mod_chunk_off[op_dim] >= min_mod_chunk_off[op_dim]);
+
+            /* Reset the chunk offset indices */
+            HDmemset(chunk_offset, 0, ((unsigned)space_ndims * sizeof(chunk_offset[0])));
+            chunk_offset[op_dim] = min_mod_chunk_off[op_dim];
+
+            /* Initialize "dims_outside_fill" array */
+            ndims_outside_fill = 0;
+            for(u = 0; u < (unsigned)space_ndims; u++)
+                if((hssize_t)chunk_offset[u] > max_fill_chunk_off[u]) {
+                    dims_outside_fill[u] = TRUE;
+                    ndims_outside_fill++;
+                } /* end if */
+                else
+                    dims_outside_fill[u] = FALSE;
+
+            carry = FALSE;
+        } /* end if */
+
+        while(!carry) {
+            int i;	                        /* Local index variable */
+
+            /* Calculate the index of this chunk */
+            if(H5VM_chunk_index((unsigned)space_ndims, chunk_offset,
+                    layout->u.chunk.dim, layout->u.chunk.down_chunks,
+                    &(chk_io_info.store->chunk.index)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
+
+            if(0 == ndims_outside_fill) {
+                HDassert(fill_dim[op_dim]);
+                HDassert(chunk_offset[op_dim] == min_mod_chunk_off[op_dim]);
+
+                /* Fill the unused parts of the chunk */
+                if(H5D__chunk_prune_fill(&udata) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write fill value")
+            } /* end if */
+            else {
+#ifndef NDEBUG
+                /* Make sure this chunk is really outside the new dimensions */
+                {
+                    hbool_t outside_dim = FALSE;
+
+                    for(u = 0; u < (unsigned)space_ndims; u++)
+                        if(chunk_offset[u] >= space_dim[u]) {
+                            outside_dim = TRUE;
+                            break;
+                        } /* end if */
+                    HDassert(outside_dim);
+                } /* end block */
+#endif /* NDEBUG */
+
+                /* Check if the chunk exists in cache or on disk */
+                if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chk_io_info.store->chunk.index, &chk_udata) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk")
+
+                /* Evict the entry from the cache if present, but do not flush
+                 * it to disk */
+                if(UINT_MAX != chk_udata.idx_hint)
+                    if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[chk_udata.idx_hint], FALSE) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
+
+                /* Remove the chunk from disk, if present */
+                if(H5F_addr_defined(chk_udata.addr)) {
+                    /* Update the offset in idx_udata */
+                    idx_udata.offset = chunk_offset;
+
+                    /* Remove the chunk from disk */
+                    if((layout->storage.u.chunk.ops->remove)(&idx_info, &idx_udata) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to remove chunk entry from index")
+                } /* end if */
+            } /* end else */
+
+            /* Increment indices */
+            carry = TRUE;
+            for(i = (int)(space_ndims - 1); i >= 0; --i) {
+                chunk_offset[i] += chunk_dim[i];
+                if(chunk_offset[i] > (hsize_t) max_mod_chunk_off[i]) {
+                    /* Left maximum dimensions, "wrap around" and check if this
+                     * dimension is no longer outside the fill dimension */
+                    if(i == op_dim) {
+                        chunk_offset[i] = min_mod_chunk_off[i];
+                        if(dims_outside_fill[i] && fill_dim[i]) {
+                            dims_outside_fill[i] = FALSE;
+                            ndims_outside_fill--;
+                        } /* end if */
+                    } /* end if */
+                    else {
+                        chunk_offset[i] = 0;
+                        if(dims_outside_fill[i] && max_fill_chunk_off[i] >= 0) {
+                            dims_outside_fill[i] = FALSE;
+                            ndims_outside_fill--;
+                        } /* end if */
+                    } /* end else */
+                } /* end if */
+                else {
+                    /* Check if we just went outside the fill dimension */
+                    if(!dims_outside_fill[i] && (hssize_t)chunk_offset[i] > max_fill_chunk_off[i]) {
+                        dims_outside_fill[i] = TRUE;
+                        ndims_outside_fill++;
+                    } /* end if */
+
+                    /* We found the next chunk, so leave the loop */
+                    carry = FALSE;
+                    break;
+                } /* end else */
+            } /* end for */
+        } /* end while(!carry) */
+
+        /* Adjust max_mod_chunk_off so we don't modify the same chunk twice.
+         * Also check if this dimension started from 0 (and hence removed all
+         * of the chunks). */
+        if(min_mod_chunk_off[op_dim] == 0)
+            break;
+        else
+            max_mod_chunk_off[op_dim] = min_mod_chunk_off[op_dim] - chunk_dim[op_dim];
+    } /* end for(op_dim=0...) */
+
+    /* Reset any cached chunk info for this dataset */
+    H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+
+done:
+    /* Release resources */
+    if(chunk_space && H5S_close(chunk_space) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+    if(udata_init)
+        if(udata.fb_info_init && H5D__fill_term(&udata.fb_info) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_prune_by_extent() */
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_addrmap_cb
+ *
+ * Purpose:     Callback when obtaining the chunk addresses for all existing chunks
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Kent Yang
+ *              Tuesday, November 15, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__chunk_addrmap_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    H5D_chunk_it_ud2_t	*udata = (H5D_chunk_it_ud2_t *)_udata;  /* User data for callback */
+    unsigned       rank = udata->common.layout->ndims - 1;    /* # of dimensions of dataset */
+    hsize_t        chunk_index;
+    int            ret_value = H5_ITER_CONT;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Compute the index for this chunk */
+    if(H5VM_chunk_index(rank, chunk_rec->offset, udata->common.layout->dim, udata->common.layout->down_chunks, &chunk_index) < 0)
+       HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, H5_ITER_ERROR, "can't get chunk index")
+
+    /* Set it in the userdata to return */
+    udata->chunk_addr[chunk_index] = chunk_rec->chunk_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_addrmap_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_addrmap
+ *
+ * Purpose:     Obtain the chunk addresses for all existing chunks
+ *
+ * Return:	Success:	Non-negative on succeed.
+ *		Failure:	negative value
+ *
+ * Programmer:  Kent Yang
+ *              November 15, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_addrmap(const H5D_io_info_t *io_info, haddr_t chunk_addr[])
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    const H5D_t *dset = io_info->dset;  /* Local pointer to dataset info */
+    H5D_chunk_it_ud2_t udata;          	/* User data for iteration callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dset);
+    HDassert(dset->shared);
+    HDassert(chunk_addr);
+
+    /* Set up user data for B-tree callback */
+    HDmemset(&udata, 0, sizeof(udata));
+    udata.common.layout = &dset->shared->layout.u.chunk;
+    udata.common.storage = &dset->shared->layout.storage.u.chunk;
+    udata.common.rdcc = &(dset->shared->cache.chunk);
+    udata.chunk_addr = chunk_addr;
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = io_info->dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Iterate over chunks to build mapping of chunk addresses */
+    if((dset->shared->layout.storage.u.chunk.ops->iterate)(&idx_info, H5D__chunk_addrmap_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to iterate over chunk index to build address map")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_addrmap() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_delete
+ *
+ * Purpose:	Delete raw data storage for entire dataset (i.e. all chunks)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_storage_t *storage)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5O_layout_t layout;                /* Dataset layout  message */
+    hbool_t layout_read = FALSE;        /* Whether the layout message was read from the file */
+    H5O_pline_t pline;                  /* I/O pipeline message */
+    hbool_t pline_read = FALSE;         /* Whether the I/O pipeline message was read from the file */
+    htri_t	exists;                 /* Flag if header message of interest exists */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(storage);
+
+    /* Check for I/O pipeline message */
+    if((exists = H5O_msg_exists_oh(oh, H5O_PLINE_ID)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to check for object header message")
+    else if(exists) {
+        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_PLINE_ID, &pline))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get I/O pipeline message")
+        pline_read = TRUE;
+    } /* end else if */
+    else
+        HDmemset(&pline, 0, sizeof(pline));
+
+    /* Retrieve dataset layout message */
+    if((exists = H5O_msg_exists_oh(oh, H5O_LAYOUT_ID)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to check for object header message")
+    else if(exists) {
+        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_LAYOUT_ID, &layout))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get layout message")
+        layout_read = TRUE;
+    } /* end else if */
+    else
+        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "can't find layout message")
+
+    /* Compose chunked index info struct */
+    idx_info.f = f;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &pline;
+    idx_info.layout = &layout.u.chunk;
+    idx_info.storage = &storage->u.chunk;
+
+    /* Delete the chunked storage information in the file */
+    if((storage->u.chunk.ops->idx_delete)(&idx_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to delete chunk index")
+
+done:
+    /* Clean up any messages read in */
+    if(pline_read)
+        if(H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset I/O pipeline message")
+    if(layout_read)
+        if(H5O_msg_reset(H5O_LAYOUT_ID, &layout) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset layout message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_update_cache
+ *
+ * Purpose:	Update any cached chunks index values after the dataspace
+ *              size has changed
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, May 29, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_update_cache(H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_rdcc_t         *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
+    H5D_rdcc_ent_t     *ent, *next;	/*cache entry  */
+    H5D_rdcc_ent_t     *old_ent;	/* Old cache entry  */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    unsigned            rank;	        /* Current # of dimensions */
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset && H5D_CHUNKED == dset->shared->layout.type);
+    HDassert(dset->shared->layout.u.chunk.ndims > 0 && dset->shared->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+
+    /* Get the rank */
+    rank = dset->shared->layout.u.chunk.ndims-1;
+    HDassert(rank > 0);
+
+    /* 1-D dataset's chunks can't have their index change */
+    if(rank == 1)
+        HGOTO_DONE(SUCCEED)
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Recompute the index for each cached chunk that is in a dataset */
+    for(ent = rdcc->head; ent; ent = next) {
+        hsize_t             idx;        /* Chunk index */
+        unsigned	    old_idx;	/* Previous index number	*/
+
+        /* Get the pointer to the next cache entry */
+        next = ent->next;
+
+        /* Calculate the index of this chunk */
+        if(H5VM_chunk_index(rank, ent->offset, dset->shared->layout.u.chunk.dim, dset->shared->layout.u.chunk.down_chunks, &idx) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+
+        /* Compute the index for the chunk entry */
+        old_idx = ent->idx;   /* Save for later */
+        ent->idx = H5D_CHUNK_HASH(dset->shared, idx);
+
+        if(old_idx != ent->idx) {
+            /* Check if there is already a chunk at this chunk's new location */
+            old_ent = rdcc->slot[ent->idx];
+            if(old_ent != NULL) {
+                HDassert(old_ent->locked == 0);
+
+                /* Check if we are removing the entry we would walk to next */
+                if(old_ent == next)
+                    next = old_ent->next;
+
+                /* Remove the old entry from the cache */
+                if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, old_ent, TRUE) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+            } /* end if */
+
+            /* Insert this chunk into correct location in hash table */
+            rdcc->slot[ent->idx] = ent;
+
+            /* Null out previous location */
+            rdcc->slot[old_idx] = NULL;
+        } /* end if */
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_update_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_copy_cb
+ *
+ * Purpose:     Copy chunked raw data from source file and insert to the
+ *              index in the destination file
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              August 20, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    H5D_chunk_it_ud3_t      *udata = (H5D_chunk_it_ud3_t *)_udata;       /* User data for callback */
+    H5D_chunk_ud_t          udata_dst;                  /* User data about new destination chunk */
+    hbool_t                 is_vlen = FALSE;            /* Whether datatype is variable-length */
+    hbool_t                 fix_ref = FALSE;            /* Whether to fix up references in the dest. file */
+
+    /* General information about chunk copy */
+    void                    *bkg = udata->bkg;          /* Background buffer for datatype conversion */
+    void                    *buf = udata->buf;          /* Chunk buffer for I/O & datatype conversions */
+    size_t                  buf_size = udata->buf_size; /* Size of chunk buffer */
+    const H5O_pline_t       *pline = udata->pline;      /* I/O pipeline for applying filters */
+
+    /* needed for commpressed variable length data */
+    hbool_t                 has_filters = FALSE;        /* Whether chunk has filters */
+    size_t                  nbytes;                     /* Size of chunk in file (in bytes) */
+    H5Z_cb_t                cb_struct;                  /* Filter failure callback struct */
+
+    int                     ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get 'size_t' local value for number of bytes in chunk */
+    H5_CHECKED_ASSIGN(nbytes, size_t, chunk_rec->nbytes, uint32_t);
+
+    /* Check parameter for type conversion */
+    if(udata->do_convert) {
+        if(H5T_detect_class(udata->dt_src, H5T_VLEN, FALSE) > 0)
+            is_vlen = TRUE;
+        else if((H5T_get_class(udata->dt_src, FALSE) == H5T_REFERENCE) && (udata->file_src != udata->idx_info_dst->f))
+            fix_ref = TRUE;
+        else
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy dataset elements")
+    } /* end if */
+
+    /* Check for filtered chunks */
+    if(pline && pline->nused) {
+        has_filters = TRUE;
+        cb_struct.func = NULL; /* no callback function when failed */
+    } /* end if */
+
+    /* Resize the buf if it is too small to hold the data */
+    if(nbytes > buf_size) {
+        void *new_buf;          /* New buffer for data */
+
+        /* Re-allocate memory for copying the chunk */
+        if(NULL == (new_buf = H5MM_realloc(udata->buf, nbytes)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed for raw data chunk")
+        udata->buf = new_buf;
+        if(udata->bkg) {
+            if(NULL == (new_buf = H5MM_realloc(udata->bkg, nbytes)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed for raw data chunk")
+            udata->bkg = new_buf;
+            if(!udata->cpy_info->expand_ref)
+                HDmemset((uint8_t *)udata->bkg + buf_size, 0, (size_t)(nbytes - buf_size));
+
+            bkg = udata->bkg;
+        } /* end if */
+
+        buf = udata->buf;
+        udata->buf_size = buf_size = nbytes;
+    } /* end if */
+
+    /* read chunk data from the source file */
+    if(H5F_block_read(udata->file_src, H5FD_MEM_DRAW, chunk_rec->chunk_addr, nbytes, udata->idx_info_dst->dxpl_id, buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, H5_ITER_ERROR, "unable to read raw data chunk")
+
+    /* Need to uncompress variable-length & reference data elements */
+    if(has_filters && (is_vlen || fix_ref)) {
+        unsigned filter_mask = chunk_rec->filter_mask;
+
+        if(H5Z_pipeline(pline, H5Z_FLAG_REVERSE, &filter_mask, H5Z_NO_EDC, cb_struct, &nbytes, &buf_size, &buf) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, H5_ITER_ERROR, "data pipeline read failed")
+    } /* end if */
+
+    /* Perform datatype conversion, if necessary */
+    if(is_vlen) {
+        H5T_path_t              *tpath_src_mem = udata->tpath_src_mem;
+        H5T_path_t              *tpath_mem_dst = udata->tpath_mem_dst;
+        H5S_t                   *buf_space = udata->buf_space;
+        hid_t                   tid_src = udata->tid_src;
+        hid_t                   tid_dst = udata->tid_dst;
+        hid_t                   tid_mem = udata->tid_mem;
+        void                    *reclaim_buf = udata->reclaim_buf;
+        size_t                  reclaim_buf_size = udata->reclaim_buf_size;
+
+        /* Convert from source file to memory */
+        H5_CHECK_OVERFLOW(udata->nelmts, uint32_t, size_t);
+        if(H5T_convert(tpath_src_mem, tid_src, tid_mem, (size_t)udata->nelmts, (size_t)0, (size_t)0, buf, bkg, udata->idx_info_dst->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "datatype conversion failed")
+
+        /* Copy into another buffer, to reclaim memory later */
+        HDmemcpy(reclaim_buf, buf, reclaim_buf_size);
+
+        /* Set background buffer to all zeros */
+        HDmemset(bkg, 0, buf_size);
+
+        /* Convert from memory to destination file */
+        if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, udata->nelmts, (size_t)0, (size_t)0, buf, bkg, udata->idx_info_dst->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "datatype conversion failed")
+
+        /* Reclaim space from variable length data */
+        if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, H5_ITER_ERROR, "unable to reclaim variable-length data")
+    } /* end if */
+    else if(fix_ref) {
+        /* Check for expanding references */
+        /* (background buffer has already been zeroed out, if not expanding) */
+        if(udata->cpy_info->expand_ref) {
+            size_t ref_count;
+
+            /* Determine # of reference elements to copy */
+            ref_count = nbytes / H5T_get_size(udata->dt_src);
+
+            /* Copy the reference elements */
+            if(H5O_copy_expand_ref(udata->file_src, buf, udata->idx_info_dst->dxpl_id, udata->idx_info_dst->f, bkg, ref_count, H5T_get_ref_type(udata->dt_src), udata->cpy_info) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy reference attribute")
+        } /* end if */
+
+        /* After fix ref, copy the new reference elements to the buffer to write out */
+        HDmemcpy(buf, bkg, buf_size);
+    } /* end if */
+
+    /* Set up destination chunk callback information for insertion */
+    udata_dst.common.layout = udata->idx_info_dst->layout;
+    udata_dst.common.storage = udata->idx_info_dst->storage;
+    udata_dst.common.offset = chunk_rec->offset;
+    udata_dst.common.rdcc = NULL;
+    udata_dst.nbytes = chunk_rec->nbytes;
+    udata_dst.filter_mask = chunk_rec->filter_mask;
+    udata_dst.addr = HADDR_UNDEF;
+
+    /* Need to compress variable-length & reference data elements before writing to file */
+    if(has_filters && (is_vlen || fix_ref) ) {
+        if(H5Z_pipeline(pline, 0, &(udata_dst.filter_mask), H5Z_NO_EDC, cb_struct, &nbytes, &buf_size, &buf) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, H5_ITER_ERROR, "output pipeline failed")
+#if H5_SIZEOF_SIZE_T > 4
+        /* Check for the chunk expanding too much to encode in a 32-bit value */
+        if(nbytes > ((size_t)0xffffffff))
+            HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, H5_ITER_ERROR, "chunk too large for 32-bit length")
+#endif /* H5_SIZEOF_SIZE_T > 4 */
+        H5_CHECKED_ASSIGN(udata_dst.nbytes, uint32_t, nbytes, size_t);
+	udata->buf = buf;
+	udata->buf_size = buf_size;
+    } /* end if */
+
+    /* Insert chunk into the destination index */
+    if((udata->idx_info_dst->storage->ops->insert)(udata->idx_info_dst, &udata_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert chunk into index")
+
+    /* Write chunk data to destination file */
+    HDassert(H5F_addr_defined(udata_dst.addr));
+    if(H5F_block_write(udata->idx_info_dst->f, H5FD_MEM_DRAW, udata_dst.addr, nbytes, udata->idx_info_dst->dxpl_id, buf) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, H5_ITER_ERROR, "unable to write raw data to file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_copy_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_copy
+ *
+ * Purpose:	Copy chunked storage from SRC file to DST file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:  Peter Cao
+ *	        August 20, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
+    H5O_layout_chunk_t *layout_src, H5F_t *f_dst, H5O_storage_chunk_t *storage_dst,
+    const H5S_extent_t *ds_extent_src, const H5T_t *dt_src,
+    const H5O_pline_t *pline_src, H5O_copy_t *cpy_info, hid_t dxpl_id)
+{
+    H5D_chunk_it_ud3_t udata;           /* User data for iteration callback */
+    H5D_chk_idx_info_t idx_info_dst;    /* Dest. chunked index info */
+    H5D_chk_idx_info_t idx_info_src;    /* Source chunked index info */
+    H5O_pline_t _pline;                 /* Temporary pipeline info */
+    const H5O_pline_t *pline;           /* Pointer to pipeline info to use */
+    H5T_path_t  *tpath_src_mem = NULL, *tpath_mem_dst = NULL;   /* Datatype conversion paths */
+    hid_t       tid_src = -1;           /* Datatype ID for source datatype */
+    hid_t       tid_dst = -1;           /* Datatype ID for destination datatype */
+    hid_t       tid_mem = -1;           /* Datatype ID for memory datatype */
+    size_t      buf_size;               /* Size of copy buffer */
+    size_t      reclaim_buf_size;       /* Size of reclaim buffer */
+    void       *buf = NULL;             /* Buffer for copying data */
+    void       *bkg = NULL;             /* Buffer for background during type conversion */
+    void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
+    H5S_t      *buf_space = NULL;       /* Dataspace describing buffer */
+    hid_t       sid_buf = -1;           /* ID for buffer dataspace */
+    uint32_t    nelmts = 0;             /* Number of elements in buffer */
+    hbool_t     do_convert = FALSE;     /* Indicate that type conversions should be performed */
+    hbool_t     copy_setup_done = FALSE;        /* Indicate that 'copy setup' is done */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(f_src);
+    HDassert(storage_src);
+    HDassert(layout_src);
+    HDassert(f_dst);
+    HDassert(storage_dst);
+    HDassert(ds_extent_src);
+    HDassert(dt_src);
+
+    /* Initialize the temporary pipeline info */
+    if(NULL == pline_src) {
+        HDmemset(&_pline, 0, sizeof(_pline));
+        pline = &_pline;
+    } /* end if */
+    else
+        pline = pline_src;
+
+    /* Layout is not created in the destination file, reset index address */
+    if(H5D_chunk_idx_reset(storage_dst, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to reset chunked storage index in dest")
+
+    /* Initialize layout information */
+    {
+        hsize_t     curr_dims[H5O_LAYOUT_NDIMS];    /* Curr. size of dataset dimensions */
+        int         sndims;                 /* Rank of dataspace */
+        unsigned    ndims;                  /* Rank of dataspace */
+
+        /* Get the dim info for dataset */
+        if((sndims = H5S_extent_get_dims(ds_extent_src, curr_dims, NULL)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
+        H5_CHECKED_ASSIGN(ndims, unsigned, sndims, int);
+
+        /* Set the source layout chunk information */
+        if(H5D__chunk_set_info_real(layout_src, ndims, curr_dims) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout's chunk info")
+    } /* end block */
+
+    /* Compose source & dest chunked index info structs */
+    idx_info_src.f = f_src;
+    idx_info_src.dxpl_id = dxpl_id;
+    idx_info_src.pline = pline;
+    idx_info_src.layout = layout_src;
+    idx_info_src.storage = storage_src;
+
+    idx_info_dst.f = f_dst;
+    idx_info_dst.dxpl_id = dxpl_id;
+    idx_info_dst.pline = pline;     /* Use same I/O filter pipeline for dest. */
+    idx_info_dst.layout = layout_src /* Use same layout for dest. */;
+    idx_info_dst.storage = storage_dst;
+
+    /* Call the index-specific "copy setup" routine */
+    if((storage_src->ops->copy_setup)(&idx_info_src, &idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up index-specific chunk copying information")
+    copy_setup_done = TRUE;
+
+    /* Create datatype ID for src datatype */
+    if((tid_src = H5I_register(H5I_DATATYPE, dt_src, FALSE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register source file datatype")
+
+    /* If there's a VLEN source datatype, set up type conversion information */
+    if(H5T_detect_class(dt_src, H5T_VLEN, FALSE) > 0) {
+        H5T_t *dt_dst;              /* Destination datatype */
+        H5T_t *dt_mem;              /* Memory datatype */
+        size_t mem_dt_size;         /* Memory datatype size */
+        size_t tmp_dt_size;         /* Temp. datatype size */
+        size_t max_dt_size;         /* Max atatype size */
+        hsize_t buf_dim;            /* Dimension for buffer */
+        unsigned u;
+
+        /* create a memory copy of the variable-length datatype */
+        if(NULL == (dt_mem = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+        if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0) {
+            (void)H5T_close(dt_mem);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register memory datatype")
+        } /* end if */
+
+        /* create variable-length datatype at the destinaton file */
+        if(NULL == (dt_dst = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+        if(H5T_set_loc(dt_dst, f_dst, H5T_LOC_DISK) < 0) {
+            (void)H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype on disk")
+        } /* end if */
+        if((tid_dst = H5I_register(H5I_DATATYPE, dt_dst, FALSE)) < 0) {
+            (void)H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register destination file datatype")
+        } /* end if */
+
+        /* Set up the conversion functions */
+        if(NULL == (tpath_src_mem = H5T_path_find(dt_src, dt_mem, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and mem datatypes")
+        if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, dt_dst, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between mem and dst datatypes")
+
+        /* Determine largest datatype size */
+        if(0 == (max_dt_size = H5T_get_size(dt_src)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        if(0 == (mem_dt_size = H5T_get_size(dt_mem)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(max_dt_size, mem_dt_size);
+        if(0 == (tmp_dt_size = H5T_get_size(dt_dst)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(max_dt_size, tmp_dt_size);
+
+        /* Compute the number of elements per chunk */
+        nelmts = 1;
+        for(u = 0;  u < (layout_src->ndims - 1); u++)
+            nelmts *= layout_src->dim[u];
+
+        /* Create the space and set the initial extent */
+        buf_dim = nelmts;
+        if(NULL == (buf_space = H5S_create_simple((unsigned)1, &buf_dim, NULL)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+        /* Atomize */
+        if((sid_buf = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) {
+            (void)H5S_close(buf_space);
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+        } /* end if */
+
+        /* Set initial buffer sizes */
+        buf_size = nelmts * max_dt_size;
+        reclaim_buf_size = nelmts * mem_dt_size;
+
+        /* Allocate memory for reclaim buf */
+        if(NULL == (reclaim_buf = H5MM_malloc(reclaim_buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for raw data chunk")
+
+        /* Indicate that type conversion should be performed */
+        do_convert = TRUE;
+    } /* end if */
+    else {
+        if(H5T_get_class(dt_src, FALSE) == H5T_REFERENCE) {
+            /* Indicate that type conversion should be performed */
+            do_convert = TRUE;
+        } /* end if */
+
+        H5_CHECKED_ASSIGN(buf_size, size_t, layout_src->size, uint32_t);
+        reclaim_buf_size = 0;
+    } /* end else */
+
+    /* Set up conversion buffer, if appropriate */
+    if(do_convert) {
+        /* Allocate background memory for converting the chunk */
+        if(NULL == (bkg = H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for raw data chunk")
+
+        /* Check for reference datatype and no expanding references & clear background buffer */
+        if(!cpy_info->expand_ref &&
+                ((H5T_get_class(dt_src, FALSE) == H5T_REFERENCE) && (f_src != f_dst)))
+            /* Reset value to zero */
+            HDmemset(bkg, 0, buf_size);
+    } /* end if */
+
+    /* Allocate memory for copying the chunk */
+    if(NULL == (buf = H5MM_malloc(buf_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for raw data chunk")
+
+    /* Initialize the callback structure for the source */
+    HDmemset(&udata, 0, sizeof udata);
+    udata.common.layout = layout_src;
+    udata.common.storage = storage_src;
+    udata.common.rdcc = NULL;
+    udata.file_src = f_src;
+    udata.idx_info_dst = &idx_info_dst;
+    udata.buf = buf;
+    udata.bkg = bkg;
+    udata.buf_size = buf_size;
+    udata.tid_src = tid_src;
+    udata.tid_mem = tid_mem;
+    udata.tid_dst = tid_dst;
+    udata.dt_src = dt_src;
+    udata.do_convert = do_convert;
+    udata.tpath_src_mem = tpath_src_mem;
+    udata.tpath_mem_dst = tpath_mem_dst;
+    udata.reclaim_buf = reclaim_buf;
+    udata.reclaim_buf_size = reclaim_buf_size;
+    udata.buf_space = buf_space;
+    udata.nelmts = nelmts;
+    udata.pline = pline;
+    udata.cpy_info = cpy_info;
+
+    /* Iterate over chunks to copy data */
+    if((storage_src->ops->iterate)(&idx_info_src, H5D__chunk_copy_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk index to copy data")
+
+    /* I/O buffers may have been re-allocated */
+    buf = udata.buf;
+    bkg = udata.bkg;
+
+done:
+    if(sid_buf > 0 && H5I_dec_ref(sid_buf) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't decrement temporary dataspace ID")
+    if(tid_src > 0 && H5I_dec_ref(tid_src) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_dst > 0 && H5I_dec_ref(tid_dst) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_mem > 0 && H5I_dec_ref(tid_mem) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(buf)
+        H5MM_xfree(buf);
+    if(bkg)
+        H5MM_xfree(bkg);
+    if(reclaim_buf)
+        H5MM_xfree(reclaim_buf);
+
+    /* Clean up any index information */
+    if(copy_setup_done)
+        if((storage_src->ops->copy_shutdown)(storage_src, storage_dst, dxpl_id) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to shut down index copying info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_bh_info
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *              June 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_bh_info(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout,
+    const H5O_pline_t *pline, hsize_t *index_size)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(f);
+    HDassert(layout);
+    HDassert(pline);
+    HDassert(index_size);
+
+    /* Compose chunked index info struct */
+    idx_info.f = f;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = pline;
+    idx_info.layout = &layout->u.chunk;
+    idx_info.storage = &layout->storage.u.chunk;
+
+    /* Get size of index structure */
+    if((layout->storage.u.chunk.ops->size)(&idx_info, index_size) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve chunk index info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_bh_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_dump_index_cb
+ *
+ * Purpose:	If the UDATA.STREAM member is non-null then debugging
+ *              information is written to that stream.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 21, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static int
+H5D__chunk_dump_index_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    H5D_chunk_it_ud4_t	*udata = (H5D_chunk_it_ud4_t *)_udata;  /* User data from caller */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if(udata->stream) {
+        unsigned u;     /* Local index variable */
+
+        /* Print header if not already displayed */
+        if(!udata->header_displayed) {
+            HDfprintf(udata->stream, "           Flags    Bytes     Address          Logical Offset\n");
+            HDfprintf(udata->stream, "        ========== ======== ========== ==============================\n");
+
+            /* Set flag that the headers has been printed */
+            udata->header_displayed = TRUE;
+        } /* end if */
+
+        /* Print information about this chunk */
+        HDfprintf(udata->stream,     "        0x%08x %8Zu %10a [", chunk_rec->filter_mask, chunk_rec->nbytes, chunk_rec->chunk_addr);
+        for(u = 0; u < udata->ndims; u++)
+            HDfprintf(udata->stream, "%s%Hd", (u ? ", " : ""), chunk_rec->offset[u]);
+        HDfputs("]\n", udata->stream);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(H5_ITER_CONT)
+} /* H5D__chunk_dump_index_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_dump_index
+ *
+ * Purpose:	Prints information about the storage index to the specified
+ *		stream.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 28, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_dump_index(H5D_t *dset, hid_t dxpl_id, FILE *stream)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Only display info if stream is defined */
+    if(stream) {
+        H5D_chk_idx_info_t idx_info;    /* Chunked index info */
+        H5D_chunk_it_ud4_t udata;       /* User data for callback */
+
+        /* Display info for index */
+        if((dset->shared->layout.storage.u.chunk.ops->dump)(&dset->shared->layout.storage.u.chunk, stream) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to dump chunk index info")
+
+        /* Compose chunked index info struct */
+        idx_info.f = dset->oloc.file;
+        idx_info.dxpl_id = dxpl_id;
+        idx_info.pline = &dset->shared->dcpl_cache.pline;
+        idx_info.layout = &dset->shared->layout.u.chunk;
+        idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+        /* Set up user data for callback */
+        udata.stream = stream;
+        udata.header_displayed = FALSE;
+        udata.ndims = dset->shared->layout.u.chunk.ndims;
+
+        /* Iterate over index and dump chunk info */
+        if((dset->shared->layout.storage.u.chunk.ops->iterate)(&idx_info, H5D__chunk_dump_index_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk index to dump chunk info")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_dump_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_dest
+ *
+ * Purpose:	Destroy the entire chunk cache by flushing dirty entries,
+ *		preempting all entries, and freeing the cache itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_dest(H5F_t *f, hid_t dxpl_id, H5D_t *dset)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);   /* Dataset's chunk cache */
+    H5D_rdcc_ent_t	*ent = NULL, *next = NULL;      /* Pointer to current & next cache entries */
+    int		nerrors = 0;            /* Accumulated count of errors */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(f);
+    HDassert(dset);
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Flush all the cached chunks */
+    for(ent = rdcc->head; ent; ent = next) {
+	next = ent->next;
+	if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, ent, TRUE) < 0)
+	    nerrors++;
+    } /* end for */
+    
+    /* Continue even if there are failures. */
+    if(nerrors)
+	HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+
+    /* Release cache structures */
+    if(rdcc->slot)
+        rdcc->slot = H5FL_SEQ_FREE(H5D_rdcc_ent_ptr_t, rdcc->slot);
+    HDmemset(rdcc, 0, sizeof(H5D_rdcc_t));
+
+    /* Compose chunked index info struct */
+    idx_info.f = f;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Free any index structures */
+    if(dset->shared->layout.storage.u.chunk.ops->dest &&
+            (dset->shared->layout.storage.u.chunk.ops->dest)(&idx_info) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_dest() */
+
+#ifdef H5D_CHUNK_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_stats
+ *
+ * Purpose:	Print raw data cache statistics to the debug stream.  If
+ *		HEADERS is non-zero then print table column headers,
+ *		otherwise assume that the H5AC layer has already printed them.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_stats(const H5D_t *dset, hbool_t headers)
+{
+    H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);
+    double	miss_rate;
+    char	ascii[32];
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    if (!H5DEBUG(AC))
+        HGOTO_DONE(SUCCEED)
+
+    if (headers) {
+        fprintf(H5DEBUG(AC), "H5D: raw data cache statistics\n");
+        fprintf(H5DEBUG(AC), "   %-18s %8s %8s %8s %8s+%-8s\n",
+            "Layer", "Hits", "Misses", "MissRate", "Inits", "Flushes");
+        fprintf(H5DEBUG(AC), "   %-18s %8s %8s %8s %8s-%-8s\n",
+            "-----", "----", "------", "--------", "-----", "-------");
+    }
+
+#ifdef H5AC_DEBUG
+    if (H5DEBUG(AC)) headers = TRUE;
+#endif
+
+    if (headers) {
+        if (rdcc->nhits>0 || rdcc->nmisses>0) {
+            miss_rate = 100.0 * rdcc->nmisses /
+                    (rdcc->nhits + rdcc->nmisses);
+        } else {
+            miss_rate = 0.0;
+        }
+        if (miss_rate > 100) {
+            sprintf(ascii, "%7d%%", (int) (miss_rate + 0.5));
+        } else {
+            sprintf(ascii, "%7.2f%%", miss_rate);
+        }
+
+        fprintf(H5DEBUG(AC), "   %-18s %8u %8u %7s %8d+%-9ld\n",
+            "raw data chunks", rdcc->nhits, rdcc->nmisses, ascii,
+            rdcc->ninits, (long)(rdcc->nflushes)-(long)(rdcc->ninits));
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_stats() */
+#endif /* H5D_CHUNK_DEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__nonexistent_readvv_cb
+ *
+ * Purpose:	Callback operation for performing fill value I/O operation
+ *              on memory buffer.
+ *
+ * Note:	This algorithm is pretty inefficient about initializing and
+ *              terminating the fill buffer info structure and it would be
+ *              faster to refactor this into a "real" initialization routine,
+ *              and a "vectorized fill" routine. -QAK
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		30 Sep 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__nonexistent_readvv_cb(hsize_t H5_ATTR_UNUSED dst_off, hsize_t src_off, size_t len,
+    void *_udata)
+{
+    H5D_chunk_readvv_ud_t *udata = (H5D_chunk_readvv_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    H5D_fill_buf_info_t fb_info;    /* Dataset's fill buffer info */
+    hbool_t fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Initialize the fill value buffer */
+    if(H5D__fill_init(&fb_info, (udata->rbuf + src_off), NULL, NULL, NULL, NULL,
+            &udata->dset->shared->dcpl_cache.fill, udata->dset->shared->type,
+            udata->dset->shared->type_id, (size_t)0, len, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
+    fb_info_init = TRUE;
+
+    /* Check for VL datatype & fill the buffer with VL datatype fill values */
+    if(fb_info.has_vlen_fill_type && H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
+
+done:
+    /* Release the fill buffer info, if it's been initialized */
+    if(fb_info_init && H5D__fill_term(&fb_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__nonexistent_readvv_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__nonexistent_readvv
+ *
+ * Purpose:	When the chunk doesn't exist on disk and the chunk is bigger
+ *              than the cache size, performs fill value I/O operation on
+ *              memory buffer, advancing through two I/O vectors, until one
+ *              runs out.
+ *
+ * Note:	This algorithm is pretty inefficient about initializing and
+ *              terminating the fill buffer info structure and it would be
+ *              faster to refactor this into a "real" initialization routine,
+ *              and a "vectorized fill" routine. -QAK
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		6 Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__nonexistent_readvv(const H5D_io_info_t *io_info,
+    size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_off_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
+{
+    H5D_chunk_readvv_ud_t udata;        /* User data for H5VM_opvv() operator */
+    ssize_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(chunk_curr_seq);
+    HDassert(chunk_len_arr);
+    HDassert(chunk_off_arr);
+    HDassert(mem_curr_seq);
+    HDassert(mem_len_arr);
+    HDassert(mem_off_arr);
+
+    /* Set up user data for H5VM_opvv() */
+    udata.rbuf = (unsigned char *)io_info->u.rbuf;
+    udata.dset = io_info->dset;
+    udata.dxpl_id = io_info->dxpl_id;
+
+    /* Call generic sequence operation routine */
+    if((ret_value = H5VM_opvv(chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_off_arr,
+            mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+            H5D__nonexistent_readvv_cb, &udata)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized fill value init")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__nonexistent_readvv() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dcompact.c b/gatb-core/thirdparty/hdf5/src/H5Dcompact.c
new file mode 100644
index 0000000..826daad
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dcompact.c
@@ -0,0 +1,578 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu <slu at ncsa.uiuc.edu>
+ *              August 5, 2002
+ *
+ * Purpose:     Compact dataset I/O functions.  These routines are similar
+ *              H5D_contig_* and H5D_chunk_*.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE             /*suppress error about including H5Dpkg   */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Layout operation callbacks */
+static herr_t H5D__compact_construct(H5F_t *f, H5D_t *dset);
+static hbool_t H5D__compact_is_space_alloc(const H5O_storage_t *storage);
+static herr_t H5D__compact_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *cm);
+static ssize_t H5D__compact_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[]);
+static ssize_t H5D__compact_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[]);
+static herr_t H5D__compact_flush(H5D_t *dset, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Compact storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_COMPACT[1] = {{
+    H5D__compact_construct,
+    NULL,
+    H5D__compact_is_space_alloc,
+    H5D__compact_io_init,
+    H5D__contig_read,
+    H5D__contig_write,
+#ifdef H5_HAVE_PARALLEL
+    NULL,
+    NULL,
+#endif /* H5_HAVE_PARALLEL */
+    H5D__compact_readvv,
+    H5D__compact_writevv,
+    H5D__compact_flush,
+    NULL
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_fill
+ *
+ * Purpose:	Write fill values to a compactly stored dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		May 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__compact_fill(const H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_fill_buf_info_t fb_info;        /* Dataset's fill buffer info */
+    hbool_t     fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
+    HDassert(dset && H5D_COMPACT == dset->shared->layout.type);
+    HDassert(dset->shared->layout.storage.u.compact.buf);
+    HDassert(dset->shared->type);
+    HDassert(dset->shared->space);
+
+    /* Initialize the fill value buffer */
+    /* (use the compact dataset storage buffer as the fill value buffer) */
+    if(H5D__fill_init(&fb_info, dset->shared->layout.storage.u.compact.buf,
+            NULL, NULL, NULL, NULL,
+            &dset->shared->dcpl_cache.fill, dset->shared->type,
+            dset->shared->type_id, (size_t)0, dset->shared->layout.storage.u.compact.size, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
+    fb_info_init = TRUE;
+
+    /* Check for VL datatype & non-default fill value */
+    if(fb_info.has_vlen_fill_type)
+        /* Fill the buffer with VL datatype fill values */
+        if(H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
+
+done:
+    /* Release the fill buffer info, if it's been initialized */
+    if(fb_info_init && H5D__fill_term(&fb_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compact_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_construct
+ *
+ * Purpose:	Constructs new compact layout information for dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compact_construct(H5F_t *f, H5D_t *dset)
+{
+    hssize_t stmp_size;         /* Temporary holder for raw data size */
+    hsize_t tmp_size;           /* Temporary holder for raw data size */
+    hsize_t max_comp_data_size; /* Max. allowed size of compact data */
+    hsize_t dim[H5O_LAYOUT_NDIMS];      /* Current size of data in elements */
+    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
+    int ndims;                          /* Rank of dataspace */
+    int i;                              /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(dset);
+
+    /* Check for invalid dataset dimensions */
+    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
+    for(i = 0; i < ndims; i++)
+        if(max_dim[i] > dim[i])
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible compact dataset")
+
+    /*
+     * Compact dataset is stored in dataset object header message of
+     * layout.
+     */
+    stmp_size = H5S_GET_EXTENT_NPOINTS(dset->shared->space);
+    HDassert(stmp_size >= 0);
+    tmp_size = H5T_get_size(dset->shared->type);
+    HDassert(tmp_size > 0);
+    tmp_size = tmp_size * (hsize_t)stmp_size;
+    H5_CHECKED_ASSIGN(dset->shared->layout.storage.u.compact.size, size_t, tmp_size, hssize_t);
+
+    /* Verify data size is smaller than maximum header message size
+     * (64KB) minus other layout message fields.
+     */
+    max_comp_data_size = H5O_MESG_MAX_SIZE - H5D__layout_meta_size(f, &(dset->shared->layout), FALSE);
+    if(dset->shared->layout.storage.u.compact.size > max_comp_data_size)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "compact dataset size is bigger than header message maximum size")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compact_construct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for layout
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__compact_is_space_alloc(const H5O_storage_t H5_ATTR_UNUSED *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+
+    /* Compact storage is currently always allocated */
+    FUNC_LEAVE_NOAPI(TRUE)
+} /* end H5D__compact_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_io_init
+ *
+ * Purpose:	Performs initialization before any sort of I/O on the raw data
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compact_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNUSED *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *cm)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    io_info->store->compact.buf = io_info->dset->shared->layout.storage.u.compact.buf;
+    io_info->store->compact.dirty = &io_info->dset->shared->layout.storage.u.compact.dirty;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__compact_io_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__compact_readvv
+ *
+ * Purpose:     Reads some data vectors from a dataset into a buffer.
+ *              The data is in compact dataset.  The address is relative
+ *              to the beginning address of the dataset.  The offsets and
+ *              sequence lengths are in bytes.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              May 7, 2003
+ *
+ * Notes:
+ *              Offsets in the sequences must be monotonically increasing
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__compact_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[])
+{
+    ssize_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(io_info);
+
+    /* Use the vectorized memory copy routine to do actual work */
+    if((ret_value = H5VM_memcpyvv(io_info->u.rbuf, mem_max_nseq, mem_curr_seq, mem_size_arr, mem_offset_arr, io_info->store->compact.buf, dset_max_nseq, dset_curr_seq, dset_size_arr, dset_offset_arr)) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__compact_readvv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__compact_writevv
+ *
+ * Purpose:     Writes some data vectors from a dataset into a buffer.
+ *              The data is in compact dataset.  The address is relative
+ *              to the beginning address for the file.  The offsets and
+ *              sequence lengths are in bytes.  This function only copies
+ *              data into the buffer in the LAYOUT struct and mark it
+ *              as DIRTY.  Later in H5D_close, the data is copied into
+ *              header message in memory.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              May 2, 2003
+ *
+ * Notes:
+ *              Offsets in the sequences must be monotonically increasing
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__compact_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[])
+{
+    ssize_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(io_info);
+
+    /* Use the vectorized memory copy routine to do actual work */
+    if((ret_value = H5VM_memcpyvv(io_info->store->compact.buf, dset_max_nseq, dset_curr_seq, dset_size_arr, dset_offset_arr, io_info->u.wbuf, mem_max_nseq, mem_curr_seq, mem_size_arr, mem_offset_arr)) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed")
+
+    /* Mark the compact dataset's buffer as dirty */
+    *io_info->store->compact.dirty = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__compact_writevv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_flush
+ *
+ * Purpose:	Writes dirty compact data to object header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compact_flush(H5D_t *dset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Check if the buffered compact information is dirty */
+    if(dset->shared->layout.storage.u.compact.dirty) {
+        if(H5O_msg_write(&(dset->oloc), H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &(dset->shared->layout), dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message")
+        dset->shared->layout.storage.u.compact.dirty = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compact_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__compact_copy
+ *
+ * Purpose:     Copy compact storage raw data from SRC file to DST file.
+ *
+ * Return:      Non-negative on success, negative on failure.
+ *
+ * Programmer:  Peter Cao
+ *              December 11, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__compact_copy(H5F_t *f_src, H5O_storage_compact_t *storage_src, H5F_t *f_dst,
+    H5O_storage_compact_t *storage_dst, H5T_t *dt_src, H5O_copy_t *cpy_info,
+    hid_t dxpl_id)
+{
+    hid_t       tid_src = -1;           /* Datatype ID for source datatype */
+    hid_t       tid_dst = -1;           /* Datatype ID for destination datatype */
+    hid_t       tid_mem = -1;           /* Datatype ID for memory datatype */
+    void       *buf = NULL;             /* Buffer for copying data */
+    void       *bkg = NULL;             /* Temporary buffer for copying data */
+    void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
+    hid_t       buf_sid = -1;           /* ID for buffer dataspace */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(f_src);
+    HDassert(storage_src);
+    HDassert(f_dst);
+    HDassert(storage_dst);
+    HDassert(dt_src);
+
+    /* Allocate space for destination data */
+    if(NULL == (storage_dst->buf = H5MM_malloc(storage_src->size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "unable to allocate memory for compact dataset")
+
+    /* Create datatype ID for src datatype, so it gets freed */
+    if((tid_src = H5I_register(H5I_DATATYPE, dt_src, FALSE)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register source file datatype")
+
+    /* If there's a VLEN source datatype, do type conversion information */
+    if(H5T_detect_class(dt_src, H5T_VLEN, FALSE) > 0) {
+        H5T_path_t  *tpath_src_mem, *tpath_mem_dst;   /* Datatype conversion paths */
+        H5T_t *dt_dst;              /* Destination datatype */
+        H5T_t *dt_mem;              /* Memory datatype */
+        H5S_t *buf_space;           /* Dataspace describing buffer */
+        size_t buf_size;            /* Size of copy buffer */
+        size_t nelmts;              /* Number of elements in buffer */
+        size_t src_dt_size;         /* Source datatype size */
+        size_t tmp_dt_size;         /* Temporary datatype size */
+        size_t max_dt_size;         /* Max atatype size */
+        hsize_t buf_dim;            /* Dimension for buffer */
+
+        /* create a memory copy of the variable-length datatype */
+        if(NULL == (dt_mem = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+        if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0) {
+            H5T_close(dt_mem);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register memory datatype")
+        } /* end if */
+
+        /* create variable-length datatype at the destinaton file */
+        if(NULL == (dt_dst = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+        if(H5T_set_loc(dt_dst, f_dst, H5T_LOC_DISK) < 0) {
+            H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype on disk")
+        } /* end if */
+        if((tid_dst = H5I_register(H5I_DATATYPE, dt_dst, FALSE)) < 0) {
+            H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register destination file datatype")
+        } /* end if */
+
+        /* Set up the conversion functions */
+        if(NULL == (tpath_src_mem = H5T_path_find(dt_src, dt_mem, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert between src and mem datatypes")
+        if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, dt_dst, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert between mem and dst datatypes")
+
+        /* Determine largest datatype size */
+        if(0 == (src_dt_size = H5T_get_size(dt_src)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        if(0 == (tmp_dt_size = H5T_get_size(dt_mem)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(src_dt_size, tmp_dt_size);
+        if(0 == (tmp_dt_size = H5T_get_size(dt_dst)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(max_dt_size, tmp_dt_size);
+
+        /* Set number of whole elements that fit in buffer */
+        if(0 == (nelmts = storage_src->size / src_dt_size))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "element size too large")
+
+        /* Set up number of bytes to copy, and initial buffer size */
+        buf_size = nelmts * max_dt_size;
+
+        /* Create dataspace for number of elements in buffer */
+        buf_dim = nelmts;
+
+        /* Create the space and set the initial extent */
+        if(NULL == (buf_space = H5S_create_simple((unsigned)1, &buf_dim, NULL)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+        /* Atomize */
+        if((buf_sid = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) {
+            H5S_close(buf_space);
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+        } /* end if */
+
+        /* Allocate memory for recclaim buf */
+        if(NULL == (reclaim_buf = H5FL_BLK_MALLOC(type_conv, buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Allocate memory for copying the chunk */
+        if(NULL == (buf = H5FL_BLK_MALLOC(type_conv, buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        HDmemcpy(buf, storage_src->buf, storage_src->size);
+
+        /* allocate temporary bkg buff for data conversion */
+        if(NULL == (bkg = H5FL_BLK_MALLOC(type_conv, buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Convert from source file to memory */
+        if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+        /* Copy into another buffer, to reclaim memory later */
+        HDmemcpy(reclaim_buf, buf, buf_size);
+
+        /* Set background buffer to all zeros */
+        HDmemset(bkg, 0, buf_size);
+
+        /* Convert from memory to destination file */
+        if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+        HDmemcpy(storage_dst->buf, buf, storage_dst->size);
+
+        if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to reclaim variable-length data")
+    } /* end if */
+    else if(H5T_get_class(dt_src, FALSE) == H5T_REFERENCE) {
+        if(f_src != f_dst) {
+            /* Check for expanding references */
+            if(cpy_info->expand_ref) {
+                size_t ref_count;
+
+                /* Determine # of reference elements to copy */
+                ref_count = storage_src->size / H5T_get_size(dt_src);
+
+                /* Copy objects referenced in source buffer to destination file and set destination elements */
+                if(H5O_copy_expand_ref(f_src, storage_src->buf, dxpl_id, f_dst,
+                        storage_dst->buf, ref_count, H5T_get_ref_type(dt_src), cpy_info) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy reference attribute")
+            } /* end if */
+            else
+                /* Reset value to zero */
+                HDmemset(storage_dst->buf, 0, storage_src->size);
+        } /* end if */
+        else
+            /* Type conversion not necessary */
+            HDmemcpy(storage_dst->buf, storage_src->buf, storage_src->size);
+    } /* end if */
+    else
+        /* Type conversion not necessary */
+        HDmemcpy(storage_dst->buf, storage_src->buf, storage_src->size);
+
+    /* Mark destination buffer as dirty */
+    storage_dst->dirty = TRUE;
+
+done:
+    if(buf_sid > 0 && H5I_dec_ref(buf_sid) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't decrement temporary dataspace ID")
+    if(tid_src > 0 && H5I_dec_ref(tid_src) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_dst > 0 && H5I_dec_ref(tid_dst) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_mem > 0 && H5I_dec_ref(tid_mem) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(buf)
+        buf = H5FL_BLK_FREE(type_conv, buf);
+    if(reclaim_buf)
+        reclaim_buf = H5FL_BLK_FREE(type_conv, reclaim_buf);
+    if(bkg)
+        bkg = H5FL_BLK_FREE(type_conv, bkg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compact_copy() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dcontig.c b/gatb-core/thirdparty/hdf5/src/H5Dcontig.c
new file mode 100644
index 0000000..844632c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dcontig.c
@@ -0,0 +1,1523 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: 	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *	       	Thursday, September 28, 2000
+ *
+ * Purpose:
+ *      Contiguous dataset I/O functions. These routines are similar to
+ *      the H5D_chunk_* routines and really only an abstract way of dealing
+ *      with the data sieve buffer from H5F_seq_read/write.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Callback info for sieve buffer readvv operation */
+typedef struct H5D_contig_readvv_sieve_ud_t {
+    H5F_t *file;                /* File for dataset */
+    H5D_rdcdc_t *dset_contig;   /* Cached information about contiguous data */
+    const H5D_contig_storage_t *store_contig;    /* Contiguous storage info for this I/O operation */
+    unsigned char *rbuf;        /* Pointer to buffer to fill */
+    hid_t dxpl_id;              /* DXPL for operation */
+} H5D_contig_readvv_sieve_ud_t;
+
+/* Callback info for [plain] readvv operation */
+typedef struct H5D_contig_readvv_ud_t {
+    H5F_t *file;                /* File for dataset */
+    haddr_t dset_addr;          /* Address of dataset */
+    unsigned char *rbuf;        /* Pointer to buffer to fill */
+    hid_t dxpl_id;              /* DXPL for operation */
+} H5D_contig_readvv_ud_t;
+
+/* Callback info for sieve buffer writevv operation */
+typedef struct H5D_contig_writevv_sieve_ud_t {
+    H5F_t *file;                /* File for dataset */
+    H5D_rdcdc_t *dset_contig;   /* Cached information about contiguous data */
+    const H5D_contig_storage_t *store_contig;    /* Contiguous storage info for this I/O operation */
+    const unsigned char *wbuf;  /* Pointer to buffer to write */
+    hid_t dxpl_id;              /* DXPL for operation */
+} H5D_contig_writevv_sieve_ud_t;
+
+/* Callback info for [plain] writevv operation */
+typedef struct H5D_contig_writevv_ud_t {
+    H5F_t *file;                /* File for dataset */
+    haddr_t dset_addr;          /* Address of dataset */
+    const unsigned char *wbuf;  /* Pointer to buffer to write */
+    hid_t dxpl_id;              /* DXPL for operation */
+} H5D_contig_writevv_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Layout operation callbacks */
+static herr_t H5D__contig_construct(H5F_t *f, H5D_t *dset);
+static herr_t H5D__contig_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *cm);
+static ssize_t H5D__contig_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+static ssize_t H5D__contig_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+static herr_t H5D__contig_flush(H5D_t *dset, hid_t dxpl_id);
+
+/* Helper routines */
+static herr_t H5D__contig_write_one(H5D_io_info_t *io_info, hsize_t offset,
+    size_t size);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Contiguous storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_CONTIG[1] = {{
+    H5D__contig_construct,
+    NULL,
+    H5D__contig_is_space_alloc,
+    H5D__contig_io_init,
+    H5D__contig_read,
+    H5D__contig_write,
+#ifdef H5_HAVE_PARALLEL
+    H5D__contig_collective_read,
+    H5D__contig_collective_write,
+#endif /* H5_HAVE_PARALLEL */
+    H5D__contig_readvv,
+    H5D__contig_writevv,
+    H5D__contig_flush,
+    NULL
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a PQ free list to manage the sieve buffer information */
+H5FL_BLK_DEFINE(sieve_buf);
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_alloc
+ *
+ * Purpose:	Allocate file space for a contiguously stored dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		April 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_alloc(H5F_t *f, hid_t dxpl_id, H5O_storage_contig_t *storage /*out */ )
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(f);
+    HDassert(storage);
+
+    /* Allocate space for the contiguous data */
+    if(HADDR_UNDEF == (storage->addr = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, storage->size)))
+        HGOTO_ERROR(H5E_IO, H5E_NOSPACE, FAIL, "unable to reserve file space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_alloc */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_fill
+ *
+ * Purpose:	Write fill values to a contiguously stored dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		August 22, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_fill(const H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_io_info_t ioinfo;       /* Dataset I/O info */
+    H5D_storage_t store;        /* Union of storage info for dataset */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    hssize_t    snpoints;       /* Number of points in space (for error checking) */
+    size_t      npoints;        /* Number of points in space */
+    hsize_t	offset;         /* Offset of dataset */
+#ifdef H5_HAVE_PARALLEL
+    MPI_Comm	mpi_comm = MPI_COMM_NULL;	/* MPI communicator for file */
+    int         mpi_rank = (-1);  /* This process's rank  */
+    int         mpi_code;       /* MPI return code */
+    hbool_t     blocks_written = FALSE; /* Flag to indicate that chunk was actually written */
+    hbool_t     using_mpi = FALSE;      /* Flag to indicate that the file is being accessed with an MPI-capable file driver */
+#endif /* H5_HAVE_PARALLEL */
+    H5D_fill_buf_info_t fb_info;        /* Dataset's fill buffer info */
+    hbool_t     fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    hid_t       my_dxpl_id;     /* DXPL ID to use for this operation */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
+    HDassert(dset && H5D_CONTIGUOUS == dset->shared->layout.type);
+    HDassert(H5F_addr_defined(dset->shared->layout.storage.u.contig.addr));
+    HDassert(dset->shared->layout.storage.u.contig.size > 0);
+    HDassert(dset->shared->space);
+    HDassert(dset->shared->type);
+
+#ifdef H5_HAVE_PARALLEL
+    /* Retrieve MPI parameters */
+    if(H5F_HAS_FEATURE(dset->oloc.file, H5FD_FEAT_HAS_MPI)) {
+        /* Get the MPI communicator */
+        if(MPI_COMM_NULL == (mpi_comm = H5F_mpi_get_comm(dset->oloc.file)))
+            HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator")
+
+        /* Get the MPI rank */
+        if((mpi_rank = H5F_mpi_get_rank(dset->oloc.file)) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank")
+
+        /* Set the MPI-capable file driver flag */
+        using_mpi = TRUE;
+
+        /* Use the internal "independent" DXPL */
+        my_dxpl_id = H5AC_ind_dxpl_id;
+    } /* end if */
+    else {
+#endif  /* H5_HAVE_PARALLEL */
+        /* Use the DXPL we were given */
+        my_dxpl_id = dxpl_id;
+#ifdef H5_HAVE_PARALLEL
+    } /* end else */
+#endif  /* H5_HAVE_PARALLEL */
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(my_dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Initialize storage info for this dataset */
+    store.contig.dset_addr = dset->shared->layout.storage.u.contig.addr;
+    store.contig.dset_size = dset->shared->layout.storage.u.contig.size;
+
+    /* Get the number of elements in the dataset's dataspace */
+    if((snpoints = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "dataset has negative number of elements")
+    H5_CHECKED_ASSIGN(npoints, size_t, snpoints, hssize_t);
+
+    /* Initialize the fill value buffer */
+    if(H5D__fill_init(&fb_info, NULL, NULL, NULL, NULL, NULL,
+            &dset->shared->dcpl_cache.fill,
+            dset->shared->type, dset->shared->type_id, npoints,
+            dxpl_cache->max_temp_buf, my_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
+    fb_info_init = TRUE;
+
+    /* Start at the beginning of the dataset */
+    offset = 0;
+
+    /* Simple setup for dataset I/O info struct */
+    H5D_BUILD_IO_INFO_WRT(&ioinfo, dset, dxpl_cache, my_dxpl_id, &store, fb_info.fill_buf);
+
+    /*
+     * Fill the entire current extent with the fill value.  We can do
+     * this quite efficiently by making sure we copy the fill value
+     * in relatively large pieces.
+     */
+
+    /* Loop through writing the fill value to the dataset */
+    while(npoints > 0) {
+        size_t curr_points;     /* Number of elements to write on this iteration of the loop */
+        size_t size;            /* Size of buffer to write */
+
+        /* Compute # of elements and buffer size to write for this iteration */
+        curr_points = MIN(fb_info.elmts_per_buf, npoints);
+        size = curr_points * fb_info.file_elmt_size;
+
+        /* Check for VL datatype & non-default fill value */
+        if(fb_info.has_vlen_fill_type)
+            /* Re-fill the buffer to use for this I/O operation */
+            if(H5D__fill_refill_vl(&fb_info, curr_points, my_dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
+
+#ifdef H5_HAVE_PARALLEL
+            /* Check if this file is accessed with an MPI-capable file driver */
+            if(using_mpi) {
+                /* Write the chunks out from only one process */
+                /* !! Use the internal "independent" DXPL!! -QAK */
+                if(H5_PAR_META_WRITE == mpi_rank)
+                    if(H5D__contig_write_one(&ioinfo, offset, size) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset")
+
+                /* Indicate that blocks are being written */
+                blocks_written = TRUE;
+            } /* end if */
+            else {
+#endif /* H5_HAVE_PARALLEL */
+                H5_CHECK_OVERFLOW(size, size_t, hsize_t);
+                if(H5D__contig_write_one(&ioinfo, offset, size) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset")
+#ifdef H5_HAVE_PARALLEL
+            } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+
+          npoints -= curr_points;
+          offset += size;
+      } /* end while */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Only need to block at the barrier if we actually wrote fill values */
+    /* And if we are using an MPI-capable file driver */
+    if(using_mpi && blocks_written) {
+        /* Wait at barrier to avoid race conditions where some processes are
+         * still writing out fill values and other processes race ahead to data
+         * in, getting bogus data.
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    /* Release the fill buffer info, if it's been initialized */
+    if(fb_info_init && H5D__fill_term(&fb_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_delete
+ *
+ * Purpose:	Delete the file space for a contiguously stored dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_delete(H5F_t *f, hid_t dxpl_id, const H5O_storage_t *storage)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(f);
+    HDassert(storage);
+
+    /* Free the file space for the chunk */
+    if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, storage->u.contig.addr, storage->u.contig.size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free contiguous storage space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_delete */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_construct
+ *
+ * Purpose:	Constructs new contiguous layout information for dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5D__contig_construct(H5F_t *f, H5D_t *dset)
+{
+    hssize_t snelmts;                   /* Temporary holder for number of elements in dataspace */
+    hsize_t nelmts;                     /* Number of elements in dataspace */
+    size_t dt_size;                     /* Size of datatype */
+    hsize_t tmp_size;                   /* Temporary holder for raw data size */
+    size_t tmp_sieve_buf_size;          /* Temporary holder for sieve buffer size */
+    hsize_t dim[H5O_LAYOUT_NDIMS];	/* Current size of data in elements */
+    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
+    int ndims;                          /* Rank of dataspace */
+    int i;                              /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(dset);
+
+    /*
+     * The maximum size of the dataset cannot exceed the storage size.
+     * Also, only the slowest varying dimension of a simple data space
+     * can be extendible (currently only for external data storage).
+     */
+
+    /* Check for invalid dataset dimensions */
+    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage")
+    for(i = 0; i < ndims; i++)
+        if(max_dim[i] > dim[i])
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible contiguous non-external dataset")
+
+    /* Retrieve the number of elements in the dataspace */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace")
+    nelmts = (hsize_t)snelmts;
+
+    /* Get the datatype's size */
+    if(0 == (dt_size = H5T_GET_SIZE(dset->shared->type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
+
+    /* Compute the size of the dataset's contiguous storage */
+    tmp_size = nelmts * dt_size;
+
+    /* Check for overflow during multiplication */
+    if(nelmts != (tmp_size / dt_size))
+        HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
+
+    /* Assign the dataset's contiguous storage size */
+    dset->shared->layout.storage.u.contig.size = tmp_size;
+
+    /* Get the sieve buffer size for the file */
+    tmp_sieve_buf_size = H5F_SIEVE_BUF_SIZE(f);
+
+    /* Adjust the sieve buffer size to the smaller one between the dataset size and the buffer size
+     * from the file access property. (SLU - 2012/3/30) */
+    if(tmp_size < tmp_sieve_buf_size)
+        dset->shared->cache.contig.sieve_buf_size = tmp_size;
+    else
+        dset->shared->cache.contig.sieve_buf_size = tmp_sieve_buf_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_construct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for layout
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5D__contig_is_space_alloc(const H5O_storage_t *storage)
+{
+    hbool_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+
+    /* Set return value */
+    ret_value = (hbool_t)H5F_addr_defined(storage->u.contig.addr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_io_init
+ *
+ * Purpose:	Performs initialization before any sort of I/O on the raw data
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNUSED *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *cm)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    io_info->store->contig.dset_addr = io_info->dset->shared->layout.storage.u.contig.addr;
+    io_info->store->contig.dset_size = io_info->dset->shared->layout.storage.u.contig.size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__contig_io_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_read
+ *
+ * Purpose:	Read from a contiguous dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Thursday, April 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.rbuf);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+
+    /* Read data */
+    if((io_info->io_ops.single_read)(io_info, type_info, nelmts, file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "contiguous read failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_write
+ *
+ * Purpose:	Write to a contiguous dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Thursday, April 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.wbuf);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+
+    /* Write data */
+    if((io_info->io_ops.single_write)(io_info, type_info, nelmts, file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "contiguous write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_write_one
+ *
+ * Purpose:	Writes some data from a dataset into a buffer.
+ *		The data is contiguous.	 The address is relative to the base
+ *		address for the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 28, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_write_one(H5D_io_info_t *io_info, hsize_t offset, size_t size)
+{
+    hsize_t dset_off = offset;  /* Offset in dataset */
+    size_t dset_len = size;     /* Length in dataset */
+    size_t dset_curr_seq = 0;   /* "Current sequence" in dataset */
+    hsize_t mem_off = 0;        /* Offset in memory */
+    size_t mem_len = size;      /* Length in memory */
+    size_t mem_curr_seq = 0;    /* "Current sequence" in memory */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(io_info);
+
+    if(H5D__contig_writevv(io_info, (size_t)1, &dset_curr_seq, &dset_len, &dset_off,
+            (size_t)1, &mem_curr_seq, &mem_len, &mem_off) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vector write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_write_one() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_readvv_sieve_cb
+ *
+ * Purpose:	Callback operator for H5D__contig_readvv() with sieve buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_readvv_sieve_cb(hsize_t dst_off, hsize_t src_off, size_t len,
+    void *_udata)
+{
+    H5D_contig_readvv_sieve_ud_t *udata = (H5D_contig_readvv_sieve_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    H5F_t *file = udata->file;        /* File for dataset */
+    H5D_rdcdc_t *dset_contig = udata->dset_contig; /* Cached information about contiguous data */
+    const H5D_contig_storage_t *store_contig = udata->store_contig;    /* Contiguous storage info for this I/O operation */
+    unsigned char *buf;         /* Pointer to buffer to fill */
+    haddr_t addr;               /* Actual address to read */
+    haddr_t sieve_start = HADDR_UNDEF, sieve_end = HADDR_UNDEF;     /* Start & end locations of sieve buffer */
+    haddr_t contig_end;         /* End locations of block to write */
+    size_t sieve_size = (size_t)-1;   /* Size of sieve buffer */
+    haddr_t rel_eoa;	        /* Relative end of file address	*/
+    hsize_t max_data;           /* Actual maximum size of data to cache */
+    hsize_t min;                /* temporary minimum value (avoids some ugly macro nesting) */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Stash local copies of these value */
+    if(dset_contig->sieve_buf != NULL) {
+        sieve_start = dset_contig->sieve_loc;
+        sieve_size = dset_contig->sieve_size;
+        sieve_end = sieve_start + sieve_size;
+    } /* end if */
+
+    /* Compute offset on disk */
+    addr = store_contig->dset_addr + dst_off;
+
+    /* Compute offset in memory */
+    buf = udata->rbuf + src_off;
+
+    /* Check if the sieve buffer is allocated yet */
+    if(NULL == dset_contig->sieve_buf) {
+        /* Check if we can actually hold the I/O request in the sieve buffer */
+        if(len > dset_contig->sieve_buf_size) {
+            if(H5F_block_read(file, H5FD_MEM_DRAW, addr, len, udata->dxpl_id, buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+        } /* end if */
+        else {
+            /* Allocate room for the data sieve buffer */
+            if(NULL == (dset_contig->sieve_buf = H5FL_BLK_CALLOC(sieve_buf, dset_contig->sieve_buf_size)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+            /* Determine the new sieve buffer size & location */
+            dset_contig->sieve_loc = addr;
+
+            /* Make certain we don't read off the end of the file */
+            if(HADDR_UNDEF == (rel_eoa = H5F_get_eoa(file, H5FD_MEM_DRAW)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine file size")
+
+            /* Set up the buffer parameters */
+            max_data = store_contig->dset_size - dst_off;
+
+            /* Compute the size of the sieve buffer */
+            min = MIN3(rel_eoa - dset_contig->sieve_loc, max_data, dset_contig->sieve_buf_size);
+            H5_CHECKED_ASSIGN(dset_contig->sieve_size, size_t, min, hsize_t);
+
+            /* Read the new sieve buffer */
+            if(H5F_block_read(file, H5FD_MEM_DRAW, dset_contig->sieve_loc, dset_contig->sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+
+            /* Grab the data out of the buffer (must be first piece of data in buffer ) */
+            HDmemcpy(buf, dset_contig->sieve_buf, len);
+
+            /* Reset sieve buffer dirty flag */
+            dset_contig->sieve_dirty = FALSE;
+
+            /* Stash local copies of these value */
+            sieve_start = dset_contig->sieve_loc;
+            sieve_size = dset_contig->sieve_size;
+            sieve_end = sieve_start+sieve_size;
+        } /* end else */
+    } /* end if */
+    else {
+        /* Compute end of sequence to retrieve */
+        contig_end = addr + len - 1;
+
+        /* If entire read is within the sieve buffer, read it from the buffer */
+        if(addr >= sieve_start && contig_end < sieve_end) {
+            unsigned char *base_sieve_buf = dset_contig->sieve_buf + (addr - sieve_start);
+
+            /* Grab the data out of the buffer */
+            HDmemcpy(buf, base_sieve_buf, len);
+        } /* end if */
+        /* Entire request is not within this data sieve buffer */
+        else {
+            /* Check if we can actually hold the I/O request in the sieve buffer */
+            if(len > dset_contig->sieve_buf_size) {
+                /* Check for any overlap with the current sieve buffer */
+                if((sieve_start >= addr && sieve_start < (contig_end + 1))
+                        || ((sieve_end - 1) >= addr && (sieve_end - 1) < (contig_end + 1))) {
+                    /* Flush the sieve buffer, if it's dirty */
+                    if(dset_contig->sieve_dirty) {
+                        /* Write to file */
+                        if(H5F_block_write(file, H5FD_MEM_DRAW, sieve_start, sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+                        /* Reset sieve buffer dirty flag */
+                        dset_contig->sieve_dirty = FALSE;
+                    } /* end if */
+                } /* end if */
+
+                /* Read directly into the user's buffer */
+                if(H5F_block_read(file, H5FD_MEM_DRAW, addr, len, udata->dxpl_id, buf) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+            } /* end if */
+            /* Element size fits within the buffer size */
+            else {
+                /* Flush the sieve buffer if it's dirty */
+                if(dset_contig->sieve_dirty) {
+                    /* Write to file */
+                    if(H5F_block_write(file, H5FD_MEM_DRAW, sieve_start, sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+                    /* Reset sieve buffer dirty flag */
+                    dset_contig->sieve_dirty = FALSE;
+                } /* end if */
+
+                /* Determine the new sieve buffer size & location */
+                dset_contig->sieve_loc = addr;
+
+                /* Make certain we don't read off the end of the file */
+                if(HADDR_UNDEF == (rel_eoa = H5F_get_eoa(file, H5FD_MEM_DRAW)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine file size")
+
+                /* Only need this when resizing sieve buffer */
+                max_data = store_contig->dset_size - dst_off;
+
+                /* Compute the size of the sieve buffer.
+                 * Don't read off the end of the file, don't read past
+                 * the end of the data element, and don't read more than
+                 * the buffer size.
+                 */
+                min = MIN3(rel_eoa - dset_contig->sieve_loc, max_data, dset_contig->sieve_buf_size); 
+                H5_CHECKED_ASSIGN(dset_contig->sieve_size, size_t, min, hsize_t);
+
+                /* Update local copies of sieve information */
+                sieve_start = dset_contig->sieve_loc;
+                sieve_size = dset_contig->sieve_size;
+                sieve_end = sieve_start + sieve_size;
+
+                /* Read the new sieve buffer */
+                if(H5F_block_read(file, H5FD_MEM_DRAW, dset_contig->sieve_loc, dset_contig->sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+
+                /* Grab the data out of the buffer (must be first piece of data in buffer ) */
+                HDmemcpy(buf, dset_contig->sieve_buf, len);
+
+                /* Reset sieve buffer dirty flag */
+                dset_contig->sieve_dirty = FALSE;
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_readvv_sieve_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_readvv_cb
+ *
+ * Purpose:	Callback operator for H5D__contig_readvv() without sieve buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_readvv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata)
+{
+    H5D_contig_readvv_ud_t *udata = (H5D_contig_readvv_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Write data */
+    if(H5F_block_read(udata->file, H5FD_MEM_DRAW, (udata->dset_addr + dst_off),
+            len, udata->dxpl_id, (udata->rbuf + src_off)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_readvv_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_readvv
+ *
+ * Purpose:	Reads some data vectors from a dataset into a buffer.
+ *		The data is contiguous.	 The address is the start of the dataset,
+ *              relative to the base address for the file and the offsets and
+ *              sequence lengths are in bytes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, May 3, 2001
+ *
+ * Notes:
+ *      Offsets in the sequences must be monotonically increasing
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__contig_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
+{
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(dset_curr_seq);
+    HDassert(dset_len_arr);
+    HDassert(dset_off_arr);
+    HDassert(mem_curr_seq);
+    HDassert(mem_len_arr);
+    HDassert(mem_off_arr);
+
+    /* Check if data sieving is enabled */
+    if(H5F_HAS_FEATURE(io_info->dset->oloc.file, H5FD_FEAT_DATA_SIEVE)) {
+        H5D_contig_readvv_sieve_ud_t udata;     /* User data for H5VM_opvv() operator */
+
+        /* Set up user data for H5VM_opvv() */
+        udata.file = io_info->dset->oloc.file;
+        udata.dset_contig = &(io_info->dset->shared->cache.contig);
+        udata.store_contig = &(io_info->store->contig);
+        udata.rbuf = (unsigned char *)io_info->u.rbuf;
+        udata.dxpl_id = io_info->dxpl_id;
+
+        /* Call generic sequence operation routine */
+        if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+                mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+                H5D__contig_readvv_sieve_cb, &udata)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized sieve buffer read")
+    } /* end if */
+    else {
+        H5D_contig_readvv_ud_t udata;     /* User data for H5VM_opvv() operator */
+
+        /* Set up user data for H5VM_opvv() */
+        udata.file = io_info->dset->oloc.file;
+        udata.dset_addr = io_info->store->contig.dset_addr;
+        udata.rbuf = (unsigned char *)io_info->u.rbuf;
+        udata.dxpl_id = io_info->dxpl_id;
+
+        /* Call generic sequence operation routine */
+        if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+                mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+                H5D__contig_readvv_cb, &udata)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized read")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_readvv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_writevv_sieve_cb
+ *
+ * Purpose:	Callback operator for H5D__contig_writevv() with sieve buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_writevv_sieve_cb(hsize_t dst_off, hsize_t src_off, size_t len,
+    void *_udata)
+{
+    H5D_contig_writevv_sieve_ud_t *udata = (H5D_contig_writevv_sieve_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    H5F_t *file = udata->file;        /* File for dataset */
+    H5D_rdcdc_t *dset_contig = udata->dset_contig; /* Cached information about contiguous data */
+    const H5D_contig_storage_t *store_contig = udata->store_contig;    /* Contiguous storage info for this I/O operation */
+    const unsigned char *buf;   /* Pointer to buffer to fill */
+    haddr_t addr;               /* Actual address to read */
+    haddr_t sieve_start = HADDR_UNDEF, sieve_end = HADDR_UNDEF;     /* Start & end locations of sieve buffer */
+    haddr_t contig_end;         /* End locations of block to write */
+    size_t sieve_size = (size_t)-1; /* size of sieve buffer */
+    haddr_t rel_eoa;	        /* Relative end of file address	*/
+    hsize_t max_data;           /* Actual maximum size of data to cache */
+    hsize_t min;                /* temporary minimum value (avoids some ugly macro nesting) */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Stash local copies of these values */
+    if(dset_contig->sieve_buf != NULL) {
+        sieve_start = dset_contig->sieve_loc;
+        sieve_size = dset_contig->sieve_size;
+        sieve_end = sieve_start + sieve_size;
+    } /* end if */
+
+    /* Compute offset on disk */
+    addr = store_contig->dset_addr + dst_off;
+
+    /* Compute offset in memory */
+    buf = udata->wbuf + src_off;
+
+    /* No data sieve buffer yet, go allocate one */
+    if(NULL == dset_contig->sieve_buf) {
+        /* Check if we can actually hold the I/O request in the sieve buffer */
+        if(len > dset_contig->sieve_buf_size) {
+            if(H5F_block_write(file, H5FD_MEM_DRAW, addr, len, udata->dxpl_id, buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+        } /* end if */
+        else {
+            /* Allocate room for the data sieve buffer */
+            if(NULL == (dset_contig->sieve_buf = H5FL_BLK_CALLOC(sieve_buf, dset_contig->sieve_buf_size)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+#ifdef H5_CLEAR_MEMORY
+if(dset_contig->sieve_size > len)
+    HDmemset(dset_contig->sieve_buf + len, 0, (dset_contig->sieve_size - len));
+#endif /* H5_CLEAR_MEMORY */
+
+            /* Determine the new sieve buffer size & location */
+            dset_contig->sieve_loc = addr;
+
+            /* Make certain we don't read off the end of the file */
+            if(HADDR_UNDEF == (rel_eoa = H5F_get_eoa(file, H5FD_MEM_DRAW)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine file size")
+
+            /* Set up the buffer parameters */
+            max_data = store_contig->dset_size - dst_off;
+
+            /* Compute the size of the sieve buffer */
+            min = MIN3(rel_eoa - dset_contig->sieve_loc, max_data, dset_contig->sieve_buf_size); 
+            H5_CHECKED_ASSIGN(dset_contig->sieve_size, size_t, min, hsize_t);
+
+            /* Check if there is any point in reading the data from the file */
+            if(dset_contig->sieve_size > len) {
+                /* Read the new sieve buffer */
+                if(H5F_block_read(file, H5FD_MEM_DRAW, dset_contig->sieve_loc, dset_contig->sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+            } /* end if */
+
+            /* Grab the data out of the buffer (must be first piece of data in buffer ) */
+            HDmemcpy(dset_contig->sieve_buf, buf, len);
+
+            /* Set sieve buffer dirty flag */
+            dset_contig->sieve_dirty = TRUE;
+
+            /* Stash local copies of these values */
+            sieve_start = dset_contig->sieve_loc;
+            sieve_size = dset_contig->sieve_size;
+            sieve_end = sieve_start + sieve_size;
+        } /* end else */
+    } /* end if */
+    else {
+        /* Compute end of sequence to retrieve */
+        contig_end = addr + len - 1;
+
+        /* If entire write is within the sieve buffer, write it to the buffer */
+        if(addr >= sieve_start && contig_end < sieve_end) {
+            unsigned char *base_sieve_buf = dset_contig->sieve_buf + (addr - sieve_start);
+
+            /* Put the data into the sieve buffer */
+            HDmemcpy(base_sieve_buf, buf, len);
+
+            /* Set sieve buffer dirty flag */
+            dset_contig->sieve_dirty = TRUE;
+        } /* end if */
+        /* Entire request is not within this data sieve buffer */
+        else {
+            /* Check if we can actually hold the I/O request in the sieve buffer */
+            if(len > dset_contig->sieve_buf_size) {
+                /* Check for any overlap with the current sieve buffer */
+                if((sieve_start >= addr && sieve_start < (contig_end + 1))
+                        || ((sieve_end - 1) >= addr && (sieve_end - 1) < (contig_end + 1))) {
+                    /* Flush the sieve buffer, if it's dirty */
+                    if(dset_contig->sieve_dirty) {
+                        /* Write to file */
+                        if(H5F_block_write(file, H5FD_MEM_DRAW, sieve_start, sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+                        /* Reset sieve buffer dirty flag */
+                        dset_contig->sieve_dirty = FALSE;
+                    } /* end if */
+
+                    /* Force the sieve buffer to be re-read the next time */
+                    dset_contig->sieve_loc = HADDR_UNDEF;
+                    dset_contig->sieve_size = 0;
+                } /* end if */
+
+                /* Write directly from the user's buffer */
+                if(H5F_block_write(file, H5FD_MEM_DRAW, addr, len, udata->dxpl_id, buf) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+            } /* end if */
+            /* Element size fits within the buffer size */
+            else {
+                /* Check if it is possible to (exactly) prepend or append to existing (dirty) sieve buffer */
+                if(((addr + len) == sieve_start || addr == sieve_end) &&
+                        (len + sieve_size) <= dset_contig->sieve_buf_size &&
+                        dset_contig->sieve_dirty) {
+                    /* Prepend to existing sieve buffer */
+                    if((addr + len) == sieve_start) {
+                        /* Move existing sieve information to correct location */
+                        HDmemmove(dset_contig->sieve_buf + len, dset_contig->sieve_buf, dset_contig->sieve_size);
+
+                        /* Copy in new information (must be first in sieve buffer) */
+                        HDmemcpy(dset_contig->sieve_buf, buf, len);
+
+                        /* Adjust sieve location */
+                        dset_contig->sieve_loc = addr;
+
+                    } /* end if */
+                    /* Append to existing sieve buffer */
+                    else {
+                        /* Copy in new information */
+                        HDmemcpy(dset_contig->sieve_buf + sieve_size, buf, len);
+                    } /* end else */
+
+                    /* Adjust sieve size */
+                    dset_contig->sieve_size += len;
+
+                    /* Update local copies of sieve information */
+                    sieve_start = dset_contig->sieve_loc;
+                    sieve_size = dset_contig->sieve_size;
+                    sieve_end = sieve_start + sieve_size;
+                } /* end if */
+                /* Can't add the new data onto the existing sieve buffer */
+                else {
+                    /* Flush the sieve buffer if it's dirty */
+                    if(dset_contig->sieve_dirty) {
+                        /* Write to file */
+                        if(H5F_block_write(file, H5FD_MEM_DRAW, sieve_start, sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+                        /* Reset sieve buffer dirty flag */
+                        dset_contig->sieve_dirty = FALSE;
+                    } /* end if */
+
+                    /* Determine the new sieve buffer size & location */
+                    dset_contig->sieve_loc = addr;
+
+                    /* Make certain we don't read off the end of the file */
+                    if(HADDR_UNDEF == (rel_eoa = H5F_get_eoa(file, H5FD_MEM_DRAW)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine file size")
+
+                    /* Only need this when resizing sieve buffer */
+                    max_data = store_contig->dset_size - dst_off;
+
+                    /* Compute the size of the sieve buffer.
+                     * Don't read off the end of the file, don't read past
+                     * the end of the data element, and don't read more than
+                     * the buffer size.
+                     */
+                    min = MIN3(rel_eoa - dset_contig->sieve_loc, max_data, dset_contig->sieve_buf_size); 
+                    H5_CHECKED_ASSIGN(dset_contig->sieve_size, size_t, min, hsize_t);
+
+                    /* Update local copies of sieve information */
+                    sieve_start = dset_contig->sieve_loc;
+                    sieve_size = dset_contig->sieve_size;
+                    sieve_end = sieve_start + sieve_size;
+
+                    /* Check if there is any point in reading the data from the file */
+                    if(dset_contig->sieve_size > len) {
+                        /* Read the new sieve buffer */
+                        if(H5F_block_read(file, H5FD_MEM_DRAW, dset_contig->sieve_loc, dset_contig->sieve_size, udata->dxpl_id, dset_contig->sieve_buf) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "block read failed")
+                    } /* end if */
+
+                    /* Grab the data out of the buffer (must be first piece of data in buffer ) */
+                    HDmemcpy(dset_contig->sieve_buf, buf, len);
+
+                    /* Set sieve buffer dirty flag */
+                    dset_contig->sieve_dirty = TRUE;
+                } /* end else */
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_writevv_sieve_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_writevv_cb
+ *
+ * Purpose:	Callback operator for H5D__contig_writevv().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_writevv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata)
+{
+    H5D_contig_writevv_ud_t *udata = (H5D_contig_writevv_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Write data */
+    if(H5F_block_write(udata->file, H5FD_MEM_DRAW, (udata->dset_addr + dst_off), len, udata->dxpl_id, (udata->wbuf + src_off)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "block write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_writevv_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_writevv
+ *
+ * Purpose:	Writes some data vectors into a dataset from vectors into a
+ *              buffer.  The address is the start of the dataset,
+ *              relative to the base address for the file and the offsets and
+ *              sequence lengths are in bytes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, May 2, 2003
+ *
+ * Notes:
+ *      Offsets in the sequences must be monotonically increasing
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__contig_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
+{
+    ssize_t ret_value;          /* Return value (Size of sequence in bytes) */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(dset_curr_seq);
+    HDassert(dset_len_arr);
+    HDassert(dset_off_arr);
+    HDassert(mem_curr_seq);
+    HDassert(mem_len_arr);
+    HDassert(mem_off_arr);
+
+    /* Check if data sieving is enabled */
+    if(H5F_HAS_FEATURE(io_info->dset->oloc.file, H5FD_FEAT_DATA_SIEVE)) {
+        H5D_contig_writevv_sieve_ud_t udata;    /* User data for H5VM_opvv() operator */
+
+        /* Set up user data for H5VM_opvv() */
+        udata.file = io_info->dset->oloc.file;
+        udata.dset_contig = &(io_info->dset->shared->cache.contig);
+        udata.store_contig = &(io_info->store->contig);
+        udata.wbuf = (const unsigned char *)io_info->u.wbuf;
+        udata.dxpl_id = io_info->dxpl_id;
+
+        /* Call generic sequence operation routine */
+        if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+                mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+                H5D__contig_writevv_sieve_cb, &udata)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized sieve buffer write")
+    } /* end if */
+    else {
+        H5D_contig_writevv_ud_t udata;     /* User data for H5VM_opvv() operator */
+
+        /* Set up user data for H5VM_opvv() */
+        udata.file = io_info->dset->oloc.file;
+        udata.dset_addr = io_info->store->contig.dset_addr;
+        udata.wbuf = (const unsigned char *)io_info->u.wbuf;
+        udata.dxpl_id = io_info->dxpl_id;
+
+        /* Call generic sequence operation routine */
+        if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+                mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+                H5D__contig_writevv_cb, &udata)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized read")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__contig_writevv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_flush
+ *
+ * Purpose:	Writes all dirty data to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_flush(H5D_t *dset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Flush any data in sieve buffer */
+    if(H5D__flush_sieve_buf(dset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush sieve buffer")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_copy
+ *
+ * Purpose:	Copy contiguous storage raw data from SRC file to DST file.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:  Quincey Koziol
+ *	        Monday, November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_copy(H5F_t *f_src, const H5O_storage_contig_t *storage_src,
+    H5F_t *f_dst, H5O_storage_contig_t *storage_dst, H5T_t *dt_src,
+    H5O_copy_t *cpy_info, hid_t dxpl_id)
+{
+    haddr_t     addr_src;               /* File offset in source dataset */
+    haddr_t     addr_dst;               /* File offset in destination dataset */
+    H5T_path_t  *tpath_src_mem = NULL, *tpath_mem_dst = NULL;   /* Datatype conversion paths */
+    H5T_t       *dt_dst = NULL;         /* Destination datatype */
+    H5T_t       *dt_mem = NULL;         /* Memory datatype */
+    hid_t       tid_src = -1;           /* Datatype ID for source datatype */
+    hid_t       tid_dst = -1;           /* Datatype ID for destination datatype */
+    hid_t       tid_mem = -1;           /* Datatype ID for memory datatype */
+    size_t      src_dt_size = 0;        /* Source datatype size */
+    size_t      mem_dt_size = 0;        /* Memory datatype size */
+    size_t      dst_dt_size = 0;        /* Destination datatype size */
+    size_t      max_dt_size;            /* Max. datatype size */
+    size_t      nelmts = 0;             /* Number of elements in buffer */
+    size_t      src_nbytes;             /* Number of bytes to read from source */
+    size_t      mem_nbytes;             /* Number of bytes to convert in memory */
+    size_t      dst_nbytes;             /* Number of bytes to write to destination */
+    hsize_t     total_src_nbytes;       /* Total number of bytes to copy */
+    size_t      buf_size;               /* Size of copy buffer */
+    void       *buf = NULL;             /* Buffer for copying data */
+    void       *bkg = NULL;             /* Temporary buffer for copying data */
+    void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
+    H5S_t      *buf_space = NULL;       /* Dataspace describing buffer */
+    hid_t       buf_sid = -1;           /* ID for buffer dataspace */
+    hsize_t     buf_dim[1] = {0};       /* Dimension for buffer */
+    hbool_t     is_vlen = FALSE;        /* Flag to indicate that VL type conversion should occur */
+    hbool_t     fix_ref = FALSE;        /* Flag to indicate that ref values should be fixed */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(f_src);
+    HDassert(storage_src);
+    HDassert(f_dst);
+    HDassert(storage_dst);
+    HDassert(dt_src);
+
+    /* Allocate space for destination raw data */
+    if(H5D__contig_alloc(f_dst, dxpl_id, storage_dst) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to allocate contiguous storage")
+
+    /* Set up number of bytes to copy, and initial buffer size */
+    /* (actually use the destination size, which has been fixed up, if necessary) */
+    total_src_nbytes = storage_dst->size;
+    H5_CHECK_OVERFLOW(total_src_nbytes, hsize_t, size_t);
+    buf_size = MIN(H5D_TEMP_BUF_SIZE, (size_t)total_src_nbytes);
+
+    /* Create datatype ID for src datatype.  We may or may not use this ID,
+     * but this ensures that the src datatype will be freed.
+     */
+    if((tid_src = H5I_register(H5I_DATATYPE, dt_src, FALSE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register source file datatype")
+
+    /* If there's a VLEN source datatype, set up type conversion information */
+    if(H5T_detect_class(dt_src, H5T_VLEN, FALSE) > 0) {
+        /* create a memory copy of the variable-length datatype */
+        if(NULL == (dt_mem = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+        if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0) {
+            H5T_close(dt_mem);
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register memory datatype")
+        } /* end if */
+
+        /* create variable-length datatype at the destinaton file */
+        if(NULL == (dt_dst = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to copy")
+        if(H5T_set_loc(dt_dst, f_dst, H5T_LOC_DISK) < 0) {
+            H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "cannot mark datatype on disk")
+        } /* end if */
+        if((tid_dst = H5I_register(H5I_DATATYPE, dt_dst, FALSE)) < 0) {
+            H5T_close(dt_dst);
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register destination file datatype")
+        } /* end if */
+
+        /* Set up the conversion functions */
+        if(NULL == (tpath_src_mem = H5T_path_find(dt_src, dt_mem, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert between src and mem datatypes")
+        if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, dt_dst, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert between mem and dst datatypes")
+
+        /* Determine largest datatype size */
+        if(0 == (src_dt_size = H5T_get_size(dt_src)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        if(0 == (mem_dt_size = H5T_get_size(dt_mem)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(src_dt_size, mem_dt_size);
+        if(0 == (dst_dt_size = H5T_get_size(dt_dst)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+        max_dt_size = MAX(max_dt_size, dst_dt_size);
+
+        /* Set maximum number of whole elements that fit in buffer */
+        if(0 == (nelmts = buf_size / max_dt_size))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "element size too large")
+
+        /* Set the number of bytes to transfer */
+        src_nbytes = nelmts * src_dt_size;
+        dst_nbytes = nelmts * dst_dt_size;
+        mem_nbytes = nelmts * mem_dt_size;
+
+        /* Adjust buffer size to be multiple of elements */
+        buf_size = nelmts * max_dt_size;
+
+        /* Create dataspace for number of elements in buffer */
+        buf_dim[0] = nelmts;
+
+        /* Create the space and set the initial extent */
+        if(NULL == (buf_space = H5S_create_simple((unsigned)1, buf_dim, NULL)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+        /* Atomize */
+        if((buf_sid = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) {
+            H5S_close(buf_space);
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+        } /* end if */
+
+        /* Set flag to do type conversion */
+        is_vlen = TRUE;
+    } /* end if */
+    else {
+        /* Check for reference datatype */
+        if(H5T_get_class(dt_src, FALSE) == H5T_REFERENCE) {
+            /* Need to fix values of references when copying across files */
+            if(f_src != f_dst)
+                fix_ref = TRUE;
+        } /* end if */
+
+        /* Set the number of bytes to read & write to the buffer size */
+        src_nbytes = dst_nbytes = mem_nbytes = buf_size;
+    } /* end else */
+
+    /* Allocate space for copy buffer */
+    HDassert(buf_size);
+    if(NULL == (buf = H5FL_BLK_MALLOC(type_conv, buf_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for copy buffer")
+
+    /* Need extra buffer for datatype conversions, to prevent stranding/leaking memory */
+    if(is_vlen || fix_ref) {
+        if(NULL == (reclaim_buf = H5FL_BLK_MALLOC(type_conv, buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for copy buffer")
+
+        /* allocate temporary bkg buff for data conversion */
+        if(NULL == (bkg = H5FL_BLK_MALLOC(type_conv, buf_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for copy buffer")
+    } /* end if */
+
+    /* Loop over copying data */
+    addr_src = storage_src->addr;
+    addr_dst = storage_dst->addr;
+    while(total_src_nbytes > 0) {
+        /* Check if we should reduce the number of bytes to transfer */
+        if(total_src_nbytes < src_nbytes) {
+            /* Adjust bytes to transfer */
+            src_nbytes = (size_t)total_src_nbytes;
+
+            /* Adjust dataspace describing buffer */
+            if(is_vlen) {
+                /* Adjust destination & memory bytes to transfer */
+                nelmts = src_nbytes / src_dt_size;
+                dst_nbytes = nelmts * dst_dt_size;
+                mem_nbytes = nelmts * mem_dt_size;
+
+                /* Adjust size of buffer's dataspace dimension */
+                buf_dim[0] = nelmts;
+
+                /* Adjust size of buffer's dataspace */
+                if(H5S_set_extent_real(buf_space, buf_dim) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to change buffer dataspace size")
+            } /* end if */
+            else
+                /* Adjust destination & memory bytes to transfer */
+                dst_nbytes = mem_nbytes = src_nbytes;
+        } /* end if */
+
+        /* Read raw data from source file */
+        if(H5F_block_read(f_src, H5FD_MEM_DRAW, addr_src, src_nbytes, H5P_DATASET_XFER_DEFAULT, buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to read raw data")
+
+        /* Perform datatype conversion, if necessary */
+        if(is_vlen) {
+            /* Convert from source file to memory */
+	    if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+            /* Copy into another buffer, to reclaim memory later */
+            HDmemcpy(reclaim_buf, buf, mem_nbytes);
+
+            /* Set background buffer to all zeros */
+            HDmemset(bkg, 0, buf_size);
+
+            /* Convert from memory to destination file */
+	    if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+            /* Reclaim space from variable length data */
+            if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to reclaim variable-length data")
+	} /* end if */
+        else if(fix_ref) {
+            /* Check for expanding references */
+            if(cpy_info->expand_ref) {
+                size_t ref_count;
+
+                /* Determine # of reference elements to copy */
+                ref_count = src_nbytes / H5T_get_size(dt_src);
+
+                /* Copy the reference elements */
+                if(H5O_copy_expand_ref(f_src, buf, dxpl_id, f_dst, bkg, ref_count, H5T_get_ref_type(dt_src), cpy_info) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy reference attribute")
+
+                /* After fix ref, copy the new reference elements to the buffer to write out */
+                HDmemcpy(buf, bkg,  buf_size);
+            } /* end if */
+            else
+                /* Reset value to zero */
+                HDmemset(buf, 0, src_nbytes);
+        } /* end if */
+
+        /* Write raw data to destination file */
+        if(H5F_block_write(f_dst, H5FD_MEM_DRAW, addr_dst, dst_nbytes, H5P_DATASET_XFER_DEFAULT, buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data")
+
+        /* Adjust loop variables */
+        addr_src += src_nbytes;
+        addr_dst += dst_nbytes;
+        total_src_nbytes -= src_nbytes;
+    } /* end while */
+
+done:
+    if(buf_sid > 0 && H5I_dec_ref(buf_sid) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't decrement temporary dataspace ID")
+    if(tid_src > 0 && H5I_dec_ref(tid_src) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_dst > 0 && H5I_dec_ref(tid_dst) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tid_mem > 0 && H5I_dec_ref(tid_mem) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(buf)
+        buf = H5FL_BLK_FREE(type_conv, buf);
+    if(reclaim_buf)
+        reclaim_buf = H5FL_BLK_FREE(type_conv, reclaim_buf);
+    if(bkg)
+        bkg = H5FL_BLK_FREE(type_conv, bkg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_copy() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ddbg.c b/gatb-core/thirdparty/hdf5/src/H5Ddbg.c
new file mode 100644
index 0000000..4e934f2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ddbg.c
@@ -0,0 +1,123 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5D__init_dbg_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__init_dbg_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5D__init_dbg_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5D_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__init_dbg_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5D_init())
+} /* H5D__init_dbg_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ddebug
+ *
+ * Purpose:	Prints various information about a dataset.  This function is
+ *		not to be documented in the API at this time.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 28, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ddebug(hid_t dset_id)
+{
+    H5D_t	*dset;                  /* Dataset to debug */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Print B-tree information */
+    if(H5D_CHUNKED == dset->shared->layout.type)
+	(void)H5D__chunk_dump_index(dset, H5AC_ind_dxpl_id, stdout);
+    else if(H5D_CONTIGUOUS == dset->shared->layout.type)
+	HDfprintf(stdout, "    %-10s %a\n", "Address:", dset->shared->layout.storage.u.contig.addr);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ddebug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ddeprec.c b/gatb-core/thirdparty/hdf5/src/H5Ddeprec.c
new file mode 100644
index 0000000..0b2fee6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ddeprec.c
@@ -0,0 +1,401 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Ddeprec.c
+ *		April 5 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5D interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5D__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+static herr_t H5D__extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5D__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5D_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5D_init())
+} /* H5D__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5D__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5D__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5D__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dcreate1
+ *
+ * Purpose:	Creates a new dataset named NAME at LOC_ID, opens the
+ *		dataset for access, and associates with that dataset constant
+ *		and initial persistent properties including the type of each
+ *		datapoint as stored in the file (TYPE_ID), the size of the
+ *		dataset (SPACE_ID), and other initial miscellaneous
+ *		properties (DCPL_ID).
+ *
+ *		All arguments are copied into the dataset, so the caller is
+ *		allowed to derive new types, data spaces, and creation
+ *		parameters from the old ones and reuse them in calls to
+ *		create other datasets.
+ *
+ * Return:	Success:	The object ID of the new dataset.  At this
+ *				point, the dataset is ready to receive its
+ *				raw data.  Attempting to read raw data from
+ *				the dataset will probably return the fill
+ *				value.	The dataset should be closed when
+ *				the caller is no longer interested in it.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, December  3, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
+	  hid_t dcpl_id)
+{
+    H5G_loc_t	    loc;                /* Object location to insert dataset into */
+    H5D_t	   *dset = NULL;        /* New dataset's info */
+    const H5S_t    *space;              /* Dataspace for dataset */
+    hid_t           ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, dcpl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(H5I_DATATYPE != H5I_get_type(type_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype ID")
+    if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id,H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace ID")
+    if(H5P_DEFAULT == dcpl_id)
+        dcpl_id = H5P_DATASET_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dcpl_id, H5P_DATASET_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset create property list ID")
+
+    /* Build and open the new dataset */
+    if(NULL == (dset = H5D__create_named(&loc, name, type_id, space, H5P_LINK_CREATE_DEFAULT, dcpl_id, H5P_DATASET_ACCESS_DEFAULT, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset")
+
+    /* Register the new dataset to get an ID for it */
+    if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset")
+
+done:
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dcreate1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dopen1
+ *
+ * Purpose:	Finds a dataset named NAME at LOC_ID, opens it, and returns
+ *		its ID.	 The dataset should be close when the caller is no
+ *		longer interested in it.
+ *
+ * Note:	Deprecated in favor of H5Dopen2
+ *
+ * Return:	Success:	A new dataset ID
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Dopen1(hid_t loc_id, const char *name)
+{
+    H5D_t       *dset = NULL;
+    H5G_loc_t	 loc;		        /* Object location of group */
+    H5G_loc_t	 dset_loc;		/* Object location of dataset */
+    H5G_name_t   path;            	/* Dataset group hier. path */
+    H5O_loc_t    oloc;            	/* Dataset object location */
+    H5O_type_t   obj_type;              /* Type of object at location */
+    hbool_t      loc_found = FALSE;     /* Location at 'name' found */
+    hid_t        dapl_id = H5P_DATASET_ACCESS_DEFAULT; /* dapl to use to open dataset */
+    hid_t        dxpl_id = H5AC_ind_dxpl_id;    /* dxpl to use to open datset */
+    hid_t        ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "i*s", loc_id, name);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Set up dataset location to fill in */
+    dset_loc.oloc = &oloc;
+    dset_loc.path = &path;
+    H5G_loc_reset(&dset_loc);
+
+    /* Find the dataset object */
+    if(H5G_loc_find(&loc, name, &dset_loc, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
+    loc_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_DATASET)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Open the dataset */
+    if(NULL == (dset = H5D_open(&dset_loc, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
+
+    /* Register an atom for the dataset */
+    if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom")
+
+done:
+    if(ret_value < 0) {
+        if(dset != NULL) {
+            if(H5D_close(dset) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+        } /* end if */
+        else {
+            if(loc_found && H5G_loc_free(&dset_loc) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dopen1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dextend
+ *
+ * Purpose:	This function makes sure that the dataset is at least of size
+ *		SIZE. The dimensionality of SIZE is the same as the data
+ *		space of the dataset being changed.
+ *
+ * Note:	Deprecated in favor of H5Dset_extent
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dextend(hid_t dset_id, const hsize_t size[])
+{
+    H5D_t	*dset;
+    herr_t       ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", dset_id, size);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(!size)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified")
+
+    /* Increase size */
+    if(H5D__extend(dset, size, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to extend dataset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dextend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__extend
+ *
+ * Purpose:	Increases the size of a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id)
+{
+    htri_t changed;                     /* Flag to indicate that the dataspace was successfully extended */
+    H5S_t *space;                       /* Dataset's dataspace */
+    int     rank;                       /* Dataspace # of dimensions */
+    hsize_t curr_dims[H5O_LAYOUT_NDIMS];/* Current dimension sizes */
+    H5O_fill_t *fill;                   /* Dataset's fill value */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(dataset);
+    HDassert(size);
+
+    /* Check if the filters in the DCPL will need to encode, and if so, can they? */
+    if(H5D__check_filters(dataset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't apply filters")
+
+    /*
+     * NOTE: Restrictions on extensions were checked when the dataset was
+     *	     created.  All extensions are allowed here since none should be
+     *	     able to muck things up.
+     */
+
+    /* Retrieve the current dimensions */
+    space = dataset->shared->space;
+    if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+
+    /* Increase the size of the data space */
+    if((changed = H5S_extend(space, size)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to increase size of data space")
+
+    /* Updated the dataset's info if the dataspace was successfully extended */
+    if(changed) {
+        /* Update the index values for the cached chunks for this dataset */
+        if(H5D_CHUNKED == dataset->shared->layout.type) {
+            if(H5D__chunk_set_info(dataset) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to update # of chunks")
+            if(H5D__chunk_update_cache(dataset, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+        } /* end if */
+
+	/* Allocate space for the new parts of the dataset, if appropriate */
+        fill = &dataset->shared->dcpl_cache.fill;
+        if(fill->alloc_time == H5D_ALLOC_TIME_EARLY)
+            if(H5D__alloc_storage(dataset, dxpl_id, H5D_ALLOC_EXTEND, FALSE,
+                    curr_dims) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value")
+
+        /* Mark the dataspace as dirty, for later writing to the file */
+        if(H5D__mark(dataset, dxpl_id, H5D_MARK_SPACE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to mark dataspace as dirty")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__extend() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Defl.c b/gatb-core/thirdparty/hdf5/src/H5Defl.c
new file mode 100644
index 0000000..6ee9000
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Defl.c
@@ -0,0 +1,624 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *	       Thursday, September 30, 2004
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                        */
+#include "H5Dpkg.h"             /* Datasets                                 */
+#include "H5Eprivate.h"         /* Error handling                           */
+#include "H5Fprivate.h"         /* Files                                    */
+#include "H5HLprivate.h"        /* Local Heaps                              */
+#include "H5MMprivate.h"        /* Memory management                        */
+#include "H5VMprivate.h"        /* Vector and array functions               */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Callback info for readvv operation */
+typedef struct H5D_efl_readvv_ud_t {
+    const H5O_efl_t *efl;       /* Pointer to efl info */
+    const H5D_t *dset;          /* The dataset */
+    unsigned char *rbuf;        /* Read buffer */
+} H5D_efl_readvv_ud_t;
+
+/* Callback info for writevv operation */
+typedef struct H5D_efl_writevv_ud_t {
+    const H5O_efl_t *efl;       /* Pointer to efl info */
+    const H5D_t *dset;          /* The dataset */
+    const unsigned char *wbuf;  /* Write buffer */
+} H5D_efl_writevv_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Layout operation callbacks */
+static herr_t H5D__efl_construct(H5F_t *f, H5D_t *dset);
+static herr_t H5D__efl_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *cm);
+static ssize_t H5D__efl_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+static ssize_t H5D__efl_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+
+/* Helper routines */
+static herr_t H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size,
+    uint8_t *buf);
+static herr_t H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size,
+    const uint8_t *buf);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* External File List (EFL) storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_EFL[1] = {{
+    H5D__efl_construct,
+    NULL,
+    H5D__efl_is_space_alloc,
+    H5D__efl_io_init,
+    H5D__contig_read,
+    H5D__contig_write,
+#ifdef H5_HAVE_PARALLEL
+    NULL,
+    NULL,
+#endif /* H5_HAVE_PARALLEL */
+    H5D__efl_readvv,
+    H5D__efl_writevv,
+    NULL,
+    NULL
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_construct
+ *
+ * Purpose:	Constructs new EFL layout information for dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_construct(H5F_t *f, H5D_t *dset)
+{
+    size_t dt_size;                     /* Size of datatype */
+    hsize_t dim[H5O_LAYOUT_NDIMS];	/* Current size of data in elements */
+    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
+    hssize_t stmp_size;                 /* Temporary holder for raw data size */
+    hsize_t tmp_size;                   /* Temporary holder for raw data size */
+    hsize_t max_points;                 /* Maximum elements */
+    hsize_t max_storage;                /* Maximum storage size */
+    int ndims;                          /* Rank of dataspace */
+    int i;                              /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(dset);
+
+    /*
+     * The maximum size of the dataset cannot exceed the storage size.
+     * Also, only the slowest varying dimension of a simple data space
+     * can be extendible (currently only for external data storage).
+     */
+
+    /* Check for invalid dataset dimensions */
+    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage")
+    for(i = 1; i < ndims; i++)
+        if(max_dim[i] > dim[i])
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "only the first dimension can be extendible")
+
+    /* Retrieve the size of the dataset's datatype */
+    if(0 == (dt_size = H5T_get_size(dset->shared->type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size")
+
+    /* Check for storage overflows */
+    max_points = H5S_get_npoints_max(dset->shared->space);
+    max_storage = H5O_efl_total_size(&dset->shared->dcpl_cache.efl);
+    if(H5S_UNLIMITED == max_points) {
+        if(H5O_EFL_UNLIMITED != max_storage)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unlimited dataspace but finite storage")
+    } /* end if */
+    else if((max_points * dt_size) < max_points)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataspace * type size overflowed")
+    else if((max_points * dt_size) > max_storage)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataspace size exceeds external storage size")
+
+    /* Compute the total size of dataset */
+    stmp_size = H5S_GET_EXTENT_NPOINTS(dset->shared->space);
+    HDassert(stmp_size >= 0);
+    tmp_size = (hsize_t)stmp_size * dt_size;
+    H5_CHECKED_ASSIGN(dset->shared->layout.storage.u.contig.size, hsize_t, tmp_size, hssize_t);
+
+    /* Get the sieve buffer size for this dataset */
+    dset->shared->cache.contig.sieve_buf_size = H5F_SIEVE_BUF_SIZE(f);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_construct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for layout
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5D__efl_is_space_alloc(const H5O_storage_t H5_ATTR_UNUSED *storage)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+
+    /* EFL storage is currently always treated as allocated */
+    FUNC_LEAVE_NOAPI(TRUE)
+} /* end H5D__efl_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_io_init
+ *
+ * Purpose:	Performs initialization before any sort of I/O on the raw data
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNUSED *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *cm)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDmemcpy(&io_info->store->efl, &(io_info->dset->shared->dcpl_cache.efl), sizeof(H5O_efl_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__efl_io_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__efl_read
+ *
+ * Purpose:     Reads data from an external file list.  It is an error to
+ *              read past the logical end of file, but reading past the end
+ *              of any particular member of the external file list results in
+ *              zeros.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, March  4, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, uint8_t *buf)
+{
+    int		fd = -1;
+    size_t	to_read;
+#ifndef NDEBUG
+    hsize_t     tempto_read;
+#endif /* NDEBUG */
+    hsize_t     skip = 0;
+    haddr_t     cur;
+    ssize_t	n;
+    size_t      u;                      /* Local index variable */
+    char *full_name = NULL;             /* File name with prefix */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(efl && efl->nused > 0);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(size < SIZET_MAX);
+    HDassert(buf || 0 == size);
+
+    /* Find the first efl member from which to read */
+    for (u=0, cur=0; u<efl->nused; u++) {
+        if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) {
+            skip = addr - cur;
+            break;
+        } /* end if */
+        cur += efl->slot[u].size;
+    } /* end for */
+
+    /* Read the data */
+    while(size) {
+        HDassert(buf);
+        if(u >= efl->nused)
+            HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "read past logical end of file")
+        if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip))
+            HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed")
+        if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name")
+        if((fd = HDopen(full_name, O_RDONLY, 0)) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
+        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file")
+#ifndef NDEBUG
+        tempto_read = MIN((size_t)(efl->slot[u].size-skip), (hsize_t)size);
+        H5_CHECK_OVERFLOW(tempto_read, hsize_t, size_t);
+        to_read = (size_t)tempto_read;
+#else /* NDEBUG */
+        to_read = MIN((size_t)(efl->slot[u].size - skip), (hsize_t)size);
+#endif /* NDEBUG */
+        if((n = HDread(fd, buf, to_read)) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "read error in external raw data file")
+        else if((size_t)n < to_read)
+            HDmemset(buf + n, 0, to_read - (size_t)n);
+        full_name = (char *)H5MM_xfree(full_name);
+        HDclose(fd);
+        fd = -1;
+        size -= to_read;
+        buf += to_read;
+        skip = 0;
+        u++;
+    } /* end while */
+
+done:
+    if(full_name)
+        full_name = (char *)H5MM_xfree(full_name);
+    if(fd >= 0)
+        HDclose(fd);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_write
+ *
+ * Purpose:	Writes data to an external file list.  It is an error to
+ *		write past the logical end of file, but writing past the end
+ *		of any particular member of the external file list just
+ *		extends that file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, March  4, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, const uint8_t *buf)
+{
+    int		fd = -1;
+    size_t	to_write;
+#ifndef NDEBUG
+    hsize_t	tempto_write;
+#endif /* NDEBUG */
+    haddr_t     cur;
+    hsize_t     skip = 0;
+    size_t	u;                          /* Local index variable */
+    char *full_name = NULL;             /* File name with prefix */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(efl && efl->nused > 0);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(size < SIZET_MAX);
+    HDassert(buf || 0 == size);
+
+    /* Find the first efl member in which to write */
+    for(u = 0, cur = 0; u < efl->nused; u++) {
+        if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) {
+            skip = addr - cur;
+            break;
+        } /* end if */
+        cur += efl->slot[u].size;
+    } /* end for */
+
+    /* Write the data */
+    while(size) {
+        HDassert(buf);
+        if(u >= efl->nused)
+            HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "write past logical end of file")
+        if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip))
+            HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed")
+        if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name")
+        if((fd = HDopen(full_name, O_CREAT | O_RDWR, 0666)) < 0) {
+            if(HDaccess(full_name, F_OK) < 0)
+                HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "external raw data file does not exist")
+            else
+                HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
+            } /* end if */
+        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+            HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file")
+#ifndef NDEBUG
+        tempto_write = MIN(efl->slot[u].size - skip, (hsize_t)size);
+        H5_CHECK_OVERFLOW(tempto_write, hsize_t, size_t);
+        to_write = (size_t)tempto_write;
+#else /* NDEBUG */
+        to_write = MIN((size_t)(efl->slot[u].size - skip), size);
+#endif /* NDEBUG */
+        if((size_t)HDwrite(fd, buf, to_write) != to_write)
+            HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "write error in external raw data file")
+        full_name = (char *)H5MM_xfree(full_name);
+        HDclose (fd);
+        fd = -1;
+        size -= to_write;
+        buf += to_write;
+        skip = 0;
+        u++;
+    } /* end while */
+
+done:
+    if(full_name)
+        full_name = (char *)H5MM_xfree(full_name);
+    if(fd >= 0)
+        HDclose(fd);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_readvv_cb
+ *
+ * Purpose:	Callback operator for H5D__efl_readvv().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_readvv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata)
+{
+    H5D_efl_readvv_ud_t *udata = (H5D_efl_readvv_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Read data */
+    if(H5D__efl_read(udata->efl, udata->dset, dst_off, len, (udata->rbuf + src_off)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "EFL read failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_readvv_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_readvv
+ *
+ * Purpose:	Reads data from an external file list.  It is an error to
+ *		read past the logical end of file, but reading past the end
+ *		of any particular member of the external file list results in
+ *		zeros.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May  7, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__efl_readvv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
+{
+    H5D_efl_readvv_ud_t udata;  /* User data for H5VM_opvv() operator */
+    ssize_t ret_value;          /* Return value (Total size of sequence in bytes) */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(io_info->store->efl.nused > 0);
+    HDassert(io_info->u.rbuf);
+    HDassert(io_info->dset);
+    HDassert(io_info->dset->shared);
+    HDassert(io_info->dset->shared->extfile_prefix);
+    HDassert(dset_curr_seq);
+    HDassert(dset_len_arr);
+    HDassert(dset_off_arr);
+    HDassert(mem_curr_seq);
+    HDassert(mem_len_arr);
+    HDassert(mem_off_arr);
+
+    /* Set up user data for H5VM_opvv() */
+    udata.efl = &(io_info->store->efl);
+    udata.dset = io_info->dset;
+    udata.rbuf = (unsigned char *)io_info->u.rbuf;
+
+    /* Call generic sequence operation routine */
+    if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+            mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+            H5D__efl_readvv_cb, &udata)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized EFL read")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_readvv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_writevv_cb
+ *
+ * Purpose:	Callback operator for H5D__efl_writevv().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_writevv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata)
+{
+    H5D_efl_writevv_ud_t *udata = (H5D_efl_writevv_ud_t *)_udata; /* User data for H5VM_opvv() operator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Write data */
+    if(H5D__efl_write(udata->efl, udata->dset, dst_off, len, (udata->wbuf + src_off)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "EFL write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_writevv_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_writevv
+ *
+ * Purpose:	Writes data to an external file list.  It is an error to
+ *		write past the logical end of file, but writing past the end
+ *		of any particular member of the external file list just
+ *		extends that file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, May  2, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5D__efl_writevv(const H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
+{
+    H5D_efl_writevv_ud_t udata;  /* User data for H5VM_opvv() operator */
+    ssize_t ret_value;          /* Return value (Total size of sequence in bytes) */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(io_info->store->efl.nused > 0);
+    HDassert(io_info->u.wbuf);
+    HDassert(io_info->dset);
+    HDassert(io_info->dset->shared);
+    HDassert(io_info->dset->shared->extfile_prefix);
+    HDassert(dset_curr_seq);
+    HDassert(dset_len_arr);
+    HDassert(dset_off_arr);
+    HDassert(mem_curr_seq);
+    HDassert(mem_len_arr);
+    HDassert(mem_off_arr);
+
+    /* Set up user data for H5VM_opvv() */
+    udata.efl = &(io_info->store->efl);
+    udata.dset = io_info->dset;
+    udata.wbuf = (const unsigned char *)io_info->u.wbuf;
+
+    /* Call generic sequence operation routine */
+    if((ret_value = H5VM_opvv(dset_max_nseq, dset_curr_seq, dset_len_arr, dset_off_arr,
+            mem_max_nseq, mem_curr_seq, mem_len_arr, mem_off_arr,
+            H5D__efl_writevv_cb, &udata)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPERATE, FAIL, "can't perform vectorized EFL write")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_writevv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__efl_bh_info
+ *
+ * Purpose:     Retrieve the amount of heap storage used for External File
+ *		List message
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; August 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__efl_bh_info(H5F_t *f, hid_t dxpl_id, H5O_efl_t *efl, hsize_t *heap_size)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(f);
+    HDassert(efl);
+    HDassert(H5F_addr_defined(efl->heap_addr));
+    HDassert(heap_size);
+
+    /* Get the size of the local heap for EFL's file list */
+    if(H5HL_heapsize(f, dxpl_id, efl->heap_addr, heap_size) < 0)
+        HGOTO_ERROR(H5E_EFL, H5E_CANTINIT, FAIL, "unable to retrieve local heap info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_bh_info() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dfill.c b/gatb-core/thirdparty/hdf5/src/H5Dfill.c
new file mode 100644
index 0000000..484c362
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dfill.c
@@ -0,0 +1,707 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Dfill.c
+ *			Jun 19 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Fill value operations for datasets
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5D__fill_release(H5D_fill_buf_info_t *fb_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare the free list to manage blocks of non-zero fill-value data */
+H5FL_BLK_DEFINE_STATIC(non_zero_fill);
+
+/* Declare the free list to manage blocks of zero fill-value data */
+H5FL_BLK_DEFINE_STATIC(zero_fill);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Dfill
+ PURPOSE
+    Fill a selection in memory with a value
+ USAGE
+    herr_t H5Dfill(fill, fill_type, space, buf, buf_type)
+        const void *fill;       IN: Pointer to fill value to use
+        hid_t fill_type_id;     IN: Datatype of the fill value
+        void *buf;              IN/OUT: Memory buffer to fill selection within
+        hid_t buf_type_id;      IN: Datatype of the elements in buffer
+        hid_t space_id;         IN: Dataspace describing memory buffer &
+                                    containing selection to use.
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to fill elements in a memory buffer.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    If "fill" parameter is NULL, use all zeros as fill value
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Dfill(const void *fill, hid_t fill_type_id, void *buf, hid_t buf_type_id, hid_t space_id)
+{
+    H5S_t *space;               /* Dataspace */
+    H5T_t *fill_type;           /* Fill-value datatype */
+    H5T_t *buf_type;            /* Buffer datatype */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*xi*xii", fill, fill_type_id, buf, buf_type_id, space_id);
+
+    /* Check args */
+    if(buf == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a dataspace")
+    if(NULL == (fill_type = (H5T_t *)H5I_object_verify(fill_type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+    if(NULL == (buf_type = (H5T_t *)H5I_object_verify(buf_type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+
+    /* Fill the selection in the memory buffer */
+    if(H5D__fill(fill, fill_type, buf, buf_type, space, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Dfill() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__fill
+ PURPOSE
+    Fill a selection in memory with a value (internal version)
+ USAGE
+    herr_t H5D__fill(fill, fill_type, buf, buf_type, space)
+        const void *fill;       IN: Pointer to fill value to use
+        H5T_t *fill_type;       IN: Datatype of the fill value
+        void *buf;              IN/OUT: Memory buffer to fill selection within
+        H5T_t *buf_type;        IN: Datatype of the elements in buffer
+        H5S_t *space;           IN: Dataspace describing memory buffer &
+                                    containing selection to use.
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to fill elements in a memory buffer.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    If "fill" parameter is NULL, use all zeros as fill value.
+ EXAMPLES
+ REVISION LOG
+    Raymond Lu - 20 March 2007
+    If there's VL type of data, the address of the data is copied multiple
+    times into the buffer, causing some trouble when the data is released.
+    Instead, make multiple copies of fill value first, then do conversion
+    on each element so that each of them has a copy of the VL data.
+--------------------------------------------------------------------------*/
+herr_t
+H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
+    const H5T_t *buf_type, const H5S_t *space, hid_t dxpl_id)
+{
+    H5WB_t  *elem_wb = NULL;    /* Wrapped buffer for element data */
+    uint8_t elem_buf[H5T_ELEM_BUF_SIZE]; /* Buffer for element data */
+    H5WB_t  *bkg_elem_wb = NULL;     /* Wrapped buffer for background data */
+    uint8_t bkg_elem_buf[H5T_ELEM_BUF_SIZE]; /* Buffer for background data */
+    uint8_t *bkg_buf = NULL;    /* Background conversion buffer */
+    uint8_t *tmp_buf = NULL;    /* Temp conversion buffer */
+    hid_t src_id = -1, dst_id = -1;     /* Temporary type IDs */
+    size_t dst_type_size;       /* Size of destination type*/
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(fill_type);
+    HDassert(buf);
+    HDassert(buf_type);
+    HDassert(space);
+
+    /* Make sure the dataspace has an extent set (or is NULL) */
+    if(!(H5S_has_extent(space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set")
+
+    /* Get the memory datatype size */
+    dst_type_size = H5T_get_size(buf_type);
+
+    /* If there's no fill value, just use zeros */
+    if(fill == NULL) {
+        void *elem_ptr;         /* Pointer to element to use for fill value */
+
+        /* Wrap the local buffer for elements */
+        if(NULL == (elem_wb = H5WB_wrap(elem_buf, sizeof(elem_buf))))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for element */
+        if(NULL == (elem_ptr = H5WB_actual_clear(elem_wb, dst_type_size)))
+            HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Fill the selection in the memory buffer */
+        if(H5S_select_fill(elem_ptr, dst_type_size, space, buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed")
+    } /* end if */
+    else {
+        H5T_path_t *tpath;      /* Conversion path information */
+        size_t src_type_size;   /* Size of source type	*/
+        size_t buf_size;        /* Desired buffer size	*/
+
+        /* Get the file datatype size */
+        src_type_size = H5T_get_size(fill_type);
+
+        /* Get the maximum buffer size needed and allocate it */
+        buf_size = MAX(src_type_size, dst_type_size);
+
+        /* Set up type conversion function */
+        if(NULL == (tpath = H5T_path_find(fill_type, buf_type, NULL, NULL, dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
+
+        /* Construct source & destination datatype IDs, if we will need them */
+        if(!H5T_path_noop(tpath)) {
+            if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(fill_type, H5T_COPY_ALL), FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+            if((dst_id = H5I_register(H5I_DATATYPE, H5T_copy(buf_type, H5T_COPY_ALL), FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+        } /* end if */
+
+        /* If there's VL type of data, make multiple copies of fill value first,
+         * then do conversion on each element so that each of them has a copy
+         * of the VL data.
+         */
+        if(TRUE == H5T_detect_class(fill_type, H5T_VLEN, FALSE)) {
+            H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+            H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+            H5S_sel_iter_t mem_iter;            /* Memory selection iteration info */
+            hssize_t nelmts;                    /* Number of data elements */
+
+            /* Get the number of elements in the selection */
+            nelmts = H5S_GET_SELECT_NPOINTS(space);
+            HDassert(nelmts >= 0);
+            H5_CHECK_OVERFLOW(nelmts, hssize_t, size_t);
+
+            /* Allocate a temporary buffer */
+            if(NULL == (tmp_buf = H5FL_BLK_MALLOC(type_conv, (size_t)nelmts * buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Allocate a background buffer, if necessary */
+            if(H5T_path_bkg(tpath) && NULL == (bkg_buf = H5FL_BLK_CALLOC(type_conv, (size_t)nelmts * buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Replicate the file's fill value into the temporary buffer */
+            H5VM_array_fill(tmp_buf, fill, src_type_size, (size_t)nelmts);
+
+            /* Convert from file's fill value into memory form */
+            if(H5T_convert(tpath, src_id, dst_id, (size_t)nelmts, (size_t)0, (size_t)0, tmp_buf, bkg_buf, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "data type conversion failed")
+
+            /* Fill the DXPL cache values for later use */
+            if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+            /* Create a selection iterator for scattering the elements to memory buffer */
+            if(H5S_select_iter_init(&mem_iter, space, dst_type_size) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
+
+            /* Scatter the data into memory */
+            if(H5D__scatter_mem(tmp_buf, space, &mem_iter, (size_t)nelmts, dxpl_cache, buf/*out*/) < 0) {
+                H5S_SELECT_ITER_RELEASE(&mem_iter);
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "scatter failed")
+            } /* end if */
+
+            /* Release the selection iterator */
+            if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+        } /* end if */
+        else {
+            const uint8_t *fill_buf;          /* Buffer to use for writing fill values */
+
+            /* Convert disk buffer into memory buffer */
+            if(!H5T_path_noop(tpath)) {
+                void *elem_ptr;         /* Pointer to element to use for fill value */
+                void *bkg_ptr = NULL;   /* Pointer to background element to use for fill value */
+
+                /* Wrap the local buffer for elements */
+                if(NULL == (elem_wb = H5WB_wrap(elem_buf, sizeof(elem_buf))))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+                /* Get a pointer to a buffer that's large enough for element */
+                if(NULL == (elem_ptr = H5WB_actual(elem_wb, buf_size)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+                /* Copy the user's data into the buffer for conversion */
+                HDmemcpy(elem_ptr, fill, src_type_size);
+
+                /* If there's no VL type of data, do conversion first then fill the data into
+                 * the memory buffer. */
+                if(H5T_path_bkg(tpath)) {
+                    /* Wrap the local buffer for background elements */
+                    if(NULL == (bkg_elem_wb = H5WB_wrap(bkg_elem_buf, sizeof(bkg_elem_buf))))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+                    /* Get a pointer to a buffer that's large enough for element */
+                    if(NULL == (bkg_ptr = H5WB_actual_clear(bkg_elem_wb, buf_size)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't get actual buffer")
+                } /* end if */
+
+                /* Perform datatype conversion */
+                if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, elem_ptr, bkg_ptr, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "data type conversion failed")
+
+                /* Point at element buffer */
+                fill_buf = (const uint8_t *)elem_ptr;
+            } /* end if */
+            else
+                fill_buf = (const uint8_t *)fill;
+
+            /* Fill the selection in the memory buffer */
+            if(H5S_select_fill(fill_buf, dst_type_size, space, buf) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed")
+        } /* end else */
+    } /* end else */
+
+done:
+    if(src_id != (-1) && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(dst_id != (-1) && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
+    if(tmp_buf)
+        tmp_buf = H5FL_BLK_FREE(type_conv, tmp_buf);
+    if(elem_wb && H5WB_unwrap(elem_wb) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    if(bkg_elem_wb && H5WB_unwrap(bkg_elem_wb) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    if(bkg_buf)
+        bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__fill_init
+ *
+ * Purpose:	Initialize buffer filling operation
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		June 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__fill_init(H5D_fill_buf_info_t *fb_info, void *caller_fill_buf,
+    H5MM_allocate_t alloc_func, void *alloc_info,
+    H5MM_free_t free_func, void *free_info,
+    const H5O_fill_t *fill, const H5T_t *dset_type, hid_t dset_type_id,
+    size_t total_nelmts, size_t max_buf_size, hid_t dxpl_id)
+{
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(fb_info);
+    HDassert(fill);
+    HDassert(dset_type);
+    HDassert(dset_type_id > 0);
+
+    /* Reset fill buffer information */
+    HDmemset(fb_info, 0, sizeof(*fb_info));
+
+    /* Cache constant information from the dataset */
+    fb_info->fill = fill;
+    fb_info->file_type = dset_type;
+    fb_info->file_tid = dset_type_id;
+    fb_info->fill_alloc_func = alloc_func;
+    fb_info->fill_alloc_info = alloc_info;
+    fb_info->fill_free_func = free_func;
+    fb_info->fill_free_info = free_info;
+
+    /* Fill the buffer with the user's fill value */
+    if(fill->buf) {
+        htri_t has_vlen_type;   /* Whether the datatype has a VL component */
+
+        /* Detect whether the datatype has a VL component */
+        if((has_vlen_type = H5T_detect_class(dset_type, H5T_VLEN, FALSE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to detect vlen datatypes?")
+        fb_info->has_vlen_fill_type = (hbool_t)has_vlen_type;
+
+        /* If necessary, convert fill value datatypes (which copies VL components, etc.) */
+        if(fb_info->has_vlen_fill_type) {
+            /* Create temporary datatype for conversion operation */
+            if(NULL == (fb_info->mem_type = H5T_copy(dset_type, H5T_COPY_REOPEN)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy file datatype")
+            if((fb_info->mem_tid = H5I_register(H5I_DATATYPE, fb_info->mem_type, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register memory datatype")
+
+            /* Retrieve sizes of memory & file datatypes */
+            fb_info->mem_elmt_size = H5T_get_size(fb_info->mem_type);
+            HDassert(fb_info->mem_elmt_size > 0);
+            fb_info->file_elmt_size = H5T_get_size(dset_type);
+            HDassert(fb_info->file_elmt_size == (size_t)fill->size);
+
+            /* If fill value is not library default, use it to set the element size */
+            fb_info->max_elmt_size = MAX(fb_info->mem_elmt_size, fb_info->file_elmt_size);
+
+            /* Compute the number of elements that fit within a buffer to write */
+            if(total_nelmts > 0)
+                fb_info->elmts_per_buf = MIN(total_nelmts, MAX(1, (max_buf_size / fb_info->max_elmt_size)));
+            else
+                fb_info->elmts_per_buf = max_buf_size / fb_info->max_elmt_size;
+            HDassert(fb_info->elmts_per_buf > 0);
+
+            /* Compute the buffer size to use */
+            fb_info->fill_buf_size = MIN(max_buf_size, (fb_info->elmts_per_buf * fb_info->max_elmt_size));
+
+            /* Allocate fill buffer */
+            if(caller_fill_buf) {
+                fb_info->fill_buf = caller_fill_buf;
+                fb_info->use_caller_fill_buf = TRUE;
+            } /* end if */
+            else {
+                if(alloc_func)
+                    fb_info->fill_buf = alloc_func(fb_info->fill_buf_size, alloc_info);
+                else
+                    fb_info->fill_buf = H5FL_BLK_MALLOC(non_zero_fill, fb_info->fill_buf_size);
+                if(NULL == fb_info->fill_buf)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fill buffer")
+            } /* end else */
+
+            /* Get the datatype conversion path for this operation */
+            if(NULL == (fb_info->fill_to_mem_tpath = H5T_path_find(dset_type, fb_info->mem_type, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
+
+            /* Get the inverse datatype conversion path for this operation */
+            if(NULL == (fb_info->mem_to_dset_tpath = H5T_path_find(fb_info->mem_type, dset_type, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
+
+            /* Check if we need to allocate a background buffer */
+            if(H5T_path_bkg(fb_info->fill_to_mem_tpath) || H5T_path_bkg(fb_info->mem_to_dset_tpath)) {
+                /* Check for inverse datatype conversion needing a background buffer */
+                /* (do this first, since it needs a larger buffer) */
+                if(H5T_path_bkg(fb_info->mem_to_dset_tpath))
+                    fb_info->bkg_buf_size = fb_info->elmts_per_buf * fb_info->max_elmt_size;
+                else
+                    fb_info->bkg_buf_size = fb_info->max_elmt_size;
+
+                /* Allocate the background buffer */
+                if(NULL == (fb_info->bkg_buf = H5FL_BLK_MALLOC(type_conv, fb_info->bkg_buf_size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            } /* end if */
+        } /* end if */
+        else {
+            /* If fill value is not library default, use it to set the element size */
+            HDassert(fill->size >= 0);
+            fb_info->max_elmt_size = fb_info->file_elmt_size = fb_info->mem_elmt_size = (size_t)fill->size;
+
+            /* Compute the number of elements that fit within a buffer to write */
+            if(total_nelmts > 0)
+                fb_info->elmts_per_buf = MIN(total_nelmts, MAX(1, (max_buf_size / fb_info->max_elmt_size)));
+            else
+                fb_info->elmts_per_buf = max_buf_size / fb_info->max_elmt_size;
+            HDassert(fb_info->elmts_per_buf > 0);
+
+            /* Compute the buffer size to use */
+            fb_info->fill_buf_size = MIN(max_buf_size, fb_info->elmts_per_buf * fb_info->max_elmt_size);
+
+            /* Allocate temporary buffer */
+            if(caller_fill_buf) {
+                fb_info->fill_buf = caller_fill_buf;
+                fb_info->use_caller_fill_buf = TRUE;
+            } /* end if */
+            else {
+                if(alloc_func)
+                    fb_info->fill_buf = alloc_func(fb_info->fill_buf_size, alloc_info);
+                else
+                    fb_info->fill_buf = H5FL_BLK_MALLOC(non_zero_fill, fb_info->fill_buf_size);
+                if(NULL == fb_info->fill_buf)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fill buffer")
+            } /* end else */
+
+            /* Replicate the fill value into the cached buffer */
+            H5VM_array_fill(fb_info->fill_buf, fill->buf, fb_info->max_elmt_size, fb_info->elmts_per_buf);
+        } /* end else */
+    } /* end if */
+    else {      /* Fill the buffer with the default fill value */
+        /* Retrieve size of elements */
+        fb_info->max_elmt_size = fb_info->file_elmt_size = fb_info->mem_elmt_size = H5T_get_size(dset_type);
+        HDassert(fb_info->max_elmt_size > 0);
+
+        /* Compute the number of elements that fit within a buffer to write */
+        if(total_nelmts > 0)
+            fb_info->elmts_per_buf = MIN(total_nelmts, MAX(1, (max_buf_size / fb_info->max_elmt_size)));
+        else
+            fb_info->elmts_per_buf = max_buf_size / fb_info->max_elmt_size;
+        HDassert(fb_info->elmts_per_buf > 0);
+
+        /* Compute the buffer size to use */
+        fb_info->fill_buf_size = MIN(max_buf_size, (fb_info->elmts_per_buf * fb_info->max_elmt_size));
+
+        /* Use (and zero) caller's buffer, if provided */
+        if(caller_fill_buf) {
+            fb_info->fill_buf = caller_fill_buf;
+            fb_info->use_caller_fill_buf = TRUE;
+
+            HDmemset(fb_info->fill_buf, 0, fb_info->fill_buf_size);
+        } /* end if */
+        else {
+            if(alloc_func) {
+                fb_info->fill_buf = alloc_func(fb_info->fill_buf_size, alloc_info);
+
+                HDmemset(fb_info->fill_buf, 0, fb_info->fill_buf_size);
+            } /* end if */
+            else {
+                htri_t buf_avail = H5FL_BLK_AVAIL(zero_fill, fb_info->fill_buf_size);  /* Check if there is an already zeroed out buffer available */
+                HDassert(buf_avail != FAIL);
+
+                /* Allocate temporary buffer (zeroing it if no buffer is available) */
+                if(!buf_avail)
+                    fb_info->fill_buf = H5FL_BLK_CALLOC(zero_fill, fb_info->fill_buf_size);
+                else
+                    fb_info->fill_buf = H5FL_BLK_MALLOC(zero_fill, fb_info->fill_buf_size);
+            } /* end else */
+            if(fb_info->fill_buf == NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fill buffer")
+        } /* end else */
+    } /* end else */
+
+done:
+    /* Cleanup on error */
+    if(ret_value < 0)
+        if(H5D__fill_term(fb_info) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__fill_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__fill_refill_vl
+ *
+ * Purpose:	Refill fill value buffer that contains VL-datatype fill values
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		June 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__fill_refill_vl(H5D_fill_buf_info_t *fb_info, size_t nelmts, hid_t dxpl_id)
+{
+    herr_t	ret_value = SUCCEED;	/* Return value */
+    void * buf = NULL;              /* Temporary fill buffer */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(fb_info);
+    HDassert(fb_info->has_vlen_fill_type);
+    HDassert(fb_info->fill_buf);
+
+    /* Make a copy of the (disk-based) fill value into the buffer */
+    HDmemcpy(fb_info->fill_buf, fb_info->fill->buf, fb_info->file_elmt_size);
+
+    /* Reset first element of background buffer, if necessary */
+    if(H5T_path_bkg(fb_info->fill_to_mem_tpath))
+        HDmemset(fb_info->bkg_buf, 0, fb_info->max_elmt_size);
+
+    /* Type convert the dataset buffer, to copy any VL components */
+    if(H5T_convert(fb_info->fill_to_mem_tpath, fb_info->file_tid, fb_info->mem_tid, (size_t)1, (size_t)0, (size_t)0, fb_info->fill_buf, fb_info->bkg_buf, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "data type conversion failed")
+
+    /* Replicate the fill value into the cached buffer */
+    if(nelmts > 1)
+        H5VM_array_fill((void *)((unsigned char *)fb_info->fill_buf + fb_info->mem_elmt_size), fb_info->fill_buf, fb_info->mem_elmt_size, (nelmts - 1));
+
+    /* Reset the entire background buffer, if necessary */
+    if(H5T_path_bkg(fb_info->mem_to_dset_tpath))
+        HDmemset(fb_info->bkg_buf, 0, fb_info->bkg_buf_size);
+
+    /* Make a copy of the fill buffer so we can free dynamic elements after conversion */
+    if(fb_info->fill_alloc_func)
+        buf = fb_info->fill_alloc_func(fb_info->fill_buf_size, fb_info->fill_alloc_info);
+    else
+        buf = H5FL_BLK_MALLOC(non_zero_fill, fb_info->fill_buf_size);
+    if(!buf)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed for temporary fill buffer")
+
+    HDmemcpy(buf, fb_info->fill_buf, fb_info->fill_buf_size);
+
+    /* Type convert the dataset buffer, to copy any VL components */
+    if(H5T_convert(fb_info->mem_to_dset_tpath, fb_info->mem_tid, fb_info->file_tid, nelmts, (size_t)0, (size_t)0, fb_info->fill_buf, fb_info->bkg_buf, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "data type conversion failed")
+
+done:
+    if(buf) {
+        /* Free dynamically allocated VL elements in fill buffer */
+        if(fb_info->fill->type) {
+            if(H5T_vlen_reclaim_elmt(buf, fb_info->fill->type, dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't reclaim vlen element")
+        } /* end if */
+        else {
+            if(H5T_vlen_reclaim_elmt(buf, fb_info->mem_type, dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't reclaim vlen element")
+        } /* end else */
+
+        /* Free temporary fill buffer */
+        if(fb_info->fill_free_func)
+            fb_info->fill_free_func(buf, fb_info->fill_free_info);
+        else
+            buf = H5FL_BLK_FREE(non_zero_fill, buf);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__fill_refill_vl() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__fill_release
+ *
+ * Purpose:	Release fill value buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		June 22, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__fill_release(H5D_fill_buf_info_t *fb_info)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check args */
+    HDassert(fb_info);
+    HDassert(fb_info->fill);
+
+    /* Free the buffer for fill values */
+    if(!fb_info->use_caller_fill_buf && fb_info->fill_buf) {
+        if(fb_info->fill_free_func)
+            fb_info->fill_free_func(fb_info->fill_buf, fb_info->fill_free_info);
+        else {
+            if(fb_info->fill->buf)
+                fb_info->fill_buf = H5FL_BLK_FREE(non_zero_fill, fb_info->fill_buf);
+            else
+                fb_info->fill_buf = H5FL_BLK_FREE(zero_fill, fb_info->fill_buf);
+        } /* end else */
+        fb_info->fill_buf = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__fill_release() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__fill_term
+ *
+ * Purpose:	Release fill value buffer info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		June 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__fill_term(H5D_fill_buf_info_t *fb_info)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check args */
+    HDassert(fb_info);
+
+    /* Free the buffer for fill values */
+    H5D__fill_release(fb_info);
+
+    /* Free other resources for vlen fill values */
+    if(fb_info->has_vlen_fill_type) {
+        if(fb_info->mem_tid > 0)
+            H5I_dec_ref(fb_info->mem_tid);
+        else if(fb_info->mem_type)
+            H5T_close(fb_info->mem_type);
+        if(fb_info->bkg_buf)
+            fb_info->bkg_buf = H5FL_BLK_FREE(type_conv, fb_info->bkg_buf);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__fill_term() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dint.c b/gatb-core/thirdparty/hdf5/src/H5Dint.c
new file mode 100644
index 0000000..16ced02
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dint.c
@@ -0,0 +1,2829 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5D__init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links		  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Struct for holding callback info during H5D_flush operation */
+typedef struct {
+    const H5F_t *f;             /* Pointer to file being flushed */
+    hid_t dxpl_id;              /* DXPL for I/O operations */
+} H5D_flush_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* General stuff */
+static herr_t H5D__get_dxpl_cache_real(hid_t dxpl_id, H5D_dxpl_cache_t *cache);
+static H5D_shared_t *H5D__new(hid_t dcpl_id, hbool_t creating,
+    hbool_t vl_type);
+static herr_t H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id,
+    const H5T_t *type);
+static herr_t H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space);
+static herr_t H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset,
+    hid_t dapl_id);
+static herr_t H5D_build_extfile_prefix(const H5D_t *dset, hid_t dapl_id,
+    char **extfile_prefix);
+static herr_t H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id);
+static herr_t H5D__init_storage(const H5D_t *dataset, hbool_t full_overwrite,
+    hsize_t old_dim[], hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Define a "default" dataset transfer property list cache structure to use for default DXPLs */
+H5D_dxpl_cache_t H5D_def_dxpl_cache;
+
+/* Declare a free list to manage blocks of VL data */
+H5FL_BLK_DEFINE(vlen_vl_buf);
+
+/* Declare a free list to manage other blocks of VL data */
+H5FL_BLK_DEFINE(vlen_fl_buf);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5D_t and H5D_shared_t structs */
+H5FL_DEFINE_STATIC(H5D_t);
+H5FL_DEFINE_STATIC(H5D_shared_t);
+
+/* Declare the external PQ free list for the sieve buffer information */
+H5FL_BLK_EXTERN(sieve_buf);
+
+/* Declare the external free list to manage the H5D_chunk_info_t struct */
+H5FL_EXTERN(H5D_chunk_info_t);
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+/* Define a static "default" dataset structure to use to initialize new datasets */
+static H5D_shared_t H5D_def_dset;
+
+/* Dataset ID class */
+static const H5I_class_t H5I_DATASET_CLS[1] = {{
+    H5I_DATASET,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5D_close       /* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_init
+ *
+ * Purpose:	Initialize the interface from some other layer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 4, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_init() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5D__init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5D__init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+NOTES
+    Care must be taken when using the H5P functions, since they can cause
+    a deadlock in the library when the library is attempting to terminate -QAK
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__init_interface(void)
+{
+    H5P_genplist_t *def_dcpl;               /* Default Dataset Creation Property list */
+    herr_t          ret_value                = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Initialize the atom group for the dataset IDs */
+    if(H5I_register_type(H5I_DATASET_CLS) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /* Reset the "default dataset" information */
+    HDmemset(&H5D_def_dset, 0, sizeof(H5D_shared_t));
+
+    /* Get the default dataset creation property list values and initialize the
+     * default dataset with them.
+     */
+    if(NULL == (def_dcpl = (H5P_genplist_t *)H5I_object(H5P_LST_DATASET_CREATE_ID_g)))
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "can't get default dataset creation property list")
+
+    /* Get the default data storage layout */
+    if(H5P_get(def_dcpl, H5D_CRT_LAYOUT_NAME, &H5D_def_dset.layout) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve layout")
+
+    /* Get the default dataset creation properties */
+    if(H5P_get(def_dcpl, H5D_CRT_EXT_FILE_LIST_NAME, &H5D_def_dset.dcpl_cache.efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve external file list")
+    if(H5P_get(def_dcpl, H5D_CRT_FILL_VALUE_NAME, &H5D_def_dset.dcpl_cache.fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve fill value")
+    if(H5P_get(def_dcpl, H5O_CRT_PIPELINE_NAME, &H5D_def_dset.dcpl_cache.pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve pipeline filter")
+
+    /* Reset the "default DXPL cache" information */
+    HDmemset(&H5D_def_dxpl_cache, 0, sizeof(H5D_dxpl_cache_t));
+
+    /* Get the default DXPL cache information */
+    if(H5D__get_dxpl_cache_real(H5P_DATASET_XFER_DEFAULT, &H5D_def_dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve default DXPL info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_term_interface
+ *
+ * Purpose:	Terminate this interface.
+ *
+ * Return:	Success:	Positive if anything was done that might
+ *				affect other interfaces; zero otherwise.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5D_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_DATASET) > 0) {
+            /* The dataset API uses the "force" flag set to true because it
+             * is using the "file objects" (H5FO) API functions to track open
+             * objects in the file.  Using the H5FO code means that dataset
+             * IDs can have reference counts >1, when an existing dataset is
+             * opened more than once.  However, the H5I code does not attempt
+             * to close objects with reference counts>1 unless the "force" flag
+             * is set to true.
+             *
+             * At some point (probably after the group and datatypes use the
+             * the H5FO code), the H5FO code might need to be switched around
+             * to storing pointers to the objects being tracked (H5D_t, H5G_t,
+             * etc) and reference count those itself instead of relying on the
+             * reference counting in the H5I layer.  Then, the "force" flag can
+             * be put back to false.
+             *
+             * Setting the "force" flag to true for all the interfaces won't
+             * work because the "file driver" (H5FD) APIs use the H5I reference
+             * counting to avoid closing a file driver out from underneath an
+             * open file...
+             *
+             * QAK - 5/13/03
+             */
+	    (void)H5I_clear_type(H5I_DATASET, TRUE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Close public interface */
+            n += H5D__term_pub_interface();
+
+            /* Close deprecated interface */
+            n += H5D__term_deprec_interface();
+
+	    /* Destroy the dataset object id group */
+	    (void)H5I_dec_type_ref(H5I_DATASET);
+            n++; /*H5I*/
+
+	    /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5D_term_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__get_dxpl_cache_real
+ PURPOSE
+    Get all the values for the DXPL cache.
+ USAGE
+    herr_t H5D__get_dxpl_cache_real(dxpl_id, cache)
+        hid_t dxpl_id;          IN: DXPL to query
+        H5D_dxpl_cache_t *cache;IN/OUT: DXPL cache to fill with values
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Query all the values from a DXPL that are needed by internal routines
+    within the library.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5D__get_dxpl_cache_real(hid_t dxpl_id, H5D_dxpl_cache_t *cache)
+{
+    H5P_genplist_t *dx_plist;   /* Data transfer property list */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(cache);
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dx_plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Get maximum temporary buffer size */
+    if(H5P_get(dx_plist, H5D_XFER_MAX_TEMP_BUF_NAME, &cache->max_temp_buf) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve maximum temporary buffer size")
+
+    /* Get temporary buffer pointer */
+    if(H5P_get(dx_plist, H5D_XFER_TCONV_BUF_NAME, &cache->tconv_buf) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve temporary buffer pointer")
+
+    /* Get background buffer pointer */
+    if(H5P_get(dx_plist, H5D_XFER_BKGR_BUF_NAME, &cache->bkgr_buf) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve background buffer pointer")
+
+    /* Get background buffer type */
+    if(H5P_get(dx_plist, H5D_XFER_BKGR_BUF_TYPE_NAME, &cache->bkgr_buf_type) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve background buffer type")
+
+    /* Get B-tree split ratios */
+    if(H5P_get(dx_plist, H5D_XFER_BTREE_SPLIT_RATIO_NAME, &cache->btree_split_ratio) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve B-tree split ratios")
+
+    /* Get I/O vector size */
+    if(H5P_get(dx_plist, H5D_XFER_HYPER_VECTOR_SIZE_NAME, &cache->vec_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve I/O vector size")
+
+#ifdef H5_HAVE_PARALLEL
+    /* Collect Parallel I/O information for possible later use */
+    if(H5P_get(dx_plist, H5D_XFER_IO_XFER_MODE_NAME, &cache->xfer_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve parallel transfer method")
+    if(H5P_get(dx_plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &cache->coll_opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve collective transfer option")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Get error detection properties */
+    if(H5P_get(dx_plist, H5D_XFER_EDC_NAME, &cache->err_detect) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve error detection info")
+
+    /* Get filter callback function */
+    if(H5P_get(dx_plist, H5D_XFER_FILTER_CB_NAME, &cache->filter_cb) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve filter callback function")
+
+    /* Get the data transform property */
+    if(H5P_get(dx_plist, H5D_XFER_XFORM_NAME, &cache->data_xform_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve data transform info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D__get_dxpl_cache_real() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__get_dxpl_cache
+ PURPOSE
+    Get all the values for the DXPL cache.
+ USAGE
+    herr_t H5D__get_dxpl_cache(dxpl_id, cache)
+        hid_t dxpl_id;          IN: DXPL to query
+        H5D_dxpl_cache_t *cache;IN/OUT: DXPL cache to fill with values
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Query all the values from a DXPL that are needed by internal routines
+    within the library.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The CACHE pointer should point at already allocated memory to place
+    non-default property list info.  If a default property list is used, the
+    CACHE pointer will be changed to point at the default information.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5D__get_dxpl_cache(hid_t dxpl_id, H5D_dxpl_cache_t **cache)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(cache);
+
+    /* Check for the default DXPL */
+    if(dxpl_id==H5P_DATASET_XFER_DEFAULT)
+        *cache=&H5D_def_dxpl_cache;
+    else
+        if(H5D__get_dxpl_cache_real(dxpl_id,*cache) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "Can't retrieve DXPL values")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__get_dxpl_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__create_named
+ *
+ * Purpose:	Internal routine to create a new dataset.
+ *
+ * Return:	Success:	Non-NULL, pointer to new dataset object.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_t *
+H5D__create_named(const H5G_loc_t *loc, const char *name, hid_t type_id,
+    const H5S_t *space, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id,
+    hid_t dxpl_id)
+{
+    H5O_obj_create_t ocrt_info;         /* Information for object creation */
+    H5D_obj_create_t dcrt_info;         /* Information for dataset creation */
+    H5D_t	   *ret_value;          /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(type_id != H5P_DEFAULT);
+    HDassert(space);
+    HDassert(lcpl_id != H5P_DEFAULT);
+    HDassert(dcpl_id != H5P_DEFAULT);
+    HDassert(dapl_id != H5P_DEFAULT);
+    HDassert(dxpl_id != H5P_DEFAULT);
+
+    /* Set up dataset creation info */
+    dcrt_info.type_id = type_id;
+    dcrt_info.space = space;
+    dcrt_info.dcpl_id = dcpl_id;
+    dcrt_info.dapl_id = dapl_id;
+
+    /* Set up object creation information */
+    ocrt_info.obj_type = H5O_TYPE_DATASET;
+    ocrt_info.crt_info = &dcrt_info;
+    ocrt_info.new_obj = NULL;
+
+    /* Create the new dataset and link it to its parent group */
+    if(H5L_link_object(loc, name, &ocrt_info, lcpl_id, dapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create and link to dataset")
+    HDassert(ocrt_info.new_obj);
+
+    /* Set the return value */
+    ret_value = (H5D_t *)ocrt_info.new_obj;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__create_named() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__get_space_status
+ *
+ * Purpose:     Returns the status of dataspace allocation.
+ *
+ * Return:
+ *              Success:        Non-negative
+ *
+ *              Failture:       Negative
+ *
+ * Programmer:  Raymond Lu
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__get_space_status(H5D_t *dset, H5D_space_status_t *allocation, hid_t dxpl_id)
+{
+    hsize_t     space_allocated;    /* The number of bytes allocated for chunks */
+    hssize_t    snelmts;            /* Temporary holder for number of elements in dataspace */
+    hsize_t     nelmts;             /* Number of elements in dataspace */
+    size_t      dt_size;            /* Size of datatype */
+    hsize_t     full_size;          /* The number of bytes in the dataset when fully populated */
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dset);
+
+    /* Get the dataset's dataspace */
+    HDassert(dset->shared->space);
+
+    /* Get the total number of elements in dataset's dataspace */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace")
+    nelmts = (hsize_t)snelmts;
+
+    /* Get the size of the dataset's datatype */
+    if(0 == (dt_size = H5T_GET_SIZE(dset->shared->type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
+
+    /* Compute the maximum size of the dataset in bytes */
+    full_size = nelmts * dt_size;
+
+    /* Check for overflow during multiplication */
+    if(nelmts != (full_size / dt_size))
+        HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
+
+    /* Difficult to error check, since the error value is 0 and 0 is a valid value... :-/ */
+    if(H5D__get_storage_size(dset, dxpl_id, &space_allocated) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get size of dataset's storage")
+
+    /* Decide on how much of the space is allocated */
+    if(space_allocated == 0)
+        *allocation = H5D_SPACE_STATUS_NOT_ALLOCATED;
+    else if(space_allocated == full_size)
+        *allocation = H5D_SPACE_STATUS_ALLOCATED;
+    else {
+        /* Should only happen for chunked datasets currently */
+        HDassert(dset->shared->layout.type == H5D_CHUNKED);
+
+        *allocation = H5D_SPACE_STATUS_PART_ALLOCATED;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__get_space_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__new
+ *
+ * Purpose:	Creates a new, empty dataset structure
+ *
+ * Return:	Success:	Pointer to a new dataset descriptor.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, October 12, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5D_shared_t *
+H5D__new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type)
+{
+    H5D_shared_t    *new_dset = NULL;   /* New dataset object */
+    H5P_genplist_t  *plist;             /* Property list created */
+    H5D_shared_t    *ret_value;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Allocate new shared dataset structure */
+    if(NULL == (new_dset = H5FL_MALLOC(H5D_shared_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the default dataset information */
+    HDmemcpy(new_dset, &H5D_def_dset, sizeof(H5D_shared_t));
+
+    /* If we are using the default dataset creation property list, during creation
+     * don't bother to copy it, just increment the reference count
+     */
+    if(!vl_type && creating && dcpl_id == H5P_DATASET_CREATE_DEFAULT) {
+        if(H5I_inc_ref(dcpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't increment default DCPL ID")
+        new_dset->dcpl_id = dcpl_id;
+    } /* end if */
+    else {
+        /* Get the property list */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
+
+        new_dset->dcpl_id = H5P_copy_plist(plist, FALSE);
+    } /* end else */
+
+    /* Set return value */
+    ret_value = new_dset;
+
+done:
+    if(ret_value == NULL)
+        if(new_dset != NULL) {
+            if(new_dset->dcpl_id != 0 && H5I_dec_ref(new_dset->dcpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL, "can't decrement temporary datatype ID")
+            new_dset = H5FL_FREE(H5D_shared_t, new_dset);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__init_type
+ *
+ * Purpose:	Copy a datatype for a dataset's use, performing all the
+ *              necessary adjustments, etc.
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, June 24, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id, const H5T_t *type)
+{
+    htri_t relocatable;                 /* Flag whether the type is relocatable */
+    htri_t immutable;                   /* Flag whether the type is immutable */
+    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(file);
+    HDassert(dset);
+    HDassert(type);
+
+    /* Check whether the datatype is relocatable */
+    if((relocatable = H5T_is_relocatable(type)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't check datatype?")
+
+    /* Check whether the datatype is immutable */
+    if((immutable = H5T_is_immutable(type)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't check datatype?")
+
+    /* Get the file's 'use the latest version of the format' flag */
+    use_latest_format = H5F_USE_LATEST_FORMAT(file);
+
+    /* Copy the datatype if it's a custom datatype or if it'll change when it's location is changed */
+    if(!immutable || relocatable || use_latest_format) {
+        /* Copy datatype for dataset */
+        if((dset->shared->type = H5T_copy(type, H5T_COPY_ALL)) == NULL)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy datatype")
+
+	/* Convert a datatype (if committed) to a transient type if the committed datatype's file
+	   location is different from the file location where the dataset will be created */
+        if(H5T_convert_committed_datatype(dset->shared->type, file) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get shared datatype info")
+
+        /* Mark any datatypes as being on disk now */
+        if(H5T_set_loc(dset->shared->type, file, H5T_LOC_DISK) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't set datatype location")
+
+        /* Set the latest format, if requested */
+        if(use_latest_format)
+            if(H5T_set_latest_version(dset->shared->type) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of datatype")
+
+        /* Get a datatype ID for the dataset's datatype */
+	if((dset->shared->type_id = H5I_register(H5I_DATATYPE, dset->shared->type, FALSE)) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register type")
+    } /* end if */
+    /* Not a custom datatype, just use it directly */
+    else {
+        if(H5I_inc_ref(type_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, FAIL, "Can't increment datatype ID")
+
+        /* Use existing datatype */
+        dset->shared->type_id = type_id;
+        dset->shared->type = (H5T_t *)type; /* (Cast away const OK - QAK) */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__init_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__init_space
+ *
+ * Purpose:	Copy a dataspace for a dataset's use, performing all the
+ *              necessary adjustments, etc.
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July 24, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space)
+{
+    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(file);
+    HDassert(dset);
+    HDassert(space);
+
+    /* Get the file's 'use the latest version of the format' flag */
+    use_latest_format = H5F_USE_LATEST_FORMAT(file);
+
+    /* Copy dataspace for dataset */
+    if(NULL == (dset->shared->space = H5S_copy(space, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy dataspace")
+
+    /* Set the latest format, if requested */
+    if(use_latest_format)
+        if(H5S_set_latest_version(dset->shared->space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of datatype")
+
+    /* Set the dataset's dataspace to 'all' selection */
+    if(H5S_select_all(dset->shared->space, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set all selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__init_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__update_oh_info
+ *
+ * Purpose:	Create and fill object header for dataset
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Bill Wendling
+ *		Thursday, October 31, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
+{
+    H5O_t              *oh = NULL;      /* Pointer to dataset's object header */
+    size_t              ohdr_size = H5D_MINHDR_SIZE;    /* Size of dataset's object header */
+    H5O_loc_t          *oloc = NULL;    /* Dataset's object location */
+    H5O_layout_t       *layout;         /* Dataset's layout information */
+    H5T_t              *type;           /* Dataset's datatype */
+    hbool_t             use_latest_format;      /* Flag indicating the newest file format should be used */
+    H5O_fill_t		*fill_prop;     /* Pointer to dataset's fill value information */
+    H5D_fill_value_t	fill_status;    /* Fill value status */
+    hbool_t             fill_changed = FALSE;      /* Flag indicating the fill value was changed */
+    hbool_t             layout_init = FALSE;    /* Flag to indicate that chunk information was initialized */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(file);
+    HDassert(dset);
+
+    /* Set some local variables, for convenience */
+    oloc = &dset->oloc;
+    layout = &dset->shared->layout;
+    type = dset->shared->type;
+    fill_prop = &dset->shared->dcpl_cache.fill;
+
+    /* Get the file's 'use the latest version of the format' flag */
+    use_latest_format = H5F_USE_LATEST_FORMAT(file);
+
+    /* Retrieve "defined" status of fill value */
+    if(H5P_is_fill_value_defined(fill_prop, &fill_status) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+    /* Special case handling for variable-length types */
+    if(H5T_detect_class(type, H5T_VLEN, FALSE)) {
+        /* If the default fill value is chosen for variable-length types, always write it */
+        if(fill_prop->fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_DEFAULT) {
+            /* Update dataset creation property */
+            fill_prop->fill_time = H5D_FILL_TIME_ALLOC;
+
+            /* Note that the fill value changed */
+            fill_changed = TRUE;
+        } /* end if */
+
+        /* Don't allow never writing fill values with variable-length types */
+        if(fill_prop->fill_time == H5D_FILL_TIME_NEVER)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Dataset doesn't support VL datatype when fill value is not defined")
+    } /* end if */
+
+    /* Determine whether fill value is defined or not */
+    if(fill_status == H5D_FILL_VALUE_DEFAULT || fill_status == H5D_FILL_VALUE_USER_DEFINED) {
+        /* Convert fill value buffer to dataset's datatype */
+        if(fill_prop->buf && fill_prop->size > 0 && H5O_fill_convert(fill_prop, type, &fill_changed, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert fill value to dataset type")
+
+	fill_prop->fill_defined = TRUE;
+    } else if(fill_status == H5D_FILL_VALUE_UNDEFINED) {
+ 	fill_prop->fill_defined = FALSE;
+    } else
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine if fill value is defined")
+
+    /* Check for invalid fill & allocation time setting */
+    if(fill_prop->fill_defined == FALSE && fill_prop->fill_time == H5D_FILL_TIME_ALLOC)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "fill value writing on allocation set, but no fill value defined")
+
+    /* Check if the fill value info changed */
+    if(fill_changed) {
+        H5P_genplist_t     *dc_plist;               /* Dataset's creation property list */
+
+        /* Get dataset's property list object */
+        HDassert(dset->shared->dcpl_id != H5P_DATASET_CREATE_DEFAULT);
+        if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(dset->shared->dcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
+
+        /* Update dataset creation property */
+        if(H5P_set(dc_plist, H5D_CRT_FILL_VALUE_NAME, fill_prop) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value info")
+    } /* end if */
+
+    /* Add the dataset's raw data size to the size of the header, if the raw data will be stored as compact */
+    if(layout->type == H5D_COMPACT)
+        ohdr_size += layout->storage.u.compact.size;
+
+    /* Create an object header for the dataset */
+    if(H5O_create(file, dxpl_id, ohdr_size, (size_t)1, dset->shared->dcpl_id, oloc/*out*/) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset object header")
+    HDassert(file == dset->oloc.file);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(oloc, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+
+    /* Write the dataspace header message */
+    if(H5S_append(file, dxpl_id, oh, dset->shared->space) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update dataspace header message")
+
+    /* Write the datatype header message */
+    if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_DTYPE_ID, H5O_MSG_FLAG_CONSTANT, 0, type) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update datatype header message")
+
+    /* Write new fill value message */
+    if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_FILL_NEW_ID, H5O_MSG_FLAG_CONSTANT, 0, fill_prop) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update new fill value header message")
+
+    /* If there is valid information for the old fill value struct, add it */
+    /* (only if we aren't trying to write the latest version of the file format) */
+    if(fill_prop->buf && !use_latest_format) {
+        H5O_fill_t old_fill_prop;       /* Copy of fill value property, for writing as "old" fill value */
+
+        /* Shallow copy the fill value property */
+        /* (we only want to make certain that the shared component isnt' modified) */
+        HDmemcpy(&old_fill_prop, fill_prop, sizeof(old_fill_prop));
+
+        /* Reset shared component info */
+        H5O_msg_reset_share(H5O_FILL_ID, &old_fill_prop);
+
+        /* Write old fill value */
+        if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_FILL_ID, H5O_MSG_FLAG_CONSTANT, 0, &old_fill_prop) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update old fill value header message")
+    } /* end if */
+
+    /* Update/create the layout (and I/O pipeline & EFL) messages */
+    if(H5D__layout_oh_create(file, dxpl_id, oh, dset, dapl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout/pline/efl header message")
+
+    /* Indicate that the layout information was initialized */
+    layout_init = TRUE;
+
+#ifdef H5O_ENABLE_BOGUS
+{
+    H5P_genplist_t     *dc_plist;               /* Dataset's creation property list */
+
+    /* Get dataset's property list object */
+    if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(dset->shared->dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
+
+    /* Check whether to add a "bogus" message */
+    if(H5P_exist_plist(dc_plist, H5O_BOGUS_MSG_FLAGS_NAME) > 0) {
+        uint8_t bogus_flags = 0;        /* Flags for creating "bogus" message */
+
+        /* Retrieve "bogus" message flags */
+        if(H5P_get(dc_plist, H5O_BOGUS_MSG_FLAGS_NAME, &bogus_flags) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get bogus message options")
+
+        /* Add a "bogus" message (for error testing). */
+        if(H5O_bogus_oh(file, dxpl_id, oh, (unsigned)bogus_flags) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create 'bogus' message")
+    } /* end if */
+}
+#endif /* H5O_ENABLE_BOGUS */
+
+    /* Add a modification time message, if using older format. */
+    /* (If using the latest format, the modification time is part of the object
+     *  header and doesn't use a separate message -QAK)
+     */
+    if(!use_latest_format)
+        if(H5O_touch_oh(file, dxpl_id, oh, TRUE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update modification time message")
+
+done:
+    /* Release pointer to object header itself */
+    if(oh != NULL)
+        if(H5O_unpin(oh) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
+
+    /* Error cleanup */
+    if(ret_value < 0) {
+        if(dset->shared->layout.type == H5D_CHUNKED && layout_init) {
+            if(H5D__chunk_dest(file, dxpl_id, dset) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__update_oh_info() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5D_build_extfile_prefix
+ *
+ * Purpose:     Determine the external file prefix to be used and store
+ *              it in extfile_prefix. Stores an empty string if no prefix
+ *              should be used.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Steffen Kiess
+ *              October 16, 2015
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5D_build_extfile_prefix(const H5D_t *dset, hid_t dapl_id, char **extfile_prefix /*out*/)
+{
+    char            *prefix = NULL;       /* prefix used to look for the file               */
+    char            *extpath = NULL;      /* absolute path of directory the HDF5 file is in */
+    size_t          extpath_len;          /* length of extpath                              */
+    size_t          prefix_len;           /* length of prefix                               */
+    size_t          extfile_prefix_len;   /* length of expanded prefix                      */
+    hbool_t         free_prefix = FALSE;  /* Did the library allocate memory for prefix?    */
+    H5P_genplist_t  *plist = NULL;        /* Property list pointer                          */
+    herr_t          ret_value = SUCCEED;  /* Return value                                   */
+    
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(dset);
+    HDassert(dset->oloc.file);
+
+    extpath = H5F_EXTPATH(dset->oloc.file);
+    HDassert(extpath);
+
+    /* XXX: Future thread-safety note - getenv is not required
+     *      to be reentrant.
+     */
+    prefix = HDgetenv("HDF5_EXTFILE_PREFIX");
+
+    if(prefix == NULL || *prefix == '\0') {
+        /* Set prefix to value of H5D_ACS_EFILE_PREFIX_NAME property */
+        if(NULL == (plist = H5P_object_verify(dapl_id, H5P_DATASET_ACCESS)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+        /* No error checking possible here */
+        prefix = (char *)H5P_peek_voidp(plist, H5D_ACS_EFILE_PREFIX_NAME);
+        free_prefix = TRUE;
+    } /* end if */
+
+    /* Prefix has to be checked for NULL / empty string again because the
+     * code above might have updated it.
+     */
+    if(prefix == NULL || *prefix == '\0' || HDstrcmp(prefix, ".") == 0) {
+        /* filename is interpreted as relative to the current directory,
+         * does not need to be expanded
+         */
+        if(NULL == (*extfile_prefix = (char *)H5MM_strdup("")))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    } /* end if */
+    else {
+        if (HDstrncmp(prefix, "${ORIGIN}", HDstrlen("${ORIGIN}")) == 0) {
+            /* Replace ${ORIGIN} at beginning of prefix by directory of HDF5 file */
+            extpath_len = HDstrlen(extpath);
+            prefix_len = HDstrlen(prefix);
+            extfile_prefix_len = extpath_len + prefix_len - HDstrlen("${ORIGIN}") + 1;
+        
+            if(NULL == (*extfile_prefix = (char *)H5MM_malloc(extfile_prefix_len)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate buffer")
+            HDsnprintf(*extfile_prefix, extfile_prefix_len, "%s%s", extpath, prefix + HDstrlen("${ORIGIN}"));
+        } /* end if */
+        else {
+            if(NULL == (*extfile_prefix = (char *)H5MM_strdup(prefix)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        } /* end else */
+    } /* end else */
+
+done:
+    if(free_prefix && prefix)
+        H5MM_xfree(prefix);
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D_build_extfile_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__create
+ *
+ * Purpose:	Creates a new dataset with name NAME in file F and associates
+ *		with it a datatype TYPE for each element as stored in the
+ *		file, dimensionality information or dataspace SPACE, and
+ *		other miscellaneous properties CREATE_PARMS.  All arguments
+ *		are deep-copied before being associated with the new dataset,
+ *		so the caller is free to subsequently modify them without
+ *		affecting the dataset.
+ *
+ * Return:	Success:	Pointer to a new dataset
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_t *
+H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
+    hid_t dapl_id, hid_t dxpl_id)
+{
+    const H5T_t         *type;                  /* Datatype for dataset */
+    H5D_t		*new_dset = NULL;
+    H5P_genplist_t 	*dc_plist = NULL;       /* New Property list */
+    hbool_t             has_vl_type = FALSE;    /* Flag to indicate a VL-type for dataset */
+    hbool_t             layout_init = FALSE;    /* Flag to indicate that chunk information was initialized */
+    H5G_loc_t           dset_loc;               /* Dataset location */
+    H5D_t		*ret_value;             /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(file);
+    HDassert(H5I_DATATYPE == H5I_get_type(type_id));
+    HDassert(space);
+    HDassert(H5I_GENPROP_LST == H5I_get_type(dcpl_id));
+    HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
+
+    /* Get the dataset's datatype */
+    if(NULL == (type = (const H5T_t *)H5I_object(type_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype")
+
+    /* Check if the datatype is "sensible" for use in a dataset */
+    if(H5T_is_sensible(type) != TRUE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "datatype is not sensible")
+
+    /* Check if the datatype is/contains a VL-type */
+    if(H5T_detect_class(type, H5T_VLEN, FALSE))
+        has_vl_type = TRUE;
+
+    /* Check if the dataspace has an extent set (or is NULL) */
+    if(!H5S_has_extent(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "dataspace extent has not been set.")
+
+    /* Initialize the dataset object */
+    if(NULL == (new_dset = H5FL_CALLOC(H5D_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set up & reset dataset location */
+    dset_loc.oloc = &(new_dset->oloc);
+    dset_loc.path = &(new_dset->path);
+    H5G_loc_reset(&dset_loc);
+
+    /* Initialize the shared dataset space */
+    if(NULL == (new_dset->shared = H5D__new(dcpl_id, TRUE, has_vl_type)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy & initialize datatype for dataset */
+    if(H5D__init_type(file, new_dset, type_id, type) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't copy datatype")
+
+    /* Copy & initialize dataspace for dataset */
+    if(H5D__init_space(file, new_dset, space) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't copy dataspace")
+
+    /* Set the dataset's checked_filters flag to enable writing */
+    new_dset->shared->checked_filters = TRUE;
+
+    /* Check if the dataset has a non-default DCPL & get important values, if so */
+    if(new_dset->shared->dcpl_id != H5P_DATASET_CREATE_DEFAULT) {
+        H5O_layout_t    *layout;        /* Dataset's layout information */
+        H5O_pline_t     *pline;         /* Dataset's I/O pipeline information */
+        H5O_fill_t      *fill;          /* Dataset's fill value info */
+
+        /* Check if the filters in the DCPL can be applied to this dataset */
+        if(H5Z_can_apply(new_dset->shared->dcpl_id, new_dset->shared->type_id) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, NULL, "I/O filters can't operate on this dataset")
+
+        /* Make the "set local" filter callbacks for this dataset */
+        if(H5Z_set_local(new_dset->shared->dcpl_id, new_dset->shared->type_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to set local filter parameters")
+
+        /* Get new dataset's property list object */
+        if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(new_dset->shared->dcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't get dataset creation property list")
+
+        /* Retrieve the properties we need */
+        pline = &new_dset->shared->dcpl_cache.pline;
+        if(H5P_get(dc_plist, H5O_CRT_PIPELINE_NAME, pline) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve pipeline filter")
+        layout = &new_dset->shared->layout;
+        if(H5P_get(dc_plist, H5D_CRT_LAYOUT_NAME, layout) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve layout")
+        if(pline->nused > 0 && H5D_CHUNKED != layout->type)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, "filters can only be used with chunked layout")
+        fill = &new_dset->shared->dcpl_cache.fill;
+        if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve fill value info")
+
+        /* Check if the alloc_time is the default and error out */
+        if(fill->alloc_time == H5D_ALLOC_TIME_DEFAULT)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, "invalid space allocation state")
+
+        /* Don't allow compact datasets to allocate space later */
+        if(layout->type == H5D_COMPACT && fill->alloc_time != H5D_ALLOC_TIME_EARLY)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, "compact dataset must have early space allocation")
+
+        /* If MPI VFD is used, no filter support yet. */
+        if(H5F_HAS_FEATURE(file, H5FD_FEAT_HAS_MPI) && pline->nused > 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "Parallel I/O does not support filters yet")
+
+        /* Get the dataset's external file list information */
+        if(H5P_get(dc_plist, H5D_CRT_EXT_FILE_LIST_NAME, &new_dset->shared->dcpl_cache.efl) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve external file list")
+    } /* end if */
+
+    /* Set the latest version of the layout, pline & fill messages, if requested */
+    if(H5F_USE_LATEST_FORMAT(file)) {
+        /* Set the latest version for the I/O pipeline message */
+        if(H5O_pline_set_latest_version(&new_dset->shared->dcpl_cache.pline) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of I/O filter pipeline")
+
+        /* Set the latest version for the fill value message */
+        if(H5O_fill_set_latest_version(&new_dset->shared->dcpl_cache.fill) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of fill value")
+    } /* end if */
+
+    /* Check if this dataset is going into a parallel file and set space allocation time */
+    if(H5F_HAS_FEATURE(file, H5FD_FEAT_ALLOCATE_EARLY))
+        new_dset->shared->dcpl_cache.fill.alloc_time = H5D_ALLOC_TIME_EARLY;
+
+    /* Set the dataset's I/O operations */
+    if(H5D__layout_set_io_ops(new_dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize I/O operations")
+
+    /* Create the layout information for the new dataset */
+    if((new_dset->shared->layout.ops->construct)(file, new_dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to construct layout information")
+
+    /* Update the dataset's object header info. */
+    if(H5D__update_oh_info(file, dxpl_id, new_dset, dapl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't update the metadata cache")
+
+    /* Indicate that the layout information was initialized */
+    layout_init = TRUE;
+
+    /* Set the external file prefix */
+    if(H5D_build_extfile_prefix(new_dset, dapl_id, &new_dset->shared->extfile_prefix) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize external file prefix")
+
+    /* Add the dataset to the list of opened objects in the file */
+    if(H5FO_top_incr(new_dset->oloc.file, new_dset->oloc.addr) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't incr object ref. count")
+    if(H5FO_insert(new_dset->oloc.file, new_dset->oloc.addr, new_dset->shared, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, NULL, "can't insert dataset into list of open objects")
+    new_dset->shared->fo_count = 1;
+
+    /* Success */
+    ret_value = new_dset;
+
+done:
+    if(!ret_value && new_dset && new_dset->shared) {
+        if(new_dset->shared) {
+            if(new_dset->shared->layout.type == H5D_CHUNKED && layout_init) {
+                if(H5D__chunk_dest(file, dxpl_id, new_dset) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, NULL, "unable to destroy chunk cache")
+            } /* end if */
+            if(new_dset->shared->space && H5S_close(new_dset->shared->space) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release dataspace")
+            if(new_dset->shared->type && H5I_dec_ref(new_dset->shared->type_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release datatype")
+            if(H5F_addr_defined(new_dset->oloc.addr)) {
+                if(H5O_dec_rc_by_loc(&(new_dset->oloc), dxpl_id) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL, "unable to decrement refcount on newly created object")
+                if(H5O_close(&(new_dset->oloc)) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release object header")
+                if(file) {
+                    if(H5O_delete(file, dxpl_id, new_dset->oloc.addr) < 0)
+                        HDONE_ERROR(H5E_DATASET, H5E_CANTDELETE, NULL, "unable to delete object header")
+                } /* end if */
+            } /* end if */
+            if(new_dset->shared->dcpl_id != 0 && H5I_dec_ref(new_dset->shared->dcpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL, "unable to decrement ref count on property list")
+            new_dset->shared->extfile_prefix = (char *)H5MM_xfree(new_dset->shared->extfile_prefix);
+            new_dset->shared = H5FL_FREE(H5D_shared_t, new_dset->shared);
+        } /* end if */
+        new_dset->oloc.file = NULL;
+        new_dset = H5FL_FREE(H5D_t, new_dset);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__create() */
+
+

+/*
+ *-------------------------------------------------------------------------
+ * Function:	H5D_open
+ *
+ * Purpose:	Checks if dataset is already open, or opens a dataset for
+ *              access.
+ *
+ * Return:	Success:	Dataset ID
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, December 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_t *
+H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id)
+{
+    H5D_shared_t    *shared_fo = NULL;
+    H5D_t           *dataset = NULL;
+    char            *extfile_prefix = NULL;  /* Expanded external file prefix */
+    H5D_t           *ret_value = NULL;       /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+
+    /* Allocate the dataset structure */
+    if(NULL == (dataset = H5FL_CALLOC(H5D_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Shallow copy (take ownership) of the object location object */
+    if(H5O_loc_copy(&(dataset->oloc), loc->oloc, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, NULL, "can't copy object location")
+
+    /* Shallow copy (take ownership) of the group hier. path */
+    if(H5G_name_copy(&(dataset->path), loc->path, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, NULL, "can't copy path")
+
+    /* Get the external file prefix */
+    if(H5D_build_extfile_prefix(dataset, dapl_id, &extfile_prefix) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize external file prefix")
+
+    /* Check if dataset was already open */
+    if(NULL == (shared_fo = (H5D_shared_t *)H5FO_opened(dataset->oloc.file, dataset->oloc.addr))) {
+        /* Clear any errors from H5FO_opened() */
+        H5E_clear_stack(NULL);
+
+        /* Open the dataset object */
+        if(H5D__open_oid(dataset, dapl_id, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, NULL, "not found")
+
+        /* Add the dataset to the list of opened objects in the file */
+        if(H5FO_insert(dataset->oloc.file, dataset->oloc.addr, dataset->shared, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, NULL, "can't insert dataset into list of open objects")
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(dataset->oloc.file, dataset->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't increment object count")
+
+        /* We're the first dataset to use the the shared info */
+        dataset->shared->fo_count = 1;
+
+        /* Set the external file prefix */
+        dataset->shared->extfile_prefix = extfile_prefix;
+        /* Prevent string from being freed during done: */
+        extfile_prefix = NULL;
+
+    } /* end if */
+    else {
+        /* Point to shared info */
+        dataset->shared = shared_fo;
+
+        /* Increment # of datasets using shared information */
+        shared_fo->fo_count++;
+
+        /* Check whether the external file prefix of the already open dataset
+         * matches the new external file prefix
+         */
+        if(HDstrcmp(extfile_prefix, dataset->shared->extfile_prefix) != 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "new external file prefix does not match external file prefix of already open dataset")
+
+        /* Check if the object has been opened through the top file yet */
+        if(H5FO_top_count(dataset->oloc.file, dataset->oloc.addr) == 0) {
+            /* Open the object through this top file */
+            if(H5O_open(&(dataset->oloc)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open object header")
+        } /* end if */
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(dataset->oloc.file, dataset->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't increment object count")
+    } /* end else */
+
+    /* Set the dataset to return */
+    ret_value = dataset;
+
+done:
+    extfile_prefix = (char *)H5MM_xfree(extfile_prefix);
+
+    if(ret_value == NULL) {
+        /* Free the location--casting away const*/
+        if(dataset) {
+            if(shared_fo == NULL && dataset->shared) {   /* Need to free shared fo */
+                dataset->shared->extfile_prefix = (char *)H5MM_xfree(dataset->shared->extfile_prefix);
+                dataset->shared = H5FL_FREE(H5D_shared_t, dataset->shared);
+            }
+
+            H5O_loc_free(&(dataset->oloc));
+            H5G_name_free(&(dataset->path));
+
+            dataset = H5FL_FREE(H5D_t, dataset);
+        } /* end if */
+        if(shared_fo)
+            shared_fo->fo_count--;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__open_oid
+ *
+ * Purpose:	Opens a dataset for access.
+ *
+ * Return:	Dataset pointer on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, October 12, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
+{
+    H5P_genplist_t *plist;              /* Property list */
+    H5O_fill_t *fill_prop;              /* Pointer to dataset's fill value info */
+    unsigned alloc_time_state;          /* Allocation time state */
+    htri_t msg_exists;                  /* Whether a particular type of message exists */
+    hbool_t layout_init = FALSE;    	/* Flag to indicate that chunk information was initialized */
+    herr_t ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(dataset);
+
+    /* (Set the 'vl_type' parameter to FALSE since it doesn't matter from here) */
+    if(NULL == (dataset->shared = H5D__new(H5P_DATASET_CREATE_DEFAULT, FALSE, FALSE)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Open the dataset object */
+    if(H5O_open(&(dataset->oloc)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open")
+
+    /* Get the type and space */
+    if(NULL == (dataset->shared->type = (H5T_t *)H5O_msg_read(&(dataset->oloc), H5O_DTYPE_ID, NULL, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to load type info from dataset header")
+
+    if(H5T_set_loc(dataset->shared->type, dataset->oloc.file, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
+
+    if(NULL == (dataset->shared->space = H5S_read(&(dataset->oloc), dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to load dataspace info from dataset header")
+
+    /* Get a datatype ID for the dataset's datatype */
+    if((dataset->shared->type_id = H5I_register(H5I_DATATYPE, dataset->shared->type, FALSE)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register type")
+
+    /* Get dataset creation property list object */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dataset->shared->dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
+
+    /* Get the layout/pline/efl message information */
+    if(H5D__layout_oh_read(dataset, dxpl_id, dapl_id, plist) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get layout/pline/efl info")
+
+    /* Indicate that the layout information was initialized */
+    layout_init = TRUE;
+
+    /* Point at dataset's copy, to cache it for later */
+    fill_prop = &dataset->shared->dcpl_cache.fill;
+
+    /* Try to get the new fill value message from the object header */
+    if((msg_exists = H5O_msg_exists(&(dataset->oloc), H5O_FILL_NEW_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't check if message exists")
+    if(msg_exists) {
+        if(NULL == H5O_msg_read(&(dataset->oloc), H5O_FILL_NEW_ID, fill_prop, dxpl_id))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+    } /* end if */
+    else {
+	/* For backward compatibility, try to retrieve the old fill value message */
+        if((msg_exists = H5O_msg_exists(&(dataset->oloc), H5O_FILL_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't check if message exists")
+        if(msg_exists) {
+            if(NULL == H5O_msg_read(&(dataset->oloc), H5O_FILL_ID, fill_prop, dxpl_id))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+        } /* end if */
+        else {
+            /* Set the space allocation time appropriately, based on the type of dataset storage */
+            switch(dataset->shared->layout.type) {
+                case H5D_COMPACT:
+                    fill_prop->alloc_time = H5D_ALLOC_TIME_EARLY;
+                    break;
+
+                case H5D_CONTIGUOUS:
+                    fill_prop->alloc_time = H5D_ALLOC_TIME_LATE;
+                    break;
+
+                case H5D_CHUNKED:
+                    fill_prop->alloc_time = H5D_ALLOC_TIME_INCR;
+                    break;
+
+                case H5D_LAYOUT_ERROR:
+                case H5D_NLAYOUTS:
+                default:
+                    HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "not implemented yet")
+            } /* end switch */ /*lint !e788 All appropriate cases are covered */
+        } /* end else */
+
+        /* If "old" fill value size is 0 (undefined), map it to -1 */
+        if(fill_prop->size == 0)
+            fill_prop->size = (ssize_t)-1;
+    } /* end if */
+    alloc_time_state = 0;
+    if((dataset->shared->layout.type == H5D_COMPACT && fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY)
+            || (dataset->shared->layout.type == H5D_CONTIGUOUS && fill_prop->alloc_time == H5D_ALLOC_TIME_LATE)
+            || (dataset->shared->layout.type == H5D_CHUNKED && fill_prop->alloc_time == H5D_ALLOC_TIME_INCR))
+        alloc_time_state = 1;
+
+    /* Set revised fill value properties, if they are different from the defaults */
+    if(H5P_fill_value_cmp(&H5D_def_dset.dcpl_cache.fill, fill_prop, sizeof(H5O_fill_t))) {
+        if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, fill_prop) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set fill value")
+        if(H5P_set(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set allocation time state")
+    } /* end if */
+
+    /*
+     * Make sure all storage is properly initialized.
+     * This is important only for parallel I/O where the space must
+     * be fully allocated before I/O can happen.
+     */
+    if((H5F_INTENT(dataset->oloc.file) & H5F_ACC_RDWR)
+            && !(*dataset->shared->layout.ops->is_space_alloc)(&dataset->shared->layout.storage)
+            && H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_ALLOCATE_EARLY)) {
+        if(H5D__alloc_storage(dataset, dxpl_id, H5D_ALLOC_OPEN, FALSE, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file storage")
+    } /* end if */
+
+done:
+    if(ret_value < 0) {
+        if(H5F_addr_defined(dataset->oloc.addr) && H5O_close(&(dataset->oloc)) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
+        if(dataset->shared) {
+	    if(dataset->shared->layout.type == H5D_CHUNKED && layout_init)
+                if(H5D__chunk_dest(dataset->oloc.file, dxpl_id, dataset) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
+            if(dataset->shared->space && H5S_close(dataset->shared->space) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+            if(dataset->shared->type) {
+                if(dataset->shared->type_id > 0) {
+                    if(H5I_dec_ref(dataset->shared->type_id) < 0)
+                        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+                } /* end if */
+                else {
+                    if(H5T_close(dataset->shared->type) < 0)
+                        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+                } /* end else */
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__open_oid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_close
+ *
+ * Purpose:	Insures that all data has been saved to the file, closes the
+ *		dataset object header, and frees all resources used by the
+ *		descriptor.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_close(H5D_t *dataset)
+{
+    unsigned free_failed = FALSE;
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(dataset && dataset->oloc.file && dataset->shared);
+    HDassert(dataset->shared->fo_count > 0);
+
+    /* Dump debugging info */
+#ifdef H5D_CHUNK_DEBUG
+    H5D__chunk_stats(dataset, FALSE);
+#endif /* H5D_CHUNK_DEBUG */
+
+    dataset->shared->fo_count--;
+    if(dataset->shared->fo_count == 0) {
+        /* Flush the dataset's information.  Continue to close even if it fails. */
+        if(H5D__flush_real(dataset, H5AC_dxpl_id) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
+
+        /* Free the data sieve buffer, if it's been allocated */
+        if(dataset->shared->cache.contig.sieve_buf) {
+            HDassert(dataset->shared->layout.type != H5D_COMPACT);      /* We should never have a sieve buffer for compact storage */
+
+            dataset->shared->cache.contig.sieve_buf = (unsigned char *)H5FL_BLK_FREE(sieve_buf,dataset->shared->cache.contig.sieve_buf);
+        } /* end if */
+
+        /* Free cached information for each kind of dataset */
+        switch(dataset->shared->layout.type) {
+            case H5D_CONTIGUOUS:
+                break;
+
+            case H5D_CHUNKED:
+                /* Check for skip list for iterating over chunks during I/O to close */
+                if(dataset->shared->cache.chunk.sel_chunks) {
+                    HDassert(H5SL_count(dataset->shared->cache.chunk.sel_chunks) == 0);
+                    H5SL_close(dataset->shared->cache.chunk.sel_chunks);
+                    dataset->shared->cache.chunk.sel_chunks = NULL;
+                } /* end if */
+
+                /* Check for cached single chunk dataspace */
+                if(dataset->shared->cache.chunk.single_space) {
+                    (void)H5S_close(dataset->shared->cache.chunk.single_space);
+                    dataset->shared->cache.chunk.single_space = NULL;
+                } /* end if */
+
+                /* Check for cached single element chunk info */
+                if(dataset->shared->cache.chunk.single_chunk_info) {
+                    dataset->shared->cache.chunk.single_chunk_info = H5FL_FREE(H5D_chunk_info_t, dataset->shared->cache.chunk.single_chunk_info);
+                    dataset->shared->cache.chunk.single_chunk_info = NULL;
+                } /* end if */
+
+                /* Flush and destroy chunks in the cache. Continue to close even if 
+                 * it fails. */
+                if(H5D__chunk_dest(dataset->oloc.file, H5AC_dxpl_id, dataset) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
+                break;
+
+            case H5D_COMPACT:
+                /* Free the buffer for the raw data for compact datasets */
+                dataset->shared->layout.storage.u.compact.buf = H5MM_xfree(dataset->shared->layout.storage.u.compact.buf);
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HDassert("not implemented yet" && 0);
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout")
+#endif /* NDEBUG */
+        } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+        /* Free the external file prefix */
+        dataset->shared->extfile_prefix = (char *)H5MM_xfree(dataset->shared->extfile_prefix);
+
+        /*
+        * Release datatype, dataspace and creation property list -- there isn't
+        * much we can do if one of these fails, so we just continue.
+        */
+        free_failed |= (unsigned)(H5I_dec_ref(dataset->shared->type_id) < 0 || H5S_close(dataset->shared->space) < 0 ||
+                          H5I_dec_ref(dataset->shared->dcpl_id) < 0);
+
+        /* Remove the dataset from the list of opened objects in the file */
+        if(H5FO_top_decr(dataset->oloc.file, dataset->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+        if(H5FO_delete(dataset->oloc.file, H5AC_dxpl_id, dataset->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't remove dataset from list of open objects")
+
+        /* Close the dataset object */
+        /* (This closes the file, if this is the last object open) */
+        if(H5O_close(&(dataset->oloc)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
+
+        /*
+         * Free memory.  Before freeing the memory set the file pointer to NULL.
+         * We always check for a null file pointer in other H5D functions to be
+         * sure we're not accessing an already freed dataset (see the HDassert()
+         * above).
+         */
+        dataset->oloc.file = NULL;
+
+        dataset->shared = H5FL_FREE(H5D_shared_t, dataset->shared);
+    } /* end if */
+    else {
+        /* Decrement the ref. count for this object in the top file */
+        if(H5FO_top_decr(dataset->oloc.file, dataset->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+
+        /* Check reference count for this object in the top file */
+        if(H5FO_top_count(dataset->oloc.file, dataset->oloc.addr) == 0) {
+            if(H5O_close(&(dataset->oloc)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to close")
+        } /* end if */
+        else
+            /* Free object location (i.e. "unhold" the file if appropriate) */
+            if(H5O_loc_free(&(dataset->oloc)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
+    } /* end else */
+
+   /* Release the dataset's path info */
+   if(H5G_name_free(&(dataset->path)) < 0)
+       free_failed = TRUE;
+
+    /* Free the dataset's memory structure */
+    dataset = H5FL_FREE(H5D_t, dataset);
+
+    /* Check if anything failed in the middle... */
+    if(free_failed)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "couldn't free a component of the dataset, but the dataset was freed anyway.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_oloc
+ *
+ * Purpose:	Returns a pointer to the object location for a dataset.
+ *
+ * Return:	Success:	Ptr to location
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, April 24, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_loc_t *
+H5D_oloc(H5D_t *dataset)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(dataset ? &(dataset->oloc) : (H5O_loc_t *)NULL)
+} /* end H5D_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_nameof
+ *
+ * Purpose:	Returns a pointer to the group hier. path for a dataset.
+ *
+ * Return:	Success:	Ptr to entry
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_name_t *
+H5D_nameof(H5D_t *dataset)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(dataset ? &(dataset->path) : (H5G_name_t *)NULL)
+} /* end H5D_nameof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_typeof
+ *
+ * Purpose:	Returns a pointer to the dataset's datatype.  The datatype
+ *		is not copied.
+ *
+ * Return:	Success:	Ptr to the dataset's datatype, uncopied.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, June  4, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5D_typeof(const H5D_t *dset)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(dset);
+    HDassert(dset->shared);
+    HDassert(dset->shared->type);
+
+    FUNC_LEAVE_NOAPI(dset->shared->type)
+} /* end H5D_typeof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__alloc_storage
+ *
+ * Purpose:	Allocate storage for the raw data of a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, January 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc,
+    hbool_t full_overwrite, hsize_t old_dim[])
+{
+    H5F_t *f = dset->oloc.file;         /* The dataset's file pointer */
+    H5O_layout_t *layout;               /* The dataset's layout information */
+    hbool_t must_init_space = FALSE;    /* Flag to indicate that space should be initialized */
+    hbool_t addr_set = FALSE;           /* Flag to indicate that the dataset's storage address was set */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(dset);
+    HDassert(f);
+
+    /* If the data is stored in external files, don't set an address for the layout
+     * We assume that external storage is already
+     * allocated by the caller, or at least will be before I/O is performed.
+     */
+    if(!(H5S_NULL == H5S_GET_EXTENT_TYPE(dset->shared->space) || dset->shared->dcpl_cache.efl.nused > 0)) {
+        /* Get a pointer to the dataset's layout information */
+        layout = &(dset->shared->layout);
+
+        switch(layout->type) {
+            case H5D_CONTIGUOUS:
+                if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage)) {
+                    /* Check if we have a zero-sized dataset */
+                    if(layout->storage.u.contig.size > 0) {
+                        /* Reserve space in the file for the entire array */
+                        if(H5D__contig_alloc(f, dxpl_id, &layout->storage.u.contig/*out*/) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage")
+
+                        /* Indicate that we should initialize storage space */
+                        must_init_space = TRUE;
+                    } /* end if */
+                    else
+                        layout->storage.u.contig.addr = HADDR_UNDEF;
+
+                    /* Indicate that we set the storage addr */
+                    addr_set = TRUE;
+                } /* end if */
+                break;
+
+            case H5D_CHUNKED:
+                if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage)) {
+                    /* Create the root of the B-tree that describes chunked storage */
+                    if(H5D__chunk_create(dset /*in,out*/, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+
+                    /* Indicate that we set the storage addr */
+                    addr_set = TRUE;
+
+                    /* Indicate that we should initialize storage space */
+                    must_init_space = TRUE;
+                } /* end if */
+
+                /* If space allocation is set to 'early' and we are extending
+		 * the dataset, indicate that space should be allocated, so the
+                 * B-tree gets expanded. -QAK
+                 */
+		if(dset->shared->dcpl_cache.fill.alloc_time == H5D_ALLOC_TIME_EARLY
+                        && time_alloc == H5D_ALLOC_EXTEND)
+		    must_init_space = TRUE;
+                break;
+
+            case H5D_COMPACT:
+                /* Check if space is already allocated */
+                if(NULL == layout->storage.u.compact.buf) {
+                    /* Reserve space in layout header message for the entire array. 
+                     * Starting from the 1.8.7 release, we allow dataspace to have 
+                     * zero dimension size.  So the storage size can be zero.
+                     * SLU 2011/4/4 */
+                    if(layout->storage.u.compact.size > 0) {
+                        if(NULL == (layout->storage.u.compact.buf = H5MM_malloc(layout->storage.u.compact.size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for compact dataset")
+                        if(!full_overwrite)
+                            HDmemset(layout->storage.u.compact.buf, 0, layout->storage.u.compact.size);
+                        layout->storage.u.compact.dirty = TRUE;
+
+                        /* Indicate that we should initialize storage space */
+                        must_init_space = TRUE;
+                    } else {
+                        layout->storage.u.compact.dirty = FALSE;
+                        must_init_space = FALSE;
+                    }
+                } /* end if */
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HDassert("not implemented yet" && 0);
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout")
+#endif /* NDEBUG */
+        } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+        /* Check if we need to initialize the space */
+        if(must_init_space) {
+            if(layout->type == H5D_CHUNKED) {
+                /* If we are doing incremental allocation and the B-tree got
+                 * created during a H5Dwrite call, don't initialize the storage
+                 * now, wait for the actual writes to each block and let the
+                 * low-level chunking routines handle initialize the fill-values.
+                 * Otherwise, pass along the space initialization call and let
+                 * the low-level chunking routines sort out whether to write
+                 * fill values to the chunks they allocate space for.  Yes,
+                 * this is icky. -QAK
+                 */
+                if(!(dset->shared->dcpl_cache.fill.alloc_time == H5D_ALLOC_TIME_INCR && time_alloc == H5D_ALLOC_WRITE))
+                    if(H5D__init_storage(dset, full_overwrite, old_dim, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value")
+            } /* end if */
+            else {
+                H5D_fill_value_t	fill_status;    /* The fill value status */
+
+                /* Check the dataset's fill-value status */
+                if(H5P_is_fill_value_defined(&dset->shared->dcpl_cache.fill, &fill_status) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+                /* If we are filling the dataset on allocation or "if set" and
+                 * the fill value _is_ set, do that now */
+                if(dset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_ALLOC ||
+                        (dset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_USER_DEFINED)) {
+                    if(H5D__init_storage(dset, full_overwrite, old_dim, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value")
+                } /* end if */
+            } /* end else */
+        } /* end if */
+
+        /* If we set the address (and aren't in the middle of creating the
+         *      dataset), mark the layout header message for later writing to
+         *      the file.  (this improves forward compatibility).
+         */
+        /* (The layout message is already in the dataset's object header, this
+         *      operation just sets the address and makes it constant)
+         */
+        if(time_alloc != H5D_ALLOC_CREATE && addr_set)
+            /* Mark the layout as dirty, for later writing to the file */
+            if(H5D__mark(dset, dxpl_id, H5D_MARK_LAYOUT) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to mark dataspace as dirty")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__alloc_storage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__init_storage
+ *
+ * Purpose:	Initialize the data for a new dataset.  If a selection is
+ *		defined for SPACE then initialize only that part of the
+ *		dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, October  5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__init_storage(const H5D_t *dset, hbool_t full_overwrite, hsize_t old_dim[],
+    hid_t dxpl_id)
+{
+    herr_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(dset);
+
+    switch (dset->shared->layout.type) {
+        case H5D_COMPACT:
+            /* If we will be immediately overwriting the values, don't bother to clear them */
+            if(!full_overwrite) {
+                /* Fill the compact dataset storage */
+                if(H5D__compact_fill(dset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize compact dataset storage")
+            } /* end if */
+            break;
+
+        case H5D_CONTIGUOUS:
+            /* Don't write default fill values to external files */
+            /* If we will be immediately overwriting the values, don't bother to clear them */
+            if((dset->shared->dcpl_cache.efl.nused == 0 || dset->shared->dcpl_cache.fill.buf) && !full_overwrite)
+                if(H5D__contig_fill(dset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to allocate all chunks of dataset")
+            break;
+
+        case H5D_CHUNKED:
+            /*
+             * Allocate file space
+             * for all chunks now and initialize each chunk with the fill value.
+             */
+            {
+                hsize_t             zero_dim[H5O_LAYOUT_NDIMS] = {0};
+
+                /* Use zeros for old dimensions if not specified */
+                if(old_dim == NULL)
+                    old_dim = zero_dim;
+
+                if(H5D__chunk_allocate(dset, dxpl_id, full_overwrite, old_dim) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to allocate all chunks of dataset")
+                break;
+            } /* end block */
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HDassert("not implemented yet" && 0);
+#ifdef NDEBUG
+            HGOTO_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout")
+#endif /* NDEBUG */
+    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__init_storage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__get_storage_size
+ *
+ * Purpose:	Determines how much space has been reserved to store the raw
+ *		data of a dataset.
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 21, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__get_storage_size(H5D_t *dset, hid_t dxpl_id, hsize_t *storage_size)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(dset->shared->layout.type) {
+        case H5D_CHUNKED:
+            if((*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage)) {
+                if(H5D__chunk_allocated(dset, dxpl_id, storage_size) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve chunked dataset allocated size")
+            } /* end if */
+            else
+                *storage_size = 0;
+            break;
+
+        case H5D_CONTIGUOUS:
+            /* Datasets which are not allocated yet are using no space on disk */
+            if((*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
+                *storage_size = dset->shared->layout.storage.u.contig.size;
+            else
+                *storage_size = 0;
+            break;
+
+        case H5D_COMPACT:
+            *storage_size = dset->shared->layout.storage.u.compact.size;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset type")
+    } /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__get_storage_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__get_offset
+ *
+ * Purpose:	Private function for H5D__get_offset.  Returns the address
+ *              of dataset in file.
+ *
+ * Return:	Success:        the address of dataset
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:  Raymond Lu
+ *              November 6, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5D__get_offset(const H5D_t *dset)
+{
+    haddr_t	ret_value = HADDR_UNDEF;
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dset);
+
+    switch(dset->shared->layout.type) {
+        case H5D_CHUNKED:
+        case H5D_COMPACT:
+            break;
+
+        case H5D_CONTIGUOUS:
+            /* If dataspace hasn't been allocated or dataset is stored in
+             * an external file, the value will be HADDR_UNDEF. */
+            if(dset->shared->dcpl_cache.efl.nused == 0 || H5F_addr_defined(dset->shared->layout.storage.u.contig.addr))
+                /* Return the absolute dataset offset from the beginning of file. */
+                ret_value = dset->shared->layout.storage.u.contig.addr + H5F_BASE_ADDR(dset->oloc.file);
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, HADDR_UNDEF, "unknown dataset layout type")
+    } /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__get_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_vlen_reclaim
+ *
+ * Purpose:	Frees the buffers allocated for storing variable-length data
+ *      in memory.  Only frees the VL data in the selection defined in the
+ *      dataspace.  The dataset transfer property list is required to find the
+ *      correct allocation/free methods for the VL data in the buffer.
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 22, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_vlen_reclaim(hid_t type_id, H5S_t *space, hid_t plist_id, void *buf)
+{
+    H5T_t *type;                /* Datatype */
+    H5S_sel_iter_op_t dset_op;  /* Operator for iteration */
+    H5T_vlen_alloc_info_t _vl_alloc_info;       /* VL allocation info buffer */
+    H5T_vlen_alloc_info_t *vl_alloc_info = &_vl_alloc_info;   /* VL allocation info */
+    herr_t ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(H5I_DATATYPE == H5I_get_type(type_id));
+    HDassert(space);
+    HDassert(H5P_isa_class(plist_id, H5P_DATASET_XFER));
+    HDassert(buf);
+
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+
+    /* Get the allocation info */
+    if(H5T_vlen_get_alloc_info(plist_id,&vl_alloc_info) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to retrieve VL allocation info")
+
+    /* Call H5S_select_iterate with args, etc. */
+    dset_op.op_type = H5S_SEL_ITER_OP_APP;
+    dset_op.u.app_op.op = H5T_vlen_reclaim;
+    dset_op.u.app_op.type_id = type_id;
+
+    ret_value = H5S_select_iterate(buf, type, space, &dset_op, vl_alloc_info);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5D_vlen_reclaim() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__vlen_get_buf_size_alloc
+ *
+ * Purpose:	This routine makes certain there is enough space in the temporary
+ *      buffer for the new data to read in.  All the VL data read in is actually
+ *      placed in this buffer, overwriting the previous data.  Needless to say,
+ *      this data is not actually usable.
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 17, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5D__vlen_get_buf_size_alloc(size_t size, void *info)
+{
+    H5D_vlen_bufsize_t *vlen_bufsize = (H5D_vlen_bufsize_t *)info;
+    void *ret_value;    /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Get a temporary pointer to space for the VL data */
+    if((vlen_bufsize->vl_tbuf = H5FL_BLK_REALLOC(vlen_vl_buf, vlen_bufsize->vl_tbuf, size)) != NULL)
+        vlen_bufsize->size += size;
+
+    /* Set return value */
+    ret_value = vlen_bufsize->vl_tbuf;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__vlen_get_buf_size_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__vlen_get_buf_size
+ *
+ * Purpose:	This routine checks the number of bytes required to store a single
+ *      element from a dataset in memory, creating a selection with just the
+ *      single element selected to read in the element and using a custom memory
+ *      allocator for any VL data encountered.
+ *          The *size value is modified according to how many bytes are
+ *      required to store the element in memory.
+ *
+ * Implementation: This routine actually performs the read with a custom
+ *      memory manager which basically just counts the bytes requested and
+ *      uses a temporary memory buffer (through the H5FL API) to make certain
+ *      enough space is available to perform the read.  Then the temporary
+ *      buffer is released and the number of bytes allocated is returned.
+ *      Kinda kludgy, but easier than the other method of trying to figure out
+ *      the sizes without actually reading the data in... - QAK
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 17, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+herr_t
+H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id, unsigned H5_ATTR_UNUSED ndim, const hsize_t *point, void *op_data)
+{
+    H5D_vlen_bufsize_t *vlen_bufsize = (H5D_vlen_bufsize_t *)op_data;
+    H5T_t *dt;                          /* Datatype for operation */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(op_data);
+    HDassert(H5I_DATATYPE == H5I_get_type(type_id));
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object(type_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Make certain there is enough fixed-length buffer available */
+    if(NULL == (vlen_bufsize->fl_tbuf = H5FL_BLK_REALLOC(vlen_fl_buf, vlen_bufsize->fl_tbuf, H5T_get_size(dt))))
+        HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't resize tbuf")
+
+    /* Select point to read in */
+    if(H5S_select_elements(vlen_bufsize->fspace, H5S_SELECT_SET, (size_t)1, point) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't select point")
+
+    /* Read in the point (with the custom VL memory allocator) */
+    if(H5D__read(vlen_bufsize->dset, type_id, vlen_bufsize->mspace, vlen_bufsize->fspace, vlen_bufsize->xfer_pid, vlen_bufsize->fl_tbuf) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read point")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__vlen_get_buf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__check_filters
+ *
+ * Purpose:	Check if the filters have be initialized for the dataset
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, October 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__check_filters(H5D_t *dataset)
+{
+    H5O_fill_t *fill;                   /* Dataset's fill value */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dataset);
+
+    /* Check if the filters in the DCPL will need to encode, and if so, can they?
+     *
+     * Filters need encoding if fill value is defined and a fill policy is set
+     * that requires writing on an extend.
+     */
+    fill = &dataset->shared->dcpl_cache.fill;
+    if(!dataset->shared->checked_filters) {
+        H5D_fill_value_t fill_status;       /* Whether the fill value is defined */
+
+        /* Retrieve the "defined" status of the fill value */
+        if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Couldn't retrieve fill value from dataset.")
+
+        /* See if we can check the filter status */
+        if(fill_status == H5D_FILL_VALUE_DEFAULT || fill_status == H5D_FILL_VALUE_USER_DEFINED) {
+            if(fill->fill_time == H5D_FILL_TIME_ALLOC ||
+                    (fill->fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_USER_DEFINED)) {
+                /* Filters must have encoding enabled. Ensure that all filters can be applied */
+                if(H5Z_can_apply(dataset->shared->dcpl_id, dataset->shared->type_id) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "can't apply filters")
+
+                dataset->shared->checked_filters = TRUE;
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__check_filters() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__set_extent
+ *
+ * Purpose:	Based on H5D_extend, allows change to a lower dimension,
+ *		calls H5S_set_extent and H5D__chunk_prune_by_extent instead
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:  Pedro Vicente, pvn at ncsa.uiuc.edu
+ *              April 9, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
+{
+    H5S_t   *space;                     /* Dataset's dataspace */
+    int     rank;                       /* Dataspace # of dimensions */
+    hsize_t curr_dims[H5O_LAYOUT_NDIMS];/* Current dimension sizes */
+    htri_t  changed;                    /* Whether the dataspace changed size */
+    herr_t  ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset);
+    HDassert(size);
+
+    /* Check if we are allowed to modify this file */
+    if(0 == (H5F_INTENT(dset->oloc.file) & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Check if we are allowed to modify the space; only datasets with chunked and external storage are allowed to be modified */
+    if(H5D_COMPACT == dset->shared->layout.type)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataset has compact storage")
+    if(H5D_CONTIGUOUS == dset->shared->layout.type && 0 == dset->shared->dcpl_cache.efl.nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "dataset has contiguous storage")
+
+    /* Check if the filters in the DCPL will need to encode, and if so, can they? */
+    if(H5D__check_filters(dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't apply filters")
+
+    /* Get the dataspace */
+    space = dset->shared->space;
+
+    /* Check if we are shrinking or expanding any of the dimensions */
+    if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+
+    /* Modify the size of the dataspace */
+    if((changed = H5S_set_extent(space, size)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of dataspace")
+
+    /* Don't bother updating things, unless they've changed */
+    if(changed) {
+        hbool_t shrink = FALSE;             /* Flag to indicate a dimension has shrank */
+        hbool_t expand = FALSE;             /* Flag to indicate a dimension has grown */
+        unsigned u;                         /* Local index variable */
+
+        /* Determine if we are shrinking and/or expanding any dimensions */
+        for(u = 0; u < (unsigned)rank; u++) {
+            if(size[u] < curr_dims[u])
+                shrink = TRUE;
+            if(size[u] > curr_dims[u])
+                expand = TRUE;
+        } /* end for */
+
+        /*-------------------------------------------------------------------------
+         * Modify the dataset storage
+         *-------------------------------------------------------------------------
+         */
+        /* Update the index values for the cached chunks for this dataset */
+        if(H5D_CHUNKED == dset->shared->layout.type) {
+            /* Update the cached chunk info */
+            if(H5D__chunk_set_info(dset) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to update # of chunks")
+            if(H5D__chunk_update_cache(dset, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+        } /* end if */
+
+        /* Allocate space for the new parts of the dataset, if appropriate */
+        if(expand && dset->shared->dcpl_cache.fill.alloc_time == H5D_ALLOC_TIME_EARLY)
+            if(H5D__alloc_storage(dset, dxpl_id, H5D_ALLOC_EXTEND, FALSE, curr_dims) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to extend dataset storage")
+
+        /*-------------------------------------------------------------------------
+         * Remove chunk information in the case of chunked datasets
+         * This removal takes place only in case we are shrinking the dateset
+         * and if the chunks are written
+         *-------------------------------------------------------------------------
+         */
+        if(shrink && H5D_CHUNKED == dset->shared->layout.type &&
+                (*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
+            /* Remove excess chunks */
+            if(H5D__chunk_prune_by_extent(dset, dxpl_id, curr_dims) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to remove chunks")
+
+        /* Mark the dataspace as dirty, for later writing to the file */
+        if(H5D__mark(dset, dxpl_id, H5D_MARK_SPACE) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to mark dataspace as dirty")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__set_extent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__flush_sieve_buf
+ *
+ * Purpose:     Flush any dataset sieve buffer info cached in memory
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__flush_sieve_buf(H5D_t *dataset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dataset);
+
+    /* Flush the raw data buffer, if we have a dirty one */
+    if(dataset->shared->cache.contig.sieve_buf && dataset->shared->cache.contig.sieve_dirty) {
+        HDassert(dataset->shared->layout.type != H5D_COMPACT);      /* We should never have a sieve buffer for compact storage */
+
+        /* Write dirty data sieve buffer to file */
+        if(H5F_block_write(dataset->oloc.file, H5FD_MEM_DRAW, dataset->shared->cache.contig.sieve_loc,
+                dataset->shared->cache.contig.sieve_size, dxpl_id, dataset->shared->cache.contig.sieve_buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed")
+
+        /* Reset sieve buffer dirty flag */
+        dataset->shared->cache.contig.sieve_dirty = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__flush_sieve_buf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__flush_real
+ *
+ * Purpose:     Flush any dataset information cached in memory
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              December 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__flush_real(H5D_t *dataset, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to dataset's object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dataset);
+
+    /* Check for metadata changes that will require updating the object's modification time */
+    if(dataset->shared->layout_dirty || dataset->shared->space_dirty) {
+        unsigned update_flags = H5O_UPDATE_TIME;        /* Modification time flag */
+
+        /* Pin the object header */
+        if(NULL == (oh = H5O_pin(&dataset->oloc, dxpl_id)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+
+        /* Update the layout on disk, if it's been changed */
+        if(dataset->shared->layout_dirty) {
+            if(H5D__layout_oh_write(dataset, dxpl_id, oh, update_flags) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout/pline/efl info")
+            dataset->shared->layout_dirty = FALSE;
+
+            /* Reset the "update the modification time" flag, so we only do it once */
+            update_flags = 0;
+        } /* end if */
+
+        /* Update the dataspace on disk, if it's been changed */
+        if(dataset->shared->space_dirty) {
+            if(H5S_write(dataset->oloc.file, dxpl_id, oh, update_flags, dataset->shared->space) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update file with new dataspace")
+            dataset->shared->space_dirty = FALSE;
+
+            /* Reset the "update the modification time" flag, so we only do it once */
+            update_flags = 0;
+        } /* end if */
+
+        /* _Somebody_ should have update the modification time! */
+        HDassert(update_flags == 0);
+    } /* end if */
+
+    /* Flush cached raw data for each kind of dataset layout */
+    if(dataset->shared->layout.ops->flush &&
+            (dataset->shared->layout.ops->flush)(dataset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush raw data")
+
+done:
+    /* Release pointer to object header */
+    if(oh != NULL)
+        if(H5O_unpin(oh) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__flush_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mark
+ *
+ * Purpose:     Mark some aspect of a dataset as dirty
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              July 4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__mark(const H5D_t *dataset, hid_t H5_ATTR_UNUSED dxpl_id, unsigned flags)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check args */
+    HDassert(dataset);
+    HDassert(!(flags & (unsigned)~(H5D_MARK_SPACE | H5D_MARK_LAYOUT)));
+
+    /* Mark aspects of the dataset as dirty */
+    if(flags & H5D_MARK_SPACE)
+        dataset->shared->space_dirty = TRUE;
+    if(flags & H5D_MARK_LAYOUT)
+        dataset->shared->layout_dirty = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__mark() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__flush_cb
+ *
+ * Purpose:     Flush any dataset information cached in memory
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              November 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__flush_cb(void *_dataset, hid_t H5_ATTR_UNUSED id, void *_udata)
+{
+    H5D_t       *dataset = (H5D_t *)_dataset;   /* Dataset pointer */
+    H5D_flush_ud_t *udata = (H5D_flush_ud_t *)_udata;   /* User data for callback */
+    int         ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(dataset);
+
+    /* Check for dataset in same file */
+    if(udata->f == dataset->oloc.file) {
+        /* Flush the dataset's information */
+        if(H5D__flush_real(dataset, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, H5_ITER_ERROR, "unable to flush cached dataset info")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__flush_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_flush
+ *
+ * Purpose:     Flush any dataset information cached in memory
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Ray Lu
+ *              August 14, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_flush(const H5F_t *f, hid_t dxpl_id)
+{
+    H5D_flush_ud_t udata;               /* User data for callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+
+    /* Set user data for callback */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+
+    /* Iterate over all the open datasets */
+    if(H5I_iterate(H5I_DATASET, H5D__flush_cb, &udata, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to flush cached dataset info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_get_create_plist
+ *
+ * Purpose:	Private function for H5Dget_create_plist
+ *
+ * Return:	Success:	ID for a copy of the dataset creation
+ *				property list.  The template should be
+ *				released by calling H5P_close().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, February  3, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5D_get_create_plist(H5D_t *dset)
+{
+    H5P_genplist_t      *dcpl_plist;            /* Dataset's DCPL */
+    H5P_genplist_t      *new_plist;             /* Copy of dataset's DCPL */
+    H5O_fill_t          copied_fill;            /* Fill value to tweak */
+    hid_t		new_dcpl_id = FAIL;
+    hid_t		ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    if(NULL == (dcpl_plist = (H5P_genplist_t *)H5I_object(dset->shared->dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Copy the creation property list */
+    if((new_dcpl_id = H5P_copy_plist(dcpl_plist, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to copy the creation property list")
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Retrieve any object creation properties */
+    if(H5O_get_create_plist(&dset->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object creation info")
+
+    /* Get the fill value property */
+    if(H5P_get(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+    /* Check if there is a fill value, but no type yet */
+    if(copied_fill.buf != NULL && copied_fill.type == NULL) {
+        H5T_path_t *tpath;      /* Conversion information*/
+
+        /* Copy the dataset type into the fill value message */
+        if(NULL == (copied_fill.type = H5T_copy(dset->shared->type, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to copy dataset datatype for fill value")
+
+        /* Set up type conversion function */
+        if(NULL == (tpath = H5T_path_find(dset->shared->type, copied_fill.type, NULL, NULL, H5AC_ind_dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types")
+
+        /* Convert disk form of fill value into memory form */
+        if(!H5T_path_noop(tpath)) {
+            hid_t dst_id, src_id;       /* Source & destination datatypes for type conversion */
+            uint8_t *bkg_buf = NULL;    /* Background conversion buffer */
+            size_t bkg_size;            /* Size of background buffer */
+
+            /* Wrap copies of types to convert */
+            dst_id = H5I_register(H5I_DATATYPE, H5T_copy(copied_fill.type, H5T_COPY_TRANSIENT), FALSE);
+            if(dst_id < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
+            src_id = H5I_register(H5I_DATATYPE, H5T_copy(dset->shared->type, H5T_COPY_ALL), FALSE);
+            if(src_id < 0) {
+                H5I_dec_ref(dst_id);
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
+            } /* end if */
+
+            /* Allocate a background buffer */
+            bkg_size = MAX(H5T_GET_SIZE(copied_fill.type), H5T_GET_SIZE(dset->shared->type));
+            if(H5T_path_bkg(tpath) && NULL == (bkg_buf = H5FL_BLK_CALLOC(type_conv, bkg_size))) {
+                H5I_dec_ref(src_id);
+                H5I_dec_ref(dst_id);
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            } /* end if */
+
+            /* Convert fill value */
+            if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, copied_fill.buf, bkg_buf, H5AC_ind_dxpl_id) < 0) {
+                H5I_dec_ref(src_id);
+                H5I_dec_ref(dst_id);
+                if(bkg_buf)
+                    bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "datatype conversion failed")
+            } /* end if */
+
+            /* Release local resources */
+            if(H5I_dec_ref(src_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to close temporary object")
+            if(H5I_dec_ref(dst_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to close temporary object")
+            if(bkg_buf)
+                bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+        } /* end if */
+    } /* end if */
+
+    /* Set back the fill value property to property list */
+    if(H5P_set(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set property list fill value")
+
+    /* Set the return value */
+    ret_value = new_dcpl_id;
+
+done:
+    if(ret_value < 0)
+        if(new_dcpl_id > 0)
+            if(H5I_dec_app_ref(new_dcpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to close temporary object")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_get_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_get_access_plist
+ *
+ * Purpose:	Returns a copy of the dataset access property list.
+ *
+ * Return:	Success:	ID for a copy of the dataset access
+ *				property list. 
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		March, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5D_get_access_plist(H5D_t *dset)
+{
+    H5P_genplist_t      *old_plist;     /* Default DAPL */
+    H5P_genplist_t      *new_plist;     /* New DAPL */
+    hid_t               new_dapl_id = FAIL;
+    hid_t               ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Make a copy of the default dataset access property list */
+    if (NULL == (old_plist = (H5P_genplist_t *)H5I_object(H5P_LST_DATASET_ACCESS_ID_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if ((new_dapl_id = H5P_copy_plist(old_plist, TRUE)) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "can't copy dataset access property list")
+    if (NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_dapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* If the dataset is chunked then copy the rdcc parameters */
+    if (dset->shared->layout.type == H5D_CHUNKED) {
+        if (H5P_set(new_plist, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, &(dset->shared->cache.chunk.nslots)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache number of slots")
+        if (H5P_set(new_plist, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, &(dset->shared->cache.chunk.nbytes_max)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache byte size")
+        if (H5P_set(new_plist, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, &(dset->shared->cache.chunk.w0)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set preempt read chunks")
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = new_dapl_id;
+
+done:
+    if(ret_value < 0) {
+        if(new_dapl_id > 0)
+            if(H5I_dec_app_ref(new_dapl_id) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "can't free")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_get_access_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_get_space
+ *
+ * Purpose:	Returns and ID for the dataspace of the dataset.
+ *
+ * Return:	Success:	ID for dataspace
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		March, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5D_get_space(H5D_t *dset)
+{
+    H5S_t	*space = NULL;
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Read the data space message and return a data space object */
+    if(NULL == (space = H5S_copy(dset->shared->space, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get data space")
+
+    /* Create an atom */
+    if((ret_value = H5I_register(H5I_DATASPACE, space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace")
+
+done:
+    if(ret_value < 0)
+        if(space != NULL)
+            if(H5S_close(space) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_get_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_get_type
+ *
+ * Purpose:	Returns and ID for the datatype of the dataset.
+ *
+ * Return:	Success:	ID for datatype
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		March, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5D_get_type(H5D_t *dset)
+{
+    H5T_t	*dt = NULL;
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Patch the datatype's "top level" file pointer */
+    if(H5T_patch_file(dset->shared->type, dset->oloc.file) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to patch datatype's file pointer")
+
+    /* Copy the dataset's datatype */
+    if(NULL == (dt = H5T_copy(dset->shared->type, H5T_COPY_REOPEN)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to copy datatype")
+
+    /* Mark any datatypes as being in memory now */
+    if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
+
+    /* Lock copied type */
+    if(H5T_lock(dt, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to lock transient datatype")
+
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    if(ret_value < 0) {
+        if(dt && H5T_close(dt) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_get_type() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dio.c b/gatb-core/thirdparty/hdf5/src/H5Dio.c
new file mode 100644
index 0000000..58031e8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dio.c
@@ -0,0 +1,1240 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Sprivate.h"		/* Dataspace			  	*/
+
+#ifdef H5_HAVE_PARALLEL
+/* Remove this if H5R_DATASET_REGION is no longer used in this file */
+#include "H5Rpublic.h"
+#endif /*H5_HAVE_PARALLEL*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Internal I/O routines */
+static herr_t H5D__write(H5D_t *dataset, hid_t mem_type_id,
+    const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
+    const void *buf);
+static herr_t H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id, 
+    const H5S_t *mem_space, const H5S_t *file_space, hid_t dxpl_id, const void *buf);
+
+/* Setup/teardown routines */
+static herr_t H5D__ioinfo_init(H5D_t *dset,
+#ifndef H5_HAVE_PARALLEL
+const
+#endif /* H5_HAVE_PARALLEL */
+    H5D_dxpl_cache_t *dxpl_cache,
+    hid_t dxpl_id, const H5D_type_info_t *type_info, H5D_storage_t *store,
+    H5D_io_info_t *io_info);
+static herr_t H5D__typeinfo_init(const H5D_t *dset, const H5D_dxpl_cache_t *dxpl_cache,
+    hid_t dxpl_id, hid_t mem_type_id, hbool_t do_write,
+    H5D_type_info_t *type_info);
+#ifdef H5_HAVE_PARALLEL
+static herr_t H5D__ioinfo_adjust(H5D_io_info_t *io_info, const H5D_t *dset,
+    hid_t dxpl_id, const H5S_t *file_space, const H5S_t *mem_space,
+    const H5D_type_info_t *type_info, const H5D_chunk_map_t *fm);
+static herr_t H5D__ioinfo_term(H5D_io_info_t *io_info);
+#endif /* H5_HAVE_PARALLEL */
+static herr_t H5D__typeinfo_term(const H5D_type_info_t *type_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage blocks of type conversion data */
+H5FL_BLK_DEFINE(type_conv);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dread
+ *
+ * Purpose:	Reads (part of) a DSET from the file into application
+ *		memory BUF. The part of the dataset to read is defined with
+ *		MEM_SPACE_ID and FILE_SPACE_ID.	 The data points are
+ *		converted from their file type to the MEM_TYPE_ID specified.
+ *		Additional miscellaneous data transfer properties can be
+ *		passed to this function with the PLIST_ID argument.
+ *
+ *		The FILE_SPACE_ID can be the constant H5S_ALL which indicates
+ *		that the entire file data space is to be referenced.
+ *
+ *		The MEM_SPACE_ID can be the constant H5S_ALL in which case
+ *		the memory data space is the same as the file data space
+ *		defined when the dataset was created.
+ *
+ *		The number of elements in the memory data space must match
+ *		the number of elements in the file data space.
+ *
+ *		The PLIST_ID can be the constant H5P_DEFAULT in which
+ *		case the default data transfer properties are used.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
+	hid_t file_space_id, hid_t plist_id, void *buf/*out*/)
+{
+    H5D_t		   *dset = NULL;
+    const H5S_t		   *mem_space = NULL;
+    const H5S_t		   *file_space = NULL;
+    herr_t                  ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iiiiix", dset_id, mem_type_id, mem_space_id, file_space_id,
+             plist_id, buf);
+
+    /* check arguments */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(NULL == dset->oloc.file)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if(mem_space_id < 0 || file_space_id < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+    if(H5S_ALL != mem_space_id) {
+	if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+	/* Check for valid selection */
+	if(H5S_SELECT_VALID(mem_space) != TRUE)
+	    HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "selection+offset not within extent")
+    } /* end if */
+    if(H5S_ALL != file_space_id) {
+	if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+	/* Check for valid selection */
+	if(H5S_SELECT_VALID(file_space) != TRUE)
+	    HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "selection+offset not within extent")
+    } /* end if */
+
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if (H5P_DEFAULT == plist_id)
+        plist_id= H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(plist_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
+
+    /* read raw data */
+    if(H5D__read(dset, mem_type_id, mem_space, file_space, plist_id, buf/*out*/) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dread() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Dwrite
+ *
+ * Purpose:	Writes (part of) a DSET from application memory BUF to the
+ *		file.  The part of the dataset to write is defined with the
+ *		MEM_SPACE_ID and FILE_SPACE_ID arguments. The data points
+ *		are converted from their current type (MEM_TYPE_ID) to their
+ *		file datatype.	 Additional miscellaneous data transfer
+ *		properties can be passed to this function with the
+ *		PLIST_ID argument.
+ *
+ *		The FILE_SPACE_ID can be the constant H5S_ALL which indicates
+ *		that the entire file data space is to be referenced.
+ *
+ *		The MEM_SPACE_ID can be the constant H5S_ALL in which case
+ *		the memory data space is the same as the file data space
+ *		defined when the dataset was created.
+ *
+ *		The number of elements in the memory data space must match
+ *		the number of elements in the file data space.
+ *
+ *		The PLIST_ID can be the constant H5P_DEFAULT in which
+ *		case the default data transfer properties are used.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
+	 hid_t file_space_id, hid_t dxpl_id, const void *buf)
+{
+    H5D_t		   *dset = NULL;
+    H5P_genplist_t 	   *plist;      /* Property list pointer */
+    const H5S_t            *mem_space = NULL;
+    const H5S_t            *file_space = NULL;
+    hbool_t                 direct_write = FALSE;
+    herr_t                  ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iiiii*x", dset_id, mem_type_id, mem_space_id, file_space_id,
+             dxpl_id, buf);
+
+    /* check arguments */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(NULL == dset->oloc.file)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id= H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
+
+    /* Get the dataset transfer property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Retrieve the 'direct write' flag */
+    if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &direct_write) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting flag for direct chunk write")
+
+    /* Check dataspace selections if this is not a direct write */
+    if(!direct_write) {
+        if(mem_space_id < 0 || file_space_id < 0)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+	if(H5S_ALL != mem_space_id) {
+	    if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
+	        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+	    /* Check for valid selection */
+	    if(H5S_SELECT_VALID(mem_space) != TRUE)
+		HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "memory selection+offset not within extent")
+	} /* end if */
+	if(H5S_ALL != file_space_id) {
+	    if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
+		HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+	    /* Check for valid selection */
+	    if(H5S_SELECT_VALID(file_space) != TRUE)
+		HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "file selection+offset not within extent")
+	} /* end if */
+    }
+
+    if(H5D__pre_write(dset, direct_write, mem_type_id, mem_space, file_space, dxpl_id, buf) < 0) 
+	HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't prepare for writing data")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Dwrite() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__pre_write
+ *
+ * Purpose:	Preparation for writing data.  
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		2 November 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id, 
+         const H5S_t *mem_space, const H5S_t *file_space, 
+         hid_t dxpl_id, const void *buf)
+{
+    herr_t                  ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Direct chunk write */
+    if(direct_write) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        uint32_t direct_filters;
+        hsize_t *direct_offset;
+        uint32_t direct_datasize;
+	int      ndims = 0;
+	hsize_t  dims[H5O_LAYOUT_NDIMS];
+	hsize_t  internal_offset[H5O_LAYOUT_NDIMS];
+	unsigned u;
+
+        /* Get the dataset transfer property list */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+        if(H5D_CHUNKED != dset->shared->layout.type)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
+
+        /* Retrieve parameters for direct chunk write */
+        if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &direct_filters) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting filter info for direct chunk write")
+        if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &direct_offset) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting offset info for direct chunk write")
+        if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &direct_datasize) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data size for direct chunk write")
+
+	/* The library's chunking code requires the offset terminates with a zero. So transfer the 
+         * offset array to an internal offset array */ 
+	if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dims, NULL)) < 0)
+	    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve dataspace extent dims")
+
+	for(u = 0; u < ndims; u++) {
+	    /* Make sure the offset doesn't exceed the dataset's dimensions */
+            if(direct_offset[u] > dims[u])
+		HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
+
+            /* Make sure the offset fall right on a chunk's boundary */
+	    if(direct_offset[u] % dset->shared->layout.u.chunk.dim[u])
+		HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset doesn't fall on chunks's boundary")
+
+	    internal_offset[u] = direct_offset[u]; 
+	} /* end for */
+	   
+	/* Terminate the offset with a zero */ 
+	internal_offset[ndims] = 0;
+
+	/* write raw data */
+	if(H5D__chunk_direct_write(dset, dxpl_id, direct_filters, internal_offset, direct_datasize, buf) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write chunk directly")
+    } /* end if */
+    else {     /* Normal write */
+        /* write raw data */
+        if(H5D__write(dset, mem_type_id, mem_space, file_space, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__pre_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__read
+ *
+ * Purpose:	Reads (part of) a DATASET into application memory BUF. See
+ *		H5Dread() for complete details.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
+	 const H5S_t *file_space, hid_t dxpl_id, void *buf/*out*/)
+{
+    H5D_chunk_map_t fm;                 /* Chunk file<->memory mapping */
+    H5D_io_info_t io_info;              /* Dataset I/O info     */
+    H5D_type_info_t type_info;          /* Datatype info for operation */
+    hbool_t type_info_init = FALSE;     /* Whether the datatype info has been initialized */
+    H5S_t * projected_mem_space = NULL; /* If not NULL, ptr to dataspace containing a     */
+                                        /* projection of the supplied mem_space to a new  */
+                                        /* data space with rank equal to that of          */
+                                        /* file_space.                                    */
+                                        /*                                                */
+                                        /* This field is only used if                     */
+                                        /* H5S_select_shape_same() returns TRUE when      */
+                                        /* comparing the mem_space and the data_space,    */
+                                        /* and the mem_space have different rank.         */
+                                        /*                                                */
+                                        /* Note that if this variable is used, the        */
+                                        /* projected mem space must be discarded at the   */
+                                        /* end of the function to avoid a memory leak.    */
+    H5D_storage_t store;                /*union of EFL and chunk pointer in file space */
+    hssize_t	snelmts;                /*total number of elmts	(signed) */
+    hsize_t	nelmts;                 /*total number of elmts	*/
+#ifdef H5_HAVE_PARALLEL
+    hbool_t     io_info_init = FALSE;   /* Whether the I/O info has been initialized */
+#endif /*H5_HAVE_PARALLEL*/
+    hbool_t     io_op_init = FALSE;     /* Whether the I/O op has been initialized */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    char        fake_char;              /* Temporary variable for NULL buffer pointers */
+    herr_t	ret_value = SUCCEED;	/* Return value	*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(dataset && dataset->oloc.file);
+
+    if(!file_space)
+        file_space = dataset->shared->space;
+    if(!mem_space)
+        mem_space = file_space;
+    if((snelmts = H5S_GET_SELECT_NPOINTS(mem_space)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dst dataspace has invalid selection")
+    H5_CHECKED_ASSIGN(nelmts, hsize_t, snelmts, hssize_t);
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Patch the top level file pointer for dt->shared->u.vlen.f if needed */
+    H5T_patch_vlen_file(dataset->shared->type, dataset->oloc.file);
+
+    /* Set up datatype info for operation */
+    if(H5D__typeinfo_init(dataset, dxpl_cache, dxpl_id, mem_type_id, FALSE, &type_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up type info")
+    type_info_init = TRUE;
+
+#ifdef H5_HAVE_PARALLEL
+    /* Collective access is not permissible without a MPI based VFD */
+    if(dxpl_cache->xfer_mode == H5FD_MPIO_COLLECTIVE && 
+       !(H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI)))
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "collective access for MPI-based drivers only")
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Make certain that the number of elements in each selection is the same */
+    if(nelmts != (hsize_t)H5S_GET_SELECT_NPOINTS(file_space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest data spaces have different sizes")
+
+    /* Check for a NULL buffer, after the H5S_ALL dataspace selection has been handled */
+    if(NULL == buf) {
+        /* Check for any elements selected (which is invalid) */
+        if(nelmts > 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer")
+
+	/* If the buffer is nil, and 0 element is selected, make a fake buffer.
+	 * This is for some MPI package like ChaMPIon on NCSA's tungsten which
+	 * doesn't support this feature.
+	 */
+        buf = &fake_char;
+    } /* end if */
+
+    /* Make sure that both selections have their extents set */
+    if(!(H5S_has_extent(file_space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file dataspace does not have extent set")
+    if(!(H5S_has_extent(mem_space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "memory dataspace does not have extent set")
+
+    /* H5S_select_shape_same() has been modified to accept topologically identical
+     * selections with different rank as having the same shape (if the most 
+     * rapidly changing coordinates match up), but the I/O code still has 
+     * difficulties with the notion.
+     *
+     * To solve this, we check to see if H5S_select_shape_same() returns true, 
+     * and if the ranks of the mem and file spaces are different.  If the are, 
+     * construct a new mem space that is equivalent to the old mem space, and 
+     * use that instead.
+     *
+     * Note that in general, this requires us to touch up the memory buffer as 
+     * well.
+     */
+    if(TRUE == H5S_select_shape_same(mem_space, file_space) &&
+            H5S_GET_EXTENT_NDIMS(mem_space) != H5S_GET_EXTENT_NDIMS(file_space)) {
+        void *adj_buf = NULL;   /* Pointer to the location in buf corresponding  */
+                                /* to the beginning of the projected mem space.  */
+
+        /* Attempt to construct projected dataspace for memory dataspace */
+        if(H5S_select_construct_projection(mem_space, &projected_mem_space,
+                (unsigned)H5S_GET_EXTENT_NDIMS(file_space), buf, (const void **)&adj_buf, type_info.dst_type_size) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to construct projected memory dataspace")
+        HDassert(projected_mem_space);
+        HDassert(adj_buf);
+
+        /* Switch to using projected memory dataspace & adjusted buffer */
+        mem_space = projected_mem_space;
+        buf = adj_buf;
+    } /* end if */
+
+
+    /* Retrieve dataset properties */
+    /* <none needed in the general case> */
+
+    /* If space hasn't been allocated and not using external storage,
+     * return fill value to buffer if fill time is upon allocation, or
+     * do nothing if fill time is never.  If the dataset is compact and
+     * fill time is NEVER, there is no way to tell whether part of data
+     * has been overwritten.  So just proceed in reading.
+     */
+    if(nelmts > 0 && dataset->shared->dcpl_cache.efl.nused == 0 &&
+            !(*dataset->shared->layout.ops->is_space_alloc)(&dataset->shared->layout.storage)) {
+        H5D_fill_value_t fill_status;   /* Whether/How the fill value is defined */
+
+        /* Retrieve dataset's fill-value properties */
+        if(H5P_is_fill_value_defined(&dataset->shared->dcpl_cache.fill, &fill_status) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+        /* Should be impossible, but check anyway... */
+        if(fill_status == H5D_FILL_VALUE_UNDEFINED &&
+                (dataset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_ALLOC || dataset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_IFSET))
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "read failed: dataset doesn't exist, no data can be read")
+
+        /* If we're never going to fill this dataset, just leave the junk in the user's buffer */
+        if(dataset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_NEVER)
+            HGOTO_DONE(SUCCEED)
+
+        /* Go fill the user's selection with the dataset's fill value */
+        if(H5D__fill(dataset->shared->dcpl_cache.fill.buf, dataset->shared->type, buf, type_info.mem_type, mem_space, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "filling buf failed")
+        else
+            HGOTO_DONE(SUCCEED)
+    } /* end if */
+
+    /* Set up I/O operation */
+    io_info.op_type = H5D_IO_OP_READ;
+    io_info.u.rbuf = buf;
+    if(H5D__ioinfo_init(dataset, dxpl_cache, dxpl_id, &type_info, &store, &io_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to set up I/O operation")
+#ifdef H5_HAVE_PARALLEL
+    io_info_init = TRUE;
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Sanity check that space is allocated, if there are elements */
+    if(nelmts > 0)
+        HDassert((*dataset->shared->layout.ops->is_space_alloc)(&dataset->shared->layout.storage)
+                || dataset->shared->dcpl_cache.efl.nused > 0
+                || dataset->shared->layout.type == H5D_COMPACT);
+
+    /* Call storage method's I/O initialization routine */
+    HDmemset(&fm, 0, sizeof(H5D_chunk_map_t));
+    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize I/O info")
+    io_op_init = TRUE;
+
+#ifdef H5_HAVE_PARALLEL
+    /* Adjust I/O info for any parallel I/O */
+    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to adjust I/O info for parallel I/O")
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Invoke correct "high level" I/O routine */
+    if((*io_info.io_ops.multi_read)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
+
+done:
+    /* Shut down the I/O op information */
+    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(&fm) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down I/O op info")
+#ifdef H5_HAVE_PARALLEL
+    /* Shut down io_info struct */
+    if(io_info_init)
+        if(H5D__ioinfo_term(&io_info) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "can't shut down io_info")
+#endif /*H5_HAVE_PARALLEL*/
+    /* Shut down datatype info for operation */
+    if(type_info_init && H5D__typeinfo_term(&type_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down type info")
+
+    /* discard projected mem space if it was created */
+    if(NULL != projected_mem_space)
+        if(H5S_close(projected_mem_space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down projected memory dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__write
+ *
+ * Purpose:	Writes (part of) a DATASET to a file from application memory
+ *		BUF. See H5Dwrite() for complete details.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
+	  const H5S_t *file_space, hid_t dxpl_id, const void *buf)
+{
+    H5D_chunk_map_t fm;                 /* Chunk file<->memory mapping */
+    H5D_io_info_t io_info;              /* Dataset I/O info     */
+    H5D_type_info_t type_info;          /* Datatype info for operation */
+    hbool_t type_info_init = FALSE;     /* Whether the datatype info has been initialized */
+    H5S_t * projected_mem_space = NULL; /* If not NULL, ptr to dataspace containing a     */
+                                        /* projection of the supplied mem_space to a new  */
+                                        /* data space with rank equal to that of          */
+                                        /* file_space.                                    */
+                                        /*                                                */
+                                        /* This field is only used if                     */
+                                        /* H5S_select_shape_same() returns TRUE when      */
+                                        /* comparing the mem_space and the data_space,    */
+                                        /* and the mem_space have different rank.         */
+                                        /*                                                */
+                                        /* Note that if this variable is used, the        */
+                                        /* projected mem space must be discarded at the   */
+                                        /* end of the function to avoid a memory leak.    */
+    H5D_storage_t store;                /*union of EFL and chunk pointer in file space */
+    hssize_t	snelmts;                /*total number of elmts	(signed) */
+    hsize_t	nelmts;                 /*total number of elmts	*/
+#ifdef H5_HAVE_PARALLEL
+    hbool_t     io_info_init = FALSE;   /* Whether the I/O info has been initialized */
+#endif /*H5_HAVE_PARALLEL*/
+    hbool_t     io_op_init = FALSE;     /* Whether the I/O op has been initialized */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    char        fake_char;              /* Temporary variable for NULL buffer pointers */
+    herr_t	ret_value = SUCCEED;	/* Return value	*/
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(dataset && dataset->oloc.file);
+
+    /* All filters in the DCPL must have encoding enabled. */
+    if(!dataset->shared->checked_filters) {
+        if(H5Z_can_apply(dataset->shared->dcpl_id, dataset->shared->type_id) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "can't apply filters")
+
+        dataset->shared->checked_filters = TRUE;
+    } /* end if */
+
+    /* Check if we are allowed to write to this file */
+    if(0 == (H5F_INTENT(dataset->oloc.file) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Patch the top level file pointer for dt->shared->u.vlen.f if needed */
+    H5T_patch_vlen_file(dataset->shared->type, dataset->oloc.file);
+
+    /* Set up datatype info for operation */
+    if(H5D__typeinfo_init(dataset, dxpl_cache, dxpl_id, mem_type_id, TRUE, &type_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up type info")
+    type_info_init = TRUE;
+
+    /* Various MPI based checks */
+#ifdef H5_HAVE_PARALLEL
+    if(H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI)) {
+        /* If MPI based VFD is used, no VL datatype support yet. */
+        /* This is because they use the global heap in the file and we don't */
+        /* support parallel access of that yet */
+        if(H5T_detect_class(type_info.mem_type, H5T_VLEN, FALSE) > 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Parallel IO does not support writing VL datatypes yet")
+
+        /* If MPI based VFD is used, no VL datatype support yet. */
+        /* This is because they use the global heap in the file and we don't */
+        /* support parallel access of that yet */
+        /* We should really use H5T_detect_class() here, but it will be difficult
+         * to detect the type of the reference if it is nested... -QAK
+         */
+        if(H5T_get_class(type_info.mem_type, TRUE) == H5T_REFERENCE &&
+                H5T_get_ref_type(type_info.mem_type) == H5R_DATASET_REGION)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Parallel IO does not support writing region reference datatypes yet")
+
+        /* Can't write to chunked datasets with filters, in parallel */
+        if(dataset->shared->layout.type == H5D_CHUNKED &&
+                dataset->shared->dcpl_cache.pline.nused > 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot write to chunked storage with filters in parallel")
+    } /* end if */
+    else {
+        /* Collective access is not permissible without a MPI based VFD */
+        if(dxpl_cache->xfer_mode == H5FD_MPIO_COLLECTIVE)
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "collective access for MPI-based driver only")
+    } /* end else */
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Initialize dataspace information */
+    if(!file_space)
+        file_space = dataset->shared->space;
+    if(!mem_space)
+        mem_space = file_space;
+
+    if((snelmts = H5S_GET_SELECT_NPOINTS(mem_space)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src dataspace has invalid selection")
+    H5_CHECKED_ASSIGN(nelmts, hsize_t, snelmts, hssize_t);
+
+    /* Make certain that the number of elements in each selection is the same */
+    if(nelmts != (hsize_t)H5S_GET_SELECT_NPOINTS(file_space))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest data spaces have different sizes")
+
+    /* Check for a NULL buffer, after the H5S_ALL dataspace selection has been handled */
+    if(NULL == buf) {
+        /* Check for any elements selected (which is invalid) */
+        if(nelmts > 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer")
+
+	/* If the buffer is nil, and 0 element is selected, make a fake buffer.
+	 * This is for some MPI package like ChaMPIon on NCSA's tungsten which
+	 * doesn't support this feature.
+	 */
+        buf = &fake_char;
+    } /* end if */
+
+    /* Make sure that both selections have their extents set */
+    if(!(H5S_has_extent(file_space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file dataspace does not have extent set")
+    if(!(H5S_has_extent(mem_space)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "memory dataspace does not have extent set")
+
+    /* H5S_select_shape_same() has been modified to accept topologically 
+     * identical selections with different rank as having the same shape 
+     * (if the most rapidly changing coordinates match up), but the I/O 
+     * code still has difficulties with the notion.
+     *
+     * To solve this, we check to see if H5S_select_shape_same() returns 
+     * true, and if the ranks of the mem and file spaces are different.  
+     * If the are, construct a new mem space that is equivalent to the 
+     * old mem space, and use that instead.
+     *
+     * Note that in general, this requires us to touch up the memory buffer 
+     * as well.
+     */
+    if(TRUE == H5S_select_shape_same(mem_space, file_space) &&
+            H5S_GET_EXTENT_NDIMS(mem_space) != H5S_GET_EXTENT_NDIMS(file_space)) {
+        void *adj_buf = NULL;   /* Pointer to the location in buf corresponding  */
+                                /* to the beginning of the projected mem space.  */
+
+        /* Attempt to construct projected dataspace for memory dataspace */
+        if(H5S_select_construct_projection(mem_space, &projected_mem_space,
+                (unsigned)H5S_GET_EXTENT_NDIMS(file_space), buf, (const void **)&adj_buf, type_info.src_type_size) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to construct projected memory dataspace")
+        HDassert(projected_mem_space);
+        HDassert(adj_buf);
+
+        /* Switch to using projected memory dataspace & adjusted buffer */
+        mem_space = projected_mem_space;
+        buf = adj_buf;
+    } /* end if */
+
+    /* Retrieve dataset properties */
+    /* <none needed currently> */
+
+    /* Allocate data space and initialize it if it hasn't been. */
+    if(nelmts > 0 && dataset->shared->dcpl_cache.efl.nused == 0 &&
+            !(*dataset->shared->layout.ops->is_space_alloc)(&dataset->shared->layout.storage)) {
+        hssize_t file_nelmts;   /* Number of elements in file dataset's dataspace */
+        hbool_t full_overwrite; /* Whether we are over-writing all the elements */
+
+        /* Get the number of elements in file dataset's dataspace */
+        if((file_nelmts = H5S_GET_EXTENT_NPOINTS(file_space)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "can't retrieve number of elements in file dataset")
+
+        /* Always allow fill values to be written if the dataset has a VL datatype */
+        if(H5T_detect_class(dataset->shared->type, H5T_VLEN, FALSE))
+            full_overwrite = FALSE;
+        else
+            full_overwrite = (hbool_t)((hsize_t)file_nelmts == nelmts ? TRUE : FALSE);
+
+ 	/* Allocate storage */
+        if(H5D__alloc_storage(dataset, dxpl_id, H5D_ALLOC_WRITE, full_overwrite, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
+    } /* end if */
+
+    /* Set up I/O operation */
+    io_info.op_type = H5D_IO_OP_WRITE;
+    io_info.u.wbuf = buf;
+    if(H5D__ioinfo_init(dataset, dxpl_cache, dxpl_id, &type_info, &store, &io_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up I/O operation")
+#ifdef H5_HAVE_PARALLEL
+    io_info_init = TRUE;
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Call storage method's I/O initialization routine */
+    HDmemset(&fm, 0, sizeof(H5D_chunk_map_t));
+    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize I/O info")
+    io_op_init = TRUE;
+
+#ifdef H5_HAVE_PARALLEL
+    /* Adjust I/O info for any parallel I/O */
+    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to adjust I/O info for parallel I/O")
+#endif /*H5_HAVE_PARALLEL*/
+
+    /* Invoke correct "high level" I/O routine */
+    if((*io_info.io_ops.multi_write)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
+
+#ifdef OLD_WAY
+/*
+ * This was taken out because it can be called in a parallel program with
+ * independent access, causing the metadata cache to get corrupted. Its been
+ * disabled for all types of access (serial as well as parallel) to make the
+ * modification time consistent for all programs. -QAK
+ *
+ * We should set a value in the dataset's shared information instead and flush
+ * it to the file when the dataset is being closed. -QAK
+ */
+    /*
+     * Update modification time.  We have to do this explicitly because
+     * writing to a dataset doesn't necessarily change the object header.
+     */
+    if(H5O_touch(&(dataset->oloc), FALSE, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update modification time")
+#endif /* OLD_WAY */
+
+done:
+    /* Shut down the I/O op information */
+    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(&fm) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down I/O op info")
+#ifdef H5_HAVE_PARALLEL
+    /* Shut down io_info struct */
+    if(io_info_init && H5D__ioinfo_term(&io_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "can't shut down io_info")
+#endif /*H5_HAVE_PARALLEL*/
+    /* Shut down datatype info for operation */
+    if(type_info_init && H5D__typeinfo_term(&type_info) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down type info")
+
+    /* discard projected mem space if it was created */
+    if(NULL != projected_mem_space)
+        if(H5S_close(projected_mem_space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down projected memory dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__ioinfo_init
+ *
+ * Purpose:	Routine for determining correct I/O operations for
+ *              each I/O action.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__ioinfo_init(H5D_t *dset,
+#ifndef H5_HAVE_PARALLEL
+const
+#endif /* H5_HAVE_PARALLEL */
+    H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id,
+    const H5D_type_info_t *type_info, H5D_storage_t *store, H5D_io_info_t *io_info)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check args */
+    HDassert(dset);
+    HDassert(dset->oloc.file);
+    HDassert(type_info);
+    HDassert(type_info->tpath);
+    HDassert(io_info);
+
+    /* Set up "normal" I/O fields */
+    io_info->dset = dset;
+    io_info->dxpl_cache = dxpl_cache;
+    io_info->dxpl_id = dxpl_id;
+    io_info->store = store;
+
+    /* Set I/O operations to initial values */
+    io_info->layout_ops = *dset->shared->layout.ops;
+
+    /* Set the "high-level" I/O operations for the dataset */
+    io_info->io_ops.multi_read = dset->shared->layout.ops->ser_read;
+    io_info->io_ops.multi_write = dset->shared->layout.ops->ser_write;
+
+    /* Set the I/O operations for reading/writing single blocks on disk */
+    if(type_info->is_xform_noop && type_info->is_conv_noop) {
+        /*
+         * If there is no data transform or type conversion then read directly into
+         *  the application's buffer.  This saves at least one mem-to-mem copy.
+         */
+        io_info->io_ops.single_read = H5D__select_read;
+        io_info->io_ops.single_write = H5D__select_write;
+    } /* end if */
+    else {
+        /*
+         * This is the general case (type conversion, usually).
+         */
+        io_info->io_ops.single_read = H5D__scatgath_read;
+        io_info->io_ops.single_write = H5D__scatgath_write;
+    } /* end else */
+
+#ifdef H5_HAVE_PARALLEL
+    /* Determine if the file was opened with an MPI VFD */
+    io_info->using_mpi_vfd = H5F_HAS_FEATURE(dset->oloc.file, H5FD_FEAT_HAS_MPI);
+#endif /* H5_HAVE_PARALLEL */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__ioinfo_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__typeinfo_init
+ *
+ * Purpose:	Routine for determining correct datatype information for
+ *              each I/O action.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, March  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__typeinfo_init(const H5D_t *dset, const H5D_dxpl_cache_t *dxpl_cache,
+    hid_t dxpl_id, hid_t mem_type_id, hbool_t do_write,
+    H5D_type_info_t *type_info)
+{
+    const H5T_t	*src_type;              /* Source datatype */
+    const H5T_t	*dst_type;              /* Destination datatype */
+    herr_t ret_value = SUCCEED;	        /* Return value	*/
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(type_info);
+    HDassert(dset);
+
+    /* Initialize type info safely */
+    HDmemset(type_info, 0, sizeof(*type_info));
+
+    /* Get the memory & dataset datatypes */
+    if(NULL == (type_info->mem_type = (const H5T_t *)H5I_object_verify(mem_type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    type_info->dset_type = dset->shared->type;
+
+    if(do_write) {
+        src_type = type_info->mem_type;
+        dst_type = dset->shared->type;
+        type_info->src_type_id = mem_type_id;
+        type_info->dst_type_id = dset->shared->type_id;
+    } /* end if */
+    else {
+        src_type = dset->shared->type;
+        dst_type = type_info->mem_type;
+        type_info->src_type_id = dset->shared->type_id;
+        type_info->dst_type_id = mem_type_id;
+    } /* end else */
+
+    /*
+     * Locate the type conversion function and data space conversion
+     * functions, and set up the element numbering information. If a data
+     * type conversion is necessary then register datatype atoms. Data type
+     * conversion is necessary if the user has set the `need_bkg' to a high
+     * enough value in xfer_parms since turning off datatype conversion also
+     * turns off background preservation.
+     */
+    if(NULL == (type_info->tpath = H5T_path_find(src_type, dst_type, NULL, NULL, dxpl_id, FALSE)))
+	HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
+
+    /* Precompute some useful information */
+    type_info->src_type_size = H5T_get_size(src_type);
+    type_info->dst_type_size = H5T_get_size(dst_type);
+    type_info->max_type_size = MAX(type_info->src_type_size, type_info->dst_type_size);
+    type_info->is_conv_noop = H5T_path_noop(type_info->tpath);
+    type_info->is_xform_noop = H5Z_xform_noop(dxpl_cache->data_xform_prop);
+    if(type_info->is_xform_noop && type_info->is_conv_noop) {
+        type_info->cmpd_subset = NULL;
+        type_info->need_bkg = H5T_BKG_NO;
+    } /* end if */
+    else {
+        size_t	target_size;		/* Desired buffer size	*/
+
+        /* Check if the datatypes are compound subsets of one another */
+        type_info->cmpd_subset = H5T_path_compound_subset(type_info->tpath);
+
+        /* Check if we need a background buffer */
+        if(do_write && H5T_detect_class(dset->shared->type, H5T_VLEN, FALSE))
+            type_info->need_bkg = H5T_BKG_YES;
+        else {
+            H5T_bkg_t path_bkg;     /* Type conversion's background info */
+
+            if((path_bkg = H5T_path_bkg(type_info->tpath))) {
+                /* Retrieve the bkgr buffer property */
+                type_info->need_bkg = dxpl_cache->bkgr_buf_type;
+                type_info->need_bkg = MAX(path_bkg, type_info->need_bkg);
+            } /* end if */
+            else
+                type_info->need_bkg = H5T_BKG_NO; /*never needed even if app says yes*/
+        } /* end else */
+
+
+        /* Set up datatype conversion/background buffers */
+
+        /* Get buffer size from DXPL */
+        target_size = dxpl_cache->max_temp_buf;
+
+        /* If the buffer is too small to hold even one element, try to make it bigger */
+        if(target_size < type_info->max_type_size) {
+            hbool_t default_buffer_info;    /* Whether the buffer information are the defaults */
+
+            /* Detect if we have all default settings for buffers */
+            default_buffer_info = (hbool_t)((H5D_TEMP_BUF_SIZE == dxpl_cache->max_temp_buf)
+                    && (NULL == dxpl_cache->tconv_buf) && (NULL == dxpl_cache->bkgr_buf));
+
+            /* Check if we are using the default buffer info */
+            if(default_buffer_info)
+                /* OK to get bigger for library default settings */
+                target_size = type_info->max_type_size;
+            else
+                /* Don't get bigger than the application has requested */
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "temporary buffer max size is too small")
+        } /* end if */
+
+        /* Compute the number of elements that will fit into buffer */
+        type_info->request_nelmts = target_size / type_info->max_type_size;
+
+        /* Sanity check elements in temporary buffer */
+        if(type_info->request_nelmts == 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "temporary buffer max size is too small")
+
+        /*
+         * Get a temporary buffer for type conversion unless the app has already
+         * supplied one through the xfer properties. Instead of allocating a
+         * buffer which is the exact size, we allocate the target size.  The
+         * malloc() is usually less resource-intensive if we allocate/free the
+         * same size over and over.
+         */
+        if(NULL == (type_info->tconv_buf = (uint8_t *)dxpl_cache->tconv_buf)) {
+            /* Allocate temporary buffer */
+            if(NULL == (type_info->tconv_buf = H5FL_BLK_MALLOC(type_conv, target_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+            type_info->tconv_buf_allocated = TRUE;
+        } /* end if */
+        if(type_info->need_bkg && NULL == (type_info->bkg_buf = (uint8_t *)dxpl_cache->bkgr_buf)) {
+            size_t	bkg_size;		/* Desired background buffer size	*/
+
+            /* Compute the background buffer size */
+            /* (don't try to use buffers smaller than the default size) */
+            bkg_size = type_info->request_nelmts * type_info->dst_type_size;
+            if(bkg_size < dxpl_cache->max_temp_buf)
+                bkg_size = dxpl_cache->max_temp_buf;
+
+            /* Allocate background buffer */
+            /* (Need calloc()-like call since memory needs to be initialized) */
+            if(NULL == (type_info->bkg_buf = H5FL_BLK_CALLOC(type_conv, bkg_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for background conversion")
+            type_info->bkg_buf_allocated = TRUE;
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__typeinfo_init() */
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__ioinfo_adjust
+ *
+ * Purpose:	Adjust operation's I/O info for any parallel I/O
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March 27, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__ioinfo_adjust(H5D_io_info_t *io_info, const H5D_t *dset, hid_t dxpl_id,
+    const H5S_t *file_space, const H5S_t *mem_space,
+    const H5D_type_info_t *type_info, const H5D_chunk_map_t *fm)
+{
+    H5P_genplist_t *dx_plist;       /* Data transer property list */
+    H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode; /* performed chunk optimization */
+    H5D_mpio_actual_io_mode_t actual_io_mode; /* performed io mode */
+    herr_t	ret_value = SUCCEED;	/* Return value	*/
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(dset);
+    HDassert(dset->oloc.file);
+    HDassert(mem_space);
+    HDassert(file_space);
+    HDassert(type_info);
+    HDassert(type_info->tpath);
+    HDassert(io_info);
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dx_plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Reset the actual io mode properties to the default values in case
+     * the dxpl was previously used in a collective I/O operation.
+     */
+    actual_chunk_opt_mode = H5D_MPIO_NO_CHUNK_OPTIMIZATION;
+    actual_io_mode = H5D_MPIO_NO_COLLECTIVE;
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
+    /* Make any parallel I/O adjustments */
+    if(io_info->using_mpi_vfd) {
+        htri_t opt;         /* Flag whether a selection is optimizable */
+
+        /* Record the original state of parallel I/O transfer options */
+        io_info->orig.xfer_mode = io_info->dxpl_cache->xfer_mode;
+        io_info->orig.coll_opt_mode = io_info->dxpl_cache->coll_opt_mode;
+        io_info->orig.io_ops.single_read = io_info->io_ops.single_read;
+        io_info->orig.io_ops.single_write = io_info->io_ops.single_write;
+
+        /* Get MPI communicator */
+        if(MPI_COMM_NULL == (io_info->comm = H5F_mpi_get_comm(dset->oloc.file)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve MPI communicator")
+
+        /* Check if we can set direct MPI-IO read/write functions */
+        if((opt = H5D__mpio_opt_possible(io_info, file_space, mem_space, type_info, fm, dx_plist)) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "invalid check for direct IO dataspace ")
+
+        /* Check if we can use the optimized parallel I/O routines */
+        if(opt == TRUE) {
+            /* Override the I/O op pointers to the MPI-specific routines */
+            io_info->io_ops.multi_read = dset->shared->layout.ops->par_read;
+            io_info->io_ops.multi_write = dset->shared->layout.ops->par_write;
+            io_info->io_ops.single_read = H5D__mpio_select_read;
+            io_info->io_ops.single_write = H5D__mpio_select_write;
+        } /* end if */
+        else {
+            /* If we won't be doing collective I/O, but the user asked for
+             * collective I/O, change the request to use independent I/O, but
+             * mark it so that we remember to revert the change.
+             */
+            if(io_info->dxpl_cache->xfer_mode == H5FD_MPIO_COLLECTIVE) {
+                /* Change the xfer_mode to independent for handling the I/O */
+                io_info->dxpl_cache->xfer_mode = H5FD_MPIO_INDEPENDENT;
+                if(H5P_set(dx_plist, H5D_XFER_IO_XFER_MODE_NAME, &io_info->dxpl_cache->xfer_mode) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__ioinfo_adjust() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__ioinfo_term
+ *
+ * Purpose:	Common logic for terminating an I/O info object
+ *              (Only used for restoring MPI transfer mode currently)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, February  6, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__ioinfo_term(H5D_io_info_t *io_info)
+{
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Check if we used the MPI VFD for the I/O */
+    if(io_info->using_mpi_vfd) {
+        /* Check if we need to revert the change to the xfer mode */
+        if(io_info->orig.xfer_mode != io_info->dxpl_cache->xfer_mode) {
+            H5P_genplist_t *dx_plist;           /* Data transer property list */
+
+            /* Get the dataset transfer property list */
+            if(NULL == (dx_plist = (H5P_genplist_t *)H5I_object(io_info->dxpl_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+            /* Restore the original parallel I/O mode */
+            if(H5P_set(dx_plist, H5D_XFER_IO_XFER_MODE_NAME, &io_info->orig.xfer_mode) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
+        } /* end if */
+
+        /* Check if we need to revert the change to the collective opt mode */
+        if(io_info->orig.coll_opt_mode != io_info->dxpl_cache->coll_opt_mode) {
+            H5P_genplist_t *dx_plist;           /* Data transer property list */
+
+            /* Get the dataset transfer property list */
+            if(NULL == (dx_plist = (H5P_genplist_t *)H5I_object(io_info->dxpl_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+            /* Restore the original parallel I/O mode */
+            if(H5P_set(dx_plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &io_info->orig.coll_opt_mode) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set collective option mode")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__ioinfo_term() */
+
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__typeinfo_term
+ *
+ * Purpose:	Common logic for terminating a type info object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__typeinfo_term(const H5D_type_info_t *type_info)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check for releasing datatype conversion & background buffers */
+    if(type_info->tconv_buf_allocated) {
+        HDassert(type_info->tconv_buf);
+        (void)H5FL_BLK_FREE(type_conv, type_info->tconv_buf);
+    } /* end if */
+    if(type_info->bkg_buf_allocated) {
+        HDassert(type_info->bkg_buf);
+        (void)H5FL_BLK_FREE(type_conv, type_info->bkg_buf);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__typeinfo_term() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dlayout.c b/gatb-core/thirdparty/hdf5/src/H5Dlayout.c
new file mode 100644
index 0000000..7787042
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dlayout.c
@@ -0,0 +1,484 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HLprivate.h"	/* Local heaps				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__layout_set_io_ops
+ *
+ * Purpose:	Set the I/O operation function pointers for a dataset,
+ *              according to the dataset's layout
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_set_io_ops(const H5D_t *dataset)
+{
+    herr_t ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(dataset);
+
+    /* Set the I/O functions for each layout type */
+    switch(dataset->shared->layout.type) {
+        case H5D_CONTIGUOUS:
+            if(dataset->shared->dcpl_cache.efl.nused > 0)
+                dataset->shared->layout.ops = H5D_LOPS_EFL;
+            else
+                dataset->shared->layout.ops = H5D_LOPS_CONTIG;
+            break;
+
+        case H5D_CHUNKED:
+            dataset->shared->layout.ops = H5D_LOPS_CHUNK;
+
+            /* Set the chunk operations */
+            /* (Only "B-tree" indexing type currently supported) */
+            dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_BTREE;
+            break;
+
+        case H5D_COMPACT:
+            dataset->shared->layout.ops = H5D_LOPS_COMPACT;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown storage method")
+    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_set_io_ops() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__layout_meta_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes except raw data
+ *              part for compact dataset.  This function doesn't take into
+ *              account message alignment.
+ *
+ * Return:      Success:        Message data size in bytes
+ *              Failure:        0
+ *
+ * Programmer:  Raymond Lu
+ *              August 14, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5D__layout_meta_size(const H5F_t *f, const H5O_layout_t *layout, hbool_t include_compact_data)
+{
+    size_t                  ret_value;
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(f);
+    HDassert(layout);
+
+    ret_value = 1 +                     /* Version number                       */
+                1;                      /* layout class type                    */
+
+    switch(layout->type) {
+        case H5D_COMPACT:
+            /* Size of raw data */
+            ret_value += 2;
+            if(include_compact_data)
+                ret_value += layout->storage.u.compact.size;/* data for compact dataset             */
+            break;
+
+        case H5D_CONTIGUOUS:
+            ret_value += H5F_SIZEOF_ADDR(f);    /* Address of data */
+            ret_value += H5F_SIZEOF_SIZE(f);    /* Length of data */
+            break;
+
+        case H5D_CHUNKED:
+            /* Number of dimensions (1 byte) */
+            HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+            ret_value++;
+
+            /* Dimension sizes */
+            ret_value += layout->u.chunk.ndims * 4;
+
+            /* B-tree address */
+            ret_value += H5F_SIZEOF_ADDR(f);    /* Address of data */
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, 0, "Invalid layout class")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_meta_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__layout_oh_create
+ *
+ * Purpose:	Create layout/pline/efl information for dataset
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh, H5D_t *dset,
+    hid_t dapl_id)
+{
+    H5O_layout_t        *layout;         /* Dataset's layout information */
+    const H5O_fill_t	*fill_prop;     /* Pointer to dataset's fill value information */
+    hbool_t             layout_init = FALSE;    /* Flag to indicate that chunk information was initialized */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checking */
+    HDassert(file);
+    HDassert(oh);
+    HDassert(dset);
+
+    /* Set some local variables, for convenience */
+    layout = &dset->shared->layout;
+    fill_prop = &dset->shared->dcpl_cache.fill;
+
+    /* Update the filters message, if this is a chunked dataset */
+    if(layout->type == H5D_CHUNKED) {
+        H5O_pline_t     *pline;         /* Dataset's I/O pipeline information */
+
+        pline = &dset->shared->dcpl_cache.pline;
+        if(pline->nused > 0 && H5O_msg_append_oh(file, dxpl_id, oh, H5O_PLINE_ID, H5O_MSG_FLAG_CONSTANT, 0, pline) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update filter header message")
+    } /* end if */
+
+    /* Initialize the layout information for the new dataset */
+    if(dset->shared->layout.ops->init && (dset->shared->layout.ops->init)(file, dxpl_id, dset, dapl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize layout information")
+
+    /* Indicate that the layout information was initialized */
+    layout_init = TRUE;
+
+    /*
+     * Allocate storage if space allocate time is early; otherwise delay
+     * allocation until later.
+     */
+    if(fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY)
+        if(H5D__alloc_storage(dset, dxpl_id, H5D_ALLOC_CREATE, FALSE, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
+
+    /* Update external storage message, if it's used */
+    if(dset->shared->dcpl_cache.efl.nused > 0) {
+        H5O_efl_t *efl = &dset->shared->dcpl_cache.efl; /* Dataset's external file list */
+        H5HL_t *heap;                           /* Pointer to local heap for EFL file names */
+        size_t heap_size = H5HL_ALIGN(1);
+        size_t u;
+
+        /* Determine size of heap needed to stored the file names */
+        for(u = 0; u < efl->nused; ++u)
+            heap_size += H5HL_ALIGN(HDstrlen(efl->slot[u].name) + 1);
+
+        /* Create the heap for the EFL file names */
+        if(H5HL_create(file, dxpl_id, heap_size, &efl->heap_addr/*out*/) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create EFL file name heap")
+
+        /* Pin the heap down in memory */
+        if(NULL == (heap = H5HL_protect(file, dxpl_id, efl->heap_addr, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect EFL file name heap")
+
+        /* Insert "empty" name first */
+        if((size_t)(-1) == H5HL_insert(file, dxpl_id, heap, (size_t)1, "")) {
+            H5HL_unprotect(heap);
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert file name into heap")
+        } /* end if */
+
+        for(u = 0; u < efl->nused; ++u) {
+            size_t offset;      /* Offset of file name in heap */
+
+            /* Insert file name into heap */
+            if((size_t)(-1) == (offset = H5HL_insert(file, dxpl_id, heap,
+                        HDstrlen(efl->slot[u].name) + 1, efl->slot[u].name))) {
+                H5HL_unprotect(heap);
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert file name into heap")
+            } /* end if */
+
+            /* Store EFL file name offset */
+            HDassert(0 == efl->slot[u].name_offset);
+            efl->slot[u].name_offset = offset;
+        } /* end for */
+
+        /* Release the heap */
+        if(H5HL_unprotect(heap) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to unprotect EFL file name heap")
+        heap = NULL;
+
+        /* Insert EFL message into dataset object header */
+        if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_EFL_ID, H5O_MSG_FLAG_CONSTANT, 0, efl) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update external file list message")
+    } /* end if */
+
+    /* Create layout message */
+    /* (Don't make layout message constant unless allocation time is early, since space may not be allocated) */
+    /* (Note: this is relying on H5D__alloc_storage not calling H5O_msg_write during dataset creation) */
+    if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_LAYOUT_ID, ((fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY && H5D_COMPACT != layout->type) ? H5O_MSG_FLAG_CONSTANT : 0), 0, layout) < 0)
+         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout")
+
+done:
+    /* Error cleanup */
+    if(ret_value < 0) {
+        if(dset->shared->layout.type == H5D_CHUNKED && layout_init) {
+            if(H5D__chunk_dest(file, dxpl_id, dset) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_oh_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__layout_oh_read
+ *
+ * Purpose:	Read layout/pline/efl information for dataset
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_oh_read(H5D_t *dataset, hid_t dxpl_id, hid_t dapl_id, H5P_genplist_t *plist)
+{
+    htri_t msg_exists;                  /* Whether a particular type of message exists */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checking */
+    HDassert(dataset);
+    HDassert(plist);
+
+    /* Get the optional filters message */
+    if((msg_exists = H5O_msg_exists(&(dataset->oloc), H5O_PLINE_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't check if message exists")
+    if(msg_exists) {
+        /* Retrieve the I/O pipeline message */
+        if(NULL == H5O_msg_read(&(dataset->oloc), H5O_PLINE_ID, &dataset->shared->dcpl_cache.pline, dxpl_id))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+
+        /* Set the I/O pipeline info in the property list */
+        if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &dataset->shared->dcpl_cache.pline) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set pipeline")
+    } /* end if */
+
+    /*
+     * Get the raw data layout info.  It's actually stored in two locations:
+     * the storage message of the dataset (dataset->storage) and certain
+     * values are copied to the dataset create plist so the user can query
+     * them.
+     */
+    if(NULL == H5O_msg_read(&(dataset->oloc), H5O_LAYOUT_ID, &(dataset->shared->layout), dxpl_id))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read data layout message")
+
+    /* Check for external file list message (which might not exist) */
+    if((msg_exists = H5O_msg_exists(&(dataset->oloc), H5O_EFL_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't check if message exists")
+    if(msg_exists) {
+        /* Retrieve the EFL  message */
+        if(NULL == H5O_msg_read(&(dataset->oloc), H5O_EFL_ID, &dataset->shared->dcpl_cache.efl, dxpl_id))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+
+        /* Set the EFL info in the property list */
+        if(H5P_set(plist, H5D_CRT_EXT_FILE_LIST_NAME, &dataset->shared->dcpl_cache.efl) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set external file list")
+
+        /* Set the dataset's I/O operations */
+        dataset->shared->layout.ops = H5D_LOPS_EFL;
+    } /* end if */
+
+    /* Sanity check that the layout operations are set up */
+    HDassert(dataset->shared->layout.ops);
+
+    /* Adjust chunk dimensions to omit datatype size (in last dimension) for creation property */
+    if(H5D_CHUNKED == dataset->shared->layout.type)
+        dataset->shared->layout.u.chunk.ndims--;
+    /* Copy layout to the DCPL */
+    if(H5P_set(plist, H5D_CRT_LAYOUT_NAME, &dataset->shared->layout) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout")
+    /* Adjust chunk dimensions back again (*sigh*) */
+    if(H5D_CHUNKED == dataset->shared->layout.type)
+        dataset->shared->layout.u.chunk.ndims++;
+
+    switch(dataset->shared->layout.type) {
+        case H5D_CONTIGUOUS:
+        {
+            hsize_t tmp_size;                   /* Temporary holder for raw data size */
+            size_t tmp_sieve_buf_size;          /* Temporary holder for sieve buffer size */
+
+            /* Compute the size of the contiguous storage for versions of the
+             * layout message less than version 3 because versions 1 & 2 would
+             * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
+             */
+            if(dataset->shared->layout.version < 3) {
+                hssize_t snelmts;                   /* Temporary holder for number of elements in dataspace */
+                hsize_t nelmts;                     /* Number of elements in dataspace */
+                size_t dt_size;                     /* Size of datatype */
+
+                /* Retrieve the number of elements in the dataspace */
+                if((snelmts = H5S_GET_EXTENT_NPOINTS(dataset->shared->space)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace")
+                nelmts = (hsize_t)snelmts;
+
+                /* Get the datatype's size */
+                if(0 == (dt_size = H5T_GET_SIZE(dataset->shared->type)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
+
+                /* Compute the size of the dataset's contiguous storage */
+                tmp_size = nelmts * dt_size;
+
+                /* Check for overflow during multiplication */
+                if(nelmts != (tmp_size / dt_size))
+                    HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
+
+                /* Assign the dataset's contiguous storage size */
+                dataset->shared->layout.storage.u.contig.size = tmp_size;
+            } else
+                tmp_size = dataset->shared->layout.storage.u.contig.size;
+
+	    /* Get the sieve buffer size for the file */
+	    tmp_sieve_buf_size = H5F_SIEVE_BUF_SIZE(dataset->oloc.file);
+
+	    /* Adjust the sieve buffer size to the smaller one between the dataset size and the buffer size
+	     * from the file access property.  (SLU - 2012/3/30) */
+	    if(tmp_size < tmp_sieve_buf_size)
+		dataset->shared->cache.contig.sieve_buf_size = tmp_size;
+	    else
+		dataset->shared->cache.contig.sieve_buf_size = tmp_sieve_buf_size;
+        }
+            break;
+
+        case H5D_CHUNKED:
+            /* Initialize the chunk cache for the dataset */
+            if(H5D__chunk_init(dataset->oloc.file, dxpl_id, dataset, dapl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize chunk cache")
+            break;
+
+        case H5D_COMPACT:
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown storage method")
+    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_oh_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__layout_oh_write
+ *
+ * Purpose:	Write layout/pline/efl information for dataset
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, July 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_oh_write(H5D_t *dataset, hid_t dxpl_id, H5O_t *oh, unsigned update_flags)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checking */
+    HDassert(dataset);
+    HDassert(oh);
+
+    /* Write the layout message to the dataset's header */
+    if(H5O_msg_write_oh(dataset->oloc.file, dxpl_id, oh, H5O_LAYOUT_ID, H5O_MSG_FLAG_CONSTANT, update_flags, &dataset->shared->layout) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_oh_write() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dmpio.c b/gatb-core/thirdparty/hdf5/src/H5Dmpio.c
new file mode 100644
index 0000000..002f44f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dmpio.c
@@ -0,0 +1,1836 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  rky 980813
+ * KY 2005 revised the code and made the change to support and optimize
+ * collective IO support.
+ * Purpose:    Functions to read/write directly between app buffer and file.
+ *
+ *         Beware of the ifdef'ed print statements.
+ *         I didn't make them portable.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE /* suppress error about including H5Dpkg */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"        /* Generic Functions */
+#include "H5Dpkg.h"           /* Datasets          */
+#include "H5Eprivate.h"       /* Error handling    */
+#include "H5Fprivate.h"       /* File access       */
+#include "H5FDprivate.h"      /* File drivers      */
+#include "H5Iprivate.h"       /* IDs               */
+#include "H5MMprivate.h"      /* Memory management */
+#include "H5Oprivate.h"       /* Object headers    */
+#include "H5Pprivate.h"       /* Property lists    */
+#include "H5Sprivate.h"       /* Dataspaces        */
+#include "H5VMprivate.h"       /* Vector            */
+
+#ifdef H5_HAVE_PARALLEL
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Macros to represent different IO options */
+#define H5D_ONE_LINK_CHUNK_IO          0
+#define H5D_MULTI_CHUNK_IO             1
+#define H5D_ONE_LINK_CHUNK_IO_MORE_OPT 2
+#define H5D_MULTI_CHUNK_IO_MORE_OPT    3
+
+/***** Macros for One linked collective IO case. *****/
+/* The default value to do one linked collective IO for all chunks.
+   If the average number of chunks per process is greater than this value,
+      the library will create an MPI derived datatype to link all chunks to do collective IO.
+      The user can set this value through an API. */
+
+/* Macros to represent options on how to obtain chunk address for one linked-chunk IO case */
+#define H5D_OBTAIN_ONE_CHUNK_ADDR_IND 0
+#define H5D_OBTAIN_ALL_CHUNK_ADDR_COL 2
+
+/* Macros to define the default ratio of obtaining all chunk addresses for one linked-chunk IO case */
+#define H5D_ALL_CHUNK_ADDR_THRES_COL  30
+#define H5D_ALL_CHUNK_ADDR_THRES_COL_NUM 10000
+
+/***** Macros for multi-chunk collective IO case. *****/
+/* The default value of the threshold to do collective IO for this chunk.
+   If the average number of processes per chunk is greater than the default value,
+   collective IO is done for this chunk.
+*/
+
+/* Macros to represent different IO modes(NONE, Independent or collective)for multiple chunk IO case */
+#define H5D_CHUNK_IO_MODE_IND         0
+#define H5D_CHUNK_IO_MODE_COL         1
+
+/* Macros to represent the regularity of the selection for multiple chunk IO case. */
+#define H5D_CHUNK_SELECT_REG          1
+#define H5D_CHUNK_SELECT_IRREG        2
+#define H5D_CHUNK_SELECT_NONE         0
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+/* Combine chunk address and chunk info into a struct for better performance. */
+typedef struct H5D_chunk_addr_info_t {
+  haddr_t chunk_addr;
+  H5D_chunk_info_t chunk_info;
+} H5D_chunk_addr_info_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5D__chunk_collective_io(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, H5D_chunk_map_t *fm);
+static herr_t H5D__multi_chunk_collective_io(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, H5D_chunk_map_t *fm,
+    H5P_genplist_t *dx_plist);
+static herr_t H5D__link_chunk_collective_io(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, H5D_chunk_map_t *fm, int sum_chunk,
+    H5P_genplist_t *dx_plist);
+static herr_t H5D__inter_collective_io(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, const H5S_t *file_space,
+    const H5S_t *mem_space);
+static herr_t H5D__final_collective_io(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, MPI_Datatype *mpi_file_type,
+    MPI_Datatype *mpi_buf_type);
+static herr_t H5D__sort_chunk(H5D_io_info_t *io_info, const H5D_chunk_map_t *fm,
+    H5D_chunk_addr_info_t chunk_addr_info_array[], int many_chunk_opt);
+static herr_t H5D__obtain_mpio_mode(H5D_io_info_t *io_info, H5D_chunk_map_t *fm,
+    H5P_genplist_t *dx_plist, uint8_t assign_io_mode[], haddr_t chunk_addr[]);
+static herr_t H5D__ioinfo_xfer_mode(H5D_io_info_t *io_info, H5P_genplist_t *dx_plist,
+    H5FD_mpio_xfer_t xfer_mode);
+static herr_t H5D__ioinfo_coll_opt_mode(H5D_io_info_t *io_info, H5P_genplist_t *dx_plist,
+    H5FD_mpio_collective_opt_t coll_opt_mode);
+static herr_t H5D__mpio_get_min_chunk(const H5D_io_info_t *io_info,
+    const H5D_chunk_map_t *fm, int *min_chunkf);
+static herr_t H5D__mpio_get_sum_chunk(const H5D_io_info_t *io_info,
+    const H5D_chunk_map_t *fm, int *sum_chunkf);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mpio_opt_possible
+ *
+ * Purpose:     Checks if an direct I/O transfer is possible between memory and
+ *                  the file.
+ *
+ * Return:      Sauccess:   Non-negative: TRUE or FALSE
+ *              Failure:    Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, April 3, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5D__mpio_opt_possible(const H5D_io_info_t *io_info, const H5S_t *file_space,
+    const H5S_t *mem_space, const H5D_type_info_t *type_info,
+    const H5D_chunk_map_t *fm, H5P_genplist_t *dx_plist)
+{
+    int local_cause = 0;        /* Local reason(s) for breaking collective mode */
+    int global_cause = 0;       /* Global reason(s) for breaking collective mode */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+    HDassert(type_info);
+
+
+    /* For independent I/O, get out quickly and don't try to form consensus */
+    if(io_info->dxpl_cache->xfer_mode == H5FD_MPIO_INDEPENDENT)
+        local_cause |= H5D_MPIO_SET_INDEPENDENT;
+
+    /* Optimized MPI types flag must be set */
+    /* (based on 'HDF5_MPI_OPT_TYPES' environment variable) */
+    if(!H5FD_mpi_opt_types_g)
+        local_cause |= H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED;
+
+    /* Don't allow collective operations if datatype conversions need to happen */
+    if(!type_info->is_conv_noop)
+        local_cause |= H5D_MPIO_DATATYPE_CONVERSION;
+
+    /* Don't allow collective operations if data transform operations should occur */
+    if(!type_info->is_xform_noop)
+        local_cause |= H5D_MPIO_DATA_TRANSFORMS;
+
+    /* Check whether these are both simple or scalar dataspaces */
+    if(!((H5S_SIMPLE == H5S_GET_EXTENT_TYPE(mem_space) || H5S_SCALAR == H5S_GET_EXTENT_TYPE(mem_space))
+            && (H5S_SIMPLE == H5S_GET_EXTENT_TYPE(file_space) || H5S_SCALAR == H5S_GET_EXTENT_TYPE(file_space))))
+        local_cause |= H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES;
+
+    /* Dataset storage must be contiguous or chunked */
+    if(!(io_info->dset->shared->layout.type == H5D_CONTIGUOUS ||
+            io_info->dset->shared->layout.type == H5D_CHUNKED))
+        local_cause |= H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET;
+
+    /* check if external-file storage is used */
+    if(io_info->dset->shared->dcpl_cache.efl.nused > 0)
+        local_cause |= H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET;
+
+    /* The handling of memory space is different for chunking and contiguous
+     *  storage.  For contiguous storage, mem_space and file_space won't change
+     *  when it it is doing disk IO.  For chunking storage, mem_space will
+     *  change for different chunks. So for chunking storage, whether we can
+     *  use collective IO will defer until each chunk IO is reached.
+     */
+
+    /* Don't allow collective operations if filters need to be applied */
+    if(io_info->dset->shared->layout.type == H5D_CHUNKED &&
+            io_info->dset->shared->dcpl_cache.pline.nused > 0)
+        local_cause |= H5D_MPIO_FILTERS;
+
+    /* Check for independent I/O */
+    if(local_cause & H5D_MPIO_SET_INDEPENDENT)
+        global_cause = local_cause;
+    else {
+        int mpi_code;               /* MPI error code */
+
+        /* Form consensus opinion among all processes about whether to perform
+         * collective I/O
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_Allreduce(&local_cause, &global_cause, 1, MPI_INT, MPI_BOR, io_info->comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Allreduce failed", mpi_code)
+    } /* end else */
+
+    /* Write the local value of no-collective-cause to the DXPL. */
+    if(H5P_set(dx_plist, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, &local_cause) < 0)
+       HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set local no collective cause property")
+
+    /* Write the global value of no-collective-cause to the DXPL. */
+    if(H5P_set(dx_plist, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, &global_cause) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set global no collective cause property")
+
+    /* Set the return value, based on the global cause */
+    ret_value = global_cause > 0 ? FALSE : TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__mpio_opt_possible() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mpio_select_read
+ *
+ * Purpose:     MPI-IO function to read directly from app buffer to file.
+ *
+ * Return:      non-negative on success, negative on failure.
+ *
+ * Programmer:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__mpio_select_read(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNUSED *type_info,
+    hsize_t mpi_buf_count, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space)
+{
+    const H5D_contig_storage_t *store_contig = &(io_info->store->contig);    /* Contiguous storage info for this I/O operation */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    H5_CHECK_OVERFLOW(mpi_buf_count, hsize_t, size_t);
+    if(H5F_block_read(io_info->dset->oloc.file, H5FD_MEM_DRAW, store_contig->dset_addr, (size_t)mpi_buf_count, io_info->dxpl_id, io_info->u.rbuf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "can't finish collective parallel read")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__mpio_select_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mpio_select_write
+ *
+ * Purpose:     MPI-IO function to write directly from app buffer to file.
+ *
+ * Return:      non-negative on success, negative on failure.
+ *
+ * Programmer:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__mpio_select_write(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNUSED *type_info,
+    hsize_t mpi_buf_count, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space)
+{
+    const H5D_contig_storage_t *store_contig = &(io_info->store->contig);    /* Contiguous storage info for this I/O operation */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    /*OKAY: CAST DISCARDS CONST QUALIFIER*/
+    H5_CHECK_OVERFLOW(mpi_buf_count, hsize_t, size_t);
+    if(H5F_block_write(io_info->dset->oloc.file, H5FD_MEM_DRAW, store_contig->dset_addr, (size_t)mpi_buf_count, io_info->dxpl_id, io_info->u.wbuf) < 0)
+       HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "can't finish collective parallel write")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__mpio_select_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__ioinfo_xfer_mode
+ *
+ * Purpose:     Switch to between collective & independent MPI I/O
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__ioinfo_xfer_mode(H5D_io_info_t *io_info, H5P_genplist_t *dx_plist,
+    H5FD_mpio_xfer_t xfer_mode)
+{
+    herr_t  ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Change the xfer_mode */
+    io_info->dxpl_cache->xfer_mode = xfer_mode;
+    if(H5P_set(dx_plist, H5D_XFER_IO_XFER_MODE_NAME, &io_info->dxpl_cache->xfer_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
+
+    /* Change the "single I/O" function pointers */
+    if(xfer_mode == H5FD_MPIO_INDEPENDENT) {
+        /* Set the pointers to the original, non-MPI-specific routines */
+        io_info->io_ops.single_read = io_info->orig.io_ops.single_read;
+        io_info->io_ops.single_write = io_info->orig.io_ops.single_write;
+    } /* end if */
+    else {
+        HDassert(xfer_mode == H5FD_MPIO_COLLECTIVE);
+
+        /* Set the pointers to the MPI-specific routines */
+        io_info->io_ops.single_read = H5D__mpio_select_read;
+        io_info->io_ops.single_write = H5D__mpio_select_write;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__ioinfo_xfer_mode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__ioinfo_coll_opt_mode
+ *
+ * Purpose:     Switch between using collective & independent MPI I/O w/file
+ *              set view
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  MuQun Yang
+ *              Oct. 5th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__ioinfo_coll_opt_mode(H5D_io_info_t *io_info, H5P_genplist_t *dx_plist,
+    H5FD_mpio_collective_opt_t coll_opt_mode)
+{
+    herr_t  ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Change the optimal xfer_mode */
+    io_info->dxpl_cache->coll_opt_mode = coll_opt_mode;
+    if(H5P_set(dx_plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &io_info->dxpl_cache->coll_opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__ioinfo_coll_opt_mode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mpio_get_min_chunk
+ *
+ * Purpose:     Routine for obtaining minimum number of chunks to cover
+ *              hyperslab selection selected by all processors.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__mpio_get_min_chunk(const H5D_io_info_t *io_info, const H5D_chunk_map_t *fm,
+    int *min_chunkf)
+{
+    int num_chunkf;             /* Number of chunks to iterate over */
+    int mpi_code;               /* MPI return code */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Get the number of chunks to perform I/O on */
+    num_chunkf = H5SL_count(fm->sel_chunks);
+
+    /* Determine the minimum # of chunks for all processes */
+    if(MPI_SUCCESS != (mpi_code = MPI_Allreduce(&num_chunkf, min_chunkf, 1, MPI_INT, MPI_MIN, io_info->comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Allreduce failed", mpi_code)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__mpio_get_min_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__mpio_get_sum_chunk
+ *
+ * Purpose:     Routine for obtaining total number of chunks to cover
+ *              hyperslab selection selected by all processors.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__mpio_get_sum_chunk(const H5D_io_info_t *io_info, const H5D_chunk_map_t *fm,
+    int *sum_chunkf)
+{
+    int num_chunkf;             /* Number of chunks to iterate over */
+    size_t ori_num_chunkf;
+    int mpi_code;               /* MPI return code */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Get the number of chunks to perform I/O on */
+    num_chunkf = 0;
+    ori_num_chunkf = H5SL_count(fm->sel_chunks);
+    H5_CHECKED_ASSIGN(num_chunkf, int, ori_num_chunkf, size_t);
+
+    /* Determine the summation of number of chunks for all processes */
+    if(MPI_SUCCESS != (mpi_code = MPI_Allreduce(&num_chunkf, sum_chunkf, 1, MPI_INT, MPI_SUM, io_info->comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Allreduce failed", mpi_code)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__mpio_get_sum_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__contig_collective_read
+ *
+ * Purpose:     Reads directly from contiguous data in file into application
+ *              memory using collective I/O.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, March  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_collective_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_CONTIGUOUS_COLLECTIVE;
+    H5P_genplist_t *dx_plist;           /* Pointer to DXPL */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(H5FD_MPIO == H5F_DRIVER_ID(io_info->dset->oloc.file));
+    HDassert(TRUE == H5P_isa_class(io_info->dxpl_id, H5P_DATASET_XFER));
+
+    /* Call generic internal collective I/O routine */
+    if(H5D__inter_collective_io(io_info, type_info, file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "couldn't finish shared collective MPI-IO")
+
+    /* Obtain the data transfer properties */
+    if(NULL == (dx_plist = H5I_object(io_info->dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+
+    /* Set the actual I/O mode property. internal_collective_io will not break to
+     * independent I/O, so we set it here.
+     */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_collective_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__contig_collective_write
+ *
+ * Purpose:     Write directly to contiguous data in file from application
+ *              memory using collective I/O.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, March  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_collective_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_CONTIGUOUS_COLLECTIVE;
+    H5P_genplist_t *dx_plist;           /* Pointer to DXPL */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(H5FD_MPIO == H5F_DRIVER_ID(io_info->dset->oloc.file));
+    HDassert(TRUE == H5P_isa_class(io_info->dxpl_id, H5P_DATASET_XFER));
+
+    /* Call generic internal collective I/O routine */
+    if(H5D__inter_collective_io(io_info, type_info, file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "couldn't finish shared collective MPI-IO")
+
+    /* Obtain the data transfer properties */
+    if(NULL == (dx_plist = H5I_object(io_info->dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+
+    /* Set the actual I/O mode property. internal_collective_io will not break to
+     * independent I/O, so we set it here.
+     */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_collective_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_collective_io
+ *
+ * Purpose:     Routine for
+ *              1) choose an IO option:
+ *                    a) One collective IO defined by one MPI derived datatype to link through all chunks
+ *              or    b) multiple chunk IOs,to do MPI-IO for each chunk, the IO mode may be adjusted
+ *                       due to the selection pattern for each chunk.
+ *              For option a)
+ *                      1. Sort the chunk address, obtain chunk info according to the sorted chunk address
+ *                      2. Build up MPI derived datatype for each chunk
+ *                      3. Build up the final MPI derived datatype
+ *                      4. Set up collective IO property list
+ *                      5. Do IO
+ *              For option b)
+ *                      1. Use MPI_gather and MPI_Bcast to obtain information of *collective/independent/none*
+ *                         IO mode for each chunk of the selection
+ *                      2. Depending on whether the IO mode is collective or independent or none,
+ *                         Create either MPI derived datatype for each chunk to do collective IO or
+ *                         just do independent IO or independent IO with file set view
+ *                      3. Set up collective IO property list for collective mode
+ *                      4. DO IO
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ * Modification:
+ *  - Refctore to remove multi-chunk-without-opimization feature and update for
+ *    multi-chunk-io accordingly
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    H5D_chunk_map_t *fm)
+{
+    H5P_genplist_t *dx_plist;           /* Pointer to DXPL */
+    H5FD_mpio_chunk_opt_t chunk_opt_mode;
+    int         io_option = H5D_MULTI_CHUNK_IO_MORE_OPT;
+    int         sum_chunk = -1;
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+    htri_t      temp_not_link_io = FALSE;
+#endif
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(io_info);
+    HDassert(io_info->using_mpi_vfd);
+    HDassert(type_info);
+    HDassert(fm);
+
+    /* Obtain the data transfer properties */
+    if(NULL == (dx_plist = H5I_object(io_info->dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    /* Check the optional property list on what to do with collective chunk IO. */
+    chunk_opt_mode = (H5FD_mpio_chunk_opt_t)H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME);
+    if(H5FD_MPIO_CHUNK_ONE_IO == chunk_opt_mode)
+        io_option = H5D_ONE_LINK_CHUNK_IO;      /*no opt*/
+    /* direct request to multi-chunk-io */
+    else if(H5FD_MPIO_CHUNK_MULTI_IO == chunk_opt_mode)
+        io_option = H5D_MULTI_CHUNK_IO;         
+    /* via default path. branch by num threshold */
+    else {
+        unsigned one_link_chunk_io_threshold;   /* Threshhold to use single collective I/O for all chunks */
+        int mpi_size;                   /* Number of processes in MPI job */
+
+        if(H5D__mpio_get_sum_chunk(io_info, fm, &sum_chunk) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSWAP, FAIL, "unable to obtain the total chunk number of all processes");
+        if((mpi_size = H5F_mpi_get_size(io_info->dset->oloc.file)) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi size")
+
+        one_link_chunk_io_threshold = H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME);
+
+        /* step 1: choose an IO option */
+        /* If the average number of chunk per process is greater than a threshold, we will do one link chunked IO. */
+        if((unsigned)sum_chunk / mpi_size >= one_link_chunk_io_threshold)
+            io_option = H5D_ONE_LINK_CHUNK_IO_MORE_OPT;
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+        else
+            temp_not_link_io = TRUE;
+#endif
+    } /* end else */
+
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+{
+    H5P_genplist_t    *plist;           /* Property list pointer */
+    htri_t            check_prop;
+    int               new_value;
+
+    /* Get the dataset transfer property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(io_info->dxpl_id)))
+        HGOTO_ERROR(H5E_IO, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /*** Test collective chunk user-input optimization APIs. ***/
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME);
+    if(check_prop > 0) {
+        if(H5D_ONE_LINK_CHUNK_IO == io_option) {
+            new_value = 0;
+            if(H5P_set(plist, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, &new_value) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
+        } /* end if */
+    } /* end if */
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME);
+    if(check_prop > 0) {
+        if(H5D_MULTI_CHUNK_IO == io_option) {
+            new_value = 0;
+            if(H5P_set(plist, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, &new_value) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
+        } /* end if */
+    } /* end if */
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME);
+    if(check_prop > 0) {
+        if(H5D_ONE_LINK_CHUNK_IO_MORE_OPT == io_option) {
+            new_value = 0;
+            if(H5P_set(plist, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, &new_value) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
+        } /* end if */
+    } /* end if */
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME);
+    if(check_prop > 0) {
+        if(temp_not_link_io) {
+            new_value = 0;
+            if(H5P_set(plist, H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME, &new_value) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
+        } /* end if */
+    } /* end if */
+}
+#endif
+
+    /* step 2:  Go ahead to do IO.*/
+    if(H5D_ONE_LINK_CHUNK_IO == io_option || H5D_ONE_LINK_CHUNK_IO_MORE_OPT == io_option) {
+        if(H5D__link_chunk_collective_io(io_info, type_info, fm, sum_chunk, dx_plist) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish linked chunk MPI-IO")
+    } /* end if */
+    /* direct request to multi-chunk-io */
+    else if(H5D_MULTI_CHUNK_IO == io_option) {
+        if(H5D__multi_chunk_collective_io(io_info, type_info, fm, dx_plist) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish optimized multiple chunk MPI-IO")
+    } /* end if */
+    else { /* multiple chunk IO via threshold */
+        if(H5D__multi_chunk_collective_io(io_info, type_info, fm, dx_plist) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish optimized multiple chunk MPI-IO")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_collective_io */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_collective_read
+ *
+ * Purpose:     Reads directly from chunks in file into application memory
+ *              using collective I/O.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, March  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_collective_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t *fm)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Call generic selection operation */
+    if(H5D__chunk_collective_io(io_info, type_info, fm) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, FAIL, "read error")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_collective_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_collective_write
+ *
+ * Purpose:     Write directly to chunks in file from application memory
+ *              using collective I/O.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, March  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_collective_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t H5_ATTR_UNUSED nelmts, const H5S_t H5_ATTR_UNUSED *file_space, const H5S_t H5_ATTR_UNUSED *mem_space,
+    H5D_chunk_map_t *fm)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Call generic selection operation */
+    if(H5D__chunk_collective_io(io_info, type_info, fm) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_collective_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__link_chunk_collective_io
+ *
+ * Purpose:     Routine for one collective IO with one MPI derived datatype to link with all chunks
+ *
+ *                      1. Sort the chunk address and chunk info
+ *                      2. Build up MPI derived datatype for each chunk
+ *                      3. Build up the final MPI derived datatype
+ *                      4. Use common collective IO routine to do MPI-IO
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ * Modification:
+ *  - Set H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME and H5D_MPIO_ACTUAL_IO_MODE_NAME
+ *    dxpl in this.
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__link_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    H5D_chunk_map_t *fm, int sum_chunk, H5P_genplist_t *dx_plist)
+{
+    H5D_chunk_addr_info_t *chunk_addr_info_array = NULL;
+    MPI_Datatype chunk_final_mtype;         /* Final memory MPI datatype for all chunks with seletion */
+    hbool_t chunk_final_mtype_is_derived = FALSE;
+    MPI_Datatype chunk_final_ftype;         /* Final file MPI datatype for all chunks with seletion */
+    hbool_t chunk_final_ftype_is_derived = FALSE;
+    H5D_storage_t ctg_store;                /* Storage info for "fake" contiguous dataset */
+    size_t              total_chunks;
+    haddr_t            *total_chunk_addr_array = NULL;
+    MPI_Datatype       *chunk_mtype = NULL;
+    MPI_Datatype       *chunk_ftype = NULL;
+    MPI_Aint           *chunk_disp_array = NULL;
+    MPI_Aint           *chunk_mem_disp_array = NULL;
+    hbool_t            *chunk_mft_is_derived_array = NULL;      /* Flags to indicate each chunk's MPI file datatype is derived */
+    hbool_t            *chunk_mbt_is_derived_array = NULL;      /* Flags to indicate each chunk's MPI memory datatype is derived */
+    int                *chunk_mpi_file_counts = NULL;   /* Count of MPI file datatype for each chunk */
+    int                *chunk_mpi_mem_counts = NULL;    /* Count of MPI memory datatype for each chunk */
+    int                 mpi_code;           /* MPI return code */
+    H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode = H5D_MPIO_LINK_CHUNK;
+    H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_CHUNK_COLLECTIVE;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Set the actual-chunk-opt-mode property. */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
+
+    /* Set the actual-io-mode property.
+     * Link chunk I/O does not break to independent, so can set right away */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
+    /* Get the sum # of chunks, if not already available */
+    if(sum_chunk < 0) {
+        if(H5D__mpio_get_sum_chunk(io_info, fm, &sum_chunk) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSWAP, FAIL, "unable to obtain the total chunk number of all processes");
+    } /* end if */
+
+    /* Retrieve total # of chunks in dataset */
+    H5_CHECKED_ASSIGN(total_chunks, size_t, fm->layout->u.chunk.nchunks, hsize_t);
+
+    /* Handle special case when dataspace dimensions only allow one chunk in
+     *  the dataset.  [This sometimes is used by developers who want the
+     *  equivalent of compressed contiguous datasets - QAK]
+     */
+    if(total_chunks == 1) {
+        H5SL_node_t *chunk_node;        /* Pointer to chunk node for selection */
+        H5S_t *fspace;                  /* Dataspace describing chunk & selection in it */
+        H5S_t *mspace;                  /* Dataspace describing selection in memory corresponding to this chunk */
+
+        /* Check for this process having selection in this chunk */
+        chunk_node = H5SL_first(fm->sel_chunks);
+
+        if(chunk_node == NULL) {
+            /* Set the dataspace info for I/O to NULL, this process doesn't have any I/O to perform */
+            fspace = mspace = NULL;
+
+            /* Initialize chunk address */
+            ctg_store.contig.dset_addr = 0;
+        } /* end if */
+        else {
+            H5D_chunk_ud_t udata;           /* User data for querying chunk info */
+            H5D_chunk_info_t *chunk_info;   /* Info for chunk in skiplist */
+
+            /* Get the chunk info, for the selection in the chunk */
+            if(NULL == (chunk_info = (H5D_chunk_info_t *)H5SL_item(chunk_node)))
+                HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk info from skip list")
+
+            /* Set the dataspace info for I/O */
+            fspace = chunk_info->fspace;
+            mspace = chunk_info->mspace;
+
+            /* Look up address of chunk */
+            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords,
+                    chunk_info->index, &udata) < 0)
+                HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk address")
+            ctg_store.contig.dset_addr = udata.addr;
+        } /* end else */
+
+        /* Set up the base storage address for this chunk */
+        io_info->store = &ctg_store;
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before inter_collective_io for total chunk = 1 \n");
+#endif
+
+        /* Perform I/O */
+        if(H5D__inter_collective_io(io_info, type_info, fspace, mspace) < 0)
+            HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't finish shared collective MPI-IO")
+    } /* end if */
+    else {
+        hsize_t mpi_buf_count;  /* Number of MPI types */
+        size_t num_chunk;       /* Number of chunks for this process */
+        size_t u;               /* Local index variable */
+
+        /* Get the number of chunks with a selection */
+        num_chunk = H5SL_count(fm->sel_chunks);
+        H5_CHECK_OVERFLOW(num_chunk, size_t, int);
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"total_chunks = %Zu, num_chunk = %Zu\n", total_chunks, num_chunk);
+#endif
+
+        /* Set up MPI datatype for chunks selected */
+        if(num_chunk) {
+            /* Allocate chunking information */
+            if(NULL == (chunk_addr_info_array = (H5D_chunk_addr_info_t *)H5MM_malloc(num_chunk * sizeof(H5D_chunk_addr_info_t))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk array buffer")
+            if(NULL == (chunk_mtype           = (MPI_Datatype *)H5MM_malloc(num_chunk * sizeof(MPI_Datatype))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk memory datatype buffer")
+            if(NULL == (chunk_ftype           = (MPI_Datatype *)H5MM_malloc(num_chunk * sizeof(MPI_Datatype))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk file datatype buffer")
+            if(NULL == (chunk_disp_array      = (MPI_Aint *)H5MM_malloc(num_chunk * sizeof(MPI_Aint))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk file displacement buffer")
+            if(NULL == (chunk_mem_disp_array  = (MPI_Aint *)H5MM_calloc(num_chunk * sizeof(MPI_Aint))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk memory displacement buffer")
+            if(NULL == (chunk_mpi_mem_counts        = (int *)H5MM_calloc(num_chunk * sizeof(int))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk memory counts buffer")
+            if(NULL == (chunk_mpi_file_counts       = (int *)H5MM_calloc(num_chunk * sizeof(int))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk file counts buffer")
+            if(NULL == (chunk_mbt_is_derived_array  = (hbool_t *)H5MM_calloc(num_chunk * sizeof(hbool_t))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk memory is derived datatype flags buffer")
+            if(NULL == (chunk_mft_is_derived_array  = (hbool_t *)H5MM_calloc(num_chunk * sizeof(hbool_t))))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate chunk file is derived datatype flags buffer")
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before sorting the chunk address \n");
+#endif
+            /* Sort the chunk address */
+            if(H5D__sort_chunk(io_info, fm, chunk_addr_info_array, sum_chunk) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSWAP, FAIL, "unable to sort chunk address")
+            ctg_store.contig.dset_addr = chunk_addr_info_array[0].chunk_addr;
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"after sorting the chunk address \n");
+#endif
+
+            /* Obtain MPI derived datatype from all individual chunks */
+            for(u = 0; u < num_chunk; u++) {
+                hsize_t *permute_map = NULL; /* array that holds the mapping from the old, 
+                                                out-of-order displacements to the in-order 
+                                                displacements of the MPI datatypes of the 
+                                                point selection of the file space */
+                hbool_t is_permuted = FALSE;
+
+                /* Obtain disk and memory MPI derived datatype */
+                /* NOTE: The permute_map array can be allocated within H5S_mpio_space_type
+                 *              and will be fed into the next call to H5S_mpio_space_type
+                 *              where it will be freed.
+                 */
+                if(H5S_mpio_space_type(chunk_addr_info_array[u].chunk_info.fspace,
+                                       type_info->src_type_size, 
+                                       &chunk_ftype[u], /* OUT: datatype created */ 
+                                       &chunk_mpi_file_counts[u], /* OUT */
+                                       &(chunk_mft_is_derived_array[u]), /* OUT */
+                                       TRUE, /* this is a file space,
+                                                so permute the
+                                                datatype if the point
+                                                selections are out of
+                                                order */
+                                       &permute_map,/* OUT: a map to indicate the
+                                                       permutation of points
+                                                       selected in case they
+                                                       are out of order */
+                                       &is_permuted /* OUT */) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create MPI file type")
+                /* Sanity check */
+                if(is_permuted)
+                    HDassert(permute_map);
+                if(H5S_mpio_space_type(chunk_addr_info_array[u].chunk_info.mspace,
+                                       type_info->dst_type_size, &chunk_mtype[u], 
+                                       &chunk_mpi_mem_counts[u], 
+                                       &(chunk_mbt_is_derived_array[u]), 
+                                       FALSE, /* this is a memory
+                                                 space, so if the file
+                                                 space is not
+                                                 permuted, there is no
+                                                 need to permute the
+                                                 datatype if the point
+                                                 selections are out of
+                                                 order*/
+                                       &permute_map, /* IN: the permutation map
+                                                        generated by the
+                                                        file_space selection
+                                                        and applied to the
+                                                        memory selection */
+                                       &is_permuted /* IN */) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create MPI buf type")
+                /* Sanity check */
+                if(is_permuted)
+                    HDassert(!permute_map);
+
+                /* Chunk address relative to the first chunk */
+                chunk_addr_info_array[u].chunk_addr -= ctg_store.contig.dset_addr;
+
+                /* Assign chunk address to MPI displacement */
+                /* (assume MPI_Aint big enough to hold it) */
+                chunk_disp_array[u] = (MPI_Aint)chunk_addr_info_array[u].chunk_addr;
+            } /* end for */
+
+            /* Create final MPI derived datatype for the file */
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_create_struct((int)num_chunk, chunk_mpi_file_counts, chunk_disp_array, chunk_ftype, &chunk_final_ftype)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_struct failed", mpi_code)
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&chunk_final_ftype)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+            chunk_final_ftype_is_derived = TRUE;
+
+            /* Create final MPI derived datatype for memory */
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_create_struct((int)num_chunk, chunk_mpi_mem_counts, chunk_mem_disp_array, chunk_mtype, &chunk_final_mtype)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_struct failed", mpi_code)
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&chunk_final_mtype)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+            chunk_final_mtype_is_derived = TRUE;
+
+            /* Free the file & memory MPI datatypes for each chunk */
+            for(u = 0; u < num_chunk; u++) {
+                if(chunk_mbt_is_derived_array[u])
+                    if(MPI_SUCCESS != (mpi_code = MPI_Type_free(chunk_mtype + u)))
+                        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+
+                if(chunk_mft_is_derived_array[u])
+                    if(MPI_SUCCESS != (mpi_code = MPI_Type_free(chunk_ftype + u)))
+                        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+            } /* end for */
+
+            /* We have a single, complicated MPI datatype for both memory & file */
+            mpi_buf_count  = (hsize_t)1;
+        } /* end if */
+        else {      /* no selection at all for this process */
+            /* Allocate chunking information */
+            if(NULL == (total_chunk_addr_array = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * total_chunks)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate total chunk address arraybuffer")
+
+            /* Retrieve chunk address map */
+            if(H5D__chunk_addrmap(io_info, total_chunk_addr_array) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+
+            /* Get chunk with lowest address */
+            ctg_store.contig.dset_addr = HADDR_MAX;
+            for(u = 0; u < total_chunks; u++)
+                if(total_chunk_addr_array[u] < ctg_store.contig.dset_addr)
+                    ctg_store.contig.dset_addr = total_chunk_addr_array[u];
+            HDassert(ctg_store.contig.dset_addr != HADDR_MAX);
+
+            /* Set the MPI datatype */
+            chunk_final_ftype = MPI_BYTE;
+            chunk_final_mtype = MPI_BYTE;
+
+            /* No chunks selected for this process */
+            mpi_buf_count  = (hsize_t)0;
+        } /* end else */
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before coming to final collective IO\n");
+#endif
+
+        /* Set up the base storage address for this chunk */
+        io_info->store = &ctg_store;
+
+        /* Perform final collective I/O operation */
+        if(H5D__final_collective_io(io_info, type_info, mpi_buf_count, &chunk_final_ftype, &chunk_final_mtype) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish MPI-IO")
+    } /* end else */
+
+done:
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before freeing memory inside H5D_link_collective_io ret_value = %d\n", ret_value);
+#endif
+    /* Release resources */
+    if(total_chunk_addr_array)
+        H5MM_xfree(total_chunk_addr_array);
+    if(chunk_addr_info_array)
+        H5MM_xfree(chunk_addr_info_array);
+    if(chunk_mtype)
+        H5MM_xfree(chunk_mtype);
+    if(chunk_ftype)
+        H5MM_xfree(chunk_ftype);
+    if(chunk_disp_array)
+        H5MM_xfree(chunk_disp_array);
+    if(chunk_mem_disp_array)
+        H5MM_xfree(chunk_mem_disp_array);
+    if(chunk_mpi_mem_counts)
+        H5MM_xfree(chunk_mpi_mem_counts);
+    if(chunk_mpi_file_counts)
+        H5MM_xfree(chunk_mpi_file_counts);
+    if(chunk_mbt_is_derived_array)
+        H5MM_xfree(chunk_mbt_is_derived_array);
+    if(chunk_mft_is_derived_array)
+        H5MM_xfree(chunk_mft_is_derived_array);
+
+    /* Free the MPI buf and file types, if they were derived */
+    if(chunk_final_mtype_is_derived && MPI_SUCCESS != (mpi_code = MPI_Type_free(&chunk_final_mtype)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+    if(chunk_final_ftype_is_derived && MPI_SUCCESS != (mpi_code = MPI_Type_free(&chunk_final_ftype)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__link_chunk_collective_io */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__multi_chunk_collective_io
+ *
+ * Purpose:     To do IO per chunk according to IO mode(collective/independent/none)
+ *
+ *              1. Use MPI_gather and MPI_Bcast to obtain IO mode in each chunk(collective/independent/none)
+ *              2. Depending on whether the IO mode is collective or independent or none,
+ *                 Create either MPI derived datatype for each chunk or just do independent IO
+ *              3. Use common collective IO routine to do MPI-IO
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ * Modification:
+ *  - Set H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME dxpl in this to go along with
+ *    setting H5D_MPIO_ACTUAL_IO_MODE_NAME dxpl at the bottom.
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__multi_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    H5D_chunk_map_t *fm, H5P_genplist_t *dx_plist)
+{
+    H5D_io_info_t       ctg_io_info;          /* Contiguous I/O info object */
+    H5D_storage_t       ctg_store;            /* Chunk storage information as contiguous dataset */
+    H5D_io_info_t       cpt_io_info;          /* Compact I/O info object */
+    H5D_storage_t       cpt_store;            /* Chunk storage information as compact dataset */
+    hbool_t             cpt_dirty;            /* Temporary placeholder for compact storage "dirty" flag */
+    uint8_t            *chunk_io_option = NULL;
+    haddr_t            *chunk_addr = NULL;
+    H5D_storage_t       store;                /* union of EFL and chunk pointer in file space */
+    H5FD_mpio_xfer_t    last_xfer_mode = H5FD_MPIO_COLLECTIVE; /* Last parallel transfer for this request (H5D_XFER_IO_XFER_MODE_NAME) */
+    H5FD_mpio_collective_opt_t last_coll_opt_mode = H5FD_MPIO_COLLECTIVE_IO; /* Last parallel transfer with independent IO or collective IO with this mode */
+    size_t              total_chunk;          /* Total # of chunks in dataset */
+#ifdef H5Dmpio_DEBUG
+    int mpi_rank;
+#endif
+    size_t              u;                    /* Local index variable */
+    H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode = H5D_MPIO_MULTI_CHUNK;  /* actual chunk optimization mode */
+    H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_NO_COLLECTIVE; /* Local variable for tracking the I/O mode used. */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Set the actual chunk opt mode property */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
+
+#ifdef H5Dmpio_DEBUG
+    mpi_rank = H5F_mpi_get_rank(io_info->dset->oloc.file);
+#endif
+
+    /* Retrieve total # of chunks in dataset */
+    H5_CHECKED_ASSIGN(total_chunk, size_t, fm->layout->u.chunk.nchunks, hsize_t);
+    HDassert(total_chunk != 0);
+
+    /* Allocate memories */
+    chunk_io_option = (uint8_t *)H5MM_calloc(total_chunk);
+    chunk_addr      = (haddr_t *)H5MM_calloc(total_chunk * sizeof(haddr_t));
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D), "total_chunk %Zu\n", total_chunk);
+#endif
+
+    /* Obtain IO option for each chunk */
+    if(H5D__obtain_mpio_mode(io_info, fm, dx_plist, chunk_io_option, chunk_addr) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTRECV, FAIL, "unable to obtain MPIO mode")
+
+    /* Set up contiguous I/O info object */
+    HDmemcpy(&ctg_io_info, io_info, sizeof(ctg_io_info));
+    ctg_io_info.store = &ctg_store;
+    ctg_io_info.layout_ops = *H5D_LOPS_CONTIG;
+
+    /* Initialize temporary contiguous storage info */
+    ctg_store.contig.dset_size = (hsize_t)io_info->dset->shared->layout.u.chunk.size;
+
+    /* Set up compact I/O info object */
+    HDmemcpy(&cpt_io_info, io_info, sizeof(cpt_io_info));
+    cpt_io_info.store = &cpt_store;
+    cpt_io_info.layout_ops = *H5D_LOPS_COMPACT;
+
+    /* Initialize temporary compact storage info */
+    cpt_store.compact.dirty = &cpt_dirty;
+
+    /* Set dataset storage for I/O info */
+    io_info->store = &store;
+
+    /* Loop over _all_ the chunks */
+    for(u = 0; u < total_chunk; u++) {
+        H5D_chunk_info_t *chunk_info;    /* Chunk info for current chunk */
+        H5S_t *fspace;              /* Dataspace describing chunk & selection in it */
+        H5S_t *mspace;              /* Dataspace describing selection in memory corresponding to this chunk */
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"mpi_rank = %d, chunk index = %Zu\n", mpi_rank, u);
+#endif
+        /* Get the chunk info for this chunk, if there are elements selected */
+        chunk_info = fm->select_chunk[u];
+
+        /* Set the storage information for chunks with selections */
+        if(chunk_info) {
+            HDassert(chunk_info->index == u);
+
+            /* Pass in chunk's coordinates in a union. */
+            store.chunk.offset  = chunk_info->coords;
+            store.chunk.index   = chunk_info->index;
+        } /* end if */
+
+        /* Collective IO for this chunk,
+         * Note: even there is no selection for this process, the process still
+         *      needs to contribute MPI NONE TYPE.
+         */
+        if(chunk_io_option[u] == H5D_CHUNK_IO_MODE_COL) {
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"inside collective chunk IO mpi_rank = %d, chunk index = %Zu\n", mpi_rank, u);
+#endif
+
+            /* Set the file & memory dataspaces */
+            if(chunk_info) {
+                fspace = chunk_info->fspace;
+                mspace = chunk_info->mspace;
+
+                /* Update the local variable tracking the dxpl's actual io mode property.
+                 *
+                 * Note: H5D_MPIO_COLLECTIVE_MULTI | H5D_MPIO_INDEPENDENT = H5D_MPIO_MIXED
+                 *      to ease switching between to mixed I/O without checking the current
+                 *      value of the property. You can see the definition in H5Ppublic.h
+                 */
+                actual_io_mode = actual_io_mode | H5D_MPIO_CHUNK_COLLECTIVE;
+
+            } /* end if */
+            else {
+                fspace = mspace = NULL;
+            } /* end else */
+
+            /* Switch back to collective I/O */
+            if(last_xfer_mode != H5FD_MPIO_COLLECTIVE) {
+                if(H5D__ioinfo_xfer_mode(io_info, dx_plist, H5FD_MPIO_COLLECTIVE) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't switch to collective I/O")
+                last_xfer_mode = H5FD_MPIO_COLLECTIVE;
+            } /* end if */
+            if(last_coll_opt_mode != H5FD_MPIO_COLLECTIVE_IO) {
+                if(H5D__ioinfo_coll_opt_mode(io_info, dx_plist, H5FD_MPIO_COLLECTIVE_IO) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't switch to collective I/O")
+                last_coll_opt_mode = H5FD_MPIO_COLLECTIVE_IO;
+            } /* end if */
+
+            /* Initialize temporary contiguous storage address */
+            ctg_store.contig.dset_addr = chunk_addr[u];
+
+            /* Perform the I/O */
+            if(H5D__inter_collective_io(&ctg_io_info, type_info, fspace, mspace) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish shared collective MPI-IO")
+        } /* end if */
+        else {  /* possible independent IO for this chunk */
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"inside independent IO mpi_rank = %d, chunk index = %Zu\n", mpi_rank, u);
+#endif
+
+            HDassert(chunk_io_option[u] == 0);
+
+            /* Set the file & memory dataspaces */
+            if(chunk_info) {
+                fspace = chunk_info->fspace;
+                mspace = chunk_info->mspace;
+
+                /* Update the local variable tracking the dxpl's actual io mode. */
+                actual_io_mode = actual_io_mode | H5D_MPIO_CHUNK_INDEPENDENT;
+            } /* end if */
+            else {
+                fspace = mspace = NULL;
+            } /* end else */
+
+            /* Using independent I/O with file setview.*/
+            if(last_coll_opt_mode != H5FD_MPIO_INDIVIDUAL_IO) {
+                if(H5D__ioinfo_coll_opt_mode(io_info, dx_plist, H5FD_MPIO_INDIVIDUAL_IO) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't switch to individual I/O")
+                last_coll_opt_mode = H5FD_MPIO_INDIVIDUAL_IO;
+            } /* end if */
+
+            /* Initialize temporary contiguous storage address */
+            ctg_store.contig.dset_addr = chunk_addr[u];
+
+            /* Perform the I/O */
+            if(H5D__inter_collective_io(&ctg_io_info, type_info, fspace, mspace) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish shared collective MPI-IO")
+#ifdef H5D_DEBUG
+  if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"after inter collective IO\n");
+#endif
+        } /* end else */
+    } /* end for */
+
+    /* Write the local value of actual io mode to the DXPL. */
+    if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
+done:
+    if(chunk_io_option)
+        H5MM_xfree(chunk_io_option);
+    if(chunk_addr)
+        H5MM_xfree(chunk_addr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__multi_chunk_collective_io */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__inter_collective_io
+ *
+ * Purpose:     Routine for the shared part of collective IO between multiple chunk
+ *              collective IO and contiguous collective IO
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__inter_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    const H5S_t *file_space, const H5S_t *mem_space)
+{
+    int mpi_buf_count;                  /* # of MPI types */
+    hbool_t mbt_is_derived = FALSE;
+    hbool_t mft_is_derived = FALSE;
+    MPI_Datatype        mpi_file_type, mpi_buf_type;
+    int                 mpi_code;       /* MPI return code */
+    herr_t       ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_STATIC
+
+    if((file_space != NULL) && (mem_space != NULL)) {
+        int  mpi_file_count;         /* Number of file "objects" to transfer */
+        hsize_t *permute_map = NULL; /* array that holds the mapping from the old, 
+                                        out-of-order displacements to the in-order 
+                                        displacements of the MPI datatypes of the 
+                                        point selection of the file space */
+        hbool_t is_permuted = FALSE;
+
+        /* Obtain disk and memory MPI derived datatype */
+        /* NOTE: The permute_map array can be allocated within H5S_mpio_space_type
+         *              and will be fed into the next call to H5S_mpio_space_type
+         *              where it will be freed.
+         */
+        if(H5S_mpio_space_type(file_space, type_info->src_type_size, 
+                               &mpi_file_type, &mpi_file_count, &mft_is_derived, /* OUT: datatype created */  
+                               TRUE, /* this is a file space, so
+                                        permute the datatype if the
+                                        point selection is out of
+                                        order */
+                               &permute_map, /* OUT: a map to indicate
+                                                the permutation of
+                                                points selected in
+                                                case they are out of
+                                                order */ 
+                               &is_permuted /* OUT */) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create MPI file type")
+        /* Sanity check */
+        if(is_permuted)
+            HDassert(permute_map);
+        if(H5S_mpio_space_type(mem_space, type_info->src_type_size, 
+                               &mpi_buf_type, &mpi_buf_count, &mbt_is_derived, /* OUT: datatype created */
+                               FALSE, /* this is a memory space, so if
+                                         the file space is not
+                                         permuted, there is no need to
+                                         permute the datatype if the
+                                         point selections are out of
+                                         order*/
+                               &permute_map /* IN: the permutation map
+                                               generated by the
+                                               file_space selection
+                                               and applied to the
+                                               memory selection */, 
+                               &is_permuted /* IN */) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create MPI buffer type")
+        /* Sanity check */
+        if(is_permuted)
+            HDassert(!permute_map);
+    } /* end if */
+    else {
+        /* For non-selection, participate with a none MPI derived datatype, the count is 0.  */
+        mpi_buf_type   = MPI_BYTE;
+        mpi_file_type  = MPI_BYTE;
+        mpi_buf_count  = 0;
+        mbt_is_derived = FALSE;
+        mft_is_derived = FALSE;
+    } /* end else */
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before final collective IO \n");
+#endif
+
+    /* Perform final collective I/O operation */
+    if(H5D__final_collective_io(io_info, type_info, (hsize_t)mpi_buf_count, &mpi_file_type, &mpi_buf_type) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish collective MPI-IO")
+
+done:
+    /* Free the MPI buf and file types, if they were derived */
+    if(mbt_is_derived && MPI_SUCCESS != (mpi_code = MPI_Type_free(&mpi_buf_type)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+    if(mft_is_derived && MPI_SUCCESS != (mpi_code = MPI_Type_free(&mpi_file_type)))
+        HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"before leaving inter_collective_io ret_value = %d\n",ret_value);
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__inter_collective_io() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__final_collective_io
+ *
+ * Purpose:     Routine for the common part of collective IO with different storages.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__final_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t mpi_buf_count, MPI_Datatype *mpi_file_type, MPI_Datatype *mpi_buf_type)
+{
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Pass buf type, file type to the file driver.  */
+    if(H5FD_mpi_setup_collective(io_info->dxpl_id, mpi_buf_type, mpi_file_type) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O properties")
+
+    if(io_info->op_type == H5D_IO_OP_WRITE) {
+        if((io_info->io_ops.single_write)(io_info, type_info, mpi_buf_count, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "optimized write failed")
+    } /* end if */
+    else {
+        if((io_info->io_ops.single_read)(io_info, type_info, mpi_buf_count, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "optimized read failed")
+    } /* end else */
+
+done:
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D),"ret_value before leaving final_collective_io=%d\n",ret_value);
+#endif
+      FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__final_collective_io */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__cmp_chunk_addr
+ *
+ * Purpose:     Routine to compare chunk addresses
+ *
+ * Description: Callback for qsort() to compare chunk addresses
+ *
+ * Return:      -1, 0, 1
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__cmp_chunk_addr(const void *chunk_addr_info1, const void *chunk_addr_info2)
+{
+   haddr_t addr1, addr2;
+
+   FUNC_ENTER_STATIC_NOERR
+
+   addr1 = ((const H5D_chunk_addr_info_t *)chunk_addr_info1)->chunk_addr;
+   addr2 = ((const H5D_chunk_addr_info_t *)chunk_addr_info2)->chunk_addr;
+
+   FUNC_LEAVE_NOAPI(H5F_addr_cmp(addr1, addr2))
+} /* end H5D__cmp_chunk_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__sort_chunk
+ *
+ * Purpose:     Routine to sort chunks in increasing order of chunk address
+ *              Each chunk address is also obtained.
+ *
+ * Description:
+ *              For most cases, the chunk address has already been sorted in increasing order.
+ *              The special sorting flag is used to optimize this common case.
+ *              quick sort is used for necessary sorting.
+ *
+ * Parameters:
+ *              Input: H5D_io_info_t* io_info,
+ *                      H5D_chunk_map_t *fm(global chunk map struct)
+ *              Input/Output:  H5D_chunk_addr_info_t chunk_addr_info_array[]   : array to store chunk address and information
+ *                     many_chunk_opt                         : flag to optimize the way to obtain chunk addresses
+ *                                                              for many chunks
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__sort_chunk(H5D_io_info_t *io_info, const H5D_chunk_map_t *fm,
+    H5D_chunk_addr_info_t chunk_addr_info_array[], int sum_chunk)
+{
+    H5SL_node_t    *chunk_node;         /* Current node in chunk skip list */
+    H5D_chunk_info_t *chunk_info;         /* Current chunking info. of this node. */
+    haddr_t         chunk_addr;         /* Current chunking address of this node */
+    haddr_t        *total_chunk_addr_array = NULL; /* The array of chunk address for the total number of chunk */
+    hbool_t         do_sort = FALSE;    /* Whether the addresses need to be sorted */
+    int             bsearch_coll_chunk_threshold;
+    int             many_chunk_opt = H5D_OBTAIN_ONE_CHUNK_ADDR_IND;
+    int             mpi_size;                   /* Number of MPI processes */
+    int             mpi_code;                   /* MPI return code */
+    int             i;                          /* Local index variable */
+    herr_t          ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Retrieve # of MPI processes */
+    if((mpi_size = H5F_mpi_get_size(io_info->dset->oloc.file)) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi size")
+
+    /* Calculate the actual threshold to obtain all chunk addresses collectively
+     *  The bigger this number is, the more possible the use of obtaining chunk
+     * address collectively.
+     */
+    /* For non-optimization one-link IO, actual bsearch threshold is always
+     *   0, we would always want to obtain the chunk addresses individually
+     *   for each process.
+     */
+    bsearch_coll_chunk_threshold = (sum_chunk * 100) / ((int)fm->layout->u.chunk.nchunks * mpi_size);
+    if((bsearch_coll_chunk_threshold > H5D_ALL_CHUNK_ADDR_THRES_COL)
+            && ((sum_chunk / mpi_size) >= H5D_ALL_CHUNK_ADDR_THRES_COL_NUM))
+        many_chunk_opt = H5D_OBTAIN_ALL_CHUNK_ADDR_COL;
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D), "many_chunk_opt= %d\n", many_chunk_opt);
+#endif
+
+    /* If we need to optimize the way to obtain the chunk address */
+    if(many_chunk_opt != H5D_OBTAIN_ONE_CHUNK_ADDR_IND) {
+        int mpi_rank;
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D), "Coming inside H5D_OBTAIN_ALL_CHUNK_ADDR_COL\n");
+#endif
+        /* Allocate array for chunk addresses */
+        if(NULL == (total_chunk_addr_array = H5MM_malloc(sizeof(haddr_t) * (size_t)fm->layout->u.chunk.nchunks)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory chunk address array")
+
+        /* Retrieve all the chunk addresses with process 0 */
+        if((mpi_rank = H5F_mpi_get_rank(io_info->dset->oloc.file)) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi rank")
+
+        if(mpi_rank == 0) {
+            if(H5D__chunk_addrmap(io_info, total_chunk_addr_array) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+        } /* end if */
+
+        /* Broadcasting the MPI_IO option info. and chunk address info. */
+        if(MPI_SUCCESS != (mpi_code = MPI_Bcast(total_chunk_addr_array, (int)(sizeof(haddr_t) * fm->layout->u.chunk.nchunks), MPI_BYTE, (int)0, io_info->comm)))
+           HMPI_GOTO_ERROR(FAIL, "MPI_BCast failed", mpi_code)
+    } /* end if */
+
+    /* Start at first node in chunk skip list */
+    i = 0;
+    if(NULL == (chunk_node = H5SL_first(fm->sel_chunks)))
+        HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL,"couldn't get chunk node from skipped list")
+
+    /* Iterate over all chunks for this process */
+    while(chunk_node) {
+        if(NULL == (chunk_info = H5SL_item(chunk_node)))
+            HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL,"couldn't get chunk info from skipped list")
+
+        if(many_chunk_opt == H5D_OBTAIN_ONE_CHUNK_ADDR_IND) {
+            H5D_chunk_ud_t udata;   /* User data for querying chunk info */
+
+            /* Get address of chunk */
+            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id,
+                    chunk_info->coords, chunk_info->index, &udata) < 0)
+                HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk info from skipped list")
+            chunk_addr = udata.addr;
+        } /* end if */
+        else
+            chunk_addr = total_chunk_addr_array[chunk_info->index];
+
+        /* Check if chunk addresses are not in increasing order in the file */
+        if(i > 0 && chunk_addr < chunk_addr_info_array[i - 1].chunk_addr)
+            do_sort = TRUE;
+
+        /* Set the address & info for this chunk */
+        chunk_addr_info_array[i].chunk_addr = chunk_addr;
+        chunk_addr_info_array[i].chunk_info = *chunk_info;
+
+        /* Advance to next chunk in list */
+        i++;
+        chunk_node = H5SL_next(chunk_node);
+    } /* end while */
+
+#ifdef H5D_DEBUG
+if(H5DEBUG(D))
+    HDfprintf(H5DEBUG(D), "before Qsort\n");
+#endif
+    if(do_sort) {
+        size_t num_chunks = H5SL_count(fm->sel_chunks);
+
+        HDqsort(chunk_addr_info_array, num_chunks, sizeof(chunk_addr_info_array[0]), H5D__cmp_chunk_addr);
+    } /* end if */
+
+done:
+    if(total_chunk_addr_array)
+        H5MM_xfree(total_chunk_addr_array);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__sort_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__obtain_mpio_mode
+ *
+ * Purpose:     Routine to obtain each io mode(collective,independent or none) for each chunk;
+ *              Each chunk address is also obtained.
+ *
+ * Description:
+ *
+ *              1) Each process provides two piece of information for all chunks having selection
+ *                 a) chunk index
+ *                 b) wheather this chunk is regular(for MPI derived datatype not working case)
+ *
+ *              2) Gather all the information to the root process
+ *
+ *              3) Root process will do the following:
+ *                 a) Obtain chunk addresses for all chunks in this data space
+ *                 b) With the consideration of the user option, calculate IO mode for each chunk
+ *                 c) Build MPI derived datatype to combine "chunk address" and "assign_io" information
+ *                      in order to do MPI Bcast only once
+ *                 d) MPI Bcast the IO mode and chunk address information for each chunk.
+ *              4) Each process then retrieves IO mode and chunk address information to assign_io_mode and chunk_addr.
+ *
+ * Parameters:
+ *
+ *              Input: H5D_io_info_t* io_info,
+ *                      H5D_chunk_map_t *fm,(global chunk map struct)
+ *              Output: uint8_t assign_io_mode[], : IO mode, collective, independent or none
+ *                      haddr_t chunk_addr[],     : chunk address array for each chunk
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Muqun Yang
+ *              Monday, Feb. 13th, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__obtain_mpio_mode(H5D_io_info_t* io_info, H5D_chunk_map_t *fm,
+    H5P_genplist_t *dx_plist, uint8_t assign_io_mode[], haddr_t chunk_addr[])
+{
+    int               total_chunks;
+    unsigned          percent_nproc_per_chunk, threshold_nproc_per_chunk;
+    uint8_t*          io_mode_info = NULL;
+    uint8_t*          recv_io_mode_info = NULL;
+    uint8_t*          mergebuf = NULL;
+    uint8_t*          tempbuf;
+    H5SL_node_t*      chunk_node;
+    H5D_chunk_info_t* chunk_info;
+    int               mpi_size, mpi_rank;
+    MPI_Comm          comm;
+    int               ic, root;
+    int               mpi_code;
+    hbool_t           mem_cleanup      = FALSE;
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+    int new_value;
+    htri_t check_prop;
+#endif
+    herr_t            ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Assign the rank 0 to the root */
+    root              = 0;
+    comm              = io_info->comm;
+
+    /* Obtain the number of process and the current rank of the process */
+    if((mpi_rank = H5F_mpi_get_rank(io_info->dset->oloc.file)) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi rank")
+    if((mpi_size = H5F_mpi_get_size(io_info->dset->oloc.file)) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi size")
+
+    /* Setup parameters */
+    H5_CHECKED_ASSIGN(total_chunks, int, fm->layout->u.chunk.nchunks, hsize_t);
+    percent_nproc_per_chunk = H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME);
+    /* if ratio is 0, perform collective io */
+    if(0 == percent_nproc_per_chunk) {
+        if(H5D__chunk_addrmap(io_info, chunk_addr) < 0)
+           HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address");
+        for(ic = 0; ic < total_chunks; ic++)
+           assign_io_mode[ic] = H5D_CHUNK_IO_MODE_COL;
+
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
+    threshold_nproc_per_chunk = mpi_size * percent_nproc_per_chunk/100;
+
+    /* Allocate memory */
+    io_mode_info      = (uint8_t *)H5MM_calloc(total_chunks);
+    mergebuf          = H5MM_malloc((sizeof(haddr_t) + 1) * total_chunks);
+    tempbuf           = mergebuf + total_chunks;
+    if(mpi_rank == root)
+        recv_io_mode_info = (uint8_t *)H5MM_malloc(total_chunks * mpi_size);
+    mem_cleanup       = TRUE;
+
+    /* Obtain the regularity and selection information for all chunks in this process. */
+    chunk_node        = H5SL_first(fm->sel_chunks);
+    while(chunk_node) {
+        chunk_info    = H5SL_item(chunk_node);
+
+            io_mode_info[chunk_info->index] = H5D_CHUNK_SELECT_REG; /* this chunk is selected and is "regular" */
+        chunk_node = H5SL_next(chunk_node);
+    } /* end while */
+
+    /* Gather all the information */
+    if(MPI_SUCCESS != (mpi_code = MPI_Gather(io_mode_info, total_chunks, MPI_BYTE, recv_io_mode_info, total_chunks, MPI_BYTE, root, comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Gather failed", mpi_code)
+
+    /* Calculate the mode for IO(collective, independent or none) at root process */
+    if(mpi_rank == root) {
+        int               nproc;
+        int*              nproc_per_chunk;
+
+        /* pre-computing: calculate number of processes and
+            regularity of the selection occupied in each chunk */
+        nproc_per_chunk = (int*)H5MM_calloc(total_chunks * sizeof(int));
+
+        /* calculating the chunk address */
+        if(H5D__chunk_addrmap(io_info, chunk_addr) < 0) {
+            HDfree(nproc_per_chunk);
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+        } /* end if */
+
+        /* checking for number of process per chunk and regularity of the selection*/
+        for(nproc = 0; nproc < mpi_size; nproc++) {
+            uint8_t *tmp_recv_io_mode_info = recv_io_mode_info + (nproc * total_chunks);
+
+            /* Calculate the number of process per chunk and adding irregular selection option */
+            for(ic = 0; ic < total_chunks; ic++, tmp_recv_io_mode_info++) {
+                if(*tmp_recv_io_mode_info != 0) {
+                    nproc_per_chunk[ic]++;
+                } /* end if */
+            } /* end for */
+        } /* end for */
+
+        /* Calculating MPIO mode for each chunk (collective, independent, none) */
+        for(ic = 0; ic < total_chunks; ic++) {
+            if(nproc_per_chunk[ic] > MAX(1, threshold_nproc_per_chunk)) {
+                assign_io_mode[ic] = H5D_CHUNK_IO_MODE_COL;
+            } /* end if */
+        } /* end for */
+
+
+        /* merge buffer io_mode info and chunk addr into one */
+        HDmemcpy(mergebuf, assign_io_mode, total_chunks);
+        HDmemcpy(tempbuf, chunk_addr, sizeof(haddr_t) * total_chunks);
+
+        HDfree(nproc_per_chunk);
+    } /* end if */
+
+    /* Broadcasting the MPI_IO option info. and chunk address info. */
+    if(MPI_SUCCESS != (mpi_code = MPI_Bcast(mergebuf, ((sizeof(haddr_t) + 1) * total_chunks), MPI_BYTE, root, comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_BCast failed", mpi_code)
+
+    HDmemcpy(assign_io_mode, mergebuf, total_chunks);
+    HDmemcpy(chunk_addr, tempbuf, sizeof(haddr_t) * total_chunks);
+
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+{
+    H5P_genplist_t    *plist;           /* Property list pointer */
+
+    /* Get the dataset transfer property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(io_info->dxpl_id)))
+        HGOTO_ERROR(H5E_IO, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME);
+    if(check_prop > 0) {
+        for(ic = 0; ic < total_chunks; ic++) {
+            if(assign_io_mode[ic] == H5D_CHUNK_IO_MODE_COL) {
+                new_value = 0;
+                if(H5P_set(plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME, &new_value) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_UNSUPPORTED, FAIL, "unable to set property value")
+                break;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+    check_prop = H5P_exist_plist(plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME);
+    if(check_prop > 0) {
+        int temp_count = 0;
+
+        for(ic = 0; ic < total_chunks; ic++) {
+            if(assign_io_mode[ic] == H5D_CHUNK_IO_MODE_COL) {
+                temp_count++;
+                break;
+            } /* end if */
+        } /* end for */
+        if(temp_count == 0) {
+            new_value = 0;
+            if(H5P_set(plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME, &new_value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_UNSUPPORTED, FAIL, "unable to set property value")
+        } /* end if */
+    } /* end if */
+}
+#endif
+
+done:
+    if(mem_cleanup) {
+        HDfree(io_mode_info);
+        HDfree(mergebuf);
+        if(mpi_rank == root)
+            HDfree(recv_io_mode_info);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__obtain_mpio_mode() */
+#endif  /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Doh.c b/gatb-core/thirdparty/hdf5/src/H5Doh.c
new file mode 100644
index 0000000..62600b4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Doh.c
@@ -0,0 +1,481 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static void *H5O__dset_get_copy_file_udata(void);
+static void H5O__dset_free_copy_file_udata(void *);
+static htri_t H5O__dset_isa(H5O_t *loc);
+static hid_t H5O__dset_open(const H5G_loc_t *obj_loc, hid_t lapl_id,
+    hid_t dxpl_id, hbool_t app_ref);
+static void *H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
+    hid_t dxpl_id);
+static H5O_loc_t *H5O__dset_get_oloc(hid_t obj_id);
+static herr_t H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5_ih_info_t *bh_info);
+static herr_t H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* This message derives from H5O object class */
+const H5O_obj_class_t H5O_OBJ_DATASET[1] = {{
+    H5O_TYPE_DATASET,		/* object type			*/
+    "dataset",			/* object name, for debugging	*/
+    H5O__dset_get_copy_file_udata, /* get 'copy file' user data	*/
+    H5O__dset_free_copy_file_udata, /* free 'copy file' user data	*/
+    H5O__dset_isa, 		/* "isa" message		*/
+    H5O__dset_open, 		/* open an object of this class */
+    H5O__dset_create, 		/* create an object of this class */
+    H5O__dset_get_oloc, 	/* get an object header location for an object */
+    H5O__dset_bh_info, 		/* get the index & heap info for an object */
+    H5O__dset_flush 		/* flush an opened object of this class */
+}};
+
+/* Declare a free list to manage the H5D_copy_file_ud_t struct */
+H5FL_DEFINE(H5D_copy_file_ud_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_get_copy_file_udata
+ *
+ * Purpose:	Allocates the user data needed for copying a dataset's
+ *		object header from file to file.
+ *
+ * Return:	Success:	Non-NULL pointer to user data
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__dset_get_copy_file_udata(void)
+{
+    void *ret_value;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Allocate space for the 'copy file' user data for copying datasets */
+    if(NULL == (ret_value = H5FL_CALLOC(H5D_copy_file_ud_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_get_copy_file_udata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_free_copy_file_udata
+ *
+ * Purpose:	Release the user data needed for copying a dataset's
+ *		object header from file to file.
+ *
+ * Return:	<none>
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5O__dset_free_copy_file_udata(void *_udata)
+{
+    H5D_copy_file_ud_t *udata = (H5D_copy_file_ud_t *)_udata;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(udata);
+
+    /* Release copy of dataset's dataspace extent, if it was set */
+    if(udata->src_space_extent)
+        H5O_msg_free(H5O_SDSPACE_ID, udata->src_space_extent);
+
+    /* Release copy of dataset's datatype, if it was set */
+    if(udata->src_dtype)
+        H5T_close(udata->src_dtype);
+
+    /* Release copy of dataset's filter pipeline, if it was set */
+    if(udata->common.src_pline)
+        H5O_msg_free(H5O_PLINE_ID, udata->common.src_pline);
+
+    /* Release space for 'copy file' user data */
+    udata = H5FL_FREE(H5D_copy_file_ud_t, udata);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5O__dset_free_copy_file_udata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_isa
+ *
+ * Purpose:	Determines if an object has the requisite messages for being
+ *		a dataset.
+ *
+ * Return:	Success:	TRUE if the required dataset messages are
+ *				present; FALSE otherwise.
+ *
+ *		Failure:	FAIL if the existence of certain messages
+ *				cannot be determined.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, November  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O__dset_isa(H5O_t *oh)
+{
+    htri_t	exists;                 /* Flag if header message of interest exists */
+    htri_t	ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(oh);
+
+    /* Datatype */
+    if((exists = H5O_msg_exists_oh(oh, H5O_DTYPE_ID)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
+    else if(!exists)
+	HGOTO_DONE(FALSE)
+
+    /* Layout */
+    if((exists = H5O_msg_exists_oh(oh, H5O_SDSPACE_ID)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
+    else if(!exists)
+	HGOTO_DONE(FALSE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_isa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_open
+ *
+ * Purpose:	Open a dataset at a particular location
+ *
+ * Return:	Success:	Open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5O__dset_open(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t app_ref)
+{
+    H5D_t       *dset = NULL;           /* Dataset opened */
+    htri_t  isdapl;                 /* lapl_id is a dapl */
+    hid_t   dapl_id;                /* dapl to use to open this dataset */
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(obj_loc);
+
+    /* If the lapl passed in is a dapl, use it.  Otherwise, use the default dapl */
+    if(lapl_id == H5P_DEFAULT)
+        isdapl = FALSE;
+    else
+        if((isdapl = H5P_isa_class(lapl_id, H5P_DATASET_ACCESS)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOMPARE, FAIL, "unable to compare property list classes")
+
+    if(isdapl)
+        dapl_id = lapl_id;
+    else
+        dapl_id = H5P_DATASET_ACCESS_DEFAULT;
+
+    /* Open the dataset */
+    if(NULL == (dset = H5D_open(obj_loc, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
+
+    /* Register an ID for the dataset */
+    if((ret_value = H5I_register(H5I_DATASET, dset, app_ref)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataset")
+
+done:
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_create
+ *
+ * Purpose:	Create a dataset in a file
+ *
+ * Return:	Success:	Pointer to the dataset data structure
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, April 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+    H5D_obj_create_t *crt_info = (H5D_obj_create_t *)_crt_info; /* Dataset creation parameters */
+    H5D_t *dset = NULL;         /* New dataset created */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(crt_info);
+    HDassert(obj_loc);
+
+    /* Create the the dataset */
+    if(NULL == (dset = H5D__create(f, crt_info->type_id, crt_info->space, crt_info->dcpl_id, crt_info->dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create dataset")
+
+    /* Set up the new dataset's location */
+    if(NULL == (obj_loc->oloc = H5D_oloc(dset)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get object location of dataset")
+    if(NULL == (obj_loc->path = H5D_nameof(dset)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get path of dataset")
+
+    /* Set the return value */
+    ret_value = dset;
+
+done:
+    if(ret_value == NULL)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release dataset")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__dset_get_oloc
+ *
+ * Purpose:	Retrieve the object header location for an open object
+ *
+ * Return:	Success:	Pointer to object header location
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_loc_t *
+H5O__dset_get_oloc(hid_t obj_id)
+{
+    H5D_t       *dset;                  /* Dataset opened */
+    H5O_loc_t	*ret_value;             /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the dataset */
+    if(NULL == (dset = (H5D_t *)H5I_object(obj_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
+
+    /* Get the dataset's object header location */
+    if(NULL == (ret_value = H5D_oloc(dset)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_get_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__dset_bh_info
+ *
+ * Purpose:     Returns the amount of btree storage that is used for chunked
+ *              dataset.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *              July 11, 2007
+ *
+ * Modification:Raymond Lu
+ *              5 February, 2010
+ *              I added the call to H5O_msg_reset after H5D_chunk_bh_info 
+ *              to free the PLINE. 
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
+{
+    H5O_layout_t        layout;         	/* Data storage layout message */
+    H5O_pline_t         pline;                  /* I/O pipeline message */
+    H5O_efl_t           efl;			/* External File List message */
+    hbool_t             layout_read = FALSE;    /* Whether the layout message was read */
+    hbool_t             pline_read = FALSE;     /* Whether the I/O pipeline message was read */
+    hbool_t             efl_read = FALSE;       /* Whether the external file list message was read */
+    htri_t		exists;                 /* Flag if header message of interest exists */
+    herr_t      	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(bh_info);
+
+    /* Get the layout message from the object header */
+    if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_LAYOUT_ID, &layout))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find layout message")
+    layout_read = TRUE;
+
+    /* Check for chunked dataset storage */
+    if(layout.type == H5D_CHUNKED && H5D__chunk_is_space_alloc(&layout.storage)) {
+        /* Check for I/O pipeline message */
+        if((exists = H5O_msg_exists_oh(oh, H5O_PLINE_ID)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
+        else if(exists) {
+            if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_PLINE_ID, &pline))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find I/O pipeline message")
+            pline_read = TRUE;
+        } /* end else if */
+        else
+            HDmemset(&pline, 0, sizeof(pline));
+
+        if(H5D__chunk_bh_info(f, dxpl_id, &layout, &pline, &(bh_info->index_size)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't determine chunked dataset btree info")
+    } /* end if */
+
+    /* Check for External File List message in the object header */
+    if((exists = H5O_msg_exists_oh(oh, H5O_EFL_ID)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "unable to check for EFL message")
+
+    if(exists && H5D__efl_is_space_alloc(&layout.storage)) {
+        /* Start with clean EFL info */
+        HDmemset(&efl, 0, sizeof(efl));
+
+	/* Get External File List message from the object header */
+	if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_EFL_ID, &efl))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find EFL message")
+        efl_read = TRUE;
+
+	/* Get size of local heap for EFL message's file list */
+	if(H5D__efl_bh_info(f, dxpl_id, &efl, &(bh_info->heap_size)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't determine EFL heap info")
+    } /* end if */
+
+done:
+    /* Free messages, if they've been read in */
+    if(layout_read && H5O_msg_reset(H5O_LAYOUT_ID, &layout) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset data storage layout message")
+    if(pline_read && H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset I/O pipeline message")
+    if(efl_read && H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset external file list message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_bh_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__dset_flush
+ *
+ * Purpose:     To flush any dataset information cached in memory
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *              February 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+    H5D_t       *dset = NULL;          /* Dataset opened */
+    H5O_type_t 	obj_type;              /* Type of object at location */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(obj_loc);
+    HDassert(obj_loc->oloc);
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(obj_loc->oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
+
+    if(obj_type != H5O_TYPE_DATASET)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Open the dataset */
+    if(NULL == (dset = H5D_open(obj_loc, H5P_DATASET_ACCESS_DEFAULT, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
+    
+    if(H5D__flush_real(dset, dxpl_id) < 0)
+	HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
+
+done:
+    if(dset && H5D_close(dset) < 0)
+	HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dset_flush() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dpkg.h b/gatb-core/thirdparty/hdf5/src/H5Dpkg.h
new file mode 100644
index 0000000..ff01041
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dpkg.h
@@ -0,0 +1,718 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Monday, April 14, 2003
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5D package.  Source files outside the H5D package should
+ *		include H5Dprivate.h instead.
+ */
+#ifndef H5D_PACKAGE
+#error "Do not include this file outside the H5D package!"
+#endif
+
+#ifndef _H5Dpkg_H
+#define _H5Dpkg_H
+
+/* Get package's private header */
+#include "H5Dprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Gprivate.h"		/* Groups 			  	*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+#include "H5Tprivate.h"		/* Datatypes         			*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Set the minimum object header size to create objects with */
+#define H5D_MINHDR_SIZE 256
+
+/* [Simple] Macro to construct a H5D_io_info_t from it's components */
+#define H5D_BUILD_IO_INFO_WRT(io_info, ds, dxpl_c, dxpl_i, str, buf)    \
+    (io_info)->dset = ds;                                               \
+    (io_info)->dxpl_cache = dxpl_c;                                     \
+    (io_info)->dxpl_id = dxpl_i;                                        \
+    (io_info)->store = str;                                             \
+    (io_info)->op_type = H5D_IO_OP_WRITE;                               \
+    (io_info)->u.wbuf = buf
+#define H5D_BUILD_IO_INFO_RD(io_info, ds, dxpl_c, dxpl_i, str, buf)     \
+    (io_info)->dset = ds;                                               \
+    (io_info)->dxpl_cache = dxpl_c;                                     \
+    (io_info)->dxpl_id = dxpl_i;                                        \
+    (io_info)->store = str;                                             \
+    (io_info)->op_type = H5D_IO_OP_READ;                                \
+    (io_info)->u.rbuf = buf
+
+#define H5D_CHUNK_HASH(D, ADDR) H5F_addr_hash(ADDR, (D)->cache.chunk.nslots)
+
+/* Flags for marking aspects of a dataset dirty */
+#define H5D_MARK_SPACE  0x01
+#define H5D_MARK_LAYOUT  0x02
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Typedef for datatype information for raw data I/O operation */
+typedef struct H5D_type_info_t {
+    /* Initial values */
+    const H5T_t *mem_type;              /* Pointer to memory datatype */
+    const H5T_t *dset_type;             /* Pointer to dataset datatype */
+    H5T_path_t *tpath;                  /* Datatype conversion path */
+    hid_t src_type_id;                  /* Source datatype ID */
+    hid_t dst_type_id;                  /* Destination datatype ID */
+
+    /* Computed/derived values */
+    size_t src_type_size;		/* Size of source type	*/
+    size_t dst_type_size;	        /* Size of destination type*/
+    size_t max_type_size;	        /* Size of largest source/destination type */
+    hbool_t is_conv_noop;               /* Whether the type conversion is a NOOP */
+    hbool_t is_xform_noop;              /* Whether the data transform is a NOOP */
+    const H5T_subset_info_t *cmpd_subset;   /* Info related to the compound subset conversion functions */
+    H5T_bkg_t need_bkg;		        /* Type of background buf needed */
+    size_t request_nelmts;		/* Requested strip mine	*/
+    uint8_t *tconv_buf;	                /* Datatype conv buffer	*/
+    hbool_t tconv_buf_allocated;        /* Whether the type conversion buffer was allocated */
+    uint8_t *bkg_buf;	                /* Background buffer	*/
+    hbool_t bkg_buf_allocated;          /* Whether the background buffer was allocated */
+} H5D_type_info_t;
+
+/* Forward declaration of structs used below */
+struct H5D_io_info_t;
+struct H5D_chunk_map_t;
+
+/* Function pointers for I/O on particular types of dataset layouts */
+typedef herr_t (*H5D_layout_construct_func_t)(H5F_t *f, H5D_t *dset);
+typedef herr_t (*H5D_layout_init_func_t)(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
+    hid_t dapl_id);
+typedef hbool_t (*H5D_layout_is_space_alloc_func_t)(const H5O_storage_t *storage);
+typedef herr_t (*H5D_layout_io_init_func_t)(const struct H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    struct H5D_chunk_map_t *cm);
+typedef herr_t (*H5D_layout_read_func_t)(struct H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, struct H5D_chunk_map_t *fm);
+typedef herr_t (*H5D_layout_write_func_t)(struct H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, struct H5D_chunk_map_t *fm);
+typedef ssize_t (*H5D_layout_readvv_func_t)(const struct H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+typedef ssize_t (*H5D_layout_writevv_func_t)(const struct H5D_io_info_t *io_info,
+    size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
+    size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
+typedef herr_t (*H5D_layout_flush_func_t)(H5D_t *dataset, hid_t dxpl_id);
+typedef herr_t (*H5D_layout_io_term_func_t)(const struct H5D_chunk_map_t *cm);
+
+/* Typedef for grouping layout I/O routines */
+typedef struct H5D_layout_ops_t {
+    H5D_layout_construct_func_t construct;      /* Layout constructor for new datasets */
+    H5D_layout_init_func_t init;        /* Layout initializer for dataset */
+    H5D_layout_is_space_alloc_func_t is_space_alloc;    /* Query routine to determine if storage is allocated */
+    H5D_layout_io_init_func_t io_init;  /* I/O initialization routine */
+    H5D_layout_read_func_t ser_read;    /* High-level I/O routine for reading data in serial */
+    H5D_layout_write_func_t ser_write;  /* High-level I/O routine for writing data in serial */
+#ifdef H5_HAVE_PARALLEL
+    H5D_layout_read_func_t par_read;    /* High-level I/O routine for reading data in parallel */
+    H5D_layout_write_func_t par_write;  /* High-level I/O routine for writing data in parallel */
+#endif /* H5_HAVE_PARALLEL */
+    H5D_layout_readvv_func_t readvv;    /* Low-level I/O routine for reading data */
+    H5D_layout_writevv_func_t writevv;  /* Low-level I/O routine for writing data */
+    H5D_layout_flush_func_t flush;      /* Low-level I/O routine for flushing raw data */
+    H5D_layout_io_term_func_t io_term;  /* I/O shutdown routine */
+} H5D_layout_ops_t;
+
+/* Function pointers for either multiple or single block I/O access */
+typedef herr_t (*H5D_io_single_read_func_t)(const struct H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+typedef herr_t (*H5D_io_single_write_func_t)(const struct H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+/* Typedef for raw data I/O framework info */
+typedef struct H5D_io_ops_t {
+    H5D_layout_read_func_t multi_read;          /* High-level I/O routine for reading data */
+    H5D_layout_write_func_t multi_write;        /* High-level I/O routine for writing data */
+    H5D_io_single_read_func_t single_read;      /* I/O routine for reading single block */
+    H5D_io_single_write_func_t single_write;    /* I/O routine for writing single block */
+} H5D_io_ops_t;
+
+/* Typedefs for dataset storage information */
+typedef struct {
+    haddr_t dset_addr;      /* Address of dataset in file */
+    hsize_t dset_size;      /* Total size of dataset in file */
+} H5D_contig_storage_t;
+
+typedef struct {
+    hsize_t index;          /* "Index" of chunk in dataset (must be first for TBBT routines) */
+    hsize_t *offset;        /* Chunk's coordinates in elements */
+} H5D_chunk_storage_t;
+
+typedef struct {
+    void *buf;              /* Buffer for compact dataset */
+    hbool_t *dirty;         /* Pointer to dirty flag to mark */
+} H5D_compact_storage_t;
+
+typedef union H5D_storage_t {
+    H5D_contig_storage_t contig; /* Contiguous information for dataset */
+    H5D_chunk_storage_t chunk;  /* Chunk information for dataset */
+    H5D_compact_storage_t compact; /* Compact information for dataset */
+    H5O_efl_t   efl;            /* External file list information for dataset */
+} H5D_storage_t;
+
+/* Typedef for raw data I/O operation info */
+typedef enum H5D_io_op_type_t {
+    H5D_IO_OP_READ,         /* Read operation */
+    H5D_IO_OP_WRITE         /* Write operation */
+} H5D_io_op_type_t;
+
+typedef struct H5D_io_info_t {
+    const H5D_t *dset;          /* Pointer to dataset being operated on */
+#ifndef H5_HAVE_PARALLEL
+    const
+#endif /* H5_HAVE_PARALLEL */
+        H5D_dxpl_cache_t *dxpl_cache; /* Pointer to cached DXPL info */
+    hid_t dxpl_id;              /* Original DXPL ID */
+#ifdef H5_HAVE_PARALLEL
+    MPI_Comm comm;              /* MPI communicator for file */
+    hbool_t using_mpi_vfd;      /* Whether the file is using an MPI-based VFD */
+    struct {
+        H5FD_mpio_xfer_t xfer_mode; /* Parallel transfer for this request (H5D_XFER_IO_XFER_MODE_NAME) */
+        H5FD_mpio_collective_opt_t coll_opt_mode; /* Parallel transfer with independent IO or collective IO with this mode */
+        H5D_io_ops_t io_ops;    /* I/O operation function pointers */
+    } orig;
+#endif /* H5_HAVE_PARALLEL */
+    H5D_storage_t *store;       /* Dataset storage info */
+    H5D_layout_ops_t layout_ops;    /* Dataset layout I/O operation function pointers */
+    H5D_io_ops_t io_ops;        /* I/O operation function pointers */
+    H5D_io_op_type_t op_type;
+    union {
+        void *rbuf;             /* Pointer to buffer for read */
+        const void *wbuf;       /* Pointer to buffer to write */
+    } u;
+} H5D_io_info_t;
+
+
+/******************/
+/* Chunk typedefs */
+/******************/
+
+/* Typedef for chunked dataset index operation info */
+typedef struct H5D_chk_idx_info_t {
+    H5F_t *f;                   /* File pointer for operation */
+    hid_t dxpl_id;              /* DXPL ID for operation */
+    const H5O_pline_t *pline;   /* I/O pipeline info */
+    H5O_layout_chunk_t *layout;           /* Chunk layout description */
+    H5O_storage_chunk_t *storage;         /* Chunk storage description */
+} H5D_chk_idx_info_t;
+
+/*
+ * "Generic" chunk record.  Each chunk is keyed by the minimum logical
+ * N-dimensional coordinates and the datatype size of the chunk.
+ * The fastest-varying dimension is assumed to reference individual bytes of
+ * the array, so a 100-element 1-D array of 4-byte integers would really be a
+ * 2-D array with the slow varying dimension of size 100 and the fast varying
+ * dimension of size 4 (the storage dimensionality has very little to do with
+ * the real dimensionality).
+ *
+ * The chunk's file address, filter mask and size on disk are not key values.
+ */
+typedef struct H5D_chunk_rec_t {
+    uint32_t	nbytes;				/* Size of stored data	*/
+    hsize_t	offset[H5O_LAYOUT_NDIMS];	/* Logical offset to start */
+    unsigned	filter_mask;			/* Excluded filters	*/
+    haddr_t     chunk_addr;                     /* Address of chunk in file */
+} H5D_chunk_rec_t;
+
+/*
+ * Common data exchange structure for indexed storage nodes.  This structure is
+ * passed through the indexing layer to the methods for the objects
+ * to which the index points.
+ */
+typedef struct H5D_chunk_common_ud_t {
+    /* downward */
+    const H5O_layout_chunk_t *layout;           /* Chunk layout description */
+    const H5O_storage_chunk_t *storage;         /* Chunk storage description */
+    const hsize_t *offset;	                /* Logical offset of chunk */
+    const struct H5D_rdcc_t *rdcc;              /* Chunk cache.  Only necessary if the index may
+                                                 * be modified, and if any chunks in the dset
+                                                 * may be cached */
+} H5D_chunk_common_ud_t;
+
+/* B-tree callback info for various operations */
+typedef struct H5D_chunk_ud_t {
+    H5D_chunk_common_ud_t common;       /* Common info for B-tree user data (must be first) */
+
+    /* Upward */
+    unsigned    idx_hint;               /*index of chunk in cache, if present */
+    uint32_t	nbytes;			/*size of stored data	*/
+    unsigned	filter_mask;		/*excluded filters	*/
+    haddr_t	addr;			/*file address of chunk */
+} H5D_chunk_ud_t;
+
+/* Typedef for "generic" chunk callbacks */
+typedef int (*H5D_chunk_cb_func_t)(const H5D_chunk_rec_t *chunk_rec,
+    void *udata);
+
+/* Typedefs for chunk operations */
+typedef herr_t (*H5D_chunk_init_func_t)(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+typedef herr_t (*H5D_chunk_create_func_t)(const H5D_chk_idx_info_t *idx_info);
+typedef hbool_t (*H5D_chunk_is_space_alloc_func_t)(const H5O_storage_chunk_t *storage);
+typedef herr_t (*H5D_chunk_insert_func_t)(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+typedef herr_t (*H5D_chunk_get_addr_func_t)(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+typedef herr_t (*H5D_chunk_resize_func_t)(H5O_layout_chunk_t *layout);
+typedef int (*H5D_chunk_iterate_func_t)(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+typedef herr_t (*H5D_chunk_remove_func_t)(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+typedef herr_t (*H5D_chunk_delete_func_t)(const H5D_chk_idx_info_t *idx_info);
+typedef herr_t (*H5D_chunk_copy_setup_func_t)(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+typedef herr_t (*H5D_chunk_copy_shutdown_func_t)(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id);
+typedef herr_t (*H5D_chunk_size_func_t)(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *idx_size);
+typedef herr_t (*H5D_chunk_reset_func_t)(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+typedef herr_t (*H5D_chunk_dump_func_t)(const H5O_storage_chunk_t *storage,
+    FILE *stream);
+typedef herr_t (*H5D_chunk_dest_func_t)(const H5D_chk_idx_info_t *idx_info);
+
+/* Typedef for grouping chunk I/O routines */
+typedef struct H5D_chunk_ops_t {
+    H5D_chunk_init_func_t init;             /* Routine to initialize indexing information in memory */
+    H5D_chunk_create_func_t create;         /* Routine to create chunk index */
+    H5D_chunk_is_space_alloc_func_t is_space_alloc;    /* Query routine to determine if storage/index is allocated */
+    H5D_chunk_insert_func_t insert;         /* Routine to insert a chunk into an index */
+    H5D_chunk_get_addr_func_t get_addr;     /* Routine to retrieve address of chunk in file */
+    H5D_chunk_resize_func_t resize;         /* Routine to update chunk index info after resizing dataset */
+    H5D_chunk_iterate_func_t iterate;       /* Routine to iterate over chunks */
+    H5D_chunk_remove_func_t remove;         /* Routine to remove a chunk from an index */
+    H5D_chunk_delete_func_t idx_delete;     /* Routine to delete index & all chunks from file*/
+    H5D_chunk_copy_setup_func_t copy_setup; /* Routine to perform any necessary setup for copying chunks */
+    H5D_chunk_copy_shutdown_func_t copy_shutdown; /* Routine to perform any necessary shutdown for copying chunks */
+    H5D_chunk_size_func_t size;             /* Routine to get size of indexing information */
+    H5D_chunk_reset_func_t reset;           /* Routine to reset indexing information */
+    H5D_chunk_dump_func_t dump;             /* Routine to dump indexing information */
+    H5D_chunk_dest_func_t dest;             /* Routine to destroy indexing information in memory */
+} H5D_chunk_ops_t;
+
+/* Structure holding information about a chunk's selection for mapping */
+typedef struct H5D_chunk_info_t {
+    hsize_t index;              /* "Index" of chunk in dataset */
+    uint32_t chunk_points;      /* Number of elements selected in chunk */
+    hsize_t coords[H5O_LAYOUT_NDIMS];   /* Coordinates of chunk in file dataset's dataspace */
+    H5S_t *fspace;              /* Dataspace describing chunk & selection in it */
+    unsigned fspace_shared;     /* Indicate that the file space for a chunk is shared and shouldn't be freed */
+    H5S_t *mspace;              /* Dataspace describing selection in memory corresponding to this chunk */
+    unsigned mspace_shared;     /* Indicate that the memory space for a chunk is shared and shouldn't be freed */
+} H5D_chunk_info_t;
+
+/* Main structure holding the mapping between file chunks and memory */
+typedef struct H5D_chunk_map_t {
+    H5O_layout_t *layout;       /* Dataset layout information*/
+    hsize_t nelmts;             /* Number of elements selected in file & memory dataspaces */
+
+    const H5S_t *file_space;    /* Pointer to the file dataspace */
+    unsigned f_ndims;           /* Number of dimensions for file dataspace */
+    hsize_t f_dims[H5O_LAYOUT_NDIMS];   /* File dataspace dimensions */
+
+    const H5S_t *mem_space;     /* Pointer to the memory dataspace */
+    H5S_t *mchunk_tmpl;         /* Dataspace template for new memory chunks */
+    H5S_sel_iter_t mem_iter;    /* Iterator for elements in memory selection */
+    unsigned m_ndims;           /* Number of dimensions for memory dataspace */
+    H5S_sel_type msel_type;     /* Selection type in memory */
+
+    H5SL_t *sel_chunks;         /* Skip list containing information for each chunk selected */
+
+    H5S_t  *single_space;       /* Dataspace for single chunk */
+    H5D_chunk_info_t *single_chunk_info;  /* Pointer to single chunk's info */
+    hbool_t use_single;         /* Whether I/O is on a single element */
+
+    hsize_t last_index;         /* Index of last chunk operated on */
+    H5D_chunk_info_t *last_chunk_info;  /* Pointer to last chunk's info */
+
+    hsize_t chunk_dim[H5O_LAYOUT_NDIMS];    /* Size of chunk in each dimension */
+
+#ifdef H5_HAVE_PARALLEL
+    H5D_chunk_info_t **select_chunk;    /* Store the information about whether this chunk is selected or not */
+#endif /* H5_HAVE_PARALLEL */
+} H5D_chunk_map_t;
+
+/* Cached information about a particular chunk */
+typedef struct H5D_chunk_cached_t {
+    hbool_t     valid;                          /*whether cache info is valid*/
+    hsize_t	offset[H5O_LAYOUT_NDIMS];	/*logical offset to start*/
+    uint32_t	nbytes;				/*size of stored data	*/
+    unsigned	filter_mask;			/*excluded filters	*/
+    haddr_t	addr;				/*file address of chunk */
+} H5D_chunk_cached_t;
+
+/* The raw data chunk cache */
+typedef struct H5D_rdcc_t {
+    struct {
+        unsigned	ninits;	/* Number of chunk creations		*/
+        unsigned	nhits;	/* Number of cache hits			*/
+        unsigned	nmisses;/* Number of cache misses		*/
+        unsigned	nflushes;/* Number of cache flushes		*/
+    } stats;
+    size_t		nbytes_max; /* Maximum cached raw data in bytes	*/
+    size_t		nslots;	/* Number of chunk slots allocated	*/
+    double		w0;     /* Chunk preemption policy          */
+    struct H5D_rdcc_ent_t *head; /* Head of doubly linked list		*/
+    struct H5D_rdcc_ent_t *tail; /* Tail of doubly linked list		*/
+    size_t		nbytes_used; /* Current cached raw data in bytes */
+    int			nused;	/* Number of chunk slots in use		*/
+    H5D_chunk_cached_t last;    /* Cached copy of last chunk information */
+    struct H5D_rdcc_ent_t **slot; /* Chunk slots, each points to a chunk*/
+    H5SL_t		*sel_chunks; /* Skip list containing information for each chunk selected */
+    H5S_t		*single_space; /* Dataspace for single element I/O on chunks */
+    H5D_chunk_info_t *single_chunk_info;  /* Pointer to single chunk's info */
+} H5D_rdcc_t;
+
+/* The raw data contiguous data cache */
+typedef struct H5D_rdcdc_t {
+    unsigned char *sieve_buf;   /* Buffer to hold data sieve buffer */
+    haddr_t sieve_loc;          /* File location (offset) of the data sieve buffer */
+    size_t sieve_size;          /* Size of the data sieve buffer used (in bytes) */
+    size_t sieve_buf_size;      /* Size of the data sieve buffer allocated (in bytes) */
+    hbool_t sieve_dirty;        /* Flag to indicate that the data sieve buffer is dirty */
+} H5D_rdcdc_t;
+
+/*
+ * A dataset is made of two layers, an H5D_t struct that is unique to
+ * each instance of an opened datset, and a shared struct that is only
+ * created once for a given dataset.  Thus, if a dataset is opened twice,
+ * there will be two IDs and two H5D_t structs, both sharing one H5D_shared_t.
+ */
+typedef struct H5D_shared_t {
+    size_t              fo_count;       /* Reference count */
+    hid_t               type_id;        /* ID for dataset's datatype    */
+    H5T_t              *type;           /* Datatype for this dataset     */
+    H5S_t              *space;          /* Dataspace of this dataset    */
+    hbool_t             space_dirty;    /* Whether the dataspace info needs to be flushed to the file */
+    hbool_t             layout_dirty;   /* Whether the layout info needs to be flushed to the file */
+    hid_t               dcpl_id;        /* Dataset creation property id */
+    H5D_dcpl_cache_t    dcpl_cache;     /* Cached DCPL values */
+    H5O_layout_t        layout;         /* Data layout                  */
+    hbool_t             checked_filters;/* TRUE if dataset passes can_apply check */
+
+    /* Buffered/cached information for types of raw data storage*/
+    struct {
+        H5D_rdcdc_t     contig;         /* Information about contiguous data */
+                                        /* (Note that the "contig" cache
+                                         * information can be used by a chunked
+                                         * dataset in certain circumstances)
+                                         */
+        H5D_rdcc_t      chunk;          /* Information about chunked data */
+    } cache;
+
+    char                *extfile_prefix; /* expanded external file prefix */
+} H5D_shared_t;
+
+struct H5D_t {
+    H5O_loc_t           oloc;           /* Object header location       */
+    H5G_name_t          path;           /* Group hierarchy path         */
+    H5D_shared_t        *shared;        /* cached information from file */
+};
+
+/* Enumerated type for allocating dataset's storage */
+typedef enum {
+    H5D_ALLOC_CREATE,           /* Dataset is being created */
+    H5D_ALLOC_OPEN,             /* Dataset is being opened */
+    H5D_ALLOC_EXTEND,           /* Dataset's dataspace is being extended */
+    H5D_ALLOC_WRITE             /* Dataset is being extended */
+} H5D_time_alloc_t;
+
+
+/* Typedef for dataset creation operation */
+typedef struct {
+    hid_t type_id;              /* Datatype for dataset */
+    const H5S_t *space;         /* Dataspace for dataset */
+    hid_t dcpl_id;              /* Dataset creation property list */
+    hid_t dapl_id;              /* Dataset access property list */
+} H5D_obj_create_t;
+
+/* Typedef for filling a buffer with a fill value */
+typedef struct H5D_fill_buf_info_t {
+    H5MM_allocate_t fill_alloc_func;    /* Routine to call for allocating fill buffer */
+    void        *fill_alloc_info;       /* Extra info for allocation routine */
+    H5MM_free_t fill_free_func;         /* Routine to call for freeing fill buffer */
+    void        *fill_free_info;        /* Extra info for free routine */
+    H5T_path_t *fill_to_mem_tpath;      /* Datatype conversion path for converting the fill value to the memory buffer */
+    H5T_path_t *mem_to_dset_tpath;      /* Datatype conversion path for converting the memory buffer to the dataset elements */
+    const H5O_fill_t *fill;             /* Pointer to fill value */
+    void       *fill_buf;               /* Fill buffer */
+    size_t      fill_buf_size;          /* Size of fill buffer */
+    hbool_t     use_caller_fill_buf;    /* Whether the caller provided the fill buffer */
+    void       *bkg_buf;                /* Background conversion buffer */
+    size_t      bkg_buf_size;           /* Size of background buffer */
+    H5T_t      *mem_type;               /* Pointer to memory datatype */
+    const H5T_t *file_type;             /* Pointer to file datatype */
+    hid_t       mem_tid;                /* ID for memory version of disk datatype */
+    hid_t       file_tid;               /* ID for disk datatype */
+    size_t      mem_elmt_size, file_elmt_size;       /* Size of element in memory and on disk */
+    size_t      max_elmt_size;          /* Max. size of memory or file datatype */
+    size_t      elmts_per_buf;          /* # of elements that fit into a buffer */
+    hbool_t     has_vlen_fill_type;     /* Whether the datatype for the fill value has a variable-length component */
+} H5D_fill_buf_info_t;
+
+/* Internal data structure for computing variable-length dataset's total size */
+typedef struct {
+    H5D_t *dset;        /* Dataset for operation */
+    H5S_t *fspace;      /* Dataset's dataspace for operation */
+    H5S_t *mspace;      /* Memory dataspace for operation */
+    void *fl_tbuf;      /* Ptr to the temporary buffer we are using for fixed-length data */
+    void *vl_tbuf;      /* Ptr to the temporary buffer we are using for VL data */
+    hid_t xfer_pid;     /* ID of the dataset xfer property list */
+    hsize_t size;       /* Accumulated number of bytes for the selection */
+} H5D_vlen_bufsize_t;
+
+/* Raw data chunks are cached.  Each entry in the cache is: */
+typedef struct H5D_rdcc_ent_t {
+    hbool_t	locked;		/*entry is locked in cache		*/
+    hbool_t	dirty;		/*needs to be written to disk?		*/
+    hbool_t     deleted;        /*chunk about to be deleted (do not flush) */
+    hsize_t	offset[H5O_LAYOUT_NDIMS]; /*chunk name			*/
+    uint32_t	rd_count;	/*bytes remaining to be read		*/
+    uint32_t	wr_count;	/*bytes remaining to be written		*/
+    haddr_t     chunk_addr;     /*address of chunk in file		*/
+    uint8_t	*chunk;		/*the unfiltered chunk data		*/
+    unsigned	idx;		/*index in hash table			*/
+    struct H5D_rdcc_ent_t *next;/*next item in doubly-linked list	*/
+    struct H5D_rdcc_ent_t *prev;/*previous item in doubly-linked list	*/
+} H5D_rdcc_ent_t;
+typedef H5D_rdcc_ent_t *H5D_rdcc_ent_ptr_t; /* For free lists */
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+extern H5D_dxpl_cache_t H5D_def_dxpl_cache;
+
+/* Storage layout class I/O operations */
+H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_CONTIG[1];
+H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_EFL[1];
+H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_COMPACT[1];
+H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_CHUNK[1];
+
+/* Chunked layout operations */
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_BTREE[1];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+H5_DLL herr_t H5D__term_pub_interface(void);
+H5_DLL herr_t H5D__term_deprec_interface(void);
+H5_DLL H5D_t *H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space,
+    hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id);
+H5_DLL H5D_t *H5D__create_named(const H5G_loc_t *loc, const char *name,
+    hid_t type_id, const H5S_t *space, hid_t lcpl_id, hid_t dcpl_id,
+    hid_t dapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5D__get_space_status(H5D_t *dset, H5D_space_status_t *allocation,
+    hid_t dxpl_id);
+H5_DLL herr_t H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc,
+    hbool_t full_overwrite, hsize_t old_dim[]);
+H5_DLL herr_t H5D__get_storage_size(H5D_t *dset, hid_t dxpl_id, hsize_t *storage_size);
+H5_DLL haddr_t H5D__get_offset(const H5D_t *dset);
+H5_DLL void *H5D__vlen_get_buf_size_alloc(size_t size, void *info);
+H5_DLL herr_t H5D__vlen_get_buf_size(void *elem, hid_t type_id, unsigned ndim,
+    const hsize_t *point, void *op_data);
+H5_DLL herr_t H5D__check_filters(H5D_t *dataset);
+H5_DLL herr_t H5D__set_extent(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id);
+H5_DLL herr_t H5D__get_dxpl_cache(hid_t dxpl_id, H5D_dxpl_cache_t **cache);
+H5_DLL herr_t H5D__flush_sieve_buf(H5D_t *dataset, hid_t dxpl_id);
+H5_DLL herr_t H5D__mark(const H5D_t *dataset, hid_t dxpl_id, unsigned flags);
+H5_DLL herr_t H5D__flush_real(H5D_t *dataset, hid_t dxpl_id);
+
+/* Internal I/O routines */
+H5_DLL herr_t H5D__read(H5D_t *dataset, hid_t mem_type_id,
+    const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
+    void *buf/*out*/);
+
+/* Functions that perform direct serial I/O operations */
+H5_DLL herr_t H5D__select_read(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+H5_DLL herr_t H5D__select_write(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+/* Functions that perform scatter-gather serial I/O operations */
+H5_DLL herr_t H5D__scatter_mem(const void *_tscat_buf,
+    const H5S_t *space, H5S_sel_iter_t *iter, size_t nelmts,
+    const H5D_dxpl_cache_t *dxpl_cache, void *_buf);
+H5_DLL herr_t H5D__scatgath_read(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+H5_DLL herr_t H5D__scatgath_write(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+/* Functions that operate on dataset's layout information */
+H5_DLL herr_t H5D__layout_set_io_ops(const H5D_t *dataset);
+H5_DLL size_t H5D__layout_meta_size(const H5F_t *f, const H5O_layout_t *layout,
+    hbool_t include_compact_data);
+H5_DLL herr_t H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh,
+    H5D_t *dset, hid_t dapl_id);
+H5_DLL herr_t H5D__layout_oh_read(H5D_t *dset, hid_t dxpl_id, hid_t dapl_id,
+    H5P_genplist_t *plist);
+H5_DLL herr_t H5D__layout_oh_write(H5D_t *dataset, hid_t dxpl_id, H5O_t *oh,
+    unsigned update_flags);
+
+/* Functions that operate on contiguous storage */
+H5_DLL herr_t H5D__contig_alloc(H5F_t *f, hid_t dxpl_id,
+    H5O_storage_contig_t *storage);
+H5_DLL hbool_t H5D__contig_is_space_alloc(const H5O_storage_t *storage);
+H5_DLL herr_t H5D__contig_fill(const H5D_t *dset, hid_t dxpl_id);
+H5_DLL herr_t H5D__contig_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm);
+H5_DLL herr_t H5D__contig_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm);
+H5_DLL herr_t H5D__contig_copy(H5F_t *f_src, const H5O_storage_contig_t *storage_src,
+    H5F_t *f_dst, H5O_storage_contig_t *storage_dst, H5T_t *src_dtype,
+    H5O_copy_t *cpy_info, hid_t dxpl_id);
+H5_DLL herr_t H5D__contig_delete(H5F_t *f, hid_t dxpl_id,
+    const H5O_storage_t *store);
+
+
+/* Functions that operate on chunked dataset storage */
+H5_DLL htri_t H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr,
+    hbool_t write_op);
+H5_DLL herr_t H5D__chunk_create(const H5D_t *dset /*in,out*/, hid_t dxpl_id);
+H5_DLL herr_t H5D__chunk_set_info(const H5D_t *dset);
+H5_DLL herr_t H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
+    hid_t dapl_id);
+H5_DLL hbool_t H5D__chunk_is_space_alloc(const H5O_storage_t *storage);
+H5_DLL herr_t H5D__chunk_lookup(const H5D_t *dset, hid_t dxpl_id,
+    const hsize_t *chunk_offset, hsize_t chunk_idx, H5D_chunk_ud_t *udata);
+H5_DLL void *H5D__chunk_lock(const H5D_io_info_t *io_info,
+    H5D_chunk_ud_t *udata, hbool_t relax);
+H5_DLL herr_t H5D__chunk_unlock(const H5D_io_info_t *io_info,
+    const H5D_chunk_ud_t *udata, hbool_t dirty, void *chunk,
+    uint32_t naccessed);
+H5_DLL herr_t H5D__chunk_allocated(H5D_t *dset, hid_t dxpl_id, hsize_t *nbytes);
+H5_DLL herr_t H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id,
+    hbool_t full_overwrite, hsize_t old_dim[]);
+H5_DLL herr_t H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id,
+    const hsize_t *old_dim);
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5D__chunk_addrmap(const H5D_io_info_t *io_info, haddr_t chunk_addr[]);
+#endif /* H5_HAVE_PARALLEL */
+H5_DLL herr_t H5D__chunk_update_cache(H5D_t *dset, hid_t dxpl_id);
+H5_DLL herr_t H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
+    H5O_layout_chunk_t *layout_src, H5F_t *f_dst, H5O_storage_chunk_t *storage_dst,
+    const H5S_extent_t *ds_extent_src, const H5T_t *dt_src,
+    const H5O_pline_t *pline_src, H5O_copy_t *cpy_info, hid_t dxpl_id);
+H5_DLL herr_t H5D__chunk_bh_info(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout,
+    const H5O_pline_t *pline, hsize_t *btree_size);
+H5_DLL herr_t H5D__chunk_dump_index(H5D_t *dset, hid_t dxpl_id, FILE *stream);
+H5_DLL herr_t H5D__chunk_dest(H5F_t *f, hid_t dxpl_id, H5D_t *dset);
+H5_DLL herr_t H5D__chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5O_storage_t *store);
+H5_DLL herr_t H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, 
+         hsize_t *offset, uint32_t data_size, const void *buf);
+#ifdef H5D_CHUNK_DEBUG
+H5_DLL herr_t H5D__chunk_stats(const H5D_t *dset, hbool_t headers);
+#endif /* H5D_CHUNK_DEBUG */
+
+/* Functions that operate on compact dataset storage */
+H5_DLL herr_t H5D__compact_fill(const H5D_t *dset, hid_t dxpl_id);
+H5_DLL herr_t H5D__compact_copy(H5F_t *f_src, H5O_storage_compact_t *storage_src,
+    H5F_t *f_dst, H5O_storage_compact_t *storage_dst, H5T_t *src_dtype,
+    H5O_copy_t *cpy_info, hid_t dxpl_id);
+
+/* Functions that operate on EFL (External File List)*/
+H5_DLL hbool_t H5D__efl_is_space_alloc(const H5O_storage_t *storage);
+H5_DLL herr_t H5D__efl_bh_info(H5F_t *f, hid_t dxpl_id, H5O_efl_t *efl,
+    hsize_t *heap_size);
+
+/* Functions that perform fill value operations on datasets */
+H5_DLL herr_t H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
+    const H5T_t *buf_type, const H5S_t *space, hid_t dxpl_id);
+H5_DLL herr_t H5D__fill_init(H5D_fill_buf_info_t *fb_info, void *caller_fill_buf,
+    H5MM_allocate_t alloc_func, void *alloc_info,
+    H5MM_free_t free_func, void *free_info,
+    const H5O_fill_t *fill, const H5T_t *dset_type, hid_t dset_type_id,
+    size_t nelmts, size_t min_buf_size, hid_t dxpl_id);
+H5_DLL herr_t H5D__fill_refill_vl(H5D_fill_buf_info_t *fb_info, size_t nelmts,
+    hid_t dxpl_id);
+H5_DLL herr_t H5D__fill_term(H5D_fill_buf_info_t *fb_info);
+
+#ifdef H5_HAVE_PARALLEL
+
+#ifdef H5S_DEBUG
+#ifndef H5Dmpio_DEBUG
+#define H5Dmpio_DEBUG
+#endif /*H5Dmpio_DEBUG*/
+#endif/*H5S_DEBUG*/
+/* MPI-IO function to read, it will select either regular or irregular read */
+H5_DLL herr_t H5D__mpio_select_read(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+/* MPI-IO function to write, it will select either regular or irregular read */
+H5_DLL herr_t H5D__mpio_select_write(const H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+/* MPI-IO functions to handle contiguous collective IO */
+H5_DLL herr_t H5D__contig_collective_read(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+H5_DLL herr_t H5D__contig_collective_write(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+
+/* MPI-IO functions to handle chunked collective IO */
+H5_DLL herr_t H5D__chunk_collective_read(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+H5_DLL herr_t H5D__chunk_collective_write(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+
+/* MPI-IO function to check if a direct I/O transfer is possible between
+ * memory and the file */
+H5_DLL htri_t H5D__mpio_opt_possible(const H5D_io_info_t *io_info,
+    const H5S_t *file_space, const H5S_t *mem_space,
+    const H5D_type_info_t *type_info, const H5D_chunk_map_t *fm,
+    H5P_genplist_t *dx_plist);
+
+#endif /* H5_HAVE_PARALLEL */
+
+/* Testing functions */
+#ifdef H5D_TESTING
+H5_DLL herr_t H5D__layout_version_test(hid_t did, unsigned *version);
+H5_DLL herr_t H5D__layout_contig_size_test(hid_t did, hsize_t *size);
+H5_DLL herr_t H5D__current_cache_size_test(hid_t did, size_t *nbytes_used, int *nused);
+#endif /* H5D_TESTING */
+
+#endif /*_H5Dpkg_H*/
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dprivate.h b/gatb-core/thirdparty/hdf5/src/H5Dprivate.h
new file mode 100644
index 0000000..deffe89
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dprivate.h
@@ -0,0 +1,185 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5D module
+ */
+#ifndef _H5Dprivate_H
+#define _H5Dprivate_H
+
+/* Include package's public header */
+#include "H5Dpublic.h"
+
+/* Private headers needed by this file */
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Sprivate.h"		/* Dataspaces 				*/
+#include "H5Zprivate.h"		/* Data filters				*/
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/*
+ * Feature: Define H5D_DEBUG on the compiler command line if you want to
+ *	    debug dataset I/O. NDEBUG must not be defined in order for this
+ *	    to have any effect.
+ */
+#ifdef NDEBUG
+#  undef H5D_DEBUG
+#endif
+
+/* ========  Dataset creation property names ======== */
+#define H5D_CRT_LAYOUT_NAME        "layout"             /* Storage layout */
+#define H5D_CRT_FILL_VALUE_NAME    "fill_value"         /* Fill value */
+#define H5D_CRT_ALLOC_TIME_STATE_NAME "alloc_time_state" /* Space allocation time state */
+#define H5D_CRT_EXT_FILE_LIST_NAME "efl"                /* External file list */
+
+/* ========  Dataset access property names ======== */
+#define H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME   "rdcc_nslots"   /* Size of raw data chunk cache(slots) */
+#define H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME   "rdcc_nbytes"   /* Size of raw data chunk cache(bytes) */
+#define H5D_ACS_PREEMPT_READ_CHUNKS_NAME    "rdcc_w0"       /* Preemption read chunks first */
+#define H5D_ACS_EFILE_PREFIX_NAME           "external file prefix" /* External file prefix */
+
+/* ======== Data transfer properties ======== */
+#define H5D_XFER_MAX_TEMP_BUF_NAME      "max_temp_buf"  /* Maximum temp buffer size */
+#define H5D_XFER_TCONV_BUF_NAME         "tconv_buf"     /* Type conversion buffer */
+#define H5D_XFER_BKGR_BUF_NAME          "bkgr_buf"      /* Background buffer */
+#define H5D_XFER_BKGR_BUF_TYPE_NAME     "bkgr_buf_type" /* Background buffer type */
+#define H5D_XFER_BTREE_SPLIT_RATIO_NAME "btree_split_ratio" /* B-tree node splitting ratio */
+#define H5D_XFER_VLEN_ALLOC_NAME        "vlen_alloc"    /* Vlen allocation function */
+#define H5D_XFER_VLEN_ALLOC_INFO_NAME   "vlen_alloc_info" /* Vlen allocation info */
+#define H5D_XFER_VLEN_FREE_NAME         "vlen_free"     /* Vlen free function */
+#define H5D_XFER_VLEN_FREE_INFO_NAME    "vlen_free_info" /* Vlen free info */
+#define H5D_XFER_VFL_ID_NAME            "vfl_id"        /* File driver ID */
+#define H5D_XFER_VFL_INFO_NAME          "vfl_info"      /* File driver info */
+#define H5D_XFER_HYPER_VECTOR_SIZE_NAME "vec_size"      /* Hyperslab vector size */
+#ifdef H5_HAVE_PARALLEL
+#define H5D_XFER_IO_XFER_MODE_NAME      "io_xfer_mode"  /* I/O transfer mode */
+#define H5D_XFER_MPIO_COLLECTIVE_OPT_NAME "mpio_collective_opt" /* Optimization of MPI-IO transfer mode */
+#define H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME "mpio_chunk_opt_hard"
+#define H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME "mpio_chunk_opt_num"
+#define H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME "mpio_chunk_opt_ratio"
+#define H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME "actual_chunk_opt_mode"
+#define H5D_MPIO_ACTUAL_IO_MODE_NAME    "actual_io_mode"
+#define H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME "local_no_collective_cause"  /* cause of broken collective I/O in each process */
+#define H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME "global_no_collective_cause"  /* cause of broken collective I/O in all processes */
+#endif /* H5_HAVE_PARALLEL */
+#define H5D_XFER_EDC_NAME               "err_detect"    /* EDC */
+#define H5D_XFER_FILTER_CB_NAME         "filter_cb"     /* Filter callback function */
+#define H5D_XFER_CONV_CB_NAME           "type_conv_cb"  /* Type conversion callback function */
+#define H5D_XFER_XFORM_NAME             "data_transform" /* Data transform */
+#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
+/* Collective chunk instrumentation properties */
+#define H5D_XFER_COLL_CHUNK_LINK_HARD_NAME "coll_chunk_link_hard"
+#define H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME "coll_chunk_multi_hard"
+#define H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME "coll_chunk_link_true"
+#define H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME "coll_chunk_link_false"
+#define H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME "coll_chunk_multi_coll"
+#define H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME "coll_chunk_multi_ind"
+
+/* Definitions for all collective chunk instrumentation properties */
+#define H5D_XFER_COLL_CHUNK_SIZE        sizeof(unsigned)
+#define H5D_XFER_COLL_CHUNK_DEF         1
+#define H5D_XFER_COLL_CHUNK_FIX         0
+#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */
+
+/* Default temporary buffer size */
+#define H5D_TEMP_BUF_SIZE       (1024 * 1024)
+
+/* Default I/O vector size */
+#define H5D_IO_VECTOR_SIZE      1024
+
+/* Default VL allocation & free info */
+#define H5D_VLEN_ALLOC          NULL
+#define H5D_VLEN_ALLOC_INFO     NULL
+#define H5D_VLEN_FREE           NULL
+#define H5D_VLEN_FREE_INFO      NULL
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Typedef for dataset in memory (defined in H5Dpkg.h) */
+typedef struct H5D_t H5D_t;
+
+/* Typedef for cached dataset transfer property list information */
+typedef struct H5D_dxpl_cache_t {
+    size_t max_temp_buf;        /* Maximum temporary buffer size (H5D_XFER_MAX_TEMP_BUF_NAME) */
+    void *tconv_buf;            /* Temporary conversion buffer (H5D_XFER_TCONV_BUF_NAME) */
+    void *bkgr_buf;             /* Background conversion buffer (H5D_XFER_BKGR_BUF_NAME) */
+    H5T_bkg_t bkgr_buf_type;    /* Background buffer type (H5D_XFER_BKGR_BUF_NAME) */
+    H5Z_EDC_t err_detect;       /* Error detection info (H5D_XFER_EDC_NAME) */
+    double btree_split_ratio[3];/* B-tree split ratios (H5D_XFER_BTREE_SPLIT_RATIO_NAME) */
+    size_t vec_size;            /* Size of hyperslab vector (H5D_XFER_HYPER_VECTOR_SIZE_NAME) */
+#ifdef H5_HAVE_PARALLEL
+    H5FD_mpio_xfer_t xfer_mode; /* Parallel transfer for this request (H5D_XFER_IO_XFER_MODE_NAME) */
+    H5FD_mpio_collective_opt_t coll_opt_mode; /* Parallel transfer with independent IO or collective IO with this mode */
+#endif /*H5_HAVE_PARALLEL*/
+    H5Z_cb_t filter_cb;         /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
+    H5Z_data_xform_t *data_xform_prop; /* Data transform prop (H5D_XFER_XFORM_NAME) */
+} H5D_dxpl_cache_t;
+
+/* Typedef for cached dataset creation property list information */
+typedef struct H5D_dcpl_cache_t {
+    H5O_fill_t fill;            /* Fill value info (H5D_CRT_FILL_VALUE_NAME) */
+    H5O_pline_t pline;          /* I/O pipeline info (H5O_CRT_PIPELINE_NAME) */
+    H5O_efl_t efl;              /* External file list info (H5D_CRT_EXT_FILE_LIST_NAME) */
+} H5D_dcpl_cache_t;
+
+/* Callback information for copying datasets */
+typedef struct H5D_copy_file_ud_t {
+    H5O_copy_file_ud_common_t common;   /* Shared information (must be first) */
+    struct H5S_extent_t *src_space_extent;     /* Copy of dataspace extent for dataset */
+    H5T_t *src_dtype;                   /* Copy of datatype for dataset */
+} H5D_copy_file_ud_t;
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Library Private Prototypes */
+/******************************/
+
+H5_DLL herr_t H5D_init(void);
+H5_DLL H5D_t *H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5D_close(H5D_t *dataset);
+H5_DLL H5O_loc_t *H5D_oloc(H5D_t *dataset);
+H5_DLL H5G_name_t *H5D_nameof(H5D_t *dataset);
+H5_DLL H5T_t *H5D_typeof(const H5D_t *dset);
+H5_DLL herr_t H5D_flush(const H5F_t *f, hid_t dxpl_id);
+H5_DLL hid_t H5D_get_create_plist(H5D_t *dset);
+H5_DLL hid_t H5D_get_access_plist(H5D_t *dset);
+H5_DLL hid_t H5D_get_space(H5D_t *dset);
+H5_DLL hid_t H5D_get_type(H5D_t *dset);
+
+/* Functions that operate on vlen data */
+H5_DLL herr_t H5D_vlen_reclaim(hid_t type_id, H5S_t *space, hid_t plist_id,
+    void *buf);
+
+/* Functions that operate on chunked storage */
+H5_DLL herr_t H5D_chunk_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+
+/* Functions that operate on indexed storage */
+H5_DLL herr_t H5D_btree_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream,
+				int indent, int fwidth, unsigned ndims);
+
+#endif /* _H5Dprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dpublic.h b/gatb-core/thirdparty/hdf5/src/H5Dpublic.h
new file mode 100644
index 0000000..e7ae3ae
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dpublic.h
@@ -0,0 +1,173 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5D module.
+ */
+#ifndef _H5Dpublic_H
+#define _H5Dpublic_H
+
+/* System headers needed by this file */
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Ipublic.h"
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/* Macros used to "unset" chunk cache configuration parameters */
+#define H5D_CHUNK_CACHE_NSLOTS_DEFAULT      ((size_t) -1)
+#define H5D_CHUNK_CACHE_NBYTES_DEFAULT      ((size_t) -1)
+#define H5D_CHUNK_CACHE_W0_DEFAULT          (-1.0f)
+
+/* Property names for H5LTDdirect_chunk_write */   
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME	        "direct_chunk_flag"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME	"direct_chunk_filters"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME		"direct_chunk_offset"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME	"direct_chunk_datasize"
+ 
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/* Values for the H5D_LAYOUT property */
+typedef enum H5D_layout_t {
+    H5D_LAYOUT_ERROR	= -1,
+
+    H5D_COMPACT		= 0,	/*raw data is very small		     */
+    H5D_CONTIGUOUS	= 1,	/*the default				     */
+    H5D_CHUNKED		= 2,	/*slow and fancy			     */
+    H5D_NLAYOUTS	= 3	/*this one must be last!		     */
+} H5D_layout_t;
+
+/* Types of chunk index data structures */
+typedef enum H5D_chunk_index_t {
+    H5D_CHUNK_BTREE	= 0	/* v1 B-tree index			     */
+} H5D_chunk_index_t;
+
+/* Values for the space allocation time property */
+typedef enum H5D_alloc_time_t {
+    H5D_ALLOC_TIME_ERROR	= -1,
+    H5D_ALLOC_TIME_DEFAULT  	= 0,
+    H5D_ALLOC_TIME_EARLY	= 1,
+    H5D_ALLOC_TIME_LATE		= 2,
+    H5D_ALLOC_TIME_INCR		= 3
+} H5D_alloc_time_t;
+
+/* Values for the status of space allocation */
+typedef enum H5D_space_status_t {
+    H5D_SPACE_STATUS_ERROR		= -1,
+    H5D_SPACE_STATUS_NOT_ALLOCATED	= 0,
+    H5D_SPACE_STATUS_PART_ALLOCATED	= 1,
+    H5D_SPACE_STATUS_ALLOCATED		= 2
+} H5D_space_status_t;
+
+/* Values for time of writing fill value property */
+typedef enum H5D_fill_time_t {
+    H5D_FILL_TIME_ERROR	= -1,
+    H5D_FILL_TIME_ALLOC = 0,
+    H5D_FILL_TIME_NEVER	= 1,
+    H5D_FILL_TIME_IFSET	= 2
+} H5D_fill_time_t;
+
+/* Values for fill value status */
+typedef enum H5D_fill_value_t {
+    H5D_FILL_VALUE_ERROR        =-1,
+    H5D_FILL_VALUE_UNDEFINED    =0,
+    H5D_FILL_VALUE_DEFAULT      =1,
+    H5D_FILL_VALUE_USER_DEFINED =2
+} H5D_fill_value_t;
+
+/********************/
+/* Public Variables */
+/********************/
+
+/*********************/
+/* Public Prototypes */
+/*********************/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define the operator function pointer for H5Diterate() */
+typedef herr_t (*H5D_operator_t)(void *elem, hid_t type_id, unsigned ndim,
+				 const hsize_t *point, void *operator_data);
+
+/* Define the operator function pointer for H5Dscatter() */
+typedef herr_t (*H5D_scatter_func_t)(const void **src_buf/*out*/,
+                                     size_t *src_buf_bytes_used/*out*/,
+                                     void *op_data);
+
+/* Define the operator function pointer for H5Dgather() */
+typedef herr_t (*H5D_gather_func_t)(const void *dst_buf,
+                                    size_t dst_buf_bytes_used, void *op_data);
+
+H5_DLL hid_t H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id,
+    hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id);
+H5_DLL hid_t H5Dcreate_anon(hid_t file_id, hid_t type_id, hid_t space_id,
+    hid_t plist_id, hid_t dapl_id);
+H5_DLL hid_t H5Dopen2(hid_t file_id, const char *name, hid_t dapl_id);
+H5_DLL herr_t H5Dclose(hid_t dset_id);
+H5_DLL hid_t H5Dget_space(hid_t dset_id);
+H5_DLL herr_t H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation);
+H5_DLL hid_t H5Dget_type(hid_t dset_id);
+H5_DLL hid_t H5Dget_create_plist(hid_t dset_id);
+H5_DLL hid_t H5Dget_access_plist(hid_t dset_id);
+H5_DLL hsize_t H5Dget_storage_size(hid_t dset_id);
+H5_DLL haddr_t H5Dget_offset(hid_t dset_id);
+H5_DLL herr_t H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
+			hid_t file_space_id, hid_t plist_id, void *buf/*out*/);
+H5_DLL herr_t H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
+			 hid_t file_space_id, hid_t plist_id, const void *buf);
+H5_DLL herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id,
+            H5D_operator_t op, void *operator_data);
+H5_DLL herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf);
+H5_DLL herr_t H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id, hsize_t *size);
+H5_DLL herr_t H5Dfill(const void *fill, hid_t fill_type, void *buf,
+        hid_t buf_type, hid_t space);
+H5_DLL herr_t H5Dset_extent(hid_t dset_id, const hsize_t size[]);
+H5_DLL herr_t H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
+    hid_t dst_space_id, void *dst_buf);
+H5_DLL herr_t H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
+    size_t dst_buf_size, void *dst_buf, H5D_gather_func_t op, void *op_data);
+H5_DLL herr_t H5Ddebug(hid_t dset_id);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+
+/* Typedefs */
+
+
+/* Function prototypes */
+H5_DLL hid_t H5Dcreate1(hid_t file_id, const char *name, hid_t type_id,
+    hid_t space_id, hid_t dcpl_id);
+H5_DLL hid_t H5Dopen1(hid_t file_id, const char *name);
+H5_DLL herr_t H5Dextend(hid_t dset_id, const hsize_t size[]);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Dpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dscatgath.c b/gatb-core/thirdparty/hdf5/src/H5Dscatgath.c
new file mode 100644
index 0000000..4b0846f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dscatgath.c
@@ -0,0 +1,1103 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs                                  */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5D__scatter_file(const H5D_io_info_t *io_info,
+    const H5S_t *file_space, H5S_sel_iter_t *file_iter, size_t nelmts,
+    const void *buf);
+static size_t H5D__gather_file(const H5D_io_info_t *io_info,
+    const H5S_t *file_space, H5S_sel_iter_t *file_iter, size_t nelmts,
+    void *buf);
+static size_t H5D__gather_mem(const void *_buf,
+    const H5S_t *space, H5S_sel_iter_t *iter, size_t nelmts,
+    const H5D_dxpl_cache_t *dxpl_cache, void *_tgath_buf/*out*/);
+static herr_t H5D__compound_opt_read(size_t nelmts, const H5S_t *mem_space,
+    H5S_sel_iter_t *iter, const H5D_dxpl_cache_t *dxpl_cache,
+    const H5D_type_info_t *type_info, void *user_buf/*out*/);
+static herr_t H5D__compound_opt_write(size_t nelmts, const H5D_type_info_t *type_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage sequences of size_t */
+H5FL_SEQ_EXTERN(size_t);
+
+/* Declare a free list to manage sequences of hsize_t */
+H5FL_SEQ_EXTERN(hsize_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__scatter_file
+ *
+ * Purpose:	Scatters dataset elements from the type conversion buffer BUF
+ *		to the file F where the data points are arranged according to
+ *		the file dataspace FILE_SPACE and stored according to
+ *		LAYOUT and EFL. Each element is ELMT_SIZE bytes.
+ *		The caller is requesting that NELMTS elements are copied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, June 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__scatter_file(const H5D_io_info_t *_io_info,
+    const H5S_t *space, H5S_sel_iter_t *iter, size_t nelmts,
+    const void *_buf)
+{
+    H5D_io_info_t tmp_io_info;     /* Temporary I/O info object */
+    hsize_t _off[H5D_IO_VECTOR_SIZE];             /* Array to store sequence offsets */
+    hsize_t *off = NULL;           /* Pointer to sequence offsets */
+    hsize_t mem_off;               /* Offset in memory */
+    size_t mem_curr_seq;           /* "Current sequence" in memory */
+    size_t dset_curr_seq;          /* "Current sequence" in dataset */
+    size_t _len[H5D_IO_VECTOR_SIZE];              /* Array to store sequence lengths */
+    size_t *len = NULL;            /* Array to store sequence lengths */
+    size_t orig_mem_len, mem_len;  /* Length of sequence in memory */
+    size_t  nseq;                  /* Number of sequences generated */
+    size_t  nelem;                 /* Number of elements used in sequences */
+    herr_t  ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(_io_info);
+    HDassert(space);
+    HDassert(iter);
+    HDassert(nelmts > 0);
+    HDassert(_buf);
+
+    /* Set up temporary I/O info object */
+    HDmemcpy(&tmp_io_info, _io_info, sizeof(*_io_info));
+    tmp_io_info.op_type = H5D_IO_OP_WRITE;
+    tmp_io_info.u.wbuf = _buf;
+
+    /* Allocate the vector I/O arrays */
+    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, tmp_io_info.dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
+        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, tmp_io_info.dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        len = _len;
+        off = _off;
+    } /* end else */
+
+    /* Loop until all elements are written */
+    while(nelmts > 0) {
+        /* Get list of sequences for selection to write */
+        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, tmp_io_info.dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+        /* Reset the current sequence information */
+        mem_curr_seq = dset_curr_seq = 0;
+        orig_mem_len = mem_len = nelem * iter->elmt_size;
+        mem_off = 0;
+
+        /* Write sequence list out */
+        if((*tmp_io_info.layout_ops.writevv)(&tmp_io_info, nseq, &dset_curr_seq,
+                len, off, (size_t)1, &mem_curr_seq, &mem_len, &mem_off) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error")
+
+        /* Update buffer */
+        tmp_io_info.u.wbuf = (const uint8_t *)tmp_io_info.u.wbuf + orig_mem_len;
+
+        /* Decrement number of elements left to process */
+        nelmts -= nelem;
+    } /* end while */
+
+done:
+    /* Release resources, if allocated */
+    if(len && len != _len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off && off != _off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__scatter_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__gather_file
+ *
+ * Purpose:	Gathers data points from file F and accumulates them in the
+ *		type conversion buffer BUF.  The LAYOUT argument describes
+ *		how the data is stored on disk and EFL describes how the data
+ *		is organized in external files.  ELMT_SIZE is the size in
+ *		bytes of a datum which this function treats as opaque.
+ *		FILE_SPACE describes the dataspace of the dataset on disk
+ *		and the elements that have been selected for reading (via
+ *		hyperslab, etc).  This function will copy at most NELMTS
+ *		elements.
+ *
+ * Return:	Success:	Number of elements copied.
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 24, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5D__gather_file(const H5D_io_info_t *_io_info,
+    const H5S_t *space, H5S_sel_iter_t *iter, size_t nelmts,
+    void *_buf/*out*/)
+{
+    H5D_io_info_t tmp_io_info;  /* Temporary I/O info object */
+    hsize_t _off[H5D_IO_VECTOR_SIZE];   /* Array to store sequence offsets */
+    hsize_t *off = NULL;        /* Pointer to sequence offsets */
+    hsize_t mem_off;            /* Offset in memory */
+    size_t mem_curr_seq;        /* "Current sequence" in memory */
+    size_t dset_curr_seq;       /* "Current sequence" in dataset */
+    size_t _len[H5D_IO_VECTOR_SIZE];    /* Array to store sequence lengths */
+    size_t *len = NULL;         /* Pointer to sequence lengths */
+    size_t orig_mem_len, mem_len;       /* Length of sequence in memory */
+    size_t nseq;                /* Number of sequences generated */
+    size_t nelem;               /* Number of elements used in sequences */
+    size_t ret_value = nelmts;  /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(_io_info);
+    HDassert(_io_info->dset);
+    HDassert(_io_info->store);
+    HDassert(space);
+    HDassert(iter);
+    HDassert(nelmts > 0);
+    HDassert(_buf);
+
+    /* Set up temporary I/O info object */
+    HDmemcpy(&tmp_io_info, _io_info, sizeof(*_io_info));
+    tmp_io_info.op_type = H5D_IO_OP_READ;
+    tmp_io_info.u.rbuf = _buf;
+
+    /* Allocate the vector I/O arrays */
+    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, tmp_io_info.dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O length vector array")
+        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, tmp_io_info.dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        len = _len;
+        off = _off;
+    } /* end else */
+
+    /* Loop until all elements are read */
+    while(nelmts > 0) {
+        /* Get list of sequences for selection to read */
+        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, tmp_io_info.dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
+
+        /* Reset the current sequence information */
+        mem_curr_seq = dset_curr_seq = 0;
+        orig_mem_len = mem_len = nelem * iter->elmt_size;
+        mem_off = 0;
+
+        /* Read sequence list in */
+        if((*tmp_io_info.layout_ops.readvv)(&tmp_io_info, nseq, &dset_curr_seq,
+                len, off, (size_t)1, &mem_curr_seq, &mem_len, &mem_off) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, 0, "read error")
+
+        /* Update buffer */
+        tmp_io_info.u.rbuf = (uint8_t *)tmp_io_info.u.rbuf + orig_mem_len;
+
+        /* Decrement number of elements left to process */
+        nelmts -= nelem;
+    } /* end while */
+
+done:
+    /* Release resources, if allocated */
+    if(len && len != _len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off && off != _off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__gather_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__scatter_mem
+ *
+ * Purpose:	Scatters NELMTS data points from the scatter buffer
+ *		TSCAT_BUF to the application buffer BUF.  Each element is
+ *		ELMT_SIZE bytes and they are organized in application memory
+ *		according to SPACE.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 8, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__scatter_mem (const void *_tscat_buf, const H5S_t *space,
+    H5S_sel_iter_t *iter, size_t nelmts, const H5D_dxpl_cache_t *dxpl_cache,
+    void *_buf/*out*/)
+{
+    uint8_t *buf = (uint8_t *)_buf;   /* Get local copies for address arithmetic */
+    const uint8_t *tscat_buf = (const uint8_t *)_tscat_buf;
+    hsize_t _off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
+    hsize_t *off = NULL;          /* Pointer to sequence offsets */
+    size_t _len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
+    size_t *len = NULL;           /* Pointer to sequence lengths */
+    size_t curr_len;            /* Length of bytes left to process in sequence */
+    size_t nseq;                /* Number of sequences generated */
+    size_t curr_seq;            /* Current sequence being processed */
+    size_t nelem;               /* Number of elements used in sequences */
+    herr_t ret_value = SUCCEED;   /* Number of elements scattered */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(tscat_buf);
+    HDassert(space);
+    HDassert(iter);
+    HDassert(nelmts > 0);
+    HDassert(buf);
+
+    /* Allocate the vector I/O arrays */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
+        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        len = _len;
+        off = _off;
+    } /* end else */
+
+    /* Loop until all elements are written */
+    while(nelmts > 0) {
+        /* Get list of sequences for selection to write */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR (H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
+
+        /* Loop, while sequences left to process */
+        for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
+            /* Get the number of bytes in sequence */
+            curr_len = len[curr_seq];
+
+            HDmemcpy(buf + off[curr_seq], tscat_buf, curr_len);
+
+            /* Advance offset in destination buffer */
+            tscat_buf += curr_len;
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        nelmts -= nelem;
+    } /* end while */
+
+done:
+    /* Release resources, if allocated */
+    if(len && len != _len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off && off != _off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__scatter_mem() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__gather_mem
+ *
+ * Purpose:	Gathers dataset elements from application memory BUF and
+ *		copies them into the gather buffer TGATH_BUF.
+ *		Each element is ELMT_SIZE bytes and arranged in application
+ *		memory according to SPACE.
+ *		The caller is requesting that exactly NELMTS be gathered.
+ *
+ * Return:	Success:	Number of elements copied.
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 24, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5D__gather_mem(const void *_buf, const H5S_t *space,
+    H5S_sel_iter_t *iter, size_t nelmts, const H5D_dxpl_cache_t *dxpl_cache,
+    void *_tgath_buf/*out*/)
+{
+    const uint8_t *buf = (const uint8_t *)_buf;   /* Get local copies for address arithmetic */
+    uint8_t *tgath_buf = (uint8_t *)_tgath_buf;
+    hsize_t _off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
+    hsize_t *off = NULL;          /* Pointer to sequence offsets */
+    size_t _len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
+    size_t *len = NULL;           /* Pointer to sequence lengths */
+    size_t curr_len;            /* Length of bytes left to process in sequence */
+    size_t nseq;                /* Number of sequences generated */
+    size_t curr_seq;            /* Current sequence being processed */
+    size_t nelem;               /* Number of elements used in sequences */
+    size_t ret_value = nelmts;    /* Number of elements gathered */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(buf);
+    HDassert(space);
+    HDassert(iter);
+    HDassert(nelmts > 0);
+    HDassert(tgath_buf);
+
+    /* Allocate the vector I/O arrays */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O length vector array")
+        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        len = _len;
+        off = _off;
+    } /* end else */
+
+    /* Loop until all elements are written */
+    while(nelmts > 0) {
+        /* Get list of sequences for selection to write */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR (H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
+
+        /* Loop, while sequences left to process */
+        for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
+            /* Get the number of bytes in sequence */
+            curr_len = len[curr_seq];
+
+            HDmemcpy(tgath_buf, buf + off[curr_seq], curr_len);
+
+            /* Advance offset in gather buffer */
+            tgath_buf += curr_len;
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        nelmts -= nelem;
+    } /* end while */
+
+done:
+    /* Release resources, if allocated */
+    if(len && len != _len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off && off != _off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__gather_mem() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__scatgath_read
+ *
+ * Purpose:	Perform scatter/gather ead from a contiguous [piece of a] dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
+{
+    const H5D_dxpl_cache_t *dxpl_cache = io_info->dxpl_cache;     /* Local pointer to dataset transfer info */
+    void        *buf = io_info->u.rbuf; /* Local pointer to application buffer */
+    H5S_sel_iter_t mem_iter;            /*memory selection iteration info*/
+    hbool_t	mem_iter_init = FALSE;	/*memory selection iteration info has been initialized */
+    H5S_sel_iter_t bkg_iter;            /*background iteration info*/
+    hbool_t	bkg_iter_init = FALSE;	/*background iteration info has been initialized */
+    H5S_sel_iter_t file_iter;           /*file selection iteration info*/
+    hbool_t	file_iter_init = FALSE;	/*file selection iteration info has been initialized */
+    hsize_t	smine_start;		/*strip mine start loc	*/
+    size_t	smine_nelmts;		/*elements per strip	*/
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+    HDassert(buf);
+
+    /* Check for NOOP read */
+    if(nelmts == 0)
+        HGOTO_DONE(SUCCEED)
+
+    /* Figure out the strip mine size. */
+    if(H5S_select_iter_init(&file_iter, file_space, type_info->src_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file selection information")
+    file_iter_init = TRUE;	/*file selection iteration info has been initialized */
+    if(H5S_select_iter_init(&mem_iter, mem_space, type_info->dst_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
+    mem_iter_init = TRUE;	/*file selection iteration info has been initialized */
+    if(H5S_select_iter_init(&bkg_iter, mem_space, type_info->dst_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize background selection information")
+    bkg_iter_init = TRUE;	/*file selection iteration info has been initialized */
+
+    /* Start strip mining... */
+    for(smine_start = 0; smine_start < nelmts; smine_start += smine_nelmts) {
+        size_t n;               /* Elements operated on */
+
+        /* Go figure out how many elements to read from the file */
+        HDassert(H5S_SELECT_ITER_NELMTS(&file_iter) == (nelmts - smine_start));
+        smine_nelmts = (size_t)MIN(type_info->request_nelmts, (nelmts - smine_start));
+
+        /*
+         * Gather the data from disk into the datatype conversion
+         * buffer. Also gather data from application to background buffer
+         * if necessary.
+         */
+
+	/*
+         * Gather data
+         */
+        n = H5D__gather_file(io_info, file_space, &file_iter, smine_nelmts,
+                type_info->tconv_buf/*out*/);
+	if(n != smine_nelmts)
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file gather failed")
+
+        /* If the source and destination are compound types and subset of each other
+         * and no conversion is needed, copy the data directly into user's buffer and
+         * bypass the rest of steps.
+         */
+        if(type_info->cmpd_subset && H5T_SUBSET_FALSE != type_info->cmpd_subset->subset) {
+            if(H5D__compound_opt_read(smine_nelmts, mem_space, &mem_iter, dxpl_cache,
+                    type_info, buf /*out*/) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "datatype conversion failed")
+        } /* end if */
+        else {
+            if(H5T_BKG_YES == type_info->need_bkg) {
+                n = H5D__gather_mem(buf, mem_space, &bkg_iter, smine_nelmts,
+                        dxpl_cache, type_info->bkg_buf/*out*/);
+                if(n != smine_nelmts)
+                    HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "mem gather failed")
+            } /* end if */
+
+            /*
+             * Perform datatype conversion.
+             */
+            if(H5T_convert(type_info->tpath, type_info->src_type_id, type_info->dst_type_id,
+                    smine_nelmts, (size_t)0, (size_t)0, type_info->tconv_buf,
+                    type_info->bkg_buf, io_info->dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "datatype conversion failed")
+
+            /* Do the data transform after the conversion (since we're using type mem_type) */
+            if(!type_info->is_xform_noop)
+                if(H5Z_xform_eval(dxpl_cache->data_xform_prop, type_info->tconv_buf, smine_nelmts, type_info->mem_type) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Error performing data transform")
+
+            /*
+             * Scatter the data into memory.
+             */
+            if(H5D__scatter_mem(type_info->tconv_buf, mem_space, &mem_iter,
+                    smine_nelmts, dxpl_cache, buf/*out*/) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "scatter failed")
+        } /* end else */
+    } /* end for */
+
+done:
+    /* Release selection iterators */
+    if(file_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+    if(mem_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+    if(bkg_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&bkg_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__scatgath_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__scatgath_write
+ *
+ * Purpose:	Perform scatter/gather write to a contiguous [piece of a] dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
+{
+    const H5D_dxpl_cache_t *dxpl_cache = io_info->dxpl_cache;     /* Local pointer to dataset transfer info */
+    const void  *buf = io_info->u.wbuf; /* Local pointer to application buffer */
+    H5S_sel_iter_t mem_iter;            /*memory selection iteration info*/
+    hbool_t	mem_iter_init = FALSE;	/*memory selection iteration info has been initialized */
+    H5S_sel_iter_t bkg_iter;            /*background iteration info*/
+    hbool_t	bkg_iter_init = FALSE;	/*background iteration info has been initialized */
+    H5S_sel_iter_t file_iter;           /*file selection iteration info*/
+    hbool_t	file_iter_init = FALSE;	/*file selection iteration info has been initialized */
+    hsize_t	smine_start;		/*strip mine start loc	*/
+    size_t	smine_nelmts;		/*elements per strip	*/
+    herr_t	ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+    HDassert(buf);
+
+    /* Check for NOOP write */
+    if(nelmts == 0)
+        HGOTO_DONE(SUCCEED)
+
+    /* Figure out the strip mine size. */
+    if(H5S_select_iter_init(&file_iter, file_space, type_info->dst_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file selection information")
+    file_iter_init = TRUE;	/*file selection iteration info has been initialized */
+    if(H5S_select_iter_init(&mem_iter, mem_space, type_info->src_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
+    mem_iter_init = TRUE;	/*file selection iteration info has been initialized */
+    if(H5S_select_iter_init(&bkg_iter, file_space, type_info->dst_type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize background selection information")
+    bkg_iter_init = TRUE;	/*file selection iteration info has been initialized */
+
+    /* Start strip mining... */
+    for(smine_start = 0; smine_start < nelmts; smine_start += smine_nelmts) {
+        size_t n;               /* Elements operated on */
+
+        /* Go figure out how many elements to read from the file */
+        HDassert(H5S_SELECT_ITER_NELMTS(&file_iter) == (nelmts - smine_start));
+        smine_nelmts = (size_t)MIN(type_info->request_nelmts, (nelmts - smine_start));
+
+        /*
+         * Gather data from application buffer into the datatype conversion
+         * buffer. Also gather data from the file into the background buffer
+         * if necessary.
+         */
+        n = H5D__gather_mem(buf, mem_space, &mem_iter, smine_nelmts,
+                dxpl_cache, type_info->tconv_buf/*out*/);
+        if(n != smine_nelmts)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "mem gather failed")
+
+        /* If the source and destination are compound types and the destination is
+         * is a subset of the source and no conversion is needed, copy the data
+         * directly into user's buffer and bypass the rest of steps.  If the source
+         * is a subset of the destination, the optimization is done in conversion
+         * function H5T_conv_struct_opt to protect the background data.
+         */
+        if(type_info->cmpd_subset && H5T_SUBSET_DST == type_info->cmpd_subset->subset
+                && type_info->dst_type_size == type_info->cmpd_subset->copy_size) {
+            if(H5D__compound_opt_write(smine_nelmts, type_info) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "datatype conversion failed")
+        } /* end if */
+        else {
+            if(H5T_BKG_YES == type_info->need_bkg) {
+                n = H5D__gather_file(io_info, file_space, &bkg_iter, smine_nelmts,
+                        type_info->bkg_buf/*out*/);
+                if(n != smine_nelmts)
+                    HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file gather failed")
+            } /* end if */
+
+            /* Do the data transform before the type conversion (since
+             * transforms must be done in the memory type). */
+            if(!type_info->is_xform_noop)
+	        if(H5Z_xform_eval(dxpl_cache->data_xform_prop, type_info->tconv_buf, smine_nelmts, type_info->mem_type) < 0)
+		    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Error performing data transform")
+
+            /*
+             * Perform datatype conversion.
+             */
+            if(H5T_convert(type_info->tpath, type_info->src_type_id, type_info->dst_type_id,
+                    smine_nelmts, (size_t)0, (size_t)0, type_info->tconv_buf,
+                    type_info->bkg_buf, io_info->dxpl_id) < 0)
+                 HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "datatype conversion failed")
+        } /* end else */
+
+        /*
+         * Scatter the data out to the file.
+         */
+        if(H5D__scatter_file(io_info, file_space, &file_iter, smine_nelmts,
+                type_info->tconv_buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "scatter failed")
+    } /* end for */
+
+done:
+    /* Release selection iterators */
+    if(file_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+    if(mem_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+    if(bkg_iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&bkg_iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__scatgath_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compound_opt_read
+ *
+ * Purpose:	A special optimization case when the source and
+ *              destination members are a subset of each other, and
+ *              the order is the same, and no conversion is needed.
+ *              For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              or
+ *                  struct destination {       struct source {
+ *                      TYPE1 A;      <--          TYPE1 A;
+ *                      TYPE2 B;      <--          TYPE2 B;
+ *                      TYPE3 C;      <--          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              The optimization is simply moving data to the appropriate
+ *              places in the buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		11 June 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compound_opt_read(size_t nelmts, const H5S_t *space,
+    H5S_sel_iter_t *iter, const H5D_dxpl_cache_t *dxpl_cache,
+    const H5D_type_info_t *type_info, void *user_buf/*out*/)
+{
+    uint8_t    *ubuf = (uint8_t *)user_buf;     /* Cast for pointer arithmetic	*/
+    uint8_t    *xdbuf;                          /* Pointer into dataset buffer */
+    hsize_t    _off[H5D_IO_VECTOR_SIZE];        /* Array to store sequence offsets */
+    hsize_t    *off = NULL;                     /* Pointer to sequence offsets */
+    size_t     _len[H5D_IO_VECTOR_SIZE];        /* Array to store sequence lengths */
+    size_t     *len = NULL;                     /* Pointer to sequence lengths */
+    size_t     src_stride, dst_stride, copy_size;
+    herr_t     ret_value = SUCCEED;	       /*return value		*/
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(nelmts > 0);
+    HDassert(space);
+    HDassert(iter);
+    HDassert(dxpl_cache);
+    HDassert(type_info);
+    HDassert(type_info->cmpd_subset);
+    HDassert(H5T_SUBSET_SRC == type_info->cmpd_subset->subset ||
+        H5T_SUBSET_DST == type_info->cmpd_subset->subset);
+    HDassert(user_buf);
+
+    /* Allocate the vector I/O arrays */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
+        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        len = _len;
+        off = _off;
+    } /* end else */
+
+    /* Get source & destination strides */
+    src_stride = type_info->src_type_size;
+    dst_stride = type_info->dst_type_size;
+
+    /* Get the size, in bytes, to copy for each element */
+    copy_size = type_info->cmpd_subset->copy_size;
+
+    /* Loop until all elements are written */
+    xdbuf = type_info->tconv_buf;
+    while(nelmts > 0) {
+        size_t     nseq;                /* Number of sequences generated */
+        size_t     curr_seq;            /* Current sequence being processed */
+        size_t     elmtno;		/* Element counter */
+
+        /* Get list of sequences for selection to write */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &elmtno, off, len) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
+
+        /* Loop, while sequences left to process */
+        for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
+            size_t     curr_off;        /* Offset of bytes left to process in sequence */
+            size_t     curr_len;        /* Length of bytes left to process in sequence */
+            size_t     curr_nelmts;	/* Number of elements to process in sequence   */
+            uint8_t    *xubuf;
+            size_t     i;               /* Local index variable */
+
+            /* Get the number of bytes and offset in sequence */
+            curr_len = len[curr_seq];
+            H5_CHECK_OVERFLOW(off[curr_seq], hsize_t, size_t);
+            curr_off = (size_t)off[curr_seq];
+
+            /* Decide the number of elements and position in the buffer. */
+            curr_nelmts = curr_len / dst_stride;
+            xubuf = ubuf + curr_off;
+
+            /* Copy the data into the right place. */
+            for(i = 0; i < curr_nelmts; i++) {
+                HDmemmove(xubuf, xdbuf, copy_size);
+
+                /* Update pointers */
+                xdbuf += src_stride;
+                xubuf += dst_stride;
+            } /* end for */
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        nelmts -= elmtno;
+    } /* end while */
+
+done:
+    /* Release resources, if allocated */
+    if(len && len != _len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off && off != _off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compound_opt_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__compound_opt_write
+ *
+ * Purpose:	A special optimization case when the source and
+ *              destination members are a subset of each other, and
+ *              the order is the same, and no conversion is needed.
+ *              For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              or
+ *                  struct destination {       struct source {
+ *                      TYPE1 A;      <--          TYPE1 A;
+ *                      TYPE2 B;      <--          TYPE2 B;
+ *                      TYPE3 C;      <--          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              The optimization is simply moving data to the appropriate
+ *              places in the buffer.
+ *
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		11 June 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compound_opt_write(size_t nelmts, const H5D_type_info_t *type_info)
+{
+    uint8_t    *xsbuf, *xdbuf;                  /* Source & destination pointers into dataset buffer */
+    size_t     src_stride, dst_stride;          /* Strides through source & destination datatypes */
+    size_t     i;                               /* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(nelmts > 0);
+    HDassert(type_info);
+
+    /* Initialize values for loop */
+    src_stride = type_info->src_type_size;
+    dst_stride = type_info->dst_type_size;
+
+    /* Loop until all elements are written */
+    xsbuf = (uint8_t *)type_info->tconv_buf;
+    xdbuf = (uint8_t *)type_info->tconv_buf;
+    for(i = 0; i < nelmts; i++) {
+        HDmemmove(xdbuf, xsbuf, dst_stride);
+
+        /* Update pointers */
+        xsbuf += src_stride;
+        xdbuf += dst_stride;
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__compound_opt_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Dscatter
+ *
+ * Purpose:     Scatters data provided by the callback op to the
+ *              destination buffer dst_buf, where the dimensions of
+ *              dst_buf and the selection to be scattered to are specified
+ *              by the dataspace dst_space_id.  The type of the data to be
+ *              scattered is specified by type_id.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              14 Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
+    hid_t dst_space_id, void *dst_buf)
+{
+    H5T_t *type;                /* Datatype */
+    H5S_t *dst_space;           /* Dataspace */
+    H5S_sel_iter_t iter;        /* Selection iteration info*/
+    hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
+    const void *src_buf = NULL; /* Source (contiguous) data buffer */
+    size_t src_buf_nbytes = 0;  /* Size of src_buf */
+    size_t type_size;           /* Datatype element size */
+    hssize_t nelmts;            /* Number of remaining elements in selection */
+    size_t nelmts_scatter = 0;  /* Number of elements to scatter to dst_buf */
+    H5D_dxpl_cache_t _dxpl_cache; /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache; /* Data transfer property cache */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "x*xii*x", op, op_data, type_id, dst_space_id, dst_buf);
+
+    /* Check args */
+    if(op == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid callback function pointer")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(NULL == (dst_space= (H5S_t *)H5I_object_verify(dst_space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(dst_buf == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination buffer provided")
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(H5P_DATASET_XFER_DEFAULT, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Get datatype element size */
+    if(0 == (type_size = H5T_GET_SIZE(type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get datatype size")
+
+    /* Get number of elements in dataspace */
+    if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(dst_space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
+
+    /* Initialize selection iterator */
+    if(H5S_select_iter_init(&iter, dst_space, type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize selection iterator information")
+    iter_init = TRUE;
+
+    /* Loop until all data has been scattered */
+    while(nelmts > 0) {
+        /* Make callback to retrieve data */
+        if(op(&src_buf, &src_buf_nbytes, op_data) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CALLBACK, FAIL, "callback operator returned failure")
+
+        /* Calculate number of elements */
+        nelmts_scatter = src_buf_nbytes / type_size;
+
+        /* Check callback results */
+        if(!src_buf)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback did not return a buffer")
+        if(src_buf_nbytes == 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback returned a buffer size of 0")
+        if(src_buf_nbytes % type_size)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buffer size is not a multiple of datatype size")
+        if(nelmts_scatter > (size_t)nelmts)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback returned more elements than in selection")
+
+        /* Scatter data */
+        if(H5D__scatter_mem(src_buf, dst_space, &iter, nelmts_scatter, dxpl_cache, dst_buf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "scatter failed")
+
+        nelmts -= (hssize_t)nelmts_scatter;
+    } /* end while */
+
+done:
+    /* Release selection iterator */
+    if(iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Dscatter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Dgather
+ *
+ * Purpose:     Gathers data provided from the source buffer src_buf to
+ *              contiguous buffer dst_buf, then calls the callback op.
+ *              The dimensions of src_buf and the selection to be gathered
+ *              are specified by the dataspace src_space_id.  The type of
+ *              the data to be gathered is specified by type_id.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              16 Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
+    size_t dst_buf_size, void *dst_buf, H5D_gather_func_t op, void *op_data)
+{
+    H5T_t *type;                /* Datatype */
+    H5S_t *src_space;           /* Dataspace */
+    H5S_sel_iter_t iter;        /* Selection iteration info*/
+    hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
+    size_t type_size;           /* Datatype element size */
+    hssize_t nelmts;            /* Number of remaining elements in selection */
+    size_t dst_buf_nelmts;      /* Number of elements that can fit in dst_buf */
+    size_t nelmts_gathered;     /* Number of elements gathered from src_buf */
+    H5D_dxpl_cache_t _dxpl_cache; /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache; /* Data transfer property cache */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*xiz*xx*x", src_space_id, src_buf, type_id, dst_buf_size,
+             dst_buf, op, op_data);
+
+    /* Check args */
+    if(NULL == (src_space= (H5S_t *)H5I_object_verify(src_space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(src_buf == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no source buffer provided")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(dst_buf_size == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination buffer size is 0")
+    if(dst_buf == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination buffer provided")
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(H5P_DATASET_XFER_DEFAULT, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Get datatype element size */
+    if(0 == (type_size = H5T_GET_SIZE(type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get datatype size")
+
+    /* Get number of elements in dst_buf_size */
+    dst_buf_nelmts = dst_buf_size / type_size;
+    if(dst_buf_nelmts == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination buffer is not large enough to hold one element")
+
+    /* Get number of elements in dataspace */
+    if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(src_space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
+
+    /* If dst_buf is not large enough to hold all the elements, make sure there
+     * is a callback */
+    if(((size_t)nelmts > dst_buf_nelmts) && (op == NULL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback supplied and destination buffer too small")
+
+    /* Initialize selection iterator */
+    if(H5S_select_iter_init(&iter, src_space, type_size) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize selection iterator information")
+    iter_init = TRUE;
+
+    /* Loop until all data has been scattered */
+    while(nelmts > 0) {
+        /* Gather data */
+        if(0 == (nelmts_gathered = H5D__gather_mem(src_buf, src_space, &iter, MIN(dst_buf_nelmts, (size_t)nelmts), dxpl_cache, dst_buf)))
+            HGOTO_ERROR(H5E_IO, H5E_CANTCOPY, FAIL, "gather failed")
+        HDassert(nelmts_gathered == MIN(dst_buf_nelmts, (size_t)nelmts));
+
+        /* Make callback to process dst_buf */
+        if(op && op(dst_buf, nelmts_gathered * type_size, op_data) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CALLBACK, FAIL, "callback operator returned failure")
+
+        nelmts -= (hssize_t)nelmts_gathered;
+        HDassert(op || (nelmts == 0));
+    } /* end while */
+
+done:
+    /* Release selection iterator */
+    if(iter_init) {
+        if(H5S_SELECT_ITER_RELEASE(&iter) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Dgather() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dselect.c b/gatb-core/thirdparty/hdf5/src/H5Dselect.c
new file mode 100644
index 0000000..38f8bc4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dselect.c
@@ -0,0 +1,314 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.ued>
+ *              Thursday, September 30, 2004
+ *
+ * Purpose:	Dataspace I/O functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
+    size_t nelmts, const H5S_t *file_space, const H5S_t *mem_space);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage sequences of size_t */
+H5FL_SEQ_DEFINE(size_t);
+
+/* Declare a free list to manage sequences of hsize_t */
+H5FL_SEQ_DEFINE(hsize_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__select_io
+ *
+ * Purpose:	Perform I/O directly from application memory and a file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 27, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
+    size_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
+{
+    H5S_sel_iter_t mem_iter;    /* Memory selection iteration info */
+    hbool_t mem_iter_init = 0;  /* Memory selection iteration info has been initialized */
+    H5S_sel_iter_t file_iter;   /* File selection iteration info */
+    hbool_t file_iter_init = 0;	/* File selection iteration info has been initialized */
+    hsize_t _mem_off[H5D_IO_VECTOR_SIZE];      /* Array to store sequence offsets in memory */
+    hsize_t *mem_off = NULL;    /* Pointer to sequence offsets in memory */
+    hsize_t _file_off[H5D_IO_VECTOR_SIZE];     /* Array to store sequence offsets in the file */
+    hsize_t *file_off = NULL;   /* Pointer to sequence offsets in the file */
+    size_t _mem_len[H5D_IO_VECTOR_SIZE];       /* Array to store sequence lengths in memory */
+    size_t *mem_len = NULL;     /* Pointer to sequence lengths in memory */
+    size_t _file_len[H5D_IO_VECTOR_SIZE];      /* Array to store sequence lengths in the file */
+    size_t *file_len = NULL;    /* Pointer to sequence lengths in the file */
+    size_t curr_mem_seq;        /* Current memory sequence to operate on */
+    size_t curr_file_seq;       /* Current file sequence to operate on */
+    size_t mem_nseq;            /* Number of sequences generated in the file */
+    size_t file_nseq;           /* Number of sequences generated in memory */
+    ssize_t tmp_file_len;       /* Temporary number of bytes in file sequence */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(io_info);
+    HDassert(io_info->dset);
+    HDassert(io_info->store);
+    HDassert(TRUE == H5P_isa_class(io_info->dxpl_id, H5P_DATASET_XFER));
+    HDassert(io_info->u.rbuf);
+
+    /* Allocate the vector I/O arrays */
+    if(io_info->dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
+        if(NULL == (mem_len = H5FL_SEQ_MALLOC(size_t,io_info->dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
+        if(NULL == (mem_off = H5FL_SEQ_MALLOC(hsize_t,io_info->dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
+        if(NULL == (file_len = H5FL_SEQ_MALLOC(size_t,io_info->dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
+        if(NULL == (file_off = H5FL_SEQ_MALLOC(hsize_t,io_info->dxpl_cache->vec_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
+    } /* end if */
+    else {
+        mem_len = _mem_len;
+        mem_off = _mem_off;
+        file_len = _file_len;
+        file_off = _file_off;
+    } /* end else */
+
+    /* Check for only one element in selection */
+    if(nelmts == 1) {
+        /* Get offset of first element in selections */
+        if(H5S_SELECT_OFFSET(file_space, file_off) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "can't retrieve file selection offset")
+        if(H5S_SELECT_OFFSET(mem_space, mem_off) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "can't retrieve memory selection offset")
+
+        /* Set up necessary information for I/O operation */
+        file_nseq = mem_nseq = 1;
+        curr_mem_seq = curr_file_seq = 0;
+        *file_off *= elmt_size;
+        *mem_off *= elmt_size;
+        *file_len = *mem_len = elmt_size;
+
+        /* Perform I/O on memory and file sequences */
+        if(io_info->op_type == H5D_IO_OP_READ) {
+            if((tmp_file_len = (*io_info->layout_ops.readvv)(io_info,
+                    file_nseq, &curr_file_seq, file_len, file_off,
+                    mem_nseq, &curr_mem_seq, mem_len, mem_off)) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, FAIL, "read error")
+        } /* end if */
+        else {
+            HDassert(io_info->op_type == H5D_IO_OP_WRITE);
+            if((tmp_file_len = (*io_info->layout_ops.writevv)(io_info,
+                    file_nseq, &curr_file_seq, file_len, file_off,
+                    mem_nseq, &curr_mem_seq, mem_len, mem_off)) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error")
+        } /* end else */
+
+        /* Decrement number of elements left to process */
+        HDassert(((size_t)tmp_file_len % elmt_size) == 0);
+    } /* end if */
+    else {
+        size_t mem_nelem;           /* Number of elements used in memory sequences */
+        size_t file_nelem;          /* Number of elements used in file sequences */
+
+        /* Initialize file iterator */
+        if(H5S_select_iter_init(&file_iter, file_space, elmt_size) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+        file_iter_init = 1;	/* File selection iteration info has been initialized */
+
+        /* Initialize memory iterator */
+        if(H5S_select_iter_init(&mem_iter, mem_space, elmt_size) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+        mem_iter_init = 1;	/* Memory selection iteration info has been initialized */
+
+        /* Initialize sequence counts */
+        curr_mem_seq = curr_file_seq = 0;
+        mem_nseq = file_nseq = 0;
+
+        /* Loop, until all bytes are processed */
+        while(nelmts > 0) {
+            /* Check if more file sequences are needed */
+            if(curr_file_seq >= file_nseq) {
+                /* Get sequences for file selection */
+                if(H5S_SELECT_GET_SEQ_LIST(file_space, H5S_GET_SEQ_LIST_SORTED, &file_iter, io_info->dxpl_cache->vec_size, nelmts, &file_nseq, &file_nelem, file_off, file_len) < 0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+                /* Start at the beginning of the sequences again */
+                curr_file_seq = 0;
+            } /* end if */
+
+            /* Check if more memory sequences are needed */
+            if(curr_mem_seq >= mem_nseq) {
+                /* Get sequences for memory selection */
+                if(H5S_SELECT_GET_SEQ_LIST(mem_space, 0, &mem_iter, io_info->dxpl_cache->vec_size, nelmts, &mem_nseq, &mem_nelem, mem_off, mem_len) < 0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+                /* Start at the beginning of the sequences again */
+                curr_mem_seq = 0;
+            } /* end if */
+
+            /* Perform I/O on memory and file sequences */
+            if(io_info->op_type == H5D_IO_OP_READ) {
+                if((tmp_file_len = (*io_info->layout_ops.readvv)(io_info,
+                        file_nseq, &curr_file_seq, file_len, file_off,
+                        mem_nseq, &curr_mem_seq, mem_len, mem_off)) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, FAIL, "read error")
+            } /* end if */
+            else {
+                HDassert(io_info->op_type == H5D_IO_OP_WRITE);
+                if((tmp_file_len = (*io_info->layout_ops.writevv)(io_info,
+                        file_nseq, &curr_file_seq, file_len, file_off,
+                        mem_nseq, &curr_mem_seq, mem_len, mem_off)) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error")
+            } /* end else */
+
+            /* Decrement number of elements left to process */
+            HDassert(((size_t)tmp_file_len % elmt_size) == 0);
+            nelmts -= ((size_t)tmp_file_len / elmt_size);
+        } /* end while */
+    } /* end else */
+
+done:
+    /* Release file selection iterator */
+    if(file_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Release memory selection iterator */
+    if(mem_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Release vector arrays, if allocated */
+    if(file_len && file_len != _file_len)
+        file_len = H5FL_SEQ_FREE(size_t, file_len);
+    if(file_off && file_off != _file_off)
+        file_off = H5FL_SEQ_FREE(hsize_t, file_off);
+    if(mem_len && mem_len != _mem_len)
+        mem_len = H5FL_SEQ_FREE(size_t, mem_len);
+    if(mem_off && mem_off != _mem_off)
+        mem_off = H5FL_SEQ_FREE(hsize_t, mem_off);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__select_io() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__select_read
+ *
+ * Purpose:	Reads directly from file into application memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 23, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__select_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Call generic selection operation */
+    H5_CHECK_OVERFLOW(nelmts, hsize_t, size_t);
+    if(H5D__select_io(io_info, type_info->src_type_size, (size_t)nelmts,
+            file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, FAIL, "read error")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__select_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__select_write
+ *
+ * Purpose:	Writes directly from application memory into a file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 23, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__select_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Call generic selection operation */
+    H5_CHECK_OVERFLOW(nelmts, hsize_t, size_t);
+    if(H5D__select_io(io_info, type_info->dst_type_size, (size_t)nelmts,
+            file_space, mem_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__select_write() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Dtest.c b/gatb-core/thirdparty/hdf5/src/H5Dtest.c
new file mode 100644
index 0000000..eef3c91
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Dtest.c
@@ -0,0 +1,189 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Thursday, May 27, 2004
+ *
+ * Purpose:	Dataset testing functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#define H5D_TESTING		/*suppress warning about H5D testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets 				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__layout_version_test
+ PURPOSE
+    Determine the storage layout version for a dataset's layout information
+ USAGE
+    herr_t H5D__layout_version_test(did, version)
+        hid_t did;              IN: Dataset to query
+        unsigned *version;      OUT: Pointer to location to place version info
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the version of the storage layout information for a dataset.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5D__layout_version_test(hid_t did, unsigned *version)
+{
+    H5D_t	*dset;          /* Pointer to dataset to query */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if(version)
+        *version = dset->shared->layout.version;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__layout_version_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__layout_contig_size_test
+ PURPOSE
+    Determine the size of a contiguous layout for a dataset's layout information
+ USAGE
+    herr_t H5D__layout_contig_size_test(did, size)
+        hid_t did;              IN: Dataset to query
+        hsize_t *size;          OUT: Pointer to location to place size info
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the size of a contiguous dataset's storage.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5D__layout_contig_size_test(hid_t did, hsize_t *size)
+{
+    H5D_t	*dset;          /* Pointer to dataset to query */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if(size) {
+        HDassert(dset->shared->layout.type == H5D_CONTIGUOUS);
+        *size = dset->shared->layout.storage.u.contig.size;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__layout_contig_size_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5D__current_cache_size_test
+ PURPOSE
+    Determine current the size of the dataset's chunk cache
+ USAGE
+    herr_t H5D__current_cache_size_test(did, size)
+        hid_t did;              IN: Dataset to query
+        hsize_t *size;          OUT: Pointer to location to place size info
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the size of a contiguous dataset's storage.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5D__current_cache_size_test(hid_t did, size_t *nbytes_used, int *nused)
+{
+    H5D_t	*dset;          /* Pointer to dataset to query */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    if(nbytes_used) {
+        HDassert(dset->shared->layout.type == H5D_CHUNKED);
+        *nbytes_used = dset->shared->cache.chunk.nbytes_used;
+    } /* end if */
+
+    if(nused) {
+        HDassert(dset->shared->layout.type == H5D_CHUNKED);
+        *nused = dset->shared->cache.chunk.nused;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__current_cache_size_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5E.c b/gatb-core/thirdparty/hdf5/src/H5E.c
new file mode 100644
index 0000000..cd4da9f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5E.c
@@ -0,0 +1,1734 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Provides error handling in the form of a stack.  The
+ *		FUNC_ENTER() macro clears the error stack whenever an API
+ *		function is entered.  When an error is detected, an entry is
+ *		pushed onto the stack.  As the functions unwind additional
+ *		entries are pushed onto the stack. The API function will
+ *		return some indication that an error occurred and the
+ *		application can print the error stack.
+ *
+ *		Certain API functions in the H5E package (such as H5Eprint2())
+ *		do not clear the error stack.  Otherwise, any function which
+ *		doesn't have an underscore immediately after the package name
+ *		will clear the error stack.  For instance, H5Fopen() clears
+ *		the error stack while H5F_open() does not.
+ *
+ *		An error stack has a fixed maximum size.  If this size is
+ *		exceeded then the stack will be truncated and only the
+ *		inner-most functions will have entries on the stack. This is
+ *		expected to be a rare condition.
+ *
+ *		Each thread has its own error stack, but since
+ *		multi-threading has not been added to the library yet, this
+ *		package maintains a single error stack. The error stack is
+ *		statically allocated to reduce the complexity of handling
+ *		errors within the H5E package.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5E_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Iprivate.h"		/* IDs                                  */
+#include "H5Epkg.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* HDF5 error class */
+#define H5E_CLS_NAME         "HDF5"
+#define H5E_CLS_LIB_NAME     "HDF5"
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+/* Static function declarations */
+static H5E_cls_t *H5E_register_class(const char *cls_name, const char *lib_name,
+                                const char *version);
+static herr_t  H5E_unregister_class(H5E_cls_t *cls);
+static ssize_t H5E_get_class_name(const H5E_cls_t *cls, char *name, size_t size);
+static int H5E_close_msg_cb(void *obj_ptr, hid_t obj_id, void *udata);
+static herr_t  H5E_close_msg(H5E_msg_t *err);
+static H5E_msg_t *H5E_create_msg(H5E_cls_t *cls, H5E_type_t msg_type, const char *msg);
+static H5E_t  *H5E_get_current_stack(void);
+static herr_t  H5E_set_current_stack(H5E_t *estack);
+static herr_t  H5E_close_stack(H5E_t *err_stack);
+static ssize_t H5E_get_num(const H5E_t *err_stack);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5E_t struct */
+H5FL_DEFINE_STATIC(H5E_t);
+
+/* Declare a free list to manage the H5E_cls_t struct */
+H5FL_DEFINE_STATIC(H5E_cls_t);
+
+/* Declare a free list to manage the H5E_msg_t struct */
+H5FL_DEFINE_STATIC(H5E_msg_t);
+
+/* Error class ID class */
+static const H5I_class_t H5I_ERRCLS_CLS[1] = {{
+    H5I_ERROR_CLASS,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5E_unregister_class /* Callback routine for closing objects of this class */
+}};
+
+/* Error message ID class */
+static const H5I_class_t H5I_ERRMSG_CLS[1] = {{
+    H5I_ERROR_MSG,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5E_close_msg   /* Callback routine for closing objects of this class */
+}};
+
+/* Error stack ID class */
+static const H5I_class_t H5I_ERRSTK_CLS[1] = {{
+    H5I_ERROR_STACK,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5E_close_stack /* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_init
+ *
+ * Purpose:	Initialize the interface from some other layer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 29, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_init() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5E_set_default_auto
+ *
+ * Purpose:     Initialize "automatic" error stack reporting info to library
+ *              default
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5E_set_default_auto(H5E_t *stk)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+#ifdef H5_USE_16_API_DEFAULT
+    stk->auto_op.vers = 1;
+#else /* H5_USE_16_API */
+    stk->auto_op.vers = 2;
+#endif /* H5_USE_16_API_DEFAULT */
+
+    stk->auto_op.func1 = stk->auto_op.func1_default = (H5E_auto1_t)H5Eprint1;
+    stk->auto_op.func2 = stk->auto_op.func2_default = (H5E_auto2_t)H5Eprint2;
+    stk->auto_op.is_default = TRUE;
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+    stk->auto_op.func2 = (H5E_auto2_t)H5Eprint2;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+    stk->auto_data = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_set_default_auto() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5E_init_interface
+ *
+ * Purpose:     Initialize interface-specific information
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5E_init_interface(void)
+{
+    H5E_cls_t   *cls;           /* Pointer to error class */
+    H5E_msg_t   *msg;           /* Pointer to new error message */
+    char lib_vers[128];         /* Buffer to constructu library version within */
+    herr_t      ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize the atom group for the error class IDs */
+    if(H5I_register_type(H5I_ERRCLS_CLS) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group")
+
+    /* Initialize the atom group for the major error IDs */
+    if(H5I_register_type(H5I_ERRMSG_CLS) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group")
+
+    /* Initialize the atom group for the error stacks */
+    if(H5I_register_type(H5I_ERRSTK_CLS) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group")
+
+#ifndef H5_HAVE_THREADSAFE
+    H5E_stack_g[0].nused = 0;
+    H5E_set_default_auto(H5E_stack_g);
+#endif /* H5_HAVE_THREADSAFE */
+
+    /* Allocate the HDF5 error class */
+    HDassert(H5E_ERR_CLS_g == (-1));
+    HDsnprintf(lib_vers, sizeof(lib_vers), "%u.%u.%u%s", H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE, (HDstrlen(H5_VERS_SUBRELEASE) > 0 ? "-"H5_VERS_SUBRELEASE : ""));
+    if(NULL == (cls = H5E_register_class(H5E_CLS_NAME, H5E_CLS_LIB_NAME, lib_vers)))
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "class initialization failed")
+    if((H5E_ERR_CLS_g = H5I_register(H5I_ERROR_CLASS, cls, FALSE)) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error class")
+
+    /* Include the automatically generated error code initialization */
+    #include "H5Einit.h"
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_term_interface
+ *
+ * Purpose:	Terminates the H5E interface
+ *
+ * Return:	Success:	Positive if anything is done that might
+ *				affect other interfaces; zero otherwise.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Raymond Lu
+ *	        Tuesday, July 22, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5E_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        int ncls, nmsg, nstk;
+
+        /* Check if there are any open error stacks, classes or messages */
+        ncls = H5I_nmembers(H5I_ERROR_CLASS);
+        nmsg = H5I_nmembers(H5I_ERROR_MSG);
+        nstk = H5I_nmembers(H5I_ERROR_STACK);
+
+        if((ncls + nmsg + nstk) > 0) {
+            /* Clear any outstanding error stacks */
+            if(nstk > 0)
+	        (void)H5I_clear_type(H5I_ERROR_STACK, FALSE, FALSE);
+
+            /* Clear all the error classes */
+	    if(ncls > 0) {
+	        (void)H5I_clear_type(H5I_ERROR_CLASS, FALSE, FALSE);
+
+                /* Reset the HDF5 error class, if its been closed */
+                if(H5I_nmembers(H5I_ERROR_CLASS) == 0)
+                    H5E_ERR_CLS_g = -1;
+            } /* end if */
+
+            /* Clear all the error messages */
+	    if(nmsg > 0) {
+	        (void)H5I_clear_type(H5I_ERROR_MSG, FALSE, FALSE);
+
+                /* Reset the HDF5 error messages, if they've been closed */
+                if(H5I_nmembers(H5I_ERROR_MSG) == 0) {
+                    /* Include the automatically generated error code termination */
+                    #include "H5Eterm.h"
+                } /* end if */
+            } /* end if */
+
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Close deprecated interface */
+            n += H5E__term_deprec_interface();
+
+	    /* Destroy the error class, message, and stack id groups */
+	    (void)H5I_dec_type_ref(H5I_ERROR_STACK);
+	    (void)H5I_dec_type_ref(H5I_ERROR_CLASS);
+	    (void)H5I_dec_type_ref(H5I_ERROR_MSG);
+            n++; /*H5I*/
+
+	    /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5E_term_interface() */
+
+

+#ifdef H5_HAVE_THREADSAFE
+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_stack
+ *
+ * Purpose:	Support function for H5E_get_my_stack() to initialize and
+ *              acquire per-thread error stack.
+ *
+ * Return:	Success:	error stack (H5E_t *)
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Chee Wai LEE
+ *              April 24, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+H5E_t *
+H5E_get_stack(void)
+{
+    H5E_t *estack;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    estack = (H5E_t *)H5TS_get_thread_local_value(H5TS_errstk_key_g);
+
+    if(!estack) {
+        /* No associated value with current thread - create one */
+#ifdef H5_HAVE_WIN_THREADS
+        estack = (H5E_t *)LocalAlloc(LPTR, sizeof(H5E_t)); /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
+#else
+        estack = (H5E_t *)H5FL_MALLOC(H5E_t);
+#endif /* H5_HAVE_WIN_THREADS */
+        HDassert(estack);
+
+        /* Set the thread-specific info */
+        estack->nused = 0;
+        H5E_set_default_auto(estack);
+
+        /* (It's not necessary to release this in this API, it is
+         *      released by the "key destructor" set up in the H5TS
+         *      routines.  See calls to pthread_key_create() in H5TS.c -QAK)
+         */
+        H5TS_set_thread_local_value(H5TS_errstk_key_g, (void *)estack);
+    } /* end if */
+
+    /* Set return value */
+    FUNC_LEAVE_NOAPI(estack)
+} /* end H5E_get_stack() */
+#endif  /* H5_HAVE_THREADSAFE */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_free_class
+ *
+ * Purpose:	Private function to free an error class.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 22, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_free_class(H5E_cls_t *cls)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(cls);
+
+    /* Free error class structure */
+    cls->cls_name = (char *)H5MM_xfree((void*)cls->cls_name);
+    cls->lib_name = (char *)H5MM_xfree((void*)cls->lib_name);
+    cls->lib_vers = (char *)H5MM_xfree((void*)cls->lib_vers);
+    cls = H5FL_FREE(H5E_cls_t, cls);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_free_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eregister_class
+ *
+ * Purpose:	Registers an error class.
+ *
+ * Return:	Non-negative value as class ID on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Eregister_class(const char *cls_name, const char *lib_name, const char *version)
+{
+    H5E_cls_t   *cls;        /* Pointer to error class */
+    hid_t       ret_value;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "*s*s*s", cls_name, lib_name, version);
+
+    /* Check arguments */
+    if(cls_name == NULL || lib_name == NULL || version == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid string")
+
+    /* Create the new error class object */
+    if(NULL == (cls = H5E_register_class(cls_name, lib_name, version)))
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTCREATE, FAIL, "can't create error class")
+
+    /* Register the new error class to get an ID for it */
+    if((ret_value = H5I_register(H5I_ERROR_CLASS, cls, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error class")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eregister_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_register_class
+ *
+ * Purpose:	Private function to register an error class.
+ *
+ * Return:	Non-negative value as class ID on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5E_cls_t *
+H5E_register_class(const char *cls_name, const char *lib_name, const char *version)
+{
+    H5E_cls_t   *cls = NULL; /* Pointer to error class */
+    H5E_cls_t   *ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(cls_name);
+    HDassert(lib_name);
+    HDassert(version);
+
+    /* Allocate space for new error class */
+    if(NULL == (cls = H5FL_CALLOC(H5E_cls_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Duplicate string information */
+    if(NULL == (cls->cls_name = H5MM_xstrdup(cls_name)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(NULL == (cls->lib_name = H5MM_xstrdup(lib_name)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(NULL == (cls->lib_vers = H5MM_xstrdup(version)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the return value */
+    ret_value = cls;
+
+done:
+    if(!ret_value)
+        if(cls && H5E_free_class(cls) < 0)
+            HDONE_ERROR(H5E_ERROR, H5E_CANTRELEASE, NULL, "unable to free error class")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_register_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eunregister_class
+ *
+ * Purpose:	Closes an error class.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eunregister_class(hid_t class_id)
+{
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", class_id);
+
+    /* Check arguments */
+    if(H5I_ERROR_CLASS != H5I_get_type(class_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an error class")
+
+    /*
+     * Decrement the counter on the dataset.  It will be freed if the count
+     * reaches zero.
+     */
+    if(H5I_dec_app_ref(class_id) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error class")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eunregister_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_unregister_class
+ *
+ * Purpose:	Private function to close an error class.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_unregister_class(H5E_cls_t *cls)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(cls);
+
+    /* Iterate over all the messages and delete those in this error class */
+    if(H5I_iterate(H5I_ERROR_MSG, H5E_close_msg_cb, cls, FALSE) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_BADITER, FAIL, "unable to free all messages in this error class")
+
+    /* Free error class structure */
+    if(H5E_free_class(cls) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTRELEASE, FAIL, "unable to free error class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_unregister_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_class_name
+ *
+ * Purpose:	Retrieves error class name.
+ *
+ * Return:      Non-negative for name length if succeeds(zero means no name);
+ *              otherwise returns negative value.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Eget_class_name(hid_t class_id, char *name, size_t size)
+{
+    H5E_cls_t   *cls;        /* Pointer to error class */
+    ssize_t     ret_value;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "i*sz", class_id, name, size);
+
+    /* Get the error class */
+    if(NULL == (cls = (H5E_cls_t *)H5I_object_verify(class_id, H5I_ERROR_CLASS)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error class ID")
+
+    /* Retrieve the class name */
+    if((ret_value = H5E_get_class_name(cls, name, size)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get error class name")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_class_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_class_name
+ *
+ * Purpose:	Private function to retrieve error class name.
+ *
+ * Return:      Non-negative for name length if succeeds(zero means no name);
+ *              otherwise returns negative value.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5E_get_class_name(const H5E_cls_t *cls, char *name, size_t size)
+{
+    ssize_t       len;          /* Length of error class's name */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(cls);
+
+    /* Get the class's name */
+    len = (ssize_t)HDstrlen(cls->cls_name);
+
+    /* Set the user's buffer, if provided */
+    if(name) {
+       HDstrncpy(name, cls->cls_name, MIN((size_t)(len + 1), size));
+       if((size_t)len >= size)
+          name[size - 1] = '\0';
+    } /* end if */
+
+    /* Return the full length */
+    FUNC_LEAVE_NOAPI(len)
+} /* end H5E_get_class_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5E_close_msg_cb
+ *
+ * Purpose:     H5I_iterate callback function to close error messages in the
+ *              error class.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5E_close_msg_cb(void *obj_ptr, hid_t obj_id, void *udata)
+{
+    H5E_msg_t   *err_msg = (H5E_msg_t*)obj_ptr;
+    H5E_cls_t   *cls = (H5E_cls_t*)udata;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(err_msg);
+
+    /* Close the message if it is in the class being closed */
+    if(err_msg->cls == cls) {
+        if(H5E_close_msg(err_msg) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTCLOSEOBJ, FAIL, "unable to close error message")
+        if(NULL == H5I_remove(obj_id))
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTREMOVE, FAIL, "unable to remove error message")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_close_msg_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eclose_msg
+ *
+ * Purpose:	Closes a major or minor error.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eclose_msg(hid_t err_id)
+{
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", err_id);
+
+    /* Check arguments */
+    if(H5I_ERROR_MSG != H5I_get_type(err_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an error class")
+
+    /* Decrement the counter.  It will be freed if the count reaches zero. */
+    if(H5I_dec_app_ref(err_id) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error message")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eclose_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_close_msg
+ *
+ * Purpose:	Private function to close an error messge.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_close_msg(H5E_msg_t *err)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(err);
+
+    /* Release message */
+    err->msg = (char *)H5MM_xfree((void *)err->msg);
+    /* Don't free err->cls here */
+    err = H5FL_FREE(H5E_msg_t, err);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_close_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ecreate_msg
+ *
+ * Purpose:	Creates a major or minor error, returns an ID.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Ecreate_msg(hid_t class_id, H5E_type_t msg_type, const char *msg_str)
+{
+    H5E_cls_t   *cls;           /* Pointer to error class */
+    H5E_msg_t   *msg;           /* Pointer to new error message */
+    hid_t       ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iEt*s", class_id, msg_type, msg_str);
+
+    /* Check arguments */
+    if(msg_type != H5E_MAJOR && msg_type != H5E_MINOR)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid message type")
+    if(msg_str == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "message is NULL")
+
+    /* Get the error class */
+    if(NULL == (cls = (H5E_cls_t *)H5I_object_verify(class_id, H5I_ERROR_CLASS)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error class ID")
+
+    /* Create the new error message object */
+    if(NULL == (msg = H5E_create_msg(cls, msg_type, msg_str)))
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTCREATE, FAIL, "can't create error message")
+
+    /* Register the new error class to get an ID for it */
+    if((ret_value = H5I_register(H5I_ERROR_MSG, msg, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ecreate_msg() */
+
+/*-------------------------------------------------------------------------
+ * Function:	H5E_create_msg
+ *
+ * Purpose:	Private function to create a major or minor error.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5E_msg_t *
+H5E_create_msg(H5E_cls_t *cls, H5E_type_t msg_type, const char *msg_str)
+{
+    H5E_msg_t   *msg = NULL;    /* Pointer to new error message */
+    H5E_msg_t   *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(cls);
+    HDassert(msg_type == H5E_MAJOR || msg_type == H5E_MINOR);
+    HDassert(msg_str);
+
+    /* Allocate new message object */
+    if(NULL == (msg = H5FL_MALLOC(H5E_msg_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Fill new message object */
+    msg->cls = cls;
+    msg->type = msg_type;
+    if(NULL == (msg->msg = H5MM_xstrdup(msg_str)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set return value */
+    ret_value = msg;
+
+done:
+    if(!ret_value)
+        if(msg && H5E_close_msg(msg) < 0)
+            HDONE_ERROR(H5E_ERROR, H5E_CANTCLOSEOBJ, NULL, "unable to close error message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_create_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_msg
+ *
+ * Purpose:	Retrieves an error message.
+ *
+ * Return:      Non-negative for message length if succeeds(zero means no message);
+ *              otherwise returns negative value.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Eget_msg(hid_t msg_id, H5E_type_t *type, char *msg_str, size_t size)
+{
+    H5E_msg_t   *msg;           /* Pointer to error message */
+    ssize_t      ret_value;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Zs", "i*Et*sz", msg_id, type, msg_str, size);
+
+    /* Get the message object */
+    if(NULL == (msg = (H5E_msg_t *)H5I_object_verify(msg_id, H5I_ERROR_MSG)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error message ID")
+
+    /* Get the message's text */
+    if((ret_value = H5E_get_msg(msg, type, msg_str, size)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get error message text")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ecreate_stack
+ *
+ * Purpose:	Creates a new, empty, error stack.
+ *
+ * Return:	Non-negative value as stack ID on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Ecreate_stack(void)
+{
+    H5E_t	*stk;           /* Error stack */
+    hid_t       ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE0("i","");
+
+    /* Allocate a new error stack */
+    if(NULL == (stk = H5FL_CALLOC(H5E_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Set the "automatic" error reporting info to the library default */
+    H5E_set_default_auto(stk);
+
+    /* Register the stack */
+    if((ret_value = H5I_register(H5I_ERROR_STACK, stk, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't create error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ecreate_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_current_stack
+ *
+ * Purpose:	Registers current error stack, returns object handle for it,
+ *              clears it.
+ *
+ * Return:	Non-negative value as stack ID on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Eget_current_stack(void)
+{
+    H5E_t	*stk;           /* Error stack */
+    hid_t       ret_value;   /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE0("i","");
+
+    /* Get the current stack */
+    if(NULL == (stk = H5E_get_current_stack()))
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTCREATE, FAIL, "can't create error stack")
+
+    /* Register the stack */
+    if((ret_value = H5I_register(H5I_ERROR_STACK, stk, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't create error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_current_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_current_stack
+ *
+ * Purpose:	Private function to register an error stack.
+ *
+ * Return:	Non-negative value as class ID on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 11, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5E_t *
+H5E_get_current_stack(void)
+{
+    H5E_t	*current_stack; /* Pointer to the current error stack */
+    H5E_t	*estack_copy=NULL;   /* Pointer to new error stack to return */
+    unsigned    u;              /* Local index variable */
+    H5E_t      *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get a pointer to the current error stack */
+    if(NULL == (current_stack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "can't get current error stack")
+
+    /* Allocate a new error stack */
+    if(NULL == (estack_copy = H5FL_CALLOC(H5E_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Make a copy of current error stack */
+    estack_copy->nused = current_stack->nused;
+    for(u = 0; u < current_stack->nused; u++) {
+        H5E_error2_t *current_error, *new_error; /* Pointers to errors on each stack */
+
+        /* Get pointers into the current error stack location */
+        current_error = &(current_stack->slot[u]);
+        new_error = &(estack_copy->slot[u]);
+
+        /* Increment the IDs to indicate that they are used in this stack */
+        if(H5I_inc_ref(current_error->cls_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, NULL, "unable to increment ref count on error class")
+        new_error->cls_id = current_error->cls_id;
+        if(H5I_inc_ref(current_error->maj_num, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, NULL, "unable to increment ref count on error message")
+        new_error->maj_num = current_error->maj_num;
+        if(H5I_inc_ref(current_error->min_num, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, NULL, "unable to increment ref count on error message")
+        new_error->min_num = current_error->min_num;
+        if(NULL == (new_error->func_name = H5MM_xstrdup(current_error->func_name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        if(NULL == (new_error->file_name = H5MM_xstrdup(current_error->file_name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        new_error->line = current_error->line;
+        if(NULL == (new_error->desc = H5MM_xstrdup(current_error->desc)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    } /* end for */
+
+    /* Copy the "automatic" error reporting information */
+    estack_copy->auto_op = current_stack->auto_op;
+    estack_copy->auto_data = current_stack->auto_data;
+
+    /* Empty current error stack */
+    H5E_clear_stack(current_stack);
+
+    /* Set the return value */
+    ret_value = estack_copy;
+
+done:
+    if(ret_value == NULL)
+        if(estack_copy)
+            estack_copy = H5FL_FREE(H5E_t, estack_copy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_get_current_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eset_current_stack
+ *
+ * Purpose:     Replaces current stack with specified stack.  This closes the
+ *		stack ID also.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 15, 2003
+ *
+ * Modification:
+ *              Raymond Lu
+ *              7 September 2010
+ *              Also closes the stack to avoid potential problem (bug 1799)
+ * 
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eset_current_stack(hid_t err_stack)
+{
+    H5E_t *estack;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", err_stack);
+
+    if(err_stack != H5E_DEFAULT) {
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+
+        /* Set the current error stack */
+        if(H5E_set_current_stack(estack) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "unable to set error stack")
+
+        /*
+         * Decrement the counter on the error stack.  It will be freed if the count
+         * reaches zero.
+         */
+        if(H5I_dec_app_ref(err_stack) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error stack")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eset_current_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_set_current_stack
+ *
+ * Purpose:	Private function to replace an error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_set_current_stack(H5E_t *estack)
+{
+    H5E_t	*current_stack;         /* Default error stack */
+    unsigned     u;                     /* Local index variable */
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(estack);
+
+    /* Get a pointer to the current error stack */
+    if(NULL == (current_stack = H5E_get_my_stack ())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Empty current error stack */
+    H5E_clear_stack(current_stack);
+
+    /* Copy new stack to current error stack */
+    current_stack->nused = estack->nused;
+    for(u = 0; u < current_stack->nused; u++) {
+        H5E_error2_t *current_error, *new_error; /* Pointers to errors on each stack */
+
+        /* Get pointers into the current error stack location */
+        current_error = &(current_stack->slot[u]);
+        new_error = &(estack->slot[u]);
+
+        /* Increment the IDs to indicate that they are used in this stack */
+        if(H5I_inc_ref(new_error->cls_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, FAIL, "unable to increment ref count on error class")
+        current_error->cls_id = new_error->cls_id;
+        if(H5I_inc_ref(new_error->maj_num, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, FAIL, "unable to increment ref count on error class")
+        current_error->maj_num = new_error->maj_num;
+        if(H5I_inc_ref(new_error->min_num, FALSE) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTINC, FAIL, "unable to increment ref count on error class")
+        current_error->min_num = new_error->min_num;
+        if(NULL == (current_error->func_name = H5MM_xstrdup(new_error->func_name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        if(NULL == (current_error->file_name = H5MM_xstrdup(new_error->file_name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        current_error->line = new_error->line;
+        if(NULL == (current_error->desc = H5MM_xstrdup(new_error->desc)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_set_current_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eclose_stack
+ *
+ * Purpose:	Closes an error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eclose_stack(hid_t stack_id)
+{
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", stack_id);
+
+    if(H5E_DEFAULT != stack_id) {
+        /* Check arguments */
+        if(H5I_ERROR_STACK != H5I_get_type(stack_id))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+
+        /*
+         * Decrement the counter on the error stack.  It will be freed if the count
+         * reaches zero.
+         */
+        if(H5I_dec_app_ref(stack_id) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error stack")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eclose_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_close_stack
+ *
+ * Purpose:	Private function to close an error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_close_stack(H5E_t *estack)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(estack);
+
+    /* Release the stack's error information */
+    H5E_clear_stack(estack);
+
+    /* Free the stack structure */
+    estack = H5FL_FREE(H5E_t, estack);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_close_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_num
+ *
+ * Purpose:	Retrieves the number of error message.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Eget_num(hid_t error_stack_id)
+{
+    H5E_t *estack;         /* Error stack to operate on */
+    ssize_t ret_value;      /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE1("Zs", "i", error_stack_id);
+
+    /* Need to check for errors */
+    if(error_stack_id == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        /* Get the error stack to operate on */
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(error_stack_id, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+    /* Get the number of errors on stack */
+    if((ret_value = H5E_get_num(estack)) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get number of errors")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_num() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_num
+ *
+ * Purpose:	Private function to retrieve number of errors in error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5E_get_num(const H5E_t *estack)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(estack);
+
+    FUNC_LEAVE_NOAPI((ssize_t)estack->nused)
+} /* end H5E_get_num() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Epop
+ *
+ * Purpose:	Deletes some error messages from the top of error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Epop(hid_t err_stack, size_t count)
+{
+    H5E_t *estack;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE2("e", "iz", err_stack, count);
+
+    /* Need to check for errors */
+    if(err_stack == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        /* Get the error stack to operate on */
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+    /* Range limit the number of errors to pop off stack */
+    if(count > estack->nused)
+        count = estack->nused;
+
+    /* Pop the errors off the stack */
+    if(H5E_pop(estack, count) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTRELEASE, FAIL, "can't pop errors from stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Epop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Epush2
+ *
+ * Purpose:	Pushes a new error record onto error stack for the current
+ *		thread.  The error has major and minor IDs MAJ_ID and
+ *		MIN_ID, the name of a function where the error was detected,
+ *		the name of the file where the error was detected, the
+ *		line within that file, and an error description string.  The
+ *		function name, file name, and error description strings must
+ *		be statically allocated.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, October 18, 1999
+ *
+ * Notes: 	Basically a new public API wrapper around the H5E_push_stack
+ *              function.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Epush2(hid_t err_stack, const char *file, const char *func, unsigned line,
+        hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...)
+{
+    va_list     ap;             /* Varargs info */
+    H5E_t       *estack;        /* Pointer to error stack to modify */
+#ifndef H5_HAVE_VASPRINTF
+    int         tmp_len;        /* Current size of description buffer */
+    int         desc_len;       /* Actual length of description when formatted */
+#endif /* H5_HAVE_VASPRINTF */
+    char        *tmp = NULL;      /* Buffer to place formatted description in */
+    hbool_t     va_started = FALSE; /* Whether the variable argument list is open */
+    herr_t	ret_value=SUCCEED;      /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE8("e", "i*s*sIuiii*s", err_stack, file, func, line, cls_id, maj_id,
+             min_id, fmt);
+
+    if(err_stack == H5E_DEFAULT)
+    	estack = NULL;
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        /* Get the error stack to operate on */
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+/* Note that the variable-argument parsing for the format is identical in
+ *      the H5E_printf_stack() routine - correct errors and make changes in both
+ *      places. -QAK
+ */
+
+    /* Format the description */
+    va_start(ap, fmt);
+    va_started = TRUE;
+
+#ifdef H5_HAVE_VASPRINTF
+    /* Use the vasprintf() routine, since it does what we're trying to do below */
+    if(HDvasprintf(&tmp, fmt, ap) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+#else /* H5_HAVE_VASPRINTF */
+    /* Allocate space for the formatted description buffer */
+    tmp_len = 128;
+    if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* If the description doesn't fit into the initial buffer size, allocate more space and try again */
+    while((desc_len = HDvsnprintf(tmp, (size_t)tmp_len, fmt, ap)) > (tmp_len - 1)) {
+        /* shutdown & restart the va_list */
+        va_end(ap);
+        va_start(ap, fmt);
+
+        /* Release the previous description, it's too small */
+        H5MM_xfree(tmp);
+
+        /* Allocate a description of the appropriate length */
+        tmp_len = desc_len + 1;
+        if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    } /* end while */
+#endif /* H5_HAVE_VASPRINTF */
+
+    /* Push the error on the stack */
+    if(H5E_push_stack(estack, file, func, line, cls_id, maj_id, min_id, tmp) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't push error on stack")
+
+done:
+    if(va_started)
+        va_end(ap);
+    if(tmp)
+        H5MM_xfree(tmp);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Epush2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eclear2
+ *
+ * Purpose:	Clears the error stack for the specified error stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Wednesday, July 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eclear2(hid_t err_stack)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE1("e", "i", err_stack);
+
+    /* Need to check for errors */
+    if(err_stack == H5E_DEFAULT)
+    	estack = NULL;
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+    /* Clear the error stack */
+    if(H5E_clear_stack(estack) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't clear error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eclear2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eprint2
+ *
+ * Purpose:	Prints the error stack in some default way.  This is just a
+ *		convenience function for H5Ewalk() with a function that
+ *		prints error messages.  Users are encouraged to write there
+ *		own more specific error handlers.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eprint2(hid_t err_stack, FILE *stream)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    /*NO TRACE*/
+
+    /* Need to check for errors */
+    if(err_stack == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+    /* Print error stack */
+    if(H5E_print(estack, stream, FALSE) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't display error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eprint2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ewalk2
+ *
+ * Purpose:	Walks the error stack for the current thread and calls some
+ *		function for each error along the way.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ewalk2(hid_t err_stack, H5E_direction_t direction, H5E_walk2_t stack_func, void *client_data)
+{
+    H5E_t *estack;                      /* Error stack to operate on */
+    H5E_walk_op_t op;                   /* Operator for walking error stack */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    /*NO TRACE*/
+
+    /* Need to check for errors */
+    if(err_stack == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else {
+        /* Only clear the error stack if it's not the default stack */
+        H5E_clear_stack(NULL);
+
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+    } /* end else */
+
+    /* Walk the error stack */
+    op.vers = 2;
+    op.u.func2 = stack_func;
+    if(H5E_walk(estack, direction, &op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ewalk2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_auto2
+ *
+ * Purpose:	Returns the current settings for the automatic error stack
+ *		traversal function and its data for specific error stack.
+ *		Either (or both) arguments may be null in which case the
+ *		value is not returned.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Saturday, February 28, 1998
+ *
+ * Modification:Raymond Lu
+ *              4 October 2010
+ *              If the printing function isn't the default H5Eprint1 or 2, 
+ *              and H5Eset_auto1 has been called to set the old style 
+ *              printing function, a call to H5Eget_auto2 should fail.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eget_auto2(hid_t estack_id, H5E_auto2_t *func, void **client_data)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    H5E_auto_op_t op;           /* Error stack function */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x**x", estack_id, func, client_data);
+
+    if(estack_id == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(estack_id, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+
+    /* Get the automatic error reporting information */
+    if(H5E_get_auto(estack, &op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info")
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    /* Fail if the printing function isn't the default(user-set) and set through H5Eset_auto1 */
+    if(!op.is_default && op.vers == 1)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "wrong API function, H5Eset_auto1 has been called")
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+    if(func)
+        *func = op.func2;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_auto2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eset_auto2
+ *
+ * Purpose:	Turns on or off automatic printing of errors for certain
+ *              error stack.  When turned on (non-null FUNC pointer) any
+ *              API function which returns an error indication will first
+ *              call FUNC passing it CLIENT_DATA as an argument.
+ *
+ *		The default values before this function is called are
+ *		H5Eprint2() with client data being the standard error stream,
+ *		stderr.
+ *
+ *		Automatic stack traversal is always in the H5E_WALK_DOWNWARD
+ *		direction.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 27, 1998
+ *
+ * Modification:Raymond Lu
+ *              4 October 2010
+ *              If the FUNC is H5Eprint2, put the IS_DEFAULT flag on.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eset_auto2(hid_t estack_id, H5E_auto2_t func, void *client_data)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    H5E_auto_op_t op;           /* Error stack operator */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE3("e", "ix*x", estack_id, func, client_data);
+
+    if(estack_id == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(estack_id, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    /* Get the automatic error reporting information */
+    if(H5E_get_auto(estack, &op, NULL) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info")
+
+    /* Set the automatic error reporting information */
+    if(func != op.func2_default)
+        op.is_default = FALSE;
+    else
+        op.is_default = TRUE;
+
+    op.vers = 2;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+    /* Set the automatic error reporting function */
+    op.func2 = func;
+
+    if(H5E_set_auto(estack, &op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't set automatic error info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eset_auto2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eauto_is_v2
+ *
+ * Purpose:	Determines if the error auto reporting function for an
+ *              error stack conforms to the H5E_auto_stack_t typedef
+ *              or the H5E_auto_t typedef.  The IS_STACK parameter is set
+ *              to 1 for the first case and 0 for the latter case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, September  8, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eauto_is_v2(hid_t estack_id, unsigned *is_stack)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", estack_id, is_stack);
+
+    if(estack_id == H5E_DEFAULT) {
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+    } /* end if */
+    else
+        if(NULL == (estack = (H5E_t *)H5I_object_verify(estack_id, H5I_ERROR_STACK)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a error stack ID")
+
+    /* Check if the error stack reporting function is the "newer" stack type */
+    if(is_stack)
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        *is_stack = estack->auto_op.vers > 1;
+#else
+        *is_stack = 1;
+#endif
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eauto_is_v2() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Edefin.h b/gatb-core/thirdparty/hdf5/src/H5Edefin.h
new file mode 100644
index 0000000..8bc52dd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Edefin.h
@@ -0,0 +1,216 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_err -- do not edit */
+/* Add new errors to H5err.txt file */
+
+
+#ifndef _H5Edefin_H
+#define _H5Edefin_H
+
+/* Major error IDs */
+hid_t H5E_DATASET_g        = FAIL;      /* Dataset */
+hid_t H5E_FUNC_g           = FAIL;      /* Function entry/exit */
+hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
+hid_t H5E_FILE_g           = FAIL;      /* File accessibilty */
+hid_t H5E_SOHM_g           = FAIL;      /* Shared Object Header Messages */
+hid_t H5E_SYM_g            = FAIL;      /* Symbol table */
+hid_t H5E_PLUGIN_g         = FAIL;      /* Plugin for dynamically loaded library */
+hid_t H5E_VFL_g            = FAIL;      /* Virtual File Layer */
+hid_t H5E_INTERNAL_g       = FAIL;      /* Internal error (too specific to document in detail) */
+hid_t H5E_BTREE_g          = FAIL;      /* B-Tree node */
+hid_t H5E_REFERENCE_g      = FAIL;      /* References */
+hid_t H5E_DATASPACE_g      = FAIL;      /* Dataspace */
+hid_t H5E_RESOURCE_g       = FAIL;      /* Resource unavailable */
+hid_t H5E_PLIST_g          = FAIL;      /* Property lists */
+hid_t H5E_LINK_g           = FAIL;      /* Links */
+hid_t H5E_DATATYPE_g       = FAIL;      /* Datatype */
+hid_t H5E_RS_g             = FAIL;      /* Reference Counted Strings */
+hid_t H5E_HEAP_g           = FAIL;      /* Heap */
+hid_t H5E_OHDR_g           = FAIL;      /* Object header */
+hid_t H5E_ATOM_g           = FAIL;      /* Object atom */
+hid_t H5E_ATTR_g           = FAIL;      /* Attribute */
+hid_t H5E_NONE_MAJOR_g     = FAIL;      /* No error */
+hid_t H5E_IO_g             = FAIL;      /* Low-level I/O */
+hid_t H5E_SLIST_g          = FAIL;      /* Skip Lists */
+hid_t H5E_EFL_g            = FAIL;      /* External file list */
+hid_t H5E_TST_g            = FAIL;      /* Ternary Search Trees */
+hid_t H5E_ARGS_g           = FAIL;      /* Invalid arguments to routine */
+hid_t H5E_ERROR_g          = FAIL;      /* Error API */
+hid_t H5E_PLINE_g          = FAIL;      /* Data filters */
+hid_t H5E_FSPACE_g         = FAIL;      /* Free Space Manager */
+hid_t H5E_CACHE_g          = FAIL;      /* Object cache */
+
+/* Minor error IDs */
+
+/* Generic low-level file I/O errors */
+hid_t H5E_SEEKERROR_g      = FAIL;      /* Seek failed */
+hid_t H5E_READERROR_g      = FAIL;      /* Read failed */
+hid_t H5E_WRITEERROR_g     = FAIL;      /* Write failed */
+hid_t H5E_CLOSEERROR_g     = FAIL;      /* Close failed */
+hid_t H5E_OVERFLOW_g       = FAIL;      /* Address overflowed */
+hid_t H5E_FCNTL_g          = FAIL;      /* File control (fcntl) failed */
+
+/* Resource errors */
+hid_t H5E_NOSPACE_g        = FAIL;      /* No space available for allocation */
+hid_t H5E_CANTALLOC_g      = FAIL;      /* Can't allocate space */
+hid_t H5E_CANTCOPY_g       = FAIL;      /* Unable to copy object */
+hid_t H5E_CANTFREE_g       = FAIL;      /* Unable to free object */
+hid_t H5E_ALREADYEXISTS_g  = FAIL;      /* Object already exists */
+hid_t H5E_CANTLOCK_g       = FAIL;      /* Unable to lock object */
+hid_t H5E_CANTUNLOCK_g     = FAIL;      /* Unable to unlock object */
+hid_t H5E_CANTGC_g         = FAIL;      /* Unable to garbage collect */
+hid_t H5E_CANTGETSIZE_g    = FAIL;      /* Unable to compute size */
+hid_t H5E_OBJOPEN_g        = FAIL;      /* Object is already open */
+
+/* Heap errors */
+hid_t H5E_CANTRESTORE_g    = FAIL;      /* Can't restore condition */
+hid_t H5E_CANTCOMPUTE_g    = FAIL;      /* Can't compute value */
+hid_t H5E_CANTEXTEND_g     = FAIL;      /* Can't extend heap's space */
+hid_t H5E_CANTATTACH_g     = FAIL;      /* Can't attach object */
+hid_t H5E_CANTUPDATE_g     = FAIL;      /* Can't update object */
+hid_t H5E_CANTOPERATE_g    = FAIL;      /* Can't operate on object */
+
+/* Function entry/exit interface errors */
+hid_t H5E_CANTINIT_g       = FAIL;      /* Unable to initialize object */
+hid_t H5E_ALREADYINIT_g    = FAIL;      /* Object already initialized */
+hid_t H5E_CANTRELEASE_g    = FAIL;      /* Unable to release object */
+
+/* Property list errors */
+hid_t H5E_CANTGET_g        = FAIL;      /* Can't get value */
+hid_t H5E_CANTSET_g        = FAIL;      /* Can't set value */
+hid_t H5E_DUPCLASS_g       = FAIL;      /* Duplicate class name in parent class */
+hid_t H5E_SETDISALLOWED_g  = FAIL;      /* Disallowed operation */
+
+/* Free space errors */
+hid_t H5E_CANTMERGE_g      = FAIL;      /* Can't merge objects */
+hid_t H5E_CANTREVIVE_g     = FAIL;      /* Can't revive object */
+hid_t H5E_CANTSHRINK_g     = FAIL;      /* Can't shrink container */
+
+/* Object header related errors */
+hid_t H5E_LINKCOUNT_g      = FAIL;      /* Bad object header link count */
+hid_t H5E_VERSION_g        = FAIL;      /* Wrong version number */
+hid_t H5E_ALIGNMENT_g      = FAIL;      /* Alignment error */
+hid_t H5E_BADMESG_g        = FAIL;      /* Unrecognized message */
+hid_t H5E_CANTDELETE_g     = FAIL;      /* Can't delete message */
+hid_t H5E_BADITER_g        = FAIL;      /* Iteration failed */
+hid_t H5E_CANTPACK_g       = FAIL;      /* Can't pack messages */
+hid_t H5E_CANTRESET_g      = FAIL;      /* Can't reset object */
+hid_t H5E_CANTRENAME_g     = FAIL;      /* Unable to rename object */
+
+/* System level errors */
+hid_t H5E_SYSERRSTR_g      = FAIL;      /* System error message */
+
+/* I/O pipeline errors */
+hid_t H5E_NOFILTER_g       = FAIL;      /* Requested filter is not available */
+hid_t H5E_CALLBACK_g       = FAIL;      /* Callback failed */
+hid_t H5E_CANAPPLY_g       = FAIL;      /* Error from filter 'can apply' callback */
+hid_t H5E_SETLOCAL_g       = FAIL;      /* Error from filter 'set local' callback */
+hid_t H5E_NOENCODER_g      = FAIL;      /* Filter present but encoding disabled */
+hid_t H5E_CANTFILTER_g     = FAIL;      /* Filter operation failed */
+
+/* Group related errors */
+hid_t H5E_CANTOPENOBJ_g    = FAIL;      /* Can't open object */
+hid_t H5E_CANTCLOSEOBJ_g   = FAIL;      /* Can't close object */
+hid_t H5E_COMPLEN_g        = FAIL;      /* Name component is too long */
+hid_t H5E_PATH_g           = FAIL;      /* Problem with path to object */
+
+/* No error */
+hid_t H5E_NONE_MINOR_g     = FAIL;      /* No error */
+
+/* Plugin errors */
+hid_t H5E_OPENERROR_g      = FAIL;      /* Can't open directory or file */
+
+/* File accessibilty errors */
+hid_t H5E_FILEEXISTS_g     = FAIL;      /* File already exists */
+hid_t H5E_FILEOPEN_g       = FAIL;      /* File already open */
+hid_t H5E_CANTCREATE_g     = FAIL;      /* Unable to create file */
+hid_t H5E_CANTOPENFILE_g   = FAIL;      /* Unable to open file */
+hid_t H5E_CANTCLOSEFILE_g  = FAIL;      /* Unable to close file */
+hid_t H5E_NOTHDF5_g        = FAIL;      /* Not an HDF5 file */
+hid_t H5E_BADFILE_g        = FAIL;      /* Bad file ID accessed */
+hid_t H5E_TRUNCATED_g      = FAIL;      /* File has been truncated */
+hid_t H5E_MOUNT_g          = FAIL;      /* File mount error */
+
+/* Object atom related errors */
+hid_t H5E_BADATOM_g        = FAIL;      /* Unable to find atom information (already closed?) */
+hid_t H5E_BADGROUP_g       = FAIL;      /* Unable to find ID group information */
+hid_t H5E_CANTREGISTER_g   = FAIL;      /* Unable to register new atom */
+hid_t H5E_CANTINC_g        = FAIL;      /* Unable to increment reference count */
+hid_t H5E_CANTDEC_g        = FAIL;      /* Unable to decrement reference count */
+hid_t H5E_NOIDS_g          = FAIL;      /* Out of IDs for group */
+
+/* Cache related errors */
+hid_t H5E_CANTFLUSH_g      = FAIL;      /* Unable to flush data from cache */
+hid_t H5E_CANTSERIALIZE_g  = FAIL;      /* Unable to serialize data from cache */
+hid_t H5E_CANTLOAD_g       = FAIL;      /* Unable to load metadata into cache */
+hid_t H5E_PROTECT_g        = FAIL;      /* Protected metadata error */
+hid_t H5E_NOTCACHED_g      = FAIL;      /* Metadata not currently cached */
+hid_t H5E_SYSTEM_g         = FAIL;      /* Internal error detected */
+hid_t H5E_CANTINS_g        = FAIL;      /* Unable to insert metadata into cache */
+hid_t H5E_CANTPROTECT_g    = FAIL;      /* Unable to protect metadata */
+hid_t H5E_CANTUNPROTECT_g  = FAIL;      /* Unable to unprotect metadata */
+hid_t H5E_CANTPIN_g        = FAIL;      /* Unable to pin cache entry */
+hid_t H5E_CANTUNPIN_g      = FAIL;      /* Unable to un-pin cache entry */
+hid_t H5E_CANTMARKDIRTY_g  = FAIL;      /* Unable to mark a pinned entry as dirty */
+hid_t H5E_CANTDIRTY_g      = FAIL;      /* Unable to mark metadata as dirty */
+hid_t H5E_CANTEXPUNGE_g    = FAIL;      /* Unable to expunge a metadata cache entry */
+hid_t H5E_CANTRESIZE_g     = FAIL;      /* Unable to resize a metadata cache entry */
+
+/* Link related errors */
+hid_t H5E_TRAVERSE_g       = FAIL;      /* Link traversal failure */
+hid_t H5E_NLINKS_g         = FAIL;      /* Too many soft links in path */
+hid_t H5E_NOTREGISTERED_g  = FAIL;      /* Link class not registered */
+hid_t H5E_CANTMOVE_g       = FAIL;      /* Can't move object */
+hid_t H5E_CANTSORT_g       = FAIL;      /* Can't sort objects */
+
+/* Parallel MPI errors */
+hid_t H5E_MPI_g            = FAIL;      /* Some MPI function failed */
+hid_t H5E_MPIERRSTR_g      = FAIL;      /* MPI Error String */
+hid_t H5E_CANTRECV_g       = FAIL;      /* Can't receive data */
+
+/* Dataspace errors */
+hid_t H5E_CANTCLIP_g       = FAIL;      /* Can't clip hyperslab region */
+hid_t H5E_CANTCOUNT_g      = FAIL;      /* Can't count elements */
+hid_t H5E_CANTSELECT_g     = FAIL;      /* Can't select hyperslab */
+hid_t H5E_CANTNEXT_g       = FAIL;      /* Can't move to next iterator location */
+hid_t H5E_BADSELECT_g      = FAIL;      /* Invalid selection */
+hid_t H5E_CANTCOMPARE_g    = FAIL;      /* Can't compare objects */
+
+/* Argument errors */
+hid_t H5E_UNINITIALIZED_g  = FAIL;      /* Information is uinitialized */
+hid_t H5E_UNSUPPORTED_g    = FAIL;      /* Feature is unsupported */
+hid_t H5E_BADTYPE_g        = FAIL;      /* Inappropriate type */
+hid_t H5E_BADRANGE_g       = FAIL;      /* Out of range */
+hid_t H5E_BADVALUE_g       = FAIL;      /* Bad value */
+
+/* B-tree related errors */
+hid_t H5E_NOTFOUND_g       = FAIL;      /* Object not found */
+hid_t H5E_EXISTS_g         = FAIL;      /* Object already exists */
+hid_t H5E_CANTENCODE_g     = FAIL;      /* Unable to encode value */
+hid_t H5E_CANTDECODE_g     = FAIL;      /* Unable to decode value */
+hid_t H5E_CANTSPLIT_g      = FAIL;      /* Unable to split node */
+hid_t H5E_CANTREDISTRIBUTE_g = FAIL;      /* Unable to redistribute records */
+hid_t H5E_CANTSWAP_g       = FAIL;      /* Unable to swap records */
+hid_t H5E_CANTINSERT_g     = FAIL;      /* Unable to insert object */
+hid_t H5E_CANTLIST_g       = FAIL;      /* Unable to list node */
+hid_t H5E_CANTMODIFY_g     = FAIL;      /* Unable to modify record */
+hid_t H5E_CANTREMOVE_g     = FAIL;      /* Unable to remove object */
+
+/* Datatype conversion errors */
+hid_t H5E_CANTCONVERT_g    = FAIL;      /* Can't convert datatypes */
+hid_t H5E_BADSIZE_g        = FAIL;      /* Bad size for object */
+
+#endif /* H5Edefin_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Edeprec.c b/gatb-core/thirdparty/hdf5/src/H5Edeprec.c
new file mode 100644
index 0000000..6a83745
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Edeprec.c
@@ -0,0 +1,495 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Edeprec.c
+ *		April 11 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5E interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5E__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Iprivate.h"		/* IDs                                  */
+#include "H5Epkg.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5E__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5E__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5E_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5E__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5E_init())
+} /* H5E__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5E__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5E__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5E__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5E__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_major
+ *
+ * Purpose:	Retrieves a major error message.
+ *
+ * Return:      Returns message if succeeds.
+ *              otherwise returns NULL.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5Eget_major(H5E_major_t maj)
+{
+    H5E_msg_t   *msg;           /* Pointer to error message */
+    ssize_t      size;
+    H5E_type_t  type;
+    char        *msg_str = NULL;
+    char        *ret_value;     /* Return value */
+
+    FUNC_ENTER_API_NOCLEAR(NULL)
+    H5TRACE1("*s", "i", maj);
+
+    /* Get the message object */
+    if(NULL == (msg = (H5E_msg_t *)H5I_object_verify(maj, H5I_ERROR_MSG)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a error message ID")
+
+    /* Get the size & type of the message's text */
+    if((size = H5E_get_msg(msg, &type, NULL, (size_t)0)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "can't get error message text")
+    if(type != H5E_MAJOR)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "Error message isn't a major one")
+
+    /* Application will free this */
+    size++;
+    msg_str = (char *)H5MM_malloc((size_t)size);
+
+    /* Get the text for the message */
+    if(H5E_get_msg(msg, NULL, msg_str, (size_t)size) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "can't get error message text")
+
+    ret_value = msg_str;
+
+done:
+    if(!ret_value)
+        msg_str = (char *)H5MM_xfree(msg_str);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_major() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_minor
+ *
+ * Purpose:	Retrieves a minor error message.
+ *
+ * Return:      Returns message if succeeds.
+ *              otherwise returns NULL.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5Eget_minor(H5E_minor_t min)
+{
+    H5E_msg_t   *msg;           /* Pointer to error message */
+    ssize_t      size;
+    H5E_type_t  type;
+    char        *msg_str = NULL;
+    char        *ret_value;     /* Return value */
+
+    FUNC_ENTER_API_NOCLEAR(NULL)
+    H5TRACE1("*s", "i", min);
+
+    /* Get the message object */
+    if(NULL == (msg = (H5E_msg_t *)H5I_object_verify(min, H5I_ERROR_MSG)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a error message ID")
+
+    /* Get the size & type of the message's text */
+    if((size = H5E_get_msg(msg, &type, NULL, (size_t)0)) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "can't get error message text")
+    if(type != H5E_MINOR)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "Error message isn't a minor one")
+
+    /* Application will free this */
+    size++;
+    msg_str = (char *)H5MM_malloc((size_t)size);
+
+    /* Get the text for the message */
+    if(H5E_get_msg(msg, NULL, msg_str, (size_t)size) < 0)
+	HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, NULL, "can't get error message text")
+
+    ret_value = msg_str;
+
+done:
+    if(!ret_value)
+        msg_str = (char *)H5MM_xfree(msg_str);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_minor() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Epush1
+ *
+ * Purpose:	This function definition is for backward compatibility only.
+ *              It doesn't have error stack and error class as parameters.
+ *              The old definition of major and minor is casted as HID_T
+ *              in H5Epublic.h
+ *
+ * Notes: 	Basically a public API wrapper around the H5E_push2
+ *              function.  For backward compatibility, it maintains the
+ *              same parameter as the old function, in contrary to
+ *              H5Epush2.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Sep 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Epush1(const char *file, const char *func, unsigned line,
+        H5E_major_t maj, H5E_minor_t min, const char *str)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE6("e", "*s*sIuii*s", file, func, line, maj, min, str);
+
+    /* Push the error on the default error stack */
+    if(H5E_push_stack(NULL, file, func, line, H5E_ERR_CLS_g, maj, min, str) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't push error on stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Epush1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eclear1
+ *
+ * Purpose:	This function is for backward compatbility.
+ *              Clears the error stack for the specified error stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Wednesday, July 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eclear1(void)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE0("e","");
+
+    /* Clear the default error stack */
+    if(H5E_clear_stack(NULL) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't clear error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eclear1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eprint1
+ *
+ * Purpose:	This function is for backward compatbility.
+ *              Prints the error stack in some default way.  This is just a
+ *		convenience function for H5Ewalk() with a function that
+ *		prints error messages.  Users are encouraged to write there
+ *		own more specific error handlers.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Sep 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eprint1(FILE *stream)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    /*NO TRACE*/
+
+    if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Print error stack */
+    if(H5E_print(estack, stream, TRUE) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't display error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eprint1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ewalk1
+ *
+ * Purpose:	This function is for backward compatbility.
+ *              Walks the error stack for the current thread and calls some
+ *		function for each error along the way.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Sep 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func, void *client_data)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    H5E_walk_op_t walk_op;      /* Error stack walking callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    /*NO TRACE*/
+
+    if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Walk the error stack */
+    walk_op.vers = 1;
+    walk_op.u.func1 = func;
+    if(H5E_walk(estack, direction, &walk_op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ewalk1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eget_auto1
+ *
+ * Purpose:	This function is for backward compatbility.
+ *              Returns the current settings for the automatic error stack
+ *		traversal function and its data for specific error stack.
+ *		Either (or both) arguments may be null in which case the
+ *		value is not returned.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Sep 16, 2003
+ *
+ * Modification:Raymond Lu
+ *              4 October 2010
+ *              If the printing function isn't the default H5Eprint1 or 2, 
+ *              and H5Eset_auto2 has been called to set the new style 
+ *              printing function, a call to H5Eget_auto1 should fail.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eget_auto1(H5E_auto1_t *func, void **client_data)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    H5E_auto_op_t auto_op;      /* Error stack operator */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "*x**x", func, client_data);
+
+    /* Retrieve default error stack */
+    if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Get the automatic error reporting information */
+    if(H5E_get_auto(estack, &auto_op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info")
+
+    /* Fail if the printing function isn't the default(user-set) and set through H5Eset_auto2 */
+    if(!auto_op.is_default && auto_op.vers == 2)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "wrong API function, H5Eset_auto2 has been called")
+
+    if(func)
+        *func = auto_op.func1;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eget_auto1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Eset_auto1
+ *
+ * Purpose:	This function is for backward compatbility.
+ *              Turns on or off automatic printing of errors for certain
+ *              error stack.  When turned on (non-null FUNC pointer) any
+ *              API function which returns an error indication will first
+ *              call FUNC passing it CLIENT_DATA as an argument.
+ *
+ *		The default values before this function is called are
+ *		H5Eprint1() with client data being the standard error stream,
+ *		stderr.
+ *
+ *		Automatic stack traversal is always in the H5E_WALK_DOWNWARD
+ *		direction.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Sep 16, 2003
+ *
+ * Modification:Raymond Lu
+ *              4 October 2010
+ *              If the FUNC is H5Eprint2, put the IS_DEFAULT flag on.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Eset_auto1(H5E_auto1_t func, void *client_data)
+{
+    H5E_t   *estack;            /* Error stack to operate on */
+    H5E_auto_op_t auto_op;      /* Error stack operator */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Don't clear the error stack! :-) */
+    FUNC_ENTER_API_NOCLEAR(FAIL)
+    H5TRACE2("e", "x*x", func, client_data);
+
+    if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Get the automatic error reporting information */
+    if(H5E_get_auto(estack, &auto_op, NULL) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info")
+
+    /* Set the automatic error reporting information */
+    auto_op.vers = 1;
+    if(func != auto_op.func1_default)
+        auto_op.is_default = FALSE;
+    else
+        auto_op.is_default = TRUE;
+    auto_op.func1 = func;
+
+    if(H5E_set_auto(estack, &auto_op, client_data) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't set automatic error info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Eset_auto1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Einit.h b/gatb-core/thirdparty/hdf5/src/H5Einit.h
new file mode 100644
index 0000000..9dadd41
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Einit.h
@@ -0,0 +1,810 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_err -- do not edit */
+/* Add new errors to H5err.txt file */
+
+
+#ifndef _H5Einit_H
+#define _H5Einit_H
+
+/*********************/
+/* Major error codes */
+/*********************/
+
+assert(H5E_DATASET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataset"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FUNC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_STORAGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data storage"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "File accessibilty"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SOHM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Shared Object Header Messages"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SYM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Symbol table"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_PLUGIN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Plugin for dynamically loaded library"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PLUGIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_VFL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Virtual File Layer"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_VFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_INTERNAL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Internal error (too specific to document in detail)"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BTREE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "B-Tree node"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_REFERENCE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "References"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_DATASPACE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataspace"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_RESOURCE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Resource unavailable"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_RESOURCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_PLIST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Property lists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_LINK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Links"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_DATATYPE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Datatype"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_RS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Reference Counted Strings"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_RS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_HEAP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Heap"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_HEAP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_OHDR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object header"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OHDR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ATOM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object atom"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ATTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Attribute"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NONE_MAJOR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "No error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_IO_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Low-level I/O"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_IO_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SLIST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Skip Lists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_EFL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "External file list"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_TST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Ternary Search Trees"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ARGS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Invalid arguments to routine"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ARGS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_PLINE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data filters"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PLINE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FSPACE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Free Space Manager"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CACHE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/*********************/
+/* Minor error codes */
+/*********************/
+
+
+/* Generic low-level file I/O errors */
+assert(H5E_SEEKERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Seek failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SEEKERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_READERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Read failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_READERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_WRITEERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Write failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_WRITEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CLOSEERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Close failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CLOSEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_OVERFLOW_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Address overflowed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OVERFLOW_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FCNTL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File control (fcntl) failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FCNTL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Resource errors */
+assert(H5E_NOSPACE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "No space available for allocation"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTALLOC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't allocate space"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTALLOC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOPY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to copy object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOPY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTFREE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to free object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ALREADYEXISTS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ALREADYEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTLOCK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to lock object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUNLOCK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to unlock object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUNLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTGC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to garbage collect"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTGETSIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to compute size"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGETSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_OBJOPEN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object is already open"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OBJOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Heap errors */
+assert(H5E_CANTRESTORE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't restore condition"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOMPUTE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compute value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTEXTEND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't extend heap's space"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTATTACH_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't attach object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUPDATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't update object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTOPERATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't operate on object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Function entry/exit interface errors */
+assert(H5E_CANTINIT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to initialize object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ALREADYINIT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object already initialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRELEASE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to release object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Property list errors */
+assert(H5E_CANTGET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't get value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't set value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_DUPCLASS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Duplicate class name in parent class"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SETDISALLOWED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Disallowed operation"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Free space errors */
+assert(H5E_CANTMERGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't merge objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTREVIVE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't revive object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSHRINK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't shrink container"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Object header related errors */
+assert(H5E_LINKCOUNT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad object header link count"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_LINKCOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_VERSION_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Wrong version number"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_VERSION_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ALIGNMENT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Alignment error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ALIGNMENT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADMESG_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unrecognized message"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADMESG_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTDELETE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't delete message"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTDELETE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADITER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Iteration failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADITER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTPACK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't pack messages"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTPACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRESET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't reset object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRESET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRENAME_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to rename object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRENAME_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* System level errors */
+assert(H5E_SYSERRSTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "System error message"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* I/O pipeline errors */
+assert(H5E_NOFILTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Requested filter is not available"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CALLBACK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Callback failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANAPPLY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'can apply' callback"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SETLOCAL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'set local' callback"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOENCODER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter present but encoding disabled"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTFILTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter operation failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Group related errors */
+assert(H5E_CANTOPENOBJ_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't open object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPENOBJ_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCLOSEOBJ_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't close object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLOSEOBJ_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_COMPLEN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Name component is too long"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_COMPLEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_PATH_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Problem with path to object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PATH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* No error */
+assert(H5E_NONE_MINOR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "No error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Plugin errors */
+assert(H5E_OPENERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't open directory or file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OPENERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* File accessibilty errors */
+assert(H5E_FILEEXISTS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FILEOPEN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File already open"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCREATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to create file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTOPENFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to open file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCLOSEFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to close file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOTHDF5_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Not an HDF5 file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad file ID accessed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_TRUNCATED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File has been truncated"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_MOUNT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File mount error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Object atom related errors */
+assert(H5E_BADATOM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find atom information (already closed?)"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADGROUP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find ID group information"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTREGISTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to register new atom"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTINC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to increment reference count"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTDEC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to decrement reference count"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOIDS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of IDs for group"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Cache related errors */
+assert(H5E_CANTFLUSH_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to flush data from cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFLUSH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSERIALIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to serialize data from cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSERIALIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTLOAD_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to load metadata into cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTLOAD_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_PROTECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Protected metadata error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PROTECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOTCACHED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Metadata not currently cached"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTCACHED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SYSTEM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Internal error detected"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SYSTEM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTINS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to insert metadata into cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTPROTECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to protect metadata"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTPROTECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUNPROTECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to unprotect metadata"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUNPROTECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTPIN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to pin cache entry"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTPIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUNPIN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to un-pin cache entry"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUNPIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMARKDIRTY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark a pinned entry as dirty"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMARKDIRTY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTDIRTY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark metadata as dirty"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTDIRTY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTEXPUNGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to expunge a metadata cache entry"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTEXPUNGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRESIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to resize a metadata cache entry"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRESIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Link related errors */
+assert(H5E_TRAVERSE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Link traversal failure"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TRAVERSE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NLINKS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Too many soft links in path"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NLINKS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOTREGISTERED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Link class not registered"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMOVE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSORT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't sort objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Parallel MPI errors */
+assert(H5E_MPI_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Some MPI function failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_MPIERRSTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "MPI Error String"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRECV_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't receive data"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Dataspace errors */
+assert(H5E_CANTCLIP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't clip hyperslab region"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLIP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOUNT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't count elements"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSELECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't select hyperslab"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTNEXT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move to next iterator location"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTNEXT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADSELECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Invalid selection"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOMPARE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compare objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOMPARE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Argument errors */
+assert(H5E_UNINITIALIZED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Information is uinitialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_UNINITIALIZED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_UNSUPPORTED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Feature is unsupported"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_UNSUPPORTED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADTYPE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Inappropriate type"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADTYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADRANGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of range"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADRANGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADVALUE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADVALUE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* B-tree related errors */
+assert(H5E_NOTFOUND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object not found"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTFOUND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_EXISTS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_EXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTENCODE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to encode value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTENCODE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTDECODE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to decode value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTDECODE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSPLIT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to split node"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSPLIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTREDISTRIBUTE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to redistribute records"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREDISTRIBUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSWAP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to swap records"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSWAP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTINSERT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to insert object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINSERT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTLIST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to list node"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMODIFY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to modify record"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMODIFY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTREMOVE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to remove object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Datatype conversion errors */
+assert(H5E_CANTCONVERT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't convert datatypes"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCONVERT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADSIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad size for object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+#endif /* H5Einit_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Eint.c b/gatb-core/thirdparty/hdf5/src/H5Eint.c
new file mode 100644
index 0000000..252972f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Eint.c
@@ -0,0 +1,1034 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Eint.c
+ *		April 11 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	General use, "internal" routines for error handling.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5E_init_int_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Epkg.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs                                  */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Printing information */
+typedef struct H5E_print_t {
+    FILE        *stream;
+    H5E_cls_t   cls;
+} H5E_print_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+static herr_t H5E_walk1_cb(int n, H5E_error1_t *err_desc,
+    void *client_data);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+static herr_t H5E_walk2_cb(unsigned n, const H5E_error2_t *err_desc,
+    void *client_data);
+static herr_t  H5E_clear_entries(H5E_t *estack, size_t nentries);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+#ifndef H5_HAVE_THREADSAFE
+/*
+ * The current error stack.
+ */
+H5E_t H5E_stack_g[1];
+#endif /* H5_HAVE_THREADSAFE */
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* HDF5 error class ID */
+hid_t H5E_ERR_CLS_g = FAIL;
+
+/*
+ * Predefined errors. These are initialized at runtime in H5E_init_interface()
+ * in this source file.
+ */
+/* Include the automatically generated error code definitions */
+#include "H5Edefin.h"
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+#ifdef H5_HAVE_PARALLEL
+/*
+ * variables used for MPI error reporting
+ */
+char	H5E_mpi_error_str[MPI_MAX_ERROR_STRING];
+int	H5E_mpi_error_str_len;
+#endif /* H5_HAVE_PARALLEL */
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5E_init_int_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5E_init_int_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5E_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5E_init_int_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5E_init())
+} /* H5E_init_int_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_msg
+ *
+ * Purpose:	Private function to retrieve an error message.
+ *
+ * Return:      Non-negative for name length if succeeds(zero means no name);
+ *              otherwise returns negative value.
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 14, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5E_get_msg(const H5E_msg_t *msg, H5E_type_t *type, char *msg_str, size_t size)
+{
+    ssize_t       len;          /* Length of error message */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(msg);
+
+    /* Get the length of the message string */
+    len = (ssize_t)HDstrlen(msg->msg);
+
+    /* Copy the message into the user's buffer, if given */
+    if(msg_str) {
+       HDstrncpy(msg_str, msg->msg, MIN((size_t)(len+1), size));
+       if((size_t)len >= size)
+          msg_str[size - 1] = '\0';
+    } /* end if */
+
+    /* Give the message type, if asked */
+    if(type)
+        *type = msg->type;
+
+    /* Set the return value to the full length of the message */
+    FUNC_LEAVE_NOAPI(len)
+} /* end H5E_get_msg() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_walk1_cb
+ *
+ * Purpose:	This function is for backward compatibility.
+ *              This is a default error stack traversal callback function
+ *		that prints error messages to the specified output stream.
+ *		This function is for backward compatibility with v1.6.
+ *		It is not meant to be called directly but rather as an
+ *		argument to the H5Ewalk() function.  This function is called
+ *		also by H5Eprint().  Application writers are encouraged to
+ *		use this function as a model for their own error stack
+ *		walking functions.
+ *
+ *		N is a counter for how many times this function has been
+ *		called for this particular traversal of the stack.  It always
+ *		begins at zero for the first error on the stack (either the
+ *		top or bottom error, or even both, depending on the traversal
+ *		direction and the size of the stack).
+ *
+ *		ERR_DESC is an error description.  It contains all the
+ *		information about a particular error.
+ *
+ *		CLIENT_DATA is the same pointer that was passed as the
+ *		CLIENT_DATA argument of H5Ewalk().  It is expected to be a
+ *		file pointer (or stderr if null).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *		Thursday, May 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_walk1_cb(int n, H5E_error1_t *err_desc, void *client_data)
+{
+    H5E_print_t         *eprint  = (H5E_print_t *)client_data;
+    FILE		*stream;        /* I/O stream to print output to */
+    H5E_cls_t           *cls_ptr;       /* Pointer to error class */
+    H5E_msg_t           *maj_ptr;       /* Pointer to major error info */
+    H5E_msg_t           *min_ptr;       /* Pointer to minor error info */
+    const char		*maj_str = "No major description";      /* Major error description */
+    const char		*min_str = "No minor description";      /* Minor error description */
+    unsigned            have_desc = 1;  /* Flag to indicate whether the error has a "real" description */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(err_desc);
+
+    /* If no client data was passed, output to stderr */
+    if(!client_data)
+        stream = stderr;
+    else
+        stream = eprint->stream;
+
+    /* Get descriptions for the major and minor error numbers */
+    maj_ptr = (H5E_msg_t *)H5I_object_verify(err_desc->maj_num, H5I_ERROR_MSG);
+    min_ptr = (H5E_msg_t *)H5I_object_verify(err_desc->min_num, H5I_ERROR_MSG);
+
+    /* Check for bad pointer(s), but can't issue error, just leave */
+    if(!maj_ptr || !min_ptr)
+        HGOTO_DONE(FAIL)
+
+    if(maj_ptr->msg)
+        maj_str = maj_ptr->msg;
+    if(min_ptr->msg)
+        min_str = min_ptr->msg;
+
+    /* Get error class info */
+    cls_ptr = maj_ptr->cls;
+
+    /* Print error class header if new class */
+    if(eprint->cls.lib_name == NULL || HDstrcmp(cls_ptr->lib_name, eprint->cls.lib_name)) {
+        /* update to the new class information */
+        if(cls_ptr->cls_name)
+            eprint->cls.cls_name = cls_ptr->cls_name;
+        if(cls_ptr->lib_name)
+            eprint->cls.lib_name = cls_ptr->lib_name;
+        if(cls_ptr->lib_vers)
+            eprint->cls.lib_vers = cls_ptr->lib_vers;
+
+        fprintf(stream, "%s-DIAG: Error detected in %s (%s) ",
+            (cls_ptr->cls_name ? cls_ptr->cls_name : "(null)"),
+            (cls_ptr->lib_name ? cls_ptr->lib_name : "(null)"),
+            (cls_ptr->lib_vers ? cls_ptr->lib_vers : "(null)"));
+
+        /* try show the process or thread id in multiple processes cases*/
+#ifdef H5_HAVE_PARALLEL
+        {
+            int mpi_rank, mpi_initialized, mpi_finalized;
+
+	    MPI_Initialized(&mpi_initialized);
+            MPI_Finalized(&mpi_finalized);
+
+            if(mpi_initialized && !mpi_finalized) {
+	        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+	        fprintf(stream, "MPI-process %d", mpi_rank);
+	    } /* end if */
+            else
+	        fprintf(stream, "thread 0");
+        } /* end block */
+#elif defined(H5_HAVE_THREADSAFE)
+        fprintf(stream, "thread %lu", (unsigned long)HDpthread_self_ulong());
+#else
+        fprintf(stream, "thread 0");
+#endif
+        fprintf(stream, ":\n");
+    } /* end if */
+
+    /* Check for "real" error description - used to format output more nicely */
+    if(err_desc->desc == NULL || HDstrlen(err_desc->desc) == 0)
+        have_desc=0;
+
+    /* Print error message */
+    fprintf(stream, "%*s#%03d: %s line %u in %s()%s%s\n",
+	     H5E_INDENT, "", n, err_desc->file_name, err_desc->line,
+	     err_desc->func_name, (have_desc ? ": " : ""),
+             (have_desc ? err_desc->desc : ""));
+    fprintf(stream, "%*smajor: %s\n", (H5E_INDENT * 2), "", maj_str);
+    fprintf(stream, "%*sminor: %s\n", (H5E_INDENT * 2), "", min_str);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_walk1_cb() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_walk2_cb
+ *
+ * Purpose:	This is a default error stack traversal callback function
+ *		that prints error messages to the specified output stream.
+ *		It is not meant to be called directly but rather as an
+ *		argument to the H5Ewalk2() function.  This function is
+ *		called also by H5Eprint2().  Application writers are
+ *		encouraged to use this function as a model for their own
+ *		error stack walking functions.
+ *
+ *		N is a counter for how many times this function has been
+ *		called for this particular traversal of the stack.  It always
+ *		begins at zero for the first error on the stack (either the
+ *		top or bottom error, or even both, depending on the traversal
+ *		direction and the size of the stack).
+ *
+ *		ERR_DESC is an error description.  It contains all the
+ *		information about a particular error.
+ *
+ *		CLIENT_DATA is the same pointer that was passed as the
+ *		CLIENT_DATA argument of H5Ewalk().  It is expected to be a
+ *		file pointer (or stderr if null).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, December 12, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_walk2_cb(unsigned n, const H5E_error2_t *err_desc, void *client_data)
+{
+    H5E_print_t         *eprint  = (H5E_print_t *)client_data;
+    FILE		*stream;        /* I/O stream to print output to */
+    H5E_cls_t           *cls_ptr;       /* Pointer to error class */
+    H5E_msg_t           *maj_ptr;       /* Pointer to major error info */
+    H5E_msg_t           *min_ptr;       /* Pointer to minor error info */
+    const char		*maj_str = "No major description";      /* Major error description */
+    const char		*min_str = "No minor description";      /* Minor error description */
+    unsigned            have_desc = 1;  /* Flag to indicate whether the error has a "real" description */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(err_desc);
+
+    /* If no client data was passed, output to stderr */
+    if(!client_data)
+        stream = stderr;
+    else
+        stream = eprint->stream;
+
+    /* Get descriptions for the major and minor error numbers */
+    maj_ptr = (H5E_msg_t *)H5I_object_verify(err_desc->maj_num, H5I_ERROR_MSG);
+    min_ptr = (H5E_msg_t *)H5I_object_verify(err_desc->min_num, H5I_ERROR_MSG);
+
+    /* Check for bad pointer(s), but can't issue error, just leave */
+    if(!maj_ptr || !min_ptr)
+        HGOTO_DONE(FAIL)
+
+    if(maj_ptr->msg)
+        maj_str = maj_ptr->msg;
+    if(min_ptr->msg)
+        min_str = min_ptr->msg;
+
+    /* Get error class info.  Don't use the class of the major or minor error because
+     * they might be different. */
+    cls_ptr = (H5E_cls_t *)H5I_object_verify(err_desc->cls_id, H5I_ERROR_CLASS);
+
+    /* Check for bad pointer(s), but can't issue error, just leave */
+    if(!cls_ptr)
+        HGOTO_DONE(FAIL)
+
+    /* Print error class header if new class */
+    if(eprint->cls.lib_name == NULL || HDstrcmp(cls_ptr->lib_name, eprint->cls.lib_name)) {
+        /* update to the new class information */
+        if(cls_ptr->cls_name)
+            eprint->cls.cls_name = cls_ptr->cls_name;
+        if(cls_ptr->lib_name)
+            eprint->cls.lib_name = cls_ptr->lib_name;
+        if(cls_ptr->lib_vers)
+            eprint->cls.lib_vers = cls_ptr->lib_vers;
+
+        fprintf(stream, "%s-DIAG: Error detected in %s (%s) ",
+            (cls_ptr->cls_name ? cls_ptr->cls_name : "(null)"),
+            (cls_ptr->lib_name ? cls_ptr->lib_name : "(null)"),
+            (cls_ptr->lib_vers ? cls_ptr->lib_vers : "(null)"));
+
+        /* try show the process or thread id in multiple processes cases*/
+#ifdef H5_HAVE_PARALLEL
+        {
+            int mpi_rank, mpi_initialized, mpi_finalized;
+
+	    MPI_Initialized(&mpi_initialized);
+            MPI_Finalized(&mpi_finalized);
+
+            if(mpi_initialized && !mpi_finalized) {
+	        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+	        fprintf(stream, "MPI-process %d", mpi_rank);
+	    } /* end if */
+            else
+	        fprintf(stream, "thread 0");
+        } /* end block */
+#elif defined(H5_HAVE_THREADSAFE)
+        fprintf(stream, "thread %lu", (unsigned long)HDpthread_self_ulong());
+#else
+        fprintf(stream, "thread 0");
+#endif
+        fprintf(stream, ":\n");
+    } /* end if */
+
+    /* Check for "real" error description - used to format output more nicely */
+    if(err_desc->desc == NULL || HDstrlen(err_desc->desc) == 0)
+        have_desc = 0;
+
+    /* Print error message */
+    fprintf(stream, "%*s#%03u: %s line %u in %s()%s%s\n",
+	     H5E_INDENT, "", n, err_desc->file_name, err_desc->line,
+	     err_desc->func_name, (have_desc ? ": " : ""),
+             (have_desc ? err_desc->desc : ""));
+    fprintf(stream, "%*smajor: %s\n", (H5E_INDENT * 2), "", maj_str);
+    fprintf(stream, "%*sminor: %s\n", (H5E_INDENT * 2), "", min_str);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_walk2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_print
+ *
+ * Purpose:	Private function to print the error stack in some default
+ *              way.  This is just a convenience function for H5Ewalk() and
+ *              H5Ewalk2() with a function that prints error messages.
+ *              Users are encouraged to write there own more specific error
+ *              handlers.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_print(const H5E_t *estack, FILE *stream, hbool_t bk_compatible)
+{
+    H5E_print_t eprint;         /* Callback information to pass to H5E_walk() */
+    H5E_walk_op_t walk_op;      /* Error stack walking callback */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(estack);
+
+    /* If no stream was given, use stderr */
+    if(!stream)
+        eprint.stream = stderr;
+    else
+        eprint.stream = stream;
+
+    /* Reset the original error class information */
+    HDmemset(&eprint.cls, 0, sizeof(H5E_cls_t));
+
+    /* Walk the error stack */
+    if(bk_compatible) {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        walk_op.vers = 1;
+        walk_op.u.func1 = H5E_walk1_cb;
+        if(H5E_walk(estack, H5E_WALK_DOWNWARD, &walk_op, (void*)&eprint) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+        HDassert(0 && "version 1 error stack print without deprecated symbols!");
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    } /* end if */
+    else {
+        walk_op.vers = 2;
+        walk_op.u.func2 = H5E_walk2_cb;
+        if(H5E_walk(estack, H5E_WALK_DOWNWARD, &walk_op, (void*)&eprint) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_print() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_walk
+ *
+ * Purpose:	Private function for H5Ewalk.
+ *              Walks the error stack, calling the specified function for
+ *		each error on the stack.  The DIRECTION argument determines
+ *		whether the stack is walked from the inside out or the
+ *		outside in.  The value H5E_WALK_UPWARD means begin with the
+ *		most specific error and end at the API; H5E_WALK_DOWNWARD
+ *		means to start at the API and end at the inner-most function
+ *		where the error was first detected.
+ *
+ *		The function pointed to by STACK_FUNC will be called for
+ *		each error record in the error stack. It's arguments will
+ *		include an index number (beginning at zero regardless of
+ *		stack traversal	direction), an error stack entry, and the
+ *		CLIENT_DATA pointer passed to H5E_print.
+ *
+ *		The function FUNC is also provided for backward compatibility.
+ *		When BK_COMPATIBLE is set to be TRUE, FUNC is used to be
+ *		compatible with older library.  If BK_COMPATIBLE is FALSE,
+ *		STACK_FUNC is used.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, December 12, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_walk(const H5E_t *estack, H5E_direction_t direction, const H5E_walk_op_t *op,
+    void *client_data)
+{
+    int		i;              /* Local index variable */
+    herr_t	status;         /* Status from callback function */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(estack);
+    HDassert(op);
+
+    /* check args, but rather than failing use some default value */
+    if(direction != H5E_WALK_UPWARD && direction != H5E_WALK_DOWNWARD)
+	direction = H5E_WALK_UPWARD;
+
+    /* Walk the stack if a callback function was given */
+    if(op->vers == 1) {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        if(op->u.func1) {
+            H5E_error1_t old_err;
+
+            status = SUCCEED;
+            if(H5E_WALK_UPWARD == direction) {
+                for(i = 0; i < (int)estack->nused && status >= 0; i++) {
+                    /* Point to each error record on the stack and pass it to callback function.*/
+                    old_err.maj_num = estack->slot[i].maj_num;
+                    old_err.min_num = estack->slot[i].min_num;
+                    old_err.func_name = estack->slot[i].func_name;
+                    old_err.file_name = estack->slot[i].file_name;
+                    old_err.desc = estack->slot[i].desc;
+                    old_err.line = estack->slot[i].line;
+
+                    status = (op->u.func1)(i, &old_err, client_data);
+                } /* end for */
+            } /* end if */
+            else {
+                H5_CHECK_OVERFLOW(estack->nused - 1, size_t, int);
+                for(i = (int)(estack->nused - 1); i >= 0 && status >= 0; i--) {
+                    /* Point to each error record on the stack and pass it to callback function.*/
+                    old_err.maj_num = estack->slot[i].maj_num;
+                    old_err.min_num = estack->slot[i].min_num;
+                    old_err.func_name = estack->slot[i].func_name;
+                    old_err.file_name = estack->slot[i].file_name;
+                    old_err.desc = estack->slot[i].desc;
+                    old_err.line = estack->slot[i].line;
+
+                    status = (op->u.func1)((int)(estack->nused - (size_t)(i + 1)), &old_err, client_data);
+                } /* end for */
+            } /* end else */
+
+            if(status < 0)
+                HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+        } /* end if */
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+        HDassert(0 && "version 1 error stack walk without deprecated symbols!");
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    } /* end if */
+    else {
+        HDassert(op->vers == 2);
+        if(op->u.func2) {
+            status = SUCCEED;
+            if(H5E_WALK_UPWARD == direction) {
+                for(i = 0; i < (int)estack->nused && status >= 0; i++)
+                    status = (op->u.func2)((unsigned)i, estack->slot + i, client_data);
+            } /* end if */
+            else {
+                H5_CHECK_OVERFLOW(estack->nused - 1, size_t, int);
+                for(i = (int)(estack->nused - 1); i >= 0 && status >= 0; i--)
+                    status = (op->u.func2)((unsigned)(estack->nused - (size_t)(i + 1)), estack->slot + i, client_data);
+            } /* end else */
+
+            if(status < 0)
+                HGOTO_ERROR(H5E_ERROR, H5E_CANTLIST, FAIL, "can't walk error stack")
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_walk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_get_auto
+ *
+ * Purpose:	Private function to return the current settings for the
+ *              automatic error stack traversal function and its data
+ *              for specific error stack. Either (or both) arguments may
+ *              be null in which case the value is not returned.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              July 18, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_get_auto(const H5E_t *estack, H5E_auto_op_t *op, void **client_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(estack);
+
+    /* Retrieve the requested information */
+    if(op)
+        *op = estack->auto_op;
+    if(client_data)
+        *client_data = estack->auto_data;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_get_auto2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_set_auto
+ *
+ * Purpose:	Private function to turn on or off automatic printing of
+ *              errors for certain error stack.  When turned on (non-null
+ *              FUNC pointer) any API function which returns an error
+ *              indication will first call FUNC passing it CLIENT_DATA
+ *              as an argument.
+ *
+ *		The default values before this function is called are
+ *		H5Eprint2() with client data being the standard error stream,
+ *		stderr.
+ *
+ *		Automatic stack traversal is always in the H5E_WALK_DOWNWARD
+ *		direction.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_set_auto(H5E_t *estack, const H5E_auto_op_t *op, void *client_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(estack);
+
+    /* Set the automatic error reporting info */
+    estack->auto_op = *op;
+    estack->auto_data = client_data;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_set_auto() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_printf_stack
+ *
+ * Purpose:	Printf-like wrapper around H5E_push_stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, August 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_printf_stack(H5E_t *estack, const char *file, const char *func, unsigned line,
+    hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...)
+{
+    va_list     ap;                     /* Varargs info */
+#ifndef H5_HAVE_VASPRINTF
+    int         tmp_len;        /* Current size of description buffer */
+    int         desc_len;       /* Actual length of description when formatted */
+#endif /* H5_HAVE_VASPRINTF */
+    char        *tmp = NULL;      /* Buffer to place formatted description in */
+    hbool_t     va_started = FALSE; /* Whether the variable argument list is open */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    /*
+     * WARNING: We cannot call HERROR() from within this function or else we
+     *		could enter infinite recursion.  Furthermore, we also cannot
+     *		call any other HDF5 macro or function which might call
+     *		HERROR().  HERROR() is called by HRETURN_ERROR() which could
+     *		be called by FUNC_ENTER().
+     */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(cls_id > 0);
+    HDassert(maj_id > 0);
+    HDassert(min_id > 0);
+    HDassert(fmt);
+
+/* Note that the variable-argument parsing for the format is identical in
+ *      the H5Epush2() routine - correct errors and make changes in both
+ *      places. -QAK
+ */
+
+    /* Start the variable-argument parsing */
+    va_start(ap, fmt);
+    va_started = TRUE;
+
+#ifdef H5_HAVE_VASPRINTF
+    /* Use the vasprintf() routine, since it does what we're trying to do below */
+    if(HDvasprintf(&tmp, fmt, ap) < 0)
+        HGOTO_DONE(FAIL)
+#else /* H5_HAVE_VASPRINTF */
+    /* Allocate space for the formatted description buffer */
+    tmp_len = 128;
+    if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
+        HGOTO_DONE(FAIL)
+
+    /* If the description doesn't fit into the initial buffer size, allocate more space and try again */
+    while((desc_len = HDvsnprintf(tmp, (size_t)tmp_len, fmt, ap)) > (tmp_len - 1)) {
+        /* shutdown & restart the va_list */
+        va_end(ap);
+        va_start(ap, fmt);
+
+        /* Release the previous description, it's too small */
+        H5MM_xfree(tmp);
+
+        /* Allocate a description of the appropriate length */
+        tmp_len = desc_len + 1;
+        if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
+            HGOTO_DONE(FAIL)
+    } /* end while */
+#endif /* H5_HAVE_VASPRINTF */
+
+    /* Push the error on the stack */
+    if(H5E_push_stack(estack, file, func, line, cls_id, maj_id, min_id, tmp) < 0)
+        HGOTO_DONE(FAIL)
+
+done:
+    if(va_started)
+        va_end(ap);
+    if(tmp)
+        H5MM_xfree(tmp);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_printf_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_push_stack
+ *
+ * Purpose:	Pushes a new error record onto error stack for the current
+ *		thread.  The error has major and minor IDs MAJ_ID and
+ *		MIN_ID, the name of a function where the error was detected,
+ *		the name of the file where the error was detected, the
+ *		line within that file, and an error description string.  The
+ *		function name, file name, and error description strings must
+ *		be statically allocated (the FUNC_ENTER() macro takes care of
+ *		the function name and file name automatically, but the
+ *		programmer is responsible for the description string).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, December 12, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_push_stack(H5E_t *estack, const char *file, const char *func, unsigned line,
+    hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc)
+{
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    /*
+     * WARNING: We cannot call HERROR() from within this function or else we
+     *		could enter infinite recursion.  Furthermore, we also cannot
+     *		call any other HDF5 macro or function which might call
+     *		HERROR().  HERROR() is called by HRETURN_ERROR() which could
+     *		be called by FUNC_ENTER().
+     */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(cls_id > 0);
+    HDassert(maj_id > 0);
+    HDassert(min_id > 0);
+
+    /* Check for 'default' error stack */
+    if(estack == NULL)
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_DONE(FAIL)
+
+    /*
+     * Don't fail if arguments are bad.  Instead, substitute some default
+     * value.
+     */
+    if(!func)
+        func = "Unknown_Function";
+    if(!file)
+        file = "Unknown_File";
+    if(!desc)
+        desc = "No description given";
+
+    /*
+     * Push the error if there's room.  Otherwise just forget it.
+     */
+    HDassert(estack);
+
+    if(estack->nused < H5E_NSLOTS) {
+        /* Increment the IDs to indicate that they are used in this stack */
+        if(H5I_inc_ref(cls_id, FALSE) < 0)
+            HGOTO_DONE(FAIL)
+	estack->slot[estack->nused].cls_id = cls_id;
+        if(H5I_inc_ref(maj_id, FALSE) < 0)
+            HGOTO_DONE(FAIL)
+	estack->slot[estack->nused].maj_num = maj_id;
+        if(H5I_inc_ref(min_id, FALSE) < 0)
+            HGOTO_DONE(FAIL)
+	estack->slot[estack->nused].min_num = min_id;
+	if(NULL == (estack->slot[estack->nused].func_name = H5MM_xstrdup(func)))
+            HGOTO_DONE(FAIL)
+	if(NULL == (estack->slot[estack->nused].file_name = H5MM_xstrdup(file)))
+            HGOTO_DONE(FAIL)
+	estack->slot[estack->nused].line = line;
+	if(NULL == (estack->slot[estack->nused].desc = H5MM_xstrdup(desc)))
+            HGOTO_DONE(FAIL)
+	estack->nused++;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_push_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_clear_entries
+ *
+ * Purpose:	Private function to clear the error stack entries for the
+ *              specified error stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, August 6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5E_clear_entries(H5E_t *estack, size_t nentries)
+{
+    H5E_error2_t *error;        /* Pointer to error stack entry to clear */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(estack);
+    HDassert(estack->nused >= nentries);
+
+    /* Empty the error stack from the top down */
+    for(u = 0; nentries > 0; nentries--, u++) {
+        error = &(estack->slot[estack->nused - (u + 1)]);
+
+        /* Decrement the IDs to indicate that they are no longer used by this stack */
+        /* (In reverse order that they were incremented, so that reference counts work well) */
+        if(H5I_dec_ref(error->min_num) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error message")
+        if(H5I_dec_ref(error->maj_num) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error message")
+        if(H5I_dec_ref(error->cls_id) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTDEC, FAIL, "unable to decrement ref count on error class")
+
+        /* Release strings */
+        if(error->func_name)
+            H5MM_xfree((void *)error->func_name);        /* Casting away const OK - QAK */
+        if(error->file_name)
+            H5MM_xfree((void *)error->file_name);        /* Casting away const OK - QAK */
+        if(error->desc)
+            H5MM_xfree((void *)error->desc);     /* Casting away const OK - QAK */
+    } /* end for */
+
+    /* Decrement number of errors on stack */
+    estack->nused -= u;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_clear_entries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_clear_stack
+ *
+ * Purpose:	Private function to clear the error stack for the
+ *              specified error stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Wednesday, July 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_clear_stack(H5E_t *estack)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check for 'default' error stack */
+    if(estack == NULL)
+    	if(NULL == (estack = H5E_get_my_stack())) /*lint !e506 !e774 Make lint 'constant value Boolean' in non-threaded case */
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack")
+
+    /* Empty the error stack */
+    HDassert(estack);
+    if(estack->nused)
+        if(H5E_clear_entries(estack, estack->nused) < 0)
+            HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't clear error stack")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_clear_stack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_pop
+ *
+ * Purpose:	Private function to delete some error messages from the top
+ *              of error stack.
+ *
+ * Return:	Non-negative value on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Friday, July 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_pop(H5E_t *estack, size_t count)
+{
+    herr_t      ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(estack);
+    HDassert(estack->nused >= count);
+
+    /* Remove the entries from the error stack */
+    if(H5E_clear_entries(estack, count) < 0)
+        HGOTO_ERROR(H5E_ERROR, H5E_CANTRELEASE, FAIL, "can't remove errors from stack")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_pop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5E_dump_api_stack
+ *
+ * Purpose:	Private function to dump the error stack during an error in
+ *              an API function if a callback function is defined for the
+ *              current error stack.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, August 6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5E_dump_api_stack(int is_api)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Only dump the error stack during an API call */
+    if(is_api) {
+        H5E_t *estack = H5E_get_my_stack();
+
+        HDassert(estack);
+
+#ifdef H5_NO_DEPRECATED_SYMBOLS
+            if(estack->auto_op.func2)
+                (void)((estack->auto_op.func2)(H5E_DEFAULT, estack->auto_data));
+#else /* H5_NO_DEPRECATED_SYMBOLS */ 
+        if(estack->auto_op.vers == 1) {
+            if(estack->auto_op.func1)
+                (void)((estack->auto_op.func1)(estack->auto_data));
+        } /* end if */
+        else {
+            if(estack->auto_op.func2)
+                (void)((estack->auto_op.func2)(H5E_DEFAULT, estack->auto_data));
+        } /* end else */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5E_dump_api_stack() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Epkg.h b/gatb-core/thirdparty/hdf5/src/H5Epkg.h
new file mode 100644
index 0000000..bfaaf9d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Epkg.h
@@ -0,0 +1,151 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Wednesday, April 11, 2007
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5E package.  Source files outside the H5E package should
+ *		include H5Eprivate.h instead.
+ */
+#ifndef H5E_PACKAGE
+#error "Do not include this file outside the H5E package!"
+#endif
+
+#ifndef _H5Epkg_H
+#define _H5Epkg_H
+
+/* Get package's private header */
+#include "H5Eprivate.h"
+
+/* Other private headers needed by this file */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Amount to indent each error */
+#define H5E_INDENT              2
+
+/* Number of slots in an error stack */
+#define H5E_NSLOTS	        32
+
+#ifdef H5_HAVE_THREADSAFE
+/*
+ * The per-thread error stack. pthread_once() initializes a special
+ * key that will be used by all threads to create a stack specific to
+ * each thread individually. The association of stacks to threads will
+ * be handled by the pthread library.
+ *
+ * In order for this macro to work, H5E_get_my_stack() must be preceeded
+ * by "H5E_t *estack =".
+ */
+#define H5E_get_my_stack()  H5E_get_stack()
+#else /* H5_HAVE_THREADSAFE */
+/*
+ * The current error stack.
+ */
+#define H5E_get_my_stack() (H5E_stack_g + 0)
+#endif /* H5_HAVE_THREADSAFE */
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Some syntactic sugar to make the compiler happy with two different kinds of callbacks */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+typedef struct {
+    unsigned    vers;       /* Which version callback to use */
+    hbool_t     is_default; /* If the printing function is the library's own. */
+    H5E_auto1_t func1;      /* Old-style callback, NO error stack param. */
+    H5E_auto2_t func2;      /* New-style callback, with error stack param. */
+    H5E_auto1_t func1_default;      /* The saved library's default function - old style. */
+    H5E_auto2_t func2_default;      /* The saved library's default function - new style. */
+} H5E_auto_op_t;
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+typedef struct {
+    H5E_auto_t  func2;      /* Only the new style callback function is available. */
+} H5E_auto_op_t;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */ 
+
+/* Some syntactic sugar to make the compiler happy with two different kinds of callbacks */
+typedef struct {
+    unsigned vers;              /* Which version callback to use */
+    union {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        H5E_walk1_t func1;      /* Old-style callback, NO error stack param. */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+        H5E_walk2_t func2;      /* New-style callback, with error stack param. */
+    }u;
+} H5E_walk_op_t;
+
+/* Error class */
+typedef struct H5E_cls_t {
+    char *cls_name;             /* Name of error class */
+    char *lib_name;             /* Name of library within class */
+    char *lib_vers;             /* Version of library */
+} H5E_cls_t;
+
+/* Major or minor message */
+typedef struct H5E_msg_t {
+    char        *msg;           /* Message for error */
+    H5E_type_t   type;          /* Type of error (major or minor) */
+    H5E_cls_t   *cls;           /* Which error class this message belongs to */
+} H5E_msg_t;
+
+/* Error stack */
+struct H5E_t {
+    size_t nused;		        /* Num slots currently used in stack  */
+    H5E_error2_t slot[H5E_NSLOTS];	/* Array of error records	     */
+    H5E_auto_op_t auto_op;              /* Operator for 'automatic' error reporting */
+    void *auto_data;                    /* Callback data for 'automatic error reporting */
+};
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+#ifndef H5_HAVE_THREADSAFE
+/*
+ * The current error stack.
+ */
+H5_DLLVAR H5E_t	H5E_stack_g[1];
+#endif /* H5_HAVE_THREADSAFE */
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+H5_DLL herr_t H5E__term_deprec_interface(void);
+#ifdef H5_HAVE_THREADSAFE
+H5_DLL H5E_t *H5E_get_stack(void);
+#endif /* H5_HAVE_THREADSAFE */
+H5_DLL ssize_t H5E_get_msg(const H5E_msg_t *msg_ptr, H5E_type_t *type,
+    char *msg, size_t size);
+H5_DLL herr_t H5E_print(const H5E_t *estack, FILE *stream, hbool_t bk_compat);
+H5_DLL herr_t H5E_walk(const H5E_t *estack, H5E_direction_t direction,
+    const H5E_walk_op_t *op, void *client_data);
+H5_DLL herr_t H5E_get_auto(const H5E_t *estack, H5E_auto_op_t *op,
+    void **client_data);
+H5_DLL herr_t H5E_set_auto(H5E_t *estack, const H5E_auto_op_t *op,
+    void *client_data);
+H5_DLL herr_t H5E_pop(H5E_t *err_stack, size_t count);
+
+#endif /* _H5Epkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Eprivate.h b/gatb-core/thirdparty/hdf5/src/H5Eprivate.h
new file mode 100644
index 0000000..94a9244
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Eprivate.h
@@ -0,0 +1,129 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ *  Header file for error values, etc.
+ */
+#ifndef _H5Eprivate_H
+#define _H5Eprivate_H
+
+#include "H5Epublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"
+
+/* Typedef for error stack (defined in H5Epkg.h) */
+typedef struct H5E_t H5E_t;
+
+/*
+ * HERROR macro, used to facilitate error reporting between a FUNC_ENTER()
+ * and a FUNC_LEAVE() within a function body.  The arguments are the major
+ * error number, the minor error number, and a description of the error.
+ */
+#define HERROR(maj_id, min_id, ...) H5E_printf_stack(NULL, __FILE__, FUNC, __LINE__, H5E_ERR_CLS_g, maj_id, min_id, __VA_ARGS__)
+
+/*
+ * HCOMMON_ERROR macro, used by HDONE_ERROR and HGOTO_ERROR
+ * (Shouldn't need to be used outside this header file)
+ */
+#define HCOMMON_ERROR(maj, min, ...)  				              \
+   HERROR(maj, min, __VA_ARGS__);					      \
+   err_occurred = TRUE;                                                       \
+   err_occurred = err_occurred;         /* Shut GCC warnings up! */
+
+/*
+ * HDONE_ERROR macro, used to facilitate error reporting between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body, but _AFTER_ the
+ * "done:" label.  The arguments are
+ * the major error number, the minor error number, a return value, and a
+ * description of the error.
+ * (This macro can also be used to push an error and set the return value
+ *      without jumping to any labels)
+ */
+#define HDONE_ERROR(maj, min, ret_val, ...) {				      \
+   HCOMMON_ERROR(maj, min, __VA_ARGS__);					      \
+   ret_value = ret_val;                                                       \
+}
+
+/*
+ * HGOTO_ERROR macro, used to facilitate error reporting between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body.  The arguments are
+ * the major error number, the minor error number, the return value, and an
+ * error string.  The return value is assigned to a variable `ret_value' and
+ * control branches to the `done' label.
+ */
+#define HGOTO_ERROR(maj, min, ret_val, ...) {				      \
+   HCOMMON_ERROR(maj, min, __VA_ARGS__);					      \
+   HGOTO_DONE(ret_val)						              \
+}
+
+/*
+ * HGOTO_DONE macro, used to facilitate normal return between a FUNC_ENTER()
+ * and a FUNC_LEAVE() within a function body. The argument is the return
+ * value which is assigned to the `ret_value' variable.	 Control branches to
+ * the `done' label.
+ */
+#define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;}
+
+/* Library-private functions defined in H5E package */
+H5_DLL herr_t H5E_init(void);
+H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func,
+    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc);
+H5_DLL herr_t H5E_printf_stack(H5E_t *estack, const char *file, const char *func,
+    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...);
+H5_DLL herr_t H5E_clear_stack(H5E_t *estack);
+H5_DLL herr_t H5E_dump_api_stack(int is_api);
+
+/*
+ * Macros handling system error messages as described in C standard.
+ * These macros assume errnum is a valid system error code.
+ */
+
+/* Retrieve the error code description string and push it onto the error
+ * stack.
+ */
+#define	HSYS_DONE_ERROR(majorcode, minorcode, retcode, str) {		      \
+    int myerrno = errno;							      \
+    HDONE_ERROR(majorcode, minorcode, retcode, "%s, errno = %d, error message = '%s'", str, myerrno, HDstrerror(myerrno));			      \
+}
+#define	HSYS_GOTO_ERROR(majorcode, minorcode, retcode, str) {		      \
+    int myerrno = errno;							      \
+    HGOTO_ERROR(majorcode, minorcode, retcode, "%s, errno = %d, error message = '%s'", str, myerrno, HDstrerror(myerrno));			      \
+}
+
+#ifdef H5_HAVE_PARALLEL
+/*
+ * MPI error handling macros.
+ */
+
+extern	char	H5E_mpi_error_str[MPI_MAX_ERROR_STRING];
+extern	int	H5E_mpi_error_str_len;
+
+#define	HMPI_ERROR(mpierr){						      \
+    MPI_Error_string(mpierr, H5E_mpi_error_str, &H5E_mpi_error_str_len);      \
+    HERROR(H5E_INTERNAL, H5E_MPIERRSTR, "%s", H5E_mpi_error_str);                   \
+}
+#define	HMPI_DONE_ERROR(retcode, str, mpierr){				      \
+    HMPI_ERROR(mpierr);							      \
+    HDONE_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str);			      \
+}
+#define	HMPI_GOTO_ERROR(retcode, str, mpierr){				      \
+    HMPI_ERROR(mpierr);							      \
+    HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str);			      \
+}
+#endif /* H5_HAVE_PARALLEL */
+
+#endif /* _H5Eprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Epubgen.h b/gatb-core/thirdparty/hdf5/src/H5Epubgen.h
new file mode 100644
index 0000000..75eca0b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Epubgen.h
@@ -0,0 +1,368 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_err -- do not edit */
+/* Add new errors to H5err.txt file */
+
+
+#ifndef _H5Epubgen_H
+#define _H5Epubgen_H
+
+/*********************/
+/* Major error codes */
+/*********************/
+
+#define H5E_DATASET          (H5OPEN H5E_DATASET_g)
+#define H5E_FUNC             (H5OPEN H5E_FUNC_g)
+#define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
+#define H5E_FILE             (H5OPEN H5E_FILE_g)
+#define H5E_SOHM             (H5OPEN H5E_SOHM_g)
+#define H5E_SYM              (H5OPEN H5E_SYM_g)
+#define H5E_PLUGIN           (H5OPEN H5E_PLUGIN_g)
+#define H5E_VFL              (H5OPEN H5E_VFL_g)
+#define H5E_INTERNAL         (H5OPEN H5E_INTERNAL_g)
+#define H5E_BTREE            (H5OPEN H5E_BTREE_g)
+#define H5E_REFERENCE        (H5OPEN H5E_REFERENCE_g)
+#define H5E_DATASPACE        (H5OPEN H5E_DATASPACE_g)
+#define H5E_RESOURCE         (H5OPEN H5E_RESOURCE_g)
+#define H5E_PLIST            (H5OPEN H5E_PLIST_g)
+#define H5E_LINK             (H5OPEN H5E_LINK_g)
+#define H5E_DATATYPE         (H5OPEN H5E_DATATYPE_g)
+#define H5E_RS               (H5OPEN H5E_RS_g)
+#define H5E_HEAP             (H5OPEN H5E_HEAP_g)
+#define H5E_OHDR             (H5OPEN H5E_OHDR_g)
+#define H5E_ATOM             (H5OPEN H5E_ATOM_g)
+#define H5E_ATTR             (H5OPEN H5E_ATTR_g)
+#define H5E_NONE_MAJOR       (H5OPEN H5E_NONE_MAJOR_g)
+#define H5E_IO               (H5OPEN H5E_IO_g)
+#define H5E_SLIST            (H5OPEN H5E_SLIST_g)
+#define H5E_EFL              (H5OPEN H5E_EFL_g)
+#define H5E_TST              (H5OPEN H5E_TST_g)
+#define H5E_ARGS             (H5OPEN H5E_ARGS_g)
+#define H5E_ERROR            (H5OPEN H5E_ERROR_g)
+#define H5E_PLINE            (H5OPEN H5E_PLINE_g)
+#define H5E_FSPACE           (H5OPEN H5E_FSPACE_g)
+#define H5E_CACHE            (H5OPEN H5E_CACHE_g)
+H5_DLLVAR hid_t H5E_DATASET_g;       /* Dataset */
+H5_DLLVAR hid_t H5E_FUNC_g;          /* Function entry/exit */
+H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
+H5_DLLVAR hid_t H5E_FILE_g;          /* File accessibilty */
+H5_DLLVAR hid_t H5E_SOHM_g;          /* Shared Object Header Messages */
+H5_DLLVAR hid_t H5E_SYM_g;           /* Symbol table */
+H5_DLLVAR hid_t H5E_PLUGIN_g;        /* Plugin for dynamically loaded library */
+H5_DLLVAR hid_t H5E_VFL_g;           /* Virtual File Layer */
+H5_DLLVAR hid_t H5E_INTERNAL_g;      /* Internal error (too specific to document in detail) */
+H5_DLLVAR hid_t H5E_BTREE_g;         /* B-Tree node */
+H5_DLLVAR hid_t H5E_REFERENCE_g;     /* References */
+H5_DLLVAR hid_t H5E_DATASPACE_g;     /* Dataspace */
+H5_DLLVAR hid_t H5E_RESOURCE_g;      /* Resource unavailable */
+H5_DLLVAR hid_t H5E_PLIST_g;         /* Property lists */
+H5_DLLVAR hid_t H5E_LINK_g;          /* Links */
+H5_DLLVAR hid_t H5E_DATATYPE_g;      /* Datatype */
+H5_DLLVAR hid_t H5E_RS_g;            /* Reference Counted Strings */
+H5_DLLVAR hid_t H5E_HEAP_g;          /* Heap */
+H5_DLLVAR hid_t H5E_OHDR_g;          /* Object header */
+H5_DLLVAR hid_t H5E_ATOM_g;          /* Object atom */
+H5_DLLVAR hid_t H5E_ATTR_g;          /* Attribute */
+H5_DLLVAR hid_t H5E_NONE_MAJOR_g;    /* No error */
+H5_DLLVAR hid_t H5E_IO_g;            /* Low-level I/O */
+H5_DLLVAR hid_t H5E_SLIST_g;         /* Skip Lists */
+H5_DLLVAR hid_t H5E_EFL_g;           /* External file list */
+H5_DLLVAR hid_t H5E_TST_g;           /* Ternary Search Trees */
+H5_DLLVAR hid_t H5E_ARGS_g;          /* Invalid arguments to routine */
+H5_DLLVAR hid_t H5E_ERROR_g;         /* Error API */
+H5_DLLVAR hid_t H5E_PLINE_g;         /* Data filters */
+H5_DLLVAR hid_t H5E_FSPACE_g;        /* Free Space Manager */
+H5_DLLVAR hid_t H5E_CACHE_g;         /* Object cache */
+
+/*********************/
+/* Minor error codes */
+/*********************/
+
+/* Generic low-level file I/O errors */
+#define H5E_SEEKERROR        (H5OPEN H5E_SEEKERROR_g)
+#define H5E_READERROR        (H5OPEN H5E_READERROR_g)
+#define H5E_WRITEERROR       (H5OPEN H5E_WRITEERROR_g)
+#define H5E_CLOSEERROR       (H5OPEN H5E_CLOSEERROR_g)
+#define H5E_OVERFLOW         (H5OPEN H5E_OVERFLOW_g)
+#define H5E_FCNTL            (H5OPEN H5E_FCNTL_g)
+H5_DLLVAR hid_t H5E_SEEKERROR_g;     /* Seek failed */
+H5_DLLVAR hid_t H5E_READERROR_g;     /* Read failed */
+H5_DLLVAR hid_t H5E_WRITEERROR_g;    /* Write failed */
+H5_DLLVAR hid_t H5E_CLOSEERROR_g;    /* Close failed */
+H5_DLLVAR hid_t H5E_OVERFLOW_g;      /* Address overflowed */
+H5_DLLVAR hid_t H5E_FCNTL_g;         /* File control (fcntl) failed */
+
+/* Resource errors */
+#define H5E_NOSPACE          (H5OPEN H5E_NOSPACE_g)
+#define H5E_CANTALLOC        (H5OPEN H5E_CANTALLOC_g)
+#define H5E_CANTCOPY         (H5OPEN H5E_CANTCOPY_g)
+#define H5E_CANTFREE         (H5OPEN H5E_CANTFREE_g)
+#define H5E_ALREADYEXISTS    (H5OPEN H5E_ALREADYEXISTS_g)
+#define H5E_CANTLOCK         (H5OPEN H5E_CANTLOCK_g)
+#define H5E_CANTUNLOCK       (H5OPEN H5E_CANTUNLOCK_g)
+#define H5E_CANTGC           (H5OPEN H5E_CANTGC_g)
+#define H5E_CANTGETSIZE      (H5OPEN H5E_CANTGETSIZE_g)
+#define H5E_OBJOPEN          (H5OPEN H5E_OBJOPEN_g)
+H5_DLLVAR hid_t H5E_NOSPACE_g;       /* No space available for allocation */
+H5_DLLVAR hid_t H5E_CANTALLOC_g;     /* Can't allocate space */
+H5_DLLVAR hid_t H5E_CANTCOPY_g;      /* Unable to copy object */
+H5_DLLVAR hid_t H5E_CANTFREE_g;      /* Unable to free object */
+H5_DLLVAR hid_t H5E_ALREADYEXISTS_g; /* Object already exists */
+H5_DLLVAR hid_t H5E_CANTLOCK_g;      /* Unable to lock object */
+H5_DLLVAR hid_t H5E_CANTUNLOCK_g;    /* Unable to unlock object */
+H5_DLLVAR hid_t H5E_CANTGC_g;        /* Unable to garbage collect */
+H5_DLLVAR hid_t H5E_CANTGETSIZE_g;   /* Unable to compute size */
+H5_DLLVAR hid_t H5E_OBJOPEN_g;       /* Object is already open */
+
+/* Heap errors */
+#define H5E_CANTRESTORE      (H5OPEN H5E_CANTRESTORE_g)
+#define H5E_CANTCOMPUTE      (H5OPEN H5E_CANTCOMPUTE_g)
+#define H5E_CANTEXTEND       (H5OPEN H5E_CANTEXTEND_g)
+#define H5E_CANTATTACH       (H5OPEN H5E_CANTATTACH_g)
+#define H5E_CANTUPDATE       (H5OPEN H5E_CANTUPDATE_g)
+#define H5E_CANTOPERATE      (H5OPEN H5E_CANTOPERATE_g)
+H5_DLLVAR hid_t H5E_CANTRESTORE_g;   /* Can't restore condition */
+H5_DLLVAR hid_t H5E_CANTCOMPUTE_g;   /* Can't compute value */
+H5_DLLVAR hid_t H5E_CANTEXTEND_g;    /* Can't extend heap's space */
+H5_DLLVAR hid_t H5E_CANTATTACH_g;    /* Can't attach object */
+H5_DLLVAR hid_t H5E_CANTUPDATE_g;    /* Can't update object */
+H5_DLLVAR hid_t H5E_CANTOPERATE_g;   /* Can't operate on object */
+
+/* Function entry/exit interface errors */
+#define H5E_CANTINIT         (H5OPEN H5E_CANTINIT_g)
+#define H5E_ALREADYINIT      (H5OPEN H5E_ALREADYINIT_g)
+#define H5E_CANTRELEASE      (H5OPEN H5E_CANTRELEASE_g)
+H5_DLLVAR hid_t H5E_CANTINIT_g;      /* Unable to initialize object */
+H5_DLLVAR hid_t H5E_ALREADYINIT_g;   /* Object already initialized */
+H5_DLLVAR hid_t H5E_CANTRELEASE_g;   /* Unable to release object */
+
+/* Property list errors */
+#define H5E_CANTGET          (H5OPEN H5E_CANTGET_g)
+#define H5E_CANTSET          (H5OPEN H5E_CANTSET_g)
+#define H5E_DUPCLASS         (H5OPEN H5E_DUPCLASS_g)
+#define H5E_SETDISALLOWED    (H5OPEN H5E_SETDISALLOWED_g)
+H5_DLLVAR hid_t H5E_CANTGET_g;       /* Can't get value */
+H5_DLLVAR hid_t H5E_CANTSET_g;       /* Can't set value */
+H5_DLLVAR hid_t H5E_DUPCLASS_g;      /* Duplicate class name in parent class */
+H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */
+
+/* Free space errors */
+#define H5E_CANTMERGE        (H5OPEN H5E_CANTMERGE_g)
+#define H5E_CANTREVIVE       (H5OPEN H5E_CANTREVIVE_g)
+#define H5E_CANTSHRINK       (H5OPEN H5E_CANTSHRINK_g)
+H5_DLLVAR hid_t H5E_CANTMERGE_g;     /* Can't merge objects */
+H5_DLLVAR hid_t H5E_CANTREVIVE_g;    /* Can't revive object */
+H5_DLLVAR hid_t H5E_CANTSHRINK_g;    /* Can't shrink container */
+
+/* Object header related errors */
+#define H5E_LINKCOUNT        (H5OPEN H5E_LINKCOUNT_g)
+#define H5E_VERSION          (H5OPEN H5E_VERSION_g)
+#define H5E_ALIGNMENT        (H5OPEN H5E_ALIGNMENT_g)
+#define H5E_BADMESG          (H5OPEN H5E_BADMESG_g)
+#define H5E_CANTDELETE       (H5OPEN H5E_CANTDELETE_g)
+#define H5E_BADITER          (H5OPEN H5E_BADITER_g)
+#define H5E_CANTPACK         (H5OPEN H5E_CANTPACK_g)
+#define H5E_CANTRESET        (H5OPEN H5E_CANTRESET_g)
+#define H5E_CANTRENAME       (H5OPEN H5E_CANTRENAME_g)
+H5_DLLVAR hid_t H5E_LINKCOUNT_g;     /* Bad object header link count */
+H5_DLLVAR hid_t H5E_VERSION_g;       /* Wrong version number */
+H5_DLLVAR hid_t H5E_ALIGNMENT_g;     /* Alignment error */
+H5_DLLVAR hid_t H5E_BADMESG_g;       /* Unrecognized message */
+H5_DLLVAR hid_t H5E_CANTDELETE_g;    /* Can't delete message */
+H5_DLLVAR hid_t H5E_BADITER_g;       /* Iteration failed */
+H5_DLLVAR hid_t H5E_CANTPACK_g;      /* Can't pack messages */
+H5_DLLVAR hid_t H5E_CANTRESET_g;     /* Can't reset object */
+H5_DLLVAR hid_t H5E_CANTRENAME_g;    /* Unable to rename object */
+
+/* System level errors */
+#define H5E_SYSERRSTR        (H5OPEN H5E_SYSERRSTR_g)
+H5_DLLVAR hid_t H5E_SYSERRSTR_g;     /* System error message */
+
+/* I/O pipeline errors */
+#define H5E_NOFILTER         (H5OPEN H5E_NOFILTER_g)
+#define H5E_CALLBACK         (H5OPEN H5E_CALLBACK_g)
+#define H5E_CANAPPLY         (H5OPEN H5E_CANAPPLY_g)
+#define H5E_SETLOCAL         (H5OPEN H5E_SETLOCAL_g)
+#define H5E_NOENCODER        (H5OPEN H5E_NOENCODER_g)
+#define H5E_CANTFILTER       (H5OPEN H5E_CANTFILTER_g)
+H5_DLLVAR hid_t H5E_NOFILTER_g;      /* Requested filter is not available */
+H5_DLLVAR hid_t H5E_CALLBACK_g;      /* Callback failed */
+H5_DLLVAR hid_t H5E_CANAPPLY_g;      /* Error from filter 'can apply' callback */
+H5_DLLVAR hid_t H5E_SETLOCAL_g;      /* Error from filter 'set local' callback */
+H5_DLLVAR hid_t H5E_NOENCODER_g;     /* Filter present but encoding disabled */
+H5_DLLVAR hid_t H5E_CANTFILTER_g;    /* Filter operation failed */
+
+/* Group related errors */
+#define H5E_CANTOPENOBJ      (H5OPEN H5E_CANTOPENOBJ_g)
+#define H5E_CANTCLOSEOBJ     (H5OPEN H5E_CANTCLOSEOBJ_g)
+#define H5E_COMPLEN          (H5OPEN H5E_COMPLEN_g)
+#define H5E_PATH             (H5OPEN H5E_PATH_g)
+H5_DLLVAR hid_t H5E_CANTOPENOBJ_g;   /* Can't open object */
+H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g;  /* Can't close object */
+H5_DLLVAR hid_t H5E_COMPLEN_g;       /* Name component is too long */
+H5_DLLVAR hid_t H5E_PATH_g;          /* Problem with path to object */
+
+/* No error */
+#define H5E_NONE_MINOR       (H5OPEN H5E_NONE_MINOR_g)
+H5_DLLVAR hid_t H5E_NONE_MINOR_g;    /* No error */
+
+/* Plugin errors */
+#define H5E_OPENERROR        (H5OPEN H5E_OPENERROR_g)
+H5_DLLVAR hid_t H5E_OPENERROR_g;     /* Can't open directory or file */
+
+/* File accessibilty errors */
+#define H5E_FILEEXISTS       (H5OPEN H5E_FILEEXISTS_g)
+#define H5E_FILEOPEN         (H5OPEN H5E_FILEOPEN_g)
+#define H5E_CANTCREATE       (H5OPEN H5E_CANTCREATE_g)
+#define H5E_CANTOPENFILE     (H5OPEN H5E_CANTOPENFILE_g)
+#define H5E_CANTCLOSEFILE    (H5OPEN H5E_CANTCLOSEFILE_g)
+#define H5E_NOTHDF5          (H5OPEN H5E_NOTHDF5_g)
+#define H5E_BADFILE          (H5OPEN H5E_BADFILE_g)
+#define H5E_TRUNCATED        (H5OPEN H5E_TRUNCATED_g)
+#define H5E_MOUNT            (H5OPEN H5E_MOUNT_g)
+H5_DLLVAR hid_t H5E_FILEEXISTS_g;    /* File already exists */
+H5_DLLVAR hid_t H5E_FILEOPEN_g;      /* File already open */
+H5_DLLVAR hid_t H5E_CANTCREATE_g;    /* Unable to create file */
+H5_DLLVAR hid_t H5E_CANTOPENFILE_g;  /* Unable to open file */
+H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */
+H5_DLLVAR hid_t H5E_NOTHDF5_g;       /* Not an HDF5 file */
+H5_DLLVAR hid_t H5E_BADFILE_g;       /* Bad file ID accessed */
+H5_DLLVAR hid_t H5E_TRUNCATED_g;     /* File has been truncated */
+H5_DLLVAR hid_t H5E_MOUNT_g;         /* File mount error */
+
+/* Object atom related errors */
+#define H5E_BADATOM          (H5OPEN H5E_BADATOM_g)
+#define H5E_BADGROUP         (H5OPEN H5E_BADGROUP_g)
+#define H5E_CANTREGISTER     (H5OPEN H5E_CANTREGISTER_g)
+#define H5E_CANTINC          (H5OPEN H5E_CANTINC_g)
+#define H5E_CANTDEC          (H5OPEN H5E_CANTDEC_g)
+#define H5E_NOIDS            (H5OPEN H5E_NOIDS_g)
+H5_DLLVAR hid_t H5E_BADATOM_g;       /* Unable to find atom information (already closed?) */
+H5_DLLVAR hid_t H5E_BADGROUP_g;      /* Unable to find ID group information */
+H5_DLLVAR hid_t H5E_CANTREGISTER_g;  /* Unable to register new atom */
+H5_DLLVAR hid_t H5E_CANTINC_g;       /* Unable to increment reference count */
+H5_DLLVAR hid_t H5E_CANTDEC_g;       /* Unable to decrement reference count */
+H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
+
+/* Cache related errors */
+#define H5E_CANTFLUSH        (H5OPEN H5E_CANTFLUSH_g)
+#define H5E_CANTSERIALIZE    (H5OPEN H5E_CANTSERIALIZE_g)
+#define H5E_CANTLOAD         (H5OPEN H5E_CANTLOAD_g)
+#define H5E_PROTECT          (H5OPEN H5E_PROTECT_g)
+#define H5E_NOTCACHED        (H5OPEN H5E_NOTCACHED_g)
+#define H5E_SYSTEM           (H5OPEN H5E_SYSTEM_g)
+#define H5E_CANTINS          (H5OPEN H5E_CANTINS_g)
+#define H5E_CANTPROTECT      (H5OPEN H5E_CANTPROTECT_g)
+#define H5E_CANTUNPROTECT    (H5OPEN H5E_CANTUNPROTECT_g)
+#define H5E_CANTPIN          (H5OPEN H5E_CANTPIN_g)
+#define H5E_CANTUNPIN        (H5OPEN H5E_CANTUNPIN_g)
+#define H5E_CANTMARKDIRTY    (H5OPEN H5E_CANTMARKDIRTY_g)
+#define H5E_CANTDIRTY        (H5OPEN H5E_CANTDIRTY_g)
+#define H5E_CANTEXPUNGE      (H5OPEN H5E_CANTEXPUNGE_g)
+#define H5E_CANTRESIZE       (H5OPEN H5E_CANTRESIZE_g)
+H5_DLLVAR hid_t H5E_CANTFLUSH_g;     /* Unable to flush data from cache */
+H5_DLLVAR hid_t H5E_CANTSERIALIZE_g; /* Unable to serialize data from cache */
+H5_DLLVAR hid_t H5E_CANTLOAD_g;      /* Unable to load metadata into cache */
+H5_DLLVAR hid_t H5E_PROTECT_g;       /* Protected metadata error */
+H5_DLLVAR hid_t H5E_NOTCACHED_g;     /* Metadata not currently cached */
+H5_DLLVAR hid_t H5E_SYSTEM_g;        /* Internal error detected */
+H5_DLLVAR hid_t H5E_CANTINS_g;       /* Unable to insert metadata into cache */
+H5_DLLVAR hid_t H5E_CANTPROTECT_g;   /* Unable to protect metadata */
+H5_DLLVAR hid_t H5E_CANTUNPROTECT_g; /* Unable to unprotect metadata */
+H5_DLLVAR hid_t H5E_CANTPIN_g;       /* Unable to pin cache entry */
+H5_DLLVAR hid_t H5E_CANTUNPIN_g;     /* Unable to un-pin cache entry */
+H5_DLLVAR hid_t H5E_CANTMARKDIRTY_g; /* Unable to mark a pinned entry as dirty */
+H5_DLLVAR hid_t H5E_CANTDIRTY_g;     /* Unable to mark metadata as dirty */
+H5_DLLVAR hid_t H5E_CANTEXPUNGE_g;   /* Unable to expunge a metadata cache entry */
+H5_DLLVAR hid_t H5E_CANTRESIZE_g;    /* Unable to resize a metadata cache entry */
+
+/* Link related errors */
+#define H5E_TRAVERSE         (H5OPEN H5E_TRAVERSE_g)
+#define H5E_NLINKS           (H5OPEN H5E_NLINKS_g)
+#define H5E_NOTREGISTERED    (H5OPEN H5E_NOTREGISTERED_g)
+#define H5E_CANTMOVE         (H5OPEN H5E_CANTMOVE_g)
+#define H5E_CANTSORT         (H5OPEN H5E_CANTSORT_g)
+H5_DLLVAR hid_t H5E_TRAVERSE_g;      /* Link traversal failure */
+H5_DLLVAR hid_t H5E_NLINKS_g;        /* Too many soft links in path */
+H5_DLLVAR hid_t H5E_NOTREGISTERED_g; /* Link class not registered */
+H5_DLLVAR hid_t H5E_CANTMOVE_g;      /* Can't move object */
+H5_DLLVAR hid_t H5E_CANTSORT_g;      /* Can't sort objects */
+
+/* Parallel MPI errors */
+#define H5E_MPI              (H5OPEN H5E_MPI_g)
+#define H5E_MPIERRSTR        (H5OPEN H5E_MPIERRSTR_g)
+#define H5E_CANTRECV         (H5OPEN H5E_CANTRECV_g)
+H5_DLLVAR hid_t H5E_MPI_g;           /* Some MPI function failed */
+H5_DLLVAR hid_t H5E_MPIERRSTR_g;     /* MPI Error String */
+H5_DLLVAR hid_t H5E_CANTRECV_g;      /* Can't receive data */
+
+/* Dataspace errors */
+#define H5E_CANTCLIP         (H5OPEN H5E_CANTCLIP_g)
+#define H5E_CANTCOUNT        (H5OPEN H5E_CANTCOUNT_g)
+#define H5E_CANTSELECT       (H5OPEN H5E_CANTSELECT_g)
+#define H5E_CANTNEXT         (H5OPEN H5E_CANTNEXT_g)
+#define H5E_BADSELECT        (H5OPEN H5E_BADSELECT_g)
+#define H5E_CANTCOMPARE      (H5OPEN H5E_CANTCOMPARE_g)
+H5_DLLVAR hid_t H5E_CANTCLIP_g;      /* Can't clip hyperslab region */
+H5_DLLVAR hid_t H5E_CANTCOUNT_g;     /* Can't count elements */
+H5_DLLVAR hid_t H5E_CANTSELECT_g;    /* Can't select hyperslab */
+H5_DLLVAR hid_t H5E_CANTNEXT_g;      /* Can't move to next iterator location */
+H5_DLLVAR hid_t H5E_BADSELECT_g;     /* Invalid selection */
+H5_DLLVAR hid_t H5E_CANTCOMPARE_g;   /* Can't compare objects */
+
+/* Argument errors */
+#define H5E_UNINITIALIZED    (H5OPEN H5E_UNINITIALIZED_g)
+#define H5E_UNSUPPORTED      (H5OPEN H5E_UNSUPPORTED_g)
+#define H5E_BADTYPE          (H5OPEN H5E_BADTYPE_g)
+#define H5E_BADRANGE         (H5OPEN H5E_BADRANGE_g)
+#define H5E_BADVALUE         (H5OPEN H5E_BADVALUE_g)
+H5_DLLVAR hid_t H5E_UNINITIALIZED_g; /* Information is uinitialized */
+H5_DLLVAR hid_t H5E_UNSUPPORTED_g;   /* Feature is unsupported */
+H5_DLLVAR hid_t H5E_BADTYPE_g;       /* Inappropriate type */
+H5_DLLVAR hid_t H5E_BADRANGE_g;      /* Out of range */
+H5_DLLVAR hid_t H5E_BADVALUE_g;      /* Bad value */
+
+/* B-tree related errors */
+#define H5E_NOTFOUND         (H5OPEN H5E_NOTFOUND_g)
+#define H5E_EXISTS           (H5OPEN H5E_EXISTS_g)
+#define H5E_CANTENCODE       (H5OPEN H5E_CANTENCODE_g)
+#define H5E_CANTDECODE       (H5OPEN H5E_CANTDECODE_g)
+#define H5E_CANTSPLIT        (H5OPEN H5E_CANTSPLIT_g)
+#define H5E_CANTREDISTRIBUTE (H5OPEN H5E_CANTREDISTRIBUTE_g)
+#define H5E_CANTSWAP         (H5OPEN H5E_CANTSWAP_g)
+#define H5E_CANTINSERT       (H5OPEN H5E_CANTINSERT_g)
+#define H5E_CANTLIST         (H5OPEN H5E_CANTLIST_g)
+#define H5E_CANTMODIFY       (H5OPEN H5E_CANTMODIFY_g)
+#define H5E_CANTREMOVE       (H5OPEN H5E_CANTREMOVE_g)
+H5_DLLVAR hid_t H5E_NOTFOUND_g;      /* Object not found */
+H5_DLLVAR hid_t H5E_EXISTS_g;        /* Object already exists */
+H5_DLLVAR hid_t H5E_CANTENCODE_g;    /* Unable to encode value */
+H5_DLLVAR hid_t H5E_CANTDECODE_g;    /* Unable to decode value */
+H5_DLLVAR hid_t H5E_CANTSPLIT_g;     /* Unable to split node */
+H5_DLLVAR hid_t H5E_CANTREDISTRIBUTE_g; /* Unable to redistribute records */
+H5_DLLVAR hid_t H5E_CANTSWAP_g;      /* Unable to swap records */
+H5_DLLVAR hid_t H5E_CANTINSERT_g;    /* Unable to insert object */
+H5_DLLVAR hid_t H5E_CANTLIST_g;      /* Unable to list node */
+H5_DLLVAR hid_t H5E_CANTMODIFY_g;    /* Unable to modify record */
+H5_DLLVAR hid_t H5E_CANTREMOVE_g;    /* Unable to remove object */
+
+/* Datatype conversion errors */
+#define H5E_CANTCONVERT      (H5OPEN H5E_CANTCONVERT_g)
+#define H5E_BADSIZE          (H5OPEN H5E_BADSIZE_g)
+H5_DLLVAR hid_t H5E_CANTCONVERT_g;   /* Can't convert datatypes */
+H5_DLLVAR hid_t H5E_BADSIZE_g;       /* Bad size for object */
+
+#endif /* H5Epubgen_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Epublic.h b/gatb-core/thirdparty/hdf5/src/H5Epublic.h
new file mode 100644
index 0000000..17a35d9
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Epublic.h
@@ -0,0 +1,228 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5E module.
+ */
+#ifndef _H5Epublic_H
+#define _H5Epublic_H
+
+#include <stdio.h>              /*FILE arg of H5Eprint()                     */
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Ipublic.h"
+
+/* Value for the default error stack */
+#define H5E_DEFAULT             (hid_t)0
+
+/* Different kinds of error information */
+typedef enum H5E_type_t {
+    H5E_MAJOR,
+    H5E_MINOR
+} H5E_type_t;
+
+/* Information about an error; element of error stack */
+typedef struct H5E_error2_t {
+    hid_t       cls_id;         /*class ID                           */
+    hid_t       maj_num;	/*major error ID		     */
+    hid_t       min_num;	/*minor error number		     */
+    unsigned	line;		/*line in file where error occurs    */
+    const char	*func_name;   	/*function in which error occurred   */
+    const char	*file_name;	/*file in which error occurred       */
+    const char	*desc;		/*optional supplied description      */
+} H5E_error2_t;
+
+/* When this header is included from a private header, don't make calls to H5open() */
+#undef H5OPEN
+#ifndef _H5private_H
+#define H5OPEN          H5open(),
+#else   /* _H5private_H */
+#define H5OPEN
+#endif  /* _H5private_H */
+
+/* HDF5 error class */
+#define H5E_ERR_CLS		(H5OPEN H5E_ERR_CLS_g)
+H5_DLLVAR hid_t H5E_ERR_CLS_g;
+
+/* Include the automatically generated public header information */
+/* (This includes the list of major and minor error codes for the library) */
+#include "H5Epubgen.h"
+
+/*
+ * One often needs to temporarily disable automatic error reporting when
+ * trying something that's likely or expected to fail.  The code to try can
+ * be nested between calls to H5Eget_auto() and H5Eset_auto(), but it's
+ * easier just to use this macro like:
+ * 	H5E_BEGIN_TRY {
+ *	    ...stuff here that's likely to fail...
+ *      } H5E_END_TRY;
+ *
+ * Warning: don't break, return, or longjmp() from the body of the loop or
+ *	    the error reporting won't be properly restored!
+ *
+ * These two macros still use the old API functions for backward compatibility
+ * purpose.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+#define H5E_BEGIN_TRY {							      \
+    unsigned H5E_saved_is_v2;					              \
+    union {								      \
+        H5E_auto1_t efunc1;						      \
+        H5E_auto2_t efunc2;					              \
+    } H5E_saved;							      \
+    void *H5E_saved_edata;						      \
+								    	      \
+    (void)H5Eauto_is_v2(H5E_DEFAULT, &H5E_saved_is_v2);		              \
+    if(H5E_saved_is_v2) {						      \
+        (void)H5Eget_auto2(H5E_DEFAULT, &H5E_saved.efunc2, &H5E_saved_edata); \
+        (void)H5Eset_auto2(H5E_DEFAULT, NULL, NULL);		              \
+    } else {								      \
+        (void)H5Eget_auto1(&H5E_saved.efunc1, &H5E_saved_edata);		      \
+        (void)H5Eset_auto1(NULL, NULL);					      \
+    }
+
+#define H5E_END_TRY							      \
+    if(H5E_saved_is_v2)							      \
+        (void)H5Eset_auto2(H5E_DEFAULT, H5E_saved.efunc2, H5E_saved_edata);   \
+    else								      \
+        (void)H5Eset_auto1(H5E_saved.efunc1, H5E_saved_edata);		      \
+}
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+#define H5E_BEGIN_TRY {							      \
+    H5E_auto_t saved_efunc;						      \
+    void *H5E_saved_edata;						      \
+								    	      \
+    (void)H5Eget_auto(H5E_DEFAULT, &saved_efunc, &H5E_saved_edata);	      \
+    (void)H5Eset_auto(H5E_DEFAULT, NULL, NULL);
+
+#define H5E_END_TRY							      \
+    (void)H5Eset_auto(H5E_DEFAULT, saved_efunc, H5E_saved_edata);	      \
+}
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/*
+ * Public API Convenience Macros for Error reporting - Documented
+ */
+/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in */
+#define H5Epush_sim(func, cls, maj, min, str) H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str)
+
+/*
+ * Public API Convenience Macros for Error reporting - Undocumented
+ */
+/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in */
+/*  And return after pushing error onto stack */
+#define H5Epush_ret(func, cls, maj, min, str, ret) {			      \
+    H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str);      \
+    return(ret);							      \
+}
+
+/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in
+ * And goto a label after pushing error onto stack.
+ */
+#define H5Epush_goto(func, cls, maj, min, str, label) {			      \
+    H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str);      \
+    goto label;								      \
+}
+
+/* Error stack traversal direction */
+typedef enum H5E_direction_t {
+    H5E_WALK_UPWARD	= 0,		/*begin deep, end at API function    */
+    H5E_WALK_DOWNWARD	= 1		/*begin at API function, end deep    */
+} H5E_direction_t;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Error stack traversal callback function pointers */
+typedef herr_t (*H5E_walk2_t)(unsigned n, const H5E_error2_t *err_desc,
+    void *client_data);
+typedef herr_t (*H5E_auto2_t)(hid_t estack, void *client_data);
+
+/* Public API functions */
+H5_DLL hid_t  H5Eregister_class(const char *cls_name, const char *lib_name,
+    const char *version);
+H5_DLL herr_t H5Eunregister_class(hid_t class_id);
+H5_DLL herr_t H5Eclose_msg(hid_t err_id);
+H5_DLL hid_t  H5Ecreate_msg(hid_t cls, H5E_type_t msg_type, const char *msg);
+H5_DLL hid_t  H5Ecreate_stack(void);
+H5_DLL hid_t  H5Eget_current_stack(void);
+H5_DLL herr_t H5Eclose_stack(hid_t stack_id);
+H5_DLL ssize_t H5Eget_class_name(hid_t class_id, char *name, size_t size);
+H5_DLL herr_t H5Eset_current_stack(hid_t err_stack_id);
+H5_DLL herr_t H5Epush2(hid_t err_stack, const char *file, const char *func, unsigned line,
+    hid_t cls_id, hid_t maj_id, hid_t min_id, const char *msg, ...);
+H5_DLL herr_t H5Epop(hid_t err_stack, size_t count);
+H5_DLL herr_t H5Eprint2(hid_t err_stack, FILE *stream);
+H5_DLL herr_t H5Ewalk2(hid_t err_stack, H5E_direction_t direction, H5E_walk2_t func,
+    void *client_data);
+H5_DLL herr_t H5Eget_auto2(hid_t estack_id, H5E_auto2_t *func, void **client_data);
+H5_DLL herr_t H5Eset_auto2(hid_t estack_id, H5E_auto2_t func, void *client_data);
+H5_DLL herr_t H5Eclear2(hid_t err_stack);
+H5_DLL herr_t H5Eauto_is_v2(hid_t err_stack, unsigned *is_stack);
+H5_DLL ssize_t H5Eget_msg(hid_t msg_id, H5E_type_t *type, char *msg,
+    size_t size);
+H5_DLL ssize_t H5Eget_num(hid_t error_stack_id);
+
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Typedefs */
+
+/* Alias major & minor error types to hid_t's, for compatibility with new
+ *      error API in v1.8
+ */
+typedef hid_t   H5E_major_t;
+typedef hid_t   H5E_minor_t;
+
+/* Information about an error element of error stack. */
+typedef struct H5E_error1_t {
+    H5E_major_t maj_num;                /*major error number                 */
+    H5E_minor_t min_num;                /*minor error number                 */
+    const char  *func_name;             /*function in which error occurred   */
+    const char  *file_name;             /*file in which error occurred       */
+    unsigned    line;                   /*line in file where error occurs    */
+    const char  *desc;                  /*optional supplied description      */
+} H5E_error1_t;
+
+/* Error stack traversal callback function pointers */
+typedef herr_t (*H5E_walk1_t)(int n, H5E_error1_t *err_desc, void *client_data);
+typedef herr_t (*H5E_auto1_t)(void *client_data);
+
+/* Function prototypes */
+H5_DLL herr_t H5Eclear1(void);
+H5_DLL herr_t H5Eget_auto1(H5E_auto1_t *func, void **client_data);
+H5_DLL herr_t H5Epush1(const char *file, const char *func, unsigned line,
+    H5E_major_t maj, H5E_minor_t min, const char *str);
+H5_DLL herr_t H5Eprint1(FILE *stream);
+H5_DLL herr_t H5Eset_auto1(H5E_auto1_t func, void *client_data);
+H5_DLL herr_t H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func,
+    void *client_data);
+H5_DLL char *H5Eget_major(H5E_major_t maj);
+H5_DLL char *H5Eget_minor(H5E_minor_t min);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* end _H5Epublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Eterm.h b/gatb-core/thirdparty/hdf5/src/H5Eterm.h
new file mode 100644
index 0000000..86902b8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Eterm.h
@@ -0,0 +1,218 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_err -- do not edit */
+/* Add new errors to H5err.txt file */
+
+
+#ifndef _H5Eterm_H
+#define _H5Eterm_H
+
+/* Reset major error IDs */
+    
+H5E_DATASET_g=    
+H5E_FUNC_g=    
+H5E_STORAGE_g=    
+H5E_FILE_g=    
+H5E_SOHM_g=    
+H5E_SYM_g=    
+H5E_PLUGIN_g=    
+H5E_VFL_g=    
+H5E_INTERNAL_g=    
+H5E_BTREE_g=    
+H5E_REFERENCE_g=    
+H5E_DATASPACE_g=    
+H5E_RESOURCE_g=    
+H5E_PLIST_g=    
+H5E_LINK_g=    
+H5E_DATATYPE_g=    
+H5E_RS_g=    
+H5E_HEAP_g=    
+H5E_OHDR_g=    
+H5E_ATOM_g=    
+H5E_ATTR_g=    
+H5E_NONE_MAJOR_g=    
+H5E_IO_g=    
+H5E_SLIST_g=    
+H5E_EFL_g=    
+H5E_TST_g=    
+H5E_ARGS_g=    
+H5E_ERROR_g=    
+H5E_PLINE_g=    
+H5E_FSPACE_g=    
+H5E_CACHE_g= (-1);
+
+/* Reset minor error IDs */
+
+
+/* Generic low-level file I/O errors */    
+H5E_SEEKERROR_g=    
+H5E_READERROR_g=    
+H5E_WRITEERROR_g=    
+H5E_CLOSEERROR_g=    
+H5E_OVERFLOW_g=    
+H5E_FCNTL_g=
+
+/* Resource errors */    
+H5E_NOSPACE_g=    
+H5E_CANTALLOC_g=    
+H5E_CANTCOPY_g=    
+H5E_CANTFREE_g=    
+H5E_ALREADYEXISTS_g=    
+H5E_CANTLOCK_g=    
+H5E_CANTUNLOCK_g=    
+H5E_CANTGC_g=    
+H5E_CANTGETSIZE_g=    
+H5E_OBJOPEN_g=
+
+/* Heap errors */    
+H5E_CANTRESTORE_g=    
+H5E_CANTCOMPUTE_g=    
+H5E_CANTEXTEND_g=    
+H5E_CANTATTACH_g=    
+H5E_CANTUPDATE_g=    
+H5E_CANTOPERATE_g=
+
+/* Function entry/exit interface errors */    
+H5E_CANTINIT_g=    
+H5E_ALREADYINIT_g=    
+H5E_CANTRELEASE_g=
+
+/* Property list errors */    
+H5E_CANTGET_g=    
+H5E_CANTSET_g=    
+H5E_DUPCLASS_g=    
+H5E_SETDISALLOWED_g=
+
+/* Free space errors */    
+H5E_CANTMERGE_g=    
+H5E_CANTREVIVE_g=    
+H5E_CANTSHRINK_g=
+
+/* Object header related errors */    
+H5E_LINKCOUNT_g=    
+H5E_VERSION_g=    
+H5E_ALIGNMENT_g=    
+H5E_BADMESG_g=    
+H5E_CANTDELETE_g=    
+H5E_BADITER_g=    
+H5E_CANTPACK_g=    
+H5E_CANTRESET_g=    
+H5E_CANTRENAME_g=
+
+/* System level errors */    
+H5E_SYSERRSTR_g=
+
+/* I/O pipeline errors */    
+H5E_NOFILTER_g=    
+H5E_CALLBACK_g=    
+H5E_CANAPPLY_g=    
+H5E_SETLOCAL_g=    
+H5E_NOENCODER_g=    
+H5E_CANTFILTER_g=
+
+/* Group related errors */    
+H5E_CANTOPENOBJ_g=    
+H5E_CANTCLOSEOBJ_g=    
+H5E_COMPLEN_g=    
+H5E_PATH_g=
+
+/* No error */    
+H5E_NONE_MINOR_g=
+
+/* Plugin errors */    
+H5E_OPENERROR_g=
+
+/* File accessibilty errors */    
+H5E_FILEEXISTS_g=    
+H5E_FILEOPEN_g=    
+H5E_CANTCREATE_g=    
+H5E_CANTOPENFILE_g=    
+H5E_CANTCLOSEFILE_g=    
+H5E_NOTHDF5_g=    
+H5E_BADFILE_g=    
+H5E_TRUNCATED_g=    
+H5E_MOUNT_g=
+
+/* Object atom related errors */    
+H5E_BADATOM_g=    
+H5E_BADGROUP_g=    
+H5E_CANTREGISTER_g=    
+H5E_CANTINC_g=    
+H5E_CANTDEC_g=    
+H5E_NOIDS_g=
+
+/* Cache related errors */    
+H5E_CANTFLUSH_g=    
+H5E_CANTSERIALIZE_g=    
+H5E_CANTLOAD_g=    
+H5E_PROTECT_g=    
+H5E_NOTCACHED_g=    
+H5E_SYSTEM_g=    
+H5E_CANTINS_g=    
+H5E_CANTPROTECT_g=    
+H5E_CANTUNPROTECT_g=    
+H5E_CANTPIN_g=    
+H5E_CANTUNPIN_g=    
+H5E_CANTMARKDIRTY_g=    
+H5E_CANTDIRTY_g=    
+H5E_CANTEXPUNGE_g=    
+H5E_CANTRESIZE_g=
+
+/* Link related errors */    
+H5E_TRAVERSE_g=    
+H5E_NLINKS_g=    
+H5E_NOTREGISTERED_g=    
+H5E_CANTMOVE_g=    
+H5E_CANTSORT_g=
+
+/* Parallel MPI errors */    
+H5E_MPI_g=    
+H5E_MPIERRSTR_g=    
+H5E_CANTRECV_g=
+
+/* Dataspace errors */    
+H5E_CANTCLIP_g=    
+H5E_CANTCOUNT_g=    
+H5E_CANTSELECT_g=    
+H5E_CANTNEXT_g=    
+H5E_BADSELECT_g=    
+H5E_CANTCOMPARE_g=
+
+/* Argument errors */    
+H5E_UNINITIALIZED_g=    
+H5E_UNSUPPORTED_g=    
+H5E_BADTYPE_g=    
+H5E_BADRANGE_g=    
+H5E_BADVALUE_g=
+
+/* B-tree related errors */    
+H5E_NOTFOUND_g=    
+H5E_EXISTS_g=    
+H5E_CANTENCODE_g=    
+H5E_CANTDECODE_g=    
+H5E_CANTSPLIT_g=    
+H5E_CANTREDISTRIBUTE_g=    
+H5E_CANTSWAP_g=    
+H5E_CANTINSERT_g=    
+H5E_CANTLIST_g=    
+H5E_CANTMODIFY_g=    
+H5E_CANTREMOVE_g=
+
+/* Datatype conversion errors */    
+H5E_CANTCONVERT_g=    
+H5E_BADSIZE_g= (-1);
+
+#endif /* H5Eterm_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5F.c b/gatb-core/thirdparty/hdf5/src/H5F.c
new file mode 100644
index 0000000..70afbcc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5F.c
@@ -0,0 +1,1418 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5F__init_pub_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Aprivate.h"		/* Attributes				*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+#include "H5Tprivate.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+/* File ID class */
+static const H5I_class_t H5I_FILE_CLS[1] = {{
+    H5I_FILE,			/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5F_close	/* Callback routine for closing objects of this class */
+}};
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5F__init_pub_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5F__init_pub_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5F_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5F__init_pub_interface(void)
+{
+    herr_t          ret_value                = SUCCEED;   /* Return value */
+    FUNC_ENTER_STATIC
+
+    /*
+     * Initialize the atom group for the file IDs.
+     */
+    if(H5I_register_type(H5I_FILE_CLS) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    ret_value = H5F_init();
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F__init_pub_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_init
+ *
+ * Purpose:	Initialize the interface from some other layer.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_term_interface
+ *
+ * Purpose:	Terminate this interface: free all memory and reset global
+ *		variables to their initial values.  Release all ID groups
+ *		associated with this interface.
+ *
+ * Return:	Success:	Positive if anything was done that might
+ *				have affected other interfaces; zero
+ *				otherwise.
+ *
+ *		Failure:        Never fails.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 19, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5F_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_FILE) > 0) {
+            (void)H5I_clear_type(H5I_FILE, FALSE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Make certain we've cleaned up all the shared file objects */
+            H5F_sfile_assert_num(0);
+
+            /* Destroy the file object id group */
+	    (void)H5I_dec_type_ref(H5I_FILE);
+            n++; /*H5I*/
+
+	    /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5F_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_create_plist
+ *
+ * Purpose:	Get an atom for a copy of the file-creation property list for
+ *		this file. This function returns an atom with a copy of the
+ *		properties used to create a file.
+ *
+ * Return:	Success:	template ID
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Fget_create_plist(hid_t file_id)
+{
+    H5F_t *file;                /* File info */
+    H5P_genplist_t *plist;      /* Property list */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", file_id);
+
+    /* check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(file->shared->fcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Create the property list object to return */
+    if((ret_value = H5P_copy_plist(plist, TRUE)) < 0)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file creation properties")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_access_plist
+ *
+ * Purpose:	Returns a copy of the file access property list of the
+ *		specified file.
+ *
+ *              NOTE: Make sure that, if you are going to overwrite
+ *              information in the copied property list that was
+ *              previously opened and assigned to the property list, then
+ *              you must close it before overwriting the values.
+ *
+ * Return:	Success:	Object ID for a copy of the file access
+ *				property list.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, February 18, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Fget_access_plist(hid_t file_id)
+{
+    H5F_t *f;           /* File info */
+    hid_t ret_value;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", file_id);
+
+    /* Check args */
+    if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Retrieve the file's access property list */
+    if((ret_value = H5F_get_access_plist(f, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file access property list")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_access_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_obj_count
+ *
+ * Purpose:	Public function returning the number of opened object IDs
+ *		(files, datasets, groups and datatypes) in the same file.
+ *
+ * Return:	Non-negative on success; negative on failure.
+ *
+ * Programmer:	Raymond Lu
+ *		Wednesday, Dec 5, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Fget_obj_count(hid_t file_id, unsigned types)
+{
+    H5F_t    *f = NULL;         /* File to query */
+    size_t  obj_count = 0;      /* Number of opened objects */
+    ssize_t  ret_value;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("Zs", "iIu", file_id, types);
+
+    /* Check arguments */
+    if(file_id != (hid_t)H5F_OBJ_ALL && (NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
+    if(0 == (types & H5F_OBJ_ALL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not an object type")
+
+    /* Perform the query */
+    if(H5F_get_obj_count(f, types, TRUE, &obj_count) < 0)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_count failed")
+
+    /* Set the return value */
+    ret_value = (ssize_t)obj_count;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_obj_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_object_ids
+ *
+ * Purpose:	Public function to return a list of opened object IDs.
+ *
+ * Return:	Non-negative on success; negative on failure.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, Dec 5, 2001
+ *
+ * Modification:
+ *              Raymond Lu
+ *              24 September 2008
+ *              Changed the return value to ssize_t and MAX_OBJTS to size_t to
+ *              accommadate potential large number of objects.
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list)
+{
+    H5F_t    *f = NULL;         /* File to query */
+    size_t    obj_id_count = 0; /* Number of open objects */
+    ssize_t   ret_value;        /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Zs", "iIuz*i", file_id, types, max_objs, oid_list);
+
+    /* Check arguments */
+    if(file_id != (hid_t)H5F_OBJ_ALL && (NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
+    if(0 == (types & H5F_OBJ_ALL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not an object type")
+    if(!oid_list)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "object ID list is NULL")
+
+    /* Perform the query */
+    if(H5F_get_obj_ids(f, types, max_objs, oid_list, TRUE, &obj_id_count) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_ids failed")
+
+    /* Set the return value */
+    ret_value = (ssize_t)obj_id_count;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_obj_ids() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_vfd_handle
+ *
+ * Purpose:     Returns a pointer to the file handle of the low-level file
+ *              driver.
+ *
+ * Return:      Success:        non-negative value.
+ *              Failure:        negative.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_vfd_handle(hid_t file_id, hid_t fapl, void **file_handle)
+{
+    H5F_t               *file;          /* File to query */
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii**x", file_id, fapl, file_handle);
+
+    /* Check args */
+    if(!file_handle)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file handle pointer")
+
+    /* Get the file */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
+
+    /* Retrieve the VFD handle for the file */
+    if(H5F_get_vfd_handle(file, fapl, file_handle) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve VFD handle")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_vfd_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fis_hdf5
+ *
+ * Purpose:	Check the file signature to detect an HDF5 file.
+ *
+ * Bugs:	This function is not robust: it only uses the default file
+ *		driver when attempting to open the file when in fact it
+ *		should use all known file drivers.
+ *
+ * Return:	Success:	TRUE/FALSE
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Unknown
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-08-02
+ *		Rewritten to use the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Fis_hdf5(const char *name)
+{
+    htri_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "*s", name);
+
+    /* Check args and all the boring stuff. */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "no file name specified")
+
+    /* call the private is_HDF5 function */
+    if((ret_value = H5F_is_hdf5(name)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable open file")
+
+done:
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fis_hdf5() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fcreate
+ *
+ * Purpose:	This is the primary function for creating HDF5 files . The
+ *		flags parameter determines whether an existing file will be
+ *		overwritten or not.  All newly created files are opened for
+ *		both reading and writing.  All flags may be combined with the
+ *		bit-wise OR operator (`|') to change the behavior of the file
+ *		create call.
+ *
+ *		The more complex behaviors of a file's creation and access
+ *		are controlled through the file-creation and file-access
+ *		property lists.  The value of H5P_DEFAULT for a template
+ *		value indicates that the library should use the default
+ *		values for the appropriate template.
+ *
+ * See also:	H5Fpublic.h for the list of supported flags. H5Ppublic.h for
+ * 		the list of file creation and file access properties.
+ *
+ * Return:	Success:	A file ID
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
+{
+    H5F_t	*new_file = NULL;	/*file struct for new file	*/
+    hid_t	ret_value;	        /*return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("i", "*sIuii", filename, flags, fcpl_id, fapl_id);
+
+    /* Check/fix arguments */
+    if(!filename || !*filename)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name")
+    /* In this routine, we only accept the following flags:
+     *          H5F_ACC_EXCL and H5F_ACC_TRUNC
+     */
+    if(flags & ~(H5F_ACC_EXCL | H5F_ACC_TRUNC))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
+    /* The H5F_ACC_EXCL and H5F_ACC_TRUNC flags are mutually exclusive */
+    if((flags & H5F_ACC_EXCL) && (flags & H5F_ACC_TRUNC))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mutually exclusive flags for file creation")
+
+    /* Check file creation property list */
+    if(H5P_DEFAULT == fcpl_id)
+        fcpl_id = H5P_FILE_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(fcpl_id, H5P_FILE_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file create property list")
+
+    /* Check the file access property list */
+    if(H5P_DEFAULT == fapl_id)
+        fapl_id = H5P_FILE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file access property list")
+
+    /*
+     * Adjust bit flags by turning on the creation bit and making sure that
+     * the EXCL or TRUNC bit is set.  All newly-created files are opened for
+     * reading and writing.
+     */
+    if (0==(flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC)))
+	flags |= H5F_ACC_EXCL;	 /*default*/
+    flags |= H5F_ACC_RDWR | H5F_ACC_CREAT;
+
+    /*
+     * Create a new file or truncate an existing file.
+     */
+    if(NULL == (new_file = H5F_open(filename, flags, fcpl_id, fapl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to create file")
+
+    /* Get an atom for the file */
+    if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
+
+    /* Keep this ID in file object structure */
+    new_file->file_id = ret_value;
+
+done:
+    if(ret_value < 0 && new_file)
+        if(H5F_close(new_file) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fcreate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fopen
+ *
+ * Purpose:	This is the primary function for accessing existing HDF5
+ *		files.  The FLAGS argument determines whether writing to an
+ *		existing file will be allowed or not.  All flags may be
+ *		combined with the bit-wise OR operator (`|') to change the
+ *		behavior of the file open call.  The more complex behaviors
+ *		of a file's access are controlled through the file-access
+ *		property list.
+ *
+ * See Also:	H5Fpublic.h for a list of possible values for FLAGS.
+ *
+ * Return:	Success:	A file ID
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Unknown
+ *
+ * Modifications:
+ *	  	Robb Matzke, 1997-07-18
+ *		File struct creation and destruction is through H5F_new() and
+ *		H5F_dest(). Reading the root symbol table entry is done with
+ *		H5G_decode().
+ *
+ *  		Robb Matzke, 1997-09-23
+ *		Most of the work is now done by H5F_open() since H5Fcreate()
+ *		and H5Fopen() originally contained almost identical code.
+ *
+ *	 	Robb Matzke, 1998-02-18
+ *		Added better error checking for the flags and the file access
+ *		property list.  It used to be possible to make the library
+ *		dump core by passing an object ID that was not a file access
+ *		property list.
+ *
+ * 		Robb Matzke, 1999-08-02
+ *		The file access property list is passed to the H5F_open() as
+ *		object IDs.
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
+{
+    H5F_t	*new_file = NULL;	/*file struct for new file	*/
+    hid_t	ret_value;	        /*return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "*sIui", filename, flags, fapl_id);
+
+    /* Check/fix arguments. */
+    if(!filename || !*filename)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name")
+    /* Reject undefined flags (~H5F_ACC_PUBLIC_FLAGS) and the H5F_ACC_TRUNC & H5F_ACC_EXCL flags */
+    if((flags & ~H5F_ACC_PUBLIC_FLAGS) ||
+            (flags & H5F_ACC_TRUNC) || (flags & H5F_ACC_EXCL))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
+    if(H5P_DEFAULT == fapl_id)
+        fapl_id = H5P_FILE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file access property list")
+
+    /* Open the file */
+    if(NULL == (new_file = H5F_open(filename, flags, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open file")
+
+    /* Get an atom for the file */
+    if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+
+    /* Keep this ID in file object structure */
+    new_file->file_id = ret_value;
+
+done:
+    if(ret_value < 0 && new_file && H5F_try_close(new_file) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fopen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fflush
+ *
+ * Purpose:	Flushes all outstanding buffers of a file to disk but does
+ *		not remove them from the cache.  The OBJECT_ID can be a file,
+ *		dataset, group, attribute, or named data type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, August  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fflush(hid_t object_id, H5F_scope_t scope)
+{
+    H5F_t	*f = NULL;              /* File to flush */
+    H5O_loc_t	*oloc = NULL;           /* Object location for ID */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iFs", object_id, scope);
+
+    switch(H5I_get_type(object_id)) {
+        case H5I_FILE:
+            if(NULL == (f = (H5F_t *)H5I_object(object_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+            break;
+
+        case H5I_GROUP:
+            {
+                H5G_t	*grp;
+
+                if(NULL == (grp = (H5G_t *)H5I_object(object_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid group identifier")
+                oloc = H5G_oloc(grp);
+            }
+            break;
+
+        case H5I_DATATYPE:
+            {
+                H5T_t	*type;
+
+                if(NULL == (type = (H5T_t *)H5I_object(object_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid type identifier")
+                oloc = H5T_oloc(type);
+            }
+            break;
+
+        case H5I_DATASET:
+            {
+                H5D_t	*dset;
+
+                if(NULL == (dset = (H5D_t *)H5I_object(object_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
+                oloc = H5D_oloc(dset);
+            }
+            break;
+
+        case H5I_ATTR:
+            {
+                H5A_t	*attr;
+
+                if(NULL == (attr = (H5A_t *)H5I_object(object_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid attribute identifier")
+                oloc = H5A_oloc(attr);
+            }
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_DATASPACE:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
+    } /* end switch */
+
+    if(!f) {
+	if(!oloc)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
+	f = oloc->file;
+    } /* end if */
+    if(!f)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
+
+    /* Flush the file */
+    /*
+     * Nothing to do if the file is read only.	This determination is
+     * made at the shared open(2) flags level, implying that opening a
+     * file twice, once for read-only and once for read-write, and then
+     * calling H5Fflush() with the read-only handle, still causes data
+     * to be flushed.
+     */
+    if(H5F_ACC_RDWR & H5F_INTENT(f)) {
+        /* Flush other files, depending on scope */
+        if(H5F_SCOPE_GLOBAL == scope) {
+            /* Call the flush routine for mounted file hierarchies */
+            if(H5F_flush_mounts(f, H5AC_dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
+        } /* end if */
+        else {
+            /* Call the flush routine, for this file */
+            if(H5F_flush(f, H5AC_dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fflush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fclose
+ *
+ * Purpose:	This function closes the file specified by FILE_ID by
+ *		flushing all data to storage, and terminating access to the
+ *		file through FILE_ID.  If objects (e.g., datasets, groups,
+ *		etc.) are open in the file then the underlying storage is not
+ *		closed until those objects are closed; however, all data for
+ *		the file and the open objects is flushed.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Saturday, February 20, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fclose(hid_t file_id)
+{
+    H5F_t       *f = NULL;
+    int         nref;
+    herr_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* Check/fix arguments. */
+    if(H5I_FILE != H5I_get_type(file_id))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
+
+    /* Flush file if this is the last reference to this id and we have write
+     * intent, unless it will be flushed by the "shared" file being closed.
+     * This is only necessary to replicate previous behaviour, and could be
+     * disabled by an option/property to improve performance. */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+    if((f->shared->nrefs > 1) && (H5F_INTENT(f) & H5F_ACC_RDWR)) {
+        if((nref = H5I_get_ref(file_id, FALSE)) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID ref count")
+        if(nref == 1)
+            if(H5F_flush(f, H5AC_dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+    } /* end if */
+
+    /*
+     * Decrement reference count on atom.  When it reaches zero the file will
+     * be closed.
+     */
+    if(H5I_dec_app_ref(file_id) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEFILE, FAIL, "decrementing file ID failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Freopen
+ *
+ * Purpose:	Reopen a file.  The new file handle which is returned points
+ *		to the same file as the specified file handle.  Both handles
+ *		share caches and other information.  The only difference
+ *		between the handles is that the new handle is not mounted
+ *		anywhere and no files are mounted on it.
+ *
+ * Return:	Success:	New file ID
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, October 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Freopen(hid_t file_id)
+{
+    H5F_t	*old_file = NULL;
+    H5F_t	*new_file = NULL;
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", file_id);
+
+    /* Check arguments */
+    if(NULL == (old_file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Get a new "top level" file struct, sharing the same "low level" file struct */
+    if(NULL == (new_file = H5F_new(old_file->shared, 0, H5P_FILE_CREATE_DEFAULT, H5P_FILE_ACCESS_DEFAULT, NULL)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to reopen file")
+
+    /* Duplicate old file's names */
+    new_file->open_name = H5MM_xstrdup(old_file->open_name);
+    new_file->actual_name = H5MM_xstrdup(old_file->actual_name);
+    new_file->extpath = H5MM_xstrdup(old_file->extpath);
+
+    if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+
+    /* Keep this ID in file object structure */
+    new_file->file_id = ret_value;
+
+done:
+    if(ret_value < 0 && new_file)
+        if(H5F_dest(new_file, H5AC_dxpl_id, FALSE) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Freopen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_intent
+ *
+ * Purpose:	Public API to retrieve the file's 'intent' flags passed
+ *              during H5Fopen()
+ *
+ * Return:	Non-negative on success/negative on failure
+ *
+ * Programmer:	James Laird
+ *		August 23, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_intent(hid_t file_id, unsigned *intent_flags)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", file_id, intent_flags);
+
+    /* If no intent flags were passed in, exit quietly */
+    if(intent_flags) {
+        H5F_t * file;           /* Pointer to file structure */
+
+        /* Get the internal file structure */
+        if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+        /* HDF5 uses some flags internally that users don't know about.
+         * Simplify things for them so that they only get either H5F_ACC_RDWR
+         * or H5F_ACC_RDONLY.
+         */
+        if(H5F_INTENT(file) & H5F_ACC_RDWR)
+            *intent_flags = H5F_ACC_RDWR;
+        else
+            *intent_flags = H5F_ACC_RDONLY;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_intent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_freespace
+ *
+ * Purpose:     Retrieves the amount of free space in the file.
+ *
+ * Return:      Success:        Amount of free space for type
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Oct  6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hssize_t
+H5Fget_freespace(hid_t file_id)
+{
+    H5F_t      *file;           /* File object for file ID */
+    hsize_t	tot_space;	/* Amount of free space in the file */
+    hssize_t    ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Hs", "i", file_id);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Go get the actual amount of free space in the file */
+    if(H5MF_get_freespace(file, H5AC_ind_dxpl_id, &tot_space, NULL) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
+
+    ret_value = (hssize_t)tot_space;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_freespace() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_filesize
+ *
+ * Purpose:     Retrieves the file size of the HDF5 file. This function
+ *              is called after an existing file is opened in order
+ *		to learn the true size of the underlying file.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  David Pitt
+ *              david.pitt at bigpond.com
+ *              Apr 27, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_filesize(hid_t file_id, hsize_t *size)
+{
+    H5F_t       *file;                  /* File object for file ID */
+    haddr_t     eof;                    /* End of file address */
+    haddr_t     base_addr;              /* Base address for the file */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", file_id, size);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Go get the actual file size */
+    if(HADDR_UNDEF == (eof = H5FD_get_eof(file->shared->lf)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+    base_addr = H5FD_get_base_addr(file->shared->lf);
+
+    if(size)
+        *size = (hsize_t)(eof + base_addr);     /* Convert relative base address for file to absolute address */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_filesize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_file_image
+ *
+ * Purpose:     If a buffer is provided (via the buf_ptr argument) and is 
+ *		big enough (size in buf_len argument), load *buf_ptr with
+ *		an image of the open file whose ID is provided in the 
+ *		file_id parameter, and return the number of bytes copied
+ *		to the buffer.
+ *
+ *		If the buffer exists, but is too small to contain an image
+ *		of the indicated file, return a negative number.
+ *
+ *		Finally, if no buffer is provided, return the size of the 
+ *		buffer needed.  This value is simply the eoa of the target 
+ *		file.
+ *
+ *		Note that any user block is skipped.
+ *
+ *		Also note that the function may not be used on files 
+ *		opened with either the split/multi file driver or the
+ *		family file driver.
+ *
+ *		In the former case, the sparse address space makes the 
+ *		get file image operation impractical, due to the size of
+ *		the image typically required.
+ *
+ *		In the case of the family file driver, the problem is
+ *		the driver message in the super block, which will prevent
+ *		the image being opened with any driver other than the
+ *		family file driver -- which negates the purpose of the 
+ *		operation.  This can be fixed, but no resources for 
+ *		this now.
+ *
+ * Return:      Success:        Bytes copied / number of bytes needed.
+ *              Failure:        negative value
+ *
+ * Programmer:  John Mainzer
+ *              11/15/11
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    ssize_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "i*xz", file_id, buf_ptr, buf_len);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* call private get_file_image function */
+    if((ret_value = H5F_get_file_image(file, buf_ptr, buf_len)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file image")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_file_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_mdc_config
+ *
+ * Purpose:     Retrieves the current automatic cache resize configuration
+ *		from the metadata cache, and return it in *config_ptr.
+ *
+ *		Note that the version field of *config_Ptr must be correctly
+ *		filled in by the caller.  This allows us to adapt for
+ *		obsolete versions of the structure.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/24/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", file_id, config_ptr);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+    if((NULL == config_ptr) || (config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad config_ptr")
+
+    /* Go get the resize configuration */
+    if(H5AC_get_cache_auto_resize_config(file->shared->cache, config_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_auto_resize_config() failed.")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_mdc_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fset_mdc_config
+ *
+ * Purpose:     Sets the current metadata cache automatic resize
+ *		configuration, using the contents of the instance of
+ *		H5AC_cache_config_t pointed to by config_ptr.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/24/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fset_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", file_id, config_ptr);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* set the resize configuration  */
+    if(H5AC_set_cache_auto_resize_config(file->shared->cache, config_ptr) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC_set_cache_auto_resize_config() failed.")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fset_mdc_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_mdc_hit_rate
+ *
+ * Purpose:     Retrieves the current hit rate from the metadata cache.
+ *		This rate is the overall hit rate since the last time
+ *		the hit rate statistics were reset either manually or
+ *		automatically.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/24/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate_ptr)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*d", file_id, hit_rate_ptr);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    if(NULL == hit_rate_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL hit rate pointer")
+
+    /* Go get the current hit rate */
+    if(H5AC_get_cache_hit_rate(file->shared->cache, hit_rate_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_hit_rate() failed.")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_mdc_hit_rate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_mdc_size
+ *
+ * Purpose:     Retrieves the maximum size, minimum clean size, current
+ *		size, and current number of entries from the metadata
+ *		cache associated with the specified file.  If any of
+ *		the ptr parameters are NULL, the associated datum is
+ *		not returned.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/24/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
+    size_t *cur_size_ptr, int *cur_num_entries_ptr)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    int32_t    cur_num_entries;
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*z*z*z*Is", file_id, max_size_ptr, min_clean_size_ptr,
+             cur_size_ptr, cur_num_entries_ptr);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Go get the size data */
+    if(H5AC_get_cache_size(file->shared->cache, max_size_ptr,
+            min_clean_size_ptr, cur_size_ptr, &cur_num_entries) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.")
+
+    if(cur_num_entries_ptr != NULL)
+	*cur_num_entries_ptr = (int)cur_num_entries;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_mdc_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Freset_mdc_hit_rate_stats
+ *
+ * Purpose:     Reset the hit rate statistic whose current value can
+ *		be obtained via the H5Fget_mdc_hit_rate() call.  Note
+ *		that this statistic will also be reset once per epoch
+ *		by the automatic cache resize code if it is enabled.
+ *
+ *		It is probably a bad idea to call this function unless
+ *		you are controlling cache size from your program instead
+ *		of using our cache size control code.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/24/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Freset_mdc_hit_rate_stats(hid_t file_id)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Reset the hit rate statistic */
+    if(H5AC_reset_cache_hit_rate_stats(file->shared->cache) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't reset cache hit rate")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Freset_mdc_hit_rate_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_name
+ *
+ * Purpose:     Gets the name of the file to which object OBJ_ID belongs.
+ *              If `name' is non-NULL then write up to `size' bytes into that
+ *              buffer and always return the length of the entry name.
+ *              Otherwise `size' is ignored and the function does not store the name,
+ *              just returning the number of characters required to store the name.
+ *              If an error occurs then the buffer pointed to by `name' (NULL or non-NULL)
+ *              is unchanged and the function returns a negative value.
+ *
+ * Note:	This routine returns the name that was used to open the file,
+ *		not the actual name after resolving symlinks, etc.
+ *
+ * Return:      Success:        The length of the file name
+ *              Failure:        Negative
+ *
+ * Programmer:  Raymond Lu
+ *              June 29, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Fget_name(hid_t obj_id, char *name/*out*/, size_t size)
+{
+    H5F_t         *f;           /* Top file in mount hierarchy */
+    size_t        len;
+    ssize_t       ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "ixz", obj_id, name, size);
+
+    /* For file IDs, get the file object directly */
+    /* (This prevents the H5G_loc() call from returning the file pointer for
+     * the top file in a mount hierarchy)
+     */
+    if(H5I_get_type(obj_id) == H5I_FILE ) {
+        if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+    } /* end if */
+    else {
+        H5G_loc_t     loc;        /* Object location */
+
+        /* Get symbol table entry */
+        if(H5G_loc(obj_id, &loc) < 0)
+             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
+        f = loc.oloc->file;
+    } /* end else */
+
+    len = HDstrlen(H5F_OPEN_NAME(f));
+
+    if(name) {
+        HDstrncpy(name, H5F_OPEN_NAME(f), MIN(len + 1,size));
+        if(len >= size)
+            name[size-1]='\0';
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (ssize_t)len;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_info
+ *		1. Get storage size for superblock extension if there is one
+ *              2. Get the amount of btree and heap storage for entries
+ *                 in the SOHM table if there is one.
+ *		Consider success when there is no superblock extension and/or SOHM table
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *              July 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_info(hid_t obj_id, H5F_info_t *finfo)
+{
+    H5F_t *f;                           /* Top file in mount hierarchy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", obj_id, finfo);
+
+    /* Check args */
+    if(!finfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+
+    /* For file IDs, get the file object directly */
+    /* (This prevents the H5G_loc() call from returning the file pointer for
+     * the top file in a mount hierarchy)
+     */
+    if(H5I_get_type(obj_id) == H5I_FILE ) {
+        if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+    } /* end if */
+    else {
+        H5G_loc_t     loc;        /* Object location */
+
+        /* Get symbol table entry */
+        if(H5G_loc(obj_id, &loc) < 0)
+             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
+        f = loc.oloc->file;
+    } /* end else */
+    HDassert(f->shared);
+
+    /* Reset file info struct */
+    HDmemset(finfo, 0, sizeof(H5F_info_t));
+
+    /* Check for superblock extension info */
+    if(H5F_super_size(f, H5AC_ind_dxpl_id, NULL, &finfo->super_ext_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock extension size")
+
+    /* Check for SOHM info */
+    if(H5F_addr_defined(f->shared->sohm_addr))
+        if(H5SM_ih_size(f, H5AC_ind_dxpl_id, finfo) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM btree & heap storage info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fclear_elink_file_cache
+ *
+ * Purpose:     Releases the external file cache associated with the
+ *              provided file, potentially closing any cached files
+ *              unless they are held open from somewhere\ else.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Neil Fortner; December 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fclear_elink_file_cache(hid_t file_id)
+{
+    H5F_t         *file;        /* File */
+    herr_t        ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Release the EFC */
+    if(file->shared->efc)
+        if(H5F_efc_release(file->shared->efc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fclear_elink_file_cache() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5FD.c b/gatb-core/thirdparty/hdf5/src/H5FD.c
new file mode 100644
index 0000000..dbadafa
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FD.c
@@ -0,0 +1,2062 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, July 26, 1999
+ *
+ * Purpose:	The Virtual File Layer as described in documentation.
+ *              This is the greatest common denominator for all types of
+ *              storage access whether a file, memory, network, etc. This
+ *              layer usually just dispatches the request to an actual
+ *              file driver layer.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FD_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDpkg.h"		/* File Drivers				*/
+#include "H5FDcore.h"		/* Files stored entirely in memory	*/
+#include "H5FDfamily.h"		/* File families 			*/
+#include "H5FDlog.h"        	/* sec2 driver with I/O logging (for debugging) */
+#include "H5FDmpi.h"            /* MPI-based file drivers		*/
+#include "H5FDmulti.h"		/* Usage-partitioned file family	*/
+#include "H5FDsec2.h"		/* POSIX unbuffered file I/O		*/
+#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
+#ifdef H5_HAVE_WINDOWS
+#include "H5FDwindows.h"        /* Windows buffered I/O     */
+#endif
+#include "H5FDdirect.h"		/* Direct file I/O			*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size,
+    const void *old_pl, void **copied_pl);
+static herr_t H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *),
+    void *pl);
+static herr_t H5FD_free_cls(H5FD_class_t *cls);
+static herr_t H5FD_fapl_copy(hid_t driver_id, const void *fapl, void **copied_fapl);
+static int H5FD_query(const H5FD_t *f, unsigned long *flags/*out*/);
+static int H5FD_driver_query(const H5FD_class_t *driver, unsigned long *flags/*out*/);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/*
+ * Global count of the number of H5FD_t's handed out.  This is used as a
+ * "serial number" for files that are currently open and is used for the
+ * 'fileno' field in H5O_info_t.  However, if a VFL driver is not able
+ * to detect whether two files are the same, a file that has been opened
+ * by H5Fopen more than once with that VFL driver will have two different
+ * serial numbers.  :-/
+ *
+ * Also, if a file is opened, the 'fileno' field is retrieved for an
+ * object and the file is closed and re-opened, the 'fileno' value will
+ * be different.
+ */
+static unsigned long H5FD_file_serial_no_g;
+
+/* File driver ID class */
+static const H5I_class_t H5I_VFL_CLS[1] = {{
+    H5I_VFL,			/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5FD_free_cls	/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January  3, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_init_interface
+ *
+ * Purpose:	Initialize the virtual file layer.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_init_interface(void)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(H5I_register_type(H5I_VFL_CLS) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /* Reset the file serial numbers */
+    H5FD_file_serial_no_g = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_term_interface
+ *
+ * Purpose:	Terminate this interface: free all memory and reset global
+ *		variables to their initial values.  Release all ID groups
+ *		associated with this interface.
+ *
+ * Return:	Success:	Positive if anything was done that might
+ *				have affected other interfaces; zero
+ *				otherwise.
+ *
+ *		Failure:        Never fails.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, February 19, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FD_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_VFL) > 0) {
+	    (void)H5I_clear_type(H5I_VFL, FALSE, FALSE);
+
+            /* Reset the VFL drivers, if they've been closed */
+            if(H5I_nmembers(H5I_VFL)==0) {
+                H5FD_sec2_term();
+#ifdef H5_HAVE_DIRECT
+                H5FD_direct_term();
+#endif
+                H5FD_log_term();
+                H5FD_stdio_term();
+#ifdef H5_HAVE_WINDOWS
+                H5FD_windows_term();
+#endif
+                H5FD_family_term();
+                H5FD_core_term();
+                H5FD_multi_term();
+#ifdef H5_HAVE_PARALLEL
+                H5FD_mpio_term();
+#endif /* H5_HAVE_PARALLEL */
+            } /* end if */
+
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Destroy the VFL driver id group */
+	    (void)H5I_dec_type_ref(H5I_VFL);
+            n++; /*H5I*/
+
+	    /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5FD_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_free_cls
+ *
+ * Purpose:	Frees a file driver class struct and returns an indication of
+ *		success. This function is used as the free callback for the
+ *		virtual file layer object identifiers (cf H5FD_init_interface).
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_free_cls(H5FD_class_t *cls)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    H5MM_xfree(cls);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_free_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDregister
+ *
+ * Purpose:	Registers a new file driver as a member of the virtual file
+ *		driver class.  Certain fields of the class struct are
+ *		required and that is checked here so it doesn't have to be
+ *		checked every time the field is accessed.
+ *
+ * Return:	Success:	A file driver ID which is good until the
+ *				library is closed or the driver is
+ *				unregistered.
+ *
+ *		Failure:	A negative value.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 26, 1999
+ *
+ * Modifications:
+ *              Copied guts of function into H5FD_register
+ *              Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FDregister(const H5FD_class_t *cls)
+{
+    hid_t		ret_value;
+    H5FD_mem_t		type;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "*x", cls);
+
+    /* Check arguments */
+    if(!cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL, "null class pointer is disallowed")
+    if(!cls->open || !cls->close)
+	HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL, "`open' and/or `close' methods are not defined")
+    if(!cls->get_eoa || !cls->set_eoa)
+	HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL, "`get_eoa' and/or `set_eoa' methods are not defined")
+    if(!cls->get_eof)
+	HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL, "`get_eof' method is not defined")
+    if(!cls->read || !cls->write)
+	HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL, "`read' and/or `write' method is not defined")
+    for (type=H5FD_MEM_DEFAULT; type<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,type))
+	if(cls->fl_map[type]<H5FD_MEM_NOLIST || cls->fl_map[type]>=H5FD_MEM_NTYPES)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid free-list mapping")
+
+    /* Create the new class ID */
+    if((ret_value=H5FD_register(cls, sizeof(H5FD_class_t), TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register file driver ID")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_register
+ *
+ * Purpose:	Registers a new file driver as a member of the virtual file
+ *		driver class.  Certain fields of the class struct are
+ *		required and that is checked here so it doesn't have to be
+ *		checked every time the field is accessed.
+ *
+ * Return:	Success:	A file driver ID which is good until the
+ *				library is closed or the driver is
+ *				unregistered.
+ *
+ *		Failure:	A negative value.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 26, 1999
+ *
+ * Modifications:
+ *              Broke into public and internal routines & added 'size'
+ *              parameter to internal routine, which allows us to create
+ *              sub-classes of H5FD_class_t for internal support (see the
+ *              MPI drivers, etc.)
+ *              Quincey Koziol
+ *              January 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_register(const void *_cls, size_t size, hbool_t app_ref)
+{
+    const H5FD_class_t	*cls = (const H5FD_class_t *)_cls;
+    H5FD_class_t	*saved = NULL;
+    H5FD_mem_t		type;
+    hid_t		ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    HDassert(cls);
+    HDassert(cls->open && cls->close);
+    HDassert(cls->get_eoa && cls->set_eoa);
+    HDassert(cls->get_eof);
+    HDassert(cls->read && cls->write);
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+        HDassert(cls->fl_map[type] >= H5FD_MEM_NOLIST && cls->fl_map[type] < H5FD_MEM_NTYPES);
+
+    /* Copy the class structure so the caller can reuse or free it */
+    if(NULL == (saved = (H5FD_class_t *)H5MM_malloc(size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for file driver class struct")
+    HDmemcpy(saved, cls, size);
+
+    /* Create the new class ID */
+    if((ret_value = H5I_register(H5I_VFL, saved, app_ref)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register file driver ID")
+
+done:
+    if(ret_value < 0)
+        if(saved)
+            H5MM_xfree(saved);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_register() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDunregister
+ *
+ * Purpose:	Removes a driver ID from the library. This in no way affects
+ *		file access property lists which have been defined to use
+ *		this driver or files which are already opened under this
+ *		driver.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 26, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDunregister(hid_t driver_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", driver_id);
+
+    /* Check arguments */
+    if(NULL == H5I_object_verify(driver_id, H5I_VFL))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver")
+
+    /* The H5FD_class_t struct will be freed by this function */
+    if(H5I_dec_app_ref(driver_id) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "unable to unregister file driver")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDunregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_class
+ *
+ * Purpose:	Obtains a pointer to the driver struct containing all the
+ *		callback pointers, etc. The PLIST_ID argument can be a file
+ *		access property list, a data transfer property list, or a
+ *		file driver identifier.
+ *
+ * Return:	Success:	Ptr to the driver information. The pointer is
+ *				only valid as long as the driver remains
+ *				registered or some file or property list
+ *				exists which references the driver.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, August 20, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FD_class_t *
+H5FD_get_class(hid_t id)
+{
+    H5FD_class_t	*ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(H5I_VFL == H5I_get_type(id))
+	ret_value = (H5FD_class_t *)H5I_object(id);
+    else {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        hid_t driver_id = -1;
+
+        /* Get the plist structure */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(id)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "can't find object for ID")
+
+        if(TRUE == H5P_isa_class(id, H5P_FILE_ACCESS)) {
+            if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID")
+            ret_value = H5FD_get_class(driver_id);
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a driver id or file access property list")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_sb_size
+ *
+ * Purpose:	Obtains the number of bytes required to store the driver file
+ *		access data in the HDF5 superblock.
+ *
+ * Return:	Success:	Number of bytes required.
+ *
+ *		Failure:	0 if an error occurs or if the driver has no
+ *				data to store in the superblock.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5FD_sb_size(H5FD_t *file)
+{
+    hsize_t	ret_value=0;
+
+    FUNC_ENTER_NOAPI(0)
+
+    HDassert(file && file->cls);
+
+    if(file->cls->sb_size)
+	ret_value = (file->cls->sb_size)(file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_sb_encode
+ *
+ * Purpose:	Encode driver-specific data into the output arguments. The
+ *		NAME is a nine-byte buffer which should get an
+ *		eight-character driver name and/or version followed by a null
+ *		terminator. The BUF argument is a buffer to receive the
+ *		encoded driver-specific data. The size of the BUF array is
+ *		the size returned by the H5FD_sb_size() call.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+    if(file->cls->sb_encode &&
+            (file->cls->sb_encode)(file, name/*out*/, buf/*out*/) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_encode request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_sb_decode
+ *
+ * Purpose:	Decodes the driver information block.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+    if(file->cls->sb_decode && (file->cls->sb_decode)(file, name, buf) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_decode request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sb_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_pl_copy
+ *
+ * Purpose:	Copies the driver-specific part of the a property list.
+ *              This is common code, used by both the dataset transfer and
+ *              file access property list routines.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October 23, 2003
+ *
+ * Modifications:
+ *  Pedro Vicente Nunes, Wednesday, July 26, 2006
+ *  added a HGOTO_ERROR call in the case the copy function returns NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size, const void *old_pl, void **copied_pl)
+{
+    void *new_pl = NULL;        /* Copy of property list */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Copy old pl, if one exists */
+    if(old_pl) {
+        /* Allow the driver to copy or do it ourselves */
+        if(copy_func) {
+            new_pl = (copy_func)(old_pl);
+            if(new_pl==NULL)
+                HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "property list copy failed")
+        } else if(pl_size>0) {
+            if((new_pl = H5MM_malloc(pl_size))==NULL)
+                HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "property list allocation failed")
+            HDmemcpy(new_pl, old_pl, pl_size);
+        } else
+            HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "no way to copy driver property list")
+    } /* end if */
+
+    /* Set copied value */
+    *copied_pl=new_pl;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_pl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_pl_close
+ *
+ * Purpose:	Closes a driver for a property list
+ *              This is common code, used by both the dataset transfer and
+ *              file access property list routines.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October 23, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *), void *pl)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allow driver to free or do it ourselves */
+    if(pl && free_func) {
+	if((free_func)(pl) < 0)
+	    HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver free request failed")
+    } /* end if */
+    else
+	H5MM_xfree(pl);
+
+    /* Decrement reference count for driver */
+    if(H5I_dec_ref(driver_id) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "can't decrement reference count for driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_pl_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_fapl_get
+ *
+ * Purpose:	Gets the file access property list associated with a file.
+ *		Usually the file will copy what it needs from the original
+ *		file access property list when the file is created. The
+ *		purpose of this function is to create a new file access
+ *		property list based on the settings in the file, which may
+ *		have been modified from the original file access property
+ *		list.
+ *
+ * Return:	Success:	Pointer to a new file access property list
+ *				with all members copied.  If the file is
+ *				closed then this property list lives on, and
+ *				vice versa.
+ *
+ *		Failure:	NULL, including when the file has no
+ *				properties.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FD_fapl_get(H5FD_t *file)
+{
+    void	*ret_value=NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(file);
+
+    if(file->cls->fapl_get)
+	ret_value = (file->cls->fapl_get)(file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_fapl_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_fapl_open
+ *
+ * Purpose:	Mark a driver as used by a file access property list
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October 23, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_fapl_open(H5P_genplist_t *plist, hid_t driver_id, const void *driver_info)
+{
+    void *copied_driver_info = NULL;           /* Temporary VFL driver info */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Increment the reference count on driver and copy driver info */
+    if(H5I_inc_ref(driver_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
+    if(H5FD_fapl_copy(driver_id, driver_info, &copied_driver_info) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "can't copy VFL driver info")
+
+    /* Set the driver properties for the list */
+    if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set driver ID")
+    if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &copied_driver_info) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set driver info")
+    copied_driver_info = NULL;
+
+done:
+    if(ret_value < 0)
+        if(copied_driver_info && H5FD_fapl_close(driver_id, copied_driver_info) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close copy of driver info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_fapl_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_fapl_copy
+ *
+ * Purpose:	Copies the driver-specific part of the file access property
+ *		list.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  3, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_fapl_copy(hid_t driver_id, const void *old_fapl, void **copied_fapl)
+{
+    H5FD_class_t *driver;
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
+
+    /* Copy the file access property list */
+    if(H5FD_pl_copy(driver->fapl_copy, driver->fapl_size, old_fapl, copied_fapl) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "can't copy driver file access property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_fapl_close
+ *
+ * Purpose:	Closes a driver for a dataset transfer property list
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  3, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_fapl_close(hid_t driver_id, void *fapl)
+{
+    H5FD_class_t	*driver = NULL;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    if(driver_id > 0) {
+        if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
+
+        /* Close the driver for the property list */
+        if(H5FD_pl_close(driver_id, driver->fapl_free, fapl) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver fapl_free request failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_fapl_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDopen
+ *
+ * Purpose:	Opens a file named NAME for the type(s) of access described
+ *		by the bit vector FLAGS according to a file access property
+ *		list FAPL_ID (which may be the constant H5P_DEFAULT). The
+ *		file should expect to handle format addresses in the range [0,
+ *		MAXADDR] (if MAXADDR is the undefined address then the caller
+ *		doesn't care about the address range).
+ *
+ * 		Possible values for the FLAGS bits are:
+ *
+ *		H5F_ACC_RDWR:	Open the file for read and write access. If
+ *				this bit is not set then open the file for
+ *				read only access. It is permissible to open a
+ *				file for read and write access when only read
+ *				access is requested by the library (the
+ *				library will never attempt to write to a file
+ *				which it opened with only read access).
+ *
+ *		H5F_ACC_CREATE:	Create the file if it doesn't already exist.
+ *				However, see H5F_ACC_EXCL below.
+ *
+ *		H5F_ACC_TRUNC:	Truncate the file if it already exists. This
+ *				is equivalent to deleting the file and then
+ *				creating a new empty file.
+ *
+ *		H5F_ACC_EXCL:	When used with H5F_ACC_CREATE, if the file
+ *				already exists then the open should fail.
+ *				Note that this is unsupported/broken with
+ *				some file drivers (e.g., sec2 across nfs) and
+ *				will contain a race condition when used to
+ *				perform file locking.
+ *
+ *		The MAXADDR is the maximum address which will be requested by
+ *		the library during an allocation operation. Usually this is
+ *		the same value as the MAXADDR field of the class structure,
+ *		but it can be smaller if the driver is being used under some
+ *		other driver.
+ *
+ *		Note that when the driver `open' callback gets control that
+ *		the public part of the file struct (the H5FD_t part) will be
+ *		incomplete and will be filled in after that callback returns.
+ *
+ * Return:	Success:	Pointer to a new file driver struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, July 27, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FD_t *
+H5FDopen(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    H5FD_t	*ret_value=NULL;
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE4("*x", "*sIuia", name, flags, fapl_id, maxaddr);
+
+    /* Check arguments */
+    if(H5P_DEFAULT == fapl_id)
+        fapl_id = H5P_FILE_ACCESS_DEFAULT;
+    else
+        if(TRUE!=H5P_isa_class(fapl_id,H5P_FILE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+
+    if(NULL==(ret_value=H5FD_open(name, flags, fapl_id, maxaddr)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "unable to open file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_open
+ *
+ * Purpose:	Private version of H5FDopen()
+ *
+ * Return:	Success:	Pointer to a new file driver struct
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FD_t *
+H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    H5FD_class_t	*driver;                /* VFD for file */
+    H5FD_t		*file = NULL;           /* VFD file struct */
+    hid_t               driver_id = -1;         /* VFD ID */
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    unsigned long       driver_flags = 0;       /* File-inspecific driver feature flags */
+    H5FD_file_image_info_t file_image_info;     /* Initial file image */
+    H5FD_t		*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    if(0 == maxaddr)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "zero format address range")
+
+    /* Get file access property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+
+    /* Get the VFD to open the file with */
+    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID")
+
+    /* Get driver info */
+    if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
+	HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, NULL, "invalid driver ID in file access property list")
+    if(NULL == driver->open)
+	HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, "file driver has no `open' method")
+
+    /* Query driver flag */
+    H5FD_driver_query(driver, &driver_flags);
+
+    /* Get initial file image info */
+    if(H5P_get(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file image info")
+
+    /* If an image is provided, make sure the driver supports this feature */
+    HDassert(((file_image_info.buffer != NULL) && (file_image_info.size > 0)) ||
+             ((file_image_info.buffer == NULL) && (file_image_info.size == 0)));
+    if((file_image_info.buffer != NULL) && !(driver_flags & H5FD_FEAT_ALLOW_FILE_IMAGE))
+        HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, "file image set, but not supported.")
+
+    /* Dispatch to file driver */
+    if(HADDR_UNDEF == maxaddr)
+        maxaddr = driver->maxaddr;
+    if(NULL == (file = (driver->open)(name, flags, fapl_id, maxaddr)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "open failed")
+
+    /*
+     * Fill in public fields. We must increment the reference count on the
+     * driver ID to prevent it from being freed while this file is open.
+     */
+    file->driver_id = driver_id;
+    if(H5I_inc_ref(file->driver_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
+    file->cls = driver;
+    file->maxaddr = maxaddr;
+    if(H5P_get(plist, H5F_ACS_ALIGN_THRHD_NAME, &(file->threshold)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment threshold")
+    if(H5P_get(plist, H5F_ACS_ALIGN_NAME, &(file->alignment)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment")
+
+    /* Retrieve the VFL driver feature flags */
+    if(H5FD_query(file, &(file->feature_flags)) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "unable to query file driver")
+
+    /* Increment the global serial number & assign it to this H5FD_t object */
+    if(++H5FD_file_serial_no_g == 0) {
+        /* (Just error out if we wrap around for now...) */
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "unable to get file serial number")
+    } /* end if */
+    file->fileno = H5FD_file_serial_no_g;
+
+    /* Start with base address set to 0 */
+    /* (This will be changed later, when the superblock is located) */
+    file->base_addr = 0;
+
+    /* Set return value */
+    ret_value = file;
+
+done:
+    /* Can't cleanup 'file' information, since we don't know what type it is */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDclose
+ *
+ * Purpose:     Closes the file by calling the driver `close' callback, which
+ *		should free all driver-private data and free the file struct.
+ *		Note that the public part of the file struct (the H5FD_t part)
+ *		will be all zero during the driver close callback like during
+ *		the `open' callback.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, July 27, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDclose(H5FD_t *file)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*x", file);
+
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+
+    if(H5FD_close(file) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_close
+ *
+ * Purpose:	Private version of H5FDclose()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_close(H5FD_t *file)
+{
+    const H5FD_class_t *driver;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(file && file->cls);
+
+    /* Prepare to close file by clearing all public fields */
+    driver = file->cls;
+    if(H5I_dec_ref(file->driver_id) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "can't close driver ID")
+
+    /*
+     * Dispatch to the driver for actual close. If the driver fails to
+     * close the file then the file will be in an unusable state.
+     */
+    HDassert(driver->close);
+    if((driver->close)(file) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "close failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDcmp
+ *
+ * Purpose:	Compare the keys of two files using the file driver callback
+ *		if the files belong to the same driver, otherwise sort the
+ *		files by driver class pointer value.
+ *
+ * Return:	Success:	A value like strcmp()
+ *
+ *		Failure:	Must never fail. If both file handles are
+ *				invalid then they compare equal. If one file
+ *				handle is invalid then it compares less than
+ *				the other.  If both files belong to the same
+ *				driver and the driver doesn't provide a
+ *				comparison callback then the file pointers
+ *				themselves are compared.
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, July 27, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FDcmp(const H5FD_t *f1, const H5FD_t *f2)
+{
+    int	ret_value;
+
+    FUNC_ENTER_API(-1) /*return value is arbitrary*/
+    H5TRACE2("Is", "*x*x", f1, f2);
+
+    ret_value = H5FD_cmp(f1, f2);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_cmp
+ *
+ * Purpose:	Private version of H5FDcmp()
+ *
+ * Return:	Success:	A value like strcmp()
+ *
+ *		Failure:	Must never fail.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2)
+{
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(-1) /*return value is arbitrary*/
+
+    if((!f1 || !f1->cls) && (!f2 || !f2->cls))
+        HGOTO_DONE(0)
+    if(!f1 || !f1->cls)
+        HGOTO_DONE(-1)
+    if(!f2 || !f2->cls)
+        HGOTO_DONE(1)
+    if(f1->cls < f2->cls)
+        HGOTO_DONE(-1)
+    if(f1->cls > f2->cls)
+        HGOTO_DONE(1)
+
+    /* Files are same driver; no cmp callback */
+    if(!f1->cls->cmp) {
+	if(f1<f2)
+            HGOTO_DONE(-1)
+	if(f1>f2)
+            HGOTO_DONE(1)
+	HGOTO_DONE(0)
+    }
+
+    ret_value = (f1->cls->cmp)(f1, f2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDquery
+ *
+ * Purpose:	Query a VFL driver for its feature flags. (listed in H5FDpublic.h)
+ *
+ * Return:	Success:    non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FDquery(const H5FD_t *f, unsigned long *flags/*out*/)
+{
+    int	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("Is", "*xx", f, flags);
+
+    HDassert(f);
+    HDassert(flags);
+
+    ret_value = H5FD_query(f, flags);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_query
+ *
+ * Purpose:	Private version of H5FDquery()
+ *
+ * Return:	Success:    non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_query(const H5FD_t *f, unsigned long *flags/*out*/)
+{
+    int	ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(flags);
+
+    /* Check for query driver and call it */
+    if(f->cls->query)
+        ret_value = (f->cls->query)(f, flags);
+    else
+        *flags=0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_query() */
+
+

+/*-------------------------------------------------------------------------
+* Function:    H5FD_driver_query
+*
+* Purpose: Similar to H5FD_query(), but intended for cases when we don't
+*          have a file available (e.g. before one is opened). Since we
+*          can't use the file to get the driver, the driver is passed in
+*          as a parameter.
+*
+* Return:  Success:    non-negative
+*          Failure:    negative
+*
+* Programmer:  Jacob Gruber
+*              Wednesday, August 17, 2011
+*
+*-------------------------------------------------------------------------
+*/
+static int
+H5FD_driver_query(const H5FD_class_t *driver, unsigned long *flags/*out*/)
+{
+    int ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(driver);
+    HDassert(flags);
+
+    /* Check for the driver to query and then query it */
+    if(driver->query)
+        ret_value = (driver->query)(NULL, flags);
+    else 
+        *flags = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_driver_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDalloc
+ *
+ * Purpose:	Allocates SIZE bytes of memory from the FILE. The memory will
+ *		be used according to the allocation class TYPE. First we try
+ *		to satisfy the request from one of the free lists, according
+ *		to the free list map provided by the driver. The free list
+ *		array has one entry for each request type and the value of
+ *		that array element can be one of four possibilities:
+ *
+ *		      It can be the constant H5FD_MEM_DEFAULT (or zero) which
+ *		      indicates that the identity mapping is used. In other
+ *		      words, the request type maps to its own free list.
+ *
+ *		      It can be the request type itself, which has the same
+ *		      effect as the H5FD_MEM_DEFAULT value above.
+ *
+ *		      It can be the ID for another request type, which
+ *		      indicates that the free list for the specified type
+ *		      should be used instead.
+ *
+ *		      It can be the constant H5FD_MEM_NOLIST which means that
+ *		      no free list should be used for this type of request.
+ *
+ *		If the request cannot be satisfied from a free list then
+ *		either the driver's `alloc' callback is invoked (if one was
+ *		supplied) or the end-of-address marker is extended. The
+ *		`alloc' callback is always called with the same arguments as
+ * 		the H5FDalloc().
+ *
+ * Return:	Success:	The format address of the new file memory.
+ *
+ *		Failure:	The undefined address HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, July 27, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FDalloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+{
+    haddr_t	ret_value = HADDR_UNDEF;
+
+    FUNC_ENTER_API(HADDR_UNDEF)
+    H5TRACE4("a", "*xMtih", file, type, dxpl_id, size);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file pointer")
+    if(type < H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid request type")
+    if(size == 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "zero-size request")
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, HADDR_UNDEF, "not a data transfer property list")
+
+    /* Do the real work */
+    if(HADDR_UNDEF == (ret_value = H5FD_alloc_real(file, dxpl_id, type, size, NULL, NULL)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "unable to allocate file memory")
+
+    /* (Note compensating for base address subtraction in internal routine) */
+    ret_value += file->base_addr;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDalloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDfree
+ *
+ * Purpose:	Frees format addresses starting with ADDR and continuing for
+ *		SIZE bytes in the file FILE. The type of space being freed is
+ *		specified by TYPE, which is mapped to a free list as
+ *		described for the H5FDalloc() function above.  If the request
+ *		doesn't map to a free list then either the application `free'
+ *		callback is invoked (if defined) or the memory is leaked.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, July 28, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*xMtiah", file, type, dxpl_id, addr, size);
+
+    /* Check args */
+    if(!file || !file->cls)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+    if(type < H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid request type")
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+
+    /* Do the real work */
+    /* (Note compensating for base address addition in internal routine) */
+    if(H5FD_free_real(file, dxpl_id, type, addr - file->base_addr, size) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "file deallocation request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDfree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDget_eoa
+ *
+ * Purpose:	Returns the address of the first byte after the last
+ *		allocated memory in the file.
+ *
+ * Return:	Success:	First byte after allocated memory.
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, July 30, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FDget_eoa(H5FD_t *file, H5FD_mem_t type)
+{
+    haddr_t	ret_value;
+
+    FUNC_ENTER_API(HADDR_UNDEF)
+    H5TRACE2("a", "*xMt", file, type);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file pointer")
+    if(type < H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file type")
+
+    /* The real work */
+    if(HADDR_UNDEF == (ret_value = H5FD_get_eoa(file, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "file get eoa request failed")
+
+    /* (Note compensating for base address subtraction in internal routine) */
+    ret_value += file->base_addr;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDget_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDset_eoa
+ *
+ * Purpose:	Set the end-of-address marker for the file. The ADDR is the
+ *		address of the first byte past the last allocated byte of the
+ *		file. This function is called from two places:
+ *
+ *		    It is called after an existing file is opened in order to
+ *		    "allocate" enough space to read the superblock and then
+ *		    to "allocate" the entire hdf5 file based on the contents
+ *		    of the superblock.
+ *
+ *		    It is called during file memory allocation if the
+ *		    allocation request cannot be satisfied from the free list
+ *		    and the driver didn't supply an allocation callback.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative, no side effect
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, July 30, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "*xMta", file, type, addr);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+    if(type < H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file type")
+    if(!H5F_addr_defined(addr) || addr > file->maxaddr)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid end-of-address value")
+
+    /* The real work */
+    /* (Note compensating for base address addition in internal routine) */
+    if(H5FD_set_eoa(file, type, addr - file->base_addr) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file set eoa request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDset_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDget_eof
+ *
+ * Purpose:	Returns the end-of-file address, which is the greater of the
+ *		end-of-format address and the actual EOF marker. This
+ *		function is called after an existing file is opened in order
+ *		for the library to learn the true size of the underlying file
+ *		and to determine whether the hdf5 data has been truncated.
+ *
+ *		It is also used when a file is first opened to learn whether
+ *		the file is empty or not.
+ *
+ * 		It is permissible for the driver to return the maximum address
+ *		for the file size if the file is not empty.
+ *
+ * Return:	Success:	The EOF address.
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FDget_eof(H5FD_t *file)
+{
+    haddr_t	ret_value;
+
+    FUNC_ENTER_API(HADDR_UNDEF)
+    H5TRACE1("a", "*x", file);
+
+    /* Check arguments */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file pointer")
+
+    /* The real work */
+    if(HADDR_UNDEF == (ret_value = H5FD_get_eof(file)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "file get eof request failed")
+
+    /* (Note compensating for base address subtraction in internal routine) */
+    ret_value += file->base_addr;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDget_eof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_maxaddr
+ *
+ * Purpose:	Private version of H5FDget_eof()
+ *
+ * Return:	Success:	The maximum address allowed in the file.
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January  3, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_get_maxaddr(const H5FD_t *file)
+{
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    HDassert(file);
+
+    /* Set return value */
+    ret_value = file->maxaddr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_maxaddr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_feature_flags
+ *
+ * Purpose:	Retrieve the feature flags for the VFD
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_feature_flags(const H5FD_t *file, unsigned long *feature_flags)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(feature_flags);
+
+    /* Set feature flags to return */
+    *feature_flags = file->feature_flags;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_get_feature_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_fs_type_map
+ *
+ * Purpose:	Retrieve the free space type mapping for the VFD
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 17, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_fs_type_map(const H5FD_t *file, H5FD_mem_t *type_map)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(file && file->cls);
+    HDassert(type_map);
+
+    /* Check for VFD class providing a type map retrieval rouine */
+    if(file->cls->get_type_map) {
+        /* Retrieve type mapping for this file */
+        if((file->cls->get_type_map)(file, type_map) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get type map failed")
+    } /* end if */
+    else
+        /* Copy class's default free space type mapping */
+        HDmemcpy(type_map, file->cls->fl_map, sizeof(file->cls->fl_map));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_fs_type_map() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDread
+ *
+ * Purpose:	Reads SIZE bytes from FILE beginning at address ADDR
+ *		according to the data transfer property list DXPL_ID (which may
+ *		be the constant H5P_DEFAULT). The result is written into the
+ *		buffer BUF.
+ *
+ * Return:	Success:	Non-negative. The read result is written into
+ *				the BUF buffer which should be allocated by
+ *				the caller.
+ *
+ *		Failure:	Negative. The contents of BUF is undefined.
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
+	 void *buf/*out*/)
+{
+    H5P_genplist_t *dxpl;               /* DXPL object */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "*xMtiazx", file, type, dxpl_id, addr, size, buf);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+    if(!buf)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null result buffer")
+
+    /* Get the DXPL plist object for DXPL ID */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Do the real work */
+    /* (Note compensating for base address addition in internal routine) */
+    if(H5FD_read(file, dxpl, type, addr - file->base_addr, size, buf) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "file read request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDread() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDwrite
+ *
+ * Purpose:	Writes SIZE bytes to FILE beginning at address ADDR according
+ *		to the data transfer property list DXPL_ID (which may be the
+ *		constant H5P_DEFAULT). The bytes to be written come from the
+ *		buffer BUF.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
+	  const void *buf)
+{
+    H5P_genplist_t *dxpl;               /* DXPL object */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "*xMtiaz*x", file, type, dxpl_id, addr, size, buf);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+    if(!buf)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null buffer")
+
+    /* Get the DXPL plist object for DXPL ID */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* The real work */
+    /* (Note compensating for base address addition in internal routine) */
+    if(H5FD_write(file, dxpl, type, addr - file->base_addr, size, buf) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "file write request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDwrite() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDflush
+ *
+ * Purpose:	Notify driver to flush all cached data.  If the driver has no
+ *		flush method then nothing happens.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ * Modifications:
+ *              Quincey Koziol, May 20, 2002
+ *              Added 'closing' parameter
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDflush(H5FD_t *file, hid_t dxpl_id, unsigned closing)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "*xiIu", file, dxpl_id, closing);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+
+    /* Do the real work */
+    if(H5FD_flush(file, dxpl_id, closing) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTFLUSH, FAIL, "file flush request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_flush
+ *
+ * Purpose:	Private version of H5FDflush()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_flush(H5FD_t *file, hid_t dxpl_id, unsigned closing)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+
+    if(file->cls->flush && (file->cls->flush)(file, dxpl_id, closing) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver flush request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDtruncate
+ *
+ * Purpose:	Notify driver to truncate the file back to the allocated size.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 31, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDtruncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "*xib", file, dxpl_id, closing);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+
+    /* Do the real work */
+    if(H5FD_truncate(file, dxpl_id, closing) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTUPDATE, FAIL, "file flush request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_truncate
+ *
+ * Purpose:	Private version of H5FDtruncate()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 31, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_truncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+
+    if(file->cls->truncate && (file->cls->truncate)(file, dxpl_id, closing) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTUPDATE, FAIL, "driver truncate request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_truncate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_fileno
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'fileno' value
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5FD_t data structure)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		March 27, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_fileno(const H5FD_t *file, unsigned long *filenum)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(filenum);
+
+    /* Retrieve the file's serial number */
+    *filenum = file->fileno;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_get_fileno() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5FDget_vfd_handle
+ *
+ * Purpose:     Returns a pointer to the file handle of low-level virtual
+ *              file driver.
+ *
+ * Return:      Non-negative if succeed; negative otherwise.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep. 16, 2002
+ *
+ * Modifications:
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5FDget_vfd_handle(H5FD_t *file, hid_t fapl, void **file_handle)
+{
+    herr_t              ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "*xi**x", file, fapl, file_handle);
+
+    /* Check arguments */
+    HDassert(file);
+    HDassert(file_handle);
+
+    ret_value = H5FD_get_vfd_handle(file, fapl, file_handle);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDget_vfd_handle() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5FD_get_vfd_handle
+ *
+ * Purpose:     Retrieve the file handle for file driver.
+ *
+ * Return:      Non-negative if succeed; negative if fails.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep. 16, 2002
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_vfd_handle(H5FD_t *file, hid_t fapl, void **file_handle)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(file);
+    HDassert(file_handle);
+
+    if(NULL == file->cls->get_handle)
+	HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "file driver has no `get_vfd_handle' method")
+    if((file->cls->get_handle)(file, fapl, file_handle) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get file handle for file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_vfd_handle() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5FD_set_base_addr
+ *
+ * Purpose:     Set the base address for the file
+ *
+ * Return:      Non-negative if succeed; negative if fails.
+ *
+ * Programmer:  Quincey Koziol
+ *              Jan. 17, 2008
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5FD_set_base_addr(H5FD_t *file, haddr_t base_addr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5F_addr_defined(base_addr));
+
+    /* Set the file's base address */
+    file->base_addr = base_addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_set_base_addr() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5FD_get_base_addr
+ *
+ * Purpose:     Get the base address for the file
+ *
+ * Return:	Success:	The absolute base address of the file
+ *		Failure:	The undefined address (HADDR_UNDEF)
+ *
+ * Programmer:  Quincey Koziol
+ *              Sept. 10, 2009
+ *
+ *--------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_get_base_addr(const H5FD_t *file)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+
+    /* Return the file's base address */
+    FUNC_LEAVE_NOAPI(file->base_addr)
+} /* end H5FD_get_base_addr() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDcore.c b/gatb-core/thirdparty/hdf5/src/H5FDcore.c
new file mode 100644
index 0000000..bc288e4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDcore.c
@@ -0,0 +1,1519 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Tuesday, August 10, 1999
+ *
+ * Purpose:     A driver which stores the HDF5 data in main memory  using
+ *              only the HDF5 public API. This driver is useful for fast
+ *              access to small, temporary hdf5 files.
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC  H5FD_core_init_interface
+
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5Fprivate.h"     /* File access                  */
+#include "H5FDprivate.h"    /* File drivers                 */
+#include "H5FDcore.h"       /* Core file driver             */
+#include "H5FLprivate.h"    /* Free lists                   */
+#include "H5Iprivate.h"     /* IDs                          */
+#include "H5MMprivate.h"    /* Memory management            */
+#include "H5Pprivate.h"     /* Property lists               */
+#include "H5SLprivate.h"    /* Skip lists                   */
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_CORE_g = 0;
+
+/* The skip list node type.  Represents a region in the file. */
+typedef struct H5FD_core_region_t {
+    haddr_t start;              /* Start address of the region          */
+    haddr_t end;                /* End address of the region            */
+} H5FD_core_region_t;
+
+/* The description of a file belonging to this driver. The 'eoa' and 'eof'
+ * determine the amount of hdf5 address space in use and the high-water mark
+ * of the file (the current size of the underlying memory).
+ */
+typedef struct H5FD_core_t {
+    H5FD_t  pub;                /* public stuff, must be first          */
+    char    *name;              /* for equivalence testing              */
+    unsigned char *mem;         /* the underlying memory                */
+    haddr_t eoa;                /* end of allocated region              */
+    haddr_t eof;                /* current allocated size               */
+    size_t  increment;          /* multiples for mem allocation         */
+    hbool_t backing_store;      /* write to file name on flush          */
+    size_t  bstore_page_size;   /* backing store page size              */
+    int     fd;                 /* backing store file descriptor        */
+    /* Information for determining uniqueness of a file with a backing store */
+#ifndef H5_HAVE_WIN32_API
+    /* On most systems the combination of device and i-node number uniquely
+     * identify a file.
+     */
+    dev_t       device;                 /*file device number            */
+    ino_t       inode;                  /*file i-node number            */
+#else
+    /* Files in windows are uniquely identified by the volume serial
+     * number and the file index (both low and high parts).
+     *
+     * There are caveats where these numbers can change, especially
+     * on FAT file systems.  On NTFS, however, a file should keep
+     * those numbers the same until renamed or deleted (though you
+     * can use ReplaceFile() on NTFS to keep the numbers the same
+     * while renaming).
+     *
+     * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
+     * more information.
+     *
+     * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
+     */
+    DWORD           nFileIndexLow;
+    DWORD           nFileIndexHigh;
+    DWORD           dwVolumeSerialNumber;
+    
+    HANDLE          hFile;      /* Native windows file handle */
+#endif /* H5_HAVE_WIN32_API */
+    hbool_t dirty;                              /* changes not saved?       */
+    H5FD_file_image_callbacks_t fi_callbacks;   /* file image callbacks     */
+    H5SL_t *dirty_list;                         /* dirty parts of the file  */
+} H5FD_core_t;
+
+/* Driver-specific file access properties */
+typedef struct H5FD_core_fapl_t {
+    size_t  increment;          /* how much to grow memory */
+    hbool_t backing_store;      /* write to file name on flush */
+} H5FD_core_fapl_t;
+
+/* Allocate memory in multiples of this size by default */
+#define H5FD_CORE_INCREMENT 8192
+
+/* These macros check for overflow of various quantities.  These macros
+ * assume that file_offset_t is signed and haddr_t and size_t are unsigned.
+ *
+ * ADDR_OVERFLOW:   Checks whether a file address of type `haddr_t'
+ *                  is too large to be represented by the second argument
+ *                  of the file seek function.
+ *
+ * SIZE_OVERFLOW:   Checks whether a buffer size of type `hsize_t' is too
+ *                  large to be represented by the `size_t' type.
+ *
+ * REGION_OVERFLOW: Checks whether an address and size pair describe data
+ *                  which can be addressed entirely in memory.
+ */
+#define MAXADDR             ((haddr_t)((~(size_t)0)-1))
+#define ADDR_OVERFLOW(A)    (HADDR_UNDEF==(A) || (A) > (haddr_t)MAXADDR)
+#define SIZE_OVERFLOW(Z)    ((Z) > (hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)    (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||    \
+                                 HADDR_UNDEF==(A)+(Z) ||                    \
+                                (size_t)((A)+(Z))<(size_t)(A))
+
+/* Prototypes */
+static herr_t H5FD_core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end);
+static herr_t H5FD_core_destroy_dirty_list(H5FD_core_t *file);
+static herr_t H5FD_core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size);
+static void *H5FD_core_fapl_get(H5FD_t *_file);
+static H5FD_t *H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id,
+            haddr_t maxaddr);
+static herr_t H5FD_core_close(H5FD_t *_file);
+static int H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_core_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_core_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_core_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, void *buf);
+static herr_t H5FD_core_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, const void *buf);
+static herr_t H5FD_core_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_core_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+static const H5FD_class_t H5FD_core_g = {
+    "core",                     /* name                 */
+    MAXADDR,                    /* maxaddr              */
+    H5F_CLOSE_WEAK,             /* fc_degree            */
+    NULL,                       /* sb_size              */
+    NULL,                       /* sb_encode            */
+    NULL,                       /* sb_decode            */
+    sizeof(H5FD_core_fapl_t),   /* fapl_size            */
+    H5FD_core_fapl_get,         /* fapl_get             */
+    NULL,                       /* fapl_copy            */
+    NULL,                       /* fapl_free            */
+    0,                          /* dxpl_size            */
+    NULL,                       /* dxpl_copy            */
+    NULL,                       /* dxpl_free            */
+    H5FD_core_open,             /* open                 */
+    H5FD_core_close,            /* close                */
+    H5FD_core_cmp,              /* cmp                  */
+    H5FD_core_query,            /* query                */
+    NULL,                       /* get_type_map         */
+    NULL,                       /* alloc                */
+    NULL,                       /* free                 */
+    H5FD_core_get_eoa,          /* get_eoa              */
+    H5FD_core_set_eoa,          /* set_eoa              */
+    H5FD_core_get_eof,          /* get_eof              */
+    H5FD_core_get_handle,       /* get_handle           */
+    H5FD_core_read,             /* read                 */
+    H5FD_core_write,            /* write                */
+    H5FD_core_flush,            /* flush                */
+    H5FD_core_truncate,         /* truncate             */
+    NULL,                       /* lock                 */
+    NULL,                       /* unlock               */
+    H5FD_FLMAP_DICHOTOMY        /* fl_map               */
+};
+
+/* Define a free list to manage the region type */
+H5FL_DEFINE(H5FD_core_region_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_add_dirty_region
+ *
+ * Purpose:     Add a new dirty region to the list for later flushing
+ *              to the backing store.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
+{
+    H5FD_core_region_t *b_item  = NULL;
+    H5FD_core_region_t *a_item  = NULL;
+    H5FD_core_region_t *item    = NULL;
+    haddr_t     b_addr          = 0;
+    haddr_t     a_addr          = 0;
+    hbool_t     create_new_node = TRUE;
+    herr_t      ret_value       = SUCCEED;
+#ifdef DER
+    hbool_t     was_adjusted    = FALSE;
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+    HDassert(file->dirty_list);
+    HDassert(start <= end);
+
+#ifdef DER
+fprintf(stderr, "Add region: (%llu, %llu)\n", start, end);
+#endif
+
+    /* Adjust the dirty region to the nearest block boundaries */
+    if(start % file->bstore_page_size != 0) {
+        start = (start / file->bstore_page_size) * file->bstore_page_size;
+#ifdef DER
+        was_adjusted = TRUE;
+#endif
+    }
+    if(end % file->bstore_page_size != (file->bstore_page_size - 1)) {
+        end = (((end / file->bstore_page_size) + 1) * file->bstore_page_size) - 1;
+        if(end > file->eof){
+#ifdef DER
+fprintf(stderr, "Adjusted to EOF\n");
+#endif
+            end = file->eof - 1;
+        }
+#ifdef DER
+        was_adjusted = TRUE;
+#endif
+    }
+
+#ifdef DER
+if(was_adjusted)
+    fprintf(stderr, "Adjusted region: (%llu, %llu)\n", start, end);
+#endif
+
+    /* Get the regions before and after the intended insertion point */
+    b_addr = start +1;
+    a_addr = end + 2;
+    b_item = (H5FD_core_region_t *)H5SL_less(file->dirty_list, &b_addr);
+    a_item = (H5FD_core_region_t *)H5SL_less(file->dirty_list, &a_addr);
+
+    /* Check to see if we need to extend the upper end of the NEW region */
+    if(a_item) {
+        if(start < a_item->start && end < a_item->end) {
+
+            /* Extend the end of the NEW region to match the existing AFTER region */
+            end = a_item->end;
+        }
+    }
+    /* Attempt to extend the PREV region */
+    if(b_item) {
+        if(start <= b_item->end + 1) {
+
+            /* Need to set this for the delete algorithm */
+            start = b_item->start;
+
+            /* We won't need to insert a new node since we can
+             * just update an existing one instead.
+             */
+            create_new_node = FALSE;
+        }
+    }
+
+    /* Remove any old nodes that are no longer needed */
+    while(a_item && a_item->start > start) {
+
+        H5FD_core_region_t *less;
+        haddr_t key = a_item->start - 1;
+
+        /* Save the previous node before we trash this one */
+        less = (H5FD_core_region_t *)H5SL_less(file->dirty_list, &key);
+
+        /* Delete this node */
+        a_item = (H5FD_core_region_t *)H5SL_remove(file->dirty_list, &a_item->start);
+        a_item = H5FL_FREE(H5FD_core_region_t, a_item);
+
+        /* Set up to check the next node */
+        if(less)
+            a_item = less;
+    }
+
+    /* Insert the new node */
+    if(create_new_node) {
+        if(NULL == (item = (H5FD_core_region_t *)H5SL_search(file->dirty_list, &start))) {
+            /* Ok to insert.  No pre-existing node with that key. */
+            item = (H5FD_core_region_t *)H5FL_CALLOC(H5FD_core_region_t);
+            item->start = start;
+            item->end = end;
+            if(H5SL_insert(file->dirty_list, item, &item->start) < 0)
+                HGOTO_ERROR(H5E_SLIST, H5E_CANTINSERT, FAIL, "can't insert new dirty region: (%llu, %llu)\n", start, end)
+        }
+        else {
+            /* Store the new item endpoint if it's bigger */
+            item->end = (item->end < end) ? end : item->end;
+        }
+    }
+    else {
+        /* Update the size of the before region */
+        if(b_item->end < end)
+            b_item->end = end;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_add_dirty_region() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_destroy_dirty_list
+ *
+ * Purpose:     Completely destroy the dirty list.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_destroy_dirty_list(H5FD_core_t *file)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Destroy the list, including any remaining list elements */
+    if(file->dirty_list) {
+        H5FD_core_region_t *region = NULL;
+
+#ifdef DER
+{
+size_t count = H5SL_count(file->dirty_list);
+if(count != 0)
+    fprintf(stderr, "LIST NOT EMPTY AT DESTROY\n");
+}
+#endif
+        while(NULL != (region = (H5FD_core_region_t *)H5SL_remove_first(file->dirty_list)))
+            region = H5FL_FREE(H5FD_core_region_t, region);
+
+        if(H5SL_close(file->dirty_list) < 0)
+            HGOTO_ERROR(H5E_SLIST, H5E_CLOSEERROR, FAIL, "can't close core vfd dirty list")
+        file->dirty_list = NULL;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_destroy_dirty_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_write_to_bstore
+ *
+ * Purpose:     Write data to the backing store.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t H5FD_core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
+{
+    unsigned char  *ptr         = file->mem + addr;     /* mutable pointer into the
+                                                         * buffer (can't change mem)
+                                                         */
+    herr_t          ret_value   = SUCCEED;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Write to backing store */
+    if((off_t)addr != HDlseek(file->fd, (off_t)addr, SEEK_SET))
+        HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "error seeking in backing store")
+
+    while (size > 0) {
+
+        h5_posix_io_t       bytes_in        = 0;    /* # of bytes to write  */
+        h5_posix_io_ret_t   bytes_wrote     = -1;   /* # of bytes written   */
+
+        /* Trying to write more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_POSIX_MAX_IO_BYTES)
+            bytes_in = H5_POSIX_MAX_IO_BYTES;
+        else
+            bytes_in = (h5_posix_io_t)size;
+
+#ifdef DER
+fprintf(stderr, "\nNEW\n");
+#endif
+        do {
+            bytes_wrote = HDwrite(file->fd, ptr, bytes_in);
+#ifdef DER
+fprintf(stderr, "bytes wrote: %lu\n", bytes_wrote);
+#endif
+        } while(-1 == bytes_wrote && EINTR == errno);
+
+        if(-1 == bytes_wrote) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write to backing store failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', ptr = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), ptr, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
+        } /* end if */
+
+        HDassert(bytes_wrote > 0);
+        HDassert((size_t)bytes_wrote <= size);
+
+        size -= (size_t)bytes_wrote;
+        ptr = (unsigned char *)ptr + bytes_wrote;
+
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5FD_core_write_to_bstore() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_init_interface
+ *
+ * Purpose:     Initializes any interface-specific data or routines.
+ *
+ * Return:      Success:    The driver ID for the core driver.
+ *              Failure:    Negative.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_core_init())
+} /* H5FD_core_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_init
+ *
+ * Purpose:     Initialize this driver by registering the driver with the
+ *              library.
+ *
+ * Return:      Success:    The driver ID for the core driver.
+ *              Failure:    Negative.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_core_init(void)
+{
+    hid_t ret_value = H5FD_CORE_g;  /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5I_VFL != H5I_get_type(H5FD_CORE_g))
+        H5FD_CORE_g = H5FD_register(&H5FD_core_g,sizeof(H5FD_class_t),FALSE);
+
+    /* Set return value */
+    ret_value = H5FD_CORE_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*---------------------------------------------------------------------------
+ * Function:    H5FD_core_term
+ *
+ * Purpose:     Shut down the VFD
+ *
+ * Returns:     <none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_core_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_CORE_g = 0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_core_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fapl_core
+ *
+ * Purpose:     Modify the file access property list to use the H5FD_CORE
+ *              driver defined in this source file.  The INCREMENT specifies
+ *              how much to grow the memory each time we need more.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, February 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_core(hid_t fapl_id, size_t increment, hbool_t backing_store)
+{
+    H5FD_core_fapl_t    fa;
+    H5P_genplist_t      *plist;         /* Property list pointer */
+    herr_t              ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "izb", fapl_id, increment, backing_store);
+
+    /* Check argument */
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    fa.increment = increment;
+    fa.backing_store = backing_store;
+
+    ret_value= H5P_set_driver(plist, H5FD_CORE, &fa);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_fapl_core
+ *
+ * Purpose:     Queries properties set by the H5Pset_fapl_core() function.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Tuesday, August 10, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fapl_core(hid_t fapl_id, size_t *increment /*out*/, hbool_t *backing_store /*out*/)
+{
+    H5FD_core_fapl_t    *fa;
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", fapl_id, increment, backing_store);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+    if(H5FD_CORE != H5P_get_driver(plist))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
+    if(NULL == (fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
+
+    if (increment)
+        *increment = fa->increment;
+    if (backing_store)
+        *backing_store = fa->backing_store;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_fapl_get
+ *
+ * Purpose:     Returns a copy of the file access properties.
+ *
+ * Return:      Success:    Ptr to new file access properties.
+ *
+ *              Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_core_fapl_get(H5FD_t *_file)
+{
+    H5FD_core_t         *file = (H5FD_core_t*)_file;
+    H5FD_core_fapl_t    *fa;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (fa = (H5FD_core_fapl_t *)H5MM_calloc(sizeof(H5FD_core_fapl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    fa->increment = file->increment;
+    fa->backing_store = (hbool_t)(file->fd >= 0);
+
+    /* Set return value */
+    ret_value = fa;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_open
+ *
+ * Purpose:     Create memory as an HDF5 file.
+ *
+ * Return:      Success:    A pointer to a new file data structure. The
+ *                          public fields will be initialized by the
+ *                          caller, which is always H5FD_open().
+ *
+ *              Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    int                 o_flags;
+    H5FD_core_t         *file = NULL;
+    H5FD_core_fapl_t    *fa = NULL;
+    H5P_genplist_t      *plist;         /* Property list pointer */
+#ifdef H5_HAVE_WIN32_API
+    struct _BY_HANDLE_FILE_INFORMATION fileinfo;
+#endif
+    h5_stat_t           sb;
+    int                 fd = -1;
+    H5FD_file_image_info_t  file_image_info;
+    H5FD_t              *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
+    if(0 == maxaddr || HADDR_UNDEF == maxaddr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
+    if(ADDR_OVERFLOW(maxaddr))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "maxaddr overflow")
+    HDassert(H5P_DEFAULT != fapl_id);
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+    if(NULL == (fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
+
+    /* Build the open flags */
+    o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
+    if(H5F_ACC_TRUNC & flags) o_flags |= O_TRUNC;
+    if(H5F_ACC_CREAT & flags) o_flags |= O_CREAT;
+    if(H5F_ACC_EXCL & flags) o_flags |= O_EXCL;
+
+    /* Retrieve initial file image info */
+    if(H5P_get(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get initial file image info")
+
+    /* If the file image exists and this is an open, make sure the file doesn't exist */
+    HDassert(((file_image_info.buffer != NULL) && (file_image_info.size > 0)) ||
+             ((file_image_info.buffer == NULL) && (file_image_info.size == 0)));
+    HDmemset(&sb, 0, sizeof(sb));
+    if((file_image_info.buffer != NULL) && !(H5F_ACC_CREAT & flags)) {
+        if(HDopen(name, o_flags, 0666) >= 0)
+            HGOTO_ERROR(H5E_FILE, H5E_FILEEXISTS, NULL, "file already exists")
+        
+        /* If backing store is requested, create and stat the file
+         * Note: We are forcing the O_CREAT flag here, even though this is 
+         * technically an open.
+         */
+        if(fa->backing_store) {
+            if((fd = HDopen(name, o_flags | O_CREAT, 0666)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create file")
+            if(HDfstat(fd, &sb) < 0)
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
+        } /* end if */
+    }  /* end if */
+    /* Open backing store, and get stat() from file.  The only case that backing
+     * store is off is when  the backing_store flag is off and H5F_ACC_CREAT is
+     * on. */
+    else if(fa->backing_store || !(H5F_ACC_CREAT & flags)) {
+        if((fd = HDopen(name, o_flags, 0666)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
+        if(HDfstat(fd, &sb) < 0)
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
+    } /* end if */
+
+    /* Create the new file struct */
+    if(NULL == (file = (H5FD_core_t *)H5MM_calloc(sizeof(H5FD_core_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
+    file->fd = fd;
+    if(name && *name)
+        file->name = H5MM_xstrdup(name);
+
+    /* The increment comes from either the file access property list or the
+     * default value. But if the file access property list was zero then use
+     * the default value instead.
+     */
+    file->increment = (fa->increment > 0) ? fa->increment : H5FD_CORE_INCREMENT;
+
+    /* If save data in backing store. */
+    file->backing_store = fa->backing_store;
+
+    /* Save file image callbacks */
+    file->fi_callbacks = file_image_info.callbacks;
+
+    if(fd >= 0) {
+        /* Retrieve information for determining uniqueness of file */
+#ifdef H5_HAVE_WIN32_API
+        file->hFile = (HANDLE)_get_osfhandle(fd);
+        if(INVALID_HANDLE_VALUE == file->hFile)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file handle")
+
+        if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file information")
+
+        file->nFileIndexHigh = fileinfo.nFileIndexHigh;
+        file->nFileIndexLow = fileinfo.nFileIndexLow;
+        file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
+#else /* H5_HAVE_WIN32_API */
+        file->device = sb.st_dev;
+        file->inode = sb.st_ino;
+#endif /* H5_HAVE_WIN32_API */
+    } /* end if */
+
+    /* If an existing file is opened, load the whole file into memory. */
+    if(!(H5F_ACC_CREAT & flags)) {
+        size_t size;
+
+        /* Retrieve file size */
+        if(file_image_info.buffer && file_image_info.size > 0)
+            size = file_image_info.size;
+        else
+            size = (size_t)sb.st_size;
+
+        /* Check if we should allocate the memory buffer and read in existing data */
+        if(size) {
+            /* Allocate memory for the file's data, using the file image callback if available. */
+            if(file->fi_callbacks.image_malloc) {
+                if(NULL == (file->mem = (unsigned char*)file->fi_callbacks.image_malloc(size, H5FD_FILE_IMAGE_OP_FILE_OPEN, file->fi_callbacks.udata)))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "image malloc callback failed")
+            } /* end if */
+            else {
+                if(NULL == (file->mem = (unsigned char*)H5MM_malloc(size)))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "unable to allocate memory block")
+            } /* end else */
+
+            /* Set up data structures */
+            file->eof = size;
+
+            /* If there is an initial file image, copy it, using the callback if possible */
+            if(file_image_info.buffer && file_image_info.size > 0) {
+                if(file->fi_callbacks.image_memcpy) {
+                    if(file->mem != file->fi_callbacks.image_memcpy(file->mem, file_image_info.buffer, size, H5FD_FILE_IMAGE_OP_FILE_OPEN, file->fi_callbacks.udata))
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, NULL, "image_memcpy callback failed")
+                } /* end if */
+                else
+                    HDmemcpy(file->mem, file_image_info.buffer, size);
+            } /* end if */
+            /* Read in existing data from the file if there is no image */
+            else {
+                /* Read in existing data, being careful of interrupted system calls,
+                 * partial results, and the end of the file.
+                 */
+                
+                uint8_t *mem = file->mem; /* memory pointer for writes */
+                
+                while(size > 0) {
+                    h5_posix_io_t       bytes_in        = 0;    /* # of bytes to read       */
+                    h5_posix_io_ret_t   bytes_read      = -1;   /* # of bytes actually read */
+                    
+                    /* Trying to read more bytes than the return type can handle is
+                     * undefined behavior in POSIX.
+                     */
+                    if(size > H5_POSIX_MAX_IO_BYTES)
+                        bytes_in = H5_POSIX_MAX_IO_BYTES;
+                    else
+                        bytes_in = (h5_posix_io_t)size;
+                    
+                    do {
+                        bytes_read = HDread(file->fd, mem, bytes_in);
+                    } while(-1 == bytes_read && EINTR == errno);
+                    
+                    if(-1 == bytes_read) { /* error */
+                        int myerrno = errno;
+                        time_t mytime = HDtime(NULL);
+                        HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+                        HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', file->mem = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), file->mem, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
+                    } /* end if */
+                    
+                    HDassert(bytes_read >= 0);
+                    HDassert((size_t)bytes_read <= size);
+                    
+                    mem += bytes_read;
+                    size -= (size_t)bytes_read;
+                } /* end while */
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+    /* Set up write tracking if the backing store is on */
+    file->dirty_list = NULL;
+    if(fa->backing_store) {
+        hbool_t write_tracking_flag = FALSE;    /* what the user asked for */
+        hbool_t use_write_tracking = FALSE;     /* what we're actually doing */
+
+        /* Get the write tracking flag */
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, &write_tracking_flag) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get core VFD write tracking flag");
+
+        /* Get the page size */
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, &(file->bstore_page_size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get core VFD write tracking page size");
+
+        /* default is to have write tracking OFF for create (hence the check to see
+         * if the user explicitly set a page size) and ON with the default page size
+         * on open (when not read-only).
+         */
+        /* Only use write tracking if the file is open for writing */
+        use_write_tracking = 
+            TRUE == write_tracking_flag         /* user asked for write tracking */
+            && !(o_flags & O_RDONLY)            /* file is open for writing (i.e. not read-only) */
+            && file->bstore_page_size != 0;     /* page size is not zero */
+
+        /* initialize the dirty list */
+        if(use_write_tracking) {
+            if(NULL == (file->dirty_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+                HGOTO_ERROR(H5E_SLIST, H5E_CANTCREATE, NULL, "can't create core vfd dirty region list");
+#ifdef DER
+fprintf(stderr, "\n");
+#endif
+        } /* end if */
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (H5FD_t *)file;
+
+done:
+    if(!ret_value && file) {
+        if(file->fd >= 0)
+            HDclose(file->fd);
+        H5MM_xfree(file->name);
+        H5MM_xfree(file->mem);
+        H5MM_xfree(file);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_close
+ *
+ * Purpose:     Closes the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_close(H5FD_t *_file)
+{
+    H5FD_core_t     *file = (H5FD_core_t*)_file;
+    herr_t          ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Flush any changed buffers */
+    if(H5FD_core_flush(_file, (hid_t)-1, TRUE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush core vfd backing store")
+
+    /* Destroy the dirty region list */
+    if(file->dirty_list)
+        if(H5FD_core_destroy_dirty_list(file) != SUCCEED)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "unable to free core vfd dirty region list")
+
+    /* Release resources */
+    if(file->fd >= 0)
+        HDclose(file->fd);
+    if(file->name)
+        H5MM_xfree(file->name);
+    if(file->mem) {
+        /* Use image callback if available */
+        if(file->fi_callbacks.image_free) {
+            if(file->fi_callbacks.image_free(file->mem, H5FD_FILE_IMAGE_OP_FILE_CLOSE, file->fi_callbacks.udata) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "image_free callback failed")
+        } /* end if */
+        else
+            H5MM_xfree(file->mem);
+    } /* end if */
+    HDmemset(file, 0, sizeof(H5FD_core_t));
+    H5MM_xfree(file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_cmp
+ *
+ * Purpose:     Compares two files belonging to this driver by name. If one
+ *              file doesn't have a name then it is less than the other file.
+ *              If neither file has a name then the comparison is by file
+ *              address.
+ *
+ * Return:      Success:    A value like strcmp()
+ *
+ *              Failure:    never fails (arguments were checked by the
+ *                          caller).
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_core_t   *f1 = (const H5FD_core_t*)_f1;
+    const H5FD_core_t   *f2 = (const H5FD_core_t*)_f2;
+    int                 ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(f1->fd >= 0 && f2->fd >= 0) {
+        /* Compare low level file information for backing store */
+#ifdef H5_HAVE_WIN32_API
+        if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) HGOTO_DONE(-1)
+        if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) HGOTO_DONE(1)
+
+        if(f1->nFileIndexHigh < f2->nFileIndexHigh) HGOTO_DONE(-1)
+        if(f1->nFileIndexHigh > f2->nFileIndexHigh) HGOTO_DONE(1)
+
+        if(f1->nFileIndexLow < f2->nFileIndexLow) HGOTO_DONE(-1)
+        if(f1->nFileIndexLow > f2->nFileIndexLow) HGOTO_DONE(1)
+
+#else
+#ifdef H5_DEV_T_IS_SCALAR
+        if (f1->device < f2->device) HGOTO_DONE(-1)
+        if (f1->device > f2->device) HGOTO_DONE(1)
+#else /* H5_DEV_T_IS_SCALAR */
+        /* If dev_t isn't a scalar value on this system, just use memcmp to
+         * determine if the values are the same or not.  The actual return value
+         * shouldn't really matter...
+         */
+        if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))<0) HGOTO_DONE(-1)
+        if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))>0) HGOTO_DONE(1)
+#endif /* H5_DEV_T_IS_SCALAR */
+
+        if (f1->inode < f2->inode) HGOTO_DONE(-1)
+        if (f1->inode > f2->inode) HGOTO_DONE(1)
+
+#endif /*H5_HAVE_WIN32_API*/
+    } /* end if */
+    else {
+        if (NULL==f1->name && NULL==f2->name) {
+            if (f1<f2)
+                HGOTO_DONE(-1)
+            if (f1>f2)
+                HGOTO_DONE(1)
+            HGOTO_DONE(0)
+        } /* end if */
+
+        if (NULL==f1->name)
+            HGOTO_DONE(-1)
+        if (NULL==f2->name)
+            HGOTO_DONE(1)
+
+        ret_value = HDstrcmp(f1->name, f2->name);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_query
+ *
+ * Purpose:     Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, October  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_query(const H5FD_t * _file, unsigned long *flags /* out */)
+{
+    const H5FD_core_t   *file = (const H5FD_core_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
+        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+        *flags |= H5FD_FEAT_ALLOW_FILE_IMAGE;   /* OK to use file image feature with this VFD */
+        *flags |= H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS;       /* OK to use file image callbacks with this VFD */
+
+        /* If the backing store is open, a POSIX file handle is available */
+        if(file && file->fd >= 0 && file->backing_store)
+            *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE; /* VFD handle is POSIX I/O call compatible */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_core_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_get_eoa
+ *
+ * Purpose:     Gets the end-of-address marker for the file. The EOA marker
+ *              is the first address past the last byte allocated in the
+ *              format address space.
+ *
+ * Return:      The end-of-address marker. (Can't fail)
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, August  2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_core_t   *file = (const H5FD_core_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_set_eoa
+ *
+ * Purpose:     Set the end-of-address marker for the file. This function is
+ *              called shortly after an existing HDF5 file is opened in order
+ *              to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(ADDR_OVERFLOW(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "address overflow")
+
+    file->eoa = addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_set_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_get_eof
+ *
+ * Purpose:     Returns the end-of-file marker, which is the greater of
+ *              either the size of the underlying memory or the HDF5
+ *              end-of-address markers.
+ *
+ * Return:      End of file address, the first address past
+ *              the end of the "file", either the memory
+ *              or the HDF5 file. (Can't fail)
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_core_get_eof(const H5FD_t *_file)
+{
+    const H5FD_core_t   *file = (const H5FD_core_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_core_get_handle
+ *
+ * Purpose:        Gets the file handle of CORE file driver.
+ *
+ * Returns:        SUCCEED/FAIL
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+{
+    H5FD_core_t *file = (H5FD_core_t *)_file;   /* core VFD info */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    if(!file_handle)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
+
+    /* Check for non-default FAPL */
+    if(H5P_FILE_ACCESS_DEFAULT != fapl && H5P_DEFAULT != fapl) {
+        H5P_genplist_t *plist;  /* Property list pointer */
+
+        /* Get the FAPL */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl)))
+            HGOTO_ERROR(H5E_VFL, H5E_BADTYPE, FAIL, "not a file access property list")
+
+        /* Check if private property for retrieving the backing store POSIX
+         * file descriptor is set.  (This should not be set except within the
+         * library)  QAK - 2009/12/04
+         */
+        if(H5P_exist_plist(plist, H5F_ACS_WANT_POSIX_FD_NAME) > 0) {
+            hbool_t want_posix_fd;  /* Setting for retrieving file descriptor from core VFD */
+
+            /* Get property */
+            if(H5P_get(plist, H5F_ACS_WANT_POSIX_FD_NAME, &want_posix_fd) < 0)
+                HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get property of retrieving file descriptor")
+
+            /* If property is set, pass back the file descriptor instead of the memory address */
+            if(want_posix_fd)
+                *file_handle = &(file->fd);
+            else
+                *file_handle = &(file->mem);
+        } /* end if */
+        else
+            *file_handle = &(file->mem);
+    } /* end if */
+    else
+        *file_handle = &(file->mem);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_get_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_read
+ *
+ * Purpose:     Reads SIZE bytes of data from FILE beginning at address ADDR
+ *              into buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      Success:    SUCCEED. Result is stored in caller-supplied
+ *                          buffer BUF.
+ *
+ *              Failure:    FAIL, Contents of buffer BUF are undefined.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+        size_t size, void *buf/*out*/)
+{
+    H5FD_core_t  *file = (H5FD_core_t*)_file;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if (HADDR_UNDEF == addr)
+        HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed")
+    if (REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed")
+
+    /* Read the part which is before the EOF marker */
+    if (addr < file->eof) {
+        size_t nbytes;
+#ifndef NDEBUG
+        hsize_t temp_nbytes;
+
+        temp_nbytes = file->eof-addr;
+        H5_CHECK_OVERFLOW(temp_nbytes,hsize_t,size_t);
+        nbytes = MIN(size,(size_t)temp_nbytes);
+#else /* NDEBUG */
+        nbytes = MIN(size,(size_t)(file->eof-addr));
+#endif /* NDEBUG */
+
+        HDmemcpy(buf, file->mem + addr, nbytes);
+        size -= nbytes;
+        addr += nbytes;
+        buf = (char *)buf + nbytes;
+    }
+
+    /* Read zeros for the part which is after the EOF markers */
+    if (size > 0)
+        HDmemset(buf, 0, size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_write
+ *
+ * Purpose:     Writes SIZE bytes of data to FILE beginning at address ADDR
+ *              from buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+        size_t size, const void *buf)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if(REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed")
+
+    /*
+     * Allocate more memory if necessary, careful of overflow. Also, if the
+     * allocation fails then the file should remain in a usable state.  Be
+     * careful of non-Posix realloc() that doesn't understand what to do when
+     * the first argument is null.
+     */
+    if(addr + size > file->eof) {
+        unsigned char *x;
+        size_t new_eof;
+
+        /* Determine new size of memory buffer */
+        H5_CHECKED_ASSIGN(new_eof, size_t, file->increment * ((addr + size) / file->increment), hsize_t);
+        if((addr + size) % file->increment)
+            new_eof += file->increment;
+
+        /* (Re)allocate memory for the file buffer, using callbacks if available */
+        if(file->fi_callbacks.image_realloc) {
+            if(NULL == (x = (unsigned char *)file->fi_callbacks.image_realloc(file->mem, new_eof, H5FD_FILE_IMAGE_OP_FILE_RESIZE, file->fi_callbacks.udata)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes with callback", (unsigned long long)new_eof)
+        } /* end if */
+        else {
+            if(NULL == (x = (unsigned char *)H5MM_realloc(file->mem, new_eof)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes", (unsigned long long)new_eof)
+        } /* end else */
+
+#ifdef H5_CLEAR_MEMORY
+        HDmemset(x + file->eof, 0, (size_t)(new_eof - file->eof));
+#endif /* H5_CLEAR_MEMORY */
+        file->mem = x;
+
+        file->eof = new_eof;
+    } /* end if */
+
+    /* Add the buffer region to the dirty list if using that optimization */
+    if(file->dirty_list) {
+        haddr_t start = addr;
+        haddr_t end = addr + (haddr_t)size - 1;
+        if(H5FD_core_add_dirty_region(file, start, end) != SUCCEED)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTINSERT, FAIL, "unable to add core VFD dirty region during write call - addresses: start=%llu end=%llu", start, end)
+    }
+
+    /* Write from BUF to memory */
+    HDmemcpy(file->mem + addr, buf, size);
+
+    /* Mark memory buffer as modified */
+    file->dirty = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_flush
+ *
+ * Purpose:     Flushes the file to backing store if there is any and if the
+ *              dirty flag is set.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, October 15, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_UNUSED closing)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Write to backing store */
+    if (file->dirty && file->fd >= 0 && file->backing_store) {
+
+        /* Use the dirty list, if available */
+        if(file->dirty_list) {
+            H5FD_core_region_t *item = NULL;
+            size_t size;
+
+#ifdef DER
+    fprintf(stderr, "FLUSHING. DIRTY LIST:\n");
+#endif
+            while(NULL != (item = (H5FD_core_region_t *)H5SL_remove_first(file->dirty_list))) {
+
+                /* The file may have been truncated, so check for that
+                 * and skip or adjust as necessary.
+                 */
+                if(item->start < file->eof) {
+                    if(item->end >= file->eof)
+                        item->end = file->eof - 1;
+                    size = (size_t)((item->end - item->start) + 1);
+#ifdef DER
+fprintf(stderr, "(%llu, %llu : %lu)\n", item->start, item->end, size);
+#endif
+                    if(H5FD_core_write_to_bstore(file, item->start, size) != SUCCEED)
+                        HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "unable to write to backing store")
+                } /* end if */
+                
+                item = H5FL_FREE(H5FD_core_region_t, item);
+            } /* end while */
+
+ 
+#ifdef DER
+fprintf(stderr, "EOF: %llu\n", file->eof);
+fprintf(stderr, "EOA: %llu\n", file->eoa);
+if(file->eoa > file->eof)
+    fprintf(stderr, "*** EOA BADNESS ***\n");
+fprintf(stderr, "\n");
+#endif
+        }
+        /* Otherwise, write the entire file out at once */
+        else {
+            if(H5FD_core_write_to_bstore(file, (haddr_t)0, (size_t)file->eof) != SUCCEED)
+                HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "unable to write to backing store")
+
+        } /* end while */
+
+        file->dirty = FALSE;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_truncate
+ *
+ * Purpose:     Makes sure that the true file size is the same (or larger)
+ *              than the end-of-address.
+ *
+ *              Addendum -- 12/2/11
+ *              For file images opened with the core file driver, it is 
+ *              necessary that we avoid reallocating the core file driver's
+ *              buffer uneccessarily.
+ *
+ *              To this end, I have made the following functional changes
+ *              to this function.  
+ *
+ *              If we are closing, and there is no backing store, this 
+ *              function becomes a no-op.
+ *
+ *              If we are closing, and there is backing store, we set the
+ *              eof to equal the eoa, and truncate the backing store to 
+ *              the new eof
+ *
+ *              If we are not closing, we realloc the buffer to size equal 
+ *              to the smallest multiple of the allocation increment that 
+ *              equals or exceeds the eoa and set the eof accordingly.  
+ *              Note that we no longer truncate	the backing store to the 
+ *              new eof if applicable.
+ *                                                                  -- JRM
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, October  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;
+    size_t new_eof;                             /* New size of memory buffer */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* if we are closing and not using backing store, do nothing */
+    if(!closing || file->backing_store) {
+        if(closing) /* set eof to eoa */
+            new_eof = file->eoa;
+        else { /* set eof to smallest multiple of increment that exceeds eoa */
+            /* Determine new size of memory buffer */
+            H5_CHECKED_ASSIGN(new_eof, size_t, file->increment * (file->eoa / file->increment), hsize_t);
+            if(file->eoa % file->increment)
+                new_eof += file->increment;
+        } /* end else */
+
+        /* Extend the file to make sure it's large enough */
+        if(!H5F_addr_eq(file->eof, (haddr_t)new_eof)) {
+            unsigned char *x;       /* Pointer to new buffer for file data */
+
+            /* (Re)allocate memory for the file buffer, using callback if available */
+            if(file->fi_callbacks.image_realloc) {
+                if(NULL == (x = (unsigned char *)file->fi_callbacks.image_realloc(file->mem, new_eof, H5FD_FILE_IMAGE_OP_FILE_RESIZE, file->fi_callbacks.udata)))
+                  HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block with callback")
+            } /* end if */
+            else {
+                if(NULL == (x = (unsigned char *)H5MM_realloc(file->mem, new_eof)))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block")
+            } /* end else */
+
+#ifdef H5_CLEAR_MEMORY
+            if(file->eof < new_eof)
+                HDmemset(x + file->eof, 0, (size_t)(new_eof - file->eof));
+#endif /* H5_CLEAR_MEMORY */
+            file->mem = x;
+
+            /* Update backing store, if using it and if closing */
+            if(closing && (file->fd >= 0) && file->backing_store) {
+#ifdef H5_HAVE_WIN32_API
+                LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
+                DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
+                                             * Only used as an error code here.
+                                             */
+                DWORD           dwError;    /* DWORD error code from GetLastError() */
+                BOOL            bError;     /* Boolean error flag */
+
+                /* Windows uses this odd QuadPart union for 32/64-bit portability */
+                li.QuadPart = (__int64)file->eoa;
+
+                /* Extend the file to make sure it's large enough.
+                 *
+                 * Since INVALID_SET_FILE_POINTER can technically be a valid return value
+                 * from SetFilePointer(), we also need to check GetLastError().
+                 */
+                dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
+                if(INVALID_SET_FILE_POINTER == dwPtrLow) {
+                    dwError = GetLastError();
+                    if(dwError != NO_ERROR )
+                        HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "unable to set file pointer")
+                }
+
+                bError = SetEndOfFile(file->hFile);
+                if(0 == bError)
+                    HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#else /* H5_HAVE_WIN32_API */
+                if(-1 == HDftruncate(file->fd, (HDoff_t)new_eof))
+                    HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#endif /* H5_HAVE_WIN32_API */
+
+#ifdef DER
+fprintf(stderr, "OLD: Truncated to: %llu\n", file->eoa);
+#endif
+            } /* end if */
+
+            /* Update the eof value */
+            file->eof = new_eof;
+        } /* end if */
+    } /* end if(file->eof < file->eoa) */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_truncate() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDcore.h b/gatb-core/thirdparty/hdf5/src/H5FDcore.h
new file mode 100644
index 0000000..dca110e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDcore.h
@@ -0,0 +1,42 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  2, 1999
+ *
+ * Purpose:	The public header file for the sec2 driver.
+ */
+#ifndef H5FDcore_H
+#define H5FDcore_H
+
+#include "H5Ipublic.h"
+
+#define H5FD_CORE	(H5FD_core_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+H5_DLL hid_t H5FD_core_init(void);
+H5_DLL void H5FD_core_term(void);
+H5_DLL herr_t H5Pset_fapl_core(hid_t fapl_id, size_t increment,
+				hbool_t backing_store);
+H5_DLL herr_t H5Pget_fapl_core(hid_t fapl_id, size_t *increment/*out*/,
+				hbool_t *backing_store/*out*/);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDdirect.c b/gatb-core/thirdparty/hdf5/src/H5FDdirect.c
new file mode 100644
index 0000000..5265a23
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDdirect.c
@@ -0,0 +1,1314 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu <slu at hdfgroup.uiuc.edu>
+ *              Wednesday, 20 September 2006
+ *
+ * Purpose:  The Direct I/O file driver forces the data to be written to
+ *    the file directly without being copied into system kernel
+ *    buffer.  The main system support this feature is Linux.
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC  H5FD_direct_init_interface
+
+/* For system function posix_memalign - Commented it out because copper isn't able to compile
+ * this file. */
+/* #define _XOPEN_SOURCE 600 */
+
+#include "H5private.h"    /* Generic Functions      */
+#include "H5Eprivate.h"    /* Error handling        */
+#include "H5Fprivate.h"    /* File access        */
+#include "H5FDprivate.h"  /* File drivers        */
+#include "H5FDdirect.h"    /* Direct file driver      */
+#include "H5FLprivate.h"  /* Free Lists                           */
+#include "H5Iprivate.h"    /* IDs            */
+#include "H5MMprivate.h"  /* Memory management      */
+#include "H5Pprivate.h"    /* Property lists      */
+
+#ifdef H5_HAVE_DIRECT
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_DIRECT_g = 0;
+
+/* File operations */
+#define OP_UNKNOWN  0
+#define OP_READ    1
+#define OP_WRITE  2
+
+/* Driver-specific file access properties */
+typedef struct H5FD_direct_fapl_t {
+    size_t  mboundary;  /* Memory boundary for alignment    */
+    size_t  fbsize;    /* File system block size      */
+    size_t  cbsize;    /* Maximal buffer size for copying user data  */
+    hbool_t     must_align;     /* Decides if data alignment is required        */
+} H5FD_direct_fapl_t;
+
+/*
+ * The description of a file belonging to this driver. The `eoa' and `eof'
+ * determine the amount of hdf5 address space in use and the high-water mark
+ * of the file (the current size of the underlying Unix file). The `pos'
+ * value is used to eliminate file position updates when they would be a
+ * no-op. Unfortunately we've found systems that use separate file position
+ * indicators for reading and writing so the lseek can only be eliminated if
+ * the current operation is the same as the previous operation.  When opening
+ * a file the `eof' will be set to the current file size, `eoa' will be set
+ * to zero, `pos' will be set to H5F_ADDR_UNDEF (as it is when an error
+ * occurs), and `op' will be set to H5F_OP_UNKNOWN.
+ */
+typedef struct H5FD_direct_t {
+    H5FD_t  pub;      /*public stuff, must be first  */
+    int    fd;      /*the unix file      */
+    haddr_t  eoa;      /*end of allocated region  */
+    haddr_t  eof;      /*end of file; current file size*/
+    haddr_t  pos;      /*current file I/O position  */
+    int    op;      /*last operation    */
+    H5FD_direct_fapl_t  fa;    /*file access properties  */
+#ifndef H5_HAVE_WIN32_API
+    /*
+     * On most systems the combination of device and i-node number uniquely
+     * identify a file.
+     */
+    dev_t  device;      /*file device number    */
+    ino_t  inode;      /*file i-node number    */
+#else
+    /*
+     * On H5_HAVE_WIN32_API the low-order word of a unique identifier associated with the
+     * file and the volume serial number uniquely identify a file. This number
+     * (which, both? -rpm) may change when the system is restarted or when the
+     * file is opened. After a process opens a file, the identifier is
+     * constant until the file is closed. An application can use this
+     * identifier and the volume serial number to determine whether two
+     * handles refer to the same file.
+     */
+    DWORD fileindexlo;
+    DWORD fileindexhi;
+#endif
+} H5FD_direct_t;
+
+/*
+ * These macros check for overflow of various quantities.  These macros
+ * assume that HDoff_t is signed and haddr_t and size_t are unsigned.
+ *
+ * ADDR_OVERFLOW:  Checks whether a file address of type `haddr_t'
+ *      is too large to be represented by the second argument
+ *      of the file seek function.
+ *
+ * SIZE_OVERFLOW:  Checks whether a buffer size of type `hsize_t' is too
+ *      large to be represented by the `size_t' type.
+ *
+ * REGION_OVERFLOW:  Checks whether an address and size pair describe data
+ *      which can be addressed entirely by the second
+ *      argument of the file seek function.
+ */
+#define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1)
+#define ADDR_OVERFLOW(A)  (HADDR_UNDEF==(A) ||            \
+         ((A) & ~(haddr_t)MAXADDR))
+#define SIZE_OVERFLOW(Z)  ((Z) & ~(hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)  (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||      \
+                                 HADDR_UNDEF==(A)+(Z) ||          \
+         (HDoff_t)((A)+(Z))<(HDoff_t)(A))
+
+/* Prototypes */
+static void *H5FD_direct_fapl_get(H5FD_t *file);
+static void *H5FD_direct_fapl_copy(const void *_old_fa);
+static H5FD_t *H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id,
+            haddr_t maxaddr);
+static herr_t H5FD_direct_close(H5FD_t *_file);
+static int H5FD_direct_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_direct_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_direct_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_direct_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_direct_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_direct_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+           size_t size, void *buf);
+static herr_t H5FD_direct_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, const void *buf);
+static herr_t H5FD_direct_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+static const H5FD_class_t H5FD_direct_g = {
+    "direct",          /*name      */
+    MAXADDR,          /*maxaddr    */
+    H5F_CLOSE_WEAK,        /* fc_degree    */
+    NULL,          /*sb_size    */
+    NULL,          /*sb_encode    */
+    NULL,          /*sb_decode    */
+    sizeof(H5FD_direct_fapl_t),                 /*fapl_size    */
+    H5FD_direct_fapl_get,            /*fapl_get    */
+    H5FD_direct_fapl_copy,            /*fapl_copy    */
+    NULL,                /*fapl_free    */
+    0,            /*dxpl_size    */
+    NULL,          /*dxpl_copy    */
+    NULL,          /*dxpl_free    */
+    H5FD_direct_open,              /*open      */
+    H5FD_direct_close,                    /*close      */
+    H5FD_direct_cmp,              /*cmp      */
+    H5FD_direct_query,                    /*query      */
+    NULL,          /*get_type_map    */
+    NULL,          /*alloc      */
+    NULL,          /*free      */
+    H5FD_direct_get_eoa,      /*get_eoa    */
+    H5FD_direct_set_eoa,       /*set_eoa    */
+    H5FD_direct_get_eof,      /*get_eof    */
+    H5FD_direct_get_handle,                     /*get_handle            */
+    H5FD_direct_read,        /*read      */
+    H5FD_direct_write,        /*write      */
+    NULL,          /*flush      */
+    H5FD_direct_truncate,      /*truncate    */
+    NULL,                                       /*lock                  */
+    NULL,                                       /*unlock                */
+    H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
+};
+
+/* Declare a free list to manage the H5FD_direct_t struct */
+H5FL_DEFINE_STATIC(H5FD_direct_t);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FD_direct_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FD_direct_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5FD_direct_init currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FD_direct_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_direct_init())
+} /* H5FD_direct_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_init
+ *
+ * Purpose:  Initialize this driver by registering the driver with the
+ *    library.
+ *
+ * Return:  Success:  The driver ID for the direct driver.
+ *
+ *    Failure:  Negative.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_direct_init(void)
+{
+    hid_t ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if (H5I_VFL!=H5I_get_type(H5FD_DIRECT_g))
+        H5FD_DIRECT_g = H5FD_register(&H5FD_direct_g,sizeof(H5FD_class_t),FALSE);
+
+    /* Set return value */
+    ret_value=H5FD_DIRECT_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*---------------------------------------------------------------------------
+ * Function:  H5FD_direct_term
+ *
+ * Purpose:  Shut down the VFD
+ *
+ * Return:  <none>
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modification:
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_direct_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_DIRECT_g=0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_direct_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_fapl_direct
+ *
+ * Purpose:  Modify the file access property list to use the H5FD_DIRECT
+ *    driver defined in this source file.  There are no driver
+ *    specific properties.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *    Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_direct(hid_t fapl_id, size_t boundary, size_t block_size, size_t cbuf_size)
+{
+    H5P_genplist_t      *plist;      /* Property list pointer */
+    H5FD_direct_fapl_t  fa;
+    herr_t     ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "izzz", fapl_id, boundary, block_size, cbuf_size);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    if(boundary != 0)
+      fa.mboundary = boundary;
+    else
+  fa.mboundary = MBOUNDARY_DEF;
+    if(block_size != 0)
+      fa.fbsize = block_size;
+    else
+  fa.fbsize = FBSIZE_DEF;
+    if(cbuf_size != 0)
+      fa.cbsize = cbuf_size;
+    else
+  fa.cbsize = CBSIZE_DEF;
+
+    /* Set the default to be true for data alignment */
+    fa.must_align = TRUE;
+
+    /* Copy buffer size must be a multiple of file block size */
+    if(fa.cbsize % fa.fbsize != 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "copy buffer size must be a multiple of block size")
+
+    ret_value= H5P_set_driver(plist, H5FD_DIRECT, &fa);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pget_fapl_direct
+ *
+ * Purpose:  Returns information about the direct file access property
+ *    list though the function arguments.
+ *
+ * Return:  Success:  Non-negative
+ *
+ *    Failure:  Negative
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, October 18, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/, size_t *block_size/*out*/,
+    size_t *cbuf_size/*out*/)
+{
+    H5FD_direct_fapl_t  *fa;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "ixxx", fapl_id, boundary, block_size, cbuf_size);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
+    if (H5FD_DIRECT!=H5P_get_driver(plist))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
+    if (NULL==(fa=H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
+    if (boundary)
+        *boundary = fa->mboundary;
+    if (block_size)
+  *block_size = fa->fbsize;
+    if (cbuf_size)
+  *cbuf_size = fa->cbsize;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_fapl_get
+ *
+ * Purpose:  Returns a file access property list which indicates how the
+ *    specified file is being accessed. The return list could be
+ *    used to access another file the same way.
+ *
+ * Return:  Success:  Ptr to new file access property list with all
+ *        members copied from the file struct.
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 18 October 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_direct_fapl_get(H5FD_t *_file)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+    void *ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set return value */
+    ret_value= H5FD_direct_fapl_copy(&(file->fa));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_direct_fapl_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_fapl_copy
+ *
+ * Purpose:  Copies the direct-specific file access properties.
+ *
+ * Return:  Success:  Ptr to a new property list
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 18 October 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_direct_fapl_copy(const void *_old_fa)
+{
+    const H5FD_direct_fapl_t *old_fa = (const H5FD_direct_fapl_t*)_old_fa;
+    H5FD_direct_fapl_t *new_fa = H5MM_malloc(sizeof(H5FD_direct_fapl_t));
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(new_fa);
+
+    /* Copy the general information */
+    HDmemcpy(new_fa, old_fa, sizeof(H5FD_direct_fapl_t));
+
+    FUNC_LEAVE_NOAPI(new_fa)
+} /* end H5FD_direct_fapl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_open
+ *
+ * Purpose:  Create and/or opens a Unix file for direct I/O as an HDF5 file.
+ *
+ * Return:  Success:  A pointer to a new file data structure. The
+ *        public fields will be initialized by the
+ *        caller, which is always H5FD_open().
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    int      o_flags;
+    int      fd=(-1);
+    H5FD_direct_t  *file=NULL;
+    H5FD_direct_fapl_t  *fa;
+#ifdef H5_HAVE_WIN32_API
+    HFILE     filehandle;
+    struct _BY_HANDLE_FILE_INFORMATION fileinfo;
+#endif
+    h5_stat_t    sb;
+    H5P_genplist_t   *plist;      /* Property list */
+    int                 *buf1, *buf2;
+    H5FD_t    *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check on file offsets */
+    HDassert(sizeof(HDoff_t)>=sizeof(size_t));
+
+    /* Check arguments */
+    if (!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
+    if (0==maxaddr || HADDR_UNDEF==maxaddr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
+    if (ADDR_OVERFLOW(maxaddr))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr")
+
+    /* Build the open flags */
+    o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
+    if (H5F_ACC_TRUNC & flags) o_flags |= O_TRUNC;
+    if (H5F_ACC_CREAT & flags) o_flags |= O_CREAT;
+    if (H5F_ACC_EXCL & flags) o_flags |= O_EXCL;
+
+    /* Flag for Direct I/O */
+    o_flags |= O_DIRECT;
+
+    /* Open the file */
+    if ((fd=HDopen(name, o_flags, 0666))<0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
+
+    if (HDfstat(fd, &sb)<0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
+
+    /* Create the new file struct */
+    if (NULL==(file=H5FL_CALLOC(H5FD_direct_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
+
+    /* Get the driver specific information */
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+    if(NULL == (fa = (H5FD_direct_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
+
+    file->fd = fd;
+    H5_CHECKED_ASSIGN(file->eof, haddr_t, sb.st_size, h5_stat_size_t);
+    file->pos = HADDR_UNDEF;
+    file->op = OP_UNKNOWN;
+#ifdef H5_HAVE_WIN32_API
+    filehandle = _get_osfhandle(fd);
+    (void)GetFileInformationByHandle((HANDLE)filehandle, &fileinfo);
+    file->fileindexhi = fileinfo.nFileIndexHigh;
+    file->fileindexlo = fileinfo.nFileIndexLow;
+#else
+    file->device = sb.st_dev;
+    file->inode = sb.st_ino;
+#endif /*H5_HAVE_WIN32_API*/
+    file->fa.mboundary = fa->mboundary;
+    file->fa.fbsize = fa->fbsize;
+    file->fa.cbsize = fa->cbsize;
+
+    /* Try to decide if data alignment is required.  The reason to check it here
+     * is to handle correctly the case that the file is in a different file system
+     * than the one where the program is running.
+     */
+    buf1 = (int *)HDmalloc(sizeof(int));
+    if(HDposix_memalign(&buf2, file->fa.mboundary, file->fa.fbsize) != 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "HDposix_memalign failed")
+
+    if(o_flags & O_CREAT) {
+        if(HDwrite(file->fd, (void*)buf1, sizeof(int))<0) {
+            if(HDwrite(file->fd, (void*)buf2, file->fa.fbsize)<0)
+                HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, NULL, "file system may not support Direct I/O")
+            else
+                file->fa.must_align = TRUE;
+        } else {
+            file->fa.must_align = FALSE;
+            HDftruncate(file->fd, (HDoff_t)0);
+        }
+    } else {
+        if(HDread(file->fd, (void*)buf1, sizeof(int))<0) {
+            if(HDread(file->fd, (void*)buf2, file->fa.fbsize)<0)
+                HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "file system may not support Direct I/O")
+            else
+                file->fa.must_align = TRUE;
+        } else {
+            if(o_flags & O_RDWR) {
+                if(HDlseek(file->fd, (HDoff_t)0, SEEK_SET) < 0)
+                    HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, NULL, "unable to seek to proper position")
+                if(HDwrite(file->fd, (void *)buf1, sizeof(int))<0)
+                    file->fa.must_align = TRUE;
+                else
+                    file->fa.must_align = FALSE;
+            } else
+                file->fa.must_align = FALSE;
+        }
+    }
+
+    if(buf1)
+        HDfree(buf1);
+    if(buf2)
+        HDfree(buf2);
+
+    /* Set return value */
+    ret_value=(H5FD_t*)file;
+
+done:
+    if(ret_value==NULL) {
+        if(fd>=0)
+            HDclose(fd);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_close
+ *
+ * Purpose:  Closes the file.
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  -1, file not closed.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_close(H5FD_t *_file)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+    herr_t        ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if (HDclose(file->fd)<0)
+        HSYS_GOTO_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+
+    H5FL_FREE(H5FD_direct_t,file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_cmp
+ *
+ * Purpose:  Compares two files belonging to this driver using an
+ *    arbitrary (but consistent) ordering.
+ *
+ * Return:  Success:  A value like strcmp()
+ *
+ *    Failure:  never fails (arguments were checked by the
+ *        caller).
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, 21 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_direct_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_direct_t  *f1 = (const H5FD_direct_t*)_f1;
+    const H5FD_direct_t  *f2 = (const H5FD_direct_t*)_f2;
+    int ret_value=0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef H5_HAVE_WIN32_API
+    if (f1->fileindexhi < f2->fileindexhi) HGOTO_DONE(-1)
+    if (f1->fileindexhi > f2->fileindexhi) HGOTO_DONE(1)
+
+    if (f1->fileindexlo < f2->fileindexlo) HGOTO_DONE(-1)
+    if (f1->fileindexlo > f2->fileindexlo) HGOTO_DONE(1)
+
+#else
+#ifdef H5_DEV_T_IS_SCALAR
+    if (f1->device < f2->device) HGOTO_DONE(-1)
+    if (f1->device > f2->device) HGOTO_DONE(1)
+#else /* H5_DEV_T_IS_SCALAR */
+    /* If dev_t isn't a scalar value on this system, just use memcmp to
+     * determine if the values are the same or not.  The actual return value
+     * shouldn't really matter...
+     */
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))<0) HGOTO_DONE(-1)
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))>0) HGOTO_DONE(1)
+#endif /* H5_DEV_T_IS_SCALAR */
+
+    if (f1->inode < f2->inode) HGOTO_DONE(-1)
+    if (f1->inode > f2->inode) HGOTO_DONE(1)
+
+#endif
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_query
+ *
+ * Purpose:  Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:  Success:  non-negative
+ *
+ *    Failure:  negative
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, 21 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_query(const H5FD_t H5_ATTR_UNUSED * _f, unsigned long *flags /* out */)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
+        *flags|=H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
+        *flags|=H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_get_eoa
+ *
+ * Purpose:  Gets the end-of-address marker for the file. The EOA marker
+ *    is the first address past the last byte allocated in the
+ *    format address space.
+ *
+ * Return:  Success:  The end-of-address marker.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_direct_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_direct_t  *file = (const H5FD_direct_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_set_eoa
+ *
+ * Purpose:  Set the end-of-address marker for the file. This function is
+ *    called shortly after an existing HDF5 file is opened in order
+ *    to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    file->eoa = addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_get_eof
+ *
+ * Purpose:  Returns the end-of-file marker, which is the greater of
+ *    either the Unix end-of-file or the HDF5 end-of-address
+ *    markers.
+ *
+ * Return:  Success:  End of file address, the first address past
+ *        the end of the "file", either the Unix file
+ *        or the HDF5 file.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, 20 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_direct_get_eof(const H5FD_t *_file)
+{
+    const H5FD_direct_t  *file = (const H5FD_direct_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_diect_get_handle
+ *
+ * Purpose:        Returns the file handle of direct file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     Raymond Lu
+ *                 21 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_get_handle(H5FD_t *_file, hid_t H5_ATTR_UNUSED fapl, void** file_handle)
+{
+    H5FD_direct_t       *file = (H5FD_direct_t *)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(!file_handle)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
+    *file_handle = &(file->fd);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_read
+ *
+ * Purpose:  Reads SIZE bytes of data from FILE beginning at address ADDR
+ *    into buffer BUF according to data transfer properties in
+ *    DXPL_ID.
+ *
+ * Return:  Success:  Zero. Result is stored in caller-supplied
+ *        buffer BUF.
+ *
+ *    Failure:  -1, Contents of buffer BUF are undefined.
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, 21 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+         size_t size, void *buf/*out*/)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+    ssize_t    nbytes;
+    hbool_t    _must_align = TRUE;
+    herr_t        ret_value=SUCCEED;       /* Return value */
+    size_t    alloc_size;
+    void    *copy_buf = NULL, *p2;
+    size_t    _boundary;
+    size_t    _fbsize;
+    size_t    _cbsize;
+    haddr_t    read_size;              /* Size to read into copy buffer */
+    size_t    copy_size = size;       /* Size remaining to read when using copy buffer */
+    size_t              copy_offset;            /* Offset into copy buffer of the requested data */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if (HADDR_UNDEF==addr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
+    if (REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
+
+    /* If the system doesn't require data to be aligned, read the data in
+     * the same way as sec2 driver.
+     */
+    _must_align = file->fa.must_align;
+
+    /* Get the memory boundary for alignment, file system block size, and maximal
+     * copy buffer size.
+     */
+    _boundary = file->fa.mboundary;
+    _fbsize = file->fa.fbsize;
+    _cbsize = file->fa.cbsize;
+
+    /* if the data is aligned or the system doesn't require data to be aligned,
+     * read it directly from the file.  If not, read a bigger
+     * and aligned data first, then copy the data into memory buffer.
+     */
+    if(!_must_align || ((addr%_fbsize==0) && (size%_fbsize==0) && ((size_t)buf%_boundary==0))) {
+      /* Seek to the correct location */
+      if ((addr!=file->pos || OP_READ!=file->op) &&
+        HDlseek(file->fd, (HDoff_t)addr, SEEK_SET)<0)
+    HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+       /* Read the aligned data in file first, being careful of interrupted
+       * system calls and partial results. */
+      while (size>0) {
+    do {
+        nbytes = HDread(file->fd, buf, size);
+    } while (-1==nbytes && EINTR==errno);
+    if (-1==nbytes) /* error */
+        HSYS_GOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed")
+    if (0==nbytes) {
+        /* end of file but not end of format address space */
+        HDmemset(buf, 0, size);
+        break;
+    }
+    HDassert(nbytes>=0);
+    HDassert((size_t)nbytes<=size);
+    H5_CHECK_OVERFLOW(nbytes,ssize_t,size_t);
+    size -= (size_t)nbytes;
+    H5_CHECK_OVERFLOW(nbytes,ssize_t,haddr_t);
+    addr += (haddr_t)nbytes;
+    buf = (char*)buf + nbytes;
+      }
+    } else {
+            /* Calculate where we will begin copying from the copy buffer */
+            copy_offset = (size_t)(addr % _fbsize);
+
+      /* allocate memory needed for the Direct IO option up to the maximal
+       * copy buffer size. Make a bigger buffer for aligned I/O if size is
+       * smaller than maximal copy buffer. */
+      alloc_size = ((copy_offset + size - 1) / _fbsize + 1) * _fbsize;
+      if(alloc_size > _cbsize)
+        alloc_size = _cbsize;
+      HDassert(!(alloc_size % _fbsize));
+      if (HDposix_memalign(&copy_buf, _boundary, alloc_size) != 0)
+    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "HDposix_memalign failed")
+
+            /* look for the aligned position for reading the data */
+            HDassert(!(((addr / _fbsize) * _fbsize) % _fbsize));
+            if(HDlseek(file->fd, (HDoff_t)((addr / _fbsize) * _fbsize),
+                    SEEK_SET) < 0)
+                HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+
+      /*
+       * Read the aligned data in file into aligned buffer first, then copy the data
+       * into the final buffer.  If the data size is bigger than maximal copy buffer
+       * size, do the reading by segment (the outer while loop).  If not, do one step
+       * reading.
+       */
+      do {
+         /* Read the aligned data in file first.  Not able to handle interrupted
+     * system calls and partial results like sec2 driver does because the
+     * data may no longer be aligned. It's expecially true when the data in
+     * file is smaller than ALLOC_SIZE. */
+        HDmemset(copy_buf, 0, alloc_size);
+
+                /* Calculate how much data we have to read in this iteration
+                 * (including unused parts of blocks) */
+                if((copy_size + copy_offset) < alloc_size)
+                    read_size = ((copy_size + copy_offset - 1) / _fbsize + 1)
+                            * _fbsize;
+                else
+                    read_size = alloc_size;
+
+                HDassert(!(read_size % _fbsize));
+        do {
+        nbytes = HDread(file->fd, copy_buf, read_size);
+        } while(-1==nbytes && EINTR==errno);
+
+        if (-1==nbytes) /* error */
+        HSYS_GOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed")
+
+        /* Copy the needed data from the copy buffer to the output
+         * buffer, and update copy_size.  If the copy buffer does not
+                 * contain the rest of the data, just copy what's in the copy
+                 * buffer and also update read_addr and copy_offset to read the
+                 * next section of data. */
+        p2 = (unsigned char*)copy_buf + copy_offset;
+        if((copy_size + copy_offset) <= alloc_size) {
+            HDmemcpy(buf, p2, copy_size);
+            buf = (unsigned char *)buf + copy_size;
+            copy_size = 0;
+                } /* end if */
+                else {
+                    HDmemcpy(buf, p2, alloc_size - copy_offset);
+                    buf = (unsigned char*)buf + alloc_size - copy_offset;
+                    copy_size -= alloc_size - copy_offset;
+                    copy_offset = 0;
+                } /* end else */
+      } while (copy_size > 0);
+
+      /*Final step: update address*/
+      addr = (haddr_t)(((addr + size - 1) / _fbsize + 1) * _fbsize);
+
+      if(copy_buf) {
+                HDfree(copy_buf);
+                copy_buf = NULL;
+            } /* end if */
+    }
+
+    /* Update current position */
+    file->pos = addr;
+    file->op = OP_READ;
+
+done:
+    if(ret_value<0) {
+        if(copy_buf)
+            HDfree(copy_buf);
+
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_write
+ *
+ * Purpose:  Writes SIZE bytes of data to FILE beginning at address ADDR
+ *    from buffer BUF according to data transfer properties in
+ *    DXPL_ID.
+ *
+ * Return:  Success:  Zero
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, 21 September 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+    size_t size, const void *buf)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+    ssize_t    nbytes;
+    hbool_t    _must_align = TRUE;
+    herr_t        ret_value=SUCCEED;       /* Return value */
+    size_t    alloc_size;
+    void    *copy_buf = NULL, *p1;
+    const void    *p3;
+    size_t    _boundary;
+    size_t    _fbsize;
+    size_t    _cbsize;
+    haddr_t             write_addr;             /* Address to write copy buffer */
+    haddr_t             write_size;             /* Size to write from copy buffer */
+    haddr_t             read_size;              /* Size to read into copy buffer */
+    size_t              copy_size = size;       /* Size remaining to write when using copy buffer */
+    size_t              copy_offset;            /* Offset into copy buffer of the data to write */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if (HADDR_UNDEF==addr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
+    if (REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
+
+    /* If the system doesn't require data to be aligned, read the data in
+     * the same way as sec2 driver.
+     */
+    _must_align = file->fa.must_align;
+
+    /* Get the memory boundary for alignment, file system block size, and maximal
+     * copy buffer size.
+     */
+    _boundary = file->fa.mboundary;
+    _fbsize = file->fa.fbsize;
+    _cbsize = file->fa.cbsize;
+
+    /* if the data is aligned or the system doesn't require data to be aligned,
+     * write it directly to the file.  If not, read a bigger and aligned data
+     * first, update buffer with user data, then write the data out.
+     */
+    if(!_must_align || ((addr%_fbsize==0) && (size%_fbsize==0) && ((size_t)buf%_boundary==0))) {
+      /* Seek to the correct location */
+      if ((addr!=file->pos || OP_WRITE!=file->op) &&
+        HDlseek(file->fd, (HDoff_t)addr, SEEK_SET)<0)
+    HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+
+      while (size>0) {
+    do {
+        nbytes = HDwrite(file->fd, buf, size);
+    } while (-1==nbytes && EINTR==errno);
+    if (-1==nbytes) /* error */
+        HSYS_GOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+    HDassert(nbytes>0);
+    HDassert((size_t)nbytes<=size);
+    H5_CHECK_OVERFLOW(nbytes,ssize_t,size_t);
+    size -= (size_t)nbytes;
+    H5_CHECK_OVERFLOW(nbytes,ssize_t,haddr_t);
+    addr += (haddr_t)nbytes;
+    buf = (const char*)buf + nbytes;
+      }
+    } else {
+            /* Calculate where we will begin reading from (on disk) and where we
+             * will begin copying from the copy buffer */
+            write_addr = (addr / _fbsize) * _fbsize;
+            copy_offset = (size_t)(addr % _fbsize);
+
+      /* allocate memory needed for the Direct IO option up to the maximal
+       * copy buffer size. Make a bigger buffer for aligned I/O if size is
+       * smaller than maximal copy buffer.
+       */
+      alloc_size = ((copy_offset + size - 1) / _fbsize + 1) * _fbsize;
+            if(alloc_size > _cbsize)
+                alloc_size = _cbsize;
+            HDassert(!(alloc_size % _fbsize));
+
+      if (HDposix_memalign(&copy_buf, _boundary, alloc_size) != 0)
+    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "HDposix_memalign failed")
+
+            /* look for the right position for reading or writing the data */
+            if(HDlseek(file->fd, (HDoff_t)write_addr, SEEK_SET) < 0)
+                HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+
+      p3 = buf;
+      do {
+                /* Calculate how much data we have to write in this iteration
+                 * (including unused parts of blocks) */
+                if((copy_size + copy_offset) < alloc_size)
+                    write_size = ((copy_size + copy_offset - 1) / _fbsize + 1)
+                            * _fbsize;
+                else
+                    write_size = alloc_size;
+
+        /*
+          * Read the aligned data first if the aligned region doesn't fall
+         * entirely in the range to be writen.  Not able to handle interrupted
+     * system calls and partial results like sec2 driver does because the
+     * data may no longer be aligned. It's expecially true when the data in
+     * file is smaller than ALLOC_SIZE.  Only read the entire section if
+                 * both ends are misaligned, otherwise only read the block on the
+                 * misaligned end.
+         */
+        HDmemset(copy_buf, 0, _fbsize);
+
+                if(copy_offset > 0) {
+                    if((write_addr + write_size) > (addr + size)) {
+                        HDassert((write_addr + write_size) - (addr + size) < _fbsize);
+                        read_size = write_size;
+                        p1 = copy_buf;
+                    } /* end if */
+                    else {
+                        read_size = _fbsize;
+                        p1 = copy_buf;
+                    } /* end else */
+                } /* end if */
+                else if((write_addr + write_size) > (addr + size)) {
+                    HDassert((write_addr + write_size) - (addr + size) < _fbsize);
+                    read_size = _fbsize;
+                    p1 = (unsigned char *)copy_buf + write_size - _fbsize;
+
+                    /* Seek to the last block, for reading */
+                    HDassert(!((write_addr + write_size - _fbsize) % _fbsize));
+                    if(HDlseek(file->fd,
+                            (HDoff_t)(write_addr + write_size - _fbsize),
+                            SEEK_SET) < 0)
+                        HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+                } /* end if */
+                else
+                    p1 = NULL;
+
+                if(p1) {
+                    HDassert(!(read_size % _fbsize));
+                    do {
+                        nbytes = HDread(file->fd, p1, read_size);
+                    } while (-1==nbytes && EINTR==errno);
+
+                    if (-1==nbytes) /* error */
+                        HSYS_GOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed")
+                } /* end if */
+
+        /* look for the right position and append or copy the data to be written to
+          * the aligned buffer.
+               * Consider all possible situations here: file address is not aligned on
+               * file block size; the end of data address is not aligned; the end of data
+               * address is aligned; data size is smaller or bigger than maximal copy size.
+         */
+        p1 = (unsigned char *)copy_buf + copy_offset;
+        if((copy_size + copy_offset) <= alloc_size) {
+                    HDmemcpy(p1, p3, copy_size);
+                    copy_size = 0;
+                } /* end if */
+                else {
+                    HDmemcpy(p1, p3, alloc_size - copy_offset);
+                    p3 = (const unsigned char *)p3 + (alloc_size - copy_offset);
+                    copy_size -= alloc_size - copy_offset;
+                    copy_offset = 0;
+                } /* end else */
+
+        /*look for the aligned position for writing the data*/
+        HDassert(!(write_addr % _fbsize));
+        if(HDlseek(file->fd, (HDoff_t)write_addr, SEEK_SET) < 0)
+        HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+
+        /*
+          * Write the data. It doesn't truncate the extra data introduced by
+     * alignment because that step is done in H5FD_direct_flush.
+         */
+        HDassert(!(write_size % _fbsize));
+    do {
+        nbytes = HDwrite(file->fd, copy_buf, write_size);
+    } while (-1==nbytes && EINTR==errno);
+
+    if (-1==nbytes) /* error */
+        HSYS_GOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+
+              /* update the write address */
+              write_addr += write_size;
+  } while (copy_size > 0);
+
+  /*Update the address and size*/
+  addr = write_addr;
+  buf = (const char*)buf + size;
+
+  if(copy_buf) {
+      HDfree(copy_buf);
+      copy_buf = NULL;
+        } /* end if */
+    }
+
+    /* Update current position and eof */
+    file->pos = addr;
+    file->op = OP_WRITE;
+    if (file->pos>file->eof)
+        file->eof = file->pos;
+
+done:
+    if(ret_value<0) {
+        if(copy_buf)
+            HDfree(copy_buf);
+
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_direct_truncate
+ *
+ * Purpose:  Makes sure that the true file size is the same (or larger)
+ *    than the end-of-address.
+ *
+ * Return:  Success:  Non-negative
+ *
+ *    Failure:  Negative
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, 21 September 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;
+    herr_t        ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Extend the file to make sure it's large enough */
+    if (file->eoa!=file->eof) {
+#ifdef H5_HAVE_WIN32_API
+        HFILE filehandle;   /* Windows file handle */
+        LARGE_INTEGER li;   /* 64-bit integer for SetFilePointer() call */
+
+        /* Map the posix file handle to a Windows file handle */
+        filehandle = _get_osfhandle(file->fd);
+
+        /* Translate 64-bit integers into form Windows wants */
+        /* [This algorithm is from the Windows documentation for SetFilePointer()] */
+        li.QuadPart = (LONGLONG)file->eoa;
+        (void)SetFilePointer((HANDLE)filehandle,li.LowPart,&li.HighPart,FILE_BEGIN);
+        if(SetEndOfFile((HANDLE)filehandle)==0)
+            HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#else /* H5_HAVE_WIN32_API */
+        if (-1==HDftruncate(file->fd, (HDoff_t)file->eoa))
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#endif /* H5_HAVE_WIN32_API */
+
+        /* Update the eof value */
+        file->eof = file->eoa;
+
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    }
+    else if (file->fa.must_align){
+  /*Even though eof is equal to eoa, file is still truncated because Direct I/O
+   *write introduces some extra data for alignment.
+   */
+        if (-1==HDftruncate(file->fd, (HDoff_t)file->eof))
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_direct_truncate() */
+#endif /* H5_HAVE_DIRECT */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDdirect.h b/gatb-core/thirdparty/hdf5/src/H5FDdirect.h
new file mode 100644
index 0000000..26c70f3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDdirect.h
@@ -0,0 +1,57 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu <slu at hdfgroup.uiuc.edu>
+ *              Wednesday, 20 September 2006
+ *
+ * Purpose:	The public header file for the direct driver.
+ */
+#ifndef H5FDdirect_H
+#define H5FDdirect_H
+
+#include "H5Ipublic.h"
+
+#ifdef H5_HAVE_DIRECT
+#       define H5FD_DIRECT	(H5FD_direct_init())
+#else
+#       define H5FD_DIRECT      (-1)
+#endif /* H5_HAVE_DIRECT */
+
+#ifdef H5_HAVE_DIRECT
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Default values for memory boundary, file block size, and maximal copy buffer size.
+ * Application can set these values through the function H5Pset_fapl_direct. */
+#define MBOUNDARY_DEF		4096
+#define FBSIZE_DEF		4096
+#define CBSIZE_DEF		16*1024*1024
+
+H5_DLL hid_t H5FD_direct_init(void);
+H5_DLL void H5FD_direct_term(void);
+H5_DLL herr_t H5Pset_fapl_direct(hid_t fapl_id, size_t alignment, size_t block_size,
+			size_t cbuf_size);
+H5_DLL herr_t H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/,
+			size_t *block_size/*out*/, size_t *cbuf_size/*out*/);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5_HAVE_DIRECT */
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDfamily.c b/gatb-core/thirdparty/hdf5/src/H5FDfamily.c
new file mode 100644
index 0000000..8003fdd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDfamily.c
@@ -0,0 +1,1331 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Monday, November 10, 1997
+ *
+ * Purpose:	Implements a family of files that acts as a single hdf5
+ *		file.  The purpose is to be able to split a huge file on a
+ *		64-bit platform, transfer all the <2GB members to a 32-bit
+ *		platform, and then access the entire huge file on the 32-bit
+ *		platform.
+ *
+ *		All family members are logically the same size although their
+ *		physical sizes may vary.  The logical member size is
+ *		determined by looking at the physical size of the first member
+ *		when the file is opened.  When creating a file family, the
+ *		first member is created with a predefined physical size
+ *		(actually, this happens when the file family is flushed, and
+ *		can be quite time consuming on file systems that don't
+ *		implement holes, like nfs).
+ *
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FD_family_init_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FDfamily.h"         /* Family file driver 			*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+#undef MAX
+#define MAX(X,Y)	((X)>(Y)?(X):(Y))
+#undef MIN
+#define MIN(X,Y)	((X)<(Y)?(X):(Y))
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_FAMILY_g = 0;
+
+/* The description of a file belonging to this driver. */
+typedef struct H5FD_family_t {
+    H5FD_t	pub;		/*public stuff, must be first		*/
+    hid_t	memb_fapl_id;	/*file access property list for members	*/
+    hsize_t	memb_size;	/*actual size of each member file	*/
+    hsize_t	pmem_size;	/*member size passed in from property	*/
+    unsigned	nmembs;		/*number of family members		*/
+    unsigned	amembs;		/*number of member slots allocated	*/
+    H5FD_t	**memb;		/*dynamic array of member pointers	*/
+    haddr_t	eoa;		/*end of allocated addresses		*/
+    char	*name;		/*name generator printf format		*/
+    unsigned	flags;		/*flags for opening additional members	*/
+
+    /* Information from properties set by 'h5repart' tool */
+    hsize_t	mem_newsize;	/*new member size passed in as private
+                                 * property. It's used only by h5repart */
+    hbool_t     repart_members; /* Whether to mark the superblock dirty
+                                 * when it is loaded, so that the family
+                                 * member sizes can be re-encoded       */
+} H5FD_family_t;
+
+/* Driver-specific file access properties */
+typedef struct H5FD_family_fapl_t {
+    hsize_t	memb_size;	/*size of each member			*/
+    hid_t	memb_fapl_id;	/*file access property list of each memb*/
+} H5FD_family_fapl_t;
+
+/* Callback prototypes */
+static void *H5FD_family_fapl_get(H5FD_t *_file);
+static void *H5FD_family_fapl_copy(const void *_old_fa);
+static herr_t H5FD_family_fapl_free(void *_fa);
+static hsize_t H5FD_family_sb_size(H5FD_t *_file);
+static herr_t H5FD_family_sb_encode(H5FD_t *_file, char *name/*out*/,
+		     unsigned char *buf/*out*/);
+static herr_t H5FD_family_sb_decode(H5FD_t *_file, const char *name,
+                    const unsigned char *buf);
+static H5FD_t *H5FD_family_open(const char *name, unsigned flags,
+				hid_t fapl_id, haddr_t maxaddr);
+static herr_t H5FD_family_close(H5FD_t *_file);
+static int H5FD_family_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_family_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_family_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
+static haddr_t H5FD_family_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_family_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_family_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+			       size_t size, void *_buf/*out*/);
+static herr_t H5FD_family_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+				size_t size, const void *_buf);
+static herr_t H5FD_family_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+
+/* The class struct */
+static const H5FD_class_t H5FD_family_g = {
+    "family",					/*name			*/
+    HADDR_MAX,					/*maxaddr		*/
+    H5F_CLOSE_WEAK,				/*fc_degree		*/
+    H5FD_family_sb_size,			/*sb_size		*/
+    H5FD_family_sb_encode,			/*sb_encode		*/
+    H5FD_family_sb_decode,			/*sb_decode		*/
+    sizeof(H5FD_family_fapl_t),			/*fapl_size		*/
+    H5FD_family_fapl_get,			/*fapl_get		*/
+    H5FD_family_fapl_copy,			/*fapl_copy		*/
+    H5FD_family_fapl_free,			/*fapl_free		*/
+    0,						/*dxpl_size		*/
+    NULL,					/*dxpl_copy		*/
+    NULL,					/*dxpl_free		*/
+    H5FD_family_open,				/*open			*/
+    H5FD_family_close,				/*close			*/
+    H5FD_family_cmp,				/*cmp			*/
+    H5FD_family_query,		                /*query			*/
+    NULL,					/*get_type_map		*/
+    NULL,					/*alloc			*/
+    NULL,					/*free			*/
+    H5FD_family_get_eoa,			/*get_eoa		*/
+    H5FD_family_set_eoa,			/*set_eoa		*/
+    H5FD_family_get_eof,			/*get_eof		*/
+    H5FD_family_get_handle,                     /*get_handle            */
+    H5FD_family_read,				/*read			*/
+    H5FD_family_write,				/*write			*/
+    H5FD_family_flush,				/*flush			*/
+    H5FD_family_truncate,			/*truncate		*/
+    NULL,                                       /*lock                  */
+    NULL,                                       /*unlock                */
+    H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
+};
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FD_family_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FD_family_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5FD_family_init currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FD_family_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_family_init())
+} /* H5FD_family_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_init
+ *
+ * Purpose:	Initialize this driver by registering the driver with the
+ *		library.
+ *
+ * Return:	Success:	The driver ID for the family driver.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_family_init(void)
+{
+    hid_t ret_value = H5FD_FAMILY_g;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5I_VFL != H5I_get_type(H5FD_FAMILY_g))
+        H5FD_FAMILY_g = H5FD_register(&H5FD_family_g, sizeof(H5FD_class_t), FALSE);
+
+    /* Set return value */
+    ret_value = H5FD_FAMILY_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD_family_init() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:	H5FD_family_term
+ *
+ * Purpose:	Shut down the VFD
+ *
+ * Return:	<none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ * Modification:
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_family_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_FAMILY_g=0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_family_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_fapl_family
+ *
+ * Purpose:	Sets the file access property list FAPL_ID to use the family
+ *		driver. The MEMB_SIZE is the size in bytes of each file
+ *		member (used only when creating a new file) and the
+ *		MEMB_FAPL_ID is a file access property list to be used for
+ *		each family member.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_family(hid_t fapl_id, hsize_t msize, hid_t memb_fapl_id)
+{
+    herr_t ret_value;
+    H5FD_family_fapl_t	fa={0, -1};
+    H5P_genplist_t *plist;      /* Property list pointer */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ihi", fapl_id, msize, memb_fapl_id);
+
+
+    /* Check arguments */
+    if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+    if(H5P_DEFAULT == memb_fapl_id)
+        memb_fapl_id = H5P_FILE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(memb_fapl_id, H5P_FILE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
+
+    /*
+     * Initialize driver specific information. No need to copy it into the FA
+     * struct since all members will be copied by H5P_set_driver().
+     */
+    fa.memb_size = msize;
+    fa.memb_fapl_id = memb_fapl_id;
+
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+    ret_value= H5P_set_driver(plist, H5FD_FAMILY, &fa);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_fapl_family
+ *
+ * Purpose:	Returns information about the family file access property
+ *		list though the function arguments.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fapl_family(hid_t fapl_id, hsize_t *msize/*out*/,
+		   hid_t *memb_fapl_id/*out*/)
+{
+    H5FD_family_fapl_t	*fa;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", fapl_id, msize, memb_fapl_id);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
+    if(H5FD_FAMILY != H5P_get_driver(plist))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
+    if(NULL == (fa = (H5FD_family_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
+    if(msize)
+        *msize = fa->memb_size;
+    if(memb_fapl_id) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fa->memb_fapl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
+        *memb_fapl_id = H5P_copy_plist(plist, TRUE);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_fapl_get
+ *
+ * Purpose:	Gets a file access property list which could be used to
+ *		create an identical file.
+ *
+ * Return:	Success:	Ptr to new file access property list.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_family_fapl_get(H5FD_t *_file)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    H5FD_family_fapl_t	*fa = NULL;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    void *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (fa = (H5FD_family_fapl_t *)H5MM_calloc(sizeof(H5FD_family_fapl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    fa->memb_size = file->memb_size;
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(file->memb_fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+    fa->memb_fapl_id = H5P_copy_plist(plist, FALSE);
+
+    /* Set return value */
+    ret_value=fa;
+
+done:
+    if(ret_value==NULL) {
+        if(fa!=NULL)
+            H5MM_xfree(fa);
+    } /* end if */
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_fapl_copy
+ *
+ * Purpose:	Copies the family-specific file access properties.
+ *
+ * Return:	Success:	Ptr to a new property list
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_family_fapl_copy(const void *_old_fa)
+{
+    const H5FD_family_fapl_t *old_fa = (const H5FD_family_fapl_t*)_old_fa;
+    H5FD_family_fapl_t *new_fa = NULL;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    void *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (new_fa = (H5FD_family_fapl_t *)H5MM_malloc(sizeof(H5FD_family_fapl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the fields of the structure */
+    HDmemcpy(new_fa, old_fa, sizeof(H5FD_family_fapl_t));
+
+    /* Deep copy the property list objects in the structure */
+    if(old_fa->memb_fapl_id==H5P_FILE_ACCESS_DEFAULT) {
+        if(H5I_inc_ref(new_fa->memb_fapl_id, FALSE)<0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
+    } /* end if */
+    else {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(old_fa->memb_fapl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+        new_fa->memb_fapl_id = H5P_copy_plist(plist, FALSE);
+    } /* end else */
+
+    /* Set return value */
+    ret_value=new_fa;
+
+done:
+    if(ret_value==NULL) {
+        if(new_fa!=NULL)
+            H5MM_xfree(new_fa);
+    } /* end if */
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_fapl_free
+ *
+ * Purpose:	Frees the family-specific file access properties.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_fapl_free(void *_fa)
+{
+    H5FD_family_fapl_t	*fa = (H5FD_family_fapl_t*)_fa;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(H5I_dec_ref(fa->memb_fapl_id) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "can't close driver ID")
+    H5MM_xfree(fa);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_sb_size
+ *
+ * Purpose:	Returns the size of the private information to be stored in
+ *		the superblock.
+ *
+ * Return:	Success:	The super block driver data size.
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Raymond Lu
+ *              Tuesday, May 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5FD_family_sb_size(H5FD_t H5_ATTR_UNUSED *_file)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* 8 bytes field for the size of member file size field should be
+     * enough for now. */
+    FUNC_LEAVE_NOAPI(8)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_sb_encode
+ *
+ * Purpose:	Encode driver information for the superblock. The NAME
+ *		argument is a nine-byte buffer which will be initialized with
+ *		an eight-character name/version number and null termination.
+ *
+ *		The encoding is the member file size and name template.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *              Tuesday, May 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_sb_encode(H5FD_t *_file, char *name/*out*/, unsigned char *buf/*out*/)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Name and version number */
+    HDstrncpy(name, "NCSAfami", (size_t)9);
+    name[8] = '\0';
+
+    /* Store member file size.  Use the member file size from the property here.
+     * This is to guarantee backward compatibility.  If a file is created with
+     * v1.6 library and the driver info isn't saved in the superblock.  We open
+     * it with v1.8, the FILE->MEMB_SIZE will be the actual size of the first
+     * member file (see H5FD_family_open).  So it isn't safe to use FILE->MEMB_SIZE.
+     * If the file is created with v1.8, the correctness of FILE->PMEM_SIZE is
+     * checked in H5FD_family_sb_decode. SLU - 2009/3/21
+     */
+    UINT64ENCODE(buf, (uint64_t)file->pmem_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_family_sb_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_sb_decode
+ *
+ * Purpose:	This function has 2 seperate purpose.  One is to decodes the
+ *              superblock information for this driver. The NAME argument is
+ *              the eight-character (plus null termination) name stored in i
+ *              the file.  The FILE argument is updated according to the
+ *              information in the superblock.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *              Tuesday, May 10, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_sb_decode(H5FD_t *_file, const char H5_ATTR_UNUSED *name, const unsigned char *buf)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    uint64_t            msize;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Read member file size. Skip name template for now although it's saved. */
+    UINT64DECODE(buf, msize);
+
+    /* For h5repart only. Private property of new member size is used to signal
+     * h5repart is being used to change member file size.  h5repart will open
+     * files for read and write.  When the files are closed, metadata will be
+     * flushed to the files and updated to this new size */
+    if(file->mem_newsize) {
+        file->memb_size = file->pmem_size = file->mem_newsize;
+        HGOTO_DONE(ret_value)
+    } /* end if */
+
+    /* Default - use the saved member size */
+    if(file->pmem_size == H5F_FAMILY_DEFAULT)
+       file->pmem_size = msize;
+
+    /* Check if member size from file access property is correct */
+    if(msize != file->pmem_size) {
+        char err_msg[128];
+
+        HDsnprintf(err_msg, sizeof(err_msg), "Family member size should be %lu.  But the size from file access property is %lu", (unsigned long)msize, (unsigned long)file->pmem_size);
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, err_msg)
+    } /* end if */
+
+    /* Update member file size to the size saved in the superblock.
+     * That's the size intended to be. */
+    file->memb_size = msize;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_sb_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_open
+ *
+ * Purpose:	Creates and/or opens a family of files as an HDF5 file.
+ *
+ * Return:	Success:	A pointer to a new file dat structure. The
+ *				public fields will be initialized by the
+ *				caller, which is always H5FD_open().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              Thursday, November 18, 2004
+ *              When file is re-opened, member size passed in from access property
+ *              is checked to see if it's reasonable.  If there is only 1 member
+ *              file, member size can't be smaller than current member size.
+ *              If there are at least 2 member files, member size can only be equal
+ *              the 1st member size.
+ *
+ *              Raymond Lu
+ *              Tuesday, May 24, 2005
+ *              The modification described above has been changed.  The major checking
+ *              is done in H5F_read_superblock.  Member file size is saved in the
+ *              superblock now.  H5F_read_superblock() reads this saved size and compare
+ *              to the size passed in from file access property.  Wrong size will
+ *              result in a failure.
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
+		 haddr_t maxaddr)
+{
+    H5FD_family_t	*file=NULL;
+    H5FD_t     		*ret_value=NULL;
+    char		memb_name[4096], temp[4096];
+    hsize_t		eof=HADDR_UNDEF;
+    unsigned		t_flags = flags & ~H5F_ACC_CREAT;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
+    if(0 == maxaddr || HADDR_UNDEF == maxaddr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
+
+    /* Initialize file from file access properties */
+    if(NULL == (file = (H5FD_family_t *)H5MM_calloc(sizeof(H5FD_family_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
+    if(H5P_FILE_ACCESS_DEFAULT==fapl_id) {
+        file->memb_fapl_id = H5P_FILE_ACCESS_DEFAULT;
+        if(H5I_inc_ref(file->memb_fapl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
+        file->memb_size = 1024 * 1024 * 1024; /*1GB. Actual member size to be updated later */
+        file->pmem_size = 1024 * 1024 * 1024; /*1GB. Member size passed in through property */
+        file->mem_newsize = 0;            /*New member size used by h5repart only       */
+    } /* end if */
+    else {
+        H5P_genplist_t      *plist;      /* Property list pointer */
+        H5FD_family_fapl_t *fa;
+
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+        if(NULL == (fa = (H5FD_family_fapl_t *)H5P_get_driver_info(plist)))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
+
+        /* Check for new family file size. It's used by h5repart only. */
+        if(H5P_exist_plist(plist, H5F_ACS_FAMILY_NEWSIZE_NAME) > 0) {
+            hsize_t fam_newsize = 0;        /* New member size, when repartitioning */
+
+            /* Get the new family file size */
+            if(H5P_get(plist, H5F_ACS_FAMILY_NEWSIZE_NAME, &fam_newsize) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get new family member size")
+
+            /* Store information for later */
+            file->mem_newsize = fam_newsize; /* New member size passed in through property */
+            file->repart_members = TRUE;
+        } /* end if */
+
+        if(fa->memb_fapl_id==H5P_FILE_ACCESS_DEFAULT) {
+            if(H5I_inc_ref(fa->memb_fapl_id, FALSE)<0)
+                HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
+            file->memb_fapl_id = fa->memb_fapl_id;
+        } /* end if */
+        else {
+            if(NULL == (plist = (H5P_genplist_t *)H5I_object(fa->memb_fapl_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+            file->memb_fapl_id = H5P_copy_plist(plist, FALSE);
+        } /* end else */
+        file->memb_size = fa->memb_size; /* Actual member size to be updated later */
+        file->pmem_size = fa->memb_size; /* Member size passed in through property */
+    } /* end else */
+    file->name = H5MM_strdup(name);
+    file->flags = flags;
+
+    /* Check that names are unique */
+    HDsnprintf(memb_name, sizeof(memb_name), name, 0);
+    HDsnprintf(temp, sizeof(temp), name, 1);
+    if(!HDstrcmp(memb_name, temp))
+        HGOTO_ERROR(H5E_FILE, H5E_FILEEXISTS, NULL, "file names not unique")
+
+    /* Open all the family members */
+    while(1) {
+        HDsnprintf(memb_name, sizeof(memb_name), name, file->nmembs);
+
+        /* Enlarge member array */
+        if(file->nmembs >= file->amembs) {
+            unsigned n = MAX(64, 2 * file->amembs);
+            H5FD_t **x;
+
+            HDassert(n > 0);
+            if(NULL == (x = (H5FD_t **)H5MM_realloc(file->memb, n * sizeof(H5FD_t *))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to reallocate members")
+            file->amembs = n;
+            file->memb = x;
+        } /* end if */
+
+        /*
+         * Attempt to open file. If the first file cannot be opened then fail;
+         * otherwise an open failure means that we've reached the last member.
+         * Allow H5F_ACC_CREAT only on the first family member.
+         */
+        H5E_BEGIN_TRY {
+            file->memb[file->nmembs] = H5FDopen(memb_name,
+                (0==file->nmembs ? flags : t_flags), file->memb_fapl_id, HADDR_UNDEF);
+        } H5E_END_TRY;
+        if (!file->memb[file->nmembs]) {
+            if (0==file->nmembs)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open member file")
+            H5E_clear_stack(NULL);
+            break;
+        }
+        file->nmembs++;
+    }
+
+    /* If the file is reopened and there's only one member file existing, this file maybe
+     * smaller than the size specified through H5Pset_fapl_family().  Update the actual
+     * member size.
+     */
+    if ((eof=H5FDget_eof(file->memb[0]))) file->memb_size = eof;
+
+    ret_value=(H5FD_t *)file;
+
+done:
+    /* Cleanup and fail */
+    if(ret_value == NULL && file != NULL) {
+        unsigned nerrors = 0;   /* Number of errors closing member files */
+        unsigned u;             /* Local index variable */
+
+        /* Close as many members as possible. Use private function here to avoid clearing
+         * the error stack. We need the error message to indicate wrong member file size. */
+        for(u = 0; u < file->nmembs; u++)
+            if(file->memb[u])
+                if(H5FD_close(file->memb[u]) < 0)
+                    nerrors++;
+        if(nerrors)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "unable to close member files")
+
+        if(file->memb)
+            H5MM_xfree(file->memb);
+        if(H5I_dec_ref(file->memb_fapl_id) < 0)
+            HDONE_ERROR(H5E_VFL, H5E_CANTDEC, NULL, "can't close driver ID")
+        if(file->name)
+            H5MM_xfree(file->name);
+        H5MM_xfree(file);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_close
+ *
+ * Purpose:	Closes a family of files.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative with as many members closed as
+ *				possible. The only subsequent operation
+ *				permitted on the file is a close operation.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_close(H5FD_t *_file)
+{
+    H5FD_family_t *file = (H5FD_family_t*)_file;
+    unsigned	nerrors = 0;    /* Number of errors while closing member files */
+    unsigned	u;              /* Local index variable */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Close as many members as possible. Use private function here to avoid clearing
+     * the error stack. We need the error message to indicate wrong member file size. */
+    for(u = 0; u < file->nmembs; u++) {
+        if(file->memb[u]) {
+            if(H5FD_close(file->memb[u]) < 0)
+                nerrors++;
+            else
+                file->memb[u] = NULL;
+        } /* end if */
+    } /* end for */
+    if(nerrors)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close member files")
+
+    /* Clean up other stuff */
+    if(H5I_dec_ref(file->memb_fapl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "can't close driver ID")
+    H5MM_xfree(file->memb);
+    H5MM_xfree(file->name);
+    H5MM_xfree(file);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_cmp
+ *
+ * Purpose:	Compares two file families to see if they are the same. It
+ *		does this by comparing the first member of the two families.
+ *
+ * Return:	Success:	like strcmp()
+ *
+ *		Failure:	never fails (arguments were checked by the
+ *				caller).
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_family_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_family_t	*f1 = (const H5FD_family_t*)_f1;
+    const H5FD_family_t	*f2 = (const H5FD_family_t*)_f2;
+    int ret_value=(H5FD_VFD_DEFAULT);
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    assert(f1->nmembs>=1 && f1->memb[0]);
+    assert(f2->nmembs>=1 && f2->memb[0]);
+
+    ret_value= H5FDcmp(f1->memb[0], f2->memb[0]);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_query
+ *
+ * Purpose:	Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5FD_family_query(const H5FD_t * _file, unsigned long *flags /* out */)
+{
+    const H5FD_family_t	*file = (const H5FD_family_t*)_file;    /* Family VFD info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes. */
+        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+
+        /* Check for flags that are set by h5repart */
+        if(file && file->repart_members)
+            *flags |= H5FD_FEAT_DIRTY_SBLK_LOAD; /* Mark the superblock dirty when it is loaded (so the family member sizes are rewritten) */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_family_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_get_eoa
+ *
+ * Purpose:	Returns the end-of-address marker for the file. The EOA
+ *		marker is the first address past the last byte allocated in
+ *		the format address space.
+ *
+ * Return:	Success:	The end-of-address-marker
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_family_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_family_t	*file = (const H5FD_family_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_set_eoa
+ *
+ * Purpose:	Set the end-of-address marker for the file.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t abs_eoa)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    haddr_t		addr = abs_eoa;
+    char		memb_name[4096];
+    unsigned		u;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    for(u = 0; addr || u < file->nmembs; u++) {
+
+        /* Enlarge member array */
+        if(u >= file->amembs) {
+            unsigned n = MAX(64, 2 * file->amembs);
+            H5FD_t **x = (H5FD_t **)H5MM_realloc(file->memb, n * sizeof(H5FD_t *));
+
+            if(!x)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory block")
+            file->amembs = n;
+            file->memb = x;
+            file->nmembs = u;
+        } /* end if */
+
+        /* Create another file if necessary */
+        if(u >= file->nmembs || !file->memb[u]) {
+            file->nmembs = MAX(file->nmembs, u+1);
+            HDsnprintf(memb_name, sizeof(memb_name), file->name, u);
+            H5E_BEGIN_TRY {
+                H5_CHECK_OVERFLOW(file->memb_size, hsize_t, haddr_t);
+                file->memb[u] = H5FDopen(memb_name, file->flags | H5F_ACC_CREAT,
+                             file->memb_fapl_id, (haddr_t)file->memb_size);
+            } H5E_END_TRY;
+            if(NULL == file->memb[u])
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open member file")
+        } /* end if */
+
+        /* Set the EOA marker for the member */
+        /* (Note compensating for base address addition in internal routine) */
+        H5_CHECK_OVERFLOW(file->memb_size, hsize_t, haddr_t);
+        if(addr > (haddr_t)file->memb_size) {
+            if(H5FD_set_eoa(file->memb[u], type, ((haddr_t)file->memb_size - file->pub.base_addr)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set file eoa")
+            addr -= file->memb_size;
+        } /* end if */
+        else {
+            if(H5FD_set_eoa(file->memb[u], type, (addr - file->pub.base_addr)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set file eoa")
+            addr = 0;
+        } /* end else */
+    } /* end for */
+
+    file->eoa = abs_eoa;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_get_eof
+ *
+ * Purpose:	Returns the end-of-file marker, which is the greater of
+ *		either the total family size or the current EOA marker.
+ *
+ * Return:	Success:	End of file address, the first address past
+ *				the end of the family of files or the current
+ *				EOA, whichever is larger.
+ *
+ *		Failure:      	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_family_get_eof(const H5FD_t *_file)
+{
+    const H5FD_family_t	*file = (const H5FD_family_t*)_file;
+    haddr_t		eof=0;
+    int			i;      /* Local index variable */
+    haddr_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Find the last member that has a non-zero EOF and break out of the loop
+     * with `i' equal to that member. If all members have zero EOF then exit
+     * loop with i==0.
+     */
+    HDassert(file->nmembs > 0);
+    for(i = (int)file->nmembs - 1; i >= 0; --i) {
+        if((eof = H5FD_get_eof(file->memb[i])) != 0)
+            break;
+        if(0 == i)
+            break;
+    } /* end for */
+
+    /* Adjust for base address for file */
+    eof += file->pub.base_addr;
+
+    /*
+     * The file size is the number of members before the i'th member plus the
+     * size of the i'th member.
+     */
+    eof += ((unsigned)i)*file->memb_size;
+
+    /* Set return value */
+    ret_value = MAX(eof, file->eoa);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_family_get_handle
+ *
+ * Purpose:        Returns the file handle of FAMILY file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+{
+    H5FD_family_t       *file = (H5FD_family_t *)_file;
+    H5P_genplist_t      *plist;
+    hsize_t             offset;
+    int                 memb;
+    herr_t              ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get the plist structure and family offset */
+    if(NULL == (plist = H5P_object_verify(fapl, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+    if(H5P_get(plist, H5F_ACS_FAMILY_OFFSET_NAME, &offset) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get offset for family driver")
+
+    if(offset > (file->memb_size * file->nmembs))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "offset is bigger than file size")
+    memb = (int)(offset/file->memb_size);
+
+    ret_value = H5FD_get_vfd_handle(file->memb[memb], fapl, file_handle);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_read
+ *
+ * Purpose:	Reads SIZE bytes of data from FILE beginning at address ADDR
+ *		into buffer BUF according to data transfer properties in
+ *		DXPL_ID.
+ *
+ * Return:	Success:	Zero. Result is stored in caller-supplied
+ *				buffer BUF.
+ *
+ *		Failure:	-1, contents of buffer BUF are undefined.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
+		 void *_buf/*out*/)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    unsigned char	*buf = (unsigned char*)_buf;
+    haddr_t		sub;
+    size_t		req;
+    hsize_t             tempreq;
+    unsigned		u;              /* Local index variable */
+    H5P_genplist_t      *plist;      /* Property list pointer */
+    herr_t              ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Get the member data transfer property list. If the transfer property
+     * list does not belong to this driver then assume defaults
+     */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    /* Read from each member */
+    while(size > 0) {
+        H5_CHECKED_ASSIGN(u, unsigned, addr / file->memb_size, hsize_t);
+
+        sub = addr % file->memb_size;
+
+	/* This check is for mainly for IA32 architecture whose size_t's size
+	 * is 4 bytes, to prevent overflow when user application is trying to
+	 * write files bigger than 4GB. */
+        tempreq = file->memb_size-sub;
+  	if(tempreq > SIZET_MAX)
+	    tempreq = SIZET_MAX;
+        req = MIN(size, (size_t)tempreq);
+
+        HDassert(u<file->nmembs);
+
+        if (H5FDread(file->memb[u], type, dxpl_id, sub, req, buf)<0)
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "member file read failed")
+
+        addr += req;
+        buf += req;
+        size -= req;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_write
+ *
+ * Purpose:	Writes SIZE bytes of data to FILE beginning at address ADDR
+ *		from buffer BUF according to data transfer properties in
+ *		DXPL_ID.
+ *
+ * Return:	Success:	Zero
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
+		  const void *_buf)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    const unsigned char	*buf = (const unsigned char*)_buf;
+    haddr_t		sub;
+    size_t		req;
+    hsize_t             tempreq;
+    unsigned		u;      /* Local index variable */
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Get the member data transfer property list. If the transfer property
+     * list does not belong to this driver then assume defaults.
+     */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    /* Write to each member */
+    while (size>0) {
+        H5_CHECKED_ASSIGN(u, unsigned, addr / file->memb_size, hsize_t);
+
+        sub = addr % file->memb_size;
+
+        /* This check is for mainly for IA32 architecture whose size_t's size
+         * is 4 bytes, to prevent overflow when user application is trying to
+         * write files bigger than 4GB. */
+        tempreq = file->memb_size-sub;
+	if(tempreq > SIZET_MAX)
+	    tempreq = SIZET_MAX;
+        req = MIN(size, (size_t)tempreq);
+
+        HDassert(u<file->nmembs);
+
+        if (H5FDwrite(file->memb[u], type, dxpl_id, sub, req, buf)<0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "member file write failed")
+
+        addr += req;
+        buf += req;
+        size -= req;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_flush
+ *
+ * Purpose:	Flushes all family members.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1, as many files flushed as possible.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    unsigned		u, nerrors = 0;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    for(u = 0; u < file->nmembs; u++)
+        if(file->memb[u] && H5FD_flush(file->memb[u], dxpl_id, closing) < 0)
+            nerrors++;
+
+    if(nerrors)
+        HGOTO_ERROR(H5E_IO, H5E_BADVALUE, FAIL, "unable to flush member files")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_family_truncate
+ *
+ * Purpose:	Truncates all family members.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1, as many files truncated as possible.
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, February 23, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+{
+    H5FD_family_t	*file = (H5FD_family_t*)_file;
+    unsigned		u, nerrors = 0;
+    herr_t      	ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    for(u = 0; u < file->nmembs; u++)
+        if(file->memb[u] && H5FD_truncate(file->memb[u], dxpl_id, closing) < 0)
+            nerrors++;
+
+    if(nerrors)
+        HGOTO_ERROR(H5E_IO, H5E_BADVALUE, FAIL, "unable to flush member files")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_truncate() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDfamily.h b/gatb-core/thirdparty/hdf5/src/H5FDfamily.h
new file mode 100644
index 0000000..dcb63e6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDfamily.h
@@ -0,0 +1,44 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  4, 1999
+ *
+ * Purpose:	The public header file for the family driver.
+ */
+#ifndef H5FDfamily_H
+#define H5FDfamily_H
+
+#include "H5Ipublic.h"
+
+#define H5FD_FAMILY	(H5FD_family_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5_DLL hid_t H5FD_family_init(void);
+H5_DLL void H5FD_family_term(void);
+H5_DLL herr_t H5Pset_fapl_family(hid_t fapl_id, hsize_t memb_size,
+			  hid_t memb_fapl_id);
+H5_DLL herr_t H5Pget_fapl_family(hid_t fapl_id, hsize_t *memb_size/*out*/,
+			  hid_t *memb_fapl_id/*out*/);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDint.c b/gatb-core/thirdparty/hdf5/src/H5FDint.c
new file mode 100644
index 0000000..3575340
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDint.c
@@ -0,0 +1,387 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FDint.c
+ *			Jan 17 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal routine for VFD operations
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FD_int_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5FDpkg.h"		/* File Drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FD_int_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FD_int_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5FD_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FD_int_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_init())
+} /* H5FD_int_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_locate_signature
+ *
+ * Purpose:     Finds the HDF5 superblock signature in a file.  The
+ *              signature can appear at address 0, or any power of two
+ *              beginning with 512.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, November  7, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_addr)
+{
+    haddr_t         addr, eoa;
+    uint8_t         buf[H5F_SIGNATURE_LEN];
+    unsigned        n, maxpow;
+    herr_t          ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Find the least N such that 2^N is larger than the file size */
+    if(HADDR_UNDEF == (addr = H5FD_get_eof(file)) || HADDR_UNDEF == (eoa = H5FD_get_eoa(file, H5FD_MEM_SUPER)))
+        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to obtain EOF/EOA value")
+    for(maxpow = 0; addr; maxpow++)
+        addr >>= 1;
+    maxpow = MAX(maxpow, 9);
+
+    /*
+     * Search for the file signature at format address zero followed by
+     * powers of two larger than 9.
+     */
+    for(n = 8; n < maxpow; n++) {
+        addr = (8 == n) ? 0 : (haddr_t)1 << n;
+        if(H5FD_set_eoa(file, H5FD_MEM_SUPER, addr + H5F_SIGNATURE_LEN) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to set EOA value for file signature")
+        if(H5FD_read(file, dxpl, H5FD_MEM_SUPER, addr, (size_t)H5F_SIGNATURE_LEN, buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to read file signature")
+        if(!HDmemcmp(buf, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN))
+            break;
+    } /* end for */
+
+    /*
+     * If the signature was not found then reset the EOA value and return
+     * HADDR_UNDEF.
+     */
+    if(n >= maxpow) {
+        if(H5FD_set_eoa(file, H5FD_MEM_SUPER, eoa) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to reset EOA value")
+        *sig_addr = HADDR_UNDEF;
+    } /* end if */
+    else
+        /* Set return value */
+        *sig_addr = addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_locate_signature() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_read
+ *
+ * Purpose:	Private version of H5FDread()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t addr,
+    size_t size, void *buf/*out*/)
+{
+    haddr_t     eoa = HADDR_UNDEF;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(buf);
+
+#ifndef H5_HAVE_PARALLEL
+    /* Do not return early for Parallel mode since the I/O could be a */
+    /* collective transfer. */
+    /* The no-op case */
+    if(0 == size)
+        HGOTO_DONE(SUCCEED)
+#endif /* H5_HAVE_PARALLEL */
+
+    if(HADDR_UNDEF == (eoa = (file->cls->get_eoa)(file, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver get_eoa request failed")
+    if((addr + file->base_addr + size) > eoa)
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size=%llu, eoa=%llu", 
+                    (unsigned long long)(addr+ file->base_addr), (unsigned long long)size, (unsigned long long)eoa)
+
+    /* Dispatch to driver */
+    if((file->cls->read)(file, type, H5P_PLIST_ID(dxpl), addr + file->base_addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "driver read request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_write
+ *
+ * Purpose:	Private version of H5FDwrite()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t addr,
+    size_t size, const void *buf)
+{
+    haddr_t     eoa = HADDR_UNDEF;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(buf);
+
+#ifndef H5_HAVE_PARALLEL
+    /* Do not return early for Parallel mode since the I/O could be a */
+    /* collective transfer. */
+    /* The no-op case */
+    if(0 == size)
+        HGOTO_DONE(SUCCEED)
+#endif /* H5_HAVE_PARALLEL */
+
+    if(HADDR_UNDEF == (eoa = (file->cls->get_eoa)(file, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver get_eoa request failed")
+    if((addr + file->base_addr + size) > eoa)
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size=%llu, eoa=%llu", 
+                    (unsigned long long)(addr+ file->base_addr), (unsigned long long)size, (unsigned long long)eoa)
+
+    /* Dispatch to driver */
+    if((file->cls->write)(file, type, H5P_PLIST_ID(dxpl), addr + file->base_addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "driver write request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_set_eoa
+ *
+ * Purpose:	Private version of H5FDset_eoa()
+ *
+ *              This function expects the EOA is a RELATIVE address, i.e.
+ *              relative to the base address.  This is NOT the same as the
+ *              EOA stored in the superblock, which is an absolute
+ *              address.  Object addresses are relative.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative, no side effect
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_set_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+    HDassert(H5F_addr_defined(addr) && addr <= file->maxaddr);
+
+    /* Dispatch to driver, convert to absolute address */
+    if((file->cls->set_eoa)(file, type, addr + file->base_addr) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver set_eoa request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_set_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_eoa
+ *
+ * Purpose:	Private version of H5FDget_eoa()
+ *
+ *              This function returns the EOA as a RELATIVE address, i.e.
+ *              relative to the base address.  This is NOT the same as the
+ *              EOA stored in the superblock, which is an absolute
+ *              address.  Object addresses are relative.
+ *
+ * Return:	Success:	First byte after allocated memory.
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type)
+{
+    haddr_t	ret_value;
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    HDassert(file && file->cls);
+
+    /* Dispatch to driver */
+    if(HADDR_UNDEF == (ret_value = (file->cls->get_eoa)(file, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed")
+
+    /* Adjust for base address in file (convert to relative address) */
+    ret_value -= file->base_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_eof
+ *
+ * Purpose:	Private version of H5FDget_eof()
+ *
+ *              This function returns the EOF as a RELATIVE address, i.e.
+ *              relative to the base address.  This will be different
+ *              from  the end of the physical file if there is a user
+ *              block.
+ *
+ * Return:	Success:	The EOF address.
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_get_eof(const H5FD_t *file)
+{
+    haddr_t	ret_value;
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    HDassert(file && file->cls);
+
+    /* Dispatch to driver */
+    if(file->cls->get_eof) {
+	if(HADDR_UNDEF == (ret_value = (file->cls->get_eof)(file)))
+	    HGOTO_ERROR(H5E_VFL, H5E_CANTGET, HADDR_UNDEF, "driver get_eof request failed")
+    } /* end if */
+    else
+	ret_value = file->maxaddr;
+
+    /* Adjust for base address in file (convert to relative address)  */
+    ret_value -= file->base_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_eof() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDlog.c b/gatb-core/thirdparty/hdf5/src/H5FDlog.c
new file mode 100644
index 0000000..c42e124
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDlog.c
@@ -0,0 +1,1542 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Monday, April 17, 2000
+ *
+ * Purpose:     The POSIX unbuffered file driver using only the HDF5 public
+ *              API and with a few optimizations: the lseek() call is made
+ *              only when the current file position is unknown or needs to be
+ *              changed based on previous I/O through this driver (don't mix
+ *              I/O from this driver with I/O from other parts of the
+ *              application to the same file).
+ *              With custom modifications...
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FD_log_init_interface
+
+
+#include "H5private.h"      /* Generic Functions    */
+#include "H5Eprivate.h"     /* Error handling       */
+#include "H5Fprivate.h"     /* File access          */
+#include "H5FDprivate.h"    /* File drivers         */
+#include "H5FDlog.h"        /* Logging file driver  */
+#include "H5FLprivate.h"    /* Free Lists           */
+#include "H5Iprivate.h"     /* IDs                  */
+#include "H5MMprivate.h"    /* Memory management    */
+#include "H5Pprivate.h"     /* Property lists       */
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_LOG_g = 0;
+
+/* Driver-specific file access properties */
+typedef struct H5FD_log_fapl_t {
+    char *logfile;              /* Allocated log file name */
+    unsigned long long flags;   /* Flags for logging behavior */
+    size_t buf_size;            /* Size of buffers for track flavor and number of times each byte is accessed */
+} H5FD_log_fapl_t;
+
+/* Define strings for the different file memory types
+ * These are defined in the H5F_mem_t enum from H5Fpublic.h
+ * Note that H5FD_MEM_NOLIST is not listed here since it has
+ * a negative value.
+ */
+static const char *flavors[]={
+    "H5FD_MEM_DEFAULT",
+    "H5FD_MEM_SUPER",
+    "H5FD_MEM_BTREE",
+    "H5FD_MEM_DRAW",
+    "H5FD_MEM_GHEAP",
+    "H5FD_MEM_LHEAP",
+    "H5FD_MEM_OHDR",
+};
+
+/* The description of a file belonging to this driver. The `eoa' and `eof'
+ * determine the amount of hdf5 address space in use and the high-water mark
+ * of the file (the current size of the underlying filesystem file). The
+ * `pos' value is used to eliminate file position updates when they would be a
+ * no-op. Unfortunately we've found systems that use separate file position
+ * indicators for reading and writing so the lseek can only be eliminated if
+ * the current operation is the same as the previous operation.  When opening
+ * a file the `eof' will be set to the current file size, `eoa' will be set
+ * to zero, `pos' will be set to H5F_ADDR_UNDEF (as it is when an error
+ * occurs), and `op' will be set to H5F_OP_UNKNOWN.
+ */
+typedef struct H5FD_log_t {
+    H5FD_t          pub;    /* public stuff, must be first      */
+    int             fd;     /* the unix file                    */
+    haddr_t         eoa;    /* end of allocated region          */
+    haddr_t         eof;    /* end of file; current file size   */
+    haddr_t         pos;    /* current file I/O position        */
+    H5FD_file_op_t  op;     /* last operation                   */
+    char            filename[H5FD_MAX_FILENAME_LEN];    /* Copy of file name from open operation */
+#ifndef H5_HAVE_WIN32_API
+    /* On most systems the combination of device and i-node number uniquely
+     * identify a file.  Note that Cygwin, MinGW and other Windows POSIX
+     * environments have the stat function (which fakes inodes)
+     * and will use the 'device + inodes' scheme as opposed to the
+     * Windows code further below.
+     */
+    dev_t           device;         /* file device number   */
+    ino_t           inode;          /* file i-node number   */
+#else
+    /* Files in windows are uniquely identified by the volume serial
+     * number and the file index (both low and high parts).
+     *
+     * There are caveats where these numbers can change, especially
+     * on FAT file systems.  On NTFS, however, a file should keep
+     * those numbers the same until renamed or deleted (though you
+     * can use ReplaceFile() on NTFS to keep the numbers the same
+     * while renaming).
+     *
+     * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
+     * more information.
+     *
+     * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
+     */
+    DWORD           nFileIndexLow;
+    DWORD           nFileIndexHigh;
+    DWORD           dwVolumeSerialNumber;
+    
+    HANDLE          hFile;      /* Native windows file handle */
+#endif  /* H5_HAVE_WIN32_API */
+
+    /* Information from properties set by 'h5repart' tool
+     *
+     * Whether to eliminate the family driver info and convert this file to
+     * a single file
+     */
+    hbool_t     fam_to_sec2;
+
+    /* Fields for tracking I/O operations */
+    unsigned char       *nread;                 /* Number of reads from a file location             */
+    unsigned char       *nwrite;                /* Number of write to a file location               */
+    unsigned char       *flavor;                /* Flavor of information written to file location   */
+    unsigned long long  total_read_ops;         /* Total number of read operations                  */
+    unsigned long long  total_write_ops;        /* Total number of write operations                 */
+    unsigned long long  total_seek_ops;         /* Total number of seek operations                  */
+    unsigned long long  total_truncate_ops;     /* Total number of truncate operations              */
+    double              total_read_time;        /* Total time spent in read operations              */
+    double              total_write_time;       /* Total time spent in write operations             */
+    double              total_seek_time;        /* Total time spent in seek operations              */
+    size_t              iosize;                 /* Size of I/O information buffers                  */
+    FILE                *logfp;                 /* Log file pointer                                 */
+    H5FD_log_fapl_t     fa;                     /* Driver-specific file access properties           */
+} H5FD_log_t;
+
+/*
+ * These macros check for overflow of various quantities.  These macros
+ * assume that HDoff_t is signed and haddr_t and size_t are unsigned.
+ *
+ * ADDR_OVERFLOW:   Checks whether a file address of type `haddr_t'
+ *                  is too large to be represented by the second argument
+ *                  of the file seek function.
+ *
+ * SIZE_OVERFLOW:   Checks whether a buffer size of type `hsize_t' is too
+ *                  large to be represented by the `size_t' type.
+ *
+ * REGION_OVERFLOW: Checks whether an address and size pair describe data
+ *                  which can be addressed entirely by the second
+ *                  argument of the file seek function.
+ */
+#define MAXADDR                 (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1)
+#define ADDR_OVERFLOW(A)        (HADDR_UNDEF==(A) || ((A) & ~(haddr_t)MAXADDR))
+#define SIZE_OVERFLOW(Z)        ((Z) & ~(hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)    (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||    \
+                                 HADDR_UNDEF==(A)+(Z) ||                    \
+                                (HDoff_t)((A)+(Z))<(HDoff_t)(A))
+
+/* Prototypes */
+static void *H5FD_log_fapl_get(H5FD_t *file);
+static void *H5FD_log_fapl_copy(const void *_old_fa);
+static herr_t H5FD_log_fapl_free(void *_fa);
+static H5FD_t *H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id,
+            haddr_t maxaddr);
+static herr_t H5FD_log_close(H5FD_t *_file);
+static int H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_log_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+static haddr_t H5FD_log_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_log_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_log_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, void *buf);
+static herr_t H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, const void *buf);
+static herr_t H5FD_log_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+static const H5FD_class_t H5FD_log_g = {
+    "log",					/*name			*/
+    MAXADDR,					/*maxaddr		*/
+    H5F_CLOSE_WEAK,				/* fc_degree		*/
+    NULL,					/*sb_size		*/
+    NULL,					/*sb_encode		*/
+    NULL,					/*sb_decode		*/
+    sizeof(H5FD_log_fapl_t),                    /*fapl_size		*/
+    H5FD_log_fapl_get,		                /*fapl_get		*/
+    H5FD_log_fapl_copy,		                /*fapl_copy		*/
+    H5FD_log_fapl_free,		                /*fapl_free		*/
+    0,						/*dxpl_size		*/
+    NULL,					/*dxpl_copy		*/
+    NULL,					/*dxpl_free		*/
+    H5FD_log_open,				/*open			*/
+    H5FD_log_close,				/*close			*/
+    H5FD_log_cmp,				/*cmp			*/
+    H5FD_log_query,				/*query			*/
+    NULL,					/*get_type_map		*/
+    H5FD_log_alloc,				/*alloc			*/
+    NULL,					/*free			*/
+    H5FD_log_get_eoa,				/*get_eoa		*/
+    H5FD_log_set_eoa, 				/*set_eoa		*/
+    H5FD_log_get_eof,				/*get_eof		*/
+    H5FD_log_get_handle,                        /*get_handle            */
+    H5FD_log_read,				/*read			*/
+    H5FD_log_write,				/*write			*/
+    NULL,					/*flush			*/
+    H5FD_log_truncate,				/*truncate		*/
+    NULL,                                       /*lock                  */
+    NULL,                                       /*unlock                */
+    H5FD_FLMAP_DICHOTOMY			/*fl_map		*/
+};
+
+/* Declare a free list to manage the H5FD_log_t struct */
+H5FL_DEFINE_STATIC(H5FD_log_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_init_interface
+ *
+ * Purpose:     Initializes any interface-specific data or routines.
+ *
+ * Return:      Success:    The driver ID for the log driver.
+ *              Failure:    Negative.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_log_init())
+} /* H5FD_log_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_init
+ *
+ * Purpose:     Initialize this driver by registering the driver with the
+ *              library.
+ *
+ * Return:      Success:    The driver ID for the log driver.
+ *              Failure:    Negative.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_log_init(void)
+{
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5I_VFL != H5I_get_type(H5FD_LOG_g))
+        H5FD_LOG_g = H5FD_register(&H5FD_log_g, sizeof(H5FD_class_t), FALSE);
+
+    /* Set return value */
+    ret_value = H5FD_LOG_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_init() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:    H5FD_log_term
+ *
+ * Purpose:     Shut down the VFD
+ *
+ * Returns:     <none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_log_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_LOG_g = 0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_log_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fapl_log
+ *
+ * Purpose:     Modify the file access property list to use the H5FD_LOG
+ *              driver defined in this source file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, February 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_log(hid_t fapl_id, const char *logfile, unsigned long long flags, size_t buf_size)
+{
+    H5FD_log_fapl_t     fa;         /* File access property list information */
+    H5P_genplist_t      *plist;     /* Property list pointer */
+    herr_t              ret_value;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*sULz", fapl_id, logfile, flags, buf_size);
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    /* This shallow copy is correct! The string will be properly 
+     * copied deep down in the H5P code. 
+     */
+    fa.logfile = (char *)logfile;
+
+    fa.flags = flags;
+    fa.buf_size = buf_size;
+    ret_value = H5P_set_driver(plist, H5FD_LOG, &fa);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fapl_log() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_fapl_get
+ *
+ * Purpose:     Returns a file access property list which indicates how the
+ *              specified file is being accessed. The return list could be
+ *              used to access another file the same way.
+ *
+ * Return:      Success:    Ptr to new file access property list with all
+ *                          members copied from the file struct.
+ *              Failure:    NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, April 20, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_log_fapl_get(H5FD_t *_file)
+{
+    H5FD_log_t  *file = (H5FD_log_t *)_file;
+    void        *ret_value;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = H5FD_log_fapl_copy(&(file->fa));
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_fapl_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_fapl_copy
+ *
+ * Purpose:     Copies the log-specific file access properties.
+ *
+ * Return:      Success:    Ptr to a new property list
+ *              Failure:    NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, April 20, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_log_fapl_copy(const void *_old_fa)
+{
+    const H5FD_log_fapl_t   *old_fa = (const H5FD_log_fapl_t*)_old_fa;
+    H5FD_log_fapl_t         *new_fa = NULL;     /* New FAPL info */
+    void                    *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(old_fa);
+
+    /* Allocate the new FAPL info */
+    if(NULL == (new_fa = (H5FD_log_fapl_t *)H5MM_calloc(sizeof(H5FD_log_fapl_t))))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "unable to allocate log file FAPL")
+
+    /* Copy the general information */
+    HDmemcpy(new_fa, old_fa, sizeof(H5FD_log_fapl_t));
+
+    /* Deep copy the log file name */
+    if(old_fa->logfile != NULL)
+        if(NULL == (new_fa->logfile = H5MM_xstrdup(old_fa->logfile)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate log file name")
+
+    /* Set return value */
+    ret_value = new_fa;
+
+done:
+    if(NULL == ret_value)
+        if(new_fa) {
+            if(new_fa->logfile)
+                H5MM_free(new_fa->logfile);
+            H5MM_free(new_fa);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_fapl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_fapl_free
+ *
+ * Purpose:     Frees the log-specific file access properties.
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, April 20, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_fapl_free(void *_fa)
+{
+    H5FD_log_fapl_t	*fa = (H5FD_log_fapl_t*)_fa;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the fapl information */
+    if(fa->logfile)
+        H5MM_xfree(fa->logfile);
+    H5MM_xfree(fa);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_log_fapl_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_open
+ *
+ * Purpose:     Create and/or opens a file as an HDF5 file.
+ *
+ * Return:      Success:    A pointer to a new file data structure. The
+ *                          public fields will be initialized by the
+ *                          caller, which is always H5FD_open().
+ *              Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    H5FD_log_t      *file = NULL;
+    H5P_genplist_t  *plist;         /* Property list */
+    H5FD_log_fapl_t *fa;            /* File access property list information */
+    int             fd = -1;        /* File descriptor */
+    int             o_flags;        /* Flags for open() call */
+#ifdef H5_HAVE_WIN32_API
+    struct _BY_HANDLE_FILE_INFORMATION fileinfo;
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval timeval_start;
+    struct timeval open_timeval_diff;
+    struct timeval stat_timeval_diff;
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    h5_stat_t       sb;
+    H5FD_t          *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check on file offsets */
+    HDcompile_assert(sizeof(HDoff_t) >= sizeof(size_t));
+
+    /* Check arguments */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
+    if(0 == maxaddr || HADDR_UNDEF == maxaddr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
+    if(ADDR_OVERFLOW(maxaddr))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr")
+
+    /* Build the open flags */
+    o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
+    if(H5F_ACC_TRUNC & flags)
+        o_flags |= O_TRUNC;
+    if(H5F_ACC_CREAT & flags)
+        o_flags |= O_CREAT;
+    if(H5F_ACC_EXCL & flags)
+        o_flags |= O_EXCL;
+
+    /* Get the driver specific information */
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+    if(NULL == (fa = (H5FD_log_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(fa->flags & H5FD_LOG_TIME_OPEN)
+        HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    /* Open the file */
+    if((fd = HDopen(name, o_flags, 0666)) < 0) {
+        int myerrno = errno;
+
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', errno = %d, error message = '%s', flags = %x, o_flags = %x", name, myerrno, HDstrerror(myerrno), flags, (unsigned)o_flags);
+    } /* end if */
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(fa->flags & H5FD_LOG_TIME_OPEN) {
+        struct timeval timeval_stop;
+
+        HDgettimeofday(&timeval_stop, NULL);
+
+         /* Calculate the elapsed gettimeofday time */
+         open_timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+         open_timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+         if(open_timeval_diff.tv_usec < 0) {
+             open_timeval_diff.tv_usec += 1000000;
+             open_timeval_diff.tv_sec--;
+         } /* end if */
+    } /* end if */
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(fa->flags & H5FD_LOG_TIME_STAT)
+        HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    /* Get the file stats */
+    if(HDfstat(fd, &sb) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(fa->flags & H5FD_LOG_TIME_STAT) {
+        struct timeval timeval_stop;
+
+        HDgettimeofday(&timeval_stop, NULL);
+
+         /* Calculate the elapsed gettimeofday time */
+         stat_timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+         stat_timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+         if(stat_timeval_diff.tv_usec < 0) {
+             stat_timeval_diff.tv_usec += 1000000;
+             stat_timeval_diff.tv_sec--;
+         } /* end if */
+    } /* end if */
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    /* Create the new file struct */
+    if(NULL == (file = H5FL_CALLOC(H5FD_log_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
+
+    file->fd = fd;
+    H5_CHECKED_ASSIGN(file->eof, haddr_t, sb.st_size, h5_stat_size_t);
+    file->pos = HADDR_UNDEF;
+    file->op = OP_UNKNOWN;
+#ifdef H5_HAVE_WIN32_API
+    file->hFile = (HANDLE)_get_osfhandle(fd);
+    if(INVALID_HANDLE_VALUE == file->hFile)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file handle")
+
+    if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file information")
+
+    file->nFileIndexHigh = fileinfo.nFileIndexHigh;
+    file->nFileIndexLow = fileinfo.nFileIndexLow;
+    file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
+#else /* H5_HAVE_WIN32_API */
+    file->device = sb.st_dev;
+    file->inode = sb.st_ino;
+#endif /* H5_HAVE_WIN32_API */
+
+    /* Retain a copy of the name used to open the file, for possible error reporting */
+    HDstrncpy(file->filename, name, sizeof(file->filename));
+    file->filename[sizeof(file->filename) - 1] = '\0';
+
+    /* Get the flags for logging */
+    file->fa.flags = fa->flags;
+
+    /* Check if we are doing any logging at all */
+    if(file->fa.flags != 0) {
+        /* Allocate buffers for tracking file accesses and data "flavor" */
+        file->iosize = fa->buf_size;
+        if(file->fa.flags & H5FD_LOG_FILE_READ) {
+            file->nread = (unsigned char *)H5MM_calloc(file->iosize);
+            HDassert(file->nread);
+        } /* end if */
+        if(file->fa.flags & H5FD_LOG_FILE_WRITE) {
+            file->nwrite = (unsigned char *)H5MM_calloc(file->iosize);
+            HDassert(file->nwrite);
+        } /* end if */
+        if(file->fa.flags & H5FD_LOG_FLAVOR) {
+            file->flavor = (unsigned char *)H5MM_calloc(file->iosize);
+            HDassert(file->flavor);
+        } /* end if */
+
+        /* Set the log file pointer */
+        if(fa->logfile)
+            file->logfp = HDfopen(fa->logfile, "w");
+        else
+            file->logfp = stderr;
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_OPEN)
+            HDfprintf(file->logfp, "Open took: (%f s)\n", (double)open_timeval_diff.tv_sec + ((double)open_timeval_diff.tv_usec / (double)1000000.0f));
+        if(file->fa.flags & H5FD_LOG_TIME_STAT)
+            HDfprintf(file->logfp, "Stat took: (%f s)\n", (double)stat_timeval_diff.tv_sec + ((double)stat_timeval_diff.tv_usec / (double)1000000.0f));
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    } /* end if */
+
+    /* Check for non-default FAPL */
+    if(H5P_FILE_ACCESS_DEFAULT != fapl_id) {
+        /* This step is for h5repart tool only. If user wants to change file driver from
+         * family to sec2 while using h5repart, this private property should be set so that
+         * in the later step, the library can ignore the family driver information saved
+         * in the superblock.
+         */
+        if(H5P_exist_plist(plist, H5F_ACS_FAMILY_TO_SEC2_NAME) > 0)
+            if(H5P_get(plist, H5F_ACS_FAMILY_TO_SEC2_NAME, &file->fam_to_sec2) < 0)
+                HGOTO_ERROR(H5E_VFL, H5E_CANTGET, NULL, "can't get property of changing family to sec2")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (H5FD_t*)file;
+
+done:
+    if(NULL == ret_value) {
+        if(fd >= 0)
+            HDclose(fd);
+        if(file)
+            file = H5FL_FREE(H5FD_log_t, file);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_close
+ *
+ * Purpose:     Closes an HDF5 file.
+ *
+ * Return:      Success:    SUCCEED
+ *              Failure:    FAIL, file not closed.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_close(H5FD_t *_file)
+{
+    H5FD_log_t	*file = (H5FD_log_t *)_file;
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval timeval_start, timeval_stop;
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(file);
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags&H5FD_LOG_TIME_CLOSE)
+        HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    /* Close the underlying file */
+    if(HDclose(file->fd) < 0)
+        HSYS_GOTO_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags&H5FD_LOG_TIME_CLOSE)
+        HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    /* Dump I/O information */
+    if(file->fa.flags != 0) {
+        haddr_t addr;
+        haddr_t last_addr;
+        unsigned char last_val;
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_CLOSE) {
+            struct timeval timeval_diff;
+
+             /* Calculate the elapsed gettimeofday time */
+             timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+             timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+             if(timeval_diff.tv_usec < 0) {
+                 timeval_diff.tv_usec += 1000000;
+                 timeval_diff.tv_sec--;
+             } /* end if */
+            HDfprintf(file->logfp, "Close took: (%f s)\n", (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f));
+        } /* end if */
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+        /* Dump the total number of seek/read/write operations */
+        if(file->fa.flags & H5FD_LOG_NUM_READ)
+            HDfprintf(file->logfp, "Total number of read operations: %llu\n", file->total_read_ops);
+        if(file->fa.flags & H5FD_LOG_NUM_WRITE)
+            HDfprintf(file->logfp, "Total number of write operations: %llu\n", file->total_write_ops);
+        if(file->fa.flags & H5FD_LOG_NUM_SEEK)
+            HDfprintf(file->logfp, "Total number of seek operations: %llu\n", file->total_seek_ops);
+        if(file->fa.flags & H5FD_LOG_NUM_TRUNCATE)
+            HDfprintf(file->logfp, "Total number of truncate operations: %llu\n", file->total_truncate_ops);
+
+        /* Dump the total time in seek/read/write */
+        if(file->fa.flags & H5FD_LOG_TIME_READ)
+            HDfprintf(file->logfp, "Total time in read operations: %f s\n", file->total_read_time);
+        if(file->fa.flags & H5FD_LOG_TIME_WRITE)
+            HDfprintf(file->logfp, "Total time in write operations: %f s\n", file->total_write_time);
+        if(file->fa.flags & H5FD_LOG_TIME_SEEK)
+            HDfprintf(file->logfp, "Total time in seek operations: %f s\n", file->total_seek_time);
+
+        /* Dump the write I/O information */
+        if(file->fa.flags & H5FD_LOG_FILE_WRITE) {
+            HDfprintf(file->logfp, "Dumping write I/O information:\n");
+            last_val = file->nwrite[0];
+            last_addr = 0;
+            addr = 1;
+            while(addr < file->eoa) {
+                if(file->nwrite[addr] != last_val) {
+                    HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) written to %3d times\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), (int)last_val);
+                    last_val = file->nwrite[addr];
+                    last_addr = addr;
+                } /* end if */
+                addr++;
+            } /* end while */
+            HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) written to %3d times\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), (int)last_val);
+        } /* end if */
+
+        /* Dump the read I/O information */
+        if(file->fa.flags & H5FD_LOG_FILE_READ) {
+            HDfprintf(file->logfp, "Dumping read I/O information:\n");
+            last_val = file->nread[0];
+            last_addr = 0;
+            addr = 1;
+            while(addr < file->eoa) {
+                if(file->nread[addr] != last_val) {
+                    HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) read from %3d times\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), (int)last_val);
+                    last_val = file->nread[addr];
+                    last_addr = addr;
+                } /* end if */
+                addr++;
+            } /* end while */
+            HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) read from %3d times\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), (int)last_val);
+        } /* end if */
+
+        /* Dump the I/O flavor information */
+        if(file->fa.flags & H5FD_LOG_FLAVOR) {
+            HDfprintf(file->logfp, "Dumping I/O flavor information:\n");
+            last_val = file->flavor[0];
+            last_addr = 0;
+            addr = 1;
+            while(addr < file->eoa) {
+                if(file->flavor[addr] != last_val) {
+                    HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) flavor is %s\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), flavors[last_val]);
+                    last_val = file->flavor[addr];
+                    last_addr = addr;
+                } /* end if */
+                addr++;
+            } /* end while */
+            HDfprintf(file->logfp, "\tAddr %10a-%10a (%10lu bytes) flavor is %s\n", last_addr, (addr - 1), (unsigned long)(addr - last_addr), flavors[last_val]);
+        } /* end if */
+
+        /* Free the logging information */
+        if(file->fa.flags & H5FD_LOG_FILE_WRITE)
+            file->nwrite = (unsigned char *)H5MM_xfree(file->nwrite);
+        if(file->fa.flags & H5FD_LOG_FILE_READ)
+            file->nread = (unsigned char *)H5MM_xfree(file->nread);
+        if(file->fa.flags & H5FD_LOG_FLAVOR)
+            file->flavor = (unsigned char *)H5MM_xfree(file->flavor);
+        if(file->logfp != stderr)
+            HDfclose(file->logfp);
+    } /* end if */
+
+    /* Release the file info */
+    file = H5FL_FREE(H5FD_log_t, file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_cmp
+ *
+ * Purpose:     Compares two files belonging to this driver using an
+ *              arbitrary (but consistent) ordering.
+ *
+ * Return:      Success:    A value like strcmp()
+ *              Failure:    never fails (arguments were checked by the
+ *                          caller).
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_log_t    *f1 = (const H5FD_log_t *)_f1;
+    const H5FD_log_t    *f2 = (const H5FD_log_t *)_f2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef H5_HAVE_WIN32_API
+    if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) HGOTO_DONE(-1)
+    if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) HGOTO_DONE(1)
+
+    if(f1->nFileIndexHigh < f2->nFileIndexHigh) HGOTO_DONE(-1)
+    if(f1->nFileIndexHigh > f2->nFileIndexHigh) HGOTO_DONE(1)
+
+    if(f1->nFileIndexLow < f2->nFileIndexLow) HGOTO_DONE(-1)
+    if(f1->nFileIndexLow > f2->nFileIndexLow) HGOTO_DONE(1)
+#else
+#ifdef H5_DEV_T_IS_SCALAR
+    if(f1->device < f2->device) HGOTO_DONE(-1)
+    if(f1->device > f2->device) HGOTO_DONE(1)
+#else /* H5_DEV_T_IS_SCALAR */
+    /* If dev_t isn't a scalar value on this system, just use memcmp to
+     * determine if the values are the same or not.  The actual return value
+     * shouldn't really matter...
+     */
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) < 0) HGOTO_DONE(-1)
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) > 0) HGOTO_DONE(1)
+#endif /* H5_DEV_T_IS_SCALAR */
+
+    if(f1->inode < f2->inode) HGOTO_DONE(-1)
+    if(f1->inode > f2->inode) HGOTO_DONE(1)
+
+#endif
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_query
+ *
+ * Purpose:     Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_query(const H5FD_t *_file, unsigned long *flags /* out */)
+{
+    const H5FD_log_t    *file = (const H5FD_log_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
+        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+        *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE; /* VFD handle is POSIX I/O call compatible */
+
+        /* Check for flags that are set by h5repart */
+        if(file && file->fam_to_sec2)
+            *flags |= H5FD_FEAT_IGNORE_DRVRINFO; /* Ignore the driver info when file is opened (which eliminates it) */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_log_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_alloc
+ *
+ * Purpose:     Allocate file memory.
+ *
+ * Return:      Success:    Address of new memory
+ *              Failure:    HADDR_UNDEF
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, April 17, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hsize_t size)
+{
+    H5FD_log_t	*file = (H5FD_log_t *)_file;
+    haddr_t addr;
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Compute the address for the block to allocate */
+    addr = file->eoa;
+
+    /* Check if we need to align this block */
+    if(size >= file->pub.threshold) {
+        /* Check for an already aligned block */
+        if(addr % file->pub.alignment != 0)
+            addr = ((addr / file->pub.alignment) + 1) * file->pub.alignment;
+    } /* end if */
+
+    file->eoa = addr + size;
+
+    /* Retain the (first) flavor of the information written to the file */
+    if(file->fa.flags != 0) {
+        if(file->fa.flags & H5FD_LOG_FLAVOR) {
+            HDassert(addr < file->iosize);
+            H5_CHECK_OVERFLOW(size, hsize_t, size_t);
+            HDmemset(&file->flavor[addr], (int)type, (size_t)size);
+        } /* end if */
+
+        if(file->fa.flags & H5FD_LOG_ALLOC)
+            HDfprintf(file->logfp, "%10a-%10a (%10Hu bytes) (%s) Allocated\n", addr, (addr + size) - 1, size, flavors[type]);
+    } /* end if */
+
+    /* Set return value */
+    ret_value = addr;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_get_eoa
+ *
+ * Purpose:     Gets the end-of-address marker for the file. The EOA marker
+ *              is the first address past the last byte allocated in the
+ *              format address space.
+ *
+ * Return:      Success:    The end-of-address marker.
+ *              Failure:    HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, August  2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_log_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_log_t    *file = (const H5FD_log_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+} /* end H5FD_log_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_set_eoa
+ *
+ * Purpose:     Set the end-of-address marker for the file. This function is
+ *              called shortly after an existing HDF5 file is opened in order
+ *              to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr)
+{
+    H5FD_log_t  *file = (H5FD_log_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(file->fa.flags != 0) {
+        if(H5F_addr_gt(addr, file->eoa) && H5F_addr_gt(addr, 0)) {
+            hsize_t size = addr - file->eoa;
+
+            /* Retain the flavor of the space allocated by the extension */
+            if(file->fa.flags & H5FD_LOG_FLAVOR) {
+                HDassert(addr < file->iosize);
+                H5_CHECK_OVERFLOW(size, hsize_t, size_t);
+                HDmemset(&file->flavor[file->eoa], (int)type, (size_t)size);
+            } /* end if */
+
+            /* Log the extension like an allocation */
+            if(file->fa.flags & H5FD_LOG_ALLOC)
+                HDfprintf(file->logfp, "%10a-%10a (%10Hu bytes) (%s) Allocated\n", file->eoa, addr, size, flavors[type]);
+        } /* end if */
+    } /* end if */
+
+    file->eoa = addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_log_set_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_get_eof
+ *
+ * Purpose:     Returns the end-of-file marker, which is the greater of
+ *              either the filesystem end-of-file or the HDF5 end-of-address
+ *              markers.
+ *
+ * Return:      Success:    End of file address, the first address past
+ *                          the end of the "file", either the filesystem file
+ *                          or the HDF5 file.
+ *              Failure:    HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_log_get_eof(const H5FD_t *_file)
+{
+    const H5FD_log_t	*file = (const H5FD_log_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+} /* end H5FD_log_get_eof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_log_get_handle
+ *
+ * Purpose:        Returns the file handle of LOG file driver.
+ *
+ * Returns:        SUCCEED/FAIL
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_get_handle(H5FD_t *_file, hid_t H5_ATTR_UNUSED fapl, void **file_handle)
+{
+    H5FD_log_t          *file = (H5FD_log_t *)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(!file_handle)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
+
+    *file_handle = &(file->fd);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_get_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_read
+ *
+ * Purpose:     Reads SIZE bytes of data from FILE beginning at address ADDR
+ *              into buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      Success:    SUCCEED. Result is stored in caller-supplied
+ *                          buffer BUF.
+ *              Failure:    FAIL, Contents of buffer BUF are undefined.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+            size_t size, void *buf/*out*/)
+{
+    H5FD_log_t          *file = (H5FD_log_t *)_file;
+    size_t              orig_size = size; /* Save the original size for later */
+    haddr_t             orig_addr = addr;
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval      timeval_start, timeval_stop;
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr)
+    if(REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr)
+
+    /* Log the I/O information about the read */
+    if(file->fa.flags != 0) {
+        size_t tmp_size = size;
+        haddr_t tmp_addr = addr;
+
+        /* Log information about the number of times these locations are read */
+        if(file->fa.flags & H5FD_LOG_FILE_READ) {
+            HDassert((addr + size) < file->iosize);
+            while(tmp_size-- > 0)
+                file->nread[tmp_addr++]++;
+        } /* end if */
+    } /* end if */
+
+    /* Seek to the correct location */
+    if(addr != file->pos || OP_READ != file->op) {
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_SEEK)
+            HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_SEEK)
+            HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+        /* Log information about the seek */
+        if(file->fa.flags & H5FD_LOG_NUM_SEEK)
+            file->total_seek_ops++;
+        if(file->fa.flags & H5FD_LOG_LOC_SEEK) {
+            HDfprintf(file->logfp, "Seek: From %10a To %10a", file->pos, addr);
+#ifdef H5_HAVE_GETTIMEOFDAY
+            if(file->fa.flags & H5FD_LOG_TIME_SEEK) {
+                struct timeval timeval_diff;
+                double time_diff;
+
+                /* Calculate the elapsed gettimeofday time */
+                timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+                timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+                if(timeval_diff.tv_usec < 0) {
+                    timeval_diff.tv_usec += 1000000;
+                    timeval_diff.tv_sec--;
+                } /* end if */
+                time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
+                HDfprintf(file->logfp, " (%f s)\n", time_diff);
+
+                /* Add to total seek time */
+                file->total_seek_time += time_diff;
+            } /* end if */
+            else
+                HDfprintf(file->logfp, "\n");
+#else /* H5_HAVE_GETTIMEOFDAY */
+            HDfprintf(file->logfp, "\n");
+#endif /* H5_HAVE_GETTIMEOFDAY */
+        } /* end if */
+    } /* end if */
+
+    /*
+     * Read data, being careful of interrupted system calls, partial results,
+     * and the end of the file.
+     */
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags & H5FD_LOG_TIME_READ)
+        HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    while(size > 0) {
+
+        h5_posix_io_t       bytes_in        = 0;    /* # of bytes to read       */
+        h5_posix_io_ret_t   bytes_read      = -1;   /* # of bytes actually read */ 
+
+        /* Trying to read more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_POSIX_MAX_IO_BYTES)
+            bytes_in = H5_POSIX_MAX_IO_BYTES;
+        else
+            bytes_in = (h5_posix_io_t)size;
+
+        do {
+            bytes_read = HDread(file->fd, buf, bytes_in);
+        } while(-1 == bytes_read && EINTR == errno);
+
+        if(-1 == bytes_read) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            if(file->fa.flags & H5FD_LOG_LOC_READ)
+                HDfprintf(file->logfp, "Error! Reading: %10a-%10a (%10Zu bytes)\n", orig_addr, (orig_addr + orig_size) - 1, orig_size);
+
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
+        } /* end if */
+
+        if(0 == bytes_read) {
+            /* end of file but not end of format address space */
+            HDmemset(buf, 0, size);
+            break;
+        } /* end if */
+
+        HDassert(bytes_read >= 0);
+        HDassert((size_t)bytes_read <= size);
+        
+        size -= (size_t)bytes_read;
+        addr += (haddr_t)bytes_read;
+        buf = (char *)buf + bytes_read;
+
+    } /* end while */
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags & H5FD_LOG_TIME_READ)
+        HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    /* Log information about the read */
+    if(file->fa.flags & H5FD_LOG_NUM_READ)
+        file->total_read_ops++;
+    if(file->fa.flags & H5FD_LOG_LOC_READ) {
+        HDfprintf(file->logfp, "%10a-%10a (%10Zu bytes) (%s) Read", orig_addr, (orig_addr + orig_size) - 1, orig_size, flavors[type]);
+
+        /* XXX: Verify the flavor information, if we have it? */
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_READ) {
+            struct timeval timeval_diff;
+            double time_diff;
+
+            /* Calculate the elapsed gettimeofday time */
+            timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+            timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+            if(timeval_diff.tv_usec < 0) {
+                timeval_diff.tv_usec += 1000000;
+                timeval_diff.tv_sec--;
+            } /* end if */
+            time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
+            HDfprintf(file->logfp, " (%f s)\n", time_diff);
+
+            /* Add to total read time */
+            file->total_read_time += time_diff;
+        } /* end if */
+        else
+            HDfprintf(file->logfp, "\n");
+#else /* H5_HAVE_GETTIMEOFDAY */
+        HDfprintf(file->logfp, "\n");
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    } /* end if */
+
+    /* Update current position */
+    file->pos = addr;
+    file->op = OP_READ;
+
+done:
+    if(ret_value < 0) {
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_write
+ *
+ * Purpose:     Writes SIZE bytes of data to FILE beginning at address ADDR
+ *              from buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+            size_t size, const void *buf)
+{
+    H5FD_log_t          *file = (H5FD_log_t *)_file;
+    size_t              orig_size = size; /* Save the original size for later */
+    haddr_t             orig_addr = addr;
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval      timeval_start, timeval_stop;
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(size > 0);
+    HDassert(buf);
+
+    /* Verify that we are writing out the type of data we allocated in this location */
+    if(file->flavor) {
+        HDassert(type == H5FD_MEM_DEFAULT || type == (H5FD_mem_t)file->flavor[addr] || (H5FD_mem_t)file->flavor[addr] == H5FD_MEM_DEFAULT);
+        HDassert(type == H5FD_MEM_DEFAULT || type == (H5FD_mem_t)file->flavor[(addr + size) - 1] || (H5FD_mem_t)file->flavor[(addr + size) - 1] == H5FD_MEM_DEFAULT);
+    } /* end if */
+
+    /* Check for overflow conditions */
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr)
+    if(REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size = %llu", (unsigned long long)addr, (unsigned long long)size)
+
+    /* Log the I/O information about the write */
+    if(file->fa.flags & H5FD_LOG_FILE_WRITE) {
+        size_t tmp_size = size;
+        haddr_t tmp_addr = addr;
+
+        /* Log information about the number of times these locations are read */
+        HDassert((addr + size) < file->iosize);
+        while(tmp_size-- > 0)
+            file->nwrite[tmp_addr++]++;
+    } /* end if */
+
+    /* Seek to the correct location */
+    if(addr != file->pos || OP_WRITE != file->op) {
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_SEEK)
+            HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_SEEK)
+            HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+        /* Log information about the seek */
+        if(file->fa.flags & H5FD_LOG_NUM_SEEK)
+            file->total_seek_ops++;
+        if(file->fa.flags & H5FD_LOG_LOC_SEEK) {
+            HDfprintf(file->logfp, "Seek: From %10a To %10a", file->pos, addr);
+#ifdef H5_HAVE_GETTIMEOFDAY
+            if(file->fa.flags & H5FD_LOG_TIME_SEEK) {
+                struct timeval timeval_diff;
+                double time_diff;
+
+                /* Calculate the elapsed gettimeofday time */
+                timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+                timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+                if(timeval_diff.tv_usec < 0) {
+                    timeval_diff.tv_usec += 1000000;
+                    timeval_diff.tv_sec--;
+                } /* end if */
+                time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
+                HDfprintf(file->logfp, " (%f s)\n", time_diff);
+
+                /* Add to total seek time */
+                file->total_seek_time += time_diff;
+            } /* end if */
+            else
+                HDfprintf(file->logfp, "\n");
+#else /* H5_HAVE_GETTIMEOFDAY */
+            HDfprintf(file->logfp, "\n");
+#endif /* H5_HAVE_GETTIMEOFDAY */
+        } /* end if */
+    } /* end if */
+
+    /*
+     * Write the data, being careful of interrupted system calls and partial
+     * results
+     */
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags&H5FD_LOG_TIME_WRITE)
+        HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    while(size > 0) {
+
+        h5_posix_io_t       bytes_in        = 0;    /* # of bytes to write  */
+        h5_posix_io_ret_t   bytes_wrote     = -1;   /* # of bytes written   */ 
+
+        /* Trying to write more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_POSIX_MAX_IO_BYTES)
+            bytes_in = H5_POSIX_MAX_IO_BYTES;
+        else
+            bytes_in = (h5_posix_io_t)size;
+
+        do {
+            bytes_wrote = HDwrite(file->fd, buf, bytes_in);
+        } while(-1 == bytes_wrote && EINTR == errno);
+
+        if(-1 == bytes_wrote) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            if(file->fa.flags & H5FD_LOG_LOC_WRITE)
+                HDfprintf(file->logfp, "Error! Writing: %10a-%10a (%10Zu bytes)\n", orig_addr, (orig_addr + orig_size) - 1, orig_size);
+
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
+        } /* end if */
+
+        HDassert(bytes_wrote > 0);
+        HDassert((size_t)bytes_wrote <= size);
+
+        size -= (size_t)bytes_wrote;
+        addr += (haddr_t)bytes_wrote;
+        buf = (const char *)buf + bytes_wrote;
+    } /* end while */
+#ifdef H5_HAVE_GETTIMEOFDAY
+    if(file->fa.flags & H5FD_LOG_TIME_WRITE)
+        HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    /* Log information about the write */
+    if(file->fa.flags & H5FD_LOG_NUM_WRITE)
+        file->total_write_ops++;
+    if(file->fa.flags & H5FD_LOG_LOC_WRITE) {
+        HDfprintf(file->logfp, "%10a-%10a (%10Zu bytes) (%s) Written", orig_addr, (orig_addr + orig_size) - 1, orig_size, flavors[type]);
+
+        /* Check if this is the first write into a "default" section, grabbed by the metadata agregation algorithm */
+        if(file->fa.flags & H5FD_LOG_FLAVOR) {
+            if((H5FD_mem_t)file->flavor[orig_addr] == H5FD_MEM_DEFAULT)
+                HDmemset(&file->flavor[orig_addr], (int)type, orig_size);
+        } /* end if */
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_WRITE) {
+            struct timeval timeval_diff;
+            double time_diff;
+
+            /* Calculate the elapsed gettimeofday time */
+            timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+            timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+            if(timeval_diff.tv_usec < 0) {
+                timeval_diff.tv_usec += 1000000;
+                timeval_diff.tv_sec--;
+            } /* end if */
+            time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
+            HDfprintf(file->logfp, " (%f s)\n", time_diff);
+
+            /* Add to total write time */
+            file->total_write_time += time_diff;
+        } /* end if */
+        else
+            HDfprintf(file->logfp, "\n");
+#else /* H5_HAVE_GETTIMEOFDAY */
+        HDfprintf(file->logfp, "\n");
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    } /* end if */
+
+    /* Update current position and eof */
+    file->pos = addr;
+    file->op = OP_WRITE;
+    if(file->pos > file->eof)
+        file->eof = file->pos;
+
+done:
+    if(ret_value < 0) {
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_truncate
+ *
+ * Purpose:     Makes sure that the true file size is the same (or larger)
+ *              than the end-of-address.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing)
+{
+    H5FD_log_t  *file = (H5FD_log_t *)_file;
+    herr_t      ret_value = SUCCEED;                /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Extend the file to make sure it's large enough */
+    if(!H5F_addr_eq(file->eoa, file->eof)) {
+#ifdef H5_HAVE_WIN32_API
+        LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
+        DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
+                                     * Only used as an error code here.
+                                     */
+        DWORD           dwError;    /* DWORD error code from GetLastError() */
+        BOOL            bError;     /* Boolean error flag */
+
+        /* Windows uses this odd QuadPart union for 32/64-bit portability */
+        li.QuadPart = (__int64)file->eoa;
+
+        /* Extend the file to make sure it's large enough.
+         *
+         * Since INVALID_SET_FILE_POINTER can technically be a valid return value
+         * from SetFilePointer(), we also need to check GetLastError().
+         */
+        dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
+        if(INVALID_SET_FILE_POINTER == dwPtrLow) {
+            dwError = GetLastError();
+            if(dwError != NO_ERROR )
+                HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "unable to set file pointer")
+        }
+
+        bError = SetEndOfFile(file->hFile);
+        if(0 == bError)
+            HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#else /* H5_HAVE_WIN32_API */
+        if(-1 == HDftruncate(file->fd, (HDoff_t)file->eoa))
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#endif /* H5_HAVE_WIN32_API */
+
+        /* Log information about the truncate */
+        if(file->fa.flags & H5FD_LOG_NUM_TRUNCATE)
+            file->total_truncate_ops++;
+
+        /* Update the eof value */
+        file->eof = file->eoa;
+
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_truncate() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDlog.h b/gatb-core/thirdparty/hdf5/src/H5FDlog.h
new file mode 100644
index 0000000..ffc4df1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDlog.h
@@ -0,0 +1,72 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Monday, April 17, 2000
+ *
+ * Purpose:	The public header file for the log driver.
+ */
+#ifndef H5FDlog_H
+#define H5FDlog_H
+
+#include "H5Ipublic.h"
+
+#define H5FD_LOG	(H5FD_log_init())
+
+/* Flags for H5Pset_fapl_log() */
+/* Flags for tracking where reads/writes/seeks occur */
+#define H5FD_LOG_LOC_READ   0x00000001
+#define H5FD_LOG_LOC_WRITE  0x00000002
+#define H5FD_LOG_LOC_SEEK   0x00000004
+#define H5FD_LOG_LOC_IO     (H5FD_LOG_LOC_READ|H5FD_LOG_LOC_WRITE|H5FD_LOG_LOC_SEEK)
+/* Flags for tracking number of times each byte is read/written */
+#define H5FD_LOG_FILE_READ  0x00000008
+#define H5FD_LOG_FILE_WRITE 0x00000010
+#define H5FD_LOG_FILE_IO    (H5FD_LOG_FILE_READ|H5FD_LOG_FILE_WRITE)
+/* Flag for tracking "flavor" (type) of information stored at each byte */
+#define H5FD_LOG_FLAVOR     0x00000020
+/* Flags for tracking total number of reads/writes/seeks/truncates */
+#define H5FD_LOG_NUM_READ   0x00000040
+#define H5FD_LOG_NUM_WRITE  0x00000080
+#define H5FD_LOG_NUM_SEEK   0x00000100
+#define H5FD_LOG_NUM_TRUNCATE 0x00000200
+#define H5FD_LOG_NUM_IO     (H5FD_LOG_NUM_READ|H5FD_LOG_NUM_WRITE|H5FD_LOG_NUM_SEEK|H5FD_LOG_NUM_TRUNCATE)
+/* Flags for tracking time spent in open/stat/read/write/seek/close */
+#define H5FD_LOG_TIME_OPEN  0x00000400
+#define H5FD_LOG_TIME_STAT  0x00000800
+#define H5FD_LOG_TIME_READ  0x00001000
+#define H5FD_LOG_TIME_WRITE 0x00002000
+#define H5FD_LOG_TIME_SEEK  0x00004000
+#define H5FD_LOG_TIME_CLOSE 0x00008000
+#define H5FD_LOG_TIME_IO    (H5FD_LOG_TIME_OPEN|H5FD_LOG_TIME_STAT|H5FD_LOG_TIME_READ|H5FD_LOG_TIME_WRITE|H5FD_LOG_TIME_SEEK|H5FD_LOG_TIME_CLOSE)
+/* Flag for tracking allocation of space in file */
+#define H5FD_LOG_ALLOC      0x00010000
+#define H5FD_LOG_ALL        (H5FD_LOG_ALLOC|H5FD_LOG_TIME_IO|H5FD_LOG_NUM_IO|H5FD_LOG_FLAVOR|H5FD_LOG_FILE_IO|H5FD_LOG_LOC_IO)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5_DLL hid_t H5FD_log_init(void);
+H5_DLL void H5FD_log_term(void);
+H5_DLL herr_t H5Pset_fapl_log(hid_t fapl_id, const char *logfile, unsigned long long flags, size_t buf_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmpi.c b/gatb-core/thirdparty/hdf5/src/H5FDmpi.c
new file mode 100644
index 0000000..86a5d39
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmpi.c
@@ -0,0 +1,492 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Friday, January 30, 2004
+ *
+ * Purpose:	Common routines for all MPI-based VFL drivers.
+ *
+ */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FDmpi.h"            /* Common MPI file driver		*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+#ifdef H5_HAVE_PARALLEL
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpi_get_rank
+ *
+ * Purpose:	Retrieves the rank of an MPI process.
+ *
+ * Return:	Success:	The rank (non-negative)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FD_mpi_get_rank(const H5FD_t *file)
+{
+    const H5FD_class_mpi_t *cls;
+
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file);
+    cls = (const H5FD_class_mpi_t *)(file->cls);
+    HDassert(cls);
+    HDassert(cls->get_rank);        /* All MPI drivers must implement this */
+
+    /* Dispatch to driver */
+    if ((ret_value=(cls->get_rank)(file))<0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_rank request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpi_get_rank() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpi_get_size
+ *
+ * Purpose:	Retrieves the size of the communicator used for the file
+ *
+ * Return:	Success:	The communicator size (non-negative)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FD_mpi_get_size(const H5FD_t *file)
+{
+    const H5FD_class_mpi_t *cls;
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file);
+    cls = (const H5FD_class_mpi_t *)(file->cls);
+    HDassert(cls);
+    HDassert(cls->get_size);        /* All MPI drivers must implement this */
+
+    /* Dispatch to driver */
+    if ((ret_value=(cls->get_size)(file))<0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_size request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpi_get_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpi_get_comm
+ *
+ * Purpose:	Retrieves the file's communicator
+ *
+ * Return:	Success:	The communicator (non-negative)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+MPI_Comm
+H5FD_mpi_get_comm(const H5FD_t *file)
+{
+    const H5FD_class_mpi_t *cls;
+    MPI_Comm	ret_value;
+
+    FUNC_ENTER_NOAPI(MPI_COMM_NULL)
+
+    HDassert(file);
+    cls = (const H5FD_class_mpi_t *)(file->cls);
+    HDassert(cls);
+    HDassert(cls->get_comm);        /* All MPI drivers must implement this */
+
+    /* Dispatch to driver */
+    if ((ret_value=(cls->get_comm)(file))==MPI_COMM_NULL)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, "driver get_comm request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpi_get_comm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpi_MPIOff_to_haddr
+ *
+ * Purpose:     Convert an MPI_Offset value to haddr_t.
+ *
+ * Return:      Success:	The haddr_t equivalent of the MPI_OFF
+ *				argument.
+ *
+ *              Failure:	HADDR_UNDEF
+ *
+ * Programmer:  Unknown
+ *              January 30, 1998
+ *
+ * Modifications:
+ * 		Robb Matzke, 1999-04-23
+ *		An error is reported for address overflows. The ADDR output
+ *		argument is optional.
+ *
+ * 		Robb Matzke, 1999-08-06
+ *		Modified to work with the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_mpi_MPIOff_to_haddr(MPI_Offset mpi_off)
+{
+    haddr_t ret_value=HADDR_UNDEF;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (mpi_off != (MPI_Offset)(haddr_t)mpi_off)
+        ret_value=HADDR_UNDEF;
+    else
+        ret_value=(haddr_t)mpi_off;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpi_haddr_to_MPIOff
+ *
+ * Purpose:     Convert an haddr_t value to MPI_Offset.
+ *
+ * Return:      Success:	Non-negative, the MPI_OFF argument contains
+ *				the converted value.
+ *
+ * 		Failure:	Negative, MPI_OFF is undefined.
+ *
+ * Programmer:  Unknown
+ *              January 30, 1998
+ *
+ * Modifications:
+ * 		Robb Matzke, 1999-04-23
+ *		An error is reported for address overflows. The ADDR output
+ *		argument is optional.
+ *
+ * 		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *
+ * 		Robb Matzke, 1999-08-06
+ *		Modified to work with the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpi_haddr_to_MPIOff(haddr_t addr, MPI_Offset *mpi_off/*out*/)
+{
+    herr_t ret_value=FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mpi_off);
+
+    /* Convert the HDF5 address into an MPI offset */
+    *mpi_off = (MPI_Offset)addr;
+
+    if (addr != (haddr_t)((MPI_Offset)addr))
+        ret_value=FAIL;
+    else
+        ret_value=SUCCEED;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpi_comm_info_dup
+ *
+ * Purpose:     Make duplicates of communicator and Info object.
+ * 		If the Info object is in fact MPI_INFO_NULL, no duplicate
+ * 		is made but the same value assigned to the new Info object
+ * 		handle.
+ *
+ * Return:      Success:	Non-negative.  The new communicator and Info
+ * 				object handles are returned via comm_new and
+ * 				info_new pointers.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:  Albert Cheng
+ *              Jan  8, 2003
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpi_comm_info_dup(MPI_Comm comm, MPI_Info info, MPI_Comm *comm_new, MPI_Info *info_new)
+{
+    herr_t	ret_value=SUCCEED;
+    MPI_Comm	comm_dup=MPI_COMM_NULL;
+    MPI_Info	info_dup=MPI_INFO_NULL;
+    int		mpi_code;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if (MPI_COMM_NULL == comm)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "not a valid argument")
+    if (!comm_new || !info_new)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "bad pointers")
+
+    /* Dup them.  Using temporary variables for error recovery cleanup. */
+    if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(comm, &comm_dup)))
+	HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
+    if (MPI_INFO_NULL != info){
+	if (MPI_SUCCESS != (mpi_code=MPI_Info_dup(info, &info_dup)))
+	    HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code)
+    }else{
+	/* No dup, just copy it. */
+	info_dup = info;
+    }
+
+    /* copy them to the return arguments */
+    *comm_new = comm_dup;
+    *info_new = info_dup;
+
+done:
+    if (FAIL == ret_value){
+	/* need to free anything created here */
+	if (MPI_COMM_NULL != comm_dup)
+	    MPI_Comm_free(&comm_dup);
+	if (MPI_INFO_NULL != info_dup)
+	    MPI_Info_free(&info_dup);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpi_comm_info_free
+ *
+ * Purpose:     Free the communicator and Info object.
+ * 		If comm or info is in fact MPI_COMM_NULL or MPI_INFO_NULL
+ * 		respectively, no action occurs to it.
+ *
+ * Return:      Success:	Non-negative.  The values the pointers refer
+ * 				to will be set to the corresponding NULL
+ * 				handles.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:  Albert Cheng
+ *              Jan  8, 2003
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpi_comm_info_free(MPI_Comm *comm, MPI_Info *info)
+{
+    herr_t      ret_value=SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if (!comm || !info)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "not a valid argument")
+
+    if (MPI_COMM_NULL != *comm)
+	MPI_Comm_free(comm);
+    if (MPI_INFO_NULL != *info)
+	MPI_Info_free(info);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+#ifdef NOT_YET
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpio_wait_for_left_neighbor
+ *
+ * Purpose:	Blocks until (empty) msg is received from immediately
+ *		lower-rank neighbor. In conjunction with
+ *		H5FD_mpio_signal_right_neighbor, useful for enforcing
+ *		1-process-at-at-time access to critical regions to avoid race
+ *		conditions (though it is overkill to require that the
+ *		processes be allowed to proceed strictly in order of their
+ *		rank).
+ *
+ * Note:	This routine doesn't read or write any file, just performs
+ *		interprocess coordination. It really should reside in a
+ *		separate package of such routines.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	rky
+ *              19981207
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-08-09
+ *		Modified to work with the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpio_wait_for_left_neighbor(H5FD_t *_file)
+{
+    H5FD_mpio_t	*file = (H5FD_mpio_t*)_file;
+    char msgbuf[1];
+    MPI_Status rcvstat;
+    int		mpi_code;		/* mpi return code */
+    herr_t      ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    /* Portably initialize MPI status variable */
+    HDmemset(&rcvstat,0,sizeof(MPI_Status));
+
+    /* p0 has no left neighbor; all other procs wait for msg */
+    if (file->mpi_rank != 0) {
+        if (MPI_SUCCESS != (mpi_code=MPI_Recv( &msgbuf, 1, MPI_CHAR,
+			file->mpi_rank-1, MPI_ANY_TAG, file->comm, &rcvstat )))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mpi_code)
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpio_signal_right_neighbor
+ *
+ * Purpose:	Blocks until (empty) msg is received from immediately
+ *		lower-rank neighbor. In conjunction with
+ *		H5FD_mpio_wait_for_left_neighbor, useful for enforcing
+ *		1-process-at-at-time access to critical regions to avoid race
+ *		conditions (though it is overkill to require that the
+ *		processes be allowed to proceed strictly in order of their
+ *		rank).
+ *
+ * Note: 	This routine doesn't read or write any file, just performs
+ *		interprocess coordination. It really should reside in a
+ *		separate package of such routines.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	rky
+ *              19981207
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-08-09
+ *		Modified to work with the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpio_signal_right_neighbor(H5FD_t *_file)
+{
+    H5FD_mpio_t	*file = (H5FD_mpio_t*)_file;
+    char msgbuf[1];
+    int		mpi_code;		/* mpi return code */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    if(file->mpi_rank != (file->mpi_size - 1))
+        if(MPI_SUCCESS != (mpi_code=MPI_Send(&msgbuf, 0/*empty msg*/, MPI_CHAR, file->mpi_rank + 1, 0, file->comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mpi_code)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+#endif /* NOT_YET */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_mpi_setup_collective
+ *
+ * Purpose:	Set the buffer type BTYPE, file type FTYPE for a data
+ *		transfer. Also request a MPI type transfer.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August  9, 1999
+ *
+ * Modifications:
+ *
+ *              Quincey Koziol - 2002/06/17
+ *              Removed 'disp' parameter, read & write routines will use
+ *              the address of the dataset in MPI_File_set_view() calls, as
+ *              necessary.
+ *
+ *              Quincey Koziol - 2002/06/17
+ *              Changed to set temporary properties in a dxpl, instead of
+ *              flags in the file struct, which will make this more threadsafe.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_mpi_setup_collective(hid_t dxpl_id, MPI_Datatype *btype, MPI_Datatype *ftype)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dataset transfer list")
+
+    /* Set buffer MPI type */
+    if(H5P_set(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, btype) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+
+    /* Set File MPI type */
+    if(H5P_set(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, ftype) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpi_setup_collective() */
+
+#endif /* H5_HAVE_PARALLEL */
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmpi.h b/gatb-core/thirdparty/hdf5/src/H5FDmpi.h
new file mode 100644
index 0000000..784fe70
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmpi.h
@@ -0,0 +1,62 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Friday, January 30, 2004
+ *
+ * Purpose:	The public header file for common items for all MPI VFL drivers
+ */
+#ifndef H5FDmpi_H
+#define H5FDmpi_H
+
+/***** Macros for One linked collective IO case. *****/
+/* The default value to do one linked collective IO for all chunks.
+   If the average number of chunks per process is greater than this value,
+      the library will create an MPI derived datatype to link all chunks to do collective IO.
+      The user can set this value through an API. */
+
+#define H5D_ONE_LINK_CHUNK_IO_THRESHOLD 0
+/***** Macros for multi-chunk collective IO case. *****/
+/* The default value of the threshold to do collective IO for this chunk.
+   If the average percentage of processes per chunk is greater than the default value,
+   collective IO is done for this chunk.
+*/
+
+#define H5D_MULTI_CHUNK_IO_COL_THRESHOLD 60
+/* Type of I/O for data transfer properties */
+typedef enum H5FD_mpio_xfer_t {
+    H5FD_MPIO_INDEPENDENT = 0, 		/*zero is the default*/
+    H5FD_MPIO_COLLECTIVE
+} H5FD_mpio_xfer_t;
+
+/* Type of chunked dataset I/O */
+typedef enum H5FD_mpio_chunk_opt_t {
+    H5FD_MPIO_CHUNK_DEFAULT = 0,
+    H5FD_MPIO_CHUNK_ONE_IO,  		/*zero is the default*/
+    H5FD_MPIO_CHUNK_MULTI_IO
+} H5FD_mpio_chunk_opt_t;
+
+/* Type of collective I/O */
+typedef enum H5FD_mpio_collective_opt_t {
+    H5FD_MPIO_COLLECTIVE_IO = 0,
+    H5FD_MPIO_INDIVIDUAL_IO  		/*zero is the default*/
+} H5FD_mpio_collective_opt_t;
+
+/* Include all the MPI VFL headers */
+#include "H5FDmpio.h"           /* MPI I/O file driver			*/
+
+#endif /* H5FDmpi_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmpio.c b/gatb-core/thirdparty/hdf5/src/H5FDmpio.c
new file mode 100644
index 0000000..4b9802f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmpio.c
@@ -0,0 +1,2098 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, July 29, 1999
+ *
+ * Purpose:  This is the MPI-2 I/O driver.
+ *
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC  H5FD_mpio_init_interface
+
+
+#include "H5private.h"    /* Generic Functions      */
+#include "H5Dprivate.h"    /* Dataset functions      */
+#include "H5Eprivate.h"    /* Error handling        */
+#include "H5Fprivate.h"    /* File access        */
+#include "H5FDprivate.h"  /* File drivers        */
+#include "H5FDmpi.h"            /* MPI-based file drivers    */
+#include "H5Iprivate.h"    /* IDs            */
+#include "H5MMprivate.h"  /* Memory management      */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+#ifdef H5_HAVE_PARALLEL
+
+/*
+ * The driver identification number, initialized at runtime if H5_HAVE_PARALLEL
+ * is defined. This allows applications to still have the H5FD_MPIO
+ * "constants" in their source code.
+ */
+static hid_t H5FD_MPIO_g = 0;
+
+/* Whether to allow collective I/O operations */
+/* (Value can be set from environment variable also) */
+hbool_t H5FD_mpi_opt_types_g = TRUE;
+
+/*
+ * The view is set to this value
+ */
+static char H5FD_mpi_native_g[] = "native";
+
+/*
+ * The description of a file belonging to this driver.
+ * The EOF value is only used just after the file is opened in order for the
+ * library to determine whether the file is empty, truncated, or okay. The MPIO
+ * driver doesn't bother to keep it updated since it's an expensive operation.
+ */
+typedef struct H5FD_mpio_t {
+    H5FD_t  pub;    /*public stuff, must be first    */
+    MPI_File  f;    /*MPIO file handle      */
+    MPI_Comm  comm;    /*communicator        */
+    MPI_Info  info;    /*file information      */
+    int         mpi_rank;       /* This process's rank                  */
+    int         mpi_size;       /* Total number of processes            */
+    haddr_t  eof;    /*end-of-file marker      */
+    haddr_t  eoa;    /*end-of-address marker      */
+    haddr_t  last_eoa;  /* Last known end-of-address marker  */
+} H5FD_mpio_t;
+
+/* Private Prototypes */
+
+/* Callbacks */
+static void *H5FD_mpio_fapl_get(H5FD_t *_file);
+static void *H5FD_mpio_fapl_copy(const void *_old_fa);
+static herr_t H5FD_mpio_fapl_free(void *_fa);
+static H5FD_t *H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
+            haddr_t maxaddr);
+static herr_t H5FD_mpio_close(H5FD_t *_file);
+static herr_t H5FD_mpio_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_mpio_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_mpio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+            size_t size, void *buf);
+static herr_t H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+            size_t size, const void *buf);
+static herr_t H5FD_mpio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_mpio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static int H5FD_mpio_mpi_rank(const H5FD_t *_file);
+static int H5FD_mpio_mpi_size(const H5FD_t *_file);
+static MPI_Comm H5FD_mpio_communicator(const H5FD_t *_file);
+
+/* MPIO-specific file access properties */
+typedef struct H5FD_mpio_fapl_t {
+    MPI_Comm    comm;    /*communicator      */
+    MPI_Info    info;    /*file information    */
+} H5FD_mpio_fapl_t;
+
+/* The MPIO file driver information */
+static const H5FD_class_mpi_t H5FD_mpio_g = {
+    {   /* Start of superclass information */
+    "mpio",          /*name      */
+    HADDR_MAX,          /*maxaddr    */
+    H5F_CLOSE_SEMI,        /* fc_degree    */
+    NULL,          /*sb_size    */
+    NULL,          /*sb_encode    */
+    NULL,          /*sb_decode    */
+    sizeof(H5FD_mpio_fapl_t),      /*fapl_size    */
+    H5FD_mpio_fapl_get,        /*fapl_get    */
+    H5FD_mpio_fapl_copy,      /*fapl_copy    */
+    H5FD_mpio_fapl_free,       /*fapl_free    */
+    0,                        /*dxpl_size    */
+    NULL,          /*dxpl_copy    */
+    NULL,          /*dxpl_free    */
+    H5FD_mpio_open,        /*open      */
+    H5FD_mpio_close,        /*close      */
+    NULL,          /*cmp      */
+    H5FD_mpio_query,                    /*query      */
+    NULL,          /*get_type_map    */
+    NULL,          /*alloc      */
+    NULL,          /*free      */
+    H5FD_mpio_get_eoa,        /*get_eoa    */
+    H5FD_mpio_set_eoa,         /*set_eoa    */
+    H5FD_mpio_get_eof,        /*get_eof    */
+    H5FD_mpio_get_handle,                       /*get_handle            */
+    H5FD_mpio_read,        /*read      */
+    H5FD_mpio_write,        /*write      */
+    H5FD_mpio_flush,        /*flush      */
+    H5FD_mpio_truncate,        /*truncate    */
+    NULL,                                       /*lock                  */
+    NULL,                                       /*unlock                */
+    H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
+    },  /* End of superclass information */
+    H5FD_mpio_mpi_rank,                         /*get_rank              */
+    H5FD_mpio_mpi_size,                         /*get_size              */
+    H5FD_mpio_communicator                      /*get_comm              */
+};
+
+#ifdef H5FDmpio_DEBUG
+/* Flags to control debug actions in H5Fmpio.
+ * Meant to be indexed by characters.
+ *
+ * 'c' show result of MPI_Get_count after read
+ * 'r' show read offset and size
+ * 't' trace function entry and exit
+ * 'w' show write offset and size
+ */
+static int H5FD_mpio_Debug[256] =
+        { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+#endif
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FD_mpio_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FD_mpio_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5FD_mpio_init currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FD_mpio_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_mpio_init())
+} /* H5FD_mpio_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_init
+ *
+ * Purpose:  Initialize this driver by registering the driver with the
+ *    library.
+ *
+ * Return:  Success:  The driver ID for the mpio driver.
+ *    Failure:  Negative.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, August 5, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_mpio_init(void)
+{
+#ifdef H5FDmpio_DEBUG
+    static int H5FD_mpio_Debug_inited = 0;
+#endif /* H5FDmpio_DEBUG */
+    const char *s;              /* String for environment variables */
+    hid_t ret_value;        	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Register the MPI-IO VFD, if it isn't already */
+    if(H5I_VFL != H5I_get_type(H5FD_MPIO_g))
+        H5FD_MPIO_g = H5FD_register((const H5FD_class_t *)&H5FD_mpio_g, sizeof(H5FD_class_mpi_t), FALSE);
+
+    /* Allow MPI buf-and-file-type optimizations? */
+    s = HDgetenv("HDF5_MPI_OPT_TYPES");
+    if(s && HDisdigit(*s))
+        H5FD_mpi_opt_types_g = (hbool_t)HDstrtol(s, NULL, 0);
+
+#ifdef H5FDmpio_DEBUG
+    if(!H5FD_mpio_Debug_inited) {
+        /* Retrieve MPI-IO debugging environment variable */
+        s = HDgetenv("H5FD_mpio_Debug");
+        if(s) {
+            /* Set debug mask */
+	    while(*s) {
+		H5FD_mpio_Debug[(int)*s]++;
+		s++;
+	    } /* end while */
+        } /* end if */
+        H5FD_mpio_Debug_inited++;
+    } /* end if */
+#endif /* H5FDmpio_DEBUG */
+
+    /* Set return value */
+    ret_value = H5FD_MPIO_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_init() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:  H5FD_mpio_term
+ *
+ * Purpose:  Shut down the VFD
+ *
+ * Return:  <none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ * Modification:
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_mpio_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_MPIO_g=0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_mpio_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_fapl_mpio
+ *
+ * Purpose:  Store the user supplied MPIO communicator comm and info in
+ *    the file access property list FAPL_ID which can then be used
+ *    to create and/or open the file.  This function is available
+ *    only in the parallel HDF5 library and is not collective.
+ *
+ *    comm is the MPI communicator to be used for file open as
+ *    defined in MPI_FILE_OPEN of MPI-2. This function makes a
+ *    duplicate of comm. Any modification to comm after this function
+ *    call returns has no effect on the access property list.
+ *
+ *    info is the MPI Info object to be used for file open as
+ *    defined in MPI_FILE_OPEN of MPI-2. This function makes a
+ *    duplicate of info. Any modification to info after this
+ *    function call returns has no effect on the access property
+ *    list.
+ *
+ *              If fapl_id has previously set comm and info values, they
+ *              will be replaced and the old communicator and Info object
+ *              are freed.
+ *
+ * Return:  Success:  Non-negative
+ *
+ *     Failure:  Negative
+ *
+ * Programmer:  Albert Cheng
+ *    Feb 3, 1998
+ *
+ * Modifications:
+ *    Robb Matzke, 1998-02-18
+ *    Check all arguments before the property list is updated so we
+ *    don't leave the property list in a bad state if something
+ *    goes wrong.  Also, the property list data type changed to
+ *    allow more generality so all the mpi-related stuff is in the
+ *    `u.mpi' member.  The `access_mode' will contain only
+ *     mpi-related flags defined in H5Fpublic.h.
+ *
+ *    Albert Cheng, 1998-04-16
+ *    Removed the ACCESS_MODE argument.  The access mode is changed
+ *    to be controlled by data transfer property list during data
+ *    read/write calls.
+ *
+ *     Robb Matzke, 1999-08-06
+ *    Modified to work with the virtual file layer.
+ *
+ *    Raymond Lu, 2001-10-23
+ *    Changed the file access list to the new generic property
+ *    list.
+ *
+ *    Albert Cheng, 2003-04-17
+ *    Modified the description of the function that it now stores
+ *    a duplicate of the communicator and INFO object.  Free the
+ *    old duplicates if previously set.  (Work is actually done
+ *    by H5P_set_driver.)
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info)
+{
+    H5FD_mpio_fapl_t  fa;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iMcMi", fapl_id, comm, info);
+
+    if(fapl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
+    if(MPI_COMM_NULL == comm)
+  HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
+
+    /* Initialize driver specific properties */
+    fa.comm = comm;
+    fa.info = info;
+
+    /* duplication is done during driver setting. */
+    ret_value= H5P_set_driver(plist, H5FD_MPIO, &fa);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pget_fapl_mpio
+ *
+ * Purpose:  If the file access property list is set to the H5FD_MPIO
+ *    driver then this function returns duplicates of the MPI
+ *    communicator and Info object stored through the comm and
+ *    info pointers.  It is the responsibility of the application
+ *    to free the returned communicator and Info object.
+ *
+ * Return:  Success:  Non-negative with the communicator and
+ *        Info object returned through the comm and
+ *        info arguments if non-null. Since they are
+ *        duplicates of the stored objects, future
+ *        modifications to the access property list do
+ *        not affect them and it is the responsibility
+ *        of the application to free them.
+ *
+ *     Failure:  Negative
+ *
+ * Programmer:  Robb Matzke
+ *    Thursday, February 26, 1998
+ *
+ * Modifications:
+ *
+ *          Albert Cheng, Apr 16, 1998
+ *          Removed the access_mode argument.  The access_mode is changed
+ *          to be controlled by data transfer property list during data
+ *          read/write calls.
+ *
+ *    Raymond Lu, 2001-10-23
+ *    Changed the file access list to the new generic property
+ *    list.
+ *
+ *    Albert Cheng, 2003-04-17
+ *    Return duplicates of the stored communicator and Info object.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/)
+{
+    H5FD_mpio_fapl_t  *fa;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    MPI_Comm  comm_tmp=MPI_COMM_NULL;
+    int    mpi_code;    /* mpi return code */
+    herr_t      ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", fapl_id, comm, info);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
+    if(H5FD_MPIO != H5P_get_driver(plist))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
+    if(NULL == (fa = (H5FD_mpio_fapl_t *)H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
+
+    /* Store the duplicated communicator in a temporary variable for error */
+    /* recovery in case the INFO duplication fails.  We cannot attempt to */
+    /* the value into *comm yet since if MPI_Comm_dup fails, we will end  */
+    /* up freeing whatever *comm holds and that could be invalid. */
+    if (comm){
+  if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(fa->comm, &comm_tmp)))
+      HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
+    }
+
+    if (info){
+  if (MPI_INFO_NULL != fa->info){
+      if (MPI_SUCCESS != (mpi_code=MPI_Info_dup(fa->info, info)))
+    HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code)
+  }else{
+      /* do not dup it */
+      *info = MPI_INFO_NULL;
+  }
+    }
+
+    if (comm)
+        *comm = comm_tmp;
+
+done:
+    if (FAIL==ret_value){
+  /* need to free anything created here */
+  if (comm_tmp != MPI_COMM_NULL)
+      MPI_Comm_free(&comm_tmp);
+    }
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_dxpl_mpio
+ *
+ * Purpose:  Set the data transfer property list DXPL_ID to use transfer
+ *    mode XFER_MODE. The property list can then be used to control
+ *    the I/O transfer mode during data I/O operations. The valid
+ *    transfer modes are:
+ *
+ *     H5FD_MPIO_INDEPENDENT:
+ *      Use independent I/O access (the default).
+ *
+ *     H5FD_MPIO_COLLECTIVE:
+ *      Use collective I/O access.
+ *
+ * Return:  Success:  Non-negative
+ *     Failure:  Negative
+ *
+ * Programmer:  Albert Cheng
+ *    April 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDt", dxpl_id, xfer_mode);
+
+    if(dxpl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+    if(H5FD_MPIO_INDEPENDENT != xfer_mode && H5FD_MPIO_COLLECTIVE != xfer_mode)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "incorrect xfer_mode")
+
+    /* Set the transfer mode */
+    if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_dxpl_mpio() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pget_dxpl_mpio
+ *
+ * Purpose:  Queries the transfer mode current set in the data transfer
+ *    property list DXPL_ID. This is not collective.
+ *
+ * Return:  Success:  Non-negative, with the transfer mode returned
+ *        through the XFER_MODE argument if it is
+ *        non-null.
+ *
+ *     Failure:  Negative
+ *
+ * Programmer:  Albert Cheng
+ *    April 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode/*out*/)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", dxpl_id, xfer_mode);
+
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+
+    /* Get the transfer mode */
+    if(xfer_mode)
+        if(H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, xfer_mode) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_dxpl_mpio() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_dxpl_mpio_collective_opt
+ *
+ * Purpose:	To set a flag to choose linked chunk I/O or multi-chunk I/O
+ *		without involving decision-making inside HDF5
+ *
+ * Note:	The library will do linked chunk I/O or multi-chunk I/O without
+ *		involving communications for decision-making process.
+ *		The library won't behave as it asks for only when we find
+ *		that the low-level MPI-IO package doesn't support this.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Kent Yang
+ *		? ?, ?
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_dxpl_mpio_collective_opt(hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mode)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDc", dxpl_id, opt_mode);
+
+    if(dxpl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+
+    /* Set the transfer mode */
+    if(H5P_set(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_dxpl_mpio_collective_opt() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_dxpl_mpio_chunk_opt
+ *
+ * Purpose:	To set a flag to choose linked chunk I/O or multi-chunk I/O
+ *		without involving decision-making inside HDF5
+ *
+ * Note:	The library will do linked chunk I/O or multi-chunk I/O without
+ *		involving communications for decision-making process.
+ *		The library won't behave as it asks for only when we find
+ *		that the low-level MPI-IO package doesn't support this.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Kent Yang
+ *		? ?, ?
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_dxpl_mpio_chunk_opt(hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDh", dxpl_id, opt_mode);
+
+    if(dxpl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+
+    /* Set the transfer mode */
+    if(H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, &opt_mode) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_dxpl_mpio_chunk_opt() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_dxpl_mpio_chunk_opt_num
+ *
+ * Purpose:	To set a threshold for doing linked chunk IO
+ *
+ * Note:	If the number is greater than the threshold set by the user,
+ *		the library will do linked chunk I/O; otherwise, I/O will be
+ *		done for every chunk.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Kent Yang
+ *		? ?, ?
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_dxpl_mpio_chunk_opt_num(hid_t dxpl_id, unsigned num_chunk_per_proc)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", dxpl_id, num_chunk_per_proc);
+
+    if(dxpl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+
+    /* Set the transfer mode */
+    if(H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, &num_chunk_per_proc) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_dxpl_mpio_chunk_opt_num() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_dxpl_mpio_chunk_opt_ratio
+ *
+ * Purpose:	To set a threshold for doing collective I/O for each chunk
+ *
+ * Note:	The library will calculate the percentage of the number of
+ *		process holding selections at each chunk. If that percentage
+ *		of number of process in the individual chunk is greater than
+ *		the threshold set by the user, the library will do collective
+ *		chunk I/O for this chunk; otherwise, independent I/O will be
+ *		done for this chunk.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Kent Yang
+ *		? ?, ?
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_num_proc_per_chunk)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", dxpl_id, percent_num_proc_per_chunk);
+
+    if(dxpl_id == H5P_DEFAULT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't set values in default property list")
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl")
+
+    /* Set the transfer mode */
+    if(H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, &percent_num_proc_per_chunk) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_dxpl_mpio_chunk_opt_ratio() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_fapl_get
+ *
+ * Purpose:  Returns a file access property list which could be used to
+ *    create another file the same as this one.
+ *
+ * Return:  Success:  Ptr to new file access property list with all
+ *        fields copied from the file pointer.
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_mpio_fapl_get(H5FD_t *_file)
+{
+    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
+    H5FD_mpio_fapl_t  *fa = NULL;
+    void      *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+    HDassert(H5FD_MPIO == file->pub.driver_id);
+
+    if(NULL == (fa = (H5FD_mpio_fapl_t *)H5MM_calloc(sizeof(H5FD_mpio_fapl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Duplicate communicator and Info object. */
+    if(FAIL == H5FD_mpi_comm_info_dup(file->comm, file->info, &fa->comm, &fa->info))
+  HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+
+    /* Set return value */
+    ret_value = fa;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_fapl_copy
+ *
+ * Purpose:  Copies the mpio-specific file access properties.
+ *
+ * Return:  Success:  Ptr to a new property list
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Albert Cheng
+ *              Jan  8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_mpio_fapl_copy(const void *_old_fa)
+{
+    void    *ret_value = NULL;
+    const H5FD_mpio_fapl_t *old_fa = (const H5FD_mpio_fapl_t*)_old_fa;
+    H5FD_mpio_fapl_t  *new_fa = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef H5FDmpio_DEBUG
+if (H5FD_mpio_Debug[(int)'t'])
+fprintf(stderr, "enter H5FD_mpio_fapl_copy\n");
+#endif
+
+    if(NULL == (new_fa = (H5FD_mpio_fapl_t *)H5MM_malloc(sizeof(H5FD_mpio_fapl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the general information */
+    HDmemcpy(new_fa, old_fa, sizeof(H5FD_mpio_fapl_t));
+
+    /* Duplicate communicator and Info object. */
+    if(FAIL == H5FD_mpi_comm_info_dup(old_fa->comm, old_fa->info, &new_fa->comm, &new_fa->info))
+  HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+    ret_value = new_fa;
+
+done:
+    if (NULL == ret_value){
+  /* cleanup */
+  if (new_fa)
+      H5MM_xfree(new_fa);
+    }
+
+#ifdef H5FDmpio_DEBUG
+if (H5FD_mpio_Debug[(int)'t'])
+fprintf(stderr, "leaving H5FD_mpio_fapl_copy\n");
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_fapl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_fapl_free
+ *
+ * Purpose:  Frees the mpio-specific file access properties.
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Albert Cheng
+ *              Jan  8, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_fapl_free(void *_fa)
+{
+    herr_t    ret_value = SUCCEED;
+    H5FD_mpio_fapl_t  *fa = (H5FD_mpio_fapl_t*)_fa;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+#ifdef H5FDmpio_DEBUG
+if (H5FD_mpio_Debug[(int)'t'])
+fprintf(stderr, "in H5FD_mpio_fapl_free\n");
+#endif
+    HDassert(fa);
+
+    /* Free the internal communicator and INFO object */
+    HDassert(MPI_COMM_NULL!=fa->comm);
+    H5FD_mpi_comm_info_free(&fa->comm, &fa->info);
+    H5MM_xfree(fa);
+
+#ifdef H5FDmpio_DEBUG
+if (H5FD_mpio_Debug[(int)'t'])
+fprintf(stderr, "leaving H5FD_mpio_fapl_free\n");
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_fapl_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_set_mpio_atomicity
+ *
+ * Purpose:	Sets the atomicity mode
+ *
+ * Return:	Success:	Non-negative
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		Feb 14, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_set_mpio_atomicity(H5FD_t *_file, hbool_t flag)
+{
+    H5FD_mpio_t *file = (H5FD_mpio_t*)_file;
+    int          mpi_code;               /* MPI return code */
+    int          temp_flag;
+    herr_t       ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+    	fprintf(stdout, "Entering H5FD_set_mpio_atomicity\n");
+#endif
+
+    if (FALSE == flag)
+        temp_flag = 0;
+    else
+        temp_flag = 1;
+
+    /* set atomicity value */
+    if (MPI_SUCCESS != (mpi_code=MPI_File_set_atomicity(file->f, temp_flag)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_File_set_atomicity", mpi_code)
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+    	fprintf(stdout, "Leaving H5FD_set_mpio_atomicity\n");
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_get_mpio_atomicity
+ *
+ * Purpose:	Returns the atomicity mode
+ *
+ * Return:	Success:	Non-negative
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		Feb 14, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_mpio_atomicity(H5FD_t *_file, hbool_t *flag)
+{
+    H5FD_mpio_t *file = (H5FD_mpio_t*)_file;
+    int          mpi_code;               /* MPI return code */
+    int          temp_flag;
+    herr_t       ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+    	fprintf(stdout, "Entering H5FD_get_mpio_atomicity\n");
+#endif
+
+    /* get atomicity value */
+    if (MPI_SUCCESS != (mpi_code=MPI_File_get_atomicity(file->f, &temp_flag)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_File_get_atomicity", mpi_code)
+
+    if (0 != temp_flag)
+        *flag = TRUE;
+    else
+        *flag = FALSE;
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+    	fprintf(stdout, "Leaving H5FD_get_mpio_atomicity\n");
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpio_open
+ *
+ * Purpose:     Opens a file with name NAME.  The FLAGS are a bit field with
+ *    purpose similar to the second argument of open(2) and which
+ *    are defined in H5Fpublic.h. The file access property list
+ *    FAPL_ID contains the properties driver properties and MAXADDR
+ *    is the largest address which this file will be expected to
+ *    access.  This is collective.
+ *
+ * Return:      Success:        A new file pointer.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:
+ *              January 30, 1998
+ *
+ * Modifications:
+ *     Robb Matzke, 1998-02-18
+ *    Added the ACCESS_PARMS argument.  Moved some error checking
+ *    here from elsewhere.
+ *
+ *        rky, 1998-01-11
+ *        Added H5FD_mpio_Debug debug flags controlled by MPI_Info.
+ *
+ *        rky, 1998-08-28
+ *    Init flag controlling redundant metadata writes to disk.
+ *
+ *        rky, 1998-12-07
+ *    Added barrier after MPI_File_set_size to prevent race
+ *    condition -- subsequent writes were being truncated, causing
+ *    holes in file.
+ *
+ *     Robb Matzke, 1999-08-06
+ *    Modified to work with the virtual file layer.
+ *
+ *        rky & ppw, 1999-11-07
+ *    Modified "H5FD_mpio_open" so that file-truncation is
+ *              avoided for brand-new files (with zero filesize).
+ *
+ *     Albert Cheng, 2003-04-17
+ *     Duplicate the communicator and Info object so that file is
+ *     insulated from the old one.
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
+	       haddr_t H5_ATTR_UNUSED maxaddr)
+{
+    H5FD_mpio_t      *file=NULL;
+    MPI_File      fh;
+    unsigned                    file_opened=0;  /* Flag to indicate that the file was successfully opened */
+    int        mpi_amode;
+    int        mpi_rank;       /* MPI rank of this process */
+    int        mpi_size;       /* Total number of MPI processes */
+    int        mpi_code;  /* mpi return code */
+    MPI_Offset      size;
+    const H5FD_mpio_fapl_t  *fa=NULL;
+    H5FD_mpio_fapl_t    _fa;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    MPI_Comm                    comm_dup=MPI_COMM_NULL;
+    MPI_Info                    info_dup=MPI_INFO_NULL;
+    H5FD_t      *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t']) {
+      fprintf(stdout, "Entering H5FD_mpio_open(name=\"%s\", flags=0x%x, "
+    "fapl_id=%d, maxaddr=%lu)\n", name, flags, (int)fapl_id, (unsigned long)maxaddr);
+    }
+#endif
+
+    /* Obtain a pointer to mpio-specific file access properties */
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+    if(H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIO != H5P_get_driver(plist)) {
+        _fa.comm = MPI_COMM_SELF; /*default*/
+        _fa.info = MPI_INFO_NULL; /*default*/
+        fa = &_fa;
+    } else {
+        if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_get_driver_info(plist)))
+	    HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
+    }
+
+    /* Duplicate communicator and Info object for use by this file. */
+    if (FAIL==H5FD_mpi_comm_info_dup(fa->comm, fa->info, &comm_dup, &info_dup))
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+
+    /* convert HDF5 flags to MPI-IO flags */
+    /* some combinations are illegal; let MPI-IO figure it out */
+    mpi_amode  = (flags&H5F_ACC_RDWR) ? MPI_MODE_RDWR : MPI_MODE_RDONLY;
+    if (flags&H5F_ACC_CREAT)  mpi_amode |= MPI_MODE_CREATE;
+    if (flags&H5F_ACC_EXCL)  mpi_amode |= MPI_MODE_EXCL;
+
+#ifdef H5FDmpio_DEBUG
+    /* Check for debug commands in the info parameter */
+    {
+  char debug_str[128];
+        int flag, i;
+        if (MPI_INFO_NULL != info_dup) {
+            MPI_Info_get(fa->info, H5F_MPIO_DEBUG_KEY, sizeof(debug_str)-1, debug_str, &flag);
+            if (flag) {
+                fprintf(stdout, "H5FD_mpio debug flags=%s\n", debug_str );
+                for (i=0;
+                     debug_str[i]/*end of string*/ && i<128/*just in case*/;
+                     ++i) {
+                    H5FD_mpio_Debug[(int)debug_str[i]] = 1;
+                }
+            }
+        }
+    }
+#endif
+
+    if(MPI_SUCCESS != (mpi_code = MPI_File_open(comm_dup, name, mpi_amode, info_dup, &fh)))
+        HMPI_GOTO_ERROR(NULL, "MPI_File_open failed", mpi_code)
+    file_opened=1;
+
+    /* Get the MPI rank of this process and the total number of processes */
+    if (MPI_SUCCESS != (mpi_code=MPI_Comm_rank (comm_dup, &mpi_rank)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Comm_rank failed", mpi_code)
+    if (MPI_SUCCESS != (mpi_code=MPI_Comm_size (comm_dup, &mpi_size)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Comm_size failed", mpi_code)
+
+    /* Build the return value and initialize it */
+    if(NULL == (file = (H5FD_mpio_t *)H5MM_calloc(sizeof(H5FD_mpio_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    file->f = fh;
+    file->comm = comm_dup;
+    file->info = info_dup;
+    file->mpi_rank = mpi_rank;
+    file->mpi_size = mpi_size;
+
+    /* Only processor p0 will get the filesize and broadcast it. */
+    if (mpi_rank == 0) {
+        if (MPI_SUCCESS != (mpi_code=MPI_File_get_size(fh, &size)))
+            HMPI_GOTO_ERROR(NULL, "MPI_File_get_size failed", mpi_code)
+    } /* end if */
+
+    /* Broadcast file size */
+    if(MPI_SUCCESS != (mpi_code = MPI_Bcast(&size, (int)sizeof(MPI_Offset), MPI_BYTE, 0, comm_dup)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
+
+    /* Determine if the file should be truncated */
+    if(size && (flags & H5F_ACC_TRUNC)) {
+        if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(fh, (MPI_Offset)0)))
+            HMPI_GOTO_ERROR(NULL, "MPI_File_set_size failed", mpi_code)
+
+        /* Don't let any proc return until all have truncated the file. */
+        if (MPI_SUCCESS!= (mpi_code=MPI_Barrier(comm_dup)))
+            HMPI_GOTO_ERROR(NULL, "MPI_Barrier failed", mpi_code)
+
+        /* File is zero size now */
+        size = 0;
+    } /* end if */
+
+    /* Set the size of the file (from library's perspective) */
+    file->eof = H5FD_mpi_MPIOff_to_haddr(size);
+
+    /* Set return value */
+    ret_value=(H5FD_t*)file;
+
+done:
+    if(ret_value==NULL) {
+        if(file_opened)
+            MPI_File_close(&fh);
+  if (MPI_COMM_NULL != comm_dup)
+      MPI_Comm_free(&comm_dup);
+  if (MPI_INFO_NULL != info_dup)
+      MPI_Info_free(&info_dup);
+  if (file)
+      H5MM_xfree(file);
+    } /* end if */
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+        fprintf(stdout, "Leaving H5FD_mpio_open\n" );
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpio_close
+ *
+ * Purpose:     Closes a file.  This is collective.
+ *
+ * Return:      Success:  Non-negative
+ *
+ *     Failure:  Negative
+ *
+ * Programmer:  Unknown
+ *              January 30, 1998
+ *
+ * Modifications:
+ *     Robb Matzke, 1998-02-18
+ *    Added the ACCESS_PARMS argument.
+ *
+ *     Robb Matzke, 1999-08-06
+ *    Modified to work with the virtual file layer.
+ *
+ *     Albert Cheng, 2003-04-17
+ *    Free the communicator stored.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_close(H5FD_t *_file)
+{
+    H5FD_mpio_t  *file = (H5FD_mpio_t*)_file;
+    int    mpi_code;          /* MPI return code */
+    herr_t      ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "Entering H5FD_mpio_close\n");
+#endif
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    /* MPI_File_close sets argument to MPI_FILE_NULL */
+    if (MPI_SUCCESS != (mpi_code=MPI_File_close(&(file->f)/*in,out*/)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_File_close failed", mpi_code)
+
+    /* Clean up other stuff */
+    H5FD_mpi_comm_info_free(&file->comm, &file->info);
+    H5MM_xfree(file);
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "Leaving H5FD_mpio_close\n");
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_query
+ *
+ * Purpose:  Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:  Success:  non-negative
+ *
+ *    Failure:  negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ * Modifications:
+ *
+ *    John Mainzer -- 9/21/05
+ *    Modified code to turn off the
+ *    H5FD_FEAT_ACCUMULATE_METADATA_WRITE flag.
+ *              With the movement of
+ *    all cache writes to process 0, this flag has become
+ *    problematic in PHDF5.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out */)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags=0;
+        *flags|=H5FD_FEAT_AGGREGATE_METADATA;  /* OK to aggregate metadata allocations */
+        *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+        *flags|=H5FD_FEAT_HAS_MPI;             /* This driver uses MPI */
+        *flags|=H5FD_FEAT_ALLOCATE_EARLY;      /* Allocate space early instead of late */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_get_eoa
+ *
+ * Purpose:  Gets the end-of-address marker for the file. The EOA marker
+ *    is the first address past the last byte allocated in the
+ *    format address space.
+ *
+ * Return:  Success:  The end-of-address marker.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, August  6, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_set_eoa
+ *
+ * Purpose:  Set the end-of-address marker for the file. This function is
+ *    called shortly after an existing HDF5 file is opened in order
+ *    to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, August 6, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
+{
+    H5FD_mpio_t  *file = (H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    file->eoa = addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_get_eof
+ *
+ * Purpose:  Gets the end-of-file marker for the file. The EOF marker
+ *    is the real size of the file.
+ *
+ *    The MPIO driver doesn't bother keeping this field updated
+ *    since that's a relatively expensive operation. Fortunately
+ *    the library only needs the EOF just after the file is opened
+ *    in order to determine whether the file is empty, truncated,
+ *    or okay.  Therefore, any MPIO I/O function will set its value
+ *    to HADDR_UNDEF which is the error return value of this
+ *    function.
+ *
+ *              Keeping the EOF updated (during write calls) is expensive
+ *              because any process may extend the physical end of the
+ *              file. -QAK
+ *
+ * Return:  Success:  The end-of-address marker.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, August  6, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_mpio_get_eof(const H5FD_t *_file)
+{
+    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    FUNC_LEAVE_NOAPI(file->eof)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_mpio_get_handle
+ *
+ * Purpose:        Returns the file handle of MPIO file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+*/
+static herr_t
+H5FD_mpio_get_handle(H5FD_t *_file, hid_t H5_ATTR_UNUSED fapl, void** file_handle)
+{
+    H5FD_mpio_t         *file = (H5FD_mpio_t *)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(!file_handle)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
+
+    *file_handle = &(file->f);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_read
+ *
+ * Purpose:  Reads SIZE bytes of data from FILE beginning at address ADDR
+ *    into buffer BUF according to data transfer properties in
+ *    DXPL_ID using potentially complex file and buffer types to
+ *    effect the transfer.
+ *
+ *    Reading past the end of the MPI file returns zeros instead of
+ *    failing.  MPI is able to coalesce requests from different
+ *    processes (collective or independent).
+ *
+ * Return:  Success:  Zero. Result is stored in caller-supplied
+ *        buffer BUF.
+ *
+ *    Failure:  -1, Contents of buffer BUF are undefined.
+ *
+ * Programmer:  rky, 1998-01-30
+ *
+ * Modifications:
+ *     Robb Matzke, 1998-02-18
+ *    Added the ACCESS_PARMS argument.
+ *
+ *     rky, 1998-04-10
+ *    Call independent or collective MPI read, based on
+ *    ACCESS_PARMS.
+ *
+ *     Albert Cheng, 1998-06-01
+ *    Added XFER_MODE to control independent or collective MPI
+ *    read.
+ *
+ *     rky, 1998-08-16
+ *    Use BTYPE, FTYPE, and DISP from access parms. The guts of
+ *    H5FD_mpio_read and H5FD_mpio_write should be replaced by a
+ *    single dual-purpose routine.
+ *
+ *     Robb Matzke, 1999-04-21
+ *    Changed XFER_MODE to XFER_PARMS for all H5F_*_read()
+ *    callbacks.
+ *
+ *     Robb Matzke, 1999-07-28
+ *    The ADDR argument is passed by value.
+ *
+ *     Robb Matzke, 1999-08-06
+ *    Modified to work with the virtual file layer.
+ *
+ *    Quincey Koziol,  2002-05-14
+ *    Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
+ *              for the I/O transfer.  Someday we might include code to decode
+ *              the MPI type used for more complicated transfers and call
+ *              MPI_Get_count all the time.
+ *
+ *              Quincey Koziol - 2002/06/17
+ *              Removed 'disp' parameter from H5FD_mpio_setup routine and use
+ *              the address of the dataset in MPI_File_set_view() calls, as
+ *              necessary.
+ *
+ *              Quincey Koziol - 2002/06/24
+ *              Removed "lazy" MPI_File_set_view() calls, since they would fail
+ *              if the first I/O was a collective I/O using MPI derived types
+ *              and the next I/O was an independent I/O.
+ *
+ *              Quincey Koziol - 2003/10/22-31
+ *              Restructured code massively, straightening out logic and finally
+ *              getting the bytes_read stuff working.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, haddr_t addr, size_t size,
+         void *buf/*out*/)
+{
+    H5FD_mpio_t      *file = (H5FD_mpio_t*)_file;
+    MPI_Offset      mpi_off;
+    MPI_Status      mpi_stat;       /* Status from I/O operation */
+    int        mpi_code;  /* mpi return code */
+    MPI_Datatype    buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
+    int             size_i;         /* Integer copy of 'size' to read */
+    int             bytes_read;     /* Number of bytes read in */
+    int             n;
+    int                         type_size;      /* MPI datatype used for I/O's size */
+    int                         io_size;        /* Actual number of bytes requested */
+    H5P_genplist_t              *plist = NULL;  /* Property list pointer */
+    hbool_t      use_view_this_time = FALSE;
+    herr_t                ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "Entering H5FD_mpio_read\n" );
+#endif
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+    /* Make certain we have the correct type of property list */
+    HDassert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+    HDassert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER));
+    HDassert(buf);
+
+    /* Portably initialize MPI status variable */
+    HDmemset(&mpi_stat,0,sizeof(MPI_Status));
+
+    /* some numeric conversions */
+    if (H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off/*out*/)<0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
+    size_i = (int)size;
+    if ((hsize_t)size_i != size)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from size to size_i")
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'r'])
+        fprintf(stdout, "in H5FD_mpio_read  mpi_off=%ld  size_i=%d\n",
+    (long)mpi_off, size_i );
+#endif
+
+    /* Only look for MPI views for raw data transfers */
+    if(type==H5FD_MEM_DRAW) {
+        H5FD_mpio_xfer_t            xfer_mode;   /* I/O tranfer mode */
+
+        /* Obtain the data transfer properties */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+        /* get the transfer mode from the dxpl */
+        if(H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode)<0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O transfer mode")
+
+        /*
+         * Set up for a fancy xfer using complex types, or single byte block. We
+         * wouldn't need to rely on the use_view field if MPI semantics allowed
+         * us to test that btype=ftype=MPI_BYTE (or even MPI_TYPE_NULL, which
+         * could mean "use MPI_BYTE" by convention).
+         */
+        if(xfer_mode==H5FD_MPIO_COLLECTIVE) {
+            MPI_Datatype    file_type;
+
+            /* Remember that views are used */
+            use_view_this_time = TRUE;
+
+            /* prepare for a full-blown xfer using btype, ftype, and disp */
+            if(H5P_get(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &buf_type)<0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
+            if(H5P_get(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type)<0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
+
+            /*
+             * Set the file view when we are using MPI derived types
+             */
+            if (MPI_SUCCESS != (mpi_code=MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g,  file->info)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
+
+            /* When using types, use the address as the displacement for
+             * MPI_File_set_view and reset the address for the read to zero
+             */
+            mpi_off=0;
+        } /* end if */
+    } /* end if */
+
+    /* Read the data. */
+    if(use_view_this_time) {
+       H5FD_mpio_collective_opt_t coll_opt_mode;
+
+#ifdef H5FDmpio_DEBUG
+  if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "H5FD_mpio_read: using MPIO collective mode\n");
+#endif
+        /* Get the collective_opt property to check whether the application wants to do IO individually. */
+        HDassert(plist);
+
+        /* get the transfer mode from the dxpl */
+        if(H5P_get(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &coll_opt_mode)<0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O collective_op property")
+
+        if(coll_opt_mode == H5FD_MPIO_COLLECTIVE_IO) {
+#ifdef H5FDmpio_DEBUG
+            if(H5FD_mpio_Debug[(int)'t'])
+                fprintf(stdout, "H5FD_mpio_read: doing MPI collective IO\n");
+#endif
+            if(MPI_SUCCESS != (mpi_code = MPI_File_read_at_all(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at_all failed", mpi_code)
+        } /* end if */
+        else {
+#ifdef H5FDmpio_DEBUG
+            if(H5FD_mpio_Debug[(int)'t'])
+                fprintf(stdout, "H5FD_mpio_read: doing MPI independent IO\n");
+#endif
+
+            if(MPI_SUCCESS != (mpi_code = MPI_File_read_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at failed", mpi_code)
+        } /* end else */
+
+        /*
+         * Reset the file view when we used MPI derived types
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, H5FD_mpi_native_g, file->info)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
+    } else {
+        if(MPI_SUCCESS != (mpi_code = MPI_File_read_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at failed", mpi_code)
+    }
+
+    /* How many bytes were actually read? */
+    /* [This works because the "basic elements" we use for all our MPI derived
+     *  types are MPI_BYTE.  We should be using the 'buf_type' for the MPI
+     *  datatype in this call though... (We aren't because using it causes
+     *  the LANL "qsc" machine to dump core - 12/19/03) - QAK]
+     */
+    if (MPI_SUCCESS != (mpi_code=MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_read)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code)
+
+    /* Get the type's size */
+    if (MPI_SUCCESS != (mpi_code=MPI_Type_size(buf_type,&type_size)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code)
+
+    /* Compute the actual number of bytes requested */
+    io_size=type_size*size_i;
+
+    /* Check for read failure */
+    if (bytes_read<0 || bytes_read>io_size)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed")
+
+    /*
+     * This gives us zeroes beyond end of physical MPI file.
+     */
+    if ((n=(io_size-bytes_read)) > 0)
+        HDmemset((char*)buf+bytes_read, 0, (size_t)n);
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "Leaving H5FD_mpio_read\n" );
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_write
+ *
+ * Purpose:  Writes SIZE bytes of data to FILE beginning at address ADDR
+ *    from buffer BUF according to data transfer properties in
+ *    DXPL_ID using potentially complex file and buffer types to
+ *    effect the transfer.
+ *
+ *    MPI is able to coalesce requests from different processes
+ *    (collective and independent).
+ *
+ * Return:  Success:  Zero. USE_TYPES and OLD_USE_TYPES in the
+ *        access params are altered.
+ *
+ *    Failure:  -1, USE_TYPES and OLD_USE_TYPES in the
+ *        access params may be altered.
+ *
+ * Programmer:  Unknown
+ *              January 30, 1998
+ *
+ * Modifications:
+ *    rky, 1998-08-28
+ *    If the file->allsame flag is set, we assume that all the
+ *    procs in the relevant MPI communicator will write identical
+ *    data at identical offsets in the file, so only proc 0 will
+ *    write, and all other procs will wait for p0 to finish. This
+ *    is useful for writing metadata, for example. Note that we
+ *    don't _check_ that the data is identical. Also, the mechanism
+ *    we use to eliminate the redundant writes is by requiring a
+ *    call to H5FD_mpio_tas_allsame before the write, which is
+ *    rather klugey. Would it be better to pass a parameter to
+ *    low-level writes like H5F_block_write and H5F_low_write,
+ *    instead?  Or...??? Also, when I created this mechanism I
+ *    wanted to minimize the difference in behavior between the old
+ *    way of doing things (i.e., all procs write) and the new way,
+ *    so the writes are eliminated at the very lowest level, here
+ *    in H5FD_mpio_write. It may be better to rethink that, and
+ *    short-circuit the writes at a higher level (e.g., at the
+ *    points in the code where H5FD_mpio_tas_allsame is called).
+ *
+ *
+ *     Robb Matzke, 1998-02-18
+ *    Added the ACCESS_PARMS argument.
+ *
+ *     rky, 1998-04-10
+ *    Call independent or collective MPI write, based on
+ *    ACCESS_PARMS.
+ *
+ *     rky, 1998-04-24
+ *    Removed redundant write from H5FD_mpio_write.
+ *
+ *     Albert Cheng, 1998-06-01
+ *    Added XFER_MODE to control independent or collective MPI
+ *    write.
+ *
+ *     rky, 1998-08-16
+ *    Use BTYPE, FTYPE, and DISP from access parms. The guts of
+ *    H5FD_mpio_read and H5FD_mpio_write should be replaced by a
+ *    single dual-purpose routine.
+ *
+ *     rky, 1998-08-28
+ *    Added ALLSAME parameter to make all but proc 0 skip the
+ *    actual write.
+ *
+ *     Robb Matzke, 1999-04-21
+ *    Changed XFER_MODE to XFER_PARMS for all H5FD_*_write()
+ *    callbacks.
+ *
+ *     Robb Matzke, 1999-07-28
+ *    The ADDR argument is passed by value.
+ *
+ *     Robb Matzke, 1999-08-06
+ *    Modified to work with the virtual file layer.
+ *
+ *    Albert Cheng, 1999-12-19
+ *    When only-p0-write-allsame-data, p0 Bcasts the
+ *    ret_value to other processes.  This prevents
+ *    a racing condition (that other processes try to
+ *    read the file before p0 finishes writing) and also
+ *    allows all processes to report the same ret_value.
+ *
+ *    Kim Yates, Pat Weidhaas,  2000-09-26
+ *    Move block of coding where only p0 writes after the
+ *              MPI_File_set_view call.
+ *
+ *    Quincey Koziol,  2002-05-10
+ *    Instead of always writing metadata from process 0, spread the
+ *              burden among all the processes by using a round-robin rotation
+ *              scheme.
+ *
+ *    Quincey Koziol,  2002-05-10
+ *    Removed allsame code, keying off the type parameter instead.
+ *
+ *    Quincey Koziol,  2002-05-14
+ *    Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
+ *              for the I/O transfer.  Someday we might include code to decode
+ *              the MPI type used for more complicated transfers and call
+ *              MPI_Get_count all the time.
+ *
+ *              Quincey Koziol - 2002/06/17
+ *              Removed 'disp' parameter from H5FD_mpio_setup routine and use
+ *              the address of the dataset in MPI_File_set_view() calls, as
+ *              necessary.
+ *
+ *              Quincey Koziol - 2002/06/24
+ *              Removed "lazy" MPI_File_set_view() calls, since they would fail
+ *              if the first I/O was a collective I/O using MPI derived types
+ *              and the next I/O was an independent I/O.
+ *
+ *              Quincey Koziol - 2002/07/18
+ *              Added "block_before_meta_write" dataset transfer flag, which
+ *              is set during writes from a metadata cache flush and indicates
+ *              that all the processes must sync up before (one of them)
+ *              writing metadata.
+ *
+ *              Quincey Koziol - 2003/10/22-31
+ *              Restructured code massively, straightening out logic and finally
+ *              getting the bytes_written stuff working.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+    size_t size, const void *buf)
+{
+    H5FD_mpio_t      *file = (H5FD_mpio_t*)_file;
+    MPI_Offset        mpi_off;
+    MPI_Status      mpi_stat;       /* Status from I/O operation */
+    MPI_Datatype    buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
+    int              mpi_code;  /* MPI return code */
+    int             size_i, bytes_written;
+    int                         type_size;      /* MPI datatype used for I/O's size */
+    int                         io_size;        /* Actual number of bytes requested */
+    hbool_t      use_view_this_time = FALSE;
+    H5P_genplist_t              *plist = NULL;  /* Property list pointer */
+    herr_t                ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if (H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "Entering H5FD_mpio_write\n" );
+#endif
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+    /* Make certain we have the correct type of property list */
+    HDassert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+    HDassert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER));
+    HDassert(buf);
+
+    /* Portably initialize MPI status variable */
+    HDmemset(&mpi_stat, 0, sizeof(MPI_Status));
+
+    /* some numeric conversions */
+    if(H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
+    size_i = (int)size;
+    if((hsize_t)size_i != size)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from size to size_i")
+
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'w'])
+        fprintf(stdout, "in H5FD_mpio_write  mpi_off=%ld  size_i=%d\n", (long)mpi_off, size_i);
+#endif
+
+    if(type == H5FD_MEM_DRAW) {
+        H5FD_mpio_xfer_t            xfer_mode;   /* I/O tranfer mode */
+
+        /* Obtain the data transfer properties */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+        /* get the transfer mode from the dxpl */
+        if(H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode)<0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O transfer mode")
+
+        /*
+         * Set up for a fancy xfer using complex types, or single byte block. We
+         * wouldn't need to rely on the use_view field if MPI semantics allowed
+         * us to test that btype=ftype=MPI_BYTE (or even MPI_TYPE_NULL, which
+         * could mean "use MPI_BYTE" by convention).
+         */
+        if(xfer_mode == H5FD_MPIO_COLLECTIVE) {
+            MPI_Datatype    file_type;
+
+            /* Remember that views are used */
+            use_view_this_time = TRUE;
+
+            /* prepare for a full-blown xfer using btype, ftype, and disp */
+            if(H5P_get(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &buf_type) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
+            if(H5P_get(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
+
+            /*
+             * Set the file view when we are using MPI derived types
+             */
+            if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g, file->info)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
+
+            /* When using types, use the address as the displacement for
+             * MPI_File_set_view and reset the address for the read to zero
+             */
+            mpi_off = 0;
+        } /* end if */
+    } /* end if */
+    else {
+#if 0 /* JRM -- 3/23/10 */ /* this is no longer always the case */
+        /* Only one process can do the actual metadata write */
+        if(file->mpi_rank != H5_PAR_META_WRITE)
+#ifdef LATER
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "can't write metadata from non-zero rank")
+#else /* LATER */
+            HGOTO_DONE(SUCCEED) /* skip the actual write */
+#endif /* LATER */
+#endif /* JRM */
+    } /* end if */
+
+    /* Write the data. */
+    if(use_view_this_time) {
+        H5FD_mpio_collective_opt_t coll_opt_mode;
+
+#ifdef H5FDmpio_DEBUG
+        if(H5FD_mpio_Debug[(int)'t'])
+            fprintf(stdout, "H5FD_mpio_write: using MPIO collective mode\n");
+#endif
+        /* Get the collective_opt property to check whether the application wants to do IO individually. */
+        HDassert(plist);
+        /* get the transfer mode from the dxpl */
+        if(H5P_get(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &coll_opt_mode)<0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O collective_op property")
+
+        if(coll_opt_mode == H5FD_MPIO_COLLECTIVE_IO) {
+#ifdef H5FDmpio_DEBUG
+            if(H5FD_mpio_Debug[(int)'t'])
+                fprintf(stdout, "H5FD_mpio_write: doing MPI collective IO\n");
+#endif
+            if(MPI_SUCCESS != (mpi_code = MPI_File_write_at_all(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at_all failed", mpi_code)
+        } /* end if */
+        else {
+#ifdef H5FDmpio_DEBUG
+            if(H5FD_mpio_Debug[(int)'t'])
+                fprintf(stdout, "H5FD_mpio_write: doing MPI independent IO\n");
+#endif
+            if(MPI_SUCCESS != (mpi_code = MPI_File_write_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at failed", mpi_code)
+        } /* end else */
+
+        /* Reset the file view when we used MPI derived types */
+        if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, H5FD_mpi_native_g,  file->info)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
+    } else {
+        if(MPI_SUCCESS != (mpi_code = MPI_File_write_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at failed", mpi_code)
+    }
+
+    /* How many bytes were actually written? */
+    /* [This works because the "basic elements" we use for all our MPI derived
+     *  types are MPI_BYTE.  We should be using the 'buf_type' for the MPI
+     *  datatype in this call though... (We aren't because using it causes
+     *  the LANL "qsc" machine to dump core - 12/19/03) - QAK]
+     */
+    if(MPI_SUCCESS != (mpi_code = MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_written)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code)
+
+    /* Get the type's size */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_size(buf_type, &type_size)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code)
+
+    /* Compute the actual number of bytes requested */
+    io_size = type_size * size_i;
+
+    /* Check for write failure */
+    if(bytes_written != io_size)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+
+    /* Forget the EOF value (see H5FD_mpio_get_eof()) --rpm 1999-08-06 */
+    file->eof = HADDR_UNDEF;
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'t'])
+      fprintf(stdout, "proc %d: Leaving H5FD_mpio_write with ret_value=%d\n",
+      file->mpi_rank, ret_value );
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpio_flush
+ *
+ * Purpose:     Makes sure that all data is on disk.  This is collective.
+ *
+ * Return:      Success:  Non-negative
+ *
+ *     Failure:  Negative
+ *
+ * Programmer:  Robb Matzke
+ *              January 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned closing)
+{
+    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
+    int      mpi_code;  /* mpi return code */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'t'])
+      HDfprintf(stdout, "Entering %s\n", FUNC);
+#endif
+    HDassert(file);
+    HDassert(H5FD_MPIO == file->pub.driver_id);
+
+    /* Only sync the file if we are not going to immediately close it */
+    if(!closing) {
+        if(MPI_SUCCESS != (mpi_code = MPI_File_sync(file->f)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_sync failed", mpi_code)
+    } /* end if */
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'t'])
+      HDfprintf(stdout, "Leaving %s\n", FUNC);
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_mpio_truncate
+ *
+ * Purpose:     Make certain the file's size matches it's allocated size
+ *
+ * Return:      Success:  Non-negative
+ *     Failure:  Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              January 31, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing)
+{
+    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'t'])
+      HDfprintf(stdout, "Entering %s\n", FUNC);
+#endif
+    HDassert(file);
+    HDassert(H5FD_MPIO == file->pub.driver_id);
+
+    /* Extend the file to make sure it's large enough, then sync.
+     * Unfortunately, keeping track of EOF is an expensive operation, so
+     * we can't just check whether EOF<EOA like with other drivers.
+     * Therefore we'll just read the byte at EOA-1 and then write it back. */
+    if(file->eoa > file->last_eoa) {
+        int    mpi_code;  /* mpi return code */
+        MPI_Offset      mpi_off;
+
+        if(H5FD_mpi_haddr_to_MPIOff(file->eoa, &mpi_off) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "cannot convert from haddr_t to MPI_Offset")
+
+        /* Extend the file's size */
+        if(MPI_SUCCESS != (mpi_code = MPI_File_set_size(file->f, mpi_off)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_File_set_size failed", mpi_code)
+
+	/* Don't let any proc return until all have extended the file.
+         * (Prevents race condition where some processes go ahead and write
+         * more data to the file before all the processes have finished making
+         * it the shorter length, potentially truncating the file and dropping
+         * the new data written)
+         */
+        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
+
+        /* Update the 'last' eoa value */
+        file->last_eoa = file->eoa;
+    } /* end if */
+
+done:
+#ifdef H5FDmpio_DEBUG
+    if(H5FD_mpio_Debug[(int)'t'])
+      HDfprintf(stdout, "Leaving %s\n", FUNC);
+#endif
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_mpio_truncate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_mpi_rank
+ *
+ * Purpose:  Returns the MPI rank for a process
+ *
+ * Return:  Success: non-negative
+ *    Failure: negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, May 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_mpio_mpi_rank(const H5FD_t *_file)
+{
+    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    FUNC_LEAVE_NOAPI(file->mpi_rank)
+} /* end H5FD_mpio_mpi_rank() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_mpi_size
+ *
+ * Purpose:  Returns the number of MPI processes
+ *
+ * Return:  Success: non-negative
+ *    Failure: negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, May 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_mpio_mpi_size(const H5FD_t *_file)
+{
+    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    FUNC_LEAVE_NOAPI(file->mpi_size)
+} /* end H5FD_mpio_mpi_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_mpio_communicator
+ *
+ * Purpose:  Returns the MPI communicator for the file.
+ *
+ * Return:  Success:  The communicator
+ *
+ *    Failure:  NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, August  9, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static MPI_Comm
+H5FD_mpio_communicator(const H5FD_t *_file)
+{
+    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+    HDassert(H5FD_MPIO==file->pub.driver_id);
+
+    FUNC_LEAVE_NOAPI(file->comm)
+}
+
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmpio.h b/gatb-core/thirdparty/hdf5/src/H5FDmpio.h
new file mode 100644
index 0000000..1d91cc3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmpio.h
@@ -0,0 +1,66 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  2, 1999
+ *
+ * Purpose:	The public header file for the mpio driver.
+ */
+#ifndef H5FDmpio_H
+#define H5FDmpio_H
+
+/* Macros */
+
+#ifdef H5_HAVE_PARALLEL
+#   define H5FD_MPIO	(H5FD_mpio_init())
+#else
+#   define H5FD_MPIO	(-1)
+#endif /* H5_HAVE_PARALLEL */
+
+#ifdef H5_HAVE_PARALLEL
+/*Turn on H5FDmpio_debug if H5F_DEBUG is on */
+#ifdef H5F_DEBUG
+#ifndef H5FDmpio_DEBUG
+#define H5FDmpio_DEBUG
+#endif
+#endif
+
+/* Global var whose value comes from environment variable */
+/* (Defined in H5FDmpio.c) */
+H5_DLLVAR hbool_t H5FD_mpi_opt_types_g;
+
+/* Function prototypes */
+#ifdef __cplusplus
+extern "C" {
+#endif
+H5_DLL hid_t H5FD_mpio_init(void);
+H5_DLL void H5FD_mpio_term(void);
+H5_DLL herr_t H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info);
+H5_DLL herr_t H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/,
+			MPI_Info *info/*out*/);
+H5_DLL herr_t H5Pset_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode);
+H5_DLL herr_t H5Pget_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode/*out*/);
+H5_DLL herr_t H5Pset_dxpl_mpio_collective_opt(hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mode);
+H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt(hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode);
+H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt_num(hid_t dxpl_id, unsigned num_chunk_per_proc);
+H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_num_proc_per_chunk);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5_HAVE_PARALLEL */
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmulti.c b/gatb-core/thirdparty/hdf5/src/H5FDmulti.c
new file mode 100644
index 0000000..a00c9a6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmulti.c
@@ -0,0 +1,1920 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Monday, November 10, 1997
+ *
+ * Purpose:	Implements a file driver which dispatches I/O requests to
+ *		other file drivers depending on the purpose of the address
+ *		region being accessed. For instance, all meta-data could be
+ *		place in one file while all raw data goes to some other file.
+ *		This also serves as an example of coding a complex file driver,
+ *		therefore, it should not use any non-public definitions.
+ */
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Disable certain warnings in PC-Lint: */
+/*lint --emacro( {534, 830}, H5P_DEFAULT, H5P_FILE_ACCESS, H5P_DATASET_XFER) */
+/*lint --emacro( {534, 830}, H5FD_MULTI) */
+/*lint -esym( 534, H5Eclear2, H5Epush2) */
+
+#include "hdf5.h"
+
+
+/* Our version of MAX */
+#undef MAX
+#define MAX(X,Y)	((X)>(Y)?(X):(Y))
+
+#ifndef FALSE
+#define FALSE		0
+#endif
+#ifndef TRUE
+#define TRUE		1
+#endif
+
+/* Loop through all mapped files */
+#define UNIQUE_MEMBERS(MAP,LOOPVAR) {					      \
+    H5FD_mem_t _unmapped, LOOPVAR;					      \
+    hbool_t _seen[H5FD_MEM_NTYPES];					      \
+									      \
+    memset(_seen, 0, sizeof _seen);					      \
+    for (_unmapped=H5FD_MEM_SUPER; _unmapped<H5FD_MEM_NTYPES; _unmapped=(H5FD_mem_t)(_unmapped+1)) {  \
+	LOOPVAR = MAP[_unmapped];					      \
+	if (H5FD_MEM_DEFAULT==LOOPVAR) LOOPVAR=_unmapped;		      \
+	assert(LOOPVAR>0 && LOOPVAR<H5FD_MEM_NTYPES);			      \
+	if (_seen[LOOPVAR]++) continue;
+
+#define ALL_MEMBERS(LOOPVAR) {						      \
+    H5FD_mem_t LOOPVAR;							      \
+    for (LOOPVAR=H5FD_MEM_DEFAULT; LOOPVAR<H5FD_MEM_NTYPES; LOOPVAR=(H5FD_mem_t)(LOOPVAR+1)) {
+
+
+#define END_MEMBERS	}}
+
+#define H5FD_MULT_MAX_FILE_NAME_LEN     1024
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_MULTI_g = 0;
+
+/* Driver-specific file access properties */
+typedef struct H5FD_multi_fapl_t {
+    H5FD_mem_t	memb_map[H5FD_MEM_NTYPES]; /*memory usage map		*/
+    hid_t	memb_fapl[H5FD_MEM_NTYPES];/*member access properties	*/
+    char	*memb_name[H5FD_MEM_NTYPES];/*name generators		*/
+    haddr_t	memb_addr[H5FD_MEM_NTYPES];/*starting addr per member	*/
+    hbool_t	relax;			/*less stringent error checking	*/
+} H5FD_multi_fapl_t;
+
+/*
+ * The description of a file belonging to this driver. The file access
+ * properties and member names do not have to be copied into this struct
+ * since they will be held open by the file access property list which is
+ * copied into the parent file struct in H5F_open().
+ */
+typedef struct H5FD_multi_t {
+    H5FD_t	pub;		/*public stuff, must be first		*/
+    H5FD_multi_fapl_t fa;	/*driver-specific file access properties*/
+    haddr_t	memb_next[H5FD_MEM_NTYPES];/*addr of next member	*/
+    H5FD_t	*memb[H5FD_MEM_NTYPES];	/*member pointers		*/
+    haddr_t     memb_eoa[H5FD_MEM_NTYPES]; /*EOA for individual files,
+    				 *end of allocated addresses.  v1.6 library 
+                                 *have the EOA for the entire file. But it's
+                                 *meaningless for MULTI file.  We replaced it
+                                 *with the EOAs for individual files    */
+    unsigned	flags;		/*file open flags saved for debugging	*/
+    char	*name;		/*name passed to H5Fopen or H5Fcreate	*/
+} H5FD_multi_t;
+
+/* Driver specific data transfer properties */
+typedef struct H5FD_multi_dxpl_t {
+    hid_t	memb_dxpl[H5FD_MEM_NTYPES];/*member data xfer properties*/
+} H5FD_multi_dxpl_t;
+
+/* Private functions */
+static char *my_strdup(const char *s);
+static int compute_next(H5FD_multi_t *file);
+static int open_members(H5FD_multi_t *file);
+
+/* Callback prototypes */
+static hsize_t H5FD_multi_sb_size(H5FD_t *file);
+static herr_t H5FD_multi_sb_encode(H5FD_t *file, char *name/*out*/,
+				   unsigned char *buf/*out*/);
+static herr_t H5FD_multi_sb_decode(H5FD_t *file, const char *name,
+				   const unsigned char *buf);
+static void *H5FD_multi_fapl_get(H5FD_t *file);
+static void *H5FD_multi_fapl_copy(const void *_old_fa);
+static herr_t H5FD_multi_fapl_free(void *_fa);
+static H5FD_t *H5FD_multi_open(const char *name, unsigned flags,
+			       hid_t fapl_id, haddr_t maxaddr);
+static herr_t H5FD_multi_close(H5FD_t *_file);
+static int H5FD_multi_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_multi_query(const H5FD_t *_f1, unsigned long *flags);
+static herr_t H5FD_multi_get_type_map(const H5FD_t *file, H5FD_mem_t *type_map);
+static haddr_t H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
+static haddr_t H5FD_multi_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+static herr_t H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+			      hsize_t size);
+static herr_t H5FD_multi_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+			      size_t size, void *_buf/*out*/);
+static herr_t H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+			       size_t size, const void *_buf);
+static herr_t H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+/* The class struct */
+static const H5FD_class_t H5FD_multi_g = {
+    "multi",					/*name			*/
+    HADDR_MAX,					/*maxaddr		*/
+    H5F_CLOSE_WEAK,				/* fc_degree		*/
+    H5FD_multi_sb_size,				/*sb_size		*/
+    H5FD_multi_sb_encode,			/*sb_encode		*/
+    H5FD_multi_sb_decode,			/*sb_decode		*/
+    sizeof(H5FD_multi_fapl_t),			/*fapl_size		*/
+    H5FD_multi_fapl_get,			/*fapl_get		*/
+    H5FD_multi_fapl_copy,			/*fapl_copy		*/
+    H5FD_multi_fapl_free,			/*fapl_free		*/
+    0,						/*dxpl_size		*/
+    NULL,					/*dxpl_copy		*/
+    NULL,					/*dxpl_free		*/
+    H5FD_multi_open,				/*open			*/
+    H5FD_multi_close,				/*close			*/
+    H5FD_multi_cmp,				/*cmp			*/
+    H5FD_multi_query,				/*query			*/
+    H5FD_multi_get_type_map,			/*get_type_map		*/
+    H5FD_multi_alloc,				/*alloc			*/
+    H5FD_multi_free,				/*free			*/
+    H5FD_multi_get_eoa,				/*get_eoa		*/
+    H5FD_multi_set_eoa,				/*set_eoa		*/
+    H5FD_multi_get_eof,				/*get_eof		*/
+    H5FD_multi_get_handle,                      /*get_handle            */
+    H5FD_multi_read,				/*read			*/
+    H5FD_multi_write,				/*write			*/
+    H5FD_multi_flush,				/*flush			*/
+    H5FD_multi_truncate,			/*truncate		*/
+    NULL,                                       /*lock                  */
+    NULL,                                       /*unlock                */
+    H5FD_FLMAP_DEFAULT 				/*fl_map		*/
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	my_strdup
+ *
+ * Purpose:	Private version of strdup()
+ *
+ * Return:	Success:	Ptr to new copy of string
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char *
+my_strdup(const char *s)
+{
+    char *x;
+    size_t str_len;
+
+    if(!s)
+        return NULL;
+    str_len = strlen(s) + 1;
+    if(NULL == (x = (char *)malloc(str_len)))
+        return NULL;
+    memcpy(x, s, str_len);
+
+    return x;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_init
+ *
+ * Purpose:	Initialize this driver by registering the driver with the
+ *		library.
+ *
+ * Return:	Success:	The driver ID for the multi driver.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_multi_init(void)
+{
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    if (H5I_VFL!=H5Iget_type(H5FD_MULTI_g)) {
+	H5FD_MULTI_g = H5FDregister(&H5FD_multi_g);
+    }
+    return H5FD_MULTI_g;
+}
+
+

+/*---------------------------------------------------------------------------
+ * Function:	H5FD_multi_term
+ *
+ * Purpose:	Shut down the VFD
+ *
+ * Return:	<none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ * Modification:
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_multi_term(void)
+{
+    /* Reset VFL ID */
+    H5FD_MULTI_g=0;
+
+} /* end H5FD_multi_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_fapl_split
+ *
+ * Purpose:	Compatability function. Makes the multi driver act like the
+ *		old split driver which stored meta data in one file and raw
+ *		data in another file.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August 11, 1999
+ *
+ * Modifications:
+ *	Albert Cheng, Sep 17, 2001
+ *	Added feature that if the raw or meta extension string contains
+ *	a "%s", it will be substituted by the filename given for H5Fopen
+ *	or H5Fcreate.  This is same as the multi-file syntax.  If no %s
+ *	is found, one is inserted at the beginning.  This is the previous
+ *	behavior.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_split(hid_t fapl, const char *meta_ext, hid_t meta_plist_id,
+		  const char *raw_ext, hid_t raw_plist_id)
+{
+    H5FD_mem_t		memb_map[H5FD_MEM_NTYPES];
+    hid_t		memb_fapl[H5FD_MEM_NTYPES];
+    const char		*memb_name[H5FD_MEM_NTYPES];
+    char		meta_name[H5FD_MULT_MAX_FILE_NAME_LEN], raw_name[H5FD_MULT_MAX_FILE_NAME_LEN];
+    haddr_t		memb_addr[H5FD_MEM_NTYPES];
+
+    /*NO TRACE*/
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Initialize */
+    ALL_MEMBERS(mt) {
+	/* Treat global heap as raw data, not metadata */
+	memb_map[mt] = ((mt == H5FD_MEM_DRAW || mt == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : H5FD_MEM_SUPER);
+	memb_fapl[mt] = -1;
+	memb_name[mt] = NULL;
+	memb_addr[mt] = HADDR_UNDEF;
+    } END_MEMBERS;
+
+    /* The file access properties */
+    memb_fapl[H5FD_MEM_SUPER] = meta_plist_id;
+    memb_fapl[H5FD_MEM_DRAW] = raw_plist_id;
+
+    /* The names */
+    /* process meta filename */
+    if(meta_ext) {
+	if(strstr(meta_ext, "%s")) {
+            /* Note: this doesn't accommodate for when the '%s' in the user's
+             *  string is at a position >sizeof(meta_name) - QK & JK - 2013/01/17
+             */
+	    strncpy(meta_name, meta_ext, sizeof(meta_name));
+            meta_name[sizeof(meta_name) - 1] = '\0';
+        }
+	else
+	    sprintf(meta_name, "%%s%s", meta_ext);
+    }
+    else {
+	strncpy(meta_name, "%s.meta", sizeof(meta_name));
+        meta_name[sizeof(meta_name) - 1] = '\0';
+    }
+    memb_name[H5FD_MEM_SUPER] = meta_name;
+
+    /* process raw filename */
+    if(raw_ext) {
+	if(strstr(raw_ext, "%s")) {
+            /* Note: this doesn't accommodate for when the '%s' in the user's
+             *  string is at a position >sizeof(raw_name) - QK & JK - 2013/01/17
+             */
+	    strncpy(raw_name, raw_ext, sizeof(raw_name));
+            raw_name[sizeof(raw_name) - 1] = '\0';
+        }
+	else
+	    sprintf(raw_name, "%%s%s", raw_ext);
+    }
+    else {
+	strncpy(raw_name, "%s.raw", sizeof(raw_name));
+        raw_name[sizeof(raw_name) - 1] = '\0';
+    }
+    memb_name[H5FD_MEM_DRAW] = raw_name;
+
+    /* The sizes */
+    memb_addr[H5FD_MEM_SUPER] = 0;
+    memb_addr[H5FD_MEM_DRAW] = HADDR_MAX/2;
+
+    return H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, TRUE);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_fapl_multi
+ *
+ * Purpose:	Sets the file access property list FAPL_ID to use the multi
+ *		driver. The MEMB_MAP array maps memory usage types to other
+ *		memory usage types and is the mechanism which allows the
+ *		caller to specify how many files are created. The array
+ *		contains H5FD_MEM_NTYPES entries which are either the value
+ *		H5FD_MEM_DEFAULT or a memory usage type and the number of
+ *		unique values determines the number of files which are
+ *		opened.  For each memory usage type which will be associated
+ *		with a file the MEMB_FAPL array should have a property list
+ *		and the MEMB_NAME array should be a name generator (a
+ *		printf-style format with a %s which will be replaced with the
+ *		name passed to H5FDopen(), usually from H5Fcreate() or
+ *		H5Fopen()).
+ *
+ *		If RELAX is set then opening an existing file for read-only
+ *		access will not fail if some file members are missing.  This
+ *		allows a file to be accessed in a limited sense if just the
+ *		meta data is available.
+ *
+ * Defaults:	Default values for each of the optional arguments are:
+ *
+ *		memb_map:	The default member map has the value
+ *				H5FD_MEM_DEFAULT for each element.
+ *
+ * 		memb_fapl:	The value H5P_DEFAULT for each element.
+ *
+ *		memb_name:	The string `%s-X.h5' where `X' is one of the
+ *				letters `s' (H5FD_MEM_SUPER),
+ *				`b' (H5FD_MEM_BTREE), `r' (H5FD_MEM_DRAW),
+ * 				`g' (H5FD_MEM_GHEAP), 'l' (H5FD_MEM_LHEAP),
+ * 				`o' (H5FD_MEM_OHDR).
+ *
+ * 		memb_addr:	The value HADDR_UNDEF for each element.
+ *
+ *
+ * Example:	To set up a multi file access property list which partitions
+ *		data into meta and raw files each being 1/2 of the address
+ *		space one would say:
+ *
+ * 		    H5FD_mem_t mt, memb_map[H5FD_MEM_NTYPES];
+ *		    hid_t memb_fapl[H5FD_MEM_NTYPES];
+ *		    const char *memb[H5FD_MEM_NTYPES];
+ *		    haddr_t memb_addr[H5FD_MEM_NTYPES];
+ *
+ * 		    // The mapping...
+ * 		    for (mt=0; mt<H5FD_MEM_NTYPES; mt++) {
+ *		        memb_map[mt] = H5FD_MEM_SUPER;
+ *		    }
+ * 		    memb_map[H5FD_MEM_DRAW] = H5FD_MEM_DRAW;
+ *
+ * 		    // Member information
+ * 		    memb_fapl[H5FD_MEM_SUPER] = H5P_DEFAULT;
+ *		    memb_name[H5FD_MEM_SUPER] = "%s.meta";
+ *		    memb_addr[H5FD_MEM_SUPER] = 0;
+ *
+ *		    memb_fapl[H5FD_MEM_DRAW] = H5P_DEFAULT;
+ *		    memb_name[H5FD_MEM_DRAW] = "%s.raw";
+ *		    memb_addr[H5FD_MEM_DRAW] = HADDR_MAX/2;
+ *
+ * 		    hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
+ *		    H5Pset_fapl_multi(fapl, memb_map, memb_fapl,
+ *		                      memb_name, memb_addr, TRUE);
+ *
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu, 2001-10-25
+ *		Use new generic property list for argument checking.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map,
+		  const hid_t *memb_fapl, const char * const *memb_name,
+		  const haddr_t *memb_addr, hbool_t relax)
+{
+    H5FD_multi_fapl_t	fa;
+    H5FD_mem_t		mt, mmt;
+    H5FD_mem_t		_memb_map[H5FD_MEM_NTYPES];
+    hid_t		_memb_fapl[H5FD_MEM_NTYPES];
+    char		_memb_name[H5FD_MEM_NTYPES][16];
+    const char		*_memb_name_ptrs[H5FD_MEM_NTYPES];
+    haddr_t		_memb_addr[H5FD_MEM_NTYPES];
+    static const char	*letters = "Xsbrglo";
+    static const char *func="H5FDset_fapl_multi";  /* Function Name for error reporting */
+
+    /*NO TRACE*/
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Check arguments and supply default values */
+    if(H5I_GENPROP_LST != H5Iget_type(fapl_id) ||
+            TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "not an access list", -1)
+    if (!memb_map) {
+	for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1))
+	    _memb_map[mt] = H5FD_MEM_DEFAULT;
+	memb_map = _memb_map;
+    }
+    if (!memb_fapl) {
+	for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1))
+	    _memb_fapl[mt] = H5Pcreate(H5P_FILE_ACCESS);
+	memb_fapl = _memb_fapl;
+    }
+    if (!memb_name) {
+	assert(strlen(letters)==H5FD_MEM_NTYPES);
+	for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
+	    sprintf(_memb_name[mt], "%%s-%c.h5", letters[mt]);
+	    _memb_name_ptrs[mt] = _memb_name[mt];
+	}
+	memb_name = _memb_name_ptrs;
+    }
+    if (!memb_addr) {
+	for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1))
+	    _memb_addr[mt] = (hsize_t)(mt ? (mt - 1) : 0) * (HADDR_MAX / (H5FD_MEM_NTYPES-1));
+	memb_addr = _memb_addr;
+    }
+
+    for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
+	/* Map usage type */
+	mmt = memb_map[mt];
+	if (mmt<0 || mmt>=H5FD_MEM_NTYPES)
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADRANGE, "file resource type out of range", -1)
+	if (H5FD_MEM_DEFAULT==mmt) mmt = mt;
+
+	/*
+	 * All members of MEMB_FAPL must be either defaults or actual file
+	 * access property lists.
+	 */
+	if (H5P_DEFAULT!=memb_fapl[mmt] && TRUE!=H5Pisa_class(memb_fapl[mmt], H5P_FILE_ACCESS))
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type incorrect", -1)
+
+	/* All names must be defined */
+	if (!memb_name[mmt] || !memb_name[mmt][0])
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type not set", -1)
+    }
+
+    /*
+     * Initialize driver specific information. No need to copy it into the FA
+     * struct since all members will be copied by H5Pset_driver().
+     */
+    memcpy(fa.memb_map, memb_map, H5FD_MEM_NTYPES*sizeof(H5FD_mem_t));
+    memcpy(fa.memb_fapl, memb_fapl, H5FD_MEM_NTYPES*sizeof(hid_t));
+    memcpy(fa.memb_name, memb_name, H5FD_MEM_NTYPES*sizeof(char*));
+    memcpy(fa.memb_addr, memb_addr, H5FD_MEM_NTYPES*sizeof(haddr_t));
+    fa.relax = relax;
+
+    /* Patch up H5P_DEFAULT property lists for members */
+    for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
+        if(fa.memb_fapl[mt]==H5P_DEFAULT)
+            fa.memb_fapl[mt] = H5Pcreate(H5P_FILE_ACCESS);
+    }
+    return H5Pset_driver(fapl_id, H5FD_MULTI, &fa);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_fapl_multi
+ *
+ * Purpose:	Returns information about the multi file access property
+ *		list though the function arguments which are the same as for
+ *		H5Pset_fapl_multi() above.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *              Raymond Lu, 2001-10-25
+ *              Use new generic property list for argument checking.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/,
+		  hid_t *memb_fapl/*out*/, char **memb_name/*out*/,
+		  haddr_t *memb_addr/*out*/, hbool_t *relax)
+{
+    H5FD_multi_fapl_t	*fa;
+    H5FD_mem_t		mt;
+    static const char *func="H5FDget_fapl_multi";  /* Function Name for error reporting */
+
+    /*NO TRACE*/
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    if(H5I_GENPROP_LST != H5Iget_type(fapl_id) ||
+            TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not an access list", -1)
+    if(H5FD_MULTI != H5Pget_driver(fapl_id))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "incorrect VFL driver", -1)
+    if(NULL == (fa= (H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id)))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "bad VFL driver info", -1)
+
+    if (memb_map)
+        memcpy(memb_map, fa->memb_map, H5FD_MEM_NTYPES*sizeof(H5FD_mem_t));
+    if (memb_fapl) {
+	for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
+	    if (fa->memb_fapl[mt]>=0)
+		memb_fapl[mt] = H5Pcopy(fa->memb_fapl[mt]);
+	    else
+		memb_fapl[mt] = fa->memb_fapl[mt]; /*default or bad ID*/
+	}
+    }
+    if(memb_name) {
+	for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt = (H5FD_mem_t)(mt + 1)) {
+	    if(fa->memb_name[mt])
+		memb_name[mt] = my_strdup(fa->memb_name[mt]);
+	    else
+		memb_name[mt] = NULL;
+	}
+    }
+    if (memb_addr)
+	memcpy(memb_addr, fa->memb_addr, H5FD_MEM_NTYPES*sizeof(haddr_t));
+    if (relax)
+	*relax = fa->relax;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_sb_size
+ *
+ * Purpose:	Returns the size of the private information to be stored in
+ *		the superblock.
+ *
+ * Return:	Success:	The super block driver data size.
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5FD_multi_sb_size(H5FD_t *_file)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    unsigned		nseen = 0;
+    hsize_t		nbytes = 8; /*size of header*/
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* How many unique files? */
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+	nseen++;
+    } END_MEMBERS;
+
+    /* Addresses and EOA markers */
+    nbytes += nseen * 2 * 8;
+
+    /* Name templates */
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+        size_t n = strlen(file->fa.memb_name[mt])+1;
+        nbytes += (n+7) & ~((size_t)0x0007);
+    } END_MEMBERS;
+
+    return nbytes;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_sb_encode
+ *
+ * Purpose:	Encode driver information for the superblock. The NAME
+ *		argument is a nine-byte buffer which will be initialized with
+ *		an eight-character name/version number and null termination.
+ *
+ *		The encoding is a six-byte member mapping followed two bytes
+ *		which are unused. For each unique file in usage-type order
+ *		encode all the starting addresses as unsigned 64-bit integers,
+ *		then all the EOA values as unsigned 64-bit integers, then all
+ *		the template names as null terminated strings which are
+ *		multiples of 8 characters.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_sb_encode(H5FD_t *_file, char *name/*out*/,
+		     unsigned char *buf/*out*/)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    haddr_t		memb_eoa;
+    unsigned char	*p;
+    size_t		nseen;
+    size_t		i;
+    H5FD_mem_t		m;
+    static const char *func="H5FD_multi_sb_encode";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Name and version number */
+    strncpy(name, "NCSAmulti", (size_t)8);
+    name[8] = '\0';
+
+    assert(7==H5FD_MEM_NTYPES);
+
+    for (m=H5FD_MEM_SUPER; m<H5FD_MEM_NTYPES; m=(H5FD_mem_t)(m+1)) {
+        buf[m-1] = (unsigned char)file->fa.memb_map[m];
+    }
+    buf[6] = 0;
+    buf[7] = 0;
+
+    /*
+     * Copy the starting addresses and EOA values into the buffer in order of
+     * usage type but only for types which map to something unique.
+     */
+
+    /* Encode all starting addresses and EOA values */
+    nseen = 0;
+    p = buf+8;
+    assert(sizeof(haddr_t)<=8);
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+        memcpy(p, &(file->fa.memb_addr[mt]), sizeof(haddr_t));
+        p += sizeof(haddr_t);
+        memb_eoa = H5FDget_eoa(file->memb[mt], mt);
+        memcpy(p, &memb_eoa, sizeof(haddr_t));
+        p += sizeof(haddr_t);
+        nseen++;
+    } END_MEMBERS;
+    if (H5Tconvert(H5T_NATIVE_HADDR, H5T_STD_U64LE, nseen*2, buf+8, NULL, H5P_DEFAULT)<0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", -1)
+
+    /* Encode all name templates */
+    p = buf + 8 + nseen*2*8;
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+        size_t n = strlen(file->fa.memb_name[mt]) + 1;
+        strncpy((char *)p, file->fa.memb_name[mt], n);
+        p += n;
+        for (i=n; i%8; i++)
+            *p++ = '\0';
+    } END_MEMBERS;
+
+    return 0;
+} /* end H5FD_multi_sb_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_sb_decode
+ *
+ * Purpose:	Decodes the superblock information for this driver. The NAME
+ *		argument is the eight-character (plus null termination) name
+ *		stored in the file.
+ *
+ *		The FILE argument is updated according to the information in
+ *		the superblock. This may mean that some member files are
+ *		closed and others are opened.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 16, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    char		x[2*H5FD_MEM_NTYPES*8];
+    H5FD_mem_t		map[H5FD_MEM_NTYPES];
+    int			i;
+    size_t		nseen=0;
+    hbool_t		map_changed=FALSE;
+    hbool_t		in_use[H5FD_MEM_NTYPES];
+    const char		*memb_name[H5FD_MEM_NTYPES];
+    haddr_t		memb_addr[H5FD_MEM_NTYPES];
+    haddr_t		memb_eoa[H5FD_MEM_NTYPES];
+    haddr_t		*ap;
+    static const char *func="H5FD_multi_sb_decode";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Make sure the name/version number is correct */
+    if (strcmp(name, "NCSAmult"))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "invalid multi superblock", -1)
+
+    /* Set default values */
+    ALL_MEMBERS(mt) {
+        memb_addr[mt] = HADDR_UNDEF;
+        memb_eoa[mt] = HADDR_UNDEF;
+        memb_name[mt] = NULL;
+    } END_MEMBERS;
+
+    /*
+     * Read the map and count the unique members.
+     */
+    memset(map, 0, sizeof map);
+
+    for (i=0; i<6; i++) {
+        map[i+1] = (H5FD_mem_t)buf[i];
+        if (file->fa.memb_map[i+1]!=map[i+1])
+            map_changed=TRUE;
+    }
+
+    UNIQUE_MEMBERS(map, mt) {
+        nseen++;
+    } END_MEMBERS;
+    buf += 8;
+
+    /* Decode Address and EOA values */
+    assert(sizeof(haddr_t)<=8);
+    memcpy(x, buf, (nseen*2*8));
+    buf += nseen*2*8;
+    if (H5Tconvert(H5T_STD_U64LE, H5T_NATIVE_HADDR, nseen*2, x, NULL, H5P_DEFAULT)<0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", -1)
+    ap = (haddr_t*)x;
+    UNIQUE_MEMBERS(map, mt) {
+        memb_addr[_unmapped] = *ap++;
+        memb_eoa[_unmapped] = *ap++;
+    } END_MEMBERS;
+
+    /* Decode name templates */
+    UNIQUE_MEMBERS(map, mt) {
+        size_t n = strlen((const char *)buf)+1;
+        memb_name[_unmapped] = (const char *)buf;
+        buf += (n+7) & ~((unsigned)0x0007);
+    } END_MEMBERS;
+
+    /*
+     * Use the mapping saved in the superblock in preference to the one
+     * already set for the file. Since we may have opened files which are no
+     * longer needed we should close all those files. We'll open the new
+     * files at the end.
+     */
+    if (map_changed) {
+        /* Commit map */
+        ALL_MEMBERS(mt) {
+            file->fa.memb_map[mt] = map[mt];
+        } END_MEMBERS;
+
+        /* Close files which are unused now */
+        memset(in_use, 0, sizeof in_use);
+        UNIQUE_MEMBERS(map, mt) {
+            in_use[mt] = TRUE;
+        } END_MEMBERS;
+        ALL_MEMBERS(mt) {
+            if (!in_use[mt] && file->memb[mt]) {
+                (void)H5FDclose(file->memb[mt]);
+                file->memb[mt] = NULL;
+            }
+            file->fa.memb_map[mt] = map[mt];
+        } END_MEMBERS;
+    }
+
+    /* Commit member starting addresses and name templates */
+    ALL_MEMBERS(mt) {
+        file->fa.memb_addr[mt] = memb_addr[mt];
+        if (memb_name[mt]) {
+            if (file->fa.memb_name[mt])
+                free(file->fa.memb_name[mt]);
+            file->fa.memb_name[mt] = my_strdup(memb_name[mt]);
+        }
+    } END_MEMBERS;
+    if (compute_next(file)<0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", -1)
+
+    /* Open all necessary files */
+    if (open_members(file)<0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", -1)
+
+    /* Set the EOA marker for all open files */
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+        if (file->memb[mt])
+            if(H5FDset_eoa(file->memb[mt], mt, memb_eoa[mt])<0)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "set_eoa() failed", -1)
+       
+        /* Save the individual EOAs in one place for later comparison (in H5FD_multi_set_eoa) */ 
+        file->memb_eoa[mt] = memb_eoa[mt]; 
+    } END_MEMBERS;
+
+    return 0;
+} /* end H5FD_multi_sb_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_fapl_get
+ *
+ * Purpose:	Returns a file access property list which indicates how the
+ *		specified file is being accessed. The return list could be
+ *		used to access another file the same way.
+ *
+ * Return:	Success:	Ptr to new file access property list with all
+ *				members copied from the file struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, August 13, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_multi_fapl_get(H5FD_t *_file)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    return H5FD_multi_fapl_copy(&(file->fa));
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_fapl_copy
+ *
+ * Purpose:	Copies the multi-specific file access properties.
+ *
+ * Return:	Success:	Ptr to a new property list
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FD_multi_fapl_copy(const void *_old_fa)
+{
+    const H5FD_multi_fapl_t *old_fa = (const H5FD_multi_fapl_t*)_old_fa;
+    H5FD_multi_fapl_t *new_fa = (H5FD_multi_fapl_t *)malloc(sizeof(H5FD_multi_fapl_t));
+    int nerrors = 0;
+    static const char *func="H5FD_multi_fapl_copy";  /* Function Name for error reporting */
+
+    assert(new_fa);
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    memcpy(new_fa, old_fa, sizeof(H5FD_multi_fapl_t));
+    ALL_MEMBERS(mt) {
+	if (old_fa->memb_fapl[mt]>=0) {
+	    new_fa->memb_fapl[mt] = H5Pcopy(old_fa->memb_fapl[mt]);
+	    if(new_fa->memb_fapl[mt]<0)
+                nerrors++;
+	}
+	if (old_fa->memb_name[mt]) {
+	    new_fa->memb_name[mt] = my_strdup(old_fa->memb_name[mt]);
+	    assert(new_fa->memb_name[mt]);
+	}
+    } END_MEMBERS;
+
+    if (nerrors) {
+        ALL_MEMBERS(mt) {
+            if (new_fa->memb_fapl[mt]>=0)
+                (void)H5Pclose(new_fa->memb_fapl[mt]);
+            if (new_fa->memb_name[mt])
+                free(new_fa->memb_name[mt]);
+        } END_MEMBERS;
+        free(new_fa);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "invalid freespace objects", NULL)
+    }
+    return new_fa;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_fapl_free
+ *
+ * Purpose:	Frees the multi-specific file access properties.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_fapl_free(void *_fa)
+{
+    H5FD_multi_fapl_t	*fa = (H5FD_multi_fapl_t*)_fa;
+    static const char *func="H5FD_multi_fapl_free";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    ALL_MEMBERS(mt) {
+	if (fa->memb_fapl[mt]>=0)
+            if(H5Pclose(fa->memb_fapl[mt])<0)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", -1)
+	if (fa->memb_name[mt])
+            free(fa->memb_name[mt]);
+    } END_MEMBERS;
+    free(fa);
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_open
+ *
+ * Purpose:	Creates and/or opens a multi HDF5 file.
+ *
+ * Return:	Success:	A pointer to a new file data structure. The
+ *				public fields will be initialized by the
+ *				caller, which is always H5FD_open().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id,
+		haddr_t maxaddr)
+{
+    H5FD_multi_t	*file=NULL;
+    hid_t		close_fapl=-1;
+    H5FD_multi_fapl_t	*fa;
+    H5FD_mem_t		m;
+    static const char *func="H5FD_multi_open";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Check arguments */
+    if (!name || !*name)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL)
+    if (0==maxaddr || HADDR_UNDEF==maxaddr)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL)
+
+    /*
+     * Initialize the file from the file access properties, using default
+     * values if necessary.  Make sure to use CALLOC here because the code
+     * in H5FD_multi_set_eoa depends on the proper initialization of memb_eoa 
+     * in H5FD_multi_t.
+     */
+    if(NULL == (file = (H5FD_multi_t *)calloc((size_t)1, sizeof(H5FD_multi_t))))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL)
+    if(H5P_FILE_ACCESS_DEFAULT==fapl_id || H5FD_MULTI!=H5Pget_driver(fapl_id)) {
+        close_fapl = fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+        if(H5Pset_fapl_multi(fapl_id, NULL, NULL, NULL, NULL, TRUE)<0)
+            H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error)
+    }
+    fa = (H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id);
+    assert(fa);
+    ALL_MEMBERS(mt) {
+	file->fa.memb_map[mt] = fa->memb_map[mt];
+	file->fa.memb_addr[mt] = fa->memb_addr[mt];
+	if (fa->memb_fapl[mt]>=0)
+	    file->fa.memb_fapl[mt] = H5Pcopy(fa->memb_fapl[mt]);
+	else
+	    file->fa.memb_fapl[mt] = fa->memb_fapl[mt];
+	if (fa->memb_name[mt])
+	    file->fa.memb_name[mt] = my_strdup(fa->memb_name[mt]);
+	else
+	    file->fa.memb_name[mt] = NULL;
+    } END_MEMBERS;
+    file->fa.relax = fa->relax;
+    file->flags = flags;
+    file->name = my_strdup(name);
+    if (close_fapl>=0)
+        if(H5Pclose(close_fapl)<0)
+            H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", error)
+
+    /* Compute derived properties and open member files */
+    if (compute_next(file)<0)
+        H5Epush_goto(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", error);
+    if (open_members(file)<0)
+        H5Epush_goto(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", error);
+
+    /* We must have opened at least the superblock file */
+    if (H5FD_MEM_DEFAULT==(m=file->fa.memb_map[H5FD_MEM_SUPER]))
+        m = H5FD_MEM_SUPER;
+    if (NULL==file->memb[m])
+        goto error;
+
+    return (H5FD_t*)file;
+
+error:
+    /* Cleanup and fail */
+    if (file) {
+	ALL_MEMBERS(mt) {
+	    if (file->memb[mt]) (void)H5FDclose(file->memb[mt]);
+	    if (file->fa.memb_fapl[mt]>=0) (void)H5Pclose(file->fa.memb_fapl[mt]);
+	    if (file->fa.memb_name[mt]) free(file->fa.memb_name[mt]);
+	} END_MEMBERS;
+	if (file->name) free(file->name);
+	free(file);
+    }
+    return NULL;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_close
+ *
+ * Purpose:	Closes a multi file.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative with as many members closed as
+ *				possible. The only subsequent operation
+ *				permitted on the file is a close operation.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_close(H5FD_t *_file)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    int			nerrors=0;
+    static const char *func="H5FD_multi_close";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Close as many members as possible */
+    ALL_MEMBERS(mt) {
+	if (file->memb[mt]) {
+	    if (H5FDclose(file->memb[mt])<0) {
+            nerrors++;
+	    } else {
+            file->memb[mt] = NULL;
+	    }
+	}
+    } END_MEMBERS;
+    if (nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error closing member files", -1)
+
+    /* Clean up other stuff */
+    ALL_MEMBERS(mt) {
+	if (file->fa.memb_fapl[mt]>=0) (void)H5Pclose(file->fa.memb_fapl[mt]);
+	if (file->fa.memb_name[mt]) free(file->fa.memb_name[mt]);
+    } END_MEMBERS;
+    free(file->name);
+    free(file);
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_cmp
+ *
+ * Purpose:	Compares two file families to see if they are the same. It
+ *		does this by comparing the first common member of the two
+ *		families.  If the families have no members in common then the
+ *		file with the earliest member is smaller than the other file.
+ *		We abort if neither file has any members.
+ *
+ * Return:	Success:	like strcmp()
+ *
+ *		Failure:	never fails (arguments were checked by the
+ *				caller).
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_multi_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_multi_t	*f1 = (const H5FD_multi_t*)_f1;
+    const H5FD_multi_t	*f2 = (const H5FD_multi_t*)_f2;
+    H5FD_mem_t		out_mt = H5FD_MEM_DEFAULT;
+    int			cmp=0;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    ALL_MEMBERS(mt) {
+        out_mt = mt;
+	if (f1->memb[mt] && f2->memb[mt]) break;
+	if (!cmp) {
+	    if (f1->memb[mt]) cmp = -1;
+	    else if (f2->memb[mt]) cmp = 1;
+	}
+    } END_MEMBERS;
+    assert(cmp || out_mt<H5FD_MEM_NTYPES);
+    if (out_mt>=H5FD_MEM_NTYPES) return cmp;
+
+    return H5FDcmp(f1->memb[out_mt], f2->memb[out_mt]);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_query
+ *
+ * Purpose:	Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 26, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_query(const H5FD_t *_f, unsigned long *flags /* out */)
+{
+    /* Shut compiler up */
+    _f=_f;
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+    } /* end if */
+
+    return(0);
+} /* end H5FD_multi_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_get_type_map
+ *
+ * Purpose:	Retrieve the memory type mapping for this file
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, October  9, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_get_type_map(const H5FD_t *_file, H5FD_mem_t *type_map)
+{
+    const H5FD_multi_t	*file = (const H5FD_multi_t*)_file;
+
+    /* Copy file's free space type mapping */
+    memcpy(type_map, file->fa.memb_map, sizeof(file->fa.memb_map));
+
+    return(0);
+} /* end H5FD_multi_get_type_map() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_get_eoa
+ *
+ * Purpose:	Returns the end-of-address marker for the file. The EOA
+ *		marker is the first address past the last byte allocated in
+ *		the format address space.
+ *
+ * Return:	Success:	The end-of-address-marker
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              21 Dec. 2006
+ *              Added the parameter TYPE.  It's only used for MULTI driver.
+ *              If the TYPE is H5FD_MEM_DEFAULT, simply find the biggest
+ *              EOA of individual file because the EOA for the whole file
+ *              is meaningless.
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
+{
+    const H5FD_multi_t	*file = (const H5FD_multi_t*)_file;
+    haddr_t eoa = 0;
+    haddr_t memb_eoa = 0;
+    static const char *func="H5FD_multi_get_eoa";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* The library used to have EOA for the whole file.  But it's
+     * taken out because it makes little sense for MULTI files.
+     * However, the library sometimes queries it through H5F_get_eoa.
+     * Here the code finds the biggest EOA for individual file if
+     * the query is for TYPE == H5FD_MEM_DEFAULT.
+     */
+    if(H5FD_MEM_DEFAULT == type) {
+        UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+	    if (file->memb[mt]) {
+                /* Retrieve EOA */
+	        H5E_BEGIN_TRY {
+                    memb_eoa = H5FDget_eoa(file->memb[mt], mt);
+	        } H5E_END_TRY;
+
+	        if (HADDR_UNDEF==memb_eoa)
+                    H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
+	    } else if (file->fa.relax) {
+	        /*
+	         * The member is not open yet (maybe it doesn't exist). Make the
+	         * best guess about the end-of-file.
+	         */
+	        memb_eoa = file->memb_next[mt];
+	        assert(HADDR_UNDEF!=memb_eoa);
+	    } else {
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
+	    }
+
+            if(memb_eoa > eoa)
+                eoa = memb_eoa;
+        } END_MEMBERS;
+    } else {
+        H5FD_mem_t mmt = file->fa.memb_map[type];
+        if (H5FD_MEM_DEFAULT==mmt) mmt = type;
+
+	if (file->memb[mmt]) {
+            H5E_BEGIN_TRY {
+	        eoa = H5FDget_eoa(file->memb[mmt], mmt);
+            } H5E_END_TRY;
+
+	    if (HADDR_UNDEF==eoa)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
+	    if (eoa>0) eoa += file->fa.memb_addr[mmt];
+	} else if (file->fa.relax) {
+	    /*
+	     * The member is not open yet (maybe it doesn't exist). Make the
+	     * best guess about the end-of-file.
+	     */
+	    eoa = file->memb_next[mmt];
+	    assert(HADDR_UNDEF!=eoa);
+	 } else {
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
+	 }
+    }
+
+    return eoa;
+} /* end H5FD_multi_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_set_eoa
+ *
+ * Purpose:	Set the end-of-address marker for the file by savig the new
+ *		EOA value in the file struct. Also set the EOA marker for the
+ *		subfile in which the new EOA value falls. We don't set the
+ *		EOA values of any other subfiles.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              10 January 2007
+ *              EOA for the whole file is discarded because it's meaningless
+ *              for MULTI file.  This function only sets eoa for individual
+ *              file.
+ *
+ *              Raymond Lu
+ *              21 June 2011
+ *              Backward compatibility of EOA.  Please the comment in the
+ *              code.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_mem_t		mmt;
+    herr_t		status;
+    static const char *func="H5FD_multi_set_eoa";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    mmt = file->fa.memb_map[type];
+    if(H5FD_MEM_DEFAULT == mmt)
+        mmt = type;
+
+    /* Handle backward compatibility in a quick and simple way.  v1.6 library had EOA for the entire virtual 
+     * file.  But it wasn't meaningful.  So v1.8 library doesn't have it anymore.  It saves the EOA for the 
+     * metadata file, instead.  Here we try to figure out whether the EOA is from a v1.6 file by comparing its 
+     * value.  If it is a big value, we assume it's from v1.6 and simply discard it. This is the normal case 
+     * when the metadata file has the smallest starting address.  If the metadata file has the biggest address,
+     * the EOAs of v1.6 and v1.8 files are the same.  It won't cause any trouble.  (Please see Issue 2598 
+     * in Jira) SLU - 2011/6/21
+     */
+    if(H5FD_MEM_SUPER == type && file->memb_eoa[H5FD_MEM_SUPER] > 0 && eoa > file->memb_eoa[H5FD_MEM_SUPER])
+        return 0;
+
+    assert(eoa >= file->fa.memb_addr[mmt]);
+    assert(eoa < file->memb_next[mmt]);
+
+    H5E_BEGIN_TRY {
+	status = H5FDset_eoa(file->memb[mmt], mmt, (eoa - file->fa.memb_addr[mmt]));
+    } H5E_END_TRY;
+    if (status<0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1)
+
+    return 0;
+} /* end H5FD_multi_set_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_get_eof
+ *
+ * Purpose:	Returns the end-of-file marker, which is the greater of
+ *		either the total multi size or the current EOA marker.
+ *
+ * Return:	Success:	End of file address, the first address past
+ *				the end of the multi of files or the current
+ *				EOA, whichever is larger.
+ *
+ *		Failure:      	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              5 January 2007
+ *              Multi driver no longer has EOA for the whole file.  Calculate
+ *              it in the same way as EOF instead.
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_multi_get_eof(const H5FD_t *_file)
+{
+    const H5FD_multi_t	*file = (const H5FD_multi_t*)_file;
+    haddr_t		eof=0, tmp_eof;
+    haddr_t		eoa=0, tmp_eoa;
+    static const char *func="H5FD_multi_get_eof";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+	if (file->memb[mt]) {
+            /* Retrieve EOF */
+	    H5E_BEGIN_TRY {
+		tmp_eof = H5FDget_eof(file->memb[mt]);
+	    } H5E_END_TRY;
+
+	    if (HADDR_UNDEF==tmp_eof)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF)
+	    if (tmp_eof>0) tmp_eof += file->fa.memb_addr[mt];
+
+            /* Retrieve EOA */
+	    H5E_BEGIN_TRY {
+		tmp_eoa = H5FDget_eoa(file->memb[mt], mt);
+	    } H5E_END_TRY;
+
+	    if (HADDR_UNDEF==tmp_eoa)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
+	    if (tmp_eoa>0) tmp_eoa += file->fa.memb_addr[mt];
+	} else if (file->fa.relax) {
+	    /*
+	     * The member is not open yet (maybe it doesn't exist). Make the
+	     * best guess about the end-of-file.
+	     */
+	    tmp_eof = file->memb_next[mt];
+	    assert(HADDR_UNDEF!=tmp_eof);
+
+	    tmp_eoa = file->memb_next[mt];
+	    assert(HADDR_UNDEF!=tmp_eoa);
+	} else {
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF)
+	}
+
+	if (tmp_eof>eof) eof = tmp_eof;
+	if (tmp_eoa>eoa) eoa = tmp_eoa;
+    } END_MEMBERS;
+
+    return MAX(eoa, eof);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_multi_get_handle
+ *
+ * Purpose:        Returns the file handle of MULTI file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+{
+    H5FD_multi_t        *file = (H5FD_multi_t *)_file;
+    H5FD_mem_t          type, mmt;
+    static const char   *func="H5FD_multi_get_handle";  /* Function Name for error reporting */
+
+    /* Get data type for multi driver */
+    if(H5Pget_multi_type(fapl, &type) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't get data type for multi driver", -1)
+    if(type<H5FD_MEM_DEFAULT || type>=H5FD_MEM_NTYPES)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "data type is out of range", -1)
+    mmt = file->fa.memb_map[type];
+    if(H5FD_MEM_DEFAULT==mmt) mmt = type;
+
+    return (H5FDget_vfd_handle(file->memb[mmt], fapl, file_handle));
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_alloc
+ *
+ * Purpose:	Allocate file memory.
+ *
+ * Return:	Success:	Address of new memory
+ *
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, August 12, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_mem_t		mmt;
+    haddr_t		addr;
+    static const char *func="H5FD_multi_alloc";  /* Function Name for error reporting */
+
+    mmt = file->fa.memb_map[type];
+    if (H5FD_MEM_DEFAULT==mmt) mmt = type;
+
+    if (HADDR_UNDEF==(addr=H5FDalloc(file->memb[mmt], mmt, dxpl_id, size)))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", HADDR_UNDEF)
+    addr += file->fa.memb_addr[mmt];
+
+/*#ifdef TMP
+    if ( addr + size > file->eoa ) {
+
+	if ( H5FD_multi_set_eoa(_file, addr + size) < 0 ) {
+
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, \
+			"can't set eoa", HADDR_UNDEF)
+	}
+    }
+#else
+    if ( addr + size > file->eoa )
+	file->eoa = addr + size;
+#endif */
+
+    return addr;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_free
+ *
+ * Purpose:	Frees memory
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, August 12, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_mem_t		mmt;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    mmt = file->fa.memb_map[type];
+    if (H5FD_MEM_DEFAULT==mmt) mmt = type;
+
+    assert(addr>=file->fa.memb_addr[mmt]);
+    assert(addr+size<=file->memb_next[mmt]);
+    return H5FDfree(file->memb[mmt], mmt, dxpl_id, addr-file->fa.memb_addr[mmt], size);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_read
+ *
+ * Purpose:	Reads SIZE bytes of data from FILE beginning at address ADDR
+ *		into buffer BUF according to data transfer properties in
+ *		DXPL_ID.
+ *
+ * Return:	Success:	Zero. Result is stored in caller-supplied
+ *				buffer BUF.
+ *
+ *		Failure:	-1, contents of buffer BUF are undefined.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+    size_t size, void *_buf/*out*/)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_multi_dxpl_t	dx;
+    htri_t              prop_exists = FALSE;    /* Whether the multi VFD DXPL property already exists */
+    H5FD_mem_t		mt, mmt, hi = H5FD_MEM_DEFAULT;
+    haddr_t		start_addr = 0;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Find the file to which this address belongs */
+    for(mt = H5FD_MEM_SUPER; mt < H5FD_MEM_NTYPES; mt = (H5FD_mem_t)(mt + 1)) {
+	mmt = file->fa.memb_map[mt];
+	if(H5FD_MEM_DEFAULT == mmt)
+            mmt = mt;
+	assert(mmt > 0 && mmt < H5FD_MEM_NTYPES);
+
+	if(file->fa.memb_addr[mmt] > addr)
+            continue;
+	if(file->fa.memb_addr[mmt] >= start_addr) {
+	    start_addr = file->fa.memb_addr[mmt];
+	    hi = mmt;
+	} /* end if */
+    } /* end for */
+    assert(hi > 0);
+
+    /* Read from that member */
+    return H5FDread(file->memb[hi], type, (prop_exists ? dx.memb_dxpl[hi] : H5P_DEFAULT),
+            addr - start_addr, size, _buf);
+} /* end H5FD_multi_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_write
+ *
+ * Purpose:	Writes SIZE bytes of data to FILE beginning at address ADDR
+ *		from buffer BUF according to data transfer properties in
+ *		DXPL_ID.
+ *
+ * Return:	Success:	Zero
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+    size_t size, const void *_buf)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_multi_dxpl_t	dx;
+    htri_t              prop_exists = FALSE;    /* Whether the multi VFD DXPL property already exists */
+    H5FD_mem_t		mt, mmt, hi = H5FD_MEM_DEFAULT;
+    haddr_t		start_addr = 0;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Find the file to which this address belongs */
+    for(mt = H5FD_MEM_SUPER; mt < H5FD_MEM_NTYPES; mt = (H5FD_mem_t)(mt + 1)) {
+	mmt = file->fa.memb_map[mt];
+	if(H5FD_MEM_DEFAULT == mmt)
+            mmt = mt;
+	assert(mmt > 0 && mmt<H5FD_MEM_NTYPES);
+
+	if(file->fa.memb_addr[mmt] > addr)
+            continue;
+	if(file->fa.memb_addr[mmt] >= start_addr) {
+	    start_addr = file->fa.memb_addr[mmt];
+	    hi = mmt;
+	} /* end if */
+    } /* end for */
+    assert(hi > 0);
+
+    /* Write to that member */
+    return H5FDwrite(file->memb[hi], type, (prop_exists ? dx.memb_dxpl[hi] : H5P_DEFAULT),
+            addr - start_addr, size, _buf);
+} /* end H5FD_multi_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_flush
+ *
+ * Purpose:	Flushes all multi members.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1, as many files flushed as possible.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_mem_t		mt;
+    int			nerrors=0;
+    static const char *func="H5FD_multi_flush";  /* Function Name for error reporting */
+
+#if 0
+    H5FD_mem_t		mmt;
+
+    /* Debugging stuff... */
+    fprintf(stderr, "multifile access information:\n");
+
+    /* print the map */
+    fprintf(stderr, "    map=");
+    for (mt=1; mt<H5FD_MEM_NTYPES; mt++) {
+	mmt = file->memb_map[mt];
+	if (H5FD_MEM_DEFAULT==mmt) mmt = mt;
+	fprintf(stderr, "%s%d", 1==mt?"":",", (int)mmt);
+    }
+    fprintf(stderr, "\n");
+
+    /* print info about each file */
+    fprintf(stderr, "      File             Starting            Allocated                 Next Member\n");
+    fprintf(stderr, "    Number              Address                 Size              Address Name\n");
+    fprintf(stderr, "    ------ -------------------- -------------------- -------------------- ------------------------------\n");
+
+    for (mt=1; mt<H5FD_MEM_NTYPES; mt++) {
+	if (HADDR_UNDEF!=file->memb_addr[mt]) {
+	    haddr_t eoa = H5FDget_eoa(file->memb[mt], mt);
+	    fprintf(stderr, "    %6d %20llu %20llu %20llu %s\n",
+		    (int)mt, (unsigned long long)(file->memb_addr[mt]),
+		    (unsigned long long)eoa,
+		    (unsigned long long)(file->memb_next[mt]),
+		    file->memb_name[mt]);
+	}
+    }
+#endif
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Flush each file */
+    for (mt=H5FD_MEM_SUPER; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
+	if (file->memb[mt]) {
+	    H5E_BEGIN_TRY {
+		if (H5FDflush(file->memb[mt],dxpl_id,closing)<0) nerrors++;
+	    } H5E_END_TRY;
+	}
+    }
+    if (nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error flushing member files", -1)
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_truncate
+ *
+ * Purpose:	Truncates all multi members.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1, as many files truncated as possible.
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 31, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    H5FD_mem_t		mt;
+    int			nerrors=0;
+    static const char *func="H5FD_multi_truncate";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Truncate each file */
+    for(mt = H5FD_MEM_SUPER; mt < H5FD_MEM_NTYPES; mt = (H5FD_mem_t)(mt + 1)) {
+	if(file->memb[mt]) {
+	    H5E_BEGIN_TRY {
+		if(H5FDtruncate(file->memb[mt], dxpl_id, closing) < 0)
+                    nerrors++;
+	    } H5E_END_TRY;
+	}
+    }
+    if(nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error truncating member files", -1)
+
+    return 0;
+} /* end H5FD_multi_truncate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	compute_next
+ *
+ * Purpose:	Compute the memb_next[] values of the file based on the
+ *		file's member map and the member starting addresses.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 23, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+compute_next(H5FD_multi_t *file)
+{
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    ALL_MEMBERS(mt) {
+	file->memb_next[mt] = HADDR_UNDEF;
+    } END_MEMBERS;
+
+    UNIQUE_MEMBERS(file->fa.memb_map, mt1) {
+	UNIQUE_MEMBERS(file->fa.memb_map, mt2) {
+	    if (file->fa.memb_addr[mt1]<file->fa.memb_addr[mt2] &&
+		(HADDR_UNDEF==file->memb_next[mt1] ||
+		 file->memb_next[mt1]>file->fa.memb_addr[mt2])) {
+		file->memb_next[mt1] = file->fa.memb_addr[mt2];
+	    }
+	} END_MEMBERS;
+	if (HADDR_UNDEF==file->memb_next[mt1]) {
+	    file->memb_next[mt1] = HADDR_MAX; /*last member*/
+	}
+    } END_MEMBERS;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	open_members
+ *
+ * Purpose:	Opens all members which are not opened yet.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, August 23, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+open_members(H5FD_multi_t *file)
+{
+    char	tmp[H5FD_MULT_MAX_FILE_NAME_LEN];
+    int		nerrors=0;
+    static const char *func="(H5FD_multi)open_members";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+	if(file->memb[mt])
+            continue; /*already open*/
+	assert(file->fa.memb_name[mt]);
+        /* Note: This truncates the user's filename down to only sizeof(tmp)
+         *      characters. -QK & JK, 2013/01/17
+         */
+	sprintf(tmp, file->fa.memb_name[mt], file->name);
+
+	H5E_BEGIN_TRY {
+	    file->memb[mt] = H5FDopen(tmp, file->flags, file->fa.memb_fapl[mt], HADDR_UNDEF);
+	} H5E_END_TRY;
+	if(!file->memb[mt]) {
+	    if(!file->fa.relax || (file->flags & H5F_ACC_RDWR))
+		nerrors++;
+	}
+    } END_MEMBERS;
+    if (nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error opening member files", -1)
+
+    return 0;
+}
+
+

+#ifdef _H5private_H
+/*
+ * This is not related to the functionality of the driver code.
+ * It is added here to trigger warning if HDF5 private definitions are included
+ * by mistake.  The code should use only HDF5 public API and definitions.
+ */
+#error "Do not use HDF5 private definitions"
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDmulti.h b/gatb-core/thirdparty/hdf5/src/H5FDmulti.h
new file mode 100644
index 0000000..b45a029
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDmulti.h
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  2, 1999
+ *
+ * Purpose:	The public header file for the "multi" driver.
+ */
+#ifndef H5FDmulti_H
+#define H5FDmulti_H
+
+#include "H5Ipublic.h"
+#include "H5Ppublic.h"             /* Property lists */
+#include "H5Fpublic.h"
+
+#define H5FD_MULTI	(H5FD_multi_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+H5_DLL hid_t H5FD_multi_init(void);
+H5_DLL void H5FD_multi_term(void);
+H5_DLL herr_t H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map,
+			 const hid_t *memb_fapl, const char * const *memb_name,
+			 const haddr_t *memb_addr, hbool_t relax);
+H5_DLL herr_t H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/,
+			 hid_t *memb_fapl/*out*/, char **memb_name/*out*/,
+			 haddr_t *memb_addr/*out*/, hbool_t *relax/*out*/);
+H5_DLL herr_t H5Pset_fapl_split(hid_t fapl, const char *meta_ext,
+			 hid_t meta_plist_id, const char *raw_ext,
+			 hid_t raw_plist_id);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDpkg.h b/gatb-core/thirdparty/hdf5/src/H5FDpkg.h
new file mode 100644
index 0000000..7c0988e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDpkg.h
@@ -0,0 +1,67 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Thursday, January  3, 2008
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5FD package.  Source files outside the H5FD package should
+ *		include H5FDprivate.h instead.
+ */
+#ifndef H5FD_PACKAGE
+#error "Do not include this file outside the H5FD package!"
+#endif
+
+#ifndef _H5FDpkg_H
+#define _H5FDpkg_H
+
+/* Get package's private header */
+#include "H5FDprivate.h"	/* File drivers				*/
+
+/* Other private headers needed by this file */
+#include "H5FLprivate.h"	/* Free lists                           */
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+H5_DLL herr_t H5FD_init(void);
+H5_DLL haddr_t H5FD_alloc_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type,
+    hsize_t size, haddr_t *align_addr, hsize_t *align_size);
+H5_DLL herr_t H5FD_free_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type,
+    haddr_t addr, hsize_t size);
+
+
+/* Testing routines */
+#ifdef H5FD_TESTING
+#endif /* H5FD_TESTING */
+
+#endif /* _H5FDpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDprivate.h b/gatb-core/thirdparty/hdf5/src/H5FDprivate.h
new file mode 100644
index 0000000..92e613f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDprivate.h
@@ -0,0 +1,168 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, July 26, 1999
+ */
+#ifndef _H5FDprivate_H
+#define _H5FDprivate_H
+
+/* Include package's public header */
+#include "H5FDpublic.h"
+
+/* Private headers needed by this file */
+#include "H5Pprivate.h"		/* Property lists			*/
+
+/*
+ * The MPI drivers are needed because there are
+ * places where we check for things that aren't handled by these drivers.
+ */
+#include "H5FDmpi.h"            /* MPI-based file drivers		*/
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Length of filename buffer */
+#define H5FD_MAX_FILENAME_LEN      1024
+
+#ifdef H5_HAVE_PARALLEL
+/* ======== Temporary data transfer properties ======== */
+/* Definitions for memory MPI type property */
+#define H5FD_MPI_XFER_MEM_MPI_TYPE_NAME        "H5FD_mpi_mem_mpi_type"
+/* Definitions for file MPI type property */
+#define H5FD_MPI_XFER_FILE_MPI_TYPE_NAME       "H5FD_mpi_file_mpi_type"
+
+/* Sub-class the H5FD_class_t to add more specific functions for MPI-based VFDs */
+typedef struct H5FD_class_mpi_t {
+    H5FD_class_t        super;          /* Superclass information & methods */
+    int  (*get_rank)(const H5FD_t *file);     /* Get the MPI rank of a process */
+    int  (*get_size)(const H5FD_t *file);     /* Get the MPI size of a communicator */
+    MPI_Comm (*get_comm)(const H5FD_t *file); /* Get the communicator for a file */
+} H5FD_class_mpi_t;
+#endif
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* File operations */
+typedef enum {
+    OP_UNKNOWN = 0,             /* Unknown last file operation */
+    OP_READ = 1,                /* Last file I/O operation was a read */
+    OP_WRITE = 2                /* Last file I/O operation was a write */
+} H5FD_file_op_t;
+
+
+/* Define structure to hold initial file image and other relevant information */
+typedef struct {
+    void *buffer;
+    size_t size;
+    H5FD_file_image_callbacks_t callbacks;
+} H5FD_file_image_info_t;
+
+/* Define default file image info */
+#define H5FD_DEFAULT_FILE_IMAGE_INFO { \
+    /* file image buffer */ NULL,       \
+    /* buffer size */       0,          \
+    { /* Callbacks */                   \
+        /* image_malloc */      NULL,   \
+        /* image_memcpy */      NULL,   \
+        /* image_realloc */     NULL,   \
+        /* image_free */        NULL,   \
+        /* udata_copy */        NULL,   \
+        /* udata_free */        NULL,   \
+        /* udata */             NULL,   \
+    }                                   \
+}
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Library Private Prototypes */
+/******************************/
+
+/* Forward declarations for prototype arguments */
+struct H5P_genplist_t;
+struct H5F_t;
+
+H5_DLL int H5FD_term_interface(void);
+H5_DLL herr_t H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_addr);
+H5_DLL H5FD_class_t *H5FD_get_class(hid_t id);
+H5_DLL hsize_t H5FD_sb_size(H5FD_t *file);
+H5_DLL herr_t H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf);
+H5_DLL herr_t H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf);
+H5_DLL void *H5FD_fapl_get(H5FD_t *file);
+H5_DLL herr_t H5FD_fapl_open(struct H5P_genplist_t *plist, hid_t driver_id, const void *driver_info);
+H5_DLL herr_t H5FD_fapl_close(hid_t driver_id, void *fapl);
+H5_DLL hid_t H5FD_register(const void *cls, size_t size, hbool_t app_ref);
+H5_DLL H5FD_t *H5FD_open(const char *name, unsigned flags, hid_t fapl_id,
+		  haddr_t maxaddr);
+H5_DLL herr_t H5FD_close(H5FD_t *file);
+H5_DLL int H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2);
+H5_DLL haddr_t H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, struct H5F_t *f,
+    hsize_t size, haddr_t *align_addr, hsize_t *align_size);
+H5_DLL herr_t H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, struct H5F_t *f,
+    haddr_t addr, hsize_t size);
+H5_DLL htri_t H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, struct H5F_t *f,
+    haddr_t blk_end, hsize_t extra_requested);
+H5_DLL haddr_t H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type);
+H5_DLL herr_t H5FD_set_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
+H5_DLL haddr_t H5FD_get_eof(const H5FD_t *file);
+H5_DLL haddr_t H5FD_get_maxaddr(const H5FD_t *file);
+H5_DLL herr_t H5FD_get_feature_flags(const H5FD_t *file, unsigned long *feature_flags);
+H5_DLL herr_t H5FD_get_fs_type_map(const H5FD_t *file, H5FD_mem_t *type_map);
+H5_DLL herr_t H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type,
+    haddr_t addr, size_t size, void *buf/*out*/);
+H5_DLL herr_t H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type,
+    haddr_t addr, size_t size, const void *buf);
+H5_DLL herr_t H5FD_flush(H5FD_t *file, hid_t dxpl_id, unsigned closing);
+H5_DLL herr_t H5FD_truncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
+H5_DLL herr_t H5FD_get_fileno(const H5FD_t *file, unsigned long *filenum);
+H5_DLL herr_t H5FD_get_vfd_handle(H5FD_t *file, hid_t fapl, void** file_handle);
+H5_DLL herr_t H5FD_set_base_addr(H5FD_t *file, haddr_t base_addr);
+H5_DLL haddr_t H5FD_get_base_addr(const H5FD_t *file);
+
+/* Function prototypes for MPI based VFDs*/
+#ifdef H5_HAVE_PARALLEL
+/* General routines */
+H5_DLL haddr_t H5FD_mpi_MPIOff_to_haddr(MPI_Offset mpi_off);
+H5_DLL herr_t H5FD_mpi_haddr_to_MPIOff(haddr_t addr, MPI_Offset *mpi_off/*out*/);
+H5_DLL herr_t H5FD_mpi_comm_info_dup(MPI_Comm comm, MPI_Info info,
+				MPI_Comm *comm_new, MPI_Info *info_new);
+H5_DLL herr_t H5FD_mpi_comm_info_free(MPI_Comm *comm, MPI_Info *info);
+#ifdef NOT_YET
+H5_DLL herr_t H5FD_mpio_wait_for_left_neighbor(H5FD_t *file);
+H5_DLL herr_t H5FD_mpio_signal_right_neighbor(H5FD_t *file);
+#endif /* NOT_YET */
+H5_DLL herr_t H5FD_mpi_setup_collective(hid_t dxpl_id, MPI_Datatype *btype,
+    MPI_Datatype *ftype);
+H5_DLL herr_t H5FD_set_mpio_atomicity(H5FD_t *file, hbool_t flag);
+H5_DLL herr_t H5FD_get_mpio_atomicity(H5FD_t *file, hbool_t *flag);
+
+/* Driver specific methods */
+H5_DLL int H5FD_mpi_get_rank(const H5FD_t *file);
+H5_DLL int H5FD_mpi_get_size(const H5FD_t *file);
+H5_DLL MPI_Comm H5FD_mpi_get_comm(const H5FD_t *_file);
+#endif /* H5_HAVE_PARALLEL */
+
+#endif /* !_H5FDprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDpublic.h b/gatb-core/thirdparty/hdf5/src/H5FDpublic.h
new file mode 100644
index 0000000..b4c9903
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDpublic.h
@@ -0,0 +1,329 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, July 26, 1999
+ */
+#ifndef _H5FDpublic_H
+#define _H5FDpublic_H
+
+#include "H5public.h"
+#include "H5Fpublic.h"		/*for H5F_close_degree_t */
+
+#define H5_HAVE_VFL 1 /*define a convenient app feature test*/
+#define H5FD_VFD_DEFAULT 0   /* Default VFL driver value */
+
+/* Types of allocation requests: see H5Fpublic.h  */
+typedef enum H5F_mem_t	H5FD_mem_t;
+
+/* Map "fractal heap" header blocks to 'ohdr' type file memory, since its
+ * a fair amount of work to add a new kind of file memory and they are similar
+ * enough to object headers and probably too minor to deserve their own type.
+ *
+ * Map "fractal heap" indirect blocks to 'ohdr' type file memory, since they
+ * are similar to fractal heap header blocks.
+ *
+ * Map "fractal heap" direct blocks to 'lheap' type file memory, since they
+ * will be replacing local heaps.
+ *
+ * Map "fractal heap" 'huge' objects to 'draw' type file memory, since they
+ * represent large objects that are directly stored in the file.
+ *
+ *      -QAK
+ */
+#define H5FD_MEM_FHEAP_HDR      H5FD_MEM_OHDR
+#define H5FD_MEM_FHEAP_IBLOCK   H5FD_MEM_OHDR
+#define H5FD_MEM_FHEAP_DBLOCK   H5FD_MEM_LHEAP
+#define H5FD_MEM_FHEAP_HUGE_OBJ H5FD_MEM_DRAW
+
+/* Map "free space" header blocks to 'ohdr' type file memory, since its
+ * a fair amount of work to add a new kind of file memory and they are similar
+ * enough to object headers and probably too minor to deserve their own type.
+ *
+ * Map "free space" serialized sections to 'lheap' type file memory, since they
+ * are similar enough to local heap info.
+ *
+ *      -QAK
+ */
+#define H5FD_MEM_FSPACE_HDR     H5FD_MEM_OHDR
+#define H5FD_MEM_FSPACE_SINFO   H5FD_MEM_LHEAP
+
+/* Map "shared object header message" master table to 'ohdr' type file memory,
+ * since its a fair amount of work to add a new kind of file memory and they are
+ * similar enough to object headers and probably too minor to deserve their own
+ * type.
+ *
+ * Map "shared object header message" indices to 'btree' type file memory,
+ * since they are similar enough to B-tree nodes.
+ *
+ *      -QAK
+ */
+#define H5FD_MEM_SOHM_TABLE     H5FD_MEM_OHDR
+#define H5FD_MEM_SOHM_INDEX     H5FD_MEM_BTREE
+
+/*
+ * A free-list map which maps all types of allocation requests to a single
+ * free list.  This is useful for drivers that don't really care about
+ * keeping different requests segregated in the underlying file and which
+ * want to make most efficient reuse of freed memory.  The use of the
+ * H5FD_MEM_SUPER free list is arbitrary.
+ */
+#define H5FD_FLMAP_SINGLE {						      \
+    H5FD_MEM_SUPER,			/*default*/			      \
+    H5FD_MEM_SUPER,			/*super*/			      \
+    H5FD_MEM_SUPER,			/*btree*/			      \
+    H5FD_MEM_SUPER,			/*draw*/			      \
+    H5FD_MEM_SUPER,			/*gheap*/			      \
+    H5FD_MEM_SUPER,			/*lheap*/			      \
+    H5FD_MEM_SUPER			/*ohdr*/			      \
+}
+
+/*
+ * A free-list map which segregates requests into `raw' or `meta' data
+ * pools.
+ */
+#define H5FD_FLMAP_DICHOTOMY {						      \
+    H5FD_MEM_SUPER,			/*default*/			      \
+    H5FD_MEM_SUPER,			/*super*/			      \
+    H5FD_MEM_SUPER,			/*btree*/			      \
+    H5FD_MEM_DRAW,			/*draw*/			      \
+    H5FD_MEM_DRAW,			/*gheap*/			      \
+    H5FD_MEM_SUPER,			/*lheap*/			      \
+    H5FD_MEM_SUPER			/*ohdr*/			      \
+}
+
+/*
+ * The default free list map which causes each request type to use it's own
+ * free-list.
+ */
+#define H5FD_FLMAP_DEFAULT {						      \
+    H5FD_MEM_DEFAULT,			/*default*/			      \
+    H5FD_MEM_DEFAULT,			/*super*/			      \
+    H5FD_MEM_DEFAULT,			/*btree*/			      \
+    H5FD_MEM_DEFAULT,			/*draw*/			      \
+    H5FD_MEM_DEFAULT,			/*gheap*/			      \
+    H5FD_MEM_DEFAULT,			/*lheap*/			      \
+    H5FD_MEM_DEFAULT			/*ohdr*/			      \
+}
+
+
+/* Define VFL driver features that can be enabled on a per-driver basis */
+/* These are returned with the 'query' function pointer in H5FD_class_t */
+    /*
+     * Defining the H5FD_FEAT_AGGREGATE_METADATA for a VFL driver means that
+     * the library will attempt to allocate a larger block for metadata and
+     * then sub-allocate each metadata request from that larger block.
+     */
+#define H5FD_FEAT_AGGREGATE_METADATA    0x00000001
+    /*
+     * Defining the H5FD_FEAT_ACCUMULATE_METADATA for a VFL driver means that
+     * the library will attempt to cache metadata as it is written to the file
+     * and build up a larger block of metadata to eventually pass to the VFL
+     * 'write' routine.
+     *
+     * Distinguish between updating the metadata accumulator on writes and
+     * reads.  This is particularly (perhaps only, even) important for MPI-I/O
+     * where we guarantee that writes are collective, but reads may not be.
+     * If we were to allow the metadata accumulator to be written during a
+     * read operation, the application would hang.
+     */
+#define H5FD_FEAT_ACCUMULATE_METADATA_WRITE     0x00000002
+#define H5FD_FEAT_ACCUMULATE_METADATA_READ      0x00000004
+#define H5FD_FEAT_ACCUMULATE_METADATA   (H5FD_FEAT_ACCUMULATE_METADATA_WRITE|H5FD_FEAT_ACCUMULATE_METADATA_READ)
+    /*
+     * Defining the H5FD_FEAT_DATA_SIEVE for a VFL driver means that
+     * the library will attempt to cache raw data as it is read from/written to
+     * a file in a "data seive" buffer.  See Rajeev Thakur's papers:
+     *  http://www.mcs.anl.gov/~thakur/papers/romio-coll.ps.gz
+     *  http://www.mcs.anl.gov/~thakur/papers/mpio-high-perf.ps.gz
+     */
+#define H5FD_FEAT_DATA_SIEVE            0x00000008
+    /*
+     * Defining the H5FD_FEAT_AGGREGATE_SMALLDATA for a VFL driver means that
+     * the library will attempt to allocate a larger block for "small" raw data
+     * and then sub-allocate "small" raw data requests from that larger block.
+     */
+#define H5FD_FEAT_AGGREGATE_SMALLDATA   0x00000010
+    /*
+     * Defining the H5FD_FEAT_IGNORE_DRVRINFO for a VFL driver means that
+     * the library will ignore the driver info that is encoded in the file
+     * for the VFL driver.  (This will cause the driver info to be eliminated
+     * from the file when it is flushed/closed, if the file is opened R/W).
+     */
+#define H5FD_FEAT_IGNORE_DRVRINFO       0x00000020
+    /*
+     * Defining the H5FD_FEAT_DIRTY_SBLK_LOAD for a VFL driver means that
+     * the library will mark the superblock dirty when the file is opened
+     * R/W.  This will cause the driver info to be re-encoded when the file
+     * is flushed/closed.
+     */
+#define H5FD_FEAT_DIRTY_SBLK_LOAD       0x00000040
+    /*
+     * Defining the H5FD_FEAT_POSIX_COMPAT_HANDLE for a VFL driver means that
+     * the handle for the VFD (returned with the 'get_handle' callback) is
+     * of type 'int' and is compatible with POSIX I/O calls.
+     */
+#define H5FD_FEAT_POSIX_COMPAT_HANDLE   0x00000080
+    /*
+     * Defining the H5FD_FEAT_HAS_MPI for a VFL driver means that
+     * the driver makes use of MPI communication and code may retrieve
+     * communicator/rank information from it
+     */
+#define H5FD_FEAT_HAS_MPI               0x00000100
+    /*
+     * Defining the H5FD_FEAT_ALLOCATE_EARLY for a VFL driver will force
+     * the library to use the H5D_ALLOC_TIME_EARLY on dataset create
+     * instead of the default H5D_ALLOC_TIME_LATE
+     */
+#define H5FD_FEAT_ALLOCATE_EARLY        0x00000200
+    /* 
+     * Defining the H5FD_FEAT_ALLOW_FILE_IMAGE for a VFL driver means that
+     * the driver is able to use a file image in the fapl as the initial
+     * contents of a file.
+     */
+#define H5FD_FEAT_ALLOW_FILE_IMAGE      0x00000400
+    /*
+     * Defining the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS for a VFL driver
+     * means that the driver is able to use callbacks to make a copy of the
+     * image to store in memory.
+     */
+#define H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS 0x00000800
+
+/* Forward declaration */
+typedef struct H5FD_t H5FD_t;
+
+/* Class information for each file driver */
+typedef struct H5FD_class_t {
+    const char *name;
+    haddr_t maxaddr;
+    H5F_close_degree_t fc_degree;
+    hsize_t (*sb_size)(H5FD_t *file);
+    herr_t  (*sb_encode)(H5FD_t *file, char *name/*out*/,
+                         unsigned char *p/*out*/);
+    herr_t  (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p);
+    size_t  fapl_size;
+    void *  (*fapl_get)(H5FD_t *file);
+    void *  (*fapl_copy)(const void *fapl);
+    herr_t  (*fapl_free)(void *fapl);
+    size_t  dxpl_size;
+    void *  (*dxpl_copy)(const void *dxpl);
+    herr_t  (*dxpl_free)(void *dxpl);
+    H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl,
+                    haddr_t maxaddr);
+    herr_t  (*close)(H5FD_t *file);
+    int     (*cmp)(const H5FD_t *f1, const H5FD_t *f2);
+    herr_t  (*query)(const H5FD_t *f1, unsigned long *flags);
+    herr_t  (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map);
+    haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+    herr_t  (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
+                    haddr_t addr, hsize_t size);
+    haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type);
+    herr_t  (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
+    haddr_t (*get_eof)(const H5FD_t *file);
+    herr_t  (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle);
+    herr_t  (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl,
+                    haddr_t addr, size_t size, void *buffer);
+    herr_t  (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl,
+                     haddr_t addr, size_t size, const void *buffer);
+    herr_t  (*flush)(H5FD_t *file, hid_t dxpl_id, unsigned closing);
+    herr_t  (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
+    herr_t  (*lock)(H5FD_t *file, unsigned char *oid, unsigned lock_type, hbool_t last);
+    herr_t  (*unlock)(H5FD_t *file, unsigned char *oid, hbool_t last);
+    H5FD_mem_t fl_map[H5FD_MEM_NTYPES];
+} H5FD_class_t;
+
+/* A free list is a singly-linked list of address/size pairs. */
+typedef struct H5FD_free_t {
+    haddr_t		addr;
+    hsize_t		size;
+    struct H5FD_free_t	*next;
+} H5FD_free_t;
+
+/*
+ * The main datatype for each driver. Public fields common to all drivers
+ * are declared here and the driver appends private fields in memory.
+ */
+struct H5FD_t {
+    hid_t               driver_id;      /*driver ID for this file   */
+    const H5FD_class_t *cls;            /*constant class info       */
+    unsigned long       fileno;         /* File 'serial' number     */
+    unsigned long       feature_flags;  /* VFL Driver feature Flags */
+    haddr_t             maxaddr;        /* For this file, overrides class */
+    haddr_t             base_addr;      /* Base address for HDF5 data w/in file */
+
+    /* Space allocation management fields */
+    hsize_t             threshold;      /* Threshold for alignment  */
+    hsize_t             alignment;      /* Allocation alignment     */
+};
+
+/* Define enum for the source of file image callbacks */
+typedef enum {
+    H5FD_FILE_IMAGE_OP_NO_OP,
+    H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET,     
+    H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY,
+    H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET,
+    H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
+    H5FD_FILE_IMAGE_OP_FILE_OPEN,
+    H5FD_FILE_IMAGE_OP_FILE_RESIZE,
+    H5FD_FILE_IMAGE_OP_FILE_CLOSE
+} H5FD_file_image_op_t;
+
+/* Define structure to hold file image callbacks */
+typedef struct {
+    void   *(*image_malloc)(size_t size, H5FD_file_image_op_t file_image_op, 
+                            void *udata);
+    void   *(*image_memcpy)(void *dest, const void *src, size_t size,
+                            H5FD_file_image_op_t file_image_op, void *udata);
+    void   *(*image_realloc)(void *ptr, size_t size, 
+                            H5FD_file_image_op_t file_image_op, void *udata);
+    herr_t  (*image_free)(void *ptr, H5FD_file_image_op_t file_image_op, 
+                          void *udata);
+    void   *(*udata_copy)(void *udata);
+    herr_t  (*udata_free)(void *udata);
+    void *udata;
+} H5FD_file_image_callbacks_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Function prototypes */
+H5_DLL hid_t H5FDregister(const H5FD_class_t *cls);
+H5_DLL herr_t H5FDunregister(hid_t driver_id);
+H5_DLL H5FD_t *H5FDopen(const char *name, unsigned flags, hid_t fapl_id,
+                        haddr_t maxaddr);
+H5_DLL herr_t H5FDclose(H5FD_t *file);
+H5_DLL int H5FDcmp(const H5FD_t *f1, const H5FD_t *f2);
+H5_DLL int H5FDquery(const H5FD_t *f, unsigned long *flags);
+H5_DLL haddr_t H5FDalloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+H5_DLL herr_t H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
+                       haddr_t addr, hsize_t size);
+H5_DLL haddr_t H5FDget_eoa(H5FD_t *file, H5FD_mem_t type);
+H5_DLL herr_t H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t eoa);
+H5_DLL haddr_t H5FDget_eof(H5FD_t *file);
+H5_DLL herr_t H5FDget_vfd_handle(H5FD_t *file, hid_t fapl, void**file_handle);
+H5_DLL herr_t H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
+                       haddr_t addr, size_t size, void *buf/*out*/);
+H5_DLL herr_t H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
+                        haddr_t addr, size_t size, const void *buf);
+H5_DLL herr_t H5FDflush(H5FD_t *file, hid_t dxpl_id, unsigned closing);
+H5_DLL herr_t H5FDtruncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDsec2.c b/gatb-core/thirdparty/hdf5/src/H5FDsec2.c
new file mode 100644
index 0000000..e513381
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDsec2.c
@@ -0,0 +1,897 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, July 29, 1999
+ *
+ * Purpose: The POSIX unbuffered file driver using only the HDF5 public
+ *          API and with a few optimizations: the lseek() call is made
+ *          only when the current file position is unknown or needs to be
+ *          changed based on previous I/O through this driver (don't mix
+ *          I/O from this driver with I/O from other parts of the
+ *          application to the same file).
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC  H5FD_sec2_init_interface
+
+
+#include "H5private.h"      /* Generic Functions        */
+#include "H5Eprivate.h"     /* Error handling           */
+#include "H5Fprivate.h"     /* File access              */
+#include "H5FDprivate.h"    /* File drivers             */
+#include "H5FDsec2.h"       /* Sec2 file driver         */
+#include "H5FLprivate.h"    /* Free Lists               */
+#include "H5Iprivate.h"     /* IDs                      */
+#include "H5MMprivate.h"    /* Memory management        */
+#include "H5Pprivate.h"     /* Property lists           */
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_SEC2_g = 0;
+
+/* The description of a file belonging to this driver. The 'eoa' and 'eof'
+ * determine the amount of hdf5 address space in use and the high-water mark
+ * of the file (the current size of the underlying filesystem file). The
+ * 'pos' value is used to eliminate file position updates when they would be a
+ * no-op. Unfortunately we've found systems that use separate file position
+ * indicators for reading and writing so the lseek can only be eliminated if
+ * the current operation is the same as the previous operation.  When opening
+ * a file the 'eof' will be set to the current file size, `eoa' will be set
+ * to zero, 'pos' will be set to H5F_ADDR_UNDEF (as it is when an error
+ * occurs), and 'op' will be set to H5F_OP_UNKNOWN.
+ */
+typedef struct H5FD_sec2_t {
+    H5FD_t          pub;    /* public stuff, must be first      */
+    int             fd;     /* the filesystem file descriptor   */
+    haddr_t         eoa;    /* end of allocated region          */
+    haddr_t         eof;    /* end of file; current file size   */
+    haddr_t         pos;    /* current file I/O position        */
+    H5FD_file_op_t  op;     /* last operation                   */
+    char            filename[H5FD_MAX_FILENAME_LEN];    /* Copy of file name from open operation */
+#ifndef H5_HAVE_WIN32_API
+    /* On most systems the combination of device and i-node number uniquely
+     * identify a file.  Note that Cygwin, MinGW and other Windows POSIX
+     * environments have the stat function (which fakes inodes)
+     * and will use the 'device + inodes' scheme as opposed to the
+     * Windows code further below.
+     */
+    dev_t           device;     /* file device number   */
+    ino_t           inode;      /* file i-node number   */
+#else
+    /* Files in windows are uniquely identified by the volume serial
+     * number and the file index (both low and high parts).
+     *
+     * There are caveats where these numbers can change, especially
+     * on FAT file systems.  On NTFS, however, a file should keep
+     * those numbers the same until renamed or deleted (though you
+     * can use ReplaceFile() on NTFS to keep the numbers the same
+     * while renaming).
+     *
+     * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
+     * more information.
+     *
+     * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
+     */
+    DWORD           nFileIndexLow;
+    DWORD           nFileIndexHigh;
+    DWORD           dwVolumeSerialNumber;
+    
+    HANDLE          hFile;      /* Native windows file handle */
+#endif  /* H5_HAVE_WIN32_API */
+
+    /* Information from properties set by 'h5repart' tool
+     *
+     * Whether to eliminate the family driver info and convert this file to
+     * a single file.
+     */
+    hbool_t         fam_to_sec2;
+} H5FD_sec2_t;
+
+/*
+ * These macros check for overflow of various quantities.  These macros
+ * assume that HDoff_t is signed and haddr_t and size_t are unsigned.
+ *
+ * ADDR_OVERFLOW:   Checks whether a file address of type `haddr_t'
+ *                  is too large to be represented by the second argument
+ *                  of the file seek function.
+ *
+ * SIZE_OVERFLOW:   Checks whether a buffer size of type `hsize_t' is too
+ *                  large to be represented by the `size_t' type.
+ *
+ * REGION_OVERFLOW: Checks whether an address and size pair describe data
+ *                  which can be addressed entirely by the second
+ *                  argument of the file seek function.
+ */
+#define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1)
+#define ADDR_OVERFLOW(A)    (HADDR_UNDEF==(A) || ((A) & ~(haddr_t)MAXADDR))
+#define SIZE_OVERFLOW(Z)    ((Z) & ~(hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)    (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||    \
+                                 HADDR_UNDEF==(A)+(Z) ||                    \
+                                (HDoff_t)((A)+(Z))<(HDoff_t)(A))
+
+/* Prototypes */
+static H5FD_t *H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id,
+            haddr_t maxaddr);
+static herr_t H5FD_sec2_close(H5FD_t *_file);
+static int H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_sec2_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_sec2_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_sec2_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_sec2_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, void *buf);
+static herr_t H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+            size_t size, const void *buf);
+static herr_t H5FD_sec2_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+static const H5FD_class_t H5FD_sec2_g = {
+    "sec2",                     /* name                 */
+    MAXADDR,                    /* maxaddr              */
+    H5F_CLOSE_WEAK,             /* fc_degree            */
+    NULL,                       /* sb_size              */
+    NULL,                       /* sb_encode            */
+    NULL,                       /* sb_decode            */
+    0,                          /* fapl_size            */
+    NULL,                       /* fapl_get             */
+    NULL,                       /* fapl_copy            */
+    NULL,                       /* fapl_free            */
+    0,                          /* dxpl_size            */
+    NULL,                       /* dxpl_copy            */
+    NULL,                       /* dxpl_free            */
+    H5FD_sec2_open,             /* open                 */
+    H5FD_sec2_close,            /* close                */
+    H5FD_sec2_cmp,              /* cmp                  */
+    H5FD_sec2_query,            /* query                */
+    NULL,                       /* get_type_map         */
+    NULL,                       /* alloc                */
+    NULL,                       /* free                 */
+    H5FD_sec2_get_eoa,          /* get_eoa              */
+    H5FD_sec2_set_eoa,          /* set_eoa              */
+    H5FD_sec2_get_eof,          /* get_eof              */
+    H5FD_sec2_get_handle,       /* get_handle           */
+    H5FD_sec2_read,             /* read                 */
+    H5FD_sec2_write,            /* write                */
+    NULL,                       /* flush                */
+    H5FD_sec2_truncate,         /* truncate             */
+    NULL,                       /* lock                 */
+    NULL,                       /* unlock               */
+    H5FD_FLMAP_DICHOTOMY        /* fl_map               */
+};
+
+/* Declare a free list to manage the H5FD_sec2_t struct */
+H5FL_DEFINE_STATIC(H5FD_sec2_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_init_interface
+ *
+ * Purpose:     Initializes any interface-specific data or routines.
+ *
+ * Return:      Success:    The driver ID for the sec2 driver.
+ *              Failure:    Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_sec2_init())
+} /* H5FD_sec2_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_init
+ *
+ * Purpose:     Initialize this driver by registering the driver with the
+ *              library.
+ *
+ * Return:      Success:    The driver ID for the sec2 driver.
+ *              Failure:    Negative
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_sec2_init(void)
+{
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5I_VFL != H5I_get_type(H5FD_SEC2_g))
+        H5FD_SEC2_g = H5FD_register(&H5FD_sec2_g, sizeof(H5FD_class_t), FALSE);
+
+    /* Set return value */
+    ret_value = H5FD_SEC2_g;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_init() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:    H5FD_sec2_term
+ *
+ * Purpose:     Shut down the VFD
+ *
+ * Returns:     <none>
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_sec2_term(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Reset VFL ID */
+    H5FD_SEC2_g = 0;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5FD_sec2_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fapl_sec2
+ *
+ * Purpose:     Modify the file access property list to use the H5FD_SEC2
+ *              driver defined in this source file.  There are no driver
+ *              specific properties.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, February 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_sec2(hid_t fapl_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", fapl_id);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    ret_value = H5P_set_driver(plist, H5FD_SEC2, NULL);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fapl_sec2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_open
+ *
+ * Purpose:     Create and/or opens a file as an HDF5 file.
+ *
+ * Return:      Success:    A pointer to a new file data structure. The
+ *                          public fields will be initialized by the
+ *                          caller, which is always H5FD_open().
+ *              Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+{
+    H5FD_sec2_t     *file       = NULL;     /* sec2 VFD info            */
+    int             fd          = -1;       /* File descriptor          */
+    int             o_flags;                /* Flags for open() call    */
+#ifdef H5_HAVE_WIN32_API
+    struct _BY_HANDLE_FILE_INFORMATION fileinfo;
+#endif
+    h5_stat_t       sb;
+    H5FD_t          *ret_value;             /* Return value             */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check on file offsets */
+    HDcompile_assert(sizeof(HDoff_t) >= sizeof(size_t));
+
+    /* Check arguments */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
+    if(0 == maxaddr || HADDR_UNDEF == maxaddr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
+    if(ADDR_OVERFLOW(maxaddr))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr")
+
+    /* Build the open flags */
+    o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
+    if(H5F_ACC_TRUNC & flags)
+        o_flags |= O_TRUNC;
+    if(H5F_ACC_CREAT & flags)
+        o_flags |= O_CREAT;
+    if(H5F_ACC_EXCL & flags)
+        o_flags |= O_EXCL;
+
+    /* Open the file */
+    if((fd = HDopen(name, o_flags, 0666)) < 0) {
+        int myerrno = errno;
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', errno = %d, error message = '%s', flags = %x, o_flags = %x", name, myerrno, HDstrerror(myerrno), flags, (unsigned)o_flags);
+    } /* end if */
+
+    if(HDfstat(fd, &sb) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
+
+    /* Create the new file struct */
+    if(NULL == (file = H5FL_CALLOC(H5FD_sec2_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
+
+    file->fd = fd;
+    H5_CHECKED_ASSIGN(file->eof, haddr_t, sb.st_size, h5_stat_size_t);
+    file->pos = HADDR_UNDEF;
+    file->op = OP_UNKNOWN;
+#ifdef H5_HAVE_WIN32_API
+    file->hFile = (HANDLE)_get_osfhandle(fd);
+    if(INVALID_HANDLE_VALUE == file->hFile)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file handle")
+
+    if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file information")
+
+    file->nFileIndexHigh = fileinfo.nFileIndexHigh;
+    file->nFileIndexLow = fileinfo.nFileIndexLow;
+    file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
+#else /* H5_HAVE_WIN32_API */
+    file->device = sb.st_dev;
+    file->inode = sb.st_ino;
+#endif /* H5_HAVE_WIN32_API */
+
+    /* Retain a copy of the name used to open the file, for possible error reporting */
+    HDstrncpy(file->filename, name, sizeof(file->filename));
+    file->filename[sizeof(file->filename) - 1] = '\0';
+
+    /* Check for non-default FAPL */
+    if(H5P_FILE_ACCESS_DEFAULT != fapl_id) {
+        H5P_genplist_t      *plist;      /* Property list pointer */
+
+        /* Get the FAPL */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+            HGOTO_ERROR(H5E_VFL, H5E_BADTYPE, NULL, "not a file access property list")
+
+        /* This step is for h5repart tool only. If user wants to change file driver from
+         * family to sec2 while using h5repart, this private property should be set so that
+         * in the later step, the library can ignore the family driver information saved
+         * in the superblock.
+         */
+        if(H5P_exist_plist(plist, H5F_ACS_FAMILY_TO_SEC2_NAME) > 0)
+            if(H5P_get(plist, H5F_ACS_FAMILY_TO_SEC2_NAME, &file->fam_to_sec2) < 0)
+                HGOTO_ERROR(H5E_VFL, H5E_CANTGET, NULL, "can't get property of changing family to sec2")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (H5FD_t*)file;
+
+done:
+    if(NULL == ret_value) {
+        if(fd >= 0)
+            HDclose(fd);
+        if(file)
+            file = H5FL_FREE(H5FD_sec2_t, file);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_close
+ *
+ * Purpose:     Closes an HDF5 file.
+ *
+ * Return:      Success:    SUCCEED
+ *              Failure:    FAIL, file not closed.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_close(H5FD_t *_file)
+{
+    H5FD_sec2_t *file = (H5FD_sec2_t *)_file;
+    herr_t      ret_value = SUCCEED;                /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(file);
+
+    /* Close the underlying file */
+    if(HDclose(file->fd) < 0)
+        HSYS_GOTO_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+
+    /* Release the file info */
+    file = H5FL_FREE(H5FD_sec2_t, file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_cmp
+ *
+ * Purpose:     Compares two files belonging to this driver using an
+ *              arbitrary (but consistent) ordering.
+ *
+ * Return:      Success:    A value like strcmp()
+ *              Failure:    never fails (arguments were checked by the
+ *                          caller).
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_sec2_t   *f1 = (const H5FD_sec2_t *)_f1;
+    const H5FD_sec2_t   *f2 = (const H5FD_sec2_t *)_f2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef H5_HAVE_WIN32_API
+    if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) HGOTO_DONE(-1)
+    if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) HGOTO_DONE(1)
+
+    if(f1->nFileIndexHigh < f2->nFileIndexHigh) HGOTO_DONE(-1)
+    if(f1->nFileIndexHigh > f2->nFileIndexHigh) HGOTO_DONE(1)
+
+    if(f1->nFileIndexLow < f2->nFileIndexLow) HGOTO_DONE(-1)
+    if(f1->nFileIndexLow > f2->nFileIndexLow) HGOTO_DONE(1)
+#else /* H5_HAVE_WIN32_API */
+#ifdef H5_DEV_T_IS_SCALAR
+    if(f1->device < f2->device) HGOTO_DONE(-1)
+    if(f1->device > f2->device) HGOTO_DONE(1)
+#else /* H5_DEV_T_IS_SCALAR */
+    /* If dev_t isn't a scalar value on this system, just use memcmp to
+     * determine if the values are the same or not.  The actual return value
+     * shouldn't really matter...
+     */
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) < 0) HGOTO_DONE(-1)
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) > 0) HGOTO_DONE(1)
+#endif /* H5_DEV_T_IS_SCALAR */
+    if(f1->inode < f2->inode) HGOTO_DONE(-1)
+    if(f1->inode > f2->inode) HGOTO_DONE(1)
+#endif /* H5_HAVE_WIN32_API */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_query
+ *
+ * Purpose:     Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_query(const H5FD_t *_file, unsigned long *flags /* out */)
+{
+    const H5FD_sec2_t	*file = (const H5FD_sec2_t *)_file;    /* sec2 VFD info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA;     /* OK to aggregate metadata allocations                             */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA;    /* OK to accumulate metadata for faster writes                      */
+        *flags |= H5FD_FEAT_DATA_SIEVE;             /* OK to perform data sieving for faster raw data reads & writes    */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA;    /* OK to aggregate "small" raw data allocations                     */
+        *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE;    /* VFD handle is POSIX I/O call compatible                          */
+
+        /* Check for flags that are set by h5repart */
+        if(file && file->fam_to_sec2)
+            *flags |= H5FD_FEAT_IGNORE_DRVRINFO; /* Ignore the driver info when file is opened (which eliminates it) */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_sec2_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_get_eoa
+ *
+ * Purpose:     Gets the end-of-address marker for the file. The EOA marker
+ *              is the first address past the last byte allocated in the
+ *              format address space.
+ *
+ * Return:      The end-of-address marker.
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, August  2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_sec2_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+{
+    const H5FD_sec2_t	*file = (const H5FD_sec2_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(file->eoa)
+} /* end H5FD_sec2_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_set_eoa
+ *
+ * Purpose:     Set the end-of-address marker for the file. This function is
+ *              called shortly after an existing HDF5 file is opened in order
+ *              to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
+{
+    H5FD_sec2_t	*file = (H5FD_sec2_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    file->eoa = addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_sec2_set_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_get_eof
+ *
+ * Purpose:     Returns the end-of-file marker, which is the greater of
+ *              either the filesystem end-of-file or the HDF5 end-of-address
+ *              markers.
+ *
+ * Return:      End of file address, the first address past the end of the 
+ *              "file", either the filesystem file or the HDF5 file.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_sec2_get_eof(const H5FD_t *_file)
+{
+    const H5FD_sec2_t   *file = (const H5FD_sec2_t *)_file;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+} /* end H5FD_sec2_get_eof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_sec2_get_handle
+ *
+ * Purpose:        Returns the file handle of sec2 file driver.
+ *
+ * Returns:        SUCCEED/FAIL
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_get_handle(H5FD_t *_file, hid_t H5_ATTR_UNUSED fapl, void **file_handle)
+{
+    H5FD_sec2_t         *file = (H5FD_sec2_t *)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(!file_handle)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
+
+    *file_handle = &(file->fd);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_get_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_read
+ *
+ * Purpose:     Reads SIZE bytes of data from FILE beginning at address ADDR
+ *              into buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      Success:    SUCCEED. Result is stored in caller-supplied
+ *                          buffer BUF.
+ *              Failure:    FAIL, Contents of buffer BUF are undefined.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id,
+    haddr_t addr, size_t size, void *buf /*out*/)
+{
+    H5FD_sec2_t     *file       = (H5FD_sec2_t *)_file;
+    herr_t          ret_value   = SUCCEED;                  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr)
+    if(REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr)
+
+    /* Seek to the correct location */
+    if(addr != file->pos || OP_READ != file->op) {
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    } /* end if */
+
+    /* Read data, being careful of interrupted system calls, partial results,
+     * and the end of the file.
+     */
+    while(size > 0) {
+
+        h5_posix_io_t       bytes_in        = 0;    /* # of bytes to read       */
+        h5_posix_io_ret_t   bytes_read      = -1;   /* # of bytes actually read */ 
+
+        /* Trying to read more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_POSIX_MAX_IO_BYTES)
+            bytes_in = H5_POSIX_MAX_IO_BYTES;
+        else
+            bytes_in = (h5_posix_io_t)size;
+
+        do {
+            bytes_read = HDread(file->fd, buf, bytes_in);
+        } while(-1 == bytes_read && EINTR == errno);
+        
+        if(-1 == bytes_read) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
+        } /* end if */
+        
+        if(0 == bytes_read) {
+            /* end of file but not end of format address space */
+            HDmemset(buf, 0, size);
+            break;
+        } /* end if */
+        
+        HDassert(bytes_read >= 0);
+        HDassert((size_t)bytes_read <= size);
+        
+        size -= (size_t)bytes_read;
+        addr += (haddr_t)bytes_read;
+        buf = (char *)buf + bytes_read;
+    } /* end while */
+
+    /* Update current position */
+    file->pos = addr;
+    file->op = OP_READ;
+
+done:
+    if(ret_value < 0) {
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_write
+ *
+ * Purpose:     Writes SIZE bytes of data to FILE beginning at address ADDR
+ *              from buffer BUF according to data transfer properties in
+ *              DXPL_ID.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id,
+                haddr_t addr, size_t size, const void *buf)
+{
+    H5FD_sec2_t     *file       = (H5FD_sec2_t *)_file;
+    herr_t          ret_value   = SUCCEED;                  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file && file->pub.cls);
+    HDassert(buf);
+
+    /* Check for overflow conditions */
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr)
+    if(REGION_OVERFLOW(addr, size))
+        HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size = %llu", (unsigned long long)addr, (unsigned long long)size)
+
+    /* Seek to the correct location */
+    if(addr != file->pos || OP_WRITE != file->op) {
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    } /* end if */
+
+    /* Write the data, being careful of interrupted system calls and partial
+     * results
+     */
+    while(size > 0) {
+
+        h5_posix_io_t       bytes_in        = 0;    /* # of bytes to write  */
+        h5_posix_io_ret_t   bytes_wrote     = -1;   /* # of bytes written   */ 
+
+        /* Trying to write more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_POSIX_MAX_IO_BYTES)
+            bytes_in = H5_POSIX_MAX_IO_BYTES;
+        else
+            bytes_in = (h5_posix_io_t)size;
+
+        do {
+            bytes_wrote = HDwrite(file->fd, buf, bytes_in);
+        } while(-1 == bytes_wrote && EINTR == errno);
+        
+        if(-1 == bytes_wrote) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
+        } /* end if */
+        
+        HDassert(bytes_wrote > 0);
+        HDassert((size_t)bytes_wrote <= size);
+
+        size -= (size_t)bytes_wrote;
+        addr += (haddr_t)bytes_wrote;
+        buf = (const char *)buf + bytes_wrote;
+    } /* end while */
+
+    /* Update current position and eof */
+    file->pos = addr;
+    file->op = OP_WRITE;
+    if(file->pos > file->eof)
+        file->eof = file->pos;
+
+done:
+    if(ret_value < 0) {
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_truncate
+ *
+ * Purpose:     Makes sure that the true file size is the same (or larger)
+ *              than the end-of-address.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing)
+{
+    H5FD_sec2_t *file = (H5FD_sec2_t *)_file;
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Extend the file to make sure it's large enough */
+    if(!H5F_addr_eq(file->eoa, file->eof)) {
+#ifdef H5_HAVE_WIN32_API
+        LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
+        DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
+                                     * Only used as an error code here.
+                                     */
+        DWORD           dwError;    /* DWORD error code from GetLastError() */
+        BOOL            bError;     /* Boolean error flag */
+
+        /* Windows uses this odd QuadPart union for 32/64-bit portability */
+        li.QuadPart = (__int64)file->eoa;
+
+        /* Extend the file to make sure it's large enough.
+         *
+         * Since INVALID_SET_FILE_POINTER can technically be a valid return value
+         * from SetFilePointer(), we also need to check GetLastError().
+         */
+        dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
+        if(INVALID_SET_FILE_POINTER == dwPtrLow) {
+            dwError = GetLastError();
+            if(dwError != NO_ERROR )
+                HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "unable to set file pointer")
+        }
+
+        bError = SetEndOfFile(file->hFile);
+        if(0 == bError)
+            HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#else /* H5_HAVE_WIN32_API */
+        if(-1 == HDftruncate(file->fd, (HDoff_t)file->eoa))
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#endif /* H5_HAVE_WIN32_API */
+
+        /* Update the eof value */
+        file->eof = file->eoa;
+
+        /* Reset last file I/O information */
+        file->pos = HADDR_UNDEF;
+        file->op = OP_UNKNOWN;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_truncate() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDsec2.h b/gatb-core/thirdparty/hdf5/src/H5FDsec2.h
new file mode 100644
index 0000000..b7db0d5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDsec2.h
@@ -0,0 +1,42 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  2, 1999
+ *
+ * Purpose:	The public header file for the sec2 driver.
+ */
+#ifndef H5FDsec2_H
+#define H5FDsec2_H
+
+#include "H5Ipublic.h"
+
+#define H5FD_SEC2	(H5FD_sec2_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5_DLL hid_t H5FD_sec2_init(void);
+H5_DLL void H5FD_sec2_term(void);
+H5_DLL herr_t H5Pset_fapl_sec2(hid_t fapl_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDspace.c b/gatb-core/thirdparty/hdf5/src/H5FDspace.c
new file mode 100644
index 0000000..deb2153
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDspace.c
@@ -0,0 +1,462 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FDspace.c
+ *			Jan  3 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Space allocation routines for the file.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FD_space_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5FDpkg.h"		/* File Drivers				*/
+#include "H5FDmulti.h"		/* Usage-partitioned file family	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Define this to display information about file allocations */
+/* #define H5FD_ALLOC_DEBUG */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FD_free_t struct */
+H5FL_DEFINE(H5FD_free_t);
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FD_space_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FD_space_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5FD_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FD_space_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5FD_init())
+} /* H5FD_space_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_extend
+ *
+ * Purpose:     Extend the EOA space of a file.
+ *
+ * NOTE:        Returns absolute file offset
+ *
+ * Return:      Success:    The address of the previous EOA.
+ *              Failure:    The undefined address HADDR_UNDEF
+ *
+ * Programmer:  Bill Wendling
+ *              Wednesday, 04. December, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_extend(H5FD_t *file, H5FD_mem_t type, hbool_t new_block, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size)
+{
+    hsize_t orig_size = size;   /* Original allocation size */
+    haddr_t eoa;                /* Address of end-of-allocated space */
+    hsize_t extra;        	/* Extra space to allocate, to align request */
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Get current end-of-allocated space address */
+    eoa = file->cls->get_eoa(file, type);
+
+    /* Compute extra space to allocate, if this is a new block and should be aligned */
+    extra = 0;
+    if(new_block && file->alignment > 1 && orig_size >= file->threshold) {
+        hsize_t mis_align;              /* Amount EOA is misaligned */
+
+        /* Check for EOA already aligned */
+        if((mis_align = (eoa % file->alignment)) > 0) {
+            extra = file->alignment - mis_align;
+	    if(frag_addr)
+                *frag_addr = eoa - file->base_addr;     /* adjust for file's base address */
+	    if(frag_size)
+                *frag_size = extra;
+	} /* end if */
+    } /* end if */
+
+    /* Add in extra allocation amount */
+    size += extra;
+
+    /* Check for overflow when extending */
+    if(H5F_addr_overflow(eoa, size) || (eoa + size) > file->maxaddr)
+        HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
+
+    /* Set the [possibly aligned] address to return */
+    ret_value = eoa + extra;
+
+    /* Extend the end-of-allocated space address */
+    eoa += size;
+    if(file->cls->set_eoa(file, type, eoa) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
+
+    /* Post-condition sanity check */
+    if(new_block && file->alignment && orig_size >= file->threshold)
+	HDassert(!(ret_value % file->alignment));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_extend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_alloc_real
+ *
+ * Purpose:     Allocate space in the file with the VFD
+ *
+ * Return:      Success:    The format address of the new file memory.
+ *              Failure:    The undefined address HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_alloc_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size)
+{
+    haddr_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size);
+#endif /* H5FD_ALLOC_DEBUG */
+
+    /* check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Dispatch to driver `alloc' callback or extend the end-of-address marker */
+    if(file->cls->alloc) {
+        if((ret_value = (file->cls->alloc)(file, type, dxpl_id, size)) == HADDR_UNDEF)
+            HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver allocation request failed")
+    } /* end if */
+    else {
+        if((ret_value = H5FD_extend(file, type, TRUE, size, frag_addr, frag_size)) == HADDR_UNDEF)
+            HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver eoa update request failed")
+    } /* end else */
+
+    /* Convert absolute file offset to relative address */
+    ret_value -= file->base_addr;
+
+done:
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value);
+#endif /* H5FD_ALLOC_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_alloc_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_alloc
+ *
+ * Purpose:     Wrapper for H5FD_alloc, to make certain EOA changes are
+ *		reflected in superblock.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:      Success:    The format address of the new file memory.
+ *              Failure:    The undefined address HADDR_UNDEF
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, hsize_t size,
+    haddr_t *frag_addr, hsize_t *frag_size)
+{
+    haddr_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    /* check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Call the real 'alloc' routine */
+    ret_value = H5FD_alloc_real(file, dxpl_id, type, size, frag_addr, frag_size);
+    if(!H5F_addr_defined(ret_value))
+        HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "real 'alloc' request failed")
+
+    /* Mark superblock dirty in cache, so change to EOA will get encoded */
+    if(H5F_super_dirty(f) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, HADDR_UNDEF, "unable to mark superblock as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_free_real
+ *
+ * Purpose:     Release space back to the VFD
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_free_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr, hsize_t size)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, addr, size);
+#endif /* H5FD_ALLOC_DEBUG */
+
+    /* Sanity checking */
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "invalid file offset")
+
+    /* Convert address to absolute file offset */
+    addr += file->base_addr;
+
+    /* More sanity checking */
+    if(addr > file->maxaddr || H5F_addr_overflow(addr, size) || (addr + size) > file->maxaddr)
+        HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "invalid file free space region to free")
+
+    /* Check for file driver 'free' callback and call it if available */
+    if(file->cls->free) {
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Letting VFD free space\n", FUNC);
+#endif /* H5FD_ALLOC_DEBUG */
+        if((file->cls->free)(file, type, dxpl_id, addr, size) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "driver free request failed")
+    } /* end if */
+    /* Check if this free block is at the end of file allocated space.
+     * Truncate it if this is true.
+     */
+    else if(file->cls->get_eoa) {
+        haddr_t     eoa;
+
+        eoa = file->cls->get_eoa(file, type);
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: eoa = %a\n", FUNC, eoa);
+#endif /* H5FD_ALLOC_DEBUG */
+        if(eoa == (addr + size)) {
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Reducing file size to = %a\n", FUNC, addr);
+#endif /* H5FD_ALLOC_DEBUG */
+            if(file->cls->set_eoa(file, type, addr) < 0)
+                HGOTO_ERROR(H5E_VFL, H5E_CANTSET, FAIL, "set end of space allocation request failed")
+        } /* end if */
+    } /* end else-if */
+    else {
+        /* leak memory */
+#ifdef H5FD_ALLOC_DEBUG
+HDfprintf(stderr, "%s: LEAKED MEMORY!!! type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, addr, size);
+#endif /* H5FD_ALLOC_DEBUG */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_free_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_free
+ *
+ * Purpose:     Wrapper for H5FD_free_real, to make certain EOA changes are
+ *		reflected in superblock.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, haddr_t addr,
+    hsize_t size)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Call the real 'free' routine */
+    if(H5FD_free_real(file, dxpl_id, type, addr, size) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "real 'free' request failed")
+
+    /* Mark superblock dirty in cache, so change to EOA will get encoded */
+    if(H5F_super_dirty(f) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_try_extend
+ *
+ * Purpose:	Extend a block at the end of the file, if possible.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:	Success:	TRUE(1)  - Block was extended
+ *                              FALSE(0) - Block could not be extended
+ * 		Failure:	FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, 17. January, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end,
+    hsize_t extra_requested)
+{
+    haddr_t eoa;                /* End of allocated space in file */
+    htri_t ret_value = FALSE;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(file);
+    HDassert(file->cls);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(extra_requested > 0);
+    HDassert(f);
+
+    /* Retrieve the end of the address space */
+    if(HADDR_UNDEF == (eoa = file->cls->get_eoa(file, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* Adjust block end by base address of the file, to create absolute address */
+    blk_end += file->base_addr;
+
+    /* Check if the block is exactly at the end of the file */
+    if(H5F_addr_eq(blk_end, eoa)) {
+        /* Extend the object by extending the underlying file */
+        if(HADDR_UNDEF == H5FD_extend(file, type, FALSE, extra_requested, NULL, NULL))
+            HGOTO_ERROR(H5E_VFL, H5E_CANTEXTEND, FAIL, "driver extend request failed")
+
+        /* Mark superblock dirty in cache, so change to EOA will get encoded */
+        if(H5F_super_dirty(f) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+        /* Indicate success */
+        HGOTO_DONE(TRUE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_try_extend() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDstdio.c b/gatb-core/thirdparty/hdf5/src/H5FDstdio.c
new file mode 100644
index 0000000..8efaf43
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDstdio.c
@@ -0,0 +1,1079 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Wednesday, October 22, 1997
+ *
+ * Purpose: The C STDIO virtual file driver which only uses calls from stdio.h.
+ *          This also serves as an example of coding a simple file driver,
+ *          therefore, it should not use any non-public definitions.
+ *
+ * NOTE:    This driver is not as well tested as the standard SEC2 driver
+ *          and is not intended for production use!
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "hdf5.h"
+
+#ifdef H5_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef H5_HAVE_WIN32_API
+/* The following two defines must be before any windows headers are included */
+#define WIN32_LEAN_AND_MEAN    /* Exclude rarely-used stuff from Windows headers */
+#define NOGDI                  /* Exclude Graphic Display Interface macros */
+
+#include <windows.h>
+#include <io.h>
+
+/* This is not defined in the Windows header files */
+#ifndef F_OK
+#define F_OK 00
+#endif
+
+#endif
+
+#ifdef MAX
+#undef MAX
+#endif /* MAX */
+#define MAX(X,Y)  ((X)>(Y)?(X):(Y))
+
+/* The driver identification number, initialized at runtime */
+static hid_t H5FD_STDIO_g = 0;
+
+/* The maximum number of bytes which can be written in a single I/O operation */
+static size_t H5_STDIO_MAX_IO_BYTES_g = (size_t)-1;
+
+/* File operations */
+typedef enum {
+    H5FD_STDIO_OP_UNKNOWN=0,
+    H5FD_STDIO_OP_READ=1,
+    H5FD_STDIO_OP_WRITE=2,
+    H5FD_STDIO_OP_SEEK=3
+} H5FD_stdio_file_op;
+
+/* The description of a file belonging to this driver. The 'eoa' and 'eof'
+ * determine the amount of hdf5 address space in use and the high-water mark
+ * of the file (the current size of the underlying Unix file). The 'pos'
+ * value is used to eliminate file position updates when they would be a
+ * no-op. Unfortunately we've found systems that use separate file position
+ * indicators for reading and writing so the lseek can only be eliminated if
+ * the current operation is the same as the previous operation.  When opening
+ * a file the 'eof' will be set to the current file size, 'eoa' will be set
+ * to zero, 'pos' will be set to H5F_ADDR_UNDEF (as it is when an error
+ * occurs), and 'op' will be set to H5F_OP_UNKNOWN.
+ */
+typedef struct H5FD_stdio_t {
+    H5FD_t      pub;            /* public stuff, must be first      */
+    FILE        *fp;            /* the file handle                  */
+    int         fd;             /* file descriptor (for truncate)   */
+    haddr_t     eoa;            /* end of allocated region          */
+    haddr_t     eof;            /* end of file; current file size   */
+    haddr_t     pos;            /* current file I/O position        */
+    unsigned    write_access;   /* Flag to indicate the file was opened with write access */
+    H5FD_stdio_file_op op;  /* last operation */
+#ifndef H5_HAVE_WIN32_API
+    /* On most systems the combination of device and i-node number uniquely
+     * identify a file.  Note that Cygwin, MinGW and other Windows POSIX
+     * environments have the stat function (which fakes inodes)
+     * and will use the 'device + inodes' scheme as opposed to the
+     * Windows code further below.
+     */
+    dev_t           device;     /* file device number   */
+    ino_t           inode;      /* file i-node number   */
+#else
+    /* Files in windows are uniquely identified by the volume serial
+     * number and the file index (both low and high parts).
+     *
+     * There are caveats where these numbers can change, especially
+     * on FAT file systems.  On NTFS, however, a file should keep
+     * those numbers the same until renamed or deleted (though you
+     * can use ReplaceFile() on NTFS to keep the numbers the same
+     * while renaming).
+     *
+     * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
+     * more information.
+     *
+     * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
+     */
+    DWORD           nFileIndexLow;
+    DWORD           nFileIndexHigh;
+    DWORD           dwVolumeSerialNumber;
+    
+    HANDLE          hFile;      /* Native windows file handle */
+#endif  /* H5_HAVE_WIN32_API */
+} H5FD_stdio_t;
+
+/* Use similar structure as in H5private.h by defining Windows stuff first. */
+#ifdef H5_HAVE_WIN32_API
+#ifndef H5_HAVE_MINGW
+    #define file_fseek      _fseeki64
+    #define file_offset_t   __int64
+    #define file_ftruncate  _chsize_s   /* Supported in VS 2005 or newer */
+    #define file_ftell      _ftelli64
+#endif /* H5_HAVE_MINGW */
+#endif /* H5_HAVE_WIN32_API */
+
+/* If these functions weren't re-defined for Windows, give them
+ * more platform-independent names.
+ */
+#ifndef file_fseek
+    #define file_fseek      fseeko
+    #define file_offset_t   off_t
+    #define file_ftruncate  ftruncate
+    #define file_ftell      ftello
+#endif /* file_fseek */
+
+/* These macros check for overflow of various quantities.  These macros
+ * assume that file_offset_t is signed and haddr_t and size_t are unsigned.
+ *
+ * ADDR_OVERFLOW:  Checks whether a file address of type `haddr_t'
+ *      is too large to be represented by the second argument
+ *      of the file seek function.
+ *
+ * SIZE_OVERFLOW:  Checks whether a buffer size of type `hsize_t' is too
+ *      large to be represented by the `size_t' type.
+ *
+ * REGION_OVERFLOW:  Checks whether an address and size pair describe data
+ *      which can be addressed entirely by the second
+ *      argument of the file seek function.
+ */
+/* adding for windows NT filesystem support. */
+#define MAXADDR (((haddr_t)1<<(8*sizeof(file_offset_t)-1))-1)
+#define ADDR_OVERFLOW(A)  (HADDR_UNDEF==(A) || ((A) & ~(haddr_t)MAXADDR))
+#define SIZE_OVERFLOW(Z)  ((Z) & ~(hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)  (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || \
+    HADDR_UNDEF==(A)+(Z) || (file_offset_t)((A)+(Z))<(file_offset_t)(A))
+
+/* Prototypes */
+static H5FD_t *H5FD_stdio_open(const char *name, unsigned flags,
+                 hid_t fapl_id, haddr_t maxaddr);
+static herr_t H5FD_stdio_close(H5FD_t *lf);
+static int H5FD_stdio_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD_stdio_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+static haddr_t H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD_stdio_get_eof(const H5FD_t *_file);
+static herr_t  H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD_stdio_read(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+                size_t size, void *buf);
+static herr_t H5FD_stdio_write(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+                size_t size, const void *buf);
+static herr_t H5FD_stdio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_stdio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+
+static const H5FD_class_t H5FD_stdio_g = {
+    "stdio",                    /* name         */
+    MAXADDR,                    /* maxaddr      */
+    H5F_CLOSE_WEAK,             /* fc_degree    */
+    NULL,                       /* sb_size      */
+    NULL,                       /* sb_encode    */
+    NULL,                       /* sb_decode    */
+    0,                          /* fapl_size    */
+    NULL,                       /* fapl_get     */
+    NULL,                       /* fapl_copy    */
+    NULL,                       /* fapl_free    */
+    0,                          /* dxpl_size    */
+    NULL,                       /* dxpl_copy    */
+    NULL,                       /* dxpl_free    */
+    H5FD_stdio_open,            /* open         */
+    H5FD_stdio_close,           /* close        */
+    H5FD_stdio_cmp,             /* cmp          */
+    H5FD_stdio_query,           /* query        */
+    NULL,                       /* get_type_map */
+    H5FD_stdio_alloc,           /* alloc        */
+    NULL,                       /* free         */
+    H5FD_stdio_get_eoa,         /* get_eoa      */
+    H5FD_stdio_set_eoa,         /* set_eoa      */
+    H5FD_stdio_get_eof,         /* get_eof      */
+    H5FD_stdio_get_handle,      /* get_handle   */
+    H5FD_stdio_read,            /* read         */
+    H5FD_stdio_write,           /* write        */
+    H5FD_stdio_flush,           /* flush        */
+    H5FD_stdio_truncate,        /* truncate     */
+    NULL,                       /* lock         */
+    NULL,                       /* unlock       */
+    H5FD_FLMAP_DICHOTOMY	/* fl_map       */
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_init
+ *
+ * Purpose:  Initialize this driver by registering the driver with the
+ *    library.
+ *
+ * Return:  Success:  The driver ID for the stdio driver.
+ *
+ *    Failure:  Negative.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5FD_stdio_init(void)
+{
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    if (H5I_VFL!=H5Iget_type(H5FD_STDIO_g))
+        H5FD_STDIO_g = H5FDregister(&H5FD_stdio_g);
+    return H5FD_STDIO_g;
+} /* end H5FD_stdio_init() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:  H5FD_stdio_term
+ *
+ * Purpose:  Shut down the VFD
+ *
+ * Returns:     None
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, Jan 30, 2004
+ *
+ *---------------------------------------------------------------------------
+ */
+void
+H5FD_stdio_term(void)
+{
+    /* Reset VFL ID */
+    H5FD_STDIO_g = 0;
+
+    return;
+} /* end H5FD_stdio_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5Pset_fapl_stdio
+ *
+ * Purpose:  Modify the file access property list to use the H5FD_STDIO
+ *    driver defined in this source file.  There are no driver
+ *    specific properties.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *    Thursday, February 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_stdio(hid_t fapl_id)
+{
+    static const char *func = "H5FDset_fapl_stdio";  /*for error reporting*/
+
+    /*NO TRACE*/
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    if(0 == H5Pisa_class(fapl_id, H5P_FILE_ACCESS))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not a file access property list", -1)
+
+    return H5Pset_driver(fapl_id, H5FD_STDIO, NULL);
+} /* end H5Pset_fapl_stdio() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_open
+ *
+ * Purpose:  Create and/or opens a Standard C file as an HDF5 file.
+ *
+ * Errors:
+ *  IO  CANTOPENFILE    File doesn't exist and CREAT wasn't
+ *                      specified.
+ *  IO  CANTOPENFILE    fopen() failed.
+ *  IO  FILEEXISTS      File exists but CREAT and EXCL were
+ *                      specified.
+ *
+ * Return:
+ *      Success:    A pointer to a new file data structure. The
+ *                  public fields will be initialized by the
+ *                  caller, which is always H5FD_open().
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, October 22, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FD_t *
+H5FD_stdio_open( const char *name, unsigned flags, hid_t fapl_id,
+    haddr_t maxaddr)
+{
+    FILE                *f = NULL;
+    unsigned            write_access = 0;           /* File opened with write access? */
+    H5FD_stdio_t        *file = NULL;
+    static const char   *func = "H5FD_stdio_open";  /* Function Name for error reporting */
+#ifdef H5_HAVE_WIN32_API
+    struct _BY_HANDLE_FILE_INFORMATION fileinfo;
+#else /* H5_HAVE_WIN32_API */
+    struct stat         sb;
+#endif  /* H5_HAVE_WIN32_API */
+
+    /* Sanity check on file offsets */
+    assert(sizeof(file_offset_t) >= sizeof(size_t));
+
+    /* Quiet compiler */
+    fapl_id = fapl_id;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Check arguments */
+    if (!name || !*name)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL)
+    if (0 == maxaddr || HADDR_UNDEF == maxaddr)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL)
+    if (ADDR_OVERFLOW(maxaddr))
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_OVERFLOW, "maxaddr too large", NULL)
+
+    /* Tentatively open file in read-only mode, to check for existence */
+    if(flags & H5F_ACC_RDWR)
+        f = fopen(name, "rb+");
+    else
+        f = fopen(name, "rb");
+
+    if(!f) {
+        /* File doesn't exist */
+        if(flags & H5F_ACC_CREAT) {
+            assert(flags & H5F_ACC_RDWR);
+            f = fopen(name, "wb+");
+            write_access = 1;     /* Note the write access */
+        }
+        else
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, "file doesn't exist and CREAT wasn't specified", NULL)
+    } else if(flags & H5F_ACC_EXCL) {
+        /* File exists, but EXCL is passed.  Fail. */
+        assert(flags & H5F_ACC_CREAT);
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FILEEXISTS, "file exists but CREAT and EXCL were specified", NULL)
+    } else if(flags & H5F_ACC_RDWR) {
+        if(flags & H5F_ACC_TRUNC)
+            f = freopen(name, "wb+", f);
+        write_access = 1;     /* Note the write access */
+    } /* end if */
+    /* Note there is no need to reopen if neither TRUNC nor EXCL are specified,
+     * as the tentative open will work */
+
+    if(!f)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, "fopen failed", NULL)
+
+    /* Build the return value */
+    if(NULL == (file = (H5FD_stdio_t *)calloc((size_t)1, sizeof(H5FD_stdio_t)))) {
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL)
+    } /* end if */
+    file->fp = f;
+    file->op = H5FD_STDIO_OP_SEEK;
+    file->pos = HADDR_UNDEF;
+    file->write_access = write_access;    /* Note the write_access for later */
+    if(file_fseek(file->fp, (file_offset_t)0, SEEK_END) < 0) {
+        file->op = H5FD_STDIO_OP_UNKNOWN;
+    } else {
+        file_offset_t x = file_ftell(file->fp);
+        assert (x >= 0);
+        file->eof = (haddr_t)x;
+    }
+
+    /* Get the file descriptor (needed for truncate and some Windows information) */
+#ifdef H5_HAVE_WIN32_API
+    file->fd = _fileno(file->fp);
+#else /* H5_HAVE_WIN32_API */
+    file->fd = fileno(file->fp);
+#endif /* H5_HAVE_WIN32_API */
+    if(file->fd < 0) {
+        free(file);
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get file descriptor", NULL);
+    } /* end if */
+
+
+#ifdef H5_HAVE_WIN32_API
+    file->hFile = (HANDLE)_get_osfhandle(file->fd);
+    if(INVALID_HANDLE_VALUE == file->hFile) {
+        free(file);
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get Windows file handle", NULL);
+    } /* end if */
+
+    if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo)) {
+        free(file);
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get Windows file descriptor information", NULL);
+    } /* end if */
+
+    file->nFileIndexHigh = fileinfo.nFileIndexHigh;
+    file->nFileIndexLow = fileinfo.nFileIndexLow;
+    file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
+#else /* H5_HAVE_WIN32_API */
+    if(fstat(file->fd, &sb) < 0) {
+        free(file);
+        fclose(f);
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADFILE, "unable to fstat file", NULL)
+    } /* end if */
+    file->device = sb.st_dev;
+    file->inode = sb.st_ino;
+#endif /* H5_HAVE_WIN32_API */
+
+    return (H5FD_t*)file;
+} /* end H5FD_stdio_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5F_stdio_close
+ *
+ * Purpose:  Closes a file.
+ *
+ * Errors:
+ *    IO    CLOSEERROR  Fclose failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, October 22, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_close(H5FD_t *_file)
+{
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_close";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    if (fclose(file->fp) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CLOSEERROR, "fclose failed", -1)
+
+    free(file);
+
+    return 0;
+} /* end H5FD_stdio_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_cmp
+ *
+ * Purpose:  Compares two files belonging to this driver using an
+ *    arbitrary (but consistent) ordering.
+ *
+ * Return:
+ *      Success:    A value like strcmp()
+ *
+ *      Failure:    never fails (arguments were checked by the caller).
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FD_stdio_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+{
+    const H5FD_stdio_t  *f1 = (const H5FD_stdio_t*)_f1;
+    const H5FD_stdio_t  *f2 = (const H5FD_stdio_t*)_f2;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+#ifdef H5_HAVE_WIN32_API
+    if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) return -1;
+    if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) return 1;
+
+    if(f1->nFileIndexHigh < f2->nFileIndexHigh) return -1;
+    if(f1->nFileIndexHigh > f2->nFileIndexHigh) return 1;
+
+    if(f1->nFileIndexLow < f2->nFileIndexLow) return -1;
+    if(f1->nFileIndexLow > f2->nFileIndexLow) return 1;
+#else /* H5_HAVE_WIN32_API */
+#ifdef H5_DEV_T_IS_SCALAR
+    if(f1->device < f2->device) return -1;
+    if(f1->device > f2->device) return 1;
+#else /* H5_DEV_T_IS_SCALAR */
+    /* If dev_t isn't a scalar value on this system, just use memcmp to
+     * determine if the values are the same or not.  The actual return value
+     * shouldn't really matter...
+     */
+    if(memcmp(&(f1->device),&(f2->device),sizeof(dev_t)) < 0) return -1;
+    if(memcmp(&(f1->device),&(f2->device),sizeof(dev_t)) > 0) return 1;
+#endif /* H5_DEV_T_IS_SCALAR */
+    if(f1->inode < f2->inode) return -1;
+    if(f1->inode > f2->inode) return 1;
+#endif /* H5_HAVE_WIN32_API */
+
+    return 0;
+} /* H5FD_stdio_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_query
+ *
+ * Purpose:  Set the flags that this VFL driver is capable of supporting.
+ *              (listed in H5FDpublic.h)
+ *
+ * Return:  Success:  non-negative
+ *
+ *    Failure:  negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_query(const H5FD_t *_f, unsigned long *flags /* out */)
+{
+    /* Quiet the compiler */
+    _f=_f;
+
+    /* Set the VFL feature flags that this driver supports */
+    if(flags) {
+        *flags = 0;
+        *flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
+        *flags|=H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
+        *flags|=H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
+        *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+    }
+
+    return 0;
+} /* end H5FD_stdio_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_alloc
+ *
+ * Purpose:     Allocates file memory. If fseeko isn't available, makes
+ *              sure the file size isn't bigger than 2GB because the
+ *              parameter OFFSET of fseek is of the type LONG INT, limiting
+ *              the file size to 2GB.
+ *
+ * Return:
+ *      Success:    Address of new memory
+ *
+ *      Failure:    HADDR_UNDEF
+ *
+ * Programmer:  Raymond Lu
+ *              30 March 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, hid_t /*H5_ATTR_UNUSED*/ dxpl_id, hsize_t size)
+{
+    H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
+    haddr_t         addr;
+
+    /* Quiet compiler */
+    type = type;
+    dxpl_id = dxpl_id;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Compute the address for the block to allocate */
+    addr = file->eoa;
+
+    /* Check if we need to align this block */
+    if(size >= file->pub.threshold) {
+        /* Check for an already aligned block */
+        if((addr % file->pub.alignment) != 0)
+            addr = ((addr / file->pub.alignment) + 1) * file->pub.alignment;
+    } /* end if */
+
+    file->eoa = addr + size;
+
+    return addr;
+} /* end H5FD_stdio_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_get_eoa
+ *
+ * Purpose:  Gets the end-of-address marker for the file. The EOA marker
+ *           is the first address past the last byte allocated in the
+ *           format address space.
+ *
+ * Return:  Success:  The end-of-address marker.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, August  2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type)
+{
+    const H5FD_stdio_t *file = (const H5FD_stdio_t *)_file;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Quiet compiler */
+    type = type;
+
+    return file->eoa;
+} /* end H5FD_stdio_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_set_eoa
+ *
+ * Purpose:  Set the end-of-address marker for the file. This function is
+ *    called shortly after an existing HDF5 file is opened in order
+ *    to tell the driver where the end of the HDF5 data is located.
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  Does not fail
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, haddr_t addr)
+{
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Quiet the compiler */
+    type = type;
+
+    file->eoa = addr;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_get_eof
+ *
+ * Purpose:  Returns the end-of-file marker, which is the greater of
+ *    either the Unix end-of-file or the HDF5 end-of-address
+ *    markers.
+ *
+ * Return:  Success:  End of file address, the first address past
+ *        the end of the "file", either the Unix file
+ *        or the HDF5 file.
+ *
+ *    Failure:  HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5FD_stdio_get_eof(const H5FD_t *_file)
+{
+    const H5FD_stdio_t  *file = (const H5FD_stdio_t *)_file;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    return MAX(file->eof, file->eoa);
+} /* end H5FD_stdio_get_eof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5FD_stdio_get_handle
+ *
+ * Purpose:        Returns the file handle of stdio file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     Raymond Lu
+ *                 Sept. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+{
+    H5FD_stdio_t       *file = (H5FD_stdio_t *)_file;
+    static const char  *func = "H5FD_stdio_get_handle";  /* Function Name for error reporting */
+
+    /* Quiet the compiler */
+    fapl = fapl;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    *file_handle = &(file->fp);
+    if(*file_handle == NULL)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "get handle failed", -1)
+
+    return 0;
+} /* end H5FD_stdio_get_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_read
+ *
+ * Purpose:  Reads SIZE bytes beginning at address ADDR in file LF and
+ *    places them in buffer BUF.  Reading past the logical or
+ *    physical end of file returns zeros instead of failing.
+ *
+ * Errors:
+ *    IO    READERROR  fread failed.
+ *    IO    SEEKERROR  fseek failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, October 22, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
+    void *buf/*out*/)
+{
+    H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_read";  /* Function Name for error reporting */
+
+    /* Quiet the compiler */
+    type = type;
+    dxpl_id = dxpl_id;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Check for overflow */
+    if (HADDR_UNDEF==addr)
+        H5Epush_ret (func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1)
+    if (REGION_OVERFLOW(addr, size))
+        H5Epush_ret (func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1)
+
+    /* Check easy cases */
+    if (0 == size)
+        return 0;
+    if ((haddr_t)addr >= file->eof) {
+        memset(buf, 0, size);
+        return 0;
+    }
+
+    /* Seek to the correct file position. */
+    if (!(file->op == H5FD_STDIO_OP_READ || file->op == H5FD_STDIO_OP_SEEK) ||
+            file->pos != addr) {
+        if (file_fseek(file->fp, (file_offset_t)addr, SEEK_SET) < 0) {
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+            file->pos = HADDR_UNDEF;
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1)
+        }
+        file->pos = addr;
+    }
+
+    /* Read zeros past the logical end of file (physical is handled below) */
+    if (addr + size > file->eof) {
+        size_t nbytes = (size_t) (addr + size - file->eof);
+        memset((unsigned char *)buf + size - nbytes, 0, nbytes);
+        size -= nbytes;
+    }
+
+    /* Read the data.  Since we're reading single-byte values, a partial read
+     * will advance the file position by N.  If N is zero or an error
+     * occurs then the file position is undefined.
+     */
+    while(size > 0) {
+
+        size_t bytes_in        = 0;    /* # of bytes to read       */
+        size_t bytes_read      = 0;    /* # of bytes actually read */
+        size_t item_size       = 1;    /* size of items in bytes */
+
+        if(size > H5_STDIO_MAX_IO_BYTES_g)
+            bytes_in = H5_STDIO_MAX_IO_BYTES_g;
+        else
+            bytes_in = size;
+
+        bytes_read = fread(buf, item_size, bytes_in, file->fp);
+
+        if(0 == bytes_read && ferror(file->fp)) { /* error */
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+            file->pos = HADDR_UNDEF;
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_READERROR, "fread failed", -1)
+        } /* end if */
+        
+        if(0 == bytes_read && feof(file->fp)) {
+            /* end of file but not end of format address space */
+            memset((unsigned char *)buf, 0, size);
+            break;
+        } /* end if */
+        
+        size -= bytes_read;
+        addr += (haddr_t)bytes_read;
+        buf = (char *)buf + bytes_read;
+    } /* end while */
+
+    /* Update the file position data. */
+    file->op = H5FD_STDIO_OP_READ;
+    file->pos = addr;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_write
+ *
+ * Purpose:  Writes SIZE bytes from the beginning of BUF into file LF at
+ *    file address ADDR.
+ *
+ * Errors:
+ *    IO    SEEKERROR   fseek failed.
+ *    IO    WRITEERROR  fwrite failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, October 22, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+    size_t size, const void *buf)
+{
+    H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_write";  /* Function Name for error reporting */
+
+    /* Quiet the compiler */
+    dxpl_id = dxpl_id;
+    type = type;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Check for overflow conditions */
+    if (HADDR_UNDEF == addr)
+        H5Epush_ret (func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1)
+    if (REGION_OVERFLOW(addr, size))
+        H5Epush_ret (func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1)
+
+    /* Seek to the correct file position. */
+    if ((file->op != H5FD_STDIO_OP_WRITE && file->op != H5FD_STDIO_OP_SEEK) ||
+                file->pos != addr) {
+        if (file_fseek(file->fp, (file_offset_t)addr, SEEK_SET) < 0) {
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+            file->pos = HADDR_UNDEF;
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1)
+        }
+        file->pos = addr;
+    }
+
+    /* Write the buffer.  On successful return, the file position will be
+     * advanced by the number of bytes read.  On failure, the file position is
+     * undefined.
+     */
+    while(size > 0) {
+
+        size_t bytes_in        = 0;    /* # of bytes to write  */
+        size_t bytes_wrote     = 0;    /* # of bytes written   */
+        size_t item_size       = 1;    /* size of items in bytes */
+
+        if(size > H5_STDIO_MAX_IO_BYTES_g)
+            bytes_in = H5_STDIO_MAX_IO_BYTES_g;
+        else
+            bytes_in = size;
+
+        bytes_wrote = fwrite(buf, item_size, bytes_in, file->fp);
+
+        if(bytes_wrote != bytes_in || (0 == bytes_wrote && ferror(file->fp))) { /* error */
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+            file->pos = HADDR_UNDEF;
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fwrite failed", -1)
+        } /* end if */
+        
+        assert(bytes_wrote > 0);
+        assert((size_t)bytes_wrote <= size);
+
+        size -= bytes_wrote;
+        addr += (haddr_t)bytes_wrote;
+        buf = (const char *)buf + bytes_wrote;
+    }
+
+    /* Update seek optimizing data. */
+    file->op = H5FD_STDIO_OP_WRITE;
+    file->pos = addr;
+
+    /* Update EOF if necessary */
+    if (file->pos > file->eof)
+        file->eof = file->pos;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_flush
+ *
+ * Purpose:  Makes sure that all data is on disk.
+ *
+ * Errors:
+ *    IO    SEEKERROR     fseek failed.
+ *    IO    WRITEERROR    fflush or fwrite failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, October 22, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+{
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_flush";  /* Function Name for error reporting */
+
+    /* Quiet the compiler */
+    dxpl_id = dxpl_id;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Only try to flush the file if we have write access */
+    if(file->write_access) {
+        if(!closing) {
+            if(fflush(file->fp) < 0)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1)
+
+            /* Reset last file I/O information */
+            file->pos = HADDR_UNDEF;
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+        } /* end if */
+    } /* end if */
+
+    return 0;
+} /* end H5FD_stdio_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5FD_stdio_truncate
+ *
+ * Purpose:  Makes sure that the true file size is the same (or larger)
+ *    than the end-of-address.
+ *
+ * Errors:
+ *    IO    SEEKERROR     fseek failed.
+ *    IO    WRITEERROR    fflush or fwrite failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *    Thursday, January 31, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
+{
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_truncate";  /* Function Name for error reporting */
+
+    /* Quiet the compiler */
+    dxpl_id = dxpl_id;
+    closing = closing;
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Only try to flush the file if we have write access */
+    if(file->write_access) {
+        /* Makes sure that the true file size is the same as the end-of-address. */
+        if(file->eoa != file->eof) {
+
+#ifdef H5_HAVE_WIN32_API
+            LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
+            DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
+                                         * Only used as an error code here.
+                                         */
+            DWORD           dwError;    /* DWORD error code from GetLastError() */
+            BOOL            bError;     /* Boolean error flag */
+
+            /* Reset seek offset to beginning of file, so that file isn't re-extended later */
+            rewind(file->fp);
+
+            /* Windows uses this odd QuadPart union for 32/64-bit portability */
+            li.QuadPart = (__int64)file->eoa;
+
+            /* Extend the file to make sure it's large enough.
+             *
+             * Since INVALID_SET_FILE_POINTER can technically be a valid return value
+             * from SetFilePointer(), we also need to check GetLastError().
+             */
+            dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
+            if(INVALID_SET_FILE_POINTER == dwPtrLow) {
+                dwError = GetLastError();
+                if(dwError != NO_ERROR )
+                    H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_FILEOPEN, "unable to set file pointer", -1)
+            }
+            
+            bError = SetEndOfFile(file->hFile);
+            if(0 == bError)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "unable to truncate/extend file properly", -1)
+#else /* H5_HAVE_WIN32_API */
+            /* Reset seek offset to beginning of file, so that file isn't re-extended later */
+            rewind(file->fp);
+
+            /* Truncate file to proper length */
+            if(-1 == file_ftruncate(file->fd, (file_offset_t)file->eoa))
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "unable to truncate/extend file properly", -1)
+#endif /* H5_HAVE_WIN32_API */
+
+            /* Update the eof value */
+            file->eof = file->eoa;
+
+            /* Reset last file I/O information */
+            file->pos = HADDR_UNDEF;
+            file->op = H5FD_STDIO_OP_UNKNOWN;
+        } /* end if */
+    } /* end if */
+    else {
+        /* Double-check for problems */
+        if(file->eoa > file->eof)
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_TRUNCATED, "eoa > eof!", -1)
+    } /* end else */
+
+    return 0;
+} /* end H5FD_stdio_truncate() */
+
+

+#ifdef _H5private_H
+/*
+ * This is not related to the functionality of the driver code.
+ * It is added here to trigger warning if HDF5 private definitions are included
+ * by mistake.  The code should use only HDF5 public API and definitions.
+ */
+#error "Do not use HDF5 private definitions"
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDstdio.h b/gatb-core/thirdparty/hdf5/src/H5FDstdio.h
new file mode 100644
index 0000000..80443d8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDstdio.h
@@ -0,0 +1,41 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, August  2, 1999
+ *
+ * Purpose:	The public header file for the sec2 driver.
+ */
+#ifndef H5FDstdio_H
+#define H5FDstdio_H
+
+#include "H5Ipublic.h"
+
+#define H5FD_STDIO	(H5FD_stdio_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5_DLL hid_t H5FD_stdio_init(void);
+H5_DLL void H5FD_stdio_term(void);
+H5_DLL herr_t H5Pset_fapl_stdio(hid_t fapl_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDwindows.c b/gatb-core/thirdparty/hdf5/src/H5FDwindows.c
new file mode 100644
index 0000000..8dd7555
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDwindows.c
@@ -0,0 +1,69 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"      /* Generic Functions        */
+#include "H5Eprivate.h"     /* Error handling           */
+#include "H5Fprivate.h"     /* File access              */
+#include "H5FDprivate.h"    /* File drivers             */
+#include "H5FDwindows.h"    /* Windows file driver      */
+#include "H5FDsec2.h"       /* Windows file driver      */
+#include "H5FLprivate.h"    /* Free Lists               */
+#include "H5Iprivate.h"     /* IDs                      */
+#include "H5MMprivate.h"    /* Memory management        */
+#include "H5Pprivate.h"     /* Property lists           */
+
+#ifdef H5_HAVE_WINDOWS
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fapl_windows
+ *
+ * Purpose: Modify the file access property list to use the H5FD_WINDOWS
+ *          driver defined in this source file.  There are no driver
+ *          specific properties.
+ *
+ * NOTE: The Windows VFD was merely a merge of the SEC2 and STDIO drivers
+ *       so it has been retired.  Selecting the Windows VFD will actually
+ *       set the SEC2 VFD (though for backwards compatibility, we'll keep
+ *       the H5FD_WINDOWS symbol).
+ *
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Dana Robinson
+ *              October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fapl_windows(hid_t fapl_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", fapl_id);
+
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    ret_value = H5P_set_driver(plist, H5FD_WINDOWS, NULL);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fapl_windows() */
+
+#endif /* H5_HAVE_WINDOWS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FDwindows.h b/gatb-core/thirdparty/hdf5/src/H5FDwindows.h
new file mode 100644
index 0000000..7b547bf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FDwindows.h
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Scott Wegner <swegner at hdfgroup.org>
+ *				Based on code by Robb Matzke
+ *              Thursday, May 24 2007
+ *
+ * Purpose:	The public header file for the windows driver.
+ */
+#ifndef H5FDwindows_H
+#define H5FDwindows_H
+
+#include "H5Ipublic.h"
+#include "H5FDsec2.h"
+
+#define H5FD_WINDOWS	(H5FD_windows_init())
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The code behind the windows VFD has been removed and the windows
+ * VFD initialization has been redirected to the SEC2 driver.  The
+ * "Windows" VFD was actually identical to the SEC2 driver code
+ * (a planned Win32 API driver never happened) so this change
+ * should be transparent to users.
+ */
+#define H5FD_windows_init H5FD_sec2_init
+#define H5FD_windows_term H5FD_sec2_term
+H5_DLL herr_t H5Pset_fapl_windows(hid_t fapl_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FL.c b/gatb-core/thirdparty/hdf5/src/H5FL.c
new file mode 100644
index 0000000..aec92ff
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FL.c
@@ -0,0 +1,2563 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *	       Thursday, March 23, 2000
+ *
+ * Purpose: Manage priority queues of free-lists (of blocks of bytes).
+ *      These are used in various places in the library which allocate and
+ *      free differently blocks of bytes repeatedly.  Usually the same size
+ *      of block is allocated and freed repeatly in a loop, while writing out
+ *      chunked data for example, but the blocks may also be of different sizes
+ *      from different datasets and an attempt is made to optimize access to
+ *      the proper free list of blocks by using these priority queues to
+ *      move frequently accessed free lists to the head of the queue.
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5FL_init_interface
+
+
+/* #define H5FL_DEBUG */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+/*
+ * Private type definitions
+ */
+
+/*
+    Default limits on how much memory can accumulate on each free list before
+    it is garbage collected.
+ */
+static size_t H5FL_reg_glb_mem_lim=1*1024*1024; /* Default to 1MB limit on all regular free lists */
+static size_t H5FL_reg_lst_mem_lim=1*65536;     /* Default to 64KB limit on each regular free list */
+static size_t H5FL_arr_glb_mem_lim=4*1024*1024; /* Default to 4MB limit on all array free lists */
+static size_t H5FL_arr_lst_mem_lim=4*65536;     /* Default to 256KB limit on each array free list */
+static size_t H5FL_blk_glb_mem_lim=16*1024*1024; /* Default to 16MB limit on all block free lists */
+static size_t H5FL_blk_lst_mem_lim=1024*1024;   /* Default to 1024KB (1MB) limit on each block free list */
+static size_t H5FL_fac_glb_mem_lim=16*1024*1024; /* Default to 16MB limit on all factory free lists */
+static size_t H5FL_fac_lst_mem_lim=1024*1024;     /* Default to 1024KB (1MB) limit on each factory free list */
+
+/* A garbage collection node for regular free lists */
+typedef struct H5FL_reg_gc_node_t {
+    H5FL_reg_head_t *list;              /* Pointer to the head of the list to garbage collect */
+    struct H5FL_reg_gc_node_t *next;    /* Pointer to the next node in the list of things to garbage collect */
+} H5FL_reg_gc_node_t;
+
+/* The garbage collection head for regular free lists */
+typedef struct H5FL_reg_gc_list_t {
+    size_t mem_freed;               /* Amount of free memory on list */
+    struct H5FL_reg_gc_node_t *first;   /* Pointer to the first node in the list of things to garbage collect */
+} H5FL_reg_gc_list_t;
+
+/* The head of the list of things to garbage collect */
+static H5FL_reg_gc_list_t H5FL_reg_gc_head={0,NULL};
+
+/* A garbage collection node for array free lists */
+typedef struct H5FL_gc_arr_node_t {
+    H5FL_arr_head_t *list;              /* Pointer to the head of the list to garbage collect */
+    struct H5FL_gc_arr_node_t *next;    /* Pointer to the next node in the list of things to garbage collect */
+} H5FL_gc_arr_node_t;
+
+/* The garbage collection head for array free lists */
+typedef struct H5FL_gc_arr_list_t {
+    size_t mem_freed;                    /* Amount of free memory on list */
+    struct H5FL_gc_arr_node_t *first;    /* Pointer to the first node in the list of things to garbage collect */
+} H5FL_gc_arr_list_t;
+
+/* The head of the list of array things to garbage collect */
+static H5FL_gc_arr_list_t H5FL_arr_gc_head={0,NULL};
+
+/* A garbage collection node for blocks */
+typedef struct H5FL_blk_gc_node_t {
+    H5FL_blk_head_t *pq;                /* Pointer to the head of the PQ to garbage collect */
+    struct H5FL_blk_gc_node_t *next;    /* Pointer to the next node in the list of things to garbage collect */
+} H5FL_blk_gc_node_t;
+
+/* The garbage collection head for blocks */
+typedef struct H5FL_blk_gc_list_t {
+    size_t mem_freed;                   /* Amount of free memory on list */
+    struct H5FL_blk_gc_node_t *first;   /* Pointer to the first node in the list of things to garbage collect */
+} H5FL_blk_gc_list_t;
+
+/* The head of the list of PQs to garbage collect */
+static H5FL_blk_gc_list_t H5FL_blk_gc_head={0,NULL};
+
+/* A garbage collection node for factory free lists */
+struct H5FL_fac_gc_node_t {
+    H5FL_fac_head_t *list;              /* Pointer to the head of the list to garbage collect */
+    struct H5FL_fac_gc_node_t *next;    /* Pointer to the next node in the list of things to garbage collect */
+};
+
+/* The garbage collection head for factory free lists */
+typedef struct H5FL_fac_gc_list_t {
+    size_t mem_freed;               /* Amount of free memory on list */
+    struct H5FL_fac_gc_node_t *first;   /* Pointer to the first node in the list of things to garbage collect */
+} H5FL_fac_gc_list_t;
+
+/* Data structure to store each block in factory free list */
+struct H5FL_fac_node_t {
+    struct H5FL_fac_node_t *next;   /* Pointer to next block in free list */
+};
+
+/* The head of the list of factory things to garbage collect */
+static H5FL_fac_gc_list_t H5FL_fac_gc_head={0,NULL};
+
+#ifdef H5FL_TRACK
+
+/* Extra headers needed */
+#include "H5CSprivate.h"	/* Function stack			*/
+
+/* Head of "outstanding allocations" list */
+static H5FL_track_t *H5FL_out_head_g = NULL;
+#endif /* H5FL_TRACK */
+
+/* Forward declarations of local static functions */
+static herr_t H5FL_reg_gc(void);
+static herr_t H5FL_reg_gc_list(H5FL_reg_head_t *head);
+static herr_t H5FL_arr_gc(void);
+static herr_t H5FL_arr_gc_list(H5FL_arr_head_t *head);
+static herr_t H5FL_blk_gc(void);
+static herr_t H5FL_blk_gc_list(H5FL_blk_head_t *head);
+static herr_t H5FL_fac_gc(void);
+static herr_t H5FL_fac_gc_list(H5FL_fac_head_t *head);
+
+/* Declare a free list to manage the H5FL_blk_node_t struct */
+H5FL_DEFINE(H5FL_blk_node_t);
+
+/* Declare a free list to manage the H5FL_fac_gc_node_t struct */
+H5FL_DEFINE(H5FL_fac_gc_node_t);
+
+/* Declare a free list to manage the H5FL_fac_head_t struct */
+H5FL_DEFINE(H5FL_fac_head_t);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5FL_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5FL_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5FL_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Nothing currently... */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FL_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_malloc
+ *
+ * Purpose:	Attempt to allocate space using malloc.  If malloc fails, garbage
+ *      collect and try again.  If malloc fails again, then return NULL.
+ *
+ * Return:	Success:	non-NULL
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 1, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FL_malloc(size_t mem_size)
+{
+    void *ret_value;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Attempt to allocate the memory requested */
+    if(NULL==(ret_value=H5MM_malloc(mem_size))) {
+        /* If we can't allocate the memory now, try garbage collecting first */
+        if(H5FL_garbage_coll()<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during allocation")
+
+        /* Now try allocating the memory again */
+        if(NULL==(ret_value=H5MM_malloc(mem_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for chunk")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_init
+ *
+ * Purpose:	Initialize a free list for a certain type.  Right now, this just
+ *      adds the free list to the list of things to garbage collect.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_reg_init(H5FL_reg_head_t *head)
+{
+    H5FL_reg_gc_node_t *new_node;   /* Pointer to the node for the new list to garbage collect */
+    herr_t ret_value=SUCCEED;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate a new garbage collection node */
+    if(NULL == (new_node = (H5FL_reg_gc_node_t *)H5MM_malloc(sizeof(H5FL_reg_gc_node_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the new garbage collection node */
+    new_node->list = head;
+
+    /* Link in to the garbage collection list */
+    new_node->next=H5FL_reg_gc_head.first;
+    H5FL_reg_gc_head.first=new_node;
+
+    /* Indicate that the free list is initialized */
+    head->init=1;
+
+    /* Make certain that the space allocated is large enough to store a free list pointer (eventually) */
+    if(head->size<sizeof(H5FL_reg_node_t))
+        head->size=sizeof(H5FL_reg_node_t);
+
+    /* Make certain there's room for tracking information, if any */
+#ifdef H5FL_TRACK
+    head->size += sizeof(H5FL_track_t);
+#endif /* H5FL_TRACK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_reg_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_free
+ *
+ * Purpose:	Release an object & put on free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_reg_free(H5FL_reg_head_t *head, void *obj)
+{
+    void *ret_value=NULL;       /* Return value */
+
+    /* NOINIT OK here because this must be called after H5FL_reg_malloc/calloc
+     * -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(obj);
+
+#ifdef H5FL_TRACK
+    {
+        H5FL_track_t *trk = obj = ((unsigned char *)obj) - sizeof(H5FL_track_t);
+
+        /* Free tracking information about the allocation location */
+        H5CS_close_stack(trk->stack);
+        trk->stack = H5MM_xfree(trk->stack);
+        trk->file = H5MM_xfree(trk->file);
+        trk->func = H5MM_xfree(trk->func);
+
+        /* Remove from "outstanding allocations" list */
+        if(trk == H5FL_out_head_g) {
+            H5FL_out_head_g = H5FL_out_head_g->next;
+            if(H5FL_out_head_g)
+                H5FL_out_head_g->prev = NULL;
+        } /* end if */
+        else {
+            trk->prev->next = trk->next;
+            if(trk->next)
+                trk->next->prev = trk->prev;
+        } /* end else */
+    }
+#endif /* H5FL_TRACK */
+
+#ifdef H5FL_DEBUG
+    HDmemset(obj,255,head->size);
+#endif /* H5FL_DEBUG */
+
+    /* Make certain that the free list is initialized */
+    HDassert(head->init);
+
+    /* Link into the free list */
+    ((H5FL_reg_node_t *)obj)->next=head->list;
+
+    /* Point free list at the node freed */
+    head->list=(H5FL_reg_node_t *)obj;
+
+    /* Increment the number of blocks on free list */
+    head->onlist++;
+
+    /* Increment the amount of "regular" freed memory globally */
+    H5FL_reg_gc_head.mem_freed+=head->size;
+
+    /* Check for exceeding free list memory use limits */
+    /* First check this particular list */
+    if(head->onlist * head->size > H5FL_reg_lst_mem_lim)
+        if(H5FL_reg_gc_list(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+    /* Then check the global amount memory on regular free lists */
+    if(H5FL_reg_gc_head.mem_freed>H5FL_reg_glb_mem_lim)
+        if(H5FL_reg_gc()<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_reg_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_malloc
+ *
+ * Purpose:	Allocate a block on a free list
+ *
+ * Return:	Success:	Pointer to a valid object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_reg_malloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+
+    /* Make certain the list is initialized first */
+    if(!head->init)
+        if(H5FL_reg_init(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't initialize 'regular' blocks")
+
+    /* Check for nodes available on the free list first */
+    if(head->list!=NULL) {
+        /* Get a pointer to the block on the free list */
+        ret_value=(void *)(head->list);
+
+        /* Remove node from free list */
+        head->list=head->list->next;
+
+        /* Decrement the number of blocks & memory on free list */
+        head->onlist--;
+
+        /* Decrement the amount of global "regular" free list memory in use */
+        H5FL_reg_gc_head.mem_freed-=(head->size);
+    } /* end if */
+    /* Otherwise allocate a node */
+    else {
+        if (NULL==(ret_value = H5FL_malloc(head->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Increment the number of blocks allocated in list */
+        head->allocated++;
+    } /* end else */
+
+#ifdef H5FL_TRACK
+    /* Copy allocation location information */
+    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
+    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
+    ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
+    ((H5FL_track_t *)ret_value)->line = call_line;
+
+    /* Add to "outstanding allocations" list */
+    ((H5FL_track_t *)ret_value)->prev = NULL;
+    ((H5FL_track_t *)ret_value)->next = H5FL_out_head_g;
+    if(H5FL_out_head_g)
+        H5FL_out_head_g->prev = (H5FL_track_t *)ret_value;
+    H5FL_out_head_g = (H5FL_track_t *)ret_value;
+
+    /* Adjust for allocation tracking information */
+    ret_value = ((unsigned char *)ret_value) + sizeof(H5FL_track_t);
+#endif /* H5FL_TRACK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_reg_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_calloc
+ *
+ * Purpose:	Allocate a block on a free list and clear it to zeros
+ *
+ * Return:	Success:	Pointer to a valid object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December 23, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_reg_calloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+
+    /* Allocate the block */
+    if (NULL==(ret_value = H5FL_reg_malloc(head H5FL_TRACK_INFO_INT)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Clear to zeros */
+    /* (Accomodate tracking information, if present) */
+    HDmemset(ret_value,0,head->size - H5FL_TRACK_SIZE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_reg_calloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_gc_list
+ *
+ * Purpose:	Garbage collect on a particular object free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_reg_gc_list(H5FL_reg_head_t *head)
+{
+    H5FL_reg_node_t *free_list; /* Pointer to nodes in free list being garbage collected */
+    void *tmp;          /* Temporary node pointer */
+    size_t total_mem;   /* Total memory used on list */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Calculate the total memory used on this list */
+    total_mem=head->onlist*head->size;
+
+    /* For each free list being garbage collected, walk through the nodes and free them */
+    free_list=head->list;
+    while(free_list!=NULL) {
+        tmp=free_list->next;
+
+        /* Decrement the count of nodes allocated and free the node */
+        head->allocated--;
+
+        H5MM_free(free_list);
+
+        free_list = (H5FL_reg_node_t *)tmp;
+    } /* end while */
+
+    /* Indicate no free nodes on the free list */
+    head->list=NULL;
+    head->onlist=0;
+
+    /* Decrement global count of free memory on "regular" lists */
+    H5FL_reg_gc_head.mem_freed-=total_mem;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5FL_reg_gc_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_reg_gc
+ *
+ * Purpose:	Garbage collect on all the object free lists
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *  Broke into two parts, one for looping over all the free lists and
+ *      another for freeing each list - QAK 7/25/00
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_reg_gc(void)
+{
+    H5FL_reg_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
+    herr_t ret_value=SUCCEED;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Walk through all the free lists, free()'ing the nodes */
+    gc_node=H5FL_reg_gc_head.first;
+    while(gc_node!=NULL) {
+        /* Release the free nodes on the list */
+        if(H5FL_reg_gc_list(gc_node->list)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
+
+        /* Go on to the next free list to garbage collect */
+        gc_node=gc_node->next;
+    } /* end while */
+
+    /* Double check that all the memory on the free lists is recycled */
+    HDassert(H5FL_reg_gc_head.mem_freed==0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_reg_gc() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FL_reg_term
+ PURPOSE
+    Terminate various H5FL object free lists
+ USAGE
+    int H5FL_term()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+        Robb Matzke, 2000-04-25
+        If a list cannot be freed because something is using it then return
+        zero (failure to free a list doesn't affect any other part of the
+        library). If some other layer frees something during its termination
+        it will return non-zero, which will cause this function to get called
+        again to reclaim this layer's memory.
+--------------------------------------------------------------------------*/
+static int
+H5FL_reg_term(void)
+{
+    H5FL_reg_gc_node_t *left;   /* pointer to garbage collection lists with work left */
+    H5FL_reg_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (H5_interface_initialize_g) {
+        /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
+        left=NULL;
+        while(H5FL_reg_gc_head.first!=NULL) {
+            tmp=H5FL_reg_gc_head.first->next;
+
+#ifdef H5FL_DEBUG
+            printf("H5FL_reg_term: head->name=%s, head->allocated=%d\n", H5FL_reg_gc_head.first->list->name,(int)H5FL_reg_gc_head.first->list->allocated);
+#endif /* H5FL_DEBUG */
+            /* Check if the list has allocations outstanding */
+            if(H5FL_reg_gc_head.first->list->allocated>0) {
+                /* Add free list to the list of nodes with allocations open still */
+                H5FL_reg_gc_head.first->next=left;
+                left=H5FL_reg_gc_head.first;
+            } /* end if */
+            /* No allocations left open for list, get rid of it */
+            else {
+                /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+                H5FL_reg_gc_head.first->list->init=0;
+
+                /* Free the node from the garbage collection list */
+                H5MM_xfree(H5FL_reg_gc_head.first);
+            } /* end else */
+
+            H5FL_reg_gc_head.first=tmp;
+        } /* end while */
+
+        /* Point to the list of nodes left with allocations open, if any */
+        H5FL_reg_gc_head.first=left;
+        if (!left)
+            H5_interface_initialize_g = 0; /*this layer has reached its initial state*/
+    }
+
+    /* Terminating this layer never affects other layers; rather, other layers affect
+     * the termination of this layer. */
+    FUNC_LEAVE_NOAPI(0)
+}   /* end H5FL_reg_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_find_list
+ *
+ * Purpose:	Finds the free list for blocks of a given size.  Also moves that
+ *      free list node to the head of the priority queue (if it isn't there
+ *      already).  This routine does not manage the actual free list, it just
+ *      works with the priority queue.
+ *
+ * Return:	Success:	valid pointer to the free list node
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FL_blk_node_t *
+H5FL_blk_find_list(H5FL_blk_node_t **head, size_t size)
+{
+    H5FL_blk_node_t *temp;  /* Temp. pointer to node in the native list */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Find the correct free list */
+    temp=*head;
+
+    /* Check if the node is at the head of the list */
+    if(temp && temp->size!=size) {
+        temp=temp->next;
+
+        while(temp!=NULL) {
+            /* Check if we found the correct node */
+            if(temp->size==size) {
+                /* Take the node found out of it's current position */
+                if(temp->next==NULL) {
+                    temp->prev->next=NULL;
+                } /* end if */
+                else {
+                    temp->prev->next=temp->next;
+                    temp->next->prev=temp->prev;
+                } /* end else */
+
+                /* Move the found node to the head of the list */
+                temp->prev=NULL;
+                temp->next=*head;
+                (*head)->prev=temp;
+                *head=temp;
+
+                /* Get out */
+                break;
+            } /* end if */
+
+            temp=temp->next;
+        } /* end while */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(temp)
+} /* end H5FL_blk_find_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_create_list
+ *
+ * Purpose:	Creates a new free list for blocks of the given size at the
+ *      head of the priority queue.
+ *
+ * Return:	Success:	valid pointer to the free list node
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FL_blk_node_t *
+H5FL_blk_create_list(H5FL_blk_node_t **head, size_t size)
+{
+    H5FL_blk_node_t *temp;  /* Temp. pointer to node in the list */
+    H5FL_blk_node_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate room for the new free list node */
+    if(NULL==(temp=H5FL_MALLOC(H5FL_blk_node_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for chunk info")
+
+    /* Set the correct values for the new free list */
+    temp->size=size;
+    temp->list=NULL;
+
+    /* Attach to head of priority queue */
+    if(*head==NULL) {
+        *head=temp;
+        temp->next=temp->prev=NULL;
+    } /* end if */
+    else {
+        temp->next=*head;
+        (*head)->prev=temp;
+        temp->prev=NULL;
+        *head=temp;
+    } /* end else */
+
+    ret_value=temp;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_create_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_init
+ *
+ * Purpose:	Initialize a priority queue of a certain type.  Right now, this just
+ *      adds the PQ to the list of things to garbage collect.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_blk_init(H5FL_blk_head_t *head)
+{
+    H5FL_blk_gc_node_t *new_node;   /* Pointer to the node for the new list to garbage collect */
+    herr_t ret_value=SUCCEED;       /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate a new garbage collection node */
+    if(NULL == (new_node = (H5FL_blk_gc_node_t *)H5MM_malloc(sizeof(H5FL_blk_gc_node_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the new garbage collection node */
+    new_node->pq = head;
+
+    /* Link in to the garbage collection list */
+    new_node->next=H5FL_blk_gc_head.first;
+    H5FL_blk_gc_head.first=new_node;
+
+    /* Indicate that the PQ is initialized */
+    head->init=1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_blk_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_free_block_avail
+ *
+ * Purpose:	Checks if a free block of the appropriate size is available
+ *      for a given list.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 16, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FL_blk_free_block_avail(H5FL_blk_head_t *head, size_t size)
+{
+    H5FL_blk_node_t *free_list;  /* The free list of nodes of correct size */
+    htri_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Double check parameters */
+    HDassert(head);
+
+    /* check if there is a free list for blocks of this size */
+    /* and if there are any blocks available on the list */
+    if((free_list=H5FL_blk_find_list(&(head->head),size))!=NULL && free_list->list!=NULL)
+        ret_value=TRUE;
+    else
+        ret_value=FALSE;
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_free_block_avail() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_malloc
+ *
+ * Purpose:	Allocates memory for a block.  This routine is used
+ *      instead of malloc because the block can be kept on a free list so
+ *      they don't thrash malloc/free as much.
+ *
+ * Return:	Success:	valid pointer to the block
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_blk_malloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS)
+{
+    H5FL_blk_node_t *free_list;  /* The free list of nodes of correct size */
+    H5FL_blk_list_t *temp;  /* Temp. ptr to the new native list allocated */
+    void *ret_value;    /* Pointer to the block to return to the user */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(size);
+
+    /* Make certain the list is initialized first */
+    if(!head->init)
+        if(H5FL_blk_init(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't initialize 'block' list")
+
+    /* check if there is a free list for blocks of this size */
+    /* and if there are any blocks available on the list */
+    if((free_list=H5FL_blk_find_list(&(head->head),size))!=NULL && free_list->list!=NULL) {
+        /* Remove the first node from the free list */
+        temp=free_list->list;
+        free_list->list=free_list->list->next;
+
+        /* Decrement the number of blocks & memory used on free list */
+        head->onlist--;
+        head->list_mem-=size;
+
+        /* Decrement the amount of global "block" free list memory in use */
+        H5FL_blk_gc_head.mem_freed-=size;
+
+    } /* end if */
+    /* No free list available, or there are no nodes on the list, allocate a new node to give to the user */
+    else {
+        /* Allocate new node, with room for the page info header and the actual page data */
+        if(NULL == (temp = (H5FL_blk_list_t *)H5FL_malloc(sizeof(H5FL_blk_list_t) + H5FL_TRACK_SIZE + size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for chunk")
+
+        /* Increment the number of blocks allocated */
+        head->allocated++;
+    } /* end else */
+
+    /* Initialize the block allocated */
+    temp->size=size;
+
+    /* Set the return value to the block itself */
+    ret_value=((char *)temp)+sizeof(H5FL_blk_list_t);
+
+#ifdef H5FL_TRACK
+    /* Copy allocation location information */
+    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
+    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
+    ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
+    ((H5FL_track_t *)ret_value)->line = call_line;
+
+    /* Add to "outstanding allocations" list */
+    ((H5FL_track_t *)ret_value)->prev = NULL;
+    ((H5FL_track_t *)ret_value)->next = H5FL_out_head_g;
+    if(H5FL_out_head_g)
+        H5FL_out_head_g->prev = (H5FL_track_t *)ret_value;
+    H5FL_out_head_g = (H5FL_track_t *)ret_value;
+
+    /* Adjust for allocation tracking information */
+    ret_value = ((unsigned char *)ret_value) + sizeof(H5FL_track_t);
+#endif /* H5FL_TRACK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_calloc
+ *
+ * Purpose:	Allocates memory for a block and clear it to zeros.
+ *      This routine is used
+ *      instead of malloc because the block can be kept on a free list so
+ *      they don't thrash malloc/free as much.
+ *
+ * Return:	Success:	valid pointer to the block
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 23, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_blk_calloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS)
+{
+    void *ret_value;    /* Pointer to the block to return to the user */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(size);
+
+    /* Allocate the block */
+    if (NULL==(ret_value = H5FL_blk_malloc(head,size H5FL_TRACK_INFO_INT)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Clear the block to zeros */
+    HDmemset(ret_value,0,size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_calloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_free
+ *
+ * Purpose:	Releases memory for a block.  This routine is used
+ *      instead of free because the blocks can be kept on a free list so
+ *      they don't thrash malloc/free as much.
+ *
+ * Return:	Success:	NULL
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_blk_free(H5FL_blk_head_t *head, void *block)
+{
+    H5FL_blk_node_t *free_list;      /* The free list of nodes of correct size */
+    H5FL_blk_list_t *temp;      /* Temp. ptr to the new free list node allocated */
+    size_t free_size;           /* Size of the block freed */
+    void *ret_value=NULL;       /* Return value */
+
+    /* NOINIT OK here because this must be called after H5FL_blk_malloc/calloc
+     * -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(block);
+
+#ifdef H5FL_TRACK
+    {
+        H5FL_track_t *trk = block = ((unsigned char *)block) - sizeof(H5FL_track_t);
+
+        /* Free tracking information about the allocation location */
+        H5CS_close_stack(trk->stack);
+        trk->stack = H5MM_xfree(trk->stack);
+        trk->file = H5MM_xfree(trk->file);
+        trk->func = H5MM_xfree(trk->func);
+
+        /* Remove from "outstanding allocations" list */
+        if(trk == H5FL_out_head_g) {
+            H5FL_out_head_g = H5FL_out_head_g->next;
+            if(H5FL_out_head_g)
+                H5FL_out_head_g->prev = NULL;
+        } /* end if */
+        else {
+            trk->prev->next = trk->next;
+            if(trk->next)
+                trk->next->prev = trk->prev;
+        } /* end else */
+    }
+#endif /* H5FL_TRACK */
+
+    /* Get the pointer to the native block info header in front of the native block to free */
+    temp=(H5FL_blk_list_t *)((unsigned char *)block-sizeof(H5FL_blk_list_t)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
+
+    /* Save the block's size for later */
+    free_size=temp->size;
+
+#ifdef H5FL_DEBUG
+    HDmemset(temp,255,free_size + sizeof(H5FL_blk_list_t) + H5FL_TRACK_SIZE);
+#endif /* H5FL_DEBUG */
+
+    /* check if there is a free list for native blocks of this size */
+    if((free_list=H5FL_blk_find_list(&(head->head),free_size))==NULL) {
+        /* No free list available, create a new list node and insert it to the queue */
+        free_list=H5FL_blk_create_list(&(head->head),free_size);
+        HDassert(free_list);
+    } /* end if */
+
+    /* Prepend the free'd native block to the front of the free list */
+    if(free_list!=NULL) {
+        temp->next=free_list->list; /* Overwrites the size field in union */
+        free_list->list=temp;
+    } /* end if */
+
+    /* Increment the number of blocks on free list */
+    head->onlist++;
+    head->list_mem+=free_size;
+
+    /* Increment the amount of "block" freed memory globally */
+    H5FL_blk_gc_head.mem_freed+=free_size;
+
+    /* Check for exceeding free list memory use limits */
+    /* First check this particular list */
+    if(head->list_mem>H5FL_blk_lst_mem_lim)
+        if(H5FL_blk_gc_list(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+    /* Then check the global amount memory on block free lists */
+    if(H5FL_blk_gc_head.mem_freed>H5FL_blk_glb_mem_lim)
+        if(H5FL_blk_gc()<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_realloc
+ *
+ * Purpose:	Resizes a block.  This does things the straightforward, simple way,
+ *      not actually using realloc.
+ *
+ * Return:	Success:	NULL
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_blk_realloc(H5FL_blk_head_t *head, void *block, size_t new_size H5FL_TRACK_PARAMS)
+{
+    void *ret_value=NULL;       /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(new_size);
+
+    /* Check if we are actually re-allocating a block */
+    if(block!=NULL) {
+        H5FL_blk_list_t *temp;      /* Temp. ptr to the new block node allocated */
+
+        /* Get the pointer to the chunk info header in front of the chunk to free */
+        temp=(H5FL_blk_list_t *)((unsigned char *)block - (sizeof(H5FL_blk_list_t) + H5FL_TRACK_SIZE)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
+
+        /* check if we are actually changing the size of the buffer */
+        if(new_size!=temp->size) {
+            size_t blk_size;           /* Temporary block size */
+
+            if((ret_value=H5FL_blk_malloc(head,new_size H5FL_TRACK_INFO_INT))==NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for block")
+            blk_size=MIN(new_size,temp->size);
+            HDmemcpy(ret_value,block,blk_size);
+            H5FL_blk_free(head,block);
+        } /* end if */
+        else {
+#ifdef H5FL_TRACK
+            {
+                H5FL_track_t *trk = (H5FL_track_t *)(((unsigned char *)block) - sizeof(H5FL_track_t));
+
+                /* Release previous tracking information */
+                H5CS_close_stack(trk->stack);
+                trk->file = H5MM_xfree(trk->file);
+                trk->func = H5MM_xfree(trk->func);
+
+                /* Store new tracking information */
+                H5CS_copy_stack(trk->stack);
+                trk->file = H5MM_strdup(call_file);
+                trk->func = H5MM_strdup(call_func);
+                trk->line = call_line;
+            }
+#endif /* H5FL_TRACK */
+            ret_value=block;
+        } /* end if */
+    } /* end if */
+    /* Not re-allocating, just allocate a fresh block */
+    else
+        ret_value=H5FL_blk_malloc(head,new_size H5FL_TRACK_INFO_INT);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FL_blk_realloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_gc_list
+ *
+ * Purpose:	Garbage collect a priority queue
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 23, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_blk_gc_list(H5FL_blk_head_t *head)
+{
+    H5FL_blk_list_t *list; /* The free list of native nodes of a particular size */
+    void *next;     /* Temp. ptr to the free list list node */
+    void *temp;     /* Temp. ptr to the free list page node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Loop through all the nodes in the block free list queue */
+    while(head->head!=NULL) {
+        temp=head->head->next;
+
+        /* Loop through all the blocks in the free list, freeing them */
+        list=head->head->list;
+        while(list!=NULL) {
+            next=list->next;
+
+            /* Decrement the number of blocks & memory allocated from this PQ */
+            head->allocated--;
+            head->list_mem-=head->head->size;
+
+            /* Decrement global count of free memory on "block" lists */
+            H5FL_blk_gc_head.mem_freed-=head->head->size;
+
+            /* Free the block */
+            H5MM_free(list);
+
+            list = (H5FL_blk_list_t *)next;
+        } /* end while */
+
+        /* Free the free list node */
+        head->head = H5FL_FREE(H5FL_blk_node_t, head->head);
+
+        /* Advance to the next free list */
+        head->head = (H5FL_blk_node_t *)temp;
+    } /* end while */
+
+    /* Indicate no free nodes on the free list */
+    head->head = NULL;
+    head->onlist = 0;
+
+    /* Double check that all the memory on this list is recycled */
+    HDassert(0 == head->list_mem);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5FL_blk_gc_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_blk_gc
+ *
+ * Purpose:	Garbage collect on all the priority queues
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_blk_gc(void)
+{
+    H5FL_blk_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
+    herr_t ret_value=SUCCEED;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Walk through all the free lists, free()'ing the nodes */
+    gc_node=H5FL_blk_gc_head.first;
+    while(gc_node!=NULL) {
+        /* For each free list being garbage collected, walk through the nodes and free them */
+        if(H5FL_blk_gc_list(gc_node->pq)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
+
+        /* Go on to the next free list to garbage collect */
+        gc_node=gc_node->next;
+    } /* end while */
+
+    /* Double check that all the memory on the free lists are recycled */
+    HDassert(H5FL_blk_gc_head.mem_freed==0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_blk_gc() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FL_blk_term
+ PURPOSE
+    Terminate various H5FL_blk objects
+ USAGE
+    void H5FL_blk_term()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5FL_blk_term(void)
+{
+    H5FL_blk_gc_node_t *left;   /* pointer to garbage collection lists with work left */
+    H5FL_blk_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
+    left=NULL;
+    while(H5FL_blk_gc_head.first!=NULL) {
+        tmp=H5FL_blk_gc_head.first->next;
+
+#ifdef H5FL_DEBUG
+printf("H5FL_blk_term: head->name=%s, head->allocated=%d\n", H5FL_blk_gc_head.first->pq->name,(int)H5FL_blk_gc_head.first->pq->allocated);
+#endif /* H5FL_DEBUG */
+
+        /* Check if the list has allocations outstanding */
+        if(H5FL_blk_gc_head.first->pq->allocated>0) {
+            /* Add free list to the list of nodes with allocations open still */
+            H5FL_blk_gc_head.first->next=left;
+            left=H5FL_blk_gc_head.first;
+        } /* end if */
+        /* No allocations left open for list, get rid of it */
+        else {
+            /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+            H5FL_blk_gc_head.first->pq->init=0;
+
+            /* Free the node from the garbage collection list */
+            H5MM_free(H5FL_blk_gc_head.first);
+        } /* end else */
+
+        H5FL_blk_gc_head.first=tmp;
+    } /* end while */
+
+    /* Point to the list of nodes left with allocations open, if any */
+    H5FL_blk_gc_head.first=left;
+
+    FUNC_LEAVE_NOAPI(H5FL_blk_gc_head.first!=NULL ? 1 : 0)
+}   /* end H5FL_blk_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_init
+ *
+ * Purpose:	Initialize a free list for a arrays of certain type.  Right now,
+ *      this just adds the free list to the list of things to garbage collect.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_arr_init(H5FL_arr_head_t *head)
+{
+    H5FL_gc_arr_node_t *new_node;   /* Pointer to the node for the new list to garbage collect */
+    size_t u;                       /* Local index variable */
+    herr_t ret_value=SUCCEED;       /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate a new garbage collection node */
+    if(NULL == (new_node = (H5FL_gc_arr_node_t *)H5MM_malloc(sizeof(H5FL_gc_arr_node_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the new garbage collection node */
+    new_node->list = head;
+
+    /* Link in to the garbage collection list */
+    new_node->next=H5FL_arr_gc_head.first;
+    H5FL_arr_gc_head.first=new_node;
+
+    /* Allocate room for the free lists */
+    if(NULL == (head->list_arr = (H5FL_arr_node_t *)H5MM_calloc((size_t)head->maxelem*sizeof(H5FL_arr_node_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the size of each array */
+    for(u = 0; u < (size_t)head->maxelem; u++)
+        head->list_arr[u].size = head->base_size + (head->elem_size * u);
+
+    /* Indicate that the free list is initialized */
+    head->init = 1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_free
+ *
+ * Purpose:	Release an array of objects & put on free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_arr_free(H5FL_arr_head_t *head, void *obj)
+{
+    H5FL_arr_list_t *temp;  /* Temp. ptr to the new free list node allocated */
+    size_t mem_size;        /* Size of memory being freed */
+    size_t free_nelem;      /* Number of elements in node being free'd */
+    void *ret_value=NULL;   /* Return value */
+
+    /* NOINIT OK here because this must be called after H5FL_arr_malloc/calloc
+     * -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* The H5MM_xfree code allows obj to null */
+    if (!obj)
+        HGOTO_DONE (NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+
+    /* Make certain that the free list is initialized */
+    HDassert(head->init);
+
+    /* Get the pointer to the info header in front of the block to free */
+    temp=(H5FL_arr_list_t *)((unsigned char *)obj-sizeof(H5FL_arr_list_t)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
+
+    /* Get the number of elements */
+    free_nelem=temp->nelem;
+
+    /* Double-check that there is enough room for arrays of this size */
+    HDassert((int)free_nelem<=head->maxelem);
+
+    /* Link into the free list */
+    temp->next=head->list_arr[free_nelem].list;
+
+    /* Point free list at the node freed */
+    head->list_arr[free_nelem].list=temp;
+
+    /* Get the size of arrays with this many elements */
+    mem_size=head->list_arr[free_nelem].size;
+
+    /* Increment the number of blocks & memory used on free list */
+    head->list_arr[free_nelem].onlist++;
+    head->list_mem+=mem_size;
+
+    /* Increment the amount of "array" freed memory globally */
+    H5FL_arr_gc_head.mem_freed+=mem_size;
+
+    /* Check for exceeding free list memory use limits */
+    /* First check this particular list */
+    if(head->list_mem>H5FL_arr_lst_mem_lim)
+        if(H5FL_arr_gc_list(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+    /* Then check the global amount memory on array free lists */
+    if(H5FL_arr_gc_head.mem_freed>H5FL_arr_glb_mem_lim)
+        if(H5FL_arr_gc()<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_malloc
+ *
+ * Purpose:	Allocate an array of objects
+ *
+ * Return:	Success:	Pointer to a valid array object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_arr_malloc(H5FL_arr_head_t *head, size_t elem)
+{
+    H5FL_arr_list_t *new_obj;   /* Pointer to the new free list node allocated */
+    void *ret_value;        /* Pointer to object to return */
+    size_t mem_size;        /* Size of memory block being recycled */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(elem);
+
+    /* Make certain the list is initialized first */
+    if(!head->init)
+        if(H5FL_arr_init(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't initialize 'array' blocks")
+
+    /* Sanity check that the number of elements is supported */
+    HDassert(elem<=(unsigned) head->maxelem);
+
+    /* Get the set of the memory block */
+    mem_size=head->list_arr[elem].size;
+
+    /* Check for nodes available on the free list first */
+    if(head->list_arr[elem].list!=NULL) {
+        /* Get a pointer to the block on the free list */
+        new_obj=head->list_arr[elem].list;
+
+        /* Remove node from free list */
+        head->list_arr[elem].list=head->list_arr[elem].list->next;
+
+        /* Decrement the number of blocks & memory used on free list */
+        head->list_arr[elem].onlist--;
+        head->list_mem-=mem_size;
+
+        /* Decrement the amount of global "array" free list memory in use */
+        H5FL_arr_gc_head.mem_freed-=mem_size;
+
+    } /* end if */
+    /* Otherwise allocate a node */
+    else {
+        if(NULL == (new_obj = (H5FL_arr_list_t *)H5FL_malloc(sizeof(H5FL_arr_list_t)+mem_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Increment the number of blocks allocated in list */
+        head->allocated++;
+    } /* end else */
+
+    /* Initialize the new object */
+    new_obj->nelem=elem;
+
+    /* Get a pointer to the new block */
+    ret_value=((char *)new_obj)+sizeof(H5FL_arr_list_t);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_calloc
+ *
+ * Purpose:	Allocate an array of objects and clear it to zeros
+ *
+ * Return:	Success:	Pointer to a valid array object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, December 23, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_arr_calloc(H5FL_arr_head_t *head, size_t elem)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(elem);
+
+    /* Allocate the array */
+    if(NULL == (ret_value = H5FL_arr_malloc(head, elem)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Clear to zeros */
+    HDmemset(ret_value, 0, head->list_arr[elem].size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_calloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_realloc
+ *
+ * Purpose:	Reallocate an array of objects
+ *
+ * Return:	Success:	Pointer to a valid array object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_arr_realloc(H5FL_arr_head_t *head, void * obj, size_t new_elem)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(new_elem);
+
+    /* Check if we are really allocating the object */
+    if(obj==NULL)
+        ret_value=H5FL_arr_malloc(head,new_elem);
+    else {
+        H5FL_arr_list_t *temp;  /* Temp. ptr to the new free list node allocated */
+
+        /* Sanity check that the number of elements is supported */
+        HDassert((int)new_elem<=head->maxelem);
+
+        /* Get the pointer to the info header in front of the block to free */
+        temp=(H5FL_arr_list_t *)((unsigned char *)obj-sizeof(H5FL_arr_list_t)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
+
+        /* Check if the size is really changing */
+        if(temp->nelem!=new_elem) {
+            size_t blk_size;       /* Size of block */
+
+            /* Get the new array of objects */
+            ret_value=H5FL_arr_malloc(head,new_elem);
+
+            /* Copy the appropriate amount of elements */
+            blk_size = head->list_arr[ MIN(temp->nelem, new_elem) ].size;
+            HDmemcpy(ret_value,obj,blk_size);
+
+            /* Free the old block */
+            H5FL_arr_free(head,obj);
+        } /* end if */
+        else
+            ret_value=obj;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_realloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_gc_list
+ *
+ * Purpose:	Garbage collect on an array object free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_arr_gc_list(H5FL_arr_head_t *head)
+{
+    H5FL_arr_list_t *arr_free_list; /* Pointer to nodes in free list being garbage collected */
+    void *tmp;      /* Temporary node pointer */
+    unsigned u;     /* Counter for array of free lists */
+    size_t total_mem;   /* Total memory used on list */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Walk through the array of free lists */
+    for(u=0; u<(unsigned)head->maxelem; u++) {
+        if(head->list_arr[u].onlist>0) {
+            /* Calculate the total memory used on this list */
+            total_mem=head->list_arr[u].onlist*head->list_arr[u].size;
+
+            /* For each free list being garbage collected, walk through the nodes and free them */
+            arr_free_list=head->list_arr[u].list;
+            while(arr_free_list!=NULL) {
+                tmp = arr_free_list->next;
+
+                /* Decrement the count of nodes allocated and free the node */
+                head->allocated--;
+                H5MM_free(arr_free_list);
+
+                arr_free_list = (H5FL_arr_list_t *)tmp;
+            } /* end while */
+
+            /* Indicate no free nodes on the free list */
+            head->list_arr[u].list = NULL;
+            head->list_arr[u].onlist = 0;
+
+            /* Decrement count of free memory on this "array" list */
+            head->list_mem-=total_mem;
+
+            /* Decrement global count of free memory on "array" lists */
+            H5FL_arr_gc_head.mem_freed-=total_mem;
+        } /* end if */
+    } /* end for */
+
+    /* Double check that all the memory on this list is recycled */
+    HDassert(head->list_mem==0);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5FL_arr_gc_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_arr_gc
+ *
+ * Purpose:	Garbage collect on all the array object free lists
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 25, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_arr_gc(void)
+{
+    H5FL_gc_arr_node_t *gc_arr_node;    /* Pointer into the list of things to garbage collect */
+    herr_t ret_value=SUCCEED;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Walk through all the free lists, free()'ing the nodes */
+    gc_arr_node=H5FL_arr_gc_head.first;
+    while(gc_arr_node!=NULL) {
+        /* Release the free nodes on the list */
+        if(H5FL_arr_gc_list(gc_arr_node->list)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
+
+        /* Go on to the next free list to garbage collect */
+        gc_arr_node=gc_arr_node->next;
+    } /* end while */
+
+    /* Double check that all the memory on the free lists are recycled */
+    HDassert(H5FL_arr_gc_head.mem_freed==0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_arr_gc() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FL_arr_term
+ PURPOSE
+    Terminate various H5FL array object free lists
+ USAGE
+    int H5FL_arr_term()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5FL_arr_term(void)
+{
+    H5FL_gc_arr_node_t *left;   /* pointer to garbage collection lists with work left */
+    H5FL_gc_arr_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
+    left=NULL;
+    while(H5FL_arr_gc_head.first!=NULL) {
+        tmp=H5FL_arr_gc_head.first->next;
+
+        /* Check if the list has allocations outstanding */
+#ifdef H5FL_DEBUG
+printf("H5FL_arr_term: head->name=%s, head->allocated=%d\n", H5FL_arr_gc_head.first->list->name,(int)H5FL_arr_gc_head.first->list->allocated);
+#endif /* H5FL_DEBUG */
+        if(H5FL_arr_gc_head.first->list->allocated>0) {
+            /* Add free list to the list of nodes with allocations open still */
+            H5FL_arr_gc_head.first->next=left;
+            left=H5FL_arr_gc_head.first;
+        } /* end if */
+        /* No allocations left open for list, get rid of it */
+        else {
+            /* Free the array of free lists */
+            H5MM_xfree(H5FL_arr_gc_head.first->list->list_arr);
+
+            /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+            H5FL_arr_gc_head.first->list->init=0;
+
+            /* Free the node from the garbage collection list */
+            H5MM_free(H5FL_arr_gc_head.first);
+        } /* end else */
+
+        H5FL_arr_gc_head.first=tmp;
+    } /* end while */
+
+    /* Point to the list of nodes left with allocations open, if any */
+    H5FL_arr_gc_head.first=left;
+
+    FUNC_LEAVE_NOAPI(H5FL_arr_gc_head.first!=NULL ? 1 : 0)
+}   /* end H5FL_arr_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_seq_free
+ *
+ * Purpose:	Release a sequence of objects & put on free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, April 3, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_seq_free(H5FL_seq_head_t *head, void *obj)
+{
+    /* NOINIT OK here because this must be called after H5FL_seq_malloc/calloc
+     * -NAF */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(obj);
+
+    /* Make certain that the free list is initialized */
+    HDassert(head->queue.init);
+
+    /* Use block routine */
+    H5FL_blk_free(&(head->queue),obj);
+
+    FUNC_LEAVE_NOAPI(NULL)
+}   /* end H5FL_seq_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_seq_malloc
+ *
+ * Purpose:	Allocate a sequence of objects
+ *
+ * Return:	Success:	Pointer to a valid sequence object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, April 3, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_seq_malloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(elem);
+
+    /* Use block routine */
+    ret_value=H5FL_blk_malloc(&(head->queue),head->size*elem H5FL_TRACK_INFO_INT);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_seq_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_seq_calloc
+ *
+ * Purpose:	Allocate a sequence of objects and clear it to zeros
+ *
+ * Return:	Success:	Pointer to a valid array object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, April 3, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_seq_calloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(elem);
+
+    /* Use block routine */
+    ret_value=H5FL_blk_calloc(&(head->queue),head->size*elem H5FL_TRACK_INFO_INT);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_seq_calloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_seq_realloc
+ *
+ * Purpose:	Reallocate a sequence of objects
+ *
+ * Return:	Success:	Pointer to a valid sequence object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, April 3, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_seq_realloc(H5FL_seq_head_t *head, void * obj, size_t new_elem H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(new_elem);
+
+    /* Use block routine */
+    ret_value=H5FL_blk_realloc(&(head->queue),obj,head->size*new_elem H5FL_TRACK_INFO_INT);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_seq_realloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_init
+ *
+ * Purpose:	Initialize a block factory
+ *
+ * Return:	Success:	Pointer to factory object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, February 2, 2005
+ *
+ * Modifications:
+ *              Neil Fortner
+ *              Friday, December 19, 2008
+ *              Totally rewritten to support new factory implementation
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FL_fac_head_t *
+H5FL_fac_init(size_t size)
+{
+    H5FL_fac_gc_node_t  *new_node = NULL; /* Pointer to the node for the new list to garbage collect */
+    H5FL_fac_head_t     *factory = NULL; /* Pointer to new block factory */
+    H5FL_fac_head_t     *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(size > 0);
+
+    /* Allocate room for the new factory */
+    if(NULL == (factory = (H5FL_fac_head_t *)H5FL_CALLOC(H5FL_fac_head_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for factory object")
+
+    /* Set size of blocks for factory */
+    factory->size = size;
+
+    /* Allocate a new garbage collection node */
+    if(NULL == (new_node = (H5FL_fac_gc_node_t *)H5FL_MALLOC(H5FL_fac_gc_node_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Initialize the new garbage collection node */
+    new_node->list = factory;
+
+    /* Link in to the garbage collection list */
+    new_node->next = H5FL_fac_gc_head.first;
+    H5FL_fac_gc_head.first = new_node;
+    if(new_node->next)
+        new_node->next->list->prev_gc=new_node;
+    /* The new factory's prev_gc field will be set to NULL */
+
+    /* Make certain that the space allocated is large enough to store a free list pointer (eventually) */
+    if(factory->size < sizeof(H5FL_fac_node_t))
+        factory->size = sizeof(H5FL_fac_node_t);
+
+    /* Make certain there's room for tracking information, if any */
+#ifdef H5FL_TRACK
+    factory->size += sizeof(H5FL_track_t);
+#endif /* H5FL_TRACK */
+
+    /* Indicate that the free list is initialized */
+    factory->init = 1;
+
+    /* Set return value */
+    ret_value = factory;
+
+done:
+    if(!ret_value) {
+        if(factory)
+            factory = H5FL_FREE(H5FL_fac_head_t, factory);
+        if(new_node)
+            new_node = H5FL_FREE(H5FL_fac_gc_node_t, new_node);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_free
+ *
+ * Purpose:	Release a block back to a factory & put on free list
+ *
+ * Return:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, February 2, 2005
+ *
+ * Modifications:
+ *              Neil Fortner
+ *              Friday, December 19, 2008
+ *              Totally rewritten to support new factory implementation
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_fac_free(H5FL_fac_head_t *head, void *obj)
+{
+    void *ret_value=NULL;       /* Return value */
+
+    /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(obj);
+
+#ifdef H5FL_TRACK
+    {
+        H5FL_track_t *trk = obj = ((unsigned char *)obj) - sizeof(H5FL_track_t);
+
+        /* Free tracking information about the allocation location */
+        H5CS_close_stack(trk->stack);
+        trk->stack = H5MM_xfree(trk->stack);
+        trk->file = H5MM_xfree(trk->file);
+        trk->func = H5MM_xfree(trk->func);
+
+        /* Remove from "outstanding allocations" list */
+        if(trk == H5FL_out_head_g) {
+            H5FL_out_head_g = H5FL_out_head_g->next;
+            if(H5FL_out_head_g)
+                H5FL_out_head_g->prev = NULL;
+        } /* end if */
+        else {
+            trk->prev->next = trk->next;
+            if(trk->next)
+                trk->next->prev = trk->prev;
+        } /* end else */
+    }
+#endif /* H5FL_TRACK */
+
+#ifdef H5FL_DEBUG
+    HDmemset(obj,255,head->size);
+#endif /* H5FL_DEBUG */
+
+    /* Make certain that the free list is initialized */
+    HDassert(head->init);
+
+    /* Link into the free list */
+    ((H5FL_fac_node_t *)obj)->next=head->list;
+
+    /* Point free list at the node freed */
+    head->list=(H5FL_fac_node_t *)obj;
+
+    /* Increment the number of blocks on free list */
+    head->onlist++;
+
+    /* Increment the amount of "factory" freed memory globally */
+    H5FL_fac_gc_head.mem_freed+=head->size;
+
+    /* Check for exceeding free list memory use limits */
+    /* First check this particular list */
+    if(head->onlist * head->size > H5FL_fac_lst_mem_lim)
+        if(H5FL_fac_gc_list(head)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+    /* Then check the global amount memory on factory free lists */
+    if(H5FL_fac_gc_head.mem_freed > H5FL_fac_glb_mem_lim)
+        if(H5FL_fac_gc()<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_malloc
+ *
+ * Purpose:	Allocate a block from a factory
+ *
+ * Return:	Success:	Pointer to a valid sequence object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, February 2, 2005
+ *
+ * Modifications:
+ *              Neil Fortner
+ *              Friday, December 19, 2008
+ *              Totally rewritten to support new factory implementation
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_fac_malloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Double check parameters */
+    HDassert(head);
+    HDassert(head->init);
+
+    /* Check for nodes available on the free list first */
+    if(head->list!=NULL) {
+        /* Get a pointer to the block on the free list */
+        ret_value=(void *)(head->list);
+
+        /* Remove node from free list */
+        head->list=head->list->next;
+
+        /* Decrement the number of blocks & memory on free list */
+        head->onlist--;
+
+        /* Decrement the amount of global "factory" free list memory in use */
+        H5FL_fac_gc_head.mem_freed-=(head->size);
+    } /* end if */
+    /* Otherwise allocate a node */
+    else {
+        if (NULL==(ret_value = H5FL_malloc(head->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Increment the number of blocks allocated in list */
+        head->allocated++;
+    } /* end else */
+
+#ifdef H5FL_TRACK
+    /* Copy allocation location information */
+    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
+    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
+    ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
+    ((H5FL_track_t *)ret_value)->line = call_line;
+
+    /* Add to "outstanding allocations" list */
+    ((H5FL_track_t *)ret_value)->prev = NULL;
+    ((H5FL_track_t *)ret_value)->next = H5FL_out_head_g;
+    if(H5FL_out_head_g)
+        H5FL_out_head_g->prev = (H5FL_track_t *)ret_value;
+    H5FL_out_head_g = (H5FL_track_t *)ret_value;
+
+    /* Adjust for allocation tracking information */
+    ret_value = ((unsigned char *)ret_value) + sizeof(H5FL_track_t);
+#endif /* H5FL_TRACK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_calloc
+ *
+ * Purpose:	Allocate a block from a factory and clear it to zeros
+ *
+ * Return:	Success:	Pointer to a valid array object
+ * 		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, February 2, 2005
+ *
+ * Modifications:
+ *              Neil Fortner
+ *              Friday, December 19, 2008
+ *              Totally rewritten to support new factory implementation
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5FL_fac_calloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
+{
+    void *ret_value;        /* Pointer to object to return */
+
+    /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Double check parameters */
+    HDassert(head);
+
+    /* Allocate the block */
+    if (NULL==(ret_value = H5FL_fac_malloc(head H5FL_TRACK_INFO_INT)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Clear to zeros */
+    /* (Accomodate tracking information, if present) */
+    HDmemset(ret_value,0,head->size - H5FL_TRACK_SIZE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_calloc() */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_gc_list
+ *
+ * Purpose:	Garbage collect on a particular factory free list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Neil Fortner
+ *              Friday, December 19, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_fac_gc_list(H5FL_fac_head_t *head)
+{
+    H5FL_fac_node_t *free_list; /* Pointer to nodes in free list being garbage collected */
+    void *tmp;          /* Temporary node pointer */
+    size_t total_mem;   /* Total memory used on list */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Calculate the total memory used on this list */
+    total_mem=head->onlist*head->size;
+
+    /* For each free list being garbage collected, walk through the nodes and free them */
+    free_list=head->list;
+    while(free_list!=NULL) {
+        tmp=free_list->next;
+
+        /* Decrement the count of nodes allocated and free the node */
+        head->allocated--;
+
+        H5MM_free(free_list);
+
+        free_list = (H5FL_fac_node_t *)tmp;
+    } /* end while */
+
+    /* Indicate no free nodes on the free list */
+    head->list=NULL;
+    head->onlist=0;
+
+    /* Decrement global count of free memory on "factory" lists */
+    H5FL_fac_gc_head.mem_freed-=total_mem;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5FL_fac_gc_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_gc
+ *
+ * Purpose:	Garbage collect on all the factory free lists
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Neil Fortner
+ *              Friday, December 19, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FL_fac_gc(void)
+{
+    H5FL_fac_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
+    herr_t ret_value=SUCCEED;   /* return value*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Walk through all the free lists, free()'ing the nodes */
+    gc_node=H5FL_fac_gc_head.first;
+    while(gc_node!=NULL) {
+        /* Release the free nodes on the list */
+        if(H5FL_fac_gc_list(gc_node->list)<0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
+
+        /* Go on to the next free list to garbage collect */
+        gc_node=gc_node->next;
+    } /* end while */
+
+    /* Double check that all the memory on the free lists is recycled */
+    HDassert(H5FL_fac_gc_head.mem_freed==0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_gc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_term
+ *
+ * Purpose:	Terminate a block factory
+ *
+ * Return:	Success:	non-negative
+ * 		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, February 2, 2005
+ *
+ * Modifications:
+ *              Neil Fortner
+ *              Friday, December 19, 2008
+ *              Totally rewritten to support new factory implementation
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FL_fac_term(H5FL_fac_head_t *factory)
+{
+    H5FL_fac_gc_node_t *tmp;        /* Temporary pointer to a garbage collection node */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(factory);
+
+    /* Garbage collect all the blocks in the factory's free list */
+    if(H5FL_fac_gc_list(factory)<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of factory failed")
+
+    /* Verify that all the blocks have been freed */
+    if(factory->allocated>0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "factory still has objects allocated")
+
+    /* Unlink block free list for factory from global free list */
+    if(factory->prev_gc) {
+        H5FL_fac_gc_node_t *last = factory->prev_gc;    /* Garbage collection node before the one being removed */
+
+        HDassert(last->next->list == factory);
+        tmp = last->next->next;
+        last->next = H5FL_FREE(H5FL_fac_gc_node_t, last->next);
+        last->next = tmp;
+        if(tmp)
+            tmp->list->prev_gc = last;
+    } else {
+        HDassert(H5FL_fac_gc_head.first->list == factory);
+        tmp = H5FL_fac_gc_head.first->next;
+        H5FL_fac_gc_head.first = H5FL_FREE(H5FL_fac_gc_node_t, H5FL_fac_gc_head.first);
+        H5FL_fac_gc_head.first = tmp;
+        if(tmp)
+            tmp->list->prev_gc = NULL;
+    } /* end else */
+
+    /* Free factory info */
+    factory = H5FL_FREE(H5FL_fac_head_t, factory);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_fac_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_fac_term_all
+ *
+ * Purpose:	Terminate all block factories
+ *
+ * Return:	0.  There should never be any outstanding allocations
+ *              when this is called.
+ *
+ * Programmer:	Neil Fortner
+ *              Friday, December 19, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5FL_fac_term_all(void)
+{
+    H5FL_fac_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the nodes on the garbage collection list */
+    while(H5FL_fac_gc_head.first != NULL) {
+        tmp=H5FL_fac_gc_head.first->next;
+
+#ifdef H5FL_DEBUG
+printf("H5FL_fac_term: head->size=%d, head->allocated=%d\n", (int)H5FL_fac_gc_head.first->list->size,(int)H5FL_fac_gc_head.first->list->allocated);
+#endif /* H5FL_DEBUG */
+
+        /* The list cannot have any allocations outstanding */
+        HDassert(H5FL_fac_gc_head.first->list->allocated == 0);
+
+        /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+        H5FL_fac_gc_head.first->list->init = 0;
+
+        /* Free the node from the garbage collection list */
+        H5FL_fac_gc_head.first = H5FL_FREE(H5FL_fac_gc_node_t, H5FL_fac_gc_head.first);
+
+        H5FL_fac_gc_head.first = tmp;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* end H5FL_fac_term_all() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_garbage_coll
+ *
+ * Purpose:	Garbage collect on all the free lists
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 24, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FL_garbage_coll(void)
+{
+    herr_t                  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Garbage collect the free lists for array objects */
+    if(H5FL_arr_gc()<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect array objects")
+
+    /* Garbage collect free lists for blocks */
+    if(H5FL_blk_gc()<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect block objects")
+
+    /* Garbage collect the free lists for regular objects */
+    if(H5FL_reg_gc()<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect regular objects")
+
+    /* Garbage collect the free lists for factory objects */
+    if(H5FL_fac_gc()<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect regular objects")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_garbage_coll() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FL_set_free_list_limits
+ *
+ * Purpose:	Sets limits on the different kinds of free lists.  Setting a value
+ *      of -1 for a limit means no limit of that type.  These limits are global
+ *      for the entire library.  Each "global" limit only applies to free lists
+ *      of that type, so if an application sets a limit of 1 MB on each of the
+ *      global lists, up to 3 MB of total storage might be allocated (1MB on
+ *      each of regular, array and block type lists).
+ *
+ * Parameters:
+ *  int reg_global_lim;  IN: The limit on all "regular" free list memory used
+ *  int reg_list_lim;    IN: The limit on memory used in each "regular" free list
+ *  int arr_global_lim;  IN: The limit on all "array" free list memory used
+ *  int arr_list_lim;    IN: The limit on memory used in each "array" free list
+ *  int blk_global_lim;  IN: The limit on all "block" free list memory used
+ *  int blk_list_lim;    IN: The limit on memory used in each "block" free list
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, August 2, 2000
+ *
+ * Modifications:   Neil Fortner
+ *                  Wednesday, April 8, 2009
+ *                  Added support for factory free lists
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FL_set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_lim,
+    int arr_list_lim, int blk_global_lim, int blk_list_lim, int fac_global_lim,
+    int fac_list_lim)
+{
+    herr_t                  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Set the limit variables */
+    /* limit on all regular free lists */
+    H5FL_reg_glb_mem_lim=(reg_global_lim==-1 ? UINT_MAX : (size_t)reg_global_lim);
+    /* limit on each regular free list */
+    H5FL_reg_lst_mem_lim=(reg_list_lim==-1 ? UINT_MAX : (size_t)reg_list_lim);
+    /* limit on all array free lists */
+    H5FL_arr_glb_mem_lim=(arr_global_lim==-1 ? UINT_MAX : (size_t)arr_global_lim);
+    /* limit on each array free list */
+    H5FL_arr_lst_mem_lim=(arr_list_lim==-1 ? UINT_MAX : (size_t)arr_list_lim);
+    /* limit on all block free lists */
+    H5FL_blk_glb_mem_lim=(blk_global_lim==-1 ? UINT_MAX : (size_t)blk_global_lim);
+    /* limit on each block free list */
+    H5FL_blk_lst_mem_lim=(blk_list_lim==-1 ? UINT_MAX : (size_t)blk_list_lim);
+    /* limit on all factory free lists */
+    H5FL_fac_glb_mem_lim=(fac_global_lim==-1 ? UINT_MAX : (size_t)fac_global_lim);
+    /* limit on each factory free list */
+    H5FL_fac_lst_mem_lim=(fac_list_lim==-1 ? UINT_MAX : (size_t)fac_list_lim);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FL_set_free_list_limits() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FL_term_interface
+ PURPOSE
+    Terminate various H5FL objects
+ USAGE
+    void H5FL_term_interface()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5FL_term_interface(void)
+{
+    int ret_value=0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Garbage collect any nodes on the free lists */
+    (void)H5FL_garbage_coll();
+
+    ret_value=H5FL_reg_term()+H5FL_fac_term_all()+H5FL_arr_term()+H5FL_blk_term();
+
+#ifdef H5FL_TRACK
+    /* If we haven't freed all the allocated memory, dump out the list now */
+    if(ret_value > 0 && H5FL_out_head_g) {
+        H5FL_track_t *trk = H5FL_out_head_g;
+
+        /* Dump information about all the outstanding allocations */
+        while(trk != NULL) {
+            /* Print information about the outstanding block */
+            HDfprintf(stderr,"%s: Outstanding allocation:\n", "H5FL_term_interface");
+            HDfprintf(stderr,"\tFile: %s, Function: %s, Line: %d\n", trk->file, trk->func, trk->line);
+            H5CS_print_stack(trk->stack, stderr);
+
+            /* Advance to next node */
+            trk = trk->next;
+        } /* end while */
+    } /* end if */
+#endif /* H5FL_TRACK */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FLprivate.h b/gatb-core/thirdparty/hdf5/src/H5FLprivate.h
new file mode 100644
index 0000000..72c6b55
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FLprivate.h
@@ -0,0 +1,430 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FLprivate.h
+ *			Mar 23 2000
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Private non-prototype header.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5FLprivate_H
+#define _H5FLprivate_H
+
+/* Public headers needed by this file */
+#ifdef LATER
+#include "H5FLpublic.h"		/*API prototypes			     */
+#endif /* LATER */
+
+/* Private headers needed by this file */
+
+/* Macros for turning off free lists in the library */
+/*#define H5_NO_FREE_LISTS*/
+#if defined H5_NO_FREE_LISTS || defined H5_USING_MEMCHECKER
+#define H5_NO_REG_FREE_LISTS
+#define H5_NO_ARR_FREE_LISTS
+#define H5_NO_SEQ_FREE_LISTS
+#define H5_NO_BLK_FREE_LISTS
+#define H5_NO_FAC_FREE_LISTS
+#endif /* H5_NO_FREE_LISTS */
+
+/* Macro to track location where block was allocated from */
+/* Uncomment next line to turn on tracking, but don't leave it on after
+ * debugging is done because of the extra overhead it imposes.
+ */
+/* NOTE: This hasn't been extended to all the free-list allocation routines
+ * yet. -QAK
+ */
+/* #define H5FL_TRACK */
+#ifdef H5FL_TRACK
+/* Macro for inclusion in the free list allocation calls */
+#define H5FL_TRACK_INFO         ,__FILE__, FUNC, __LINE__
+
+/* Macro for inclusion in internal free list allocation calls */
+#define H5FL_TRACK_INFO_INT     ,call_file, call_func, call_line
+
+/* Macro for inclusion in the free list allocation parameters */
+#define H5FL_TRACK_PARAMS       ,const char *call_file, const char *call_func, int call_line
+
+/* Forward declarations for structure fields */
+struct H5CS_t;
+
+/* Tracking information for each block */
+typedef struct H5FL_track_t {
+    struct H5CS_t *stack;      /* Function stack */
+    char *file;         /* Name of file containing calling function */
+    char *func;         /* Name of calling function */
+    int line;           /* Line # within calling function */
+    struct H5FL_track_t *next;  /* Pointer to next tracking block */
+    struct H5FL_track_t *prev;  /* Pointer to previous tracking block */
+} H5FL_track_t;
+
+/* Macro for size of tracking information */
+#define H5FL_TRACK_SIZE sizeof(H5FL_track_t)
+
+#else /* H5FL_TRACK */
+#define H5FL_TRACK_INFO
+#define H5FL_TRACK_INFO_INT
+#define H5FL_TRACK_PARAMS
+#define H5FL_TRACK_SIZE         0
+#endif /* H5FL_TRACK */
+
+/*
+ * Private datatypes.
+ */
+
+/* Data structure to store each block in free list */
+typedef struct H5FL_reg_node_t {
+    struct H5FL_reg_node_t *next;   /* Pointer to next block in free list */
+} H5FL_reg_node_t;
+
+/* Data structure for free list of blocks */
+typedef struct H5FL_reg_head_t {
+    unsigned init;      /* Whether the free list has been initialized */
+    unsigned allocated; /* Number of blocks allocated */
+    unsigned onlist;    /* Number of blocks on free list */
+    const char *name;   /* Name of the type */
+    size_t size;        /* Size of the blocks in the list */
+    H5FL_reg_node_t *list;  /* List of free blocks */
+} H5FL_reg_head_t;
+
+/*
+ * Macros for defining & using free lists for a type
+ */
+#define H5FL_REG_NAME(t)        H5_##t##_reg_free_list
+#ifndef H5_NO_REG_FREE_LISTS
+/* Common macros for H5FL_DEFINE & H5FL_DEFINE_STATIC */
+#define H5FL_DEFINE_COMMON(t) H5FL_reg_head_t H5FL_REG_NAME(t)={0,0,0,#t,sizeof(t),NULL}
+
+/* Declare a free list to manage objects of type 't' */
+#define H5FL_DEFINE(t) H5_DLL H5FL_DEFINE_COMMON(t)
+
+/* Reference a free list for type 't' defined in another file */
+#define H5FL_EXTERN(t)  H5_DLLVAR H5FL_reg_head_t H5FL_REG_NAME(t)
+
+/* Declare a static free list to manage objects of type 't' */
+#define H5FL_DEFINE_STATIC(t)  static H5FL_DEFINE_COMMON(t)
+
+/* Allocate an object of type 't' */
+#define H5FL_MALLOC(t) (t *)H5FL_reg_malloc(&(H5FL_REG_NAME(t)) H5FL_TRACK_INFO)
+
+/* Allocate an object of type 't' and clear it to all zeros */
+#define H5FL_CALLOC(t) (t *)H5FL_reg_calloc(&(H5FL_REG_NAME(t)) H5FL_TRACK_INFO)
+
+/* Free an object of type 't' */
+#define H5FL_FREE(t,obj) (t *)H5FL_reg_free(&(H5FL_REG_NAME(t)),obj)
+
+/* Re-allocating an object of type 't' is not defined, because these free-lists
+ * only support fixed sized types, like structs, etc..
+ */
+
+#else /* H5_NO_REG_FREE_LISTS */
+#include "H5MMprivate.h"
+/* Common macro for H5FL_DEFINE & H5FL_DEFINE_STATIC */
+#define H5FL_DEFINE_COMMON(t) int H5_ATTR_UNUSED H5FL_REG_NAME(t)
+
+#define H5FL_DEFINE(t)  H5_DLL H5FL_DEFINE_COMMON(t)
+#define H5FL_EXTERN(t)  H5_DLLVAR H5FL_DEFINE_COMMON(t)
+#define H5FL_DEFINE_STATIC(t)  static H5FL_DEFINE_COMMON(t)
+#define H5FL_MALLOC(t) (t *)H5MM_malloc(sizeof(t))
+#define H5FL_CALLOC(t) (t *)H5MM_calloc(sizeof(t))
+#define H5FL_FREE(t,obj) (t *)H5MM_xfree(obj)
+#endif /* H5_NO_REG_FREE_LISTS */
+
+/* Data structure to store information about each block allocated */
+typedef union H5FL_blk_list_t {
+    size_t size;                /* Size of the page */
+    union H5FL_blk_list_t *next;   /* Pointer to next block in free list */
+    double unused1;         /* Unused normally, just here for aligment */
+    haddr_t unused2;        /* Unused normally, just here for aligment */
+} H5FL_blk_list_t;
+
+/* Data structure for priority queue node of block free lists */
+typedef struct H5FL_blk_node_t {
+    size_t size;                /* Size of the blocks in the list */
+    H5FL_blk_list_t *list;      /* List of free blocks */
+    struct H5FL_blk_node_t *next;    /* Pointer to next free list in queue */
+    struct H5FL_blk_node_t *prev;    /* Pointer to previous free list in queue */
+} H5FL_blk_node_t;
+
+/* Data structure for priority queue of native block free lists */
+typedef struct H5FL_blk_head_t {
+    unsigned init;         /* Whether the free list has been initialized */
+    unsigned allocated;    /* Number of blocks allocated */
+    unsigned onlist;       /* Number of blocks on free list */
+    size_t list_mem;    /* Amount of memory in block on free list */
+    const char *name;   /* Name of the type */
+    H5FL_blk_node_t *head;  /* Pointer to first free list in queue */
+} H5FL_blk_head_t;
+
+/*
+ * Macros for defining & using priority queues
+ */
+#define H5FL_BLK_NAME(t)        H5_##t##_blk_free_list
+#ifndef H5_NO_BLK_FREE_LISTS
+/* Common macro for H5FL_BLK_DEFINE & H5FL_BLK_DEFINE_STATIC */
+#define H5FL_BLK_DEFINE_COMMON(t) H5FL_blk_head_t H5FL_BLK_NAME(t)={0,0,0,0,#t"_blk",NULL}
+
+/* Declare a free list to manage objects of type 't' */
+#define H5FL_BLK_DEFINE(t)  H5_DLL H5FL_BLK_DEFINE_COMMON(t)
+
+/* Reference a free list for type 't' defined in another file */
+#define H5FL_BLK_EXTERN(t)  H5_DLLVAR H5FL_blk_head_t H5FL_BLK_NAME(t)
+
+/* Declare a static free list to manage objects of type 't' */
+#define H5FL_BLK_DEFINE_STATIC(t)  static H5FL_BLK_DEFINE_COMMON(t)
+
+/* Allocate an block of type 't' */
+#define H5FL_BLK_MALLOC(t,size) (uint8_t *)H5FL_blk_malloc(&(H5FL_BLK_NAME(t)),size H5FL_TRACK_INFO)
+
+/* Allocate an block of type 't' and clear it to zeros */
+#define H5FL_BLK_CALLOC(t,size) (uint8_t *)H5FL_blk_calloc(&(H5FL_BLK_NAME(t)),size H5FL_TRACK_INFO)
+
+/* Free a block of type 't' */
+#define H5FL_BLK_FREE(t,blk) (uint8_t *)H5FL_blk_free(&(H5FL_BLK_NAME(t)),blk)
+
+/* Re-allocate a block of type 't' */
+#define H5FL_BLK_REALLOC(t,blk,new_size) (uint8_t *)H5FL_blk_realloc(&(H5FL_BLK_NAME(t)),blk,new_size H5FL_TRACK_INFO)
+
+/* Check if there is a free block available to re-use */
+#define H5FL_BLK_AVAIL(t,size)  H5FL_blk_free_block_avail(&(H5FL_BLK_NAME(t)),size)
+
+#else /* H5_NO_BLK_FREE_LISTS */
+/* Common macro for H5FL_BLK_DEFINE & H5FL_BLK_DEFINE_STATIC */
+#define H5FL_BLK_DEFINE_COMMON(t) int H5_ATTR_UNUSED H5FL_BLK_NAME(t)
+
+#define H5FL_BLK_DEFINE(t)      H5_DLL H5FL_BLK_DEFINE_COMMON(t)
+#define H5FL_BLK_EXTERN(t)      H5_DLLVAR H5FL_BLK_DEFINE_COMMON(t)
+#define H5FL_BLK_DEFINE_STATIC(t)  static H5FL_BLK_DEFINE_COMMON(t)
+#define H5FL_BLK_MALLOC(t,size) (uint8_t *)H5MM_malloc(size)
+#define H5FL_BLK_CALLOC(t,size) (uint8_t *)H5MM_calloc(size)
+#define H5FL_BLK_FREE(t,blk) (uint8_t *)H5MM_xfree(blk)
+#define H5FL_BLK_REALLOC(t,blk,new_size) (uint8_t *)H5MM_realloc(blk,new_size)
+#define H5FL_BLK_AVAIL(t,size)  (FALSE)
+#endif /* H5_NO_BLK_FREE_LISTS */
+
+/* Data structure to store each array in free list */
+typedef union H5FL_arr_list_t {
+    union H5FL_arr_list_t *next;   /* Pointer to next block in free list */
+    size_t nelem;               /* Number of elements in this array */
+    double unused1;             /* Unused normally, just here for aligment */
+    haddr_t unused2;            /* Unused normally, just here for aligment */
+} H5FL_arr_list_t;
+
+/* Data structure for each size of array element */
+typedef struct H5FL_arr_node_t {
+    size_t size;                /* Size of the blocks in the list */
+    unsigned onlist;            /* Number of blocks on free list */
+    H5FL_arr_list_t *list;      /* List of free blocks */
+} H5FL_arr_node_t;
+
+/* Data structure for free list of array blocks */
+typedef struct H5FL_arr_head_t {
+    unsigned init;         /* Whether the free list has been initialized */
+    unsigned allocated;    /* Number of blocks allocated */
+    size_t list_mem;       /* Amount of memory in block on free list */
+    const char *name;      /* Name of the type */
+    int  maxelem;          /* Maximum number of elements in an array */
+    size_t base_size;      /* Size of the "base" object in the list */
+    size_t elem_size;      /* Size of the array elements in the list */
+    H5FL_arr_node_t *list_arr;  /* Array of lists of free blocks */
+} H5FL_arr_head_t;
+
+/*
+ * Macros for defining & using free lists for an array of a type
+ */
+#define H5FL_ARR_NAME(t)        H5_##t##_arr_free_list
+#ifndef H5_NO_ARR_FREE_LISTS
+/* Common macro for H5FL_ARR_DEFINE & H5FL_ARR_DEFINE_STATIC (and H5FL_BARR variants) */
+#define H5FL_ARR_DEFINE_COMMON(b,t,m) H5FL_arr_head_t H5FL_ARR_NAME(t)={0,0,0,#t"_arr",m+1,b,sizeof(t),NULL}
+
+/* Declare a free list to manage arrays of type 't' */
+#define H5FL_ARR_DEFINE(t,m)  H5_DLL H5FL_ARR_DEFINE_COMMON(0,t,m)
+
+/* Declare a free list to manage base 'b' + arrays of type 't' */
+#define H5FL_BARR_DEFINE(b,t,m)  H5_DLL H5FL_ARR_DEFINE_COMMON(sizeof(b),t,m)
+
+/* Reference a free list for arrays of type 't' defined in another file */
+#define H5FL_ARR_EXTERN(t)  H5_DLLVAR H5FL_arr_head_t H5FL_ARR_NAME(t)
+
+/* Declare a static free list to manage arrays of type 't' */
+#define H5FL_ARR_DEFINE_STATIC(t,m)  static H5FL_ARR_DEFINE_COMMON(0,t,m)
+
+/* Declare a static free list to manage base 'b' + arrays of type 't' */
+#define H5FL_BARR_DEFINE_STATIC(b,t,m)  static H5FL_ARR_DEFINE_COMMON(sizeof(b),t,m)
+
+/* Allocate an array of type 't' */
+#define H5FL_ARR_MALLOC(t,elem) H5FL_arr_malloc(&(H5FL_ARR_NAME(t)),elem)
+
+/* Allocate an array of type 't' and clear it to all zeros */
+#define H5FL_ARR_CALLOC(t,elem) H5FL_arr_calloc(&(H5FL_ARR_NAME(t)),elem)
+
+/* Free an array of type 't' */
+#define H5FL_ARR_FREE(t,obj) (t *)H5FL_arr_free(&(H5FL_ARR_NAME(t)),obj)
+
+/* Re-allocate an array of type 't' */
+#define H5FL_ARR_REALLOC(t,obj,new_elem) H5FL_arr_realloc(&(H5FL_ARR_NAME(t)),obj,new_elem)
+
+#else /* H5_NO_ARR_FREE_LISTS */
+/* Common macro for H5FL_ARR_DEFINE & H5FL_ARR_DEFINE_STATIC (and H5FL_BARR variants) */
+#define H5FL_ARR_DEFINE_COMMON(t,m) size_t H5FL_ARR_NAME(t)
+
+#define H5FL_ARR_DEFINE(t,m)    H5_DLL H5FL_ARR_DEFINE_COMMON(t,m) = 0
+#define H5FL_BARR_DEFINE(b,t,m) H5_DLL H5FL_ARR_DEFINE_COMMON(t,m) = sizeof(b)
+#define H5FL_ARR_EXTERN(t)      H5_DLLVAR H5FL_ARR_DEFINE_COMMON(t,m)
+#define H5FL_ARR_DEFINE_STATIC(t,m)  static H5FL_ARR_DEFINE_COMMON(t,m) = 0
+#define H5FL_BARR_DEFINE_STATIC(b,t,m)  static H5FL_ARR_DEFINE_COMMON(t,m) = sizeof(b)
+#define H5FL_ARR_MALLOC(t,elem) H5MM_malloc(H5FL_ARR_NAME(t) + ((elem)*sizeof(t)))
+#define H5FL_ARR_CALLOC(t,elem) H5MM_calloc(H5FL_ARR_NAME(t) + ((elem)*sizeof(t)))
+#define H5FL_ARR_FREE(t,obj) (t *)H5MM_xfree(obj)
+#define H5FL_ARR_REALLOC(t,obj,new_elem) H5MM_realloc(obj,H5FL_ARR_NAME(t) + ((new_elem)*sizeof(t)))
+#endif /* H5_NO_ARR_FREE_LISTS */
+
+/* Data structure for free list of sequence blocks */
+typedef struct H5FL_seq_head_t {
+    H5FL_blk_head_t queue;      /* Priority queue of sequence blocks */
+    size_t size;                /* Size of the sequence elements in the list */
+} H5FL_seq_head_t;
+
+/*
+ * Macros for defining & using free lists for a sequence of a type
+ *
+ * Sequences are like arrays, except they have no upper limit.
+ *
+ */
+#define H5FL_SEQ_NAME(t)        H5_##t##_seq_free_list
+#ifndef H5_NO_SEQ_FREE_LISTS
+/* Common macro for H5FL_SEQ_DEFINE & H5FL_SEQ_DEFINE_STATIC */
+#define H5FL_SEQ_DEFINE_COMMON(t) H5FL_seq_head_t H5FL_SEQ_NAME(t)={{0,0,0,0,#t"_seq",NULL},sizeof(t)}
+
+/* Declare a free list to manage sequences of type 't' */
+#define H5FL_SEQ_DEFINE(t)  H5_DLL H5FL_SEQ_DEFINE_COMMON(t)
+
+/* Reference a free list for sequences of type 't' defined in another file */
+#define H5FL_SEQ_EXTERN(t)  H5_DLLVAR H5FL_seq_head_t H5FL_SEQ_NAME(t)
+
+/* Declare a static free list to manage sequences of type 't' */
+#define H5FL_SEQ_DEFINE_STATIC(t)  static H5FL_SEQ_DEFINE_COMMON(t)
+
+/* Allocate a sequence of type 't' */
+#define H5FL_SEQ_MALLOC(t,elem) (t *)H5FL_seq_malloc(&(H5FL_SEQ_NAME(t)),elem H5FL_TRACK_INFO)
+
+/* Allocate a sequence of type 't' and clear it to all zeros */
+#define H5FL_SEQ_CALLOC(t,elem) (t *)H5FL_seq_calloc(&(H5FL_SEQ_NAME(t)),elem H5FL_TRACK_INFO)
+
+/* Free a sequence of type 't' */
+#define H5FL_SEQ_FREE(t,obj) H5FL_seq_free(&(H5FL_SEQ_NAME(t)),obj)
+
+/* Re-allocate a sequence of type 't' */
+#define H5FL_SEQ_REALLOC(t,obj,new_elem) (t *)H5FL_seq_realloc(&(H5FL_SEQ_NAME(t)),obj,new_elem H5FL_TRACK_INFO)
+
+#else /* H5_NO_SEQ_FREE_LISTS */
+/* Common macro for H5FL_SEQ_DEFINE & H5FL_SEQ_DEFINE_STATIC */
+#define H5FL_SEQ_DEFINE_COMMON(t) int H5_ATTR_UNUSED H5FL_SEQ_NAME(t)
+
+#define H5FL_SEQ_DEFINE(t)      H5_DLL H5FL_SEQ_DEFINE_COMMON(t)
+#define H5FL_SEQ_EXTERN(t)      H5_DLLVAR H5FL_SEQ_DEFINE_COMMON(t)
+#define H5FL_SEQ_DEFINE_STATIC(t)  static H5FL_SEQ_DEFINE_COMMON(t)
+#define H5FL_SEQ_MALLOC(t,elem) (t *)H5MM_malloc((elem)*sizeof(t))
+#define H5FL_SEQ_CALLOC(t,elem) (t *)H5MM_calloc((elem)*sizeof(t))
+#define H5FL_SEQ_FREE(t,obj) (t *)H5MM_xfree(obj)
+#define H5FL_SEQ_REALLOC(t,obj,new_elem) (t *)H5MM_realloc(obj,(new_elem)*sizeof(t))
+#endif /* H5_NO_SEQ_FREE_LISTS */
+
+/* Forward declarations of the data structures for free list block factory */
+typedef struct H5FL_fac_gc_node_t H5FL_fac_gc_node_t;
+typedef struct H5FL_fac_node_t H5FL_fac_node_t;
+
+/* Data structure for free list block factory */
+typedef struct H5FL_fac_head_t {
+    unsigned init;      /* Whether the free list has been initialized */
+    unsigned allocated; /* Number of blocks allocated */
+    unsigned onlist;    /* Number of blocks on free list */
+    size_t size;        /* Size of the blocks in the list */
+    H5FL_fac_node_t *list;  /* List of free blocks */
+    H5FL_fac_gc_node_t *prev_gc; /* Previous garbage collection node in list */
+} H5FL_fac_head_t;
+
+
+/*
+ * Macros for defining & using free list factories
+ *
+ * Factories are dynamically created free list managers for blocks of
+ *      a particular size.
+ *
+ */
+#ifndef H5_NO_FAC_FREE_LISTS
+/* Allocate a block from a factory */
+#define H5FL_FAC_MALLOC(f) H5FL_fac_malloc(f H5FL_TRACK_INFO)
+
+/* Allocate a block from a factory and clear it to all zeros */
+#define H5FL_FAC_CALLOC(f) H5FL_fac_calloc(f H5FL_TRACK_INFO)
+
+/* Return a block to a factory */
+#define H5FL_FAC_FREE(f, obj) H5FL_fac_free(f, obj)
+
+#else /* H5_NO_FAC_FREE_LISTS */
+#define H5FL_FAC_MALLOC(f) H5MM_malloc(f->size)
+#define H5FL_FAC_CALLOC(f) H5MM_calloc(f->size)
+#define H5FL_FAC_FREE(f, obj) H5MM_xfree(obj)
+#endif /* H5_NO_FAC_FREE_LISTS */
+
+/*
+ * Library prototypes.
+ */
+ /* Block free lists */
+H5_DLL void * H5FL_blk_malloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_blk_calloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_blk_free(H5FL_blk_head_t *head, void *block);
+H5_DLL void * H5FL_blk_realloc(H5FL_blk_head_t *head, void *block, size_t new_size H5FL_TRACK_PARAMS);
+H5_DLL htri_t H5FL_blk_free_block_avail(H5FL_blk_head_t *head, size_t size);
+
+/* Regular free lists */
+H5_DLL void * H5FL_reg_malloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_reg_calloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_reg_free(H5FL_reg_head_t *head, void *obj);
+
+/* Array free lists */
+H5_DLL void * H5FL_arr_malloc(H5FL_arr_head_t *head, size_t elem);
+H5_DLL void * H5FL_arr_calloc(H5FL_arr_head_t *head, size_t elem);
+H5_DLL void * H5FL_arr_free(H5FL_arr_head_t *head, void *obj);
+H5_DLL void * H5FL_arr_realloc(H5FL_arr_head_t *head, void *obj, size_t new_elem);
+
+/* Sequence free lists */
+H5_DLL void * H5FL_seq_malloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_seq_calloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_seq_free(H5FL_seq_head_t *head, void *obj);
+H5_DLL void * H5FL_seq_realloc(H5FL_seq_head_t *head, void *obj, size_t new_elem H5FL_TRACK_PARAMS);
+
+/* Factory free lists */
+H5_DLL H5FL_fac_head_t *H5FL_fac_init(size_t size);
+H5_DLL void * H5FL_fac_malloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_fac_calloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS);
+H5_DLL void * H5FL_fac_free(H5FL_fac_head_t *head, void *obj);
+H5_DLL herr_t H5FL_fac_term(H5FL_fac_head_t *head);
+
+/* General free list routines */
+H5_DLL herr_t H5FL_garbage_coll(void);
+H5_DLL herr_t H5FL_set_free_list_limits(int reg_global_lim, int reg_list_lim,
+    int arr_global_lim, int arr_list_lim, int blk_global_lim, int blk_list_lim,
+    int fac_global_lim, int fac_list_lim);
+H5_DLL int   H5FL_term_interface(void);
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5FO.c b/gatb-core/thirdparty/hdf5/src/H5FO.c
new file mode 100644
index 0000000..a6c47cb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FO.c
@@ -0,0 +1,604 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Open object info algorithms.
+ *
+ * These are used to track the objects currently open in a file, for various
+ * internal mechanisms which need to be aware of such things.
+ *
+ */
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access                          */
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5Oprivate.h"		/* Object headers		  	*/
+
+/* Private typedefs */
+
+/* Information about open objects in a file */
+typedef struct H5FO_open_obj_t {
+    haddr_t addr;                       /* Address of object header for object */
+    void *obj;                          /* Pointer to the object            */
+    hbool_t deleted;                    /* Flag to indicate that the object was deleted from the file */
+} H5FO_open_obj_t;
+
+/* Information about counted objects in a file */
+typedef struct H5FO_obj_count_t {
+    haddr_t addr;                       /* Address of object header for object */
+    hsize_t count;                      /* Number of times object is opened */
+} H5FO_obj_count_t;
+
+/* Declare a free list to manage the H5FO_open_obj_t struct */
+H5FL_DEFINE_STATIC(H5FO_open_obj_t);
+
+/* Declare a free list to manage the H5FO_obj_count_t struct */
+H5FL_DEFINE_STATIC(H5FO_obj_count_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_create
+ PURPOSE
+    Create an open object info set
+ USAGE
+    herr_t H5FO_create(f)
+        H5F_t *f;       IN/OUT: File to create opened object info set for
+
+ RETURNS
+    Returns non-negative on success, negative on failure
+ DESCRIPTION
+    Create a new open object info set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_create(const H5F_t *f)
+{
+    herr_t ret_value=SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Create container used to store open object info */
+    if((f->shared->open_objs = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to create open object container")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_opened
+ PURPOSE
+    Checks if an object at an address is already open in the file.
+ USAGE
+    void * H5FO_opened(f,addr)
+        const H5F_t *f;         IN: File to check opened object info set
+        haddr_t addr;           IN: Address of object to check
+
+ RETURNS
+    Returns a pointer to the object on success, NULL on failure
+ DESCRIPTION
+    Check is an object at an address (the address of the object's object header)
+    is already open in the file and return the ID for that object if it is open.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5FO_opened(const H5F_t *f, haddr_t addr)
+{
+    H5FO_open_obj_t *open_obj;  /* Information about open object */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (open_obj = (H5FO_open_obj_t *)H5SL_search(f->shared->open_objs,&addr))) {
+        ret_value = open_obj->obj;
+        HDassert(ret_value != NULL);
+    } /* end if */
+    else
+        ret_value = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_opened() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_insert
+ PURPOSE
+    Insert a newly opened object/pointer pair into the opened object info set
+ USAGE
+    herr_t H5FO_insert(f,addr,obj)
+        H5F_t *f;               IN/OUT: File's opened object info set
+        haddr_t addr;           IN: Address of object to insert
+        void *obj;              IN: Pointer to object to insert
+        hbool_t delete_flag;    IN: Whether to 'mark' this object for deletion
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Insert an object/ID pair into the opened object info set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_insert(const H5F_t *f, haddr_t addr, void *obj, hbool_t delete_flag)
+{
+    H5FO_open_obj_t *open_obj;  /* Information about open object */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(obj);
+
+    /* Allocate new opened object information structure */
+    if((open_obj=H5FL_MALLOC(H5FO_open_obj_t))==NULL)
+        HGOTO_ERROR(H5E_CACHE,H5E_NOSPACE,FAIL,"memory allocation failed")
+
+    /* Assign information */
+    open_obj->addr=addr;
+    open_obj->obj=obj;
+    open_obj->deleted=delete_flag;
+
+    /* Insert into container */
+    if(H5SL_insert(f->shared->open_objs,&open_obj->addr,open_obj)<0)
+        HGOTO_ERROR(H5E_CACHE,H5E_CANTINSERT,FAIL,"can't insert object into container")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_insert() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_delete
+ PURPOSE
+    Remove an opened object/ID pair from the opened object info set
+ USAGE
+    herr_t H5FO_delete(f,addr)
+        H5F_t *f;               IN/OUT: File's opened object info set
+        haddr_t addr;           IN: Address of object to remove
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Remove an object/ID pair from the opened object info.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
+{
+    H5FO_open_obj_t *open_obj;  /* Information about open object */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Remove from container */
+    if(NULL == (open_obj = (H5FO_open_obj_t *)H5SL_remove(f->shared->open_objs, &addr)))
+        HGOTO_ERROR(H5E_CACHE,H5E_CANTRELEASE,FAIL,"can't remove object from container")
+
+    /* Check if the object was deleted from the file */
+    if(open_obj->deleted) {
+        if(H5O_delete(f, dxpl_id, addr) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file")
+    } /* end if */
+
+    /* Release the object information */
+    open_obj = H5FL_FREE(H5FO_open_obj_t, open_obj);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_delete() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_mark
+ PURPOSE
+    Mark an object to be deleted when it is closed
+ USAGE
+    herr_t H5FO_mark(f,addr)
+        const H5F_t *f;         IN: File opened object is in
+        haddr_t addr;           IN: Address of object to delete
+
+ RETURNS
+    Returns a non-negative ID for the object on success, negative on failure
+ DESCRIPTION
+    Mark an opened object for deletion from the file when it is closed.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_mark(const H5F_t *f, haddr_t addr, hbool_t deleted)
+{
+    H5FO_open_obj_t *open_obj;  /* Information about open object */
+    herr_t ret_value=SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (open_obj = (H5FO_open_obj_t *)H5SL_search(f->shared->open_objs, &addr)))
+        open_obj->deleted = deleted;
+    else
+        ret_value = FAIL;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_mark() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_marked
+ PURPOSE
+    Check if an object is marked to be deleted when it is closed
+ USAGE
+    hbool_t H5FO_marked(f,addr)
+        const H5F_t *f;         IN: File opened object is in
+        haddr_t addr;           IN: Address of object to delete
+
+ RETURNS
+    Returns a TRUE/FALSE on success
+ DESCRIPTION
+    Checks if the object is currently in the "opened objects" tree and
+    whether its marks for deletion from the file when it is closed.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hbool_t
+H5FO_marked(const H5F_t *f, haddr_t addr)
+{
+    H5FO_open_obj_t *open_obj;  /* Information about open object */
+    hbool_t ret_value = FALSE;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (open_obj = (H5FO_open_obj_t *)H5SL_search(f->shared->open_objs, &addr)))
+        ret_value = open_obj->deleted;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_marked() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_dest
+ PURPOSE
+    Destroy an open object info set
+ USAGE
+    herr_t H5FO_dest(f)
+        H5F_t *f;               IN/OUT: File's opened object info set
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Destroy an existing open object info set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_dest(const H5F_t *f)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->open_objs);
+
+    /* Check if the object info set is empty */
+    if(H5SL_count(f->shared->open_objs)!=0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "objects still in open object info set")
+
+    /* Release the open object info set container */
+    if(H5SL_close(f->shared->open_objs)<0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCLOSEOBJ, FAIL, "can't close open object info set")
+
+    f->shared->open_objs=NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_dest() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_top_create
+ PURPOSE
+    Create the "top" open object count set
+ USAGE
+    herr_t H5FO_create(f)
+        H5F_t *f;       IN/OUT: File to create opened object count set for
+
+ RETURNS
+    Returns non-negative on success, negative on failure
+ DESCRIPTION
+    Create a new open object count set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_top_create(H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Create container used to store open object info */
+    if((f->obj_count = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to create open object container")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_top_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_top_incr
+ PURPOSE
+    Increment the "top" reference count for an object in a file
+ USAGE
+    herr_t H5FO_top_incr(f, addr)
+        H5F_t *f;               IN/OUT: File's opened object info set
+        haddr_t addr;           IN: Address of object to increment
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Increment the reference count for an object in the opened object count set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_top_incr(const H5F_t *f, haddr_t addr)
+{
+    H5FO_obj_count_t *obj_count;  /* Ref. count for object */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->obj_count);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (obj_count = (H5FO_obj_count_t *)H5SL_search(f->obj_count, &addr))) {
+        (obj_count->count)++;
+    } /* end if */
+    else {
+        /* Allocate new opened object information structure */
+        if(NULL == (obj_count = H5FL_MALLOC(H5FO_obj_count_t)))
+            HGOTO_ERROR(H5E_CACHE,H5E_NOSPACE,FAIL,"memory allocation failed")
+
+        /* Assign information */
+        obj_count->addr = addr;
+        obj_count->count = 1;
+
+        /* Insert into container */
+        if(H5SL_insert(f->obj_count, &obj_count->addr, obj_count) < 0)
+            HGOTO_ERROR(H5E_CACHE,H5E_CANTINSERT,FAIL,"can't insert object into container")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_top_incr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_top_decr
+ PURPOSE
+    Decrement the "top" reference count for an object in a file
+ USAGE
+    herr_t H5FO_top_decr(f, addr)
+        H5F_t *f;               IN/OUT: File's opened object info set
+        haddr_t addr;           IN: Address of object to decrement
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Decrement the reference count for an object in the opened object count set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_top_decr(const H5F_t *f, haddr_t addr)
+{
+    H5FO_obj_count_t *obj_count;  /* Ref. count for object */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->obj_count);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (obj_count = (H5FO_obj_count_t *)H5SL_search(f->obj_count, &addr))) {
+        /* Decrement the reference count for the object */
+        (obj_count->count)--;
+
+        if(obj_count->count == 0) {
+            /* Remove from container */
+            if(NULL == (obj_count = (H5FO_obj_count_t *)H5SL_remove(f->obj_count, &addr)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "can't remove object from container")
+
+            /* Release the object information */
+            obj_count = H5FL_FREE(H5FO_obj_count_t, obj_count);
+        } /* end if */
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't decrement ref. count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_top_decr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_top_count
+ PURPOSE
+    Return the "top" reference count for an object in a file
+ USAGE
+    hsize_t H5FO_top_incr(f, addr)
+        H5F_t *f;               IN/OUT: File's opened object info set
+        haddr_t addr;           IN: Address of object to increment
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the reference count for an object in the opened object count set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t
+H5FO_top_count(const H5F_t *f, haddr_t addr)
+{
+    H5FO_obj_count_t *obj_count;        /* Ref. count for object */
+    hsize_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->obj_count);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Get the object node from the container */
+    if(NULL != (obj_count = (H5FO_obj_count_t *)H5SL_search(f->obj_count, &addr)))
+        ret_value = obj_count->count;
+    else
+        ret_value = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_top_count() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5FO_top_dest
+ PURPOSE
+    Destroy an open object info set
+ USAGE
+    herr_t H5FO_top_dest(f)
+        H5F_t *f;               IN/OUT: File's opened object info set
+
+ RETURNS
+    Returns a non-negative on success, negative on failure
+ DESCRIPTION
+    Destroy an existing open object info set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5FO_top_dest(H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->obj_count);
+
+    /* Check if the object count set is empty */
+    if(H5SL_count(f->obj_count) != 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "objects still in open object info set")
+
+    /* Release the open object count set container */
+    if(H5SL_close(f->obj_count) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCLOSEOBJ, FAIL, "can't close open object info set")
+
+    f->obj_count = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FO_top_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FOprivate.h b/gatb-core/thirdparty/hdf5/src/H5FOprivate.h
new file mode 100644
index 0000000..4648f02
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FOprivate.h
@@ -0,0 +1,53 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains library private information about the H5FO module
+ */
+#ifndef _H5FOprivate_H
+#define _H5FOprivate_H
+
+#ifdef LATER
+#include "H5FOpublic.h"
+#endif /* LATER */
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+/* Typedefs */
+
+/* Typedef for open object cache */
+typedef H5SL_t H5FO_t;       /* Currently, all open objects are stored in skip list */
+
+/* Macros */
+
+/* Private routines */
+H5_DLL herr_t H5FO_create(const H5F_t *f);
+H5_DLL void  *H5FO_opened(const H5F_t *f, haddr_t addr);
+H5_DLL herr_t H5FO_insert(const H5F_t *f, haddr_t addr, void *obj, hbool_t delete_flag);
+H5_DLL herr_t H5FO_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+H5_DLL herr_t H5FO_mark(const H5F_t *f, haddr_t addr, hbool_t deleted);
+H5_DLL hbool_t H5FO_marked(const H5F_t *f, haddr_t addr);
+H5_DLL herr_t H5FO_dest(const H5F_t *f);
+H5_DLL herr_t H5FO_top_create(H5F_t *f);
+H5_DLL herr_t H5FO_top_incr(const H5F_t *f, haddr_t addr);
+H5_DLL herr_t H5FO_top_decr(const H5F_t *f, haddr_t addr);
+H5_DLL hsize_t H5FO_top_count(const H5F_t *f, haddr_t addr);
+H5_DLL herr_t H5FO_top_dest(H5F_t *f);
+
+#endif /* _H5FOprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FS.c b/gatb-core/thirdparty/hdf5/src/H5FS.c
new file mode 100644
index 0000000..38a5a77
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FS.c
@@ -0,0 +1,958 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Tuesday, May  2, 2006
+ *
+ * Purpose:	Free space tracking functions.
+ *
+ * Note:	(Used to be in the H5HFflist.c file, prior to the date above)
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* File free space			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Section info routines */
+static herr_t H5FS_sinfo_free_sect_cb(void *item, void *key, void *op_data);
+static herr_t H5FS_sinfo_free_node_cb(void *item, void *key, void *op_data);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5FS_section_class_t sequence information */
+H5FL_SEQ_DEFINE(H5FS_section_class_t);
+
+/* Declare a free list to manage the H5FS_t struct */
+H5FL_DEFINE(H5FS_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_create
+ *
+ * Purpose:	Allocate & initialize file free space info
+ *
+ * Return:	Success:	Pointer to free space structure
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March  7, 2006
+ *
+ * Modifications:
+ *	Vailin Choi, July 29th, 2008
+ *	  Add two more parameters for handling alignment: alignment & threshhold
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FS_t *
+H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr, const H5FS_create_t *fs_create,
+    size_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold)
+{
+    H5FS_t *fspace = NULL;      /* New free space structure */
+    H5FS_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, nclasses);
+#endif /* H5FS_DEBUG */
+
+    /* Check arguments. */
+    HDassert(fs_create->shrink_percent);
+    HDassert(fs_create->shrink_percent < fs_create->expand_percent);
+    HDassert(fs_create->max_sect_size);
+    HDassert(nclasses == 0 || classes);
+
+    /*
+     * Allocate free space structure
+     */
+    if(NULL == (fspace = H5FS_new(f, nclasses, classes, cls_init_udata)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
+
+    /* Initialize creation information for free space manager */
+    fspace->client = fs_create->client;
+    fspace->shrink_percent = fs_create->shrink_percent;
+    fspace->expand_percent = fs_create->expand_percent;
+    fspace->max_sect_addr = fs_create->max_sect_addr;
+    fspace->max_sect_size = fs_create->max_sect_size;
+
+    fspace->alignment = alignment;
+    fspace->threshold = threshold;
+
+    /* Check if the free space tracker is supposed to be persistant */
+    if(fs_addr) {
+        /* Allocate space for the free space header */
+        if(HADDR_UNDEF == (fspace->addr = H5MF_alloc(f, H5FD_MEM_FSPACE_HDR, dxpl_id, (hsize_t)fspace->hdr_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "file allocation failed for free space header")
+
+        /* Cache the new free space header (pinned) */
+        if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_HDR, fspace->addr, fspace, H5AC__PIN_ENTRY_FLAG) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, NULL, "can't add free space header to cache")
+
+        /* Return free space header address to caller, if desired */
+        *fs_addr = fspace->addr;
+    } /* end if */
+
+    /* Set the reference count to 1, since we inserted the entry in the cache pinned */
+    fspace->rc = 1;
+
+    /* Set the return value */
+    ret_value = fspace;
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: fspace = %p, fspace->addr = %a\n", FUNC, fspace, fspace->addr);
+#endif /* H5FS_DEBUG */
+
+done:
+    if(!ret_value && fspace)
+        if(H5FS_hdr_dest(fspace) < 0)
+            HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space header")
+
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* H5FS_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_open
+ *
+ * Purpose:	Open an existing file free space info structure on disk
+ *
+ * Return:	Success:	Pointer to free space structure
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May  2, 2006
+ *
+ * Modfications:
+ *
+ *	Vailin Choi, July 29th, 2008
+ *	  Add two more parameters for handling alignment: alignment & threshhold
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FS_t *
+H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, size_t nclasses,
+    const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold)
+{
+    H5FS_t *fspace = NULL;      /* New free space structure */
+    H5FS_hdr_cache_ud_t cache_udata; /* User-data for metadata cache callback */
+    H5FS_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Opening free space manager, fs_addr = %a, nclasses = %Zu\n", FUNC, fs_addr, nclasses);
+#endif /* H5FS_DEBUG */
+
+    /* Check arguments. */
+    HDassert(H5F_addr_defined(fs_addr));
+    HDassert(nclasses);
+    HDassert(classes);
+
+    /* Initialize user data for protecting the free space manager */
+    cache_udata.f = f;
+    cache_udata.nclasses = nclasses;
+    cache_udata.classes = classes;
+    cache_udata.cls_init_udata = cls_init_udata;
+    cache_udata.addr = fs_addr;
+
+    /* Protect the free space header */
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_READ)))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, NULL, "unable to load free space header")
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: fspace->sect_addr = %a\n", FUNC, fspace->sect_addr);
+HDfprintf(stderr, "%s: fspace->sect_size = %Hu\n", FUNC, fspace->sect_size);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu\n", FUNC, fspace->alloc_sect_size);
+HDfprintf(stderr, "%s: fspace->sinfo = %p\n", FUNC, fspace->sinfo);
+HDfprintf(stderr, "%s: fspace->rc = %u\n", FUNC, fspace->rc);
+#endif /* H5FS_DEBUG */
+
+    /* Increment the reference count on the free space manager header */
+    HDassert(fspace->rc <= 1);
+    if(H5FS_incr(fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINC, NULL, "unable to increment ref. count on free space header")
+
+    fspace->alignment = alignment;
+    fspace->threshold = threshold;
+
+    /* Unlock free space header */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, NULL, "unable to release free space header")
+
+    /* Set return value */
+    ret_value = fspace;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_delete
+ *
+ * Purpose:	Delete a free space manager on disk
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_delete(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr)
+{
+    H5FS_t *fspace = NULL;              /* Free space header loaded from file */
+    H5FS_hdr_cache_ud_t cache_udata; /* User-data for metadata cache callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Deleting free space manager, fs_addr = %a\n", FUNC, fs_addr);
+#endif /* H5FS_DEBUG */
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fs_addr));
+
+    /* Initialize user data for protecting the free space manager */
+    /* (no class information necessary for delete) */
+    cache_udata.f = f;
+    cache_udata.nclasses = 0;
+    cache_udata.classes = NULL;
+    cache_udata.cls_init_udata = NULL;
+    cache_udata.addr = fs_addr;
+
+    /* Protect the free space header */
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to protect free space header")
+
+    /* Sanity check */
+    HDassert(fspace->sinfo == NULL);
+
+    /* Delete serialized section storage, if there are any */
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: fspace->sect_addr = %a\n", FUNC, fspace->sect_addr);
+#endif /* H5FS_DEBUG */
+    if(fspace->serial_sect_count > 0) {
+        unsigned sinfo_status = 0;      /* Free space section info's status in the metadata cache */
+
+        /* Sanity check */
+        HDassert(H5F_addr_defined(fspace->sect_addr));
+        HDassert(fspace->alloc_sect_size > 0);
+
+        /* Check the free space section info's status in the metadata cache */
+        if(H5AC_get_entry_status(f, fspace->sect_addr, &sinfo_status) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for free space section info")
+
+        /* If the free space section info is in the cache, expunge it now */
+        if(sinfo_status & H5AC_ES__IN_CACHE) {
+            /* Sanity checks on direct block */
+            HDassert(!(sinfo_status & H5AC_ES__IS_PINNED));
+            HDassert(!(sinfo_status & H5AC_ES__IS_PROTECTED));
+
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Expunging free space section info from cache\n", FUNC);
+#endif /* H5FS_DEBUG */
+            /* Evict the free space section info from the metadata cache */
+            /* (Free file space) */
+            if(H5AC_expunge_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, H5AC__FREE_FILE_SPACE_FLAG) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove free space section info from cache")
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Done expunging free space section info from cache\n", FUNC);
+#endif /* H5FS_DEBUG */
+        } /* end if */
+        else {
+            /* Release the space in the file */
+            if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to release free space sections")
+        } /* end else */
+    } /* end if */
+
+done:
+    if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_close
+ *
+ * Purpose:	Destroy & deallocate free list structure, serializing sections
+ *              in the bins
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Entering, fspace = %p, fspace->addr = %a, fspace->sinfo = %p\n", FUNC, fspace, fspace->addr, fspace->sinfo);
+#endif /* H5FS_DEBUG */
+
+    /* Check if section info is valid */
+    /* (i.e. the header "owns" the section info and it's not in the cache) */
+    if(fspace->sinfo) {
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu, fspace->serial_sect_count = %Hu, fspace->sect_addr = %a, fspace->rc = %u\n", FUNC, fspace->tot_sect_count, fspace->serial_sect_count, fspace->sect_addr, fspace->rc);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
+#endif /* H5FS_DEBUG */
+        /* If there are sections to serialize, update them */
+        /* (if the free space manager is persistant) */
+        if(fspace->serial_sect_count > 0 && H5F_addr_defined(fspace->addr)) {
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Real sections to store in file\n", FUNC);
+#endif /* H5FS_DEBUG */
+            if(fspace->sinfo->dirty) {
+                /* Check if the section info is "floating" */
+                if(!H5F_addr_defined(fspace->sect_addr)) {
+                    /* Sanity check */
+                    HDassert(fspace->sect_size > 0);
+
+                    /* Allocate space for the section info in file */
+                    if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+                    fspace->alloc_sect_size = (size_t)fspace->sect_size;
+
+                    /* Mark free space header as dirty */
+                    if(H5AC_mark_entry_dirty(fspace) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+                } /* end if */
+            } /* end if */
+	    else
+		/* Sanity check that section info has address */
+		HDassert(H5F_addr_defined(fspace->sect_addr));
+
+            /* Cache the free space section info */
+            if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space sections to cache")
+        } /* end if */
+        else {
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: NOT storing section info in file\n", FUNC);
+#endif /* H5FS_DEBUG */
+            /* Check if space for the section info is allocated */
+            if(H5F_addr_defined(fspace->sect_addr)) {
+                /* Sanity check */
+                /* (section info should only be in the file if the header is */
+                HDassert(H5F_addr_defined(fspace->addr));
+
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Section info allocated though\n", FUNC);
+#endif /* H5FS_DEBUG */
+                /* Check if the section info is for the free space in the file */
+                /* (NOTE: This is the "bootstrapping" special case for the
+                 *      free space manager, to avoid freeing the space for the
+                 *      section info and re-creating it as a section in the
+                 *      manager. -QAK)
+                 */
+                if(fspace->client == H5FS_CLIENT_FILE_ID) {
+                    htri_t status;          /* "can absorb" status for section into */
+
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Section info is for file free space\n", FUNC);
+#endif /* H5FS_DEBUG */
+                    /* Try to shrink the file or absorb the section info into a block aggregator */
+                    if((status = H5MF_try_shrink(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size)) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for absorbing section info")
+                    else if(status == FALSE) {
+                        /* Section info can't "go away", but it's free.  Allow
+                         *      header to record it
+                         */
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Section info can't 'go away', header will own it\n", FUNC);
+#endif /* H5FS_DEBUG */
+                    } /* end if */
+                    else {
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Section info went 'go away'\n", FUNC);
+#endif /* H5FS_DEBUG */
+                        /* Reset section info in header */
+                        fspace->sect_addr = HADDR_UNDEF;
+                        fspace->alloc_sect_size = 0;
+
+                        /* Mark free space header as dirty */
+                        if(H5AC_mark_entry_dirty(fspace) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+                    } /* end else */
+                } /* end if */
+                else {
+                    haddr_t old_sect_addr = fspace->sect_addr;   /* Previous location of section info in file */
+                    hsize_t old_alloc_sect_size = fspace->alloc_sect_size;       /* Previous size of section info in file */
+
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Section info is NOT for file free space\n", FUNC);
+#endif /* H5FS_DEBUG */
+                    /* Reset section info in header */
+                    fspace->sect_addr = HADDR_UNDEF;
+                    fspace->alloc_sect_size = 0;
+
+                    /* Mark free space header as dirty */
+                    if(H5AC_mark_entry_dirty(fspace) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+
+                    /* Free previous serialized sections disk space */
+                    if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
+                } /* end if */
+            } /* end else */
+
+            /* Destroy section info */
+            if(H5FS_sinfo_dest(fspace->sinfo) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "unable to destroy free space section info")
+        } /* end else */
+
+        /* Reset the header's pointer to the section info */
+        fspace->sinfo = NULL;
+    } /* end if */
+    else {
+        /* Just sanity checks... */
+        if(fspace->serial_sect_count > 0)
+            /* Sanity check that section info has address */
+            HDassert(H5F_addr_defined(fspace->sect_addr));
+        else
+            /* Sanity check that section info doesn't have address */
+            HDassert(!H5F_addr_defined(fspace->sect_addr));
+    } /* end else */
+
+    /* Decrement the reference count on the free space manager header */
+    if(H5FS_decr(fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTDEC, FAIL, "unable to decrement ref. count on free space header")
+
+done:
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d, fspace->rc = %u\n", FUNC, ret_value, fspace->rc);
+#endif /* H5FS_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_new
+ *
+ * Purpose:	Create new free space manager structure
+ *
+ * Return:	Success:	non-NULL, pointer to new free space manager struct
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 31, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FS_t *
+H5FS_new(const H5F_t *f, size_t nclasses, const H5FS_section_class_t *classes[],
+    void *cls_init_udata)
+{
+    H5FS_t *fspace = NULL;      /* Free space manager */
+    size_t u;                   /* Local index variable */
+    H5FS_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(nclasses == 0 || (nclasses > 0 && classes));
+
+    /*
+     * Allocate free space structure
+     */
+    if(NULL == (fspace = H5FL_CALLOC(H5FS_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
+
+    /* Set immutable free list parameters */
+    fspace->nclasses = nclasses;
+    if(nclasses > 0) {
+        if(NULL == (fspace->sect_cls = H5FL_SEQ_MALLOC(H5FS_section_class_t, nclasses)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space section class array")
+
+        /* Initialize the section classes for this free space list */
+        for(u = 0; u < nclasses; u++) {
+            /* Make certain that section class type can be used as an array index into this array */
+            HDassert(u == classes[u]->type);
+
+            /* Copy the class information into the free space manager */
+            HDmemcpy(&fspace->sect_cls[u], classes[u], sizeof(H5FS_section_class_t));
+
+            /* Call the class initialization routine, if there is one */
+            if(fspace->sect_cls[u].init_cls)
+                if((fspace->sect_cls[u].init_cls)(&fspace->sect_cls[u], cls_init_udata) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "unable to initialize section class")
+
+            /* Determine maximum class-specific serialization size for each section */
+            if(fspace->sect_cls[u].serial_size > fspace->max_cls_serial_size)
+                fspace->max_cls_serial_size = fspace->sect_cls[u].serial_size;
+        } /* end for */
+    } /* end if */
+
+    /* Initialize non-zero information for new free space manager */
+    fspace->addr = HADDR_UNDEF;
+    fspace->hdr_size = H5FS_HEADER_SIZE(f);
+    fspace->sect_addr = HADDR_UNDEF;
+
+    /* Set return value */
+    ret_value = fspace;
+
+done:
+    if(!ret_value)
+        if(fspace) {
+            /* Should probably call the class 'term' callback for all classes
+             *  that have had their 'init' callback called... -QAK
+             */
+            if(fspace->sect_cls)
+                fspace->sect_cls = (H5FS_section_class_t *)H5FL_SEQ_FREE(H5FS_section_class_t, fspace->sect_cls);
+            fspace = H5FL_FREE(H5FS_t, fspace);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_size
+ *
+ * Purpose:     Collect meta storage info used by the free space manager
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *              June 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(meta_size);
+
+    /* Get the free space size info */
+    *meta_size += fspace->hdr_size + (fspace->sinfo ? fspace->sect_size : fspace->alloc_sect_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_incr
+ *
+ * Purpose:     Increment reference count on free space header
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Quincey Koziol
+ *              February  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_incr(H5FS_t *fspace)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Entering, fpace->addr = %a, fspace->rc = %u\n", FUNC, fspace->addr, fspace->rc);
+#endif /* H5FS_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fspace);
+
+    /* Check if we should pin the header in the cache */
+    if(fspace->rc == 0 && H5F_addr_defined(fspace->addr))
+        if(H5AC_pin_protected_entry(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTPIN, FAIL, "unable to pin free space header")
+
+    /* Increment reference count on header */
+    fspace->rc++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_decr
+ *
+ * Purpose:     Decrement reference count on free space header
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Quincey Koziol
+ *              February  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_decr(H5FS_t *fspace)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Entering, fpace->addr = %a, fspace->rc = %u\n", FUNC, fspace->addr, fspace->rc);
+#endif /* H5FS_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fspace);
+
+    /* Decrement reference count on header */
+    fspace->rc--;
+
+    /* Check if we should unpin the header in the cache */
+    if(fspace->rc == 0) {
+        if(H5F_addr_defined(fspace->addr)) {
+            if(H5AC_unpin_entry(fspace) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin free space header")
+        } /* end if */
+        else {
+            if(H5FS_hdr_dest(fspace) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "unable to destroy free space header")
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_dirty
+ *
+ * Purpose:	Mark free space header as dirty
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 14 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_dirty(H5FS_t *fspace)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef QAK
+HDfprintf(stderr, "%s: Marking free space header as dirty\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(fspace);
+
+    /* Check if the free space manager is persistant */
+    if(H5F_addr_defined(fspace->addr))
+        /* Mark header as dirty in cache */
+        if(H5AC_mark_entry_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_hdr_dest
+ *
+ * Purpose:	Destroys a free space header in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_hdr_dest(H5FS_t *fspace)
+{
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fspace);
+
+    /* Terminate the section classes for this free space list */
+    for(u = 0; u < fspace->nclasses ; u++) {
+        /* Call the class termination routine, if there is one */
+        if(fspace->sect_cls[u].term_cls)
+            if((fspace->sect_cls[u].term_cls)(&fspace->sect_cls[u]) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "unable to finalize section class")
+    } /* end for */
+
+    /* Release the memory for the free space section classes */
+    if(fspace->sect_cls)
+        fspace->sect_cls = (H5FS_section_class_t *)H5FL_SEQ_FREE(H5FS_section_class_t, fspace->sect_cls);
+
+    /* Free free space info */
+    fspace = H5FL_FREE(H5FS_t, fspace);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_hdr_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_free_sect_cb
+ *
+ * Purpose:	Free a size-tracking node for a bin
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_free_sect_cb(void *_sect, void H5_ATTR_UNUSED *key, void *op_data)
+{
+    H5FS_section_info_t *sect = (H5FS_section_info_t *)_sect;   /* Section to free */
+    const H5FS_sinfo_t *sinfo = (const H5FS_sinfo_t *)op_data;     /* Free space manager for section */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(sect);
+    HDassert(sinfo);
+
+    /* Call the section's class 'free' method on the section */
+    (*sinfo->fspace->sect_cls[sect->type].free)(sect);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5FS_sinfo_free_sect_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_free_node_cb
+ *
+ * Purpose:	Free a size-tracking node for a bin
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_free_node_cb(void *item, void H5_ATTR_UNUSED *key, void *op_data)
+{
+    H5FS_node_t *fspace_node = (H5FS_node_t *)item;       /* Temporary pointer to free space list node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(fspace_node);
+    HDassert(op_data);
+
+    /* Release the skip list for sections of this size */
+    H5SL_destroy(fspace_node->sect_list, H5FS_sinfo_free_sect_cb, op_data);
+
+    /* Release free space list node */
+    fspace_node = H5FL_FREE(H5FS_node_t, fspace_node);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5FS_sinfo_free_node_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_dest
+ *
+ * Purpose:	Destroys a free space section info in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sinfo_dest(H5FS_sinfo_t *sinfo)
+{
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sinfo);
+    HDassert(sinfo->fspace);
+    HDassert(sinfo->bins);
+
+    /* Clear out lists of nodes */
+    for(u = 0; u < sinfo->nbins; u++)
+        if(sinfo->bins[u].bin_list) {
+            H5SL_destroy(sinfo->bins[u].bin_list, H5FS_sinfo_free_node_cb, sinfo);
+            sinfo->bins[u].bin_list = NULL;
+        } /* end if */
+
+    /* Release bins for skip lists */
+    sinfo->bins = H5FL_SEQ_FREE(H5FS_bin_t, sinfo->bins);
+
+    /* Release skip list for merging sections */
+    if(sinfo->merge_list)
+        if(H5SL_close(sinfo->merge_list) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "can't destroy section merging skip list")
+
+    /* Decrement the reference count on free space header */
+    /* (make certain this is last action with section info, to allow for header
+     *  disappearing immediately)
+     */
+    sinfo->fspace->sinfo = NULL;
+    if(H5FS_decr(sinfo->fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTDEC, FAIL, "unable to decrement ref. count on free space header")
+    sinfo->fspace = NULL;
+
+    /* Release free space section info */
+    sinfo = H5FL_FREE(H5FS_sinfo_t, sinfo);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_sinfo_dest() */
+
+#ifdef H5FS_DEBUG_ASSERT
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_assert
+ *
+ * Purpose:	Verify that the free space manager is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_assert(const H5FS_t *fspace)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+#ifndef QAK
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", "H5FS_assert", fspace->tot_sect_count);
+#endif /* QAK */
+
+    /* Checks for section info, if it's available */
+    if(fspace->sinfo) {
+        /* Sanity check sections */
+        H5FS_sect_assert(fspace);
+
+        /* General assumptions about the section size counts */
+        HDassert(fspace->sinfo->tot_size_count >= fspace->sinfo->serial_size_count);
+        HDassert(fspace->sinfo->tot_size_count >= fspace->sinfo->ghost_size_count);
+    } /* end if */
+
+    /* General assumptions about the section counts */
+    HDassert(fspace->tot_sect_count >= fspace->serial_sect_count);
+    HDassert(fspace->tot_sect_count >= fspace->ghost_sect_count);
+    HDassert(fspace->tot_sect_count == (fspace->serial_sect_count + fspace->ghost_sect_count));
+#ifdef QAK
+    HDassert(fspace->serial_sect_count > 0 || fspace->ghost_sect_count == 0);
+#endif /* QAK */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS_assert() */
+#endif /* H5FS_DEBUG_ASSERT */
diff --git a/gatb-core/thirdparty/hdf5/src/H5FScache.c b/gatb-core/thirdparty/hdf5/src/H5FScache.c
new file mode 100644
index 0000000..a0bfbcf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FScache.c
@@ -0,0 +1,1025 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FScache.c
+ *			May  2 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implement file free space metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* File free space			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* File free space format version #'s */
+#define H5FS_HDR_VERSION        0               /* Header */
+#define H5FS_SINFO_VERSION      0               /* Serialized sections */
+
+/* Size of stack buffer for serialized headers */
+#define H5FS_HDR_BUF_SIZE               256
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for skip list iterator callback for iterating over section size nodes when syncing */
+typedef struct {
+    H5FS_sinfo_t *sinfo;        /* Free space section info */
+    uint8_t **p;                /* Pointer to address of buffer pointer to serialize with */
+    unsigned sect_cnt_size;     /* # of bytes to encode section size counts in */
+} H5FS_iter_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Section info routines */
+static herr_t H5FS_sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
+static herr_t H5FS_sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
+
+/* Metadata cache callbacks */
+static H5FS_t *H5FS_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5FS_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_t *fspace, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5FS_cache_hdr_dest(H5F_t *f, H5FS_t *fspace);
+static herr_t H5FS_cache_hdr_clear(H5F_t *f, H5FS_t *fspace, hbool_t destroy);
+static herr_t H5FS_cache_hdr_size(const H5F_t *f, const H5FS_t *fspace, size_t *size_ptr);
+static H5FS_sinfo_t *H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5FS_cache_sinfo_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_sinfo_t *sinfo, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5FS_cache_sinfo_dest(H5F_t *f, H5FS_sinfo_t *sinfo);
+static herr_t H5FS_cache_sinfo_clear(H5F_t *f, H5FS_sinfo_t *sinfo, hbool_t destroy);
+static herr_t H5FS_cache_sinfo_size(const H5F_t *f, const H5FS_sinfo_t *sinfo, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5FS header inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FSPACE_HDR[1] = {{
+    H5AC_FSPACE_HDR_ID,
+    (H5AC_load_func_t)H5FS_cache_hdr_load,
+    (H5AC_flush_func_t)H5FS_cache_hdr_flush,
+    (H5AC_dest_func_t)H5FS_cache_hdr_dest,
+    (H5AC_clear_func_t)H5FS_cache_hdr_clear,
+    (H5AC_size_func_t)H5FS_cache_hdr_size,
+}};
+
+/* H5FS serialized sections inherit cache-like properties from H5AC */
+const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
+    H5AC_FSPACE_SINFO_ID,
+    (H5AC_load_func_t)H5FS_cache_sinfo_load,
+    (H5AC_flush_func_t)H5FS_cache_sinfo_flush,
+    (H5AC_dest_func_t)H5FS_cache_sinfo_dest,
+    (H5AC_clear_func_t)H5FS_cache_sinfo_clear,
+    (H5AC_size_func_t)H5FS_cache_sinfo_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage free space section data to/from disk */
+H5FL_BLK_DEFINE_STATIC(sect_block);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_hdr_load
+ *
+ * Purpose:	Loads a free space manager header from the disk.
+ *
+ * Return:      Success:        Pointer to a new free space header
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_t *
+H5FS_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5FS_t		*fspace = NULL; /* Free space header info */
+    H5FS_hdr_cache_ud_t *udata = (H5FS_hdr_cache_ud_t *)_udata; /* user data for callback */
+    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
+    uint8_t             hdr_buf[H5FS_HDR_BUF_SIZE]; /* Buffer for header */
+    uint8_t		*hdr;           /* Pointer to header buffer */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    unsigned            nclasses;       /* Number of section classes */
+    H5FS_t		*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(udata);
+
+    /* Allocate a new free space manager */
+    if(NULL == (fspace = H5FS_new(udata->f, udata->nclasses, udata->classes, udata->cls_init_udata)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set free space manager's internal information */
+    fspace->addr = udata->addr;
+
+    /* Wrap the local buffer for serialized header info */
+    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for header */
+    if(NULL == (hdr = (uint8_t *)H5WB_actual(wb, fspace->hdr_size)))
+        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read header from disk */
+    if(H5F_block_read(f, H5FD_MEM_FSPACE_HDR, addr, fspace->hdr_size, dxpl_id, hdr) < 0)
+	HGOTO_ERROR(H5E_FSPACE, H5E_READERROR, NULL, "can't read free space header")
+
+    p = hdr;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5FS_HDR_VERSION)
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header version")
+
+    /* Client ID */
+    fspace->client = (H5FS_client_t)*p++;
+    if(fspace->client >= H5FS_NUM_CLIENT_ID)
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "unknown client ID in free space header")
+
+    /* Total space tracked */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->tot_space);
+
+    /* Total # of free space sections tracked */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->tot_sect_count);
+
+    /* # of serializable free space sections tracked */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->serial_sect_count);
+
+    /* # of ghost free space sections tracked */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->ghost_sect_count);
+
+    /* # of section classes */
+    /* (only check if we actually have some classes) */
+    UINT16DECODE(p, nclasses);
+    if(fspace->nclasses > 0 && fspace->nclasses != nclasses)
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "section class count mismatch")
+
+    /* Shrink percent */
+    UINT16DECODE(p, fspace->shrink_percent);
+
+    /* Expand percent */
+    UINT16DECODE(p, fspace->expand_percent);
+
+    /* Size of address space free space sections are within (log2 of actual value) */
+    UINT16DECODE(p, fspace->max_sect_addr);
+
+    /* Max. size of section to track */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->max_sect_size);
+
+    /* Address of serialized free space sections */
+    H5F_addr_decode(udata->f, &p, &fspace->sect_addr);
+
+    /* Size of serialized free space sections */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->sect_size);
+
+    /* Allocated size of serialized free space sections */
+    H5F_DECODE_LENGTH(udata->f, p, fspace->alloc_sect_size);
+
+    /* Compute checksum on indirect block */
+    computed_chksum = H5_checksum_metadata(hdr, (size_t)(p - (const uint8_t *)hdr), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    HDassert((size_t)(p - (const uint8_t *)hdr) == fspace->hdr_size);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_ERROR(H5E_FSPACE, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+
+    /* Set return value */
+    ret_value = fspace;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && fspace)
+        if(H5FS_hdr_dest(fspace) < 0)
+            HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_hdr_flush
+ *
+ * Purpose:	Flushes a dirty free space header to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_t *fspace, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5WB_t      *wb = NULL;             /* Wrapped buffer for header data */
+    uint8_t     hdr_buf[H5FS_HDR_BUF_SIZE]; /* Buffer for header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(fspace);
+    HDassert(H5F_addr_defined(fspace->addr));
+
+    /* Check if the header "owns" the section info */
+    if(fspace->sinfo) {
+        /* Sanity check - should not be trying to destroy header if it still
+         *      "owns" section info
+         */
+        HDassert(!destroy);
+
+        /* Check if the section info is dirty */
+        if(fspace->sinfo->dirty) {
+            if(fspace->serial_sect_count > 0) {
+                /* Check if we need to allocate space for  section info */
+                if(!H5F_addr_defined(fspace->sect_addr)) {
+                    /* Sanity check */
+                    HDassert(fspace->sect_size > 0);
+
+                    /* Allocate space for the section info in file */
+                    if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+                    fspace->alloc_sect_size = (size_t)fspace->sect_size;
+
+                    /* Mark header dirty */
+                    /* (don't use cache API, since we're in a callback) */
+                    fspace->cache_info.is_dirty = TRUE;
+                } /* end if */
+
+                /* Write section info to file */
+                if(H5FS_cache_sinfo_flush(f, dxpl_id, FALSE, fspace->sect_addr, fspace->sinfo, NULL) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space section info to disk")
+            } /* end if */
+            else {
+                /* Sanity check that section info doesn't have address */
+                HDassert(!H5F_addr_defined(fspace->sect_addr));
+            } /* end else */
+            /* Mark section info clean */
+            fspace->sinfo->dirty = FALSE;
+        } /* end if */
+    } /* end if */
+    else {
+        /* Just sanity checks... */
+        if(fspace->serial_sect_count > 0)
+            /* Sanity check that section info has address */
+            HDassert(H5F_addr_defined(fspace->sect_addr));
+        else
+            /* Sanity check that section info doesn't have address */
+            HDassert(!H5F_addr_defined(fspace->sect_addr));
+    } /* end else */
+
+    if(fspace->cache_info.is_dirty) {
+        uint8_t	*hdr;                   /* Pointer to header buffer */
+        uint8_t *p;                     /* Pointer into raw data buffer */
+        uint32_t metadata_chksum;       /* Computed metadata checksum value */
+
+        /* Wrap the local buffer for serialized header info */
+        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for header */
+        if(NULL == (hdr = (uint8_t *)H5WB_actual(wb, fspace->hdr_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to header */
+        p = hdr;
+
+        /* Magic number */
+        HDmemcpy(p, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5FS_HDR_VERSION;
+
+        /* Client ID */
+        *p++ = fspace->client;
+
+        /* Total space tracked */
+        H5F_ENCODE_LENGTH(f, p, fspace->tot_space);
+
+        /* Total # of free space sections tracked */
+        H5F_ENCODE_LENGTH(f, p, fspace->tot_sect_count);
+
+        /* # of serializable free space sections tracked */
+        H5F_ENCODE_LENGTH(f, p, fspace->serial_sect_count);
+
+        /* # of ghost free space sections tracked */
+        H5F_ENCODE_LENGTH(f, p, fspace->ghost_sect_count);
+
+        /* # of section classes */
+        UINT16ENCODE(p, fspace->nclasses);
+
+        /* Shrink percent */
+        UINT16ENCODE(p, fspace->shrink_percent);
+
+        /* Expand percent */
+        UINT16ENCODE(p, fspace->expand_percent);
+
+        /* Size of address space free space sections are within (log2 of actual value) */
+        UINT16ENCODE(p, fspace->max_sect_addr);
+
+        /* Max. size of section to track */
+        H5F_ENCODE_LENGTH(f, p, fspace->max_sect_size);
+
+        /* Address of serialized free space sections */
+        H5F_addr_encode(f, &p, fspace->sect_addr);
+
+        /* Size of serialized free space sections */
+        H5F_ENCODE_LENGTH(f, p, fspace->sect_size);
+
+        /* Allocated size of serialized free space sections */
+        H5F_ENCODE_LENGTH(f, p, fspace->alloc_sect_size);
+
+        /* Compute checksum */
+        metadata_chksum = H5_checksum_metadata(hdr, (size_t)(p - (uint8_t *)hdr), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+	/* Write the free space header. */
+        HDassert((size_t)(p - hdr) == fspace->hdr_size);
+	if(H5F_block_write(f, H5FD_MEM_FSPACE_HDR, addr, fspace->hdr_size, dxpl_id, hdr) < 0)
+	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space header to disk")
+
+	fspace->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5FS_cache_hdr_dest(f, fspace) < 0)
+	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_cache_hdr_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_hdr_dest
+ *
+ * Purpose:	Destroys a free space header in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_hdr_dest(H5F_t *f, H5FS_t *fspace)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(fspace);
+
+    /* We should not still be holding on to the free space section info */
+    HDassert(!fspace->sinfo);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!fspace->cache_info.free_file_space_on_destroy || H5F_addr_defined(fspace->cache_info.addr));
+
+    /* Check for freeing file space for free space header */
+    if(fspace->cache_info.free_file_space_on_destroy) {
+        /* Sanity check */
+        HDassert(H5F_addr_defined(fspace->addr));
+
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_FSPACE_HDR, H5AC_dxpl_id, fspace->cache_info.addr, (hsize_t)fspace->hdr_size) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space header")
+    } /* end if */
+
+    /* Destroy free space header */
+    if(H5FS_hdr_dest(fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_hdr_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_hdr_clear
+ *
+ * Purpose:	Mark a free space header in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_hdr_clear(H5F_t *f, H5FS_t *fspace, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fspace);
+
+    /* Reset the dirty flag.  */
+    fspace->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5FS_cache_hdr_dest(f, fspace) < 0)
+	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_hdr_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_hdr_size
+ *
+ * Purpose:	Compute the size in bytes of a free space header
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5FS_t *fspace, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = fspace->hdr_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_cache_hdr_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_sinfo_load
+ *
+ * Purpose:	Loads free space sections from the disk.
+ *
+ * Return:      Success:        Pointer to a new free space section info
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_sinfo_t *
+H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void *_udata)
+{
+    H5FS_sinfo_t	*sinfo = NULL;  /* Free space section info */
+    H5FS_sinfo_cache_ud_t *udata = (H5FS_sinfo_cache_ud_t *)_udata; /* user data for callback */
+    haddr_t             fs_addr;        /* Free space header address */
+    size_t              old_sect_size;  /* Old section size */
+    uint8_t		*buf = NULL;    /* Temporary buffer */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    H5FS_sinfo_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(udata);
+
+    /* Allocate a new free space section info */
+    if(NULL == (sinfo = H5FS_sinfo_new(udata->f, udata->fspace)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Allocate space for the buffer to serialize the sections into */
+    H5_CHECKED_ASSIGN(old_sect_size, size_t, udata->fspace->sect_size, hsize_t);
+    if(NULL == (buf = H5FL_BLK_MALLOC(sect_block, (size_t)udata->fspace->sect_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Read buffer from disk */
+    if(H5F_block_read(f, H5FD_MEM_FSPACE_SINFO, udata->fspace->sect_addr, (size_t)udata->fspace->sect_size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_FSPACE, H5E_READERROR, NULL, "can't read free space sections")
+
+    /* Deserialize free sections from buffer available */
+    p = buf;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5FS_SINFO_VERSION)
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections version")
+
+    /* Address of free space header for these sections */
+    H5F_addr_decode(udata->f, &p, &fs_addr);
+    if(H5F_addr_ne(fs_addr, udata->fspace->addr))
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "incorrect header address for free space sections")
+
+    /* Check for any serialized sections */
+    if(udata->fspace->serial_sect_count > 0) {
+        hsize_t old_tot_sect_count;     /* Total section count from header */
+        hsize_t old_serial_sect_count;  /* Total serializable section count from header */
+        hsize_t old_ghost_sect_count;   /* Total ghost section count from header */
+        hsize_t old_tot_space;          /* Total space managed from header */
+        unsigned sect_cnt_size;         /* The size of the section size counts */
+
+        /* Compute the size of the section counts */
+        sect_cnt_size = H5VM_limit_enc_size((uint64_t)udata->fspace->serial_sect_count);
+
+        /* Reset the section count, the "add" routine will update it */
+        old_tot_sect_count = udata->fspace->tot_sect_count;
+        old_serial_sect_count = udata->fspace->serial_sect_count;
+        old_ghost_sect_count = udata->fspace->ghost_sect_count;
+        old_tot_space = udata->fspace->tot_space;
+        udata->fspace->tot_sect_count = 0;
+        udata->fspace->serial_sect_count = 0;
+        udata->fspace->ghost_sect_count = 0;
+        udata->fspace->tot_space = 0;
+
+        /* Walk through the buffer, deserializing sections */
+        do {
+            hsize_t sect_size;      /* Current section size */
+            size_t node_count;      /* # of sections of this size */
+            size_t u;               /* Local index variable */
+
+            /* The number of sections of this node's size */
+            UINT64DECODE_VAR(p, node_count, sect_cnt_size);
+            HDassert(node_count);
+
+            /* The size of the sections for this node */
+            UINT64DECODE_VAR(p, sect_size, sinfo->sect_len_size);
+            HDassert(sect_size);
+
+            /* Loop over nodes of this size */
+            for(u = 0; u < node_count; u++) {
+                H5FS_section_info_t *new_sect;  /* Section that was deserialized */
+                haddr_t sect_addr;      /* Address of free space section in the address space */
+                unsigned sect_type;     /* Type of free space section */
+                unsigned des_flags;     /* Flags from deserialize callback */
+
+                /* The address of the section */
+                UINT64DECODE_VAR(p, sect_addr, sinfo->sect_off_size);
+
+                /* The type of this section */
+                sect_type = *p++;
+
+                /* Call 'deserialize' callback for this section */
+                des_flags = 0;
+                HDassert(udata->fspace->sect_cls[sect_type].deserialize);
+                if(NULL == (new_sect = (*udata->fspace->sect_cls[sect_type].deserialize)(&udata->fspace->sect_cls[sect_type], udata->dxpl_id, p, sect_addr, sect_size, &des_flags)))
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTDECODE, NULL, "can't deserialize section")
+
+                /* Update offset in serialization buffer */
+                p += udata->fspace->sect_cls[sect_type].serial_size;
+
+                /* Insert section in free space manager, unless requested not to */
+                if(!(des_flags & H5FS_DESERIALIZE_NO_ADD))
+                    if(H5FS_sect_add(udata->f, udata->dxpl_id, udata->fspace, new_sect, H5FS_ADD_DESERIALIZING, NULL) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, NULL, "can't add section to free space manager")
+            } /* end for */
+        } while(p < ((buf + old_sect_size) - H5FS_SIZEOF_CHKSUM));
+
+        /* Sanity check */
+        HDassert((size_t)(p - buf) == (old_sect_size - H5FS_SIZEOF_CHKSUM));
+        HDassert(old_sect_size == udata->fspace->sect_size);
+        HDassert(old_tot_sect_count == udata->fspace->tot_sect_count);
+        HDassert(old_serial_sect_count == udata->fspace->serial_sect_count);
+        HDassert(old_ghost_sect_count == udata->fspace->ghost_sect_count);
+        HDassert(old_tot_space == udata->fspace->tot_space);
+    } /* end if */
+
+    /* Compute checksum on indirect block */
+    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_ERROR(H5E_FSPACE, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+
+    /* Sanity check */
+    HDassert((size_t)(p - (const uint8_t *)buf) == old_sect_size);
+
+    /* Set return value */
+    ret_value = sinfo;
+
+done:
+    if(buf)
+        buf = H5FL_BLK_FREE(sect_block, buf);
+    if(!ret_value && sinfo)
+        if(H5FS_sinfo_dest(sinfo) < 0)
+            HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_sinfo_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_serialize_sect_cb
+ *
+ * Purpose:	Skip list iterator callback to serialize free space sections
+ *              of a particular size
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+{
+    H5FS_section_class_t *sect_cls;     /* Class of section */
+    H5FS_section_info_t *sect= (H5FS_section_info_t *)_item;   /* Free space section to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(udata->sinfo);
+    HDassert(udata->p);
+
+    /* Get section's class */
+    sect_cls = &udata->sinfo->fspace->sect_cls[sect->type];
+
+    /* Check if this section should be serialized (i.e. is not a ghost section) */
+    if(!(sect_cls->flags & H5FS_CLS_GHOST_OBJ)) {
+        /* The address of the section */
+        UINT64ENCODE_VAR(*udata->p, sect->addr, udata->sinfo->sect_off_size);
+
+        /* The type of this section */
+        *(*udata->p)++ = (uint8_t)sect->type;
+
+        /* Call 'serialize' callback for this section */
+        if(sect_cls->serialize) {
+            if((*sect_cls->serialize)(sect_cls, sect, *udata->p) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTSERIALIZE, FAIL, "can't syncronize section")
+
+            /* Update offset in serialization buffer */
+            (*udata->p) += sect_cls->serial_size;
+        } /* end if */
+        else
+            HDassert(sect_cls->serial_size == 0);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sinfo_serialize_sect_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_serialize_node_cb
+ *
+ * Purpose:	Skip list iterator callback to serialize free space sections
+ *              in a bin
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+{
+    H5FS_node_t *fspace_node = (H5FS_node_t *)_item;   /* Free space size node to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace_node);
+    HDassert(udata->sinfo);
+    HDassert(udata->p);
+
+    /* Check if this node has any serializable sections */
+    if(fspace_node->serial_count > 0) {
+        /* The number of serializable sections of this node's size */
+        UINT64ENCODE_VAR(*udata->p, fspace_node->serial_count, udata->sect_cnt_size);
+
+        /* The size of the sections for this node */
+        UINT64ENCODE_VAR(*udata->p, fspace_node->sect_size, udata->sinfo->sect_len_size);
+
+        /* Iterate through all the sections of this size */
+        HDassert(fspace_node->sect_list);
+        if(H5SL_iterate(fspace_node->sect_list, H5FS_sinfo_serialize_sect_cb, udata) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section nodes")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sinfo_serialize_node_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_sinfo_flush
+ *
+ * Purpose:	Flushes a dirty free space section info to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_sinfo_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_sinfo_t *sinfo, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(sinfo);
+    HDassert(sinfo->fspace);
+    HDassert(sinfo->fspace->sect_cls);
+
+    if(sinfo->cache_info.is_dirty || sinfo->dirty) {
+        H5FS_iter_ud_t udata;       /* User data for callbacks */
+        uint8_t	*buf = NULL;        /* Temporary raw data buffer */
+        uint8_t *p;                 /* Pointer into raw data buffer */
+        uint32_t metadata_chksum;   /* Computed metadata checksum value */
+        unsigned bin;               /* Current bin we are on */
+
+        /* Sanity check address */
+        if(H5F_addr_ne(addr, sinfo->fspace->sect_addr))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "incorrect address for free space sections")
+
+        /* Allocate temporary buffer */
+        if((buf = H5FL_BLK_MALLOC(sect_block, (size_t)sinfo->fspace->sect_size)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        p = buf;
+
+        /* Magic number */
+        HDmemcpy(p, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5FS_SINFO_VERSION;
+
+        /* Address of free space header for these sections */
+        H5F_addr_encode(f, &p, sinfo->fspace->addr);
+
+        /* Set up user data for iterator */
+        udata.sinfo = sinfo;
+        udata.p = &p;
+        udata.sect_cnt_size = H5VM_limit_enc_size((uint64_t)sinfo->fspace->serial_sect_count);
+
+        /* Iterate over all the bins */
+        for(bin = 0; bin < sinfo->nbins; bin++) {
+            /* Check if there are any sections in this bin */
+            if(sinfo->bins[bin].bin_list) {
+                /* Iterate over list of section size nodes for bin */
+                if(H5SL_iterate(sinfo->bins[bin].bin_list, H5FS_sinfo_serialize_node_cb, &udata) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section size nodes")
+            } /* end if */
+        } /* end for */
+
+        /* Compute checksum */
+        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+        /* Sanity check */
+        HDassert((size_t)(p - buf) == sinfo->fspace->sect_size);
+        HDassert(sinfo->fspace->sect_size <= sinfo->fspace->alloc_sect_size);
+
+        /* Write buffer to disk */
+        if(H5F_block_write(f, H5FD_MEM_FSPACE_SINFO, sinfo->fspace->sect_addr, (size_t)sinfo->fspace->sect_size, dxpl_id, buf) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space sections to disk")
+
+        buf = H5FL_BLK_FREE(sect_block, buf);
+
+	sinfo->cache_info.is_dirty = FALSE;
+        sinfo->dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5FS_cache_sinfo_dest(f, sinfo) < 0)
+	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space section info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_cache_sinfo_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_sinfo_dest
+ *
+ * Purpose:	Destroys a free space section info in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_sinfo_dest(H5F_t *f, H5FS_sinfo_t *sinfo)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(sinfo);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!sinfo->cache_info.free_file_space_on_destroy || H5F_addr_defined(sinfo->cache_info.addr));
+
+    /* Check for freeing file space for free space section info */
+    if(sinfo->cache_info.free_file_space_on_destroy) {
+        /* Sanity check */
+        HDassert(sinfo->fspace->alloc_sect_size > 0);
+
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, H5AC_dxpl_id, sinfo->cache_info.addr, (hsize_t)sinfo->fspace->alloc_sect_size) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space section info")
+    } /* end if */
+
+    /* Destroy free space info */
+    if(H5FS_sinfo_dest(sinfo) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_sinfo_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_sinfo_clear
+ *
+ * Purpose:	Mark a free space section info in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_sinfo_clear(H5F_t *f, H5FS_sinfo_t *sinfo, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sinfo);
+
+    /* Reset the dirty flag.  */
+    sinfo->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5FS_cache_sinfo_dest(f, sinfo) < 0)
+	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space section info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_sinfo_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_cache_sinfo_size
+ *
+ * Purpose:	Compute the size in bytes of a free space section info
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_cache_sinfo_size(const H5F_t H5_ATTR_UNUSED *f, const H5FS_sinfo_t *sinfo, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(sinfo);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    H5_CHECKED_ASSIGN(*size_ptr, size_t, sinfo->fspace->alloc_sect_size, hsize_t);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_cache_sinfo_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSdbg.c b/gatb-core/thirdparty/hdf5/src/H5FSdbg.c
new file mode 100644
index 0000000..2cfc094
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSdbg.c
@@ -0,0 +1,311 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FSdbg.c
+ *			May  9 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Dump debugging information about a free space manager
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#define H5HF_DEBUGGING          /* Need access to fractal heap debugging routines */
+#define H5MF_DEBUGGING          /* Need access to file space debugging routines */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* File free space			*/
+#include "H5HFprivate.h"	/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_debug
+ *
+ * Purpose:	Prints debugging info about a free space manager.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  9 2006
+ *
+ * Modifications:
+ *	Vailin Choi, July 29th, 2008
+ *	  Add H5FS_CLIENT_FILE_ID for File Memory Management
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth)
+{
+    H5FS_t	*fspace = NULL;         /* Free space header info */
+    H5FS_hdr_cache_ud_t cache_udata;    /* User-data for cache callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Initialize user data for protecting the free space manager */
+    cache_udata.f = f;
+    cache_udata.nclasses = 0;
+    cache_udata.classes = NULL;
+    cache_udata.cls_init_udata = NULL;
+    cache_udata.addr = addr;
+
+    /*
+     * Load the free space header.
+     */
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFree Space Header...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Free space client:",
+	      (fspace->client == H5FS_CLIENT_FHEAP_ID ? "Fractal heap" :
+	      (fspace->client == H5FS_CLIENT_FILE_ID ? "File" : "Unknown")));
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Total free space tracked:",
+	      fspace->tot_space);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Total number of free space sections tracked:",
+	      fspace->tot_sect_count);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of serializable free space sections tracked:",
+	      fspace->serial_sect_count);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of ghost free space sections tracked:",
+	      fspace->ghost_sect_count);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of free space section classes:",
+	      fspace->nclasses);
+    HDfprintf(stream, "%*s%-*s %u%%\n", indent, "", fwidth,
+	      "Shrink percent:",
+	      fspace->shrink_percent);
+    HDfprintf(stream, "%*s%-*s %u%%\n", indent, "", fwidth,
+	      "Expand percent:",
+	      fspace->expand_percent);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "# of bits for section address space:",
+	      fspace->max_sect_addr);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Maximum section size:",
+	      fspace->max_sect_size);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Serialized sections address:",
+	      fspace->sect_addr);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Serialized sections size used:",
+	      fspace->sect_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Serialized sections size allocated:",
+	      fspace->alloc_sect_size);
+
+done:
+    if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, addr, fspace, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_debug
+ *
+ * Purpose:	Prints debugging info about a free space section.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 30 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_debug(const H5FS_t *fspace, const H5FS_section_info_t *sect, FILE *stream, int indent, int fwidth)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fspace);
+    HDassert(sect);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Call the section's debugging routine */
+    if(fspace->sect_cls[sect->type].debug)
+        if((fspace->sect_cls[sect->type].debug)(sect, stream, indent, fwidth) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't dump section's debugging info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_sect_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sects_debug
+ *
+ * Purpose:	Prints debugging info about the free space sections.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, FILE *stream, int indent, int fwidth,
+    haddr_t fs_addr, haddr_t client_addr)
+{
+    H5FS_t	*fspace = NULL;         /* Free space header info */
+    H5FS_client_t client;               /* The client of the free space */
+    H5FS_hdr_cache_ud_t cache_udata;    /* User-data for cache callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(H5F_addr_defined(fs_addr));
+    HDassert(H5F_addr_defined(client_addr));
+
+    /* Initialize user data for protecting the free space manager */
+    cache_udata.f = f;
+    cache_udata.nclasses = 0;
+    cache_udata.classes = NULL;
+    cache_udata.cls_init_udata = NULL;
+    cache_udata.addr = fs_addr;
+
+    /*
+     * Load the free space header.
+     */
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
+
+    /* Retrieve the client id */
+    client = fspace->client;
+
+    /* Release the free space header */
+    /* (set the "deleted" flag for the unprotect, so the cache entry is removed
+     *  and reloaded later, with the correct client information -QAK)
+     */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__DELETED_FLAG) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header")
+    fspace = NULL;
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFree Space Sections...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    switch(client) {
+        case H5FS_CLIENT_FHEAP_ID:
+            if(H5HF_sects_debug(f, dxpl_id, client_addr, stream, indent + 3, MAX(0, fwidth - 3)) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_SYSTEM, FAIL, "unable to dump fractal heap free space sections")
+            break;
+
+        case H5FS_CLIENT_FILE_ID:
+#ifdef NOT_YET
+            if(H5MF_sects_debug(f, dxpl_id, fs_addr, stream, indent + 3, MAX(0, fwidth - 3)) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_SYSTEM, FAIL, "unable to dump file free space sections")
+#endif /* NOT_YET */
+            break;
+
+        case H5FS_NUM_CLIENT_ID:
+        default:
+            HDfprintf(stream, "Unknown client!\n");
+            break;
+    } /* end switch */
+
+done:
+    if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_sects_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSpkg.h b/gatb-core/thirdparty/hdf5/src/H5FSpkg.h
new file mode 100644
index 0000000..e22e411
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSpkg.h
@@ -0,0 +1,250 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Tuesday, May  2, 2006
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5FS package.  Source files outside the H5FS package should
+ *		include H5FSprivate.h instead.
+ */
+#ifndef H5FS_PACKAGE
+#error "Do not include this file outside the H5FS package!"
+#endif
+
+#ifndef _H5FSpkg_H
+#define _H5FSpkg_H
+
+/* Uncomment this macro to enable debugging output for free space manager */
+/* #define H5FS_DEBUG */
+
+/* Uncomment this macro to enable debugging output for free space sections */
+/* #define H5FS_SINFO_DEBUG */
+
+/* Uncomment this macro to enable extra sanity checking */
+/* #define H5FS_DEBUG_ASSERT */
+
+/* Get package's private header */
+#include "H5FSprivate.h"	/* File free space                      */
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Size of checksum information (on disk) */
+#define H5FS_SIZEOF_CHKSUM      4
+
+/* "Standard" size of prefix information for free space metadata */
+#define H5FS_METADATA_PREFIX_SIZE (                                           \
+    H5_SIZEOF_MAGIC   /* Signature */                                         \
+    + 1 /* Version */                                                         \
+    + H5FS_SIZEOF_CHKSUM /* Metadata checksum */                              \
+    )
+
+/* Size of the fractal heap header on disk */
+#define H5FS_HEADER_SIZE(f) (                                                 \
+    /* General metadata fields */                                             \
+    H5FS_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Free space header specific fields */                                   \
+    + 1 /* Client ID */                                                       \
+    + H5F_SIZEOF_SIZE(f) /* Total free space tracked */                       \
+    + H5F_SIZEOF_SIZE(f) /* Total # of sections tracked */                    \
+    + H5F_SIZEOF_SIZE(f) /* # of serializable sections tracked */             \
+    + H5F_SIZEOF_SIZE(f) /* # of ghost sections tracked */                    \
+    + 2 /* Number of section classes */                                       \
+    + 2 /* Shrink percent */                                                  \
+    + 2 /* Expand percent */                                                  \
+    + 2 /* Size of address space for sections (log2 of value) */              \
+    + H5F_SIZEOF_SIZE(f) /* Max. size of section to track */                  \
+    + H5F_SIZEOF_ADDR(f) /* Address of serialized free space sections */      \
+    + H5F_SIZEOF_SIZE(f) /* Size of serialized free space sections used */    \
+    + H5F_SIZEOF_SIZE(f) /* Allocated size of serialized free space sections */ \
+    )
+
+/* Size of the free space serialized sections on disk */
+#define H5FS_SINFO_PREFIX_SIZE(f) (                                           \
+    /* General metadata fields */                                             \
+    H5FS_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Free space serialized sections specific fields */                      \
+    + H5F_SIZEOF_ADDR(f) /* Address of free space header for these sections */ \
+    )
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Callback info for loading a free space header into the cache */
+typedef struct H5FS_hdr_cache_ud_t {
+    H5F_t *f;                  /* File that free space header is within */
+    size_t nclasses;                            /* Number of section classes */
+    const H5FS_section_class_t **classes;       /* Array of section class info */
+    void *cls_init_udata;                       /* Pointer to class init user data */
+    haddr_t addr;              /* Address of header */
+} H5FS_hdr_cache_ud_t;
+
+/* Callback info for loading free space section info into the cache */
+typedef struct H5FS_sinfo_cache_ud_t {
+    H5F_t *f;                  /* File that free space section info is within */
+    H5FS_t *fspace;            /* free space manager */
+    hid_t dxpl_id;
+} H5FS_sinfo_cache_ud_t;
+
+/* Free space section bin info */
+typedef struct H5FS_bin_t {
+    size_t tot_sect_count;      /* Total # of sections in this bin */
+    size_t serial_sect_count;   /* # of serializable sections in this bin */
+    size_t ghost_sect_count;    /* # of un-serializable sections in this bin */
+    H5SL_t *bin_list;           /* Skip list of differently sized sections */
+} H5FS_bin_t;
+
+/* Free space node for free space sections of the same size */
+typedef struct H5FS_node_t {
+    hsize_t sect_size;          /* Size of all sections on list */
+    size_t serial_count;        /* # of serializable sections on list */
+    size_t ghost_count;         /* # of un-serializable sections on list */
+    H5SL_t *sect_list;          /* Skip list to hold pointers to actual free list section node */
+} H5FS_node_t;
+
+/* Free space section info */
+typedef struct H5FS_sinfo_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+/* Stored information */
+    H5FS_bin_t *bins;           /* Array of lists of lists of free sections   */
+
+/* Computed/cached values */
+    hbool_t dirty;              /* Whether this info in memory is out of sync w/info in file */
+    unsigned nbins;             /* Number of bins                             */
+    size_t serial_size;         /* Total size of all serializable sections    */
+    size_t tot_size_count;      /* Total number of differently sized sections */
+    size_t serial_size_count;   /* Total number of differently sized serializable sections */
+    size_t ghost_size_count;    /* Total number of differently sized un-serializable sections */
+    unsigned sect_prefix_size;  /* Size of the section serialization prefix (in bytes) */
+    unsigned sect_off_size;     /* Size of a section offset (in bytes)        */
+    unsigned sect_len_size;     /* Size of a section length (in bytes)        */
+    H5FS_t *fspace;             /* Pointer to free space manager that owns sections */
+
+/* Memory data structures (not stored directly) */
+    H5SL_t *merge_list;         /* Skip list to hold sections for detecting merges */
+} H5FS_sinfo_t;
+
+/* Free space header info */
+struct H5FS_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+/* Stored information */
+    /* Statistics about sections managed */
+    hsize_t tot_space;          /* Total amount of space tracked              */
+    hsize_t tot_sect_count;     /* Total # of sections tracked                */
+    hsize_t serial_sect_count;  /* # of serializable sections tracked         */
+    hsize_t ghost_sect_count;   /* # of un-serializable sections tracked      */
+
+    /* Creation parameters */
+    H5FS_client_t client;       /* Type of user of this free space manager    */
+    unsigned nclasses;          /* Number of section classes handled          */
+    unsigned shrink_percent;    /* Percent of "normal" serialized size to shrink serialized space at */
+    unsigned expand_percent;    /* Percent of "normal" serialized size to expand serialized space at */
+    unsigned max_sect_addr;     /* Size of address space free sections are within (log2 of actual value) */
+    hsize_t max_sect_size;      /* Maximum size of section to track */
+
+    /* Serialized section information */
+    haddr_t sect_addr;          /* Address of the section info in the file    */
+    hsize_t sect_size;          /* Size of the section info in the file       */
+    hsize_t alloc_sect_size;    /* Allocated size of the section info in the file */
+
+/* Computed/cached values */
+    unsigned rc;                /* Count of outstanding references to struct  */
+    haddr_t addr;               /* Address of free space header on disk       */
+    size_t hdr_size;            /* Size of free space header on disk          */
+    H5FS_sinfo_t *sinfo;        /* Section information                        */
+    unsigned sinfo_lock_count;  /* # of times the section info has been locked */
+    hbool_t sinfo_protected;    /* Whether the section info was protected when locked */
+    hbool_t sinfo_modified;     /* Whether the section info has been modified while locked */
+    H5AC_protect_t sinfo_accmode; /* Access mode for protecting the section info */
+    size_t max_cls_serial_size; /* Max. additional size of serialized form of section */
+    hsize_t    threshold;      	/* Threshold for alignment              */
+    hsize_t    alignment;      	/* Alignment                            */
+
+
+/* Memory data structures (not stored directly) */
+    H5FS_section_class_t *sect_cls; /* Array of section classes for this free list */
+};
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5FS header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FSPACE_HDR[1];
+
+/* H5FS section info inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FSPACE_SINFO[1];
+
+/* Declare a free list to manage the H5FS_node_t struct */
+H5FL_EXTERN(H5FS_node_t);
+
+/* Declare a free list to manage the H5FS_bin_t sequence information */
+H5FL_SEQ_EXTERN(H5FS_bin_t);
+
+/* Declare a free list to manage the H5FS_sinfo_t struct */
+H5FL_EXTERN(H5FS_sinfo_t);
+
+/* Declare a free list to manage the H5FS_t struct */
+H5FL_EXTERN(H5FS_t);
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Free space manager header routines */
+H5_DLL H5FS_t *H5FS_new(const H5F_t *f, size_t nclasses,
+    const H5FS_section_class_t *classes[], void *cls_init_udata);
+H5_DLL herr_t H5FS_incr(H5FS_t *fspace);
+H5_DLL herr_t H5FS_decr(H5FS_t *fspace);
+H5_DLL herr_t H5FS_dirty(H5FS_t *fspace);
+
+/* Free space section routines */
+H5_DLL H5FS_sinfo_t *H5FS_sinfo_new(H5F_t *f, H5FS_t *fspace);
+
+/* Routines for destroying structures */
+H5_DLL herr_t H5FS_hdr_dest(H5FS_t *hdr);
+H5_DLL herr_t H5FS_sinfo_dest(H5FS_sinfo_t *sinfo);
+
+/* Sanity check routines */
+#ifdef H5FS_DEBUG
+H5_DLL herr_t H5FS_assert(const H5FS_t *fspace);
+H5_DLL herr_t H5FS_sect_assert(const H5FS_t *fspace);
+#endif /* H5FS_DEBUG */
+
+/* Testing routines */
+#ifdef H5FS_TESTING
+H5_DLL herr_t H5FS_get_cparam_test(const H5FS_t *fh, H5FS_create_t *cparam);
+H5_DLL int H5FS_cmp_cparam_test(const H5FS_create_t *cparam1, const H5FS_create_t *cparam2);
+#endif /* H5FS_TESTING */
+
+#endif /* _H5FSpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSprivate.h b/gatb-core/thirdparty/hdf5/src/H5FSprivate.h
new file mode 100644
index 0000000..cbcb36a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSprivate.h
@@ -0,0 +1,213 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FSprivate.h
+ *			May  2 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Private header for library accessible file free space routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5FSprivate_H
+#define _H5FSprivate_H
+
+/* Include package's public header */
+#include "H5FSpublic.h"
+
+/* Private headers needed by this file */
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Flags for H5FS_section_class_t 'flags' field */
+#define H5FS_CLS_GHOST_OBJ      0x01    /* Objects in this class shouldn't be
+                                         *      serialized to the file.
+                                         */
+#define H5FS_CLS_SEPAR_OBJ      0x02    /* Objects in this class shouldn't
+                                         *      participate in merge operations.
+                                         */
+#define H5FS_CLS_MERGE_SYM      0x04    /* Objects in this class only merge
+                                         *      with other objects in this class.
+                                         */
+#define H5FS_CLS_ADJUST_OK      0x08    /* Objects in this class can be merged
+                                         *      without requiring a can_adjust/adjust
+                                         *      callback pair.
+                                         */
+
+/* Flags for H5FS_add() */
+#define H5FS_ADD_DESERIALIZING  0x01    /* Free space is being deserialized
+                                         */
+#define H5FS_ADD_RETURNED_SPACE 0x02    /* Section was previously allocated
+                                         *      and is being returned to the
+                                         *      free space manager (usually
+                                         *      as a result of freeing an
+                                         *      object)
+                                         */
+#define H5FS_ADD_SKIP_VALID     0x04    /* Don't check validity after adding
+                                         *      this section.  (state of the
+                                         *      managed sections is in flux)
+                                         */
+
+/* Flags for deserialize callback  */
+#define H5FS_DESERIALIZE_NO_ADD  0x01   /* Don't add section to free space
+                                         *      manager after it's deserialized
+                                         *      (its only here for it's side-
+                                         *      effects).
+                                         */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Free space info (forward decl - defined in H5FSpkg.h) */
+typedef struct H5FS_t H5FS_t;
+
+/* Forward declaration free space section info */
+typedef struct H5FS_section_info_t H5FS_section_info_t;
+
+/* Free space section class info */
+typedef struct H5FS_section_class_t {
+    /* Class variables */
+    const unsigned type;                /* Type of free space section */
+    size_t serial_size;                 /* Size of serialized form of section */
+    unsigned flags;                     /* Class flags */
+    void *cls_private;                  /* Class private information */
+
+    /* Class methods */
+    herr_t (*init_cls)(struct H5FS_section_class_t *, void *);          /* Routine to initialize class-specific settings */
+    herr_t (*term_cls)(struct H5FS_section_class_t *);                  /* Routine to terminate class-specific settings */
+
+    /* Object methods */
+    herr_t (*add)(H5FS_section_info_t *, unsigned *, void *);       /* Routine called when section is about to be added to manager */
+    herr_t (*serialize)(const struct H5FS_section_class_t *, const H5FS_section_info_t *, uint8_t *);        /* Routine to serialize a "live" section into a buffer */
+    H5FS_section_info_t *(*deserialize)(const struct H5FS_section_class_t *, hid_t dxpl_id, const uint8_t *, haddr_t, hsize_t, unsigned *);     /* Routine to deserialize a buffer into a "live" section */
+    htri_t (*can_merge)(const H5FS_section_info_t *, const H5FS_section_info_t *, void *);  /* Routine to determine if two nodes are mergable */
+    herr_t (*merge)(H5FS_section_info_t *, H5FS_section_info_t *, void *);      /* Routine to merge two nodes */
+    htri_t (*can_shrink)(const H5FS_section_info_t *, void *);        /* Routine to determine if node can shrink container */
+    herr_t (*shrink)(H5FS_section_info_t **, void *);   /* Routine to shrink container */
+    herr_t (*free)(H5FS_section_info_t *);              /* Routine to free node */
+    herr_t (*valid)(const struct H5FS_section_class_t *, const H5FS_section_info_t *);   /* Routine to check if a section is valid */
+    H5FS_section_info_t *(*split)(H5FS_section_info_t *, hsize_t);     /* Routine to create the split section */
+    herr_t (*debug)(const H5FS_section_info_t *, FILE *, int , int );   /* Routine to dump debugging information about a section */
+} H5FS_section_class_t;
+
+/* State of section ("live" or "serialized") */
+typedef enum H5FS_section_state_t {
+    H5FS_SECT_LIVE,             /* Section has "live" memory references */
+    H5FS_SECT_SERIALIZED        /* Section is in "serialized" form */
+} H5FS_section_state_t;
+
+/* Free space section info */
+struct H5FS_section_info_t {
+    haddr_t     addr;                   /* Offset of free space section in the address space */
+    hsize_t     size;                   /* Size of free space section */
+    unsigned    type;                   /* Type of free space section (i.e. class) */
+    H5FS_section_state_t state;         /* Whether the section is in "serialized" or "live" form */
+};
+
+/* Free space client IDs for identifying user of free space */
+typedef enum H5FS_client_t {
+    H5FS_CLIENT_FHEAP_ID = 0,	/* Free space is used by fractal heap */
+    H5FS_CLIENT_FILE_ID,	/* Free space is used by file */
+    H5FS_NUM_CLIENT_ID          /* Number of free space client IDs (must be last)   */
+} H5FS_client_t;
+
+/* Free space creation parameters */
+typedef struct H5FS_create_t {
+    H5FS_client_t client;               /* Client's ID */
+    unsigned shrink_percent;            /* Percent of "normal" serialized size to shrink serialized space at */
+    unsigned expand_percent;            /* Percent of "normal" serialized size to expand serialized space at */
+    unsigned max_sect_addr;             /* Size of address space free sections are within (log2 of actual value) */
+    hsize_t max_sect_size;              /* Maximum size of section to track */
+} H5FS_create_t;
+
+/* Free space statistics info */
+typedef struct H5FS_stat_t {
+    hsize_t tot_space;          /* Total amount of space tracked              */
+    hsize_t tot_sect_count;     /* Total # of sections tracked                */
+    hsize_t serial_sect_count;  /* # of serializable sections tracked         */
+    hsize_t ghost_sect_count;   /* # of un-serializable sections tracked      */
+    haddr_t addr;		/* Address of free space header on disk       */
+    hsize_t hdr_size;		/* Size of the free-space header on disk      */
+    haddr_t sect_addr;          /* Address of the section info in the file    */
+    hsize_t alloc_sect_size;    /* Allocated size of the section info in the file */
+    hsize_t sect_size;    	/* Size of the section info in the file       */
+} H5FS_stat_t;
+
+/* Typedef for iteration operations */
+typedef herr_t (*H5FS_operator_t)(H5FS_section_info_t *sect,
+        void *operator_data/*in,out*/);
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+/* Declare a free list to manage the H5FS_section_class_t sequence information */
+H5FL_SEQ_EXTERN(H5FS_section_class_t);
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* Free space manager routines */
+H5_DLL H5FS_t *H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr,
+    const H5FS_create_t *fs_create, size_t nclasses,
+    const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold);
+H5_DLL H5FS_t *H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr,
+    size_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold);
+H5_DLL herr_t H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size);
+H5_DLL herr_t H5FS_delete(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr);
+H5_DLL herr_t H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace);
+
+/* Free space section routines */
+H5_DLL herr_t H5FS_sect_add(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *node, unsigned flags, void *op_data);
+H5_DLL htri_t H5FS_sect_try_extend(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    haddr_t addr, hsize_t size, hsize_t extra_requested);
+H5_DLL herr_t H5FS_sect_remove(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *node);
+H5_DLL htri_t H5FS_sect_find(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    hsize_t request, H5FS_section_info_t **node);
+H5_DLL herr_t H5FS_sect_iterate(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5FS_operator_t op, void *op_data);
+H5_DLL herr_t H5FS_sect_stats(const H5FS_t *fspace, hsize_t *tot_space,
+    hsize_t *nsects);
+H5_DLL herr_t H5FS_sect_change_class(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *sect, unsigned new_class);
+H5_DLL htri_t H5FS_sect_try_shrink_eoa(const H5F_t *f, hid_t dxpl_id, const H5FS_t *fspace, void *op_data);
+H5_DLL herr_t H5FS_sect_query_last_sect(const H5FS_t *fspace, haddr_t *sect_addr, hsize_t *sect_size);
+
+/* Statistics routine */
+H5_DLL herr_t H5FS_stat_info(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *stats);
+
+/* Debugging routines for dumping file structures */
+H5_DLL herr_t H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth);
+H5_DLL herr_t H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, haddr_t fs_addr, haddr_t client_addr);
+H5_DLL herr_t H5FS_sect_debug(const H5FS_t *fspace, const H5FS_section_info_t *sect,
+    FILE *stream, int indent, int fwidth);
+
+#endif /* _H5FSprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSpublic.h b/gatb-core/thirdparty/hdf5/src/H5FSpublic.h
new file mode 100644
index 0000000..d1bae94
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSpublic.h
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5FSpublic.h
+ *                      May  2 2006
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Public declarations for the file free space package.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5FSpublic_H
+#define _H5FSpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/**********************************/
+/* Public API Function Prototypes */
+/**********************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5FSpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSsection.c b/gatb-core/thirdparty/hdf5/src/H5FSsection.c
new file mode 100644
index 0000000..be48ae6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSsection.c
@@ -0,0 +1,2422 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *              Monday, July 31, 2006
+ *
+ * Purpose:	Free space tracking functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* File free space			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for skip list iterator callback for iterating over section size nodes */
+typedef struct {
+    H5FS_t *fspace;             /* Free space manager info */
+    H5FS_operator_t op;         /* Operator for the iteration */
+    void *op_data;              /* Information to pass to the operator */
+} H5FS_iter_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5FS_sect_increase(H5FS_t *fspace, const H5FS_section_class_t *cls,
+    unsigned flags);
+static herr_t H5FS_sect_decrease(H5FS_t *fspace, const H5FS_section_class_t *cls);
+static herr_t H5FS_size_node_decr(H5FS_sinfo_t *sinfo, unsigned bin, H5FS_node_t *fspace_node,
+    const H5FS_section_class_t *cls);
+static herr_t H5FS_sect_unlink_size(H5FS_sinfo_t *sinfo, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect);
+static herr_t H5FS_sect_unlink_rest(H5FS_t *fspace,
+    const H5FS_section_class_t *cls, H5FS_section_info_t *sect);
+static herr_t H5FS_sect_remove_real(H5FS_t *fspace, H5FS_section_info_t *sect);
+static herr_t H5FS_sect_link_size(H5FS_sinfo_t *sinfo, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect);
+static herr_t H5FS_sect_link_rest(H5FS_t *fspace, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect, unsigned flags);
+static herr_t H5FS_sect_link(H5FS_t *fspace, H5FS_section_info_t *sect,
+    unsigned flags);
+static herr_t H5FS_sect_merge(H5FS_t *fspace, H5FS_section_info_t **sect,
+    void *op_data);
+static htri_t H5FS_sect_find_node(H5FS_t *fspace, hsize_t request, H5FS_section_info_t **node);
+static herr_t H5FS_sect_serialize_size(H5FS_t *fspace);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5FS_node_t struct */
+H5FL_DEFINE(H5FS_node_t);
+
+/* Declare a free list to manage the H5FS_bin_t sequence information */
+H5FL_SEQ_DEFINE(H5FS_bin_t);
+
+/* Declare a free list to manage the H5FS_sinfo_t struct */
+H5FL_DEFINE(H5FS_sinfo_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_new
+ *
+ * Purpose:	Create new section info structure
+ *
+ * Return:	Success:	non-NULL, pointer to new section info struct
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 31, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5FS_sinfo_t *
+H5FS_sinfo_new(H5F_t *f, H5FS_t *fspace)
+{
+    H5FS_sinfo_t *sinfo = NULL; /* Section information struct created */
+    H5FS_sinfo_t *ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: fspace->addr = %a\n", FUNC, fspace->addr);
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Allocate the free space header */
+    if(NULL == (sinfo = H5FL_CALLOC(H5FS_sinfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set non-zero values */
+    sinfo->nbins = H5VM_log2_gen(fspace->max_sect_size);
+    sinfo->sect_prefix_size = (size_t)H5FS_SINFO_PREFIX_SIZE(f);
+    sinfo->sect_off_size = (fspace->max_sect_addr + 7) / 8;
+    sinfo->sect_len_size = H5VM_limit_enc_size((uint64_t)fspace->max_sect_size);
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: fspace->max_sect_size = %Hu\n", FUNC, fspace->max_sect_size);
+HDfprintf(stderr, "%s: fspace->max_sect_addr = %u\n", FUNC, fspace->max_sect_addr);
+HDfprintf(stderr, "%s: sinfo->nbins = %u\n", FUNC, sinfo->nbins);
+HDfprintf(stderr, "%s: sinfo->sect_off_size = %u, sinfo->sect_len_size = %u\n", FUNC, sinfo->sect_off_size, sinfo->sect_len_size);
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Allocate space for the section size bins */
+    if(NULL == (sinfo->bins = H5FL_SEQ_CALLOC(H5FS_bin_t, (size_t)sinfo->nbins)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space section bin array")
+
+    /* Increment the reference count on the free space manager header */
+    if(H5FS_incr(fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINC, NULL, "unable to increment ref. count on free space header")
+    sinfo->fspace = fspace;
+
+    /* Link free space manager to section info */
+    /* (for deserializing sections) */
+    HDassert(fspace->sinfo == NULL);
+    fspace->sinfo = sinfo;
+
+    /* Set return value */
+    ret_value = sinfo;
+
+done:
+    if(ret_value == NULL && sinfo) {
+        /* Release bins for skip lists */
+        if(sinfo->bins)
+            sinfo->bins = H5FL_SEQ_FREE(H5FS_bin_t, sinfo->bins);
+
+        /* Release free space section info */
+        sinfo = H5FL_FREE(H5FS_sinfo_t, sinfo);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sinfo_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_lock
+ *
+ * Purpose:	Make certain the section info for the free space manager is
+ *              in memory.
+ *
+ *              Either uses existing section info owned by the free space
+ *              header, loads section info from disk, or creates new section
+ *              info
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_lock(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5AC_protect_t accmode)
+{
+    H5FS_sinfo_cache_ud_t cache_udata; /* User-data for cache callback */
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Called, fspace->addr = %a, fspace->sinfo = %p, fspace->sect_addr = %a\n", FUNC, fspace->addr, fspace->sinfo, fspace->sect_addr);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+
+    /* If the free space header doesn't already "own" the section info, load
+     *  section info or create it
+     */
+    if(fspace->sinfo) {
+        /* Check if the section info was protected & we want a different access mode */
+        if(fspace->sinfo_protected && accmode != fspace->sinfo_accmode) {
+            /* Check if we need to switch from read-only access to read-write */
+            if(H5AC_WRITE == accmode) {
+                /* Unprotect the read-only section info */
+                if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space section info")
+
+                /* Re-protect the section info with read-write access */
+                cache_udata.f = f;
+                cache_udata.dxpl_id = dxpl_id;
+                cache_udata.fspace = fspace;
+                if(NULL == (fspace->sinfo = (H5FS_sinfo_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, &cache_udata, H5AC_WRITE)))
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to load free space sections")
+
+                /* Switch the access mode we have */
+                fspace->sinfo_accmode = H5AC_WRITE;
+            } /* end if */
+        } /* end if */
+    } /* end if */
+    else {
+        /* If the section address is defined, load it from the file */
+        if(H5F_addr_defined(fspace->sect_addr)) {
+            /* Sanity check */
+            HDassert(fspace->sinfo_protected == FALSE);
+            HDassert(H5F_addr_defined(fspace->addr));
+
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Reading in existing sections, fspace->sect_addr = %a\n", FUNC, fspace->sect_addr);
+#endif /* H5FS_SINFO_DEBUG */
+            /* Protect the free space sections */
+            cache_udata.f = f;
+            cache_udata.dxpl_id = dxpl_id;
+            cache_udata.fspace = fspace;
+            if(NULL == (fspace->sinfo = (H5FS_sinfo_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, &cache_udata, accmode)))
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to load free space sections")
+
+            /* Remember that we protected the section info & the access mode */
+            fspace->sinfo_protected = TRUE;
+            fspace->sinfo_accmode = accmode;
+        } /* end if */
+        else {
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Creating new section info\n", FUNC);
+#endif /* H5FS_SINFO_DEBUG */
+            /* Sanity check */
+            HDassert(fspace->tot_sect_count == 0);
+            HDassert(fspace->serial_sect_count == 0);
+            HDassert(fspace->ghost_sect_count == 0);
+
+            /* Allocate and initialize free space section info */
+            if(NULL == (fspace->sinfo = H5FS_sinfo_new(f, fspace)))
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTCREATE, FAIL, "can't create section info")
+
+            /* Set initial size of section info to 0 */
+            fspace->sect_size = fspace->alloc_sect_size = 0;
+        } /* end if */
+    } /* end if */
+    HDassert(fspace->rc == 2);
+
+    /* Increment the section info lock count */
+    fspace->sinfo_lock_count++;
+
+done:
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Leaving, fspace->addr = %a, fspace->sinfo = %p, fspace->sect_addr = %a\n", FUNC, fspace->addr, fspace->sinfo, fspace->sect_addr);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
+#endif /* H5FS_SINFO_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sinfo_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sinfo_unlock
+ *
+ * Purpose:	Release the section info, either giving ownership back to
+ *              the cache or letting the free space header keep it.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, February  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sinfo_unlock(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, hbool_t modified)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Called, modified = %t, fspace->addr = %a, fspace->sect_addr = %a\n", FUNC, modified, fspace->addr, fspace->sect_addr);
+HDfprintf(stderr, "%s: fspace->sinfo_lock_count = %u, fspace->sinfo_modified = %t, fspace->sinfo_protected = %t\n", FUNC, fspace->sinfo_lock_count, fspace->sinfo_modified, fspace->sinfo_protected);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(fspace->rc == 2);
+    HDassert(fspace->sinfo);
+
+    /* Check if we modified any section */
+    if(modified) {
+        /* Check if the section info was protected with a different access mode */
+        if(fspace->sinfo_protected && fspace->sinfo_accmode != H5AC_WRITE)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTDIRTY, FAIL, "attempt to modify read-only section info")
+
+        /* If we modified the section info, mark it dirty */
+        fspace->sinfo->dirty = TRUE;
+
+        /* Remember that the section info was modified while locked */
+        fspace->sinfo_modified = TRUE;
+
+        /* Assume that the modification will affect the statistics in the header
+         *  and mark that dirty also
+         */
+        if(H5FS_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+    } /* end if */
+
+    /* Decrement the lock count on the section info */
+    fspace->sinfo_lock_count--;
+
+    /* Check if section info lock count dropped to zero */
+    if(fspace->sinfo_lock_count == 0) {
+        hbool_t release_sinfo_space = FALSE;    /* Flag to indicate section info space in file should be released */
+
+        /* Check if we actually protected the section info */
+        if(fspace->sinfo_protected) {
+            unsigned    cache_flags = H5AC__NO_FLAGS_SET;       /* Flags for unprotecting heap */
+
+            /* Sanity check */
+            HDassert(H5F_addr_defined(fspace->addr));
+
+            /* Check if we've made new changes to the section info while locked */
+            if(fspace->sinfo_modified) {
+                /* Note that we've modified the section info */
+                cache_flags |= H5AC__DIRTIED_FLAG;
+
+                /* Check if the section info size in the file has changed */
+                if(fspace->sect_size != fspace->alloc_sect_size)
+                    cache_flags |= H5AC__DELETED_FLAG | H5AC__TAKE_OWNERSHIP_FLAG;
+            } /* end if */
+
+            /* Sanity check */
+            HDassert(H5F_addr_defined(fspace->sect_addr));
+
+            /* Unprotect section info in cache */
+            /* (Possibly dirty) */
+            /* (Possibly taking ownership from the cache) */
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Unprotecting section info, cache_flags = %u\n", FUNC, cache_flags);
+#endif /* H5FS_SINFO_DEBUG */
+            if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, cache_flags) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space section info")
+
+            /* Reset the protected flag on the section info */
+            fspace->sinfo_protected = FALSE;
+
+            /* Check if header is taking ownership of section info */
+            if((cache_flags & H5AC__TAKE_OWNERSHIP_FLAG)) {
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Taking ownership of section info\n", FUNC);
+#endif /* H5FS_SINFO_DEBUG */
+                /* Set flag to release section info space in file */
+                release_sinfo_space = TRUE;
+            } /* end if */
+            else {
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Relinquishing section info ownership\n", FUNC);
+#endif /* H5FS_SINFO_DEBUG */
+                /* Free space header relinquished ownership of section info */
+                fspace->sinfo = NULL;
+            } /* end else */
+        } /* end if */
+        else {
+            /* Check if the section info was modified */
+            if(fspace->sinfo_modified) {
+                /* Check if we need to release section info in the file */
+                if(H5F_addr_defined(fspace->sect_addr))
+                    /* Set flag to release section info space in file */
+                    release_sinfo_space = TRUE;
+                else
+                    HDassert(fspace->alloc_sect_size == 0);
+            } /* end if */
+            else {
+                /* Sanity checks... */
+                if(H5F_addr_defined(fspace->sect_addr))
+                    HDassert(fspace->alloc_sect_size == fspace->sect_size);
+                else
+                    HDassert(fspace->alloc_sect_size == 0);
+            } /* end else */
+        } /* end else */
+
+        /* Reset the "section info modified" flag */
+        fspace->sinfo_modified = FALSE;
+
+        /* Check if header needs to release section info in the file */
+        if(release_sinfo_space) {
+            haddr_t old_sect_addr = fspace->sect_addr;   /* Previous location of section info in file */
+            hsize_t old_alloc_sect_size = fspace->alloc_sect_size;       /* Previous size of section info in file */
+
+            /* Sanity check */
+            HDassert(H5F_addr_defined(fspace->addr));
+
+            /* Reset section info in header */
+            fspace->sect_addr = HADDR_UNDEF;
+            fspace->alloc_sect_size = 0;
+
+            /* If we haven't already marked the header dirty, do so now */
+            if(!modified)
+                if(H5FS_dirty(fspace) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Freeing section info on disk, old_sect_addr = %a, old_alloc_sect_size = %Hu\n", FUNC, old_sect_addr, old_alloc_sect_size);
+#endif /* H5FS_SINFO_DEBUG */
+            /* Release space for section info in file */
+            if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
+        } /* end if */
+    } /* end if */
+
+done:
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* H5FS_SINFO_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sinfo_unlock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_serialize_size
+ *
+ * Purpose:	Determine serialized size of all sections in free space manager
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_serialize_size(H5FS_t *fspace)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fspace);
+#ifdef QAK
+HDfprintf(stderr, "%s: Check 1.0 - fspace->sect_size = %Hu\n", "H5FS_sect_serialize_size", fspace->sect_size);
+HDfprintf(stderr, "%s: fspace->serial_sect_count = %Zu\n", "H5FS_sect_serialize_size", fspace->serial_sect_count);
+HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu\n", "H5FS_sect_serialize_size", fspace->alloc_sect_size);
+HDfprintf(stderr, "%s: fspace->sinfo->serial_size_count = %Zu\n", "H5FS_sect_serialize_size", fspace->sinfo->serial_size_count);
+#endif /* QAK */
+
+    /* Compute the size of the buffer required to serialize all the sections */
+    if(fspace->serial_sect_count > 0) {
+        size_t sect_buf_size;               /* Section buffer size */
+
+        /* Serialized sections prefix */
+        sect_buf_size = fspace->sinfo->sect_prefix_size;
+
+        /* Count for each differently sized serializable section */
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->sinfo->serial_size_count = %Zu\n", "H5FS_sect_serialize_size", fspace->sinfo->serial_size_count);
+HDfprintf(stderr, "%s: fspace->serial_sect_count = %Hu\n", "H5FS_sect_serialize_size", fspace->serial_sect_count);
+#endif /* QAK */
+        sect_buf_size += fspace->sinfo->serial_size_count * H5VM_limit_enc_size((uint64_t)fspace->serial_sect_count);
+
+        /* Size for each differently sized serializable section */
+        sect_buf_size += fspace->sinfo->serial_size_count * fspace->sinfo->sect_len_size;
+
+        /* Offsets of each section in address space */
+        sect_buf_size += fspace->serial_sect_count * fspace->sinfo->sect_off_size;
+
+        /* Class of each section */
+        sect_buf_size += fspace->serial_sect_count * 1 /* byte */;
+
+        /* Extra space required to serialize each section */
+        sect_buf_size += fspace->sinfo->serial_size;
+
+        /* Update section size in header */
+        fspace->sect_size = sect_buf_size;
+    } /* end if */
+    else
+        /* Reset section size in header */
+        fspace->sect_size = fspace->sinfo->sect_prefix_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_sect_serialize_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_increase
+ *
+ * Purpose:	Increase the size of the serialized free space section info
+ *              on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_increase(H5FS_t *fspace, const H5FS_section_class_t *cls,
+    unsigned flags)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(cls);
+
+    /* Increment total # of sections on free space list */
+    fspace->tot_sect_count++;
+
+    /* Check for serializable or 'ghost' section */
+    if(cls->flags & H5FS_CLS_GHOST_OBJ) {
+        /* Sanity check */
+        HDassert(cls->serial_size == 0);
+
+        /* Increment # of ghost sections */
+        fspace->ghost_sect_count++;
+    } /* end if */
+    else {
+        /* Increment # of serializable sections */
+        fspace->serial_sect_count++;
+
+        /* Increment amount of space required to serialize all sections */
+#ifdef QAK
+HDfprintf(stderr, "%s: sinfo->serial_size = %Zu\n", FUNC, fspace->sinfo->serial_size);
+HDfprintf(stderr, "%s: cls->serial_size = %Zu\n", FUNC, cls->serial_size);
+#endif /* QAK */
+        fspace->sinfo->serial_size += cls->serial_size;
+
+        /* Update the free space sections' serialized size */
+        /* (if we're not deserializing the sections from disk) */
+        if(!(flags & H5FS_ADD_DESERIALIZING)) {
+            if(H5FS_sect_serialize_size(fspace) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTCOMPUTE, FAIL, "can't adjust free space section size on disk")
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_increase() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_decrease
+ *
+ * Purpose:	Decrease the size of the serialized free space section info
+ *              on disk
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_decrease(H5FS_t *fspace, const H5FS_section_class_t *cls)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(cls);
+
+    /* Decrement total # of sections in free space manager */
+    fspace->tot_sect_count--;
+
+    /* Check for serializable or 'ghost' section */
+    if(cls->flags & H5FS_CLS_GHOST_OBJ) {
+        /* Sanity check */
+        HDassert(cls->serial_size == 0);
+
+        /* Decrement # of ghost sections */
+        fspace->ghost_sect_count--;
+    } /* end if */
+    else {
+        /* Decrement # of serializable sections */
+        fspace->serial_sect_count--;
+
+        /* Decrement amount of space required to serialize all sections */
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->serial_size = %Zu\n", FUNC, fspace->sinfo->serial_size);
+HDfprintf(stderr, "%s: cls->serial_size = %Zu\n", FUNC, cls->serial_size);
+#endif /* QAK */
+        fspace->sinfo->serial_size -= cls->serial_size;
+
+        /* Update the free space sections' serialized size */
+        if(H5FS_sect_serialize_size(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTCOMPUTE, FAIL, "can't adjust free space section size on disk")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_decrease() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_size_node_decr
+ *
+ * Purpose:	Decrement the number of sections of a particular size
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_size_node_decr(H5FS_sinfo_t *sinfo, unsigned bin, H5FS_node_t *fspace_node,
+    const H5FS_section_class_t *cls)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sinfo);
+    HDassert(fspace_node);
+    HDassert(cls);
+
+    /* Decrement the # of sections in this bin */
+    /* (Different from the # of items in the bin's skiplist, since each node on
+     *  the bin's skiplist is also a skiplist...)
+     */
+    sinfo->bins[bin].tot_sect_count--;
+#ifdef QAK
+HDfprintf(stderr, "%s: sinfo->bins[%u].sect_count = %Zu\n", FUNC, bin, sinfo->bins[bin].sect_count);
+#endif /* QAK */
+
+    /* Check for 'ghost' or 'serializable' section */
+    if(cls->flags & H5FS_CLS_GHOST_OBJ) {
+        /* Decrement node's ghost section count */
+        fspace_node->ghost_count--;
+
+        /* Decrement bin's ghost section count */
+        sinfo->bins[bin].ghost_sect_count--;
+
+        /* If the node has no more ghost sections, decrement number of ghost section sizes managed */
+        if(fspace_node->ghost_count == 0)
+            sinfo->ghost_size_count--;
+    } /* end if */
+    else {
+        /* Decrement node's serializable section count */
+        fspace_node->serial_count--;
+
+        /* Decrement bin's serializable section count */
+        sinfo->bins[bin].serial_sect_count--;
+
+        /* If the node has no more serializable sections, decrement number of serializable section sizes managed */
+        if(fspace_node->serial_count == 0)
+            sinfo->serial_size_count--;
+    } /* end else */
+
+    /* Check for no more nodes on list of that size */
+    if(H5SL_count(fspace_node->sect_list) == 0) {
+        H5FS_node_t *tmp_fspace_node;       /* Free space list size node */
+
+        /* Sanity checks */
+        HDassert(fspace_node->ghost_count == 0);
+        HDassert(fspace_node->serial_count == 0);
+
+        /* Remove size tracking list from bin */
+        tmp_fspace_node = (H5FS_node_t *)H5SL_remove(sinfo->bins[bin].bin_list, &fspace_node->sect_size);
+        if(tmp_fspace_node == NULL || tmp_fspace_node != fspace_node)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
+
+        /* Destroy skip list for size tracking node */
+        if(H5SL_close(fspace_node->sect_list) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "can't destroy size tracking node's skip list")
+
+        /* Release free space list node */
+        fspace_node = H5FL_FREE(H5FS_node_t, fspace_node);
+
+        /* Decrement total number of section sizes managed */
+        sinfo->tot_size_count--;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_size_node_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_unlink_size
+ *
+ * Purpose:	Remove a section node from size tracking data structures for
+ *              a free space manager
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_unlink_size(H5FS_sinfo_t *sinfo, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect)
+{
+    H5FS_node_t *fspace_node;       /* Free list size node */
+    H5FS_section_info_t *tmp_sect_node; /* Temporary section node */
+    unsigned bin;                   /* Bin to put the free space section in */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sinfo);
+    HDassert(sinfo->bins);
+    HDassert(sect);
+    HDassert(cls);
+
+    /* Determine correct bin which holds items of at least the section's size */
+    bin = H5VM_log2_gen(sect->size);
+    HDassert(bin < sinfo->nbins);
+    if(sinfo->bins[bin].bin_list == NULL)
+        HGOTO_ERROR(H5E_FSPACE, H5E_NOTFOUND, FAIL, "node's bin is empty?")
+
+    /* Find space node for section's size */
+    if((fspace_node = (H5FS_node_t *)H5SL_search(sinfo->bins[bin].bin_list, &sect->size)) == NULL)
+        HGOTO_ERROR(H5E_FSPACE, H5E_NOTFOUND, FAIL, "can't find section size node")
+
+    /* Remove the section's node from the list */
+    tmp_sect_node = (H5FS_section_info_t *)H5SL_remove(fspace_node->sect_list, &sect->addr);
+    if(tmp_sect_node == NULL || tmp_sect_node != sect)
+        HGOTO_ERROR(H5E_FSPACE, H5E_NOTFOUND, FAIL, "can't find section node on size list")
+
+    /* Decrement # of sections in section size node */
+    if(H5FS_size_node_decr(sinfo, bin, fspace_node, cls) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space size node from skip list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_unlink_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_unlink_rest
+ *
+ * Purpose:	Finish unlinking a section from the rest of the free space
+ *              manager's data structures, after the section has been removed
+ *              from the size tracking data structures
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_unlink_rest(H5FS_t *fspace, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(cls);
+    HDassert(sect);
+
+    /* Remove node from merge list, if it was entered there */
+    if(!(cls->flags & H5FS_CLS_SEPAR_OBJ)) {
+        H5FS_section_info_t *tmp_sect_node; /* Temporary section node */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: removing object from merge list, sect->type = %u\n", FUNC, (unsigned)sect->type);
+#endif /* QAK */
+        tmp_sect_node = (H5FS_section_info_t *)H5SL_remove(fspace->sinfo->merge_list, &sect->addr);
+        if(tmp_sect_node == NULL || tmp_sect_node != sect)
+            HGOTO_ERROR(H5E_FSPACE, H5E_NOTFOUND, FAIL, "can't find section node on size list")
+    } /* end if */
+
+    /* Update section info & check if we need less room for the serialized free space sections */
+    if(H5FS_sect_decrease(fspace, cls) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't increase free space section size on disk")
+
+    /* Decrement amount of free space managed */
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
+#endif /* QAK */
+    fspace->tot_space -= sect->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_unlink_rest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_remove_real
+ *
+ * Purpose:	Remove a section from the free space manager
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_remove_real(H5FS_t *fspace, H5FS_section_info_t *sect)
+{
+    const H5FS_section_class_t *cls;    /* Class of section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(sect);
+
+    /* Get section's class */
+    cls = &fspace->sect_cls[sect->type];
+
+    /* Remove node from size tracked data structures */
+    if(H5FS_sect_unlink_size(fspace->sinfo, cls, sect) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from size tracking data structures")
+
+    /* Update rest of free space manager data structures for node removal */
+    if(H5FS_sect_unlink_rest(fspace, cls, sect) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from non-size tracking data structures")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_remove_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_remove
+ *
+ * Purpose:	Remove a section from the free space manager
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_remove(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *sect)
+{
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(sect);
+
+    /* Get a pointer to the section info */
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+    sinfo_valid = TRUE;
+
+    /* Perform actual section removal */
+    if(H5FS_sect_remove_real(fspace, sect) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove section")
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, TRUE) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_link_size
+ *
+ * Purpose:	Add a section of free space to the free list bins
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, March 20, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_link_size(H5FS_sinfo_t *sinfo, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect)
+{
+    H5FS_node_t *fspace_node = NULL;    /* Pointer to free space node of the correct size */
+    hbool_t fspace_node_alloc = FALSE;  /* Whether the free space node was allocated */
+    unsigned bin;                       /* Bin to put the free space section in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef QAK
+HDfprintf(stderr, "%s: sect->size = %Hu, sect->addr = %a\n", FUNC, sect->size, sect->addr);
+#endif /* QAK */
+
+    /* Check arguments. */
+    HDassert(sinfo);
+    HDassert(sect);
+    HDassert(H5F_addr_defined(sect->addr));
+    HDassert(sect->size);
+
+    /* Determine correct bin which holds items of the section's size */
+    bin = H5VM_log2_gen(sect->size);
+    HDassert(bin < sinfo->nbins);
+    if(sinfo->bins[bin].bin_list == NULL) {
+        if(NULL == (sinfo->bins[bin].bin_list = H5SL_create(H5SL_TYPE_HSIZE, NULL)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTCREATE, FAIL, "can't create skip list for free space nodes")
+    } /* end if */
+    else {
+        /* Check for node list of the correct size already */
+        fspace_node = (H5FS_node_t *)H5SL_search(sinfo->bins[bin].bin_list, &sect->size);
+    } /* end else */
+
+    /* Check if we need to create a new skip list for nodes of this size */
+    if(fspace_node == NULL) {
+        /* Allocate new free list size node */
+        if(NULL == (fspace_node = H5FL_MALLOC(H5FS_node_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for free space node")
+        fspace_node_alloc = TRUE;
+
+        /* Initialize the free list size node */
+        fspace_node->sect_size = sect->size;
+        fspace_node->serial_count = fspace_node->ghost_count = 0;
+        if(NULL == (fspace_node->sect_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTCREATE, FAIL, "can't create skip list for free space nodes")
+
+        /* Insert new free space size node into bin's list */
+        if(H5SL_insert(sinfo->bins[bin].bin_list, fspace_node, &fspace_node->sect_size) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space node into skip list")
+        fspace_node_alloc = FALSE; /* (owned by the bin skip list now, don't need to free on error) */
+
+        /* Increment number of section sizes */
+        sinfo->tot_size_count++;
+    } /* end if */
+
+    /* Increment # of section in bin */
+    /* (Different from the # of items in the bin's skiplist, since each node on
+     *  the bin's skiplist is also a skiplist...)
+     */
+#ifdef QAK
+HDfprintf(stderr, "%s: sinfo->bins[%u].sect_count = %Zu\n", FUNC, bin, sinfo->bins[bin].sect_count);
+#endif /* QAK */
+    sinfo->bins[bin].tot_sect_count++;
+    if(cls->flags & H5FS_CLS_GHOST_OBJ) {
+        sinfo->bins[bin].ghost_sect_count++;
+        fspace_node->ghost_count++;
+
+        /* Check for first ghost section in node */
+        if(fspace_node->ghost_count == 1)
+            sinfo->ghost_size_count++;
+    } /* end if */
+    else {
+        sinfo->bins[bin].serial_sect_count++;
+        fspace_node->serial_count++;
+
+        /* Check for first serializable section in node */
+        if(fspace_node->serial_count == 1)
+            sinfo->serial_size_count++;
+    } /* end else */
+
+    /* Insert free space node into correct skip list */
+    if(H5SL_insert(fspace_node->sect_list, sect, &sect->addr) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space node into skip list")
+
+done:
+    if(ret_value < 0)
+        if(fspace_node && fspace_node_alloc) {
+            if(fspace_node->sect_list && H5SL_close(fspace_node->sect_list) < 0)
+                HDONE_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "can't destroy size free space node's skip list")
+            fspace_node = H5FL_FREE(H5FS_node_t, fspace_node);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_link_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_link_rest
+ *
+ * Purpose:	Link a section into the rest of the non-size tracking
+ *              free space manager data structures
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_link_rest(H5FS_t *fspace, const H5FS_section_class_t *cls,
+    H5FS_section_info_t *sect, unsigned flags)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(sect);
+
+    /* Add section to the address-ordered list of sections, if allowed */
+    if(!(cls->flags & H5FS_CLS_SEPAR_OBJ)) {
+#ifdef QAK
+HDfprintf(stderr, "%s: inserting object into merge list, sect->type = %u\n", FUNC, (unsigned)sect->type);
+#endif /* QAK */
+        if(fspace->sinfo->merge_list == NULL)
+            if(NULL == (fspace->sinfo->merge_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTCREATE, FAIL, "can't create skip list for merging free space sections")
+        if(H5SL_insert(fspace->sinfo->merge_list, sect, &sect->addr) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space node into merging skip list")
+    } /* end if */
+
+    /* Update section info & check if we need more room for the serialized free space sections */
+    if(H5FS_sect_increase(fspace, cls, flags) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't increase free space section size on disk")
+
+    /* Increment amount of free space managed */
+    fspace->tot_space += sect->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_link_rest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_link
+ *
+ * Purpose:	Link a section into the internal data structures
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_link(H5FS_t *fspace, H5FS_section_info_t *sect, unsigned flags)
+{
+    const H5FS_section_class_t *cls;    /* Class of section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(sect);
+
+    /* Get section's class */
+    cls = &fspace->sect_cls[sect->type];
+
+    /* Add section to size tracked data structures */
+#ifdef QAK
+HDfprintf(stderr, "%s: Check 1.0 - fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
+#endif /* QAK */
+    if(H5FS_sect_link_size(fspace->sinfo, cls, sect) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't add section to size tracking data structures")
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Check 2.0 - fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
+#endif /* QAK */
+    /* Update rest of free space manager data structures for section addition */
+    if(H5FS_sect_link_rest(fspace, cls, sect, flags) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't add section to non-size tracking data structures")
+#ifdef QAK
+HDfprintf(stderr, "%s: Check 3.0 - fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
+#endif /* QAK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_merge
+ *
+ * Purpose:	Attempt to merge a returned free space section with existing
+ *              free space.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ * Modifications: Vailin Choi; Sept 25th 2008
+ *	Changes to the "shrinking" part--
+ *	1. Get last section node in merge-list instead of "less-than"
+ *	   node for further iteration
+ *	2. Remove "can-be-shrunk" section from free-space instead of
+ *	   "less-than" section
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_sect_merge(H5FS_t *fspace, H5FS_section_info_t **sect, void *op_data)
+{
+    H5FS_section_class_t *sect_cls;     /* Section's class */
+    hbool_t modified;                   /* Flag to indicate merge or shrink occurred */
+    hbool_t remove_sect = FALSE;       /* Whether a section should be removed before shrinking */
+    htri_t status;                      /* Status value */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(*sect);
+    HDassert(H5F_addr_defined((*sect)->addr));
+    HDassert((*sect)->size);
+
+    /* Loop until no more merging */
+    if(fspace->sinfo->merge_list) {
+        do {
+            H5SL_node_t *less_sect_node;    /* Skip list node for section less than new section */
+            H5SL_node_t *greater_sect_node; /* Skip list node for section greater than new section */
+            H5FS_section_info_t *tmp_sect;  /* Temporary free space section */
+            H5FS_section_class_t *tmp_sect_cls;     /* Temporary section's class */
+            hbool_t greater_sect_node_valid = FALSE;    /* Indicate if 'greater than' section node is valid */
+
+            /* Reset 'modification occurred' flag */
+            modified = FALSE;
+
+            /* Look for neighboring section before new section */
+            less_sect_node = H5SL_below(fspace->sinfo->merge_list, &(*sect)->addr);
+
+            /* Check for node before new node able to merge with new node */
+            if(less_sect_node) {
+                /* Check for node greater than section */
+                greater_sect_node = H5SL_next(less_sect_node);
+                greater_sect_node_valid = TRUE;
+
+                /* Get section for 'less than' skip list node */
+                tmp_sect = (H5FS_section_info_t *)H5SL_item(less_sect_node);
+
+                /* Get classes for right & left sections */
+                tmp_sect_cls = &fspace->sect_cls[tmp_sect->type];
+                sect_cls = &fspace->sect_cls[(*sect)->type];
+
+                /* Check if sections of the left most class can merge with sections
+                 *  of another class & whether the sections are the same type,
+                 *  then check for 'can merge' callback
+                 */
+                if((!(tmp_sect_cls->flags & H5FS_CLS_MERGE_SYM) || (tmp_sect->type == (*sect)->type))
+                        && tmp_sect_cls->can_merge) {
+                    /* Determine if the sections can merge */
+                    if((status = (*tmp_sect_cls->can_merge)(tmp_sect, *sect, op_data)) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for merging sections")
+                    if(status > 0) {
+                        /* Sanity check */
+                        HDassert(tmp_sect_cls->merge);
+
+                        /* Remove 'less than' node from data structures */
+                        if(H5FS_sect_remove_real(fspace, tmp_sect) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+
+                        /* Merge the two sections together */
+                        if((*tmp_sect_cls->merge)(tmp_sect, *sect, op_data) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't merge two sections")
+
+                        /* Retarget section pointer to 'less than' node that was merged into */
+                        *sect = tmp_sect;
+
+                        /* Indicate successful merge occurred */
+                        modified = TRUE;
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+
+            /* Look for section after new (or merged) section, if not already determined */
+            if(!greater_sect_node_valid)
+                greater_sect_node = H5SL_above(fspace->sinfo->merge_list, &(*sect)->addr);
+
+            /* Check for node after new node able to merge with new node */
+            if(greater_sect_node) {
+                /* Get section for 'greater than' skip list node */
+                tmp_sect = (H5FS_section_info_t *)H5SL_item(greater_sect_node);
+
+                /* Get classes for right & left sections */
+                sect_cls = &fspace->sect_cls[(*sect)->type];
+                tmp_sect_cls = &fspace->sect_cls[tmp_sect->type];
+
+                /* Check if sections of the left most class can merge with sections
+                 *  of another class & whether the sections are the same type,
+                 *  then check for 'can merge' callback
+                 */
+                if((!(sect_cls->flags & H5FS_CLS_MERGE_SYM) || ((*sect)->type == tmp_sect->type))
+                        && sect_cls->can_merge) {
+
+                    /* Determine if the sections can merge */
+                    if((status = (*sect_cls->can_merge)(*sect, tmp_sect, op_data)) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for merging sections")
+                    if(status > 0) {
+                        /* Sanity check */
+                        HDassert(sect_cls->merge);
+
+                        /* Remove 'greater than' node from data structures */
+                        if(H5FS_sect_remove_real(fspace, tmp_sect) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+
+                        /* Merge the two sections together */
+                        if((*sect_cls->merge)(*sect, tmp_sect, op_data) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't merge two sections")
+
+                        /* Indicate successful merge occurred */
+                        modified = TRUE;
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+	} while(modified);
+    } /* end if */
+    HDassert(*sect);
+#ifdef QAK
+HDfprintf(stderr, "%s: Done merging, (*sect) = {%a, %Hu, %u, %s}\n", FUNC, (*sect)->addr, (*sect)->size, (*sect)->type, ((*sect)->state == H5FS_SECT_LIVE ? "H5FS_SECT_LIVE" : "H5FS_SECT_SERIALIZED"));
+#endif /* QAK */
+
+    /* Loop until no more shrinking */
+    do {
+        /* Reset 'modification occurred' flag */
+        modified = FALSE;
+
+        /* Check for (possibly merged) section able to shrink the size of the container */
+        sect_cls = &fspace->sect_cls[(*sect)->type];
+        if(sect_cls->can_shrink) {
+            if((status = (*sect_cls->can_shrink)(*sect, op_data)) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTSHRINK, FAIL, "can't check for shrinking container")
+            if(status > 0) {
+#ifdef QAK
+HDfprintf(stderr, "%s: Can shrink!\n", FUNC);
+#endif /* QAK */
+
+		/* Remove SECT from free-space manager */
+                /* (only possible to happen on second+ pass through loop) */
+		if(remove_sect) {
+		    if(H5FS_sect_remove_real(fspace, *sect) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+		    remove_sect = FALSE;
+		} /* end if */
+
+                /* Shrink the container */
+                /* (callback can indicate that it has discarded the section by setting *sect to NULL) */
+                HDassert(sect_cls->shrink);
+                if((*sect_cls->shrink)(sect, op_data) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't shrink free space container")
+
+                /* If this section was shrunk away, we may need to shrink another section */
+                if(*sect == NULL) {
+                    /* Check for sections on merge list */
+                    if(fspace->sinfo->merge_list)  {
+                        H5SL_node_t *last_node;         /* Last node in merge list */
+
+                        /* Check for last node in the merge list */
+                        if(NULL != (last_node = H5SL_last(fspace->sinfo->merge_list))) {
+                            /* Get the pointer to the last section, from the last node */
+                            *sect = (H5FS_section_info_t *)H5SL_item(last_node);
+                            HDassert(*sect);
+
+                            /* Indicate that this section needs to be removed if it causes a shrink */
+                            remove_sect = TRUE;
+                        } /* end if */
+                    } /* end if */
+		} /* end if */
+
+                /* Indicate successful merge occurred */
+                modified = TRUE;
+            } /* end if */
+        } /* end if */
+    } while(modified && *sect);
+
+    /* Check for section that was shrunk away and next section not shrinking */
+    if(remove_sect && (*sect != NULL))
+	*sect = NULL;
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Done shrinking\n", FUNC);
+if(*sect)
+    HDfprintf(stderr, "%s: (*sect) = {%a, %Hu, %u, %s}\n", FUNC, (*sect)->addr, (*sect)->size, (*sect)->type, ((*sect)->state == H5FS_SECT_LIVE ? "H5FS_SECT_LIVE" : "H5FS_SECT_SERIALIZED"));
+else
+    HDfprintf(stderr, "%s: *sect = %p\n", FUNC, *sect);
+#endif /* QAK */
+
+done:
+#ifdef QAK
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* QAK */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_add
+ *
+ * Purpose:	Add a section of free space to the free list
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_add(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5FS_section_info_t *sect,
+    unsigned flags, void *op_data)
+{
+    H5FS_section_class_t *cls;          /* Section's class */
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    hbool_t sinfo_modified = FALSE;     /* Whether the section info was modified */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: *sect = {%a, %Hu, %u, %s}\n", FUNC, sect->addr, sect->size, sect->type, (sect->state == H5FS_SECT_LIVE ? "H5FS_SECT_LIVE" : "H5FS_SECT_SERIALIZED"));
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(sect);
+    HDassert(H5F_addr_defined(sect->addr));
+    HDassert(sect->size);
+
+    /* Get a pointer to the section info */
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+    sinfo_valid = TRUE;
+
+    /* Call "add" section class callback, if there is one */
+    cls = &fspace->sect_cls[sect->type];
+    if(cls->add) {
+        if((*cls->add)(sect, &flags, op_data) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "'add' section class callback failed")
+    } /* end if */
+
+    /* Check for merging returned space with existing section node */
+    if(flags & H5FS_ADD_RETURNED_SPACE) {
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Returning space\n", FUNC);
+#endif /* H5FS_SINFO_DEBUG */
+
+        /* Attempt to merge returned section with existing sections */
+        if(H5FS_sect_merge(fspace, &sect, op_data) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't merge sections")
+    } /* end if */
+
+    /* Add new (possibly merged) node to free sections data structures */
+    /* (If section has been completely merged or shrunk away, 'sect' will
+     *  be NULL at this point - QAK)
+     */
+    if(sect)
+        if(H5FS_sect_link(fspace, sect, flags) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
+#endif /* H5FS_SINFO_DEBUG */
+    /* Mark free space sections as changed */
+    /* (if adding sections while deserializing sections, don't set the flag) */
+    if(!(flags & H5FS_ADD_DESERIALIZING))
+        sinfo_modified = TRUE;
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, sinfo_modified) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+#ifdef H5FS_DEBUG_ASSERT
+if(!(flags & (H5FS_ADD_DESERIALIZING | H5FS_ADD_SKIP_VALID)))
+    H5FS_assert(fspace);
+#endif /* H5FS_DEBUG_ASSERT */
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* H5FS_SINFO_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_try_extend
+ *
+ * Purpose:	Try to extend a block using space from a section on the free list
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FS_sect_try_extend(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, haddr_t addr,
+    hsize_t size, hsize_t extra_requested)
+{
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    hbool_t sinfo_modified = FALSE;     /* Whether the section info was modified */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: addr = %a, size = %Hu, extra_requested = %hu\n", FUNC, addr, size, extra_requested);
+#endif /* H5FS_SINFO_DEBUG */
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(size > 0);
+    HDassert(extra_requested > 0);
+
+    /* Check for any sections on free space list */
+#ifdef H5FS_SINFO_DEBUG
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_count);
+HDfprintf(stderr, "%s: fspace->serial_sect_count = %Hu\n", FUNC, fspace->serial_sect_count);
+HDfprintf(stderr, "%s: fspace->ghost_sect_count = %Hu\n", FUNC, fspace->ghost_sect_count);
+#endif /* H5FS_SINFO_DEBUG */
+    if(fspace->tot_sect_count > 0) {
+        H5FS_section_info_t *sect;      /* Temporary free space section */
+
+        /* Get a pointer to the section info */
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+        sinfo_valid = TRUE;
+
+
+/*
+
+Pseudo-code for algorithm:
+
+_section_ = <Get pointer to section with address > _region.addr_>
+if(_section_)
+    if(_section_ adjoins _region_ && _section.size_ >= _extra_requested_)
+        <remove section from data structures>
+        if(_section.size_ > _extra_requested_)
+            if(<can adjust _section_>)
+                <adjust _section_ by _extra_requested_>
+                <add adjusted section back to data structures>
+            else
+                <re-add UNadjusted section back to data structures>
+                <error>
+        <mark free space sections as changed in metadata cache>
+
+*/
+        /* Look for a section after block to extend */
+        if((sect = (H5FS_section_info_t *)H5SL_greater(fspace->sinfo->merge_list, &addr))) {
+            /* Check if this section adjoins the block and is large enough to
+             *  fulfill extension request.
+             *
+             * (Note: we assume that the section is fully merged with any
+             *  possible neighboring nodes and is not at the end of the file
+             *  (or it would have been eliminated), etc)
+             */
+            if(sect->size >= extra_requested && (addr + size) == sect->addr) {
+                H5FS_section_class_t *cls;          /* Section's class */
+
+                /* Remove section from data structures */
+                if(H5FS_sect_remove_real(fspace, sect) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+
+                /* Get class for section */
+                cls = &fspace->sect_cls[sect->type];
+
+                /* Check for the section needing to be adjusted and re-added */
+                /* (Note: we should probably add a can_adjust/adjust callback
+                 *      to the section class structure, but we don't need it
+                 *      for the current usage, so I've deferred messing with
+                 *      it. - QAK - 2008/01/08)
+                 */
+                if(sect->size > extra_requested) {
+                    /* Sanity check (for now) */
+                    HDassert(cls->flags & H5FS_CLS_ADJUST_OK);
+
+                    /* Adjust section by amount requested */
+                    sect->addr += extra_requested;
+                    sect->size -= extra_requested;
+
+                    /* Re-add adjusted section to free sections data structures */
+                    if(H5FS_sect_link(fspace, sect, 0) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+                } /* end if */
+                else {
+                    /* Sanity check */
+                    HDassert(sect->size == extra_requested);
+
+                    /* Exact match, so just free section */
+                    if((*cls->free)(sect) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't free section")
+                } /* end else */
+
+                /* Note that we modified the section info */
+                sinfo_modified = TRUE;
+
+                /* Indicate success */
+                HGOTO_DONE(TRUE);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, sinfo_modified) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_try_extend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_find_node
+ *
+ * Purpose:	Locate a section of free space (in existing free space list
+ *              bins) that is large enough to fulfill request.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, March 20, 2006
+ *
+ * Modifications:
+ *	Vailin Choi, July 29th, 2008
+ *	  Modified to handle alignment by going through each bin to find
+ *	  a section that is big enough to fulfill "request+fragment for alignment"
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5FS_sect_find_node(H5FS_t *fspace, hsize_t request, H5FS_section_info_t **node)
+{
+    H5FS_node_t *fspace_node;        /* Free list size node */
+    unsigned bin;                   /* Bin to put the free space section in */
+    htri_t ret_value = FALSE;       /* Return value */
+
+    H5SL_node_t *curr_size_node=NULL;
+    const H5FS_section_class_t *cls;    /* Class of section */
+    hsize_t alignment;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->sinfo);
+    HDassert(fspace->sinfo->bins);
+    HDassert(request > 0);
+    HDassert(node);
+
+    /* Determine correct bin which holds items of at least the section's size */
+    bin = H5VM_log2_gen(request);
+    HDassert(bin < fspace->sinfo->nbins);
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->sinfo->nbins = %u\n", FUNC, fspace->sinfo->nbins);
+HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
+#endif /* QAK */
+    alignment = fspace->alignment;
+    if(!((alignment > 1) && (request >= fspace->threshold)))
+	alignment = 0; /* no alignment */
+
+    do {
+        /* Check if there's any sections in this bin */
+	if(fspace->sinfo->bins[bin].bin_list) {
+
+	    if (!alignment) { /* no alignment */
+		/* Find the first free space section that is large enough to fulfill request */
+		/* (Since the bins use skip lists to track the sizes of the address-ordered
+		 *  lists, this is actually a "best fit" algorithm)
+		 */
+		/* Look for large enough free space section in this bin */
+		if((fspace_node = (H5FS_node_t *)H5SL_greater(fspace->sinfo->bins[bin].bin_list, &request))) {
+		    /* Take first node off of the list (ie. node w/lowest address) */
+		    if(NULL == (*node = (H5FS_section_info_t *)H5SL_remove_first(fspace_node->sect_list)))
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
+
+		    /* Get section's class */
+		    cls = &fspace->sect_cls[(*node)->type];
+		    /* Decrement # of sections in section size node */
+		    if(H5FS_size_node_decr(fspace->sinfo, bin, fspace_node, cls) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space size node from skip list")
+		    if(H5FS_sect_unlink_rest(fspace, cls, *node) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from non-size tracking data structures")
+		    /* Indicate that we found a node for the request */
+		    HGOTO_DONE(TRUE)
+		} /* end if */
+	    }  /* end if */
+            else { /* alignment is set */
+                /* get the first node of a certain size in this bin */
+                curr_size_node = H5SL_first(fspace->sinfo->bins[bin].bin_list);
+                while (curr_size_node != NULL) {
+                    H5FS_node_t *curr_fspace_node=NULL;
+                    H5SL_node_t *curr_sect_node=NULL;
+
+                    /* Get the free space node for free space sections of the same size */
+                    curr_fspace_node = (H5FS_node_t *)H5SL_item(curr_size_node);
+
+                    /* Get the Skip list which holds  pointers to actual free list sections */
+                    curr_sect_node = (H5SL_node_t *)H5SL_first(curr_fspace_node->sect_list);
+
+                    while(curr_sect_node != NULL) {
+                        H5FS_section_info_t *curr_sect=NULL;
+                        hsize_t mis_align=0, frag_size=0;
+                        H5FS_section_info_t *split_sect=NULL;
+
+                        /* Get section node */
+                        curr_sect = (H5FS_section_info_t *)H5SL_item(curr_sect_node);
+
+                        HDassert(H5F_addr_defined(curr_sect->addr));
+                        HDassert(curr_fspace_node->sect_size == curr_sect->size);
+
+                        cls = &fspace->sect_cls[curr_sect->type];
+
+                        HDassert(alignment);
+                        HDassert(cls);
+
+                        if ((mis_align = curr_sect->addr % alignment))
+                            frag_size = alignment - mis_align;
+
+                        if ((curr_sect->size >= (request + frag_size)) && (cls->split)) {
+                            /* remove the section with aligned address */
+                            if(NULL == (*node = (H5FS_section_info_t *)H5SL_remove(curr_fspace_node->sect_list, &curr_sect->addr)))
+                                HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
+                            /* Decrement # of sections in section size node */
+                            if(H5FS_size_node_decr(fspace->sinfo, bin, curr_fspace_node, cls) < 0)
+                                HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space size node from skip list")
+
+                            if(H5FS_sect_unlink_rest(fspace, cls, *node) < 0)
+                                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from non-size tracking data structures")
+
+                            /*
+                             * The split() callback splits NODE into 2 sections:
+                             *  split_sect is the unused fragment for aligning NODE
+                             *  NODE's addr & size are updated to point to the remaining aligned section
+                             * split_sect is re-added to free-space
+                             */
+                            if (mis_align) {
+                                split_sect = cls->split(*node, frag_size);
+                                if((H5FS_sect_link(fspace, split_sect, 0) < 0))
+                                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+                                /* sanity check */
+                                HDassert(split_sect->addr < (*node)->addr);
+                                HDassert(request <= (*node)->size);
+                            }
+                            /* Indicate that we found a node for the request */
+                            HGOTO_DONE(TRUE)
+                        }
+
+                        /* Get the next section node in the list */
+                        curr_sect_node = H5SL_next(curr_sect_node);
+                    } /* end while of curr_sect_node */
+
+                    /* Get the next size node in the bin */
+                    curr_size_node = H5SL_next(curr_size_node);
+                } /* end while of curr_size_node */
+	    }  /* else of alignment */
+	} /* if bin_list */
+	/* Advance to next larger bin */
+        bin++;
+    } while(bin < fspace->sinfo->nbins);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_find_node() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_find
+ *
+ * Purpose:	Locate a section of free space (in existing free space list) that
+ *              is large enough to fulfill request.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March  7, 2006
+ *
+ * Modifications:
+ *	Vailin Choi, July 29th 2008
+ *	  Move H5FS_sect_unlink_rest() to H5FS_sect_find_node()
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FS_sect_find(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, hsize_t request,
+    H5FS_section_info_t **node)
+{
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    hbool_t sinfo_modified = FALSE;     /* Whether the section info was modified */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef QAK
+HDfprintf(stderr, "%s: request = %Hu\n", FUNC, request);
+#endif /* QAK */
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(fspace->nclasses);
+    HDassert(request);
+    HDassert(node);
+
+    /* Check for any sections on free space list */
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_count);
+HDfprintf(stderr, "%s: fspace->serial_sect_count = %Hu\n", FUNC, fspace->serial_sect_count);
+HDfprintf(stderr, "%s: fspace->ghost_sect_count = %Hu\n", FUNC, fspace->ghost_sect_count);
+#endif /* QAK */
+    if(fspace->tot_sect_count > 0) {
+        /* Get a pointer to the section info */
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+        sinfo_valid = TRUE;
+
+        /* Look for node in bins */
+        if((ret_value = H5FS_sect_find_node(fspace, request, node)) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from bins")
+
+        /* Decrement # of sections on free list, if we found an object */
+        if(ret_value > 0) {
+            /* Note that we've modified the section info */
+            sinfo_modified = TRUE;
+#ifdef QAK
+HDfprintf(stderr, "%s: (*node)->size = %Hu, (*node)->addr = %a, (*node)->type = %u\n", FUNC, (*node)->size, (*node)->addr, (*node)->type);
+#endif /* QAK */
+	}
+    } /* end if */
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, sinfo_modified) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+#ifdef H5FS_DEBUG_ASSERT
+    H5FS_assert(fspace);
+#endif /* H5FS_DEBUG_ASSERT */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_iterate_sect_cb
+ *
+ * Purpose:	Skip list iterator callback to iterate over free space sections
+ *              of a particular size
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, May 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_iterate_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+{
+    H5FS_section_info_t *sect_info = (H5FS_section_info_t *)_item;   /* Free space section to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect_info);
+    HDassert(udata->fspace);
+    HDassert(udata->op);
+
+    /* Make callback for this section */
+    if((*udata->op)(sect_info, udata->op_data) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "iteration callback failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_iterate_sect_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_iterate_node_cb
+ *
+ * Purpose:	Skip list iterator callback to iterate over free space sections
+ *              in a bin
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, May 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS_iterate_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+{
+    H5FS_node_t *fspace_node = (H5FS_node_t *)_item;   /* Free space size node to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace_node);
+    HDassert(udata->fspace);
+    HDassert(udata->op);
+
+    /* Iterate through all the sections of this size */
+    HDassert(fspace_node->sect_list);
+    if(H5SL_iterate(fspace_node->sect_list, H5FS_iterate_sect_cb, udata) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section nodes")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_iterate_node_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_iterate
+ *
+ * Purpose:	Iterate over all the sections managed
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, May 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_iterate(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5FS_operator_t op, void *op_data)
+{
+    H5FS_iter_ud_t udata;               /* User data for callbacks */
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(op);
+
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_count);
+#endif /* QAK */
+
+    /* Set up user data for iterator */
+    udata.fspace = fspace;
+    udata.op = op;
+    udata.op_data = op_data;
+
+    /* Iterate over sections, if there are any */
+    if(fspace->tot_sect_count) {
+        unsigned bin;           /* Current bin we are on */
+
+        /* Get a pointer to the section info */
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_READ) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+        sinfo_valid = TRUE;
+
+        /* Iterate over all the bins */
+#ifdef QAK
+HDfprintf(stderr, "%s: Iterate over section bins\n", FUNC);
+#endif /* QAK */
+        for(bin = 0; bin < fspace->sinfo->nbins; bin++) {
+            /* Check if there are any sections in this bin */
+            if(fspace->sinfo->bins[bin].bin_list) {
+                /* Iterate over list of section size nodes for bin */
+                if(H5SL_iterate(fspace->sinfo->bins[bin].bin_list, H5FS_iterate_node_cb, &udata) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section size nodes")
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, FALSE) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_stats
+ *
+ * Purpose:	Retrieve info about the sections managed
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_stats(const H5FS_t *fspace, hsize_t *tot_space, hsize_t *nsects)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fspace);
+
+    /* Get the stats desired */
+    if(tot_space)
+        *tot_space = fspace->tot_space;
+    if(nsects)
+        *nsects = fspace->tot_sect_count;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_sect_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_change_class
+ *
+ * Purpose:	Make appropriate adjustments to internal data structures when
+ *              a section changes class
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_change_class(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *sect, unsigned new_class)
+{
+    const H5FS_section_class_t *old_cls;        /* Old class of section */
+    const H5FS_section_class_t *new_cls;        /* New class of section */
+    unsigned old_class;                         /* Old class ID of section */
+    hbool_t sinfo_valid = FALSE;                /* Whether the section info is valid */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(fspace);
+    HDassert(sect);
+    HDassert(sect->type < fspace->nclasses);
+    HDassert(new_class < fspace->nclasses);
+
+    /* Get a pointer to the section info */
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+    sinfo_valid = TRUE;
+
+    /* Get class info */
+    old_class = sect->type;
+    old_cls = &fspace->sect_cls[sect->type];
+    new_cls = &fspace->sect_cls[new_class];
+#ifdef QAK
+HDfprintf(stderr, "%s: old_cls->flags = %x\n", FUNC, old_cls->flags);
+HDfprintf(stderr, "%s: new_cls->flags = %x\n", FUNC, new_cls->flags);
+#endif /* QAK */
+
+    /* Check if the section's class change will affect the # of serializable or ghost sections */
+    if((old_cls->flags & H5FS_CLS_GHOST_OBJ) != (new_cls->flags & H5FS_CLS_GHOST_OBJ)) {
+        H5FS_node_t *fspace_node;       /* Free list size node */
+        unsigned bin;                   /* Bin to put the free space section in */
+        hbool_t to_ghost;       /* Flag if the section is changing to a ghost section */
+
+        /* Determine if this section is becoming a ghost or is becoming serializable */
+        if(old_cls->flags & H5FS_CLS_GHOST_OBJ)
+            to_ghost = FALSE;
+        else
+            to_ghost = TRUE;
+#ifdef QAK
+HDfprintf(stderr, "%s: to_ghost = %u\n", FUNC, to_ghost);
+#endif /* QAK */
+
+        /* Sanity check */
+        HDassert(fspace->sinfo->bins);
+
+        /* Determine correct bin which holds items of at least the section's size */
+        bin = H5VM_log2_gen(sect->size);
+        HDassert(bin < fspace->sinfo->nbins);
+        HDassert(fspace->sinfo->bins[bin].bin_list);
+
+        /* Get space node for section's size */
+        fspace_node = (H5FS_node_t *)H5SL_search(fspace->sinfo->bins[bin].bin_list, &sect->size);
+        HDassert(fspace_node);
+
+        /* Adjust serializable/ghost counts */
+        if(to_ghost) {
+            /* Adjust global section count totals */
+            fspace->serial_sect_count--;
+            fspace->ghost_sect_count++;
+
+            /* Adjust bin's section count totals */
+            fspace->sinfo->bins[bin].serial_sect_count--;
+            fspace->sinfo->bins[bin].ghost_sect_count++;
+
+            /* Adjust section size node's section count totals */
+            fspace_node->serial_count--;
+            fspace_node->ghost_count++;
+
+            /* Check if we switched a section size node's status */
+            if(fspace_node->serial_count == 0)
+                fspace->sinfo->serial_size_count--;
+            if(fspace_node->ghost_count == 1)
+                fspace->sinfo->ghost_size_count++;
+        } /* end if */
+        else {
+            /* Adjust global section count totals */
+            fspace->serial_sect_count++;
+            fspace->ghost_sect_count--;
+
+            /* Adjust bin's section count totals */
+            fspace->sinfo->bins[bin].serial_sect_count++;
+            fspace->sinfo->bins[bin].ghost_sect_count--;
+
+            /* Adjust section size node's section count totals */
+            fspace_node->serial_count++;
+            fspace_node->ghost_count--;
+
+            /* Check if we switched a section size node's status */
+            if(fspace_node->serial_count == 1)
+                fspace->sinfo->serial_size_count++;
+            if(fspace_node->ghost_count == 0)
+                fspace->sinfo->ghost_size_count--;
+        } /* end else */
+    } /* end if */
+
+    /* Check if the section's class change will affect the mergable list */
+    if((old_cls->flags & H5FS_CLS_SEPAR_OBJ) != (new_cls->flags & H5FS_CLS_SEPAR_OBJ)) {
+        hbool_t to_mergable;       /* Flag if the section is changing to a mergable section */
+
+        /* Determine if this section is becoming mergable or is becoming separate */
+        if(old_cls->flags & H5FS_CLS_SEPAR_OBJ)
+            to_mergable = TRUE;
+        else
+            to_mergable = FALSE;
+#ifdef QAK
+HDfprintf(stderr, "%s: to_mergable = %u\n", FUNC, to_mergable);
+#endif /* QAK */
+
+        /* Add or remove section from merge list, as appropriate */
+        if(to_mergable) {
+#ifdef QAK
+HDfprintf(stderr, "%s: inserting object into merge list, sect->type = %u\n", FUNC, (unsigned)sect->type);
+#endif /* QAK */
+            if(fspace->sinfo->merge_list == NULL)
+                if(NULL == (fspace->sinfo->merge_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTCREATE, FAIL, "can't create skip list for merging free space sections")
+            if(H5SL_insert(fspace->sinfo->merge_list, sect, &sect->addr) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space node into merging skip list")
+        } /* end if */
+        else {
+            H5FS_section_info_t *tmp_sect_node; /* Temporary section node */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: removing object from merge list, sect->type = %u\n", FUNC, (unsigned)sect->type);
+#endif /* QAK */
+            tmp_sect_node = (H5FS_section_info_t *)H5SL_remove(fspace->sinfo->merge_list, &sect->addr);
+            if(tmp_sect_node == NULL || tmp_sect_node != sect)
+                HGOTO_ERROR(H5E_FSPACE, H5E_NOTFOUND, FAIL, "can't find section node on size list")
+        } /* end else */
+    } /* end if */
+
+    /* Change the section's class */
+    sect->type = new_class;
+
+    /* Change the serialized size of sections */
+    fspace->sinfo->serial_size -= fspace->sect_cls[old_class].serial_size;
+    fspace->sinfo->serial_size += fspace->sect_cls[new_class].serial_size;
+
+    /* Update current space used for free space sections */
+    if(H5FS_sect_serialize_size(fspace) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTCOMPUTE, FAIL, "can't adjust free space section size on disk")
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, TRUE) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_change_class() */
+
+#ifdef H5FS_DEBUG_ASSERT
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_assert
+ *
+ * Purpose:	Verify that the sections managed are mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_assert(const H5FS_t *fspace)
+{
+    hsize_t separate_obj;       /* The number of separate objects managed */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+#ifdef QAK
+HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", "H5FS_sect_assert", fspace->tot_sect_count);
+#endif /* QAK */
+
+    /* Initialize state */
+    separate_obj = 0;
+
+    /* Check for bins to work on */
+    if(fspace->sinfo->bins) {
+        hsize_t acc_tot_sect_count;     /* Accumulated total section count from bins */
+        hsize_t acc_serial_sect_count;  /* Accumulated serializable section count from bins */
+        hsize_t acc_ghost_sect_count;   /* Accumulated ghost section count from bins */
+        size_t acc_tot_size_count;      /* Accumulated total section size count from bins */
+        size_t acc_serial_size_count;   /* Accumulated serializable section size count from bins */
+        size_t acc_ghost_size_count;    /* Accumulated ghost section size count from bins */
+        unsigned u;             /* Local index variable */
+
+        /* Walk through all sections in bins */
+        acc_tot_sect_count = 0;
+        acc_serial_sect_count = 0;
+        acc_ghost_sect_count = 0;
+        acc_tot_size_count = 0;
+        acc_serial_size_count = 0;
+        acc_ghost_size_count = 0;
+        for(u = 0; u < fspace->sinfo->nbins; u++) {
+            acc_tot_sect_count += fspace->sinfo->bins[u].tot_sect_count;
+            acc_serial_sect_count += fspace->sinfo->bins[u].serial_sect_count;
+            acc_ghost_sect_count += fspace->sinfo->bins[u].ghost_sect_count;
+            if(fspace->sinfo->bins[u].bin_list) {
+                H5SL_node_t *curr_size_node;    /* Current section size node in skip list */
+                size_t bin_serial_count;        /* # of serializable sections in this bin */
+                size_t bin_ghost_count;         /* # of ghost sections in this bin */
+
+                acc_tot_size_count += H5SL_count(fspace->sinfo->bins[u].bin_list);
+
+                /* Walk through the sections in this bin */
+                curr_size_node = H5SL_first(fspace->sinfo->bins[u].bin_list);
+                bin_serial_count = 0;
+                bin_ghost_count = 0;
+                while(curr_size_node != NULL) {
+                    H5FS_node_t *fspace_node;       /* Section size node */
+                    H5SL_node_t *curr_sect_node;    /* Current section node in skip list */
+                    size_t size_serial_count;       /* # of serializable sections of this size */
+                    size_t size_ghost_count;        /* # of ghost sections of this size */
+
+                    /* Get section size node */
+                    fspace_node = H5SL_item(curr_size_node);
+
+                    /* Check sections on list */
+                    curr_sect_node = H5SL_first(fspace_node->sect_list);
+                    size_serial_count = 0;
+                    size_ghost_count = 0;
+                    while(curr_sect_node != NULL) {
+                        H5FS_section_class_t *cls;      /* Class of section */
+                        H5FS_section_info_t *sect;      /* Section */
+
+                        /* Get section node & it's class */
+                        sect = H5SL_item(curr_sect_node);
+                        cls = &fspace->sect_cls[sect->type];
+#ifdef QAK
+HDfprintf(stderr, "%s: sect->size = %Hu, sect->addr = %a, sect->type = %u\n", "H5FS_assert", sect->size, sect->addr, sect->type);
+#endif /* QAK */
+
+                        /* Sanity check section */
+                        HDassert(H5F_addr_defined(sect->addr));
+                        HDassert(fspace_node->sect_size == sect->size);
+                        if(cls->valid)
+                            (*cls->valid)(cls, sect);
+
+                        /* Add to correct count */
+                        if(cls->flags & H5FS_CLS_GHOST_OBJ)
+                            size_ghost_count++;
+                        else
+                            size_serial_count++;
+
+                        /* Count node, if separate */
+                        if(cls->flags & H5FS_CLS_SEPAR_OBJ)
+                            separate_obj++;
+
+                        /* Get the next section node in the list */
+                        curr_sect_node = H5SL_next(curr_sect_node);
+                    } /* end while */
+
+                    /* Check the number of serializable & ghost sections of this size */
+                    HDassert(fspace_node->serial_count == size_serial_count);
+                    HDassert(fspace_node->ghost_count == size_ghost_count);
+
+                    /* Add to global count of serializable & ghost section sizes */
+                    if(fspace_node->serial_count > 0)
+                        acc_serial_size_count++;
+                    if(fspace_node->ghost_count > 0)
+                        acc_ghost_size_count++;
+
+                    /* Add to bin's serializable & ghost counts */
+                    bin_serial_count += size_serial_count;
+                    bin_ghost_count += size_ghost_count;
+
+                    /* Get the next section size node in the list */
+                    curr_size_node = H5SL_next(curr_size_node);
+                } /* end while */
+
+                /* Check the number of serializable & ghost sections in this bin */
+                HDassert(fspace->sinfo->bins[u].tot_sect_count == (bin_serial_count + bin_ghost_count));
+                HDassert(fspace->sinfo->bins[u].serial_sect_count == bin_serial_count);
+                HDassert(fspace->sinfo->bins[u].ghost_sect_count == bin_ghost_count);
+            } /* end if */
+        } /* end for */
+
+        /* Check counts from bins vs. global counts */
+        HDassert(fspace->sinfo->tot_size_count == acc_tot_size_count);
+        HDassert(fspace->sinfo->serial_size_count == acc_serial_size_count);
+        HDassert(fspace->sinfo->ghost_size_count == acc_ghost_size_count);
+        HDassert(fspace->tot_sect_count == acc_tot_sect_count);
+        HDassert(fspace->serial_sect_count == acc_serial_sect_count);
+        HDassert(fspace->ghost_sect_count == acc_ghost_sect_count);
+    } /* end if */
+    else {
+        /* Check counts are zero */
+        HDassert(fspace->tot_sect_count == 0);
+        HDassert(fspace->serial_sect_count == 0);
+        HDassert(fspace->ghost_sect_count == 0);
+    } /* end else */
+
+    /* Make certain that the number of sections on the address list is correct */
+    if(fspace->sinfo->merge_list)
+        HDassert(fspace->tot_sect_count == (separate_obj + H5SL_count(fspace->sinfo->merge_list)));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS_sect_assert() */
+#endif /* H5FS_DEBUG_ASSERT */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_try_shrink_eoa
+ *
+ * Purpose:	To shrink the last section on the merge list if the section
+ *		is at EOF.
+ *
+ * Return:      Success:        non-negative (TRUE/FALSE)
+ *              Failure:        negative
+ *
+ * Programmer:	Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FS_sect_try_shrink_eoa(const H5F_t *f, hid_t dxpl_id, const H5FS_t *fspace, void *op_data)
+{
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    hbool_t section_removed = FALSE;    /* Whether a section was removed */
+    htri_t ret_value = FALSE;          	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(fspace);
+
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+    sinfo_valid = TRUE;
+
+    if(fspace->sinfo && fspace->sinfo->merge_list) {
+        H5SL_node_t *last_node;         	/* Last node in merge list */
+
+        /* Check for last node in the merge list */
+        if(NULL != (last_node = H5SL_last(fspace->sinfo->merge_list))) {
+            H5FS_section_info_t *tmp_sect;  	/* Temporary free space section */
+            H5FS_section_class_t *tmp_sect_cls;	/* Temporary section's class */
+
+            /* Get the pointer to the last section, from the last node */
+            tmp_sect = (H5FS_section_info_t *)H5SL_item(last_node);
+            HDassert(tmp_sect);
+	    tmp_sect_cls = &fspace->sect_cls[tmp_sect->type];
+	    if(tmp_sect_cls->can_shrink) {
+                /* Check if the section can be shrunk away */
+		if((ret_value = (*tmp_sect_cls->can_shrink)(tmp_sect, op_data)) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTSHRINK, FAIL, "can't check for shrinking container")
+		if(ret_value > 0) {
+		    HDassert(tmp_sect_cls->shrink);
+
+                    /* Remove section from free space manager */
+		    if(H5FS_sect_remove_real(fspace, tmp_sect) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+                    section_removed = TRUE;
+
+                    /* Shrink away section */
+		    if((*tmp_sect_cls->shrink)(&tmp_sect, op_data) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't shrink free space container")
+		} /* end if */
+	    } /* end if */
+	} /* end if */
+    } /* end if */
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, section_removed) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_try_shrink_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS_sect_query_last_sect
+ *
+ * Purpose:	Retrieve info about the last section on the merge list
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_sect_query_last_sect(const H5FS_t *fspace, haddr_t *sect_addr, hsize_t *sect_size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fspace);
+
+    if(fspace->sinfo && fspace->sinfo->merge_list) {
+        H5SL_node_t *last_node;             /* Last node in merge list */
+
+        /* Check for last node in the merge list */
+        if(NULL != (last_node = H5SL_last(fspace->sinfo->merge_list))) {
+            H5FS_section_info_t *tmp_sect;      /* Temporary free space section */
+
+            /* Get the pointer to the last section, from the last node */
+            tmp_sect = (H5FS_section_info_t *)H5SL_item(last_node);
+            HDassert(tmp_sect);
+	    if(sect_addr)
+                *sect_addr = tmp_sect->addr;
+	    if(sect_size)
+                *sect_size = tmp_sect->size;
+	} /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_sect_query_last_sect() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FSstat.c b/gatb-core/thirdparty/hdf5/src/H5FSstat.c
new file mode 100644
index 0000000..66c5495
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FSstat.c
@@ -0,0 +1,106 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Free-space metadata statistics functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* Free-space manager 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_stat_info
+ *
+ * Purpose:     Retrieve metadata statistics for the free-space manager
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        does not fail
+ *
+ * Programmer:  Vailin Choi
+ *		August 25th, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_stat_info(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *stats)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(frsp);
+    HDassert(stats);
+
+    /* Report statistics for free space */
+    stats->tot_space = frsp->tot_space;
+    stats->tot_sect_count = frsp->tot_sect_count;
+    stats->serial_sect_count = frsp->serial_sect_count;
+    stats->ghost_sect_count = frsp->ghost_sect_count;
+    stats->addr = frsp->addr;
+    stats->hdr_size = (size_t)H5FS_HEADER_SIZE(f);
+    stats->sect_addr = frsp->sect_addr;
+    stats->alloc_sect_size = frsp->alloc_sect_size;
+    stats->sect_size = frsp->sect_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_stat_info() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5FStest.c b/gatb-core/thirdparty/hdf5/src/H5FStest.c
new file mode 100644
index 0000000..63ba94c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5FStest.c
@@ -0,0 +1,156 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Free-space manager testing functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#define H5FS_TESTING		/*suppress warning about H5FS testing funcs */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FSpkg.h"		/* Free-space manager			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_get_cparam_test
+ *
+ * Purpose:     Retrieve the parameters used to create the free-space manager
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  similar to H5HF_get_cparam_test()
+ *		Vailin Choi; August 25th, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_get_cparam_test(const H5FS_t *frsp, H5FS_create_t *cparam)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(frsp);
+    HDassert(cparam);
+
+    cparam->client = frsp->client;
+    cparam->shrink_percent = frsp->shrink_percent;
+    cparam->expand_percent = frsp->expand_percent;
+    cparam->max_sect_addr = frsp->max_sect_addr;
+    cparam->max_sect_size = frsp->max_sect_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5FS_get_cparam_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_cmp_cparam_test
+ *
+ * Purpose:     Compare the parameters used to create the fractal heap
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  similar to H5HF_cmp_cparam_test()
+ *		Vailin Choi; August 25th, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5FS_cmp_cparam_test(const H5FS_create_t *cparam1, const H5FS_create_t *cparam2)
+{
+    int ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(cparam1);
+    HDassert(cparam2);
+
+    if(cparam1->client < cparam2->client)
+        HGOTO_DONE(-1)
+    else if(cparam1->client > cparam2->client)
+        HGOTO_DONE(1)
+
+    if(cparam1->shrink_percent < cparam2->shrink_percent)
+        HGOTO_DONE(-1)
+    else if(cparam1->shrink_percent > cparam2->shrink_percent)
+        HGOTO_DONE(1)
+
+    if(cparam1->expand_percent < cparam2->expand_percent)
+        HGOTO_DONE(-1)
+    else if(cparam1->expand_percent > cparam2->expand_percent)
+        HGOTO_DONE(1)
+
+    if(cparam1->max_sect_size < cparam2->max_sect_size)
+        HGOTO_DONE(-1)
+    else if(cparam1->max_sect_size > cparam2->max_sect_size)
+        HGOTO_DONE(1)
+
+    if(cparam1->max_sect_addr < cparam2->max_sect_addr)
+        HGOTO_DONE(-1)
+    else if(cparam1->max_sect_addr > cparam2->max_sect_addr)
+        HGOTO_DONE(1)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_cmp_cparam_test */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Faccum.c b/gatb-core/thirdparty/hdf5/src/H5Faccum.c
new file mode 100644
index 0000000..71ca9e5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Faccum.c
@@ -0,0 +1,1085 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Faccum.c
+ *                      Jan 10 2008
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             File metadata "accumulator" routines.  (Used to
+ *                      cache small metadata I/Os and group them into a
+ *                      single larger I/O)
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Metadata accumulator controls */
+#define H5F_ACCUM_THROTTLE      8
+#define H5F_ACCUM_THRESHOLD     2048
+#define H5F_ACCUM_MAX_SIZE      (1024 *1024) /* Max. accum. buf size (max. I/Os will be 1/2 this size) */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Enumerated type to indicate how data will be added to accumulator */
+typedef enum {
+    H5F_ACCUM_PREPEND,          /* Data will be prepended to accumulator */
+    H5F_ACCUM_APPEND            /* Data will be appended to accumulator */
+} H5F_accum_adjust_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a PQ free list to manage the metadata accumulator buffer */
+H5FL_BLK_DEFINE_STATIC(meta_accum);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__accum_read
+ *
+ * Purpose:	Attempts to read some data from the metadata accumulator for
+ *              a file into a buffer.
+ *
+ * Note:	We can't change (or add to) the metadata accumulator, because
+ *		this might be a speculative read and could possibly read raw
+ *		data into the metadata accumulator.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan 10 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t type, haddr_t addr,
+    size_t size, void *buf/*out*/)
+{
+    H5FD_mem_t  map_type;               /* Mapped memory type */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(fio_info->dxpl);
+    HDassert(buf);
+
+    /* Treat global heap as raw data */
+    map_type = (type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type;
+
+    /* Check if this information is in the metadata accumulator */
+    if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) {
+        H5F_meta_accum_t *accum;     /* Alias for file's metadata accumulator */
+
+        /* Set up alias for file's metadata accumulator info */
+        accum = &fio_info->f->shared->accum;
+
+        if(size < H5F_ACCUM_MAX_SIZE) {
+            /* Sanity check */
+            HDassert(!accum->buf || (accum->alloc_size >= accum->size));
+
+            /* Current read adjoins or overlaps with metadata accumulator */
+            if(H5F_addr_overlap(addr, size, accum->loc, accum->size)
+                    || ((addr + size) == accum->loc)
+                    || (accum->loc + accum->size) == addr) {
+                size_t amount_before;       /* Amount to read before current accumulator */
+                haddr_t new_addr;           /* New address of the accumulator buffer */
+                size_t new_size;            /* New size of the accumulator buffer */
+
+                /* Compute new values for accumulator */
+                new_addr = MIN(addr, accum->loc);
+                new_size = (size_t)(MAX((addr + size), (accum->loc + accum->size)) - new_addr);
+
+                /* Check if we need more buffer space */
+                if(new_size > accum->alloc_size) {
+                    size_t new_alloc_size;        /* New size of accumulator */
+
+                    /* Adjust the buffer size to be a power of 2 that is large enough to hold data */
+                    new_alloc_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(new_size - 1)));
+
+                    /* Reallocate the metadata accumulator buffer */
+                    if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_alloc_size)))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+
+                    /* Note the new buffer size */
+                    accum->alloc_size = new_alloc_size;
+#ifdef H5_CLEAR_MEMORY
+    HDmemset(accum->buf + accum->size, 0, (accum->alloc_size - accum->size));
+#endif /* H5_CLEAR_MEMORY */
+                } /* end if */
+
+                /* Read the part before the metadata accumulator */
+                if(addr < accum->loc) {
+                    /* Set the amount to read */
+                    H5_CHECKED_ASSIGN(amount_before, size_t, (accum->loc - addr), hsize_t);
+
+                    /* Make room for the metadata to read in */
+                    HDmemmove(accum->buf + amount_before, accum->buf, accum->size);
+
+                    /* Adjust dirty region tracking info, if present */
+                    if(accum->dirty)
+                        accum->dirty_off += amount_before;
+
+                    /* Dispatch to driver */
+                    if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, amount_before, accum->buf) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
+                } /* end if */
+                else
+                    amount_before = 0;
+
+                /* Read the part after the metadata accumulator */
+                if((addr + size) > (accum->loc + accum->size)) {
+                    size_t amount_after;         /* Amount to read at a time */
+
+                    /* Set the amount to read */
+                    H5_CHECKED_ASSIGN(amount_after, size_t, ((addr + size) - (accum->loc + accum->size)), hsize_t);
+
+                    /* Dispatch to driver */
+                    if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, (accum->loc + accum->size), amount_after, (accum->buf + accum->size + amount_before)) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
+                } /* end if */
+
+                /* Copy the data out of the buffer */
+                HDmemcpy(buf, accum->buf + (addr - new_addr), size);
+
+                /* Adjust the accumulator address & size */
+                accum->loc = new_addr;
+                accum->size = new_size;
+            } /* end if */
+            /* Current read doesn't overlap with metadata accumulator, read it from file */
+            else {
+                /* Dispatch to driver */
+                if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
+            } /* end else */
+        } /* end if */
+        else {
+            /* Read the data */
+            if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
+
+            /* Check for overlap w/dirty accumulator */
+            /* (Note that this could be improved by updating the non-dirty
+             *  information in the accumulator with [some of] the information
+             *  just read in. -QAK)
+             */
+            if(accum->dirty &&
+                    H5F_addr_overlap(addr, size, accum->loc + accum->dirty_off, accum->dirty_len)) {
+                haddr_t dirty_loc = accum->loc + accum->dirty_off;  /* File offset of dirty information */
+                size_t buf_off;         /* Offset of dirty region in buffer */
+                size_t dirty_off;       /* Offset within dirty region */
+                size_t overlap_size;    /* Size of overlap with dirty region */
+
+                /* Check for read starting before beginning dirty region */
+                if(H5F_addr_le(addr, dirty_loc)) {
+                    /* Compute offset of dirty region within buffer */
+                    buf_off = (size_t)(dirty_loc - addr);
+
+                    /* Compute offset within dirty region */
+                    dirty_off = 0;
+
+                    /* Check for read ending within dirty region */
+                    if(H5F_addr_lt(addr + size, dirty_loc + accum->dirty_len))
+                        overlap_size = (size_t)((addr + size) - buf_off);
+                    else        /* Access covers whole dirty region */
+                        overlap_size = accum->dirty_len;
+                } /* end if */
+                else { /* Read starts after beginning of dirty region */
+                    /* Compute dirty offset within buffer and overlap size */
+                    buf_off = 0;
+                    dirty_off = (size_t)(addr - dirty_loc);
+                    overlap_size = (size_t)((dirty_loc + accum->dirty_len) - addr);
+                } /* end else */
+
+                /* Copy the dirty region to buffer */
+                HDmemcpy((unsigned char *)buf + buf_off, (unsigned char *)accum->buf + accum->dirty_off + dirty_off, overlap_size);
+            } /* end if */
+        } /* end else */
+    } /* end if */
+    else {
+        /* Read the data */
+        if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__accum_adjust
+ *
+ * Purpose:	Adjust accumulator size, if necessary
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 11 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
+    H5F_accum_adjust_t adjust, size_t size)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(accum);
+    HDassert(fio_info);
+    HDassert(H5F_ACCUM_APPEND == adjust || H5F_ACCUM_PREPEND == adjust);
+    HDassert(size > 0);
+    HDassert(size <= H5F_ACCUM_MAX_SIZE);
+
+    /* Check if we need more buffer space */
+    if((size + accum->size) > accum->alloc_size) {
+        size_t new_size;        /* New size of accumulator */
+
+        /* Adjust the buffer size to be a power of 2 that is large enough to hold data */
+        new_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)((size + accum->size) - 1)));
+
+        /* Check for accumulator getting too big */
+        if(new_size > H5F_ACCUM_MAX_SIZE) {
+            size_t shrink_size;     /* Amount to shrink accumulator by */
+            size_t remnant_size;    /* Amount left in accumulator */
+
+            /* Cap the accumulator's growth, leaving some room */
+
+            /* Determine the amounts to work with */
+            if(size > (H5F_ACCUM_MAX_SIZE / 2)) {
+                new_size = H5F_ACCUM_MAX_SIZE;
+                shrink_size = accum->size;
+                remnant_size = 0;
+            } /* end if */
+            else {
+                if(H5F_ACCUM_PREPEND == adjust) {
+                    new_size = (H5F_ACCUM_MAX_SIZE / 2);
+                    shrink_size = (H5F_ACCUM_MAX_SIZE / 2);
+                    remnant_size = accum->size - shrink_size;
+                } /* end if */
+                else {
+                    size_t adjust_size = size + accum->dirty_len;
+
+                    /* Check if we can slide the dirty region down, to accommodate the request */
+                    if(accum->dirty && (adjust_size <= H5F_ACCUM_MAX_SIZE)) {
+                        if((ssize_t)(H5F_ACCUM_MAX_SIZE - (accum->dirty_off + adjust_size)) >= (ssize_t)(2 * size))
+                            shrink_size = accum->dirty_off / 2;
+                        else
+                            shrink_size = accum->dirty_off;
+                        remnant_size = accum->size - shrink_size;
+                        new_size = remnant_size + size;
+                    } /* end if */
+                    else {
+                        new_size = (H5F_ACCUM_MAX_SIZE / 2);
+                        shrink_size = (H5F_ACCUM_MAX_SIZE / 2);
+                        remnant_size = accum->size - shrink_size;
+                    } /* end else */
+                } /* end else */
+            } /* end else */
+
+            /* Check if we need to flush accumulator data to file */
+            if(accum->dirty) {
+                /* Check whether to accumulator will be prepended or appended */
+                if(H5F_ACCUM_PREPEND == adjust) {
+                    /* Check if the dirty region overlaps the region to eliminate from the accumulator */
+                    if((accum->size - shrink_size) < (accum->dirty_off + accum->dirty_len)) {
+                        /* Write out the dirty region from the metadata accumulator, with dispatch to driver */
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
+                            HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed")
+
+                        /* Reset accumulator dirty flag */
+                        accum->dirty = FALSE;
+                    } /* end if */
+                } /* end if */
+                else {
+                    /* Check if the dirty region overlaps the region to eliminate from the accumulator */
+                    if(shrink_size > accum->dirty_off) {
+                        /* Write out the dirty region from the metadata accumulator, with dispatch to driver */
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
+                            HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed")
+
+                        /* Reset accumulator dirty flag */
+                        accum->dirty = FALSE;
+                    } /* end if */
+
+                    /* Adjust dirty region tracking info */
+                    accum->dirty_off -= shrink_size;
+                } /* end else */
+            } /* end if */
+
+            /* Trim the accumulator's use of its buffer */
+            accum->size = remnant_size;
+            
+            /* When appending, need to adjust location of accumulator */
+            if (H5F_ACCUM_APPEND == adjust) {
+                /* Move remnant of accumulator down */
+                HDmemmove(accum->buf, (accum->buf + shrink_size), remnant_size);
+
+                /* Adjust accumulator's location */
+                accum->loc += shrink_size;
+            } /* end if */
+        } /* end if */
+
+        /* Check for accumulator needing to be reallocated */
+        if(new_size > accum->alloc_size) {
+            unsigned char      *new_buf;            /* New buffer to hold the accumulated metadata */
+
+            /* Reallocate the metadata accumulator buffer */
+            if(NULL == (new_buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_size)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate metadata accumulator buffer")
+
+            /* Update accumulator info */
+            accum->buf = new_buf;
+            accum->alloc_size = new_size;
+#ifdef H5_CLEAR_MEMORY
+HDmemset(accum->buf + accum->size, 0, (accum->alloc_size - (accum->size + size)));
+#endif /* H5_CLEAR_MEMORY */
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_adjust() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__accum_write
+ *
+ * Purpose:	Attempts to write some data to the metadata accumulator for
+ *              a file from a buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan 10 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t type, haddr_t addr,
+    size_t size, const void *buf)
+{
+    H5FD_mem_t  map_type;               /* Mapped memory type */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(H5F_INTENT(fio_info->f) & H5F_ACC_RDWR);
+    HDassert(fio_info->dxpl);
+    HDassert(buf);
+
+    /* Treat global heap as raw data */
+    map_type = (type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type;
+
+    /* Check for accumulating metadata */
+    if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) {
+        H5F_meta_accum_t *accum;     /* Alias for file's metadata accumulator */
+
+        /* Set up alias for file's metadata accumulator info */
+        accum = &fio_info->f->shared->accum;
+
+        if(size < H5F_ACCUM_MAX_SIZE) {
+            /* Sanity check */
+            HDassert(!accum->buf || (accum->alloc_size >= accum->size));
+
+            /* Check if there is already metadata in the accumulator */
+            if(accum->size > 0) {
+                /* Check if the new metadata adjoins the beginning of the current accumulator */
+                if((addr + size) == accum->loc) {
+                    /* Check if we need to adjust accumulator size */
+                    if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, size) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
+
+                    /* Move the existing metadata to the proper location */
+                    HDmemmove(accum->buf + size, accum->buf, accum->size);
+
+                    /* Copy the new metadata at the front */
+                    HDmemcpy(accum->buf, buf, size);
+
+                    /* Set the new size & location of the metadata accumulator */
+                    accum->loc = addr;
+                    accum->size += size;
+
+                    /* Adjust the dirty region and mark accumulator dirty */
+                    if(accum->dirty)
+                        accum->dirty_len = size + accum->dirty_off + accum->dirty_len;
+                    else {
+                        accum->dirty_len = size;
+                        accum->dirty = TRUE;
+                    } /* end else */
+                    accum->dirty_off = 0;
+                } /* end if */
+                /* Check if the new metadata adjoins the end of the current accumulator */
+                else if(addr == (accum->loc + accum->size)) {
+                    /* Check if we need to adjust accumulator size */
+                    if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, size) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
+
+                    /* Copy the new metadata to the end */
+                    HDmemcpy(accum->buf + accum->size, buf, size);
+
+                    /* Adjust the dirty region and mark accumulator dirty */
+                    if(accum->dirty)
+                        accum->dirty_len = size + (accum->size - accum->dirty_off);
+                    else {
+                        accum->dirty_off = accum->size;
+                        accum->dirty_len = size;
+                        accum->dirty = TRUE;
+                    } /* end else */
+
+                    /* Set the new size of the metadata accumulator */
+                    accum->size += size;
+                } /* end if */
+                /* Check if the piece of metadata being written overlaps the metadata accumulator */
+                else if(H5F_addr_overlap(addr, size, accum->loc, accum->size)) {
+                    size_t add_size;    /* New size of the accumulator buffer */
+
+                    /* Check if the new metadata is entirely within the current accumulator */
+                    if(addr >= accum->loc && (addr + size) <= (accum->loc + accum->size)) {
+                        size_t dirty_off = (size_t)(addr - accum->loc);
+
+                        /* Copy the new metadata to the proper location within the accumulator */
+                        HDmemcpy(accum->buf + dirty_off, buf, size);
+
+                        /* Adjust the dirty region and mark accumulator dirty */
+                        if(accum->dirty) {
+                            /* Check for new metadata starting before current dirty region */
+                            if(dirty_off <= accum->dirty_off) {
+                                if((dirty_off + size) <= (accum->dirty_off + accum->dirty_len))
+                                    accum->dirty_len = (accum->dirty_off + accum->dirty_len) - dirty_off;
+                                else
+                                    accum->dirty_len = size;
+                                accum->dirty_off = dirty_off;
+                            } /* end if */
+                            else {
+                                if((dirty_off + size) <= (accum->dirty_off + accum->dirty_len))
+                                    ; /* accum->dirty_len doesn't change */
+                                else
+                                    accum->dirty_len = (dirty_off + size) - accum->dirty_off;
+                            } /* end else */
+                        } /* end if */
+                        else {
+                            accum->dirty_off = dirty_off;
+                            accum->dirty_len = size;
+                            accum->dirty = TRUE;
+                        } /* end else */
+                    } /* end if */
+                    /* Check if the new metadata overlaps the beginning of the current accumulator */
+                    else if(addr < accum->loc && (addr + size) <= (accum->loc + accum->size)) {
+                        size_t old_offset;  /* Offset of old data within the accumulator buffer */
+
+                        /* Calculate the amount we will need to add to the accumulator size, based on the amount of overlap */
+                        H5_CHECKED_ASSIGN(add_size, size_t, (accum->loc - addr), hsize_t);
+
+                        /* Check if we need to adjust accumulator size */
+                        if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, add_size) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
+
+                        /* Calculate the proper offset of the existing metadata */
+                        H5_CHECKED_ASSIGN(old_offset, size_t, (addr + size) - accum->loc, hsize_t);
+
+                        /* Move the existing metadata to the proper location */
+                        HDmemmove(accum->buf + size, accum->buf + old_offset, (accum->size - old_offset));
+
+                        /* Copy the new metadata at the front */
+                        HDmemcpy(accum->buf, buf, size);
+
+                        /* Set the new size & location of the metadata accumulator */
+                        accum->loc = addr;
+                        accum->size += add_size;
+
+                        /* Adjust the dirty region and mark accumulator dirty */
+                        if(accum->dirty) {
+                            size_t curr_dirty_end = add_size + accum->dirty_off + accum->dirty_len;
+
+                            accum->dirty_off = 0;
+                            if(size <= curr_dirty_end)
+                                accum->dirty_len = curr_dirty_end;
+                            else
+                                accum->dirty_len = size;
+                        } /* end if */
+                        else {
+                            accum->dirty_off = 0;
+                            accum->dirty_len = size;
+                            accum->dirty = TRUE;
+                        } /* end else */
+                    } /* end if */
+                    /* Check if the new metadata overlaps the end of the current accumulator */
+                    else if(addr >= accum->loc && (addr + size) > (accum->loc + accum->size)) {
+                        size_t dirty_off;           /* Offset of dirty region */
+
+                        /* Calculate the amount we will need to add to the accumulator size, based on the amount of overlap */
+                        H5_CHECKED_ASSIGN(add_size, size_t, (addr + size) - (accum->loc + accum->size), hsize_t);
+
+                        /* Check if we need to adjust accumulator size */
+                        if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, add_size) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
+
+                        /* Compute offset of dirty region (after adjusting accumulator) */
+                        dirty_off = (size_t)(addr - accum->loc);
+
+                        /* Copy the new metadata to the end */
+                        HDmemcpy(accum->buf + dirty_off, buf, size);
+
+                        /* Set the new size of the metadata accumulator */
+                        accum->size += add_size;
+
+                        /* Adjust the dirty region and mark accumulator dirty */
+                        if(accum->dirty) {
+                            /* Check for new metadata starting before current dirty region */
+                            if(dirty_off <= accum->dirty_off) {
+                                accum->dirty_off = dirty_off;
+                                accum->dirty_len = size;
+                            } /* end if */
+                            else {
+                                accum->dirty_len = (dirty_off + size) - accum->dirty_off;
+                            } /* end else */
+                        } /* end if */
+                        else {
+                            accum->dirty_off = dirty_off;
+                            accum->dirty_len = size;
+                            accum->dirty = TRUE;
+                        } /* end else */
+                    } /* end if */
+                    /* New metadata overlaps both ends of the current accumulator */
+                    else {
+                        /* Check if we need more buffer space */
+                        if(size > accum->alloc_size) {
+                            size_t new_alloc_size;        /* New size of accumulator */
+
+                            /* Adjust the buffer size to be a power of 2 that is large enough to hold data */
+                            new_alloc_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1)));
+
+                            /* Reallocate the metadata accumulator buffer */
+                            if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_alloc_size)))
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+
+                            /* Note the new buffer size */
+                            accum->alloc_size = new_alloc_size;
+#ifdef H5_CLEAR_MEMORY
+HDmemset(accum->buf + size, 0, (accum->alloc_size - size));
+#endif /* H5_CLEAR_MEMORY */
+                        } /* end if */
+
+                        /* Copy the new metadata to the buffer */
+                        HDmemcpy(accum->buf, buf, size);
+
+                        /* Set the new size & location of the metadata accumulator */
+                        accum->loc = addr;
+                        accum->size = size;
+
+                        /* Adjust the dirty region and mark accumulator dirty */
+                        accum->dirty_off = 0;
+                        accum->dirty_len = size;
+                        accum->dirty = TRUE;
+                    } /* end else */
+                } /* end if */
+                /* New piece of metadata doesn't adjoin or overlap the existing accumulator */
+                else {
+                    /* Write out the existing metadata accumulator, with dispatch to driver */
+                    if(accum->dirty) {
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, accum->loc + accum->dirty_off, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+
+                        /* Reset accumulator dirty flag */
+                        accum->dirty = FALSE;
+                    } /* end if */
+
+                    /* Cache the new piece of metadata */
+                    /* Check if we need to resize the buffer */
+                    if(size > accum->alloc_size) {
+                        size_t new_size;        /* New size of accumulator */
+
+                        /* Adjust the buffer size to be a power of 2 that is large enough to hold data */
+                        new_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1)));
+
+                        /* Grow the metadata accumulator buffer */
+                        if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+
+                        /* Note the new buffer size */
+                        accum->alloc_size = new_size;
+#ifdef H5_CLEAR_MEMORY
+{
+size_t clear_size = MAX(accum->size, size);
+HDmemset(accum->buf + clear_size, 0, (accum->alloc_size - clear_size));
+}
+#endif /* H5_CLEAR_MEMORY */
+                    } /* end if */
+                    else {
+                        /* Check if we should shrink the accumulator buffer */
+                        if(size < (accum->alloc_size / H5F_ACCUM_THROTTLE) &&
+                                accum->alloc_size > H5F_ACCUM_THRESHOLD) {
+                            size_t tmp_size = (accum->alloc_size / H5F_ACCUM_THROTTLE); /* New size of accumulator buffer */
+
+                            /* Shrink the accumulator buffer */
+                            if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, tmp_size)))
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+
+                            /* Note the new buffer size */
+                            accum->alloc_size = tmp_size;
+                        } /* end if */
+                    } /* end else */
+
+                    /* Update the metadata accumulator information */
+                    accum->loc = addr;
+                    accum->size = size;
+
+                    /* Store the piece of metadata in the accumulator */
+                    HDmemcpy(accum->buf, buf, size);
+
+                    /* Adjust the dirty region and mark accumulator dirty */
+                    accum->dirty_off = 0;
+                    accum->dirty_len = size;
+                    accum->dirty = TRUE;
+                } /* end else */
+            } /* end if */
+            /* No metadata in the accumulator, grab this piece and keep it */
+            else {
+                /* Check if we need to reallocate the buffer */
+                if(size > accum->alloc_size) {
+                    size_t new_size;        /* New size of accumulator */
+
+                    /* Adjust the buffer size to be a power of 2 that is large enough to hold data */
+                    new_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1)));
+
+                    /* Reallocate the metadata accumulator buffer */
+                    if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_size)))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+
+                    /* Note the new buffer size */
+                    accum->alloc_size = new_size;
+#ifdef H5_CLEAR_MEMORY
+HDmemset(accum->buf + size, 0, (accum->alloc_size - size));
+#endif /* H5_CLEAR_MEMORY */
+                } /* end if */
+
+                /* Update the metadata accumulator information */
+                accum->loc = addr;
+                accum->size = size;
+
+                /* Store the piece of metadata in the accumulator */
+                HDmemcpy(accum->buf, buf, size);
+
+                /* Adjust the dirty region and mark accumulator dirty */
+                accum->dirty_off = 0;
+                accum->dirty_len = size;
+                accum->dirty = TRUE;
+            } /* end else */
+        } /* end if */
+        else {
+            /* Write the data */
+            if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+                HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+
+            /* Check for overlap w/accumulator */
+            /* (Note that this could be improved by updating the accumulator
+             *  with [some of] the information just read in. -QAK)
+             */
+            if(H5F_addr_overlap(addr, size, accum->loc, accum->size)) {
+                /* Check for write starting before beginning of accumulator */
+                if(H5F_addr_le(addr, accum->loc)) {
+                    /* Check for write ending within accumulator */
+                    if(H5F_addr_le(addr + size, accum->loc + accum->size)) {
+                        size_t overlap_size;    /* Size of overlapping region */
+
+                        /* Compute overlap size */
+                        overlap_size = (size_t)((addr + size) - accum->loc);
+
+                        /* Check for dirty region */
+                        if(accum->dirty) {
+                            haddr_t dirty_start = accum->loc + accum->dirty_off;    /* File address of start of dirty region */
+                            haddr_t dirty_end = dirty_start + accum->dirty_len;               /* File address of end of dirty region */
+
+                            /* Check if entire dirty region is overwritten */
+                            if(H5F_addr_le(dirty_end, addr + size)) {
+                                accum->dirty = FALSE;
+                                accum->dirty_len = 0;
+                            } /* end if */
+                            else {
+                                /* Check for dirty region falling after write */
+                                if(H5F_addr_le(addr + size, dirty_start))
+                                    accum->dirty_off = overlap_size;
+                                else {    /* Dirty region overlaps w/written region */
+                                    accum->dirty_off = 0;
+                                    accum->dirty_len -= (size_t)((addr + size) - dirty_start);
+                                } /* end else */
+                            } /* end if */
+                        } /* end if */
+
+                        /* Trim bottom of accumulator off */
+                        accum->loc += overlap_size;
+                        accum->size -= overlap_size;
+                        HDmemmove(accum->buf, accum->buf + overlap_size, accum->size);
+                    } /* end if */
+                    else {        /* Access covers whole accumulator */
+                        /* Reset accumulator, but don't flush */
+                        if(H5F__accum_reset(fio_info, FALSE) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_CANTRESET, FAIL, "can't reset accumulator")
+                    } /* end else */
+                } /* end if */
+                else {  /* Write starts after beginning of accumulator */
+                    size_t overlap_size;    /* Size of overlapping region */
+
+                    /* Sanity check */
+                    HDassert(H5F_addr_gt(addr + size, accum->loc + accum->size));
+
+                    /* Compute overlap size */
+                    overlap_size = (size_t)((accum->loc + accum->size) - addr);
+
+                    /* Check for dirty region */
+                    if(accum->dirty) {
+                        haddr_t dirty_start = accum->loc + accum->dirty_off;    /* File address of start of dirty region */
+                        haddr_t dirty_end = dirty_start + accum->dirty_len;               /* File address of end of dirty region */
+
+                        /* Check if entire dirty region is overwritten */
+                        if(H5F_addr_ge(dirty_start, addr)) {
+                            accum->dirty = FALSE;
+                            accum->dirty_len = 0;
+                        } /* end if */
+                        else {
+                            /* Check for dirty region falling before write */
+                            if(H5F_addr_le(dirty_end, addr))
+                                ; /* noop */
+                            else    /* Dirty region overlaps w/written region */
+                                accum->dirty_len = (size_t)(addr - dirty_start);
+                        } /* end if */
+                    } /* end if */
+
+                    /* Trim top of accumulator off */
+                    accum->size -= overlap_size;
+                } /* end else */
+            } /* end if */
+        } /* end else */
+    } /* end if */
+    else {
+        /* Write the data */
+        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__accum_free
+ *
+ * Purpose:     Check for free space invalidating [part of] a metadata
+ *              accumulator.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Jan 10 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr,
+    hsize_t size)
+{
+    H5F_meta_accum_t *accum;            /* Alias for file's metadata accumulator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(fio_info->dxpl);
+
+    /* Set up alias for file's metadata accumulator info */
+    accum = &fio_info->f->shared->accum;
+
+    /* Adjust the metadata accumulator to remove the freed block, if it overlaps */
+    if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA)
+            && H5F_addr_overlap(addr, size, accum->loc, accum->size)) {
+        size_t overlap_size;        /* Size of overlap with accumulator */
+
+        /* Sanity check */
+        /* (The metadata accumulator should not intersect w/raw data */
+        HDassert(H5FD_MEM_DRAW != type);
+        HDassert(H5FD_MEM_GHEAP != type); /* (global heap data is being treated as raw data currently) */
+
+        /* Check for overlapping the beginning of the accumulator */
+        if(H5F_addr_le(addr, accum->loc)) {
+            /* Check for completely overlapping the accumulator */
+            if(H5F_addr_ge(addr + size, accum->loc + accum->size)) {
+                /* Reset the accumulator, but don't free buffer */
+                accum->loc = HADDR_UNDEF;
+                accum->size = 0;
+                accum->dirty = FALSE;
+            } /* end if */
+            /* Block to free must end within the accumulator */
+            else {
+                size_t new_accum_size;      /* Size of new accumulator buffer */
+
+                /* Calculate the size of the overlap with the accumulator, etc. */
+                H5_CHECKED_ASSIGN(overlap_size, size_t, (addr + size) - accum->loc, haddr_t);
+                new_accum_size = accum->size - overlap_size;
+
+                /* Move the accumulator buffer information to eliminate the freed block */
+                HDmemmove(accum->buf, accum->buf + overlap_size, new_accum_size);
+
+                /* Adjust the accumulator information */
+                accum->loc += overlap_size;
+                accum->size = new_accum_size;
+
+                /* Adjust the dirty region and possibly mark accumulator clean */
+                if(accum->dirty) {
+                    /* Check if block freed is entirely before dirty region */
+                    if(overlap_size < accum->dirty_off)
+                        accum->dirty_off -= overlap_size;
+                    else {
+                        /* Check if block freed ends within dirty region */
+                        if(overlap_size < (accum->dirty_off + accum->dirty_len)) {
+                            accum->dirty_len = (accum->dirty_off + accum->dirty_len) - overlap_size;
+                            accum->dirty_off = 0;
+                        } /* end if */
+                        /* Block freed encompasses dirty region */
+                        else
+                            accum->dirty = FALSE;
+                    } /* end else */
+                } /* end if */
+            } /* end else */
+        } /* end if */
+        /* Block to free must start within the accumulator */
+        else {
+            haddr_t dirty_end = accum->loc + accum->dirty_off + accum->dirty_len;
+            haddr_t dirty_start = accum->loc + accum->dirty_off;
+
+            /* Calculate the size of the overlap with the accumulator */
+            H5_CHECKED_ASSIGN(overlap_size, size_t, (accum->loc + accum->size) - addr, haddr_t);
+
+            /* Check if block to free begins before end of dirty region */
+            if(accum->dirty && H5F_addr_lt(addr, dirty_end)) {
+                haddr_t tail_addr;
+
+                /* Calculate the address of the tail to write */
+                tail_addr = addr + size;
+
+                /* Check if the block to free begins before dirty region */
+                if(H5F_addr_lt(addr, dirty_start)) {
+                    /* Check if block to free is entirely before dirty region */
+                    if(H5F_addr_le(tail_addr, dirty_start)) {
+                        /* Write out the entire dirty region of the accumulator */
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+                    } /* end if */
+                    /* Block to free overlaps with some/all of dirty region */
+                    /* Check for unfreed dirty region to write */
+                    else if(H5F_addr_lt(tail_addr, dirty_end)) {
+                        size_t write_size;
+                        size_t dirty_delta;
+
+                        write_size = (size_t)(dirty_end - tail_addr);
+                        dirty_delta = accum->dirty_len - write_size;
+
+                        HDassert(write_size > 0);
+
+                        /* Write out the unfreed dirty region of the accumulator */
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+                    } /* end if */
+
+                    /* Reset dirty flag */
+                    accum->dirty = FALSE;
+                } /* end if */
+                /* Block to free begins at beginning of or in middle of dirty region */
+                else {
+                    /* Check if block to free ends before end of dirty region */
+                    if(H5F_addr_lt(tail_addr, dirty_end)) {
+                        size_t write_size;
+                        size_t dirty_delta;
+
+                        write_size = (size_t)(dirty_end - tail_addr);
+                        dirty_delta = accum->dirty_len - write_size;
+
+                        HDassert(write_size > 0);
+
+                        /* Write out the unfreed end of the dirty region of the accumulator */
+                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
+                            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+                    } /* end if */
+
+                    /* Check for block to free beginning at same location as dirty region */
+                    if(H5F_addr_eq(addr, dirty_start)) {
+                        /* Reset dirty flag */
+                        accum->dirty = FALSE;
+                    } /* end if */
+                    /* Block to free eliminates end of dirty region */
+                    else {
+                        accum->dirty_len = (size_t)(addr - dirty_start);
+                    } /* end else */
+                } /* end else */
+
+            } /* end if */
+
+            /* Adjust the accumulator information */
+            accum->size = accum->size - overlap_size;
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__accum_flush
+ *
+ * Purpose:	Flush the metadata accumulator to the file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan 10 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__accum_flush(const H5F_io_info_t *fio_info)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(fio_info->dxpl);
+
+    /* Check if we need to flush out the metadata accumulator */
+    if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && fio_info->f->shared->accum.dirty) {
+        /* Flush the metadata contents */
+        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, fio_info->f->shared->accum.loc + fio_info->f->shared->accum.dirty_off, fio_info->f->shared->accum.dirty_len, fio_info->f->shared->accum.buf + fio_info->f->shared->accum.dirty_off) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
+
+        /* Reset the dirty flag */
+        fio_info->f->shared->accum.dirty = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__accum_reset
+ *
+ * Purpose:	Reset the metadata accumulator for the file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan 10 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(fio_info->dxpl);
+
+    /* Flush any dirty data in accumulator, if requested */
+    if(flush)
+        if(H5F__accum_flush(fio_info) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "can't flush metadata accumulator")
+
+    /* Check if we need to reset the metadata accumulator information */
+    if(fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) {
+        /* Sanity check */
+        HDassert(!fio_info->f->closing || FALSE == fio_info->f->shared->accum.dirty);
+
+        /* Free the buffer */
+        if(fio_info->f->shared->accum.buf)
+            fio_info->f->shared->accum.buf = H5FL_BLK_FREE(meta_accum, fio_info->f->shared->accum.buf);
+
+        /* Reset the buffer sizes & location */
+        fio_info->f->shared->accum.alloc_size = fio_info->f->shared->accum.size = 0;
+        fio_info->f->shared->accum.loc = HADDR_UNDEF;
+        fio_info->f->shared->accum.dirty = FALSE;
+        fio_info->f->shared->accum.dirty_len = 0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__accum_reset() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fcwfs.c b/gatb-core/thirdparty/hdf5/src/H5Fcwfs.c
new file mode 100644
index 0000000..36f0a93
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fcwfs.c
@@ -0,0 +1,323 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Tuesday, July 19, 2011
+ *
+ * Purpose:	Each file has a small cache of global heap collections called
+ *		the CWFS list and recently accessed collections with free
+ *		space appear on this list.  As collections are accessed the
+ *		collection is moved toward the front of the list.  New
+ *		collections are added to the front of the list while old
+ *		collections are added to the end of the list.
+ *
+ *		The collection model reduces the overhead which would be
+ *		incurred if the global heap were a single object, and the
+ *		CWFS list allows the library to cheaply choose a collection
+ *		for a new object based on object size, amount of free space
+ *		in the collection, and temporal locality.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* File access				*/
+#include "H5HGprivate.h"	/* Global heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/*
+ * Maximum length of the CWFS list, the list of remembered collections that
+ * have free space.
+ */
+#define H5F_NCWFS	16
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_cwfs_add
+ *
+ * Purpose:	Add a global heap collection to the CWFS for a file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 19, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_cwfs_add(H5F_t *f, H5HG_heap_t *heap)
+{
+    herr_t	ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(heap);
+
+    /*
+     * Add the new heap to the CWFS list, removing some other entry if
+     * necessary to make room. We remove the right-most entry that has less
+     * free space than this heap.
+     */
+    if(NULL == f->shared->cwfs) {
+	if(NULL == (f->shared->cwfs = (H5HG_heap_t **)H5MM_malloc(H5F_NCWFS * sizeof(H5HG_heap_t *))))
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't allocate CWFS for file")
+	f->shared->cwfs[0] = heap;
+	f->shared->ncwfs = 1;
+    } else if(H5F_NCWFS == f->shared->ncwfs) {
+        int i;          /* Local index variable */
+
+        for(i = H5F_NCWFS - 1; i >= 0; --i)
+            if(H5HG_FREE_SIZE(f->shared->cwfs[i]) < H5HG_FREE_SIZE(heap)) {
+                HDmemmove(f->shared->cwfs + 1, f->shared->cwfs, (size_t)i * sizeof(H5HG_heap_t *));
+                f->shared->cwfs[0] = heap;
+                break;
+            } /* end if */
+    } else {
+        HDmemmove(f->shared->cwfs + 1, f->shared->cwfs, f->shared->ncwfs * sizeof(H5HG_heap_t *));
+	f->shared->cwfs[0] = heap;
+        f->shared->ncwfs += 1;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_cwfs_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_cwfs_find_free_heap
+ *
+ * Purpose:	Find a global heap collection with free space for storing
+ *		a new object.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_cwfs_find_free_heap(H5F_t *f, hid_t dxpl_id, size_t need, haddr_t *addr)
+{
+    unsigned    cwfsno;                 /* Local index for iterating over collections */
+    hbool_t     found = FALSE;          /* Flag to indicate a heap with enough space was found */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(addr);
+
+    /* Note that we don't have metadata cache locks on the entries in
+     * f->shared->cwfs.
+     *
+     * In the current situation, this doesn't matter, as we are single
+     * threaded, and as best I can tell, entries are added to and deleted
+     * from f->shared->cwfs as they are added to and deleted from the
+     * metadata cache.
+     *
+     * To be proper, we should either lock each entry in f->shared->cwfs
+     * as we examine it, or lock the whole array.  However, at present
+     * I don't see the point as there will be significant overhead,
+     * and protecting and unprotecting all the collections in the global
+     * heap on a regular basis will skew the replacement policy.
+     *
+     *                                        JRM - 5/24/04
+     */
+    for(cwfsno = 0; cwfsno < f->shared->ncwfs; cwfsno++)
+	if(H5HG_FREE_SIZE(f->shared->cwfs[cwfsno]) >= need) {
+	    *addr = H5HG_ADDR(f->shared->cwfs[cwfsno]);
+            found = TRUE;
+	    break;
+	} /* end if */
+
+    /*
+     * If we didn't find any collection with enough free space the check if
+     * we can extend any of the collections to make enough room.
+     */
+    if(!found) {
+        size_t new_need;
+
+        for(cwfsno = 0; cwfsno < f->shared->ncwfs; cwfsno++) {
+            new_need = need;
+            new_need -= H5HG_FREE_SIZE(f->shared->cwfs[cwfsno]);
+            new_need = MAX(H5HG_SIZE(f->shared->cwfs[cwfsno]), new_need);
+
+            if((H5HG_SIZE(f->shared->cwfs[cwfsno]) + new_need) <= H5HG_MAXSIZE) {
+                htri_t was_extended;        /* Whether the heap was extended */
+
+                was_extended = H5MF_try_extend(f, dxpl_id, H5FD_MEM_GHEAP, H5HG_ADDR(f->shared->cwfs[cwfsno]), (hsize_t)H5HG_SIZE(f->shared->cwfs[cwfsno]), (hsize_t)new_need);
+                if(was_extended < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "error trying to extend heap")
+                else if(was_extended == TRUE) {
+                    if(H5HG_extend(f, dxpl_id, H5HG_ADDR(f->shared->cwfs[cwfsno]), new_need) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to extend global heap collection")
+                    *addr = H5HG_ADDR(f->shared->cwfs[cwfsno]);
+                    found = TRUE;
+                    break;
+                } /* end if */
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+    if(found) {
+        /* Move the collection forward in the CWFS list, if it's not
+         * already at the front
+         */
+        if(cwfsno > 0) {
+            H5HG_heap_t *tmp = f->shared->cwfs[cwfsno];
+
+            f->shared->cwfs[cwfsno] = f->shared->cwfs[cwfsno - 1];
+            f->shared->cwfs[cwfsno - 1] = tmp;
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_cwfs_find_free_heap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_cwfs_advance_heap
+ *
+ * Purpose:	Advance a heap in the CWFS
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_cwfs_advance_heap(H5F_t *f, H5HG_heap_t *heap, hbool_t add_heap)
+{
+    unsigned u;                         /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(heap);
+
+    for(u = 0; u < f->shared->ncwfs; u++)
+        if(f->shared->cwfs[u] == heap) {
+            if(u) {
+                f->shared->cwfs[u] = f->shared->cwfs[u - 1];
+                f->shared->cwfs[u - 1] = heap;
+            } /* end if */
+            break;
+        } /* end if */
+    if(add_heap && u >= f->shared->ncwfs) {
+        f->shared->ncwfs = MIN(f->shared->ncwfs + 1, H5F_NCWFS);
+        f->shared->cwfs[f->shared->ncwfs - 1] = heap;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_cwfs_advance_heap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_cwfs_remove_heap
+ *
+ * Purpose:	Remove a heap from the CWFS
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_cwfs_remove_heap(H5F_file_t *shared, H5HG_heap_t *heap)
+{
+    unsigned u;                         /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Check args */
+    HDassert(shared);
+    HDassert(heap);
+
+    /* Remove the heap from the CWFS list */
+    for(u = 0; u < shared->ncwfs; u++) {
+        if(shared->cwfs[u] == heap) {
+            shared->ncwfs -= 1;
+            HDmemmove(shared->cwfs + u, shared->cwfs + u + 1, (shared->ncwfs - u) * sizeof(H5HG_heap_t *));
+            break;
+        } /* end if */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_cwfs_remove_heap() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fdbg.c b/gatb-core/thirdparty/hdf5/src/H5Fdbg.c
new file mode 100644
index 0000000..40d24e5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fdbg.c
@@ -0,0 +1,148 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Wednesday, July 9, 2003
+ *
+ * Purpose:	File object debugging functions.
+ */
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		        */
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* ID Functions		                */
+#include "H5Pprivate.h"		/* Property lists			*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_debug
+ *
+ * Purpose:	Prints a file header to the specified stream.  Each line
+ *		is indented and the field name occupies the specified width
+ *		number of characters.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  1 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_debug(H5F_t *f, FILE *stream, int indent, int fwidth)
+{
+    H5P_genplist_t *plist;              /* File creation property list */
+    hsize_t userblock_size;             /* Userblock size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Get property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(f->shared->fcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Retrieve file creation properties */
+    if(H5P_get(plist, H5F_CRT_USER_BLOCK_NAME, &userblock_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get userblock size")
+
+    /* debug */
+    HDfprintf(stream, "%*sFile Super Block...\n", indent, "");
+
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "File name (as opened):", H5F_OPEN_NAME(f));
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "File name (after resolving symlinks):", H5F_ACTUAL_NAME(f));
+    HDfprintf(stream, "%*s%-*s 0x%08x\n", indent, "", fwidth,
+	      "File access flags", f->shared->flags);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "File open reference count:", f->shared->nrefs);
+    HDfprintf(stream, "%*s%-*s %a (abs)\n", indent, "", fwidth,
+	      "Address of super block:", f->shared->sblock->base_addr);
+    HDfprintf(stream, "%*s%-*s %Hu bytes\n", indent, "", fwidth,
+	      "Size of userblock:", userblock_size);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Superblock version number:", f->shared->sblock->super_vers);
+
+    /* Hard-wired versions */
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Free list version number:", (unsigned)HDF5_FREESPACE_VERSION);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Root group symbol table entry version number:", (unsigned)HDF5_OBJECTDIR_VERSION);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Shared header version number:", (unsigned)HDF5_SHAREDHEADER_VERSION);
+
+    HDfprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
+	      "Size of file offsets (haddr_t type):", (unsigned) f->shared->sizeof_addr);
+    HDfprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
+	      "Size of file lengths (hsize_t type):", (unsigned) f->shared->sizeof_size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Symbol table leaf node 1/2 rank:", f->shared->sblock->sym_leaf_k);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Symbol table internal node 1/2 rank:", f->shared->sblock->btree_k[H5B_SNODE_ID]);
+    HDfprintf(stream, "%*s%-*s 0x%02x\n", indent, "", fwidth,
+	      "File status flags:", (unsigned)(f->shared->sblock->status_flags));
+    HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth,
+	      "Superblock extension address:", f->shared->sblock->ext_addr);
+    HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth,
+	      "Shared object header message table address:", f->shared->sohm_addr);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Shared object header message version number:", (unsigned) f->shared->sohm_vers);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of shared object header message indexes:", (unsigned) f->shared->sohm_nindexes);
+
+    HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth,
+	      "Address of driver information block:", f->shared->sblock->driver_addr);
+
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Root group symbol table entry:",
+	      f->shared->root_grp ? "" : "(none)");
+    if(f->shared->root_grp) {
+        if(f->shared->sblock->root_ent) /* Use real root group symbol table entry */
+            H5G__ent_debug(f->shared->sblock->root_ent, stream, indent + 3, MAX(0, fwidth - 3), NULL);
+        else {
+            H5O_loc_t *root_oloc;   /* Root object location */
+            H5G_entry_t root_ent;   /* Constructed root symbol table entry */
+
+            /* Reset the root group entry */
+            H5G__ent_reset(&root_ent);
+
+            /* Build up a simulated root group symbol table entry */
+            root_oloc = H5G_oloc(f->shared->root_grp);
+            HDassert(root_oloc);
+            root_ent.type = H5G_NOTHING_CACHED;
+            root_ent.header = root_oloc->addr;
+
+            /* Display root group symbol table entry info */
+            H5G__ent_debug(&root_ent, stream, indent + 3, MAX(0, fwidth - 3), NULL);
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fefc.c b/gatb-core/thirdparty/hdf5/src/H5Fefc.c
new file mode 100644
index 0000000..9916002
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fefc.c
@@ -0,0 +1,950 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Defc.c
+ *                      December 13, 2010
+ *                      Neil Fortner <nfortne2 at hdfgroup.org>
+ *
+ * Purpose:             External file caching routines - implements a
+ *                      cache of external files to minimize the number of
+ *                      file opens and closes.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5F_PACKAGE             /*suppress error about including H5Fpkg   */
+
+
+/* Packages needed by this file... */
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5Fpkg.h"             /* File access                          */
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+/* Special values for the "tag" field below */
+#define H5F_EFC_TAG_DEFAULT     -1
+#define H5F_EFC_TAG_LOCK        -2
+#define H5F_EFC_TAG_CLOSE       -3
+#define H5F_EFC_TAG_DONTCLOSE   -4
+
+/* Structure for each entry in a file's external file cache */
+typedef struct H5F_efc_ent_t {
+    char                *name;          /* Name of the file */
+    H5F_t               *file;          /* File object */
+    struct H5F_efc_ent_t *LRU_next;     /* Next item in LRU list */
+    struct H5F_efc_ent_t *LRU_prev;     /* Previous item in LRU list */
+    unsigned            nopen;          /* Number of times this file is currently opened by an EFC client */
+} H5F_efc_ent_t;
+
+/* Structure for a shared file struct's external file cache */
+struct H5F_efc_t {
+    H5SL_t              *slist;         /* Skip list of cached external files */
+    H5F_efc_ent_t       *LRU_head;      /* Head of LRU list.  This is the least recently used file */
+    H5F_efc_ent_t       *LRU_tail;      /* Tail of LRU list.  This is the most recently used file */
+    unsigned            nfiles;         /* Size of the external file cache */
+    unsigned            max_nfiles;     /* Maximum size of the external file cache */
+    unsigned            nrefs;          /* Number of times this file appears in another file's EFC */
+    int                 tag;            /* Temporary variable used by H5F_efc_try_close() */
+    H5F_file_t          *tmp_next;      /* Next file in temporary list used by H5F_efc_try_close() */
+};
+
+/* Private prototypes */
+static herr_t H5F_efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent);
+static void H5F_efc_try_close_tag1(H5F_file_t *sf, H5F_file_t **tail);
+static void H5F_efc_try_close_tag2(H5F_file_t *sf, H5F_file_t **tail);
+
+/* Free lists */
+H5FL_DEFINE_STATIC(H5F_efc_ent_t);
+H5FL_DEFINE_STATIC(H5F_efc_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_create
+ *
+ * Purpose:     Allocate and initialize a new external file cache object,
+ *              which can the be used to cache open external files.
+ *              the object must be freed with H5F_efc_destroy.
+ *
+ * Return:      Pointer to new external file cache object on success
+ *              NULL on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 14, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_efc_t *
+H5F_efc_create(unsigned max_nfiles)
+{
+    H5F_efc_t   *efc = NULL;            /* EFC object */
+    H5F_efc_t   *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity checks */
+    HDassert(max_nfiles > 0);
+
+    /* Allocate EFC struct */
+    if(NULL == (efc = H5FL_CALLOC(H5F_efc_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Initialize maximum number of files */
+    efc->max_nfiles = max_nfiles;
+
+    /* Initialize temporary ref count */
+    efc->tag = H5F_EFC_TAG_DEFAULT;
+
+    /* Set the return value */
+    ret_value = efc;
+
+done:
+    if(ret_value == NULL && efc)
+        efc = H5FL_FREE(H5F_efc_t, efc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_efc_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_open
+ *
+ * Purpose:     Opens a file using the external file cache.  The target
+ *              file is added to the external file cache of the parent
+ *              if it is not already present.  If the target file is in
+ *              the parent's EFC, simply returns the target file.  When
+ *              the file object is no longer in use, it should be closed
+ *              with H5F_efc_close (will not actually close the file
+ *              until it is evicted from the EFC).
+ *
+ * Return:      Pointer to open file on success
+ *              NULL on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 14, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
+    hid_t fapl_id, hid_t dxpl_id)
+{
+    H5F_efc_t   *efc = NULL;    /* External file cache for parent file */
+    H5F_efc_ent_t *ent = NULL;  /* Entry for target file in efc */
+    hbool_t     open_file = FALSE; /* Whether ent->file needs to be closed in case of error */
+    H5F_t       *ret_value = NULL; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(parent);
+    HDassert(parent->shared);
+    HDassert(name);
+
+    /* Get external file cache */
+    efc = parent->shared->efc;
+
+    /* Check if the EFC exists.  If it does not, just call H5F_open().  We
+     * support this so clients do not have to make 2 different calls depending
+     * on the state of the efc. */
+    if(!efc) {
+        if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
+                                         dxpl_id)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
+
+        /* Increment the number of open objects to prevent the file from being
+         * closed out from under us - "simulate" having an open file id.  Note
+         * that this behaviour replaces the calls to H5F_incr_nopen_objs() and
+         * H5F_decr_nopen_objs() in H5L_extern_traverse(). */
+        ret_value->nopen_objs++;
+
+        HGOTO_DONE(ret_value)
+    } /* end if */
+
+    /* Search the skip list for name if the skip list exists, create the skip
+     * list otherwise */
+    if(efc->slist) {
+        if(efc->nfiles > 0)
+            ent = (H5F_efc_ent_t *)H5SL_search(efc->slist, name);
+    } /* end if */
+    else {
+        HDassert(efc->nfiles == 0);
+        if(NULL == (efc->slist = H5SL_create(H5SL_TYPE_STR, NULL)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, NULL, "can't create skip list")
+    } /* end else */
+
+    /* If we found the file update the LRU list and return the cached file,
+     * otherwise open the file and cache it */
+    if(ent) {
+        HDassert(efc->LRU_head);
+        HDassert(efc->LRU_tail);
+
+        /* Move ent to the head of the LRU list, if it is not already there */
+        if(ent->LRU_prev) {
+            HDassert(efc->LRU_head != ent);
+
+            /* Remove from current position.  Note that once we touch the LRU
+             * list we cannot revert to the previous state.  Make sure there can
+             * be no errors between when we first touch the LRU list and when
+             * the cache is in a consistent state! */
+            if(ent->LRU_next)
+                ent->LRU_next->LRU_prev = ent->LRU_prev;
+            else {
+                HDassert(efc->LRU_tail == ent);
+                efc->LRU_tail = ent->LRU_prev;
+            } /* end else */
+            ent->LRU_prev->LRU_next = ent->LRU_next;
+
+            /* Add to head of LRU list */
+            ent->LRU_next = efc->LRU_head;
+            ent->LRU_next->LRU_prev = ent;
+            ent->LRU_prev = NULL;
+            efc->LRU_head = ent;
+        } /* end if */
+
+        /* Mark the file as open */
+        ent->nopen++;
+    } /* end if */
+    else {
+        /* Check if we need to evict something */
+        if(efc->nfiles == efc->max_nfiles) {
+            /* Search for an unopened file from the tail */
+            for(ent = efc->LRU_tail; ent && ent->nopen; ent = ent->LRU_prev);
+
+            /* Evict the file if found, otherwise just open the target file and
+             * do not add it to cache */
+            if(ent) {
+                if(H5F_efc_remove_ent(efc, ent) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTREMOVE, NULL, "can't remove entry from external file cache")
+
+                /* Do not free ent, we will recycle it below */
+            } /* end if */
+            else {
+                /* Cannot cache file, just open file and return */
+                if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
+                                                 dxpl_id)))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
+
+                /* Increment the number of open objects to prevent the file from
+                 * being closed out from under us - "simulate" having an open
+                 * file id */
+                ret_value->nopen_objs++;
+
+                HGOTO_DONE(ret_value)
+            } /* end else */
+        } /* end if */
+        else
+            /* Allocate new entry */
+            if(NULL == (ent = H5FL_MALLOC(H5F_efc_ent_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Build new entry */
+        if(NULL == (ent->name = H5MM_strdup(name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Open the file */
+        if(NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id,
+                                         dxpl_id)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
+        open_file = TRUE;
+
+        /* Increment the number of open objects to prevent the file from being
+         * closed out from under us - "simulate" having an open file id */
+        ent->file->nopen_objs++;
+
+        /* Add the file to the cache */
+        /* Skip list */
+        if(H5SL_insert(efc->slist, ent, ent->name) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINSERT, NULL, "can't insert entry into skip list")
+
+        /* Add to head of LRU list and update tail if necessary */
+        ent->LRU_next = efc->LRU_head;
+        if(ent->LRU_next)
+            ent->LRU_next->LRU_prev = ent;
+        ent->LRU_prev = NULL;
+        efc->LRU_head = ent;
+        if(!efc->LRU_tail) {
+            HDassert(!ent->LRU_next);
+            efc->LRU_tail = ent;
+        } /* end if */
+
+        /* Mark the file as open */
+        ent->nopen = 1;
+
+        /* Update nfiles and nrefs */
+        efc->nfiles++;
+        if(ent->file->shared->efc)
+            ent->file->shared->efc->nrefs++;
+    } /* end else */
+
+    HDassert(ent);
+    HDassert(ent->file);
+    HDassert(ent->name);
+    HDassert(ent->nopen);
+
+    /* Set the return value */
+    ret_value = ent->file;
+
+done:
+    if(!ret_value)
+        if(ent) {
+            if(open_file) {
+                ent->file->nopen_objs--;
+                if(H5F_try_close(ent->file) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "can't close external file")
+            } /* end if */
+            ent->name = (char *)H5MM_xfree(ent->name);
+            ent = H5FL_FREE(H5F_efc_ent_t, ent);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_efc_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_close
+ *
+ * Purpose:     Closes (unlocks) a file opened using the external file
+ *              cache.  The target file is not immediately closed unless
+ *              there is no external file cache for the parent file.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, December 15, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_efc_close(H5F_t *parent, H5F_t *file)
+{
+    H5F_efc_t   *efc = NULL;    /* External file cache for parent file */
+    H5F_efc_ent_t *ent = NULL;  /* Entry for target file in efc */
+    herr_t      ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(parent);
+    HDassert(parent->shared);
+    HDassert(file);
+    HDassert(file->shared);
+
+    /* Get external file cache */
+    efc = parent->shared->efc;
+
+    /* Check if the EFC exists.  If it does not, just call H5F_try_close().  We
+     * support this so clients do not have to make 2 different calls depending
+     * on the state of the efc. */
+    if(!efc) {
+        file->nopen_objs--;
+        if(H5F_try_close(file) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
+
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
+
+    /* Scan the parent's LRU list from the head to file file.  We do this
+     * instead of a skip list lookup because the file will almost always be at
+     * the head.  In the unlikely case that the file is not found, just call
+     * H5F_try_close().  This could happen if the EFC was full of open files
+     * when the file was opened. */
+    for(ent = efc->LRU_head; ent && ent->file != file; ent = ent->LRU_next);
+    if(!ent) {
+        file->nopen_objs--;
+        if(H5F_try_close(file) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
+    } /* end if */
+    else
+        /* Reduce the open count on this entry */
+        ent->nopen--;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_efc_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_max_nfiles
+ *
+ * Purpose:     Returns the maximum number of files in the provided
+ *              external file cache.
+ *
+ * Return:      Maximum number of files (never fails)
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, December 15, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_efc_max_nfiles(H5F_efc_t *efc)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(efc);
+    HDassert(efc->max_nfiles > 0);
+
+    FUNC_LEAVE_NOAPI(efc->max_nfiles)
+} /* end H5F_efc_max_nfiles */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_release
+ *
+ * Purpose:     Releases the external file cache, potentially closing any
+ *              cached files unless they are held open from somewhere
+ *              else (or are currently opened by a client).
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, December 15, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_efc_release(H5F_efc_t *efc)
+{
+    H5F_efc_ent_t *ent = NULL;          /* EFC entry */
+    H5F_efc_ent_t *prev_ent = NULL;     /* Previous EFC entry */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(efc);
+
+    /* Lock the EFC to prevent manipulation of the EFC wile we are releasing it.
+     * The EFC should never be locked when we enter this function because that
+     * would require a cycle, a cycle would necessarily invoke
+     * H5F_efc_try_close(), and that function checks the status of the lock
+     * before calling this one. */
+    HDassert((efc->tag == H5F_EFC_TAG_DEFAULT)
+            || (efc->tag == H5F_EFC_TAG_CLOSE));
+    efc->tag = H5F_EFC_TAG_LOCK;
+
+    /* Walk down the LRU list, releasing any files that are not opened by an EFC
+     * client */
+    ent = efc->LRU_head;
+    while(ent)
+        if(!ent->nopen) {
+            if(H5F_efc_remove_ent(efc, ent) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTREMOVE, FAIL, "can't remove entry from external file cache")
+
+            /* Free the entry and move to next entry in LRU list */
+            prev_ent = ent;
+            ent = ent->LRU_next;
+            prev_ent = H5FL_FREE(H5F_efc_ent_t, prev_ent);
+        } /* end if */
+        else
+            /* Can't release file because it's open; just advance the pointer */
+            ent = ent->LRU_next;
+
+    /* Reset tag.  No need to reset to CLOSE if that was the original tag, as in
+     * that case the file must be getting closed anyways. */
+    efc->tag = H5F_EFC_TAG_DEFAULT;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_efc_release() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_destroy
+ *
+ * Purpose:     Frees an external file cache object, releasing it first
+ *              if necessary.  If it cannot be fully released, for example
+ *              if there are open files, returns an error.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, December 15, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_efc_destroy(H5F_efc_t *efc)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(efc);
+
+    if(efc->nfiles > 0) {
+        /* Release (clear) the efc */
+        if(H5F_efc_release(efc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
+
+        /* If there are still cached files, return an error */
+        if(efc->nfiles > 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't destroy EFC after incomplete release")
+    } /* end if */
+
+    HDassert(efc->nfiles == 0);
+    HDassert(efc->LRU_head == NULL);
+    HDassert(efc->LRU_tail == NULL);
+
+    /* Close skip list */
+    if(efc->slist)
+        if(H5SL_close(efc->slist) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't close skip list")
+
+    /* Free EFC object */
+    (void)H5FL_FREE(H5F_efc_t, efc);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_efc_destroy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_remove_ent
+ *
+ * Purpose:     Removes the specified entry from the specified EFC,
+ *              closing the file if requested.  Does not free the entry.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, December 15, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(efc);
+    HDassert(efc->slist);
+    HDassert(ent);
+
+    /* Remove from skip list */
+    if(ent != H5SL_remove(efc->slist, ent->name))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTDELETE, FAIL, "can't delete entry from skip list")
+
+    /* Remove from LRU list */
+    if(ent->LRU_next)
+        ent->LRU_next->LRU_prev = ent->LRU_prev;
+    else {
+        HDassert(efc->LRU_tail == ent);
+        efc->LRU_tail = ent->LRU_prev;
+    } /* end else */
+    if(ent->LRU_prev)
+        ent->LRU_prev->LRU_next = ent->LRU_next;
+    else {
+        HDassert(efc->LRU_head == ent);
+        efc->LRU_head = ent->LRU_next;
+    } /* end else */
+
+    /* Update nfiles and nrefs */
+    efc->nfiles--;
+    if(ent->file->shared->efc)
+        ent->file->shared->efc->nrefs--;
+
+    /* Free the name */
+    ent->name = (char *)H5MM_xfree(ent->name);
+
+    /* Close the file.  Note that since H5F_t structs returned from H5F_open()
+     * are *always* unique, there is no need to reference count this struct.
+     * However we must still manipulate the nopen_objs field to prevent the file
+     * from being closed out from under us. */
+    ent->file->nopen_objs--;
+    if(H5F_try_close(ent->file) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
+    ent->file = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_efc_remove_ent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_try_close_tag1
+ *
+ * Purpose:     Recursively traverse the EFC tree, keeping a temporary
+ *              reference count on each file that assumes all reachable
+ *              files will eventually be closed.
+ *
+ * Return:      void (never fails)
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, January 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5F_efc_try_close_tag1(H5F_file_t *sf, H5F_file_t **tail)
+{
+    H5F_efc_ent_t       *ent = NULL;    /* EFC entry */
+    H5F_file_t          *esf;           /* Convenience pointer to ent->file->shared */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(sf);
+    HDassert(sf->efc);
+    HDassert((sf->efc->tag > 0) || (sf->nrefs == sf->efc->nrefs));
+    HDassert(sf->efc->tag != H5F_EFC_TAG_LOCK);
+    HDassert(tail);
+    HDassert(*tail);
+
+    /* Recurse into this file's cached files */
+    for(ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
+        esf = ent->file->shared;
+
+        if(esf->efc) {
+            /* If tag were 0, that would mean there are more actual references
+             * than are counted by nrefs */
+            HDassert(esf->efc->tag != 0);
+
+            /* If tag has been set, we have already visited this file so just
+             * decrement tag and continue */
+            if(esf->efc->tag > 0)
+                esf->efc->tag--;
+            /* If there are references that are not from an EFC, it will never
+             * be possible to close the file.  Just continue.  Also continue if
+             * the EFC is locked or the file is open (through the EFC).  Note
+             * that the reference counts will never match for the root file, but
+             * that's ok because the root file will always have a tag and enter
+             * the branch above. */
+            else if((esf->nrefs == esf->efc->nrefs)
+                    && (esf->efc->tag != H5F_EFC_TAG_LOCK) && !(ent->nopen)) {
+                /* If we get here, this file's "tmp_next" pointer must be NULL
+                 */
+                HDassert(esf->efc->tmp_next == NULL);
+
+                /* If nrefs > 1, Add this file to the list of files with nrefs >
+                 * 1 and initialize tag to the number of references (except this
+                 * one) */
+                if(esf->nrefs > 1) {
+                    (*tail)->efc->tmp_next = esf;
+                    *tail = esf;
+                    esf->efc->tag = (int)esf->nrefs - 1;
+                } /* end if */
+
+                /* Recurse into the entry */
+                H5F_efc_try_close_tag1(ent->file->shared, tail);
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_efc_try_close_tag1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_try_close_tag2
+ *
+ * Purpose:     Recuresively mark all files reachable through this one as
+ *              uncloseable, and add newly uncloseable files to the tail
+ *              of the provided linked list.
+ *
+ * Return:      void (never fails)
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, January 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5F_efc_try_close_tag2(H5F_file_t *sf, H5F_file_t **tail)
+{
+    H5F_efc_ent_t       *ent = NULL;    /* EFC entry */
+    H5F_file_t          *esf;           /* Convenience pointer to ent->file->shared */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(sf);
+    HDassert(sf->efc);
+
+    /* Recurse into this file's cached files */
+    for(ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
+        esf = ent->file->shared;
+
+        /* Only recurse if the file is tagged CLOSE or DEFAULT.  If it is tagged
+         * DONTCLOSE, we have already visited this file *or* it will be the
+         * start point of another iteration.  No files should be tagged with a
+         * nonegative value at this point.  If it is tagged as DEFAULT, we must
+         * apply the same conditions as in cb1 above for recursion in order to
+         * make sure  we do not go off into somewhere cb1 didn't touch.  The
+         * root file should never be tagged DEFAULT here, so the reference check
+         * is still appropriate. */
+        if((esf->efc) && ((esf->efc->tag == H5F_EFC_TAG_CLOSE)
+                || ((esf->efc->tag == H5F_EFC_TAG_DEFAULT)
+                && (esf->nrefs == esf->efc->nrefs) && !(ent->nopen)))) {
+            /* tag should always be CLOSE is nrefs > 1 or DEFAULT if nrefs == 1
+             * here */
+            HDassert(((esf->nrefs > 1)
+                    && ((esf->efc->tag == H5F_EFC_TAG_CLOSE)))
+                    || ((esf->nrefs == 1)
+                    && (esf->efc->tag == H5F_EFC_TAG_DEFAULT)));
+
+            /* If tag is set to DONTCLOSE, we have already visited this file
+             * *or* it will be the start point of another iteration so just
+             * continue */
+            if(esf->efc->tag != H5F_EFC_TAG_DONTCLOSE) {
+                /* If tag is CLOSE, set to DONTCLOSE and add to the list of
+                 * uncloseable files. */
+                if(esf->efc->tag == H5F_EFC_TAG_CLOSE) {
+                    esf->efc->tag = H5F_EFC_TAG_DONTCLOSE;
+                    esf->efc->tmp_next = NULL;
+                    (*tail)->efc->tmp_next = esf;
+                    *tail = esf;
+                } /* end if */
+
+                /* Recurse into the entry */
+                H5F_efc_try_close_tag2(esf, tail);
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_efc_try_close_tag2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_efc_try_close
+ *
+ * Purpose:     Attempts to close the provided (shared) file by checking
+ *              to see if the releasing the EFC would cause its reference
+ *              count to drop to 0.  Necessary to handle the case where
+ *              chained EFCs form a cycle.  Note that this function does
+ *              not actually close the file (though it closes all children
+ *              as appropriate), as that is left up to the calling
+ *              function H5F_try_close().
+ *
+ *              Because H5F_try_close() has no way of telling if it is
+ *              called recursively from within this function, this
+ *              function serves as both the root of iteration and the
+ *              "callback" for the final pass (the one where the files are
+ *              actually closed).  The code for the callback case is at
+ *              the top of this function; luckily it only consists of a
+ *              (possible) call to H5F_efc_release().
+ *
+ *              The algorithm basically consists of 3 passes over the EFC
+ *              tree.  The first pass assumes that every reachable file is
+ *              closed, and keeps track of what the final reference count
+ *              would be for every reachable file.  The files are then
+ *              tagged as either closeable or uncloseable based on whether
+ *              this reference count drops to 0.
+ *
+ *              The second pass initiates a traversal from each file
+ *              marked as uncloseable in the first pass, and marks every
+ *              file reachable from the initial uncloseable file as
+ *              uncloseable.  This eliminates files that were marked as
+ *              closeable only because the first pass assumed that an
+ *              uncloseable file would be closed.
+ *
+ *              The final pass exploits the H5F_efc_release()->
+ *              H5F_efc_remove_ent()->H5F_try_close()->H5F_efc_try_close()
+ *              calling chain to recursively close the tree, but only the
+ *              files that are still marked as closeable.  All files
+ *              marked as closeable have their EFCs released, and will
+ *              eventually be closed when their last parent EFC is
+ *              released (the last part is guaranteed to be true by the
+ *              first 2 passes).
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, January 6, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_efc_try_close(H5F_t *f)
+{
+    H5F_file_t  *tail;                  /* Tail of linked list of found files.  Head will be f->shared. */
+    H5F_file_t  *uncloseable_head = NULL; /* Head of linked list of files found to be uncloseable by the first pass */
+    H5F_file_t  *uncloseable_tail = NULL; /* Tail of linked list of files found to be uncloseable by the first pass */
+    H5F_file_t  *sf;                    /* Temporary file pointer */
+    H5F_file_t  *next;                  /* Temporary file pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->efc);
+    HDassert(f->shared->nrefs > f->shared->efc->nrefs);
+    HDassert(f->shared->nrefs > 1);
+    HDassert(f->shared->efc->tag < 0);
+
+    if(f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
+        /* We must have reentered this function, and we should close this file.
+         * In actuality, we just release the EFC, the recursion should
+         * eventually reduce this file's reference count to 1 (though possibly
+         * not from this call to H5F_efc_release()). */
+        if(H5F_efc_release(f->shared->efc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
+
+        /* If we marked the file as closeable, there must be no open files in
+         * its EFC.  This is because, in order to close an open child file, the
+         * client must keep a copy of the parent file open.  The algorithm
+         * detect that the parent file is open (directly or through an EFC) and
+         * refuse to close it.  Verify that all files were released from this
+         * EFC (i.e. none were open). */
+        HDassert(f->shared->efc->nfiles == 0);
+
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
+
+    /* Conditions where we should not do anything and just return immediately */
+    /* If there are references that are not from an EFC or f, it will never
+     * be possible to close the file.  Just return.  Note that this holds true
+     * for the case that this file is being closed through H5F_efc_release()
+     * because that function (through H5F_efc_remove_ent()) decrements the EFC
+     * reference count before it calls H5F_try_close(). This may occur if this
+     * function is reentered. */
+    /* If the tag is H5F_EFC_TAG_DONTCLOSE, then we have definitely reentered
+     * this function, and this file has been marked as uncloseable, so we should
+     * not close/release it */
+    /* If nfiles is 0, then there is nothing to do.  Just return.  This may also
+     * occur on reentry (for example if this file was previously released). */
+    if((f->shared->nrefs != f->shared->efc->nrefs + 1)
+            || (f->shared->efc->tag == H5F_EFC_TAG_DONTCLOSE)
+            || (f->shared->efc->nfiles == 0))
+        /* We must have reentered this function, and we should not close this
+         * file.  Just return. */
+        HGOTO_DONE(SUCCEED)
+
+    /* If the file EFC were locked, that should always mean that there exists
+     * a reference to this file that is not in an EFC (it may have just been 
+     * removed from an EFC), and should have been caught by the above check */
+    /* If we get here then we must be beginning a new run.  Make sure that the
+     * temporary variables in f->shared->efc are at the default value */
+    HDassert(f->shared->efc->tag == H5F_EFC_TAG_DEFAULT);
+    HDassert(f->shared->efc->tmp_next == NULL);
+
+    /* Set up linked list for traversal into EFC tree.  f->shared is guaranteed
+     * to always be at the head. */
+    tail = f->shared;
+
+    /* Set up temporary reference count on root file */
+    f->shared->efc->tag = (int)f->shared->efc->nrefs;
+
+    /* First Pass: simulate closing all files reachable from this one, use "tag"
+     * field to keep track of final reference count for each file (including
+     * this one).  Keep list of files with starting reference count > 1 (head is
+     * f->shared). */
+    H5F_efc_try_close_tag1(f->shared, &tail);
+
+    /* Check if f->shared->efc->tag dropped to 0.  If it did not,
+     * we cannot close anything.  Just reset temporary values and return. */
+    if(f->shared->efc->tag > 0) {
+        sf = f->shared;
+        while(sf) {
+            next = sf->efc->tmp_next;
+            sf->efc->tag = H5F_EFC_TAG_DEFAULT;
+            sf->efc->tmp_next = NULL;
+            sf = next;
+        } /* end while */
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
+
+    /* Run through the linked list , separating into two lists, one with tag ==
+     * 0 and one with tag > 0.  Mark them as either H5F_EFC_TAG_CLOSE or
+     * H5F_EFC_TAG_DONTCLOSE as appropriate. */
+    sf = f->shared;
+    tail = NULL;
+    while(sf) {
+        HDassert(sf->efc->tag >= 0);
+        next = sf->efc->tmp_next;
+        if(sf->efc->tag > 0) {
+            /* Remove from main list */
+            HDassert(tail);
+            tail->efc->tmp_next = sf->efc->tmp_next;
+            sf->efc->tmp_next = NULL;
+
+            /* Add to uncloseable list */
+            if(!uncloseable_head)
+                uncloseable_head = sf;
+            else
+                uncloseable_tail->efc->tmp_next = sf;
+            uncloseable_tail = sf;
+
+            /* Mark as uncloseable */
+            sf->efc->tag = H5F_EFC_TAG_DONTCLOSE;
+        } /* end if */
+        else {
+            sf->efc->tag = H5F_EFC_TAG_CLOSE;
+            tail = sf;
+        } /* end else */
+        sf = next;
+    } /* end while */
+
+    /* Second pass: Determine which of the reachable files found in pass 1
+     * cannot be closed by releasing the root file's EFC.  Run through the
+     * uncloseable list, for each item traverse the files reachable through the
+     * EFC, mark the file as uncloseable, and add it to the list of uncloseable
+     * files (for cleanup).  Use "tail" to store the original uncloseable tail
+     * so we know when to stop.  We do not need to keep track of the closeable
+     * list any more. */
+    sf = uncloseable_head;
+    if(sf) {
+        tail = uncloseable_tail;
+        HDassert(tail);
+        while(sf != tail->efc->tmp_next) {
+            H5F_efc_try_close_tag2(sf, &uncloseable_tail);
+            sf = sf->efc->tmp_next;
+        } /* end while */
+    } /* end if */
+
+    /* If the root file's tag is still H5F_EFC_TAG_CLOSE, release its EFC.  This
+     * should start the recursive release that should close all closeable files.
+     * Also, see the top of this function. */
+    if(f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
+        if(H5F_efc_release(f->shared->efc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
+
+        /* Make sure the file's reference count is now 1 and will be closed by
+         * H5F_dest(). */
+        HDassert(f->shared->nrefs == 1);
+    } /* end if */
+
+    /* Clean up uncloseable files (reset tag and tmp_next).  All closeable files
+     * should have been closed, and therefore do not need to be cleaned up. */
+    if(uncloseable_head) {
+        sf = uncloseable_head;
+        while(sf) {
+            next = sf->efc->tmp_next;
+            HDassert(sf->efc->tag == H5F_EFC_TAG_DONTCLOSE);
+            sf->efc->tag = H5F_EFC_TAG_DEFAULT;
+            sf->efc->tmp_next = NULL;
+            sf = next;
+        } /* end while */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_efc_try_close() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ffake.c b/gatb-core/thirdparty/hdf5/src/H5Ffake.c
new file mode 100644
index 0000000..af048bc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ffake.c
@@ -0,0 +1,129 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5F_init_fake_interface
+
+
+/* Packages needed by this file... */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+
+/* PRIVATE PROTOTYPES */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5F_init_fake_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5F_init_fake_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5F_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5F_init_fake_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5F_init())
+} /* H5F_init_fake_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_fake_alloc
+ *
+ * Purpose:     Allocate a "fake" file structure, for various routines to
+ *              use for encoding/decoding data structures using internal API
+ *              routines that need a file structure, but don't ultimately
+ *              depend on having a "real" file.
+ *
+ * Return:      Success:        Pointer to 'faked up' file structure
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct  2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5F_fake_alloc(uint8_t sizeof_size)
+{
+    H5F_t *f = NULL;            /* Pointer to fake file struct */
+    H5F_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate faked file struct */
+    if(NULL == (f = H5FL_CALLOC(H5F_t)))
+	HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
+    if(NULL == (f->shared = H5FL_CALLOC(H5F_file_t)))
+	HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared file structure")
+
+    /* Only set fields necessary for clients */
+    if(sizeof_size == 0)
+        f->shared->sizeof_size = H5F_OBJ_SIZE_SIZE;
+    else
+        f->shared->sizeof_size = sizeof_size;
+
+    /* Set return value */
+    ret_value = f;
+
+done:
+    if(!ret_value)
+        H5F_fake_free(f);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_fake_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_fake_free
+ *
+ * Purpose:     Free a "fake" file structure.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct  2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_fake_free(H5F_t *f)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free faked file struct */
+    if(f) {
+        /* Destroy shared file struct */
+        if(f->shared)
+            f->shared = H5FL_FREE(H5F_file_t, f->shared);
+        f = H5FL_FREE(H5F_t, f);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F_fake_free() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fint.c b/gatb-core/thirdparty/hdf5/src/H5Fint.c
new file mode 100644
index 0000000..81b8606
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fint.c
@@ -0,0 +1,2058 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5F_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Aprivate.h"		/* Attributes				*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+#include "H5Tprivate.h"		/* Datatypes				*/
+
+/* Predefined file drivers */
+#include "H5FDcore.h"		/*temporary in-memory files		*/
+#include "H5FDfamily.h"		/*family of files			*/
+#include "H5FDlog.h"            /* sec2 driver with logging, for debugging */
+#include "H5FDmpi.h"            /* MPI-based file drivers		*/
+#include "H5FDmulti.h"		/*multiple files partitioned by mem usage */
+#include "H5FDsec2.h"		/*Posix unbuffered I/O			*/
+#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
+#ifdef H5_HAVE_WINDOWS
+#include "H5FDwindows.h"        /* Windows buffered I/O     */
+#endif
+#include "H5FDdirect.h"         /*Linux direct I/O			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Struct only used by functions H5F_get_objects and H5F_get_objects_cb */
+typedef struct H5F_olist_t {
+    H5I_type_t obj_type;        /* Type of object to look for */
+    hid_t      *obj_id_list;    /* Pointer to the list of open IDs to return */
+    size_t     *obj_id_count;   /* Number of open IDs */
+    struct {
+        hbool_t local;          /* Set flag for "local" file searches */
+        union {
+            H5F_file_t *shared; /* Pointer to shared file to look inside */
+            const H5F_t *file;  /* Pointer to file to look inside */
+        } ptr;
+    } file_info;
+    size_t     list_index;      /* Current index in open ID array */
+    size_t     max_nobjs;       /* Maximum # of IDs to put into array */
+} H5F_olist_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key);
+static herr_t H5F_build_actual_name(const H5F_t *f, const H5P_genplist_t *fapl,
+    const char *name, char ** /*out*/ actual_name);/* Declare a free list to manage the H5F_t struct */
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5F_t struct */
+H5FL_DEFINE(H5F_t);
+
+/* Declare a free list to manage the H5F_file_t struct */
+H5FL_DEFINE(H5F_file_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_init_interface
+ *
+ * Purpose:	Initialize interface-specific information.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_init_interface(void)
+{
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_access_plist
+ *
+ * Purpose:	Returns a copy of the file access property list of the
+ *		specified file.
+ *
+ *              NOTE: Make sure that, if you are going to overwrite
+ *              information in the copied property list that was
+ *              previously opened and assigned to the property list, then
+ *              you must close it before overwriting the values.
+ *
+ * Return:	Success:	Object ID for a copy of the file access
+ *				property list.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 25, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5F_get_access_plist(H5F_t *f, hbool_t app_ref)
+{
+    H5P_genplist_t *new_plist;              /* New property list */
+    H5P_genplist_t *old_plist;              /* Old property list */
+    void		*driver_info=NULL;
+    unsigned            efc_size = 0;
+    hid_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+
+    /* Make a copy of the default file access property list */
+    if(NULL == (old_plist = (H5P_genplist_t *)H5I_object(H5P_LST_FILE_ACCESS_ID_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if((ret_value = H5P_copy_plist(old_plist, app_ref)) < 0)
+	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "can't copy file access property list")
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(ret_value)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Copy properties of the file access property list */
+    if(H5P_set(new_plist, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, &(f->shared->mdc_initCacheCfg)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set initial metadata cache resize config.")
+    if(H5P_set(new_plist, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, &(f->shared->rdcc_nslots)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache number of slots")
+    if(H5P_set(new_plist, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, &(f->shared->rdcc_nbytes)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache byte size")
+    if(H5P_set(new_plist, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, &(f->shared->rdcc_w0)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set preempt read chunks")
+    if(H5P_set(new_plist, H5F_ACS_ALIGN_THRHD_NAME, &(f->shared->threshold)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set alignment threshold")
+    if(H5P_set(new_plist, H5F_ACS_ALIGN_NAME, &(f->shared->alignment)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set alignment")
+    if(H5P_set(new_plist, H5F_ACS_GARBG_COLCT_REF_NAME, &(f->shared->gc_ref)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set garbage collect reference")
+    if(H5P_set(new_plist, H5F_ACS_META_BLOCK_SIZE_NAME, &(f->shared->meta_aggr.alloc_size)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set metadata cache size")
+    if(H5P_set(new_plist, H5F_ACS_SIEVE_BUF_SIZE_NAME, &(f->shared->sieve_buf_size)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't sieve buffer size")
+    if(H5P_set(new_plist, H5F_ACS_SDATA_BLOCK_SIZE_NAME, &(f->shared->sdata_aggr.alloc_size)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'small data' cache size")
+    if(H5P_set(new_plist, H5F_ACS_LATEST_FORMAT_NAME, &(f->shared->latest_format)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'latest format' flag")
+    if(f->shared->efc)
+        efc_size = H5F_efc_max_nfiles(f->shared->efc);
+    if(H5P_set(new_plist, H5F_ACS_EFC_SIZE_NAME, &efc_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set elink file cache size")
+
+    /*
+     * Since we're resetting the driver ID and info, close them if they
+     * exist in this new property list.
+     */
+    if(H5P_facc_close(ret_value, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't free the old driver information")
+
+    /* Increment the reference count on the driver ID and insert it into the property list */
+    if(H5I_inc_ref(f->shared->lf->driver_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
+    if(H5P_set(new_plist, H5F_ACS_FILE_DRV_ID_NAME, &(f->shared->lf->driver_id)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver ID")
+
+    /* Set the driver "info" in the property list */
+    driver_info = H5FD_fapl_get(f->shared->lf);
+    if(driver_info != NULL && H5P_set(new_plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver info")
+
+    /* Set the file close degree appropriately */
+    if(f->shared->fc_degree == H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->lf->cls->fc_degree)) < 0) {
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
+    } else if(f->shared->fc_degree != H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->fc_degree)) < 0) {
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_access_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_obj_count
+ *
+ * Purpose:	Private function return the number of opened object IDs
+ *		(files, datasets, groups, datatypes) in the same file.
+ *
+ * Return:      SUCCEED on success, FAIL on failure.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, Dec 5, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_obj_count(const H5F_t *f, unsigned types, hbool_t app_ref, size_t *obj_id_count_ptr)
+{
+    herr_t   ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(obj_id_count_ptr);
+
+    /* Perform the query */
+    if((ret_value = H5F_get_objects(f, types, 0, NULL, app_ref, obj_id_count_ptr)) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_objects failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_obj_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_obj_ids
+ *
+ * Purpose:     Private function to return a list of opened object IDs.
+ *
+ * Return:      Non-negative on success; can't fail.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, Dec 5, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_obj_ids(const H5F_t *f, unsigned types, size_t max_objs, hid_t *oid_list, hbool_t app_ref, size_t *obj_id_count_ptr)
+{
+    herr_t ret_value = SUCCEED;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(obj_id_count_ptr);
+
+    /* Perform the query */
+    if((ret_value = H5F_get_objects(f, types, max_objs, oid_list, app_ref, obj_id_count_ptr)) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_objects failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_obj_ids() */
+
+

+/*---------------------------------------------------------------------------
+ * Function:	H5F_get_objects
+ *
+ * Purpose:	This function is called by H5F_get_obj_count or
+ *		H5F_get_obj_ids to get number of object IDs and/or a
+ *		list of opened object IDs (in return value).
+ * Return:	Non-negative on success; Can't fail.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, Dec 5, 2001
+ *
+ *---------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_objects(const H5F_t *f, unsigned types, size_t max_nobjs, hid_t *obj_id_list, hbool_t app_ref, size_t *obj_id_count_ptr)
+{
+    size_t obj_id_count=0;      /* Number of open IDs */
+    H5F_olist_t olist;          /* Structure to hold search results */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(obj_id_count_ptr);
+
+    /* Set up search information */
+    olist.obj_id_list  = (max_nobjs==0 ? NULL : obj_id_list);
+    olist.obj_id_count = &obj_id_count;
+    olist.list_index   = 0;
+    olist.max_nobjs   = max_nobjs;
+
+    /* Determine if we are searching for local or global objects */
+    if(types & H5F_OBJ_LOCAL) {
+        olist.file_info.local = TRUE;
+        olist.file_info.ptr.file = f;
+    } /* end if */
+    else {
+        olist.file_info.local = FALSE;
+        olist.file_info.ptr.shared = f ? f->shared : NULL;
+    } /* end else */
+
+    /* Iterate through file IDs to count the number, and put their
+     * IDs on the object list.  */
+    if(types & H5F_OBJ_FILE) {
+        olist.obj_type = H5I_FILE;
+        if(H5I_iterate(H5I_FILE, H5F_get_objects_cb, &olist, app_ref) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed(1)")
+    } /* end if */
+
+    /* If the caller just wants to count the number of objects (OLIST.MAX_NOBJS is zero),
+     * or the caller wants to get the list of IDs and the list isn't full,
+     * search through dataset IDs to count number of datasets, and put their
+     * IDs on the object list */
+    if(!olist.max_nobjs || (olist.max_nobjs && olist.list_index<olist.max_nobjs)) { 
+        if (types & H5F_OBJ_DATASET) {
+            olist.obj_type = H5I_DATASET;
+            if(H5I_iterate(H5I_DATASET, H5F_get_objects_cb, &olist, app_ref) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed(2)")
+        } /* end if */
+    } 
+
+    /* If the caller just wants to count the number of objects (OLIST.MAX_NOBJS is zero),
+     * or the caller wants to get the list of IDs and the list isn't full,
+     * search through group IDs to count number of groups, and put their
+     * IDs on the object list */
+    if(!olist.max_nobjs || (olist.max_nobjs && olist.list_index<olist.max_nobjs)) { 
+        if(types & H5F_OBJ_GROUP) {
+            olist.obj_type = H5I_GROUP;
+            if(H5I_iterate(H5I_GROUP, H5F_get_objects_cb, &olist, app_ref) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed(3)")
+        } /* end if */
+    } 
+
+    /* If the caller just wants to count the number of objects (OLIST.MAX_NOBJS is zero),
+     * or the caller wants to get the list of IDs and the list isn't full,
+     * search through datatype IDs to count number of named datatypes, and put their
+     * IDs on the object list */
+    if(!olist.max_nobjs || (olist.max_nobjs && olist.list_index<olist.max_nobjs)) { 
+        if(types & H5F_OBJ_DATATYPE) {
+            olist.obj_type = H5I_DATATYPE;
+            if(H5I_iterate(H5I_DATATYPE, H5F_get_objects_cb, &olist, app_ref) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed(4)")
+        } /* end if */
+    } 
+
+    /* If the caller just wants to count the number of objects (OLIST.MAX_NOBJS is zero),
+     * or the caller wants to get the list of IDs and the list isn't full,
+     * search through attribute IDs to count number of attributes, and put their
+     * IDs on the object list */
+    if(!olist.max_nobjs || (olist.max_nobjs && olist.list_index<olist.max_nobjs)) {
+        if(types & H5F_OBJ_ATTR) {
+            olist.obj_type = H5I_ATTR;
+            if(H5I_iterate(H5I_ATTR, H5F_get_objects_cb, &olist, app_ref) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed(5)")
+        } /* end if */
+    }
+ 
+    /* Set the number of objects currently open */
+    *obj_id_count_ptr = obj_id_count;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_objects() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_objects_cb
+ *
+ * Purpose:	H5F_get_objects' callback function.  It verifies if an
+ * 		object is in the file, and either count it or put its ID
+ *		on the list.
+ *
+ * Return:      H5_ITER_STOP if the array of object IDs is filled up.
+ *              H5_ITER_CONT otherwise.
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, Dec 5, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
+{
+    H5F_olist_t *olist = (H5F_olist_t *)key;    /* Alias for search info */
+    int         ret_value = H5_ITER_CONT;    /* Return value */
+    hbool_t     add_obj = FALSE;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(obj_ptr);
+    HDassert(olist);
+
+    /* Count file IDs */
+    if(olist->obj_type == H5I_FILE) {
+        if((olist->file_info.local &&
+                        (!olist->file_info.ptr.file || (olist->file_info.ptr.file && (H5F_t*)obj_ptr == olist->file_info.ptr.file) ))
+                ||  (!olist->file_info.local &&
+                        ( !olist->file_info.ptr.shared || (olist->file_info.ptr.shared && ((H5F_t*)obj_ptr)->shared == olist->file_info.ptr.shared) ))) {
+            add_obj = TRUE;
+	}
+    } /* end if */
+    else { /* either count opened object IDs or put the IDs on the list */
+        H5O_loc_t *oloc;        /* Group entry info for object */
+
+    	switch(olist->obj_type) {
+	    case H5I_ATTR:
+	        oloc = H5A_oloc((H5A_t *)obj_ptr);
+                break;
+
+	    case H5I_GROUP:
+	        oloc = H5G_oloc((H5G_t *)obj_ptr);
+                break;
+
+	    case H5I_DATASET:
+	        oloc = H5D_oloc((H5D_t *)obj_ptr);
+		break;
+
+	    case H5I_DATATYPE:
+                if(H5T_is_named((H5T_t*)obj_ptr)==TRUE)
+                    oloc = H5T_oloc((H5T_t*)obj_ptr);
+                else
+                    oloc = NULL;
+		break;
+
+	    case H5I_UNINIT:
+	    case H5I_BADID:
+	    case H5I_FILE:
+	    case H5I_DATASPACE:
+	    case H5I_REFERENCE:
+	    case H5I_VFL:
+	    case H5I_GENPROP_CLS:
+	    case H5I_GENPROP_LST:
+	    case H5I_ERROR_CLASS:
+	    case H5I_ERROR_MSG:
+	    case H5I_ERROR_STACK:
+	    case H5I_NTYPES:
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5_ITER_ERROR, "unknown data object")
+	} /* end switch */
+
+        if((olist->file_info.local &&
+                    ( (!olist->file_info.ptr.file && olist->obj_type == H5I_DATATYPE && H5T_is_immutable((H5T_t *)obj_ptr) == FALSE)
+                            || (!olist->file_info.ptr.file && olist->obj_type != H5I_DATATYPE)
+                            || (oloc && oloc->file == olist->file_info.ptr.file)))
+                || (!olist->file_info.local &&
+                    ((!olist->file_info.ptr.shared && olist->obj_type == H5I_DATATYPE && H5T_is_immutable((H5T_t *)obj_ptr) == FALSE)
+                            || (!olist->file_info.ptr.shared && olist->obj_type != H5I_DATATYPE)
+                            || (oloc && oloc->file && oloc->file->shared == olist->file_info.ptr.shared)))) {
+            add_obj = TRUE;
+    	} /* end if */
+    } /* end else */
+
+    if(TRUE==add_obj) {
+        /* Add the object's ID to the ID list, if appropriate */
+        if(olist->obj_id_list) {
+            olist->obj_id_list[olist->list_index] = obj_id;
+	    olist->list_index++;
+	} /* end if */
+
+        /* Increment the number of open objects */
+	if(olist->obj_id_count)
+            (*olist->obj_id_count)++;
+
+        /* Check if we've filled up the array.  Return H5_ITER_STOP only if
+         * we have filled up the array. Otherwise return H5_ITER_CONT(RET_VALUE is
+         * preset to H5_ITER_CONT) because H5I_iterate needs the return value of 
+         * H5_ITER_CONT to continue the iteration. */
+        if(olist->max_nobjs>0 && olist->list_index>=olist->max_nobjs)
+            HGOTO_DONE(H5_ITER_STOP)  /* Indicate that the iterator should stop */
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_objects_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_is_hdf5
+ *
+ * Purpose:	Check the file signature to detect an HDF5 file.
+ *
+ * Bugs:	This function is not robust: it only uses the default file
+ *		driver when attempting to open the file when in fact it
+ *		should use all known file drivers.
+ *
+ * Return:	Success:	TRUE/FALSE
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Unknown
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-08-02
+ *		Rewritten to use the virtual file layer.
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5F_is_hdf5(const char *name)
+{
+    H5FD_t	*file = NULL;           /* Low-level file struct */
+    haddr_t     sig_addr;               /* Addess of hdf5 file signature */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Open the file at the virtual file layer */
+    if(NULL == (file = H5FD_open(name, H5F_ACC_RDONLY, H5P_FILE_ACCESS_DEFAULT, HADDR_UNDEF)))
+	HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to open file")
+
+    /* The file is an hdf5 file if the hdf5 file signature can be found */
+    if(H5FD_locate_signature(file, H5AC_ind_dxpl_g, &sig_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to locate file signature")
+    ret_value = (HADDR_UNDEF != sig_addr);
+
+done:
+    /* Close the file */
+    if(file)
+        if(H5FD_close(file) < 0 && ret_value >= 0)
+            HDONE_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_is_hdf5() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_new
+ *
+ * Purpose:	Creates a new file object and initializes it.  The
+ *		H5Fopen and H5Fcreate functions then fill in various
+ *		fields.	 If SHARED is a non-null pointer then the shared info
+ *		to which it points has the reference count incremented.
+ *		Otherwise a new, empty shared info struct is created and
+ *		initialized with the specified file access property list.
+ *
+ * Errors:
+ *
+ * Return:	Success:	Ptr to a new file struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf)
+{
+    H5F_t	*f = NULL, *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (f = H5FL_CALLOC(H5F_t)))
+	HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
+    f->file_id = -1;
+
+    if(shared) {
+        HDassert(lf == NULL);
+	f->shared = shared;
+    } /* end if */
+    else {
+        H5P_genplist_t *plist;          /* Property list */
+        unsigned        efc_size;       /* External file cache size */
+        size_t u;                       /* Local index variable */
+
+        HDassert(lf != NULL);
+        if(NULL == (f->shared = H5FL_CALLOC(H5F_file_t)))
+            HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared file structure")
+
+        f->shared->flags = flags;
+	f->shared->sohm_addr = HADDR_UNDEF;
+	f->shared->sohm_vers = HDF5_SHAREDHEADER_VERSION;
+        for(u = 0; u < NELMTS(f->shared->fs_addr); u++)
+            f->shared->fs_addr[u] = HADDR_UNDEF;
+	f->shared->accum.loc = HADDR_UNDEF;
+        f->shared->lf = lf;
+
+	/*
+	 * Copy the file creation and file access property lists into the
+	 * new file handle.  We do this early because some values might need
+	 * to change as the file is being opened.
+	 */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not property list")
+        f->shared->fcpl_id = H5P_copy_plist(plist, FALSE);
+
+        /* Get the FCPL values to cache */
+        if(H5P_get(plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &f->shared->sizeof_addr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get byte number for address")
+        if(H5P_get(plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &f->shared->sizeof_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get byte number for object size")
+        if(H5P_get(plist, H5F_CRT_SHMSG_NINDEXES_NAME, &f->shared->sohm_nindexes) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get number of SOHM indexes")
+        HDassert(f->shared->sohm_nindexes < 255);
+
+        /* Get the FAPL values to cache */
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list")
+        if(H5P_get(plist, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, &(f->shared->mdc_initCacheCfg)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get initial metadata cache resize config")
+        if(H5P_get(plist, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, &(f->shared->rdcc_nslots)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get data cache number of slots")
+        if(H5P_get(plist, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, &(f->shared->rdcc_nbytes)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get data cache byte size")
+        if(H5P_get(plist, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, &(f->shared->rdcc_w0)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get preempt read chunk")
+        if(H5P_get(plist, H5F_ACS_ALIGN_THRHD_NAME, &(f->shared->threshold)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment threshold")
+        if(H5P_get(plist, H5F_ACS_ALIGN_NAME, &(f->shared->alignment)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment")
+        if(H5P_get(plist, H5F_ACS_GARBG_COLCT_REF_NAME,&(f->shared->gc_ref)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get garbage collect reference")
+        if(H5P_get(plist, H5F_ACS_SIEVE_BUF_SIZE_NAME, &(f->shared->sieve_buf_size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get sieve buffer size")
+        if(H5P_get(plist, H5F_ACS_LATEST_FORMAT_NAME, &(f->shared->latest_format)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'latest format' flag")
+        if(H5P_get(plist, H5F_ACS_META_BLOCK_SIZE_NAME, &(f->shared->meta_aggr.alloc_size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get metadata cache size")
+        f->shared->meta_aggr.feature_flag = H5FD_FEAT_AGGREGATE_METADATA;
+        if(H5P_get(plist, H5F_ACS_SDATA_BLOCK_SIZE_NAME, &(f->shared->sdata_aggr.alloc_size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'small data' cache size")
+        f->shared->sdata_aggr.feature_flag = H5FD_FEAT_AGGREGATE_SMALLDATA;
+        if(H5P_get(plist, H5F_ACS_EFC_SIZE_NAME, &efc_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get elink file cache size")
+        if(efc_size > 0)
+            if(NULL == (f->shared->efc = H5F_efc_create(efc_size)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "can't create external file cache")
+
+        /* Get the VFD values to cache */
+        f->shared->maxaddr = H5FD_get_maxaddr(lf);
+        if(!H5F_addr_defined(f->shared->maxaddr))
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad maximum address from VFD")
+        if(H5FD_get_feature_flags(lf, &f->shared->feature_flags) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get feature flags from VFD")
+        if(H5FD_get_fs_type_map(lf, f->shared->fs_type_map) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get free space type mapping from VFD")
+        if(H5MF_init_merge_flags(f) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "problem initializing free space merge flags")
+        f->shared->tmp_addr = f->shared->maxaddr;
+        /* Disable temp. space allocation for parallel I/O (for now) */
+        /* (When we've arranged to have the relocated metadata addresses (and
+         *      sizes) broadcast during the "end of epoch" metadata operations,
+         *      this can be enabled - QAK)
+         */
+        /* (This should be disabled when the metadata journaling branch is
+         *      merged into the trunk and journaling is enabled, at least until
+         *      we make it work. - QAK)
+         */
+        f->shared->use_tmp_space = !H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI);
+
+	/*
+	 * Create a metadata cache with the specified number of elements.
+	 * The cache might be created with a different number of elements and
+	 * the access property list should be updated to reflect that.
+	 */
+	if(H5AC_create(f, &(f->shared->mdc_initCacheCfg)) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache")
+
+        /* Create the file's "open object" information */
+        if(H5FO_create(f) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object data structure")
+
+        /* Add new "shared" struct to list of open files */
+        if(H5F_sfile_add(f->shared) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to append to list of open files")
+    } /* end else */
+
+    f->shared->nrefs++;
+
+    /* Create the file's "top open object" information */
+    if(H5FO_top_create(f) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object data structure")
+
+    /* Set return value */
+    ret_value = f;
+
+done:
+    if(!ret_value && f) {
+	if(!shared) {
+            /* Attempt to clean up some of the shared file structures */
+            if(f->shared->efc)
+                if(H5F_efc_destroy(f->shared->efc) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, NULL, "can't destroy external file cache")
+            if(f->shared->fcpl_id > 0)
+                if(H5I_dec_ref(f->shared->fcpl_id) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTDEC, NULL, "can't close property list")
+
+            f->shared = H5FL_FREE(H5F_file_t, f->shared);
+        } /* end if */
+	f = H5FL_FREE(H5F_t, f);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_dest
+ *
+ * Purpose:	Destroys a file structure.  This function flushes the cache
+ *		but doesn't do any other cleanup other than freeing memory
+ *		for the file struct.  The shared info for the file is freed
+ *		only when its reference count reaches zero.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
+{
+    herr_t	   ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    if(1 == f->shared->nrefs) {
+        H5F_io_info_t fio_info;             /* I/O info for operation */
+
+        /* Flush at this point since the file will be closed.
+         * Only try to flush the file if it was opened with write access, and if
+         * the caller requested a flush.
+         */
+        if((f->shared->flags & H5F_ACC_RDWR) && flush)
+            if(H5F_flush(f, dxpl_id, TRUE) < 0)
+                HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+
+        /* Release the external file cache */
+        if(f->shared->efc) {
+            if(H5F_efc_destroy(f->shared->efc) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't destroy external file cache")
+            f->shared->efc = NULL;
+        } /* end if */
+
+        /* Release objects that depend on the superblock being initialized */
+        if(f->shared->sblock) {
+            /* Shutdown file free space manager(s) */
+            /* (We should release the free space information now (before truncating
+             *      the file and before the metadata cache is shut down) since the
+             *      free space manager is holding some data structures in memory
+             *      and also because releasing free space can shrink the file's
+             *      'eoa' value)
+             */
+            if(H5F_ACC_RDWR & H5F_INTENT(f)) {
+                if(H5MF_close(f, dxpl_id) < 0)
+                    /* Push error, but keep going*/
+                    HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file free space info")
+
+                /* Flush the file again (if requested), as shutting down the
+                 * free space manager may dirty some data structures again.
+                 */
+                if(flush)
+                    if(H5F_flush(f, dxpl_id, TRUE) < 0)
+                        /* Push error, but keep going*/
+                        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+            } /* end if */
+
+            /* Unpin the superblock, since we're about to destroy the cache */
+            if(H5AC_unpin_entry(f->shared->sblock) < 0)
+                /* Push error, but keep going*/
+                HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
+            f->shared->sblock = NULL;
+        } /* end if */
+ 
+        /* Remove shared file struct from list of open files */
+        if(H5F_sfile_remove(f->shared) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+
+        /* Shutdown the metadata cache */
+        if(H5AC_dest(f, dxpl_id))
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+
+        /*
+         * Do not close the root group since we didn't count it, but free
+         * the memory associated with it.
+         */
+        if(f->shared->root_grp) {
+            /* Free the root group */
+            if(H5G_root_free(f->shared->root_grp) < 0)
+                /* Push error, but keep going*/
+                HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+            f->shared->root_grp = NULL;
+        } /* end if */
+
+        /* Set up I/O info for operation */
+        fio_info.f = f;
+        if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+        /* Destroy other components of the file */
+        if(H5F__accum_reset(&fio_info, TRUE) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+        if(H5FO_dest(f) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+        f->shared->cwfs = (struct H5HG_heap_t **)H5MM_xfree(f->shared->cwfs);
+        if(H5G_node_close(f) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
+
+        /* Destroy file creation properties */
+        if(H5I_GENPROP_LST != H5I_get_type(f->shared->fcpl_id))
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_BADTYPE, FAIL, "not a property list")
+        if(H5I_dec_ref(f->shared->fcpl_id) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "can't close property list")
+
+        /* Close the file */
+        if(H5FD_close(f->shared->lf) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
+
+        /* Free mount table */
+        f->shared->mtab.child = (H5F_mount_t *)H5MM_xfree(f->shared->mtab.child);
+        f->shared->mtab.nalloc = 0;
+
+        /* Destroy shared file struct */
+        f->shared = (H5F_file_t *)H5FL_FREE(H5F_file_t, f->shared);
+
+    } else if(f->shared->nrefs > 0) {
+        /*
+         * There are other references to the shared part of the file.
+         * Only decrement the reference count.
+         */
+        --f->shared->nrefs;
+    }
+
+    /* Free the non-shared part of the file */
+    f->open_name = (char *)H5MM_xfree(f->open_name);
+    f->actual_name = (char *)H5MM_xfree(f->actual_name);
+    f->extpath = (char *)H5MM_xfree(f->extpath);
+    if(H5FO_top_dest(f) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "problems closing file")
+    f->shared = NULL;
+    f = H5FL_FREE(H5F_t, f);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_open
+ *
+ * Purpose:	Opens (or creates) a file.  This function understands the
+ *		following flags which are similar in nature to the Posix
+ *		open(2) flags.
+ *
+ *		H5F_ACC_RDWR:	Open with read/write access. If the file is
+ *				currently open for read-only access then it
+ *				will be reopened. Absence of this flag
+ *				implies read-only access.
+ *
+ *		H5F_ACC_CREAT:	Create a new file if it doesn't exist yet.
+ *				The permissions are 0666 bit-wise AND with
+ *				the current umask.  H5F_ACC_WRITE must also
+ *				be specified.
+ *
+ *		H5F_ACC_EXCL:	This flag causes H5F_open() to fail if the
+ *				file already exists.
+ *
+ *		H5F_ACC_TRUNC:	The file is truncated and a new HDF5 superblock
+ *				is written.  This operation will fail if the
+ *				file is already open.
+ *
+ *		Unlinking the file name from the group directed graph while
+ *		the file is opened causes the file to continue to exist but
+ *		one will not be able to upgrade the file from read-only
+ *		access to read-write access by reopening it. Disk resources
+ *		for the file are released when all handles to the file are
+ *		closed. NOTE: This paragraph probably only applies to Unix;
+ *		deleting the file name in other OS's has undefined results.
+ *
+ *		The CREATE_PARMS argument is optional.	A null pointer will
+ *		cause the default file creation parameters to be used.
+ *
+ *		The ACCESS_PARMS argument is optional.  A null pointer will
+ *		cause the default file access parameters to be used.
+ *
+ * Return:	Success:	A new file pointer.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, September 23, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
+    hid_t dxpl_id)
+{
+    H5F_t              *file = NULL;        /*the success return value      */
+    H5F_file_t         *shared = NULL;      /*shared part of `file'         */
+    H5FD_t             *lf = NULL;          /*file driver part of `shared'  */
+    unsigned            tent_flags;         /*tentative flags               */
+    H5FD_class_t       *drvr;               /*file driver class info        */
+    H5P_genplist_t     *a_plist;            /*file access property list     */
+    H5F_close_degree_t  fc_degree;          /*file close degree             */
+    H5F_t              *ret_value;          /*actual return value           */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * If the driver has a `cmp' method then the driver is capable of
+     * determining when two file handles refer to the same file and the
+     * library can insure that when the application opens a file twice
+     * that the two handles coordinate their operations appropriately.
+     * Otherwise it is the application's responsibility to never open the
+     * same file more than once at a time.
+     */
+    if(NULL == (drvr = H5FD_get_class(fapl_id)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to retrieve VFL class")
+
+    /*
+     * Opening a file is a two step process. First we try to open the
+     * file in a way which doesn't affect its state (like not truncating
+     * or creating it) so we can compare it with files that are already
+     * open. If that fails then we try again with the full set of flags
+     * (only if they're different than the original failed attempt).
+     * However, if the file driver can't distinquish between files then
+     * there's no reason to open the file tentatively because it's the
+     * application's responsibility to prevent this situation (there's no
+     * way for us to detect it here anyway).
+     */
+    if(drvr->cmp)
+	tent_flags = flags & ~(H5F_ACC_CREAT|H5F_ACC_TRUNC|H5F_ACC_EXCL);
+    else
+	tent_flags = flags;
+
+    if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
+	if(tent_flags == flags) {
+#ifndef H5_USING_MEMCHECKER
+            time_t mytime = HDtime(NULL);
+
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
+#else /* H5_USING_MEMCHECKER */
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
+#endif /* H5_USING_MEMCHECKER */
+        } /* end if */
+        H5E_clear_stack(NULL);
+	tent_flags = flags;
+	if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
+#ifndef H5_USING_MEMCHECKER
+            time_t mytime = HDtime(NULL);
+
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
+#else /* H5_USING_MEMCHECKER */
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
+#endif /* H5_USING_MEMCHECKER */
+        } /* end if */
+    } /* end if */
+
+    /* Is the file already open? */
+    if((shared = H5F_sfile_search(lf)) != NULL) {
+	/*
+	 * The file is already open, so use that one instead of the one we
+	 * just opened. We only one one H5FD_t* per file so one doesn't
+	 * confuse the other.  But fail if this request was to truncate the
+	 * file (since we can't do that while the file is open), or if the
+	 * request was to create a non-existent file (since the file already
+	 * exists), or if the new request adds write access (since the
+	 * readers don't expect the file to change under them).
+	 */
+	if(H5FD_close(lf) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
+	if(flags & H5F_ACC_TRUNC)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to truncate a file which is already open")
+	if(flags & H5F_ACC_EXCL)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file exists")
+	if((flags & H5F_ACC_RDWR) && 0 == (shared->flags & H5F_ACC_RDWR))
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file is already open for read-only")
+
+        /* Allocate new "high-level" file struct */
+        if((file = H5F_new(shared, flags, fcpl_id, fapl_id, NULL)) == NULL)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create new file object")
+    } /* end if */
+    else {
+        /* Check if tentative open was good enough */
+        if(flags != tent_flags) {
+            /*
+             * This file is not yet open by the library and the flags we used to
+             * open it are different than the desired flags. Close the tentative
+             * file and open it for real.
+             */
+            if(H5FD_close(lf) < 0) {
+                file = NULL; /*to prevent destruction of wrong file*/
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
+            } /* end if */
+            if(NULL == (lf = H5FD_open(name, flags, fapl_id, HADDR_UNDEF))) {
+                file = NULL; /*to prevent destruction of wrong file*/
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
+            } /* end if */
+        } /* end if */
+
+        if(NULL == (file = H5F_new(NULL, flags, fcpl_id, fapl_id, lf)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create new file object")
+    } /* end else */
+
+    /* Retain the name the file was opened with */
+    file->open_name = H5MM_xstrdup(name);
+
+    /* Short cuts */
+    shared = file->shared;
+    lf = shared->lf;
+
+    /*
+     * Read or write the file superblock, depending on whether the file is
+     * empty or not.
+     */
+    if(0 == H5FD_get_eof(lf) && (flags & H5F_ACC_RDWR)) {
+        /*
+         * We've just opened a fresh new file (or truncated one). We need
+         * to create & write the superblock.
+         */
+
+        /* Initialize information about the superblock and allocate space for it */
+        /* (Writes superblock extension messages, if there are any) */
+        if(H5F_super_init(file, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to allocate file superblock")
+
+        /* Create and open the root group */
+        /* (This must be after the space for the superblock is allocated in
+         *      the file, since the superblock must be at offset 0)
+         */
+        if(H5G_mkroot(file, dxpl_id, TRUE) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create/open root group")
+    } else if (1 == shared->nrefs) {
+	/* Read the superblock if it hasn't been read before. */
+        if(H5F_super_read(file, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
+
+	/* Open the root group */
+	if(H5G_mkroot(file, dxpl_id, FALSE) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read root group")
+    } /* end if */
+
+    /* Get the file access property list, for future queries */
+    if(NULL == (a_plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list")
+
+    /*
+     * Decide the file close degree.  If it's the first time to open the
+     * file, set the degree to access property list value; if it's the
+     * second time or later, verify the access property list value matches
+     * the degree in shared file structure.
+     */
+    if(H5P_get(a_plist, H5F_ACS_CLOSE_DEGREE_NAME, &fc_degree) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file close degree")
+
+    if(shared->nrefs == 1) {
+        if(fc_degree == H5F_CLOSE_DEFAULT)
+            shared->fc_degree = lf->cls->fc_degree;
+        else
+            shared->fc_degree = fc_degree;
+    } else if(shared->nrefs > 1) {
+        if(fc_degree == H5F_CLOSE_DEFAULT && shared->fc_degree != lf->cls->fc_degree)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "file close degree doesn't match")
+        if(fc_degree != H5F_CLOSE_DEFAULT && fc_degree != shared->fc_degree)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "file close degree doesn't match")
+    } /* end if */
+
+    /* Formulate the absolute path for later search of target file for external links */
+    if(H5_build_extpath(name, &file->extpath) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build extpath")
+
+    /* Formulate the actual file name, after following symlinks, etc. */
+    if(H5F_build_actual_name(file, a_plist, name, &file->actual_name) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build actual name")
+
+    /* Success */
+    ret_value = file;
+
+done:
+    if(!ret_value && file)
+        if(H5F_dest(file, dxpl_id, FALSE) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "problems closing file")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_flush
+ *
+ * Purpose:	Flushes cached data.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 29 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing)
+{
+    H5F_io_info_t fio_info;             /* I/O info for operation */
+    herr_t   ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check arguments */
+    HDassert(f);
+
+    /* Flush any cached dataset storage raw data */
+    if(H5D_flush(f, dxpl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush dataset cache")
+
+    /* Release any space allocated to space aggregators, so that the eoa value
+     *  corresponds to the end of the space written to in the file.
+     */
+    /* (needs to happen before cache flush, with superblock write, since the
+     *  'eoa' value is written in superblock -QAK)
+     */
+    if(H5MF_free_aggrs(f, dxpl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file space")
+
+    /* Flush the entire metadata cache */
+    if(H5AC_flush(f, dxpl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache")
+
+    /* Truncate the file to the current allocated size */
+    if(H5FD_truncate(f->shared->lf, dxpl_id, closing) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "low level truncate failed")
+
+    /* Flush the entire metadata cache again since the EOA could have changed in the truncate call. */
+    if(H5AC_flush(f, dxpl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache")
+
+    /* Set up I/O info for operation */
+    fio_info.f = f;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Flush out the metadata accumulator */
+    if(H5F__accum_flush(&fio_info) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush metadata accumulator")
+
+    /* Flush file buffers to disk. */
+    if(H5FD_flush(f->shared->lf, dxpl_id, closing) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_close
+ *
+ * Purpose:	Closes a file or causes the close operation to be pended.
+ *		This function is called two ways: from the API it gets called
+ *		by H5Fclose->H5I_dec_ref->H5F_close when H5I_dec_ref()
+ *		decrements the file ID reference count to zero.  The file ID
+ *		is removed from the H5I_FILE group by H5I_dec_ref() just
+ *		before H5F_close() is called. If there are open object
+ *		headers then the close is pended by moving the file to the
+ *		H5I_FILE_CLOSING ID group (the f->closing contains the ID
+ *		assigned to file).
+ *
+ *		This function is also called directly from H5O_close() when
+ *		the last object header is closed for the file and the file
+ *		has a pending close.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, September 23, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_close(H5F_t *f)
+{
+    herr_t	        ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->file_id > 0);   /* This routine should only be called when a file ID's ref count drops to zero */
+
+    /* Perform checks for "semi" file close degree here, since closing the
+     * file is not allowed if there are objects still open */
+    if(f->shared->fc_degree == H5F_CLOSE_SEMI) {
+        unsigned nopen_files = 0;       /* Number of open files in file/mount hierarchy */
+        unsigned nopen_objs = 0;        /* Number of open objects in file/mount hierarchy */
+
+        /* Get the number of open objects and open files on this file/mount hierarchy */
+        if(H5F_mount_count_ids(f, &nopen_files, &nopen_objs) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_MOUNT, FAIL, "problem checking mount hierarchy")
+
+        /* If there are no other file IDs open on this file/mount hier., but
+         * there are still open objects, issue an error and bail out now,
+         * without decrementing the file ID's reference count and triggering
+         * a "real" attempt at closing the file */
+        if(nopen_files == 1 && nopen_objs > 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file, there are objects still open")
+    } /* end if */
+
+    /* Reset the file ID for this file */
+    f->file_id = -1;
+
+    /* Attempt to close the file/mount hierarchy */
+    if(H5F_try_close(f) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_try_close
+ *
+ * Purpose:	Attempts to close a file due to one of several actions:
+ *                      - The reference count on the file ID dropped to zero
+ *                      - The last open object was closed in the file
+ *                      - The file was unmounted
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_try_close(H5F_t *f)
+{
+    unsigned            nopen_files = 0;        /* Number of open files in file/mount hierarchy */
+    unsigned            nopen_objs = 0;         /* Number of open objects in file/mount hierarchy */
+    herr_t	        ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Check if this file is already in the process of closing */
+    if(f->closing)
+        HGOTO_DONE(SUCCEED)
+
+    /* Get the number of open objects and open files on this file/mount hierarchy */
+    if(H5F_mount_count_ids(f, &nopen_files, &nopen_objs) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_MOUNT, FAIL, "problem checking mount hierarchy")
+
+    /*
+     * Close file according to close degree:
+     *
+     *  H5F_CLOSE_WEAK:	if there are still objects open, wait until
+     *			they are all closed.
+     *  H5F_CLOSE_SEMI:	if there are still objects open, return fail;
+     *			otherwise, close file.
+     *  H5F_CLOSE_STRONG:	if there are still objects open, close them
+     *			first, then close file.
+     */
+    switch(f->shared->fc_degree) {
+        case H5F_CLOSE_WEAK:
+            /*
+             * If file or object IDS are still open then delay deletion of
+             * resources until they have all been closed.  Flush all
+             * caches and update the object header anyway so that failing to
+             * close all objects isn't a major problem.
+             */
+            if((nopen_files + nopen_objs) > 0)
+                HGOTO_DONE(SUCCEED)
+            break;
+
+        case H5F_CLOSE_SEMI:
+            /* Can leave safely if file IDs are still open on this file */
+            if(nopen_files > 0)
+                HGOTO_DONE(SUCCEED)
+
+            /* Sanity check: If close degree if "semi" and we have gotten this
+             * far and there are objects left open, bail out now */
+            HDassert(nopen_files == 0 && nopen_objs == 0);
+
+            /* If we've gotten this far (ie. there are no open objects in the file), fall through to flush & close */
+            break;
+
+        case H5F_CLOSE_STRONG:
+            /* If there are other open files in the hierarchy, we can leave now */
+            if(nopen_files > 0)
+                HGOTO_DONE(SUCCEED)
+
+            /* If we've gotten this far (ie. there are no open file IDs in the file/mount hierarchy), fall through to flush & close */
+            break;
+
+        case H5F_CLOSE_DEFAULT:
+        default:
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file, unknown file close degree")
+    } /* end switch */
+
+    /* Mark this file as closing (prevents re-entering file shutdown code below) */
+    f->closing = TRUE;
+
+    /* If the file close degree is "strong", close all the open objects in this file */
+    if(f->shared->fc_degree == H5F_CLOSE_STRONG) {
+        HDassert(nopen_files ==  0);
+
+        /* Forced close of all opened objects in this file */
+        if(f->nopen_objs > 0) {
+            size_t obj_count;       /* # of open objects */
+            hid_t objs[128];        /* Array of objects to close */
+            herr_t result;          /* Local result from obj ID query */
+            size_t u;               /* Local index variable */
+
+            /* Get the list of IDs of open dataset, group, & attribute objects */
+            while((result = H5F_get_obj_ids(f, H5F_OBJ_LOCAL | H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_ATTR, (int)(sizeof(objs) / sizeof(objs[0])), objs, FALSE, &obj_count)) <= 0
+                    && obj_count != 0 ) {
+
+                /* Try to close all the open objects in this file */
+                for(u = 0; u < obj_count; u++)
+                    if(H5I_dec_ref(objs[u]) < 0)
+                        HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't close object")
+            } /* end while */
+            if(result < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_ids failed(1)")
+
+            /* Get the list of IDs of open named datatype objects */
+            /* (Do this separately from the dataset & attribute IDs, because
+             * they could be using one of the named datatypes and then the
+             * open named datatype ID will get closed twice)
+             */
+            while((result = H5F_get_obj_ids(f, H5F_OBJ_LOCAL | H5F_OBJ_DATATYPE, (int)(sizeof(objs) / sizeof(objs[0])), objs, FALSE, &obj_count)) <= 0
+                    && obj_count != 0) {
+
+                /* Try to close all the open objects in this file */
+                for(u = 0; u < obj_count; u++)
+                    if(H5I_dec_ref(objs[u]) < 0)
+                        HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't close object")
+            } /* end while */
+            if(result < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_ids failed(2)")
+        } /* end if */
+    } /* end if */
+
+    /* Check if this is a child file in a mounting hierarchy & proceed up the
+     * hierarchy if so.
+     */
+    if(f->parent)
+        if(H5F_try_close(f->parent) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close parent file")
+
+    /* Unmount and close each child before closing the current file. */
+    if(H5F_close_mounts(f) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't unmount child files")
+
+    /* If there is more than one reference to the shared file struct and the
+     * file has an external file cache, we should see if it can be closed.  This
+     * can happen if a cycle is formed with external file caches */
+    if(f->shared->efc && (f->shared->nrefs > 1))
+        if(H5F_efc_try_close(f) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't attempt to close EFC")
+
+    /* Delay flush until the shared file struct is closed, in H5F_dest.  If the
+     * application called H5Fclose, it would have been flushed in that function
+     * (unless it will have been flushed in H5F_dest anyways). */
+
+    /*
+     * Destroy the H5F_t struct and decrement the reference count for the
+     * shared H5F_file_t struct. If the reference count for the H5F_file_t
+     * struct reaches zero then destroy it also.
+     */
+    if(H5F_dest(f, H5AC_dxpl_id, TRUE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_try_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_id
+ *
+ * Purpose:	Get the file ID, incrementing it, or "resurrecting" it as
+ *              appropriate.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Oct 29, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5F_get_id(H5F_t *file, hbool_t app_ref)
+{
+    hid_t       ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    if(file->file_id == -1) {
+        /* Get an atom for the file */
+        if((file->file_id = H5I_register(H5I_FILE, file, app_ref)) < 0)
+	    HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
+    } else {
+        /* Increment reference count on atom. */
+        if(H5I_inc_ref(file->file_id, app_ref) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed")
+    } /* end else */
+
+    ret_value = file->file_id;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_incr_nopen_objs
+ *
+ * Purpose:	Increment the number of open objects for a file.
+ *
+ * Return:	Success:	The number of open objects, after the increment
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_incr_nopen_objs(H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(++f->nopen_objs)
+} /* end H5F_incr_nopen_objs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_decr_nopen_objs
+ *
+ * Purpose:	Decrement the number of open objects for a file.
+ *
+ * Return:	Success:	The number of open objects, after the decrement
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_decr_nopen_objs(H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(--f->nopen_objs)
+} /* end H5F_decr_nopen_objs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_build_actual_name
+ *
+ * Purpose:	Retrieve the name of a file, after following symlinks, etc.
+ *
+ * Note:	Currently only working for "POSIX I/O compatible" VFDs
+ *
+ * Return:	Success:        0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *		November 25, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_build_actual_name(const H5F_t *f, const H5P_genplist_t *fapl, const char *name,
+    char **actual_name/*out*/)
+{
+    hid_t       new_fapl_id = -1;       /* ID for duplicated FAPL */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(fapl);
+    HDassert(name);
+    HDassert(actual_name);
+
+    /* Clear actual name pointer to begin with */
+    *actual_name = NULL;
+
+/* Assume that if the OS can't create symlinks, that we don't need to worry
+ *      about resolving them either. -QAK
+ */
+#ifdef H5_HAVE_SYMLINK
+    /* Check for POSIX I/O compatible file handle */
+    if(H5F_HAS_FEATURE(f, H5FD_FEAT_POSIX_COMPAT_HANDLE)) {
+        h5_stat_t lst;   /* Stat info from lstat() call */
+
+        /* Call lstat() on the file's name */
+        if(HDlstat(name, &lst) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve stat info for file")
+
+        /* Check for symbolic link */
+        if(S_IFLNK == (lst.st_mode & S_IFMT)) {
+            H5P_genplist_t *new_fapl;   /* Duplicated FAPL */
+            int *fd;                    /* POSIX I/O file descriptor */
+            h5_stat_t st;               /* Stat info from stat() call */
+            h5_stat_t fst;              /* Stat info from fstat() call */
+            char realname[PATH_MAX];    /* Fully resolved path name of file */
+            hbool_t want_posix_fd;      /* Flag for retrieving file descriptor from VFD */
+
+            /* Perform a sanity check that the file or link wasn't switched
+             * between when we opened it and when we called lstat().  This is
+             * according to the security best practices for lstat() documented
+             * here: https://www.securecoding.cert.org/confluence/display/seccode/POS35-C.+Avoid+race+conditions+while+checking+for+the+existence+of+a+symbolic+link
+             */
+
+            /* Copy the FAPL object to modify */
+            if((new_fapl_id = H5P_copy_plist(fapl, FALSE)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+            if(NULL == (new_fapl = (H5P_genplist_t *)H5I_object(new_fapl_id)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, "can't get property list")
+
+            /* Set the character encoding on the new property list */
+            want_posix_fd = TRUE;
+            if(H5P_set(new_fapl, H5F_ACS_WANT_POSIX_FD_NAME, &want_posix_fd) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set character encoding")
+
+            /* Retrieve the file handle */
+            if(H5F_get_vfd_handle(f, new_fapl_id, (void **)&fd) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve POSIX file descriptor")
+
+            /* Stat the filename we're resolving */
+            if(HDstat(name, &st) < 0)
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to stat file")
+
+            /* Stat the file we opened */
+            if(HDfstat(*fd, &fst) < 0)
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to fstat file")
+
+            /* Verify that the files are really the same */
+            if(st.st_mode != fst.st_mode || st.st_ino != fst.st_ino || st.st_dev != fst.st_dev)
+                HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "files' st_ino or st_dev fields changed!")
+
+            /* Get the resolved path for the file name */
+            if(NULL == HDrealpath(name, realname))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve real path for file")
+
+            /* Duplicate the resolved path for the file name */
+            if(NULL == (*actual_name = (char *)H5MM_strdup(realname)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't duplicate real path")
+        } /* end if */
+    } /* end if */
+#endif /* H5_HAVE_SYMLINK */
+
+    /* Check if we've resolved the file's name */
+    if(NULL == *actual_name) {
+        /* Just duplicate the name used to open the file */
+        if(NULL == (*actual_name = (char *)H5MM_strdup(name)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't duplicate open name")
+    } /* end else */
+
+done:
+    /* Close the property list */
+    if(new_fapl_id > 0)
+        if(H5I_dec_app_ref(new_fapl_id) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close duplicated FAPL")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_build_actual_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_addr_encode_len
+ *
+ * Purpose:	Encodes an address into the buffer pointed to by *PP and
+ *		then increments the pointer to the first byte after the
+ *		address.  An undefined value is stored as all 1's.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November  7, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5F_addr_encode_len(size_t addr_len, uint8_t **pp/*in,out*/, haddr_t addr)
+{
+    unsigned    u;              /* Local index variable */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(addr_len);
+    HDassert(pp && *pp);
+
+    if(H5F_addr_defined(addr)) {
+	for(u = 0; u < addr_len; u++) {
+	    *(*pp)++ = (uint8_t)(addr & 0xff);
+	    addr >>= 8;
+	} /* end for */
+	HDassert("overflow" && 0 == addr);
+    } /* end if */
+    else {
+	for(u = 0; u < addr_len; u++)
+	    *(*pp)++ = 0xff;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_addr_encode_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_addr_encode
+ *
+ * Purpose:	Encodes an address into the buffer pointed to by *PP and
+ *		then increments the pointer to the first byte after the
+ *		address.  An undefined value is stored as all 1's.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November  7, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5F_addr_encode(const H5F_t *f, uint8_t **pp/*in,out*/, haddr_t addr)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    H5F_addr_encode_len(H5F_SIZEOF_ADDR(f), pp, addr);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_addr_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_addr_decode_len
+ *
+ * Purpose:	Decodes an address from the buffer pointed to by *PP and
+ *		updates the pointer to point to the next byte after the
+ *		address.
+ *
+ *		If the value read is all 1's then the address is returned
+ *		with an undefined value.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November  7, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5F_addr_decode_len(size_t addr_len, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*out*/)
+{
+    hbool_t	    all_zero = TRUE;    /* True if address was all zeroes */
+    unsigned	    u;          /* Local index variable */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(addr_len);
+    HDassert(pp && *pp);
+    HDassert(addr_p);
+
+    /* Reset value in destination */
+    *addr_p = 0;
+
+    /* Decode bytes from address */
+    for(u = 0; u < addr_len; u++) {
+        uint8_t	    c;          /* Local decoded byte */
+
+        /* Get decoded byte (and advance pointer) */
+	c = *(*pp)++;
+
+        /* Check for non-undefined address byte value */
+	if(c != 0xff)
+            all_zero = FALSE;
+
+	if(u < sizeof(*addr_p)) {
+            haddr_t	    tmp = c;    /* Local copy of address, for casting */
+
+            /* Shift decoded byte to correct position */
+	    tmp <<= (u * 8);	/*use tmp to get casting right */
+
+            /* Merge into already decoded bytes */
+	    *addr_p |= tmp;
+	} /* end if */
+        else
+            if(!all_zero)
+                HDassert(0 == **pp);	/*overflow */
+    } /* end for */
+
+    /* If 'all_zero' is still TRUE, the address was entirely composed of '0xff'
+     *  bytes, which is the encoded form of 'HADDR_UNDEF', so set the destination
+     *  to that value */
+    if(all_zero)
+        *addr_p = HADDR_UNDEF;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_addr_decode_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_addr_decode
+ *
+ * Purpose:	Decodes an address from the buffer pointed to by *PP and
+ *		updates the pointer to point to the next byte after the
+ *		address.
+ *
+ *		If the value read is all 1's then the address is returned
+ *		with an undefined value.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November  7, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5F_addr_decode(const H5F_t *f, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*out*/)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    H5F_addr_decode_len(H5F_SIZEOF_ADDR(f), pp, addr_p);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_addr_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_grp_btree_shared
+ *
+ * Purpose:     Set the grp_btree_shared field with a valid ref-count pointer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              7/19/11
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_grp_btree_shared(H5F_t *f, H5RC_t *rc)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(rc);
+
+    f->shared->grp_btree_shared = rc;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_grp_btree_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_sohm_addr
+ *
+ * Purpose:     Set the sohm_addr field with a new value.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              7/20/11
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_sohm_addr(H5F_t *f, haddr_t addr)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    f->shared->sohm_addr = addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_sohm_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_sohm_vers
+ *
+ * Purpose:     Set the sohm_vers field with a new value.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              7/20/11
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_sohm_vers(H5F_t *f, unsigned vers)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    f->shared->sohm_vers = vers;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_sohm_vers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_sohm_nindexes
+ *
+ * Purpose:     Set the sohm_nindexes field with a new value.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              7/20/11
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_sohm_nindexes(H5F_t *f, unsigned nindexes)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    f->shared->sohm_nindexes = nindexes;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_sohm_nindexes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_store_msg_crt_idx
+ *
+ * Purpose:     Set the store_msg_crt_idx field with a new value.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              7/20/11
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_store_msg_crt_idx(H5F_t *f, hbool_t flag)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    f->shared->store_msg_crt_idx = flag;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_store_msg_crt_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_file_image
+ *
+ * Purpose:     Private version of H5Fget_file_image
+ *
+ * Return:      Success:        Bytes copied / number of bytes needed.
+ *              Failure:        negative value
+ *
+ * Programmer:  John Mainzer
+ *              11/15/11
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len)
+{
+    H5FD_t     *fd_ptr;                 /* file driver */
+    haddr_t     eoa;                    /* End of file address */
+    ssize_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    if(!file || !file->shared || !file->shared->lf)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file_id yields invalid file pointer")
+    fd_ptr = file->shared->lf;
+    if(!fd_ptr->cls)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "fd_ptr yields invalid class pointer")
+
+    /* the address space used by the split and multi file drivers is not
+     * a good fit for this call.  Since the plan is to depreciate these
+     * drivers anyway, don't bother to do a "force fit".
+     *
+     * The following clause tests for the multi file driver, and fails
+     * if the supplied file has the multi file driver as its top level
+     * file driver.  However, this test will not work if there is some
+     * other file driver sitting on top of the multi file driver.
+     *
+     * I'm not sure if this is possible at present, but in all likelyhood,
+     * it will become possible in the future.  On the other hand, we may
+     * remove the split/multi file drivers before then.
+     *
+     * I am leaving this solution in for now, but we should review it,
+     * and improve the solution if necessary.
+     *
+     *                                          JRM -- 11/11/22
+     */
+    if(HDstrcmp(fd_ptr->cls->name, "multi") == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not supported for multi file driver.")
+
+    /* While the family file driver is conceptually fully compatible 
+     * with the get file image operation, it sets a file driver message
+     * in the super block that prevents the image being opened with any
+     * driver other than the family file driver.  Needless to say, this
+     * rather defeats the purpose of the get file image operation.
+     *
+     * While this problem is quire solvable, the required time and 
+     * resources are lacking at present.  Hence, for now, we don't
+     * allow the get file image operation to be perfomed on files 
+     * opened with the family file driver.
+     *
+     * Observe that the following test only looks at the top level 
+     * driver, and fails if there is some other driver sitting on to
+     * of the family file driver.  
+     *
+     * I don't think this can happen at present, but that may change
+     * in the future.
+     *                                   JRM -- 12/21/11
+     */
+    if(HDstrcmp(fd_ptr->cls->name, "family") == 0)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "Not supported for family file driver.")
+
+    /* Go get the actual file size */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(file->shared->lf, H5FD_MEM_DEFAULT)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+
+    /* set ret_value = to eoa -- will overwrite this if appropriate */
+    ret_value = (ssize_t)eoa;
+
+    /* test to see if a buffer was provided -- if not, we are done */
+    if(buf_ptr != NULL) {
+        size_t	space_needed;		/* size of file image */
+
+        /* Check for buffer too small */
+        if((haddr_t)buf_len < eoa)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "supplied buffer too small")
+
+        space_needed = (size_t)eoa;
+
+        /* read in the file image */
+        /* (Note compensation for base address addition in internal routine) */
+        if(H5FD_read(fd_ptr, H5AC_ind_dxpl_g, H5FD_MEM_DEFAULT, 0, space_needed, buf_ptr) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_READERROR, FAIL, "file image read request failed")
+    } /* end if */
+    
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_get_file_image() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fio.c b/gatb-core/thirdparty/hdf5/src/H5Fio.c
new file mode 100644
index 0000000..1d05cd0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fio.c
@@ -0,0 +1,176 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Fio.c
+ *                      Jan 10 2008
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             File I/O routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_block_read
+ *
+ * Purpose:	Reads some data from a file/server/etc into a buffer.
+ *		The data is contiguous.	 The address is relative to the base
+ *		address for the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 10 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size,
+    hid_t dxpl_id, void *buf/*out*/)
+{
+    H5F_io_info_t fio_info;             /* I/O info for operation */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(buf);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Check for attempting I/O on 'temporary' file address */
+    if(H5F_addr_le(f->shared->tmp_addr, (addr + size)))
+        HGOTO_ERROR(H5E_IO, H5E_BADRANGE, FAIL, "attempting I/O in temporary file space")
+
+    /* Set up I/O info for operation */
+    fio_info.f = f;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Pass through metadata accumulator layer */
+    if(H5F__accum_read(&fio_info, type, addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "read through metadata accumulator failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_block_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_block_write
+ *
+ * Purpose:	Writes some data from memory to a file/server/etc.  The
+ *		data is contiguous.  The address is relative to the base
+ *		address.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 10 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_block_write(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size,
+    hid_t dxpl_id, const void *buf)
+{
+    H5F_io_info_t fio_info;             /* I/O info for operation */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef QAK
+HDfprintf(stderr, "%s: write to addr = %a, size = %Zu\n", FUNC, addr, size);
+#endif /* QAK */
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+    HDassert(buf);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Check for attempting I/O on 'temporary' file address */
+    if(H5F_addr_le(f->shared->tmp_addr, (addr + size)))
+        HGOTO_ERROR(H5E_IO, H5E_BADRANGE, FAIL, "attempting I/O in temporary file space")
+
+    /* Set up I/O info for operation */
+    fio_info.f = f;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Pass through metadata accumulator layer */
+    if(H5F__accum_write(&fio_info, type, addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write through metadata accumulator failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_block_write() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fmount.c b/gatb-core/thirdparty/hdf5/src/H5Fmount.c
new file mode 100644
index 0000000..643eba5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fmount.c
@@ -0,0 +1,784 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5F_init_mount_interface
+
+
+/* Packages needed by this file... */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child,
+    hid_t plist_id, hid_t dxpl_id);
+static herr_t H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id);
+static void H5F_mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5F_init_mount_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5F_init_mount_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5F_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5F_init_mount_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5F_init())
+} /* H5F_init_mount_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_close_mounts
+ *
+ * Purpose:	Close all mounts for a given file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, July  2, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_close_mounts(H5F_t *f)
+{
+    unsigned u;                 /* Local index */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+
+    /* Unmount all child files.  Loop backwards to avoid having to adjust u when
+     * a file is unmounted.  Note that we rely on unsigned u "wrapping around"
+     * to terminate the loop. */
+    for (u = f->shared->mtab.nmounts - 1; u < f->shared->mtab.nmounts; u--) {
+        /* Only unmount children mounted to this top level file structure */
+        if(f->shared->mtab.child[u].file->parent == f) {
+            /* Detach the child file from the parent file */
+            f->shared->mtab.child[u].file->parent = NULL;
+
+            /* Close the internal group maintaining the mount point */
+            if(H5G_close(f->shared->mtab.child[u].group) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close child group")
+
+            /* Close the child file */
+            if(H5F_try_close(f->shared->mtab.child[u].file) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close child file")
+
+            /* Eliminate the mount point from the table */
+            HDmemmove(f->shared->mtab.child + u, f->shared->mtab.child + u + 1,
+                (f->shared->mtab.nmounts - u - 1) * sizeof(f->shared->mtab.child[0]));
+            f->shared->mtab.nmounts--;
+            f->nmounts--;
+        }
+    } /* end if */
+
+    HDassert(f->nmounts == 0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_close_mounts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mount
+ *
+ * Purpose:	Mount file CHILD onto the group specified by LOC and NAME,
+ *		using mount properties in PLIST.  CHILD must not already be
+ *		mouted and must not be a mount ancestor of the mount-point.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_mount(H5G_loc_t *loc, const char *name, H5F_t *child,
+	  hid_t H5_ATTR_UNUSED plist_id, hid_t dxpl_id)
+{
+    H5G_t	*mount_point = NULL;	/*mount point group		*/
+    H5F_t	*ancestor = NULL;	/*ancestor files		*/
+    H5F_t	*parent = NULL;		/*file containing mount point	*/
+    unsigned	lt, rt, md;		/*binary search indices		*/
+    int		cmp;			/*binary search comparison value*/
+    H5G_loc_t   mp_loc;                 /* entry of moint point to be opened */
+    H5G_name_t  mp_path;            	/* Mount point group hier. path */
+    H5O_loc_t   mp_oloc;            	/* Mount point object location */
+    H5G_loc_t   root_loc;               /* Group location of root of file to mount */
+    herr_t	ret_value = SUCCEED;	/*return value			*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(child);
+    HDassert(TRUE == H5P_isa_class(plist_id, H5P_FILE_MOUNT));
+
+    /* Set up group location to fill in */
+    mp_loc.oloc = &mp_oloc;
+    mp_loc.path = &mp_path;
+    H5G_loc_reset(&mp_loc);
+
+    /*
+     * Check that the child isn't mounted, that the mount point exists, that
+     * the mount point wasn't reached via external link, that
+     * the parent & child files have the same file close degree, and
+     * that the mount wouldn't introduce a cycle in the mount tree.
+     */
+    if(child->parent)
+        HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "file is already mounted")
+    if(H5G_loc_find(loc, name, &mp_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    /* If the mount location is holding its file open, that file will close
+     * and remove the mount as soon as we exit this function.  Prevent the
+     * user from doing this.
+     */
+    if(mp_loc.oloc->holding_file != FALSE)
+        HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount path cannot contain links to external files")
+
+    /* Open the mount point group */
+    if(NULL == (mount_point = H5G_open(&mp_loc, dxpl_id)))
+        HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point not found")
+
+    /* Check if the proposed mount point group is already a mount point */
+    if(H5G_MOUNTED(mount_point))
+	HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point is already in use")
+
+    /* Retrieve information from the mount point group */
+    /* (Some of which we had before but was reset in mp_loc when the group
+     *  "took over" the group location - QAK)
+     */
+    parent = H5G_fileof(mount_point);
+    HDassert(parent);
+    mp_loc.oloc = H5G_oloc(mount_point);
+    HDassert(mp_loc.oloc);
+    mp_loc.path = H5G_nameof(mount_point);
+    HDassert(mp_loc.path);
+    for(ancestor = parent; ancestor; ancestor = ancestor->parent) {
+	if(ancestor->shared == child->shared)
+	    HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount would introduce a cycle")
+    } /* end for */
+
+    /* Make certain that the parent & child files have the same "file close degree" */
+    if(parent->shared->fc_degree != child->shared->fc_degree)
+        HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mounted file has different file close degree than parent")
+
+    /*
+     * Use a binary search to locate the position that the child should be
+     * inserted into the parent mount table.  At the end of this paragraph
+     * `md' will be the index where the child should be inserted.
+     */
+    lt = md = 0;
+    rt = parent->shared->mtab.nmounts;
+    cmp = -1;
+    while(lt < rt && cmp) {
+        H5O_loc_t	*oloc;		/*temporary symbol table entry	*/
+
+	md = (lt + rt) / 2;
+	oloc = H5G_oloc(parent->shared->mtab.child[md].group);
+	cmp = H5F_addr_cmp(mp_loc.oloc->addr, oloc->addr);
+	if(cmp < 0)
+	    rt = md;
+	else if(cmp > 0)
+	    lt = md + 1;
+    } /* end while */
+    if(cmp > 0)
+        md++;
+    if(!cmp)
+	HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point is already in use")
+
+    /* Make room in the table */
+    if(parent->shared->mtab.nmounts >= parent->shared->mtab.nalloc) {
+	unsigned n = MAX(16, 2 * parent->shared->mtab.nalloc);
+	H5F_mount_t *x = (H5F_mount_t *)H5MM_realloc(parent->shared->mtab.child, n * sizeof(parent->shared->mtab.child[0]));
+
+	if(!x)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for mount table")
+	parent->shared->mtab.child = x;
+	parent->shared->mtab.nalloc = n;
+    } /* end if */
+
+    /* Insert into table */
+    HDmemmove(parent->shared->mtab.child + md + 1, parent->shared->mtab.child + md,
+            (parent->shared->mtab.nmounts-md) * sizeof(parent->shared->mtab.child[0]));
+    parent->shared->mtab.nmounts++;
+    parent->nmounts++;
+    parent->shared->mtab.child[md].group = mount_point;
+    parent->shared->mtab.child[md].file = child;
+    child->parent = parent;
+
+    /* Set the group's mountpoint flag */
+    if(H5G_mount(parent->shared->mtab.child[md].group) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to set group mounted flag")
+
+    /* Get the group location for the root group in the file to unmount */
+    if(NULL == (root_loc.oloc = H5G_oloc(child->shared->root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+    if(NULL == (root_loc.path = H5G_nameof(child->shared->root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+    /* Search the open IDs and replace names for mount operation */
+    /* We pass H5G_UNKNOWN as object type; search all IDs */
+    if(H5G_name_replace(NULL, H5G_NAME_MOUNT, mp_loc.oloc->file,
+            mp_loc.path->full_path_r, root_loc.oloc->file, root_loc.path->full_path_r,
+            dxpl_id) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to replace name")
+
+done:
+    if(ret_value < 0) {
+        if(mount_point) {
+            if(H5G_close(mount_point) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close mounted group")
+        } /* end if */
+        else {
+            if(H5G_loc_free(&mp_loc) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free mount location")
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_mount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_unmount
+ *
+ * Purpose:	Unmount the child which is mounted at the group specified by
+ *		LOC and NAME or fail if nothing is mounted there.  Neither
+ *		file is closed.
+ *
+ *		Because the mount point is specified by name and opened as a
+ *		group, the H5G_namei() will resolve it to the root of the
+ *		mounted file, not the group where the file is mounted.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id)
+{
+    H5G_t	*child_group = NULL;	/* Child's group in parent mtab	*/
+    H5F_t	*child = NULL;		/*mounted file			*/
+    H5F_t	*parent = NULL;		/*file where mounted		*/
+    H5O_loc_t   *mnt_oloc;            	/* symbol table entry for root of mounted file */
+    H5G_name_t  mp_path;            	/* Mount point group hier. path */
+    H5O_loc_t   mp_oloc;            	/* Mount point object location  */
+    H5G_loc_t   mp_loc;                 /* entry used to open mount point*/
+    hbool_t     mp_loc_setup = FALSE;   /* Whether mount point location is set up */
+    H5G_loc_t   root_loc;               /* Group location of root of file to unmount */
+    int         child_idx;              /* Index of child in parent's mtab */
+    herr_t	ret_value = SUCCEED;	/*return value			*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up mount point location to fill in */
+    mp_loc.oloc = &mp_oloc;
+    mp_loc.path = &mp_path;
+    H5G_loc_reset(&mp_loc);
+
+    /*
+     * Get the mount point, or more precisely the root of the mounted file.
+     * If we get the root group and the file has a parent in the mount tree,
+     * then we must have found the mount point.
+     */
+    if(H5G_loc_find(loc, name, &mp_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    mp_loc_setup = TRUE;
+    child = mp_loc.oloc->file;
+    mnt_oloc = H5G_oloc(child->shared->root_grp);
+    child_idx = -1;
+
+    if(child->parent && H5F_addr_eq(mp_oloc.addr, mnt_oloc->addr)) {
+        unsigned	u;		/*counters			*/
+
+	/*
+	 * We've been given the root group of the child.  We do a reverse
+	 * lookup in the parent's mount table to find the correct entry.
+	 */
+	parent = child->parent;
+	for(u = 0; u < parent->shared->mtab.nmounts; u++) {
+	    if(parent->shared->mtab.child[u].file->shared == child->shared) {
+                /* Found the correct index */
+                child_idx = (int)u;
+                break;
+	    } /* end if */
+	} /* end for */
+    } else {
+        unsigned lt, rt, md = 0;        /*binary search indices		*/
+        int 	cmp;		        /*binary search comparison value*/
+
+	/*
+	 * We've been given the mount point in the parent.  We use a binary
+	 * search in the parent to locate the mounted file, if any.
+	 */
+	parent = child; /*we guessed wrong*/
+	lt = 0;
+	rt = parent->shared->mtab.nmounts;
+	cmp = -1;
+	while(lt < rt && cmp) {
+	    md = (lt + rt) / 2;
+	    mnt_oloc = H5G_oloc(parent->shared->mtab.child[md].group);
+	    cmp = H5F_addr_cmp(mp_oloc.addr, mnt_oloc->addr);
+	    if (cmp<0)
+		rt = md;
+	    else
+		lt = md + 1;
+	} /* end while */
+	if(cmp)
+	    HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "not a mount point")
+
+        /* Found the correct index, set the info about the child */
+        child_idx = (int)md;
+        H5G_loc_free(&mp_loc);
+        mp_loc_setup = FALSE;
+        mp_loc.oloc = mnt_oloc;
+        mp_loc.path = H5G_nameof(parent->shared->mtab.child[md].group);
+        child = parent->shared->mtab.child[child_idx].file;
+
+        /* Set the parent to be the actual parent of the discovered child.
+         * Could be different due to the shared mount table. */
+        parent = child->parent;
+    } /* end else */
+    HDassert(child_idx >= 0);
+
+    /* Save the information about the child from the mount table */
+    child_group = parent->shared->mtab.child[child_idx].group;
+
+    /* Get the group location for the root group in the file to unmount */
+    if(NULL == (root_loc.oloc = H5G_oloc(child->shared->root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+    if(NULL == (root_loc.path = H5G_nameof(child->shared->root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+    /* Search the open IDs replace names to reflect unmount operation */
+    if(H5G_name_replace(NULL, H5G_NAME_UNMOUNT, mp_loc.oloc->file,
+            mp_loc.path->full_path_r, root_loc.oloc->file, root_loc.path->full_path_r,
+            dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to replace name")
+
+    /* Eliminate the mount point from the table */
+    HDmemmove(parent->shared->mtab.child + (unsigned)child_idx, (parent->shared->mtab.child + (unsigned)child_idx) + 1,
+            ((parent->shared->mtab.nmounts - (unsigned)child_idx) - 1) * sizeof(parent->shared->mtab.child[0]));
+    parent->shared->mtab.nmounts -= 1;
+    parent->nmounts -= 1;
+
+    /* Unmount the child file from the parent file */
+    if(H5G_unmount(child_group) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to reset group mounted flag")
+    if(H5G_close(child_group) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close unmounted group")
+
+    /* Detach child file from parent & see if it should close */
+    child->parent = NULL;
+    if(H5F_try_close(child) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close unmounted file")
+
+done:
+    /* Free the mount point location's information, if it's been set up */
+    if(mp_loc_setup)
+        H5G_loc_free(&mp_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_unmount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_is_mount
+ *
+ * Purpose:	Check if a file is mounted within another file.
+ *
+ * Return:	Success:	TRUE/FALSE
+ *		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January  2, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_is_mount(const H5F_t *file)
+{
+    hbool_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+
+    if(file->parent != NULL)
+        ret_value = TRUE;
+    else
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_is_mount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fmount
+ *
+ * Purpose:	Mount file CHILD_ID onto the group specified by LOC_ID and
+ *		NAME using mount properties PLIST_ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id)
+{
+    H5G_loc_t	loc;
+    H5F_t	*child = NULL;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*sii", loc_id, name, child_id, plist_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(NULL == (child = (H5F_t *)H5I_object_verify(child_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+    if(H5P_DEFAULT == plist_id)
+        plist_id = H5P_FILE_MOUNT_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(plist_id, H5P_FILE_MOUNT))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property list")
+
+    /* Do the mount */
+    if(H5F_mount(&loc, name, child, plist_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to mount file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fmount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Funmount
+ *
+ * Purpose:	Given a mount point, dissassociate the mount point's file
+ *		from the file mounted there.  Do not close either file.
+ *
+ *		The mount point can either be the group in the parent or the
+ *		root group of the mounted file (both groups have the same
+ *		name).  If the mount point was opened before the mount then
+ *		it's the group in the parent, but if it was opened after the
+ *		mount then it's the root group of the child.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Funmount(hid_t loc_id, const char *name)
+{
+    H5G_loc_t	loc;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", loc_id, name);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Unmount */
+    if (H5F_unmount(&loc, name, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to unmount file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Funmount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mount_count_ids_recurse
+ *
+ * Purpose:	Helper routine for counting number of open IDs in mount
+ *              hierarchy.
+ *
+ * Return:	<none>
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5F_mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs)
+{
+    unsigned u;                         /* Local index value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(nopen_files);
+    HDassert(nopen_objs);
+
+    /* If this file is still open, increment number of file IDs open */
+    if(f->file_id > 0)
+        *nopen_files += 1;
+
+    /* Increment number of open objects in file
+     * (Reduced by number of mounted files, we'll add back in the mount point's
+     *  groups later, if they are open)
+     */
+    *nopen_objs += (f->nopen_objs - f->nmounts);
+
+    /* Iterate over files mounted in this file and add in their open ID counts also */
+    for(u = 0; u < f->shared->mtab.nmounts; u++) {
+        /* Only recurse on children mounted to this top level file structure */
+        if(f->shared->mtab.child[u].file->parent == f) {
+            /* Increment the open object count if the mount point group has an open ID */
+            if(H5G_get_shared_count(f->shared->mtab.child[u].group) > 1)
+                *nopen_objs += 1;
+
+            H5F_mount_count_ids_recurse(f->shared->mtab.child[u].file, nopen_files, nopen_objs);
+        }
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5F_mount_count_ids_recurse() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mount_count_ids
+ *
+ * Purpose:	Count the number of open file & object IDs in a mount hierarchy
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tues, July 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(nopen_files);
+    HDassert(nopen_objs);
+
+    /* Find the top file in the mounting hierarchy */
+    while(f->parent)
+        f = f->parent;
+
+    /* Count open IDs in the hierarchy */
+    H5F_mount_count_ids_recurse(f, nopen_files, nopen_objs);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F_mount_count_ids() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_flush_mounts_recurse
+ *
+ * Purpose:	Flush a mount hierarchy, recursively
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Fri, August 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_flush_mounts_recurse(H5F_t *f, hid_t dxpl_id)
+{
+    unsigned	nerrors = 0;            /* Errors from recursive flushes */
+    unsigned    u;                      /* Index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Flush all child files, not stopping for errors */
+    for(u = 0; u < f->shared->mtab.nmounts; u++)
+        if(H5F_flush_mounts_recurse(f->shared->mtab.child[u].file, dxpl_id) < 0)
+            nerrors++;
+
+    /* Call the "real" flush routine, for this file */
+    if(H5F_flush(f, dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+
+    /* Check flush errors for children - errors are already on the stack */
+    if(nerrors)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's child mounts")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_flush_mounts_recurse() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_flush_mounts
+ *
+ * Purpose:	Flush a mount hierarchy
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Fri, August 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_flush_mounts(H5F_t *f, hid_t dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Find the top file in the mount hierarchy */
+    while(f->parent)
+        f = f->parent;
+
+    /* Flush the mounted file hierarchy */
+    if(H5F_flush_mounts_recurse(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_flush_mounts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_traverse_mount
+ *
+ * Purpose:	If LNK is a mount point then copy the entry for the root
+ *		group of the mounted file into LNK.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_traverse_mount(H5O_loc_t *oloc/*in,out*/)
+{
+    H5F_t *parent = oloc->file,         /* File of object */
+        *child = NULL;                  /* Child file */
+    unsigned	lt, rt, md = 0;         /* Binary search indices */
+    int cmp;
+    H5O_loc_t	*mnt_oloc = NULL;       /* Object location for mount points */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /*
+     * The loop is necessary because we might have file1 mounted at the root
+     * of file2, which is mounted somewhere in file3.
+     */
+    do {
+	/*
+	 * Use a binary search to find the potential mount point in the mount
+	 * table for the parent
+	 */
+	lt = 0;
+	rt = parent->shared->mtab.nmounts;
+	cmp = -1;
+	while(lt < rt && cmp) {
+	    md = (lt + rt) / 2;
+	    mnt_oloc = H5G_oloc(parent->shared->mtab.child[md].group);
+	    cmp = H5F_addr_cmp(oloc->addr, mnt_oloc->addr);
+	    if(cmp < 0)
+		rt = md;
+	    else
+		lt = md + 1;
+	} /* end while */
+
+        /* Copy root info over to ENT */
+        if(0 == cmp) {
+            /* Get the child file */
+            child = parent->shared->mtab.child[md].file;
+
+            /* Get the location for the root group in the child's file */
+            mnt_oloc = H5G_oloc(child->shared->root_grp);
+
+            /* Release the mount point */
+            if(H5O_loc_free(oloc) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to free object location")
+
+            /* Copy the entry for the root group */
+            if(H5O_loc_copy(oloc, mnt_oloc, H5_COPY_DEEP) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy object location")
+
+            /* In case the shared root group info points to a different file handle
+             * than the child, modify oloc */
+            oloc->file = child;
+
+            /* Switch to child's file */
+            parent = child;
+        } /* end if */
+    } while(!cmp);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_traverse_mount() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fmpi.c b/gatb-core/thirdparty/hdf5/src/H5Fmpi.c
new file mode 100644
index 0000000..39b8dfa
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fmpi.c
@@ -0,0 +1,262 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Fmpi.c
+ *                      Jan 10 2008
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             MPI-related routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mpi_get_rank
+ *
+ * Purpose:	Retrieves the rank of an MPI process.
+ *
+ * Return:	Success:	The rank (non-negative)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5F_mpi_get_rank(const H5F_t *f)
+{
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f && f->shared);
+
+    /* Dispatch to driver */
+    if ((ret_value=H5FD_mpi_get_rank(f->shared->lf)) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_rank request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_mpi_get_rank() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mpi_get_comm
+ *
+ * Purpose:	Retrieves the file's communicator
+ *
+ * Return:	Success:	The communicator (non-negative)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, January 30, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+MPI_Comm
+H5F_mpi_get_comm(const H5F_t *f)
+{
+    MPI_Comm	ret_value;
+
+    FUNC_ENTER_NOAPI(MPI_COMM_NULL)
+
+    HDassert(f && f->shared);
+
+    /* Dispatch to driver */
+    if ((ret_value=H5FD_mpi_get_comm(f->shared->lf))==MPI_COMM_NULL)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, "driver get_comm request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_mpi_get_comm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_mpi_get_size
+ *
+ * Purpose:     Retrieves the size of an MPI process.
+ *
+ * Return:      Success:        The size (positive)
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  John Mainzer
+ *              Friday, May 6, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5F_mpi_get_size(const H5F_t *f)
+{
+    int ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f && f->shared);
+
+    /* Dispatch to driver */
+    if ((ret_value=H5FD_mpi_get_size(f->shared->lf)) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_size request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_mpi_get_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fset_mpi_atomicity
+ *
+ * Purpose:	Sets the atomicity mode
+ *
+ * Return:	Success:	Non-negative
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		Feb 14, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag)
+{
+    H5F_t       *file;
+    herr_t       ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ib", file_id, flag);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Check VFD */
+    if(!H5F_HAS_FEATURE(file, H5FD_FEAT_HAS_MPI))
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "incorrect VFL driver, does not support MPI atomicity mode")
+
+    /* set atomicity value */
+    if (H5FD_set_mpio_atomicity (file->shared->lf, flag) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set atomicity flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fget_mpi_atomicity
+ *
+ * Purpose:	Returns the atomicity mode
+ *
+ * Return:	Success:	Non-negative
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Mohamad Chaarawi
+ *		Feb 14, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mpi_atomicity(hid_t file_id, hbool_t *flag)
+{
+    H5F_t      *file;
+    herr_t     ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*b", file_id, flag);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Check VFD */
+    if(!H5F_HAS_FEATURE(file, H5FD_FEAT_HAS_MPI))
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "incorrect VFL driver, does not support MPI atomicity mode")
+
+    /* get atomicity value */
+    if (H5FD_get_mpio_atomicity (file->shared->lf, flag) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get atomicity flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fpkg.h b/gatb-core/thirdparty/hdf5/src/H5Fpkg.h
new file mode 100644
index 0000000..21034d7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fpkg.h
@@ -0,0 +1,348 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Thursday, September 28, 2000
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5F package.  Source files outside the H5F package should
+ *		include H5Fprivate.h instead.
+ */
+#ifndef H5F_PACKAGE
+#error "Do not include this file outside the H5F package!"
+#endif
+
+#ifndef _H5Fpkg_H
+#define _H5Fpkg_H
+
+/* Get package's private header */
+#include "H5Fprivate.h"
+
+/* Other public headers needed by this file */
+#include "H5Bpublic.h"          /* B-tree header, for H5B_NUM_BTREE_ID */
+
+/* Other private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5FSprivate.h"	/* File free space                      */
+#include "H5Gprivate.h"		/* Groups 			  	*/
+#include "H5Oprivate.h"         /* Object header messages               */
+#include "H5RCprivate.h"	/* Reference counted object functions	*/
+
+
+/*
+ * Feature: Define this constant on the compiler command-line if you want to
+ *	    see some debugging messages on the debug stream.
+ */
+#ifdef NDEBUG
+#  undef H5F_DEBUG
+#endif
+
+/* Superblock status flags */
+#define H5F_SUPER_WRITE_ACCESS          0x01
+#define H5F_SUPER_FILE_OK               0x02
+#define H5F_SUPER_ALL_FLAGS             (H5F_SUPER_WRITE_ACCESS | H5F_SUPER_FILE_OK)
+
+/* Mask for removing private file access flags */
+#define H5F_ACC_PUBLIC_FLAGS 	        0x001fu
+
+/* Free space section+aggregator merge flags */
+#define H5F_FS_MERGE_METADATA           0x01    /* Section can merge with metadata aggregator */
+#define H5F_FS_MERGE_RAWDATA            0x02    /* Section can merge with small 'raw' data aggregator */
+
+/* Macro to abstract checking whether file is using a free space manager */
+#define H5F_HAVE_FREE_SPACE_MANAGER(F)  TRUE    /* Currently always have a free space manager */
+
+/* Macros for encoding/decoding superblock */
+#define H5F_MAX_DRVINFOBLOCK_SIZE  1024         /* Maximum size of superblock driver info buffer */
+#define H5F_DRVINFOBLOCK_HDR_SIZE 16            /* Size of superblock driver info header */
+
+/* Superblock sizes for various versions */
+#define H5F_SIZEOF_CHKSUM 4     /* Checksum size in the file */
+
+/* Fixed-size portion at the beginning of all superblocks */
+#define H5F_SUPERBLOCK_FIXED_SIZE ( H5F_SIGNATURE_LEN                   \
+        + 1) /* superblock version */
+
+/* Macros for computing variable-size superblock size */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_COMMON                               \
+        (2  /* freespace, and root group versions */			\
+        + 1 /* reserved */                                              \
+        + 3 /* shared header vers, size of address, size of lengths */  \
+        + 1 /* reserved */                                              \
+        + 4 /* group leaf k, group internal k */                        \
+        + 4) /* consistency flags */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V0(f)                                \
+        ( H5F_SUPERBLOCK_VARLEN_SIZE_COMMON /* Common variable-length info */ \
+        + H5F_SIZEOF_ADDR(f) /* base address */                         \
+        + H5F_SIZEOF_ADDR(f) /* <unused> */				\
+        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
+        + H5F_SIZEOF_ADDR(f) /* driver block address */                 \
+        + H5G_SIZEOF_ENTRY(f)) /* root group ptr */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V1(f)                                \
+        ( H5F_SUPERBLOCK_VARLEN_SIZE_COMMON /* Common variable-length info */ \
+        + 2 /* indexed B-tree internal k */                             \
+        + 2 /* reserved */                                              \
+        + H5F_SIZEOF_ADDR(f) /* base address */                         \
+        + H5F_SIZEOF_ADDR(f) /* <unused> */				\
+        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
+        + H5F_SIZEOF_ADDR(f) /* driver block address */                 \
+        + H5G_SIZEOF_ENTRY(f)) /* root group ptr */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V2(f)                                \
+        ( 2 /* size of address, size of lengths */                      \
+        + 1 /* consistency flags */                                     \
+        + H5F_SIZEOF_ADDR(f) /* base address */                         \
+        + H5F_SIZEOF_ADDR(f) /* superblock extension address */         \
+        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
+        + H5F_SIZEOF_ADDR(f) /* root group object header address */     \
+        + H5F_SIZEOF_CHKSUM) /* superblock checksum (keep this last) */
+#define H5F_SUPERBLOCK_VARLEN_SIZE(v, f) (				\
+        (v == 0 ? H5F_SUPERBLOCK_VARLEN_SIZE_V0(f) : 0)			\
+        + (v == 1 ? H5F_SUPERBLOCK_VARLEN_SIZE_V1(f) : 0)               \
+        + (v == 2 ? H5F_SUPERBLOCK_VARLEN_SIZE_V2(f) : 0))
+
+/* Total size of superblock, depends on superblock version */
+#define H5F_SUPERBLOCK_SIZE(v, f) ( H5F_SUPERBLOCK_FIXED_SIZE           \
+        + H5F_SUPERBLOCK_VARLEN_SIZE(v, f))
+
+
+/* Forward declaration external file cache struct used below (defined in
+ * H5Fefc.c) */
+typedef struct H5F_efc_t H5F_efc_t;
+
+/* Structure for metadata & "small [raw] data" block aggregation fields */
+struct H5F_blk_aggr_t {
+    unsigned long       feature_flag;   /* Feature flag type */
+    hsize_t             alloc_size;     /* Size for allocating new blocks */
+    hsize_t             tot_size;       /* Total amount of bytes aggregated into block */
+    hsize_t             size;           /* Current size of block left */
+    haddr_t             addr;           /* Location of block left */
+};
+
+/* Structure for metadata accumulator fields */
+typedef struct H5F_meta_accum_t {
+    unsigned char      *buf;            /* Buffer to hold the accumulated metadata */
+    haddr_t             loc;            /* File location (offset) of the accumulated metadata */
+    size_t              size;           /* Size of the accumulated metadata buffer used (in bytes) */
+    size_t              alloc_size;     /* Size of the accumulated metadata buffer allocated (in bytes) */
+    size_t              dirty_off;      /* Offset of the dirty region in the accumulator buffer */
+    size_t              dirty_len;      /* Length of the dirty region in the accumulator buffer */
+    hbool_t             dirty;          /* Flag to indicate that the accumulated metadata is dirty */
+} H5F_meta_accum_t;
+
+/* Enum for free space manager state */
+typedef enum H5F_fs_state_t {
+    H5F_FS_STATE_CLOSED,                /* Free space manager is closed */
+    H5F_FS_STATE_OPEN,                  /* Free space manager has been opened */
+    H5F_FS_STATE_DELETING               /* Free space manager is being deleted */
+} H5F_fs_state_t;
+
+/* A record of the mount table */
+typedef struct H5F_mount_t {
+    struct H5G_t	*group;	/* Mount point group held open		*/
+    struct H5F_t	*file;	/* File mounted at that point		*/
+} H5F_mount_t;
+
+/*
+ * The mount table describes what files are attached to (mounted on) the file
+ * to which this table belongs.
+ */
+typedef struct H5F_mtab_t {
+    unsigned		nmounts;/* Number of children which are mounted	*/
+    unsigned		nalloc;	/* Number of mount slots allocated	*/
+    H5F_mount_t		*child;	/* An array of mount records		*/
+} H5F_mtab_t;
+
+/* Structure specifically to store superblock. This was originally
+ * maintained entirely within H5F_file_t, but is now extracted
+ * here because the superblock is now handled by the cache */
+typedef struct H5F_super_t {
+    H5AC_info_t cache_info;     /* Cache entry information structure          */
+    unsigned    super_vers;     /* Superblock version                         */
+    uint8_t     status_flags;   /* File status flags                          */
+    unsigned    sym_leaf_k;     /* Size of leaves in symbol tables            */
+    unsigned    btree_k[H5B_NUM_BTREE_ID]; /* B-tree key values for each type */
+    haddr_t     base_addr;      /* Absolute base address for rel.addrs.       */
+                                /* (superblock for file is at this offset)    */
+    haddr_t     ext_addr;       /* Relative address of superblock extension   */
+    haddr_t     driver_addr;    /* File driver information block address      */
+    haddr_t     root_addr;      /* Root group address                         */
+    H5G_entry_t *root_ent;      /* Root group symbol table entry              */
+} H5F_super_t;
+
+/*
+ * Define the structure to store the file information for HDF5 files. One of
+ * these structures is allocated per file, not per H5Fopen(). That is, set of
+ * H5F_t structs can all point to the same H5F_file_t struct. The `nrefs'
+ * count in this struct indicates the number of H5F_t structs which are
+ * pointing to this struct.
+ */
+struct H5F_file_t {
+    H5FD_t	*lf; 		/* Lower level file handle for I/O	*/
+    H5F_super_t *sblock;        /* Pointer to (pinned) superblock for file */
+    unsigned	nrefs;		/* Ref count for times file is opened	*/
+    unsigned	flags;		/* Access Permissions for file          */
+    H5F_mtab_t	mtab;		/* File mount table                     */
+    H5F_efc_t   *efc;           /* External file cache                  */
+
+    /* Cached values from FCPL/superblock */
+    uint8_t	sizeof_addr;	/* Size of addresses in file            */
+    uint8_t	sizeof_size;	/* Size of offsets in file              */
+    haddr_t	sohm_addr;	/* Relative address of shared object header message table */
+    unsigned	sohm_vers;	/* Version of shared message table on disk */
+    unsigned	sohm_nindexes;	/* Number of shared messages indexes in the table */
+    unsigned long feature_flags; /* VFL Driver feature Flags            */
+    haddr_t	maxaddr;	/* Maximum address for file             */
+
+    H5AC_t      *cache;		/* The object cache	 		*/
+    H5AC_cache_config_t
+		mdc_initCacheCfg; /* initial configuration for the      */
+                                /* metadata cache.  This structure is   */
+                                /* fixed at creation time and should    */
+                                /* not change thereafter.               */
+    hid_t       fcpl_id;	/* File creation property list ID 	*/
+    H5F_close_degree_t fc_degree;   /* File close behavior degree	*/
+    size_t	rdcc_nslots;	/* Size of raw data chunk cache (slots)	*/
+    size_t	rdcc_nbytes;	/* Size of raw data chunk cache	(bytes)	*/
+    double	rdcc_w0;	/* Preempt read chunks first? [0.0..1.0]*/
+    size_t      sieve_buf_size; /* Size of the data sieve buffer allocated (in bytes) */
+    hsize_t	threshold;	/* Threshold for alignment		*/
+    hsize_t	alignment;	/* Alignment				*/
+    unsigned	gc_ref;		/* Garbage-collect references?		*/
+    hbool_t	latest_format;	/* Always use the latest format?	*/
+    hbool_t	store_msg_crt_idx;  /* Store creation index for object header messages?	*/
+    unsigned	ncwfs;		/* Num entries on cwfs list		*/
+    struct H5HG_heap_t **cwfs;	/* Global heap cache			*/
+    struct H5G_t *root_grp;	/* Open root group			*/
+    H5FO_t *open_objs;          /* Open objects in file                 */
+    H5RC_t *grp_btree_shared;   /* Ref-counted group B-tree node info   */
+
+    /* File space allocation information */
+    hbool_t     use_tmp_space;  /* Whether temp. file space allocation is allowed */
+    haddr_t	tmp_addr;       /* Next address to use for temp. space in the file */
+    unsigned fs_aggr_merge[H5FD_MEM_NTYPES];    /* Flags for whether free space can merge with aggregator(s) */
+    H5F_fs_state_t fs_state[H5FD_MEM_NTYPES];   /* State of free space manager for each type */
+    haddr_t fs_addr[H5FD_MEM_NTYPES];   /* Address of free space manager info for each type */
+    H5FS_t *fs_man[H5FD_MEM_NTYPES];    /* Free space manager for each file space type */
+    H5FD_mem_t fs_type_map[H5FD_MEM_NTYPES]; /* Mapping of "real" file space type into tracked type */
+    H5F_blk_aggr_t meta_aggr;   /* Metadata aggregation info */
+                                /* (if aggregating metadata allocations) */
+    H5F_blk_aggr_t sdata_aggr;  /* "Small data" aggregation info */
+                                /* (if aggregating "small data" allocations) */
+
+    /* Metadata accumulator information */
+    H5F_meta_accum_t accum;     /* Metadata accumulator info           	*/
+};
+
+/*
+ * This is the top-level file descriptor.  One of these structures is
+ * allocated every time H5Fopen() is called although they may contain pointers
+ * to shared H5F_file_t structs.
+ */
+struct H5F_t {
+    char		*open_name;	/* Name used to open file	*/
+    char		*actual_name;	/* Actual name of the file, after resolving symlinks, etc. */
+    char               	*extpath;       /* Path for searching target external link file */
+    H5F_file_t		*shared;	/* The shared file info		*/
+    unsigned		nopen_objs;	/* Number of open object headers*/
+    H5FO_t              *obj_count;     /* # of time each object is opened through top file structure */
+    hid_t               file_id;        /* ID of this file              */
+    hbool_t             closing;        /* File is in the process of being closed */
+    struct H5F_t        *parent;        /* Parent file that this file is mounted to */
+    unsigned            nmounts;        /* Number of children mounted to this file */
+};
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* Declare a free list to manage the H5F_t struct */
+H5FL_EXTERN(H5F_t);
+
+/* Declare a free list to manage the H5F_file_t struct */
+H5FL_EXTERN(H5F_file_t);
+
+H5_DLLVAR const H5AC_class_t H5AC_SUPERBLOCK[1];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* General routines */
+H5_DLL herr_t H5F_init(void);
+H5_DLL herr_t H5F__term_deprec_interface(void);
+H5F_t *H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id,
+    hid_t fapl_id, H5FD_t *lf);
+herr_t H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush);
+H5_DLL herr_t H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing);
+H5_DLL htri_t H5F_is_hdf5(const char *name);
+H5_DLL herr_t H5F_get_objects(const H5F_t *f, unsigned types, size_t max_index, hid_t *obj_id_list, hbool_t app_ref, size_t *obj_id_count_ptr);
+H5_DLL herr_t H5F_close(H5F_t *f);
+
+/* File mount related routines */
+H5_DLL herr_t H5F_close_mounts(H5F_t *f);
+H5_DLL int H5F_term_unmount_cb(void *obj_ptr, hid_t obj_id, void *key);
+H5_DLL herr_t H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs);
+
+/* Superblock related routines */
+H5_DLL herr_t H5F_super_init(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5F_super_read(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size,
+    hsize_t *super_ext_info);
+H5_DLL herr_t H5F_super_free(H5F_super_t *sblock);
+
+/* Superblock extension related routines */
+H5_DLL herr_t H5F_super_ext_open(H5F_t *f, haddr_t ext_addr, H5O_loc_t *ext_ptr);
+H5_DLL herr_t H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_t may_create);
+H5_DLL herr_t H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
+    hbool_t was_created);
+
+/* Metadata accumulator routines */
+H5_DLL herr_t H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+    haddr_t addr, size_t size, void *buf);
+H5_DLL herr_t H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+    haddr_t addr, size_t size, const void *buf);
+H5_DLL herr_t H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+    haddr_t addr, hsize_t size);
+H5_DLL herr_t H5F__accum_flush(const H5F_io_info_t *fio_info);
+H5_DLL herr_t H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush);
+
+/* Shared file list related routines */
+H5_DLL herr_t H5F_sfile_add(H5F_file_t *shared);
+H5_DLL H5F_file_t * H5F_sfile_search(H5FD_t *lf);
+H5_DLL herr_t H5F_sfile_remove(H5F_file_t *shared);
+
+/* External file cache routines */
+H5_DLL H5F_efc_t *H5F_efc_create(unsigned max_nfiles);
+H5_DLL unsigned H5F_efc_max_nfiles(H5F_efc_t *efc);
+H5_DLL herr_t H5F_efc_release(H5F_efc_t *efc);
+H5_DLL herr_t H5F_efc_destroy(H5F_efc_t *efc);
+H5_DLL herr_t H5F_efc_try_close(H5F_t *f);
+
+/* Testing functions */
+#ifdef H5F_TESTING
+H5_DLL herr_t H5F_get_sohm_mesg_count_test(hid_t fid, unsigned type_id,
+    size_t *mesg_count);
+H5_DLL herr_t H5F_check_cached_stab_test(hid_t file_id);
+H5_DLL herr_t H5F_get_maxaddr_test(hid_t file_id, haddr_t *maxaddr);
+#endif /* H5F_TESTING */
+
+#endif /* _H5Fpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fprivate.h b/gatb-core/thirdparty/hdf5/src/H5Fprivate.h
new file mode 100644
index 0000000..d8014c1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fprivate.h
@@ -0,0 +1,631 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains macros & information for file access
+ */
+
+#ifndef _H5Fprivate_H
+#define _H5Fprivate_H
+
+/* Include package's public header */
+#include "H5Fpublic.h"
+
+/* Public headers needed by this file */
+#include "H5FDpublic.h"		/* File drivers				*/
+
+/* Private headers needed by this file */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/*
+ * Encode and decode macros for file meta-data.
+ * Currently, all file meta-data is little-endian.
+ */
+
+#  define INT16ENCODE(p, i) {						      \
+   *(p) = (uint8_t)( (unsigned)(i)	 & 0xff); (p)++;		      \
+   *(p) = (uint8_t)(((unsigned)(i) >> 8) & 0xff); (p)++;		      \
+}
+
+#  define UINT16ENCODE(p, i) {						      \
+   *(p) = (uint8_t)( (unsigned)(i)	 & 0xff); (p)++;		      \
+   *(p) = (uint8_t)(((unsigned)(i) >> 8) & 0xff); (p)++;		      \
+}
+
+#  define INT32ENCODE(p, i) {						      \
+   *(p) = (uint8_t)( (uint32_t)(i)	  & 0xff); (p)++;		      \
+   *(p) = (uint8_t)(((uint32_t)(i) >>  8) & 0xff); (p)++;		      \
+   *(p) = (uint8_t)(((uint32_t)(i) >> 16) & 0xff); (p)++;		      \
+   *(p) = (uint8_t)(((uint32_t)(i) >> 24) & 0xff); (p)++;		      \
+}
+
+#  define UINT32ENCODE(p, i) {						      \
+   *(p) = (uint8_t)( (i)        & 0xff); (p)++;				      \
+   *(p) = (uint8_t)(((i) >>  8) & 0xff); (p)++;				      \
+   *(p) = (uint8_t)(((i) >> 16) & 0xff); (p)++;				      \
+   *(p) = (uint8_t)(((i) >> 24) & 0xff); (p)++;				      \
+}
+
+/* Encode an unsigned integer into a variable-sized buffer */
+/* (Assumes that the high bits of the integer are zero) */
+#  define ENCODE_VAR(p, typ, n, l) {					      \
+   typ _n = (n);							      \
+   size_t _i;								      \
+   uint8_t *_p = (uint8_t*)(p);						      \
+									      \
+   for(_i = 0; _i < l; _i++, _n >>= 8)					      \
+      *_p++ = (uint8_t)(_n & 0xff);					      \
+   (p) = (uint8_t*)(p) + l;						      \
+}
+
+/* Encode a 32-bit unsigned integer into a variable-sized buffer */
+/* (Assumes that the high bits of the integer are zero) */
+#  define UINT32ENCODE_VAR(p, n, l)     ENCODE_VAR(p, uint32_t, n, l)
+
+#  define INT64ENCODE(p, n) {						      \
+   int64_t _n = (n);							      \
+   size_t _i;								      \
+   uint8_t *_p = (uint8_t*)(p);						      \
+									      \
+   for (_i = 0; _i < sizeof(int64_t); _i++, _n >>= 8)			      \
+      *_p++ = (uint8_t)(_n & 0xff);					      \
+   for (/*void*/; _i < 8; _i++)						      \
+      *_p++ = (n) < 0 ? 0xff : 0;					      \
+   (p) = (uint8_t*)(p)+8;						      \
+}
+
+#  define UINT64ENCODE(p, n) {						      \
+   uint64_t _n = (n);							      \
+   size_t _i;								      \
+   uint8_t *_p = (uint8_t*)(p);						      \
+									      \
+   for (_i = 0; _i < sizeof(uint64_t); _i++, _n >>= 8)			      \
+      *_p++ = (uint8_t)(_n & 0xff);					      \
+   for (/*void*/; _i < 8; _i++)						      \
+      *_p++ = 0;							      \
+   (p) = (uint8_t*)(p) + 8;						      \
+}
+
+/* Encode a 64-bit unsigned integer into a variable-sized buffer */
+/* (Assumes that the high bits of the integer are zero) */
+#  define UINT64ENCODE_VAR(p, n, l)     ENCODE_VAR(p, uint64_t, n, l)
+
+/* DECODE converts little endian bytes pointed by p to integer values and store
+ * it in i.  For signed values, need to do sign-extension when converting
+ * the last byte which carries the sign bit.
+ * The macros does not require i be of a certain byte sizes.  It just requires
+ * i be big enough to hold the intended value range.  E.g. INT16DECODE works
+ * correctly even if i is actually a 64bit int like in a Cray.
+ */
+
+#  define INT16DECODE(p, i) {						      \
+   (i)	= (int16_t)((*(p) & 0xff));      (p)++;				      \
+   (i) |= (int16_t)(((*(p) & 0xff) << 8) |                                    \
+                   ((*(p) & 0x80) ? ~0xffff : 0x0)); (p)++;		      \
+}
+
+#  define UINT16DECODE(p, i) {						      \
+   (i)	= (uint16_t) (*(p) & 0xff);	  (p)++;			      \
+   (i) |= (uint16_t)((*(p) & 0xff) << 8); (p)++;			      \
+}
+
+#  define INT32DECODE(p, i) {						      \
+   (i)	= (	     *(p) & 0xff);	  (p)++;			      \
+   (i) |= ((int32_t)(*(p) & 0xff) <<  8); (p)++;			      \
+   (i) |= ((int32_t)(*(p) & 0xff) << 16); (p)++;			      \
+   (i) |= ((int32_t)(((*(p) & 0xff) << 24) |                                  \
+                   ((*(p) & 0x80) ? ~0xffffffff : 0x0))); (p)++;	      \
+}
+
+#  define UINT32DECODE(p, i) {						      \
+   (i)	=  (uint32_t)(*(p) & 0xff);	   (p)++;			      \
+   (i) |= ((uint32_t)(*(p) & 0xff) <<  8); (p)++;			      \
+   (i) |= ((uint32_t)(*(p) & 0xff) << 16); (p)++;			      \
+   (i) |= ((uint32_t)(*(p) & 0xff) << 24); (p)++;			      \
+}
+
+/* Decode a variable-sized buffer */
+/* (Assumes that the high bits of the integer will be zero) */
+#  define DECODE_VAR(p, n, l) {						      \
+   size_t _i;								      \
+									      \
+   n = 0;								      \
+   (p) += l;								      \
+   for (_i = 0; _i < l; _i++)						      \
+      n = (n << 8) | *(--p);						      \
+   (p) += l;								      \
+}
+
+/* Decode a variable-sized buffer into a 32-bit unsigned integer */
+/* (Assumes that the high bits of the integer will be zero) */
+#  define UINT32DECODE_VAR(p, n, l)     DECODE_VAR(p, n, l)
+
+#  define INT64DECODE(p, n) {						      \
+   /* WE DON'T CHECK FOR OVERFLOW! */					      \
+   size_t _i;								      \
+									      \
+   n = 0;								      \
+   (p) += 8;								      \
+   for (_i = 0; _i < sizeof(int64_t); _i++)					      \
+      n = (n << 8) | *(--p);						      \
+   (p) += 8;								      \
+}
+
+#  define UINT64DECODE(p, n) {						      \
+   /* WE DON'T CHECK FOR OVERFLOW! */					      \
+   size_t _i;								      \
+									      \
+   n = 0;								      \
+   (p) += 8;								      \
+   for (_i = 0; _i < sizeof(uint64_t); _i++)				      \
+      n = (n << 8) | *(--p);						      \
+   (p) += 8;								      \
+}
+
+/* Decode a variable-sized buffer into a 64-bit unsigned integer */
+/* (Assumes that the high bits of the integer will be zero) */
+#  define UINT64DECODE_VAR(p, n, l)     DECODE_VAR(p, n, l)
+
+/* Address-related macros */
+#define H5F_addr_overflow(X,Z)	(HADDR_UNDEF==(X) ||			      \
+				 HADDR_UNDEF==(X)+(haddr_t)(Z) ||	      \
+				 (X)+(haddr_t)(Z)<(X))
+#define H5F_addr_hash(X,M)	((unsigned)((X)%(M)))
+#define H5F_addr_defined(X)	((X)!=HADDR_UNDEF)
+/* The H5F_addr_eq() macro guarantees that Y is not HADDR_UNDEF by making
+ * certain that X is not HADDR_UNDEF and then checking that X equals Y
+ */
+#define H5F_addr_eq(X,Y)	((X)!=HADDR_UNDEF &&			      \
+				 (X)==(Y))
+#define H5F_addr_ne(X,Y)	(!H5F_addr_eq((X),(Y)))
+#define H5F_addr_lt(X,Y) 	((X)!=HADDR_UNDEF &&			      \
+				 (Y)!=HADDR_UNDEF &&			      \
+				 (X)<(Y))
+#define H5F_addr_le(X,Y)	((X)!=HADDR_UNDEF &&			      \
+				 (Y)!=HADDR_UNDEF &&			      \
+				 (X)<=(Y))
+#define H5F_addr_gt(X,Y)	((X)!=HADDR_UNDEF &&			      \
+				 (Y)!=HADDR_UNDEF &&			      \
+				 (X)>(Y))
+#define H5F_addr_ge(X,Y)	((X)!=HADDR_UNDEF &&			      \
+				 (Y)!=HADDR_UNDEF &&			      \
+				 (X)>=(Y))
+#define H5F_addr_cmp(X,Y)	(H5F_addr_eq((X), (Y)) ? 0 :		      \
+				 (H5F_addr_lt((X), (Y)) ? -1 : 1))
+#define H5F_addr_pow2(N)	((haddr_t)1<<(N))
+#define H5F_addr_overlap(O1,L1,O2,L2) (((O1) < (O2) && ((O1) + (L1)) > (O2)) || \
+                                 ((O1) >= (O2) && (O1) < ((O2) + (L2))))
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5F_PACKAGE
+#define H5F_INTENT(F)           ((F)->shared->flags)
+#define H5F_OPEN_NAME(F)        ((F)->open_name)
+#define H5F_ACTUAL_NAME(F)      ((F)->actual_name)
+#define H5F_EXTPATH(F)          ((F)->extpath)
+#define H5F_SHARED(F)           ((F)->shared)
+#define H5F_SAME_SHARED(F1, F2) ((F1)->shared == (F2)->shared))
+#define H5F_NOPEN_OBJS(F)       ((F)->nopen_objs)
+#define H5F_INCR_NOPEN_OBJS(F)  ((F)->nopen_objs++)
+#define H5F_DECR_NOPEN_OBJS(F)  ((F)->nopen_objs--)
+#define H5F_FILE_ID(F)          ((F)->file_id)
+#define H5F_PARENT(F)           ((F)->parent)
+#define H5F_NMOUNTS(F)          ((F)->nmounts)
+#define H5F_DRIVER_ID(F)        ((F)->shared->lf->driver_id)
+#define H5F_GET_FILENO(F,FILENUM) ((FILENUM) = (F)->shared->lf->fileno)
+#define H5F_HAS_FEATURE(F,FL)   ((F)->shared->lf->feature_flags & (FL))
+#define H5F_BASE_ADDR(F)        ((F)->shared->sblock->base_addr)
+#define H5F_SYM_LEAF_K(F)       ((F)->shared->sblock->sym_leaf_k)
+#define H5F_KVALUE(F,T)         ((F)->shared->sblock->btree_k[(T)->id])
+#define H5F_NREFS(F)		((F)->shared->nrefs)
+#define H5F_SIZEOF_ADDR(F)      ((F)->shared->sizeof_addr)
+#define H5F_SIZEOF_SIZE(F)      ((F)->shared->sizeof_size)
+#define H5F_SOHM_ADDR(F)        ((F)->shared->sohm_addr)
+#define H5F_SET_SOHM_ADDR(F, A) ((F)->shared->sohm_addr = (A))
+#define H5F_SOHM_VERS(F)        ((F)->shared->sohm_vers)
+#define H5F_SET_SOHM_VERS(F, V) ((F)->shared->sohm_vers = (V))
+#define H5F_SOHM_NINDEXES(F)    ((F)->shared->sohm_nindexes)
+#define H5F_SET_SOHM_NINDEXES(F, N) ((F)->shared->sohm_nindexes = (N))
+#define H5F_FCPL(F)             ((F)->shared->fcpl_id)
+#define H5F_GET_FC_DEGREE(F)    ((F)->shared->fc_degree)
+#define H5F_RDCC_NSLOTS(F)      ((F)->shared->rdcc_nslots)
+#define H5F_RDCC_NBYTES(F)      ((F)->shared->rdcc_nbytes)
+#define H5F_RDCC_W0(F)          ((F)->shared->rdcc_w0)
+#define H5F_SIEVE_BUF_SIZE(F)   ((F)->shared->sieve_buf_size)
+#define H5F_GC_REF(F)           ((F)->shared->gc_ref)
+#define H5F_USE_LATEST_FORMAT(F) ((F)->shared->latest_format)
+#define H5F_STORE_MSG_CRT_IDX(F)    ((F)->shared->store_msg_crt_idx)
+#define H5F_SET_STORE_MSG_CRT_IDX(F, FL)    ((F)->shared->store_msg_crt_idx = (FL))
+#define H5F_GRP_BTREE_SHARED(F) ((F)->shared->grp_btree_shared)
+#define H5F_SET_GRP_BTREE_SHARED(F, RC) (((F)->shared->grp_btree_shared = (RC)) ? SUCCEED : FAIL)
+#define H5F_USE_TMP_SPACE(F)    ((F)->shared->use_tmp_space)
+#define H5F_IS_TMP_ADDR(F, ADDR) (H5F_addr_le((F)->shared->tmp_addr, (ADDR)))
+#else /* H5F_PACKAGE */
+#define H5F_INTENT(F)           (H5F_get_intent(F))
+#define H5F_OPEN_NAME(F)        (H5F_get_open_name(F))
+#define H5F_ACTUAL_NAME(F)      (H5F_get_actual_name(F))
+#define H5F_EXTPATH(F)          (H5F_get_extpath(F))
+#define H5F_SHARED(F)           (H5F_get_shared(F))
+#define H5F_SAME_SHARED(F1, F2) (H5F_same_shared((F1), (F2)))
+#define H5F_NOPEN_OBJS(F)       (H5F_get_nopen_objs(F))
+#define H5F_INCR_NOPEN_OBJS(F)  (H5F_incr_nopen_objs(F))
+#define H5F_DECR_NOPEN_OBJS(F)  (H5F_decr_nopen_objs(F))
+#define H5F_FILE_ID(F)          (H5F_get_file_id(F))
+#define H5F_PARENT(F)           (H5F_get_parent(F))
+#define H5F_NMOUNTS(F)          (H5F_get_nmounts(F))
+#define H5F_DRIVER_ID(F)        (H5F_get_driver_id(F))
+#define H5F_GET_FILENO(F,FILENUM) (H5F_get_fileno((F), &(FILENUM)))
+#define H5F_HAS_FEATURE(F,FL)   (H5F_has_feature(F,FL))
+#define H5F_BASE_ADDR(F)        (H5F_get_base_addr(F))
+#define H5F_SYM_LEAF_K(F)       (H5F_sym_leaf_k(F))
+#define H5F_KVALUE(F,T)         (H5F_Kvalue(F,T))
+#define H5F_NREFS(F)		(H5F_get_nrefs(F))
+#define H5F_SIZEOF_ADDR(F)      (H5F_sizeof_addr(F))
+#define H5F_SIZEOF_SIZE(F)      (H5F_sizeof_size(F))
+#define H5F_SOHM_ADDR(F)        (H5F_get_sohm_addr(F))
+#define H5F_SET_SOHM_ADDR(F, A) (H5F_set_sohm_addr((F), (A)))
+#define H5F_SOHM_VERS(F)        (H5F_get_sohm_vers(F))
+#define H5F_SET_SOHM_VERS(F, V) (H5F_set_sohm_vers((F), (V)))
+#define H5F_SOHM_NINDEXES(F)    (H5F_get_sohm_nindexes(F))
+#define H5F_SET_SOHM_NINDEXES(F, N) (H5F_set_sohm_nindexes((F), (N)))
+#define H5F_FCPL(F)             (H5F_get_fcpl(F))
+#define H5F_GET_FC_DEGREE(F)    (H5F_get_fc_degree(F))
+#define H5F_RDCC_NSLOTS(F)      (H5F_rdcc_nslots(F))
+#define H5F_RDCC_NBYTES(F)      (H5F_rdcc_nbytes(F))
+#define H5F_RDCC_W0(F)          (H5F_rdcc_w0(F))
+#define H5F_SIEVE_BUF_SIZE(F)   (H5F_sieve_buf_size(F))
+#define H5F_GC_REF(F)           (H5F_gc_ref(F))
+#define H5F_USE_LATEST_FORMAT(F) (H5F_use_latest_format(F))
+#define H5F_STORE_MSG_CRT_IDX(F) (H5F_store_msg_crt_idx(F))
+#define H5F_SET_STORE_MSG_CRT_IDX(F, FL)    (H5F_set_store_msg_crt_idx((F), (FL)))
+#define H5F_GRP_BTREE_SHARED(F) (H5F_grp_btree_shared(F))
+#define H5F_SET_GRP_BTREE_SHARED(F, RC) (H5F_set_grp_btree_shared((F), (RC)))
+#define H5F_USE_TMP_SPACE(F)    (H5F_use_tmp_space(F))
+#define H5F_IS_TMP_ADDR(F, ADDR) (H5F_is_tmp_addr((F), (ADDR)))
+#endif /* H5F_PACKAGE */
+
+
+/* Macros to encode/decode offset/length's for storing in the file */
+#define H5F_ENCODE_OFFSET(f,p,o) switch(H5F_SIZEOF_ADDR(f)) {		      \
+    case 4: UINT32ENCODE(p,o); break;					      \
+    case 8: UINT64ENCODE(p,o); break;					      \
+    case 2: UINT16ENCODE(p,o); break;					      \
+}
+
+#define H5F_DECODE_OFFSET(f,p,o) switch (H5F_SIZEOF_ADDR (f)) {		      \
+    case 4: UINT32DECODE(p, o); break;					      \
+    case 8: UINT64DECODE(p, o); break;					      \
+    case 2: UINT16DECODE(p, o); break;					      \
+}
+
+#define H5F_ENCODE_LENGTH_LEN(p,l,s) switch(s) {		      	      \
+    case 4: UINT32ENCODE(p,l); break;					      \
+    case 8: UINT64ENCODE(p,l); break;					      \
+    case 2: UINT16ENCODE(p,l); break;					      \
+    default: HDassert("bad sizeof size" && 0);				      \
+}
+
+#define H5F_ENCODE_LENGTH(f,p,l) H5F_ENCODE_LENGTH_LEN(p,l,H5F_SIZEOF_SIZE(f))
+
+#define H5F_DECODE_LENGTH_LEN(p,l,s) switch(s) {		              \
+    case 4: UINT32DECODE(p,l); break;					      \
+    case 8: UINT64DECODE(p,l); break;					      \
+    case 2: UINT16DECODE(p,l); break;					      \
+    default: HDassert("bad sizeof size" && 0);				      \
+}
+
+#define H5F_DECODE_LENGTH(f,p,l) H5F_DECODE_LENGTH_LEN(p,l,H5F_SIZEOF_SIZE(f))
+
+/*
+ * Macros that check for overflows.  These are somewhat dangerous to fiddle
+ * with.
+ */
+#if (H5_SIZEOF_SIZE_T >= H5_SIZEOF_OFF_T)
+#   define H5F_OVERFLOW_SIZET2OFFT(X)					      \
+    ((size_t)(X)>=(size_t)((size_t)1<<(8*sizeof(off_t)-1)))
+#else
+#   define H5F_OVERFLOW_SIZET2OFFT(X) 0
+#endif
+#if (H5_SIZEOF_HSIZE_T >= H5_SIZEOF_OFF_T)
+#   define H5F_OVERFLOW_HSIZET2OFFT(X)					      \
+    ((hsize_t)(X)>=(hsize_t)((hsize_t)1<<(8*sizeof(off_t)-1)))
+#else
+#   define H5F_OVERFLOW_HSIZET2OFFT(X) 0
+#endif
+
+/* Sizes of object addresses & sizes in the file (in bytes) */
+#define H5F_OBJ_ADDR_SIZE   sizeof(haddr_t)
+#define H5F_OBJ_SIZE_SIZE   sizeof(hsize_t)
+
+/* File-wide default character encoding can not yet be set via the file
+ * creation property list and is always ASCII. */
+#define H5F_DEFAULT_CSET H5T_CSET_ASCII
+
+/* ========= File Creation properties ============ */
+#define H5F_CRT_USER_BLOCK_NAME      "block_size"       /* Size of the file user block in bytes */
+#define H5F_CRT_SYM_LEAF_NAME        "symbol_leaf"      /* 1/2 rank for symbol table leaf nodes */
+#define H5F_CRT_SYM_LEAF_DEF         4
+#define H5F_CRT_BTREE_RANK_NAME      "btree_rank"       /* 1/2 rank for btree internal nodes    */
+#define H5F_CRT_ADDR_BYTE_NUM_NAME   "addr_byte_num"    /* Byte number in an address            */
+#define H5F_CRT_OBJ_BYTE_NUM_NAME    "obj_byte_num"     /* Byte number for object size          */
+#define H5F_CRT_SUPER_VERS_NAME      "super_version"    /* Version number of the superblock     */
+#define H5F_CRT_SHMSG_NINDEXES_NAME  "num_shmsg_indexes" /* Number of shared object header message indexes */
+#define H5F_CRT_SHMSG_INDEX_TYPES_NAME "shmsg_message_types" /* Types of message in each index */
+#define H5F_CRT_SHMSG_INDEX_MINSIZE_NAME "shmsg_message_minsize" /* Minimum size of messages in each index */
+#define H5F_CRT_SHMSG_LIST_MAX_NAME  "shmsg_list_max"   /* Shared message list maximum size */
+#define H5F_CRT_SHMSG_BTREE_MIN_NAME "shmsg_btree_min"  /* Shared message B-tree minimum size */
+
+
+
+/* ========= File Access properties ============ */
+#define H5F_ACS_META_CACHE_INIT_CONFIG_NAME	"mdc_initCacheCfg" /* Initial metadata cache resize configuration */
+#define H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME       "rdcc_nslots"   /* Size of raw data chunk cache(slots) */
+#define H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME       "rdcc_nbytes"   /* Size of raw data chunk cache(bytes) */
+#define H5F_ACS_PREEMPT_READ_CHUNKS_NAME        "rdcc_w0"       /* Preemption read chunks first */
+#define H5F_ACS_ALIGN_THRHD_NAME                "threshold"     /* Threshold for alignment */
+#define H5F_ACS_ALIGN_NAME                      "align"         /* Alignment */
+#define H5F_ACS_META_BLOCK_SIZE_NAME            "meta_block_size" /* Minimum metadata allocation block size (when aggregating metadata allocations) */
+#define H5F_ACS_SIEVE_BUF_SIZE_NAME             "sieve_buf_size" /* Maximum sieve buffer size (when data sieving is allowed by file driver) */
+#define H5F_ACS_SDATA_BLOCK_SIZE_NAME           "sdata_block_size" /* Minimum "small data" allocation block size (when aggregating "small" raw data allocations) */
+#define H5F_ACS_GARBG_COLCT_REF_NAME            "gc_ref"        /* Garbage-collect references */
+#define H5F_ACS_FILE_DRV_ID_NAME                "driver_id"     /* File driver ID */
+#define H5F_ACS_FILE_DRV_INFO_NAME              "driver_info"   /* File driver info */
+#define H5F_ACS_CLOSE_DEGREE_NAME		"close_degree"  /* File close degree */
+#define H5F_ACS_FAMILY_OFFSET_NAME              "family_offset" /* Offset position in file for family file driver */
+#define H5F_ACS_FAMILY_NEWSIZE_NAME             "family_newsize" /* New member size of family driver.  (private property only used by h5repart) */
+#define H5F_ACS_FAMILY_TO_SEC2_NAME             "family_to_sec2" /* Whether to convert family to sec2 driver.  (private property only used by h5repart) */
+#define H5F_ACS_MULTI_TYPE_NAME                 "multi_type"    /* Data type in multi file driver */
+#define H5F_ACS_LATEST_FORMAT_NAME              "latest_format" /* 'Use latest format version' flag */
+#define H5F_ACS_WANT_POSIX_FD_NAME              "want_posix_fd" /* Internal: query the file descriptor from the core VFD, instead of the memory address */
+#define H5F_ACS_EFC_SIZE_NAME                   "efc_size"      /* Size of external file cache */
+#define H5F_ACS_FILE_IMAGE_INFO_NAME            "file_image_info" /* struct containing initial file image and callback info */
+#define H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME       "core_write_tracking_flag" /* Whether or not core VFD backing store write tracking is enabled */
+#define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME  "core_write_tracking_page_size" /* The page size in kiB when core VFD write tracking is enabled */
+
+/* ======================== File Mount properties ====================*/
+#define H5F_MNT_SYM_LOCAL_NAME 		"local"                 /* Whether absolute symlinks local to file. */
+
+
+#ifdef H5_HAVE_PARALLEL
+/* Which process writes metadata */
+#define H5_PAR_META_WRITE 0
+#endif /* H5_HAVE_PARALLEL */
+
+/* Define the HDF5 file signature */
+#define H5F_SIGNATURE	  "\211HDF\r\n\032\n"
+#define H5F_SIGNATURE_LEN 8
+
+/* Version #'s of the major components of the file format */
+#define HDF5_SUPERBLOCK_VERSION_DEF	0	/* The default super block format	  */
+#define HDF5_SUPERBLOCK_VERSION_1	1	/* Version with non-default B-tree 'K' value */
+#define HDF5_SUPERBLOCK_VERSION_2	2	/* Revised version with superblock extension and checksum */
+#define HDF5_SUPERBLOCK_VERSION_LATEST	HDF5_SUPERBLOCK_VERSION_2	/* The maximum super block format    */
+#define HDF5_FREESPACE_VERSION	        0	/* of the Free-Space Info	  */
+#define HDF5_OBJECTDIR_VERSION	        0	/* of the Object Directory format */
+#define HDF5_SHAREDHEADER_VERSION       0	/* of the Shared-Header Info	  */
+#define HDF5_DRIVERINFO_VERSION_0       0	/* of the Driver Information Block*/
+
+/* B-tree internal 'K' values */
+#define HDF5_BTREE_SNODE_IK_DEF         16
+#define HDF5_BTREE_CHUNK_IK_DEF         32      /* Note! this value is assumed
+                                                    to be 32 for version 0
+                                                    of the superblock and
+                                                    if it is changed, the code
+                                                    must compensate. -QAK
+                                                 */
+#define HDF5_BTREE_IK_MAX_ENTRIES       65536 	/* 2^16 - 2 bytes for storing entries (children) */
+						/* See format specification on version 1 B-trees */
+
+/* Macros to define signatures of all objects in the file */
+
+/* Size of signature information (on disk) */
+/* (all on-disk signatures should be this length) */
+#define H5_SIZEOF_MAGIC               4
+
+/* v1 B-tree node signature */
+#define H5B_MAGIC	                "TREE"
+
+/* v2 B-tree signatures */
+#define H5B2_HDR_MAGIC                  "BTHD"          /* Header */
+#define H5B2_INT_MAGIC                  "BTIN"          /* Internal node */
+#define H5B2_LEAF_MAGIC                 "BTLF"          /* Leaf node */
+
+/* Extensible array signatures */
+#define H5EA_HDR_MAGIC                  "EAHD"          /* Header */
+#define H5EA_IBLOCK_MAGIC               "EAIB"          /* Index block */
+#define H5EA_DBLOCK_MAGIC               "EADB"          /* Data block */
+
+/* Free space signatures */
+#define H5FS_HDR_MAGIC                  "FSHD"          /* Header */
+#define H5FS_SINFO_MAGIC                "FSSE"          /* Serialized sections */
+
+/* Symbol table node signature */
+#define H5G_NODE_MAGIC                  "SNOD"
+
+/* Fractal heap signatures */
+#define H5HF_HDR_MAGIC                  "FRHP"          /* Header */
+#define H5HF_IBLOCK_MAGIC               "FHIB"          /* Indirect block */
+#define H5HF_DBLOCK_MAGIC               "FHDB"          /* Direct block */
+
+/* Global heap signature */
+#define H5HG_MAGIC	                "GCOL"
+
+/* Local heap signature */
+#define H5HL_MAGIC                      "HEAP"
+
+/* Object header signatures */
+#define H5O_HDR_MAGIC                   "OHDR"          /* Header */
+#define H5O_CHK_MAGIC                   "OCHK"          /* Continuation chunk */
+
+/* Shared Message signatures */
+#define H5SM_TABLE_MAGIC                "SMTB"          /* Shared Message Table */
+#define H5SM_LIST_MAGIC                 "SMLI"          /* Shared Message List */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Forward declarations (for prototypes & type definitions) */
+struct H5B_class_t;
+struct H5RC_t;
+struct H5O_loc_t;
+struct H5HG_heap_t;
+struct H5P_genplist_t;
+
+/* Forward declarations for anonymous H5F objects */
+
+/* Main file structures */
+typedef struct H5F_t H5F_t;
+typedef struct H5F_file_t H5F_file_t;
+
+/* Block aggregation structure */
+typedef struct H5F_blk_aggr_t H5F_blk_aggr_t;
+
+/* I/O Info for an operation */
+typedef struct H5F_io_info_t {
+    const H5F_t *f;                     /* File object */
+    const struct H5P_genplist_t *dxpl;         /* DXPL object */
+} H5F_io_info_t;
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+
+/* Private functions */
+H5_DLL H5F_t *H5F_open(const char *name, unsigned flags, hid_t fcpl_id,
+    hid_t fapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5F_try_close(H5F_t *f);
+
+/* Functions than retrieve values from the file struct */
+H5_DLL unsigned H5F_get_intent(const H5F_t *f);
+H5_DLL char *H5F_get_open_name(const H5F_t *f);
+H5_DLL char *H5F_get_actual_name(const H5F_t *f);
+H5_DLL char *H5F_get_extpath(const H5F_t *f);
+H5_DLL H5F_file_t *H5F_get_shared(const H5F_t *f);
+H5_DLL hbool_t H5F_same_shared(const H5F_t *f1, const H5F_t *f2);
+H5_DLL unsigned H5F_get_nopen_objs(const H5F_t *f);
+H5_DLL unsigned H5F_incr_nopen_objs(H5F_t *f);
+H5_DLL unsigned H5F_decr_nopen_objs(H5F_t *f);
+H5_DLL hid_t H5F_get_file_id(const H5F_t *f);
+H5_DLL ssize_t H5F_get_file_image(H5F_t *f, void *buf_ptr, size_t buf_len);
+H5_DLL H5F_t *H5F_get_parent(const H5F_t *f);
+H5_DLL unsigned H5F_get_nmounts(const H5F_t *f);
+H5_DLL hid_t H5F_get_access_plist(H5F_t *f, hbool_t app_ref);
+H5_DLL hid_t H5F_get_id(H5F_t *file, hbool_t app_ref);
+H5_DLL herr_t H5F_get_obj_count(const H5F_t *f, unsigned types, hbool_t app_ref, size_t *obj_id_count_ptr);
+H5_DLL herr_t H5F_get_obj_ids(const H5F_t *f, unsigned types, size_t max_objs, hid_t *oid_list, hbool_t app_ref, size_t *obj_id_count_ptr);
+
+/* Functions than retrieve values set/cached from the superblock/FCPL */
+H5_DLL haddr_t H5F_get_base_addr(const H5F_t *f);
+H5_DLL unsigned H5F_sym_leaf_k(const H5F_t *f);
+H5_DLL unsigned H5F_Kvalue(const H5F_t *f, const struct H5B_class_t *type);
+H5_DLL unsigned H5F_get_nrefs(const H5F_t *f);
+H5_DLL uint8_t H5F_sizeof_addr(const H5F_t *f);
+H5_DLL uint8_t H5F_sizeof_size(const H5F_t *f);
+H5_DLL haddr_t H5F_get_sohm_addr(const H5F_t *f);
+H5_DLL herr_t H5F_set_sohm_addr(H5F_t *f, haddr_t addr);
+H5_DLL unsigned H5F_get_sohm_vers(const H5F_t *f);
+H5_DLL herr_t H5F_set_sohm_vers(H5F_t *f, unsigned vers);
+H5_DLL unsigned H5F_get_sohm_nindexes(const H5F_t *f);
+H5_DLL herr_t H5F_set_sohm_nindexes(H5F_t *f, unsigned nindexes);
+H5_DLL hid_t H5F_get_fcpl(const H5F_t *f);
+H5_DLL H5F_close_degree_t H5F_get_fc_degree(const H5F_t *f);
+H5_DLL size_t H5F_rdcc_nbytes(const H5F_t *f);
+H5_DLL size_t H5F_rdcc_nslots(const H5F_t *f);
+H5_DLL double H5F_rdcc_w0(const H5F_t *f);
+H5_DLL size_t H5F_sieve_buf_size(const H5F_t *f);
+H5_DLL unsigned H5F_gc_ref(const H5F_t *f);
+H5_DLL hbool_t H5F_use_latest_format(const H5F_t *f);
+H5_DLL hbool_t H5F_store_msg_crt_idx(const H5F_t *f);
+H5_DLL herr_t H5F_set_store_msg_crt_idx(H5F_t *f, hbool_t flag);
+H5_DLL struct H5RC_t *H5F_grp_btree_shared(const H5F_t *f);
+H5_DLL herr_t H5F_set_grp_btree_shared(H5F_t *f, struct H5RC_t *rc);
+H5_DLL hbool_t H5F_use_tmp_space(const H5F_t *f);
+H5_DLL hbool_t H5F_is_tmp_addr(const H5F_t *f, haddr_t addr);
+
+/* Functions that retrieve values from VFD layer */
+H5_DLL hid_t H5F_get_driver_id(const H5F_t *f);
+H5_DLL herr_t H5F_get_fileno(const H5F_t *f, unsigned long *filenum);
+H5_DLL hbool_t H5F_has_feature(const H5F_t *f, unsigned feature);
+H5_DLL haddr_t H5F_get_eoa(const H5F_t *f, H5FD_mem_t type);
+H5_DLL herr_t H5F_get_vfd_handle(const H5F_t *file, hid_t fapl,
+    void **file_handle);
+
+/* Functions that check file mounting information */
+H5_DLL hbool_t H5F_is_mount(const H5F_t *file);
+H5_DLL hbool_t H5F_has_mount(const H5F_t *file);
+H5_DLL herr_t H5F_traverse_mount(struct H5O_loc_t *oloc/*in,out*/);
+H5_DLL herr_t H5F_flush_mounts(H5F_t *f, hid_t dxpl_id);
+
+/* Functions that operate on blocks of bytes wrt super block */
+H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
+                size_t size, hid_t dxpl_id, void *buf/*out*/);
+H5_DLL herr_t H5F_block_write(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
+                size_t size, hid_t dxpl_id, const void *buf);
+
+/* Address-related functions */
+H5_DLL void H5F_addr_encode(const H5F_t *f, uint8_t **pp, haddr_t addr);
+H5_DLL void H5F_addr_encode_len(size_t addr_len, uint8_t **pp, haddr_t addr);
+H5_DLL void H5F_addr_decode(const H5F_t *f, const uint8_t **pp, haddr_t *addr_p);
+H5_DLL void H5F_addr_decode_len(size_t addr_len, const uint8_t **pp, haddr_t *addr_p);
+
+/* File access property list callbacks */
+H5_DLL herr_t H5P_facc_close(hid_t dxpl_id, void *close_data);
+
+/* Shared file list related routines */
+H5_DLL void H5F_sfile_assert_num(unsigned n);
+
+/* Routines for creating & destroying "fake" file structures */
+H5_DLL H5F_t *H5F_fake_alloc(uint8_t sizeof_size);
+H5_DLL herr_t H5F_fake_free(H5F_t *f);
+
+/* Superblock related routines */
+H5_DLL herr_t H5F_super_dirty(H5F_t *f);
+
+/* Parallel I/O (i.e. MPI) related routines */
+#ifdef H5_HAVE_PARALLEL
+H5_DLL int H5F_mpi_get_rank(const H5F_t *f);
+H5_DLL MPI_Comm H5F_mpi_get_comm(const H5F_t *f);
+H5_DLL int H5F_mpi_get_size(const H5F_t *f);
+#endif /* H5_HAVE_PARALLEL */
+
+/* External file cache routines */
+H5_DLL H5F_t *H5F_efc_open(H5F_t *parent, const char *name, unsigned flags,
+    hid_t fcpl_id, hid_t fapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5F_efc_close(H5F_t *parent, H5F_t *file);
+
+/* Global heap CWFS routines */
+H5_DLL herr_t H5F_cwfs_add(H5F_t *f, struct H5HG_heap_t *heap);
+H5_DLL herr_t H5F_cwfs_find_free_heap(H5F_t *f, hid_t dxpl_id, size_t need, haddr_t *addr);
+H5_DLL herr_t H5F_cwfs_advance_heap(H5F_t *f, struct H5HG_heap_t *heap,
+    hbool_t add_heap);
+H5_DLL herr_t H5F_cwfs_remove_heap(H5F_file_t *shared, struct H5HG_heap_t *heap);
+
+/* Debugging functions */
+H5_DLL herr_t H5F_debug(H5F_t *f, FILE * stream, int indent, int fwidth);
+
+#endif /* _H5Fprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fpublic.h b/gatb-core/thirdparty/hdf5/src/H5Fpublic.h
new file mode 100644
index 0000000..5f74523
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fpublic.h
@@ -0,0 +1,198 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5F module.
+ */
+#ifndef _H5Fpublic_H
+#define _H5Fpublic_H
+
+/* Public header files needed by this file */
+#include "H5public.h"
+#include "H5ACpublic.h"
+#include "H5Ipublic.h"
+
+/* When this header is included from a private header, don't make calls to H5check() */
+#undef H5CHECK
+#ifndef _H5private_H
+#define H5CHECK          H5check(),
+#else   /* _H5private_H */
+#define H5CHECK
+#endif  /* _H5private_H */
+
+/*
+ * These are the bits that can be passed to the `flags' argument of
+ * H5Fcreate() and H5Fopen(). Use the bit-wise OR operator (|) to combine
+ * them as needed.  As a side effect, they call H5check_version() to make sure
+ * that the application is compiled with a version of the hdf5 header files
+ * which are compatible with the library to which the application is linked.
+ * We're assuming that these constants are used rather early in the hdf5
+ * session.
+ *
+ * H5F_ACC_DEBUG no longer has any prints any special debug info. The symbol is
+ * being retained and will be listed as deprecated in HDF5 1.10.0.
+ */
+#define H5F_ACC_RDONLY	(H5CHECK 0x0000u)	/*absence of rdwr => rd-only        */
+#define H5F_ACC_RDWR	(H5CHECK 0x0001u)	/*open for read and write           */
+#define H5F_ACC_TRUNC	(H5CHECK 0x0002u)	/*overwrite existing files          */
+#define H5F_ACC_EXCL	(H5CHECK 0x0004u)	/*fail if file already exists       */
+#define H5F_ACC_DEBUG	(H5CHECK 0x0000u)	/*print debug info (no longer used) */
+#define H5F_ACC_CREAT	(H5CHECK 0x0010u)	/*create non-existing files         */
+
+/* Value passed to H5Pset_elink_acc_flags to cause flags to be taken from the
+ * parent file. */
+#define H5F_ACC_DEFAULT (H5CHECK 0xffffu)	/*ignore setting on lapl     */
+
+/* Flags for H5Fget_obj_count() & H5Fget_obj_ids() calls */
+#define H5F_OBJ_FILE	(0x0001u)       /* File objects */
+#define H5F_OBJ_DATASET	(0x0002u)       /* Dataset objects */
+#define H5F_OBJ_GROUP	(0x0004u)       /* Group objects */
+#define H5F_OBJ_DATATYPE (0x0008u)      /* Named datatype objects */
+#define H5F_OBJ_ATTR    (0x0010u)       /* Attribute objects */
+#define H5F_OBJ_ALL 	(H5F_OBJ_FILE|H5F_OBJ_DATASET|H5F_OBJ_GROUP|H5F_OBJ_DATATYPE|H5F_OBJ_ATTR)
+#define H5F_OBJ_LOCAL   (0x0020u)       /* Restrict search to objects opened through current file ID */
+                                        /* (as opposed to objects opened through any file ID accessing this file) */
+
+#define H5F_FAMILY_DEFAULT (hsize_t)0
+
+#ifdef H5_HAVE_PARALLEL
+/*
+ * Use this constant string as the MPI_Info key to set H5Fmpio debug flags.
+ * To turn on H5Fmpio debug flags, set the MPI_Info value with this key to
+ * have the value of a string consisting of the characters that turn on the
+ * desired flags.
+ */
+#define H5F_MPIO_DEBUG_KEY "H5F_mpio_debug_key"
+#endif /* H5_HAVE_PARALLEL */
+
+/* The difference between a single file and a set of mounted files */
+typedef enum H5F_scope_t {
+    H5F_SCOPE_LOCAL	= 0,	/*specified file handle only		*/
+    H5F_SCOPE_GLOBAL	= 1 	/*entire virtual file			*/
+} H5F_scope_t;
+
+/* Unlimited file size for H5Pset_external() */
+#define H5F_UNLIMITED	((hsize_t)(-1L))
+
+/* How does file close behave?
+ * H5F_CLOSE_DEFAULT - Use the degree pre-defined by underlining VFL
+ * H5F_CLOSE_WEAK    - file closes only after all opened objects are closed
+ * H5F_CLOSE_SEMI    - if no opened objects, file is close; otherwise, file
+		       close fails
+ * H5F_CLOSE_STRONG  - if there are opened objects, close them first, then
+		       close file
+ */
+typedef enum H5F_close_degree_t {
+    H5F_CLOSE_DEFAULT   = 0,
+    H5F_CLOSE_WEAK      = 1,
+    H5F_CLOSE_SEMI      = 2,
+    H5F_CLOSE_STRONG    = 3
+} H5F_close_degree_t;
+
+/* Current "global" information about file */
+/* (just size info currently) */
+typedef struct H5F_info_t {
+    hsize_t		super_ext_size;	/* Superblock extension size */
+    struct {
+	hsize_t		hdr_size;       /* Shared object header message header size */
+	H5_ih_info_t	msgs_info;      /* Shared object header message index & heap size */
+    } sohm;
+} H5F_info_t;
+
+/*
+ * Types of allocation requests. The values larger than H5FD_MEM_DEFAULT
+ * should not change other than adding new types to the end. These numbers
+ * might appear in files.
+ *
+ * Note: please change the log VFD flavors array if you change this
+ * enumeration.
+ */
+typedef enum H5F_mem_t {
+    H5FD_MEM_NOLIST     = -1,   /* Data should not appear in the free list.
+                                 * Must be negative.
+                                 */
+    H5FD_MEM_DEFAULT    = 0,    /* Value not yet set.  Can also be the
+                                 * datatype set in a larger allocation
+                                 * that will be suballocated by the library.
+                                 * Must be zero.
+                                 */
+    H5FD_MEM_SUPER      = 1,    /* Superblock data */
+    H5FD_MEM_BTREE      = 2,    /* B-tree data */
+    H5FD_MEM_DRAW       = 3,    /* Raw data (content of datasets, etc.) */
+    H5FD_MEM_GHEAP      = 4,    /* Global heap data */
+    H5FD_MEM_LHEAP      = 5,    /* Local heap data */
+    H5FD_MEM_OHDR       = 6,    /* Object header data */
+
+    H5FD_MEM_NTYPES             /* Sentinel value - must be last */
+} H5F_mem_t;
+
+/* Library's file format versions */
+typedef enum H5F_libver_t {
+    H5F_LIBVER_EARLIEST,        /* Use the earliest possible format for storing objects */
+    H5F_LIBVER_LATEST           /* Use the latest possible format available for storing objects*/
+} H5F_libver_t;
+
+/* Define file format version for 1.8 to prepare for 1.10 release.  
+ * (Not used anywhere now)*/
+#define H5F_LIBVER_18 H5F_LIBVER_LATEST
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Functions in H5F.c */
+H5_DLL htri_t H5Fis_hdf5(const char *filename);
+H5_DLL hid_t  H5Fcreate(const char *filename, unsigned flags,
+		  	  hid_t create_plist, hid_t access_plist);
+H5_DLL hid_t  H5Fopen(const char *filename, unsigned flags,
+		        hid_t access_plist);
+H5_DLL hid_t  H5Freopen(hid_t file_id);
+H5_DLL herr_t H5Fflush(hid_t object_id, H5F_scope_t scope);
+H5_DLL herr_t H5Fclose(hid_t file_id);
+H5_DLL hid_t  H5Fget_create_plist(hid_t file_id);
+H5_DLL hid_t  H5Fget_access_plist(hid_t file_id);
+H5_DLL herr_t H5Fget_intent(hid_t file_id, unsigned * intent);
+H5_DLL ssize_t H5Fget_obj_count(hid_t file_id, unsigned types);
+H5_DLL ssize_t H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *obj_id_list);
+H5_DLL herr_t H5Fget_vfd_handle(hid_t file_id, hid_t fapl, void **file_handle);
+H5_DLL herr_t H5Fmount(hid_t loc, const char *name, hid_t child, hid_t plist);
+H5_DLL herr_t H5Funmount(hid_t loc, const char *name);
+H5_DLL hssize_t H5Fget_freespace(hid_t file_id);
+H5_DLL herr_t H5Fget_filesize(hid_t file_id, hsize_t *size);
+H5_DLL ssize_t H5Fget_file_image(hid_t file_id, void * buf_ptr, size_t buf_len);
+H5_DLL herr_t H5Fget_mdc_config(hid_t file_id,
+				H5AC_cache_config_t * config_ptr);
+H5_DLL herr_t H5Fset_mdc_config(hid_t file_id,
+				H5AC_cache_config_t * config_ptr);
+H5_DLL herr_t H5Fget_mdc_hit_rate(hid_t file_id, double * hit_rate_ptr);
+H5_DLL herr_t H5Fget_mdc_size(hid_t file_id,
+                              size_t * max_size_ptr,
+                              size_t * min_clean_size_ptr,
+                              size_t * cur_size_ptr,
+                              int * cur_num_entries_ptr);
+H5_DLL herr_t H5Freset_mdc_hit_rate_stats(hid_t file_id);
+H5_DLL ssize_t H5Fget_name(hid_t obj_id, char *name, size_t size);
+H5_DLL herr_t H5Fget_info(hid_t obj_id, H5F_info_t *bh_info);
+H5_DLL herr_t H5Fclear_elink_file_cache(hid_t file_id);
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag);
+H5_DLL herr_t H5Fget_mpi_atomicity(hid_t file_id, hbool_t *flag);
+#endif /* H5_HAVE_PARALLEL */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Fpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fquery.c b/gatb-core/thirdparty/hdf5/src/H5Fquery.c
new file mode 100644
index 0000000..6ce211e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fquery.c
@@ -0,0 +1,1075 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Fquery.c
+ *                      Jan 10 2008
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             File structure query routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_intent
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'intent' flags
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	'intent' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		September 29, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_intent(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->shared->flags)
+} /* end H5F_get_intent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_open_name
+ *
+ * Purpose:	Retrieve the name used to open a file.
+ *
+ * Return:	Success:	The name of the file.
+ * 		Failure:	? (should not happen)
+ *
+ * Programmer:	Neil Fortner
+ *		December 15 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5F_get_open_name(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->open_name);
+
+    FUNC_LEAVE_NOAPI(f->open_name)
+} /* end H5F_get_open_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_actual_name
+ *
+ * Purpose:	Retrieve the actual name of a file, after resolving symlinks, etc.
+ *
+ * Return:	Success:	The name of the file.
+ * 		Failure:	? (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		November 25 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5F_get_actual_name(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->actual_name);
+
+    FUNC_LEAVE_NOAPI(f->actual_name)
+} /* end H5F_get_actual_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_extpath
+ *
+ * Purpose:	Retrieve the file's 'extpath' flags
+ *		This is used by H5L_extern_traverse() and H5D_build_extfile_prefix() to retrieve the main file's location
+ *		when searching the target file.
+ *
+ * Return:	'extpath' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Vailin Choi, April 2, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5F_get_extpath(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->extpath);
+
+    FUNC_LEAVE_NOAPI(f->extpath)
+} /* end H5F_get_extpath() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_shared
+ *
+ * Purpose:	Retrieve the file's 'shared' pointer
+ *
+ * Return:	'shared' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_file_t *
+H5F_get_shared(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->shared)
+} /* end H5F_get_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_same_shared
+ *
+ * Purpose:	Determine if two files have the same shared file pointer
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 19, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_same_shared(const H5F_t *f1, const H5F_t *f2)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f1);
+    HDassert(f1->shared);
+    HDassert(f2);
+    HDassert(f2->shared);
+
+    FUNC_LEAVE_NOAPI(f1->shared == f2->shared)
+} /* end H5F_same_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_nopen_objs
+ *
+ * Purpose:	Retrieve the file's 'nopen_objs' value
+ *
+ * Return:	'nopen_objs' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_nopen_objs(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->nopen_objs)
+} /* end H5F_get_nopen_objs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_file_id
+ *
+ * Purpose:	Retrieve the file's 'file_id' value
+ *
+ * Return:	'file_id' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5F_get_file_id(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->file_id)
+} /* end H5F_get_file_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_parent
+ *
+ * Purpose:	Retrieve the file's 'parent' pointer
+ *
+ * Return:	'parent' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 19, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5F_get_parent(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->parent)
+} /* end H5F_get_parent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_nmounts
+ *
+ * Purpose:	Retrieve the file's 'nmounts' value
+ *
+ * Return:	'nmounts' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_nmounts(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->nmounts)
+} /* end H5F_get_nmounts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_fcpl
+ *
+ * Purpose:	Retrieve the value of a file's FCPL.
+ *
+ * Return:	Success:	The FCPL for the file.
+ *
+ * 		Failure:	? (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 25 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5F_get_fcpl(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->fcpl_id)
+} /* end H5F_get_fcpl() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sizeof_addr
+ *
+ * Purpose:	Quick and dirty routine to retrieve the size of the file's size_t
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	'sizeof_addr' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		September 29, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+uint8_t
+H5F_sizeof_addr(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sizeof_addr)
+} /* end H5F_sizeof_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sizeof_size
+ *
+ * Purpose:	Quick and dirty routine to retrieve the size of the file's off_t
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	'sizeof_size' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		September 29, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+uint8_t
+H5F_sizeof_size(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sizeof_size)
+} /* H5F_sizeof_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_sohm_addr
+ *
+ * Purpose:	Retrieve the file's 'sohm_addr' value
+ *
+ * Return:	'sohm_addr' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5F_get_sohm_addr(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sohm_addr)
+} /* end H5F_get_sohm_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_sohm_vers
+ *
+ * Purpose:	Retrieve the file's 'sohm_vers' value
+ *
+ * Return:	'sohm_vers' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_sohm_vers(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sohm_vers)
+} /* end H5F_get_sohm_vers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_sohm_nindexes
+ *
+ * Purpose:	Retrieve the file's 'sohm_nindexes' value
+ *
+ * Return:	'sohm_nindexes' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_sohm_nindexes(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sohm_nindexes)
+} /* end H5F_get_sohm_nindexes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sym_leaf_k
+ *
+ * Purpose:	Replaced a macro to retrieve the symbol table leaf size,
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-negative, and the symbol table leaf size is
+ *                              returned.
+ *
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Raymond Lu
+ *		slu at ncsa.uiuc.edu
+ *		Oct 14 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_sym_leaf_k(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    FUNC_LEAVE_NOAPI(f->shared->sblock->sym_leaf_k)
+} /* end H5F_sym_leaf_k() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_Kvalue
+ *
+ * Purpose:	Replaced a macro to retrieve a B-tree key value for a certain
+ *              type, now that the generic properties are being used to store
+ *              the B-tree values.
+ *
+ * Return:	Success:	Non-negative, and the B-tree key value is
+ *                              returned.
+ *
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Raymond Lu
+ *		slu at ncsa.uiuc.edu
+ *		Oct 14 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_Kvalue(const H5F_t *f, const H5B_class_t *type)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+    HDassert(type);
+
+    FUNC_LEAVE_NOAPI(f->shared->sblock->btree_k[type->id])
+} /* end H5F_Kvalue() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_nrefs
+ *
+ * Purpose:	Retrieve the file's 'nrefs' value
+ *
+ * Return:	'nrefs' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_nrefs(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->nrefs)
+} /* end H5F_get_nrefs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_rdcc_nslots
+ *
+ * Purpose:	Replaced a macro to retrieve the raw data cache number of slots,
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-negative, and the raw data cache number of
+ *                              of slots is returned.
+ *
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jun  1 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5F_rdcc_nslots(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->rdcc_nslots)
+} /* end H5F_rdcc_nelmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_rdcc_nbytes
+ *
+ * Purpose:	Replaced a macro to retrieve the raw data cache number of bytes,
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-negative, and the raw data cache number of
+ *                              of bytes is returned.
+ *
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jun  1 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5F_rdcc_nbytes(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->rdcc_nbytes)
+} /* end H5F_rdcc_nbytes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_rdcc_w0
+ *
+ * Purpose:	Replaced a macro to retrieve the raw data cache 'w0' value
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-negative, and the raw data cache 'w0' value
+ *                              is returned.
+ *
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jun  2 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+double
+H5F_rdcc_w0(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->rdcc_w0)
+} /* end H5F_rdcc_w0() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_base_addr
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'base_addr' value
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu <slu at ncsa.uiuc.edu>
+ *		December 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5F_get_base_addr(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    FUNC_LEAVE_NOAPI(f->shared->sblock->base_addr)
+} /* end H5F_get_base_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_grp_btree_shared
+ *
+ * Purpose:	Replaced a macro to retrieve the shared B-tree node info
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-void, and the shared B-tree node info
+ *                              is returned.
+ *
+ * 		Failure:	void (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jul  5 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+H5RC_t *
+H5F_grp_btree_shared(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->grp_btree_shared)
+} /* end H5F_grp_btree_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sieve_buf_size
+ *
+ * Purpose:	Replaced a macro to retrieve the dataset sieve buffer size
+ *              now that the generic properties are being used to store
+ *              the values.
+ *
+ * Return:	Success:	Non-void, and the dataset sieve buffer size
+ *                              is returned.
+ *
+ * 		Failure:	void (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jul  8 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5F_sieve_buf_size(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->sieve_buf_size)
+} /* end H5F_sieve_buf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_gc_ref
+ *
+ * Purpose:	Replaced a macro to retrieve the "garbage collect
+ *              references flag" now that the generic properties are being used
+ *              to store the values.
+ *
+ * Return:	Success:	The "garbage collect references flag"
+ *                              is returned.
+ *
+ * 		Failure:	(should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jul  8 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_gc_ref(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->gc_ref)
+} /* end H5F_gc_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_use_latest_format
+ *
+ * Purpose:	Retrieve the 'use the latest version of the format' flag for
+ *              the file.
+ *
+ * Return:	Success:	Non-negative, the 'use the latest format' flag
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_use_latest_format(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->latest_format)
+} /* end H5F_use_latest_format() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_fc_degree
+ *
+ * Purpose:	Retrieve the 'file close degree' for the file.
+ *
+ * Return:	Success:	Non-negative, the 'file close degree'
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  5 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_close_degree_t
+H5F_get_fc_degree(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->fc_degree)
+} /* end H5F_get_fc_degree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_store_msg_crt_idx
+ *
+ * Purpose:	Retrieve the 'store message creation index' flag for the file.
+ *
+ * Return:	Success:	Non-negative, the 'store message creation index' flag
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_store_msg_crt_idx(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->store_msg_crt_idx)
+} /* end H5F_store_msg_crt_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_has_feature
+ *
+ * Purpose:	Check if a file has a particular feature enabled
+ *
+ * Return:	Success:	Non-negative - TRUE or FALSE
+ * 		Failure:	Negative (should not happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_has_feature(const H5F_t *f, unsigned feature)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI((hbool_t)(f->shared->lf->feature_flags&feature))
+} /* end H5F_has_feature() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_driver_id
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'driver_id' value
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	'driver_id' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		October 10, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5F_get_driver_id(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    FUNC_LEAVE_NOAPI(f->shared->lf->driver_id)
+} /* end H5F_get_driver_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_fileno
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'fileno' value
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		March 27, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_fileno(const H5F_t *f, unsigned long *filenum)
+{
+    herr_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(filenum);
+
+    /* Retrieve the file's serial number */
+    if(H5FD_get_fileno(f->shared->lf, filenum) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "can't retrieve fileno")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_fileno() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_eoa
+ *
+ * Purpose:	Quick and dirty routine to retrieve the file's 'eoa' value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		June 1, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5F_get_eoa(const H5F_t *f, H5FD_mem_t type)
+{
+    haddr_t	ret_value;
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Dispatch to driver */
+    if(HADDR_UNDEF == (ret_value = H5FD_get_eoa(f->shared->lf, type)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_vfd_handle
+ *
+ * Purpose:     Returns a pointer to the file handle of the low-level file
+ *              driver.  This is the private function for H5Fget_vfd_handle.
+ *
+ * Return:      Success:        Non-negative.
+ *              Failure:        negative.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep. 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_vfd_handle(const H5F_t *file, hid_t fapl, void **file_handle)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(file);
+    HDassert(file_handle);
+
+    /* Get the VFD handle */
+    if(H5FD_get_vfd_handle(file->shared->lf, fapl, file_handle) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get file handle for file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_vfd_handle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_is_tmp_addr
+ *
+ * Purpose:	Quick and dirty routine to determine if an address is in
+ *		the 'temporary' file space.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		June 11, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_is_tmp_addr(const H5F_t *f, haddr_t addr)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(H5F_addr_le(f->shared->tmp_addr, addr))
+} /* end H5F_is_tmp_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_use_tmp_space
+ *
+ * Purpose:	Quick and dirty routine to determine if using temporary
+ *		file space is allowed for this file.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		July  1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_use_tmp_space(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->use_tmp_space)
+} /* end H5F_use_tmp_space() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fsfile.c b/gatb-core/thirdparty/hdf5/src/H5Fsfile.c
new file mode 100644
index 0000000..a1c6976
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fsfile.c
@@ -0,0 +1,225 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Packages needed by this file... */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free lists                           */
+
+/* PRIVATE TYPEDEFS */
+
+/* Struct for tracking "shared" file structs */
+typedef struct H5F_sfile_node_t {
+    H5F_file_t *shared;                 /* Pointer to "shared" file struct */
+    struct H5F_sfile_node_t *next;      /* Pointer to next node */
+} H5F_sfile_node_t;
+
+/* PRIVATE PROTOTYPES */
+
+/* PRIVATE VARIABLES */
+
+/* Declare a free list to manage the H5F_sfile_node_t struct */
+H5FL_DEFINE_STATIC(H5F_sfile_node_t);
+
+/* Declare a local variable to track the shared file information */
+H5F_sfile_node_t *H5F_sfile_head_g = NULL;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sfile_assert_num
+ *
+ * Purpose:	Sanity checking that shared file list is empty
+ *
+ * Return:	none (void)
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5F_sfile_assert_num(unsigned n)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(n == 0) {
+        /* Sanity checking */
+        HDassert(H5F_sfile_head_g == NULL);
+    } /* end if */
+    else {
+        unsigned count;                 /* Number of open shared files */
+        H5F_sfile_node_t *curr;         /* Current shared file node */
+
+        /* Iterate through low-level files for matching low-level file info */
+        curr = H5F_sfile_head_g;
+        count = 0;
+        while(curr) {
+            /* Increment # of open shared file structs */
+            count++;
+
+            /* Advance to next shared file node */
+            curr = curr->next;
+        } /* end while */
+
+        /* Sanity checking */
+        HDassert(count == n);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* H5F_sfile_assert_num() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sfile_add
+ *
+ * Purpose:	Add a "shared" file struct to the list of open files
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 18, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_sfile_add(H5F_file_t *shared)
+{
+    H5F_sfile_node_t *new_shared;              /* New shared file node */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(shared);
+
+    /* Allocate new shared file node */
+    if (NULL == (new_shared = H5FL_CALLOC(H5F_sfile_node_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Set shared file value */
+    new_shared->shared = shared;
+
+    /* Prepend to list of shared files open */
+    new_shared->next = H5F_sfile_head_g;
+    H5F_sfile_head_g = new_shared;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sfile_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sfile_search
+ *
+ * Purpose:	Search for a "shared" file with low-level file info that
+ *              matches
+ *
+ * Return:	Non-NULL on success / NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 18, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_file_t *
+H5F_sfile_search(H5FD_t *lf)
+{
+    H5F_sfile_node_t *curr;             /* Current shared file node */
+    H5F_file_t *ret_value = NULL;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(lf);
+
+    /* Iterate through low-level files for matching low-level file info */
+    curr = H5F_sfile_head_g;
+    while(curr) {
+        /* Check for match */
+        if(0==H5FD_cmp(curr->shared->lf, lf))
+            HGOTO_DONE(curr->shared)
+
+        /* Advance to next shared file node */
+        curr = curr->next;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sfile_search() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_sfile_remove
+ *
+ * Purpose:	Remove a "shared" file struct from the list of open files
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 18, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_sfile_remove(H5F_file_t *shared)
+{
+    H5F_sfile_node_t *curr;             /* Current shared file node */
+    H5F_sfile_node_t *last;             /* Last shared file node */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(shared);
+
+    /* Locate shared file node with correct shared file */
+    last = NULL;
+    curr = H5F_sfile_head_g;
+    while(curr && curr->shared != shared) {
+        /* Advance to next node */
+        last = curr;
+        curr = curr->next;
+    } /* end while */
+
+    /* Indicate error if the node wasn't found */
+    if(curr == NULL)
+	HGOTO_ERROR(H5E_FILE, H5E_NOTFOUND, FAIL, "can't find shared file info")
+
+    /* Remove node found from list */
+    if(last != NULL)
+        /* Removing middle or tail node in list */
+        last->next = curr->next;
+    else
+        /* Removing head node in list */
+        H5F_sfile_head_g = curr->next;
+
+    /* Release the shared file node struct */
+    /* (the shared file info itself is freed elsewhere) */
+    curr = H5FL_FREE(H5F_sfile_node_t, curr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sfile_remove() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fsuper.c b/gatb-core/thirdparty/hdf5/src/H5Fsuper.c
new file mode 100644
index 0000000..3f2b33f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fsuper.c
@@ -0,0 +1,777 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5F_init_super_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions                    */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling                       */
+#include "H5Fpkg.h"             /* File access                          */
+#include "H5FDprivate.h"	/* File drivers                         */
+#include "H5Iprivate.h"		/* IDs                                  */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists                       */
+#include "H5SMprivate.h"        /* Shared Object Header Messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5F_super_ext_create(H5F_t *f, hid_t dxpl_id, H5O_loc_t *ext_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Declare a free list to manage the H5F_super_t struct */
+H5FL_DEFINE(H5F_super_t);
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5F_init_super_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5F_init_super_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5F_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5F_init_super_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5F_init())
+} /* H5F_init_super_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_ext_create
+ *
+ * Purpose:     Create the superblock extension
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_super_ext_create(H5F_t *f, hid_t dxpl_id, H5O_loc_t *ext_ptr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+    HDassert(!H5F_addr_defined(f->shared->sblock->ext_addr));
+    HDassert(ext_ptr);
+
+    /* Check for older version of superblock format that can't support superblock extensions */
+    if(f->shared->sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, "superblock extension not permitted with version %u of superblock", f->shared->sblock->super_vers)
+    else if(H5F_addr_defined(f->shared->sblock->ext_addr))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, "superblock extension already exists?!?!")
+    else {
+        /* The superblock extension isn't actually a group, but the
+         * default group creation list should work fine.
+         * If we don't supply a size for the object header, HDF5 will
+         * allocate H5O_MIN_SIZE by default.  This is currently
+         * big enough to hold the biggest possible extension, but should
+         * be tuned if more information is added to the superblock
+         * extension.
+         */
+        H5O_loc_reset(ext_ptr);
+        if(H5O_create(f, dxpl_id, 0, (size_t)1, H5P_GROUP_CREATE_DEFAULT, ext_ptr) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "unable to create superblock extension")
+
+        /* Record the address of the superblock extension */
+        f->shared->sblock->ext_addr = ext_ptr->addr;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_ext_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_ext_open
+ *
+ * Purpose:     Open an existing superblock extension
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_ext_open(H5F_t *f, haddr_t ext_addr, H5O_loc_t *ext_ptr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(ext_addr));
+    HDassert(ext_ptr);
+
+    /* Set up "fake" object location for superblock extension */
+    H5O_loc_reset(ext_ptr);
+    ext_ptr->file = f;
+    ext_ptr->addr = ext_addr;
+
+    /* Open the superblock extension object header */
+    if(H5O_open(ext_ptr) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open superblock extension")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_ext_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:   H5F_super_ext_close
+ *
+ * Purpose:    Close superblock extension
+ *
+ * Return:     Success:        non-negative on success
+ *             Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
+    hbool_t was_created)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(ext_ptr);
+
+    /* Check if extension was created */
+    if(was_created) {
+        /* Increment link count on superblock extension's object header */
+        if(H5O_link(ext_ptr, 1, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_LINKCOUNT, FAIL, "unable to increment hard link count")
+
+        /* Decrement refcount on superblock extension's object header in memory */
+        if(H5O_dec_rc_by_loc(ext_ptr, dxpl_id) < 0)
+           HDONE_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "unable to decrement refcount on superblock extension")
+    } /* end if */
+
+    /* Twiddle the number of open objects to avoid closing the file. */
+    f->nopen_objs++;
+    if(H5O_close(ext_ptr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close superblock extension")
+    f->nopen_objs--;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_ext_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_read
+ *
+ * Purpose:     Reads the superblock from the file or from the BUF. If
+ *              ADDR is a valid address, then it reads it from the file.
+ *              If not, then BUF must be non-NULL for it to read from the
+ *              BUF.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Bill Wendling
+ *              wendling at ncsa.uiuc.edu
+ *              Sept 12, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_read(H5F_t *f, hid_t dxpl_id)
+{
+    H5P_genplist_t     *dxpl;               /* DXPL object */
+    H5F_super_t *       sblock = NULL;      /* superblock structure                         */
+    unsigned            sblock_flags = H5AC__NO_FLAGS_SET;       /* flags used in superblock unprotect call      */
+    haddr_t             super_addr;         /* Absolute address of superblock */
+    H5AC_protect_t      rw;                 /* read/write permissions for file              */
+    hbool_t             dirtied = FALSE;    /* Bool for sblock protect call                 */
+    herr_t              ret_value = SUCCEED; /* return value                                */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the DXPL plist object for DXPL ID */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Find the superblock */
+    if(H5FD_locate_signature(f->shared->lf, dxpl, &super_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to locate file signature")
+    if(HADDR_UNDEF == super_addr)
+        HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "file signature not found")
+
+    /* Check for userblock present */
+    if(H5F_addr_gt(super_addr, 0)) {
+        /* Set the base address for the file in the VFD now */
+        if(H5FD_set_base_addr(f->shared->lf, super_addr) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "failed to set base address for file driver")
+    } /* end if */
+
+    /* Determine file intent for superblock protect */
+    if(H5F_INTENT(f) & H5F_ACC_RDWR)
+        rw = H5AC_WRITE;
+    else
+        rw = H5AC_READ;
+
+    /* Look up the superblock */
+    if(NULL == (sblock = (H5F_super_t *)H5AC_protect(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, &dirtied, rw)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load superblock")
+
+    /* Mark the superblock dirty if it was modified during loading or VFD indicated to do so */
+    if((H5AC_WRITE == rw) && (dirtied || H5F_HAS_FEATURE(f, H5FD_FEAT_DIRTY_SBLK_LOAD)))
+        sblock_flags |= H5AC__DIRTIED_FLAG;
+
+    /* Pin the superblock in the cache */
+    if(H5AC_pin_protected_entry(sblock) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTPIN, FAIL, "unable to pin superblock")
+
+    /* Set the pointer to the pinned superblock */
+    f->shared->sblock = sblock;
+
+done:
+    /* Release the superblock */
+    if(sblock && H5AC_unprotect(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, sblock_flags) < 0)
+        HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close superblock")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_super_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_init
+ *
+ * Purpose:     Allocates the superblock for the file and initializes
+ *              information about the superblock in memory.  Writes extension
+ *              messages if any are needed.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Sept 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_init(H5F_t *f, hid_t dxpl_id)
+{
+    H5F_super_t    *sblock = NULL;      /* Superblock cache structure                 */
+    hbool_t         sblock_in_cache = FALSE;    /* Whether the superblock has been inserted into the metadata cache */
+    H5P_genplist_t *plist;              /* File creation property list                */
+    hsize_t         userblock_size;     /* Size of userblock, in bytes                */
+    hsize_t         superblock_size;    /* Size of superblock, in bytes               */
+    size_t          driver_size;        /* Size of driver info block (bytes)          */
+    unsigned super_vers = HDF5_SUPERBLOCK_VERSION_DEF; /* Superblock version for file */
+    H5O_loc_t       ext_loc;            /* Superblock extension object location */
+    hbool_t         need_ext;           /* Whether the superblock extension is needed */
+    hbool_t         ext_created = FALSE; /* Whether the extension has been created */
+    herr_t          ret_value = SUCCEED; /* Return Value                              */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Allocate space for the superblock */
+    if(NULL == (sblock = H5FL_CALLOC(H5F_super_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize various address information */
+    sblock->base_addr = HADDR_UNDEF;
+    sblock->ext_addr = HADDR_UNDEF;
+    sblock->driver_addr = HADDR_UNDEF;
+    sblock->root_addr = HADDR_UNDEF;
+
+    /* Get the shared file creation property list */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(f->shared->fcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Initialize sym_leaf_k */
+    if(H5P_get(plist, H5F_CRT_SYM_LEAF_NAME, &sblock->sym_leaf_k) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get byte number for object size")
+
+    /* Initialize btree_k */
+    if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, &sblock->btree_k[0]) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes")
+
+    /* Bump superblock version if we are to use the latest version of the format */
+    if(f->shared->latest_format)
+        super_vers = HDF5_SUPERBLOCK_VERSION_LATEST;
+    /* Bump superblock version to create superblock extension for SOHM info */
+    else if(f->shared->sohm_nindexes > 0)
+        super_vers = HDF5_SUPERBLOCK_VERSION_2;
+    /* Check for non-default indexed storage B-tree internal 'K' value
+     * and set the version # of the superblock to 1 if it is a non-default
+     * value.
+     */
+    else if(sblock->btree_k[H5B_CHUNK_ID] != HDF5_BTREE_CHUNK_IK_DEF)
+        super_vers = HDF5_SUPERBLOCK_VERSION_1;
+
+    /* If a newer superblock version is required, set it here */
+    if(super_vers != HDF5_SUPERBLOCK_VERSION_DEF) {
+        H5P_genplist_t *c_plist;              /* Property list */
+
+        if(NULL == (c_plist = (H5P_genplist_t *)H5I_object(f->shared->fcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property list")
+        if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set superblock version")
+    } /* end if */
+
+    /*
+     * The superblock starts immediately after the user-defined
+     * header, which we have already insured is a proper size. The
+     * base address is set to the same thing as the superblock for
+     * now.
+     */
+    if(H5P_get(plist, H5F_CRT_USER_BLOCK_NAME, &userblock_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get userblock size")
+
+    /* Sanity check the userblock size vs. the file's allocation alignment */
+    if(userblock_size > 0) {
+        if(userblock_size < f->shared->alignment)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "userblock size must be > file object alignment")
+        if(0 != (userblock_size % f->shared->alignment))
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "userblock size must be an integral multiple of file object alignment")
+    } /* end if */
+
+    sblock->base_addr = userblock_size;
+    sblock->status_flags = 0;
+
+    /* Reserve space for the userblock */
+    if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_SUPER, userblock_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set EOA value for userblock")
+
+    /* Set the base address for the file in the VFD now, after allocating
+     *  space for userblock.
+     */
+    if(H5FD_set_base_addr(f->shared->lf, sblock->base_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "failed to set base address for file driver")
+
+    /* Save a local copy of the superblock version number */
+    sblock->super_vers = super_vers;
+
+    /* Compute the size of the superblock */
+    superblock_size = (hsize_t)H5F_SUPERBLOCK_SIZE(super_vers, f);
+
+    /* Compute the size of the driver information block */
+    H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+    if(driver_size > 0) {
+        driver_size += H5F_DRVINFOBLOCK_HDR_SIZE;
+
+        /*
+         * The file driver information block begins immediately after the
+         * superblock. (relative to base address in file)
+         */
+        sblock->driver_addr = superblock_size;
+    } /* end if */
+
+    /*
+     * Allocate space for the userblock, superblock & driver info blocks.
+     * We do it with one allocation request because the userblock and
+     * superblock need to be at the beginning of the file and only the first
+     * allocation request is required to return memory at format address zero.
+     */
+    if(super_vers < HDF5_SUPERBLOCK_VERSION_2)
+        superblock_size += driver_size;
+
+    /* Reserve space in the file for the superblock, instead of allocating it */
+    if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_SUPER, superblock_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set EOA value for superblock")
+
+    /* Insert superblock into cache, pinned */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, H5AC__PIN_ENTRY_FLAG) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "can't add superblock to cache")
+    sblock_in_cache = TRUE;
+
+    /* Keep a copy of the superblock info */
+    f->shared->sblock = sblock;
+
+    /*
+     * Determine if we will need a superblock extension
+     */
+
+    /* Files with SOHM indices always need the superblock extension */
+    if(f->shared->sohm_nindexes > 0) {
+        HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+        need_ext = TRUE;
+    } /* end if */
+    /* If we're going to use a version of the superblock format which allows
+     *  for the superblock extension, check for non-default values to store
+     *  in it.
+     */
+    else if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) {
+        /* Check for non-default v1 B-tree 'K' values to store */
+        if(sblock->btree_k[H5B_SNODE_ID] != HDF5_BTREE_SNODE_IK_DEF ||
+                sblock->btree_k[H5B_CHUNK_ID] != HDF5_BTREE_CHUNK_IK_DEF ||
+                sblock->sym_leaf_k != H5F_CRT_SYM_LEAF_DEF)
+            need_ext = TRUE;
+        /* Check for driver info to store */
+        else if(driver_size > 0)
+            need_ext = TRUE;
+        else
+            need_ext = FALSE;
+    } /* end if */
+    else
+        need_ext = FALSE;
+
+    /* Create the superblock extension for "extra" superblock data, if necessary. */
+    if(need_ext) {
+        /* The superblock extension isn't actually a group, but the
+         * default group creation list should work fine.
+         * If we don't supply a size for the object header, HDF5 will
+         * allocate H5O_MIN_SIZE by default.  This is currently
+         * big enough to hold the biggest possible extension, but should
+         * be tuned if more information is added to the superblock
+         * extension.
+         */
+	if(H5F_super_ext_create(f, dxpl_id, &ext_loc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, "unable to create superblock extension")
+        ext_created = TRUE;
+
+        /* Create the Shared Object Header Message table and register it with
+         *      the metadata cache, if this file supports shared messages.
+         */
+        if(f->shared->sohm_nindexes > 0) {
+            /* Initialize the shared message code & write the SOHM message to the extension */
+            if(H5SM_init(f, plist, &ext_loc, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to create SOHM table")
+        } /* end if */
+
+        /* Check for non-default v1 B-tree 'K' values to store */
+        if(sblock->btree_k[H5B_SNODE_ID] != HDF5_BTREE_SNODE_IK_DEF ||
+                sblock->btree_k[H5B_CHUNK_ID] != HDF5_BTREE_CHUNK_IK_DEF ||
+                sblock->sym_leaf_k != H5F_CRT_SYM_LEAF_DEF) {
+            H5O_btreek_t btreek;        /* v1 B-tree 'K' value message for superblock extension */
+
+            /* Write v1 B-tree 'K' value information to the superblock extension */
+            btreek.btree_k[H5B_CHUNK_ID] = sblock->btree_k[H5B_CHUNK_ID];
+            btreek.btree_k[H5B_SNODE_ID] = sblock->btree_k[H5B_SNODE_ID];
+            btreek.sym_leaf_k = sblock->sym_leaf_k;
+            if(H5O_msg_create(&ext_loc, H5O_BTREEK_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &btreek, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update v1 B-tree 'K' value header message")
+        } /* end if */
+
+        /* Check for driver info to store */
+        if(driver_size > 0) {
+            H5O_drvinfo_t drvinfo;      /* Driver info */
+            uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];  /* Driver info block encoding buffer */
+
+            /* Sanity check */
+            HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE);
+
+            /* Encode driver-specific data */
+            if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+            /* Write driver info information to the superblock extension */
+            drvinfo.len = driver_size;
+            drvinfo.buf = dbuf;
+            if(H5O_msg_create(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update driver info header message")
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Close superblock extension, if it was created */
+    if(ext_created && H5F_super_ext_close(f, &ext_loc, dxpl_id, ext_created) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close file's superblock extension")
+
+    /* Cleanup on failure */
+    if(ret_value < 0) {
+        /* Check if the superblock has been allocated yet */
+        if(sblock) {
+            /* Check if we've cached it already */
+            if(sblock_in_cache) {
+                /* Unpin superblock in cache */
+                if(H5AC_unpin_entry(sblock) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
+
+                /* Evict the superblock from the cache */
+                if(H5AC_expunge_entry(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, H5AC__NO_FLAGS_SET) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTEXPUNGE, FAIL, "unable to expunge superblock")
+            } /* end if */
+            else
+                /* Free superblock */
+                if(H5F_super_free(sblock) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to destroy superblock")
+
+            /* Reset variables in file structure */
+            f->shared->sblock = NULL;
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_super_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_dirty
+ *
+ * Purpose:     Mark the file's superblock dirty
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              August 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_dirty(H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    /* Mark superblock dirty in cache, so change to EOA will get encoded */
+    if(H5AC_mark_entry_dirty(f->shared->sblock) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_free
+ *
+ * Purpose:     Destroyer the file's superblock
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              April 1, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_free(H5F_super_t *sblock)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(sblock);
+
+    /* Free root group symbol table entry, if any */
+    sblock->root_ent = (H5G_entry_t *)H5MM_xfree(sblock->root_ent);
+
+    /* Free superblock */
+    sblock = (H5F_super_t *)H5FL_FREE(H5F_super_t, sblock);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_super_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_size
+ *
+ * Purpose:     Get storage size of the superblock and superblock extension
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *              July 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_size)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    /* Set the superblock size */
+    if(super_size)
+	*super_size = (hsize_t)H5F_SUPERBLOCK_SIZE(f->shared->sblock->super_vers, f);
+
+    /* Set the superblock extension size */
+    if(super_ext_size) {
+        if(H5F_addr_defined(f->shared->sblock->ext_addr)) {
+            H5O_loc_t ext_loc;          /* "Object location" for superblock extension */
+            H5O_hdr_info_t hdr_info;    /* Object info for superblock extension */
+
+            /* Set up "fake" object location for superblock extension */
+            H5O_loc_reset(&ext_loc);
+            ext_loc.file = f;
+            ext_loc.addr = f->shared->sblock->ext_addr;
+
+            /* Get object header info for superblock extension */
+            if(H5O_get_hdr_info(&ext_loc, dxpl_id, &hdr_info) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to retrieve superblock extension info")
+
+            /* Set the superblock extension size */
+            *super_ext_size = hdr_info.space.total;
+        } /* end if */
+        else
+            /* Set the superblock extension size to zero */
+            *super_ext_size = (hsize_t)0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_ext_write_msg()
+ *
+ * Purpose:     Write the message with ID to the superblock extension
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_t may_create)
+{
+    hbool_t     ext_created = FALSE;   /* Whether superblock extension was created */
+    hbool_t     ext_opened = FALSE;    /* Whether superblock extension was opened */
+    H5O_loc_t 	ext_loc; 	/* "Object location" for superblock extension */
+    htri_t 	status;       	/* Indicate whether the message exists or not */
+    herr_t 	ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    /* Open/create the superblock extension object header */
+    if(H5F_addr_defined(f->shared->sblock->ext_addr)) {
+	if(H5F_super_ext_open(f, f->shared->sblock->ext_addr, &ext_loc) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
+    } /* end if */
+    else {
+        HDassert(may_create);
+	if(H5F_super_ext_create(f, dxpl_id, &ext_loc) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, "unable to create file's superblock extension")
+        ext_created = TRUE;
+    } /* end else */
+    HDassert(H5F_addr_defined(ext_loc.addr));
+    ext_opened = TRUE;
+
+    /* Check if message with ID does not exist in the object header */
+    if((status = H5O_msg_exists(&ext_loc, id, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to check object header for message or message exists")
+
+    /* Check for creating vs. writing */
+    if(may_create) {
+	if(status)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "Message should not exist")
+
+	/* Create the message with ID in the superblock extension */
+	if(H5O_msg_create(&ext_loc, id, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to create the message in object header")
+    } /* end if */
+    else {
+	if(!status)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "Message should exist")
+
+	/* Update the message with ID in the superblock extension */
+	if(H5O_msg_write(&ext_loc, id, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to write the message in object header")
+    } /* end else */
+
+done:
+    /* Close the superblock extension, if it was opened */
+    if(ext_opened && H5F_super_ext_close(f, &ext_loc, dxpl_id, ext_created) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close file's superblock extension")
+
+    /* Mark superblock dirty in cache, if superblock extension was created */
+    if(ext_created && H5AC_mark_entry_dirty(f->shared->sblock) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_ext_write_msg() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Fsuper_cache.c b/gatb-core/thirdparty/hdf5/src/H5Fsuper_cache.c
new file mode 100644
index 0000000..6062a03
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Fsuper_cache.c
@@ -0,0 +1,887 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5SMprivate.h"        /* Shared Object Header Messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Maximum size of super-block buffers */
+#define H5F_MAX_SUPERBLOCK_SIZE  134
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static H5F_super_t *H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5F_super_t *sblock);
+static herr_t H5F_sblock_dest(H5F_t *f, H5F_super_t * sblock);
+static herr_t H5F_sblock_clear(H5F_t *f, H5F_super_t *sblock, hbool_t destroy);
+static herr_t H5F_sblock_size(const H5F_t *f, const H5F_super_t *sblock, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5F inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_SUPERBLOCK[1] = {{
+    H5AC_SUPERBLOCK_ID,
+    (H5AC_load_func_t)H5F_sblock_load,
+    (H5AC_flush_func_t)H5F_sblock_flush,
+    (H5AC_dest_func_t)H5F_sblock_dest,
+    (H5AC_clear_func_t)H5F_sblock_clear,
+    (H5AC_size_func_t)H5F_sblock_size,
+}};
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Declare extern the free list to manage the H5F_super_t struct */
+H5FL_EXTERN(H5F_super_t);
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_sblock_load
+ *
+ * Purpose:     Loads the superblock from the file, and deserializes
+ *              its information into the H5F_super_t structure.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        NULL
+ *
+ * Programmer:  Mike McGreevy
+ *              mamcgree at hdfgroup.org
+ *              April 8, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5F_super_t *
+H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void *_udata)
+{
+    H5F_super_t        *sblock = NULL;      /* File's superblock */
+    haddr_t             base_addr = HADDR_UNDEF;        /* Base address of file */
+    uint8_t             sbuf[H5F_MAX_SUPERBLOCK_SIZE];     /* Buffer for superblock */
+    H5P_genplist_t     *dxpl;               /* DXPL object */
+    H5P_genplist_t     *c_plist;            /* File creation property list  */
+    H5F_file_t         *shared;             /* shared part of `file'        */
+    H5FD_t             *lf;                 /* file driver part of `shared' */
+    haddr_t             stored_eoa;         /*relative end-of-addr in file  */
+    haddr_t             eof;                /*end of file address           */
+    uint8_t             sizeof_addr;        /* Size of offsets in the file (in bytes) */
+    uint8_t             sizeof_size;        /* Size of lengths in the file (in bytes) */
+    const size_t        fixed_size = H5F_SUPERBLOCK_FIXED_SIZE; /*fixed sizeof superblock   */
+    size_t              variable_size;      /*variable sizeof superblock    */
+    uint8_t            *p;                  /* Temporary pointer into encoding buffer */
+    unsigned            super_vers;         /* Superblock version          */
+    hbool_t            *dirtied = (hbool_t *)_udata;  /* Set up dirtied out value */
+    H5F_super_t        *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_eq(addr, 0));
+    HDassert(dirtied);
+
+    /* Short cuts */
+    shared = f->shared;
+    lf = shared->lf;
+
+    /* Get the shared file creation property list */
+    if(NULL == (c_plist = (H5P_genplist_t *)H5I_object(shared->fcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't get property list")
+
+    /* Get the base address for the file in the VFD */
+    if(HADDR_UNDEF == (base_addr = H5FD_get_base_addr(lf)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "failed to get base address for file driver")
+
+    /* Allocate space for the superblock */
+    if(NULL == (sblock = H5FL_CALLOC(H5F_super_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the DXPL plist object for DXPL ID */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't get property list")
+
+    /* Read fixed-size portion of the superblock */
+    p = sbuf;
+    H5_CHECK_OVERFLOW(fixed_size, size_t, haddr_t);
+    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, (haddr_t)fixed_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
+    if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, (haddr_t)0, fixed_size, p) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
+
+    /* Skip over signature (already checked when locating the superblock) */
+    p += H5F_SIGNATURE_LEN;
+
+    /* Superblock version */
+    super_vers = *p++;
+    if(super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad superblock version number")
+    if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set superblock version")
+
+    /* Record the superblock version */
+    sblock->super_vers = super_vers;
+
+    /* Sanity check */
+    HDassert(((size_t)(p - sbuf)) == fixed_size);
+
+    /* Determine the size of the variable-length part of the superblock */
+    variable_size = (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(super_vers, f);
+    HDassert(variable_size > 0);
+    HDassert(fixed_size + variable_size <= sizeof(sbuf));
+
+    /* Read in variable-sized portion of superblock */
+    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, (haddr_t)(fixed_size + variable_size)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
+    if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, (haddr_t)fixed_size, variable_size, p) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read superblock")
+
+    /* Check for older version of superblock format */
+    if(super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+        uint32_t	status_flags;	    /* File status flags	   */
+        unsigned        btree_k[H5B_NUM_BTREE_ID];  /* B-tree internal node 'K' values */
+        unsigned        sym_leaf_k;         /* Symbol table leaf node's 'K' value */
+
+        /* Freespace version (hard-wired) */
+        if(HDF5_FREESPACE_VERSION != *p++)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad free space version number")
+
+        /* Root group version number (hard-wired) */
+        if(HDF5_OBJECTDIR_VERSION != *p++)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad object directory version number")
+
+        /* Skip over reserved byte */
+        p++;
+
+        /* Shared header version number (hard-wired) */
+        if(HDF5_SHAREDHEADER_VERSION != *p++)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad shared-header format version number")
+
+        /* Size of file addresses */
+        sizeof_addr = *p++;
+        if(sizeof_addr != 2 && sizeof_addr != 4 &&
+                sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
+        if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number in an address")
+        shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
+
+        /* Size of file sizes */
+        sizeof_size = *p++;
+        if(sizeof_size != 2 && sizeof_size != 4 &&
+                sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
+        if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size")
+        shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
+
+        /* Skip over reserved byte */
+        p++;
+
+        /* Various B-tree sizes */
+        UINT16DECODE(p, sym_leaf_k);
+        if(sym_leaf_k == 0)
+            HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad symbol table leaf node 1/2 rank")
+        if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &sym_leaf_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for symbol table leaf nodes")
+        sblock->sym_leaf_k = sym_leaf_k;    /* Keep a local copy also */
+
+        /* Need 'get' call to set other array values */
+        if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
+        UINT16DECODE(p, btree_k[H5B_SNODE_ID]);
+        if(btree_k[H5B_SNODE_ID] == 0)
+            HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad 1/2 rank for btree internal nodes")
+        /*
+         * Delay setting the value in the property list until we've checked
+         * for the indexed storage B-tree internal 'K' value later.
+         */
+
+        /* File status flags (not really used yet) */
+        UINT32DECODE(p, status_flags);
+        HDassert(status_flags <= 255);
+        sblock->status_flags = (uint8_t)status_flags;
+        if(sblock->status_flags & ~H5F_SUPER_ALL_FLAGS)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
+
+        /*
+         * If the superblock version # is greater than 0, read in the indexed
+         * storage B-tree internal 'K' value
+         */
+        if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
+            UINT16DECODE(p, btree_k[H5B_CHUNK_ID]);
+            /* Reserved bytes are present only in version 1 */
+            if(super_vers == HDF5_SUPERBLOCK_VERSION_1)
+                p += 2;   /* reserved */
+        } /* end if */
+        else
+            btree_k[H5B_CHUNK_ID] = HDF5_BTREE_CHUNK_IK_DEF;
+
+        /* Set the B-tree internal node values, etc */
+        if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes")
+        HDmemcpy(sblock->btree_k, btree_k, sizeof(unsigned) * (size_t)H5B_NUM_BTREE_ID);    /* Keep a local copy also */
+
+        /* Remainder of "variable-sized" portion of superblock */
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->base_addr/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->ext_addr/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->driver_addr/*out*/);
+
+        /* Allocate space for the root group symbol table entry */
+        HDassert(!sblock->root_ent);
+        if(NULL == (sblock->root_ent = (H5G_entry_t *)H5MM_calloc(sizeof(H5G_entry_t))))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "can't allocate space for root group symbol table entry")
+
+        /* decode the root group symbol table entry */
+        if(H5G_ent_decode(f, (const uint8_t **)&p, sblock->root_ent) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "can't decode root group symbol table entry")
+
+        /* Set the root group address to the correct value */
+        sblock->root_addr = sblock->root_ent->header;
+
+        /*
+         * Check if superblock address is different from base address and
+         * adjust base address and "end of address" address if so.
+         */
+        if(!H5F_addr_eq(base_addr, sblock->base_addr)) {
+            /* Check if the superblock moved earlier in the file */
+            if(H5F_addr_lt(base_addr, sblock->base_addr))
+                stored_eoa -= (sblock->base_addr - base_addr);
+            else
+                /* The superblock moved later in the file */
+                stored_eoa += (base_addr - sblock->base_addr);
+
+            /* Adjust base address for offsets of the HDF5 data in the file */
+            sblock->base_addr = base_addr;
+
+            /* Set the base address for the file in the VFD now */
+            if(H5FD_set_base_addr(lf, sblock->base_addr) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, NULL, "failed to set base address for file driver")
+
+            /* Indicate that the superblock should be marked dirty */
+            *dirtied = TRUE;
+        } /* end if */
+
+        /* This step is for h5repart tool only. If user wants to change file driver
+         *  from family to sec2 while using h5repart, set the driver address to
+         *  undefined to let the library ignore the family driver information saved
+         *  in the superblock.
+         */
+        if(H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
+            /* Eliminate the driver info */
+            sblock->driver_addr = HADDR_UNDEF;
+
+            /* Indicate that the superblock should be marked dirty */
+            *dirtied = TRUE;
+        } /* end if */
+
+        /* Decode the optional driver information block */
+        if(H5F_addr_defined(sblock->driver_addr)) {
+            uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];     /* Buffer for driver info block */
+            char drv_name[9];       /* Name of driver */
+            unsigned drv_vers;      /* Version of driver info block */
+            size_t drv_variable_size; /* Size of variable-length portion of driver info block, in bytes */
+
+            /* Read in fixed-sized portion of driver info block */
+            p = dbuf;
+            if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
+            if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, sblock->driver_addr, (size_t)H5F_DRVINFOBLOCK_HDR_SIZE, p) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read driver information block")
+
+            /* Version number */
+            drv_vers = *p++;
+            if(drv_vers != HDF5_DRIVERINFO_VERSION_0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "bad driver information block version number")
+
+            p += 3; /* reserved bytes */
+
+            /* Driver info size */
+            UINT32DECODE(p, drv_variable_size);
+
+            /* Sanity check */
+            HDassert(H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size <= sizeof(dbuf));
+
+            /* Driver name and/or version */
+            HDstrncpy(drv_name, (const char *)p, (size_t)8);
+            drv_name[8] = '\0';
+            p += 8; /* advance past name/version */
+
+            /* Check if driver matches driver information saved. Unfortunately, we can't push this
+             * function to each specific driver because we're checking if the driver is correct.
+             */
+            if(!HDstrncmp(drv_name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
+            if(!HDstrncmp(drv_name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
+
+            /* Read in variable-sized portion of driver info block */
+            if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
+            if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE, drv_variable_size, p) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read file driver information")
+
+            /* Decode driver information */
+            if(H5FD_sb_decode(lf, drv_name, p) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
+        } /* end if */
+    } /* end if */
+    else {
+        uint32_t computed_chksum;       /* Computed checksum  */
+        uint32_t read_chksum;           /* Checksum read from file  */
+
+        /* Size of file addresses */
+        sizeof_addr = *p++;
+        if(sizeof_addr != 2 && sizeof_addr != 4 &&
+                sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
+        if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number in an address")
+        shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
+
+        /* Size of file sizes */
+        sizeof_size = *p++;
+        if(sizeof_size != 2 && sizeof_size != 4 &&
+                sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
+        if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size")
+        shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
+
+        /* File status flags (not really used yet) */
+        sblock->status_flags = *p++;
+        if(sblock->status_flags & ~H5F_SUPER_ALL_FLAGS)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
+
+        /* Base, superblock extension, end of file & root group object header addresses */
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->base_addr/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->ext_addr/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/);
+        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->root_addr/*out*/);
+
+        /* Compute checksum for superblock */
+        computed_chksum = H5_checksum_metadata(sbuf, (size_t)(p - sbuf), 0);
+
+        /* Decode checksum */
+        UINT32DECODE(p, read_chksum);
+
+        /* Verify correct checksum */
+        if(read_chksum != computed_chksum)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "bad checksum on driver information block")
+
+        /*
+         * Check if superblock address is different from base address and
+         * adjust base address and "end of address" address if so.
+         */
+        if(!H5F_addr_eq(base_addr, sblock->base_addr)) {
+            /* Check if the superblock moved earlier in the file */
+            if(H5F_addr_lt(base_addr, sblock->base_addr))
+                stored_eoa -= (sblock->base_addr - base_addr);
+            else
+                /* The superblock moved later in the file */
+                stored_eoa += (base_addr - sblock->base_addr);
+
+            /* Adjust base address for offsets of the HDF5 data in the file */
+            sblock->base_addr = base_addr;
+
+            /* Set the base address for the file in the VFD now */
+            if(H5FD_set_base_addr(lf, sblock->base_addr) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, NULL, "failed to set base address for file driver")
+
+            /* Indicate that the superblock should be marked dirty */
+            *dirtied = TRUE;
+        } /* end if */
+
+        /* Get the B-tree internal node values, etc */
+        if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, sblock->btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
+        if(H5P_get(c_plist, H5F_CRT_SYM_LEAF_NAME, &sblock->sym_leaf_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
+    } /* end else */
+
+    /*
+     * The user-defined data is the area of the file before the base
+     * address.
+     */
+    if(H5P_set(c_plist, H5F_CRT_USER_BLOCK_NAME, &sblock->base_addr) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set userblock size")
+
+    /*
+     * Make sure that the data is not truncated. One case where this is
+     * possible is if the first file of a family of files was opened
+     * individually.
+     */
+    if(HADDR_UNDEF == (eof = H5FD_get_eof(lf)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to determine file size")
+
+    /* (Account for the stored EOA being absolute offset -QAK) */
+    if((eof + sblock->base_addr) < stored_eoa)
+        HGOTO_ERROR(H5E_FILE, H5E_TRUNCATED, NULL, "truncated file: eof = %llu, sblock->base_addr = %llu, stored_eoa = %llu", (unsigned long long)eof, (unsigned long long)sblock->base_addr, (unsigned long long)stored_eoa)
+
+    /*
+     * Tell the file driver how much address space has already been
+     * allocated so that it knows how to allocate additional memory.
+     */
+    /* (Account for the stored EOA being absolute offset -NAF) */
+    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, stored_eoa - sblock->base_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to set end-of-address marker for file")
+
+    /* Read the file's superblock extension, if there is one. */
+    if(H5F_addr_defined(sblock->ext_addr)) {
+        H5O_loc_t ext_loc;      /* "Object location" for superblock extension */
+        H5O_btreek_t btreek;    /* v1 B-tree 'K' value message from superblock extension */
+        H5O_drvinfo_t drvinfo;  /* Driver info message from superblock extension */
+        htri_t status;          /* Status for message existing */
+
+        /* Sanity check - superblock extension should only be defined for
+         *      superblock version >= 2.
+         */
+        HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+
+        /* Check for superblock extension being located "outside" the stored
+         *      'eoa' value, which can occur with the split/multi VFD.
+         */
+        if(H5F_addr_gt(sblock->ext_addr, stored_eoa)) {
+            /* Set the 'eoa' for the object header memory type large enough
+             *  to give some room for a reasonably sized superblock extension.
+             *  (This is _rather_ a kludge -QAK)
+             */
+            if(H5FD_set_eoa(lf, H5FD_MEM_OHDR, (haddr_t)(sblock->ext_addr + 1024)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to set end-of-address marker for file")
+        } /* end if */
+
+        /* Open the superblock extension */
+	if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, NULL, "unable to open file's superblock extension")
+
+        /* Check for the extension having a 'driver info' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_DRVINFO_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to read object header")
+        if(status) {
+            /* Check for ignoring the driver info for this file */
+            if(H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
+                /* Indicate that the superblock should be marked dirty */
+                *dirtied = TRUE;
+            } /* end if */
+            else {
+                /* Retrieve the 'driver info' structure */
+                if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, dxpl_id))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "driver info message not present")
+
+                /* Check if driver matches driver information saved. Unfortunately, we can't push this
+                 * function to each specific driver because we're checking if the driver is correct.
+                 */
+                if(!HDstrncmp(drvinfo.name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
+                if(!HDstrncmp(drvinfo.name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
+
+                /* Decode driver information */
+                if(H5FD_sb_decode(lf, drvinfo.name, drvinfo.buf) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
+
+                /* Reset driver info message */
+                H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo);
+            } /* end else */
+        } /* end if */
+
+        /* Read in the shared OH message information if there is any */
+        if(H5SM_get_info(&ext_loc, c_plist, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read SOHM table information")
+
+        /* Check for the extension having a 'v1 B-tree "K"' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_BTREEK_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to read object header")
+        if(status) {
+            /* Retrieve the 'v1 B-tree "K"' structure */
+            if(NULL == H5O_msg_read(&ext_loc, H5O_BTREEK_ID, &btreek, dxpl_id))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "v1 B-tree 'K' info message not present")
+
+            /* Set non-default v1 B-tree 'K' value info from file */
+            sblock->btree_k[H5B_CHUNK_ID] = btreek.btree_k[H5B_CHUNK_ID];
+            sblock->btree_k[H5B_SNODE_ID] = btreek.btree_k[H5B_SNODE_ID];
+            sblock->sym_leaf_k = btreek.sym_leaf_k;
+
+            /* Set non-default v1 B-tree 'K' values in the property list */
+            if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btreek.btree_k) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes")
+            if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &btreek.sym_leaf_k) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for symbol table leaf nodes")
+        } /* end if */
+
+        /* Close superblock extension */
+        if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, NULL, "unable to close file's superblock extension")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = sblock;
+
+done:
+    /* Release the [possibly partially initialized] superblock on errors */
+    if(!ret_value && sblock)
+        if(H5F_super_free(sblock) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTFREE, NULL, "unable to destroy superblock data")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sblock_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_sblock_flush
+ *
+ * Purpose:     Flushes the superblock.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        NULL
+ *
+ * Programmer:  Mike McGreevy
+ *              mamcgree at hdfgroup.org
+ *              April 8, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t H5_ATTR_UNUSED addr,
+    H5F_super_t *sblock)
+{
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_eq(addr, 0));
+    HDassert(sblock);
+
+    if(sblock->cache_info.is_dirty) {
+        H5P_genplist_t *dxpl;               /* DXPL object */
+        uint8_t         buf[H5F_MAX_SUPERBLOCK_SIZE + H5F_MAX_DRVINFOBLOCK_SIZE];  /* Superblock & driver info blockencoding buffer */
+        uint8_t        *p;                  /* Ptr into encoding buffer */
+        haddr_t         rel_eoa;            /* Relative EOA for file */
+        size_t          superblock_size;    /* Size of superblock, in bytes */
+        size_t          driver_size;        /* Size of driver info block (bytes)*/
+
+        /* Encode the common portion of the file superblock for all versions */
+        p = buf;
+        HDmemcpy(p, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN);
+        p += H5F_SIGNATURE_LEN;
+        *p++ = (uint8_t)sblock->super_vers;
+
+        /* Check for older version of superblock format */
+        if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+            *p++ = (uint8_t)HDF5_FREESPACE_VERSION;     /* (hard-wired) */
+            *p++ = (uint8_t)HDF5_OBJECTDIR_VERSION;     /* (hard-wired) */
+            *p++ = 0;   /* reserved*/
+
+            *p++ = (uint8_t)HDF5_SHAREDHEADER_VERSION;  /* (hard-wired) */
+            *p++ = (uint8_t)H5F_SIZEOF_ADDR(f);
+            *p++ = (uint8_t)H5F_SIZEOF_SIZE(f);
+            *p++ = 0;   /* reserved */
+
+            UINT16ENCODE(p, sblock->sym_leaf_k);
+            UINT16ENCODE(p, sblock->btree_k[H5B_SNODE_ID]);
+            UINT32ENCODE(p, (uint32_t)sblock->status_flags);
+
+            /*
+             * Versions of the superblock >0 have the indexed storage B-tree
+             * internal 'K' value stored
+             */
+            if(sblock->super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
+                UINT16ENCODE(p, sblock->btree_k[H5B_CHUNK_ID]);
+                *p++ = 0;   /*reserved */
+                *p++ = 0;   /*reserved */
+            } /* end if */
+
+            H5F_addr_encode(f, &p, sblock->base_addr);
+            H5F_addr_encode(f, &p, sblock->ext_addr);
+            rel_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER);
+            H5F_addr_encode(f, &p, (rel_eoa + sblock->base_addr));
+            H5F_addr_encode(f, &p, sblock->driver_addr);
+
+            /* Encode the root group object entry, including the cached stab info */
+            if(H5G_ent_encode(f, &p, sblock->root_ent) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTENCODE, FAIL, "can't encode root group symbol table entry")
+
+            /* Encode the driver information block. */
+            H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+
+            /* Checking whether driver block address is defined here is to handle backward
+             * compatibility.  If the file was created with v1.6 library or earlier and no
+             * driver info block was written in the superblock, we don't write it either even
+             * though there's some driver info.  Otherwise, the driver block extended will
+             * overwrite the (meta)data right after the superblock. This situation happens to
+             * the family driver particularly.  SLU - 2009/3/24
+             */
+            if(driver_size > 0 && H5F_addr_defined(sblock->driver_addr)) {
+                char driver_name[9];    /* Name of driver, for driver info block */
+                uint8_t *dbuf = p;      /* Pointer to beginning of driver info */
+
+                /* Encode the driver information block */
+                *p++ = HDF5_DRIVERINFO_VERSION_0; /* Version */
+                *p++ = 0; /* reserved */
+                *p++ = 0; /* reserved */
+                *p++ = 0; /* reserved */
+
+                /* Driver info size, excluding header */
+                UINT32ENCODE(p, driver_size);
+
+                /* Encode driver-specific data */
+                if(H5FD_sb_encode(f->shared->lf, driver_name, dbuf + H5F_DRVINFOBLOCK_HDR_SIZE) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+                /* Store driver name (set in 'H5FD_sb_encode' call above) */
+                HDmemcpy(p, driver_name, (size_t)8);
+
+                /* Advance buffer pointer past name & variable-sized portion of driver info */
+                /* (for later use in computing the superblock size) */
+                p += 8 + driver_size;
+            } /* end if */
+        } /* end if */
+        else {
+            uint32_t        chksum;                 /* Checksum temporary variable      */
+            H5O_loc_t       *root_oloc;             /* Pointer to root group's object location */
+
+            /* Size of file addresses & offsets, and status flags */
+            *p++ = (uint8_t)H5F_SIZEOF_ADDR(f);
+            *p++ = (uint8_t)H5F_SIZEOF_SIZE(f);
+            *p++ = sblock->status_flags;
+
+            /* Base, superblock extension & end of file addresses */
+            H5F_addr_encode(f, &p, sblock->base_addr);
+            H5F_addr_encode(f, &p, sblock->ext_addr);
+            rel_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER);
+            H5F_addr_encode(f, &p, (rel_eoa + sblock->base_addr));
+
+            /* Retrieve information for root group */
+            if(NULL == (root_oloc = H5G_oloc(f->shared->root_grp)))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to retrieve root group information")
+
+            /* Encode address of root group's object header */
+            H5F_addr_encode(f, &p, root_oloc->addr);
+
+            /* Compute superblock checksum */
+            chksum = H5_checksum_metadata(buf, ((size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f) - H5F_SIZEOF_CHKSUM), 0);
+
+            /* Superblock checksum */
+            UINT32ENCODE(p, chksum);
+
+            /* Sanity check */
+            HDassert((size_t)(p - buf) == (size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f));
+        } /* end else */
+
+        /* Retrieve the total size of the superblock info */
+        H5_CHECKED_ASSIGN(superblock_size, size_t, (p - buf), ptrdiff_t);
+
+        /* Double check we didn't overrun the block (unlikely) */
+        HDassert(superblock_size <= sizeof(buf));
+
+        /* Get the DXPL plist object for DXPL ID */
+        if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+        /* Write superblock */
+        /* (always at relative address 0) */
+        if(H5FD_write(f->shared->lf, dxpl, H5FD_MEM_SUPER, (haddr_t)0, superblock_size, buf) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write superblock")
+
+        /* Check for newer version of superblock format & superblock extension */
+        if(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2 && H5F_addr_defined(sblock->ext_addr)) {
+            /* Check for ignoring the driver info for this file */
+            if(!H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
+                /* Check for driver info message */
+                H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+                if(driver_size > 0) {
+                    H5O_drvinfo_t drvinfo;      /* Driver info */
+                    H5O_loc_t 	ext_loc; 	/* "Object location" for superblock extension */
+                    uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];  /* Driver info block encoding buffer */
+
+                    /* Sanity check */
+                    HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE);
+
+                    /* Encode driver-specific data */
+                    if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+                    /* Open the superblock extension's object header */
+                    if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
+
+                    /* Write driver info information to the superblock extension */
+                    drvinfo.len = driver_size;
+                    drvinfo.buf = dbuf;
+                    if(H5O_msg_write(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "unable to update driver info header message")
+
+                    /* Close the superblock extension object header */
+                    if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
+                } /* end if */
+            } /* end if */
+        } /* end if */
+
+        /* Reset the dirty flag.  */
+        sblock->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5F_sblock_dest(f, sblock) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CLOSEERROR, FAIL, "can't close superblock")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sblock_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_sblock_dest
+ *
+ * Purpose:     Frees memory used by the superblock.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              April 8, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_sblock_dest(H5F_t H5_ATTR_UNUSED *f, H5F_super_t* sblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(sblock);
+
+    /* Free superblock */
+    if(H5F_super_free(sblock) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to destroy superblock")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sblock_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_sblock_clear
+ *
+ * Purpose:     Mark the superblock as no longer being dirty.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              April 8, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_sblock_clear(H5F_t *f, H5F_super_t *sblock, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sblock);
+
+    /* Reset the dirty flag.  */
+    sblock->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5F_sblock_dest(f, sblock) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to delete superblock")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_sblock_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_sblock_size
+ *
+ * Purpose:     Returns the size of the superblock encoded on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              April 8, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_sblock_size(const H5F_t *f, const H5F_super_t *sblock, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(sblock);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = (size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F_sblock_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ftest.c b/gatb-core/thirdparty/hdf5/src/H5Ftest.c
new file mode 100644
index 0000000..73b00a6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ftest.c
@@ -0,0 +1,188 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Ftest.c
+ *			Jan  3 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		File testing routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg  */
+#define H5F_TESTING		/*suppress warning about H5F testing funcs*/
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg  */
+#define H5SM_TESTING		/*suppress warning about H5SM testing funcs*/
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#define H5G_TESTING		/*suppress warning about H5G testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5SMpkg.h"            /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_sohm_mesg_count_test
+ *
+ * Purpose:     Retrieve the number of shared messages of a given type in a file
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Jan  3, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_sohm_mesg_count_test(hid_t file_id, unsigned type_id,
+    size_t *mesg_count)
+{
+    H5F_t	*file;                  /* File info */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Retrieve count for message type */
+    if(H5SM_get_mesg_count_test(file, H5AC_ind_dxpl_id, type_id, mesg_count) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve shared message count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_sohm_mesg_count_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_check_cached_stab_test
+ *
+ * Purpose:     Check that a file's superblock contains a cached symbol
+ *              table entry, that the entry matches that in the root
+ *              group's object header, and check that the addresses are
+ *              valid.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Neil Fortner
+ *	        Mar  31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_check_cached_stab_test(hid_t file_id)
+{
+    H5F_t	*file;                  /* File info */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Verify the cached stab info */
+    if(H5G__verify_cached_stab_test(H5G_oloc(file->shared->root_grp), file->shared->sblock->root_ent) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to verify cached symbol table info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_check_cached_stab_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_maxaddr_test
+ *
+ * Purpose:     Retrieve the maximum address for a file
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Jun 10, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_maxaddr_test(hid_t file_id, haddr_t *maxaddr)
+{
+    H5F_t	*file;                  /* File info */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Retrieve maxaddr for file */
+    *maxaddr = file->shared->maxaddr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_maxaddr_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5G.c b/gatb-core/thirdparty/hdf5/src/H5G.c
new file mode 100644
index 0000000..ac71c5c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5G.c
@@ -0,0 +1,824 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5G.c
+ *		Jul 18 1997
+ *		Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:	Symbol table functions.	 The functions that begin with
+ *		`H5G_stab_' don't understand the naming system; they operate
+ * 		on a single symbol table at a time.
+ *
+ *		The functions that begin with `H5G_node_' operate on the leaf
+ *		nodes of a symbol table B-tree.  They should be defined in
+ *		the H5Gnode.c file.
+ *
+ *		The remaining functions know how to traverse the group
+ *		directed graph.
+ *
+ * Names:	Object names are a slash-separated list of components.  If
+ *		the name begins with a slash then it's absolute, otherwise
+ *		it's relative ("/foo/bar" is absolute while "foo/bar" is
+ *		relative).  Multiple consecutive slashes are treated as
+ *		single slashes and trailing slashes are ignored.  The special
+ *		case `/' is the root group.  Every file has a root group.
+ *
+ *		API functions that look up names take a location ID and a
+ *		name.  The location ID can be a file ID or a group ID and the
+ *		name can be relative or absolute.
+ *
+ *              +--------------+----------- +--------------------------------+
+ * 		| Location ID  | Name       | Meaning                        |
+ *              +--------------+------------+--------------------------------+
+ * 		| File ID      | "/foo/bar" | Find `foo' within `bar' within |
+ *		|              |            | the root group of the specified|
+ *		|              |            | file.                          |
+ *              +--------------+------------+--------------------------------+
+ * 		| File ID      | "foo/bar"  | Find `foo' within `bar' within |
+ *		|              |            | the root group of the specified|
+ *		|              |            | file.                          |
+ *              +--------------+------------+--------------------------------+
+ * 		| File ID      | "/"        | The root group of the specified|
+ *		|              |            | file.                          |
+ *              +--------------+------------+--------------------------------+
+ * 		| File ID      | "."        | The root group of the specified|
+ *		|              |            | the specified file.            |
+ *              +--------------+------------+--------------------------------+
+ * 		| Group ID     | "/foo/bar" | Find `foo' within `bar' within |
+ *		|              |            | the root group of the file     |
+ *		|              |            | containing the specified group.|
+ *              +--------------+------------+--------------------------------+
+ * 		| Group ID     | "foo/bar"  | File `foo' within `bar' within |
+ *		|              |            | the specified group.           |
+ *              +--------------+------------+--------------------------------+
+ * 		| Group ID     | "/"        | The root group of the file     |
+ *		|              |            | containing the specified group.|
+ *              +--------------+------------+--------------------------------+
+ * 		| Group ID     | "."        | The specified group.           |
+ *              +--------------+------------+--------------------------------+
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5G_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Pprivate.h"         /* Property lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Group ID class */
+static const H5I_class_t H5I_GROUP_CLS[1] = {{
+    H5I_GROUP,			/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5G_close	/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, November 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_init_interface
+ *
+ * Purpose:	Initializes the H5G interface.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ * Notes:       The group creation properties are registered in the property
+ *              list interface initialization routine (H5P_init_interface)
+ *              so that the file creation property class can inherit from it
+ *              correctly. (Which allows the file creation property list to
+ *              control the group creation properties of the root group of
+ *              a file) QAK - 24/10/2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_init_interface(void)
+{
+    herr_t          ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize the atom group for the group IDs */
+    if(H5I_register_type(H5I_GROUP_CLS) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_term_interface
+ *
+ * Purpose:	Terminates the H5G interface
+ *
+ * Return:	Success:	Positive if anything is done that might
+ *				affect other interfaces; zero otherwise.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        if(H5I_nmembers(H5I_GROUP) > 0) {
+            (void)H5I_clear_type(H5I_GROUP, FALSE, FALSE);
+            n++; /*H5I*/
+        } /* end if */
+        else {
+            /* Close deprecated interface */
+            n += H5G__term_deprec_interface();
+
+            /* Destroy the group object id group */
+            (void)H5I_dec_type_ref(H5I_GROUP);
+            n++; /*H5I*/
+
+            /* Mark closed */
+            H5_interface_initialize_g = 0;
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5G_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gcreate2
+ *
+ * Purpose:	Creates a new group relative to LOC_ID, giving it the
+ *              specified creation property list GCPL_ID and access
+ *              property list GAPL_ID.  The link to the new group is
+ *              created with the LCPL_ID.
+ *
+ * Usage:       H5Gcreate2(loc_id, char *name, lcpl_id, gcpl_id, gapl_id)
+ *                  hid_t loc_id;	  IN: File or group identifier
+ *                  const char *name; IN: Absolute or relative name of the new group
+ *                  hid_t lcpl_id;	  IN: Property list for link creation
+ *                  hid_t gcpl_id;	  IN: Property list for group creation
+ *                  hid_t gapl_id;	  IN: Property list for group access
+ *
+ * Return:	Success:	The object ID of a new, empty group open for
+ *				writing.  Call H5Gclose() when finished with
+ *				the group.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *	        April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id,
+    hid_t gapl_id)
+{
+    H5G_loc_t	    loc;                /* Location to create group */
+    H5G_t	   *grp = NULL;         /* New group created */
+    hid_t	    ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("i", "i*siii", loc_id, name, lcpl_id, gcpl_id, gapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == lcpl_id)
+        lcpl_id = H5P_LINK_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link creation property list")
+
+    /* Check group creation property list */
+    if(H5P_DEFAULT == gcpl_id)
+        gcpl_id = H5P_GROUP_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(gcpl_id, H5P_GROUP_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group create property list")
+
+    /* Check the group access property list */
+    if(H5P_DEFAULT == gapl_id)
+        gapl_id = H5P_GROUP_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(gapl_id, H5P_GROUP_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list")
+
+    /* Create the new group & get its ID */
+    if(NULL == (grp = H5G__create_named(&loc, name, lcpl_id, gcpl_id, gapl_id, H5AC_dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group")
+    if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    if(ret_value < 0)
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gcreate2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gcreate_anon
+ *
+ * Purpose:	Creates a new group relative to LOC_ID, giving it the
+ *              specified creation property list GCPL_ID and access
+ *              property list GAPL_ID.
+ *
+ *              The resulting ID should be linked into the file with
+ *              H5Olink or it will be deleted when closed.
+ *
+ *              Given the default setting, H5Gcreate_anon() followed by
+ *              H5Olink() will have the same function as H5Gcreate2().
+ *
+ * Usage:       H5Gcreate_anon(loc_id, char *name, gcpl_id, gapl_id)
+ *                  hid_t loc_id;	  IN: File or group identifier
+ *                  const char *name; IN: Absolute or relative name of the new group
+ *                  hid_t gcpl_id;	  IN: Property list for group creation
+ *                  hid_t gapl_id;	  IN: Property list for group access
+ *
+ * Example:	To create missing groups "A" and "B01" along the given path "/A/B01/grp"
+ *              hid_t create_id = H5Pcreate(H5P_GROUP_CREATE);
+ *              int   status = H5Pset_create_intermediate_group(create_id, TRUE);
+ *              hid_t gid = H5Gcreate_anon(file_id, "/A/B01/grp", create_id, H5P_DEFAULT);
+ *
+ * Return:	Success:	The object ID of a new, empty group open for
+ *				writing.  Call H5Gclose() when finished with
+ *				the group.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:  Peter Cao
+ *	        May 08, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id)
+{
+    H5G_loc_t	    loc;
+    H5G_t	   *grp = NULL;
+    H5G_obj_create_t gcrt_info;         /* Information for group creation */
+    hid_t	    ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iii", loc_id, gcpl_id, gapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Check group creation property list */
+    if(H5P_DEFAULT == gcpl_id)
+        gcpl_id = H5P_GROUP_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(gcpl_id, H5P_GROUP_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group create property list")
+
+    /* Check the group access property list */
+    if(H5P_DEFAULT == gapl_id)
+        gapl_id = H5P_GROUP_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(gapl_id, H5P_GROUP_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list")
+
+    /* Set up group creation info */
+    gcrt_info.gcpl_id = gcpl_id;
+    gcrt_info.cache_type = H5G_NOTHING_CACHED;
+    HDmemset(&gcrt_info.cache, 0, sizeof(gcrt_info.cache));
+
+    /* Create the new group & get its ID */
+    if(NULL == (grp = H5G__create(loc.oloc->file, &gcrt_info, H5AC_dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group")
+    if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    /* Release the group's object header, if it was created */
+    if(grp) {
+        H5O_loc_t *oloc;         /* Object location for group */
+
+        /* Get the new group's object location */
+        if(NULL == (oloc = H5G_oloc(grp)))
+            HDONE_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get object location of group")
+
+        /* Decrement refcount on group's object header in memory */
+        if(H5O_dec_rc_by_loc(oloc, H5AC_dxpl_id) < 0)
+           HDONE_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+    } /* end if */
+
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gcreate_anon() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gopen2
+ *
+ * Purpose:	Opens an existing group for modification.  When finished,
+ *		call H5Gclose() to close it and release resources.
+ *
+ *              This function allows the user the pass in a Group Access
+ *              Property List, which H5Gopen1() does not.
+ *
+ * Return:	Success:	Object ID of the group.
+ *		Failure:	FAIL
+ *
+ * Programmer:	James Laird
+ *		Thursday, July 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id)
+{
+    H5G_t       *grp = NULL;            /* Group opened */
+    H5G_loc_t	loc;                    /* Location of parent for group */
+    hid_t       ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*si", loc_id, name, gapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Check the group access property list */
+    if(H5P_DEFAULT == gapl_id)
+        gapl_id = H5P_GROUP_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(gapl_id, H5P_GROUP_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list")
+
+    /* Open the group */
+    if((grp = H5G__open_name(&loc, name, gapl_id, H5AC_ind_dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+
+    /* Register an ID for the group */
+    if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    if(ret_value < 0) {
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gopen2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_create_plist
+ *
+ * Purpose:	Returns a copy of the group creation property list.
+ *
+ * Return:	Success:	ID for a copy of the group creation
+ *				property list.  The property list ID should be
+ *				released by calling H5Pclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, October 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gget_create_plist(hid_t group_id)
+{
+    H5G_t		*group = NULL;
+    hid_t		ret_value = FAIL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", group_id);
+
+    /* Check args */
+    if(NULL == (group = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    if((ret_value = H5G_get_create_plist(group)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_get_create_plist
+ *
+ * Purpose:	Private function for H5Gget_create_plist
+ *
+ * Return:	Success:	ID for a copy of the group creation
+ *				property list.  The property list ID should be
+ *				released by calling H5Pclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, October 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5G_get_create_plist(H5G_t *grp)
+{
+    H5O_linfo_t         linfo;		        /* Link info message            */
+    htri_t	        ginfo_exists;
+    htri_t	        linfo_exists;
+    htri_t              pline_exists;
+    H5P_genplist_t      *gcpl_plist;
+    H5P_genplist_t      *new_plist;
+    hid_t		new_gcpl_id = FAIL;
+    hid_t		ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Copy the default group creation property list */
+    if(NULL == (gcpl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_GROUP_CREATE_ID_g)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get default group creation property list")
+    if((new_gcpl_id = H5P_copy_plist(gcpl_plist, TRUE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to copy the creation property list")
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_gcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Retrieve any object creation properties */
+    if(H5O_get_create_plist(&grp->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object creation info")
+
+    /* Check for the group having a group info message */
+    if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(ginfo_exists) {
+        H5O_ginfo_t ginfo;		/* Group info message            */
+
+        /* Read the group info */
+        if(NULL == H5O_msg_read(&(grp->oloc), H5O_GINFO_ID, &ginfo, H5AC_ind_dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info")
+
+        /* Set the group info for the property list */
+        if(H5P_set(new_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+    } /* end if */
+
+    /* Check for the group having a link info message */
+    if((linfo_exists = H5G__obj_get_linfo(&(grp->oloc), &linfo, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(linfo_exists) {
+        /* Set the link info for the property list */
+        if(H5P_set(new_plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link info")
+    } /* end if */
+
+    /* Check for the group having a pipeline message */
+    if((pline_exists = H5O_msg_exists(&(grp->oloc), H5O_PLINE_ID, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+    if(pline_exists) {
+        H5O_pline_t pline;      /* Pipeline message */
+
+        /* Read the pipeline */
+        if(NULL == H5O_msg_read(&(grp->oloc), H5O_PLINE_ID, &pline, H5AC_ind_dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link pipeline")
+
+        /* Set the pipeline for the property list */
+        if(H5P_set(new_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link pipeline")
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = new_gcpl_id;
+
+done:
+    if(ret_value < 0) {
+        if(new_gcpl_id > 0)
+            if(H5I_dec_app_ref(new_gcpl_id) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "can't free")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_info
+ *
+ * Purpose:	Retrieve information about a group.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_info(hid_t grp_id, H5G_info_t *grp_info)
+{
+    H5I_type_t  id_type;                /* Type of ID */
+    H5G_loc_t	loc;                    /* Location of group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", grp_id, grp_info);
+
+    /* Check args */
+    id_type = H5I_get_type(grp_id);
+    if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
+    if(!grp_info)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+
+    /* Get group location */
+    if(H5G_loc(grp_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Retrieve the group's information */
+    if(H5G__obj_info(loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_info_by_name
+ *
+ * Purpose:	Retrieve information about a group.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *grp_info,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    H5G_loc_t   grp_loc;                /* Location used to open group */
+    H5G_name_t  grp_path;            	/* Opened object group hier. path */
+    H5O_loc_t   grp_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Location at 'name' found */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*s*xi", loc_id, name, grp_info, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(!grp_info)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    grp_loc.oloc = &grp_oloc;
+    grp_loc.path = &grp_path;
+    H5G_loc_reset(&grp_loc);
+
+    /* Find the group object */
+    if(H5G_loc_find(&loc, name, &grp_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    loc_found = TRUE;
+
+    /* Retrieve the group's information */
+    if(H5G__obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info")
+
+done:
+    if(loc_found && H5G_loc_free(&grp_loc) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_info_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_info_by_idx
+ *
+ * Purpose:	Retrieve information about a group, according to the order
+ *              of an index.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, H5G_info_t *grp_info, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    H5G_loc_t   grp_loc;                /* Location used to open group */
+    H5G_name_t  grp_path;            	/* Opened object group hier. path */
+    H5O_loc_t   grp_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIoh*xi", loc_id, group_name, idx_type, order, n, grp_info,
+             lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!grp_info)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    grp_loc.oloc = &grp_oloc;
+    grp_loc.path = &grp_path;
+    H5G_loc_reset(&grp_loc);
+
+    /* Find the object's location, according to the order in the index */
+    if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &grp_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    loc_found = TRUE;
+
+    /* Retrieve the group's information */
+    if(H5G__obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info")
+
+done:
+    /* Release the object location */
+    if(loc_found && H5G_loc_free(&grp_loc) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_info_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gclose
+ *
+ * Purpose:	Closes the specified group.  The group ID will no longer be
+ *		valid for accessing the group.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, December 31, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gclose(hid_t group_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", group_id);
+
+    /* Check args */
+    if(NULL == H5I_object_verify(group_id,H5I_GROUP))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /*
+     * Decrement the counter on the group atom.	 It will be freed if the count
+     * reaches zero.
+     */
+    if(H5I_dec_app_ref(group_id) < 0)
+    	HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close group")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gclose() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gbtree2.c b/gatb-core/thirdparty/hdf5/src/H5Gbtree2.c
new file mode 100644
index 0000000..1323ea0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gbtree2.c
@@ -0,0 +1,536 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gbtree2.c
+ *			Sep  9 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		v2 B-tree callbacks for indexing fields on links
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/*
+ * Data exchange structure for dense link storage.  This structure is
+ * passed through the fractal heap layer to compare links.
+ */
+typedef struct H5G_fh_ud_cmp_t {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    const char  *name;                  /* Name of link to compare           */
+    H5B2_found_t found_op;              /* Callback when correct link is found */
+    void        *found_op_data;         /* Callback data when correct link is found */
+
+    /* upward */
+    int         cmp;                    /* Comparison of two link names      */
+} H5G_fh_ud_cmp_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* v2 B-tree function callbacks */
+
+/* v2 B-tree driver callbacks for 'creation order' index */
+static herr_t H5G_dense_btree2_corder_store(void *native, const void *udata);
+static herr_t H5G_dense_btree2_corder_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5G_dense_btree2_corder_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5G_dense_btree2_corder_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5G_dense_btree2_corder_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+/* v2 B-tree driver callbacks for 'name' index */
+static herr_t H5G_dense_btree2_name_store(void *native, const void *udata);
+static herr_t H5G_dense_btree2_name_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5G_dense_btree2_name_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5G_dense_btree2_name_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5G_dense_btree2_name_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+/* Fractal heap function callbacks */
+static herr_t H5G_dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+/* v2 B-tree class for indexing 'name' field of links */
+const H5B2_class_t H5G_BT2_NAME[1]={{   /* B-tree class information */
+    H5B2_GRP_DENSE_NAME_ID,             /* Type of B-tree */
+    "H5B2_GRP_DENSE_NAME_ID",           /* Name of B-tree class */
+    sizeof(H5G_dense_bt2_name_rec_t),   /* Size of native record */
+    NULL,                               /* Create client callback context */
+    NULL,                               /* Destroy client callback context */
+    H5G_dense_btree2_name_store,        /* Record storage callback */
+    H5G_dense_btree2_name_compare,      /* Record comparison callback */
+    H5G_dense_btree2_name_encode,       /* Record encoding callback */
+    H5G_dense_btree2_name_decode,       /* Record decoding callback */
+    H5G_dense_btree2_name_debug,        /* Record debugging callback */
+    NULL,                               /* Create debugging context */
+    NULL                                /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for indexing 'creation order' field of links */
+const H5B2_class_t H5G_BT2_CORDER[1]={{ /* B-tree class information */
+    H5B2_GRP_DENSE_CORDER_ID,           /* Type of B-tree */
+    "H5B2_GRP_DENSE_CORDER_ID",         /* Name of B-tree class */
+    sizeof(H5G_dense_bt2_corder_rec_t), /* Size of native record */
+    NULL,                               /* Create client callback context */
+    NULL,                               /* Destroy client callback context */
+    H5G_dense_btree2_corder_store,      /* Record storage callback */
+    H5G_dense_btree2_corder_compare,    /* Record comparison callback */
+    H5G_dense_btree2_corder_encode,     /* Record encoding callback */
+    H5G_dense_btree2_corder_decode,     /* Record decoding callback */
+    H5G_dense_btree2_corder_debug,      /* Record debugging callback */
+    NULL,                               /* Create debugging context */
+    NULL                                /* Destroy debugging context */
+}};
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_fh_name_cmp
+ *
+ * Purpose:	Compares the name of a link in a fractal heap to another
+ *              name
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_fh_name_cmp(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_cmp_t *udata = (H5G_fh_ud_cmp_t *)_udata;         /* User data for 'op' callback */
+    H5O_link_t *lnk;    /* Pointer to link created from heap object */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information */
+    if(NULL == (lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
+
+    /* Compare the string values */
+    udata->cmp = HDstrcmp(udata->name, lnk->name);
+
+    /* Check for correct link & callback to make */
+    if(udata->cmp == 0 && udata->found_op) {
+        if((udata->found_op)(lnk, udata->found_op_data) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, FAIL, "link found callback failed")
+    } /* end if */
+
+    /* Release the space allocated for the link */
+    H5O_msg_free(H5O_LINK_ID, lnk);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_fh_name_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_name_store
+ *
+ * Purpose:	Store user information into native record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, September  9, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_name_store(void *_nrecord, const void *_udata)
+{
+    const H5G_bt2_ud_ins_t *udata = (const H5G_bt2_ud_ins_t *)_udata;
+    H5G_dense_bt2_name_rec_t *nrecord = (H5G_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Copy user information info native record */
+    nrecord->hash = udata->common.name_hash;
+    HDmemcpy(nrecord->id, udata->id, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_name_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_name_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec, int *result)
+{
+    const H5G_bt2_ud_common_t *bt2_udata = (const H5G_bt2_ud_common_t *)_bt2_udata;
+    const H5G_dense_bt2_name_rec_t *bt2_rec = (const H5G_dense_bt2_name_rec_t *)_bt2_rec;
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(bt2_udata);
+    HDassert(bt2_rec);
+
+    /* Check hash value */
+    if(bt2_udata->name_hash < bt2_rec->hash)
+        *result = (-1);
+    else if(bt2_udata->name_hash > bt2_rec->hash)
+        *result = 1;
+    else {
+        H5G_fh_ud_cmp_t fh_udata;       /* User data for fractal heap 'op' callback */
+
+        /* Sanity check */
+        HDassert(bt2_udata->name_hash == bt2_rec->hash);
+
+        /* Prepare user data for callback */
+        /* down */
+        fh_udata.f = bt2_udata->f;
+        fh_udata.dxpl_id = bt2_udata->dxpl_id;
+        fh_udata.name = bt2_udata->name;
+        fh_udata.found_op = bt2_udata->found_op;
+        fh_udata.found_op_data = bt2_udata->found_op_data;
+
+        /* up */
+        fh_udata.cmp = 0;
+
+        /* Check if the user's link and the B-tree's link have the same name */
+        if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, bt2_rec->id,
+                   H5G_dense_fh_name_cmp, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+        /* Callback will set comparison value */
+        *result = fh_udata.cmp;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5G_dense_btree2_name_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_name_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    const H5G_dense_bt2_name_rec_t *nrecord = (const H5G_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Encode the record's fields */
+    UINT32ENCODE(raw, nrecord->hash)
+    HDmemcpy(raw, nrecord->id, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_name_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_name_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    H5G_dense_bt2_name_rec_t *nrecord = (H5G_dense_bt2_name_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Decode the record's fields */
+    UINT32DECODE(raw, nrecord->hash)
+    HDmemcpy(nrecord->id, raw, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_name_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_name_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_name_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    const H5G_dense_bt2_name_rec_t *nrecord = (const H5G_dense_bt2_name_rec_t *)_nrecord;
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%lx, ", indent, "", fwidth, "Record:",
+        nrecord->hash);
+    for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++)
+        HDfprintf(stderr, "%02x%s", nrecord->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n"));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_name_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_corder_store
+ *
+ * Purpose:	Store user information into native record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_corder_store(void *_nrecord, const void *_udata)
+{
+    const H5G_bt2_ud_ins_t *udata = (const H5G_bt2_ud_ins_t *)_udata;
+    H5G_dense_bt2_corder_rec_t *nrecord = (H5G_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Copy user information info native record */
+    nrecord->corder = udata->common.corder;
+    HDmemcpy(nrecord->id, udata->id, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_corder_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_corder_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec, int *result)
+{
+    const H5G_bt2_ud_common_t *bt2_udata = (const H5G_bt2_ud_common_t *)_bt2_udata;
+    const H5G_dense_bt2_corder_rec_t *bt2_rec = (const H5G_dense_bt2_corder_rec_t *)_bt2_rec;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(bt2_udata);
+    HDassert(bt2_rec);
+
+#ifdef QAK
+{
+unsigned u;
+
+HDfprintf(stderr, "%s: bt2_udata->corder = %Hd\n", "H5G_dense_btree2_corder_compare", (hsize_t)bt2_udata->corder);
+HDfprintf(stderr, "%s: bt2_rec = {%Hu, ", "H5G_dense_btree2_corder_compare", (hsize_t)bt2_rec->corder);
+for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++)
+    HDfprintf(stderr, "%02x%s", bt2_rec->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n"));
+}
+#endif /* QAK */
+    /* Check creation order value */
+    if(bt2_udata->corder < bt2_rec->corder)
+        *result = -1;
+    else if(bt2_udata->corder > bt2_rec->corder)
+        *result = 1;
+    else
+        *result = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_corder_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_corder_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    const H5G_dense_bt2_corder_rec_t *nrecord = (const H5G_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Encode the record's fields */
+    INT64ENCODE(raw, nrecord->corder)
+    HDmemcpy(raw, nrecord->id, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_corder_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_corder_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+{
+    H5G_dense_bt2_corder_rec_t *nrecord = (H5G_dense_bt2_corder_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Decode the record's fields */
+    INT64DECODE(raw, nrecord->corder)
+    HDmemcpy(nrecord->id, raw, (size_t)H5G_DENSE_FHEAP_ID_LEN);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_corder_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_btree2_corder_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_btree2_corder_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    const H5G_dense_bt2_corder_rec_t *nrecord = (const H5G_dense_bt2_corder_rec_t *)_nrecord;
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%Hu, ", indent, "", fwidth, "Record:",
+        nrecord->corder);
+    for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++)
+        HDfprintf(stderr, "%02x%s", nrecord->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n"));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_dense_btree2_corder_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gcache.c b/gatb-core/thirdparty/hdf5/src/H5Gcache.c
new file mode 100644
index 0000000..a42127b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gcache.c
@@ -0,0 +1,410 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gcache.c
+ *			Feb  5 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implement group metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5G_NODE_VERS           1       /* Symbol table node version number   */
+#define H5G_NODE_BUF_SIZE       512     /* Size of stack buffer for serialized nodes */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static H5G_node_t *H5G_node_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5G_node_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
+			     H5G_node_t *sym, unsigned *flags_ptr);
+static herr_t H5G_node_dest(H5F_t *f, H5G_node_t *sym);
+static herr_t H5G_node_clear(H5F_t *f, H5G_node_t *sym, hbool_t destroy);
+static herr_t H5G_node_size(const H5F_t *f, const H5G_node_t *sym, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Symbol table nodes inherit cache-like properties from H5AC */
+const H5AC_class_t H5AC_SNODE[1] = {{
+    H5AC_SNODE_ID,
+    (H5AC_load_func_t)H5G_node_load,
+    (H5AC_flush_func_t)H5G_node_flush,
+    (H5AC_dest_func_t)H5G_node_dest,
+    (H5AC_clear_func_t)H5G_node_clear,
+    (H5AC_size_func_t)H5G_node_size,
+}};
+
+
+/* Declare extern the free list to manage the H5G_node_t struct */
+H5FL_EXTERN(H5G_node_t);
+
+/* Declare extern the free list to manage sequences of H5G_entry_t's */
+H5FL_SEQ_EXTERN(H5G_entry_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_load
+ *
+ * Purpose:	Loads a symbol table node from the file.
+ *
+ * Return:	Success:	Ptr to the new table.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5G_node_t *
+H5G_node_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+{
+    H5G_node_t		   *sym = NULL;
+    H5WB_t                 *wb = NULL;     /* Wrapped buffer for node data */
+    uint8_t                 node_buf[H5G_NODE_BUF_SIZE]; /* Buffer for node */
+    uint8_t		   *node;           /* Pointer to node buffer */
+    const uint8_t	   *p;
+    H5G_node_t		   *ret_value;	/*for error handling */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /*
+     * Initialize variables.
+     */
+
+    /* Allocate symbol table data structures */
+    if(NULL == (sym = H5FL_CALLOC(H5G_node_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    sym->node_size = H5G_NODE_SIZE(f);
+    if(NULL == (sym->entry = H5FL_SEQ_CALLOC(H5G_entry_t, (size_t)(2 * H5F_SYM_LEAF_K(f)))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Wrap the local buffer for serialized node info */
+    if(NULL == (wb = H5WB_wrap(node_buf, sizeof(node_buf))))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for node */
+    if(NULL == (node = (uint8_t *)H5WB_actual(wb, sym->node_size)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read the serialized symbol table node. */
+    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, sym->node_size, dxpl_id, node) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_READERROR, NULL, "unable to read symbol table node")
+
+    /* Get temporary pointer to serialized node */
+    p = node;
+
+    /* magic */
+    if(HDmemcmp(p, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "bad symbol table node signature")
+    p += 4;
+
+    /* version */
+    if(H5G_NODE_VERS != *p++)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "bad symbol table node version")
+
+    /* reserved */
+    p++;
+
+    /* number of symbols */
+    UINT16DECODE(p, sym->nsyms);
+
+    /* entries */
+    if(H5G__ent_decode_vec(f, &p, sym->entry, sym->nsyms) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "unable to decode symbol table entries")
+
+    /* Set return value */
+    ret_value = sym;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value)
+        if(sym && H5G__node_free(sym) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTFREE, NULL, "unable to destroy symbol table node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_flush
+ *
+ * Purpose:	Flush a symbol table node to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5G_node_t *sym, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5WB_t     *wb = NULL;     /* Wrapped buffer for node data */
+    uint8_t     node_buf[H5G_NODE_BUF_SIZE]; /* Buffer for node */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(sym);
+
+    /*
+     * Write the symbol node to disk.
+     */
+    if(sym->cache_info.is_dirty) {
+        uint8_t	*node;          /* Pointer to node buffer */
+        uint8_t	*p;             /* Pointer into raw data buffer */
+
+        /* Wrap the local buffer for serialized node info */
+        if(NULL == (wb = H5WB_wrap(node_buf, sizeof(node_buf))))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for node */
+        if(NULL == (node = (uint8_t *)H5WB_actual(wb, sym->node_size)))
+            HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to serialized symbol table node */
+        p = node;
+
+        /* magic number */
+        HDmemcpy(p, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += 4;
+
+        /* version number */
+        *p++ = H5G_NODE_VERS;
+
+        /* reserved */
+        *p++ = 0;
+
+        /* number of symbols */
+        UINT16ENCODE(p, sym->nsyms);
+
+        /* entries */
+        if(H5G__ent_encode_vec(f, &p, sym->entry, sym->nsyms) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't serialize")
+        HDmemset(p, 0, sym->node_size - (size_t)(p - node));
+
+	/* Write the serialized symbol table node. */
+        if(H5F_block_write(f, H5FD_MEM_BTREE, addr, sym->node_size, dxpl_id, node) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_WRITEERROR, FAIL, "unable to write symbol table node to the file")
+
+        /* Reset the node's dirty flag */
+        sym->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    /*
+     * Destroy the symbol node?	 This might happen if the node is being
+     * preempted from the cache.
+     */
+    if(destroy)
+        if(H5G_node_dest(f, sym) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_dest
+ *
+ * Purpose:	Destroy a symbol table node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_dest(H5F_t *f, H5G_node_t *sym)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(sym);
+
+    /* Verify that node is clean */
+    HDassert(sym->cache_info.is_dirty == FALSE);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!sym->cache_info.free_file_space_on_destroy || H5F_addr_defined(sym->cache_info.addr));
+
+    /* Check for freeing file space for symbol table node */
+    if(sym->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, sym->cache_info.addr, (hsize_t)sym->node_size) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to free symbol table node")
+    } /* end if */
+
+    /* Destroy symbol table node */
+    if(H5G__node_free(sym) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_clear
+ *
+ * Purpose:	Mark a symbol table node in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 20 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_clear(H5F_t *f, H5G_node_t *sym, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sym);
+
+    /* Reset the node's dirty flag */
+    sym->cache_info.is_dirty = FALSE;
+
+    /*
+     * Destroy the symbol node?	 This might happen if the node is being
+     * preempted from the cache.
+     */
+    if(destroy)
+        if(H5G_node_dest(f, sym) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_size
+ *
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *		H5G_node_t on disk, and return it in *size_ptr.  On failure
+ *		the value of size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_size(const H5F_t H5_ATTR_UNUSED *f, const H5G_node_t *sym, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(size_ptr);
+
+    *size_ptr = sym->node_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5G_node_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gcompact.c b/gatb-core/thirdparty/hdf5/src/H5Gcompact.c
new file mode 100644
index 0000000..89e79cc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gcompact.c
@@ -0,0 +1,648 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gcompact.c
+ *			Sep  5 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Functions for handling compact storage.
+ *
+ *-------------------------------------------------------------------------
+ */
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/* Packages needed by this file... */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+/* Private typedefs */
+
+/* User data for link message iteration when building link table */
+typedef struct {
+    H5G_link_table_t *ltable;   /* Pointer to link table to build */
+    size_t curr_lnk;            /* Current link to operate on */
+} H5G_iter_bt_t;
+
+/* User data for deleting a link in the link messages */
+typedef struct {
+    /* downward */
+    H5F_t       *file;          /* File that object header is located within */
+    hid_t       dxpl_id;        /* DXPL during insertion */
+    H5RS_str_t *grp_full_path_r;/* Full path for group of link */
+    const char *name;           /* Link name to search for */
+} H5G_iter_rm_t;
+
+/* User data for link message iteration when querying link info */
+typedef struct {
+    /* downward */
+    const char *name;           /* Name to search for */
+
+    /* upward */
+    H5O_link_t *lnk;            /* Link struct to fill in */
+    hbool_t found;              /* Flag to indicate that the object was found */
+} H5G_iter_lkp_t;
+
+/* Private macros */
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5G_compact_build_table_cb(const void *_mesg, unsigned idx, void *_udata);
+static herr_t H5G_compact_build_table(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    H5G_link_table_t *ltable);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_compact_build_table_cb
+ *
+ * Purpose:	Callback routine for searching 'link' messages for a particular
+ *              name.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  5 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_compact_build_table_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void *_udata)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_mesg;  /* Pointer to link */
+    H5G_iter_bt_t *udata = (H5G_iter_bt_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value=H5_ITER_CONT;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+    HDassert(udata->curr_lnk < udata->ltable->nlinks);
+
+    /* Copy link message into table */
+    if(NULL == H5O_msg_copy(H5O_LINK_ID, lnk, &(udata->ltable->lnks[udata->curr_lnk])))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+
+    /* Increment current link entry to operate on */
+    udata->curr_lnk++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_compact_build_table_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_compact_build_table
+ *
+ * Purpose:     Builds a table containing a sorted (alphabetically) list of
+ *              links for a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep  6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_compact_build_table(const H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, H5G_link_table_t *ltable)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(linfo);
+    HDassert(ltable);
+
+    /* Set size of table */
+    H5_CHECK_OVERFLOW(linfo->nlinks, hsize_t, size_t);
+    ltable->nlinks = (size_t)linfo->nlinks;
+
+    /* Allocate space for the table entries */
+    if(ltable->nlinks > 0) {
+        H5G_iter_bt_t udata;               /* User data for iteration callback */
+        H5O_mesg_operator_t op;             /* Message operator */
+
+        /* Allocate the link table */
+        if((ltable->lnks = (H5O_link_t *)H5MM_malloc(sizeof(H5O_link_t) * ltable->nlinks)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Set up user data for iteration */
+        udata.ltable = ltable;
+        udata.curr_lnk = 0;
+
+        /* Iterate through the link messages, adding them to the table */
+        op.op_type = H5O_MESG_OP_APP;
+        op.u.app_op = H5G_compact_build_table_cb;
+        if(H5O_msg_iterate(oloc, H5O_LINK_ID, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over link messages")
+
+        /* Sort link table in correct iteration order */
+        if(H5G__link_sort_table(ltable, idx_type, order) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTSORT, FAIL, "error sorting link messages")
+    } /* end if */
+    else
+        ltable->lnks = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_compact_build_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_insert
+ *
+ * Purpose:	Insert a new symbol into the table described by GRP_ENT in
+ *		file F.	 The name of the new symbol is NAME and its symbol
+ *		table entry is OBJ_ENT.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__compact_insert(const H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk,
+    hid_t dxpl_id)
+{
+    herr_t     ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(obj_lnk);
+
+    /* Insert link message into group */
+    if(H5O_msg_create(grp_oloc, H5O_LINK_ID, 0, H5O_UPDATE_TIME, obj_lnk, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_get_name_by_idx
+ *
+ * Purpose:     Returns the name of objects in the group by giving index.
+ *
+ * Return:	Success:        Non-negative, length of name
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep  6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G__compact_get_name_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t idx, char* name, size_t size)
+{
+    H5G_link_table_t    ltable = {0, NULL};         /* Link table */
+    ssize_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /* Build table of all link messages */
+    if(H5G_compact_build_table(oloc, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create link message table")
+
+    /* Check for going out of bounds */
+    if(idx >= ltable.nlinks)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+    /* Get the length of the name */
+    ret_value = (ssize_t)HDstrlen(ltable.lnks[idx].name);
+
+    /* Copy the name into the user's buffer, if given */
+    if(name) {
+        HDstrncpy(name, ltable.lnks[idx].name, MIN((size_t)(ret_value + 1), size));
+        if((size_t)ret_value >= size)
+            name[size - 1]='\0';
+    } /* end if */
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_get_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_compact_remove_common_cb
+ *
+ * Purpose:	Common callback routine for deleting 'link' message for a
+ *              particular name.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  5 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_compact_remove_common_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void *_udata)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_mesg;  /* Pointer to link */
+    H5G_iter_rm_t *udata = (H5G_iter_rm_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+
+    /* If we've found the right link, get the object type */
+    if(HDstrcmp(lnk->name, udata->name) == 0) {
+        /* Replace path names for link being removed */
+        if(H5G__link_name_replace(udata->file, udata->dxpl_id, udata->grp_full_path_r, lnk) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get object type")
+
+        /* Stop the iteration, we found the correct link */
+        HGOTO_DONE(H5_ITER_STOP)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_compact_remove_common_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_remove
+ *
+ * Purpose:	Remove NAME from links.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__compact_remove(const H5O_loc_t *oloc, hid_t dxpl_id, H5RS_str_t *grp_full_path_r,
+    const char *name)
+{
+    H5G_iter_rm_t udata;               /* Data to pass through OH iteration */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(oloc && oloc->file);
+    HDassert(name && *name);
+
+    /* Initialize data to pass through object header iteration */
+    udata.file = oloc->file;
+    udata.dxpl_id = dxpl_id;
+    udata.grp_full_path_r = grp_full_path_r;
+    udata.name = name;
+
+    /* Iterate over the link messages to delete the right one */
+    if(H5O_msg_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_remove_by_idx
+ *
+ * Purpose:	Remove link from group, according to an index order.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__compact_remove_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5RS_str_t *grp_full_path_r, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n)
+{
+    H5G_link_table_t ltable = {0, NULL};/* Link table */
+    H5G_iter_rm_t udata;                /* Data to pass through OH iteration */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(oloc && oloc->file);
+    HDassert(linfo);
+
+    /* Build table of all link messages, sorted according to desired order */
+    if(H5G_compact_build_table(oloc, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create link message table")
+
+    /* Check for going out of bounds */
+    if(n >= ltable.nlinks)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "index out of bound")
+
+    /* Initialize data to pass through object header iteration */
+    udata.file = oloc->file;
+    udata.dxpl_id = dxpl_id;
+    udata.grp_full_path_r = grp_full_path_r;
+    udata.name = ltable.lnks[n].name;
+
+    /* Iterate over the link messages to delete the right one */
+    if(H5O_msg_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link message")
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_iterate
+ *
+ * Purpose:	Iterate over the links in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__compact_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    H5G_lib_iterate_t op, void *op_data)
+{
+    H5G_link_table_t    ltable = {0, NULL};     /* Link table */
+    herr_t		ret_value;              /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(linfo);
+    HDassert(op);
+
+    /* Build table of all link messages */
+    if(H5G_compact_build_table(oloc, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create link message table")
+
+    /* Iterate over links in table */
+    if((ret_value = H5G__link_iterate_table(&ltable, skip, last_lnk, op, op_data)) < 0)
+        HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_compact_lookup_cb
+ *
+ * Purpose:	Callback routine for searching 'link' messages for a particular
+ *              name & gettting object location for it
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 20 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_compact_lookup_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void *_udata)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_mesg;  /* Pointer to link */
+    H5G_iter_lkp_t *udata = (H5G_iter_lkp_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+
+    /* Check for name to get information */
+    if(HDstrcmp(lnk->name, udata->name) == 0) {
+        if(udata->lnk) {
+            /* Copy link information */
+            if(NULL == H5O_msg_copy(H5O_LINK_ID, lnk, udata->lnk))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+        } /* end if */
+
+        /* Indicate that the correct link was found */
+        udata->found = TRUE;
+
+        /* Stop iteration now */
+        HGOTO_DONE(H5_ITER_STOP)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_compact_lookup_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_lookup
+ *
+ * Purpose:	Look up an object relative to a group, using link messages.
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 20 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G__compact_lookup(const H5O_loc_t *oloc, const char *name, H5O_link_t *lnk,
+    hid_t dxpl_id)
+{
+    H5G_iter_lkp_t udata;               /* User data for iteration callback */
+    H5O_mesg_operator_t op;             /* Message operator */
+    htri_t     ret_value;               /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(lnk && oloc->file);
+    HDassert(name && *name);
+
+    /* Set up user data for iteration */
+    udata.name = name;
+    udata.lnk = lnk;
+    udata.found = FALSE;
+
+    /* Iterate through the link messages, adding them to the table */
+    op.op_type = H5O_MESG_OP_APP;
+    op.u.app_op = H5G_compact_lookup_cb;
+    if(H5O_msg_iterate(oloc, H5O_LINK_ID, &op, &udata, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over link messages")
+
+    /* Determine if we found the link we were looking for */
+    ret_value = (htri_t)udata.found;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_lookup_by_idx
+ *
+ * Purpose:	Look up an object in a group using link messages,
+ *              according to the order of an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__compact_lookup_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5O_link_t *lnk)
+{
+    H5G_link_table_t ltable = {0, NULL};/* Link table */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(oloc && oloc->file);
+    HDassert(linfo);
+    HDassert(lnk);
+
+    /* Build table of all link messages, sorted according to desired order */
+    if(H5G_compact_build_table(oloc, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create link message table")
+
+    /* Check for going out of bounds */
+    if(n >= ltable.nlinks)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "index out of bound")
+
+    /* Copy link information */
+    if(NULL == H5O_msg_copy(H5O_LINK_ID, &ltable.lnks[n], lnk))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_lookup_by_idx() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__compact_get_type_by_idx
+ *
+ * Purpose:     Returns the type of objects in the group by giving index.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_obj_t
+H5G__compact_get_type_by_idx(H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    hsize_t idx)
+{
+    H5G_link_table_t    ltable = {0, NULL};         /* Link table */
+    H5G_obj_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /* Build table of all link messages */
+    if(H5G_compact_build_table(oloc, dxpl_id, linfo, H5_INDEX_NAME, H5_ITER_INC, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5G_UNKNOWN, "can't create link message table")
+
+    /* Check for going out of bounds */
+    if(idx >= ltable.nlinks)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, H5G_UNKNOWN, "index out of bound")
+
+    /* Determine type of object */
+    if(ltable.lnks[idx].type == H5L_TYPE_SOFT)
+        ret_value = H5G_LINK;
+    else if(ltable.lnks[idx].type >= H5L_TYPE_UD_MIN)
+        ret_value = H5G_UDLINK;
+    else if(ltable.lnks[idx].type == H5L_TYPE_HARD){
+        H5O_loc_t tmp_oloc;             /* Temporary object location */
+        H5O_type_t obj_type;            /* Type of object at location */
+
+        /* Build temporary object location */
+        tmp_oloc.file = oloc->file;
+        tmp_oloc.addr = ltable.lnks[idx].u.hard.addr;
+
+        /* Get the type of the object */
+        if(H5O_obj_type(&tmp_oloc, &obj_type, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't get object type")
+
+        /* Map to group object type */
+        if(H5G_UNKNOWN == (ret_value = H5G_map_obj_type(obj_type)))
+            HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "can't determine object type")
+    } else {
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "unknown link type")
+    } /* end else */
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, H5G_UNKNOWN, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__compact_get_type_by_idx() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gdense.c b/gatb-core/thirdparty/hdf5/src/H5Gdense.c
new file mode 100644
index 0000000..285355f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gdense.c
@@ -0,0 +1,1890 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gdense.c
+ *			Sep  9 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Routines for operating on "dense" link storage for a
+ *                      group in a file.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Fractal heap creation parameters for "dense" link storage */
+#define H5G_FHEAP_MAN_WIDTH                     4
+#define H5G_FHEAP_MAN_START_BLOCK_SIZE          512
+#define H5G_FHEAP_MAN_MAX_DIRECT_SIZE           (64 * 1024)
+#define H5G_FHEAP_MAN_MAX_INDEX                 32
+#define H5G_FHEAP_MAN_START_ROOT_ROWS           1
+#define H5G_FHEAP_CHECKSUM_DBLOCKS              TRUE
+#define H5G_FHEAP_MAX_MAN_SIZE                  (4 * 1024)
+
+/* v2 B-tree creation macros for 'name' field index */
+#define H5G_NAME_BT2_NODE_SIZE          512
+#define H5G_NAME_BT2_MERGE_PERC         40
+#define H5G_NAME_BT2_SPLIT_PERC         100
+
+/* v2 B-tree creation macros for 'corder' field index */
+#define H5G_CORDER_BT2_NODE_SIZE        512
+#define H5G_CORDER_BT2_MERGE_PERC       40
+#define H5G_CORDER_BT2_SPLIT_PERC       100
+
+/* Size of stack buffer for serialized link */
+#define H5G_LINK_BUF_SIZE               128
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Data exchange structure to use when building table of links in group */
+typedef struct {
+    H5G_link_table_t *ltable;   /* Pointer to link table to build */
+    size_t curr_lnk;            /* Current link to operate on */
+} H5G_dense_bt_ud_t;
+
+/*
+ * Data exchange structure to pass through the v2 B-tree layer for the
+ * H5B2_iterate function when iterating over densely stored links.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    hsize_t     count;                  /* # of links examined               */
+
+    /* downward (from application) */
+    hsize_t     skip;                   /* Number of links to skip           */
+    H5G_lib_iterate_t op;               /* Callback for each link            */
+    void        *op_data;               /* Callback data for each link       */
+
+    /* upward */
+    int         op_ret;                 /* Return value from callback        */
+} H5G_bt2_ud_it_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when iterating over densely stored links.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+
+    /* upward */
+    H5O_link_t  *lnk;                   /* Copy of link                      */
+} H5G_fh_ud_it_t;
+
+/*
+ * Data exchange structure for dense link storage.  This structure is
+ * passed through the v2 B-tree layer when removing links.
+ */
+typedef struct {
+    /* downward */
+    H5G_bt2_ud_common_t common;         /* Common info for B-tree user data (must be first) */
+    hbool_t     rem_from_fheap;         /* Whether to remove the link from the fractal heap */
+    haddr_t     corder_bt2_addr;        /* Address of v2 B-tree indexing creation order */
+    H5RS_str_t *grp_full_path_r;        /* Full path of group where link is removed */
+    hbool_t     replace_names;          /* Whether to replace the names of open objects */
+} H5G_bt2_ud_rm_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when removing a link from densely stored links.
+ */
+typedef struct {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    haddr_t     corder_bt2_addr;        /* Address of v2 B-tree indexing creation order */
+    H5RS_str_t *grp_full_path_r;        /* Full path of group where link is removed */
+    hbool_t     replace_names;          /* Whether to replace the names of open objects */
+} H5G_fh_ud_rm_t;
+
+/*
+ * Data exchange structure for dense link storage.  This structure is
+ * passed through the v2 B-tree layer when removing links by index.
+ */
+typedef struct {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    H5_index_t idx_type;                /* Primary index for removing link */
+    haddr_t     other_bt2_addr;         /* Address of "other" v2 B-tree indexing link */
+    H5RS_str_t *grp_full_path_r;        /* Full path of group where link is removed */
+} H5G_bt2_ud_rmbi_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when removing a link from densely stored links by index.
+ */
+typedef struct {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+
+    /* upward */
+    H5O_link_t *lnk;                    /* Pointer to link to remove */
+} H5G_fh_ud_rmbi_t;
+
+/*
+ * Data exchange structure to pass through the v2 B-tree layer for the
+ * H5B2_index function when retrieving the name of a link by index.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+
+    /* downward (from application) */
+    char        *name;                  /* Name buffer to fill               */
+    size_t      name_size;              /* Size of name buffer to fill       */
+
+    /* upward */
+    ssize_t     name_len;               /* Full length of name               */
+} H5G_bt2_ud_gnbi_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when retrieving the name of a link by index.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+
+    /* downward (from application) */
+    char        *name;                  /* Name buffer to fill               */
+    size_t      name_size;              /* Size of name buffer to fill       */
+
+    /* upward */
+    ssize_t     name_len;               /* Full length of name               */
+} H5G_fh_ud_gnbi_t;
+
+/*
+ * Data exchange structure to pass through the v2 B-tree layer for the
+ * H5B2_index function when retrieving a link by index.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+
+    /* upward */
+    H5O_link_t  *lnk;                   /* Pointer to link                   */
+} H5G_bt2_ud_lbi_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when retrieving a link by index.
+ */
+typedef struct {
+    /* downward (internal) */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+
+    /* upward */
+    H5O_link_t  *lnk;                   /* Pointer to link                   */
+} H5G_fh_ud_lbi_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_create
+ *
+ * Purpose:	Creates dense link storage structures for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_create(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
+    const H5O_pline_t *pline)
+{
+    H5HF_create_t fheap_cparam;         /* Fractal heap creation parameters */
+    H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for names */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order */
+    size_t fheap_id_len;                /* Fractal heap ID length */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* Set fractal heap creation parameters */
+/* XXX: Give some control of these to applications? */
+    HDmemset(&fheap_cparam, 0, sizeof(fheap_cparam));
+    fheap_cparam.managed.width = H5G_FHEAP_MAN_WIDTH;
+    fheap_cparam.managed.start_block_size = H5G_FHEAP_MAN_START_BLOCK_SIZE;
+    fheap_cparam.managed.max_direct_size = H5G_FHEAP_MAN_MAX_DIRECT_SIZE;
+    fheap_cparam.managed.max_index = H5G_FHEAP_MAN_MAX_INDEX;
+    fheap_cparam.managed.start_root_rows = H5G_FHEAP_MAN_START_ROOT_ROWS;
+    fheap_cparam.checksum_dblocks = H5G_FHEAP_CHECKSUM_DBLOCKS;
+    fheap_cparam.max_man_size = H5G_FHEAP_MAX_MAN_SIZE;
+    if(pline)
+        fheap_cparam.pline = *pline;
+
+    /* Create fractal heap for storing links */
+    if(NULL == (fheap = H5HF_create(f, dxpl_id, &fheap_cparam)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create fractal heap")
+
+    /* Retrieve the heap's address in the file */
+    if(H5HF_get_heap_addr(fheap, &(linfo->fheap_addr)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get fractal heap address")
+#ifdef QAK
+HDfprintf(stderr, "%s: linfo->fheap_addr = %a\n", FUNC, linfo->fheap_addr);
+#endif /* QAK */
+
+    /* Retrieve the heap's ID length in the file */
+    if(H5HF_get_id_len(fheap, &fheap_id_len) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't get fractal heap ID length")
+    HDassert(fheap_id_len == H5G_DENSE_FHEAP_ID_LEN);
+#ifdef QAK
+HDfprintf(stderr, "%s: fheap_id_len = %Zu\n", FUNC, fheap_id_len);
+#endif /* QAK */
+
+    /* Create the name index v2 B-tree */
+    HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
+    bt2_cparam.cls = H5G_BT2_NAME;
+    bt2_cparam.node_size = (size_t)H5G_NAME_BT2_NODE_SIZE;
+    bt2_cparam.rrec_size = 4 +          /* Name's hash value */
+            fheap_id_len;               /* Fractal heap ID */
+    bt2_cparam.split_percent = H5G_NAME_BT2_SPLIT_PERC;
+    bt2_cparam.merge_percent = H5G_NAME_BT2_MERGE_PERC;
+    if(NULL == (bt2_name = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create v2 B-tree for name index")
+
+    /* Retrieve the v2 B-tree's address in the file */
+    if(H5B2_get_addr(bt2_name, &(linfo->name_bt2_addr)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get v2 B-tree address for name index")
+#ifdef QAK
+HDfprintf(stderr, "%s: linfo->name_bt2_addr = %a\n", FUNC, linfo->name_bt2_addr);
+#endif /* QAK */
+
+    /* Check if we should create a creation order index v2 B-tree */
+    if(linfo->index_corder) {
+        /* Create the creation order index v2 B-tree */
+        HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
+        bt2_cparam.cls = H5G_BT2_CORDER;
+        bt2_cparam.node_size = (size_t)H5G_CORDER_BT2_NODE_SIZE;
+        bt2_cparam.rrec_size = 8 +      /* Creation order value */
+                fheap_id_len;           /* Fractal heap ID */
+        bt2_cparam.split_percent = H5G_CORDER_BT2_SPLIT_PERC;
+        bt2_cparam.merge_percent = H5G_CORDER_BT2_MERGE_PERC;
+        if(NULL == (bt2_corder = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create v2 B-tree for creation order index")
+
+        /* Retrieve the v2 B-tree's address in the file */
+        if(H5B2_get_addr(bt2_corder, &(linfo->corder_bt2_addr)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get v2 B-tree address for creation order index")
+#ifdef QAK
+HDfprintf(stderr, "%s: linfo->corder_bt2_addr = %a\n", FUNC, linfo->corder_bt2_addr);
+#endif /* QAK */
+    } /* end if */
+
+done:
+    /* Close the open objects */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_insert
+ *
+ * Purpose:	Insert a link into the  dense link storage structures for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    const H5O_link_t *lnk)
+{
+    H5G_bt2_ud_ins_t udata;             /* User data for v2 B-tree insertion */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5B2_t *bt2_corder = NULL;          /* v2 B-tree handle for creation order index */
+    size_t link_size;                   /* Size of serialized link in the heap */
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for link data */
+    uint8_t link_buf[H5G_LINK_BUF_SIZE];        /* Buffer for serializing link */
+    void *link_ptr = NULL;              /* Pointer to serialized link */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(lnk);
+#ifdef QAK
+HDfprintf(stderr, "%s: linfo->fheap_addr = %a\n", FUNC, linfo->fheap_addr);
+HDfprintf(stderr, "%s: linfo->name_bt2_addr = %a\n", FUNC, linfo->name_bt2_addr);
+#endif /* QAK */
+
+    /* Find out the size of buffer needed for serialized link */
+    if((link_size = H5O_msg_raw_size(f, H5O_LINK_ID, FALSE, lnk)) == 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't get link size")
+#ifdef QAK
+HDfprintf(stderr, "%s: HDstrlen(lnk->name) = %Zu, link_size = %Zu\n", FUNC, HDstrlen(lnk->name), link_size);
+#endif /* QAK */
+
+    /* Wrap the local buffer for serialized link */
+    if(NULL == (wb = H5WB_wrap(link_buf, sizeof(link_buf))))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for link */
+    if(NULL == (link_ptr = H5WB_actual(wb, link_size)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+    /* Create serialized form of link */
+    if(H5O_msg_encode(f, H5O_LINK_ID, FALSE, (unsigned char *)link_ptr, lnk) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't encode link")
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Insert the serialized link into the fractal heap */
+    if(H5HF_insert(fheap, dxpl_id, link_size, link_ptr, udata.id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into fractal heap")
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, linfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Create the callback information for v2 B-tree record insertion */
+    udata.common.f = f;
+    udata.common.dxpl_id = dxpl_id;
+    udata.common.fheap = fheap;
+    udata.common.name = lnk->name;
+    udata.common.name_hash = H5_checksum_lookup3(lnk->name, HDstrlen(lnk->name), 0);
+    udata.common.corder = lnk->corder;
+    udata.common.found_op = NULL;
+    udata.common.found_op_data = NULL;
+    /* udata.id already set in H5HF_insert() call */
+
+    /* Insert link into 'name' tracking v2 B-tree */
+    if(H5B2_insert(bt2_name, dxpl_id, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert record into v2 B-tree")
+
+    /* Check if we should create a creation order index v2 B-tree record */
+    if(linfo->index_corder) {
+        /* Open the creation order index v2 B-tree */
+        HDassert(H5F_addr_defined(linfo->corder_bt2_addr));
+        if(NULL == (bt2_corder = H5B2_open(f, dxpl_id, linfo->corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Insert the record into the creation order index v2 B-tree */
+        if(H5B2_insert(bt2_corder, dxpl_id, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert record into v2 B-tree")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_lookup_cb
+ *
+ * Purpose:	Callback when a link is located in an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_lookup_cb(const void *_lnk, void *_user_lnk)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_lnk; /* Record from B-tree */
+    H5O_link_t *user_lnk = (H5O_link_t *)_user_lnk;       /* User data from v2 B-tree link lookup */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(lnk);
+    HDassert(user_lnk);
+
+    /* Copy link information */
+    if(H5O_msg_copy(H5O_LINK_ID, lnk, user_lnk) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_lookup_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_lookup
+ *
+ * Purpose:	Look up a link within a group that uses dense link storage
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G__dense_lookup(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    const char *name, H5O_link_t *lnk)
+{
+    H5G_bt2_ud_common_t udata;          /* User data for v2 B-tree link lookup */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(name && *name);
+    HDassert(lnk);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(f, dxpl_id, linfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Construct the user data for v2 B-tree callback */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.fheap = fheap;
+    udata.name = name;
+    udata.name_hash = H5_checksum_lookup3(name, HDstrlen(name), 0);
+    udata.found_op = H5G_dense_lookup_cb;       /* v2 B-tree comparison callback */
+    udata.found_op_data = lnk;
+
+    /* Find & copy the named link in the 'name' index */
+    if((ret_value = H5B2_find(bt2_name, dxpl_id, &udata, NULL, NULL)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to locate link in name index")
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_lookup_by_idx_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator, to make copy of link when
+ *              when lookup up a link by index
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_lookup_by_idx_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_lbi_t *udata = (H5G_fh_ud_lbi_t *)_udata;       /* User data for fractal heap 'op' callback */
+    H5O_link_t *tmp_lnk = NULL;         /* Temporary pointer to link */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information & keep a copy */
+    if(NULL == (tmp_lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
+
+    /* Copy link information */
+    if(NULL == H5O_msg_copy(H5O_LINK_ID, tmp_lnk, udata->lnk))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+
+done:
+    /* Release the space allocated for the link */
+    if(tmp_lnk)
+        H5O_msg_free(H5O_LINK_ID, tmp_lnk);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_lookup_by_idx_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_lookup_by_idx_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense link storage lookup by index
+ *
+ * Return:	H5_ITER_ERROR/H5_ITER_CONT/H5_ITER_STOP
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_lookup_by_idx_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5G_dense_bt2_name_rec_t *record = (const H5G_dense_bt2_name_rec_t *)_record;
+    H5G_bt2_ud_lbi_t *bt2_udata = (H5G_bt2_ud_lbi_t *)_bt2_udata;         /* User data for callback */
+    H5G_fh_ud_lbi_t fh_udata;          /* User data for fractal heap 'op' callback */
+    int ret_value = H5_ITER_CONT;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Prepare user data for callback */
+    /* down */
+    fh_udata.f = bt2_udata->f;
+    fh_udata.dxpl_id = bt2_udata->dxpl_id;
+    fh_udata.lnk = bt2_udata->lnk;
+
+    /* Call fractal heap 'op' routine, to copy the link information */
+    if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, record->id,
+            H5G_dense_lookup_by_idx_fh_cb, &fh_udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, H5_ITER_ERROR, "link found callback failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_lookup_by_idx_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_lookup_by_idx
+ *
+ * Purpose:	Look up a link within a group that uses dense link storage,
+ *              according to the order of an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_lookup_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5O_link_t *lnk)
+{
+    H5HF_t *fheap = NULL;                     /* Fractal heap handle */
+    H5G_link_table_t ltable = {0, NULL};      /* Table of links */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(lnk);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Since names are hashed, getting them in strictly increasing or
+         *      decreasing order requires building a table and sorting it.
+         *      If the order is native, use the B-tree for names.
+         */
+        bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links and the order is native, use the B-tree for names.
+         *      Otherwise, build a table.
+         */
+        bt2_addr = linfo->corder_bt2_addr;
+    } /* end else */
+
+    /* If the order is native and there's no B-tree for indexing the links,
+     * use the B-tree for names instead of building a table to speed up the
+     * process.
+     */
+    if(order == H5_ITER_NATIVE && !H5F_addr_defined(bt2_addr)) {
+        bt2_addr = linfo->name_bt2_addr;
+        HDassert(H5F_addr_defined(bt2_addr));
+    } /* end if */
+
+    /* If there is an index defined for the field, use it */
+    if(H5F_addr_defined(bt2_addr)) {
+        H5G_bt2_ud_lbi_t udata;        /* User data for v2 B-tree link lookup */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Construct the user data for v2 B-tree callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.lnk = lnk;
+
+        /* Find & copy the link in the appropriate index */
+        if(H5B2_index(bt2, dxpl_id, order, n, H5G_dense_lookup_by_idx_bt2_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to locate link in index")
+    } /* end if */
+    else {      /* Otherwise, we need to build a table of the links and sort it */
+        /* Build the table of links for this group */
+        if(H5G__dense_build_table(f, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "error building table of links")
+
+        /* Check for going out of bounds */
+        if(n >= ltable.nlinks)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+        /* Copy link information */
+        if(NULL == H5O_msg_copy(H5O_LINK_ID, &ltable.lnks[n], lnk))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_lookup_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_build_table_cb
+ *
+ * Purpose:	Callback routine for building table of links from dense
+ *              link storage.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sept 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_build_table_cb(const H5O_link_t *lnk, void *_udata)
+{
+    H5G_dense_bt_ud_t *udata = (H5G_dense_bt_ud_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+    HDassert(udata->curr_lnk < udata->ltable->nlinks);
+
+    /* Copy link information */
+    if(H5O_msg_copy(H5O_LINK_ID, lnk, &(udata->ltable->lnks[udata->curr_lnk])) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy link message")
+
+    /* Increment number of links stored */
+    udata->curr_lnk++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_build_table_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_build_table
+ *
+ * Purpose:     Builds a table containing a sorted list of links for a group
+ *
+ * Note:	Used for building table of links in non-native iteration order
+ *		for an index
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep 25, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_build_table(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, H5G_link_table_t *ltable)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(ltable);
+
+    /* Set size of table */
+    H5_CHECK_OVERFLOW(linfo->nlinks, /* From: */ hsize_t, /* To: */ size_t);
+    ltable->nlinks = (size_t)linfo->nlinks;
+
+    /* Allocate space for the table entries */
+    if(ltable->nlinks > 0) {
+        H5G_dense_bt_ud_t udata;       /* User data for iteration callback */
+
+        /* Allocate the table to store the links */
+        if((ltable->lnks = (H5O_link_t *)H5MM_malloc(sizeof(H5O_link_t) * ltable->nlinks)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Set up user data for iteration */
+        udata.ltable = ltable;
+        udata.curr_lnk = 0;
+
+        /* Iterate over the links in the group, building a table of the link messages */
+        if(H5G__dense_iterate(f, dxpl_id, linfo, H5_INDEX_NAME, H5_ITER_NATIVE, (hsize_t)0, NULL, H5G_dense_build_table_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over links")
+
+        /* Sort link table in correct iteration order */
+        if(H5G__link_sort_table(ltable, idx_type, order) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTSORT, FAIL, "error sorting link messages")
+    } /* end if */
+    else
+        ltable->lnks = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_build_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_iterate_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator, to make user's callback
+ *              when iterating over links
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_iterate_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_it_t *udata = (H5G_fh_ud_it_t *)_udata;       /* User data for fractal heap 'op' callback */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information & keep a copy */
+    /* (we make a copy instead of calling the user/library callback directly in
+     *  this routine because this fractal heap 'op' callback routine is called
+     *  with the direct block protected and if the callback routine invokes an
+     *  HDF5 routine, it could attempt to re-protect that direct block for the
+     *  heap, causing the HDF5 routine called to fail - QAK)
+     */
+    if(NULL == (udata->lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_iterate_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_iterate_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense link storage iterator
+ *
+ * Return:	H5_ITER_ERROR/H5_ITER_CONT/H5_ITER_STOP
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_iterate_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5G_dense_bt2_name_rec_t *record = (const H5G_dense_bt2_name_rec_t *)_record;
+    H5G_bt2_ud_it_t *bt2_udata = (H5G_bt2_ud_it_t *)_bt2_udata;         /* User data for callback */
+    herr_t ret_value = H5_ITER_CONT;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check for skipping links */
+    if(bt2_udata->skip > 0)
+        --bt2_udata->skip;
+    else {
+        H5G_fh_ud_it_t fh_udata;       /* User data for fractal heap 'op' callback */
+
+        /* Prepare user data for callback */
+        /* down */
+        fh_udata.f = bt2_udata->f;
+        fh_udata.dxpl_id = bt2_udata->dxpl_id;
+
+        /* Call fractal heap 'op' routine, to copy the link information */
+        if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, record->id,
+                H5G_dense_iterate_fh_cb, &fh_udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, H5_ITER_ERROR, "heap op callback failed")
+
+        /* Make the callback */
+        ret_value = (bt2_udata->op)(fh_udata.lnk, bt2_udata->op_data);
+
+        /* Release the space allocated for the link */
+        H5O_msg_free(H5O_LINK_ID, fh_udata.lnk);
+    } /* end else */
+
+    /* Increment the number of entries passed through */
+    /* (whether we skipped them or not) */
+    bt2_udata->count++;
+
+    /* Check for callback failure and pass along return value */
+    if(ret_value < 0)
+        HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_iterate_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_iterate
+ *
+ * Purpose:	Iterate over the objects in a group using dense link storage
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_iterate(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    H5G_lib_iterate_t op, void *op_data)
+{
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5G_link_table_t ltable = {0, NULL};      /* Table of links */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
+    herr_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(op);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Since names are hashed, getting them in strictly increasing or
+         * decreasing order requires building a table and sorting it. If
+         * the order is native, use the B-tree for names.
+         */
+        bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links and the order is native, use the B-tree for names.
+         *      Otherwise, build a table.
+         */
+        bt2_addr = linfo->corder_bt2_addr;
+    } /* end else */
+
+    /* If the order is native and there's no B-tree for indexing the links,
+     * use the B-tree for names instead of building a table to speed up the
+     * process.
+     */
+    if(order == H5_ITER_NATIVE && !H5F_addr_defined(bt2_addr)) {
+        HDassert(H5F_addr_defined(linfo->name_bt2_addr));
+        bt2_addr = linfo->name_bt2_addr;
+    } /* end if */
+
+    /* Check on iteration order */
+    if(order == H5_ITER_NATIVE) {
+        H5G_bt2_ud_it_t udata;              /* User data for iterator callback */
+
+        /* Sanity check */
+        HDassert(H5F_addr_defined(bt2_addr));
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Construct the user data for v2 B-tree iterator callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.skip = skip;
+        udata.count = 0;
+        udata.op = op;
+        udata.op_data = op_data;
+
+        /* Iterate over the records in the v2 B-tree's "native" order */
+        /* (by hash of name) */
+        if((ret_value = H5B2_iterate(bt2, dxpl_id, H5G_dense_iterate_bt2_cb, &udata)) < 0)
+            HERROR(H5E_SYM, H5E_BADITER, "link iteration failed");
+
+        /* Update the last link examined, if requested */
+        if(last_lnk)
+            *last_lnk = udata.count;
+    } /* end if */
+    else {
+        /* Build the table of links for this group */
+        if(H5G__dense_build_table(f, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "error building table of links")
+
+        /* Iterate over links in table */
+        if((ret_value = H5G__link_iterate_table(&ltable, skip, last_lnk, op, op_data)) < 0)
+            HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_get_name_by_idx_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator, to retrieve name according
+ *              to an index
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 19 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_get_name_by_idx_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_gnbi_t *udata = (H5G_fh_ud_gnbi_t *)_udata;       /* User data for fractal heap 'op' callback */
+    H5O_link_t *lnk;            /* Pointer to link created from heap object */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information */
+    if(NULL == (lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
+
+    /* Get the length of the name */
+    udata->name_len = (ssize_t)HDstrlen(lnk->name);
+
+    /* Copy the name into the user's buffer, if given */
+    if(udata->name) {
+        HDstrncpy(udata->name, lnk->name, MIN((size_t)(udata->name_len + 1), udata->name_size));
+        if((size_t)udata->name_len >= udata->name_size)
+            udata->name[udata->name_size - 1] = '\0';
+    } /* end if */
+
+    /* Release the space allocated for the link */
+    H5O_msg_free(H5O_LINK_ID, lnk);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_get_name_by_idx_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_get_name_by_idx_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense link storage 'get name by idx' call
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 19 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_get_name_by_idx_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5G_dense_bt2_name_rec_t *record = (const H5G_dense_bt2_name_rec_t *)_record;
+    H5G_bt2_ud_gnbi_t *bt2_udata = (H5G_bt2_ud_gnbi_t *)_bt2_udata;         /* User data for callback */
+    H5G_fh_ud_gnbi_t fh_udata;         /* User data for fractal heap 'op' callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Prepare user data for callback */
+    /* down */
+    fh_udata.f = bt2_udata->f;
+    fh_udata.dxpl_id = bt2_udata->dxpl_id;
+    fh_udata.name = bt2_udata->name;
+    fh_udata.name_size = bt2_udata->name_size;
+
+    /* Call fractal heap 'op' routine, to perform user callback */
+    if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, record->id,
+            H5G_dense_get_name_by_idx_fh_cb, &fh_udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, FAIL, "link found callback failed")
+
+    /* Set the name's full length to return */
+    bt2_udata->name_len = fh_udata.name_len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_get_name_by_idx_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_get_name_by_idx
+ *
+ * Purpose:     Returns the name of objects in the group by giving index.
+ *
+ * Return:	Success:        Non-negative, length of name
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 19 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G__dense_get_name_by_idx(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, char *name,
+    size_t size)
+{
+    H5HF_t *fheap = NULL;       /* Fractal heap handle */
+    H5G_link_table_t ltable = {0, NULL};      /* Table of links */
+    H5B2_t *bt2 = NULL;         /* v2 B-tree handle for index */
+    haddr_t bt2_addr;           /* Address of v2 B-tree to use for lookup */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Since names are hashed, getting them in strictly increasing or
+         * decreasing order requires building a table and sorting it.  If
+         * the order is native, use the B-tree for names.
+         */
+        bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links and the order is native, use the B-tree for names.
+         *      Otherwise, build a table.
+         */
+        bt2_addr = linfo->corder_bt2_addr;
+    } /* end else */
+
+    /* If the order is native and there's no B-tree for indexing the links,
+     * use the B-tree for names instead of building a table to speed up the
+     * process.
+     */
+    if(order == H5_ITER_NATIVE && !H5F_addr_defined(bt2_addr)) {
+        bt2_addr = linfo->name_bt2_addr;
+        HDassert(H5F_addr_defined(bt2_addr));
+    } /* end if */
+
+    /* If there is an index defined for the field, use it */
+    if(H5F_addr_defined(bt2_addr)) {
+        H5G_bt2_ud_gnbi_t udata;       /* User data for v2 B-tree callback */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Set up the user data for the v2 B-tree 'record remove' callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.name = name;
+        udata.name_size = size;
+
+        /* Retrieve the name according to the v2 B-tree's index order */
+        if(H5B2_index(bt2, dxpl_id, order, n, H5G_dense_get_name_by_idx_bt2_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTLIST, FAIL, "can't locate object in v2 B-tree")
+
+        /* Set return value */
+        ret_value = udata.name_len;
+    } /* end if */
+    else {      /* Otherwise, we need to build a table of the links and sort it */
+        /* Build the table of links for this group */
+        if(H5G__dense_build_table(f, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "error building table of links")
+
+        /* Check for going out of bounds */
+        if(n >= ltable.nlinks)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+        /* Get the length of the name */
+        ret_value = (ssize_t)HDstrlen(ltable.lnks[n].name);
+
+        /* Copy the name into the user's buffer, if given */
+        if(name) {
+            HDstrncpy(name, ltable.lnks[n].name, MIN((size_t)(ret_value + 1), size));
+            if((size_t)ret_value >= size)
+                name[size - 1]='\0';
+        } /* end if */
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_get_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_remove_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator when removing links
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_remove_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_rm_t *udata = (H5G_fh_ud_rm_t *)_udata;       /* User data for fractal heap 'op' callback */
+    H5O_link_t *lnk = NULL;             /* Pointer to link created from heap object */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information */
+    if(NULL == (lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
+
+    /* Check for removing the link from the creation order index */
+    if(H5F_addr_defined(udata->corder_bt2_addr)) {
+        H5G_bt2_ud_common_t bt2_udata;         /* Info for B-tree callbacks */
+
+        /* Open the creation order index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(udata->f, udata->dxpl_id, udata->corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Set up the user data for the v2 B-tree 'record remove' callback */
+        HDassert(lnk->corder_valid);
+        bt2_udata.corder = lnk->corder;
+
+        /* Remove the record from the name index v2 B-tree */
+        if(H5B2_remove(bt2, udata->dxpl_id, &bt2_udata, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from creation order index v2 B-tree")
+    } /* end if */
+
+    /* Replace open objects' names, if requested */
+    if(udata->replace_names)
+        if(H5G__link_name_replace(udata->f, udata->dxpl_id, udata->grp_full_path_r, lnk) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTRENAME, FAIL, "unable to rename open objects")
+
+    /* Perform the deletion action on the link, if requested */
+    /* (call message "delete" callback directly: *ick* - QAK) */
+    if(H5O_link_delete(udata->f, udata->dxpl_id, NULL, lnk) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link")
+
+done:
+    /* Release resources */
+    if(bt2 && H5B2_close(bt2, udata->dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for creation order index")
+    if(lnk)
+        H5O_msg_free(H5O_LINK_ID, lnk);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_remove_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_remove_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense link storage record removal
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_remove_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    const H5G_dense_bt2_name_rec_t *record = (const H5G_dense_bt2_name_rec_t *)_record;
+    H5G_bt2_ud_rm_t *bt2_udata = (H5G_bt2_ud_rm_t *)_bt2_udata;         /* User data for callback */
+    H5G_fh_ud_rm_t fh_udata;          /* User data for fractal heap 'op' callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set up the user data for fractal heap 'op' callback */
+    fh_udata.f = bt2_udata->common.f;
+    fh_udata.dxpl_id = bt2_udata->common.dxpl_id;
+    fh_udata.corder_bt2_addr = bt2_udata->corder_bt2_addr;
+    fh_udata.grp_full_path_r = bt2_udata->grp_full_path_r;
+    fh_udata.replace_names = bt2_udata->replace_names;
+
+    /* Call fractal heap 'op' routine, to perform user callback */
+    if(H5HF_op(bt2_udata->common.fheap, bt2_udata->common.dxpl_id, record->id,
+            H5G_dense_remove_fh_cb, &fh_udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, FAIL, "link removal callback failed")
+
+    /* Remove record from fractal heap, if requested */
+    if(bt2_udata->rem_from_fheap)
+        if(H5HF_remove(bt2_udata->common.fheap, bt2_udata->common.dxpl_id, record->id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from fractal heap")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_remove_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_remove
+ *
+ * Purpose:	Remove a link from the dense storage of a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5RS_str_t *grp_full_path_r, const char *name)
+{
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5G_bt2_ud_rm_t udata;              /* User data for v2 B-tree record removal */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(name && *name);
+
+    /* Open the fractal heap */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2 = H5B2_open(f, dxpl_id, linfo->name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Set up the user data for the v2 B-tree 'record remove' callback */
+    udata.common.f = f;
+    udata.common.dxpl_id = dxpl_id;
+    udata.common.fheap = fheap;
+    udata.common.name = name;
+    udata.common.name_hash = H5_checksum_lookup3(name, HDstrlen(name), 0);
+    udata.common.found_op = NULL;
+    udata.common.found_op_data = NULL;
+    udata.rem_from_fheap = TRUE;
+    udata.corder_bt2_addr = linfo->corder_bt2_addr;
+    udata.grp_full_path_r = grp_full_path_r;
+    udata.replace_names = TRUE;
+
+    /* Remove the record from the name index v2 B-tree */
+    if(H5B2_remove(bt2, dxpl_id, &udata, H5G_dense_remove_bt2_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from name index v2 B-tree")
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_remove_by_idx_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator when removing links by index
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_remove_by_idx_fh_cb(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+{
+    H5G_fh_ud_rmbi_t *udata = (H5G_fh_ud_rmbi_t *)_udata;       /* User data for fractal heap 'op' callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode link information */
+    if(NULL == (udata->lnk = (H5O_link_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_LINK_ID, (const unsigned char *)obj)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, H5_ITER_ERROR, "can't decode link")
+
+    /* Can't operate on link here because the fractal heap block is locked */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_remove_by_idx_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_dense_remove_by_idx_bt2_cb
+ *
+ * Purpose:	v2 B-tree callback for dense link storage record removal by index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_dense_remove_by_idx_bt2_cb(const void *_record, void *_bt2_udata)
+{
+    H5G_bt2_ud_rmbi_t *bt2_udata = (H5G_bt2_ud_rmbi_t *)_bt2_udata;         /* User data for callback */
+    H5G_fh_ud_rmbi_t fh_udata;          /* User data for fractal heap 'op' callback */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    const uint8_t *heap_id;             /* Heap ID for link */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Determine the index being used */
+    if(bt2_udata->idx_type == H5_INDEX_NAME) {
+        const H5G_dense_bt2_name_rec_t *record = (const H5G_dense_bt2_name_rec_t *)_record;
+
+        /* Set the heap ID to operate on */
+        heap_id = record->id;
+    } /* end if */
+    else {
+        const H5G_dense_bt2_corder_rec_t *record = (const H5G_dense_bt2_corder_rec_t *)_record;
+
+        HDassert(bt2_udata->idx_type == H5_INDEX_CRT_ORDER);
+
+        /* Set the heap ID to operate on */
+        heap_id = record->id;
+    } /* end else */
+
+    /* Set up the user data for fractal heap 'op' callback */
+    fh_udata.f = bt2_udata->f;
+    fh_udata.dxpl_id = bt2_udata->dxpl_id;
+    fh_udata.lnk = NULL;
+
+    /* Call fractal heap 'op' routine, to perform user callback */
+    if(H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, heap_id,
+            H5G_dense_remove_by_idx_fh_cb, &fh_udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, FAIL, "link removal callback failed")
+    HDassert(fh_udata.lnk);
+
+    /* Check for removing the link from the "other" index (creation order, when name used and vice versa) */
+    if(H5F_addr_defined(bt2_udata->other_bt2_addr)) {
+        H5G_bt2_ud_common_t other_bt2_udata;    /* Info for B-tree callbacks */
+
+        /* Determine the index being used */
+        if(bt2_udata->idx_type == H5_INDEX_NAME) {
+            /* Set up the user data for the v2 B-tree 'record remove' callback */
+            other_bt2_udata.corder = fh_udata.lnk->corder;
+        } /* end if */
+        else {
+            HDassert(bt2_udata->idx_type == H5_INDEX_CRT_ORDER);
+
+            /* Set up the user data for the v2 B-tree 'record remove' callback */
+            other_bt2_udata.f = bt2_udata->f;
+            other_bt2_udata.dxpl_id = bt2_udata->dxpl_id;
+            other_bt2_udata.fheap = bt2_udata->fheap;
+            other_bt2_udata.name = fh_udata.lnk->name;
+            other_bt2_udata.name_hash = H5_checksum_lookup3(fh_udata.lnk->name, HDstrlen(fh_udata.lnk->name), 0);
+            other_bt2_udata.found_op = NULL;
+            other_bt2_udata.found_op_data = NULL;
+        } /* end else */
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(bt2_udata->f, bt2_udata->dxpl_id, bt2_udata->other_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for 'other' index")
+
+        /* Set the common information for the v2 B-tree remove operation */
+
+        /* Remove the record from the name index v2 B-tree */
+        if(H5B2_remove(bt2, bt2_udata->dxpl_id, &other_bt2_udata, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, H5_ITER_ERROR, "unable to remove link from 'other' index v2 B-tree")
+    } /* end if */
+
+    /* Replace open objects' names */
+    if(H5G__link_name_replace(bt2_udata->f, bt2_udata->dxpl_id, bt2_udata->grp_full_path_r, fh_udata.lnk) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTRENAME, FAIL, "unable to rename open objects")
+
+    /* Perform the deletion action on the link */
+    /* (call link message "delete" callback directly: *ick* - QAK) */
+    if(H5O_link_delete(bt2_udata->f, bt2_udata->dxpl_id, NULL, fh_udata.lnk) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link")
+
+    /* Release the space allocated for the link */
+    H5O_msg_free(H5O_LINK_ID, fh_udata.lnk);
+
+    /* Remove record from fractal heap */
+    if(H5HF_remove(bt2_udata->fheap, bt2_udata->dxpl_id, heap_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from fractal heap")
+
+done:
+    /* Release resources */
+    if(bt2 && H5B2_close(bt2, bt2_udata->dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for 'other' index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_dense_remove_by_idx_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_remove_by_idx
+ *
+ * Purpose:	Remove a link from the dense storage of a group, according to
+ *              to the offset in an indexed order
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5RS_str_t *grp_full_path_r, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t n)
+{
+    H5HF_t *fheap = NULL;                     /* Fractal heap handle */
+    H5G_link_table_t ltable = {0, NULL};      /* Table of links */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* Determine the address of the index to use */
+    if(idx_type == H5_INDEX_NAME) {
+        /* Since names are hashed, getting them in strictly increasing or
+         * decreasing order requires building a table and sorting it.  If
+         * the order is native, use the B-tree for names.
+         */
+        bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+
+        /* This address may not be defined if creation order is tracked, but
+         *      there's no index on it.  If there's no v2 B-tree that indexes
+         *      the links and the order is native, use the B-tree for names.
+         *      Otherwise, build a table.
+         */
+        bt2_addr = linfo->corder_bt2_addr;
+    } /* end else */
+
+    /* If the order is native and there's no B-tree for indexing the links,
+     * use the B-tree for names instead of building a table to speed up the
+     * process.
+     */
+    if(order == H5_ITER_NATIVE && !H5F_addr_defined(bt2_addr)) {
+        bt2_addr = linfo->name_bt2_addr;
+        HDassert(H5F_addr_defined(bt2_addr));
+    } /* end if */
+
+    /* If there is an index defined for the field, use it */
+    if(H5F_addr_defined(bt2_addr)) {
+        H5G_bt2_ud_rmbi_t udata;            /* User data for v2 B-tree record removal */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for index")
+
+        /* Set up the user data for the v2 B-tree 'remove by index' callback */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.fheap = fheap;
+        udata.idx_type = idx_type;
+        udata.other_bt2_addr = idx_type == H5_INDEX_NAME ? linfo->corder_bt2_addr : linfo->name_bt2_addr;
+        udata.grp_full_path_r = grp_full_path_r;
+
+        /* Remove the record from the name index v2 B-tree */
+        if(H5B2_remove_by_idx(bt2, dxpl_id, order, n, H5G_dense_remove_by_idx_bt2_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from indexed v2 B-tree")
+    } /* end if */
+    else {      /* Otherwise, we need to build a table of the links and sort it */
+        /* Build the table of links for this group */
+        if(H5G__dense_build_table(f, dxpl_id, linfo, idx_type, order, &ltable) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "error building table of links")
+
+        /* Check for going out of bounds */
+        if(n >= ltable.nlinks)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+        /* Remove the appropriate link from the dense storage */
+        if(H5G__dense_remove(f, dxpl_id, linfo, grp_full_path_r, ltable.lnks[n].name) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "unable to remove link from dense storage")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for index")
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_delete
+ *
+ * Purpose:	Delete the dense storage for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__dense_delete(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo, hbool_t adj_link)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* Check if we are to adjust the ref. count for all the links */
+    /* (we adjust the ref. count when deleting a group and we _don't_ adjust
+     *  the ref. count when transitioning back to compact storage)
+    */
+    if(adj_link) {
+        H5HF_t *fheap = NULL;               /* Fractal heap handle */
+        H5G_bt2_ud_rm_t udata;          /* User data for v2 B-tree record removal */
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo->fheap_addr)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+        /* Set up the user data for the v2 B-tree 'record remove' callback */
+        udata.common.f = f;
+        udata.common.dxpl_id = dxpl_id;
+        udata.common.fheap = fheap;
+        udata.common.name = NULL;
+        udata.common.name_hash = 0;
+        udata.common.found_op = NULL;
+        udata.common.found_op_data = NULL;
+        udata.rem_from_fheap = FALSE;           /* handled in "bulk" below by deleting entire heap */
+        udata.corder_bt2_addr = linfo->corder_bt2_addr;
+        udata.grp_full_path_r = NULL;
+        udata.replace_names = FALSE;
+
+        /* Delete the name index, adjusting the ref. count on links removed */
+        if(H5B2_delete(f, dxpl_id, linfo->name_bt2_addr, NULL, H5G_dense_remove_bt2_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree for name index")
+
+        /* Close the fractal heap */
+        if(H5HF_close(fheap, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+    } /* end if */
+    else {
+        /* Delete the name index, without adjusting the ref. count on the links  */
+        if(H5B2_delete(f, dxpl_id, linfo->name_bt2_addr, NULL, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree for name index")
+    } /* end else */
+    linfo->name_bt2_addr = HADDR_UNDEF;
+
+    /* Check if we should delete the creation order index v2 B-tree */
+    if(linfo->index_corder) {
+        /* Delete the creation order index, without adjusting the ref. count on the links  */
+        HDassert(H5F_addr_defined(linfo->corder_bt2_addr));
+        if(H5B2_delete(f, dxpl_id, linfo->corder_bt2_addr, NULL, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree for creation order index")
+        linfo->corder_bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else
+        HDassert(!H5F_addr_defined(linfo->corder_bt2_addr));
+
+    /* Delete the fractal heap */
+    if(H5HF_delete(f, dxpl_id, linfo->fheap_addr) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")
+    linfo->fheap_addr = HADDR_UNDEF;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_delete() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__dense_get_type_by_idx
+ *
+ * Purpose:     Returns the type of objects in the group by giving index.
+ *
+ * Note:	This routine assumes a lookup on the link name index in
+ *		increasing order and isn't currently set up to be as
+ *		flexible as other routines in this code module, because
+ *		the H5Gget_objtype_by_idx that it's supporting is
+ *		deprecated.
+ *
+ * Return:	Success:        Non-negative, object type
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 19 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_obj_t
+H5G__dense_get_type_by_idx(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
+    hsize_t idx)
+{
+    H5G_link_table_t ltable = {0, NULL};         /* Table of links */
+    H5G_obj_t ret_value;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* Build the table of links for this group */
+    if(H5G__dense_build_table(f, dxpl_id, linfo, H5_INDEX_NAME, H5_ITER_INC, &ltable) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "error building table of links")
+
+    /* Check for going out of bounds */
+    if(idx >= ltable.nlinks)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "index out of bound")
+
+    /* Determine type of object */
+    if(ltable.lnks[idx].type == H5L_TYPE_SOFT)
+        ret_value = H5G_LINK;
+    else if(ltable.lnks[idx].type >= H5L_TYPE_UD_MIN)
+        ret_value = H5G_UDLINK;
+    else if(ltable.lnks[idx].type == H5L_TYPE_HARD) {
+        H5O_loc_t tmp_oloc;             /* Temporary object location */
+        H5O_type_t obj_type;            /* Type of object at location */
+
+        /* Build temporary object location */
+        tmp_oloc.file = f;
+        tmp_oloc.addr = ltable.lnks[idx].u.hard.addr;
+
+        /* Get the type of the object */
+        if(H5O_obj_type(&tmp_oloc, &obj_type, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't get object type")
+
+        /* Map to group object type */
+        if(H5G_UNKNOWN == (ret_value = H5G_map_obj_type(obj_type)))
+            HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "can't determine object type")
+    } else {
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "unknown link type")
+    } /* end else */
+
+done:
+    /* Release link table */
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, H5G_UNKNOWN, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__dense_get_type_by_idx() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gdeprec.c b/gatb-core/thirdparty/hdf5/src/H5Gdeprec.c
new file mode 100644
index 0000000..0927219
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gdeprec.c
@@ -0,0 +1,1199 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Gdeprec.c
+ *		June 21 2006
+ *		James Laird <jlaird at ncsa.uiuc.edu>
+ *
+ * Purpose:	Deprecated functions from the H5G interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5G__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"         /* Links                                */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+/* User data for path traversal routine for getting object info */
+typedef struct {
+    H5G_stat_t  *statbuf;			/* Stat buffer about object */
+    hbool_t follow_link;                        /* Whether we are following a link or not */
+    H5F_t *loc_file;                            /* Pointer to the file the location is in */
+    hid_t dxpl_id;                              /* Dataset transfer property list */
+} H5G_trav_goi_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5G_link_hard(hid_t cur_loc_id, const char *cur_name,
+    hid_t new_loc_id, const char *new_name);
+static herr_t H5G_move(hid_t src_loc_id, const char *src_name,
+    hid_t dst_loc_id, const char *dst_name);
+static herr_t H5G_get_objinfo_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5G_get_objinfo(const H5G_loc_t *loc, const char *name,
+    hbool_t follow_link, H5G_stat_t *statbuf/*out*/, hid_t dxpl_id);
+static H5G_obj_t H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx,
+    hid_t dxpl_id);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5G__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5G__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5G__init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5G__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5G__init())
+} /* H5G__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5G__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5G__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5G__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5G__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_map_obj_type
+ *
+ * Purpose:	Maps the object type to the older "group" object type
+ *
+ * Return:	Object type (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_obj_t
+H5G_map_obj_type(H5O_type_t obj_type)
+{
+    H5G_obj_t ret_value;        /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Map object type to older "group" object type */
+    switch(obj_type) {
+        case H5O_TYPE_GROUP:
+            ret_value = H5G_GROUP;
+            break;
+
+        case H5O_TYPE_DATASET:
+            ret_value = H5G_DATASET;
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            ret_value = H5G_TYPE;
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            ret_value = H5G_UNKNOWN;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_map_obj_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gcreate1
+ *
+ * Purpose:	Creates a new group relative to LOC_ID and gives it the
+ *		specified NAME.  The group is opened for write access
+ *		and it's object ID is returned.
+ *
+ *		The optional SIZE_HINT specifies how much file space to
+ *		reserve to store the names that will appear in this
+ *		group. If a non-positive value is supplied for the SIZE_HINT
+ *		then a default size is chosen.
+ *
+ * Note:	Deprecated in favor of H5Gcreate2
+ *
+ * Return:	Success:	The object ID of a new, empty group open for
+ *				writing.  Call H5Gclose() when finished with
+ *				the group.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, September 24, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint)
+{
+    H5G_loc_t	    loc;                /* Location to create group */
+    H5G_t	   *grp = NULL;         /* New group created */
+    hid_t           tmp_gcpl = (-1);    /* Temporary group creation property list */
+    hid_t	    ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*sz", loc_id, name, size_hint);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name given")
+
+    /* Check if we need to create a non-standard GCPL */
+    if(size_hint > 0) {
+        H5P_genplist_t  *gc_plist;  /* Property list created */
+        H5O_ginfo_t     ginfo;          /* Group info property */
+
+        /* Get the default property list */
+        if(NULL == (gc_plist = (H5P_genplist_t *)H5I_object(H5P_GROUP_CREATE_DEFAULT)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+        /* Make a copy of the default property list */
+        if((tmp_gcpl = H5P_copy_plist(gc_plist, FALSE)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to copy the creation property list")
+
+        /* Get pointer to the copied property list */
+        if(NULL == (gc_plist = (H5P_genplist_t *)H5I_object(tmp_gcpl)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+        /* Get the group info property */
+        if(H5P_get(gc_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+        /* Set the non-default local heap size hint */
+        H5_CHECKED_ASSIGN(ginfo.lheap_size_hint, uint32_t, size_hint, size_t);
+        if(H5P_set(gc_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+    } /* end if */
+    else
+        tmp_gcpl = H5P_GROUP_CREATE_DEFAULT;
+
+    /* Create the new group & get its ID */
+    if(NULL == (grp = H5G__create_named(&loc, name, H5P_LINK_CREATE_DEFAULT,
+            tmp_gcpl, H5P_GROUP_ACCESS_DEFAULT, H5AC_dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group")
+    if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    if(tmp_gcpl > 0 && tmp_gcpl != H5P_GROUP_CREATE_DEFAULT)
+        if(H5I_dec_ref(tmp_gcpl) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release property list")
+
+    if(ret_value < 0)
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gcreate1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gopen1
+ *
+ * Purpose:	Opens an existing group for modification.  When finished,
+ *		call H5Gclose() to close it and release resources.
+ *
+ * Note:	Deprecated in favor of H5Gopen2
+ *
+ * Return:	Success:	Object ID of the group.
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, December 31, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Gopen1(hid_t loc_id, const char *name)
+{
+    H5G_t       *grp = NULL;            /* Group opened */
+    H5G_loc_t	loc;                    /* Location of parent for group */
+    hid_t       ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "i*s", loc_id, name);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Open the group */
+    if((grp = H5G__open_name(&loc, name, H5P_DEFAULT, H5AC_ind_dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+
+    /* Register an atom for the group */
+    if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    if(ret_value < 0) {
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gopen1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Glink
+ *
+ * Purpose:	Creates a link between two existing objects.  The new
+ *              APIs to do this are H5Lcreate_hard and H5Lcreate_soft.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new_name)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iLl*s*s", cur_loc_id, type, cur_name, new_name);
+
+    /* Check arguments */
+    if(!cur_name || !*cur_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!new_name || !*new_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified")
+
+    if(type == H5L_TYPE_HARD) {
+        if((ret_value = H5G_link_hard(cur_loc_id, cur_name, H5L_SAME_LOC, new_name)) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't create link")
+    } /* end if */
+    else if(type == H5L_TYPE_SOFT) {
+        H5G_loc_t	cur_loc;                /* Group location for new link */
+
+        /* Finish checking arguments */
+        if(H5G_loc(cur_loc_id, &cur_loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+        /* Create the link */
+        if(H5L_create_soft(cur_name, &cur_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+    } /* end else if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not a valid link type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Glink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Glink2
+ *
+ * Purpose:	Creates a link between two existing objects.  The new
+ *              APIs to do this are H5Lcreate_hard and H5Lcreate_soft.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
+    hid_t new_loc_id, const char *new_name)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*sLli*s", cur_loc_id, cur_name, type, new_loc_id, new_name);
+
+    /* Check arguments */
+    if(!cur_name || !*cur_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!new_name || !*new_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified")
+
+    if(type == H5L_TYPE_HARD) {
+        if((ret_value = H5G_link_hard(cur_loc_id, cur_name, new_loc_id, new_name)) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't create link")
+    } /* end if */
+    else if(type == H5L_TYPE_SOFT) {
+        H5G_loc_t	new_loc;                /* Group location for new link */
+
+        /* Soft links only need one location, the new_loc_id, but it's possible that
+         * new_loc_id is H5L_SAME_LOC */
+        if(new_loc_id == H5L_SAME_LOC)
+            new_loc_id = cur_loc_id;
+
+        /* Finish checking arguments */
+        if(H5G_loc(new_loc_id, &new_loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+        /* Create the link */
+        if(H5L_create_soft(cur_name, &new_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+    } /* end else if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid link type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Glink2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_hard
+ *
+ * Purpose:	Creates a hard link from NEW_NAME to CUR_NAME.
+ *
+ *		CUR_NAME must name an existing object.  CUR_NAME and
+ *              NEW_NAME are interpreted relative to CUR_LOC_ID and
+ *              NEW_LOC_ID, which are either file IDs or group IDs.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_link_hard(hid_t cur_loc_id, const char *cur_name, hid_t new_loc_id,
+    const char *new_name)
+{
+    H5G_loc_t	cur_loc, *cur_loc_p;    /* Information about current link's group */
+    H5G_loc_t	new_loc, *new_loc_p;    /* Information about new link's group */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Finish checking arguments */
+    if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC")
+    if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Set up current & new location pointers */
+    cur_loc_p = &cur_loc;
+    new_loc_p = &new_loc;
+    if(cur_loc_id == H5L_SAME_LOC)
+        cur_loc_p = new_loc_p;
+    else if(new_loc_id == H5L_SAME_LOC)
+   	new_loc_p = cur_loc_p;
+    else if(cur_loc_p->oloc->file != new_loc_p->oloc->file)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should be in the same file.")
+
+    /* Create the link */
+    if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name,
+                H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_link_hard() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gmove
+ *
+ * Purpose:	Moves and renames a link.  The new API to do this is H5Lmove.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*s", src_loc_id, src_name, dst_name);
+
+    /* Call common routine to move the link */
+    if(H5G_move(src_loc_id, src_name, H5L_SAME_LOC, dst_name) < 0)
+      HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't move link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gmove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gmove2
+ *
+ * Purpose:	Moves and renames a link.  The new API to do this is H5Lmove.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*si*s", src_loc_id, src_name, dst_loc_id, dst_name);
+
+    /* Call common routine to move the link */
+    if(H5G_move(src_loc_id, src_name, dst_loc_id, dst_name) < 0)
+      HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't move link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gmove2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_move
+ *
+ * Purpose:	Renames an object within an HDF5 file and moves it to a new
+ *              group.  The original name SRC is unlinked from the group graph
+ *              and then inserted with the new name DST (which can specify a
+ *              new path for the object) as an atomic operation. The names
+ *              are interpreted relative to SRC_LOC_ID and
+ *              DST_LOC_ID, which are either file IDs or group ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_move(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name)
+{
+    H5G_loc_t	src_loc, *src_loc_p;    /* Group info for source location */
+    H5G_loc_t	dst_loc, *dst_loc_p;    /* Group info for destination location */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
+    if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!src_name || !*src_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!dst_name || !*dst_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified")
+
+    /* Set up src & dst location pointers */
+    src_loc_p = &src_loc;
+    dst_loc_p = &dst_loc;
+    if(src_loc_id == H5L_SAME_LOC)
+        src_loc_p = dst_loc_p;
+    else if(dst_loc_id == H5L_SAME_LOC)
+        dst_loc_p = src_loc_p;
+
+    /* Move the link */
+    if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, H5P_DEFAULT,
+            H5P_DEFAULT, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_move() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gunlink
+ *
+ * Purpose:	Removes a link.  The new API is H5Ldelete/H5Ldelete_by_idx.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gunlink(hid_t loc_id, const char *name)
+{
+    H5G_loc_t	loc;                    /* Group's location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", loc_id, name);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Call H5L routine... */
+    if(H5L_delete(&loc, name, H5P_DEFAULT, H5AC_dxpl_id) < 0)
+      HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "couldn't delete link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gunlink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_linkval
+ *
+ * Purpose:	Retrieve's a soft link's data.  The new API is
+ *              H5Lget_val/H5Lget_val_by_idx.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/)
+{
+    H5G_loc_t	loc;                    /* Group's location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*szx", loc_id, name, size, buf);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+
+    /* Call the new link routine which provides this capability */
+    if(H5L_get_val(&loc, name, buf, size, H5P_DEFAULT, H5AC_ind_dxpl_id) < 0)
+      HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "couldn't get link info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_linkval() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gset_comment
+ *
+ * Purpose:     Gives the specified object a comment.  The COMMENT string
+ *		should be a null terminated string.  An object can have only
+ *		one comment at a time.  Passing NULL for the COMMENT argument
+ *		will remove the comment property from the object.
+ *
+ * Note:	Deprecated in favor of H5Oset_comment/H5Oset_comment_by_name
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gset_comment(hid_t loc_id, const char *name, const char *comment)
+{
+    H5G_loc_t	loc;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*s", loc_id, name, comment);
+
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+
+    if(H5G_loc_set_comment(&loc, name, comment, H5P_DEFAULT, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to set comment value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gset_comment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_comment
+ *
+ * Purpose:	Return at most BUFSIZE characters of the comment for the
+ *		specified object.  If BUFSIZE is large enough to hold the
+ *		entire comment then the comment string will be null
+ *		terminated, otherwise it will not.  If the object does not
+ *		have a comment value then no bytes are copied to the BUF
+ *		buffer.
+ *
+ * Note:	Deprecated in favor of H5Oget_comment/H5Oget_comment_by_name
+ *
+ * Return:	Success:	Number of characters in the comment counting
+ *				the null terminator.  The value returned may
+ *				be larger than the BUFSIZE argument.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf)
+{
+    H5G_loc_t	loc;
+    int	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Is", "i*sz*s", loc_id, name, bufsize, buf);
+
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(bufsize > 0 && !buf)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no buffer specified")
+
+    if((ret_value = (int)H5G_loc_get_comment(&loc, name, buf, bufsize, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to get comment value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_comment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Giterate
+ *
+ * Purpose:	Iterates over the entries of a group.  The LOC_ID and NAME
+ *		identify the group over which to iterate and IDX indicates
+ *		where to start iterating (zero means at the beginning).	 The
+ *		OPERATOR is called for each member and the iteration
+ *		continues until the operator returns non-zero or all members
+ *		are processed. The operator is passed a group ID for the
+ *		group being iterated, a member name, and OP_DATA for each
+ *		member.
+ *
+ * Note:	Deprecated in favor of H5Literate
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, March 23, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Giterate(hid_t loc_id, const char *name, int *idx_p, H5G_iterate_t op,
+    void *op_data)
+{
+    H5G_link_iterate_t lnk_op;          /* Link operator */
+    hsize_t     last_obj;               /* Index of last object looked at */
+    hsize_t	idx;                    /* Internal location to hold index */
+    herr_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*s*Isx*x", loc_id, name, idx_p, op, op_data);
+
+    /* Check args */
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_p && *idx_p < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+    if(!op)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified")
+
+    /* Set number of objects looked at to zero */
+    last_obj = 0;
+    idx = (hsize_t)(idx_p == NULL ? 0 : *idx_p);
+
+    /* Build link operator info */
+    lnk_op.op_type = H5G_LINK_OP_OLD;
+    lnk_op.op_func.op_old = op;
+
+    /* Call private function. */
+    if((ret_value = H5G_iterate(loc_id, name, H5_INDEX_NAME, H5_ITER_INC, idx, &last_obj, &lnk_op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "group iteration failed")
+
+    /* Set the index we stopped at */
+    if(idx_p)
+        *idx_p = (int)last_obj;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Giterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_num_objs
+ *
+ * Purpose:     Returns the number of objects in the group.  It iterates
+ *              all B-tree leaves and sum up total number of group members.
+ *
+ * Note:	Deprecated in favor of H5Gget_info
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs)
+{
+    H5G_loc_t		loc;            /* Location of object */
+    H5G_info_t          grp_info;       /* Group information */
+    H5O_type_t          obj_type;       /* Type of object at location */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", loc_id, num_objs);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID")
+    if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_GROUP)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+    if(!num_objs)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad pointer to # of objects")
+
+    /* Retrieve information about the group */
+    if(H5G__obj_info(loc.oloc, &grp_info, H5AC_ind_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "can't determine")
+
+    /* Set the number of objects [sic: links] in the group */
+    *num_objs = grp_info.nlinks;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_num_objs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_objinfo
+ *
+ * Purpose:	Returns information about an object.  If FOLLOW_LINK is
+ *		non-zero then all symbolic links are followed; otherwise all
+ *		links except the last component of the name are followed.
+ *
+ * Note:	Deprecated in favor of H5Lget_info/H5Oget_info
+ *
+ * Return:	Non-negative on success, with the fields of STATBUF (if
+ *              non-null) initialized. Negative on failure.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link,
+	       H5G_stat_t *statbuf/*out*/)
+{
+    H5G_loc_t	loc;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*sbx", loc_id, name, follow_link, statbuf);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+
+    /* Get info */
+    if(H5G_get_objinfo(&loc, name, follow_link, statbuf, H5AC_ind_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "cannot stat object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_objinfo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_get_objinfo_cb
+ *
+ * Purpose:	Callback for retrieving info about an object.  This routine
+ *              gets the info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 20, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_get_objinfo_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char *name, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_trav_goi_t *udata = (H5G_trav_goi_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(lnk == NULL && obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "'%s' doesn't exist", name)
+
+    /* Only modify user's buffer if it's available */
+    if(udata->statbuf) {
+        H5G_stat_t *statbuf = udata->statbuf;   /* Convenience pointer for statbuf */
+
+        /* Common code to retrieve the file's fileno */
+        if(H5F_get_fileno((obj_loc ? obj_loc : grp_loc)->oloc->file, &statbuf->fileno[0]) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "unable to read fileno")
+
+        /* Info for soft and UD links is gotten by H5L_get_info. If we have
+         *      a hard link, follow it and get info on the object
+         */
+        if(udata->follow_link || !lnk || (lnk->type == H5L_TYPE_HARD)) {
+            H5O_info_t oinfo;           /* Object information */
+
+            /* Go retrieve the object information */
+            /* (don't need index & heap info) */
+            HDassert(obj_loc);
+            if(H5O_get_info(obj_loc->oloc, udata->dxpl_id, FALSE, &oinfo) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get object info")
+
+            /* Get mapped object type */
+            statbuf->type = H5G_map_obj_type(oinfo.type);
+
+	    /* Get object number (i.e. address) for object */
+	    statbuf->objno[0] = (unsigned long)(oinfo.addr);
+#if H5_SIZEOF_UINT64_T > H5_SIZEOF_LONG
+	    statbuf->objno[1] = (unsigned long)(oinfo.addr >> 8 * sizeof(long));
+#else
+	    statbuf->objno[1] = 0;
+#endif
+            /* Get # of hard links pointing to object */
+	    statbuf->nlink = oinfo.rc;
+
+            /* Get modification time for object */
+            statbuf->mtime = oinfo.ctime;
+
+            /* Retrieve the object header information */
+            statbuf->ohdr.size = oinfo.hdr.space.total;
+            statbuf->ohdr.free = oinfo.hdr.space.free;
+            statbuf->ohdr.nmesgs = oinfo.hdr.nmesgs;
+            statbuf->ohdr.nchunks = oinfo.hdr.nchunks;
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_objinfo_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_get_objinfo
+ *
+ * Purpose:	Returns information about an object.
+ *
+ * Return:	Success:	Non-negative with info about the object
+ *				returned through STATBUF if it isn't the null
+ *				pointer.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_get_objinfo(const H5G_loc_t *loc, const char *name, hbool_t follow_link,
+    H5G_stat_t *statbuf/*out*/, hid_t dxpl_id)
+{
+    H5G_trav_goi_t udata;           /* User data for callback */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Reset stat buffer, if one was given */
+    if(statbuf)
+        HDmemset(statbuf, 0, sizeof(H5G_stat_t));
+
+    /* Set up user data for retrieving information */
+    udata.statbuf = statbuf;
+    udata.follow_link = follow_link;
+    udata.loc_file = loc->oloc->file;
+    udata.dxpl_id = dxpl_id;
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(loc, name, (unsigned)(follow_link ? H5G_TARGET_NORMAL : H5G_TARGET_SLINK|H5G_TARGET_UDLINK),
+            H5G_get_objinfo_cb, &udata, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist")
+
+    /* If we're pointing at a soft or UD link, get the real link length and type */
+    if(statbuf && follow_link == 0) {
+        H5L_info_t linfo;           /* Link information buffer */
+        herr_t ret;
+
+        /* Get information about link to the object. If this fails, e.g.
+         * because the object is ".", just treat the object as a hard link. */
+        H5E_BEGIN_TRY {
+            ret = H5L_get_info(loc, name, &linfo, H5P_DEFAULT, dxpl_id);
+        } H5E_END_TRY
+
+        if(ret >= 0 && linfo.type != H5L_TYPE_HARD) {
+            statbuf->linklen = linfo.u.val_size;
+            if(linfo.type == H5L_TYPE_SOFT)
+                statbuf->type = H5G_LINK;
+            else {  /* UD link. H5L_get_info checked for invalid link classes */
+                HDassert(linfo.type >= H5L_TYPE_UD_MIN && linfo.type <= H5L_TYPE_MAX);
+                statbuf->type = H5G_UDLINK;
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_objinfo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_objname_by_idx
+ *
+ * Purpose:     Returns the name of objects in the group by giving index.
+ *              If `name' is non-NULL then write up to `size' bytes into that
+ *              buffer and always return the length of the entry name.
+ *              Otherwise `size' is ignored and the function does not store the name,
+ *              just returning the number of characters required to store the name.
+ *              If an error occurs then the buffer pointed to by `name' (NULL or non-NULL)
+ *              is unchanged and the function returns a negative value.
+ *              If a zero is returned for the name's length, then there is no name
+ *              associated with the ID.
+ *
+ * Note:	Deprecated in favor of H5Lget_name_by_idx
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char *name, size_t size)
+{
+    H5G_loc_t		loc;            /* Object location */
+    H5O_type_t          obj_type;       /* Type of object at location */
+    ssize_t		ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Zs", "ih*sz", loc_id, idx, name, size);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID")
+    if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_GROUP)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Call internal function */
+    if((ret_value = H5G_obj_get_name_by_idx(loc.oloc, H5_INDEX_NAME, H5_ITER_INC, idx, name, size, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "can't get object name")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_objname_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Gget_objtype_by_idx
+ *
+ * Purpose:     Returns the type of objects in the group by giving index.
+ *
+ * Note:	Deprecated in favor of H5Lget_info/H5Oget_info
+ *
+ * Return:	Success:        H5G_GROUP(1), H5G_DATASET(2), H5G_TYPE(3)
+ *		Failure:	H5G_UNKNOWN
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_obj_t
+H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx)
+{
+    H5G_loc_t		loc;            /* Object location */
+    H5O_type_t          obj_type;       /* Type of object at location */
+    H5G_obj_t		ret_value;
+
+    FUNC_ENTER_API(H5G_UNKNOWN)
+    H5TRACE2("Go", "ih", loc_id, idx);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "not a location ID")
+    if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't get object type")
+    if(obj_type != H5O_TYPE_GROUP)
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "not a group")
+
+    /* Call internal function*/
+    if((ret_value = H5G_obj_get_type_by_idx(loc.oloc, idx, H5AC_ind_dxpl_id)) == H5G_UNKNOWN)
+	HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "can't get object type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Gget_objtype_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_get_type_by_idx
+ *
+ * Purpose:     Private function for H5Gget_objtype_by_idx.
+ *              Returns the type of objects in the group by giving index.
+ *
+ * Return:	Success:        H5G_GROUP(1), H5G_DATASET(2), H5G_TYPE(3)
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5G_obj_t
+H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
+{
+    H5O_linfo_t	linfo;		/* Link info message */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    H5G_obj_t ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI(H5G_UNKNOWN)
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't check for link info message")
+    if(linfo_exists) {
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Get the object's name from the dense link storage */
+            if((ret_value = H5G__dense_get_type_by_idx(oloc->file, dxpl_id, &linfo, idx)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5G_UNKNOWN, "can't locate type")
+        } /* end if */
+        else {
+            /* Get the object's type from the link messages */
+            if((ret_value = H5G__compact_get_type_by_idx(oloc, dxpl_id, &linfo, idx)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5G_UNKNOWN, "can't locate type")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Get the object's type from the symbol table */
+        if((ret_value = H5G__stab_get_type_by_idx(oloc, idx, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5G_UNKNOWN, "can't locate type")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_get_type_by_idx() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gent.c b/gatb-core/thirdparty/hdf5/src/H5Gent.c
new file mode 100644
index 0000000..2cef9f7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gent.c
@@ -0,0 +1,607 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Robb Matzke <matzke at llnl.gov>
+ *             Friday, September 19, 1997
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern the PQ free list for the wrapped strings */
+H5FL_BLK_EXTERN(str_buf);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_decode_vec
+ *
+ * Purpose:     Same as H5G_ent_decode() except it does it for an array of
+ *              symbol table entries.
+ *
+ * Return:      Success:        Non-negative, with *pp pointing to the first byte
+ *                              after the last symbol.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_decode_vec(const H5F_t *f, const uint8_t **pp, H5G_entry_t *ent, unsigned n)
+{
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(pp);
+    HDassert(ent);
+
+    /* decode entries */
+    for(u = 0; u < n; u++)
+        if(H5G_ent_decode(f, pp, ent + u) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__ent_decode_vec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_ent_decode
+ *
+ * Purpose:     Decodes a symbol table entry pointed to by `*pp'.
+ *
+ * Return:      Success:        Non-negative with *pp pointing to the first byte
+ *                              following the symbol table entry.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_ent_decode(const H5F_t *f, const uint8_t **pp, H5G_entry_t *ent)
+{
+    const uint8_t	*p_ret = *pp;
+    uint32_t		tmp;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(pp);
+    HDassert(ent);
+
+    /* decode header */
+    H5F_DECODE_LENGTH(f, *pp, ent->name_off);
+    H5F_addr_decode(f, pp, &(ent->header));
+    UINT32DECODE(*pp, tmp);
+    *pp += 4; /*reserved*/
+    ent->type = (H5G_cache_type_t)tmp;
+
+    /* decode scratch-pad */
+    switch(ent->type) {
+        case H5G_NOTHING_CACHED:
+            break;
+
+        case H5G_CACHED_STAB:
+            HDassert(2 * H5F_SIZEOF_ADDR(f) <= H5G_SIZEOF_SCRATCH);
+            H5F_addr_decode(f, pp, &(ent->cache.stab.btree_addr));
+            H5F_addr_decode(f, pp, &(ent->cache.stab.heap_addr));
+            break;
+
+        case H5G_CACHED_SLINK:
+            UINT32DECODE(*pp, ent->cache.slink.lval_offset);
+            break;
+
+        case H5G_CACHED_ERROR:
+        case H5G_NCACHED:
+        default:
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown symbol table entry cache type")
+    } /* end switch */
+
+    *pp = p_ret + H5G_SIZEOF_ENTRY(f);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_ent_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_encode_vec
+ *
+ * Purpose:     Same as H5G_ent_encode() except it does it for an array of
+ *              symbol table entries.
+ *
+ * Return:      Success:        Non-negative, with *pp pointing to the first byte
+ *                              after the last symbol.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_encode_vec(const H5F_t *f, uint8_t **pp, const H5G_entry_t *ent, unsigned n)
+{
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(pp);
+    HDassert(ent);
+
+    /* encode entries */
+    for(u = 0; u < n; u++)
+        if(H5G_ent_encode(f, pp, ent + u) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't encode")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5G__ent_encode_vec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_ent_encode
+ *
+ * Purpose:     Encodes the specified symbol table entry into the buffer
+ *              pointed to by *pp.
+ *
+ * Return:      Success:        Non-negative, with *pp pointing to the first byte
+ *                              after the symbol table entry.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_ent_encode(const H5F_t *f, uint8_t **pp, const H5G_entry_t *ent)
+{
+    uint8_t	*p_ret = *pp + H5G_SIZEOF_ENTRY(f);
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(pp);
+
+    /* Check for actual entry to encode */
+    if(ent) {
+        /* encode header */
+        H5F_ENCODE_LENGTH(f, *pp, ent->name_off);
+        H5F_addr_encode(f, pp, ent->header);
+        UINT32ENCODE(*pp, ent->type);
+	UINT32ENCODE(*pp, 0); /*reserved*/
+
+        /* encode scratch-pad */
+        switch(ent->type) {
+            case H5G_NOTHING_CACHED:
+                break;
+
+            case H5G_CACHED_STAB:
+                HDassert(2 * H5F_SIZEOF_ADDR(f) <= H5G_SIZEOF_SCRATCH);
+                H5F_addr_encode(f, pp, ent->cache.stab.btree_addr);
+                H5F_addr_encode(f, pp, ent->cache.stab.heap_addr);
+                break;
+
+            case H5G_CACHED_SLINK:
+                UINT32ENCODE(*pp, ent->cache.slink.lval_offset);
+                break;
+
+            case H5G_CACHED_ERROR:
+            case H5G_NCACHED:
+            default:
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown symbol table entry cache type")
+        } /* end switch */
+    } /* end if */
+    else {
+        H5F_ENCODE_LENGTH(f, *pp, 0);
+        H5F_addr_encode(f, pp, HADDR_UNDEF);
+        UINT32ENCODE(*pp, H5G_NOTHING_CACHED);
+	UINT32ENCODE(*pp, 0); /*reserved*/
+    } /* end else */
+
+    /* fill with zero */
+    if(*pp < p_ret)
+        HDmemset(*pp, 0, (size_t)(p_ret - *pp));
+    *pp = p_ret;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_ent_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_copy
+ *
+ * Purpose:     Do a deep copy of symbol table entries
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Pedro Vicente
+ *              pvn at ncsa.uiuc.edu
+ *              ???day, August ??, 2002
+ *
+ * Notes:       'depth' parameter determines how much of the group entry
+ *              structure we want to copy.  The values are:
+ *                  H5_COPY_SHALLOW - Copy all the fields from the source
+ *                      to the destination, including the user path and
+ *                      canonical path. (Destination "takes ownership" of
+ *                      user and canonical paths)
+ *                  H5_COPY_DEEP - Copy all the fields from the source to
+ *                      the destination, deep copying the user and canonical
+ *                      paths.
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5G__ent_copy(H5G_entry_t *dst, const H5G_entry_t *src, H5_copy_depth_t depth)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check arguments */
+    HDassert(src);
+    HDassert(dst);
+    HDassert(depth == H5_COPY_SHALLOW || depth == H5_COPY_DEEP);
+
+    /* Copy the top level information */
+    HDmemcpy(dst, src, sizeof(H5G_entry_t));
+
+    /* Deep copy the names */
+    if(depth == H5_COPY_DEEP) {
+        /* Nothing currently */
+        ;
+    } else if(depth == H5_COPY_SHALLOW) {
+        /* Discarding 'const' qualifier OK - QAK */
+        H5G__ent_reset((H5G_entry_t *)src);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5G__ent_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__ent_reset
+ *
+ * Purpose:	Reset a symbol table entry to an empty state
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              ?day, August ??, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5G__ent_reset(H5G_entry_t *ent)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check arguments */
+    HDassert(ent);
+
+    /* Clear the symbol table entry to an empty state */
+    HDmemset(ent, 0, sizeof(H5G_entry_t));
+    ent->header = HADDR_UNDEF;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5G__ent_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_convert
+ *
+ * Purpose:     Convert a link to a symbol table entry
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Sep 20 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_convert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, const char *name,
+    const H5O_link_t *lnk, H5O_type_t obj_type, const void *crt_info,
+    H5G_entry_t *ent)
+{
+    size_t	name_offset;            /* Offset of name in heap */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(heap);
+    HDassert(name);
+    HDassert(lnk);
+
+    /* Reset the new entry */
+    H5G__ent_reset(ent);
+
+    /*
+     * Add the new name to the heap.
+     */
+    name_offset = H5HL_insert(f, dxpl_id, heap, HDstrlen(name) + 1, name);
+    if(0 == name_offset || (size_t)(-1) == name_offset)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert symbol name into heap")
+    ent->name_off = name_offset;
+
+    /* Build correct information for symbol table entry based on link type */
+    switch(lnk->type) {
+        case H5L_TYPE_HARD:
+            if(obj_type == H5O_TYPE_GROUP) {
+                const H5G_obj_create_t *gcrt_info = (const H5G_obj_create_t *)crt_info;
+
+                ent->type = gcrt_info->cache_type;
+                if(ent->type != H5G_NOTHING_CACHED)
+                    ent->cache = gcrt_info->cache;
+#ifndef NDEBUG
+                else {
+                    /* Make sure there is no stab message in the target object
+                     */
+                    H5O_loc_t   targ_oloc;      /* Location of link target */
+                    htri_t      stab_exists;    /* Whether the target symbol table exists */
+
+                    /* Build target object location */
+                    if(H5O_loc_reset(&targ_oloc) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location")
+                    targ_oloc.file = f;
+                    targ_oloc.addr = lnk->u.hard.addr;
+
+                    /* Check if a symbol table message exists */
+                    if((stab_exists = H5O_msg_exists(&targ_oloc, H5O_STAB_ID,
+                            dxpl_id)) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message")
+
+                    HDassert(!stab_exists);
+                } /* end else */
+#endif /* NDEBUG */
+            } /* end if */
+            else if(obj_type == H5O_TYPE_UNKNOWN){
+                /* Try to retrieve symbol table information for caching */
+                H5O_loc_t       targ_oloc;      /* Location of link target */
+                H5O_t           *oh;            /* Link target object header */
+                H5O_stab_t      stab;           /* Link target symbol table */
+                htri_t          stab_exists;    /* Whether the target symbol table exists */
+
+                /* Build target object location */
+                if(H5O_loc_reset(&targ_oloc) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location")
+                targ_oloc.file = f;
+                targ_oloc.addr = lnk->u.hard.addr;
+
+                /* Get the object header */
+                if(NULL == (oh = H5O_protect(&targ_oloc, dxpl_id, H5AC_READ)))
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, FAIL, "unable to protect target object header")
+
+                /* Check if a symbol table message exists */
+                if((stab_exists = H5O_msg_exists_oh(oh, H5O_STAB_ID)) < 0) {
+                    if(H5O_unprotect(&targ_oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET)
+                            < 0)
+                        HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
+                    HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message")
+                } /* end if */
+
+                if(stab_exists) {
+                    /* Read symbol table message */
+                    if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_STAB_ID,
+                            &stab)) {
+                        if(H5O_unprotect(&targ_oloc, dxpl_id, oh,
+                                H5AC__NO_FLAGS_SET) < 0)
+                            HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read STAB message")
+                    } /* end if */
+
+                    /* Cache symbol table message */
+                    ent->type = H5G_CACHED_STAB;
+                    ent->cache.stab.btree_addr = stab.btree_addr;
+                    ent->cache.stab.heap_addr = stab.heap_addr;
+                } /* end if */
+                else
+                    /* No symbol table message, don't cache anything */
+                    ent->type = H5G_NOTHING_CACHED;
+
+                if(H5O_unprotect(&targ_oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET)
+                        < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+            } /* end else */
+            else
+                ent->type = H5G_NOTHING_CACHED;
+
+            ent->header = lnk->u.hard.addr;
+            break;
+
+        case H5L_TYPE_SOFT:
+            {
+                size_t	lnk_offset;		/* Offset to sym-link value	*/
+
+                /* Insert link value into local heap */
+                if((size_t)(-1) == (lnk_offset = H5HL_insert(f, dxpl_id, heap,
+                        HDstrlen(lnk->u.soft.name) + 1, lnk->u.soft.name)))
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to write link value to local heap")
+
+                ent->type = H5G_CACHED_SLINK;
+                ent->cache.slink.lval_offset = lnk_offset;
+            } /* end case */
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_MAX:
+        default:
+          HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__ent_convert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_debug
+ *
+ * Purpose:     Prints debugging information about a symbol table entry.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 29 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth,
+    const H5HL_t *heap)
+{
+    const char		*lval = NULL;
+    int nested_indent, nested_fwidth;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Calculate the indent & field width values for nested information */
+    nested_indent = indent + 3;
+    nested_fwidth = MAX(0, fwidth - 3);
+
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	      "Name offset into private heap:",
+	      (unsigned long) (ent->name_off));
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Object header address:", ent->header);
+
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth,
+	      "Cache info type:");
+    switch(ent->type) {
+        case H5G_NOTHING_CACHED:
+            HDfprintf(stream, "Nothing Cached\n");
+            break;
+
+        case H5G_CACHED_STAB:
+            HDfprintf(stream, "Symbol Table\n");
+
+            HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth,
+                      "Cached entry information:");
+            HDfprintf(stream, "%*s%-*s %a\n", nested_indent, "", nested_fwidth,
+                      "B-tree address:", ent->cache.stab.btree_addr);
+
+            HDfprintf(stream, "%*s%-*s %a\n", nested_indent, "", nested_fwidth,
+                      "Heap address:", ent->cache.stab.heap_addr);
+            break;
+
+        case H5G_CACHED_SLINK:
+            HDfprintf(stream, "Symbolic Link\n");
+            HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth,
+                      "Cached information:");
+            HDfprintf(stream, "%*s%-*s %lu\n", nested_indent, "", nested_fwidth,
+                       "Link value offset:",
+                       (unsigned long)(ent->cache.slink.lval_offset));
+            if(heap) {
+                lval = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset);
+                HDfprintf(stream, "%*s%-*s %s\n", nested_indent, "", nested_fwidth,
+                           "Link value:",
+                           lval);
+            } /* end if */
+            else
+                HDfprintf(stream, "%*s%-*s\n", nested_indent, "", nested_fwidth, "Warning: Invalid heap address given, name not displayed!");
+            break;
+
+        case H5G_CACHED_ERROR:
+        case H5G_NCACHED:
+        default:
+            HDfprintf(stream, "*** Unknown symbol type %d\n", ent->type);
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__ent_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gint.c b/gatb-core/thirdparty/hdf5/src/H5Gint.c
new file mode 100644
index 0000000..04b21a5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gint.c
@@ -0,0 +1,1193 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Gint.c
+ *		April 5 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	General use, "internal" routines for groups.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5G_init_int_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"         /* Links                                */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for path traversal routine for "insertion file" routine */
+typedef struct {
+    H5G_loc_t *loc;         /* Pointer to the location for insertion */
+} H5G_trav_ins_t;
+
+/* User data for application-style iteration over links in a group */
+typedef struct {
+    hid_t       gid;            /* The group ID for the application callback */
+    H5G_link_iterate_t lnk_op;  /* Application callback */
+    void *op_data;              /* Application's op data */
+} H5G_iter_appcall_ud_t;
+
+/* User data for recursive traversal over links from a group */
+typedef struct {
+    hid_t       gid;            /* The group ID for the starting group */
+    H5G_loc_t	*curr_loc;      /* Location of starting group */
+    hid_t       lapl_id;        /* LAPL for walking across links */
+    hid_t       dxpl_id; 	/* DXPL for operations */
+    H5_index_t  idx_type;       /* Index to use */
+    H5_iter_order_t order;      /* Iteration order within index */
+    H5SL_t     *visited;        /* Skip list for tracking visited nodes */
+    char       *path;           /* Path name of the link */
+    size_t      curr_path_len;  /* Current length of the path in the buffer */
+    size_t      path_buf_size;  /* Size of path buffer */
+    H5L_iterate_t op;           /* Application callback */
+    void       *op_data;        /* Application's op data */
+} H5G_iter_visit_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5G_open_oid(H5G_t *grp, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5G_t struct */
+H5FL_DEFINE(H5G_t);
+H5FL_DEFINE(H5G_shared_t);
+
+/* Declare the free list to manage H5_obj_t's */
+H5FL_DEFINE(H5_obj_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5G_init_int_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5G_init_int_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5G__init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5G_init_int_interface(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Funnel all work to H5G__init() */
+    if(H5G__init() < 0)
+        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "interface initialization failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5G_init_int_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__create_named
+ *
+ * Purpose:	Internal routine to create a new "named" group.
+ *
+ * Return:	Success:	Non-NULL, pointer to new group object.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *	        April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_t *
+H5G__create_named(const H5G_loc_t *loc, const char *name, hid_t lcpl_id,
+    hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id)
+{
+    H5O_obj_create_t ocrt_info;         /* Information for object creation */
+    H5G_obj_create_t gcrt_info;         /* Information for group creation */
+    H5G_t	   *ret_value;          /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(lcpl_id != H5P_DEFAULT);
+    HDassert(gcpl_id != H5P_DEFAULT);
+    HDassert(gapl_id != H5P_DEFAULT);
+    HDassert(dxpl_id != H5P_DEFAULT);
+
+    /* Set up group creation info */
+    gcrt_info.gcpl_id = gcpl_id;
+    gcrt_info.cache_type = H5G_NOTHING_CACHED;
+    HDmemset(&gcrt_info.cache, 0, sizeof(gcrt_info.cache));
+
+    /* Set up object creation information */
+    ocrt_info.obj_type = H5O_TYPE_GROUP;
+    ocrt_info.crt_info = &gcrt_info;
+    ocrt_info.new_obj = NULL;
+
+    /* Create the new group and link it to its parent group */
+    if(H5L_link_object(loc, name, &ocrt_info, lcpl_id, gapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to create and link to group")
+    HDassert(ocrt_info.new_obj);
+
+    /* Set the return value */
+    ret_value = (H5G_t *)ocrt_info.new_obj;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__create_named() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__create
+ *
+ * Purpose:	Creates a new empty group with the specified name. The name
+ *		is either an absolute name or is relative to LOC.
+ *
+ * Return:	Success:	A handle for the group.	 The group is opened
+ *				and should eventually be close by calling
+ *				H5G_close().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 11 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_t *
+H5G__create(H5F_t *file, H5G_obj_create_t *gcrt_info, hid_t dxpl_id)
+{
+    H5G_t	*grp = NULL;	/*new group			*/
+    unsigned    oloc_init = 0;  /* Flag to indicate that the group object location was created successfully */
+    H5G_t	*ret_value;	/* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(file);
+    HDassert(gcrt_info->gcpl_id != H5P_DEFAULT);
+    HDassert(dxpl_id != H5P_DEFAULT);
+
+    /* create an open group */
+    if(NULL == (grp = H5FL_CALLOC(H5G_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(NULL == (grp->shared = H5FL_CALLOC(H5G_shared_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Create the group object header */
+    if(H5G__obj_create(file, dxpl_id, gcrt_info, &(grp->oloc)/*out*/) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to create group object header")
+    oloc_init = 1;    /* Indicate that the object location information is valid */
+
+    /* Add group to list of open objects in file */
+    if(H5FO_top_incr(grp->oloc.file, grp->oloc.addr) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINC, NULL, "can't incr object ref. count")
+    if(H5FO_insert(grp->oloc.file, grp->oloc.addr, grp->shared, TRUE) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, NULL, "can't insert group into list of open objects")
+
+    /* Set the count of times the object is opened */
+    grp->shared->fo_count = 1;
+
+    /* Set return value */
+    ret_value = grp;
+
+done:
+    if(ret_value == NULL) {
+        /* Check if we need to release the file-oriented symbol table info */
+        if(oloc_init) {
+            if(H5O_dec_rc_by_loc(&(grp->oloc), dxpl_id) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTDEC, NULL, "unable to decrement refcount on newly created object")
+            if(H5O_close(&(grp->oloc)) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "unable to release object header")
+            if(H5O_delete(file, dxpl_id, grp->oloc.addr) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, NULL, "unable to delete object header")
+        } /* end if */
+        if(grp != NULL) {
+            if(grp->shared != NULL)
+                grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
+            grp = H5FL_FREE(H5G_t, grp);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__open_name
+ *
+ * Purpose:	Opens an existing group by name.
+ *
+ * Return:	Success:	Ptr to a new group.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, August	27, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_t *
+H5G__open_name(const H5G_loc_t *loc, const char *name, hid_t gapl_id,
+    hid_t dxpl_id)
+{
+    H5G_t      *grp = NULL;             /* Group to open */
+    H5G_loc_t   grp_loc;                /* Location used to open group */
+    H5G_name_t  grp_path;            	/* Opened object group hier. path */
+    H5O_loc_t   grp_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Location at 'name' found */
+    H5O_type_t  obj_type;               /* Type of object at location */
+    H5G_t      *ret_value;              /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(name);
+
+    /* Set up opened group location to fill in */
+    grp_loc.oloc = &grp_oloc;
+    grp_loc.path = &grp_path;
+    H5G_loc_reset(&grp_loc);
+
+    /* Find the group object using the gapl passed in */
+    if(H5G_loc_find(loc, name, &grp_loc/*out*/, gapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "group not found")
+    loc_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&grp_oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, NULL, "can't get object type")
+    if(obj_type != H5O_TYPE_GROUP)
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, NULL, "not a group")
+
+    /* Open the group */
+    if((grp = H5G_open(&grp_loc, dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, NULL, "unable to open group")
+
+    /* Set return value */
+    ret_value = grp;
+
+done:
+    if(!ret_value) {
+        if(loc_found && H5G_loc_free(&grp_loc) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, NULL, "can't free location")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__open_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_open
+ *
+ * Purpose:	Opens an existing group.  The group should eventually be
+ *		closed by calling H5G_close().
+ *
+ * Return:	Success:	Ptr to a new group.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_t *
+H5G_open(const H5G_loc_t *loc, hid_t dxpl_id)
+{
+    H5G_t           *grp = NULL;        /* Group opened */
+    H5G_shared_t    *shared_fo;         /* Shared group object */
+    H5G_t           *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check args */
+    HDassert(loc);
+
+    /* Allocate the group structure */
+    if(NULL == (grp = H5FL_CALLOC(H5G_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate space for group")
+
+    /* Shallow copy (take ownership) of the group location object */
+    if(H5O_loc_copy(&(grp->oloc), loc->oloc, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, NULL, "can't copy object location")
+    if(H5G_name_copy(&(grp->path), loc->path, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, NULL, "can't copy path")
+
+    /* Check if group was already open */
+    if((shared_fo = (H5G_shared_t *)H5FO_opened(grp->oloc.file, grp->oloc.addr)) == NULL) {
+
+        /* Clear any errors from H5FO_opened() */
+        H5E_clear_stack(NULL);
+
+        /* Open the group object */
+        if(H5G_open_oid(grp, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "not found")
+
+        /* Add group to list of open objects in file */
+        if(H5FO_insert(grp->oloc.file, grp->oloc.addr, grp->shared, FALSE) < 0) {
+            grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, NULL, "can't insert group into list of open objects")
+        } /* end if */
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(grp->oloc.file, grp->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINC, NULL, "can't increment object count")
+
+        /* Set open object count */
+        grp->shared->fo_count = 1;
+    } /* end if */
+    else {
+        /* Point to shared group info */
+        grp->shared = shared_fo;
+
+        /* Increment shared reference count */
+        shared_fo->fo_count++;
+
+        /* Check if the object has been opened through the top file yet */
+        if(H5FO_top_count(grp->oloc.file, grp->oloc.addr) == 0) {
+            /* Open the object through this top file */
+            if(H5O_open(&(grp->oloc)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, NULL, "unable to open object header")
+        } /* end if */
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(grp->oloc.file, grp->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINC, NULL, "can't increment object count")
+    } /* end else */
+
+    /* Set return value */
+    ret_value = grp;
+
+done:
+    if(!ret_value && grp) {
+        H5O_loc_free(&(grp->oloc));
+        H5G_name_free(&(grp->path));
+        grp = H5FL_FREE(H5G_t, grp);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_open_oid
+ *
+ * Purpose:	Opens an existing group.  The group should eventually be
+ *		closed by calling H5G_close().
+ *
+ * Return:	Success:	Ptr to a new group.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *	    Wednesday, March	17, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_open_oid(H5G_t *grp, hid_t dxpl_id)
+{
+    hbool_t             obj_opened = FALSE;
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(grp);
+
+    /* Allocate the shared information for the group */
+    if(NULL == (grp->shared = H5FL_CALLOC(H5G_shared_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Grab the object header */
+    if(H5O_open(&(grp->oloc)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+    obj_opened = TRUE;
+
+    /* Check if this object has the right message(s) to be treated as a group */
+    if((H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id) <= 0)
+            && (H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, dxpl_id) <= 0))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "not a group")
+
+done:
+    if(ret_value < 0) {
+        if(obj_opened)
+            H5O_close(&(grp->oloc));
+        if(grp->shared)
+            grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_open_oid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_close
+ *
+ * Purpose:	Closes the specified group.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_close(H5G_t *grp)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+    HDassert(grp->shared->fo_count > 0);
+
+    --grp->shared->fo_count;
+
+    if(0 == grp->shared->fo_count) {
+        HDassert(grp != H5G_rootof(H5G_fileof(grp)));
+
+        /* Remove the group from the list of opened objects in the file */
+        if(H5FO_top_decr(grp->oloc.file, grp->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+        if(H5FO_delete(grp->oloc.file, H5AC_dxpl_id, grp->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't remove group from list of open objects")
+        if(H5O_close(&(grp->oloc)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
+        grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
+    } else {
+        /* Decrement the ref. count for this object in the top file */
+        if(H5FO_top_decr(grp->oloc.file, grp->oloc.addr) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+
+        /* Check reference count for this object in the top file */
+        if(H5FO_top_count(grp->oloc.file, grp->oloc.addr) == 0) {
+            if(H5O_close(&(grp->oloc)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
+        } /* end if */
+        else
+            /* Free object location (i.e. "unhold" the file if appropriate) */
+            if(H5O_loc_free(&(grp->oloc)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
+
+        /* If this group is a mount point and the mount point is the last open
+         * reference to the group, then attempt to close down the file hierarchy
+         */
+        if(grp->shared->mounted && grp->shared->fo_count == 1) {
+            /* Attempt to close down the file hierarchy */
+            if(H5F_try_close(grp->oloc.file) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
+        } /* end if */
+    } /* end else */
+
+    if(H5G_name_free(&(grp->path)) < 0) {
+        grp = H5FL_FREE(H5G_t, grp);
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't free group entry name")
+    } /* end if */
+
+    grp = H5FL_FREE(H5G_t, grp);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_oloc
+ *
+ * Purpose:	Returns a pointer to the object location for a group.
+ *
+ * Return:	Success:	Ptr to group entry
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March 24, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_loc_t *
+H5G_oloc(H5G_t *grp)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(grp ? &(grp->oloc) : NULL)
+} /* end H5G_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_nameof
+ *
+ * Purpose:	Returns a pointer to the hier. name for a group.
+ *
+ * Return:	Success:	Ptr to hier. name
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_name_t *
+H5G_nameof(H5G_t *grp)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(grp ? &(grp->path) : NULL)
+} /* end H5G_nameof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_fileof
+ *
+ * Purpose:	Returns the file to which the specified group belongs.
+ *
+ * Return:	Success:	File pointer.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March 24, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5F_t *
+H5G_fileof(H5G_t *grp)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(grp);
+
+    FUNC_LEAVE_NOAPI(grp->oloc.file)
+} /* end H5G_fileof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_get_shared_count
+ *
+ * Purpose:	Queries the group object's "shared count"
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July	 5, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_get_shared_count(H5G_t *grp)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+
+    FUNC_LEAVE_NOAPI(grp->shared->fo_count)
+} /* end H5G_get_shared_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_mount
+ *
+ * Purpose:	Sets the 'mounted' flag for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_mount(H5G_t *grp)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+    HDassert(grp->shared->mounted == FALSE);
+
+    /* Set the 'mounted' flag */
+    grp->shared->mounted = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_mount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_mounted
+ *
+ * Purpose:	Retrieves the 'mounted' flag for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July 15, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5G_mounted(H5G_t *grp)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+
+    FUNC_LEAVE_NOAPI(grp->shared->mounted)
+} /* end H5G_mounted() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_unmount
+ *
+ * Purpose:	Resets the 'mounted' flag for a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, July 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_unmount(H5G_t *grp)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+    HDassert(grp->shared->mounted == TRUE);
+
+    /* Reset the 'mounted' flag */
+    grp->shared->mounted = FALSE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_unmount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_iterate_cb
+ *
+ * Purpose:     Callback function for iterating over links in a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Oct  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_iterate_cb(const H5O_link_t *lnk, void *_udata)
+{
+    H5G_iter_appcall_ud_t *udata = (H5G_iter_appcall_ud_t *)_udata;     /* User data for callback */
+    herr_t ret_value = H5_ITER_ERROR;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(lnk);
+    HDassert(udata);
+
+    switch(udata->lnk_op.op_type) {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        case H5G_LINK_OP_OLD:
+            /* Make the old-type application callback */
+            ret_value = (udata->lnk_op.op_func.op_old)(udata->gid, lnk->name, udata->op_data);
+            break;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+        case H5G_LINK_OP_NEW:
+            {
+                H5L_info_t info;    /* Link info */
+
+                /* Retrieve the info for the link */
+                if(H5G_link_to_info(lnk, &info) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get info for link")
+
+                /* Make the application callback */
+                ret_value = (udata->lnk_op.op_func.op_new)(udata->gid, lnk->name, &info, udata->op_data);
+            }
+            break;
+
+        default:
+            HDassert(0 && "Unknown link op type?!?");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_iterate
+ *
+ * Purpose:     Private function for iterating over links in a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Oct  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_iterate(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    const H5G_link_iterate_t *lnk_op, void *op_data, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t	loc;            /* Location of parent for group */
+    hid_t gid = -1;             /* ID of group to iterate over */
+    H5G_t *grp = NULL;          /* Pointer to group data structure to iterate over */
+    H5G_iter_appcall_ud_t udata; /* User data for callback */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(group_name);
+    HDassert(last_lnk);
+    HDassert(lnk_op && lnk_op->op_func.op_new);
+
+    /*
+     * Open the group on which to operate.  We also create a group ID which
+     * we can pass to the application-defined operator.
+     */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(NULL == (grp = H5G__open_name(&loc, group_name, lapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+    if((gid = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+    /* Set up user data for callback */
+    udata.gid = gid;
+    udata.lnk_op = *lnk_op;
+    udata.op_data = op_data;
+
+    /* Call the real group iteration routine */
+    if((ret_value = H5G__obj_iterate(&(grp->oloc), idx_type, order, skip, last_lnk, H5G_iterate_cb, &udata, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "error iterating over links")
+
+done:
+    /* Release the group opened */
+    if(gid > 0) {
+        if(H5I_dec_app_ref(gid) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close group")
+    } /* end if */
+    else if(grp && H5G_close(grp) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_free_visit_visited
+ *
+ * Purpose:     Free the key for an object visited during a group traversal
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *	        Nov  4, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_free_visit_visited(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *operator_data/*in,out*/)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    item = H5FL_FREE(H5_obj_t, item);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_free_visit_visited() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_visit_cb
+ *
+ * Purpose:     Callback function for recursively visiting links from a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov  4, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_visit_cb(const H5O_link_t *lnk, void *_udata)
+{
+    H5G_iter_visit_ud_t *udata = (H5G_iter_visit_ud_t *)_udata;     /* User data for callback */
+    H5L_info_t info;                    /* Link info */
+    H5G_loc_t   obj_loc;                /* Location of object */
+    H5G_name_t  obj_path;            	/* Object's group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Object's object location */
+    hbool_t     obj_found = FALSE;      /* Object at 'name' found */
+    size_t old_path_len = udata->curr_path_len; /* Length of path before appending this link's name */
+    size_t link_name_len;               /* Length of link's name */
+    size_t len_needed;                  /* Length of path string needed */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(lnk);
+    HDassert(udata);
+
+    /* Check if we will need more space to store this link's relative path */
+    /* ("+2" is for string terminator and possible '/' for group separator later) */
+    link_name_len = HDstrlen(lnk->name);
+    len_needed = udata->curr_path_len + link_name_len + 2;
+    if(len_needed > udata->path_buf_size) {
+        void *new_path;         /* Pointer to new path buffer */
+
+        /* Attempt to allocate larger buffer for path */
+        if(NULL == (new_path = H5MM_realloc(udata->path, len_needed)))
+            HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, H5_ITER_ERROR, "can't allocate path string")
+        udata->path = (char *)new_path;
+        udata->path_buf_size = len_needed;
+    } /* end if */
+
+    /* Build the link's relative path name */
+    HDassert(udata->path[old_path_len] == '\0');
+    HDstrncpy(&(udata->path[old_path_len]), lnk->name, link_name_len + 1);
+    udata->curr_path_len += link_name_len;
+
+    /* Construct the link info from the link message */
+    if(H5G_link_to_info(lnk, &info) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get info for link")
+
+    /* Make the application callback */
+    ret_value = (udata->op)(udata->gid, udata->path, &info, udata->op_data);
+
+    /* Check for doing more work */
+    if(ret_value == H5_ITER_CONT && lnk->type == H5L_TYPE_HARD) {
+        H5_obj_t obj_pos;       /* Object "position" for this object */
+
+        /* Set up opened group location to fill in */
+        obj_loc.oloc = &obj_oloc;
+        obj_loc.path = &obj_path;
+        H5G_loc_reset(&obj_loc);
+
+        /* Find the object using the LAPL passed in */
+        /* (Correctly handles mounted files) */
+        if(H5G_loc_find(udata->curr_loc, lnk->name, &obj_loc/*out*/, udata->lapl_id, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "object not found")
+        obj_found = TRUE;
+
+        /* Construct unique "position" for this object */
+        H5F_GET_FILENO(obj_oloc.file, obj_pos.fileno);
+        obj_pos.addr = obj_oloc.addr;
+
+        /* Check if we've seen the object the link references before */
+        if(NULL == H5SL_search(udata->visited, &obj_pos)) {
+            H5O_type_t otype;       /* Basic object type (group, dataset, etc.) */
+            unsigned rc;		/* Reference count of object    */
+
+            /* Get the object's reference count and type */
+            if(H5O_get_rc_and_type(&obj_oloc, udata->dxpl_id, &rc, &otype) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get object info")
+
+            /* If its ref count is > 1, we add it to the list of visited objects */
+            /* (because it could come up again during traversal) */
+            if(rc > 1) {
+                H5_obj_t *new_node;                  /* New object node for visited list */
+
+                /* Allocate new object "position" node */
+                if((new_node = H5FL_MALLOC(H5_obj_t)) == NULL)
+                    HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, H5_ITER_ERROR, "can't allocate object node")
+
+                /* Set node information */
+                *new_node = obj_pos;
+
+                /* Add to list of visited objects */
+                if(H5SL_insert(udata->visited, new_node, new_node) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5_ITER_ERROR, "can't insert object node into visited list")
+            } /* end if */
+
+            /* If it's a group, we recurse into it */
+            if(otype == H5O_TYPE_GROUP) {
+                H5G_loc_t *old_loc = udata->curr_loc;       /* Pointer to previous group location info */
+                H5_index_t idx_type = udata->idx_type;      /* Type of index to use */
+                H5O_linfo_t	linfo;		        /* Link info message */
+                htri_t linfo_exists;                    /* Whether the link info message exists */
+
+                /* Add the path separator to the current path */
+                HDassert(udata->path[udata->curr_path_len] == '\0');
+                HDstrncpy(&(udata->path[udata->curr_path_len]), "/", (size_t)2);
+                udata->curr_path_len++;
+
+                /* Attempt to get the link info for this group */
+                if((linfo_exists = H5G__obj_get_linfo(&obj_oloc, &linfo, udata->dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "can't check for link info message")
+                if(linfo_exists) {
+                    /* Check for creation order tracking, if creation order index lookup requested */
+                    if(idx_type == H5_INDEX_CRT_ORDER) {
+                        /* Check if creation order is tracked */
+                        if(!linfo.track_corder)
+                            /* Switch to name order for this group */
+                            idx_type = H5_INDEX_NAME;
+                    } /* end if */
+                    else
+                        HDassert(idx_type == H5_INDEX_NAME);
+                } /* end if */
+                else {
+                    /* Can only perform name lookups on groups with symbol tables */
+                    if(idx_type != H5_INDEX_NAME)
+                        /* Switch to name order for this group */
+                        idx_type = H5_INDEX_NAME;
+                } /* end if */
+
+                /* Point to this group's location info */
+                udata->curr_loc = &obj_loc;
+
+                /* Iterate over links in group */
+                ret_value = H5G__obj_iterate(&obj_oloc, idx_type, udata->order, (hsize_t)0, NULL, H5G_visit_cb, udata, udata->dxpl_id);
+
+                /* Restore location */
+                udata->curr_loc = old_loc;
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Reset path back to incoming path */
+    udata->path[old_path_len] = '\0';
+    udata->curr_path_len = old_path_len;
+
+    /* Release resources */
+    if(obj_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, H5_ITER_ERROR, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_visit_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_visit
+ *
+ * Purpose:	Recursively visit all the links in a group and all
+ *              the groups that are linked to from that group.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Each _link_ reachable from the initial group will only be
+ *              visited once.  However, because an object may be reached from
+ *              more than one link, the visitation may call the application's
+ *              callback with more than one link that points to a particular
+ *              _object_.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ *
+ *
+ * Programmer:	Quincey Koziol
+ *		November 4 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_visit(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, H5L_iterate_t op, void *op_data, hid_t lapl_id,
+    hid_t dxpl_id)
+{
+    H5G_iter_visit_ud_t udata;      /* User data for callback */
+    H5O_linfo_t	linfo;		    /* Link info message */
+    htri_t linfo_exists;            /* Whether the link info message exists */
+    hid_t       gid = (-1);         /* Group ID */
+    H5G_t      *grp = NULL;         /* Group opened */
+    H5G_loc_t	loc;                /* Location of group passed in */
+    H5G_loc_t	start_loc;          /* Location of starting group */
+    unsigned    rc;		    /* Reference count of object    */
+    herr_t      ret_value;          /* Return value */
+
+    /* Portably clear udata struct (before FUNC_ENTER) */
+    HDmemset(&udata, 0, sizeof(udata));
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Open the group to begin visiting within */
+    if((grp = H5G__open_name(&loc, group_name, lapl_id, dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+
+    /* Register an ID for the starting group */
+    if((gid = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+    /* Get the location of the starting group */
+    if(H5G_loc(gid, &start_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Set up user data */
+    udata.gid = gid;
+    udata.curr_loc = &start_loc;
+    udata.lapl_id = lapl_id;
+    udata.dxpl_id = dxpl_id;
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.op = op;
+    udata.op_data = op_data;
+
+    /* Allocate space for the path name */
+    if(NULL == (udata.path = H5MM_strdup("")))
+        HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate path name buffer")
+    udata.path_buf_size = 1;
+    udata.curr_path_len = 0;
+
+    /* Create skip list to store visited object information */
+    if((udata.visited = H5SL_create(H5SL_TYPE_OBJ, NULL)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCREATE, FAIL, "can't create skip list for visited objects")
+
+    /* Get the group's reference count */
+    if(H5O_get_rc_and_type(&grp->oloc, dxpl_id, &rc, NULL) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get object info")
+
+    /* If its ref count is > 1, we add it to the list of visited objects */
+    /* (because it could come up again during traversal) */
+    if(rc > 1) {
+        H5_obj_t *obj_pos;                  /* New object node for visited list */
+
+        /* Allocate new object "position" node */
+        if((obj_pos = H5FL_MALLOC(H5_obj_t)) == NULL)
+            HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate object node")
+
+        /* Construct unique "position" for this object */
+        H5F_GET_FILENO(grp->oloc.file, obj_pos->fileno);
+        obj_pos->addr = grp->oloc.addr;
+
+        /* Add to list of visited objects */
+        if(H5SL_insert(udata.visited, obj_pos, obj_pos) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "can't insert object node into visited list")
+    } /* end if */
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(&(grp->oloc), &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for creation order tracking, if creation order index lookup requested */
+        if(idx_type == H5_INDEX_CRT_ORDER) {
+            /* Check if creation order is tracked */
+            if(!linfo.track_corder)
+                /* Switch to name order for this group */
+                idx_type = H5_INDEX_NAME;
+        } /* end if */
+        else
+            HDassert(idx_type == H5_INDEX_NAME);
+    } /* end if */
+    else {
+        /* Can only perform name lookups on groups with symbol tables */
+        if(idx_type != H5_INDEX_NAME)
+            /* Switch to name order for this group */
+            idx_type = H5_INDEX_NAME;
+    } /* end if */
+
+    /* Call the link iteration routine */
+    if((ret_value = H5G__obj_iterate(&(grp->oloc), idx_type, order, (hsize_t)0, NULL, H5G_visit_cb, &udata, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't visit links")
+
+done:
+    /* Release user data resources */
+    H5MM_xfree(udata.path);
+    if(udata.visited)
+        H5SL_destroy(udata.visited, H5G_free_visit_visited, NULL);
+
+    /* Release the group opened */
+    if(gid > 0) {
+        if(H5I_dec_app_ref(gid) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close group")
+    } /* end if */
+    else if(grp && H5G_close(grp) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_visit() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Glink.c b/gatb-core/thirdparty/hdf5/src/H5Glink.c
new file mode 100644
index 0000000..8b258b5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Glink.c
@@ -0,0 +1,569 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Glink.c
+ *			Nov 13 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Functions for handling links in groups.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Iprivate.h"         /* IDs                                  */
+#include "H5Lprivate.h"		/* Links                                */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppublic.h"		/* Property Lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int H5G_link_cmp_name_inc(const void *lnk1, const void *lnk2);
+static int H5G_link_cmp_name_dec(const void *lnk1, const void *lnk2);
+static int H5G_link_cmp_corder_inc(const void *lnk1, const void *lnk2);
+static int H5G_link_cmp_corder_dec(const void *lnk1, const void *lnk2);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_cmp_name_inc
+ *
+ * Purpose:	Callback routine for comparing two link names, in
+ *              increasing alphabetic order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              first argument is considered to be respectively less than,
+ *              equal to, or greater than the second.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *              (i.e. same as strcmp())
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  5 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_link_cmp_name_inc(const void *lnk1, const void *lnk2)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(HDstrcmp(((const H5O_link_t *)lnk1)->name, ((const H5O_link_t *)lnk2)->name))
+} /* end H5G_link_cmp_name_inc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_cmp_name_dec
+ *
+ * Purpose:	Callback routine for comparing two link names, in
+ *              decreasing alphabetic order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              second argument is considered to be respectively less than,
+ *              equal to, or greater than the first.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *              (i.e. opposite strcmp())
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_link_cmp_name_dec(const void *lnk1, const void *lnk2)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(HDstrcmp(((const H5O_link_t *)lnk2)->name, ((const H5O_link_t *)lnk1)->name))
+} /* end H5G_link_cmp_name_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_cmp_corder_inc
+ *
+ * Purpose:	Callback routine for comparing two link creation orders, in
+ *              increasing order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              first argument is considered to be respectively less than,
+ *              equal to, or greater than the second.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_link_cmp_corder_inc(const void *lnk1, const void *lnk2)
+{
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(((const H5O_link_t *)lnk1)->corder < ((const H5O_link_t *)lnk2)->corder)
+        ret_value = -1;
+    else if(((const H5O_link_t *)lnk1)->corder > ((const H5O_link_t *)lnk2)->corder)
+        ret_value = 1;
+    else
+        ret_value = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_link_cmp_corder_inc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_cmp_corder_dec
+ *
+ * Purpose:	Callback routine for comparing two link creation orders, in
+ *              decreasing order
+ *
+ * Return:	An integer less than, equal to, or greater than zero if the
+ *              second argument is considered to be respectively less than,
+ *              equal to, or greater than the first.  If two members compare
+ *              as equal, their order in the sorted array is undefined.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_link_cmp_corder_dec(const void *lnk1, const void *lnk2)
+{
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(((const H5O_link_t *)lnk1)->corder < ((const H5O_link_t *)lnk2)->corder)
+        ret_value = 1;
+    else if(((const H5O_link_t *)lnk1)->corder > ((const H5O_link_t *)lnk2)->corder)
+        ret_value = -1;
+    else
+        ret_value = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_link_cmp_corder_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__ent_to_link
+ *
+ * Purpose:     Convert a symbol table entry to a link
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 16 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap,
+    const H5G_entry_t *ent, const char *name)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(heap);
+    HDassert(ent);
+    HDassert(name);
+
+    /* Set (default) common info for link */
+    lnk->cset = H5F_DEFAULT_CSET;
+    lnk->corder = 0;
+    lnk->corder_valid = FALSE;       /* Creation order not valid for this link */
+    lnk->name = H5MM_xstrdup(name);
+    HDassert(lnk->name);
+
+    /* Object is a symbolic or hard link */
+    if(ent->type == H5G_CACHED_SLINK) {
+        const char *s;          /* Pointer to link value */
+
+        s = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset);
+        HDassert(s);
+
+        /* Copy the link value */
+        lnk->u.soft.name = H5MM_xstrdup(s);
+
+        /* Set link type */
+        lnk->type = H5L_TYPE_SOFT;
+    } /* end if */
+    else {
+        /* Set address of object */
+        lnk->u.hard.addr = ent->header;
+
+        /* Set link type */
+        lnk->type = H5L_TYPE_HARD;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__ent_to_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_link_to_info
+ *
+ * Purpose:	Retrieve information from a link object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_link_to_info(const H5O_link_t *lnk, H5L_info_t *info)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(lnk);
+
+    /* Get information from the link */
+    if(info) {
+        info->cset = lnk->cset;
+        info->corder = lnk->corder;
+        info->corder_valid = lnk->corder_valid;
+        info->type = lnk->type;
+
+        switch(lnk->type) {
+            case H5L_TYPE_HARD:
+                info->u.address = lnk->u.hard.addr;
+                break;
+
+            case H5L_TYPE_SOFT:
+                info->u.val_size = HDstrlen(lnk->u.soft.name) + 1; /*count the null terminator*/
+                break;
+
+            case H5L_TYPE_ERROR:
+            case H5L_TYPE_EXTERNAL:
+            case H5L_TYPE_MAX:
+            default:
+            {
+                const H5L_class_t *link_class;      /* User-defined link class */
+
+                if(lnk->type < H5L_TYPE_UD_MIN || lnk->type > H5L_TYPE_MAX)
+                    HGOTO_ERROR(H5E_LINK, H5E_BADTYPE, FAIL, "unknown link class")
+
+                /* User-defined link; call its query function to get the link udata size. */
+                /* Get the link class for this type of link.  It's okay if the class
+                 * isn't registered, though--we just can't give any more information
+                 * about it
+                 */
+                link_class = H5L_find_class(lnk->type);
+
+                if(link_class != NULL && link_class->query_func != NULL) {
+                    ssize_t cb_ret;             /* Return value from UD callback */
+
+                    /* Call the link's query routine to retrieve the user-defined link's value size */
+                    /* (in case the query routine packs/unpacks the link value in some way that changes its size) */
+                    if((cb_ret = (link_class->query_func)(lnk->name, lnk->u.ud.udata, lnk->u.ud.size, NULL, (size_t)0)) < 0)
+                        HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "query buffer size callback returned failure")
+
+                    info->u.val_size = (size_t)cb_ret;
+                } /* end if */
+                else
+                    info->u.val_size = 0;
+            } /* end case */
+        } /* end switch */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_link_to_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__link_to_loc
+ *
+ * Purpose:	Build group location from group and link object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 20 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_to_loc(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(grp_loc);
+    HDassert(lnk);
+    HDassert(obj_loc);
+
+    /*
+     * Build location from the link
+     */
+
+    /* Check for unknown library-internal link */
+    if(lnk->type > H5L_TYPE_BUILTIN_MAX && lnk->type < H5L_TYPE_UD_MIN)
+        HGOTO_ERROR(H5E_SYM, H5E_UNSUPPORTED, FAIL, "unknown link type")
+
+    /* Build object's group hier. location */
+    if(H5G_name_set(grp_loc->path, obj_loc->path, lnk->name) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "cannot set name")
+
+    /* Set the object location, if it's a hard link set the address also */
+    obj_loc->oloc->file = grp_loc->oloc->file;
+    obj_loc->oloc->holding_file = FALSE;
+    if(lnk->type == H5L_TYPE_HARD)
+        obj_loc->oloc->addr = lnk->u.hard.addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__link_to_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__link_sort_table
+ *
+ * Purpose:     Sort table containing a list of links for a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov 20, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_sort_table(H5G_link_table_t *ltable, H5_index_t idx_type,
+    H5_iter_order_t order)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDassert(ltable);
+
+    /* Pick appropriate sorting routine */
+    if(idx_type == H5_INDEX_NAME) {
+        if(order == H5_ITER_INC)
+            HDqsort(ltable->lnks, ltable->nlinks, sizeof(H5O_link_t), H5G_link_cmp_name_inc);
+        else if(order == H5_ITER_DEC)
+            HDqsort(ltable->lnks, ltable->nlinks, sizeof(H5O_link_t), H5G_link_cmp_name_dec);
+        else
+            HDassert(order == H5_ITER_NATIVE);
+    } /* end if */
+    else {
+        HDassert(idx_type == H5_INDEX_CRT_ORDER);
+        if(order == H5_ITER_INC)
+            HDqsort(ltable->lnks, ltable->nlinks, sizeof(H5O_link_t), H5G_link_cmp_corder_inc);
+        else if(order == H5_ITER_DEC)
+            HDqsort(ltable->lnks, ltable->nlinks, sizeof(H5O_link_t), H5G_link_cmp_corder_dec);
+        else
+            HDassert(order == H5_ITER_NATIVE);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__link_sort_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__link_iterate_table
+ *
+ * Purpose:     Iterate over table containing a list of links for a group,
+ *              making appropriate callbacks
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov 20, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_iterate_table(const H5G_link_table_t *ltable, hsize_t skip,
+    hsize_t *last_lnk, const H5G_lib_iterate_t op, void *op_data)
+{
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDassert(ltable);
+    HDassert(op);
+
+    /* Skip over links, if requested */
+    if(last_lnk)
+        *last_lnk += skip;
+
+    /* Iterate over link messages */
+    H5_CHECKED_ASSIGN(u, size_t, skip, hsize_t)
+    for(; u < ltable->nlinks && !ret_value; u++) {
+        /* Make the callback */
+        ret_value = (op)(&(ltable->lnks[u]), op_data);
+
+        /* Increment the number of entries passed through */
+        if(last_lnk)
+            (*last_lnk)++;
+    } /* end for */
+
+    /* Check for callback failure and pass along return value */
+    if(ret_value < 0)
+        HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__link_iterate_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__link_release_table
+ *
+ * Purpose:     Release table containing a list of links for a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep  6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_release_table(H5G_link_table_t *ltable)
+{
+    size_t      u;                      /* Local index variable */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(ltable);
+
+    /* Release link info, if any */
+    if(ltable->nlinks > 0) {
+        /* Free link message information */
+        for(u = 0; u < ltable->nlinks; u++)
+            if(H5O_msg_reset(H5O_LINK_ID, &(ltable->lnks[u])) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link message")
+
+        /* Free table of links */
+        H5MM_xfree(ltable->lnks);
+    } /* end if */
+    else
+        HDassert(ltable->lnks == NULL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__link_release_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__link_name_replace
+ *
+ * Purpose:	Determine the type of object referred to (for hard links) or
+ *              the link type (for soft links and user-defined links).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_name_replace(H5F_t *file, hid_t dxpl_id, H5RS_str_t *grp_full_path_r,
+    const H5O_link_t *lnk)
+{
+    H5RS_str_t *obj_path_r = NULL;      /* Full path for link being removed */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(file);
+
+    /* Search the open IDs and replace names for unlinked object */
+    if(grp_full_path_r) {
+        obj_path_r = H5G_build_fullpath_refstr_str(grp_full_path_r, lnk->name);
+        if(H5G_name_replace(lnk, H5G_NAME_DELETE, file, obj_path_r, NULL, NULL, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to replace name")
+    } /* end if */
+
+done:
+    if(obj_path_r)
+        H5RS_decr(obj_path_r);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__link_name_replace() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gloc.c b/gatb-core/thirdparty/hdf5/src/H5Gloc.c
new file mode 100644
index 0000000..677cc25
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gloc.c
@@ -0,0 +1,940 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gloc.c
+ *			Sep 13 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Functions for working with group "locations"
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Aprivate.h"		/* Attributes				*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for looking up an object in a group */
+typedef struct {
+    /* upward */
+    H5G_loc_t  *loc;            /* Group location to set */
+} H5G_loc_fnd_t;
+
+/* User data for checking if an object exists */
+typedef struct {
+    /* upward */
+    htri_t exists;              /* Whether the object exists */
+} H5G_loc_exists_t;
+
+/* User data for looking up an object in a group by index */
+typedef struct {
+    /* downward */
+    hid_t lapl_id;              /* LAPL to use for operation */
+    hid_t dxpl_id;              /* DXPL to use for operation */
+    H5_index_t idx_type;        /* Index to use */
+    H5_iter_order_t order;      /* Iteration order within index */
+    hsize_t n;                  /* Offset within index */
+
+    /* upward */
+    H5G_loc_t  *loc;            /* Group location to set */
+} H5G_loc_fbi_t;
+
+/* User data for getting an object's info in a group */
+typedef struct {
+    /* downward */
+    hid_t dxpl_id;              /* DXPL to use for operation */
+    hbool_t want_ih_info;       /* Whether to retrieve the index & heap info */
+
+    /* upward */
+    H5O_info_t  *oinfo;         /* Object information to retrieve */
+} H5G_loc_info_t;
+
+/* User data for setting an object's comment in a group */
+typedef struct {
+    /* downward */
+    hid_t dxpl_id;              /* DXPL to use for operation */
+    const char *comment;        /* Object comment buffer */
+
+    /* upward */
+} H5G_loc_sc_t;
+
+/* User data for getting an object's comment in a group */
+typedef struct {
+    /* downward */
+    hid_t dxpl_id;              /* DXPL to use for operation */
+    char  *comment;             /* Object comment buffer */
+    size_t bufsize;             /* Size of object comment buffer */
+
+    /* upward */
+    ssize_t comment_size;       /* Actual size of object comment */
+} H5G_loc_gc_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Group traversal callbacks */
+static herr_t H5G_loc_find_cb(H5G_loc_t *grp_loc, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata,
+    H5G_own_loc_t *own_loc);
+static herr_t H5G_loc_find_by_idx_cb(H5G_loc_t *grp_loc, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata,
+    H5G_own_loc_t *own_loc);
+static herr_t H5G_loc_set_comment_cb(H5G_loc_t *grp_loc, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata,
+    H5G_own_loc_t *own_loc);
+static herr_t H5G_loc_get_comment_cb(H5G_loc_t *grp_loc, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata,
+    H5G_own_loc_t *own_loc);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc
+ *
+ * Purpose:	Given an object ID return a location for the object.
+ *
+ * Return:	Success:	Group pointer.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc(hid_t loc_id, H5G_loc_t *loc)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    switch(H5I_get_type(loc_id)) {
+        case H5I_FILE:
+            {
+                H5F_t	*f;
+
+                /* Get the file struct */
+                if(NULL == (f = (H5F_t *)H5I_object(loc_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file ID")
+
+                /* Construct a group location for root group of the file */
+                if(H5G_root_loc(f, loc) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unable to create location for file")
+            } /* end case */
+            break;
+
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of property list")
+
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of error class, message or stack")
+
+        case H5I_GROUP:
+            {
+                H5G_t	*group;
+
+                if(NULL == (group = (H5G_t *)H5I_object(loc_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid group ID")
+                if(NULL == (loc->oloc = H5G_oloc(group)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of group")
+                if(NULL == (loc->path = H5G_nameof(group)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path of group")
+            } /* end case */
+            break;
+
+        case H5I_DATATYPE:
+            {
+                H5T_t	*dt;
+
+                if(NULL == (dt = (H5T_t *)H5I_object(loc_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid type ID")
+                if(NULL == (loc->oloc = H5T_oloc(dt)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of datatype")
+                if(NULL == (loc->path = H5T_nameof(dt)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path of datatype")
+            } /* end case */
+            break;
+
+        case H5I_DATASPACE:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of dataspace")
+
+        case H5I_DATASET:
+            {
+                H5D_t	*dset;
+
+                if(NULL == (dset = (H5D_t *)H5I_object(loc_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid data ID")
+                if(NULL == (loc->oloc = H5D_oloc(dset)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of dataset")
+                if(NULL == (loc->path = H5D_nameof(dset)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path of dataset")
+            } /* end case */
+            break;
+
+        case H5I_ATTR:
+            {
+                H5A_t	*attr;
+
+                if(NULL == (attr = (H5A_t *)H5I_object(loc_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid attribute ID")
+                if(NULL == (loc->oloc = H5A_oloc(attr)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of attribute")
+                if(NULL == (loc->path = H5A_nameof(attr)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path of attribute")
+            } /* end case */
+            break;
+
+        case H5I_REFERENCE:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of reference")
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_VFL:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object ID")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__loc_copy
+ *
+ * Purpose:	Copy over information for a location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args. */
+    HDassert(dst);
+    HDassert(src);
+
+    /* Copy components of the location */
+    if(H5O_loc_copy(dst->oloc, src->oloc, depth) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to copy entry")
+    if(H5G_name_copy(dst->path, src->path, depth) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to copy path")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__loc_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_reset
+ *
+ * Purpose:	Reset information for a location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_reset(H5G_loc_t *loc)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+
+    /* Reset components of the location */
+    if(H5O_loc_reset(loc->oloc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to reset entry")
+    if(H5G_name_reset(loc->path) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to reset path")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_free
+ *
+ * Purpose:	Free information for a location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_free(H5G_loc_t *loc)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+
+    /* Reset components of the location */
+    if(H5G_name_free(loc->path) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free path")
+    if(H5O_loc_free(loc->oloc) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to free object header location")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_find_cb
+ *
+ * Purpose:	Callback for retrieving object location for an object in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 17, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_find_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_fnd_t *udata = (H5G_loc_fnd_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid object */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object '%s' doesn't exist", name)
+
+    /* Take ownership of the object's group location */
+    /* (Group traversal callbacks are responsible for either taking ownership
+     *  of the group location for the object, or freeing it. - QAK)
+     */
+    H5G__loc_copy(udata->loc, obj_loc, H5_COPY_SHALLOW);
+    *own_loc = H5G_OWN_OBJ_LOC;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_find_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_find
+ *
+ * Purpose:	Find a symbol from a location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_find(const H5G_loc_t *loc, const char *name, H5G_loc_t *obj_loc/*out*/,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_fnd_t udata;                /* User data for traversal callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(obj_loc);
+
+    /* Set up user data for locating object */
+    udata.loc = obj_loc;
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_find_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_find_by_idx_cb
+ *
+ * Purpose:	Callback for retrieving object location for an object in a group
+ *              according to the order within an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 20, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_find_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_fbi_t *udata = (H5G_loc_fbi_t *)_udata;   /* User data passed in */
+    H5O_link_t fnd_lnk;                 /* Link within group */
+    hbool_t lnk_copied = FALSE;         /* Whether the link was copied */
+    size_t links_left = H5L_NUM_LINKS;  /* # of links left to traverse */
+    hbool_t obj_loc_valid = FALSE;      /* Flag to indicate that the object location is valid */
+    hbool_t obj_exists = FALSE;         /* Whether the object exists (unused) */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Query link */
+    if(H5G_obj_lookup_by_idx(obj_loc->oloc, udata->idx_type, udata->order,
+                udata->n, &fnd_lnk, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "link not found")
+    lnk_copied = TRUE;
+
+    /* Build the initial object location for the link */
+    if(H5G__link_to_loc(obj_loc, &fnd_lnk, udata->loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "cannot initialize object location")
+    obj_loc_valid = TRUE;
+
+    /* Perform any special traversals that the link needs */
+    /* (soft links, user-defined links, file mounting, etc.) */
+    /* (may modify the object location) */
+    if(H5G__traverse_special(obj_loc, &fnd_lnk, H5G_TARGET_NORMAL, &links_left, TRUE, udata->loc, &obj_exists, udata->lapl_id, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_TRAVERSE, FAIL, "special link traversal failed")
+
+done:
+    /* Reset the link information, if we have a copy */
+    if(lnk_copied)
+        H5O_msg_reset(H5O_LINK_ID, &fnd_lnk);
+
+    /* Release the object location if we failed after copying it */
+    if(ret_value < 0 && obj_loc_valid)
+        if(H5G_loc_free(udata->loc) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_find_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_find_by_idx
+ *
+ * Purpose:	Find a symbol from a location, according to the order in an index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, November 20, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_find_by_idx(H5G_loc_t *loc, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, H5G_loc_t *obj_loc/*out*/, hid_t lapl_id,
+    hid_t dxpl_id)
+{
+    H5G_loc_fbi_t udata;                /* User data for traversal callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(group_name && *group_name);
+    HDassert(obj_loc);
+
+    /* Set up user data for locating object */
+    udata.dxpl_id = dxpl_id;
+    udata.lapl_id = lapl_id;
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.n = n;
+    udata.loc = obj_loc;
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, group_name, H5G_TARGET_NORMAL, H5G_loc_find_by_idx_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_find_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__loc_insert
+ *
+ * Purpose:	Insert an object at a location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__loc_insert(H5G_loc_t *grp_loc, const char *name, H5G_loc_t *obj_loc,
+    H5O_type_t obj_type, const void *crt_info, hid_t dxpl_id)
+{
+    H5O_link_t  lnk;                    /* Link for object to insert */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args. */
+    HDassert(grp_loc);
+    HDassert(name && *name);
+    HDassert(obj_loc);
+
+    /* Create link object for the object location */
+    lnk.type = H5L_TYPE_HARD;
+    lnk.cset = H5F_DEFAULT_CSET;
+    lnk.corder = 0;     /* Will be reset if the group is tracking creation order */
+    lnk.corder_valid = FALSE;   /* Indicate that the creation order isn't valid (yet) */
+    /* Casting away const OK -QAK */
+    lnk.name = (char *)name;
+    lnk.u.hard.addr = obj_loc->oloc->addr;
+
+    /* Insert new group into current group's symbol table */
+    if(H5G_obj_insert(grp_loc->oloc, name, &lnk, TRUE, obj_type, crt_info,
+            dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert object")
+
+    /* Set the name of the object location */
+    if(H5G_name_set(grp_loc->path, obj_loc->path, name) < 0)
+       HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "cannot set name")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__loc_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_exists_cb
+ *
+ * Purpose:	Callback for checking if an object exists
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February 2, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_exists_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_exists_t *udata = (H5G_loc_exists_t *)_udata;   /* User data passed in */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check if the name in this group resolved to a valid object */
+    if(obj_loc == NULL)
+        if(lnk)
+            udata->exists = FALSE;
+        else
+            udata->exists = FAIL;
+    else
+        udata->exists = TRUE;
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_loc_exists_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_exists
+ *
+ * Purpose:	Check if an object actually exists at a location
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, February 2, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G_loc_exists(const H5G_loc_t *loc, const char *name, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_exists_t udata;     /* User data for traversal callback */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up user data for locating object */
+    udata.exists = FALSE;
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, name, H5G_TARGET_EXISTS, H5G_loc_exists_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't check if object exists")
+
+    /* Set return value */
+    ret_value = udata.exists;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_exists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_info_cb
+ *
+ * Purpose:	Callback for retrieving object info for an object in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 23, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_info_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name, const H5O_link_t H5_ATTR_UNUSED *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_info_t *udata = (H5G_loc_info_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Query object information */
+    if(H5O_get_info(obj_loc->oloc, udata->dxpl_id, udata->want_ih_info, udata->oinfo) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object info")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_info_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_info
+ *
+ * Purpose:	Retrieve the information for an object from a group location
+ *              and path to that object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, November 23, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_info(H5G_loc_t *loc, const char *name, hbool_t want_ih_info, H5O_info_t *oinfo/*out*/,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_info_t udata;               /* User data for traversal callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(oinfo);
+
+    /* Set up user data for locating object */
+    udata.dxpl_id = dxpl_id;
+    udata.want_ih_info = want_ih_info;
+    udata.oinfo = oinfo;
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_info_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_set_comment_cb
+ *
+ * Purpose:	Callback for (re)setting object comment for an object in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 30, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_set_comment_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name, const H5O_link_t H5_ATTR_UNUSED *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_sc_t *udata = (H5G_loc_sc_t *)_udata;   /* User data passed in */
+    H5O_name_t comment;                 /* Object header "comment" message */
+    htri_t exists;                      /* Whether a "comment" message already exists */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Check for existing comment message */
+    if((exists = H5O_msg_exists(obj_loc->oloc, H5O_NAME_ID, udata->dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read object header")
+
+    /* Remove the previous comment message if any */
+    if(exists)
+        if(H5O_msg_remove(obj_loc->oloc, H5O_NAME_ID, 0, TRUE, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete existing comment object header message")
+
+    /* Add the new message */
+    if(udata->comment && *udata->comment) {
+        /* Casting away const OK -QAK */
+	comment.s = (char *)udata->comment;
+	if(H5O_msg_create(obj_loc->oloc, H5O_NAME_ID, 0, H5O_UPDATE_TIME, &comment, udata->dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to set comment object header message")
+    } /* end if */
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_set_comment_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_set_comment
+ *
+ * Purpose:	(Re)set the information for an object from a group location
+ *              and path to that object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, August 30, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_loc_set_comment(H5G_loc_t *loc, const char *name, const char *comment,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_sc_t udata;         /* User data for traversal callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up user data for locating object */
+    udata.dxpl_id = dxpl_id;
+    udata.comment = comment;
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_set_comment_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_set_comment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_get_comment_cb
+ *
+ * Purpose:	Callback for retrieving object comment for an object in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 30, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_loc_get_comment_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name, const H5O_link_t H5_ATTR_UNUSED *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_loc_gc_t *udata = (H5G_loc_gc_t *)_udata;   /* User data passed in */
+    H5O_name_t comment;                 /* Object header "comment" message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Query object comment */
+    comment.s = NULL;
+    if(NULL == H5O_msg_read(obj_loc->oloc, H5O_NAME_ID, &comment, udata->dxpl_id)) {
+	if(udata->comment && udata->bufsize > 0)
+            udata->comment[0] = '\0';
+	udata->comment_size = 0;
+    } else {
+        if(udata->comment && udata->bufsize)
+	   HDstrncpy(udata->comment, comment.s, udata->bufsize);
+	udata->comment_size = (ssize_t)HDstrlen(comment.s);
+	H5O_msg_reset(H5O_NAME_ID, &comment);
+    } /* end else */
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_get_comment_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_loc_get_comment
+ *
+ * Purpose:	Retrieve the information for an object from a group location
+ *              and path to that object
+ *
+ * Return:	Success:	Number of bytes in the comment excluding the
+ *				null terminator.  Zero if the object has no
+ *				comment.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, August 30, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G_loc_get_comment(H5G_loc_t *loc, const char *name, char *comment/*out*/,
+    size_t bufsize, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_gc_t udata;         /* User data for traversal callback */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args. */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up user data for locating object */
+    udata.dxpl_id = dxpl_id;
+    udata.comment = comment;
+    udata.bufsize = bufsize;
+    udata.comment_size = (-1);
+
+    /* Traverse group hierarchy to locate object */
+    if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_get_comment_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object")
+
+    /* Set the return value */
+    ret_value = udata.comment_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_loc_get_comment() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gname.c b/gatb-core/thirdparty/hdf5/src/H5Gname.c
new file mode 100644
index 0000000..277d08f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gname.c
@@ -0,0 +1,1352 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gname.c
+ *			Sep 12 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Functions for handling group hierarchy paths.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links                                */
+#include "H5MMprivate.h"	/* Memory wrappers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Struct used by change name callback function */
+typedef struct H5G_names_t {
+    H5G_names_op_t op;                  /* Operation performed on file */
+    H5F_t       *src_file;              /* Top file in src location's mounted file hier. */
+    H5RS_str_t  *src_full_path_r;       /* Source location's full path */
+    H5F_t       *dst_file;              /* Destination location's file */
+    H5RS_str_t  *dst_full_path_r;       /* Destination location's full path */
+} H5G_names_t;
+
+/* Info to pass to the iteration function when building name */
+typedef struct H5G_gnba_iter_t {
+    /* In */
+    const H5O_loc_t *loc; 	/* The location of the object we're looking for */
+    hid_t lapl_id; 		/* LAPL for operations */
+    hid_t dxpl_id; 		/* DXPL for operations */
+
+    /* Out */
+    char *path;                 /* Name of the object */
+} H5G_gnba_iter_t;
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static htri_t H5G_common_path(const H5RS_str_t *fullpath_r, const H5RS_str_t *prefix_r);
+static H5RS_str_t *H5G_build_fullpath(const char *prefix, const char *name);
+#ifdef NOT_YET
+static H5RS_str_t *H5G_build_fullpath_refstr_refstr(const H5RS_str_t *prefix_r, const H5RS_str_t *name_r);
+#endif /* NOT_YET */
+static herr_t H5G_name_move_path(H5RS_str_t **path_r_ptr,
+    const char *full_suffix, const char *src_path, const char *dst_path);
+static int H5G_name_replace_cb(void *obj_ptr, hid_t obj_id, void *key);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern the PQ free list for the wrapped strings */
+H5FL_BLK_EXTERN(str_buf);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__component
+ *
+ * Purpose:	Returns the pointer to the first component of the
+ *		specified name by skipping leading slashes.  Returns
+ *		the size in characters of the component through SIZE_P not
+ *		counting leading slashes or the null terminator.
+ *
+ * Return:	Success:	Ptr into NAME.
+ *
+ *		Failure:	Ptr to the null terminator of NAME.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 11 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+const char *
+H5G__component(const char *name, size_t *size_p)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(name);
+
+    while ('/' == *name)
+        name++;
+    if (size_p)
+        *size_p = HDstrcspn(name, "/");
+
+    FUNC_LEAVE_NOAPI(name)
+} /* end H5G__component() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_normalize
+ *
+ * Purpose:	Returns a pointer to a new string which has duplicate and
+ *              trailing slashes removed from it.
+ *
+ * Return:	Success:	Ptr to normalized name.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, August 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5G_normalize(const char *name)
+{
+    char *norm;         /* Pointer to the normalized string */
+    size_t	s,d;    /* Positions within the strings */
+    unsigned    last_slash;     /* Flag to indicate last character was a slash */
+    char *ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(name);
+
+    /* Duplicate the name, to return */
+    if(NULL == (norm = H5MM_strdup(name)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for normalized string")
+
+    /* Walk through the characters, omitting duplicated '/'s */
+    s = d = 0;
+    last_slash = 0;
+    while(name[s] != '\0') {
+        if(name[s] == '/')
+            if(last_slash)
+                ;
+            else {
+                norm[d++] = name[s];
+                last_slash = 1;
+            } /* end else */
+        else {
+            norm[d++] = name[s];
+            last_slash = 0;
+        } /* end else */
+        s++;
+    } /* end while */
+
+    /* Terminate normalized string */
+    norm[d] = '\0';
+
+    /* Check for final '/' on normalized name & eliminate it */
+    if(d > 1 && last_slash)
+        norm[d - 1] = '\0';
+
+    /* Set return value */
+    ret_value = norm;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_normalize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5G_common_path
+ *
+ * Purpose: Determine if one path is a valid prefix of another path
+ *
+ * Return: TRUE for valid prefix, FALSE for not a valid prefix, FAIL
+ *              on error
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: September 24, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5G_common_path(const H5RS_str_t *fullpath_r, const H5RS_str_t *prefix_r)
+{
+    const char *fullpath;       /* Pointer to actual fullpath string */
+    const char *prefix;         /* Pointer to actual prefix string */
+    size_t  nchars1,nchars2;    /* Number of characters in components */
+    htri_t ret_value=FALSE;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get component of each name */
+    fullpath=H5RS_get_str(fullpath_r);
+    HDassert(fullpath);
+    fullpath=H5G__component(fullpath,&nchars1);
+    HDassert(fullpath);
+    prefix=H5RS_get_str(prefix_r);
+    HDassert(prefix);
+    prefix=H5G__component(prefix,&nchars2);
+    HDassert(prefix);
+
+    /* Check if we have a real string for each component */
+    while(*fullpath && *prefix) {
+        /* Check that the components we found are the same length */
+        if(nchars1==nchars2) {
+            /* Check that the two components are equal */
+            if(HDstrncmp(fullpath,prefix,nchars1)==0) {
+                /* Advance the pointers in the names */
+                fullpath+=nchars1;
+                prefix+=nchars2;
+
+                /* Get next component of each name */
+                fullpath=H5G__component(fullpath,&nchars1);
+                HDassert(fullpath);
+                prefix=H5G__component(prefix,&nchars2);
+                HDassert(prefix);
+            } /* end if */
+            else
+                HGOTO_DONE(FALSE)
+        } /* end if */
+        else
+            HGOTO_DONE(FALSE)
+    } /* end while */
+
+    /* If we reached the end of the prefix path to check, it must be a valid prefix */
+    if(*prefix=='\0')
+        ret_value=TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_common_path() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5G_build_fullpath
+ *
+ * Purpose: Build a full path from a prefix & base pair of strings
+ *
+ * Return: Pointer to reference counted string on success, NULL on error
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: August 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5RS_str_t *
+H5G_build_fullpath(const char *prefix, const char *name)
+{
+    char *full_path;            /* Full user path built */
+    size_t orig_path_len;       /* Original length of the path */
+    size_t path_len;            /* Length of the path */
+    size_t name_len;            /* Length of the name */
+    unsigned need_sep;          /* Flag to indicate if separator is needed */
+    H5RS_str_t *ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(prefix);
+    HDassert(name);
+
+    /* Get the length of the prefix */
+    orig_path_len = path_len = HDstrlen(prefix);
+
+    /* Determine if there is a trailing separator in the name */
+    if(prefix[path_len - 1] == '/')
+        need_sep = 0;
+    else
+        need_sep = 1;
+
+    /* Add in the length needed for the '/' separator and the relative path */
+    name_len = HDstrlen(name);
+    path_len += name_len + need_sep;
+
+    /* Allocate space for the path */
+    if(NULL == (full_path = (char *)H5FL_BLK_MALLOC(str_buf, path_len + 1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Build full path */
+    HDstrncpy(full_path, prefix, orig_path_len + 1);
+    if(need_sep)
+        HDstrncat(full_path, "/", (size_t)1);
+    HDstrncat(full_path, name, name_len);
+
+    /* Create reference counted string for path */
+    if(NULL == (ret_value = H5RS_own(full_path)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_build_fullpath() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_build_fullpath_refstr_str
+ *
+ * Purpose:     Append an object path to an existing ref-counted path
+ *
+ * Return:	Success:	Non-NULL, combined path
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol, koziol at ncsa.uiuc.edu
+ *              Tuesday, October 11, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5RS_str_t *
+H5G_build_fullpath_refstr_str(H5RS_str_t *prefix_r, const char *name)
+{
+    const char *prefix;         /* Pointer to raw string for path */
+    H5RS_str_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(prefix_r);
+    HDassert(name);
+
+    /* Get the raw string for the user path */
+    prefix = H5RS_get_str(prefix_r);
+    HDassert(prefix);
+
+    /* Create reference counted string for path */
+    ret_value = H5G_build_fullpath(prefix, name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_build_fullpath_refstr_str() */
+
+#ifdef NOT_YET
+

+/*-------------------------------------------------------------------------
+ * Function: H5G_name_build_refstr_refstr
+ *
+ * Purpose: Build a full path from a prefix & base pair of reference counted
+ *              strings
+ *
+ * Return: Pointer to reference counted string on success, NULL on error
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: August 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5RS_str_t *
+H5G_build_fullpath_refstr_refstr(const H5RS_str_t *prefix_r, const H5RS_str_t *name_r)
+{
+    const char *prefix;         /* Pointer to raw string of prefix */
+    const char *name;           /* Pointer to raw string of name */
+    H5RS_str_t *ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get the pointer to the prefix */
+    prefix = H5RS_get_str(prefix_r);
+
+    /* Get the pointer to the raw src user path */
+    name = H5RS_get_str(name_r);
+
+    /* Create reference counted string for path */
+    ret_value = H5G_build_fullpath(prefix, name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_build_fullpath_refstr_refstr() */
+#endif /* NOT_YET */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__name_init
+ *
+ * Purpose:     Set the initial path for a group hierarchy name
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__name_init(H5G_name_t *name, const char *path)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check arguments */
+    HDassert(name);
+
+    /* Set the initial paths for a name object */
+    name->full_path_r = H5RS_create(path);
+    HDassert(name->full_path_r);
+    name->user_path_r = H5RS_create(path);
+    HDassert(name->user_path_r);
+    name->obj_hidden = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__name_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_name_set
+ *
+ * Purpose:     Set the name of a symbol entry OBJ, located at LOC
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Pedro Vicente, pvn at ncsa.uiuc.edu
+ *              Thursday, August 22, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_name_set(const H5G_name_t *loc, H5G_name_t *obj, const char *name)
+{
+    herr_t  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(loc);
+    HDassert(obj);
+    HDassert(name);
+
+    /* Free & reset the object's previous paths info (if they exist) */
+    H5G_name_free(obj);
+
+    /* Create the object's full path, if a full path exists in the location */
+    if(loc->full_path_r) {
+        /* Go build the new full path */
+        if((obj->full_path_r = H5G_build_fullpath_refstr_str(loc->full_path_r, name)) == NULL)
+            HGOTO_ERROR(H5E_SYM, H5E_PATH, FAIL, "can't build user path name")
+    } /* end if */
+
+    /* Create the object's user path, if a user path exists in the location */
+    if(loc->user_path_r) {
+        /* Go build the new user path */
+        if((obj->user_path_r = H5G_build_fullpath_refstr_str(loc->user_path_r, name)) == NULL)
+            HGOTO_ERROR(H5E_SYM, H5E_PATH, FAIL, "can't build user path name")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_name_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_name_copy
+ *
+ * Purpose:     Do a copy of group hier. names
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ * Notes:       'depth' parameter determines how much of the group entry
+ *              structure we want to copy.  The depths are:
+ *                  H5_COPY_SHALLOW - Copy all the fields from the source
+ *                      to the destination, including the user path and
+ *                      canonical path. (Destination "takes ownership" of
+ *                      user and canonical paths)
+ *                  H5_COPY_DEEP - Copy all the fields from the source to
+ *                      the destination, deep copying the user and canonical
+ *                      paths.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_name_copy(H5G_name_t *dst, const H5G_name_t *src, H5_copy_depth_t depth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(src);
+    HDassert(dst);
+#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG)
+    HDassert(dst->full_path_r == NULL);
+    HDassert(dst->user_path_r == NULL);
+#endif /* H5_USING_MEMCHECKER */
+    HDassert(depth == H5_COPY_SHALLOW || depth == H5_COPY_DEEP);
+
+    /* Copy the top level information */
+    HDmemcpy(dst, src, sizeof(H5G_name_t));
+
+    /* Deep copy the names */
+    if(depth == H5_COPY_DEEP) {
+        dst->full_path_r = H5RS_dup(src->full_path_r);
+        dst->user_path_r = H5RS_dup(src->user_path_r);
+    } else {
+        /* Discarding 'const' qualifier OK - QAK */
+        H5G_name_reset((H5G_name_t *)src);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_name_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_get_name
+ *
+ * Purpose:     Gets a name of an object from its ID.
+ *
+ * Notes:	Internal routine for H5Iget_name().
+
+ * Return:	Success:	Non-negative, length of name
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 13, 2005
+ *
+ * Modifications: Leon Arber
+ * 		  Oct. 18, 2006
+ * 		  Added functionality to get the name for a reference.
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G_get_name(const H5G_loc_t *loc, char *name/*out*/, size_t size,
+    hbool_t *cached, hid_t lapl_id, hid_t dxpl_id)
+{
+    ssize_t len = 0;            /* Length of object's name */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(loc);
+
+    /* If the user path is available and it's not "hidden", use it */
+    if(loc->path->user_path_r != NULL && loc->path->obj_hidden == 0) {
+        len = H5RS_len(loc->path->user_path_r);
+
+        if(name) {
+            HDstrncpy(name, H5RS_get_str(loc->path->user_path_r), MIN((size_t)(len + 1), size));
+            if((size_t)len >= size)
+                name[size - 1] = '\0';
+        } /* end if */
+
+        /* Indicate that the name is cached, if requested */
+        /* (Currently only used for testing - QAK, 2010/07/26) */
+        if(cached)
+            *cached = TRUE;
+    } /* end if */
+    else if(!loc->path->obj_hidden) {
+        hid_t	  file;
+
+        /* Retrieve file ID for name search */
+        if((file = H5F_get_id(loc->oloc->file, FALSE)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get file ID")
+
+        /* Search for name of object */
+        if((len = H5G_get_name_by_addr(file, lapl_id, dxpl_id, loc->oloc, name, size)) < 0) {
+            H5I_dec_ref(file);
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't determine name")
+        } /* end if */
+
+        /* Close file ID used for search */
+        if(H5I_dec_ref(file) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCLOSEFILE, FAIL, "can't determine name")
+
+        /* Indicate that the name is _not_ cached, if requested */
+        /* (Currently only used for testing - QAK, 2010/07/26) */
+        if(cached)
+            *cached = FALSE;
+    } /* end else */
+
+    /* Set return value */
+    ret_value = len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_name_reset
+ *
+ * Purpose:	Reset a group hierarchy name to an empty state
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_name_reset(H5G_name_t *name)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(name);
+
+    /* Clear the group hier. name to an empty state */
+    HDmemset(name, 0, sizeof(H5G_name_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_name_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_name_free
+ *
+ * Purpose:	Free the 'ID to name' buffers.
+ *
+ * Return:	Success
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: August 22, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_name_free(H5G_name_t *name)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(name);
+
+    if(name->full_path_r) {
+        H5RS_decr(name->full_path_r);
+        name->full_path_r = NULL;
+    } /* end if */
+    if(name->user_path_r) {
+        H5RS_decr(name->user_path_r);
+        name->user_path_r = NULL;
+    } /* end if */
+    name->obj_hidden = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_name_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_name_move_path
+ *
+ * Purpose:     Update a user or canonical path after an object moves
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_name_move_path(H5RS_str_t **path_r_ptr, const char *full_suffix, const char *src_path,
+    const char *dst_path)
+{
+    const char *path;                   /* Path to update */
+    size_t path_len;                    /* Length of path */
+    size_t full_suffix_len;             /* Length of full suffix */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(path_r_ptr && *path_r_ptr);
+    HDassert(full_suffix);
+    HDassert(src_path);
+    HDassert(dst_path);
+
+    /* Get pointer to path to update */
+    path = H5RS_get_str(*path_r_ptr);
+    HDassert(path);
+
+    /* Check if path needs to be updated */
+    full_suffix_len = HDstrlen(full_suffix);
+    path_len = HDstrlen(path);
+    if(full_suffix_len < path_len) {
+        const char *dst_suffix;         /* Destination suffix that changes */
+        size_t dst_suffix_len;          /* Length of destination suffix */
+        const char *src_suffix;         /* Source suffix that changes */
+        size_t path_prefix_len;         /* Length of path prefix */
+        const char *path_prefix2;       /* 2nd prefix for path */
+        size_t path_prefix2_len;        /* Length of 2nd path prefix */
+        const char *common_prefix;      /* Common prefix for src & dst paths */
+        size_t common_prefix_len;       /* Length of common prefix */
+        char *new_path;                 /* Pointer to new path */
+        size_t new_path_len;            /* Length of new path */
+
+
+        /* Compute path prefix before full suffix*/
+        path_prefix_len = path_len - full_suffix_len;
+
+        /* Determine the common prefix for src & dst paths */
+        common_prefix = src_path;
+        common_prefix_len = 0;
+        /* Find first character that is different */
+        while(*(src_path + common_prefix_len) == *(dst_path + common_prefix_len))
+            common_prefix_len++;
+        /* Back up to previous '/' */
+        while(*(common_prefix + common_prefix_len) != '/')
+            common_prefix_len--;
+        /* Include '/' */
+        common_prefix_len++;
+
+        /* Determine source suffix */
+        src_suffix = src_path + (common_prefix_len - 1);
+
+        /* Determine destination suffix */
+        dst_suffix = dst_path + (common_prefix_len - 1);
+        dst_suffix_len = HDstrlen(dst_suffix);
+
+        /* Compute path prefix before src suffix*/
+        path_prefix2 = path;
+        path_prefix2_len = path_prefix_len - HDstrlen(src_suffix);
+
+        /* Allocate space for the new path */
+        new_path_len = path_prefix2_len + dst_suffix_len + full_suffix_len;
+        if(NULL == (new_path = (char *)H5FL_BLK_MALLOC(str_buf, new_path_len + 1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Create the new path */
+        if(path_prefix2_len > 0) {
+            HDstrncpy(new_path, path_prefix2, path_prefix2_len + 1);
+            HDstrncpy(new_path + path_prefix2_len, dst_suffix, dst_suffix_len + 1);
+        } /* end if */
+        else
+            HDstrncpy(new_path, dst_suffix, dst_suffix_len + 1);
+        if(full_suffix_len > 0)
+            HDstrncat(new_path, full_suffix, full_suffix_len);
+
+        /* Release previous path */
+        H5RS_decr(*path_r_ptr);
+
+        /* Take ownership of the new full path */
+        *path_r_ptr = H5RS_own(new_path);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_name_move_path() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5G_name_replace_cb
+ *
+ * Purpose: H5I_iterate callback function to replace group entry names
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: June 5, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_name_replace_cb(void *obj_ptr, hid_t obj_id, void *key)
+{
+    const H5G_names_t *names = (const H5G_names_t *)key;        /* Get operation's information */
+    H5O_loc_t *oloc;            /* Object location for object that the ID refers to */
+    H5G_name_t *obj_path;       /* Pointer to group hier. path for obj */
+    H5F_t *top_obj_file;        /* Top file in object's mounted file hier. */
+    hbool_t obj_in_child = FALSE;   /* Flag to indicate that the object is in the child mount hier. */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(obj_ptr);
+
+    /* Get the symbol table entry */
+    switch(H5I_get_type(obj_id)) {
+        case H5I_GROUP:
+            oloc = H5G_oloc((H5G_t *)obj_ptr);
+            obj_path = H5G_nameof((H5G_t *)obj_ptr);
+            break;
+
+        case H5I_DATASET:
+            oloc = H5D_oloc((H5D_t *)obj_ptr);
+            obj_path = H5D_nameof((H5D_t *)obj_ptr);
+            break;
+
+        case H5I_DATATYPE:
+            /* Avoid non-named datatypes */
+            if(!H5T_is_named((H5T_t *)obj_ptr))
+                HGOTO_DONE(SUCCEED)     /* Do not exit search over IDs */
+
+            oloc = H5T_oloc((H5T_t *)obj_ptr);
+            obj_path = H5T_nameof((H5T_t *)obj_ptr);
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown data object")
+    } /* end switch */
+    HDassert(oloc);
+    HDassert(obj_path);
+
+    /* Check if the object has a full path still */
+    if(!obj_path->full_path_r)
+        HGOTO_DONE(SUCCEED)     /* No need to look at object, it's path is already invalid */
+
+    /* Find the top file in object's mount hier. */
+    if(H5F_PARENT(oloc->file)) {
+        /* Check if object is in child file (for mount & unmount operations) */
+        if(names->dst_file && H5F_SAME_SHARED(oloc->file, names->dst_file))
+            obj_in_child = TRUE;
+
+        /* Find the "top" file in the chain of mounted files */
+        top_obj_file = H5F_PARENT(oloc->file);
+        while(H5F_PARENT(top_obj_file) != NULL) {
+            /* Check if object is in child mount hier. (for mount & unmount operations) */
+            if(names->dst_file && H5F_SAME_SHARED(top_obj_file, names->dst_file))
+                obj_in_child = TRUE;
+
+            top_obj_file = H5F_PARENT(top_obj_file);
+        } /* end while */
+    } /* end if */
+    else
+        top_obj_file = oloc->file;
+
+    /* Check if object is in top of child mount hier. (for mount & unmount operations) */
+    if(names->dst_file && H5F_SAME_SHARED(top_obj_file, names->dst_file))
+        obj_in_child = TRUE;
+
+    /* Check if the object is in same file mount hier. */
+    if(!H5F_SAME_SHARED(top_obj_file, names->src_file))
+        HGOTO_DONE(SUCCEED)     /* No need to look at object, it's path is already invalid */
+
+    switch(names->op) {
+        /*-------------------------------------------------------------------------
+         * H5G_NAME_MOUNT
+         *-------------------------------------------------------------------------
+         */
+        case H5G_NAME_MOUNT:
+            /* Check if object is in child mount hier. */
+            if(obj_in_child) {
+                const char *full_path;      /* Full path of current object */
+                const char *src_path;       /* Full path of source object */
+                size_t src_path_len;        /* Length of source full path */
+                char *new_full_path;        /* New full path of object */
+                size_t new_full_len;        /* Length of new full path */
+
+                /* Get pointers to paths of interest */
+                full_path = H5RS_get_str(obj_path->full_path_r);
+                src_path = H5RS_get_str(names->src_full_path_r);
+                src_path_len = HDstrlen(src_path);
+
+                /* Build new full path */
+
+                /* Allocate space for the new full path */
+                new_full_len = src_path_len + HDstrlen(full_path);
+                if(NULL == (new_full_path = (char *)H5FL_BLK_MALLOC(str_buf, new_full_len + 1)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                /* Create the new full path */
+                HDstrncpy(new_full_path, src_path, src_path_len + 1);
+                HDstrncat(new_full_path, full_path, new_full_len);
+
+                /* Release previous full path */
+                H5RS_decr(obj_path->full_path_r);
+
+                /* Take ownership of the new full path */
+                obj_path->full_path_r = H5RS_own(new_full_path);
+            } /* end if */
+            /* Object must be in parent mount file hier. */
+            else {
+                /* Check if the source is along the entry's path */
+                /* (But not actually the entry itself) */
+                if(H5G_common_path(obj_path->full_path_r, names->src_full_path_r) &&
+                        H5RS_cmp(obj_path->full_path_r, names->src_full_path_r)) {
+                    /* Hide the user path */
+                    (obj_path->obj_hidden)++;
+                } /* end if */
+            } /* end else */
+            break;
+
+        /*-------------------------------------------------------------------------
+         * H5G_NAME_UNMOUNT
+         *-------------------------------------------------------------------------
+         */
+        case H5G_NAME_UNMOUNT:
+            if(obj_in_child) {
+                const char *full_path;      /* Full path of current object */
+                const char *full_suffix;    /* Full path after source path */
+                size_t full_suffix_len;     /* Length of full path after source path */
+                const char *src_path;       /* Full path of source object */
+                char *new_full_path;        /* New full path of object */
+
+                /* Get pointers to paths of interest */
+                full_path = H5RS_get_str(obj_path->full_path_r);
+                src_path = H5RS_get_str(names->src_full_path_r);
+
+                /* Construct full path suffix */
+                full_suffix = full_path + HDstrlen(src_path);
+                full_suffix_len = HDstrlen(full_suffix);
+
+                /* Build new full path */
+
+                /* Create the new full path */
+                if(NULL == (new_full_path = (char *)H5FL_BLK_MALLOC(str_buf, full_suffix_len + 1)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+                HDstrncpy(new_full_path, full_suffix, full_suffix_len + 1);
+
+                /* Release previous full path */
+                H5RS_decr(obj_path->full_path_r);
+
+                /* Take ownership of the new full path */
+                obj_path->full_path_r = H5RS_own(new_full_path);
+
+                /* Check if the object's user path should be invalidated */
+                if(obj_path->user_path_r && HDstrlen(new_full_path) < (size_t)H5RS_len(obj_path->user_path_r)) {
+                    /* Free user path */
+                    H5RS_decr(obj_path->user_path_r);
+                    obj_path->user_path_r = NULL;
+                } /* end if */
+            } /* end if */
+            else {
+                /* Check if file being unmounted was hiding the object */
+                if(H5G_common_path(obj_path->full_path_r, names->src_full_path_r) &&
+                        H5RS_cmp(obj_path->full_path_r, names->src_full_path_r)) {
+                    /* Un-hide the user path */
+                    (obj_path->obj_hidden)--;
+                } /* end if */
+            } /* end else */
+            break;
+
+        /*-------------------------------------------------------------------------
+         * H5G_NAME_DELETE
+         *-------------------------------------------------------------------------
+         */
+        case H5G_NAME_DELETE:
+            /* Check if the location being unlinked is in the path for the current object */
+            if(H5G_common_path(obj_path->full_path_r, names->src_full_path_r)) {
+                /* Free paths for object */
+                H5G_name_free(obj_path);
+            } /* end if */
+            break;
+
+        /*-------------------------------------------------------------------------
+         * H5G_NAME_MOVE
+         *-------------------------------------------------------------------------
+         */
+        case H5G_NAME_MOVE: /* Link move case, check for relative names case */
+            /* Check if the src object moved is in the current object's path */
+            if(H5G_common_path(obj_path->full_path_r, names->src_full_path_r)) {
+                const char *full_path;      /* Full path of current object */
+                const char *full_suffix;    /* Suffix of full path, after src_path */
+                size_t full_suffix_len;     /* Length of suffix of full path after src_path*/
+                char *new_full_path;        /* New full path of object */
+                size_t new_full_len;        /* Length of new full path */
+                const char *src_path;       /* Full path of source object */
+                const char *dst_path;       /* Full path of destination object */
+                size_t dst_path_len;        /* Length of destination's full path */
+
+                /* Sanity check */
+                HDassert(names->dst_full_path_r);
+
+                /* Get pointers to paths of interest */
+                full_path = H5RS_get_str(obj_path->full_path_r);
+                src_path = H5RS_get_str(names->src_full_path_r);
+                dst_path = H5RS_get_str(names->dst_full_path_r);
+                dst_path_len = HDstrlen(dst_path);
+
+                /* Make certain that the source and destination names are full (not relative) paths */
+                HDassert(*src_path == '/');
+                HDassert(*dst_path == '/');
+
+                /* Get pointer to "full suffix" */
+                full_suffix = full_path + HDstrlen(src_path);
+                full_suffix_len = HDstrlen(full_suffix);
+
+                /* Update the user path, if one exists */
+                if(obj_path->user_path_r)
+                    if(H5G_name_move_path(&(obj_path->user_path_r), full_suffix, src_path, dst_path) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_PATH, FAIL, "can't build user path name")
+
+                /* Build new full path */
+
+                /* Allocate space for the new full path */
+                new_full_len = dst_path_len + full_suffix_len;
+                if(NULL == (new_full_path = (char *)H5FL_BLK_MALLOC(str_buf, new_full_len + 1)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                /* Create the new full path */
+                HDstrncpy(new_full_path, dst_path, dst_path_len + 1);
+                HDstrncat(new_full_path, full_suffix, full_suffix_len);
+
+                /* Release previous full path */
+                H5RS_decr(obj_path->full_path_r);
+
+                /* Take ownership of the new full path */
+                obj_path->full_path_r = H5RS_own(new_full_path);
+            } /* end if */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid operation")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5G_name_replace_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5G_name_replace
+ *
+ * Purpose: Search the list of open IDs and replace names according to a
+ *              particular operation.  The operation occured on the
+ *              SRC_FILE/SRC_FULL_PATH_R object.  The new name (if there is
+ *              one) is NEW_NAME_R.  Additional entry location information
+ *              (currently only needed for the 'move' operation) is passed in
+ *              DST_FILE/DST_FULL_PATH_R.
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: June 11, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_name_replace(const H5O_link_t *lnk, H5G_names_op_t op, H5F_t *src_file,
+    H5RS_str_t *src_full_path_r, H5F_t *dst_file, H5RS_str_t *dst_full_path_r,
+    hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    HDassert(src_file);
+
+    /* Check if the object we are manipulating has a path */
+    if(src_full_path_r) {
+        hbool_t search_group = FALSE;  /* Flag to indicate that groups are to be searched */
+        hbool_t search_dataset = FALSE;  /* Flag to indicate that datasets are to be searched */
+        hbool_t search_datatype = FALSE; /* Flag to indicate that datatypes are to be searched */
+
+        /* Check for particular link to operate on */
+        if(lnk) {
+            /* Look up the object type for each type of link */
+            switch(lnk->type) {
+                case H5L_TYPE_HARD:
+                    {
+                        H5O_loc_t tmp_oloc;             /* Temporary object location */
+                        H5O_type_t obj_type;            /* Type of object at location */
+
+                        /* Build temporary object location */
+                        tmp_oloc.file = src_file;
+                        tmp_oloc.addr = lnk->u.hard.addr;
+
+                        /* Get the type of the object */
+                        if(H5O_obj_type(&tmp_oloc, &obj_type, dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object type")
+
+                        /* Determine which type of objects to operate on */
+                        switch(obj_type) {
+                            case H5O_TYPE_GROUP:
+                                /* Search and replace names through group IDs */
+                                search_group = TRUE;
+                                break;
+
+                            case H5O_TYPE_DATASET:
+                                /* Search and replace names through dataset IDs */
+                                search_dataset = TRUE;
+                                break;
+
+                            case H5O_TYPE_NAMED_DATATYPE:
+                                /* Search and replace names through datatype IDs */
+                                search_datatype = TRUE;
+                                break;
+
+                            case H5O_TYPE_UNKNOWN:
+                            case H5O_TYPE_NTYPES:
+                                /* Search and replace names through datatype IDs */
+                            default:
+                                HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not valid object type")
+                        } /* end switch */
+                    } /* end case */
+                    break;
+
+                case H5L_TYPE_SOFT:
+                    /* Symbolic links might resolve to any object, so we need to search all IDs */
+                    search_group = search_dataset = search_datatype = TRUE;
+                    break;
+
+                case H5L_TYPE_ERROR:
+                case H5L_TYPE_EXTERNAL:
+                case H5L_TYPE_MAX:
+                default:  /* User-defined link */
+                    /* Check for unknown library-defined link type */
+                    if(lnk->type < H5L_TYPE_UD_MIN)
+                       HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown link type")
+
+                    /* User-defined & external links automatically wipe out
+                     * names (because it would be too much work to track them),
+                     * so there's no point in searching them.
+                     */
+                    break;
+            } /* end switch */
+        } /* end if */
+        else {
+            /* We pass NULL as link pointer when we need to search all IDs */
+            search_group = search_dataset = search_datatype = TRUE;
+        } /* end else */
+
+        /* Check if we need to operate on the objects affected */
+        if(search_group || search_dataset || search_datatype) {
+            H5G_names_t names;          /* Structure to hold operation information for callback */
+
+            /* Find top file in src location's mount hierarchy */
+            while(H5F_PARENT(src_file))
+                src_file = H5F_PARENT(src_file);
+
+            /* Set up common information for callback */
+            names.src_file = src_file;
+            names.src_full_path_r = src_full_path_r;
+            names.dst_file = dst_file;
+            names.dst_full_path_r = dst_full_path_r;
+            names.op = op;
+
+            /* Search through group IDs */
+            if(search_group)
+                if(H5I_iterate(H5I_GROUP, H5G_name_replace_cb, &names, FALSE) < 0)
+		    HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over groups")
+
+            /* Search through dataset IDs */
+            if(search_dataset)
+                if(H5I_iterate(H5I_DATASET, H5G_name_replace_cb, &names, FALSE) < 0)
+		    HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over datasets")
+
+            /* Search through datatype IDs */
+            if(search_datatype)
+                if(H5I_iterate(H5I_DATATYPE, H5G_name_replace_cb, &names, FALSE) < 0)
+		    HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over datatypes")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_name_replace() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_get_name_by_addr_cb
+ *
+ * Purpose:     Callback for retrieving object's name by address
+ *
+ * Return:      Positive if path is for object desired
+ * 		0 if not correct object
+ * 		negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 4 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_get_name_by_addr_cb(hid_t gid, const char *path, const H5L_info_t *linfo,
+    void *_udata)
+{
+    H5G_gnba_iter_t *udata = (H5G_gnba_iter_t *)_udata; /* User data for iteration */
+    H5G_loc_t   obj_loc;                /* Location of object */
+    H5G_name_t  obj_path;            	/* Object's group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Object's object location */
+    hbool_t     obj_found = FALSE;      /* Object at 'path' found */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(path);
+    HDassert(linfo);
+    HDassert(udata->loc);
+    HDassert(udata->path == NULL);
+
+    /* Check for hard link with correct address */
+    if(linfo->type == H5L_TYPE_HARD && udata->loc->addr == linfo->u.address) {
+        H5G_loc_t	grp_loc;                /* Location of group */
+
+        /* Get group's location */
+        if(H5G_loc(gid, &grp_loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5_ITER_ERROR, "bad group location")
+
+        /* Set up opened object location to fill in */
+        obj_loc.oloc = &obj_oloc;
+        obj_loc.path = &obj_path;
+        H5G_loc_reset(&obj_loc);
+
+        /* Find the object */
+        if(H5G_loc_find(&grp_loc, path, &obj_loc/*out*/, udata->lapl_id, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "object not found")
+        obj_found = TRUE;
+
+        /* Check for object in same file (handles mounted files) */
+        /* (re-verify address, in case we traversed a file mount) */
+        if(udata->loc->addr == obj_loc.oloc->addr && udata->loc->file == obj_loc.oloc->file) {
+            if(NULL == (udata->path = H5MM_strdup(path)))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTALLOC, H5_ITER_ERROR, "can't duplicate path string")
+
+            /* We found a match so we return immediately */
+            HGOTO_DONE(H5_ITER_STOP)
+        } /* end if */
+    } /* end if */
+
+done:
+    if(obj_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, H5_ITER_ERROR, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_name_by_addr_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_get_name_by_addr
+ *
+ * Purpose:     Tries to figure out the path to an object from it's address
+ *
+ * Return:      returns size of path name, and copies it into buffer
+ * 		pointed to by name if that buffer is big enough.
+ * 		0 if it cannot find the path
+ * 		negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 4 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G_get_name_by_addr(hid_t file, hid_t lapl_id, hid_t dxpl_id, const H5O_loc_t *loc,
+    char *name, size_t size)
+{
+    H5G_gnba_iter_t udata;      /* User data for iteration */
+    H5G_loc_t root_loc;         /* Root group's location */
+    hbool_t found_obj = FALSE;  /* If we found the object */
+    herr_t status;              /* Status from iteration */
+    ssize_t ret_value;          /* Return value */
+
+    /* Portably clear udata struct (before FUNC_ENTER) */
+    HDmemset(&udata, 0, sizeof(udata));
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Construct the link info for the file's root group */
+    if(H5G_loc(file, &root_loc) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get root group's location")
+
+    /* Check for root group being the object looked for */
+    if(root_loc.oloc->addr == loc->addr && root_loc.oloc->file == loc->file) {
+        if(NULL == (udata.path = H5MM_strdup("")))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTALLOC, FAIL, "can't duplicate path string")
+        found_obj = TRUE;
+    } /* end if */
+    else {
+        /* Set up user data for iterator */
+        udata.loc = loc;
+        udata.lapl_id = lapl_id;
+        udata.dxpl_id = dxpl_id;
+        udata.path = NULL;
+
+        /* Visit all the links in the file */
+        if((status = H5G_visit(file, "/", H5_INDEX_NAME, H5_ITER_NATIVE, H5G_get_name_by_addr_cb, &udata, lapl_id, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "group traversal failed while looking for object name")
+        else if(status > 0)
+            found_obj = TRUE;
+    } /* end else */
+
+    /* Check for finding the object */
+    if(found_obj) {
+        /* Set the length of the full path */
+        ret_value = (ssize_t)(HDstrlen(udata.path) + 1);        /* Length of path + 1 (for "/") */
+
+        /* If there's a buffer provided, copy into it, up to the limit of its size */
+        if(name) {
+            /* Copy the initial path separator */
+            HDstrncpy(name, "/", (size_t)2);
+
+            /* Append the rest of the path */
+            /* (less one character, for the initial path separator) */
+            HDstrncat(name, udata.path, (size - 2));
+            if((size_t)ret_value >= size)
+                name[size - 1] = '\0';
+        } /* end if */
+    } /* end if */
+    else
+        ret_value = 0;
+
+done:
+    /* Release resources */
+    H5MM_xfree(udata.path);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_name_by_addr() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gnode.c b/gatb-core/thirdparty/hdf5/src/H5Gnode.c
new file mode 100644
index 0000000..e6ec886
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gnode.c
@@ -0,0 +1,1575 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gnode.c
+ *			Jun 26 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Functions for handling symbol table nodes.  A
+ *			symbol table node is a small collection of symbol
+ *			table entries.	A B-tree usually points to the
+ *			symbol table nodes for any given symbol table.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppublic.h"		/* Property Lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/*
+ * Each key field of the B-link tree that points to symbol table
+ * nodes consists of this structure...
+ */
+typedef struct H5G_node_key_t {
+    size_t      offset;                 /*offset into heap for name          */
+} H5G_node_key_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* B-tree callbacks */
+static H5RC_t *H5G_node_get_shared(const H5F_t *f, const void *_udata);
+static herr_t H5G_node_create(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, void *_lt_key,
+			      void *_udata, void *_rt_key,
+			      haddr_t *addr_p/*out*/);
+static int H5G_node_cmp2(void *_lt_key, void *_udata, void *_rt_key);
+static int H5G_node_cmp3(void *_lt_key, void *_udata, void *_rt_key);
+static htri_t H5G_node_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_lt_key,
+			     void *_udata);
+static H5B_ins_t H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
+				 hbool_t *lt_key_changed, void *_md_key,
+				 void *_udata, void *_rt_key,
+				 hbool_t *rt_key_changed,
+				 haddr_t *new_node_p/*out*/);
+static H5B_ins_t H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *lt_key,
+				 hbool_t *lt_key_changed, void *udata,
+				 void *rt_key, hbool_t *rt_key_changed);
+static herr_t H5G_node_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key);
+static herr_t H5G_node_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key);
+static herr_t H5G_node_debug_key(FILE *stream, int indent, int fwidth,
+    const void *key, const void *udata);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5G inherits B-tree like properties from H5B */
+H5B_class_t H5B_SNODE[1] = {{
+    H5B_SNODE_ID,		/*id			*/
+    sizeof(H5G_node_key_t), 	/*sizeof_nkey		*/
+    H5G_node_get_shared,	/*get_shared		*/
+    H5G_node_create,		/*new			*/
+    H5G_node_cmp2,		/*cmp2			*/
+    H5G_node_cmp3,		/*cmp3			*/
+    H5G_node_found,		/*found			*/
+    H5G_node_insert,		/*insert		*/
+    TRUE,			/*follow min branch?	*/
+    TRUE,			/*follow max branch?	*/
+    H5B_RIGHT,                  /*critical key          */
+    H5G_node_remove,		/*remove		*/
+    H5G_node_decode_key,	/*decode		*/
+    H5G_node_encode_key,	/*encode		*/
+    H5G_node_debug_key,		/*debug			*/
+}};
+
+/* Declare a free list to manage the H5G_node_t struct */
+H5FL_DEFINE(H5G_node_t);
+
+/* Declare a free list to manage sequences of H5G_entry_t's */
+H5FL_SEQ_DEFINE(H5G_entry_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_get_shared
+ *
+ * Purpose:	Returns the shared B-tree info for the specified UDATA.
+ *
+ * Return:	Success:	Pointer to the raw B-tree page for this
+                                file's groups
+ *
+ *		Failure:	Can't fail
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, October  8, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5RC_t *
+H5G_node_get_shared(const H5F_t *f, const void H5_ATTR_UNUSED *_udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    /* Return the pointer to the ref-count object */
+    FUNC_LEAVE_NOAPI(H5F_GRP_BTREE_SHARED(f))
+} /* end H5G_node_get_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_decode_key
+ *
+ * Purpose:	Decodes a raw key into a native key.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul  8 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key)
+{
+    H5G_node_key_t	   *key = (H5G_node_key_t *) _key;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(shared);
+    HDassert(raw);
+    HDassert(key);
+
+    H5F_DECODE_LENGTH_LEN(raw, key->offset, shared->sizeof_len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_node_decode_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_encode_key
+ *
+ * Purpose:	Encodes a native key into a raw key.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul  8 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key)
+{
+    const H5G_node_key_t *key = (const H5G_node_key_t *) _key;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(shared);
+    HDassert(raw);
+    HDassert(key);
+
+    H5F_ENCODE_LENGTH_LEN(raw, key->offset, shared->sizeof_len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_node_encode_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_debug_key
+ *
+ * Purpose:	Prints a key.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, February 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
+    const void *_udata)
+{
+    const H5G_node_key_t   *key = (const H5G_node_key_t *) _key;
+    const H5G_bt_common_t   *udata = (const H5G_bt_common_t *) _udata;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(key);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, "Heap offset:",
+        (unsigned)key->offset);
+
+    if(udata->heap) {
+        const char *s;
+
+        HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Name:");
+
+        s = (const char *)H5HL_offset_into(udata->heap, key->offset);
+        HDfprintf(stream, "%s\n", s);
+    } /* end if */
+    else
+        HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Cannot get name; heap address not specified\n");
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_node_debug_key() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_free
+ *
+ * Purpose:	Destroy a symbol table node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__node_free(H5G_node_t *sym)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sym);
+
+    /* Verify that node is clean */
+    HDassert(sym->cache_info.is_dirty == FALSE);
+
+    if(sym->entry)
+        sym->entry = H5FL_SEQ_FREE(H5G_entry_t, sym->entry);
+    sym = H5FL_FREE(H5G_node_t, sym);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__node_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_create
+ *
+ * Purpose:	Creates a new empty symbol table node.	This function is
+ *		called by the B-tree insert function for an empty tree.	 It
+ *		is also called internally to split a symbol node with LT_KEY
+ *		and RT_KEY null pointers.
+ *
+ * Return:	Success:	Non-negative.  The address of symbol table
+ *				node is returned through the ADDR_P argument.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_create(H5F_t *f, hid_t dxpl_id, H5B_ins_t H5_ATTR_UNUSED op, void *_lt_key,
+		void H5_ATTR_UNUSED *_udata, void *_rt_key, haddr_t *addr_p/*out*/)
+{
+    H5G_node_key_t	*lt_key = (H5G_node_key_t *)_lt_key;
+    H5G_node_key_t	*rt_key = (H5G_node_key_t *)_rt_key;
+    H5G_node_t		*sym = NULL;
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5B_INS_FIRST == op);
+
+    if(NULL == (sym = H5FL_CALLOC(H5G_node_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    sym->node_size = H5G_NODE_SIZE(f);
+    if(HADDR_UNDEF == (*addr_p = H5MF_alloc(f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)sym->node_size)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to allocate file space")
+    if(NULL == (sym->entry = H5FL_SEQ_CALLOC(H5G_entry_t, (size_t)(2 * H5F_SYM_LEAF_K(f)))))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_SNODE, *addr_p, sym, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to cache symbol table leaf node")
+    /*
+     * The left and right symbols in an empty tree are both the
+     * empty string stored at offset zero by the H5G functions. This
+     * allows the comparison functions to work correctly without knowing
+     * that there are no symbols.
+     */
+    if(lt_key)
+        lt_key->offset = 0;
+    if(rt_key)
+        rt_key->offset = 0;
+
+done:
+    if(ret_value < 0) {
+        if(sym != NULL) {
+            if(sym->entry != NULL)
+                sym->entry = H5FL_SEQ_FREE(H5G_entry_t, sym->entry);
+            sym = H5FL_FREE(H5G_node_t, sym);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_cmp2
+ *
+ * Purpose:	Compares two keys from a B-tree node (LT_KEY and RT_KEY).
+ *		The UDATA pointer supplies extra data not contained in the
+ *		keys (in this case, the heap address).
+ *
+ * Return:	Success:	negative if LT_KEY is less than RT_KEY.
+ *
+ *				positive if LT_KEY is greater than RT_KEY.
+ *
+ *				zero if LT_KEY and RT_KEY are equal.
+ *
+ *		Failure:	FAIL (same as LT_KEY<RT_KEY)
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_node_cmp2(void *_lt_key, void *_udata, void *_rt_key)
+{
+    H5G_bt_common_t	   *udata = (H5G_bt_common_t *) _udata;
+    H5G_node_key_t	   *lt_key = (H5G_node_key_t *) _lt_key;
+    H5G_node_key_t	   *rt_key = (H5G_node_key_t *) _rt_key;
+    const char		   *s1, *s2;
+    const char		   *base;           /* Base of heap */
+    int		           ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(udata && udata->heap);
+    HDassert(lt_key);
+    HDassert(rt_key);
+
+    /* Get base address of heap */
+    base = (const char *)H5HL_offset_into(udata->heap, (size_t)0);
+    HDassert(base);
+
+    /* Get pointers to string names */
+    s1 = base + lt_key->offset;
+    s2 = base + rt_key->offset;
+
+    /* Set return value */
+    ret_value = HDstrcmp(s1, s2);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5G_node_cmp2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_cmp3
+ *
+ * Purpose:	Compares two keys from a B-tree node (LT_KEY and RT_KEY)
+ *		against another key (not necessarily the same type)
+ *		pointed to by UDATA.
+ *
+ * Return:	Success:	negative if the UDATA key is less than
+ *				or equal to the LT_KEY
+ *
+ *				positive if the UDATA key is greater
+ *				than the RT_KEY.
+ *
+ *				zero if the UDATA key falls between
+ *				the LT_KEY (exclusive) and the
+ *				RT_KEY (inclusive).
+ *
+ *		Failure:	FAIL (same as UDATA < LT_KEY)
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_node_cmp3(void *_lt_key, void *_udata, void *_rt_key)
+{
+    H5G_bt_common_t	*udata = (H5G_bt_common_t *) _udata;
+    H5G_node_key_t	*lt_key = (H5G_node_key_t *) _lt_key;
+    H5G_node_key_t	*rt_key = (H5G_node_key_t *) _rt_key;
+    const char		*s;
+    const char          *base;              /* Base of heap */
+    int                  ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(udata && udata->heap);
+    HDassert(lt_key);
+    HDassert(rt_key);
+
+    /* Get base address of heap */
+    base = (const char *)H5HL_offset_into(udata->heap, (size_t)0);
+    HDassert(base);
+
+    /* left side */
+    s = base + lt_key->offset;
+    if(HDstrcmp(udata->name, s) <= 0)
+	ret_value = (-1);
+    else {
+        /* right side */
+        s = base + rt_key->offset;
+        if(HDstrcmp(udata->name, s) > 0)
+            ret_value = 1;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_cmp3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_found
+ *
+ * Purpose:	The B-tree search engine has found the symbol table node
+ *		which contains the requested symbol if the symbol exists.
+ *		This function should examine that node for the symbol and
+ *		return information about the symbol through the UDATA
+ *		structure which contains the symbol name on function
+ *		entry.
+ *
+ *		If the operation flag in UDATA is H5G_OPER_FIND, then
+ *		the entry is copied from the symbol table to the UDATA
+ *		entry field.  Otherwise the entry is copied from the
+ *		UDATA entry field to the symbol table.
+ *
+ * Return:	Success:	Non-negative (TRUE/FALSE) if found and data
+ *                              returned through the UDATA pointer.
+ *
+ *		Failure:	Negative if not found.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 23 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5G_node_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void H5_ATTR_UNUSED *_lt_key,
+    void *_udata)
+{
+    H5G_bt_lkp_t	*udata = (H5G_bt_lkp_t *)_udata;
+    H5G_node_t		*sn = NULL;
+    unsigned		lt = 0, idx = 0, rt;
+    int		        cmp = 1;
+    const char		*s;
+    const char          *base;                  /* Base of heap */
+    htri_t              ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata && udata->common.heap);
+
+    /*
+     * Load the symbol table node for exclusive access.
+     */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table node")
+
+    /* Get base address of heap */
+    base = (const char *)H5HL_offset_into(udata->common.heap, (size_t)0);
+    HDassert(base);
+
+    /*
+     * Binary search.
+     */
+    rt = sn->nsyms;
+    while(lt < rt && cmp) {
+	idx = (lt + rt) / 2;
+        s = base + sn->entry[idx].name_off;
+	cmp = HDstrcmp(udata->common.name, s);
+
+	if (cmp < 0)
+	    rt = idx;
+	else
+	    lt = idx + 1;
+    } /* end while */
+
+    if(cmp)
+        HGOTO_DONE(FALSE)
+
+    /* Call user's callback operator */
+    if((udata->op)(&sn->entry[idx], udata->op_data) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "iterator callback failed")
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to release symbol table node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_insert
+ *
+ * Purpose:	The B-tree insertion engine has found the symbol table node
+ *		which should receive the new symbol/address pair.  This
+ *		function adds it to that node unless it already existed.
+ *
+ *		If the node has no room for the symbol then the node is
+ *		split into two nodes.  The original node contains the
+ *		low values and the new node contains the high values.
+ *		The new symbol table entry is added to either node as
+ *		appropriate.  When a split occurs, this function will
+ *		write the maximum key of the low node to the MID buffer
+ *		and return the address of the new node.
+ *
+ *		If the new key is larger than RIGHT then update RIGHT
+ *		with the new key.
+ *
+ * Return:	Success:	An insertion command for the caller, one of
+ *				the H5B_INS_* constants.  The address of the
+ *				new node, if any, is returned through the
+ *				NEW_NODE_P argument.  NEW_NODE_P might not be
+ *				initialized if the return value is
+ *				H5B_INS_NOOP.
+ *
+ *		Failure:	H5B_INS_ERROR, NEW_NODE_P might not be
+ *				initialized.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 24 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_ins_t
+H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    void H5_ATTR_UNUSED *_lt_key, hbool_t H5_ATTR_UNUSED *lt_key_changed,
+    void *_md_key, void *_udata,
+    void *_rt_key, hbool_t *rt_key_changed,
+    haddr_t *new_node_p)
+{
+    H5G_node_key_t	*md_key = (H5G_node_key_t *) _md_key;
+    H5G_node_key_t	*rt_key = (H5G_node_key_t *) _rt_key;
+    H5G_bt_ins_t	*udata = (H5G_bt_ins_t *) _udata;
+    H5G_node_t		*sn = NULL, *snrt = NULL;
+    unsigned		sn_flags = H5AC__NO_FLAGS_SET, snrt_flags = H5AC__NO_FLAGS_SET;
+    const char		*s;
+    const char          *base;                  /* Base of heap */
+    unsigned		lt = 0, rt;		/* Binary search cntrs	*/
+    int		        cmp = 1, idx = -1;
+    H5G_node_t		*insert_into = NULL;	/*node that gets new entry*/
+    H5G_entry_t         ent;                    /* Entry to insert in node */
+    H5B_ins_t		ret_value = H5B_INS_ERROR;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(md_key);
+    HDassert(rt_key);
+    HDassert(udata && udata->common.heap);
+    HDassert(new_node_p);
+
+    /*
+     * Load the symbol node.
+     */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node")
+
+    /* Get base address of heap */
+    base = (const char *)H5HL_offset_into(udata->common.heap, (size_t)0);
+    HDassert(base);
+
+    /*
+     * Where does the new symbol get inserted?	We use a binary search.
+     */
+    rt = sn->nsyms;
+    while(lt < rt) {
+	idx = (int)((lt + rt) / 2);
+        s = base + sn->entry[idx].name_off;
+
+        /* Check if symbol is already present */
+	if(0 == (cmp = HDstrcmp(udata->common.name, s)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR, "symbol is already present in symbol table")
+
+	if (cmp < 0)
+	    rt = (unsigned)idx;
+	else
+	    lt = (unsigned)(idx + 1);
+    } /* end while */
+    idx += cmp > 0 ? 1 : 0;
+
+    /* Convert link information & name to symbol table entry */
+    if(H5G__ent_convert(f, dxpl_id, udata->common.heap, udata->common.name,
+            udata->lnk, udata->obj_type, udata->crt_info, &ent) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5B_INS_ERROR, "unable to convert link")
+
+    /* Determine where to place entry in node */
+    if(sn->nsyms >= 2 * H5F_SYM_LEAF_K(f)) {
+	/*
+	 * The node is full.  Split it into a left and right
+	 * node and return the address of the new right node (the
+	 * left node is at the same address as the original node).
+	 */
+	ret_value = H5B_INS_RIGHT;
+
+	/* The right node */
+	if(H5G_node_create(f, dxpl_id, H5B_INS_FIRST, NULL, NULL, NULL, new_node_p/*out*/) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR, "unable to split symbol table node")
+
+	if(NULL == (snrt = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, *new_node_p, f, H5AC_WRITE)))
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to split symbol table node")
+
+	HDmemcpy(snrt->entry, sn->entry + H5F_SYM_LEAF_K(f),
+		 H5F_SYM_LEAF_K(f) * sizeof(H5G_entry_t));
+	snrt->nsyms = H5F_SYM_LEAF_K(f);
+        snrt_flags |= H5AC__DIRTIED_FLAG;
+
+	/* The left node */
+	HDmemset(sn->entry + H5F_SYM_LEAF_K(f), 0,
+		 H5F_SYM_LEAF_K(f) * sizeof(H5G_entry_t));
+	sn->nsyms = H5F_SYM_LEAF_K(f);
+        sn_flags |= H5AC__DIRTIED_FLAG;
+
+	/* The middle key */
+	md_key->offset = sn->entry[sn->nsyms - 1].name_off;
+
+	/* Where to insert the new entry? */
+	if(idx <= (int)H5F_SYM_LEAF_K(f)) {
+	    insert_into = sn;
+	    if(idx == (int)H5F_SYM_LEAF_K(f))
+		md_key->offset = ent.name_off;
+	} /* end if */
+        else {
+	    idx -= H5F_SYM_LEAF_K(f);
+	    insert_into = snrt;
+	    if(idx == (int)H5F_SYM_LEAF_K(f)) {
+		rt_key->offset = ent.name_off;
+		*rt_key_changed = TRUE;
+	    } /* end if */
+	} /* end else */
+    } /* end if */
+    else {
+	/* Where to insert the new entry? */
+	ret_value = H5B_INS_NOOP;
+        sn_flags |= H5AC__DIRTIED_FLAG;
+	insert_into = sn;
+	if(idx == (int)sn->nsyms) {
+	    rt_key->offset = ent.name_off;
+	    *rt_key_changed = TRUE;
+	} /* end if */
+    } /* end else */
+
+    /* Move entries down to make room for new entry */
+    HDassert(idx >= 0);
+    HDmemmove(insert_into->entry + idx + 1, insert_into->entry + idx,
+	      (insert_into->nsyms - (unsigned)idx) * sizeof(H5G_entry_t));
+
+    /* Copy new entry into table */
+    H5G__ent_copy(&(insert_into->entry[idx]), &ent, H5_COPY_SHALLOW);
+
+    /* Increment # of symbols in table */
+    insert_into->nsyms += 1;
+
+done:
+    if(snrt && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, *new_node_p, snrt, snrt_flags) < 0)
+	HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to release symbol table node")
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, sn_flags) < 0)
+	HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to release symbol table node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_remove
+ *
+ * Purpose:	The B-tree removal engine has found the symbol table node
+ *		which should contain the name which is being removed.  This
+ *		function removes the name from the symbol table and
+ *		decrements the link count on the object to which the name
+ *		points.
+ *
+ *              If the udata->name parameter is set to NULL, then remove
+ *              all entries in this symbol table node.  This only occurs
+ *              during the deletion of the entire group, so don't bother
+ *              freeing individual name entries in the local heap, the group's
+ *              symbol table removal code will just free the entire local
+ *              heap eventually.  Do reduce the link counts for each object
+ *              however.
+ *
+ * Return:	Success:	If all names are removed from the symbol
+ *				table node then H5B_INS_REMOVE is returned;
+ *				otherwise H5B_INS_NOOP is returned.
+ *
+ *		Failure:	H5B_INS_ERROR
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, September 24, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5B_ins_t
+H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/,
+		hbool_t H5_ATTR_UNUSED *lt_key_changed/*out*/,
+		void *_udata/*in,out*/, void *_rt_key/*in,out*/,
+		hbool_t *rt_key_changed/*out*/)
+{
+    H5G_node_key_t	*lt_key = (H5G_node_key_t *)_lt_key;
+    H5G_node_key_t	*rt_key = (H5G_node_key_t *)_rt_key;
+    H5G_bt_rm_t	*udata = (H5G_bt_rm_t *)_udata;
+    H5G_node_t		*sn = NULL;
+    unsigned		sn_flags = H5AC__NO_FLAGS_SET;
+    unsigned		lt = 0, rt, idx = 0;
+    int		        cmp = 1;
+    H5B_ins_t		ret_value = H5B_INS_ERROR;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(lt_key);
+    HDassert(rt_key);
+    HDassert(udata && udata->common.heap);
+
+    /* Load the symbol table */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node")
+
+    /* "Normal" removal of a single entry from the symbol table node */
+    if(udata->common.name != NULL) {
+        H5O_link_t lnk;         /* Constructed link for replacement */
+        size_t link_name_len;   /* Length of string in local heap */
+        const char *base;       /* Base of heap */
+
+        /* Get base address of heap */
+        base = (const char *)H5HL_offset_into(udata->common.heap, (size_t)0);
+
+        /* Find the name with a binary search */
+        rt = sn->nsyms;
+        while(lt < rt && cmp) {
+            const char *s;          /* Pointer to string in local heap */
+
+            idx = (lt + rt) / 2;
+            s = base + sn->entry[idx].name_off;
+            cmp = HDstrcmp(udata->common.name, s);
+            if(cmp < 0)
+                rt = idx;
+            else
+                lt = idx + 1;
+        } /* end while */
+
+        if(cmp)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5B_INS_ERROR, "name not found")
+
+        /* Get a pointer to the name of the link */
+        if(NULL == (lnk.name = (char *)H5HL_offset_into(udata->common.heap, sn->entry[idx].name_off)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "unable to get link name")
+        link_name_len = HDstrlen(lnk.name) + 1;
+
+        /* Set up rest of link structure */
+        lnk.corder_valid = FALSE;
+        lnk.corder = 0;
+        lnk.cset = H5T_CSET_ASCII;
+        if(sn->entry[idx].type == H5G_CACHED_SLINK) {
+            lnk.type = H5L_TYPE_SOFT;
+            lnk.u.soft.name = (char *)H5HL_offset_into(udata->common.heap, sn->entry[idx].cache.slink.lval_offset);
+        } /* end if */
+        else {
+            lnk.type = H5L_TYPE_HARD;
+            HDassert(H5F_addr_defined(sn->entry[idx].header));
+            lnk.u.hard.addr = sn->entry[idx].header;
+        } /* end else */
+
+        /* Replace any object names */
+        if(H5G__link_name_replace(f, dxpl_id, udata->grp_full_path_r, &lnk) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "unable to get object type")
+
+        /* Decrement the ref. count for hard links */
+        if(lnk.type == H5L_TYPE_HARD) {
+            H5O_loc_t tmp_oloc;             /* Temporary object location */
+
+            /* Build temporary object location */
+            tmp_oloc.file = f;
+            tmp_oloc.addr = lnk.u.hard.addr;
+
+            if(H5O_link(&tmp_oloc, -1, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR, "unable to decrement object link count")
+        } /* end if */
+        else {
+            /* Remove the soft link's value from the local heap */
+            if(lnk.u.soft.name) {
+                size_t soft_link_len;   /* Length of string in local heap */
+
+                soft_link_len = HDstrlen(lnk.u.soft.name) + 1;
+                if(H5HL_remove(f, dxpl_id, udata->common.heap, sn->entry[idx].cache.slink.lval_offset, soft_link_len) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, H5B_INS_ERROR, "unable to remove soft link from local heap")
+            } /* end if */
+        } /* end else */
+
+        /* Remove the link's name from the local heap */
+        if(H5HL_remove(f, dxpl_id, udata->common.heap, sn->entry[idx].name_off, link_name_len) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, H5B_INS_ERROR, "unable to remove link name from local heap")
+
+        /* Remove the entry from the symbol table node */
+        if(1 == sn->nsyms) {
+            /*
+             * We are about to remove the only symbol in this node.  Free this
+             * node and indicate that the pointer to this node in the B-tree
+             * should be removed also.
+             */
+            HDassert(0 == idx);
+            sn->nsyms = 0;
+            sn_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+            ret_value = H5B_INS_REMOVE;
+        } else if(0 == idx) {
+            /*
+             * We are about to remove the left-most entry from the symbol table
+             * node but there are other entries to the right.  No key values
+             * change.
+             */
+            sn->nsyms -= 1;
+            sn_flags |= H5AC__DIRTIED_FLAG;
+            HDmemmove(sn->entry + idx, sn->entry + idx + 1,
+                      (sn->nsyms-idx) * sizeof(H5G_entry_t));
+            ret_value = H5B_INS_NOOP;
+        } else if (idx + 1 == sn->nsyms) {
+            /*
+             * We are about to remove the right-most entry from the symbol table
+             * node but there are other entries to the left.  The right key
+             * should be changed to reflect the new right-most entry.
+             */
+            sn->nsyms -= 1;
+            sn_flags |= H5AC__DIRTIED_FLAG;
+            rt_key->offset = sn->entry[sn->nsyms - 1].name_off;
+            *rt_key_changed = TRUE;
+            ret_value = H5B_INS_NOOP;
+        } else {
+            /*
+             * We are about to remove an entry from the middle of a symbol table
+             * node.
+             */
+            sn->nsyms -= 1;
+            sn_flags |= H5AC__DIRTIED_FLAG;
+            HDmemmove(sn->entry + idx, sn->entry + idx + 1,
+                      (sn->nsyms - idx) * sizeof(H5G_entry_t));
+            ret_value = H5B_INS_NOOP;
+        } /* end else */
+    } /* end if */
+    /* Remove all entries from node, during B-tree deletion */
+    else {
+        H5O_loc_t tmp_oloc;             /* Temporary object location */
+
+        /* Build temporary object location */
+        tmp_oloc.file = f;
+
+        /* Reduce the link count for all entries in this node */
+        for(idx = 0; idx < sn->nsyms; idx++) {
+            if(!(H5G_CACHED_SLINK == sn->entry[idx].type)) {
+                /* Decrement the reference count */
+                HDassert(H5F_addr_defined(sn->entry[idx].header));
+                tmp_oloc.addr = sn->entry[idx].header;
+
+                if(H5O_link(&tmp_oloc, -1, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, H5B_INS_ERROR, "unable to decrement object link count")
+            } /* end if */
+        } /* end for */
+
+        /*
+         * We are about to remove all the symbols in this node.  Free this
+         * node and indicate that the pointer to this node in the B-tree
+         * should be removed also.
+         */
+        sn->nsyms = 0;
+        sn_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        ret_value = H5B_INS_REMOVE;
+    } /* end else */
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, sn_flags) < 0)
+	HDONE_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release symbol table node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_iterate
+ *
+ * Purpose:	This function gets called during a group iterate operation.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 24 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G__node_iterate(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
+    const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    H5G_bt_it_it_t	*udata = (H5G_bt_it_it_t *)_udata;
+    H5G_node_t		*sn = NULL;
+    H5G_entry_t		*ents;                  /* Pointer to entries in this node */
+    unsigned		u;                      /* Local index variable */
+    int	                ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata && udata->heap);
+
+    /* Protect the symbol table node & local heap while we iterate over entries */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
+
+    /*
+     * Iterate over the symbol table node entries.
+     */
+    for(u = 0, ents = sn->entry; u < sn->nsyms && ret_value == H5_ITER_CONT; u++) {
+        if(udata->skip > 0)
+            --udata->skip;
+        else {
+            H5O_link_t lnk;     /* Link for entry */
+            const char *name;   /* Pointer to link name in heap */
+
+            /* Get the pointer to the name of the link in the heap */
+            name = (const char *)H5HL_offset_into(udata->heap, ents[u].name_off);
+            HDassert(name);
+
+            /* Convert the entry to a link */
+            if(H5G__ent_to_link(&lnk, udata->heap, &ents[u], name) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5_ITER_ERROR, "unable to convert symbol table entry to link")
+
+            /* Make the callback */
+            ret_value = (udata->op)(&lnk, udata->op_data);
+
+            /* Release memory for link object */
+            if(H5O_msg_reset(H5O_LINK_ID, &lnk) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, H5_ITER_ERROR, "unable to release link message")
+        } /* end else */
+
+        /* Increment the number of entries passed through */
+        /* (whether we skipped them or not) */
+        if(udata->final_ent)
+            (*udata->final_ent)++;
+    } /* end for */
+    if(ret_value < 0)
+        HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+
+done:
+    /* Release resources */
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_sumup
+ *
+ * Purpose:	This function gets called during a group iterate operation
+ *              to return total number of members in the group.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G__node_sumup(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
+		  const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    hsize_t	        *num_objs = (hsize_t *)_udata;
+    H5G_node_t		*sn = NULL;
+    int                  ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(num_objs);
+
+    /* Find the object node and add the number of symbol entries. */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
+
+    *num_objs += sn->nsyms;
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_sumup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_by_idx
+ *
+ * Purpose:	This function gets called during a group iterate operation
+ *              to return object name by giving idx.
+ *
+ * Return:	0 if object isn't found in this node; 1 if object is found;
+ *              Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G__node_by_idx(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
+		  const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    H5G_bt_it_idx_common_t	*udata = (H5G_bt_it_idx_common_t *)_udata;
+    H5G_node_t		*sn = NULL;
+    int                 ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Get a pointer to the symbol table node */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node");
+
+    /* Find the node, locate the object symbol table entry and retrieve the name */
+    if(udata->idx >= udata->num_objs && udata->idx < (udata->num_objs + sn->nsyms)) {
+        hsize_t ent_idx;                /* Entry index in this node */
+
+        /* Compute index of entry */
+        ent_idx = udata->idx - udata->num_objs;
+
+        /* Call 'by index' callback */
+        HDassert(udata->op);
+        if((udata->op)(&sn->entry[ent_idx], udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "'by index' callback failed")
+
+        /* Indicate that we found the entry we are interested in */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+    else
+        udata->num_objs += sn->nsyms;
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_init
+ *
+ * Purpose:	This function gets called during a file opening to initialize
+ *              global information about group B-tree nodes for file.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Jul  5, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__node_init(H5F_t *f)
+{
+    H5B_shared_t *shared;               /* Shared B-tree node info */
+    size_t	sizeof_rkey;	        /* Size of raw (disk) key	     */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(f);
+
+    /* Set the raw key size */
+    sizeof_rkey = H5F_SIZEOF_SIZE(f);	/*name offset */
+
+    /* Allocate & initialize global info for the shared structure */
+    if(NULL == (shared = H5B_shared_new(f, H5B_SNODE, sizeof_rkey)))
+	HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed for shared B-tree info")
+
+    /* Set up the "local" information for this file's groups */
+        /* <none> */
+
+    /* Make shared B-tree info reference counted */
+    if(H5F_SET_GRP_BTREE_SHARED(f, H5RC_create(shared, H5B_shared_free)) < 0)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for shared B-tree info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_close
+ *
+ * Purpose:	This function gets called during a file close to shutdown
+ *              global information about group B-tree nodes for file.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Jul  5, 2004
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_node_close(const H5F_t *f)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(f);
+
+    /* Free the raw B-tree node buffer */
+    if(H5F_GRP_BTREE_SHARED(f))
+        H5RC_DEC(H5F_GRP_BTREE_SHARED(f));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_node_close */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_copy
+ *
+ * Purpose:	This function gets called during a group iterate operation
+ *              to copy objects of this node into a new location.
+ *
+ * Return:	0(zero) on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              Sept 10, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G__node_copy(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
+		  const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    H5G_bt_it_cpy_t     *udata = (H5G_bt_it_cpy_t *)_udata;
+    const H5O_loc_t     *src_oloc = udata->src_oloc;
+    H5O_copy_t          *cpy_info = udata->cpy_info;
+    H5HL_t              *heap = NULL;
+    H5G_node_t	        *sn = NULL;
+    unsigned int        i;                   /* Local index variable */
+    int                 ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* load the symbol table into memory from the source file */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
+
+    /* get the base address of the heap */
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, udata->src_heap_addr, H5AC_READ)))
+       HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to protect symbol name")
+
+    /* copy object in this node one by one */
+    for(i = 0; i < sn->nsyms; i++) {
+        H5G_entry_t *src_ent = &(sn->entry[i]); /* Convenience variable to refer to current source group entry */
+        H5O_link_t  lnk;                /* Link to insert */
+        const char  *name;              /* Name of source object */
+        H5G_entry_t tmp_src_ent;        /* Temperary copy. Change will not affect the cache */
+        H5O_type_t  obj_type = H5O_TYPE_UNKNOWN; /* Target object type */
+        H5G_copy_file_ud_t *cpy_udata;  /* Copy file udata */
+        H5G_obj_create_t gcrt_info;     /* Group creation info */
+
+        /* expand soft link */
+        if(H5G_CACHED_SLINK == src_ent->type && cpy_info->expand_soft_link) {
+            H5O_info_t  oinfo;          /* Information about object pointed to by soft link */
+            H5G_loc_t   grp_loc;        /* Group location holding soft link */
+            H5G_name_t  grp_path;       /* Path for group holding soft link */
+            char *link_name;            /* Pointer to value of soft link */
+
+            /* Make a temporary copy, so that it will not change the info in the cache */
+            HDmemcpy(&tmp_src_ent, src_ent, sizeof(H5G_entry_t));
+
+            /* Set up group location for soft link to start in */
+            H5G_name_reset(&grp_path);
+            grp_loc.path = &grp_path;
+            grp_loc.oloc = (H5O_loc_t *)src_oloc;
+
+            /* Get pointer to link value in local heap */
+            link_name = (char *)H5HL_offset_into(heap, tmp_src_ent.cache.slink.lval_offset);
+
+            /* Check if the object pointed by the soft link exists in the source file */
+            if(H5G_loc_info(&grp_loc, link_name, FALSE, &oinfo, H5P_DEFAULT, dxpl_id) >= 0) {
+                tmp_src_ent.header = oinfo.addr;
+                src_ent = &tmp_src_ent;
+            } /* end if */
+            else
+                H5E_clear_stack(NULL); /* discard any errors from a dangling soft link */
+        } /* if ((H5G_CACHED_SLINK == src_ent->type)... */
+
+        /* Check if object in source group is a hard link */
+        if(H5F_addr_defined(src_ent->header)) {
+            H5O_loc_t new_dst_oloc;     /* Copied object location in destination */
+            H5O_loc_t tmp_src_oloc;     /* Temporary object location for source object */
+
+            /* Set up copied object location to fill in */
+            H5O_loc_reset(&new_dst_oloc);
+            new_dst_oloc.file = udata->dst_file;
+
+            /* Build temporary object location for source */
+            H5O_loc_reset(&tmp_src_oloc);
+            tmp_src_oloc.file = f;
+            tmp_src_oloc.addr = src_ent->header;
+
+            /* Copy the shared object from source to destination */
+            if(H5O_copy_header_map(&tmp_src_oloc, &new_dst_oloc, dxpl_id,
+                    cpy_info, TRUE, &obj_type, (void **)&cpy_udata) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy object")
+
+            /* Set up object creation info for symbol table insertion.  Only
+             * case so far is for inserting old-style groups (for caching stab
+             * info). */
+            if(obj_type == H5O_TYPE_GROUP) {
+                gcrt_info.gcpl_id = H5P_DEFAULT;
+                gcrt_info.cache_type = cpy_udata->cache_type;
+                gcrt_info.cache = cpy_udata->cache;
+            } /* end if */
+
+            /* Construct link information for eventual insertion */
+            lnk.type = H5L_TYPE_HARD;
+            lnk.u.hard.addr = new_dst_oloc.addr;
+        } /* ( H5F_addr_defined(src_ent->header)) */
+        else if(H5G_CACHED_SLINK == src_ent->type) {
+            /* it is a soft link */
+            /* Set object type to unknown */
+            obj_type = H5O_TYPE_UNKNOWN;
+
+            /* Construct link information for eventual insertion */
+            lnk.type = H5L_TYPE_SOFT;
+            lnk.u.soft.name = (char *)H5HL_offset_into(heap, src_ent->cache.slink.lval_offset);
+        } /* else if */
+        else
+            HDassert(0 && "Unknown entry type");
+
+        /* Set up common link data */
+        lnk.cset = H5F_DEFAULT_CSET;          /* XXX: Allow user to set this */
+        lnk.corder = 0;                     /* Creation order is not tracked for old-style links */
+        lnk.corder_valid = FALSE;            /* Creation order is not valid */
+        /* lnk.name = name; */              /* This will be set in callback */
+
+        /* Determine name of source object */
+        name = (const char *)H5HL_offset_into(heap, src_ent->name_off);
+	HDassert(name);
+
+        /* Insert the new object in the destination file's group */
+        /* (Don't increment the link count - that's already done above for hard links) */
+        if(H5G__stab_insert_real(udata->dst_file, udata->dst_stab, name, &lnk,
+                obj_type, (obj_type == H5O_TYPE_GROUP ? &gcrt_info : NULL),
+                dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
+    } /* end of for (i=0; i<sn->nsyms; i++) */
+
+done:
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to unprotect symbol name")
+
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__node_build_table
+ *
+ * Purpose:	B-link tree callback for building table of links
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 19 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G__node_build_table(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
+    const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    H5G_bt_it_bt_t	*udata = (H5G_bt_it_bt_t *)_udata;
+    H5G_node_t		*sn = NULL;             /* Symbol table node */
+    unsigned		u;                      /* Local index variable */
+    int	                ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata && udata->heap);
+
+    /*
+     * Save information about the symbol table node since we can't lock it
+     * because we're about to call an application function.
+     */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
+
+    /* Check if the link table needs to be extended */
+    if((udata->ltable->nlinks + sn->nsyms) >= udata->alloc_nlinks) {
+        size_t na = MAX((udata->ltable->nlinks + sn->nsyms), (udata->alloc_nlinks * 2));        /* Double # of links allocated */
+        H5O_link_t *x;              /* Pointer to larger array of links */
+
+        /* Re-allocate the link table */
+        if(NULL == (x = (H5O_link_t *)H5MM_realloc(udata->ltable->lnks, sizeof(H5O_link_t) * na)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed")
+        udata->ltable->lnks = x;
+    } /* end if */
+
+    /* Iterate over the symbol table node entries, adding to link table */
+    for(u = 0; u < sn->nsyms; u++) {
+        const char	*name;          /* Pointer to link name in heap */
+        size_t          linkno;         /* Link allocated */
+
+        /* Get pointer to link's name in the heap */
+        name = (const char *)H5HL_offset_into(udata->heap, sn->entry[u].name_off);
+        HDassert(name);
+
+        /* Determine the link to operate on in the table */
+        linkno = udata->ltable->nlinks++;
+
+        /* Convert the entry to a link */
+        if(H5G__ent_to_link(&udata->ltable->lnks[linkno], udata->heap, &sn->entry[u], name) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5_ITER_ERROR, "unable to convert symbol table entry to link")
+    } /* end for */
+
+done:
+    /* Release the locked items */
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__node_build_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__node_iterate_size
+ *
+ * Purpose:     This function gets called by H5B_iterate_helper()
+ *              to gather storage info for SNODs.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Jun 19 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__node_iterate_size(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, const void H5_ATTR_UNUSED *_lt_key, haddr_t H5_ATTR_UNUSED addr,
+    const void H5_ATTR_UNUSED *_rt_key, void *_udata)
+{
+    hsize_t     *stab_size = (hsize_t *)_udata;         /* User data */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(stab_size);
+
+    *stab_size += H5G_NODE_SIZE(f);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__node_iterate_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_node_debug
+ *
+ * Purpose:	Prints debugging information about a symbol table node
+ *		or a B-tree node for a symbol table B-tree.
+ *
+ * Return:	0(zero) on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  4 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_node_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
+    int fwidth, haddr_t heap_addr)
+{
+    H5G_node_t		*sn = NULL;
+    H5HL_t              *heap = NULL;
+    unsigned		u;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Pin the heap down in memory */
+    if(heap_addr > 0 && H5F_addr_defined(heap_addr))
+        if(NULL == (heap = H5HL_protect(f, dxpl_id, heap_addr, H5AC_READ)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table heap")
+
+    /*
+     * If we couldn't load the symbol table node, then try loading the
+     * B-tree node.
+     */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ))) {
+        H5G_bt_common_t	udata;		/*data to pass through B-tree	*/
+
+        H5E_clear_stack(NULL); /* discard that error */
+        udata.heap = heap;
+	if(H5B_debug(f, dxpl_id, addr, stream, indent, fwidth, H5B_SNODE, &udata) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to debug B-tree node");
+    } /* end if */
+    else {
+        fprintf(stream, "%*sSymbol Table Node...\n", indent, "");
+        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Dirty:",
+                sn->cache_info.is_dirty ? "Yes" : "No");
+        fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+                "Size of Node (in bytes):", (unsigned)sn->node_size);
+        fprintf(stream, "%*s%-*s %u of %u\n", indent, "", fwidth,
+                "Number of Symbols:",
+                sn->nsyms, (unsigned)(2 * H5F_SYM_LEAF_K(f)));
+
+        indent += 3;
+        fwidth = MAX(0, fwidth - 3);
+        for(u = 0; u < sn->nsyms; u++) {
+            fprintf(stream, "%*sSymbol %u:\n", indent - 3, "", u);
+
+            if(heap) {
+                const char *s = (const char *)H5HL_offset_into(heap, sn->entry[u].name_off);
+
+                if(s)
+                    fprintf(stream, "%*s%-*s `%s'\n", indent, "", fwidth, "Name:", s);
+            } /* end if */
+            else
+                fprintf(stream, "%*s%-*s\n", indent, "", fwidth, "Warning: Invalid heap address given, name not displayed!");
+
+            H5G__ent_debug(sn->entry + u, stream, indent, fwidth, heap);
+        } /* end for */
+    } /* end if */
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to release symbol table node")
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_node_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gobj.c b/gatb-core/thirdparty/hdf5/src/H5Gobj.c
new file mode 100644
index 0000000..f9ef67d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gobj.c
@@ -0,0 +1,1227 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gobj.c
+ *			Sep  5 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Functions for abstract handling of objects in groups.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"         /* Links			  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property Lists			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for object header iterator when converting link messages to dense
+ * link storage
+ */
+typedef struct {
+    H5F_t      *f;              /* Pointer to file for insertion */
+    hid_t       dxpl_id;        /* DXPL during insertion */
+    H5O_linfo_t *linfo;         /* Pointer to link info */
+} H5G_obj_oh_it_ud1_t;
+
+/* User data for link iterator when converting dense link storage to link
+ * messages
+ */
+typedef struct {
+    H5O_link_t *lnk_table;              /* Array of links to convert */
+    size_t nlinks;                      /* Number of links converted */
+    size_t alloc_links;                 /* Size of link table        */
+} H5G_obj_lnk_it_ud1_t;
+
+/* User data for symbol table iterator when converting old-format group to
+ * a new-format group
+ */
+typedef struct {
+    const H5O_loc_t   *grp_oloc;              /* Pointer to group for insertion */
+    hid_t       dxpl_id;                /* DXPL during insertion */
+} H5G_obj_stab_it_ud1_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5G_obj_compact_to_dense_cb(const void *_mesg, unsigned idx,
+    void *_udata);
+static herr_t H5G_obj_remove_update_linfo(const H5O_loc_t *oloc, H5O_linfo_t *linfo,
+    hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__obj_create
+ *
+ * Purpose:     Create an object header for a group and update object location info
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Sep 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__obj_create(H5F_t *f, hid_t dxpl_id, H5G_obj_create_t *gcrt_info,
+    H5O_loc_t *oloc/*out*/)
+{
+    H5P_genplist_t  *gc_plist;          /* Group creation property list */
+    H5O_ginfo_t ginfo;                  /* Group info */
+    H5O_linfo_t linfo;                  /* Link info */
+    H5O_pline_t pline;                  /* Pipeline */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(oloc);
+
+    /* Get the property list */
+    if(NULL == (gc_plist = (H5P_genplist_t *)H5I_object(gcrt_info->gcpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get the group info property */
+    if(H5P_get(gc_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Get the link info property */
+    if(H5P_get(gc_plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Get the pipeline property */
+    if(H5P_get(gc_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Call the "real" group creation routine now */
+    if(H5G__obj_create_real(f, dxpl_id, &ginfo, &linfo, &pline, gcrt_info, oloc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCREATE, FAIL, "unable to create group")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__obj_create_real
+ *
+ * Purpose:     Create an object header for a group and update object location info
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Sep 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__obj_create_real(H5F_t *f, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
+    const H5O_linfo_t *linfo, const H5O_pline_t *pline,
+    H5G_obj_create_t *gcrt_info, H5O_loc_t *oloc/*out*/)
+{
+    size_t hdr_size;                    /* Size of object header to request */
+    hbool_t use_latest_format;          /* Flag indicating the new group format should be used */
+    hid_t gcpl_id = gcrt_info->gcpl_id; /* Group creation property list ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(ginfo);
+    HDassert(linfo);
+    HDassert(pline);
+    HDassert(oloc);
+
+    /* Check for invalid access request */
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "no write intent on file")
+
+    /* Check for using the latest version of the group format */
+    /* (add more checks for creating "new format" groups when needed) */
+    if(H5F_USE_LATEST_FORMAT(f) || linfo->track_corder
+            || (pline && pline->nused))
+        use_latest_format = TRUE;
+    else
+        use_latest_format = FALSE;
+
+    /* Make certain that the creation order is being tracked if an index is
+     *  going to be built on it.
+     */
+    if(linfo->index_corder && !linfo->track_corder)
+	HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "must track creation order to create index for it")
+
+    /* Check if we should be using the latest version of the group format */
+    if(use_latest_format) {
+        H5O_link_t lnk;                     /* Temporary link message info for computing message size */
+        char null_char = '\0';              /* Character for creating null string */
+        size_t ginfo_size;                  /* Size of the group info message */
+        size_t linfo_size;                  /* Size of the link info message */
+        size_t pline_size = 0;              /* Size of the pipeline message */
+        size_t link_size;                   /* Size of a link message */
+
+        /* Calculate message size infomation, for creating group's object header */
+        linfo_size = H5O_msg_size_f(f, gcpl_id, H5O_LINFO_ID, linfo, (size_t)0);
+        HDassert(linfo_size);
+
+        ginfo_size = H5O_msg_size_f(f, gcpl_id, H5O_GINFO_ID, ginfo, (size_t)0);
+        HDassert(ginfo_size);
+
+        if(pline && pline->nused) {
+            pline_size = H5O_msg_size_f(f, gcpl_id, H5O_PLINE_ID, pline, (size_t)0);
+            HDassert(pline_size);
+        } /* end if */
+
+        lnk.type = H5L_TYPE_HARD;
+        lnk.corder = 0;
+        lnk.corder_valid = linfo->track_corder;
+        lnk.cset = H5T_CSET_ASCII;
+        lnk.name = &null_char;
+        link_size = H5O_msg_size_f(f, gcpl_id, H5O_LINK_ID, &lnk, (size_t)ginfo->est_name_len);
+        HDassert(link_size);
+
+        /* Compute size of header to use for creation */
+        hdr_size = linfo_size +
+                    ginfo_size +
+                    pline_size +
+                    (ginfo->est_num_entries * link_size);
+    } /* end if */
+    else
+        hdr_size = (size_t)(4 + 2 * H5F_SIZEOF_ADDR(f));
+
+    /*
+     * Create group's object header.  It has a zero link count
+     * since nothing refers to it yet.	The link count will be
+     * incremented if the object is added to the group directed graph.
+     */
+    if(H5O_create(f, dxpl_id, hdr_size, (size_t)1, gcpl_id, oloc/*out*/) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create header")
+
+    /* Check for format of group to create */
+    if(use_latest_format) {
+        /* Insert link info message */
+        /* (Casting away const OK - QAK) */
+        if(H5O_msg_create(oloc, H5O_LINFO_ID, 0, H5O_UPDATE_TIME, (void *)linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+        /* Insert group info message */
+        /* (Casting away const OK - QAK) */
+        if(H5O_msg_create(oloc, H5O_GINFO_ID, H5O_MSG_FLAG_CONSTANT, 0, (void *)ginfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+        /* Insert pipeline message */
+        if(pline && pline->nused)
+            /* (Casting away const OK - QAK) */
+            if(H5O_msg_create(oloc, H5O_PLINE_ID, H5O_MSG_FLAG_CONSTANT, 0, (void *)pline, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+    } /* end if */
+    else {
+        H5O_stab_t	stab;		/* Symbol table message	*/
+
+        /* The group doesn't currently have a 'stab' message, go create one */
+        if(H5G__stab_create(oloc, dxpl_id, ginfo, &stab) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create symbol table")
+
+        /* Cache the symbol table information */
+        gcrt_info->cache_type = H5G_CACHED_STAB;
+        gcrt_info->cache.stab.btree_addr = stab.btree_addr;
+        gcrt_info->cache.stab.heap_addr = stab.heap_addr;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_create_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__obj_get_linfo
+ *
+ * Purpose:     Retrieves the "link info" message for an object.  Also
+ *              sets the number of links correctly, if it isn't set up yet.
+ *
+ * Return:	Success:	TRUE/FALSE whether message was found & retrieved
+ *              Failure:        FAIL if error occurred
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 11 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G__obj_get_linfo(const H5O_loc_t *grp_oloc, H5O_linfo_t *linfo, hid_t dxpl_id)
+{
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc);
+    HDassert(linfo);
+
+    /* Check for the group having a link info message */
+    if((ret_value = H5O_msg_exists(grp_oloc, H5O_LINFO_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+    if(ret_value) {
+        /* Retrieve the "link info" structure */
+        if(NULL == H5O_msg_read(grp_oloc, H5O_LINFO_ID, linfo, dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "link info message not present")
+
+        /* Check if we don't know how many links there are */
+        if(linfo->nlinks == HSIZET_MAX) {
+            /* Check if we are using "dense" link storage */
+            if(H5F_addr_defined(linfo->fheap_addr)) {
+                /* Open the name index v2 B-tree */
+                if(NULL == (bt2_name = H5B2_open(grp_oloc->file, dxpl_id, linfo->name_bt2_addr, NULL)))
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+                /* Retrieve # of records in "name" B-tree */
+                /* (should be same # of records in all indices) */
+                if(H5B2_get_nrec(bt2_name, &linfo->nlinks) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve # of records in index")
+            } /* end if */
+            else {
+                /* Retrieve # of links from object header */
+                if(H5O_get_nlinks(grp_oloc, dxpl_id, &linfo->nlinks) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve # of links for object")
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_get_linfo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_compact_to_dense_cb
+ *
+ * Purpose:	Callback routine for converting "compact" to "dense"
+ *              link storage form.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_obj_compact_to_dense_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void *_udata)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_mesg;  /* Pointer to link */
+    H5G_obj_oh_it_ud1_t *udata = (H5G_obj_oh_it_ud1_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+
+    /* Insert link into dense link storage */
+    if(H5G__dense_insert(udata->f, udata->dxpl_id, udata->linfo, lnk) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into dense storage")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_compact_to_dense_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_stab_to_new_cb
+ *
+ * Purpose:	Callback routine for converting "symbol table" link storage to
+ *              "new format" storage (either "compact" or "dense" storage).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sept 16 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_obj_stab_to_new_cb(const H5O_link_t *lnk, void *_udata)
+{
+    H5G_obj_stab_it_ud1_t *udata = (H5G_obj_stab_it_ud1_t *)_udata;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(lnk);
+    HDassert(udata);
+
+    /* Insert link into group */
+    /* (Casting away const OK - QAK) */
+    if(H5G_obj_insert(udata->grp_oloc, lnk->name, (H5O_link_t *)lnk, FALSE,
+            H5O_TYPE_UNKNOWN, NULL, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5_ITER_ERROR, "can't insert link into group")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_stab_to_new_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_insert
+ *
+ * Purpose:	Insert a new symbol into the group described by GRP_OLOC.
+ *		file F.	 The name of the new symbol is NAME and its symbol
+ *		table entry is OBJ_LNK.  Increment the reference
+ *              count for the object the link points if OBJ_LNK is a hard link
+ *              and ADJ_LINK is true.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
+    hbool_t adj_link, H5O_type_t obj_type, const void *crt_info, hid_t dxpl_id)
+{
+    H5O_pline_t tmp_pline;      /* Pipeline message */
+    H5O_pline_t *pline = NULL;  /* Pointer to pipeline message */
+    H5O_linfo_t linfo;		/* Link info message */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    hbool_t use_old_format;     /* Whether to use 'old format' (symbol table) for insertions or not */
+    hbool_t use_new_dense = FALSE;      /* Whether to use "dense" form of 'new format' group */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(name && *name);
+    HDassert(obj_lnk);
+
+    /* Check if we have information about the number of objects in this group */
+    /* (by attempting to get the link info message for this group) */
+    if((linfo_exists = H5G__obj_get_linfo(grp_oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        H5O_ginfo_t ginfo;	/* Group info message */
+        size_t link_msg_size;   /* Size of new link message in the file */
+
+        /* Using the new format for groups */
+        use_old_format = FALSE;
+
+        /* Check for tracking creation order on this group's links */
+        if(linfo.track_corder) {
+            /* Set the creation order for the new link & indicate that it's valid */
+            obj_lnk->corder = linfo.max_corder;
+            obj_lnk->corder_valid = TRUE;
+
+            /* Increment the max. creation order used in the group */
+            linfo.max_corder++;
+        } /* end if */
+
+        /* Get the link's message size */
+        if((link_msg_size = H5O_msg_raw_size(grp_oloc->file, H5O_LINK_ID, FALSE, obj_lnk)) == 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't get link size")
+
+        /* Get the group info */
+        if(NULL == H5O_msg_read(grp_oloc, H5O_GINFO_ID, &ginfo, dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info")
+
+        /* If there's still a small enough number of links, use the 'link' message */
+        /* (If the encoded form of the link is too large to fit into an object
+         *  header message, convert to using dense link storage instead of link messages)
+         */
+        if(H5F_addr_defined(linfo.fheap_addr))
+            use_new_dense = TRUE;
+        else if(linfo.nlinks < ginfo.max_compact && link_msg_size < H5O_MESG_MAX_SIZE)
+            use_new_dense = FALSE;
+        else {
+            htri_t              pline_exists;   /* Whether the pipeline message exists */
+            H5G_obj_oh_it_ud1_t	udata;          /* User data for iteration */
+            H5O_mesg_operator_t op;             /* Message operator */
+
+            /* Get the pipeline message, if it exists */
+            if((pline_exists = H5O_msg_exists(grp_oloc, H5O_PLINE_ID, dxpl_id)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+            if(pline_exists) {
+                if(NULL == H5O_msg_read(grp_oloc, H5O_PLINE_ID, &tmp_pline, dxpl_id))
+                    HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link pipeline")
+                pline = &tmp_pline;
+            } /* end if */
+
+            /* The group doesn't currently have "dense" storage for links */
+            if(H5G__dense_create(grp_oloc->file, dxpl_id, &linfo, pline) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create 'dense' form of new format group")
+
+            /* Set up user data for object header message iteration */
+            udata.f = grp_oloc->file;
+            udata.dxpl_id = dxpl_id;
+            udata.linfo = &linfo;
+
+            /* Iterate over the 'link' messages, inserting them into the dense link storage  */
+            op.op_type = H5O_MESG_OP_APP;
+            op.u.app_op = H5G_obj_compact_to_dense_cb;
+            if(H5O_msg_iterate(grp_oloc, H5O_LINK_ID, &op, &udata, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over links")
+
+            /* Remove all the 'link' messages */
+            if(H5O_msg_remove(grp_oloc, H5O_LINK_ID, H5O_ALL, FALSE, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link messages")
+
+            use_new_dense = TRUE;
+        } /* end else */
+    } /* end if */
+    else {
+        /* Check for new-style link information */
+        if(obj_lnk->cset != H5T_CSET_ASCII || obj_lnk->type > H5L_TYPE_BUILTIN_MAX) {
+            H5O_linfo_t new_linfo = H5G_CRT_LINK_INFO_DEF;  /* Link information */
+            H5O_ginfo_t new_ginfo = H5G_CRT_GROUP_INFO_DEF; /* Group information */
+            H5G_obj_stab_it_ud1_t udata;        /* User data for iteration */
+
+            /* Convert group to "new format" group, in order to hold the information */
+
+            /* Insert link info message */
+            if(H5O_msg_create(grp_oloc, H5O_LINFO_ID, 0, 0, &new_linfo, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+            /* Insert group info message */
+            if(H5O_msg_create(grp_oloc, H5O_GINFO_ID, H5O_MSG_FLAG_CONSTANT, H5O_UPDATE_TIME, &new_ginfo, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+            /* Set up user data for iteration */
+            udata.grp_oloc = grp_oloc;
+            udata.dxpl_id = dxpl_id;
+
+            /* Iterate through all links in "old format" group and insert them into new format */
+            if(H5G__stab_iterate(grp_oloc, dxpl_id, H5_ITER_NATIVE, (hsize_t)0, NULL, H5G_obj_stab_to_new_cb, &udata) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over old format links")
+
+            /* Remove the symbol table message from the group */
+            if(H5O_msg_remove(grp_oloc, H5O_STAB_ID, 0, FALSE, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete old format link storage")
+
+            /* Recursively call this routine to insert the new link, since the
+             *  group is in the "new format" now and the link info should be
+             *  set up, etc.
+             */
+            if(H5G_obj_insert(grp_oloc, name, obj_lnk, adj_link, obj_type,
+                    crt_info, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into group")
+
+            /* Done with insertion now */
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+        else
+            use_old_format = TRUE;
+    } /* end if */
+
+    /* Insert into symbol table or "dense" storage */
+    if(use_old_format) {
+        /* Insert into symbol table */
+        if(H5G__stab_insert(grp_oloc, name, obj_lnk, obj_type, crt_info, dxpl_id)
+                < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert entry into symbol table")
+    } /* end if */
+    else {
+        if(use_new_dense) {
+            /* Insert into dense link storage */
+            if(H5G__dense_insert(grp_oloc->file, dxpl_id, &linfo, obj_lnk) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into dense storage")
+        } /* end if */
+        else {
+            /* Insert with link message */
+            if(H5G__compact_insert(grp_oloc, obj_lnk, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link as link message")
+        } /* end else */
+    } /* end else */
+
+    /* Increment the number of objects in this group */
+    if(!use_old_format) {
+        linfo.nlinks++;
+        if(H5O_msg_write(grp_oloc, H5O_LINFO_ID, 0, H5O_UPDATE_TIME, &linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't update link info message")
+    } /* end if */
+
+    /* Increment link count on object, if requested and it's a hard link */
+    if(adj_link && obj_lnk->type == H5L_TYPE_HARD) {
+        H5O_loc_t obj_oloc;             /* Object location */
+        H5O_loc_reset(&obj_oloc);
+
+        /* Create temporary object location */
+        obj_oloc.file = grp_oloc->file;
+        obj_oloc.addr = obj_lnk->u.hard.addr;
+
+        /* Increment reference count for object */
+        if(H5O_link(&obj_oloc, 1, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_LINKCOUNT, FAIL, "unable to increment hard link count")
+    } /* end if */
+
+done:
+    /* Free any space used by the pipeline message */
+    if(pline && H5O_msg_reset(H5O_PLINE_ID, pline) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "can't release pipeline")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__obj_iterate
+ *
+ * Purpose:     Private function for H5Giterate.
+ *              Iterates over objects in a group
+ *
+ * Return:	Success:        Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Oct  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__obj_iterate(const H5O_loc_t *grp_oloc,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    H5G_lib_iterate_t op, void *op_data, hid_t dxpl_id)
+{
+    H5O_linfo_t	linfo;		/* Link info message */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(grp_oloc);
+    HDassert(op);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(grp_oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for going out of bounds */
+        if(skip > 0 && (size_t)skip >= linfo.nlinks)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+        /* Check for creation order tracking, if creation order index lookup requested */
+        if(idx_type == H5_INDEX_CRT_ORDER) {
+            /* Check if creation order is tracked */
+            if(!linfo.track_corder)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "creation order not tracked for links in group")
+        } /* end if */
+
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Iterate over the links in the group, building a table of the link messages */
+            if((ret_value = H5G__dense_iterate(grp_oloc->file, dxpl_id, &linfo, idx_type, order, skip, last_lnk, op, op_data)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over dense links")
+        } /* end if */
+        else {
+            /* Get the object's name from the link messages */
+            if((ret_value = H5G__compact_iterate(grp_oloc, dxpl_id, &linfo, idx_type, order, skip, last_lnk, op, op_data)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over compact links")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Can only perform name lookups on groups with symbol tables */
+        if(idx_type != H5_INDEX_NAME)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no creation order index to query")
+
+        /* Iterate over symbol table */
+        if((ret_value = H5G__stab_iterate(grp_oloc, dxpl_id, order, skip, last_lnk, op, op_data)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "can't iterate over symbol table")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__obj_info
+ *
+ * Purpose:	Retrieve information about a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__obj_info(H5O_loc_t *oloc, H5G_info_t *grp_info, hid_t dxpl_id)
+{
+    H5G_t *grp = NULL;                  /* Group to query */
+    H5G_loc_t   grp_loc;                /* Entry of group to be queried */
+    H5G_name_t  grp_path;            	/* Group hier. path */
+    H5O_loc_t   grp_oloc;            	/* Group object location */
+    H5O_linfo_t	linfo;		        /* Link info message */
+    htri_t linfo_exists;                /* Whether the link info message exists */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(grp_info);
+
+    /* Set up group location to fill in */
+    grp_loc.oloc = &grp_oloc;
+    grp_loc.path = &grp_path;
+    H5G_loc_reset(&grp_loc);
+
+    /* Deep copy (duplicate) of the group location object */
+    if(H5O_loc_copy(&grp_oloc, oloc, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, FAIL, "can't copy object location")
+
+    /* Open the group */
+    if(NULL == (grp = H5G_open(&grp_loc, dxpl_id)))
+        HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "mount point not found")
+
+    /* Get information from the group */
+    grp_info->mounted = H5G_MOUNTED(grp);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Retrieve the information about the links */
+        grp_info->nlinks = linfo.nlinks;
+        grp_info->max_corder = linfo.max_corder;
+
+        /* Check if the group is using compact or dense storage for its links */
+        if(H5F_addr_defined(linfo.fheap_addr))
+            grp_info->storage_type = H5G_STORAGE_TYPE_DENSE;
+        else
+            grp_info->storage_type = H5G_STORAGE_TYPE_COMPACT;
+    } /* end if */
+    else {
+        /* Get the number of objects in this group by iterating over symbol table */
+        if(H5G__stab_count(oloc, &grp_info->nlinks, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "can't count objects")
+
+        /* Set the other information about the group */
+        grp_info->storage_type = H5G_STORAGE_TYPE_SYMBOL_TABLE;
+        grp_info->max_corder = 0;
+    } /* end else */
+
+done:
+    /* Clean up resources */
+    if(grp && H5G_close(grp) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "unable to close queried group")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_get_name_by_idx
+ *
+ * Purpose:     Returns the name of link in a group by giving index.
+ *
+ * Return:	Success:        Non-negative, length of name
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G_obj_get_name_by_idx(const H5O_loc_t *oloc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, char* name, size_t size, hid_t dxpl_id)
+{
+    H5O_linfo_t	linfo;		/* Link info message */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(oloc && oloc->file);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for creation order tracking, if creation order index lookup requested */
+        if(idx_type == H5_INDEX_CRT_ORDER) {
+            /* Check if creation order is tracked */
+            if(!linfo.track_corder)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "creation order not tracked for links in group")
+        } /* end if */
+
+        /* Check for dense link storage */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Get the object's name from the dense link storage */
+            if((ret_value = H5G__dense_get_name_by_idx(oloc->file, dxpl_id, &linfo, idx_type, order, n, name, size)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate name")
+        } /* end if */
+        else {
+            /* Get the object's name from the link messages */
+            if((ret_value = H5G__compact_get_name_by_idx(oloc, dxpl_id, &linfo, idx_type, order, n, name, size)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate name")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Can only perform name lookups on groups with symbol tables */
+        if(idx_type != H5_INDEX_NAME)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no creation order index to query")
+
+        /* Get the object's name from the symbol table */
+        if((ret_value = H5G__stab_get_name_by_idx(oloc, order, n, name, size, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate name")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_get_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_remove_update_linfo
+ *
+ * Purpose:     Update the link info after removing a link from a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_obj_remove_update_linfo(const H5O_loc_t *oloc, H5O_linfo_t *linfo, hid_t dxpl_id)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(linfo);
+
+    /* Decrement # of links in group */
+    linfo->nlinks--;
+
+    /* Reset the creation order min/max if there's no more links in group */
+    if(linfo->nlinks == 0)
+        linfo->max_corder = 0;
+
+    /* Check for transitioning out of dense storage, if we are using it */
+    if(H5F_addr_defined(linfo->fheap_addr)) {
+        /* Check if there's no more links */
+        if(linfo->nlinks == 0) {
+            /* Delete the dense storage */
+            if(H5G__dense_delete(oloc->file, dxpl_id, linfo, FALSE) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete dense link storage")
+        } /* end if */
+        /* Check for switching back to compact storage */
+        else {
+            H5O_ginfo_t ginfo;		/* Group info message            */
+
+            /* Get the group info */
+            if(NULL == H5O_msg_read(oloc, H5O_GINFO_ID, &ginfo, dxpl_id))
+                HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info")
+
+            /* Check if we should switch from dense storage back to link messages */
+            if(linfo->nlinks < ginfo.min_dense) {
+                struct H5O_t *oh = NULL;      /* Pointer to group's object header */
+                H5G_link_table_t ltable;        /* Table of links */
+                hbool_t can_convert = TRUE;     /* Whether converting to link messages is possible */
+                size_t u;                       /* Local index */
+
+                /* Build the table of links for this group */
+                if(H5G__dense_build_table(oloc->file, dxpl_id, linfo, H5_INDEX_NAME, H5_ITER_NATIVE, &ltable) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over links")
+
+                /* Pin the object header */
+                if(NULL == (oh = H5O_pin(oloc, dxpl_id)))
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTPIN, FAIL, "unable to pin group object header")
+
+                /* Inspect links in table for ones that can't be converted back
+                 * into link message form (currently only links which can't fit
+                 * into an object header message)
+                 */
+                for(u = 0; u < linfo->nlinks; u++)
+                    if(H5O_msg_size_oh(oloc->file, oh, H5O_LINK_ID, &(ltable.lnks[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) {
+                        can_convert = FALSE;
+                        break;
+                    } /* end if */
+
+                /* If ok, insert links as link messages */
+                if(can_convert) {
+                    /* Insert link messages into group */
+                    for(u = 0; u < linfo->nlinks; u++)
+                        if(H5O_msg_append_oh(oloc->file, dxpl_id, oh, H5O_LINK_ID, 0, H5O_UPDATE_TIME, &(ltable.lnks[u])) < 0) {
+                            /* Release object header */
+                            if(H5O_unpin(oh) < 0)
+                                HDONE_ERROR(H5E_SYM, H5E_CANTUNPIN, FAIL, "unable to unpin group object header")
+
+                            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+                        } /* end if */
+
+                    /* Remove the dense storage */
+                    if(H5G__dense_delete(oloc->file, dxpl_id, linfo, FALSE) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete dense link storage")
+                } /* end if */
+
+                /* Release object header */
+                if(H5O_unpin(oh) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTUNPIN, FAIL, "unable to unpin group object header")
+
+                /* Free link table information */
+                if(H5G__link_release_table(&ltable) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+    /* Update link info in the object header */
+    if(H5O_msg_write(oloc, H5O_LINFO_ID, 0, H5O_UPDATE_TIME, linfo, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't update link info message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_remove_update_linfo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_remove
+ *
+ * Purpose:     Remove a link from a group.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_obj_remove(const H5O_loc_t *oloc, H5RS_str_t *grp_full_path_r, const char *name, hid_t dxpl_id)
+{
+    H5O_linfo_t	linfo;		/* Link info message            */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    hbool_t     use_old_format; /* Whether to use 'old format' (symbol table) for deletion or not */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(name && *name);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Using the new format for groups */
+        use_old_format = FALSE;
+
+        /* Check for dense or compact storage */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Remove object from the dense link storage */
+            if(H5G__dense_remove(oloc->file, dxpl_id, &linfo, grp_full_path_r, name) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+        } /* end if */
+        else {
+            /* Remove object from the link messages */
+            if(H5G__compact_remove(oloc, dxpl_id, grp_full_path_r, name) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Using the old format for groups */
+        use_old_format = TRUE;
+
+        /* Remove object from the symbol table */
+        if(H5G__stab_remove(oloc, dxpl_id, grp_full_path_r, name) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+    } /* end else */
+
+    /* Update link info for a new-style group */
+    if(!use_old_format)
+        if(H5G_obj_remove_update_linfo(oloc, &linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTUPDATE, FAIL, "unable to update link info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_remove_by_idx
+ *
+ * Purpose:     Remove a link from a group, according to the order within an index.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_obj_remove_by_idx(const H5O_loc_t *grp_oloc, H5RS_str_t *grp_full_path_r,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t dxpl_id)
+{
+    H5O_linfo_t	linfo;		/* Link info message            */
+    htri_t linfo_exists;        /* Whether the link info message exists */
+    hbool_t     use_old_format; /* Whether to use 'old format' (symbol table) for deletion or not */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(grp_oloc && grp_oloc->file);
+
+    /* Attempt to get the link info for this group */
+    if((linfo_exists = H5G__obj_get_linfo(grp_oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for creation order tracking, if creation order index lookup requested */
+        if(idx_type == H5_INDEX_CRT_ORDER) {
+            /* Check if creation order is tracked */
+            if(!linfo.track_corder)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "creation order not tracked for links in group")
+        } /* end if */
+
+        /* Using the new format for groups */
+        use_old_format = FALSE;
+
+        /* Check for dense or compact storage */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Remove object from the dense link storage */
+            if(H5G__dense_remove_by_idx(grp_oloc->file, dxpl_id, &linfo, grp_full_path_r, idx_type, order, n) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+        } /* end if */
+        else {
+            /* Remove object from compact link storage */
+            if(H5G__compact_remove_by_idx(grp_oloc, dxpl_id, &linfo, grp_full_path_r, idx_type, order, n) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Can only perform name lookups on groups with symbol tables */
+        if(idx_type != H5_INDEX_NAME)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no creation order index to query")
+
+        /* Using the old format for groups */
+        use_old_format = TRUE;
+
+        /* Remove object from the symbol table */
+        if(H5G__stab_remove_by_idx(grp_oloc, dxpl_id, grp_full_path_r, order, n) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't remove object")
+    } /* end else */
+
+    /* Update link info for a new-style group */
+    if(!use_old_format) {
+        if(H5G_obj_remove_update_linfo(grp_oloc, &linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTUPDATE, FAIL, "unable to update link info")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__obj_lookup
+ *
+ * Purpose:	Look up a link in a group, using the name as the key.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 26 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G__obj_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
+    hid_t dxpl_id)
+{
+    H5O_linfo_t linfo;		        /* Link info message */
+    htri_t linfo_exists;                /* Whether the link info message exists */
+    htri_t     ret_value = FALSE;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(name && *name);
+
+    /* Attempt to get the link info message for this group */
+    if((linfo_exists = H5G__obj_get_linfo(grp_oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for dense link storage */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Get the object's info from the dense link storage */
+            if((ret_value = H5G__dense_lookup(grp_oloc->file, dxpl_id, &linfo, name, lnk)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+        } /* end if */
+        else {
+            /* Get the object's info from the link messages */
+            if((ret_value = H5G__compact_lookup(grp_oloc, name, lnk, dxpl_id)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Get the object's info from the symbol table */
+        if((ret_value = H5G__stab_lookup(grp_oloc, name, lnk, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__obj_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_obj_lookup_by_idx
+ *
+ * Purpose:	Look up link info in a group, according to an order within an
+ *              index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_obj_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, H5O_link_t *lnk, hid_t dxpl_id)
+{
+    H5O_linfo_t linfo;		        /* Link info message */
+    htri_t linfo_exists;                /* Whether the link info message exists */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+
+    /* Attempt to get the link info message for this group */
+    if((linfo_exists = H5G__obj_get_linfo(grp_oloc, &linfo, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check for link info message")
+    if(linfo_exists) {
+        /* Check for creation order tracking, if creation order index lookup requested */
+        if(idx_type == H5_INDEX_CRT_ORDER) {
+            /* Check if creation order is tracked */
+            if(!linfo.track_corder)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "creation order not tracked for links in group")
+        } /* end if */
+
+        /* Check for dense link storage */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Get the link from the dense storage */
+            if(H5G__dense_lookup_by_idx(grp_oloc->file, dxpl_id, &linfo, idx_type, order, n, lnk) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+        } /* end if */
+        else {
+            /* Get the link from the link messages */
+            if(H5G__compact_lookup_by_idx(grp_oloc, dxpl_id, &linfo, idx_type, order, n, lnk) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Can only perform name lookups on groups with symbol tables */
+        if(idx_type != H5_INDEX_NAME)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no creation order index to query")
+
+        /* Get the object's info from the symbol table */
+        if(H5G__stab_lookup_by_idx(grp_oloc, order, n, lnk, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't locate object")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_obj_lookup_by_idx() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Goh.c b/gatb-core/thirdparty/hdf5/src/H5Goh.c
new file mode 100644
index 0000000..7b63e52
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Goh.c
@@ -0,0 +1,417 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"             /* Groups				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static void *H5O_group_get_copy_file_udata(void);
+static void H5O_group_free_copy_file_udata(void *udata);
+static htri_t H5O_group_isa(H5O_t *loc);
+static hid_t H5O_group_open(const H5G_loc_t *obj_loc, hid_t lapl_id,
+    hid_t dxpl_id, hbool_t app_ref);
+static void *H5O_group_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
+    hid_t dxpl_id);
+static H5O_loc_t *H5O_group_get_oloc(hid_t obj_id);
+static herr_t H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5_ih_info_t *bh_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* This message derives from H5O object class */
+const H5O_obj_class_t H5O_OBJ_GROUP[1] = {{
+    H5O_TYPE_GROUP,		/* object type			*/
+    "group",			/* object name, for debugging	*/
+    H5O_group_get_copy_file_udata, /* get 'copy file' user data	*/
+    H5O_group_free_copy_file_udata, /* free 'copy file' user data */
+    H5O_group_isa, 		/* "isa" message		*/
+    H5O_group_open, 		/* open an object of this class */
+    H5O_group_create, 		/* create an object of this class */
+    H5O_group_get_oloc,		/* get an object header location for an object */
+    H5O_group_bh_info, 		/* get the index & heap info for an object */
+    NULL 			/* flush an opened object of this class */
+}};
+
+/* Declare the external free list to manage the H5O_ginfo_t struct */
+H5FL_DEFINE(H5G_copy_file_ud_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_get_copy_file_udata
+ *
+ * Purpose:	Allocates the user data needed for copying a group's
+ *		object header from file to file.
+ *
+ * Return:	Success:	Non-NULL pointer to user data
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Neil Fortner
+ *              Thursday, July 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_group_get_copy_file_udata(void)
+{
+    void *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate space for the 'copy file' user data for copying groups.
+     * Currently this is only a ginfo, so there is no specific struct type for
+     * this operation. */
+    if(NULL == (ret_value = H5FL_CALLOC(H5G_copy_file_ud_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_get_copy_file_udata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_free_copy_file_udata
+ *
+ * Purpose:	Release the user data needed for copying a group's
+ *		object header from file to file.
+ *
+ * Return:	<none>
+ *
+ * Programmer:	Neil Fortner
+ *              Thursday, July 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5O_group_free_copy_file_udata(void *_udata)
+{
+    H5G_copy_file_ud_t *udata = (H5G_copy_file_ud_t *)_udata;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(udata);
+
+    /* Free the ginfo struct (including nested data structs) */
+    H5O_msg_free(H5O_PLINE_ID, udata->common.src_pline);
+
+    /* Release space for 'copy file' user data (ginfo struct) */
+    udata = H5FL_FREE(H5G_copy_file_ud_t, udata);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5O_group_free_copy_file_udata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_isa
+ *
+ * Purpose:	Determines if an object has the requisite messages for being
+ *		a group.
+ *
+ * Return:	Success:	TRUE if the required group messages are
+ *				present; FALSE otherwise.
+ *
+ *		Failure:	FAIL if the existence of certain messages
+ *				cannot be determined.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, November  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_group_isa(struct H5O_t *oh)
+{
+    htri_t	stab_exists;            /* Whether the 'stab' message is in the object header */
+    htri_t	linfo_exists;           /* Whether the 'linfo' message is in the object header */
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(oh);
+
+    /* Check for any of the messages that indicate a group */
+    if((stab_exists = H5O_msg_exists_oh(oh, H5O_STAB_ID)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read object header")
+    if((linfo_exists = H5O_msg_exists_oh(oh, H5O_LINFO_ID)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read object header")
+
+    ret_value = (stab_exists > 0 || linfo_exists > 0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_isa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_open
+ *
+ * Purpose:	Open a group at a particular location
+ *
+ * Return:	Success:	Open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5O_group_open(const H5G_loc_t *obj_loc, hid_t H5_ATTR_UNUSED lapl_id, hid_t dxpl_id, hbool_t app_ref)
+{
+    H5G_t       *grp = NULL;            /* Group opened */
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(obj_loc);
+
+    /* Open the group */
+    if(NULL == (grp = H5G_open(obj_loc, dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+
+    /* Register an ID for the group */
+    if((ret_value = H5I_register(H5I_GROUP, grp, app_ref)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+done:
+    if(ret_value < 0)
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_create
+ *
+ * Purpose:	Create a group in a file
+ *
+ * Return:	Success:	Pointer to the group data structure
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April 10, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_group_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+    H5G_obj_create_t *crt_info = (H5G_obj_create_t *)_crt_info; /* Group creation parameters */
+    H5G_t *grp = NULL;          /* New group created */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(crt_info);
+    HDassert(obj_loc);
+
+    /* Create the the group */
+    if(NULL == (grp = H5G__create(f, crt_info, dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to create group")
+
+    /* Set up the new group's location */
+    if(NULL == (obj_loc->oloc = H5G_oloc(grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get object location of group")
+    if(NULL == (obj_loc->path = H5G_nameof(grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get path of group")
+
+    /* Set the return value */
+    ret_value = grp;
+
+done:
+    if(ret_value == NULL)
+        if(grp && H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "unable to release group")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_group_get_oloc
+ *
+ * Purpose:	Retrieve the object header location for an open object
+ *
+ * Return:	Success:	Pointer to object header location
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_loc_t *
+H5O_group_get_oloc(hid_t obj_id)
+{
+    H5G_t       *grp;                   /* Group opened */
+    H5O_loc_t	*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get the group */
+    if(NULL ==  (grp = (H5G_t *)H5I_object(obj_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
+
+    /* Get the group's object header location */
+    if(NULL == (ret_value = H5G_oloc(grp)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_get_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_group_bh_info
+ *
+ * Purpose:     Retrieve storage for 1.8 btree and heap
+ *		Retrieve storage for 1.6 btree and heap via H5G_stab_bh_info()
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              July 12 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
+{
+    htri_t	exists;                 /* Flag if header message of interest exists */
+    H5HF_t      *fheap = NULL;          /* Fractal heap handle */
+    H5B2_t      *bt2_name = NULL;       /* v2 B-tree handle for name index */
+    H5B2_t      *bt2_corder = NULL;     /* v2 B-tree handle for creation order index */
+    herr_t      ret_value = SUCCEED;  	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(bh_info);
+
+    /* Check for "new style" group info */
+    if((exists = H5O_msg_exists_oh(oh, H5O_LINFO_ID)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read object header")
+    if(exists > 0) {
+        H5O_linfo_t linfo;          	/* Link info message */
+
+        /* Get "new style" group info */
+        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_LINFO_ID, &linfo))
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't read LINFO message")
+
+        /* Check if name index available */
+        if(H5F_addr_defined(linfo.name_bt2_addr)) {
+            /* Open the name index v2 B-tree */
+            if(NULL == (bt2_name = H5B2_open(f, dxpl_id, linfo.name_bt2_addr, NULL)))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+            /* Get name index B-tree size */
+            if(H5B2_size(bt2_name, dxpl_id, &bh_info->index_size) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info for name index")
+        } /* end if */
+
+        /* Check if creation order index available */
+	if(H5F_addr_defined(linfo.corder_bt2_addr)) {
+            /* Open the creation order index v2 B-tree */
+            if(NULL == (bt2_corder = H5B2_open(f, dxpl_id, linfo.corder_bt2_addr, NULL)))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+            /* Get creation order index B-tree size */
+            if(H5B2_size(bt2_corder, dxpl_id, &bh_info->index_size) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info for creation order index")
+        } /* end if */
+
+        /* Get fractal heap size, if available */
+        if(H5F_addr_defined(linfo.fheap_addr)) {
+            /* Open the fractal heap for links */
+            if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo.fheap_addr)))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+            /* Get heap storage size */
+            if(H5HF_size(fheap, dxpl_id, &bh_info->heap_size) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve fractal heap storage info")
+        } /* end if */
+    } /* end if */
+    else {
+        H5O_stab_t          stab;       	/* Info about symbol table */
+
+        /* Must be "old style" group, get symbol table message */
+        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_STAB_ID, &stab))
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't find LINFO nor STAB messages")
+
+        /* Get symbol table size info */
+        if(H5G__stab_bh_size(f, dxpl_id, &stab, bh_info) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve symbol table size info")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_group_bh_info() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gpkg.h b/gatb-core/thirdparty/hdf5/src/H5Gpkg.h
new file mode 100644
index 0000000..b194adb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gpkg.h
@@ -0,0 +1,539 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Robb Matzke <matzke at llnl.gov>
+ *             Thursday, September 18, 1997
+ *
+ * Purpose:     This file contains declarations which are visible
+ *              only within the H5G package. Source files outside the
+ *              H5G package should include H5Gprivate.h instead.
+ */
+#ifndef H5G_PACKAGE
+#error "Do not include this file outside the H5G package!"
+#endif
+
+#ifndef _H5Gpkg_H
+#define _H5Gpkg_H
+
+/* Get package's private header */
+#include "H5Gprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5B2private.h"	/* v2 B-trees				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5HFprivate.h"	/* Fractal heaps			*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Standard length of fractal heap ID for link */
+#define H5G_DENSE_FHEAP_ID_LEN  7
+
+/* Size of a symbol table node on disk */
+#define H5G_NODE_SIZE(f)     (                                                \
+    /* General metadata fields */                                             \
+    H5_SIZEOF_MAGIC                                                           \
+    + 1         /* Version */                                                 \
+    + 1         /* Reserved */                                                \
+    + 2         /* Number of symbols */                                       \
+                                                                              \
+    /* Entries */                                                             \
+    + ((2 * H5F_SYM_LEAF_K(f)) * H5G_SIZEOF_ENTRY(f))                         \
+    )
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/*
+ * Various types of object header information can be cached in a symbol
+ * table entry (it's normal home is the object header to which the entry
+ * points).  This datatype determines what (if anything) is cached in the
+ * symbol table entry.
+ */
+typedef enum H5G_cache_type_t {
+    H5G_CACHED_ERROR	= -1, 	/*force enum to be signed		     */
+    H5G_NOTHING_CACHED  = 0,    /*nothing is cached, must be 0               */
+    H5G_CACHED_STAB     = 1,    /*symbol table, `stab'                       */
+    H5G_CACHED_SLINK	= 2, 	/*symbolic link				     */
+
+    H5G_NCACHED                 /*THIS MUST BE LAST                          */
+} H5G_cache_type_t;
+
+/*
+ * A symbol table entry caches these parameters from object header
+ * messages...  The values are entered into the symbol table when an object
+ * header is created (by hand) and are extracted from the symbol table with a
+ * callback function registered in H5O_init_interface().  Be sure to update
+ * H5G_ent_decode(), H5G_ent_encode(), and H5G__ent_debug() as well.
+ */
+typedef union H5G_cache_t {
+    struct {
+        haddr_t btree_addr;             /*file address of symbol table B-tree*/
+        haddr_t heap_addr;              /*file address of stab name heap     */
+    } stab;
+
+    struct {
+	size_t	lval_offset;		/*link value offset		     */
+    } slink;
+} H5G_cache_t;
+
+/*
+ * A symbol table entry.  The two important fields are `name_off' and
+ * `header'.  The remaining fields are used for caching information that
+ * also appears in the object header to which this symbol table entry
+ * points.
+ */
+struct H5G_entry_t {
+    H5G_cache_type_t type;              /*type of information cached         */
+    H5G_cache_t cache;                  /*cached data from object header     */
+    size_t      name_off;               /*offset of name within name heap    */
+    haddr_t     header;                 /*file address of object header      */
+};
+
+/*
+ * A symbol table node is a collection of symbol table entries.  It can
+ * be thought of as the lowest level of the B-link tree that points to
+ * a collection of symbol table entries that belong to a specific symbol
+ * table or group.
+ */
+typedef struct H5G_node_t {
+    H5AC_info_t cache_info;     /* Information for H5AC cache functions, _must_ be */
+                                /* first field in structure */
+    size_t node_size;           /* Size of node on disk              */
+    unsigned nsyms;             /* Number of symbols                 */
+    H5G_entry_t *entry;         /* Array of symbol table entries     */
+} H5G_node_t;
+
+/*
+ * Shared information for all open group objects
+ */
+struct H5G_shared_t {
+    int fo_count;                   /* open file object count */
+    hbool_t mounted;                /* Group is mount point */
+};
+
+/*
+ * A group handle passed around through layers of the library within and
+ * above the H5G layer.
+ */
+struct H5G_t {
+    H5G_shared_t *shared;               /* Shared file object data */
+    H5O_loc_t oloc;                     /* Object location for group */
+    H5G_name_t path;                    /* Group hierarchy path   */
+};
+
+/* Link iteration operator for internal library callbacks */
+typedef herr_t (*H5G_lib_iterate_t)(const H5O_link_t *lnk, void *op_data);
+
+/* Data structure to hold table of links for a group */
+typedef struct {
+    size_t      nlinks;         /* # of links in table */
+    H5O_link_t *lnks;           /* Pointer to array of links */
+} H5G_link_table_t;
+
+/*
+ * Common data exchange structure for symbol table nodes.  This structure is
+ * passed through the B-link tree layer to the methods for the objects
+ * to which the B-link tree points.
+ *
+ * It's also used for B-tree iterators which require no additional info.
+ *
+ */
+typedef struct H5G_bt_common_t {
+    /* downward */
+    const char  *name;                  /*points to temporary memory         */
+    H5HL_t *heap;                       /*symbol table heap		     */
+} H5G_bt_common_t;
+
+/*
+ * Data exchange structure for symbol table nodes.  This structure is
+ * passed through the B-link tree layer to the insert method for entries.
+ */
+typedef struct H5G_bt_ins_t {
+    /* downward */
+    H5G_bt_common_t common;             /* Common info for B-tree user data (must be first) */
+    const H5O_link_t *lnk;              /* Link to insert into table         */
+    H5O_type_t obj_type;                /* Type of object being inserted */
+    const void *crt_info;               /* Creation info for object being inserted */
+} H5G_bt_ins_t;
+
+/*
+ * Data exchange structure for symbol table nodes.  This structure is
+ * passed through the B-link tree layer to the remove method for entries.
+ */
+typedef struct H5G_bt_rm_t {
+    /* downward */
+    H5G_bt_common_t common;         /* Common info for B-tree user data (must be first) */
+    H5RS_str_t *grp_full_path_r;    /* Full path of group where link is removed */
+} H5G_bt_rm_t;
+
+/* Typedef for B-tree 'find' operation */
+typedef herr_t (*H5G_bt_find_op_t)(const H5G_entry_t *ent/*in*/, void *operator_data/*in,out*/);
+
+/*
+ * Data exchange structure for symbol table nodes.  This structure is
+ * passed through the B-link tree layer to the 'find' method for entries.
+ */
+typedef struct H5G_bt_lkp_t {
+    /* downward */
+    H5G_bt_common_t common;         /* Common info for B-tree user data (must be first) */
+    H5G_bt_find_op_t op;            /* Operator to call when correct entry is found */
+    void *op_data;                  /* Data to pass to operator */
+
+    /* upward */
+} H5G_bt_lkp_t;
+
+/*
+ * Data exchange structure to pass through the B-tree layer for the
+ * H5B_iterate function.
+ */
+typedef struct H5G_bt_it_it_t {
+    /* downward */
+    H5HL_t      *heap;          /*symbol table heap 			     */
+    hsize_t	skip;		/*initial entries to skip		     */
+    H5G_lib_iterate_t op;	/*iteration operator			     */
+    void	*op_data;	/*user-defined operator data		     */
+
+    /* upward */
+    hsize_t	*final_ent;	/*final entry looked at                      */
+} H5G_bt_it_it_t;
+
+/* Data passed through B-tree iteration for copying copy symbol table content */
+typedef struct H5G_bt_it_cpy_t {
+    const H5O_loc_t *src_oloc;  /* Source object location */
+    haddr_t     src_heap_addr;  /* Heap address of the source symbol table  */
+    H5F_t       *dst_file;      /* File of destination group */
+    const H5O_stab_t *dst_stab; /* Symbol table message for destination group */
+    H5O_copy_t  *cpy_info;      /* Information for copy operation */
+} H5G_bt_it_cpy_t;
+
+/* Common information for "by index" lookups in symbol tables */
+typedef struct H5G_bt_it_idx_common_t {
+    /* downward */
+    hsize_t     idx;            /* Index of group member to be queried */
+    hsize_t     num_objs;       /* The number of objects having been traversed */
+    H5G_bt_find_op_t op;        /* Operator to call when correct entry is found */
+} H5G_bt_it_idx_common_t;
+
+/* Data passed through B-tree iteration for building a table of the links */
+typedef struct H5G_bt_it_bt_t {
+    /* downward */
+    size_t alloc_nlinks;        /* Number of links allocated in table */
+    H5HL_t *heap;               /* Symbol table heap */
+
+    /* upward */
+    H5G_link_table_t *ltable;   /* Link table to add information to */
+} H5G_bt_it_bt_t;
+
+/* Typedefs for "new format" groups */
+/* (fractal heap & v2 B-tree info) */
+
+/* Typedef for native 'name' field index records in the v2 B-tree */
+/* (Keep 'id' field first so generic record handling in callbacks works) */
+typedef struct H5G_dense_bt2_name_rec_t {
+    uint8_t id[H5G_DENSE_FHEAP_ID_LEN]; /* Heap ID for link */
+    uint32_t hash;                      /* Hash of 'name' field value */
+} H5G_dense_bt2_name_rec_t;
+
+/* Typedef for native 'creation order' field index records in the v2 B-tree */
+/* (Keep 'id' field first so generic record handling in callbacks works) */
+typedef struct H5G_dense_bt2_corder_rec_t {
+    uint8_t id[H5G_DENSE_FHEAP_ID_LEN]; /* Heap ID for link */
+    int64_t corder;                     /* 'creation order' field value */
+} H5G_dense_bt2_corder_rec_t;
+
+/*
+ * Common data exchange structure for dense link storage.  This structure is
+ * passed through the v2 B-tree layer to the methods for the objects
+ * to which the v2 B-tree points.
+ */
+typedef struct H5G_bt2_ud_common_t {
+    /* downward */
+    H5F_t       *f;                     /* Pointer to file that fractal heap is in */
+    hid_t       dxpl_id;                /* DXPL for operation                */
+    H5HF_t      *fheap;                 /* Fractal heap handle               */
+    const char  *name;                  /* Name of link to compare           */
+    uint32_t    name_hash;              /* Hash of name of link to compare   */
+    int64_t     corder;                 /* Creation order value of link to compare   */
+    H5B2_found_t found_op;              /* Callback when correct link is found */
+    void        *found_op_data;         /* Callback data when correct link is found */
+} H5G_bt2_ud_common_t;
+
+/*
+ * Data exchange structure for dense link storage.  This structure is
+ * passed through the v2 B-tree layer when inserting links.
+ */
+typedef struct H5G_bt2_ud_ins_t {
+    /* downward */
+    H5G_bt2_ud_common_t common;         /* Common info for B-tree user data (must be first) */
+    uint8_t id[H5G_DENSE_FHEAP_ID_LEN]; /* Heap ID of link to insert         */
+} H5G_bt2_ud_ins_t;
+
+/* Typedef for group creation operation */
+typedef struct H5G_obj_create_t{
+    hid_t gcpl_id;              /* Group creation property list */
+    H5G_cache_type_t cache_type; /* Type of symbol table entry cache */
+    H5G_cache_t cache;          /* Cached data for symbol table entry */
+} H5G_obj_create_t;
+
+/* Callback information for copying groups */
+typedef struct H5G_copy_file_ud_t {
+    H5O_copy_file_ud_common_t common;   /* Shared information (must be first) */
+    H5G_cache_type_t cache_type;        /* Type of symbol table entry cache */
+    H5G_cache_t cache;                  /* Cached data for symbol table entry */
+} H5G_copy_file_ud_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/*
+ * This is the class identifier to give to the B-tree functions.
+ */
+H5_DLLVAR H5B_class_t H5B_SNODE[1];
+
+/* The cache subclass */
+H5_DLLVAR const H5AC_class_t H5AC_SNODE[1];
+
+/* The v2 B-tree class for indexing 'name' field on links */
+H5_DLLVAR const H5B2_class_t H5G_BT2_NAME[1];
+
+/* The v2 B-tree class for indexing 'creation order' field on links */
+H5_DLLVAR const H5B2_class_t H5G_BT2_CORDER[1];
+
+/* Free list for managing H5G_t structs */
+H5FL_EXTERN(H5G_t);
+
+/* Free list for managing H5G_shared_t structs */
+H5FL_EXTERN(H5G_shared_t);
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/*
+ * General group routines
+ */
+H5_DLL H5G_t *H5G__create(H5F_t *file, H5G_obj_create_t *gcrt_info,
+    hid_t dxpl_id);
+H5_DLL H5G_t *H5G__create_named(const H5G_loc_t *loc, const char *name,
+    hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id);
+H5_DLL H5G_t *H5G__open_name(const H5G_loc_t *loc, const char *name,
+    hid_t gapl_id, hid_t dxpl_id);
+
+/*
+ * Group hierarchy traversal routines
+ */
+H5_DLL herr_t H5G__traverse_special(const H5G_loc_t *grp_loc,
+    const H5O_link_t *lnk, unsigned target, size_t *nlinks, hbool_t last_comp,
+    H5G_loc_t *obj_loc, hbool_t *obj_exists, hid_t lapl_id, hid_t dxpl_id);
+
+/*
+ * Utility functions
+ */
+H5_DLL herr_t H5G__init(void);
+H5_DLL herr_t H5G__term_deprec_interface(void);
+H5_DLL const char *H5G__component(const char *name, size_t *size_p);
+
+/*
+ * Functions that understand symbol tables but not names.  The
+ * functions that understand names are exported to the rest of
+ * the library and appear in H5Gprivate.h.
+ */
+H5_DLL herr_t H5G__stab_create(H5O_loc_t *grp_oloc, hid_t dxpl_id,
+    const H5O_ginfo_t *ginfo, H5O_stab_t *stab);
+H5_DLL herr_t H5G__stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name,
+    H5O_link_t *obj_lnk, H5O_type_t obj_type, const void *crt_info,
+    hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab,
+    const char *name, H5O_link_t *obj_lnk, H5O_type_t obj_type,
+    const void *crt_info, hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_delete(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab);
+H5_DLL herr_t H5G__stab_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, H5_iter_order_t order,
+    hsize_t skip, hsize_t *last_lnk, H5G_lib_iterate_t op, void *op_data);
+H5_DLL herr_t H5G__stab_count(struct H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_bh_size(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab,
+    H5_ih_info_t *bh_info);
+H5_DLL ssize_t H5G__stab_get_name_by_idx(const H5O_loc_t *oloc, H5_iter_order_t order,
+    hsize_t n, char* name, size_t size, hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_remove(const H5O_loc_t *oloc, hid_t dxpl_id,
+    H5RS_str_t *grp_full_path_r, const char *name);
+H5_DLL herr_t H5G__stab_remove_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    H5RS_str_t *grp_full_path_r, H5_iter_order_t order, hsize_t n);
+H5_DLL herr_t H5G__stab_lookup(const H5O_loc_t *grp_oloc, const char *name,
+    H5O_link_t *lnk, hid_t dxpl_id);
+H5_DLL herr_t H5G__stab_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_iter_order_t order,
+    hsize_t n, H5O_link_t *lnk, hid_t dxpl_id);
+#ifndef H5_STRICT_FORMAT_CHECKS
+H5_DLL herr_t H5G__stab_valid(H5O_loc_t *grp_oloc, hid_t dxpl_id,
+    H5O_stab_t *alt_stab);
+#endif /* H5_STRICT_FORMAT_CHECKS */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL H5G_obj_t H5G__stab_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx,
+    hid_t dxpl_id);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+
+/*
+ * Functions that understand symbol table entries.
+ */
+H5_DLL void H5G__ent_copy(H5G_entry_t *dst, const H5G_entry_t *src,
+            H5_copy_depth_t depth);
+H5_DLL void H5G__ent_reset(H5G_entry_t *ent);
+H5_DLL herr_t H5G__ent_decode_vec(const H5F_t *f, const uint8_t **pp,
+				  H5G_entry_t *ent, unsigned n);
+H5_DLL herr_t H5G__ent_encode_vec(const H5F_t *f, uint8_t **pp,
+				  const H5G_entry_t *ent, unsigned n);
+H5_DLL herr_t H5G__ent_convert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap,
+    const char *name, const H5O_link_t *lnk, H5O_type_t obj_type,
+    const void *crt_info, H5G_entry_t *ent);
+H5_DLL herr_t H5G__ent_debug(const H5G_entry_t *ent, FILE * stream, int indent,
+    int fwidth, const H5HL_t *heap);
+
+/* Functions that understand symbol table nodes */
+H5_DLL herr_t H5G__node_init(H5F_t *f);
+H5_DLL int H5G__node_iterate(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+		     const void *_rt_key, void *_udata);
+H5_DLL int H5G__node_sumup(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+		     const void *_rt_key, void *_udata);
+H5_DLL int H5G__node_by_idx(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+		     const void *_rt_key, void *_udata);
+H5_DLL int H5G__node_copy(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+		     const void *_rt_key, void *_udata);
+H5_DLL int H5G__node_build_table(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+		     const void *_rt_key, void *_udata);
+H5_DLL herr_t H5G__node_iterate_size(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr,
+                     const void *_rt_key, void *_udata);
+H5_DLL herr_t H5G__node_free(H5G_node_t *sym);
+
+/* Functions that understand links in groups */
+H5_DLL herr_t H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap,
+    const H5G_entry_t *ent, const char *name);
+H5_DLL herr_t H5G__link_to_loc(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc);
+H5_DLL herr_t H5G__link_sort_table(H5G_link_table_t *ltable, H5_index_t idx_type,
+    H5_iter_order_t order);
+H5_DLL herr_t H5G__link_iterate_table(const H5G_link_table_t *ltable,
+    hsize_t skip, hsize_t *last_lnk, const H5G_lib_iterate_t op, void *op_data);
+H5_DLL herr_t H5G__link_release_table(H5G_link_table_t *ltable);
+H5_DLL herr_t H5G__link_name_replace(H5F_t *file, hid_t dxpl_id,
+    H5RS_str_t *grp_full_path_r, const H5O_link_t *lnk);
+
+/* Functions that understand "compact" link storage */
+H5_DLL herr_t H5G__compact_insert(const H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk,
+    hid_t dxpl_id);
+H5_DLL ssize_t H5G__compact_get_name_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t idx, char *name, size_t size);
+H5_DLL herr_t H5G__compact_remove(const H5O_loc_t *oloc, hid_t dxpl_id,
+    H5RS_str_t *grp_full_path_r, const char *name);
+H5_DLL herr_t H5G__compact_remove_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5RS_str_t *grp_full_path_r, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n);
+H5_DLL herr_t H5G__compact_iterate(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t skip, hsize_t *last_lnk, H5G_lib_iterate_t op, void *op_data);
+H5_DLL htri_t H5G__compact_lookup(const H5O_loc_t *grp_oloc, const char *name,
+    H5O_link_t *lnk, hid_t dxpl_id);
+H5_DLL herr_t H5G__compact_lookup_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t n, H5O_link_t *lnk);
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL H5G_obj_t H5G__compact_get_type_by_idx(H5O_loc_t *oloc, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, hsize_t idx);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/* Functions that understand "dense" link storage */
+H5_DLL herr_t H5G__dense_build_table(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, H5G_link_table_t *ltable);
+H5_DLL herr_t H5G__dense_create(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
+    const H5O_pline_t *pline);
+H5_DLL herr_t H5G__dense_insert(H5F_t *f, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, const H5O_link_t *lnk);
+H5_DLL htri_t H5G__dense_lookup(H5F_t *f, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, const char *name, H5O_link_t *lnk);
+H5_DLL herr_t H5G__dense_lookup_by_idx(H5F_t *f, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t n, H5O_link_t *lnk);
+H5_DLL herr_t H5G__dense_iterate(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    H5G_lib_iterate_t op, void *op_data);
+H5_DLL ssize_t H5G__dense_get_name_by_idx(H5F_t  *f, hid_t dxpl_id,
+    H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    char *name, size_t size);
+H5_DLL herr_t H5G__dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
+    H5RS_str_t *grp_full_path_r, const char *name);
+H5_DLL herr_t H5G__dense_remove_by_idx(H5F_t *f, hid_t dxpl_id,
+    const H5O_linfo_t *linfo, H5RS_str_t *grp_full_path_r, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n);
+H5_DLL herr_t H5G__dense_delete(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
+    hbool_t adj_link);
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL H5G_obj_t H5G__dense_get_type_by_idx(H5F_t  *f, hid_t dxpl_id,
+    H5O_linfo_t *linfo, hsize_t idx);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/* Functions that understand group objects */
+H5_DLL herr_t H5G__obj_create(H5F_t *f, hid_t dxpl_id,
+    H5G_obj_create_t *gcrt_info, H5O_loc_t *oloc/*out*/);
+H5_DLL herr_t H5G__obj_create_real(H5F_t *f, hid_t dxpl_id,
+    const H5O_ginfo_t *ginfo, const H5O_linfo_t *linfo,
+    const H5O_pline_t *pline, H5G_obj_create_t *gcrt_info,
+    H5O_loc_t *oloc/*out*/);
+H5_DLL htri_t H5G__obj_get_linfo(const H5O_loc_t *grp_oloc, H5O_linfo_t *linfo,
+    hid_t dxpl_id);
+H5_DLL herr_t H5G__obj_iterate(const H5O_loc_t *grp_oloc,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    H5G_lib_iterate_t op, void *op_data, hid_t dxpl_id);
+H5_DLL herr_t H5G__obj_info(H5O_loc_t *oloc, H5G_info_t *grp_info, hid_t dxpl_id);
+H5_DLL htri_t H5G__obj_lookup(const H5O_loc_t *grp_oloc, const char *name,
+    H5O_link_t *lnk, hid_t dxpl_id);
+
+/*
+ * These functions operate on group hierarchy names.
+ */
+H5_DLL herr_t H5G__name_init(H5G_name_t *name, const char *path);
+
+/*
+ * These functions operate on group "locations"
+ */
+H5_DLL herr_t H5G__loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth);
+H5_DLL herr_t H5G__loc_insert(H5G_loc_t *grp_loc, const char *name,
+    H5G_loc_t *obj_loc, H5O_type_t obj_type, const void *crt_info, hid_t dxpl_id);
+
+/* Testing functions */
+#ifdef H5G_TESTING
+H5_DLL htri_t H5G__is_empty_test(hid_t gid);
+H5_DLL htri_t H5G__has_links_test(hid_t gid, unsigned *nmsgs);
+H5_DLL htri_t H5G__has_stab_test(hid_t gid);
+H5_DLL htri_t H5G__is_new_dense_test(hid_t gid);
+H5_DLL herr_t H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count);
+H5_DLL herr_t H5G__lheap_size_test(hid_t gid, size_t *lheap_size);
+H5_DLL herr_t H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsigned *user_path_hidden);
+H5_DLL herr_t H5G__verify_cached_stab_test(H5O_loc_t *grp_oloc, H5G_entry_t *ent);
+H5_DLL herr_t H5G__verify_cached_stabs_test(hid_t gid);
+#endif /* H5G_TESTING */
+
+#endif /* _H5Gpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gprivate.h b/gatb-core/thirdparty/hdf5/src/H5Gprivate.h
new file mode 100644
index 0000000..50f8bda
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gprivate.h
@@ -0,0 +1,307 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Gprivate.h
+ *                      Jul 11 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Library-visible declarations.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5Gprivate_H
+#define _H5Gprivate_H
+
+/* Include package's public header */
+#include "H5Gpublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bprivate.h"		/* B-trees				*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5RSprivate.h"        /* Reference-counted strings            */
+
+/*
+ * Define this to enable debugging.
+ */
+#ifdef NDEBUG
+#  undef H5G_DEBUG
+#endif
+
+/*
+ * The disk size for a symbol table entry...
+ */
+#define H5G_SIZEOF_SCRATCH      16
+#define H5G_SIZEOF_ENTRY(F)                                                   \
+   (H5F_SIZEOF_SIZE(F) +        /*offset of name into heap              */    \
+    H5F_SIZEOF_ADDR(F) +        /*address of object header              */    \
+    4 +                         /*entry type                            */    \
+    4 +				/*reserved				*/    \
+    H5G_SIZEOF_SCRATCH)         /*scratch pad space                     */
+
+/* ========= Group Creation properties ============ */
+
+/* Defaults for link info values */
+#define H5G_CRT_LINFO_TRACK_CORDER              FALSE
+#define H5G_CRT_LINFO_INDEX_CORDER              FALSE
+#define H5G_CRT_LINFO_NLINKS                    0
+#define H5G_CRT_LINFO_MAX_CORDER                0
+#define H5G_CRT_LINFO_LINK_FHEAP_ADDR           HADDR_UNDEF
+#define H5G_CRT_LINFO_NAME_BT2_ADDR             HADDR_UNDEF
+#define H5G_CRT_LINFO_CORDER_BT2_ADDR           HADDR_UNDEF
+
+/* Definitions for link info settings */
+#define H5G_CRT_LINK_INFO_NAME                  "link info"
+#define H5G_CRT_LINK_INFO_SIZE                  sizeof(H5O_linfo_t)
+#define H5G_CRT_LINK_INFO_DEF                   {H5G_CRT_LINFO_TRACK_CORDER, \
+                                                    H5G_CRT_LINFO_INDEX_CORDER, \
+                                                    H5G_CRT_LINFO_MAX_CORDER, \
+                                                    H5G_CRT_LINFO_CORDER_BT2_ADDR, \
+                                                    H5G_CRT_LINFO_NLINKS, \
+                                                    H5G_CRT_LINFO_LINK_FHEAP_ADDR, \
+                                                    H5G_CRT_LINFO_NAME_BT2_ADDR \
+                                                }
+
+/* Defaults for group info values */
+#define H5G_CRT_GINFO_LHEAP_SIZE_HINT           0
+#define H5G_CRT_GINFO_STORE_LINK_PHASE_CHANGE   FALSE
+#define H5G_CRT_GINFO_MAX_COMPACT               8
+#define H5G_CRT_GINFO_MIN_DENSE                 6
+#define H5G_CRT_GINFO_STORE_EST_ENTRY_INFO      FALSE
+#define H5G_CRT_GINFO_EST_NUM_ENTRIES           4
+#define H5G_CRT_GINFO_EST_NAME_LEN              8
+
+/* Definitions for group info settings */
+#define H5G_CRT_GROUP_INFO_NAME                 "group info"
+#define H5G_CRT_GROUP_INFO_SIZE                 sizeof(H5O_ginfo_t)
+#define H5G_CRT_GROUP_INFO_DEF                  {H5G_CRT_GINFO_LHEAP_SIZE_HINT, \
+                                                    H5G_CRT_GINFO_STORE_LINK_PHASE_CHANGE, \
+                                                    H5G_CRT_GINFO_MAX_COMPACT, \
+                                                    H5G_CRT_GINFO_MIN_DENSE, \
+                                                    H5G_CRT_GINFO_STORE_EST_ENTRY_INFO, \
+                                                    H5G_CRT_GINFO_EST_NUM_ENTRIES, \
+                                                    H5G_CRT_GINFO_EST_NAME_LEN \
+                                                }
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5G_PACKAGE
+#define H5G_MOUNTED(G)              ((G)->shared->mounted)
+#else /* H5G_PACKAGE */
+#define H5G_MOUNTED(G)              (H5G_mounted(G))
+#endif /* H5G_PACKAGE */
+
+/*
+ * During name lookups (see H5G_traverse()) we sometimes want information about
+ * a symbolic link or a mount point.  The normal operation is to follow the
+ * symbolic link or mount point and return information about its target.
+ */
+#define H5G_TARGET_NORMAL	0x0000
+#define H5G_TARGET_SLINK	0x0001
+#define H5G_TARGET_MOUNT	0x0002
+#define H5G_TARGET_UDLINK	0x0004
+#define H5G_TARGET_EXISTS	0x0008
+#define H5G_CRT_INTMD_GROUP	0x0010
+
+/* Type of operation being performed for call to H5G_name_replace() */
+typedef enum {
+    H5G_NAME_MOVE = 0,          /* H5*move call    */
+    H5G_NAME_DELETE,            /* H5Ldelete call  */
+    H5G_NAME_MOUNT,             /* H5Fmount call   */
+    H5G_NAME_UNMOUNT            /* H5Funmount call */
+} H5G_names_op_t;
+
+/* Status returned from traversal callbacks; whether the object location
+ * or group location need to be closed */
+#define H5G_OWN_NONE 0
+#define H5G_OWN_OBJ_LOC 1
+#define H5G_OWN_GRP_LOC 2
+#define H5G_OWN_BOTH 3
+typedef int H5G_own_loc_t;
+
+/* Structure to store information about the name an object was opened with */
+typedef struct {
+    H5RS_str_t  *full_path_r;           /* Path to object, as seen from root of current file mounting hierarchy */
+    H5RS_str_t  *user_path_r;           /* Path to object, as opened by user */
+    unsigned    obj_hidden;             /* Whether the object is visible in group hier. */
+} H5G_name_t;
+
+/* Forward declarations (for prototypes & struct definitions) */
+struct H5O_loc_t;
+struct H5O_link_t;
+
+/*
+ * The "location" of an object in a group hierarchy.  This points to an object
+ * location and a group hierarchy path for the object.
+ */
+typedef struct {
+    struct H5O_loc_t *oloc;             /* Object header location            */
+    H5G_name_t *path;                   /* Group hierarchy path              */
+} H5G_loc_t;
+
+/* Typedef for path traversal operations */
+/* grp_loc is the location of the group in which the targeted object is located.
+ * name is the last component of the object's name
+ * lnk is the link between the group and the object
+ * obj_loc is the target of the traversal (or NULL if the object doesn't exist)
+ * operator_data is whatever udata was supplied when H5G_traverse was called
+ * own_loc should be set to H5G_OWN_OBJ_LOC if this callback takes ownership of obj_loc,
+ * H5G_OWN_GRP_LOC if it takes ownership of grp_loc, and H5G_OWN_NONE if obj_loc and
+ * grp_loc need to be deleted.
+ */
+typedef herr_t (*H5G_traverse_t)(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const struct H5O_link_t *lnk/*in*/, H5G_loc_t *obj_loc/*out*/, void *operator_data/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+
+/* Describe kind of callback to make for each link */
+typedef enum H5G_link_iterate_op_type_t {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    H5G_LINK_OP_OLD,                /* "Old" application callback */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    H5G_LINK_OP_NEW                 /* "New" application callback */
+} H5G_link_iterate_op_type_t;
+
+typedef struct {
+    H5G_link_iterate_op_type_t op_type;
+    union {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        H5G_iterate_t op_old;           /* "Old" application callback for each link */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+        H5L_iterate_t op_new;           /* "New" application callback for each link */
+    } op_func;
+} H5G_link_iterate_t;
+
+typedef struct H5G_t H5G_t;
+typedef struct H5G_shared_t H5G_shared_t;
+typedef struct H5G_entry_t H5G_entry_t;
+
+/*
+ * Library prototypes...  These are the ones that other packages routinely
+ * call.
+ */
+H5_DLL struct H5O_loc_t *H5G_oloc(H5G_t *grp);
+H5_DLL H5G_name_t * H5G_nameof(H5G_t *grp);
+H5_DLL H5F_t *H5G_fileof(H5G_t *grp);
+H5_DLL H5G_t *H5G_open(const H5G_loc_t *loc, hid_t dxpl_id);
+H5_DLL herr_t H5G_close(H5G_t *grp);
+H5_DLL herr_t H5G_get_shared_count(H5G_t *grp);
+H5_DLL herr_t H5G_mount(H5G_t *grp);
+H5_DLL hbool_t H5G_mounted(H5G_t *grp);
+H5_DLL herr_t H5G_unmount(H5G_t *grp);
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL H5G_obj_t H5G_map_obj_type(H5O_type_t obj_type);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/*
+ * Utility functions
+ */
+H5_DLL char *H5G_normalize(const char *name);
+
+/*
+ * Group hierarchy traversal routines
+ */
+H5_DLL herr_t H5G_traverse(const H5G_loc_t *loc, const char *name,
+    unsigned target, H5G_traverse_t op, void *op_data, hid_t lapl_id,
+    hid_t dxpl_id);
+H5_DLL herr_t H5G_iterate(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
+    const H5G_link_iterate_t *lnk_op, void *op_data, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5G_visit(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, H5L_iterate_t op, void *op_data,
+    hid_t lapl_id, hid_t dxpl_id);
+
+/* 
+ * Functions that understand links in groups
+ */
+H5_DLL herr_t H5G_link_to_info(const struct H5O_link_t *lnk, H5L_info_t *linfo);
+
+/*
+ * Functions that understand group objects
+ */
+H5_DLL herr_t H5G_obj_insert(const struct H5O_loc_t *grp_oloc, const char *name,
+    struct H5O_link_t *obj_lnk, hbool_t adj_link, H5O_type_t obj_type,
+    const void *crt_info, hid_t dxpl_id);
+H5_DLL ssize_t H5G_obj_get_name_by_idx(const struct H5O_loc_t *oloc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, char* name, size_t size, hid_t dxpl_id);
+H5_DLL herr_t H5G_obj_remove(const struct H5O_loc_t *oloc, H5RS_str_t *grp_full_path_r,
+    const char *name, hid_t dxpl_id);
+H5_DLL herr_t H5G_obj_remove_by_idx(const struct H5O_loc_t *grp_oloc, H5RS_str_t *grp_full_path_r,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t dxpl_id);
+H5_DLL herr_t H5G_obj_lookup_by_idx(const struct H5O_loc_t *grp_oloc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, struct H5O_link_t *lnk, hid_t dxpl_id);
+H5_DLL hid_t H5G_get_create_plist(H5G_t *grp);
+
+/*
+ * These functions operate on symbol table nodes.
+ */
+H5_DLL herr_t H5G_node_close(const H5F_t *f);
+H5_DLL herr_t H5G_node_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
+			      int indent, int fwidth, haddr_t heap);
+
+/*
+ * These functions operate on group object locations.
+ */
+H5_DLL herr_t H5G_ent_encode(const H5F_t *f, uint8_t **pp, const H5G_entry_t *ent);
+H5_DLL herr_t H5G_ent_decode(const H5F_t *f, const uint8_t **pp, H5G_entry_t *ent);
+
+/*
+ * These functions operate on group hierarchy names.
+ */
+H5_DLL herr_t H5G_name_set(const H5G_name_t *loc, H5G_name_t *obj, const char *name);
+H5_DLL herr_t H5G_name_replace(const struct H5O_link_t *lnk, H5G_names_op_t op,
+    H5F_t *src_file, H5RS_str_t *src_full_path_r, H5F_t *dst_file,
+    H5RS_str_t *dst_full_path_r, hid_t dxpl_id);
+H5_DLL herr_t H5G_name_reset(H5G_name_t *name);
+H5_DLL herr_t H5G_name_copy(H5G_name_t *dst, const H5G_name_t *src, H5_copy_depth_t depth);
+H5_DLL herr_t H5G_name_free(H5G_name_t *name);
+H5_DLL ssize_t H5G_get_name(const H5G_loc_t *loc, char *name/*out*/, size_t size,
+    hbool_t *cached, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL ssize_t H5G_get_name_by_addr(hid_t fid, hid_t lapl_id, hid_t dxpl_id,
+    const struct H5O_loc_t *loc, char* name, size_t size);
+H5_DLL H5RS_str_t *H5G_build_fullpath_refstr_str(H5RS_str_t *path_r, const char *name);
+
+/*
+ * These functions operate on group "locations"
+ */
+H5_DLL herr_t H5G_loc(hid_t loc_id, H5G_loc_t *loc);
+H5_DLL herr_t H5G_loc_find(const H5G_loc_t *loc, const char *name,
+    H5G_loc_t *obj_loc/*out*/, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5G_loc_find_by_idx(H5G_loc_t *loc, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    H5G_loc_t *obj_loc/*out*/, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL htri_t H5G_loc_exists(const H5G_loc_t *loc, const char *name,
+    hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5G_loc_info(H5G_loc_t *loc, const char *name,
+    hbool_t want_ih_info, H5O_info_t *oinfo/*out*/, hid_t lapl_id,
+    hid_t dxpl_id);
+H5_DLL herr_t H5G_loc_set_comment(H5G_loc_t *loc, const char *name,
+    const char *comment, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL ssize_t H5G_loc_get_comment(H5G_loc_t *loc, const char *name,
+    char *comment/*out*/, size_t bufsize, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5G_loc_reset(H5G_loc_t *loc);
+H5_DLL herr_t H5G_loc_free(H5G_loc_t *loc);
+
+/*
+ * These functions operate on the root group
+ */
+H5_DLL herr_t H5G_mkroot(H5F_t *f, hid_t dxpl_id, hbool_t create_root);
+H5_DLL herr_t H5G_root_loc(H5F_t *f, H5G_loc_t *loc);
+H5_DLL herr_t H5G_root_free(H5G_t *grp);
+H5_DLL H5G_t *H5G_rootof(H5F_t *f);
+
+#endif /* _H5Gprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gpublic.h b/gatb-core/thirdparty/hdf5/src/H5Gpublic.h
new file mode 100644
index 0000000..5b8b054
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gpublic.h
@@ -0,0 +1,178 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Gpublic.h
+ *                      Jul 11 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public declarations for the H5G package
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Gpublic_H
+#define _H5Gpublic_H
+
+/* System headers needed by this file */
+#include <sys/types.h>
+
+/* Public headers needed by this file */
+#include "H5public.h"		/* Generic Functions			*/
+#include "H5Lpublic.h"		/* Links                                */
+#include "H5Opublic.h"		/* Object headers			*/
+#include "H5Tpublic.h"		/* Datatypes				*/
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/* Types of link storage for groups */
+typedef enum H5G_storage_type_t {
+    H5G_STORAGE_TYPE_UNKNOWN = -1,	/* Unknown link storage type	*/
+    H5G_STORAGE_TYPE_SYMBOL_TABLE,      /* Links in group are stored with a "symbol table" */
+                                        /* (this is sometimes called "old-style" groups) */
+    H5G_STORAGE_TYPE_COMPACT,		/* Links are stored in object header */
+    H5G_STORAGE_TYPE_DENSE 		/* Links are stored in fractal heap & indexed with v2 B-tree */
+} H5G_storage_type_t;
+
+/* Information struct for group (for H5Gget_info/H5Gget_info_by_name/H5Gget_info_by_idx) */
+typedef struct H5G_info_t {
+    H5G_storage_type_t 	storage_type;	/* Type of storage for links in group */
+    hsize_t 	nlinks;		        /* Number of links in group */
+    int64_t     max_corder;             /* Current max. creation order value for group */
+    hbool_t     mounted;                /* Whether group has a file mounted on it */
+} H5G_info_t;
+
+/********************/
+/* Public Variables */
+/********************/
+
+
+/*********************/
+/* Public Prototypes */
+/*********************/
+H5_DLL hid_t H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id,
+    hid_t gcpl_id, hid_t gapl_id);
+H5_DLL hid_t H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id);
+H5_DLL hid_t H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id);
+H5_DLL hid_t H5Gget_create_plist(hid_t group_id);
+H5_DLL herr_t H5Gget_info(hid_t loc_id, H5G_info_t *ginfo);
+H5_DLL herr_t H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *ginfo,
+    hid_t lapl_id);
+H5_DLL herr_t H5Gget_info_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo,
+    hid_t lapl_id);
+H5_DLL herr_t H5Gclose(hid_t group_id);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+/* Link definitions */
+#define H5G_SAME_LOC H5L_SAME_LOC
+#define H5G_LINK_ERROR H5L_TYPE_ERROR
+#define H5G_LINK_HARD H5L_TYPE_HARD
+#define H5G_LINK_SOFT H5L_TYPE_SOFT
+#define H5G_link_t H5L_type_t
+
+/* Macros for types of objects in a group (see H5G_obj_t definition) */
+#define H5G_NTYPES	256		/* Max possible number of types	*/
+#define H5G_NLIBTYPES	8		/* Number of internal types	*/
+#define H5G_NUSERTYPES	(H5G_NTYPES - H5G_NLIBTYPES)
+#define H5G_USERTYPE(X)	(8 + (X))	/* User defined types		*/
+
+
+/* Typedefs */
+
+/*
+ * An object has a certain type. The first few numbers are reserved for use
+ * internally by HDF5. Users may add their own types with higher values.  The
+ * values are never stored in the file -- they only exist while an
+ * application is running.  An object may satisfy the `isa' function for more
+ * than one type.
+ */
+typedef enum H5G_obj_t {
+    H5G_UNKNOWN = -1,		/* Unknown object type		*/
+    H5G_GROUP,		        /* Object is a group		*/
+    H5G_DATASET,		/* Object is a dataset		*/
+    H5G_TYPE,			/* Object is a named data type	*/
+    H5G_LINK,		        /* Object is a symbolic link	*/
+    H5G_UDLINK,		        /* Object is a user-defined link */
+    H5G_RESERVED_5,		/* Reserved for future use	*/
+    H5G_RESERVED_6,		/* Reserved for future use	*/
+    H5G_RESERVED_7		/* Reserved for future use	*/
+} H5G_obj_t;
+
+/* Prototype for H5Giterate() operator */
+typedef herr_t (*H5G_iterate_t)(hid_t group, const char *name, void *op_data);
+
+/* Information about an object */
+typedef struct H5G_stat_t {
+    unsigned long 	fileno[2];	/*file number			*/
+    unsigned long 	objno[2];	/*object number			*/
+    unsigned 		nlink;		/*number of hard links to object*/
+    H5G_obj_t 		type;		/*basic object type		*/
+    time_t		mtime;		/*modification time		*/
+    size_t		linklen;	/*symbolic link value length	*/
+    H5O_stat_t          ohdr;           /* Object header information    */
+} H5G_stat_t;
+
+
+/* Function prototypes */
+H5_DLL hid_t H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint);
+H5_DLL hid_t H5Gopen1(hid_t loc_id, const char *name);
+H5_DLL herr_t H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name,
+    const char *new_name);
+H5_DLL herr_t H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
+    hid_t new_loc_id, const char *new_name);
+H5_DLL herr_t H5Gmove(hid_t src_loc_id, const char *src_name,
+    const char *dst_name);
+H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name);
+H5_DLL herr_t H5Gunlink(hid_t loc_id, const char *name);
+H5_DLL herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size,
+    char *buf/*out*/);
+H5_DLL herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment);
+H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize,
+    char *buf);
+H5_DLL herr_t H5Giterate(hid_t loc_id, const char *name, int *idx,
+        H5G_iterate_t op, void *op_data);
+H5_DLL herr_t H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs);
+H5_DLL herr_t H5Gget_objinfo(hid_t loc_id, const char *name,
+    hbool_t follow_link, H5G_stat_t *statbuf/*out*/);
+H5_DLL ssize_t H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char* name,
+    size_t size);
+H5_DLL H5G_obj_t H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Gpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Groot.c b/gatb-core/thirdparty/hdf5/src/H5Groot.c
new file mode 100644
index 0000000..5ec9d3a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Groot.c
@@ -0,0 +1,414 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Groot.c
+ *			Apr  8 2009
+ *			Neil Fortner <nfortne2 at hdfgroup.org>
+ *
+ * Purpose:		Functions for operating on the root group.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property Lists			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_rootof
+ *
+ * Purpose:	Return a pointer to the root group of the file.  If the file
+ *		is part of a virtual file then the root group of the virtual
+ *		file is returned.
+ *
+ * Return:	Success:	Ptr to the root group of the file.  Do not
+ *				free the pointer -- it points directly into
+ *				the file struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, October 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_t *
+H5G_rootof(H5F_t *f)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Walk to top of mounted files */
+    while(f->parent)
+        f = f->parent;
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->root_grp);
+
+    /* Check to see if the root group was opened through a different
+    * "top" file, and switch it to point at the current "top" file.
+    */
+    if(f->shared->root_grp->oloc.file != f)
+        f->shared->root_grp->oloc.file = f;
+
+    FUNC_LEAVE_NOAPI(f->shared->root_grp)
+} /* end H5G_rootof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_mkroot
+ *
+ * Purpose:	Creates a root group in an empty file and opens it.  If a
+ *		root group is already open then this function immediately
+ *		returns.   If ENT is non-null then it's the symbol table
+ *		entry for an existing group which will be opened as the root
+ *		group.  Otherwise a new root group is created and then
+ *		opened.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 11 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_mkroot(H5F_t *f, hid_t dxpl_id, hbool_t create_root)
+{
+    H5G_loc_t   root_loc;               /* Root location information */
+    H5G_obj_create_t gcrt_info;         /* Root group object creation info */
+    htri_t      stab_exists = -1;       /* Whether the symbol table exists */
+    hbool_t     sblock_dirty = FALSE;   /* Whether superblock was dirtied */
+    hbool_t     path_init = FALSE;      /* Whether path was initialized */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    /* Check if the root group is already initialized */
+    if(f->shared->root_grp)
+        HGOTO_DONE(SUCCEED)
+
+    /* Create information needed for group nodes */
+    if(H5G__node_init(f) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group node info")
+
+    /*
+     * Create the group pointer
+     */
+    if(NULL == (f->shared->root_grp = H5FL_CALLOC(H5G_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    if(NULL == (f->shared->root_grp->shared = H5FL_CALLOC(H5G_shared_t))) {
+        f->shared->root_grp = H5FL_FREE(H5G_t, f->shared->root_grp);
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    } /* end if */
+
+    /* Initialize the root_loc structure to point to fields in the newly created
+     * f->shared->root_grp structure */
+    root_loc.oloc = &(f->shared->root_grp->oloc);
+    root_loc.path = &(f->shared->root_grp->path);
+    H5G_loc_reset(&root_loc);
+
+    /*
+     * If there is no root object then create one. The root group always starts
+     * with a hard link count of one since it's pointed to by the superblock.
+     */
+    if(create_root) {
+        /* Create root group */
+        /* (Pass the FCPL which is a sub-class of the group creation property class) */
+        gcrt_info.gcpl_id = f->shared->fcpl_id;
+        gcrt_info.cache_type = H5G_NOTHING_CACHED;
+	if(H5G__obj_create(f, dxpl_id, &gcrt_info, root_loc.oloc/*out*/) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group entry")
+	if(1 != H5O_link(root_loc.oloc, 1, dxpl_id))
+	    HGOTO_ERROR(H5E_SYM, H5E_LINKCOUNT, FAIL, "internal error (wrong link count)")
+
+        /* Decrement refcount on root group's object header in memory */
+        if(H5O_dec_rc_by_loc(root_loc.oloc, dxpl_id) < 0)
+           HGOTO_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "unable to decrement refcount on root group's object header")
+
+        /* Mark superblock dirty, so root group info is flushed */
+        sblock_dirty = TRUE;
+
+        /* Create the root group symbol table entry */
+        HDassert(!f->shared->sblock->root_ent);
+        if(f->shared->sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+            /* Allocate space for the root group symbol table entry */
+            if(NULL == (f->shared->sblock->root_ent = (H5G_entry_t *)H5MM_calloc(sizeof(H5G_entry_t))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't allocate space for symbol table entry")
+
+            /* Initialize the root group symbol table entry */
+            f->shared->sblock->root_ent->type = gcrt_info.cache_type;
+            if(gcrt_info.cache_type != H5G_NOTHING_CACHED)
+                f->shared->sblock->root_ent->cache = gcrt_info.cache;
+            f->shared->sblock->root_ent->name_off = 0;  /* No name (yet) */
+            f->shared->sblock->root_ent->header = root_loc.oloc->addr;
+        } /* end if */
+    } /* end if */
+    else {
+        /* Create root group object location from f */
+        root_loc.oloc->addr = f->shared->sblock->root_addr;
+        root_loc.oloc->file = f;
+
+	/*
+	 * Open the root object as a group.
+	 */
+	if(H5O_open(root_loc.oloc) < 0)
+	    HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open root group")
+
+        /* Actions to take if the symbol table information is cached */
+        if(f->shared->sblock->root_ent && f->shared->sblock->root_ent->type == H5G_CACHED_STAB) {
+            /* Check for the situation where the symbol table is cached but does
+             * not exist.  This can happen if, for example, an external link is
+             * added to the root group. */
+            if((stab_exists = H5O_msg_exists(root_loc.oloc, H5O_STAB_ID, dxpl_id)) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check if symbol table message exists")
+
+            /* Remove the cache if the stab does not exist */
+            if(!stab_exists)
+                f->shared->sblock->root_ent->type = H5G_NOTHING_CACHED;
+#ifndef H5_STRICT_FORMAT_CHECKS
+            /* If symbol table information is cached, check if we should replace the
+            * symbol table message with the cached symbol table information */
+            else if(H5F_INTENT(f) & H5F_ACC_RDWR) {
+                H5O_stab_t      cached_stab;
+
+                /* Retrieve the cached symbol table information */
+                cached_stab.btree_addr = f->shared->sblock->root_ent->cache.stab.btree_addr;
+                cached_stab.heap_addr = f->shared->sblock->root_ent->cache.stab.heap_addr;
+
+                /* Check if the symbol table message is valid, and replace with the
+                * cached symbol table if necessary */
+                if(H5G__stab_valid(root_loc.oloc, dxpl_id, &cached_stab) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to verify symbol table")
+            } /* end if */
+#endif /* H5_STRICT_FORMAT_CHECKS */
+        } /* end if */
+    } /* end else */
+
+    /* Cache the root group's symbol table information in the root group symbol
+     * table entry.  It will have been allocated by now if it needs to be
+     * present, so we don't need to check the superblock version.  We do this if
+     * we have write access, the root entry has been allocated (i.e.
+     * super_vers < 2) and the stab info is not already cached. */
+    if((H5F_INTENT(f) & H5F_ACC_RDWR) && stab_exists != FALSE && f->shared->sblock->root_ent
+            && f->shared->sblock->root_ent->type != H5G_CACHED_STAB) {
+        H5O_stab_t      stab;           /* Symbol table */
+
+        /* Check if the stab message exists.  It's possible for the root group
+         * to use the latest version while the superblock is an old version.
+         * If stab_exists is not -1 then we have already checked. */
+        if(stab_exists == -1 && (stab_exists = H5O_msg_exists(root_loc.oloc, H5O_STAB_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't check if symbol table message exists")
+
+        if(stab_exists) {
+            /* Read the root group's symbol table message */
+            if(NULL == H5O_msg_read(root_loc.oloc, H5O_STAB_ID, &stab, dxpl_id))
+                HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "unable to read symbol table message")
+
+            /* Update the root group symbol table entry */
+            f->shared->sblock->root_ent->type = H5G_CACHED_STAB;
+            f->shared->sblock->root_ent->cache.stab.btree_addr = stab.btree_addr;
+            f->shared->sblock->root_ent->cache.stab.heap_addr = stab.heap_addr;
+
+            /* Mark superblock dirty, so root group info is flushed */
+            sblock_dirty = TRUE;
+        } /* end if */
+    } /* end if */
+
+    /* Create the path names for the root group's entry */
+    H5G__name_init(root_loc.path, "/");
+    path_init = TRUE;
+
+    f->shared->root_grp->shared->fo_count = 1;
+    /* The only other open object should be the superblock extension, if it
+     * exists.  Don't count either the superblock extension or the root group
+     * in the number of open objects in the file.
+     */
+    HDassert((1 == f->nopen_objs) ||
+            (2 == f->nopen_objs && HADDR_UNDEF != f->shared->sblock->ext_addr));
+    f->nopen_objs--;
+
+done:
+    /* In case of error, free various memory locations that may have been
+     * allocated */
+    if(ret_value < 0) {
+        if(f->shared->root_grp) {
+            if(path_init)
+                H5G_name_free(root_loc.path);
+            if(f->shared->root_grp->shared)
+                f->shared->root_grp->shared = H5FL_FREE(H5G_shared_t, f->shared->root_grp->shared);
+            f->shared->root_grp = H5FL_FREE(H5G_t, f->shared->root_grp);
+        } /* end if */
+        if(f->shared->sblock)
+            f->shared->sblock->root_ent = (H5G_entry_t *)H5MM_xfree(f->shared->sblock->root_ent);
+    } /* end if */
+
+    /* Mark superblock dirty in cache, if necessary */
+    if(sblock_dirty)
+        if(H5AC_mark_entry_dirty(f->shared->sblock) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_mkroot() */
+
+

+/*-------------------------------------------------------------------------
+* Function:    H5G_root_free
+*
+* Purpose:	Free memory used by an H5G_t struct (and its H5G_shared_t).
+*		Does not close the group or decrement the reference count.
+*		Used to free memory used by the root group.
+*
+* Return:	Success:    Non-negative
+*		Failure:    Negative
+*
+* Programmer:	James Laird
+*		Tuesday, September 7, 2004
+*
+*-------------------------------------------------------------------------
+*/
+herr_t
+H5G_root_free(H5G_t *grp)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(grp && grp->shared);
+    HDassert(grp->shared->fo_count > 0);
+
+    /* Free the path */
+    H5G_name_free(&(grp->path));
+
+    grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
+    grp = H5FL_FREE(H5G_t, grp);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_root_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_root_loc
+ *
+ * Purpose:	Construct a "group location" for the root group of a file
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  5 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_root_loc(H5F_t *f, H5G_loc_t *loc)
+{
+    H5G_t *root_grp;                    /* Pointer to root group's info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(loc);
+
+    /* Retrieve the root group for the file */
+    root_grp = H5G_rootof(f);
+    HDassert(root_grp);
+
+    /* Build the group location for the root group */
+    if(NULL == (loc->oloc = H5G_oloc(root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+    if(NULL == (loc->path = H5G_nameof(root_grp)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+    /* Patch up root group's object location to reflect this file */
+    /* (Since the root group info is only stored once for files which
+     *  share an underlying low-level file)
+     */
+    /* (but only for non-mounted files) */
+    if(!H5F_is_mount(f)) {
+        loc->oloc->file = f;
+        loc->oloc->holding_file = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_root_loc() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gstab.c b/gatb-core/thirdparty/hdf5/src/H5Gstab.c
new file mode 100644
index 0000000..446d940
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gstab.c
@@ -0,0 +1,1228 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: Robb Matzke <matzke at llnl.gov>
+ *	       Friday, September 19, 1997
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for finding link information from B-tree */
+typedef struct {
+    /* downward */
+    const char *name;           /* Name to search for */
+    H5HL_t *heap;               /* Local heap for group */
+
+    /* upward */
+    H5O_link_t *lnk;            /* Caller's link location */
+} H5G_stab_fnd_ud_t;
+
+/* Data passed through B-tree iteration for looking up a name by index */
+typedef struct H5G_bt_it_gnbi_t {
+    /* downward */
+    H5G_bt_it_idx_common_t common; /* Common information for "by index" lookup  */
+    H5HL_t *heap;               /*symbol table heap 			     */
+
+    /* upward */
+    char         *name;         /*member name to be returned                 */
+} H5G_bt_it_gnbi_t;
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+/* Data passed through B-tree iteration for looking up a type by index */
+typedef struct H5G_bt_it_gtbi_t {
+    /* downward */
+    H5G_bt_it_idx_common_t common; /* Common information for "by index" lookup  */
+    H5F_t       *f;             /* Pointer to file that symbol table is in */
+    hid_t       dxpl_id;        /* DXPL for operation */
+
+    /* upward */
+    H5G_obj_t    type;          /*member type to be returned                 */
+} H5G_bt_it_gtbi_t;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/* Data passed through B-tree iteration for looking up a link by index */
+typedef struct H5G_bt_it_lbi_t {
+    /* downward */
+    H5G_bt_it_idx_common_t common; /* Common information for "by index" lookup  */
+    H5HL_t *heap;               /*symbol table heap 			     */
+
+    /* upward */
+    H5O_link_t *lnk;            /*link to be returned                        */
+    hbool_t     found;      	/*whether we found the link                  */
+} H5G_bt_it_lbi_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_create_components
+ *
+ * Purpose:	Creates the components for a new, empty, symbol table (name heap
+ *		and B-tree).  The caller can specify an initial size for the
+ *		name heap.
+ *
+ *		In order for the B-tree to operate correctly, the first
+ *		item in the heap is the empty string, and must appear at
+ *		heap offset zero.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Nov  7 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t dxpl_id)
+{
+    H5HL_t *heap = NULL;            /* Pointer to local heap */
+    size_t name_offset;	            /* Offset of "" name */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(stab);
+    HDassert(size_hint > 0);
+
+    /* Create the B-tree */
+    if(H5B_create(f, dxpl_id, H5B_SNODE, NULL, &(stab->btree_addr)/*out*/) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create B-tree")
+
+    /* Create symbol table private heap */
+    if(H5HL_create(f, dxpl_id, size_hint, &(stab->heap_addr)/*out*/) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create heap")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Insert name into the heap */
+    if((size_t)(-1) == (name_offset = H5HL_insert(f, dxpl_id, heap, (size_t)1, "")))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "can't insert name into heap")
+
+    /*
+     * B-tree's won't work if the first name isn't at the beginning
+     * of the heap.
+     */
+    HDassert(0 == name_offset);
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_create_components() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_create
+ *
+ * Purpose:	Creates a new empty symbol table (object header, name heap,
+ *		and B-tree).  The caller can specify an initial size for the
+ *		name heap.  The object header of the group is opened for
+ *		write access.
+ *
+ *		In order for the B-tree to operate correctly, the first
+ *		item in the heap is the empty string, and must appear at
+ *		heap offset zero.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  1 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_create(H5O_loc_t *grp_oloc, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
+    H5O_stab_t *stab)
+{
+    size_t      heap_hint;              /* Local heap size hint */
+    size_t      size_hint;              /* Local heap size hint */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(grp_oloc);
+    HDassert(stab);
+
+    /* Adjust the size hint, if necessary */
+    if(ginfo->lheap_size_hint == 0)
+        heap_hint = 8 +         /* "null" name inserted for B-tree */
+                (ginfo->est_num_entries * H5HL_ALIGN(ginfo->est_name_len + 1)) +    /* estimated size of names for links, aligned for inserting into local heap */
+                H5HL_SIZEOF_FREE(grp_oloc->file);       /* Free list entry in local heap */
+    else
+        heap_hint = ginfo->lheap_size_hint;
+    size_hint = MAX(heap_hint, H5HL_SIZEOF_FREE(grp_oloc->file) + 2);
+
+    /* Go create the B-tree & local heap */
+    if(H5G__stab_create_components(grp_oloc->file, stab, size_hint, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create symbol table components")
+
+    /*
+     * Insert the symbol table message into the object header and the symbol
+     * table entry.
+     */
+    if(H5O_msg_create(grp_oloc, H5O_STAB_ID, 0, H5O_UPDATE_TIME, stab, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_insert_real
+ *
+ * Purpose:	Insert a new symbol into a table.
+ *		The name of the new symbol is NAME and its symbol
+ *		table entry is OBJ_LNK.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at uiuc.edu
+ *		Nov  7 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name,
+    H5O_link_t *obj_lnk, H5O_type_t obj_type, const void *crt_info,
+    hid_t dxpl_id)
+{
+    H5HL_t       *heap = NULL;          /* Pointer to local heap */
+    H5G_bt_ins_t udata;		        /* Data to pass through B-tree	*/
+    herr_t       ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(stab);
+    HDassert(name && *name);
+    HDassert(obj_lnk);
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Initialize data to pass through B-tree */
+    udata.common.name = name;
+    udata.common.heap = heap;
+    udata.lnk = obj_lnk;
+    udata.obj_type = obj_type;
+    udata.crt_info = crt_info;
+
+    /* Insert into symbol table */
+    if(H5B_insert(f, dxpl_id, H5B_SNODE, stab->btree_addr, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert entry")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_insert_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_insert
+ *
+ * Purpose:	Insert a new symbol into the table described by GRP_ENT in
+ *		file F.	 The name of the new symbol is NAME and its symbol
+ *		table entry is OBJ_ENT.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  1 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name,
+    H5O_link_t *obj_lnk, H5O_type_t obj_type, const void *crt_info,
+    hid_t dxpl_id)
+{
+    H5O_stab_t		stab;		/* Symbol table message		*/
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(name && *name);
+    HDassert(obj_lnk);
+
+    /* Retrieve symbol table message */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
+
+    if(H5G__stab_insert_real(grp_oloc->file, &stab, name, obj_lnk, obj_type,
+            crt_info, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_remove
+ *
+ * Purpose:	Remove NAME from a symbol table.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, September 17, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_remove(const H5O_loc_t *loc, hid_t dxpl_id, H5RS_str_t *grp_full_path_r,
+    const char *name)
+{
+    H5HL_t      *heap = NULL;           /* Pointer to local heap */
+    H5O_stab_t	stab;		        /*symbol table message		*/
+    H5G_bt_rm_t	udata;		        /*data to pass through B-tree	*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(loc && loc->file);
+    HDassert(name && *name);
+
+    /* Read in symbol table message */
+    if(NULL == H5O_msg_read(loc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(loc->file, dxpl_id, stab.heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Initialize data to pass through B-tree */
+    udata.common.name = name;
+    udata.common.heap = heap;
+    udata.grp_full_path_r = grp_full_path_r;
+
+    /* Remove from symbol table */
+    if(H5B_remove(loc->file, dxpl_id, H5B_SNODE, stab.btree_addr, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to remove entry")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_remove_by_idx
+ *
+ * Purpose:	Remove NAME from a symbol table, according to the name index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, November 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_remove_by_idx(const H5O_loc_t *grp_oloc, hid_t dxpl_id, H5RS_str_t *grp_full_path_r,
+    H5_iter_order_t order, hsize_t n)
+{
+    H5HL_t      *heap = NULL;           /* Pointer to local heap */
+    H5O_stab_t	stab;		        /* Symbol table message		*/
+    H5G_bt_rm_t udata;		        /* Data to pass through B-tree	*/
+    H5O_link_t  obj_lnk;                /* Object's link within group */
+    hbool_t     lnk_copied = FALSE;     /* Whether the link was copied */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(grp_oloc && grp_oloc->file);
+
+    /* Look up name of link to remove, by index */
+    if(H5G__stab_lookup_by_idx(grp_oloc, order, n, &obj_lnk, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get link information")
+    lnk_copied = TRUE;
+
+    /* Read in symbol table message */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Initialize data to pass through B-tree */
+    udata.common.name = obj_lnk.name;
+    udata.common.heap = heap;
+    udata.grp_full_path_r = grp_full_path_r;
+
+    /* Remove link from symbol table */
+    if(H5B_remove(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to remove entry")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    /* Reset the link information, if we have a copy */
+    if(lnk_copied)
+        H5O_msg_reset(H5O_LINK_ID, &obj_lnk);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_delete
+ *
+ * Purpose:	Delete entire symbol table information from file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_delete(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab)
+{
+    H5HL_t *heap = NULL;                /* Pointer to local heap */
+    H5G_bt_rm_t	udata;		        /*data to pass through B-tree	*/
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(f);
+    HDassert(stab);
+    HDassert(H5F_addr_defined(stab->btree_addr));
+    HDassert(H5F_addr_defined(stab->heap_addr));
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Set up user data for B-tree deletion */
+    udata.common.name = NULL;
+    udata.common.heap = heap;
+
+    /* Delete entire B-tree */
+    if(H5B_delete(f, dxpl_id, H5B_SNODE, stab->btree_addr, &udata) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete symbol table B-tree")
+
+    /* Release resources */
+    if(H5HL_unprotect(heap) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+    heap = NULL;
+
+    /* Delete local heap for names */
+    if(H5HL_delete(f, dxpl_id, stab->heap_addr) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete symbol table heap")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_iterate
+ *
+ * Purpose:	Iterate over the objects in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October  3, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, H5_iter_order_t order,
+    hsize_t skip, hsize_t *last_lnk, H5G_lib_iterate_t op, void *op_data)
+{
+    H5HL_t *heap = NULL;                        /* Local heap for group */
+    H5O_stab_t stab;		                /* Info about symbol table */
+    H5G_link_table_t ltable = {0, NULL};        /* Link table */
+    herr_t ret_value;                           /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(op);
+
+    /* Get the B-tree info */
+    if(NULL == H5O_msg_read(oloc, H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Check on iteration order */
+    /* ("native" iteration order is increasing for this link storage mechanism) */
+    if(order != H5_ITER_DEC) {
+        H5G_bt_it_it_t	udata;                  /* User data to pass to B-tree callback */
+
+        /* Build udata to pass through H5B_iterate() to H5G__node_iterate() */
+        udata.heap = heap;
+        udata.skip = skip;
+        udata.final_ent = last_lnk;
+        udata.op = op;
+        udata.op_data = op_data;
+
+        /* Iterate over the group members */
+        if((ret_value = H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_iterate, &udata)) < 0)
+            HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+
+        /* Check for too high of a starting index (ex post facto :-) */
+        /* (Skipping exactly as many entries as are in the group is currently an error) */
+        if(skip > 0 && skip >= *last_lnk)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+    } /* end if */
+    else {
+        H5G_bt_it_bt_t udata;                   /* User data to pass to B-tree callback */
+
+        /* Build udata to pass through H5B_iterate() to H5G__node_build_table() */
+        udata.alloc_nlinks = 0;
+        udata.heap = heap;
+        udata.ltable = <able;
+
+        /* Iterate over the group members */
+        if(H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_build_table, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to build link table")
+
+        /* Check for skipping out of bounds */
+        if(skip > 0 && (size_t)skip >= ltable.nlinks)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "index out of bound")
+
+        /* Sort link table in correct iteration order */
+        if(H5G__link_sort_table(&ltable, H5_INDEX_NAME, order) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTSORT, FAIL, "error sorting link messages")
+
+        /* Iterate over links in table */
+        if((ret_value = H5G__link_iterate_table(&ltable, skip, last_lnk, op, op_data)) < 0)
+            HERROR(H5E_SYM, H5E_CANTNEXT, "iteration operator failed");
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+    if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_count
+ *
+ * Purpose:	Count the # of links in a group
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September  6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_count(H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id)
+{
+    H5O_stab_t		stab;		        /* Info about symbol table */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+    HDassert(num_objs);
+
+    /* Reset the number of objects in the group */
+    *num_objs = 0;
+
+    /* Get the B-tree info */
+    if(NULL == H5O_msg_read(oloc, H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
+
+    /* Iterate over the group members */
+    if(H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_sumup, num_objs) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_bh_size
+ *
+ * Purpose:	Retrieve storage for btree and heap (1.6)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *		June 25 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_bh_size(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab,
+    H5_ih_info_t *bh_info)
+{
+    hsize_t     snode_size;             /* Symbol table node size */
+    H5B_info_t  bt_info;                /* B-tree node info */
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(stab);
+    HDassert(bh_info);
+
+    /* Set up user data for B-tree iteration */
+    snode_size = 0;
+
+    /* Get the B-tree & symbol table node size info */
+    if(H5B_get_info(f, dxpl_id, H5B_SNODE, stab->btree_addr, &bt_info, H5G__node_iterate_size, &snode_size) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+    /* Add symbol table & B-tree node sizes to index info */
+    bh_info->index_size += snode_size + bt_info.size;
+
+    /* Get the size of the local heap for the group */
+    if(H5HL_heapsize(f, dxpl_id, stab->heap_addr, &(bh_info->heap_size)) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_bh_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_stab_get_name_by_idx_cb
+ *
+ * Purpose:     Callback for B-tree iteration 'by index' info query to
+ *              retrieve the name of a link
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_stab_get_name_by_idx_cb(const H5G_entry_t *ent, void *_udata)
+{
+    H5G_bt_it_gnbi_t	*udata = (H5G_bt_it_gnbi_t *)_udata;
+    size_t name_off;                    /* Offset of name in heap */
+    const char *name;                   /* Pointer to name string in heap */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ent);
+    HDassert(udata && udata->heap);
+
+    /* Get name offset in heap */
+    name_off = ent->name_off;
+    name = (const char *)H5HL_offset_into(udata->heap, name_off);
+    HDassert(name);
+    udata->name = H5MM_strdup(name);
+    HDassert(udata->name);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_stab_get_name_by_idx_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_get_name_by_idx
+ *
+ * Purpose:     Returns the name of objects in the group by giving index.
+ *
+ * Return:	Success:        Non-negative, length of name
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5G__stab_get_name_by_idx(const H5O_loc_t *oloc, H5_iter_order_t order, hsize_t n,
+    char* name, size_t size, hid_t dxpl_id)
+{
+    H5HL_t *heap = NULL;        /* Pointer to local heap */
+    H5O_stab_t	stab;	        /* Info about local heap & B-tree */
+    H5G_bt_it_gnbi_t udata;     /* Iteration information */
+    hbool_t udata_valid = FALSE;        /* Whether iteration information is valid */
+    ssize_t ret_value;          /* Return value */
+
+    /* Portably clear udata struct (before FUNC_ENTER) */
+    HDmemset(&udata, 0, sizeof(udata));
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /* Get the B-tree & local heap info */
+    if(NULL == H5O_msg_read(oloc, H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Remap index for decreasing iteration order */
+    if(order == H5_ITER_DEC) {
+        hsize_t nlinks = 0;           /* Number of links in group */
+
+        /* Iterate over the symbol table nodes, to count the links */
+        if(H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_sumup, &nlinks) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+        /* Map decreasing iteration order index to increasing iteration order index */
+        n = nlinks - (n + 1);
+    } /* end if */
+
+    /* Set iteration information */
+    udata.common.idx = n;
+    udata.common.num_objs = 0;
+    udata.common.op = H5G_stab_get_name_by_idx_cb;
+    udata.heap = heap;
+    udata.name = NULL;
+    udata_valid = TRUE;
+
+    /* Iterate over the group members */
+    if(H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_by_idx, &udata) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "iteration operator failed")
+
+    /* If we don't know the name now, we almost certainly went out of bounds */
+    if(udata.name == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "index out of bound")
+
+    /* Get the length of the name */
+    ret_value = (ssize_t)HDstrlen(udata.name);
+
+    /* Copy the name into the user's buffer, if given */
+    if(name) {
+        HDstrncpy(name, udata.name, MIN((size_t)(ret_value + 1), size));
+        if((size_t)ret_value >= size)
+            name[size - 1]='\0';
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    /* Free the duplicated name */
+    if(udata_valid && udata.name != NULL)
+        H5MM_xfree(udata.name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_get_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_stab_lookup_cb
+ *
+ * Purpose:     B-tree 'find' callback to retrieve location for an object
+ *
+ * Return:	Success:        Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Sep 20, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_stab_lookup_cb(const H5G_entry_t *ent, void *_udata)
+{
+    H5G_stab_fnd_ud_t *udata = (H5G_stab_fnd_ud_t *)_udata;   /* 'User data' passed in */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check for setting link info */
+    if(udata->lnk)
+        /* Convert the entry to a link */
+        if(H5G__ent_to_link(udata->lnk, udata->heap, ent, udata->name) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, FAIL, "unable to convert symbol table entry to link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_stab_lookup_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_lookup
+ *
+ * Purpose:	Look up an object relative to a group, using symbol table
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 20 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5G__stab_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
+    hid_t dxpl_id)
+{
+    H5HL_t *heap = NULL;                /* Pointer to local heap */
+    H5G_bt_lkp_t bt_udata;              /* Data to pass through B-tree	*/
+    H5G_stab_fnd_ud_t udata;            /* 'User data' to give to callback */
+    H5O_stab_t stab;		        /* Symbol table message		*/
+    htri_t     ret_value;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(name && *name);
+    HDassert(lnk);
+
+    /* Retrieve the symbol table message for the group */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't read message")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Set up user data to pass to 'find' operation callback */
+    udata.name = name;
+    udata.lnk = lnk;
+    udata.heap = heap;
+
+    /* Set up the user data for actual B-tree find operation */
+    bt_udata.common.name = name;
+    bt_udata.common.heap = heap;
+    bt_udata.op = H5G_stab_lookup_cb;
+    bt_udata.op_data = &udata;
+
+    /* Search the B-tree */
+    if((ret_value = H5B_find(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, &bt_udata)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "not found")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_stab_lookup_by_idx_cb
+ *
+ * Purpose:     Callback for B-tree iteration 'by index' info query to
+ *              retrieve the link
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov  9, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_stab_lookup_by_idx_cb(const H5G_entry_t *ent, void *_udata)
+{
+    H5G_bt_it_lbi_t *udata = (H5G_bt_it_lbi_t *)_udata;
+    const char *name;                   /* Pointer to name string in heap */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(ent);
+    HDassert(udata && udata->heap);
+
+    /* Get a pointer to the link name */
+    name = (const char *)H5HL_offset_into(udata->heap, ent->name_off);
+    HDassert(name);
+
+    /* Convert the entry to a link */
+    if(H5G__ent_to_link(udata->lnk, udata->heap, ent, name) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, FAIL, "unable to convert symbol table entry to link")
+    udata->found = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_stab_lookup_by_idx_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_lookup_by_idx
+ *
+ * Purpose:	Look up an object in a group, according to the name index
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_iter_order_t order, hsize_t n,
+    H5O_link_t *lnk, hid_t dxpl_id)
+{
+    H5HL_t *heap = NULL;                /* Pointer to local heap */
+    H5G_bt_it_lbi_t udata;              /* Iteration information */
+    H5O_stab_t stab;		        /* Symbol table message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    HDassert(grp_oloc && grp_oloc->file);
+    HDassert(lnk);
+
+    /* Get the B-tree & local heap info */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
+
+    /* Remap index for decreasing iteration order */
+    if(order == H5_ITER_DEC) {
+        hsize_t nlinks = 0;           /* Number of links in group */
+
+        /* Iterate over the symbol table nodes, to count the links */
+        if(H5B_iterate(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_sumup, &nlinks) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+        /* Map decreasing iteration order index to increasing iteration order index */
+        n = nlinks - (n + 1);
+    } /* end if */
+
+    /* Set iteration information */
+    udata.common.idx = n;
+    udata.common.num_objs = 0;
+    udata.common.op = H5G_stab_lookup_by_idx_cb;
+    udata.heap = heap;
+    udata.lnk = lnk;
+    udata.found = FALSE;
+
+    /* Iterate over the group members */
+    if(H5B_iterate(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_by_idx, &udata) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "iteration operator failed")
+
+    /* If we didn't find the link, we almost certainly went out of bounds */
+    if(!udata.found)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "index out of bound")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_lookup_by_idx() */
+
+#ifndef H5_STRICT_FORMAT_CHECKS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_valid
+ *
+ * Purpose:	Verify that a group's symbol table message is valid.  If
+ *              provided, the addresses in alt_stab will be tried if the
+ *              addresses in the group's stab message are invalid, and
+ *              the stab message will be updated if necessary.
+ *
+ *              NOTE: This function is only called when strict format
+ *              checks are disabled.  This is so that, when strict
+ *              format checks are enabled,  errors in the symbol table
+ *              messages are not fixed by this function and are instead
+ *              reported by the library.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *		nfortne2 at hdfgroup.org
+ *		Mar 17, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__stab_valid(H5O_loc_t *grp_oloc, hid_t dxpl_id, H5O_stab_t *alt_stab)
+{
+    H5O_stab_t  stab;                   /* Current symbol table */
+    H5HL_t      *heap = NULL;           /* Pointer to local heap */
+    hbool_t     changed = FALSE;        /* Whether stab has been modified */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Read the symbol table message */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "unable to read symbol table message");
+
+    /* Check if the symbol table message's b-tree address is valid */
+    if(H5B_valid(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr) < 0) {
+        /* Address is invalid, try the b-tree address in the alternate symbol
+         * table message */
+        if(!alt_stab || H5B_valid(grp_oloc->file, dxpl_id, H5B_SNODE, alt_stab->btree_addr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to locate b-tree")
+        else {
+            /* The alternate symbol table's b-tree address is valid.  Adjust the
+             * symbol table message in the group. */
+            stab.btree_addr = alt_stab->btree_addr;
+            changed = TRUE;
+        } /* end else */
+    } /* end if */
+
+    /* Check if the symbol table message's heap address is valid */
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) {
+        /* Address is invalid, try the heap address in the alternate symbol
+         * table message */
+        if(!alt_stab || NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, alt_stab->heap_addr, H5AC_READ)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "unable to locate heap")
+        else {
+            /* The alternate symbol table's heap address is valid.  Adjust the
+             * symbol table message in the group. */
+            stab.heap_addr = alt_stab->heap_addr;
+            changed = TRUE;
+        } /* end else */
+    } /* end if */
+
+    /* Update the symbol table message and clear errors if necessary */
+    if(changed) {
+        H5E_clear_stack(NULL);
+        if(H5O_msg_write(grp_oloc, H5O_STAB_ID, 0, H5O_UPDATE_TIME | H5O_UPDATE_FORCE, &stab, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to correct symbol table message")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_valid */
+#endif /* H5_STRICT_FORMAT_CHECKS */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_stab_get_type_by_idx_cb
+ *
+ * Purpose:     Callback for B-tree iteration 'by index' info query to
+ *              retrieve the type of an object
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_stab_get_type_by_idx_cb(const H5G_entry_t *ent, void *_udata)
+{
+    H5G_bt_it_gtbi_t	*udata = (H5G_bt_it_gtbi_t *)_udata;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(ent);
+    HDassert(udata);
+
+    /* Check for a soft link */
+    switch(ent->type) {
+        case H5G_CACHED_SLINK:
+            udata->type = H5G_LINK;
+            break;
+
+        case H5G_CACHED_ERROR:
+        case H5G_NOTHING_CACHED:
+        case H5G_CACHED_STAB:
+        case H5G_NCACHED:
+        default:
+            {
+                H5O_loc_t tmp_oloc;             /* Temporary object location */
+                H5O_type_t obj_type;            /* Type of object at location */
+
+                /* Build temporary object location */
+                tmp_oloc.file = udata->f;
+                HDassert(H5F_addr_defined(ent->header));
+                tmp_oloc.addr = ent->header;
+
+                /* Get the type of the object */
+                if(H5O_obj_type(&tmp_oloc, &obj_type, udata->dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object type")
+                udata->type = H5G_map_obj_type(obj_type);
+            }
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_stab_get_type_by_idx_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__stab_get_type_by_idx
+ *
+ * Purpose:     Private function for H5Gget_objtype_by_idx.
+ *              Returns the type of objects in the group by giving index.
+ *
+ * Return:	Success:        H5G_GROUP(1), H5G_DATASET(2), H5G_TYPE(3)
+ *
+ *		Failure:	UNKNOWN
+ *
+ * Programmer:	Raymond Lu
+ *	        Nov 20, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_obj_t
+H5G__stab_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
+{
+    H5O_stab_t		stab;	        /* Info about local heap & B-tree */
+    H5G_bt_it_gtbi_t	udata;          /* User data for B-tree callback */
+    H5G_obj_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(oloc);
+
+    /* Get the B-tree & local heap info */
+    if(NULL == H5O_msg_read(oloc, H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5G_UNKNOWN, "unable to determine local heap address")
+
+    /* Set iteration information */
+    udata.common.idx = idx;
+    udata.common.num_objs = 0;
+    udata.common.op = H5G_stab_get_type_by_idx_cb;
+    udata.f = oloc->file;
+    udata.dxpl_id = dxpl_id;
+    udata.type = H5G_UNKNOWN;
+
+    /* Iterate over the group members */
+    if(H5B_iterate(oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr, H5G__node_by_idx, &udata) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "iteration operator failed")
+
+    /* If we don't know the type now, we almost certainly went out of bounds */
+    if(udata.type == H5G_UNKNOWN)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "index out of bound")
+
+    /* Set the return value */
+    ret_value = udata.type;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__stab_get_type_by_idx() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gtest.c b/gatb-core/thirdparty/hdf5/src/H5Gtest.c
new file mode 100644
index 0000000..cc89f60
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gtest.c
@@ -0,0 +1,800 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Monday, October 17, 2005
+ *
+ * Purpose:	Group testing functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5G_TESTING		/*suppress warning about H5G testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__is_empty_test
+ PURPOSE
+    Determine whether a group contains no objects
+ USAGE
+    htri_t H5G__is_empty_test(gid)
+        hid_t gid;              IN: group to check
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the group has no link messages and no symbol table message
+    and no "dense" link storage
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5G__is_empty_test(hid_t gid)
+{
+    H5G_t *grp = NULL;          /* Pointer to group */
+    htri_t msg_exists = FALSE;  /* Indicate that a header message is present */
+    htri_t linfo_exists = FALSE;/* Indicate that the 'link info' message is present */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* "New format" checks */
+
+    /* Check if the group has any link messages */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0) {
+        /* Sanity check that new group format shouldn't have old messages */
+        if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+        if(msg_exists > 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
+
+        HGOTO_DONE(FALSE)
+    } /* end if */
+
+    /* Check for a link info message */
+    if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(linfo_exists > 0) {
+        H5O_linfo_t linfo;		/* Link info message */
+
+        /* Sanity check that new group format shouldn't have old messages */
+        if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+        if(msg_exists > 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found")
+
+        /* Get the link info */
+        if(H5G__obj_get_linfo(&(grp->oloc), &linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info")
+
+        /* Check for 'dense' link storage file addresses being defined */
+        if(H5F_addr_defined(linfo.fheap_addr))
+            HGOTO_DONE(FALSE)
+        if(H5F_addr_defined(linfo.name_bt2_addr))
+            HGOTO_DONE(FALSE)
+        if(H5F_addr_defined(linfo.corder_bt2_addr))
+            HGOTO_DONE(FALSE)
+
+        /* Check for link count */
+        if(linfo.nlinks > 0)
+            HGOTO_DONE(FALSE)
+    } /* end if */
+
+    /* "Old format" checks */
+
+    /* Check if the group has a symbol table message */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0) {
+        H5O_stab_t stab;        /* Info about local heap & B-tree */
+        hsize_t nlinks;         /* Number of links in the group */
+
+        /* Sanity check that old group format shouldn't have new messages */
+        if(linfo_exists > 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found")
+        if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+        if(msg_exists > 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and group info messages found")
+
+        /* Get the B-tree & local heap info */
+        if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read symbol table message")
+
+        /* Get the count of links in the group */
+        if(H5G__stab_count(&(grp->oloc), &nlinks, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to count links")
+
+        /* Check for link count */
+        if(nlinks > 0)
+            HGOTO_DONE(FALSE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__is_empty_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__has_links_test
+ PURPOSE
+    Determine whether a group contains link messages
+ USAGE
+    htri_t H5G__has_links_test(gid)
+        hid_t gid;              IN: group to check
+        unsigned *nmsgs;        OUT: # of link messages in header
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the group has link messages and how many.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5G__has_links_test(hid_t gid, unsigned *nmsgs)
+{
+    H5G_t *grp = NULL;          /* Pointer to group */
+    htri_t msg_exists = 0;      /* Indicate that a header message is present */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Check if the group has any link messages */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists == 0)
+        HGOTO_DONE(FALSE)
+
+    /* Check if the group has a symbol table message */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
+
+    /* Check if we should retrieve the number of link messages */
+    if(nmsgs) {
+        int msg_count;     /* Number of messages of a type */
+
+        /* Check how many link messages there are */
+        if((msg_count = H5O_msg_count(&(grp->oloc), H5O_LINK_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to count link messages")
+        *nmsgs = (unsigned)msg_count;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__has_links_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__has_stab_test
+ PURPOSE
+    Determine whether a group contains a symbol table message
+ USAGE
+    htri_t H5G__has_stab_test(gid)
+        hid_t gid;              IN: group to check
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the group has a symbol table message.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5G__has_stab_test(hid_t gid)
+{
+    H5G_t *grp = NULL;          /* Pointer to group */
+    htri_t msg_exists = 0;      /* Indicate that a header message is present */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Check if the group has a symbol table message */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists == 0)
+        HGOTO_DONE(FALSE)
+
+    /* Check if the group has any link messages */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__has_stab_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__is_new_dense_test
+ PURPOSE
+    Determine whether a group is in the "new" format and dense
+ USAGE
+    htri_t H5G__is_new_dense_test(gid)
+        hid_t gid;              IN: group to check
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the group is in the "new" format for groups (link messages/
+    fractal heap+v2 B-tree) and if it is in "dense" storage form (ie. it has
+    a name B-tree index).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5G__is_new_dense_test(hid_t gid)
+{
+    H5G_t *grp = NULL;          /* Pointer to group */
+    htri_t msg_exists = 0;      /* Indicate that a header message is present */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Check if the group has a symbol table message */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0)
+        HGOTO_DONE(FALSE)
+
+    /* Check if the group has any link messages */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0)
+        HGOTO_DONE(FALSE)
+
+    /* Check if the group has link info message */
+    if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(msg_exists > 0) {
+        H5O_linfo_t linfo;		/* Link info message */
+
+        /* Get the link info */
+        if(H5G__obj_get_linfo(&(grp->oloc), &linfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info")
+
+        /* Check for 'dense' link storage file addresses being defined */
+        if(!H5F_addr_defined(linfo.fheap_addr))
+            HGOTO_DONE(FALSE)
+        if(!H5F_addr_defined(linfo.name_bt2_addr))
+            HGOTO_DONE(FALSE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__is_new_dense_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__new_dense_info_test
+ PURPOSE
+    Retrieve information about the state of the new "dense" storage for groups
+ USAGE
+    herr_t H5G__new_dense_info_test(gid, name_count, corder_count)
+        hid_t gid;              IN: group to check
+        hsize_t *name_count;    OUT: Number of links in name index
+        hsize_t *corder_count;  OUT: Number of links in creation order index
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Currently, just retrieves the number of links in each index and returns
+    them.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count)
+{
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
+    H5B2_t *bt2_corder = NULL;  /* v2 B-tree handle for creation order index */
+    H5O_linfo_t linfo;		/* Link info message */
+    H5G_t *grp = NULL;          /* Pointer to group */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Get the link info */
+    if(H5G__obj_get_linfo(&(grp->oloc), &linfo, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info")
+
+    /* Check for 'dense' link storage file addresses being defined */
+    if(!H5F_addr_defined(linfo.fheap_addr))
+        HGOTO_DONE(FAIL)
+    if(!H5F_addr_defined(linfo.name_bt2_addr))
+        HGOTO_DONE(FAIL)
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(grp->oloc.file, dxpl_id, linfo.name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Retrieve # of records in name index */
+    if(H5B2_get_nrec(bt2_name, name_count) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+
+    /* Check if there is a creation order index */
+    if(H5F_addr_defined(linfo.corder_bt2_addr)) {
+        /* Open the creation order index v2 B-tree */
+        if(NULL == (bt2_corder = H5B2_open(grp->oloc.file, dxpl_id, linfo.corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Retrieve # of records in creation order index */
+        if(H5B2_get_nrec(bt2_corder, corder_count) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
+    } /* end if */
+    else
+        *corder_count = 0;
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__new_dense_info_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__lheap_size_test
+ PURPOSE
+    Determine the size of a local heap for a group
+ USAGE
+    herr_t H5G__lheap_size_test(gid, lheap_size)
+        hid_t gid;              IN: group to check
+        size_t *lheap_size;     OUT: Size of local heap
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the size of the local heap for a group
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5G__lheap_size_test(hid_t gid, size_t *lheap_size)
+{
+    H5G_t *grp = NULL;          /* Pointer to group */
+    H5O_stab_t stab;		/* Symbol table message	*/
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Get group structure */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Make certain the group has a symbol table message */
+    if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, dxpl_id))
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read symbol table message")
+
+    /* Check the size of the local heap for the group */
+    if(H5HL_get_size(grp->oloc.file, dxpl_id, stab.heap_addr, lheap_size) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't query local heap size")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__lheap_size_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5G__user_path_test
+ PURPOSE
+    Retrieve the user path for an ID
+ USAGE
+    herr_t H5G__user_path_test(obj_id, user_path, user_path_len)
+        hid_t obj_id;           IN: ID to check
+        char *user_path;        OUT: Pointer to buffer for User path
+        size_t *user_path_len;  OUT: Size of user path
+        unsigned *obj_hidden;   OUT: Whether object is hidden
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the user path for an ID.  A zero for the length is returned in
+    the case of no user path.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsigned *obj_hidden)
+{
+    void *obj_ptr;              /* Pointer to object for ID */
+    H5G_name_t *obj_path;       /* Pointer to group hier. path for obj */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(user_path_len);
+    HDassert(obj_hidden);
+
+    /* Get pointer to object for ID */
+    if(NULL == (obj_ptr = H5I_object(obj_id)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get object for ID")
+
+    /* Get the symbol table entry */
+    switch(H5I_get_type(obj_id)) {
+        case H5I_GROUP:
+            obj_path = H5G_nameof((H5G_t *)obj_ptr);
+            break;
+
+        case H5I_DATASET:
+            obj_path = H5D_nameof((H5D_t *)obj_ptr);
+            break;
+
+        case H5I_DATATYPE:
+            /* Avoid non-named datatypes */
+            if(!H5T_is_named((H5T_t *)obj_ptr))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a named datatype")
+
+            obj_path = H5T_nameof((H5T_t *)obj_ptr);
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown data object type")
+    } /* end switch */
+    HDassert(obj_path);
+
+    /* Retrieve a copy of the user path and put it into the buffer */
+    if(obj_path->user_path_r) {
+        ssize_t len = H5RS_len(obj_path->user_path_r);
+
+        /* Set the user path, if given */
+        if(user_path)
+            HDstrncpy(user_path, H5RS_get_str(obj_path->user_path_r), (size_t)(len + 1));
+
+        /* Set the length of the path */
+        *user_path_len = (size_t)len;
+
+        /* Set the user path hidden flag */
+        *obj_hidden = obj_path->obj_hidden;
+    } /* end if */
+    else {
+        *user_path_len = 0;
+        *obj_hidden = 0;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5G__user_path_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__verify_cached_stab_test
+ *
+ * Purpose:     Check that a that the provided group entry contains a
+ *              cached symbol table entry, that the entry matches that in
+ *              the provided group's object header, and check that the
+ *              addresses are valid.
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Neil Fortner
+ *	        Mar  31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__verify_cached_stab_test(H5O_loc_t *grp_oloc, H5G_entry_t *ent)
+{
+    H5O_stab_t  stab;                   /* Symbol table */
+    H5HL_t      *heap = NULL;           /* Pointer to local heap */
+    hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Verify that stab info is cached in ent */
+    if(ent->type != H5G_CACHED_STAB)
+        HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "symbol table information is not cached")
+
+    /* Read the symbol table message from the group */
+    if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "unable to read symbol table message")
+
+    /* Verify that the cached symbol table info matches the symbol table message
+     * in the object header */
+    if((ent->cache.stab.btree_addr != stab.btree_addr)
+            || (ent->cache.stab.heap_addr != stab.heap_addr))
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "cached stab info does not match object header")
+
+    /* Verify that the btree address is valid */
+    if(H5B_valid(grp_oloc->file, dxpl_id, H5B_SNODE, stab.btree_addr) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "b-tree address is invalid")
+
+    /* Verify that the heap address is valid */
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "heap address is invalid")
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__verify_cached_stab_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G_verify_cached_stabs_test_cb
+ *
+ * Purpose:     Verify that all entries in this node contain cached symbol
+ *              table information if and only if the entry refers to a
+ *              group with a symbol table, and that that information is
+ *              correct.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Apr 8, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5G_verify_cached_stabs_test_cb(H5F_t *f, hid_t dxpl_id,
+    const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const void H5_ATTR_UNUSED *_rt_key,
+    void H5_ATTR_UNUSED *udata)
+{
+    H5G_node_t          *sn = NULL;
+    H5O_loc_t           targ_oloc;
+    H5O_t               *targ_oh = NULL;
+    htri_t              stab_exists;
+    H5O_stab_t          stab;
+    unsigned            i;
+    int                 ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Load the node */
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
+
+    /* Check each target object to see if its stab message (if present) matches
+     * the cached stab (if present).  If one exists, both must exist. */
+    /* Initialize constant fields in target oloc */
+    targ_oloc.file = f;
+    targ_oloc.holding_file = FALSE;
+
+    /* Iterate over entries */
+    for(i=0; i<sn->nsyms; i++) {
+        /* Update oloc address */
+        targ_oloc.addr = sn->entry[i].header;
+
+        /* Load target object header */
+        if(NULL == (targ_oh = H5O_protect(&targ_oloc, dxpl_id, H5AC_READ)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to protect target object header")
+
+        /* Check if a symbol table message exists */
+        if((stab_exists = H5O_msg_exists_oh(targ_oh, H5O_STAB_ID)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to check for STAB message")
+
+        if(stab_exists) {
+            /* Read symbol table message */
+            if(NULL == H5O_msg_read_oh(f, dxpl_id, targ_oh, H5O_STAB_ID, &stab))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to read STAB message")
+
+            /* Check if the stab matches the cached stab info */
+            if(sn->entry[i].type != H5G_CACHED_STAB)
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "STAB message is not cached in group node")
+
+            if((sn->entry[i].cache.stab.btree_addr != stab.btree_addr)
+                    || (sn->entry[i].cache.stab.heap_addr != stab.heap_addr))
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "cached symbol table information is incorrect")
+        } /* end if */
+        else if(sn->entry[i].type == H5G_CACHED_STAB)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "nonexistent STAB message is cached")
+
+        /* Unprotect target object */
+        if(H5O_unprotect(&targ_oloc, dxpl_id, targ_oh, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release object header");
+        targ_oh = NULL;
+    } /* end for */
+
+done:
+    if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
+
+    if(targ_oh) {
+        HDassert(ret_value == H5_ITER_ERROR);
+        if(H5O_unprotect(&targ_oloc, dxpl_id, targ_oh, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release object header");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_verify_cached_stabs_test_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__verify_cached_stabs_test
+ *
+ * Purpose:     If the provided group contains a symbol table, verifies
+ *              that all links in the group contain cached symbol table
+ *              information if and only if the link points to a group
+ *              with a symbol table, and that that information is correct.
+ *              If the provided group does not contain a symbol table,
+ *              does nothing.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              nfortne2 at hdfgroup.org
+ *              April 6 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__verify_cached_stabs_test(hid_t gid)
+{
+    H5G_t               *grp = NULL;            /* Group */
+    htri_t              stab_exists;
+    H5O_stab_t          stab;                   /* Symbol table message */
+    H5G_bt_common_t     udata = {NULL, NULL};   /* Dummy udata so H5B_iterate doesn't freak out */
+    hid_t               dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(gid >= 0);
+
+    /* Check args */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Check for group having a symbol table message */
+    /* Check for the group having a group info message */
+    if((stab_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID,
+            dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+
+    /* No need to check anything if the symbol table doesn't exist */
+    if(!stab_exists)
+        HGOTO_DONE(SUCCEED);
+
+    /* Read the stab */
+    if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, dxpl_id))
+        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get symbol table info")
+
+    /* Iterate over the b-tree, checking validity of cached information */
+    if((ret_value = H5B_iterate(grp->oloc.file, dxpl_id, H5B_SNODE,
+            stab.btree_addr, H5G_verify_cached_stabs_test_cb, &udata)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "iteration operator failed");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__verify_cached_stabs_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Gtraverse.c b/gatb-core/thirdparty/hdf5/src/H5Gtraverse.c
new file mode 100644
index 0000000..87d6d2b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Gtraverse.c
@@ -0,0 +1,866 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Gtraverse.c
+ *			Sep 13 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Functions for traversing group hierarchy
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"         /* Datasets                             */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Iprivate.h"		/* IDs					*/
+#include "H5Lprivate.h"		/* Links				*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppublic.h"		/* Property Lists			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for path traversal routine */
+typedef struct {
+    /* down */
+    hbool_t chk_exists;         /* Flag to indicate we are checking if object exists */
+
+    /* up */
+    H5G_loc_t *obj_loc;         /* Object location */
+    hbool_t exists;             /* Indicate if object exists */
+} H5G_trav_slink_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5G_traverse_slink_cb(H5G_loc_t *grp_loc, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5G_traverse_ud(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc/*in,out*/, unsigned target, size_t *nlinks/*in,out*/,
+    hbool_t *obj_exists, hid_t lapl_id, hid_t dxpl_id);
+static herr_t H5G_traverse_slink(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc/*in,out*/, unsigned target, size_t *nlinks/*in,out*/,
+    hbool_t *obj_exists, hid_t lapl_id, hid_t dxpl_id);
+static herr_t H5G_traverse_real(const H5G_loc_t *loc, const char *name,
+    unsigned target, size_t *nlinks, H5G_traverse_t op, void *op_data,
+    hid_t lapl_id, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_traverse_slink_cb
+ *
+ * Purpose:	Callback for soft link traversal.  This routine sets the
+ *              correct information for the object location.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_traverse_slink_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5G_trav_slink_t *udata = (H5G_trav_slink_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check for dangling soft link */
+    if(obj_loc == NULL) {
+        if(udata->chk_exists)
+            udata->exists = FALSE;
+        else
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "component not found")
+    } /* end if */
+    else {
+        /* Copy new location information for resolved object */
+        H5O_loc_copy(udata->obj_loc->oloc, obj_loc->oloc, H5_COPY_DEEP);
+
+        /* Indicate that the object exists */
+        udata->exists = TRUE;
+    } /* end else */
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_traverse_slink_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_traverse_link_ud
+ *
+ * Purpose:	Callback for user-defined link traversal.  Sets up a
+ *              location ID and passes it to the user traversal callback.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_traverse_ud(const H5G_loc_t *grp_loc/*in,out*/, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc/*in,out*/, unsigned target, size_t *nlinks/*in,out*/,
+    hbool_t *obj_exists, hid_t _lapl_id, hid_t dxpl_id)
+{
+    const H5L_class_t   *link_class;       /* User-defined link class */
+    hid_t               cb_return = -1;         /* The ID the user-defined callback returned */
+    H5G_loc_t           grp_loc_copy;
+    H5G_name_t          grp_path_copy;
+    H5O_loc_t           grp_oloc_copy;
+    H5G_loc_t           new_loc;                /* Group location for newly opened external object */
+    H5G_t              *grp;
+    hid_t               lapl_id = (-1);         /* LAPL local to this routine */
+    H5P_genplist_t     *lapl;                   /* LAPL with nlinks set */
+    hid_t               cur_grp = (-1);
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(grp_loc);
+    HDassert(lnk);
+    HDassert(lnk->type >= H5L_TYPE_UD_MIN);
+    HDassert(obj_loc);
+    HDassert(nlinks);
+    HDassert(_lapl_id >= 0);
+
+    /* Get the link class for this type of link. */
+    if(NULL == (link_class = H5L_find_class(lnk->type)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTREGISTERED, FAIL, "unable to get UD link class")
+
+    /* Set up location for user-defined callback.  Use a copy of our current
+     * grp_loc. */
+    grp_loc_copy.path = &grp_path_copy;
+    grp_loc_copy.oloc = &grp_oloc_copy;
+    H5G_loc_reset(&grp_loc_copy);
+    if(H5G__loc_copy(&grp_loc_copy, grp_loc, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, FAIL, "unable to copy object location")
+
+    /* Create a group ID to pass to the user-defined callback */
+    if(NULL == (grp = H5G_open(&grp_loc_copy, dxpl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+    if((cur_grp = H5I_register(H5I_GROUP, grp, FALSE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTREGISTER, FAIL, "unable to register group")
+
+    /* Check for generic default property list and use link access default if so */
+    if(_lapl_id == H5P_DEFAULT) {
+        HDassert(H5P_LINK_ACCESS_DEFAULT != -1);
+        if(NULL == (lapl = (H5P_genplist_t *)H5I_object(H5P_LINK_ACCESS_DEFAULT)))
+            HGOTO_ERROR(H5E_SYM, H5E_BADATOM, FAIL, "unable to get default property list")
+    } /* end if */
+    else {
+        /* Get the underlying property list passed in */
+        if(NULL == (lapl = (H5P_genplist_t *)H5I_object(_lapl_id)))
+            HGOTO_ERROR(H5E_SYM, H5E_BADATOM, FAIL, "unable to get property list from ID")
+    } /* end else */
+
+    /* Copy the property list passed in */
+    if((lapl_id = H5P_copy_plist(lapl, FALSE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, FAIL, "unable to copy property list")
+
+    /* Get the underlying property list copy */
+    if(NULL == (lapl = (H5P_genplist_t *)H5I_object(lapl_id)))
+        HGOTO_ERROR(H5E_SYM, H5E_BADATOM, FAIL, "unable to get property list from ID")
+
+    /* Record number of soft links left to traverse in the property list. */
+    if(H5P_set(lapl, H5L_ACS_NLINKS_NAME, nlinks) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set nlink info")
+
+    /* User-defined callback function */
+    cb_return = (link_class->trav_func)(lnk->name, cur_grp, lnk->u.ud.udata, lnk->u.ud.size, lapl_id);
+
+    /* Check for failing to locate the object */
+    if(cb_return < 0) {
+        /* Check if we just needed to know if the object exists */
+        if(target & H5G_TARGET_EXISTS) {
+            /* Clear any errors from the stack */
+            H5E_clear_stack(NULL);
+
+            /* Indicate that the object doesn't exist */
+            *obj_exists = FALSE;
+
+            /* Get out now */
+            HGOTO_DONE(SUCCEED);
+        } /* end if */
+        /* else, we really needed to open the object */
+        else
+            HGOTO_ERROR(H5E_SYM, H5E_BADATOM, FAIL, "traversal callback returned invalid ID")
+    } /* end if */
+
+    /* Get the object location information from the ID the user callback returned */
+    if(H5G_loc(cb_return, &new_loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    /* Release any previous location information for the object */
+    H5G_loc_free(obj_loc);
+
+    /* Copy new object's location information */
+    H5G__loc_copy(obj_loc, &new_loc, H5_COPY_DEEP);
+
+    /* Hold the file open until we free this object header (otherwise the
+     * object location will be invalidated when the file closes).
+     */
+    if(H5O_loc_hold_file(obj_loc->oloc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to hold file open")
+
+    /* We have a copy of the location and we're holding the file open.
+     * Close the open ID the user passed back.
+     */
+    if(H5I_dec_ref(cb_return) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close atom from UD callback")
+    cb_return = (hid_t)(-1);
+
+done:
+    /* Close location given to callback. */
+    if(cur_grp > 0 && H5I_dec_ref(cur_grp) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close atom for current location")
+
+    if(ret_value < 0 && cb_return > 0 && H5I_dec_ref(cb_return) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close atom from UD callback")
+
+    /* Close the LAPL, if we copied one */
+    if(lapl_id > 0 && H5I_dec_ref(lapl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close copied link access property list")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_traverse_ud() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_traverse_slink
+ *
+ * Purpose:	Traverses symbolic link.  The link head appears in the group
+ *		whose entry is GRP_LOC and the link tail entry is OBJ_LOC.
+ *
+ * Return:	Success:	Non-negative, OBJ_LOC will contain information
+ *				about the object to which the link points
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, April 10, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_traverse_slink(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc/*in,out*/, unsigned target, size_t *nlinks/*in,out*/,
+    hbool_t *obj_exists, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_trav_slink_t      udata;                  /* User data to pass to link traversal callback */
+    H5G_name_t          tmp_obj_path;           /* Temporary copy of object's path */
+    hbool_t             tmp_obj_path_set = FALSE;       /* Flag to indicate that tmp object path is initialized */
+    H5O_loc_t           tmp_grp_oloc;           /* Temporary copy of group entry */
+    H5G_name_t          tmp_grp_path;           /* Temporary copy of group's path */
+    H5G_loc_t           tmp_grp_loc;            /* Temporary copy of group's location */
+    hbool_t             tmp_grp_loc_set = FALSE;       /* Flag to indicate that tmp group location is initialized */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(grp_loc);
+    HDassert(lnk);
+    HDassert(lnk->type == H5L_TYPE_SOFT);
+    HDassert(nlinks);
+
+    /* Set up temporary location */
+    tmp_grp_loc.oloc = &tmp_grp_oloc;
+    tmp_grp_loc.path = &tmp_grp_path;
+
+    /* Portably initialize the temporary objects */
+    H5G_loc_reset(&tmp_grp_loc);
+    H5G_name_reset(&tmp_obj_path);
+
+    /* Clone the group location, so we can track the names properly */
+    /* ("tracking the names properly" means to ignore the effects of the
+     *  link traversal on the object's & group's paths - QAK)
+     */
+    H5G__loc_copy(&tmp_grp_loc, grp_loc, H5_COPY_DEEP);
+    tmp_grp_loc_set = TRUE;
+
+    /* Hold the object's group hier. path to restore later */
+    /* (Part of "tracking the names properly") */
+    H5G_name_copy(&tmp_obj_path, obj_loc->path, H5_COPY_SHALLOW);
+    tmp_obj_path_set = TRUE;
+
+    /* Set up user data for traversal callback */
+    udata.chk_exists = (target & H5G_TARGET_EXISTS) ? TRUE : FALSE;
+    udata.exists = FALSE;
+    udata.obj_loc = obj_loc;
+
+    /* Traverse the link */
+    if(H5G_traverse_real(&tmp_grp_loc, lnk->u.soft.name, target, nlinks, H5G_traverse_slink_cb, &udata, lapl_id, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to follow symbolic link")
+
+    /* Pass back information about whether the object exists */
+    *obj_exists = udata.exists;
+
+done:
+    /* Restore object's group hier. path */
+    if(tmp_obj_path_set) {
+        H5G_name_free(obj_loc->path);
+        H5G_name_copy(obj_loc->path, &tmp_obj_path, H5_COPY_SHALLOW);
+    } /* end if */
+
+    /* Release cloned copy of group location */
+    if(tmp_grp_loc_set)
+        H5G_loc_free(&tmp_grp_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_traverse_slink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G__traverse_special
+ *
+ * Purpose:	Handle traversing special link situations
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__traverse_special(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
+    unsigned target, size_t *nlinks, hbool_t last_comp,
+    H5G_loc_t *obj_loc, hbool_t *obj_exists, hid_t lapl_id, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(grp_loc);
+    HDassert(lnk);
+    HDassert(obj_loc);
+    HDassert(nlinks);
+
+    /*
+     * If we found a symbolic link then we should follow it.  But if this
+     * is the last component of the name and the H5G_TARGET_SLINK bit of
+     * TARGET is set then we don't follow it.
+     */
+    if(H5L_TYPE_SOFT == lnk->type &&
+            (0 == (target & H5G_TARGET_SLINK) || !last_comp)) {
+        if((*nlinks)-- <= 0)
+            HGOTO_ERROR(H5E_LINK, H5E_NLINKS, FAIL, "too many links")
+        if(H5G_traverse_slink(grp_loc, lnk, obj_loc, (target & H5G_TARGET_EXISTS), nlinks, obj_exists, lapl_id, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_TRAVERSE, FAIL, "symbolic link traversal failed")
+    } /* end if */
+
+    /*
+     * If we found a user-defined link then we should follow it.  But if this
+     * is the last component of the name and the H5G_TARGET_UDLINK bit of
+     * TARGET is set then we don't follow it.
+     */
+    if(lnk->type >= H5L_TYPE_UD_MIN &&
+            (0 == (target & H5G_TARGET_UDLINK) || !last_comp) ) {
+        if((*nlinks)-- <= 0)
+            HGOTO_ERROR(H5E_LINK, H5E_NLINKS, FAIL, "too many links")
+        if(H5G_traverse_ud(grp_loc, lnk, obj_loc, (target & H5G_TARGET_EXISTS), nlinks, obj_exists, lapl_id, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_TRAVERSE, FAIL, "user-defined link traversal failed")
+    } /* end if */
+
+    /*
+     * Resolve mount points to the mounted group.  Do not do this step if
+     * the H5G_TARGET_MOUNT bit of TARGET is set and this is the last
+     * component of the name.
+     *
+     * (If this link is a hard link, try to perform mount point traversal)
+     *
+     * (Note that the soft and external link traversal above can change
+     *  the status of the object (into a hard link), so don't use an 'else'
+     *  statement here. -QAK)
+     */
+    if(H5F_addr_defined(obj_loc->oloc->addr) &&
+            (0 == (target & H5G_TARGET_MOUNT) || !last_comp)) {
+        if(H5F_traverse_mount(obj_loc->oloc/*in,out*/) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "mount point traversal failed")
+    } /* end if */
+
+    /* If the grp_loc is the only thing holding an external file open
+     * and obj_loc is in the same file, obj_loc should also hold the
+     * file open so that closing the grp_loc doesn't close the file.
+     */
+    if(grp_loc->oloc->holding_file && grp_loc->oloc->file == obj_loc->oloc->file)
+        if(H5O_loc_hold_file(obj_loc->oloc) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to hold file open")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__traverse_special() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_traverse_real
+ *
+ * Purpose:	Internal version of path traversal routine
+ *
+ * Return:	Success:	Non-negative if name can be fully resolved.
+ *
+ *		Failure:	Negative if the name could not be fully
+ *				resolved.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 11 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_traverse_real(const H5G_loc_t *_loc, const char *name, unsigned target,
+    size_t *nlinks, H5G_traverse_t op, void *op_data, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5G_loc_t           loc;            /* Location of start object     */
+    H5O_loc_t           grp_oloc;	/* Object loc. for current group */
+    H5G_name_t		grp_path;	/* Path for current group	*/
+    H5G_loc_t           grp_loc;        /* Location of group            */
+    H5O_loc_t		obj_oloc;	/* Object found			*/
+    H5G_name_t		obj_path;	/* Path for object found	*/
+    H5G_loc_t           obj_loc;        /* Location of object           */
+    size_t		nchars;		/* component name length	*/
+    H5O_link_t          lnk;            /* Link information for object  */
+    hbool_t link_valid = FALSE;         /* Flag to indicate that the link information is valid */
+    hbool_t obj_loc_valid = FALSE;      /* Flag to indicate that the object location is valid */
+    H5G_own_loc_t own_loc = H5G_OWN_NONE; /* Enum to indicate whether callback took ownership of locations*/
+    hbool_t group_copy = FALSE;         /* Flag to indicate that the group entry is copied */
+    char                comp_buf[1024];     /* Temporary buffer for path components */
+    char                *comp;          /* Pointer to buffer for path components */
+    H5WB_t              *wb = NULL;     /* Wrapped buffer for temporary buffer */
+    hbool_t last_comp = FALSE;          /* Flag to indicate that a component is the last component in the name */
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check parameters */
+    HDassert(_loc);
+    HDassert(name);
+    HDassert(nlinks);
+    HDassert(op);
+
+    /*
+     * Where does the searching start?  For absolute names it starts at the
+     * root of the file; for relative names it starts at CWG.
+     */
+    /* Check if we need to get the root group's entry */
+    if('/' == *name) {
+        H5G_t *root_grp;         /* Temporary pointer to root group of file */
+
+        /* Look up root group for starting location */
+        root_grp = H5G_rootof(_loc->oloc->file);
+        HDassert(root_grp);
+
+        /* Set the location entry to the root group's info */
+        loc.oloc = &(root_grp->oloc);
+        loc.path = &(root_grp->path);
+    } /* end if */
+    else {
+        loc.oloc = _loc->oloc;
+        loc.path = _loc->path;
+    } /* end else */
+
+    /* Set up group & object locations */
+    grp_loc.oloc = &grp_oloc;
+    grp_loc.path = &grp_path;
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+
+#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG)
+    /* Clear group location */
+    if(H5G_loc_reset(&grp_loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to reset location")
+#endif /* H5_USING_MEMCHECKER */
+
+    /* Deep copy of the starting location to group location */
+    if(H5G__loc_copy(&grp_loc, &loc, H5_COPY_DEEP) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to copy location")
+    group_copy = TRUE;
+
+    /* Clear object location */
+    if(H5G_loc_reset(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to reset location")
+
+    /* Wrap the local buffer for serialized header info */
+    if(NULL == (wb = H5WB_wrap(comp_buf, sizeof(comp_buf))))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough  */
+    if(NULL == (comp = (char *)H5WB_actual(wb, (HDstrlen(name) + 1))))
+        HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+    /* Traverse the path */
+    while((name = H5G__component(name, &nchars)) && *name) {
+        const char *s;                  /* Temporary string pointer */
+        htri_t lookup_status;           /* Status from object lookup */
+        hbool_t obj_exists;             /* Whether the object exists */
+
+	/*
+	 * Copy the component name into a null-terminated buffer so
+	 * we can pass it down to the other symbol table functions.
+	 */
+	HDmemcpy(comp, name, nchars);
+	comp[nchars] = '\0';
+
+	/*
+	 * The special name `.' is a no-op.
+	 */
+	if('.' == comp[0] && !comp[1]) {
+	    name += nchars;
+	    continue;
+	} /* end if */
+
+        /* Check if this is the last component of the name */
+        if(!((s = H5G__component(name + nchars, NULL)) && *s))
+            last_comp = TRUE;
+
+        /* If there's valid information in the link, reset it */
+        if(link_valid) {
+            H5O_msg_reset(H5O_LINK_ID, &lnk);
+            link_valid = FALSE;
+        } /* end if */
+
+        /* Get information for object in current group */
+        if((lookup_status = H5G__obj_lookup(grp_loc.oloc, comp, &lnk/*out*/, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't look up component")
+        obj_exists = FALSE;
+
+        /* If the lookup was OK, build object location and traverse special links, etc. */
+        if(lookup_status) {
+            /* Sanity check link and indicate it's valid */
+            HDassert(lnk.type >= H5L_TYPE_HARD);
+            HDassert(!HDstrcmp(comp, lnk.name));
+            link_valid = TRUE;
+
+            /* Build object location from the link */
+            if(H5G__link_to_loc(&grp_loc, &lnk, &obj_loc) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "cannot initialize object location")
+            obj_loc_valid = TRUE;
+
+            /* Assume object exists */
+            obj_exists = TRUE;
+
+            /* Perform any special traversals that the link needs */
+            /* (soft links, user-defined links, file mounting, etc.) */
+            if(H5G__traverse_special(&grp_loc, &lnk, target, nlinks, last_comp, &obj_loc, &obj_exists, lapl_id, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_LINK, H5E_TRAVERSE, FAIL, "special link traversal failed")
+        } /* end if */
+
+        /* Check for last component in name provided */
+        if(last_comp) {
+            H5O_link_t         *cb_lnk;    /* Pointer to link info for callback */
+            H5G_loc_t          *cb_loc;    /* Pointer to object location for callback */
+
+            /* Set callback parameters appropriately, based on link being found */
+            if(lookup_status) {
+                cb_lnk = &lnk;
+                if(obj_exists)
+                    cb_loc = &obj_loc;
+                else
+                    cb_loc = NULL;
+            } /* end if */
+            else {
+                HDassert(!obj_loc_valid);
+                cb_lnk = NULL;
+                cb_loc = NULL;
+            } /* end else */
+
+            /* Call 'operator' routine */
+            if((op)(&grp_loc, comp, cb_lnk, cb_loc, op_data, &own_loc) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CALLBACK, FAIL, "traversal operator failed")
+
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+        /* Handle lookup failures now */
+        if(!lookup_status) {
+            /* If an intermediate group doesn't exist & flag is set, create the group */
+            if(target & H5G_CRT_INTMD_GROUP) {
+                const H5O_ginfo_t def_ginfo = H5G_CRT_GROUP_INFO_DEF;   /* Default group info settings */
+                const H5O_linfo_t def_linfo = H5G_CRT_LINK_INFO_DEF;    /* Default link info settings */
+                const H5O_pline_t def_pline = H5O_CRT_PIPELINE_DEF;     /* Default filter pipeline settings */
+                H5O_ginfo_t	par_ginfo;	/* Group info settings for parent group */
+                H5O_linfo_t	par_linfo;	/* Link info settings for parent group */
+                H5O_pline_t	par_pline;	/* Filter pipeline settings for parent group */
+                H5O_linfo_t	tmp_linfo;	/* Temporary link info settings */
+                htri_t          exists;         /* Whether a group or link info message exists */
+                const H5O_ginfo_t *ginfo;	/* Group info settings for new group */
+                const H5O_linfo_t *linfo;	/* Link info settings for new group */
+                const H5O_pline_t *pline;	/* Filter pipeline settings for new group */
+                H5G_obj_create_t gcrt_info;     /* Group creation info */
+
+                /* Check for the parent group having a group info message */
+                /* (OK if not found) */
+                if((exists = H5O_msg_exists(grp_loc.oloc, H5O_GINFO_ID, dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+                if(exists) {
+                    /* Get the group info for parent group */
+                    if(NULL == H5O_msg_read(grp_loc.oloc, H5O_GINFO_ID, &par_ginfo, dxpl_id))
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "group info message not present")
+
+                    /* Use parent group info settings */
+                    ginfo = &par_ginfo;
+                } /* end if */
+                else
+                    /* Use default group info settings */
+                    ginfo = &def_ginfo;
+
+                /* Check for the parent group having a link info message */
+                /* (OK if not found) */
+                /* Get the link info for parent group */
+                if((exists = H5G__obj_get_linfo(grp_loc.oloc, &par_linfo, dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+                if(exists) {
+                    /* Only keep the creation order information from the parent
+                     *  group's link info
+                     */
+                    HDmemcpy(&tmp_linfo, &def_linfo, sizeof(H5O_linfo_t));
+                    tmp_linfo.track_corder = par_linfo.track_corder;
+                    tmp_linfo.index_corder = par_linfo.index_corder;
+                    linfo = &tmp_linfo;
+                } /* end if */
+                else
+                    /* Use default link info settings */
+                    linfo = &def_linfo;
+
+                /* Check for the parent group having a filter pipeline message */
+                /* (OK if not found) */
+                if((exists = H5O_msg_exists(grp_loc.oloc, H5O_PLINE_ID, dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+                if(exists) {
+                    /* Get the filter pipeline for parent group */
+                    if(NULL == H5O_msg_read(grp_loc.oloc, H5O_PLINE_ID, &par_pline, dxpl_id))
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "filter pipeline message not present")
+
+                    /* Use parent filter pipeline settings */
+                    pline = &par_pline;
+                } /* end if */
+                else
+                    /* Use default filter pipeline settings */
+                    pline = &def_pline;
+
+                /* Create the intermediate group */
+/* XXX: Should we allow user to control the group creation params here? -QAK */
+                gcrt_info.gcpl_id = H5P_GROUP_CREATE_DEFAULT;
+                gcrt_info.cache_type = H5G_NOTHING_CACHED;
+                HDmemset(&gcrt_info.cache, 0, sizeof(gcrt_info.cache));
+                if(H5G__obj_create_real(grp_oloc.file, dxpl_id, ginfo, linfo, pline, &gcrt_info, obj_loc.oloc/*out*/) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group entry")
+
+                /* Insert new group into current group's symbol table */
+                if(H5G__loc_insert(&grp_loc, comp, &obj_loc, H5O_TYPE_GROUP, &gcrt_info, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert intermediate group")
+
+                /* Decrement refcount on intermediate group's object header in memory */
+                if(H5O_dec_rc_by_loc(obj_loc.oloc, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+
+                /* Close new group */
+                if(H5O_close(obj_loc.oloc) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
+
+                /* If the parent group was holding the file open, the
+                 * newly-created group should, as well.
+                 */
+                if(grp_loc.oloc->holding_file)
+                    if(H5O_loc_hold_file(obj_loc.oloc) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to hold file open")
+
+                /* Reset any non-default object header messages */
+                if(ginfo != &def_ginfo)
+                    /* (Casting away const OK - QAK) */
+                    if(H5O_msg_reset(H5O_GINFO_ID, (void *)ginfo) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to reset group info message")
+                if(linfo != &def_linfo)
+                    /* (Casting away const OK - QAK) */
+                    if(H5O_msg_reset(H5O_LINFO_ID, (void *)linfo) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to reset link info message")
+                if(pline != &def_pline)
+                    /* (Casting away const OK - QAK) */
+                    if(H5O_msg_reset(H5O_PLINE_ID, (void *)pline) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to reset I/O pipeline message")
+            } /* end if */
+            else
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "component not found")
+        } /* end if */
+
+	/*
+	 * Advance to the next component of the path.
+	 */
+
+        /* Transfer "ownership" of the object's information to the group object */
+        H5G_loc_free(&grp_loc);
+        H5G__loc_copy(&grp_loc, &obj_loc, H5_COPY_SHALLOW);
+        H5G_loc_reset(&obj_loc);
+        obj_loc_valid = FALSE;
+
+	/* Advance to next component in string */
+	name += nchars;
+    } /* end while */
+
+    /* Call 'operator' routine */
+    /* If we've fallen through to here, the name must be something like just '.'
+     * and we should issue the callback on that. -QAK
+     * Since we don't have a group location or a link to the object we pass in
+     * NULL.
+     */
+    HDassert(group_copy);
+    if((op)(NULL, ".", NULL, &grp_loc, op_data, &own_loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "traversal operator failed")
+
+    /* If the callback took ownership of the object location, it actually has
+     * ownership of grp_loc.  It shouldn't have tried to take ownership of
+     * the "group location", which was NULL. */
+     HDassert(!(own_loc & H5G_OWN_GRP_LOC));
+     if(own_loc & H5G_OWN_OBJ_LOC)
+         own_loc |= H5G_OWN_GRP_LOC;
+
+done:
+    /* If there's been an error, the callback doesn't really get ownership of
+     * any location and we should close them both */
+    if(ret_value < 0)
+        own_loc = H5G_OWN_NONE;
+
+    /* Free all open locations.  This also closes any open external files. */
+    if(obj_loc_valid && !(own_loc & H5G_OWN_OBJ_LOC))
+        H5G_loc_free(&obj_loc);
+    if(group_copy && !(own_loc & H5G_OWN_GRP_LOC))
+        H5G_loc_free(&grp_loc);
+
+    /* If there's valid information in the link, reset it */
+    if(link_valid)
+        if(H5O_msg_reset(H5O_LINK_ID, &lnk) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to reset link message")
+
+    /* Release temporary component buffer */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't release wrapped buffer")
+
+   FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_traverse_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_traverse
+ *
+ * Purpose:	Traverse a path from a location & perform an operation when
+ *              the last component of the name is reached.
+ *
+ * Return:	Success:	Non-negative if path can be fully traversed.
+ *		Failure:	Negative if the path could not be fully
+ *				traversed.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 13 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G_traverse(const H5G_loc_t *loc, const char *name, unsigned target, H5G_traverse_t op,
+    void *op_data, hid_t lapl_id, hid_t dxpl_id)
+{
+    size_t	    nlinks;                 /* Link countdown value */
+    H5P_genplist_t *lapl;                   /* Property list with value for nlinks */
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "no name given")
+    if(!loc)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "no starting location")
+    if(!op)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "no operation provided")
+    HDassert(lapl_id >= 0);
+
+    /* Set nlinks value from property list, if it exists */
+    if(lapl_id == H5P_DEFAULT)
+        nlinks = H5L_NUM_LINKS;
+    else {
+        if(NULL == (lapl = (H5P_genplist_t *)H5I_object(lapl_id)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+        if(H5P_get(lapl, H5L_ACS_NLINKS_NAME, &nlinks) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of links")
+    } /* end else */
+
+    /* Go perform "real" traversal */
+    if(H5G_traverse_real(loc, name, target, &nlinks, op, op_data, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "internal path traversal failed")
+
+done:
+   FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_traverse() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HF.c b/gatb-core/thirdparty/hdf5/src/H5HF.c
new file mode 100644
index 0000000..2c32b71
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HF.c
@@ -0,0 +1,891 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HF.c
+ *			Feb 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implements a "fractal heap" for storing variable-
+ *                      length objects in a file.
+ *
+ *                      Please see the documentation in:
+ *                      doc/html/TechNotes/FractalHeap.html for a full description
+ *                      of how they work, etc.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HF_t struct */
+H5FL_DEFINE_STATIC(H5HF_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_op_read
+ *
+ * Purpose:	Performs a 'read' operation for a heap 'op' callback
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_op_read(const void *obj, size_t obj_len, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Perform "read", using memcpy() */
+    HDmemcpy(op_data, obj, obj_len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_op_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_op_write
+ *
+ * Purpose:	Performs a 'write' operation for a heap 'op' callback
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_op_write(const void *obj, size_t obj_len, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Perform "write", using memcpy() */
+    HDmemcpy((void *)obj, op_data, obj_len);    /* Casting away const OK -QAK */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_op_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_create
+ *
+ * Purpose:	Creates a new empty fractal heap in the file.
+ *
+ * Return:	Pointer to heap wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_t *
+H5HF_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
+{
+    H5HF_t *fh = NULL;          /* Pointer to new fractal heap */
+    H5HF_hdr_t *hdr = NULL;     /* The fractal heap header information */
+    haddr_t fh_addr;            /* Heap header address */
+    H5HF_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+    /* Create shared fractal heap header */
+    if(HADDR_UNDEF == (fh_addr = H5HF_hdr_create(f, dxpl_id, cparam)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't create fractal heap header")
+
+    /* Allocate fractal heap wrapper */
+    if(NULL == (fh = H5FL_MALLOC(H5HF_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed for fractal heap info")
+
+    /* Lock the heap header into memory */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
+
+    /* Point fractal heap wrapper at header and bump it's ref count */
+    fh->hdr = hdr;
+    if(H5HF_hdr_incr(fh->hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+
+    /* Increment # of files using this heap header */
+    if(H5HF_hdr_fuse_incr(fh->hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment file reference count on shared heap header")
+
+    /* Set file pointer for this heap open context */
+    fh->f = f;
+
+    /* Set the return value */
+    ret_value = fh;
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release fractal heap header")
+    if(!ret_value && fh)
+        if(H5HF_close(fh, dxpl_id) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTCLOSEOBJ, NULL, "unable to close fractal heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_open
+ *
+ * Purpose:	Opens an existing fractal heap in the file.
+ *
+ * Return:	Pointer to heap wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_t *
+H5HF_open(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr)
+{
+    H5HF_t *fh = NULL;          /* Pointer to new fractal heap */
+    H5HF_hdr_t *hdr = NULL;     /* The fractal heap header information */
+    H5HF_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fh_addr));
+
+    /* Load the heap header into memory */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
+
+    /* Check for pending heap deletion */
+    if(hdr->pending_delete)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, NULL, "can't open fractal heap pending deletion")
+
+    /* Create fractal heap info */
+    if(NULL == (fh = H5FL_MALLOC(H5HF_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed for fractal heap info")
+
+    /* Point fractal heap wrapper at header */
+    fh->hdr = hdr;
+    if(H5HF_hdr_incr(fh->hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+
+    /* Increment # of files using this heap header */
+    if(H5HF_hdr_fuse_incr(fh->hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment file reference count on shared heap header")
+
+    /* Set file pointer for this heap open context */
+    fh->f = f;
+
+    /* Set the return value */
+    ret_value = fh;
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release fractal heap header")
+    if(!ret_value && fh)
+        if(H5HF_close(fh, dxpl_id) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTCLOSEOBJ, NULL, "unable to close fractal heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_id_len
+ *
+ * Purpose:	Get the size of IDs for entries in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_id_len(H5HF_t *fh, size_t *id_len_p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id_len_p);
+
+    /* Retrieve the ID length for entries in this heap */
+    *id_len_p = fh->hdr->id_len;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_get_id_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_heap_addr
+ *
+ * Purpose:	Get the address of a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_heap_addr(const H5HF_t *fh, haddr_t *heap_addr_p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(heap_addr_p);
+
+    /* Retrieve the heap header address for this heap */
+    *heap_addr_p = fh->hdr->heap_addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_get_heap_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_insert
+ *
+ * Purpose:	Insert a new object into a fractal heap.
+ *
+ * Return:	Non-negative on success (with heap ID of new object
+ *              filled in), negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_insert(H5HF_t *fh, hid_t dxpl_id, size_t size, const void *obj,
+    void *id/*out*/)
+{
+    H5HF_hdr_t *hdr = NULL;                  /* The fractal heap header information */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(fh);
+    HDassert(obj);
+    HDassert(id);
+
+    /* Check arguments */
+    if(size == 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "can't insert 0-sized objects")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Get the fractal heap header */
+    hdr = fh->hdr;
+
+    /* Check for 'huge' object */
+    if(size > hdr->max_man_size) {
+        /* Store 'huge' object in heap */
+        /* (Casting away const OK - QAK) */
+        if(H5HF_huge_insert(hdr, dxpl_id, size, (void *)obj, id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "can't store 'huge' object in fractal heap")
+    } /* end if */
+    /* Check for 'tiny' object */
+    else if(size <= hdr->tiny_max_len) {
+        /* Store 'tiny' object in heap */
+        if(H5HF_tiny_insert(hdr, size, obj, id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "can't store 'tiny' object in fractal heap")
+    } /* end if */
+    else {
+        /* Check if we are in "append only" mode, or if there's enough room for the object */
+        if(hdr->write_once) {
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "'write once' managed blocks not supported yet")
+        } /* end if */
+        else {
+            /* Allocate space for object in 'managed' heap */
+            if(H5HF_man_insert(hdr, dxpl_id, size, obj, id) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "can't store 'managed' object in fractal heap")
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_obj_len
+ *
+ * Purpose:	Get the size of an entry in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_obj_len(H5HF_t *fh, hid_t dxpl_id, const void *_id, size_t *obj_len_p)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(obj_len_p);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        /* Skip over the flag byte */
+        id++;
+
+        /* Skip over object offset */
+        id += fh->hdr->heap_off_size;
+
+        /* Retrieve the entry length */
+        UINT64DECODE_VAR(id, *obj_len_p, fh->hdr->heap_len_size);
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        if(H5HF_huge_get_obj_len(fh->hdr, dxpl_id, id, obj_len_p) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get 'huge' object's length")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        if(H5HF_tiny_get_obj_len(fh->hdr, id, obj_len_p) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get 'tiny' object's length")
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_get_obj_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_read
+ *
+ * Purpose:	Read an object from a fractal heap into a buffer
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_read(H5HF_t *fh, hid_t dxpl_id, const void *_id, void *obj/*out*/)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        /* Read object from managed heap blocks */
+        if(H5HF_man_read(fh->hdr, dxpl_id, id, obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't read object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        /* Read 'huge' object from file */
+        if(H5HF_huge_read(fh->hdr, dxpl_id, id, obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't read 'huge' object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        /* Read 'tiny' object from file */
+        if(H5HF_tiny_read(fh->hdr, id, obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't read 'tiny' object from fractal heap")
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_write
+ *
+ * Purpose:	Write an object from a buffer into a fractal heap
+ *
+ * Notes:	Writing objects in "managed" heap blocks is only storage
+ *		method currently supported.  (Which could be expanded to
+ *		'huge' and 'tiny' objects, with some work)
+ *
+ *		Also, assumes that the 'op' routine modifies the data, and
+ *		marks data to be written back to disk, even if 'op' routine
+ *		didn't actually change anything.  (Which could be modified
+ *		to pass "did_modify" flag to callback, if necessary)
+ *
+ *		Also, assumes that object to write is same size as object in
+ *		heap.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_write(H5HF_t *fh, hid_t dxpl_id, void *_id, hbool_t H5_ATTR_UNUSED *id_changed,
+    const void *obj)
+{
+    uint8_t *id = (uint8_t *)_id;       /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        /* Operate on object from managed heap blocks */
+        /* (ID can't change and modifying object is "easy" to manage) */
+        if(H5HF_man_write(fh->hdr, dxpl_id, id, obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "can't write to 'managed' heap object")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        /* Operate on "huge" object */
+        if(H5HF_huge_write(fh->hdr, dxpl_id, id, obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "can't write to 'huge' heap object")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        /* Check for writing a 'tiny' object */
+        /* (which isn't supported yet - ID will change) */
+        HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "modifying 'tiny' object not supported yet")
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_op
+ *
+ * Purpose:	Perform an operation directly on a heap object
+ *
+ * Note:	The library routines currently assume that the 'op' callback
+ *		won't modify the object.  This can easily be changed later for
+ *		"managed" heap objects, and, with some difficulty, for 'huge'
+ *		and 'tiny' heap objects.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sept 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_op(H5HF_t *fh, hid_t dxpl_id, const void *_id, H5HF_operator_t op,
+    void *op_data)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(op);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        /* Operate on object from managed heap blocks */
+        if(H5HF_man_op(fh->hdr, dxpl_id, id, op, op_data) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "can't operate on object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        /* Operate on 'huge' object from file */
+        if(H5HF_huge_op(fh->hdr, dxpl_id, id, op, op_data) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "can't operate on 'huge' object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        /* Operate on 'tiny' object from file */
+        if(H5HF_tiny_op(fh->hdr, id, op, op_data) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "can't operate on 'tiny' object from fractal heap")
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_remove
+ *
+ * Purpose:	Remove an object from a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_remove(H5HF_t *fh, hid_t dxpl_id, const void *_id)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(fh->hdr);
+    HDassert(id);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        /* Remove object from managed heap blocks */
+        if(H5HF_man_remove(fh->hdr, dxpl_id, id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        /* Remove 'huge' object from file & v2 B-tree tracker */
+        if(H5HF_huge_remove(fh->hdr, dxpl_id, id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove 'huge' object from fractal heap")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        /* Remove 'tiny' object from heap statistics */
+        if(H5HF_tiny_remove(fh->hdr, id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove 'tiny' object from fractal heap")
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_close
+ *
+ * Purpose:	Close a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_close(H5HF_t *fh, hid_t dxpl_id)
+{
+    hbool_t pending_delete = FALSE;     /* Whether the heap is pending deletion */
+    haddr_t heap_addr = HADDR_UNDEF;    /* Address of heap (for deletion) */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+
+    /* Decrement file reference & check if this is the last open fractal heap using the shared heap header */
+    if(0 == H5HF_hdr_fuse_decr(fh->hdr)) {
+        /* Set the shared heap header's file context for this operation */
+        fh->hdr->f = fh->f;
+
+        /* Close the free space information */
+        /* (Can't put this in header "destroy" routine, because it has
+         *      pointers to indirect blocks in the heap, which would create
+         *      a reference loop and the objects couldn't be removed from
+         *      the metadata cache - QAK)
+         */
+        if(H5HF_space_close(fh->hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
+
+        /* Reset the block iterator, if necessary */
+        /* (Can't put this in header "destroy" routine, because it has
+         *      pointers to indirect blocks in the heap, which would create
+         *      a reference loop and the objects couldn't be removed from
+         *      the metadata cache - QAK)
+         */
+        if(H5HF_man_iter_ready(&fh->hdr->next_block))
+            if(H5HF_man_iter_reset(&fh->hdr->next_block) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reset block iterator")
+
+        /* Shut down the huge object information */
+        /* (Can't put this in header "destroy" routine, because it has
+         *      has the address of an object in the file, which might be
+         *      modified by the shutdown routine - QAK)
+         */
+        if(H5HF_huge_term(fh->hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release 'huge' object info")
+
+        /* Check for pending heap deletion */
+        if(fh->hdr->pending_delete) {
+            /* Set local info, so heap deletion can occur after decrementing the
+             *  header's ref count
+             */
+            pending_delete = TRUE;
+            heap_addr = fh->hdr->heap_addr;
+        } /* end if */
+    } /* end if */
+
+    /* Decrement the reference count on the heap header */
+    if(H5HF_hdr_decr(fh->hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
+
+    /* Check for pending heap deletion */
+    if(pending_delete) {
+        H5HF_hdr_t *hdr;            /* Another pointer to fractal heap header */
+
+        /* Lock the heap header into memory */
+        if(NULL == (hdr = H5HF_hdr_protect(fh->f, dxpl_id, heap_addr, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+        /* Delete heap, starting with header (unprotects header) */
+        if(H5HF_hdr_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")
+    } /* end if */
+
+done:
+    /* Release the fractal heap wrapper */
+    fh = H5FL_FREE(H5HF_t, fh);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_delete
+ *
+ * Purpose:	Delete a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Aug  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_delete(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr)
+{
+    H5HF_hdr_t *hdr = NULL;             /* The fractal heap header information */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fh_addr));
+
+    /* Lock the heap header into memory */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+    /* Check for files using shared heap header */
+    if(hdr->file_rc)
+        hdr->pending_delete = TRUE;
+    else {
+        /* Delete heap now, starting with header (unprotects header) */
+        if(H5HF_hdr_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")
+        hdr = NULL;
+    } /* end if */
+
+done:
+    /* Unprotect the header, if an error occurred */
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFbtree2.c b/gatb-core/thirdparty/hdf5/src/H5HFbtree2.c
new file mode 100644
index 0000000..4c22575
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFbtree2.c
@@ -0,0 +1,1150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFbtree2.c
+ *			Aug  7 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		v2 B-tree callbacks for "huge" object tracker
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* v2 B-tree client callback context */
+typedef struct H5HF_huge_bt2_ctx_t {
+    uint8_t     sizeof_size;    /* Size of file sizes */
+    uint8_t     sizeof_addr;    /* Size of file addresses */
+} H5HF_huge_bt2_ctx_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/* v2 B-tree driver callbacks */
+
+static void *H5HF_huge_bt2_crt_context(void *udata);
+static herr_t H5HF_huge_bt2_dst_context(void *ctx);
+static void *H5HF_huge_bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+
+static herr_t H5HF_huge_bt2_indir_store(void *native, const void *udata);
+static herr_t H5HF_huge_bt2_indir_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_indir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+static herr_t H5HF_huge_bt2_filt_indir_store(void *native, const void *udata);
+static herr_t H5HF_huge_bt2_filt_indir_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_filt_indir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+static herr_t H5HF_huge_bt2_dir_store(void *native, const void *udata);
+static herr_t H5HF_huge_bt2_dir_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_dir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+static herr_t H5HF_huge_bt2_filt_dir_store(void *native, const void *udata);
+static herr_t H5HF_huge_bt2_filt_dir_compare(const void *rec1, const void *rec2, int *result);
+static herr_t H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *native,
+    void *ctx);
+static herr_t H5HF_huge_bt2_filt_dir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+
+/*********************/
+/* Package Variables */
+/*********************/
+/* v2 B-tree class for indirectly accessed 'huge' objects */
+const H5B2_class_t H5HF_HUGE_BT2_INDIR[1]={{ /* B-tree class information */
+    H5B2_FHEAP_HUGE_INDIR_ID,               /* Type of B-tree */
+    "H5B2_FHEAP_HUGE_INDIR_ID",             /* Name of B-tree class */
+    sizeof(H5HF_huge_bt2_indir_rec_t),      /* Size of native record */
+    H5HF_huge_bt2_crt_context,              /* Create client callback context */
+    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
+    H5HF_huge_bt2_indir_store,              /* Record storage callback */
+    H5HF_huge_bt2_indir_compare,            /* Record comparison callback */
+    H5HF_huge_bt2_indir_encode,             /* Record encoding callback */
+    H5HF_huge_bt2_indir_decode,             /* Record decoding callback */
+    H5HF_huge_bt2_indir_debug,              /* Record debugging callback */
+    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
+    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for indirectly accessed, filtered 'huge' objects */
+const H5B2_class_t H5HF_HUGE_BT2_FILT_INDIR[1]={{ /* B-tree class information */
+    H5B2_FHEAP_HUGE_FILT_INDIR_ID,          /* Type of B-tree */
+    "H5B2_FHEAP_HUGE_FILT_INDIR_ID",        /* Name of B-tree class */
+    sizeof(H5HF_huge_bt2_filt_indir_rec_t), /* Size of native record */
+    H5HF_huge_bt2_crt_context,              /* Create client callback context */
+    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
+    H5HF_huge_bt2_filt_indir_store,         /* Record storage callback */
+    H5HF_huge_bt2_filt_indir_compare,       /* Record comparison callback */
+    H5HF_huge_bt2_filt_indir_encode,        /* Record encoding callback */
+    H5HF_huge_bt2_filt_indir_decode,        /* Record decoding callback */
+    H5HF_huge_bt2_filt_indir_debug,         /* Record debugging callback */
+    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
+    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for directly accessed 'huge' objects */
+const H5B2_class_t H5HF_HUGE_BT2_DIR[1]={{  /* B-tree class information */
+    H5B2_FHEAP_HUGE_DIR_ID,                 /* Type of B-tree */
+    "H5B2_FHEAP_HUGE_DIR_ID",               /* Name of B-tree class */
+    sizeof(H5HF_huge_bt2_dir_rec_t),        /* Size of native record */
+    H5HF_huge_bt2_crt_context,              /* Create client callback context */
+    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
+    H5HF_huge_bt2_dir_store,                /* Record storage callback */
+    H5HF_huge_bt2_dir_compare,              /* Record comparison callback */
+    H5HF_huge_bt2_dir_encode,               /* Record encoding callback */
+    H5HF_huge_bt2_dir_decode,               /* Record decoding callback */
+    H5HF_huge_bt2_dir_debug,                /* Record debugging callback */
+    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
+    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for directly accessed, filtered 'huge' objects */
+const H5B2_class_t H5HF_HUGE_BT2_FILT_DIR[1]={{ /* B-tree class information */
+    H5B2_FHEAP_HUGE_FILT_DIR_ID,            /* Type of B-tree */
+    "H5B2_FHEAP_HUGE_FILT_DIR_ID",          /* Name of B-tree class */
+    sizeof(H5HF_huge_bt2_filt_dir_rec_t),   /* Size of native record */
+    H5HF_huge_bt2_crt_context,              /* Create client callback context */
+    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
+    H5HF_huge_bt2_filt_dir_store,           /* Record storage callback */
+    H5HF_huge_bt2_filt_dir_compare,         /* Record comparison callback */
+    H5HF_huge_bt2_filt_dir_encode,          /* Record encoding callback */
+    H5HF_huge_bt2_filt_dir_decode,          /* Record decoding callback */
+    H5HF_huge_bt2_filt_dir_debug,           /* Record debugging callback */
+    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
+    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+}};
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HF_huge_bt2_ctx_t struct */
+H5FL_DEFINE_STATIC(H5HF_huge_bt2_ctx_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_crt_context
+ *
+ * Purpose:	Create client callback context
+ *
+ * Note:	Common to all 'huge' v2 B-tree clients
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5HF_huge_bt2_crt_context(void *_f)
+{
+    H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
+    H5HF_huge_bt2_ctx_t *ctx;   /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5HF_huge_bt2_ctx_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses & lengths in the file */
+    ctx->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    ctx->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dst_context
+ *
+ * Purpose:	Destroy client callback context
+ *
+ * Note:	Common to all 'huge' v2 B-tree clients
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dst_context(void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Release callback context */
+    ctx = H5FL_FREE(H5HF_huge_bt2_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_crt_dbg_context
+ *
+ * Purpose:	Create context for debugging callback
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5HF_huge_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+{
+    H5HF_huge_bt2_ctx_t *ctx;   /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5HF_huge_bt2_ctx_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses & lengths in the file */
+    ctx->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    ctx->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_found
+ *
+ * Purpose:	Retrieve record for indirectly accessed 'huge' object, when
+ *              it's found in the v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_indir_found(const void *nrecord, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef QAK
+HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_found",
+        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr,
+        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len,
+        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->id);
+#endif /* QAK */
+    *(H5HF_huge_bt2_indir_rec_t *)op_data = *(const H5HF_huge_bt2_indir_rec_t *)nrecord;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_remove
+ *
+ * Purpose:	Free space for indirectly accessed 'huge' object, as v2 B-tree
+ *              is being deleted or v2 B-tree node is removed
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_indir_remove(const void *nrecord, void *_udata)
+{
+    H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Free the space in the file for the object being removed */
+    if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free space for huge object on disk")
+
+    /* Set the length of the object removed */
+    udata->obj_len = ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_indir_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_store
+ *
+ * Purpose:	Store native information into record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_indir_store(void *nrecord, const void *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *(H5HF_huge_bt2_indir_rec_t *)nrecord = *(const H5HF_huge_bt2_indir_rec_t *)udata;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_indir_compare(const void *_rec1, const void *_rec2, int *result)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *result = (int)(((const H5HF_huge_bt2_indir_rec_t *)_rec1)->id - 
+                    ((const H5HF_huge_bt2_indir_rec_t *)_rec2)->id);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    const H5HF_huge_bt2_indir_rec_t *nrecord = (const H5HF_huge_bt2_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, nrecord->addr);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    H5HF_huge_bt2_indir_rec_t *nrecord = (H5HF_huge_bt2_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &nrecord->addr);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_indir_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_huge_bt2_indir_rec_t *nrecord = (const H5HF_huge_bt2_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%a, %Hu, %Hu}\n", indent, "", fwidth, "Record:",
+        nrecord->addr, nrecord->len, nrecord->id);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_indir_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_found
+ *
+ * Purpose:	Retrieve record for indirectly accessed, filtered 'huge' object,
+ *              when it's found in the v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_filt_indir_found(const void *nrecord, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef QAK
+HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt_indir_found",
+        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->addr,
+        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->len,
+        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->filter_mask,
+        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->obj_size,
+        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->id);
+#endif /* QAK */
+    *(H5HF_huge_bt2_filt_indir_rec_t *)op_data = *(const H5HF_huge_bt2_filt_indir_rec_t *)nrecord;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_remove
+ *
+ * Purpose:	Free space for indirectly accessed, filtered 'huge' object, as
+ *              v2 B-tree is being deleted or v2 B-tree node is removed
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *_udata)
+{
+    H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Free the space in the file for the object being removed */
+    if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free space for huge object on disk")
+
+    /* Set the length of the object removed */
+    udata->obj_len = ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->obj_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_filt_indir_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_store
+ *
+ * Purpose:	Store native information into record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_indir_store(void *nrecord, const void *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *(H5HF_huge_bt2_filt_indir_rec_t *)nrecord = *(const H5HF_huge_bt2_filt_indir_rec_t *)udata;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_indir_compare(const void *_rec1, const void *_rec2, int *result)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *result = (int)(((const H5HF_huge_bt2_filt_indir_rec_t *)_rec1)->id - 
+                    ((const H5HF_huge_bt2_filt_indir_rec_t *)_rec2)->id);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    const H5HF_huge_bt2_filt_indir_rec_t *nrecord = (const H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, nrecord->addr);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    UINT32ENCODE(raw, nrecord->filter_mask);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    H5HF_huge_bt2_filt_indir_rec_t *nrecord = (H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &nrecord->addr);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    UINT32DECODE(raw, nrecord->filter_mask);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_indir_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_huge_bt2_filt_indir_rec_t *nrecord = (const H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%a, %Hu, %x, %Hu, %Hu}\n", indent, "", fwidth, "Record:",
+        nrecord->addr, nrecord->len, nrecord->filter_mask, nrecord->obj_size, nrecord->id);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_indir_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_remove
+ *
+ * Purpose:	Free space for directly accessed 'huge' object, as v2 B-tree
+ *              is being deleted or v2 B-tree node is being removed
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_dir_remove(const void *nrecord, void *_udata)
+{
+    H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Free the space in the file for the object being removed */
+    if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free space for huge object on disk")
+
+    /* Set the length of the object removed */
+    udata->obj_len = ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_dir_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_store
+ *
+ * Purpose:	Store native information into record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dir_store(void *nrecord, const void *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *(H5HF_huge_bt2_dir_rec_t *)nrecord = *(const H5HF_huge_bt2_dir_rec_t *)udata;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dir_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dir_compare(const void *_rec1, const void *_rec2, int *result)
+{
+    const H5HF_huge_bt2_dir_rec_t *rec1 = (const H5HF_huge_bt2_dir_rec_t *)_rec1;
+    const H5HF_huge_bt2_dir_rec_t *rec2 = (const H5HF_huge_bt2_dir_rec_t *)_rec2;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef QAK
+HDfprintf(stderr, "%s: rec1 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec1->addr, rec1->len);
+HDfprintf(stderr, "%s: rec2 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec2->addr, rec2->len);
+#endif /* QAK */
+    if(rec1->addr < rec2->addr)
+        *result = -1;
+    else if(rec1->addr > rec2->addr)
+        *result = 1;
+    else if(rec1->len < rec2->len)
+        *result = -1;
+    else if(rec1->len > rec2->len)
+        *result = 1;
+    else
+        *result = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dir_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    const H5HF_huge_bt2_dir_rec_t *nrecord = (const H5HF_huge_bt2_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, nrecord->addr);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dir_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    H5HF_huge_bt2_dir_rec_t *nrecord = (H5HF_huge_bt2_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &nrecord->addr);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dir_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_dir_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August  7, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_dir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord,
+    const void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_huge_bt2_dir_rec_t *nrecord = (const H5HF_huge_bt2_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%a, %Hu}\n", indent, "", fwidth, "Record:",
+        nrecord->addr, nrecord->len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_dir_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_found
+ *
+ * Purpose:	Retrieve record for directly accessed, filtered 'huge' object,
+ *              when it's found in the v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_filt_dir_found(const void *nrecord, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef QAK
+HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_found",
+        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->addr,
+        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->len,
+        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->filter_mask,
+        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->obj_size);
+#endif /* QAK */
+    *(H5HF_huge_bt2_filt_dir_rec_t *)op_data = *(const H5HF_huge_bt2_filt_dir_rec_t *)nrecord;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_found() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_remove
+ *
+ * Purpose:	Free space for directly accessed, filtered 'huge' object, as
+ *              v2 B-tree is being deleted or v2 B-tree node is removed
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *_udata)
+{
+    H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Free the space in the file for the object being removed */
+    if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free space for huge object on disk")
+
+    /* Set the length of the object removed */
+    udata->obj_len = ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->obj_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_huge_bt2_filt_dir_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_store
+ *
+ * Purpose:	Store native information into record for v2 B-tree
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_dir_store(void *nrecord, const void *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    *(H5HF_huge_bt2_filt_dir_rec_t *)nrecord = *(const H5HF_huge_bt2_filt_dir_rec_t *)udata;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_compare
+ *
+ * Purpose:	Compare two native information records, according to some key
+ *
+ * Return:	<0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_dir_compare(const void *_rec1, const void *_rec2, int *result)
+{
+    const H5HF_huge_bt2_filt_dir_rec_t *rec1 = (const H5HF_huge_bt2_filt_dir_rec_t *)_rec1;
+    const H5HF_huge_bt2_filt_dir_rec_t *rec2 = (const H5HF_huge_bt2_filt_dir_rec_t *)_rec2;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef QAK
+HDfprintf(stderr, "%s: rec1 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_compare", rec1->addr, rec1->len, rec1->filter_mask, rec1->obj_size);
+HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_compare", rec2->addr, rec2->len, rec2->filter_mask, rec2->obj_size);
+#endif /* QAK */
+    if(rec1->addr < rec2->addr)
+        *result = -1;
+    else if(rec1->addr > rec2->addr)
+        *result = 1;
+    else if(rec1->len < rec2->len)
+        *result = -1;
+    else if(rec1->len > rec2->len)
+        *result = 1;
+    else
+        *result = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_encode
+ *
+ * Purpose:	Encode native information into raw form for storing on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    const H5HF_huge_bt2_filt_dir_rec_t *nrecord = (const H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, nrecord->addr);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    UINT32ENCODE(raw, nrecord->filter_mask);
+    H5F_ENCODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+{
+    H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    H5HF_huge_bt2_filt_dir_rec_t *nrecord = (H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &nrecord->addr);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
+    UINT32DECODE(raw, nrecord->filter_mask);
+    H5F_DECODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_filt_dir_debug
+ *
+ * Purpose:	Debug native form of record
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_filt_dir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_huge_bt2_filt_dir_rec_t *nrecord = (const H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDfprintf(stream, "%*s%-*s {%a, %Hu, %x, %Hu}\n", indent, "", fwidth, "Record:",
+        nrecord->addr, nrecord->len, nrecord->filter_mask, nrecord->obj_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_huge_bt2_filt_dir_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFcache.c b/gatb-core/thirdparty/hdf5/src/H5HFcache.c
new file mode 100644
index 0000000..8e1f838
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFcache.c
@@ -0,0 +1,1765 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFcache.c
+ *			Feb 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implement fractal heap metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Fractal heap format version #'s */
+#define H5HF_HDR_VERSION        0               /* Header */
+#define H5HF_DBLOCK_VERSION     0               /* Direct block */
+#define H5HF_IBLOCK_VERSION     0               /* Indirect block */
+
+/* Size of stack buffer for serialized headers */
+#define H5HF_HDR_BUF_SIZE       512
+
+/* Size of stack buffer for serialized indirect blocks */
+#define H5HF_IBLOCK_BUF_SIZE    4096
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Local encode/decode routines */
+static herr_t H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable);
+static herr_t H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable);
+
+/* Metadata cache (H5AC) callbacks */
+static H5HF_hdr_t *H5HF_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HF_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5HF_cache_hdr_dest(H5F_t *f, H5HF_hdr_t *hdr);
+static herr_t H5HF_cache_hdr_clear(H5F_t *f, H5HF_hdr_t *hdr, hbool_t destroy);
+static herr_t H5HF_cache_hdr_size(const H5F_t *f, const H5HF_hdr_t *hdr, size_t *size_ptr);
+static H5HF_indirect_t *H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HF_cache_iblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_indirect_t *iblock, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5HF_cache_iblock_dest(H5F_t *f, H5HF_indirect_t *iblock);
+static herr_t H5HF_cache_iblock_clear(H5F_t *f, H5HF_indirect_t *iblock, hbool_t destroy);
+static herr_t H5HF_cache_iblock_size(const H5F_t *f, const H5HF_indirect_t *iblock, size_t *size_ptr);
+static H5HF_direct_t *H5HF_cache_dblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HF_cache_dblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_direct_t *dblock, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock);
+static herr_t H5HF_cache_dblock_clear(H5F_t *f, H5HF_direct_t *dblock, hbool_t destroy);
+static herr_t H5HF_cache_dblock_size(const H5F_t *f, const H5HF_direct_t *dblock, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5HF header inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FHEAP_HDR[1] = {{
+    H5AC_FHEAP_HDR_ID,
+    (H5AC_load_func_t)H5HF_cache_hdr_load,
+    (H5AC_flush_func_t)H5HF_cache_hdr_flush,
+    (H5AC_dest_func_t)H5HF_cache_hdr_dest,
+    (H5AC_clear_func_t)H5HF_cache_hdr_clear,
+    (H5AC_size_func_t)H5HF_cache_hdr_size,
+}};
+
+/* H5HF indirect block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FHEAP_IBLOCK[1] = {{
+    H5AC_FHEAP_IBLOCK_ID,
+    (H5AC_load_func_t)H5HF_cache_iblock_load,
+    (H5AC_flush_func_t)H5HF_cache_iblock_flush,
+    (H5AC_dest_func_t)H5HF_cache_iblock_dest,
+    (H5AC_clear_func_t)H5HF_cache_iblock_clear,
+    (H5AC_size_func_t)H5HF_cache_iblock_size,
+}};
+
+/* H5HF direct block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FHEAP_DBLOCK[1] = {{
+    H5AC_FHEAP_DBLOCK_ID,
+    (H5AC_load_func_t)H5HF_cache_dblock_load,
+    (H5AC_flush_func_t)H5HF_cache_dblock_flush,
+    (H5AC_dest_func_t)H5HF_cache_dblock_dest,
+    (H5AC_clear_func_t)H5HF_cache_dblock_clear,
+    (H5AC_size_func_t)H5HF_cache_dblock_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage heap direct block data to/from disk */
+H5FL_BLK_DEFINE(direct_block);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_decode
+ *
+ * Purpose:	Decodes the metadata for a doubling table
+ *
+ * Return:	Success:	Pointer to a new fractal heap
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(pp && *pp);
+    HDassert(dtable);
+
+    /* Table width */
+    UINT16DECODE(*pp, dtable->cparam.width);
+
+    /* Starting block size */
+    H5F_DECODE_LENGTH(f, *pp, dtable->cparam.start_block_size);
+
+    /* Maximum direct block size */
+    H5F_DECODE_LENGTH(f, *pp, dtable->cparam.max_direct_size);
+
+    /* Maximum heap size (as # of bits) */
+    UINT16DECODE(*pp, dtable->cparam.max_index);
+
+    /* Starting # of rows in root indirect block */
+    UINT16DECODE(*pp, dtable->cparam.start_root_rows);
+
+    /* Address of table */
+    H5F_addr_decode(f, pp, &(dtable->table_addr));
+
+    /* Current # of rows in root indirect block */
+    UINT16DECODE(*pp, dtable->curr_root_rows);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dtable_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_encode
+ *
+ * Purpose:	Encodes the metadata for a doubling table
+ *
+ * Return:	Success:	Pointer to a new fractal heap
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(pp && *pp);
+    HDassert(dtable);
+
+    /* Table width */
+    UINT16ENCODE(*pp, dtable->cparam.width);
+
+    /* Starting block size */
+    H5F_ENCODE_LENGTH(f, *pp, dtable->cparam.start_block_size);
+
+    /* Maximum direct block size */
+    H5F_ENCODE_LENGTH(f, *pp, dtable->cparam.max_direct_size);
+
+    /* Maximum heap size (as # of bits) */
+    UINT16ENCODE(*pp, dtable->cparam.max_index);
+
+    /* Starting # of rows in root indirect block */
+    UINT16ENCODE(*pp, dtable->cparam.start_root_rows);
+
+    /* Address of root direct/indirect block */
+    H5F_addr_encode(f, pp, dtable->table_addr);
+
+    /* Current # of rows in root indirect block */
+    UINT16ENCODE(*pp, dtable->curr_root_rows);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dtable_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_hdr_load
+ *
+ * Purpose:	Loads a fractal heap header from the disk.
+ *
+ * Return:	Success:	Pointer to a new fractal heap
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_hdr_t *
+H5HF_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5HF_hdr_t		*hdr = NULL;     /* Fractal heap info */
+    H5HF_hdr_cache_ud_t *udata = (H5HF_hdr_cache_ud_t *)_udata;
+    size_t		size;           /* Header size */
+    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
+    uint8_t             hdr_buf[H5HF_HDR_BUF_SIZE]; /* Buffer for header */
+    uint8_t		*buf;           /* Pointer to header buffer */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    uint8_t             heap_flags;     /* Status flags for heap */
+    H5HF_hdr_t		*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Allocate space for the fractal heap data structure */
+    if(NULL == (hdr = H5HF_hdr_alloc(udata->f)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Wrap the local buffer for serialized header info */
+    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Compute the 'base' size of the fractal heap header on disk */
+    size = (size_t)H5HF_HEADER_SIZE(hdr);
+
+    /* Get a pointer to a buffer that's large enough for serialized header */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read header from disk */
+    if(H5F_block_read(f, H5FD_MEM_FHEAP_HDR, addr, size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap header")
+
+    /* Get temporary pointer to serialized header */
+    p = buf;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap header signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5HF_HDR_VERSION)
+	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap header version")
+
+    /* General heap information */
+    UINT16DECODE(p, hdr->id_len);               /* Heap ID length */
+    UINT16DECODE(p, hdr->filter_len);           /* I/O filters' encoded length */
+
+    /* Heap status flags */
+    /* (bit 0: "huge" object IDs have wrapped) */
+    /* (bit 1: checksum direct blocks) */
+    heap_flags = *p++;
+    hdr->huge_ids_wrapped = heap_flags & H5HF_HDR_FLAGS_HUGE_ID_WRAPPED;
+    hdr->checksum_dblocks = heap_flags & H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS;
+
+    /* "Huge" object information */
+    UINT32DECODE(p, hdr->max_man_size);         /* Max. size of "managed" objects */
+    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_next_id); /* Next ID to use for "huge" object */
+    H5F_addr_decode(udata->f, &p, &hdr->huge_bt2_addr); /* Address of "huge" object tracker B-tree */
+
+    /* "Managed" object free space information */
+    H5F_DECODE_LENGTH(udata->f, p, hdr->total_man_free); /* Internal free space in managed direct blocks */
+    H5F_addr_decode(udata->f, &p, &hdr->fs_addr);      /* Address of free section header */
+
+    /* Heap statistics */
+    H5F_DECODE_LENGTH(udata->f, p, hdr->man_size);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->man_alloc_size);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->man_iter_off);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->man_nobjs);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_size);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_nobjs);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->tiny_size);
+    H5F_DECODE_LENGTH(udata->f, p, hdr->tiny_nobjs);
+
+    /* Managed objects' doubling-table info */
+    if(H5HF_dtable_decode(hdr->f, &p, &(hdr->man_dtable)) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, NULL, "unable to encode managed obj. doubling table info")
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(p - (const uint8_t *)buf) == (size - H5HF_SIZEOF_CHKSUM));
+
+    /* Check for I/O filter information to decode */
+    if(hdr->filter_len > 0) {
+        size_t filter_info_off;     /* Offset in header of filter information */
+        size_t filter_info_size;    /* Size of filter information */
+        H5O_pline_t *pline;         /* Pipeline information from the header on disk */
+
+        /* Compute the offset of the filter info in the header */
+        filter_info_off = (size_t)(p - (const uint8_t *)buf);
+
+        /* Compute the size of the extra filter information */
+        filter_info_size = (size_t)(hdr->sizeof_size     /* Size of size for filtered root direct block */
+            + (unsigned)4                       /* Size of filter mask for filtered root direct block */
+            + hdr->filter_len);                 /* Size of encoded I/O filter info */
+
+        /* Compute the heap header's size */
+        hdr->heap_size = size + filter_info_size;
+
+        /* Re-size current buffer */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->heap_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+        /* Read in I/O filter information */
+        /* (and the checksum) */
+        if(H5F_block_read(f, H5FD_MEM_FHEAP_HDR, (addr + filter_info_off), (filter_info_size + H5HF_SIZEOF_CHKSUM), dxpl_id, (buf + filter_info_off)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap header's I/O pipeline filter info")
+
+        /* Point at correct offset in header for the filter information */
+        p = buf + filter_info_off;
+
+        /* Decode the size of a filtered root direct block */
+        H5F_DECODE_LENGTH(udata->f, p, hdr->pline_root_direct_size);
+
+        /* Decode the filter mask for a filtered root direct block */
+        UINT32DECODE(p, hdr->pline_root_direct_filter_mask);
+
+        /* Decode I/O filter information */
+        if(NULL == (pline = (H5O_pline_t *)H5O_msg_decode(hdr->f, udata->dxpl_id, NULL, H5O_PLINE_ID, p)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode I/O pipeline filters")
+        p += hdr->filter_len;
+
+        /* Copy the information into the header's I/O pipeline structure */
+        if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &(hdr->pline)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOPY, NULL, "can't copy I/O filter pipeline")
+
+        /* Release the space allocated for the I/O pipeline filters */
+        H5O_msg_free(H5O_PLINE_ID, pline);
+    } /* end if */
+    else
+        /* Set the heap header's size */
+        hdr->heap_size = size;
+
+    /* Compute checksum on entire header */
+    /* (including the filter information, if present) */
+    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(p - (const uint8_t *)buf) == hdr->heap_size);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap header")
+
+    /* Finish initialization of heap header */
+    if(H5HF_hdr_finish_init(hdr) < 0)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't finish initializing shared fractal heap header")
+
+    /* Set return value */
+    ret_value = hdr;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && hdr)
+        if(H5HF_hdr_free(hdr) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_hdr_flush
+ *
+ * Purpose:	Flushes a dirty fractal heap header to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for header data */
+    uint8_t hdr_buf[H5HF_HDR_BUF_SIZE]; /* Buffer for header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(hdr);
+
+    if(hdr->cache_info.is_dirty) {
+        uint8_t	*buf;           /* Temporary raw data buffer */
+        uint8_t *p;             /* Pointer into raw data buffer */
+        size_t	size;           /* Header size on disk */
+        uint8_t heap_flags;     /* Status flags for heap */
+        uint32_t metadata_chksum; /* Computed metadata checksum value */
+
+        /* Set the shared heap header's file context for this operation */
+        hdr->f = f;
+
+        /* Wrap the local buffer for serialized header info */
+        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Compute the size of the heap header on disk */
+        size = hdr->heap_size;
+
+        /* Get a pointer to a buffer that's large enough for serialized header */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to serialized header */
+        p = buf;
+
+        /* Magic number */
+        HDmemcpy(p, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5HF_HDR_VERSION;
+
+        /* General heap information */
+        UINT16ENCODE(p, hdr->id_len);           /* Heap ID length */
+        UINT16ENCODE(p, hdr->filter_len);       /* I/O filters' encoded length */
+
+        /* Heap status flags */
+        /* (bit 0: "huge" object IDs have wrapped) */
+        /* (bit 1: checksum direct blocks) */
+        heap_flags = 0;
+        heap_flags |= (hdr->huge_ids_wrapped ?  H5HF_HDR_FLAGS_HUGE_ID_WRAPPED : 0);
+        heap_flags |= (hdr->checksum_dblocks ?  H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS : 0);
+        *p++ = heap_flags;
+
+        /* "Huge" object information */
+        UINT32ENCODE(p, hdr->max_man_size);             /* Max. size of "managed" objects */
+        H5F_ENCODE_LENGTH(f, p, hdr->huge_next_id);     /* Next ID to use for "huge" object */
+        H5F_addr_encode(f, &p, hdr->huge_bt2_addr);     /* Address of "huge" object tracker B-tree */
+
+        /* "Managed" object free space information */
+        H5F_ENCODE_LENGTH(f, p, hdr->total_man_free);   /* Internal free space in managed direct blocks */
+        H5F_addr_encode(f, &p, hdr->fs_addr);           /* Address of free section header */
+
+        /* Heap statistics */
+        H5F_ENCODE_LENGTH(f, p, hdr->man_size);
+        H5F_ENCODE_LENGTH(f, p, hdr->man_alloc_size);
+        H5F_ENCODE_LENGTH(f, p, hdr->man_iter_off);
+        H5F_ENCODE_LENGTH(f, p, hdr->man_nobjs);
+        H5F_ENCODE_LENGTH(f, p, hdr->huge_size);
+        H5F_ENCODE_LENGTH(f, p, hdr->huge_nobjs);
+        H5F_ENCODE_LENGTH(f, p, hdr->tiny_size);
+        H5F_ENCODE_LENGTH(f, p, hdr->tiny_nobjs);
+
+        /* Managed objects' doubling-table info */
+        if(H5HF_dtable_encode(hdr->f, &p, &(hdr->man_dtable)) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "unable to encode managed obj. doubling table info")
+
+        /* Check for I/O filter information to encode */
+        if(hdr->filter_len > 0) {
+            /* Encode the size of a filtered root direct block */
+            H5F_ENCODE_LENGTH(f, p, hdr->pline_root_direct_size);
+
+            /* Encode the filter mask for a filtered root direct block */
+            UINT32ENCODE(p, hdr->pline_root_direct_filter_mask);
+
+            /* Encode I/O filter information */
+            if(H5O_msg_encode(hdr->f, H5O_PLINE_ID, FALSE, p, &(hdr->pline)) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "can't encode I/O pipeline fiters")
+            p += hdr->filter_len;
+        } /* end if */
+
+        /* Compute metadata checksum */
+        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+	/* Write the heap header. */
+        HDassert((size_t)(p - buf) == size);
+	if(H5F_block_write(f, H5FD_MEM_FHEAP_HDR, addr, size, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap header to disk")
+
+	hdr->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5HF_cache_hdr_dest(f, hdr) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap header")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_cache_hdr_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_hdr_dest
+ *
+ * Purpose:	Destroys a fractal heap header in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_hdr_dest(H5F_t *f, H5HF_hdr_t *hdr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(hdr->rc == 0);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!hdr->cache_info.free_file_space_on_destroy || H5F_addr_defined(hdr->cache_info.addr));
+
+    /* Check for freeing file space for heap header */
+    if(hdr->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_FHEAP_HDR, H5AC_dxpl_id, hdr->cache_info.addr, (hsize_t)hdr->heap_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap header")
+    } /* end if */
+
+    /* Free the shared info itself */
+    if(H5HF_hdr_free(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "unable to release fractal heap header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_hdr_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_hdr_clear
+ *
+ * Purpose:	Mark a fractal heap header in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_hdr_clear(H5F_t *f, H5HF_hdr_t *hdr, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Reset the dirty flag.  */
+    hdr->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HF_cache_hdr_dest(f, hdr) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_hdr_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_hdr_size
+ *
+ * Purpose:	Compute the size in bytes of a fractal heap header
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_hdr_t *hdr, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(hdr);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = hdr->heap_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_cache_hdr_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_iblock_load
+ *
+ * Purpose:	Loads a fractal heap indirect block from the disk.
+ *
+ * Return:	Success:	Pointer to a new fractal heap indirect block
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_indirect_t *
+H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5HF_hdr_t          *hdr;           /* Shared fractal heap information */
+    H5HF_iblock_cache_ud_t *udata = (H5HF_iblock_cache_ud_t *)_udata; /* user data for callback */
+    H5HF_indirect_t	*iblock = NULL; /* Indirect block info */
+    H5WB_t              *wb = NULL;     /* Wrapped buffer for indirect block data */
+    uint8_t             iblock_buf[H5HF_IBLOCK_BUF_SIZE]; /* Buffer for indirect block */
+    uint8_t		*buf;           /* Temporary buffer */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    haddr_t             heap_addr;      /* Address of heap header in the file */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    uint32_t            computed_chksum; /* Computed metadata checksum value */
+    unsigned            u;              /* Local index variable */
+    H5HF_indirect_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Allocate space for the fractal heap indirect block */
+    if(NULL == (iblock = H5FL_CALLOC(H5HF_indirect_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the pointer to the shared heap header */
+    hdr = udata->par_info->hdr;
+
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = udata->f;
+
+    /* Share common heap information */
+    iblock->hdr = hdr;
+    if(H5HF_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+
+    /* Set block's internal information */
+    iblock->rc = 0;
+    iblock->nrows = *udata->nrows;
+    iblock->nchildren = 0;
+
+    /* Wrap the local buffer for serialized indirect block */
+    if(NULL == (wb = H5WB_wrap(iblock_buf, sizeof(iblock_buf))))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Compute size of indirect block */
+    iblock->size = H5HF_MAN_INDIRECT_SIZE(hdr, iblock->nrows);
+
+    /* Get a pointer to a buffer that's large enough for serialized indirect block */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, iblock->size)))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read indirect block from disk */
+    if(H5F_block_read(f, H5FD_MEM_FHEAP_IBLOCK, addr, iblock->size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap indirect block")
+
+    /* Get temporary pointer to serialized indirect block */
+    p = buf;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap indirect block signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5HF_IBLOCK_VERSION)
+	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
+
+    /* Address of heap that owns this block */
+    H5F_addr_decode(udata->f, &p, &heap_addr);
+    if(H5F_addr_ne(heap_addr, hdr->heap_addr))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
+
+    /* Address of parent block */
+    iblock->parent = udata->par_info->iblock;
+    iblock->par_entry = udata->par_info->entry;
+    if(iblock->parent) {
+        /* Share parent block */
+        if(H5HF_iblock_incr(iblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared indirect block")
+
+        /* Set max. # of rows in this block */
+        iblock->max_rows = iblock->nrows;
+    } /* end if */
+    else {
+        /* Set max. # of rows in this block */
+        iblock->max_rows = hdr->man_dtable.max_root_rows;
+    } /* end else */
+
+    /* Offset of heap within the heap's address space */
+    UINT64DECODE_VAR(p, iblock->block_off, hdr->heap_off_size);
+
+    /* Allocate & decode child block entry tables */
+    HDassert(iblock->nrows > 0);
+    if(NULL == (iblock->ents = H5FL_SEQ_MALLOC(H5HF_indirect_ent_t, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct entries")
+    if(hdr->filter_len > 0) {
+        unsigned dir_rows;      /* Number of direct rows in this indirect block */
+
+        /* Compute the number of direct rows for this indirect block */
+        dir_rows = MIN(iblock->nrows, hdr->man_dtable.max_direct_rows);
+
+        /* Allocate indirect block filtered entry array */
+        if(NULL == (iblock->filt_ents = H5FL_SEQ_MALLOC(H5HF_indirect_filt_ent_t, (size_t)(dir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for block entries")
+    } /* end if */
+    else
+        iblock->filt_ents = NULL;
+    for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
+        /* Decode child block address */
+        H5F_addr_decode(udata->f, &p, &(iblock->ents[u].addr));
+
+        /* Check for heap with I/O filters */
+        if(hdr->filter_len > 0) {
+            /* Sanity check */
+            HDassert(iblock->filt_ents);
+
+            /* Decode extra information for direct blocks */
+            if(u < (hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width)) {
+                /* Size of filtered direct block */
+                H5F_DECODE_LENGTH(udata->f, p, iblock->filt_ents[u].size);
+
+                /* Sanity check */
+                /* (either both the address & size are defined or both are
+                 *  not defined)
+                 */
+                HDassert((H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size)
+                    || (!H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size == 0));
+
+                /* I/O filter mask for filtered direct block */
+                UINT32DECODE(p, iblock->filt_ents[u].filter_mask);
+            } /* end if */
+        } /* end if */
+
+        /* Count child blocks */
+        if(H5F_addr_defined(iblock->ents[u].addr)) {
+            iblock->nchildren++;
+            iblock->max_child = u;
+        } /* end if */
+    } /* end for */
+
+    /* Sanity check */
+    HDassert(iblock->nchildren);        /* indirect blocks w/no children should have been deleted */
+
+    /* Compute checksum on indirect block */
+    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+
+    /* Metadata checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(p - (const uint8_t *)buf) == iblock->size);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+
+    /* Check if we have any indirect block children */
+    if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+        unsigned indir_rows;      /* Number of indirect rows in this indirect block */
+
+        /* Compute the number of indirect rows for this indirect block */
+        indir_rows = iblock->nrows - hdr->man_dtable.max_direct_rows;
+
+        /* Allocate & initialize child indirect block pointer array */
+        if(NULL == (iblock->child_iblocks = H5FL_SEQ_CALLOC(H5HF_indirect_ptr_t, (size_t)(indir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed for block entries")
+    } /* end if */
+    else
+        iblock->child_iblocks = NULL;
+
+    /* Set return value */
+    ret_value = iblock;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && iblock)
+        if(H5HF_man_iblock_dest(iblock) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy fractal heap indirect block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_iblock_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_iblock_flush
+ *
+ * Purpose:	Flushes a dirty fractal heap indirect block to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_iblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_indirect_t *iblock, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5WB_t      *wb = NULL;             /* Wrapped buffer for indirect block data */
+    uint8_t     iblock_buf[H5HF_IBLOCK_BUF_SIZE]; /* Buffer for indirect block */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(iblock);
+
+    if(iblock->cache_info.is_dirty) {
+        H5HF_hdr_t *hdr;                /* Shared fractal heap information */
+        uint8_t	*buf;                   /* Temporary buffer */
+        uint8_t *p;                     /* Pointer into raw data buffer */
+#ifndef NDEBUG
+        unsigned nchildren = 0;         /* Track # of children */
+        unsigned max_child = 0;         /* Track max. child entry used */
+#endif /* NDEBUG */
+        uint32_t metadata_chksum;       /* Computed metadata checksum value */
+        size_t u;                       /* Local index variable */
+
+        /* Get the pointer to the shared heap header */
+        hdr = iblock->hdr;
+
+        /* Set the shared heap header's file context for this operation */
+        hdr->f = f;
+
+        /* Wrap the local buffer for serialized indirect block */
+        if(NULL == (wb = H5WB_wrap(iblock_buf, sizeof(iblock_buf))))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for serialized indirect block */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to buffer for serialized indirect block */
+        p = buf;
+
+        /* Magic number */
+        HDmemcpy(p, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5HF_IBLOCK_VERSION;
+
+        /* Address of heap header for heap which owns this block */
+        H5F_addr_encode(f, &p, hdr->heap_addr);
+
+        /* Offset of block in heap */
+        UINT64ENCODE_VAR(p, iblock->block_off, hdr->heap_off_size);
+
+        /* Encode indirect block-specific fields */
+        for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
+            /* Encode child block address */
+            H5F_addr_encode(f, &p, iblock->ents[u].addr);
+
+            /* Check for heap with I/O filters */
+            if(hdr->filter_len > 0) {
+                /* Sanity check */
+                HDassert(iblock->filt_ents);
+
+                /* Encode extra information for direct blocks */
+                if(u < (hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width)) {
+                    /* Sanity check */
+                    /* (either both the address & size are defined or both are
+                     *  not defined)
+                     */
+                    HDassert((H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size)
+                        || (!H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size == 0));
+
+                    /* Size of filtered direct block */
+                    H5F_ENCODE_LENGTH(f, p, iblock->filt_ents[u].size);
+
+                    /* I/O filter mask for filtered direct block */
+                    UINT32ENCODE(p, iblock->filt_ents[u].filter_mask);
+                } /* end if */
+            } /* end if */
+
+#ifndef NDEBUG
+            /* Count child blocks */
+            if(H5F_addr_defined(iblock->ents[u].addr)) {
+                nchildren++;
+                if(u > max_child)
+                    max_child = u;
+            } /* end if */
+#endif /* NDEBUG */
+        } /* end for */
+
+        /* Compute checksum */
+        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+
+        /* Metadata checksum */
+        UINT32ENCODE(p, metadata_chksum);
+
+        /* Sanity check */
+        HDassert((size_t)(p - buf) == iblock->size);
+#ifndef NDEBUG
+        HDassert(nchildren == iblock->nchildren);
+        HDassert(max_child == iblock->max_child);
+#endif /* NDEBUG */
+
+        /* Check for needing to re-allocate indirect block from 'temp.' to 'normal' file space */
+        if(H5F_IS_TMP_ADDR(f, addr)) {
+            /* Sanity check */
+            HDassert(H5F_addr_eq(iblock->addr, addr));
+
+            /* Allocate 'normal' space for the new indirect block on disk */
+            if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+
+            /* Sanity check */
+            HDassert(!H5F_addr_eq(iblock->addr, addr));
+
+            /* Let the metadata cache know the block moved */
+            if(H5AC_move_entry(f, H5AC_FHEAP_IBLOCK, iblock->addr, addr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move indirect block")
+
+            /* Update the internal address for the block */
+            iblock->addr = addr;
+
+            /* Check for root indirect block */
+            if(NULL == iblock->parent) {
+                /* Update information about indirect block's location */
+                hdr->man_dtable.table_addr = addr;
+
+                /* Mark that heap header was modified */
+                if(H5HF_hdr_dirty(hdr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end if */
+            else {
+                H5HF_indirect_t *par_iblock;    /* Parent indirect block */
+                unsigned par_entry;             /* Entry in parent indirect block */
+
+                /* Get parent information */
+                par_iblock = iblock->parent;
+                par_entry = iblock->par_entry;
+
+                /* Update information about indirect block's location */
+                par_iblock->ents[par_entry].addr = addr;
+
+                /* Mark that parent was modified */
+                if(H5HF_iblock_dirty(par_iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end if */
+        } /* end if */
+
+        /* Indirect block must be in 'normal' file space now */
+        HDassert(!H5F_IS_TMP_ADDR(f, addr));
+
+	/* Write the indirect block */
+	if(H5F_block_write(f, H5FD_MEM_FHEAP_IBLOCK, addr, iblock->size, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap indirect block to disk")
+
+        /* Reset dirty flags */
+	iblock->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5HF_cache_iblock_dest(f, iblock) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_cache_iblock_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_iblock_dest
+ *
+ * Purpose:	Destroys a fractal heap indirect block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_iblock_dest(H5F_t *f, H5HF_indirect_t *iblock)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(iblock->rc == 0);
+    HDassert(iblock->hdr);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!iblock->cache_info.free_file_space_on_destroy || H5F_addr_defined(iblock->cache_info.addr));
+
+    /* Check for freeing file space for indirect block */
+    if(iblock->cache_info.free_file_space_on_destroy) {
+        /* Check if the indirect block is NOT currently allocated in temp. file space */
+        /* (temp. file space does not need to be freed) */
+        if(!H5F_IS_TMP_ADDR(f, iblock->cache_info.addr)) {
+            /* Release the space on disk */
+            /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+            if(H5MF_xfree(f, H5FD_MEM_FHEAP_IBLOCK, H5AC_dxpl_id, iblock->cache_info.addr, (hsize_t)iblock->size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap indirect block")
+        } /* end if */
+    } /* end if */
+
+    /* Destroy fractal heap indirect block */
+    if(H5HF_man_iblock_dest(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_iblock_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_iblock_clear
+ *
+ * Purpose:	Mark a fractal heap indirect block in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_iblock_clear(H5F_t *f, H5HF_indirect_t *iblock, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+
+    /* Reset the dirty flag.  */
+    iblock->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HF_cache_iblock_dest(f, iblock) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_iblock_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_iblock_size
+ *
+ * Purpose:	Compute the size in bytes of a fractal heap indirect block
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_iblock_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_indirect_t *iblock, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(iblock);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = iblock->size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_cache_iblock_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_dblock_load
+ *
+ * Purpose:	Loads a fractal heap direct block from the disk.
+ *
+ * Return:	Success:	Pointer to a new fractal heap direct block
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_direct_t *
+H5HF_cache_dblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5HF_dblock_cache_ud_t *udata = (H5HF_dblock_cache_ud_t *)_udata; /* pointer to user data */
+    H5HF_hdr_t          *hdr;           /* Shared fractal heap information */
+    H5HF_parent_t       *par_info;      /* Pointer to parent information */
+    H5HF_direct_t	*dblock = NULL; /* Direct block info */
+    const uint8_t	*p;             /* Pointer into raw data buffer */
+    haddr_t             heap_addr;      /* Address of heap header in the file */
+    H5HF_direct_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata != NULL);
+    HDassert(udata->f != NULL);
+    HDassert(udata->dblock_size > 0);
+
+    /* Allocate space for the fractal heap direct block */
+    if(NULL == (dblock = H5FL_MALLOC(H5HF_direct_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Get the pointer to the shared heap header */
+    par_info = (H5HF_parent_t *)(&(udata->par_info));
+    hdr = par_info->hdr;
+
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = udata->f;
+
+    /* Share common heap information */
+    dblock->hdr = hdr;
+    if(H5HF_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+
+    /* Set block's internal information */
+    dblock->size = udata->dblock_size;
+    dblock->file_size = 0;
+    dblock->blk_off_size = H5HF_SIZEOF_OFFSET_LEN(dblock->size);
+
+    /* Allocate block buffer */
+/* XXX: Change to using free-list factories */
+    if(NULL == (dblock->blk = H5FL_BLK_MALLOC(direct_block, (size_t)dblock->size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
+        H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+        size_t nbytes;          /* Number of bytes used in buffer, after applying reverse filters */
+        void *read_buf;         /* Pointer to buffer to read in */
+        size_t read_size;       /* Size of filtered direct block to read */
+        unsigned filter_mask;	/* Excluded filters for direct block */
+
+        /* Check for root direct block */
+        if(par_info->iblock == NULL) {
+            /* Sanity check */
+            HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+
+            /* Set up parameters to read filtered direct block */
+            read_size = hdr->pline_root_direct_size;
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5F_addr_eq(par_info->iblock->ents[par_info->entry].addr, addr));
+
+            /* Set up parameters to read filtered direct block */
+            read_size = par_info->iblock->filt_ents[par_info->entry].size;
+        } /* end else */
+
+        /* Allocate buffer to perform I/O filtering on */
+        if(NULL == (read_buf = H5MM_malloc(read_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed for pipeline buffer")
+
+        /* Read filtered direct block from disk */
+        if(H5F_block_read(f, H5FD_MEM_FHEAP_DBLOCK, addr, read_size, dxpl_id, read_buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap direct block")
+
+        /* Push direct block data through I/O filter pipeline */
+        nbytes = read_size;
+        filter_mask = udata->filter_mask;
+        if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, NULL, "output pipeline failed")
+
+        /* Sanity check */
+        HDassert(nbytes == dblock->size);
+
+        /* Copy un-filtered data into block's buffer */
+        HDmemcpy(dblock->blk, read_buf, dblock->size);
+
+        /* Release the read buffer */
+        H5MM_xfree(read_buf);
+    } /* end if */
+    else {
+        /* Read direct block from disk */
+        if(H5F_block_read(f, H5FD_MEM_FHEAP_DBLOCK, addr, dblock->size, dxpl_id, dblock->blk) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap direct block")
+    } /* end else */
+
+    /* Start decoding direct block */
+    p = dblock->blk;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap direct block signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*p++ != H5HF_DBLOCK_VERSION)
+	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
+
+    /* Address of heap that owns this block (just for file integrity checks) */
+    H5F_addr_decode(udata->f, &p, &heap_addr);
+    if(H5F_addr_ne(heap_addr, hdr->heap_addr))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
+
+    /* Address of parent block */
+    dblock->parent = par_info->iblock;
+    dblock->par_entry = par_info->entry;
+    if(dblock->parent) {
+        /* Share parent block */
+        if(H5HF_iblock_incr(dblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared indirect block")
+    } /* end if */
+
+    /* Offset of heap within the heap's address space */
+    UINT64DECODE_VAR(p, dblock->block_off, hdr->heap_off_size);
+
+    /* Decode checksum on direct block, if requested */
+    if(hdr->checksum_dblocks) {
+        uint32_t stored_chksum;         /* Metadata checksum value */
+        uint32_t computed_chksum;       /* Computed metadata checksum value */
+
+        /* Metadata checksum */
+        UINT32DECODE(p, stored_chksum);
+
+        /* Reset checksum field, for computing the checksum */
+        /* (Casting away const OK - QAK) */
+        HDmemset((uint8_t *)p - H5HF_SIZEOF_CHKSUM, 0, (size_t)H5HF_SIZEOF_CHKSUM);
+
+        /* Compute checksum on entire direct block */
+        computed_chksum = H5_checksum_metadata(dblock->blk, dblock->size, 0);
+
+        /* Verify checksum */
+        if(stored_chksum != computed_chksum)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap direct block")
+    } /* end if */
+
+    /* Sanity check */
+    HDassert((size_t)(p - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
+
+    /* Set return value */
+    ret_value = dblock;
+
+done:
+    if(!ret_value && dblock)
+        if(H5HF_man_dblock_dest(dblock) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_dblock_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_dblock_flush
+ *
+ * Purpose:	Flushes a dirty fractal heap direct block to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_dblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_direct_t *dblock, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(dblock);
+
+    if(dblock->cache_info.is_dirty) {
+        H5HF_hdr_t *hdr;        /* Shared fractal heap information */
+        hbool_t at_tmp_addr = H5F_IS_TMP_ADDR(f, addr);     /* Flag to indicate direct block is at temporary address */
+        void *write_buf;        /* Pointer to buffer to write out */
+        size_t write_size;      /* Size of buffer to write out */
+        uint8_t *p;             /* Pointer into raw data buffer */
+
+        /* Get the pointer to the shared heap header */
+        hdr = dblock->hdr;
+
+        /* Set the shared heap header's file context for this operation */
+        hdr->f = f;
+
+        HDassert(dblock->blk);
+        p = dblock->blk;
+
+        /* Magic number */
+        HDmemcpy(p, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version # */
+        *p++ = H5HF_DBLOCK_VERSION;
+
+        /* Address of heap header for heap which owns this block */
+        H5F_addr_encode(f, &p, hdr->heap_addr);
+
+        /* Offset of block in heap */
+        UINT64ENCODE_VAR(p, dblock->block_off, hdr->heap_off_size);
+
+        /* Metadata checksum */
+        if(hdr->checksum_dblocks) {
+            uint32_t metadata_chksum;       /* Computed metadata checksum value */
+
+            /* Clear the checksum field, to compute the checksum */
+            HDmemset(p, 0, (size_t)H5HF_SIZEOF_CHKSUM);
+
+            /* Compute checksum on entire direct block */
+            metadata_chksum = H5_checksum_metadata(dblock->blk, dblock->size, 0);
+
+            /* Metadata checksum */
+            UINT32ENCODE(p, metadata_chksum);
+        } /* end if */
+
+        /* Sanity check */
+        HDassert((size_t)(p - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
+
+        /* Check for I/O filters on this heap */
+        if(hdr->filter_len > 0) {
+            H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+            size_t nbytes;                      /* Number of bytes used */
+            unsigned filter_mask = 0;           /* Filter mask for block */
+
+            /* Allocate buffer to perform I/O filtering on */
+            write_size = dblock->size;
+            if(NULL == (write_buf = H5MM_malloc(write_size)))
+                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+            HDmemcpy(write_buf, dblock->blk, write_size);
+
+            /* Push direct block data through I/O filter pipeline */
+            nbytes = write_size;
+            if(H5Z_pipeline(&(hdr->pline), 0, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &write_size, &write_buf) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "output pipeline failed")
+
+            /* Use the compressed number of bytes as the size to write */
+            write_size = nbytes;
+
+            /* Check for root direct block */
+            if(dblock->parent == NULL) {
+                hbool_t hdr_changed = FALSE;    /* Whether the header information changed */
+
+                /* Sanity check */
+                HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+                HDassert(hdr->pline_root_direct_size > 0);
+
+                /* Check if the filter mask changed */
+                if(hdr->pline_root_direct_filter_mask != filter_mask) {
+                    hdr->pline_root_direct_filter_mask = filter_mask;
+                    hdr_changed = TRUE;
+                } /* end if */
+
+                /* Check if we need to re-size the block on disk */
+                if(hdr->pline_root_direct_size != write_size || at_tmp_addr) {
+                    /* Check if the direct block is NOT currently allocated in temp. file space */
+                    /* (temp. file space does not need to be freed) */
+                    if(!at_tmp_addr) {
+                        /* Release direct block's current disk space */
+                        if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)hdr->pline_root_direct_size) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+                    } /* end if */
+
+                    /* Allocate space for the compressed direct block */
+                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                    /* Let the metadata cache know, if the block moved */
+                    if(!H5F_addr_eq(hdr->man_dtable.table_addr, addr))
+                        if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, addr) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                    /* Update information about compressed direct block's location & size */
+                    hdr->man_dtable.table_addr = addr;
+                    hdr->pline_root_direct_size = write_size;
+
+                    /* Note that heap header was modified */
+                    hdr_changed = TRUE;
+                } /* end if */
+
+                /* Check if heap header was modified */
+                if(hdr_changed)
+                    if(H5HF_hdr_dirty(hdr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end if */
+            else {
+                hbool_t par_changed = FALSE;    /* Whether the parent's information changed */
+                H5HF_indirect_t *par_iblock;    /* Parent indirect block */
+                unsigned par_entry;             /* Entry in parent indirect block */
+
+                /* Get parent information */
+                par_iblock = dblock->parent;
+                par_entry = dblock->par_entry;
+
+                /* Sanity check */
+                HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+                HDassert(par_iblock->filt_ents[par_entry].size > 0);
+
+                /* Check if the filter mask changed */
+                if(par_iblock->filt_ents[par_entry].filter_mask != filter_mask) {
+                    par_iblock->filt_ents[par_entry].filter_mask = filter_mask;
+                    par_changed = TRUE;
+                } /* end if */
+
+                /* Check if we need to re-size the block on disk */
+                if(par_iblock->filt_ents[par_entry].size != write_size || at_tmp_addr) {
+                    /* Check if the direct block is NOT currently allocated in temp. file space */
+                    /* (temp. file space does not need to be freed) */
+                    if(!at_tmp_addr) {
+                        /* Release direct block's current disk space */
+                        if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)par_iblock->filt_ents[par_entry].size) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+                    } /* end if */
+
+                    /* Allocate space for the compressed direct block */
+                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                    /* Let the metadata cache know, if the block moved */
+                    if(!H5F_addr_eq(par_iblock->ents[par_entry].addr, addr))
+                        if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, addr) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                    /* Update information about compressed direct block's location & size */
+                    par_iblock->ents[par_entry].addr = addr;
+                    par_iblock->filt_ents[par_entry].size = write_size;
+
+                    /* Note that parent was modified */
+                    par_changed = TRUE;
+                } /* end if */
+
+                /* Check if parent was modified */
+                if(par_changed)
+                    if(H5HF_iblock_dirty(par_iblock) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end else */
+        } /* end if */
+        else {
+            write_buf = dblock->blk;
+            write_size = dblock->size;
+
+            /* Check for needing to re-allocate direct block from 'temp.' to 'normal' file space */
+            if(at_tmp_addr) {
+                /* Check for root direct block */
+                if(NULL == dblock->parent) {
+                    /* Sanity check */
+                    HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+
+                    /* Allocate 'normal' space for the direct block */
+                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                    /* Sanity check */
+                    HDassert(!H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+
+                    /* Let the metadata cache know the block moved */
+                    if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, addr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                    /* Update information about direct block's location */
+                    hdr->man_dtable.table_addr = addr;
+
+                    /* Mark that heap header was modified */
+                    if(H5HF_hdr_dirty(hdr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+                } /* end if */
+                else {
+                    H5HF_indirect_t *par_iblock;    /* Parent indirect block */
+                    unsigned par_entry;             /* Entry in parent indirect block */
+
+                    /* Get parent information */
+                    par_iblock = dblock->parent;
+                    par_entry = dblock->par_entry;
+
+                    /* Sanity check */
+                    HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+
+                    /* Allocate 'normal' space for the direct block */
+                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                    /* Sanity check */
+                    HDassert(!H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+
+                    /* Let the metadata cache know the block moved */
+                    if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, addr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                    /* Update information about direct block's location */
+                    par_iblock->ents[par_entry].addr = addr;
+
+                    /* Mark that parent was modified */
+                    if(H5HF_iblock_dirty(par_iblock) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+                } /* end else */
+            } /* end if */
+        } /* end else */
+
+        /* Direct block must be in 'normal' file space now */
+        HDassert(!H5F_IS_TMP_ADDR(f, addr));
+
+	/* Write the direct block */
+	if(H5F_block_write(f, H5FD_MEM_FHEAP_DBLOCK, addr, write_size, dxpl_id, write_buf) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap direct block to disk")
+
+        /* Release the write buffer, if it was allocated */
+        if(write_buf != dblock->blk)
+            H5MM_xfree(write_buf);
+
+	dblock->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5HF_cache_dblock_dest(f, dblock) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_cache_dblock_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_dblock_dest
+ *
+ * Purpose:	Destroys a fractal heap direct block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dblock);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!dblock->cache_info.free_file_space_on_destroy || H5F_addr_defined(dblock->cache_info.addr));
+
+    /* Check for freeing file space for direct block */
+    if(dblock->cache_info.free_file_space_on_destroy) {
+        /* Sanity check */
+        HDassert(dblock->file_size > 0);
+
+        /* Check if the direct block is NOT currently allocated in temp. file space */
+        /* (temp. file space does not need to be freed) */
+        if(!H5F_IS_TMP_ADDR(f, dblock->cache_info.addr)) {
+            /* Release the space on disk */
+            /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+            if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, H5AC_dxpl_id, dblock->cache_info.addr, dblock->file_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+        } /* end if */
+    } /* end if */
+
+    /* Destroy fractal heap direct block */
+    if(H5HF_man_dblock_dest(dblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_dblock_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_dblock_clear
+ *
+ * Purpose:	Mark a fractal heap direct block in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_dblock_clear(H5F_t *f, H5HF_direct_t *dblock, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dblock);
+
+    /* Reset the dirty flag.  */
+    dblock->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HF_cache_dblock_dest(f, dblock) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_cache_dblock_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cache_dblock_size
+ *
+ * Purpose:	Compute the size in bytes of a fractal heap direct block
+ *		on disk, and return it in *size_ptr.  On failure,
+ *		the value of *size_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_cache_dblock_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_direct_t *dblock, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(dblock);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = dblock->size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_cache_dblock_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFdbg.c b/gatb-core/thirdparty/hdf5/src/H5HFdbg.c
new file mode 100644
index 0000000..41e317d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFdbg.c
@@ -0,0 +1,863 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFdbg.c
+ *			Feb 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Dump debugging information about a fractal heap
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#define H5HF_DEBUGGING          /* Need access to fractal heap debugging routines */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for direct block debugging iterator callback */
+typedef struct {
+    FILE *stream;               /* Stream for output */
+    int indent;                 /* Indention amount */
+    int fwidth;                 /* Field width mount */
+    haddr_t dblock_addr;        /* Direct block's address */
+    hsize_t dblock_size;        /* Direct block's size */
+    uint8_t *marker;            /* 'Marker' array for free space */
+    size_t sect_count;          /* Number of free space sections in block */
+    size_t amount_free;         /* Amount of free space in block */
+} H5HF_debug_iter_ud1_t;
+
+/* User data for free space section iterator callback */
+typedef struct {
+    H5FS_t *fspace;             /* Free space manager */
+    FILE *stream;               /* Stream for output */
+    int indent;                 /* Indention amount */
+    int fwidth;                 /* Field width mount */
+} H5HF_debug_iter_ud2_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5HF_dtable_debug(const H5HF_dtable_t *dtable, FILE *stream,
+    int indent, int fwidth);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_debug
+ *
+ * Purpose:	Prints debugging info about a doubling table
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 28 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_dtable_debug(const H5HF_dtable_t *dtable, FILE *stream, int indent, int fwidth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /*
+     * Print the values.
+     */
+    /* Creation parameter values */
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Doubling table width:",
+	      dtable->cparam.width);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Starting block size:",
+	      dtable->cparam.start_block_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Max. direct block size:",
+	      dtable->cparam.max_direct_size);
+    HDfprintf(stream, "%*s%-*s %u (bits)\n", indent, "", fwidth,
+	      "Max. index size:",
+	      dtable->cparam.max_index);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Starting # of rows in root indirect block:",
+	      dtable->cparam.start_root_rows);
+
+    /* Run-time varying parameter values */
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Table's root address:",
+	      dtable->table_addr);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Current # of rows in root indirect block:",
+	      dtable->curr_root_rows);
+
+    /* Computed values */
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max. # of rows in root indirect block:",
+	      dtable->max_root_rows);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max. # of direct rows in any indirect block:",
+	      dtable->max_direct_rows);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "# of bits for IDs in first row:",
+	      dtable->first_row_bits);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "# of IDs in first row:",
+	      dtable->num_id_first_row);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dtable_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_print
+ *
+ * Purpose:	Prints info about a fractal heap header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 23 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5HF_hdr_print(const H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t dump_internal, FILE *stream, int indent, int fwidth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFractal Heap Header...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Heap is:",
+	      hdr->man_dtable.curr_root_rows > 0 ? "Indirect" : "Direct");
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Objects stored in 'debugging' format:",
+	      hdr->debug_objs);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "'Write once' flag:",
+	      hdr->write_once);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "'Huge' object IDs have wrapped:",
+	      hdr->huge_ids_wrapped);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Free space in managed blocks:",
+	      hdr->total_man_free);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Managed space data block size:",
+	      hdr->man_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Total managed space allocated:",
+	      hdr->man_alloc_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Offset of managed space iterator:",
+	      hdr->man_iter_off);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of managed objects in heap:",
+	      hdr->man_nobjs);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of free space manager for managed blocks:",
+	      hdr->fs_addr);
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	      "Max. size of managed object:",
+	      (unsigned long)hdr->max_man_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "'Huge' object space used:",
+	      hdr->huge_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of 'huge' objects in heap:",
+	      hdr->huge_nobjs);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "ID of next 'huge' object:",
+	      hdr->huge_next_id);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of v2 B-tree for 'huge' objects:",
+	      hdr->huge_bt2_addr);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "'Tiny' object space used:",
+	      hdr->tiny_size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of 'tiny' objects in heap:",
+	      hdr->tiny_nobjs);
+
+    HDfprintf(stream, "%*sManaged Objects Doubling-Table Info...\n", indent, "");
+    H5HF_dtable_debug(&hdr->man_dtable, stream, indent + 3, MAX(0, fwidth - 3));
+
+    /* Print information about I/O filters */
+    if(hdr->filter_len > 0) {
+        HDfprintf(stream, "%*sI/O filter Info...\n", indent, "");
+        if(hdr->man_dtable.curr_root_rows == 0) {
+            HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Compressed size of root direct block:",
+                      hdr->pline_root_direct_size);
+            HDfprintf(stream, "%*s%-*s %x\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Filter mask for root direct block:",
+                      hdr->pline_root_direct_filter_mask);
+        } /* end if */
+        H5O_debug_id(H5O_PLINE_ID, hdr->f, dxpl_id, &(hdr->pline), stream,
+                             indent + 3, MAX(0, fwidth - 3));
+    } /* end if */
+
+    /* Print internal (runtime) information, if requested */
+    if(dump_internal) {
+        HDfprintf(stream, "%*sFractal Heap Header Internal Information:\n", indent, "");
+
+        /* Dump root iblock, if there is one */
+        HDfprintf(stream, "%*s%-*s %x\n", indent + 3, "", MAX(0, fwidth - 3),
+                  "Root indirect block flags:",
+                  hdr->root_iblock_flags);
+        HDfprintf(stream, "%*s%-*s %p\n", indent + 3, "", MAX(0, fwidth - 3),
+                  "Root indirect block pointer:",
+                  hdr->root_iblock);
+        if(hdr->root_iblock)
+            H5HF_iblock_print(hdr->root_iblock, dump_internal, stream, indent + 3, fwidth);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5HF_hdr_print() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_debug
+ *
+ * Purpose:	Prints debugging info about a fractal heap header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth)
+{
+    H5HF_hdr_t	*hdr = NULL;             /* Fractal heap header info */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Load the fractal heap header */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, addr, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+    /* Print the information about the heap's header */
+    H5HF_hdr_print(hdr, dxpl_id, FALSE, stream, indent, fwidth);
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dblock_debug_cb
+ *
+ * Purpose:	Detect free space within a direct block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_dblock_debug_cb(H5FS_section_info_t *_sect, void *_udata)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;       /* Section to dump info */
+    H5HF_debug_iter_ud1_t *udata = (H5HF_debug_iter_ud1_t *)_udata;         /* User data for callbacks */
+    haddr_t sect_start, sect_end;       /* Section's beginning and ending offsets */
+    haddr_t dblock_start, dblock_end;   /* Direct block's beginning and ending offsets */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(udata);
+
+    /* Set up some local variables, for convenience */
+    sect_start = sect->sect_info.addr;
+    sect_end = (sect->sect_info.addr + sect->sect_info.size) - 1;
+    HDassert(sect_end >= sect_start);
+    dblock_start = udata->dblock_addr;
+    dblock_end = (udata->dblock_addr + udata->dblock_size) - 1;
+    HDassert(dblock_end >= dblock_start);
+
+    /* Check for overlap between free space section & direct block */
+    if((sect_start <= dblock_end && sect_end >=dblock_start) || /* section within or overlaps w/beginning of direct block*/
+            (sect_start <= dblock_end && sect_end >=dblock_end)) {  /* section overlaps w/end of direct block */
+        char temp_str[32];      /* Temporary string for formatting */
+        size_t start, end;      /* Start & end of the overlapping area */
+        size_t len;             /* Length of the overlapping area */
+        size_t overlap;         /* Track any overlaps */
+        size_t u;               /* Local index variable */
+
+        /* Calculate the starting & ending */
+        if(sect_start < dblock_start)
+            start = 0;
+        else
+            H5_CHECKED_ASSIGN(start, size_t, (sect_start - dblock_start), hsize_t)
+        if(sect_end > dblock_end)
+            H5_CHECKED_ASSIGN(end, size_t, udata->dblock_size, hsize_t)
+        else
+            H5_CHECKED_ASSIGN(end, size_t, ((sect_end - dblock_start) + 1), hsize_t)
+
+        /* Calculate the length */
+        len = end - start;
+
+        HDsnprintf(temp_str, sizeof(temp_str), "Section #%u:", (unsigned)udata->sect_count);
+	HDfprintf(udata->stream, "%*s%-*s %8Zu, %8Zu\n", udata->indent + 3, "", MAX(0, udata->fwidth - 9),
+		temp_str,
+		start, len);
+        udata->sect_count++;
+
+        /* Mark this node's free space & check for overlaps w/other sections */
+        overlap = 0;
+        for(u = start; u < end; u++) {
+            if(udata->marker[u])
+                overlap++;
+            udata->marker[u] = 1;
+        } /* end for */
+
+        /* Flag overlaps */
+        if (overlap)
+            fprintf(udata->stream, "***THAT FREE BLOCK OVERLAPPED A PREVIOUS ONE!\n");
+        else
+            udata->amount_free += len;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dblock_debug_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dblock_debug
+ *
+ * Purpose:	Prints debugging info about a fractal heap direct block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 28 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
+    int indent, int fwidth, haddr_t hdr_addr, size_t block_size)
+{
+    H5HF_hdr_t	*hdr = NULL;            /* Fractal heap header info */
+    H5HF_direct_t *dblock = NULL;       /* Fractal heap direct block info */
+    size_t	blk_prefix_size;        /* Size of prefix for block */
+    size_t	amount_free;            /* Amount of free space in block */
+    uint8_t	*marker = NULL;         /* Track free space for block */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(block_size > 0);
+
+    /* Load the fractal heap header */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+    /*
+     * Load the heap direct block
+     */
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, addr, block_size, NULL, 0, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap direct block")
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFractal Heap Direct Block...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of fractal heap that owns this block:",
+	      hdr->heap_addr);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Offset of direct block in heap:",
+	      dblock->block_off);
+    blk_prefix_size = H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of block header:",
+              blk_prefix_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of block offsets:",
+	      dblock->blk_off_size);
+
+    /* Allocate space for the free space markers */
+    if(NULL == (marker = (uint8_t *)H5MM_calloc(dblock->size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the free space information for the heap */
+    if(H5HF_space_start(hdr, dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space")
+
+    /* If there is a free space manager for the heap, check for sections that overlap this block */
+    if(hdr->fspace) {
+        H5HF_debug_iter_ud1_t udata;        /* User data for callbacks */
+
+        /* Prepare user data for section iteration callback */
+        udata.stream = stream;
+        udata.indent = indent;
+        udata.fwidth = fwidth;
+        udata.dblock_addr = dblock->block_off;
+        udata.dblock_size = block_size;
+        udata.marker = marker;
+        udata.sect_count = 0;
+        udata.amount_free = 0;
+
+        /* Print header */
+        HDfprintf(stream, "%*sFree Blocks (offset, size):\n", indent, "");
+
+        /* Iterate over the free space sections, to detect overlaps with this block */
+        if(H5FS_sect_iterate(f, dxpl_id, hdr->fspace, H5HF_dblock_debug_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
+
+        /* Close the free space information */
+        if(H5HF_space_close(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
+
+        /* Keep the amount of space free */
+        amount_free = udata.amount_free;
+
+        /* Check for no free space */
+        if(amount_free == 0)
+            HDfprintf(stream, "%*s<none>\n", indent + 3, "");
+    } /* end if */
+    else
+        amount_free = 0;
+
+    HDfprintf(stream, "%*s%-*s %.2f%%\n", indent, "", fwidth,
+            "Percent of available space for data used:",
+            ((double)100.0f * (double)((dblock->size - blk_prefix_size) - amount_free) / (double)(dblock->size - blk_prefix_size)));
+
+    /*
+     * Print the data in a VMS-style octal dump.
+     */
+    H5_buffer_dump(stream, indent, dblock->blk, marker, (size_t)0, dblock->size);
+
+done:
+    if(dblock && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_DBLOCK, addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap direct block")
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header")
+    H5MM_xfree(marker);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_dblock_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_print
+ *
+ * Purpose:	Prints debugging info about a fractal heap indirect block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 23 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5HF_iblock_print(const H5HF_indirect_t *iblock,
+    hbool_t dump_internal, FILE *stream, int indent, int fwidth)
+{
+    const H5HF_hdr_t *hdr;              /* Pointer to heap's header */
+    char temp_str[64];                  /* Temporary string, for formatting */
+    size_t	u, v;                   /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(iblock->hdr);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Set up convenience variables */
+    hdr = iblock->hdr;
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFractal Heap Indirect Block...\n", indent, "");
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of fractal heap that owns this block:",
+	      hdr->heap_addr);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Offset of indirect block in heap:",
+	      iblock->block_off);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of indirect block:",
+	      iblock->size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Current # of rows:",
+	      iblock->nrows);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max. # of rows:",
+	      iblock->max_rows);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max direct block rows:",
+	      hdr->man_dtable.max_direct_rows);
+
+    /* Print the entry tables */
+    if(hdr->filter_len > 0)
+        HDfprintf(stream, "%*sDirect Block Entries: (address/compressed size/filter mask)\n", indent, "");
+    else
+        HDfprintf(stream, "%*sDirect Block Entries: (address)\n", indent, "");
+    for(u = 0; u < hdr->man_dtable.max_direct_rows && u < iblock->nrows; u++) {
+        HDsnprintf(temp_str, sizeof(temp_str), "Row #%u: (block size: %lu)", (unsigned)u, (unsigned long)hdr->man_dtable.row_block_size[u]);
+        HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                temp_str);
+        for(v = 0; v < hdr->man_dtable.cparam.width; v++) {
+            size_t off = (u * hdr->man_dtable.cparam.width) + v;
+
+            HDsnprintf(temp_str, sizeof(temp_str), "Col #%u:", (unsigned)v);
+            if(hdr->filter_len > 0)
+                HDfprintf(stream, "%*s%-*s %9a/%6Zu/%x\n", indent + 6, "", MAX(0, fwidth - 6),
+                        temp_str,
+                        iblock->ents[off].addr,
+                        iblock->filt_ents[off].size,
+                        iblock->filt_ents[off].filter_mask);
+            else
+                HDfprintf(stream, "%*s%-*s %9a\n", indent + 6, "", MAX(0, fwidth - 6),
+                        temp_str,
+                        iblock->ents[off].addr);
+        } /* end for */
+    } /* end for */
+    HDfprintf(stream, "%*sIndirect Block Entries:\n", indent, "");
+    if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+        unsigned    first_row_bits;         /* Number of bits used bit addresses in first row */
+        unsigned    num_indirect_rows;      /* Number of rows of blocks in each indirect block */
+
+        first_row_bits = H5VM_log2_of2((uint32_t)hdr->man_dtable.cparam.start_block_size) +
+                            H5VM_log2_of2(hdr->man_dtable.cparam.width);
+        for(u = hdr->man_dtable.max_direct_rows; u < iblock->nrows; u++) {
+            num_indirect_rows = (H5VM_log2_gen(hdr->man_dtable.row_block_size[u]) - first_row_bits) + 1;
+            HDsnprintf(temp_str, sizeof(temp_str), "Row #%u: (# of rows: %u)", (unsigned)u, num_indirect_rows);
+            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                    temp_str);
+            for(v = 0; v < hdr->man_dtable.cparam.width; v++) {
+                size_t off = (u * hdr->man_dtable.cparam.width) + v;
+
+                HDsnprintf(temp_str, sizeof(temp_str), "Col #%u:", (unsigned)v);
+                HDfprintf(stream, "%*s%-*s %9a\n", indent + 6, "", MAX(0, fwidth - 6),
+                        temp_str,
+                        iblock->ents[off].addr);
+            } /* end for */
+        } /* end for */
+    } /* end if */
+    else
+        HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                  "<none>");
+
+    /* Print internal (runtime) information, if requested */
+    if(dump_internal) {
+        HDfprintf(stream, "%*sFractal Indirect Block Internal Information:\n", indent, "");
+
+        /* Print general information */
+        HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", MAX(0, fwidth - 3),
+                  "Reference count:",
+                  iblock->rc);
+
+        /* Print parent's information */
+        HDfprintf(stream, "%*s%-*s %p\n", indent + 3, "", MAX(0, fwidth - 3),
+                  "Parent indirect block address:",
+                  iblock->parent);
+        if(iblock->parent)
+            H5HF_iblock_print(iblock->parent, TRUE, stream, indent + 6, fwidth);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5HF_iblock_print() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_debug
+ *
+ * Purpose:	Prints debugging info about a fractal heap indirect block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
+    int indent, int fwidth, haddr_t hdr_addr, unsigned nrows)
+{
+    H5HF_hdr_t	*hdr = NULL;            /* Fractal heap header info */
+    H5HF_indirect_t *iblock = NULL;     /* Fractal heap direct block info */
+    hbool_t did_protect;                /* Whether we protected the indirect block or not */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(nrows > 0);
+
+    /* Load the fractal heap header */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+    /*
+     * Load the heap indirect block
+     */
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, addr, nrows, NULL, 0, FALSE, H5AC_READ, &did_protect)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block")
+
+    /* Print the information about the heap's indirect block */
+    H5HF_iblock_print(iblock, FALSE, stream, indent, fwidth);
+
+done:
+    if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap direct block")
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sects_debug_cb
+ *
+ * Purpose:	Prints debugging info about a free space section for a fractal heap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sects_debug_cb(H5FS_section_info_t *_sect, void *_udata)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;       /* Section to dump info */
+    H5HF_debug_iter_ud2_t *udata = (H5HF_debug_iter_ud2_t *)_udata;         /* User data for callbacks */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(udata);
+
+    /* Print generic section information */
+    HDfprintf(udata->stream, "%*s%-*s %s\n", udata->indent, "", udata->fwidth,
+	      "Section type:",
+	      (sect->sect_info.type == H5HF_FSPACE_SECT_SINGLE ? "single" :
+                  (sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW ? "first row" :
+                  (sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW ? "normal row" : "unknown"))));
+    HDfprintf(udata->stream, "%*s%-*s %a\n", udata->indent, "", udata->fwidth,
+	      "Section address:",
+	      sect->sect_info.addr);
+    HDfprintf(udata->stream, "%*s%-*s %Hu\n", udata->indent, "", udata->fwidth,
+	      "Section size:",
+	      sect->sect_info.size);
+#ifdef QAK
+    HDfprintf(udata->stream, "%*s%-*s %s\n", udata->indent, "", udata->fwidth,
+	      "Section state:",
+	      (sect->sect_info.state == H5FS_SECT_LIVE ? "live" : "serialized"));
+#endif /* QAK */
+
+    /* Dump section-specific debugging information */
+    if(H5FS_sect_debug(udata->fspace, _sect, udata->stream, udata->indent + 3, MAX(0, udata->fwidth - 3)) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't dump section's debugging info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sects_debug_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sects_debug
+ *
+ * Purpose:	Prints debugging info about free space sections for a fractal heap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr,
+    FILE *stream, int indent, int fwidth)
+{
+    H5HF_hdr_t	*hdr = NULL;            /* Fractal heap header info */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fh_addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Load the fractal heap header */
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
+
+    /* Initialize the free space information for the heap */
+    if(H5HF_space_start(hdr, dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space")
+
+    /* If there is a free space manager for the heap, iterate over them */
+    if(hdr->fspace) {
+        H5HF_debug_iter_ud2_t udata;        /* User data for callbacks */
+
+        /* Prepare user data for section iteration callback */
+        udata.fspace = hdr->fspace;
+        udata.stream = stream;
+        udata.indent = indent;
+        udata.fwidth = fwidth;
+
+        /* Iterate over all the free space sections */
+        if(H5FS_sect_iterate(f, dxpl_id, hdr->fspace, H5HF_sects_debug_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
+
+        /* Close the free space information */
+        if(H5HF_space_close(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
+    } /* end if */
+
+done:
+    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sects_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFdblock.c b/gatb-core/thirdparty/hdf5/src/H5HFdblock.c
new file mode 100644
index 0000000..97a519a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFdblock.c
@@ -0,0 +1,716 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFdblock.c
+ *			Apr 10 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Direct block routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5HF_direct_t struct */
+H5FL_DEFINE(H5HF_direct_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_create
+ *
+ * Purpose:	Allocate & initialize a managed direct block
+ *
+ * Return:	Pointer to new direct block on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblock,
+    unsigned par_entry, haddr_t *addr_p, H5HF_free_section_t **ret_sec_node)
+{
+    H5HF_free_section_t *sec_node; /* Pointer to free space section for block */
+    H5HF_direct_t *dblock = NULL;       /* Pointer to direct block */
+    haddr_t dblock_addr;                /* Direct block's address */
+    size_t free_space;                  /* Free space in new block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /*
+     * Allocate file and memory data structures.
+     */
+    if(NULL == (dblock = H5FL_MALLOC(H5HF_direct_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fractal heap direct block")
+
+    /* Reset the metadata cache info for the heap header */
+    HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Share common heap information */
+    dblock->hdr = hdr;
+    if(H5HF_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared heap header")
+
+    /* Set info for direct block */
+    if(par_iblock) {
+        unsigned par_row = par_entry / hdr->man_dtable.cparam.width;    /* Row for block */
+
+        /* Compute offset & size, based on parent's information */
+        dblock->block_off = par_iblock->block_off;
+        dblock->block_off += hdr->man_dtable.row_block_off[par_row];
+        dblock->block_off += hdr->man_dtable.row_block_size[par_row] * (par_entry % hdr->man_dtable.cparam.width);
+        H5_CHECKED_ASSIGN(dblock->size, size_t, hdr->man_dtable.row_block_size[par_row], hsize_t);
+    } /* end if */
+    else {
+        /* Must be the root direct block */
+        dblock->block_off = 0;
+        dblock->size = hdr->man_dtable.cparam.start_block_size;
+    } /* end else */
+    dblock->file_size = 0;
+    dblock->blk_off_size = H5HF_SIZEOF_OFFSET_LEN(dblock->size);
+    free_space = dblock->size - H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+
+    /* Allocate buffer for block */
+/* XXX: Change to using free-list factories */
+    if((dblock->blk = H5FL_BLK_MALLOC(direct_block, dblock->size)) == NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(dblock->blk, 0, dblock->size);
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Allocate [temporary] space for the direct block on disk */
+    if(H5F_USE_TMP_SPACE(hdr->f)) {
+        if(HADDR_UNDEF == (dblock_addr = H5MF_alloc_tmp(hdr->f, (hsize_t)dblock->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+    } /* end if */
+    else {
+        if(HADDR_UNDEF == (dblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)dblock->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+    } /* end else */
+
+    /* Attach to parent indirect block, if there is one */
+    dblock->parent = par_iblock;
+    if(dblock->parent)
+        if(H5HF_man_iblock_attach(dblock->parent, par_entry, dblock_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach direct block to parent indirect block")
+    dblock->par_entry = par_entry;
+
+    /* Create a new 'single' section for the free space in the block */
+    if(NULL == (sec_node = H5HF_sect_single_new((dblock->block_off + H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr)),
+            free_space, dblock->parent, dblock->par_entry)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create section for new direct block's free space")
+
+    /* Check what to do with section node */
+    if(ret_sec_node)
+        /* Pass back the pointer to the section instead of adding it to the free list */
+        *ret_sec_node = sec_node;
+    else {
+        /* Add new free space to the heap's list of space */
+        if(H5HF_space_add(hdr, dxpl_id, sec_node, 0) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add direct block free space to global list")
+    } /* end else */
+
+    /* Cache the new fractal heap direct block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add fractal heap direct block to cache")
+
+    /* Increase the allocated heap size */
+    if(H5HF_hdr_inc_alloc(hdr, dblock->size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't increase allocated heap size")
+
+    /* Set the address of of direct block, if requested */
+    if(addr_p)
+        *addr_p = dblock_addr;
+
+done:
+    if(ret_value < 0)
+        if(dblock)
+            if(H5HF_man_dblock_dest(dblock) < 0)
+                HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_destroy
+ *
+ * Purpose:	Destroy a managed direct block
+ *
+ * Note:	This routine does _not_ insert a range section for the
+ *              destroyed direct block, that must be handled by the
+ *              caller.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_direct_t *dblock,
+    haddr_t dblock_addr)
+{
+    hsize_t dblock_size;                /* Size of direct block on disk */
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;      /* Flags for unprotecting indirect block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(dblock);
+
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
+        /* Check for root direct block */
+        if(dblock->parent == NULL)
+            /* Get direct block's actual size */
+            dblock_size = (hsize_t)hdr->pline_root_direct_size;
+        else {
+            H5HF_indirect_t *par_iblock;    /* Parent indirect block */
+            unsigned par_entry;             /* Entry in parent indirect block */
+
+            /* Get parent information */
+            par_iblock = dblock->parent;
+            par_entry = dblock->par_entry;
+
+            /* Get direct block's actual size */
+            dblock_size = (hsize_t)par_iblock->filt_ents[par_entry].size;
+        } /* end else */
+    } /* end if */
+    else
+        dblock_size = (hsize_t)dblock->size;
+
+    /* Check for root direct block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        /* Sanity check */
+        HDassert(hdr->man_dtable.table_addr == dblock_addr);
+        HDassert(hdr->man_dtable.cparam.start_block_size == dblock->size);
+
+        /* Sanity check block iterator */
+        HDassert(!H5HF_man_iter_ready(&hdr->next_block));
+
+        /* Reset root pointer information */
+        hdr->man_dtable.table_addr = HADDR_UNDEF;
+
+        /* Reset header information back to "empty heap" state */
+        if(H5HF_hdr_empty(hdr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't make heap empty")
+    } /* end if */
+    else {
+        /* Adjust heap statistics */
+        hdr->man_alloc_size -= dblock->size;
+
+        /* Check for this direct block being the highest in the heap */
+        if((dblock->block_off + dblock->size) == hdr->man_iter_off) {
+            /* Move 'next block' iterator backwards (may shrink heap) */
+            if(H5HF_hdr_reverse_iter(hdr, dxpl_id, dblock_addr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reverse 'next block' iterator")
+        } /* end if */
+#if 0
+        else {
+            unsigned par_row, par_col;  /* Row & column in parent indirect block */
+
+            /* Compute row & column in parent indirect block */
+            par_row = dblock->par_entry / hdr->man_dtable.cparam.width;
+            par_col = dblock->par_entry % hdr->man_dtable.cparam.width;
+
+            /* Add a 'range' section for the space in the destroyed block */
+            if(H5HF_sect_range_add(hdr, dxpl_id, dblock->block_off, hdr->man_dtable.row_tot_dblock_free[par_row],
+                    dblock->parent, par_row, par_col, 1) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "can't create range section for direct block being destroyed")
+        } /* end else */
+#endif /* 0 */
+
+        /* Detach from parent indirect block */
+        if(dblock->parent) {
+            if(H5HF_man_iblock_detach(dblock->parent, dxpl_id, dblock->par_entry) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't detach from parent indirect block");
+            dblock->parent = NULL;
+            dblock->par_entry = 0;
+        } /* end if */
+    } /* end else */
+
+    /* Indicate that the indirect block should be deleted & file space freed */
+    dblock->file_size = dblock_size;
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    /* Unprotect the indirect block, with appropriate flags */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_destroy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_new
+ *
+ * Purpose:	Create a direct block large enough to hold an object of
+ *              the requested size
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_new(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t request,
+    H5HF_free_section_t **ret_sec_node)
+{
+    haddr_t dblock_addr;            /* Address of new direct block */
+    size_t min_dblock_size;         /* Min. size of direct block to allocate */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(request > 0);
+
+    /* Compute the min. size of the direct block needed to fulfill the request */
+    if(request < hdr->man_dtable.cparam.start_block_size)
+        min_dblock_size = hdr->man_dtable.cparam.start_block_size;
+    else {
+        min_dblock_size = ((size_t)1) << (1 + H5VM_log2_gen((uint64_t)request));
+        HDassert(min_dblock_size <= hdr->man_dtable.cparam.max_direct_size);
+    } /* end else */
+
+    /* Adjust the size of block needed to fulfill request, with overhead */
+    if((min_dblock_size - request) < H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr))
+        min_dblock_size *= 2;
+
+    /* Check if this is the first block in the heap */
+    if(!H5F_addr_defined(hdr->man_dtable.table_addr) &&
+            min_dblock_size == hdr->man_dtable.cparam.start_block_size) {
+        /* Create new direct block at starting offset */
+        if(H5HF_man_dblock_create(dxpl_id, hdr, NULL, 0, &dblock_addr, ret_sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap direct block")
+
+        /* Point root at new direct block */
+        hdr->man_dtable.curr_root_rows = 0;
+        hdr->man_dtable.table_addr = dblock_addr;
+        if(hdr->filter_len > 0) {
+            hdr->pline_root_direct_size = hdr->man_dtable.cparam.start_block_size;
+            hdr->pline_root_direct_filter_mask = 0;
+        } /* end if */
+
+        /* Extend heap to cover new direct block */
+        if(H5HF_hdr_adjust_heap(hdr, (hsize_t)hdr->man_dtable.cparam.start_block_size, (hssize_t)hdr->man_dtable.row_tot_dblock_free[0]) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "can't increase space to cover root direct block")
+    } /* end if */
+    /* Root entry already exists, allocate direct block from root indirect block */
+    else {
+        H5HF_indirect_t *iblock;    /* Pointer to indirect block to create */
+        unsigned next_row;          /* Iterator's next block row */
+        unsigned next_entry;        /* Iterator's next block entry */
+        size_t next_size;           /* Size of next direct block to create */
+
+        /* Update iterator to reflect any previous increments as well as allow for requested direct block size */
+        if(H5HF_hdr_update_iter(hdr, dxpl_id, min_dblock_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUPDATE, FAIL, "unable to update block iterator")
+
+        /* Retrieve information about current iterator position */
+        if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+        HDassert(next_row < iblock->nrows);
+        H5_CHECKED_ASSIGN(next_size, size_t, hdr->man_dtable.row_block_size[next_row], hsize_t);
+
+        /* Check for skipping over blocks */
+        if(min_dblock_size > next_size) {
+HDfprintf(stderr, "%s: Skipping direct block sizes not supported, min_dblock_size = %Zu, next_size = %Zu\n", FUNC, min_dblock_size, next_size);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "skipping direct block sizes not supported yet")
+        } /* end if */
+
+        /* Advance "next block" iterator to next direct block entry */
+        if(H5HF_hdr_inc_iter(hdr, (hsize_t)next_size, 1) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment 'next block' iterator")
+
+        /* Create new direct block at current location*/
+        if(H5HF_man_dblock_create(dxpl_id, hdr, iblock, next_entry, &dblock_addr, ret_sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap direct block")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_protect
+ *
+ * Purpose:	Convenience wrapper around H5AC_protect on a direct block
+ *              (Use H5AC_unprotect to unprotect it for now)
+ *
+ * Return:	Pointer to direct block on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_direct_t *
+H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr,
+    size_t dblock_size, H5HF_indirect_t *par_iblock, unsigned par_entry,
+    H5AC_protect_t rw)
+{
+    H5HF_direct_t *dblock;      /* Direct block from cache */
+    H5HF_dblock_cache_ud_t udata;	/* parent and other infor for deserializing direct block */
+    H5HF_direct_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblock_addr));
+    HDassert(dblock_size > 0);
+
+    /* Set up parent info */
+    udata.par_info.hdr = hdr;
+    udata.par_info.iblock = par_iblock;
+    udata.par_info.entry = par_entry;
+
+    /* set up the file pointer in the user data */
+    udata.f = hdr->f;
+
+    /* set up the direct block size */
+    udata.dblock_size = dblock_size;
+
+    /* compute the on disk image size -- observe that odi_size and
+     * dblock_size will be identical if there is no filtering.
+     */
+    if(hdr->filter_len > 0) {
+        if(par_iblock == NULL) {
+	    udata.odi_size = hdr->pline_root_direct_size;
+	    udata.filter_mask = hdr->pline_root_direct_filter_mask;
+	} /* end if */
+        else {
+	    /* Sanity check */
+	    HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, dblock_addr));
+
+	    /* Set up parameters to read filtered direct block */
+	    udata.odi_size = par_iblock->filt_ents[par_entry].size;
+            udata.filter_mask = par_iblock->filt_ents[par_entry].filter_mask;
+	} /* end else */
+    } /* end if */
+    else {
+	udata.odi_size = dblock_size;
+        udata.filter_mask = 0;
+    } /* end else */
+
+    /* Protect the direct block */
+    if(NULL == (dblock = (H5HF_direct_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, &udata, rw)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap direct block")
+
+    /* Set the return value */
+    ret_value = dblock;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_locate
+ *
+ * Purpose:	Locate a direct block in a managed heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off,
+    H5HF_indirect_t **ret_iblock, unsigned *ret_entry, hbool_t *ret_did_protect,
+    H5AC_protect_t rw)
+{
+    haddr_t iblock_addr;            /* Indirect block's address */
+    H5HF_indirect_t *iblock;        /* Pointer to indirect block */
+    hbool_t did_protect;            /* Whether we protected the indirect block or not */
+    unsigned row, col;              /* Row & column for object's block */
+    unsigned entry;                 /* Entry of block */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(hdr->man_dtable.curr_root_rows);   /* Only works for heaps with indirect root block */
+    HDassert(ret_iblock);
+    HDassert(ret_did_protect);
+
+    /* Look up row & column for object */
+    if(H5HF_dtable_lookup(&hdr->man_dtable, obj_off, &row, &col) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of object")
+
+    /* Set initial indirect block info */
+    iblock_addr = hdr->man_dtable.table_addr;
+
+    /* Lock root indirect block */
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, hdr->man_dtable.curr_root_rows, NULL, 0, FALSE, rw, &did_protect)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+    /* Check for indirect block row */
+    while(row >= hdr->man_dtable.max_direct_rows) {
+        H5HF_indirect_t *new_iblock;   /* Pointer to new indirect block */
+        hbool_t new_did_protect;       /* Whether we protected the indirect block or not */
+        unsigned nrows;                /* Number of rows in new indirect block */
+        unsigned cache_flags = H5AC__NO_FLAGS_SET;      /* Flags for unprotecting parent indirect block */
+
+        /* Compute # of rows in child indirect block */
+        nrows = (H5VM_log2_gen(hdr->man_dtable.row_block_size[row]) - hdr->man_dtable.first_row_bits) + 1;
+        HDassert(nrows < iblock->nrows);        /* child must be smaller than parent */
+
+        /* Compute indirect block's entry */
+        entry = (row * hdr->man_dtable.cparam.width) + col;
+
+        /* Locate child indirect block */
+        iblock_addr = iblock->ents[entry].addr;
+
+        /* Check if we need to (re-)create the child indirect block */
+        if(!H5F_addr_defined(iblock_addr)) {
+            if(H5HF_man_iblock_create(hdr, dxpl_id, iblock, entry, nrows, nrows, &iblock_addr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block")
+
+            /* Indicate that the parent indirect block was modified */
+            cache_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* Lock child indirect block */
+        if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, iblock, entry, FALSE, rw, &new_did_protect)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+        /* Release the current indirect block */
+        if(H5HF_man_iblock_unprotect(iblock, dxpl_id, cache_flags, did_protect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+        /* Switch variables to use new indirect block */
+        iblock = new_iblock;
+        did_protect = new_did_protect;
+
+        /* Look up row & column in new indirect block for object */
+        if(H5HF_dtable_lookup(&hdr->man_dtable, (obj_off - iblock->block_off), &row, &col) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of object")
+        HDassert(row < iblock->nrows);        /* child must be smaller than parent */
+    } /* end while */
+
+    /* Set return parameters */
+    if(ret_entry)
+        *ret_entry = (row * hdr->man_dtable.cparam.width) + col;
+    *ret_iblock = iblock;
+    *ret_did_protect = did_protect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_locate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_delete
+ *
+ * Purpose:	Delete a managed direct block
+ *
+ * Note:	This routine does _not_ modify any indirect block that points
+ *              to this direct block, it is assumed that the whole heap is
+ *              being deleted.  (H5HF_man_dblock_destroy modifies the indirect
+ *              block)
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr,
+    hsize_t dblock_size)
+{
+    unsigned dblock_status = 0;         /* Direct block's status in the metadata cache */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(dblock_addr));
+
+    /* Check the direct block's status in the metadata cache */
+    if(H5AC_get_entry_status(f, dblock_addr, &dblock_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for direct block")
+
+    /* If the direct block is in the cache, expunge it now */
+    if(dblock_status & H5AC_ES__IN_CACHE) {
+        /* Sanity checks on direct block */
+        HDassert(!(dblock_status & H5AC_ES__IS_PINNED));
+        HDassert(!(dblock_status & H5AC_ES__IS_PROTECTED));
+
+        /* Evict the direct block from the metadata cache */
+        if(H5AC_expunge_entry(f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove direct block from cache")
+    } /* end if */
+
+    /* Check if the direct block is NOT currently allocated in temp. file space */
+    /* (temp. file space does not need to be freed) */
+    if(!H5F_IS_TMP_ADDR(f, dblock_addr)) {
+        /* Release direct block's disk space */
+        /* (XXX: Under the best of circumstances, this block's space in the file
+         *          would be freed in the H5AC_expunge_entry() call above (and the
+         *          H5AC__FREE_FILE_SPACE_FLAG used there), but since the direct
+         *          block structure might have a different size on disk than in
+         *          the heap's 'abstract' address space, we would need to set the
+         *          "file_size" field for the direct block structure.  In order to
+         *          do that, we'd have to protect/unprotect the direct block and
+         *          that would add a bunch of unnecessary overhead to the process,
+         *          so we just release the file space here, directly.  When the
+         *          revised metadata cache is operating, it will "know" the file
+         *          size of each entry in the cache and we can the the
+         *          H5AC_expunge_entry() method.  -QAK)
+         */
+        if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, dblock_addr, dblock_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_dblock_dest
+ *
+ * Purpose:	Destroys a fractal heap direct block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_dblock_dest(H5HF_direct_t *dblock)
+{
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dblock);
+
+    /* Decrement reference count on shared fractal heap info */
+    HDassert(dblock->hdr != NULL);
+    if(H5HF_hdr_decr(dblock->hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
+    if(dblock->parent)
+        if(H5HF_iblock_decr(dblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    /* Free block's buffer */
+    dblock->blk = H5FL_BLK_FREE(direct_block, dblock->blk);
+
+    /* Free fractal heap direct block info */
+    dblock = H5FL_FREE(H5HF_direct_t, dblock);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_dblock_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFdtable.c b/gatb-core/thirdparty/hdf5/src/H5HFdtable.c
new file mode 100644
index 0000000..c523396
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFdtable.c
@@ -0,0 +1,371 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFdtable.c
+ *			Apr 10 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		"Doubling table" routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_init
+ *
+ * Purpose:	Initialize values for doubling table
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_dtable_init(H5HF_dtable_t *dtable)
+{
+    hsize_t tmp_block_size;             /* Temporary block size */
+    hsize_t acc_block_off;              /* Accumulated block offset */
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+
+    /* Compute/cache some values */
+    dtable->start_bits = H5VM_log2_of2((uint32_t)dtable->cparam.start_block_size);
+    dtable->first_row_bits = dtable->start_bits + H5VM_log2_of2(dtable->cparam.width);
+    dtable->max_root_rows = (dtable->cparam.max_index - dtable->first_row_bits) + 1;
+    dtable->max_direct_bits = H5VM_log2_of2((uint32_t)dtable->cparam.max_direct_size);
+    dtable->max_direct_rows = (dtable->max_direct_bits - dtable->start_bits) + 2;
+    dtable->num_id_first_row = dtable->cparam.start_block_size * dtable->cparam.width;
+    dtable->max_dir_blk_off_size = H5HF_SIZEOF_OFFSET_LEN(dtable->cparam.max_direct_size);
+
+    /* Build table of block sizes for each row */
+    if(NULL == (dtable->row_block_size = (hsize_t *)H5MM_malloc(dtable->max_root_rows * sizeof(hsize_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create doubling table block size table")
+    if(NULL == (dtable->row_block_off = (hsize_t *)H5MM_malloc(dtable->max_root_rows * sizeof(hsize_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create doubling table block offset table")
+    if(NULL == (dtable->row_tot_dblock_free = (hsize_t *)H5MM_malloc(dtable->max_root_rows * sizeof(hsize_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create doubling table total direct block free space table")
+    if(NULL == (dtable->row_max_dblock_free = (size_t *)H5MM_malloc(dtable->max_root_rows * sizeof(size_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create doubling table max. direct block free space table")
+    tmp_block_size = dtable->cparam.start_block_size;
+    acc_block_off = dtable->cparam.start_block_size * dtable->cparam.width;
+    dtable->row_block_size[0] = dtable->cparam.start_block_size;
+    dtable->row_block_off[0] = 0;
+    for(u = 1; u < dtable->max_root_rows; u++) {
+        dtable->row_block_size[u] = tmp_block_size;
+        dtable->row_block_off[u] = acc_block_off;
+        tmp_block_size *= 2;
+        acc_block_off *= 2;
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_dtable_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_lookup
+ *
+ * Purpose:	Compute the row & col of an offset in a doubling-table
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_dtable_lookup(const H5HF_dtable_t *dtable, hsize_t off, unsigned *row, unsigned *col)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+    HDassert(row);
+    HDassert(col);
+#ifdef QAK
+HDfprintf(stderr, "%s: off = %Hu\n", "H5HF_dtable_lookup", off);
+#endif /* QAK */
+
+    /* Check for offset in first row */
+    if(off < dtable->num_id_first_row) {
+        *row = 0;
+        H5_CHECKED_ASSIGN(*col, unsigned, (off / dtable->cparam.start_block_size), hsize_t);
+    } /* end if */
+    else {
+        unsigned high_bit = H5VM_log2_gen(off);  /* Determine the high bit in the offset */
+        hsize_t off_mask = ((hsize_t)1) << high_bit;       /* Compute mask for determining column */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: high_bit = %u, off_mask = %Hu\n", "H5HF_dtable_lookup", high_bit, off_mask);
+#endif /* QAK */
+        *row = (high_bit - dtable->first_row_bits) + 1;
+        H5_CHECKED_ASSIGN(*col, unsigned, ((off - off_mask) / dtable->row_block_size[*row]), hsize_t);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dtable_lookup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_dest
+ *
+ * Purpose:	Release information for doubling table
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_dtable_dest(H5HF_dtable_t *dtable)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+
+    /* Free the block size lookup table for the doubling table */
+    H5MM_xfree(dtable->row_block_size);
+
+    /* Free the block offset lookup table for the doubling table */
+    H5MM_xfree(dtable->row_block_off);
+
+    /* Free the total direct block free space lookup table for the doubling table */
+    H5MM_xfree(dtable->row_tot_dblock_free);
+
+    /* Free the max. direct block free space lookup table for the doubling table */
+    H5MM_xfree(dtable->row_max_dblock_free);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_dtable_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_size_to_row
+ *
+ * Purpose:	Compute row that can hold block of a certain size
+ *
+ * Return:	Non-negative on success (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_dtable_size_to_row(const H5HF_dtable_t *dtable, size_t block_size)
+{
+    unsigned row;               /* Row where block will fit */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+
+    if(block_size == dtable->cparam.start_block_size)
+        row = 0;
+    else
+        row = (H5VM_log2_of2((uint32_t)block_size) - H5VM_log2_of2((uint32_t)dtable->cparam.start_block_size)) + 1;
+
+    FUNC_LEAVE_NOAPI(row)
+} /* end H5HF_dtable_size_to_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_size_to_rows
+ *
+ * Purpose:	Compute # of rows of indirect block of a given size
+ *
+ * Return:	Non-negative on success (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_dtable_size_to_rows(const H5HF_dtable_t *dtable, hsize_t size)
+{
+    unsigned rows;              /* # of rows required for indirect block */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+
+    rows = (H5VM_log2_gen(size) - dtable->first_row_bits) + 1;
+
+    FUNC_LEAVE_NOAPI(rows)
+} /* end H5HF_dtable_size_to_rows() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_dtable_span_size
+ *
+ * Purpose:	Compute the size covered by a span of entries
+ *
+ * Return:	Non-zero span size on success/zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5HF_dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row,
+    unsigned start_col, unsigned num_entries)
+{
+    unsigned start_entry;       /* Entry for first block covered */
+    unsigned end_row;           /* Row for last block covered */
+    unsigned end_col;           /* Column for last block covered */
+    unsigned end_entry;         /* Entry for last block covered */
+    hsize_t acc_span_size;      /* Accumulated span size */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(dtable);
+    HDassert(num_entries > 0);
+
+    /* Compute starting entry */
+    start_entry = (start_row * dtable->cparam.width) + start_col;
+
+    /* Compute ending entry, column & row */
+    end_entry = (start_entry + num_entries) - 1;
+    end_row = end_entry / dtable->cparam.width;
+    end_col = end_entry % dtable->cparam.width;
+#ifdef QAK
+HDfprintf(stderr, "%s: start_row = %u, start_col = %u, start_entry = %u\n", "H5HF_sect_indirect_span_size", start_row, start_col, start_entry);
+HDfprintf(stderr, "%s: end_row = %u, end_col = %u, end_entry = %u\n", "H5HF_sect_indirect_span_size", end_row, end_col, end_entry);
+#endif /* QAK */
+
+    /* Initialize accumulated span size */
+    acc_span_size = 0;
+
+    /* Compute span size covered */
+
+    /* Check for multi-row span */
+    if(start_row != end_row) {
+        /* Accomodate partial starting row */
+        if(start_col > 0) {
+            acc_span_size = dtable->row_block_size[start_row] *
+                    (dtable->cparam.width - start_col);
+            start_row++;
+        } /* end if */
+
+        /* Accumulate full rows */
+        while(start_row < end_row) {
+            acc_span_size += dtable->row_block_size[start_row] *
+                    dtable->cparam.width;
+            start_row++;
+        } /* end while */
+
+        /* Accomodate partial ending row */
+        acc_span_size += dtable->row_block_size[start_row] *
+                (end_col + 1);
+    } /* end if */
+    else {
+        /* Span is in same row */
+        acc_span_size = dtable->row_block_size[start_row] *
+                ((end_col - start_col) + 1);
+    } /* end else */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: acc_span_size = %Hu\n", "H5HF_dtable_span_size", acc_span_size);
+#endif /* QAK */
+    FUNC_LEAVE_NOAPI(acc_span_size)
+} /* end H5HF_sect_indirect_span_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFhdr.c b/gatb-core/thirdparty/hdf5/src/H5HFhdr.c
new file mode 100644
index 0000000..cf8da23
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFhdr.c
@@ -0,0 +1,1521 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFhdr.c
+ *			Apr 10 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Heap header routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+#ifndef NDEBUG
+/* Limit on the size of the max. direct block size */
+/* (This is limited to 32-bits currently, because I think it's unlikely to
+ *      need to be larger, the 32-bit limit for H5VM_log2_of2(n), and
+ *      some offsets/sizes are encoded with a maxiumum of 32-bits  - QAK)
+ */
+#define H5HF_MAX_DIRECT_SIZE_LIMIT ((hsize_t)2 * 1024 * 1024 * 1024)
+
+/* Limit on the width of the doubling table */
+/* (This is limited to 16-bits currently, because I think it's unlikely to
+ *      need to be larger, and its encoded with a maxiumum of 16-bits  - QAK)
+ */
+#define H5HF_WIDTH_LIMIT (64 * 1024)
+#endif /* NDEBUG */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5HF_hdr_t struct */
+H5FL_DEFINE_STATIC(H5HF_hdr_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_alloc
+ *
+ * Purpose:	Allocate shared fractal heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_hdr_t *
+H5HF_hdr_alloc(H5F_t *f)
+{
+    H5HF_hdr_t *hdr = NULL;          /* Shared fractal heap header */
+    H5HF_hdr_t *ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5FL_CALLOC(H5HF_hdr_t)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "allocation failed for fractal heap shared header")
+
+    /* Set the internal parameters for the heap */
+    hdr->f = f;
+    hdr->sizeof_size = H5F_SIZEOF_SIZE(f);
+    hdr->sizeof_addr = H5F_SIZEOF_ADDR(f);
+
+    /* Set the return value */
+    ret_value = hdr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_free_space
+ *
+ * Purpose:	Compute direct block free space, for indirect blocks of
+ *              different sizes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_hdr_compute_free_space(H5HF_hdr_t *hdr, unsigned iblock_row)
+{
+    hsize_t acc_heap_size;      /* Accumumated heap space */
+    hsize_t iblock_size;        /* Size of indirect block to calculate for */
+    hsize_t acc_dblock_free;    /* Accumumated direct block free space */
+    size_t max_dblock_free;     /* Max. direct block free space */
+    unsigned curr_row;          /* Current row in block */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(iblock_row >= hdr->man_dtable.max_direct_rows);
+
+    /* Set the free space in direct blocks */
+    acc_heap_size = 0;
+    acc_dblock_free = 0;
+    max_dblock_free = 0;
+    iblock_size = hdr->man_dtable.row_block_size[iblock_row];
+    curr_row = 0;
+    while(acc_heap_size < iblock_size) {
+        acc_heap_size += hdr->man_dtable.row_block_size[curr_row] *
+                hdr->man_dtable.cparam.width;
+        acc_dblock_free += hdr->man_dtable.row_tot_dblock_free[curr_row] *
+                hdr->man_dtable.cparam.width;
+        if(hdr->man_dtable.row_max_dblock_free[curr_row] > max_dblock_free)
+            max_dblock_free = hdr->man_dtable.row_max_dblock_free[curr_row];
+        curr_row++;
+    } /* end while */
+
+    /* Set direct block free space values for indirect block */
+    hdr->man_dtable.row_tot_dblock_free[iblock_row] = acc_dblock_free;
+    hdr->man_dtable.row_max_dblock_free[iblock_row] = max_dblock_free;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_compute_free_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_finish_init_phase1
+ *
+ * Purpose:	First phase to finish initializing info in shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_finish_init_phase1(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Compute/cache some values */
+    hdr->heap_off_size = (uint8_t)H5HF_SIZEOF_OFFSET_BITS(hdr->man_dtable.cparam.max_index);
+    if(H5HF_dtable_init(&hdr->man_dtable) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize doubling table info")
+
+    /* Set the size of heap IDs */
+    hdr->heap_len_size = MIN(hdr->man_dtable.max_dir_blk_off_size,
+            H5VM_limit_enc_size((uint64_t)hdr->max_man_size));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_finish_init_phase1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_finish_init_phase2
+ *
+ * Purpose:	Second phase to finish initializing info in shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_finish_init_phase2(H5HF_hdr_t *hdr)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Set the free space in direct blocks */
+    for(u = 0; u < hdr->man_dtable.max_root_rows; u++) {
+        if(u < hdr->man_dtable.max_direct_rows) {
+            hdr->man_dtable.row_tot_dblock_free[u] = hdr->man_dtable.row_block_size[u] -
+                    H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+            H5_CHECKED_ASSIGN(hdr->man_dtable.row_max_dblock_free[u], size_t, hdr->man_dtable.row_tot_dblock_free[u], hsize_t);
+        } /* end if */
+        else
+            if(H5HF_hdr_compute_free_space(hdr, u) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize direct block free space for indirect block")
+    } /* end for */
+
+    /* Initialize the block iterator for searching for free space */
+    if(H5HF_man_iter_init(&hdr->next_block) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize space search block iterator")
+
+    /* Initialize the information for tracking 'huge' objects */
+    if(H5HF_huge_init(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize info for tracking huge objects")
+
+    /* Initialize the information for tracking 'tiny' objects */
+    if(H5HF_tiny_init(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize info for tracking tiny objects")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_finish_init_phase2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_finish_init
+ *
+ * Purpose:	Finish initializing info in shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_finish_init(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* First phase of header final initialization */
+    if(H5HF_hdr_finish_init_phase1(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't finish phase #1 of header final initialization")
+
+    /* Second phase of header final initialization */
+    if(H5HF_hdr_finish_init_phase2(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't finish phase #2 of header final initialization")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_finish_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_create
+ *
+ * Purpose:	Create new fractal heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
+{
+    H5HF_hdr_t *hdr = NULL;     /* The new fractal heap header information */
+    size_t dblock_overhead;     /* Direct block's overhead */
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+#ifndef NDEBUG
+    /* Check for valid parameters */
+    if(cparam->managed.width == 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "width must be greater than zero")
+    if(cparam->managed.width > H5HF_WIDTH_LIMIT)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "width too large")
+    if(!POWER_OF_TWO(cparam->managed.width))
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "width not power of two")
+    if(cparam->managed.start_block_size == 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "starting block size must be greater than zero")
+    if(!POWER_OF_TWO(cparam->managed.start_block_size))
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "starting block size not power of two")
+    if(cparam->managed.max_direct_size == 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. direct block size must be greater than zero")
+    if(cparam->managed.max_direct_size > H5HF_MAX_DIRECT_SIZE_LIMIT)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. direct block size too large")
+    if(!POWER_OF_TWO(cparam->managed.max_direct_size))
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. direct block size not power of two")
+    if(cparam->managed.max_direct_size < cparam->max_man_size)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. direct block size not large enough to hold all managed blocks")
+    if(cparam->managed.max_index == 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. heap size must be greater than zero")
+#endif /* NDEBUG */
+
+    /* Allocate & basic initialization for the shared header */
+    if(NULL == (hdr = H5HF_hdr_alloc(f)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "can't allocate space for shared heap info")
+
+#ifndef NDEBUG
+    if(cparam->managed.max_index > (8 * hdr->sizeof_size))
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. heap size too large for file")
+#endif /* NDEBUG */
+
+    /* Set the creation parameters for the heap */
+    hdr->max_man_size = cparam->max_man_size;
+    hdr->checksum_dblocks = cparam->checksum_dblocks;
+    HDmemcpy(&(hdr->man_dtable.cparam), &(cparam->managed), sizeof(H5HF_dtable_cparam_t));
+
+    /* Set root table address to indicate that the heap is empty currently */
+    hdr->man_dtable.table_addr = HADDR_UNDEF;
+
+    /* Set free list header address to indicate that the heap is empty currently */
+    hdr->fs_addr = HADDR_UNDEF;
+
+    /* Set "huge" object tracker v2 B-tree address to indicate that there aren't any yet */
+    hdr->huge_bt2_addr = HADDR_UNDEF;
+
+    /* First phase of header final initialization */
+    /* (doesn't need ID length set up) */
+    if(H5HF_hdr_finish_init_phase1(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "can't finish phase #1 of header final initialization")
+
+    /* Copy any I/O filter pipeline */
+    /* (This code is not in the "finish init phase" routines because those
+     *  routines are also called from the cache 'load' callback, and the filter
+     *  length is already set in that case (its stored in the header on disk))
+     */
+    if(cparam->pline.nused > 0) {
+        /* Check if the filters in the DCPL can be applied to this dataset */
+        if(H5Z_can_apply_direct(&(cparam->pline)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "I/O filters can't operate on this heap")
+
+        /* Mark the filters as checked */
+        hdr->checked_filters = TRUE;
+
+        /* Make the "set local" filter callbacks for this dataset */
+        if(H5Z_set_local_direct(&(cparam->pline)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to set local filter parameters")
+
+        /* Copy the I/O filter pipeline from the creation parameters to the header */
+        if(NULL == H5O_msg_copy(H5O_PLINE_ID, &(cparam->pline), &(hdr->pline)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOPY, HADDR_UNDEF, "can't copy I/O filter pipeline")
+
+        /* Pay attention to the latest version flag for the file */
+        if(H5F_USE_LATEST_FORMAT(hdr->f))
+            /* Set the latest version for the I/O pipeline message */
+            if(H5O_pline_set_latest_version(&(hdr->pline)) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, HADDR_UNDEF, "can't set latest version of I/O filter pipeline")
+
+        /* Compute the I/O filters' encoded size */
+        if(0 == (hdr->filter_len = H5O_msg_raw_size(hdr->f, H5O_PLINE_ID, FALSE, &(hdr->pline))))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGETSIZE, HADDR_UNDEF, "can't get I/O filter pipeline size")
+
+        /* Compute size of header on disk */
+        hdr->heap_size = H5HF_HEADER_SIZE(hdr)  /* Base header size */
+            + hdr->sizeof_size                  /* Size of size for filtered root direct block */
+            + 4                                 /* Size of filter mask for filtered root direct block */
+            + hdr->filter_len;                  /* Size of encoded I/O filter info */
+    } /* end if */
+    else {
+        /* Set size of header on disk */
+        hdr->heap_size = H5HF_HEADER_SIZE(hdr);
+
+        /* Mark filters as checked, for performance reasons */
+        hdr->checked_filters = TRUE;
+    } /* end else */
+
+    /* Set the length of IDs in the heap */
+    /* (This code is not in the "finish init phase" routines because those
+     *  routines are also called from the cache 'load' callback, and the ID
+     *  length is already set in that case (its stored in the header on disk))
+     */
+    switch(cparam->id_len) {
+        case 0: /* Set the length of heap IDs to just enough to hold the offset & length of 'normal' objects in the heap */
+            hdr->id_len = (unsigned)1 + hdr->heap_off_size + hdr->heap_len_size;
+            break;
+
+        case 1: /* Set the length of heap IDs to just enough to hold the information needed to directly access 'huge' objects in the heap */
+            if(hdr->filter_len > 0)
+                hdr->id_len = 1         /* ID flags */
+                    + hdr->sizeof_addr  /* Address of filtered object */
+                    + hdr->sizeof_size  /* Length of filtered object */
+                    + 4                 /* Filter mask for filtered object */
+                    + hdr->sizeof_size; /* Size of de-filtered object in memory */
+            else
+                hdr->id_len = 1         /* ID flags */
+                    + hdr->sizeof_addr  /* Address of object */
+                    + hdr->sizeof_size; /* Length of object */
+            break;
+
+        default:    /* Use the requested size for the heap ID */
+            /* Check boundaries */
+            if(cparam->id_len < (1 + hdr->heap_off_size + hdr->heap_len_size))
+                HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, HADDR_UNDEF, "ID length not large enough to hold object IDs")
+            else if(cparam->id_len > H5HF_MAX_ID_LEN)
+                HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, HADDR_UNDEF, "ID length too large to store tiny object lengths")
+
+            /* Use the requested size for the heap ID */
+            hdr->id_len = cparam->id_len;
+            break;
+    } /* end switch */
+
+    /* Second phase of header final initialization */
+    /* (needs ID and filter lengths set up) */
+    if(H5HF_hdr_finish_init_phase2(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "can't finish phase #2 of header final initialization")
+
+    /* Extra checking for possible gap between max. direct block size minus
+     * overhead and "huge" object size */
+    dblock_overhead = H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+    if((cparam->managed.max_direct_size - dblock_overhead) < cparam->max_man_size)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. direct block size not large enough to hold all managed blocks")
+
+    /* Allocate space for the header on disk */
+    if(HADDR_UNDEF == (hdr->heap_addr = H5MF_alloc(f, H5FD_MEM_FHEAP_HDR, dxpl_id, (hsize_t)hdr->heap_size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for fractal heap header")
+
+    /* Cache the new fractal heap header */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_FHEAP_HDR, hdr->heap_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, HADDR_UNDEF, "can't add fractal heap header to cache")
+
+    /* Set address of heap header to return */
+    ret_value = hdr->heap_addr;
+
+done:
+    if(!H5F_addr_defined(ret_value) && hdr)
+        if(H5HF_hdr_free(hdr) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, HADDR_UNDEF, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_protect
+ *
+ * Purpose:	Convenience wrapper around H5AC_protect on an indirect block
+ *
+ * Return:	Pointer to indirect block on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May  5 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_hdr_t *
+H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
+{
+    H5HF_hdr_cache_ud_t cache_udata;    /* User-data for callback */
+    H5HF_hdr_t *hdr;                    /* Fractal heap header */
+    H5HF_hdr_t *ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Set up userdata for protect call */
+    cache_udata.f = f;
+    cache_udata.dxpl_id = dxpl_id;
+
+    /* Lock the heap header into memory */
+    if(NULL == (hdr = (H5HF_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, addr, &cache_udata, rw)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
+
+    /* Set the header's address */
+    hdr->heap_addr = addr;
+
+    /* Update header's file pointer */
+    hdr->f = f;
+
+    /* Set the return value */
+    ret_value = hdr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_incr
+ *
+ * Purpose:	Increment component reference count on shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_incr(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Mark header as un-evictable when a block is depending on it */
+    if(hdr->rc == 0)
+        if(H5AC_pin_protected_entry(hdr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin fractal heap header")
+
+    /* Increment reference count on shared header */
+    hdr->rc++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_decr
+ *
+ * Purpose:	Decrement component reference count on shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_decr(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->rc);
+
+    /* Decrement reference count on shared header */
+    hdr->rc--;
+
+    /* Mark header as evictable again when no child blocks depend on it */
+    if(hdr->rc == 0) {
+        HDassert(hdr->file_rc == 0);
+        if(H5AC_unpin_entry(hdr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap header")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_fuse_incr
+ *
+ * Purpose:	Increment file reference count on shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct  1 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_fuse_incr(H5HF_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Increment file reference count on shared header */
+    hdr->file_rc++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_hdr_fuse_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_fuse_decr
+ *
+ * Purpose:	Decrement file reference count on shared heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct  1 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5HF_hdr_fuse_decr(H5HF_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->file_rc);
+
+    /* Decrement file reference count on shared header */
+    hdr->file_rc--;
+
+    FUNC_LEAVE_NOAPI(hdr->file_rc)
+} /* end H5HF_hdr_fuse_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_dirty
+ *
+ * Purpose:	Mark heap header as dirty
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_dirty(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Resize pinned header in cache if I/O filter is present. */
+    if(hdr->filter_len > 0) {
+        if(H5AC_resize_entry(hdr, (size_t)hdr->heap_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap header")
+    } /* end if */
+
+    /* Mark header as dirty in cache */
+    if(H5AC_mark_entry_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark fractal heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_adj_free
+ *
+ * Purpose:	Adjust the free space for a heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Update heap header */
+    HDassert(amt > 0 || hdr->total_man_free >= (hsize_t)-amt);
+    hdr->total_man_free += amt;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_adj_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_adjust_heap
+ *
+ * Purpose:	Adjust heap space
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Set the total managed space in heap */
+    hdr->man_size = new_size;
+
+    /* Adjust the free space in direct blocks */
+    hdr->total_man_free += extra_free;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_adjust_heap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_inc_alloc
+ *
+ * Purpose:	Increase allocated size of heap
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 23 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_inc_alloc(H5HF_hdr_t *hdr, size_t alloc_size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(alloc_size);
+
+    /* Update the "allocated" size within the heap */
+    hdr->man_alloc_size += alloc_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_hdr_inc_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_start_iter
+ *
+ * Purpose:	Start "next block" iterator at an offset/entry in the heap
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 30 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_start_iter(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, hsize_t curr_off, unsigned curr_entry)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(iblock);
+
+    /* Set up "next block" iterator at correct location */
+    if(H5HF_man_iter_start_entry(hdr, &hdr->next_block, iblock, curr_entry) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize block iterator")
+
+    /* Set the offset of the iterator in the heap */
+    hdr->man_iter_off = curr_off;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_start_iter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_reset_iter
+ *
+ * Purpose:	Reset "next block" iterator
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_reset_iter(H5HF_hdr_t *hdr, hsize_t curr_off)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Reset "next block" iterator */
+    if(H5HF_man_iter_reset(&hdr->next_block) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reset block iterator")
+
+    /* Set the offset of the iterator in the heap */
+    hdr->man_iter_off = curr_off;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_reset_iter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_skip_blocks
+ *
+ * Purpose:	Add skipped direct blocks to free space for heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr  3 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_skip_blocks(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *iblock,
+    unsigned start_entry, unsigned nentries)
+{
+    unsigned row, col;                  /* Row & column of entry */
+    hsize_t sect_size;                  /* Size of section in heap space */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(iblock);
+    HDassert(nentries);
+
+    /* Compute the span within the heap to skip */
+    row = start_entry / hdr->man_dtable.cparam.width;
+    col = start_entry % hdr->man_dtable.cparam.width;
+    sect_size = H5HF_dtable_span_size(&hdr->man_dtable, row, col, nentries);
+    HDassert(sect_size > 0);
+
+    /* Advance the new block iterator */
+    if(H5HF_hdr_inc_iter(hdr, sect_size, nentries) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't increase allocated heap size")
+
+    /* Add 'indirect' section for blocks skipped in this row */
+    if(H5HF_sect_indirect_add(hdr, dxpl_id, iblock, start_entry, nentries) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section for indirect block's free space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_skip_blocks() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_update_iter
+ *
+ * Purpose:	Update state of heap to account for current iterator
+ *              position.
+ *
+ * Note:	Creates necessary indirect blocks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(min_dblock_size > 0);
+
+    /* Check for creating first indirect block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        if(H5HF_man_iblock_root_create(hdr, dxpl_id, min_dblock_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "unable to create root indirect block")
+    } /* end if */
+    else {
+        H5HF_indirect_t *iblock;        /* Pointer to indirect block */
+        hbool_t walked_up, walked_down; /* Condition variables for finding direct block location */
+        unsigned next_row;              /* Iterator's next block row */
+        unsigned next_entry;            /* Iterator's next block entry */
+        unsigned min_dblock_row;        /* Minimum row for direct block size request */
+
+        /* Compute min. row for direct block requested */
+        min_dblock_row = H5HF_dtable_size_to_row(&hdr->man_dtable, min_dblock_size);
+
+        /* Initialize block iterator, if necessary */
+        if(!H5HF_man_iter_ready(&hdr->next_block)) {
+            /* Start iterator with previous offset of iterator */
+            if(H5HF_man_iter_start_offset(hdr, dxpl_id, &hdr->next_block, hdr->man_iter_off) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to set block iterator location")
+        } /* end if */
+
+        /* Get information about current iterator location */
+        if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+
+        /* Check for skipping over blocks in the current block */
+        if(min_dblock_row > next_row && next_row < iblock->nrows) {
+            unsigned min_entry;         /* Min entry for direct block requested */
+            unsigned skip_entries;      /* Number of entries to skip in the current block */
+
+            /* Compute the number of entries to skip in the current block */
+            min_entry = min_dblock_row * hdr->man_dtable.cparam.width;
+            if(min_dblock_row >= iblock->nrows)
+                skip_entries = (iblock->nrows * hdr->man_dtable.cparam.width) - next_entry;
+            else
+                skip_entries = min_entry - next_entry;
+
+            /* Add skipped direct blocks to heap's free space */
+            if(H5HF_hdr_skip_blocks(hdr, dxpl_id, iblock, next_entry, skip_entries) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't add skipped blocks to heap's free space")
+
+            /* Get information about new iterator location */
+            if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+        } /* end if */
+
+        do {
+            /* Reset conditions for leaving loop */
+            walked_up = walked_down = FALSE;
+
+            /* Check for walking off end of indirect block */
+            /* (walk up iterator) */
+            while(next_row >= iblock->nrows) {
+                /* Check for needing to expand root indirect block */
+                if(iblock->parent == NULL) {
+                    if(H5HF_man_iblock_root_double(hdr, dxpl_id, min_dblock_size) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "unable to double root indirect block")
+                } /* end if */
+                else {
+                    /* Move iterator up one level */
+                    if(H5HF_man_iter_up(&hdr->next_block) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTNEXT, FAIL, "unable to advance current block iterator location")
+
+                    /* Increment location of next block at this level */
+                    if(H5HF_man_iter_next(hdr, &hdr->next_block, 1) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't advance fractal heap block location")
+                } /* end else */
+
+                /* Get information about new iterator location */
+                if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+
+                /* Indicate that we walked up */
+                walked_up = TRUE;
+            } /* end while */
+
+            /* Check for walking into child indirect block */
+            /* (walk down iterator) */
+            if(next_row >= hdr->man_dtable.max_direct_rows) {
+                unsigned child_nrows;   /* Number of rows in new indirect block */
+
+                HDassert(!H5F_addr_defined(iblock->ents[next_entry].addr));
+
+                /* Compute # of rows in next child indirect block to use */
+                child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, hdr->man_dtable.row_block_size[next_row]);
+
+                /* Check for skipping over indirect blocks */
+                /* (that don't have direct blocks large enough to hold direct block size requested) */
+                if(hdr->man_dtable.row_block_size[child_nrows - 1] < min_dblock_size) {
+                    unsigned child_rows_needed;     /* Number of rows needed to hold direct block */
+                    unsigned child_entry;           /* Entry of child indirect block */
+
+                    /* Compute # of rows needed in child indirect block */
+                    child_rows_needed = (H5VM_log2_of2((uint32_t)min_dblock_size) - H5VM_log2_of2((uint32_t)hdr->man_dtable.cparam.start_block_size)) + 2;
+                    HDassert(child_rows_needed > child_nrows);
+                    child_entry = (next_row + (child_rows_needed - child_nrows)) * hdr->man_dtable.cparam.width;
+                    if(child_entry > (iblock->nrows * hdr->man_dtable.cparam.width))
+                        child_entry = iblock->nrows * hdr->man_dtable.cparam.width;
+
+                    /* Add skipped indirect blocks to heap's free space */
+                    if(H5HF_hdr_skip_blocks(hdr, dxpl_id, iblock, next_entry, (child_entry - next_entry)) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't add skipped blocks to heap's free space")
+                } /* end if */
+                else {
+                    H5HF_indirect_t *new_iblock;    /* Pointer to new indirect block */
+                    hbool_t did_protect;            /* Whether we protected the indirect block or not */
+                    haddr_t new_iblock_addr;        /* New indirect block's address */
+
+                    /* Allocate new indirect block */
+                    if(H5HF_man_iblock_create(hdr, dxpl_id, iblock, next_entry, child_nrows, child_nrows, &new_iblock_addr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block")
+
+                    /* Lock new indirect block */
+                    if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, new_iblock_addr, child_nrows, iblock, next_entry, FALSE, H5AC_WRITE, &did_protect)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+                    /* Move iterator down one level (pins indirect block) */
+                    if(H5HF_man_iter_down(&hdr->next_block, new_iblock) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTNEXT, FAIL, "unable to advance current block iterator location")
+
+                    /* Check for skipping over rows and add free section for skipped rows */
+                    if(min_dblock_size > hdr->man_dtable.cparam.start_block_size) {
+                        unsigned new_entry;        /* Entry of direct block which is large enough */
+
+                        /* Compute entry for direct block size requested */
+                        new_entry = hdr->man_dtable.cparam.width * min_dblock_row;
+
+                        /* Add skipped blocks to heap's free space */
+                        if(H5HF_hdr_skip_blocks(hdr, dxpl_id, new_iblock, 0, new_entry) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't add skipped blocks to heap's free space")
+                    } /* end if */
+
+                    /* Unprotect child indirect block */
+                    if(H5HF_man_iblock_unprotect(new_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+                } /* end else */
+
+                /* Get information about new iterator location */
+                if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+
+                /* Indicate that we walked down */
+                walked_down = TRUE;
+            } /* end if */
+        } while(walked_down || walked_up);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_update_iter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_inc_iter
+ *
+ * Purpose:	Advance "next block" iterator
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 23 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_inc_iter(H5HF_hdr_t *hdr, hsize_t adv_size, unsigned nentries)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(nentries);
+
+    /* Advance the iterator for the current location within the indirect block */
+    if(hdr->next_block.curr)
+        if(H5HF_man_iter_next(hdr, &hdr->next_block, nentries) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTNEXT, FAIL, "unable to advance current block iterator location")
+
+    /* Increment the offset of the iterator in the heap */
+    hdr->man_iter_off += adv_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_inc_iter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_reverse_iter
+ *
+ * Purpose:	Walk "next block" iterator backwards until the correct
+ *              location to allocate next block from is found
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr)
+{
+    H5HF_indirect_t *iblock;            /* Indirect block where iterator is located */
+    unsigned curr_entry;                /* Current entry for iterator */
+    hbool_t walked_down;                /* Loop flag */
+    hbool_t walked_up;                  /* Loop flag */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Initialize block iterator, if necessary */
+    if(!H5HF_man_iter_ready(&hdr->next_block))
+        /* Start iterator with previous offset of iterator */
+        if(H5HF_man_iter_start_offset(hdr, dxpl_id, &hdr->next_block, hdr->man_iter_off) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to set block iterator location")
+
+    /* Walk backwards through heap, looking for direct block to place iterator after */
+
+    /* Get information about current iterator location */
+    if(H5HF_man_iter_curr(&hdr->next_block, NULL, NULL, &curr_entry, &iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator information")
+
+    /* Move current iterator position backwards once */
+    curr_entry--;
+
+    /* Search backwards in the heap address space for direct block to latch onto */
+    do {
+        int tmp_entry;     /* Temp. entry for iterator (use signed value to detect errors) */
+
+        /* Reset loop flags */
+        walked_down = FALSE;
+        walked_up = FALSE;
+
+        /* Walk backwards through entries, until we find one that has a child */
+        /* (Skip direct block that will be deleted, if we find it) */
+        tmp_entry = curr_entry;
+        while(tmp_entry >= 0 &&
+                (H5F_addr_eq(iblock->ents[tmp_entry].addr, dblock_addr) ||
+                    !H5F_addr_defined(iblock->ents[tmp_entry].addr)))
+            tmp_entry--;
+        /* Check for no earlier blocks in this indirect block */
+        if(tmp_entry < 0) {
+            /* Check for parent of current indirect block */
+            if(iblock->parent) {
+                /* Move iterator to parent of current block */
+                if(H5HF_man_iter_up(&hdr->next_block) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTNEXT, FAIL, "unable to move current block iterator location up")
+
+                /* Get information about current iterator location */
+                if(H5HF_man_iter_curr(&hdr->next_block, NULL, NULL, &curr_entry, &iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator information")
+
+                /* Move current iterator position backwards once */
+                curr_entry--;
+
+                /* Note that we walked up */
+                walked_up = TRUE;
+            } /* end if */
+            else {
+                /* Reset iterator offset */
+                hdr->man_iter_off = 0;
+
+                /* Reset 'next block' iterator */
+                if(H5HF_man_iter_reset(&hdr->next_block) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reset block iterator")
+            } /* end else */
+        } /* end if */
+        else {
+            unsigned row;           /* Row for entry */
+
+            curr_entry = tmp_entry;
+
+            /* Check if entry is for a direct block */
+            row = curr_entry / hdr->man_dtable.cparam.width;
+            if(row < hdr->man_dtable.max_direct_rows) {
+                /* Increment entry to empty location */
+                curr_entry++;
+
+                /* Set the current location of the iterator to next entry after the existing direct block */
+                if(H5HF_man_iter_set_entry(hdr, &hdr->next_block, curr_entry) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "unable to set current block iterator location")
+
+                /* Update iterator offset */
+                hdr->man_iter_off = iblock->block_off;
+                hdr->man_iter_off += hdr->man_dtable.row_block_off[curr_entry / hdr->man_dtable.cparam.width];
+                hdr->man_iter_off += hdr->man_dtable.row_block_size[curr_entry / hdr->man_dtable.cparam.width] * (curr_entry % hdr->man_dtable.cparam.width);
+            } /* end if */
+            else {
+                H5HF_indirect_t *child_iblock;  /* Pointer to child indirect block */
+                hbool_t did_protect;            /* Whether we protected the indirect block or not */
+                unsigned child_nrows;           /* # of rows in child block */
+
+                /* Compute # of rows in next child indirect block to use */
+                child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, hdr->man_dtable.row_block_size[row]);
+
+                /* Lock child indirect block */
+                if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock->ents[curr_entry].addr, child_nrows, iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+                /* Set the current location of the iterator */
+                if(H5HF_man_iter_set_entry(hdr, &hdr->next_block, curr_entry) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "unable to set current block iterator location")
+
+                /* Walk down into child indirect block (pins child block) */
+                if(H5HF_man_iter_down(&hdr->next_block, child_iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTNEXT, FAIL, "unable to advance current block iterator location")
+
+                /* Update iterator location */
+                iblock = child_iblock;
+                curr_entry = (child_iblock->nrows * hdr->man_dtable.cparam.width) - 1;
+
+                /* Unprotect child indirect block */
+                if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+                /* Note that we walked down */
+                walked_down = TRUE;
+            } /* end else */
+        } /* end else */
+    } while(walked_down || walked_up);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_reverse_iter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_empty
+ *
+ * Purpose:	Reset heap header to 'empty heap' state
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_empty(H5HF_hdr_t *hdr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Reset block iterator, if necessary */
+    if(H5HF_man_iter_ready(&hdr->next_block)) {
+        if(H5HF_man_iter_reset(&hdr->next_block) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reset block iterator")
+    } /* end if */
+
+    /* Shrink managed heap size */
+    hdr->man_size = 0;
+    hdr->man_alloc_size = 0;
+
+    /* Reset the 'next block' iterator location */
+    hdr->man_iter_off = 0;
+
+    /* Reset the free space in direct blocks */
+    hdr->total_man_free = 0;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_empty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_free
+ *
+ * Purpose:	Free shared fractal heap header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_free(H5HF_hdr_t *hdr)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Free the block size lookup table for the doubling table */
+    if(H5HF_dtable_dest(&hdr->man_dtable) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap doubling table")
+
+    /* Release any I/O pipeline filter information */
+    if(hdr->pline.nused)
+        if(H5O_msg_reset(H5O_PLINE_ID, &(hdr->pline)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to reset I/O pipeline message")
+
+    /* Free the shared info itself */
+    hdr = H5FL_FREE(H5HF_hdr_t, hdr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_hdr_delete
+ *
+ * Purpose:	Delete a fractal heap, starting with the header
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  5 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_hdr_delete(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;  /* Flags for unprotecting heap header */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(!hdr->file_rc);
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Heap header's status in the metadata cache */
+
+    /* Check the heap header's status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, hdr->heap_addr, &hdr_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for heap header")
+
+    /* Sanity checks on heap header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PROTECTED);
+} /* end block */
+#endif /* NDEBUG */
+
+    /* Check for free space manager for heap */
+    /* (must occur before attempting to delete the heap, so indirect blocks
+     *  will get unpinned)
+     */
+    if(H5F_addr_defined(hdr->fs_addr)) {
+        /* Delete free space manager for heap */
+        if(H5HF_space_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap free space manager")
+    } /* end if */
+
+    /* Check for root direct/indirect block */
+    if(H5F_addr_defined(hdr->man_dtable.table_addr)) {
+        if(hdr->man_dtable.curr_root_rows == 0) {
+            hsize_t dblock_size;        /* Size of direct block */
+
+            /* Check for I/O filters on this heap */
+            if(hdr->filter_len > 0) {
+                dblock_size = (hsize_t)hdr->pline_root_direct_size;
+
+                /* Reset the header's pipeline information */
+                hdr->pline_root_direct_size = 0;
+                hdr->pline_root_direct_filter_mask = 0;
+            } /* end else */
+            else
+                dblock_size = (hsize_t)hdr->man_dtable.cparam.start_block_size;
+
+            /* Delete root direct block */
+            if(H5HF_man_dblock_delete(hdr->f, dxpl_id, hdr->man_dtable.table_addr, dblock_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap root direct block")
+        } /* end if */
+        else {
+            /* Delete root indirect block */
+            if(H5HF_man_iblock_delete(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.curr_root_rows, NULL, 0) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap root indirect block")
+        } /* end else */
+    } /* end if */
+
+    /* Check for 'huge' objects in heap */
+    if(H5F_addr_defined(hdr->huge_bt2_addr)) {
+        /* Delete huge objects in heap and their tracker */
+        if(H5HF_huge_delete(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap 'huge' objects and tracker")
+    } /* end if */
+
+    /* Indicate that the heap header should be deleted & file space freed */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    /* Unprotect the header with appropriate flags */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_HDR, hdr->heap_addr, hdr, cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_hdr_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFhuge.c b/gatb-core/thirdparty/hdf5/src/H5HFhuge.c
new file mode 100644
index 0000000..7f0da02
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFhuge.c
@@ -0,0 +1,1114 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFhuge.c
+ *			Aug  7 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Routines for "huge" objects in fractal heap
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* v2 B-tree creation macros */
+#define H5HF_HUGE_BT2_NODE_SIZE         512
+#define H5HF_HUGE_BT2_SPLIT_PERC        100
+#define H5HF_HUGE_BT2_MERGE_PERC         40
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Local v2 B-tree operations */
+static herr_t H5HF_huge_bt2_create(H5HF_hdr_t *hdr, hid_t dxpl_id);
+
+/* Local 'huge' object support routines */
+static hsize_t H5HF_huge_new_id(H5HF_hdr_t *hdr);
+static herr_t H5HF_huge_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    const uint8_t *id, hbool_t is_read, H5HF_operator_t op, void *op_data);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_bt2_create
+ *
+ * Purpose:	Create the v2 B-tree for tracking the huge objects in the heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_bt2_create(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Compute the size of 'raw' records on disk */
+    /* (Note: the size for huge IDs could be set to 'huge_id_size', instead
+     *  of 'sizeof_size', but that would make the v2 B-tree callback routines
+     *  depend on the heap header, which makes the v2 B-tree flush routines
+     *  difficult to write.  "Waste" an extra byte or for small heaps (where
+     *  the 'huge_id_size' is < 'sizeof_size' in order to make this easier -QAK)
+     */
+    if(hdr->huge_ids_direct) {
+        if(hdr->filter_len > 0) {
+            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
+                + hdr->sizeof_size          /* Length of object */
+                + 4                         /* Filter mask for filtered object */
+                + hdr->sizeof_size);        /* Size of de-filtered object in memory */
+            bt2_cparam.cls = H5HF_HUGE_BT2_FILT_DIR;
+        } /* end if */
+        else {
+            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
+                + hdr->sizeof_size);         /* Length of object */
+            bt2_cparam.cls = H5HF_HUGE_BT2_DIR;
+        } /* end else */
+    } /* end if */
+    else {
+        if(hdr->filter_len > 0) {
+            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of filtered object */
+                + hdr->sizeof_size          /* Length of filtered object */
+                + 4                         /* Filter mask for filtered object */
+                + hdr->sizeof_size          /* Size of de-filtered object in memory */
+                + hdr->sizeof_size);        /* Unique ID for object */
+            bt2_cparam.cls = H5HF_HUGE_BT2_FILT_INDIR;
+        } /* end if */
+        else {
+            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
+                + hdr->sizeof_size          /* Length of object */
+                + hdr->sizeof_size);        /* Unique ID for object */
+            bt2_cparam.cls = H5HF_HUGE_BT2_INDIR;
+        } /* end else */
+    } /* end else */
+    bt2_cparam.node_size = (size_t)H5HF_HUGE_BT2_NODE_SIZE;
+    bt2_cparam.split_percent = H5HF_HUGE_BT2_SPLIT_PERC;
+    bt2_cparam.merge_percent = H5HF_HUGE_BT2_MERGE_PERC;
+
+    /* Create v2 B-tree for tracking 'huge' objects */
+    if(NULL == (hdr->huge_bt2 = H5B2_create(hdr->f, dxpl_id, &bt2_cparam, hdr->f)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "can't create v2 B-tree for tracking 'huge' heap objects")
+
+    /* Retrieve the v2 B-tree's address in the file */
+    if(H5B2_get_addr(hdr->huge_bt2, &hdr->huge_bt2_addr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get v2 B-tree address for tracking 'huge' heap objects")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_bt2_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_init
+ *
+ * Purpose:	Initialize information for tracking 'huge' objects
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_init(H5HF_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Compute information about 'huge' objects for the heap */
+
+    /* Check if we can completely hold the 'huge' object's offset & length in
+     *  the file in the heap ID (which will speed up accessing it) and we don't
+     *  have any I/O pipeline filters.
+     */
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->id_len = %u\n", "H5HF_huge_init", (unsigned)hdr->id_len);
+HDfprintf(stderr, "%s: hdr->filter_len = %u\n", "H5HF_huge_init", (unsigned)hdr->filter_len);
+#endif /* QAK */
+    if(hdr->filter_len > 0) {
+        if((hdr->id_len - 1) >= (unsigned)(hdr->sizeof_addr + hdr->sizeof_size + 4 + hdr->sizeof_size)) {
+            /* Indicate that v2 B-tree doesn't have to be used to locate object */
+            hdr->huge_ids_direct = TRUE;
+
+            /* Set the size of 'huge' object IDs */
+            hdr->huge_id_size = (uint8_t)(hdr->sizeof_addr + hdr->sizeof_size + hdr->sizeof_size);
+        } /* end if */
+        else
+            /* Indicate that v2 B-tree must be used to access object */
+            hdr->huge_ids_direct = FALSE;
+    } /* end if */
+    else {
+        if((hdr->sizeof_addr + hdr->sizeof_size) <= (hdr->id_len - 1)) {
+            /* Indicate that v2 B-tree doesn't have to be used to locate object */
+            hdr->huge_ids_direct = TRUE;
+
+            /* Set the size of 'huge' object IDs */
+            hdr->huge_id_size = (uint8_t)(hdr->sizeof_addr + hdr->sizeof_size);
+        } /* end if */
+        else
+            /* Indicate that v2 B-tree must be used to locate object */
+            hdr->huge_ids_direct = FALSE;
+    } /* end else */
+    if(!hdr->huge_ids_direct) {
+        /* Set the size and maximum value of 'huge' object ID */
+        if((hdr->id_len - 1) < sizeof(hsize_t)) {
+            hdr->huge_id_size = (uint8_t)(hdr->id_len - 1);
+            hdr->huge_max_id = ((hsize_t)1 << (hdr->huge_id_size * 8)) - 1;
+        } /*end if */
+        else {
+            hdr->huge_id_size = sizeof(hsize_t);
+            hdr->huge_max_id = HSIZET_MAX;
+        } /* end else */
+    } /* end if */
+    hdr->huge_bt2 = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_huge_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_new_id
+ *
+ * Purpose:	Determine a new ID for an indirectly accessed 'huge' object
+ *              (either filtered or not)
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5HF_huge_new_id(H5HF_hdr_t *hdr)
+{
+    hsize_t new_id;             /* New object's ID */
+    hsize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Check for wrapping around 'huge' object ID space */
+    if(hdr->huge_ids_wrapped)
+        /* Fail for now - eventually should iterate through v2 B-tree, looking for available ID */
+        HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, 0, "wrapping 'huge' object IDs not supported yet")
+    else {
+        /* Get new 'huge' object ID to use for object */
+        /* (avoids using ID 0) */
+        new_id = ++hdr->huge_next_id;
+
+        /* Check for wrapping 'huge' object IDs around */
+        if(hdr->huge_next_id == hdr->huge_max_id)
+            hdr->huge_ids_wrapped = TRUE;
+    } /* end else */
+
+    /* Set return value */
+    ret_value = new_id;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_new_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_insert
+ *
+ * Purpose:	Insert a 'huge' object into the file and track it
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size, void *obj,
+    void *_id)
+{
+    uint8_t *id = (uint8_t *)_id;       /* Pointer to ID buffer */
+    haddr_t obj_addr;                   /* Address of object in the file */
+    void *write_buf;                    /* Pointer to buffer to write */
+    size_t write_size;                  /* Size of [possibly filtered] object written to file */
+    unsigned filter_mask = 0;           /* Filter mask for object (only used for filtered objects) */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef QAK
+HDfprintf(stderr, "%s: obj_size = %Zu\n", FUNC, obj_size);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(obj_size > hdr->max_man_size);
+    HDassert(obj);
+    HDassert(id);
+
+    /* Check if the v2 B-tree for tracking 'huge' heap objects has been created yet */
+    if(!H5F_addr_defined(hdr->huge_bt2_addr)) {
+        /* Go create (& open) v2 B-tree */
+        if(H5HF_huge_bt2_create(hdr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "can't create v2 B-tree for tracking 'huge' heap objects")
+    } /* end if */
+    else {
+        /* Check if v2 B-tree is open yet */
+        if(NULL == hdr->huge_bt2) {
+            /* Open existing v2 B-tree */
+            if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+        } /* end if */
+    } /* end else */
+    HDassert(hdr->huge_bt2);
+
+    /* Check for I/O pipeline filter on heap */
+    if(hdr->filter_len > 0) {
+        H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+        size_t nbytes;                      /* Number of bytes used */
+
+        /* Allocate buffer to perform I/O filtering on */
+        write_size = obj_size;
+        if(NULL == (write_buf = H5MM_malloc(write_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+        HDmemcpy(write_buf, obj, write_size);
+
+        /* Push direct block data through I/O filter pipeline */
+        nbytes = write_size;
+        if(H5Z_pipeline(&(hdr->pline), 0, &filter_mask, H5Z_NO_EDC,
+                 filter_cb, &nbytes, &write_size, &write_buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, FAIL, "output pipeline failed")
+#ifdef QAK
+HDfprintf(stderr, "%s: nbytes = %Zu, write_size = %Zu, write_buf = %p\n", FUNC, nbytes, write_size, write_buf);
+HDfprintf(stderr, "%s: obj_size = %Zu, obj = %p\n", FUNC, obj_size, obj);
+#endif /* QAK */
+
+        /* Update size of object on disk */
+        write_size = nbytes;
+    } /* end if */
+    else {
+        write_buf = obj;
+        write_size = obj_size;
+    } /* end else */
+
+    /* Allocate space in the file for storing the 'huge' object */
+    if(HADDR_UNDEF == (obj_addr = H5MF_alloc(hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, dxpl_id, (hsize_t)write_size)))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap huge object")
+
+    /* Write the object's data to disk */
+    if(H5F_block_write(hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, obj_addr, write_size, dxpl_id, write_buf) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "writing 'huge' object to file failed")
+
+    /* Release buffer for writing, if we had one */
+    if(write_buf != obj) {
+        HDassert(hdr->filter_len > 0);
+        H5MM_xfree(write_buf);
+    } /* end if */
+
+    /* Perform different actions for directly & indirectly accessed 'huge' objects */
+    if(hdr->huge_ids_direct) {
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_dir_rec_t obj_rec;        /* Record for tracking object */
+
+            /* Initialize record for tracking object in v2 B-tree */
+            obj_rec.addr = obj_addr;
+            obj_rec.len = write_size;
+            obj_rec.filter_mask = filter_mask;
+            obj_rec.obj_size = obj_size;
+#ifdef QAK
+HDfprintf(stderr, "%s: obj_rec = {%a, %Hu, %x, %Hu}\n", FUNC, obj_rec.addr, obj_rec.len, obj_rec.filter_mask, obj_rec.obj_size);
+#endif /* QAK */
+
+            /* Insert record for object in v2 B-tree */
+            if(H5B2_insert(hdr->huge_bt2, dxpl_id, &obj_rec) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "couldn't insert object tracking record in v2 B-tree")
+
+            /* Encode ID for user */
+            *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_HUGE;
+            H5F_addr_encode(hdr->f, &id, obj_addr);
+            H5F_ENCODE_LENGTH(hdr->f, id, (hsize_t)write_size);
+            UINT32ENCODE(id, filter_mask);
+            H5F_ENCODE_LENGTH(hdr->f, id, (hsize_t)obj_size);
+        } /* end if */
+        else {
+            H5HF_huge_bt2_dir_rec_t obj_rec;        /* Record for tracking object */
+
+            /* Initialize record for tracking object in v2 B-tree */
+            obj_rec.addr = obj_addr;
+            obj_rec.len = write_size;
+#ifdef QAK
+HDfprintf(stderr, "%s: obj_rec = {%a, %Hu}\n", FUNC, obj_rec.addr, obj_rec.len);
+#endif /* QAK */
+
+            /* Insert record for object in v2 B-tree */
+            if(H5B2_insert(hdr->huge_bt2, dxpl_id, &obj_rec) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "couldn't insert object tracking record in v2 B-tree")
+
+            /* Encode ID for user */
+            *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_HUGE;
+            H5F_addr_encode(hdr->f, &id, obj_addr);
+            H5F_ENCODE_LENGTH(hdr->f, id, (hsize_t)write_size);
+        } /* end if */
+    } /* end if */
+    else {
+        H5HF_huge_bt2_filt_indir_rec_t filt_indir_rec;      /* Record for tracking filtered object */
+        H5HF_huge_bt2_indir_rec_t indir_rec;    /* Record for tracking non-filtered object */
+        void *ins_rec;          /* Pointer to record to insert */
+        hsize_t new_id;         /* New ID for object */
+
+        /* Get new ID for object */
+        if(0 == (new_id = H5HF_huge_new_id(hdr)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't generate new ID for object")
+
+        if(hdr->filter_len > 0) {
+            /* Initialize record for object in v2 B-tree */
+            filt_indir_rec.addr = obj_addr;
+            filt_indir_rec.len = write_size;
+            filt_indir_rec.filter_mask = filter_mask;
+            filt_indir_rec.obj_size = obj_size;
+            filt_indir_rec.id = new_id;
+#ifdef QAK
+HDfprintf(stderr, "%s: filt_indir_rec = {%a, %Hu, %x, %Hu, %Hu}\n", FUNC, filt_indir_rec.addr, filt_indir_rec.len, filt_indir_rec.filter_mask, filt_indir_rec.obj_size, filt_indir_rec.id);
+#endif /* QAK */
+
+            /* Set pointer to record to insert */
+            ins_rec = &filt_indir_rec;
+        } /* end if */
+        else {
+            /* Initialize record for object in v2 B-tree */
+            indir_rec.addr = obj_addr;
+            indir_rec.len = write_size;
+            indir_rec.id = new_id;
+#ifdef QAK
+HDfprintf(stderr, "%s: indir_rec = {%a, %Hu, %Hu}\n", FUNC, indir_rec.addr, indir_rec.len, indir_rec.id);
+#endif /* QAK */
+
+            /* Set pointer to record to insert */
+            ins_rec = &indir_rec;
+        } /* end else */
+
+        /* Insert record for tracking object in v2 B-tree */
+        if(H5B2_insert(hdr->huge_bt2, dxpl_id, ins_rec) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "couldn't insert object tracking record in v2 B-tree")
+
+        /* Encode ID for user */
+        *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_HUGE;
+        UINT64ENCODE_VAR(id, new_id, hdr->huge_id_size)
+    } /* end else */
+
+    /* Update statistics about heap */
+    hdr->huge_size += obj_size;
+    hdr->huge_nobjs++;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_get_obj_len
+ *
+ * Purpose:	Get the size of a 'huge' object in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    size_t *obj_len_p)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+    HDassert(id);
+    HDassert(obj_len_p);
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Check if 'huge' object ID encodes address & length directly */
+    if(hdr->huge_ids_direct) {
+        if(hdr->filter_len > 0) {
+            /* Skip over filtered object info */
+            id += hdr->sizeof_addr + hdr->sizeof_size + 4;
+
+            /* Retrieve the object's length */
+            H5F_DECODE_LENGTH(hdr->f, id, *obj_len_p);
+        } /* end if */
+        else {
+            /* Skip over object offset in file */
+            id += hdr->sizeof_addr;
+
+            /* Retrieve the object's length */
+            H5F_DECODE_LENGTH(hdr->f, id, *obj_len_p);
+        } /* end else */
+    } /* end if */
+    else {
+        /* Check if v2 B-tree is open yet */
+        if(NULL == hdr->huge_bt2) {
+            /* Open existing v2 B-tree */
+            if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+        } /* end if */
+
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_filt_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's length */
+            *obj_len_p = (size_t)found_rec.obj_size;
+        } /* end if */
+        else {
+            H5HF_huge_bt2_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's length */
+            *obj_len_p = (size_t)found_rec.len;
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_get_obj_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_op_real
+ *
+ * Purpose:	Internal routine to perform an operation on a 'huge' object
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_huge_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    hbool_t is_read, H5HF_operator_t op, void *op_data)
+{
+    void *read_buf = NULL;              /* Pointer to buffer for reading */
+    haddr_t obj_addr;                   /* Object's address in the file */
+    size_t obj_size = 0;                /* Object's size in the file */
+    unsigned filter_mask = 0;           /* Filter mask for object (only used for filtered objects) */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(is_read || op);
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Check for 'huge' object ID that encodes address & length directly */
+    if(hdr->huge_ids_direct) {
+        /* Retrieve the object's address and length (common) */
+        H5F_addr_decode(hdr->f, &id, &obj_addr);
+        H5F_DECODE_LENGTH(hdr->f, id, obj_size);
+
+        /* Retrieve extra information needed for filtered objects */
+        if(hdr->filter_len > 0)
+            UINT32DECODE(id, filter_mask);
+    } /* end if */
+    else {
+        /* Sanity check */
+        HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+
+        /* Check if v2 B-tree is open yet */
+        if(NULL == hdr->huge_bt2) {
+            /* Open existing v2 B-tree */
+            if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+        } /* end if */
+
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_filt_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's address & length */
+            obj_addr = found_rec.addr;
+            H5_CHECKED_ASSIGN(obj_size, size_t, found_rec.len, hsize_t);
+            filter_mask = found_rec.filter_mask;
+        } /* end if */
+        else {
+            H5HF_huge_bt2_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's address & length */
+            obj_addr = found_rec.addr;
+            H5_CHECKED_ASSIGN(obj_size, size_t, found_rec.len, hsize_t);
+        } /* end else */
+    } /* end else */
+
+    /* Set up buffer for reading */
+    if(hdr->filter_len > 0 || !is_read) {
+        if(NULL == (read_buf = H5MM_malloc((size_t)obj_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+    } /* end if */
+    else
+        read_buf = op_data;
+
+    /* Read the object's (possibly filtered) data from the file */
+    /* (reads directly into application's buffer if no filters are present) */
+    if(H5F_block_read(hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, obj_addr, (size_t)obj_size, dxpl_id, read_buf) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_READERROR, FAIL, "can't read 'huge' object's data from the file")
+
+    /* Check for I/O pipeline filter on heap */
+    if(hdr->filter_len > 0) {
+        H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+        size_t read_size;                   /* Object's size in the file */
+        size_t nbytes;                      /* Number of bytes used */
+
+        /* De-filter the object */
+        read_size = nbytes = obj_size;
+        if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_NO_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, FAIL, "input filter failed")
+        obj_size = nbytes;
+    } /* end if */
+
+    /* Perform correct operation on buffer read in */
+    if(is_read) {
+        /* Copy object to user's buffer if there's filters on heap data */
+        /* (if there's no filters, the object was read directly into the user's buffer) */
+        if(hdr->filter_len > 0)
+            HDmemcpy(op_data, read_buf, (size_t)obj_size);
+    } /* end if */
+    else {
+        /* Call the user's 'op' callback */
+        if(op(read_buf, (size_t)obj_size, op_data) < 0) {
+            /* Release buffer */
+            read_buf = H5MM_xfree(read_buf);
+
+            /* Indicate error */
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "application's callback failed")
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the buffer for reading */
+    if(read_buf && read_buf != op_data)
+        read_buf = H5MM_xfree(read_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_op_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_write
+ *
+ * Purpose:	Write a 'huge' object to the heap
+ *
+ * Note:	This implementation somewhat limited: it doesn't handle
+ *		heaps with filters, which would require re-compressing the
+ *		huge object and probably changing the address of the object
+ *		on disk (and possibly the heap ID for "direct" huge IDs).
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 21 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    const void *obj)
+{
+    haddr_t obj_addr;                   /* Object's address in the file */
+    size_t obj_size;                    /* Object's size in the file */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Check for filters on the heap */
+    if(hdr->filter_len > 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "modifying 'huge' object with filters not supported yet")
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Check for 'huge' object ID that encodes address & length directly */
+    if(hdr->huge_ids_direct) {
+        /* Retrieve the object's address and length (common) */
+        H5F_addr_decode(hdr->f, &id, &obj_addr);
+        H5F_DECODE_LENGTH(hdr->f, id, obj_size);
+    } /* end if */
+    else {
+        H5HF_huge_bt2_indir_rec_t found_rec;  /* Record found from tracking object */
+        H5HF_huge_bt2_indir_rec_t search_rec; /* Record for searching for object */
+
+        /* Sanity check */
+        HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+
+        /* Check if v2 B-tree is open yet */
+        if(NULL == hdr->huge_bt2) {
+            /* Open existing v2 B-tree */
+            if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+        } /* end if */
+
+        /* Get ID for looking up 'huge' object in v2 B-tree */
+        UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+        /* Look up object in v2 B-tree */
+        if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+            HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+        /* Retrieve the object's address & length */
+        obj_addr = found_rec.addr;
+        H5_CHECKED_ASSIGN(obj_size, size_t, found_rec.len, hsize_t);
+    } /* end else */
+
+    /* Write the object's data to the file */
+    /* (writes directly from application's buffer) */
+    if(H5F_block_write(hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, obj_addr, obj_size, dxpl_id, obj) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "writing 'huge' object to file failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_read
+ *
+ * Purpose:	Read a 'huge' object from the heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sept 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_read(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, void *obj)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Call the internal 'op' routine */
+    if(H5HF_huge_op_real(hdr, dxpl_id, id, TRUE, NULL, obj) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_op
+ *
+ * Purpose:	Operate directly on a 'huge' object
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sept 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    H5HF_operator_t op, void *op_data)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(op);
+
+    /* Call the internal 'op' routine routine */
+    if(H5HF_huge_op_real(hdr, dxpl_id, id, FALSE, op, op_data) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_remove
+ *
+ * Purpose:	Remove a 'huge' object from the file and the v2 B-tree tracker
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
+{
+    H5HF_huge_remove_ud_t udata;       /* User callback data for v2 B-tree remove call */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+    HDassert(id);
+
+    /* Check if v2 B-tree is open yet */
+    if(NULL == hdr->huge_bt2) {
+        /* Open existing v2 B-tree */
+        if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+    } /* end if */
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Set up the common callback info */
+    udata.hdr = hdr;
+    udata.dxpl_id = dxpl_id;
+
+    /* Check for 'huge' object ID that encodes address & length directly */
+    if(hdr->huge_ids_direct) {
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_dir_rec_t search_rec;     /* Record for searching for object */
+
+            /* Retrieve the object's address and length */
+            /* (used as key in v2 B-tree record) */
+            H5F_addr_decode(hdr->f, &id, &search_rec.addr);
+            H5F_DECODE_LENGTH(hdr->f, id, search_rec.len);
+
+            /* Remove the record for tracking the 'huge' object from the v2 B-tree */
+            /* (space in the file for the object is freed in the 'remove' callback) */
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_dir_remove, &udata) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
+        } /* end if */
+        else {
+            H5HF_huge_bt2_dir_rec_t search_rec;     /* Record for searching for object */
+
+            /* Retrieve the object's address and length */
+            /* (used as key in v2 B-tree record) */
+            H5F_addr_decode(hdr->f, &id, &search_rec.addr);
+            H5F_DECODE_LENGTH(hdr->f, id, search_rec.len);
+
+            /* Remove the record for tracking the 'huge' object from the v2 B-tree */
+            /* (space in the file for the object is freed in the 'remove' callback) */
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_dir_remove, &udata) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
+        } /* end else */
+    } /* end if */
+    else {
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_indir_rec_t search_rec;     /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Remove the record for tracking the 'huge' object from the v2 B-tree */
+            /* (space in the file for the object is freed in the 'remove' callback) */
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_remove, &udata) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
+        } /* end if */
+        else {
+            H5HF_huge_bt2_indir_rec_t search_rec;     /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Remove the record for tracking the 'huge' object from the v2 B-tree */
+            /* (space in the file for the object is freed in the 'remove' callback) */
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_remove, &udata) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
+        } /* end else */
+    } /* end else */
+
+    /* Update statistics about heap */
+    hdr->huge_size -= udata.obj_len;
+    hdr->huge_nobjs--;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_term
+ *
+ * Purpose:	Shut down the information for tracking 'huge' objects
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_term(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Check if v2 B-tree index is open */
+    if(hdr->huge_bt2) {
+        /* Sanity check */
+        HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+
+        /* Close v2 B-tree index */
+        if(H5B2_close(hdr->huge_bt2, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree")
+        hdr->huge_bt2 = NULL;
+    } /* end if */
+
+    /* Check if there are no more 'huge' objects in the heap and delete the
+     *  v2 B-tree that tracks them, if so
+     */
+    if(H5F_addr_defined(hdr->huge_bt2_addr) && hdr->huge_nobjs == 0) {
+        /* Sanity check */
+        HDassert(hdr->huge_size == 0);
+
+        /* Delete the v2 B-tree */
+        /* (any v2 B-tree class will work here) */
+        if(H5B2_delete(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "can't delete v2 B-tree")
+
+        /* Reset the information about 'huge' objects in the file */
+        hdr->huge_bt2_addr = HADDR_UNDEF;
+        hdr->huge_next_id = 0;
+        hdr->huge_ids_wrapped = FALSE;
+
+        /* Mark heap header as modified */
+        if(H5HF_hdr_dirty(hdr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_term() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_huge_delete
+ *
+ * Purpose:	Delete all the 'huge' objects in the heap, and the v2 B-tree
+ *              tracker for them
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_huge_delete(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    H5HF_huge_remove_ud_t udata;       /* User callback data for v2 B-tree remove call */
+    H5B2_remove_t op;                   /* Callback for v2 B-tree removal */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+    HDassert(hdr->huge_nobjs);
+    HDassert(hdr->huge_size);
+
+    /* Set up the callback info */
+    udata.hdr = hdr;
+    udata.dxpl_id = dxpl_id;
+
+    /* Set the v2 B-tree callback operator */
+    if(hdr->huge_ids_direct) {
+        if(hdr->filter_len > 0)
+            op = H5HF_huge_bt2_filt_dir_remove;
+        else
+            op = H5HF_huge_bt2_dir_remove;
+    } /* end if */
+    else {
+        if(hdr->filter_len > 0)
+            op = H5HF_huge_bt2_filt_indir_remove;
+        else
+            op = H5HF_huge_bt2_indir_remove;
+    } /* end else */
+
+    /* Delete the v2 B-tree */
+    if(H5B2_delete(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f, op, &udata) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "can't delete v2 B-tree")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_huge_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFiblock.c b/gatb-core/thirdparty/hdf5/src/H5HFiblock.c
new file mode 100644
index 0000000..c989bfc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFiblock.c
@@ -0,0 +1,1737 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFiblock.c
+ *			Apr 10 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Indirect block routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5HF_iblock_pin(H5HF_indirect_t *iblock);
+static herr_t H5HF_iblock_unpin(H5HF_indirect_t *iblock);
+static herr_t H5HF_man_iblock_root_halve(H5HF_indirect_t *root_iblock, hid_t dxpl_id);
+static herr_t H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5HF_indirect_t struct */
+H5FL_DEFINE(H5HF_indirect_t);
+
+/* Declare a free list to manage the H5HF_indirect_ent_t sequence information */
+H5FL_SEQ_DEFINE(H5HF_indirect_ent_t);
+
+/* Declare a free list to manage the H5HF_indirect_filt_ent_t sequence information */
+H5FL_SEQ_DEFINE(H5HF_indirect_filt_ent_t);
+
+/* Declare a free list to manage the H5HF_indirect_t * sequence information */
+H5FL_SEQ_DEFINE(H5HF_indirect_ptr_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_pin
+ *
+ * Purpose:	Pin an indirect block in memory
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_iblock_pin(H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(iblock);
+
+    /* Mark block as un-evictable */
+    if(H5AC_pin_protected_entry(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin fractal heap indirect block")
+
+    /* If this indirect block has a parent, update it's child iblock pointer */
+    if(iblock->parent) {
+        H5HF_indirect_t *par_iblock = iblock->parent;    /* Parent indirect block */
+        unsigned indir_idx;             /* Index in parent's child iblock pointer array */
+
+        /* Sanity check */
+        HDassert(par_iblock->child_iblocks);
+        HDassert(iblock->par_entry >= (iblock->hdr->man_dtable.max_direct_rows
+                * iblock->hdr->man_dtable.cparam.width));
+
+        /* Compute index in parent's child iblock pointer array */
+        indir_idx = iblock->par_entry - (iblock->hdr->man_dtable.max_direct_rows
+                * iblock->hdr->man_dtable.cparam.width);
+
+        /* Set pointer to pinned indirect block in parent */
+        HDassert(par_iblock->child_iblocks[indir_idx] == NULL);
+        par_iblock->child_iblocks[indir_idx] = iblock;
+    } /* end if */
+    else {
+        /* Check for pinning the root indirect block */
+        if(iblock->block_off == 0) {
+            /* Sanity check - shouldn't be recursively pinning root indirect block */
+            HDassert(0 == (iblock->hdr->root_iblock_flags & H5HF_ROOT_IBLOCK_PINNED));
+
+            /* Check if we should set the root iblock pointer */
+            if(0 == iblock->hdr->root_iblock_flags) {
+                HDassert(NULL == iblock->hdr->root_iblock);
+                iblock->hdr->root_iblock = iblock;
+            } /* end if */
+
+            /* Indicate that the root indirect block is pinned */
+            iblock->hdr->root_iblock_flags |= H5HF_ROOT_IBLOCK_PINNED;
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_pin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_unpin
+ *
+ * Purpose:	Unpin an indirect block in the metadata cache
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_iblock_unpin(H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* If this indirect block has a parent, reset it's child iblock pointer */
+    if(iblock->parent) {
+        H5HF_indirect_t *par_iblock = iblock->parent;    /* Parent indirect block */
+        unsigned indir_idx;             /* Index in parent's child iblock pointer array */
+
+        /* Sanity check */
+        HDassert(par_iblock->child_iblocks);
+        HDassert(iblock->par_entry >= (iblock->hdr->man_dtable.max_direct_rows
+                * iblock->hdr->man_dtable.cparam.width));
+
+        /* Compute index in parent's child iblock pointer array */
+        indir_idx = iblock->par_entry - (iblock->hdr->man_dtable.max_direct_rows
+                * iblock->hdr->man_dtable.cparam.width);
+
+        /* Reset pointer to pinned child indirect block in parent */
+        HDassert(par_iblock->child_iblocks[indir_idx]);
+        par_iblock->child_iblocks[indir_idx] = NULL;
+    } /* end if */
+    else {
+        /* Check for root indirect block */
+        if(iblock->block_off == 0) {
+            /* Sanity check - shouldn't be recursively unpinning root indirect block */
+            HDassert(iblock->hdr->root_iblock_flags & H5HF_ROOT_IBLOCK_PINNED);
+
+            /* Check if we should reset the root iblock pointer */
+            if(H5HF_ROOT_IBLOCK_PINNED == iblock->hdr->root_iblock_flags) {
+                HDassert(NULL != iblock->hdr->root_iblock);
+                iblock->hdr->root_iblock = NULL;
+            } /* end if */
+
+            /* Indicate that the root indirect block is unpinned */
+            iblock->hdr->root_iblock_flags &= ~(H5HF_ROOT_IBLOCK_PINNED);
+        } /* end if */
+    } /* end else */
+
+    /* Mark block as evictable again */
+    if(H5AC_unpin_entry(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap indirect block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_unpin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_incr
+ *
+ * Purpose:	Increment reference count on shared indirect block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_iblock_incr(H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(iblock);
+    HDassert(iblock->block_off == 0 || iblock->parent);
+
+    /* Mark block as un-evictable when a child block is depending on it */
+    if(iblock->rc == 0)
+        if(H5HF_iblock_pin(iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin fractal heap indirect block")
+
+    /* Increment reference count on shared indirect block */
+    iblock->rc++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_decr
+ *
+ * Purpose:	Decrement reference count on shared indirect block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 27 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_iblock_decr(H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* Decrement reference count on shared indirect block */
+    iblock->rc--;
+
+    /* Mark block as evictable again when no child blocks depend on it */
+    if(iblock->rc == 0) {
+        H5HF_hdr_t *hdr;			/* Fractal heap header */
+        haddr_t iblock_addr;		/* Address of fractal heap */
+        hbool_t expunge_iblock = FALSE;     /* Whether to expunge indirect block from heap */
+
+        /* Set up convenience variables */
+        hdr = iblock->hdr;
+        iblock_addr = iblock->addr;
+
+        if(iblock->nchildren == 0) {
+            /* Check for deleting root indirect block (and no root direct block) */
+            if(iblock->block_off == 0 && hdr->man_dtable.curr_root_rows > 0) {
+                /* Reset root pointer information */
+                hdr->man_dtable.curr_root_rows = 0;
+                hdr->man_dtable.table_addr = HADDR_UNDEF;
+
+                /* Reset header information back to "empty heap" state */
+                if(H5HF_hdr_empty(hdr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't make heap empty")
+            } /* end if */
+
+            /* Detach from parent indirect block */
+            if(iblock->parent) {
+                /* Detach from parent indirect block */
+                if(H5HF_man_iblock_detach(iblock->parent, H5AC_dxpl_id, iblock->par_entry) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't detach from parent indirect block")
+                iblock->parent = NULL;
+                iblock->par_entry = 0;
+            } /* end if */
+
+	    /* Mark indirect block for removal from the metadata cache */
+	    expunge_iblock = TRUE;
+        } /* end if */
+
+	/* Unpin the indirect block */
+        if(H5HF_iblock_unpin(iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap indirect block")
+
+	/* Check for expunging the indirect block from the metadata cache */
+	if(expunge_iblock) {
+            /* Evict the indirect block from the metadata cache */
+            if(H5AC_expunge_entry(hdr->f, H5AC_dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, H5AC__FREE_FILE_SPACE_FLAG) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove indirect block from cache")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_iblock_dirty
+ *
+ * Purpose:	Mark indirect block as dirty
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_iblock_dirty(H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* Mark indirect block as dirty in cache */
+    if(H5AC_mark_entry_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark fractal heap indirect block as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_iblock_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_root_create
+ *
+ * Purpose:	Create root indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size)
+{
+    H5HF_indirect_t *iblock;        /* Pointer to indirect block */
+    haddr_t iblock_addr;            /* Indirect block's address */
+    hsize_t acc_dblock_free;        /* Accumulated free space in direct blocks */
+    hbool_t have_direct_block;      /* Flag to indicate a direct block already exists */
+    hbool_t did_protect;            /* Whether we protected the indirect block or not */
+    unsigned nrows;                 /* Number of rows for root indirect block */
+    unsigned u;                     /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check for allocating entire root indirect block initially */
+    if(hdr->man_dtable.cparam.start_root_rows == 0)
+        nrows = hdr->man_dtable.max_root_rows;
+    else {
+        unsigned rows_needed;   /* Number of rows needed to get to direct block size */
+        unsigned block_row_off; /* Row offset from larger block sizes */
+
+        nrows = hdr->man_dtable.cparam.start_root_rows;
+
+        block_row_off = H5VM_log2_of2((uint32_t)min_dblock_size) - H5VM_log2_of2((uint32_t)hdr->man_dtable.cparam.start_block_size);
+        if(block_row_off > 0)
+            block_row_off++;        /* Account for the pair of initial rows of the initial block size */
+        rows_needed = 1 + block_row_off;
+        if(nrows < rows_needed)
+            nrows = rows_needed;
+    } /* end else */
+
+    /* Allocate root indirect block */
+    if(H5HF_man_iblock_create(hdr, dxpl_id, NULL, 0, nrows, hdr->man_dtable.max_root_rows, &iblock_addr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block")
+
+    /* Move current direct block (used as root) into new indirect block */
+
+    /* Lock new indirect block */
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC_WRITE, &did_protect)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+    /* Check if there's already a direct block as root) */
+    have_direct_block = H5F_addr_defined(hdr->man_dtable.table_addr);
+    if(have_direct_block) {
+        H5HF_direct_t *dblock;          /* Pointer to direct block to query */
+
+        /* Lock first (root) direct block */
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.cparam.start_block_size, NULL, 0, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
+
+        /* Attach direct block to new root indirect block */
+        dblock->parent = iblock;
+        dblock->par_entry = 0;
+        if(H5HF_man_iblock_attach(iblock, 0, hdr->man_dtable.table_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach root direct block to parent indirect block")
+
+        /* Check for I/O filters on this heap */
+        if(hdr->filter_len > 0) {
+            /* Set the pipeline filter information from the header */
+            iblock->filt_ents[0].size = hdr->pline_root_direct_size;
+            iblock->filt_ents[0].filter_mask = hdr->pline_root_direct_filter_mask;
+
+            /* Reset the header's pipeline information */
+            hdr->pline_root_direct_size = 0;
+            hdr->pline_root_direct_filter_mask = 0;
+        } /* end if */
+
+        /* Scan free space sections to set any 'parent' pointers to new indirect block */
+        if(H5HF_space_create_root(hdr, dxpl_id, iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "can't set free space section info to new root indirect block")
+
+        /* Unlock first (previously the root) direct block */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block")
+        dblock = NULL;
+    } /* end if */
+
+    /* Start iterator at correct location */
+    if(H5HF_hdr_start_iter(hdr, iblock, (hsize_t)(have_direct_block ? hdr->man_dtable.cparam.start_block_size : 0), have_direct_block) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize block iterator")
+
+    /* Check for skipping over direct blocks, in order to get to large enough block */
+    if(min_dblock_size > hdr->man_dtable.cparam.start_block_size) {
+        /* Add skipped blocks to heap's free space */
+        if(H5HF_hdr_skip_blocks(hdr, dxpl_id, iblock, have_direct_block,
+                ((nrows - 1) * hdr->man_dtable.cparam.width) - have_direct_block) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't add skipped blocks to heap's free space")
+    } /* end if */
+
+    /* Mark indirect block as modified */
+    if(H5HF_iblock_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty")
+
+    /* Unprotect root indirect block (it's pinned by the iterator though) */
+    if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__DIRTIED_FLAG, did_protect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+    iblock = NULL;
+
+    /* Point heap header at new indirect block */
+    hdr->man_dtable.curr_root_rows = nrows;
+    hdr->man_dtable.table_addr = iblock_addr;
+
+    /* Compute free space in direct blocks referenced from entries in root indirect block */
+    acc_dblock_free = 0;
+    for(u = 0; u < nrows; u++)
+        acc_dblock_free += hdr->man_dtable.row_tot_dblock_free[u] * hdr->man_dtable.cparam.width;
+
+    /* Account for potential initial direct block */
+    if(have_direct_block)
+        acc_dblock_free -= hdr->man_dtable.row_tot_dblock_free[0];
+
+    /* Extend heap to cover new root indirect block */
+    if(H5HF_hdr_adjust_heap(hdr, hdr->man_dtable.row_block_off[nrows], (hssize_t)acc_dblock_free) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "can't increase space to cover root direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_root_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_root_double
+ *
+ * Purpose:	Double size of root indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_root_double(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size)
+{
+    H5HF_indirect_t *iblock;    /* Pointer to root indirect block */
+    haddr_t new_addr;           /* New address of indirect block */
+    hsize_t acc_dblock_free;    /* Accumulated free space in direct blocks */
+    hsize_t next_size;          /* The previous value of the "next size" for the new block iterator */
+    hsize_t old_iblock_size;    /* Old size of indirect block */
+    unsigned next_row;          /* The next row to allocate block in */
+    unsigned next_entry;        /* The previous value of the "next entry" for the new block iterator */
+    unsigned new_next_entry = 0;/* The new value of the "next entry" for the new block iterator */
+    unsigned min_nrows = 0;     /* Min. # of direct rows */
+    unsigned old_nrows;         /* Old # of rows */
+    unsigned new_nrows;         /* New # of rows */
+    hbool_t skip_direct_rows = FALSE;   /* Whether we are skipping direct rows */
+    size_t u;                   /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get "new block" iterator information */
+    if(H5HF_man_iter_curr(&hdr->next_block, &next_row, NULL, &next_entry, &iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve current block iterator location")
+    next_size = hdr->man_dtable.row_block_size[next_row];
+
+    /* Make certain the iterator is at the root indirect block */
+    HDassert(iblock->parent == NULL);
+    HDassert(iblock->block_off == 0);
+
+    /* Keep this for later */
+    old_nrows = iblock->nrows;
+
+    /* Check for skipping over direct block rows */
+    if(iblock->nrows < hdr->man_dtable.max_direct_rows && min_dblock_size > next_size) {
+        /* Sanity check */
+        HDassert(min_dblock_size > hdr->man_dtable.cparam.start_block_size);
+
+        /* Set flag */
+        skip_direct_rows = TRUE;
+
+        /* Make certain we allocate at least the required row for the block requested */
+        min_nrows = 1 + H5HF_dtable_size_to_row(&hdr->man_dtable, min_dblock_size);
+
+        /* Set the information for the next block, of the appropriate size */
+        new_next_entry = (min_nrows - 1) * hdr->man_dtable.cparam.width;
+    } /* end if */
+
+    /* Compute new # of rows in indirect block */
+    new_nrows = MAX(min_nrows, MIN(2 * iblock->nrows, iblock->max_rows));
+
+    /* Check if the indirect block is NOT currently allocated in temp. file space */
+    /* (temp. file space does not need to be freed) */
+    if(!H5F_IS_TMP_ADDR(hdr->f, iblock->addr)) {
+/* Currently, the old block data is "thrown away" after the space is reallocated,
+* to avoid data copy in H5MF_realloc() call by just free'ing the space and
+* allocating new space.
+*
+* This also keeps the file smaller, by freeing the space and then
+* allocating new space, instead of vice versa (in H5MF_realloc).
+*
+* QAK - 3/14/2006
+*/
+        /* Free previous indirect block disk space */
+        if(H5MF_xfree(hdr->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, iblock->addr, (hsize_t)iblock->size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap indirect block file space")
+    } /* end if */
+
+    /* Compute size of buffer needed for new indirect block */
+    iblock->nrows = new_nrows;
+    old_iblock_size = iblock->size;
+    iblock->size = H5HF_MAN_INDIRECT_SIZE(hdr, iblock->nrows);
+
+    /* Allocate [temporary] space for the new indirect block on disk */
+    if(H5F_USE_TMP_SPACE(hdr->f)) {
+        if(HADDR_UNDEF == (new_addr = H5MF_alloc_tmp(hdr->f, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end if */
+    else {
+        if(HADDR_UNDEF == (new_addr = H5MF_alloc(hdr->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end else */
+
+    /* Resize pinned indirect block in the cache, if its changed size */
+    if(old_iblock_size != iblock->size) {
+        if(H5AC_resize_entry(iblock, (size_t)iblock->size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap indirect block")
+    } /* end if */
+
+    /* Move object in cache, if it actually was relocated */
+    if(H5F_addr_ne(iblock->addr, new_addr)) {
+        if(H5AC_move_entry(hdr->f, H5AC_FHEAP_IBLOCK, iblock->addr, new_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move fractal heap root indirect block")
+        iblock->addr = new_addr;
+    } /* end if */
+
+    /* Re-allocate child block entry array */
+    if(NULL == (iblock->ents = H5FL_SEQ_REALLOC(H5HF_indirect_ent_t, iblock->ents, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for direct entries")
+
+    /* Check for skipping over rows and add free section for skipped rows */
+    if(skip_direct_rows) {
+        /* Add skipped blocks to heap's free space */
+        if(H5HF_hdr_skip_blocks(hdr, dxpl_id, iblock, next_entry, (new_next_entry - next_entry)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't add skipped blocks to heap's free space")
+    } /* end if */
+
+    /* Initialize new direct block entries in rows added */
+    acc_dblock_free = 0;
+    for(u = (old_nrows * hdr->man_dtable.cparam.width); u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
+        unsigned row = u / hdr->man_dtable.cparam.width;        /* Row for current entry */
+
+        iblock->ents[u].addr = HADDR_UNDEF;
+        acc_dblock_free += hdr->man_dtable.row_tot_dblock_free[row];
+    } /* end for */
+
+    /* Check for needing to re-allocate filtered entry array */
+    if(hdr->filter_len > 0 && old_nrows < hdr->man_dtable.max_direct_rows) {
+        unsigned dir_rows;      /* Number of direct rows in this indirect block */
+
+        /* Compute the number of direct rows for this indirect block */
+        dir_rows = MIN(iblock->nrows, hdr->man_dtable.max_direct_rows);
+        HDassert(dir_rows > old_nrows);
+
+        /* Re-allocate filtered direct block entry array */
+        if(NULL == (iblock->filt_ents = H5FL_SEQ_REALLOC(H5HF_indirect_filt_ent_t, iblock->filt_ents, (size_t)(dir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for filtered direct entries")
+
+        /* Initialize new entries allocated */
+        for(u = (old_nrows * hdr->man_dtable.cparam.width); u < (dir_rows * hdr->man_dtable.cparam.width); u++) {
+            iblock->filt_ents[u].size = 0;
+            iblock->filt_ents[u].filter_mask = 0;
+        } /* end for */
+    } /* end if */
+
+    /* Check for needing to re-allocate child iblock pointer array */
+    if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+        unsigned indir_rows;      /* Number of indirect rows in this indirect block */
+        unsigned old_indir_rows;  /* Previous number of indirect rows in this indirect block */
+
+        /* Compute the number of direct rows for this indirect block */
+        indir_rows = iblock->nrows - hdr->man_dtable.max_direct_rows;
+
+        /* Re-allocate child indirect block array */
+        if(NULL == (iblock->child_iblocks = H5FL_SEQ_REALLOC(H5HF_indirect_ptr_t, iblock->child_iblocks, (size_t)(indir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for filtered direct entries")
+
+        /* Compute the previous # of indirect rows in this block */
+        if(old_nrows < hdr->man_dtable.max_direct_rows)
+            old_indir_rows = 0;
+        else
+            old_indir_rows = old_nrows - hdr->man_dtable.max_direct_rows;
+
+        /* Initialize new entries allocated */
+        for(u = (old_indir_rows * hdr->man_dtable.cparam.width); u < (indir_rows * hdr->man_dtable.cparam.width); u++)
+            iblock->child_iblocks[u] = NULL;
+    } /* end if */
+
+    /* Mark indirect block as dirty */
+    if(H5HF_iblock_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty")
+
+    /* Update other shared header info */
+    hdr->man_dtable.curr_root_rows = new_nrows;
+    hdr->man_dtable.table_addr = new_addr;
+
+    /* Extend heap to cover new root indirect block */
+    if(H5HF_hdr_adjust_heap(hdr, 2 * hdr->man_dtable.row_block_off[new_nrows - 1], (hssize_t)acc_dblock_free) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "can't increase space to cover root direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_root_double() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_root_halve
+ *
+ * Purpose:	Halve size of root indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jun 12 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_man_iblock_root_halve(H5HF_indirect_t *iblock, hid_t dxpl_id)
+{
+    H5HF_hdr_t *hdr = iblock->hdr;      /* Pointer to heap header */
+    haddr_t new_addr;                   /* New address of indirect block */
+    hsize_t acc_dblock_free;            /* Accumulated free space in direct blocks */
+    hsize_t old_size;                   /* Old size of indirect block */
+    unsigned max_child_row;             /* Row for max. child entry */
+    unsigned old_nrows;                 /* Old # of rows */
+    unsigned new_nrows;                 /* New # of rows */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(iblock);
+    HDassert(iblock->parent == NULL);
+    HDassert(hdr);
+
+    /* Compute maximum row used by child of indirect block */
+    max_child_row = iblock->max_child / hdr->man_dtable.cparam.width;
+
+    /* Compute new # of rows in root indirect block */
+    new_nrows = 1 << (1 + H5VM_log2_gen((uint64_t)max_child_row));
+
+    /* Check if the indirect block is NOT currently allocated in temp. file space */
+    /* (temp. file space does not need to be freed) */
+    if(!H5F_IS_TMP_ADDR(hdr->f, iblock->addr)) {
+/* Currently, the old block data is "thrown away" after the space is reallocated,
+* to avoid data copy in H5MF_realloc() call by just free'ing the space and
+* allocating new space.
+*
+* This also keeps the file smaller, by freeing the space and then
+* allocating new space, instead of vice versa (in H5MF_realloc).
+*
+* QAK - 6/12/2006
+*/
+        /* Free previous indirect block disk space */
+        if(H5MF_xfree(hdr->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, iblock->addr, (hsize_t)iblock->size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap indirect block file space")
+    } /* end if */
+
+    /* Compute free space in rows to delete */
+    acc_dblock_free = 0;
+    for(u = new_nrows; u < iblock->nrows; u++)
+        acc_dblock_free += hdr->man_dtable.row_tot_dblock_free[u] * hdr->man_dtable.cparam.width;
+
+    /* Compute size of buffer needed for new indirect block */
+    old_nrows = iblock->nrows;
+    iblock->nrows = new_nrows;
+    old_size = iblock->size;
+    iblock->size = H5HF_MAN_INDIRECT_SIZE(hdr, iblock->nrows);
+
+    /* Allocate [temporary] space for the new indirect block on disk */
+    if(H5F_USE_TMP_SPACE(hdr->f)) {
+        if(HADDR_UNDEF == (new_addr = H5MF_alloc_tmp(hdr->f, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end if */
+    else {
+        if(HADDR_UNDEF == (new_addr = H5MF_alloc(hdr->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end else */
+
+    /* Resize pinned indirect block in the cache, if it has changed size */
+    if(old_size != iblock->size) {
+        if(H5AC_resize_entry(iblock, (size_t)iblock->size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap indirect block")
+    } /* end if */
+
+    /* Move object in cache, if it actually was relocated */
+    if(H5F_addr_ne(iblock->addr, new_addr)) {
+        if(H5AC_move_entry(hdr->f, H5AC_FHEAP_IBLOCK, iblock->addr, new_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSPLIT, FAIL, "unable to move fractal heap root indirect block")
+        iblock->addr = new_addr;
+    } /* end if */
+
+    /* Re-allocate child block entry array */
+    if(NULL == (iblock->ents = H5FL_SEQ_REALLOC(H5HF_indirect_ent_t, iblock->ents, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct entries")
+
+    /* Check for needing to re-allocate filtered entry array */
+    if(hdr->filter_len > 0 && new_nrows < hdr->man_dtable.max_direct_rows) {
+        /* Re-allocate filtered direct block entry array */
+        if(NULL == (iblock->filt_ents = H5FL_SEQ_REALLOC(H5HF_indirect_filt_ent_t, iblock->filt_ents, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for filtered direct entries")
+    } /* end if */
+
+    /* Check for needing to re-allocate child iblock pointer array */
+    if(old_nrows > hdr->man_dtable.max_direct_rows) {
+        /* Check for shrinking away child iblock pointer array */
+        if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+            unsigned indir_rows;      /* Number of indirect rows in this indirect block */
+
+            /* Compute the number of direct rows for this indirect block */
+            indir_rows = iblock->nrows - hdr->man_dtable.max_direct_rows;
+
+            /* Re-allocate child indirect block array */
+            if(NULL == (iblock->child_iblocks = H5FL_SEQ_REALLOC(H5HF_indirect_ptr_t, iblock->child_iblocks, (size_t)(indir_rows * hdr->man_dtable.cparam.width))))
+                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for filtered direct entries")
+        } /* end if */
+        else
+            iblock->child_iblocks = (H5HF_indirect_ptr_t *)H5FL_SEQ_FREE(H5HF_indirect_ptr_t, iblock->child_iblocks);
+    } /* end if */
+
+    /* Mark indirect block as dirty */
+    if(H5HF_iblock_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty")
+
+    /* Update other shared header info */
+    hdr->man_dtable.curr_root_rows = new_nrows;
+    hdr->man_dtable.table_addr = new_addr;
+
+    /* Shrink heap to only cover new root indirect block */
+    if(H5HF_hdr_adjust_heap(hdr, 2 * hdr->man_dtable.row_block_off[new_nrows - 1], -(hssize_t)acc_dblock_free) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce space to cover root direct block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_root_halve() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_root_revert
+ *
+ * Purpose:	Revert root indirect block back to root direct block
+ *
+ * Note:	Any sections left pointing to the  old root indirect block
+ *              will be cleaned up by the free space manager
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id)
+{
+    H5HF_hdr_t *hdr;                    /* Pointer to heap's header */
+    H5HF_direct_t *dblock = NULL;       /* Pointer to new root indirect block */
+    haddr_t dblock_addr;                /* Direct block's address in the file */
+    size_t dblock_size;                 /* Direct block's size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(root_iblock);
+
+    /* Set up local convenience variables */
+    hdr = root_iblock->hdr;
+    dblock_addr = root_iblock->ents[0].addr;
+    dblock_size = hdr->man_dtable.cparam.start_block_size;
+
+    /* Get pointer to last direct block */
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, root_iblock, 0, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
+    HDassert(dblock->parent == root_iblock);
+    HDassert(dblock->par_entry == 0);
+
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
+        /* Set the header's pipeline information from the indirect block */
+        hdr->pline_root_direct_size = root_iblock->filt_ents[0].size;
+        hdr->pline_root_direct_filter_mask = root_iblock->filt_ents[0].filter_mask;
+    } /* end if */
+
+    /* Detach direct block from parent */
+    if(H5HF_man_iblock_detach(dblock->parent, dxpl_id, 0) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't detach direct block from parent indirect block")
+    dblock->parent = NULL;
+    dblock->par_entry = 0;
+
+    /* Point root at direct block */
+    hdr->man_dtable.curr_root_rows = 0;
+    hdr->man_dtable.table_addr = dblock_addr;
+
+    /* Reset 'next block' iterator */
+    if(H5HF_hdr_reset_iter(hdr, (hsize_t)dblock_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't reset block iterator")
+
+    /* Extend heap to just cover first direct block */
+    if(H5HF_hdr_adjust_heap(hdr, (hsize_t)hdr->man_dtable.cparam.start_block_size, (hssize_t)hdr->man_dtable.row_tot_dblock_free[0]) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "can't increase space to cover root direct block")
+
+    /* Scan free space sections to reset any 'parent' pointers */
+    if(H5HF_space_revert_root(hdr, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRESET, FAIL, "can't reset free space section info")
+
+
+done:
+    if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_root_revert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_alloc_row
+ *
+ * Purpose:	Allocate a "single" section for an object, out of a
+ *              "row" section.
+ *
+ * Note:	Creates necessary direct & indirect blocks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_alloc_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t **sec_node)
+{
+    H5HF_indirect_t *iblock = NULL;     /* Pointer to indirect block */
+    H5HF_free_section_t *old_sec_node = *sec_node; /* Pointer to old indirect section node */
+    unsigned dblock_entry;              /* Entry for direct block */
+    hbool_t iblock_held = FALSE;        /* Flag to indicate that indirect block is held */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sec_node && old_sec_node);
+    HDassert(old_sec_node->u.row.row < hdr->man_dtable.max_direct_rows);
+
+    /* Check for serialized section */
+    if(old_sec_node->sect_info.state == H5FS_SECT_SERIALIZED) {
+        /* Revive indirect section */
+        if(H5HF_sect_row_revive(hdr, dxpl_id, old_sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREVIVE, FAIL, "can't revive indirect section")
+    } /* end if */
+
+    /* Get a pointer to the indirect block covering the section */
+    if(NULL == (iblock = H5HF_sect_row_get_iblock(old_sec_node)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve indirect block for row section")
+
+    /* Hold indirect block in memory, until direct block can point to it */
+    if(H5HF_iblock_incr(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+    iblock_held = TRUE;
+
+    /* Reduce (& possibly re-add) 'row' section */
+    if(H5HF_sect_row_reduce(hdr, dxpl_id, old_sec_node, &dblock_entry) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce row section node")
+
+    /* Create direct block & single section */
+    if(H5HF_man_dblock_create(dxpl_id, hdr, iblock, dblock_entry, NULL, sec_node) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap direct block")
+
+done:
+    /* Release hold on indirect block */
+    if(iblock_held)
+        if(H5HF_iblock_decr(iblock) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_alloc_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_create
+ *
+ * Purpose:	Allocate & initialize a managed indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *par_iblock,
+    unsigned par_entry, unsigned nrows, unsigned max_rows, haddr_t *addr_p)
+{
+    H5HF_indirect_t *iblock = NULL;     /* Pointer to indirect block */
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(nrows > 0);
+    HDassert(addr_p);
+
+    /*
+     * Allocate file and memory data structures.
+     */
+    if(NULL == (iblock = H5FL_MALLOC(H5HF_indirect_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fractal heap indirect block")
+
+    /* Reset the metadata cache info for the heap header */
+    HDmemset(&iblock->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Share common heap information */
+    iblock->hdr = hdr;
+    if(H5HF_hdr_incr(hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared heap header")
+
+    /* Set info for direct block */
+    iblock->rc = 0;
+    iblock->nrows = nrows;
+    iblock->max_rows = max_rows;
+
+    /* Compute size of buffer needed for indirect block */
+    iblock->size = H5HF_MAN_INDIRECT_SIZE(hdr, iblock->nrows);
+
+    /* Allocate child block entry array */
+    if(NULL == (iblock->ents = H5FL_SEQ_MALLOC(H5HF_indirect_ent_t, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for block entries")
+
+    /* Initialize indirect block entry tables */
+    for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++)
+        iblock->ents[u].addr = HADDR_UNDEF;
+
+    /* Check for I/O filters to apply to this heap */
+    if(hdr->filter_len > 0) {
+        unsigned dir_rows;      /* Number of direct rows in this indirect block */
+
+        /* Compute the number of direct rows for this indirect block */
+        dir_rows = MIN(iblock->nrows, hdr->man_dtable.max_direct_rows);
+
+        /* Allocate & initialize indirect block filtered entry array */
+        if(NULL == (iblock->filt_ents = H5FL_SEQ_CALLOC(H5HF_indirect_filt_ent_t, (size_t)(dir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for block entries")
+    } /* end if */
+    else
+        iblock->filt_ents = NULL;
+
+    /* Check if we have any indirect block children */
+    if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+        unsigned indir_rows;      /* Number of indirect rows in this indirect block */
+
+        /* Compute the number of indirect rows for this indirect block */
+        indir_rows = iblock->nrows - hdr->man_dtable.max_direct_rows;
+
+        /* Allocate & initialize child indirect block pointer array */
+        if(NULL == (iblock->child_iblocks = H5FL_SEQ_CALLOC(H5HF_indirect_ptr_t, (size_t)(indir_rows * hdr->man_dtable.cparam.width))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for block entries")
+    } /* end if */
+    else
+        iblock->child_iblocks = NULL;
+
+    /* Allocate [temporary] space for the indirect block on disk */
+    if(H5F_USE_TMP_SPACE(hdr->f)) {
+        if(HADDR_UNDEF == (*addr_p = H5MF_alloc_tmp(hdr->f, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end if */
+    else {
+        if(HADDR_UNDEF == (*addr_p = H5MF_alloc(hdr->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    } /* end else */
+    iblock->addr = *addr_p;
+
+    /* Attach to parent indirect block, if there is one */
+    iblock->parent = par_iblock;
+    iblock->par_entry = par_entry;
+    if(iblock->parent) {
+        /* Attach new block to parent */
+        if(H5HF_man_iblock_attach(iblock->parent, par_entry, *addr_p) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach indirect block to parent indirect block")
+
+        /* Compute the indirect block's offset in the heap's address space */
+        /* (based on parent's block offset) */
+        iblock->block_off = par_iblock->block_off;
+        iblock->block_off += hdr->man_dtable.row_block_off[par_entry / hdr->man_dtable.cparam.width];
+        iblock->block_off += hdr->man_dtable.row_block_size[par_entry / hdr->man_dtable.cparam.width] * (par_entry % hdr->man_dtable.cparam.width);
+    } /* end if */
+    else
+        iblock->block_off = 0;  /* Must be the root indirect block... */
+
+    /* Update indirect block's statistics */
+    iblock->nchildren = 0;
+    iblock->max_child = 0;
+
+    /* Cache the new indirect block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, *addr_p, iblock, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add fractal heap indirect block to cache")
+
+done:
+    if(ret_value < 0)
+        if(iblock)
+            if(H5HF_man_iblock_dest(iblock) < 0)
+                HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_protect
+ *
+ * Purpose:	Convenience wrapper around H5AC_protect on an indirect block
+ *
+ * Return:	Pointer to indirect block on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_indirect_t *
+H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
+    unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry,
+    hbool_t must_protect, H5AC_protect_t rw, hbool_t *did_protect)
+{
+    H5HF_parent_t par_info;             /* Parent info for loading block */
+    H5HF_indirect_t *iblock = NULL;     /* Indirect block from cache */
+    hbool_t should_protect = FALSE;     /* Whether we should protect the indirect block or not */
+    H5HF_indirect_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(iblock_addr));
+    HDassert(iblock_nrows > 0);
+    HDassert(did_protect);
+
+    /* Check if we are allowed to use existing pinned iblock pointer */
+    if(!must_protect) {
+        /* Check for this block already being pinned */
+        if(par_iblock) {
+            unsigned indir_idx;             /* Index in parent's child iblock pointer array */
+
+            /* Sanity check */
+            HDassert(par_iblock->child_iblocks);
+            HDassert(par_entry >= (hdr->man_dtable.max_direct_rows
+                    * hdr->man_dtable.cparam.width));
+
+            /* Compute index in parent's child iblock pointer array */
+            indir_idx = par_entry - (hdr->man_dtable.max_direct_rows
+                    * hdr->man_dtable.cparam.width);
+
+            /* Check for pointer to pinned indirect block in parent */
+            if(par_iblock->child_iblocks[indir_idx])
+                iblock = par_iblock->child_iblocks[indir_idx];
+            else
+                should_protect = TRUE;
+        } /* end if */
+        else {
+            /* Check for root indirect block */
+            if(H5F_addr_eq(iblock_addr, hdr->man_dtable.table_addr)) {
+                /* Check for valid pointer to pinned indirect block in root */
+                if(H5HF_ROOT_IBLOCK_PINNED == hdr->root_iblock_flags) {
+                    /* Sanity check */
+                    HDassert(NULL != hdr->root_iblock);
+
+                    /* Return the pointer to the pinned root indirect block */
+                    iblock = hdr->root_iblock;
+                } /* end if */
+                else {
+                    /* Sanity check */
+                    HDassert(NULL == hdr->root_iblock);
+
+                    should_protect = TRUE;
+                } /* end else */
+            } /* end if */
+            else
+                should_protect = TRUE;
+        } /* end else */
+    } /* end if */
+
+    /* Check for protecting indirect block */
+    if(must_protect || should_protect) {
+        H5HF_iblock_cache_ud_t cache_udata; /* User-data for callback */
+
+        /* Set up parent info */
+        par_info.hdr = hdr;
+        par_info.iblock = par_iblock;
+        par_info.entry = par_entry;
+
+        /* Set up user data for protect call */
+        cache_udata.f = hdr->f;
+        cache_udata.par_info = &par_info;
+        cache_udata.nrows = &iblock_nrows;
+
+        /* Protect the indirect block */
+        if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, &cache_udata, rw)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap indirect block")
+
+        /* Set the indirect block's address */
+        iblock->addr = iblock_addr;
+
+        /* Check for root indirect block */
+        if(iblock->block_off == 0) {
+            /* Sanity check - shouldn't be recursively protecting root indirect block */
+            HDassert(0 == (hdr->root_iblock_flags & H5HF_ROOT_IBLOCK_PROTECTED));
+
+            /* Check if we should set the root iblock pointer */
+            if(0 == hdr->root_iblock_flags) {
+                HDassert(NULL == hdr->root_iblock);
+                hdr->root_iblock = iblock;
+            } /* end if */
+
+            /* Indicate that the root indirect block is protected */
+            hdr->root_iblock_flags |= H5HF_ROOT_IBLOCK_PROTECTED;
+        } /* end if */
+
+        /* Indicate that the indirect block was protected */
+        *did_protect = TRUE;
+    } /* end if */
+    else
+        /* Indicate that the indirect block was _not_ protected */
+        *did_protect = FALSE;
+
+    /* Set the return value */
+    ret_value = iblock;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_unprotect
+ *
+ * Purpose:	Convenience wrapper around H5AC_unprotect on an indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id,
+    unsigned cache_flags, hbool_t did_protect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+
+    /* Check if we previously protected this indirect block */
+    /* (as opposed to using an existing pointer to a pinned child indirect block) */
+    if(did_protect) {
+        /* Check for root indirect block */
+        if(iblock->block_off == 0) {
+            /* Sanity check - shouldn't be recursively unprotecting root indirect block */
+            HDassert(iblock->hdr->root_iblock_flags & H5HF_ROOT_IBLOCK_PROTECTED);
+
+            /* Check if we should reset the root iblock pointer */
+            if(H5HF_ROOT_IBLOCK_PROTECTED == iblock->hdr->root_iblock_flags) {
+                HDassert(NULL != iblock->hdr->root_iblock);
+                iblock->hdr->root_iblock = NULL;
+            } /* end if */
+
+            /* Indicate that the root indirect block is unprotected */
+            iblock->hdr->root_iblock_flags &= ~(H5HF_ROOT_IBLOCK_PROTECTED);
+        } /* end if */
+
+        /* Unprotect the indirect block */
+        if(H5AC_unprotect(iblock->hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock->addr, iblock, cache_flags) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_attach
+ *
+ * Purpose:	Attach a child block (direct or indirect) to an indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 30 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry, haddr_t child_addr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(H5F_addr_defined(child_addr));
+    HDassert(!H5F_addr_defined(iblock->ents[entry].addr));
+
+    /* Increment the reference count on this indirect block */
+    if(H5HF_iblock_incr(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+
+    /* Point at the child block */
+    iblock->ents[entry].addr = child_addr;
+
+    /* Check for I/O filters on this heap */
+    if(iblock->hdr->filter_len > 0) {
+        unsigned row;           /* Row for entry */
+
+        /* Sanity check */
+        HDassert(iblock->filt_ents);
+
+        /* Compute row for entry */
+        row = entry / iblock->hdr->man_dtable.cparam.width;
+
+        /* If this is a direct block, set its initial size */
+        if(row < iblock->hdr->man_dtable.max_direct_rows)
+            iblock->filt_ents[entry].size = iblock->hdr->man_dtable.row_block_size[row];
+    } /* end if */
+
+    /* Check for max. entry used */
+    if(entry > iblock->max_child)
+        iblock->max_child = entry;
+
+    /* Increment the # of child blocks */
+    iblock->nchildren++;
+
+    /* Mark indirect block as modified */
+    if(H5HF_iblock_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_attach() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_detach
+ *
+ * Purpose:	Detach a child block (direct or indirect) from an indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_detach(H5HF_indirect_t *iblock, hid_t dxpl_id, unsigned entry)
+{
+    unsigned row;                       /* Row for entry */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(iblock->nchildren);
+
+    /* Reset address of entry */
+    iblock->ents[entry].addr = HADDR_UNDEF;
+
+    /* Compute row for entry */
+    row = entry / iblock->hdr->man_dtable.cparam.width;
+
+    /* Check for I/O filters on this heap */
+    if(iblock->hdr->filter_len > 0) {
+        /* Sanity check */
+        HDassert(iblock->filt_ents);
+
+        /* If this is a direct block, reset its initial size */
+        if(row < iblock->hdr->man_dtable.max_direct_rows) {
+            iblock->filt_ents[entry].size = 0;
+            iblock->filt_ents[entry].filter_mask = 0;
+        } /* end if */
+    } /* end if */
+
+    /* Check for indirect block being detached */
+    if(row >= iblock->hdr->man_dtable.max_direct_rows) {
+        unsigned indir_idx;             /* Index in parent's child iblock pointer array */
+
+        /* Sanity check */
+        HDassert(iblock->child_iblocks);
+
+        /* Compute index in child iblock pointer array */
+        indir_idx = entry - (iblock->hdr->man_dtable.max_direct_rows
+                * iblock->hdr->man_dtable.cparam.width);
+
+        /* Sanity check */
+        HDassert(iblock->child_iblocks[indir_idx]);
+
+        /* Reset pointer to child indirect block in parent */
+        iblock->child_iblocks[indir_idx] = NULL;
+    } /* end if */
+
+    /* Decrement the # of child blocks */
+    /* (If the number of children drop to 0, the indirect block will be
+     *  removed from the heap when its ref. count drops to zero and the
+     *  metadata cache calls the indirect block destructor)
+     */
+    iblock->nchildren--;
+
+    /* Reduce the max. entry used, if necessary */
+    if(entry == iblock->max_child) {
+        if(iblock->nchildren > 0)
+            while(!H5F_addr_defined(iblock->ents[iblock->max_child].addr))
+                iblock->max_child--;
+        else
+            iblock->max_child = 0;
+    } /* end if */
+
+    /* If this is the root indirect block handle some special cases */
+    if(iblock->block_off == 0) {
+        /* If the number of children drops to 1, and that child is the first
+         *      direct block in the heap, convert the heap back to using a root
+         *      direct block
+         */
+        if(iblock->nchildren == 1 && H5F_addr_defined(iblock->ents[0].addr))
+            if(H5HF_man_iblock_root_revert(iblock, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't convert root indirect block back to root direct block")
+
+        /* Check for reducing size of root indirect block */
+        if(iblock->nchildren > 0 && iblock->hdr->man_dtable.cparam.start_root_rows != 0
+                && entry > iblock->max_child) {
+            unsigned max_child_row;         /* Row for max. child entry */
+
+            /* Compute information needed for determining whether to reduce size of root indirect block */
+            max_child_row = iblock->max_child / iblock->hdr->man_dtable.cparam.width;
+
+            /* Check if the root indirect block should be reduced */
+            if(iblock->nrows > 1 && max_child_row <= (iblock->nrows / 2))
+                if(H5HF_man_iblock_root_halve(iblock, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce size of root indirect block")
+        } /* end if */
+    } /* end if */
+
+    /* Mark indirect block as modified */
+    if(H5HF_iblock_dirty(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty")
+
+    /* Decrement the reference count on this indirect block */
+    /* (should be last, so that potential 'unpin' on this indirect block
+     *  doesn't invalidate the 'iblock' variable)
+     */
+    if(H5HF_iblock_decr(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_detach() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_entry_addr
+ *
+ * Purpose:	Retrieve the address of an indirect block's child
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_entry_addr(H5HF_indirect_t *iblock, unsigned entry, haddr_t *child_addr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(child_addr);
+
+    /* Retrieve address of entry */
+    *child_addr = iblock->ents[entry].addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iblock_entry_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_delete
+ *
+ * Purpose:	Delete a managed indirect block
+ *
+ * Note:	This routine does _not_ modify any indirect block that points
+ *              to this indirect block, it is assumed that the whole heap is
+ *              being deleted in a top-down fashion.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
+    unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry)
+{
+    H5HF_indirect_t *iblock;            /* Pointer to indirect block */
+    unsigned row, col;                  /* Current row & column in indirect block */
+    unsigned entry;                     /* Current entry in row */
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;      /* Flags for unprotecting indirect block */
+    hbool_t did_protect;                /* Whether we protected the indirect block or not */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(iblock_addr));
+    HDassert(iblock_nrows > 0);
+
+    /* Lock indirect block */
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, par_iblock, par_entry, TRUE, H5AC_WRITE, &did_protect)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+    HDassert(iblock->nchildren > 0);
+    HDassert(did_protect == TRUE);
+
+    /* Iterate over rows in this indirect block */
+    entry = 0;
+    for(row = 0; row < iblock->nrows; row++) {
+        /* Iterate over entries in this row */
+        for(col = 0; col < hdr->man_dtable.cparam.width; col++, entry++) {
+            /* Check for child entry at this position */
+            if(H5F_addr_defined(iblock->ents[entry].addr)) {
+                hsize_t row_block_size;         /* The size of blocks in this row */
+
+                /* Get the row's block size */
+                row_block_size = (hsize_t)hdr->man_dtable.row_block_size[row];
+
+                /* Are we in a direct or indirect block row */
+                if(row < hdr->man_dtable.max_direct_rows) {
+                    hsize_t dblock_size;        /* Size of direct block on disk */
+
+                    /* Check for I/O filters on this heap */
+                    if(hdr->filter_len > 0)
+                        dblock_size = iblock->filt_ents[entry].size;
+                    else
+                        dblock_size = row_block_size;
+
+                    /* Delete child direct block */
+                    if(H5HF_man_dblock_delete(hdr->f, dxpl_id, iblock->ents[entry].addr, dblock_size) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap child direct block")
+                } /* end if */
+                else {
+                    unsigned child_nrows;   /* Number of rows in new indirect block */
+
+                    /* Compute # of rows in next child indirect block to use */
+                    child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, row_block_size);
+
+                    /* Delete child indirect block */
+                    if(H5HF_man_iblock_delete(hdr, dxpl_id, iblock->ents[entry].addr, child_nrows, iblock, entry) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap child indirect block")
+                } /* end else */
+            } /* end if */
+        } /* end for */
+    } /* end row */
+
+#ifndef NDEBUG
+{
+    unsigned iblock_status = 0;         /* Indirect block's status in the metadata cache */
+
+    /* Check the indirect block's status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, iblock_addr, &iblock_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for indirect block")
+
+    /* Check if indirect block is pinned */
+    HDassert(!(iblock_status & H5AC_ES__IS_PINNED));
+}
+#endif /* NDEBUG */
+
+    /* Indicate that the indirect block should be deleted & file space freed */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    /* Unprotect the indirect block, with appropriate flags */
+    if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, cache_flags, did_protect) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5HF_man_iblock_size
+ *
+ * Purpose:     Gather storage used for the indirect block in fractal heap
+ *
+ * Return:      non-negative on success, negative on error
+ *
+ * Programmer:  Vailin Choi
+ *              July 12 2007
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_addr,
+    unsigned nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, hsize_t *heap_size)
+{
+    H5HF_indirect_t     *iblock = NULL;         /* Pointer to indirect block */
+    hbool_t             did_protect;            /* Whether we protected the indirect block or not */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(iblock_addr));
+    HDassert(heap_size);
+
+    /* Protect the indirect block */
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, par_iblock, par_entry, FALSE, H5AC_READ, &did_protect)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block")
+
+    /* Accumulate size of this indirect block */
+    *heap_size += iblock->size;
+
+    /* Indirect entries in this indirect block */
+    if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
+	unsigned    first_row_bits;     /* Number of bits used bit addresses in first row */
+        unsigned    num_indirect_rows;  /* Number of rows of blocks in each indirect block */
+        unsigned    entry;              /* Current entry in row */
+        size_t      u;                  /* Local index variable */
+
+        entry = hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width;
+	first_row_bits = H5VM_log2_of2((uint32_t)hdr->man_dtable.cparam.start_block_size) +
+			    H5VM_log2_of2(hdr->man_dtable.cparam.width);
+        num_indirect_rows =
+	    (H5VM_log2_gen(hdr->man_dtable.row_block_size[hdr->man_dtable.max_direct_rows]) - first_row_bits) + 1;
+        for(u = hdr->man_dtable.max_direct_rows; u < iblock->nrows; u++, num_indirect_rows++) {
+            size_t      v;                      /* Local index variable */
+
+	    for(v = 0; v < hdr->man_dtable.cparam.width; v++, entry++)
+		if(H5F_addr_defined(iblock->ents[entry].addr))
+		    if(H5HF_man_iblock_size(f, dxpl_id, hdr, iblock->ents[entry].addr, num_indirect_rows, iblock, entry, heap_size) < 0)
+			HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to get fractal heap storage info for indirect block")
+        } /* end for */
+    } /* end if */
+
+done:
+    /* Release the indirect block */
+    if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+    iblock = NULL;
+
+   FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iblock_dest
+ *
+ * Purpose:	Destroys a fractal heap indirect block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iblock_dest(H5HF_indirect_t *iblock)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(iblock);
+    HDassert(iblock->rc == 0);
+
+    /* Decrement reference count on shared info */
+    HDassert(iblock->hdr);
+    if(H5HF_hdr_decr(iblock->hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
+    if(iblock->parent)
+        if(H5HF_iblock_decr(iblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    /* Release entry tables */
+    if(iblock->ents)
+        iblock->ents = H5FL_SEQ_FREE(H5HF_indirect_ent_t, iblock->ents);
+    if(iblock->filt_ents)
+        iblock->filt_ents = H5FL_SEQ_FREE(H5HF_indirect_filt_ent_t, iblock->filt_ents);
+    if(iblock->child_iblocks)
+        iblock->child_iblocks = H5FL_SEQ_FREE(H5HF_indirect_ptr_t, iblock->child_iblocks);
+
+    /* Free fractal heap indirect block info */
+    iblock = H5FL_FREE(H5HF_indirect_t, iblock);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iblock_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFiter.c b/gatb-core/thirdparty/hdf5/src/H5HFiter.c
new file mode 100644
index 0000000..137d0ee
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFiter.c
@@ -0,0 +1,664 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFiter.c
+ *			Apr 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Block iteration routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HF_block_loc_t struct */
+H5FL_DEFINE(H5HF_block_loc_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_init
+ *
+ * Purpose:	Initialize a block iterator for walking over all the blocks
+ *              in a fractal heap.  (initialization finishes when iterator is
+ *              actually used)
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_init(H5HF_block_iter_t *biter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+
+    /* Reset block iterator information */
+    HDmemset(biter, 0, sizeof(H5HF_block_iter_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iter_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_start_offset
+ *
+ * Purpose:	Initialize a block iterator to a particular location, given
+ *              an offset in the heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_block_iter_t *biter, hsize_t offset)
+{
+    H5HF_indirect_t *iblock;        /* Indirect block for location context */
+    haddr_t iblock_addr;            /* Address of indirect block */
+    unsigned iblock_nrows;          /* # of rows in indirect block */
+    H5HF_indirect_t *iblock_parent; /* Parent indirect block of location context */
+    unsigned iblock_par_entry;      /* Entry within parent indirect block */
+    hsize_t curr_offset;        /* Current offset, as adjusted */
+    unsigned row;               /* Current row we are on */
+    unsigned col;               /* Column in row */
+    hbool_t root_block = TRUE;  /* Flag to indicate the current block is the root indirect block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(!biter->ready);
+
+    /* Check for empty heap */
+    HDassert(offset >= hdr->man_dtable.cparam.start_block_size);
+
+    /* Allocate level structure */
+    if(NULL == (biter->curr = H5FL_MALLOC(H5HF_block_loc_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section")
+
+/*
+1:  <Scan down block offsets for dtable rows until find a row >= offset>
+    <Set current location's row, col, entry & size>
+    <If row < max_direct_rows>
+        <Done>
+    <Else - row > max_direct_rows>
+        <Create new block level>
+        <Link new block level into iterator>
+        <Adjust offset for block offset for row>
+        <Make new block level the current context>
+        <Goto 1>
+
+*/
+    do {
+        hbool_t did_protect;            /* Whether we protected the indirect block or not */
+
+        /* Walk down the rows in the doubling table until we've found the correct row for the next block */
+        for(row = 0; row < hdr->man_dtable.max_root_rows; row++)
+            if((offset >= hdr->man_dtable.row_block_off[row]) &&
+                    (offset < hdr->man_dtable.row_block_off[row] +
+                        (hdr->man_dtable.cparam.width * hdr->man_dtable.row_block_size[row])))
+                break;
+
+        /* Adjust offset by row offset */
+        curr_offset = offset - hdr->man_dtable.row_block_off[row];
+
+        /* Compute column */
+        H5_CHECK_OVERFLOW((curr_offset / hdr->man_dtable.row_block_size[row]), hsize_t, unsigned);
+        col = (unsigned)(curr_offset / hdr->man_dtable.row_block_size[row]);
+
+        /* Set the current level's context */
+        biter->curr->row = row;
+        biter->curr->col = col;
+        biter->curr->entry = (row * hdr->man_dtable.cparam.width) + col;
+
+        /* Get the context indirect block's information */
+        if(root_block) {
+            iblock_addr = hdr->man_dtable.table_addr;
+            iblock_nrows = hdr->man_dtable.curr_root_rows;
+            iblock_parent = NULL;
+            iblock_par_entry = 0;
+
+            /* The root block can't go up further... */
+            biter->curr->up = NULL;
+
+            /* Next time through the loop will not be with the root indirect block */
+            root_block = FALSE;
+        } /* end if */
+        else {
+            hsize_t child_size;     /* Size of new indirect block to create */
+
+            /* Retrieve the parent information from the previous context location */
+            iblock_parent = biter->curr->up->context;
+            iblock_par_entry = biter->curr->up->entry;
+
+            /* Look up the address of context indirect block */
+            iblock_addr = iblock_parent->ents[iblock_par_entry].addr;
+
+            /* Compute # of rows in context indirect block */
+            child_size = hdr->man_dtable.row_block_size[biter->curr->up->row];
+            iblock_nrows = (H5VM_log2_gen(child_size) - hdr->man_dtable.first_row_bits) + 1;
+        } /* end else */
+
+        /* Load indirect block for this context location */
+        if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC_WRITE, &did_protect)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+
+        /* Make indirect block the context for the current location */
+        biter->curr->context = iblock;
+
+        /* Hold the indirect block with the location */
+        if(H5HF_iblock_incr(biter->curr->context) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+
+        /* Release the current indirect block */
+        if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+        iblock = NULL;
+
+        /* See if the location falls in a direct block row */
+        /* Or, if the offset has just filled up a direct or indirect block */
+        if(curr_offset == (col * hdr->man_dtable.row_block_size[row]) || row < hdr->man_dtable.max_direct_rows) {
+            HDassert(curr_offset - (col * hdr->man_dtable.row_block_size[row]) == 0);
+            break;      /* Done now */
+        } /* end if */
+        /* Indirect block row */
+        else {
+            H5HF_block_loc_t *new_loc;      /* Pointer to new block location */
+
+            /* Allocate level structure */
+            if(NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section")
+
+            /* Link new level into iterator */
+            new_loc->up = biter->curr;
+
+            /* Adjust offset for new level */
+            offset = curr_offset - (col * hdr->man_dtable.row_block_size[row]);
+
+            /* Make new block the current context */
+            biter->curr = new_loc;
+        } /* end else */
+    } while(1);       /* Breaks out in middle */
+
+    /* Set flag to indicate block iterator finished initializing */
+    biter->ready = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iter_start_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_set_entry
+ *
+ * Purpose:	Set the current entry for the iterator
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_set_entry(const H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigned entry)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+
+    /* Set location context */
+    biter->curr->entry = entry;
+    biter->curr->row = entry / hdr->man_dtable.cparam.width;
+    biter->curr->col = entry % hdr->man_dtable.cparam.width;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iter_set_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_start_entry
+ *
+ * Purpose:	Initialize a block iterator to a particular location within
+ *              an indirect block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+    H5HF_indirect_t *iblock, unsigned start_entry)
+{
+    H5HF_block_loc_t *new_loc = NULL;   /* Pointer to new block location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(biter);
+    HDassert(!biter->ready);
+    HDassert(iblock);
+
+    /* Create new location for iterator */
+    if(NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section")
+
+    /* Set up location context */
+    new_loc->entry = start_entry;
+    new_loc->row = start_entry / hdr->man_dtable.cparam.width;
+    new_loc->col = start_entry % hdr->man_dtable.cparam.width;
+    new_loc->context = iblock;
+    new_loc->up = NULL;
+
+    /* Increment reference count on indirect block */
+    if(H5HF_iblock_incr(new_loc->context) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+
+    /* Make new location the current location */
+    biter->curr = new_loc;
+
+    /* Set flag to indicate block iterator finished initializing */
+    biter->ready = TRUE;
+
+done:
+    if(ret_value < 0 && new_loc)
+        new_loc = H5FL_FREE(H5HF_block_loc_t, new_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iter_start_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_reset
+ *
+ * Purpose:	Reset a block iterator to it's initial state, freeing any
+ *              location context it currently has
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_reset(H5HF_block_iter_t *biter)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+
+    /* Free any location contexts that exist */
+    if(biter->curr) {
+        H5HF_block_loc_t *curr_loc;      /* Pointer to current block location */
+        H5HF_block_loc_t *next_loc;      /* Pointer to next block location */
+
+        /* Free location contexts */
+        curr_loc = biter->curr;
+        while(curr_loc) {
+            /* Get pointer to next node */
+            next_loc = curr_loc->up;
+
+            /* If this node is holding an indirect block, release the block */
+            if(curr_loc->context)
+                if(H5HF_iblock_decr(curr_loc->context) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+            /* Free the current location context */
+            curr_loc = H5FL_FREE(H5HF_block_loc_t, curr_loc);
+
+            /* Advance to next location */
+            curr_loc = next_loc;
+        } /* end while */
+
+        /* Reset top location context */
+        biter->curr = NULL;
+    } /* end if */
+
+    /* Reset block iterator flags */
+    biter->ready = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iter_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_next
+ *
+ * Purpose:	Advance to the next block within the current block of the heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigned nentries)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(biter->curr);
+    HDassert(biter->curr->context);
+    HDassert(biter->curr->row < biter->curr->context->nrows);
+
+    /* Advance entry in current block */
+    biter->curr->entry += nentries;
+    biter->curr->row = biter->curr->entry / hdr->man_dtable.cparam.width;
+    biter->curr->col = biter->curr->entry % hdr->man_dtable.cparam.width;
+/*    HDassert(biter->curr->row <= biter->curr->context->nrows); */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iter_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_up
+ *
+ * Purpose:	Move iterator up one level
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_up(H5HF_block_iter_t *biter)
+{
+    H5HF_block_loc_t *up_loc;           /* Pointer to 'up' block location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(biter->ready);
+    HDassert(biter->curr);
+    HDassert(biter->curr->up);
+    HDassert(biter->curr->context);
+
+    /* Release hold on current location's indirect block */
+    if(H5HF_iblock_decr(biter->curr->context) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    /* Get pointer to location context above this one */
+    up_loc = biter->curr->up;
+
+    /* Release this location */
+    biter->curr = H5FL_FREE(H5HF_block_loc_t, biter->curr);
+
+    /* Point location to next location up */
+    biter->curr = up_loc;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iter_up() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_down
+ *
+ * Purpose:	Move iterator down one level
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock)
+{
+    H5HF_block_loc_t *down_loc = NULL;  /* Pointer to new 'down' block location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(biter->ready);
+    HDassert(biter->curr);
+    HDassert(biter->curr->context);
+
+    /* Create new location to move down to */
+    if(NULL == (down_loc = H5FL_MALLOC(H5HF_block_loc_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section")
+
+    /* Initialize down location */
+    down_loc->row = 0;
+    down_loc->col = 0;
+    down_loc->entry = 0;
+    down_loc->context = iblock;
+    down_loc->up = biter->curr;
+
+    /* Increment reference count on indirect block */
+    if(H5HF_iblock_incr(down_loc->context) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+
+    /* Make down location the current location */
+    biter->curr = down_loc;
+
+done:
+    if(ret_value < 0 && down_loc)
+        down_loc = H5FL_FREE(H5HF_block_loc_t, down_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_iter_down() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_curr
+ *
+ * Purpose:	Retrieve information about the current block iterator location
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col,
+    unsigned *entry, H5HF_indirect_t **block)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(biter->ready);
+
+    /* Retrieve the information asked for */
+    if(row)
+        *row = biter->curr->row;
+    if(col)
+        *col = biter->curr->col;
+    if(entry)
+        *entry = biter->curr->entry;
+    if(block)
+        *block = biter->curr->context;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iter_curr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_offset
+ *
+ * Purpose:	Retrieve offset of iterator in heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, hsize_t *offset)
+{
+    hsize_t curr_offset;        /* For computing offset in heap */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+    HDassert(biter->ready);
+    HDassert(biter->curr->context);
+    HDassert(offset);
+
+    /* Compute the offset in the heap */
+    curr_offset = biter->curr->context->block_off;
+    curr_offset += hdr->man_dtable.row_block_off[biter->curr->row];
+    curr_offset += biter->curr->col * hdr->man_dtable.row_block_size[biter->curr->row];
+
+    /* Assign the return value */
+    *offset = curr_offset;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_iter_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_iter_ready
+ *
+ * Purpose:	Query if iterator is ready to use
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Apr 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5HF_man_iter_ready(H5HF_block_iter_t *biter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(biter);
+
+    FUNC_LEAVE_NOAPI(biter->ready)
+} /* end H5HF_man_iter_ready() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFman.c b/gatb-core/thirdparty/hdf5/src/H5HFman.c
new file mode 100644
index 0000000..a2de63c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFman.c
@@ -0,0 +1,609 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFman.c
+ *			Feb 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		"Managed" object routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Macro to check if we can apply all filters in the pipeline.  Use whenever
+ * performing a modification operation */
+ #define H5HF_MAN_WRITE_CHECK_PLINE(HDR)                                       \
+{                                                                              \
+    if(!((HDR)->checked_filters)) {                                            \
+        if((HDR)->pline.nused)                                                 \
+            if(H5Z_can_apply_direct(&((HDR)->pline)) < 0)                      \
+                HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "I/O filters can't operate on this heap") \
+                                                                               \
+        (HDR)->checked_filters = TRUE;                                         \
+    } /* end if */                                                             \
+}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    const uint8_t *id, H5HF_operator_t op, void *op_data, unsigned op_flags);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_insert
+ *
+ * Purpose:	Insert an object in a managed direct block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size, const void *obj,
+    void *_id)
+{
+    H5HF_free_section_t *sec_node = NULL;   /* Pointer to free space section */
+    H5HF_direct_t *dblock = NULL;       /* Pointer to direct block to modify */
+    haddr_t dblock_addr = HADDR_UNDEF;  /* Direct block address */
+    size_t dblock_size;                 /* Direct block size */
+    uint8_t *id = (uint8_t *)_id;       /* Pointer to ID buffer */
+    size_t blk_off;                     /* Offset of object within block */
+    htri_t node_found;                  /* Whether an existing free list node was found */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(obj_size > 0);
+    HDassert(obj);
+    HDassert(id);
+
+    /* Check pipeline */
+    H5HF_MAN_WRITE_CHECK_PLINE(hdr)
+
+    /* Look for free space */
+    if((node_found = H5HF_space_find(hdr, dxpl_id, (hsize_t)obj_size, &sec_node)) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't locate free space in fractal heap")
+
+    /* If we didn't find a node, go create a direct block big enough to hold the requested block */
+    if(!node_found)
+        /* Allocate direct block big enough to hold requested size */
+        if(H5HF_man_dblock_new(hdr, dxpl_id, obj_size, &sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "can't create fractal heap direct block")
+
+    /* Check for row section */
+    if(sec_node->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW ||
+            sec_node->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW) {
+
+        /* Allocate 'single' selection out of 'row' selection */
+        if(H5HF_man_iblock_alloc_row(hdr, dxpl_id, &sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't break up row section")
+    } /* end if */
+    HDassert(sec_node->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+
+    /* Check for 'single' section being serialized */
+    if(sec_node->sect_info.state == H5FS_SECT_SERIALIZED) {
+        if(H5HF_sect_single_revive(hdr, dxpl_id, sec_node) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
+    } /* end if */
+    HDassert(sec_node->sect_info.state == H5FS_SECT_LIVE);
+
+    /* Retrieve direct block address from section */
+    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, sec_node, &dblock_addr, &dblock_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
+
+    /* Lock direct block */
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sec_node->u.single.parent, sec_node->u.single.par_entry, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
+
+    /* Insert object into block */
+
+    /* Get the offset of the object within the block */
+    H5_CHECK_OVERFLOW((sec_node->sect_info.addr - dblock->block_off), hsize_t, size_t);
+    blk_off = (size_t)(sec_node->sect_info.addr - dblock->block_off);
+
+    /* Sanity checks */
+    HDassert(sec_node->sect_info.size >= obj_size);
+
+    /* Reduce (& possibly re-add) single section */
+    if(H5HF_sect_single_reduce(hdr, dxpl_id, sec_node, obj_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce single section node")
+    sec_node = NULL;
+
+    /* Encode the object in the block */
+    {
+        uint8_t *p;                         /* Temporary pointer to obj info in block */
+
+        /* Point to location for object */
+        p = dblock->blk + blk_off;
+
+        /* Copy the object's data into the heap */
+        HDmemcpy(p, obj, obj_size);
+        p += obj_size;
+
+        /* Sanity check */
+        HDassert((size_t)(p - (dblock->blk + blk_off)) == obj_size);
+    } /* end block */
+
+    /* Set the heap ID for the new object (heap offset & obj length) */
+    H5HF_MAN_ID_ENCODE(id, hdr, (dblock->block_off + blk_off), obj_size);
+
+    /* Update statistics about heap */
+    hdr->man_nobjs++;
+
+    /* Reduce space available in heap (marks header dirty) */
+    if(H5HF_hdr_adj_free(hdr, -(ssize_t)obj_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't adjust free space for heap")
+
+done:
+    /* Release section node on error */
+    if(ret_value < 0)
+        if(sec_node && H5HF_sect_single_free((H5FS_section_info_t *)sec_node) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release section node")
+
+    /* Release the direct block (marked as dirty) */
+    if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, H5AC__DIRTIED_FLAG) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_op_real
+ *
+ * Purpose:	Internal routine to perform an operation on a managed heap
+ *              object
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    H5HF_operator_t op, void *op_data, unsigned op_flags)
+{
+    H5HF_direct_t *dblock = NULL;       /* Pointer to direct block to query */
+    H5AC_protect_t dblock_access;       /* Access method for direct block */
+    haddr_t dblock_addr;                /* Direct block address */
+    size_t dblock_size;                 /* Direct block size */
+    unsigned dblock_cache_flags;        /* Flags for unprotecting direct block */
+    hsize_t obj_off;                    /* Object's offset in heap */
+    size_t obj_len;                     /* Object's length in heap */
+    size_t blk_off;                     /* Offset of object in block */
+    uint8_t *p;                         /* Temporary pointer to obj info in block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(op);
+
+    /* Set the access mode for the direct block */
+    if(op_flags & H5HF_OP_MODIFY) {
+        /* Check pipeline */
+        H5HF_MAN_WRITE_CHECK_PLINE(hdr)
+
+        dblock_access = H5AC_WRITE;
+        dblock_cache_flags = H5AC__DIRTIED_FLAG;
+    } /* end if */
+    else {
+        dblock_access = H5AC_READ;
+        dblock_cache_flags = H5AC__NO_FLAGS_SET;
+    } /* end else */
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Decode the object offset within the heap & its length */
+    UINT64DECODE_VAR(id, obj_off, hdr->heap_off_size);
+    UINT64DECODE_VAR(id, obj_len, hdr->heap_len_size);
+
+    /* Check for bad offset or length */
+    if(obj_off == 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "invalid fractal heap offset")
+    if(obj_off > hdr->man_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object offset too large")
+    if(obj_len == 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "invalid fractal heap object size")
+    if(obj_len > hdr->man_dtable.cparam.max_direct_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object size too large for direct block")
+    if(obj_len > hdr->max_man_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object should be standalone")
+
+    /* Check for root direct block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        /* Set direct block info */
+        dblock_addr = hdr->man_dtable.table_addr;
+        dblock_size = hdr->man_dtable.cparam.start_block_size;
+
+        /* Lock direct block */
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, NULL, 0, dblock_access)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
+    } /* end if */
+    else {
+        H5HF_indirect_t *iblock;        /* Pointer to indirect block */
+        hbool_t did_protect;            /* Whether we protected the indirect block or not */
+        unsigned entry;                 /* Entry of block */
+
+        /* Look up indirect block containing direct block */
+        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &entry, &did_protect, H5AC_READ) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
+
+        /* Set direct block info */
+        dblock_addr =  iblock->ents[entry].addr;
+        H5_CHECK_OVERFLOW((hdr->man_dtable.row_block_size[entry / hdr->man_dtable.cparam.width]), hsize_t, size_t);
+        dblock_size =  (size_t)hdr->man_dtable.row_block_size[entry / hdr->man_dtable.cparam.width];
+
+        /* Check for offset of invalid direct block */
+        if(!H5F_addr_defined(dblock_addr)) {
+            /* Unlock indirect block */
+            if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+            HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap ID not in allocated direct block")
+        } /* end if */
+
+        /* Lock direct block */
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, iblock, entry, dblock_access))) {
+            /* Unlock indirect block */
+            if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
+        } /* end if */
+
+        /* Unlock indirect block */
+        if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+        iblock = NULL;
+    } /* end else */
+
+    /* Compute offset of object within block */
+    HDassert((obj_off - dblock->block_off) < (hsize_t)dblock_size);
+    blk_off = (size_t)(obj_off - dblock->block_off);
+
+    /* Check for object's offset in the direct block prefix information */
+    if(blk_off < (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "object located in prefix of direct block")
+
+    /* Check for object's length overrunning the end of the direct block */
+    if((blk_off + obj_len) > dblock_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "object overruns end of direct block")
+
+    /* Point to location for object */
+    p = dblock->blk + blk_off;
+
+    /* Call the user's 'op' callback */
+    if(op(p, obj_len, op_data) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "application's callback failed")
+
+done:
+    /* Unlock direct block */
+    if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, dblock_cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_op_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_read
+ *
+ * Purpose:	Read an object from a managed heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_read(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, void *obj)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Call the internal 'op' routine routine */
+    if(H5HF_man_op_real(hdr, dxpl_id, id, H5HF_op_read, obj, 0) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_write
+ *
+ * Purpose:	Write an object to a managed heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    const void *obj)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Call the internal 'op' routine routine */
+    /* (Casting away const OK - QAK) */
+    if(H5HF_man_op_real(hdr, dxpl_id, id, H5HF_op_write, (void *)obj, H5HF_OP_MODIFY) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_op
+ *
+ * Purpose:	Operate directly on an object from a managed heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sept 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    H5HF_operator_t op, void *op_data)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(op);
+
+    /* Call the internal 'op' routine routine */
+    if(H5HF_man_op_real(hdr, dxpl_id, id, op, op_data, 0) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_man_remove
+ *
+ * Purpose:	Remove an object from a managed heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
+{
+    H5HF_free_section_t *sec_node = NULL; /* Pointer to free space section for block */
+    H5HF_indirect_t *iblock = NULL;     /* Pointer to indirect block */
+    hbool_t did_protect;                /* Whether we protected the indirect block or not */
+    hsize_t obj_off;                    /* Object's offset in heap */
+    size_t obj_len;                     /* Object's length in heap */
+    size_t dblock_size;                 /* Direct block size */
+    hsize_t dblock_block_off;           /* Offset of the direct block within the heap's address space */
+    unsigned dblock_entry;              /* Entry of direct block in parent indirect block */
+    size_t blk_off;                     /* Offset of object in block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+
+    /* Check pipeline */
+    H5HF_MAN_WRITE_CHECK_PLINE(hdr)
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Decode the object offset within the heap & it's length */
+    UINT64DECODE_VAR(id, obj_off, hdr->heap_off_size);
+    UINT64DECODE_VAR(id, obj_len, hdr->heap_len_size);
+
+    /* Check for bad offset or length */
+    if(obj_off == 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "invalid fractal heap offset")
+    if(obj_off > hdr->man_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object offset too large")
+    if(obj_len == 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "invalid fractal heap object size")
+    if(obj_len > hdr->man_dtable.cparam.max_direct_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object size too large for direct block")
+    if(obj_len > hdr->max_man_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap object should be standalone")
+
+    /* Check for root direct block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        /* Set direct block info */
+        dblock_size = hdr->man_dtable.cparam.start_block_size;
+        dblock_block_off = 0;
+        dblock_entry = 0;
+    } /* end if */
+    else {
+        /* Look up indirect block containing direct block */
+        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &dblock_entry, &did_protect, H5AC_WRITE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
+
+        /* Check for offset of invalid direct block */
+        if(!H5F_addr_defined(iblock->ents[dblock_entry].addr))
+            HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap ID not in allocated direct block")
+
+        /* Set direct block info */
+        H5_CHECK_OVERFLOW((hdr->man_dtable.row_block_size[dblock_entry / hdr->man_dtable.cparam.width]), hsize_t, size_t);
+        dblock_size =  (size_t)(hdr->man_dtable.row_block_size[dblock_entry / hdr->man_dtable.cparam.width]);
+
+        /* Compute the direct block's offset in the heap's address space */
+        /* (based on parent indirect block's block offset) */
+        dblock_block_off = iblock->block_off;
+        dblock_block_off += hdr->man_dtable.row_block_off[dblock_entry / hdr->man_dtable.cparam.width];
+        dblock_block_off += hdr->man_dtable.row_block_size[dblock_entry / hdr->man_dtable.cparam.width] * (dblock_entry % hdr->man_dtable.cparam.width);
+    } /* end else */
+
+    /* Compute offset of object within block */
+    HDassert((obj_off - dblock_block_off) < (hsize_t)dblock_size);
+    blk_off = (size_t)(obj_off - dblock_block_off);
+
+    /* Check for object's offset in the direct block prefix information */
+    if(blk_off < (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "object located in prefix of direct block")
+
+    /* Check for object's length overrunning the end of the direct block */
+    if((blk_off + obj_len) > dblock_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "object overruns end of direct block")
+
+    /* Create free space section node */
+    if(NULL == (sec_node = H5HF_sect_single_new(obj_off, obj_len, iblock, dblock_entry)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create section for direct block's free space")
+
+    /* Unlock indirect block */
+    if(iblock) {
+        if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+        iblock = NULL;
+    } /* end if */
+
+    /* Increase space available in heap (marks header dirty) */
+    if(H5HF_hdr_adj_free(hdr, (ssize_t)obj_len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't adjust free space for heap")
+
+    /* Update statistics about heap */
+    hdr->man_nobjs--;
+
+    /* Return free space to the heap's list of space */
+    if(H5HF_space_add(hdr, dxpl_id, sec_node, H5FS_ADD_RETURNED_SPACE) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add direct block free space to global list")
+    sec_node = NULL;
+
+done:
+    if(ret_value < 0) {
+        /* Release section node */
+        if(sec_node && H5HF_sect_single_free((H5FS_section_info_t *)sec_node) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release section node")
+    } /* end if */
+
+    /* Unlock indirect block */
+    if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_man_remove() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFpkg.h b/gatb-core/thirdparty/hdf5/src/H5HFpkg.h
new file mode 100644
index 0000000..9c9c34c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFpkg.h
@@ -0,0 +1,799 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Friday, February 24, 2006
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5HF package.  Source files outside the H5HF package should
+ *		include H5HFprivate.h instead.
+ */
+#ifndef H5HF_PACKAGE
+#error "Do not include this file outside the H5HF package!"
+#endif
+
+#ifndef _H5HFpkg_H
+#define _H5HFpkg_H
+
+/* Get package's private header */
+#include "H5HFprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5B2private.h"	/* v2 B-trees				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5FSprivate.h"	/* Free space manager			*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Size of checksum information (on disk) */
+#define H5HF_SIZEOF_CHKSUM      4
+
+/* "Standard" size of prefix information for fractal heap metadata */
+#define H5HF_METADATA_PREFIX_SIZE(c) (                                        \
+    H5_SIZEOF_MAGIC   /* Signature */                                         \
+    + 1 /* Version */                                                         \
+    + ((c) ? H5HF_SIZEOF_CHKSUM : 0) /* Metadata checksum */                  \
+    )
+
+/* Size of doubling-table information */
+#define H5HF_DTABLE_INFO_SIZE(h) (                                            \
+    2   /* Width of table (i.e. # of columns) */                              \
+    + (h)->sizeof_size /* Starting block size */                              \
+    + (h)->sizeof_size /* Maximum direct block size */                        \
+    + 2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */   \
+    + 2 /* Starting # of rows in root indirect block */                       \
+    + (h)->sizeof_addr /* File address of table managed */                    \
+    + 2 /* Current # of rows in root indirect block */                        \
+    )
+
+/* Flags for status byte */
+#define H5HF_HDR_FLAGS_HUGE_ID_WRAPPED 0x01     /* "huge" object IDs have wrapped */
+#define H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS 0x02    /* checksum direct blocks */
+
+/* Size of the fractal heap header on disk */
+/* (this is the fixed-len portion, the variable-len I/O filter information
+ *      follows this information, if there are I/O filters for the heap)
+ */
+#define H5HF_HEADER_SIZE(h)     (                                             \
+    /* General metadata fields */                                             \
+    H5HF_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* Fractal Heap Header specific fields */                                 \
+                                                                              \
+    /* General heap information */                                            \
+    + 2 /* Heap ID len */                                                     \
+    + 2 /* I/O filters' encoded len */                                        \
+    + 1 /* Status flags */                                                    \
+                                                                              \
+    /* "Huge" object fields */                                                \
+    + 4 /* Max. size of "managed" object */                                   \
+    + (h)->sizeof_size /* Next ID for "huge" object */                        \
+    + (h)->sizeof_addr /* File address of "huge" object tracker B-tree  */    \
+                                                                              \
+    /* "Managed" object free space fields */                                  \
+    + (h)->sizeof_size /* Total man. free space */                            \
+    + (h)->sizeof_addr /* File address of free section header */              \
+                                                                              \
+    /* Statistics fields */                                                   \
+    + (h)->sizeof_size /* Size of man. space in heap */                       \
+    + (h)->sizeof_size /* Size of man. space iterator offset in heap */       \
+    + (h)->sizeof_size /* Size of alloacted man. space in heap */             \
+    + (h)->sizeof_size /* Number of man. objects in heap */                   \
+    + (h)->sizeof_size /* Size of huge space in heap */                       \
+    + (h)->sizeof_size /* Number of huge objects in heap */                   \
+    + (h)->sizeof_size /* Size of tiny space in heap */                       \
+    + (h)->sizeof_size /* Number of tiny objects in heap */                   \
+                                                                              \
+    /* "Managed" object doubling table info */                                \
+    + H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \
+    )
+
+/* Size of overhead for a direct block */
+#define H5HF_MAN_ABS_DIRECT_OVERHEAD(h) (                                     \
+    /* General metadata fields */                                             \
+    H5HF_METADATA_PREFIX_SIZE(h->checksum_dblocks)                            \
+                                                                              \
+    /* Fractal heap managed, absolutely mapped direct block specific fields */ \
+    + (h)->sizeof_addr          /* File address of heap owning the block */   \
+    + (h)->heap_off_size        /* Offset of the block in the heap */         \
+    )
+
+/* Size of managed indirect block entry for a child direct block */
+#define H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h) (                           \
+    ((h)->filter_len > 0 ?                                                    \
+        ((h)->sizeof_addr + (h)->sizeof_size + 4) : /* Size of entries for filtered direct blocks */ \
+        (h)->sizeof_addr)             /* Size of entries for un-filtered direct blocks */ \
+    )
+
+/* Size of managed indirect block */
+#define H5HF_MAN_INDIRECT_SIZE(h, r) (                                        \
+    /* General metadata fields */                                             \
+    H5HF_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* Fractal heap managed, absolutely mapped indirect block specific fields */ \
+    + (h)->sizeof_addr          /* File address of heap owning the block */   \
+    + (h)->heap_off_size        /* Offset of the block in the heap */         \
+    + (MIN(r, (h)->man_dtable.max_direct_rows) * (h)->man_dtable.cparam.width * H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h)) /* Size of entries for direct blocks */ \
+    + (((r > (h)->man_dtable.max_direct_rows) ? (r - (h)->man_dtable.max_direct_rows) : 0)  * (h)->man_dtable.cparam.width * (h)->sizeof_addr) /* Size of entries for indirect blocks */ \
+    )
+
+/* Compute the # of bytes required to store an offset into a given buffer size */
+#define H5HF_SIZEOF_OFFSET_BITS(b)   (((b) + 7) / 8)
+#define H5HF_SIZEOF_OFFSET_LEN(l)   H5HF_SIZEOF_OFFSET_BITS(H5VM_log2_of2((unsigned)(l)))
+
+/* Heap ID bit flags */
+/* Heap ID version (2 bits: 6-7) */
+#define H5HF_ID_VERS_CURR       0x00    /* Current version of ID format */
+#define H5HF_ID_VERS_MASK       0xC0    /* Mask for getting the ID version from flags */
+/* Heap ID type (2 bits: 4-5) */
+#define H5HF_ID_TYPE_MAN        0x00    /* "Managed" object - stored in fractal heap blocks */
+#define H5HF_ID_TYPE_HUGE       0x10    /* "Huge" object - stored in file directly */
+#define H5HF_ID_TYPE_TINY       0x20    /* "Tiny" object - stored in heap ID directly */
+#define H5HF_ID_TYPE_RESERVED   0x30    /* "?" object - reserved for future use */
+#define H5HF_ID_TYPE_MASK       0x30    /* Mask for getting the ID type from flags */
+/* Heap ID bits 0-3 reserved for future use */
+
+/* Encode a "managed" heap ID */
+#define H5HF_MAN_ID_ENCODE(i, h, o, l)                                        \
+    *(i) = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN;                              \
+    (i)++;                                                                    \
+    UINT64ENCODE_VAR((i), (o), (h)->heap_off_size);                           \
+    UINT64ENCODE_VAR((i), (l), (h)->heap_len_size)
+
+/* Decode a "managed" heap ID */
+#define H5HF_MAN_ID_DECODE(i, h, f, o, l)                                     \
+    f = *(uint8_t *)i++;                                                      \
+    UINT64DECODE_VAR((i), (o), (h)->heap_off_size);                           \
+    UINT64DECODE_VAR((i), (l), (h)->heap_len_size)
+
+/* Free space section types for fractal heap */
+/* (values stored in free space data structures in file) */
+#define H5HF_FSPACE_SECT_SINGLE         0       /* Section is a range of actual bytes in a direct block */
+#define H5HF_FSPACE_SECT_FIRST_ROW      1       /* Section is first range of blocks in an indirect block row */
+#define H5HF_FSPACE_SECT_NORMAL_ROW     2       /* Section is a range of blocks in an indirect block row */
+#define H5HF_FSPACE_SECT_INDIRECT       3       /* Section is a span of blocks in an indirect block */
+
+/* Flags for 'op' operations */
+#define H5HF_OP_MODIFY          0x0001          /* Operation will modify object */
+#define H5HF_OP_FLAGS           (H5HF_OP_MODIFY)        /* Bit-wise OR of all op flags */
+
+/* Flags for 'root_iblock_flags' field in header */
+#define H5HF_ROOT_IBLOCK_PINNED         0x01
+#define H5HF_ROOT_IBLOCK_PROTECTED      0x02
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Doubling-table info */
+typedef struct H5HF_dtable_t {
+    /* Immutable, pre-set information for table */
+    H5HF_dtable_cparam_t    cparam;     /* Creation parameters for table */
+
+    /* Derived information (stored, varies during lifetime of table) */
+    haddr_t     table_addr;     /* Address of first block for table */
+                                /* Undefined if no space allocated for table */
+    unsigned    curr_root_rows; /* Current number of rows in the root indirect block */
+                                /* 0 indicates that the TABLE_ADDR field points
+                                 * to direct block (of START_BLOCK_SIZE) instead
+                                 * of indirect root block.
+                                 */
+
+    /* Computed information (not stored) */
+    unsigned    max_root_rows;      /* Maximum # of rows in root indirect block */
+    unsigned    max_direct_rows;    /* Maximum # of direct rows in any indirect block */
+    unsigned    start_bits;         /* # of bits for starting block size (i.e. log2(start_block_size)) */
+    unsigned    max_direct_bits;    /* # of bits for max. direct block size (i.e. log2(max_direct_size)) */
+    unsigned    max_dir_blk_off_size;   /* Max. size of offsets in direct blocks */
+    unsigned    first_row_bits;     /* # of bits in address of first row */
+    hsize_t     num_id_first_row;   /* Number of IDs in first row of table */
+    hsize_t     *row_block_size;    /* Block size per row of indirect block */
+    hsize_t     *row_block_off;     /* Cumulative offset per row of indirect block */
+    hsize_t     *row_tot_dblock_free;   /* Total free space in dblocks for this row */
+                                    /* (For indirect block rows, it's the total
+                                     * free space in all direct blocks referenced
+                                     * from the indirect block)
+                                     */
+    size_t      *row_max_dblock_free;   /* Max. free space in dblocks for this row */
+                                    /* (For indirect block rows, it's the maximum
+                                     * free space in a direct block referenced
+                                     * from the indirect block)
+                                     */
+} H5HF_dtable_t;
+
+/* Fractal heap free list info (forward decl - defined in H5HFflist.c) */
+typedef struct H5HF_freelist_t H5HF_freelist_t;
+
+/* Forward decl indirect block info */
+typedef struct H5HF_indirect_t H5HF_indirect_t;
+
+/* Fractal heap block location */
+typedef struct H5HF_block_loc_t {
+    /* Necessary table fields */
+    unsigned    row;            /* Row of block in doubling table             */
+    unsigned    col;            /* Column of block in doubling table          */
+
+    /* Derived/computed/cached table fields */
+    unsigned    entry;          /* Entry of block in doubling table           */
+
+    /* Infrastructure */
+    H5HF_indirect_t *context;   /* Pointer to the indirect block containing the block */
+    struct H5HF_block_loc_t *up;  /* Pointer to next level up in the stack of levels */
+} H5HF_block_loc_t;
+
+/* Fractal heap block iterator info */
+typedef struct H5HF_block_iter_t {
+    hbool_t ready;              /* Set if iterator is finished initializing   */
+    H5HF_block_loc_t *curr;     /* Pointer to the current level information for iterator */
+} H5HF_block_iter_t;
+
+/* Fractal heap free space section info */
+typedef struct H5HF_free_section_t {
+    H5FS_section_info_t sect_info;              /* Free space section information (must be first in struct) */
+    union {
+        struct {
+            H5HF_indirect_t *parent;            /* Indirect block parent for free section's direct block */
+            unsigned par_entry;                 /* Entry of free section's direct block in parent indirect block */
+        } single;
+        struct {
+            struct H5HF_free_section_t *under;  /* Pointer to indirect block underlying row section */
+            unsigned    row;                    /* Row for range of blocks */
+            unsigned    col;                    /* Column for range of blocks */
+            unsigned    num_entries;            /* Number of entries covered */
+
+            /* Fields that aren't stored */
+            hbool_t     checked_out;            /* Flag to indicate that a row section is temporarily out of the free space manager */
+        } row;
+        struct {
+            /* Holds either a pointer to an indirect block (if its "live") or
+             *  the block offset of it's indirect block (if its "serialized")
+             *  (This allows the indirect block that the section is within to
+             *          be compared with other sections, whether it's serialized
+             *          or not)
+             */
+            union {
+                H5HF_indirect_t *iblock;        /* Indirect block for free section */
+                hsize_t iblock_off;             /* Indirect block offset in "heap space" */
+            } u;
+            unsigned    row;                    /* Row for range of blocks */
+            unsigned    col;                    /* Column for range of blocks */
+            unsigned    num_entries;            /* Number of entries covered */
+
+            /* Fields that aren't stored */
+            struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */
+            unsigned    par_entry;              /* Entry within parent indirect section */
+            hsize_t     span_size;              /* Size of space tracked, in "heap space" */
+            unsigned    iblock_entries;         /* Number of entries in indirect block where section is located */
+            unsigned    rc;                     /* Reference count of outstanding row & child indirect sections */
+            unsigned    dir_nrows;              /* Number of direct rows in section */
+            struct H5HF_free_section_t **dir_rows;  /* Array of pointers to outstanding row sections */
+            unsigned    indir_nents;            /* Number of indirect entries in section */
+            struct H5HF_free_section_t **indir_ents; /* Array of pointers to outstanding child indirect sections */
+        } indirect;
+    } u;
+} H5HF_free_section_t;
+
+/* The fractal heap header information */
+/* (Each fractal heap header has certain information that is shared across all
+ * the instances of blocks in that fractal heap)
+ */
+typedef struct H5HF_hdr_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* General header information (stored in header) */
+    unsigned    id_len;         /* Size of heap IDs (in bytes) */
+    unsigned    filter_len;     /* Size of I/O filter information (in bytes) */
+
+    /* Flags for heap settings (stored in status byte in header) */
+    hbool_t     debug_objs;     /* Is the heap storing objects in 'debug' format */
+    hbool_t     write_once;     /* Is heap being written in "write once" mode? */
+    hbool_t     huge_ids_wrapped; /* Have "huge" object IDs wrapped around? */
+    hbool_t     checksum_dblocks; /* Should the direct blocks in the heap be checksummed? */
+
+    /* Doubling table information (partially stored in header) */
+    /* (Partially set by user, partially derived/updated internally) */
+    H5HF_dtable_t man_dtable;   /* Doubling-table info for managed objects */
+
+    /* Free space information for managed objects (stored in header) */
+    hsize_t     total_man_free; /* Total amount of free space in managed blocks */
+    haddr_t     fs_addr;        /* Address of free space header on disk */
+
+    /* "Huge" object support (stored in header) */
+    uint32_t    max_man_size;   /* Max. size of object to manage in doubling table */
+    hsize_t     huge_next_id;   /* Next ID to use for indirectly tracked 'huge' object */
+    haddr_t     huge_bt2_addr;  /* Address of v2 B-tree for tracking "huge" object info */
+
+    /* I/O filter support (stored in header, if any are used) */
+    H5O_pline_t pline;          /* I/O filter pipeline for heap objects */
+    size_t      pline_root_direct_size;    /* Size of filtered root direct block */
+    unsigned    pline_root_direct_filter_mask; /* I/O filter mask for filtered root direct block */
+
+    /* Statistics for heap (stored in header) */
+    hsize_t     man_size;       /* Total amount of 'managed' space in heap */
+    hsize_t     man_alloc_size; /* Total amount of allocated 'managed' space in heap */
+    hsize_t     man_iter_off;   /* Offset of iterator in 'managed' heap space */
+    hsize_t     man_nobjs;      /* Number of 'managed' objects in heap */
+    hsize_t     huge_size;      /* Total size of 'huge' objects in heap */
+    hsize_t     huge_nobjs;     /* Number of 'huge' objects in heap */
+    hsize_t     tiny_size;      /* Total size of 'tiny' objects in heap */
+    hsize_t     tiny_nobjs;     /* Number of 'tiny' objects in heap */
+
+    /* Cached/computed values (not stored in header) */
+    size_t      rc;             /* Reference count of heap's components using heap header */
+    haddr_t     heap_addr;      /* Address of heap header in the file */
+    size_t      heap_size;      /* Size of heap header in the file */
+    H5AC_protect_t mode;        /* Access mode for heap */
+    H5F_t      *f;              /* Pointer to file for heap */
+    size_t      file_rc;        /* Reference count of files using heap header */
+    hbool_t     pending_delete; /* Heap is pending deletion */
+    uint8_t     sizeof_size;    /* Size of file sizes */
+    uint8_t     sizeof_addr;    /* Size of file addresses */
+    struct H5HF_indirect_t *root_iblock;    /* Pointer to root indirect block */
+    unsigned    root_iblock_flags;      /* Flags to indicate whether root indirect block is pinned/protected */
+    H5FS_t      *fspace;        /* Free space list for objects in heap */
+    H5HF_block_iter_t next_block;   /* Block iterator for searching for next block with space */
+    H5B2_t      *huge_bt2;      /* v2 B-tree handle for huge objects */
+    hsize_t     huge_max_id;    /* Max. 'huge' heap ID before rolling 'huge' heap IDs over */
+    uint8_t     huge_id_size;   /* Size of 'huge' heap IDs (in bytes) */
+    hbool_t     huge_ids_direct; /* Flag to indicate that 'huge' object's offset & length are stored directly in heap ID */
+    size_t      tiny_max_len;   /* Max. size of tiny objects for this heap */
+    hbool_t     tiny_len_extended; /* Flag to indicate that 'tiny' object's length is stored in extended form (i.e. w/extra byte) */
+    uint8_t     heap_off_size;  /* Size of heap offsets (in bytes) */
+    uint8_t     heap_len_size;  /* Size of heap ID lengths (in bytes) */
+    hbool_t     checked_filters; /* TRUE if pipeline passes can_apply checks */
+} H5HF_hdr_t;
+
+/* Common indirect block doubling table entry */
+/* (common between entries pointing to direct & indirect child blocks) */
+typedef struct H5HF_indirect_ent_t {
+    haddr_t     addr;           /* Direct block's address                     */
+} H5HF_indirect_ent_t;
+
+/* Extern indirect block doubling table entry for compressed direct blocks */
+/* (only exists for indirect blocks in heaps that have I/O filters) */
+typedef struct H5HF_indirect_filt_ent_t {
+    size_t     size;            /* Size of child direct block, after passing though I/O filters */
+    unsigned	filter_mask;	/* Excluded filters for child direct block */
+} H5HF_indirect_filt_ent_t;
+
+/* Fractal heap indirect block */
+struct H5HF_indirect_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Internal heap information (not stored) */
+    size_t      rc;             /* Reference count of objects using this block */
+    H5HF_hdr_t	*hdr;	        /* Shared heap header info	              */
+    struct H5HF_indirect_t *parent;	/* Shared parent indirect block info  */
+    unsigned    par_entry;      /* Entry in parent's table                    */
+    haddr_t     addr;           /* Address of this indirect block on disk     */
+    size_t      size;           /* Size of indirect block on disk             */
+    unsigned    nrows;          /* Total # of rows in indirect block          */
+    unsigned    max_rows;       /* Max. # of rows in indirect block           */
+    unsigned    nchildren;      /* Number of child blocks                     */
+    unsigned    max_child;      /* Max. offset used in child entries          */
+    struct H5HF_indirect_t **child_iblocks; /* Array of pointers to pinned child indirect blocks */
+
+    /* Stored values */
+    hsize_t     block_off;      /* Offset of the block within the heap's address space */
+    H5HF_indirect_ent_t *ents;  /* Pointer to block entry table               */
+    H5HF_indirect_filt_ent_t *filt_ents;    /* Pointer to filtered information for direct blocks */
+};
+
+/* A fractal heap direct block */
+typedef struct H5HF_direct_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Internal heap information */
+    H5HF_hdr_t	*hdr;	        /* Shared heap header info	              */
+    H5HF_indirect_t *parent;	/* Shared parent indirect block info          */
+    unsigned    par_entry;      /* Entry in parent's table                    */
+    size_t      size;           /* Size of direct block                       */
+    hsize_t     file_size;      /* Size of direct block in file (only valid when block's space is being freed) */
+    unsigned    blk_off_size;   /* Size of offsets in the block               */
+    uint8_t     *blk;           /* Pointer to buffer containing block data    */
+
+    /* Stored values */
+    hsize_t     block_off;      /* Offset of the block within the heap's address space */
+} H5HF_direct_t;
+
+/* Fractal heap */
+struct H5HF_t {
+    H5HF_hdr_t  *hdr;           /* Pointer to internal fractal heap header info */
+    H5F_t      *f;              /* Pointer to file for heap */
+};
+
+/* Fractal heap "parent info" (for loading a block) */
+typedef struct H5HF_parent_t {
+    H5HF_hdr_t *hdr;                /* Pointer to heap header info */
+    H5HF_indirect_t *iblock;    /* Pointer to parent indirect block */
+    unsigned entry;             /* Location of block in parent's entry table */
+} H5HF_parent_t;
+
+/* Typedef for indirectly accessed 'huge' object's records in the v2 B-tree */
+typedef struct H5HF_huge_bt2_indir_rec_t {
+    haddr_t addr;       /* Address of the object in the file */
+    hsize_t len;        /* Length of the object in the file */
+    hsize_t id;         /* ID used for object (not used for 'huge' objects directly accessed) */
+} H5HF_huge_bt2_indir_rec_t;
+
+/* Typedef for indirectly accessed, filtered 'huge' object's records in the v2 B-tree */
+typedef struct H5HF_huge_bt2_filt_indir_rec_t {
+    haddr_t addr;       /* Address of the filtered object in the file */
+    hsize_t len;        /* Length of the filtered object in the file */
+    unsigned filter_mask;   /* I/O pipeline filter mask for filtered object in the file */
+    hsize_t obj_size;   /* Size of the de-filtered object in memory */
+    hsize_t id;         /* ID used for object (not used for 'huge' objects directly accessed) */
+} H5HF_huge_bt2_filt_indir_rec_t;
+
+/* Typedef for directly accessed 'huge' object's records in the v2 B-tree */
+typedef struct H5HF_huge_bt2_dir_rec_t {
+    haddr_t addr;       /* Address of the object in the file */
+    hsize_t len;        /* Length of the object in the file */
+} H5HF_huge_bt2_dir_rec_t;
+
+/* Typedef for directly accessed, filtered 'huge' object's records in the v2 B-tree */
+typedef struct H5HF_huge_bt2_filt_dir_rec_t {
+    haddr_t addr;       /* Address of the filtered object in the file */
+    hsize_t len;        /* Length of the filtered object in the file */
+    unsigned filter_mask;   /* I/O pipeline filter mask for filtered object in the file */
+    hsize_t obj_size;   /* Size of the de-filtered object in memory */
+} H5HF_huge_bt2_filt_dir_rec_t;
+
+/* User data for free space section 'add' callback */
+typedef struct {
+    H5HF_hdr_t *hdr;            /* Fractal heap header */
+    hid_t dxpl_id;              /* DXPL ID for operation */
+} H5HF_sect_add_ud_t;
+
+/* User data for v2 B-tree 'remove' callback on 'huge' objects */
+typedef struct {
+    H5HF_hdr_t *hdr;            /* Fractal heap header (in) */
+    hid_t dxpl_id;              /* DXPL ID for operation (in) */
+    hsize_t obj_len;            /* Length of object removed (out) */
+} H5HF_huge_remove_ud_t;
+
+/* User data for fractal heap header cache client callback */
+typedef struct H5HF_hdr_cache_ud_t {
+    H5F_t *f;                   /* File pointer */
+    hid_t dxpl_id;              /* DXPL ID for operation (in) */
+} H5HF_hdr_cache_ud_t;
+
+/* User data for fractal heap indirect block cache client callbacks */
+typedef struct H5HF_iblock_cache_ud_t {
+    H5HF_parent_t * par_info;   /* Parent info */
+    H5F_t * f;                  /* File pointer */
+    const unsigned *nrows;      /* Number of rows */
+} H5HF_iblock_cache_ud_t;
+
+/* User data for fractal heap direct block cache client callbacks */
+typedef struct H5HF_dblock_cache_ud_t {
+    H5HF_parent_t par_info;     /* Parent info */
+    H5F_t * f;                  /* File pointer */
+    size_t odi_size;		/* On disk image size of the direct block.
+				 * Note that there is no necessary relation
+				 * between this value, and the actual
+				 * direct block size, as conpression may
+				 * reduce the size of the on disk image,
+				 * and check sums may increase it.
+				 */
+    size_t dblock_size;		/* size of the direct block, which bears
+				 * no necessary relation to the block
+				 * odi_size -- the size of the on disk
+				 * image of the block.  Note that the
+				 * metadata cache is only interested
+				 * in the odi_size, and thus it is this
+				 * value that is passed to the cache in
+				 * calls to it.
+				 */
+    unsigned filter_mask;	/* Excluded filters for direct block */
+} H5HF_dblock_cache_ud_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5HF header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_HDR[1];
+
+/* H5HF indirect block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1];
+
+/* H5HF direct block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1];
+
+/* The v2 B-tree class for tracking indirectly accessed 'huge' objects */
+H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_INDIR[1];
+
+/* The v2 B-tree class for tracking indirectly accessed filtered 'huge' objects */
+H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_FILT_INDIR[1];
+
+/* The v2 B-tree class for tracking directly accessed 'huge' objects */
+H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_DIR[1];
+
+/* The v2 B-tree class for tracking directly accessed filtered 'huge' objects */
+H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_FILT_DIR[1];
+
+/* H5HF single section inherits serializable properties from H5FS_section_class_t */
+H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_SINGLE[1];
+
+/* H5HF 'first' row section inherits serializable properties from H5FS_section_class_t */
+H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_FIRST_ROW[1];
+
+/* H5HF 'normal' row section inherits serializable properties from H5FS_section_class_t */
+H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_NORMAL_ROW[1];
+
+/* H5HF indirect section inherits serializable properties from H5FS_section_class_t */
+H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_INDIRECT[1];
+
+/* Declare a free list to manage the H5HF_indirect_t struct */
+H5FL_EXTERN(H5HF_indirect_t);
+
+/* Declare a free list to manage the H5HF_indirect_ent_t sequence information */
+H5FL_SEQ_EXTERN(H5HF_indirect_ent_t);
+
+/* Declare a free list to manage the H5HF_indirect_filt_ent_t sequence information */
+H5FL_SEQ_EXTERN(H5HF_indirect_filt_ent_t);
+
+/* Declare a free list to manage the H5HF_indirect_t * sequence information */
+typedef H5HF_indirect_t *H5HF_indirect_ptr_t;
+H5FL_SEQ_EXTERN(H5HF_indirect_ptr_t);
+
+/* Declare a free list to manage the H5HF_direct_t struct */
+H5FL_EXTERN(H5HF_direct_t);
+
+/* Declare a free list to manage heap direct block data to/from disk */
+H5FL_BLK_EXTERN(direct_block);
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Doubling table routines */
+H5_DLL herr_t H5HF_dtable_init(H5HF_dtable_t *dtable);
+H5_DLL herr_t H5HF_dtable_dest(H5HF_dtable_t *dtable);
+H5_DLL herr_t H5HF_dtable_lookup(const H5HF_dtable_t *dtable, hsize_t off,
+    unsigned *row, unsigned *col);
+H5_DLL unsigned H5HF_dtable_size_to_row(const H5HF_dtable_t *dtable, size_t block_size);
+H5_DLL unsigned H5HF_dtable_size_to_rows(const H5HF_dtable_t *dtable, hsize_t size);
+H5_DLL hsize_t H5HF_dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row,
+    unsigned start_col, unsigned num_entries);
+
+/* Heap header routines */
+H5_DLL H5HF_hdr_t * H5HF_hdr_alloc(H5F_t *f);
+H5_DLL haddr_t H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam);
+H5_DLL H5HF_hdr_t *H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    H5AC_protect_t rw);
+H5_DLL herr_t H5HF_hdr_finish_init_phase1(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_finish_init_phase2(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_finish_init(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_incr(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_decr(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_fuse_incr(H5HF_hdr_t *hdr);
+H5_DLL size_t H5HF_hdr_fuse_decr(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_dirty(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt);
+H5_DLL herr_t H5HF_hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free);
+H5_DLL herr_t H5HF_hdr_inc_alloc(H5HF_hdr_t *hdr, size_t alloc_size);
+H5_DLL herr_t H5HF_hdr_start_iter(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, hsize_t curr_off, unsigned curr_entry);
+H5_DLL herr_t H5HF_hdr_skip_blocks(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, unsigned start_entry, unsigned nentries);
+H5_DLL herr_t H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size);
+H5_DLL herr_t H5HF_hdr_inc_iter(H5HF_hdr_t *hdr, hsize_t adv_size, unsigned nentries);
+H5_DLL herr_t H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t dblock_addr);
+H5_DLL herr_t H5HF_hdr_reset_iter(H5HF_hdr_t *hdr, hsize_t curr_off);
+H5_DLL herr_t H5HF_hdr_empty(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_free(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5HF_hdr_dest(H5HF_hdr_t *hdr);
+
+/* Indirect block routines */
+H5_DLL herr_t H5HF_iblock_incr(H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_iblock_decr(H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_iblock_dirty(H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    size_t min_dblock_size);
+H5_DLL herr_t H5HF_man_iblock_root_double(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    size_t min_dblock_size);
+H5_DLL herr_t H5HF_man_iblock_alloc_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t **sec_node);
+H5_DLL herr_t H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_indirect_t *par_iblock, unsigned par_entry, unsigned nrows,
+    unsigned max_rows, haddr_t *addr_p);
+H5_DLL H5HF_indirect_t *H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t iblock_addr, unsigned iblock_nrows,
+    H5HF_indirect_t *par_iblock, unsigned par_entry, hbool_t must_protect,
+    H5AC_protect_t rw, hbool_t *did_protect);
+H5_DLL herr_t H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id,
+    unsigned cache_flags, hbool_t did_protect);
+H5_DLL herr_t H5HF_man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry,
+    haddr_t dblock_addr);
+H5_DLL herr_t H5HF_man_iblock_detach(H5HF_indirect_t *iblock, hid_t dxpl_id, unsigned entry);
+H5_DLL herr_t H5HF_man_iblock_entry_addr(H5HF_indirect_t *iblock, unsigned entry,
+    haddr_t *child_addr);
+H5_DLL herr_t H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t iblock_addr, unsigned iblock_nrows, H5HF_indirect_t *par_iblock,
+    unsigned par_entry);
+H5_DLL herr_t H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr,
+    haddr_t iblock_addr, unsigned nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, hsize_t *heap_size/*out*/);
+H5_DLL herr_t H5HF_man_iblock_dest(H5HF_indirect_t *iblock);
+
+/* Direct block routines */
+H5_DLL herr_t H5HF_man_dblock_new(H5HF_hdr_t *fh, hid_t dxpl_id, size_t request,
+    H5HF_free_section_t **ret_sec_node);
+H5_DLL herr_t H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr,
+    H5HF_indirect_t *par_iblock, unsigned par_entry, haddr_t *addr_p,
+    H5HF_free_section_t **ret_sec_node);
+H5_DLL herr_t H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_direct_t *dblock, haddr_t dblock_addr);
+H5_DLL H5HF_direct_t *H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t dblock_addr, size_t dblock_size,
+    H5HF_indirect_t *par_iblock, unsigned par_entry,
+    H5AC_protect_t rw);
+H5_DLL herr_t H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    hsize_t obj_off, H5HF_indirect_t **par_iblock,
+    unsigned *par_entry, hbool_t *par_did_protect, H5AC_protect_t rw);
+H5_DLL herr_t H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr,
+    hsize_t dblock_size);
+H5_DLL herr_t H5HF_man_dblock_dest(H5HF_direct_t *dblock);
+
+/* Managed object routines */
+H5_DLL herr_t H5HF_man_insert(H5HF_hdr_t *fh, hid_t dxpl_id, size_t obj_size,
+    const void *obj, void *id);
+H5_DLL herr_t H5HF_man_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
+    void *obj);
+H5_DLL herr_t H5HF_man_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    const void *obj);
+H5_DLL herr_t H5HF_man_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    H5HF_operator_t op, void *op_data);
+H5_DLL herr_t H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id);
+
+/* 'Huge' object routines */
+H5_DLL herr_t H5HF_huge_init(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_huge_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size,
+    void *obj, void *id);
+H5_DLL herr_t H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    const uint8_t *id, size_t *obj_len_p);
+H5_DLL herr_t H5HF_huge_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
+    void *obj);
+H5_DLL herr_t H5HF_huge_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    const void *obj);
+H5_DLL herr_t H5HF_huge_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    H5HF_operator_t op, void *op_data);
+H5_DLL herr_t H5HF_huge_remove(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id);
+H5_DLL herr_t H5HF_huge_term(H5HF_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5HF_huge_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
+
+/* 'Huge' object v2 B-tree function callbacks */
+H5_DLL herr_t H5HF_huge_bt2_indir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_indir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_filt_indir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_dir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_filt_dir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *op_data);
+
+/* 'Tiny' object routines */
+H5_DLL herr_t H5HF_tiny_init(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_tiny_insert(H5HF_hdr_t *hdr, size_t obj_size, const void *obj,
+    void *id);
+H5_DLL herr_t H5HF_tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id,
+    size_t *obj_len_p);
+H5_DLL herr_t H5HF_tiny_read(H5HF_hdr_t *fh, const uint8_t *id, void *obj);
+H5_DLL herr_t H5HF_tiny_op(H5HF_hdr_t *hdr, const uint8_t *id,
+    H5HF_operator_t op, void *op_data);
+H5_DLL herr_t H5HF_tiny_remove(H5HF_hdr_t *fh, const uint8_t *id);
+
+/* Debugging routines for dumping file structures */
+H5_DLL void H5HF_hdr_print(const H5HF_hdr_t *hdr, hid_t dxpl_id,
+	hbool_t dump_internal, FILE *stream, int indent, int fwidth);
+H5_DLL herr_t H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth);
+H5_DLL herr_t H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, haddr_t hdr_addr, size_t nrec);
+H5_DLL void H5HF_iblock_print(const H5HF_indirect_t *iblock, hbool_t dump_internal,
+    FILE *stream, int indent, int fwidth);
+H5_DLL herr_t H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, haddr_t hdr_addr, unsigned nrows);
+
+/* Block iteration routines */
+H5_DLL herr_t H5HF_man_iter_init(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_block_iter_t *biter, hsize_t offset);
+H5_DLL herr_t H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+    H5HF_indirect_t *iblock, unsigned start_entry);
+H5_DLL herr_t H5HF_man_iter_set_entry(const H5HF_hdr_t *hdr,
+    H5HF_block_iter_t *biter, unsigned entry);
+H5_DLL herr_t H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+    unsigned nentries);
+H5_DLL herr_t H5HF_man_iter_up(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_man_iter_reset(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col,
+    unsigned *entry, H5HF_indirect_t **block);
+H5_DLL herr_t H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+    hsize_t *offset);
+H5_DLL hbool_t H5HF_man_iter_ready(H5HF_block_iter_t *biter);
+
+/* Free space manipulation routines */
+H5_DLL herr_t H5HF_space_start(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t may_create);
+H5_DLL herr_t H5HF_space_add(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *node, unsigned flags);
+H5_DLL htri_t H5HF_space_find(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t request,
+    H5HF_free_section_t **node);
+H5_DLL herr_t H5HF_space_revert_root(const H5HF_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5HF_space_create_root(const H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_indirect_t *root_iblock);
+H5_DLL herr_t H5HF_space_size(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t *fs_size);
+H5_DLL herr_t H5HF_space_remove(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *node);
+H5_DLL herr_t H5HF_space_close(H5HF_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5HF_space_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, unsigned new_class);
+
+/* Free space section routines */
+H5_DLL H5HF_free_section_t *H5HF_sect_single_new(hsize_t sect_off,
+    size_t sect_size, H5HF_indirect_t *parent, unsigned par_entry);
+H5_DLL herr_t H5HF_sect_single_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+H5_DLL herr_t H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size);
+H5_DLL herr_t H5HF_sect_single_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, size_t amt);
+H5_DLL herr_t H5HF_sect_row_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+H5_DLL herr_t H5HF_sect_row_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, unsigned *entry_p);
+H5_DLL H5HF_indirect_t *H5HF_sect_row_get_iblock(H5HF_free_section_t *sect);
+H5_DLL herr_t H5HF_sect_indirect_add(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, unsigned start_entry, unsigned nentries);
+H5_DLL herr_t H5HF_sect_single_free(H5FS_section_info_t *sect);
+
+/* Internal operator callbacks */
+H5_DLL herr_t H5HF_op_read(const void *obj, size_t obj_len, void *op_data);
+H5_DLL herr_t H5HF_op_write(const void *obj, size_t obj_len, void *op_data);
+
+/* Testing routines */
+#ifdef H5HF_TESTING
+H5_DLL herr_t H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam);
+H5_DLL int H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2);
+H5_DLL unsigned H5HF_get_max_root_rows(const H5HF_t *fh);
+H5_DLL unsigned H5HF_get_dtable_width_test(const H5HF_t *fh);
+H5_DLL unsigned H5HF_get_dtable_max_drows_test(const H5HF_t *fh);
+H5_DLL unsigned H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos);
+H5_DLL hsize_t H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row);
+H5_DLL hsize_t H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row);
+H5_DLL herr_t H5HF_get_id_off_test(const H5HF_t *fh, const void *id, hsize_t *obj_off);
+H5_DLL herr_t H5HF_get_id_type_test(const void *id, unsigned char *obj_type);
+H5_DLL herr_t H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len,
+    hbool_t *len_extended);
+H5_DLL herr_t H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id,
+    hbool_t *ids_direct);
+#endif /* H5HF_TESTING */
+
+#endif /* _H5HFpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFprivate.h b/gatb-core/thirdparty/hdf5/src/H5HFprivate.h
new file mode 100644
index 0000000..55daa30
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFprivate.h
@@ -0,0 +1,140 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFprivate.h
+ *			Feb 24 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Private header for library accessible fractal heap routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5HFprivate_H
+#define _H5HFprivate_H
+
+/* Include package's public header */
+#include "H5HFpublic.h"
+
+/* Private headers needed by this file */
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Limit heap ID length to 4096 + 1, due to # of bits required to store
+ *      length of 'tiny' objects (12 bits)
+ */
+#define H5HF_MAX_ID_LEN         (4096 + 1)
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Creation parameters for doubling-tables */
+typedef struct H5HF_dtable_cparam_t {
+    unsigned    width;          /* Number of columns in the table (must be power of 2) */
+    size_t      start_block_size; /* Starting block size for table (must be power of 2) */
+    size_t      max_direct_size; /* Maximum size of a direct block (must be power of 2) */
+    unsigned    max_index;      /* Maximum ID/offset for table (integer log2 of actual value, ie. the # of bits required) */
+    unsigned    start_root_rows;        /* Starting number of rows for root indirect block */
+                                /* 0 indicates to create the full indirect block for the root,
+                                 * right from the start.  Doesn't have to be power of 2
+                                 */
+} H5HF_dtable_cparam_t;
+
+/* Fractal heap creation parameters */
+typedef struct H5HF_create_t {
+    H5HF_dtable_cparam_t managed;/* Mapped object doubling-table creation parameters */
+    hbool_t checksum_dblocks;   /* Whether the direct blocks should be checksummed */
+    uint32_t max_man_size;      /* Max. size of object to manage in doubling table */
+                                /* (i.e.  min. size of object to store standalone) */
+    uint16_t id_len;            /* Length of IDs to use for heap objects */
+                                /* (0 - make ID just large enough to hold length & offset of object in the heap) */
+                                /* (1 - make ID just large enough to allow 'huge' objects to be accessed directly) */
+                                /* (n - make ID 'n' bytes in size) */
+    H5O_pline_t pline;          /* I/O filter pipeline to apply to direct blocks & 'huge' objects */
+} H5HF_create_t;
+
+/* Fractal heap metadata statistics info */
+typedef struct H5HF_stat_t {
+    /* 'Managed' object info */
+    hsize_t man_size;           /* Size of 'managed' space in heap            */
+    hsize_t man_alloc_size;     /* Size of 'managed' space allocated in heap  */
+    hsize_t man_iter_off;       /* Offset of "new block" iterator in 'managed' heap space */
+    hsize_t man_free_space;     /* Free space within 'managed' heap blocks    */
+    hsize_t man_nobjs;          /* Number of 'managed' objects in heap        */
+
+    /* 'Huge' object info */
+    hsize_t huge_size;          /* Size of 'huge' objects in heap             */
+    hsize_t huge_nobjs;         /* Number of 'huge' objects in heap           */
+
+    /* 'Tiny' object info */
+    hsize_t tiny_size;          /* Size of 'tiny' objects in heap             */
+    hsize_t tiny_nobjs;         /* Number of 'tiny' objects in heap           */
+} H5HF_stat_t;
+
+/* Fractal heap info (forward decl - defined in H5HFpkg.h) */
+typedef struct H5HF_t H5HF_t;
+
+/* Typedef for 'op' operations */
+typedef herr_t (*H5HF_operator_t)(const void *obj/*in*/, size_t obj_len,
+        void *op_data/*in,out*/);
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General routines for fractal heap operations */
+H5_DLL H5HF_t *H5HF_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam);
+H5_DLL H5HF_t *H5HF_open(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr);
+H5_DLL herr_t H5HF_get_id_len(H5HF_t *fh, size_t *id_len_p/*out*/);
+H5_DLL herr_t H5HF_get_heap_addr(const H5HF_t *fh, haddr_t *heap_addr/*out*/);
+H5_DLL herr_t H5HF_insert(H5HF_t *fh, hid_t dxpl_id, size_t size,
+    const void *obj, void *id/*out*/);
+H5_DLL herr_t H5HF_get_obj_len(H5HF_t *fh, hid_t dxpl_id, const void *id,
+    size_t *obj_len_p/*out*/);
+H5_DLL herr_t H5HF_read(H5HF_t *fh, hid_t dxpl_id, const void *id,
+    void *obj/*out*/);
+H5_DLL herr_t H5HF_write(H5HF_t *fh, hid_t dxpl_id, void *id, hbool_t *id_changed,
+    const void *obj);
+H5_DLL herr_t H5HF_op(H5HF_t *fh, hid_t dxpl_id, const void *id,
+    H5HF_operator_t op, void *op_data);
+H5_DLL herr_t H5HF_remove(H5HF_t *fh, hid_t dxpl_id, const void *id);
+H5_DLL herr_t H5HF_close(H5HF_t *fh, hid_t dxpl_id);
+H5_DLL herr_t H5HF_delete(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr);
+
+/* Statistics routines */
+H5_DLL herr_t H5HF_stat_info(const H5HF_t *fh, H5HF_stat_t *stats);
+H5_DLL herr_t H5HF_size(const H5HF_t *fh, hid_t dxpl_id, hsize_t *heap_size/*out*/);
+
+/* Debugging routines */
+#ifdef H5HF_DEBUGGING
+H5_DLL herr_t H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth);
+#endif /* H5HF_DEBUGGING */
+
+#endif /* _H5HFprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFpublic.h b/gatb-core/thirdparty/hdf5/src/H5HFpublic.h
new file mode 100644
index 0000000..78b367b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFpublic.h
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5HFpublic.h
+ *                      Feb 24 2006
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Public declarations for the fractal heap package.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5HFpublic_H
+#define _H5HFpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/**********************************/
+/* Public API Function Prototypes */
+/**********************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5HFpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFsection.c b/gatb-core/thirdparty/hdf5/src/H5HFsection.c
new file mode 100644
index 0000000..9098f0f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFsection.c
@@ -0,0 +1,4185 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Monday, May  1, 2006
+ *
+ * Purpose:	Free space section routines for fractal heaps.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Size of serialized indirect section information */
+#define H5HF_SECT_INDIRECT_SERIAL_SIZE(h) (                                   \
+    (h)->heap_off_size  /* Indirect block's offset in "heap space" */         \
+        + 2             /* Row */                                             \
+        + 2             /* Column */                                          \
+        + 2             /* # of entries */                                    \
+    )
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for "class private" information for sections */
+typedef struct {
+    H5HF_hdr_t *hdr;            /* Pointer to fractal heap header */
+} H5HF_sect_private_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Shared routines */
+static herr_t H5HF_sect_init_cls(H5FS_section_class_t *cls,
+    H5HF_hdr_t *hdr);
+static herr_t H5HF_sect_term_cls(H5FS_section_class_t *cls);
+static H5HF_free_section_t *H5HF_sect_node_new(unsigned sect_type,
+    haddr_t sect_addr, hsize_t sect_size, H5FS_section_state_t state);
+static herr_t H5HF_sect_node_free(H5HF_free_section_t *sect,
+    H5HF_indirect_t *parent);
+
+/* 'single' section routines */
+static herr_t H5HF_sect_single_locate_parent(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t refresh, H5HF_free_section_t *sect);
+static herr_t H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+
+/* 'single' section callbacks */
+static herr_t H5HF_sect_single_add(H5FS_section_info_t *sect, unsigned *flags,
+    void *udata);
+static H5FS_section_info_t *H5HF_sect_single_deserialize(const H5FS_section_class_t *cls,
+    hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags);
+static htri_t H5HF_sect_single_can_merge(const H5FS_section_info_t *sect1,
+    const H5FS_section_info_t *sect2, void *udata);
+static herr_t H5HF_sect_single_merge(H5FS_section_info_t *sect1,
+    H5FS_section_info_t *sect2, void *udata);
+static htri_t H5HF_sect_single_can_shrink(const H5FS_section_info_t *sect,
+    void *udata);
+static herr_t H5HF_sect_single_shrink(H5FS_section_info_t **_sect,
+    void *udata);
+static herr_t H5HF_sect_single_valid(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *sect);
+
+/* 'row' section routines */
+static H5HF_free_section_t *H5HF_sect_row_create(haddr_t sect_off,
+    hsize_t sect_size, hbool_t is_first, unsigned row, unsigned col,
+    unsigned nentries, H5HF_free_section_t *under_sect);
+static herr_t H5HF_sect_row_first(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+static herr_t H5HF_sect_row_from_single(H5HF_hdr_t *hdr,
+    H5HF_free_section_t *sect, H5HF_direct_t *dblock);
+static herr_t H5HF_sect_row_free_real(H5HF_free_section_t *sect);
+
+/* 'row' section callbacks */
+static herr_t H5HF_sect_row_init_cls(H5FS_section_class_t *cls, void *udata);
+static herr_t H5HF_sect_row_term_cls(H5FS_section_class_t *cls);
+static herr_t H5HF_sect_row_serialize(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *sect, uint8_t *buf);
+static H5FS_section_info_t *H5HF_sect_row_deserialize(const H5FS_section_class_t *cls,
+    hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags);
+static htri_t H5HF_sect_row_can_merge(const H5FS_section_info_t *sect1,
+    const H5FS_section_info_t *sect2, void *udata);
+static herr_t H5HF_sect_row_merge(H5FS_section_info_t *sect1,
+    H5FS_section_info_t *sect2, void *udata);
+static htri_t H5HF_sect_row_can_shrink(const H5FS_section_info_t *sect,
+    void *udata);
+static herr_t H5HF_sect_row_shrink(H5FS_section_info_t **sect,
+    void *udata);
+static herr_t H5HF_sect_row_free(H5FS_section_info_t *sect);
+static herr_t H5HF_sect_row_valid(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *sect);
+static herr_t H5HF_sect_row_debug(const H5FS_section_info_t *sect,
+    FILE *stream, int indent, int fwidth);
+
+/* 'indirect' section routines */
+static H5HF_free_section_t *H5HF_sect_indirect_new(H5HF_hdr_t *hdr,
+    haddr_t sect_off, hsize_t sect_size,
+    H5HF_indirect_t *iblock, hsize_t iblock_off,
+    unsigned row, unsigned col, unsigned nentries);
+static herr_t H5HF_sect_indirect_init_rows(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, hbool_t first_child, H5HF_free_section_t **first_row_sect,
+    unsigned space_flags, unsigned start_row, unsigned start_col,
+    unsigned end_row, unsigned end_col);
+static H5HF_free_section_t *H5HF_sect_indirect_for_row(H5HF_hdr_t *hdr,
+    H5HF_indirect_t *iblock, H5HF_free_section_t *row_sect);
+static herr_t H5HF_sect_indirect_decr(H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_revive_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, H5HF_indirect_t *sect_iblock);
+static herr_t H5HF_sect_indirect_reduce_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *row_sect, hbool_t *alloc_from_start);
+static herr_t H5HF_sect_indirect_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, unsigned child_entry);
+static herr_t H5HF_sect_indirect_first(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+static hbool_t H5HF_sect_indirect_is_first(H5HF_free_section_t *sect);
+static H5HF_indirect_t * H5HF_sect_indirect_get_iblock(H5HF_free_section_t *sect);
+static hsize_t H5HF_sect_indirect_iblock_off(const H5HF_free_section_t *sect);
+static H5HF_free_section_t * H5HF_sect_indirect_top(H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_merge_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect1, H5HF_free_section_t *sect2);
+static herr_t H5HF_sect_indirect_build_parent(H5HF_hdr_t *hdr, H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_shrink(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_serialize(H5HF_hdr_t *hdr,
+    const H5HF_free_section_t *sect, uint8_t *buf);
+static H5FS_section_info_t *H5HF_sect_indirect_deserialize(H5HF_hdr_t *hdr,
+    hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags);
+static herr_t H5HF_sect_indirect_free(H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_valid(const H5HF_hdr_t *hdr,
+    const H5HF_free_section_t *sect);
+static herr_t H5HF_sect_indirect_debug(const H5HF_free_section_t *sect,
+    FILE *stream, int indent, int fwidth);
+
+/* 'indirect' section callbacks */
+static herr_t H5HF_sect_indirect_init_cls(H5FS_section_class_t *cls, void *udata);
+static herr_t H5HF_sect_indirect_term_cls(H5FS_section_class_t *cls);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Class info for "single" free space sections */
+H5FS_section_class_t H5HF_FSPACE_SECT_CLS_SINGLE[1] = {{
+    /* Class variables */
+    H5HF_FSPACE_SECT_SINGLE,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM,			/* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    NULL,				/* Initialize section class     */
+    NULL,				/* Terminate section class      */
+
+    /* Object methods */
+    H5HF_sect_single_add,		/* Add section                  */
+    NULL,				/* Serialize section            */
+    H5HF_sect_single_deserialize,	/* Deserialize section          */
+    H5HF_sect_single_can_merge,		/* Can sections merge?          */
+    H5HF_sect_single_merge,		/* Merge sections               */
+    H5HF_sect_single_can_shrink,	/* Can section shrink container?*/
+    H5HF_sect_single_shrink,		/* Shrink container w/section   */
+    H5HF_sect_single_free,		/* Free section                 */
+    H5HF_sect_single_valid,		/* Check validity of section    */
+    NULL,				/* Split section node for alignment */
+    NULL,				/* Dump debugging for section   */
+}};
+
+/* Class info for "first row" free space sections */
+/* (Same as "normal" row sections, except they also act as a proxy for the
+ *      underlying indirect section
+ */
+H5FS_section_class_t H5HF_FSPACE_SECT_CLS_FIRST_ROW[1] = {{
+    /* Class variables */
+    H5HF_FSPACE_SECT_FIRST_ROW,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM,			/* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    H5HF_sect_row_init_cls,		/* Initialize section class     */
+    H5HF_sect_row_term_cls,		/* Terminate section class      */
+
+    /* Object methods */
+    NULL,				/* Add section                  */
+    H5HF_sect_row_serialize,		/* Serialize section            */
+    H5HF_sect_row_deserialize,		/* Deserialize section          */
+    H5HF_sect_row_can_merge,		/* Can sections merge?          */
+    H5HF_sect_row_merge,		/* Merge sections               */
+    H5HF_sect_row_can_shrink,		/* Can section shrink container?*/
+    H5HF_sect_row_shrink,		/* Shrink container w/section   */
+    H5HF_sect_row_free,			/* Free section                 */
+    H5HF_sect_row_valid,		/* Check validity of section    */
+    NULL,				/* Split section node for alignment */
+    H5HF_sect_row_debug,		/* Dump debugging for section   */
+}};
+
+/* Class info for "normal row" free space sections */
+H5FS_section_class_t H5HF_FSPACE_SECT_CLS_NORMAL_ROW[1] = {{
+    /* Class variables */
+    H5HF_FSPACE_SECT_NORMAL_ROW,	/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM|H5FS_CLS_SEPAR_OBJ|H5FS_CLS_GHOST_OBJ,	/* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    H5HF_sect_row_init_cls,		/* Initialize section class     */
+    H5HF_sect_row_term_cls,		/* Terminate section class      */
+
+    /* Object methods */
+    NULL,				/* Add section                  */
+    NULL,				/* Serialize section            */
+    NULL,				/* Deserialize section          */
+    NULL,				/* Can sections merge?          */
+    NULL,				/* Merge sections               */
+    NULL,				/* Can section shrink container?*/
+    NULL,				/* Shrink container w/section   */
+    H5HF_sect_row_free,			/* Free section                 */
+    H5HF_sect_row_valid,		/* Check validity of section    */
+    NULL,				/* Split section node for alignment */
+    H5HF_sect_row_debug,		/* Dump debugging for section   */
+}};
+
+/* Class info for "indirect" free space sections */
+/* (No object callbacks necessary - objects of this class should never be in
+ *      section manager)
+ */
+H5FS_section_class_t H5HF_FSPACE_SECT_CLS_INDIRECT[1] = {{
+    /* Class variables */
+    H5HF_FSPACE_SECT_INDIRECT,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM|H5FS_CLS_GHOST_OBJ,			/* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    H5HF_sect_indirect_init_cls,	/* Initialize section class     */
+    H5HF_sect_indirect_term_cls,	/* Terminate section class      */
+
+    /* Object methods */
+    NULL,				/* Add section                  */
+    NULL,				/* Serialize section            */
+    NULL,				/* Deserialize section          */
+    NULL,				/* Can sections merge?          */
+    NULL,				/* Merge sections               */
+    NULL,				/* Can section shrink container?*/
+    NULL,				/* Shrink container w/section   */
+    NULL,				/* Free section                 */
+    NULL,				/* Check validity of section    */
+    NULL,				/* Split section node for alignment */
+    NULL,				/* Dump debugging for section   */
+}};
+
+/* Declare a free list to manage the H5HF_free_section_t struct */
+H5FL_DEFINE(H5HF_free_section_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_init_cls
+ *
+ * Purpose:	Initialize the common class structure
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 25, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_init_cls(H5FS_section_class_t *cls, H5HF_hdr_t *hdr)
+{
+    H5HF_sect_private_t *cls_prvt;      /* Pointer to class private info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+    HDassert(!cls->cls_private);
+
+    /* Allocate & initialize the class-private (i.e. private shared) information
+     * for this type of section
+     */
+    if(NULL == (cls_prvt = (H5HF_sect_private_t *)H5MM_malloc(sizeof(H5HF_sect_private_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    cls_prvt->hdr = hdr;
+    cls->cls_private = cls_prvt;
+
+    /* Increment reference count on heap header */
+    if(H5HF_hdr_incr(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared heap header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_init_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_term_cls
+ *
+ * Purpose:	Terminate the common class structure
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 25, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_term_cls(H5FS_section_class_t *cls)
+{
+    H5HF_sect_private_t *cls_prvt;      /* Pointer to class private info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+
+    /* Get pointer to class private info */
+    cls_prvt = (H5HF_sect_private_t *)cls->cls_private;
+
+    /* Decrement reference count on heap header */
+    if(H5HF_hdr_decr(cls_prvt->hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
+
+    /* Free the class private information */
+    cls->cls_private = H5MM_xfree(cls_prvt);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_term_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_node_new
+ *
+ * Purpose:	Allocate a free space section node of a particular type
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, May 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_free_section_t *
+H5HF_sect_node_new(unsigned sect_type, haddr_t sect_addr, hsize_t sect_size,
+    H5FS_section_state_t sect_state)
+{
+    H5HF_free_section_t *new_sect;      /* New section */
+    H5HF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(H5F_addr_defined(sect_addr));
+
+    /* Create free list section node */
+    if(NULL == (new_sect = H5FL_MALLOC(H5HF_free_section_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct block free list section")
+
+    /* Set the information passed in */
+    new_sect->sect_info.addr = sect_addr;
+    new_sect->sect_info.size = sect_size;
+
+    /* Set the section's class & state */
+    new_sect->sect_info.type = sect_type;
+    new_sect->sect_info.state = sect_state;
+
+    /* Set return value */
+    ret_value = new_sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_node_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_node_free
+ *
+ * Purpose:	Free a section node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_node_free(H5HF_free_section_t *sect, H5HF_indirect_t *iblock)
+{
+    herr_t ret_value = SUCCEED;               /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(sect);
+
+    /* Release indirect block, if there was one */
+    if(iblock)
+        if(H5HF_iblock_decr(iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on section's indirect block")
+
+    /* Release the section */
+    sect = H5FL_FREE(H5HF_free_section_t, sect);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5HF_sect_node_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_new
+ *
+ * Purpose:	Create a new 'single' section and return it to the caller
+ *
+ * Return:	Pointer to new section on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 30 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_free_section_t *
+H5HF_sect_single_new(hsize_t sect_off, size_t sect_size,
+    H5HF_indirect_t *parent, unsigned par_entry)
+{
+    H5HF_free_section_t *sect = NULL;   /* 'Single' free space section to add */
+    H5HF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect_size);
+
+    /* Create free space section node */
+    if(NULL == (sect = H5HF_sect_node_new(H5HF_FSPACE_SECT_SINGLE, sect_off, (hsize_t)sect_size, H5FS_SECT_LIVE)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for single section")
+
+    /* Set the 'single' specific fields */
+    sect->u.single.parent = parent;
+    if(sect->u.single.parent) {
+        if(H5HF_iblock_incr(sect->u.single.parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared indirect block")
+    } /* end if */
+    sect->u.single.par_entry = par_entry;
+
+    /* Set return value */
+    ret_value = sect;
+
+done:
+    if(!ret_value && sect) {
+        /* Release the section */
+        sect = H5FL_FREE(H5HF_free_section_t, sect);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_single_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_locate_parent
+ *
+ * Purpose:	Locate the parent indirect block for a single section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		October 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_locate_parent(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t refresh,
+    H5HF_free_section_t *sect)
+{
+    H5HF_indirect_t *sec_iblock;        /* Pointer to section indirect block */
+    unsigned sec_entry;                 /* Entry within section indirect block */
+    hbool_t did_protect;                /* Whether we protected the indirect block or not */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(hdr->man_dtable.curr_root_rows > 0);
+    HDassert(sect);
+
+    /* Look up indirect block containing direct blocks for range */
+    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, &sec_entry, &did_protect, H5AC_READ) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
+
+    /* Increment reference count on indirect block that free section is in */
+    if(H5HF_iblock_incr(sec_iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block")
+
+    /* Check for refreshing existing parent information */
+    if(refresh) {
+        if(sect->u.single.parent) {
+            /* Release hold on previous parent indirect block */
+            if(H5HF_iblock_decr(sect->u.single.parent) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on section's indirect block")
+        } /* end if */
+    } /* end if */
+
+    /* Set the information for the section */
+    sect->u.single.parent = sec_iblock;
+    sect->u.single.par_entry = sec_entry;
+
+    /* Unlock indirect block */
+    if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+    sec_iblock = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_single_locate_parent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_revive
+ *
+ * Purpose:	Update the memory information for a 'single' free section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_single_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED);
+
+    /* Check for root direct block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        /* Set the information for the section */
+        HDassert(H5F_addr_defined(hdr->man_dtable.table_addr));
+        sect->u.single.parent = NULL;
+        sect->u.single.par_entry = 0;
+    } /* end if */
+    else {
+        /* Look up indirect block information for section */
+        if(H5HF_sect_single_locate_parent(hdr, dxpl_id, FALSE, sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get section's parent info")
+    } /* end else */
+
+    /* Section is "live" now */
+    sect->sect_info.state = H5FS_SECT_LIVE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_single_revive() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_dblock_info
+ *
+ * Purpose:	Retrieve the direct block information for a single section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		October 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(dblock_addr);
+    HDassert(dblock_size);
+
+    /* Check for root direct block */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        /* Retrieve direct block info from heap header */
+        HDassert(H5F_addr_defined(hdr->man_dtable.table_addr));
+        *dblock_addr =  hdr->man_dtable.table_addr;
+        *dblock_size =  hdr->man_dtable.cparam.start_block_size;
+    } /* end if */
+    else {
+        /* Retrieve direct block info from parent indirect block */
+        *dblock_addr =  sect->u.single.parent->ents[sect->u.single.par_entry].addr;
+        *dblock_size =  hdr->man_dtable.row_block_size[sect->u.single.par_entry / hdr->man_dtable.cparam.width];
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_sect_single_dblock_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_reduce
+ *
+ * Purpose:	Reduce the size of a single section (possibly freeing it)
+ *              and re-add it back to the free space manager for the heap
+ *              (if it hasn't been freed)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 31 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_single_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, size_t amt)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+
+    /* Check for eliminating the section */
+    if(sect->sect_info.size == amt) {
+        /* Free single section */
+        if(H5HF_sect_single_free((H5FS_section_info_t *)sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free single section node")
+    } /* end if */
+    else {
+        /* Adjust information for section */
+        sect->sect_info.addr += amt;
+        sect->sect_info.size -= amt;
+
+        /* Re-insert section node into heap's free space */
+        if(H5HF_space_add(hdr, dxpl_id, sect, 0) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't re-add single section to free space manager")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_single_reduce() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_full_dblock
+ *
+ * Purpose:	Checks if a single section covers the entire direct block
+ *              that it resides in, and converts it to a row section if so
+ *
+ * Note:        Does not convert a single section to a row section if the
+ *              single section is for a root direct block
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect)
+{
+    haddr_t dblock_addr;                /* Section's direct block's address */
+    size_t dblock_size;                 /* Section's direct block's size */
+    size_t dblock_overhead;             /* Direct block's overhead */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(hdr);
+
+    /* Retrieve direct block address from section */
+    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, sect, &dblock_addr, &dblock_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
+
+    /* Check for section occupying entire direct block */
+    /* (and not the root direct block) */
+    dblock_overhead = H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+    if((dblock_size - dblock_overhead) == sect->sect_info.size &&
+            hdr->man_dtable.curr_root_rows > 0) {
+        H5HF_direct_t *dblock;          /* Pointer to direct block for section */
+
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sect->u.single.parent, sect->u.single.par_entry, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
+        HDassert(H5F_addr_eq(dblock->block_off + dblock_overhead, sect->sect_info.addr));
+
+        /* Convert 'single' section into 'row' section */
+        if(H5HF_sect_row_from_single(hdr, sect, dblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCONVERT, FAIL, "can't convert single section into row section")
+
+        /* Destroy direct block */
+        if(H5HF_man_dblock_destroy(hdr, dxpl_id, dblock, dblock_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release direct block")
+        dblock = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_full_dblock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_add
+ *
+ * Purpose:	Perform any actions on section as it is added to free space
+ *              manager
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_add(H5FS_section_info_t *_sect, unsigned *flags, void *_udata)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Don't need to check section if we are deserializing, because it should
+     *  have already been checked when it was first added
+     */
+    if(!(*flags & H5FS_ADD_DESERIALIZING)) {
+        H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;   /* Fractal heap free section */
+        H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+        H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+        hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
+
+        /* Sanity check */
+        HDassert(sect);
+        HDassert(hdr);
+
+        /* Check if single section covers entire direct block it's in */
+        /* (converts to row section possibly) */
+        if(H5HF_sect_single_full_dblock(hdr, dxpl_id, sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCONVERT, FAIL, "can't check/convert single section")
+
+        /* Set the "returned space" flag if the single section was changed
+         *      into a row section, so the "merging & shrinking" algorithm
+         *      gets executed in the free space manager
+         */
+        if(sect->sect_info.type != H5HF_FSPACE_SECT_SINGLE)
+            *flags |= H5FS_ADD_RETURNED_SPACE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_deserialize
+ *
+ * Purpose:	Deserialize a buffer into a "live" single section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May  1, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5HF_sect_single_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
+    hid_t H5_ATTR_UNUSED dxpl_id, const uint8_t H5_ATTR_UNUSED *buf, haddr_t sect_addr,
+    hsize_t sect_size, unsigned H5_ATTR_UNUSED *des_flags)
+{
+    H5HF_free_section_t *new_sect;      /* New section */
+    H5FS_section_info_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(H5F_addr_defined(sect_addr));
+    HDassert(sect_size);
+
+    /* Create free list section node */
+    if(NULL == (new_sect = H5HF_sect_node_new(H5HF_FSPACE_SECT_SINGLE, sect_addr, sect_size, H5FS_SECT_SERIALIZED)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "allocation failed for direct block free list section")
+
+    /* Set return value */
+    ret_value = (H5FS_section_info_t *)new_sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_can_merge
+ *
+ * Purpose:	Can two sections of this type merge?
+ *
+ * Note:        Second section must be "after" first section
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF_sect_single_can_merge(const H5FS_section_info_t *_sect1,
+    const H5FS_section_info_t *_sect2, void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_free_section_t *sect1 = (const H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    const H5HF_free_section_t *sect2 = (const H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect2);
+    HDassert(sect1->sect_info.type == sect2->sect_info.type);   /* Checks "MERGE_SYM" flag */
+    HDassert(H5F_addr_lt(sect1->sect_info.addr, sect2->sect_info.addr));
+
+    /* Check if second section adjoins first section */
+    /* (This can only occur within a direct block, due to the direct block
+     *  overhead at the beginning of a block, so no need to check if sections
+     *  are actually within the same direct block)
+     */
+    if(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr))
+        HGOTO_DONE(TRUE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_can_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_merge
+ *
+ * Purpose:	Merge two sections of this type
+ *
+ * Note:        Second section always merges into first node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+    void *_udata)
+{
+    H5HF_free_section_t *sect1 = (H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    H5HF_free_section_t *sect2 = (H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect1->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+    HDassert(sect2);
+    HDassert(sect2->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+    HDassert(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr));
+
+    /* Add second section's size to first section */
+    sect1->sect_info.size += sect2->sect_info.size;
+
+    /* Get rid of second section */
+    if(H5HF_sect_single_free((H5FS_section_info_t *)sect2) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+    /* Check to see if we should revive first section */
+    if(sect1->sect_info.state != H5FS_SECT_LIVE)
+        if(H5HF_sect_single_revive(hdr, dxpl_id, sect1) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
+
+    /* Check if single section covers entire direct block it's in */
+    /* (converts to row section possibly) */
+    if(H5HF_sect_single_full_dblock(hdr, dxpl_id, sect1) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCONVERT, FAIL, "can't check/convert single section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_can_shrink
+ *
+ * Purpose:	Can this section shrink the container?
+ *
+ * Note:        This isn't actually shrinking the heap (since that's already
+ *              been done) as much as it's cleaning up _after_ the heap
+ *              shrink.
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF_sect_single_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
+{
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;   /* Fractal heap free section */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Check for section occupying entire root direct block */
+    /* (We shouldn't ever have a single section that occupies an entire
+     *      direct block, unless it's in the root direct block (because it
+     *      would have been converted into a row section, if there was an
+     *      indirect block that covered it)
+     */
+    if(hdr->man_dtable.curr_root_rows == 0) {
+        size_t dblock_size;                 /* Section's direct block's size */
+        size_t dblock_overhead;             /* Direct block's overhead */
+
+        dblock_size = hdr->man_dtable.cparam.start_block_size;
+        dblock_overhead = H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+        if((dblock_size - dblock_overhead) == sect->sect_info.size)
+            HGOTO_DONE(TRUE)
+    } /* end if */
+    else {
+        /* We shouldn't have a situation where the 'next block' iterator
+         *      is moved before a direct block that still has objects within it.
+         */
+        HDassert(hdr->man_iter_off > sect->sect_info.addr);
+        HGOTO_DONE(FALSE)
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_can_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_shrink
+ *
+ * Purpose:	Shrink container with section
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_shrink(H5FS_section_info_t **_sect, void H5_ATTR_UNUSED *_udata)
+{
+    H5HF_free_section_t **sect = (H5HF_free_section_t **)_sect;   /* Fractal heap free section */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
+    H5HF_direct_t *dblock;              /* Pointer to direct block for section */
+    haddr_t dblock_addr;                /* Section's direct block's address */
+    size_t dblock_size;                 /* Section's direct block's size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(*sect);
+    HDassert((*sect)->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+
+    /* Check to see if we should revive section */
+    if((*sect)->sect_info.state != H5FS_SECT_LIVE)
+        if(H5HF_sect_single_revive(hdr, dxpl_id, (*sect)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
+
+    /* Retrieve direct block address from section */
+    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, (*sect), &dblock_addr, &dblock_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
+
+    /* Protect the direct block for the section */
+    /* (should be a root direct block) */
+    HDassert(dblock_addr == hdr->man_dtable.table_addr);
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr,
+            dblock_size, (*sect)->u.single.parent, (*sect)->u.single.par_entry, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
+    HDassert(H5F_addr_eq(dblock->block_off + dblock_size, (*sect)->sect_info.addr + (*sect)->sect_info.size));
+
+    /* Destroy direct block */
+    if(H5HF_man_dblock_destroy(hdr, dxpl_id, dblock, dblock_addr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release direct block")
+    dblock = NULL;
+
+    /* Get rid of section */
+    if(H5HF_sect_single_free((H5FS_section_info_t *)*sect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+    /* Indicate that the section has been released */
+    *sect = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_single_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_free
+ *
+ * Purpose:	Free a 'single' section node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_single_free(H5FS_section_info_t *_sect)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;   /* Pointer to section to free */
+    H5HF_indirect_t *parent = NULL;     /* Parent indirect block for section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Check for live reference to an indirect block */
+    if(sect->sect_info.state == H5FS_SECT_LIVE) {
+        /* Get parent indirect block, if there was one */
+        if(sect->u.single.parent)
+            parent = sect->u.single.parent;
+    } /* end if */
+
+    /* Release the section */
+    if(H5HF_sect_node_free(sect, parent) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5HF_sect_single_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_single_valid
+ *
+ * Purpose:	Check the validity of a section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, July 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5FS_section_info_t *_sect)
+{
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;   /* Pointer to section to check */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    if(sect->sect_info.state == H5FS_SECT_LIVE) {
+        /* Check if this section is not in a direct block that is the root direct block */
+        /* (not enough information to check on a single section in a root direct block) */
+        if(sect->u.single.parent != NULL) {
+            H5HF_indirect_t *iblock;    /* Indirect block that section's direct block resides in */
+            haddr_t dblock_addr;        /* Direct block address */
+            size_t dblock_size;         /* Direct block size */
+            size_t dblock_overhead;     /* Direct block's overhead */
+            unsigned dblock_status = 0; /* Direct block's status in the metadata cache */
+            herr_t status;              /* Generic status value */
+
+            /* Sanity check settings for section's direct block's parent */
+            iblock = sect->u.single.parent;
+            HDassert(H5F_addr_defined(iblock->ents[sect->u.single.par_entry].addr));
+
+            /* Retrieve direct block address from section */
+            /* (Casting away const OK - QAK) */
+            status = H5HF_sect_single_dblock_info(iblock->hdr, H5AC_dxpl_id, (H5HF_free_section_t *)sect, &dblock_addr, &dblock_size);
+            HDassert(status >= 0);
+            HDassert(H5F_addr_eq(iblock->ents[sect->u.single.par_entry].addr, dblock_addr));
+            HDassert(dblock_size > 0);
+
+            /* Check if the section is actually within the heap */
+            HDassert(sect->sect_info.addr < iblock->hdr->man_iter_off);
+
+            /* Check that the direct block has been merged correctly */
+            dblock_overhead = H5HF_MAN_ABS_DIRECT_OVERHEAD(iblock->hdr);
+            HDassert((sect->sect_info.size + dblock_overhead) < dblock_size);
+
+            /* Check the direct block's status in the metadata cache */
+            status = H5AC_get_entry_status(iblock->hdr->f, dblock_addr, &dblock_status);
+            HDassert(status >= 0);
+
+            /* If the direct block for the section isn't already protected,
+             *  protect it here in order to check single section's sanity
+             *  against it.
+             */
+            if(!(dblock_status & H5AC_ES__IS_PROTECTED)) {
+                H5HF_direct_t *dblock;      /* Direct block for section */
+
+                /* Protect the direct block for the section */
+                dblock = H5HF_man_dblock_protect(iblock->hdr, H5AC_dxpl_id, dblock_addr, dblock_size, iblock, sect->u.single.par_entry, H5AC_READ);
+                HDassert(dblock);
+
+                /* Sanity check settings for section */
+                HDassert(dblock_size == dblock->size);
+                HDassert(dblock->size > sect->sect_info.size);
+                HDassert(H5F_addr_lt(dblock->block_off, sect->sect_info.addr));
+                HDassert(H5F_addr_ge((dblock->block_off + dblock->size),
+                        (sect->sect_info.addr + sect->sect_info.size)));
+
+                /* Release direct block */
+                status = H5AC_unprotect(iblock->hdr->f, H5AC_dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET);
+                HDassert(status >= 0);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5HF_sect_single_valid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_create
+ *
+ * Purpose:	Create a new 'row' section
+ *
+ * Return:	Success:	pointer to new section
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_free_section_t *
+H5HF_sect_row_create(haddr_t sect_off, hsize_t sect_size, hbool_t is_first,
+    unsigned row, unsigned col, unsigned nentries, H5HF_free_section_t *under_sect)
+{
+    H5HF_free_section_t *sect = NULL;   /* 'Row' section created */
+    H5HF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect_size);
+    HDassert(nentries);
+    HDassert(under_sect);
+
+    /* Create 'row' free space section node */
+    /* ("inherits" underlying indirect section's state) */
+    if(NULL == (sect = H5HF_sect_node_new((unsigned)(is_first ? H5HF_FSPACE_SECT_FIRST_ROW : H5HF_FSPACE_SECT_NORMAL_ROW), sect_off, sect_size, under_sect->sect_info.state)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for row section")
+
+    /* Set the 'row' specific fields */
+    sect->u.row.under = under_sect;
+    sect->u.row.row = row;
+    sect->u.row.col = col;
+    sect->u.row.num_entries = nentries;
+    sect->u.row.checked_out = FALSE;
+
+    /* Set return value */
+    ret_value = sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_from_single
+ *
+ * Purpose:	Convert a 'single' section into a 'row' section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_from_single(H5HF_hdr_t *hdr, H5HF_free_section_t *sect,
+    H5HF_direct_t *dblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(dblock);
+
+    /* Convert 'single' section information to 'row' section info */
+    sect->sect_info.addr = dblock->block_off;
+    sect->sect_info.type = H5HF_FSPACE_SECT_FIRST_ROW;
+    sect->u.row.row = dblock->par_entry / hdr->man_dtable.cparam.width;
+    sect->u.row.col = dblock->par_entry % hdr->man_dtable.cparam.width;
+    sect->u.row.num_entries = 1;
+    sect->u.row.checked_out = FALSE;
+
+    /* Create indirect section that underlies the row section */
+    if(NULL == (sect->u.row.under = H5HF_sect_indirect_for_row(hdr, dblock->parent, sect)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "serializing row section not supported yet")
+
+    /* Release single section's hold on underlying indirect block */
+    if(H5HF_iblock_decr(dblock->parent) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_row_from_single() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_revive
+ *
+ * Purpose:	Update the memory information for a 'row' free section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_row_revive(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->u.row.under);
+    HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED);
+
+    /* Pass along "revive" request to underlying indirect section */
+    /* (which will mark this section as "live") */
+    if(H5HF_sect_indirect_revive_row(hdr, dxpl_id, sect->u.row.under) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTREVIVE, FAIL, "can't revive indirect section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_row_revive() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_reduce
+ *
+ * Purpose:	Reduce the size of a row section (possibly freeing it)
+ *              and re-add it back to the free space manager for the heap
+ *              (if it hasn't been freed)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_row_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect,
+    unsigned *entry_p)
+{
+    hbool_t alloc_from_start;           /* Whether to allocate from the end of the row */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW ||
+            sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(entry_p);
+
+    /* Mark the row as checked out from the free space manager */
+    HDassert(sect->u.row.checked_out == FALSE);
+    sect->u.row.checked_out = TRUE;
+
+    /* Forward row section to indirect routines, to handle reducing underlying indirect section */
+    alloc_from_start = FALSE;
+    if(H5HF_sect_indirect_reduce_row(hdr, dxpl_id, sect, &alloc_from_start) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce underlying section")
+
+    /* Determine entry allocated */
+    *entry_p = (sect->u.row.row * hdr->man_dtable.cparam.width) + sect->u.row.col;
+    if(!alloc_from_start)
+        *entry_p += (sect->u.row.num_entries - 1);
+
+    /* Check for eliminating the section */
+    if(sect->u.row.num_entries == 1) {
+        /* Free row section */
+        if(H5HF_sect_row_free((H5FS_section_info_t *)sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free row section node")
+    } /* end if */
+    else {
+        /* Check whether to allocate from the beginning or end of the row */
+        if(alloc_from_start) {
+            /* Adjust section start */
+            sect->sect_info.addr += hdr->man_dtable.row_block_size[sect->u.row.row];
+            sect->u.row.col++;
+        } /* end else */
+
+        /* Adjust span of blocks covered */
+        sect->u.row.num_entries--;
+
+        /* Check the row back in */
+        sect->u.row.checked_out = FALSE;
+
+        /* Add 'row' section back to free space list */
+        if(H5HF_space_add(hdr, dxpl_id, sect, 0) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't re-add indirect section to free space manager")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_row_reduce() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_first
+ *
+ * Purpose:	Make row a "first row"
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_first(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+
+    /* If the row is already checked out from the free space manager, just
+     *  change it's class directly and the free space manager will adjust when
+     *  it is checked back in.
+     */
+    if(sect->u.row.checked_out)
+        sect->sect_info.type = H5HF_FSPACE_SECT_FIRST_ROW;
+    else {
+        /* Change row section to be the "first row" */
+        if(H5HF_space_sect_change_class(hdr, dxpl_id, sect, H5HF_FSPACE_SECT_FIRST_ROW) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "can't set row section to be first row")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_row_first() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_get_iblock
+ *
+ * Purpose:	Retrieve the indirect block for a row section
+ *
+ * Return:	Pointer to indirect block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HF_indirect_t *
+H5HF_sect_row_get_iblock(H5HF_free_section_t *sect)
+{
+    H5HF_indirect_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW ||
+            sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+
+    ret_value = H5HF_sect_indirect_get_iblock(sect->u.row.under);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_row_get_iblock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_init_cls
+ *
+ * Purpose:	Initialize the "row" section class structure
+ *
+ * Note:	Since 'row' sections are proxies for 'indirect' sections, this
+ *              routine forwards call to 'indirect' class initialization
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_init_cls(H5FS_section_class_t *cls, void *_udata)
+{
+    H5HF_hdr_t *hdr = (H5HF_hdr_t *)_udata; /* Fractal heap header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+    HDassert(hdr);
+
+    /* Call common class initialization */
+    if(H5HF_sect_init_cls(cls, hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize common section class")
+
+    /* First row sections actually are proxies for indirection sections on disk */
+    if(cls->type == H5HF_FSPACE_SECT_FIRST_ROW)
+        cls->serial_size = H5HF_SECT_INDIRECT_SERIAL_SIZE(hdr);
+    else
+        cls->serial_size = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_init_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_term_cls
+ *
+ * Purpose:	Terminate the "row" section class structure
+ *
+ * Note:	Since 'row' sections are proxies for 'indirect' sections, this
+ *              routine forwards call to 'indirect' class termination
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_term_cls(H5FS_section_class_t *cls)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+
+    /* Call common class termination */
+    if(H5HF_sect_term_cls(cls) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't terminate common section class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_term_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_serialize
+ *
+ * Purpose:	Serialize a "live" row section into a buffer
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_serialize(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *_sect, uint8_t *buf)
+{
+    H5HF_hdr_t *hdr;                    /* Fractal heap header */
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+    HDassert(buf);
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+    HDassert(sect->sect_info.addr == sect->u.row.under->sect_info.addr);
+
+    /* Forward to indirect routine to serialize underlying section */
+    hdr = ((H5HF_sect_private_t *)(cls->cls_private))->hdr;
+    if(H5HF_sect_indirect_serialize(hdr, sect->u.row.under, buf) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSERIALIZE, FAIL, "can't serialize row section's underlying indirect section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_deserialize
+ *
+ * Purpose:	Deserialize a buffer into a "live" row section
+ *
+ * Note:        Actually this routine just forwards to the 'indirect'
+ *              deserialize routine, which creates the row section.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, July 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5HF_sect_row_deserialize(const H5FS_section_class_t *cls, hid_t dxpl_id,
+    const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags)
+{
+    H5HF_hdr_t *hdr;                    /* Fractal heap header */
+    H5FS_section_info_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+    HDassert(buf);
+    HDassert(H5F_addr_defined(sect_addr));
+    HDassert(sect_size);
+
+    /* Forward to indirect routine to deserialize underlying section */
+    hdr = ((H5HF_sect_private_t *)(cls->cls_private))->hdr;
+    if(NULL ==  (ret_value = H5HF_sect_indirect_deserialize(hdr, dxpl_id, buf,
+            sect_addr, sect_size, des_flags)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't deserialize row section's underlying indirect section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_can_merge
+ *
+ * Purpose:	Can two sections of this type merge?
+ *
+ * Note:        Second section must be "after" first section
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF_sect_row_can_merge(const H5FS_section_info_t *_sect1,
+    const H5FS_section_info_t *_sect2, void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_free_section_t *sect1 = (const H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    const H5HF_free_section_t *sect2 = (const H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
+    H5HF_free_section_t *top_indir_sect1, *top_indir_sect2; /* Top indirect section for each row */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect1->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+    HDassert(sect2);
+    HDassert(sect1->sect_info.type == sect2->sect_info.type);   /* Checks "MERGE_SYM" flag */
+    HDassert(H5F_addr_lt(sect1->sect_info.addr, sect2->sect_info.addr));
+
+    /* Get the top indirect section underlying each row */
+    top_indir_sect1 = H5HF_sect_indirect_top(sect1->u.row.under);
+    HDassert(top_indir_sect1);
+    top_indir_sect2 = H5HF_sect_indirect_top(sect2->u.row.under);
+    HDassert(top_indir_sect2);
+
+    /* Check if second section shares the same underlying indirect block as
+     *  the first section, but doesn't already have same underlying indirect
+     *  section.
+     */
+    if(top_indir_sect1 != top_indir_sect2) {
+        if(H5HF_sect_indirect_iblock_off(top_indir_sect1) == H5HF_sect_indirect_iblock_off(top_indir_sect2)) {
+            /* Check if second section adjoins first section */
+            if(H5F_addr_eq((top_indir_sect1->sect_info.addr + top_indir_sect1->u.indirect.span_size), top_indir_sect2->sect_info.addr))
+                HGOTO_DONE(TRUE)
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_can_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_merge
+ *
+ * Purpose:	Merge two sections of this type
+ *
+ * Note:        Second section always merges into first node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+    void *_udata)
+{
+    H5HF_free_section_t *sect1 = (H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    H5HF_free_section_t *sect2 = (H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect1->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+    HDassert(sect2);
+    HDassert(sect2->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+
+    /* Check if second section is past end of "next block" iterator */
+    if(sect2->sect_info.addr >= hdr->man_iter_off) {
+        H5HF_free_section_t *top_indir_sect;    /* Top indirect section for row */
+
+        /* Get the top indirect section underlying second row section */
+        top_indir_sect = H5HF_sect_indirect_top(sect2->u.row.under);
+
+        /* Shrink away underlying indirect section */
+        if(H5HF_sect_indirect_shrink(hdr, dxpl_id, top_indir_sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't shrink underlying indirect section")
+    } /* end if */
+    else {
+        /* Check to see if we should revive first section */
+        if(sect1->sect_info.state != H5FS_SECT_LIVE)
+            if(H5HF_sect_row_revive(hdr, dxpl_id, sect1) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
+
+        /* Check to see if we should revive second section */
+        if(sect2->sect_info.state != H5FS_SECT_LIVE)
+            if(H5HF_sect_row_revive(hdr, dxpl_id, sect2) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
+
+        /* Merge rows' underlying indirect sections together */
+        if(H5HF_sect_indirect_merge_row(hdr, dxpl_id, sect1, sect2) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMERGE, FAIL, "can't merge underlying indirect sections")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_can_shrink
+ *
+ * Purpose:	Can this section shrink the container?
+ *
+ * Note:        This isn't actually shrinking the heap (since that's already
+ *              been done) as much as it's cleaning up _after_ the heap
+ *              shrink.
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF_sect_row_can_shrink(const H5FS_section_info_t *_sect, void H5_ATTR_UNUSED *_udata)
+{
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;   /* Fractal heap free section */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+
+    /* Check if section is past end of "next block" iterator */
+    if(sect->sect_info.addr >= hdr->man_iter_off)
+        HGOTO_DONE(TRUE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_can_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_shrink
+ *
+ * Purpose:	Shrink container with section
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_shrink(H5FS_section_info_t **_sect, void *_udata)
+{
+    H5HF_free_section_t **sect = (H5HF_free_section_t **)_sect;   /* Fractal heap free section */
+    H5HF_free_section_t *top_indir_sect; /* Top indirect section for row */
+    H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
+    H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
+    hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(*sect);
+    HDassert((*sect)->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+
+    /* Get the top indirect section underlying each row */
+    top_indir_sect = H5HF_sect_indirect_top((*sect)->u.row.under);
+
+    /* Shrink away underlying indirect section */
+    if(H5HF_sect_indirect_shrink(hdr, dxpl_id, top_indir_sect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't shrink underlying indirect section")
+
+    /* Indicate that the section has been released */
+    *sect = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_row_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_free_real
+ *
+ * Purpose:	Free a 'row' section node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_free_real(H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;               /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(sect);
+
+    /* Release the section */
+    if(H5HF_sect_node_free(sect, NULL) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5HF_sect_row_free_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_free
+ *
+ * Purpose:	Free a 'row' section node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_free(H5FS_section_info_t *_sect)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;   /* Pointer to section to free */
+    herr_t ret_value = SUCCEED;               /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(sect);
+    HDassert(sect->u.row.under);
+
+    /* Decrement the ref. count on the row section's underlying indirect section */
+    if(H5HF_sect_indirect_decr(sect->u.row.under) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't detach section node")
+
+    /* Release the section */
+    if(H5HF_sect_row_free_real(sect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5HF_sect_row_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_valid
+ *
+ * Purpose:	Check the validity of a section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, July 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_valid(const H5FS_section_class_t *cls, const H5FS_section_info_t *_sect)
+{
+    H5HF_sect_private_t *cls_prvt;    /* Pointer to class private info */
+    const H5HF_hdr_t *hdr;      /* Fractal heap header */
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;   /* Pointer to section to check */
+    const H5HF_free_section_t *indir_sect;   /* Pointer to underlying indirect section */
+    unsigned indir_idx;         /* Index of row in underlying indirect section's row array */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Basic sanity check */
+    HDassert(cls);
+    HDassert(sect);
+
+    /* Retrieve class private information */
+    cls_prvt = (H5HF_sect_private_t *)cls->cls_private;
+    hdr = cls_prvt->hdr;
+
+    /* Sanity checking on the row */
+    HDassert(sect->u.row.under);
+    HDassert(sect->u.row.num_entries);
+    HDassert(sect->u.row.checked_out == FALSE);
+    indir_sect = sect->u.row.under;
+    indir_idx = sect->u.row.row - indir_sect->u.indirect.row;
+    HDassert(indir_sect->u.indirect.dir_rows[indir_idx] == sect);
+
+    /* Check if the section is actually within the heap */
+    HDassert(sect->sect_info.addr < hdr->man_iter_off);
+
+    /* Different checking for different kinds of rows */
+    if(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW) {
+        H5HF_free_section_t *top_indir_sect;    /* Top indirect section for row */
+
+        /* Some extra sanity checks on the row */
+        HDassert(sect->u.row.row == indir_sect->u.indirect.row);
+
+        /* Get the top indirect section underlying row */
+        top_indir_sect = H5HF_sect_indirect_top(sect->u.row.under);
+
+        /* Check that the row's underlying indirect section is valid */
+        H5HF_sect_indirect_valid(hdr, top_indir_sect);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5HF_sect_row_valid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_row_debug
+ *
+ * Purpose:	Dump debugging information about an row free space section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 25, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_row_debug(const H5FS_section_info_t *_sect,
+    FILE *stream, int indent, int fwidth)
+{
+    const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect;       /* Section to dump info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Print indirect section information */
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Row:",
+	      sect->u.row.row);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Column:",
+	      sect->u.row.col);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of entries:",
+	      sect->u.row.num_entries);
+
+    /* If this is a first row section display information about underlying indirect section */
+    if(sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW) {
+        /* Print indirect section header */
+        HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth,
+                  "Underlying indirect section:");
+
+        H5HF_sect_indirect_debug(sect->u.row.under, stream, indent + 3, MAX(0, fwidth - 3));
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_sect_row_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_iblock_off
+ *
+ * Purpose:	Get the offset of the indirect block for the section
+ *
+ * Return:	Offset of indirect block in "heap space" (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5HF_sect_indirect_iblock_off(const H5HF_free_section_t *sect)
+{
+    hsize_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+
+    ret_value = sect->sect_info.state == H5FS_SECT_LIVE ?  sect->u.indirect.u.iblock->block_off : sect->u.indirect.u.iblock_off;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_iblock_off() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_top
+ *
+ * Purpose:	Get the "top" indirect section
+ *
+ * Return:	Pointer to the top indirect section (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_free_section_t *
+H5HF_sect_indirect_top(H5HF_free_section_t *sect)
+{
+    H5HF_free_section_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+
+    if(sect->u.indirect.parent)
+        ret_value = H5HF_sect_indirect_top(sect->u.indirect.parent);
+    else
+        ret_value = sect;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_top() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_init_cls
+ *
+ * Purpose:	Initialize the "indirect" class structure
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_init_cls(H5FS_section_class_t *cls, void *_udata)
+{
+    H5HF_hdr_t *hdr = (H5HF_hdr_t *)_udata; /* Fractal heap header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+    HDassert(hdr);
+
+    /* Call to common class initialization */
+    if(H5HF_sect_init_cls(cls, hdr) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize common section class")
+
+    /* Set the size of all serialized objects of this class of sections */
+    cls->serial_size = H5HF_SECT_INDIRECT_SERIAL_SIZE(hdr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_indirect_init_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_term_cls
+ *
+ * Purpose:	Terminate the "indirect" class structure
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_term_cls(H5FS_section_class_t *cls)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(cls);
+
+    /* Call common class termination */
+    if(H5HF_sect_term_cls(cls) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't terminate common section class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_indirect_term_cls() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_new
+ *
+ * Purpose:	Create a new 'indirect' section for other routines to finish
+ *              initializing.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_free_section_t *
+H5HF_sect_indirect_new(H5HF_hdr_t *hdr, haddr_t sect_off, hsize_t sect_size,
+    H5HF_indirect_t *iblock, hsize_t iblock_off, unsigned row, unsigned col,
+    unsigned nentries)
+{
+    H5HF_free_section_t *sect = NULL;   /* 'Indirect' free space section to add */
+    H5HF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(nentries);
+
+    /* Create free space section node */
+    if(NULL == (sect = H5HF_sect_node_new(H5HF_FSPACE_SECT_INDIRECT, sect_off,
+            sect_size, (iblock ? H5FS_SECT_LIVE : H5FS_SECT_SERIALIZED))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for indirect section")
+
+    /* Set the 'indirect' specific fields */
+    if(iblock) {
+        sect->u.indirect.u.iblock = iblock;
+        sect->u.indirect.iblock_entries = hdr->man_dtable.cparam.width *
+                sect->u.indirect.u.iblock->max_rows;
+        if(H5HF_iblock_incr(sect->u.indirect.u.iblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared indirect block")
+    } /* end if */
+    else {
+        sect->u.indirect.u.iblock_off = iblock_off;
+        sect->u.indirect.iblock_entries = 0;
+    } /* end else */
+    sect->u.indirect.row = row;
+    sect->u.indirect.col = col;
+    sect->u.indirect.num_entries = nentries;
+
+    /* Compute span size of indirect section */
+    sect->u.indirect.span_size = H5HF_dtable_span_size(&hdr->man_dtable,
+            row, col, nentries);
+    HDassert(sect->u.indirect.span_size > 0);
+
+    /* This indirect section doesn't (currently) have a parent */
+    sect->u.indirect.parent = NULL;
+    sect->u.indirect.par_entry = 0;
+
+    /* Set return value */
+    ret_value = sect;
+
+done:
+    if(!ret_value && sect) {
+        /* Release the section */
+        sect = H5FL_FREE(H5HF_free_section_t, sect);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_for_row
+ *
+ * Purpose:	Create the underlying indirect section for a new row section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_free_section_t *
+H5HF_sect_indirect_for_row(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock,
+    H5HF_free_section_t *row_sect)
+{
+    H5HF_free_section_t *sect = NULL;   /* 'Indirect' free space section to add */
+    H5HF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(iblock);
+    HDassert(row_sect);
+    HDassert(row_sect->u.row.row < hdr->man_dtable.max_direct_rows);
+
+    /* Create free space section node */
+    if(NULL == (sect = H5HF_sect_indirect_new(hdr, row_sect->sect_info.addr,
+            row_sect->sect_info.size, iblock, iblock->block_off,
+            row_sect->u.row.row, row_sect->u.row.col, row_sect->u.row.num_entries)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't create indirect section")
+
+    /* Set # of direct rows covered */
+    sect->u.indirect.dir_nrows = 1;
+
+    /* Allocate space for the derived row sections */
+    if(NULL == (sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *))))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "allocation failed for row section pointer array")
+
+    /* Atatch the new row section to indirect section */
+    sect->u.indirect.dir_rows[0] = row_sect;
+    sect->u.indirect.rc = 1;
+
+    /* No indirect rows in current section */
+    sect->u.indirect.indir_nents = 0;
+    sect->u.indirect.indir_ents = NULL;
+
+    /* Set return value */
+    ret_value = sect;
+
+done:
+    if(!ret_value && sect)
+        if(H5HF_sect_indirect_free(sect) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "can't free indirect section node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_for_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_init_rows
+ *
+ * Purpose:	Initialize the derived row sections for a newly created
+ *              indirect section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_init_rows(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, hbool_t first_child, H5HF_free_section_t **first_row_sect,
+    unsigned space_flags, unsigned start_row, unsigned start_col,
+    unsigned end_row, unsigned end_col)
+{
+    hsize_t curr_off;                   /* Offset of new section in "heap space" */
+    size_t dblock_overhead;             /* Direct block's overhead */
+    unsigned row_entries;               /* # of entries in row */
+    unsigned row_col;                   /* Column within current row */
+    unsigned curr_entry;                /* Current entry within indirect section */
+    unsigned curr_indir_entry;          /* Current indirect entry within indirect section */
+    unsigned curr_row;                  /* Current row within indirect section */
+    unsigned dir_nrows;                 /* # of direct rows in indirect section */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(sect->u.indirect.span_size > 0);
+
+    /* Reset reference count for indirect section */
+    /* (Also reset the direct & indirect row pointers */
+    sect->u.indirect.rc = 0;
+    sect->u.indirect.dir_rows = NULL;
+    sect->u.indirect.indir_ents = NULL;
+
+    /* Set up direct block information, if necessary */
+    if(start_row < hdr->man_dtable.max_direct_rows) {
+        unsigned max_direct_row;            /* Max. direct row covered */
+
+        /* Compute max. direct row covered by indirect section */
+        max_direct_row = MIN(end_row, (hdr->man_dtable.max_direct_rows - 1));
+
+        /* Compute # of direct rows covered */
+        dir_nrows = (max_direct_row - start_row) + 1;
+
+        /* Don't set the of direct rows in section yet, so sanity
+         * checking works (enabled in free section manager, with H5FS_DEBUG
+         * macro) correctly.
+         */
+        sect->u.indirect.dir_nrows = 0;
+
+        /* Allocate space for the derived row sections */
+        if(NULL == (sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *) * dir_nrows)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "allocation failed for row section pointer array")
+    } /* end if */
+    else {
+        /* No rows of direct blocks covered, reset direct row information */
+        dir_nrows = 0;
+        sect->u.indirect.dir_nrows = 0;
+    } /* end else */
+
+    /* Set up indirect block information, if necessary */
+    if(end_row >= hdr->man_dtable.max_direct_rows) {
+        unsigned indirect_start_row;    /* Row to start indirect entries on */
+        unsigned indirect_start_col;    /* Column to start indirect entries on */
+        unsigned indirect_start_entry;  /* Index of starting indirect entry */
+        unsigned indirect_end_entry;    /* Index of ending indirect entry */
+
+        /* Compute starting indirect entry */
+        if(start_row < hdr->man_dtable.max_direct_rows) {
+            indirect_start_row = hdr->man_dtable.max_direct_rows;
+            indirect_start_col = 0;
+        } /* end if */
+        else {
+            indirect_start_row = start_row;
+            indirect_start_col = start_col;
+        } /* end else */
+        indirect_start_entry = (indirect_start_row * hdr->man_dtable.cparam.width)
+            + indirect_start_col;
+
+        /* Compute ending indirect entry */
+        indirect_end_entry = (end_row * hdr->man_dtable.cparam.width) + end_col;
+
+        /* Compute # of indirect entries covered */
+        sect->u.indirect.indir_nents = (indirect_end_entry - indirect_start_entry) + 1;
+
+        /* Allocate space for the child indirect sections */
+        if(NULL == (sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *) * sect->u.indirect.indir_nents)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "allocation failed for indirect section pointer array")
+    } /* end if */
+    else {
+        /* No indirect block entries covered, reset indirect row information */
+        sect->u.indirect.indir_nents = 0;
+    } /* end else */
+
+    /* Set up initial row information */
+    if(start_row == end_row)
+        row_entries = (end_col - start_col) + 1;
+    else
+        row_entries = hdr->man_dtable.cparam.width - start_col;
+    row_col = start_col;
+
+    /* Loop over creating the sections covered by this indirect section */
+    curr_off = sect->sect_info.addr;
+    curr_entry = (start_row * hdr->man_dtable.cparam.width) + start_col;
+    curr_row = 0;
+    curr_indir_entry = 0;
+    dblock_overhead = H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
+    for(u = start_row; u <= end_row; u++, curr_row++) {
+        if(u < hdr->man_dtable.max_direct_rows) {
+            H5HF_free_section_t *row_sect = NULL;   /* 'Row' free space section to add */
+
+            /* Create 'row' free space section node */
+            if(NULL == (row_sect = H5HF_sect_row_create(curr_off,
+                    (hdr->man_dtable.row_block_size[u] - dblock_overhead), first_child, u, row_col,
+                    row_entries, sect)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "creation failed for child row section")
+
+            /* Add new row section to array for indirect section */
+            sect->u.indirect.dir_rows[curr_row] = row_sect;
+
+            /* Check to see if we should grab the first row section instead of adding it immediately */
+            if(first_row_sect)
+                *first_row_sect = row_sect;
+            else {
+                /* Add new row section to free space manager for the heap */
+                if(H5HF_space_add(hdr, dxpl_id, row_sect, space_flags) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add row section to free space")
+            } /* end else */
+
+            /* Increment reference count for underlying indirect section */
+            sect->u.indirect.rc++;
+
+            /* Advance the offset to the next section */
+            curr_off += row_entries * hdr->man_dtable.row_block_size[u];
+
+            /* Advance the current entry to the next row*/
+            curr_entry += row_entries;
+
+            /* Reset the 'first child' parameters */
+            first_child = FALSE;
+            first_row_sect = NULL;
+        } /* end if */
+        else {
+            H5HF_indirect_t *child_iblock;      /* Child indirect block */
+            H5HF_free_section_t *child_sect;    /* Child 'indirect' section to add */
+            unsigned child_nrows;               /* Number of child rows in indirect blocks for this row */
+            unsigned child_nentries;            /* Number of child entries in indirect blocks for this row */
+            unsigned v;         /* Local index variable */
+
+            /* Compute info about row's indirect blocks for child section */
+            child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, hdr->man_dtable.row_block_size[u]);
+            child_nentries = child_nrows * hdr->man_dtable.cparam.width;
+
+            /* Add an indirect section for each indirect block in the row */
+            for(v = 0; v < row_entries; v++) {
+                hbool_t did_protect;            /* Whether we protected the indirect block or not */
+
+                /* Try to get the child section's indirect block, if it's available */
+                if(sect->sect_info.state == H5FS_SECT_LIVE) {
+                    haddr_t child_iblock_addr;          /* Child indirect block's address on disk */
+
+                    /* Get the address of the child indirect block */
+                    if(H5HF_man_iblock_entry_addr(sect->u.indirect.u.iblock, curr_entry, &child_iblock_addr) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to retrieve child indirect block's address")
+
+                    /* If the child indirect block's address is defined, protect it */
+                    if(H5F_addr_defined(child_iblock_addr)) {
+                        if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, child_iblock_addr, child_nrows, sect->u.indirect.u.iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect)))
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
+                    } /* end if */
+                    else
+                        child_iblock = NULL;
+                } /* end if */
+                else
+                    child_iblock = NULL;
+
+                /* Create free space section node */
+                if(NULL == (child_sect = H5HF_sect_indirect_new(hdr, curr_off, (hsize_t)0,
+                        child_iblock, curr_off, 0, 0, child_nentries)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section")
+
+                /* Initialize rows for new indirect section */
+                if(H5HF_sect_indirect_init_rows(hdr, dxpl_id, child_sect,
+                        first_child, first_row_sect, space_flags, 0, 0,
+                        (child_nrows - 1), (hdr->man_dtable.cparam.width - 1)) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize indirect section")
+
+                /* If we have a valid child indirect block, release it now */
+                /* (will be pinned, if rows reference it) */
+                if(child_iblock)
+                    if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
+                /* Attach child section to this section */
+                child_sect->u.indirect.parent = sect;
+                child_sect->u.indirect.par_entry = curr_entry;
+                sect->u.indirect.indir_ents[curr_indir_entry] = child_sect;
+                sect->u.indirect.rc++;
+
+                /* Advance the offset for the next section */
+                curr_off += hdr->man_dtable.row_block_size[u];
+
+                /* Advance to the next entry */
+                curr_entry++;
+                curr_indir_entry++;
+
+                /* Reset the 'first child' parameters */
+                first_child = FALSE;
+                first_row_sect = NULL;
+            } /* end for */
+        } /* end else */
+
+        /* Compute the # of entries for the next row */
+        if(u < (end_row - 1))
+            row_entries = hdr->man_dtable.cparam.width;
+        else
+            row_entries = end_col + 1;
+
+        /* Reset column for all other rows */
+        row_col = 0;
+    } /* end for */
+
+    /* Set the final # of direct rows in section */
+    sect->u.indirect.dir_nrows = dir_nrows;
+
+    /* Make certain we've tracked the section's dependents correctly */
+    HDassert(sect->u.indirect.rc ==
+            (sect->u.indirect.indir_nents + sect->u.indirect.dir_nrows));
+
+done:
+    if(ret_value < 0) {
+        if(sect->u.indirect.indir_ents)
+            H5MM_xfree(sect->u.indirect.indir_ents);
+        if(sect->u.indirect.dir_rows)
+            H5MM_xfree(sect->u.indirect.dir_rows);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_init_rows() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_add
+ *
+ * Purpose:	Add a new 'indirect' section to the free space manager for this
+ *              heap
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  3 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_sect_indirect_add(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, unsigned start_entry, unsigned nentries)
+{
+    H5HF_free_section_t *sect = NULL;   /* 'Indirect' free space section to add */
+    H5HF_free_section_t *first_row_sect = NULL;   /* First row section in new indirect section */
+    hsize_t sect_off;                   /* Offset of section in heap space */
+    unsigned start_row;                 /* Start row in indirect block */
+    unsigned start_col;                 /* Start column in indirect block */
+    unsigned end_entry;                 /* End entry in indirect block */
+    unsigned end_row;                   /* End row in indirect block */
+    unsigned end_col;                   /* End column in indirect block */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(iblock);
+    HDassert(nentries);
+
+    /* Compute starting column & row */
+    start_row = start_entry / hdr->man_dtable.cparam.width;
+    start_col = start_entry % hdr->man_dtable.cparam.width;
+
+    /* Compute end column & row */
+    end_entry = (start_entry + nentries) - 1;
+    end_row = end_entry / hdr->man_dtable.cparam.width;
+    end_col = end_entry % hdr->man_dtable.cparam.width;
+
+    /* Initialize information for rows skipped over */
+    sect_off = iblock->block_off;
+    for(u = 0; u < start_row; u++)
+        sect_off += hdr->man_dtable.row_block_size[u] * hdr->man_dtable.cparam.width;
+    sect_off += hdr->man_dtable.row_block_size[start_row] * start_col;
+
+    /* Create free space section node */
+    if(NULL == (sect = H5HF_sect_indirect_new(hdr, sect_off, (hsize_t)0, iblock,
+            iblock->block_off, start_row, start_col, nentries)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section")
+
+    /* Initialize rows for new indirect section */
+    if(H5HF_sect_indirect_init_rows(hdr, dxpl_id, sect, TRUE, &first_row_sect,
+            H5FS_ADD_SKIP_VALID, start_row, start_col, end_row, end_col) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize indirect section")
+    HDassert(first_row_sect);
+
+    /* Now that underlying indirect section is consistent, add first row
+     *  section to free space manager for the heap
+     */
+    if(H5HF_space_add(hdr, dxpl_id, first_row_sect, H5FS_ADD_RETURNED_SPACE) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add row section to free space")
+
+done:
+    if(ret_value < 0 && sect)
+        if(H5HF_sect_indirect_free(sect) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_decr
+ *
+ * Purpose:	Decrement ref. count on indirect section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_decr(H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(sect->u.indirect.rc);
+
+    /* Decrement ref. count for indirect section */
+    sect->u.indirect.rc--;
+
+    /* If the indirect section's ref. count drops to zero, free the section */
+    if(sect->u.indirect.rc == 0) {
+        H5HF_free_section_t *par_sect;          /* Parent indirect section */
+
+        /* Preserve pointer to parent indirect section when freeing this section */
+        par_sect = sect->u.indirect.parent;
+
+        /* Free indirect section */
+        if(H5HF_sect_indirect_free(sect) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+
+        /* Decrement ref. count on indirect section's parent */
+        if(par_sect)
+            if(H5HF_sect_indirect_decr(par_sect) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't decrement ref. count on parent indirect section")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_revive_row
+ *
+ * Purpose:	Update the memory information for a 'indirect' free section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  3 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_revive_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect)
+{
+    H5HF_indirect_t *sec_iblock;        /* Pointer to section indirect block */
+    hbool_t did_protect;                /* Whether we protected the indirect block or not */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED);
+
+    /* Look up indirect block containing indirect blocks for section */
+    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, NULL, &did_protect, H5AC_READ) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
+
+    /* Increment reference count on indirect block that free section is in */
+    if(H5HF_iblock_incr(sec_iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    /* Set the pointer to the section's indirect block */
+    sect->u.indirect.u.iblock = sec_iblock;
+
+    /* Set the number of entries in the indirect block */
+    sect->u.indirect.iblock_entries = hdr->man_dtable.cparam.width *
+            sect->u.indirect.u.iblock->max_rows;
+
+    /* Unlock indirect block */
+    if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+    sec_iblock = NULL;
+
+    /* Section is "live" now */
+    sect->sect_info.state = H5FS_SECT_LIVE;
+
+    /* Loop over derived row sections and mark them all as 'live' now */
+    for(u = 0; u < sect->u.indirect.dir_nrows; u++)
+        sect->u.indirect.dir_rows[u]->sect_info.state = H5FS_SECT_LIVE;
+
+    /* Revive parent indirect section, if there is one */
+    if(sect->u.indirect.parent && sect->u.indirect.parent->sect_info.state == H5FS_SECT_SERIALIZED)
+        if(H5HF_sect_indirect_revive(hdr, dxpl_id, sect->u.indirect.parent, sect->u.indirect.u.iblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREVIVE, FAIL, "can't revive indirect section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_revive_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_revive
+ *
+ * Purpose:	Update the memory information for a 'indirect' free section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *sect, H5HF_indirect_t *sect_iblock)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED);
+    HDassert(sect_iblock);
+
+    /* Increment reference count on indirect block that free section is in */
+    if(H5HF_iblock_incr(sect_iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block")
+
+    /* Set the pointer to the section's indirect block */
+    sect->u.indirect.u.iblock = sect_iblock;
+
+    /* Set the number of entries in the indirect block */
+    sect->u.indirect.iblock_entries = hdr->man_dtable.cparam.width *
+            sect->u.indirect.u.iblock->max_rows;
+
+    /* Section is "live" now */
+    sect->sect_info.state = H5FS_SECT_LIVE;
+
+    /* Loop over derived row sections and mark them all as 'live' now */
+    for(u = 0; u < sect->u.indirect.dir_nrows; u++)
+        sect->u.indirect.dir_rows[u]->sect_info.state = H5FS_SECT_LIVE;
+
+    /* Revive parent indirect section, if there is one */
+    if(sect->u.indirect.parent && sect->u.indirect.parent->sect_info.state == H5FS_SECT_SERIALIZED)
+        if(H5HF_sect_indirect_revive(hdr, dxpl_id, sect->u.indirect.parent, sect->u.indirect.u.iblock->parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTREVIVE, FAIL, "can't revive indirect section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_revive() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_reduce_row
+ *
+ * Purpose:	Remove a block from an indirect section (possibly freeing it)
+ *              and re-add it back to the free space manager for the heap
+ *              (if it hasn't been freed)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_reduce_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *row_sect,
+    hbool_t *alloc_from_start)
+{
+    H5HF_free_section_t *sect;          /* Indirect section underlying row section */
+    unsigned row_start_entry;           /* Entry for first block covered in row section */
+    unsigned row_end_entry;             /* Entry for last block covered in row section */
+    unsigned row_entry;                 /* Entry to allocate in row section */
+    unsigned start_entry;               /* Entry for first block covered */
+    unsigned start_row;                 /* Start row in indirect block */
+    unsigned start_col;                 /* Start column in indirect block */
+    unsigned end_entry;                 /* Entry for last block covered */
+    unsigned end_row;                   /* End row in indirect block */
+    H5HF_free_section_t *peer_sect = NULL; /* Peer indirect section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(row_sect);
+
+    /* Compute starting & ending information for row section */
+    row_start_entry = (row_sect->u.row.row * hdr->man_dtable.cparam.width) + row_sect->u.row.col;
+    row_end_entry = (row_start_entry + row_sect->u.row.num_entries) - 1;
+
+    /* Compute starting & ending information for indirect section */
+    sect = row_sect->u.row.under;
+    start_row = sect->u.indirect.row;
+    start_col = sect->u.indirect.col;
+    start_entry = (start_row * hdr->man_dtable.cparam.width) + start_col;
+    end_entry = (start_entry + sect->u.indirect.num_entries) - 1;
+    end_row = end_entry / hdr->man_dtable.cparam.width;
+
+    /* Additional sanity check */
+    HDassert(sect->u.indirect.span_size > 0);
+    HDassert(sect->u.indirect.iblock_entries > 0);
+    HDassert(sect->u.indirect.dir_nrows > 0);
+    HDassert(sect->u.indirect.dir_rows);
+    HDassert(sect->u.indirect.dir_rows[(row_sect->u.row.row - start_row)] == row_sect);
+
+    /* Check if we should allocate from end of indirect section */
+    if(row_end_entry == end_entry && start_row != end_row) {
+        *alloc_from_start = FALSE;
+        row_entry = row_end_entry;
+    } /* end if */
+    else {
+        *alloc_from_start = TRUE;
+        row_entry = row_start_entry;
+    } /* end else */
+
+    /* Check if we have a parent section to be detached from */
+    if(sect->u.indirect.parent) {
+        hbool_t is_first;       /* Flag to indicate that this section is the first section in hierarchy */
+
+        /* Check if this section is the first section */
+        is_first = H5HF_sect_indirect_is_first(sect);
+
+        /* Remove this indirect section from parent indirect section */
+        if(H5HF_sect_indirect_reduce(hdr, dxpl_id, sect->u.indirect.parent, sect->u.indirect.par_entry) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce parent indirect section")
+        sect->u.indirect.parent = NULL;
+        sect->u.indirect.par_entry = 0;
+
+        /* If we weren't the first section, set "first row" for this indirect section */
+        if(!is_first)
+            if(H5HF_sect_indirect_first(hdr, dxpl_id, sect) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for indirect section")
+    } /* end if */
+
+    /* Adjust indirect section's span size */
+    sect->u.indirect.span_size -= row_sect->sect_info.size;
+
+    /* Check how to adjust section for allocated entry */
+    if(sect->u.indirect.num_entries > 1) {
+        if(row_entry == start_entry) {
+            /* Adjust section start */
+            sect->sect_info.addr += hdr->man_dtable.row_block_size[sect->u.indirect.row];
+
+            /* Adjust block coordinates of span */
+            sect->u.indirect.col++;
+            if(sect->u.indirect.col == hdr->man_dtable.cparam.width) {
+                HDassert(row_sect->u.row.num_entries == 1);
+
+                /* Adjust section's span information */
+                sect->u.indirect.row++;
+                sect->u.indirect.col = 0;
+
+                /* Adjust direct row information */
+                sect->u.indirect.dir_nrows--;
+
+                /* Adjust direct row sections for indirect section */
+                if(sect->u.indirect.dir_nrows > 0) {
+                    HDassert(sect->u.indirect.dir_rows);
+                    HDmemmove(&sect->u.indirect.dir_rows[0],
+                            &sect->u.indirect.dir_rows[1],
+                            sect->u.indirect.dir_nrows * sizeof(H5HF_free_section_t *));
+                    HDassert(sect->u.indirect.dir_rows[0]);
+
+                    /* Make new "first row" in indirect section */
+                    if(row_sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW)
+                        if(H5HF_sect_row_first(hdr, dxpl_id, sect->u.indirect.dir_rows[0]) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for indirect section")
+                } /* end if */
+                else {
+                    /* Sanity check */
+                    HDassert(sect->u.indirect.indir_nents > 0);
+                    HDassert(sect->u.indirect.indir_ents);
+
+                    /* Eliminate direct rows for this section */
+                    sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.dir_rows);
+
+                    /* Make new "first row" in indirect section */
+                    if(row_sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW)
+                        if(H5HF_sect_indirect_first(hdr, dxpl_id, sect->u.indirect.indir_ents[0]) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for child indirect section")
+                } /* end else */
+            } /* end if */
+
+            /* Adjust number of entries covered */
+            sect->u.indirect.num_entries--;
+        } /* end if */
+        else if(row_entry == end_entry) {
+            unsigned new_end_row;       /* New end row for entries */
+
+            /* Sanity check */
+            HDassert(sect->u.indirect.indir_nents == 0);
+            HDassert(sect->u.indirect.indir_ents == NULL);
+
+            /* Adjust number of entries covered */
+            sect->u.indirect.num_entries--;
+
+            /* Check for eliminating a direct row */
+            new_end_row = ((start_entry + sect->u.indirect.num_entries) - 1) / hdr->man_dtable.cparam.width;
+            HDassert(new_end_row <= end_row);
+            if(new_end_row < end_row) {
+                HDassert(new_end_row == (end_row - 1));
+                sect->u.indirect.dir_nrows--;
+            } /* end if */
+        } /* end if */
+        else {
+            H5HF_indirect_t *iblock;    /* Pointer to indirect block for this section */
+            hsize_t iblock_off;         /* Section's indirect block's offset in "heap space" */
+            unsigned peer_nentries;     /* Number of entries in new peer indirect section */
+            unsigned peer_dir_nrows;    /* Number of direct rows in new peer indirect section */
+            unsigned new_start_row;     /* New starting row for current indirect section */
+            unsigned u;                 /* Local index variable */
+
+            /* Sanity checks */
+            HDassert(row_sect->u.row.col == 0);
+            HDassert(row_sect->u.row.row > 0);
+            HDassert(row_sect->u.row.row < hdr->man_dtable.max_direct_rows);
+            HDassert(row_sect->u.row.num_entries == hdr->man_dtable.cparam.width);
+            HDassert(row_sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+
+            /* Compute basic information about peer & current indirect sections */
+            new_start_row = row_sect->u.row.row;
+            peer_nentries = row_entry - start_entry;
+            peer_dir_nrows = new_start_row - start_row;
+
+            /* Get indirect block information for peer */
+            if(sect->sect_info.state == H5FS_SECT_LIVE) {
+                iblock = sect->u.indirect.u.iblock;
+                iblock_off = sect->u.indirect.u.iblock->block_off;
+            } /* end if */
+            else {
+                iblock = NULL;
+                iblock_off = sect->u.indirect.u.iblock_off;
+            } /* end else */
+
+            /* Create peer indirect section */
+            if(NULL == (peer_sect = H5HF_sect_indirect_new(hdr, sect->sect_info.addr,
+                    sect->sect_info.size, iblock, iblock_off, start_row, start_col,
+                    peer_nentries)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section")
+
+            /* Set up direct row & indirect entry information for peer section */
+            peer_sect->u.indirect.indir_nents = 0;
+            peer_sect->u.indirect.indir_ents = NULL;
+            peer_sect->u.indirect.dir_nrows = peer_dir_nrows;
+            if(NULL == (peer_sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *) * peer_dir_nrows)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "allocation failed for row section pointer array")
+
+            /* Transfer row sections between current & peer sections */
+            HDmemcpy(&peer_sect->u.indirect.dir_rows[0],
+                &sect->u.indirect.dir_rows[0],
+                (sizeof(H5HF_free_section_t *) * peer_dir_nrows));
+            HDmemmove(&sect->u.indirect.dir_rows[0],
+                &sect->u.indirect.dir_rows[peer_dir_nrows],
+                (sizeof(H5HF_free_section_t *) * (sect->u.indirect.dir_nrows - peer_dir_nrows)));
+            sect->u.indirect.dir_nrows -= peer_dir_nrows;
+            HDassert(row_sect == sect->u.indirect.dir_rows[0]);
+
+            /* Re-target transferred row sections to point to new underlying indirect section */
+            for(u = 0; u < peer_dir_nrows; u++)
+                peer_sect->u.indirect.dir_rows[u]->u.row.under = peer_sect;
+
+            /* Change first row section in indirect section to be the "first row" */
+            /* (But we don't have to tell the free space manager about it,
+             *  because the row section is "checked out" from the free space
+             * manager currently.
+             */
+            row_sect->sect_info.type = H5HF_FSPACE_SECT_FIRST_ROW;
+
+            /* Adjust reference counts for current & peer sections */
+            peer_sect->u.indirect.rc = peer_dir_nrows;
+            sect->u.indirect.rc -= peer_dir_nrows;
+
+            /* Transfer/update cached information about indirect block */
+            peer_sect->u.indirect.iblock_entries = sect->u.indirect.iblock_entries;
+            peer_sect->u.indirect.span_size = row_sect->sect_info.addr - peer_sect->sect_info.addr;
+
+            /* Update information for current section */
+            sect->sect_info.addr = row_sect->sect_info.addr + hdr->man_dtable.row_block_size[new_start_row];
+            sect->u.indirect.span_size -= peer_sect->u.indirect.span_size; /* (span for row section has already been removed) */
+            sect->u.indirect.row = new_start_row;
+            sect->u.indirect.col = row_sect->u.row.col + 1;
+            sect->u.indirect.num_entries -= (peer_nentries + 1); /* Transferred entries, plus the entry allocated out of the row */
+
+            /* Make certain we've tracked the sections' dependents correctly */
+            HDassert(sect->u.indirect.rc ==
+                    (sect->u.indirect.indir_nents + sect->u.indirect.dir_nrows));
+            HDassert(peer_sect->u.indirect.rc ==
+                    (peer_sect->u.indirect.indir_nents + peer_sect->u.indirect.dir_nrows));
+
+            /* Reset the peer_sect variable, to indicate that it has been hooked into the data structures correctly and shouldn't be freed */
+            peer_sect = NULL;
+        } /* end else */
+    } /* end if */
+    else {
+        /* Decrement count of entries & rows */
+        sect->u.indirect.num_entries--;
+        sect->u.indirect.dir_nrows--;
+        HDassert(sect->u.indirect.dir_nrows == 0);
+
+        /* Eliminate direct rows for this section */
+        sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.dir_rows);
+    } /* end else */
+
+done:
+    /* Free allocated peer_sect.  Note that this is necessary for all failures until peer_sect is linked
+     * into the main free space structures (via the direct blocks), and the reference count is updated. */
+    if(peer_sect) {
+        /* Sanity check - we should only be here if an error occurred */
+        HDassert(ret_value < 0);
+
+        if(H5HF_sect_indirect_free(peer_sect) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_reduce_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_reduce
+ *
+ * Purpose:	Reduce the size of a indirect section (possibly freeing it)
+ *              and re-add it back to the free space manager for the heap
+ *              (if it hasn't been freed)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect,
+    unsigned child_entry)
+{
+    unsigned start_entry;               /* Entry for first block covered */
+    unsigned start_row;                 /* Start row in indirect block */
+    unsigned start_col;                 /* Start column in indirect block */
+    unsigned end_entry;                 /* Entry for last block covered */
+    unsigned end_row;                   /* End row in indirect block */
+    H5HF_free_section_t *peer_sect = NULL; /* Peer indirect section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->u.indirect.span_size > 0);
+    HDassert(sect->u.indirect.iblock_entries > 0);
+
+    /* Compute starting & ending information for indirect section */
+    start_row = sect->u.indirect.row;
+    start_col = sect->u.indirect.col;
+    start_entry = (start_row * hdr->man_dtable.cparam.width) + start_col;
+    end_entry = (start_entry + sect->u.indirect.num_entries) - 1;
+    end_row = end_entry / hdr->man_dtable.cparam.width;
+
+    /* Check how to adjust section for allocated entry */
+    if(sect->u.indirect.num_entries > 1) {
+        /* Check if we have a parent section to be detached from */
+        if(sect->u.indirect.parent) {
+            hbool_t is_first;       /* Flag to indicate that this section is the first section in hierarchy */
+
+            /* Check if this section is the first section */
+            is_first = H5HF_sect_indirect_is_first(sect);
+
+            /* Reduce parent indirect section */
+            if(H5HF_sect_indirect_reduce(hdr, dxpl_id, sect->u.indirect.parent, sect->u.indirect.par_entry) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTSHRINK, FAIL, "can't reduce parent indirect section")
+            sect->u.indirect.parent = NULL;
+            sect->u.indirect.par_entry = 0;
+
+            /* If we weren't the first section, set "first row" for this indirect section */
+            if(!is_first)
+                if(H5HF_sect_indirect_first(hdr, dxpl_id, sect) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for indirect section")
+        } /* end if */
+
+        /* Check if we can allocate from start of indirect section */
+        if(child_entry == start_entry) {
+            /* Sanity check */
+            HDassert(sect->u.indirect.dir_nrows == 0);
+            HDassert(sect->u.indirect.dir_rows == NULL);
+            HDassert(sect->u.indirect.indir_nents > 0);
+            HDassert(sect->u.indirect.indir_ents);
+
+            /* Adjust section start */
+            sect->sect_info.addr += hdr->man_dtable.row_block_size[start_row];
+
+            /* Adjust span of blocks covered */
+            sect->u.indirect.col++;
+            if(sect->u.indirect.col == hdr->man_dtable.cparam.width) {
+                sect->u.indirect.row++;
+                sect->u.indirect.col = 0;
+            } /* end if */
+            sect->u.indirect.num_entries--;
+            sect->u.indirect.span_size -= hdr->man_dtable.row_block_size[start_row];
+
+            /* Adjust indirect entry information */
+            sect->u.indirect.indir_nents--;
+            HDmemmove(&sect->u.indirect.indir_ents[0],
+                    &sect->u.indirect.indir_ents[1],
+                    sect->u.indirect.indir_nents * sizeof(H5HF_free_section_t *));
+            HDassert(sect->u.indirect.indir_ents[0]);
+
+            /* Make new "first row" in new first indirect child section */
+            if(H5HF_sect_indirect_first(hdr, dxpl_id, sect->u.indirect.indir_ents[0]) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for child indirect section")
+        } /* end if */
+        else if(child_entry == end_entry) {
+            /* Sanity check */
+            HDassert(sect->u.indirect.indir_nents > 0);
+            HDassert(sect->u.indirect.indir_ents);
+
+            /* Adjust span of blocks covered */
+            sect->u.indirect.num_entries--;
+            sect->u.indirect.span_size -= hdr->man_dtable.row_block_size[end_row];
+
+            /* Adjust indirect entry information */
+            sect->u.indirect.indir_nents--;
+            if(sect->u.indirect.indir_nents == 0)
+                sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.indir_ents);
+        } /* end if */
+        else {
+            H5HF_indirect_t *iblock;    /* Pointer to indirect block for this section */
+            hsize_t iblock_off;         /* Section's indirect block's offset in "heap space" */
+            haddr_t peer_sect_addr;     /* Address of new peer section in "heap space" */
+            unsigned peer_nentries;     /* Number of entries in new peer indirect section */
+            unsigned peer_start_row;    /* Starting row for new peer indirect section */
+            unsigned peer_start_col;    /* Starting column for new peer indirect section */
+            unsigned child_row;         /* Row where child entry is located */
+            unsigned new_nentries;      /* New number of entries for current indirect section */
+            unsigned u;                 /* Local index variable */
+
+            /* Sanity check */
+            HDassert(sect->u.indirect.indir_nents > 0);
+            HDassert(sect->u.indirect.indir_ents);
+
+            /* Compute basic information about peer & current indirect sections */
+            peer_nentries = end_entry - child_entry;
+            peer_start_row = (child_entry + 1) / hdr->man_dtable.cparam.width;
+            peer_start_col = (child_entry + 1) % hdr->man_dtable.cparam.width;
+            child_row = child_entry / hdr->man_dtable.cparam.width;
+            new_nentries = sect->u.indirect.num_entries - (peer_nentries + 1);
+            HDassert(child_row >= hdr->man_dtable.max_direct_rows);
+
+            /* Get indirect block information for peer */
+            if(sect->sect_info.state == H5FS_SECT_LIVE) {
+                iblock = sect->u.indirect.u.iblock;
+                iblock_off = sect->u.indirect.u.iblock->block_off;
+            } /* end if */
+            else {
+                iblock = NULL;
+                iblock_off = sect->u.indirect.u.iblock_off;
+            } /* end else */
+
+            /* Update the number of entries in current section & calculate it's span size */
+            /* (Will use this to compute the section address for the peer section */
+            sect->u.indirect.num_entries = new_nentries;
+            sect->u.indirect.span_size = H5HF_dtable_span_size(&hdr->man_dtable,
+                    sect->u.indirect.row, sect->u.indirect.col, new_nentries);
+            HDassert(sect->u.indirect.span_size > 0);
+
+            /* Compute address of peer indirect section */
+            peer_sect_addr = sect->sect_info.addr;
+            peer_sect_addr += sect->u.indirect.span_size;
+            peer_sect_addr += hdr->man_dtable.row_block_size[child_row];
+
+            /* Create peer indirect section */
+            if(NULL == (peer_sect = H5HF_sect_indirect_new(hdr, peer_sect_addr,
+                    sect->sect_info.size, iblock, iblock_off, peer_start_row,
+                    peer_start_col, peer_nentries)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section")
+
+            /* Set up direct row & indirect entry information for peer section */
+            peer_sect->u.indirect.dir_nrows = 0;
+            peer_sect->u.indirect.dir_rows = NULL;
+            peer_sect->u.indirect.indir_nents = peer_nentries;
+            if(NULL == (peer_sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *) * peer_nentries)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "allocation failed for indirect section pointer array")
+
+            /* Transfer child indirect sections between current & peer sections */
+            HDmemcpy(&peer_sect->u.indirect.indir_ents[0],
+                &sect->u.indirect.indir_ents[sect->u.indirect.indir_nents - peer_nentries],
+                (sizeof(H5HF_free_section_t *) * peer_nentries));
+            sect->u.indirect.indir_nents -= (peer_nentries + 1); /* Transferred blocks, plus child entry */
+
+            /* Eliminate indirect entries for this section, if appropriate */
+            if(sect->u.indirect.indir_nents == 0)
+                sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.indir_ents);
+
+            /* Re-target transferred row sections to point to new underlying indirect section */
+            for(u = 0; u < peer_nentries; u++)
+                peer_sect->u.indirect.indir_ents[u]->u.indirect.parent = peer_sect;
+
+            /* Adjust reference counts for current & peer sections */
+            peer_sect->u.indirect.rc = peer_nentries;
+            sect->u.indirect.rc -= peer_nentries;
+
+            /* Transfer cached information about indirect block */
+            peer_sect->u.indirect.iblock_entries = sect->u.indirect.iblock_entries;
+
+            /* Make certain we've tracked the sections' dependents correctly */
+            /* (Note modified on current section's ref. count, since we haven't
+             *  detached the child section yet)
+             */
+            HDassert((sect->u.indirect.rc - 1) ==
+                    (sect->u.indirect.indir_nents + sect->u.indirect.dir_nrows));
+            HDassert(peer_sect->u.indirect.rc ==
+                    (peer_sect->u.indirect.indir_nents + peer_sect->u.indirect.dir_nrows));
+
+            /* Make new "first row" in peer section */
+            if(H5HF_sect_indirect_first(hdr, dxpl_id, peer_sect->u.indirect.indir_ents[0]) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't make new 'first row' for peer indirect section")
+
+            /* Reset the peer_sect variable, to indicate that it has been hooked into the data structures correctly and shouldn't be freed */
+            peer_sect = NULL;
+        } /* end else */
+    } /* end if */
+    else {
+        /* Decrement count of entries & indirect entries */
+        sect->u.indirect.num_entries--;
+        sect->u.indirect.indir_nents--;
+        HDassert(sect->u.indirect.indir_nents == 0);
+
+        /* Eliminate indirect entries for this section */
+        sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.indir_ents);
+    } /* end else */
+
+    /* Decrement # of sections which depend on this row */
+    /* (Must be last as section can be freed) */
+    if(H5HF_sect_indirect_decr(sect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't decrement section's ref. count ")
+
+done:
+    /* Free allocated peer_sect.  Note that this is necessary for all failures until peer_sect is linked
+     * into the main free space structures (via the direct blocks), and the reference count is updated. */
+    if(peer_sect) {
+        /* Sanity check - we should only be here if an error occurred */
+        HDassert(ret_value < 0);
+
+        if(H5HF_sect_indirect_free(peer_sect) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_reduce() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_is_first
+ *
+ * Purpose:	Check if indirect section is first in all parents
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/<can't fail>
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5HF_sect_indirect_is_first(H5HF_free_section_t *sect)
+{
+    hbool_t ret_value = FALSE;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(sect);
+
+    /* Recurse to parent */
+    if(sect->u.indirect.parent) {
+        if(sect->sect_info.addr == sect->u.indirect.parent->sect_info.addr)
+            ret_value = H5HF_sect_indirect_is_first(sect->u.indirect.parent);
+    } /* end if */
+    else
+        ret_value = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_is_first() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_first
+ *
+ * Purpose:	Make new 'first row' for indirect section
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_first(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(sect);
+
+    /* Check if this indirect section has direct block rows */
+    if(sect->u.indirect.dir_nrows > 0) {
+        /* Sanity checks */
+        HDassert(sect->u.indirect.row == 0);
+        HDassert(sect->u.indirect.col == 0);
+        HDassert(sect->u.indirect.dir_rows);
+        HDassert(sect->u.indirect.dir_rows[0]);
+
+        /* Change first row section in indirect section to be the "first row" */
+        if(H5HF_sect_row_first(hdr, dxpl_id, sect->u.indirect.dir_rows[0]) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "can't set row section to be first row")
+    } /* end if */
+    else {
+        /* Sanity checks */
+        HDassert(sect->u.indirect.indir_nents > 0);
+        HDassert(sect->u.indirect.indir_ents);
+        HDassert(sect->u.indirect.indir_ents[0]);
+
+        /* Forward to first child indirect section */
+        if(H5HF_sect_indirect_first(hdr, dxpl_id, sect->u.indirect.indir_ents[0]) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, FAIL, "can't set child indirect section to be first row")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_first() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_get_iblock
+ *
+ * Purpose:	Retrieve the indirect block for a indirect section
+ *
+ * Return:	Pointer to indirect block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July  9 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HF_indirect_t *
+H5HF_sect_indirect_get_iblock(H5HF_free_section_t *sect)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_INDIRECT);
+    HDassert(sect->sect_info.state == H5FS_SECT_LIVE);
+
+    FUNC_LEAVE_NOAPI(sect->u.indirect.u.iblock)
+} /* end H5HF_sect_indirect_get_iblock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_merge_row
+ *
+ * Purpose:	Merge two sections of this type
+ *
+ * Note:        Second section always merges into first node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 18, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_merge_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    H5HF_free_section_t *row_sect1, H5HF_free_section_t *row_sect2)
+{
+    H5HF_free_section_t *sect1, *sect2; /* Indirect sections underlying row sections */
+    unsigned start_entry1;              /* Start entry for section #1 */
+    unsigned start_row1, start_col1;    /* Starting row & column for section #1 */
+    unsigned end_entry1;                /* End entry for section #1 */
+    unsigned end_row1;                  /* Ending row for section #1 */
+    unsigned start_row2;                /* Starting row for section #2 */
+    hbool_t merged_rows;                /* Flag to indicate that rows was merged together */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check parameters */
+    HDassert(hdr);
+    HDassert(row_sect1);
+    HDassert(row_sect1->u.row.under);
+    HDassert(row_sect1->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(row_sect2);
+    HDassert(row_sect2->u.row.under);
+    HDassert(row_sect2->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(row_sect2->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+
+    /* Set up indirect section information */
+    sect1 = H5HF_sect_indirect_top(row_sect1->u.row.under);
+    HDassert(sect1);
+    sect2 = H5HF_sect_indirect_top(row_sect2->u.row.under);
+    HDassert(sect2);
+
+    /* Sanity check some assumptions about the indirect sections */
+    HDassert(sect1->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(sect1->u.indirect.span_size > 0);
+    HDassert(sect1->u.indirect.iblock_entries > 0);
+    HDassert(sect2->sect_info.state == H5FS_SECT_LIVE);
+    HDassert(sect2->u.indirect.span_size > 0);
+    HDassert(sect2->u.indirect.iblock_entries > 0);
+    HDassert(sect1->u.indirect.iblock_entries == sect2->u.indirect.iblock_entries);
+
+    /* Set up span information */
+    start_row1 = sect1->u.indirect.row;
+    start_col1 = sect1->u.indirect.col;
+    start_entry1 = (start_row1 * hdr->man_dtable.cparam.width) + start_col1;
+    end_entry1 = (start_entry1 + sect1->u.indirect.num_entries) - 1;
+    end_row1 = end_entry1 / hdr->man_dtable.cparam.width;
+    start_row2 = sect2->u.indirect.row;
+
+    /* Check for direct sections in second section */
+    /* (second indirect section can be parent of indirect section for second
+     *          row, and thus have no row sections of it's own)
+     */
+    if(sect2->u.indirect.dir_nrows > 0) {
+        unsigned new_dir_nrows1;        /* New value for number of direct rows in first section */
+        unsigned src_row2;              /* Source row for copying from second section */
+        unsigned nrows_moved2;          /* Number of rows to move from second section to first */
+
+        /* Sanity check child row assumptions */
+        /* (second indirect section should be at top of equal or deeper
+         *      hier. of row/indirect sections, so if second indirect section
+         *      has child row sections, first indirect section _must_ have
+         *      them also)
+         */
+        HDassert(sect1->u.indirect.dir_nrows > 0);
+        HDassert(sect1->u.indirect.dir_rows);
+
+        /* Check for sections sharing a row in the same underlying indirect block */
+        if(row_sect1->u.row.under->u.indirect.u.iblock->block_off == row_sect2->u.row.under->u.indirect.u.iblock->block_off
+                && end_row1 == start_row2) {
+            H5HF_free_section_t *last_row_sect1;        /* Last row in first indirect section */
+
+            /* Locate the last row section in first indirect section, if we don't already have it */
+            if(row_sect1->u.row.row != end_row1)
+                last_row_sect1 = sect1->u.indirect.dir_rows[sect1->u.indirect.dir_nrows - 1];
+            else
+                last_row_sect1 = row_sect1;
+            HDassert(last_row_sect1);
+            HDassert(last_row_sect1->u.row.row == end_row1);
+
+            /* Adjust info for first row section, to absorb second row section */
+            HDassert((last_row_sect1->u.row.col + last_row_sect1->u.row.num_entries) == row_sect2->u.row.col);
+            last_row_sect1->u.row.num_entries += row_sect2->u.row.num_entries;
+
+            /* Set up parameters for transfer of rows */
+            src_row2 = 1;
+            nrows_moved2 = sect2->u.indirect.dir_nrows - 1;
+            new_dir_nrows1 = (sect1->u.indirect.dir_nrows + sect2->u.indirect.dir_nrows) - 1;
+
+            /* Indicate that the rows were merged */
+            merged_rows = TRUE;
+        } /* end if */
+        else {
+
+            /* Set up parameters for transfer of rows */
+            src_row2  = 0;
+            nrows_moved2 = sect2->u.indirect.dir_nrows;
+            new_dir_nrows1 = sect1->u.indirect.dir_nrows + sect2->u.indirect.dir_nrows;
+
+            /* Indicate that the rows were _not_ merged */
+            merged_rows = FALSE;
+        } /* end else */
+
+        /* Check if we need to move additional rows */
+        if(nrows_moved2 > 0) {
+            H5HF_free_section_t **new_dir_rows;         /* Pointer to new array of direct row pointers */
+
+            /* Extend the first section's row array */
+            if(NULL == (new_dir_rows = (H5HF_free_section_t **)H5MM_realloc(sect1->u.indirect.dir_rows, sizeof(H5HF_free_section_t *) * new_dir_nrows1)))
+                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "allocation failed for row section pointer array")
+            sect1->u.indirect.dir_rows = new_dir_rows;
+
+            /* Transfer the second section's rows to first section */
+            HDmemcpy(&sect1->u.indirect.dir_rows[sect1->u.indirect.dir_nrows],
+                &sect2->u.indirect.dir_rows[src_row2],
+                (sizeof(H5HF_free_section_t *) * nrows_moved2));
+
+            /* Re-target the row sections moved from second section */
+            for(u = sect1->u.indirect.dir_nrows; u < new_dir_nrows1; u++)
+                sect1->u.indirect.dir_rows[u]->u.row.under = sect1;
+
+            /* Adjust reference counts to account for transferred rows */
+            sect1->u.indirect.rc += nrows_moved2;
+            sect2->u.indirect.rc -= nrows_moved2;
+
+            /* Update information for first section */
+            sect1->u.indirect.dir_nrows = new_dir_nrows1;
+        } /* end if */
+    } /* end if */
+    else
+        /* Indicate that the rows were _not_ merged */
+        merged_rows = FALSE;
+
+    /* Check for indirect sections in second section */
+    if(sect2->u.indirect.indir_nents > 0) {
+        unsigned new_indir_nents1;      /* New value for number of indirect entries in first section */
+
+        /* Some sanity checks on second indirect section */
+        HDassert(sect2->u.indirect.rc > 0);
+        HDassert(sect2->u.indirect.indir_nents > 0);
+        HDassert(sect2->u.indirect.indir_ents);
+
+        /* Set up parameters for transfer of entries */
+        new_indir_nents1 = sect1->u.indirect.indir_nents + sect2->u.indirect.indir_nents;
+
+        /* Check if first section can just take over second section's memory buffer */
+        if(sect1->u.indirect.indir_ents == NULL) {
+            sect1->u.indirect.indir_ents = sect2->u.indirect.indir_ents;
+            sect2->u.indirect.indir_ents = NULL;
+        } /* end if */
+        else {
+            H5HF_free_section_t **new_indir_ents;       /* Pointer to new array of indirect entries */
+
+            /* Extend the first section's entry array */
+            if(NULL == (new_indir_ents = (H5HF_free_section_t **)H5MM_realloc(sect1->u.indirect.indir_ents, sizeof(H5HF_free_section_t *) * new_indir_nents1)))
+                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "allocation failed for row section pointer array")
+            sect1->u.indirect.indir_ents = new_indir_ents;
+
+            /* Transfer the second section's entries to first section */
+            HDmemcpy(&sect1->u.indirect.indir_ents[sect1->u.indirect.indir_nents],
+                &sect2->u.indirect.indir_ents[0],
+                (sizeof(H5HF_free_section_t *) * sect2->u.indirect.indir_nents));
+        } /* end else */
+
+        /* Re-target the child indirect sections moved from second section */
+        for(u = sect1->u.indirect.indir_nents; u < new_indir_nents1; u++)
+            sect1->u.indirect.indir_ents[u]->u.indirect.parent = sect1;
+
+        /* Adjust reference counts for transferred child indirect sections */
+        sect1->u.indirect.rc += sect2->u.indirect.indir_nents;
+        sect2->u.indirect.rc -= sect2->u.indirect.indir_nents;
+
+        /* Update information for first section */
+        sect1->u.indirect.indir_nents = new_indir_nents1;
+    } /* end if */
+
+    /* Update information for first section */
+    sect1->u.indirect.num_entries += sect2->u.indirect.num_entries;
+    sect1->u.indirect.span_size += sect2->u.indirect.span_size;
+
+    /* Make certain we've tracked the first section's dependents correctly */
+    HDassert(sect1->u.indirect.rc ==
+            (sect1->u.indirect.indir_nents + sect1->u.indirect.dir_nrows));
+
+    /* Wrap up, freeing or re-inserting second row section */
+    /* (want this to be after the first indirection section is consistent again) */
+    if(merged_rows) {
+        /* Release second row section */
+        /* (indirectly releases second indirect section, since all of it's
+         *  other dependents are gone)
+         */
+        HDassert(sect2->u.indirect.rc == 1);
+        if(H5HF_sect_row_free((H5FS_section_info_t *)row_sect2) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free row section")
+    } /* end if */
+    else {
+        /* Decrement ref. count on second indirect section's parent */
+        HDassert(sect2->u.indirect.rc == 0);
+        if(sect2->u.indirect.parent)
+            if(H5HF_sect_indirect_decr(sect2->u.indirect.parent) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't decrement ref. count on parent indirect section")
+
+        /* Free second indirect section */
+        if(H5HF_sect_indirect_free(sect2) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+
+        /* Re-add the second section's first row */
+        /* (it's already been added to first indirect section, but it's been removed
+         *  from the free space manager and needs to be re-added)
+        */
+        row_sect2->sect_info.type = H5HF_FSPACE_SECT_NORMAL_ROW;
+        if(H5HF_space_add(hdr, dxpl_id, row_sect2, H5FS_ADD_SKIP_VALID) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't re-add second row section to free space")
+    } /* end else */
+
+    /* Check if we can create parent indirect section for first section */
+    /* (i.e. merged indirect sections cover an entire indirect block) */
+    if(sect1->u.indirect.iblock_entries == sect1->u.indirect.num_entries) {
+        /* Build parent section for fully populated indirect section */
+        HDassert(sect1->u.indirect.parent == NULL);
+        if(H5HF_sect_indirect_build_parent(hdr, sect1) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCREATE, FAIL, "can't create parent for full indirect section")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_merge_row() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_build_parent
+ *
+ * Purpose:	Build a parent indirect section for a full indirect section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, July 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_build_parent(H5HF_hdr_t *hdr, H5HF_free_section_t *sect)
+{
+    H5HF_indirect_t *par_iblock;        /* Indirect block for parent section */
+    H5HF_free_section_t *par_sect = NULL; /* Parent indirect section */
+    unsigned par_row, par_col;          /* Row & column in parent indirect section */
+    unsigned par_entry;                 /* Entry within parent indirect section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check parameters */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(sect->u.indirect.span_size > 0);
+    HDassert(sect->u.indirect.iblock_entries > 0);
+    HDassert(sect->u.indirect.iblock_entries == sect->u.indirect.num_entries);
+    HDassert(sect->u.indirect.u.iblock);
+    HDassert(sect->u.indirect.parent == NULL);
+
+    /* Get information for creating parent indirect section */
+    par_entry = sect->u.indirect.u.iblock->par_entry;
+    par_row = par_entry / hdr->man_dtable.cparam.width;
+    par_col = par_entry % hdr->man_dtable.cparam.width;
+    HDassert(par_row >= hdr->man_dtable.max_direct_rows);
+    par_iblock = sect->u.indirect.u.iblock->parent;
+    HDassert(par_iblock);
+
+    /* Create parent indirect section */
+    if(NULL == (par_sect = H5HF_sect_indirect_new(hdr, sect->sect_info.addr,
+            sect->sect_info.size, par_iblock, par_iblock->block_off,
+            par_row, par_col, 1)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't create indirect section")
+
+    /* No rows of direct blocks covered in parent, reset direct row information */
+    par_sect->u.indirect.dir_nrows = 0;
+    par_sect->u.indirect.dir_rows = NULL;
+
+    /* Allocate space for the child indirect sections */
+    par_sect->u.indirect.indir_nents = 1;
+    if(NULL == (par_sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_malloc(sizeof(H5HF_free_section_t *))))
+        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "allocation failed for indirect section pointer array")
+
+    /* Attach sections together */
+    sect->u.indirect.parent = par_sect;
+    sect->u.indirect.par_entry = par_entry;
+    par_sect->u.indirect.indir_ents[0] = sect;
+    par_sect->u.indirect.rc = 1;
+
+done:
+    if(ret_value < 0)
+        if(par_sect && H5HF_sect_indirect_free(par_sect) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_build_parent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_shrink
+ *
+ * Purpose:	"Shrink" container w/section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 24, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_shrink(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check parameters */
+    HDassert(hdr);
+    HDassert(sect);
+
+    /* Sanity check some assumptions about the indirect section */
+    HDassert(sect->u.indirect.dir_nrows > 0 || sect->u.indirect.indir_nents > 0);
+
+    /* Walk through direct rows, freeing them */
+    for(u = 0; u < sect->u.indirect.dir_nrows; u++) {
+        /* Remove the normal rows from free space manager */
+        if(sect->u.indirect.dir_rows[u]->sect_info.type != H5HF_FSPACE_SECT_FIRST_ROW) {
+            HDassert(sect->u.indirect.dir_rows[u]->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+            if(H5HF_space_remove(hdr, dxpl_id, sect->u.indirect.dir_rows[u]) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove section from heap free space")
+        } /* end if */
+
+        /* Release the row section */
+        if(H5HF_sect_row_free_real(sect->u.indirect.dir_rows[u]) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free child section node")
+    } /* end for */
+
+    /* Walk through indirect entries, freeing them (recursively) */
+    for(u = 0; u < sect->u.indirect.indir_nents; u++)
+        if(H5HF_sect_indirect_shrink(hdr, dxpl_id, sect->u.indirect.indir_ents[u]) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free child section node")
+
+    /* Free the indirect section itself */
+    if(H5HF_sect_indirect_free(sect) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free indirect section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_sect_indirect_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_serialize
+ *
+ * Purpose:	Serialize a "live" indirect section into a buffer
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_serialize(H5HF_hdr_t *hdr, const H5HF_free_section_t *sect,
+    uint8_t *buf)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(sect);
+    HDassert(buf);
+
+    /* Check if this indirect section has a parent & forward if this section is first */
+    if(sect->u.indirect.parent) {
+        if(sect->sect_info.addr == sect->u.indirect.parent->sect_info.addr)
+            if(H5HF_sect_indirect_serialize(hdr, sect->u.indirect.parent, buf) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTSERIALIZE, FAIL, "can't serialize indirect section's parent indirect section")
+    } /* end if */
+    else {
+        /* Indirect range's indirect block's block offset */
+        if(sect->sect_info.state == H5FS_SECT_LIVE) {
+            HDassert(sect->u.indirect.u.iblock);
+            UINT64ENCODE_VAR(buf, sect->u.indirect.u.iblock->block_off, hdr->heap_off_size);
+        } /* end if */
+        else
+            UINT64ENCODE_VAR(buf, sect->u.indirect.u.iblock_off, hdr->heap_off_size);
+
+        /* Indirect range's row */
+        UINT16ENCODE(buf, sect->u.indirect.row);
+
+        /* Indirect range's column */
+        UINT16ENCODE(buf, sect->u.indirect.col);
+
+        /* Indirect range's # of entries */
+        UINT16ENCODE(buf, sect->u.indirect.num_entries);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_indirect_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_deserialize
+ *
+ * Purpose:	Deserialize a buffer into a "live" indirect section
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5HF_sect_indirect_deserialize(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags)
+{
+    H5HF_free_section_t *new_sect;      /* New indirect section */
+    hsize_t iblock_off;                 /* Indirect block's offset */
+    unsigned start_row;                 /* Indirect section's start row */
+    unsigned start_col;                 /* Indirect section's start column */
+    unsigned nentries;                  /* Indirect section's number of entries */
+    unsigned start_entry;               /* Start entry in indirect block */
+    unsigned end_entry;                 /* End entry in indirect block */
+    unsigned end_row;                   /* End row in indirect block */
+    unsigned end_col;                   /* End column in indirect block */
+    H5FS_section_info_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(buf);
+    HDassert(H5F_addr_defined(sect_addr));
+    HDassert(sect_size);
+
+    /* Indirect range's indirect block's block offset */
+    UINT64DECODE_VAR(buf, iblock_off, hdr->heap_off_size);
+
+    /* Indirect section's row */
+    UINT16DECODE(buf, start_row);
+
+    /* Indirect section's column */
+    UINT16DECODE(buf, start_col);
+
+    /* Indirect section's # of entries */
+    UINT16DECODE(buf, nentries);
+
+    /* Create free space section node */
+    if(NULL == (new_sect = H5HF_sect_indirect_new(hdr, sect_addr, sect_size,
+            NULL, iblock_off, start_row, start_col, nentries)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't create indirect section")
+
+    /* Compute start entry */
+    start_entry = (start_row * hdr->man_dtable.cparam.width) + start_col;
+
+    /* Compute end column & row */
+    end_entry = (start_entry + nentries) - 1;
+    end_row = end_entry / hdr->man_dtable.cparam.width;
+    end_col = end_entry % hdr->man_dtable.cparam.width;
+
+    /* Initialize rows for new indirect section */
+    if(H5HF_sect_indirect_init_rows(hdr, dxpl_id, new_sect, TRUE, NULL,
+            H5FS_ADD_DESERIALIZING, new_sect->u.indirect.row, new_sect->u.indirect.col,
+            end_row, end_col) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize indirect section")
+
+    /* Indicate that this section shouldn't be added to free space manager's list */
+    *des_flags |= H5FS_DESERIALIZE_NO_ADD;
+
+    /* Set return value */
+    ret_value = (H5FS_section_info_t *)new_sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_sect_indirect_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_free
+ *
+ * Purpose:	Free a 'indirect' section node
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_free(H5HF_free_section_t *sect)
+{
+    H5HF_indirect_t *iblock = NULL;     /* Indirect block for section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(sect);
+
+    /* Release the memory for tracking direct rows */
+    sect->u.indirect.dir_rows = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.dir_rows);
+
+    /* Release the memory for tracking indirect entries */
+    sect->u.indirect.indir_ents = (H5HF_free_section_t **)H5MM_xfree(sect->u.indirect.indir_ents);
+
+    /* Check for live reference to an indirect block */
+    if(sect->sect_info.state == H5FS_SECT_LIVE) {
+        /* Get indirect block, if there was one */
+        if(sect->u.indirect.u.iblock)
+            iblock = sect->u.indirect.u.iblock;
+    } /* end if */
+
+    /* Release the sections */
+    if(H5HF_sect_node_free(sect, iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5HF_sect_indirect_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_valid
+ *
+ * Purpose:	Check the validity of a section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, July 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_valid(const H5HF_hdr_t *hdr, const H5HF_free_section_t *sect)
+{
+    unsigned start_row;         /* Row for first block covered */
+    unsigned start_col;         /* Column for first block covered */
+    unsigned start_entry;       /* Entry for first block covered */
+    unsigned end_row;           /* Row for last block covered */
+    unsigned end_entry;         /* Entry for last block covered */
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check arguments */
+    HDassert(hdr);
+    HDassert(sect);
+
+    /* Compute starting entry, column & row */
+    start_row = sect->u.indirect.row;
+    start_col = sect->u.indirect.col;
+    start_entry = (start_row * hdr->man_dtable.cparam.width) + start_col;
+
+    /* Compute ending entry, column & row */
+    end_entry = (start_entry + sect->u.indirect.num_entries) - 1;
+    end_row = end_entry / hdr->man_dtable.cparam.width;
+
+    /* Sanity check any direct rows */
+    if(sect->u.indirect.dir_nrows > 0) {
+        unsigned dir_nrows;         /* Number of direct rows in section */
+        unsigned max_dir_row;       /* Maximum direct row in section */
+
+        /* Check for indirect rows in section */
+        if(end_row >= hdr->man_dtable.max_direct_rows)
+            max_dir_row = hdr->man_dtable.max_direct_rows - 1;
+        else
+            max_dir_row = end_row;
+
+        /* Iterate over direct rows, checking pointer references */
+        dir_nrows = (max_dir_row - start_row) + 1;
+        HDassert(dir_nrows == sect->u.indirect.dir_nrows);
+        for(u = 0; u < dir_nrows; u++) {
+            const H5HF_free_section_t *tmp_row_sect;    /* Pointer to row section */
+
+            tmp_row_sect = sect->u.indirect.dir_rows[u];
+            HDassert(tmp_row_sect->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW
+                    || tmp_row_sect->sect_info.type == H5HF_FSPACE_SECT_NORMAL_ROW);
+            HDassert(tmp_row_sect->u.row.under == sect);
+            HDassert(tmp_row_sect->u.row.row == (start_row + u));
+            if(u > 0) {
+                const H5HF_free_section_t *tmp_row_sect2;    /* Pointer to row section */
+
+                tmp_row_sect2 = sect->u.indirect.dir_rows[u - 1];
+                HDassert(tmp_row_sect2->u.row.row < tmp_row_sect->u.row.row);
+                HDassert(H5F_addr_lt(tmp_row_sect2->sect_info.addr, tmp_row_sect->sect_info.addr));
+                HDassert(tmp_row_sect2->sect_info.size <= tmp_row_sect->sect_info.size);
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+    /* Sanity check any indirect entries */
+    if(sect->u.indirect.indir_nents > 0) {
+        /* Basic sanity checks */
+        if(sect->sect_info.state == H5FS_SECT_LIVE) {
+            HDassert(sect->u.indirect.iblock_entries);
+            HDassert(sect->u.indirect.indir_nents <= sect->u.indirect.iblock_entries);
+        } /* end if */
+        HDassert(sect->u.indirect.indir_ents);
+
+        /* Sanity check each child indirect section */
+        for(u = 0; u < sect->u.indirect.indir_nents; u++) {
+            const H5HF_free_section_t *tmp_child_sect;    /* Pointer to child indirect section */
+
+            tmp_child_sect = sect->u.indirect.indir_ents[u];
+            HDassert(tmp_child_sect->sect_info.type == H5HF_FSPACE_SECT_INDIRECT);
+            HDassert(tmp_child_sect->u.indirect.parent == sect);
+            if(u > 0) {
+                const H5HF_free_section_t *tmp_child_sect2;    /* Pointer to child indirect section */
+
+                tmp_child_sect2 = sect->u.indirect.indir_ents[u - 1];
+                HDassert(H5F_addr_lt(tmp_child_sect2->sect_info.addr, tmp_child_sect->sect_info.addr));
+            } /* end if */
+
+            /* Recursively check child indirect section */
+            H5HF_sect_indirect_valid(hdr, tmp_child_sect);
+        } /* end for */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5HF_sect_indirect_valid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_sect_indirect_debug
+ *
+ * Purpose:	Dump debugging information about an indirect free space section
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July  3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_sect_indirect_debug(const H5HF_free_section_t *sect,
+    FILE *stream, int indent, int fwidth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Print indirect section information */
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Row:",
+	      sect->u.indirect.row);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Column:",
+	      sect->u.indirect.col);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of entries:",
+	      sect->u.indirect.num_entries);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_sect_indirect_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFspace.c b/gatb-core/thirdparty/hdf5/src/H5HFspace.c
new file mode 100644
index 0000000..520c117
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFspace.c
@@ -0,0 +1,639 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFspace.c
+ *			May  2 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Space allocation routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5HF_FSPACE_SHRINK      80              /* Percent of "normal" size to shrink serialized free space size */
+#define H5HF_FSPACE_EXPAND      120             /* Percent of "normal" size to expand serialized free space size */
+#define H5HF_FSPACE_THRHD_DEF 	1             	/* Default: no alignment threshold */
+#define H5HF_FSPACE_ALIGN_DEF   1             	/* Default: no alignment */
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_start
+ *
+ * Purpose:	"Start up" free space for heap - open existing free space
+ *              structure if one exists, otherwise create a new free space
+ *              structure
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ * Modifications:
+ *	Vailin Choi, July 29th, 2008
+ *	  Pass values of alignment and threshold to FS_create() and FS_open()
+ *	  for handling alignment.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_start(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t may_create)
+{
+    const H5FS_section_class_t *classes[] = { /* Free space section classes implemented for fractal heap */
+        H5HF_FSPACE_SECT_CLS_SINGLE,
+        H5HF_FSPACE_SECT_CLS_FIRST_ROW,
+        H5HF_FSPACE_SECT_CLS_NORMAL_ROW,
+        H5HF_FSPACE_SECT_CLS_INDIRECT};
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Check for creating free space info for the heap */
+    if(H5F_addr_defined(hdr->fs_addr)) {
+        /* Open an existing free space structure for the heap */
+        if(NULL == (hdr->fspace = H5FS_open(hdr->f, dxpl_id, hdr->fs_addr,
+                NELMTS(classes), classes, hdr, H5HF_FSPACE_THRHD_DEF, H5HF_FSPACE_ALIGN_DEF)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize free space info")
+    } /* end if */
+    else {
+        /* Check if we are allowed to create the free space manager */
+        if(may_create) {
+            H5FS_create_t fs_create;        /* Free space creation parameters */
+
+            /* Set the free space creation parameters */
+            fs_create.client = H5FS_CLIENT_FHEAP_ID;
+            fs_create.shrink_percent = H5HF_FSPACE_SHRINK;
+            fs_create.expand_percent = H5HF_FSPACE_EXPAND;
+            fs_create.max_sect_size = hdr->man_dtable.cparam.max_direct_size;
+            fs_create.max_sect_addr = hdr->man_dtable.cparam.max_index;
+
+            /* Create the free space structure for the heap */
+            if(NULL == (hdr->fspace = H5FS_create(hdr->f, dxpl_id, &hdr->fs_addr,
+                    &fs_create, NELMTS(classes), classes, hdr, H5HF_FSPACE_THRHD_DEF, H5HF_FSPACE_ALIGN_DEF)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize free space info")
+            HDassert(H5F_addr_defined(hdr->fs_addr));
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_start() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_add
+ *
+ * Purpose:	Add a section to the free space for the heap
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May 15 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_add(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *node,
+    unsigned flags)
+{
+    H5HF_sect_add_ud_t udata;          /* User data for free space manager 'add' */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(node);
+
+    /* Check if the free space for the heap has been initialized */
+    if(!hdr->fspace)
+        if(H5HF_space_start(hdr, dxpl_id, TRUE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space")
+
+    /* Construct user data */
+    udata.hdr = hdr;
+    udata.dxpl_id = dxpl_id;
+
+    /* Add to the free space for the heap */
+    if(H5FS_sect_add(hdr->f, dxpl_id, hdr->fspace, (H5FS_section_info_t *)node, flags, &udata) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "can't add section to heap free space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_find
+ *
+ * Purpose:	Attempt to find space in a fractal heap
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5HF_space_find(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t request, H5HF_free_section_t **node)
+{
+    htri_t node_found = FALSE;  /* Whether an existing free list node was found */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(request);
+    HDassert(node);
+
+    /* Check if the free space for the heap has been initialized */
+    if(!hdr->fspace)
+        if(H5HF_space_start(hdr, dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space")
+
+    /* Search for free space in the heap */
+    if(hdr->fspace)
+        if((node_found = H5FS_sect_find(hdr->f, dxpl_id, hdr->fspace, request, (H5FS_section_info_t **)node)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't locate free space in fractal heap")
+
+    /* Set return value */
+    ret_value = node_found;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_revert_root_cb
+ *
+ * Purpose:	Callback routine from iterator, to reset 'parent' pointers in
+ *		sections, when the heap is changing from having a root indirect
+ *		block to a direct block.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 24 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_space_revert_root_cb(H5FS_section_info_t *_sect, void H5_ATTR_UNUSED *_udata)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;       /* Section to dump info */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+
+    /* Only modify "live" single blocks... */
+    if(sect->sect_info.type == H5HF_FSPACE_SECT_SINGLE && sect->sect_info.state == H5FS_SECT_LIVE) {
+        /* Release hold on previous indirect block (we must have one) */
+        HDassert(sect->u.single.parent);
+        if(H5HF_iblock_decr(sect->u.single.parent) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on section's indirect block")
+
+        /* Reset parent information */
+        sect->u.single.parent = NULL;
+        sect->u.single.par_entry = 0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_revert_root_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_revert_root
+ *
+ * Purpose:	Reset 'parent' pointers in sections, when the heap is
+ *		changing from having a root indirect block to a direct block.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 23 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_revert_root(const H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Only need to scan the sections if the free space has been initialized */
+    if(hdr->fspace) {
+	/* Iterate over all sections, reseting the parent pointers in 'single' sections */
+        if(H5FS_sect_iterate(hdr->f, dxpl_id, hdr->fspace, H5HF_space_revert_root_cb, NULL) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over sections to reset parent pointers")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_revert_root() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_create_root_cb
+ *
+ * Purpose:	Callback routine from iterator, to set 'parent' pointers in
+ *		sections to newly created root indirect block, when the heap
+ *		is changing from having a root direct block to an indirect block.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 24 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_space_create_root_cb(H5FS_section_info_t *_sect, void *_udata)
+{
+    H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;       /* Section to dump info */
+    H5HF_indirect_t *root_iblock = (H5HF_indirect_t *)_udata;	/* User data for callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(root_iblock);
+
+    /* Sanity check sections */
+    /* (If we are switching from a direct block for the root block of the heap, */
+    /*	there should only be 'single' type sections. -QAK) */
+    HDassert(sect->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+
+    /* Increment ref. count on new root indirect block */
+    if(H5HF_iblock_incr(root_iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on section's indirect block")
+
+    /* Set parent info ("live" section must _NOT_ have a parent right now) */
+    if(sect->sect_info.state == H5FS_SECT_SERIALIZED)
+        sect->sect_info.state = H5FS_SECT_LIVE;         /* Mark "live" now */
+    else
+         HDassert(!sect->u.single.parent);
+    sect->u.single.parent = root_iblock;
+    sect->u.single.par_entry = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_create_root_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_create_root
+ *
+ * Purpose:	Set 'parent' pointers in sections to new indirect block, when
+ *		the heap is changing from having a root direct block to a
+ *		indirect block.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Feb 24 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_create_root(const H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *root_iblock)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(root_iblock);
+
+    /* Only need to scan the sections if the free space has been initialized */
+    if(hdr->fspace) {
+	/* Iterate over all sections, seting the parent pointers in 'single' sections to the new indirect block */
+        if(H5FS_sect_iterate(hdr->f, dxpl_id, hdr->fspace, H5HF_space_create_root_cb, root_iblock) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over sections to set parent pointers")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_create_root() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_size
+ *
+ * Purpose:	Query the size of the heap's free space info on disk
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		August 14 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_size(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t *fs_size)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(fs_size);
+
+    /* Check if the free space for the heap has been initialized */
+    if(!hdr->fspace)
+        if(H5HF_space_start(hdr, dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space")
+
+    /* Get free space metadata size */
+    if(hdr->fspace) {
+        if(H5FS_size(hdr->f, hdr->fspace, fs_size) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't retrieve FS meta storage info")
+    } /* end if */
+    else
+        *fs_size = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_remove
+ *
+ * Purpose:	Remove a section from the free space for the heap
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 24 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *node)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(hdr->fspace);
+    HDassert(node);
+
+    /* Remove from the free space for the heap */
+    if(H5FS_sect_remove(hdr->f, dxpl_id, hdr->fspace, (H5FS_section_info_t *)node) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove section from heap free space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_close
+ *
+ * Purpose:	Close the free space for the heap
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_close(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Check if the free space was ever opened */
+    if(hdr->fspace) {
+        hsize_t nsects;         /* Number of sections for this heap */
+
+        /* Retrieve the number of sections for this heap */
+        if(H5FS_sect_stats(hdr->fspace, NULL, &nsects) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTCOUNT, FAIL, "can't query free space section count")
+#ifdef QAK
+HDfprintf(stderr, "%s: nsects = %Hu\n", FUNC, nsects);
+#endif /* QAK */
+
+        /* Close the free space for the heap */
+        if(H5FS_close(hdr->f, dxpl_id, hdr->fspace) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
+        hdr->fspace = NULL;
+
+        /* Check if we can delete the free space manager for this heap */
+        if(!nsects) {
+            if(H5FS_delete(hdr->f, dxpl_id, hdr->fs_addr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "can't delete free space info")
+            hdr->fs_addr = HADDR_UNDEF;
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_delete
+ *
+ * Purpose:	Delete the free space manager for the heap
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Aug  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_delete(H5HF_hdr_t *hdr, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Delete the free space manager */
+    if(H5FS_delete(hdr->f, dxpl_id, hdr->fs_addr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "can't delete to free space manager")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_space_change_sect_class
+ *
+ * Purpose:	Change a section's class
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		July 10 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect, unsigned new_class)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(hdr->fspace);
+    HDassert(sect);
+
+    /* Notify the free space manager that a section has changed class */
+    if(H5FS_sect_change_class(hdr->f, dxpl_id, hdr->fspace, (H5FS_section_info_t *)sect, new_class) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMODIFY, FAIL, "can't modify class of free space section")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_space_sect_change_class() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFstat.c b/gatb-core/thirdparty/hdf5/src/H5HFstat.c
new file mode 100644
index 0000000..b0e1987
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFstat.c
@@ -0,0 +1,180 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Monday, March  6, 2006
+ *
+ * Purpose:	Fractal heap metadata statistics functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_stat_info
+ *
+ * Purpose:	Retrieve metadata statistics for the fractal heap
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, March  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_stat_info(const H5HF_t *fh, H5HF_stat_t *stats)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(stats);
+
+    /* Report statistics for fractal heap */
+    stats->man_size = fh->hdr->man_size;
+    stats->man_alloc_size = fh->hdr->man_alloc_size;
+    stats->man_iter_off = fh->hdr->man_iter_off;
+    stats->man_nobjs = fh->hdr->man_nobjs;
+    stats->man_free_space = fh->hdr->total_man_free;
+    stats->huge_size = fh->hdr->huge_size;
+    stats->huge_nobjs = fh->hdr->huge_nobjs;
+    stats->tiny_size = fh->hdr->tiny_size;
+    stats->tiny_nobjs = fh->hdr->tiny_nobjs;
+/* XXX: Add more metadata statistics for the heap */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_stat_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF_size
+ *
+ * Purpose:     Retrieve storage info for:
+ *			1. fractal heap
+ *			2. btree storage used by huge objects in fractal heap
+ *			3. free space storage info
+ *
+ * Return:      non-negative on success, negative on error
+ *
+ * Programmer:  Vailin Choi
+ *              July 12 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_size(const H5HF_t *fh, hid_t dxpl_id, hsize_t *heap_size)
+{
+    H5HF_hdr_t *hdr;                    /* Fractal heap header */
+    H5B2_t      *bt2 = NULL;            /* v2 B-tree handle for index */
+    hsize_t	meta_size = 0;		/* free space storage size */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(heap_size);
+
+    /* Get "convenience" pointer to fractal heap header */
+    hdr = fh->hdr;
+
+    /* Add in values already known */
+    *heap_size += hdr->heap_size;               /* Heap header */
+    *heap_size += hdr->man_alloc_size;          /* Direct block storage for "managed" objects */
+    *heap_size += hdr->huge_size;               /* "huge" object storage */
+
+    /* Check for indirect blocks for managed objects */
+    if(H5F_addr_defined(hdr->man_dtable.table_addr) && hdr->man_dtable.curr_root_rows != 0)
+        if(H5HF_man_iblock_size(hdr->f, dxpl_id, hdr, hdr->man_dtable.table_addr, hdr->man_dtable.curr_root_rows, NULL, 0, heap_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to get fractal heap storage info for indirect block")
+
+    /* Check for B-tree storage of huge objects in fractal heap */
+    if(H5F_addr_defined(hdr->huge_bt2_addr)) {
+        /* Open the huge object index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' objects")
+
+        /* Get the B-tree storage */
+        if(H5B2_size(bt2, dxpl_id, heap_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
+    } /* end if */
+
+    /* Get storage for free-space tracking info */
+    if(H5F_addr_defined(hdr->fs_addr)) {
+        if(H5HF_space_size(hdr, dxpl_id, &meta_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve FS meta storage info")
+	*heap_size += meta_size;
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for tracking 'huge' objects")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFtest.c b/gatb-core/thirdparty/hdf5/src/H5HFtest.c
new file mode 100644
index 0000000..c2e9cb0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFtest.c
@@ -0,0 +1,552 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Thursday, February  3, 2006
+ *
+ * Purpose:	Fractal heap testing functions.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#define H5HF_TESTING		/*suppress warning about H5HF testing funcs*/
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_cparam_test
+ *
+ * Purpose:	Retrieve the parameters used to create the fractal heap
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, February 24, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(cparam);
+
+    /* Get fractal heap creation parameters */
+    if(fh->hdr->id_len == (unsigned)(1 + fh->hdr->heap_off_size + fh->hdr->heap_len_size))
+        cparam->id_len = 0;
+    else if(fh->hdr->id_len == (1 + fh->hdr->sizeof_size + fh->hdr->sizeof_addr))
+        cparam->id_len = 1;
+    else
+        cparam->id_len = fh->hdr->id_len;
+    cparam->max_man_size = fh->hdr->max_man_size;
+    HDmemcpy(&(cparam->managed), &(fh->hdr->man_dtable.cparam), sizeof(H5HF_dtable_cparam_t));
+    H5O_msg_copy(H5O_PLINE_ID, &(fh->hdr->pline), &(cparam->pline));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_get_cparam_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_cmp_cparam_test
+ *
+ * Purpose:	Compare the parameters used to create the fractal heap
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2)
+{
+    int ret_value = 0;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(cparam1);
+    HDassert(cparam2);
+
+    /* Compare doubling table parameters */
+    if(cparam1->managed.width < cparam2->managed.width)
+        HGOTO_DONE(-1)
+    else if(cparam1->managed.width > cparam2->managed.width)
+        HGOTO_DONE(1)
+    if(cparam1->managed.start_block_size < cparam2->managed.start_block_size)
+        HGOTO_DONE(-1)
+    else if(cparam1->managed.start_block_size > cparam2->managed.start_block_size)
+        HGOTO_DONE(1)
+    if(cparam1->managed.max_direct_size < cparam2->managed.max_direct_size)
+        HGOTO_DONE(-1)
+    else if(cparam1->managed.max_direct_size > cparam2->managed.max_direct_size)
+        HGOTO_DONE(1)
+    if(cparam1->managed.max_index < cparam2->managed.max_index)
+        HGOTO_DONE(-1)
+    else if(cparam1->managed.max_index > cparam2->managed.max_index)
+        HGOTO_DONE(1)
+    if(cparam1->managed.start_root_rows < cparam2->managed.start_root_rows)
+        HGOTO_DONE(-1)
+    else if(cparam1->managed.start_root_rows > cparam2->managed.start_root_rows)
+        HGOTO_DONE(1)
+
+    /* Compare other general parameters for heap */
+    if(cparam1->max_man_size < cparam2->max_man_size)
+        HGOTO_DONE(-1)
+    else if(cparam1->max_man_size > cparam2->max_man_size)
+        HGOTO_DONE(1)
+    if(cparam1->id_len < cparam2->id_len)
+        HGOTO_DONE(-1)
+    else if(cparam1->id_len > cparam2->id_len)
+        HGOTO_DONE(1)
+
+    /* Compare "important" parameters for any I/O pipeline filters */
+    if(cparam1->pline.nused < cparam2->pline.nused)
+        HGOTO_DONE(-1)
+    else if(cparam1->pline.nused > cparam2->pline.nused)
+        HGOTO_DONE(1)
+    else {
+        size_t u, v;       /* Local index variables */
+
+        /* Compare each filter */
+        for(u = 0; u < cparam1->pline.nused; u++) {
+            /* Check filter ID */
+            if(cparam1->pline.filter[u].id < cparam2->pline.filter[u].id)
+                HGOTO_DONE(-1)
+            else if(cparam1->pline.filter[u].id > cparam2->pline.filter[u].id)
+                HGOTO_DONE(1)
+
+            /* Check filter flags */
+            if(cparam1->pline.filter[u].flags < cparam2->pline.filter[u].flags)
+                HGOTO_DONE(-1)
+            else if(cparam1->pline.filter[u].flags > cparam2->pline.filter[u].flags)
+                HGOTO_DONE(1)
+
+/* Don't worry about comparing the filter names right now... */
+/* (they are expanded during the encode/decode process, but aren't copied
+ *      during the H5Z_append operation, generating false positive failures)
+ */
+#ifdef QAK
+            /* Check filter name */
+HDfprintf(stderr, "%s: Check 1.0\n", "H5HF_cmp_cparam_test");
+HDfprintf(stderr, "%s: cparam1->pline.filter[%Zu].name = %s\n", "H5HF_cmp_cparam_test", u, (cparam1->pline.filter[u].name ? cparam1->pline.filter[u].name : "<nil>"));
+HDfprintf(stderr, "%s: cparam2->pline.filter[%Zu].name = %s\n", "H5HF_cmp_cparam_test", u, (cparam2->pline.filter[u].name ? cparam2->pline.filter[u].name : "<nil>"));
+            if(!cparam1->pline.filter[u].name && cparam2->pline.filter[u].name)
+                HGOTO_DONE(-1)
+            else if(cparam1->pline.filter[u].name && !cparam2->pline.filter[u].name)
+                HGOTO_DONE(1)
+            else if(cparam1->pline.filter[u].name && cparam2->pline.filter[u].name) {
+                if((ret_value = HDstrcmp(cparam1->pline.filter[u].name, cparam2->pline.filter[u].name)))
+                    HGOTO_DONE(ret_value)
+            } /* end if */
+#endif /* QAK */
+
+            /* Check # of filter parameters */
+            if(cparam1->pline.filter[u].cd_nelmts < cparam2->pline.filter[u].cd_nelmts)
+                HGOTO_DONE(-1)
+            else if(cparam1->pline.filter[u].cd_nelmts > cparam2->pline.filter[u].cd_nelmts)
+                HGOTO_DONE(1)
+
+            /* Check filter parameters */
+            for(v = 0; v < cparam1->pline.filter[u].cd_nelmts; v++) {
+                if(cparam1->pline.filter[u].cd_values[v] < cparam2->pline.filter[u].cd_values[v])
+                    HGOTO_DONE(-1)
+                else if(cparam1->pline.filter[u].cd_values[v] > cparam2->pline.filter[u].cd_values[v])
+                    HGOTO_DONE(1)
+            } /* end for */
+
+        } /* end for */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_cmp_cparam_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_max_root_rows
+ *
+ * Purpose:	Retrieve the max. # of rows in the root indirect block
+ *
+ * Return:	Success:	Max. # of rows in root indirect block
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 22, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_get_max_root_rows(const H5HF_t *fh)
+{
+    unsigned	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+
+    /* Return max. # of rows in root indirect block */
+    ret_value = fh->hdr->man_dtable.max_root_rows;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_max_root_rows() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_dtable_width_test
+ *
+ * Purpose:	Retrieve the width of the doubling table for a heap
+ *
+ * Return:	Success:	Width of the doubling table
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 22, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_get_dtable_width_test(const H5HF_t *fh)
+{
+    unsigned	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+
+    /* Return width of doubling table */
+    ret_value = fh->hdr->man_dtable.cparam.width;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_dtable_width_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_dtable_max_drows_test
+ *
+ * Purpose:	Retrieve the max. # of direct block rows in any indirect block
+ *
+ * Return:	Success:	Max. # of direct block rows
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 22, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_get_dtable_max_drows_test(const H5HF_t *fh)
+{
+    unsigned	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+
+    /* Return max. # of direct blocks in any indirect block */
+    ret_value = fh->hdr->man_dtable.max_direct_rows;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_dtable_max_drows_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_iblock_max_drows_test
+ *
+ * Purpose:	Retrieve the max. # of direct block rows in an indirect block
+ *
+ * Note:        POS is indexed from 1 and is only really working for the
+ *              2nd-level indirect blocks (i.e. indirect blocks with
+ *              only direct block children)
+ *
+ * Return:	Success:	Max. # of direct block rows
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 22, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos)
+{
+    unsigned	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(pos);
+
+    /* Return max. # of direct blocks in this indirect block row */
+    ret_value = pos + (fh->hdr->man_dtable.max_direct_bits -
+            fh->hdr->man_dtable.first_row_bits) + 1;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_iblock_max_drows_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_dblock_size_test
+ *
+ * Purpose:	Retrieve the size of a direct block for a given row
+ *
+ * Return:	Success:	Size of direct block
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row)
+{
+    hsize_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+
+    /* Return direct block free space */
+    ret_value = fh->hdr->man_dtable.row_block_size[row];
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_dblock_size_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_dblock_free_test
+ *
+ * Purpose:	Retrieve the size of direct block free space for a given
+ *              direct or indirect block size
+ *
+ * Return:	Success:	Size of direct block free space
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, April 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row)
+{
+    hsize_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+
+    /* Return direct block free space */
+    ret_value = fh->hdr->man_dtable.row_tot_dblock_free[row];
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF_get_dblock_free_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_id_off_test
+ *
+ * Purpose:	Retrieve the offset for a [managed] heap ID
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, May 15, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_id_off_test(const H5HF_t *fh, const void *_id, hsize_t *obj_off)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(fh->hdr);
+    HDassert(id);
+    HDassert(obj_off);
+
+    /* Get the offset for a 'normal' heap ID */
+    id++;
+    UINT64DECODE_VAR(id, *obj_off, fh->hdr->heap_off_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_get_id_off_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_id_type_test
+ *
+ * Purpose:	Retrieve the type of a heap ID
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_id_type_test(const void *_id, unsigned char *obj_type)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(id);
+    HDassert(obj_type);
+
+    /* Get the type for a heap ID */
+    *obj_type = *id & H5HF_ID_TYPE_MASK;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_get_id_type_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_tiny_info_test
+ *
+ * Purpose:	Retrieve information about tiny object's ID length
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len,
+    hbool_t *len_extended)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(fh->hdr);
+    HDassert(max_len);
+    HDassert(len_extended);
+
+    /* Retrieve information about tiny object's ID encoding in a heap */
+    *max_len = fh->hdr->tiny_max_len;
+    *len_extended = fh->hdr->tiny_len_extended;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_get_tiny_info_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_get_huge_info_test
+ *
+ * Purpose:	Retrieve information about huge object's ID length
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id, hbool_t *ids_direct)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(fh);
+    HDassert(fh->hdr);
+    HDassert(ids_direct);
+
+    /* Retrieve information about tiny object's ID encoding in a heap */
+    if(next_id)
+        *next_id = fh->hdr->huge_next_id;
+    *ids_direct = fh->hdr->huge_ids_direct;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HF_get_huge_info_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HFtiny.c b/gatb-core/thirdparty/hdf5/src/H5HFtiny.c
new file mode 100644
index 0000000..a4cbdc1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HFtiny.c
@@ -0,0 +1,421 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HFtiny.c
+ *			Aug 14 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Routines for "tiny" objects in fractal heap
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HFpkg.h"		/* Fractal heaps			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Tiny object length information */
+#define H5HF_TINY_LEN_SHORT     16              /* Max. length able to be encoded in first heap ID byte */
+#define H5HF_TINY_MASK_SHORT    0x0F            /* Mask for length in first heap ID byte */
+#define H5HF_TINY_MASK_EXT      0x0FFF          /* Mask for length in two heap ID bytes */
+#define H5HF_TINY_MASK_EXT_1    0x0F00          /* Mask for length in first byte of two heap ID bytes */
+#define H5HF_TINY_MASK_EXT_2    0x00FF          /* Mask for length in second byte of two heap ID bytes */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5HF_tiny_op_real(H5HF_hdr_t *hdr, const uint8_t *id,
+    H5HF_operator_t op, void *op_data);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_init
+ *
+ * Purpose:	Initialize information for tracking 'tiny' objects
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_init(H5HF_hdr_t *hdr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+
+    /* Compute information about 'tiny' objects for the heap */
+
+    /* Check if tiny objects need an extra byte for their length */
+    /* (account for boundary condition when length of an object would need an
+     *  extra byte, but using that byte means that the extra length byte is
+     *  unneccessary)
+     */
+    if((hdr->id_len - 1) <= H5HF_TINY_LEN_SHORT) {
+        hdr->tiny_max_len = hdr->id_len - 1;
+        hdr->tiny_len_extended = FALSE;
+    } /* end if */
+    else if((hdr->id_len - 1) == (H5HF_TINY_LEN_SHORT + 1)) {
+        hdr->tiny_max_len = H5HF_TINY_LEN_SHORT;
+        hdr->tiny_len_extended = FALSE;
+    } /* end if */
+    else {
+        hdr->tiny_max_len = hdr->id_len - 2;
+        hdr->tiny_len_extended = TRUE;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_tiny_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_insert
+ *
+ * Purpose:	Pack a 'tiny' object in a heap ID
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_insert(H5HF_hdr_t *hdr, size_t obj_size, const void *obj, void *_id)
+{
+    uint8_t *id = (uint8_t *)_id;       /* Pointer to ID buffer */
+    size_t enc_obj_size;                /* Encoded object size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+#ifdef QAK
+HDfprintf(stderr, "%s: obj_size = %Zu\n", FUNC, obj_size);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(obj_size <= hdr->tiny_max_len);
+    HDassert(obj_size <= (H5HF_TINY_MASK_EXT + 1));
+    HDassert(obj);
+    HDassert(id);
+
+    /* Adjust object's size for encoding it */
+    enc_obj_size = obj_size - 1;
+
+    /* Encode object into ID */
+    if(!hdr->tiny_len_extended) {
+        *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
+                (enc_obj_size & H5HF_TINY_MASK_SHORT);
+    } /* end if */
+    else {
+        *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
+                ((enc_obj_size & H5HF_TINY_MASK_EXT_1) >> 8);
+        *id++ = enc_obj_size & H5HF_TINY_MASK_EXT_2;
+    } /* end else */
+    HDmemcpy(id, obj, obj_size);
+#ifdef H5_CLEAR_MEMORY
+HDmemset(id + obj_size, 0, (hdr->id_len - (1 + hdr->tiny_len_extended + obj_size)));
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Update statistics about heap */
+    hdr->tiny_size += obj_size;
+    hdr->tiny_nobjs++;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_tiny_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_get_obj_len
+ *
+ * Purpose:	Get the size of a 'tiny' object in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p)
+{
+    size_t enc_obj_size;                /* Encoded object size */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj_len_p);
+
+    /* Check if 'tiny' object ID is in extended form, and retrieve encoded size */
+    if(!hdr->tiny_len_extended)
+        enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
+    else
+	/* (performed in this odd way to avoid compiler bug on tg-login3 with
+	 *  gcc 3.2.2 - QAK)
+	 */
+        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
+
+    /* Set the object's length */
+    *obj_len_p = enc_obj_size + 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_tiny_get_obj_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_op_real
+ *
+ * Purpose:	Internal routine to perform operation on 'tiny' object
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HF_tiny_op_real(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op,
+    void *op_data)
+{
+    size_t enc_obj_size;                /* Encoded object size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(op);
+
+    /* Check if 'tiny' object ID is in extended form */
+    if(!hdr->tiny_len_extended) {
+        /* Retrieve the object's encoded length */
+        enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
+
+        /* Advance past flag byte(s) */
+        id++;
+    } /* end if */
+    else {
+        /* Retrieve the object's encoded length */
+	/* (performed in this odd way to avoid compiler bug on tg-login3 with
+	 *  gcc 3.2.2 - QAK)
+	 */
+        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
+
+        /* Advance past flag byte(s) */
+	/* (performed in two steps to avoid compiler bug on tg-login3 with
+	 *  gcc 3.2.2 - QAK)
+	 */
+        id++; id++;
+    } /* end else */
+
+    /* Call the user's 'op' callback */
+    if(op(id, (enc_obj_size + 1), op_data) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "application's callback failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_tiny_op_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_read
+ *
+ * Purpose:	Read a 'tiny' object from the heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_read(H5HF_hdr_t *hdr, const uint8_t *id, void *obj)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj);
+
+    /* Call the internal 'op' routine */
+    if(H5HF_tiny_op_real(hdr, id, H5HF_op_read, obj) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_tiny_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_op
+ *
+ * Purpose:	Operate directly on a 'tiny' object
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sept 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_op(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op,
+    void *op_data)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(op);
+
+    /* Call the internal 'op' routine routine */
+    if(H5HF_tiny_op_real(hdr, id, op, op_data) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "unable to operate on heap object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_tiny_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF_tiny_remove
+ *
+ * Purpose:	Remove a 'tiny' object from the heap statistics
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_tiny_remove(H5HF_hdr_t *hdr, const uint8_t *id)
+{
+    size_t enc_obj_size;                /* Encoded object size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+
+    /* Check if 'tiny' object ID is in extended form */
+    if(!hdr->tiny_len_extended)
+        enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
+    else
+	/* (performed in this odd way to avoid compiler bug on tg-login3 with
+	 *  gcc 3.2.2 - QAK)
+	 */
+        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
+
+    /* Update statistics about heap */
+    hdr->tiny_size -= (enc_obj_size + 1);
+    hdr->tiny_nobjs--;
+
+    /* Mark heap header as modified */
+    if(H5HF_hdr_dirty(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_tiny_remove() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HG.c b/gatb-core/thirdparty/hdf5/src/H5HG.c
new file mode 100644
index 0000000..a861042
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HG.c
@@ -0,0 +1,850 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Friday, March 27, 1998
+ *
+ * Purpose:	Operations on the global heap.  The global heap is the set of
+ *		all collections and each collection contains one or more
+ *		global heap objects.  An object belongs to exactly one
+ *		collection.  A collection is treated as an atomic entity for
+ *		the purposes of I/O and caching.
+ *
+ *		Each file has a small cache of global heap collections called
+ *		the CWFS list and recently accessed collections with free
+ *		space appear on this list.  As collections are accessed the
+ *		collection is moved toward the front of the list.  New
+ *		collections are added to the front of the list while old
+ *		collections are added to the end of the list.
+ *
+ *		The collection model reduces the overhead which would be
+ *		incurred if the global heap were a single object, and the
+ *		CWFS list allows the library to cheaply choose a collection
+ *		for a new object based on object size, amount of free space
+ *		in the collection, and temporal locality.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5HGpkg.h"		/* Global heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/*
+ * The maximum number of links allowed to a global heap object.
+ */
+#define H5HG_MAXLINK	65535
+
+/*
+ * The maximum number of indices allowed in a global heap object.
+ */
+#define H5HG_MAXIDX	65535
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static haddr_t H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5HG_heap_t struct */
+H5FL_DEFINE(H5HG_heap_t);
+
+/* Declare a free list to manage sequences of H5HG_obj_t's */
+H5FL_SEQ_DEFINE(H5HG_obj_t);
+
+/* Declare a PQ free list to manage heap chunks */
+H5FL_BLK_DEFINE(gheap_chunk);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_create
+ *
+ * Purpose:	Creates a global heap collection of the specified size.  If
+ *		SIZE is less than some minimum it will be readjusted.  The
+ *		new collection is allocated in the file and added to the
+ *		beginning of the CWFS list.
+ *
+ * Return:	Success:	Ptr to a cached heap.  The pointer is valid
+ *				only until some other hdf5 library function
+ *				is called.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, March 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size)
+{
+    H5HG_heap_t	*heap = NULL;
+    uint8_t	*p = NULL;
+    haddr_t	addr = HADDR_UNDEF;
+    size_t	n;
+    haddr_t	ret_value = HADDR_UNDEF;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    if(size < H5HG_MINSIZE)
+        size = H5HG_MINSIZE;
+    size = H5HG_ALIGN(size);
+
+    /* Create it */
+    H5_CHECK_OVERFLOW(size, size_t, hsize_t);
+    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_GHEAP, dxpl_id, (hsize_t)size)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to allocate file space for global heap")
+    if(NULL == (heap = H5FL_MALLOC(H5HG_heap_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "memory allocation failed")
+    heap->addr = addr;
+    heap->size = size;
+    heap->shared = H5F_SHARED(f);
+
+    if(NULL == (heap->chunk = H5FL_BLK_MALLOC(gheap_chunk, size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "memory allocation failed")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(heap->chunk, 0, size);
+#endif /* H5_CLEAR_MEMORY */
+    heap->nalloc = H5HG_NOBJS(f, size);
+    heap->nused = 1; /* account for index 0, which is used for the free object */
+    if(NULL == (heap->obj = H5FL_SEQ_MALLOC(H5HG_obj_t, heap->nalloc)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "memory allocation failed")
+
+    /* Initialize the header */
+    HDmemcpy(heap->chunk, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    p = heap->chunk + H5_SIZEOF_MAGIC;
+    *p++ = H5HG_VERSION;
+    *p++ = 0; /*reserved*/
+    *p++ = 0; /*reserved*/
+    *p++ = 0; /*reserved*/
+    H5F_ENCODE_LENGTH(f, p, size);
+
+    /*
+     * Padding so free space object is aligned. If malloc returned memory
+     * which was always at least H5HG_ALIGNMENT aligned then we could just
+     * align the pointer, but this might not be the case.
+     */
+    n = H5HG_ALIGN(p - heap->chunk) - (size_t)(p - heap->chunk);
+#ifdef OLD_WAY
+/* Don't bother zeroing out the rest of the info in the heap -QAK */
+    HDmemset(p, 0, n);
+#endif /* OLD_WAY */
+    p += n;
+
+    /* The freespace object */
+    heap->obj[0].size = size - H5HG_SIZEOF_HDR(f);
+    HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+    heap->obj[0].nrefs = 0;
+    heap->obj[0].begin = p;
+    UINT16ENCODE(p, 0);	/*object ID*/
+    UINT16ENCODE(p, 0);	/*reference count*/
+    UINT32ENCODE(p, 0); /*reserved*/
+    H5F_ENCODE_LENGTH(f, p, heap->obj[0].size);
+#ifdef OLD_WAY
+/* Don't bother zeroing out the rest of the info in the heap -QAK */
+    HDmemset (p, 0, (size_t)((heap->chunk+heap->size) - p));
+#endif /* OLD_WAY */
+
+    /* Add this heap to the beginning of the CWFS list */
+    if(H5F_cwfs_add(f, heap) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to add global heap collection to file's CWFS")
+
+    /* Add the heap to the cache */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_GHEAP, addr, heap, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to cache global heap collection")
+
+    ret_value = addr;
+
+done:
+    /* Cleanup on error */
+    if(!H5F_addr_defined(ret_value)) {
+        if(H5F_addr_defined(addr)) {
+            /* Release the space on disk */
+            if(H5MF_xfree(f, H5FD_MEM_GHEAP, dxpl_id, addr, (hsize_t)size) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, HADDR_UNDEF, "unable to free global heap")
+
+            /* Check if the heap object was allocated */
+            if(heap)
+                /* Destroy the heap object */
+                if(H5HG_free(heap) < 0)
+                    HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, HADDR_UNDEF, "unable to destroy global heap collection")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* H5HG_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_protect
+ *
+ * Purpose:	Convenience wrapper around H5AC_protect on an indirect block
+ *
+ * Return:	Pointer to indirect block on success, NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May  5, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HG_heap_t *
+H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
+{
+    H5HG_heap_t *heap;          /* Global heap */
+    H5HG_heap_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Lock the heap into memory */
+    if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, addr, f, rw)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect global heap")
+
+    /* Set the heap's address */
+    heap->addr = addr;
+
+    /* Set the return value */
+    ret_value = heap;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HG_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_alloc
+ *
+ * Purpose:	Given a heap with enough free space, this function will split
+ *		the free space to make a new empty heap object and initialize
+ *		the header.  SIZE is the exact size of the object data to be
+ *		stored. It will be increased to make room for the object
+ *		header and then rounded up for alignment.
+ *
+ * Return:	Success:	The heap object ID of the new object.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, March 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5HG_alloc(H5F_t *f, H5HG_heap_t *heap, size_t size, unsigned *heap_flags_ptr)
+{
+    size_t	idx;
+    uint8_t	*p;
+    size_t	need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(size);
+    size_t      ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(heap->obj[0].size>=need);
+    HDassert(heap_flags_ptr);
+
+    /*
+     * Find an ID for the new object. ID zero is reserved for the free space
+     * object.
+     */
+    if(heap->nused <= H5HG_MAXIDX)
+        idx = heap->nused++;
+    else {
+        for(idx = 1; idx < heap->nused; idx++)
+            if(NULL == heap->obj[idx].begin)
+                break;
+    } /* end else */
+
+    HDassert(idx < heap->nused);
+
+    /* Check if we need more room to store heap objects */
+    if(idx >= heap->nalloc) {
+        size_t new_alloc;       /* New allocation number */
+        H5HG_obj_t *new_obj;	/* New array of object descriptions */
+
+        /* Determine the new number of objects to index */
+        /* nalloc is *not* guaranteed to be a power of 2! - NAF 10/26/09 */
+        new_alloc = MIN(MAX(heap->nalloc * 2, (idx + 1)), (H5HG_MAXIDX + 1));
+        HDassert(idx < new_alloc);
+
+        /* Reallocate array of objects */
+        if(NULL == (new_obj = H5FL_SEQ_REALLOC(H5HG_obj_t, heap->obj, new_alloc)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, 0, "memory allocation failed")
+
+        /* Clear newly allocated space */
+        HDmemset(&new_obj[heap->nalloc], 0, (new_alloc - heap->nalloc) * sizeof(heap->obj[0]));
+
+        /* Update heap information */
+        heap->nalloc = new_alloc;
+        heap->obj = new_obj;
+        HDassert(heap->nalloc > heap->nused);
+    } /* end if */
+
+    /* Initialize the new object */
+    heap->obj[idx].nrefs = 0;
+    heap->obj[idx].size = size;
+    heap->obj[idx].begin = heap->obj[0].begin;
+    p = heap->obj[idx].begin;
+    UINT16ENCODE(p, idx);
+    UINT16ENCODE(p, 0); /*nrefs*/
+    UINT32ENCODE(p, 0); /*reserved*/
+    H5F_ENCODE_LENGTH (f, p, size);
+
+    /* Fix the free space object */
+    if(need == heap->obj[0].size) {
+	/*
+	 * All free space has been exhausted from this collection.
+	 */
+	heap->obj[0].size = 0;
+	heap->obj[0].begin = NULL;
+    } /* end if */
+    else if(heap->obj[0].size-need >= H5HG_SIZEOF_OBJHDR (f)) {
+	/*
+	 * Some free space remains and it's larger than a heap object header,
+	 * so write the new free heap object header to the heap.
+	 */
+	heap->obj[0].size -= need;
+	heap->obj[0].begin += need;
+	p = heap->obj[0].begin;
+	UINT16ENCODE(p, 0);	/*id*/
+	UINT16ENCODE(p, 0);	/*nrefs*/
+	UINT32ENCODE(p, 0);	/*reserved*/
+	H5F_ENCODE_LENGTH (f, p, heap->obj[0].size);
+	HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+    } /* end else-if */
+    else {
+	/*
+	 * Some free space remains but it's smaller than a heap object header,
+	 * so we don't write the header.
+	 */
+	heap->obj[0].size -= need;
+	heap->obj[0].begin += need;
+	HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+    }
+
+    /* Mark the heap as dirty */
+    *heap_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+    /* Set the return value */
+    ret_value = idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HG_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_extend
+ *
+ * Purpose:	Extend a heap to hold an object of SIZE bytes.
+ *		SIZE is the exact size of the object data to be
+ *		stored. It will be increased to make room for the object
+ *		header and then rounded up for alignment.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, June 12, 2004
+ *
+ * Modifications:
+ *
+ *		John Mainzer, 6/8/05
+ *		Modified the function to use the new dirtied parameter of
+ *		of H5AC_unprotect() instead of modifying the is_dirty
+ *		field of the cache info.
+ *
+ *		In this case, that required adding the new heap_dirtied_ptr
+ *		parameter to the function's argument list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_extend(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t need)
+{
+    H5HG_heap_t *heap = NULL;       /* Pointer to heap to extend */
+    unsigned heap_flags = H5AC__NO_FLAGS_SET;   /* Flags to unprotecting heap */
+    size_t  old_size;               /* Previous size of the heap's chunk */
+    uint8_t *new_chunk;             /* Pointer to new chunk information */
+    uint8_t *p;                     /* Pointer to raw heap info */
+    unsigned u;                     /* Local index variable */
+    herr_t  ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Protect the heap */
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
+
+    /* Re-allocate the heap information in memory */
+    if(NULL == (new_chunk = H5FL_BLK_REALLOC(gheap_chunk, heap->chunk, (heap->size + need))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "new heap allocation failed")
+#ifdef H5_CLEAR_MEMORY
+HDmemset(new_chunk + heap->size, 0, need);
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Adjust the size of the heap */
+    old_size = heap->size;
+    heap->size += need;
+
+    /* Encode the new size of the heap */
+    p = new_chunk + H5_SIZEOF_MAGIC + 1 /* version */ + 3 /* reserved */;
+    H5F_ENCODE_LENGTH(f, p, heap->size);
+
+    /* Move the pointers to the existing objects to their new locations */
+    for(u = 0; u < heap->nused; u++)
+        if(heap->obj[u].begin)
+            heap->obj[u].begin = new_chunk + (heap->obj[u].begin - heap->chunk);
+
+    /* Update the heap chunk pointer now */
+    heap->chunk = new_chunk;
+
+    /* Update the free space information for the heap  */
+    heap->obj[0].size += need;
+    if(heap->obj[0].begin == NULL)
+        heap->obj[0].begin = heap->chunk+old_size;
+    p = heap->obj[0].begin;
+    UINT16ENCODE(p, 0);	/*id*/
+    UINT16ENCODE(p, 0);	/*nrefs*/
+    UINT32ENCODE(p, 0);	/*reserved*/
+    H5F_ENCODE_LENGTH(f, p, heap->obj[0].size);
+    HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+
+    /* Resize the heap in the cache */
+    if(H5AC_resize_entry(heap, heap->size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize global heap in cache")
+
+    /* Mark the heap as dirty */
+    heap_flags |= H5AC__DIRTIED_FLAG;
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, heap->addr, heap, heap_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to unprotect heap")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG_extend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_insert
+ *
+ * Purpose:	A new object is inserted into the global heap.  It will be
+ *		placed in the first collection on the CWFS list which has
+ *		enough free space and that collection will be advanced one
+ *		position in the list.  If no collection on the CWFS list has
+ *		enough space then  a new collection will be created.
+ *
+ *		It is legal to push a zero-byte object onto the heap to get
+ *		the reference count features of heap objects.
+ *
+ * Return:	Success:	Non-negative, and a heap object handle returned
+ *				through the HOBJ pointer.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, March 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/)
+{
+    size_t	need;		/*total space needed for object		*/
+    size_t	idx;
+    haddr_t	addr;           /* Address of heap to add object within */
+    H5HG_heap_t	*heap = NULL;
+    unsigned 	heap_flags = H5AC__NO_FLAGS_SET;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(0 == size || obj);
+    HDassert(hobj);
+
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Find a large enough collection on the CWFS list */
+    need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(size);
+
+    /* Look for a heap in the file's CWFS that has enough space for the object */
+    addr = HADDR_UNDEF;
+    if(H5F_cwfs_find_free_heap(f, dxpl_id, need, &addr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "error trying to locate heap")
+
+    /*
+     * If we didn't find any collection with enough free space then allocate a
+     * new collection large enough for the message plus the collection header.
+     */
+    if(!H5F_addr_defined(addr)) {
+        addr = H5HG_create(f, dxpl_id, need + H5HG_SIZEOF_HDR(f));
+
+        if(!H5F_addr_defined(addr))
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to allocate a global heap collection")
+    } /* end if */
+    HDassert(H5F_addr_defined(addr));
+
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
+
+    /* Split the free space to make room for the new object */
+    if(0 == (idx = H5HG_alloc(f, heap, size, &heap_flags)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate global heap object")
+
+    /* Copy data into the heap */
+    if(size > 0) {
+        HDmemcpy(heap->obj[idx].begin + H5HG_SIZEOF_OBJHDR(f), obj, size);
+#ifdef OLD_WAY
+/* Don't bother zeroing out the rest of the info in the heap -QAK */
+        HDmemset(heap->obj[idx].begin + H5HG_SIZEOF_OBJHDR(f) + size, 0,
+                 need - (H5HG_SIZEOF_OBJHDR(f) + size));
+#endif /* OLD_WAY */
+    } /* end if */
+    heap_flags |= H5AC__DIRTIED_FLAG;
+
+    /* Return value */
+    hobj->addr = heap->addr;
+    hobj->idx = idx;
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, heap->addr, heap, heap_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to unprotect heap.")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HG_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_read
+ *
+ * Purpose:	Reads the specified global heap object into the buffer OBJECT
+ *		supplied by the caller.  If the caller doesn't supply a
+ *		buffer then one will be allocated.  The buffer should be
+ *		large enough to hold the result.
+ *
+ * Return:	Success:	The buffer containing the result.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, March 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/,
+    size_t *buf_size)
+{
+    H5HG_heap_t	*heap = NULL;           /* Pointer to global heap object */
+    size_t	size;                   /* Size of the heap object */
+    uint8_t	*p;                     /* Pointer to object in heap buffer */
+    void        *orig_object = object;  /* Keep a copy of the original object pointer */
+    void	*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(hobj);
+
+    /* Load the heap */
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_READ)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect global heap")
+
+    HDassert(hobj->idx < heap->nused);
+    HDassert(heap->obj[hobj->idx].begin);
+    size = heap->obj[hobj->idx].size;
+    p = heap->obj[hobj->idx].begin + H5HG_SIZEOF_OBJHDR(f);
+
+    /* Allocate a buffer for the object read in, if the user didn't give one */
+    if(!object && NULL == (object = H5MM_malloc(size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemcpy(object, p, size);
+
+    /*
+     * Advance the heap in the CWFS list. We might have done this already
+     * with the H5AC_protect(), but it won't hurt to do it twice.
+     */
+    if(heap->obj[0].begin) {
+        if(H5F_cwfs_advance_heap(f, heap, FALSE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMODIFY, NULL, "can't adjust file's CWFS")
+    } /* end if */
+
+    /* If the caller would like to know the heap object's size, set that */
+    if(buf_size)
+        *buf_size = size;
+
+    /* Set return value */
+    ret_value = object;
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    if(NULL == ret_value && NULL == orig_object && object)
+        H5MM_free(object);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_link
+ *
+ * Purpose:	Adjusts the link count for a global heap object by adding
+ *		ADJUST to the current value.  This function will fail if the
+ *		new link count would overflow.  Nothing special happens when
+ *		the link count reaches zero; in order for a heap object to be
+ *		removed one must call H5HG_remove().
+ *
+ * Return:	Success:	Number of links present after the adjustment.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, March 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5HG_link(H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust)
+{
+    H5HG_heap_t *heap = NULL;
+    unsigned heap_flags = H5AC__NO_FLAGS_SET;
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(hobj);
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Load the heap */
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
+
+    if(adjust != 0) {
+        HDassert(hobj->idx < heap->nused);
+        HDassert(heap->obj[hobj->idx].begin);
+        if((heap->obj[hobj->idx].nrefs + adjust) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "new link count would be out of range")
+        if((heap->obj[hobj->idx].nrefs + adjust) > H5HG_MAXLINK)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "new link count would be out of range")
+        heap->obj[hobj->idx].nrefs += adjust;
+        heap_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = heap->obj[hobj->idx].nrefs;
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, heap_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_remove
+ *
+ * Purpose:	Removes the specified object from the global heap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, March 30, 1998
+ *
+ * Modifications:
+ *
+ *		John Mainzer - 6/8/05
+ *		Modified function to use the dirtied parameter of
+ *		H5AC_unprotect() instead of modifying the is_dirty
+ *		field of the cache info.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
+{
+    H5HG_heap_t	*heap = NULL;
+    uint8_t	*p = NULL, *obj_start = NULL;
+    size_t	need;
+    unsigned	u;
+    unsigned    flags = H5AC__NO_FLAGS_SET;/* Whether the heap gets deleted */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(hobj);
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Load the heap */
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
+
+    HDassert(hobj->idx < heap->nused);
+    HDassert(heap->obj[hobj->idx].begin);
+    obj_start = heap->obj[hobj->idx].begin;
+    /* Include object header size */
+    need = H5HG_ALIGN(heap->obj[hobj->idx].size) + H5HG_SIZEOF_OBJHDR(f);
+
+    /* Move the new free space to the end of the heap */
+    for(u = 0; u < heap->nused; u++)
+        if(heap->obj[u].begin > heap->obj[hobj->idx].begin)
+            heap->obj[u].begin -= need;
+    if(NULL == heap->obj[0].begin) {
+        heap->obj[0].begin = heap->chunk + (heap->size - need);
+        heap->obj[0].size = need;
+        heap->obj[0].nrefs = 0;
+    } /* end if */
+    else
+        heap->obj[0].size += need;
+    HDmemmove(obj_start, obj_start + need,
+              heap->size - (size_t)((obj_start + need) - heap->chunk));
+    if(heap->obj[0].size >= H5HG_SIZEOF_OBJHDR(f)) {
+        p = heap->obj[0].begin;
+        UINT16ENCODE(p, 0); /*id*/
+        UINT16ENCODE(p, 0); /*nrefs*/
+        UINT32ENCODE(p, 0); /*reserved*/
+        H5F_ENCODE_LENGTH (f, p, heap->obj[0].size);
+    } /* end if */
+    HDmemset(heap->obj + hobj->idx, 0, sizeof(H5HG_obj_t));
+    flags |= H5AC__DIRTIED_FLAG;
+
+    if((heap->obj[0].size + H5HG_SIZEOF_HDR(f)) == heap->size) {
+        /*
+         * The collection is empty. Remove it from the CWFS list and return it
+         * to the file free list.
+         */
+        flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG; /* Indicate that the object was deleted, for the unprotect call */
+    } /* end if */
+    else {
+        /*
+         * If the heap is in the CWFS list then advance it one position.  The
+         * H5AC_protect() might have done that too, but that's okay.  If the
+         * heap isn't on the CWFS list then add it to the end.
+         */
+        if(H5F_cwfs_advance_heap(f, heap, TRUE) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMODIFY, FAIL, "can't adjust file's CWFS")
+    } /* end else */
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HG_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_free
+ *
+ * Purpose:	Destroys a global heap collection in memory
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, January 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_free(H5HG_heap_t *heap)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    HDassert(heap);
+
+    /* Remove the heap from the CWFS list */
+    if(H5F_cwfs_remove_heap(heap->shared, heap) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove heap from file's CWFS")
+
+    if(heap->chunk)
+        heap->chunk = H5FL_BLK_FREE(gheap_chunk, heap->chunk);
+    if(heap->obj)
+        heap->obj = H5FL_SEQ_FREE(H5HG_obj_t, heap->obj);
+    heap = H5FL_FREE(H5HG_heap_t, heap);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HG_free() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGcache.c b/gatb-core/thirdparty/hdf5/src/H5HGcache.c
new file mode 100644
index 0000000..533e26b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGcache.c
@@ -0,0 +1,415 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HGcache.c
+ *			Feb  5 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implement global heap metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HG_PACKAGE		/*suppress error about including H5HGpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5HGpkg.h"		/* Global heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache callbacks */
+static H5HG_heap_t *H5HG_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HG_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
+			 H5HG_heap_t *heap, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5HG_dest(H5F_t *f, H5HG_heap_t *heap);
+static herr_t H5HG_clear(H5F_t *f, H5HG_heap_t *heap, hbool_t destroy);
+static herr_t H5HG_size(const H5F_t *f, const H5HG_heap_t *heap, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5HG inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_GHEAP[1] = {{
+    H5AC_GHEAP_ID,
+    (H5AC_load_func_t)H5HG_load,
+    (H5AC_flush_func_t)H5HG_flush,
+    (H5AC_dest_func_t)H5HG_dest,
+    (H5AC_clear_func_t)H5HG_clear,
+    (H5AC_size_func_t)H5HG_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_load
+ *
+ * Purpose:	Loads a global heap collection from disk.
+ *
+ * Return:	Success:	Ptr to a global heap collection.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, March 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HG_heap_t *
+H5HG_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+{
+    H5HG_heap_t	*heap = NULL;
+    uint8_t	*p;
+    size_t	nalloc, need;
+    size_t      max_idx = 0;            /* The maximum index seen */
+    H5HG_heap_t	*ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+
+    /* Read the initial 4k page */
+    if(NULL == (heap = H5FL_CALLOC(H5HG_heap_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    heap->shared = H5F_SHARED(f);
+    if(NULL == (heap->chunk = H5FL_BLK_MALLOC(gheap_chunk, (size_t)H5HG_MINSIZE)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(H5F_block_read(f, H5FD_MEM_GHEAP, addr, (size_t)H5HG_MINSIZE, dxpl_id, heap->chunk) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read global heap collection")
+    p = heap->chunk;
+
+    /* Magic number */
+    if(HDmemcmp(p, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "bad global heap collection signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(H5HG_VERSION != *p++)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong version number in global heap")
+
+    /* Reserved */
+    p += 3;
+
+    /* Size */
+    H5F_DECODE_LENGTH(f, p, heap->size);
+    HDassert(heap->size >= H5HG_MINSIZE);
+
+    /*
+     * If we didn't read enough in the first try, then read the rest of the
+     * collection now.
+     */
+    if(heap->size > H5HG_MINSIZE) {
+	haddr_t next_addr = addr + (hsize_t)H5HG_MINSIZE;
+
+	if(NULL == (heap->chunk = H5FL_BLK_REALLOC(gheap_chunk, heap->chunk, heap->size)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+	if(H5F_block_read(f, H5FD_MEM_GHEAP, next_addr, (heap->size - H5HG_MINSIZE), dxpl_id, heap->chunk + H5HG_MINSIZE) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read global heap collection")
+    } /* end if */
+
+    /* Decode each object */
+    p = heap->chunk + H5HG_SIZEOF_HDR(f);
+    nalloc = H5HG_NOBJS(f, heap->size);
+
+    /* Calloc the obj array because the file format spec makes no guarantee
+     * about the order of the objects, and unused slots must be set to zero.
+     */
+    if(NULL == (heap->obj = H5FL_SEQ_CALLOC(H5HG_obj_t, nalloc)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    heap->nalloc = nalloc;
+    while(p < (heap->chunk + heap->size)) {
+	if((p + H5HG_SIZEOF_OBJHDR(f)) > (heap->chunk + heap->size)) {
+	    /*
+	     * The last bit of space is too tiny for an object header, so we
+	     * assume that it's free space.
+	     */
+	    HDassert(NULL == heap->obj[0].begin);
+	    heap->obj[0].size = ((const uint8_t *)heap->chunk + heap->size) - p;
+	    heap->obj[0].begin = p;
+	    p += heap->obj[0].size;
+	} /* end if */
+        else {
+	    unsigned idx;
+	    uint8_t *begin = p;
+
+	    UINT16DECODE(p, idx);
+
+            /* Check if we need more room to store heap objects */
+            if(idx >= heap->nalloc) {
+                size_t new_alloc;       /* New allocation number */
+                H5HG_obj_t *new_obj;	/* New array of object descriptions */
+
+                /* Determine the new number of objects to index */
+                new_alloc = MAX(heap->nalloc * 2, (idx + 1));
+                HDassert(idx < new_alloc);
+
+                /* Reallocate array of objects */
+                if(NULL == (new_obj = H5FL_SEQ_REALLOC(H5HG_obj_t, heap->obj, new_alloc)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+                /* Clear newly allocated space */
+                HDmemset(&new_obj[heap->nalloc], 0, (new_alloc - heap->nalloc) * sizeof(heap->obj[0]));
+
+                /* Update heap information */
+                heap->nalloc = new_alloc;
+                heap->obj = new_obj;
+                HDassert(heap->nalloc > heap->nused);
+            } /* end if */
+
+	    UINT16DECODE(p, heap->obj[idx].nrefs);
+	    p += 4; /*reserved*/
+	    H5F_DECODE_LENGTH(f, p, heap->obj[idx].size);
+	    heap->obj[idx].begin = begin;
+
+	    /*
+	     * The total storage size includes the size of the object header
+	     * and is zero padded so the next object header is properly
+	     * aligned. The entire obj array was calloc'ed, so no need to zero
+	     * the space here. The last bit of space is the free space object
+	     * whose size is never padded and already includes the object
+	     * header.
+	     */
+	    if(idx > 0) {
+		need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(heap->obj[idx].size);
+
+                if(idx > max_idx)
+                    max_idx = idx;
+	    } /* end if */
+            else
+		need = heap->obj[idx].size;
+	    p = begin + need;
+	} /* end else */
+    } /* end while */
+    HDassert(p == heap->chunk + heap->size);
+    HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+
+    /* Set the next index value to use */
+    if(max_idx > 0)
+        heap->nused = max_idx + 1;
+    else
+        heap->nused = 1;
+
+    HDassert(max_idx < heap->nused);
+
+    /* Add the new heap to the CWFS list for the file */
+    if(H5F_cwfs_add(f, heap) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "unable to add global heap collection to file's CWFS")
+
+    ret_value = heap;
+
+done:
+    if(!ret_value && heap)
+        if(H5HG_free(heap) < 0)
+	    HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy global heap collection")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_flush
+ *
+ * Purpose:	Flushes a global heap collection from memory to disk if it's
+ *		dirty.  Optionally deletes teh heap from memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, March 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HG_heap_t *heap, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_eq(addr, heap->addr));
+    HDassert(heap);
+
+    if(heap->cache_info.is_dirty) {
+	if(H5F_block_write(f, H5FD_MEM_GHEAP, addr, heap->size, dxpl_id, heap->chunk) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write global heap collection to file")
+	heap->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5HG_dest(f, heap) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_dest
+ *
+ * Purpose:	Destroys a global heap collection in memory
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, January 15, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG_dest(H5F_t *f, H5HG_heap_t *heap)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(heap);
+
+    /* Verify that node is clean */
+    HDassert(heap->cache_info.is_dirty == FALSE);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!heap->cache_info.free_file_space_on_destroy || H5F_addr_defined(heap->cache_info.addr));
+
+    /* Check for freeing file space for globalheap */
+    if(heap->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_GHEAP, H5AC_dxpl_id, heap->cache_info.addr, (hsize_t)heap->size) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free global heap")
+    } /* end if */
+
+    /* Destroy global heap collection */
+    if(H5HG_free(heap) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HG_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_clear
+ *
+ * Purpose:	Mark a global heap in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG_clear(H5F_t *f, H5HG_heap_t *heap, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(heap);
+
+    /* Mark heap as clean */
+    heap->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HG_dest(f, heap) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HG_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_size
+ *
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *              H5HG_heap_t on disk, and return it in *len_ptr.  On failure,
+ *              the value of *len_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *              5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG_size(const H5F_t H5_ATTR_UNUSED *f, const H5HG_heap_t *heap, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(heap);
+    HDassert(size_ptr);
+
+    *size_ptr = heap->size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HG_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGdbg.c b/gatb-core/thirdparty/hdf5/src/H5HGdbg.c
new file mode 100644
index 0000000..16d8c49
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGdbg.c
@@ -0,0 +1,179 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Wednesday, July 9, 2003
+ *
+ * Purpose:	Global Heap object debugging functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		        */
+#include "H5HGpkg.h"		/* Global heaps				*/
+#include "H5Iprivate.h"		/* ID Functions		                */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_debug
+ *
+ * Purpose:	Prints debugging information about a global heap collection.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Mar 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+	  int fwidth)
+{
+    unsigned		u, nused, maxobj;
+    unsigned		j, k;
+    H5HG_heap_t		*h = NULL;
+    uint8_t		*p = NULL;
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined (addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    if(NULL == (h = H5HG_protect(f, dxpl_id, addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap collection");
+
+    HDfprintf(stream, "%*sGlobal Heap Collection...\n", indent, "");
+    HDfprintf(stream, "%*s%-*s %d\n", indent, "", fwidth,
+	    "Dirty:",
+	    (int)(h->cache_info.is_dirty));
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	    "Total collection size in file:",
+	    (unsigned long)(h->size));
+
+    for(u = 1, nused = 0, maxobj = 0; u < h->nused; u++)
+	if(h->obj[u].begin) {
+	    nused++;
+	    if (u>maxobj)
+                maxobj = u;
+	}
+    HDfprintf(stream, "%*s%-*s %u/%lu/", indent, "", fwidth,
+	     "Objects defined/allocated/max:",
+	     nused,
+             (unsigned long)h->nalloc);
+    if(nused)
+        HDfprintf(stream, "%u\n", maxobj);
+    else
+        HDfprintf(stream, "NA\n");
+
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	     "Free space:",
+	     (unsigned long)(h->obj[0].size));
+
+    for(u = 1; u < h->nused; u++)
+	if(h->obj[u].begin) {
+            char buf[64];
+
+	    HDsnprintf(buf, sizeof(buf), "Object %u", u);
+	    HDfprintf(stream, "%*s%s\n", indent, "", buf);
+	    HDfprintf(stream, "%*s%-*s %lu\n", indent + 3, "", MIN(fwidth - 3, 0),
+		     "Obffset in block:",
+		     (unsigned long)(h->obj[u].begin - h->chunk));
+	    HDfprintf(stream, "%*s%-*s %d\n", indent + 3, "", MIN(fwidth - 3, 0),
+		     "Reference count:",
+		     h->obj[u].nrefs);
+	    HDfprintf(stream, "%*s%-*s %lu/%lu\n", indent + 3, "",
+		     MIN(fwidth - 3, 0),
+		     "Size of object body:",
+		     (unsigned long)(h->obj[u].size),
+		     (unsigned long)H5HG_ALIGN(h->obj[u].size));
+	    p = h->obj[u].begin + H5HG_SIZEOF_OBJHDR(f);
+	    for(j = 0; j < h->obj[u].size; j += 16) {
+		HDfprintf(stream, "%*s%04u: ", indent + 6, "", j);
+		for(k = 0; k < 16; k++) {
+		    if(8 == k)
+                        HDfprintf(stream, " ");
+		    if(j + k < h->obj[u].size)
+			HDfprintf(stream, "%02x ", p[j + k]);
+		    else
+			HDfputs("   ", stream);
+		}
+		for(k = 0; k < 16 && j + k < h->obj[u].size; k++) {
+		    if(8 == k)
+                        HDfprintf(stream, " ");
+		    HDfputc(p[j + k]>' ' && p[j + k] <= '~' ? p[j + k] : '.', stream);
+		}
+		HDfprintf(stream, "\n");
+	    }
+	}
+
+done:
+    if (h && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, addr, h, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release object header");
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HG_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGpkg.h b/gatb-core/thirdparty/hdf5/src/H5HGpkg.h
new file mode 100644
index 0000000..f3546a2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGpkg.h
@@ -0,0 +1,149 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *             Wednesday, July 9, 2003
+ *
+ * Purpose:     This file contains declarations which are visible
+ *              only within the H5HG package. Source files outside the
+ *              H5HG package should include H5HGprivate.h instead.
+ */
+#ifndef H5HG_PACKAGE
+#error "Do not include this file outside the H5HG package!"
+#endif
+
+#ifndef _H5HGpkg_H
+#define _H5HGpkg_H
+
+/* Get package's private header */
+#include "H5HGprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5FLprivate.h"	/* Free lists                           */
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* The cache subclass */
+H5_DLLVAR const H5AC_class_t H5AC_GHEAP[1];
+
+/* Declare extern the free list to manage the H5HG_t struct */
+H5FL_EXTERN(H5HG_heap_t);
+
+/* Declare extern the free list to manage sequences of H5HG_obj_t's */
+H5FL_SEQ_EXTERN(H5HG_obj_t);
+
+/* Declare extern the PQ free list to manage heap chunks */
+H5FL_BLK_EXTERN(gheap_chunk);
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/*
+ * Global heap collection version.
+ */
+#define H5HG_VERSION	1
+
+/*
+ * All global heap collections are at least this big.  This allows us to read
+ * most collections with a single read() since we don't have to read a few
+ * bytes of header to figure out the size.  If the heap is larger than this
+ * then a second read gets the rest after we've decoded the header.
+ */
+#define H5HG_MINSIZE	4096
+
+/*
+ * Pad all global heap messages to a multiple of eight bytes so we can load
+ * the entire collection into memory and operate on it there.  Eight should
+ * be sufficient for machines that have alignment constraints because our
+ * largest data type is eight bytes.
+ */
+#define H5HG_ALIGNMENT	8
+#define H5HG_ALIGN(X)	(H5HG_ALIGNMENT*(((X)+H5HG_ALIGNMENT-1)/H5HG_ALIGNMENT))
+#define H5HG_ISALIGNED(X) ((X)==H5HG_ALIGN(X))
+
+/*
+ * The size of the collection header, always a multiple of the alignment so
+ * that the stuff that follows the header is aligned.
+ */
+#define H5HG_SIZEOF_HDR(f)						      \
+    (size_t)H5HG_ALIGN(4 +			/*magic number		*/ \
+                       1 +			/*version number	*/ \
+                       3 +			/*reserved		*/ \
+                       H5F_SIZEOF_SIZE(f))	/*collection size	*/
+
+/*
+ * The overhead associated with each object in the heap, always a multiple of
+ * the alignment so that the stuff that follows the header is aligned.
+ */
+#define H5HG_SIZEOF_OBJHDR(f)						      \
+    (size_t)H5HG_ALIGN(2 +			/*object id number	*/ \
+                       2 +			/*reference count	*/ \
+                       4 +			/*reserved		*/ \
+                       H5F_SIZEOF_SIZE(f))	/*object data size	*/
+
+/*
+ * The initial guess for the number of messages in a collection.  We assume
+ * that all objects in that collection are zero length, giving the maximum
+ * possible number of objects in the collection.  The collection itself has
+ * some overhead and each message has some overhead.  The `+2' accounts for
+ * rounding and for the free space object.
+ */
+#define H5HG_NOBJS(f,z) ((((z)-H5HG_SIZEOF_HDR(f))/		      \
+                          H5HG_SIZEOF_OBJHDR(f)+2))
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+typedef struct H5HG_obj_t {
+    int		nrefs;		/*reference count		*/
+    size_t		size;		/*total size of object		*/
+    uint8_t		*begin;		/*ptr to object into heap->chunk*/
+} H5HG_obj_t;
+
+/* Forward declarations for fields */
+struct H5F_file_t;
+
+struct H5HG_heap_t {
+    H5AC_info_t cache_info; /* Information for H5AC cache functions, _must_ be */
+                            /* first field in structure */
+    haddr_t		addr;		/*collection address		*/
+    size_t		size;		/*total size of collection	*/
+    uint8_t		*chunk;		/*the collection, incl. header	*/
+    size_t		nalloc;		/*numb object slots allocated	*/
+    size_t		nused;		/*number of slots used		*/
+                                        /* If this value is >65535 then all indices */
+                                        /* have been used at some time and the */
+                                        /* correct new index should be searched for */
+    struct H5F_file_t   *shared;        /* shared file */
+    H5HG_obj_t	*obj;		/*array of object descriptions	*/
+};
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+H5_DLL herr_t H5HG_free(H5HG_heap_t *heap);
+H5_DLL H5HG_heap_t *H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw);
+
+#endif /* _H5HGpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGprivate.h b/gatb-core/thirdparty/hdf5/src/H5HGprivate.h
new file mode 100644
index 0000000..3765c47
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGprivate.h
@@ -0,0 +1,78 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Friday, March 27, 1998
+ */
+#ifndef _H5HGprivate_H
+#define _H5HGprivate_H
+
+/* Include package's public header */
+#include "H5HGpublic.h"
+
+/* Private headers needed by this file. */
+#include "H5Fprivate.h"		/* File access				*/
+
+/* Information to locate object in global heap */
+typedef struct H5HG_t {
+    haddr_t		addr;		/*address of collection		*/
+    size_t		idx;		/*object ID within collection	*/
+} H5HG_t;
+
+/* Typedef for heap in memory (defined in H5HGpkg.h) */
+typedef struct H5HG_heap_t H5HG_heap_t;
+
+
+/*
+ * Limit global heap collections to the some reasonable size.  This is
+ * fairly arbitrary, but needs to be small enough that no more than H5HG_MAXIDX
+ * objects will be allocated from a single heap.
+ */
+#define H5HG_MAXSIZE	65536
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5HG_PACKAGE
+#define H5HG_ADDR(H)            ((H)->addr)
+#define H5HG_SIZE(H)            ((H)->size)
+#define H5HG_FREE_SIZE(H)       ((H)->obj[0].size)
+#else /* H5HG_PACKAGE */
+#define H5HG_ADDR(H)            (H5HG_get_addr(H))
+#define H5HG_SIZE(H)            (H5HG_get_size(H))
+#define H5HG_FREE_SIZE(H)       (H5HG_get_free_size(H))
+#endif /* H5HG_PACKAGE */
+
+
+/* Main global heap routines */
+H5_DLL herr_t H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj,
+			   H5HG_t *hobj/*out*/);
+H5_DLL void *H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object, size_t *buf_size/*out*/);
+H5_DLL int H5HG_link(H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust);
+H5_DLL herr_t H5HG_remove(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj);
+
+/* Support routines */
+H5_DLL herr_t H5HG_extend(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t need);
+
+/* Query routines */
+H5_DLL haddr_t H5HG_get_addr(const H5HG_heap_t *h);
+H5_DLL size_t H5HG_get_size(const H5HG_heap_t *h);
+H5_DLL size_t H5HG_get_free_size(const H5HG_heap_t *h);
+
+/* Debugging functions */
+H5_DLL herr_t H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+			  int fwidth);
+
+#endif /* _H5HGprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGpublic.h b/gatb-core/thirdparty/hdf5/src/H5HGpublic.h
new file mode 100644
index 0000000..01cd60c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGpublic.h
@@ -0,0 +1,33 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Friday, March 27, 1998
+ */
+#ifndef _H5HGpublic_H
+#define _H5HGpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5HGquery.c b/gatb-core/thirdparty/hdf5/src/H5HGquery.c
new file mode 100644
index 0000000..a1b3777
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HGquery.c
@@ -0,0 +1,145 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Wednesday, July 20, 2011
+ *
+ * Purpose:	Query routines for global heaps.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HGpkg.h"		/* Global heaps				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_get_addr
+ *
+ * Purpose:	Query the address of a global heap object.
+ *
+ * Return:	Address of heap on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5HG_get_addr(const H5HG_heap_t *heap)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(heap);
+
+    FUNC_LEAVE_NOAPI(heap->addr)
+} /* H5HG_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_get_size
+ *
+ * Purpose:	Query the size of a global heap object.
+ *
+ * Return:	Size of heap on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5HG_get_size(const H5HG_heap_t *heap)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(heap);
+
+    FUNC_LEAVE_NOAPI(heap->size)
+} /* H5HG_get_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HG_get_free_size
+ *
+ * Purpose:	Query the free size of a global heap object.
+ *
+ * Return:	Free size of heap on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 20, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5HG_get_free_size(const H5HG_heap_t *heap)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(heap);
+
+    FUNC_LEAVE_NOAPI(heap->obj[0].size)
+} /* H5HG_get_free_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HL.c b/gatb-core/thirdparty/hdf5/src/H5HL.c
new file mode 100644
index 0000000..a5d01cd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HL.c
@@ -0,0 +1,1223 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HL.c
+ *			Jul 16 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Heap functions for the local heaps used by symbol
+ *			tables to store names (among other things).
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5HLpkg.h"		/* Local Heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5HL_MIN_HEAP   128             /* Minimum size to reduce heap buffer to */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static H5HL_free_t *H5HL_remove_free(H5HL_t *heap, H5HL_free_t *fl);
+static herr_t H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5HL_free_t struct */
+H5FL_DEFINE(H5HL_free_t);
+
+/* Declare a PQ free list to manage the heap chunk information */
+H5FL_BLK_DEFINE(lheap_chunk);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_create
+ *
+ * Purpose:	Creates a new heap data structure on disk and caches it
+ *		in memory.  SIZE_HINT is a hint for the initial size of the
+ *		data area of the heap.	If size hint is invalid then a
+ *		reasonable (but probably not optimal) size will be chosen.
+ *		If the heap ever has to grow, then REALLOC_HINT is the
+ *		minimum amount by which the heap will grow.
+ *
+ * Return:	Success:	Non-negative. The file address of new heap is
+ *				returned through the ADDR argument.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 16 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/)
+{
+    H5HL_t	*heap = NULL;           /* Heap created */
+    H5HL_prfx_t *prfx = NULL;           /* Heap prefix */
+    hsize_t	total_size;		/* Total heap size on disk	*/
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(addr_p);
+
+    /* Adjust size hint as necessary */
+    if(size_hint && size_hint < H5HL_SIZEOF_FREE(f))
+	size_hint = H5HL_SIZEOF_FREE(f);
+    size_hint = H5HL_ALIGN(size_hint);
+
+    /* Allocate new heap structure */
+    if(NULL == (heap = H5HL_new(H5F_SIZEOF_SIZE(f), H5F_SIZEOF_ADDR(f), H5HL_SIZEOF_HDR(f))))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate new heap struct")
+
+    /* Allocate file space */
+    total_size = heap->prfx_size + size_hint;
+    if(HADDR_UNDEF == (heap->prfx_addr = H5MF_alloc(f, H5FD_MEM_LHEAP, dxpl_id, total_size)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate file memory")
+
+    /* Initialize info */
+    heap->single_cache_obj = TRUE;
+    heap->dblk_addr = heap->prfx_addr + (hsize_t)heap->prfx_size;
+    heap->dblk_size = size_hint;
+    if(size_hint)
+        if(NULL == (heap->dblk_image = H5FL_BLK_CALLOC(lheap_chunk, size_hint)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+    /* free list */
+    if(size_hint) {
+	if(NULL == (heap->freelist = H5FL_MALLOC(H5HL_free_t)))
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+	heap->freelist->offset = 0;
+	heap->freelist->size = size_hint;
+	heap->freelist->prev = heap->freelist->next = NULL;
+        heap->free_block = 0;
+    } /* end if */
+    else {
+	heap->freelist = NULL;
+        heap->free_block = H5HL_FREE_NULL;
+    } /* end else */
+
+    /* Allocate the heap prefix */
+    if(NULL == (prfx = H5HL_prfx_new(heap)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+    /* Add to cache */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap prefix")
+
+    /* Set address to return */
+    *addr_p = heap->prfx_addr;
+
+done:
+    if(ret_value < 0) {
+        if(prfx) {
+            if(H5HL_prfx_dest(prfx) < 0)
+                HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+        } /* end if */
+        else {
+            if(heap) {
+                if(H5F_addr_defined(heap->prfx_addr))
+                    if(H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, heap->prfx_addr, total_size) < 0)
+                        HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "can't release heap data?")
+                if(H5HL_dest(heap) < 0)
+                    HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dblk_realloc
+ *
+ * Purpose:	Reallocate data block for heap
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size)
+{
+    H5HL_dblk_t *dblk;                  /* Local heap data block */
+    haddr_t old_addr;                   /* Old location of heap data block */
+    haddr_t new_addr;                   /* New location of heap data block */
+    size_t old_heap_size;               /* Old size of heap data block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(heap);
+    HDassert(new_heap_size > 0);
+
+    /* Release old space on disk */
+    old_addr = heap->dblk_addr;
+    old_heap_size = heap->dblk_size;
+    H5_CHECK_OVERFLOW(old_heap_size, size_t, hsize_t);
+    if(H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, old_addr, (hsize_t)old_heap_size) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "can't release old heap data?")
+
+    /* Allocate new space on disk */
+    H5_CHECK_OVERFLOW(new_heap_size, size_t, hsize_t);
+    if(HADDR_UNDEF == (new_addr = H5MF_alloc(f, H5FD_MEM_LHEAP, dxpl_id, (hsize_t)new_heap_size)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate file space for heap")
+
+    /* Update heap info*/
+    heap->dblk_addr = new_addr;
+    heap->dblk_size = new_heap_size;
+
+    /* Check if heap data block actually moved in the file */
+    if(H5F_addr_eq(old_addr, new_addr)) {
+        /* Check if heap data block is contiguous w/prefix */
+        if(heap->single_cache_obj) {
+            /* Sanity check */
+            HDassert(H5F_addr_eq(heap->prfx_addr + heap->prfx_size, old_addr));
+            HDassert(heap->prfx);
+
+            /* Resize the heap prefix in the cache */
+            if(H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_heap_size)) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache")
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5F_addr_ne(heap->prfx_addr + heap->prfx_size, old_addr));
+            HDassert(heap->dblk);
+
+            /* Resize the heap data block in the cache */
+            if(H5AC_resize_entry(heap->dblk, (size_t)new_heap_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Check if heap data block was contiguous w/prefix previously */
+        if(heap->single_cache_obj) {
+            /* Create new heap data block */
+            if(NULL == (dblk = H5HL_dblk_new(heap)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate local heap data block")
+
+            /* Resize current heap prefix */
+            heap->prfx_size = H5HL_SIZEOF_HDR(f);
+            if(H5AC_resize_entry(heap->prfx, (size_t)heap->prfx_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap prefix in cache")
+
+            /* Insert data block into cache (pinned) */
+            if(H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_DBLK, new_addr, dblk, H5AC__PIN_ENTRY_FLAG) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap data block")
+            dblk = NULL;
+
+            /* Reset 'single cache object' flag */
+            heap->single_cache_obj = FALSE;
+        } /* end if */
+        else {
+            /* Resize the heap data block in the cache */
+            /* (ignore [unlikely] case where heap data block ends up
+             *      contiguous w/heap prefix again.
+             */
+            if(H5AC_resize_entry(heap->dblk, (size_t)new_heap_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap data block in cache")
+
+            /* Relocate the heap data block in the cache */
+            if(H5AC_move_entry(f, H5AC_LHEAP_DBLK, old_addr, new_addr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move heap data block in cache")
+        } /* end else */
+    } /* end else */
+
+done:
+    if(ret_value < 0) {
+        /* Restore old heap address & size */
+        heap->dblk_addr = old_addr;
+        heap->dblk_size = old_heap_size;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_dblk_realloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL_minimize_heap_space
+ *
+ * Purpose:     Go through the heap's freelist and determine if we can
+ *              eliminate the free blocks at the tail of the buffer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Bill Wendling
+ *              wendling at ncsa.uiuc.edu
+ *              Sept. 16, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap)
+{
+    size_t new_heap_size = heap->dblk_size;     /* New size of heap */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(heap);
+
+    /*
+     * Check to see if we can reduce the size of the heap in memory by
+     * eliminating free blocks at the tail of the buffer before flushing the
+     * buffer out.
+     */
+    if(heap->freelist) {
+        H5HL_free_t    *tmp_fl;
+        H5HL_free_t    *last_fl = NULL;
+
+        /* Search for a free block at the end of the buffer */
+        for(tmp_fl = heap->freelist; tmp_fl; tmp_fl = tmp_fl->next)
+            /* Check if the end of this free block is at the end of the buffer */
+            if(tmp_fl->offset + tmp_fl->size == heap->dblk_size) {
+                last_fl = tmp_fl;
+                break;
+            } /* end if */
+
+        /*
+         * Found free block at the end of the buffer, decide what to do
+         * about it
+         */
+        if(last_fl) {
+            /*
+             * If the last free block's size is more than half the memory
+             * buffer size (and the memory buffer is larger than the
+             * minimum size), reduce or eliminate it.
+             */
+            if(last_fl->size >= (heap->dblk_size / 2) && heap->dblk_size > H5HL_MIN_HEAP) {
+                /*
+                 * Reduce size of buffer until it's too small or would
+                 * eliminate the free block
+                 */
+                while(new_heap_size > H5HL_MIN_HEAP &&
+                        new_heap_size >= (last_fl->offset + H5HL_SIZEOF_FREE(f)))
+                    new_heap_size /= 2;
+
+                /*
+                 * Check if reducing the memory buffer size would
+                 * eliminate the free block
+                 */
+                if(new_heap_size < (last_fl->offset + H5HL_SIZEOF_FREE(f))) {
+                    /* Check if this is the only block on the free list */
+                    if(last_fl->prev == NULL && last_fl->next == NULL) {
+                        /* Double the new memory size */
+                        new_heap_size *= 2;
+
+                        /* Truncate the free block */
+                        last_fl->size = H5HL_ALIGN(new_heap_size - last_fl->offset);
+                        new_heap_size = last_fl->offset + last_fl->size;
+                        HDassert(last_fl->size >= H5HL_SIZEOF_FREE(f));
+                    } /* end if */
+                    else {
+                        /*
+                         * Set the size of the memory buffer to the start
+                         * of the free list
+                         */
+                        new_heap_size = last_fl->offset;
+
+                        /* Eliminate the free block from the list */
+                        last_fl = H5HL_remove_free(heap, last_fl);
+                    } /* end else */
+                } /* end if */
+                else {
+                    /* Truncate the free block */
+                    last_fl->size = H5HL_ALIGN(new_heap_size - last_fl->offset);
+                    new_heap_size = last_fl->offset + last_fl->size;
+                    HDassert(last_fl->size >= H5HL_SIZEOF_FREE(f));
+                    HDassert(last_fl->size == H5HL_ALIGN(last_fl->size));
+                } /* end else */
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    /*
+     * If the heap grew smaller than disk storage then move the
+     * data segment of the heap to another contiguous block of disk
+     * storage.
+     */
+    if(new_heap_size != heap->dblk_size) {
+	HDassert(new_heap_size < heap->dblk_size);
+
+        /* Resize the memory buffer */
+        if(NULL == (heap->dblk_image = H5FL_BLK_REALLOC(lheap_chunk, heap->dblk_image, new_heap_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+        /* Reallocate data block in file */
+        if(H5HL_dblk_realloc(f, dxpl_id, heap, new_heap_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "reallocating data block failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HL_minimize_heap_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL_protect
+ *
+ * Purpose:     This function is a wrapper for the H5AC_protect call.
+ *
+ * Return:      Success:    Non-NULL pointer to the local heap prefix.
+ *              Failure:    NULL
+ *
+ * Programmer:  Bill Wendling
+ *              wendling at ncsa.uiuc.edu
+ *              Sept. 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HL_t *
+H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
+{
+    H5HL_cache_prfx_ud_t prfx_udata; /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
+    H5HL_dblk_t *dblk = NULL;   /* Local heap data block */
+    H5HL_t *heap;               /* Heap data structure */
+    unsigned prfx_cache_flags = H5AC__NO_FLAGS_SET;         /* Cache flags for unprotecting prefix entry */
+    unsigned dblk_cache_flags = H5AC__NO_FLAGS_SET;         /* Cache flags for unprotecting data block entry */
+    H5HL_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Construct the user data for protect callback */
+    prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
+    prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
+    prfx_udata.prfx_addr = addr;
+    prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+
+    /* Protect the local heap prefix */
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, rw)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap prefix")
+
+    /* Get the pointer to the heap */
+    heap = prfx->heap;
+
+    /* Check if the heap is already pinned in memory */
+    /* (for re-entrant situation) */
+    if(heap->prots == 0) {
+        /* Check if heap has separate data block */
+        if(heap->single_cache_obj) {
+            /* Set the flag for pinning the prefix when unprotecting it */
+            prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG;
+        } /* end if */
+        else {
+            H5HL_cache_dblk_ud_t dblk_udata; /* User data for protecting local heap data block */
+
+            /* Construct the user data for protect callback */
+            dblk_udata.heap = heap;
+            dblk_udata.loaded = FALSE;
+
+            /* Protect the local heap data block */
+            if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, rw)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap data block")
+
+            /* Pin the prefix, if the data block was loaded from file */
+            if(dblk_udata.loaded)
+                prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG;
+
+            /* Set the flag for pinning the data block when unprotecting it */
+            dblk_cache_flags |= H5AC__PIN_ENTRY_FLAG;
+        } /* end if */
+    } /* end if */
+
+    /* Increment # of times heap is protected */
+    heap->prots++;
+
+    /* Set return value */
+    ret_value = heap;
+
+done:
+    /* Release the prefix from the cache, now pinned */
+    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, prfx_cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap prefix")
+
+    /* Release the data block from the cache, now pinned */
+    if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, dblk_cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap data block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL_offset_into
+ *
+ * Purpose:     Called directly after the call to H5HL_protect so that
+ *              a pointer to the object in the heap can be got.
+ *
+ * Return:      Success:    Valid pointer.
+ *              Failure:    NULL
+ *
+ * Programmer:  Bill Wendling
+ *              wendling at ncsa.uiuc.edu
+ *              Sept. 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5HL_offset_into(const H5HL_t *heap, size_t offset)
+{
+    /*
+     * We need to have called some other function before this to get a
+     * valid heap pointer. So, this can remain "FUNC_ENTER_NOAPI_NOINIT"
+     */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(heap);
+    HDassert(offset < heap->dblk_size);
+
+    FUNC_LEAVE_NOAPI(heap->dblk_image + offset)
+} /* end H5HL_offset_into() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL_unprotect
+ *
+ * Purpose:     Unprotect the data retrieved by the H5HL_protect call.
+ *
+ * Return:      Success:    SUCCEED
+ *              Failure:    FAIL
+ *
+ * Programmer:  Bill Wendling
+ *              wendling at ncsa.uiuc.edu
+ *              Sept. 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_unprotect(H5HL_t *heap)
+{
+    herr_t  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Decrement # of times heap is protected */
+    heap->prots--;
+
+    /* Check for last unprotection of heap */
+    if(heap->prots == 0) {
+        /* Check for separate heap data block */
+        if(heap->single_cache_obj) {
+            /* Mark local heap prefix as evictable again */
+            if(H5AC_unpin_entry(heap->prfx) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block")
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(heap->dblk);
+
+            /* Mark local heap data block as evictable again */
+            /* (data block still pins prefix) */
+            if(H5AC_unpin_entry(heap->dblk) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block")
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_remove_free
+ *
+ * Purpose:	Removes free list element FL from the specified heap and
+ *		frees it.
+ *
+ * Return:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5HL_free_t *
+H5HL_remove_free(H5HL_t *heap, H5HL_free_t *fl)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(fl->prev)
+        fl->prev->next = fl->next;
+    if(fl->next)
+        fl->next->prev = fl->prev;
+
+    if(!fl->prev)
+        heap->freelist = fl->next;
+
+    FUNC_LEAVE_NOAPI((H5HL_free_t *)H5FL_FREE(H5HL_free_t, fl))
+} /* end H5HL_remove_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dirty
+ *
+ * Purpose:	Mark heap as dirty
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_dirty(H5HL_t *heap)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(heap);
+    HDassert(heap->prfx);
+
+    /* Mark heap data block as dirty, if there is one */
+    if(!heap->single_cache_obj) {
+        /* Sanity check */
+        HDassert(heap->dblk);
+
+        if(H5AC_mark_entry_dirty(heap->dblk) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap data block as dirty")
+    } /* end if */
+
+    /* Mark heap prefix as dirty */
+    if(H5AC_mark_entry_dirty(heap->prfx) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap prefix as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_insert
+ *
+ * Purpose:	Inserts a new item into the heap.
+ *
+ * Return:	Success:	Offset of new item within heap.
+ *		Failure:	UFAIL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *buf)
+{
+    H5HL_free_t	*fl = NULL, *last_fl = NULL;
+    size_t	offset = 0;
+    size_t	need_size;
+    hbool_t	found;
+    size_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(UFAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(heap);
+    HDassert(buf_size > 0);
+    HDassert(buf);
+
+    /* Mark heap as dirty in cache */
+    /* (A bit early in the process, but it's difficult to determine in the
+     *  code below where to mark the heap as dirty, especially in error cases,
+     *  so we just accept that an extra flush of the heap info could occur
+     *  if an error occurs -QAK)
+     */
+    if(H5HL_dirty(heap) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, UFAIL, "unable to mark heap as dirty")
+
+    /*
+     * In order to keep the free list descriptors aligned on word boundaries,
+     * whatever that might mean, we round the size up to the next multiple of
+     * a word.
+     */
+    need_size = H5HL_ALIGN(buf_size);
+
+    /*
+     * Look for a free slot large enough for this object and which would
+     * leave zero or at least H5G_SIZEOF_FREE bytes left over.
+     */
+    for(fl = heap->freelist, found = FALSE; fl; fl = fl->next) {
+	if(fl->size > need_size &&
+                fl->size - need_size >= H5HL_SIZEOF_FREE(f)) {
+	    /* a big enough free block was found */
+	    offset = fl->offset;
+	    fl->offset += need_size;
+	    fl->size -= need_size;
+	    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+	    HDassert(fl->size == H5HL_ALIGN(fl->size));
+	    found = TRUE;
+	    break;
+	} else if(fl->size == need_size) {
+	    /* free block of exact size found */
+	    offset = fl->offset;
+	    fl = H5HL_remove_free(heap, fl);
+	    found = TRUE;
+	    break;
+	} else if(!last_fl || last_fl->offset < fl->offset) {
+	    /* track free space that's closest to end of heap */
+	    last_fl = fl;
+	}
+    } /* end for */
+
+    /*
+     * If no free chunk was large enough, then allocate more space and
+     * add it to the free list.	 If the heap ends with a free chunk, we
+     * can extend that free chunk.  Otherwise we'll have to make another
+     * free chunk.  If the heap must expand, we double its size.
+     */
+    if(found == FALSE) {
+        size_t	need_more;      /* How much more space we need */
+        size_t	new_dblk_size;  /* Final size of space allocated for heap data block */
+        size_t	old_dblk_size;  /* Previous size of space allocated for heap data block */
+        htri_t  was_extended;   /* Whether the local heap's data segment on disk was extended */
+
+        /* At least double the heap's size, making certain there's enough room
+         * for the new object */
+	need_more = MAX(need_size, heap->dblk_size);
+
+        /* If there is no last free block or it's not at the end of the heap,
+         * and the amount of space to allocate is not big enough to include at
+         * least the new object and a free-list info, trim down the amount of
+         * space requested to just the amount of space needed.  (Generally
+         * speaking, this only occurs when the heap is small -QAK)
+         */
+	if(!(last_fl && last_fl->offset + last_fl->size == heap->dblk_size)
+                && (need_more < (need_size + H5HL_SIZEOF_FREE(f))))
+            need_more = need_size;
+
+	new_dblk_size = heap->dblk_size + need_more;
+	HDassert(heap->dblk_size < new_dblk_size);
+        old_dblk_size = heap->dblk_size;
+	H5_CHECK_OVERFLOW(heap->dblk_size, size_t, hsize_t);
+	H5_CHECK_OVERFLOW(new_dblk_size, size_t, hsize_t);
+
+        /* Extend current heap if possible */
+	was_extended = H5MF_try_extend(f, dxpl_id, H5FD_MEM_LHEAP, heap->dblk_addr, (hsize_t)(heap->dblk_size), (hsize_t)need_more);
+        if(was_extended < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, UFAIL, "error trying to extend heap")
+
+        /* Check if we extended the heap data block in file */
+        if(was_extended == TRUE) {
+            /* Check for prefix & data block contiguous */
+            if(heap->single_cache_obj) {
+                /* Resize prefix+data block */
+                if(H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_dblk_size)) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap prefix in cache")
+            } /* end if */
+            else {
+                /* Resize 'standalone' data block */
+                if(H5AC_resize_entry(heap->dblk, (size_t)new_dblk_size) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap data block in cache")
+            } /* end else */
+
+            /* Note new size */
+            heap->dblk_size = new_dblk_size;
+	} /* end if */
+        else { /* ...if we can't, allocate a new chunk & release the old */
+            /* Reallocate data block in file */
+            if(H5HL_dblk_realloc(f, dxpl_id, heap, new_dblk_size) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "reallocating data block failed")
+	} /* end if */
+
+        /* If the last free list in the heap is at the end of the heap, extend it */
+	if(last_fl && last_fl->offset + last_fl->size == old_dblk_size) {
+	    /*
+	     * Increase the size of the last free block.
+	     */
+	    offset = last_fl->offset;
+	    last_fl->offset += need_size;
+	    last_fl->size += need_more - need_size;
+	    HDassert(last_fl->offset == H5HL_ALIGN(last_fl->offset));
+	    HDassert(last_fl->size == H5HL_ALIGN(last_fl->size));
+
+	    if (last_fl->size < H5HL_SIZEOF_FREE(f)) {
+#ifdef H5HL_DEBUG
+		if (H5DEBUG(HL) && last_fl->size) {
+		    fprintf(H5DEBUG(HL), "H5HL: lost %lu bytes at line %d\n",
+			    (unsigned long)(last_fl->size), __LINE__);
+		}
+#endif
+		last_fl = H5HL_remove_free(heap, last_fl);
+	    }
+	} /* end if */
+        else {
+	    /*
+	     * Create a new free list element large enough that we can
+	     * take some space out of it right away.
+	     */
+	    offset = old_dblk_size;
+	    if(need_more - need_size >= H5HL_SIZEOF_FREE(f)) {
+		if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
+		    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, UFAIL, "memory allocation failed")
+		fl->offset = old_dblk_size + need_size;
+		fl->size = need_more - need_size;
+		HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+		HDassert(fl->size == H5HL_ALIGN(fl->size));
+		fl->prev = NULL;
+		fl->next = heap->freelist;
+		if(heap->freelist)
+                    heap->freelist->prev = fl;
+		heap->freelist = fl;
+#ifdef H5HL_DEBUG
+	    } else if (H5DEBUG(HL) && need_more > need_size) {
+		fprintf(H5DEBUG(HL),
+			"H5HL_insert: lost %lu bytes at line %d\n",
+			(unsigned long)(need_more - need_size), __LINE__);
+#endif
+	    }
+	} /* end else */
+
+#ifdef H5HL_DEBUG
+	if (H5DEBUG(HL)) {
+	    fprintf(H5DEBUG(HL),
+		    "H5HL: resize mem buf from %lu to %lu bytes\n",
+		    (unsigned long)(old_dblk_size),
+		    (unsigned long)(old_dblk_size + need_more));
+	}
+#endif
+	if(NULL == (heap->dblk_image = H5FL_BLK_REALLOC(lheap_chunk, heap->dblk_image, heap->dblk_size)))
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, UFAIL, "memory allocation failed")
+
+	/* Clear new section so junk doesn't appear in the file */
+        /* (Avoid clearing section which will be overwritten with newly inserted data) */
+	HDmemset(heap->dblk_image + offset + buf_size, 0, (new_dblk_size - (offset + buf_size)));
+    } /* end if */
+
+    /* Copy the data into the heap */
+    HDmemcpy(heap->dblk_image + offset, buf, buf_size);
+
+    /* Set return value */
+    ret_value = offset;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HL_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_remove
+ *
+ * Purpose:	Removes an object or part of an object from the heap at
+ *		address ADDR of file F.	 The object (or part) to remove
+ *		begins at byte OFFSET from the beginning of the heap and
+ *		continues for SIZE bytes.
+ *
+ *		Once part of an object is removed, one must not attempt
+ *		to access that part.  Removing the beginning of an object
+ *		results in the object OFFSET increasing by the amount
+ *		truncated.  Removing the end of an object results in
+ *		object truncation.  Removing the middle of an object results
+ *		in two separate objects, one at the original offset and
+ *		one at the first offset past the removed portion.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 16 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
+{
+    H5HL_free_t		*fl = NULL;
+    herr_t      	ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(heap);
+    HDassert(size > 0);
+    HDassert(offset == H5HL_ALIGN(offset));
+
+    size = H5HL_ALIGN(size);
+
+    HDassert(offset < heap->dblk_size);
+    HDassert(offset + size <= heap->dblk_size);
+
+    /* Mark heap as dirty in cache */
+    /* (A bit early in the process, but it's difficult to determine in the
+     *  code below where to mark the heap as dirty, especially in error cases,
+     *  so we just accept that an extra flush of the heap info could occur
+     *  if an error occurs -QAK)
+     */
+    if(H5HL_dirty(heap) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap as dirty")
+
+    /*
+     * Check if this chunk can be prepended or appended to an already
+     * free chunk.  It might also fall between two chunks in such a way
+     * that all three chunks can be combined into one.
+     */
+    fl = heap->freelist;
+    while(fl) {
+        H5HL_free_t *fl2 = NULL;
+
+	if((offset + size) == fl->offset) {
+	    fl->offset = offset;
+	    fl->size += size;
+	    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+	    HDassert(fl->size == H5HL_ALIGN(fl->size));
+	    fl2 = fl->next;
+	    while(fl2) {
+		if((fl2->offset + fl2->size) == fl->offset) {
+		    fl->offset = fl2->offset;
+		    fl->size += fl2->size;
+		    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+		    HDassert(fl->size == H5HL_ALIGN(fl->size));
+		    fl2 = H5HL_remove_free(heap, fl2);
+	            if(((fl->offset + fl->size) == heap->dblk_size) &&
+                             ((2 * fl->size) > heap->dblk_size)) {
+                        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
+	                    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+                    }
+		    HGOTO_DONE(SUCCEED);
+		}
+		fl2 = fl2->next;
+	    }
+	    if(((fl->offset + fl->size) == heap->dblk_size) &&
+                     ((2 * fl->size) > heap->dblk_size)) {
+                if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
+	            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+            }
+	    HGOTO_DONE(SUCCEED);
+	} else if(fl->offset + fl->size == offset) {
+	    fl->size += size;
+	    fl2 = fl->next;
+	    HDassert(fl->size == H5HL_ALIGN(fl->size));
+	    while(fl2) {
+		if(fl->offset + fl->size == fl2->offset) {
+		    fl->size += fl2->size;
+		    HDassert(fl->size == H5HL_ALIGN(fl->size));
+		    fl2 = H5HL_remove_free(heap, fl2);
+	            if(((fl->offset + fl->size) == heap->dblk_size) &&
+                            ((2 * fl->size) > heap->dblk_size)) {
+                        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
+	                    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+                    } /* end if */
+		    HGOTO_DONE(SUCCEED);
+		} /* end if */
+		fl2 = fl2->next;
+	    } /* end while */
+	    if(((fl->offset + fl->size) == heap->dblk_size) &&
+                    ((2 * fl->size) > heap->dblk_size)) {
+                if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
+	            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+            } /* end if */
+	    HGOTO_DONE(SUCCEED);
+	} /* end if */
+	fl = fl->next;
+    } /* end while */
+
+    /*
+     * The amount which is being removed must be large enough to
+     * hold the free list data.	 If not, the freed chunk is forever
+     * lost.
+     */
+    if(size < H5HL_SIZEOF_FREE(f)) {
+#ifdef H5HL_DEBUG
+	if(H5DEBUG(HL)) {
+	    fprintf(H5DEBUG(HL), "H5HL: lost %lu bytes\n",
+		    (unsigned long) size);
+	}
+#endif
+	HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+    /*
+     * Add an entry to the free list.
+     */
+    if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+    fl->offset = offset;
+    fl->size = size;
+    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+    HDassert(fl->size == H5HL_ALIGN(fl->size));
+    fl->prev = NULL;
+    fl->next = heap->freelist;
+    if(heap->freelist)
+        heap->freelist->prev = fl;
+    heap->freelist = fl;
+
+    if(((fl->offset + fl->size) == heap->dblk_size) &&
+            ((2 * fl->size) > heap->dblk_size)) {
+        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_delete
+ *
+ * Purpose:	Deletes a local heap from disk, freeing disk space used.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 22 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
+{
+    H5HL_t	*heap;                  /* Local heap to delete */
+    H5HL_cache_prfx_ud_t prfx_udata;    /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;           /* Local heap prefix */
+    H5HL_dblk_t *dblk = NULL;           /* Local heap data block */
+    unsigned    cache_flags = H5AC__NO_FLAGS_SET;       /* Flags for unprotecting heap */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Construct the user data for protect callback */
+    prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
+    prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
+    prfx_udata.prfx_addr = addr;
+    prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+
+    /* Protect the local heap prefix */
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+
+    /* Get the pointer to the heap */
+    heap = prfx->heap;
+
+    /* Check if heap has separate data block */
+    if(!heap->single_cache_obj) {
+        H5HL_cache_dblk_ud_t dblk_udata; /* User data for protecting local heap data block */
+
+        /* Construct the user data for protect callback */
+        dblk_udata.heap = heap;
+        dblk_udata.loaded = FALSE;
+
+        /* Protect the local heap data block */
+        if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap data block")
+
+        /* Pin the prefix, if the data block was loaded from file */
+        if(dblk_udata.loaded) {
+            if(H5AC_pin_protected_entry(prfx) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin local heap prefix")
+        } /* end if */
+    } /* end if */
+
+    /* Set the flags for releasing the prefix and data block */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    /* Release the data block from the cache, now deleted */
+    if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap data block")
+
+    /* Release the prefix from the cache, now deleted */
+    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, cache_flags) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_get_size
+ *
+ * Purpose:	Retrieves the current size of a heap
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Nov  7 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size)
+{
+    H5HL_cache_prfx_ud_t prfx_udata;      /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
+    H5HL_t *heap;               /* Heap data structure */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(size);
+
+    /* Construct the user data for protect callback */
+    prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
+    prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
+    prfx_udata.prfx_addr = addr;
+    prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+
+    /* Protect the local heap prefix */
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+
+    /* Get the pointer to the heap */
+    heap = prfx->heap;
+
+    /* Set the size to return */
+    *size = heap->dblk_size;
+
+done:
+    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_get_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL_heapsize
+ *
+ * Purpose:     Compute the size in bytes of the specified instance of
+ *              H5HL_t via H5HL_size()
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              June 19 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size)
+{
+    H5HL_cache_prfx_ud_t prfx_udata;      /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
+    H5HL_t *heap;               /* Heap data structure */
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(heap_size);
+
+    /* Construct the user data for protect callback */
+    prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
+    prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
+    prfx_udata.prfx_addr = addr;
+    prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+
+    /* Protect the local heap prefix */
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+
+    /* Get the pointer to the heap */
+    heap = prfx->heap;
+
+    /* Accumulate the size of the local heap */
+    *heap_size += (hsize_t)(heap->prfx_size + heap->dblk_size);
+
+done:
+    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_heapsize() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLcache.c b/gatb-core/thirdparty/hdf5/src/H5HLcache.c
new file mode 100644
index 0000000..e4ffd5a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLcache.c
@@ -0,0 +1,851 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HLcache.c
+ *			Feb  5 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implement local heap metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HLpkg.h"		/* Local Heaps				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5HL_VERSION	0               /* Local heap collection version    */
+
+/* Set the local heap size to speculatively read in */
+/* (needs to be more than the local heap prefix size to work at all and
+ *      should be larger than the default local heap size to save the
+ *      extra I/O operations) */
+#define H5HL_SPEC_READ_SIZE 512
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache callbacks */
+static void *H5HL_prefix_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HL_prefix_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
+    void *thing, unsigned *flags_ptr);
+static herr_t H5HL_prefix_dest(H5F_t *f, void *thing);
+static herr_t H5HL_prefix_clear(H5F_t *f, void *thing, hbool_t destroy);
+static herr_t H5HL_prefix_size(const H5F_t *f, const void *thing, size_t *size_ptr);
+static void *H5HL_datablock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5HL_datablock_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
+    void *thing, unsigned *flags_ptr);
+static herr_t H5HL_datablock_dest(H5F_t *f, void *thing);
+static herr_t H5HL_datablock_clear(H5F_t *f, void *thing, hbool_t destroy);
+static herr_t H5HL_datablock_size(const H5F_t *f, const void *thing, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5HL inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_LHEAP_PRFX[1] = {{
+    H5AC_LHEAP_PRFX_ID,
+    H5HL_prefix_load,
+    H5HL_prefix_flush,
+    H5HL_prefix_dest,
+    H5HL_prefix_clear,
+    H5HL_prefix_size,
+}};
+
+const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{
+    H5AC_LHEAP_DBLK_ID,
+    H5HL_datablock_load,
+    H5HL_datablock_flush,
+    H5HL_datablock_dest,
+    H5HL_datablock_clear,
+    H5HL_datablock_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_fl_deserialize
+ *
+ * Purpose:	Deserialize the free list for a heap data block
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_fl_deserialize(H5HL_t *heap)
+{
+    H5HL_free_t *fl = NULL, *tail = NULL;      /* Heap free block nodes */
+    hsize_t free_block;                 /* Offset of free block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(heap);
+    HDassert(!heap->freelist);
+
+    /* Build free list */
+    free_block = heap->free_block;
+    while(H5HL_FREE_NULL != free_block) {
+        const uint8_t *p;               /* Pointer into image buffer */
+
+        /* Sanity check */
+        if(free_block >= heap->dblk_size)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "bad heap free list")
+
+        /* Allocate & initialize free list node */
+        if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        fl->offset = (size_t)free_block;
+        fl->prev = tail;
+        fl->next = NULL;
+
+        /* Decode offset of next free block */
+        p = heap->dblk_image + free_block;
+        H5F_DECODE_LENGTH_LEN(p, free_block, heap->sizeof_size);
+        if(free_block == 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "free block size is zero?")
+
+        /* Decode length of this free block */
+        H5F_DECODE_LENGTH_LEN(p, fl->size, heap->sizeof_size);
+        if((fl->offset + fl->size) > heap->dblk_size)
+            HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "bad heap free list")
+
+        /* Append node onto list */
+        if(tail)
+            tail->next = fl;
+        else
+            heap->freelist = fl;
+        tail = fl;
+        fl = NULL;
+    } /* end while */
+
+done:
+    if(ret_value < 0)
+        if(fl)
+            fl = H5FL_FREE(H5HL_free_t, fl);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_fl_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_fl_serialize
+ *
+ * Purpose:	Serialize the free list for a heap data block
+ *
+ * Return:	Success:	SUCCESS
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5HL_fl_serialize(const H5HL_t *heap)
+{
+    H5HL_free_t	*fl;                    /* Pointer to heap free list node */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Serialize the free list into the heap data's image */
+    for(fl = heap->freelist; fl; fl = fl->next) {
+        uint8_t     *p;                     /* Pointer into raw data buffer */
+
+        HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+        p = heap->dblk_image + fl->offset;
+
+        if(fl->next)
+            H5F_ENCODE_LENGTH_LEN(p, fl->next->offset, heap->sizeof_size)
+        else
+            H5F_ENCODE_LENGTH_LEN(p, H5HL_FREE_NULL, heap->sizeof_size)
+
+        H5F_ENCODE_LENGTH_LEN(p, fl->size, heap->sizeof_size)
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5HL_fl_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prefix_load
+ *
+ * Purpose:	Loads a local heap prefix from disk.
+ *
+ * Return:	Success:	Ptr to a local heap memory data structure.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5HL_prefix_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5HL_t *heap = NULL;            /* Local heap */
+    H5HL_prfx_t *prfx = NULL;       /* Heap prefix deserialized */
+    H5HL_cache_prfx_ud_t *udata = (H5HL_cache_prfx_ud_t *)_udata;       /* User data for callback */
+    uint8_t		buf[H5HL_SPEC_READ_SIZE];   /* Buffer for decoding */
+    size_t	        spec_read_size; /* Size of buffer to speculatively read in */
+    const uint8_t	*p;         /* Pointer into decoding buffer */
+    haddr_t             eoa;        /* Relative end of file address */
+    hsize_t min;                    /* temp min value to avoid macro nesting */
+    H5HL_prfx_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+    HDassert(udata->sizeof_size > 0);
+    HDassert(udata->sizeof_addr > 0);
+    HDassert(udata->sizeof_prfx > 0);
+    HDassert(udata->sizeof_prfx <= sizeof(buf));
+
+    /* Make certain we don't speculatively read off the end of the file */
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_LHEAP)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, NULL, "unable to determine file size")
+
+    /* Compute the size of the speculative local heap prefix buffer */
+    min = MIN(eoa - addr, H5HL_SPEC_READ_SIZE);
+    H5_CHECKED_ASSIGN(spec_read_size, size_t, min, hsize_t);
+    HDassert(spec_read_size >= udata->sizeof_prfx);
+
+    /* Attempt to speculatively read both local heap prefix and heap data */
+    if(H5F_block_read(f, H5FD_MEM_LHEAP, addr, spec_read_size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read local heap prefix")
+    p = buf;
+
+    /* Check magic number */
+    if(HDmemcmp(p, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad local heap signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(H5HL_VERSION != *p++)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong version number in local heap")
+
+    /* Reserved */
+    p += 3;
+
+    /* Allocate space in memory for the heap */
+    if(NULL == (heap = H5HL_new(udata->sizeof_size, udata->sizeof_addr, udata->sizeof_prfx)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap structure")
+
+    /* Allocate the heap prefix */
+    if(NULL == (prfx = H5HL_prfx_new(heap)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap prefix")
+
+    /* Store the prefix's address & length */
+    heap->prfx_addr = udata->prfx_addr;
+    heap->prfx_size = udata->sizeof_prfx;
+
+    /* Heap data size */
+    H5F_DECODE_LENGTH_LEN(p, heap->dblk_size, udata->sizeof_size);
+
+    /* Free list head */
+    H5F_DECODE_LENGTH_LEN(p, heap->free_block, udata->sizeof_size);
+    if(heap->free_block != H5HL_FREE_NULL && heap->free_block >= heap->dblk_size)
+	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad heap free list")
+
+    /* Heap data address */
+    H5F_addr_decode_len(udata->sizeof_addr, &p, &(heap->dblk_addr));
+
+    /* Check if heap block exists */
+    if(heap->dblk_size) {
+        /* Check if heap data block is contiguous with header */
+        if(H5F_addr_eq((heap->prfx_addr + heap->prfx_size), heap->dblk_addr)) {
+            /* Note that the heap should be a single object in the cache */
+            heap->single_cache_obj = TRUE;
+
+            /* Allocate space for the heap data image */
+            if(NULL == (heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, heap->dblk_size)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+            /* Check if the current buffer from the speculative read already has the heap data */
+            if(spec_read_size >= (heap->prfx_size + heap->dblk_size)) {
+                /* Set p to the start of the data block.  This is necessary
+                 * because there may be a gap between the used portion of the
+                 * prefix and the data block due to alignment constraints. */
+                p = buf + heap->prfx_size;
+
+                /* Copy the heap data from the speculative read buffer */
+                HDmemcpy(heap->dblk_image, p, heap->dblk_size);
+            } /* end if */
+            else {
+                /* Read the local heap data block directly into buffer */
+                if(H5F_block_read(f, H5FD_MEM_LHEAP, heap->dblk_addr, heap->dblk_size, dxpl_id, heap->dblk_image) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read heap data")
+            } /* end else */
+
+            /* Build free list */
+            if(H5HL_fl_deserialize(heap) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list")
+        } /* end if */
+        else
+            /* Note that the heap should _NOT_ be a single object in the cache */
+            heap->single_cache_obj = FALSE;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = prfx;
+
+done:
+    /* Release the [possibly partially initialized] local heap on errors */
+    if(!ret_value) {
+        if(prfx) {
+            if(H5HL_prfx_dest(prfx) < 0)
+                HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap prefix")
+        } /* end if */
+        else {
+            if(heap && H5HL_dest(heap) < 0)
+                HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap")
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prefix_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prefix_flush
+ *
+ * Purpose:	Flushes a heap from memory to disk if it's dirty.  Optionally
+ *		deletes the heap from memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_prefix_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
+    void *thing, unsigned H5_ATTR_UNUSED *flags_ptr)
+{
+    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* Local heap prefix to flush */
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for heap data */
+    uint8_t heap_buf[H5HL_SPEC_READ_SIZE]; /* Buffer for heap */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(prfx);
+
+    if(prfx->cache_info.is_dirty) {
+        H5HL_t *heap = prfx->heap; /* Pointer to the local heap */
+        uint8_t *buf;           /* Pointer to heap buffer */
+        size_t buf_size;        /* Size of buffer for encoding & writing heap info */
+        uint8_t *p;             /* Pointer into raw data buffer */
+
+        /* Wrap the local buffer for serialized heap info */
+        if(NULL == (wb = H5WB_wrap(heap_buf, sizeof(heap_buf))))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Compute the size of the buffer to encode & write */
+        buf_size = heap->prfx_size;
+        if(heap->single_cache_obj)
+            buf_size += heap->dblk_size;
+
+        /* Get a pointer to a buffer that's large enough for serialized heap */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, buf_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Update the free block value from the free list */
+        heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
+
+        /* Serialize the heap prefix */
+        p = buf;
+        HDmemcpy(p, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+        *p++ = H5HL_VERSION;
+        *p++ = 0;	/*reserved*/
+        *p++ = 0;	/*reserved*/
+        *p++ = 0;	/*reserved*/
+        H5F_ENCODE_LENGTH_LEN(p, heap->dblk_size, heap->sizeof_size);
+        H5F_ENCODE_LENGTH_LEN(p, heap->free_block, heap->sizeof_size);
+        H5F_addr_encode_len(heap->sizeof_addr, &p, heap->dblk_addr);
+
+        /* Check if the local heap is a single object in cache */
+        if(heap->single_cache_obj) {
+            if((size_t)(p - buf) < heap->prfx_size) {
+                size_t gap;         /* Size of gap between prefix and data block */
+
+                /* Set p to the start of the data block.  This is necessary because
+                 * there may be a gap between the used portion of the prefix and the
+                 * data block due to alignment constraints. */
+                gap = heap->prfx_size - (size_t)(p - buf);
+                HDmemset(p, 0, gap);
+                p += gap;
+            } /* end if */
+
+            /* Serialize the free list into the heap data's image */
+            H5HL_fl_serialize(heap);
+
+            /* Copy the heap data block into the cache image */
+            HDmemcpy(p, heap->dblk_image, heap->dblk_size);
+        } /* end if */
+
+        /* Write the prefix [and possibly the data block] to the file */
+        if(H5F_block_write(f, H5FD_MEM_LHEAP, addr, buf_size, dxpl_id, buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write heap header and data to file")
+
+	prfx->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    /* Should we destroy the memory version? */
+    if(destroy)
+        if(H5HL_prefix_dest(f, prfx) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prefix_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prefix_dest
+ *
+ * Purpose:	Destroys a heap prefix in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_prefix_dest(H5F_t *f, void *thing)
+{
+    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* Local heap prefix to destroy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(prfx);
+    HDassert(prfx->heap);
+    HDassert(H5F_addr_eq(prfx->cache_info.addr, prfx->heap->prfx_addr));
+
+    /* Verify that entry is clean */
+    HDassert(prfx->cache_info.is_dirty == FALSE);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!prfx->cache_info.free_file_space_on_destroy || H5F_addr_defined(prfx->cache_info.addr));
+
+    /* Check for freeing file space for local heap prefix */
+    if(prfx->cache_info.free_file_space_on_destroy) {
+        hsize_t free_size;       /* Size of region to free in file */
+
+        /* Compute size to free for later */
+        free_size = prfx->heap->prfx_size;
+        if(prfx->heap->single_cache_obj)
+            free_size += prfx->heap->dblk_size;
+
+        /* Free the local heap prefix [and possible the data block] on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_LHEAP, H5AC_dxpl_id, prfx->cache_info.addr, free_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free local heap prefix")
+    } /* end if */
+
+    /* Destroy local heap prefix */
+    if(H5HL_prfx_dest(prfx) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't destroy local heap prefix")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prefix_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prefix_clear
+ *
+ * Purpose:	Mark a local heap prefix in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 20 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_prefix_clear(H5F_t H5_ATTR_UNUSED *f, void *thing, hbool_t destroy)
+{
+    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* The local heap prefix to operate on */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(prfx);
+
+    /* Mark heap prefix as clean */
+    prfx->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HL_prefix_dest(f, prfx) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prefix_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prefix_size
+ *
+ * Purpose:	Compute the size in bytes of the heap prefix on disk,
+ *              and return it in *len_ptr.  On failure, the value of *len_ptr
+ *              is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_prefix_size(const H5F_t H5_ATTR_UNUSED *f, const void *thing, size_t *size_ptr)
+{
+    const H5HL_prfx_t *prfx = (const H5HL_prfx_t *)thing;   /* Pointer to local heap prefix to query */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(prfx);
+    HDassert(prfx->heap);
+    HDassert(size_ptr);
+
+    /* Calculate size of prefix in cache */
+    *size_ptr = prfx->heap->prfx_size;
+
+    /* If the heap is stored as a single object, add in the data block size also */
+    if(prfx->heap->single_cache_obj)
+        *size_ptr += prfx->heap->dblk_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HL_prefix_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_datablock_load
+ *
+ * Purpose:	Loads a local heap data block from disk.
+ *
+ * Return:	Success:	Ptr to a local heap data block memory data structure.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  5 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5HL_datablock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5HL_dblk_t *dblk = NULL;       /* Local heap data block deserialized */
+    H5HL_cache_dblk_ud_t *udata = (H5HL_cache_dblk_ud_t *)_udata;       /* User data for callback */
+    H5HL_dblk_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+    HDassert(udata->heap);
+    HDassert(!udata->heap->single_cache_obj);
+    HDassert(NULL == udata->heap->dblk);
+
+    /* Allocate space in memory for the heap data block */
+    if(NULL == (dblk = H5HL_dblk_new(udata->heap)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Check for heap still retaining image */
+    if(NULL == udata->heap->dblk_image) {
+        /* Allocate space for the heap data image */
+        if(NULL == (udata->heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, udata->heap->dblk_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate data block image buffer")
+
+        /* Read local heap data block */
+        if(H5F_block_read(f, H5FD_MEM_LHEAP, udata->heap->dblk_addr, udata->heap->dblk_size, dxpl_id, udata->heap->dblk_image) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read local heap data block")
+
+        /* Build free list */
+        if(H5HL_fl_deserialize(udata->heap) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list")
+    } /* end if */
+
+    /* Set flag to indicate data block from loaded from file */
+    udata->loaded = TRUE;
+
+    /* Set return value */
+    ret_value = dblk;
+
+done:
+    /* Release the [possibly partially initialized] local heap on errors */
+    if(!ret_value && dblk)
+        if(H5HL_dblk_dest(dblk) < 0)
+	    HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap data block")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_datablock_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_datablock_flush
+ *
+ * Purpose:	Flushes a heap's data block from memory to disk if it's dirty.
+ *              Optionally deletes the heap data block from memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_datablock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
+    void *_thing, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(dblk);
+    HDassert(dblk->heap);
+    HDassert(!dblk->heap->single_cache_obj);
+
+    if(dblk->cache_info.is_dirty) {
+        H5HL_t *heap = dblk->heap;      /* Pointer to the local heap */
+
+        /* Update the free block value from the free list */
+        heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
+
+        /* Serialize the free list into the heap data's image */
+        H5HL_fl_serialize(heap);
+
+        /* Write the data block to the file */
+        if(H5F_block_write(f, H5FD_MEM_LHEAP, heap->dblk_addr, heap->dblk_size, dxpl_id, heap->dblk_image) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write heap data block to file")
+
+	dblk->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    /* Should we destroy the memory version? */
+    if(destroy)
+        if(H5HL_datablock_dest(f, dblk) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap data block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_datablock_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_datablock_dest
+ *
+ * Purpose:	Destroys a local heap data block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_datablock_dest(H5F_t *f, void *_thing)
+{
+    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(dblk);
+    HDassert(dblk->heap);
+    HDassert(!dblk->heap->single_cache_obj);
+    HDassert(H5F_addr_eq(dblk->cache_info.addr, dblk->heap->dblk_addr));
+
+    /* Verify that entry is clean */
+    HDassert(dblk->cache_info.is_dirty == FALSE);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!dblk->cache_info.free_file_space_on_destroy || H5F_addr_defined(dblk->cache_info.addr));
+
+    /* Check for freeing file space for local heap data block */
+    if(dblk->cache_info.free_file_space_on_destroy) {
+        /* Free the local heap data block on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_LHEAP, H5AC_dxpl_id, dblk->cache_info.addr, (hsize_t)dblk->heap->dblk_size) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free local heap data block")
+    } /* end if */
+
+    /* Destroy local heap data block */
+    if(H5HL_dblk_dest(dblk) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't destroy local heap data block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_datablock_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_datablock_clear
+ *
+ * Purpose:	Mark a local heap data block in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 20 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_datablock_clear(H5F_t *f, void *_thing, hbool_t destroy)
+{
+    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(dblk);
+
+    /* Mark local heap data block as clean */
+    dblk->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5HL_datablock_dest(f, dblk) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap data block")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_datablock_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_datablock_size
+ *
+ * Purpose:	Compute the size in bytes of the local heap data block on disk,
+ *              and return it in *len_ptr.  On failure, the value of *len_ptr
+ *              is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_datablock_size(const H5F_t H5_ATTR_UNUSED *f, const void *_thing, size_t *size_ptr)
+{
+    const H5HL_dblk_t *dblk = (const H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(dblk);
+    HDassert(dblk->heap);
+    HDassert(size_ptr);
+
+    /* Set size of data block in cache */
+    *size_ptr = dblk->heap->dblk_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5HL_datablock_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLdbg.c b/gatb-core/thirdparty/hdf5/src/H5HLdbg.c
new file mode 100644
index 0000000..4ac22b8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLdbg.c
@@ -0,0 +1,136 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Wednesday, July 9, 2003
+ *
+ * Purpose:	Local Heap object debugging functions.
+ */
+#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		        */
+#include "H5HLpkg.h"		/* Local heaps				*/
+#include "H5Iprivate.h"		/* ID Functions		                */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_debug
+ *
+ * Purpose:	Prints debugging information about a heap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  1 1997
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *
+ *              John Mainzer, 6/17/05
+ *              Modified the function to use the new dirtied parameter of
+ *              of H5AC_unprotect() instead of modifying the is_dirty
+ *              field of the cache info.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int fwidth)
+{
+    H5HL_t		*h = NULL;
+    int			free_block;
+    H5HL_free_t		*freelist;
+    uint8_t		*marker = NULL;
+    size_t		amount_free = 0;
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    if(NULL == (h = (H5HL_t *)H5HL_protect(f, dxpl_id, addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap")
+
+    HDfprintf(stream, "%*sLocal Heap...\n", indent, "");
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	    "Header size (in bytes):",
+	    (unsigned long)h->prfx_size);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of heap data:",
+	      h->dblk_addr);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	    "Data bytes allocated for heap:",
+            h->dblk_size);
+
+    /*
+     * Traverse the free list and check that all free blocks fall within
+     * the heap and that no two free blocks point to the same region of
+     * the heap.  */
+    if(NULL == (marker = (uint8_t *)H5MM_calloc(h->dblk_size)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+    HDfprintf(stream, "%*sFree Blocks (offset, size):\n", indent, "");
+    for(free_block = 0, freelist = h->freelist; freelist; freelist = freelist->next, free_block++) {
+        char temp_str[32];
+
+        HDsnprintf(temp_str, sizeof(temp_str), "Block #%d:", free_block);
+	HDfprintf(stream, "%*s%-*s %8Zu, %8Zu\n", indent+3, "", MAX(0,fwidth-9),
+		temp_str,
+		freelist->offset, freelist->size);
+	if((freelist->offset + freelist->size) > h->dblk_size)
+	    HDfprintf(stream, "***THAT FREE BLOCK IS OUT OF BOUNDS!\n");
+	else {
+            int	overlap = 0;
+            size_t i;
+
+	    for(i = 0; i < freelist->size; i++) {
+		if(marker[freelist->offset + i])
+		    overlap++;
+		marker[freelist->offset + i] = 1;
+	    } /* end for */
+	    if(overlap)
+		HDfprintf(stream, "***THAT FREE BLOCK OVERLAPPED A PREVIOUS ONE!\n");
+	    else
+		amount_free += freelist->size;
+	} /* end for */
+    } /* end for */
+
+    if(h->dblk_size)
+	HDfprintf(stream, "%*s%-*s %.2f%%\n", indent, "", fwidth,
+		"Percent of heap used:",
+		((double)100.0f * (double)(h->dblk_size - amount_free) / (double)h->dblk_size));
+
+    /*
+     * Print the data in a VMS-style octal dump.
+     */
+    H5_buffer_dump(stream, indent, h->dblk_image, marker, (size_t)0, h->dblk_size);
+
+done:
+    if(h && H5HL_unprotect(h) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+    H5MM_xfree(marker);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLint.c b/gatb-core/thirdparty/hdf5/src/H5HLint.c
new file mode 100644
index 0000000..d5238eb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLint.c
@@ -0,0 +1,417 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HLint.c
+ *			Oct 12 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Local heap internal routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HLpkg.h"		/* Local Heaps				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HL_t struct */
+H5FL_DEFINE_STATIC(H5HL_t);
+
+/* Declare a free list to manage the H5HL_dblk_t struct */
+H5FL_DEFINE_STATIC(H5HL_dblk_t);
+
+/* Declare a free list to manage the H5HL_prfx_t struct */
+H5FL_DEFINE_STATIC(H5HL_prfx_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_new
+ *
+ * Purpose:	Create a new local heap object
+ *
+ * Return:	Success:	non-NULL pointer to new local heap
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  5 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HL_t *
+H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size)
+{
+    H5HL_t *heap = NULL;        /* New local heap */
+    H5HL_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check arguments */
+    HDassert(sizeof_size > 0);
+    HDassert(sizeof_addr > 0);
+    HDassert(prfx_size > 0);
+
+    /* Allocate new local heap structure */
+    if(NULL == (heap = H5FL_CALLOC(H5HL_t)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Initialize non-zero fields */
+    heap->sizeof_size = sizeof_size;
+    heap->sizeof_addr = sizeof_addr;
+    heap->prfx_size = prfx_size;
+
+    /* Set the return value */
+    ret_value = heap;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_inc_rc
+ *
+ * Purpose:	Increment ref. count on heap
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_inc_rc(H5HL_t *heap)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Increment heap's ref. count */
+    heap->rc++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL_inc_rc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dec_rc
+ *
+ * Purpose:	Decrement ref. count on heap
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL_dec_rc(H5HL_t *heap)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Decrement heap's ref. count */
+    heap->rc--;
+
+    /* Check if we should destroy the heap */
+    if(heap->rc == 0)
+        H5HL_dest(heap);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL_dec_rc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dest
+ *
+ * Purpose:	Destroys a heap in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_dest(H5HL_t *heap)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Verify that node is unused */
+    HDassert(heap->prots == 0);
+    HDassert(heap->rc == 0);
+    HDassert(heap->prfx == NULL);
+    HDassert(heap->dblk == NULL);
+
+    if(heap->dblk_image)
+        heap->dblk_image = H5FL_BLK_FREE(lheap_chunk, heap->dblk_image);
+    while(heap->freelist) {
+        H5HL_free_t	*fl;
+
+        fl = heap->freelist;
+        heap->freelist = fl->next;
+        fl = H5FL_FREE(H5HL_free_t, fl);
+    } /* end while */
+    heap = H5FL_FREE(H5HL_t, heap);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prfx_new
+ *
+ * Purpose:	Create a new local heap prefix object
+ *
+ * Return:	Success:	non-NULL pointer to new local heap prefix
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HL_prfx_t *
+H5HL_prfx_new(H5HL_t *heap)
+{
+    H5HL_prfx_t *prfx = NULL;       /* New local heap prefix */
+    H5HL_prfx_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Allocate new local heap prefix */
+    if(NULL == (prfx = H5FL_CALLOC(H5HL_prfx_t)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Increment ref. count on heap data structure */
+    if(H5HL_inc_rc(heap) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment heap ref. count")
+
+    /* Link the heap & the prefix */
+    prfx->heap = heap;
+    heap->prfx = prfx;
+
+    /* Set the return value */
+    ret_value = prfx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prfx_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_prfx_dest
+ *
+ * Purpose:	Destroy a local heap prefix object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_prfx_dest(H5HL_prfx_t *prfx)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(prfx);
+
+    /* Check if prefix was initialized */
+    if(prfx->heap) {
+        /* Unlink prefix from heap */
+        prfx->heap->prfx = NULL;
+
+        /* Decrement ref. count on heap data structure */
+        if(H5HL_dec_rc(prfx->heap) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement heap ref. count")
+
+        /* Unlink heap from prefix */
+        prfx->heap = NULL;
+    } /* end if */
+
+    /* Free local heap prefix */
+    prfx = H5FL_FREE(H5HL_prfx_t, prfx);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_prfx_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dblk_new
+ *
+ * Purpose:	Create a new local heap data block object
+ *
+ * Return:	Success:	non-NULL pointer to new local heap data block
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5HL_dblk_t *
+H5HL_dblk_new(H5HL_t *heap)
+{
+    H5HL_dblk_t *dblk = NULL;       /* New local heap data block */
+    H5HL_dblk_t *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Allocate new local heap data block */
+    if(NULL == (dblk = H5FL_CALLOC(H5HL_dblk_t)))
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Increment ref. count on heap data structure */
+    if(H5HL_inc_rc(heap) < 0)
+	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment heap ref. count")
+
+    /* Link the heap & the data block */
+    dblk->heap = heap;
+    heap->dblk = dblk;
+
+    /* Set the return value */
+    ret_value = dblk;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_dblk_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL_dblk_dest
+ *
+ * Purpose:	Destroy a local heap data block object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HL_dblk_dest(H5HL_dblk_t *dblk)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(dblk);
+
+    /* Check if data block was initialized */
+    if(dblk->heap) {
+        /* Unlink data block from heap */
+        dblk->heap->dblk = NULL;
+
+        /* Unpin the local heap prefix */
+        if(H5AC_unpin_entry(dblk->heap->prfx) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "can't unpin local heap prefix")
+
+        /* Decrement ref. count on heap data structure */
+        if(H5HL_dec_rc(dblk->heap) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement heap ref. count")
+
+        /* Unlink heap from data block */
+        dblk->heap = NULL;
+    } /* end if */
+
+    /* Free local heap data block */
+    dblk = H5FL_FREE(H5HL_dblk_t, dblk);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL_dblk_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLpkg.h b/gatb-core/thirdparty/hdf5/src/H5HLpkg.h
new file mode 100644
index 0000000..bf9be2c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLpkg.h
@@ -0,0 +1,160 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *             Wednesday, July 9, 2003
+ *
+ * Purpose:     This file contains declarations which are visible
+ *              only within the H5HL package. Source files outside the
+ *              H5HL package should include H5HLprivate.h instead.
+ */
+#ifndef H5HL_PACKAGE
+#error "Do not include this file outside the H5HL package!"
+#endif
+
+#ifndef _H5HLpkg_H
+#define _H5HLpkg_H
+
+/* Get package's private header */
+#include "H5HLprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5FLprivate.h"	/* Free lists                           */
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* The local heap prefix cache subclass */
+H5_DLLVAR const H5AC_class_t H5AC_LHEAP_PRFX[1];
+
+/* The local heap data block cache subclass */
+H5_DLLVAR const H5AC_class_t H5AC_LHEAP_DBLK[1];
+
+/* Declare extern the free list to manage the H5HL_free_t struct */
+H5FL_EXTERN(H5HL_free_t);
+
+/* Declare extern the PQ free list to manage the heap chunk information */
+H5FL_BLK_EXTERN(lheap_chunk);
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+#define H5HL_SIZEOF_HDR(F)						      \
+    H5HL_ALIGN(H5_SIZEOF_MAGIC +	/*heap signature		*/    \
+	       1 +			/*version			*/    \
+	       3 +			/*reserved			*/    \
+	       H5F_SIZEOF_SIZE(F) +	/*data size			*/    \
+	       H5F_SIZEOF_SIZE(F) +	/*free list head		*/    \
+	       H5F_SIZEOF_ADDR(F))	/*data address			*/
+
+/* Value indicating end of free list on disk */
+#define H5HL_FREE_NULL	1
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+typedef struct H5HL_free_t {
+    size_t		offset;		/*offset of free block		*/
+    size_t		size;		/*size of free block		*/
+    struct H5HL_free_t	*prev;		/*previous entry in free list	*/
+    struct H5HL_free_t	*next;		/*next entry in free list	*/
+} H5HL_free_t;
+
+/* Forward declarations */
+typedef struct H5HL_dblk_t H5HL_dblk_t;
+typedef struct H5HL_prfx_t H5HL_prfx_t;
+
+struct H5HL_t {
+    /* General heap-management fields */
+    size_t                  rc;         /* Ref. count for prefix & data block using this struct */
+    size_t                  prots;      /* # of times the heap has been protected */
+    size_t                  sizeof_size; /* Size of file sizes */
+    size_t                  sizeof_addr; /* Size of file addresses */
+    hbool_t                 single_cache_obj;   /* Indicate if the heap is a single object in the cache */
+    H5HL_free_t		   *freelist;	/*the free list			*/
+
+    /* Prefix-specific fields */
+    H5HL_prfx_t            *prfx;       /* The prefix object for the heap */
+    haddr_t                 prfx_addr;  /* address of heap prefix */
+    size_t                  prfx_size;  /* size of heap prefix */
+    hsize_t                 free_block; /* Address of first free block */
+
+    /* Data block-specific fields */
+    H5HL_dblk_t            *dblk;       /* The data block object for the heap */
+    haddr_t		    dblk_addr;	/* address of data block	*/
+    size_t		    dblk_size;	/* size of heap data block on disk and in mem */
+    uint8_t		   *dblk_image;	/* The data block image */
+};
+
+/* Struct for heap data block */
+struct H5HL_dblk_t {
+    H5AC_info_t cache_info;    /* Information for H5AC cache functions, _must_ be */
+                                /* first field in structure */
+    H5HL_t                 *heap;       /* Pointer to heap for data block */
+};
+
+/* Struct for heap prefix */
+struct H5HL_prfx_t {
+    H5AC_info_t cache_info;    /* Information for H5AC cache functions, _must_ be */
+                                /* first field in structure */
+    H5HL_t                 *heap;       /* Pointer to heap for prefix */
+};
+
+/* Callback information for loading local heap prefix from disk */
+typedef struct H5HL_cache_prfx_ud_t {
+    /* Downwards */
+    size_t sizeof_size;                 /* Size of file sizes */
+    size_t sizeof_addr;                 /* Size of file addresses */
+    haddr_t prfx_addr;                  /* Address of prefix */
+    size_t sizeof_prfx;                 /* Size of heap prefix */
+
+    /* Upwards */
+} H5HL_cache_prfx_ud_t;
+
+/* Callback information for loading local heap data block from disk */
+typedef struct H5HL_cache_dblk_ud_t {
+    /* Downwards */
+    H5HL_t *heap;                       /* Local heap */
+
+    /* Upwards */
+    hbool_t loaded;                     /* Whether data block was loaded from file */
+} H5HL_cache_dblk_ud_t;
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Heap routines */
+H5_DLL H5HL_t *H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size);
+H5_DLL herr_t H5HL_dest(H5HL_t *heap);
+
+/* Heap prefix routines */
+H5_DLL H5HL_prfx_t *H5HL_prfx_new(H5HL_t *heap);
+H5_DLL herr_t H5HL_prfx_dest(H5HL_prfx_t *prfx);
+
+/* Heap data block routines */
+H5_DLL H5HL_dblk_t *H5HL_dblk_new(H5HL_t *heap);
+H5_DLL herr_t H5HL_dblk_dest(H5HL_dblk_t *dblk);
+
+#endif /* _H5HLpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLprivate.h b/gatb-core/thirdparty/hdf5/src/H5HLprivate.h
new file mode 100644
index 0000000..0b044b6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLprivate.h
@@ -0,0 +1,79 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5HLprivate.h
+ *			Jul 16 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5HLprivate_H
+#define _H5HLprivate_H
+
+/* Include package's public header */
+#include "H5HLpublic.h"
+
+/* Private headers needed by this file. */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Fprivate.h"		/* File access				*/
+
+/*
+ * Feature: Define H5HL_DEBUG on the compiler command line if you want to
+ *	    diagnostic messages from this layer.
+ */
+#ifdef NDEBUG
+#  undef H5HL_DEBUG
+#endif
+
+#define H5HL_ALIGN(X)	((((unsigned)X)+7)&(unsigned)(~0x07)) /*align on 8-byte boundary	*/
+
+#define H5HL_SIZEOF_FREE(F)						      \
+    H5HL_ALIGN(H5F_SIZEOF_SIZE (F) +	/*ptr to next free block	*/    \
+	       H5F_SIZEOF_SIZE (F))	/*size of this free block	*/
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Typedef for local heap in memory (defined in H5HLpkg.h) */
+typedef struct H5HL_t H5HL_t;
+
+/*
+ * Library prototypes...
+ */
+H5_DLL herr_t H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr/*out*/);
+H5_DLL H5HL_t *H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw);
+H5_DLL void *H5HL_offset_into(const H5HL_t *heap, size_t offset);
+H5_DLL herr_t H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset,
+    size_t size);
+H5_DLL herr_t H5HL_unprotect(H5HL_t *heap);
+H5_DLL size_t H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t size,
+    const void *buf);
+H5_DLL herr_t H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+H5_DLL herr_t H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size);
+H5_DLL herr_t H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size);
+
+/* Debugging functions */
+H5_DLL herr_t H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
+			  int fwidth);
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HLpublic.h b/gatb-core/thirdparty/hdf5/src/H5HLpublic.h
new file mode 100644
index 0000000..db00f51
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HLpublic.h
@@ -0,0 +1,41 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5HLpublic.h
+ *                      Jul 16 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public declarations for the H5HL (local heap) package.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5HLpublic_H
+#define _H5HLpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5HP.c b/gatb-core/thirdparty/hdf5/src/H5HP.c
new file mode 100644
index 0000000..f6fb20c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HP.c
@@ -0,0 +1,920 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Provides a heap abstract data type.
+ *
+ *              (See chapter 11 - "Priority Queues" of _Algorithms_, by
+ *              Sedgewick for additional information)
+ *
+ */
+
+
+/* Private headers needed */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HPprivate.h"	/* Heap routines			*/
+#include "H5FLprivate.h"	/* Memory management functions		*/
+
+/* Local Macros */
+#define H5HP_START_SIZE 16      /* Initial number of entries for heaps */
+
+/* Private typedefs & structs */
+
+/* Data structure for entries in the internal heap array */
+typedef struct {
+    int val;            /* Value to be used for heap condition */
+    H5HP_info_t *obj;   /* Pointer to object stored in heap */
+}H5HP_ent_t;
+
+/* Main heap data structure */
+struct H5HP_t {
+    H5HP_type_t type;   /* Type of heap (minimum or maximum value at "top") */
+    size_t nobjs;       /* Number of active objects in heap array */
+    size_t nalloc;      /* Number of allocated locations in heap array */
+    H5HP_ent_t *heap;   /* Pointer to array containing heap entries */
+};
+
+/* Static functions */
+static herr_t H5HP_swim_max(H5HP_t *heap, size_t loc);
+static herr_t H5HP_swim_min(H5HP_t *heap, size_t loc);
+static herr_t H5HP_sink_max(H5HP_t *heap, size_t loc);
+static herr_t H5HP_sink_min(H5HP_t *heap, size_t loc);
+
+/* Declare a free list to manage the H5HP_t struct */
+H5FL_DEFINE_STATIC(H5HP_t);
+
+/* Declare a free list to manage sequences of H5HP_ent_t */
+H5FL_SEQ_DEFINE_STATIC(H5HP_ent_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_swim_max
+ PURPOSE
+    Restore heap condition by moving an object upward
+ USAGE
+    herr_t H5HP_swim_max(heap, loc)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        size_t loc;             IN: Location to start from
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Restore the heap condition for the heap's array by "swimming" the object
+    at a location upward.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine is for "maximum" value heaps.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5HP_swim_max(H5HP_t *heap, size_t loc)
+{
+    int val;                    /* Temporary copy value of object to move in heap */
+    H5HP_info_t *obj;           /* Temporary pointer to object to move in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get copies of the information about the object to move in the heap */
+    val=heap->heap[loc].val;
+    obj=heap->heap[loc].obj;
+
+    /* Move object up in heap until it's reached the maximum location possible */
+    while(heap->heap[loc/2].val < val) {
+        /* Move object "above" current location in heap down */
+        heap->heap[loc].val=heap->heap[loc/2].val;
+        heap->heap[loc].obj=heap->heap[loc/2].obj;
+
+        /* Update heap location for object which moved */
+        heap->heap[loc].obj->heap_loc=loc;
+
+        /* Move to location "above" current location */
+        loc=loc/2;
+    } /* end while */
+
+    /* Put object into heap at correct location */
+    heap->heap[loc].val=val;
+    heap->heap[loc].obj=obj;
+
+    /* Update heap location for object */
+    heap->heap[loc].obj->heap_loc=loc;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_swim_max() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_swim_min
+ PURPOSE
+    Restore heap condition by moving an object upward
+ USAGE
+    herr_t H5HP_swim_min(heap, loc)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        size_t loc;             IN: Location to start from
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Restore the heap condition for the heap's array by "swimming" the object
+    at a location upward.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine is for "minimum" value heaps.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5HP_swim_min(H5HP_t *heap, size_t loc)
+{
+    int val;                    /* Temporary copy value of object to move in heap */
+    H5HP_info_t *obj;           /* Temporary pointer to object to move in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get copies of the information about the object to move in the heap */
+    val=heap->heap[loc].val;
+    obj=heap->heap[loc].obj;
+
+    /* Move object up in heap until it's reached the minimum location possible */
+    while(heap->heap[loc/2].val > val) {
+        /* Move object "above" current location in heap down */
+        heap->heap[loc].val=heap->heap[loc/2].val;
+        heap->heap[loc].obj=heap->heap[loc/2].obj;
+
+        /* Update heap location for object which moved */
+        heap->heap[loc].obj->heap_loc=loc;
+
+        /* Move to location "above" current location */
+        loc=loc/2;
+    } /* end while */
+
+    /* Put object into heap at correct location */
+    heap->heap[loc].val=val;
+    heap->heap[loc].obj=obj;
+
+    /* Update heap location for object */
+    heap->heap[loc].obj->heap_loc=loc;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_swim_min() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_sink_max
+ PURPOSE
+    Restore heap condition by moving an object downward
+ USAGE
+    herr_t H5HP_sink_max(heap, loc)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        size_t loc;             IN: Location to start from
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Restore the heap condition for the heap's array by "sinking" the object
+    at a location downward.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine is for "maximum" value heaps.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5HP_sink_max(H5HP_t *heap, size_t loc)
+{
+    int val;                    /* Temporary copy value of object to move in heap */
+    void *obj;                  /* Temporary pointer to object to move in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get copies of the information about the object to move in the heap */
+    val=heap->heap[loc].val;
+    obj=heap->heap[loc].obj;
+
+    /* Move object up in heap until it's reached the maximum location possible */
+    while((2*loc)<=heap->nobjs) {
+        size_t new_loc=loc*2;   /* New object's potential location area */
+
+        /* Get the greater of the two objects below the location in heap */
+        if(new_loc<heap->nobjs && (heap->heap[new_loc].val < heap->heap[new_loc+1].val))
+            new_loc++;
+
+        /* Check if the object is smaller than the larger of the objects below it */
+        /* If so, its in the correct location now, and we can get out */
+        if(val >= heap->heap[new_loc].val)
+            break;
+
+        /* Move the greater of the two objects below the current location up */
+        heap->heap[loc].val=heap->heap[new_loc].val;
+        heap->heap[loc].obj=heap->heap[new_loc].obj;
+
+        /* Update heap location for object which moved */
+        heap->heap[loc].obj->heap_loc=loc;
+
+        /* Move to location "below" current location */
+        loc=new_loc;
+    } /* end while */
+
+    /* Put object into heap at correct location */
+    heap->heap[loc].val = val;
+    heap->heap[loc].obj = (H5HP_info_t *)obj;
+
+    /* Update heap location for object */
+    heap->heap[loc].obj->heap_loc = loc;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_sink_max() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_sink_min
+ PURPOSE
+    Restore heap condition by moving an object downward
+ USAGE
+    herr_t H5HP_sink_min(heap, loc)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        size_t loc;             IN: Location to start from
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Restore the heap condition for the heap's array by "sinking" the object
+    at a location downward.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine is for "minimum" value heaps.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5HP_sink_min(H5HP_t *heap, size_t loc)
+{
+    int val;                    /* Temporary copy value of object to move in heap */
+    void *obj;                  /* Temporary pointer to object to move in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Get copies of the information about the object to move in the heap */
+    val=heap->heap[loc].val;
+    obj=heap->heap[loc].obj;
+
+    /* Move object up in heap until it's reached the maximum location possible */
+    while((2*loc)<=heap->nobjs) {
+        size_t new_loc=loc*2;   /* New object's potential location area */
+
+        /* Get the lesser of the two objects below the location in heap */
+        if(new_loc<heap->nobjs && (heap->heap[new_loc].val > heap->heap[new_loc+1].val))
+            new_loc++;
+
+        /* Check if the object is greater than the larger of the objects below it */
+        /* If so, its in the correct location now, and we can get out */
+        if(val <= heap->heap[new_loc].val)
+            break;
+
+        /* Move the greater of the two objects below the current location up */
+        heap->heap[loc].val=heap->heap[new_loc].val;
+        heap->heap[loc].obj=heap->heap[new_loc].obj;
+
+        /* Update heap location for object which moved */
+        heap->heap[loc].obj->heap_loc=loc;
+
+        /* Move to location "below" current location */
+        loc=new_loc;
+    } /* end while */
+
+    /* Put object into heap at correct location */
+    heap->heap[loc].val = val;
+    heap->heap[loc].obj = (H5HP_info_t *)obj;
+
+    /* Update heap location for object */
+    heap->heap[loc].obj->heap_loc = loc;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_sink_min() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_create
+ PURPOSE
+    Create a heap
+ USAGE
+    H5HP_t *H5HP_create(heap_type)
+        H5HP_type_t heap_type;          IN: Type of heap to create
+
+ RETURNS
+    Returns a pointer to a heap on success, NULL on failure.
+ DESCRIPTION
+    Create a priority queue.  The SIZE is used to set the initial number of
+    entries allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5HP_t *
+H5HP_create(H5HP_type_t heap_type)
+{
+    H5HP_t *new_heap=NULL;      /* Pointer to new heap object created */
+    H5HP_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check args */
+    HDassert(heap_type==H5HP_MIN_HEAP || heap_type==H5HP_MAX_HEAP);
+
+    /* Allocate ref-counted string structure */
+    if((new_heap=H5FL_MALLOC(H5HP_t))==NULL)
+        HGOTO_ERROR(H5E_HEAP,H5E_NOSPACE,NULL,"memory allocation failed");
+
+    /* Allocate the array to store the heap entries */
+    if((new_heap->heap = H5FL_SEQ_MALLOC(H5HP_ent_t, (size_t)(H5HP_START_SIZE + 1)))==NULL)
+        HGOTO_ERROR(H5E_HEAP,H5E_NOSPACE,NULL,"memory allocation failed");
+
+    /* Set the internal fields */
+    new_heap->type=heap_type;
+    new_heap->nobjs=0;
+    new_heap->nalloc=H5HP_START_SIZE+1;
+
+    /* Set the information in the 0'th location based on the type of heap */
+    if(heap_type==H5HP_MIN_HEAP) {
+        /* Set the value in the '0' location to be the minimum value, to
+         * simplify the algorithms
+         */
+        new_heap->heap[0].val=INT_MIN;
+        new_heap->heap[0].obj=NULL;
+    } /* end if */
+    else {
+        /* Set the value in the '0' location to be the maximum value, to
+         * simplify the algorithms
+         */
+        new_heap->heap[0].val=INT_MAX;
+        new_heap->heap[0].obj=NULL;
+    } /* end else */
+
+    /* Set the return value */
+    ret_value=new_heap;
+
+done:
+    /* Error cleanup */
+    if(NULL ==ret_value) {
+        if(NULL != new_heap) {
+            if(NULL != new_heap->heap)
+                new_heap->heap = H5FL_SEQ_FREE(H5HP_ent_t, new_heap->heap);
+            new_heap = H5FL_FREE(H5HP_t, new_heap);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_count
+ PURPOSE
+    Check the number of elements in a heap
+ USAGE
+    ssize_t H5HP_count(heap)
+        const H5HP_t *heap;     IN: Pointer to heap to query
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Checks the number of elements in heap
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+ssize_t
+H5HP_count(const H5HP_t *heap)
+{
+    ssize_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(heap);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Return the number of objects in the heap */
+    H5_CHECK_OVERFLOW(heap->nobjs,size_t,ssize_t);
+    ret_value=(ssize_t)heap->nobjs;
+
+    /* No post-condition check necessary, since heap is constant */
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_count() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_insert
+ PURPOSE
+    Insert an object into a heap, with an initial value
+ USAGE
+    herr_t H5HP_insert(heap, val, obj)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        int val;                IN: Initial value for object in heap
+        void *obj;              IN: Pointer to object to insert into heap
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Inserts a OBJ into a HEAP, with an initial VALue.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_insert(H5HP_t *heap, int val, void *obj)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(obj);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Increment number of objects in heap */
+    heap->nobjs++;
+
+    /* Check if we need to allocate more room for heap array */
+    if(heap->nobjs>=heap->nalloc) {
+        size_t n = MAX(H5HP_START_SIZE, 2*(heap->nalloc-1)) + 1;
+        H5HP_ent_t *new_heap = H5FL_SEQ_REALLOC(H5HP_ent_t,heap->heap, n);
+
+        if (!new_heap)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend heap array");
+        heap->heap = new_heap;
+        heap->nalloc = n;
+    } /* end if */
+
+    /* Insert new object at end of heap */
+    heap->heap[heap->nobjs].val = val;
+    heap->heap[heap->nobjs].obj = (H5HP_info_t *)obj;
+    heap->heap[heap->nobjs].obj->heap_loc = heap->nobjs;
+
+    /* Restore heap condition */
+    if(heap->type==H5HP_MAX_HEAP) {
+        if(H5HP_swim_max(heap,heap->nobjs)<0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "unable to restore heap condition");
+    } /* end if */
+    else {
+        if(H5HP_swim_min(heap,heap->nobjs)<0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "unable to restore heap condition");
+    } /* end else */
+
+done:
+
+    /* Check internal consistency */
+    /* (Post-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_insert() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_top
+ PURPOSE
+    Check the value of the top object in the heap
+ USAGE
+    herr_t H5HP_top(heap, val)
+        const H5HP_t *heap;     IN: Pointer to heap to modify
+        int val;                IN/OUT: Initial value for object in heap
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Checks the value of the top object in a heap
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_top(const H5HP_t *heap, int *val)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(val);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Get value of the top object in the heap */
+    *val=heap->heap[1].val;
+
+    /* No post-condition check necessary, since heap is constant */
+    FUNC_LEAVE_NOAPI(SUCCEED);
+} /* end H5HP_top() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_remove
+ PURPOSE
+    Remove an object into a heap
+ USAGE
+    herr_t H5HP_remove(heap, val, obj)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        int *val;               OUT: Pointer to value of object removed from heap
+        void **obj;             OUT: Pointer to object removed from heap
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Removes the top object on a heap, returning its value and object pointer
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_remove(H5HP_t *heap, int *val, void **obj)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(val);
+    HDassert(obj);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Check if there are any objects on the heap to remove */
+    if(heap->nobjs==0)
+        HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "heap is empty");
+
+    /* Get the information for the top object on the heap */
+    HDassert(heap->heap[1].obj->heap_loc==1);
+    *val=heap->heap[1].val;
+    *obj=heap->heap[1].obj;
+
+    /* Move the last element in the heap to the top */
+    heap->heap[1].val=heap->heap[heap->nobjs].val;
+    heap->heap[1].obj=heap->heap[heap->nobjs].obj;
+    heap->heap[1].obj->heap_loc=1;
+
+    /* Decrement number of objects in heap */
+    heap->nobjs--;
+
+    /* Restore heap condition, if there are objects on the heap */
+    if(heap->nobjs>0) {
+        if(heap->type==H5HP_MAX_HEAP) {
+            if(H5HP_sink_max(heap, (size_t)1) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to restore heap condition");
+        } /* end if */
+        else {
+            if(H5HP_sink_min(heap, (size_t)1) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to restore heap condition");
+        } /* end else */
+    } /* end if */
+
+done:
+
+    /* Check internal consistency */
+    /* (Post-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_remove() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_change
+ PURPOSE
+    Change the priority of an object on a heap
+ USAGE
+    herr_t H5HP_change(heap, val, obj)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        int val;                IN: New priority value for object
+        void *obj;              IN: Pointer to object to modify
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Changes the priority of an object on a heap.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_change(H5HP_t *heap, int val, void *_obj)
+{
+    H5HP_info_t *obj=(H5HP_info_t *)_obj;       /* Alias for object */
+    size_t obj_loc;             /* Location of object in heap */
+    int old_val;                /* Object's old priority value */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(obj);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Get the location of the object in the heap */
+    obj_loc=obj->heap_loc;
+    HDassert(obj_loc>0 && obj_loc<=heap->nobjs);
+
+    /* Change the heap object's priority */
+    old_val=heap->heap[obj_loc].val;
+    heap->heap[obj_loc].val=val;
+
+    /* Restore heap condition */
+    if(val<old_val) {
+        if(heap->type==H5HP_MAX_HEAP) {
+            if(H5HP_sink_max(heap,obj_loc)<0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+        } /* end if */
+        else {
+            if(H5HP_swim_min(heap,obj_loc)<0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+        } /* end else */
+    } /* end if */
+    else {
+        if(heap->type==H5HP_MAX_HEAP) {
+            if(H5HP_swim_max(heap,obj_loc)<0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+        } /* end if */
+        else {
+            if(H5HP_sink_min(heap,obj_loc)<0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+        } /* end else */
+    } /* end else */
+
+done:
+
+    /* Check internal consistency */
+    /* (Post-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_change() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_incr
+ PURPOSE
+    Increment the priority of an object on a heap
+ USAGE
+    herr_t H5HP_incr(heap, amt, obj)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        unsigned amt;           IN: Amount to increase priority by
+        void *obj;              IN: Pointer to object to modify
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Increments the priority of an object on a heap by one.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_incr(H5HP_t *heap, unsigned amt, void *_obj)
+{
+    H5HP_info_t *obj=(H5HP_info_t *)_obj;       /* Alias for object */
+    size_t obj_loc;             /* Location of object in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(obj);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Get the location of the object in the heap */
+    obj_loc = obj->heap_loc;
+    HDassert(obj_loc > 0 && obj_loc <= heap->nobjs);
+
+    /* Change the heap object's priority */
+    heap->heap[obj_loc].val += (int)amt;
+
+    /* Restore heap condition */
+    if(H5HP_MAX_HEAP == heap->type) {
+        if(H5HP_swim_max(heap, obj_loc) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition")
+    } /* end if */
+    else {
+        if(H5HP_sink_min(heap, obj_loc) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition")
+    } /* end else */
+
+done:
+
+    /* Check internal consistency */
+    /* (Post-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_incr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_decr
+ PURPOSE
+    Decrement the priority of an object on a heap
+ USAGE
+    herr_t H5HP_dec(heap, amt, obj)
+        H5HP_t *heap;           IN/OUT: Pointer to heap to modify
+        unsigned amt;           IN: Amount to decrease priority by
+        void *obj;              IN: Pointer to object to modify
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Decrements the priority of an object on a heap by one.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_decr(H5HP_t *heap, unsigned amt, void *_obj)
+{
+    H5HP_info_t *obj=(H5HP_info_t *)_obj;       /* Alias for object */
+    size_t obj_loc;             /* Location of object in heap */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(heap);
+    HDassert(obj);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    /* Get the location of the object in the heap */
+    obj_loc=obj->heap_loc;
+    HDassert(obj_loc>0 && obj_loc<=heap->nobjs);
+
+    /* Change the heap object's priority */
+    heap->heap[obj_loc].val-=amt;
+
+    /* Restore heap condition */
+    if(heap->type==H5HP_MAX_HEAP) {
+        if(H5HP_sink_max(heap,obj_loc)<0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+    } /* end if */
+    else {
+        if(H5HP_swim_min(heap,obj_loc)<0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition");
+    } /* end else */
+
+done:
+
+    /* Check internal consistency */
+    /* (Post-condition) */
+    HDassert(heap->nobjs<heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type==H5HP_MAX_HEAP && heap->heap[0].val==INT_MAX) ||
+        (heap->type==H5HP_MIN_HEAP && heap->heap[0].val==INT_MIN));
+    HDassert(heap->heap[0].obj==NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5HP_decr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5HP_close
+ PURPOSE
+    Close a heap, deallocating it.
+ USAGE
+    herr_t H5HP_close(heap)
+        H5HP_t *heap;            IN/OUT: Pointer to heap to close
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a heap, freeing all internal information.  Any objects left in
+    the heap are not deallocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5HP_close(H5HP_t *heap)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(heap);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+    HDassert(heap->nobjs < heap->nalloc);
+    HDassert(heap->heap);
+    HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) ||
+        (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN));
+    HDassert(NULL == heap->heap[0].obj);
+
+    /* Free internal structures for heap */
+    heap->heap = H5FL_SEQ_FREE(H5HP_ent_t, heap->heap);
+
+    /* Free actual heap object */
+    heap = H5FL_FREE(H5HP_t, heap);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HP_close() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5HPprivate.h b/gatb-core/thirdparty/hdf5/src/H5HPprivate.h
new file mode 100644
index 0000000..8db5b21
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5HPprivate.h
@@ -0,0 +1,71 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5HP module
+ */
+#ifndef _H5HPprivate_H
+#define _H5HPprivate_H
+
+/**************************************/
+/* Public headers needed by this file */
+/**************************************/
+#ifdef LATER
+#include "H5HPpublic.h"
+#endif /* LATER */
+
+/***************************************/
+/* Private headers needed by this file */
+/***************************************/
+#include "H5private.h"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Typedef for heap struct (defined in H5HP.c) */
+typedef struct H5HP_t H5HP_t;
+
+/* Typedef for objects which can be inserted into heaps */
+/* This _must_ be the first field in objects which can be inserted into heaps */
+typedef struct H5HP_info_t {
+    size_t heap_loc;                    /* Location of object in heap */
+}H5HP_info_t;
+
+/* Typedef for type of heap to create */
+typedef enum {
+    H5HP_MIN_HEAP,      /* Minimum values in heap are at the "top" */
+    H5HP_MAX_HEAP       /* Maximum values in heap are at the "top" */
+} H5HP_type_t;
+
+/**********/
+/* Macros */
+/**********/
+
+/********************/
+/* Private routines */
+/********************/
+H5_DLL H5HP_t *H5HP_create(H5HP_type_t heap_type);
+H5_DLL herr_t H5HP_insert(H5HP_t *heap, int val, void *obj);
+H5_DLL ssize_t H5HP_count(const H5HP_t *heap);
+H5_DLL herr_t H5HP_top(const H5HP_t *heap, int *val);
+H5_DLL herr_t H5HP_remove(H5HP_t *heap, int *val, void **ptr);
+H5_DLL herr_t H5HP_change(H5HP_t *heap, int val, void *obj);
+H5_DLL herr_t H5HP_incr(H5HP_t *heap, unsigned amt, void *obj);
+H5_DLL herr_t H5HP_decr(H5HP_t *heap, unsigned amt, void *obj);
+H5_DLL herr_t H5HP_close(H5HP_t *heap);
+
+#endif /* _H5HPprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5I.c b/gatb-core/thirdparty/hdf5/src/H5I.c
new file mode 100644
index 0000000..4eeaba0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5I.c
@@ -0,0 +1,2440 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * FILE:	H5I.c - Internal storage routines for handling "IDs"
+ *
+ * REMARKS:	ID's which allow objects (void *'s currently) to be bundled
+ *		into "types" for more general storage.
+ *
+ * DESIGN:	The types are stored in an array of pointers to store each
+ *		type in an element. Each "type" node contains a link to a
+ *		hash table to manage the IDs in each type.  Allowed types are
+ *		values within the range 1 to H5I_MAX_NUM_TYPES and are given out
+ *		at run-time.  Types used by the library are stored in global
+ *		variables defined in H5Ipublic.h.
+ *
+ * AUTHOR:	Quincey Koziol
+ *
+ * MODIFICATIONS:
+ *	1/3/96	- Starting writing specs & coding prototype
+ *	1/7/96	- Finished coding prototype
+ *	6/10/97 - Moved into HDF5 library
+ *	5/18/04 - Expanded to allow registration of new types at run-time
+ */
+
+#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5I_init_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Ipkg.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5SLprivate.h"	/* Skip Lists                           */
+
+/* Define this to compile in support for dumping ID information */
+/* #define H5I_DEBUG_OUTPUT */
+#ifndef H5I_DEBUG_OUTPUT
+#include "H5Gprivate.h"		/* Groups				*/
+#else /* H5I_DEBUG_OUTPUT */
+#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Tprivate.h"		/* Datatypes				*/
+#endif /* H5I_DEBUG_OUTPUT */
+
+/* Local Macros */
+
+/* Define the maximum number of returned ID structures to keep around
+   for re-use. */
+#define MAX_FREE_ID_STRUCTS 1000
+
+/* Combine a Type number and an atom index into an atom */
+#define H5I_MAKE(g,i)	((((hid_t)(g) & TYPE_MASK) << ID_BITS) |	  \
+			     ((hid_t)(i) & ID_MASK))
+
+/* Local typedefs */
+
+/* Atom information structure used */
+typedef struct H5I_id_info_t {
+    hid_t	id;		/* ID for this info			    */
+    unsigned	count;		/* ref. count for this atom		    */
+    unsigned    app_count;      /* ref. count of application visible atoms  */
+    const void	*obj_ptr;	/* pointer associated with the atom	    */
+} H5I_id_info_t;
+
+/* ID type structure used */
+typedef struct {
+    const H5I_class_t *cls;     /* Pointer to ID class                      */
+    unsigned	init_count;	/* # of times this type has been initialized*/
+    hbool_t	wrapped;	/* Whether the id count has wrapped around  */
+    unsigned	id_count;	/* Current number of IDs held		    */
+    hid_t	nextid;		/* ID to use for the next atom		    */
+    H5SL_t      *ids;           /* Pointer to skip list that stores IDs     */
+
+    /* Fields for holding available IDs */
+    unsigned    avail_count;    /* # of available ID structures awaiting recycling */
+    H5SL_t      *avail_ids;     /* pointer to skip list of available IDs */
+} H5I_id_type_t;
+
+typedef struct {
+    H5I_search_func_t app_cb;   /* Application's callback routine */
+    void *app_key;              /* Application's "key" (user data) */
+    void *ret_obj;              /* Object to return */
+} H5I_search_ud_t;
+
+/* User data for iterator callback when IDs have wrapped */
+typedef struct {
+    hid_t nextid;               /* Next ID to expect */
+} H5I_wrap_ud_t;
+
+/* User data for iterator callback for ID iteration */
+typedef struct {
+    H5I_search_func_t user_func;        /* 'User' function to invoke */
+    void *user_udata;                   /* User data to pass to 'user' function */
+    hbool_t app_ref;                    /* Whether this is an appl. ref. call */
+} H5I_iterate_ud_t;
+
+/* User data for H5I__clear_type_cb */
+typedef struct {
+    H5I_id_type_t *type_ptr;    /* Pointer to the type being cleard */
+    hbool_t force;              /* Whether to always remove the id */
+    hbool_t app_ref;            /* Whether this is an appl. ref. call */
+} H5I_clear_type_ud_t;
+
+/*-------------------- Locally scoped variables -----------------------------*/
+
+/* Array of pointers to atomic types */
+static H5I_id_type_t *H5I_id_type_list_g[H5I_MAX_NUM_TYPES];
+
+/* Variable to keep track of the number of types allocated.  Its value is the */
+/* next type ID to be handed out, so it is always one greater than the number */
+/* of types. */
+/* Starts at 1 instead of 0 because it makes trace output look nicer.  If more */
+/* types (or IDs within a type) are needed, adjust TYPE_BITS in H5Ipkg.h       */
+/* and/or increase size of hid_t */
+static H5I_type_t H5I_next_type = (H5I_type_t) H5I_NTYPES;
+
+/* Declare a free list to manage the H5I_id_info_t struct */
+H5FL_DEFINE_STATIC(H5I_id_info_t);
+
+/* Declare a free list to manage the H5I_id_type_t struct */
+H5FL_DEFINE_STATIC(H5I_id_type_t);
+
+/* Declare a free list to manage the H5I_class_t struct */
+H5FL_DEFINE_STATIC(H5I_class_t);
+
+/*--------------------- Local function prototypes ---------------------------*/
+static herr_t H5I__free_cb(void *_item, void *_key, void *_udata);
+static htri_t H5I__clear_type_cb(void *_id, void *key, void *udata);
+static int H5I__destroy_type(H5I_type_t type);
+static void *H5I__remove_verify(hid_t id, H5I_type_t id_type);
+static void *H5I__remove_common(H5I_id_type_t *type_ptr, hid_t id);
+static int H5I__inc_type_ref(H5I_type_t type);
+static int H5I__get_type_ref(H5I_type_t type);
+static H5I_id_info_t *H5I__find_id(hid_t id);
+#ifdef H5I_DEBUG_OUTPUT
+static herr_t H5I__debug(H5I_type_t type);
+#endif /* H5I_DEBUG_OUTPUT */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5I_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5I_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5I_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5I_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_term_interface
+ *
+ * Purpose:	Terminate the H5I interface: release all memory, reset all
+ *		global variables to initial values. This only happens if all
+ *		types have been destroyed from other interfaces.
+ *
+ * Return:	Success:	Positive if any action was taken that might
+ *				affect some other interface; zero otherwise.
+ *
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_term_interface(void)
+{
+    H5I_id_type_t	*type_ptr;
+    H5I_type_t		type;
+    int		n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        /* How many types are still being used? */
+        for(type = (H5I_type_t)0; type < H5I_next_type; H5_INC_ENUM(H5I_type_t, type)) {
+            if((type_ptr = H5I_id_type_list_g[type]) && type_ptr->ids)
+                n++;
+        } /* end for */
+
+        /* If no types are used then clean up */
+        if(0 == n) {
+            for(type = (H5I_type_t)0; type < H5I_next_type; H5_INC_ENUM(H5I_type_t,type)) {
+                type_ptr = H5I_id_type_list_g[type];
+                if(type_ptr) {
+                    HDassert(NULL == type_ptr->ids);
+                    type_ptr = H5FL_FREE(H5I_id_type_t, type_ptr);
+                    H5I_id_type_list_g[type] = NULL;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+
+        /* Mark interface closed */
+        H5_interface_initialize_g = 0;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5I_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iregister_type
+ *
+ * Purpose:	Public interface to H5I_register_type.  Creates a new type
+ *		of ID's to give out.  A specific number (RESERVED) of type
+ *		entries may be reserved to enable "constant" values to be handed
+ *		out which are valid IDs in the type, but which do not map to any
+ *		data structures and are not allocated dynamically later. HASH_SIZE is
+ *		the minimum hash table size to use for the type. FREE_FUNC is
+ *		called with an object pointer when the object is removed from
+ *		the type.
+ *
+ * Return:	Success:	Type ID of the new type
+ *		Failure:	H5I_BADID
+ *
+ * Programmers:	Nathaniel Furrer
+ *		James Laird
+ *		Friday, April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+H5I_type_t
+H5Iregister_type(size_t hash_size, unsigned reserved, H5I_free_t free_func)
+{
+    H5I_class_t *cls = NULL;    /* New ID class */
+    H5I_type_t new_type;        /* New ID type value */
+    H5I_type_t ret_value;       /* Return value */
+
+    FUNC_ENTER_API(H5I_BADID)
+    H5TRACE3("It", "zIux", hash_size, reserved, free_func);
+
+    /* Generate a new H5I_type_t value */
+
+    /* Increment the number of types*/
+    if(H5I_next_type < H5I_MAX_NUM_TYPES) {
+        new_type = H5I_next_type;
+        H5_INC_ENUM(H5I_type_t, H5I_next_type);
+    } /* end if */
+    else {
+        hbool_t done;       /* Indicate that search was successful */
+        int i;              /* Local index variable */
+
+        /* Look for a free type to give out */
+        done = FALSE;
+        for(i = H5I_NTYPES; i < H5I_MAX_NUM_TYPES && done == FALSE; i++) {
+            if(NULL == H5I_id_type_list_g[i]) {
+                /* Found a free type ID */
+                new_type = (H5I_type_t)i;
+                done = TRUE;
+            } /* end if */
+        } /* end for */
+
+        /* Verify that we found a type to give out */
+        if(done == FALSE)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5I_BADID, "Maximum number of ID types exceeded.")
+    } /* end else */
+
+    /* Allocate new ID class */
+    if(NULL == (cls = H5FL_MALLOC(H5I_class_t)))
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTALLOC, H5I_BADID, "ID class allocation failed")
+
+    /* Initialize class fields */
+    cls->type_id = new_type;
+    cls->flags = H5I_CLASS_IS_APPLICATION;
+    cls->reserved = reserved;
+    cls->free_func = free_func;
+
+    /* Register the new ID class */
+    if(H5I_register_type(cls) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, H5I_BADID, "can't initialize ID class")
+
+    /* Set return value */
+    ret_value = new_type;
+
+done:
+    /* Clean up on error */
+    if(ret_value < 0) {
+        if(cls)
+            cls = H5FL_FREE(H5I_class_t, cls);
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iregister_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_register_type
+ *
+ * Purpose:	Creates a new type of ID's to give out.
+ *		The class is initialized or its reference count is incremented
+ *              (if it is already initialized).
+ *
+ * Return:	Success:	Type ID of the new type
+ *		Failure:	H5I_BADID
+ *
+ * Programmers:	Nathaniel Furrer
+ *		James Laird
+ *		Friday, April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5I_register_type(const H5I_class_t *cls)
+{
+    H5I_id_type_t *type_ptr = NULL;	/* Ptr to the atomic type*/
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(cls);
+    HDassert(cls->type_id > 0 && cls->type_id < H5I_MAX_NUM_TYPES);
+
+    /* Initialize the type */
+    if(NULL == H5I_id_type_list_g[cls->type_id]) {
+        /* Allocate the type information for new type */
+        if(NULL == (type_ptr = (H5I_id_type_t *)H5FL_CALLOC(H5I_id_type_t)))
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTALLOC, FAIL, "ID type allocation failed")
+        H5I_id_type_list_g[cls->type_id] = type_ptr;
+    } /* end if */
+    else {
+        /* Get the pointer to the existing type */
+        type_ptr = H5I_id_type_list_g[cls->type_id];
+    } /* end else */
+
+    /* Initialize the ID type structure for new types */
+    if(type_ptr->init_count == 0) {
+        type_ptr->cls = cls;
+        type_ptr->wrapped = FALSE;
+        type_ptr->id_count = 0;
+        type_ptr->nextid = (hid_t)cls->reserved;
+        if(NULL == (type_ptr->ids = H5SL_create(H5SL_TYPE_HID, NULL)))
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTCREATE, FAIL, "skip list creation failed")
+        type_ptr->avail_count = 0;
+        if(NULL == (type_ptr->avail_ids = H5SL_create(H5SL_TYPE_HID, NULL)))
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTCREATE, FAIL, "skip list creation failed")
+    } /* end if */
+
+    /* Increment the count of the times this type has been initialized */
+    type_ptr->init_count++;
+
+done:
+    if(ret_value < 0) {	/* Clean up on error */
+        if(type_ptr) {
+            if(type_ptr->ids)
+                H5SL_close(type_ptr->ids);
+            if(type_ptr->avail_ids)
+                H5SL_close(type_ptr->avail_ids);
+            (void)H5FL_FREE(H5I_id_type_t, type_ptr);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_register_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Itype_exists
+ *
+ * Purpose:     Query function to inform the user if a given type is
+ *              currently registered with the library.
+ *
+ * Return:	Success:        1 if the type is registered, 0 if it is not
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		Nathaniel Furrer
+ *              Tuesday, June 29, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Itype_exists(H5I_type_t type)
+{
+    htri_t ret_value = TRUE;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "It", type);
+
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+
+    if(NULL == H5I_id_type_list_g[type])
+        ret_value = FALSE;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Itype_exists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Inmembers
+ *
+ * Purpose:	Returns the number of members in a type.  Public interface to
+ *		H5I_nmembers.  The public interface throws an error if the
+ *              supplied type does not exist.  This is different than the
+ *              private interface, which will just return 0.
+ *
+ * Return:	Success:	Zero
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		Nathaniel Furrer
+ *              Friday, April 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Inmembers(H5I_type_t type, hsize_t *num_members)
+{
+    int ret_value = SUCCEED;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "It*h", type, num_members);
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    /* Validate parameters.  This needs to be done here, instead of letting
+     * the private interface handle it, because the public interface throws
+     * an error when the supplied type does not exist.
+     */
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+    if(NULL == H5I_id_type_list_g[type])
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "supplied type does not exist")
+
+    if(num_members) {
+        int members;
+
+        if((members = H5I_nmembers(type)) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTCOUNT, FAIL, "can't compute number of members")
+
+        H5_CHECKED_ASSIGN(*num_members, hsize_t, members, int);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Inmembers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_nmembers
+ *
+ * Purpose:	Returns the number of members in a type.
+ *
+ * Return:	Success:	Number of members; zero if the type is empty
+ *				or has been deleted.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, March 24, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_nmembers(H5I_type_t type)
+{
+    H5I_id_type_t	*type_ptr = NULL;
+    int		        ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(type <= H5I_BADID || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+    if(NULL == (type_ptr = H5I_id_type_list_g[type]) || type_ptr->init_count <= 0)
+        HGOTO_DONE(0);
+
+    /* Set return value */
+    H5_CHECKED_ASSIGN(ret_value, int, type_ptr->id_count, unsigned);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_nmembers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iclear_type
+ *
+ * Purpose:	Removes all objects from the type, calling the free
+ *		function for each object regardless of the reference count.
+ *		Public interface to H5I_clear_type.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	James Laird
+ *		Nathaniel Furrer
+ *              Friday, April 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Iclear_type(H5I_type_t type, hbool_t force)
+{
+    herr_t ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "Itb", type, force);
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    ret_value = H5I_clear_type(type, force, TRUE);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iclear_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__free_cb
+ *
+ * Purpose:	Callback for freeing ID nodes in H5I__remove_common
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, October 4, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5I__free_cb(void *_item, void H5_ATTR_UNUSED *_key, void H5_ATTR_UNUSED *_udata)
+{
+    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(item);
+
+    item = H5FL_FREE(H5I_id_info_t, item);
+
+    FUNC_LEAVE_NOAPI(H5_ITER_CONT)
+} /* end H5I__free_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_clear_type
+ *
+ * Purpose:	Removes all objects from the type, calling the free
+ *		function for each object regardless of the reference count.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, March 24, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5I_clear_type(H5I_type_t type, hbool_t force, hbool_t app_ref)
+{
+    H5I_clear_type_ud_t udata;          /* udata struct for callback */
+    int         ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(type <= H5I_BADID || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+
+    udata.type_ptr = H5I_id_type_list_g[type];
+    if(udata.type_ptr == NULL || udata.type_ptr->init_count <= 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* Finish constructing udata */
+    udata.force = force;
+    udata.app_ref = app_ref;
+
+    /* Attempt to free all ids in the type */
+    if(H5SL_try_free_safe(udata.type_ptr->ids, H5I__clear_type_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDELETE, FAIL, "can't free ids in type")
+
+    /* Also free any ID structures being retained for potential re-use */
+    if(udata.type_ptr->avail_count > 0) {
+        if(H5SL_free(udata.type_ptr->avail_ids, H5I__free_cb, NULL) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, FAIL, "can't release available ID nodes")
+        udata.type_ptr->avail_count = 0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_clear_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5I__clear_type_cb
+ *
+ * Purpose:     Attempts to free the specified ID , calling the free
+ *              function for the object.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, July 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5I__clear_type_cb(void *_id, void H5_ATTR_UNUSED *key, void *_udata)
+{
+    H5I_id_info_t       *id = (H5I_id_info_t *)_id; /* Current ID being worked with */
+    H5I_clear_type_ud_t *udata = (H5I_clear_type_ud_t *)_udata; /* udata struct */
+    htri_t              ret_value = FALSE;    /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(id);
+    HDassert(udata);
+    HDassert(udata->type_ptr);
+
+    /*
+     * Do nothing to the object if the reference count is larger than
+     * one and forcing is off.
+     */
+    if(udata->force || (id->count - (!udata->app_ref * id->app_count)) <= 1) {
+        /* Check for a 'free' function and call it, if it exists */
+        /* (Casting away const OK -QAK) */
+        if(udata->type_ptr->cls->free_func && (udata->type_ptr->cls->free_func)((void *)id->obj_ptr) < 0) {
+            if(udata->force) {
+#ifdef H5I_DEBUG
+                if(H5DEBUG(I)) {
+                    fprintf(H5DEBUG(I), "H5I: free type=%d obj=0x%08lx "
+                            "failure ignored\n",
+                            (int)udata->type_ptr->cls->type_id,
+                            (unsigned long)(id->obj_ptr));
+                } /* end if */
+#endif /*H5I_DEBUG*/
+
+                /* Indicate node should be removed from list */
+                ret_value = TRUE;
+            } /* end if */
+        } /* end if */
+        else {
+            /* Indicate node should be removed from list */
+            ret_value = TRUE;
+        } /* end else */
+
+        /* Remove ID if requested */
+        if(ret_value) {
+            /* Free ID info */
+            id = H5FL_FREE(H5I_id_info_t, id);
+
+            /* Decrement the number of IDs in the type */
+            udata->type_ptr->id_count--;
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__clear_type_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Idestroy_type
+ *
+ * Purpose:	Destroys a type along with all atoms in that type
+ *		regardless of their reference counts. Destroying IDs
+ *		involves calling the free-func for each ID's object and
+ *		then adding the ID struct to the ID free list.  Public
+ *		interface to H5I__destroy_type.
+ *
+ * Return:	Zero on success/Negative on failure
+ *
+ * Programmer:	Nathaniel Furrer
+ *		James Laird
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Idestroy_type(H5I_type_t type)
+{
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "It", type);
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    ret_value = H5I__destroy_type(type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Idestroy_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__destroy_type
+ *
+ * Purpose:	Destroys a type along with all atoms in that type
+ *		regardless of their reference counts. Destroying IDs
+ *		involves calling the free-func for each ID's object and
+ *		then adding the ID struct to the ID free list.
+ *
+ * Return:	Zero on success/Negative on failure
+ *
+ * Programmer:	Nathaniel Furrer
+ *		James Laird
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5I__destroy_type(H5I_type_t type)
+{
+    H5I_id_type_t *type_ptr;	/* ptr to the atomic type */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    if(type <= H5I_BADID || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+
+    type_ptr = H5I_id_type_list_g[type];
+    if(type_ptr == NULL || type_ptr->init_count <= 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* Close/clear/destroy all IDs for this type */
+    H5E_BEGIN_TRY {
+        H5I_clear_type(type, TRUE, FALSE);
+    } H5E_END_TRY       /*don't care about errors*/
+
+    /* Check if we should release the ID class */
+    if(type_ptr->cls->flags & H5I_CLASS_IS_APPLICATION)
+        type_ptr->cls = H5FL_FREE(H5I_class_t, (void *)type_ptr->cls);
+
+    if(H5SL_close(type_ptr->avail_ids) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEOBJ, FAIL, "can't close skip list")
+    type_ptr->avail_ids = NULL;
+
+    if(H5SL_close(type_ptr->ids) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEOBJ, FAIL, "can't close skip list")
+    type_ptr->ids = NULL;
+
+    type_ptr = H5FL_FREE(H5I_id_type_t, type_ptr);
+    H5I_id_type_list_g[type] = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__destroy_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iregister
+ *
+ * Purpose:	Public interface to H5I_register.
+ *
+ * Return:	Success:	New object id.
+ *		Failure:	Negative
+ *
+ * Programmer:	Nathaniel Furrer
+ *		James Laird
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Iregister(H5I_type_t type, const void *object)
+{
+    hid_t ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(H5I_INVALID_HID)
+    H5TRACE2("i", "It*x", type, object);
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    ret_value = H5I_register(type, object, TRUE);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__wrapped_cb
+ *
+ * Purpose:	Callback for searching for next free ID, when IDs have wrapped
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October 3, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5I__wrapped_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
+{
+    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
+    H5I_wrap_ud_t *udata = (H5I_wrap_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = H5_ITER_CONT;                       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(item);
+    HDassert(udata);
+
+    /* Break out if we see a free ID */
+    if(udata->nextid != (ID_MASK & item->id)) {
+        /* Sanity check */
+        HDassert(item->id > udata->nextid);
+
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+    else
+        /* Increment to expect the next ID */
+        udata->nextid++;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__wrapped_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_register
+ *
+ * Purpose:	Registers an OBJECT in a TYPE and returns an ID for it.
+ *		This routine does _not_ check for unique-ness of the objects,
+ *		if you register an object twice, you will get two different
+ *		IDs for it.  This routine does make certain that each ID in a
+ *		type is unique.  IDs are created by getting a unique number
+ *		for the type the ID is in and incorporating the type into
+ *		the ID which is returned to the user.
+ *
+ * Return:	Success:	New object id.
+ *		Failure:	Negative
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5I_register(H5I_type_t type, const void *object, hbool_t app_ref)
+{
+    H5I_id_type_t	*type_ptr;	/*ptr to the type		*/
+    H5I_id_info_t	*id_ptr;	/*ptr to the new ID information */
+    hid_t		ret_value = SUCCEED; /*return value		*/
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+    type_ptr = H5I_id_type_list_g[type];
+    if(NULL == type_ptr || type_ptr->init_count <= 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* If there is an available ID structure, use it. */
+    if(type_ptr->avail_count > 0) {
+        /* Use existing available ID struct */
+        if(NULL == (id_ptr = (H5I_id_info_t *)H5SL_remove_first(type_ptr->avail_ids)))
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, FAIL, "can't remove ID from available ID list")
+    
+        /* Decrease count of available ID structures */
+        type_ptr->avail_count--;
+    } /* end if */
+    /* If no available ID structure, then create a new id for use, and
+     * allocate a new struct to house it. */
+    else {
+        /*
+         * This next section of code checks for the 'nextid' getting too large and
+         * wrapping around, thus necessitating checking for duplicate IDs being
+         * handed out.
+         */
+        if(type_ptr->nextid > (hid_t)ID_MASK)
+            type_ptr->wrapped = TRUE;
+
+        /*
+         * If we've wrapped around then we need to check for duplicate id's being
+         * handed out.
+         */
+        if(type_ptr->wrapped) {
+            H5I_wrap_ud_t udata;    /* User data for iteration */
+            herr_t iter_status;     /* Iteration status */
+
+            /* Set up user data for iteration */
+            udata.nextid = (hid_t)type_ptr->cls->reserved;
+
+            /* Iterate over all the ID nodes, looking for a gap in the ID sequence */
+            if((iter_status = H5SL_iterate(type_ptr->ids, H5I__wrapped_cb, &udata)) < 0)
+                HGOTO_ERROR(H5E_ATOM, H5E_BADITER, FAIL, "ID iteration failed")
+
+            /* If we didn't break out of the iteration and we're at the max. ID, we've used all the IDs */
+            if(0 == iter_status && udata.nextid >= ID_MASK)
+                HGOTO_ERROR(H5E_ATOM, H5E_NOIDS, FAIL, "no IDs available in type")
+
+            /* Sanity check */
+            HDassert(udata.nextid < ID_MASK);
+
+            /* Retain the next ID for the class */
+            type_ptr->nextid = udata.nextid;
+        } /* end if */
+
+        /* Allocate new ID struct */
+        if(NULL == (id_ptr = H5FL_MALLOC(H5I_id_info_t)))
+            HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Make a new ID */
+        id_ptr->id = H5I_MAKE(type, type_ptr->nextid);
+
+        /* Increment nextid value */
+        type_ptr->nextid++;
+    } /* end if */
+
+    /* Fill in remaining fields of ID struct */
+    id_ptr->count = 1; /*initial reference count*/
+    id_ptr->app_count = !!app_ref;
+    id_ptr->obj_ptr = object;
+
+    /* Insert into the type */
+    if(H5SL_insert(type_ptr->ids, id_ptr, &id_ptr->id) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINSERT, FAIL, "can't insert ID node into skip list")
+    type_ptr->id_count++;
+
+    /* Set return value */
+    ret_value = id_ptr->id;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_register() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_subst
+ *
+ * Purpose:	Substitute a new object pointer for the specified ID.
+ *
+ * Return:	Success:	Non-null previous object pointer associated
+ *				with the specified ID.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, February 27, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5I_subst(hid_t id, const void *new_object)
+{
+    H5I_id_info_t	*id_ptr;	/* Ptr to the atom	*/
+    void		*ret_value;	/* Return value		*/
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* General lookup of the ID */
+    if(NULL == (id_ptr = H5I__find_id(id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_NOTFOUND, NULL, "can't get ID ref count")
+
+    /* Get the old object pointer to return */
+    /* (Casting away const OK -QAK) */
+    ret_value = (void *)id_ptr->obj_ptr;
+
+    /* Set the new object pointer for the ID */
+    id_ptr->obj_ptr = new_object;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end if */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_object
+ *
+ * Purpose:	Find an object pointer for the specified ID.
+ *
+ * Return:	Success:	Non-null object pointer associated with the
+ *				specified ID.
+ *		Failure:	NULL
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5I_object(hid_t id)
+{
+    H5I_id_info_t	*id_ptr;		/*ptr to the new atom	*/
+    void		*ret_value = NULL;	/*return value		*/
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* General lookup of the ID */
+    if(NULL != (id_ptr = H5I__find_id(id))) {
+        /* Get the object pointer to return */
+        /* (Casting away const OK -QAK) */
+        ret_value = (void *)id_ptr->obj_ptr;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end if */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iobject_verify
+ *
+ * Purpose:	Find an object pointer for the specified ID, verifying that
+ *                  its in a particular type.  Public interface to
+ *					H5I_object_verify.
+ *
+ * Return:	Success:	Non-null object pointer associated with the
+ *				specified ID.
+ *		Failure:	NULL
+ *
+ * Programmer:	Nathaniel Furrer
+ *		James Laird
+ *		Friday, April 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5Iobject_verify(hid_t id, H5I_type_t id_type)
+{
+    void * ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE2("*x", "iIt", id, id_type);
+
+    if(H5I_IS_LIB_TYPE(id_type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type")
+
+    if(id_type < 1 || id_type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "identifier has invalid type")
+
+    ret_value = H5I_object_verify(id, id_type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iobject_verify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_object_verify
+ *
+ * Purpose:	Find an object pointer for the specified ID, verifying that
+ *                  its in a particular type.
+ *
+ * Return:	Success:	Non-null object pointer associated with the
+ *				specified ID.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, July 31, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5I_object_verify(hid_t id, H5I_type_t id_type)
+{
+    H5I_id_info_t	*id_ptr = NULL;		/*ptr to the new atom	*/
+    void		*ret_value = NULL;	/*return value		*/
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(id_type >= 1 && id_type < H5I_next_type);
+
+    /* Verify that the type of the ID is correct & lookup the ID */
+    if(id_type == H5I_TYPE(id) && NULL != (id_ptr = H5I__find_id(id))) {
+        /* Get the object pointer to return */
+        /* (Casting away const OK -QAK) */
+        ret_value = (void *)id_ptr->obj_ptr;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5I_object_verify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_get_type
+ *
+ * Purpose:	Given an object ID return the type to which it
+ *		belongs.  The ID need not be the ID of an object which
+ *		currently exists because the type number is encoded
+ *		in the object ID.
+ *
+ * Return:	Success:	A valid type number
+ *		Failure:	H5I_BADID, a negative value.
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, February 19, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+H5I_type_t
+H5I_get_type(hid_t id)
+{
+    H5I_type_t		ret_value = H5I_BADID;
+
+    FUNC_ENTER_NOAPI(H5I_BADID)
+
+    if(id > 0)
+        ret_value = H5I_TYPE(id);
+
+    HDassert(ret_value >= H5I_BADID && ret_value < H5I_next_type);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_get_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iget_type
+ *
+ * Purpose:	The public version of H5I_get_type(), obtains a type number
+ *		when given an ID.  The ID need not be the ID of an
+ *		object which currently exists because the type number is
+ *		encoded as part of the ID.
+ *
+ * Return:	Success:	Type number
+ *		Failure:	H5I_BADID, a negative value
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+H5I_type_t
+H5Iget_type(hid_t id)
+{
+    H5I_type_t		ret_value = H5I_BADID;          /* Return value */
+
+    FUNC_ENTER_API(H5I_BADID)
+    H5TRACE1("It", "i", id);
+
+    ret_value = H5I_get_type(id);
+
+    if(ret_value <= H5I_BADID || ret_value >= H5I_next_type || NULL == H5I_object(id))
+	HGOTO_DONE(H5I_BADID);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iget_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iremove_verify
+ *
+ * Purpose:	Removes the specified ID from its type, first checking that the
+ *			type of the ID and the type type are the same.  Public interface to
+ *			H5I__remove_verify.
+ *
+ * Return:	Success:	A pointer to the object that was removed, the
+ *				same pointer which would have been found by
+ *				calling H5I_object().
+ *		Failure:	NULL
+ *
+ * Programmer:	James Laird
+ *		Nathaniel Furrer
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5Iremove_verify(hid_t id, H5I_type_t id_type)
+{
+    void * ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE2("*x", "iIt", id, id_type);
+
+    if(H5I_IS_LIB_TYPE(id_type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type")
+
+    /* Remove the id */
+    ret_value = H5I__remove_verify(id, id_type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iremove_verify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__remove_verify
+ *
+ * Purpose:	Removes the specified ID from its type, first checking that
+ *			the ID's type is the same as the ID type supplied as an argument
+ *
+ * Return:	Success:	A pointer to the object that was removed, the
+ *				same pointer which would have been found by
+ *				calling H5I_object().
+ *		Failure:	NULL
+ *
+ * Programmer:	James Laird
+ *		Nat Furrer
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5I__remove_verify(hid_t id, H5I_type_t id_type)
+{
+    void * ret_value = NULL;	/*return value			*/
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Argument checking will be performed by H5I_remove() */
+
+    /* Verify that the type of the ID is correct */
+    if(id_type == H5I_TYPE(id))
+        ret_value = H5I_remove(id);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__remove_verify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__remove_common
+ *
+ * Purpose:	Common code to remove a specified ID from its type.
+ *
+ * Return:	Success:	A pointer to the object that was removed, the
+ *				same pointer which would have been found by
+ *				calling H5I_object().
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              October 3, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5I__remove_common(H5I_id_type_t *type_ptr, hid_t id)
+{
+    H5I_id_info_t	*curr_id;	/*ptr to the current atom	*/
+    void *	        ret_value;	/*return value			*/
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(type_ptr);
+
+    /* Get the ID node for the ID */
+    if(NULL == (curr_id = (H5I_id_info_t *)H5SL_remove(type_ptr->ids, &id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDELETE, NULL, "can't remove ID node from skip list")
+
+    /* (Casting away const OK -QAK) */
+    ret_value = (void *)curr_id->obj_ptr;
+
+    /* See if we can reuse IDs of this type */
+    if(type_ptr->cls->flags & H5I_CLASS_REUSE_IDS) {
+        /* See if we can decrement the next ID for the ID class */
+        if(type_ptr->nextid == (ID_MASK & (curr_id->id + 1))) {
+            type_ptr->nextid--;
+            curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
+        } /* end if */
+        else {
+            /* Store the ID on the available ID list, for later */
+            if((type_ptr->avail_count < MAX_FREE_ID_STRUCTS)
+                    && (type_ptr->id_count > 1)) {
+                if(H5SL_insert(type_ptr->avail_ids, curr_id, &curr_id->id) < 0)
+                    HGOTO_ERROR(H5E_ATOM, H5E_CANTINSERT, NULL, "can't insert available ID node into skip list")
+                type_ptr->avail_count++;
+            }
+            else
+                curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
+        } /* end else */
+    } /* end if */
+    /* Otherwise, just toss it. */
+    else
+        curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
+
+    /* Decrement the number of IDs in the type */
+    (type_ptr->id_count)--;
+
+    /* If there are no more IDs of this type, then we can free all available
+       ID strutures, and reset starting typeid and wrapped status. */
+    if(0 == type_ptr->id_count) {
+        if(H5SL_free(type_ptr->avail_ids, H5I__free_cb, NULL) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, NULL, "can't release available ID nodes")
+        type_ptr->avail_count = 0;
+
+        type_ptr->nextid = (hid_t)type_ptr->cls->reserved;
+        type_ptr->wrapped = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__remove_common() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_remove
+ *
+ * Purpose:	Removes the specified ID from its type.
+ *
+ * Return:	Success:	A pointer to the object that was removed, the
+ *				same pointer which would have been found by
+ *				calling H5I_object().
+ *		Failure:	NULL
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5I_remove(hid_t id)
+{
+    H5I_id_type_t	*type_ptr;	/*ptr to the atomic type	*/
+    H5I_type_t		type;		/*atom's atomic type		*/
+    void *	        ret_value;	/*return value			*/
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check arguments */
+    type = H5I_TYPE(id);
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "invalid type number")
+    type_ptr = H5I_id_type_list_g[type];
+    if(type_ptr == NULL || type_ptr->init_count <= 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "invalid type")
+
+    /* Remove the node from the type */
+    if(NULL == (ret_value = H5I__remove_common(type_ptr, id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDELETE, NULL, "can't remove ID node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Idec_ref
+ *
+ * Purpose:	Decrements the number of references outstanding for an ID.
+ *              If the reference count for an ID reaches zero, the object
+ *              will be closed.
+ *
+ * Return:	Success:	New reference count
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Dec  7, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Idec_ref(hid_t id)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", id);
+
+    /* Check arguments */
+    if(id < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+    /* Do actual decrement operation */
+    if((ret_value = H5I_dec_app_ref(id)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDEC, FAIL, "can't decrement ID ref count")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Idec_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_dec_ref
+ *
+ * Purpose:	Decrements the number of references outstanding for an ID.
+ *		This will fail if the type is not a reference counted type.
+ *		The ID type's 'free' function will be called for the ID
+ *		if the reference count for the ID reaches 0 and a free
+ *		function has been defined at type creation time.
+ *
+ * Return:	Success:	New reference count.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_dec_ref(hid_t id)
+{
+    H5I_id_info_t	*id_ptr;	/*ptr to the new ID	*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(id >= 0);
+
+    /* General lookup of the ID */
+    if(NULL == (id_ptr = H5I__find_id(id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID")
+
+    /*
+     * If this is the last reference to the object then invoke the type's
+     * free method on the object. If the free method is undefined or
+     * successful then remove the object from the type; otherwise leave
+     * the object in the type without decrementing the reference
+     * count. If the reference count is more than one then decrement the
+     * reference count without calling the free method.
+     *
+     * Beware: the free method may call other H5I functions.
+     * 
+     * If an object is closing, we can remove the ID even though the free 
+     * method might fail.  This can happen when a mandatory filter fails to
+     * write when a dataset is closed and the chunk cache is flushed to the 
+     * file.  We have to close the dataset anyway. (SLU - 2010/9/7)
+     */
+    if(1 == id_ptr->count) {
+        H5I_id_type_t	*type_ptr;		/*ptr to the type	*/
+
+        /* Get the ID's type */
+        type_ptr = H5I_id_type_list_g[H5I_TYPE(id)];
+
+        /* (Casting away const OK -QAK) */
+        if(!type_ptr->cls->free_func || (type_ptr->cls->free_func)((void *)id_ptr->obj_ptr) >= 0) {
+            /* Remove the node from the type */
+            if(NULL == H5I__remove_common(type_ptr, id))
+                HGOTO_ERROR(H5E_ATOM, H5E_CANTDELETE, FAIL, "can't remove ID node")
+            ret_value = 0;
+        } /* end if */
+        else
+            ret_value = FAIL;
+    } /* end if */
+    else {
+        --(id_ptr->count);
+        ret_value = (int)id_ptr->count;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_dec_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_dec_app_ref
+ *
+ * Purpose:	H5I_dec_ref wrapper for case of modifying the application ref.
+ *		count for an ID as well as normal reference count.
+ *
+ * Return:	Success:	New app. reference count.
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Sept 16, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_dec_app_ref(hid_t id)
+{
+    H5I_id_info_t	*id_ptr;	/*ptr to the new ID	*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(id >= 0);
+
+    /* Call regular decrement reference count routine */
+    if((ret_value = H5I_dec_ref(id)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDEC, FAIL, "can't decrement ID ref count")
+
+    /* Check if the ID still exists */
+    if(ret_value > 0) {
+        /* General lookup of the ID */
+        if(NULL == (id_ptr = H5I__find_id(id)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID")
+
+        /* Adjust app_ref */
+        --(id_ptr->app_count);
+        HDassert(id_ptr->count >= id_ptr->app_count);
+
+        /* Set return value */
+        ret_value = (int)id_ptr->app_count;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_dec_app_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_dec_app_ref_always_close
+ *
+ * Purpose:	H5I_dec_app_ref wrapper for case of always closing the ID,
+ *		even when the free routine fails
+ *
+ * Return:	Success:	New app. reference count.
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Sept 16, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_dec_app_ref_always_close(hid_t id)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(id >= 0);
+
+    /* Call application decrement reference count routine */
+    ret_value = H5I_dec_app_ref(id);
+
+    /* Check for failure */
+    if(ret_value < 0) {
+        /*
+         * If an object is closing, we can remove the ID even though the free 
+         * method might fail.  This can happen when a mandatory filter fails to
+         * write when a dataset is closed and the chunk cache is flushed to the 
+         * file.  We have to close the dataset anyway. (SLU - 2010/9/7)
+         */
+        H5I_remove(id);
+
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTDEC, FAIL, "can't decrement ID ref count")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_dec_app_ref_always_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iinc_ref
+ *
+ * Purpose:	Increments the number of references outstanding for an ID.
+ *
+ * Return:	Success:	New reference count
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Dec  7, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Iinc_ref(hid_t id)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", id);
+
+    /* Check arguments */
+    if(id < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+    /* Do actual increment operation */
+    if((ret_value = H5I_inc_ref(id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINC, FAIL, "can't increment ID ref count")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iinc_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_inc_ref
+ *
+ * Purpose:	Increment the reference count for an object.
+ *
+ * Return:	Success:	The new reference count.
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, July 29, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_inc_ref(hid_t id, hbool_t app_ref)
+{
+    H5I_id_info_t	*id_ptr;	/*ptr to the ID		*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(id >= 0);
+
+    /* General lookup of the ID */
+    if(NULL == (id_ptr = H5I__find_id(id)))
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID")
+
+    /* Adjust reference counts */
+    ++(id_ptr->count);
+    if (app_ref)
+        ++(id_ptr->app_count);
+
+    /* Set return value */
+    ret_value = (int)(app_ref ? id_ptr->app_count : id_ptr->count);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_inc_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iget_ref
+ *
+ * Purpose:	Retrieves the number of references outstanding for an ID.
+ *
+ * Return:	Success:	Reference count
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Dec  7, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Iget_ref(hid_t id)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", id);
+
+    /* Check arguments */
+    if(id < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+    /* Do actual retrieve operation */
+    if((ret_value = H5I_get_ref(id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID ref count")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iget_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_get_ref
+ *
+ * Purpose:	Retrieve the reference count for an object.
+ *
+ * Return:	Success:	The reference count.
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, Decemeber  6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_get_ref(hid_t id, hbool_t app_ref)
+{
+    H5I_id_info_t	*id_ptr;	/*ptr to the ID		*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(id >= 0);
+
+    /* General lookup of the ID */
+    if(NULL == (id_ptr = H5I__find_id(id)))
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID")
+
+    /* Set return value */
+    ret_value = (int)(app_ref ? id_ptr->app_count : id_ptr->count);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_get_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iinc_type_ref
+ *
+ * Purpose:	Increments the number of references outstanding for an ID type.
+ *
+ * Return:	Success:	New reference count
+ *		Failure:	Negative
+ *
+ * Programmer:  Nat Furrer
+ *		James Laird
+ *              April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Iinc_type_ref(H5I_type_t type)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "It", type);
+
+    /* Check arguments */
+    if(type <= 0 || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID type")
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    /* Do actual increment operation */
+    if((ret_value = H5I__inc_type_ref(type)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINC, FAIL, "can't increment ID type ref count")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iinc_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__inc_type_ref
+ *
+ * Purpose:	Increment the reference count for an ID type.
+ *
+ * Return:	Success:	The new reference count.
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		Nat Furrer
+ *              Friday, April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5I__inc_type_ref(H5I_type_t type)
+{
+    H5I_id_type_t	*type_ptr;	/* ptr to the type	*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(type > 0 && type < H5I_next_type);
+
+    /* Check arguments */
+    type_ptr = H5I_id_type_list_g[type];
+    if(!type_ptr)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* Set return value */
+    ret_value = (int)(++(type_ptr->init_count));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__inc_type_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Idec_type_ref
+ *
+ * Purpose:	Decrements the reference count on an entire type of IDs.
+ *		If the type reference count becomes zero then the type is
+ *		destroyed along with all atoms in that type regardless of
+ *		their reference counts.	 Destroying IDs involves calling
+ *		the free-func for each ID's object and then adding the ID
+ *		struct to the ID free list.  Public interface to
+ *		H5I_dec_type_ref.
+ *		Returns the number of references to the type on success; a
+ *		return value of 0 means that the type will have to be
+ *		re-initialized before it can be used again (and should probably
+ *		be set to H5I_UNINIT).
+ *
+ * Return:	Number of references to type on success/Negative on failure
+ *
+ * Programmer:	Nathaniel Furrer
+ *		James Laird
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Idec_type_ref(H5I_type_t type)
+{
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "It", type);
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    ret_value = H5I_dec_type_ref(type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Idec_type_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_dec_type_ref
+ *
+ * Purpose:	Decrements the reference count on an entire type of IDs.
+ *		If the type reference count becomes zero then the type is
+ *		destroyed along with all atoms in that type regardless of
+ *		their reference counts.	 Destroying IDs involves calling
+ *		the free-func for each ID's object and then adding the ID
+ *		struct to the ID free list.
+ *		Returns the number of references to the type on success; a
+ *		return value of 0 means that the type will have to be
+ *		re-initialized before it can be used again (and should probably
+ *		be set to H5I_UNINIT).
+ *
+ * Return:	Number of references to type on success/Negative on failure
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5I_dec_type_ref(H5I_type_t type)
+{
+    H5I_id_type_t	*type_ptr;      /* Pointer to the ID type */
+    herr_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+
+    type_ptr = H5I_id_type_list_g[type];
+    if(type_ptr == NULL || type_ptr->init_count <= 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /*
+     * Decrement the number of users of the atomic type.  If this is the
+     * last user of the type then release all atoms from the type and
+     * free all memory it used.  The free function is invoked for each atom
+     * being freed.
+     */
+    if(1 == type_ptr->init_count) {
+        H5I__destroy_type(type);
+        ret_value = 0;
+    } /* end if */
+    else {
+        --(type_ptr->init_count);
+        ret_value = (herr_t)type_ptr->init_count;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_dec_type_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iget_type_ref
+ *
+ * Purpose:	Retrieves the number of references outstanding for a type.
+ *
+ * Return:	Success:	Reference count
+ *		Failure:	Negative
+ *
+ * Programmer:  Nat Furrer
+ *		James Laird
+ *              April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Iget_type_ref(H5I_type_t type)
+{
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "It", type);
+
+    /* Check arguments */
+    if(type <= 0 || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID type")
+
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type")
+
+    /* Do actual retrieve operation */
+    if((ret_value = H5I__get_type_ref(type)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID type ref count")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iget_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__get_type_ref
+ *
+ * Purpose:	Retrieve the reference count for an ID type.
+ *
+ * Return:	Success:	The reference count.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:  Nat Furrer
+ *		James Laird
+ *              April 30, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5I__get_type_ref(H5I_type_t type)
+{
+    H5I_id_type_t	*type_ptr;	/*ptr to the type	*/
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(type >= 0);
+
+    /* Check arguments */
+    type_ptr = H5I_id_type_list_g[type];
+    if(!type_ptr)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* Set return value */
+    ret_value = (int)type_ptr->init_count;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__get_type_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iis_valid
+ *
+ * Purpose:	Check if the given id is valid.  An id is valid if it is in
+ *              use and has an application reference count of at least 1.
+ *
+ * Return:	Success:        TRUE if the id is valid, FALSE otherwise.
+ *
+ *              Failure:	Negative (never fails currently)
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, October 31, 2008 (boo)
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Iis_valid(hid_t id)
+{
+    H5I_id_info_t   *id_ptr;            /* ptr to the ID */
+    htri_t          ret_value = TRUE;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", id);
+
+    /* Find the ID */
+    if (NULL == (id_ptr = H5I__find_id(id)))
+        ret_value = FALSE;
+
+    /* Check if the found id is an internal id */
+    else if (!id_ptr->app_count)
+        ret_value = FALSE;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iis_valid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__search_cb
+ *
+ * Purpose:	Callback routine for H5Isearch, when it calls H5I_iterate.
+ *		Calls "user" callback search function, and then sets return
+ *		value, based on the result of that callback.
+ *
+ * Return:	Success:	The first object in the type for which FUNC
+ *				returns non-zero. NULL if FUNC returned zero
+ *				for every object in the type.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, March 30, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5I__search_cb(void *obj, hid_t id, void *_udata)
+{
+    H5I_search_ud_t *udata = (H5I_search_ud_t *)_udata; /* User data for callback */
+    int ret_value;     /* Callback return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    ret_value = (*udata->app_cb)(obj, id, udata->app_key);
+    if(ret_value > 0)
+        udata->ret_obj = obj;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__search_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Isearch
+ *
+ * Purpose:	Apply function FUNC to each member of type TYPE and return a
+ *		pointer to the first object for which FUNC returns non-zero.
+ *		The FUNC should take a pointer to the object and the KEY as
+ *		arguments and return non-zero to terminate the search (zero
+ *		to continue).  Public interface to H5I_search.
+ *
+ * Limitation:	Currently there is no way to start searching from where a
+ *		previous search left off.
+ *
+ * Return:	Success:	The first object in the type for which FUNC
+ *				returns non-zero. NULL if FUNC returned zero
+ *				for every object in the type.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	James Laird
+ *		Nathaniel Furrer
+ *		Friday, April 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key)
+{
+    H5I_search_ud_t udata;      /* Context for iteration */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE3("*x", "Itx*x", type, func, key);
+
+    /* Check arguments */
+    if(H5I_IS_LIB_TYPE(type))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type")
+
+    /* Set up udata struct */
+    udata.app_cb = func;
+    udata.app_key = key;
+    udata.ret_obj = NULL;
+
+    /* Note that H5I_iterate returns an error code.  We ignore it 
+     * here, as we can't do anything with it without revising the API.
+     */
+    (void)H5I_iterate(type, H5I__search_cb, &udata, TRUE);
+
+    /* Set return value */
+    ret_value = udata.ret_obj;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Isearch() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__iterate_cb
+ *
+ * Purpose:	Callback routine for H5I_iterate, invokes "user" callback
+ *              function, and then sets return value, based on the result of
+ *              that callback.
+ *
+ * Return:	Success:	Non-negative on success
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, October 3, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5I__iterate_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
+{
+    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
+    H5I_iterate_ud_t *udata = (H5I_iterate_ud_t *)_udata; /* User data for callback */
+    int ret_value = H5_ITER_CONT;     /* Callback return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Don't make callback if app_ref is set and the appl. ref count is 0 */
+    if((!udata->app_ref) || (item->app_count > 0)) {
+        herr_t cb_ret_val;
+
+        /* (Casting away const OK) */
+        cb_ret_val = (*udata->user_func)((void *)item->obj_ptr, item->id, udata->user_udata);
+        if(cb_ret_val > 0)
+            ret_value = H5_ITER_STOP;	/* terminate iteration early */
+        else if(cb_ret_val < 0)
+            ret_value = H5_ITER_ERROR;  /* indicate failure (which terminates iteration) */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_iterate
+ *
+ * Purpose:	Apply function FUNC to each member of type TYPE (with 
+ *		non-zero application reference count if app_ref is TRUE).  
+ *		Stop if FUNC returns a non zero value (i.e. anything 
+ *		other than H5_ITER_CONT).  
+ *
+ *		If FUNC returns a positive value (i.e. H5_ITER_STOP), 
+ *		return SUCCEED.
+ *
+ *		If FUNC returns a negative value (i.e. H5_ITER_ERROR), 
+ *		return FAIL.
+ *		
+ *		The FUNC should take a pointer to the object and the 
+ *		udata as arguments and return non-zero to terminate 
+ *		siteration, and zero to continue.
+ *
+ * Limitation:	Currently there is no way to start the iteration from 
+ *		where a previous iteration left off.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		Monday, December 6, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5I_iterate(H5I_type_t type, H5I_search_func_t func, void *udata, hbool_t app_ref)
+{
+    H5I_id_type_t *type_ptr;		/*ptr to the type	*/
+    herr_t	   ret_value = SUCCEED;	/*return value		*/
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+    type_ptr = H5I_id_type_list_g[type];
+
+    /* Only iterate through ID list if it is initialized and there are IDs in type */
+    if(type_ptr && type_ptr->init_count > 0 && type_ptr->id_count > 0) {
+        H5I_iterate_ud_t iter_udata;    /* User data for iteration callback */
+        herr_t iter_status;             /* Iteration status */
+
+        /* Set up iterator user data */
+        iter_udata.user_func = func;
+        iter_udata.user_udata = udata;
+        iter_udata.app_ref = app_ref;
+
+        /* Iterate over IDs */
+        if((iter_status = H5SL_iterate(type_ptr->ids, H5I__iterate_cb, &iter_udata)) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_BADITER, FAIL, "iteration failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__find_id
+ *
+ * Purpose:	Given an object ID find the info struct that describes the
+ *		object.
+ *
+ * Return:	Success:	Ptr to the object's info struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Unknown
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5I_id_info_t *
+H5I__find_id(hid_t id)
+{
+    H5I_type_t		type;			/*ID's type		*/
+    H5I_id_type_t	*type_ptr;		/*ptr to the type	*/
+    H5I_id_info_t	*ret_value;		/*return value		*/
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    type = H5I_TYPE(id);
+    if(type <= H5I_BADID || type >= H5I_next_type)
+	HGOTO_DONE(NULL)
+
+    type_ptr = H5I_id_type_list_g[type];
+    if(!type_ptr || type_ptr->init_count <= 0)
+	HGOTO_DONE(NULL)
+
+    /* Locate the ID node for the ID */
+    ret_value = (H5I_id_info_t *)H5SL_search(type_ptr->ids, &id);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I__find_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Iget_name
+ *
+ * Purpose: Gets a name of an object from its ID.
+ *
+ * Return: Success: The length of name.
+ *
+ *         Failure: -1
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: July 26, 2002
+ *
+ * Comments: Public function
+ *  If `name' is non-NULL then write up to `size' bytes into that
+ *  buffer and always return the length of the entry name.
+ *  Otherwise `size' is ignored and the function does not store the name,
+ *  just returning the number of characters required to store the name.
+ *  If an error occurs then the buffer pointed to by `name' (NULL or non-NULL)
+ *  is unchanged and the function returns a negative value.
+ *  If a zero is returned for the name's length, then there is no name
+ *  associated with the ID.
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Iget_name(hid_t id, char *name/*out*/, size_t size)
+{
+    H5G_loc_t     loc;          /* Object location */
+    ssize_t       ret_value;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "ixz", id, name, size);
+
+    /* Get object location */
+    if(H5G_loc(id, &loc) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object location")
+
+    /* Call internal group routine to retrieve object's name */
+    if((ret_value = H5G_get_name(&loc, name, size, NULL, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object name")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iget_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Iget_file_id
+ *
+ * Purpose:	The public version of H5I_get_file_id(), obtains the file
+ *              ID given an object ID.  User has to close this ID.
+ *
+ * Return:	Success:	file ID
+ *
+ *		Failure:	a negative value
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 27, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Iget_file_id(hid_t obj_id)
+{
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", obj_id);
+
+    if((ret_value = H5I_get_file_id(obj_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve file ID")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Iget_file_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I_get_file_id
+ *
+ * Purpose:	The private version of H5Iget_file_id(), obtains the file
+ *              ID given an object ID.
+ *
+ * Return:	Success:	file ID
+ *		Failure:	a negative value
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 27, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5I_get_file_id(hid_t obj_id, hbool_t app_ref)
+{
+    H5I_type_t type;            /* ID type */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get object type */
+    type = H5I_TYPE(obj_id);
+    if(type == H5I_FILE) {
+        /* Increment reference count on file ID */
+        if(H5I_inc_ref(obj_id, app_ref) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed")
+
+        /* Set return value */
+        ret_value = obj_id;
+    } /* end if */
+    else if(type == H5I_DATATYPE || type == H5I_GROUP || type == H5I_DATASET || type == H5I_ATTR) {
+        H5G_loc_t loc;              /* Location of object */
+
+        /* Get the object location information */
+        if(H5G_loc(obj_id, &loc) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get object location")
+
+        /* Get the file ID for the object */
+        if((ret_value = H5F_get_id(loc.oloc->file, app_ref)) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get file ID")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid object ID")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_get_file_id() */
+
+#ifdef H5I_DEBUG_OUTPUT
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__debug_cb
+ *
+ * Purpose:	Dump the contents of an ID to stderr for debugging.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, February 19, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5I__debug_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
+{
+    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
+    H5I_type_t type = *(H5I_type_t *)_udata;            /* User data */
+    H5G_name_t *path = NULL;
+    int ret_value = H5_ITER_CONT;                       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    fprintf(stderr, "		 id = %lu\n", (unsigned long)(item->id));
+    fprintf(stderr, "		 count = %u\n", item->count);
+    fprintf(stderr, "		 obj   = 0x%08lx\n", (unsigned long)(item->obj_ptr));
+
+    /* Get the group location, so we get get the name */
+    switch(type) {
+        case H5I_GROUP:
+            path = H5G_nameof((H5G_t*)item->obj_ptr);
+            break;
+
+        case H5I_DATASET:
+            path = H5D_nameof((H5D_t*)item->obj_ptr);
+            break;
+
+        case H5I_DATATYPE:
+            path = H5T_nameof((H5T_t*)item->obj_ptr);
+            break;
+
+        default:
+            break;   /* Other types of IDs are not stored in files */
+    } /* end switch*/
+
+    if(path) {
+        if(path->user_path_r)
+            fprintf(stderr, "                user_path = %s\n", H5RS_get_str(path->user_path_r));
+        if(path->full_path_r)
+            fprintf(stderr, "                full_path = %s\n", H5RS_get_str(path->full_path_r));
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5I__debug_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5I__debug
+ *
+ * Purpose:	Dump the contents of a type to stderr for debugging.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, February 19, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5I__debug(H5I_type_t type)
+{
+    H5I_id_type_t *type_ptr;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    fprintf(stderr, "Dumping ID type %d\n", (int)type);
+    type_ptr = H5I_id_type_list_g[type];
+
+    /* Header */
+    fprintf(stderr, "	 init_count = %u\n", type_ptr->init_count);
+    fprintf(stderr, "	 reserved   = %u\n", type_ptr->cls->reserved);
+    fprintf(stderr, "	 wrapped    = %u\n", type_ptr->wrapped);
+    fprintf(stderr, "	 id_count   = %u\n", type_ptr->id_count);
+    fprintf(stderr, "	 nextid	    = %u\n", type_ptr->nextid);
+
+    /* List */
+    fprintf(stderr, "	 List:\n");
+    H5SL_iterate(type_ptr->ids, H5I__debug_cb, &type);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5I__debug() */
+#endif /* H5I_DEBUG_OUTPUT */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ipkg.h b/gatb-core/thirdparty/hdf5/src/H5Ipkg.h
new file mode 100644
index 0000000..1666b76
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ipkg.h
@@ -0,0 +1,76 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Thursday, May 15, 2003
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5I package.  Source files outside the H5I package should
+ *		include H5Iprivate.h instead.
+ */
+#ifndef H5I_PACKAGE
+#error "Do not include this file outside the H5I package!"
+#endif
+
+#ifndef _H5Ipkg_H
+#define _H5Ipkg_H
+
+/* Get package's private header */
+#include "H5Iprivate.h"
+
+/* Other private headers needed by this file */
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/*
+ * Number of bits to use for ID Type in each atom. Increase if more types
+ * are needed (though this will decrease the number of available IDs per
+ * type). This is the only number that must be changed since all other bit
+ * field sizes and masks are calculated from TYPE_BITS.
+ */
+#define TYPE_BITS	7
+#define TYPE_MASK	(((hid_t)1 << TYPE_BITS) - 1)
+
+#define H5I_MAX_NUM_TYPES TYPE_MASK
+
+/*
+ * Number of bits to use for the Atom index in each atom (assumes 8-bit
+ * bytes). We don't use the sign bit.
+ */
+#define ID_BITS		((sizeof(hid_t) * 8) - (TYPE_BITS + 1))
+#define ID_MASK		(((hid_t)1 << ID_BITS) - 1)
+
+/* Map an atom to an ID type number */
+#define H5I_TYPE(a)	((H5I_type_t)(((hid_t)(a) >> ID_BITS) & TYPE_MASK))
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Testing functions */
+#ifdef H5I_TESTING
+H5_DLL ssize_t H5I_get_name_test(hid_t id, char *name/*out*/, size_t size,
+    hbool_t *cached);
+#endif /* H5I_TESTING */
+
+#endif /*_H5Ipkg_H*/
diff --git a/gatb-core/thirdparty/hdf5/src/H5Iprivate.h b/gatb-core/thirdparty/hdf5/src/H5Iprivate.h
new file mode 100644
index 0000000..88c2432
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Iprivate.h
@@ -0,0 +1,88 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-----------------------------------------------------------------------------
+ * File:    H5Iprivate.h
+ * Purpose: header file for ID API
+ *---------------------------------------------------------------------------*/
+
+/* avoid re-inclusion */
+#ifndef _H5Iprivate_H
+#define _H5Iprivate_H
+
+/* Include package's public header */
+#include "H5Ipublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Macro to determine if a H5I_type_t is a "library type" */
+#define H5I_IS_LIB_TYPE( type ) (type > 0 && type < H5I_NTYPES)
+
+/* Flags for ID class */
+#define H5I_CLASS_IS_APPLICATION        0x01
+#define H5I_CLASS_REUSE_IDS             0x02
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+typedef struct H5I_class_t {
+    H5I_type_t type_id;         /* Class ID for the type */
+    unsigned flags;             /* Class behavior flags */
+    unsigned reserved;          /* Number of reserved IDs for this type */
+                                /* [A specific number of type entries may be
+                                 * reserved to enable "constant" values to be
+                                 * handed out which are valid IDs in the type,
+                                 * but which do not map to any data structures
+                                 * and are not allocated dynamically later.]
+                                 */
+    H5I_free_t free_func;       /* Free function for object's of this type */
+} H5I_class_t;
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+H5_DLL herr_t H5I_register_type(const H5I_class_t *cls);
+H5_DLL int H5I_nmembers(H5I_type_t type);
+H5_DLL herr_t H5I_clear_type(H5I_type_t type, hbool_t force, hbool_t app_ref);
+H5_DLL hid_t H5I_register(H5I_type_t type, const void *object, hbool_t app_ref);
+H5_DLL void *H5I_subst(hid_t id, const void *new_object);
+H5_DLL void *H5I_object(hid_t id);
+H5_DLL void *H5I_object_verify(hid_t id, H5I_type_t id_type);
+H5_DLL H5I_type_t H5I_get_type(hid_t id);
+H5_DLL hid_t H5I_get_file_id(hid_t obj_id, hbool_t app_ref);
+H5_DLL void *H5I_remove(hid_t id);
+H5_DLL herr_t H5I_iterate(H5I_type_t type, H5I_search_func_t func, void *udata, hbool_t app_ref);
+H5_DLL int H5I_get_ref(hid_t id, hbool_t app_ref);
+H5_DLL int H5I_inc_ref(hid_t id, hbool_t app_ref);
+H5_DLL int H5I_dec_ref(hid_t id);
+H5_DLL int H5I_dec_app_ref(hid_t id);
+H5_DLL int H5I_dec_app_ref_always_close(hid_t id);
+H5_DLL herr_t H5I_dec_type_ref(H5I_type_t type);
+
+#endif /* _H5Iprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ipublic.h b/gatb-core/thirdparty/hdf5/src/H5Ipublic.h
new file mode 100644
index 0000000..5160434
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ipublic.h
@@ -0,0 +1,104 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains function prototypes for each exported function in
+ * the H5I module.
+ */
+#ifndef _H5Ipublic_H
+#define _H5Ipublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/*
+ * Library type values.  Start with `1' instead of `0' because it makes the
+ * tracing output look better when hid_t values are large numbers.  Change the
+ * TYPE_BITS in H5I.c if the MAXID gets larger than 32 (an assertion will
+ * fail otherwise).
+ *
+ * When adding types here, add a section to the 'misc19' test in test/tmisc.c
+ * to verify that the H5I{inc|dec|get}_ref() routines work correctly with in.
+ *
+ */
+typedef enum H5I_type_t {
+    H5I_UNINIT		= (-2), /*uninitialized type			    */
+    H5I_BADID		= (-1),	/*invalid Type				    */
+    H5I_FILE            = 1,  	/*type ID for File objects      	    */
+    H5I_GROUP,	                /*type ID for Group objects     	    */
+    H5I_DATATYPE,	        /*type ID for Datatype objects		    */
+    H5I_DATASPACE,	        /*type ID for Dataspace objects		    */
+    H5I_DATASET,	        /*type ID for Dataset objects		    */
+    H5I_ATTR,		        /*type ID for Attribute objects		    */
+    H5I_REFERENCE,	        /*type ID for Reference objects		    */
+    H5I_VFL,			/*type ID for virtual file layer	    */
+    H5I_GENPROP_CLS,            /*type ID for generic property list classes */
+    H5I_GENPROP_LST,            /*type ID for generic property lists        */
+    H5I_ERROR_CLASS,            /*type ID for error classes		    */
+    H5I_ERROR_MSG,              /*type ID for error messages		    */
+    H5I_ERROR_STACK,            /*type ID for error stacks		    */
+    H5I_NTYPES		        /*number of library types, MUST BE LAST!    */
+} H5I_type_t;
+
+/* Type of atoms to return to users */
+typedef int hid_t;
+#define H5_SIZEOF_HID_T         H5_SIZEOF_INT
+
+/* An invalid object ID. This is also negative for error return. */
+#define H5I_INVALID_HID         (-1)
+
+/*
+ * Function for freeing objects. This function will be called with an object
+ * ID type number and a pointer to the object. The function should free the
+ * object and return non-negative to indicate that the object
+ * can be removed from the ID type. If the function returns negative
+ * (failure) then the object will remain in the ID type.
+ */
+typedef herr_t (*H5I_free_t)(void*);
+
+/* Type of the function to compare objects & keys */
+typedef int (*H5I_search_func_t)(void *obj, hid_t id, void *key);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Public API functions */
+
+H5_DLL hid_t H5Iregister(H5I_type_t type, const void *object);
+H5_DLL void *H5Iobject_verify(hid_t id, H5I_type_t id_type);
+H5_DLL void *H5Iremove_verify(hid_t id, H5I_type_t id_type);
+H5_DLL H5I_type_t H5Iget_type(hid_t id);
+H5_DLL hid_t H5Iget_file_id(hid_t id);
+H5_DLL ssize_t H5Iget_name(hid_t id, char *name/*out*/, size_t size);
+H5_DLL int H5Iinc_ref(hid_t id);
+H5_DLL int H5Idec_ref(hid_t id);
+H5_DLL int H5Iget_ref(hid_t id);
+H5_DLL H5I_type_t H5Iregister_type(size_t hash_size, unsigned reserved, H5I_free_t free_func);
+H5_DLL herr_t H5Iclear_type(H5I_type_t type, hbool_t force);
+H5_DLL herr_t H5Idestroy_type(H5I_type_t type);
+H5_DLL int H5Iinc_type_ref(H5I_type_t type);
+H5_DLL int H5Idec_type_ref(H5I_type_t type);
+H5_DLL int H5Iget_type_ref(H5I_type_t type);
+H5_DLL void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key);
+H5_DLL herr_t H5Inmembers(H5I_type_t type, hsize_t *num_members);
+H5_DLL htri_t H5Itype_exists(H5I_type_t type);
+H5_DLL htri_t H5Iis_valid(hid_t id);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Ipublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Itest.c b/gatb-core/thirdparty/hdf5/src/H5Itest.c
new file mode 100644
index 0000000..5236e8d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Itest.c
@@ -0,0 +1,98 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgoup.org>
+ *              Tuesday, July 27, 2010
+ *
+ * Purpose:	ID testing functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
+#define H5I_TESTING		/*suppress warning about H5I testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Ipkg.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5I_get_name_test
+ *
+ * Purpose: Testing version of H5Iget_name()
+ *
+ * Return: Success: The length of name.
+ *         Failure: -1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, July 27, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5I_get_name_test(hid_t id, char *name/*out*/, size_t size, hbool_t *cached)
+{
+    H5G_loc_t     loc;          /* Object location */
+    ssize_t       ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location */
+    if(H5G_loc(id, &loc) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object location")
+
+    /* Call internal group routine to retrieve object's name */
+    if((ret_value = H5G_get_name(&loc, name, size, cached, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object name")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_get_name_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5L.c b/gatb-core/thirdparty/hdf5/src/H5L.c
new file mode 100644
index 0000000..9c81f98
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5L.c
@@ -0,0 +1,3100 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5L_PACKAGE		/*suppress error about including H5Lpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5L_init_interface
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"         /* Datasets                             */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5Fprivate.h"		/* File access                          */
+#include "H5Gprivate.h"         /* Groups                               */
+#include "H5Iprivate.h"         /* IDs                                  */
+#include "H5Lpkg.h"             /* Links                                */
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Oprivate.h"         /* File objects                         */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5L_MIN_TABLE_SIZE 32 /* Minimum size of the user-defined link type table if it is allocated */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for path traversal routine for getting link info by name */
+typedef struct {
+    H5L_info_t      *linfo;             /* Buffer to return to user */
+    hid_t           dxpl_id;            /* DXPL to use in callback */
+} H5L_trav_gi_t;
+
+/* User data for path traversal routine for getting link info by index */
+typedef struct {
+    /* In */
+    H5_index_t idx_type;               /* Index to use */
+    H5_iter_order_t order;              /* Order to iterate in index */
+    hsize_t n;                          /* Offset of link within index */
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+
+    /* Out */
+    H5L_info_t      *linfo;             /* Buffer to return to user */
+} H5L_trav_gibi_t;
+
+/* User data for path traversal callback to creating a link */
+typedef struct {
+    H5F_t *file;                        /* Pointer to the file */
+    H5P_genplist_t *lc_plist;           /* Link creation property list */
+    hid_t dxpl_id;                      /* Dataset transfer property list */
+    H5G_name_t *path;                   /* Path to object being linked */
+    H5O_obj_create_t *ocrt_info;        /* Pointer to object creation info */
+    H5O_link_t *lnk;                    /* Pointer to link information to insert */
+} H5L_trav_cr_t;
+
+/* User data for path traversal routine for moving and renaming a link */
+typedef struct {
+    const char *dst_name;               /* Destination name for moving object */
+    H5T_cset_t cset;                    /* Char set for new name */
+    H5G_loc_t  *dst_loc;		/* Destination location for moving object */
+    unsigned dst_target_flags;          /* Target flags for destination object */
+    hbool_t copy;                       /* TRUE if this is a copy operation */
+    hid_t lapl_id;                      /* LAPL to use in callback */
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+} H5L_trav_mv_t;
+
+/* User data for path traversal routine for moving and renaming an object */
+typedef struct {
+    H5F_t *file;                        /* Pointer to the file */
+    H5O_link_t *lnk;                    /* Pointer to link information to insert */
+    hbool_t copy;                       /* TRUE if this is a copy operation */
+    hid_t dxpl_id;                      /* Dataset transfer property list */
+} H5L_trav_mv2_t;
+
+/* User data for path traversal routine for getting link value */
+typedef struct {
+    size_t size;                        /* Size of user buffer */
+    void *buf;                          /* User buffer */
+} H5L_trav_gv_t;
+
+/* User data for path traversal routine for getting link value by index */
+typedef struct {
+    /* In */
+    H5_index_t idx_type;               /* Index to use */
+    H5_iter_order_t order;              /* Order to iterate in index */
+    hsize_t n;                          /* Offset of link within index */
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+    size_t size;                        /* Size of user buffer */
+
+    /* Out */
+    void *buf;                          /* User buffer */
+} H5L_trav_gvbi_t;
+
+/* User data for path traversal routine for removing link */
+typedef struct {
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+} H5L_trav_rm_t;
+
+/* User data for path traversal routine for removing link by index */
+typedef struct {
+    /* In */
+    H5_index_t idx_type;               /* Index to use */
+    H5_iter_order_t order;              /* Order to iterate in index */
+    hsize_t n;                          /* Offset of link within index */
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+} H5L_trav_rmbi_t;
+
+/* User data for path traversal routine for getting name by index */
+typedef struct {
+    /* In */
+    H5_index_t idx_type;                /* Index to use */
+    H5_iter_order_t order;              /* Order to iterate in index */
+    hsize_t n;                          /* Offset of link within index */
+    size_t size;                        /* Size of name buffer */
+    hid_t dxpl_id;                      /* DXPL to use in callback */
+
+    /* Out */
+    char *name;                         /* Buffer to return name to user */
+    ssize_t name_len;                   /* Length of full name */
+} H5L_trav_gnbi_t;
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int H5L_find_class_idx(H5L_type_t id);
+static herr_t H5L_link_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_create_real(const H5G_loc_t *link_loc, const char *link_name,
+    H5G_name_t *obj_path, H5F_t *obj_file, H5O_link_t *lnk, H5O_obj_create_t *ocrt_info,
+    hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+static herr_t H5L_get_val_real(const H5O_link_t *lnk, void *buf, size_t size);
+static herr_t H5L_get_val_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_get_val_by_idx_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_delete_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_delete_by_idx_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_move_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_move_dest_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_exists_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static htri_t H5L_exists(const H5G_loc_t *loc, const char *name, hid_t lapl_id,
+    hid_t dxpl_id);
+static herr_t H5L_get_info_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_get_info_by_idx_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+static herr_t H5L_get_name_by_idx_cb(H5G_loc_t *grp_loc/*in*/,
+    const char *name, const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Information about user-defined links */
+static size_t           H5L_table_alloc_g = 0;
+static size_t           H5L_table_used_g = 0;
+static H5L_class_t      *H5L_table_g = NULL;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	James Laird
+ *              Thursday, July 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_init_interface
+ *
+ * Purpose:	Initialize information specific to H5L interface.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Tuesday, January 24, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_init_interface(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize user-defined link classes */
+    if(H5L_register_external() < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to register external link class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_term_interface
+ *
+ * Purpose:	Terminate any resources allocated in H5L_init_interface.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Tuesday, January 24, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5L_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Free the table of link types */
+    H5L_table_g = (H5L_class_t *)H5MM_xfree(H5L_table_g);
+    H5L_table_used_g = H5L_table_alloc_g = 0;
+
+    /* Mark the interface as uninitialized */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(n)
+} /* H5L_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lmove
+ *
+ * Purpose:	Renames an object within an HDF5 file and moves it to a new
+ *              group.  The original name SRC is unlinked from the group graph
+ *              and then inserted with the new name DST (which can specify a
+ *              new path for the object) as an atomic operation. The names
+ *              are interpreted relative to SRC_LOC_ID and
+ *              DST_LOC_ID, which are either file IDs or group ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Wednesday, March 29, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	src_loc, *src_loc_p;
+    H5G_loc_t	dst_loc, *dst_loc_p;
+    herr_t      ret_value=SUCCEED;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name, lcpl_id,
+             lapl_id);
+
+    /* Check arguments */
+    if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
+    if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!src_name || !*src_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!dst_name || !*dst_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified")
+    if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
+
+    /* Set up src & dst location pointers */
+    src_loc_p = &src_loc;
+    dst_loc_p = &dst_loc;
+    if(src_loc_id == H5L_SAME_LOC)
+        src_loc_p = dst_loc_p;
+    else if(dst_loc_id == H5L_SAME_LOC)
+        dst_loc_p = src_loc_p;
+
+    /* Move the link */
+    if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, lcpl_id,
+            lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lmove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lcopy
+ *
+ * Purpose:	Creates an identical copy of a link with the same creation
+ *              time and target.  The new link can have a different name
+ *              and be in a different location than the original.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Wednesday, March 29, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	src_loc, *src_loc_p;
+    H5G_loc_t	dst_loc, *dst_loc_p;
+    herr_t      ret_value=SUCCEED;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name, lcpl_id,
+             lapl_id);
+
+    /* Check arguments */
+    if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
+    if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!src_name || !*src_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!dst_name || !*dst_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified")
+    if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
+
+    /* Set up src & dst location pointers */
+    src_loc_p = &src_loc;
+    dst_loc_p = &dst_loc;
+    if(src_loc_id == H5L_SAME_LOC)
+        src_loc_p = dst_loc_p;
+    else if(dst_loc_id == H5L_SAME_LOC)
+        dst_loc_p = src_loc_p;
+
+    /* Copy the link */
+    if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, TRUE, lcpl_id,
+                lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lcopy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lcreate_soft
+ *
+ * Purpose:	Creates a soft link from LINK_NAME to LINK_TARGET.
+ *
+ * 		LINK_TARGET can be anything and is interpreted at lookup
+ *              time relative to the group which contains the final component
+ *              of LINK_NAME.  For instance, if LINK_TARGET is `./foo' and
+ *              LINK_NAME is `./x/y/bar' and a request is made for `./x/y/bar'
+ *              then the actual object looked up is `./x/y/./foo'.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lcreate_soft(const char *link_target,
+    hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	link_loc;               /* Group location for new link */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*si*sii", link_target, link_loc_id, link_name, lcpl_id, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(link_loc_id, &link_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!link_target || !*link_target)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no target specified")
+    if(!link_name || !*link_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified")
+    if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
+
+    /* Create the link */
+    if(H5L_create_soft(link_target, &link_loc, link_name, lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lcreate_soft() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lcreate_hard
+ *
+ * Purpose:	Creates a hard link from NEW_NAME to CUR_NAME.
+ *
+ *		CUR_NAME must name an existing object.  CUR_NAME and
+ *              NEW_NAME are interpreted relative to CUR_LOC_ID and
+ *              NEW_LOC_ID, which are either file IDs or group IDs.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name,
+    hid_t new_loc_id, const char *new_name, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	cur_loc, *cur_loc_p;
+    H5G_loc_t	new_loc, *new_loc_p;
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*si*sii", cur_loc_id, cur_name, new_loc_id, new_name, lcpl_id,
+             lapl_id);
+
+    /* Check arguments */
+    if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC")
+    if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!cur_name || !*cur_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
+    if(!new_name || !*new_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified")
+    if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
+
+    /* Set up current & new location pointers */
+    cur_loc_p = &cur_loc;
+    new_loc_p = &new_loc;
+    if(cur_loc_id == H5L_SAME_LOC)
+        cur_loc_p = new_loc_p;
+    else if(new_loc_id == H5L_SAME_LOC)
+   	new_loc_p = cur_loc_p;
+    else if(cur_loc_p->oloc->file != new_loc_p->oloc->file)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should be in the same file.")
+
+    /* Create the link */
+    if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name,
+                lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lcreate_hard() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lcreate_ud
+ *
+ * Purpose:	Creates a user-defined link of type LINK_TYPE named LINK_NAME
+ *              with user-specified data UDATA.
+ *
+ *		The format of the information pointed to by UDATA is
+ *              defined by the user. UDATA_SIZE holds the size of this buffer.
+ *
+ *		LINK_NAME is interpreted relative to LINK_LOC_ID.
+ *
+ *		The property list specified by LCPL_ID holds properties used
+ *              to create the link.
+ *
+ *              The link class of the new link must already be registered
+ *              with the library.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Tuesday, December 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type,
+    const void *udata, size_t udata_size, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	link_loc;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sLl*xzii", link_loc_id, link_name, link_type, udata,
+             udata_size, lcpl_id, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(link_loc_id, &link_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!link_name || !*link_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no link name specified")
+    if(link_type < H5L_TYPE_UD_MIN || link_type > H5L_TYPE_MAX)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link class")
+
+    /* Create external link */
+    if(H5L_create_ud(&link_loc, link_name, udata, udata_size, link_type, lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lcreate_ud() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ldelete
+ *
+ * Purpose:	Removes the specified NAME from the group graph and
+ *		decrements the link count for the object to which NAME
+ *		points.  If the link count reaches zero then all file-space
+ *		associated with the object will be reclaimed (but if the
+ *		object is open, then the reclamation of the file space is
+ *		delayed until all handles to the object are closed).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Group's location */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*si", loc_id, name, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Unlink */
+    if(H5L_delete(&loc, name, lapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delete link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ldelete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ldelete_by_idx
+ *
+ * Purpose:	Removes the specified link from the group graph and
+ *		decrements the link count for the object to which it
+ *		points, according to the order within an index.
+ *
+ *		If the link count reaches zero then all file-space
+ *		associated with the object will be reclaimed (but if the
+ *		object is open, then the reclamation of the file space is
+ *		delayed until all handles to the object are closed).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ldelete_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Group's location */
+    H5L_trav_rmbi_t udata;              /* User data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*sIiIohi", loc_id, group_name, idx_type, order, n, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up user data for unlink operation */
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.n = n;
+    udata.dxpl_id = H5AC_dxpl_id;
+
+    /* Traverse the group hierarchy to remove the link */
+    if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK|H5G_TARGET_MOUNT, H5L_delete_by_idx_cb, &udata, lapl_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ldelete_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lget_val
+ *
+ * Purpose:	Returns the link value of a link whose name is NAME.  For
+ *              symbolic links, this is the path to which the link points,
+ *              including the null terminator.  For user-defined links, it
+ *              is the link buffer.
+ *
+ *              At most SIZE bytes are copied to the BUF result buffer.
+ *
+ * Return:	Success:	Non-negative with the link value in BUF.
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/, size_t size,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Group location for location to query */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*sxzi", loc_id, name, buf, size, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Get the link value */
+    if(H5L_get_val(&loc, name, buf, size, lapl_id, H5AC_ind_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link value for '%s'", name)
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lget_val() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lget_val_by_idx
+ *
+ * Purpose:	Returns the link value of a link, according to the order of
+ *              an index.  For symbolic links, this is the path to which the
+ *              link points, including the null terminator.  For user-defined
+ *              links, it is the link buffer.
+ *
+ *              At most SIZE bytes are copied to the BUF result buffer.
+ *
+ * Return:	Success:	Non-negative with the link value in BUF.
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 13, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lget_val_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, void *buf/*out*/, size_t size,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Group location for location to query */
+    H5L_trav_gvbi_t udata;              /* User data for callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("e", "i*sIiIohxzi", loc_id, group_name, idx_type, order, n, buf, size,
+             lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up user data for retrieving information */
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.n = n;
+    udata.dxpl_id = H5AC_ind_dxpl_id;
+    udata.buf = buf;
+    udata.size = size;
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_get_val_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lget_val_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lexists
+ *
+ * Purpose:	Checks if a link of a given name exists in a group
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 16, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id)
+{
+    H5G_loc_t	loc;
+    htri_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("t", "i*si", loc_id, name, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Check for the existence of the link */
+    if((ret_value = H5L_exists(&loc, name, lapl_id, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lexists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lget_info
+ *
+ * Purpose:	Gets metadata for a link.
+ *
+ * Return:	Success:	Non-negative with information in LINFO
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Wednesday, June 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linfo /*out*/,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*sxi", loc_id, name, linfo, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Get the link information */
+    if(H5L_get_info(&loc, name, linfo, lapl_id, H5AC_ind_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lget_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lget_info_by_idx
+ *
+ * Purpose:	Gets metadata for a link, according to the order within an
+ *              index.
+ *
+ * Return:	Success:	Non-negative with information in LINFO
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lget_info_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    H5L_info_t *linfo /*out*/, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Group location for group to query */
+    H5L_trav_gibi_t udata;              /* User data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIohxi", loc_id, group_name, idx_type, order, n, linfo,
+             lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up user data for callback */
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.n = n;
+    udata.dxpl_id = H5AC_ind_dxpl_id;
+    udata.linfo = linfo;
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_info_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info")
+
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lget_info_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lregister
+ *
+ * Purpose:	Registers a class of user-defined links, or changes the
+ *              behavior of an existing class.
+ *
+ *              The link class passed in will override any existing link
+ *              class for the specified link class ID. It must at least
+ *              include a H5L_class_t version (which should be
+ *              H5L_LINK_CLASS_T_VERS), a link class ID, and a traversal
+ *              function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lregister(const H5L_class_t *cls)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*x", cls);
+
+    /* Check args */
+    if(cls == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link class")
+
+    /* Check H5L_class_t version number; this is where a function to convert
+     * from an outdated version should be called.
+     */
+    if(cls->version != H5L_LINK_CLASS_T_VERS)
+      HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid H5L_class_t version number")
+
+    if(cls->id < H5L_TYPE_UD_MIN || cls->id > H5L_TYPE_MAX)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link identification number")
+    if(cls->trav_func == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no traversal function specified")
+
+    /* Do it */
+    if(H5L_register(cls) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to register link type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lunregister
+ *
+ * Purpose:	Unregisters a class of user-defined links, preventing them
+ *              from being traversed, queried, moved, etc.
+ *
+ *              A link class can be re-registered using H5Lregister().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lunregister(H5L_type_t id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "Ll", id);
+
+    /* Check args */
+    if(id < 0 || id > H5L_TYPE_MAX)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link type")
+
+    /* Do it */
+    if(H5L_unregister(id) < 0)
+	HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to unregister link type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lunregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lis_registered
+ *
+ * Purpose:	Tests whether a user-defined link class has been registered
+ *              or not.
+ *
+ * Return:	Positive if the link class has been registered
+ *              Zero if it is unregistered
+ *              Negative on error (if the class is not a valid UD class ID)
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Lis_registered(H5L_type_t id)
+{
+    size_t i;                   /* Local index variable */
+    htri_t ret_value = FALSE;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "Ll", id);
+
+    /* Check args */
+    if(id < 0 || id > H5L_TYPE_MAX)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link type id number")
+
+    /* Is the link class already registered? */
+    for(i = 0; i < H5L_table_used_g; i++)
+	if(H5L_table_g[i].id == id) {
+            ret_value = TRUE;
+            break;
+        } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lis_registered() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lget_name_by_idx
+ *
+ * Purpose:	Gets name for a link, according to the order within an
+ *              index.
+ *
+ *              Same pattern of behavior as H5Iget_name.
+ *
+ * Return:	Success:	Non-negative length of name, with information
+ *				in NAME buffer
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, November 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Lget_name_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    char *name /*out*/, size_t size, hid_t lapl_id)
+{
+    H5G_loc_t	loc;            /* Location of group */
+    H5L_trav_gnbi_t udata;      /* User data for callback */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("Zs", "i*sIiIohxzi", loc_id, group_name, idx_type, order, n, name, size,
+             lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up user data for callback */
+    udata.idx_type = idx_type;
+    udata.order = order;
+    udata.n = n;
+    udata.dxpl_id = H5AC_ind_dxpl_id;
+    udata.name = name;
+    udata.size = size;
+    udata.name_len = -1;
+
+    /* Traverse the group hierarchy to locate the link to get name of */
+    if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_name_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist")
+
+    /* Set the return value */
+    ret_value = udata.name_len;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lget_name_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Literate
+ *
+ * Purpose:	Iterates over links in a group, with user callback routine,
+ *              according to the order within an index.
+ *
+ *              Same pattern of behavior as H5Giterate.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Literate(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t *idx_p, H5L_iterate_t op, void *op_data)
+{
+    H5I_type_t  id_type;        /* Type of ID */
+    H5G_link_iterate_t lnk_op;  /* Link operator */
+    hsize_t     last_lnk;       /* Index of last object looked at */
+    hsize_t	idx;            /* Internal location to hold index */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iIiIo*hx*x", grp_id, idx_type, order, idx_p, op, op_data);
+
+    /* Check arguments */
+    id_type = H5I_get_type(grp_id);
+    if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified")
+
+    /* Set up iteration beginning/end info */
+    idx = (idx_p == NULL ? 0 : *idx_p);
+    last_lnk = 0;
+
+    /* Build link operator info */
+    lnk_op.op_type = H5G_LINK_OP_NEW;
+    lnk_op.op_func.op_new = op;
+
+    /* Iterate over the links */
+    if((ret_value = H5G_iterate(grp_id, ".", idx_type, order, idx, &last_lnk, &lnk_op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link iteration failed")
+
+    /* Set the index we stopped at */
+    if(idx_p)
+        *idx_p = last_lnk;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Literate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Literate_by_name
+ *
+ * Purpose:	Iterates over links in a group, with user callback routine,
+ *              according to the order within an index.
+ *
+ *              Same pattern of behavior as H5Giterate.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Literate_by_name(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx_p,
+    H5L_iterate_t op, void *op_data, hid_t lapl_id)
+{
+    H5G_link_iterate_t lnk_op;  /* Link operator */
+    hsize_t     last_lnk;       /* Index of last object looked at */
+    hsize_t	idx;            /* Internal location to hold index */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("e", "i*sIiIo*hx*xi", loc_id, group_name, idx_type, order, idx_p, op,
+             op_data, lapl_id);
+
+    /* Check arguments */
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up iteration beginning/end info */
+    idx = (idx_p == NULL ? 0 : *idx_p);
+    last_lnk = 0;
+
+    /* Build link operator info */
+    lnk_op.op_type = H5G_LINK_OP_NEW;
+    lnk_op.op_func.op_new = op;
+
+    /* Iterate over the links */
+    if((ret_value = H5G_iterate(loc_id, group_name, idx_type, order, idx, &last_lnk, &lnk_op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link iteration failed")
+
+    /* Set the index we stopped at */
+    if(idx_p)
+        *idx_p = last_lnk;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Literate_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lvisit
+ *
+ * Purpose:	Recursively visit all the links in a group and all
+ *              the groups that are linked to from that group.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Each _link_ reachable from the initial group will only be
+ *              visited once.  However, because an object may be reached from
+ *              more than one link, the visitation may call the application's
+ *              callback with more than one link that points to a particular
+ *              _object_.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 24 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lvisit(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order,
+    H5L_iterate_t op, void *op_data)
+{
+    H5I_type_t  id_type;                /* Type of ID */
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iIiIox*x", grp_id, idx_type, order, op, op_data);
+
+    /* Check args */
+    id_type = H5I_get_type(grp_id);
+    if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
+
+    /* Call internal group visitation routine */
+    if((ret_value = H5G_visit(grp_id, ".", idx_type, order, op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link visitation failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lvisit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lvisit_by_name
+ *
+ * Purpose:	Recursively visit all the links in a group and all
+ *              the groups that are linked to from that group.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Each _link_ reachable from the initial group will only be
+ *              visited once.  However, because an object may be reached from
+ *              more than one link, the visitation may call the application's
+ *              callback with more than one link that points to a particular
+ *              _object_.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 3 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lvisit_by_name(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, H5L_iterate_t op, void *op_data, hid_t lapl_id)
+{
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIox*xi", loc_id, group_name, idx_type, order, op, op_data,
+             lapl_id);
+
+    /* Check args */
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Call internal group visitation routine */
+    if((ret_value = H5G_visit(loc_id, group_name, idx_type, order, op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link visitation failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lvisit_by_name() */
+
+/*
+ *-------------------------------------------------------------------------
+ *-------------------------------------------------------------------------
+ *   N O   A P I   F U N C T I O N S   B E Y O N D   T H I S   P O I N T
+ *-------------------------------------------------------------------------
+ *-------------------------------------------------------------------------
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_find_class_idx
+ *
+ * Purpose:	Given a link class ID, return the offset in the global array
+ *              that holds all the registered link classes.
+ *
+ * Return:	Success:	Non-negative index of entry in global
+ *                              link class table.
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5L_find_class_idx(H5L_type_t id)
+{
+    size_t i;                   /* Local index variable */
+    int ret_value = FAIL;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    for(i = 0; i < H5L_table_used_g; i++)
+	if(H5L_table_g[i].id == id)
+	    HGOTO_DONE((int)i)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_find_class_idx */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_find_class
+ *
+ * Purpose:	Given a link class ID return a pointer to a global struct that
+ *		defines the link class.
+ *
+ * Return:	Success:	Ptr to entry in global link class table.
+ *		Failure:	NULL
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+const H5L_class_t *
+H5L_find_class(H5L_type_t id)
+{
+    int	idx;                            /* Filter index in global table */
+    H5L_class_t *ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Get the index in the global table */
+    if((idx = H5L_find_class_idx(id)) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, NULL, "unable to find link class")
+
+    /* Set return value */
+    ret_value = H5L_table_g+idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_find_class */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_register
+ *
+ * Purpose:	Registers a class of user-defined links, or changes the
+ *              behavior of an existing class.
+ *
+ *              See H5Lregister for full documentation.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_register(const H5L_class_t *cls)
+{
+    size_t      i;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cls);
+    HDassert(cls->id >= 0 && cls->id <= H5L_TYPE_MAX);
+
+    /* Is the link type already registered? */
+    for(i = 0; i < H5L_table_used_g; i++)
+	if(H5L_table_g[i].id == cls->id)
+            break;
+
+    /* Filter not already registered */
+    if(i >= H5L_table_used_g) {
+	if(H5L_table_used_g >= H5L_table_alloc_g) {
+	    size_t n = MAX(H5L_MIN_TABLE_SIZE, (2 * H5L_table_alloc_g));
+	    H5L_class_t *table = (H5L_class_t *)H5MM_realloc(H5L_table_g, (n * sizeof(H5L_class_t)));
+            if(!table)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend link type table")
+	    H5L_table_g = table;
+            H5L_table_alloc_g = n;
+	} /* end if */
+
+	/* Initialize */
+	i = H5L_table_used_g++;
+    } /* end if */
+
+    /* Copy link class info into table */
+    HDmemcpy(H5L_table_g + i, cls, sizeof(H5L_class_t));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_register */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_unregister
+ *
+ * Purpose:	Unregisters a class of user-defined links.
+ *
+ *              See H5Lunregister for full documentation.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_unregister(H5L_type_t id)
+{
+    size_t i;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(id >= 0 && id <= H5L_TYPE_MAX);
+
+    /* Is the filter already registered? */
+    for(i = 0; i < H5L_table_used_g; i++)
+	if(H5L_table_g[i].id == id)
+            break;
+
+    /* Fail if filter not found */
+    if(i >= H5L_table_used_g)
+        HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "link class is not registered")
+
+    /* Remove filter from table */
+    /* Don't worry about shrinking table size (for now) */
+    HDmemmove(&H5L_table_g[i], &H5L_table_g[i + 1], sizeof(H5L_class_t) * ((H5L_table_used_g - 1) - i));
+    H5L_table_used_g--;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_unregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_link
+ *
+ * Purpose:	Creates a link from OBJ_ID to CUR_NAME.  See H5Olink() for
+ *		full documentation.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Tuesday, December 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_link(const H5G_loc_t *new_loc, const char *new_name, H5G_loc_t *obj_loc,
+    hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5O_link_t lnk;                     /* Link to insert */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(new_loc);
+    HDassert(obj_loc);
+    HDassert(new_name && *new_name);
+
+    /* The link callback will check that the object isn't being hard linked
+     * into a different file, so we don't need to do it here (there could be
+     * external links along the path).
+     */
+
+    /* Construct link information for eventual insertion */
+    lnk.type = H5L_TYPE_HARD;
+    lnk.u.hard.addr = obj_loc->oloc->addr;
+
+    /* Create the link */
+    if(H5L_create_real(new_loc, new_name, obj_loc->path, obj_loc->oloc->file, &lnk, NULL, lcpl_id, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_link_object
+ *
+ * Purpose:	Creates a new object and a link to it.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, April 9, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_link_object(const H5G_loc_t *new_loc, const char *new_name,
+    H5O_obj_create_t *ocrt_info, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5O_link_t lnk;                     /* Link to insert */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(new_loc);
+    HDassert(new_name && *new_name);
+    HDassert(ocrt_info);
+
+    /* The link callback will check that the object isn't being hard linked
+     * into a different file, so we don't need to do it here (there could be
+     * external links along the path).
+     */
+
+    /* Construct link information for eventual insertion */
+    lnk.type = H5L_TYPE_HARD;
+
+    /* Create the link */
+    if(H5L_create_real(new_loc, new_name, NULL, NULL, &lnk, ocrt_info, lcpl_id, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_link_object() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_link_cb
+ *
+ * Purpose:	Callback for creating a link to an object.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_link_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t H5_ATTR_UNUSED *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_cr_t *udata = (H5L_trav_cr_t *)_udata;   /* User data passed in */
+    H5G_t *grp = NULL;              /* H5G_t for this group, opened to pass to user callback */
+    hid_t grp_id = FAIL;            /* Id for this group (passed to user callback */
+    H5G_loc_t temp_loc;             /* For UD callback */
+    hbool_t temp_loc_init = FALSE;  /* Temporary location for UD callback (temp_loc) has been initialized */
+    hbool_t obj_created = FALSE;    /* Whether an object was created (through a hard link) */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid location */
+    /* (which is not what we want) */
+    if(obj_loc != NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name already exists")
+
+    /* Check for crossing file boundaries with a new hard link */
+    if(udata->lnk->type == H5L_TYPE_HARD) {
+        /* Check for creating an object */
+        /* (only for hard links) */
+        if(udata->ocrt_info) {
+            H5G_loc_t new_loc;          /* Group location for new object */
+
+            /* Create new object at this location */
+            if(NULL == (udata->ocrt_info->new_obj = H5O_obj_create(grp_loc->oloc->file, udata->ocrt_info->obj_type, udata->ocrt_info->crt_info, &new_loc, udata->dxpl_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to create object")
+
+            /* Set address for hard link */
+            udata->lnk->u.hard.addr = new_loc.oloc->addr;
+
+            /* Set object path to use for setting object name (below) */
+            udata->path = new_loc.path;
+
+            /* Indicate that an object was created */
+            obj_created = TRUE;
+        } /* end if */
+        else {
+            /* Check that both objects are in same file */
+            if(!H5F_SAME_SHARED(grp_loc->oloc->file, udata->file))
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "interfile hard links are not allowed")
+        } /* end else */
+    } /* end if */
+
+    /* Set 'standard' aspects of link */
+    udata->lnk->corder = 0;            /* Will be re-written during group insertion, if the group is tracking creation order */
+    udata->lnk->corder_valid = FALSE;   /* Creation order not valid (yet) */
+
+    /* Check for non-default link creation properties */
+    if(udata->lc_plist) {
+        /* Get character encoding property */
+        if(H5P_get(udata->lc_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &udata->lnk->cset) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for character encoding")
+    } /* end if */
+    else
+        udata->lnk->cset = H5F_DEFAULT_CSET;   /* Default character encoding for link */
+
+    /* Set the link's name correctly */
+    /* Casting away const OK -QAK */
+    udata->lnk->name = (char *)name;
+
+    /* Insert link into group */
+    if(H5G_obj_insert(grp_loc->oloc, name, udata->lnk, TRUE,
+            udata->ocrt_info ? udata->ocrt_info->obj_type : H5O_TYPE_UNKNOWN,
+            udata->ocrt_info ? udata->ocrt_info->crt_info : NULL,
+            udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link for object")
+
+    /* Set object's path if it has been passed in and is not set */
+    if(udata->path != NULL && udata->path->user_path_r == NULL)
+        if(H5G_name_set(grp_loc->path, udata->path, name) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "cannot set name")
+
+    /* If link is a user-defined link, trigger its creation callback if it has one */
+    if(udata->lnk->type >= H5L_TYPE_UD_MIN) {
+        const H5L_class_t   *link_class;         /* User-defined link class */
+
+        /* Get the link class for this type of link. */
+        if(NULL == (link_class = H5L_find_class(udata->lnk->type)))
+            HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to get class of UD link")
+
+        if(link_class->create_func != NULL) {
+            H5O_loc_t           temp_oloc;
+            H5G_name_t          temp_path;
+
+            /* Create a temporary location (or else H5G_open will do a shallow
+             * copy and wipe out grp_loc)
+             */
+            H5G_name_reset(&temp_path);
+            if(H5O_loc_copy(&temp_oloc, grp_loc->oloc, H5_COPY_DEEP) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy object location")
+
+            temp_loc.oloc = &temp_oloc;
+            temp_loc.path = &temp_path;
+            temp_loc_init = TRUE;
+
+            /* Set up location for user-defined callback */
+            if((grp = H5G_open(&temp_loc, udata->dxpl_id)) == NULL)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+            if((grp_id = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+                HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register ID for group")
+
+            /* Make callback */
+            if((link_class->create_func)(name, grp_id, udata->lnk->u.ud.udata, udata->lnk->u.ud.size, H5P_DEFAULT) < 0)
+                HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "link creation callback failed")
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Check if an object was created */
+    if(obj_created) {
+        H5O_loc_t oloc;         /* Object location for created object */
+
+        /* Set up object location */
+        HDmemset(&oloc, 0, sizeof(oloc));
+        oloc.file = grp_loc->oloc->file;
+        oloc.addr = udata->lnk->u.hard.addr;
+
+        /* Decrement refcount on new object's object header in memory */
+        if(H5O_dec_rc_by_loc(&oloc, udata->dxpl_id) < 0)
+           HDONE_ERROR(H5E_LINK, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+    } /* end if */
+
+    /* Close the location given to the user callback if it was created */
+    if(grp_id >= 0) {
+        if(H5I_dec_app_ref(grp_id) < 0)
+            HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom from UD callback")
+    } /* end if */
+    else if(grp != NULL) {
+        if(H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close group given to UD callback")
+    } /* end if */
+    else if(temp_loc_init)
+        H5G_loc_free(&temp_loc);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_link_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5L_create_real
+ *
+ * Purpose:     Creates a link at a path location
+ *
+ *              lnk should have linkclass-specific information already
+ *              set, but this function will take care of setting name.
+ *
+ *              obj_path can be NULL if the object's path doesn't need to
+ *              be set, and obj_file can be NULL if the object is not a
+ *              hard link.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, December  5, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_create_real(const H5G_loc_t *link_loc, const char *link_name,
+    H5G_name_t *obj_path, H5F_t *obj_file, H5O_link_t *lnk,
+    H5O_obj_create_t *ocrt_info, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id)
+{
+    char *norm_link_name = NULL;        /* Pointer to normalized link name */
+    unsigned target_flags = H5G_TARGET_NORMAL; /* Flags to pass to group traversal function */
+    H5P_genplist_t *lc_plist = NULL;   /* Link creation property list */
+    H5L_trav_cr_t udata;               /* User data for callback */
+    herr_t ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(link_loc);
+    HDassert(link_name && *link_name);
+    HDassert(lnk);
+    HDassert(lnk->type >= H5L_TYPE_HARD && lnk->type <= H5L_TYPE_MAX);
+
+    /* Get normalized link name */
+    if((norm_link_name = H5G_normalize(link_name)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "can't normalize name")
+
+    /* Check for flags present in creation property list */
+    if(lcpl_id != H5P_DEFAULT) {
+        unsigned crt_intmd_group;
+
+        /* Get link creation property list */
+        if(NULL == (lc_plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+        /* Get intermediate group creation property */
+        if(H5P_get(lc_plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, &crt_intmd_group) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for creating missing groups")
+
+        if(crt_intmd_group > 0)
+            target_flags |= H5G_CRT_INTMD_GROUP;
+    } /* end if */
+
+    /* Set up user data
+     * FILE is used to make sure that hard links don't cross files, and
+     * should be NULL for other link types.
+     * LC_PLIST is a pointer to the link creation property list.
+     * DXPL_ID is the dxpl ID that needs to be used during writes and reads.
+     * PATH is a pointer to the path of the object being inserted if this is
+     * a hard link; this is used to set the paths to objects when they are
+     * created.  For other link types, this is NULL.
+     * OCRT_INFO is a pointer to the structure for object creation.
+     * LNK is the link struct passed into this function.  At this point all
+     * of its fields should be populated except for name, which is set when
+     * inserting it in the callback.
+     */
+    udata.file = obj_file;
+    udata.lc_plist = lc_plist;
+    udata.dxpl_id = dxpl_id;
+    udata.path = obj_path;
+    udata.ocrt_info = ocrt_info;
+    udata.lnk = lnk;
+
+    /* Traverse the destination path & create new link */
+    if(H5G_traverse(link_loc, link_name, target_flags, H5L_link_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "can't insert link")
+
+done:
+    /* Free the normalized path name */
+    if(norm_link_name)
+        H5MM_xfree(norm_link_name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_create_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_create_hard
+ *
+ * Purpose:	Creates a hard link from NEW_NAME to CUR_NAME.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name,
+    const H5G_loc_t *link_loc, const char *link_name, hid_t lcpl_id,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    char *norm_cur_name = NULL;	        /* Pointer to normalized current name */
+    H5F_t *link_file = NULL;            /* Pointer to file to link to */
+    H5O_link_t lnk;                     /* Link to insert */
+    H5G_loc_t obj_loc;                  /* Location of object to link to */
+    H5G_name_t path;                    /* obj_loc's path*/
+    H5O_loc_t oloc;                     /* obj_loc's oloc */
+    hbool_t loc_valid = FALSE;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(cur_loc);
+    HDassert(cur_name && *cur_name);
+    HDassert(link_loc);
+    HDassert(link_name && *link_name);
+
+    /* Get normalized copy of the current name */
+    if((norm_cur_name = H5G_normalize(cur_name)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "can't normalize name")
+
+    /* Set up link data specific to hard links */
+    lnk.type = H5L_TYPE_HARD;
+
+    /* Get object location for object pointed to */
+    obj_loc.path = &path;
+    obj_loc.oloc = &oloc;
+    H5G_loc_reset(&obj_loc);
+    if(H5G_loc_find(cur_loc, norm_cur_name, &obj_loc, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "source object not found")
+    loc_valid = TRUE;
+
+    /* Construct link information for eventual insertion */
+    lnk.u.hard.addr = obj_loc.oloc->addr;
+
+    /* Set destination's file information */
+    link_file = obj_loc.oloc->file;
+
+    /* Create actual link to the object.  Pass in NULL for the path, since this
+     * function shouldn't change an object's user path. */
+    if(H5L_create_real(link_loc, link_name, NULL, link_file, &lnk, NULL, lcpl_id, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
+
+done:
+    /* Free the object header location */
+    if(loc_valid)
+        if(H5G_loc_free(&obj_loc) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location")
+
+    /* Free the normalized path name */
+    if(norm_cur_name)
+        H5MM_xfree(norm_cur_name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_create_hard() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_create_soft
+ *
+ * Purpose:	Creates a soft link from LINK_NAME to TARGET_PATH.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_create_soft(const char *target_path, const H5G_loc_t *link_loc,
+    const char *link_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id)
+{
+    char *norm_target = NULL;	        /* Pointer to normalized current name */
+    H5O_link_t lnk;                     /* Link to insert */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(link_loc);
+    HDassert(target_path && *target_path);
+    HDassert(link_name && *link_name);
+
+    /* Get normalized copy of the link target */
+    if((norm_target = H5G_normalize(target_path)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "can't normalize name")
+
+    /* Set up link data specific to soft links */
+    lnk.type = H5L_TYPE_SOFT;
+    lnk.u.soft.name = norm_target;
+
+    /* Create actual link to the object */
+    if(H5L_create_real(link_loc, link_name, NULL, NULL, &lnk, NULL, lcpl_id, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
+
+done:
+    /* Free the normalized target name */
+    if(norm_target)
+        H5MM_xfree(norm_target);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_create_soft() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_create_ud
+ *
+ * Purpose:	Creates a user-defined link. See H5Lcreate_ud for
+ *              full documentation.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Friday, May 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_create_ud(const H5G_loc_t *link_loc, const char *link_name,
+    const void *ud_data, size_t ud_data_size, H5L_type_t type, hid_t lcpl_id,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5O_link_t lnk;                     /* Link to insert */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(type >= H5L_TYPE_UD_MIN && type <= H5L_TYPE_MAX);
+    HDassert(link_loc);
+    HDassert(link_name && *link_name);
+    HDassert(ud_data_size == 0 || ud_data);
+
+    /* Initialize the link struct's pointer to its udata buffer */
+    lnk.u.ud.udata = NULL;
+
+    /* Make sure that this link class is registered */
+    if(H5L_find_class_idx(type) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "link class has not been registered with library")
+
+    /* Fill in UD link-specific information in the link struct*/
+    if(ud_data_size > 0) {
+        lnk.u.ud.udata = H5MM_malloc((size_t)ud_data_size);
+        HDmemcpy(lnk.u.ud.udata, ud_data, (size_t) ud_data_size);
+    } /* end if */
+    else
+        lnk.u.ud.udata = NULL;
+
+    lnk.u.ud.size = ud_data_size;
+    lnk.type = type;
+
+    /* Create actual link to the object */
+    if(H5L_create_real(link_loc, link_name, NULL, NULL, &lnk, NULL, lcpl_id, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to register new name for object")
+
+done:
+    /* Free the link's udata buffer if it's been allocated */
+    H5MM_xfree(lnk.u.ud.udata);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_create_ud() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_val_real
+ *
+ * Purpose:	Retrieve link value from a link object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_val_real(const H5O_link_t *lnk, void *buf, size_t size)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(lnk);
+
+    /* Check for soft link */
+    if(H5L_TYPE_SOFT == lnk->type) {
+        /* Copy to output buffer */
+        if(size > 0 && buf) {
+            HDstrncpy((char *)buf, lnk->u.soft.name, size);
+            if(HDstrlen(lnk->u.soft.name) >= size)
+                ((char *)buf)[size - 1] = '\0';
+        } /* end if */
+    } /* end if */
+    /* Check for user-defined link */
+    else if(lnk->type >= H5L_TYPE_UD_MIN) {
+        const H5L_class_t *link_class;             /* User-defined link class */
+
+        /* Get the link class for this type of link.  It's okay if the class
+         * isn't registered, though--we just can't give any more information
+         * about it
+         */
+        link_class = H5L_find_class(lnk->type);
+
+        if(link_class != NULL && link_class->query_func != NULL) {
+            if((link_class->query_func)(lnk->name, lnk->u.ud.udata, lnk->u.ud.size, buf, size) < 0)
+                HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "query callback returned failure")
+        } /* end if */
+        else if(buf && size > 0)
+            ((char *)buf)[0] = '\0';
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_LINK, H5E_BADTYPE, FAIL, "object is not a symbolic or user-defined link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_val_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_val_cb
+ *
+ * Purpose:	Callback for retrieving link value or udata.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September 20, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_val_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char *name, const H5O_link_t *lnk,
+    H5G_loc_t H5_ATTR_UNUSED *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gv_t *udata = (H5L_trav_gv_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;               /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(lnk == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "'%s' doesn't exist", name)
+
+    /* Retrieve the value for the link */
+    if(H5L_get_val_real(lnk, udata->buf, udata->size) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't retrieve link value")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_val_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_val
+ *
+ * Purpose:	Returns the value of a symbolic link or the udata for a
+ *              user-defined link.
+ *
+ * Return:	Success:	Non-negative, with at most SIZE bytes of the
+ *				link value copied into the BUF buffer.  If the
+ *				link value is larger than SIZE characters
+ *				counting the null terminator then the BUF
+ *				result will not be null terminated.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_get_val(H5G_loc_t *loc, const char *name, void *buf/*out*/, size_t size,
+    hid_t lapl_id, hid_t dxpl_id)
+{
+    H5L_trav_gv_t udata;           /* User data for callback */
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up user data for retrieving information */
+    udata.size = size;
+    udata.buf = buf;
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(loc, name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_get_val_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5L_get_val() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_val_by_idx_cb
+ *
+ * Purpose:	Callback for retrieving a link's value according to an
+ *              index's order.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_val_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gvbi_t *udata = (H5L_trav_gvbi_t *)_udata;   /* User data passed in */
+    H5O_link_t fnd_lnk;                 /* Link within group */
+    hbool_t lnk_copied = FALSE;         /* Whether the link was copied */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name of the group resolved to a valid object */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Query link */
+    if(H5G_obj_lookup_by_idx(obj_loc->oloc, udata->idx_type, udata->order,
+                udata->n, &fnd_lnk, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "link not found")
+    lnk_copied = TRUE;
+
+    /* Retrieve the value for the link */
+    if(H5L_get_val_real(&fnd_lnk, udata->buf, udata->size) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't retrieve link value")
+
+done:
+    /* Reset the link information, if we have a copy */
+    if(lnk_copied)
+        H5O_msg_reset(H5O_LINK_ID, &fnd_lnk);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_val_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_delete_cb
+ *
+ * Purpose:	Callback for deleting a link.  This routine
+ *              actually deletes the link
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_delete_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk,
+    H5G_loc_t H5_ATTR_UNUSED *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_rm_t *udata = (H5L_trav_rm_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the group resolved to a valid link */
+    if(grp_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Check if the name in this group resolved to a valid link */
+    if(name == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Check for removing '.' */
+    if(lnk == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "can't delete self")
+
+    /* Remove the link from the group */
+    if(H5G_obj_remove(grp_loc->oloc, grp_loc->path->full_path_r, name, udata->dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to remove link from group")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_delete_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_delete
+ *
+ * Purpose:	Delete a link from a group.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, September 17, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_delete(H5G_loc_t *loc, const char *name, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5L_trav_rm_t      udata;                  /* User data for callback */
+    char		*norm_name = NULL;	/* Pointer to normalized name */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Get normalized copy of the name */
+    if((norm_name = H5G_normalize(name)) == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "can't normalize name")
+
+    /* Set up user data for unlink operation */
+    udata.dxpl_id = dxpl_id;
+    if(H5G_traverse(loc, norm_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK|H5G_TARGET_MOUNT, H5L_delete_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTREMOVE, FAIL, "can't unlink object")
+
+done:
+    /* Free the normalized path name */
+    if(norm_name)
+        H5MM_xfree(norm_name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_delete_by_idx_cb
+ *
+ * Purpose:	Callback for removing a link according to an index's order.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 13 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_delete_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gvbi_t *udata = (H5L_trav_gvbi_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name of the group resolved to a valid object */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Delete link */
+    if(H5G_obj_remove_by_idx(obj_loc->oloc, obj_loc->path->full_path_r,
+            udata->idx_type, udata->order, udata->n, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "link not found")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_delete_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_move_dest_cb
+ *
+ * Purpose:	Second callback for moving and renaming an object.  This routine
+ *              inserts a new link into the group returned by the traversal.
+ *              It is called by H5L_move_cb.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, April 3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_move_dest_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_mv2_t *udata = (H5L_trav_mv2_t *)_udata;   /* User data passed in */
+    H5G_t *grp = NULL;                  /* H5G_t for this group, opened to pass to user callback */
+    hid_t grp_id = FAIL;                /* ID for this group (passed to user callback */
+    H5G_loc_t temp_loc;                 /* For UD callback */
+    hbool_t temp_loc_init = FALSE;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Make sure an object with this name doesn't already exist */
+    if(obj_loc != NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "an object with that name already exists")
+
+    /* Check for crossing file boundaries with a new hard link */
+    if(udata->lnk->type == H5L_TYPE_HARD) {
+        /* Check that both objects are in same file */
+        if(!H5F_SAME_SHARED(grp_loc->oloc->file, udata->file))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "moving a link across files is not allowed")
+    } /* end if */
+
+    /* Give the object its new name */
+    /* Casting away const okay -JML */
+    HDassert(udata->lnk->name == NULL);
+    udata->lnk->name = (char *)name;
+
+    /* Insert the link into the group */
+    if(H5G_obj_insert(grp_loc->oloc, name, udata->lnk, TRUE, H5O_TYPE_UNKNOWN,
+            NULL, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
+
+    /* If the link was a user-defined link, call its move callback if it has one */
+    if(udata->lnk->type >= H5L_TYPE_UD_MIN) {
+        const H5L_class_t   *link_class;         /* User-defined link class */
+
+        /* Get the link class for this type of link. */
+        if(NULL == (link_class = H5L_find_class(udata->lnk->type)))
+            HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "link class is not registered")
+
+        if((!udata->copy && link_class->move_func) || (udata->copy && link_class->copy_func)) {
+            H5O_loc_t           temp_oloc;
+            H5G_name_t          temp_path;
+
+            /* Create a temporary location (or else H5G_open will do a shallow
+             * copy and wipe out grp_loc)
+             */
+            H5G_name_reset(&temp_path);
+            if(H5O_loc_copy(&temp_oloc, grp_loc->oloc, H5_COPY_DEEP) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "unable to copy object location")
+
+            temp_loc.oloc = &temp_oloc;
+            temp_loc.path = &temp_path;
+            temp_loc_init = TRUE;
+
+            /* Set up location for user-defined callback */
+            if((grp = H5G_open(&temp_loc, udata->dxpl_id)) == NULL)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+            if((grp_id = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
+                HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group ID")
+
+            if(udata->copy) {
+                if((link_class->copy_func)(udata->lnk->name, grp_id, udata->lnk->u.ud.udata, udata->lnk->u.ud.size) < 0)
+                    HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "UD copy callback returned error")
+            } /* end if */
+            else {
+                if((link_class->move_func)(udata->lnk->name, grp_id, udata->lnk->u.ud.udata, udata->lnk->u.ud.size) < 0)
+                    HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "UD move callback returned error")
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Close the location given to the user callback if it was created */
+    if(grp_id >= 0) {
+        if(H5I_dec_app_ref(grp_id) < 0)
+            HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom from UD callback")
+    } /* end if */
+    else if(grp != NULL) {
+        if(H5G_close(grp) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close group given to UD callback")
+    } /* end if */
+    else if(temp_loc_init)
+        H5G_loc_free(&temp_loc);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    /* Reset the "name" field in udata->lnk because it is owned by traverse()
+     * and must not be manipulated after traverse closes */
+    udata->lnk->name = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_move_dest_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_move_cb
+ *
+ * Purpose:	Callback for moving and renaming an object.  This routine
+ *              replaces the names of open objects with the moved object
+ *              in the path
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Friday, April 3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_move_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk,
+    H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_mv_t *udata = (H5L_trav_mv_t *)_udata;   /* User data passed in */
+    H5L_trav_mv2_t udata_out;           /* User data for H5L_move_dest_cb traversal */
+    char * orig_name = NULL;            /* The name of the link in this group */
+    hbool_t link_copied = FALSE;        /* Has udata_out.lnk been allocated? */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Check for operations on '.' */
+    if(lnk == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "the name of a link must be supplied to move or copy")
+
+    /* Set up user data for move_dest_cb */
+    if(NULL == (udata_out.lnk = (H5O_link_t *)H5O_msg_copy(H5O_LINK_ID, lnk, NULL)))
+        HGOTO_ERROR(H5E_LINK, H5E_CANTCOPY, FAIL, "unable to copy link to be moved")
+
+    /* In this special case, the link's name is going to be replaced at its
+     * destination, so we should free it here.
+     */
+    udata_out.lnk->name = (char *)H5MM_xfree(udata_out.lnk->name);
+    link_copied = TRUE;
+
+    udata_out.lnk->cset = udata->cset;
+    udata_out.file = grp_loc->oloc->file;
+    udata_out.copy = udata->copy;
+    udata_out.dxpl_id = udata->dxpl_id;
+
+    /* Keep a copy of link's name (it's "owned" by the H5G_traverse() routine) */
+    orig_name = H5MM_xstrdup(name);
+
+    /* Insert the link into its new location */
+    if(H5G_traverse(udata->dst_loc, udata->dst_name, udata->dst_target_flags,
+            H5L_move_dest_cb, &udata_out, udata->lapl_id, udata->dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to follow symbolic link")
+
+    /* If this is a move and not a copy operation, change the object's name and remove the old link */
+    if(!udata->copy) {
+        H5RS_str_t *dst_name_r;      /* Ref-counted version of dest name */
+
+        /* Make certain that the destination name is a full (not relative) path */
+        if(*(udata->dst_name) != '/') {
+            HDassert(udata->dst_loc->path->full_path_r);
+
+            /* Create reference counted string for full dst path */
+            if((dst_name_r = H5G_build_fullpath_refstr_str(udata->dst_loc->path->full_path_r,
+                    udata->dst_name)) == NULL)
+                HGOTO_ERROR(H5E_SYM, H5E_PATH, FAIL, "can't build destination path name")
+        } /* end if */
+        else
+            dst_name_r = H5RS_wrap(udata->dst_name);
+        HDassert(dst_name_r);
+
+        /* Fix names up */
+        if(H5G_name_replace(lnk, H5G_NAME_MOVE, obj_loc->oloc->file, obj_loc->path->full_path_r,
+                udata->dst_loc->oloc->file, dst_name_r, udata->dxpl_id) < 0) {
+            H5RS_decr(dst_name_r);
+            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to replace name")
+        } /* end if */
+
+        /* Remove the old link */
+        if(H5G_obj_remove(grp_loc->oloc, grp_loc->path->full_path_r, orig_name, udata->dxpl_id) < 0) {
+            H5RS_decr(dst_name_r);
+            HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to remove old name")
+        } /* end if */
+
+        H5RS_decr(dst_name_r);
+    } /* end if */
+
+done:
+    /* Cleanup */
+    if(orig_name)
+        H5MM_xfree(orig_name);
+
+    /* If udata_out.lnk was copied, free any memory allocated
+     * In this special case, the H5L_move_dest_cb callback resets the name
+     * so H5O_msg_free shouldn't try to free it
+     */
+    if(link_copied)
+        H5O_msg_free(H5O_LINK_ID, udata_out.lnk);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_move_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_move
+ *
+ * Purpose:	Atomically move or copy a link.
+ *
+ *              Creates a copy of a link in a new destination with a new name.
+ *              SRC_LOC and SRC_NAME together define the link's original
+ *              location, while DST_LOC and DST_NAME together define its
+ *              final location.
+ *
+ *              If copy_flag is FALSE, the original link is removed
+ *              (effectively moving the link).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, May 1, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_move(H5G_loc_t *src_loc, const char *src_name, H5G_loc_t *dst_loc,
+    const char *dst_name, hbool_t copy_flag, hid_t lcpl_id, hid_t lapl_id,
+    hid_t dxpl_id)
+{
+    unsigned    dst_target_flags = H5G_TARGET_NORMAL;
+    H5T_cset_t char_encoding = H5F_DEFAULT_CSET; /* Character encoding for link */
+    H5P_genplist_t* lc_plist;           /* Link creation property list */
+    H5P_genplist_t* la_plist;           /* Link access property list */
+    H5L_trav_mv_t      udata;          /* User data for traversal */
+    hid_t               lapl_copy;      /* Copy of lapl for this function */
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(src_loc);
+    HDassert(dst_loc);
+    HDassert(src_name && *src_name);
+    HDassert(dst_name && *dst_name);
+
+    /* Check for flags present in creation property list */
+    if(lcpl_id != H5P_DEFAULT) {
+        unsigned crt_intmd_group;
+
+        if(NULL == (lc_plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+        /* Get intermediate group creation property */
+        if(H5P_get(lc_plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, &crt_intmd_group) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for creating missing groups")
+
+        /* Set target flags for source and destination */
+        if(crt_intmd_group > 0)
+            dst_target_flags |= H5G_CRT_INTMD_GROUP;
+
+        /* Get character encoding property */
+        if(H5P_get(lc_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &char_encoding) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for character encoding")
+    } /* end if */
+
+    /* Copy the link access property list because traversing UD links will
+     * decrease the NLINKS property. HDF5 should have NLINKS traversals to
+     * get to the source and NLINKS more to get to the destination. */
+    if(lapl_id == H5P_DEFAULT)
+        lapl_copy = lapl_id;
+    else {
+        if(NULL == (la_plist = (H5P_genplist_t *)H5I_object(lapl_id)))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid access PL")
+        if((lapl_copy = H5P_copy_plist(la_plist, FALSE)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy access properties")
+    } /* end else */
+
+    /* Set up user data */
+    udata.dst_loc = dst_loc;
+    udata.dst_name= dst_name;
+    udata.dst_target_flags = dst_target_flags;
+    udata.cset = char_encoding;
+    udata.copy = copy_flag;
+    udata.lapl_id = lapl_copy;
+    udata.dxpl_id = dxpl_id;
+
+    /* Do the move */
+    if(H5G_traverse(src_loc, src_name, H5G_TARGET_MOUNT | H5G_TARGET_SLINK | H5G_TARGET_UDLINK,
+            H5L_move_cb, &udata, lapl_id, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to find link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_move() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_exists_cb
+ *
+ * Purpose:	Callback for checking whether a link exists
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 16 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_exists_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t *lnk, H5G_loc_t H5_ATTR_UNUSED *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    hbool_t *udata = (hbool_t *)_udata;   /* User data passed in */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check if the name in this group resolved to a valid link */
+    *udata = (hbool_t)(lnk != NULL);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5L_exists_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_exists
+ *
+ * Purpose:	Returns whether a link exists in a group
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, March 16 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5L_exists(const H5G_loc_t *loc, const char *name, hid_t lapl_id, hid_t dxpl_id)
+{
+    hbool_t exists = FALSE;     /* Whether the link exists in the group */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(loc, name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_exists_cb, &exists, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "path doesn't exist")
+
+    /* Set return value */
+    ret_value = (htri_t)exists;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5L_exists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_info_cb
+ *
+ * Purpose:	Callback for retrieving a link's metadata
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, April 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_info_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t *lnk, H5G_loc_t H5_ATTR_UNUSED *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gi_t *udata = (H5L_trav_gi_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name in this group resolved to a valid link */
+    if(lnk == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
+
+    /* Get information from the link */
+    if(H5G_link_to_info(lnk, udata->linfo) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get link info")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_info_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_info
+ *
+ * Purpose:	Returns metadata about a link.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, April 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_get_info(const H5G_loc_t *loc, const char *name,
+    H5L_info_t *linfo/*out*/, hid_t lapl_id, hid_t dxpl_id)
+{
+    H5L_trav_gi_t udata;               /* User data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    udata.linfo = linfo;
+    udata.dxpl_id = dxpl_id;
+
+    /* Traverse the group hierarchy to locate the object to get info about */
+    if(H5G_traverse(loc, name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_info_cb, &udata, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5L_get_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_info_by_idx_cb
+ *
+ * Purpose:	Callback for retrieving a link's metadata according to an
+ *              index's order.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_info_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gibi_t *udata = (H5L_trav_gibi_t *)_udata;   /* User data passed in */
+    H5O_link_t fnd_lnk;                 /* Link within group */
+    hbool_t lnk_copied = FALSE;         /* Whether the link was copied */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name of the group resolved to a valid object */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Query link */
+    if(H5G_obj_lookup_by_idx(obj_loc->oloc, udata->idx_type, udata->order,
+                udata->n, &fnd_lnk, udata->dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "link not found")
+    lnk_copied = TRUE;
+
+    /* Get information from the link */
+    if(H5G_link_to_info(&fnd_lnk, udata->linfo) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get link info")
+
+done:
+    /* Reset the link information, if we have a copy */
+    if(lnk_copied)
+        H5O_msg_reset(H5O_LINK_ID, &fnd_lnk);
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_info_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_default_lcpl
+ *
+ * Purpose:	Accessor for the default Link Creation Property List
+ *
+ * Return:	Success:	ID of the deafult lcpl
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Tuesday, July 4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5L_get_default_lcpl(void)
+{
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    ret_value = H5P_LINK_CREATE_DEFAULT;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5L_get_default_lcpl */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_get_name_by_idx_cb
+ *
+ * Purpose:	Callback for retrieving a link's name according to an
+ *              index's order.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, November 11 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5L_get_name_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR_UNUSED *name,
+    const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
+    H5G_own_loc_t *own_loc/*out*/)
+{
+    H5L_trav_gnbi_t *udata = (H5L_trav_gnbi_t *)_udata;   /* User data passed in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check if the name of the group resolved to a valid object */
+    if(obj_loc == NULL)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group doesn't exist")
+
+    /* Query link */
+    if((udata->name_len = H5G_obj_get_name_by_idx(obj_loc->oloc, udata->idx_type, udata->order,
+                udata->n, udata->name, udata->size, udata->dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "link not found")
+
+done:
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_get_name_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_link_copy_file
+ *
+ * Purpose:     Copy a link and the object it points to from one file to
+ *              another.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 29 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_link_copy_file(H5F_t *dst_file, hid_t dxpl_id, const H5O_link_t *_src_lnk,
+    const H5O_loc_t *src_oloc, H5O_link_t *dst_lnk, H5O_copy_t *cpy_info)
+{
+    H5O_link_t tmp_src_lnk;             /* Temporary copy of src link, when needed */
+    const H5O_link_t *src_lnk = _src_lnk; /* Source link */
+    hbool_t dst_lnk_init = FALSE;       /* Whether the destination link is initialized */
+    hbool_t expanded_link_open = FALSE; /* Whether the target location has been opened */
+    H5G_loc_t tmp_src_loc;              /* Group location holding target object */
+    H5G_name_t tmp_src_path;            /* Path for target object */
+    H5O_loc_t tmp_src_oloc;             /* Object location for target object */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check arguments */
+    HDassert(dst_file);
+    HDassert(src_lnk);
+    HDassert(dst_lnk);
+    HDassert(cpy_info);
+
+    /* Expand soft or external link, if requested */
+    if((H5L_TYPE_SOFT == src_lnk->type && cpy_info->expand_soft_link)
+            || (H5L_TYPE_EXTERNAL == src_lnk->type
+            && cpy_info->expand_ext_link)) {
+        H5G_loc_t   lnk_grp_loc;    /* Group location holding link */
+        H5G_name_t  lnk_grp_path;   /* Path for link */
+        htri_t      tar_exists;     /* Whether the target object exists */
+
+        /* Set up group location for link */
+        H5G_name_reset(&lnk_grp_path);
+        lnk_grp_loc.path = &lnk_grp_path;
+        lnk_grp_loc.oloc = (H5O_loc_t *)src_oloc;    /* Casting away const OK -QAK */
+
+        /* Check if the target object exists */
+        if((tar_exists = H5G_loc_exists(&lnk_grp_loc, src_lnk->name, H5P_DEFAULT,
+                dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to check if target object exists")
+
+        if(tar_exists) {
+            /* Make a temporary copy of the link, so that it will not change the
+             * info in the cache when we change it to a hard link */
+            if(NULL == H5O_msg_copy(H5O_LINK_ID, src_lnk, &tmp_src_lnk))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy message")
+
+            /* Set up group location for target object.  Let H5G_traverse expand
+             * the link. */
+            tmp_src_loc.path = &tmp_src_path;
+            tmp_src_loc.oloc = &tmp_src_oloc;
+            if(H5G_loc_reset(&tmp_src_loc) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to reset location")
+
+            /* Find the target object */
+            if(H5G_loc_find(&lnk_grp_loc, src_lnk->name, &tmp_src_loc,
+                    H5P_DEFAULT, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to find target object")
+            expanded_link_open = TRUE;
+
+            /* Convert symbolic link to hard link */
+            if(tmp_src_lnk.type == H5L_TYPE_SOFT)
+                tmp_src_lnk.u.soft.name =
+                        (char *)H5MM_xfree(tmp_src_lnk.u.soft.name);
+            else if(tmp_src_lnk.u.ud.size > 0)
+                tmp_src_lnk.u.ud.udata = H5MM_xfree(tmp_src_lnk.u.ud.udata);
+            tmp_src_lnk.type = H5L_TYPE_HARD;
+            tmp_src_lnk.u.hard.addr = tmp_src_oloc.addr;
+            src_lnk = &tmp_src_lnk;
+        } /* end if */
+    } /* end if */
+
+    /* Copy src link information to dst link information */
+    if(NULL == H5O_msg_copy(H5O_LINK_ID, src_lnk, dst_lnk))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy message")
+    dst_lnk_init = TRUE;
+
+    /* Check if object in source group is a hard link & copy it */
+    if(H5L_TYPE_HARD == src_lnk->type) {
+        H5O_loc_t new_dst_oloc;     /* Copied object location in destination */
+
+        /* Set up copied object location to fill in */
+        H5O_loc_reset(&new_dst_oloc);
+        new_dst_oloc.file = dst_file;
+
+        if(!expanded_link_open) {
+            /* Build temporary object location for source */
+            H5O_loc_reset(&tmp_src_oloc);
+            tmp_src_oloc.file = src_oloc->file;
+            tmp_src_oloc.addr = src_lnk->u.hard.addr;
+        } /* end if */
+        HDassert(H5F_addr_defined(tmp_src_oloc.addr));
+
+        /* Copy the shared object from source to destination */
+        /* Don't care about obj_type or udata because those are only important
+         * for old style groups */
+        if(H5O_copy_header_map(&tmp_src_oloc, &new_dst_oloc, dxpl_id, cpy_info,
+                TRUE, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+        /* Copy new destination object's information for eventual insertion */
+        dst_lnk->u.hard.addr = new_dst_oloc.addr;
+    } /* end if */
+
+done:
+    /* Check if we used a temporary src link */
+    if(src_lnk != _src_lnk) {
+        HDassert(src_lnk == &tmp_src_lnk);
+        H5O_msg_reset(H5O_LINK_ID, &tmp_src_lnk);
+    } /* end if */
+    if(ret_value < 0)
+        if(dst_lnk_init)
+            H5O_msg_reset(H5O_LINK_ID, dst_lnk);
+    /* Check if we need to free the temp source oloc */
+    if(expanded_link_open)
+        if(H5G_loc_free(&tmp_src_loc) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_link_copy_file() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Lexternal.c b/gatb-core/thirdparty/hdf5/src/H5Lexternal.c
new file mode 100644
index 0000000..6269ae7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Lexternal.c
@@ -0,0 +1,711 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+#define H5L_PACKAGE		/*suppress error about including H5Lpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5L_init_extern_interface
+
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5Gpkg.h"             /* Groups                               */
+#include "H5Iprivate.h"		/* IDs					*/
+#include "H5Lpkg.h"             /* Links                                */
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Opublic.h"          /* File objects                         */
+#include "H5Pprivate.h"         /* Property lists                       */
+
+static hid_t H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
+    const void *udata, size_t H5_ATTR_UNUSED udata_size, hid_t lapl_id);
+static ssize_t H5L_extern_query(const char H5_ATTR_UNUSED * link_name, const void *udata,
+    size_t udata_size, void * buf /*out*/, size_t buf_size);
+
+/* Default External Link link class */
+const H5L_class_t H5L_EXTERN_LINK_CLASS[1] = {{
+    H5L_LINK_CLASS_T_VERS,      /* H5L_class_t version            */
+    H5L_TYPE_EXTERNAL,		/* Link type id number            */
+    "external",                 /* Link name for debugging        */
+    NULL,                       /* Creation callback              */
+    NULL,                       /* Move callback                  */
+    NULL,                       /* Copy callback                  */
+    H5L_extern_traverse,        /* The actual traversal function  */
+    NULL,                       /* Deletion callback              */
+    H5L_extern_query            /* Query callback                 */
+}};
+
+/* Version of external link format */
+#define H5L_EXT_VERSION         0
+
+/* Valid flags for external links */
+#define H5L_EXT_FLAGS_ALL       0
+
+/* Size of local link name buffer for traversing external links */
+#define H5L_EXT_TRAVERSE_BUF_SIZE       256
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5L_init_extern_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5L_init_extern_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5L_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5L_init_extern_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5L_init())
+} /* H5L_init_extern_interface() */
+
+

+
+/*--------------------------------------------------------------------------
+ * Function: H5L_getenv_prefix_name --
+ *
+ * Purpose:  Get the first pathname in the list of pathnames stored in ENV_PREFIX,
+ *           which is separated by the environment delimiter.
+ *           ENV_PREFIX is modified to point to the remaining pathnames
+ *           in the list.
+ *
+ * Return:   A pointer to a pathname
+ *
+ * Programmer:	Vailin Choi, April 2, 2008
+ *
+--------------------------------------------------------------------------*/
+static char *
+H5L_getenv_prefix_name(char **env_prefix/*in,out*/)
+{
+    char        *retptr=NULL;
+    char        *strret=NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    strret = HDstrchr(*env_prefix, H5_COLON_SEPC);
+    if (strret == NULL) {
+        retptr = *env_prefix;
+        *env_prefix = strret;
+    } else {
+        retptr = *env_prefix;
+        *env_prefix = strret + 1;
+        *strret = '\0';
+    }
+
+    FUNC_LEAVE_NOAPI(retptr)
+} /* end H5L_getenv_prefix_name() */
+
+

+/*--------------------------------------------------------------------------
+ * Function: H5L_build_name
+ *
+ * Purpose:  Prepend PREFIX to FILE_NAME and store in FULL_NAME
+ *
+ * Return:   Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi, April 2, 2008
+ *
+--------------------------------------------------------------------------*/
+static herr_t
+H5L_build_name(char *prefix, char *file_name, char **full_name/*out*/)
+{
+    size_t      prefix_len;             /* length of prefix */
+    size_t      fname_len;              /* Length of external link file name */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    prefix_len = HDstrlen(prefix);
+    fname_len = HDstrlen(file_name);
+
+    /* Allocate a buffer to hold the filename + prefix + possibly the delimiter + terminating null byte */
+    if(NULL == (*full_name = (char *)H5MM_malloc(prefix_len + fname_len + 2)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate filename buffer")
+
+    /* Compose the full file name */
+    HDsnprintf(*full_name, (prefix_len + fname_len + 2), "%s%s%s", prefix,
+        (H5_CHECK_DELIMITER(prefix[prefix_len - 1]) ? "" : H5_DIR_SEPS), file_name);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5L_build_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_extern_traverse
+ *
+ * Purpose:	Default traversal function for external links. This can
+ *              be overridden using H5Lregister().
+ *
+ *              Given a filename and path packed into the link udata,
+ *              attempts to open an object within an external file.
+ *              If the H5L_ELINK_PREFIX_NAME property is set in the
+ *              link access property list, appends that prefix to the
+ *              filename being opened.
+ *
+ * Return:	ID of the opened object on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ * Modifications:
+ *		Vailin Choi, April 2, 2008
+ *		Add handling to search for the target file
+ *		See description in RM: H5Lcreate_external
+ *
+ *		Vailin Choi; Sept. 12th, 2008; bug #1247
+ *		Retrieve the file access property list identifer that is set
+ *		for link access property via H5Pget_elink_fapl().
+ *		If the return value is H5P_DEFAULT, the parent's file access
+ *		property is used to H5F_open() the target file;
+ *		Otherwise, the file access property retrieved from H5Pget_elink_fapl()
+ *		is used to H5F_open() the target file.
+ *
+ *              Vailin Choi; Nov 2010
+ *              Free memory pointed to by tmp_env_prefix for HDF5_EXT_PREFIX case.
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
+    const void *_udata, size_t H5_ATTR_UNUSED udata_size, hid_t lapl_id)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char       *my_prefix;              /* Library's copy of the prefix */
+    H5G_loc_t   root_loc;               /* Location of root group in external file */
+    H5G_loc_t   loc;                    /* Location of object */
+    H5F_t	*ext_file = NULL;	/* File struct for external file */
+    const uint8_t *p = (const uint8_t *)_udata;  /* Pointer into external link buffer */
+    const char *file_name;              /* Name of file containing external link's object */
+    char *full_name = NULL;             /* File name with prefix */
+    const char  *obj_name;              /* Name external link's object */
+    size_t      fname_len;              /* Length of external link file name */
+    unsigned    intent;                 /* File access permissions */
+    H5L_elink_cb_t cb_info;             /* Callback info struct */
+    hid_t       fapl_id = -1;           /* File access property list for external link's file */
+    hid_t       ext_obj = -1;           /* ID for external link's object */
+    char        *parent_group_name = NULL;/* Temporary pointer to group name */
+    char        local_group_name[H5L_EXT_TRAVERSE_BUF_SIZE];  /* Local buffer to hold group name */
+    char        *temp_file_name = NULL; /* Temporary pointer to file name */
+    size_t      temp_file_name_len;     /* Length of temporary file name */
+    char        *actual_file_name = NULL; /* Parent file's actual name */
+    H5P_genplist_t  *fa_plist;          /* File access property list pointer */
+    H5F_close_degree_t 	fc_degree = H5F_CLOSE_WEAK;  /* File close degree for target file */
+    hid_t       ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(p);
+
+    /* Check external link version & flags */
+    if(((*p >> 4) & 0x0F) > H5L_EXT_VERSION)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad version number for external link")
+    if((*p & 0x0F) & ~H5L_EXT_FLAGS_ALL)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad flags for external link")
+    p++;
+
+    /* Gather some information from the external link's user data */
+    file_name = (const char *)p;
+    fname_len = HDstrlen(file_name);
+    obj_name = (const char *)p + fname_len + 1;
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the fapl_id set for lapl_id if any */
+    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &fapl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links")
+
+    /* Get the location for the group holding the external link */
+    if(H5G_loc(cur_group, &loc) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get object location")
+
+    /* get the access flags set for lapl_id if any */
+    if(H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, &intent) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get elink file access flags")
+
+    /* get the file access mode flags for the parent file, if they were not set
+     * on lapl_id */
+    if(intent == H5F_ACC_DEFAULT)
+        intent = H5F_INTENT(loc.oloc->file);
+
+    if((fapl_id == H5P_DEFAULT) && ((fapl_id = H5F_get_access_plist(loc.oloc->file, FALSE)) < 0))
+	HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get parent's file access property list")
+
+    /* Get callback_info */
+    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get elink callback info")
+
+    /* Get file access property list */
+    if(NULL == (fa_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Make callback if it exists */
+    if(cb_info.func) {
+        const char  *parent_file_name;  /* Parent file name */
+        ssize_t group_name_len;         /* Length of parent group name */
+
+        /* Get parent file name */
+        parent_file_name = H5F_OPEN_NAME(loc.oloc->file);
+
+        /* Query length of parent group name */
+        if((group_name_len = H5G_get_name(&loc, NULL, (size_t) 0, NULL, lapl_id, H5AC_ind_dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to retrieve length of group name")
+
+        /* Account for null terminator */
+        group_name_len++;
+
+        /* Check if we need to allocate larger buffer */
+        if((size_t)group_name_len > sizeof(local_group_name)) {
+            if(NULL == (parent_group_name = (char *)H5MM_malloc((size_t)group_name_len)))
+                HGOTO_ERROR(H5E_LINK, H5E_CANTALLOC, FAIL, "can't allocate buffer to hold group name, group_name_len = %Zu", group_name_len)
+        } /* end if */
+        else
+            parent_group_name = local_group_name;
+
+        /* Get parent group name */
+        if(H5G_get_name(&loc, parent_group_name, (size_t) group_name_len, NULL, lapl_id, H5AC_ind_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to retrieve group name")
+
+        /* Make callback */
+        if((cb_info.func)(parent_file_name, parent_group_name, file_name, obj_name, &intent, fapl_id, cb_info.user_data) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "traversal operator failed")
+
+        /* Check access flags */
+        if((intent & H5F_ACC_TRUNC) || (intent & H5F_ACC_EXCL))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
+    } /* end if */
+
+    /* Set file close degree for new file to "weak" */
+    if(H5P_set(fa_plist, H5F_ACS_CLOSE_DEGREE_NAME, &fc_degree) < 0)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
+
+    /*
+     * Start searching for the target file
+     */
+
+    /* Simplify intent flags for open calls */
+    intent = ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY);
+
+    /* Copy the file name to use */
+    if(NULL == (temp_file_name = H5MM_strdup(file_name)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    temp_file_name_len = HDstrlen(temp_file_name);
+
+    /* target file_name is an absolute pathname: see RM for detailed description */
+    if(H5_CHECK_ABSOLUTE(file_name) || H5_CHECK_ABS_PATH(file_name)) {
+        /* Try opening file */
+        if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, file_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id))) {
+            char *ptr;
+
+            H5E_clear_stack(NULL);
+
+            /* get last component of file_name */
+	    H5_GET_LAST_DELIMITER(file_name, ptr)
+	    HDassert(ptr);
+
+            /* Increment past delimiter */
+            ptr++;
+
+            /* Copy into the temp. file name */
+	    HDstrncpy(temp_file_name, ptr, temp_file_name_len);
+            temp_file_name[temp_file_name_len - 1] = '\0';
+        } /* end if */
+    } /* end if */
+    else if(H5_CHECK_ABS_DRIVE(file_name)) {
+        /* Try opening file */
+        if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, file_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id))) {
+
+            H5E_clear_stack(NULL);
+
+	    /* strip "<drive-letter>:" */
+	    HDstrncpy(temp_file_name, &file_name[2], temp_file_name_len);
+            temp_file_name[temp_file_name_len - 1] = '\0';
+	} /* end if */
+    } /* end if */
+
+    /* try searching from paths set in the environment variable */
+    if(ext_file == NULL) {
+        char *env_prefix;
+
+        if(NULL != (env_prefix = HDgetenv("HDF5_EXT_PREFIX"))) {
+            char *tmp_env_prefix, *saved_env;
+
+            if(NULL == (saved_env = tmp_env_prefix = H5MM_strdup(env_prefix)))
+                HGOTO_ERROR(H5E_LINK, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            while((tmp_env_prefix) && (*tmp_env_prefix)) {
+                char *out_prefix_name;
+
+                out_prefix_name = H5L_getenv_prefix_name(&tmp_env_prefix/*in,out*/);
+                if(out_prefix_name && (*out_prefix_name)) {
+                    if(H5L_build_name(out_prefix_name, temp_file_name, &full_name/*out*/) < 0) {
+			saved_env = (char *)H5MM_xfree(saved_env);
+                        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename")
+		    } /* end if */
+
+                    ext_file = H5F_efc_open(loc.oloc->file, full_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id);
+                    full_name = (char *)H5MM_xfree(full_name);
+                    if(ext_file != NULL)
+                        break;
+                    H5E_clear_stack(NULL);
+                } /* end if */
+            } /* end while */
+	    saved_env = (char *)H5MM_xfree(saved_env);
+        } /* end if */
+    } /* end if */
+
+    /* try searching from property list */
+    if(ext_file == NULL) {
+        if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external link prefix")
+        if(my_prefix) {
+            if(H5L_build_name(my_prefix, temp_file_name, &full_name/*out*/) < 0)
+                HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename")
+            if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, full_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)))
+                H5E_clear_stack(NULL);
+            full_name = (char *)H5MM_xfree(full_name);
+        } /* end if */
+    } /* end if */
+
+    /* try searching from main file's "extpath": see description in H5F_open() & H5_build_extpath() */
+    if(ext_file == NULL) {
+        char *extpath;
+
+        if(NULL != (extpath = H5F_EXTPATH(loc.oloc->file))) {
+            if(H5L_build_name(extpath, temp_file_name, &full_name/*out*/) < 0)
+                HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename")
+            if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, full_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)))
+                H5E_clear_stack(NULL);
+            full_name = (char *)H5MM_xfree(full_name);
+        } /* end if */
+    } /* end if */
+
+    /* try the relative file_name stored in temp_file_name */
+    if(ext_file == NULL) {
+        if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, temp_file_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)))
+            H5E_clear_stack(NULL);
+    } /* end if */
+
+    /* try the 'resolved' name for the parent file (i.e. the name after symlinks
+     * were resolved)
+     */
+    if(ext_file == NULL) {
+        char *ptr = NULL;
+
+        /* Copy resolved file name */
+        if(NULL == (actual_file_name = H5MM_strdup(H5F_ACTUAL_NAME(loc.oloc->file))))
+            HGOTO_ERROR(H5E_LINK, H5E_CANTALLOC, FAIL, "can't duplicate resolved file name string")
+
+        /* get last component of file_name */
+        H5_GET_LAST_DELIMITER(actual_file_name, ptr)
+        if(!ptr)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTOPENFILE, FAIL, "unable to open external file, external link file name = '%s', temp_file_name = '%s'", file_name, temp_file_name)
+
+        /* Truncate filename portion from actual file name path */
+        *ptr = '\0';
+
+        /* Build new file name for the external file */
+        if(H5L_build_name(actual_file_name, temp_file_name, &full_name/*out*/) < 0)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename")
+
+        /* Try opening with the resolved name */
+        if(NULL == (ext_file = H5F_efc_open(loc.oloc->file, full_name, intent, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)))
+            HGOTO_ERROR(H5E_LINK, H5E_CANTOPENFILE, FAIL, "unable to open external file, external link file name = '%s', temp_file_name = '%s'", file_name, temp_file_name)
+        full_name = (char *)H5MM_xfree(full_name);
+    } /* end if */
+
+
+    /* Retrieve the "group location" for the file's root group */
+    if(H5G_root_loc(ext_file, &root_loc) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unable to create location for file")
+
+    /* Open the object referenced in the external file */
+    if((ext_obj = H5O_open_name(&root_loc, obj_name, lapl_id, FALSE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+    /* Set return value */
+    ret_value = ext_obj;
+
+done:
+    /* Release resources */
+    if(fapl_id > 0 && H5I_dec_ref(fapl_id) < 0)
+        HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+    if(ext_file && H5F_efc_close(loc.oloc->file, ext_file) < 0)
+        HDONE_ERROR(H5E_LINK, H5E_CANTCLOSEFILE, FAIL, "problem closing external file")
+    if(parent_group_name && parent_group_name != local_group_name)
+        parent_group_name = (char *)H5MM_xfree(parent_group_name);
+    full_name = (char *)H5MM_xfree(full_name);
+    temp_file_name = (char *)H5MM_xfree(temp_file_name);
+    actual_file_name = (char *)H5MM_xfree(actual_file_name);
+
+    if(ret_value < 0) {
+        /* Close object if it's open and something failed */
+        if(ext_obj >= 0 && H5I_dec_ref(ext_obj) < 0)
+            HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom for external object")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_extern_traverse() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5L_extern_query
+ *
+ * Purpose:	Default query function for external links. This can
+ *              be overridden using H5Lregister().
+ *
+ *              Returns the size of the link's user data. If a buffer of
+ *              is provided, copies at most buf_size bytes of the udata
+ *              into it.
+ *
+ * Return:	Size of buffer on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, July 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5L_extern_query(const char H5_ATTR_UNUSED * link_name, const void *_udata, size_t udata_size,
+    void *buf /*out*/, size_t buf_size)
+{
+    const uint8_t *udata = (const uint8_t *)_udata;      /* Pointer to external link buffer */
+    ssize_t     ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check external link version & flags */
+    if(((*udata >> 4) & 0x0F) != H5L_EXT_VERSION)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad version number for external link")
+    if((*udata & 0x0F) & ~H5L_EXT_FLAGS_ALL)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad flags for external link")
+
+    /* If the buffer is NULL, skip writing anything in it and just return
+     * the size needed */
+    if(buf) {
+        if(udata_size < buf_size)
+            buf_size = udata_size;
+
+        /* Copy the udata verbatim up to buf_size */
+        HDmemcpy(buf, udata, buf_size);
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (ssize_t)udata_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_extern_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Lcreate_external
+ *
+ * Purpose:	Creates an external link from LINK_NAME to OBJ_NAME.
+ *
+ *              External links are links to objects in other HDF5 files.  They
+ *              are allowed to "dangle" like soft links internal to a file.
+ *              FILE_NAME is the name of the file that OBJ_NAME is is contained
+ *              within.  If OBJ_NAME is given as a relative path name, the
+ *              path will be relative to the root group of FILE_NAME.
+ *		LINK_NAME is interpreted relative to LINK_LOC_ID, which is
+ *              either a file ID or a group ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 18, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lcreate_external(const char *file_name, const char *obj_name,
+    hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id)
+{
+    H5G_loc_t	link_loc;               /* Group location to create link */
+    char       *norm_obj_name = NULL;	/* Pointer to normalized current name */
+    void       *ext_link_buf = NULL;    /* Buffer to contain external link */
+    size_t      buf_size;               /* Size of buffer to hold external link */
+    size_t      file_name_len;          /* Length of file name string */
+    size_t      norm_obj_name_len;      /* Length of normalized object name string */
+    uint8_t    *p;                      /* Pointer into external link buffer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "*s*si*sii", file_name, obj_name, link_loc_id, link_name,
+             lcpl_id, lapl_id);
+
+    /* Check arguments */
+    if(!file_name || !*file_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no file name specified")
+    if(!obj_name || !*obj_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name specified")
+    if(H5G_loc(link_loc_id, &link_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!link_name || !*link_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no link name specified")
+
+    /* Get normalized copy of the link target */
+    if(NULL == (norm_obj_name = H5G_normalize(obj_name)))
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "can't normalize object name")
+
+    /* Combine the filename and link name into a single buffer to give to the UD link */
+    file_name_len = HDstrlen(file_name) + 1;
+    norm_obj_name_len = HDstrlen(norm_obj_name) + 1;
+    buf_size = 1 + file_name_len + norm_obj_name_len;
+    if(NULL == (ext_link_buf = H5MM_malloc(buf_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate udata buffer")
+
+    /* Encode the external link information */
+    p = (uint8_t *)ext_link_buf;
+    *p++ = (H5L_EXT_VERSION << 4) | H5L_EXT_FLAGS_ALL;  /* External link version & flags */
+    HDstrncpy((char *)p, file_name, buf_size - 1);      /* Name of file containing external link's object */
+    p += file_name_len;
+    HDstrncpy((char *)p, norm_obj_name, buf_size - (file_name_len + 1));       /* External link's object */
+
+    /* Create an external link */
+    if(H5L_create_ud(&link_loc, link_name, ext_link_buf, buf_size, H5L_TYPE_EXTERNAL, lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    H5MM_xfree(ext_link_buf);
+    H5MM_xfree(norm_obj_name);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lcreate_external() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5L_register_external
+ *
+ * Purpose: Registers default "External Link" link class.
+ *              Use during library initialization or to restore the default
+ *              after users change it.
+ *
+ * Return: Non-negative on success/ negative on failure
+ *
+ * Programmer:  James Laird
+ *              Monday, July 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5L_register_external(void)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5L_register(H5L_EXTERN_LINK_CLASS) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to register external link class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5L_register_external() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Lunpack_elink_val
+ *
+ * Purpose: Given a buffer holding the "link value" from an external link,
+ *              gets pointers to the information within the link value buffer.
+ *
+ *              External link link values contain some flags and
+ *              two NULL-terminated strings, one after the other.
+ *
+ *              The FLAGS value will be filled in and FILENAME and
+ *              OBJ_PATH will be set to pointers within ext_linkval (unless
+ *              any of these values is NULL).
+ *
+ *              Using this function on strings that aren't external link
+ *              udata buffers can result in segmentation faults.
+ *
+ * Return: Non-negative on success/ Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Monday, July 17, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Lunpack_elink_val(const void *_ext_linkval, size_t link_size,
+    unsigned *flags, const char **filename, const char **obj_path)
+{
+    const uint8_t *ext_linkval = (const uint8_t *)_ext_linkval; /* Pointer to the link value */
+    unsigned    lnk_version;            /* External link format version */
+    unsigned    lnk_flags;              /* External link flags */
+    size_t      len;                    /* Length of the filename in the linkval*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*xz*Iu**s**s", _ext_linkval, link_size, flags, filename,
+             obj_path);
+
+    /* Sanity check external link buffer */
+    if(ext_linkval == NULL )
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not an external link linkval buffer")
+    lnk_version = (*ext_linkval >> 4) & 0x0F;
+    lnk_flags = *ext_linkval & 0x0F;
+    if(lnk_version > H5L_EXT_VERSION)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad version number for external link")
+    if(lnk_flags & (unsigned)~H5L_EXT_FLAGS_ALL)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTDECODE, FAIL, "bad flags for external link")
+    if(link_size <= 2)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid external link buffer")
+
+    /* Try to do some error checking.  If the last character in the linkval
+     * (the last character of obj_path) isn't NULL, then something's wrong.
+     */
+    if(ext_linkval[link_size - 1] != '\0')
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "linkval buffer is not NULL-terminated")
+
+    /* We're now guaranteed that HDstrlen won't segfault, since the buffer has
+     * at least one NULL in it.
+     */
+    len = HDstrlen((const char *)ext_linkval + 1);
+
+    /* If the first NULL we found was at the very end of the buffer, then
+     * this external link value has no object name and is invalid.
+     */
+    if((len + 1) >= (link_size - 1))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "linkval buffer doesn't contain an object path")
+
+    /* If we got here then the buffer contains (at least) two strings packed
+     * in the correct way.  Assume it's correct and return pointers to the
+     * filename and object path.
+     */
+    if(filename)
+        *filename = (const char *)ext_linkval + 1;
+    if(obj_path)
+        *obj_path = ((const char *)ext_linkval + 1) + len + 1;  /* Add one for NULL terminator */
+
+    /* Set the flags to return */
+    if(flags)
+        *flags = lnk_flags;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Lunpack_elink_val() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Lpkg.h b/gatb-core/thirdparty/hdf5/src/H5Lpkg.h
new file mode 100644
index 0000000..2e931f5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Lpkg.h
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: James Laird <matzke at llnl.gov>
+ *             Friday, December 1, 2005
+ *
+ * Purpose:     This file contains declarations which are visible
+ *              only within the H5L package. Source files outside the
+ *              H5L package should include H5Lprivate.h instead.
+ */
+#ifndef H5L_PACKAGE
+#error "Do not include this file outside the H5L package!"
+#endif
+
+#ifndef _H5Lpkg_H
+#define _H5Lpkg_H
+
+/* Get package's private header */
+#include "H5Lprivate.h"
+
+/* Other private headers needed by this file */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+H5_DLL herr_t H5L_create_ud(const H5G_loc_t *link_loc, const char *link_name,
+    const void * ud_data, size_t ud_data_size, H5L_type_t type,
+    hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_link_copy_file(H5F_t *dst_file, hid_t dxpl_id,
+    const H5O_link_t *_src_lnk, const H5O_loc_t *src_oloc, H5O_link_t *dst_lnk,
+    H5O_copy_t *cpy_info);
+
+#endif /* _H5Lpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Lprivate.h b/gatb-core/thirdparty/hdf5/src/H5Lprivate.h
new file mode 100644
index 0000000..f3079bc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Lprivate.h
@@ -0,0 +1,98 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5L module
+ * for dealing with links in an HDF5 file.
+ */
+#ifndef _H5Lprivate_H
+#define _H5Lprivate_H
+
+/* Include package's public header */
+#include "H5Lpublic.h"
+
+/* Private headers needed by this file */
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Oprivate.h"		/* Object headers			*/
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Default number of soft links to traverse */
+#define H5L_NUM_LINKS   16
+
+/* ========  Link creation property names ======== */
+#define H5L_CRT_INTERMEDIATE_GROUP_NAME         "intermediate_group" /* Create intermediate groups flag */
+
+/* ========  Link access property names ======== */
+#define H5L_ACS_NLINKS_NAME        "max soft links"         /* Number of soft links to traverse */
+#define H5L_ACS_ELINK_PREFIX_NAME  "external link prefix"   /* External link prefix */
+#define H5L_ACS_ELINK_FAPL_NAME    "external link fapl"     /* file access property list for external link access */
+#define H5L_ACS_ELINK_FLAGS_NAME   "external link flags"    /* file access flags for external link traversal */
+#define H5L_ACS_ELINK_CB_NAME      "external link callback" /*  callback function for external link traversal */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Structure for external link traversal callback property */
+typedef struct H5L_elink_cb_t {
+    H5L_elink_traverse_t      func;
+    void                      *user_data;
+} H5L_elink_cb_t;
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Library Private Prototypes */
+/******************************/
+
+/* General operations on links */
+H5_DLL herr_t H5L_init(void);
+H5_DLL herr_t H5L_link(const H5G_loc_t *new_loc, const char *new_name,
+    H5G_loc_t *obj_loc, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_link_object(const H5G_loc_t *new_loc, const char *new_name,
+    H5O_obj_create_t *ocrt_info, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name,
+    const H5G_loc_t *link_loc, const char *link_name, hid_t lcpl_id,
+    hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_create_soft(const char *target_path, const H5G_loc_t *cur_loc,
+    const char *cur_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL hid_t H5L_get_default_lcpl(void);
+H5_DLL herr_t H5L_move(H5G_loc_t *src_loc, const char *src_name,
+    H5G_loc_t *dst_loc, const char *dst_name, hbool_t copy_flag,
+    hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_get_info(const H5G_loc_t *loc, const char *name,
+    H5L_info_t *linkbuf/*out*/, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_delete(H5G_loc_t *loc, const char *name, hid_t lapl_id,
+    hid_t dxpl_id);
+H5_DLL herr_t H5L_get_val(H5G_loc_t *loc, const char *name, void *buf/*out*/,
+    size_t size, hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5L_register_external(void);
+
+/* User-defined link functions */
+H5_DLL herr_t H5L_register(const H5L_class_t *cls);
+H5_DLL herr_t H5L_unregister(H5L_type_t id);
+H5_DLL const H5L_class_t *H5L_find_class(H5L_type_t id);
+
+#endif /* _H5Lprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Lpublic.h b/gatb-core/thirdparty/hdf5/src/H5Lpublic.h
new file mode 100644
index 0000000..ff2322f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Lpublic.h
@@ -0,0 +1,202 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Lpublic.h
+ *                      Dec 1 2005
+ *                      James Laird
+ *
+ * Purpose:             Public declarations for the H5L package (links)
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Lpublic_H
+#define _H5Lpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"		/* Generic Functions			*/
+#include "H5Ipublic.h"		/* IDs			  		*/
+#include "H5Tpublic.h"		/* Datatypes				*/
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/* Maximum length of a link's name */
+/* (encoded in a 32-bit unsigned integer) */
+#define H5L_MAX_LINK_NAME_LEN   ((uint32_t)(-1))  /* (4GB - 1) */
+
+/* Macro to indicate operation occurs on same location */
+#define H5L_SAME_LOC (hid_t)0
+
+/* Current version of the H5L_class_t struct */
+#define H5L_LINK_CLASS_T_VERS 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/* Link class types.
+ * Values less than 64 are reserved for the HDF5 library's internal use.
+ * Values 64 to 255 are for "user-defined" link class types; these types are
+ * defined by HDF5 but their behavior can be overridden by users.
+ * Users who want to create new classes of links should contact the HDF5
+ * development team at hdfhelp at ncsa.uiuc.edu .
+ * These values can never change because they appear in HDF5 files.
+ */
+typedef enum {
+    H5L_TYPE_ERROR = (-1),      /* Invalid link type id         */
+    H5L_TYPE_HARD = 0,          /* Hard link id                 */
+    H5L_TYPE_SOFT = 1,          /* Soft link id                 */
+    H5L_TYPE_EXTERNAL = 64,     /* External link id             */
+    H5L_TYPE_MAX = 255	        /* Maximum link type id         */
+} H5L_type_t;
+#define H5L_TYPE_BUILTIN_MAX H5L_TYPE_SOFT      /* Maximum value link value for "built-in" link types */
+#define H5L_TYPE_UD_MIN      H5L_TYPE_EXTERNAL  /* Link ids at or above this value are "user-defined" link types. */
+
+/* Information struct for link (for H5Lget_info/H5Lget_info_by_idx) */
+typedef struct {
+    H5L_type_t          type;           /* Type of link                   */
+    hbool_t             corder_valid;   /* Indicate if creation order is valid */
+    int64_t             corder;         /* Creation order                 */
+    H5T_cset_t          cset;           /* Character set of link name     */
+    union {
+        haddr_t         address;        /* Address hard link points to    */
+        size_t          val_size;       /* Size of a soft link or UD link value */
+    } u;
+} H5L_info_t;
+
+/* The H5L_class_t struct can be used to override the behavior of a
+ * "user-defined" link class. Users should populate the struct with callback
+ * functions defined below.
+ */
+/* Callback prototypes for user-defined links */
+/* Link creation callback */
+typedef herr_t (*H5L_create_func_t)(const char *link_name, hid_t loc_group,
+    const void *lnkdata, size_t lnkdata_size, hid_t lcpl_id);
+
+/* Callback for when the link is moved */
+typedef herr_t (*H5L_move_func_t)(const char *new_name, hid_t new_loc,
+    const void *lnkdata, size_t lnkdata_size);
+
+/* Callback for when the link is copied */
+typedef herr_t (*H5L_copy_func_t)(const char *new_name, hid_t new_loc,
+    const void *lnkdata, size_t lnkdata_size);
+
+/* Callback during link traversal */
+typedef hid_t (*H5L_traverse_func_t)(const char *link_name, hid_t cur_group,
+    const void *lnkdata, size_t lnkdata_size, hid_t lapl_id);
+
+/* Callback for when the link is deleted */
+typedef herr_t (*H5L_delete_func_t)(const char *link_name, hid_t file,
+    const void *lnkdata, size_t lnkdata_size);
+
+/* Callback for querying the link */
+/* Returns the size of the buffer needed */
+typedef ssize_t (*H5L_query_func_t)(const char *link_name, const void *lnkdata,
+    size_t lnkdata_size, void *buf /*out*/, size_t buf_size);
+
+/* User-defined link types */
+typedef struct {
+    int version;                    /* Version number of this struct        */
+    H5L_type_t id;                  /* Link type ID                         */
+    const char *comment;            /* Comment for debugging                */
+    H5L_create_func_t create_func;  /* Callback during link creation        */
+    H5L_move_func_t move_func;      /* Callback after moving link           */
+    H5L_copy_func_t copy_func;      /* Callback after copying link          */
+    H5L_traverse_func_t trav_func;  /* Callback during link traversal       */
+    H5L_delete_func_t del_func;     /* Callback for link deletion           */
+    H5L_query_func_t query_func;    /* Callback for queries                 */
+} H5L_class_t;
+
+/* Prototype for H5Literate/H5Literate_by_name() operator */
+typedef herr_t (*H5L_iterate_t)(hid_t group, const char *name, const H5L_info_t *info,
+    void *op_data);
+
+/* Callback for external link traversal */
+typedef herr_t (*H5L_elink_traverse_t)(const char *parent_file_name,
+    const char *parent_group_name, const char *child_file_name,
+    const char *child_object_name, unsigned *acc_flags, hid_t fapl_id,
+    void *op_data);
+
+
+/********************/
+/* Public Variables */
+/********************/
+
+
+/*********************/
+/* Public Prototypes */
+/*********************/
+H5_DLL herr_t H5Lmove(hid_t src_loc, const char *src_name, hid_t dst_loc,
+    const char *dst_name, hid_t lcpl_id, hid_t lapl_id);
+H5_DLL herr_t H5Lcopy(hid_t src_loc, const char *src_name, hid_t dst_loc,
+    const char *dst_name, hid_t lcpl_id, hid_t lapl_id);
+H5_DLL herr_t H5Lcreate_hard(hid_t cur_loc, const char *cur_name,
+    hid_t dst_loc, const char *dst_name, hid_t lcpl_id, hid_t lapl_id);
+H5_DLL herr_t H5Lcreate_soft(const char *link_target, hid_t link_loc_id,
+    const char *link_name, hid_t lcpl_id, hid_t lapl_id);
+H5_DLL herr_t H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id);
+H5_DLL herr_t H5Ldelete_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id);
+H5_DLL herr_t H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/,
+    size_t size, hid_t lapl_id);
+H5_DLL herr_t H5Lget_val_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    void *buf/*out*/, size_t size, hid_t lapl_id);
+H5_DLL htri_t H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id);
+H5_DLL herr_t H5Lget_info(hid_t loc_id, const char *name,
+    H5L_info_t *linfo /*out*/, hid_t lapl_id);
+H5_DLL herr_t H5Lget_info_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    H5L_info_t *linfo /*out*/, hid_t lapl_id);
+H5_DLL ssize_t H5Lget_name_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
+    char *name /*out*/, size_t size, hid_t lapl_id);
+H5_DLL herr_t H5Literate(hid_t grp_id, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t *idx, H5L_iterate_t op, void *op_data);
+H5_DLL herr_t H5Literate_by_name(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx,
+    H5L_iterate_t op, void *op_data, hid_t lapl_id);
+H5_DLL herr_t H5Lvisit(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order,
+    H5L_iterate_t op, void *op_data);
+H5_DLL herr_t H5Lvisit_by_name(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, H5L_iterate_t op,
+    void *op_data, hid_t lapl_id);
+
+/* UD link functions */
+H5_DLL herr_t H5Lcreate_ud(hid_t link_loc_id, const char *link_name,
+    H5L_type_t link_type, const void *udata, size_t udata_size, hid_t lcpl_id,
+    hid_t lapl_id);
+H5_DLL herr_t H5Lregister(const H5L_class_t *cls);
+H5_DLL herr_t H5Lunregister(H5L_type_t id);
+H5_DLL htri_t H5Lis_registered(H5L_type_t id);
+
+/* External link functions */
+H5_DLL herr_t H5Lunpack_elink_val(const void *ext_linkval/*in*/, size_t link_size,
+   unsigned *flags, const char **filename/*out*/, const char **obj_path /*out*/);
+H5_DLL herr_t H5Lcreate_external(const char *file_name, const char *obj_name,
+    hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Lpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MF.c b/gatb-core/thirdparty/hdf5/src/H5MF.c
new file mode 100644
index 0000000..82a87f1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MF.c
@@ -0,0 +1,1168 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5MF.c
+ *                      Jul 11 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             File memory management functions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFpkg.h"		/* File memory management		*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5MF_FSPACE_SHRINK      80              /* Percent of "normal" size to shrink serialized free space size */
+#define H5MF_FSPACE_EXPAND      120             /* Percent of "normal" size to expand serialized free space size */
+
+/* Map an allocation request type to a free list */
+#define H5MF_ALLOC_TO_FS_TYPE(F, T)      ((H5FD_MEM_DEFAULT == (F)->shared->fs_type_map[T]) \
+    ? (T) : (F)->shared->fs_type_map[T])
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Enum for kind of free space section+aggregator merging allowed for a file */
+typedef enum {
+    H5MF_AGGR_MERGE_SEPARATE,           /* Everything in separate free list */
+    H5MF_AGGR_MERGE_DICHOTOMY,          /* Metadata in one free list and raw data in another */
+    H5MF_AGGR_MERGE_TOGETHER            /* Metadata & raw data in one free list */
+} H5MF_aggr_merge_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Allocator routines */
+static herr_t H5MF_alloc_create(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
+static herr_t H5MF_alloc_close(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_init_merge_flags
+ *
+ * Purpose:     Initialize the free space section+aggregator merge flags
+ *              for the file.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, February  1, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_init_merge_flags(H5F_t *f)
+{
+    H5MF_aggr_merge_t mapping_type;     /* Type of free list mapping */
+    H5FD_mem_t type;                    /* Memory type for iteration */
+    hbool_t all_same;                   /* Whether all the types map to the same value */
+    herr_t ret_value = SUCCEED;        	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* Iterate over all the free space types to determine if sections of that type
+     *  can merge with the metadata or small 'raw' data aggregator
+     */
+    all_same = TRUE;
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+        /* Check for any different type mappings */
+        if(f->shared->fs_type_map[type] != f->shared->fs_type_map[H5FD_MEM_DEFAULT]) {
+            all_same = FALSE;
+            break;
+        } /* end if */
+
+    /* Check for all allocation types mapping to the same free list type */
+    if(all_same) {
+        if(f->shared->fs_type_map[H5FD_MEM_DEFAULT] == H5FD_MEM_DEFAULT)
+            mapping_type = H5MF_AGGR_MERGE_SEPARATE;
+        else
+            mapping_type = H5MF_AGGR_MERGE_TOGETHER;
+    } /* end if */
+    else {
+        /* Check for raw data mapping into same list as metadata */
+        if(f->shared->fs_type_map[H5FD_MEM_DRAW] == f->shared->fs_type_map[H5FD_MEM_SUPER])
+            mapping_type = H5MF_AGGR_MERGE_SEPARATE;
+        else {
+            hbool_t all_metadata_same;              /* Whether all metadata go in same free list */
+
+            /* One or more allocation type don't map to the same free list type */
+            /* Check if all the metadata allocation types map to the same type */
+            all_metadata_same = TRUE;
+            for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+                /* Skip checking raw data free list mapping */
+                /* (global heap is treated as raw data) */
+                if(type != H5FD_MEM_DRAW && type != H5FD_MEM_GHEAP) {
+                    /* Check for any different type mappings */
+                    if(f->shared->fs_type_map[type] != f->shared->fs_type_map[H5FD_MEM_SUPER]) {
+                        all_metadata_same = FALSE;
+                        break;
+                    } /* end if */
+                } /* end if */
+
+            /* Check for all metadata on same free list */
+            if(all_metadata_same)
+                mapping_type = H5MF_AGGR_MERGE_DICHOTOMY;
+            else
+                mapping_type = H5MF_AGGR_MERGE_SEPARATE;
+        } /* end else */
+    } /* end else */
+
+    /* Based on mapping type, initialize merging flags for each free list type */
+    switch(mapping_type) {
+        case H5MF_AGGR_MERGE_SEPARATE:
+            /* Don't merge any metadata together */
+            HDmemset(f->shared->fs_aggr_merge, 0, sizeof(f->shared->fs_aggr_merge));
+
+            /* Check if merging raw data should be allowed */
+            /* (treat global heaps as raw data) */
+            if(H5FD_MEM_DRAW == f->shared->fs_type_map[H5FD_MEM_DRAW] ||
+                    H5FD_MEM_DEFAULT == f->shared->fs_type_map[H5FD_MEM_DRAW]) {
+                f->shared->fs_aggr_merge[H5FD_MEM_DRAW] = H5F_FS_MERGE_RAWDATA;
+                f->shared->fs_aggr_merge[H5FD_MEM_GHEAP] = H5F_FS_MERGE_RAWDATA;
+	    } /* end if */
+            break;
+
+        case H5MF_AGGR_MERGE_DICHOTOMY:
+            /* Merge all metadata together (but not raw data) */
+            HDmemset(f->shared->fs_aggr_merge, H5F_FS_MERGE_METADATA, sizeof(f->shared->fs_aggr_merge));
+
+            /* Allow merging raw data allocations together */
+            /* (treat global heaps as raw data) */
+            f->shared->fs_aggr_merge[H5FD_MEM_DRAW] = H5F_FS_MERGE_RAWDATA;
+            f->shared->fs_aggr_merge[H5FD_MEM_GHEAP] = H5F_FS_MERGE_RAWDATA;
+            break;
+
+        case H5MF_AGGR_MERGE_TOGETHER:
+            /* Merge all allocation types together */
+            HDmemset(f->shared->fs_aggr_merge, (H5F_FS_MERGE_METADATA | H5F_FS_MERGE_RAWDATA), sizeof(f->shared->fs_aggr_merge));
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_RESOURCE, H5E_BADVALUE, FAIL, "invalid mapping type")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_init_merge_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_alloc_open
+ *
+ * Purpose:	Open an existing free space manager of TYPE for file by
+ *		creating a free-space structure
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  8 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+{
+    const H5FS_section_class_t *classes[] = { /* Free space section classes implemented for file */
+        H5MF_FSPACE_SECT_CLS_SIMPLE};
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(type != H5FD_MEM_NOLIST);
+    HDassert(H5F_addr_defined(f->shared->fs_addr[type]));
+    HDassert(f->shared->fs_state[type] == H5F_FS_STATE_CLOSED);
+
+    /* Open an existing free space structure for the file */
+    if(NULL == (f->shared->fs_man[type] = H5FS_open(f, dxpl_id, f->shared->fs_addr[type],
+	    NELMTS(classes), classes, f, f->shared->alignment, f->shared->threshold)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
+
+    /* Set the state for the free space manager to "open", if it is now */
+    if(f->shared->fs_man[type])
+        f->shared->fs_state[type] = H5F_FS_STATE_OPEN;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_alloc_create
+ *
+ * Purpose:	Create free space manager of TYPE for the file by creating
+ *		a free-space structure
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  8 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_alloc_create(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+{
+    const H5FS_section_class_t *classes[] = { /* Free space section classes implemented for file */
+        H5MF_FSPACE_SECT_CLS_SIMPLE};
+    herr_t ret_value = SUCCEED;         /* Return value */
+    H5FS_create_t fs_create; 		/* Free space creation parameters */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(type != H5FD_MEM_NOLIST);
+    HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
+    HDassert(f->shared->fs_state[type] == H5F_FS_STATE_CLOSED);
+
+    /* Set the free space creation parameters */
+    fs_create.client = H5FS_CLIENT_FILE_ID;
+    fs_create.shrink_percent = H5MF_FSPACE_SHRINK;
+    fs_create.expand_percent = H5MF_FSPACE_EXPAND;
+    fs_create.max_sect_addr = 1 + H5VM_log2_gen((uint64_t)f->shared->maxaddr);
+    fs_create.max_sect_size = f->shared->maxaddr;
+
+    if(NULL == (f->shared->fs_man[type] = H5FS_create(f, dxpl_id, NULL,
+	    &fs_create, NELMTS(classes), classes, f, f->shared->alignment, f->shared->threshold)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
+
+
+    /* Set the state for the free space manager to "open", if it is now */
+    if(f->shared->fs_man[type])
+        f->shared->fs_state[type] = H5F_FS_STATE_OPEN;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_alloc_start
+ *
+ * Purpose:	Open or create a free space manager of a given type
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  8 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_alloc_start(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(type != H5FD_MEM_NOLIST);
+
+    /* Check if the free space manager exists already */
+    if(H5F_addr_defined(f->shared->fs_addr[type])) {
+        /* Open existing free space manager */
+        if(H5MF_alloc_open(f, dxpl_id, type) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTOPENOBJ, FAIL, "can't initialize file free space")
+    } /* end if */
+    else {
+        /* Create new free space manager */
+        if(H5MF_alloc_create(f, dxpl_id, type) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCREATE, FAIL, "can't initialize file free space")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc_start() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_alloc_close
+ *
+ * Purpose:     Close an existing free space manager of TYPE for file
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer: Vailin Choi; July 1st, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_alloc_close(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(type != H5FD_MEM_NOLIST);
+    HDassert(f->shared->fs_man[type]);
+    HDassert(f->shared->fs_state[type] != H5F_FS_STATE_CLOSED);
+
+    /* Close an existing free space structure for the file */
+    if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release free space info")
+    f->shared->fs_man[type] = NULL;
+    f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_alloc
+ *
+ * Purpose:     Allocate SIZE bytes of file memory and return the relative
+ *		address where that contiguous chunk of file memory exists.
+ *		The TYPE argument describes the purpose for which the storage
+ *		is being requested.
+ *
+ * Return:      Success:        The file address of new chunk.
+ *              Failure:        HADDR_UNDEF
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 11 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5MF_alloc(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size)
+{
+    H5FD_mem_t  fs_type;                /* Free space type (mapped from allocation type) */
+    haddr_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_type, size);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(size > 0);
+
+    /* Get free space type from allocation type */
+    fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
+
+    /* Check if we are using the free space manager for this file */
+    if(H5F_HAVE_FREE_SPACE_MANAGER(f)) {
+        /* Check if the free space manager for the file has been initialized */
+        if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type]))
+            if(H5MF_alloc_open(f, dxpl_id, fs_type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTOPENOBJ, HADDR_UNDEF, "can't initialize file free space")
+
+        /* Search for large enough space in the free space manager */
+        if(f->shared->fs_man[fs_type]) {
+            H5MF_free_section_t *node;      /* Free space section pointer */
+            htri_t node_found = FALSE;      /* Whether an existing free list node was found */
+
+            /* Try to get a section from the free space manager */
+            if((node_found = H5FS_sect_find(f, dxpl_id, f->shared->fs_man[fs_type], size, (H5FS_section_info_t **)&node)) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "error locating free space in file")
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 1.5, node_found = %t\n", FUNC, node_found);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+            /* Check for actually finding section */
+            if(node_found) {
+                /* Sanity check */
+                HDassert(node);
+
+                /* Retrieve return value */
+                ret_value = node->sect_info.addr;
+
+                /* Check for eliminating the section */
+                if(node->sect_info.size == size) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 1.6, freeing node\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+                    /* Free section node */
+                    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, HADDR_UNDEF, "can't free simple section node")
+                } /* end if */
+                else {
+                    H5MF_sect_ud_t udata;               /* User data for callback */
+
+                    /* Adjust information for section */
+                    node->sect_info.addr += size;
+                    node->sect_info.size -= size;
+
+                    /* Construct user data for callbacks */
+                    udata.f = f;
+                    udata.dxpl_id = dxpl_id;
+                    udata.alloc_type = alloc_type;
+                    udata.allow_sect_absorb = TRUE;
+		    udata.allow_eoa_shrink_only = FALSE; 
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 1.7, re-adding node, node->sect_info.size = %Hu\n", FUNC, node->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+                    /* Re-insert section node into file's free space */
+                    if(H5FS_sect_add(f, dxpl_id, f->shared->fs_man[fs_type], (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, HADDR_UNDEF, "can't re-add section to file free space")
+                } /* end else */
+
+                /* Leave now */
+                HGOTO_DONE(ret_value)
+            } /* end if */
+        } /* end if */
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 2.0\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+    } /* end if */
+
+    /* Allocate from the metadata aggregator (or the VFD) */
+    if(HADDR_UNDEF == (ret_value = H5MF_aggr_vfd_alloc(f, alloc_type, dxpl_id, size)))
+	HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed from aggr/vfd")
+
+done:
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value, size);
+#endif /* H5MF_ALLOC_DEBUG */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_alloc_tmp
+ *
+ * Purpose:     Allocate temporary space in the file
+ *
+ * Note:	The address returned is non-overlapping with any other address
+ *		in the file and suitable for insertion into the metadata
+ *		cache.
+ *
+ *		The address is _not_ suitable for actual file I/O and will
+ *		cause an error if it is so used.
+ *
+ *		The space allocated with this routine should _not_ be freed,
+ *		it should just be abandoned.  Calling H5MF_xfree() with space
+ *              from this routine will cause an error.
+ *
+ * Return:      Success:        Temporary file address
+ *              Failure:        HADDR_UNDEF
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, June  4, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5MF_alloc_tmp(H5F_t *f, hsize_t size)
+{
+    haddr_t eoa;                /* End of allocated space in the file */
+    haddr_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: size = %Hu\n", FUNC, size);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(size > 0);
+
+    /* Retrieve the 'eoa' for the file */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "driver get_eoa request failed")
+
+    /* Compute value to return */
+    ret_value = f->shared->tmp_addr - size;
+
+    /* Check for overlap into the actual allocated space in the file */
+    if(H5F_addr_le(ret_value, eoa))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "driver get_eoa request failed")
+
+    /* Adjust temporary address allocator in the file */
+    f->shared->tmp_addr = ret_value;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_alloc_tmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_xfree
+ *
+ * Purpose:     Frees part of a file, making that part of the file
+ *              available for reuse.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 17 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_xfree(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
+    hsize_t size)
+{
+    H5F_io_info_t fio_info;             /* I/O info for operation */
+    H5MF_free_section_t *node = NULL;   /* Free space section pointer */
+    H5MF_sect_ud_t udata;               /* User data for callback */
+    H5FD_mem_t fs_type;                 /* Free space type (mapped from allocation type) */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)alloc_type, addr, size);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check arguments */
+    HDassert(f);
+    if(!H5F_addr_defined(addr) || 0 == size)
+        HGOTO_DONE(SUCCEED);
+    HDassert(addr != 0);        /* Can't deallocate the superblock :-) */
+
+    /* Check for attempting to free space that's a 'temporary' file address */
+    if(H5F_addr_le(f->shared->tmp_addr, addr))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, FAIL, "attempting to free temporary file space")
+
+    /* Set up I/O info for operation */
+    fio_info.f = f;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Check if the space to free intersects with the file's metadata accumulator */
+    if(H5F__accum_free(&fio_info, alloc_type, addr, size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't check free space intersection w/metadata accumulator")
+
+    /* Get free space type from allocation type */
+    fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: fs_type = %u\n", FUNC, (unsigned)fs_type);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+    /* Check if the free space manager for the file has been initialized */
+    if(!f->shared->fs_man[fs_type]) {
+        /* If there's no free space manager for objects of this type,
+         *  see if we can avoid creating one by checking if the freed
+         *  space is at the end of the file
+         */
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)fs_type, f->shared->fs_addr[fs_type]);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+        if(!H5F_addr_defined(f->shared->fs_addr[fs_type])) {
+            htri_t status;          /* "can absorb" status for section into */
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Trying to avoid starting up free space manager\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            /* Try to shrink the file or absorb the block into a block aggregator */
+            if((status = H5MF_try_shrink(f, alloc_type, dxpl_id, addr, size)) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for absorbing block")
+            else if(status > 0)
+                /* Indicate success */
+                HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+        /* If we are deleting the free space manager, leave now, to avoid
+         *  [re-]starting it.
+	 * or if file space strategy type is not using a free space manager
+	 *   (H5F_FILE_SPACE_AGGR_VFD or H5F_FILE_SPACE_VFD), drop free space
+         *   section on the floor.
+         *
+         * Note: this drops the space to free on the floor...
+         *
+         */
+        if(f->shared->fs_state[fs_type] == H5F_FS_STATE_DELETING ||
+	        !H5F_HAVE_FREE_SPACE_MANAGER(f)) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, addr, size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+        /* There's either already a free space manager, or the freed
+         *  space isn't at the end of the file, so start up (or create)
+         *  the file space manager
+         */
+        if(H5MF_alloc_start(f, dxpl_id, fs_type) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+    } /* end if */
+    HDassert(f->shared->fs_man[fs_type]);
+
+    /* Create free space section for block */
+    if(NULL == (node = H5MF_sect_simple_new(addr, size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
+
+    /* Construct user data for callbacks */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.alloc_type = alloc_type;
+    udata.allow_sect_absorb = TRUE;
+    udata.allow_eoa_shrink_only = FALSE; 
+
+    /* Add to the free space for the file */
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Before H5FS_sect_add()\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+    if(H5FS_sect_add(f, dxpl_id, f->shared->fs_man[fs_type], (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't add section to file free space")
+    node = NULL;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: After H5FS_sect_add()\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+done:
+    /* Release section node, if allocated and not added to section list or merged */
+    if(node)
+        if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_xfree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_try_extend
+ *
+ * Purpose:	Extend a block in the file if possible.
+ *
+ * Return:	Success:	TRUE(1)  - Block was extended
+ *                              FALSE(0) - Block could not be extended
+ * 		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, June 11, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t alloc_type, haddr_t addr,
+    hsize_t size, hsize_t extra_requested)
+{
+    haddr_t     end;            /* End of block to extend */
+    H5FD_mem_t  map_type;       /* Mapped type */
+    htri_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering: alloc_type = %u, addr = %a, size = %Hu, extra_requested = %Hu\n", FUNC, (unsigned)alloc_type, addr, size, extra_requested);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+
+    /* Set mapped type, treating global heap as raw data */
+    map_type = (alloc_type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : alloc_type;
+
+    /* Compute end of block to extend */
+    end = addr + size;
+
+    /* Check if the block is exactly at the end of the file */
+    if((ret_value = H5FD_try_extend(f->shared->lf, map_type, f, end, extra_requested)) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
+    else if(ret_value == FALSE) {
+        H5F_blk_aggr_t *aggr;   /* Aggregator to use */
+
+        /* Check for test block able to extend aggregation block */
+        aggr = (map_type == H5FD_MEM_DRAW) ?  &(f->shared->sdata_aggr) : &(f->shared->meta_aggr);
+        if((ret_value = H5MF_aggr_try_extend(f, aggr, map_type, end, extra_requested)) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending aggregation block")
+        else if(ret_value == FALSE) {
+            H5FD_mem_t  fs_type;                /* Free space type (mapped from allocation type) */
+
+            /* Get free space type from allocation type */
+            fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
+
+            /* Check if the free space for the file has been initialized */
+            if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type]))
+                if(H5MF_alloc_open(f, dxpl_id, fs_type) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+
+            /* Check for test block able to block in free space manager */
+            if(f->shared->fs_man[fs_type])
+                if((ret_value = H5FS_sect_try_extend(f, dxpl_id, f->shared->fs_man[fs_type], addr, size, extra_requested)) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending block in free space manager")
+        } /* end if */
+    } /* end if */
+
+done:
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_try_extend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_get_freespace
+ *
+ * Purpose:     Retrieve the amount of free space in a file.
+ *
+ * Return:      Success:        Amount of free space in file
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, October  6, 2003
+ *
+ * Modifications:
+ *      Vailin Choi; July 2012
+ *      As the default free-list mapping is changed to H5FD_FLMAP_DICHOTOMY,
+ *      checks are added to account for the last section of each free-space manager
+ *      and the remaining space in the two aggregators are at EOF.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_size)
+{
+    haddr_t eoa;                /* End of allocated space in the file */
+    haddr_t ma_addr = HADDR_UNDEF;    /* Base "metadata aggregator" address */
+    hsize_t ma_size = 0;        /* Size of "metadata aggregator" */
+    haddr_t sda_addr = HADDR_UNDEF;    /* Base "small data aggregator" address */
+    hsize_t sda_size = 0;       /* Size of "small data aggregator" */
+    hsize_t tot_fs_size = 0;    /* Amount of all free space managed */
+    hsize_t tot_meta_size = 0;  /* Amount of metadata for free space managers */
+    H5FD_mem_t type;            /* Memory type for iteration */
+    hbool_t fs_started[H5FD_MEM_NTYPES]; /* Indicate whether the free-space manager has been started */
+    hbool_t eoa_shrank;		/* Whether an EOA shrink occurs */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* Retrieve the 'eoa' for the file */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* Retrieve metadata aggregator info, if available */
+    if(H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query metadata aggregator stats")
+
+    /* Retrieve 'small data' aggregator info, if available */
+    if(H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
+
+    /* Iterate over all the free space types that have managers and get each free list's space */
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+
+	fs_started[type] = FALSE;
+
+	/* Check if the free space for the file has been initialized */
+        if(!f->shared->fs_man[type] && H5F_addr_defined(f->shared->fs_addr[type])) {
+            if(H5MF_alloc_open(f, dxpl_id, type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+            HDassert(f->shared->fs_man[type]);
+            fs_started[type] = TRUE;
+        } /* end if */
+
+	/* Check if there's free space of this type */
+        if(f->shared->fs_man[type]) {
+            hsize_t type_fs_size = 0;    /* Amount of free space managed for each type */
+            hsize_t type_meta_size = 0;  /* Amount of free space metadata for each type */
+
+            /* Retrieve free space size from free space manager */
+            if(H5FS_sect_stats(f->shared->fs_man[type], &type_fs_size, NULL) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space stats")
+            if(H5FS_size(f, f->shared->fs_man[type], &type_meta_size) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space metadata stats")
+
+            /* Increment total free space for types */
+            tot_fs_size += type_fs_size;
+            tot_meta_size += type_meta_size;
+	} /* end if */
+    } /* end for */
+
+    /* Iterate until no more EOA shrink occurs */
+    do {
+	eoa_shrank = FALSE;
+
+	/* Check the last section of each free-space manager */
+	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	    haddr_t sect_addr = HADDR_UNDEF;
+	    hsize_t sect_size = 0;
+
+	    if(f->shared->fs_man[type]) {
+		if(H5FS_sect_query_last_sect(f->shared->fs_man[type], &sect_addr, &sect_size) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query last section on merge list")
+
+		/* Deduct space from previous accumulation if the section is at EOA */
+		if(H5F_addr_eq(sect_addr + sect_size, eoa)) {
+		    eoa = sect_addr;
+		    eoa_shrank = TRUE;
+		    tot_fs_size -= sect_size;
+		} /* end if */
+	    } /* end if */
+	} /* end for */
+
+	/* Check the metadata and raw data aggregators */
+	if(ma_size > 0 && H5F_addr_eq(ma_addr + ma_size, eoa)) {
+	    eoa = ma_addr;
+	    eoa_shrank = TRUE;
+	    ma_size = 0;
+	} /* end if */
+	if(sda_size > 0 && H5F_addr_eq(sda_addr + sda_size, eoa)) {
+	    eoa = sda_addr;
+	    eoa_shrank = TRUE;
+	    sda_size = 0;
+	} /* end if */
+    } while(eoa_shrank);
+
+    /* Close the free-space managers if they were opened earlier in this routine */
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	if(fs_started[type])
+            if(H5MF_alloc_close(f, dxpl_id, type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't close file free space")
+    } /* end for */
+
+    /* Set the value(s) to return */
+    /* (The metadata & small data aggregators count as free space now, since they aren't at EOA) */
+    if(tot_space)
+	*tot_space = tot_fs_size + ma_size + sda_size;
+    if(meta_size)
+	*meta_size = tot_meta_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_get_freespace() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_try_shrink
+ *
+ * Purpose:     Try to shrink the size of a file with a block or absorb it
+ *              into a block aggregator.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Feb 14 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_try_shrink(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
+    hsize_t size)
+{
+    H5MF_free_section_t *node = NULL;   /* Free space section pointer */
+    H5MF_sect_ud_t udata;               /* User data for callback */
+    htri_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)alloc_type, addr, size);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(size > 0);
+
+    /* Create free space section for block */
+    if(NULL == (node = H5MF_sect_simple_new(addr, size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
+
+    /* Construct user data for callbacks */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.alloc_type = alloc_type;
+    udata.allow_sect_absorb = FALSE;    /* Force section to be absorbed into aggregator */
+    udata.allow_eoa_shrink_only = FALSE; 
+
+    /* Call the "can shrink" callback for the section */
+    if((ret_value = H5MF_sect_simple_can_shrink((const H5FS_section_info_t *)node, &udata)) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "can't check if section can shrink container")
+    else if(ret_value > 0) {
+        /* Shrink or absorb the section */
+        if(H5MF_sect_simple_shrink((H5FS_section_info_t **)&node, &udata) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink container")
+    } /* end if */
+
+done:
+    /* Free section node allocated */
+    if(node && H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_try_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_close_shrink_eoa
+ *
+ * Purpose:     Shrink the EOA while closing
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, July 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_close_shrink_eoa(H5F_t *f, hid_t dxpl_id)
+{
+    H5FD_mem_t type;            /* Memory type for iteration */
+    hbool_t eoa_shrank;		/* Whether an EOA shrink occurs */
+    htri_t status;		/* Status value */
+    H5MF_sect_ud_t udata;	/* User data for callback */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Construct user data for callbacks */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.allow_sect_absorb = FALSE;    
+    udata.allow_eoa_shrink_only = TRUE; 
+
+    /* Iterate until no more EOA shrinking occurs */
+    do {
+	eoa_shrank = FALSE;
+
+	/* Check the last section of each free-space manager */
+	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	    if(f->shared->fs_man[type]) {
+		udata.alloc_type = type;
+		if((status = H5FS_sect_try_shrink_eoa(f, dxpl_id, f->shared->fs_man[type], &udata)) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+		else if(status > 0)
+		    eoa_shrank = TRUE;
+	    } /* end if */
+	} /* end for */
+
+	/* check the two aggregators */
+	if((status = H5MF_aggrs_try_shrink_eoa(f, dxpl_id)) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+	else if(status > 0)
+	    eoa_shrank = TRUE;
+    } while(eoa_shrank);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_close_shrink_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_close
+ *
+ * Purpose:     Close the free space tracker(s) for a file
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, January 22, 2008
+ *
+ * Modifications:
+ *      Vailin Choi; July 2012
+ *      As the default free-list mapping is changed to H5FD_FLMAP_DICHOTOMY,
+ *      modifications are needed to shrink EOA if the last section of each free-space manager
+ *      and the remaining space in the two aggregators are at EOA.
+
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_close(H5F_t *f, hid_t dxpl_id)
+{
+    H5FD_mem_t type;                    /* Memory type for iteration */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* Free the space in aggregators */
+    /* (for space not at EOF, it may be put into free space managers) */
+    if(H5MF_free_aggrs(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't free aggregators")
+
+    /* Trying shrinking the EOA for the file */
+    if(H5MF_close_shrink_eoa(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+    /* Iterate over all the free space types that have managers and get each free list's space */
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 1.0 - f->shared->fs_man[%u] = %p, f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)type, f->shared->fs_man[type], (unsigned)type, f->shared->fs_addr[type]);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+        /* If the free space manager for this type is open, close it */
+        if(f->shared->fs_man[type]) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Before closing free space manager\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release free space info")
+            f->shared->fs_man[type] = NULL;
+            f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+        } /* end if */
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 2.0 - f->shared->fs_man[%u] = %p, f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)type, f->shared->fs_man[type], (unsigned)type, f->shared->fs_addr[type]);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+        /* If there is free space manager info for this type, delete it */
+        /* (XXX: Make this optional when free space for a file can be persistant) */
+        if(H5F_addr_defined(f->shared->fs_addr[type])) {
+            haddr_t tmp_fs_addr;            /* Temporary holder for free space manager address */
+
+            /* Put address into temporary variable and reset it */
+            /* (Avoids loopback in file space freeing routine) */
+            tmp_fs_addr = f->shared->fs_addr[type];
+            f->shared->fs_addr[type] = HADDR_UNDEF;
+
+            /* Shift to "deleting" state, to make certain we don't track any
+             *  file space freed as a result of deleting the free space manager.
+             */
+            f->shared->fs_state[type] = H5F_FS_STATE_DELETING;
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Before deleting free space manager\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            /* Delete free space manager for this type */
+	    if(H5FS_delete(f, dxpl_id, tmp_fs_addr) < 0)
+		HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't delete free space manager")
+
+            /* Shift [back] to closed state */
+            HDassert(f->shared->fs_state[type] == H5F_FS_STATE_DELETING);
+            f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+
+            /* Sanity check that the free space manager for this type wasn't started up again */
+            HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
+        } /* end if */
+    } /* end for */
+
+    /* Free the space in aggregators (again) */
+    /* (in case any free space information re-started them) */
+    if(H5MF_free_aggrs(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't free aggregators")
+
+    /* Trying shrinking the EOA for the file */
+    /* (in case any free space is now at the EOA) */
+    if(H5MF_close_shrink_eoa(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+done:
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_close() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MFaggr.c b/gatb-core/thirdparty/hdf5/src/H5MFaggr.c
new file mode 100644
index 0000000..663e266
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MFaggr.c
@@ -0,0 +1,915 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *              Tuesday, January  8, 2008
+ *
+ * Purpose:	Routines for aggregating free space allocations
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* File access				*/
+#include "H5MFpkg.h"		/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+#define EXTEND_THRESHOLD 0.10F
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+    H5F_blk_aggr_t *aggr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_vfd_alloc
+ *
+ * Purpose:     Allocate SIZE bytes of file memory via H5MF_aggr_alloc()
+ *		and return the relative address where that contiguous chunk
+ *		of file memory exists.
+ *		The TYPE argument describes the purpose for which the storage
+ *		is being requested.
+ *
+ * Return:      Success:        The file address of new chunk.
+ *              Failure:        HADDR_UNDEF
+ *
+ * Programmer:  Vailin Choi; July 1st, 2009
+ *		(The coding is from H5MF_alloc().)
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5MF_aggr_vfd_alloc(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size)
+{
+    haddr_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_type, size);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(size > 0);
+
+    /* Couldn't find anything from the free space manager, go allocate some */
+    if(alloc_type != H5FD_MEM_DRAW && alloc_type != H5FD_MEM_GHEAP) {
+        /* Handle metadata differently from "raw" data */
+        if(HADDR_UNDEF == (ret_value = H5MF_aggr_alloc(f, dxpl_id, &(f->shared->meta_aggr), &(f->shared->sdata_aggr), alloc_type, size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate metadata")
+    } /* end if */
+    else {
+        /* Allocate "raw" data: H5FD_MEM_DRAW and H5FD_MEM_GHEAP */
+        if(HADDR_UNDEF == (ret_value = H5MF_aggr_alloc(f, dxpl_id, &(f->shared->sdata_aggr), &(f->shared->meta_aggr), H5FD_MEM_DRAW, size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate raw data")
+    } /* end else */
+
+    /* Sanity check for overlapping into file's temporary allocation space */
+    HDassert(H5F_addr_le((ret_value + size), f->shared->tmp_addr));
+
+done:
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value, size);
+#endif /* H5MF_ALLOC_DEBUG */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggr_vfd_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_alloc
+ *
+ * Purpose:     Try to allocate SIZE bytes of memory from an aggregator
+ *              block if possible.
+ *
+ * Return:      Success:    The format address of the new file memory.
+ *              Failure:    The undefined address HADDR_UNDEF
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, December 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
+    H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size)
+{
+    haddr_t	eoa_frag_addr = HADDR_UNDEF;    /* Address of fragment at EOA */
+    hsize_t	eoa_frag_size = 0;      /* Size of fragment at EOA */
+    haddr_t	eoa = HADDR_UNDEF;      /* Initial EOA for the file */
+    haddr_t 	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size);
+#endif /* H5MF_AGGR_DEBUG */
+
+    /* check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+    HDassert(other_aggr);
+    HDassert(other_aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || other_aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+    HDassert(other_aggr->feature_flag != aggr->feature_flag);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Get the EOA for the file */
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, type)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "Unable to get eoa")
+
+    /*
+     * If the aggregation feature is enabled for this file, allocate "generic"
+     * space and sub-allocate out of that, if possible. Otherwise just allocate
+     * through H5FD_alloc()
+     */
+    if(f->shared->feature_flags & aggr->feature_flag) {
+        haddr_t	aggr_frag_addr = HADDR_UNDEF;   /* Address of aggregrator fragment */
+        hsize_t	aggr_frag_size = 0;             /* Size of aggregator fragment */
+        hsize_t alignment;                      /* Alignment of this section */
+        hsize_t aggr_mis_align = 0;             /* Mis-alignment of aggregator */
+        H5FD_mem_t alloc_type, other_alloc_type;/* Current aggregator & 'other' aggregator types */
+
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: aggr = {%a, %Hu, %Hu}\n", FUNC, aggr->addr, aggr->tot_size, aggr->size);
+#endif /* H5MF_AGGR_DEBUG */
+
+        /* Turn off alignment if allocation < threshold */
+	alignment = f->shared->alignment;
+	if(!((alignment > 1) && (size >= f->shared->threshold)))
+	    alignment = 0; /* no alignment */
+
+        /* Generate fragment if aggregator is mis-aligned */
+	if(alignment && aggr->addr > 0 && (aggr_mis_align = (aggr->addr + H5FD_get_base_addr(f->shared->lf)) % alignment)) {
+	    aggr_frag_addr = aggr->addr;
+	    aggr_frag_size = alignment - aggr_mis_align;
+	} /* end if */
+
+	alloc_type = aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA ? H5FD_MEM_DEFAULT : H5FD_MEM_DRAW;
+	other_alloc_type = other_aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA ? H5FD_MEM_DEFAULT : H5FD_MEM_DRAW;
+
+        /* Check if the space requested is larger than the space left in the block */
+        if((size + aggr_frag_size) > aggr->size) {
+            htri_t  	was_extended = FALSE;   /* Whether the file was extended */
+
+            /* Check if the block asked for is too large for 'normal' aggregator block */
+            if(size >= aggr->alloc_size) {
+		hsize_t ext_size = size + aggr_frag_size;
+
+                /* Check for overlapping into file's temporary allocation space */
+                if(H5F_addr_gt((aggr->addr + aggr->size + ext_size), f->shared->tmp_addr))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+
+		if ((aggr->addr > 0) && (was_extended = H5FD_try_extend(f->shared->lf, alloc_type, f, aggr->addr + aggr->size, ext_size)) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't extending space")
+		else if (was_extended) {
+		    /* aggr->size is unchanged */
+		    ret_value = aggr->addr + aggr_frag_size;
+		    aggr->addr += ext_size;
+		    aggr->tot_size += ext_size;
+		} else {
+                    /* Check for overlapping into file's temporary allocation space */
+                    if(H5F_addr_gt((eoa + size), f->shared->tmp_addr))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+
+                    /* Release "other" aggregator, if it exists, is at the end of the allocated space,
+                     * has allocated more than one block and the unallocated space is greater than its
+                     * allocation block size.
+                     */
+		    if ((other_aggr->size > 0) && (H5F_addr_eq((other_aggr->addr + other_aggr->size), eoa)) &&
+			(other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
+                            if(H5MF_aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
+		    } /* end if */
+
+                    /* Allocate space from the VFD (i.e. at the end of the file) */
+		    if(HADDR_UNDEF == (ret_value = H5FD_alloc(f->shared->lf, dxpl_id, alloc_type, f, size, &eoa_frag_addr, &eoa_frag_size)))
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate aggregation block")
+                } /* end else */
+            } /* end if */
+	    else {
+		hsize_t ext_size = aggr->alloc_size;
+
+                /* Allocate another block */
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: Allocating block\n", FUNC);
+#endif /* H5MF_AGGR_DEBUG */
+
+		if(aggr_frag_size > (ext_size - size))
+		    ext_size += (aggr_frag_size - (ext_size - size));
+
+                /* Check for overlapping into file's temporary allocation space */
+                if(H5F_addr_gt((aggr->addr + aggr->size + ext_size), f->shared->tmp_addr))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+
+		if((aggr->addr > 0) && (was_extended = H5FD_try_extend(f->shared->lf, alloc_type, f, aggr->addr + aggr->size, ext_size)) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't extending space")
+		else if (was_extended) {
+		    aggr->addr += aggr_frag_size;
+		    aggr->size += (ext_size - aggr_frag_size);
+		    aggr->tot_size += ext_size;
+		} else {
+                    haddr_t new_space;          /* Address of new space allocated */
+
+                    /* Check for overlapping into file's temporary allocation space */
+                    if(H5F_addr_gt((eoa + aggr->alloc_size), f->shared->tmp_addr))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+
+                    /* Release "other" aggregator, if it exists, is at the end of the allocated space,
+                     * has allocated more than one block and the unallocated space is greater than its
+                     * allocation block size.
+                     */
+		    if((other_aggr->size > 0) && (H5F_addr_eq((other_aggr->addr + other_aggr->size), eoa)) &&
+			(other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
+                            if(H5MF_aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
+		    } /* end if */
+
+                    /* Allocate space from the VFD (i.e. at the end of the file) */
+		    if(HADDR_UNDEF == (new_space = H5FD_alloc(f->shared->lf, dxpl_id, alloc_type, f, aggr->alloc_size, &eoa_frag_addr, &eoa_frag_size)))
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate aggregation block")
+
+                    /* Return the unused portion of the block to a free list */
+                    if(aggr->size > 0)
+                        if(H5MF_xfree(f, alloc_type, dxpl_id, aggr->addr, aggr->size) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
+
+                    /* If the block is not to be aligned, fold the eoa fragment
+                     * into the newly allocated aggregator, as it could have
+                     * been allocated in an aligned manner if the aggregator
+                     * block is larger than the threshold */
+                    if(eoa_frag_size && !alignment) {
+                        HDassert(eoa_frag_addr + eoa_frag_size == new_space);
+                        aggr->addr = eoa_frag_addr;
+                        aggr->size = aggr->alloc_size + eoa_frag_size;
+                        aggr->tot_size = aggr->size;
+
+                        /* Reset EOA fragment */
+                        eoa_frag_addr = HADDR_UNDEF;
+                        eoa_frag_size = 0;
+                    } /* end if */
+                    else {
+                        /* Point the aggregator at the newly allocated block */
+                        aggr->addr = new_space;
+                        aggr->size = aggr->alloc_size;
+                        aggr->tot_size = aggr->alloc_size;
+                    }
+                } /* end else */
+
+		/* Allocate space out of the metadata block */
+		ret_value = aggr->addr;
+		aggr->size -= size;
+		aggr->addr += size;
+            } /* end else */
+
+	    /* Freeing any possible fragment due to file allocation */
+	    if(eoa_frag_size)
+		if(H5MF_xfree(f, alloc_type, dxpl_id, eoa_frag_addr, eoa_frag_size) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free eoa fragment")
+
+	    /* Freeing any possible fragment due to alignment in the block after extension */
+	    if(was_extended && aggr_frag_size)
+		if(H5MF_xfree(f, alloc_type, dxpl_id, aggr_frag_addr, aggr_frag_size) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation fragment")
+        } /* end if */
+        else {
+            /* Allocate space out of the block */
+	    ret_value = aggr->addr + aggr_frag_size;
+	    aggr->size -= (size + aggr_frag_size);
+	    aggr->addr += (size + aggr_frag_size);
+
+	    /* free any possible fragment */
+	    if(aggr_frag_size)
+		if(H5MF_xfree(f, alloc_type, dxpl_id, aggr_frag_addr, aggr_frag_size) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation fragment")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Check for overlapping into file's temporary allocation space */
+        if(H5F_addr_gt((eoa + size), f->shared->tmp_addr))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+
+        /* Allocate data from the file */
+        if(HADDR_UNDEF == (ret_value = H5FD_alloc(f->shared->lf, dxpl_id, type, f, size, &eoa_frag_addr, &eoa_frag_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
+
+        /* Check if fragment was generated */
+	if(eoa_frag_size)
+            /* Put fragment on the free list */
+	    if(H5MF_xfree(f, type, dxpl_id, eoa_frag_addr, eoa_frag_size) < 0)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free eoa fragment")
+    } /* end else */
+
+    /* Sanity check for overlapping into file's temporary allocation space */
+    HDassert(H5F_addr_le((ret_value + size), f->shared->tmp_addr));
+
+    /* Post-condition sanity check */
+    if(f->shared->alignment && size >= f->shared->threshold)
+	HDassert(!((ret_value + H5FD_get_base_addr(f->shared->lf)) % f->shared->alignment));
+
+done:
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value);
+#endif /* H5MF_AGGR_DEBUG */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggr_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_try_extend
+ *
+ * Purpose:	Check if a block is inside an aggregator block and extend it
+ *              if possible.
+ *
+ * Note:
+ *	        When the block to be extended adjoins the aggregator--
+ *		    1) When the aggregator is at end of file:
+ *		       A) If the request is below the threshold, extend the block into the aggregator
+ *		       B) If the request is above the threshold,
+ *			    a) extend the aggregator by aggr->alloc_size or the extended amount
+ *			    b) extend the block into the aggregator
+ *		    2) When the aggregator is not at end of file:
+ *		       Extended the block into the aggregator if it has enough space to satisfy the request
+ *
+ * Return:	Success:	TRUE(1)  - Block was extended
+ *                              FALSE(0) - Block could not be extended
+ * 		Failure:	FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, December 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr, H5FD_mem_t type,
+    haddr_t blk_end, hsize_t extra_requested)
+{
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+
+    /* Check if this aggregator is active */
+    if(f->shared->feature_flags & aggr->feature_flag) {
+        /* 
+	 * If the block being tested adjoins the beginning of the aggregator
+         *      block, check if the aggregator can accomodate the extension.
+         */
+        if(H5F_addr_eq(blk_end, aggr->addr)) {
+	    haddr_t eoa;      /* EOA for the file */
+
+	    /* Get the EOA for the file */
+	    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, type)))
+		HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "Unable to get eoa")
+
+	    /* If the aggregator is at the end of file: */
+	    if(H5F_addr_eq(eoa, aggr->addr + aggr->size)) {
+		/* If extra_requested is below percentage threshold, extend block into the aggregator. */
+		if(extra_requested <= (EXTEND_THRESHOLD * aggr->size)) {
+		    aggr->size -= extra_requested;
+		    aggr->addr += extra_requested;
+
+		    /* Indicate success */
+		    HGOTO_DONE(TRUE);
+		} 
+		/* 
+		 * If extra_requested is above percentage threshold:
+		 * 1) "bubble" up the aggregator by aggr->alloc_size or extra_requested
+		 * 2) extend the block into the aggregator 
+		 */
+		else {
+		    hsize_t extra = (extra_requested < aggr->alloc_size) ? aggr->alloc_size : extra_requested;
+
+		    if((ret_value = H5FD_try_extend(f->shared->lf, type, f, (aggr->addr + aggr->size), extra)) < 0)
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
+		    else if(ret_value == TRUE) {
+			/* Shift the aggregator block by the extra requested */
+                        /* (allocates the space for the extra_requested) */
+			aggr->addr += extra_requested;
+
+			/* Add extra to the aggregator's total allocated amount */
+			aggr->tot_size += extra;
+
+                        /* Account for any space added to the aggregator */
+                        /* (either 0 (if extra_requested > aggr->alloc_size) or
+                         *      (aggr->alloc_size - extra_requested) -QAK
+                         */
+			aggr->size += extra;
+			aggr->size -= extra_requested;
+		    } /* end if */
+		} /* end if */
+	    } /* end if */
+            else { /* The aggreator is not at end of file */
+                /* Check if aggregator has enough internal space to satisfy the extension. */
+                if(aggr->size >= extra_requested) {
+                    /* Extend block into aggregator */
+                    aggr->size -= extra_requested;
+                    aggr->addr += extra_requested;
+
+                    /* Indicate success */
+                    HGOTO_DONE(TRUE);
+                 } /* end if */
+	    } /* end else */
+	} /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggr_try_extend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_can_absorb
+ *
+ * Purpose:	Check if a section adjoins an aggregator block and one can
+ *              absorb the other.
+ *
+ * Return:	Success:	TRUE(1)  - Section or aggregator can be absorbed
+ *                              FALSE(0) - Section and aggregator can not be absorbed
+ * 		Failure:	FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, February  1, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_aggr_can_absorb(const H5F_t *f, const H5F_blk_aggr_t *aggr,
+    const H5MF_free_section_t *sect, H5MF_shrink_type_t *shrink)
+{
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+    HDassert(sect);
+    HDassert(shrink);
+
+    /* Check if this aggregator is active */
+    if(f->shared->feature_flags & aggr->feature_flag) {
+        /* Check if the block adjoins the beginning or end of the aggregator */
+        if(H5F_addr_eq((sect->sect_info.addr + sect->sect_info.size), aggr->addr)
+                || H5F_addr_eq((aggr->addr + aggr->size), sect->sect_info.addr)) {
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: section {%a, %Hu} adjoins aggr = {%a, %Hu}\n", "H5MF_aggr_can_absorb", sect->sect_info.addr, sect->sect_info.size, aggr->addr, aggr->size);
+#endif /* H5MF_AGGR_DEBUG */
+            /* Check if aggregator would get too large and should be absorbed into section */
+            if((aggr->size + sect->sect_info.size) >= aggr->alloc_size)
+                *shrink = H5MF_SHRINK_SECT_ABSORB_AGGR;
+            else
+                *shrink = H5MF_SHRINK_AGGR_ABSORB_SECT;
+
+            /* Indicate success */
+            HGOTO_DONE(TRUE)
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggr_can_absorb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_absorb
+ *
+ * Purpose:	Absorb a free space section into an aggregator block or
+ *              vice versa.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, February  1, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_aggr_absorb(const H5F_t H5_ATTR_UNUSED *f, H5F_blk_aggr_t *aggr, H5MF_free_section_t *sect,
+    hbool_t allow_sect_absorb)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+    HDassert(f->shared->feature_flags & aggr->feature_flag);
+    HDassert(sect);
+
+    /* Check if aggregator would get too large and should be absorbed into section */
+    if((aggr->size + sect->sect_info.size) >= aggr->alloc_size && allow_sect_absorb) {
+        /* Check if the section adjoins the beginning or end of the aggregator */
+        if(H5F_addr_eq((sect->sect_info.addr + sect->sect_info.size), aggr->addr)) {
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: aggr {%a, %Hu} adjoins front of section = {%a, %Hu}\n", "H5MF_aggr_absorb", aggr->addr, aggr->size, sect->sect_info.addr, sect->sect_info.size);
+#endif /* H5MF_AGGR_DEBUG */
+            /* Absorb aggregator onto end of section */
+            sect->sect_info.size += aggr->size;
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5F_addr_eq((aggr->addr + aggr->size), sect->sect_info.addr));
+
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: aggr {%a, %Hu} adjoins end of section = {%a, %Hu}\n", "H5MF_aggr_absorb", aggr->addr, aggr->size, sect->sect_info.addr, sect->sect_info.size);
+#endif /* H5MF_AGGR_DEBUG */
+            /* Absorb aggregator onto beginning of section */
+            sect->sect_info.addr -= aggr->size;
+            sect->sect_info.size += aggr->size;
+        } /* end if */
+
+        /* Reset aggregator */
+        aggr->tot_size = 0;
+        aggr->addr = 0;
+        aggr->size = 0;
+    } /* end if */
+    else {
+        /* Check if the section adjoins the beginning or end of the aggregator */
+        if(H5F_addr_eq((sect->sect_info.addr + sect->sect_info.size), aggr->addr)) {
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: section {%a, %Hu} adjoins front of aggr = {%a, %Hu}\n", "H5MF_aggr_absorb", sect->sect_info.addr, sect->sect_info.size, aggr->addr, aggr->size);
+#endif /* H5MF_AGGR_DEBUG */
+            /* Absorb section onto front of aggregator */
+            aggr->addr -= sect->sect_info.size;
+            aggr->size += sect->sect_info.size;
+
+            /* Sections absorbed onto front of aggregator count against the total
+             * amount of space aggregated together.
+             */
+            aggr->tot_size -= MIN(aggr->tot_size, sect->sect_info.size);
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5F_addr_eq((aggr->addr + aggr->size), sect->sect_info.addr));
+
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: section {%a, %Hu} adjoins end of aggr = {%a, %Hu}\n", "H5MF_aggr_absorb", sect->sect_info.addr, sect->sect_info.size, aggr->addr, aggr->size);
+#endif /* H5MF_AGGR_DEBUG */
+            /* Absorb section onto end of aggregator */
+            aggr->size += sect->sect_info.size;
+        } /* end if */
+        /* Sanity check */
+        HDassert(!allow_sect_absorb || (aggr->size < aggr->alloc_size));
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5MF_aggr_absorb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_query
+ *
+ * Purpose:     Query a block aggregator's current address & size info
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, December 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_aggr_query(const H5F_t *f, const H5F_blk_aggr_t *aggr, haddr_t *addr,
+    hsize_t *size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+
+    /* Check if this aggregator is active */
+    if(f->shared->feature_flags & aggr->feature_flag) {
+	if(addr)
+            *addr = aggr->addr;
+        if(size)
+            *size = aggr->size;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5MF_aggr_query() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_reset
+ *
+ * Purpose:     Reset a block aggregator, returning any space back to file
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, December 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_aggr_reset(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr)
+{
+    H5FD_mem_t alloc_type;      /* Type of file memory to work with */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+
+    /* Set the type of memory in the file */
+    alloc_type = (aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA ? H5FD_MEM_DEFAULT : H5FD_MEM_DRAW);      /* Type of file memory to work with */
+
+    /* Check if this aggregator is active */
+    if(f->shared->feature_flags & aggr->feature_flag) {
+        haddr_t tmp_addr;       /* Temporary holder for aggregator address */
+        hsize_t tmp_size;       /* Temporary holder for aggregator size */
+
+        /* Retain aggregator info */
+        tmp_addr = aggr->addr;
+        tmp_size = aggr->size;
+#ifdef H5MF_AGGR_DEBUG
+HDfprintf(stderr, "%s: tmp_addr = %a, tmp_size = %Hu\n", FUNC, tmp_addr, tmp_size);
+#endif /* H5MF_AGGR_DEBUG */
+
+        /* Reset aggregator block information */
+        aggr->tot_size = 0;
+        aggr->addr = 0;
+        aggr->size = 0;
+
+        /* Return the unused portion of the metadata block to the file */
+        if(tmp_size > 0 && (H5F_INTENT(f) & H5F_ACC_RDWR))
+            if(H5MF_xfree(f, alloc_type, dxpl_id, tmp_addr, tmp_size) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't release aggregator's free space")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggr_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_free_aggrs
+ *
+ * Purpose:     Reset a metadata & small block aggregators, returning any space
+ *		back to file
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *	        July 1st, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_free_aggrs(H5F_t *f, hid_t dxpl_id)
+{
+    H5F_blk_aggr_t *first_aggr;         /* First aggregator to reset */
+    H5F_blk_aggr_t *second_aggr;        /* Second aggregator to reset */
+    haddr_t ma_addr = HADDR_UNDEF;      /* Base "metadata aggregator" address */
+    hsize_t ma_size = 0;                /* Size of "metadata aggregator" */
+    haddr_t sda_addr = HADDR_UNDEF;     /* Base "small data aggregator" address */
+    hsize_t sda_size = 0;               /* Size of "small data aggregator" */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* Retrieve metadata aggregator info, if available */
+    if(H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query metadata aggregator stats")
+
+    /* Retrieve 'small data' aggregator info, if available */
+    if(H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
+
+    /* Make certain we release the aggregator that's later in the file first */
+    /* (so the file shrinks properly) */
+    if(H5F_addr_defined(ma_addr) && H5F_addr_defined(sda_addr)) {
+        if(H5F_addr_lt(ma_addr, sda_addr)) {
+            first_aggr = &(f->shared->sdata_aggr);
+            second_aggr = &(f->shared->meta_aggr);
+        } /* end if */
+        else {
+            first_aggr = &(f->shared->meta_aggr);
+            second_aggr = &(f->shared->sdata_aggr);
+        } /* end else */
+    } /* end if */
+    else {
+        first_aggr = &(f->shared->meta_aggr);
+        second_aggr = &(f->shared->sdata_aggr);
+    } /* end else */
+
+     /* Release the unused portion of the metadata and "small data" blocks back
+      * to the free lists in the file.
+      */
+    if(H5MF_aggr_reset(f, dxpl_id, first_aggr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't reset metadata block")
+    if(H5MF_aggr_reset(f, dxpl_id, second_aggr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't reset 'small data' block")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_free_aggrs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_can_shrink_eoa
+ *
+ * Purpose:     Check if the remaining space in the aggregator is at EOA
+ *
+ * Return:      Success:        non-negative (TRUE/FALSE)
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5MF_aggr_can_shrink_eoa(H5F_t *f, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
+{
+    haddr_t eoa = HADDR_UNDEF;      	/* EOA for the file */
+    htri_t ret_value = FALSE;   	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(aggr);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+
+    /* Get the EOA for the file */
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, type)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "Unable to get eoa")
+
+    /* Check if the aggregator is at EOA */
+    if(aggr->size > 0 && H5F_addr_defined(aggr->addr))
+	ret_value = H5F_addr_eq(eoa, aggr->addr + aggr->size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_aggr_can_shrink_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggr_free
+ *
+ * Purpose:     Free the aggregator's space in the file.
+ *
+ * Note:        Does _not_ put the space on a free list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
+{
+    herr_t ret_value = SUCCEED;   	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared->lf);
+    HDassert(aggr);
+    HDassert(H5F_addr_defined(aggr->addr));
+    HDassert(aggr->size > 0);
+    HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+    HDassert(aggr->feature_flag == H5FD_FEAT_AGGREGATE_METADATA || aggr->feature_flag == H5FD_FEAT_AGGREGATE_SMALLDATA);
+    HDassert(f->shared->feature_flags & aggr->feature_flag);
+
+    /* Free the remaining space at EOA in the aggregator */
+    if(H5FD_free(f->shared->lf, dxpl_id, type, f, aggr->addr, aggr->size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free aggregation block")
+
+    /* Reset the aggregator */
+    aggr->tot_size = 0;
+    aggr->addr = HADDR_UNDEF;
+    aggr->size = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_aggr_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_aggrs_try_shrink_eoa
+ *
+ * Purpose:     Check the metadata & small block aggregators to see if
+ *		EOA shrink is possible; if so, shrink each aggregator
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id)
+{
+    htri_t ma_status;        /* Whether the metadata aggregator can shrink the EOA */
+    htri_t sda_status;       /* Whether the small data aggregator can shrink the EOA */
+    htri_t ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+
+    if((ma_status = H5MF_aggr_can_shrink_eoa(f, H5FD_MEM_DEFAULT, &(f->shared->meta_aggr))) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query metadata aggregator stats")
+    if(ma_status > 0)
+	if(H5MF_aggr_free(f, dxpl_id, H5FD_MEM_DEFAULT, &(f->shared->meta_aggr)) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+
+    if((sda_status = H5MF_aggr_can_shrink_eoa(f, H5FD_MEM_DRAW, &(f->shared->sdata_aggr))) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
+    if(sda_status > 0)
+	if(H5MF_aggr_free(f, dxpl_id, H5FD_MEM_DRAW, &(f->shared->sdata_aggr)) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+
+    ret_value = (ma_status || sda_status);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_aggrs_try_shrink_eoa() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MFdbg.c b/gatb-core/thirdparty/hdf5/src/H5MFdbg.c
new file mode 100644
index 0000000..b4bb942
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MFdbg.c
@@ -0,0 +1,246 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5MFdbg.c
+ *                      Jan 31 2008
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             File memory management debugging functions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+#define H5MF_DEBUGGING          /* Need access to file space debugging routines */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5MFpkg.h"		/* File memory management		*/
+
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for free space section iterator callback */
+typedef struct {
+    H5FS_t *fspace;             /* Free space manager */
+    FILE *stream;               /* Stream for output */
+    int indent;                 /* Indention amount */
+    int fwidth;                 /* Field width amount */
+} H5MF_debug_iter_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sects_debug_cb
+ *
+ * Purpose:	Prints debugging info about a free space section for a file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		January 31 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sects_debug_cb(H5FS_section_info_t *_sect, void *_udata)
+{
+    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;       /* Section to dump info */
+    H5MF_debug_iter_ud_t *udata = (H5MF_debug_iter_ud_t *)_udata;         /* User data for callbacks */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(sect);
+    HDassert(udata);
+
+    /* Print generic section information */
+    HDfprintf(udata->stream, "%*s%-*s %s\n", udata->indent, "", udata->fwidth,
+	      "Section type:",
+	      (sect->sect_info.type == H5MF_FSPACE_SECT_SIMPLE ? "simple" : "unknown"));
+    HDfprintf(udata->stream, "%*s%-*s %a\n", udata->indent, "", udata->fwidth,
+	      "Section address:",
+	      sect->sect_info.addr);
+    HDfprintf(udata->stream, "%*s%-*s %Hu\n", udata->indent, "", udata->fwidth,
+	      "Section size:",
+	      sect->sect_info.size);
+    HDfprintf(udata->stream, "%*s%-*s %Hu\n", udata->indent, "", udata->fwidth,
+	      "End of section:",
+	      (haddr_t)((sect->sect_info.addr + sect->sect_info.size) - 1));
+    HDfprintf(udata->stream, "%*s%-*s %s\n", udata->indent, "", udata->fwidth,
+	      "Section state:",
+	      (sect->sect_info.state == H5FS_SECT_LIVE ? "live" : "serialized"));
+
+    /* Dump section-specific debugging information */
+    if(H5FS_sect_debug(udata->fspace, _sect, udata->stream, udata->indent + 3, MAX(0, udata->fwidth - 3)) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_BADITER, FAIL, "can't dump section's debugging info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_sects_debug_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sects_dump
+ *
+ * Purpose:	Prints debugging info about free space sections for a file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan 31 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_sects_dump(H5F_t *f, hid_t dxpl_id, FILE *stream)
+{
+    haddr_t eoa;                        /* End of allocated space in the file */
+    haddr_t ma_addr = HADDR_UNDEF;      /* Base "metadata aggregator" address */
+    hsize_t ma_size = 0;                /* Size of "metadata aggregator" */
+    haddr_t sda_addr = HADDR_UNDEF;     /* Base "small data aggregator" address */
+    hsize_t sda_size = 0;               /* Size of "small data aggregator" */
+    H5FD_mem_t type;                    /* Memory type for iteration */
+    int indent = 0;                     /* Amount to indent */
+    int fwidth = 50;                    /* Field width */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Dumping file free space sections\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(stream);
+
+    /* Retrieve the 'eoa' for the file */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: for type = H5FD_MEM_DEFAULT, eoa = %a\n", FUNC, eoa);
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* Retrieve metadata aggregator info, if available */
+    H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: ma_addr = %a, ma_size = %Hu, end of ma = %a\n", FUNC, ma_addr, ma_size, (haddr_t)((ma_addr + ma_size) - 1));
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* Retrieve 'small data' aggregator info, if available */
+    H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size);
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: sda_addr = %a, sda_size = %Hu, end of sda = %a\n", FUNC, sda_addr, sda_size, (haddr_t)((sda_addr + sda_size) - 1));
+#endif /* H5MF_ALLOC_DEBUG */
+
+    /* Iterate over all the free space types that have managers and dump each free list's space */
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+        /* Print header for type */
+        HDfprintf(stream, "%*sFile Free Space Info for type = %u:\n", indent, "", (unsigned)type);
+
+        /* Check for this type being mapped to another type */
+        if(H5FD_MEM_DEFAULT == f->shared->fs_type_map[type] ||
+                type == f->shared->fs_type_map[type]) {
+            /* Retrieve the 'eoa' for this file memory type */
+            if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, type)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+            HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "eoa:",
+                      eoa);
+
+            /* Print header for sections */
+            HDfprintf(stream, "%*sSections:\n", indent + 3, "");
+
+            /* If there is a free space manager for this type, iterate over them */
+            if(f->shared->fs_man[type]) {
+                H5MF_debug_iter_ud_t udata;        /* User data for callbacks */
+
+                /* Prepare user data for section iteration callback */
+                udata.fspace = f->shared->fs_man[type];
+                udata.stream = stream;
+                udata.indent = indent + 6;
+                udata.fwidth = MAX(0, fwidth - 6);
+
+                /* Iterate over all the free space sections */
+                if(H5FS_sect_iterate(f, dxpl_id, f->shared->fs_man[type], H5MF_sects_debug_cb, &udata) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
+            } /* end if */
+            else {
+                /* No sections of this type */
+                HDfprintf(stream, "%*s<none>\n", indent + 6, "");
+            } /* end else */
+        } /* end if */
+        else {
+            HDfprintf(stream, "%*sMapped to type = %u\n", indent, "", (unsigned)f->shared->fs_type_map[type]);
+        } /* end else */
+    } /* end for */
+
+done:
+HDfprintf(stderr, "%s: Done dumping file free space sections\n", FUNC);
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_sects_dump() */
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MFpkg.h b/gatb-core/thirdparty/hdf5/src/H5MFpkg.h
new file mode 100644
index 0000000..2071a0a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MFpkg.h
@@ -0,0 +1,176 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Tuesday, January 8, 2008
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5MF package.  Source files outside the H5MF package should
+ *		include H5MFprivate.h instead.
+ */
+#ifndef H5MF_PACKAGE
+#error "Do not include this file outside the H5MF package!"
+#endif
+
+#ifndef _H5MFpkg_H
+#define _H5MFpkg_H
+
+/* Get package's private header */
+#include "H5MFprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5FSprivate.h"	/* File free space                      */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Define this to display information about file allocations */
+/* #define H5MF_ALLOC_DEBUG */
+
+/* Define this to display more information about file allocations */
+/* #define H5MF_ALLOC_DEBUG_MORE */
+
+/* Define this to display more information about block aggregator actions */
+/* #define H5MF_AGGR_DEBUG */
+
+/* Define this to dump free space tracker contents after they've been modified */
+/* #define H5MF_ALLOC_DEBUG_DUMP */
+
+/* Free space section types for file */
+/* (values stored in free space data structures in file) */
+#define H5MF_FSPACE_SECT_SIMPLE         0       /* Section is a range of actual bytes in file */
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* File free space section info */
+typedef struct H5MF_free_section_t {
+    H5FS_section_info_t sect_info;              /* Free space section information (must be first in struct) */
+#ifdef NOT_YET
+    union {
+        struct {
+            H5HF_indirect_t *parent;            /* Indirect block parent for free section's direct block */
+            unsigned par_entry;                 /* Entry of free section's direct block in parent indirect block */
+        } single;
+        struct {
+            struct H5HF_free_section_t *under;  /* Pointer to indirect block underlying row section */
+            unsigned    row;                    /* Row for range of blocks */
+            unsigned    col;                    /* Column for range of blocks */
+            unsigned    num_entries;            /* Number of entries covered */
+
+            /* Fields that aren't stored */
+            hbool_t     checked_out;            /* Flag to indicate that a row section is temporarily out of the free space manager */
+        } row;
+        struct {
+            /* Holds either a pointer to an indirect block (if its "live") or
+             *  the block offset of it's indirect block (if its "serialized")
+             *  (This allows the indirect block that the section is within to
+             *          be compared with other sections, whether it's serialized
+             *          or not)
+             */
+            union {
+                H5HF_indirect_t *iblock;        /* Indirect block for free section */
+                hsize_t iblock_off;             /* Indirect block offset in "heap space" */
+            } u;
+            unsigned    row;                    /* Row for range of blocks */
+            unsigned    col;                    /* Column for range of blocks */
+            unsigned    num_entries;            /* Number of entries covered */
+
+            /* Fields that aren't stored */
+            struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */
+            unsigned    par_entry;              /* Entry within parent indirect section */
+            hsize_t     span_size;              /* Size of space tracked, in "heap space" */
+            unsigned    iblock_entries;         /* Number of entries in indirect block where section is located */
+            unsigned    rc;                     /* Reference count of outstanding row & child indirect sections */
+            unsigned    dir_nrows;              /* Number of direct rows in section */
+            struct H5HF_free_section_t **dir_rows;  /* Array of pointers to outstanding row sections */
+            unsigned    indir_nents;            /* Number of indirect entries in section */
+            struct H5HF_free_section_t **indir_ents; /* Array of pointers to outstanding child indirect sections */
+        } indirect;
+    } u;
+#endif /* NOT_YET */
+} H5MF_free_section_t;
+
+/* Type of "container shrink" operation to perform */
+typedef enum {
+    H5MF_SHRINK_EOA,            /* Section should shrink the EOA value */
+    H5MF_SHRINK_AGGR_ABSORB_SECT,    /* Section should merge into the aggregator block */
+    H5MF_SHRINK_SECT_ABSORB_AGGR     /* Aggregator block should merge into the section */
+} H5MF_shrink_type_t;
+
+/* User data for free space manager section callbacks */
+typedef struct H5MF_sect_ud_t {
+    /* Down */
+    H5F_t *f;                   /* Pointer to file to operate on */
+    hid_t dxpl_id;              /* DXPL for VFD operations */
+    H5FD_mem_t alloc_type;      /* Type of memory being allocated */
+    hbool_t allow_sect_absorb;  /* Whether sections are allowed to absorb a block aggregator */
+    hbool_t allow_eoa_shrink_only;  /* Whether shrinking eoa is allowed only for the section */
+
+    /* Up */
+    H5MF_shrink_type_t shrink;  /* Type of shrink operation to perform */
+    H5F_blk_aggr_t *aggr;       /* Aggregator block to operate on */
+} H5MF_sect_ud_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5MF single section inherits serializable properties from H5FS_section_class_t */
+H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Allocator routines */
+H5_DLL herr_t H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
+H5_DLL herr_t H5MF_alloc_start(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
+H5_DLL herr_t H5MF_sects_dump(H5F_t *f, hid_t dxpl_id, FILE *stream);
+
+/* 'simple' section routines */
+H5_DLL H5MF_free_section_t *H5MF_sect_simple_new(haddr_t sect_off,
+    hsize_t sect_size);
+H5_DLL htri_t H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect,
+    void *udata);
+H5_DLL herr_t H5MF_sect_simple_shrink(H5FS_section_info_t **_sect,
+    void *udata);
+H5_DLL herr_t H5MF_sect_simple_free(H5FS_section_info_t *sect);
+
+/* Block aggregator routines */
+H5_DLL haddr_t H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
+    H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size);
+H5_DLL htri_t H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr,
+    H5FD_mem_t type, haddr_t abs_blk_end, hsize_t extra_requested);
+H5_DLL htri_t H5MF_aggr_can_absorb(const H5F_t *f, const H5F_blk_aggr_t *aggr,
+    const H5MF_free_section_t *sect, H5MF_shrink_type_t *shrink);
+H5_DLL herr_t H5MF_aggr_absorb(const H5F_t *f, H5F_blk_aggr_t *aggr,
+    H5MF_free_section_t *sect, hbool_t allow_sect_absorb);
+H5_DLL herr_t H5MF_aggr_query(const H5F_t *f, const H5F_blk_aggr_t *aggr,
+    haddr_t *addr, hsize_t *size);
+
+/* Testing routines */
+#ifdef H5MF_TESTING
+#endif /* H5MF_TESTING */
+
+#endif /* _H5MFpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MFprivate.h b/gatb-core/thirdparty/hdf5/src/H5MFprivate.h
new file mode 100644
index 0000000..97c7aa3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MFprivate.h
@@ -0,0 +1,93 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5MFprivate.h
+ *                      Jul 11 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Private header file for file memory management.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5MFprivate_H
+#define _H5MFprivate_H
+
+/* Private headers needed by this file */
+#include "H5Fprivate.h"         /* File access				*/
+#include "H5FDprivate.h"	/* File Drivers				*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/*
+ * Feature: Define H5MF_DEBUG on the compiler command line if you want to
+ *	    see diagnostics from this layer.
+ */
+#ifdef NDEBUG
+#  undef H5MF_DEBUG
+#endif
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* File space manager routines */
+H5_DLL herr_t H5MF_init_merge_flags(H5F_t *f);
+H5_DLL herr_t H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space,
+    hsize_t *meta_size);
+H5_DLL herr_t H5MF_close(H5F_t *f, hid_t dxpl_id);
+
+/* File space allocation routines */
+H5_DLL haddr_t H5MF_alloc(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+H5_DLL haddr_t H5MF_aggr_vfd_alloc(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
+H5_DLL herr_t H5MF_xfree(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+			  hsize_t size);
+H5_DLL herr_t H5MF_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+    haddr_t addr, hsize_t size, hsize_t extra_requested);
+H5_DLL htri_t H5MF_try_shrink(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id,
+    haddr_t addr, hsize_t size);
+
+/* File 'temporary' space allocation routines */
+H5_DLL haddr_t H5MF_alloc_tmp(H5F_t *f, hsize_t size);
+
+/* 'block aggregator' routines */
+H5_DLL herr_t H5MF_free_aggrs(H5F_t *f, hid_t dxpl_id);
+H5_DLL htri_t H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id);
+
+/* Debugging routines */
+#ifdef H5MF_DEBUGGING
+#ifdef NOT_YET
+H5_DLL herr_t H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth);
+#endif /* NOT_YET */
+#endif /* H5MF_DEBUGGING */
+
+#endif /* end _H5MFprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MFsection.c b/gatb-core/thirdparty/hdf5/src/H5MFsection.c
new file mode 100644
index 0000000..bc147ed
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MFsection.c
@@ -0,0 +1,537 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *              Tuesday, January  8, 2008
+ *
+ * Purpose:	Free space section callbacks for file.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5MFpkg.h"		/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* 'simple' section callbacks */
+static H5FS_section_info_t *H5MF_sect_simple_deserialize(const H5FS_section_class_t *cls,
+    hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
+    unsigned *des_flags);
+static htri_t H5MF_sect_simple_can_merge(const H5FS_section_info_t *sect1,
+    const H5FS_section_info_t *sect2, void *udata);
+static herr_t H5MF_sect_simple_merge(H5FS_section_info_t *sect1,
+    H5FS_section_info_t *sect2, void *udata);
+static herr_t H5MF_sect_simple_valid(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *sect);
+static H5FS_section_info_t *H5MF_sect_simple_split(H5FS_section_info_t *sect,
+    hsize_t frag_size);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Class info for "simple" free space sections */
+H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1] = {{
+    /* Class variables */
+    H5MF_FSPACE_SECT_SIMPLE,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM | H5FS_CLS_ADJUST_OK, /* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    NULL,				/* Initialize section class     */
+    NULL,				/* Terminate section class      */
+
+    /* Object methods */
+    NULL,				/* Add section                  */
+    NULL,				/* Serialize section            */
+    H5MF_sect_simple_deserialize,	/* Deserialize section          */
+    H5MF_sect_simple_can_merge,		/* Can sections merge?          */
+    H5MF_sect_simple_merge,		/* Merge sections               */
+    H5MF_sect_simple_can_shrink,	/* Can section shrink container?*/
+    H5MF_sect_simple_shrink,		/* Shrink container w/section   */
+    H5MF_sect_simple_free,		/* Free section                 */
+    H5MF_sect_simple_valid,		/* Check validity of section    */
+    H5MF_sect_simple_split,		/* Split section node for alignment */
+    NULL,				/* Dump debugging for section   */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5MF_free_section_t struct */
+H5FL_DEFINE(H5MF_free_section_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_new
+ *
+ * Purpose:	Create a new 'simple' section and return it to the caller
+ *
+ * Return:	Pointer to new section on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		January  8 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5MF_free_section_t *
+H5MF_sect_simple_new(haddr_t sect_off, hsize_t sect_size)
+{
+    H5MF_free_section_t *sect = NULL;   /* 'Simple' free space section to add */
+    H5MF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments.  */
+    HDassert(sect_size);
+
+    /* Create free space section node */
+    if(NULL == (sect = H5FL_MALLOC(H5MF_free_section_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct block free list section")
+
+    /* Set the information passed in */
+    sect->sect_info.addr = sect_off;
+    sect->sect_info.size = sect_size;
+
+    /* Set the section's class & state */
+    sect->sect_info.type = H5MF_FSPACE_SECT_SIMPLE;
+    sect->sect_info.state = H5FS_SECT_LIVE;
+
+    /* Set return value */
+    ret_value = sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MF_sect_simple_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_deserialize
+ *
+ * Purpose:	Deserialize a buffer into a "live" single section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5MF_sect_simple_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
+    hid_t H5_ATTR_UNUSED dxpl_id, const uint8_t H5_ATTR_UNUSED *buf, haddr_t sect_addr,
+    hsize_t sect_size, unsigned H5_ATTR_UNUSED *des_flags)
+{
+    H5MF_free_section_t *sect;          /* New section */
+    H5FS_section_info_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(H5F_addr_defined(sect_addr));
+    HDassert(sect_size);
+
+    /* Create free space section for block */
+    if(NULL == (sect = H5MF_sect_simple_new(sect_addr, sect_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't initialize free space section")
+
+    /* Set return value */
+    ret_value = (H5FS_section_info_t *)sect;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_simple_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_can_merge
+ *
+ * Purpose:	Can two sections of this type merge?
+ *
+ * Note:        Second section must be "after" first section
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5MF_sect_simple_can_merge(const H5FS_section_info_t *_sect1,
+    const H5FS_section_info_t *_sect2, void H5_ATTR_UNUSED *_udata)
+{
+    const H5MF_free_section_t *sect1 = (const H5MF_free_section_t *)_sect1;   /* File free section */
+    const H5MF_free_section_t *sect2 = (const H5MF_free_section_t *)_sect2;   /* File free section */
+    htri_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect2);
+    HDassert(sect1->sect_info.type == sect2->sect_info.type);   /* Checks "MERGE_SYM" flag */
+    HDassert(H5F_addr_lt(sect1->sect_info.addr, sect2->sect_info.addr));
+
+    /* Check if second section adjoins first section */
+    ret_value = H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_simple_can_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_merge
+ *
+ * Purpose:	Merge two sections of this type
+ *
+ * Note:        Second section always merges into first node
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_simple_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+    void H5_ATTR_UNUSED *_udata)
+{
+    H5MF_free_section_t *sect1 = (H5MF_free_section_t *)_sect1;   /* File free section */
+    H5MF_free_section_t *sect2 = (H5MF_free_section_t *)_sect2;   /* File free section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect1->sect_info.type == H5MF_FSPACE_SECT_SIMPLE);
+    HDassert(sect2);
+    HDassert(sect2->sect_info.type == H5MF_FSPACE_SECT_SIMPLE);
+    HDassert(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr));
+
+    /* Add second section's size to first section */
+    sect1->sect_info.size += sect2->sect_info.size;
+
+    /* Get rid of second section */
+    if(H5MF_sect_simple_free((H5FS_section_info_t *)sect2) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_simple_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_can_shrink
+ *
+ * Purpose:	Can this section shrink the container?
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
+{
+    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    haddr_t eoa;                /* End of address space in the file */
+    haddr_t end;                /* End of section to extend */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Retrieve the end of the file's address space */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(udata->f->shared->lf, udata->alloc_type)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* Compute address of end of section to check */
+    end = sect->sect_info.addr + sect->sect_info.size;
+
+    /* Check if the section is exactly at the end of the allocated space in the file */
+    if(H5F_addr_eq(end, eoa)) {
+        /* Set the shrinking type */
+        udata->shrink = H5MF_SHRINK_EOA;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section {%a, %Hu}, shrinks file, eoa = %a\n", FUNC, sect->sect_info.addr, sect->sect_info.size, eoa);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+        /* Indicate shrinking can occur */
+        HGOTO_DONE(TRUE)
+    } /* end if */
+    else {
+        /* Shrinking can't occur if the 'eoa_shrink_only' flag is set and we're not shrinking the EOA */
+        if(udata->allow_eoa_shrink_only)
+            HGOTO_DONE(FALSE)
+
+        /* Check if this section is allowed to merge with metadata aggregation block */
+        if(udata->f->shared->fs_aggr_merge[udata->alloc_type] & H5F_FS_MERGE_METADATA) {
+            htri_t status;              /* Status from aggregator adjoin */
+
+            /* See if section can absorb the aggregator & vice versa */
+            if((status = H5MF_aggr_can_absorb(udata->f, &(udata->f->shared->meta_aggr), sect, &(udata->shrink))) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "error merging section with aggregation block")
+            else if(status > 0) {
+                /* Set the aggregator to operate on */
+                udata->aggr = &(udata->f->shared->meta_aggr);
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section {%a, %Hu}, adjoins metadata aggregator\n", FUNC, sect->sect_info.addr, sect->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+                /* Indicate shrinking can occur */
+                HGOTO_DONE(TRUE)
+            } /* end if */
+        } /* end if */
+
+        /* Check if this section is allowed to merge with small 'raw' aggregation block */
+        if(udata->f->shared->fs_aggr_merge[udata->alloc_type] & H5F_FS_MERGE_RAWDATA) {
+            htri_t status;              /* Status from aggregator adjoin */
+
+            /* See if section can absorb the aggregator & vice versa */
+            if((status = H5MF_aggr_can_absorb(udata->f, &(udata->f->shared->sdata_aggr), sect, &(udata->shrink))) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "error merging section with aggregation block")
+            else if(status > 0) {
+                /* Set the aggregator to operate on */
+                udata->aggr = &(udata->f->shared->sdata_aggr);
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section {%a, %Hu}, adjoins small data aggregator\n", FUNC, sect->sect_info.addr, sect->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+                /* Indicate shrinking can occur */
+                HGOTO_DONE(TRUE)
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Set return value */
+    ret_value = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_simple_can_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_shrink
+ *
+ * Purpose:	Shrink container with section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_sect_simple_shrink(H5FS_section_info_t **_sect, void *_udata)
+{
+    H5MF_free_section_t **sect = (H5MF_free_section_t **)_sect;   /* File free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Check for shrinking file */
+    if(H5MF_SHRINK_EOA == udata->shrink) {
+        /* Sanity check */
+        HDassert(H5F_INTENT(udata->f) & H5F_ACC_RDWR);
+
+        /* Release section's space at EOA with file driver */
+        if(H5FD_free(udata->f->shared->lf, udata->dxpl_id, udata->alloc_type, udata->f, (*sect)->sect_info.addr, (*sect)->sect_info.size) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "driver free request failed")
+    } /* end if */
+    else {
+        /* Sanity check */
+        HDassert(udata->aggr);
+
+        /* Absorb the section into the aggregator or vice versa */
+        if(H5MF_aggr_absorb(udata->f, udata->aggr, *sect, udata->allow_sect_absorb) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "can't absorb section into aggregator or vice versa")
+    } /* end else */
+
+    /* Check for freeing section */
+    if(udata->shrink != H5MF_SHRINK_SECT_ABSORB_AGGR) {
+        /* Free section */
+        if(H5MF_sect_simple_free((H5FS_section_info_t *)*sect) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+
+        /* Mark section as freed, for free space manager */
+        *sect = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_simple_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_free
+ *
+ * Purpose:	Free a 'single' section node
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_sect_simple_free(H5FS_section_info_t *_sect)
+{
+    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;   /* File free section */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Release the section */
+    sect = H5FL_FREE(H5MF_free_section_t, sect);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5MF_sect_simple_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_valid
+ *
+ * Purpose:	Check the validity of a section
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_simple_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
+    const H5FS_section_info_t
+#ifdef NDEBUG
+    H5_ATTR_UNUSED
+#endif /* NDEBUG */
+    *_sect)
+{
+#ifndef NDEBUG
+    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
+#endif /* NDEBUG */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5MF_sect_simple_valid() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_simple_split
+ *
+ * Purpose:	Split SECT into 2 sections: fragment for alignment & the aligned section
+ *		SECT's addr and size are updated to point to the aligned section
+ *
+ * Return:	Success:	the fragment for aligning sect
+ *		Failure:	null
+ *
+ * Programmer:	Vailin Choi, July 29, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5MF_sect_simple_split(H5FS_section_info_t *sect, hsize_t frag_size)
+{
+    H5MF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate space for new section */
+    if(NULL == (ret_value = H5MF_sect_simple_new(sect->addr, frag_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't initialize free space section")
+
+    /* Set new section's info */
+    sect->addr += frag_size;
+    sect->size -= frag_size;
+
+done:
+    FUNC_LEAVE_NOAPI((H5FS_section_info_t *)ret_value)
+} /* end H5MF_sect_simple_split() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MM.c b/gatb-core/thirdparty/hdf5/src/H5MM.c
new file mode 100644
index 0000000..c5450fe
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MM.c
@@ -0,0 +1,262 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5MM.c
+ *			Jul 10 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Memory management functions.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+#include "H5private.h"
+#include "H5Eprivate.h"
+#include "H5MMprivate.h"
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MM_malloc
+ *
+ * Purpose:     Similar to the C89 version of malloc().
+ *
+ *              On size of 0, we return a NULL pointer instead of the
+ *              standard-allowed 'special' pointer since that's more
+ *              difficult to check as a return value. This is still
+ *              considered an error condition since allocations of zero
+ *              bytes usually indicate problems.
+ *  
+ * Return:  Success:    Pointer new memory
+ *
+ *          Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Nov  8 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MM_malloc(size_t size)
+{
+    void *ret_value;
+
+    HDassert(size);
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(size)
+        ret_value = HDmalloc(size);
+    else
+        ret_value = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5MM_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MM_calloc
+ *
+ * Purpose:     Similar to the C89 version of calloc(), except this
+ *              routine just takes a 'size' parameter.
+ *
+ *              On size of 0, we return a NULL pointer instead of the
+ *              standard-allowed 'special' pointer since that's more
+ *              difficult to check as a return value. This is still
+ *              considered an error condition since allocations of zero
+ *              bytes usually indicate problems.
+ *
+ *
+ * Return:  Success:    Pointer new memory
+ *
+ *          Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Nov  8 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MM_calloc(size_t size)
+{
+    void *ret_value;
+
+    HDassert(size);
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(size)
+        ret_value = HDcalloc((size_t)1, size);
+    else
+        ret_value = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5MM_calloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MM_realloc
+ *
+ * Purpose:     Similar semantics as C89's realloc(). Specifically, the
+ *              following calls are equivalent:
+ *
+ *              H5MM_realloc(NULL, size)    <==> H5MM_malloc(size)
+ *              H5MM_realloc(ptr, 0)        <==> H5MM_xfree(ptr)
+ *              H5MM_realloc(NULL, 0)       <==> NULL
+ *
+ *              Note that the (NULL, 0) combination is undefined behavior
+ *              in the C standard.
+ *
+ * Return:  Success:    Ptr to new memory if size > 0
+ *                      NULL if size is zero
+ *
+ *          Failure:    NULL (input buffer is unchanged on failure)
+ *
+ * Programmer:  Robb Matzke
+ *              Jul 10 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MM_realloc(void *mem, size_t size)
+{
+    void *ret_value;
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mem || size);
+
+    if(NULL == mem && 0 == size) {  
+        /* Not defined in the standard, return NULL */
+        ret_value = NULL;
+    }
+    else {
+        ret_value = HDrealloc(mem, size);
+
+        /* Some platforms do not return NULL if size is zero. */
+        if(0 == size)
+            ret_value = NULL;
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MM_realloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MM_xstrdup
+ *
+ * Purpose:     Duplicates a string, including memory allocation.
+ *              NULL is an acceptable value for the input string.
+ *
+ * Return:      Success:    Pointer to a new string (NULL if s is NULL).
+ *
+ *              Failure:    abort()
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 10 1997
+ *-------------------------------------------------------------------------
+ */
+char *
+H5MM_xstrdup(const char *s)
+{
+    char	*ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(s) {
+        if(NULL == (ret_value = (char *)H5MM_malloc(HDstrlen(s) + 1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HDstrcpy(ret_value, s);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MM_xstrdup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MM_strdup
+ *
+ * Purpose:     Duplicates a string, including memory allocation.
+ *              NULL is NOT an acceptable value for the input string.
+ *
+ *              If the string to be duplicated is the NULL pointer, then
+ *              an error will be raised.
+ *
+ * Return:      Success:    Pointer to a new string
+ *
+ *              Failure:    abort()
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 10 1997
+ *-------------------------------------------------------------------------
+ */
+char *
+H5MM_strdup(const char *s)
+{
+    char	*ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(!s)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "null string")
+    if(NULL == (ret_value = (char *)H5MM_malloc(HDstrlen(s) + 1)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDstrcpy(ret_value, s);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MM_strdup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MM_xfree
+ *
+ * Purpose:	Just like free(3) except null pointers are allowed as
+ *		arguments, and the return value (always NULL) can be
+ *		assigned to the pointer whose memory was just freed:
+ *
+ *			thing = H5MM_xfree (thing);
+ *
+ * Return:	Success:	NULL
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 10 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MM_xfree(void *mem)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(mem)
+        HDfree(mem);
+
+    FUNC_LEAVE_NOAPI(NULL);
+} /* end H5MM_xfree() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5MMprivate.h b/gatb-core/thirdparty/hdf5/src/H5MMprivate.h
new file mode 100644
index 0000000..0d608b2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MMprivate.h
@@ -0,0 +1,48 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5MMprivate.h
+ *                      Jul 10 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Private header for memory management.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5MMprivate_H
+#define _H5MMprivate_H
+
+#include "H5MMpublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"
+
+#define H5MM_free(Z)	HDfree(Z)
+
+/*
+ * Library prototypes...
+ */
+H5_DLL void *H5MM_malloc(size_t size);
+H5_DLL void *H5MM_calloc(size_t size);
+H5_DLL void *H5MM_realloc(void *mem, size_t size);
+H5_DLL char *H5MM_xstrdup(const char *s);
+H5_DLL char *H5MM_strdup(const char *s);
+H5_DLL void *H5MM_xfree(void *mem);
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5MMpublic.h b/gatb-core/thirdparty/hdf5/src/H5MMpublic.h
new file mode 100644
index 0000000..bfcb807
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MMpublic.h
@@ -0,0 +1,47 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5MMproto.h
+ *                      Jul 10 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public declarations for the H5MM (memory management)
+ *                      package.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5MMpublic_H
+#define _H5MMpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/* These typedefs are currently used for VL datatype allocation/freeing */
+typedef void *(*H5MM_allocate_t)(size_t size, void *alloc_info);
+typedef void (*H5MM_free_t)(void *mem, void *free_info);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5MMpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MP.c b/gatb-core/thirdparty/hdf5/src/H5MP.c
new file mode 100644
index 0000000..4820b76
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MP.c
@@ -0,0 +1,473 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5MP.c
+ *			May  2 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Implements memory pools.  (Similar to Apache's APR
+ *                      memory pools)
+ *
+ *                      Please see the documentation in:
+ *                      doc/html/TechNotes/MemoryPools.html for a full description
+ *                      of how they work, etc.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5MP_PACKAGE		/*suppress error about including H5MPpkg  */
+
+/* Private headers */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5MPpkg.h"		/* Memory Pools				*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Minimum sized block */
+#define H5MP_MIN_BLOCK  (H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)) + H5MP_BLOCK_ALIGNMENT)
+
+/* First block in page */
+#define H5MP_PAGE_FIRST_BLOCK(p) \
+    (H5MP_page_blk_t *)((unsigned char *)(p) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)))
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/********************************/
+/* Package Variable Definitions */
+/********************************/
+
+
+/********************/
+/* Static Variables */
+/********************/
+
+/* Declare a free list to manage the H5MP_pool_t struct */
+H5FL_DEFINE(H5MP_pool_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_create
+ *
+ * Purpose:	Create a new memory pool
+ *
+ * Return:	Pointer to the memory pool "header" on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5MP_pool_t *
+H5MP_create(size_t page_size, unsigned flags)
+{
+    H5MP_pool_t *mp = NULL;             /* New memory pool header */
+    H5MP_pool_t *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate space for the pool header */
+    if(NULL == (mp = H5FL_MALLOC(H5MP_pool_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for memory pool header")
+
+    /* Assign information */
+    mp->page_size = H5MP_BLOCK_ALIGN(page_size);
+    mp->flags = flags;
+
+    /* Initialize information */
+    mp->free_size = 0;
+    mp->first = NULL;
+    mp->max_size = mp->page_size - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t));
+
+    /* Create factory for pool pages */
+    if(NULL == (mp->page_fac = H5FL_fac_init(page_size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't create page factory")
+
+    /* Set return value */
+    ret_value = mp;
+
+done:
+    if(NULL == ret_value && mp)
+        if(H5MP_close(mp) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, NULL, "unable to free memory pool header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MP_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_new_page
+ *
+ * Purpose:	Allocate new page for a memory pool
+ *
+ * Return:	Pointer to the page allocated on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5MP_page_t *
+H5MP_new_page(H5MP_pool_t *mp, size_t page_size)
+{
+    H5MP_page_t *new_page;              /* New page created */
+    H5MP_page_blk_t *first_blk;         /* Pointer to first block in page */
+    H5MP_page_t *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(mp);
+    HDassert(page_size >= mp->page_size);
+
+    /* Allocate page */
+    if(page_size > mp->page_size) {
+        if(NULL == (new_page = (H5MP_page_t *)H5MM_malloc(page_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page")
+        new_page->free_size = page_size - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t));
+        new_page->fac_alloc = FALSE;
+    } /* end if */
+    else {
+        if(NULL == (new_page = (H5MP_page_t *)H5FL_FAC_MALLOC(mp->page_fac)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page")
+        new_page->free_size = mp->max_size;
+        new_page->fac_alloc = TRUE;
+    } /* end else */
+#ifdef QAK
+HDfprintf(stderr,"%s: Allocating new page = %p\n", FUNC, new_page);
+#endif /* QAK */
+
+    /* Initialize page information */
+    first_blk = H5MP_PAGE_FIRST_BLOCK(new_page);
+    first_blk->size = new_page->free_size;
+    first_blk->page = new_page;
+    first_blk->is_free = TRUE;
+    first_blk->prev = NULL;
+    first_blk->next = NULL;
+
+    /* Insert into page list */
+    new_page->prev = NULL;
+    new_page->next = mp->first;
+    if(mp->first)
+        mp->first->prev = new_page;
+    mp->first = new_page;
+
+    /* Account for new free space */
+    new_page->free_blk = first_blk;
+    mp->free_size += new_page->free_size;
+
+    /* Assign return value */
+    ret_value = new_page;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MP_new_page() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_malloc
+ *
+ * Purpose:	Allocate space in a memory pool
+ *
+ * Return:	Pointer to the space allocated on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MP_malloc (H5MP_pool_t *mp, size_t request)
+{
+    H5MP_page_t *alloc_page = NULL; /* Page to allocate space from */
+    H5MP_page_blk_t *alloc_free;    /* Pointer to free space in page */
+    size_t needed;                  /* Size requested, plus block header and alignment */
+    void *ret_value;                /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(mp);
+    HDassert(request > 0);
+
+    /* Compute actual size needed */
+    needed = H5MP_BLOCK_ALIGN(request) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t));
+#ifdef QAK
+HDfprintf(stderr,"%s: sizeof(H5MP_page_blk_t) = %Zu\n", FUNC, sizeof(H5MP_page_blk_t));
+HDfprintf(stderr,"%s: request = %Zu, needed = %Zu\n", FUNC, request, needed);
+#endif /* QAK */
+
+    /* See if the request can be handled by existing free space */
+    if(needed <= mp->free_size) {
+        size_t pool_free_avail;      /* Amount of free space possibly available in pool */
+
+        /* Locate page with enough free space */
+        alloc_page = mp->first;
+        pool_free_avail = mp->free_size;
+        while(alloc_page && pool_free_avail >= needed) {
+            /* If we found a page with enough free space, search for large
+             * enough free block on that page */
+            if(alloc_page->free_size >= needed) {
+                size_t page_free_avail;      /* Amount of free space possibly available */
+
+                /* Locate large enough block */
+                alloc_free = alloc_page->free_blk;
+                page_free_avail = alloc_page->free_size;
+                while(alloc_free && page_free_avail >= needed) {
+                    if(alloc_free->is_free) {
+                        /* If we found a large enough block, leave now */
+                        if(alloc_free->size >= needed)
+                            goto found;     /* Needed to escape double "while" loop */
+
+                        /* Decrement amount of potential space left */
+                        page_free_avail -= alloc_free->size;
+                    } /* end if */
+
+                    /* Go to next block */
+                    alloc_free = alloc_free->next;
+                } /* end while */
+            } /* end if */
+
+            /* Decrement amount of potential space left */
+            pool_free_avail -= alloc_page->free_size;
+
+            /* Go to next page */
+            alloc_page = alloc_page->next;
+        } /* end while */
+    } /* end if */
+
+    {
+        size_t page_size;       /* Size of page needed */
+
+        /* Check if the request is too large for a standard page */
+        page_size = (needed > mp->max_size) ?
+            (needed + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t))) : mp->page_size;
+
+        /* Allocate new page */
+        if(NULL == (alloc_page = H5MP_new_page(mp, page_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page")
+
+        /* Set the block to allocate from */
+        alloc_free = alloc_page->free_blk;
+    } /* end block */
+
+    /* Allocate space in page */
+found:
+
+    /* Sanity check */
+    HDassert(alloc_page);
+    HDassert(alloc_free);
+
+    /* Check if we can subdivide the free space */
+    if(alloc_free->size > (needed + H5MP_MIN_BLOCK)) {
+        H5MP_page_blk_t *new_free;          /* New free block created */
+
+        /* Carve out new free block after block to allocate */
+        new_free = (H5MP_page_blk_t *)(((unsigned char *)alloc_free) + needed);
+
+        /* Link into existing lists */
+        new_free->next = alloc_free->next;
+        if(alloc_free->next)
+            alloc_free->next->prev = new_free;
+        new_free->prev = alloc_free;
+        alloc_free->next = new_free;
+
+        /* Set blocks' information */
+        new_free->size = alloc_free->size - needed;
+        new_free->is_free = TRUE;
+        new_free->page = alloc_free->page;
+        alloc_free->size = needed;
+        alloc_free->is_free = FALSE;
+    } /* end if */
+    else {
+        /* Use whole free space block for new block */
+        alloc_free->is_free = FALSE;
+    } /* end else */
+
+    /* Update page & pool's free size information */
+    alloc_page->free_size -= alloc_free->size;
+    if(alloc_page->free_blk == alloc_free)
+        alloc_page->free_blk = alloc_free->next;
+    mp->free_size -= alloc_free->size;
+
+    /* Set new space pointer for the return value */
+    ret_value = ((unsigned char *)alloc_free) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t));
+#ifdef QAK
+HDfprintf(stderr,"%s: Allocating space from page, ret_value = %p\n", FUNC, ret_value);
+#endif /* QAK */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MP_malloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_free
+ *
+ * Purpose:	Release space in a memory pool
+ *
+ * Return:	NULL on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  3 2005
+ *
+ * Note:        Should we release pages that have no used blocks?
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5MP_free(H5MP_pool_t *mp, void *spc)
+{
+    H5MP_page_blk_t *spc_blk;           /* Block for space to free */
+    H5MP_page_t *spc_page;              /* Page containing block to free */
+    void *ret_value = NULL;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(mp);
+    HDassert(spc);
+
+    /* Get block header for space to free */
+    spc_blk = (H5MP_page_blk_t *)(((unsigned char *)spc) - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)));
+
+    /* Mark block as free */
+    HDassert(spc_blk->is_free == FALSE);
+    spc_blk->is_free = TRUE;
+
+    /* Add it's space to the amount of free space in the page & pool */
+    spc_page = spc_blk->page;
+#ifdef QAK
+HDfprintf(stderr,"%s: Freeing from page = %p\n", "H5MP_free", spc_page);
+#endif /* QAK */
+    spc_page->free_size += spc_blk->size;
+    mp->free_size += spc_blk->size;
+
+    /* Move page with newly freed space to front of list of pages in pool */
+    if(spc_page != mp->first) {
+        /* Remove page from list */
+        spc_page->prev->next = spc_page->next;
+        if(spc_page->next)
+            spc_page->next->prev = spc_page->prev;
+
+        /* Insert page at beginning of list */
+        spc_page->prev = NULL;
+        spc_page->next = mp->first;
+        mp->first->prev = spc_page;
+        mp->first = spc_page;
+    } /* end if */
+
+    /* Check if block can be merged with free space after it on page */
+    if(spc_blk->next != NULL) {
+        H5MP_page_blk_t *next_blk;          /* Block following space to free */
+
+        next_blk = spc_blk->next;
+        HDassert(next_blk->prev == spc_blk);
+        if(next_blk->is_free) {
+            spc_blk->size += next_blk->size;
+            spc_blk->next = next_blk->next;
+        } /* end if */
+    } /* end if */
+
+    /* Check if block can be merged with free space before it on page */
+    if(spc_blk->prev != NULL) {
+        H5MP_page_blk_t *prev_blk;          /* Block before space to free */
+
+        prev_blk = spc_blk->prev;
+        HDassert(prev_blk->next == spc_blk);
+        if(prev_blk->is_free) {
+            prev_blk->size += spc_blk->size;
+            prev_blk->next = spc_blk->next;
+        } /* end if */
+    } /* end if */
+
+    /* Check if the block freed becomes the first free block on the page */
+    if(spc_page->free_blk == NULL || spc_blk < spc_page->free_blk)
+        spc_page->free_blk = spc_blk;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MP_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_close
+ *
+ * Purpose:	Release all memory for a pool and destroy pool
+ *
+ * Return:	Non-negative on success/negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		May  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MP_close(H5MP_pool_t *mp)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Release memory for pool pages */
+    if(mp->first != NULL) {
+        H5MP_page_t *page, *next_page;  /* Pointer to pages in pool */
+
+        /* Iterate through pages, releasing them */
+        page = mp->first;
+        while(page) {
+            next_page = page->next;
+
+            /* Free the page appropriately */
+            if(page->fac_alloc)
+                page = (H5MP_page_t *)H5FL_FAC_FREE(mp->page_fac, page);
+            else
+                page = (H5MP_page_t *)H5MM_xfree(page);
+
+            page = next_page;
+        } /* end while */
+    } /* end if */
+
+    /* Release page factory */
+    if(mp->page_fac)
+        if(H5FL_fac_term(mp->page_fac) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy page factory")
+
+done:
+    /* Free the memory pool itself */
+    mp = H5FL_FREE(H5MP_pool_t, mp);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5MP_close() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MPpkg.h b/gatb-core/thirdparty/hdf5/src/H5MPpkg.h
new file mode 100644
index 0000000..5a0b1f8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MPpkg.h
@@ -0,0 +1,106 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Monday, May  2, 2005
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5MP package.  Source files outside the H5MP package should
+ *		include H5MPprivate.h instead.
+ */
+#ifndef H5MP_PACKAGE
+#error "Do not include this file outside the H5MP package!"
+#endif
+
+#ifndef _H5MPpkg_H
+#define _H5MPpkg_H
+
+/* Get package's private header */
+#include "H5MPprivate.h"	/* Memory Pools				*/
+
+/* Other private headers needed by this file */
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Alignment macros */
+/* (Ideas from Apache APR :-) */
+
+/* Default alignment necessary */
+#define H5MP_BLOCK_ALIGNMENT    8
+
+/* General alignment macro */
+/* (this only works for aligning to power of 2 boundary) */
+#define H5MP_ALIGN(x, a) \
+       (((x) + ((size_t)(a)) - 1) & ~(((size_t)(a)) - 1))
+
+/* Default alignment */
+#define H5MP_BLOCK_ALIGN(x) H5MP_ALIGN(x, H5MP_BLOCK_ALIGNMENT)
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Free block in pool */
+typedef struct H5MP_page_blk_t {
+    size_t size;                        /* Size of block (includes this H5MP_page_blk_t info) */
+    unsigned is_free:1;                 /* Flag to indicate the block is free */
+    struct H5MP_page_t *page;           /* Pointer to page block is located in */
+    struct H5MP_page_blk_t *prev;       /* Pointer to previous block in page */
+    struct H5MP_page_blk_t *next;       /* Pointer to next block in page */
+} H5MP_page_blk_t;
+
+/* Memory pool page */
+typedef struct H5MP_page_t {
+    size_t free_size;                   /* Total amount of free space in page */
+    unsigned fac_alloc:1;               /* Flag to indicate the page was allocated by the pool's factory */
+    H5MP_page_blk_t *free_blk;          /* Pointer to first free block in page */
+    struct H5MP_page_t *next;           /* Pointer to next page in pool */
+    struct H5MP_page_t *prev;           /* Pointer to previous page in pool */
+} H5MP_page_t;
+
+/* Memory pool header */
+struct H5MP_pool_t {
+    H5FL_fac_head_t *page_fac;  /* Free-list factory for pages */
+    size_t page_size;           /* Page size for pool */
+    size_t free_size;           /* Total amount of free space in pool */
+    size_t max_size;            /* Maximum block that will fit in a standard page */
+    H5MP_page_t *first;         /* Pointer to first page in pool */
+    unsigned flags;             /* Bit flags for pool settings */
+};
+
+
+/*****************************************/
+/* Package Private Variable Declarations */
+/*****************************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+#ifdef H5MP_TESTING
+H5_DLL herr_t H5MP_get_pool_free_size (const H5MP_pool_t *mp, size_t *free_size);
+H5_DLL htri_t H5MP_pool_is_free_size_correct(const H5MP_pool_t *mp);
+H5_DLL herr_t H5MP_get_pool_first_page(const H5MP_pool_t *mp, H5MP_page_t **page);
+H5_DLL herr_t H5MP_get_page_free_size(const H5MP_page_t *mp, size_t *page);
+H5_DLL herr_t H5MP_get_page_next_page(const H5MP_page_t *page, H5MP_page_t **next_page);
+#endif /* H5MP_TESTING */
+
+#endif /* _H5MPpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5MPprivate.h b/gatb-core/thirdparty/hdf5/src/H5MPprivate.h
new file mode 100644
index 0000000..3fa312c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MPprivate.h
@@ -0,0 +1,62 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5MPprivate.h
+ *			May  2 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Private header for memory pool routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5MPprivate_H
+#define _H5MPprivate_H
+
+/* Include package's public header (not yet) */
+/* #include "H5MPpublic.h" */
+
+/* Private headers needed by this file */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Pool creation flags */
+/* Default settings */
+#define H5MP_FLG_DEFAULT        0
+#define H5MP_PAGE_SIZE_DEFAULT  4096    /* (bytes) */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Memory pool header (defined in H5MPpkg.c) */
+typedef struct H5MP_pool_t H5MP_pool_t;
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+H5_DLL H5MP_pool_t *H5MP_create (size_t page_size, unsigned flags);
+H5_DLL void * H5MP_malloc (H5MP_pool_t *mp, size_t request);
+H5_DLL void * H5MP_free (H5MP_pool_t *mp, void *spc);
+H5_DLL herr_t H5MP_close (H5MP_pool_t *mp);
+
+#endif /* _H5MPprivate_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5MPtest.c b/gatb-core/thirdparty/hdf5/src/H5MPtest.c
new file mode 100644
index 0000000..ccbd140
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5MPtest.c
@@ -0,0 +1,237 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Tuesday, May  3, 2005
+ *
+ * Purpose:	Memory pool testing functions.
+ */
+
+#define H5MP_PACKAGE		/*suppress error about including H5MPpkg  */
+#define H5MP_TESTING		/*include H5MP testing funcs*/
+
+/* Private headers */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5MPpkg.h"		/* Memory Pools				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+
+/* Static Prototypes */
+
+/* Package variables */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_get_pool_free_size
+ *
+ * Purpose:	Retrieve the total amount of free space in entire pool
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May  3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MP_get_pool_free_size(const H5MP_pool_t *mp, size_t *free_size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(mp);
+    HDassert(free_size);
+
+    /* Get memory pool's free space */
+    *free_size = mp->free_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5MP_get_pool_free_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_get_pool_first_page
+ *
+ * Purpose:	Retrieve the first page in a memory pool
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May  3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MP_get_pool_first_page(const H5MP_pool_t *mp, H5MP_page_t **page)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(mp);
+    HDassert(page);
+
+    /* Get memory pool's first page */
+    *page = mp->first;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5MP_get_pool_first_page() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_pool_is_free_size_correct
+ *
+ * Purpose:	Check that the free space reported in each page corresponds
+ *              to the free size in each page and that the free space in the
+ *              free blocks for a page corresponds with the free space for
+ *              the page.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May  3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MP_pool_is_free_size_correct(const H5MP_pool_t *mp)
+{
+    H5MP_page_t *page;          /* Pointer to current page */
+    size_t pool_free;           /* Size of pages' free space */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(mp);
+
+    /* Iterate through pages, checking the free size & accumulating the
+     * free space for all the pages */
+    page = mp->first;
+    pool_free = 0;
+    while(page != NULL) {
+        H5MP_page_blk_t *blk;           /* Pointer to current free block */
+        size_t page_free;               /* Size of blocks on free list */
+
+        /* Iterate through the blocks in page, accumulating free space */
+        blk = (H5MP_page_blk_t *)((unsigned char *)page + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)));
+        page_free = 0;
+        while(blk != NULL) {
+            if(blk->is_free)
+                page_free += blk->size;
+            blk = blk->next;
+        } /* end while */
+
+        /* Check that the free space from the blocks on the free list
+         * corresponds to space in page */
+#ifdef QAK
+HDfprintf(stderr,"%s: page_free = %Zu, page->free_size = %Zu\n", "H5MP_pool_is_free_size_correct", page_free, page->free_size);
+#endif /* QAK */
+        if(page_free != page->free_size)
+            HGOTO_DONE (FALSE)
+
+        /* Increment the amount of free space in pool */
+        pool_free += page->free_size;
+
+        /* Advance to next page */
+        page = page->next;
+    } /* end while */
+
+    /* Check that the free space from the pages
+     * corresponds to free space in pool */
+#ifdef QAK
+HDfprintf(stderr,"%s: pool_free = %Zu, mp->free_size = %Zu\n", "H5MP_pool_is_free_size_correct", pool_free, mp->free_size);
+#endif /* QAK */
+    if(pool_free != mp->free_size)
+        HGOTO_DONE (FALSE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MP_pool_is_free_size_correct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_get_page_free_size
+ *
+ * Purpose:	Retrieve the amount of free space in given page
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May  3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MP_get_page_free_size(const H5MP_page_t *page, size_t *free_size)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(page);
+    HDassert(free_size);
+
+    /* Get memory page's free space */
+    *free_size = page->free_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5MP_get_page_free_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MP_get_page_next_page
+ *
+ * Purpose:	Retrieve the next page in the pool
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May  3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MP_get_page_next_page(const H5MP_page_t *page, H5MP_page_t **next_page)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(page);
+    HDassert(next_page);
+
+    /* Get next memory page */
+    *next_page = page->next;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5MP_get_page_next_page() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5O.c b/gatb-core/thirdparty/hdf5/src/H5O.c
new file mode 100644
index 0000000..38d9f6b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5O.c
@@ -0,0 +1,3531 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5O.c
+ *			Aug  5 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Object header routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5O_init_interface
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5SMprivate.h"        /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for recursive traversal over objects from a group */
+typedef struct {
+    hid_t       obj_id;         /* The ID for the starting group */
+    H5G_loc_t	*start_loc;     /* Location of starting group */
+    hid_t       lapl_id;        /* LAPL for walking across links */
+    hid_t       dxpl_id; 	/* DXPL for operations */
+    H5SL_t     *visited;        /* Skip list for tracking visited nodes */
+    H5O_iterate_t op;           /* Application callback */
+    void       *op_data;        /* Application's op data */
+} H5O_iter_visit_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5O_delete_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+static herr_t H5O_obj_type_real(H5O_t *oh, H5O_type_t *obj_type);
+static herr_t H5O_visit(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, H5O_iterate_t op, void *op_data, hid_t lapl_id,
+    hid_t dxpl_id);
+static herr_t H5O_get_hdr_info_real(const H5O_t *oh, H5O_hdr_info_t *hdr);
+static const H5O_obj_class_t *H5O_obj_class_real(H5O_t *oh);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Header message ID to class mapping */
+
+/* Remember to increment H5O_MSG_TYPES in H5Opkg.h when adding a new
+ * message.
+ */
+
+const H5O_msg_class_t *const H5O_msg_class_g[] = {
+    H5O_MSG_NULL,		/*0x0000 Null				*/
+    H5O_MSG_SDSPACE,		/*0x0001 Dataspace			*/
+    H5O_MSG_LINFO,		/*0x0002 Link information		*/
+    H5O_MSG_DTYPE,		/*0x0003 Datatype			*/
+    H5O_MSG_FILL,       	/*0x0004 Old data storage -- fill value */
+    H5O_MSG_FILL_NEW,		/*0x0005 New data storage -- fill value */
+    H5O_MSG_LINK,		/*0x0006 Link 				*/
+    H5O_MSG_EFL,		/*0x0007 Data storage -- external data files */
+    H5O_MSG_LAYOUT,		/*0x0008 Data Layout			*/
+#ifdef H5O_ENABLE_BOGUS
+    H5O_MSG_BOGUS,		/*0x0009 "Bogus" (for testing)		*/
+#else /* H5O_ENABLE_BOGUS */
+    NULL,			/*0x0009 "Bogus" (for testing)		*/
+#endif /* H5O_ENABLE_BOGUS */
+    H5O_MSG_GINFO,		/*0x000A Group information		*/
+    H5O_MSG_PLINE,		/*0x000B Data storage -- filter pipeline */
+    H5O_MSG_ATTR,		/*0x000C Attribute			*/
+    H5O_MSG_NAME,		/*0x000D Object name			*/
+    H5O_MSG_MTIME,		/*0x000E Object modification date and time */
+    H5O_MSG_SHMESG,		/*0x000F File-wide shared message table */
+    H5O_MSG_CONT,		/*0x0010 Object header continuation	*/
+    H5O_MSG_STAB,		/*0x0011 Symbol table			*/
+    H5O_MSG_MTIME_NEW,		/*0x0012 New Object modification date and time */
+    H5O_MSG_BTREEK,		/*0x0013 Non-default v1 B-tree 'K' values */
+    H5O_MSG_DRVINFO,		/*0x0014 Driver info settings		*/
+    H5O_MSG_AINFO,		/*0x0015 Attribute information		*/
+    H5O_MSG_REFCOUNT,		/*0x0016 Object's ref. count		*/
+    H5O_MSG_UNKNOWN		/*0x0017 Placeholder for unknown message */
+};
+
+/* Declare a free list to manage the H5O_t struct */
+H5FL_DEFINE(H5O_t);
+
+/* Declare a free list to manage the H5O_mesg_t sequence information */
+H5FL_SEQ_DEFINE(H5O_mesg_t);
+
+/* Declare a free list to manage the H5O_chunk_t sequence information */
+H5FL_SEQ_DEFINE(H5O_chunk_t);
+
+/* Declare a free list to manage the chunk image information */
+H5FL_BLK_DEFINE(chunk_image);
+
+/* Declare external the free list for H5O_cont_t sequences */
+H5FL_SEQ_EXTERN(H5O_cont_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Declare external the free list for time_t's */
+H5FL_EXTERN(time_t);
+
+/* Declare external the free list for H5_obj_t's */
+H5FL_EXTERN(H5_obj_t);
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Header object ID to class mapping */
+/*
+ * Initialize the object class info table.  Begin with the most general types
+ * and end with the most specific. For instance, any object that has a
+ * datatype message is a datatype but only some of them are datasets.
+ */
+static const H5O_obj_class_t *const H5O_obj_class_g[] = {
+    H5O_OBJ_DATATYPE,		/* Datatype object (H5O_TYPE_NAMED_DATATYPE - 2) */
+    H5O_OBJ_DATASET,		/* Dataset object (H5O_TYPE_DATASET - 1) */
+    H5O_OBJ_GROUP,		/* Group object (H5O_TYPE_GROUP - 0) */
+};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_init_interface
+ *
+ * Purpose:	Initialize information specific to H5O interface.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 18, 2007
+ *
+ * Changes:     JRM -- 12/12/07
+ *              Added santity check verifying that H5O_msg_class_g
+ *              is big enough.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* H5O interface sanity checks */
+    HDassert(H5O_MSG_TYPES == NELMTS(H5O_msg_class_g));
+    HDassert(sizeof(H5O_fheap_id_t) == H5O_FHEAP_ID_LEN);
+
+    HDassert(H5O_UNKNOWN_ID < H5O_MSG_TYPES);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oopen
+ *
+ * Purpose:	Opens an object within an HDF5 file.
+ *
+ *              This function opens an object in the same way that H5Gopen2,
+ *              H5Topen2, and H5Dopen2 do. However, H5Oopen doesn't require
+ *              the type of object to be known beforehand. This can be
+ *              useful in user-defined links, for instance, when only a
+ *              path is known.
+ *
+ *              The opened object should be closed again with H5Oclose
+ *              or H5Gclose, H5Tclose, or H5Dclose.
+ *
+ * Return:	Success:	An open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id)
+{
+    H5G_loc_t	loc;
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*si", loc_id, name, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Open the object */
+    if((ret_value = H5O_open_name(&loc, name, lapl_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oopen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oopen_by_idx
+ *
+ * Purpose:	Opens an object within an HDF5 file, according to the offset
+ *              within an index.
+ *
+ *              This function opens an object in the same way that H5Gopen,
+ *              H5Topen, and H5Dopen do. However, H5Oopen doesn't require
+ *              the type of object to be known beforehand. This can be
+ *              useful in user-defined links, for instance, when only a
+ *              path is known.
+ *
+ *              The opened object should be closed again with H5Oclose
+ *              or H5Gclose, H5Tclose, or H5Dclose.
+ *
+ * Return:	Success:	An open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 20 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t lapl_id)
+{
+    H5G_loc_t	loc;
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("i", "i*sIiIohi", loc_id, group_name, idx_type, order, n, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location, according to the order in the index */
+    if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    loc_found = TRUE;
+
+    /* Open the object */
+    if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_ind_dxpl_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+    /* Release the object location if we failed after copying it */
+    if(ret_value < 0 && loc_found)
+        if(H5G_loc_free(&obj_loc) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oopen_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oopen_by_addr
+ *
+ * Purpose:	Warning! This function is EXTREMELY DANGEROUS!
+ *              Improper use can lead to FILE CORRUPTION, INACCESSIBLE DATA,
+ *              and other VERY BAD THINGS!
+ *
+ *              This function opens an object using its address within the
+ *              HDF5 file, similar to an HDF5 hard link. The open object
+ *              is identical to an object opened with H5Oopen() and should
+ *              be closed with H5Oclose() or a type-specific closing
+ *              function (such as H5Gclose() ).
+ *
+ *              This function is very dangerous if called on an invalid
+ *              address. For this reason, H5Oincr_refcount() should be
+ *              used to prevent HDF5 from deleting any object that is
+ *              referenced by address (e.g. by a user-defined link).
+ *              H5Odecr_refcount() should be used when the object is
+ *              no longer being referenced by address (e.g. when the UD link
+ *              is deleted).
+ *
+ *              The address of the HDF5 file on disk has no effect on
+ *              H5Oopen_by_addr(), nor does the use of any unusual file
+ *              drivers. The "address" is really the offset within the
+ *              HDF5 file, and HDF5's file drivers will transparently
+ *              map this to an address on disk for the filesystem.
+ *
+ * Return:	Success:	An open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Oopen_by_addr(hid_t loc_id, haddr_t addr)
+{
+    H5G_loc_t	loc;
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hid_t       lapl_id = H5P_LINK_ACCESS_DEFAULT; /* lapl to use to open this object */
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "ia", loc_id, addr);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no address supplied")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+    obj_loc.oloc->addr = addr;
+    obj_loc.oloc->file = loc.oloc->file;
+    H5G_name_reset(obj_loc.path);       /* objects opened through this routine don't have a path name */
+
+    /* Open the object */
+    if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_ind_dxpl_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oopen_by_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Olink
+ *
+ * Purpose:	Creates a hard link from NEW_NAME to the object specified
+ *		by OBJ_ID using properties defined in the Link Creation
+ *              Property List LCPL.
+ *
+ *		This function should be used to link objects that have just
+ *              been created.
+ *
+ *		NEW_NAME is interpreted relative to
+ *		NEW_LOC_ID, which is either a file ID or a
+ *		group ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Tuesday, December 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id,
+    hid_t lapl_id)
+{
+    H5G_loc_t	new_loc;
+    H5G_loc_t	obj_loc;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ii*sii", obj_id, new_loc_id, new_name, lcpl_id, lapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(obj_id, &obj_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(new_loc_id == H5L_SAME_LOC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot use H5L_SAME_LOC when only one location is specified")
+    if(H5G_loc(new_loc_id, &new_loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!new_name || !*new_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+/* Avoid compiler warning on 32-bit machines */
+#if H5_SIZEOF_SIZE_T > H5_SIZEOF_INT32_T
+    if(HDstrlen(new_name) > H5L_MAX_LINK_NAME_LEN)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "name too long")
+#endif /* H5_SIZEOF_SIZE_T > H5_SIZEOF_INT32_T */
+    if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
+
+    /* Link to the object */
+    if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Olink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oincr_refcount
+ *
+ * Purpose:	Warning! This function is EXTREMELY DANGEROUS!
+ *              Improper use can lead to FILE CORRUPTION, INACCESSIBLE DATA,
+ *              and other VERY BAD THINGS!
+ *
+ *              This function increments the "hard link" reference count
+ *              for an object. It should be used when a user-defined link
+ *              that references an object by address is created. When the
+ *              link is deleted, H5Odecr_refcount should be used.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oincr_refcount(hid_t object_id)
+{
+    H5O_loc_t  *oloc;
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", object_id);
+
+    /* Get the object's oloc so we can adjust its link count */
+    if((oloc = H5O_get_loc(object_id)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    if(H5O_link(oloc, 1, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5O_incr_refcount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Odecr_refcount
+ *
+ * Purpose:	Warning! This function is EXTREMELY DANGEROUS!
+ *              Improper use can lead to FILE CORRUPTION, INACCESSIBLE DATA,
+ *              and other VERY BAD THINGS!
+ *
+ *              This function decrements the "hard link" reference count
+ *              for an object. It should be used when user-defined links
+ *              that reference an object by address are deleted, and only
+ *              after H5Oincr_refcount has already been used.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Odecr_refcount(hid_t object_id)
+{
+    H5O_loc_t  *oloc;
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", object_id);
+
+    /* Get the object's oloc so we can adjust its link count */
+    if((oloc = H5O_get_loc(object_id)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    if(H5O_link(oloc, -1, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Odecr_refcount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oexists_by_name
+ *
+ * Purpose:	Determine if a linked-to object exists
+ *
+ * Return:	Success:	TRUE/FALSE
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		February  2 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location info */
+    hid_t       ret_value = FAIL;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("t", "i*si", loc_id, name, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Check if the object exists */
+    if((ret_value = H5G_loc_exists(&loc, name, lapl_id, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine if '%s' exists", name)
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oexists_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oget_info
+ *
+ * Purpose:	Retrieve information about an object.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oget_info(hid_t loc_id, H5O_info_t *oinfo)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", loc_id, oinfo);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!oinfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+
+    /* Retrieve the object's information */
+    if(H5G_loc_info(&loc, ".", TRUE, oinfo/*out*/, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oget_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oget_info_by_name
+ *
+ * Purpose:	Retrieve information about an object.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*s*xi", loc_id, name, oinfo, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(!oinfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Retrieve the object's information */
+    if(H5G_loc_info(&loc, name, TRUE, oinfo/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oget_info_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oget_info_by_idx
+ *
+ * Purpose:	Retrieve information about an object, according to the order
+ *              of an index.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 26 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo, hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIoh*xi", loc_id, group_name, idx_type, order, n, oinfo,
+             lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!group_name || !*group_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!oinfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location, according to the order in the index */
+    if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+    loc_found = TRUE;
+
+    /* Retrieve the object's information */
+    if(H5O_get_info(obj_loc.oloc, H5AC_ind_dxpl_id, TRUE, oinfo) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve object info")
+
+done:
+    /* Release the object location */
+    if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oget_info_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oset_comment
+ *
+ * Purpose:     Gives the specified object a comment.  The COMMENT string
+ *		should be a null terminated string.  An object can have only
+ *		one comment at a time.  Passing NULL for the COMMENT argument
+ *		will remove the comment property from the object.
+ *
+ * Note:	Deprecated in favor of using attributes on objects
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		August 30 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oset_comment(hid_t obj_id, const char *comment)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", obj_id, comment);
+
+    /* Check args */
+    if(H5G_loc(obj_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* (Re)set the object's comment */
+    if(H5G_loc_set_comment(&loc, ".", comment, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oset_comment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oset_comment_by_name
+ *
+ * Purpose:     Gives the specified object a comment.  The COMMENT string
+ *		should be a null terminated string.  An object can have only
+ *		one comment at a time.  Passing NULL for the COMMENT argument
+ *		will remove the comment property from the object.
+ *
+ * Note:	Deprecated in favor of using attributes on objects
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		August 30 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*s*si", loc_id, name, comment, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* (Re)set the object's comment */
+    if(H5G_loc_set_comment(&loc, name, comment, lapl_id, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oset_comment_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oget_comment
+ *
+ * Purpose:	Retrieve comment for an object.
+ *
+ * Return:	Success:	Number of bytes in the comment excluding the
+ *				null terminator.  Zero if the object has no
+ *				comment.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		August 30 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    ssize_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "i*sz", obj_id, comment, bufsize);
+
+    /* Check args */
+    if(H5G_loc(obj_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Retrieve the object's comment */
+    if((ret_value = H5G_loc_get_comment(&loc, ".", comment/*out*/, bufsize, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oget_comment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oget_comment_by_name
+ *
+ * Purpose:	Retrieve comment for an object.
+ *
+ * Return:	Success:	Number of bytes in the comment excluding the
+ *				null terminator.  Zero if the object has no
+ *				comment.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		August 30 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comment, size_t bufsize,
+    hid_t lapl_id)
+{
+    H5G_loc_t	loc;                    /* Location of group */
+    ssize_t     ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("Zs", "i*s*szi", loc_id, name, comment, bufsize, lapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Retrieve the object's comment */
+    if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize, lapl_id, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oget_comment_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ovisit
+ *
+ * Purpose:	Recursively visit an object and all the objects reachable
+ *              from it.  If the starting object is a group, all the objects
+ *              linked to from that group will be visited.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Soft links and user-defined links are ignored during
+ *              this operation.
+ *
+ *              NOTE: Each _object_ reachable from the initial group will only
+ *              be visited once.  If multiple hard links point to the same
+ *              object, the first link to the object's path (according to the
+ *              iteration index and iteration order given) will be used to in
+ *              the callback about the object.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 25 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ovisit(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
+    H5O_iterate_t op, void *op_data)
+{
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iIiIox*x", obj_id, idx_type, order, op, op_data);
+
+    /* Check args */
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
+
+    /* Call internal object visitation routine */
+    if((ret_value = H5O_visit(obj_id, ".", idx_type, order, op, op_data, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ovisit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Ovisit_by_name
+ *
+ * Purpose:	Recursively visit an object and all the objects reachable
+ *              from it.  If the starting object is a group, all the objects
+ *              linked to from that group will be visited.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Soft links and user-defined links are ignored during
+ *              this operation.
+ *
+ *              NOTE: Each _object_ reachable from the initial group will only
+ *              be visited once.  If multiple hard links point to the same
+ *              object, the first link to the object's path (according to the
+ *              iteration index and iteration order given) will be used to in
+ *              the callback about the object.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 24 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ovisit_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, H5O_iterate_t op, void *op_data, hid_t lapl_id)
+{
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "i*sIiIox*xi", loc_id, obj_name, idx_type, order, op, op_data,
+             lapl_id);
+
+    /* Check args */
+    if(!obj_name || !*obj_name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
+    if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
+    if(!op)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
+    if(H5P_DEFAULT == lapl_id)
+        lapl_id = H5P_LINK_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID")
+
+    /* Call internal object visitation routine */
+    if((ret_value = H5O_visit(loc_id, obj_name, idx_type, order, op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ovisit_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oclose
+ *
+ * Purpose:	Close an open file object.
+ *
+ *              This is the companion to H5Oopen. It is used to close any
+ *              open object in an HDF5 file (but not IDs are that not file
+ *              objects, such as property lists and dataspaces). It has
+ *              the same effect as calling H5Gclose, H5Dclose, or H5Tclose.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oclose(hid_t object_id)
+{
+    herr_t       ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", object_id);
+
+    /* Get the type of the object and close it in the correct way */
+    switch(H5I_get_type(object_id)) {
+        case H5I_GROUP:
+        case H5I_DATATYPE:
+        case H5I_DATASET:
+            if(H5I_object(object_id) == NULL)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object")
+            if(H5I_dec_app_ref(object_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_CANTRELEASE, FAIL, "not a valid file object ID (dataset, group, or datatype)")
+        break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_create
+ *
+ * Purpose:	Creates a new object header. Allocates space for it and
+ *              then calls an initialization function. The object header
+ *              is opened for write access and should eventually be
+ *              closed by calling H5O_close().
+ *
+ * Return:	Success:	Non-negative, the ENT argument contains
+ *				information about the object header,
+ *				including its address.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  5 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
+    hid_t ocpl_id, H5O_loc_t *loc/*out*/)
+{
+    H5P_genplist_t  *oc_plist;          /* Object creation property list */
+    H5O_t      *oh = NULL;              /* Object header created */
+    haddr_t     oh_addr;                /* Address of initial object header */
+    size_t      oh_size;                /* Size of initial object header */
+    uint8_t	oh_flags;		/* Object header's initial status flags */
+    unsigned    insert_flags = H5AC__NO_FLAGS_SET; /* Flags for inserting object header into cache */
+    hbool_t     store_msg_crt_idx;      /* Whether to always store message creation indices for this file */
+    herr_t      ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(loc);
+    HDassert(TRUE == H5P_isa_class(ocpl_id, H5P_OBJECT_CREATE));
+
+    /* Check for invalid access request */
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "no write intent on file")
+
+    /* Make certain we allocate at least a reasonable size for the object header */
+    size_hint = H5O_ALIGN_F(f, MAX(H5O_MIN_SIZE, size_hint));
+
+    /* Get the property list */
+    if(NULL == (oc_plist = (H5P_genplist_t *)H5I_object(ocpl_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get any object header status flags set by properties */
+    if(H5P_get(oc_plist, H5O_CRT_OHDR_FLAGS_NAME, &oh_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+    /* Allocate the object header and zero out header fields */
+    if(NULL == (oh = H5FL_CALLOC(H5O_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize file-specific information for object header */
+    store_msg_crt_idx = H5F_STORE_MSG_CRT_IDX(f);
+    if(H5F_USE_LATEST_FORMAT(f) || store_msg_crt_idx || (oh_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED))
+        oh->version = H5O_VERSION_LATEST;
+    else
+        oh->version = H5O_VERSION_1;
+    oh->sizeof_size = H5F_SIZEOF_SIZE(f);
+    oh->sizeof_addr = H5F_SIZEOF_ADDR(f);
+#ifdef H5O_ENABLE_BAD_MESG_COUNT
+    /* Check whether the "bad message count" property is set */
+    if(H5P_exist_plist(oc_plist, H5O_BAD_MESG_COUNT_NAME) > 0) {
+        /* Retrieve bad message count flag */
+        if(H5P_get(oc_plist, H5O_BAD_MESG_COUNT_NAME, &oh->store_bad_mesg_count) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get bad message count flag")
+    } /* end if */
+#endif /* H5O_ENABLE_BAD_MESG_COUNT */
+
+    /* Set initial status flags */
+    oh->flags = oh_flags;
+
+    /* Initialize version-specific fields */
+    if(oh->version > H5O_VERSION_1) {
+        /* Initialize all time fields with current time, if we are storing them */
+        if(oh->flags & H5O_HDR_STORE_TIMES)
+            oh->atime = oh->mtime = oh->ctime = oh->btime = H5_now();
+        else
+            oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+
+        /* Make certain attribute creation order tracking is enabled if
+         *      attributes can be shared in this file.
+         */
+        if(store_msg_crt_idx)
+            oh->flags |= H5O_HDR_ATTR_CRT_ORDER_TRACKED;
+
+        /* Retrieve attribute storage phase change values from property list */
+        if(H5P_get(oc_plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, &oh->max_compact) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get max. # of compact attributes")
+        if(H5P_get(oc_plist, H5O_CRT_ATTR_MIN_DENSE_NAME, &oh->min_dense) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get min. # of dense attributes")
+
+        /* Check for non-default attribute storage phase change values */
+        if(oh->max_compact != H5O_CRT_ATTR_MAX_COMPACT_DEF || oh->min_dense != H5O_CRT_ATTR_MIN_DENSE_DEF)
+            oh->flags |= H5O_HDR_ATTR_STORE_PHASE_CHANGE;
+
+        /* Determine correct value for chunk #0 size bits */
+/* Avoid compiler warning on 32-bit machines */
+#if H5_SIZEOF_SIZE_T > H5_SIZEOF_INT32_T
+        if(size_hint > 4294967295UL)
+            oh->flags |= H5O_HDR_CHUNK0_8;
+        else
+#endif /* H5_SIZEOF_SIZE_T > H5_SIZEOF_INT32_T */
+        if(size_hint > 65535)
+            oh->flags |= H5O_HDR_CHUNK0_4;
+        else if(size_hint > 255)
+            oh->flags |= H5O_HDR_CHUNK0_2;
+    } /* end if */
+    else {
+        /* Reset unused time fields */
+        oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+    } /* end else */
+
+    /* Compute total size of initial object header */
+    /* (i.e. object header prefix and first chunk) */
+    oh_size = (size_t)H5O_SIZEOF_HDR(oh) + size_hint;
+
+    /* Allocate disk space for header and first chunk */
+    if(HADDR_UNDEF == (oh_addr = H5MF_alloc(f, H5FD_MEM_OHDR, dxpl_id, (hsize_t)oh_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for object header")
+
+    /* Create the chunk list */
+    oh->nchunks = oh->alloc_nchunks = 1;
+    if(NULL == (oh->chunk = H5FL_SEQ_MALLOC(H5O_chunk_t, (size_t)oh->alloc_nchunks)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the first chunk */
+    oh->chunk[0].addr = oh_addr;
+    oh->chunk[0].size = oh_size;
+    oh->chunk[0].gap = 0;
+
+    /* Allocate enough space for the first chunk */
+    /* (including space for serializing the object header prefix */
+    if(NULL == (oh->chunk[0].image = H5FL_BLK_CALLOC(chunk_image, oh_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Put magic # for object header in first chunk */
+    if(oh->version > H5O_VERSION_1)
+        HDmemcpy(oh->chunk[0].image, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+
+    /* Create the message list */
+    oh->nmesgs = 1;
+    oh->alloc_nmesgs = H5O_NMESGS;
+    if(NULL == (oh->mesg = H5FL_SEQ_CALLOC(H5O_mesg_t, oh->alloc_nmesgs)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize the initial "null" message, covering the entire first chunk */
+    oh->mesg[0].type = H5O_MSG_NULL;
+    oh->mesg[0].dirty = TRUE;
+    oh->mesg[0].native = NULL;
+    oh->mesg[0].raw = oh->chunk[0].image + (H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)) + H5O_SIZEOF_MSGHDR_OH(oh);
+    oh->mesg[0].raw_size = size_hint - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+    oh->mesg[0].chunkno = 0;
+
+    /* Check for non-zero initial refcount on the object header */
+    if(initial_rc > 0) {
+        /* Set the initial refcount & pin the header when its inserted */
+        oh->rc = initial_rc;
+        insert_flags |= H5AC__PIN_ENTRY_FLAG;
+    } /* end if */
+
+    /* Cache object header */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_OHDR, oh_addr, oh, insert_flags) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
+    oh = NULL;
+
+    /* Set up object location */
+    loc->file = f;
+    loc->addr = oh_addr;
+
+    /* Open it */
+    if(H5O_open(loc) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object header")
+
+done:
+    if(ret_value < 0 && oh)
+        if(H5O_free(oh) < 0)
+	    HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_open
+ *
+ * Purpose:	Opens an object header which is described by the symbol table
+ *		entry OBJ_ENT.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ * Modification:
+ *              Raymond Lu
+ *              5 November 2007
+ *              Turn off the holding file variable if it's on.  When it's
+ *              needed, the caller will turn it on again.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_open(H5O_loc_t *loc)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(loc->file);
+
+#ifdef H5O_DEBUG
+    if(H5DEBUG(O))
+	HDfprintf(H5DEBUG(O), "> %a\n", loc->addr);
+#endif
+
+    /* Turn off the variable for holding file or increment open-lock counters */
+    if(loc->holding_file)
+     	loc->holding_file = FALSE;
+    else
+        H5F_INCR_NOPEN_OBJS(loc->file);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_open_name
+ *
+ * Purpose:	Opens an object within an HDF5 file.
+ *
+ * Return:	Success:	An open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		March  5 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5O_open_name(H5G_loc_t *loc, const char *name, hid_t lapl_id, hbool_t app_ref)
+{
+    H5G_loc_t   obj_loc;                /* Location used to open group */
+    H5G_name_t  obj_path;            	/* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
+    hid_t       dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
+    hid_t       ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(name && *name);
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(loc, name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Open the object */
+    if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, dxpl_id, app_ref)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+    if(ret_value < 0 && loc_found)
+        if(H5G_loc_free(&obj_loc) < 0)
+            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_open_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_open_by_loc
+ *
+ * Purpose:	Opens an object and returns an ID given its group loction.
+ *
+ * Return:	Success:	Open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		July 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5O_open_by_loc(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t app_ref)
+{
+    const H5O_obj_class_t *obj_class;   /* Class of object for location */
+    hid_t      ret_value;               /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(obj_loc);
+
+    /* Get the object class for this location */
+    if(NULL == (obj_class = H5O_obj_class(obj_loc->oloc, dxpl_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine object class")
+
+    /* Call the object class's 'open' routine */
+    HDassert(obj_class->open);
+    if((ret_value = obj_class->open(obj_loc, lapl_id, dxpl_id, app_ref)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_open_by_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_close
+ *
+ * Purpose:	Closes an object header that was previously open.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_close(H5O_loc_t *loc)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_NOPEN_OBJS(loc->file) > 0);
+
+    /* Decrement open-lock counters */
+    H5F_DECR_NOPEN_OBJS(loc->file);
+
+#ifdef H5O_DEBUG
+    if(H5DEBUG(O)) {
+	if(H5F_FILE_ID(loc->file)< 0 && 1 == H5F_NREFS(loc->file))
+	    HDfprintf(H5DEBUG(O), "< %a auto %lu remaining\n",
+		      loc->addr,
+		      (unsigned long)H5F_NOPEN_OBJS(loc->file));
+	else
+	    HDfprintf(H5DEBUG(O), "< %a\n", loc->addr);
+    } /* end if */
+#endif
+
+    /*
+     * If the file open object count has reached the number of open mount points
+     * (each of which has a group open in the file) attempt to close the file.
+     */
+    if(H5F_NOPEN_OBJS(loc->file) == H5F_NMOUNTS(loc->file))
+        /* Attempt to close down the file hierarchy */
+        if(H5F_try_close(loc->file) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
+
+    /* Release location information */
+    if(H5O_loc_free(loc) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_link_oh
+ *
+ * Purpose:	Adjust the link count for an open object header by adding
+ *		ADJUST to the link count.
+ *
+ * Return:	Success:	New link count
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  5 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_link_oh(H5F_t *f, int adjust, hid_t dxpl_id, H5O_t *oh, hbool_t *deleted)
+{
+    haddr_t addr = H5O_OH_GET_ADDR(oh);     /* Object header address */
+    int	ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(deleted);
+
+    /* Check for adjusting link count */
+    if(adjust) {
+        if(adjust < 0) {
+            /* Check for too large of an adjustment */
+            if((unsigned)(-adjust) > oh->nlink)
+                HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "link count would be negative")
+
+            /* Adjust the link count for the object header */
+            oh->nlink = (unsigned)((int)oh->nlink + adjust);
+
+            /* Mark object header as dirty in cache */
+            if(H5AC_mark_entry_dirty(oh) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+
+            /* Check if the object should be deleted */
+            if(oh->nlink == 0) {
+                /* Check if the object is still open by the user */
+                if(H5FO_opened(f, addr) != NULL) {
+                    /* Flag the object to be deleted when it's closed */
+                    if(H5FO_mark(f, addr, TRUE) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't mark object for deletion")
+                } /* end if */
+                else {
+                    /* Mark the object header for deletion */
+                    *deleted = TRUE;
+                } /* end else */
+            } /* end if */
+        } /* end if */
+        else {
+            /* A new object, or one that will be deleted */
+            if(0 == oh->nlink) {
+                /* Check if the object is currently open, but marked for deletion */
+                if(H5FO_marked(f, addr)) {
+                    /* Remove "delete me" flag on the object */
+                    if(H5FO_mark(f, addr, FALSE) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't mark object for deletion")
+                } /* end if */
+            } /* end if */
+
+            /* Adjust the link count for the object header */
+            oh->nlink = (unsigned)((int)oh->nlink + adjust);
+
+            /* Mark object header as dirty in cache */
+            if(H5AC_mark_entry_dirty(oh) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+        } /* end if */
+
+        /* Check for operations on refcount message */
+        if(oh->version > H5O_VERSION_1) {
+            /* Check if the object has a refcount message already */
+            if(oh->has_refcount_msg) {
+                /* Check for removing refcount message */
+                if(oh->nlink <= 1) {
+                    if(H5O_msg_remove_real(f, oh, H5O_MSG_REFCOUNT, H5O_ALL, NULL, NULL, TRUE, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete refcount message")
+                    oh->has_refcount_msg = FALSE;
+                } /* end if */
+                /* Update refcount message with new link count */
+                else {
+                    H5O_refcount_t refcount = oh->nlink;
+
+                    if(H5O_msg_write_real(f, dxpl_id, oh, H5O_MSG_REFCOUNT, H5O_MSG_FLAG_DONTSHARE, 0, &refcount) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTUPDATE, FAIL, "unable to update refcount message")
+                } /* end else */
+            } /* end if */
+            else {
+                /* Check for adding refcount message to object */
+                if(oh->nlink > 1) {
+                    H5O_refcount_t refcount = oh->nlink;
+
+                    if(H5O_msg_append_real(f, dxpl_id, oh, H5O_MSG_REFCOUNT, H5O_MSG_FLAG_DONTSHARE, 0, &refcount) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to create new refcount message")
+                    oh->has_refcount_msg = TRUE;
+                } /* end if */
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (int)oh->nlink;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_link
+ *
+ * Purpose:	Adjust the link count for an object header by adding
+ *		ADJUST to the link count.
+ *
+ * Return:	Success:	New link count
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  5 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id)
+{
+    H5O_t	*oh = NULL;
+    hbool_t deleted = FALSE;            /* Whether the object was deleted */
+    int	ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Call the "real" link routine */
+    if((ret_value = H5O_link_oh(loc->file, adjust, dxpl_id, oh, &deleted)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust object link count")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+    if(ret_value >= 0 && deleted && H5O_delete(loc->file, dxpl_id, loc->addr) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_protect
+ *
+ * Purpose:	Wrapper around H5AC_protect for use during a H5O_protect->
+ *              H5O_msg_append->...->H5O_msg_append->H5O_unprotect sequence of calls
+ *              during an object's creation.
+ *
+ * Return:	Success:	Pointer to the object header structure for the
+ *                              object.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Dec 31 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_t *
+H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
+{
+    H5O_t *oh = NULL;           /* Object header protected */
+    H5O_cache_ud_t udata;       /* User data for protecting object header */
+    H5O_cont_msgs_t cont_msg_info;      /* Continuation message info */
+    unsigned file_intent;       /* R/W intent on file */
+    H5O_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+
+    /* Check for valid address */
+    if(!H5F_addr_defined(loc->addr))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "address undefined")
+
+    /* Check for write access on the file */
+    file_intent = H5F_INTENT(loc->file);
+    if((prot == H5AC_WRITE) && (0 == (file_intent & H5F_ACC_RDWR)))
+	HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "no write intent on file")
+
+    /* Construct the user data for protect callback */
+    udata.made_attempt = FALSE;
+    udata.v1_pfx_nmesgs = 0;
+    udata.common.f = loc->file;
+    udata.common.dxpl_id = dxpl_id;
+    udata.common.file_intent = file_intent;
+    udata.common.merged_null_msgs = 0;
+    udata.common.mesgs_modified = FALSE;
+    HDmemset(&cont_msg_info, 0, sizeof(cont_msg_info));
+    udata.common.cont_msg_info = &cont_msg_info;
+    udata.common.addr = loc->addr;
+
+    /* Lock the object header into the cache */
+    if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, &udata, prot)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header")
+
+    /* Check if there are any continuation messages to process */
+    if(cont_msg_info.nmsgs > 0) {
+        size_t curr_msg;        /* Current continuation message to process */
+        H5O_chk_cache_ud_t chk_udata;   /* User data for loading chunk */
+
+        /* Sanity check - we should only have continuation messages to process
+         *      when the object header is actually loaded from the file.
+         */
+        HDassert(udata.made_attempt == TRUE);
+        HDassert(cont_msg_info.msgs);
+
+        /* Construct the user data for protecting chunks */
+        chk_udata.decoding = TRUE;
+        chk_udata.oh = oh;
+        chk_udata.chunkno = UINT_MAX;   /* Set to invalid value, for better error detection */
+        chk_udata.common.f = loc->file;
+        chk_udata.common.dxpl_id = dxpl_id;
+        chk_udata.common.file_intent = file_intent;
+        chk_udata.common.merged_null_msgs = udata.common.merged_null_msgs;
+        chk_udata.common.mesgs_modified = udata.common.mesgs_modified;
+        chk_udata.common.cont_msg_info = &cont_msg_info;
+
+        /* Read in continuation messages, until there are no more */
+        curr_msg = 0;
+        while(curr_msg < cont_msg_info.nmsgs) {
+            H5O_chunk_proxy_t *chk_proxy;       /* Proxy for chunk, to bring it into memory */
+#ifndef NDEBUG
+            size_t chkcnt = oh->nchunks;      /* Count of chunks (for sanity checking) */
+#endif /* NDEBUG */
+
+            /* Bring the chunk into the cache */
+            /* (which adds to the object header) */
+            chk_udata.common.addr = cont_msg_info.msgs[curr_msg].addr;
+            chk_udata.size = cont_msg_info.msgs[curr_msg].size;
+            if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, &chk_udata, prot)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
+
+            /* Sanity check */
+            HDassert(chk_proxy->oh == oh);
+            HDassert(chk_proxy->chunkno == chkcnt);
+            HDassert(oh->nchunks == (chkcnt + 1));
+
+            /* Release the chunk from the cache */
+            if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, chk_proxy, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header chunk")
+
+            /* Advance to next continuation message */
+            curr_msg++;
+        } /* end while */
+
+        /* Release any continuation messages built up */
+        cont_msg_info.msgs = (H5O_cont_t *)H5FL_SEQ_FREE(H5O_cont_t, cont_msg_info.msgs);
+
+        /* Pass back out some of the chunk's user data */
+        udata.common.merged_null_msgs = chk_udata.common.merged_null_msgs;
+        udata.common.mesgs_modified = chk_udata.common.mesgs_modified;
+    } /* end if */
+
+    /* Check for incorrect # of object header messages, if we've just loaded
+     *  this object header from the file
+     */
+    if(udata.made_attempt) {
+        /* Check for incorrect # of messages in v1 object header */
+        if(oh->version == H5O_VERSION_1 &&
+                (oh->nmesgs + udata.common.merged_null_msgs) != udata.v1_pfx_nmesgs) {
+/* Don't enforce the error on an incorrect # of object header messages bug
+ *      unless strict format checking is enabled.  This allows for older
+ *      files, created with a version of the library that had a bug in tracking
+ *      the correct # of header messages to be read in without the library
+ *      erroring out here. -QAK
+ */
+#ifdef H5_STRICT_FORMAT_CHECKS
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "corrupt object header - incorrect # of messages")
+#else /* H5_STRICT_FORMAT_CHECKS */
+            /* Mark object header prefix dirty later if we don't have write access */
+            /* (object header will have been marked dirty during protect, if we
+             *  have write access -QAK)
+             */
+            if(prot != H5AC_WRITE)
+                oh->prefix_modified = TRUE;
+#ifndef NDEBUG
+            else {
+                unsigned oh_status = 0;         /* Object header entry cache status */
+
+                /* Check the object header's status in the metadata cache */
+                if(H5AC_get_entry_status(loc->file, loc->addr, &oh_status) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to check metadata cache status for object header")
+
+                /* Make certain that object header is not dirty */
+                HDassert(!(oh_status & H5AC_ES__IS_DIRTY));
+            } /* end else */
+#endif /* NDEBUG */
+#endif /* H5_STRICT_FORMAT_CHECKS */
+        } /* end if */
+
+        /* Check for any messages that were modified while being read in */
+        if(udata.common.mesgs_modified && prot != H5AC_WRITE)
+            oh->mesgs_modified = TRUE;
+
+        /* Reset the field that contained chunk 0's size during speculative load */
+        oh->chunk0_size = 0;
+    } /* end if */
+
+    /* Take care of loose ends for modifications made while bringing in the
+     *      object header & chunks.
+     */
+    if(prot == H5AC_WRITE) {
+        /* Check for the object header prefix being modified somehow */
+        /* (usually through updating the # of object header messages) */
+        if(oh->prefix_modified) {
+            /* Mark the header as dirty now */
+            if(H5AC_mark_entry_dirty(oh) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, NULL, "unable to mark object header as dirty")
+
+            /* Reset flag */
+            oh->prefix_modified = FALSE;
+        } /* end if */
+
+        /* Check for deferred dirty messages */
+        if(oh->mesgs_modified) {
+            unsigned u;         /* Local index variable */
+
+            /* Loop through all messages, marking their chunks as dirty */
+            /* (slightly inefficient, since we don't know exactly which messages
+             *  were modified when the object header & chunks were brought in
+             *  from the file, but this only can happen once per load -QAK)
+             */
+            for(u = 0; u < oh->nmesgs; u++) {
+                /* Mark each chunk with a dirty message as dirty also */
+                if(oh->mesg[u].dirty) {
+                    H5O_chunk_proxy_t *chk_proxy;        /* Chunk that message is in */
+
+                    /* Protect chunk */
+                    if(NULL == (chk_proxy = H5O_chunk_protect(loc->file, dxpl_id, oh, oh->mesg[u].chunkno)))
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
+
+                    /* Unprotect chunk, marking it dirty */
+                    if(H5O_chunk_unprotect(loc->file, dxpl_id, chk_proxy, TRUE) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header chunk")
+                } /* end if */
+            } /* end for */
+
+            /* Reset flag */
+            oh->mesgs_modified = FALSE;
+        } /* end if */
+    } /* end if */
+
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
+
+    /* Set return value */
+    ret_value = oh;
+
+done:
+    if(ret_value == NULL && oh)
+        if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pin
+ *
+ * Purpose:	Pin an object header down for use during a sequence of message
+ *              operations, which prevents the object header from being
+ *              evicted from the cache.
+ *
+ * Return:	Success:	Pointer to the object header structure for the
+ *                              object.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_t *
+H5O_pin(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t       *oh = NULL;     /* Object header */
+    H5O_t       *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+
+    /* Get header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
+
+    /* Increment the reference count on the object header */
+    /* (which will pin it, if appropriate) */
+    if(H5O_inc_rc(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, NULL, "unable to increment reference count on object header")
+
+    /* Set the return value */
+    ret_value = oh;
+
+done:
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_unpin
+ *
+ * Purpose:	Unpin an object header, allowing it to be evicted from the
+ *              metadata cache.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_unpin(H5O_t *oh)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh);
+
+    /* Decrement the reference count on the object header */
+    /* (which will unpin it, if appropriate) */
+    if(H5O_dec_rc(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement reference count on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_unpin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_unprotect
+ *
+ * Purpose:	Wrapper around H5AC_unprotect for use during a H5O_protect->
+ *              H5O_msg_append->...->H5O_msg_append->H5O_unprotect sequence of calls
+ *              during an object's creation.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Dec 31 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_unprotect(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, unsigned oh_flags)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(oh);
+
+    /* Unprotect the object header */
+    if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, oh->chunk[0].addr, oh, oh_flags) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_touch_oh
+ *
+ * Purpose:	If FORCE is non-zero then create a modification time message
+ *		unless one already exists.  Then update any existing
+ *		modification time message with the current time.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hbool_t force)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that message is in */
+    hbool_t chk_dirtied = FALSE;        /* Flag for unprotecting chunk */
+    time_t	now;                    /* Current time */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(oh);
+
+    /* Check if this object header is tracking times */
+    if(oh->flags & H5O_HDR_STORE_TIMES) {
+        /* Get current time */
+        now = H5_now();
+
+        /* Check version, to determine how to store time information */
+        if(oh->version == H5O_VERSION_1) {
+            size_t	idx;                    /* Index of modification time message to update */
+
+            /* Look for existing message */
+            for(idx = 0; idx < oh->nmesgs; idx++)
+                if(H5O_MSG_MTIME == oh->mesg[idx].type || H5O_MSG_MTIME_NEW == oh->mesg[idx].type)
+                    break;
+
+            /* Create a new message, if necessary */
+            if(idx == oh->nmesgs) {
+                unsigned mesg_flags = 0;        /* Flags for message in object header */
+
+                /* If we would have to create a new message, but we aren't 'forcing' it, get out now */
+                if(!force)
+                    HGOTO_DONE(SUCCEED);        /*nothing to do*/
+
+                /* Allocate space for the modification time message */
+                if(H5O_msg_alloc(f, dxpl_id, oh, H5O_MSG_MTIME_NEW, &mesg_flags, &now, &idx) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to allocate space for modification time message")
+
+                /* Set the message's flags if appropriate */
+                oh->mesg[idx].flags = (uint8_t)mesg_flags;
+            } /* end if */
+
+            /* Protect chunk */
+            if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, oh->mesg[idx].chunkno)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+            /* Allocate 'native' space, if necessary */
+            if(NULL == oh->mesg[idx].native) {
+                if(NULL == (oh->mesg[idx].native = H5FL_MALLOC(time_t)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "memory allocation failed for modification time message")
+            } /* end if */
+
+            /* Update the message */
+            *((time_t *)(oh->mesg[idx].native)) = now;
+
+            /* Mark the message as dirty */
+            oh->mesg[idx].dirty = TRUE;
+            chk_dirtied = TRUE;
+        } /* end if */
+        else {
+            /* XXX: For now, update access time & change fields in the object header */
+            /* (will need to add some code to update modification time appropriately) */
+            oh->atime = oh->ctime = now;
+
+            /* Mark object header as dirty in cache */
+            if(H5AC_mark_entry_dirty(oh) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Release chunk */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_touch_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_touch
+ *
+ * Purpose:	Touch an object by setting the modification time to the
+ *		current time and marking the object as dirty.  Unless FORCE
+ *		is non-zero, nothing happens if there is no MTIME message in
+ *		the object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, July 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id)
+{
+    H5O_t	*oh = NULL;             /* Object header to modify */
+    unsigned 	oh_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting object header */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Create/Update the modification time message */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, force) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to update object modificaton time")
+
+    /* Mark object header as changed */
+    oh_flags |= H5AC__DIRTIED_FLAG;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, oh_flags) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_touch() */
+
+#ifdef H5O_ENABLE_BOGUS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_bogus_oh
+ *
+ * Purpose:	Create a "bogus" message unless one already exists.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              <koziol at ncsa.uiuc.edu>
+ *              Tuesday, January 21, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_bogus_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned mesg_flags)
+{
+    size_t	idx;                /* Local index variable */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(oh);
+
+    /* Look for existing message */
+    for(idx = 0; idx < oh->nmesgs; idx++)
+	if(H5O_MSG_BOGUS == oh->mesg[idx].type)
+            break;
+
+    /* Create a new message */
+    if(idx == oh->nmesgs) {
+        H5O_bogus_t *bogus;             /* Pointer to the bogus information */
+
+        /* Allocate the native message in memory */
+	if(NULL == (bogus = H5MM_malloc(sizeof(H5O_bogus_t))))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "memory allocation failed for 'bogus' message")
+
+        /* Update the native value */
+        bogus->u = H5O_BOGUS_VALUE;
+
+        /* Allocate space in the object header for bogus message */
+	if(H5O_msg_alloc(f, dxpl_id, oh, H5O_MSG_BOGUS, &mesg_flags, bogus, &idx) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to allocate space for 'bogus' message")
+
+        /* Point to "bogus" information (take it over) */
+	oh->mesg[idx].native = bogus;
+
+        /* Set the appropriate flags for the message */
+        oh->mesg[idx].flags = mesg_flags;
+
+        /* Mark the message and object header as dirty */
+        oh->mesg[idx].dirty = TRUE;
+        oh->cache_info.is_dirty = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_bogus_oh() */
+#endif /* H5O_ENABLE_BOGUS */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_delete
+ *
+ * Purpose:	Delete an object header from a file.  This frees the file
+ *              space used for the object header (and it's continuation blocks)
+ *              and also walks through each header message and asks it to
+ *              remove all the pieces of the file referenced by the header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 19 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
+{
+    H5O_t *oh = NULL;           /* Object header information */
+    H5O_loc_t loc;              /* Object location for object to delete */
+    unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting object header */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Set up the object location */
+    loc.file = f;
+    loc.addr = addr;
+    loc.holding_file = FALSE;
+
+    /* Get the object header information */
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Delete object */
+    if(H5O_delete_oh(f, dxpl_id, oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file")
+
+    /* Mark object header as deleted */
+    oh_flags = H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+done:
+    if(oh && H5O_unprotect(&loc, dxpl_id, oh, oh_flags) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_delete_oh
+ *
+ * Purpose:	Internal function to:
+ *              Delete an object header from a file.  This frees the file
+ *              space used for the object header (and it's continuation blocks)
+ *              and also walks through each header message and asks it to
+ *              remove all the pieces of the file referenced by the header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 19 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_delete_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    H5O_mesg_t *curr_msg;       /* Pointer to current message being operated on */
+    unsigned	u;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Walk through the list of object header messages, asking each one to
+     * delete any file space used
+     */
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+        /* Free any space referred to in the file from this message */
+        if(H5O_delete_mesg(f, dxpl_id, oh, curr_msg) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_delete_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_obj_type
+ *
+ * Purpose:	Retrieves the type of object pointed to by `loc'.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, November  4, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id)
+{
+    H5O_t	*oh = NULL;             /* Object header for location */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Load the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Retrieve the type of the object */
+    if(H5O_obj_type_real(oh, obj_type) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_obj_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_obj_type_real
+ *
+ * Purpose:	Returns the type of object pointed to by `oh'.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_obj_type_real(H5O_t *oh, H5O_type_t *obj_type)
+{
+    const H5O_obj_class_t *obj_class;           /* Class of object for header */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(oh);
+    HDassert(obj_type);
+
+    /* Look up class for object header */
+    if(NULL == (obj_class = H5O_obj_class_real(oh))) {
+        /* Clear error stack from "failed" class lookup */
+        H5E_clear_stack(NULL);
+
+        /* Set type to "unknown" */
+        *obj_type = H5O_TYPE_UNKNOWN;
+    } /* end if */
+    else {
+        /* Set object type */
+        *obj_type = obj_class->type;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_obj_type_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_obj_class
+ *
+ * Purpose:	Returns the class of object pointed to by `loc'.
+ *
+ * Return:	Success:	An object class
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+const H5O_obj_class_t *
+H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t	*oh = NULL;                     /* Object header for location */
+    const H5O_obj_class_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Load the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header")
+
+    /* Test whether entry qualifies as a particular type of object */
+    if(NULL == (ret_value = H5O_obj_class_real(oh)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to determine object type")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_obj_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_obj_class_real
+ *
+ * Purpose:	Returns the class of object pointed to by `oh'.
+ *
+ * Return:	Success:	An object class
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static const H5O_obj_class_t *
+H5O_obj_class_real(H5O_t *oh)
+{
+    size_t	i;                      /* Local index variable */
+    const H5O_obj_class_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(oh);
+
+    /* Test whether entry qualifies as a particular type of object */
+    /* (Note: loop is in reverse order, to test specific objects first) */
+    for(i = NELMTS(H5O_obj_class_g); i > 0; --i) {
+        htri_t	isa;            /* Is entry a particular type? */
+
+	if((isa = (H5O_obj_class_g[i - 1]->isa)(oh)) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to determine object type")
+	else if(isa)
+	    HGOTO_DONE(H5O_obj_class_g[i - 1])
+    } /* end for */
+
+    if(0 == i)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to determine object type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_obj_class_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_loc
+ *
+ * Purpose:	Gets the object location for an object given its ID.
+ *
+ * Return:	Success:	Pointer to H5O_loc_t
+ *		Failure:	NULL
+ *
+ * Programmer:	James Laird
+ *		July 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_loc_t *
+H5O_get_loc(hid_t object_id)
+{
+    H5O_loc_t   *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    switch(H5I_get_type(object_id)) {
+        case H5I_GROUP:
+            if(NULL == (ret_value = H5O_OBJ_GROUP->get_oloc(object_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from group ID")
+            break;
+
+        case H5I_DATASET:
+            if(NULL == (ret_value = H5O_OBJ_DATASET->get_oloc(object_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from dataset ID")
+            break;
+
+        case H5I_DATATYPE:
+            if(NULL == (ret_value = H5O_OBJ_DATATYPE->get_oloc(object_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from datatype ID")
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, NULL, "invalid object type")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_loc_reset
+ *
+ * Purpose:	Reset a object location to an empty state
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 19, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_loc_reset(H5O_loc_t *loc)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(loc);
+
+    /* Clear the object location to an empty state */
+    HDmemset(loc, 0, sizeof(H5O_loc_t));
+    loc->addr = HADDR_UNDEF;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_loc_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_loc_copy
+ *
+ * Purpose:     Copy object location information
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Monday, September 19, 2005
+ *
+ * Notes:       'depth' parameter determines how much of the group entry
+ *              structure we want to copy.  The values are:
+ *                  H5_COPY_SHALLOW - Copy all the field values from the source
+ *                      to the destination, but not copying objects pointed to.
+ *                      (Destination "takes ownership" of objects pointed to)
+ *                  H5_COPY_DEEP - Copy all the fields from the source to
+ *                      the destination, deep copying objects pointed to.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_loc_copy(H5O_loc_t *dst, H5O_loc_t *src, H5_copy_depth_t depth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(src);
+    HDassert(dst);
+    HDassert(depth == H5_COPY_SHALLOW || depth == H5_COPY_DEEP);
+
+    /* Copy the top level information */
+    HDmemcpy(dst, src, sizeof(H5O_loc_t));
+
+    /* Deep copy the names */
+    if(depth == H5_COPY_DEEP) {
+        /* If the original entry was holding open the file, this one should
+         * hold it open, too.
+         */
+        if(src->holding_file)
+            H5F_INCR_NOPEN_OBJS(dst->file);
+    } else if(depth == H5_COPY_SHALLOW) {
+        H5O_loc_reset(src);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_loc_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_loc_hold_file
+ *
+ * Purpose:	Have this object header hold a file open until it is
+ *              released.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Wednesday, August 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_loc_hold_file(H5O_loc_t *loc)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(loc->file);
+
+    /* If this location is not already holding its file open, do so. */
+    if(!loc->holding_file) {
+        H5F_INCR_NOPEN_OBJS(loc->file);
+        loc->holding_file = TRUE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_loc_hold_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_loc_free
+ *
+ * Purpose:	Release resources used by this object header location.
+ *              Not to be confused with H5O_close; this is used on
+ *              locations that don't correspond to open objects.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Wednesday, August 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_loc_free(H5O_loc_t *loc)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+
+    /* If this location is holding its file open try to close the file. */
+    if(loc->holding_file) {
+        H5F_DECR_NOPEN_OBJS(loc->file);
+        loc->holding_file = FALSE;
+        if(H5F_NOPEN_OBJS(loc->file) <= 0) {
+            if(H5F_try_close(loc->file) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_loc_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_hdr_info
+ *
+ * Purpose:	Retrieve the object header information for an object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		September 22 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_get_hdr_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_hdr_info_t *hdr)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(hdr);
+
+    /* Reset the object header info structure */
+    HDmemset(hdr, 0, sizeof(*hdr));
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
+
+    /* Get the information for the object header */
+    if(H5O_get_hdr_info_real(oh, hdr) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object header info")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_hdr_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_hdr_info_real
+ *
+ * Purpose:	Internal routine to retrieve the object header information for an object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		September 22 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_get_hdr_info_real(const H5O_t *oh, H5O_hdr_info_t *hdr)
+{
+    const H5O_mesg_t *curr_msg;         /* Pointer to current message being operated on */
+    const H5O_chunk_t *curr_chunk;	/* Pointer to current message being operated on */
+    unsigned u;                         /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(oh);
+    HDassert(hdr);
+
+    /* Set the version for the object header */
+    hdr->version = oh->version;
+
+    /* Set the number of messages & chunks */
+    H5_CHECKED_ASSIGN(hdr->nmesgs, unsigned, oh->nmesgs, size_t);
+    H5_CHECKED_ASSIGN(hdr->nchunks, unsigned, oh->nchunks, size_t);
+
+    /* Set the status flags */
+    hdr->flags = oh->flags;
+
+    /* Iterate over all the messages, accumulating message size & type information */
+    hdr->space.meta = (hsize_t)H5O_SIZEOF_HDR(oh) + (hsize_t)(H5O_SIZEOF_CHKHDR_OH(oh) * (oh->nchunks - 1));
+    hdr->space.mesg = 0;
+    hdr->space.free = 0;
+    hdr->mesg.present = 0;
+    hdr->mesg.shared = 0;
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+        uint64_t type_flag;             /* Flag for message type */
+
+        /* Accumulate space usage information, based on the type of message */
+	if(H5O_NULL_ID == curr_msg->type->id)
+            hdr->space.free += (hsize_t)((size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size);
+        else if(H5O_CONT_ID == curr_msg->type->id)
+            hdr->space.meta += (hsize_t)((size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size);
+        else {
+            hdr->space.meta += (hsize_t)H5O_SIZEOF_MSGHDR_OH(oh);
+            hdr->space.mesg += curr_msg->raw_size;
+        } /* end else */
+
+        /* Set flag to indicate presence of message type */
+        type_flag = ((uint64_t)1) << curr_msg->type->id;
+        hdr->mesg.present |= type_flag;
+
+        /* Set flag if the message is shared in some way */
+        if(curr_msg->flags & H5O_MSG_FLAG_SHARED)                                   \
+            hdr->mesg.shared |= type_flag;
+    } /* end for */
+
+    /* Iterate over all the chunks, adding any gaps to the free space */
+    hdr->space.total = 0;
+    for(u = 0, curr_chunk = &oh->chunk[0]; u < oh->nchunks; u++, curr_chunk++) {
+        /* Accumulate the size of the header on disk */
+        hdr->space.total += curr_chunk->size;
+
+        /* If the chunk has a gap, add it to the free space */
+        hdr->space.free += curr_chunk->gap;
+    } /* end for */
+
+    /* Sanity check that all the bytes are accounted for */
+    HDassert(hdr->space.total == (hdr->space.free + hdr->space.meta + hdr->space.mesg));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_get_hdr_info_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_info
+ *
+ * Purpose:	Retrieve the information for an object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 21 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info,
+    H5O_info_t *oinfo)
+{
+    const H5O_obj_class_t *obj_class;   /* Class of object for header */
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(oinfo);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Reset the object info structure */
+    HDmemset(oinfo, 0, sizeof(*oinfo));
+
+    /* Retrieve the file's fileno */
+    H5F_GET_FILENO(loc->file, oinfo->fileno);
+
+    /* Set the object's address */
+    oinfo->addr = loc->addr;
+
+    /* Get class for object */
+    if(NULL == (obj_class = H5O_obj_class_real(oh)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine object class")
+
+    /* Retrieve the type of the object */
+    oinfo->type = obj_class->type;
+
+    /* Set the object's reference count */
+    oinfo->rc = oh->nlink;
+
+    /* Get modification time for object */
+    if(oh->version > H5O_VERSION_1) {
+        oinfo->atime = oh->atime;
+        oinfo->mtime = oh->mtime;
+        oinfo->ctime = oh->ctime;
+        oinfo->btime = oh->btime;
+    } /* end if */
+    else {
+        htri_t	exists;                 /* Flag if header message of interest exists */
+
+        /* No information for access & modification fields */
+        /* (we stopped updating the "modification time" header message for
+         *      raw data changes, so the "modification time" header message
+         *      is closest to the 'change time', in POSIX terms - QAK)
+         */
+        oinfo->atime = 0;
+        oinfo->mtime = 0;
+        oinfo->btime = 0;
+
+        /* Might be information for modification time */
+        if((exists = H5O_msg_exists_oh(oh, H5O_MTIME_ID)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "unable to check for MTIME message")
+        if(exists > 0) {
+            /* Get "old style" modification time info */
+            if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_MTIME_ID, &oinfo->ctime))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read MTIME message")
+        } /* end if */
+        else {
+            /* Check for "new style" modification time info */
+            if((exists = H5O_msg_exists_oh(oh, H5O_MTIME_NEW_ID)) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "unable to check for MTIME_NEW message")
+            if(exists > 0) {
+                /* Get "new style" modification time info */
+                if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_MTIME_NEW_ID, &oinfo->ctime))
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read MTIME_NEW message")
+            } /* end if */
+            else
+                oinfo->ctime = 0;
+        } /* end else */
+    } /* end else */
+
+    /* Get the information for the object header */
+    if(H5O_get_hdr_info_real(oh, &oinfo->hdr) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object header info")
+
+    /* Retrieve # of attributes */
+    if(H5O_attr_count_real(loc->file, dxpl_id, oh, &oinfo->num_attrs) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve attribute count")
+
+    /* Get B-tree & heap metadata storage size, if requested */
+    if(want_ih_info) {
+        /* Check for 'bh_info' callback for this type of object */
+        if(obj_class->bh_info) {
+            /* Call the object's class 'bh_info' routine */
+            if((obj_class->bh_info)(loc->file, dxpl_id, oh, &oinfo->meta_size.obj) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object's btree & heap info")
+        } /* end if */
+
+        /* Get B-tree & heap info for any attributes */
+        if(oinfo->num_attrs > 0) {
+            if(H5O_attr_bh_info(loc->file, dxpl_id, oh, &oinfo->meta_size.attr) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve attribute btree & heap info")
+        } /* end if */
+    } /* end if */
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_create_plist
+ *
+ * Purpose:	Retrieve the object creation properties for an object
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November 28 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, H5P_genplist_t *oc_plist)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(oc_plist);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Set property values, if they were used for the object */
+    if(oh->version > H5O_VERSION_1) {
+        uint8_t ohdr_flags;             /* "User-visible" object header status flags */
+
+        /* Set attribute storage values */
+        if(H5P_set(oc_plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, &oh->max_compact) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set max. # of compact attributes in property list")
+        if(H5P_set(oc_plist, H5O_CRT_ATTR_MIN_DENSE_NAME, &oh->min_dense) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set min. # of dense attributes in property list")
+
+        /* Mask off non-"user visible" flags */
+        ohdr_flags = oh->flags & (H5O_HDR_ATTR_CRT_ORDER_TRACKED | H5O_HDR_ATTR_CRT_ORDER_INDEXED | H5O_HDR_STORE_TIMES);
+
+        /* Set object header flags */
+        if(H5P_set(oc_plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
+    } /* end if */
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_nlinks
+ *
+ * Purpose:	Retrieve the number of link messages read in from the file
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		March 11 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_get_nlinks(const H5O_loc_t *loc, hid_t dxpl_id, hsize_t *nlinks)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(nlinks);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Retrieve the # of link messages seen when the object header was loaded */
+    *nlinks = oh->link_msgs_seen;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_nlinks() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_obj_create
+ *
+ * Purpose:	Creates an object, in an abstract manner.
+ *
+ * Return:	Success:	Pointer to object opened
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		April 9 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_obj_create(H5F_t *f, H5O_type_t obj_type, void *crt_info, H5G_loc_t *obj_loc,
+    hid_t dxpl_id)
+{
+    size_t u;                           /* Local index variable */
+    void *ret_value = NULL;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(obj_type >= H5O_TYPE_GROUP && obj_type <= H5O_TYPE_NAMED_DATATYPE);
+    HDassert(crt_info);
+    HDassert(obj_loc);
+
+    /* Iterate through the object classes */
+    for(u = 0; u < NELMTS(H5O_obj_class_g); u++) {
+        /* Check for correct type of object to create */
+	if(H5O_obj_class_g[u]->type == obj_type) {
+            /* Call the object class's 'create' routine */
+            HDassert(H5O_obj_class_g[u]->create);
+            if(NULL == (ret_value = H5O_obj_class_g[u]->create(f, crt_info, obj_loc, dxpl_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object")
+
+            /* Break out of loop */
+            break;
+        } /* end if */
+    } /* end for */
+    HDassert(ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_obj_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_oh_addr
+ *
+ * Purpose:	Retrieve the address of the object header
+ *
+ * Note:	This routine participates in the "Inlining C struct access"
+ *		pattern, don't call it directly, use the appropriate macro
+ *		defined in H5Oprivate.h.
+ *
+ * Return:	Success:	Valid haddr_t
+ *		Failure:	HADDR_UNDEF
+ *
+ * Programmer:	Quincey Koziol
+ *		March 15 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5O_get_oh_addr(const H5O_t *oh)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(oh);
+    HDassert(oh->chunk);
+
+    FUNC_LEAVE_NOAPI(oh->chunk[0].addr)
+} /* end H5O_get_oh_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_get_rc_and_type
+ *
+ * Purpose:	Retrieve an object's reference count and type
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		November  4 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_get_rc_and_type(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc, H5O_type_t *otype)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Set the object's reference count */
+    if(rc)
+        *rc = oh->nlink;
+
+    /* Retrieve the type of the object */
+    if(otype)
+        if(H5O_obj_type_real(oh, otype) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_rc_and_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_free_visit_visited
+ *
+ * Purpose:     Free the key for an object visited during a group traversal
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *	        Nov 25, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_free_visit_visited(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *operator_data/*in,out*/)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    item = H5FL_FREE(H5_obj_t, item);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_free_visit_visited() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_visit_cb
+ *
+ * Purpose:     Callback function for recursively visiting objects from a group
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Nov 25, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_visit_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info_t *linfo,
+    void *_udata)
+{
+    H5O_iter_visit_ud_t *udata = (H5O_iter_visit_ud_t *)_udata;     /* User data for callback */
+    H5G_loc_t   obj_loc;                /* Location of object */
+    H5G_name_t  obj_path;            	/* Object's group hier. path */
+    H5O_loc_t   obj_oloc;            	/* Object's object location */
+    hbool_t     obj_found = FALSE;      /* Object at 'name' found */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(name);
+    HDassert(linfo);
+    HDassert(udata);
+
+    /* Check if this is a hard link */
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5_obj_t obj_pos;       /* Object "position" for this object */
+
+        /* Set up opened group location to fill in */
+        obj_loc.oloc = &obj_oloc;
+        obj_loc.path = &obj_path;
+        H5G_loc_reset(&obj_loc);
+
+        /* Find the object using the LAPL passed in */
+        /* (Correctly handles mounted files) */
+        if(H5G_loc_find(udata->start_loc, name, &obj_loc/*out*/, udata->lapl_id, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, H5_ITER_ERROR, "object not found")
+        obj_found = TRUE;
+
+        /* Construct unique "position" for this object */
+        H5F_GET_FILENO(obj_oloc.file, obj_pos.fileno);
+        obj_pos.addr = obj_oloc.addr;
+
+        /* Check if we've seen the object the link references before */
+        if(NULL == H5SL_search(udata->visited, &obj_pos)) {
+            H5O_info_t oinfo;           /* Object info */
+
+            /* Get the object's info */
+            if(H5O_get_info(&obj_oloc, udata->dxpl_id, TRUE, &oinfo) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5_ITER_ERROR, "unable to get object info")
+
+            /* Make the application callback */
+            ret_value = (udata->op)(udata->obj_id, name, &oinfo, udata->op_data);
+
+            /* Check for continuing to visit objects */
+            if(ret_value == H5_ITER_CONT) {
+                /* If its ref count is > 1, we add it to the list of visited objects */
+                /* (because it could come up again during traversal) */
+                if(oinfo.rc > 1) {
+                    H5_obj_t *new_node;                  /* New object node for visited list */
+
+                    /* Allocate new object "position" node */
+                    if((new_node = H5FL_MALLOC(H5_obj_t)) == NULL)
+                        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, H5_ITER_ERROR, "can't allocate object node")
+
+                    /* Set node information */
+                    *new_node = obj_pos;
+
+                    /* Add to list of visited objects */
+                    if(H5SL_insert(udata->visited, new_node, new_node) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "can't insert object node into visited list")
+                } /* end if */
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(obj_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, H5_ITER_ERROR, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_visit_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_visit
+ *
+ * Purpose:	Recursively visit an object and all the objects reachable
+ *              from it.  If the starting object is a group, all the objects
+ *              linked to from that group will be visited.  Links within
+ *              each group are visited according to the order within the
+ *              specified index (unless the specified index does not exist for
+ *              a particular group, then the "name" index is used).
+ *
+ *              NOTE: Soft links and user-defined links are ignored during
+ *              this operation.
+ *
+ *              NOTE: Each _object_ reachable from the initial group will only
+ *              be visited once.  If multiple hard links point to the same
+ *              object, the first link to the object's path (according to the
+ *              iteration index and iteration order given) will be used to in
+ *              the callback about the object.
+ *
+ * Return:	Success:	The return value of the first operator that
+ *				returns non-zero, or zero if all members were
+ *				processed with no operator returning non-zero.
+ *
+ *		Failure:	Negative if something goes wrong within the
+ *				library, or the negative value returned by one
+ *				of the operators.
+ *
+ * Programmer:	Quincey Koziol
+ *		November 24 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_visit(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
+    H5_iter_order_t order, H5O_iterate_t op, void *op_data, hid_t lapl_id,
+    hid_t dxpl_id)
+{
+    H5O_iter_visit_ud_t udata;  /* User data for callback */
+    H5G_loc_t	loc;            /* Location of reference object */
+    H5G_loc_t   obj_loc;        /* Location used to open object */
+    H5G_name_t  obj_path;       /* Opened object group hier. path */
+    H5O_loc_t   obj_oloc;       /* Opened object object location */
+    hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
+    H5O_info_t  oinfo;          /* Object info struct */
+    hid_t       obj_id = (-1);  /* ID of object */
+    herr_t      ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Portably initialize user data struct to zeros */
+    HDmemset(&udata, 0, sizeof(udata));
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Set up opened group location to fill in */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object's location */
+    if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
+    loc_found = TRUE;
+
+    /* Get the object's info */
+    if(H5O_get_info(&obj_oloc, dxpl_id, TRUE, &oinfo) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get object info")
+
+    /* Open the object */
+    /* (Takes ownership of the obj_loc information) */
+    if((obj_id = H5O_open_by_loc(&obj_loc, lapl_id, dxpl_id, TRUE)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+    /* Make callback for starting object */
+    if((ret_value = op(obj_id, ".", &oinfo, op_data)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "can't visit objects")
+
+    /* Check return value of first callback */
+    if(ret_value != H5_ITER_CONT)
+        HGOTO_DONE(ret_value);
+
+    /* Check for object being a group */
+    if(oinfo.type == H5O_TYPE_GROUP) {
+        H5G_loc_t	start_loc;          /* Location of starting group */
+
+        /* Get the location of the starting group */
+        if(H5G_loc(obj_id, &start_loc) < 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+        /* Set up user data for visiting links */
+        udata.obj_id = obj_id;
+        udata.start_loc = &start_loc;
+        udata.lapl_id = lapl_id;
+        udata.dxpl_id = dxpl_id;
+        udata.op = op;
+        udata.op_data = op_data;
+
+        /* Create skip list to store visited object information */
+        if((udata.visited = H5SL_create(H5SL_TYPE_OBJ, NULL)) == NULL)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create skip list for visited objects")
+
+        /* If its ref count is > 1, we add it to the list of visited objects */
+        /* (because it could come up again during traversal) */
+        if(oinfo.rc > 1) {
+            H5_obj_t *obj_pos;                  /* New object node for visited list */
+
+            /* Allocate new object "position" node */
+            if((obj_pos = H5FL_MALLOC(H5_obj_t)) == NULL)
+                HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "can't allocate object node")
+
+            /* Construct unique "position" for this object */
+            obj_pos->fileno = oinfo.fileno;
+            obj_pos->addr = oinfo.addr;
+
+            /* Add to list of visited objects */
+            if(H5SL_insert(udata.visited, obj_pos, obj_pos) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object node into visited list")
+        } /* end if */
+
+        /* Call internal group visitation routine */
+        if((ret_value = H5G_visit(obj_id, ".", idx_type, order, H5O_visit_cb, &udata, lapl_id, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
+    } /* end if */
+
+done:
+    if(obj_id > 0) {
+        if(H5I_dec_app_ref(obj_id) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
+    } /* end if */
+    else if(loc_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
+    if(udata.visited)
+        H5SL_destroy(udata.visited, H5O_free_visit_visited, NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_visit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_inc_rc
+ *
+ * Purpose:	Increments the reference count on an object header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_inc_rc(H5O_t *oh)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh);
+
+    /* Pin the object header when the reference count goes above 0 */
+    if(oh->rc == 0)
+        if(H5AC_pin_protected_entry(oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Increment reference count */
+    oh->rc++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_inc_rc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dec_rc
+ *
+ * Purpose:	Decrements the reference count on an object header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_dec_rc(H5O_t *oh)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh);
+
+    /* Decrement reference count */
+    oh->rc--;
+
+    /* Unpin the object header when the reference count goes back to 0 */
+    if(oh->rc == 0)
+        if(H5AC_unpin_entry(oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dec_rc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:   H5O_dec_rc_by_loc
+ *
+ * Purpose:    Decrement the refcount of an object header, using its
+ *              object location information.
+ *
+ * Return:     Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ *             koziol at hdfgroup.org
+ *             Oct 08 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_dec_rc_by_loc(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t       *oh = NULL;             /* Object header */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+
+    /* Get header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+       HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Decrement the reference count on the object header */
+    /* (which will unpin it, if appropriate) */
+    if(H5O_dec_rc(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement reference count on object header")
+
+done:
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dec_rc_by_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_free
+ *
+ * Purpose:	Destroys an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_free(H5O_t *oh)
+{
+    unsigned	u;                      /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(oh);
+
+    /* Destroy chunks */
+    if(oh->chunk) {
+        for(u = 0; u < oh->nchunks; u++)
+            oh->chunk[u].image = H5FL_BLK_FREE(chunk_image, oh->chunk[u].image);
+
+        oh->chunk = (H5O_chunk_t *)H5FL_SEQ_FREE(H5O_chunk_t, oh->chunk);
+    } /* end if */
+
+    /* Destroy messages */
+    if(oh->mesg) {
+        for(u = 0; u < oh->nmesgs; u++) {
+#ifndef NDEBUG
+            /* Verify that message is clean, unless it could have been marked
+             * dirty by decoding */
+            if(oh->ndecode_dirtied && oh->mesg[u].dirty)
+                oh->ndecode_dirtied--;
+            else
+                HDassert(oh->mesg[u].dirty == 0);
+#endif /* NDEBUG */
+
+            H5O_msg_free_mesg(&oh->mesg[u]);
+        } /* end for */
+
+        /* Make sure we accounted for all the messages dirtied by decoding */
+        HDassert(!oh->ndecode_dirtied);
+
+        oh->mesg = (H5O_mesg_t *)H5FL_SEQ_FREE(H5O_mesg_t, oh->mesg);
+    } /* end if */
+
+    /* destroy object header */
+    oh = H5FL_FREE(H5O_t, oh);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_free() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oainfo.c b/gatb-core/thirdparty/hdf5/src/H5Oainfo.c
new file mode 100644
index 0000000..5e0703b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oainfo.c
@@ -0,0 +1,533 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Oainfo.c
+ *                      Mar  6 2007
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             Attribute Information messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"             /* Attributes				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_ainfo_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_ainfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_ainfo_copy(const void *_mesg, void *_dest);
+static size_t H5O_ainfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_ainfo_free(void *_mesg);
+static herr_t H5O_ainfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    void *_mesg);
+static herr_t H5O_ainfo_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
+static void *H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_ainfo_post_copy_file(const H5O_loc_t *src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst,
+    unsigned *mesg_flags, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_ainfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+			     FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_AINFO[1] = {{
+    H5O_AINFO_ID,            	/*message id number             */
+    "ainfo",                 	/*message name for debugging    */
+    sizeof(H5O_ainfo_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_ainfo_decode,        	/*decode message                */
+    H5O_ainfo_encode,        	/*encode message                */
+    H5O_ainfo_copy,          	/*copy the native value         */
+    H5O_ainfo_size,          	/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_ainfo_free,	        /* free method			*/
+    H5O_ainfo_delete,	        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_ainfo_pre_copy_file,	/* pre copy native value to file */
+    H5O_ainfo_copy_file,	/* copy native value to file    */
+    H5O_ainfo_post_copy_file,   /* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_ainfo_debug          	/*debug the message             */
+}};
+
+/* Current version of attribute info information */
+#define H5O_AINFO_VERSION 	0
+
+/* Flags for attribute info flag encoding */
+#define H5O_AINFO_TRACK_CORDER          0x01
+#define H5O_AINFO_INDEX_CORDER          0x02
+#define H5O_AINFO_ALL_FLAGS             (H5O_AINFO_TRACK_CORDER | H5O_AINFO_INDEX_CORDER)
+
+/* Declare a free list to manage the H5O_ainfo_t struct */
+H5FL_DEFINE_STATIC(H5O_ainfo_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_decode
+ *
+ * Purpose:     Decode a message and return a pointer to a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native form.
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_ainfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_ainfo_t	*ainfo = NULL;  /* Attribute info */
+    unsigned char flags;        /* Flags for encoding attribute info */
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_AINFO_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (ainfo = H5FL_MALLOC(H5O_ainfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the flags for the message */
+    flags = *p++;
+    if(flags & ~H5O_AINFO_ALL_FLAGS)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad flag value for message")
+    ainfo->track_corder = (flags & H5O_AINFO_TRACK_CORDER) ? TRUE : FALSE;
+    ainfo->index_corder = (flags & H5O_AINFO_INDEX_CORDER) ? TRUE : FALSE;
+
+    /* Set the number of attributes on the object to an invalid value, so we query it later */
+    ainfo->nattrs = HSIZET_MAX;
+
+    /* Max. creation order value for the object */
+    if(ainfo->track_corder)
+        UINT16DECODE(p, ainfo->max_crt_idx)
+    else
+        ainfo->max_crt_idx = H5O_MAX_CRT_ORDER_IDX;
+
+    /* Address of fractal heap to store "dense" attributes */
+    H5F_addr_decode(f, &p, &(ainfo->fheap_addr));
+
+    /* Address of v2 B-tree to index names of attributes (names are always indexed) */
+    H5F_addr_decode(f, &p, &(ainfo->name_bt2_addr));
+
+    /* Address of v2 B-tree to index creation order of links, if there is one */
+    if(ainfo->index_corder)
+        H5F_addr_decode(f, &p, &(ainfo->corder_bt2_addr));
+    else
+        ainfo->corder_bt2_addr = HADDR_UNDEF;
+
+    /* Set return value */
+    ret_value = ainfo;
+
+done:
+    if(ret_value == NULL && ainfo != NULL)
+        ainfo = H5FL_FREE(H5O_ainfo_t, ainfo);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ainfo_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_ainfo_t   *ainfo = (const H5O_ainfo_t *)_mesg;
+    unsigned char       flags;          /* Flags for encoding attribute info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(ainfo);
+
+    /* Message version */
+    *p++ = H5O_AINFO_VERSION;
+
+    /* The flags for the attribute indices */
+    flags = ainfo->track_corder ? H5O_AINFO_TRACK_CORDER : 0;
+    flags = (unsigned char)(flags | (ainfo->index_corder ? H5O_AINFO_INDEX_CORDER : 0));
+    *p++ = flags;
+
+    /* Max. creation order value for the object */
+    if(ainfo->track_corder)
+        UINT16ENCODE(p, ainfo->max_crt_idx);
+
+    /* Address of fractal heap to store "dense" attributes */
+    H5F_addr_encode(f, &p, ainfo->fheap_addr);
+
+    /* Address of v2 B-tree to index names of attributes */
+    H5F_addr_encode(f, &p, ainfo->name_bt2_addr);
+
+    /* Address of v2 B-tree to index creation order of attributes, if they are indexed */
+    if(ainfo->index_corder)
+        H5F_addr_encode(f, &p, ainfo->corder_bt2_addr);
+    else
+        HDassert(!H5F_addr_defined(ainfo->corder_bt2_addr));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ainfo_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_ainfo_copy(const void *_mesg, void *_dest)
+{
+    const H5O_ainfo_t   *ainfo = (const H5O_ainfo_t *)_mesg;
+    H5O_ainfo_t         *dest = (H5O_ainfo_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(ainfo);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_ainfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *ainfo;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ainfo_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_ainfo_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_ainfo_t   *ainfo = (const H5O_ainfo_t *)_mesg;
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)(1                       /* Version */
+                + 1                     /* Index flags */
+                + (ainfo->track_corder ? 2 : 0) /* Curr. max. creation order value */
+                + H5F_SIZEOF_ADDR(f)    /* Address of fractal heap to store "dense" attributes */
+                + H5F_SIZEOF_ADDR(f)    /* Address of v2 B-tree for indexing names of attributes */
+                + (ainfo->index_corder ? H5F_SIZEOF_ADDR(f) : 0));   /* Address of v2 B-tree for indexing creation order values of attributes */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ainfo_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_ainfo_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_ainfo_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ainfo_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, March  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *_mesg)
+{
+    H5O_ainfo_t *ainfo = (H5O_ainfo_t *)_mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(ainfo);
+
+    /* If the object is using "dense" attribute storage, delete it */
+    if(H5F_addr_defined(ainfo->fheap_addr))
+        if(H5A_dense_delete(f, dxpl_id, ainfo) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free dense attribute storage")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ainfo_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, March  9, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void H5_ATTR_UNUSED *native_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(deleted);
+    HDassert(cpy_info);
+
+    /* If we are not copying attributes into the destination file, indicate
+     *  that this message should be deleted.
+     */
+    if(cpy_info->copy_without_attr)
+        *deleted = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ainfo_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  Peter Cao
+ *              July 18, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata, hid_t dxpl_id)
+{
+    H5O_ainfo_t *ainfo_src = (H5O_ainfo_t *)mesg_src;
+    H5O_ainfo_t *ainfo_dst = NULL;
+    void        *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file_src);
+    HDassert(ainfo_src);
+    HDassert(file_dst);
+    HDassert(cpy_info);
+    HDassert(!cpy_info->copy_without_attr);
+
+    /* Allocate space for the destination message */
+    if(NULL == (ainfo_dst = H5FL_MALLOC(H5O_ainfo_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the top level of the information */
+    *ainfo_dst = *ainfo_src;
+
+    if(H5F_addr_defined(ainfo_src->fheap_addr)) {
+        /* copy dense attribute */
+
+        if(H5A_dense_create(file_dst, dxpl_id, ainfo_dst) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to create dense storage for attributes")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = ainfo_dst;
+
+done:
+    /* Release destination attribute information on failure */
+    if(!ret_value && ainfo_dst)
+        ainfo_dst = H5FL_FREE(H5O_ainfo_t, ainfo_dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_ainfo_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files.
+ *              We have to copy the values of a reference attribute in the
+ *              post copy because H5O_post_copy_file() fails in the case that
+ *              an object may have a reference attribute that points to the
+ *              object itself.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              July 25, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+    H5O_loc_t *dst_oloc, void *mesg_dst, unsigned H5_ATTR_UNUSED *mesg_flags,
+    hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    const H5O_ainfo_t *ainfo_src = (const H5O_ainfo_t *)mesg_src;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(ainfo_src);
+
+    if(H5F_addr_defined(ainfo_src->fheap_addr)) {
+        if(H5A_dense_post_copy_file_all(src_oloc, ainfo_src, dst_oloc,
+                (H5O_ainfo_t *)mesg_dst, dxpl_id, cpy_info) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't copy attribute")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_ainfo_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ainfo_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ainfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_ainfo_t       *ainfo = (const H5O_ainfo_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(ainfo);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of attributes:", ainfo->nattrs);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Track creation order of attributes:", ainfo->track_corder);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Index creation order of attributes:", ainfo->index_corder);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max. creation index value:", (unsigned)ainfo->max_crt_idx);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' attribute storage fractal heap address:", ainfo->fheap_addr);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' attribute storage name index v2 B-tree address:", ainfo->name_bt2_addr);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' attribute storage creation order index v2 B-tree address:", ainfo->corder_bt2_addr);
+
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ainfo_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oalloc.c b/gatb-core/thirdparty/hdf5/src/H5Oalloc.c
new file mode 100644
index 0000000..e9d4f85
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oalloc.c
@@ -0,0 +1,2311 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Oalloc.c
+ *			Nov 17 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object header allocation routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5O_add_gap(H5F_t *f, H5O_t *oh, unsigned chunkno,
+    hbool_t *chk_dirtied, size_t idx, uint8_t *new_gap_loc, size_t new_gap_size);
+static herr_t H5O_eliminate_gap(H5O_t *oh, hbool_t *chk_dirtied,
+    H5O_mesg_t *mesg, uint8_t *new_gap_loc, size_t new_gap_size);
+static herr_t H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t null_idx,
+    const H5O_msg_class_t *new_type, void *new_native, size_t new_size);
+static htri_t H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    unsigned chunkno, size_t size, size_t *msg_idx);
+static herr_t H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size,
+    size_t *new_idx);
+static htri_t H5O_move_cont(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned cont_u);
+static htri_t H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+static htri_t H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+static htri_t H5O_remove_empty_chunks(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+static herr_t H5O_alloc_shrink_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    unsigned chunkno);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern the free list for H5O_cont_t's */
+H5FL_EXTERN(H5O_cont_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_add_gap
+ *
+ * Purpose:     Add a gap to a chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_add_gap(H5F_t *f, H5O_t *oh, unsigned chunkno, hbool_t *chk_dirtied,
+    size_t idx, uint8_t *new_gap_loc, size_t new_gap_size)
+{
+    hbool_t merged_with_null;           /* Whether the gap was merged with a null message */
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(oh->version > H5O_VERSION_1);
+    HDassert(chk_dirtied);
+    HDassert(new_gap_loc);
+    HDassert(new_gap_size);
+
+#ifndef NDEBUG
+if(chunkno > 0) {
+    unsigned chk_proxy_status = 0;         /* Object header chunk proxy entry cache status */
+
+    /* Check the object header chunk proxy's status in the metadata cache */
+    if(H5AC_get_entry_status(f, oh->chunk[chunkno].addr, &chk_proxy_status) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to check metadata cache status for object header chunk proxy")
+
+    /* Make certain that object header is protected */
+    HDassert(chk_proxy_status & H5AC_ES__IS_PROTECTED);
+} /* end if */
+#endif /* NDEBUG */
+
+    /* Check for existing null message in chunk */
+    merged_with_null = FALSE;
+    for(u = 0; u < oh->nmesgs && !merged_with_null; u++) {
+        /* Find a null message in the chunk with the new gap */
+        /* (a null message that's not the one we are eliminating) */
+        if(H5O_NULL_ID == oh->mesg[u].type->id && oh->mesg[u].chunkno == chunkno
+                && u != idx) {
+            /* Sanity check - chunks with null messages shouldn't have a gap */
+            HDassert(oh->chunk[chunkno].gap == 0);
+
+            /* Eliminate the gap in the chunk */
+            if(H5O_eliminate_gap(oh, chk_dirtied, &oh->mesg[u], new_gap_loc, new_gap_size) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't eliminate gap in chunk")
+
+            /* Set flag to indicate that the gap was handled */
+            merged_with_null = TRUE;
+        } /* end if */
+    } /* end for */
+
+    /* If we couldn't find a null message in the chunk, move the gap to the end */
+    if(!merged_with_null) {
+        /* Adjust message offsets after new gap forward in chunk */
+        for(u = 0; u < oh->nmesgs; u++)
+            if(oh->mesg[u].chunkno == chunkno && oh->mesg[u].raw > new_gap_loc)
+                oh->mesg[u].raw -= new_gap_size;
+
+        /* Slide raw message info forward in chunk image */
+        HDmemmove(new_gap_loc, new_gap_loc + new_gap_size,
+                (size_t)((oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM_OH(oh))) - (new_gap_loc + new_gap_size)));
+
+        /* Add existing gap size to new gap size */
+        new_gap_size += oh->chunk[chunkno].gap;
+
+        /* Merging with existing gap will allow for a new null message */
+        if(new_gap_size >= (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
+            H5O_mesg_t *null_msg;       /* Pointer to new null message */
+
+            /* Check if we need to extend message table to hold the new null message */
+            if(oh->nmesgs >= oh->alloc_nmesgs)
+                if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+            /* Increment new gap size */
+            oh->chunk[chunkno].gap += new_gap_size;
+
+            /* Create new null message, with the tail of the previous null message */
+            null_msg = &(oh->mesg[oh->nmesgs++]);
+            null_msg->type = H5O_MSG_NULL;
+            null_msg->native = NULL;
+            null_msg->raw_size = new_gap_size - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+            null_msg->raw = (oh->chunk[chunkno].image + oh->chunk[chunkno].size)
+                    - (H5O_SIZEOF_CHKSUM_OH(oh) + null_msg->raw_size);
+            null_msg->chunkno = chunkno;
+
+            /* Zero out new null message's raw data */
+            if(null_msg->raw_size)
+                HDmemset(null_msg->raw, 0, null_msg->raw_size);
+
+            /* Mark message as dirty */
+            null_msg->dirty = TRUE;
+
+            /* Reset size of gap in chunk */
+            oh->chunk[chunkno].gap = 0;
+        } /* end if */
+        else
+            oh->chunk[chunkno].gap = new_gap_size;
+
+        /* Mark the chunk as modified */
+        *chk_dirtied = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_add_gap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_eliminate_gap
+ *
+ * Purpose:     Eliminate a gap in a chunk with a null message.
+ *
+ * Note:        Sometimes this happens as a result of converting an existing
+ *              non-null message to a null message, so we zero out the gap
+ *              here, even though it might already be zero (when we're adding
+ *              a gap to a chunk with an existing null message).  (Mostly,
+ *              this just simplifies the code, esp. with the necessary chunk
+ *              locking -QAK)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Oct 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_eliminate_gap(H5O_t *oh, hbool_t *chk_dirtied, H5O_mesg_t *mesg,
+    uint8_t *gap_loc, size_t gap_size)
+{
+    uint8_t *move_start, *move_end;     /* Pointers to area of messages to move */
+    hbool_t null_before_gap;            /* Flag whether the null message is before the gap or not */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(oh);
+    HDassert(oh->version > H5O_VERSION_1);
+    HDassert(chk_dirtied);
+    HDassert(mesg);
+    HDassert(gap_loc);
+    HDassert(gap_size);
+
+    /* Check if the null message is before or after the gap produced */
+    null_before_gap = (hbool_t)(mesg->raw < gap_loc);
+
+    /* Set up information about region of messages to move */
+    if(null_before_gap) {
+        move_start = mesg->raw + mesg->raw_size;
+        move_end = gap_loc;
+    } /* end if */
+    else {
+        move_start = gap_loc + gap_size;
+        move_end = mesg->raw - H5O_SIZEOF_MSGHDR_OH(oh);
+    } /* end else */
+
+    /* Check for messages between null message and gap */
+    if(move_end > move_start) {
+        unsigned u;                 /* Local index variable */
+
+        /* Look for messages that need to move, to adjust raw pointers in chunk */
+        /* (this doesn't change the moved messages 'dirty' state) */
+        for(u = 0; u < oh->nmesgs; u++) {
+            uint8_t *msg_start;     /* Start of encoded message in chunk */
+
+            msg_start = oh->mesg[u].raw - H5O_SIZEOF_MSGHDR_OH(oh);
+            if(oh->mesg[u].chunkno == mesg->chunkno
+                    && (msg_start >= move_start && msg_start < move_end)) {
+                /* Move message's raw pointer in appropriate direction */
+                if(null_before_gap)
+                    oh->mesg[u].raw += gap_size;
+                else
+                    oh->mesg[u].raw -= gap_size;
+            } /* end if */
+        } /* end for */
+
+        /* Slide raw message info in chunk image */
+        if(null_before_gap)
+            /* Slide messages down */
+            HDmemmove(move_start + gap_size, move_start, (size_t)(move_end - move_start));
+        else {
+            /* Slide messages up */
+            HDmemmove(move_start - gap_size, move_start, (size_t)(move_end - move_start));
+
+            /* Adjust start of null message */
+            mesg->raw -= gap_size;
+        } /* end else */
+    }
+    else if(move_end == move_start && !null_before_gap) {
+	/* Slide null message up */
+	HDmemmove(move_start - gap_size, move_start, mesg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+	/* Adjust start of null message */
+	mesg->raw -= gap_size;
+    } /* end if */
+
+    /* Zero out addition to null message */
+    HDmemset(mesg->raw + mesg->raw_size, 0, gap_size);
+
+    /* Adjust size of null message */
+    mesg->raw_size += gap_size;
+
+    /* Set the gap size to zero for the chunk */
+    oh->chunk[mesg->chunkno].gap = 0;
+
+    /* Mark null message as dirty */
+    mesg->dirty = TRUE;
+    *chk_dirtied = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O_eliminate_gap() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_alloc_null
+ *
+ * Purpose:     Allocate room for a new message from a null message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 22 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t null_idx,
+    const H5O_msg_class_t *new_type, void *new_native, size_t new_size)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that message is in */
+    hbool_t chk_dirtied = FALSE;        /* Flags for unprotecting chunk */
+    H5O_mesg_t *alloc_msg;              /* Pointer to null message to allocate out of */
+    herr_t ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(new_type);
+    HDassert(new_size);
+
+    /* Point to null message to allocate out of */
+    alloc_msg = &oh->mesg[null_idx];
+
+    /* Protect chunk */
+    if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, alloc_msg->chunkno)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+    /* Check if there's a need to split the null message */
+    if(alloc_msg->raw_size > new_size) {
+        /* Check for producing a gap in the chunk */
+        if((alloc_msg->raw_size - new_size) < (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
+            size_t gap_size = alloc_msg->raw_size - new_size;     /* Size of gap produced */
+
+            /* Adjust the size of the null message being eliminated */
+            alloc_msg->raw_size = new_size;
+
+            /* Add the gap to the chunk */
+            if(H5O_add_gap(f, oh, alloc_msg->chunkno, &chk_dirtied, null_idx, alloc_msg->raw + alloc_msg->raw_size, gap_size) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert gap in chunk")
+        } /* end if */
+        else {
+            size_t  new_mesg_size = new_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh); /* Total size of newly allocated message */
+            H5O_mesg_t *null_msg;       /* Pointer to new null message */
+
+            /* Check if we need to extend message table to hold the new null message */
+            if(oh->nmesgs >= oh->alloc_nmesgs) {
+                if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+                /* "Retarget" 'alloc_msg' pointer into newly re-allocated array of messages */
+                alloc_msg = &oh->mesg[null_idx];
+            } /* end if */
+
+            /* Create new null message, with the tail of the previous null message */
+            null_msg = &(oh->mesg[oh->nmesgs++]);
+            null_msg->type = H5O_MSG_NULL;
+            null_msg->native = NULL;
+            null_msg->raw = alloc_msg->raw + new_mesg_size;
+            null_msg->raw_size = alloc_msg->raw_size - new_mesg_size;
+            null_msg->chunkno = alloc_msg->chunkno;
+
+            /* Mark the message as dirty */
+            null_msg->dirty = TRUE;
+            chk_dirtied = TRUE;
+
+            /* Check for gap in new null message's chunk */
+            if(oh->chunk[null_msg->chunkno].gap > 0) {
+                unsigned null_chunkno = null_msg->chunkno;   /* Chunk w/gap */
+
+                /* Eliminate the gap in the chunk */
+                if(H5O_eliminate_gap(oh, &chk_dirtied, null_msg,
+                        ((oh->chunk[null_chunkno].image + oh->chunk[null_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[null_chunkno].gap)),
+                        oh->chunk[null_chunkno].gap) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+            } /* end if */
+
+            /* Set the size of the new "real" message */
+            alloc_msg->raw_size = new_size;
+        } /* end else */
+    } /* end if */
+
+    /* Initialize the new message */
+    alloc_msg->type = new_type;
+    alloc_msg->native = new_native;
+
+    /* Mark the new message as dirty */
+    alloc_msg->dirty = TRUE;
+    chk_dirtied = TRUE;
+
+done:
+    /* Release chunk */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc_null() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_alloc_msgs
+ *
+ * Purpose:     Allocate more messages for a header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Nov 21 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_alloc_msgs(H5O_t *oh, size_t min_alloc)
+{
+    size_t old_alloc;                   /* Old number of messages allocated */
+    size_t na;                          /* New number of messages allocated */
+    H5O_mesg_t *new_mesg;               /* Pointer to new message array */
+    herr_t ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+
+    /* Initialize number of messages information */
+    old_alloc = oh->alloc_nmesgs;
+    na = oh->alloc_nmesgs + MAX(oh->alloc_nmesgs, min_alloc);   /* At least double */
+
+    /* Attempt to allocate more memory */
+    if(NULL == (new_mesg = H5FL_SEQ_REALLOC(H5O_mesg_t, oh->mesg, na)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Update ohdr information */
+    oh->alloc_nmesgs = na;
+    oh->mesg = new_mesg;
+
+    /* Set new object header info to zeros */
+    HDmemset(&oh->mesg[old_alloc], 0, (oh->alloc_nmesgs - old_alloc) * sizeof(H5O_mesg_t));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc_msgs() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_alloc_extend_chunk
+ *
+ * Purpose:     Attempt to extend a chunk that is allocated on disk.
+ *
+ *              If the extension is successful, and if the last message
+ *		of the chunk is the null message, then that message will
+ *		be extended with the chunk.  Otherwise a new null message
+ *		is created.
+ *
+ *              f is the file in which the chunk will be written.  It is
+ *              included to ensure that there is enough space to extend
+ *              this chunk.
+ *
+ * Return:      TRUE:		The chunk has been extended, and *msg_idx
+ *				contains the message index for null message
+ *				which is large enough to hold size bytes.
+ *
+ *		FALSE:		The chunk cannot be extended, and *msg_idx
+ *				is undefined.
+ *
+ *		FAIL:		Some internal error has been detected.
+ *
+ * Programmer:  John Mainzer -- 8/16/05
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno,
+    size_t size, size_t *msg_idx)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;    /* Chunk that message is in */
+    hbool_t     chk_dirtied = FALSE;        /* Flag for unprotecting chunk */
+    size_t      delta;          /* Change in chunk's size */
+    size_t      aligned_size = H5O_ALIGN_OH(oh, size);
+    uint8_t     *old_image;     /* Old address of chunk's image in memory */
+    size_t      old_size;       /* Old size of chunk */
+    htri_t      was_extended;   /* If chunk can be extended */
+    size_t      extend_msg;     /* Index of null message to extend */
+    hbool_t     extended_msg = FALSE;   /* Whether an existing message was extended */
+    uint8_t     new_size_flags = 0;     /* New chunk #0 size flags */
+    hbool_t     adjust_size_flags = FALSE;      /* Whether to adjust the chunk #0 size flags */
+    size_t      extra_prfx_size = 0; /* Extra bytes added to object header prefix */
+    size_t      u;              /* Local index variable */
+    htri_t      ret_value = TRUE; 	/* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f != NULL);
+    HDassert(oh != NULL);
+    HDassert(chunkno < oh->nchunks);
+    HDassert(size > 0);
+    HDassert(msg_idx != NULL);
+    HDassert(H5F_addr_defined(oh->chunk[chunkno].addr));
+
+    /* Test to see if the specified chunk ends with a null messages.
+     * If successful, set the index of the the null message in extend_msg.
+     */
+    for(u = 0; u < oh->nmesgs; u++) {
+        /* Check for null message at end of proper chunk */
+        /* (account for possible checksum at end of chunk) */
+        if(oh->mesg[u].chunkno == chunkno && H5O_NULL_ID == oh->mesg[u].type->id &&
+                ((oh->mesg[u].raw + oh->mesg[u].raw_size)
+                == ((oh->chunk[chunkno].image + oh->chunk[chunkno].size) -
+                    (oh->chunk[chunkno].gap + H5O_SIZEOF_CHKSUM_OH(oh))))) {
+
+            extend_msg = u;
+            extended_msg = TRUE;
+            break;
+        } /* end if */
+    } /* end for */
+
+    /* If we can extend an existing null message, adjust the delta appropriately */
+    if(extended_msg) {
+        HDassert(oh->chunk[chunkno].gap == 0);
+        delta = aligned_size - oh->mesg[extend_msg].raw_size;
+    } /* end if */
+    else
+        delta = (aligned_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) - oh->chunk[chunkno].gap;
+    delta = H5O_ALIGN_OH(oh, delta);
+
+    /* Check for changing the chunk #0 data size enough to need adjusting the flags */
+    if(oh->version > H5O_VERSION_1 && chunkno == 0) {
+        uint64_t chunk0_size;           /* Size of chunk 0's data */
+        size_t   orig_prfx_size = (size_t)1 << (oh->flags & H5O_HDR_CHUNK0_SIZE); /* Original prefix size */
+
+        HDassert(oh->chunk[0].size >= (size_t)H5O_SIZEOF_HDR(oh));
+        chunk0_size = oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh);
+
+        /* Check for moving to a 8-byte size encoding */
+        if(orig_prfx_size < 8 && (chunk0_size + delta) > 4294967295) {
+            extra_prfx_size = 8 - orig_prfx_size;
+            new_size_flags = H5O_HDR_CHUNK0_8;
+            adjust_size_flags = TRUE;
+        } /* end if */
+        /* Check for moving to a 4-byte size encoding */
+        else if(orig_prfx_size < 4 && (chunk0_size + delta) > 65535) {
+            extra_prfx_size = 4 - orig_prfx_size;
+            new_size_flags = H5O_HDR_CHUNK0_4;
+            adjust_size_flags = TRUE;
+        } /* end if */
+        /* Check for moving to a 2-byte size encoding */
+        else if(orig_prfx_size < 2 && (chunk0_size + delta) > 255) {
+            extra_prfx_size = 2 - orig_prfx_size;
+            new_size_flags = H5O_HDR_CHUNK0_2;
+            adjust_size_flags = TRUE;
+        } /* end if */
+    } /* end if */
+
+    /* Protect chunk */
+    if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, chunkno)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+    /* Determine whether the chunk can be extended */
+    was_extended = H5MF_try_extend(f, dxpl_id, H5FD_MEM_OHDR, oh->chunk[chunkno].addr,
+                                 (hsize_t)(oh->chunk[chunkno].size), (hsize_t)(delta + extra_prfx_size));
+    if(was_extended < 0) /* error */
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTEXTEND, FAIL, "can't tell if we can extend chunk")
+    else if(was_extended == FALSE)     /* can't extend -- we are done */
+        HGOTO_DONE(FALSE)
+
+    /* Adjust object header prefix flags */
+    if(adjust_size_flags) {
+        oh->flags = (uint8_t)(oh->flags & ~H5O_HDR_CHUNK0_SIZE);
+        oh->flags |= new_size_flags;
+
+        /* Mark object header as dirty in cache */
+        if(H5AC_mark_entry_dirty(oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+    } /* end if */
+
+    /* If we can extend an existing null message, take care of that */
+    if(extended_msg) {
+        /* Adjust message size of existing null message */
+        oh->mesg[extend_msg].raw_size += delta;
+    } /* end if */
+    /* Create new null message for end of chunk */
+    else {
+        /* Create a new null message */
+        if(oh->nmesgs >= oh->alloc_nmesgs)
+            if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+        /* Set extension message */
+        extend_msg = oh->nmesgs++;
+
+        /* Initialize new null message */
+        oh->mesg[extend_msg].type = H5O_MSG_NULL;
+        oh->mesg[extend_msg].native = NULL;
+        oh->mesg[extend_msg].raw = ((oh->chunk[chunkno].image + oh->chunk[chunkno].size)
+                - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[chunkno].gap))
+                + H5O_SIZEOF_MSGHDR_OH(oh);
+        oh->mesg[extend_msg].raw_size = (delta + oh->chunk[chunkno].gap) - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+        oh->mesg[extend_msg].chunkno = chunkno;
+    } /* end else */
+
+    /* Mark the extended message as dirty */
+    oh->mesg[extend_msg].dirty = TRUE;
+    chk_dirtied = TRUE;
+
+    /* Allocate more memory space for chunk's image */
+    old_image = oh->chunk[chunkno].image;
+    old_size = oh->chunk[chunkno].size;
+    oh->chunk[chunkno].size += delta + extra_prfx_size;
+    oh->chunk[chunkno].image = H5FL_BLK_REALLOC(chunk_image, old_image, oh->chunk[chunkno].size);
+    oh->chunk[chunkno].gap = 0;
+    if(NULL == oh->chunk[chunkno].image)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Wipe new space for chunk */
+    HDmemset(oh->chunk[chunkno].image + old_size, 0, oh->chunk[chunkno].size - old_size);
+
+    /* Move chunk 0 data up if the size flags changed */
+    if(adjust_size_flags)
+        HDmemmove(oh->chunk[0].image + H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh),
+                oh->chunk[0].image + H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh) - extra_prfx_size,
+                old_size - (size_t)H5O_SIZEOF_HDR(oh) + extra_prfx_size);
+
+    /* Spin through existing messages, adjusting them */
+    for(u = 0; u < oh->nmesgs; u++) {
+        /* Adjust raw addresses for messages in this chunk to reflect new 'image' address */
+        if(oh->mesg[u].chunkno == chunkno)
+            oh->mesg[u].raw = oh->chunk[chunkno].image + extra_prfx_size + (oh->mesg[u].raw - old_image);
+
+        /* Find continuation message which points to this chunk and adjust chunk's size */
+        /* (Chunk 0 doesn't have a continuation message that points to it and
+         * it's size is directly encoded in the object header) */
+        if(chunkno > 0 && (H5O_CONT_ID == oh->mesg[u].type->id) &&
+                (((H5O_cont_t *)(oh->mesg[u].native))->chunkno == chunkno)) {
+            H5O_chunk_proxy_t *chk_proxy2 = NULL;       /* Chunk that continuation message is in */
+            hbool_t chk_dirtied2 = FALSE;               /* Flag for unprotecting chunk */
+            unsigned cont_chunkno = oh->mesg[u].chunkno;    /* Chunk # for continuation message */
+
+            /* Protect chunk containing continuation message */
+            if(NULL == (chk_proxy2 = H5O_chunk_protect(f, dxpl_id, oh, cont_chunkno)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+            /* Adjust size in continuation message */
+            HDassert(((H5O_cont_t *)(oh->mesg[u].native))->size == old_size);
+            ((H5O_cont_t *)(oh->mesg[u].native))->size = oh->chunk[chunkno].size;
+
+            /* Flag continuation message as dirty */
+            oh->mesg[u].dirty = TRUE;
+            chk_dirtied2 = TRUE;
+
+            /* Release chunk containing continuation message */
+            if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy2, chk_dirtied2) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+        } /* end if */
+    } /* end for */
+
+    /* Resize the chunk in the cache */
+    if(H5O_chunk_resize(oh, chk_proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRESIZE, FAIL, "unable to resize object header chunk")
+
+    /* Set new message index */
+    *msg_idx = extend_msg;
+
+done:
+    /* Release chunk */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc_extend_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_alloc_new_chunk
+ *
+ * Purpose:     Allocates a new chunk for the object header, including
+ *		file space.
+ *
+ *              One of the other chunks will get an object continuation
+ *		message.  If there isn't room in any other chunk for the
+ *		object continuation message, then some message from
+ *		another chunk is moved into this chunk to make room.
+ *
+ *              SIZE need not be aligned.
+ *
+ * Note:	The algorithm for finding a message to replace with a
+ *		continuation message is still fairly limited.  It's possible
+ *		that two (or more) messages smaller than a continuation message
+ *		might occupy a chunk and need to be moved in order to make
+ *		room for the continuation message.
+ *
+ *		Also, we aren't checking for NULL messages in front of another
+ *		message right now...
+ *
+ * Return:      Success:        Index number of the null message for the
+ *                              new chunk.  The null message will be at
+ *                              least SIZE bytes not counting the message
+ *                              ID or size fields.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  7 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new_idx)
+{
+    /* Struct for storing information about "best" messages to allocate from */
+    typedef struct {
+        int msgno;                      /* Index in message array */
+        size_t gap_size;                /* Size of any "gap" in the chunk immediately after message */
+        size_t null_size;               /* Size of any null message in the chunk immediately after message */
+        size_t total_size;              /* Total size of "available" space around message */
+        unsigned null_msgno;            /* Message index of null message immediately after message */
+    } alloc_info;
+
+    H5O_mesg_t *curr_msg;               /* Pointer to current message to operate on */
+    H5O_chunk_proxy_t *chk_proxy;       /* Chunk that message is in */
+    size_t      cont_size;              /*continuation message size     */
+    size_t      multi_size = 0;         /* Size of all the messages in the last chunk */
+    int         found_null = (-1);      /* Best fit null message         */
+    alloc_info  found_attr = {-1, 0, 0, 0, 0};      /* Best fit attribute message    */
+    alloc_info  found_other = {-1, 0, 0, 0, 0};     /* Best fit other message        */
+    size_t      idx;                    /* Message number */
+    uint8_t     *p = NULL;              /*ptr into new chunk            */
+    H5O_cont_t  *cont = NULL;           /*native continuation message   */
+    size_t      chunkno;                /* Chunk allocated */
+    haddr_t	new_chunk_addr;
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(size > 0);
+    size = H5O_ALIGN_OH(oh, size);
+
+    /*
+     * Find the smallest null message that will hold an object
+     * continuation message.  Failing that, find the smallest message
+     * that could be moved to make room for the continuation message.
+     *
+     * Don't ever move continuation message from one chunk to another.
+     *
+     * Avoid moving attributes when possible to preserve their
+     * ordering (although ordering is *not* guaranteed!).
+     *
+     */
+    cont_size = H5O_ALIGN_OH(oh, (size_t)(H5F_SIZEOF_ADDR(f) + H5F_SIZEOF_SIZE(f)));
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+        if(curr_msg->type->id == H5O_NULL_ID) {
+            if(cont_size == curr_msg->raw_size) {
+                found_null = (int)u;
+                break;
+            }  /* end if */
+            else if(curr_msg->raw_size > cont_size &&
+                    (found_null < 0 || curr_msg->raw_size < oh->mesg[found_null].raw_size))
+                found_null = (int)u;
+        } /* end if */
+        else if(curr_msg->type->id == H5O_CONT_ID) {
+            /* Don't consider continuation messages (for now) */
+        } /* end if */
+        else if(curr_msg->locked) {
+            /* Don't consider locked messages */
+        } /* end if */
+        else {
+            unsigned msg_chunkno = curr_msg->chunkno;         /* Chunk that the message is in */
+            uint8_t *end_chunk_data = (oh->chunk[msg_chunkno].image + oh->chunk[msg_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[msg_chunkno].gap);     /* End of message data in chunk */
+            uint8_t *end_msg = curr_msg->raw + curr_msg->raw_size;  /* End of current message */
+            size_t gap_size = 0;            /* Size of gap after current message */
+            size_t null_size = 0;           /* Size of NULL message after current message */
+            unsigned null_msgno = 0;        /* Index of NULL message after current message */
+            size_t total_size;              /* Total size of available space "around" current message */
+
+            /* Check if the message is the last one in the chunk */
+            if(end_msg == end_chunk_data)
+                gap_size = oh->chunk[msg_chunkno].gap;
+            else {
+                H5O_mesg_t *tmp_msg;    /* Temp. pointer to message to operate on */
+                unsigned v;             /* Local index variable */
+
+                /* Check for null message after this message, in same chunk */
+                for(v = 0, tmp_msg = &oh->mesg[0]; v < oh->nmesgs; v++, tmp_msg++) {
+                    if(tmp_msg->type->id == H5O_NULL_ID && (tmp_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)) == end_msg) {
+                        null_msgno = v;
+                        null_size = (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + tmp_msg->raw_size;
+                        break;
+                    } /* end if */
+
+                    /* XXX: Should also check for NULL message in front of current message... */
+
+                } /* end for */
+            } /* end else */
+
+            /* Add up current message's total available space */
+            total_size = curr_msg->raw_size + gap_size + null_size;
+
+            /* Check if message is large enough to hold continuation info */
+            if(total_size >= cont_size) {
+                if(curr_msg->type->id == H5O_ATTR_ID) {
+                    if(found_attr.msgno < 0 || total_size < found_attr.total_size) {
+                        found_attr.msgno = (int)u;
+                        found_attr.gap_size = gap_size;
+                        found_attr.null_size = null_size;
+                        found_attr.total_size = total_size;
+                        found_attr.null_msgno = null_msgno;
+                    } /* end if */
+                } /* end if */
+                else {
+                    if(found_other.msgno < 0 || total_size < found_other.total_size) {
+                        found_other.msgno = (int)u;
+                        found_other.gap_size = gap_size;
+                        found_other.null_size = null_size;
+                        found_other.total_size = total_size;
+                        found_other.null_msgno = null_msgno;
+                    } /* end if */
+                } /* end else */
+            } /* end if */
+            else if(found_null < 0 && found_attr.msgno < 0 && found_other.msgno < 0 && msg_chunkno == oh->nchunks - 1)
+                /* Keep track of the total size of smaller messages in the last
+                 * chunk, in case we need to move more than 1 message.
+                 */
+                multi_size += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+        } /* end else */
+    } /* end for */
+    if(found_null >= 0 || found_attr.msgno >= 0 || found_other.msgno >= 0)
+        multi_size = 0;
+
+    /*
+     * If we must move some other message to make room for the null
+     * message, then make sure the new chunk has enough room for that
+     * other message.
+     *
+     * Move other messages first, and attributes only as a last resort.
+     *
+     * If all else fails, move every message in the last chunk.
+     *
+     */
+    if(multi_size == 0) {
+        if(found_null < 0) {
+            if(found_other.msgno < 0)
+                found_other = found_attr;
+
+            HDassert(found_other.msgno >= 0);
+            size += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
+        } /* end if */
+    } /* end if */
+    else
+        size += multi_size;
+
+    /*
+     * The total chunk size must include the requested space plus enough
+     * for the message header.  This must be at least some minimum and
+     * aligned propertly.
+     */
+    size = MAX(H5O_MIN_SIZE, size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+    HDassert(size == H5O_ALIGN_OH(oh, size));
+
+    /*
+     * The total chunk size must include enough space for the checksum
+     * on the chunk and the continuation chunk magic #. (which are only present
+     * in later versions of the object header)
+     */
+    size +=  H5O_SIZEOF_CHKHDR_OH(oh);
+
+    /* allocate space in file to hold the new chunk */
+    new_chunk_addr = H5MF_alloc(f, H5FD_MEM_OHDR, dxpl_id, (hsize_t)size);
+    if(HADDR_UNDEF == new_chunk_addr)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate space for new chunk")
+
+    /*
+     * Create the new chunk giving it a file address.
+     */
+    if(oh->nchunks >= oh->alloc_nchunks) {
+        size_t na = MAX(H5O_NCHUNKS, oh->alloc_nchunks * 2);        /* Double # of chunks allocated */
+        H5O_chunk_t *x;
+
+        if(NULL == (x = H5FL_SEQ_REALLOC(H5O_chunk_t, oh->chunk, na)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        oh->alloc_nchunks = na;
+        oh->chunk = x;
+    } /* end if */
+
+    chunkno = oh->nchunks++;
+    oh->chunk[chunkno].addr = new_chunk_addr;
+    oh->chunk[chunkno].size = size;
+    oh->chunk[chunkno].gap = 0;
+    if(NULL == (oh->chunk[chunkno].image = p = H5FL_BLK_CALLOC(chunk_image, size)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* If this is a later version of the object header format, put the magic
+     *  # at the beginning of the chunk image.
+     */
+    if(oh->version > H5O_VERSION_1) {
+        HDmemcpy(p, H5O_CHK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+    } /* end if */
+
+    /*
+     * Make sure we have enough space for all possible new messages
+     * that could be generated below.
+     */
+    if(oh->nmesgs + 3 > oh->alloc_nmesgs)
+        if(H5O_alloc_msgs(oh, (size_t)3) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+    /* Check if we need to move multiple messages, in order to make room for the new message */
+    if(multi_size > 0) {
+        /* Move all non-null messages in the last chunk to the new chunk.  This
+         * should be extremely rare so we don't care too much about minimizing
+         * the space used.
+         */
+        H5O_mesg_t *null_msg;       /* Pointer to new null message */
+
+        /* Protect last chunk */
+        if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, chunkno - 1)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+        /* Copy each message to the new location */
+        for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++)
+            if(curr_msg->chunkno == chunkno - 1) {
+                if(curr_msg->type->id == H5O_NULL_ID) {
+                    /* Delete the null message */
+                    if(u < oh->nmesgs - 1)
+                        HDmemmove(curr_msg, curr_msg + 1, ((oh->nmesgs - 1) - u) * sizeof(H5O_mesg_t));
+                    oh->nmesgs--;
+                } /* end if */
+                else {
+                    /* Copy the raw data */
+                    HDmemcpy(p, curr_msg->raw - (size_t)H5O_SIZEOF_MSGHDR_OH(oh),
+                        curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+                    /* Update the message info */
+                    curr_msg->chunkno = chunkno;
+                    curr_msg->raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+
+                    /* Account for copied message in new chunk */
+                    p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
+                    size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
+                } /* end else */
+            } /* end if */
+
+        /* Create a null message spanning the entire last chunk */
+        found_null = (int)oh->nmesgs++;
+        null_msg = &(oh->mesg[found_null]);
+        null_msg->type = H5O_MSG_NULL;
+        null_msg->dirty = TRUE;
+        null_msg->native = NULL;
+        null_msg->raw = oh->chunk[chunkno - 1].image
+                + ((chunkno == 1) ? H5O_SIZEOF_HDR(oh) : H5O_SIZEOF_CHKHDR_OH(oh))
+                - H5O_SIZEOF_CHKSUM_OH(oh) + H5O_SIZEOF_MSGHDR_OH(oh);
+        null_msg->raw_size = oh->chunk[chunkno - 1].size
+                - ((chunkno == 1) ? (size_t)H5O_SIZEOF_HDR(oh) : (size_t)H5O_SIZEOF_CHKHDR_OH(oh))
+                - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+        null_msg->chunkno = chunkno - 1;
+
+        HDassert(null_msg->raw_size >= cont_size);
+
+        /* Remove any gap in the chunk */
+        oh->chunk[chunkno - 1].gap = 0;
+
+        /* Release chunk, marking it dirty */
+        if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+    } else if(found_null < 0) {
+        /* Move message (that will be replaced with continuation message)
+         *  to new chunk, if necessary.
+         */
+        H5O_mesg_t *null_msg;       /* Pointer to new null message */
+
+        /* Protect chunk */
+        if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, oh->mesg[found_other.msgno].chunkno)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+        /* Create null message for space that message to copy currently occupies */
+        found_null = (int)oh->nmesgs++;
+        null_msg = &(oh->mesg[found_null]);
+        null_msg->type = H5O_MSG_NULL;
+        null_msg->native = NULL;
+        null_msg->raw = oh->mesg[found_other.msgno].raw;
+        null_msg->raw_size = oh->mesg[found_other.msgno].raw_size;
+        null_msg->chunkno = oh->mesg[found_other.msgno].chunkno;
+
+        /* Copy the message to move (& its prefix) to its new location */
+        HDmemcpy(p, oh->mesg[found_other.msgno].raw - H5O_SIZEOF_MSGHDR_OH(oh),
+                 oh->mesg[found_other.msgno].raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+        /* Switch moved message to point to new location */
+        oh->mesg[found_other.msgno].raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+        oh->mesg[found_other.msgno].chunkno = chunkno;
+
+        /* Account for copied message in new chunk */
+        p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
+        size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
+
+        /* Add any available space after the message to move to the new null message */
+        if(found_other.gap_size > 0) {
+            /* Absorb a gap after the moved message */
+            HDassert(oh->chunk[null_msg->chunkno].gap == found_other.gap_size);
+            null_msg->raw_size += found_other.gap_size;
+            oh->chunk[null_msg->chunkno].gap = 0;
+        } /* end if */
+        else if(found_other.null_size > 0) {
+            H5O_mesg_t *old_null_msg = &oh->mesg[found_other.null_msgno]; /* Pointer to NULL message to eliminate */
+
+            /* Absorb a null message after the moved message */
+            HDassert((null_msg->raw + null_msg->raw_size) == (old_null_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)));
+            null_msg->raw_size += found_other.null_size;
+
+            /* Release any information/memory for message */
+            H5O_msg_free_mesg(old_null_msg);
+
+            /* Remove null message from list of messages */
+            if(found_other.null_msgno < (oh->nmesgs - 1))
+                HDmemmove(old_null_msg, old_null_msg + 1, ((oh->nmesgs - 1) - found_other.null_msgno) * sizeof(H5O_mesg_t));
+
+            /* Decrement # of messages */
+            /* (Don't bother reducing size of message array for now -QAK) */
+            oh->nmesgs--;
+
+            /* Adjust message index for new NULL message */
+            found_null--;
+        } /* end if */
+
+        /* Mark the new null message as dirty */
+        null_msg->dirty = TRUE;
+
+        /* Release chunk, marking it dirty */
+        if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+    } /* end if */
+    HDassert(found_null >= 0);
+
+    /* Create null message for [rest of] space in new chunk */
+    /* (account for chunk's magic # & checksum) */
+    idx = oh->nmesgs++;
+    oh->mesg[idx].type = H5O_MSG_NULL;
+    oh->mesg[idx].dirty = TRUE;
+    oh->mesg[idx].native = NULL;
+    oh->mesg[idx].raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+    oh->mesg[idx].raw_size = size - (size_t)(H5O_SIZEOF_CHKHDR_OH(oh) + H5O_SIZEOF_MSGHDR_OH(oh));
+    oh->mesg[idx].chunkno = chunkno;
+
+    /* Insert the new chunk into the cache */
+    if(H5O_chunk_add(f, dxpl_id, oh, chunkno) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't add new chunk to cache")
+
+    /* Initialize the continuation information */
+    if(NULL == (cont = H5FL_MALLOC(H5O_cont_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    cont->addr = oh->chunk[chunkno].addr;
+    cont->size = oh->chunk[chunkno].size;
+    cont->chunkno = chunkno;
+
+    /* Split the null message and point at continuation message */
+    if(H5O_alloc_null(f, dxpl_id, oh, (size_t)found_null, H5O_MSG_CONT, cont, cont_size) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't split null message")
+
+    /* Set new message index value */
+    *new_idx = idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc_new_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_alloc
+ *
+ * Purpose:     Allocate enough space in the object header for this message.
+ *
+ * Return:      Success:        Index of message
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
+    const void *mesg, size_t *mesg_idx)
+{
+    size_t raw_size;            /* Raw size of message */
+    size_t aligned_size;        /* Size of message including alignment */
+    size_t idx;                 /* Index of message which fits allocation */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh);
+    HDassert(type);
+    HDassert(mesg);
+    HDassert(mesg_idx);
+
+    /* Compute the size needed to store the message in the object header */
+    raw_size = (type->raw_size)(f, FALSE, mesg);
+    if(0 == raw_size)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "can't compute object header message size")
+    if(raw_size >= H5O_MESG_MAX_SIZE)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "object header message is too large")
+    aligned_size = H5O_ALIGN_OH(oh, raw_size);
+
+    /* look for a null message which is large enough */
+    for(idx = 0; idx < oh->nmesgs; idx++)
+        if(H5O_NULL_ID == oh->mesg[idx].type->id && oh->mesg[idx].raw_size >= aligned_size)
+            break;
+
+    /* if we didn't find one, then allocate more header space */
+    if(idx >= oh->nmesgs) {
+        unsigned        chunkno;
+
+        /* check to see if we can extend one of the chunks.  If we can,
+         * do so.  Otherwise, we will have to allocate a new chunk.
+         *
+         * Note that in this new version of this function, all chunks
+         * must have file space allocated to them.
+         */
+        for(chunkno = 0; chunkno < oh->nchunks; chunkno++) {
+            htri_t	tri_result;     /* Status from attempting to extend chunk */
+
+            if((tri_result = H5O_alloc_extend_chunk(f, dxpl_id, oh, chunkno, raw_size, &idx)) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTEXTEND, FAIL, "H5O_alloc_extend_chunk failed unexpectedly")
+            if(tri_result == TRUE)
+		break;
+        } /* end for */
+
+        /* If we were not able to extend a chunk, create a new one */
+        if(idx >= oh->nmesgs)
+            if(H5O_alloc_new_chunk(f, dxpl_id, oh, raw_size, &idx) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "unable to create a new object header data chunk")
+    } /* end if */
+    HDassert(idx < oh->nmesgs);
+
+    /* Split the null message and point at continuation message */
+    if(H5O_alloc_null(f, dxpl_id, oh, idx, type, NULL, aligned_size) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't split null message")
+
+    /* Mark object header as dirty in cache */
+    if(H5AC_mark_entry_dirty(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+
+    /* Set message index value */
+    *mesg_idx = idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_release_mesg
+ *
+ * Purpose:     Convert a message into a null message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 22 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_release_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg,
+    hbool_t adj_link)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;    /* Chunk that message is in */
+    hbool_t chk_dirtied = FALSE;            /* Flag for unprotecting chunk */
+    herr_t ret_value = SUCCEED; 	    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(mesg);
+
+    /* Check if we should operate on the message */
+    if(adj_link) {
+        /* Free any space referred to in the file from this message */
+        if(H5O_delete_mesg(f, dxpl_id, oh, mesg) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
+    } /* end if */
+
+    /* Protect chunk */
+    if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, mesg->chunkno)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
+
+    /* Free any native information */
+    H5O_msg_free_mesg(mesg);
+
+    /* Change message type to nil and zero it */
+    mesg->type = H5O_MSG_NULL;
+    HDassert(mesg->raw + mesg->raw_size <= (oh->chunk[mesg->chunkno].image + oh->chunk[mesg->chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[mesg->chunkno].gap));
+    HDmemset(mesg->raw, 0, mesg->raw_size);
+
+    /* Clear message flags */
+    mesg->flags = 0;
+
+    /* Mark the message as modified */
+    mesg->dirty = TRUE;
+    chk_dirtied = TRUE;
+
+    /* Check if chunk has a gap currently */
+    if(oh->chunk[mesg->chunkno].gap) {
+        /* Eliminate the gap in the chunk */
+        if(H5O_eliminate_gap(oh, &chk_dirtied, mesg,
+                ((oh->chunk[mesg->chunkno].image + oh->chunk[mesg->chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[mesg->chunkno].gap)),
+                oh->chunk[mesg->chunkno].gap) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+    } /* end if */
+
+done:
+    /* Release chunk, if not already done */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_release_mesg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_move_cont
+ *
+ * Purpose:     Check and move message(s) forward into a continuation message
+ *
+ * Return:      Success:        non-negative (TRUE/FALSE)
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi
+ *		Feb. 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_move_cont(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned cont_u)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that continuation message is in */
+    H5O_mesg_t 	*cont_msg;	/* Pointer to the continuation message */
+    unsigned   	deleted_chunkno;       	/* Chunk # to delete */
+    hbool_t     chk_dirtied = FALSE;    /* Flags for unprotecting chunk */
+    htri_t 	ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Get initial information */
+    cont_msg = &oh->mesg[cont_u];
+    H5O_LOAD_NATIVE(f, dxpl_id, 0, oh, cont_msg, FAIL)
+    deleted_chunkno = ((H5O_cont_t *)(cont_msg->native))->chunkno;
+
+    /* Check if continuation message is pointing to the last chunk */
+    if(deleted_chunkno == (oh->nchunks - 1)) {
+        size_t nonnull_size;	/* Total size of nonnull messages in the chunk pointed to by cont message */
+        H5O_mesg_t *curr_msg;   /* Pointer to the current message to operate on */
+        size_t gap_size;        /* Size of gap produced */
+        size_t v;	        /* Local index variable */
+
+        /* Spin through messages */
+        nonnull_size = 0;
+        for(v = 0, curr_msg = &oh->mesg[0]; v < oh->nmesgs; v++, curr_msg++) {
+            if(curr_msg->chunkno == deleted_chunkno) {
+                /* If there's a locked message, we can't move all messages out of
+                 *  chunk to delete, so get out now.
+                 */
+                if(curr_msg->locked)
+                    HGOTO_DONE(FALSE)
+
+                /* Find size of all non-null messages in the chunk pointed to by the continuation message */
+                if(curr_msg->type->id != H5O_NULL_ID) {
+                    HDassert(curr_msg->type->id != H5O_CONT_ID);
+                    nonnull_size += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+                } /* end if */
+            } /* end if */
+        } /* end for */
+
+        /* Size of gap in chunk w/continuation message */
+        gap_size = oh->chunk[cont_msg->chunkno].gap;
+
+        /* Check if messages can fit into the continuation message + gap size */
+        /* (Could count any null messages in the chunk w/the continuation
+         *      message also, but that is pretty complex. -QAK)
+         */
+        if(nonnull_size && nonnull_size <= (gap_size + cont_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh))) {
+            uint8_t *move_start, *move_end;	/* Pointers to area of messages to move */
+            unsigned cont_chunkno;              /* Chunk number for continuation message */
+
+            /* Get continuation info */
+            move_start = cont_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh);
+            move_end = cont_msg->raw + cont_msg->raw_size;
+            cont_chunkno = cont_msg->chunkno;
+
+            /* Convert continuation message into a null message.  Do not delete
+             * the target chunk yet, so we can still copy messages from it. */
+            if(H5O_release_mesg(f, dxpl_id, oh, cont_msg, FALSE) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to convert into null message")
+
+            /* Protect chunk */
+            if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, cont_chunkno)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
+
+            /* Move message(s) forward into continuation message */
+            for(v = 0, curr_msg = &oh->mesg[0]; v < oh->nmesgs; v++, curr_msg++)
+                /* Look for messages in chunk to delete */
+                if(curr_msg->chunkno == deleted_chunkno) {
+                    /* Move messages out of chunk to delete */
+                    if(curr_msg->type->id != H5O_NULL_ID) {
+                        size_t move_size;	/* Size of the message to be moved */
+
+                        /* Compute size of message to move */
+                        move_size = curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+
+                        /* Move message out of deleted chunk */
+                        HDmemcpy(move_start, curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), move_size);
+                        curr_msg->raw = move_start + H5O_SIZEOF_MSGHDR_OH(oh);
+                        curr_msg->chunkno = cont_chunkno;
+                        chk_dirtied = TRUE;
+
+                        /* Adjust location to move messages to */
+                        move_start += move_size;
+                    } /* end else */
+                } /* end if */
+
+            /* Delete the target chunk */
+            if(H5O_chunk_delete(f, dxpl_id, oh, deleted_chunkno) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove chunk from cache")
+
+            HDassert(move_start <= (move_end + gap_size));
+
+            /* Check if there is space remaining in the continuation message */
+            /* (The remaining space can be gap or a null message) */
+            gap_size += (size_t)(move_end - move_start);
+            if(gap_size >= (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
+                /* Adjust size of null (was continuation) message */
+                cont_msg->raw_size = gap_size - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+                cont_msg->raw = move_start + H5O_SIZEOF_MSGHDR_OH(oh);
+                cont_msg->dirty = TRUE;
+                chk_dirtied = TRUE;
+            } /* end if */
+            else {
+                /* Check if there is space that should be a gap */
+                if(gap_size > 0) {
+                    /* Convert remnant into gap in chunk */
+                    if(H5O_add_gap(f, oh, cont_chunkno, &chk_dirtied, cont_u, move_start, gap_size) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert gap in chunk")
+                } /* end if */
+
+                /* Release any information/memory for continuation message */
+                H5O_msg_free_mesg(cont_msg);
+                if(cont_u < (oh->nmesgs - 1))
+                    HDmemmove(&oh->mesg[cont_u], &oh->mesg[cont_u + 1], ((oh->nmesgs - 1) - cont_u) * sizeof(H5O_mesg_t));
+                oh->nmesgs--;
+            } /* end else */
+
+            /* Move message(s) forward into continuation message */
+            /*      Note: unsigned v wrapping around at the end */
+            for(v = oh->nmesgs - 1, curr_msg = &oh->mesg[v]; v < oh->nmesgs; v--, curr_msg--)
+                /* Look for messages in chunk to delete */
+                if(curr_msg->chunkno == deleted_chunkno) {
+                    /* Remove all null messages in deleted chunk from list of messages */
+                    if(curr_msg->type->id == H5O_NULL_ID) {
+                        /* Release any information/memory for message */
+                        H5O_msg_free_mesg(curr_msg);
+                        chk_dirtied = TRUE;
+
+                        /* Remove from message list */
+                        if(v < (oh->nmesgs - 1))
+                            HDmemmove(&oh->mesg[v], &oh->mesg[v + 1], ((oh->nmesgs - 1) - v) * sizeof(H5O_mesg_t));
+                        oh->nmesgs--;
+                    } /* end if */
+                } /* end if */
+
+            /* Remove chunk from list of chunks */
+            oh->chunk[deleted_chunkno].image = H5FL_BLK_FREE(chunk_image, oh->chunk[deleted_chunkno].image);
+            oh->nchunks--;
+        }  /* end if */
+        else
+            ret_value = FALSE;
+    }  /* end if */
+    else
+        ret_value = FALSE;
+
+done:
+    /* Release chunk, if not already done */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_move_cont() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_move_msgs_forward
+ *
+ * Purpose:     Move messages toward first chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct 17 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    H5O_chunk_proxy_t *null_chk_proxy = NULL;  /* Chunk that null message is in */
+    H5O_chunk_proxy_t *curr_chk_proxy = NULL;  /* Chunk that message is in */
+    hbool_t null_chk_dirtied = FALSE;  /* Flags for unprotecting null chunk */
+    hbool_t curr_chk_dirtied = FALSE;  /* Flags for unprotecting curr chunk */
+    hbool_t packed_msg;                 /* Flag to indicate that messages were packed */
+    hbool_t did_packing = FALSE;        /* Whether any messages were packed */
+    htri_t ret_value; 	                /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+
+    /* Loop until no messages packed */
+    /* (Double loop is not very efficient, but it would be some extra work to
+     *      add a list of messages to each chunk -QAK)
+     */
+    do {
+        H5O_mesg_t *curr_msg;       /* Pointer to current message to operate on */
+        unsigned	u;              /* Local index variable */
+
+        /* Reset packed messages flag */
+        packed_msg = FALSE;
+
+        /* Scan through messages for messages that can be moved earlier in chunks */
+        for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+            if(H5O_NULL_ID == curr_msg->type->id) {
+                H5O_chunk_t *chunk;     /* Pointer to chunk that null message is in */
+
+                /* Check if null message is not last in chunk */
+                chunk = &(oh->chunk[curr_msg->chunkno]);
+                if((curr_msg->raw + curr_msg->raw_size)
+                        != ((chunk->image + chunk->size) - (H5O_SIZEOF_CHKSUM_OH(oh) + chunk->gap))) {
+                    H5O_mesg_t *nonnull_msg;       /* Pointer to current message to operate on */
+                    unsigned	v;              /* Local index variable */
+
+                    /* Loop over messages again, looking for the message in the chunk after the null message */
+                    for(v = 0, nonnull_msg = &oh->mesg[0]; v < oh->nmesgs; v++, nonnull_msg++) {
+                        /* Locate message that is immediately after the null message */
+                        if((curr_msg->chunkno == nonnull_msg->chunkno) &&
+                                ((curr_msg->raw + curr_msg->raw_size) == (nonnull_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)))) {
+                            /* Don't swap messages if the second message is also a null message */
+                            /* (We'll merge them together later, in another routine) */
+                            if(H5O_NULL_ID != nonnull_msg->type->id) {
+                                /* Protect chunk */
+                                if(NULL == (null_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+                                /* Copy raw data for non-null message to new location */
+                                HDmemmove(curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh),
+                                    nonnull_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), nonnull_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+                                /* Adjust non-null message's offset in chunk */
+                                nonnull_msg->raw = curr_msg->raw;
+
+                                /* Adjust null message's offset in chunk */
+                                curr_msg->raw = nonnull_msg->raw +
+                                        nonnull_msg->raw_size + H5O_SIZEOF_MSGHDR_OH(oh);
+
+                                /* Mark null message dirty */
+                                /* (since we need to re-encode its message header) */
+                                curr_msg->dirty = TRUE;
+
+                                /* Release chunk, marking it dirty */
+                                if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, TRUE) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                null_chk_proxy = NULL;
+
+                                /* Set the flag to indicate that the null message
+                                 * was packed - if its not at the end its chunk,
+                                 * we'll move it again on the next pass.
+                                 */
+                                packed_msg = TRUE;
+                            } /* end if */
+
+                            /* Break out of loop */
+                            break;
+                        } /* end if */
+                    } /* end for */
+                    /* Should have been message after null message */
+                    HDassert(v < oh->nmesgs);
+                } /* end if */
+            } /* end if */
+            else {
+                H5O_mesg_t *null_msg;   /* Pointer to current message to operate on */
+                size_t   v;             /* Local index variable */
+
+                /* Check if messages in chunk pointed to can replace continuation message */
+                if(H5O_CONT_ID == curr_msg->type->id) {
+                    htri_t status;      /* Status from moving messages */
+
+		    if((status = H5O_move_cont(f, dxpl_id, oh, u)) < 0)
+			HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "Error in moving messages into cont message")
+		    else if(status > 0) { /* Message(s) got moved into "continuation" message */
+                        packed_msg = TRUE;
+			break;
+		    } /* end else-if */
+		} /* end if */
+
+                /* Don't let locked messages be moved into earlier chunk */
+                if(!curr_msg->locked) {
+                    /* Loop over messages again, looking for large enough null message in earlier chunk */
+                    for(v = 0, null_msg = &oh->mesg[0]; v < oh->nmesgs; v++, null_msg++) {
+                        if(H5O_NULL_ID == null_msg->type->id && curr_msg->chunkno > null_msg->chunkno
+                                && curr_msg->raw_size <= null_msg->raw_size) {
+                            unsigned old_chunkno;   /* Old message information */
+                            uint8_t *old_raw;
+
+                            /* Keep old information about non-null message */
+                            old_chunkno = curr_msg->chunkno;
+                            old_raw = curr_msg->raw;
+
+                            /* Protect chunks */
+                            if(NULL == (null_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, null_msg->chunkno)))
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+                            if(NULL == (curr_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+                            /* Copy raw data for non-null message to new chunk */
+                            HDmemcpy(null_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+                            /* Point non-null message at null message's space */
+                            curr_msg->chunkno = null_msg->chunkno;
+                            curr_msg->raw = null_msg->raw;
+                            curr_chk_dirtied = TRUE;
+
+                            /* Change information for null message */
+                            if(curr_msg->raw_size == null_msg->raw_size) {
+                                /* Point null message at old non-null space */
+                                /* (Instead of freeing it and allocating new message) */
+                                null_msg->chunkno = old_chunkno;
+                                null_msg->raw = old_raw;
+
+                                /* Mark null message dirty */
+                                null_msg->dirty = TRUE;
+                                null_chk_dirtied = TRUE;
+
+                                /* Release current chunk, marking it dirty */
+                                if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                curr_chk_proxy = NULL;
+                                curr_chk_dirtied = FALSE;
+
+                                /* Check for gap in null message's chunk */
+                                if(oh->chunk[old_chunkno].gap > 0) {
+                                    /* Eliminate the gap in the chunk */
+                                    if(H5O_eliminate_gap(oh, &null_chk_dirtied, null_msg,
+                                            ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
+                                            oh->chunk[old_chunkno].gap) < 0)
+                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+                                } /* end if */
+
+                                /* Release null chunk, marking it dirty */
+                                if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                null_chk_proxy = NULL;
+                                null_chk_dirtied = FALSE;
+                            } /* end if */
+                            else {
+                                size_t new_null_msg;          /* Message index for new null message */
+
+                                /* Check if null message is large enough to still exist */
+                                if((null_msg->raw_size - curr_msg->raw_size) < (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
+                                    size_t gap_size = null_msg->raw_size - curr_msg->raw_size;     /* Size of gap produced */
+
+                                    /* Adjust the size of the null message being eliminated */
+                                    null_msg->raw_size = curr_msg->raw_size;
+
+                                    /* Mark null message dirty */
+                                    null_msg->dirty = TRUE;
+                                    null_chk_dirtied = TRUE;
+
+                                    /* Add the gap to the chunk */
+                                    if(H5O_add_gap(f, oh, null_msg->chunkno, &null_chk_dirtied, v, null_msg->raw + null_msg->raw_size, gap_size) < 0)
+                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert gap in chunk")
+
+                                    /* Re-use message # for new null message taking place of non-null message */
+                                    new_null_msg = v;
+                                } /* end if */
+                                else {
+                                    /* Adjust null message's size & offset */
+                                    null_msg->raw += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+                                    null_msg->raw_size -= curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+
+                                    /* Mark null message dirty */
+                                    null_msg->dirty = TRUE;
+                                    null_chk_dirtied = TRUE;
+
+                                    /* Create new null message for previous location of non-null message */
+                                    if(oh->nmesgs >= oh->alloc_nmesgs) {
+                                        if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+                                        /* "Retarget" 'curr_msg' pointer into newly re-allocated array of messages */
+                                        curr_msg = &oh->mesg[u];
+                                    } /* end if */
+
+                                    /* Get message # for new null message */
+                                    new_null_msg = oh->nmesgs++;
+                                } /* end else */
+
+                                /* Release null message's chunk, marking it dirty */
+                                if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                null_chk_proxy = NULL;
+                                null_chk_dirtied = FALSE;
+
+                                /* Initialize new null message to take over non-null message's location */
+                                oh->mesg[new_null_msg].type = H5O_MSG_NULL;
+                                oh->mesg[new_null_msg].native = NULL;
+                                oh->mesg[new_null_msg].raw = old_raw;
+                                oh->mesg[new_null_msg].raw_size = curr_msg->raw_size;
+                                oh->mesg[new_null_msg].chunkno = old_chunkno;
+
+                                /* Mark new null message dirty */
+                                oh->mesg[new_null_msg].dirty = TRUE;
+                                curr_chk_dirtied = TRUE;
+
+                                /* Check for gap in new null message's chunk */
+                                if(oh->chunk[old_chunkno].gap > 0) {
+                                    /* Eliminate the gap in the chunk */
+                                    if(H5O_eliminate_gap(oh, &curr_chk_dirtied, &oh->mesg[new_null_msg],
+                                            ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
+                                            oh->chunk[old_chunkno].gap) < 0)
+                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+                                } /* end if */
+
+                                /* Release new null message's chunk, marking it dirty */
+                                if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                curr_chk_proxy = NULL;
+                                curr_chk_dirtied = FALSE;
+                            } /* end else */
+
+                            /* Indicate that we packed messages */
+                            packed_msg = TRUE;
+
+                            /* Break out of loop */
+                            /* (If it's possible to move message to even earlier chunk
+                             *      we'll get it on the next pass - QAK)
+                             */
+                            break;
+                        } /* end if */
+                    } /* end for */
+                } /* end if */
+
+                /* If we packed messages, get out of loop and start over */
+                /* (Don't know if this has any benefit one way or the other -QAK) */
+                if(packed_msg)
+                    break;
+            } /* end else */
+        } /* end for */
+
+        /* If we did any packing, remember that */
+        if(packed_msg)
+            did_packing = TRUE;
+    } while(packed_msg);
+
+    /* Set return value */
+    ret_value = (htri_t)did_packing;
+
+done:
+    if(null_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect null object header chunk")
+    if(curr_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect current object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_move_msgs_forward() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_merge_null
+ *
+ * Purpose:     Merge neighboring null messages in an object header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct 10 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    hbool_t merged_msg;                 /* Flag to indicate that messages were merged */
+    hbool_t did_merging = FALSE;        /* Whether any messages were merged */
+    htri_t ret_value; 	                /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh != NULL);
+
+    /* Loop until no messages merged */
+    /* (Double loop is not very efficient, but it would be some extra work to add
+     *      a list of messages to each chunk -QAK)
+     */
+    do {
+        H5O_mesg_t *curr_msg;       /* Pointer to current message to operate on */
+        unsigned	u;              /* Local index variable */
+
+        /* Reset merged messages flag */
+        merged_msg = FALSE;
+
+        /* Scan messages for adjacent null messages & merge them */
+        for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+            if(H5O_NULL_ID == curr_msg->type->id) {
+                H5O_mesg_t *curr_msg2;       /* Pointer to current message to operate on */
+                unsigned	v;              /* Local index variable */
+
+                /* Should be no gaps in chunk with null message */
+                HDassert(oh->chunk[curr_msg->chunkno].gap == 0);
+
+                /* Loop over messages again, looking for null message in same chunk */
+                for(v = 0, curr_msg2 = &oh->mesg[0]; v < oh->nmesgs; v++, curr_msg2++) {
+                    if(u != v && H5O_NULL_ID == curr_msg2->type->id && curr_msg->chunkno == curr_msg2->chunkno) {
+                        ssize_t adj_raw;        /* Amount to adjust raw message pointer */
+                        size_t adj_raw_size;    /* Amount to adjust raw message size */
+
+                        /* Check for second message after first message */
+                        if((curr_msg->raw + curr_msg->raw_size) == (curr_msg2->raw - H5O_SIZEOF_MSGHDR_OH(oh))) {
+                            /* Extend first null message length to cover second null message */
+                            adj_raw = 0;
+                            adj_raw_size = (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg2->raw_size;
+
+                            /* Message has been merged */
+                            merged_msg = TRUE;
+                        } /* end if */
+                        /* Check for second message before first message */
+                        else if((curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)) == (curr_msg2->raw + curr_msg2->raw_size)) {
+                            /* Adjust first message address and extend length to cover second message */
+                            adj_raw = -((ssize_t)((size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg2->raw_size));
+                            adj_raw_size = (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg2->raw_size;
+
+                            /* Message has been merged */
+                            merged_msg = TRUE;
+                        } /* end if */
+
+                        /* Second message has been merged, delete it */
+                        if(merged_msg) {
+                            H5O_chunk_proxy_t *curr_chk_proxy;        /* Chunk that message is in */
+
+                            /* Release any information/memory for second message */
+                            H5O_msg_free_mesg(curr_msg2);
+
+                            /* Protect chunk */
+                            if(NULL == (curr_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+                            /* Adjust first message address and extend length to cover second message */
+                            curr_msg->raw += adj_raw;
+                            curr_msg->raw_size += adj_raw_size;
+
+                            /* Mark first message as dirty */
+                            curr_msg->dirty = TRUE;
+
+                            /* Release new null message's chunk, marking it dirty */
+                            if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, TRUE) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+                            /* Remove second message from list of messages */
+                            if(v < (oh->nmesgs - 1))
+                                HDmemmove(&oh->mesg[v], &oh->mesg[v + 1], ((oh->nmesgs - 1) - v) * sizeof(H5O_mesg_t));
+
+                            /* Decrement # of messages */
+                            /* (Don't bother reducing size of message array for now -QAK) */
+                            oh->nmesgs--;
+
+                            /* If the merged message is too large, shrink the chunk */
+                            if(curr_msg->raw_size >= H5O_MESG_MAX_SIZE)
+                                if(H5O_alloc_shrink_chunk(f, dxpl_id, oh, curr_msg->chunkno) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "unable to shrink chunk")
+
+                            /* Get out of loop */
+                            break;
+                        } /* end if */
+                    } /* end if */
+                } /* end for */
+
+                /* Get out of loop if we merged messages */
+                if(merged_msg)
+                    break;
+            } /* end if */
+        } /* end for */
+
+        /* If we did any merging, remember that */
+        if(merged_msg)
+            did_merging = TRUE;
+    } while(merged_msg);
+
+    /* Set return value */
+    ret_value = (htri_t)did_merging;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_merge_null() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_remove_empty_chunks
+ *
+ * Purpose:     Attempt to eliminate empty chunks from object header.
+ *
+ *              This examines a chunk to see if it's empty
+ *              and removes it (and the continuation message that points to it)
+ *              from the object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct 17 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_remove_empty_chunks(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    hbool_t deleted_chunk;              /* Whether to a chunk was deleted */
+    hbool_t did_deleting = FALSE;       /* Whether any chunks were deleted */
+    htri_t ret_value; 	                /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh != NULL);
+
+    /* Loop until no chunks are freed */
+    do {
+        H5O_mesg_t *null_msg;       /* Pointer to null message found */
+        H5O_mesg_t *cont_msg;       /* Pointer to continuation message found */
+        unsigned	u, v;       /* Local index variables */
+
+        /* Reset 'chunk deleted' flag */
+        deleted_chunk = FALSE;
+
+        /* Scan messages for null messages that fill an entire chunk */
+        for(u = 0, null_msg = &oh->mesg[0]; u < oh->nmesgs; u++, null_msg++) {
+            /* If a null message takes up an entire object header chunk (and
+             * its not the "base" chunk), delete that chunk from object header
+             */
+            if(H5O_NULL_ID == null_msg->type->id && null_msg->chunkno > 0 &&
+                    ((size_t)H5O_SIZEOF_MSGHDR_OH(oh) + null_msg->raw_size)
+                         == (oh->chunk[null_msg->chunkno].size - H5O_SIZEOF_CHKHDR_OH(oh))) {
+                H5O_mesg_t *curr_msg;           /* Pointer to current message to operate on */
+                unsigned null_msg_no;           /* Message # for null message */
+                unsigned deleted_chunkno;       /* Chunk # to delete */
+
+                /* Locate continuation message that points to chunk */
+                for(v = 0, cont_msg = &oh->mesg[0]; v < oh->nmesgs; v++, cont_msg++) {
+                    if(H5O_CONT_ID == cont_msg->type->id) {
+                        /* Decode current continuation message if necessary */
+                        H5O_LOAD_NATIVE(f, dxpl_id, 0, oh, cont_msg, FAIL)
+
+                        /* Check if the chunkno needs to be set */
+                        /* (should only occur when the continuation message is first decoded) */
+                        if(0 == ((H5O_cont_t *)(cont_msg->native))->chunkno) {
+                            unsigned w;         /* Local index variable */
+
+                            /* Find chunk that this continuation message points to */
+                            for(w = 0; w < oh->nchunks; w++)
+                                if(oh->chunk[w].addr == ((H5O_cont_t *)(cont_msg->native))->addr) {
+                                    ((H5O_cont_t *)(cont_msg->native))->chunkno = w;
+                                    break;
+                                } /* end if */
+                            HDassert(((H5O_cont_t *)(cont_msg->native))->chunkno > 0);
+                        } /* end if */
+
+                        /* Check for correct chunk to delete */
+                        if(oh->chunk[null_msg->chunkno].addr == ((H5O_cont_t *)(cont_msg->native))->addr)
+                            break;
+                    } /* end if */
+                } /* end for */
+                /* Must be a continuation message that points to chunk containing null message */
+                HDassert(v < oh->nmesgs);
+                HDassert(cont_msg);
+                HDassert(((H5O_cont_t *)(cont_msg->native))->chunkno == null_msg->chunkno);
+
+                /* Initialize information about null message */
+                null_msg_no = u;
+                deleted_chunkno = null_msg->chunkno;
+
+                /* Convert continuation message into a null message */
+                if(H5O_release_mesg(f, dxpl_id, oh, cont_msg, TRUE) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to convert into null message")
+
+                /*
+                 * Remove chunk from object header's data structure
+                 */
+
+                /* Free memory for chunk image */
+                oh->chunk[null_msg->chunkno].image = H5FL_BLK_FREE(chunk_image, oh->chunk[null_msg->chunkno].image);
+
+                /* Remove chunk from list of chunks */
+                if(null_msg->chunkno < (oh->nchunks - 1)) {
+                    HDmemmove(&oh->chunk[null_msg->chunkno], &oh->chunk[null_msg->chunkno + 1], ((oh->nchunks - 1) - null_msg->chunkno) * sizeof(H5O_chunk_t));
+
+                    /* Adjust chunk number for any chunk proxies that are in the cache */
+                    for(u = null_msg->chunkno; u < (oh->nchunks - 1); u++) {
+                        unsigned chk_proxy_status = 0;  /* Metadata cache status of chunk proxy for chunk */
+
+                        /* Check the chunk proxy's status in the metadata cache */
+                        if(H5AC_get_entry_status(f, oh->chunk[u].addr, &chk_proxy_status) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to check metadata cache status for chunk proxy")
+
+                        /* If the entry is in the cache, update its chunk index */
+                        if(chk_proxy_status & H5AC_ES__IN_CACHE) {
+                            if(H5O_chunk_update_idx(f, dxpl_id, oh, u) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to update index for chunk proxy")
+                        } /* end if */
+                    } /* end for */
+                } /* end if */
+
+                /* Decrement # of chunks */
+                /* (Don't bother reducing size of chunk array for now -QAK) */
+                oh->nchunks--;
+
+                /*
+                 * Delete null message (in empty chunk that was be freed) from list of messages
+                 */
+
+                /* Release any information/memory for message */
+                H5O_msg_free_mesg(null_msg);
+
+                /* Remove null message from list of messages */
+                if(null_msg_no < (oh->nmesgs - 1))
+                    HDmemmove(&oh->mesg[null_msg_no], &oh->mesg[null_msg_no + 1], ((oh->nmesgs - 1) - null_msg_no) * sizeof(H5O_mesg_t));
+
+                /* Decrement # of messages */
+                /* (Don't bother reducing size of message array for now -QAK) */
+                oh->nmesgs--;
+
+                /* Adjust chunk # for messages in chunks after deleted chunk */
+                for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+                    /* Sanity check - there should be no messages in deleted chunk */
+                    HDassert(curr_msg->chunkno != deleted_chunkno);
+
+                    /* Adjust chunk index for messages in later chunks */
+                    if(curr_msg->chunkno > deleted_chunkno)
+                        curr_msg->chunkno--;
+
+                    /* Check for continuation message */
+                    if(H5O_CONT_ID == curr_msg->type->id) {
+                        /* Decode current continuation message if necessary */
+                        H5O_LOAD_NATIVE(f, dxpl_id, 0, oh, curr_msg, FAIL)
+
+                        /* Check if the chunkno needs to be set */
+                        /* (should only occur when the continuation message is first decoded) */
+                        if(0 == ((H5O_cont_t *)(curr_msg->native))->chunkno) {
+                            unsigned w;         /* Local index variable */
+
+                            /* Find chunk that this continuation message points to */
+                            for(w = 0; w < oh->nchunks; w++)
+                                if(oh->chunk[w].addr == ((H5O_cont_t *)(curr_msg->native))->addr) {
+                                    ((H5O_cont_t *)(curr_msg->native))->chunkno = w;
+                                    break;
+                                } /* end if */
+                            HDassert(((H5O_cont_t *)(curr_msg->native))->chunkno > 0);
+                        } /* end if */
+                        else {
+                            /* Check for pointer to chunk after deleted chunk */
+                            if(((H5O_cont_t *)(curr_msg->native))->chunkno > deleted_chunkno)
+                                ((H5O_cont_t *)(curr_msg->native))->chunkno--;
+                        } /* end else */
+                    } /* end if */
+                } /* end for */
+
+                /* Found chunk to delete */
+                deleted_chunk = TRUE;
+                break;
+            } /* end if */
+        } /* end for */
+
+        /* If we deleted any chunks, remember that */
+        if(deleted_chunk)
+            did_deleting = TRUE;
+    } while(deleted_chunk);
+
+    /* Set return value */
+    ret_value = (htri_t)did_deleting;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_remove_empty_chunks() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_condense_header
+ *
+ * Purpose:     Attempt to eliminate empty chunks from object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Oct  4 2005
+ *
+ * Modifications:
+ *   Feb. 2009: Vailin Choi
+ *      Add 2 more parameters to H5O_move_msgs_forward() for moving
+ *	messages forward into "continuation" message
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_condense_header(H5F_t *f, H5O_t *oh, hid_t dxpl_id)
+{
+    hbool_t rescan_header;              /* Whether to rescan header */
+    htri_t result;                      /* Result from packing/merging/etc */
+    herr_t ret_value = SUCCEED; 	/* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh != NULL);
+
+    /* Loop until no changed to the object header messages & chunks */
+    do {
+        /* Reset 'rescan chunks' flag */
+        rescan_header = FALSE;
+
+        /* Scan for messages that can be moved earlier in chunks */
+        result = H5O_move_msgs_forward(f, dxpl_id, oh);
+        if(result < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't move header messages forward")
+        if(result > 0)
+            rescan_header = TRUE;
+
+        /* Scan for adjacent null messages & merge them */
+        result = H5O_merge_null(f, dxpl_id, oh);
+        if(result < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't pack null header messages")
+        if(result > 0)
+            rescan_header = TRUE;
+
+        /* Scan for empty chunks to remove */
+        result = H5O_remove_empty_chunks(f, dxpl_id, oh);
+        if(result < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't remove empty chunk")
+        if(result > 0)
+            rescan_header = TRUE;
+    } while(rescan_header);
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_condense_header() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5O_alloc_shrink_chunk
+ *
+ * Purpose:     Shrinks a chunk, removing all null messages and any gap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *		nfortne2 at hdfgroup.org
+ *		Oct 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_alloc_shrink_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno)
+{
+    H5O_chunk_t *chunk = &oh->chunk[chunkno];   /* Chunk to shrink */
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Metadata cache proxy for chunk to shrink */
+    H5O_mesg_t  *curr_msg;                      /* Current message to examine */
+    uint8_t     *old_image = chunk->image;      /* Old address of chunk's image in memory */
+    size_t      old_size = chunk->size;         /* Old size of chunk */
+    size_t      new_size = chunk->size - chunk->gap; /* Size of shrunk chunk */
+    size_t      total_msg_size;                 /* Size of the messages in this chunk */
+    size_t      min_chunk_size = H5O_ALIGN_OH(oh, H5O_MIN_SIZE); /* Minimum chunk size */
+    size_t      sizeof_chksum = H5O_SIZEOF_CHKSUM_OH(oh); /* Size of chunk checksum */
+    size_t      sizeof_msghdr = H5O_SIZEOF_MSGHDR_OH(oh); /* Size of message header */
+    uint8_t     new_size_flags = 0;             /* New chunk #0 size flags */
+    hbool_t     adjust_size_flags = FALSE;      /* Whether to adjust the chunk #0 size flags */
+    size_t      less_prfx_size = 0;             /* Bytes removed from object header prefix */
+    size_t      u;                              /* Index */
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Protect chunk */
+    if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, chunkno)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
+
+    /* Loop backwards to increase the chance of seeing more null messages at the
+     * end of the chunk.  Note that we rely on unsigned u wrapping around at the
+     * end.
+     */
+    for(u = oh->nmesgs - 1, curr_msg = &oh->mesg[u]; u < oh->nmesgs; u--, curr_msg--) {
+        if((H5O_NULL_ID == curr_msg->type->id) && (chunkno == curr_msg->chunkno)) {
+            size_t shrink_size = curr_msg->raw_size + sizeof_msghdr; /* Amount to shrink the chunk by */
+
+            /* If the current message is not at the end of the chunk, copy the
+                * data after it (except the checksum).
+                */
+            if(curr_msg->raw + curr_msg->raw_size
+                < old_image + new_size - sizeof_chksum) {
+                unsigned    v;              /* Index */
+                H5O_mesg_t  *curr_msg2;
+                uint8_t     *src = curr_msg->raw + curr_msg->raw_size; /* Source location */
+
+                /* Slide down the raw data */
+                HDmemmove(curr_msg->raw - sizeof_msghdr, src,
+                    (size_t)(old_image + new_size - sizeof_chksum - src));
+
+                /* Update the raw data pointers for messages after this one */
+                for(v = 0, curr_msg2 = &oh->mesg[0]; v < oh->nmesgs; v++, curr_msg2++)
+                    if((chunkno == curr_msg2->chunkno) && (curr_msg2->raw > curr_msg->raw))
+                        curr_msg2->raw -= shrink_size;
+            } /* end if */
+
+            /* Adjust the new chunk size */
+            new_size -= shrink_size;
+
+            /* Release any information/memory for the message */
+            H5O_msg_free_mesg(curr_msg);
+
+            /* Remove the deleted null message from list of messages */
+            if(u < (oh->nmesgs - 1))
+                HDmemmove(&oh->mesg[u], &oh->mesg[u+1], ((oh->nmesgs - 1) - u) * sizeof(H5O_mesg_t));
+
+            /* Decrement # of messages */
+            /* (Don't bother reducing size of message array for now) */
+            oh->nmesgs--;
+        } /* end if */
+    } /* end for */
+
+    /* Check if the chunk is too small, extend if necessary */
+    total_msg_size = new_size - (size_t)(chunkno == 0 ? H5O_SIZEOF_HDR(oh) : H5O_SIZEOF_CHKHDR_OH(oh));
+    if(total_msg_size < min_chunk_size) {
+        HDassert(oh->alloc_nmesgs > oh->nmesgs);
+        oh->nmesgs++;
+
+        /* Initialize new null message to make the chunk large enough */
+        oh->mesg[oh->nmesgs].type = H5O_MSG_NULL;
+        oh->mesg[oh->nmesgs].dirty = TRUE;
+        oh->mesg[oh->nmesgs].native = NULL;
+        oh->mesg[oh->nmesgs].raw = old_image + new_size + sizeof_msghdr - sizeof_chksum;
+        oh->mesg[oh->nmesgs].raw_size = MAX(H5O_ALIGN_OH(oh, min_chunk_size - total_msg_size),
+            sizeof_msghdr) - sizeof_msghdr;
+        oh->mesg[oh->nmesgs].chunkno = chunkno;
+
+        /* update the new chunk size */
+        new_size += oh->mesg[oh->nmesgs].raw_size + sizeof_msghdr;
+    } /* end if */
+
+    /* Check for changing the chunk #0 data size enough to need adjusting the flags */
+    if(oh->version > H5O_VERSION_1 && chunkno == 0) {
+        uint64_t chunk0_newsize = new_size - (size_t)H5O_SIZEOF_HDR(oh);  /* New size of chunk 0's data */
+        size_t   orig_prfx_size = (size_t)1 << (oh->flags & H5O_HDR_CHUNK0_SIZE); /* Original prefix size */
+
+        /* Check for moving to a 1-byte size encoding */
+        if(orig_prfx_size > 1 && chunk0_newsize <= 255) {
+            less_prfx_size = orig_prfx_size - 1;
+            new_size_flags = H5O_HDR_CHUNK0_1;
+            adjust_size_flags = TRUE;
+        } /* end if */
+        /* Check for moving to a 2-byte size encoding */
+        else if(orig_prfx_size > 2 && chunk0_newsize <= 65535) {
+            less_prfx_size = orig_prfx_size - 2;
+            new_size_flags = H5O_HDR_CHUNK0_2;
+            adjust_size_flags = TRUE;
+        } /* end if */
+        /* Check for moving to a 4-byte size encoding */
+        else if(orig_prfx_size > 4 && chunk0_newsize <= 4294967295) {
+            less_prfx_size = orig_prfx_size - 4;
+            new_size_flags = H5O_HDR_CHUNK0_4;
+            adjust_size_flags = TRUE;
+        } /* end if */
+    } /* end if */
+
+    if(adjust_size_flags) {
+        /* Adjust object header prefix flags */
+        oh->flags = (uint8_t)(oh->flags & ~H5O_HDR_CHUNK0_SIZE);
+        oh->flags |= new_size_flags;
+
+        /* Slide chunk 0 data down */
+        HDmemmove(chunk->image + H5O_SIZEOF_HDR(oh) - sizeof_chksum,
+            chunk->image + H5O_SIZEOF_HDR(oh) - sizeof_chksum + less_prfx_size,
+            new_size - (size_t)H5O_SIZEOF_HDR(oh));
+
+        /* Adjust chunk size */
+        new_size -= less_prfx_size;
+    } /* end if */
+
+    /* Allocate less memory space for chunk's image */
+    chunk->size = new_size;
+    chunk->image = H5FL_BLK_REALLOC(chunk_image, old_image, chunk->size);
+    chunk->gap = 0;
+    if(NULL == oh->chunk[chunkno].image)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Spin through existing messages, adjusting them */
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+        if(adjust_size_flags || (chunk->image != old_image))
+            /* Adjust raw addresses for messages in this chunk to reflect new 'image' address */
+            if(curr_msg->chunkno == chunkno)
+                curr_msg->raw = chunk->image - less_prfx_size + (curr_msg->raw - old_image);
+
+        /* Find continuation message which points to this chunk and adjust chunk's size */
+        /* (Chunk 0 doesn't have a continuation message that points to it and
+         * its size is directly encoded in the object header) */
+        if(chunkno > 0 && (H5O_CONT_ID == curr_msg->type->id) &&
+                (((H5O_cont_t *)(curr_msg->native))->chunkno == chunkno)) {
+            H5O_chunk_proxy_t *cont_chk_proxy;        /* Chunk that message is in */
+
+            /* Protect chunk */
+            if(NULL == (cont_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
+
+            /* Adjust size of continuation message */
+            HDassert(((H5O_cont_t *)(curr_msg->native))->size == old_size);
+            ((H5O_cont_t *)(curr_msg->native))->size = chunk->size;
+
+            /* Flag continuation message as dirty */
+            curr_msg->dirty = TRUE;
+
+            /* Release chunk, marking it dirty */
+            if(H5O_chunk_unprotect(f, dxpl_id, cont_chk_proxy, TRUE) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+        } /* end if */
+    } /* end for */
+
+    HDassert(new_size <= old_size);
+
+    /* Resize the chunk in the cache */
+    if(H5O_chunk_resize(oh, chk_proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRESIZE, FAIL, "unable to resize object header chunk")
+
+    /* Free the unused space in the file */
+    if(H5MF_xfree(f, H5FD_MEM_OHDR, dxpl_id, chunk->addr + new_size, (hsize_t)(old_size - new_size)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to shrink object header chunk")
+
+done:
+    /* Release chunk, marking it dirty */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_alloc_shrink_chunk() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oattr.c b/gatb-core/thirdparty/hdf5/src/H5Oattr.c
new file mode 100644
index 0000000..fd7fcda
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oattr.c
@@ -0,0 +1,876 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5A_PACKAGE             /*prevent warning from including H5Apkg   */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5S_PACKAGE	        /*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Spkg.h"		/* Dataspaces				*/
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg);
+static void *H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static void *H5O_attr_copy(const void *_mesg, void *_dest);
+static size_t H5O_attr_size(const H5F_t *f, const void *_mesg);
+static herr_t H5O_attr_free(void *mesg);
+static herr_t H5O_attr_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
+static void *H5O_attr_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_type,
+    void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_attr_post_copy_file(const H5O_loc_t *src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id,
+    H5O_copy_t *cpy_info);
+static herr_t H5O_attr_get_crt_index(const void *_mesg, H5O_msg_crt_idx_t *crt_idx);
+static herr_t H5O_attr_set_crt_index(void *_mesg, H5O_msg_crt_idx_t crt_idx);
+static herr_t H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+			      FILE * stream, int indent, int fwidth);
+
+/* Set up & include shared message "interface" info */
+#define H5O_SHARED_TYPE			H5O_MSG_ATTR
+#define H5O_SHARED_DECODE		H5O_attr_shared_decode
+#define H5O_SHARED_DECODE_REAL		H5O_attr_decode
+#define H5O_SHARED_ENCODE		H5O_attr_shared_encode
+#define H5O_SHARED_ENCODE_REAL		H5O_attr_encode
+#define H5O_SHARED_SIZE			H5O_attr_shared_size
+#define H5O_SHARED_SIZE_REAL		H5O_attr_size
+#define H5O_SHARED_DELETE		H5O_attr_shared_delete
+#define H5O_SHARED_DELETE_REAL		H5O_attr_delete
+#define H5O_SHARED_LINK			H5O_attr_shared_link
+#define H5O_SHARED_LINK_REAL		H5O_attr_link
+#define H5O_SHARED_COPY_FILE		H5O_attr_shared_copy_file
+#define H5O_SHARED_COPY_FILE_REAL	H5O_attr_copy_file
+#define H5O_SHARED_POST_COPY_FILE	H5O_attr_shared_post_copy_file
+#define H5O_SHARED_POST_COPY_FILE_REAL	H5O_attr_post_copy_file
+#undef  H5O_SHARED_POST_COPY_FILE_UPD
+#define H5O_SHARED_DEBUG		H5O_attr_shared_debug
+#define H5O_SHARED_DEBUG_REAL		H5O_attr_debug
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_ATTR[1] = {{
+    H5O_ATTR_ID,		/* message id number            */
+    "attribute",		/* message name for debugging   */
+    sizeof(H5A_t),		/* native message size          */
+    H5O_SHARE_IS_SHARABLE,	/* messages are sharable?       */
+    H5O_attr_shared_decode,	/* decode message               */
+    H5O_attr_shared_encode,	/* encode message               */
+    H5O_attr_copy,		/* copy the native value        */
+    H5O_attr_shared_size,	/* size of raw message          */
+    H5O_attr_reset,	        /* reset method                 */
+    H5O_attr_free,	        /* free method			*/
+    H5O_attr_shared_delete,	/* file delete method		*/
+    H5O_attr_shared_link,	/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_attr_pre_copy_file,	/* pre copy native value to file */
+    H5O_attr_shared_copy_file,	/* copy native value to file    */
+    H5O_attr_shared_post_copy_file,	/* post copy native value to file    */
+    H5O_attr_get_crt_index,	/* get creation index		*/
+    H5O_attr_set_crt_index,	/* set creation index		*/
+    H5O_attr_shared_debug	/* debug the message            */
+}};
+
+/* Flags for attribute flag encoding */
+#define H5O_ATTR_FLAG_TYPE_SHARED       0x01
+#define H5O_ATTR_FLAG_SPACE_SHARED      0x02
+#define H5O_ATTR_FLAG_ALL               0x03
+
+/* Declare external the free list for H5S_t's */
+H5FL_EXTERN(H5S_t);
+
+/* Declare external the free list for H5S_extent_t's */
+H5FL_EXTERN(H5S_extent_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_decode
+ PURPOSE
+    Decode a attribute message and return a pointer to a memory struct
+        with the decoded information
+ USAGE
+    void *H5O_attr_decode(f, dxpl_id, mesg_flags, p)
+        H5F_t *f;               IN: pointer to the HDF5 file struct
+        hid_t dxpl_id;          IN: DXPL for any I/O
+        unsigned mesg_flags;    IN: Message flags to influence decoding
+        const uint8_t *p;       IN: the raw information buffer
+ RETURNS
+    Pointer to the new message in native order on success, NULL on failure
+ DESCRIPTION
+        This function decodes the "raw" disk form of a attribute message
+    into a struct in memory native format.  The struct is allocated within this
+    function using malloc() and is returned to the caller.
+--------------------------------------------------------------------------*/
+static void *
+H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned H5_ATTR_UNUSED mesg_flags,
+    unsigned *ioflags, const uint8_t *p)
+{
+    H5A_t		*attr = NULL;
+    H5S_extent_t	*extent;	/*extent dimensionality information  */
+    size_t		name_len;   	/*attribute name length */
+    unsigned            flags = 0;      /* Attribute flags */
+    H5A_t		*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    if(NULL == (attr = H5FL_CALLOC(H5A_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    if(NULL == (attr->shared = H5FL_CALLOC(H5A_shared_t)))
+        HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure")
+
+    /* Version number */
+    attr->shared->version = *p++;
+    if(attr->shared->version < H5O_ATTR_VERSION_1 || attr->shared->version > H5O_ATTR_VERSION_LATEST)
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, NULL, "bad version number for attribute message")
+
+    /* Get the flags byte if we have a later version of the attribute */
+    if(attr->shared->version >= H5O_ATTR_VERSION_2) {
+        flags = *p++;
+
+        /* Check for unknown flag */
+        if(flags & (unsigned)~H5O_ATTR_FLAG_ALL)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, NULL, "unknown flag for attribute message")
+    } /* end if */
+    else
+        p++;    /* Byte is unused when version<2 */
+
+    /*
+     * Decode the sizes of the parts of the attribute.  The sizes stored in
+     * the file are exact but the parts are aligned on 8-byte boundaries.
+     */
+    UINT16DECODE(p, name_len); /*including null*/
+    UINT16DECODE(p, attr->shared->dt_size);
+    UINT16DECODE(p, attr->shared->ds_size);
+
+    /*
+     * Decode the character encoding for the name for versions 3 or later,
+     * as well as some reserved bytes.
+     */
+    if(attr->shared->version >= H5O_ATTR_VERSION_3)
+        attr->shared->encoding = (H5T_cset_t)*p++;
+
+    /* Decode and store the name */
+    if(NULL == (attr->shared->name = H5MM_strdup((const char *)p)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(attr->shared->version < H5O_ATTR_VERSION_2)
+        p += H5O_ALIGN_OLD(name_len);    /* advance the memory pointer */
+    else
+        p += name_len;    /* advance the memory pointer */
+
+    /* Decode the attribute's datatype */
+    if(NULL == (attr->shared->dt = (H5T_t *)(H5O_MSG_DTYPE->decode)(f, dxpl_id, open_oh,
+        ((flags & H5O_ATTR_FLAG_TYPE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), ioflags, p)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, NULL, "can't decode attribute datatype")
+    if(attr->shared->version < H5O_ATTR_VERSION_2)
+        p += H5O_ALIGN_OLD(attr->shared->dt_size);
+    else
+        p += attr->shared->dt_size;
+
+    /* decode the attribute dataspace.  It can be shared in versions >= 3
+     * What's actually shared, though, is only the extent.
+     */
+    if(NULL == (attr->shared->ds = H5FL_CALLOC(H5S_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Decode attribute's dataspace extent */
+    if((extent = (H5S_extent_t *)(H5O_MSG_SDSPACE->decode)(f, dxpl_id, open_oh,
+        ((flags & H5O_ATTR_FLAG_SPACE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), ioflags, p)) == NULL)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, NULL, "can't decode attribute dataspace")
+
+    /* Copy the extent information to the dataspace */
+    HDmemcpy(&(attr->shared->ds->extent), extent, sizeof(H5S_extent_t));
+
+    /* Release temporary extent information */
+    extent = H5FL_FREE(H5S_extent_t, extent);
+
+    /* Default to entire dataspace being selected */
+    if(H5S_select_all(attr->shared->ds, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection")
+
+    if(attr->shared->version < H5O_ATTR_VERSION_2)
+        p += H5O_ALIGN_OLD(attr->shared->ds_size);
+    else
+        p += attr->shared->ds_size;
+
+    /* Compute the size of the data */
+    H5_CHECKED_ASSIGN(attr->shared->data_size, size_t, H5S_GET_EXTENT_NPOINTS(attr->shared->ds) * H5T_get_size(attr->shared->dt), hsize_t);
+
+    /* Go get the data */
+    if(attr->shared->data_size) {
+        if(NULL == (attr->shared->data = H5FL_BLK_MALLOC(attr_buf, attr->shared->data_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HDmemcpy(attr->shared->data, p, attr->shared->data_size);
+    } /* end if */
+
+    /* Increment the reference count for this object header message in cache(compact
+       storage) or for the object from dense storage. */
+    attr->shared->nrefs++;
+
+    /* Set return value */
+    ret_value = attr;
+
+done:
+    if(NULL == ret_value)
+        if(attr) {
+            if(attr->shared) {
+                /* Free any dynamicly allocated items */
+                if(H5A_free(attr) < 0)
+                    HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't release attribute info")
+
+                /* Destroy shared attribute struct */
+                attr->shared = H5FL_FREE(H5A_shared_t, attr->shared);
+            } /* end if */
+
+            attr = H5FL_FREE(H5A_t, attr);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_decode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_encode
+ PURPOSE
+    Encode a simple attribute message
+ USAGE
+    herr_t H5O_attr_encode(f, p, mesg)
+        H5F_t *f;         IN: pointer to the HDF5 file struct
+        const uint8 *p;         IN: the raw information buffer
+        const void *mesg;       IN: Pointer to the simple datatype struct
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+        This function encodes the native memory form of the attribute
+    message in the "raw" disk form.
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg)
+{
+    const H5A_t *attr = (const H5A_t *) mesg;
+    size_t      name_len;   /* Attribute name length */
+    htri_t      is_type_shared;    /* Flag to indicate that a shared datatype is used for this attribute */
+    htri_t      is_space_shared;   /* Flag to indicate that a shared dataspace is used for this attribute */
+    unsigned    flags = 0;      /* Attribute flags */
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(attr);
+
+    /* Check whether datatype and dataspace are shared */
+    if((is_type_shared = H5O_msg_is_shared(H5O_DTYPE_ID, attr->shared->dt)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if datatype is shared")
+
+    if((is_space_shared = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if dataspace is shared")
+
+    /* Encode Version */
+    *p++ = attr->shared->version;
+
+    /* Set attribute flags if version >1 */
+    if(attr->shared->version >= H5O_ATTR_VERSION_2) {
+        flags = (is_type_shared ? H5O_ATTR_FLAG_TYPE_SHARED : 0 );
+        flags |= (is_space_shared ? H5O_ATTR_FLAG_SPACE_SHARED : 0);
+        *p++ = (uint8_t)flags;    /* Set flags for attribute */
+    } /* end if */
+    else
+        *p++ = 0; /* Reserved, for version <2 */
+
+    /*
+     * Encode the lengths of the various parts of the attribute message. The
+     * encoded lengths are exact but we pad each part except the data to be a
+     * multiple of eight bytes (in the first version).
+     */
+    name_len = HDstrlen(attr->shared->name) + 1;
+    UINT16ENCODE(p, name_len);
+    UINT16ENCODE(p, attr->shared->dt_size);
+    UINT16ENCODE(p, attr->shared->ds_size);
+
+    /* The character encoding for the attribute's name, in later versions */
+    if(attr->shared->version >= H5O_ATTR_VERSION_3)
+        *p++ = attr->shared->encoding;
+
+    /* Write the name including null terminator */
+    HDmemcpy(p, attr->shared->name, name_len);
+    if(attr->shared->version < H5O_ATTR_VERSION_2) {
+        /* Pad to the correct number of bytes */
+        HDmemset(p + name_len, 0, H5O_ALIGN_OLD(name_len) - name_len);
+        p += H5O_ALIGN_OLD(name_len);
+    } /* end if */
+    else
+        p += name_len;
+
+    /* encode the attribute datatype */
+    if((H5O_MSG_DTYPE->encode)(f, FALSE, p, attr->shared->dt) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute datatype")
+
+    if(attr->shared->version < H5O_ATTR_VERSION_2) {
+        HDmemset(p + attr->shared->dt_size, 0, H5O_ALIGN_OLD(attr->shared->dt_size) - attr->shared->dt_size);
+        p += H5O_ALIGN_OLD(attr->shared->dt_size);
+    } /* end if */
+    else
+        p += attr->shared->dt_size;
+
+    /* encode the attribute dataspace */
+    if((H5O_MSG_SDSPACE->encode)(f, FALSE, p, &(attr->shared->ds->extent)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute dataspace")
+
+    if(attr->shared->version < H5O_ATTR_VERSION_2) {
+        HDmemset(p + attr->shared->ds_size, 0, H5O_ALIGN_OLD(attr->shared->ds_size) - attr->shared->ds_size);
+        p += H5O_ALIGN_OLD(attr->shared->ds_size);
+    } /* end if */
+    else
+        p += attr->shared->ds_size;
+
+    /* Store attribute data.  If there's no data, store 0 as fill value. */
+    if(attr->shared->data)
+        HDmemcpy(p, attr->shared->data, attr->shared->data_size);
+    else
+        HDmemset(p, 0, attr->shared->data_size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_attr_encode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_copy
+ PURPOSE
+    Copies a message from MESG to DEST, allocating DEST if necessary.
+ USAGE
+    void *H5O_attr_copy(mesg, dest)
+        const void *mesg;       IN: Pointer to the source attribute struct
+        const void *dest;       IN: Pointer to the destination attribute struct
+ RETURNS
+    Pointer to DEST on success, NULL on failure
+ DESCRIPTION
+        This function copies a native (memory) attribute message,
+    allocating the destination structure if necessary.
+--------------------------------------------------------------------------*/
+static void *
+H5O_attr_copy(const void *_src, void *_dst)
+{
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(_src);
+
+    /* copy */
+    if(NULL == (ret_value = (H5A_t *)H5A_copy((H5A_t *)_dst, (const H5A_t *)_src)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "can't copy attribute")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_size
+ PURPOSE
+    Return the raw message size in bytes
+ USAGE
+    size_t H5O_attr_size(f, mesg)
+        H5F_t *f;         IN: pointer to the HDF5 file struct
+        const void *mesg;     IN: Pointer to the source attribute struct
+ RETURNS
+    Size of message on success, 0 on failure
+ DESCRIPTION
+        This function returns the size of the raw attribute message on
+    success.  (Not counting the message type or size fields, only the data
+    portion of the message).  It doesn't take into account alignment.
+--------------------------------------------------------------------------*/
+static size_t
+H5O_attr_size(const H5F_t H5_ATTR_UNUSED *f, const void *_mesg)
+{
+    const H5A_t         *attr = (const H5A_t *)_mesg;
+    size_t		name_len;
+    size_t		ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(attr);
+
+    /* Common size information */
+    ret_value = 1 +				/*version               */
+                1 +				/*reserved/flags	*/
+                2 +				/*name size inc. null	*/
+                2 +				/*type size		*/
+                2; 				/*space size		*/
+
+    /* Length of attribute name */
+    name_len = HDstrlen(attr->shared->name) + 1;
+
+    /* Version-specific size information */
+    if(attr->shared->version == H5O_ATTR_VERSION_1)
+        ret_value += H5O_ALIGN_OLD(name_len) +	/*attribute name	*/
+                    H5O_ALIGN_OLD(attr->shared->dt_size) +	/*datatype		*/
+                    H5O_ALIGN_OLD(attr->shared->ds_size) +	/*dataspace		*/
+                    attr->shared->data_size;		/*the data itself	*/
+    else if(attr->shared->version == H5O_ATTR_VERSION_2)
+        ret_value += name_len	+		/*attribute name	*/
+                    attr->shared->dt_size +		/*datatype		*/
+                    attr->shared->ds_size +		/*dataspace		*/
+                    attr->shared->data_size;		/*the data itself	*/
+    else if(attr->shared->version == H5O_ATTR_VERSION_3)
+        ret_value += 1 +                        /*character encoding    */
+                    name_len	+		/*attribute name	*/
+                    attr->shared->dt_size +		/*datatype		*/
+                    attr->shared->ds_size +		/*dataspace		*/
+                    attr->shared->data_size;		/*the data itself	*/
+    else
+        HDassert(0 && "Bad attribute version");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_reset
+ *
+ * Purpose:     Frees resources within a attribute message, but doesn't free
+ *              the message itself.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Tuesday, December  9, 1997
+ *
+ * Modification:Raymond Lu
+ *              25 June 2008
+ *              Made this function empty.  The freeing action is actually
+ *              done in H5O_attr_free (see H5O_msg_free_real).  But this
+ *              empty reset function needs to be here.  Otherwise, the
+ *              caller function H5O_msg_reset_real will zero-set the whole
+ *              message.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_reset(void H5_ATTR_UNUSED *_mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_attr_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 18, 2004
+ *
+ * Modification:Raymond Lu
+ *              4 June 2008
+ *              Let this function call H5A_close in turn.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_free(void *mesg)
+{
+    H5A_t *attr = (H5A_t *)mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(mesg);
+
+    if(H5A_close(attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, FAIL, "unable to close attribute object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, September 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *_mesg)
+{
+    H5A_t *attr = (H5A_t *) _mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(attr);
+
+    /* Decrement reference count on datatype in file */
+    if((H5O_MSG_DTYPE->del)(f, dxpl_id, oh, attr->shared->dt) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust datatype link count")
+
+    /* Decrement reference count on dataspace in file */
+    if((H5O_MSG_SDSPACE->del)(f, dxpl_id, oh, attr->shared->ds) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust dataspace link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_link
+ *
+ * Purpose:     Increment reference count on any objects referenced by
+ *              message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, September 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_link(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *_mesg)
+{
+    H5A_t *attr = (H5A_t *) _mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(attr);
+
+    /* Re-share attribute's datatype and dataspace to increment their
+     * reference count if they're shared.
+     * Otherwise they may be deleted when the attribute
+     * message is deleted.
+     */
+    /* Increment reference count on datatype & dataspace in file */
+    if((H5O_MSG_DTYPE->link)(f, dxpl_id, oh, attr->shared->dt) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust datatype link count")
+    if((H5O_MSG_SDSPACE->link)(f, dxpl_id, oh, attr->shared->ds) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust dataspace link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files for attribute messages.
+ *
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, June 26, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void H5_ATTR_UNUSED *native_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(deleted);
+    HDassert(cpy_info);
+
+    /* If we are not copying attributes into the destination file, indicate
+     *  that this message should be deleted.
+     */
+    if(cpy_info->copy_without_attr)
+        *deleted = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_attr_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              November 1, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_attr_copy_file(H5F_t *file_src, const H5O_msg_class_t H5_ATTR_UNUSED *mesg_type,
+    void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
+    H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata, hid_t dxpl_id)
+{
+    void        *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(native_src);
+    HDassert(file_dst);
+    HDassert(cpy_info);
+    HDassert(!cpy_info->copy_without_attr);
+
+    /* Mark datatype as being on disk now.  This step used to be done in a lower level
+     * by H5O_dtype_decode.  But it has been moved up.  Not an ideal place, but no better
+     * place than here. */
+    if(H5T_set_loc(((H5A_t *)native_src)->shared->dt, file_src, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "invalid datatype location")
+
+    if(NULL == (ret_value = H5A_attr_copy_file((H5A_t *)native_src, file_dst, recompute_size, cpy_info,  dxpl_id)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy attribute")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_attr_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files.
+ *              We have to copy the values of a reference attribute in the
+ *              post copy because H5O_post_copy_file() fails at the case that
+ *              an object may have a reference attribute that points to the
+ *              object itself.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              March 6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+    H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if ( H5A_attr_post_copy_file(src_oloc, (const H5A_t *)mesg_src,
+         dst_oloc, (H5A_t *)mesg_dst, dxpl_id, cpy_info) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't copy attribute")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_attr_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_get_crt_index
+ *
+ * Purpose:	Get creation index from the message
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 18, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_get_crt_index(const void *_mesg, H5O_msg_crt_idx_t *crt_idx /*out*/)
+{
+    const H5A_t  *attr = (const H5A_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(attr);
+    HDassert(crt_idx);
+
+    /* Get the attribute's creation index */
+    *crt_idx = attr->shared->crt_idx;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_attr_get_crt_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_set_crt_index
+ *
+ * Purpose:	Set creation index from the message
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 18, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_set_crt_index(void *_mesg, H5O_msg_crt_idx_t crt_idx)
+{
+    H5A_t  *attr = (H5A_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(attr);
+
+    /* Set the creation index */
+    attr->shared->crt_idx = crt_idx;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_attr_set_crt_index() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_debug
+ PURPOSE
+    Prints debugging information for an attribute message
+ USAGE
+    void *H5O_attr_debug(f, mesg, stream, indent, fwidth)
+        H5F_t *f;               IN: pointer to the HDF5 file struct
+        const void *mesg;       IN: Pointer to the source attribute struct
+        FILE *stream;           IN: Pointer to the stream for output data
+        int indent;            IN: Amount to indent information by
+        int fwidth;            IN: Field width (?)
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+        This function prints debugging output to the stream passed as a
+    parameter.
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int indent,
+	       int fwidth)
+{
+    const H5A_t *mesg = (const H5A_t *)_mesg;
+    const char		*s;             /* Temporary string pointer */
+    char		buf[128];       /* Temporary string buffer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth,
+	    "Name:",
+	    mesg->shared->name);
+    switch(mesg->shared->encoding) {
+        case H5T_CSET_ASCII:
+            s = "ASCII";
+            break;
+
+        case H5T_CSET_UTF8:
+            s = "UTF-8";
+            break;
+
+        case H5T_CSET_RESERVED_2:
+        case H5T_CSET_RESERVED_3:
+        case H5T_CSET_RESERVED_4:
+        case H5T_CSET_RESERVED_5:
+        case H5T_CSET_RESERVED_6:
+        case H5T_CSET_RESERVED_7:
+        case H5T_CSET_RESERVED_8:
+        case H5T_CSET_RESERVED_9:
+        case H5T_CSET_RESERVED_10:
+        case H5T_CSET_RESERVED_11:
+        case H5T_CSET_RESERVED_12:
+        case H5T_CSET_RESERVED_13:
+        case H5T_CSET_RESERVED_14:
+        case H5T_CSET_RESERVED_15:
+            HDsnprintf(buf, sizeof(buf), "H5T_CSET_RESERVED_%d", (int)(mesg->shared->encoding));
+            s = buf;
+            break;
+
+        case H5T_CSET_ERROR:
+        default:
+            HDsnprintf(buf, sizeof(buf), "Unknown character set: %d", (int)(mesg->shared->encoding));
+            s = buf;
+            break;
+    } /* end switch */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            "Character Set of Name:",
+            s);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	    "Object opened:",
+	    mesg->obj_opened);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	    "Object:",
+	    mesg->oloc.addr);
+
+    /* Check for attribute creation order index on the attribute */
+    if(mesg->shared->crt_idx != H5O_MAX_CRT_ORDER_IDX)
+        HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+                "Creation Index:",
+                (unsigned)mesg->shared->crt_idx);
+
+    HDfprintf(stream, "%*sDatatype...\n", indent, "");
+    HDfprintf(stream, "%*s%-*s %lu\n", indent + 3, "", MAX(0,fwidth - 3),
+	    "Encoded Size:",
+	    (unsigned long)(mesg->shared->dt_size));
+    if((H5O_MSG_DTYPE->debug)(f, dxpl_id, mesg->shared->dt, stream, indent + 3, MAX(0, fwidth - 3)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display datatype message info")
+
+    HDfprintf(stream, "%*sDataspace...\n", indent, "");
+    HDfprintf(stream, "%*s%-*s %lu\n", indent + 3, "", MAX(0, fwidth - 3),
+	    "Encoded Size:",
+	    (unsigned long)(mesg->shared->ds_size));
+    if(H5S_debug(f, dxpl_id, mesg->shared->ds, stream, indent + 3, MAX(0, fwidth - 3)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display dataspace message info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oattribute.c b/gatb-core/thirdparty/hdf5/src/H5Oattribute.c
new file mode 100644
index 0000000..0e6adf0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oattribute.c
@@ -0,0 +1,2049 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Oattribute.c
+ *			Dec 11 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object header attribute routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Fprivate.h"		/* File 			        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for iteration when converting attributes to dense storage */
+typedef struct {
+    H5F_t      *f;              /* Pointer to file for insertion */
+    hid_t dxpl_id;              /* DXPL during iteration */
+    H5O_ainfo_t *ainfo;         /* Attribute info struct */
+} H5O_iter_cvt_t;
+
+/* User data for iteration when opening an attribute */
+typedef struct {
+    /* down */
+    const char *name;           /* Name of attribute to open */
+
+    /* up */
+    H5A_t *attr;                /* Attribute data to update object header with */
+} H5O_iter_opn_t;
+
+/* User data for iteration when updating an attribute */
+typedef struct {
+    /* down */
+    H5F_t *f;                   /* Pointer to file attribute is in */
+    hid_t dxpl_id;              /* DXPL for operation */
+    H5A_t *attr;                /* Attribute data to update object header with */
+
+    /* up */
+    hbool_t found;              /* Whether the attribute was found */
+} H5O_iter_wrt_t;
+
+/* User data for iteration when renaming an attribute */
+typedef struct {
+    /* down */
+    H5F_t *f;                   /* Pointer to file attribute is in */
+    hid_t dxpl_id;              /* DXPL for operation */
+    const char *old_name;       /* Old name of attribute */
+    const char *new_name;       /* New name of attribute */
+
+    /* up */
+    hbool_t found;              /* Whether the attribute was found */
+} H5O_iter_ren_t;
+
+/* User data for iteration when iterating over attributes */
+typedef struct {
+    /* down */
+    H5F_t *f;                   /* Pointer to file attribute is in */
+    hid_t dxpl_id;              /* DXPL for operation */
+    hid_t loc_id;               /* ID of object being iterated over */
+    unsigned skip;              /* # of attributes to skip over */
+    H5A_operator_t op;          /* Callback routine for each attribute */
+    void *op_data;              /* User data for callback */
+
+    /* up */
+    unsigned count;             /* Count of attributes examined */
+} H5O_iter_itr_t;
+
+/* User data for iteration when removing an attribute */
+typedef struct {
+    /* down */
+    H5F_t *f;                   /* Pointer to file attribute is in */
+    hid_t dxpl_id;              /* DXPL for operation */
+    const char *name;           /* Name of attribute to open */
+
+    /* up */
+    hbool_t found;              /* Found attribute to delete */
+} H5O_iter_rm_t;
+
+/* User data for iteration when checking if an attribute exists */
+typedef struct {
+    /* down */
+    const char *name;           /* Name of attribute to open */
+
+    /* up */
+    hbool_t found;              /* Found attribute */
+} H5O_iter_xst_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static htri_t H5O_attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr,
+    const char* name_to_open);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_to_dense_cb
+ *
+ * Purpose:	Object header iterator callback routine to convert compact
+ *              attributes to dense attributes
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ * Modifications:
+ *      Vailin Choi; Sept 2011
+ *      Indicate that the object header is modified and might possibly need
+ *      to condense messages in the object header
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_to_dense_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_cvt_t *udata = (H5O_iter_cvt_t *)_udata;   /* Operator user data */
+    H5A_t *attr = (H5A_t *)mesg->native;        /* Pointer to attribute to insert */
+    herr_t ret_value = H5_ITER_CONT;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->ainfo);
+    HDassert(attr);
+
+    /* Insert attribute into dense storage */
+    if(H5A_dense_insert(udata->f, udata->dxpl_id, udata->ainfo, attr) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to add to dense storage")
+
+    /* Convert message into a null message in the header */
+    /* (don't delete attribute's space in the file though) */
+    if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, FALSE) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to convert into null message")
+
+    /* Indicate that the object header was modified */
+    *oh_modified = H5O_MODIFY_CONDENSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_to_dense_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_create
+ *
+ * Purpose:	Create a new attribute in the object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, December  8, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    htri_t shared_mesg;                 /* Should this message be stored in the Shared Message table? */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(attr);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Check if this object already has attribute information */
+    if(oh->version > H5O_VERSION_1) {
+        hbool_t new_ainfo = FALSE;      /* Flag to indicate that the attribute information is new */
+        htri_t ainfo_exists;            /* Whether the attribute info was retrieved */
+
+        /* Check for (& retrieve if available) attribute info */
+        if((ainfo_exists = H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+        if(!ainfo_exists) {
+            /* Initialize attribute information */
+            ainfo.track_corder = (hbool_t)((oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED) ? TRUE : FALSE);
+            ainfo.index_corder = (hbool_t)((oh->flags & H5O_HDR_ATTR_CRT_ORDER_INDEXED) ? TRUE : FALSE);
+            ainfo.max_crt_idx = 0;
+            ainfo.corder_bt2_addr = HADDR_UNDEF;
+            ainfo.nattrs = 0;
+            ainfo.fheap_addr = HADDR_UNDEF;
+            ainfo.name_bt2_addr = HADDR_UNDEF;
+
+            /* Set flag to add attribute information to object header */
+            new_ainfo = TRUE;
+        } /* end if */
+        else {
+            /* Sanity check attribute info read in */
+            HDassert(ainfo.nattrs > 0);
+            HDassert(ainfo.track_corder == ((oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED) > 0));
+            HDassert(ainfo.index_corder == ((oh->flags & H5O_HDR_ATTR_CRT_ORDER_INDEXED) > 0));
+        } /* end else */
+
+        /* Check if switching to "dense" attribute storage is possible */
+        if(!H5F_addr_defined(ainfo.fheap_addr)) {
+            htri_t sharable;        /* Whether the attribute will be shared */
+            size_t raw_size = 0;    /* Raw size of message */
+
+            /* Check for attribute being sharable */
+            if((sharable = H5SM_can_share(loc->file, dxpl_id, NULL, NULL, H5O_ATTR_ID, attr)) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_BADMESG, FAIL, "can't determine attribute sharing status")
+            else if(sharable == FALSE) {
+                /* Compute the size needed to encode the attribute */
+                raw_size = (H5O_MSG_ATTR->raw_size)(loc->file, FALSE, attr);
+            } /* end if */
+
+            /* Check for condititions for switching to "dense" attribute storage are met */
+            if(ainfo.nattrs == oh->max_compact || (!sharable && raw_size >= H5O_MESG_MAX_SIZE)) {
+                H5O_iter_cvt_t udata;           /* User data for callback */
+                H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+                /* Create dense storage for attributes */
+                if(H5A_dense_create(loc->file, dxpl_id, &ainfo) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to create dense storage for attributes")
+
+                /* Set up user data for callback */
+                udata.f = loc->file;
+                udata.dxpl_id = dxpl_id;
+                udata.ainfo = &ainfo;
+
+                /* Iterate over existing attributes, moving them to dense storage */
+                op.op_type = H5O_MESG_OP_LIB;
+                op.u.lib_op = H5O_attr_to_dense_cb;
+                if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTCONVERT, FAIL, "error converting attributes to dense storage")
+            } /* end if */
+        } /* end if */
+
+        /* Increment attribute count on object */
+        ainfo.nattrs++;
+
+        /* Check whether we're tracking the creation index on attributes */
+        if(ainfo.track_corder) {
+            /* Check for attribute creation order index on the object wrapping around */
+            if(ainfo.max_crt_idx == H5O_MAX_CRT_ORDER_IDX)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTINC, FAIL, "attribute creation index can't be incremented")
+
+            /* Set the creation order index on the attribute & incr. creation order index */
+            attr->shared->crt_idx = ainfo.max_crt_idx++;
+        } /* end if */
+        else
+            /* Set "bogus" creation index for attribute */
+            attr->shared->crt_idx = H5O_MAX_CRT_ORDER_IDX;
+
+        /* Add the attribute information message, if one is needed */
+        if(new_ainfo) {
+            if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_AINFO, H5O_MSG_FLAG_DONTSHARE, 0, &ainfo) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create new attribute info message")
+        } /* end if */
+        /* Otherwise, update existing message */
+        else {
+            if(H5O_msg_write_real(loc->file, dxpl_id, oh, H5O_MSG_AINFO, H5O_MSG_FLAG_DONTSHARE, 0, &ainfo) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info message")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Set "bogus" creation index for attribute */
+        attr->shared->crt_idx = H5O_MAX_CRT_ORDER_IDX;
+
+        /* Set attribute info value to get attribute into object header */
+        ainfo.fheap_addr = HADDR_UNDEF;
+    } /* end else */
+
+    /* Check for storing attribute with dense storage */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Insert attribute into dense storage */
+        if(H5A_dense_insert(loc->file, dxpl_id, &ainfo, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to add to dense storage")
+    } /* end if */
+    else {
+        /* Append new message to object header */
+        if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create new attribute in header")
+    } /* end else */
+
+    /* Increment reference count for shared attribute object for the
+     * object handle created by the caller function H5A_create.  The count
+     * for the cached object header has been incremented in the step above
+     * (in H5O_msg_append_real).  The dense storage doesn't need a count. */
+    attr->shared->nrefs += 1;
+
+    /* Was new attribute shared? */
+    if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr)) > 0) {
+        hsize_t attr_rc;                /* Attribute's ref count in shared message storage */
+
+        /* Retrieve ref count for shared attribute */
+        if(H5SM_get_refcount(loc->file, dxpl_id, H5O_ATTR_ID, &attr->sh_loc, &attr_rc) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count")
+
+        /* If this is not the first copy of the attribute in the shared message
+         *      storage, decrement the reference count on any shared components
+         *      of the attribute.  This is done because the shared message
+         *      storage's "try delete" call doesn't call the message class's
+         *      "delete" callback until the reference count drops to zero.
+         *      However, attributes have already increased the reference
+         *      count on shared components before passing the attribute
+         *      to the shared message code to manage, causing an asymmetry
+         *      in the reference counting for any shared components.
+         *
+         *      The alternate solution is to have the shared message's "try
+         *      delete" code always call the message class's "delete" callback,
+         *      even when the reference count is positive.  This can be done
+         *      without an appreciable performance hit (by using H5HF_op() in
+         *      the shared message comparison v2 B-tree callback), but it has
+         *      the undesirable side-effect of leaving the reference count on
+         *      the attribute's shared components artificially (and possibly
+         *      misleadingly) high, because there's only one shared attribute
+         *      referencing the shared components, not <refcount for the
+         *      shared attribute> objects referencing the shared components.
+         *
+         *      *ick* -QAK, 2007/01/08
+         */
+        if(attr_rc > 1) {
+            if(H5O_attr_delete(loc->file, dxpl_id, oh, attr) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
+        } /* end if */
+    } /* end if */
+    else if(shared_mesg < 0)
+	HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
+
+    /* Update the modification time, if any */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, FALSE) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_open_cb
+ *
+ * Purpose:	Object header iterator callback routine to open an
+ *              attribute stored compactly.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ * Modifications:
+ *	Vailin Choi; September 2011
+ *      Change oh_modified from boolean to unsigned
+ *      (See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_open_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
+    unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_opn_t *udata = (H5O_iter_opn_t *)_udata;   /* Operator user data */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(!udata->attr);
+
+    /* Check for correct attribute message to modify */
+    if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) {
+        /* Make a copy of the attribute to return */
+        if(NULL == (udata->attr = H5A_copy(NULL, (H5A_t *)mesg->native)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy attribute")
+
+        /* Assign [somewhat arbitrary] creation order value, for older versions
+         * of the format or if creation order is not tracked */
+        if(oh->version == H5O_VERSION_1
+                || !(oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED))
+            udata->attr->shared->crt_idx = sequence;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_open_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_open_by_name
+ *
+ * Purpose:	Open an existing attribute in an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 11, 2006
+ *
+ * Modification:Raymond Lu
+ *              23 June 2008
+ *              If the attribute is in dense storage and has already been
+ *              opened, make a copy of already opened object to share some
+ *              object information.
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    H5A_t *exist_attr = NULL;           /* Existing opened attribute object */
+    H5A_t *opened_attr = NULL;          /* Newly opened attribute object */
+    htri_t found_open_attr = FALSE;     /* Whether opened object is found */
+    H5A_t *ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(name);
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't check for attribute info message")
+    } /* end if */
+
+    /* If found the attribute is already opened, make a copy of it to share the
+     * object information.  If not, open attribute as a new object
+     */
+    if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, name)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "failed in finding opened attribute")
+    else if(found_open_attr == TRUE) {
+        if(NULL == (opened_attr = H5A_copy(NULL, exist_attr)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy existing attribute")
+    } /* end else if */
+    else {
+        /* Check for attributes in dense storage */
+        if(H5F_addr_defined(ainfo.fheap_addr)) {
+            /* Open attribute with dense storage */
+            if(NULL == (opened_attr = H5A_dense_open(loc->file, dxpl_id, &ainfo, name)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "can't open attribute")
+        } /* end if */
+        else {
+            H5O_iter_opn_t udata;           /* User data for callback */
+            H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+            /* Set up user data for callback */
+            udata.name = name;
+            udata.attr = NULL;
+
+            /* Iterate over attributes, to locate correct one to open */
+            op.op_type = H5O_MESG_OP_LIB;
+            op.u.lib_op = H5O_attr_open_cb;
+            if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "error updating attribute")
+
+            /* Check that we found the attribute */
+            if(!udata.attr)
+                HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "can't locate attribute: '%s'", name)
+
+            /* Get attribute opened from object header */
+            HDassert(udata.attr);
+            opened_attr = udata.attr;
+        } /* end else */
+
+        /* Mark datatype as being on disk now */
+        if(H5T_set_loc(opened_attr->shared->dt, loc->file, H5T_LOC_DISK) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "invalid datatype location")
+    } /* end else */
+
+    /* Set return value */
+    ret_value = opened_attr;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    /* Release any resources, on error */
+    if(NULL == ret_value && opened_attr)
+        if(H5A_close(opened_attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_open_by_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_open_by_idx_cb
+ *
+ * Purpose:	Callback routine opening an attribute by index
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_open_by_idx_cb(const H5A_t *attr, void *_ret_attr)
+{
+    H5A_t **ret_attr = (H5A_t **)_ret_attr;     /* 'User data' passed in */
+    herr_t ret_value = H5_ITER_STOP;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(attr);
+    HDassert(ret_attr);
+
+    /* Copy attribute information.  Shared some attribute information. */
+    if(NULL == (*ret_attr = H5A_copy(NULL, attr)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_open_by_idx_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_open_by_idx
+ *
+ * Purpose:	Open an existing attribute in an object header according to
+ *              an index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 18, 2006
+ *
+ * Modification:Raymond Lu
+ *              23 June 2008
+ *              After opening the attribute, check whether it's in dense
+ *              storage and has already been opened.  If it has, close the
+ *              opened object and make a copy of already opened object.
+ *-------------------------------------------------------------------------
+ */
+H5A_t *
+H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    H5A_attr_iter_op_t attr_op;         /* Attribute operator */
+    H5A_t *exist_attr = NULL;           /* Existing opened attribute object */
+    H5A_t *opened_attr = NULL;          /* Newly opened attribute object */
+    htri_t found_open_attr = FALSE;     /* Whether opened object is found */
+    H5A_t *ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+
+    /* Build attribute operator info */
+    attr_op.op_type = H5A_ATTR_OP_LIB;
+    attr_op.u.lib_op = H5O_attr_open_by_idx_cb;
+
+    /* Iterate over attributes to locate correct one */
+    if(H5O_attr_iterate_real((hid_t)-1, loc, dxpl_id, idx_type, order, n, NULL, &attr_op, &opened_attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADITER, NULL, "can't locate attribute")
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header")
+
+    /* Find out whether it has already been opened.  If it has, close the object
+     * and make a copy of the already opened object to share the object info.
+     */
+    if(opened_attr) {
+        if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, opened_attr->shared->name)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "failed in finding opened attribute")
+
+        /* If found that the attribute is already opened, make a copy of it
+         * and close the object just opened.
+         */
+        if(found_open_attr && exist_attr) {
+            if(H5A_close(opened_attr) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, NULL, "can't close attribute")
+            if(NULL == (opened_attr = H5A_copy(NULL, exist_attr)))
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy existing attribute")
+        } else {
+            /* Mark datatype as being on disk now */
+            if(H5T_set_loc(opened_attr->shared->dt, loc->file, H5T_LOC_DISK) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "invalid datatype location")
+        } /* end if */
+    } /* end if */
+
+    /* Set return value */
+    ret_value = opened_attr;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    /* Release any resources, on error */
+    if(NULL == ret_value && opened_attr)
+        if(H5A_close(opened_attr) < 0)
+            HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, NULL, "can't close attribute")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_open_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_find_opened_attr
+ *
+ * Purpose:	Find out whether an attribute has been opened by giving
+ *              the name.  Return the pointer to the object if found.
+ *
+ * Return:	TRUE:	found the already opened object
+ *              FALSE:  didn't find the opened object
+ *              FAIL:	function failed.
+ *
+ * Programmer:	Raymond Lu
+ *		23 June 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr, const char* name_to_open)
+{
+    hid_t *attr_id_list = NULL;         /* List of IDs for opened attributes */
+    unsigned long loc_fnum;             /* File serial # for object */
+    size_t num_open_attr;               /* Number of opened attributes */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get file serial number for the location of attribute */
+    if(H5F_get_fileno(loc->file, &loc_fnum) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "can't get file serial number")
+
+    /* Count all opened attributes */
+    if(H5F_get_obj_count(loc->file, H5F_OBJ_ATTR | H5F_OBJ_LOCAL, FALSE, &num_open_attr) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't count opened attributes")
+
+    /* Find out whether the attribute has been opened */
+    if(num_open_attr) {
+        size_t check_num_attr;  /* Number of open attribute IDs */
+        size_t u;          /* Local index variable */
+
+        /* Allocate space for the attribute ID list */
+        if(NULL == (attr_id_list = (hid_t *)H5MM_malloc(num_open_attr * sizeof(hid_t))))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, FAIL, "unable to allocate memory for attribute ID list")
+
+        /* Retrieve the IDs of all opened attributes */
+        if(H5F_get_obj_ids(loc->file, H5F_OBJ_ATTR | H5F_OBJ_LOCAL, num_open_attr, attr_id_list, FALSE, &check_num_attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get IDs of opened attributes")
+	if(check_num_attr != num_open_attr)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "open attribute count mismatch")
+
+        /* Iterate over the attributes */
+        for(u = 0; u < num_open_attr; u++) {
+            unsigned long attr_fnum;        /* Attributes file serial number */
+
+            /* Get pointer to attribute */
+            if(NULL == (*attr = (H5A_t *)H5I_object_verify(attr_id_list[u], H5I_ATTR)))
+                HGOTO_ERROR(H5E_ATTR, H5E_BADTYPE, FAIL, "not an attribute")
+
+            /* Get file serial number for attribute */
+            if(H5F_get_fileno((*attr)->oloc.file, &attr_fnum) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "can't get file serial number")
+
+            /* Verify whether it's the right object.  The attribute name, object
+             *  address to which the attribute is attached, and file serial
+             *  number should all match.
+             */
+            if(!HDstrcmp(name_to_open, (*attr)->shared->name) &&
+                    loc->addr == (*attr)->oloc.addr &&
+                    loc_fnum == attr_fnum) {
+                ret_value = TRUE;
+                break;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+done:
+    if(attr_id_list)
+        H5MM_free(attr_id_list);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_find_opened_attr */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_update_shared
+ *
+ * Purpose:	Update a shared attribute.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jan  2 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_update_shared(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5A_t *attr,
+    H5O_shared_t *update_sh_mesg)
+{
+    H5O_shared_t sh_mesg;               /* Shared object header message */
+    hsize_t attr_rc;                    /* Attribute's ref count in shared message storage */
+    htri_t shared_mesg;                 /* Whether the message should be shared */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(attr);
+
+    /* Extract shared message info from current attribute (for later use) */
+    if(H5O_set_shared(&sh_mesg, &(attr->sh_loc)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't get shared message")
+
+    /* Reset existing sharing information */
+    if(H5O_msg_reset_share(H5O_ATTR_ID, attr) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to reset attribute sharing")
+
+    /* Store new version of message as a SOHM */
+    /* (should always work, since we're not changing the size of the attribute) */
+    if((shared_mesg = H5SM_try_share(f, dxpl_id, oh, 0, H5O_ATTR_ID, attr, NULL)) == 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADMESG, FAIL, "attribute changed sharing status")
+    else if(shared_mesg < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_BADMESG, FAIL, "can't share attribute")
+
+    /* Retrieve shared message storage ref count for new shared attribute */
+    if(H5SM_get_refcount(f, dxpl_id, H5O_ATTR_ID, &attr->sh_loc, &attr_rc) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count")
+
+    /* If the newly shared attribute needs to share "ownership" of the shared
+     *      components (ie. its reference count is 1), increment the reference
+     *      count on any shared components of the attribute, so that they won't
+     *      be removed from the file by the following "delete" operation on the
+     *      original attribute shared message info.  (Essentially a "copy on
+     *      write" operation).
+     *
+     *      *ick* -QAK, 2007/01/08
+     */
+    if(attr_rc == 1) {
+        /* Increment reference count on attribute components */
+        if(H5O_attr_link(f, dxpl_id, oh, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust attribute link count")
+    } /* end if */
+
+    /* Remove the old attribute from the SOHM storage */
+    if(H5SM_delete(f, dxpl_id, oh, &sh_mesg) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to delete shared attribute in shared storage")
+
+    /* Extract updated shared message info from modified attribute, if requested */
+    if(update_sh_mesg)
+        if(H5O_set_shared(update_sh_mesg, &(attr->sh_loc)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't get shared message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_update_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_write_cb
+ *
+ * Purpose:	Object header iterator callback routine to update an
+ *              attribute stored compactly.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  4 2006
+ *
+ * Modification:Raymond Lu
+ *              4 June 2008
+ *              Took out the data copying part because the attribute data
+ *              is shared between attribute handle and object header.
+ *
+ * Modifications:
+ *      Vailin Choi; Sept 2011
+ *      Indicate that the object header is modified but does not need to
+ *	condense messages in the object header
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_wrt_t *udata = (H5O_iter_wrt_t *)_udata;   /* Operator user data */
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that message is in */
+    hbool_t chk_dirtied = FALSE;        /* Flag for unprotecting chunk */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(!udata->found);
+
+    /* Check for correct attribute message to modify */
+    if(0 == HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->attr->shared->name)) {
+        /* Protect chunk */
+        if(NULL == (chk_proxy = H5O_chunk_protect(udata->f, udata->dxpl_id, oh, mesg->chunkno)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load object header chunk")
+
+        /* Because the attribute structure is shared now. The only situation that requires
+         * copying the data is when the metadata cache evicts and reloads this attribute. 
+         * The shared attribute structure will be different in that situation. SLU-2010/7/29 */
+        if(((H5A_t *)mesg->native)->shared != udata->attr->shared) {
+            /* Sanity check */
+            HDassert(((H5A_t *)mesg->native)->shared->data);
+            HDassert(udata->attr->shared->data);
+            HDassert(((H5A_t *)mesg->native)->shared->data != udata->attr->shared->data);
+
+            /* (Needs to occur before updating the shared message, or the hash
+             *      value on the old & new messages will be the same) */
+            HDmemcpy(((H5A_t *)mesg->native)->shared->data, udata->attr->shared->data, udata->attr->shared->data_size);
+        } /* end if */
+
+        /* Mark the message as modified */
+        mesg->dirty = TRUE;
+        chk_dirtied = TRUE;
+
+        /* Release chunk */
+        if(H5O_chunk_unprotect(udata->f, udata->dxpl_id, chk_proxy, chk_dirtied) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to unprotect object header chunk")
+        chk_proxy = NULL;
+
+        /* Update the shared attribute in the SOHM storage */
+        if(mesg->flags & H5O_MSG_FLAG_SHARED)
+            if(H5O_attr_update_shared(udata->f, udata->dxpl_id, oh, udata->attr, (H5O_shared_t *)mesg->native) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, H5_ITER_ERROR, "unable to update attribute in shared storage")
+
+        /* Indicate that the object header was modified */
+        *oh_modified = H5O_MODIFY;
+
+        /* Indicate that the attribute was found */
+        udata->found = TRUE;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    /* Release chunk, if not already done */
+    if(chk_proxy && H5O_chunk_unprotect(udata->f, udata->dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_write_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_write
+ *
+ * Purpose:	Write a new value to an attribute.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December  4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_write(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(attr);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Modify the attribute data in dense storage */
+        if(H5A_dense_write(loc->file, dxpl_id, &ainfo, attr) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "error updating attribute")
+    } /* end if */
+    else {
+        H5O_iter_wrt_t udata;           /* User data for callback */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        /* Set up user data for callback */
+        udata.f = loc->file;
+        udata.dxpl_id = dxpl_id;
+        udata.attr = attr;
+        udata.found = FALSE;
+
+        /* Iterate over attributes, to locate correct one to update */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_write_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "error updating attribute")
+
+        /* Check that we found the attribute */
+        if(!udata.found)
+            HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't locate open attribute?")
+    } /* end else */
+
+    /* Update the modification time, if any */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, FALSE) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_write */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_rename_chk_cb
+ *
+ * Purpose:	Object header iterator callback routine to check for
+ *              duplicate name during rename
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  5 2006
+ *
+ * Modifications:
+ *      Vailin Choi; September 2011
+ *      Change "oh_modified" from boolean to unsigned
+ *      (See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_rename_chk_cb(H5O_t H5_ATTR_UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_ren_t *udata = (H5O_iter_ren_t *)_udata;   /* Operator user data */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(!udata->found);
+
+    /* Check for existing attribute with new name */
+    if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->new_name) == 0) {
+        /* Indicate that we found an existing attribute with the new name*/
+        udata->found = TRUE;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_rename_chk_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_rename_mod_cb
+ *
+ * Purpose:	Object header iterator callback routine to change name of
+ *              attribute during rename
+ *
+ * Note:	This routine doesn't currently allow an attribute to change
+ *              its "shared" status, if the name change would cause a size
+ *              difference that would put it into a different category.
+ *              Something for later...
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  5 2006
+ *
+ * Modifications:
+ *      Vailin Choi; Sept 2011
+ *      Indicate that the object header is modified and might possibly need
+ *      to condense messages in the object header
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_ren_t *udata = (H5O_iter_ren_t *)_udata;   /* Operator user data */
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that message is in */
+    hbool_t chk_dirtied = FALSE;        /* Flag for unprotecting chunk */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(!udata->found);
+
+    /* Find correct attribute message to rename */
+    if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->old_name) == 0) {
+        unsigned old_version = ((H5A_t *)mesg->native)->shared->version;        /* Old version of the attribute */
+
+        /* Protect chunk */
+        if(NULL == (chk_proxy = H5O_chunk_protect(udata->f, udata->dxpl_id, oh, mesg->chunkno)))
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load object header chunk")
+
+        /* Change the name for the attribute */
+        H5MM_xfree(((H5A_t *)mesg->native)->shared->name);
+        ((H5A_t *)mesg->native)->shared->name = H5MM_xstrdup(udata->new_name);
+
+        /* Recompute the version to encode the attribute with */
+        if(H5A_set_version(udata->f, ((H5A_t *)mesg->native)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, H5_ITER_ERROR, "unable to update attribute version")
+
+        /* Mark the message as modified */
+        mesg->dirty = TRUE;
+        chk_dirtied = TRUE;
+
+        /* Release chunk */
+        if(H5O_chunk_unprotect(udata->f, udata->dxpl_id, chk_proxy, chk_dirtied) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to unprotect object header chunk")
+        chk_proxy = NULL;
+
+        /* Check for shared message */
+        if(mesg->flags & H5O_MSG_FLAG_SHARED) {
+            /* Update the shared attribute in the SOHM storage */
+            if(H5O_attr_update_shared(udata->f, udata->dxpl_id, oh, (H5A_t *)mesg->native, NULL) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, H5_ITER_ERROR, "unable to update attribute in shared storage")
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5O_msg_is_shared(H5O_ATTR_ID, (H5A_t *)mesg->native) == FALSE);
+
+            /* Check for attribute message changing size */
+            if(HDstrlen(udata->new_name) != HDstrlen(udata->old_name) ||
+                    old_version != ((H5A_t *)mesg->native)->shared->version) {
+                H5A_t *attr;            /* Attribute to re-add */
+
+                /* Take ownership of the message's native info (the attribute)
+                 *      so any shared objects in the file aren't adjusted (and
+                 *      possibly deleted) when the message is released.
+                 */
+                /* (We do this more complicated sequence of actions because the
+                 *      simpler solution of adding the modified attribute first
+                 *      and then deleting the old message can re-allocate the
+                 *      list of messages during the "add the modified attribute"
+                 *      step, invalidating the message pointer we have here - QAK)
+                 */
+                attr = (H5A_t *)mesg->native;
+                mesg->native = NULL;
+
+                /* Delete old attribute */
+                /* (doesn't decrement the link count on shared components becuase
+                 *      the "native" pointer has been reset)
+                 */
+                if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, FALSE) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to release previous attribute")
+
+		*oh_modified = H5O_MODIFY_CONDENSE;
+
+                /* Append renamed attribute to object header */
+                /* (Don't let it become shared) */
+                if(H5O_msg_append_real(udata->f, udata->dxpl_id, oh, H5O_MSG_ATTR, (mesg->flags | H5O_MSG_FLAG_DONTSHARE), 0, attr) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to relocate renamed attribute in header")
+
+                /* Sanity check */
+                HDassert(H5O_msg_is_shared(H5O_ATTR_ID, attr) == FALSE);
+
+                /* Close the local copy of the attribute */
+                H5A_close(attr);
+            } /* end if */
+        } /* end else */
+
+        /* Indicate that the object header was modified */
+        *oh_modified |= H5O_MODIFY;
+
+        /* Indicate that we found an existing attribute with the old name */
+        udata->found = TRUE;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    /* Release chunk, if not already done */
+    if(chk_proxy && H5O_chunk_unprotect(udata->f, udata->dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_rename_mod_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_rename
+ *
+ * Purpose:	Rename an attribute.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, December  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id, const char *old_name,
+    const char *new_name)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(old_name);
+    HDassert(new_name);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Rename the attribute data in dense storage */
+        if(H5A_dense_rename(loc->file, dxpl_id, &ainfo, old_name, new_name) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "error updating attribute")
+    } /* end if */
+    else {
+        H5O_iter_ren_t udata;           /* User data for callback */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        /* Set up user data for callback */
+        udata.f = loc->file;
+        udata.dxpl_id = dxpl_id;
+        udata.old_name = old_name;
+        udata.new_name = new_name;
+        udata.found = FALSE;
+
+        /* Iterate over attributes, to check if "new name" exists already */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_rename_chk_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "error updating attribute")
+
+        /* If the new name was found, indicate an error */
+        if(udata.found)
+            HGOTO_ERROR(H5E_ATTR, H5E_EXISTS, FAIL, "attribute with new name already exists")
+
+        /* Iterate over attributes again, to actually rename attribute with old name */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_rename_mod_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "error updating attribute")
+
+        /* Check that we found the attribute to rename */
+        if(!udata.found)
+            HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't locate attribute with old name")
+    } /* end else */
+
+    /* Update the modification time, if any */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, FALSE) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_rename */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_iterate_real
+ *
+ * Purpose:	Internal routine to iterate over attributes for an object.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, December  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip,
+    hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op, void *op_data)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
+    herr_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(attr_op);
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Check for skipping too many attributes */
+        if(skip > 0 && skip >= ainfo.nattrs)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+
+        /* Release the object header */
+        if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+        oh = NULL;
+
+        /* Iterate over attributes in dense storage */
+        if((ret_value = H5A_dense_iterate(loc->file, dxpl_id, loc_id, &ainfo, idx_type, order, skip, last_attr, attr_op, op_data)) < 0)
+            HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
+    } /* end if */
+    else {
+        /* Build table of attributes for compact storage */
+        if(H5A_compact_build_table(loc->file, dxpl_id, oh, idx_type, order, &atable) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
+
+        /* Release the object header */
+        if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+        oh = NULL;
+
+        /* Check for skipping too many attributes */
+        if(skip > 0 && skip >= atable.nattrs)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+
+        /* Iterate over attributes in table */
+        if((ret_value = H5A_attr_iterate_table(&atable, skip, last_attr, loc_id, attr_op, op_data)) < 0)
+            HERROR(H5E_ATTR, H5E_CANTNEXT, "iteration operator failed");
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+    if(atable.attrs && H5A_attr_release_table(&atable) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_iterate_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_iterate
+ *
+ * Purpose:	Iterate over attributes for an object.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, December  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_iterate(hid_t loc_id, hid_t dxpl_id,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip,
+    hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op, void *op_data)
+{
+    H5G_loc_t loc;	        /* Object location */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(attr_op);
+
+    /* Look up location for location ID */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+
+    /* Iterate over attributes to locate correct one */
+    if((ret_value = H5O_attr_iterate_real(loc_id, loc.oloc, dxpl_id, idx_type, order, skip, last_attr, attr_op, op_data)) < 0)
+        HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_remove_update
+ *
+ * Purpose:	Check for reverting from dense to compact attribute storage
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, February 14, 2007
+ *
+ * Modification:Raymond Lu
+ *              24 June 2008
+ *              When converting storage from dense to compact, if found
+ *              the attribute is already opened, use the opened message
+ *              to insert.  If not, still use the message in the attribute
+ *              table. This will guarantee that the attribute message is
+ *              shared between the object in metadata cache and the opened
+ *              object.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_remove_update(const H5O_loc_t *loc, H5O_t *oh, H5O_ainfo_t *ainfo,
+    hid_t dxpl_id)
+{
+    H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(oh);
+    HDassert(ainfo);
+
+    /* Decrement the number of attributes on the object */
+    ainfo->nattrs--;
+
+    /* Check for shifting from dense storage back to compact storage */
+    if(H5F_addr_defined(ainfo->fheap_addr) && ainfo->nattrs < oh->min_dense) {
+        hbool_t can_convert = TRUE;     /* Whether converting to attribute messages is possible */
+        size_t u;                       /* Local index */
+
+        /* Build the table of attributes for this object */
+        if(H5A_dense_build_table(loc->file, dxpl_id, ainfo, H5_INDEX_NAME, H5_ITER_NATIVE, &atable) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
+
+        /* Inspect attributes in table for ones that can't be converted back
+         * into attribute message form (currently only attributes which
+         * can't fit into an object header message)
+         */
+        for(u = 0; u < ainfo->nattrs; u++)
+            if(H5O_msg_size_oh(loc->file, oh, H5O_ATTR_ID, (atable.attrs[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) {
+                can_convert = FALSE;
+                break;
+            } /* end if */
+
+        /* If ok, insert attributes as object header messages */
+        if(can_convert) {
+            H5A_t *exist_attr = NULL;
+            htri_t found_open_attr = FALSE;
+
+            /* Iterate over attributes, to put them into header */
+            for(u = 0; u < ainfo->nattrs; u++) {
+                htri_t shared_mesg;             /* Should this message be stored in the Shared Message table? */
+
+                /* Check if attribute is shared */
+                if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, (atable.attrs[u]))) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "error determining if message is shared")
+                else if(shared_mesg == 0) {
+                    /* Increment reference count on attribute components */
+                    /* (so that they aren't deleted when the dense attribute storage is deleted) */
+                    if(H5O_attr_link(loc->file, dxpl_id, oh, (atable.attrs[u])) < 0)
+                        HGOTO_ERROR(H5E_ATTR, H5E_LINKCOUNT, FAIL, "unable to adjust attribute link count")
+                } /* end if */
+                else {
+                    /* Reset 'shared' status, so attribute will be shared again */
+                    (atable.attrs[u])->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
+                } /* end else */
+
+                /* Insert attribute message into object header (Will increment
+                   reference count on shared attributes) */
+                /* Find out whether the attribute has been opened */
+                if((found_open_attr = H5O_attr_find_opened_attr(loc, &exist_attr, (atable.attrs[u])->shared->name)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "failed in finding opened attribute")
+
+                /* If found the attribute is already opened, use the opened message to insert.
+                   If not, still use the message in the attribute table. */
+                if(found_open_attr && exist_attr) {
+                    if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, exist_attr) < 0)
+                        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't create message")
+
+                } else {
+                    if(H5O_msg_append_real(loc->file, dxpl_id, oh, H5O_MSG_ATTR, 0, 0, (atable.attrs[u])) < 0)
+                        HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "can't create message")
+                }
+            } /* end for */
+
+            /* Remove the dense storage */
+            if(H5A_dense_delete(loc->file, dxpl_id, ainfo) < 0)
+                HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete dense attribute storage")
+        } /* end if */
+    } /* end if */
+
+    /* Check if we have deleted all the attributes and the attribute info
+     *  message should be deleted itself.
+     */
+    if(ainfo->nattrs == 0) {
+        if(H5O_msg_remove_real(loc->file, oh, H5O_MSG_AINFO, H5O_ALL, NULL, NULL, TRUE, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute info")
+    } /* end if */
+    else {
+        if(H5O_msg_write_real(loc->file, dxpl_id, oh, H5O_MSG_AINFO, H5O_MSG_FLAG_DONTSHARE, 0, ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info message")
+    } /* end else */
+
+done:
+    /* Release resources */
+    if(atable.attrs && H5A_attr_release_table(&atable) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_remove_update() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_remove_cb
+ *
+ * Purpose:	Object header iterator callback routine to remove an
+ *              attribute stored compactly.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ * Modifications:
+ *      Vailin Choi; Sept 2011
+ *      Indicate that the object header is modified and might possibly need
+ *      to condense messages in the object header
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_rm_t *udata = (H5O_iter_rm_t *)_udata;   /* Operator user data */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(!udata->found);
+
+    /* Check for correct attribute message to modify */
+    if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) {
+        /* Convert message into a null message (i.e. delete it) */
+        if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, TRUE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to convert into null message")
+
+        /* Indicate that the object header was modified */
+        *oh_modified = H5O_MODIFY_CONDENSE;
+
+        /* Indicate that this message is the attribute to be deleted */
+        udata->found = TRUE;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_remove_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_remove
+ *
+ * Purpose:	Delete an attribute on an object.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_remove(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(name);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if((ainfo_exists = H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Delete attribute from dense storage */
+        if(H5A_dense_remove(loc->file, dxpl_id, &ainfo, name) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute in dense storage")
+    } /* end if */
+    else {
+        H5O_iter_rm_t udata;            /* User data for callback */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        /* Set up user data for callback */
+        udata.f = loc->file;
+        udata.dxpl_id = dxpl_id;
+        udata.name = name;
+        udata.found = FALSE;
+
+        /* Iterate over attributes, to locate correct one to delete */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_remove_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "error deleting attribute")
+
+        /* Check that we found the attribute */
+        if(!udata.found)
+            HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't locate attribute")
+    } /* end else */
+
+    /* Update the attribute information after removing an attribute */
+    if(ainfo_exists)
+        if(H5O_attr_remove_update(loc, oh, &ainfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info")
+
+    /* Update the modification time, if any */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, FALSE) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_remove_by_idx
+ *
+ * Purpose:	Delete an attribute on an object, according to an order within
+ *		an index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, February 14, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
+    H5_iter_order_t order, hsize_t n, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;                  /* Attribute information for object */
+    htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
+    H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if((ainfo_exists = H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Delete attribute from dense storage */
+        if(H5A_dense_remove_by_idx(loc->file, dxpl_id, &ainfo, idx_type, order, n) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute in dense storage")
+    } /* end if */
+    else {
+        H5O_iter_rm_t udata;            /* User data for callback */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        /* Build table of attributes for compact storage */
+        if(H5A_compact_build_table(loc->file, dxpl_id, oh, idx_type, order, &atable) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
+
+        /* Check for skipping too many attributes */
+        if(n >= atable.nattrs)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
+
+        /* Set up user data for callback, to remove the attribute by name */
+        udata.f = loc->file;
+        udata.dxpl_id = dxpl_id;
+        udata.name = ((atable.attrs[n])->shared)->name;
+        udata.found = FALSE;
+
+        /* Iterate over attributes, to locate correct one to delete */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_remove_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "error deleting attribute")
+
+        /* Check that we found the attribute */
+        if(!udata.found)
+            HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "can't locate attribute")
+    } /* end else */
+
+    /* Update the attribute information after removing an attribute */
+    if(ainfo_exists)
+        if(H5O_attr_remove_update(loc, oh, &ainfo, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info")
+
+    /* Update the modification time, if any */
+    if(H5O_touch_oh(loc->file, dxpl_id, oh, FALSE) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+    if(atable.attrs && H5A_attr_release_table(&atable) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_remove_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_count_real
+ *
+ * Purpose:	Determine the # of attributes on an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, March  9, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hsize_t *nattrs)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(nattrs);
+
+    /* Check for attributes stored densely */
+    if(oh->version > H5O_VERSION_1) {
+        htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
+        H5O_ainfo_t ainfo;                  /* Attribute information for object */
+
+        /* Attempt to get the attribute information from the object header */
+        if((ainfo_exists = H5A_get_ainfo(f, dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+        else if(ainfo_exists > 0)
+            *nattrs = ainfo.nattrs;
+        else
+            *nattrs = 0;
+    } /* end if */
+    else {
+        hsize_t attr_count;     /* Number of attributes found */
+        unsigned u;             /* Local index variable */
+
+        /* Loop over all messages, counting the attributes */
+        attr_count = 0;
+        for(u = 0; u < oh->nmesgs; u++)
+            if(oh->mesg[u].type == H5O_MSG_ATTR)
+                attr_count++;
+        *nattrs = attr_count;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_count_real */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_exists_cb
+ *
+ * Purpose:	Object header iterator callback routine to check for an
+ *              attribute stored compactly, by name.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 11 2006
+ *
+ * Modifications:
+ *      Vailin Choi; September 2011
+ *      Change "oh_modified" from boolean to unsigned
+ *      (See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_attr_exists_cb(H5O_t H5_ATTR_UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned H5_ATTR_UNUSED sequence, unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_rm_t *udata = (H5O_iter_rm_t *)_udata;   /* Operator user data */
+    herr_t ret_value = H5_ITER_CONT;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(mesg);
+    HDassert(!udata->found);
+
+    /* Check for correct attribute message */
+    if(HDstrcmp(((H5A_t *)mesg->native)->shared->name, udata->name) == 0) {
+        /* Indicate that this message is the attribute sought */
+        udata->found = TRUE;
+
+        /* Stop iterating */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_exists_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_exists
+ *
+ * Purpose:	Determine if an attribute with a particular name exists on an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;           /* Pointer to actual object header */
+    H5O_ainfo_t ainfo;          /* Attribute information for object */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+    HDassert(name);
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for attributes stored densely */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Check if attribute exists in dense storage */
+        if((ret_value = H5A_dense_exists(loc->file, dxpl_id, &ainfo, name)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error checking for existence of attribute")
+    } /* end if */
+    else {
+        H5O_iter_rm_t udata;            /* User data for callback */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        /* Set up user data for callback */
+        udata.f = loc->file;
+        udata.dxpl_id = dxpl_id;
+        udata.name = name;
+        udata.found = FALSE;
+
+        /* Iterate over existing attributes, checking for attribute with same name */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5O_attr_exists_cb;
+        if(H5O_msg_iterate_real(loc->file, oh, H5O_MSG_ATTR, &op, &udata, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error checking for existence of attribute")
+
+        /* Check that we found the attribute */
+        ret_value = (htri_t)udata.found;
+    } /* end else */
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_exists */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_attr_bh_info
+ *
+ * Purpose:     For 1.8 attribute, returns storage amount for btree and fractal heap
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              June 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_attr_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
+{
+    H5HF_t      *fheap = NULL;              /* Fractal heap handle */
+    H5B2_t      *bt2_name = NULL;           /* v2 B-tree handle for name index */
+    H5B2_t      *bt2_corder = NULL;         /* v2 B-tree handle for creation order index */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(oh);
+    HDassert(bh_info);
+
+    /* Attributes are only stored in fractal heap & indexed w/v2 B-tree in later versions */
+    if(oh->version > H5O_VERSION_1) {
+        H5O_ainfo_t ainfo;          /* Attribute information for object */
+        htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
+
+        /* Check for (& retrieve if available) attribute info */
+        if((ainfo_exists = H5A_get_ainfo(f, dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+        else if(ainfo_exists > 0) {
+            /* Check if name index available */
+            if(H5F_addr_defined(ainfo.name_bt2_addr)) {
+                /* Open the name index v2 B-tree */
+                if(NULL == (bt2_name = H5B2_open(f, dxpl_id, ainfo.name_bt2_addr, NULL)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+                /* Get name index B-tree size */
+                if(H5B2_size(bt2_name, dxpl_id, &(bh_info->index_size)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
+            } /* end if */
+
+            /* Check if creation order index available */
+            if(H5F_addr_defined(ainfo.corder_bt2_addr)) {
+                /* Open the creation order index v2 B-tree */
+                if(NULL == (bt2_corder = H5B2_open(f, dxpl_id, ainfo.corder_bt2_addr, NULL)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+                /* Get creation order index B-tree size */
+                if(H5B2_size(bt2_corder, dxpl_id, &(bh_info->index_size)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
+            } /* end if */
+
+            /* Get storage size of fractal heap, if it's used */
+            if(H5F_addr_defined(ainfo.fheap_addr)) {
+                /* Open the fractal heap for attributes */
+                if(NULL == (fheap = H5HF_open(f, dxpl_id, ainfo.fheap_addr)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+                /* Get heap storage size */
+                if(H5HF_size(fheap, dxpl_id, &(bh_info->heap_size)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for creation order index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_attr_bh_info() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_attr_count
+ *
+ * Purpose:	Determine the # of attributes on an object
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, December 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;           /* Pointer to actual object header */
+    hsize_t nattrs;             /* Number of attributes */
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(loc);
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Retrieve # of attributes on object */
+    if(H5O_attr_count_real(loc->file, dxpl_id, oh, &nattrs) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve attribute count")
+
+    /* Set return value */
+    ret_value = (int)nattrs;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_attr_count */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Obogus.c b/gatb-core/thirdparty/hdf5/src/H5Obogus.c
new file mode 100644
index 0000000..b368ab6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Obogus.c
@@ -0,0 +1,217 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Obogus.c
+ *                      Jan 21 2003
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             "bogus" message.  This message is guaranteed to never
+ *                      be found in a valid HDF5 file and is only used to
+ *                      generate a test file which verifies the library's
+ *                      correct operation when parsing unknown object header
+ *                      messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+#ifdef H5O_ENABLE_BOGUS
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_bogus_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_bogus_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static size_t H5O_bogus_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_bogus_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_BOGUS[1] = {{
+    H5O_BOGUS_ID,            	/*message id number             */
+    "bogus",                 	/*message name for debugging    */
+    0,     	                /*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_bogus_decode,        	/*decode message                */
+    H5O_bogus_encode,        	/*encode message                */
+    NULL,          	        /*copy the native value         */
+    H5O_bogus_size,          	/*raw message size              */
+    NULL,         	        /*free internal memory          */
+    NULL,		        /*free method			*/
+    NULL,		        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_bogus_debug         	/*debug the message             */
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_bogus_decode
+ *
+ * Purpose:     Decode a "bogus" message and return a pointer to a new
+ *              native message struct.
+ *
+ * Return:      Success:        Ptr to new message in native struct.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Jan 21 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_bogus_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_bogus_t *mesg = NULL;
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Allocate the bogus message */
+    if(NULL == (mesg = (H5O_bogus_t *)H5MM_calloc(sizeof(H5O_bogus_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* decode */
+    UINT32DECODE(p, mesg->u);
+
+    /* Validate the bogus info */
+    if(mesg->u != H5O_BOGUS_VALUE)
+	HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "invalid bogus value :-)")
+
+    /* Set return value */
+    ret_value = mesg;
+
+done:
+    if(ret_value == NULL && mesg != NULL)
+        H5MM_xfree(mesg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_bogus_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_bogus_encode
+ *
+ * Purpose:     Encodes a "bogus" message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Jan 21 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_bogus_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void H5_ATTR_UNUSED *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
+
+    /* encode */
+    UINT32ENCODE(p, H5O_BOGUS_VALUE);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_bogus_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_bogus_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not
+ *              counting the message typ or size fields, but only the data
+ *              fields.  This function doesn't take into account
+ *              alignment.
+ *
+ * Return:      Success:        Message data size in bytes w/o alignment.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Jan 21 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_bogus_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(4)
+} /* end H5O_bogus_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_bogus_debug
+ *
+ * Purpose:     Prints debugging info for the message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Jan 21 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_bogus_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+	       int indent, int fwidth)
+{
+    const H5O_bogus_t	*mesg = (const H5O_bogus_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s `%u'\n", indent, "", fwidth,
+            "Bogus Value:", mesg->u);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_bogus_debug() */
+#endif /* H5O_ENABLE_BOGUS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Obtreek.c b/gatb-core/thirdparty/hdf5/src/H5Obtreek.c
new file mode 100644
index 0000000..802f23a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Obtreek.c
@@ -0,0 +1,258 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Thursday, March  1, 2007
+ *
+ * Purpose:	A message holding non-default v1 B-tree 'K' value
+ *              information in the superblock extension.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+static void  *H5O_btreek_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_btreek_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void  *H5O_btreek_copy(const void *_mesg, void *_dest);
+static size_t H5O_btreek_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_btreek_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_BTREEK[1] = {{
+    H5O_BTREEK_ID,              /*message id number                     */
+    "v1 B-tree 'K' values",     /*message name for debugging            */
+    sizeof(H5O_btreek_t),	/*native message size                   */
+    0,				/* messages are sharable?       */
+    H5O_btreek_decode,		/*decode message                        */
+    H5O_btreek_encode,		/*encode message                        */
+    H5O_btreek_copy,            /*copy the native value                 */
+    H5O_btreek_size,		/*raw message size			*/
+    NULL,                       /*free internal memory			*/
+    NULL,                       /* free method				*/
+    NULL,			/* file delete method			*/
+    NULL,			/* link method				*/
+    NULL,			/*set share method		        */
+    NULL,		    	/*can share method		        */
+    NULL,			/* pre copy native value to file	*/
+    NULL,			/* copy native value to file		*/
+    NULL,			/* post copy native value to file	*/
+    NULL,			/* get creation index		        */
+    NULL,			/* set creation index		        */
+    H5O_btreek_debug            /*debug the message			*/
+}};
+
+/* Current version of v1 B-tree 'K' value information */
+#define H5O_BTREEK_VERSION 	0
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_btreek_decode
+ *
+ * Purpose:	Decode a shared message table message and return a pointer
+ *              to a newly allocated H5O_btreek_t struct.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_btreek_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_btreek_t	*mesg;          /* Native message */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_BTREEK_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (mesg = (H5O_btreek_t *)H5MM_calloc(sizeof(H5O_btreek_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for v1 B-tree 'K' message")
+
+    /* Retrieve non-default B-tree 'K' values */
+    UINT16DECODE(p, mesg->btree_k[H5B_CHUNK_ID]);
+    UINT16DECODE(p, mesg->btree_k[H5B_SNODE_ID]);
+    UINT16DECODE(p, mesg->sym_leaf_k);
+
+    /* Set return value */
+    ret_value = (void *)mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_btreek_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_btreek_encode
+ *
+ * Purpose:	Encode a v1 B-tree 'K' value message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_btreek_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_btreek_t *mesg = (const H5O_btreek_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
+
+    /* Store version and non-default v1 B-tree 'K' values */
+    *p++ = H5O_BTREEK_VERSION;
+    UINT16ENCODE(p, mesg->btree_k[H5B_CHUNK_ID]);
+    UINT16ENCODE(p, mesg->btree_k[H5B_SNODE_ID]);
+    UINT16ENCODE(p, mesg->sym_leaf_k);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_btreek_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_btreek_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_btreek_copy(const void *_mesg, void *_dest)
+{
+    const H5O_btreek_t	*mesg = (const H5O_btreek_t *)_mesg;
+    H5O_btreek_t	*dest = (H5O_btreek_t *)_dest;
+    void		*ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(mesg);
+
+    if(!dest && NULL == (dest = (H5O_btreek_t *)H5MM_malloc(sizeof(H5O_btreek_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message")
+
+    /* All this message requires is a shallow copy */
+    *dest = *mesg;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_btreek_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_btreek_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not counting the
+ *		message type or size fields, but only the data fields.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *		Failure:	0
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_btreek_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t                   ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+
+    ret_value = 1 +             /* Version number */
+		2 +             /* Chunked storage internal B-tree 'K' value */
+		2 +             /* Symbol table node internal B-tree 'K' value */
+		2;              /* Symbol table node leaf 'K' value */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_btreek_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_btreek_debug
+ *
+ * Purpose:	Prints debugging info for the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_btreek_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+    int indent, int fwidth)
+{
+    const H5O_btreek_t *mesg = (const H5O_btreek_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Chunked storage internal B-tree 'K' value:", mesg->btree_k[H5B_CHUNK_ID]);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Symbol table node internal B-tree 'K' value:", mesg->btree_k[H5B_SNODE_ID]);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Symbol table node leaf 'K' value:", mesg->sym_leaf_k);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_btreek_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ocache.c b/gatb-core/thirdparty/hdf5/src/H5Ocache.c
new file mode 100644
index 0000000..2aaf933
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ocache.c
@@ -0,0 +1,1457 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Ocache.c
+ *			Sep 28 2005
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Object header metadata cache virtual functions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Set the object header size to speculatively read in */
+/* (needs to be more than the object header prefix size to work at all and
+ *      should be larger than the largest object type's default object header
+ *      size to save the extra I/O operations) */
+#define H5O_SPEC_READ_SIZE 512
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache callbacks */
+static H5O_t *H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5O_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5O_t *oh, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5O_dest(H5F_t *f, H5O_t *oh);
+static herr_t H5O_clear(H5F_t *f, H5O_t *oh, hbool_t destroy);
+static herr_t H5O_size(const H5F_t *f, const H5O_t *oh, size_t *size_ptr);
+
+static H5O_chunk_proxy_t *H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5O_cache_chk_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5O_chunk_proxy_t *chk_proxy, unsigned H5_ATTR_UNUSED * flags_ptr);
+static herr_t H5O_cache_chk_dest(H5F_t *f, H5O_chunk_proxy_t *chk_proxy);
+static herr_t H5O_cache_chk_clear(H5F_t *f, H5O_chunk_proxy_t *chk_proxy, hbool_t destroy);
+static herr_t H5O_cache_chk_size(const H5F_t *f, const H5O_chunk_proxy_t *chk_proxy, size_t *size_ptr);
+
+/* Chunk proxy routines */
+static herr_t H5O_chunk_proxy_dest(H5O_chunk_proxy_t *chunk_proxy);
+
+/* Chunk routines */
+static herr_t H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len,
+    const uint8_t *image, H5O_common_cache_ud_t *udata, hbool_t *dirty);
+static herr_t H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno);
+
+/* Misc. routines */
+static herr_t H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info,
+    const H5O_cont_t *cont);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5O object header prefix inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_OHDR[1] = {{
+    H5AC_OHDR_ID,
+    (H5AC_load_func_t)H5O_load,
+    (H5AC_flush_func_t)H5O_flush,
+    (H5AC_dest_func_t)H5O_dest,
+    (H5AC_clear_func_t)H5O_clear,
+    (H5AC_size_func_t)H5O_size,
+}};
+
+/* H5O object header chunk inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_OHDR_CHK[1] = {{
+    H5AC_OHDR_CHK_ID,
+    (H5AC_load_func_t)H5O_cache_chk_load,
+    (H5AC_flush_func_t)H5O_cache_chk_flush,
+    (H5AC_dest_func_t)H5O_cache_chk_dest,
+    (H5AC_clear_func_t)H5O_cache_chk_clear,
+    (H5AC_size_func_t)H5O_cache_chk_size,
+}};
+
+/* Declare external the free list for H5O_unknown_t's */
+H5FL_EXTERN(H5O_unknown_t);
+
+/* Declare extern the free list for H5O_chunk_proxy_t's */
+H5FL_EXTERN(H5O_chunk_proxy_t);
+
+/* Declare the free list for H5O_cont_t sequences */
+H5FL_SEQ_DEFINE(H5O_cont_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_load
+ *
+ * Purpose:	Loads an object header from disk.
+ *
+ * Return:	Success:	Pointer to the new object header.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  5 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_t *
+H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5O_t	*oh = NULL;     /* Object header read in */
+    H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;       /* User data for callback */
+    H5WB_t      *wb = NULL;     /* Wrapped buffer for prefix data */
+    uint8_t     read_buf[H5O_SPEC_READ_SIZE];       /* Buffer for speculative read */
+    const uint8_t *p;           /* Pointer into buffer to decode */
+    uint8_t     *buf;           /* Buffer to decode */
+    size_t	spec_read_size; /* Size of buffer to speculatively read in */
+    size_t	prefix_size;    /* Size of object header prefix */
+    size_t	buf_size;       /* Size of prefix+chunk #0 buffer */
+    haddr_t     eoa;		/* Relative end of file address	*/
+    H5O_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+    HDassert(udata->common.f);
+    HDassert(udata->common.cont_msg_info);
+
+    /* Make certain we don't speculatively read off the end of the file */
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_OHDR)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to determine file size")
+
+    /* Compute the size of the speculative object header buffer */
+    H5_CHECKED_ASSIGN(spec_read_size, size_t, MIN(eoa - addr, H5O_SPEC_READ_SIZE), hsize_t);
+
+    /* Attempt to speculatively read both object header prefix and first chunk */
+    if(H5F_block_read(f, H5FD_MEM_OHDR, addr, spec_read_size, dxpl_id, read_buf) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header")
+    p = read_buf;
+
+    /* Allocate space for the object header data structure */
+    if(NULL == (oh = H5FL_CALLOC(H5O_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* File-specific, non-stored information */
+    oh->sizeof_size = H5F_SIZEOF_SIZE(udata->common.f);
+    oh->sizeof_addr = H5F_SIZEOF_ADDR(udata->common.f);
+
+    /* Check for presence of magic number */
+    /* (indicates version 2 or later) */
+    if(!HDmemcmp(p, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /* Magic number */
+        p += H5_SIZEOF_MAGIC;
+
+        /* Version */
+        oh->version = *p++;
+        if(H5O_VERSION_2 != oh->version)
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "bad object header version number")
+
+        /* Flags */
+        oh->flags = *p++;
+        if(oh->flags & ~H5O_HDR_ALL_FLAGS)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "unknown object header status flag(s)")
+
+        /* Number of links to object (unless overridden by refcount message) */
+        oh->nlink = 1;
+
+        /* Time fields */
+        if(oh->flags & H5O_HDR_STORE_TIMES) {
+            uint32_t tmp;       /* Temporary value */
+
+            UINT32DECODE(p, tmp);
+            oh->atime = (time_t)tmp;
+            UINT32DECODE(p, tmp);
+            oh->mtime = (time_t)tmp;
+            UINT32DECODE(p, tmp);
+            oh->ctime = (time_t)tmp;
+            UINT32DECODE(p, tmp);
+            oh->btime = (time_t)tmp;
+        } /* end if */
+        else
+            oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+
+        /* Attribute fields */
+        if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
+            UINT16DECODE(p, oh->max_compact);
+            UINT16DECODE(p, oh->min_dense);
+            if(oh->max_compact < oh->min_dense)
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header attribute phase change values")
+        } /* end if */
+        else {
+            oh->max_compact = H5O_CRT_ATTR_MAX_COMPACT_DEF;
+            oh->min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF;
+        } /* end else */
+
+        /* First chunk size */
+        switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
+            case 0:     /* 1 byte size */
+                oh->chunk0_size = *p++;
+                break;
+
+            case 1:     /* 2 byte size */
+                UINT16DECODE(p, oh->chunk0_size);
+                break;
+
+            case 2:     /* 4 byte size */
+                UINT32DECODE(p, oh->chunk0_size);
+                break;
+
+            case 3:     /* 8 byte size */
+                UINT64DECODE(p, oh->chunk0_size);
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad size for chunk 0")
+        } /* end switch */
+        if(oh->chunk0_size > 0 && oh->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh))
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header chunk size")
+    } /* end if */
+    else {
+        /* Version */
+        oh->version = *p++;
+        if(H5O_VERSION_1 != oh->version)
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "bad object header version number")
+
+        /* Flags */
+        oh->flags = H5O_CRT_OHDR_FLAGS_DEF;
+
+        /* Reserved */
+        p++;
+
+        /* Number of messages */
+        UINT16DECODE(p, udata->v1_pfx_nmesgs);
+
+        /* Link count */
+        UINT32DECODE(p, oh->nlink);
+
+        /* Reset unused time fields */
+        oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+
+        /* Reset unused attribute fields */
+        oh->max_compact = 0;
+        oh->min_dense = 0;
+
+        /* First chunk size */
+        UINT32DECODE(p, oh->chunk0_size);
+        if((udata->v1_pfx_nmesgs > 0 && oh->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh)) ||
+                (udata->v1_pfx_nmesgs == 0 && oh->chunk0_size > 0))
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header chunk size")
+
+        /* Reserved, in version 1 (for 8-byte alignment padding) */
+        p += 4;
+    } /* end else */
+
+    /* Determine object header prefix length */
+    prefix_size = (size_t)(p - (const uint8_t *)read_buf);
+    HDassert((size_t)prefix_size == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+
+    /* Compute the size of the buffer used */
+    buf_size = oh->chunk0_size + (size_t)H5O_SIZEOF_HDR(oh);
+
+    /* Check if the speculative read was large enough to parse the first chunk */
+    if(spec_read_size < buf_size) {
+        /* Wrap the local buffer for serialized header info */
+        if(NULL == (wb = H5WB_wrap(read_buf, sizeof(read_buf))))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for serialized header */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, buf_size)))
+            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+        /* Copy existing raw data into new buffer */
+        HDmemcpy(buf, read_buf, spec_read_size);
+
+        /* Read rest of the raw data */
+        if(H5F_block_read(f, H5FD_MEM_OHDR, (addr + spec_read_size), (buf_size - spec_read_size), dxpl_id, (buf + spec_read_size)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header data")
+    } /* end if */
+    else
+        buf = read_buf;
+
+    /* Parse the first chunk */
+    if(H5O_chunk_deserialize(oh, udata->common.addr, oh->chunk0_size, buf, &(udata->common), &oh->cache_info.is_dirty) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize first object header chunk")
+
+    /* Note that we've loaded the object header from the file */
+    udata->made_attempt = TRUE;
+
+    /* Set return value */
+    ret_value = oh;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+
+    /* Release the [possibly partially initialized] object header on errors */
+    if(!ret_value && oh)
+        if(H5O_free(oh) < 0)
+	    HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header data")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_flush
+ *
+ * Purpose:	Flushes (and destroys) an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  5 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t H5_ATTR_UNUSED addr, H5O_t *oh, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(oh);
+
+    /* flush */
+    if(oh->cache_info.is_dirty) {
+        uint8_t	*p;             /* Pointer to object header prefix buffer */
+
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
+
+        /* Point to raw data 'image' for first chunk, which has room for the prefix */
+        p = oh->chunk[0].image;
+
+        /* Later versions of object header prefix have different format and
+         * also require that chunk 0 always be updated, since the checksum
+         * on the entire block of memory needs to be updated if anything is
+         * modified */
+        if(oh->version > H5O_VERSION_1) {
+            uint64_t chunk0_size;       /* Size of chunk 0's data */
+
+            HDassert(oh->chunk[0].size >= (size_t)H5O_SIZEOF_HDR(oh));
+            chunk0_size = oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh);
+
+            /* Verify magic number */
+            HDassert(!HDmemcmp(p, H5O_HDR_MAGIC, H5_SIZEOF_MAGIC));
+            p += H5_SIZEOF_MAGIC;
+
+            /* Version */
+            *p++ = oh->version;
+
+            /* Flags */
+            *p++ = oh->flags;
+
+            /* Time fields */
+            if(oh->flags & H5O_HDR_STORE_TIMES) {
+                UINT32ENCODE(p, oh->atime);
+                UINT32ENCODE(p, oh->mtime);
+                UINT32ENCODE(p, oh->ctime);
+                UINT32ENCODE(p, oh->btime);
+            } /* end if */
+
+            /* Attribute fields */
+            if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
+                UINT16ENCODE(p, oh->max_compact);
+                UINT16ENCODE(p, oh->min_dense);
+            } /* end if */
+
+            /* First chunk size */
+            switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
+                case 0:     /* 1 byte size */
+                    HDassert(chunk0_size < 256);
+                    *p++ = (uint8_t)chunk0_size;
+                    break;
+
+                case 1:     /* 2 byte size */
+                    HDassert(chunk0_size < 65536);
+                    UINT16ENCODE(p, chunk0_size);
+                    break;
+
+                case 2:     /* 4 byte size */
+		    /* use <= 2**32 -1 to stay within 4 bytes integer range */
+                    HDassert(chunk0_size <= 4294967295UL);
+                    UINT32ENCODE(p, chunk0_size);
+                    break;
+
+                case 3:     /* 8 byte size */
+                    UINT64ENCODE(p, chunk0_size);
+                    break;
+
+                default:
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad size for chunk 0")
+            } /* end switch */
+        } /* end if */
+        else {
+            /* Version */
+            *p++ = oh->version;
+
+            /* Reserved */
+            *p++ = 0;
+
+            /* Number of messages */
+#ifdef H5O_ENABLE_BAD_MESG_COUNT
+            if(oh->store_bad_mesg_count)
+                UINT16ENCODE(p, (oh->nmesgs - 1))
+            else
+#endif /* H5O_ENABLE_BAD_MESG_COUNT */
+                UINT16ENCODE(p, oh->nmesgs);
+
+            /* Link count */
+            UINT32ENCODE(p, oh->nlink);
+
+            /* First chunk size */
+            UINT32ENCODE(p, (oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh)));
+
+            /* Zero to alignment */
+            HDmemset(p, 0, (size_t)(H5O_SIZEOF_HDR(oh) - 12));
+            p += (size_t)(H5O_SIZEOF_HDR(oh) - 12);
+        } /* end else */
+        HDassert((size_t)(p - oh->chunk[0].image) == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+
+        /* Serialize messages for this chunk */
+        if(H5O_chunk_serialize(f, oh, (unsigned)0) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize first object header chunk")
+
+        /* Write the chunk out */
+        HDassert(H5F_addr_defined(oh->chunk[0].addr));
+        if(H5F_block_write(f, H5FD_MEM_OHDR, oh->chunk[0].addr, oh->chunk[0].size, dxpl_id, oh->chunk[0].image) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header chunk to disk")
+
+        /* Mark object header as clean now */
+	oh->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    /* Destroy the object header, if requested */
+    if(destroy)
+        if(H5O_dest(f, oh) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dest
+ *
+ * Purpose:	Destroys an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan 15 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dest(H5F_t *f, H5O_t *oh)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(oh->rc == 0);
+
+    /* Verify that node is clean */
+    HDassert(!oh->cache_info.is_dirty);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!oh->cache_info.free_file_space_on_destroy || H5F_addr_defined(oh->cache_info.addr));
+
+    /* Check for releasing file space for object header */
+    if(oh->chunk && oh->cache_info.free_file_space_on_destroy) {
+        /* Free main (first) object header "chunk" */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_dxpl_id, oh->chunk[0].addr, (hsize_t)oh->chunk[0].size) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header")
+    } /* end if */
+
+    /* Destroy object header */
+    if(H5O_free(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't destroy object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_clear
+ *
+ * Purpose:	Mark a object header in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar 20 2003
+ *
+ * Changes:	In the parallel case, there is the possibility that the 
+ *		the object header may be flushed by different processes
+ *		over the life of the computation.  Thus we must ensure
+ *		that the chunk images are up to date before we mark the
+ *		messages clean -- as otherwise we may overwrite valid
+ *		data with a blank section of a chunk image.
+ *
+ *		To deal with this, I have added code to call 
+ *		H5O_chunk_serialize() for all chunks before we 
+ *		mark all messages as clean if we are not destroying the 
+ *		object.  Do this in the parallel case only, as the problem 
+ *		can only occur in this context.
+ *
+ *						JRM -- 10/12/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_clear(H5F_t *f, H5O_t *oh, hbool_t destroy)
+{
+    unsigned	u;      /* Local index variable */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+
+#ifdef H5_HAVE_PARALLEL
+    if ( ( oh->cache_info.is_dirty ) && ( ! destroy ) ) {
+
+	size_t i;
+
+        /* scan through all chunks associated with the object header,
+	 * and cause them to update their images for all entries currently
+ 	 * marked dirty.  Must do this in the parallel case, as it is possible
+	 * that this processor may clear this object header several times
+	 * before flushing it -- thus causing undefined sections of the image
+	 * to be written to disk overwriting valid data.
+         */
+
+	for ( i = 0; i < oh->nchunks; i++ ) {
+
+            if ( H5O_chunk_serialize(f, oh, i) < 0 ) {
+
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, 
+			    "unable to serialize object header chunk")
+	    }
+        }
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Mark messages as clean */
+    for(u = 0; u < oh->nmesgs; u++)
+        oh->mesg[u].dirty = FALSE;
+
+#ifndef NDEBUG
+    /* Reset the number of messages dirtied by decoding */
+    oh->ndecode_dirtied = 0;
+#endif /* NDEBUG */
+
+    /* Mark whole header as clean */
+    oh->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5O_dest(f, oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_size
+ *
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *              H5O_t on disk, and return it in *len_ptr.  On failure,
+ *              the value of *len_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/13/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_size(const H5F_t H5_ATTR_UNUSED *f, const H5O_t *oh, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(oh);
+    HDassert(size_ptr);
+
+    /* Report the object header's prefix+first chunk length */
+    if(oh->chunk0_size)
+       *size_ptr = (size_t)H5O_SIZEOF_HDR(oh) + oh->chunk0_size;
+    else
+       *size_ptr = oh->chunk[0].size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cache_chk_load
+ *
+ * Purpose:	Loads an object header continuation chunk from disk.
+ *
+ * Return:	Success:	Pointer to the new object header chunk proxy.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_chunk_proxy_t *
+H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5O_chunk_proxy_t	*chk_proxy = NULL;     /* Chunk proxy object */
+    H5O_chk_cache_ud_t *udata = (H5O_chk_cache_ud_t *)_udata;       /* User data for callback */
+    H5WB_t      *wb = NULL;             /* Wrapped buffer for prefix data */
+    uint8_t     chunk_buf[H5O_SPEC_READ_SIZE];       /* Buffer for speculative read */
+    uint8_t     *buf;                   /* Buffer to decode */
+    H5O_chunk_proxy_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(udata);
+    HDassert(udata->oh);
+
+    /* Allocate space for the object header data structure */
+    if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Wrap the local buffer for serialized header info */
+    if(NULL == (wb = H5WB_wrap(chunk_buf, sizeof(chunk_buf))))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for serialized header */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, udata->size)))
+        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read rest of the raw data */
+    if(H5F_block_read(f, H5FD_MEM_OHDR, addr, udata->size, dxpl_id, buf) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header continuation chunk")
+
+    /* Check if we are still decoding the object header */
+    /* (as opposed to bringing a piece of it back from the file) */
+    if(udata->decoding) {
+        /* Sanity check */
+        HDassert(udata->common.f);
+        HDassert(udata->common.cont_msg_info);
+
+        /* Parse the chunk */
+        if(H5O_chunk_deserialize(udata->oh, udata->common.addr, udata->size, buf, &(udata->common), &chk_proxy->cache_info.is_dirty) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize object header chunk")
+
+        /* Set the fields for the chunk proxy */
+        chk_proxy->oh = udata->oh;
+        chk_proxy->chunkno = udata->oh->nchunks - 1;
+    } /* end if */
+    else {
+        /* Sanity check */
+        HDassert(udata->chunkno < udata->oh->nchunks);
+
+        /* Set the fields for the chunk proxy */
+        chk_proxy->oh = udata->oh;
+        chk_proxy->chunkno = udata->chunkno;
+
+        /* Sanity check that the chunk representation we have in memory is the same
+         *      as the one being brought in from disk.
+         */
+        HDassert(0 == HDmemcmp(buf, chk_proxy->oh->chunk[chk_proxy->chunkno].image, chk_proxy->oh->chunk[chk_proxy->chunkno].size));
+    } /* end else */
+
+    /* Increment reference count of object header */
+    if(H5O_inc_rc(udata->oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, NULL, "can't increment reference count on object header")
+
+    /* Set return value */
+    ret_value = chk_proxy;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+
+    /* Release the [possibly partially initialized] object header on errors */
+    if(!ret_value && chk_proxy)
+        if(H5O_chunk_proxy_dest(chk_proxy) < 0)
+	    HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header chunk proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cache_chk_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cache_chk_flush
+ *
+ * Purpose:	Flushes (and destroys) an object header continuation chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cache_chk_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
+    H5O_chunk_proxy_t *chk_proxy, unsigned H5_ATTR_UNUSED * flags_ptr)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* flush */
+    if(chk_proxy->cache_info.is_dirty) {
+        /* Serialize messages for this chunk */
+        if(H5O_chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize object header continuation chunk")
+
+        /* Write the chunk out */
+        HDassert(H5F_addr_defined(chk_proxy->oh->chunk[chk_proxy->chunkno].addr));
+        HDassert(H5F_addr_eq(addr, chk_proxy->oh->chunk[chk_proxy->chunkno].addr));
+        if(H5F_block_write(f, H5FD_MEM_OHDR, addr, chk_proxy->oh->chunk[chk_proxy->chunkno].size, dxpl_id, chk_proxy->oh->chunk[chk_proxy->chunkno].image) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header continuation chunk to disk")
+
+        /* Mark object header as clean now */
+	chk_proxy->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    /* Destroy the object header, if requested */
+    if(destroy)
+        if(H5O_cache_chk_dest(f, chk_proxy) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header continuation chunk data")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cache_chk_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cache_chk_dest
+ *
+ * Purpose:	Destroys an object header continuation chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cache_chk_dest(H5F_t *f, H5O_chunk_proxy_t *chk_proxy)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(chk_proxy);
+    HDassert(chk_proxy->chunkno > 0);
+
+    /* Verify that node is clean */
+    HDassert(chk_proxy->cache_info.is_dirty == FALSE);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!chk_proxy->cache_info.free_file_space_on_destroy || H5F_addr_defined(chk_proxy->cache_info.addr));
+
+    /* Check for releasing file space for object header */
+    if(chk_proxy->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_dxpl_id, chk_proxy->oh->chunk[chk_proxy->chunkno].addr, (hsize_t)chk_proxy->oh->chunk[chk_proxy->chunkno].size) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header continuation chunk")
+    } /* end if */
+
+    /* Destroy object header chunk proxy */
+    if(H5O_chunk_proxy_dest(chk_proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header chunk proxy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cache_chk_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cache_chk_clear
+ *
+ * Purpose:	Mark a object header continuation chunk in memory as non-dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ * Changes:	In the parallel case, there is the possibility that the 
+ *		the object header chunk may be flushed by different 
+ *		processes over the life of the computation.  Thus we must 
+ *		ensure that the chunk image is up to date before we mark its
+ *		messages clean -- as otherwise we may overwrite valid
+ *		data with a blank section of a chunk image.
+ *
+ *		To deal with this, I have added code to call 
+ *		H5O_chunk_serialize() for this chunk before we 
+ *		mark all messages as clean if we are not destroying the 
+ *		chunk.
+ *
+ *		Do this in the parallel case only, as the problem 
+ *		can only occur in this context.
+ *
+ *		Note that at present at least, it seems that this fix
+ *		is not necessary, as we don't seem to be able to 
+ *		generate a dirty chunk without creating a dirty object
+ *		header.  However, the object header code will be changing
+ *		a lot in the near future, so I'll leave this fix in 
+ *		for now, unless Quincey requests otherwise.
+ *
+ *						JRM -- 10/12/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cache_chk_clear(H5F_t *f, H5O_chunk_proxy_t *chk_proxy, hbool_t destroy)
+{
+    unsigned	u;      /* Local index variable */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(chk_proxy);
+
+#ifdef H5_HAVE_PARALLEL
+    if ( ( chk_proxy->oh->cache_info.is_dirty ) && ( ! destroy ) ) {
+
+        if ( H5O_chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0 ) {
+
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, 
+                       "unable to serialize object header chunk")
+        }
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Mark messages in chunk as clean */
+    for(u = 0; u < chk_proxy->oh->nmesgs; u++)
+        if(chk_proxy->oh->mesg[u].chunkno == chk_proxy->chunkno)
+            chk_proxy->oh->mesg[u].dirty = FALSE;
+
+    /* Mark as clean */
+    chk_proxy->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5O_cache_chk_dest(f, chk_proxy) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header continuation chunk data")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cache_chk_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cache_chk_size
+ *
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *              an object header continuation chunk on disk, and return it in
+ *              *len_ptr.  On failure, the value of *len_ptr is undefined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cache_chk_size(const H5F_t H5_ATTR_UNUSED *f, const H5O_chunk_proxy_t *chk_proxy, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(chk_proxy);
+    HDassert(size_ptr);
+
+    /* Report the object header continuation chunk's length */
+    *size_ptr = chk_proxy->oh->chunk[chk_proxy->chunkno].size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O_cache_chk_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_add_cont_msg
+ *
+ * Purpose:	Add information from a continuation message to the list of
+ *              continuation messages in the object header
+ *
+ * Return:	Success: SUCCEED
+ *              Failure: FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info, const H5O_cont_t *cont)
+{
+    size_t contno;              /* Continuation message index */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(cont_msg_info);
+    HDassert(cont);
+
+    /* Increase chunk array size, if necessary */
+    if(cont_msg_info->nmsgs >= cont_msg_info->alloc_nmsgs) {
+        size_t na = MAX(H5O_NCHUNKS, cont_msg_info->alloc_nmsgs * 2);        /* Double # of messages allocated */
+        H5O_cont_t *x;
+
+        if(NULL == (x = H5FL_SEQ_REALLOC(H5O_cont_t, cont_msg_info->msgs, na)))
+            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "memory allocation failed")
+        cont_msg_info->alloc_nmsgs = na;
+        cont_msg_info->msgs = x;
+    } /* end if */
+
+    /* Init the continuation message info */
+    contno = cont_msg_info->nmsgs++;
+    cont_msg_info->msgs[contno].addr = cont->addr;
+    cont_msg_info->msgs[contno].size = cont->size;
+    cont_msg_info->msgs[contno].chunkno = cont->chunkno;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_add_cont_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_deserialize
+ *
+ * Purpose:	Deserialize a chunk for an object header
+ *
+ * Return:	Success: SUCCEED
+ *              Failure: FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
+    H5O_common_cache_ud_t *udata, hbool_t *dirty)
+{
+    const uint8_t *p;           /* Pointer into buffer to decode */
+    uint8_t *eom_ptr;           /* Pointer to end of messages for a chunk */
+    size_t curmesg;             /* Current message being decoded in object header */
+    unsigned merged_null_msgs = 0;  /* Number of null messages merged together */
+    unsigned chunkno;           /* Current chunk's index */
+#ifndef NDEBUG
+    unsigned nullcnt;           /* Count of null messages (for sanity checking gaps in chunks) */
+#endif /* NDEBUG */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(oh);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
+    HDassert(udata->f);
+    HDassert(udata->cont_msg_info);
+
+    /* Increase chunk array size, if necessary */
+    if(oh->nchunks >= oh->alloc_nchunks) {
+        size_t na = MAX(H5O_NCHUNKS, oh->alloc_nchunks * 2);        /* Double # of chunks allocated */
+        H5O_chunk_t *x;
+
+        if(NULL == (x = H5FL_SEQ_REALLOC(H5O_chunk_t, oh->chunk, na)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        oh->alloc_nchunks = na;
+        oh->chunk = x;
+    } /* end if */
+
+    /* Init the chunk data info */
+    chunkno = oh->nchunks++;
+    oh->chunk[chunkno].gap = 0;
+    if(chunkno == 0) {
+        /* First chunk's 'image' includes room for the object header prefix */
+        oh->chunk[0].addr = addr;
+        oh->chunk[0].size = len + (size_t)H5O_SIZEOF_HDR(oh);
+    } /* end if */
+    else {
+        oh->chunk[chunkno].addr = addr;
+        oh->chunk[chunkno].size = len;
+    } /* end else */
+    if(NULL == (oh->chunk[chunkno].image = H5FL_BLK_MALLOC(chunk_image, oh->chunk[chunkno].size)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+    /* Copy disk image into chunk's image */
+    HDmemcpy(oh->chunk[chunkno].image, image, oh->chunk[chunkno].size);
+
+    /* Point into chunk image to decode */
+    p = oh->chunk[chunkno].image;
+
+    /* Handle chunk 0 as special case */
+    if(chunkno == 0)
+        /* Skip over [already decoded] prefix */
+        p += (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh));
+    /* Check for magic # on chunks > 0 in later versions of the format */
+    else if(chunkno > 0 && oh->version > H5O_VERSION_1) {
+        /* Magic number */
+        if(HDmemcmp(p, H5O_CHK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "wrong object header chunk signature")
+        p += H5_SIZEOF_MAGIC;
+    } /* end if */
+
+    /* Save # of messages already inspected */
+    curmesg = oh->nmesgs;
+
+    /* Decode messages from this chunk */
+    eom_ptr = oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM_OH(oh));
+#ifndef NDEBUG
+    nullcnt = 0;
+#endif /* NDEBUG */
+    while(p < eom_ptr) {
+        size_t mesgno;          /* Current message to operate on */
+        size_t mesg_size;       /* Size of message read in */
+        unsigned id;            /* ID (type) of current message */
+        uint8_t	flags;          /* Flags for current message */
+        H5O_msg_crt_idx_t crt_idx = 0;  /* Creation index for current message */
+
+        /* Decode message prefix info */
+
+        /* Version # */
+        if(oh->version == H5O_VERSION_1)
+            UINT16DECODE(p, id)
+        else
+            id = *p++;
+
+        /* Check for unknown message ID getting encoded in file */
+        if(id == H5O_UNKNOWN_ID)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "'unknown' message ID encoded in file?!?")
+
+        /* Message size */
+        UINT16DECODE(p, mesg_size);
+        HDassert(mesg_size == H5O_ALIGN_OH(oh, mesg_size));
+
+        /* Message flags */
+        flags = *p++;
+        if(flags & ~H5O_MSG_FLAG_BITS)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unknown flag for message")
+        if((flags & H5O_MSG_FLAG_SHARED) && (flags & H5O_MSG_FLAG_DONTSHARE))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "bad flag combination for message")
+        if((flags & H5O_MSG_FLAG_WAS_UNKNOWN) && (flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "bad flag combination for message")
+        if((flags & H5O_MSG_FLAG_WAS_UNKNOWN) && !(flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "bad flag combination for message")
+        if((flags & H5O_MSG_FLAG_SHAREABLE)
+                && H5O_msg_class_g[id]
+                && !(H5O_msg_class_g[id]->share_flags & H5O_SHARE_IS_SHARABLE))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "message of unsharable class flagged as sharable")
+
+        /* Reserved bytes/creation index */
+        if(oh->version == H5O_VERSION_1)
+            p += 3; /*reserved*/
+        else {
+            /* Only decode creation index if they are being tracked */
+            if(oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)
+                UINT16DECODE(p, crt_idx);
+        } /* end else */
+
+        /* Try to detect invalidly formatted object header message that
+         *  extends past end of chunk.
+         */
+        if(p + mesg_size > eom_ptr)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "corrupt object header")
+
+#ifndef NDEBUG
+        /* Increment count of null messages */
+        if(H5O_NULL_ID == id)
+            nullcnt++;
+#endif /* NDEBUG */
+
+        /* Check for combining two adjacent 'null' messages */
+        if((udata->file_intent & H5F_ACC_RDWR) &&
+                H5O_NULL_ID == id && oh->nmesgs > 0 &&
+                H5O_NULL_ID == oh->mesg[oh->nmesgs - 1].type->id &&
+                oh->mesg[oh->nmesgs - 1].chunkno == chunkno) {
+
+            /* Combine adjacent null messages */
+            mesgno = oh->nmesgs - 1;
+            oh->mesg[mesgno].raw_size += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + mesg_size;
+            oh->mesg[mesgno].dirty = TRUE;
+            merged_null_msgs++;
+            udata->merged_null_msgs++;
+        } /* end if */
+        else {
+            /* Check if we need to extend message table to hold the new message */
+            if(oh->nmesgs >= oh->alloc_nmesgs)
+                if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate more space for messages")
+
+            /* Get index for message */
+            mesgno = oh->nmesgs++;
+
+            /* Initialize information about message */
+            oh->mesg[mesgno].dirty = FALSE;
+            oh->mesg[mesgno].flags = flags;
+            oh->mesg[mesgno].crt_idx = crt_idx;
+            oh->mesg[mesgno].native = NULL;
+            oh->mesg[mesgno].raw = (uint8_t *)p;        /* Casting away const OK - QAK */
+            oh->mesg[mesgno].raw_size = mesg_size;
+            oh->mesg[mesgno].chunkno = chunkno;
+
+            /* Point unknown messages at 'unknown' message class */
+            /* (Usually from future versions of the library) */
+            if(id >= NELMTS(H5O_msg_class_g) || NULL == H5O_msg_class_g[id]) {
+                H5O_unknown_t *unknown;     /* Pointer to "unknown" message info */
+
+                /* Allocate "unknown" message info */
+                if(NULL == (unknown = H5FL_MALLOC(H5O_unknown_t)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+                /* Save the original message type ID */
+                *unknown = id;
+
+                /* Save 'native' form of unknown message */
+                oh->mesg[mesgno].native = unknown;
+
+                /* Set message to "unknown" class */
+                oh->mesg[mesgno].type = H5O_msg_class_g[H5O_UNKNOWN_ID];
+
+                /* Check for "fail if unknown" message flag */
+                if((udata->file_intent & H5F_ACC_RDWR) && 
+                   (flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE))
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unknown message with 'fail if unknown' flag found")
+                /* Check for "mark if unknown" message flag, etc. */
+                else if((flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN) &&
+                        !(flags & H5O_MSG_FLAG_WAS_UNKNOWN) &&
+                        (udata->file_intent & H5F_ACC_RDWR)) {
+
+                    /* Mark the message as "unknown" */
+                    /* This is a bit aggressive, since the application may
+                     * never change anything about the object (metadata or
+                     * raw data), but we can sort out the finer details
+                     * when/if we start using the flag - QAK
+                     */
+                    /* Also, it's possible that this functionality may not
+                     * get invoked if the object header is brought into
+                     * the metadata cache in some other "weird" way, like
+                     * using H5Ocopy() - QAK
+                     */
+                    oh->mesg[mesgno].flags |= H5O_MSG_FLAG_WAS_UNKNOWN;
+
+                    /* Mark the message and chunk as dirty */
+                    oh->mesg[mesgno].dirty = TRUE;
+                    udata->mesgs_modified = TRUE;
+                    *dirty = TRUE;
+                } /* end if */
+            } /* end if */
+            else
+                /* Set message class for "known" messages */
+                oh->mesg[mesgno].type = H5O_msg_class_g[id];
+        } /* end else */
+
+        /* Advance decode pointer past message */
+        p += mesg_size;
+
+        /* Check for 'gap' at end of chunk */
+        if((eom_ptr - p) > 0 && (eom_ptr - p) < H5O_SIZEOF_MSGHDR_OH(oh)) {
+            /* Gaps can only occur in later versions of the format */
+            HDassert(oh->version > H5O_VERSION_1);
+
+            /* Gaps should only occur in chunks with no null messages */
+            HDassert(nullcnt == 0);
+
+            /* Set gap information for chunk */
+            oh->chunk[chunkno].gap = (size_t)(eom_ptr - p);
+
+            /* Increment location in chunk */
+            p += oh->chunk[chunkno].gap;
+        } /* end if */
+    } /* end while */
+
+    /* Check for correct checksum on chunks, in later versions of the format */
+    if(oh->version > H5O_VERSION_1) {
+        uint32_t stored_chksum;     /* Checksum from file */
+        uint32_t computed_chksum;   /* Checksum computed in memory */
+
+        /* Metadata checksum */
+        UINT32DECODE(p, stored_chksum);
+
+        /* Compute checksum on chunk */
+        computed_chksum = H5_checksum_metadata(oh->chunk[chunkno].image, (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM), 0);
+
+        /* Verify checksum */
+        if(stored_chksum != computed_chksum)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "incorrect metadata checksum for object header chunk")
+    } /* end if */
+
+    /* Sanity check */
+    HDassert(p == oh->chunk[chunkno].image + oh->chunk[chunkno].size);
+
+    /* Do some inspection/interpretation of new messages from this chunk */
+    /* (detect continuation messages, ref. count messages, etc.) */
+    while(curmesg < oh->nmesgs) {
+        /* Check if next message to examine is a continuation message */
+        if(H5O_CONT_ID == oh->mesg[curmesg].type->id) {
+            H5O_cont_t *cont;
+            unsigned ioflags = 0;   /* Flags for decode routine */
+
+            /* Decode continuation message */
+            cont = (H5O_cont_t *)(H5O_MSG_CONT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, oh->mesg[curmesg].raw);
+            cont->chunkno = udata->cont_msg_info->nmsgs + 1;	/*the next continuation message/chunk */
+
+            /* Save 'native' form of continuation message */
+            oh->mesg[curmesg].native = cont;
+
+            /* Add to continuation messages left to interpret */
+            if(H5O_add_cont_msg(udata->cont_msg_info, cont) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't add continuation message")
+
+            /* Mark the message & chunk as dirty if the message was changed by decoding */
+            if((ioflags & H5O_DECODEIO_DIRTY) && (udata->file_intent & H5F_ACC_RDWR)) {
+                oh->mesg[curmesg].dirty = TRUE;
+                udata->mesgs_modified = TRUE;
+                *dirty = TRUE;
+            } /* end if */
+        } /* end if */
+        /* Check if next message to examine is a ref. count message */
+        else if(H5O_REFCOUNT_ID == oh->mesg[curmesg].type->id) {
+            H5O_refcount_t *refcount;
+            unsigned ioflags = 0;   /* Flags for decode routine */
+
+            /* Decode ref. count message */
+            HDassert(oh->version > H5O_VERSION_1);
+            refcount = (H5O_refcount_t *)(H5O_MSG_REFCOUNT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, oh->mesg[curmesg].raw);
+
+            /* Save 'native' form of ref. count message */
+            oh->mesg[curmesg].native = refcount;
+
+            /* Set object header values */
+            oh->has_refcount_msg = TRUE;
+            oh->nlink = *refcount;
+
+            /* Mark the message & chunk as dirty if the message was changed by decoding */
+            if((ioflags & H5O_DECODEIO_DIRTY) && (udata->file_intent & H5F_ACC_RDWR)) {
+                oh->mesg[curmesg].dirty = TRUE;
+                udata->mesgs_modified = TRUE;
+                *dirty = TRUE;
+            } /* end if */
+        } /* end if */
+        /* Check if next message to examine is a link message */
+        else if(H5O_LINK_ID == oh->mesg[curmesg].type->id) {
+            /* Increment the count of link messages */
+            oh->link_msgs_seen++;
+        } /* end if */
+        /* Check if next message to examine is an attribute message */
+        else if(H5O_ATTR_ID == oh->mesg[curmesg].type->id) {
+            /* Increment the count of attribute messages */
+            oh->attr_msgs_seen++;
+        } /* end if */
+
+        /* Advance to next message */
+        curmesg++;
+    } /* end while */
+
+    /* Mark the chunk dirty if we've merged null messages */
+    if(merged_null_msgs) {
+        udata->mesgs_modified = TRUE;
+	*dirty = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_chunk_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_serialize
+ *
+ * Purpose:	Serialize a chunk for an object header
+ *
+ * Return:	Success: SUCCEED
+ *              Failure: FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 12, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno)
+{
+    H5O_mesg_t *curr_msg;       /* Pointer to current message being operated on */
+    unsigned	u;              /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Encode any dirty messages in this chunk */
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++)
+        if(curr_msg->dirty && curr_msg->chunkno == chunkno)
+            /* Casting away const OK -QAK */
+            if(H5O_msg_flush((H5F_t *)f, oh, curr_msg) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode object header message")
+
+    /* Sanity checks */
+    if(oh->version > H5O_VERSION_1)
+        /* Make certain the magic # is present */
+        HDassert(!HDmemcmp(oh->chunk[chunkno].image, (chunkno == 0 ? H5O_HDR_MAGIC : H5O_CHK_MAGIC), H5_SIZEOF_MAGIC));
+    else
+        /* Gaps should never occur in version 1 of the format */
+        HDassert(oh->chunk[chunkno].gap == 0);
+
+    /* Extra work, for later versions of the format */
+    if(oh->version > H5O_VERSION_1) {
+        uint32_t metadata_chksum;   /* Computed metadata checksum value */
+        uint8_t	*p;                 /* Pointer into object header chunk */
+
+        /* Check for gap in chunk & zero it out */
+        if(oh->chunk[chunkno].gap)
+            HDmemset((oh->chunk[chunkno].image + oh->chunk[chunkno].size) -
+                (H5O_SIZEOF_CHKSUM + oh->chunk[chunkno].gap), 0, oh->chunk[chunkno].gap);
+
+        /* Compute metadata checksum */
+        metadata_chksum = H5_checksum_metadata(oh->chunk[chunkno].image, (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM), 0);
+
+        /* Metadata checksum */
+        p = oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM);
+        UINT32ENCODE(p, metadata_chksum);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_chunk_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_proxy_dest
+ *
+ * Purpose:	Destroy a chunk proxy object
+ *
+ * Return:	Success: SUCCEED
+ *              Failure: FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_chunk_proxy_dest(H5O_chunk_proxy_t *chk_proxy)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(chk_proxy);
+
+    /* Decrement reference count of object header */
+    if(chk_proxy->oh && H5O_dec_rc(chk_proxy->oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "can't decrement reference count on object header")
+
+    /* Release the chunk proxy object */
+    chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_chunk_proxy_dest() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ochunk.c b/gatb-core/thirdparty/hdf5/src/H5Ochunk.c
new file mode 100644
index 0000000..d6d4a1a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ochunk.c
@@ -0,0 +1,406 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Ochunk.c
+ *			Jul 13 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object header chunk routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare the free list for H5O_chunk_proxy_t's */
+H5FL_DEFINE(H5O_chunk_proxy_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_add
+ *
+ * Purpose:	Add new chunk for object header to metadata cache
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;       /* Proxy for chunk, to mark it dirty in the cache */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(idx < oh->nchunks);
+    HDassert(idx > 0);
+
+    /* Allocate space for the object header data structure */
+    if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Set the values in the chunk proxy */
+    chk_proxy->oh = oh;
+    chk_proxy->chunkno = idx;
+
+    /* Increment reference count on object header */
+    if(H5O_inc_rc(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "can't increment reference count on object header")
+
+    /* Insert the chunk proxy into the cache */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header chunk")
+    chk_proxy = NULL;
+
+done:
+    if(ret_value < 0)
+        if(chk_proxy)
+            chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_protect
+ *
+ * Purpose:	Protect an object header chunk for modifications
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 17 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_chunk_proxy_t *
+H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Proxy for protected chunk */
+    H5O_chunk_proxy_t *ret_value;               /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(idx < oh->nchunks);
+
+    /* Check for protecting first chunk */
+    if(0 == idx) {
+        /* Create new "fake" chunk proxy for first chunk */
+        /* (since the first chunk is already handled by the H5O_t object) */
+        if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+        /* Increment reference count on object header */
+        if(H5O_inc_rc(oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, NULL, "can't increment reference count on object header")
+
+        /* Set chunk proxy fields */
+        chk_proxy->oh = oh;
+        chk_proxy->chunkno = idx;
+    } /* end if */
+    else {
+        H5O_chk_cache_ud_t chk_udata;       /* User data for loading chunk */
+
+        /* Construct the user data for protecting chunk proxy */
+        /* (and _not_ decoding it) */
+        HDmemset(&chk_udata, 0, sizeof(chk_udata));
+        chk_udata.oh = oh;
+        chk_udata.chunkno = idx;
+        chk_udata.size = oh->chunk[idx].size;
+
+        /* Get the chunk proxy */
+        if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
+
+        /* Sanity check */
+        HDassert(chk_proxy->oh == oh);
+        HDassert(chk_proxy->chunkno == idx);
+    } /* end else */
+
+    /* Set return value */
+    ret_value = chk_proxy;
+
+done:
+    /* Cleanup on error */
+    if(!ret_value)
+        if(0 == idx && chk_proxy)
+            chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_unprotect
+ *
+ * Purpose:	Unprotect an object header chunk after modifications
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 17 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id, H5O_chunk_proxy_t *chk_proxy,
+    hbool_t dirtied)
+{
+    herr_t ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(chk_proxy);
+
+    /* Check for releasing first chunk */
+    if(0 == chk_proxy->chunkno) {
+        /* Check for dirtying the first chunk */
+        if(dirtied) {
+            /* Mark object header as dirty in cache */
+            if(H5AC_mark_entry_dirty(chk_proxy->oh) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+        } /* end else/if */
+
+        /* Decrement reference count of object header */
+        if(H5O_dec_rc(chk_proxy->oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "can't decrement reference count on object header")
+
+        /* Free fake chunk proxy */
+        chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+    } /* end if */
+    else {
+        /* Release the chunk proxy from the cache, possibly marking it dirty */
+        if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, chk_proxy->oh->chunk[chk_proxy->chunkno].addr, chk_proxy, (dirtied ? H5AC__DIRTIED_FLAG : H5AC__NO_FLAGS_SET)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_resize
+ *
+ * Purpose:	Resize an object header chunk
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May  6 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_chunk_resize(H5O_t *oh, H5O_chunk_proxy_t *chk_proxy)
+{
+    herr_t ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(oh);
+    HDassert(chk_proxy);
+
+    /* Check for resizing first chunk */
+    if(0 == chk_proxy->chunkno) {
+        /* Resize object header in cache */
+        if(H5AC_resize_entry(oh, oh->chunk[0].size) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTRESIZE, FAIL, "unable to resize chunk in cache")
+    } /* end if */
+    else {
+        /* Resize chunk in cache */
+        if(H5AC_resize_entry(chk_proxy, oh->chunk[chk_proxy->chunkno].size) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTRESIZE, FAIL, "unable to resize chunk in cache")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_resize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_update_idx
+ *
+ * Purpose:	Update the chunk index for a chunk proxy
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_chunk_update_idx(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
+{
+    H5O_chunk_proxy_t *chk_proxy;       /* Proxy for chunk, to mark it dirty in the cache */
+    H5O_chk_cache_ud_t chk_udata;       /* User data for loading chunk */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(idx < oh->nchunks);
+    HDassert(idx > 0);
+
+    /* Construct the user data for protecting chunk proxy */
+    /* (and _not_ decoding it) */
+    HDmemset(&chk_udata, 0, sizeof(chk_udata));
+    chk_udata.oh = oh;
+    chk_udata.chunkno = idx;
+    chk_udata.size = oh->chunk[idx].size;
+
+    /* Get the chunk proxy */
+    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+    /* Update index for chunk proxy in cache */
+    chk_proxy->chunkno = idx;
+
+    /* Release the chunk proxy from the cache, marking it deleted */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, H5AC__DIRTIED_FLAG) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_update_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_chunk_delete
+ *
+ * Purpose:	Notify metadata cache that a chunk has been deleted
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 13 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
+{
+    H5O_chunk_proxy_t *chk_proxy;       /* Proxy for chunk, to mark it dirty in the cache */
+    H5O_chk_cache_ud_t chk_udata;       /* User data for loading chunk */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(idx < oh->nchunks);
+    HDassert(idx > 0);
+
+    /* Construct the user data for protecting chunk proxy */
+    /* (and _not_ decoding it) */
+    HDmemset(&chk_udata, 0, sizeof(chk_udata));
+    chk_udata.oh = oh;
+    chk_udata.chunkno = idx;
+    chk_udata.size = oh->chunk[idx].size;
+
+    /* Get the chunk proxy */
+    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+    /* Sanity check */
+    HDassert(chk_proxy->oh == oh);
+    HDassert(chk_proxy->chunkno == idx);
+
+    /* Release the chunk proxy from the cache, marking it deleted */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, (H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_chunk_delete() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ocont.c b/gatb-core/thirdparty/hdf5/src/H5Ocont.c
new file mode 100644
index 0000000..a139654
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ocont.c
@@ -0,0 +1,289 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Ocont.c
+ *                      Aug  6 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             The object header continuation message.  This
+ *                      message is only generated and read from within
+ *                      the H5O package.  Therefore, do not change
+ *                      any definitions in this file!
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_cont_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_cont_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static size_t H5O_cont_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_cont_free(void *mesg);
+static herr_t H5O_cont_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg);
+static herr_t H5O_cont_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_CONT[1] = {{
+    H5O_CONT_ID,            	/*message id number             */
+    "hdr continuation",     	/*message name for debugging    */
+    sizeof(H5O_cont_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_cont_decode,        	/*decode message                */
+    H5O_cont_encode,        	/*encode message                */
+    NULL,                   	/*no copy method                */
+    H5O_cont_size,          	/*size of header continuation   */
+    NULL,                   	/*reset method			*/
+    H5O_cont_free,	        /* free method			*/
+    H5O_cont_delete,		/* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL, 		 	/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_cont_debug         	/*debugging                     */
+}};
+
+/* Declare the free list for H5O_cont_t's */
+H5FL_DEFINE(H5O_cont_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cont_decode
+ *
+ * Purpose:     Decode the raw header continuation message.
+ *
+ * Return:      Success:        Ptr to the new native message
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_cont_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_cont_t             *cont = NULL;
+    void                   *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Allocate space for the message */
+    if(NULL == (cont = H5FL_MALLOC(H5O_cont_t)))
+	HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+    /* Decode */
+    H5F_addr_decode(f, &p, &(cont->addr));
+    H5F_DECODE_LENGTH(f, p, cont->size);
+    cont->chunkno = 0;
+
+    /* Set return value */
+    ret_value = cont;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cont_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cont_encode
+ *
+ * Purpose:     Encodes a continuation message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  7 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cont_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_cont_t       *cont = (const H5O_cont_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(cont);
+    HDassert(H5F_addr_defined(cont->addr));
+    HDassert(cont->size > 0);
+
+    /* encode */
+    H5F_addr_encode(f, &p, cont->addr);
+    H5F_ENCODE_LENGTH(f, p, cont->size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_cont_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cont_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Sep  6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_cont_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)(H5F_SIZEOF_ADDR(f) +    /* Continuation header address */
+                H5F_SIZEOF_SIZE(f));     /* Continuation header length */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cont_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_cont_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 15, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cont_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_cont_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_cont_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cont_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, October 10, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cont_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+{
+    H5O_cont_t *mesg = (H5O_cont_t *) _mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Notify the cache that the chunk has been deleted */
+    /* (releases the space for the chunk) */
+    if(H5O_chunk_delete(f, dxpl_id, open_oh, mesg->chunkno) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove chunk from cache")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_cont_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cont_debug
+ *
+ * Purpose:     Prints debugging info.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_cont_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_cont_t       *cont = (const H5O_cont_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(cont);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Continuation address:", cont->addr);
+
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	      "Continuation size in bytes:",
+	      (unsigned long) (cont->size));
+    HDfprintf(stream, "%*s%-*s %d\n", indent, "", fwidth,
+	      "Points to chunk number:",
+	      (int) (cont->chunkno));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_cont_debug() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ocopy.c b/gatb-core/thirdparty/hdf5/src/H5Ocopy.c
new file mode 100644
index 0000000..cc2030f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ocopy.c
@@ -0,0 +1,1970 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Ocopy.c
+ *			Nov  6 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object copying routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Aprivate.h"         /* Attributes                           */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5HGprivate.h"        /* Global Heaps                         */
+#include "H5FOprivate.h"        /* File objects                         */
+#include "H5Lprivate.h"         /* Links			  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Pprivate.h"         /* Property lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Key object for skiplist of committed datatypes */
+typedef struct H5O_copy_search_comm_dt_key_t {
+    H5T_t               *dt;    /* Datatype */
+    unsigned long       fileno; /* File number */
+} H5O_copy_search_comm_dt_key_t;
+
+/* Callback struct for building a list of committed datatypes */
+typedef struct H5O_copy_search_comm_dt_ud_t {
+    H5SL_t      *dst_dt_list;   /* Skip list of committed datatypes */
+    H5G_loc_t   *dst_root_loc;  /* Starting location for iteration */
+    H5O_loc_t   obj_oloc;       /* Object location (for attribute iteration callback) */
+    hid_t       dxpl_id;        /* Dataset transfer property list id */
+} H5O_copy_search_comm_dt_ud_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5O_copy_free_addrmap_cb(void *item, void *key, void *op_data);
+static herr_t H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
+    hid_t dxpl_id, H5O_copy_t *cpy_info, H5O_type_t *obj_type, void **udata);
+static herr_t H5O_copy_header(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
+    hid_t dxpl_id, hid_t ocpypl_id);
+static herr_t H5O_copy_obj(H5G_loc_t *src_loc, H5G_loc_t *dst_loc,
+    const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id, hid_t dxpl_id);
+static herr_t H5O_copy_obj_by_ref(H5O_loc_t *src_oloc, hid_t dxpl_id,
+    H5O_loc_t *dst_oloc, H5G_loc_t *dst_root_loc, H5O_copy_t *cpy_info);
+static herr_t H5O_copy_free_comm_dt_cb(void *item, void *key, void *op_data);
+static int H5O_copy_comm_dt_cmp(const void *dt1, const void *dt2);
+static herr_t H5O_copy_search_comm_dt_cb(hid_t group, const char *name,
+    const H5L_info_t *linfo, void *udata);
+static htri_t H5O_copy_search_comm_dt(H5F_t *file_src, H5O_t *oh_src,
+    H5O_loc_t *oloc_dst/*in, out*/, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_copy_insert_comm_dt(H5F_t *file_src, H5O_t *oh_src,
+    H5O_loc_t *oloc_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5O_addr_map_t struct */
+H5FL_DEFINE(H5O_addr_map_t);
+
+/* Declare a free list to manage the H5O_copy_search_comm_dt_key_t struct */
+H5FL_DEFINE(H5O_copy_search_comm_dt_key_t);
+
+/* Declare a free list to manage haddr_t variables */
+H5FL_DEFINE(haddr_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Ocopy
+ *
+ * Purpose:     Copy an object (group or dataset) to destination location
+ *              within a file or cross files. PLIST_ID is a property list
+ *              which is used to pass user options and properties to the
+ *              copy. The name, dst_name, must not already be taken by some
+ *              other object in the destination group.
+ *
+ *              H5Ocopy() will fail if the name of the destination object
+ *                  exists in the destination group.  For example,
+ *                  H5Ocopy(fid_src, "/dset", fid_dst, "/dset", ...)
+ *                  will fail if "/dset" exists in the destination file
+ *
+ *              OPTIONS THAT HAVE BEEN IMPLEMENTED.
+ *                  H5O_COPY_SHALLOW_HIERARCHY_FLAG
+ *                      If this flag is specified, only immediate members of
+ *                      the group are copied. Otherwise (default), it will
+ *                      recursively copy all objects below the group
+ *                  H5O_COPY_EXPAND_SOFT_LINK_FLAG
+ *                      If this flag is specified, it will copy the objects
+ *                      pointed by the soft links. Otherwise (default), it
+ *                      will copy the soft link as they are
+ *                  H5O_COPY_WITHOUT_ATTR_FLAG
+ *                      If this flag is specified, it will copy object without
+ *                      copying attributes. Otherwise (default), it will
+ *                      copy object along with all its attributes
+ *                  H5O_COPY_EXPAND_REFERENCE_FLAG
+ *                      1) Copy object between two different files:
+ *                          When this flag is specified, it will copy objects that
+ *                          are pointed by the references and update the values of
+ *                          references in the destination file.  Otherwise (default)
+ *                          the values of references in the destination will set to
+ *                          zero
+ *                          The current implementation does not handle references
+ *                          inside of other datatype structure. For example, if
+ *                          a member of compound datatype is reference, H5Ocopy()
+ *                          will copy that field as it is. It will not set the
+ *                          value to zero as default is used nor copy the object
+ *                          pointed by that field the flag is set
+ *                      2) Copy object within the same file:
+ *                          This flag does not have any effect to the H5Ocopy().
+ *                          Datasets or attributes of references are copied as they
+ *                          are, i.e. values of references of the destination object
+ *                          are the same as the values of the source object
+ *
+ *              OPTIONS THAT MAY APPLY TO COPY IN THE FUTURE.
+ *                  H5O_COPY_EXPAND_EXT_LINK_FLAG
+ *                      If this flag is specified, it will expand the external links
+ *                      into new objects, Otherwise (default), it will keep external
+ *                      links as they are (default)
+ *
+ *              PROPERTIES THAT MAY APPLY TO COPY IN FUTURE
+ *                  Change data layout such as chunk size
+ *                  Add filter such as data compression.
+ *                  Add an attribute to the copied object(s) that say the  date/time
+ *                      for the copy or other information about the source file.
+ *
+ *              The intermediate group creation property should be passed in
+ *              using the lcpl instead of the ocpypl.
+ *
+ * Usage:      H5Ocopy(src_loc_id, src_name, dst_loc_id, dst_name, ocpypl_id, lcpl_id)
+ *             hid_t src_loc_id         IN: Source file or group identifier.
+ *             const char *src_name     IN: Name of the source object to be copied
+ *             hid_t dst_loc_id         IN: Destination file or group identifier
+ *             const char *dst_name     IN: Name of the destination object
+ *             hid_t ocpypl_id          IN: Properties which apply to the copy
+ *             hid_t lcpl_id            IN: Properties which apply to the new hard link
+ *
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              June 4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+        const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id)
+{
+    H5G_loc_t	loc;                    /* Source group group location */
+    H5G_loc_t	src_loc;                /* Source object group location */
+    H5G_loc_t	dst_loc;                /* Destination group location */
+
+    /* for opening the destination object */
+    H5G_name_t  src_path;               /* Opened source object hier. path */
+    H5O_loc_t   src_oloc;               /* Opened source object object location */
+    hbool_t     loc_found = FALSE;      /* Location at 'name' found */
+    hbool_t     obj_open = FALSE;       /* Entry at 'name' found */
+
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name,
+             ocpypl_id, lcpl_id);
+
+    /* Check arguments */
+    if(H5G_loc(src_loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(H5G_loc(dst_loc_id, &dst_loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!src_name || !*src_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no source name specified")
+    if(!dst_name || !*dst_name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified")
+
+    /* check if destination name already exists */
+    {
+        H5G_name_t  tmp_path;
+        H5O_loc_t   tmp_oloc;
+        H5G_loc_t   tmp_loc;
+
+        /* Set up group location */
+        tmp_loc.oloc = &tmp_oloc;
+        tmp_loc.path = &tmp_path;
+        H5G_loc_reset(&tmp_loc);
+
+        /* Check if object already exists in destination */
+        if(H5G_loc_find(&dst_loc, dst_name, &tmp_loc, H5P_DEFAULT, H5AC_ind_dxpl_id) >= 0) {
+            H5G_name_free(&tmp_path);
+            HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "destination object already exists")
+        } /* end if */
+    }
+
+    /* Set up opened group location to fill in */
+    src_loc.oloc = &src_oloc;
+    src_loc.path = &src_path;
+    H5G_loc_reset(&src_loc);
+
+    /* Find the source object to copy */
+    if(H5G_loc_find(&loc, src_name, &src_loc/*out*/, H5P_DEFAULT, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "source object not found")
+    loc_found = TRUE;
+
+    /* Open source object's object header */
+    if(H5O_open(&src_oloc) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+    obj_open = TRUE;
+
+    /* Get correct property lists */
+    if(H5P_DEFAULT == lcpl_id) {
+        if((lcpl_id = H5L_get_default_lcpl()) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to get default lcpl")
+    } /* end if */
+    else
+        if(TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link creation property list")
+
+    /* Get object copy property list */
+    if(H5P_DEFAULT == ocpypl_id)
+        ocpypl_id = H5P_OBJECT_COPY_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(ocpypl_id, H5P_OBJECT_COPY))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not object copy property list")
+
+    /* Do the actual copying of the object */
+    if(H5O_copy_obj(&src_loc, &dst_loc, dst_name, ocpypl_id, lcpl_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+done:
+    if(loc_found && H5G_loc_free(&src_loc) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
+    if(obj_open && H5O_close(&src_oloc) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Ocopy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_header_real
+ *
+ * Purpose:     Copy header object from one location to another using
+ *              pre-copy, copy, and post-copy callbacks for each message
+ *              type.
+ *
+ *              The source header object is compressed into a single chunk
+ *              (since we know how big it is) and any continuation messages
+ *              are converted into NULL messages.
+ *
+ *              By default, NULL messages are not copied.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              May 30, 2005
+ *
+ * Modifications:
+ *	Vailin Choi; Feb 2012
+ *	Bug fix for HDFFV-7853
+ *	When the object is opened, call the object's flush class action
+ *	to ensure that cached data is flushed so that H5Ocopy will get
+ *	the correct data.
+ *	
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
+    hid_t dxpl_id, H5O_copy_t *cpy_info, H5O_type_t *obj_type,
+    void **udata /*out*/)
+{
+    H5O_addr_map_t         *addr_map = NULL;       /* Address mapping of object copied */
+    H5O_t                  *oh_src = NULL;         /* Object header for source object */
+    H5O_t                  *oh_dst = NULL;         /* Object header for destination object */
+    unsigned               mesgno = 0;
+    haddr_t                addr_new = HADDR_UNDEF;
+    hbool_t                *deleted = NULL;      /* Array of flags indicating whether messages should be copied */
+    hbool_t                inserted = FALSE;        /* Whether the destination object header has been inserted into the cache */
+    size_t                 null_msgs;               /* Number of NULL messages found in each loop */
+    size_t                 orig_dst_msgs;           /* Original # of messages in dest. object */
+    H5O_mesg_t             *mesg_src;               /* Message in source object header */
+    H5O_mesg_t             *mesg_dst;               /* Message in source object header */
+    const H5O_msg_class_t  *copy_type;              /* Type of message to use for copying */
+    const H5O_obj_class_t  *obj_class = NULL;       /* Type of object we are copying */
+    void                   *cpy_udata = NULL;       /* User data for passing to message callbacks */
+    uint64_t               dst_oh_size;             /* Total size of the destination OH */
+    size_t                 dst_oh_null;             /* Size of the null message to add to destination OH */
+    size_t                 dst_oh_gap;              /* Size of the gap in chunk #0 of destination OH */
+    uint8_t                *current_pos;            /* Current position in destination image */
+    size_t                 msghdr_size;
+    herr_t                 ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(oloc_src);
+    HDassert(oloc_src->file);
+    HDassert(H5F_addr_defined(oloc_src->addr));
+    HDassert(oloc_dst->file);
+    HDassert(cpy_info);
+
+    /* Get pointer to object class for this object */
+    if((obj_class = H5O_obj_class(oloc_src, dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type")
+
+    /* Check if the object at the address is already open in the file */
+    if(H5FO_opened(oloc_src->file, oloc_src->addr) != NULL) {
+	
+	H5G_loc_t   tmp_loc; 	/* Location of object */
+	H5O_loc_t   tmp_oloc; 	/* Location of object */
+	H5G_name_t  tmp_path;	/* Object's path */
+
+	tmp_loc.oloc = &tmp_oloc;
+	tmp_loc.path = &tmp_path;
+	tmp_oloc.file = oloc_src->file;
+	tmp_oloc.addr = oloc_src->addr;
+	tmp_oloc.holding_file = oloc_src->holding_file;
+	H5G_name_reset(tmp_loc.path);
+
+	/* Flush the object of this class */
+        if(obj_class->flush && obj_class->flush(&tmp_loc, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
+    }
+
+    /* Get source object header */
+    if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC_READ)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Retrieve user data for particular type of object to copy */
+    if(obj_class->get_copy_file_udata &&
+            (NULL == (cpy_udata = (obj_class->get_copy_file_udata)())))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to retrieve copy user data")
+
+    /* If we are merging committed datatypes, check for a match in the destination
+     * file now */
+    if(cpy_info->merge_comm_dt && obj_class->type == H5O_TYPE_NAMED_DATATYPE) {
+        unsigned long fileno_src; /* fileno for source file */
+        unsigned long fileno_dst; /* fileno for destination file */
+        htri_t merge; /* Whether we found a match in the destination file */
+
+        /* Check if the source and dest file are the same.  If so, just return
+         * the source object address */
+        H5F_GET_FILENO(oloc_src->file, fileno_src);
+        H5F_GET_FILENO(oloc_dst->file, fileno_dst);
+        if(fileno_src == fileno_dst) {
+            merge = TRUE;
+            oloc_dst->addr = oloc_src->addr;
+        } /* end if */
+        else
+            /* Search for a matching committed datatype, building the list if
+             * necessary */
+            if((merge = H5O_copy_search_comm_dt(oloc_src->file, oh_src, oloc_dst, dxpl_id, cpy_info)) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't search for matching committed datatype")
+
+        if(merge) {
+            /* Found a match, add to skip list and exit */
+            /* Allocate space for the address mapping of the object copied */
+            if(NULL == (addr_map = H5FL_MALLOC(H5O_addr_map_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Insert the address mapping for the found object into the copied
+             * list */
+            addr_map->src_obj_pos.fileno = fileno_src;
+            addr_map->src_obj_pos.addr = oloc_src->addr;
+            addr_map->dst_addr = oloc_dst->addr;
+            addr_map->is_locked = TRUE;                 /* We've locked the object currently */
+            addr_map->inc_ref_count = 0;                /* Start with no additional ref counts to add */
+            addr_map->obj_class = obj_class;
+            addr_map->udata = cpy_udata;
+
+            /* Insert into skip list */
+            if(H5SL_insert(cpy_info->map_list, addr_map, &(addr_map->src_obj_pos)) < 0) {
+                addr_map = H5FL_FREE(H5O_addr_map_t, addr_map);
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+            } /* end if */
+
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+    } /* end if */
+
+    /* Flush any dirty messages in source object header to update the header chunks */
+    if(H5O_flush_msgs(oloc_src->file, oh_src) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object header messages")
+
+    /* Allocate the destination object header and fill in header fields */
+    if(NULL == (oh_dst = H5FL_CALLOC(H5O_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Initialize header information */
+    oh_dst->version = oh_src->version;
+    oh_dst->flags = oh_src->flags;
+    oh_dst->link_msgs_seen = oh_src->link_msgs_seen;
+    oh_dst->attr_msgs_seen = oh_src->attr_msgs_seen;
+    oh_dst->sizeof_size = H5F_SIZEOF_SIZE(oloc_dst->file);
+    oh_dst->sizeof_addr = H5F_SIZEOF_ADDR(oloc_dst->file);
+
+    /* Copy time fields */
+    oh_dst->atime = oh_src->atime;
+    oh_dst->mtime = oh_src->mtime;
+    oh_dst->ctime = oh_src->ctime;
+    oh_dst->btime = oh_src->btime;
+
+    /* Copy attribute storage information */
+    oh_dst->max_compact = oh_src->max_compact;
+    oh_dst->min_dense = oh_src->min_dense;
+
+    /* Initialize size of chunk array.  Start off with zero chunks so this field
+     * is consistent with the current state of the chunk array.  This is
+     * important if an error occurs.
+     */
+    oh_dst->alloc_nchunks = oh_dst->nchunks = 0;
+
+    /* Allocate memory for the chunk array - always start with 1 chunk */
+    if(NULL == (oh_dst->chunk = H5FL_SEQ_MALLOC(H5O_chunk_t, 1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Update number of allocated chunks.  There are still no chunks used. */
+    oh_dst->alloc_nchunks = 1;
+
+    /* Allocate memory for "deleted" array.  This array marks the message in
+     * the source that shouldn't be copied to the destination.
+     */
+    if(NULL == (deleted = (hbool_t *)HDmalloc(sizeof(hbool_t) * oh_src->nmesgs)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    HDmemset(deleted, FALSE, sizeof(hbool_t) * oh_src->nmesgs);
+
+    /* "pre copy" pass over messages, to gather information for actual message copy operation
+     * (for messages which depend on information from other messages)
+     * Keep track of how many NULL or deleted messages we find (or create)
+     */
+    null_msgs = 0;
+    for(mesgno = 0; mesgno < oh_src->nmesgs; mesgno++) {
+        /* Set up convenience variables */
+        mesg_src = &(oh_src->mesg[mesgno]);
+
+        /* Sanity check */
+        HDassert(!mesg_src->dirty);     /* Should be cleared by earlier call to flush messages */
+
+        /* Get message class to operate on */
+        copy_type = mesg_src->type;
+
+        /* Check for continuation message; these are converted to NULL
+         * messages because the destination OH will have only one chunk
+         */
+        if(H5O_CONT_ID == mesg_src->type->id || H5O_NULL_ID == mesg_src->type->id) {
+            deleted[mesgno] = TRUE;
+            ++null_msgs;
+            copy_type = H5O_MSG_NULL;
+        } /* end if */
+        HDassert(copy_type);
+
+        if(copy_type->pre_copy_file) {
+            /* Decode the message if necessary. */
+            H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, 0, oh_src, mesg_src, FAIL)
+
+            /* Perform "pre copy" operation on message */
+            if((copy_type->pre_copy_file)(oloc_src->file, mesg_src->native,
+                    &(deleted[mesgno]), cpy_info, cpy_udata) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to perform 'pre copy' operation on message")
+
+            /* Check if the message should be deleted in the destination */
+            if(deleted[mesgno])
+                /* Mark message as deleted */
+                ++null_msgs;
+        } /* end if(copy_type->pre_copy_file) */
+    } /* end for */
+
+    /* Initialize size of message list.  It may or may not include the NULL messages
+     * detected above.
+     */
+    if(cpy_info->preserve_null)
+        oh_dst->alloc_nmesgs = oh_dst->nmesgs = oh_src->nmesgs;
+    else
+        oh_dst->alloc_nmesgs = oh_dst->nmesgs = (oh_src->nmesgs - null_msgs);
+
+    /* Allocate memory for destination message array */
+    if(oh_dst->alloc_nmesgs > 0)
+        if(NULL == (oh_dst->mesg = H5FL_SEQ_CALLOC(H5O_mesg_t, oh_dst->alloc_nmesgs)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* "copy" pass over messages, to perform main message copying */
+    null_msgs = 0;
+    for(mesgno = 0; mesgno < oh_dst->nmesgs; mesgno++) {
+        /* Skip any deleted or NULL messages in the source unless the
+         * preserve_null flag is set
+         */
+        if(FALSE == cpy_info->preserve_null) {
+            while(deleted[mesgno + null_msgs]) {
+                ++null_msgs;
+                HDassert(mesgno + null_msgs < oh_src->nmesgs);
+            } /* end while */
+        } /* end if */
+
+        /* Set up convenience variables */
+        mesg_src = &(oh_src->mesg[mesgno + null_msgs]);
+        mesg_dst = &(oh_dst->mesg[mesgno]);
+
+        /* Initialize non-zero components of destination message */
+        mesg_dst->crt_idx = mesg_src->crt_idx;
+        mesg_dst->flags = mesg_src->flags;
+        mesg_dst->raw_size = mesg_src->raw_size;
+        mesg_dst->type = mesg_src->type;
+
+        /* If we're preserving deleted messages, set their types to 'NULL'
+         * in the destination.
+         */
+        if(cpy_info->preserve_null && deleted[mesgno]) {
+            mesg_dst->type = H5O_MSG_NULL;
+            mesg_dst->flags = 0;
+            mesg_dst->dirty = TRUE;
+        } /* end if */
+
+        /* Check for message class to operate on */
+        /* (Use destination message, in case the message has been removed (i.e
+         *      converted to a nil message) in the destination -QAK)
+         */
+        copy_type = mesg_dst->type;
+        HDassert(copy_type);
+
+        /* copy this message into destination file */
+        if(copy_type->copy_file) {
+            hbool_t recompute_size;     /* Whether copy_file callback created a shared message */
+            unsigned mesg_flags;        /* Message flags */
+
+            /* Decode the message if necessary. */
+            H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, 0, oh_src, mesg_src, FAIL)
+
+            /* Get destination message flags, and unset shared and shareable
+             * flags.  mesg_dst->flags will contain the original flags for now.
+             */
+            mesg_flags = (unsigned)mesg_dst->flags & ~H5O_MSG_FLAG_SHARED
+                    & ~H5O_MSG_FLAG_SHAREABLE;
+
+            /* Copy the source message */
+            recompute_size = FALSE;
+            if((mesg_dst->native = H5O_msg_copy_file(copy_type, oloc_src->file,
+                    mesg_src->native, oloc_dst->file, &recompute_size,
+                    &mesg_flags, cpy_info, cpy_udata, dxpl_id)) == NULL)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object header message")
+
+            /* Check if the sharing state changed, and recompute the size if so
+             */
+            if(!(mesg_flags & H5O_MSG_FLAG_SHARED)
+                    != !(mesg_dst->flags & H5O_MSG_FLAG_SHARED))
+                recompute_size = TRUE;
+
+            /* Set destination message flags */
+            mesg_dst->flags = (uint8_t)mesg_flags;
+
+            /* Recompute message's size */
+            /* (its sharing status or one of its components (for attributes)
+             *  could have changed)
+             */
+            if(recompute_size)
+                mesg_dst->raw_size = H5O_ALIGN_OH(oh_dst,
+                        H5O_msg_raw_size(oloc_dst->file, mesg_dst->type->id, FALSE, mesg_dst->native));
+
+            /* Mark the message in the destination as dirty, so it'll get encoded when the object header is flushed */
+            mesg_dst->dirty = TRUE;
+        } /* end if (mesg_src->type->copy_file) */
+    } /* end of mesgno loop */
+
+
+    /* Allocate the destination header and copy any messages that didn't have
+     * copy callbacks.  They get copied directly from the source image to the
+     * destination image.
+     */
+
+    /* Calculate how big the destination object header will be on disk.
+     * This isn't necessarily the same size as the original.
+     */
+
+    /* Compute space for messages. */
+    dst_oh_size = 0;
+    for(mesgno = 0; mesgno < oh_dst->nmesgs; mesgno++) {
+        dst_oh_size += (uint64_t)H5O_SIZEOF_MSGHDR_OH(oh_dst);
+        dst_oh_size += oh_dst->mesg[mesgno].raw_size;
+    } /* end for */
+
+    /* Check if we need to determine correct value for chunk #0 size bits */
+    if(oh_dst->version > H5O_VERSION_1) {
+        /* Reset destination object header's "chunk 0 size" flags */
+        oh_dst->flags = (uint8_t)(oh_dst->flags & ~H5O_HDR_CHUNK0_SIZE);
+
+        /* Determine correct value for chunk #0 size bits */
+        if(dst_oh_size > 4294967295)
+            oh_dst->flags |= H5O_HDR_CHUNK0_8;
+        else if(dst_oh_size > 65535)
+            oh_dst->flags |= H5O_HDR_CHUNK0_4;
+        else if(dst_oh_size > 255)
+            oh_dst->flags |= H5O_HDR_CHUNK0_2;
+    } /* end if */
+
+    /* Check if the chunk's data portion is too small */
+    dst_oh_gap = dst_oh_null = 0;
+    if(dst_oh_size < H5O_MIN_SIZE) {
+        size_t delta = (size_t)(H5O_MIN_SIZE - dst_oh_size);    /* Delta in chunk size needed */
+
+        /* Sanity check */
+        HDassert((oh_dst->flags & H5O_HDR_CHUNK0_SIZE) == H5O_HDR_CHUNK0_1);
+
+        /* Determine whether to create gap or NULL message */
+        if(delta < H5O_SIZEOF_MSGHDR_OH(oh_dst))
+            dst_oh_gap = delta;
+        else
+            dst_oh_null = delta;
+
+        /* Increase destination object header size */
+        dst_oh_size += delta;
+
+        /* Sanity check */
+        HDassert(dst_oh_size <= 255);
+    } /* end if */
+
+    /* Add in destination's object header size now */
+    dst_oh_size += (uint64_t)H5O_SIZEOF_HDR(oh_dst);
+
+    /* Allocate space for chunk in destination file */
+    if(HADDR_UNDEF == (oh_dst->chunk[0].addr = H5MF_alloc(oloc_dst->file, H5FD_MEM_OHDR, dxpl_id, (hsize_t)dst_oh_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for object header")
+    addr_new = oh_dst->chunk[0].addr;
+
+    /* Create memory image for the new chunk */
+    /* Note: we use calloc() instead of malloc() here because older versions of
+     *  some messages don't initialize "unused" bytes and because we want to
+     *  write out the same version of the object header and older versions of
+     *  object headers aligned messages.  In both those situations, it's
+     *  complex and error-prone to determine all the proper ways/places to
+     *  clear to zero bytes, so we just set the buffer to zero's here.
+     *  (QAK - 2010/08/17)
+     */
+    if(NULL == (oh_dst->chunk[0].image = H5FL_BLK_CALLOC(chunk_image, (size_t)dst_oh_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Set dest. chunk information */
+    oh_dst->chunk[0].size = (size_t)dst_oh_size;
+    oh_dst->chunk[0].gap = dst_oh_gap;
+
+    /* Update size of chunk array.  The destination now has one chunk. */
+    oh_dst->nchunks = 1;
+
+    /* Set up raw pointers and copy messages that didn't need special
+     * treatment.  This has to happen after the destination header has been
+     * allocated.
+     */
+    HDassert(H5O_SIZEOF_MSGHDR_OH(oh_src) == H5O_SIZEOF_MSGHDR_OH(oh_dst));
+    msghdr_size = H5O_SIZEOF_MSGHDR_OH(oh_dst);
+
+    current_pos = oh_dst->chunk[0].image;
+
+    /* Write the magic number for versions > 1 and skip the rest of the
+     * header.  This will be written when the header is flushed to disk.
+     */
+    if(oh_dst->version > H5O_VERSION_1)
+        HDmemcpy(current_pos, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    current_pos += H5O_SIZEOF_HDR(oh_dst) - H5O_SIZEOF_CHKSUM_OH(oh_dst);
+
+    /* Loop through destination messages, updating their "raw" info */
+    null_msgs = 0;
+    for(mesgno = 0; mesgno < oh_dst->nmesgs; mesgno++) {
+        /* Skip any deleted or NULL messages in the source unless the
+         * preserve_null flag is set.
+         */
+        if(FALSE == cpy_info->preserve_null) {
+            while(deleted[mesgno + null_msgs]) {
+                ++null_msgs;
+                HDassert(mesgno + null_msgs < oh_src->nmesgs);
+            } /* end while */
+        } /* end if */
+
+        /* Set up convenience variables */
+        mesg_src = &(oh_src->mesg[mesgno + null_msgs]);
+        mesg_dst = &(oh_dst->mesg[mesgno]);
+
+        /* Copy each message that wasn't dirtied above */
+        if(!mesg_dst->dirty)
+            /* Copy the message header plus the message's raw data. */
+            HDmemcpy(current_pos, mesg_src->raw - msghdr_size, msghdr_size + mesg_src->raw_size);
+
+        /* Set message's raw pointer to destination chunk's new "image" */
+        mesg_dst->raw = current_pos + msghdr_size;
+
+        /* Move to location where next message should go */
+        current_pos += mesg_dst->raw_size + msghdr_size;
+    } /* end for */
+
+    /* Save this in case more messages are added during NULL message checking */
+    orig_dst_msgs = oh_dst->nmesgs;
+
+    /* Check if we need to add a NULL message to this header */
+    if(dst_oh_null > 0) {
+        size_t null_idx;                /* Index of new NULL message */
+
+        /* Make sure we have enough space for new NULL message */
+        if(oh_dst->nmesgs + 1 > oh_dst->alloc_nmesgs)
+            if(H5O_alloc_msgs(oh_dst, (size_t)1) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
+
+        /* Create null message for [rest of] space in new chunk */
+        /* (account for chunk's magic # & checksum) */
+        null_idx = oh_dst->nmesgs++;
+        oh_dst->mesg[null_idx].type = H5O_MSG_NULL;
+        oh_dst->mesg[null_idx].dirty = TRUE;
+        oh_dst->mesg[null_idx].native = NULL;
+        oh_dst->mesg[null_idx].raw = current_pos + msghdr_size;
+        oh_dst->mesg[null_idx].raw_size = dst_oh_null -  msghdr_size;
+        oh_dst->mesg[null_idx].chunkno = 0;
+    } /* end if */
+
+    /* Make sure we filled the chunk, except for room at the end for a checksum */
+    HDassert(current_pos + dst_oh_gap + dst_oh_null + H5O_SIZEOF_CHKSUM_OH(oh_dst) == (size_t)dst_oh_size + oh_dst->chunk[0].image);
+
+    /* Set the dest. object location to the first chunk address */
+    HDassert(H5F_addr_defined(addr_new));
+    oloc_dst->addr = addr_new;
+
+
+    /* If we are merging committed datatypes and this is a committed datatype, insert
+     * the copied datatype into the list of committed datatypes in the target file.
+     */
+    if(cpy_info->merge_comm_dt && obj_class->type == H5O_TYPE_NAMED_DATATYPE)
+        if(H5O_copy_insert_comm_dt(oloc_src->file, oh_src, oloc_dst, dxpl_id, cpy_info) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't insert committed datatype into destination list")
+
+    /* Allocate space for the address mapping of the object copied */
+    if(NULL == (addr_map = H5FL_MALLOC(H5O_addr_map_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Insert the address mapping for the new object into the copied list */
+    /* (Do this here, because "post copy" possibly checks it) */
+    H5F_GET_FILENO(oloc_src->file, addr_map->src_obj_pos.fileno);
+    addr_map->src_obj_pos.addr = oloc_src->addr;
+    addr_map->dst_addr = oloc_dst->addr;
+    addr_map->is_locked = TRUE;                 /* We've locked the object currently */
+    addr_map->inc_ref_count = 0;                /* Start with no additional ref counts to add */
+    addr_map->obj_class = obj_class;
+    addr_map->udata = cpy_udata;
+
+    /* Insert into skip list */
+    if(H5SL_insert(cpy_info->map_list, addr_map, &(addr_map->src_obj_pos)) < 0) {
+        addr_map = H5FL_FREE(H5O_addr_map_t, addr_map);
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+    } /* end if */
+
+    /* "post copy" loop over messages, to fix up any messages which require a complete
+     * object header for destination object
+     */
+    null_msgs = 0;
+    for(mesgno = 0; mesgno < orig_dst_msgs; mesgno++) {
+        /* Skip any deleted or NULL messages in the source unless the
+         * preserve_null flag is set
+         */
+        if(FALSE == cpy_info->preserve_null) {
+            while(deleted[mesgno + null_msgs]) {
+                ++null_msgs;
+                HDassert(mesgno + null_msgs < oh_src->nmesgs);
+            } /* end while */
+        } /* end if */
+
+        /* Set up convenience variables */
+        mesg_src = &(oh_src->mesg[mesgno + null_msgs]);
+        mesg_dst = &(oh_dst->mesg[mesgno]);
+
+        /* Check for message class to operate on */
+        /* (Use destination message, in case the message has been removed (i.e
+         *      converted to a nil message) in the destination -QAK)
+         */
+        copy_type = mesg_dst->type;
+        HDassert(copy_type);
+
+        if(copy_type->post_copy_file && mesg_src->native) {
+            unsigned mesg_flags;        /* Message flags */
+
+            /* Sanity check destination message */
+            HDassert(mesg_dst->type == mesg_src->type);
+            HDassert(mesg_dst->native);
+
+            /* Get destination message flags.   mesg_dst->flags will contain the
+             * original flags for now. */
+            mesg_flags = (unsigned)mesg_dst->flags;
+
+            /* the object header is needed in the post copy for shared message */
+            cpy_info->oh_dst = oh_dst;
+
+            /* Perform "post copy" operation on message */
+            if((copy_type->post_copy_file)(oloc_src, mesg_src->native, oloc_dst,
+                    mesg_dst->native, &mesg_flags, dxpl_id, cpy_info) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to perform 'post copy' operation on message")
+
+            /* Verify that the flags did not change */
+            HDassert(mesg_flags == (unsigned) mesg_dst->flags);
+        } /* end if */
+    } /* end for */
+
+    /* Indicate that the destination address will no longer be locked */
+    addr_map->is_locked = FALSE;
+
+    /* Increment object header's reference count, if any descendents have created links to this object */
+    if(addr_map->inc_ref_count) {
+        H5_CHECK_OVERFLOW(addr_map->inc_ref_count, hsize_t, unsigned);
+        oh_dst->nlink += (unsigned)addr_map->inc_ref_count;
+    } /* end if */
+
+    /* Insert destination object header in cache */
+    if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
+    oh_dst = NULL;
+    inserted = TRUE;
+
+    /* Set obj_type and udata, if requested */
+    if(obj_type) {
+        HDassert(udata);
+        *obj_type = obj_class->type;
+        *udata = cpy_udata;
+    } /* end if */
+
+done:
+    /* Free deleted array */
+    if(deleted)
+        HDfree(deleted);
+
+    /* Release pointer to source object header and its derived objects */
+    if(oh_src && H5O_unprotect(oloc_src, dxpl_id, oh_src, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    /* Free destination object header on failure */
+    if(ret_value < 0 && oh_dst && !inserted) {
+        if(H5O_free(oh_dst) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+        if(H5O_loc_reset(oloc_dst) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_header_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_header_map
+ *
+ * Purpose:     Copy header object from one location to another, detecting
+ *              already mapped objects, etc.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 1, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_copy_header_map(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
+    hid_t dxpl_id, H5O_copy_t *cpy_info, hbool_t inc_depth,
+    H5O_type_t *obj_type, void **udata /*out*/)
+{
+    H5O_addr_map_t      *addr_map = NULL;       /* Address mapping of object copied */
+    H5_obj_t            src_obj_pos;            /* Position of source object */
+    hbool_t             inc_link;               /* Whether to increment the link count for the object */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(oloc_src);
+    HDassert(oloc_src->file);
+    HDassert(oloc_dst);
+    HDassert(oloc_dst->file);
+    HDassert(cpy_info);
+
+    /* Create object "position" struct */
+    H5F_GET_FILENO(oloc_src->file, src_obj_pos.fileno);
+    src_obj_pos.addr = oloc_src->addr;
+
+    /* Search for the object in the skip list of copied objects */
+    addr_map = (H5O_addr_map_t *)H5SL_search(cpy_info->map_list,
+            &src_obj_pos);
+
+    /* Check if address is already in list of objects copied */
+    if(addr_map == NULL) {
+        /* Copy object for the first time */
+
+        /* Check for incrementing the depth of copy */
+        /* (Can't do this for all copies, since committed datatypes should always be copied) */
+        if(inc_depth)
+            cpy_info->curr_depth++;
+
+        /* Copy object referred to */
+        if(H5O_copy_header_real(oloc_src, oloc_dst, dxpl_id, cpy_info, obj_type,
+                udata) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+        /* Check for incrementing the depth of copy */
+        if(inc_depth)
+            cpy_info->curr_depth--;
+
+        /* When an object is copied for the first time, increment it's link */
+        inc_link = TRUE;
+
+        /* indicate that a new object is created */
+        ret_value++;
+    } /* end if */
+    else {
+        /* Object has already been copied, set its address in destination file */
+        oloc_dst->addr = addr_map->dst_addr;
+
+        /* Return saved obj_type and udata, if requested */
+        if(obj_type) {
+            HDassert(udata);
+            *obj_type = addr_map->obj_class->type;
+            *udata = addr_map->udata;
+        } /* end if */
+
+        /* If the object is locked currently (because we are copying a group
+         * hierarchy and this is a link to a group higher in the hierarchy),
+         * increment it's deferred reference count instead of incrementing the
+         * reference count now.
+         */
+        if(addr_map->is_locked) {
+            addr_map->inc_ref_count++;
+            inc_link = FALSE;
+        } /* end if */
+        else
+            inc_link = TRUE;
+    } /* end else */
+
+    /* Increment destination object's link count, if allowed */
+    if(inc_link)
+        if(H5O_link(oloc_dst, 1, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to increment object link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_header_map() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_copy_free_addrmap_cb
+ PURPOSE
+    Internal routine to free address maps from the skip list for copying objects
+ USAGE
+    herr_t H5O_copy_free_addrmap_cb(item, key, op_data)
+        void *item;             IN/OUT: Pointer to addr
+        void *key;              IN/OUT: (unused)
+        void *op_data;          IN: (unused)
+ RETURNS
+    Returns zero on success, negative on failure.
+ DESCRIPTION
+        Releases the memory for the address.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_copy_free_addrmap_cb(void *_item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op_data)
+{
+    H5O_addr_map_t *item = (H5O_addr_map_t *)_item;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(item);
+
+    /* Release user data for particular type of object */
+    if(item->udata) {
+        HDassert(item->obj_class);
+        HDassert(item->obj_class->free_copy_file_udata);
+        (item->obj_class->free_copy_file_udata)(item->udata);
+    } /* end if */
+
+    /* Release the item */
+    item = H5FL_FREE(H5O_addr_map_t, item);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5O_copy_free_addrmap_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_header
+ *
+ * Purpose:     copy header object from one location to another.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              May 30, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_header(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
+    hid_t dxpl_id, hid_t ocpypl_id)
+{
+    H5O_copy_t  cpy_info;               /* Information for copying object */
+    H5P_genplist_t  *ocpy_plist;        /* Object copy property list created */
+    H5O_copy_dtype_merge_list_t *dt_list = NULL; /* List of datatype merge suggestions */
+    H5O_mcdt_cb_info_t   cb_info;      	/* Callback info struct */
+    unsigned    cpy_option = 0;         /* Copy options */
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(oloc_src);
+    HDassert(oloc_src->file);
+    HDassert(H5F_addr_defined(oloc_src->addr));
+    HDassert(oloc_dst->file);
+
+    /* Intialize copy info before errors can be thrown */
+    HDmemset(&cpy_info, 0, sizeof(H5O_copy_t));
+
+    /* Get the copy property list */
+    if(NULL == (ocpy_plist = (H5P_genplist_t *)H5I_object(ocpypl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Retrieve the copy parameters */
+    if(H5P_get(ocpy_plist, H5O_CPY_OPTION_NAME, &cpy_option) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object copy flag")
+
+    /* Retrieve the marge committed datatype list */
+    if(H5P_get(ocpy_plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge committed datatype list")
+
+    /* Get callback info */
+    if(H5P_get(ocpy_plist, H5O_CPY_MCDT_SEARCH_CB_NAME, &cb_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get callback info")
+
+    /* Convert copy flags into copy struct */
+    if((cpy_option & H5O_COPY_SHALLOW_HIERARCHY_FLAG) > 0) {
+        cpy_info.copy_shallow = TRUE;
+        cpy_info.max_depth = 1;
+    } /* end if */
+    else
+        cpy_info.max_depth = -1;        /* Current default is for full, recursive hier. copy */
+    cpy_info.curr_depth = 0;
+    if((cpy_option & H5O_COPY_EXPAND_SOFT_LINK_FLAG) > 0)
+        cpy_info.expand_soft_link = TRUE;
+    if((cpy_option & H5O_COPY_EXPAND_EXT_LINK_FLAG) > 0)
+        cpy_info.expand_ext_link = TRUE;
+    if((cpy_option & H5O_COPY_EXPAND_REFERENCE_FLAG) > 0)
+        cpy_info.expand_ref = TRUE;
+    if((cpy_option & H5O_COPY_WITHOUT_ATTR_FLAG) > 0)
+        cpy_info.copy_without_attr = TRUE;
+    if((cpy_option & H5O_COPY_PRESERVE_NULL_FLAG) > 0)
+        cpy_info.preserve_null = TRUE;
+    if((cpy_option & H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG) > 0)
+        cpy_info.merge_comm_dt = TRUE;
+
+    /* Add dt_list to copy struct */
+    cpy_info.dst_dt_suggestion_list = dt_list;
+
+    /* Add set callback information */
+    cpy_info.mcdt_cb = cb_info.func;
+    cpy_info.mcdt_ud = cb_info.user_data;
+
+    /* Create a skip list to keep track of which objects are copied */
+    if(NULL == (cpy_info.map_list = H5SL_create(H5SL_TYPE_OBJ, NULL)))
+        HGOTO_ERROR(H5E_SLIST, H5E_CANTCREATE, FAIL, "cannot make skip list")
+
+    /* copy the object from the source file to the destination file */
+    if(H5O_copy_header_real(oloc_src, oloc_dst, dxpl_id, &cpy_info, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+done:
+    if(cpy_info.map_list)
+        H5SL_destroy(cpy_info.map_list, H5O_copy_free_addrmap_cb, NULL);
+    if(cpy_info.dst_dt_list)
+        H5SL_destroy(cpy_info.dst_dt_list, H5O_copy_free_comm_dt_cb, NULL);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_header() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_obj
+ *
+ * Purpose:     Copy an object to destination location
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              June 4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_obj(H5G_loc_t *src_loc, H5G_loc_t *dst_loc, const char *dst_name,
+    hid_t ocpypl_id, hid_t lcpl_id, hid_t dxpl_id)
+{
+    H5G_name_t      new_path;                   /* Copied object group hier. path */
+    H5O_loc_t       new_oloc;                   /* Copied object object location */
+    H5G_loc_t       new_loc;                    /* Group location of object copied */
+    H5F_t           *cached_dst_file;           /* Cached destination file */
+    hbool_t         entry_inserted = FALSE;     /* Flag to indicate that the new entry was inserted into a group */
+    herr_t          ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(src_loc);
+    HDassert(src_loc->oloc->file);
+    HDassert(dst_loc);
+    HDassert(dst_loc->oloc->file);
+    HDassert(dst_name);
+
+    /* Set up copied object location to fill in */
+    new_loc.oloc = &new_oloc;
+    new_loc.path = &new_path;
+    H5G_loc_reset(&new_loc);
+    new_oloc.file = dst_loc->oloc->file;
+
+    /* Make a copy of the destination file, in case the original is changed by
+     * H5O_copy_header.  If and when oloc's point to the shared file struct,
+     * this will no longer be necessary, so this code can be removed. */
+    cached_dst_file = dst_loc->oloc->file;
+
+    /* Copy the object from the source file to the destination file */
+    if(H5O_copy_header(src_loc->oloc, &new_oloc, dxpl_id, ocpypl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+    /* Patch dst_loc.  Again, this can be removed once oloc's point to shared
+     * file structs. */
+    dst_loc->oloc->file = cached_dst_file;
+
+    /* Insert the new object in the destination file's group */
+    if(H5L_link(dst_loc, dst_name, &new_loc, lcpl_id, H5P_DEFAULT, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert link")
+    entry_inserted = TRUE;
+
+done:
+    /* Free the ID to name buffers */
+    if(entry_inserted)
+        H5G_loc_free(&new_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_obj() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_obj_by_ref
+ *
+ * Purpose:     Copy the object pointed by _src_ref.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              Aug 7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_obj_by_ref(H5O_loc_t *src_oloc, hid_t dxpl_id, H5O_loc_t *dst_oloc,
+    H5G_loc_t *dst_root_loc, H5O_copy_t *cpy_info)
+{
+    herr_t  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(src_oloc);
+    HDassert(dst_oloc);
+
+    /* Perform the copy, or look up existing copy */
+    if((ret_value = H5O_copy_header_map(src_oloc, dst_oloc, dxpl_id, cpy_info,
+            FALSE, NULL, NULL)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+    /* Check if a new valid object is copied to the destination */
+    if(H5F_addr_defined(dst_oloc->addr) && (ret_value > SUCCEED)) {
+        char    tmp_obj_name[80];
+        H5G_name_t      new_path;
+        H5O_loc_t       new_oloc;
+        H5G_loc_t       new_loc;
+
+        /* Set up group location for new object */
+        new_loc.oloc = &new_oloc;
+        new_loc.path = &new_path;
+        H5G_loc_reset(&new_loc);
+        new_oloc.file = dst_oloc->file;
+        new_oloc.addr = dst_oloc->addr;
+
+        /* Pick a default name for the new object */
+        HDsnprintf(tmp_obj_name, sizeof(tmp_obj_name), "~obj_pointed_by_%llu", (unsigned long long)dst_oloc->addr);
+
+        /* Create a link to the newly copied object */
+        /* Note: since H5O_copy_header_map actually copied the target object, it
+         * must exist either in cache or on disk, therefore it is is safe to not
+         * pass the obj_type and udata fields returned by H5O_copy_header_map.
+         * This could be changed in the future to slightly improve performance
+         * --NAF */
+        if(H5L_link(dst_root_loc, tmp_obj_name, &new_loc, H5P_DEFAULT, H5P_DEFAULT, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert link")
+
+        H5G_loc_free(&new_loc);
+    } /* if (H5F_addr_defined(dst_oloc.addr)) */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_obj_by_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_copy_expand_ref
+ *
+ * Purpose:	Copy the object pointed by _src_ref.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *		Aug 7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_copy_expand_ref(H5F_t *file_src, void *_src_ref, hid_t dxpl_id,
+    H5F_t *file_dst, void *_dst_ref, size_t ref_count, H5R_type_t ref_type,
+    H5O_copy_t *cpy_info)
+{
+    H5O_loc_t 	dst_oloc;         	/* Copied object object location */
+    H5O_loc_t	src_oloc;          	/* Temporary object location for source object */
+    H5G_loc_t   dst_root_loc;           /* The location of root group of the destination file */
+    const uint8_t *q;                   /* Pointer to source OID to store */
+    uint8_t     *p;                     /* Pointer to destination OID to store */
+    size_t      i;                      /* Local index variable */
+    herr_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(file_src);
+    HDassert(_src_ref);
+    HDassert(file_dst);
+    HDassert(_dst_ref);
+    HDassert(ref_count);
+    HDassert(cpy_info);
+
+    /* Initialize object locations */
+    H5O_loc_reset(&src_oloc);
+    H5O_loc_reset(&dst_oloc);
+    src_oloc.file = file_src;
+    dst_oloc.file = file_dst;
+
+    /* Set up the root group in the destination file */
+    if(NULL == (dst_root_loc.oloc = H5G_oloc(H5G_rootof(file_dst))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+    if(NULL == (dst_root_loc.path = H5G_nameof(H5G_rootof(file_dst))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+    /* Copy object references */
+    if(H5R_OBJECT == ref_type) {
+        hobj_ref_t *src_ref = (hobj_ref_t *)_src_ref;
+        hobj_ref_t *dst_ref = (hobj_ref_t *)_dst_ref;
+
+        /* Making equivalent references in the destination file */
+        for(i = 0; i < ref_count; i++) {
+            /* Set up for the object copy for the reference */
+            q = (uint8_t *)(&src_ref[i]);
+            H5F_addr_decode(src_oloc.file, (const uint8_t **)&q, &(src_oloc.addr));
+            dst_oloc.addr = HADDR_UNDEF;
+
+            /* Attempt to copy object from source to destination file */
+            if(src_oloc.addr != (haddr_t)0) {
+                if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+            } /* end if */
+            else
+                /* Set parameters so the reference is written as all 0's */
+                HDmemset(&dst_oloc.addr, 0, sizeof(dst_oloc.addr));
+
+            /* Set the object reference info for the destination file */
+            p = (uint8_t *)(&dst_ref[i]);
+            H5F_addr_encode(dst_oloc.file, &p, dst_oloc.addr);
+	} /* end for */
+    }  /* end if */
+    /* Copy region references */
+    else if(H5R_DATASET_REGION == ref_type) {
+        hdset_reg_ref_t *src_ref = (hdset_reg_ref_t *)_src_ref;
+        hdset_reg_ref_t *dst_ref = (hdset_reg_ref_t *)_dst_ref;
+        uint8_t *buf = NULL;    /* Buffer to store serialized selection in */
+        H5HG_t hobjid;          /* Heap object ID */
+        size_t buf_size;        /* Length of object in heap */
+
+        /* Making equivalent references in the destination file */
+        for(i = 0; i < ref_count; i++) {
+            /* Get the heap ID for the dataset region */
+            q = (const uint8_t *)(&src_ref[i]);
+            H5F_addr_decode(src_oloc.file, (const uint8_t **)&q, &(hobjid.addr));
+            UINT32DECODE(q, hobjid.idx);
+
+            if(hobjid.addr != (haddr_t)0) {
+                /* Get the dataset region from the heap (allocate inside routine) */
+                if((buf = (uint8_t *)H5HG_read(src_oloc.file, dxpl_id, &hobjid, NULL, &buf_size)) == NULL)
+                    HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
+
+                /* Get the object oid for the dataset */
+                q = (const uint8_t *)buf;
+                H5F_addr_decode(src_oloc.file, (const uint8_t **)&q, &(src_oloc.addr));
+                dst_oloc.addr = HADDR_UNDEF;
+
+                /* copy the object pointed by the ref to the destination */
+                if(H5O_copy_obj_by_ref(&src_oloc, dxpl_id, &dst_oloc, &dst_root_loc, cpy_info) < 0) {
+                    H5MM_xfree(buf);
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+                } /* end if */
+
+                /* Serialize object ID */
+                p = (uint8_t *)buf;
+                H5F_addr_encode(dst_oloc.file, &p, dst_oloc.addr);
+
+                /* Save the serialized buffer to the destination */
+                if(H5HG_insert(dst_oloc.file, dxpl_id, buf_size, buf, &hobjid) < 0) {
+                    H5MM_xfree(buf);
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "Unable to write dataset region information")
+                } /* end if */
+            } /* end if */
+            else
+                /* Set parameters so the reference is written as all 0's */
+                HDmemset(&hobjid, 0, sizeof(hobjid));
+
+            /* Set the dataset region reference info for the destination file */
+            p = (uint8_t *)(&dst_ref[i]);
+            H5F_addr_encode(dst_oloc.file, &p, hobjid.addr);
+            UINT32ENCODE(p, hobjid.idx);
+
+            /* Free the buffer allocated in H5HG_read() */
+            H5MM_xfree(buf);
+        } /* end for */
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_expand_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_free_comm_dt_cb
+ *
+ * Purpose:     Frees the merge committed dt skip list key and object.
+ *
+ * Return:      SUCCEED (never fails)
+ *
+ * Programmer:  Neil Fortner
+ *              Oct 6 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_free_comm_dt_cb(void *item, void *_key, void H5_ATTR_UNUSED *op_data)
+{
+    haddr_t     *addr = (haddr_t *)item;
+    H5O_copy_search_comm_dt_key_t *key = (H5O_copy_search_comm_dt_key_t *)_key;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(addr);
+    HDassert(key);
+    HDassert(key->dt);
+
+    key->dt = (H5T_t *)H5O_msg_free(H5O_DTYPE_ID, key->dt);
+    key = H5FL_FREE(H5O_copy_search_comm_dt_key_t, key);
+    addr = H5FL_FREE(haddr_t, addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_copy_free_comm_dt_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_comm_dt_cmp
+ *
+ * Purpose:     Skiplist callback used to compare 2 keys for the merge
+ *              committed dt list.  Mostly a wrapper for H5T_cmp.
+ *
+ * Return:      0 if key1 and key2 are equal.
+ *              <0 if key1 is less than key2.
+ *              >0 if key1 is greater than key2.
+ *
+ * Programmer:  Neil Fortner
+ *              Oct 6 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5O_copy_comm_dt_cmp(const void *_key1, const void *_key2)
+{
+    const H5O_copy_search_comm_dt_key_t *key1 = (const H5O_copy_search_comm_dt_key_t *)_key1;
+    const H5O_copy_search_comm_dt_key_t *key2 = (const H5O_copy_search_comm_dt_key_t *)_key2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check fileno.  It is unlikely to be different so check if they are equal
+     * first so only one comparison needs to be made. */
+    if(key1->fileno != key2->fileno) {
+        if(key1->fileno < key2->fileno)
+            HGOTO_DONE(-1)
+        if(key1->fileno > key2->fileno)
+            HGOTO_DONE(1)
+    } /* end if */
+
+    ret_value = H5T_cmp(key1->dt, key2->dt, FALSE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_comm_dt_cmp */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_search_comm_dt_attr_cb
+ *
+ * Purpose:     Callback for H5O_attr_iterate_real from
+ *              H5O_copy_search_comm_dt_check.  Checks if the attribute's
+ *              datatype is committed.  If it is, adds it to the merge
+ *              committed dt skiplist present in udata if it does not match
+ *              any already present.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Nov 3 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_search_comm_dt_attr_cb(const H5A_t *attr, void *_udata)
+{
+    H5O_copy_search_comm_dt_ud_t *udata = (H5O_copy_search_comm_dt_ud_t *)_udata;
+    H5T_t       *dt = NULL;             /* Datatype */
+    H5O_copy_search_comm_dt_key_t *key = NULL; /* Skiplist key */
+    haddr_t     *addr = NULL;           /* Destination address */
+    hbool_t     obj_inserted = FALSE;   /* Object inserted into skip list */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(attr);
+    HDassert(udata);
+    HDassert(udata->dst_dt_list);
+    HDassert(H5F_addr_defined(udata->obj_oloc.addr));
+
+    /* Get attribute datatype */
+    if(NULL == (dt = H5A_type(attr)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get attribute datatype")
+
+    /* Check if the datatype is committed and search the skip list if so */
+    if(H5T_committed(dt)) {
+        /* Allocate key */
+        if(NULL == (key = H5FL_MALLOC(H5O_copy_search_comm_dt_key_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Copy datatype into key */
+        if(NULL == (key->dt = (H5T_t *)H5O_msg_copy(H5O_DTYPE_ID, dt, NULL)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to copy datatype message")
+
+        /* Get datatype object fileno */
+        H5F_GET_FILENO(udata->obj_oloc.file, key->fileno);
+
+        if(!H5SL_search(udata->dst_dt_list, key)) {
+            /* Allocate destination address */
+            if(NULL == (addr = H5FL_MALLOC(haddr_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Add the destination datatype to the skip list */
+            *addr = ((H5O_shared_t *)(key->dt))->u.loc.oh_addr;
+            if(H5SL_insert(udata->dst_dt_list, addr, key) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+            obj_inserted = TRUE;
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(!obj_inserted) {
+        if(key) {
+            if(key->dt)
+                key->dt = (H5T_t *)H5O_msg_free(H5O_DTYPE_ID, key->dt);
+            key = H5FL_FREE(H5O_copy_search_comm_dt_key_t, key);
+        } /* end if */
+        if(addr) {
+            HDassert(ret_value < 0);
+            addr = H5FL_FREE(haddr_t, addr);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_search_comm_dt_attr_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_search_comm_dt_check
+ *
+ * Purpose:     Check if the object at obj_oloc is or contains a reference
+ *              to a committed datatype.  If it does, adds it to the merge
+ *              committed dt skiplist present in udata if it does not match
+ *              any already present.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Nov 3 2011
+ *
+ * Modifications:
+ *	Vailin Choi; August 2012
+ *	Use H5O_obj_class to get object type instead of
+ *	H5O_get_info(...TRUE....) saving time in traversing metadata.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_search_comm_dt_check(H5O_loc_t *obj_oloc,
+    H5O_copy_search_comm_dt_ud_t *udata)
+{
+    H5O_copy_search_comm_dt_key_t *key = NULL; /* Skiplist key */
+    haddr_t     *addr = NULL;           /* Destination address */
+    hbool_t     obj_inserted = FALSE;   /* Object inserted into skip list */
+    H5A_attr_iter_op_t attr_op;         /* Attribute iteration operator */
+    const H5O_obj_class_t  *obj_class = NULL;       /* Type of object */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(obj_oloc);
+    HDassert(udata);
+    HDassert(udata->dst_dt_list);
+    HDassert(udata->dst_root_loc);
+
+    /* Get pointer to object class for this object */
+    if((obj_class = H5O_obj_class(obj_oloc, udata->dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type")
+
+    /* Check if the object is a datatype, a dataset using a committed
+     * datatype, or contains an attribute using a committed datatype */
+    if(obj_class->type == H5O_TYPE_NAMED_DATATYPE) {
+        /* Allocate key */
+        if(NULL == (key = H5FL_MALLOC(H5O_copy_search_comm_dt_key_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Read the destination datatype */
+        if(NULL == (key->dt = (H5T_t *)H5O_msg_read(obj_oloc, H5O_DTYPE_ID, NULL, udata->dxpl_id)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read DTYPE message")
+
+        /* Get destination object fileno */
+        H5F_GET_FILENO(obj_oloc->file, key->fileno);
+
+        /* Check if the datatype is already present in the skip list */
+        if(!H5SL_search(udata->dst_dt_list, key)) {
+            /* Allocate destination address */
+            if(NULL == (addr = H5FL_MALLOC(haddr_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Add the destination datatype to the skip list */
+            *addr = obj_oloc->addr;
+            if(H5SL_insert(udata->dst_dt_list, addr, key) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+            obj_inserted = TRUE;
+        } /* end if */
+    } /* end if */
+    else if(obj_class->type == H5O_TYPE_DATASET) {
+        /* Allocate key */
+        if(NULL == (key = H5FL_MALLOC(H5O_copy_search_comm_dt_key_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Read the destination datatype */
+        if(NULL == (key->dt = (H5T_t *)H5O_msg_read(obj_oloc, H5O_DTYPE_ID, NULL, udata->dxpl_id)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read DTYPE message")
+
+        /* Check if the datatype is committed and search the skip list if so
+            */
+        if(H5T_committed(key->dt)) {
+            /* Get datatype object fileno */
+            H5F_GET_FILENO(obj_oloc->file, key->fileno);
+
+            if(!H5SL_search(udata->dst_dt_list, key)) {
+                /* Allocate destination address */
+                if(NULL == (addr = H5FL_MALLOC(haddr_t)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                /* Add the destination datatype to the skip list */
+                *addr = ((H5O_shared_t *)(key->dt))->u.loc.oh_addr;
+                if(H5SL_insert(udata->dst_dt_list, addr, key) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+                obj_inserted = TRUE;
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Search within attributes */
+    attr_op.op_type = H5A_ATTR_OP_LIB;
+    attr_op.u.lib_op = H5O_copy_search_comm_dt_attr_cb;
+    udata->obj_oloc.file = obj_oloc->file;
+    udata->obj_oloc.addr = obj_oloc->addr;
+    if(H5O_attr_iterate_real((hid_t)-1, obj_oloc, udata->dxpl_id, H5_INDEX_NAME, 
+                             H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, udata) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "error iterating over attributes");
+
+done:
+    /* Release resources */
+    if(!obj_inserted) {
+        if(key) {
+            if(key->dt)
+                key->dt = (H5T_t *)H5O_msg_free(H5O_DTYPE_ID, key->dt);
+            key = H5FL_FREE(H5O_copy_search_comm_dt_key_t, key);
+        } /* end if */
+        if(addr) {
+            HDassert(ret_value < 0);
+            addr = H5FL_FREE(haddr_t, addr);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_search_comm_dt_check */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_search_comm_dt_cb
+ *
+ * Purpose:     H5G_visit callback to add committed datatypes to the merge
+ *              committed dt skiplist.  Mostly a wrapper for
+ *              H5O_copy_search_comm_dt_check.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Oct 6 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_search_comm_dt_cb(hid_t H5_ATTR_UNUSED group, const char *name,
+    const H5L_info_t *linfo, void *_udata)
+{
+    H5O_copy_search_comm_dt_ud_t *udata = (H5O_copy_search_comm_dt_ud_t *)_udata; /* Skip list of dtypes in dest file */
+    H5G_loc_t   obj_loc;                /* Location of object */
+    H5O_loc_t   obj_oloc;               /* Object's object location */
+    H5G_name_t  obj_path;               /* Object's group hier. path */
+    hbool_t     obj_found = FALSE;      /* Object at 'name' found */
+    herr_t      ret_value = H5_ITER_CONT; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(name);
+    HDassert(linfo);
+    HDassert(udata);
+    HDassert(udata->dst_dt_list);
+    HDassert(udata->dst_root_loc);
+
+    /* Check if this is a hard link */
+    if(linfo->type == H5L_TYPE_HARD) {
+        /* Set up opened group location to fill in */
+        obj_loc.oloc = &obj_oloc;
+        obj_loc.path = &obj_path;
+        H5G_loc_reset(&obj_loc);
+
+        /* Find the object */
+        if(H5G_loc_find(udata->dst_root_loc, name, &obj_loc/*out*/, H5P_LINK_ACCESS_DEFAULT, udata->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, H5_ITER_ERROR, "object not found")
+        obj_found = TRUE;
+
+        /* Check object and add to skip list if appropriate */
+        if(H5O_copy_search_comm_dt_check(&obj_oloc, udata) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5_ITER_ERROR, "can't check object")
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(obj_found && H5G_loc_free(&obj_loc) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, H5_ITER_ERROR, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_search_comm_dt_cb */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_search_comm_dt
+ *
+ * Purpose:     Checks if the committed datatype present in oh_src matches any
+ *              in the destination file, building the destination file
+ *              skiplist as necessary.
+ *
+ * Return:      TRUE if a match is found in the destination file
+ *                      - oloc_dst will contain the address
+ *              FALSE if a match is not found
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Sep 27 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_copy_search_comm_dt(H5F_t *file_src, H5O_t *oh_src,
+    H5O_loc_t *oloc_dst/*in, out*/, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    H5O_copy_search_comm_dt_key_t *key = NULL; /* Skiplist key */
+    haddr_t     *dst_addr;      /* Destination datatype address */
+    H5G_loc_t   dst_root_loc = {NULL, NULL}; /* Destination root group location */
+    H5O_copy_search_comm_dt_ud_t udata; /* Group iteration user data */
+    herr_t      ret_value = FALSE; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(oh_src);
+    HDassert(oloc_dst);
+    HDassert(oloc_dst->file);
+    HDassert(H5F_FILE_ID(oloc_dst->file) >= 0);
+    HDassert(cpy_info);
+
+    /* Allocate key */
+    if(NULL == (key = H5FL_MALLOC(H5O_copy_search_comm_dt_key_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Read the source datatype */
+    if(NULL == (key->dt = (H5T_t *)H5O_msg_read_oh(file_src, dxpl_id, oh_src, H5O_DTYPE_ID, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read DTYPE message")
+
+    /* Get destination object fileno */
+    H5F_GET_FILENO(oloc_dst->file, key->fileno);
+
+    /* Check if the destination dtype list exists, create it if it does not */
+    if(!cpy_info->dst_dt_list) {
+        /* Create the skip list */
+        if(NULL == (cpy_info->dst_dt_list = H5SL_create(H5SL_TYPE_GENERIC, H5O_copy_comm_dt_cmp)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create skip list for committed datatypes")
+
+        /* Add suggested types to list, if they are present */
+        if(cpy_info->dst_dt_suggestion_list) {
+            H5O_copy_dtype_merge_list_t *suggestion = cpy_info->dst_dt_suggestion_list;
+            H5G_loc_t   obj_loc;                /* Location of object */
+            H5O_loc_t   obj_oloc;               /* Object's object location */
+            H5G_name_t  obj_path;               /* Object's group hier. path */
+
+            /* Set up the root group in the destination file */
+            if(NULL == (dst_root_loc.oloc = H5G_oloc(H5G_rootof(oloc_dst->file))))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+            if(NULL == (dst_root_loc.path = H5G_nameof(H5G_rootof(oloc_dst->file))))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+            /* Set up opened group location to fill in */
+            obj_loc.oloc = &obj_oloc;
+            obj_loc.path = &obj_path;
+            H5G_loc_reset(&obj_loc);
+
+            /* Build udata */
+            udata.dst_dt_list = cpy_info->dst_dt_list;
+            udata.dst_root_loc = &dst_root_loc;
+            udata.obj_oloc.file = NULL;
+            udata.obj_oloc.addr = HADDR_UNDEF;
+            udata.dxpl_id = dxpl_id;
+
+            /* Walk through the list of datatype suggestions */
+            while(suggestion) {
+                /* Find the object */
+                if(H5G_loc_find(&dst_root_loc, suggestion->path, &obj_loc/*out*/, H5P_LINK_ACCESS_DEFAULT, dxpl_id) < 0)
+                    /* Ignore errors - i.e. suggestions not present in
+                     * destination file */
+                    H5E_clear_stack(NULL);
+                else
+                    /* Check object and add to skip list if appropriate */
+                    if(H5O_copy_search_comm_dt_check(&obj_oloc, &udata) < 0) {
+                        if(H5G_loc_free(&obj_loc) < 0)
+                            HERROR(H5E_OHDR, H5E_CANTRELEASE, "can't free location");
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't check object")
+                    } /* end if */
+
+                /* Free location */
+                if(H5G_loc_free(&obj_loc) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location");
+
+                /* Advance the suggestion pointer */
+                suggestion = suggestion->next;
+            } /* end while */
+        } /* end if */
+    }
+
+    if(!cpy_info->dst_dt_list_complete) {
+        /* Search for the type in the destination file, and return its address
+         * if found, but only if the list is populated with and only with
+         * suggested types.  We will search complete lists later. */
+        if(cpy_info->dst_dt_suggestion_list
+                && NULL != (dst_addr = (haddr_t *)H5SL_search(
+                cpy_info->dst_dt_list, key))) {
+            oloc_dst->addr = *dst_addr;
+            ret_value = TRUE;
+        } /* end if */
+        else {
+            H5O_mcdt_search_ret_t search_cb_ret = H5O_MCDT_SEARCH_CONT;
+
+            /* Make callback to see if we should search destination file */
+            if(cpy_info->mcdt_cb)
+                if((search_cb_ret = cpy_info->mcdt_cb(cpy_info->mcdt_ud)) == H5O_MCDT_SEARCH_ERROR)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CALLBACK, FAIL, "callback returned error")
+
+            if(search_cb_ret == H5O_MCDT_SEARCH_CONT) {
+                /* Build the complete dst dt list */
+                /* Set up the root group in the destination file, if necessary */
+                if(!dst_root_loc.oloc) {
+                    HDassert(!dst_root_loc.path);
+                    if(NULL == (dst_root_loc.oloc = H5G_oloc(H5G_rootof(oloc_dst->file))))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+                    if(NULL == (dst_root_loc.path = H5G_nameof(H5G_rootof(oloc_dst->file))))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group")
+                } /* end if */
+                else
+                    HDassert(dst_root_loc.path);
+
+                /* Build udata.  Note that this may be done twice in some cases, but
+                * it should be rare and should be cheaper on average than trying to
+                * keep track of whether it was done before. */
+                udata.dst_dt_list = cpy_info->dst_dt_list;
+                udata.dst_root_loc = &dst_root_loc;
+                udata.obj_oloc.file = NULL;
+                udata.obj_oloc.addr = HADDR_UNDEF;
+                udata.dxpl_id = dxpl_id;
+
+                /* Traverse the destination file, adding committed datatypes to the skip
+                * list */
+                if(H5G_visit(H5F_FILE_ID(oloc_dst->file), "/", H5_INDEX_NAME, H5_ITER_NATIVE, H5O_copy_search_comm_dt_cb, &udata, H5P_LINK_ACCESS_DEFAULT, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
+                cpy_info->dst_dt_list_complete = TRUE;
+            } /* end if */
+            else
+                if(search_cb_ret != H5O_MCDT_SEARCH_STOP)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown return value for callback")
+        } /* end if */
+    } /* end if */
+
+    /* Search for the type in the destination file, and return its address if
+     * found, but only if the list is complete */
+    if(cpy_info->dst_dt_list_complete) {
+        if(NULL != (dst_addr = (haddr_t *)H5SL_search(cpy_info->dst_dt_list, key))) {
+            oloc_dst->addr = *dst_addr;
+            ret_value = TRUE;
+        } /* end if */
+    } /* end if */
+
+done:
+    if(key) {
+        if(key->dt)
+            key->dt = (H5T_t *)H5O_msg_free(H5O_DTYPE_ID, key->dt);
+        key = H5FL_FREE(H5O_copy_search_comm_dt_key_t, key);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_search_comm_dt */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_copy_insert_comm_dt
+ *
+ * Purpose:     Insert the committed datatype at oloc_dst into the merge committed
+ *              dt skiplist.  The datatype must not be present already.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Oct 6 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_insert_comm_dt(H5F_t *file_src, H5O_t *oh_src, H5O_loc_t *oloc_dst,
+    hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    H5O_copy_search_comm_dt_key_t *key = NULL; /* Skiplist key */
+    haddr_t     *addr = NULL;   /* Destination object address */
+    herr_t      ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(oh_src);
+    HDassert(oloc_dst);
+    HDassert(oloc_dst->file);
+    HDassert(oloc_dst->addr != HADDR_UNDEF);
+    HDassert(cpy_info);
+    HDassert(cpy_info->dst_dt_list);
+
+    /* Allocate key */
+    if(NULL == (key = H5FL_MALLOC(H5O_copy_search_comm_dt_key_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Read the datatype.  Read from the source file because the destination
+     * object could be changed in the post-copy. */
+    if(NULL == (key->dt = (H5T_t *)H5O_msg_read_oh(file_src, dxpl_id, oh_src, H5O_DTYPE_ID, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't read DTYPE message")
+
+    /* Get destination object fileno */
+    H5F_GET_FILENO(oloc_dst->file, key->fileno);
+
+    /* Allocate destination address */
+    if(NULL == (addr = H5FL_MALLOC(haddr_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Add the destination datatype to the skip list */
+    *addr = oloc_dst->addr;
+    if(H5SL_insert(cpy_info->dst_dt_list, addr, key) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
+
+done:
+    if(ret_value < 0) {
+        if(key) {
+            if(key->dt)
+                key->dt = (H5T_t *)H5O_msg_free(H5O_DTYPE_ID, key->dt);
+            key = H5FL_FREE(H5O_copy_search_comm_dt_key_t, key);
+        } /* end if */
+        if(addr)
+            addr = H5FL_FREE(haddr_t, addr);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_insert_comm_dt */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Odbg.c b/gatb-core/thirdparty/hdf5/src/H5Odbg.c
new file mode 100644
index 0000000..0531a90
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Odbg.c
@@ -0,0 +1,581 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Odbg.c
+ *			Nov 17 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object header debugging routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Ppublic.h"		/* Property Lists			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+#ifdef H5O_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_assert
+ *
+ * Purpose:	Sanity check the information for an object header data
+ *              structure.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Oct 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_assert(const H5O_t *oh)
+{
+    H5O_mesg_t *curr_msg;               /* Pointer to current message to examine */
+    H5O_mesg_t *tmp_msg;                /* Pointer to temporary message to examine */
+    unsigned cont_msgs_found = 0;       /* # of continuation messages for object */
+    size_t meta_space;                  /* Size of header metadata */
+    size_t mesg_space;                  /* Size of message raw data */
+    size_t free_space;                  /* Size of free space in header */
+    size_t hdr_size;                    /* Size of header's chunks */
+    unsigned u, v;                      /* Local index variables */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Initialize the tracking variables */
+    hdr_size = 0;
+    meta_space = (size_t)H5O_SIZEOF_HDR(oh) + (size_t)(H5O_SIZEOF_CHKHDR_OH(oh) * (oh->nchunks - 1));
+    mesg_space = 0;
+    free_space = 0;
+
+    /* Loop over all chunks in object header */
+    for(u = 0; u < oh->nchunks; u++) {
+        /* Accumulate the size of the header on header */
+        hdr_size += oh->chunk[u].size;
+
+        /* If the chunk has a gap, add it to the free space */
+        free_space += oh->chunk[u].gap;
+
+        /* Check for valid raw data image */
+        HDassert(oh->chunk[u].image);
+        HDassert(oh->chunk[u].size > (size_t)H5O_SIZEOF_CHKHDR_OH(oh));
+
+        /* All chunks must be allocated on disk */
+        HDassert(H5F_addr_defined(oh->chunk[u].addr));
+
+        /* Version specific checks */
+        if(oh->version > H5O_VERSION_1) {
+            /* Make certain that the magic number is correct for each chunk */
+            HDassert(!HDmemcmp(oh->chunk[u].image, (u == 0 ? H5O_HDR_MAGIC : H5O_CHK_MAGIC), H5_SIZEOF_MAGIC));
+
+            /* Check for valid gap size */
+            HDassert(oh->chunk[u].gap < (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+        } /* end if */
+        else
+            /* Gaps should never occur in version 1 of the format */
+            HDassert(oh->chunk[u].gap == 0);
+    } /* end for */
+
+    /* Check for correct chunk #0 size flags */
+    if(oh->version > H5O_VERSION_1) {
+        uint64_t chunk0_size = oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh);
+
+        if(chunk0_size <= 255)
+            HDassert((oh->flags & H5O_HDR_CHUNK0_SIZE) == H5O_HDR_CHUNK0_1);
+        else if(chunk0_size <= 65535)
+            HDassert((oh->flags & H5O_HDR_CHUNK0_SIZE) == H5O_HDR_CHUNK0_2);
+        else if(chunk0_size <= 4294967295)
+            HDassert((oh->flags & H5O_HDR_CHUNK0_SIZE) == H5O_HDR_CHUNK0_4);
+        else
+            HDassert((oh->flags & H5O_HDR_CHUNK0_SIZE) == H5O_HDR_CHUNK0_8);
+    } /* end if */
+
+    /* Loop over all messages in object header */
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
+        uint8_t *curr_hdr;      /* Start of current message header */
+        size_t  curr_tot_size;  /* Total size of current message (including header) */
+
+        curr_hdr = curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh);
+        curr_tot_size = curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+
+        /* Accumulate information, based on the type of message */
+	if(H5O_NULL_ID == curr_msg->type->id)
+            free_space += curr_tot_size;
+        else if(H5O_CONT_ID == curr_msg->type->id) {
+            H5O_cont_t *cont = (H5O_cont_t *)curr_msg->native;
+            hbool_t found_chunk = FALSE;        /* Found a chunk that matches */
+
+            HDassert(cont);
+
+            /* Increment # of continuation messages found */
+            cont_msgs_found++;
+
+            /* Sanity check that every continuation message has a matching chunk */
+            /* (and only one) */
+            for(v = 0; v < oh->nchunks; v++) {
+                if(H5F_addr_eq(cont->addr, oh->chunk[v].addr) && cont->size == oh->chunk[v].size) {
+                    HDassert(cont->chunkno == v);
+                    HDassert(!found_chunk);
+                    found_chunk = TRUE;
+                } /* end if */
+            } /* end for */
+            HDassert(found_chunk);
+
+            meta_space += curr_tot_size;
+        } /* end if */
+        else {
+            meta_space += (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+            mesg_space += curr_msg->raw_size;
+
+            /* Make sure the message has a native form if it is marked dirty */
+            HDassert(curr_msg->native || !curr_msg->dirty);
+        } /* end else */
+
+        /* Make certain that the message is in a valid chunk */
+        HDassert(curr_msg->chunkno < oh->nchunks);
+
+        /* Make certain null messages aren't in chunks with gaps */
+        if(H5O_NULL_ID == curr_msg->type->id)
+            HDassert(oh->chunk[curr_msg->chunkno].gap == 0);
+
+        /* Make certain that the message is completely in a chunk message area */
+        HDassert(curr_tot_size <= (oh->chunk[curr_msg->chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[curr_msg->chunkno].gap));
+        if(curr_msg->chunkno == 0)
+            HDassert(curr_hdr >= oh->chunk[curr_msg->chunkno].image + (H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+        else
+            HDassert(curr_hdr >= oh->chunk[curr_msg->chunkno].image + (H5O_SIZEOF_CHKHDR_OH(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+        HDassert(curr_msg->raw + curr_msg->raw_size <= (oh->chunk[curr_msg->chunkno].image + oh->chunk[curr_msg->chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[curr_msg->chunkno].gap));
+
+        /* Make certain that no other messages overlap this message */
+        for(v = 0, tmp_msg = &oh->mesg[0]; v < oh->nmesgs; v++, tmp_msg++) {
+            if(u != v)
+                HDassert(!((tmp_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)) >= curr_hdr
+                        && (tmp_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh))
+                        < (curr_hdr + curr_tot_size)));
+        } /* end for */
+    } /* end for */
+
+    /* Sanity check that the # of cont. messages is correct for the # of chunks */
+    HDassert(oh->nchunks == (cont_msgs_found + 1));
+
+    /* Sanity check that all the bytes are accounted for */
+    HDassert(hdr_size == (free_space + meta_space + mesg_space));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_assert() */
+#endif /* H5O_DEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_debug_id
+ *
+ * Purpose:	Act as a proxy for calling the 'debug' method for a
+ *              particular class of object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 13 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_debug_id(unsigned type_id, H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream, int indent, int fwidth)
+{
+    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
+    herr_t      ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->debug);
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Call the debug method in the class */
+    if((ret_value = (type->debug)(f, dxpl_id, mesg, stream, indent, fwidth)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "unable to debug message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_debug_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_debug_real
+ *
+ * Purpose:	Prints debugging info about an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ * Modifications:
+ *   Feb. 2009: Vailin Choi
+ *	Fixed bug in the accumulation of chunk_total
+ *	Used the appropriate flag when printing creation order tracked/indexed
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, int indent, int fwidth)
+{
+    size_t	mesg_total = 0, chunk_total = 0, gap_total = 0;
+    unsigned	*sequence = NULL;
+    unsigned	i;              /* Local index variable */
+    herr_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* debug */
+    HDfprintf(stream, "%*sObject Header...\n", indent, "");
+
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Dirty:",
+	      oh->cache_info.is_dirty);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Version:",
+	      oh->version);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Header size (in bytes):",
+	      (unsigned)H5O_SIZEOF_HDR(oh));
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of links:",
+	      oh->nlink);
+
+    /* Extra information for later versions */
+    if(oh->version > H5O_VERSION_1) {
+        /* Display object's status flags */
+	HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		   "Attribute creation order tracked:",
+		   (oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED) ? "Yes" : "No");
+	HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		   "Attribute creation order indexed:",
+		   (oh->flags & H5O_HDR_ATTR_CRT_ORDER_INDEXED) ? "Yes" : "No");
+	HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		   "Attribute storage phase change values:",
+		   (oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) ? "Non-default" : "Default");
+	HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		   "Timestamps:",
+		   (oh->flags & H5O_HDR_STORE_TIMES) ? "Enabled" : "Disabled");
+        if(oh->flags & ~H5O_HDR_ALL_FLAGS)
+            HDfprintf(stream, "*** UNKNOWN OBJECT HEADER STATUS FLAG: %02x!\n",
+                (unsigned)oh->flags);
+
+        /* Only dump times, if they are tracked */
+        if(oh->flags & H5O_HDR_STORE_TIMES) {
+            struct tm *tm;          /* Time structure */
+            char buf[128];          /* Buffer for formatting time info */
+
+            /* Time fields */
+            tm = HDlocaltime(&oh->atime);
+            HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Access Time:", buf);
+            tm = HDlocaltime(&oh->mtime);
+            HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Modification Time:", buf);
+            tm = HDlocaltime(&oh->ctime);
+            HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Change Time:", buf);
+            tm = HDlocaltime(&oh->btime);
+            HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Birth Time:", buf);
+        } /* end if */
+
+        /* Attribute tracking fields */
+        if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
+            HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+                      "Max. compact attributes:",
+                      (unsigned)oh->max_compact);
+            HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+                      "Min. dense attributes:",
+                      (unsigned)oh->min_dense);
+        } /* end if */
+    } /* end if */
+
+    HDfprintf(stream, "%*s%-*s %Zu (%Zu)\n", indent, "", fwidth,
+	      "Number of messages (allocated):",
+	      oh->nmesgs, oh->alloc_nmesgs);
+    HDfprintf(stream, "%*s%-*s %Zu (%Zu)\n", indent, "", fwidth,
+	      "Number of chunks (allocated):",
+	      oh->nchunks, oh->alloc_nchunks);
+
+    /* debug each chunk */
+    for(i = 0, chunk_total = 0; i < oh->nchunks; i++) {
+        size_t chunk_size;
+
+	HDfprintf(stream, "%*sChunk %d...\n", indent, "", i);
+
+	HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Address:",
+                  oh->chunk[i].addr);
+
+        /* Decrement chunk 0's size by the object header prefix size */
+	if(0 == i) {
+            if(H5F_addr_ne(oh->chunk[i].addr, addr))
+                HDfprintf(stream, "*** WRONG ADDRESS FOR CHUNK #0!\n");
+            chunk_size = oh->chunk[i].size - (size_t)H5O_SIZEOF_HDR(oh);
+        } /* end if */
+        else
+            chunk_size = oh->chunk[i].size;
+
+        /* Accumulate chunk's size to total */
+	chunk_total += chunk_size;
+	gap_total += oh->chunk[i].gap;
+
+	HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Size in bytes:",
+		  chunk_size);
+
+	HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Gap:",
+                  oh->chunk[i].gap);
+    } /* end for */
+
+    /* debug each message */
+    if(NULL == (sequence = (unsigned *)H5MM_calloc(NELMTS(H5O_msg_class_g) * sizeof(unsigned))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    for(i = 0, mesg_total = 0; i < oh->nmesgs; i++) {
+        const H5O_msg_class_t  *debug_type;              /* Type of message to use for callbacks */
+        unsigned chunkno;                       /* Chunk for message */
+
+        /* Accumulate message's size to total */
+	mesg_total += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[i].raw_size;
+
+	/* For version 2 object header, add size of "OCHK" for continuation chunk */
+	if (oh->mesg[i].type->id == H5O_CONT_ID)
+	    mesg_total += H5O_SIZEOF_CHKHDR_OH(oh);
+
+	HDfprintf(stream, "%*sMessage %d...\n", indent, "", i);
+
+	/* check for bad message id */
+	if(oh->mesg[i].type->id >= (int)NELMTS(H5O_msg_class_g)) {
+	    HDfprintf(stream, "*** BAD MESSAGE ID 0x%04x\n",
+		      oh->mesg[i].type->id);
+	    continue;
+	} /* end if */
+
+	/* message name and size */
+	HDfprintf(stream, "%*s%-*s 0x%04x `%s' (%d)\n",
+		  indent + 3, "", MAX(0, fwidth - 3),
+		  "Message ID (sequence number):",
+		  (unsigned) (oh->mesg[i].type->id),
+		  oh->mesg[i].type->name,
+		  sequence[oh->mesg[i].type->id]++);
+	HDfprintf(stream, "%*s%-*s %t\n", indent + 3, "", MAX (0, fwidth - 3),
+		   "Dirty:",
+		   oh->mesg[i].dirty);
+        HDfprintf(stream, "%*s%-*s ", indent + 3, "", MAX (0, fwidth - 3),
+                   "Message flags:");
+	if(oh->mesg[i].flags) {
+            hbool_t flag_printed = FALSE;
+
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_SHARED) {
+                HDfprintf(stream, "<S");
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_CONSTANT) {
+                HDfprintf(stream, "%sC", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_DONTSHARE) {
+                HDfprintf(stream, "%sDS", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE) {
+                HDfprintf(stream, "%sFIU", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN) {
+                HDfprintf(stream, "%sMIU", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_WAS_UNKNOWN) {
+                HDassert(oh->mesg[i].flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN);
+                HDfprintf(stream, "%sWU", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(!flag_printed)
+                HDfprintf(stream, "-");
+            HDfprintf(stream, ">\n");
+            if(oh->mesg[i].flags & ~H5O_MSG_FLAG_BITS)
+                HDfprintf(stream, "%*s%-*s 0x%02x\n", indent + 3,"", MAX(0, fwidth - 3),
+                           "*** ADDITIONAL UNKNOWN FLAGS --->",
+                           oh->mesg[i].flags & ~H5O_MSG_FLAG_BITS);
+        } /* end if */
+        else
+            HDfprintf(stream, "<none>\n");
+	HDfprintf(stream, "%*s%-*s %u\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Chunk number:",
+		  oh->mesg[i].chunkno);
+	chunkno = oh->mesg[i].chunkno;
+	if(chunkno >= oh->nchunks)
+	    HDfprintf(stream, "*** BAD CHUNK NUMBER\n");
+	HDfprintf(stream, "%*s%-*s (%Zu, %Zu) bytes\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Raw message data (offset, size) in chunk:",
+		  (size_t)(oh->mesg[i].raw - oh->chunk[chunkno].image),
+		  oh->mesg[i].raw_size);
+
+	/* check the size */
+	if((oh->mesg[i].raw + oh->mesg[i].raw_size >
+                 oh->chunk[chunkno].image + oh->chunk[chunkno].size) ||
+                (oh->mesg[i].raw < oh->chunk[chunkno].image))
+	    HDfprintf(stream, "*** BAD MESSAGE RAW ADDRESS\n");
+
+	/* decode the message */
+	debug_type = oh->mesg[i].type;
+	if(NULL == oh->mesg[i].native && debug_type->decode)
+            H5O_LOAD_NATIVE(f, dxpl_id, H5O_DECODEIO_NOCHANGE, oh, &oh->mesg[i], FAIL)
+
+	/* print the message */
+	HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Message Information:");
+	if(debug_type->debug && oh->mesg[i].native != NULL)
+	    (debug_type->debug)(f, dxpl_id, oh->mesg[i].native, stream, indent + 6, MAX(0, fwidth - 6));
+	else
+	    HDfprintf(stream, "%*s<No info for this message>\n", indent + 6, "");
+    } /* end for */
+
+    if((mesg_total + gap_total) != chunk_total)
+	HDfprintf(stream, "*** TOTAL SIZE DOES NOT MATCH ALLOCATED SIZE!\n");
+
+done:
+    /* Release resources */
+    if(sequence)
+        sequence = (unsigned *)H5MM_xfree(sequence);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_debug_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_debug
+ *
+ * Purpose:	Prints debugging info about an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth)
+{
+    H5O_t	*oh = NULL;             /* Object header to display */
+    H5O_loc_t   loc;                    /* Object location for object to delete */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Set up the object location */
+    loc.file = f;
+    loc.addr = addr;
+    loc.holding_file = FALSE;
+
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* debug */
+    H5O_debug_real(f, dxpl_id, oh, addr, stream, indent, fwidth);
+
+done:
+    if(oh && H5O_unprotect(&loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Odrvinfo.c b/gatb-core/thirdparty/hdf5/src/H5Odrvinfo.c
new file mode 100644
index 0000000..73cb7cc
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Odrvinfo.c
@@ -0,0 +1,314 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Thursday, March  1, 2007
+ *
+ * Purpose:	A message holding driver info settings
+ *              in the superblock extension.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+static void  *H5O_drvinfo_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_drvinfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void  *H5O_drvinfo_copy(const void *_mesg, void *_dest);
+static size_t H5O_drvinfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_drvinfo_reset(void *_mesg);
+static herr_t H5O_drvinfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_DRVINFO[1] = {{
+    H5O_DRVINFO_ID,             /*message id number                     */
+    "driver info",		/*message name for debugging            */
+    sizeof(H5O_drvinfo_t),	/*native message size                   */
+    0,				/* messages are sharable?       */
+    H5O_drvinfo_decode,		/*decode message                        */
+    H5O_drvinfo_encode,		/*encode message                        */
+    H5O_drvinfo_copy,           /*copy the native value                 */
+    H5O_drvinfo_size,		/*raw message size			*/
+    H5O_drvinfo_reset,          /*free internal memory			*/
+    NULL,                       /* free method				*/
+    NULL,			/* file delete method			*/
+    NULL,			/* link method				*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		        */
+    NULL,			/* pre copy native value to file	*/
+    NULL,			/* copy native value to file		*/
+    NULL,			/* post copy native value to file	*/
+    NULL,			/* get creation index		        */
+    NULL,			/* set creation index		        */
+    H5O_drvinfo_debug           /*debug the message			*/
+}};
+
+/* Current version of driver info information */
+#define H5O_DRVINFO_VERSION 	0
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_drvinfo_decode
+ *
+ * Purpose:	Decode a shared message table message and return a pointer
+ *              to a newly allocated H5O_drvinfo_t struct.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_drvinfo_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_drvinfo_t	*mesg;          /* Native message */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_DRVINFO_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (mesg = (H5O_drvinfo_t *)H5MM_calloc(sizeof(H5O_drvinfo_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for driver info message")
+
+    /* Retrieve driver name */
+    HDmemcpy(mesg->name, p, 8);
+    mesg->name[8] = '\0';
+    p += 8;
+
+    /* Decode buffer size */
+    UINT16DECODE(p, mesg->len);
+    HDassert(mesg->len);
+
+    /* Allocate space for buffer */
+    if(NULL == (mesg->buf = (uint8_t *)H5MM_malloc(mesg->len))) {
+        mesg = (H5O_drvinfo_t *)H5MM_xfree(mesg);
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for driver info buffer")
+    } /* end if */
+
+    /* Copy encoded driver info into buffer */
+    HDmemcpy(mesg->buf, p, mesg->len);
+
+    /* Set return value */
+    ret_value = (void *)mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_drvinfo_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_drvinfo_encode
+ *
+ * Purpose:	Encode a v1 B-tree 'K' value message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_drvinfo_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
+
+    /* Store version, driver name, buffer length, & encoded buffer */
+    *p++ = H5O_DRVINFO_VERSION;
+    HDmemcpy(p, mesg->name, 8);
+    p += 8;
+    HDassert(mesg->len <= 65535);
+    UINT16ENCODE(p, mesg->len);
+    HDmemcpy(p, mesg->buf, mesg->len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_drvinfo_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_drvinfo_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_drvinfo_copy(const void *_mesg, void *_dest)
+{
+    const H5O_drvinfo_t	*mesg = (const H5O_drvinfo_t *)_mesg;
+    H5O_drvinfo_t	*dest = (H5O_drvinfo_t *)_dest;
+    void		*ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(mesg);
+
+    if(!dest && NULL == (dest = (H5O_drvinfo_t *)H5MM_malloc(sizeof(H5O_drvinfo_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message")
+
+    /* Shallow copy the fields */
+    *dest = *mesg;
+
+    /* Copy the buffer */
+    if(NULL == (dest->buf = (uint8_t *)H5MM_malloc(mesg->len))) {
+        if(dest != _dest)
+            dest = (H5O_drvinfo_t *)H5MM_xfree(dest);
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    } /* end if */
+    HDmemcpy(dest->buf, mesg->buf, mesg->len);
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_drvinfo_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_drvinfo_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not counting the
+ *		message type or size fields, but only the data fields.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *		Failure:	0
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_drvinfo_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg;
+    size_t                   ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(mesg);
+
+    ret_value = 1 +             /* Version number */
+		8 +             /* Driver name */
+		2 +             /* Buffer length */
+		mesg->len;      /* Buffer */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_drvinfo_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_drvinfo_reset
+ *
+ * Purpose:     Frees internal pointers and resets the message to an
+ *              initial state.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  1 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_drvinfo_reset(void *_mesg)
+{
+    H5O_drvinfo_t *mesg = (H5O_drvinfo_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(mesg);
+
+    /* reset */
+    mesg->buf = (uint8_t *)H5MM_xfree(mesg->buf);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_drvinfo_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_drvinfo_debug
+ *
+ * Purpose:	Prints debugging info for the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Mar  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_drvinfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+    int indent, int fwidth)
+{
+    const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Driver name:", mesg->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Buffer size:", mesg->len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_drvinfo_debug() */
+
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Odtype.c b/gatb-core/thirdparty/hdf5/src/H5Odtype.c
new file mode 100644
index 0000000..67f2fca
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Odtype.c
@@ -0,0 +1,2153 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5T_PACKAGE		/*prevent warning from including H5Tpkg   */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5O_dtype_encode(H5F_t *f, uint8_t *p, const void *mesg);
+static void *H5O_dtype_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static void *H5O_dtype_copy(const void *_mesg, void *_dest);
+static size_t H5O_dtype_size(const H5F_t *f, const void *_mesg);
+static herr_t H5O_dtype_reset(void *_mesg);
+static herr_t H5O_dtype_free(void *_mesg);
+static herr_t H5O_dtype_set_share(void *_mesg, const H5O_shared_t *sh);
+static htri_t H5O_dtype_can_share(const void *_mesg);
+static herr_t H5O_dtype_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *_udata);
+static void *H5O_dtype_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_type,
+    void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_dtype_shared_post_copy_upd(const H5O_loc_t *src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id,
+    H5O_copy_t *cpy_info);
+
+static herr_t H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
+
+/* Set up & include shared message "interface" info */
+#define H5O_SHARED_TYPE			H5O_MSG_DTYPE
+#define H5O_SHARED_DECODE		H5O_dtype_shared_decode
+#define H5O_SHARED_DECODE_REAL		H5O_dtype_decode
+#define H5O_SHARED_ENCODE		H5O_dtype_shared_encode
+#define H5O_SHARED_ENCODE_REAL		H5O_dtype_encode
+#define H5O_SHARED_SIZE			H5O_dtype_shared_size
+#define H5O_SHARED_SIZE_REAL		H5O_dtype_size
+#define H5O_SHARED_DELETE		H5O_dtype_shared_delete
+#undef H5O_SHARED_DELETE_REAL
+#define H5O_SHARED_LINK			H5O_dtype_shared_link
+#undef H5O_SHARED_LINK_REAL
+#define H5O_SHARED_COPY_FILE		H5O_dtype_shared_copy_file
+#define H5O_SHARED_COPY_FILE_REAL	H5O_dtype_copy_file
+#define H5O_SHARED_POST_COPY_FILE	H5O_dtype_shared_post_copy_file
+#undef  H5O_SHARED_POST_COPY_FILE_REAL
+#define H5O_SHARED_POST_COPY_FILE_UPD   H5O_dtype_shared_post_copy_upd
+#define H5O_SHARED_DEBUG		H5O_dtype_shared_debug
+#define H5O_SHARED_DEBUG_REAL		H5O_dtype_debug
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* Macros to check for the proper version of a datatype */
+#ifdef H5_STRICT_FORMAT_CHECKS
+/* If the version is too low, give an error.  No error if nochange is set
+ * because in that case we are either debugging or deleting the object header */
+#define H5O_DTYPE_CHECK_VERSION(DT, VERS, MIN_VERS, IOF, CLASS, ERR)           \
+    if(((VERS) < (MIN_VERS)) && !(*(IOF) & H5O_DECODEIO_NOCHANGE))             \
+        HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, ERR, "incorrect " CLASS " datatype version")
+#else /* H5_STRICT_FORMAT_CHECKS */
+/* If the version is too low and we are allowed to change the message, upgrade
+ * it and mark the object header as dirty */
+#define H5O_DTYPE_CHECK_VERSION(DT, VERS, MIN_VERS, IOF, CLASS, ERR)           \
+    if(((VERS) < (MIN_VERS)) && !(*(IOF) & H5O_DECODEIO_NOCHANGE)) {           \
+        (VERS) = (MIN_VERS);                                                   \
+        if(H5T__upgrade_version((DT), (VERS)) < 0)                              \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't upgrade " CLASS " encoding version") \
+        *(IOF) |= H5O_DECODEIO_DIRTY;                                          \
+    } /* end if */
+#endif /* H5_STRICT_FORMAT_CHECKS */
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_DTYPE[1] = {{
+    H5O_DTYPE_ID,		/* message id number		*/
+    "datatype",			/* message name for debugging	*/
+    sizeof(H5T_t),		/* native message size		*/
+    H5O_SHARE_IS_SHARABLE|H5O_SHARE_IN_OHDR,	/* messages are sharable?       */
+    H5O_dtype_shared_decode,	/* decode message		*/
+    H5O_dtype_shared_encode,	/* encode message		*/
+    H5O_dtype_copy,		/* copy the native value	*/
+    H5O_dtype_shared_size,	/* size of raw message		*/
+    H5O_dtype_reset,		/* reset method			*/
+    H5O_dtype_free,		/* free method			*/
+    H5O_dtype_shared_delete,	/* file delete method		*/
+    H5O_dtype_shared_link,	/* link method			*/
+    H5O_dtype_set_share,	/* set share method		*/
+    H5O_dtype_can_share,	/* can share method		*/
+    H5O_dtype_pre_copy_file,	/* pre copy native value to file */
+    H5O_dtype_shared_copy_file,	/* copy native value to file    */
+    H5O_dtype_shared_post_copy_file,	/* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_dtype_shared_debug	/* debug the message		*/
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_decode_helper
+ *
+ * Purpose:	Decodes a datatype
+ *
+ * Return:	TRUE if we can upgrade the parent type's version even
+ *                  with strict format checks
+ *              FALSE if we cannot
+ *              Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags/*in,out*/, const uint8_t **pp, H5T_t *dt)
+{
+    unsigned	flags, version;
+    unsigned	i;
+    size_t	z;
+    htri_t      ret_value = FALSE;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(pp && *pp);
+    HDassert(dt && dt->shared);
+
+    /* Version, class & flags */
+    UINT32DECODE(*pp, flags);
+    version = (flags>>4) & 0x0f;
+    if(version < H5O_DTYPE_VERSION_1 || version > H5O_DTYPE_VERSION_3)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "bad version number for datatype message")
+    dt->shared->version = version;
+    dt->shared->type = (H5T_class_t)(flags & 0x0f);
+    flags >>= 8;
+
+    /* Size */
+    UINT32DECODE(*pp, dt->shared->size);
+
+    switch(dt->shared->type) {
+        case H5T_INTEGER:
+            /*
+             * Integer types...
+             */
+            dt->shared->u.atomic.order = (flags & 0x1) ? H5T_ORDER_BE : H5T_ORDER_LE;
+            dt->shared->u.atomic.lsb_pad = (flags & 0x2) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            dt->shared->u.atomic.msb_pad = (flags & 0x4) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            dt->shared->u.atomic.u.i.sign = (flags & 0x8) ? H5T_SGN_2 : H5T_SGN_NONE;
+            UINT16DECODE(*pp, dt->shared->u.atomic.offset);
+            UINT16DECODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_FLOAT:
+            /*
+             * Floating-point types...
+             */
+            dt->shared->u.atomic.order = (flags & 0x1) ? H5T_ORDER_BE : H5T_ORDER_LE;
+            if(version >= H5O_DTYPE_VERSION_3) {
+                /* Unsupported byte order*/
+                if((flags & 0x40) && !(flags & 0x1))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bad byte order for datatype message")
+
+                /* VAX order if both 1st and 6th bits are turned on*/
+                if(flags & 0x40)
+                    dt->shared->u.atomic.order = H5T_ORDER_VAX;
+            } /* end if */
+            dt->shared->u.atomic.lsb_pad = (flags & 0x2) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            dt->shared->u.atomic.msb_pad = (flags & 0x4) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            dt->shared->u.atomic.u.f.pad = (flags & 0x8) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            switch((flags >> 4) & 0x03) {
+                case 0:
+                    dt->shared->u.atomic.u.f.norm = H5T_NORM_NONE;
+                    break;
+
+                case 1:
+                    dt->shared->u.atomic.u.f.norm = H5T_NORM_MSBSET;
+                    break;
+
+                case 2:
+                    dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;
+                    break;
+
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown floating-point normalization")
+            } /* end switch */
+            dt->shared->u.atomic.u.f.sign = (flags >> 8) & 0xff;
+            UINT16DECODE(*pp, dt->shared->u.atomic.offset);
+            UINT16DECODE(*pp, dt->shared->u.atomic.prec);
+            dt->shared->u.atomic.u.f.epos = *(*pp)++;
+            dt->shared->u.atomic.u.f.esize = *(*pp)++;
+            HDassert(dt->shared->u.atomic.u.f.esize > 0);
+            dt->shared->u.atomic.u.f.mpos = *(*pp)++;
+            dt->shared->u.atomic.u.f.msize = *(*pp)++;
+            HDassert(dt->shared->u.atomic.u.f.msize > 0);
+            UINT32DECODE(*pp, dt->shared->u.atomic.u.f.ebias);
+            break;
+
+        case H5T_TIME:  /* Time datatypes */
+            dt->shared->u.atomic.order = (flags & 0x1) ? H5T_ORDER_BE : H5T_ORDER_LE;
+            UINT16DECODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_STRING:
+            /*
+             * Character string types...
+             */
+            dt->shared->u.atomic.order = H5T_ORDER_NONE;
+            dt->shared->u.atomic.prec = 8 * dt->shared->size;
+            dt->shared->u.atomic.offset = 0;
+            dt->shared->u.atomic.lsb_pad = H5T_PAD_ZERO;
+            dt->shared->u.atomic.msb_pad = H5T_PAD_ZERO;
+
+            dt->shared->u.atomic.u.s.pad = (H5T_str_t)(flags & 0x0f);
+            dt->shared->u.atomic.u.s.cset = (H5T_cset_t)((flags >> 4) & 0x0f);
+            break;
+
+        case H5T_BITFIELD:
+            /*
+             * Bit fields...
+             */
+            dt->shared->u.atomic.order = (flags & 0x1) ? H5T_ORDER_BE : H5T_ORDER_LE;
+            dt->shared->u.atomic.lsb_pad = (flags & 0x2) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            dt->shared->u.atomic.msb_pad = (flags & 0x4) ? H5T_PAD_ONE : H5T_PAD_ZERO;
+            UINT16DECODE(*pp, dt->shared->u.atomic.offset);
+            UINT16DECODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_OPAQUE:
+            /*
+             * Opaque types...
+             */
+            z = flags & (H5T_OPAQUE_TAG_MAX - 1);
+            HDassert(0 == (z & 0x7)); /*must be aligned*/
+            if(NULL == (dt->shared->u.opaque.tag = (char *)H5MM_malloc(z + 1)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            HDmemcpy(dt->shared->u.opaque.tag, *pp, z);
+            dt->shared->u.opaque.tag[z] = '\0';
+            *pp += z;
+            break;
+
+        case H5T_COMPOUND:
+            {
+                unsigned offset_nbytes;         /* Size needed to encode member offsets */
+                size_t max_memb_pos = 0;        /* Maximum member covered, so far */
+                unsigned max_version = 0;       /* Maximum member version */
+                hbool_t upgrade_to = 0;         /* Version number we can "soft" upgrade to */
+                unsigned j;
+
+                /* Compute the # of bytes required to store a member offset */
+                offset_nbytes = H5VM_limit_enc_size((uint64_t)dt->shared->size);
+
+                /*
+                 * Compound datatypes...
+                 */
+                dt->shared->u.compnd.nmembs = flags & 0xffff;
+                if(dt->shared->u.compnd.nmembs == 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "invalid number of members: %u", dt->shared->u.compnd.nmembs)
+                dt->shared->u.compnd.nalloc = dt->shared->u.compnd.nmembs;
+                dt->shared->u.compnd.memb = (H5T_cmemb_t *)H5MM_calloc(dt->shared->u.compnd.nalloc * sizeof(H5T_cmemb_t));
+                dt->shared->u.compnd.memb_size = 0;
+                if(NULL == dt->shared->u.compnd.memb)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "memory allocation failed")
+                for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                    unsigned ndims = 0;     /* Number of dimensions of the array field */
+                    htri_t can_upgrade;     /* Whether we can upgrade this type's version */
+                    hsize_t dim[H5O_LAYOUT_NDIMS];  /* Dimensions of the array */
+                    H5T_t *array_dt;    /* Temporary pointer to the array datatype */
+                    H5T_t *temp_type;   /* Temporary pointer to the field's datatype */
+
+                    /* Decode the field name */
+                    dt->shared->u.compnd.memb[i].name = H5MM_xstrdup((const char *)*pp);
+
+                    /* Version 3 of the datatype message eliminated the padding to multiple of 8 bytes */
+                    if(version >= H5O_DTYPE_VERSION_3)
+                        /* Advance past name, including null terminator */
+                        *pp += HDstrlen((const char *)*pp) + 1;
+                    else
+                        /* Advance multiple of 8 w/ null terminator */
+                        *pp += ((HDstrlen((const char *)*pp) + 8) / 8) * 8;
+
+                    /* Decode the field offset */
+                    /* (starting with version 3 of the datatype message, use the minimum # of bytes required) */
+                    if(version >= H5O_DTYPE_VERSION_3)
+                        UINT32DECODE_VAR(*pp, dt->shared->u.compnd.memb[i].offset, offset_nbytes)
+                    else
+                        UINT32DECODE(*pp, dt->shared->u.compnd.memb[i].offset)
+
+                    /* Older versions of the library allowed a field to have
+                     * intrinsic 'arrayness'.  Newer versions of the library
+                     * use the separate array datatypes. */
+                    if(version == H5O_DTYPE_VERSION_1) {
+                        /* Decode the number of dimensions */
+                        ndims = *(*pp)++;
+
+                        /* Check that ndims is valid */
+                        if(ndims > 4)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "invalid number of dimensions for array")
+
+                        *pp += 3;		/*reserved bytes */
+
+                        /* Skip dimension permutation */
+                        *pp += 4;
+
+                        /* Skip reserved bytes */
+                        *pp += 4;
+
+                        /* Decode array dimension sizes */
+                        for(j = 0; j < 4; j++)
+                            UINT32DECODE(*pp, dim[j]);
+                    } /* end if */
+
+                    /* Allocate space for the field's datatype */
+                    if(NULL == (temp_type = H5T__alloc()))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                    /* Decode the field's datatype information */
+                    if((can_upgrade = H5O_dtype_decode_helper(f, ioflags, pp, temp_type)) < 0) {
+                        for(j = 0; j <= i; j++)
+                            H5MM_xfree(dt->shared->u.compnd.memb[j].name);
+                        H5MM_xfree(dt->shared->u.compnd.memb);
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode member type")
+                    } /* end if */
+
+                    /* Upgrade the version if we can and it is necessary */
+                    if(can_upgrade && temp_type->shared->version > version) {
+                        upgrade_to = temp_type->shared->version;
+
+                        /* Pass "can_upgrade" flag down to parent type */
+                        ret_value = TRUE;
+                    } /* end if */
+
+                    /* Go create the array datatype now, for older versions of the datatype message */
+                    if(version == H5O_DTYPE_VERSION_1) {
+                        /* Check if this member is an array field */
+                        if(ndims > 0) {
+                            /* Create the array datatype for the field */
+                            if((array_dt = H5T__array_create(temp_type, ndims, dim)) == NULL) {
+                                for(j = 0; j <= i; j++)
+                                    H5MM_xfree(dt->shared->u.compnd.memb[j].name);
+                                H5MM_xfree(dt->shared->u.compnd.memb);
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create array datatype")
+                            } /* end if */
+
+                            /* Close the base type for the array */
+                            H5T_close(temp_type);
+
+                            /* Make the array type the type that is set for the field */
+                            temp_type = array_dt;
+
+                            /* Reset array version if NOCHANGE is specified (i.e. h5debug) */
+                            if(*ioflags & H5O_DECODEIO_NOCHANGE)
+                                temp_type->shared->version = H5O_DTYPE_VERSION_1;
+                            else {
+                                /* Otherwise upgrade the compound version */
+                                if(upgrade_to < temp_type->shared->version)
+                                    upgrade_to = temp_type->shared->version;
+
+                                /* Set the return value to indicate that we should freely
+                                 * upgrade parent types */
+                                ret_value = TRUE;
+                            } /* end else */
+                        } /* end if */
+                    } /* end if */
+
+                    /* Keep track of the maximum member version found */
+                    if(temp_type->shared->version > max_version)
+                        max_version = temp_type->shared->version;
+
+                    /*
+                     * Set the "force conversion" flag if VL datatype fields exist in this
+                     * type or any component types
+                     */
+                    if(temp_type->shared->force_conv == TRUE)
+                        dt->shared->force_conv = TRUE;
+
+                    /* Member size */
+                    dt->shared->u.compnd.memb[i].size = temp_type->shared->size;
+                    dt->shared->u.compnd.memb_size += temp_type->shared->size;
+
+                    /* Set the field datatype (finally :-) */
+                    dt->shared->u.compnd.memb[i].type = temp_type;
+
+                    /* Check if this field overlaps with a prior field */
+                    /* (probably indicates that the file is corrupt) */
+                    if(i > 0 && dt->shared->u.compnd.memb[i].offset < max_memb_pos) {
+                        for(j = 0; j < i; j++)
+                            if(dt->shared->u.compnd.memb[i].offset >= dt->shared->u.compnd.memb[j].offset
+                                    && dt->shared->u.compnd.memb[i].offset < (dt->shared->u.compnd.memb[j].offset + dt->shared->u.compnd.memb[j].size))
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "member overlaps with previous member")
+                    } /* end if */
+
+                    /* Update the maximum member position covered */
+                    max_memb_pos = MAX(max_memb_pos, (dt->shared->u.compnd.memb[i].offset + dt->shared->u.compnd.memb[i].size));
+                } /* end for */
+
+                /* Check if the compound type is packed */
+                H5T__update_packed(dt);
+
+                /* Upgrade the compound if requested */
+                if(version < upgrade_to) {
+                    version = upgrade_to;
+                    if(H5T__upgrade_version(dt, upgrade_to) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't upgrade compound encoding version")
+                    /* We won't mark the message dirty since there were no
+                     * errors in the file, simply type versions that we will no
+                     * longer encode. */
+                } /* end if */
+
+                /* Check that no member of this compound has a version greater
+                 * than the compound itself. */
+                H5O_DTYPE_CHECK_VERSION(dt, version, max_version, ioflags, "compound", FAIL)
+            }
+            break;
+
+        case H5T_REFERENCE: /* Reference datatypes...  */
+            dt->shared->u.atomic.order = H5T_ORDER_NONE;
+            dt->shared->u.atomic.prec = 8 * dt->shared->size;
+            dt->shared->u.atomic.offset = 0;
+            dt->shared->u.atomic.lsb_pad = H5T_PAD_ZERO;
+            dt->shared->u.atomic.msb_pad = H5T_PAD_ZERO;
+
+            /* Set reference type */
+            dt->shared->u.atomic.u.r.rtype = (H5R_type_t)(flags & 0x0f);
+
+            /* Set extra information for object references, so the hobj_ref_t gets swizzled correctly */
+            if(dt->shared->u.atomic.u.r.rtype == H5R_OBJECT) {
+                /* Mark location this type as undefined for now.  The caller function should
+                 * decide the location. */
+                dt->shared->u.atomic.u.r.loc = H5T_LOC_BADLOC;
+
+                /* This type needs conversion */
+                dt->shared->force_conv = TRUE;
+            } /* end if */
+            break;
+
+        case H5T_ENUM:
+            /*
+             * Enumeration datatypes...
+             */
+            dt->shared->u.enumer.nmembs = dt->shared->u.enumer.nalloc = flags & 0xffff;
+            if(NULL == (dt->shared->parent = H5T__alloc()))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            if(H5O_dtype_decode_helper(f, ioflags, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode parent datatype")
+
+            /* Check if the parent of this enum has a version greater than the
+             * enum itself. */
+            H5O_DTYPE_CHECK_VERSION(dt, version, dt->shared->parent->shared->version,
+                ioflags, "enum", FAIL)
+
+            if(NULL == (dt->shared->u.enumer.name = (char **)H5MM_calloc(dt->shared->u.enumer.nalloc * sizeof(char*))) ||
+                    NULL == (dt->shared->u.enumer.value = (uint8_t *)H5MM_calloc(dt->shared->u.enumer.nalloc * dt->shared->parent->shared->size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Names */
+            for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
+                dt->shared->u.enumer.name[i] = H5MM_xstrdup((const char*)*pp);
+
+                /* Version 3 of the datatype message eliminated the padding to multiple of 8 bytes */
+                if(version >= H5O_DTYPE_VERSION_3)
+                    /* Advance past name, including null terminator */
+                    *pp += HDstrlen((const char *)*pp) + 1;
+                else
+                    /* Advance multiple of 8 w/ null terminator */
+                    *pp += ((HDstrlen((const char *)*pp) + 8) / 8) * 8;
+            } /* end for */
+
+            /* Values */
+            HDmemcpy(dt->shared->u.enumer.value, *pp,
+                     dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size);
+            *pp += dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size;
+            break;
+
+        case H5T_VLEN:  /* Variable length datatypes...  */
+            /* Set the type of VL information, either sequence or string */
+            dt->shared->u.vlen.type = (H5T_vlen_type_t)(flags & 0x0f);
+            if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
+                dt->shared->u.vlen.pad  = (H5T_str_t)((flags >> 4) & 0x0f);
+                dt->shared->u.vlen.cset = (H5T_cset_t)((flags >> 8) & 0x0f);
+            } /* end if */
+
+            /* Decode base type of VL information */
+            if(NULL == (dt->shared->parent = H5T__alloc()))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            if(H5O_dtype_decode_helper(f, ioflags, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode VL parent type")
+
+            /* Check if the parent of this vlen has a version greater than the
+             * vlen itself. */
+            H5O_DTYPE_CHECK_VERSION(dt, version, dt->shared->parent->shared->version,
+                ioflags, "vlen", FAIL)
+
+            dt->shared->force_conv=TRUE;
+
+            /* Mark location this type as undefined for now.  The caller function should
+             * decide the location. */
+            if(H5T_set_loc(dt, f, H5T_LOC_BADLOC) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
+            break;
+
+        case H5T_ARRAY:  /* Array datatypes */
+            /* Decode the number of dimensions */
+            dt->shared->u.array.ndims = *(*pp)++;
+
+            /* Double-check the number of dimensions */
+            if(dt->shared->u.array.ndims > H5S_MAX_RANK)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "too many dimensions for array datatype")
+
+            /* Skip reserved bytes, if version has them */
+            if(version < H5O_DTYPE_VERSION_3)
+                *pp += 3;
+
+            /* Decode array dimension sizes & compute number of elements */
+            for(i = 0, dt->shared->u.array.nelem = 1; i < (unsigned)dt->shared->u.array.ndims; i++) {
+                UINT32DECODE(*pp, dt->shared->u.array.dim[i]);
+                dt->shared->u.array.nelem *= dt->shared->u.array.dim[i];
+            } /* end for */
+
+            /* Skip array dimension permutations, if version has them */
+            if(version < H5O_DTYPE_VERSION_3)
+                *pp += dt->shared->u.array.ndims * 4;
+
+            /* Decode base type of array */
+            if(NULL == (dt->shared->parent = H5T__alloc()))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            if(H5O_dtype_decode_helper(f, ioflags, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode array parent type")
+
+            /* Check if the parent of this array has a version greater than the
+             * array itself. */
+            H5O_DTYPE_CHECK_VERSION(dt, version, dt->shared->parent->shared->version,
+                ioflags, "array", FAIL)
+
+            /* There should be no array datatypes with version < 2. */
+            H5O_DTYPE_CHECK_VERSION(dt, version, H5O_DTYPE_VERSION_2, ioflags,
+                "array", FAIL)
+
+            /*
+             * Set the "force conversion" flag if a VL base datatype is used or
+             * or if any components of the base datatype are VL types.
+             */
+            if(dt->shared->parent->shared->force_conv == TRUE)
+                dt->shared->force_conv = TRUE;
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown datatype class found")
+    } /* end switch */
+
+done:
+    if(ret_value < 0) {
+        if(dt != NULL) {
+            if(dt->shared != NULL)
+                dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+            dt = H5FL_FREE(H5T_t, dt);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_decode_helper() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_encode_helper
+ *
+ * Purpose:	Encodes a datatype.
+ *
+ * Note:	When changing the format of a datatype (or adding a new one),
+ *		remember to change the upgrade version callback
+ *		(H5T_upgrade_version_cb).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_encode_helper(const H5F_t *f, uint8_t **pp, const H5T_t *dt)
+{
+    unsigned	flags = 0;
+    uint8_t	*hdr = (uint8_t *)*pp;
+    unsigned	i;
+    size_t	n, z;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(pp && *pp);
+    HDassert(dt);
+
+    /* skip the type and class bit-field for now */
+    *pp += 4;
+    UINT32ENCODE(*pp, dt->shared->size);
+
+    switch(dt->shared->type) {
+        case H5T_INTEGER:
+            /*
+             * Integer datatypes...
+             */
+            switch (dt->shared->u.atomic.order) {
+                case H5T_ORDER_LE:
+                    break;		/*nothing */
+
+                case H5T_ORDER_BE:
+                    flags |= 0x01;
+                    break;
+
+                case H5T_ORDER_ERROR:
+                case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.lsb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x02;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.msb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                case H5T_PAD_ONE:
+                    flags |= 0x04;
+                    break;
+
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.u.i.sign) {
+                case H5T_SGN_NONE:
+                    break;		/*nothing */
+
+                case H5T_SGN_2:
+                    flags |= 0x08;
+                    break;
+
+                case H5T_SGN_ERROR:
+                case H5T_NSGN:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "sign scheme is not supported in file format yet")
+            } /* end switch */
+
+            UINT16ENCODE(*pp, dt->shared->u.atomic.offset);
+            UINT16ENCODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_FLOAT:
+            /*
+             * Floating-point types...
+             */
+            switch (dt->shared->u.atomic.order) {
+                case H5T_ORDER_LE:
+                    break;		/*nothing*/
+
+                case H5T_ORDER_BE:
+                    flags |= 0x01;
+                    break;
+
+                case H5T_ORDER_VAX:     /*turn on 1st and 6th (reserved before adding VAX) bits*/
+                    flags |= 0x41;
+                    HDassert(dt->shared->version >= H5O_DTYPE_VERSION_3);
+                    break;
+
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_ERROR:
+                case H5T_ORDER_NONE:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.lsb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x02;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.msb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x04;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.u.f.pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x08;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.u.f.norm) {
+                case H5T_NORM_NONE:
+                    break;		/*nothing */
+
+                case H5T_NORM_MSBSET:
+                    flags |= 0x10;
+                    break;
+
+                case H5T_NORM_IMPLIED:
+                    flags |= 0x20;
+                    break;
+
+                case H5T_NORM_ERROR:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "normalization scheme is not supported in file format yet")
+            } /* end switch */
+
+            flags = (unsigned)(flags | ((dt->shared->u.atomic.u.f.sign << 8) & 0xff00));
+            UINT16ENCODE(*pp, dt->shared->u.atomic.offset);
+            UINT16ENCODE(*pp, dt->shared->u.atomic.prec);
+            HDassert(dt->shared->u.atomic.u.f.epos <= 255);
+            *(*pp)++ = (uint8_t)(dt->shared->u.atomic.u.f.epos);
+            HDassert(dt->shared->u.atomic.u.f.esize <= 255);
+            *(*pp)++ = (uint8_t)(dt->shared->u.atomic.u.f.esize);
+            HDassert(dt->shared->u.atomic.u.f.mpos <= 255);
+            *(*pp)++ = (uint8_t)(dt->shared->u.atomic.u.f.mpos);
+            HDassert(dt->shared->u.atomic.u.f.msize <= 255);
+            *(*pp)++ = (uint8_t)(dt->shared->u.atomic.u.f.msize);
+            UINT32ENCODE(*pp, dt->shared->u.atomic.u.f.ebias);
+            break;
+
+        case H5T_TIME:  /* Time datatypes...  */
+            switch (dt->shared->u.atomic.order) {
+                case H5T_ORDER_LE:
+                    break;		/*nothing */
+
+                case H5T_ORDER_BE:
+                    flags |= 0x01;
+                    break;
+
+                case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_ERROR:
+                case H5T_ORDER_NONE:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
+            } /* end switch */
+            UINT16ENCODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_STRING:
+            /*
+             * Character string types... (not fully implemented)
+             */
+            HDassert(dt->shared->u.atomic.order == H5T_ORDER_NONE);
+            HDassert(dt->shared->u.atomic.prec == 8 * dt->shared->size);
+            HDassert(dt->shared->u.atomic.offset == 0);
+            HDassert(dt->shared->u.atomic.lsb_pad == H5T_PAD_ZERO);
+            HDassert(dt->shared->u.atomic.msb_pad == H5T_PAD_ZERO);
+
+            flags = (unsigned)(flags | (dt->shared->u.atomic.u.s.pad & 0x0f));
+            flags = (unsigned)(flags | ((((unsigned)dt->shared->u.atomic.u.s.cset) & 0x0f) << 4));
+            break;
+
+        case H5T_BITFIELD:
+            /*
+             * Bitfield datatypes...
+             */
+            switch (dt->shared->u.atomic.order) {
+                case H5T_ORDER_LE:
+                    break;		/*nothing */
+
+                case H5T_ORDER_BE:
+                    flags |= 0x01;
+                    break;
+
+                case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_ERROR:
+                case H5T_ORDER_NONE:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.lsb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x02;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            switch (dt->shared->u.atomic.msb_pad) {
+                case H5T_PAD_ZERO:
+                    break;		/*nothing */
+
+                case H5T_PAD_ONE:
+                    flags |= 0x04;
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_PAD_BACKGROUND:
+                case H5T_NPAD:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
+            } /* end switch */
+
+            UINT16ENCODE(*pp, dt->shared->u.atomic.offset);
+            UINT16ENCODE(*pp, dt->shared->u.atomic.prec);
+            break;
+
+        case H5T_OPAQUE:
+            /*
+             * Opaque datatypes...  The tag is stored in a field which is a
+             * multiple of eight characters and null padded (not necessarily
+             * null terminated).
+             */
+            {
+                size_t	aligned;
+
+                z = HDstrlen(dt->shared->u.opaque.tag);
+                aligned = (z + 7) & (H5T_OPAQUE_TAG_MAX - 8);
+                flags = (unsigned)(flags | aligned);
+                HDmemcpy(*pp, dt->shared->u.opaque.tag, MIN(z,aligned));
+                for(n = MIN(z, aligned); n < aligned; n++)
+                    (*pp)[n] = 0;
+                *pp += aligned;
+            }
+            break;
+
+        case H5T_COMPOUND:
+            {
+                unsigned offset_nbytes;         /* Size needed to encode member offsets */
+
+                /* Compute the # of bytes required to store a member offset */
+                offset_nbytes = H5VM_limit_enc_size((uint64_t)dt->shared->size);
+
+                /*
+                 * Compound datatypes...
+                 */
+                flags = dt->shared->u.compnd.nmembs & 0xffff;
+                for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                    /* Sanity check */
+                    /* (compound datatypes w/array members must be encoded w/version >= 2) */
+                    HDassert(dt->shared->u.compnd.memb[i].type->shared->type != H5T_ARRAY || dt->shared->version >= H5O_DTYPE_VERSION_2);
+
+                    /* Check that the version is at least as great as the member */
+                    HDassert(dt->shared->version >= dt->shared->u.compnd.memb[i].type->shared->version);
+
+                    /* Name */
+                    HDstrcpy((char*)(*pp), dt->shared->u.compnd.memb[i].name);
+
+                    /* Version 3 of the datatype message removed the padding to multiple of 8 bytes */
+                    n = HDstrlen(dt->shared->u.compnd.memb[i].name);
+                    if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                        *pp += n + 1;
+                    else {
+                        /* Pad name to multiple of 8 bytes */
+                        for(z = n + 1; z % 8; z++)
+                            (*pp)[z] = '\0';
+                        *pp += z;
+                    } /* end if */
+
+                    /* Member offset */
+                    /* (starting with version 3 of the datatype message, use the minimum # of bytes required) */
+                    if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                        UINT32ENCODE_VAR(*pp, (uint32_t)dt->shared->u.compnd.memb[i].offset, offset_nbytes)
+                    else
+                        UINT32ENCODE(*pp, dt->shared->u.compnd.memb[i].offset)
+
+                    /* If we don't have any array fields, write out the old style
+                     * member information, for better backward compatibility
+                     * Write out all zeros for the array information, though...
+                     */
+                    if(dt->shared->version == H5O_DTYPE_VERSION_1) {
+                        unsigned	j;
+
+                        /* Dimensionality */
+                        *(*pp)++ = 0;
+
+                        /* Reserved */
+                        *(*pp)++ = 0;
+                        *(*pp)++ = 0;
+                        *(*pp)++ = 0;
+
+                        /* Dimension permutation */
+                        UINT32ENCODE(*pp, 0);
+
+                        /* Reserved */
+                        UINT32ENCODE(*pp, 0);
+
+                        /* Dimensions */
+                        for(j = 0; j < 4; j++)
+                            UINT32ENCODE(*pp, 0);
+                    } /* end if */
+
+                    /* Subtype */
+                    if(H5O_dtype_encode_helper(f, pp, dt->shared->u.compnd.memb[i].type) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode member type")
+                } /* end for */
+            }
+            break;
+
+        case H5T_REFERENCE:
+            flags |= (dt->shared->u.atomic.u.r.rtype & 0x0f);
+            break;
+
+        case H5T_ENUM:
+            /* Check that the version is at least as great as the parent */
+            HDassert(dt->shared->version >= dt->shared->parent->shared->version);
+
+            /*
+             * Enumeration datatypes...
+             */
+            flags = dt->shared->u.enumer.nmembs & 0xffff;
+
+            /* Parent type */
+            if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode parent datatype")
+
+            /* Names, each a multiple of eight bytes */
+            for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
+                /* Name */
+                HDstrcpy((char*)(*pp), dt->shared->u.enumer.name[i]);
+
+                /* Version 3 of the datatype message removed the padding to multiple of 8 bytes */
+                n = HDstrlen(dt->shared->u.enumer.name[i]);
+                if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                    *pp += n + 1;
+                else {
+                    /* Pad to multiple of 8 bytes */
+                    for(z = n + 1; z % 8; z++)
+                        (*pp)[z] = '\0';
+                    *pp += z;
+                } /* end for */
+            } /* end for */
+
+            /* Values */
+            HDmemcpy(*pp, dt->shared->u.enumer.value, dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size);
+            *pp += dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size;
+            break;
+
+        case H5T_VLEN:  /* Variable length datatypes...  */
+            /* Check that the version is at least as great as the parent */
+            HDassert(dt->shared->version >= dt->shared->parent->shared->version);
+
+            flags |= (dt->shared->u.vlen.type & 0x0f);
+            if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
+                flags = (unsigned)(flags | (((unsigned)dt->shared->u.vlen.pad   & 0x0f) << 4));
+                flags = (unsigned)(flags | (((unsigned)dt->shared->u.vlen.cset  & 0x0f) << 8));
+            } /* end if */
+
+            /* Encode base type of VL information */
+            if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type")
+            break;
+
+        case H5T_ARRAY:  /* Array datatypes */
+            /* Double-check the number of dimensions */
+            HDassert(dt->shared->u.array.ndims <= H5S_MAX_RANK);
+
+            /* Check that the version is valid */
+            HDassert(dt->shared->version >= H5O_DTYPE_VERSION_2);
+
+            /* Check that the version is at least as great as the parent */
+            HDassert(dt->shared->version >= dt->shared->parent->shared->version);
+
+            /* Encode the number of dimensions */
+            HDassert(dt->shared->u.array.ndims <= UCHAR_MAX);
+            *(*pp)++ = (uint8_t)dt->shared->u.array.ndims;
+
+            /* Drop this information for Version 3 of the format */
+            if(dt->shared->version < H5O_DTYPE_VERSION_3) {
+                /* Reserved */
+                *(*pp)++ = '\0';
+                *(*pp)++ = '\0';
+                *(*pp)++ = '\0';
+            } /* end if */
+
+            /* Encode array dimensions */
+            for(i = 0; i < (unsigned)dt->shared->u.array.ndims; i++)
+                UINT32ENCODE(*pp, dt->shared->u.array.dim[i]);
+
+            /* Drop this information for Version 3 of the format */
+            if(dt->shared->version < H5O_DTYPE_VERSION_3) {
+                /* Encode 'fake' array dimension permutations */
+                for(i = 0; i < (unsigned)dt->shared->u.array.ndims; i++)
+                    UINT32ENCODE(*pp, i);
+            } /* end if */
+
+            /* Encode base type of array's information */
+            if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type")
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /*nothing */
+            break;
+    } /* end switch */
+
+    /* Encode the type's class, version and bit field */
+    *hdr++ = (uint8_t)(((unsigned)(dt->shared->type) & 0x0f) | (dt->shared->version << 4));
+    *hdr++ = (uint8_t)((flags >> 0) & 0xff);
+    *hdr++ = (uint8_t)((flags >> 8) & 0xff);
+    *hdr++ = (uint8_t)((flags >> 16) & 0xff);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_encode_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_dtype_decode
+ PURPOSE
+    Decode a message and return a pointer to a memory struct
+	with the decoded information
+ USAGE
+    void *H5O_dtype_decode(f, dxpl_id, mesg_flags, p)
+	H5F_t *f;		IN: pointer to the HDF5 file struct
+        hid_t dxpl_id;          IN: DXPL for any I/O
+        unsigned mesg_flags;    IN: Message flags to influence decoding
+	const uint8 *p;		IN: the raw information buffer
+ RETURNS
+    Pointer to the new message in native order on success, NULL on failure
+ DESCRIPTION
+	This function decodes the "raw" disk form of a simple datatype message
+    into a struct in memory native format.  The struct is allocated within this
+    function using malloc() and is returned to the caller.
+--------------------------------------------------------------------------*/
+static void *
+H5O_dtype_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UNUSED mesg_flags,
+    unsigned *ioflags/*in,out*/, const uint8_t *p)
+{
+    H5T_t	*dt = NULL;
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(p);
+
+    /* Allocate datatype message */
+    if(NULL == (dt = H5T__alloc()))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Perform actual decode of message */
+    if(H5O_dtype_decode_helper(f, ioflags, &p, dt) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode type")
+
+    /* Set return value */
+    ret_value = dt;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_decode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_dtype_encode
+ PURPOSE
+    Encode a simple datatype message
+ USAGE
+    herr_t H5O_dtype_encode(f, raw_size, p, mesg)
+	H5F_t *f;	  IN: pointer to the HDF5 file struct
+	size_t raw_size;	IN: size of the raw information buffer
+	const uint8 *p;		IN: the raw information buffer
+	const void *mesg;	IN: Pointer to the simple datatype struct
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function encodes the native memory form of the simple datatype
+    message in the "raw" disk form.
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_dtype_encode(H5F_t *f, uint8_t *p, const void *mesg)
+{
+    const H5T_t	   *dt = (const H5T_t *) mesg;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(dt);
+
+    /* encode */
+    if(H5O_dtype_encode_helper(f, &p, dt) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_encode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_dtype_copy
+ PURPOSE
+    Copies a message from MESG to DEST, allocating DEST if necessary.
+ USAGE
+    void *H5O_dtype_copy(mesg, dest)
+	const void *mesg;	IN: Pointer to the source simple datatype
+				    struct
+	const void *dest;	IN: Pointer to the destination simple
+				    datatype struct
+ RETURNS
+    Pointer to DEST on success, NULL on failure
+ DESCRIPTION
+	This function copies a native (memory) simple datatype message,
+    allocating the destination structure if necessary.
+--------------------------------------------------------------------------*/
+static void *
+H5O_dtype_copy(const void *_src, void *_dst)
+{
+    const H5T_t		   *src = (const H5T_t *) _src;
+    H5T_t		   *dst;
+    void 		   *ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(src);
+
+    /* Copy */
+    if(NULL == (dst = H5T_copy(src, H5T_COPY_ALL)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "can't copy type")
+
+    /* Was result already allocated? */
+    if(_dst) {
+        *((H5T_t *) _dst) = *dst;
+        dst = H5FL_FREE(H5T_t, dst);
+        dst = (H5T_t *) _dst;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dst;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_dtype_size
+ PURPOSE
+    Return the raw message size in bytes
+ USAGE
+    void *H5O_dtype_size(f, mesg)
+	H5F_t *f;	  IN: pointer to the HDF5 file struct
+	const void *mesg;     IN: Pointer to the source simple datatype struct
+ RETURNS
+    Size of message on success, 0 on failure
+ DESCRIPTION
+	This function returns the size of the raw simple datatype message on
+    success.  (Not counting the message type or size fields, only the data
+    portion of the message).  It doesn't take into account alignment.
+--------------------------------------------------------------------------*/
+static size_t
+H5O_dtype_size(const H5F_t *f, const void *_mesg)
+{
+    const H5T_t	*dt = (const H5T_t *)_mesg;
+    unsigned	u;                      /* Local index variable */
+    size_t	ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(dt);
+
+    /* Set the common size information */
+    ret_value = 4 +     /* Type, class & flags */
+        4;              /* Size of datatype */
+
+    /* Add in the property field length for each datatype class */
+    switch(dt->shared->type) {
+        case H5T_INTEGER:
+            ret_value += 4;
+            break;
+
+        case H5T_FLOAT:
+            ret_value += 12;
+            break;
+
+        case H5T_TIME:
+            ret_value += 2;
+            break;
+
+        case H5T_BITFIELD:
+            ret_value += 4;
+            break;
+
+        case H5T_OPAQUE:
+            ret_value += (HDstrlen(dt->shared->u.opaque.tag) + 7) & (H5T_OPAQUE_TAG_MAX - 8);
+            break;
+
+        case H5T_COMPOUND:
+            {
+                unsigned offset_nbytes;         /* Size needed to encode member offsets */
+
+                /* Compute the # of bytes required to store a member offset */
+                offset_nbytes = H5VM_limit_enc_size((uint64_t)dt->shared->size);
+
+                /* Compute the total size needed to encode compound datatype */
+                for(u = 0; u < dt->shared->u.compnd.nmembs; u++) {
+                    size_t name_len;    /* Length of field's name */
+
+                    /* Get length of field's name */
+                    name_len = HDstrlen(dt->shared->u.compnd.memb[u].name);
+
+                    /* Versions of the format >= 3 don't pad out the name */
+                    if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                        ret_value += name_len + 1;
+                    else
+                        ret_value += ((name_len + 8) / 8) * 8;
+
+                    /* Check for encoding array datatype or using the latest file format */
+                    /* (starting with version 3 of the datatype message, use the minimum # of bytes required) */
+                    if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                        ret_value += offset_nbytes; 	/*member offset*/
+                    else if(dt->shared->version == H5O_DTYPE_VERSION_2)
+                        ret_value += 4; 	/*member offset*/
+                    else
+                        ret_value += 4 +	/*member offset*/
+                             1 +		/*dimensionality*/
+                             3 +		/*reserved*/
+                             4 +		/*permutation*/
+                             4 +		/*reserved*/
+                             16;		/*dimensions*/
+                    ret_value += H5O_dtype_size(f, dt->shared->u.compnd.memb[u].type);
+                } /* end for */
+            }
+            break;
+
+        case H5T_ENUM:
+            ret_value += H5O_dtype_size(f, dt->shared->parent);
+            for(u = 0; u < dt->shared->u.enumer.nmembs; u++) {
+                size_t name_len;    /* Length of field's name */
+
+                /* Get length of field's name */
+                name_len = HDstrlen(dt->shared->u.enumer.name[u]);
+
+                /* Versions of the format >= 3 don't pad out the name */
+                if(dt->shared->version >= H5O_DTYPE_VERSION_3)
+                    ret_value += name_len + 1;
+                else
+                    ret_value += ((name_len + 8) / 8) * 8;
+            } /* end for */
+            ret_value += dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size;
+            break;
+
+        case H5T_VLEN:
+            ret_value += H5O_dtype_size(f, dt->shared->parent);
+            break;
+
+        case H5T_ARRAY:
+            ret_value += 1; /* ndims */
+            if(dt->shared->version < H5O_DTYPE_VERSION_3)
+                ret_value += 3; /* reserved bytes*/
+            ret_value += 4 * dt->shared->u.array.ndims; /* dimensions */
+            if(dt->shared->version < H5O_DTYPE_VERSION_3)
+                ret_value += 4 * dt->shared->u.array.ndims; /* dimension permutations */
+            ret_value += H5O_dtype_size(f, dt->shared->parent);
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_STRING:
+        case H5T_REFERENCE:
+        case H5T_NCLASSES:
+        default:
+            /*no properties */
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_dtype_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_reset
+ *
+ * Purpose:	Frees resources within a message, but doesn't free
+ *		the message itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_reset(void *_mesg)
+{
+    H5T_t		   *dt = (H5T_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(dt)
+        H5T__free(dt);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_dtype_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 30, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    ((H5T_t *) mesg)->shared = H5FL_FREE(H5T_shared_t, ((H5T_t *) mesg)->shared);
+    mesg = H5FL_FREE(H5T_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_dtype_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_set_share
+ *
+ * Purpose:	Copies sharing information from SH into the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, June	4, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
+{
+    H5T_t *dt = (H5T_t *)_mesg;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(dt);
+    HDassert(sh);
+
+    /* Make sure the shared message location is initialized, so that it
+     * either has valid sharing information or is set to 0.
+     */
+    HDassert(sh->type <= H5O_SHARE_TYPE_HERE);
+
+    /* Make sure we're not sharing a committed type in the heap */
+    HDassert(sh->type == H5O_SHARE_TYPE_COMMITTED ||
+        (dt->shared->state != H5T_STATE_OPEN && dt->shared->state != H5T_STATE_NAMED));
+
+    /* Copy the shared information */
+    if(H5O_set_shared(&(dt->sh_loc), sh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy shared message info")
+
+    /* If this is now a committed datatype, set its state properly. */
+    if(sh->type == H5O_SHARE_TYPE_COMMITTED) {
+        dt->shared->state = H5T_STATE_NAMED;
+
+        /* Set up the object location for the datatype also */
+        dt->oloc.file = sh->file;
+        dt->oloc.addr = sh->u.loc.oh_addr;;
+        dt->oloc.holding_file = FALSE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_set_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_can_share
+ *
+ * Purpose:	Determines if this datatype is allowed to be shared or
+ *              not.  Immutable datatypes or datatypes that are already
+ *              shared cannot be shared (again).
+ *
+ * Return:	TRUE if datatype can be shared
+ *              FALSE if datatype may not shared
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Monday, October 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_dtype_can_share(const void *_mesg)
+{
+    const H5T_t	*mesg = (const H5T_t *)_mesg;
+    htri_t tri_ret;
+    htri_t ret_value = TRUE;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(mesg);
+
+    /* Don't share immutable datatypes */
+    if((tri_ret = H5T_is_immutable(mesg)) > 0)
+        HGOTO_DONE(FALSE)
+    else if(tri_ret < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "can't tell if datatype is immutable")
+
+    /* Don't share committed datatypes */
+    if((tri_ret = H5T_committed(mesg)) > 0)
+        HGOTO_DONE(FALSE)
+    else if(tri_ret < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "can't tell if datatype is shared")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_can_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_dtype_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files
+ *
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              November 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t H5_ATTR_UNUSED *deleted, const H5O_copy_t H5_ATTR_UNUSED *cpy_info,
+    void *_udata)
+{
+    const H5T_t	*dt_src = (const H5T_t *)mesg_src;  /* Source datatype */
+    H5D_copy_file_ud_t *udata = (H5D_copy_file_ud_t *)_udata;   /* Dataset copying user data */
+    herr_t ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file_src);
+    HDassert(dt_src);
+
+    /* If the user data is non-NULL, assume we are copying a dataset
+     * and check if we need to make a copy of the datatype for later in
+     * the object copying process.  (We currently only need to make a copy
+     * of the datatype if it's a vlen or reference datatype, or if the layout
+     * message is an early version, but since the layout information isn't
+     * available here, we just make a copy in all situations)
+     */
+    if(udata) {
+        /* Create a memory copy of the variable-length datatype */
+        if(NULL == (udata->src_dtype = H5T_copy(dt_src, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy")
+
+        /* Set the location of the source datatype to describe the disk form of the data */
+        if(H5T_set_loc(udata->src_dtype, file_src, H5T_LOC_DISK) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype on disk")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_dtype_copy_file
+ *
+ * Purpose:     Copy a native datatype message from one file to another.
+ *
+ * Return:      Success:        Native copy of message
+ *              Failure:        NULL
+ *
+ * Programmer:  James Laird
+ *              December 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_dtype_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const H5O_msg_class_t *mesg_type,
+    void *native_src, H5F_t *file_dst, hbool_t H5_ATTR_UNUSED *recompute_size,
+    H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *udata, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_t *dst_mesg;            /* Destination datatype */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Perform a normal copy of the object header message */
+    if(NULL == (dst_mesg = (H5T_t *)H5O_dtype_copy(native_src, NULL)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy")
+
+    /* The datatype will be in the new file; set its location. */
+    if(H5T_set_loc(dst_mesg, file_dst, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to set location")
+
+    ret_value = dst_mesg;
+
+done:
+    if(NULL == ret_value)
+        H5O_msg_free(mesg_type->id, dst_mesg);
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_dtype_shared_post_copy_upd
+ *
+ * Purpose:     Update a message after the shared message operations
+ *              during the post-copy loop
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              November 8, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_dtype_shared_post_copy_upd(const H5O_loc_t H5_ATTR_UNUSED *src_oloc,
+    const void H5_ATTR_UNUSED *mesg_src, H5O_loc_t H5_ATTR_UNUSED *dst_oloc, void *mesg_dst,
+    hid_t H5_ATTR_UNUSED dxpl_id, H5O_copy_t H5_ATTR_UNUSED *cpy_info)
+{
+    H5T_t       *dt_dst = (H5T_t *)mesg_dst;    /* Destination datatype */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(dt_dst->sh_loc.type == H5O_SHARE_TYPE_COMMITTED) {
+        HDassert(H5T_committed(dt_dst));
+        dt_dst->oloc.file = dt_dst->sh_loc.file;
+        dt_dst->oloc.addr = dt_dst->sh_loc.u.loc.oh_addr;
+    } /* end if */
+    else
+        HDassert(!H5T_committed(dt_dst));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_dtype_shared_post_copy_upd */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_dtype_debug
+ PURPOSE
+    Prints debugging information for a message
+ USAGE
+    void *H5O_dtype_debug(f, mesg, stream, indent, fwidth)
+	H5F_t *f;		IN: pointer to the HDF5 file struct
+	const void *mesg;	IN: Pointer to the source simple datatype
+				    struct
+	FILE *stream;		IN: Pointer to the stream for output data
+	int indent;		IN: Amount to indent information by
+	int fwidth;		IN: Field width (?)
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function prints debugging output to the stream passed as a
+    parameter.
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
+		int indent, int fwidth)
+{
+    const H5T_t		*dt = (const H5T_t*)mesg;
+    const char		*s;
+    char		buf[256];
+    unsigned		i;
+    size_t		k;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(dt);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    switch (dt->shared->type) {
+        case H5T_INTEGER:
+            s = "integer";
+            break;
+
+        case H5T_FLOAT:
+            s = "floating-point";
+            break;
+
+        case H5T_TIME:
+            s = "date and time";
+            break;
+
+        case H5T_STRING:
+            s = "text string";
+            break;
+
+        case H5T_BITFIELD:
+            s = "bit field";
+            break;
+
+        case H5T_OPAQUE:
+            s = "opaque";
+            break;
+
+        case H5T_COMPOUND:
+            s = "compound";
+            break;
+
+        case H5T_REFERENCE:
+            s = "reference";
+            break;
+
+        case H5T_ENUM:
+            s = "enum";
+            break;
+
+        case H5T_ARRAY:
+            s = "array";
+            break;
+
+        case H5T_VLEN:
+            s = "vlen";
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            sprintf(buf, "H5T_CLASS_%d", (int)(dt->shared->type));
+            s = buf;
+            break;
+    } /* end switch */
+    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	    "Type class:",
+	    s);
+
+    fprintf(stream, "%*s%-*s %lu byte%s\n", indent, "", fwidth,
+	    "Size:",
+	    (unsigned long)(dt->shared->size), 1 == dt->shared->size ? "" : "s");
+
+    fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+		"Version:", dt->shared->version);
+
+    if (H5T_COMPOUND == dt->shared->type) {
+	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+		"Number of members:",
+		dt->shared->u.compnd.nmembs);
+	for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+	    sprintf(buf, "Member %u:", i);
+	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		    buf,
+		    dt->shared->u.compnd.memb[i].name);
+	    fprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX(0, fwidth-3),
+		    "Byte offset:",
+		    (unsigned long)(dt->shared->u.compnd.memb[i].offset));
+	    H5O_dtype_debug(f, dxpl_id, dt->shared->u.compnd.memb[i].type, stream,
+			    indent + 3, MAX(0, fwidth - 3));
+	}
+    } else if(H5T_ENUM == dt->shared->type) {
+	fprintf(stream, "%*s%s\n", indent, "", "Base type:");
+	H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent+3, MAX(0, fwidth-3));
+	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+		"Number of members:",
+		dt->shared->u.enumer.nmembs);
+	for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
+	    sprintf(buf, "Member %u:", i);
+	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		    buf,
+		    dt->shared->u.enumer.name[i]);
+	    fprintf(stream, "%*s%-*s 0x", indent, "", fwidth,
+		    "Raw bytes of value:");
+	    for(k = 0; k < dt->shared->parent->shared->size; k++)
+		fprintf(stream, "%02x",
+			dt->shared->u.enumer.value[i*dt->shared->parent->shared->size + k]);
+	    fprintf(stream, "\n");
+	} /* end for */
+
+    } else if(H5T_OPAQUE == dt->shared->type) {
+	fprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth,
+		"Tag:", dt->shared->u.opaque.tag);
+    } else if(H5T_REFERENCE == dt->shared->type) {
+	fprintf(stream, "%*s%-*s\n", indent, "", fwidth,
+		"Fix dumping reference types!");
+    } else if(H5T_STRING == dt->shared->type) {
+        switch(dt->shared->u.atomic.u.s.cset) {
+            case H5T_CSET_ASCII:
+                s = "ASCII";
+                break;
+
+            case H5T_CSET_UTF8:
+                s = "UTF-8";
+                break;
+
+            case H5T_CSET_RESERVED_2:
+            case H5T_CSET_RESERVED_3:
+            case H5T_CSET_RESERVED_4:
+            case H5T_CSET_RESERVED_5:
+            case H5T_CSET_RESERVED_6:
+            case H5T_CSET_RESERVED_7:
+            case H5T_CSET_RESERVED_8:
+            case H5T_CSET_RESERVED_9:
+            case H5T_CSET_RESERVED_10:
+            case H5T_CSET_RESERVED_11:
+            case H5T_CSET_RESERVED_12:
+            case H5T_CSET_RESERVED_13:
+            case H5T_CSET_RESERVED_14:
+            case H5T_CSET_RESERVED_15:
+                sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.cset));
+                s = buf;
+                break;
+
+            case H5T_CSET_ERROR:
+            default:
+                sprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.atomic.u.s.cset));
+                s = buf;
+                break;
+        } /* end switch */
+        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Character Set:",
+                s);
+
+        switch(dt->shared->u.atomic.u.s.pad) {
+            case H5T_STR_NULLTERM:
+                s = "NULL Terminated";
+                break;
+
+            case H5T_STR_NULLPAD:
+                s = "NULL Padded";
+                break;
+
+            case H5T_STR_SPACEPAD:
+                s = "Space Padded";
+                break;
+
+            case H5T_STR_RESERVED_3:
+            case H5T_STR_RESERVED_4:
+            case H5T_STR_RESERVED_5:
+            case H5T_STR_RESERVED_6:
+            case H5T_STR_RESERVED_7:
+            case H5T_STR_RESERVED_8:
+            case H5T_STR_RESERVED_9:
+            case H5T_STR_RESERVED_10:
+            case H5T_STR_RESERVED_11:
+            case H5T_STR_RESERVED_12:
+            case H5T_STR_RESERVED_13:
+            case H5T_STR_RESERVED_14:
+            case H5T_STR_RESERVED_15:
+                sprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.pad));
+                s = buf;
+                break;
+
+            case H5T_STR_ERROR:
+            default:
+                sprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.atomic.u.s.pad));
+                s = buf;
+                break;
+        } /* end switch */
+        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "String Padding:",
+                s);
+    } else if(H5T_VLEN == dt->shared->type) {
+        switch(dt->shared->u.vlen.type) {
+            case H5T_VLEN_SEQUENCE:
+                s = "sequence";
+                break;
+
+            case H5T_VLEN_STRING:
+                s = "string";
+                break;
+
+            case H5T_VLEN_BADTYPE:
+            case H5T_VLEN_MAXTYPE:
+            default:
+                sprintf(buf, "H5T_VLEN_%d", dt->shared->u.vlen.type);
+                s = buf;
+                break;
+        } /* end switch */
+        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Vlen type:", s);
+
+        switch(dt->shared->u.vlen.loc) {
+            case H5T_LOC_MEMORY:
+                s = "memory";
+                break;
+
+            case H5T_LOC_DISK:
+                s = "disk";
+                break;
+
+            case H5T_LOC_BADLOC:
+            case H5T_LOC_MAXLOC:
+            default:
+                sprintf(buf, "H5T_LOC_%d", (int)dt->shared->u.vlen.loc);
+                s = buf;
+                break;
+        } /* end switch */
+        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Location:", s);
+
+        /* Extra information for VL-strings */
+        if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
+            switch(dt->shared->u.vlen.cset) {
+                case H5T_CSET_ASCII:
+                    s = "ASCII";
+                    break;
+
+                case H5T_CSET_UTF8:
+                    s = "UTF-8";
+                    break;
+
+                case H5T_CSET_RESERVED_2:
+                case H5T_CSET_RESERVED_3:
+                case H5T_CSET_RESERVED_4:
+                case H5T_CSET_RESERVED_5:
+                case H5T_CSET_RESERVED_6:
+                case H5T_CSET_RESERVED_7:
+                case H5T_CSET_RESERVED_8:
+                case H5T_CSET_RESERVED_9:
+                case H5T_CSET_RESERVED_10:
+                case H5T_CSET_RESERVED_11:
+                case H5T_CSET_RESERVED_12:
+                case H5T_CSET_RESERVED_13:
+                case H5T_CSET_RESERVED_14:
+                case H5T_CSET_RESERVED_15:
+                    sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.vlen.cset));
+                    s = buf;
+                    break;
+
+                case H5T_CSET_ERROR:
+                default:
+                    sprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.vlen.cset));
+                    s = buf;
+                    break;
+            } /* end switch */
+            fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Character Set:",
+                    s);
+
+            switch(dt->shared->u.vlen.pad) {
+                case H5T_STR_NULLTERM:
+                    s = "NULL Terminated";
+                    break;
+
+                case H5T_STR_NULLPAD:
+                    s = "NULL Padded";
+                    break;
+
+                case H5T_STR_SPACEPAD:
+                    s = "Space Padded";
+                    break;
+
+                case H5T_STR_RESERVED_3:
+                case H5T_STR_RESERVED_4:
+                case H5T_STR_RESERVED_5:
+                case H5T_STR_RESERVED_6:
+                case H5T_STR_RESERVED_7:
+                case H5T_STR_RESERVED_8:
+                case H5T_STR_RESERVED_9:
+                case H5T_STR_RESERVED_10:
+                case H5T_STR_RESERVED_11:
+                case H5T_STR_RESERVED_12:
+                case H5T_STR_RESERVED_13:
+                case H5T_STR_RESERVED_14:
+                case H5T_STR_RESERVED_15:
+                    sprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.vlen.pad));
+                    s = buf;
+                    break;
+
+                case H5T_STR_ERROR:
+                default:
+                    sprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.vlen.pad));
+                    s = buf;
+                    break;
+            } /* end switch */
+            fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "String Padding:",
+                    s);
+        } /* end if */
+    } else if(H5T_ARRAY == dt->shared->type) {
+	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+		"Rank:",
+		dt->shared->u.array.ndims);
+        fprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:");
+        for(i = 0; i < dt->shared->u.array.ndims; i++)
+            fprintf(stream, "%s%u", (i ? ", " : ""), (unsigned)dt->shared->u.array.dim[i]);
+        fprintf(stream, "}\n");
+	fprintf(stream, "%*s%s\n", indent, "", "Base type:");
+	H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent + 3, MAX(0, fwidth - 3));
+    } else {
+	switch (dt->shared->u.atomic.order) {
+            case H5T_ORDER_LE:
+                s = "little endian";
+                break;
+
+            case H5T_ORDER_BE:
+                s = "big endian";
+                break;
+
+            case H5T_ORDER_VAX:
+                s = "VAX";
+                break;
+
+            case H5T_ORDER_NONE:
+                s = "none";
+                break;
+
+            case H5T_ORDER_MIXED:
+                s = "mixed";
+                break;
+
+            case H5T_ORDER_ERROR:
+            default:
+                sprintf(buf, "H5T_ORDER_%d", dt->shared->u.atomic.order);
+                s = buf;
+                break;
+	} /* end switch */
+	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		"Byte order:",
+		s);
+
+	fprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
+		"Precision:",
+		(unsigned long)(dt->shared->u.atomic.prec),
+		1==dt->shared->u.atomic.prec?"":"s");
+
+	fprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
+		"Offset:",
+		(unsigned long)(dt->shared->u.atomic.offset),
+		1==dt->shared->u.atomic.offset?"":"s");
+
+	switch (dt->shared->u.atomic.lsb_pad) {
+            case H5T_PAD_ZERO:
+                s = "zero";
+                break;
+
+            case H5T_PAD_ONE:
+                s = "one";
+                break;
+
+            case H5T_PAD_BACKGROUND:
+                s = "background";
+                break;
+
+            case H5T_PAD_ERROR:
+            case H5T_NPAD:
+            default:
+                s = "pad?";
+                break;
+	} /* end switch */
+	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		"Low pad type:", s);
+
+	switch (dt->shared->u.atomic.msb_pad) {
+            case H5T_PAD_ZERO:
+                s = "zero";
+                break;
+
+            case H5T_PAD_ONE:
+                s = "one";
+                break;
+
+            case H5T_PAD_BACKGROUND:
+                s = "background";
+                break;
+
+            case H5T_PAD_ERROR:
+            case H5T_NPAD:
+            default:
+                s = "pad?";
+                break;
+	} /* end switch */
+	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		"High pad type:", s);
+
+	if (H5T_FLOAT == dt->shared->type) {
+	    switch (dt->shared->u.atomic.u.f.pad) {
+                case H5T_PAD_ZERO:
+                    s = "zero";
+                    break;
+
+                case H5T_PAD_ONE:
+                    s = "one";
+                    break;
+
+                case H5T_PAD_BACKGROUND:
+                    s = "background";
+                    break;
+
+                case H5T_PAD_ERROR:
+                case H5T_NPAD:
+                default:
+                    if (dt->shared->u.atomic.u.f.pad < 0)
+                        sprintf(buf, "H5T_PAD_%d", -(dt->shared->u.atomic.u.f.pad));
+                    else
+                        sprintf(buf, "bit-%d", dt->shared->u.atomic.u.f.pad);
+                    s = buf;
+                    break;
+	    } /* end switch */
+	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		    "Internal pad type:", s);
+
+	    switch (dt->shared->u.atomic.u.f.norm) {
+                case H5T_NORM_IMPLIED:
+                    s = "implied";
+                    break;
+
+                case H5T_NORM_MSBSET:
+                    s = "msb set";
+                    break;
+
+                case H5T_NORM_NONE:
+                    s = "none";
+                    break;
+
+                case H5T_NORM_ERROR:
+                default:
+                    sprintf(buf, "H5T_NORM_%d", (int) (dt->shared->u.atomic.u.f.norm));
+                    s = buf;
+	    } /* end switch */
+	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		    "Normalization:", s);
+
+	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+		    "Sign bit location:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.sign));
+
+	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+		    "Exponent location:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.epos));
+
+	    fprintf(stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth,
+		    "Exponent bias:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.ebias));
+
+	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+		    "Exponent size:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.esize));
+
+	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+		    "Mantissa location:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.mpos));
+
+	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+		    "Mantissa size:",
+		    (unsigned long) (dt->shared->u.atomic.u.f.msize));
+
+	} else if (H5T_INTEGER == dt->shared->type) {
+	    switch (dt->shared->u.atomic.u.i.sign) {
+                case H5T_SGN_NONE:
+                    s = "none";
+                    break;
+
+                case H5T_SGN_2:
+                    s = "2's comp";
+                    break;
+
+                case H5T_SGN_ERROR:
+                case H5T_NSGN:
+                default:
+                    sprintf(buf, "H5T_SGN_%d", (int) (dt->shared->u.atomic.u.i.sign));
+                    s = buf;
+                    break;
+	    } /* end switch */
+	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+		    "Sign scheme:", s);
+	}
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_dtype_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oefl.c b/gatb-core/thirdparty/hdf5/src/H5Oefl.c
new file mode 100644
index 0000000..c413c3c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oefl.c
@@ -0,0 +1,591 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Robb Matzke <matzke at llnl.gov>
+ *	       Tuesday, November 25, 1997
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_efl_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_efl_copy(const void *_mesg, void *_dest);
+static size_t H5O_efl_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_efl_reset(void *_mesg);
+static void *H5O_efl_copy_file(H5F_t *file_src, void *mesg_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_efl_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
+			    int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_EFL[1] = {{
+    H5O_EFL_ID,		    	/*message id number		*/
+    "external file list",   	/*message name for debugging    */
+    sizeof(H5O_efl_t),	    	/*native message size	    	*/
+    0,				/* messages are sharable?       */
+    H5O_efl_decode,	    	/*decode message		*/
+    H5O_efl_encode,	    	/*encode message		*/
+    H5O_efl_copy,	    	/*copy native value		*/
+    H5O_efl_size,	    	/*size of message on disk	*/
+    H5O_efl_reset,	    	/*reset method		    	*/
+    NULL,		            /* free method			*/
+    NULL,		        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    H5O_efl_copy_file,		/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_efl_debug	    	/*debug the message		*/
+}};
+
+#define H5O_EFL_VERSION		1
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_decode
+ *
+ * Purpose:	Decode an external file list message and return a pointer to
+ *		the message (and some other data).
+ *
+ * Return:	Success:	Ptr to a new message struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ * Modification:
+ *              Raymond Lu
+ *              11 April 2011
+ *              We allow zero dimension size starting from the 1.8.7 release.
+ *              The dataset size of external storage can be zero.
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_efl_t		*mesg = NULL;
+    int			version;
+    const char		*s = NULL;
+    H5HL_t              *heap;
+    size_t		u;      /* Local index variable */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(p);
+
+    if(NULL == (mesg = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Version */
+    version = *p++;
+    if(version != H5O_EFL_VERSION)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for external file list message")
+
+    /* Reserved */
+    p += 3;
+
+    /* Number of slots */
+    UINT16DECODE(p, mesg->nalloc);
+    HDassert(mesg->nalloc>0);
+    UINT16DECODE(p, mesg->nused);
+    HDassert(mesg->nused <= mesg->nalloc);
+
+    /* Heap address */
+    H5F_addr_decode(f, &p, &(mesg->heap_addr));
+
+#ifndef NDEBUG
+    HDassert(H5F_addr_defined(mesg->heap_addr));
+
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value")
+
+    s = (const char *)H5HL_offset_into(heap, 0);
+
+    HDassert(s && !*s);
+
+    if(H5HL_unprotect(heap) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read unprotect link value")
+    heap = NULL;
+#endif
+
+    /* Decode the file list */
+    mesg->slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t));
+    if(NULL == mesg->slot)
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value")
+    for(u = 0; u < mesg->nused; u++) {
+	/* Name */
+	H5F_DECODE_LENGTH (f, p, mesg->slot[u].name_offset);
+
+        s = (const char *)H5HL_offset_into(heap, mesg->slot[u].name_offset);
+	HDassert(s && *s);
+	mesg->slot[u].name = H5MM_xstrdup (s);
+        HDassert(mesg->slot[u].name);
+
+	/* File offset */
+	H5F_DECODE_LENGTH (f, p, mesg->slot[u].offset);
+
+	/* Size */
+	H5F_DECODE_LENGTH (f, p, mesg->slot[u].size);
+    } /* end for */
+
+    if(H5HL_unprotect(heap) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read unprotect link value")
+    heap = NULL;
+
+    /* Set return value */
+    ret_value = mesg;
+
+done:
+    if(ret_value == NULL)
+        if(mesg != NULL)
+            H5MM_xfree(mesg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_efl_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_encode
+ *
+ * Purpose:	Encodes a message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_efl_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_efl_t	*mesg = (const H5O_efl_t *)_mesg;
+    size_t		u;      /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(p);
+
+    /* Version */
+    *p++ = H5O_EFL_VERSION;
+
+    /* Reserved */
+    *p++ = 0;
+    *p++ = 0;
+    *p++ = 0;
+
+    /* Number of slots */
+    HDassert(mesg->nalloc > 0);
+    UINT16ENCODE(p, mesg->nused); /*yes, twice*/
+    HDassert(mesg->nused > 0 && mesg->nused <= mesg->nalloc);
+    UINT16ENCODE(p, mesg->nused);
+
+    /* Heap address */
+    HDassert(H5F_addr_defined(mesg->heap_addr));
+    H5F_addr_encode(f, &p, mesg->heap_addr);
+
+    /* Encode file list */
+    for(u = 0; u < mesg->nused; u++) {
+	/*
+	 * The name should have been added to the heap when the dataset was
+	 * created.
+	 */
+	HDassert(mesg->slot[u].name_offset);
+	H5F_ENCODE_LENGTH(f, p, mesg->slot[u].name_offset);
+	H5F_ENCODE_LENGTH(f, p, (hsize_t)mesg->slot[u].offset);
+	H5F_ENCODE_LENGTH(f, p, mesg->slot[u].size);
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_efl_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_efl_copy(const void *_mesg, void *_dest)
+{
+    const H5O_efl_t	*mesg = (const H5O_efl_t *) _mesg;
+    H5O_efl_t		*dest = (H5O_efl_t *) _dest;
+    size_t		u;              /* Local index variable */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(mesg);
+    if(!dest) {
+	if(NULL == (dest = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message")
+        if(NULL == (dest->slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t))))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slots")
+    } /* end if */
+    else if(dest->nalloc < mesg->nalloc) {
+        H5O_efl_entry_t *temp_slot;     /* Temporary pointer to new slot information */
+
+        /* Allocate new 'slot' information */
+        if(NULL == (temp_slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t))))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slots")
+
+        /* Release old 'slot' information */
+        for(u = 0; u < dest->nused; u++)
+            dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
+        dest->slot = (H5O_efl_entry_t *)H5MM_xfree(dest->slot);
+
+        /* Point to new 'slot' information */
+        dest->slot = temp_slot;
+    } /* end if */
+    else {
+        /* Release old 'slot' information */
+        for(u = 0; u < dest->nused; u++)
+            dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
+    } /* end else */
+    dest->heap_addr = mesg->heap_addr;
+    dest->nalloc = mesg->nalloc;
+    dest->nused = mesg->nused;
+
+    for(u = 0; u < mesg->nused; u++) {
+	dest->slot[u] = mesg->slot[u];
+	if(NULL == (dest->slot[u].name = H5MM_xstrdup(mesg->slot[u].name)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slot name")
+    } /* end for */
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    if(NULL == ret_value) {
+        if(dest && NULL == _dest) {
+            if(dest->slot) {
+                for(u = 0; u < mesg->nused; u++) {
+                    if(dest->slot[u].name != NULL && dest->slot[u].name != mesg->slot[u].name)
+                        dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
+                } /* end for */
+                dest->slot = (H5O_efl_entry_t *)H5MM_xfree(dest->slot);
+            } /* end if */
+            dest = (H5O_efl_t *)H5MM_xfree(dest);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_efl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not counting the
+ *		message type or size fields, but only the data fields.	This
+ *		function doesn't take into account message alignment. This
+ *		function doesn't count unused slots.
+ *
+ * Return:	Success:	Message data size in bytes.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_efl_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_efl_t	*mesg = (const H5O_efl_t *) _mesg;
+    size_t		ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+
+    ret_value = (size_t)H5F_SIZEOF_ADDR(f) +			/*heap address	*/
+		2 +					/*slots allocated*/
+		2 +					/*num slots used*/
+		4 +					/*reserved	*/
+		mesg->nused * ((size_t)H5F_SIZEOF_SIZE(f) +	/*name offset	*/
+			       (size_t)H5F_SIZEOF_SIZE(f) +	/*file offset	*/
+			       (size_t)H5F_SIZEOF_SIZE(f));	/*file size	*/
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_efl_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_reset
+ *
+ * Purpose:	Frees internal pointers and resets the message to an
+ *		initialial state.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_efl_reset(void *_mesg)
+{
+    H5O_efl_t	*mesg = (H5O_efl_t *) _mesg;
+    size_t	u;              /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(mesg);
+
+    /* reset */
+    if(mesg->slot) {
+        for(u = 0; u < mesg->nused; u++)
+            mesg->slot[u].name = (char *)H5MM_xfree(mesg->slot[u].name);
+        mesg->slot = (H5O_efl_entry_t *)H5MM_xfree(mesg->slot);
+    } /* end if */
+    mesg->heap_addr = HADDR_UNDEF;
+    mesg->nused = mesg->nalloc = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_efl_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_total_size
+ *
+ * Purpose:	Return the total size of the external file list by summing
+ *		the sizes of all of the files.
+ *
+ * Return:	Success:	Total reserved size for external data.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March  3, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5O_efl_total_size (H5O_efl_t *efl)
+{
+    hsize_t	ret_value = 0, tmp;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(efl->nused > 0 && H5O_EFL_UNLIMITED == efl->slot[efl->nused - 1].size)
+	ret_value = H5O_EFL_UNLIMITED;
+    else {
+        size_t		u;      /* Local index variable */
+
+	for(u = 0; u < efl->nused; u++, ret_value = tmp) {
+	    tmp = ret_value + efl->slot[u].size;
+	    if(tmp <= ret_value)
+		HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, 0, "total external storage size overflowed");
+	} /* end for */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_efl_total_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_efl_copy_file
+ *
+ * Purpose:     Copies an efl message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Peter Cao
+ *              September 29, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_efl_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *mesg_src, H5F_t *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *_udata, hid_t dxpl_id)
+{
+    H5O_efl_t   *efl_src = (H5O_efl_t *) mesg_src;
+    H5O_efl_t   *efl_dst = NULL;
+    H5HL_t      *heap = NULL;                           /* Pointer to local heap for EFL file names */
+    size_t      idx, size, name_offset, heap_size;
+    void        *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(efl_src);
+    HDassert(file_dst);
+
+    /* Allocate space for the destination efl */
+    if(NULL == (efl_dst = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the "top level" information */
+    HDmemcpy(efl_dst, efl_src, sizeof(H5O_efl_t));
+
+    /* Determine size needed for destination heap */
+    heap_size = H5HL_ALIGN(1);  /* "empty" name */
+    for(idx = 0; idx < efl_src->nused; idx++)
+        heap_size += H5HL_ALIGN(HDstrlen(efl_src->slot[idx].name) + 1);
+
+    /* Create name heap */
+    if(H5HL_create(file_dst, dxpl_id, heap_size, &efl_dst->heap_addr/*out*/) < 0)
+        HGOTO_ERROR(H5E_EFL, H5E_CANTINIT, NULL, "can't create heap")
+
+    /* Pin the heap down in memory */
+    if(NULL == (heap = H5HL_protect(file_dst, dxpl_id, efl_dst->heap_addr, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_EFL, H5E_PROTECT, NULL, "unable to protect EFL file name heap")
+
+    /* Insert "empty" name first */
+    if((size_t)(-1) == (name_offset = H5HL_insert(file_dst, dxpl_id, heap, (size_t)1, "")))
+        HGOTO_ERROR(H5E_EFL, H5E_CANTINSERT, NULL, "can't insert file name into heap")
+    HDassert(0 == name_offset);
+
+    /* allocate array of external file entries */
+    if(efl_src->nalloc > 0) {
+        size = efl_src->nalloc * sizeof(H5O_efl_entry_t);
+        if((efl_dst->slot = (H5O_efl_entry_t *)H5MM_calloc(size)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* copy content from the source. Need to update later */
+        HDmemcpy(efl_dst->slot, efl_src->slot, size);
+    } /* end if */
+
+    /* copy the name from the source */
+    for(idx = 0; idx < efl_src->nused; idx++) {
+        efl_dst->slot[idx].name = H5MM_xstrdup(efl_src->slot[idx].name);
+        if((size_t)(-1) == (efl_dst->slot[idx].name_offset = H5HL_insert(file_dst, dxpl_id, heap,
+                HDstrlen(efl_dst->slot[idx].name) + 1, efl_dst->slot[idx].name)))
+            HGOTO_ERROR(H5E_EFL, H5E_CANTINSERT, NULL, "can't insert file name into heap")
+    } /* end for */
+
+    /* Set return value */
+    ret_value = efl_dst;
+
+done:
+    /* Release resources */
+    if(heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_EFL, H5E_PROTECT, NULL, "unable to unprotect EFL file name heap")
+    if(!ret_value)
+        if(efl_dst)
+            H5MM_xfree(efl_dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_efl_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_efl_debug
+ *
+ * Purpose:	Prints debugging info for a message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November 25, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_efl_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	      int indent, int fwidth)
+{
+    const H5O_efl_t	   *mesg = (const H5O_efl_t *) _mesg;
+    size_t		    u;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Heap address:", mesg->heap_addr);
+
+    HDfprintf(stream, "%*s%-*s %u/%u\n", indent, "", fwidth,
+	      "Slots used/allocated:",
+	      mesg->nused, mesg->nalloc);
+
+    for(u = 0; u < mesg->nused; u++) {
+        char		    buf[64];
+
+	HDsnprintf(buf, sizeof(buf), "File %u", (unsigned)u);
+	HDfprintf(stream, "%*s%s:\n", indent, "", buf);
+
+	HDfprintf(stream, "%*s%-*s \"%s\"\n", indent+3, "", MAX (fwidth-3, 0),
+		  "Name:",
+		  mesg->slot[u].name);
+
+	HDfprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX (fwidth-3, 0),
+		  "Name offset:",
+		  (unsigned long)(mesg->slot[u].name_offset));
+
+	HDfprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX (fwidth-3, 0),
+		   "Offset of data in file:",
+		   (unsigned long)(mesg->slot[u].offset));
+
+	HDfprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX (fwidth-3, 0),
+		   "Bytes reserved for data:",
+		   (unsigned long)(mesg->slot[u].size));
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_efl_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ofill.c b/gatb-core/thirdparty/hdf5/src/H5Ofill.c
new file mode 100644
index 0000000..3bdf2b6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ofill.c
@@ -0,0 +1,1025 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Wednesday, September 30, 1998
+ *
+ * Purpose:	The fill message indicates a bit pattern to use for
+ *		uninitialized data points of a dataset.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5Sprivate.h"		/* Dataspaces				*/
+
+
+static void  *H5O_fill_old_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_fill_old_encode(H5F_t *f, uint8_t *p, const void *_mesg);
+static size_t H5O_fill_old_size(const H5F_t *f, const void *_mesg);
+static void  *H5O_fill_new_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_fill_new_encode(H5F_t *f, uint8_t *p, const void *_mesg);
+static size_t H5O_fill_new_size(const H5F_t *f, const void *_mesg);
+static void  *H5O_fill_copy(const void *_mesg, void *_dest);
+static herr_t H5O_fill_reset(void *_mesg);
+static herr_t H5O_fill_free(void *_mesg);
+static herr_t H5O_fill_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+			     int indent, int fwidth);
+
+/* Set up & include shared message "interface" info */
+#define H5O_SHARED_TYPE			H5O_MSG_FILL
+#define H5O_SHARED_DECODE		H5O_fill_shared_decode
+#define H5O_SHARED_DECODE_REAL		H5O_fill_old_decode
+#define H5O_SHARED_ENCODE		H5O_fill_shared_encode
+#define H5O_SHARED_ENCODE_REAL		H5O_fill_old_encode
+#define H5O_SHARED_SIZE			H5O_fill_shared_size
+#define H5O_SHARED_SIZE_REAL		H5O_fill_old_size
+#define H5O_SHARED_DELETE		H5O_fill_shared_delete
+#undef H5O_SHARED_DELETE_REAL
+#define H5O_SHARED_LINK			H5O_fill_shared_link
+#undef H5O_SHARED_LINK_REAL
+#define H5O_SHARED_COPY_FILE		H5O_fill_shared_copy_file
+#undef H5O_SHARED_COPY_FILE_REAL
+#define H5O_SHARED_POST_COPY_FILE	H5O_fill_shared_post_copy_file
+#undef H5O_SHARED_POST_COPY_FILE_REAL
+#undef  H5O_SHARED_POST_COPY_FILE_UPD
+#define H5O_SHARED_DEBUG		H5O_fill_shared_debug
+#define H5O_SHARED_DEBUG_REAL		H5O_fill_debug
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* Set up & include shared message "interface" info */
+/* (Kludgy 'undef's in order to re-include the H5Oshared.h header) */
+#undef H5O_SHARED_TYPE
+#define H5O_SHARED_TYPE			H5O_MSG_FILL_NEW
+#undef H5O_SHARED_DECODE
+#define H5O_SHARED_DECODE		H5O_fill_new_shared_decode
+#undef H5O_SHARED_DECODE_REAL
+#define H5O_SHARED_DECODE_REAL		H5O_fill_new_decode
+#undef H5O_SHARED_ENCODE
+#define H5O_SHARED_ENCODE		H5O_fill_new_shared_encode
+#undef H5O_SHARED_ENCODE_REAL
+#define H5O_SHARED_ENCODE_REAL		H5O_fill_new_encode
+#undef H5O_SHARED_SIZE
+#define H5O_SHARED_SIZE			H5O_fill_new_shared_size
+#undef H5O_SHARED_SIZE_REAL
+#define H5O_SHARED_SIZE_REAL		H5O_fill_new_size
+#undef H5O_SHARED_DELETE
+#define H5O_SHARED_DELETE		H5O_fill_new_shared_delete
+#undef H5O_SHARED_DELETE_REAL
+#undef H5O_SHARED_LINK
+#define H5O_SHARED_LINK			H5O_fill_new_shared_link
+#undef H5O_SHARED_LINK_REAL
+#undef H5O_SHARED_COPY_FILE
+#define H5O_SHARED_COPY_FILE		H5O_fill_new_shared_copy_file
+#undef H5O_SHARED_COPY_FILE_REAL
+#undef H5O_SHARED_POST_COPY_FILE
+#define H5O_SHARED_POST_COPY_FILE	H5O_fill_new_shared_post_copy_file
+#undef H5O_SHARED_POST_COPY_FILE_REAL
+#undef  H5O_SHARED_POST_COPY_FILE_UPD
+#undef H5O_SHARED_DEBUG
+#define H5O_SHARED_DEBUG		H5O_fill_new_shared_debug
+#undef H5O_SHARED_DEBUG_REAL
+#define H5O_SHARED_DEBUG_REAL		H5O_fill_debug
+#undef H5Oshared_H
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* This message derives from H5O message class, for old fill value before version 1.5 */
+const H5O_msg_class_t H5O_MSG_FILL[1] = {{
+    H5O_FILL_ID,                /*message id number                     */
+    "fill",                     /*message name for debugging            */
+    sizeof(H5O_fill_t),		/*native message size                   */
+    H5O_SHARE_IS_SHARABLE|H5O_SHARE_IN_OHDR,	/* messages are sharable?       */
+    H5O_fill_shared_decode,	/*decode message                        */
+    H5O_fill_shared_encode,	/*encode message                        */
+    H5O_fill_copy,		/*copy the native value                 */
+    H5O_fill_shared_size,	/*raw message size			*/
+    H5O_fill_reset,		/*free internal memory			*/
+    H5O_fill_free,		/* free method				*/
+    H5O_fill_shared_delete,	/* file delete method			*/
+    H5O_fill_shared_link,	/* link method				*/
+    NULL,			/* set share method			*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file	*/
+    H5O_fill_shared_copy_file,	/* copy native value to file		*/
+    H5O_fill_shared_post_copy_file,	/* post copy native value to file	*/
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_fill_shared_debug       /*debug the message			*/
+}};
+
+/* This message derives from H5O message class, for new fill value after version 1.4  */
+const H5O_msg_class_t H5O_MSG_FILL_NEW[1] = {{
+    H5O_FILL_NEW_ID,		/*message id number			*/
+    "fill_new", 		/*message name for debugging		*/
+    sizeof(H5O_fill_t),		/*native message size			*/
+    H5O_SHARE_IS_SHARABLE|H5O_SHARE_IN_OHDR,	/* messages are sharable?       */
+    H5O_fill_new_shared_decode,	/*decode message			*/
+    H5O_fill_new_shared_encode,	/*encode message			*/
+    H5O_fill_copy,		/*copy the native value			*/
+    H5O_fill_new_shared_size,	/*raw message size			*/
+    H5O_fill_reset,		/*free internal memory			*/
+    H5O_fill_free,		/* free method				*/
+    H5O_fill_new_shared_delete,	/* file delete method			*/
+    H5O_fill_new_shared_link,	/* link method				*/
+    NULL,			/* set share method			*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file	*/
+    H5O_fill_new_shared_copy_file, /* copy native value to file		*/
+    H5O_fill_new_shared_post_copy_file,	/* post copy native value to file	*/
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_fill_new_shared_debug	/*debug the message			*/
+}};
+
+/* Masks, shift values & flags for fill value message */
+#define H5O_FILL_MASK_ALLOC_TIME        0x03
+#define H5O_FILL_SHIFT_ALLOC_TIME       0
+#define H5O_FILL_MASK_FILL_TIME         0x03
+#define H5O_FILL_SHIFT_FILL_TIME        2
+#define H5O_FILL_FLAG_UNDEFINED_VALUE   0x10
+#define H5O_FILL_FLAG_HAVE_VALUE        0x20
+#define H5O_FILL_FLAGS_ALL              (H5O_FILL_MASK_ALLOC_TIME | (H5O_FILL_MASK_FILL_TIME << H5O_FILL_SHIFT_FILL_TIME) | H5O_FILL_FLAG_UNDEFINED_VALUE | H5O_FILL_FLAG_HAVE_VALUE)
+
+/* Declare a free list to manage the H5O_fill_t struct */
+H5FL_DEFINE(H5O_fill_t);
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_new_decode
+ *
+ * Purpose:	Decode a new fill value message.  The new fill value
+ * 		message is fill value plus space allocation time and
+ * 		fill value writing time and whether fill value is defined.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *		Failure:	NULL
+ *
+ * Programmer:  Raymond Lu
+ *              Feb 26, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_fill_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_fill_t	*fill = NULL;
+    void	*ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(p);
+
+    if(NULL == (fill = H5FL_CALLOC(H5O_fill_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value message")
+
+    /* Version */
+    fill->version = *p++;
+    if(fill->version < H5O_FILL_VERSION_1 || fill->version > H5O_FILL_VERSION_LATEST)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for fill value message")
+
+    /* Decode each version */
+    if(fill->version < H5O_FILL_VERSION_3) {
+        /* Space allocation time */
+        fill->alloc_time = (H5D_alloc_time_t)*p++;
+
+        /* Fill value write time */
+        fill->fill_time = (H5D_fill_time_t)*p++;
+
+        /* Whether fill value is defined */
+        fill->fill_defined = *p++;
+
+        /* Only decode fill value information if one is defined */
+        if(fill->fill_defined) {
+            INT32DECODE(p, fill->size);
+            if(fill->size > 0) {
+                H5_CHECK_OVERFLOW(fill->size, ssize_t, size_t);
+                if(NULL == (fill->buf = H5MM_malloc((size_t)fill->size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value")
+                HDmemcpy(fill->buf, p, (size_t)fill->size);
+            } /* end if */
+        } /* end if */
+        else
+            fill->size = (-1);
+    } /* end if */
+    else {
+        unsigned flags;          /* Status flags */
+
+        /* Flags */
+        flags = *p++;
+
+        /* Check for unknown flags */
+        if(flags & (unsigned)~H5O_FILL_FLAGS_ALL)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "unknown flag for fill value message")
+
+        /* Space allocation time */
+        fill->alloc_time = (H5D_alloc_time_t)((flags >> H5O_FILL_SHIFT_ALLOC_TIME) & H5O_FILL_MASK_ALLOC_TIME);
+
+        /* Fill value write time */
+        fill->fill_time = (H5D_fill_time_t)((flags >> H5O_FILL_SHIFT_FILL_TIME) & H5O_FILL_MASK_FILL_TIME);
+
+        /* Check for undefined fill value */
+        if(flags & H5O_FILL_FLAG_UNDEFINED_VALUE) {
+            /* Sanity check */
+            HDassert(!(flags & H5O_FILL_FLAG_HAVE_VALUE));
+
+            /* Set value for "undefined" fill value */
+            fill->size = (-1);
+        } /* end if */
+        else if(flags & H5O_FILL_FLAG_HAVE_VALUE) {
+            /* Fill value size */
+            UINT32DECODE(p, fill->size);
+
+            /* Fill value */
+            H5_CHECK_OVERFLOW(fill->size, ssize_t, size_t);
+            if(NULL == (fill->buf = H5MM_malloc((size_t)fill->size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value")
+            HDmemcpy(fill->buf, p, (size_t)fill->size);
+
+            /* Set the "defined" flag */
+            fill->fill_defined = TRUE;
+        } /* end else */
+        else {
+            /* Set the "defined" flag */
+            fill->fill_defined = TRUE;
+        } /* end else */
+    } /* end else */
+
+    /* Set return value */
+    ret_value = (void *)fill;
+
+done:
+    if(!ret_value && fill) {
+        if(fill->buf)
+            H5MM_xfree(fill->buf);
+	fill = H5FL_FREE(H5O_fill_t, fill);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fill_new_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fill_old_decode
+ *
+ * Purpose:     Decode an old fill value message.
+ *
+ * Return:      Success:        Ptr to new message in native struct.
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, September 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_fill_old_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_fill_t *fill = NULL;		/* Decoded fill value message */
+    void *ret_value;                    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(p);
+
+    if(NULL == (fill = H5FL_CALLOC(H5O_fill_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value message")
+
+    /* Set non-zero default fields */
+    fill->version = H5O_FILL_VERSION_2;
+    fill->alloc_time = H5D_ALLOC_TIME_LATE;
+    fill->fill_time = H5D_FILL_TIME_IFSET;
+
+    /* Fill value size */
+    UINT32DECODE(p, fill->size);
+
+    /* Only decode the fill value itself if there is one */
+    if(fill->size > 0) {
+        if(NULL == (fill->buf = H5MM_malloc((size_t)fill->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value")
+        HDmemcpy(fill->buf, p, (size_t)fill->size);
+        fill->fill_defined = TRUE;
+    } /* end if */
+    else
+        fill->size = (-1);
+
+    /* Set return value */
+    ret_value = (void*)fill;
+
+done:
+    if(!ret_value && fill) {
+        if(fill->buf)
+            H5MM_xfree(fill->buf);
+	fill = H5FL_FREE(H5O_fill_t, fill);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fill_old_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_new_encode
+ *
+ * Purpose:	Encode a new fill value message.  The new fill value
+ *              message is fill value plus space allocation time and
+ *              fill value writing time and whether fill value is defined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Feb 26, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fill_new_encode(H5F_t H5_ATTR_UNUSED *f, uint8_t *p, const void *_fill)
+{
+    const H5O_fill_t	*fill = (const H5O_fill_t *)_fill;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(p);
+    HDassert(fill && NULL == fill->type);
+
+    /* Version */
+    *p++ = (uint8_t)fill->version;
+
+    if(fill->version < H5O_FILL_VERSION_3) {
+        /* Space allocation time */
+        *p++ = fill->alloc_time;
+
+        /* Fill value writing time */
+        *p++ = fill->fill_time;
+
+        /* Whether fill value is defined */
+        *p++ = (uint8_t)fill->fill_defined;
+
+        /* Only write out the size and fill value if it is defined */
+        if(fill->fill_defined) {
+            UINT32ENCODE(p, fill->size);
+            if(fill->size > 0)
+                if(fill->buf) {
+                    H5_CHECK_OVERFLOW(fill->size, ssize_t, size_t);
+                    HDmemcpy(p, fill->buf, (size_t)fill->size);
+                } /* end if */
+        } /* end if */
+    } /* end if */
+    else {
+        uint8_t flags = 0;      /* Fill value setting flags */
+
+        /* Encode space allocation time */
+        HDassert(fill->alloc_time == (H5O_FILL_MASK_ALLOC_TIME & fill->alloc_time));
+        flags = (uint8_t)(flags | ((H5O_FILL_MASK_ALLOC_TIME & fill->alloc_time) << H5O_FILL_SHIFT_ALLOC_TIME));
+
+        /* Encode fill value writing time */
+        HDassert(fill->fill_time == (H5O_FILL_MASK_FILL_TIME & fill->fill_time));
+        flags = (uint8_t)(flags | ((H5O_FILL_MASK_FILL_TIME & fill->fill_time) << H5O_FILL_SHIFT_FILL_TIME));
+
+        /* Check if we need to encode a fill value size */
+        if(fill->size < 0) {
+            /* Indicate that the fill value has been "undefined" by the user */
+            flags |= H5O_FILL_FLAG_UNDEFINED_VALUE;
+
+            /* Flags */
+            *p++ = (uint8_t)flags;
+
+            /* Sanity check */
+            HDassert(!fill->buf);
+        } /* end if */
+        else if(fill->size > 0) {
+            /* Indicate that a fill value size is present */
+            flags |= H5O_FILL_FLAG_HAVE_VALUE;
+
+            /* Flags */
+            *p++ = (uint8_t)flags;
+
+            /* Encode the size of fill value */
+            INT32ENCODE(p, fill->size);
+
+            /* Encode the fill value */
+            HDassert(fill->buf);
+            H5_CHECK_OVERFLOW(fill->size, ssize_t, size_t);
+            HDmemcpy(p, fill->buf, (size_t)fill->size);
+        } /* end if */
+        else {
+            /* Flags */
+            *p++ = (uint8_t)flags;
+
+            /* Sanity check */
+            HDassert(!fill->buf);
+        } /* end else */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fill_new_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fill_old_encode
+ *
+ * Purpose:     Encode an old fill value message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fill_old_encode(H5F_t H5_ATTR_UNUSED *f, uint8_t *p, const void *_fill)
+{
+    const H5O_fill_t *fill = (const H5O_fill_t *)_fill;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(p);
+    HDassert(fill && NULL == fill->type);
+
+    UINT32ENCODE(p, fill->size);
+    if(fill->buf)
+        HDmemcpy(p, fill->buf, (size_t)fill->size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fill_old_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.  The new fill value message is fill value plus
+ *		space allocation time and fill value writing time and
+ *		whether fill value is defined.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *		Failure:	NULL
+ *
+ * Programmer:  Raymond Lu
+ *              Feb 26, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_fill_copy(const void *_src, void *_dst)
+{
+    const H5O_fill_t	*src = (const H5O_fill_t *)_src;
+    H5O_fill_t		*dst = (H5O_fill_t *)_dst;
+    void		*ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(src);
+
+    if(!dst && NULL == (dst = H5FL_MALLOC(H5O_fill_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill message")
+
+    /* Shallow copy basic fields */
+    *dst = *src;
+
+    /* Copy data type of fill value */
+    if(src->type) {
+        if(NULL == (dst->type = H5T_copy(src->type, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "can't copy datatype")
+    } /* end if */
+    else
+        dst->type = NULL;
+
+    /* Copy fill value and its size */
+    if(src->buf) {
+        H5_CHECK_OVERFLOW(src->size, ssize_t, size_t);
+	if(NULL == (dst->buf = H5MM_malloc((size_t)src->size)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for fill value")
+	HDmemcpy(dst->buf, src->buf, (size_t)src->size);
+
+        /* Check for needing to convert/copy fill value */
+        if(src->type) {
+            H5T_path_t *tpath;      /* Conversion information */
+
+            /* Set up type conversion function */
+            if(NULL == (tpath = H5T_path_find(src->type, dst->type, NULL, NULL, H5AC_ind_dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, NULL, "unable to convert between src and dst data types")
+
+            /* If necessary, convert fill value datatypes (which copies VL components, etc.) */
+            if(!H5T_path_noop(tpath)) {
+                hid_t dst_id, src_id;       /* Source & destination datatypes for type conversion */
+                uint8_t *bkg_buf = NULL;    /* Background conversion buffer */
+                size_t bkg_size;            /* Size of background buffer */
+
+                /* Wrap copies of types to convert */
+                dst_id = H5I_register(H5I_DATATYPE, H5T_copy(dst->type, H5T_COPY_TRANSIENT), FALSE);
+                if(dst_id < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy/register datatype")
+                src_id = H5I_register(H5I_DATATYPE, H5T_copy(src->type, H5T_COPY_ALL), FALSE);
+                if(src_id < 0) {
+                    H5I_dec_ref(dst_id);
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy/register datatype")
+                } /* end if */
+
+                /* Allocate a background buffer */
+                bkg_size = MAX(H5T_get_size(dst->type), H5T_get_size(src->type));
+                if(H5T_path_bkg(tpath) && NULL == (bkg_buf = H5FL_BLK_CALLOC(type_conv, bkg_size))) {
+                    H5I_dec_ref(src_id);
+                    H5I_dec_ref(dst_id);
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+                } /* end if */
+
+                /* Convert fill value */
+                if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, dst->buf, bkg_buf, H5AC_ind_dxpl_id) < 0) {
+                    H5I_dec_ref(src_id);
+                    H5I_dec_ref(dst_id);
+                    if(bkg_buf)
+                        bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCONVERT, NULL, "datatype conversion failed")
+                } /* end if */
+
+                /* Release the background buffer */
+                H5I_dec_ref(src_id);
+                H5I_dec_ref(dst_id);
+                if(bkg_buf)
+                    bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+    else
+        dst->buf = NULL;
+
+    /* Set return value */
+    ret_value = dst;
+
+done:
+    if(!ret_value && dst) {
+        if(dst->buf)
+            H5MM_xfree(dst->buf);
+	if(dst->type)
+            H5T_close(dst->type);
+	if(!_dst)
+            dst = H5FL_FREE(H5O_fill_t, dst);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fill_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_new_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not counting the
+ *		message type or size fields, but only the data fields.  This
+ *		function doesn't take into account alignment.  The new fill
+ *		value message is fill value plus space allocation time and
+ *              fill value writing time and whether fill value is defined.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *		Failure:	0
+ *
+ * Programmer:  Raymond Lu
+ *              Feb 26, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_fill_new_size(const H5F_t H5_ATTR_UNUSED *f, const void *_fill)
+{
+    const H5O_fill_t	*fill = (const H5O_fill_t *)_fill;
+    size_t		ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(fill);
+
+    /* Determine size for different versions */
+    if(fill->version < H5O_FILL_VERSION_3) {
+        ret_value = 1 +	 		/* Version number        */
+                    1 + 		/* Space allocation time */
+                    1 + 		/* Fill value write time */
+                    1; 			/* Fill value defined    */
+        if(fill->fill_defined)
+            ret_value += 4 +	/* Fill value size	 */
+                    (fill->size > 0 ? (size_t)fill->size : 0);	/* Size of fill value	 */
+    } /* end if */
+    else {
+        ret_value = 1 +	 		/* Version number        */
+                    1;			/* Status flags          */
+        if(fill->size > 0)
+            ret_value += 4 +		/* Fill value size	 */
+                    (size_t)fill->size;		/* Size of fill value	 */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fill_new_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fill_old_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting the
+ *              message type or size fields, but only the data fields.  This
+ *              function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes w/o alignment.
+ *              Failure:        0
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_fill_old_size(const H5F_t H5_ATTR_UNUSED *f, const void *_fill)
+{
+    const H5O_fill_t *fill = (const H5O_fill_t *)_fill;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(fill);
+
+    FUNC_LEAVE_NOAPI(4 + (size_t)fill->size)
+} /* end H5O_fill_old_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_reset_dyn
+ *
+ * Purpose:	Resets dynamic fill value fields
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, January 22, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_fill_reset_dyn(H5O_fill_t *fill)
+{
+    hid_t fill_type_id = -1;            /* Datatype ID for fill value datatype when reclaiming VL fill values */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(fill);
+
+    if(fill->buf) {
+        if(fill->type && H5T_detect_class(fill->type, H5T_VLEN, FALSE) > 0) {
+            H5T_t *fill_type;           /* Copy of fill value datatype */
+            H5S_t *fill_space;          /* Scalar dataspace for fill value element */
+
+            /* Copy the fill value datatype and get an ID for it */
+            if(NULL == (fill_type = H5T_copy(fill->type, H5T_COPY_TRANSIENT)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to copy fill value datatype")
+            if((fill_type_id = H5I_register(H5I_DATATYPE, fill_type, FALSE)) < 0) {
+                H5T_close(fill_type);
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTREGISTER, FAIL, "unable to register fill value datatype")
+            } /* end if */
+
+            /* Create a scalar dataspace for the fill value element */
+            if(NULL == (fill_space = H5S_create(H5S_SCALAR)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create scalar dataspace")
+
+            /* Reclaim any variable length components of the fill value */
+            if(H5D_vlen_reclaim(fill_type_id, fill_space, H5P_DATASET_XFER_DEFAULT, fill->buf) < 0) {
+                H5S_close(fill_space);
+                HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "unable to reclaim variable-length fill value data")
+            } /* end if */
+
+            /* Release the scalar fill value dataspace */
+            H5S_close(fill_space);
+        } /* end if */
+
+        /* Release the fill value buffer now */
+        fill->buf = H5MM_xfree(fill->buf);
+    } /* end if */
+    fill->size = 0;
+    if(fill->type) {
+	H5T_close(fill->type);
+	fill->type = NULL;
+    } /* end if */
+
+done:
+    if(fill_type_id > 0 && H5I_dec_ref(fill_type_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement ref count for temp ID")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fill_reset_dyn() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_reset
+ *
+ * Purpose:	Resets a message to an initial state.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fill_reset(void *_fill)
+{
+    H5O_fill_t	*fill = (H5O_fill_t *)_fill;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(fill);
+
+    /* Reset dynamic fields */
+    H5O_fill_reset_dyn(fill);
+
+    /* Reset value fields */
+    fill->alloc_time   = H5D_ALLOC_TIME_LATE;
+    fill->fill_time    = H5D_FILL_TIME_IFSET;
+    fill->fill_defined = FALSE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fill_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_free
+ *
+ * Purpose:	Frees the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, December 5, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fill_free(void *fill)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(fill);
+
+    fill = H5FL_FREE(H5O_fill_t, fill);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fill_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_debug
+ *
+ * Purpose:	Prints debugging info for the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fill_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_fill, FILE *stream,
+	       int indent, int fwidth)
+{
+    const H5O_fill_t *fill = (const H5O_fill_t *)_fill;
+    H5D_fill_value_t fill_status;       /* Whether the fill value is defined */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(fill);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Space Allocation Time:");
+    switch(fill->alloc_time) {
+        case H5D_ALLOC_TIME_EARLY:
+            fprintf(stream,"Early\n");
+            break;
+
+        case H5D_ALLOC_TIME_LATE:
+            fprintf(stream,"Late\n");
+            break;
+
+        case H5D_ALLOC_TIME_INCR:
+            fprintf(stream,"Incremental\n");
+            break;
+
+        case H5D_ALLOC_TIME_DEFAULT:
+        case H5D_ALLOC_TIME_ERROR:
+        default:
+            fprintf(stream,"Unknown!\n");
+            break;
+    } /* end switch */
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Fill Time:");
+    switch(fill->fill_time) {
+        case H5D_FILL_TIME_ALLOC:
+            fprintf(stream,"On Allocation\n");
+            break;
+
+        case H5D_FILL_TIME_NEVER:
+            fprintf(stream,"Never\n");
+            break;
+
+        case H5D_FILL_TIME_IFSET:
+            fprintf(stream,"If Set\n");
+            break;
+
+        case H5D_FILL_TIME_ERROR:
+        default:
+            fprintf(stream,"Unknown!\n");
+            break;
+
+    } /* end switch */
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Fill Value Defined:");
+    H5P_is_fill_value_defined((const H5O_fill_t *)fill, &fill_status);
+    switch(fill_status) {
+        case H5D_FILL_VALUE_UNDEFINED:
+            fprintf(stream,"Undefined\n");
+            break;
+
+        case H5D_FILL_VALUE_DEFAULT:
+            fprintf(stream,"Default\n");
+            break;
+
+        case H5D_FILL_VALUE_USER_DEFINED:
+            fprintf(stream,"User Defined\n");
+            break;
+
+        case H5D_FILL_VALUE_ERROR:
+        default:
+            fprintf(stream,"Unknown!\n");
+            break;
+
+    } /* end switch */
+    HDfprintf(stream, "%*s%-*s %Zd\n", indent, "", fwidth,
+	      "Size:", fill->size);
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Data type:");
+    if(fill->type) {
+	H5T_debug(fill->type, stream);
+	fprintf(stream, "\n");
+    } /* end if */
+    else
+	fprintf(stream, "<dataset type>\n");
+
+    FUNC_LEAVE_NOAPI(SUCCEED);
+} /* end H5O_fill_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_fill_convert
+ *
+ * Purpose:	Convert a fill value from whatever data type it currently has
+ *		to the specified dataset type.  The `type' field of the fill
+ *		value struct will be set to NULL to indicate that it has the
+ *		same type as the dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_fill_convert(H5O_fill_t *fill, H5T_t *dset_type, hbool_t *fill_changed, hid_t dxpl_id)
+{
+    H5T_path_t		*tpath;			    /* Type conversion info	*/
+    void		*buf = NULL, *bkg = NULL;   /* Conversion buffers	*/
+    hid_t		src_id = -1, dst_id = -1;   /* Datatype identifiers	*/
+    herr_t      	ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(fill);
+    HDassert(dset_type);
+    HDassert(fill_changed);
+
+    /* No-op cases */
+    if(!fill->buf || !fill->type || 0 == H5T_cmp(fill->type, dset_type, FALSE)) {
+        /* Don't need datatype for fill value */
+	if(fill->type)
+            H5T_close(fill->type);
+	fill->type = NULL;
+
+        /* Note that the fill value info has changed */
+        *fill_changed = TRUE;
+
+	HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+    /*
+     * Can we convert between source and destination data types?
+     */
+    if(NULL == (tpath = H5T_path_find(fill->type, dset_type, NULL, NULL, dxpl_id, FALSE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
+
+    /* Don't bother doing anything if there will be no actual conversion */
+    if(!H5T_path_noop(tpath)) {
+        if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(fill->type, H5T_COPY_ALL), FALSE)) < 0 ||
+                (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(dset_type, H5T_COPY_ALL), FALSE)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to copy/register data type")
+
+        /*
+         * Datatype conversions are always done in place, so we need a buffer
+         * that is large enough for both source and destination.
+         */
+        if(H5T_get_size(fill->type) >= H5T_get_size(dset_type))
+            buf = fill->buf;
+        else {
+            if(NULL == (buf = H5MM_malloc(H5T_get_size(dset_type))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+            HDmemcpy(buf, fill->buf, H5T_get_size(fill->type));
+        } /* end else */
+
+        /* Use CALLOC here to clear the buffer in case later the library thinks there's
+         * data in the background. */
+        if(H5T_path_bkg(tpath) && NULL == (bkg = H5MM_calloc(H5T_get_size(dset_type))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+
+        /* Do the conversion */
+        if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+        /* Update the fill message */
+        if(buf != fill->buf) {
+            H5T_vlen_reclaim_elmt(fill->buf, fill->type, dxpl_id);
+            H5MM_xfree(fill->buf);
+            fill->buf = buf;
+        } /* end if */
+        H5T_close(fill->type);
+        fill->type = NULL;
+        H5_CHECKED_ASSIGN(fill->size, ssize_t, H5T_get_size(dset_type), size_t);
+
+        /* Note that the fill value info has changed */
+        *fill_changed = TRUE;
+    } /* end if */
+
+done:
+    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement ref count for temp ID")
+    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement ref count for temp ID")
+    if(buf != fill->buf)
+        H5MM_xfree(buf);
+    if(bkg)
+        H5MM_xfree(bkg);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_fill_convert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fill_set_latest_version
+ *
+ * Purpose:     Set the encoding for a fill value to the latest version.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, July 24, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_fill_set_latest_version(H5O_fill_t *fill)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(fill);
+
+    /* Set encoding of fill value to latest version */
+    fill->version = H5O_FILL_VERSION_LATEST;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fill_set_latest_version() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oginfo.c b/gatb-core/thirdparty/hdf5/src/H5Oginfo.c
new file mode 100644
index 0000000..5519021
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oginfo.c
@@ -0,0 +1,352 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Oginfo.c
+ *                      Aug 23 2005
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Group Information messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_ginfo_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_ginfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_ginfo_copy(const void *_mesg, void *_dest);
+static size_t H5O_ginfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_ginfo_free(void *_mesg);
+static herr_t H5O_ginfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+			     FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_GINFO[1] = {{
+    H5O_GINFO_ID,            	/*message id number             */
+    "ginfo",                 	/*message name for debugging    */
+    sizeof(H5O_ginfo_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_ginfo_decode,        	/*decode message                */
+    H5O_ginfo_encode,        	/*encode message                */
+    H5O_ginfo_copy,          	/*copy the native value         */
+    H5O_ginfo_size,          	/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_ginfo_free,	        /* free method			*/
+    NULL,	        	/* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_ginfo_debug          	/*debug the message             */
+}};
+
+/* Current version of group info information */
+#define H5O_GINFO_VERSION 	0
+
+/* Flags for group info flag encoding */
+#define H5O_GINFO_STORE_PHASE_CHANGE    0x01
+#define H5O_GINFO_STORE_EST_ENTRY_INFO  0x02
+#define H5O_GINFO_ALL_FLAGS             (H5O_GINFO_STORE_PHASE_CHANGE | H5O_GINFO_STORE_EST_ENTRY_INFO)
+
+/* Declare a free list to manage the H5O_ginfo_t struct */
+H5FL_DEFINE_STATIC(H5O_ginfo_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ginfo_decode
+ *
+ * Purpose:     Decode a message and return a pointer to
+ *              a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native order.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_ginfo_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_ginfo_t         *ginfo = NULL;  /* Pointer to group information message */
+    unsigned char       flags;          /* Flags for encoding group info */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_GINFO_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (ginfo = H5FL_CALLOC(H5O_ginfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the flags for the group */
+    flags = *p++;
+    if(flags & ~H5O_GINFO_ALL_FLAGS)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad flag value for message")
+    ginfo->store_link_phase_change = (flags & H5O_GINFO_STORE_PHASE_CHANGE) ? TRUE : FALSE;
+    ginfo->store_est_entry_info = (flags & H5O_GINFO_STORE_EST_ENTRY_INFO) ? TRUE : FALSE;
+
+    /* Get the max. # of links to store compactly & the min. # of links to store densely */
+    if(ginfo->store_link_phase_change) {
+        UINT16DECODE(p, ginfo->max_compact)
+        UINT16DECODE(p, ginfo->min_dense)
+    } /* end if */
+    else {
+        ginfo->max_compact = H5G_CRT_GINFO_MAX_COMPACT;
+        ginfo->min_dense = H5G_CRT_GINFO_MIN_DENSE;
+    } /* end else */
+
+    /* Get the estimated # of entries & name lengths */
+    if(ginfo->store_est_entry_info) {
+        UINT16DECODE(p, ginfo->est_num_entries)
+        UINT16DECODE(p, ginfo->est_name_len)
+    } /* end if */
+    else {
+        ginfo->est_num_entries = H5G_CRT_GINFO_EST_NUM_ENTRIES;
+        ginfo->est_name_len = H5G_CRT_GINFO_EST_NAME_LEN;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = ginfo;
+
+done:
+    if(ret_value == NULL)
+        if(ginfo != NULL)
+            ginfo = H5FL_FREE(H5O_ginfo_t, ginfo);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ginfo_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ginfo_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ginfo_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_ginfo_t  *ginfo = (const H5O_ginfo_t *) _mesg;
+    unsigned char       flags;          /* Flags for encoding group info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(p);
+    HDassert(ginfo);
+
+    /* Message version */
+    *p++ = H5O_GINFO_VERSION;
+
+    /* The flags for the group info */
+    flags = ginfo->store_link_phase_change ?  H5O_GINFO_STORE_PHASE_CHANGE : 0;
+    flags = (unsigned char)(flags | (ginfo->store_est_entry_info ?  H5O_GINFO_STORE_EST_ENTRY_INFO : 0));
+    *p++ = flags;
+
+    /* Store the max. # of links to store compactly & the min. # of links to store densely */
+    if(ginfo->store_link_phase_change) {
+        UINT16ENCODE(p, ginfo->max_compact)
+        UINT16ENCODE(p, ginfo->min_dense)
+    } /* end if */
+
+    /* Estimated # of entries & name lengths */
+    if(ginfo->store_est_entry_info) {
+        UINT16ENCODE(p, ginfo->est_num_entries)
+        UINT16ENCODE(p, ginfo->est_name_len)
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ginfo_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ginfo_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_ginfo_copy(const void *_mesg, void *_dest)
+{
+    const H5O_ginfo_t   *ginfo = (const H5O_ginfo_t *)_mesg;
+    H5O_ginfo_t         *dest = (H5O_ginfo_t *)_dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(ginfo);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_ginfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *ginfo;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ginfo_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ginfo_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_ginfo_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_ginfo_t   *ginfo = (const H5O_ginfo_t *)_mesg;
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = 1 +                     /* Version */
+                1 +                     /* Flags */
+                (ginfo->store_link_phase_change ? (
+            (size_t)(2 +                 /* "Max compact" links */
+                    2)                   /* "Min dense" links */
+                ) : 0) +                /* "Min dense" links */
+                (ginfo->store_est_entry_info ? (
+            (size_t)(2 +                 /* Estimated # of entries in group */
+                    2)                   /* Estimated length of name of entry in group */
+                ) : 0);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_ginfo_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_ginfo_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 30, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ginfo_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_ginfo_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ginfo_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_ginfo_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 30 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_ginfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_ginfo_t       *ginfo = (const H5O_ginfo_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(ginfo);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Max. compact links:", ginfo->max_compact);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Min. dense links:", ginfo->min_dense);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Estimated # of objects in group:", ginfo->est_num_entries);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Estimated length of object in group's name:", ginfo->est_name_len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_ginfo_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Olayout.c b/gatb-core/thirdparty/hdf5/src/H5Olayout.c
new file mode 100644
index 0000000..20ea1a0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Olayout.c
@@ -0,0 +1,758 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Wednesday, October  8, 1997
+ *
+ * Purpose:     Messages related to data layout.
+ */
+
+#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+
+/* Local macros */
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_layout_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_layout_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_layout_copy(const void *_mesg, void *_dest);
+static size_t H5O_layout_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_layout_reset(void *_mesg);
+static herr_t H5O_layout_free(void *_mesg);
+static herr_t H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    void *_mesg);
+static void *H5O_layout_copy_file(H5F_t *file_src, void *mesg_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_layout_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
+			       int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_LAYOUT[1] = {{
+    H5O_LAYOUT_ID,          	/*message id number             */
+    "layout",               	/*message name for debugging    */
+    sizeof(H5O_layout_t),   	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_layout_decode,      	/*decode message                */
+    H5O_layout_encode,      	/*encode message                */
+    H5O_layout_copy,        	/*copy the native value         */
+    H5O_layout_size,        	/*size of message on disk       */
+    H5O_layout_reset,		/*reset method                  */
+    H5O_layout_free,        	/*free the struct		*/
+    H5O_layout_delete,	        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    H5O_layout_copy_file,	/* copy native value to file    */
+    NULL,		        /* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_layout_debug       	/*debug the message             */
+}};
+
+
+/* Declare a free list to manage the H5O_layout_t struct */
+H5FL_DEFINE(H5O_layout_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_decode
+ *
+ * Purpose:     Decode an data layout message and return a pointer to a
+ *              new one created with malloc().
+ *
+ * Return:      Success:        Ptr to new message in native order.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, October  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_layout_t           *mesg = NULL;
+    unsigned               u;
+    void                   *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* decode */
+    if(NULL == (mesg = H5FL_CALLOC(H5O_layout_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    mesg->version = *p++;
+    if(mesg->version < H5O_LAYOUT_VERSION_1 || mesg->version > H5O_LAYOUT_VERSION_3)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for layout message")
+
+    if(mesg->version < H5O_LAYOUT_VERSION_3) {
+        unsigned	ndims;			/* Num dimensions in chunk           */
+
+        /* Dimensionality */
+        ndims = *p++;
+        if(ndims > H5O_LAYOUT_NDIMS)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "dimensionality is too large")
+
+        /* Layout class */
+        mesg->type = (H5D_layout_t)*p++;
+        HDassert(H5D_CONTIGUOUS == mesg->type || H5D_CHUNKED == mesg->type || H5D_COMPACT == mesg->type);
+
+        /* Reserved bytes */
+        p += 5;
+
+        /* Address */
+        if(mesg->type == H5D_CONTIGUOUS) {
+            H5F_addr_decode(f, &p, &(mesg->storage.u.contig.addr));
+
+            /* Set the layout operations */
+            mesg->ops = H5D_LOPS_CONTIG;
+        } /* end if */
+        else if(mesg->type == H5D_CHUNKED) {
+            H5F_addr_decode(f, &p, &(mesg->storage.u.chunk.idx_addr));
+
+            /* Set the layout operations */
+            mesg->ops = H5D_LOPS_CHUNK;
+
+            /* Set the chunk operations */
+            /* (Only "btree" indexing type currently supported in this version) */
+            mesg->storage.u.chunk.idx_type = H5D_CHUNK_BTREE;
+            mesg->storage.u.chunk.ops = H5D_COPS_BTREE;
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(mesg->type == H5D_COMPACT);
+
+            /* Set the layout operations */
+            mesg->ops = H5D_LOPS_COMPACT;
+        } /* end else */
+
+        /* Read the size */
+        if(mesg->type != H5D_CHUNKED) {
+            /* Don't compute size of contiguous storage here, due to possible
+             * truncation of the dimension sizes when they were stored in this
+             * version of the layout message.  Compute the contiguous storage
+             * size in the dataset code, where we've got the dataspace
+             * information available also.  - QAK 5/26/04
+             */
+            p += ndims * 4;     /* Skip over dimension sizes (32-bit quantities) */
+        } /* end if */
+        else {
+            mesg->u.chunk.ndims=ndims;
+            for(u = 0; u < ndims; u++)
+                UINT32DECODE(p, mesg->u.chunk.dim[u]);
+
+            /* Compute chunk size */
+            for(u = 1, mesg->u.chunk.size = mesg->u.chunk.dim[0]; u < ndims; u++)
+                mesg->u.chunk.size *= mesg->u.chunk.dim[u];
+        } /* end if */
+
+        if(mesg->type == H5D_COMPACT) {
+            UINT32DECODE(p, mesg->storage.u.compact.size);
+            if(mesg->storage.u.compact.size > 0) {
+                if(NULL == (mesg->storage.u.compact.buf = H5MM_malloc(mesg->storage.u.compact.size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for compact data buffer")
+                HDmemcpy(mesg->storage.u.compact.buf, p, mesg->storage.u.compact.size);
+                p += mesg->storage.u.compact.size;
+            } /* end if */
+        } /* end if */
+    } /* end if */
+    else {
+        /* Layout class */
+        mesg->type = (H5D_layout_t)*p++;
+
+        /* Interpret the rest of the message according to the layout class */
+        switch(mesg->type) {
+            case H5D_COMPACT:
+                UINT16DECODE(p, mesg->storage.u.compact.size);
+                if(mesg->storage.u.compact.size > 0) {
+                    if(NULL == (mesg->storage.u.compact.buf = H5MM_malloc(mesg->storage.u.compact.size)))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for compact data buffer")
+                    HDmemcpy(mesg->storage.u.compact.buf, p, mesg->storage.u.compact.size);
+                    p += mesg->storage.u.compact.size;
+                } /* end if */
+
+                /* Set the layout operations */
+                mesg->ops = H5D_LOPS_COMPACT;
+                break;
+
+            case H5D_CONTIGUOUS:
+                H5F_addr_decode(f, &p, &(mesg->storage.u.contig.addr));
+                H5F_DECODE_LENGTH(f, p, mesg->storage.u.contig.size);
+
+                /* Set the layout operations */
+                mesg->ops = H5D_LOPS_CONTIG;
+                break;
+
+            case H5D_CHUNKED:
+                /* Dimensionality */
+                mesg->u.chunk.ndims = *p++;
+                if(mesg->u.chunk.ndims > H5O_LAYOUT_NDIMS)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "dimensionality is too large")
+
+                /* B-tree address */
+                H5F_addr_decode(f, &p, &(mesg->storage.u.chunk.idx_addr));
+
+                /* Chunk dimensions */
+                for(u = 0; u < mesg->u.chunk.ndims; u++)
+                    UINT32DECODE(p, mesg->u.chunk.dim[u]);
+
+                /* Compute chunk size */
+                for(u = 1, mesg->u.chunk.size = mesg->u.chunk.dim[0]; u < mesg->u.chunk.ndims; u++)
+                    mesg->u.chunk.size *= mesg->u.chunk.dim[u];
+
+                /* Set the chunk operations */
+                /* (Only "btree" indexing type supported with v3 of message format) */
+                mesg->storage.u.chunk.idx_type = H5D_CHUNK_BTREE;
+                mesg->storage.u.chunk.ops = H5D_COPS_BTREE;
+
+                /* Set the layout operations */
+                mesg->ops = H5D_LOPS_CHUNK;
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "Invalid layout class")
+        } /* end switch */
+    } /* end else */
+
+    /* Set return value */
+    ret_value = mesg;
+
+done:
+    if(ret_value == NULL)
+        if(mesg)
+            mesg = H5FL_FREE(H5O_layout_t, mesg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, October  8, 1997
+ *
+ * Note:
+ *      Quincey Koziol, 2004-5-21
+ *      We write out version 3 messages by default now.
+ *
+ * Modifications:
+ * 	Robb Matzke, 1998-07-20
+ *	Rearranged the message to add a version number at the beginning.
+ *
+ *	Raymond Lu, 2002-2-26
+ *	Added version number 2 case depends on if space has been allocated
+ *	at the moment when layout header message is updated.
+ *
+ *      Quincey Koziol, 2004-5-21
+ *      Added version number 3 case to straighten out problems with contiguous
+ *      layout's sizes (was encoding them as 4-byte values when they were
+ *      really n-byte values (where n usually is 8)) and additionally clean up
+ *      the information written out.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
+    unsigned               u;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(p);
+
+    /* Message version */
+    *p++ = (uint8_t)H5O_LAYOUT_VERSION_3;
+
+    /* Layout class */
+    *p++ = mesg->type;
+
+    /* Write out layout class specific information */
+    switch(mesg->type) {
+        case H5D_COMPACT:
+            /* Size of raw data */
+            UINT16ENCODE(p, mesg->storage.u.compact.size);
+
+            /* Raw data */
+            if(mesg->storage.u.compact.size > 0) {
+                if(mesg->storage.u.compact.buf)
+                    HDmemcpy(p, mesg->storage.u.compact.buf, mesg->storage.u.compact.size);
+                else
+                    HDmemset(p, 0, mesg->storage.u.compact.size);
+                p += mesg->storage.u.compact.size;
+            } /* end if */
+            break;
+
+        case H5D_CONTIGUOUS:
+            H5F_addr_encode(f, &p, mesg->storage.u.contig.addr);
+            H5F_ENCODE_LENGTH(f, p, mesg->storage.u.contig.size);
+            break;
+
+        case H5D_CHUNKED:
+            /* Number of dimensions */
+            HDassert(mesg->u.chunk.ndims > 0 && mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+            *p++ = (uint8_t)mesg->u.chunk.ndims;
+
+            /* B-tree address */
+            H5F_addr_encode(f, &p, mesg->storage.u.chunk.idx_addr);
+
+            /* Dimension sizes */
+            for(u = 0; u < mesg->u.chunk.ndims; u++)
+                UINT32ENCODE(p, mesg->u.chunk.dim[u]);
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "Invalid layout class")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, October  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_layout_copy(const void *_mesg, void *_dest)
+{
+    const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
+    H5O_layout_t           *dest = (H5O_layout_t *) _dest;
+    void                   *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(mesg);
+
+    /* Allocate destination message, if necessary */
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_layout_t)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "layout message allocation failed")
+
+    /* copy */
+    *dest = *mesg;
+
+    /* Deep copy the buffer for compact datasets also */
+    if(mesg->type == H5D_COMPACT && mesg->storage.u.compact.size > 0) {
+        /* Allocate memory for the raw data */
+        if(NULL == (dest->storage.u.compact.buf = H5MM_malloc(dest->storage.u.compact.size)))
+            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "unable to allocate memory for compact dataset")
+
+        /* Copy over the raw data */
+        HDmemcpy(dest->storage.u.compact.buf, mesg->storage.u.compact.buf, dest->storage.u.compact.size);
+    } /* end if */
+
+    /* Reset the pointer of the chunked storage index but not the address */
+    if(dest->type == H5D_CHUNKED && dest->storage.u.chunk.ops)
+	H5D_chunk_idx_reset(&dest->storage.u.chunk, FALSE);
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    if(ret_value == NULL)
+        if(NULL == _dest)
+            dest = H5FL_FREE(H5O_layout_t, dest);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes.  If it's
+ *              compact dataset, the data part is also included.
+ *              This function doesn't take into account message alignment.
+ *
+ * Return:      Success:        Message data size in bytes
+ *
+ *              Failure:        0
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, October  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_layout_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
+    size_t                  ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Compute serialized size */
+    /* (including possibly compact data) */
+    ret_value = H5D__layout_meta_size(f, mesg, TRUE);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_layout_reset
+ *
+ * Purpose:	Frees resources within a data type message, but doesn't free
+ *		the message itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, September 13, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_layout_reset(void *_mesg)
+{
+    H5O_layout_t     *mesg = (H5O_layout_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(mesg) {
+        /* Free the compact storage buffer */
+        if(H5D_COMPACT == mesg->type)
+            mesg->storage.u.compact.buf = H5MM_xfree(mesg->storage.u.compact.buf);
+
+        /* Reset the message */
+        mesg->type = H5D_CONTIGUOUS;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_layout_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_layout_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 11, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_layout_free(void *_mesg)
+{
+    H5O_layout_t     *mesg = (H5O_layout_t *) _mesg;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(mesg);
+
+    /* Free resources within the message */
+    if(H5O_layout_reset(mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free message resources")
+
+    mesg = H5FL_FREE(H5O_layout_t, mesg);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, March 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+{
+    H5O_layout_t *mesg = (H5O_layout_t *) _mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(open_oh);
+    HDassert(mesg);
+
+    /* Perform different actions, depending on the type of storage */
+    switch(mesg->type) {
+        case H5D_COMPACT:       /* Compact data storage */
+            /* Nothing required */
+            break;
+
+        case H5D_CONTIGUOUS:    /* Contiguous block on disk */
+            /* Free the file space for the raw data */
+            if(H5D__contig_delete(f, dxpl_id, &mesg->storage) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data")
+            break;
+
+        case H5D_CHUNKED:       /* Chunked blocks on disk */
+            /* Free the file space for the index & chunk raw data */
+            if(H5D__chunk_delete(f, dxpl_id, open_oh, &mesg->storage) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data")
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "not valid storage type")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Peter Cao
+ *              July 23, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t *cpy_info, void *_udata, hid_t dxpl_id)
+{
+    H5D_copy_file_ud_t *udata = (H5D_copy_file_ud_t *)_udata;   /* Dataset copying user data */
+    H5O_layout_t       *layout_src = (H5O_layout_t *) mesg_src;
+    H5O_layout_t       *layout_dst = NULL;
+    hbool_t             copied = FALSE;                         /* Whether the data was copied */
+    void               *ret_value;                              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file_src);
+    HDassert(layout_src);
+    HDassert(file_dst);
+
+    /* Allocate space for the destination layout */
+    if(NULL == (layout_dst = H5FL_MALLOC(H5O_layout_t)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
+
+    /* Copy the "top level" information */
+    *layout_dst = *layout_src;
+
+    /* Copy the layout type specific information */
+    switch(layout_src->type) {
+        case H5D_COMPACT:
+	    if(layout_src->storage.u.compact.buf) {
+                /* copy compact raw data */
+                if(H5D__compact_copy(file_src, &layout_src->storage.u.compact, file_dst, &layout_dst->storage.u.compact, udata->src_dtype, cpy_info, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
+                copied = TRUE;
+	    } /* end if */
+            break;
+
+        case H5D_CONTIGUOUS:
+            /* Compute the size of the contiguous storage for versions of the
+             * layout message less than version 3 because versions 1 & 2 would
+             * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
+             */
+            if(layout_src->version < H5O_LAYOUT_VERSION_3)
+                layout_dst->storage.u.contig.size = H5S_extent_nelem(udata->src_space_extent) *
+                                        H5T_get_size(udata->src_dtype);
+
+            if(H5D__contig_is_space_alloc(&layout_src->storage)) {
+                /* copy contiguous raw data */
+                if(H5D__contig_copy(file_src, &layout_src->storage.u.contig, file_dst, &layout_dst->storage.u.contig, udata->src_dtype, cpy_info, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy contiguous storage")
+                copied = TRUE;
+            } /* end if */
+            break;
+
+        case H5D_CHUNKED:
+            if(H5D__chunk_is_space_alloc(&layout_src->storage)) {
+                /* Create chunked layout */
+                if(H5D__chunk_copy(file_src, &layout_src->storage.u.chunk, &layout_src->u.chunk, file_dst, &layout_dst->storage.u.chunk, udata->src_space_extent, udata->src_dtype, udata->common.src_pline, cpy_info, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
+                copied = TRUE;
+            } /* end if */
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "Invalid layout class")
+    } /* end switch */
+
+    /* Check if copy routine was invoked (which frees the source datatype) */
+    if(copied)
+        udata->src_dtype = NULL;
+
+    /* Set return value */
+    ret_value = layout_dst;
+
+done:
+    if(!ret_value)
+	if(layout_dst)
+	    layout_dst = H5FL_FREE(H5O_layout_t, layout_dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_layout_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_layout_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, October  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth)
+{
+    const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
+    unsigned                    u;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+              "Version:", mesg->version);
+    switch(mesg->type) {
+        case H5D_CHUNKED:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                      "Type:", "Chunked");
+
+            /* Chunk # of dims & size */
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                      "Number of dimensions:",
+                      (unsigned long)(mesg->u.chunk.ndims));
+            HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Size:");
+            for(u = 0; u < mesg->u.chunk.ndims; u++)
+                HDfprintf(stream, "%s%lu", u ? ", " : "", (unsigned long)(mesg->u.chunk.dim[u]));
+            HDfprintf(stream, "}\n");
+
+            /* Index information */
+            switch(mesg->storage.u.chunk.idx_type) {
+                case H5D_CHUNK_BTREE:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "v1 B-tree");
+                    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                              "B-tree address:", mesg->storage.u.chunk.idx_addr);
+                    break;
+
+                default:
+                    HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+                              "Index Type:", "Unknown", (unsigned)mesg->storage.u.chunk.idx_type);
+                    break;
+            } /* end switch */
+            break;
+
+        case H5D_CONTIGUOUS:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                      "Type:", "Contiguous");
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                      "Data address:", mesg->storage.u.contig.addr);
+            HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+                      "Data Size:", mesg->storage.u.contig.size);
+            break;
+
+        case H5D_COMPACT:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                      "Type:", "Compact");
+            HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+                      "Data Size:", mesg->storage.u.compact.size);
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+                      "Type:", "Unknown", (unsigned)mesg->type);
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_layout_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Olinfo.c b/gatb-core/thirdparty/hdf5/src/H5Olinfo.c
new file mode 100644
index 0000000..d9351b3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Olinfo.c
@@ -0,0 +1,587 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Olinfo.c
+ *                      Aug 23 2005
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Link Information messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5L_PACKAGE		/*suppress error about including H5Lpkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Lpkg.h"             /* Links                                */
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_linfo_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_linfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_linfo_copy(const void *_mesg, void *_dest);
+static size_t H5O_linfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_linfo_free(void *_mesg);
+static herr_t H5O_linfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    void *_mesg);
+static void *H5O_linfo_copy_file(H5F_t *file_src, void *native_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_linfo_post_copy_file(const H5O_loc_t *parent_src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst,
+    unsigned *mesg_flags, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_linfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+			     FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_LINFO[1] = {{
+    H5O_LINFO_ID,            	/*message id number             */
+    "linfo",                 	/*message name for debugging    */
+    sizeof(H5O_linfo_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_linfo_decode,        	/*decode message                */
+    H5O_linfo_encode,        	/*encode message                */
+    H5O_linfo_copy,          	/*copy the native value         */
+    H5O_linfo_size,          	/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_linfo_free,	        /* free method			*/
+    H5O_linfo_delete,	        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    H5O_linfo_copy_file,	/* copy native value to file    */
+    H5O_linfo_post_copy_file,	/* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_linfo_debug          	/*debug the message             */
+}};
+
+/* Current version of link info information */
+#define H5O_LINFO_VERSION 	0
+
+/* Flags for link info index flag encoding */
+#define H5O_LINFO_TRACK_CORDER          0x01
+#define H5O_LINFO_INDEX_CORDER          0x02
+#define H5O_LINFO_ALL_FLAGS             (H5O_LINFO_TRACK_CORDER | H5O_LINFO_INDEX_CORDER)
+
+/* Data exchange structure to use when copying links from src to dst */
+typedef struct {
+    const H5O_loc_t *src_oloc;          /* Source object location */
+    H5O_loc_t *dst_oloc;                /* Destination object location */
+    H5O_linfo_t *dst_linfo;             /* Destination object's link info message */
+    hid_t dxpl_id;                      /* DXPL for operation */
+    H5O_copy_t  *cpy_info;              /* Information for copy operation */
+} H5O_linfo_postcopy_ud_t;
+
+/* Declare a free list to manage the H5O_linfo_t struct */
+H5FL_DEFINE_STATIC(H5O_linfo_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_decode
+ *
+ * Purpose:     Decode a message and return a pointer to a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native form.
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_linfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_linfo_t	*linfo = NULL;  /* Link info */
+    unsigned char index_flags;  /* Flags for encoding link index info */
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_LINFO_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (linfo = H5FL_MALLOC(H5O_linfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the index flags for the group */
+    index_flags = *p++;
+    if(index_flags & ~H5O_LINFO_ALL_FLAGS)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad flag value for message")
+    linfo->track_corder = (index_flags & H5O_LINFO_TRACK_CORDER) ? TRUE : FALSE;
+    linfo->index_corder = (index_flags & H5O_LINFO_INDEX_CORDER) ? TRUE : FALSE;
+
+    /* Set the number of links in the group to an invalid value, so we query it later */
+    linfo->nlinks = HSIZET_MAX;
+
+    /* Max. link creation order value for the group, if tracked */
+    if(linfo->track_corder)
+        INT64DECODE(p, linfo->max_corder)
+    else
+        linfo->max_corder = 0;
+
+    /* Address of fractal heap to store "dense" links */
+    H5F_addr_decode(f, &p, &(linfo->fheap_addr));
+
+    /* Address of v2 B-tree to index names of links (names are always indexed) */
+    H5F_addr_decode(f, &p, &(linfo->name_bt2_addr));
+
+    /* Address of v2 B-tree to index creation order of links, if there is one */
+    if(linfo->index_corder)
+        H5F_addr_decode(f, &p, &(linfo->corder_bt2_addr));
+    else
+        linfo->corder_bt2_addr = HADDR_UNDEF;
+
+    /* Set return value */
+    ret_value = linfo;
+
+done:
+    if(ret_value == NULL)
+        if(linfo != NULL)
+            linfo = H5FL_FREE(H5O_linfo_t, linfo);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_linfo_t   *linfo = (const H5O_linfo_t *)_mesg;
+    unsigned char       index_flags;          /* Flags for encoding link index info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(linfo);
+
+    /* Message version */
+    *p++ = H5O_LINFO_VERSION;
+
+    /* The flags for the link indices */
+    index_flags = linfo->track_corder ? H5O_LINFO_TRACK_CORDER : 0;
+    index_flags = (uint8_t)(index_flags | (linfo->index_corder ? H5O_LINFO_INDEX_CORDER : 0));
+    *p++ = index_flags;
+
+    /* Max. link creation order value for the group, if tracked */
+    if(linfo->track_corder)
+        INT64ENCODE(p, linfo->max_corder)
+
+    /* Address of fractal heap to store "dense" links */
+    H5F_addr_encode(f, &p, linfo->fheap_addr);
+
+    /* Address of v2 B-tree to index names of links */
+    H5F_addr_encode(f, &p, linfo->name_bt2_addr);
+
+    /* Address of v2 B-tree to index creation order of links, if they are indexed */
+    if(linfo->index_corder)
+        H5F_addr_encode(f, &p, linfo->corder_bt2_addr);
+    else
+        HDassert(!H5F_addr_defined(linfo->corder_bt2_addr));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_linfo_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_linfo_copy(const void *_mesg, void *_dest)
+{
+    const H5O_linfo_t   *linfo = (const H5O_linfo_t *)_mesg;
+    H5O_linfo_t         *dest = (H5O_linfo_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(linfo);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_linfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *linfo;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_linfo_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_linfo_t   *linfo = (const H5O_linfo_t *)_mesg;
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = 1                       /* Version */
+                + 1                     /* Index flags */
+                + (linfo->track_corder ? (size_t)8 : 0) /* Curr. max. creation order value */
+                + (size_t)H5F_SIZEOF_ADDR(f)    /* Address of fractal heap to store "dense" links */
+                + (size_t)H5F_SIZEOF_ADDR(f)    /* Address of v2 B-tree for indexing names of links */
+                + (linfo->index_corder ? (size_t)H5F_SIZEOF_ADDR(f) : 0);   /* Address of v2 B-tree for indexing creation order values of links */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_linfo_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 23, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_linfo_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_linfo_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, September 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *_mesg)
+{
+    H5O_linfo_t *linfo = (H5O_linfo_t *)_mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(linfo);
+
+    /* If the group is using "dense" link storage, delete it */
+    if(H5F_addr_defined(linfo->fheap_addr))
+        if(H5G__dense_delete(f, dxpl_id, linfo, TRUE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free dense link storage")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              June 26, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_linfo_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *native_src, H5F_t *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t *cpy_info, void *_udata, hid_t dxpl_id)
+{
+    H5O_linfo_t          *linfo_src = (H5O_linfo_t *) native_src;
+    H5O_linfo_t          *linfo_dst = NULL;
+    H5G_copy_file_ud_t *udata = (H5G_copy_file_ud_t *) _udata;
+    void                 *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(linfo_src);
+    HDassert(cpy_info);
+
+    /* Copy the source message */
+    if(NULL == (linfo_dst = (H5O_linfo_t *)H5O_linfo_copy(linfo_src, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "memory allocation failed")
+
+    /* If we are performing a 'shallow hierarchy' copy, and the links in this
+     *  group won't be included in the destination, reset the link info for
+     *  this group.
+     */
+    if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth) {
+        linfo_dst->nlinks = 0;
+        linfo_dst->max_corder = 0;
+        linfo_dst->fheap_addr = HADDR_UNDEF;
+        linfo_dst->name_bt2_addr = HADDR_UNDEF;
+        linfo_dst->corder_bt2_addr = HADDR_UNDEF;
+    } /* end if */
+    else {
+        /* Create the components of the dense link storage for the destination group */
+        /* (XXX: should probably get the "creation" parameters for the source group's
+         *      dense link storage components and use those - QAK)
+         */
+        if(H5F_addr_defined(linfo_src->fheap_addr)) {
+            /* Create the dense link storage */
+            if(H5G__dense_create(file_dst, dxpl_id, linfo_dst, udata->common.src_pline) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to create 'dense' form of new format group")
+        } /* end if */
+    } /* end else */
+
+    /* Set return value */
+    ret_value = linfo_dst;
+
+done:
+    if(!ret_value)
+        if(linfo_dst)
+            linfo_dst = H5FL_FREE(H5O_linfo_t, linfo_dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_linfo_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_linfo_post_copy_file_cb
+ *
+ * Purpose:	Callback routine for copying links from src to dst file
+ *              during "post copy" routine
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sept 26 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_post_copy_file_cb(const H5O_link_t *src_lnk, void *_udata)
+{
+    H5O_linfo_postcopy_ud_t *udata = (H5O_linfo_postcopy_ud_t *)_udata;     /* 'User data' passed in */
+    H5O_link_t dst_lnk;                 /* Destination link to insert */
+    hbool_t dst_lnk_init = FALSE;       /* Whether the destination link is initialized */
+    herr_t ret_value = H5_ITER_CONT;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    HDassert(src_lnk);
+    HDassert(udata);
+
+    /* Copy the link (and the object it points to) */
+    if(H5L_link_copy_file(udata->dst_oloc->file, udata->dxpl_id, src_lnk,
+            udata->src_oloc, &dst_lnk, udata->cpy_info) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy link")
+    dst_lnk_init = TRUE;
+
+    /* Insert the new object in the destination file's group */
+    /* (Doesn't increment the link count - that's already been taken care of for hard links) */
+    if(H5G__dense_insert(udata->dst_oloc->file, udata->dxpl_id, udata->dst_linfo, &dst_lnk) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert destination link")
+
+done:
+    /* Check if the destination link has been initialized */
+    if(dst_lnk_init)
+        H5O_msg_reset(H5O_LINK_ID, &dst_lnk);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_post_copy_file_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 26, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+    H5O_loc_t *dst_oloc, void *mesg_dst, unsigned H5_ATTR_UNUSED *mesg_flags,
+    hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    const H5O_linfo_t   *linfo_src = (const H5O_linfo_t *)mesg_src;
+    H5O_linfo_t         *linfo_dst = (H5O_linfo_t *)mesg_dst;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(src_oloc && src_oloc->file);
+    HDassert(linfo_src);
+    HDassert(dst_oloc && dst_oloc->file);
+    HDassert(H5F_addr_defined(dst_oloc->addr));
+    HDassert(linfo_dst);
+    HDassert(cpy_info);
+
+    /* If we are performing a 'shallow hierarchy' copy, get out now */
+    if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
+        HGOTO_DONE(SUCCEED)
+
+    /* Check for copying dense link storage */
+    if(H5F_addr_defined(linfo_src->fheap_addr)) {
+        H5O_linfo_postcopy_ud_t udata;          /* User data for iteration callback */
+
+        /* Set up dense link iteration user data */
+        udata.src_oloc = src_oloc;
+        udata.dst_oloc = dst_oloc;
+        udata.dst_linfo = linfo_dst;
+        udata.dxpl_id = dxpl_id;
+        udata.cpy_info = cpy_info;
+
+        /* Iterate over the links in the group, building a table of the link messages */
+        if(H5G__dense_iterate(src_oloc->file, dxpl_id, linfo_src, H5_INDEX_NAME, H5_ITER_NATIVE, (hsize_t)0, NULL, H5O_linfo_post_copy_file_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over links")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_linfo_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_linfo_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 23 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_linfo_t       *linfo = (const H5O_linfo_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(linfo);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Track creation order of links:", linfo->track_corder);
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+	      "Index creation order of links:", linfo->index_corder);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of links:", linfo->nlinks);
+    HDfprintf(stream, "%*s%-*s %Hd\n", indent, "", fwidth,
+	      "Max. creation order value:", linfo->max_corder);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' link storage fractal heap address:", linfo->fheap_addr);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' link storage name index v2 B-tree address:", linfo->name_bt2_addr);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "'Dense' link storage creation order index v2 B-tree address:", linfo->corder_bt2_addr);
+
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_linfo_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Olink.c b/gatb-core/thirdparty/hdf5/src/H5Olink.c
new file mode 100644
index 0000000..53191ca
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Olink.c
@@ -0,0 +1,878 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Olink.c
+ *                      Aug 29 2005
+ *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:             Link messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5L_PACKAGE		/*suppress error about including H5Lpkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Gpkg.h"		/* Groups		  		*/
+#include "H5Iprivate.h"         /* IDs                                  */
+#include "H5Lpkg.h"             /* Links                                */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_link_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_link_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_link_copy(const void *_mesg, void *_dest);
+static size_t H5O_link_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_link_reset(void *_mesg);
+static herr_t H5O_link_free(void *_mesg);
+static herr_t H5O_link_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
+static void *H5O_link_copy_file(H5F_t *file_src, void *native_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+static herr_t H5O_link_post_copy_file(const H5O_loc_t *src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst,
+    unsigned *mesg_flags, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_link_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_LINK[1] = {{
+    H5O_LINK_ID,            	/*message id number             */
+    "link",                 	/*message name for debugging    */
+    sizeof(H5O_link_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_link_decode,        	/*decode message                */
+    H5O_link_encode,        	/*encode message                */
+    H5O_link_copy,          	/*copy the native value         */
+    H5O_link_size,          	/*size of symbol table entry    */
+    H5O_link_reset,		/* reset method			*/
+    H5O_link_free,	        /* free method			*/
+    H5O_link_delete,	       	/* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_link_pre_copy_file,	/* pre copy native value to file */
+    H5O_link_copy_file,		/* copy native value to file    */
+    H5O_link_post_copy_file,	/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_link_debug          	/*debug the message             */
+}};
+
+/* Current version of link information */
+#define H5O_LINK_VERSION 	1
+
+/* Flags for link flag encoding */
+#define H5O_LINK_NAME_SIZE              0x03    /* 2-bit field for size of name length */
+#define H5O_LINK_STORE_CORDER           0x04    /* Whether to store creation index */
+#define H5O_LINK_STORE_LINK_TYPE        0x08    /* Whether to store non-default link type */
+#define H5O_LINK_STORE_NAME_CSET        0x10    /* Whether to store non-default name character set */
+#define H5O_LINK_ALL_FLAGS              (H5O_LINK_NAME_SIZE | H5O_LINK_STORE_CORDER | H5O_LINK_STORE_LINK_TYPE | H5O_LINK_STORE_NAME_CSET)
+
+/* Individual definitions of name size values */
+#define H5O_LINK_NAME_1                 0x00    /* Use 1-byte value for name length */
+#define H5O_LINK_NAME_2                 0x01    /* Use 2-byte value for name length */
+#define H5O_LINK_NAME_4                 0x02    /* Use 4-byte value for name length */
+#define H5O_LINK_NAME_8                 0x03    /* Use 8-byte value for name length */
+
+/* Declare a free list to manage the H5O_link_t struct */
+H5FL_DEFINE_STATIC(H5O_link_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_decode
+ *
+ * Purpose:     Decode a message and return a pointer to
+ *              a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native order.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_link_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_link_t          *lnk = NULL;    /* Pointer to link message */
+    size_t              len = 0;        /* Length of a string in the message */
+    unsigned char       link_flags;     /* Flags for encoding link info */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* decode */
+    if(*p++ != H5O_LINK_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (lnk = H5FL_CALLOC(H5O_link_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the encoding flags for the link */
+    link_flags = *p++;
+    if(link_flags & ~H5O_LINK_ALL_FLAGS)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad flag value for message")
+
+    /* Check for non-default link type */
+    if(link_flags & H5O_LINK_STORE_LINK_TYPE) {
+        /* Get the type of the link */
+        lnk->type = (H5L_type_t)*p++;
+        if(lnk->type < H5L_TYPE_HARD || lnk->type > H5L_TYPE_MAX)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad link type")
+    } /* end if */
+    else
+        lnk->type = H5L_TYPE_HARD;
+
+    /* Get the link creation time from the file */
+    if(link_flags & H5O_LINK_STORE_CORDER) {
+        INT64DECODE(p, lnk->corder)
+        lnk->corder_valid = TRUE;
+    } /* end if */
+    else {
+        lnk->corder = 0;
+        lnk->corder_valid = FALSE;
+    } /* end else */
+
+    /* Check for non-default name character set */
+    if(link_flags & H5O_LINK_STORE_NAME_CSET) {
+        /* Get the link name's character set */
+        lnk->cset = (H5T_cset_t)*p++;
+        if(lnk->cset < H5T_CSET_ASCII || lnk->cset > H5T_CSET_UTF8)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad cset type")
+    } /* end if */
+    else
+        lnk->cset = H5T_CSET_ASCII;
+
+    /* Get the length of the link's name */
+    switch(link_flags & H5O_LINK_NAME_SIZE) {
+        case 0:     /* 1 byte size */
+            len = *p++;
+            break;
+
+        case 1:     /* 2 byte size */
+            UINT16DECODE(p, len);
+            break;
+
+        case 2:     /* 4 byte size */
+            UINT32DECODE(p, len);
+            break;
+
+        case 3:     /* 8 byte size */
+            UINT64DECODE(p, len);
+            break;
+
+        default:
+            HDassert(0 && "bad size for name");
+    } /* end switch */
+    if(len == 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid name length")
+
+    /* Get the link's name */
+    if(NULL == (lnk->name = (char *)H5MM_malloc(len + 1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemcpy(lnk->name, p, len);
+    lnk->name[len] = '\0';
+    p += len;
+
+    /* Get the appropriate information for each type of link */
+    switch(lnk->type) {
+        case H5L_TYPE_HARD:
+            /* Get the address of the object the link points to */
+            H5F_addr_decode(f, &p, &(lnk->u.hard.addr));
+            break;
+
+        case H5L_TYPE_SOFT:
+            /* Get the link value */
+            UINT16DECODE(p, len)
+            if(len == 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid link length")
+            if(NULL == (lnk->u.soft.name = (char *)H5MM_malloc((size_t)len + 1)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+            HDmemcpy(lnk->u.soft.name, p, len);
+            lnk->u.soft.name[len] = '\0';
+            p += len;
+            break;
+
+        /* User-defined links */
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+        default:
+            if(lnk->type < H5L_TYPE_UD_MIN || lnk->type > H5L_TYPE_MAX)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "unknown link type")
+
+            /* A UD link.  Get the user-supplied data */
+            UINT16DECODE(p, len)
+            lnk->u.ud.size = len;
+            if(len > 0)
+            {
+                if(NULL == (lnk->u.ud.udata = H5MM_malloc((size_t)len)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+                HDmemcpy(lnk->u.ud.udata, p, len);
+                p += len;
+            }
+            else
+                lnk->u.ud.udata = NULL;
+    } /* end switch */
+
+    /* Set return value */
+    ret_value = lnk;
+
+done:
+    if(ret_value == NULL)
+        if(lnk != NULL) {
+            if(lnk->name != NULL)
+                H5MM_xfree(lnk->name);
+            if(lnk->type == H5L_TYPE_SOFT && lnk->u.soft.name != NULL)
+                H5MM_xfree(lnk->u.soft.name);
+            if(lnk->type >= H5L_TYPE_UD_MIN && lnk->u.ud.size > 0 && lnk->u.ud.udata != NULL)
+                H5MM_xfree(lnk->u.ud.udata);
+            lnk = H5FL_FREE(H5O_link_t, lnk);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_encode
+ *
+ * Purpose:     Encodes a link message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_link_t    *lnk = (const H5O_link_t *) _mesg;
+    uint64_t            len;            /* Length of a string in the message */
+    unsigned char       link_flags;     /* Flags for encoding link info */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(lnk);
+
+    /* Get length of link's name */
+    len = (uint64_t)HDstrlen(lnk->name);
+    HDassert(len > 0);
+
+    /* encode */
+    *p++ = H5O_LINK_VERSION;
+
+    /* The encoding flags for the link */
+    if(len > 4294967295)
+        link_flags = H5O_LINK_NAME_8;
+    else if(len > 65535)
+        link_flags = H5O_LINK_NAME_4;
+    else if(len > 255)
+        link_flags = H5O_LINK_NAME_2;
+    else
+        link_flags = H5O_LINK_NAME_1;
+    link_flags = (unsigned char)(link_flags | (lnk->corder_valid ? H5O_LINK_STORE_CORDER : 0));
+    link_flags = (unsigned char)(link_flags | ((lnk->type != H5L_TYPE_HARD) ? H5O_LINK_STORE_LINK_TYPE : 0));
+    link_flags = (unsigned char)(link_flags | ((lnk->cset != H5T_CSET_ASCII) ? H5O_LINK_STORE_NAME_CSET : 0));
+    *p++ = link_flags;
+
+    /* Store the type of a non-default link */
+    if(link_flags & H5O_LINK_STORE_LINK_TYPE)
+        *p++ = lnk->type;
+
+    /* Store the link creation order in the file, if its valid */
+    if(lnk->corder_valid)
+        INT64ENCODE(p, lnk->corder)
+
+    /* Store a non-default link name character set */
+    if(link_flags & H5O_LINK_STORE_NAME_CSET)
+        *p++ = (uint8_t)lnk->cset;
+
+    /* Store the link name's length */
+    switch(link_flags & H5O_LINK_NAME_SIZE) {
+        case 0:     /* 1 byte size */
+            *p++ = (uint8_t)len;
+            break;
+
+        case 1:     /* 2 byte size */
+            UINT16ENCODE(p, len);
+            break;
+
+        case 2:     /* 4 byte size */
+            UINT32ENCODE(p, len);
+            break;
+
+        case 3:     /* 8 byte size */
+            UINT64ENCODE(p, len);
+            break;
+
+        default:
+            HDassert(0 && "bad size for name");
+    } /* end switch */
+
+    /* Store the link's name */
+    HDmemcpy(p, lnk->name, (size_t)len);
+    p += len;
+
+    /* Store the appropriate information for each type of link */
+    switch(lnk->type) {
+        case H5L_TYPE_HARD:
+            /* Store the address of the object the link points to */
+            H5F_addr_encode(f, &p, lnk->u.hard.addr);
+            break;
+
+        case H5L_TYPE_SOFT:
+            /* Store the link value */
+            len = (uint16_t)HDstrlen(lnk->u.soft.name);
+            HDassert(len > 0);
+            UINT16ENCODE(p, len)
+            HDmemcpy(p, lnk->u.soft.name, (size_t)len);
+            p += len;
+            break;
+
+        /* User-defined links */
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+        default:
+            HDassert(lnk->type >= H5L_TYPE_UD_MIN && lnk->type <= H5L_TYPE_MAX);
+
+            /* Store the user-supplied data, however long it is */
+            len = (uint16_t)lnk->u.ud.size;
+            UINT16ENCODE(p, len)
+            if(len > 0)
+            {
+                HDmemcpy(p, lnk->u.ud.udata, (size_t)len);
+                p+=len;
+            }
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_link_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_link_copy(const void *_mesg, void *_dest)
+{
+    const H5O_link_t    *lnk = (const H5O_link_t *) _mesg;
+    H5O_link_t          *dest = (H5O_link_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(lnk);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_link_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy static information */
+    *dest = *lnk;
+
+    /* Duplicate the link's name */
+    HDassert(lnk->name);
+    if(NULL == (dest->name = H5MM_xstrdup(lnk->name)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't duplicate link name")
+
+    /* Copy other information needed for different link types */
+    if(lnk->type == H5L_TYPE_SOFT) {
+        if(NULL == (dest->u.soft.name = H5MM_xstrdup(lnk->u.soft.name)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't duplicate soft link value")
+    } /* end if */
+    else if(lnk->type >= H5L_TYPE_UD_MIN) {
+        if(lnk->u.ud.size > 0) {
+            if(NULL == (dest->u.ud.udata = H5MM_malloc(lnk->u.ud.size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+            HDmemcpy(dest->u.ud.udata, lnk->u.ud.udata, lnk->u.ud.size);
+        } /* end if */
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    if(NULL == ret_value)
+        if(dest) {
+            if(dest->name && dest->name != lnk->name)
+                dest->name = (char *)H5MM_xfree(dest->name);
+            if(NULL == _dest)
+                dest = H5FL_FREE(H5O_link_t ,dest);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_link_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_link_t *lnk = (const H5O_link_t *)_mesg;
+    uint64_t name_len;    /* Length of name */
+    size_t name_size;   /* Size of encoded name length */
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(uint64_t) >= sizeof(size_t));
+
+    /* Get name's length */
+    name_len = (uint64_t)HDstrlen(lnk->name);
+
+    /* Determine correct value for name size bits */
+    if(name_len > 4294967295)
+        name_size = 8;
+    else if(name_len > 65535)
+        name_size = 4;
+    else if(name_len > 255)
+        name_size = 2;
+    else
+        name_size = 1;
+
+    /* Set return value */
+    ret_value = 1 +                     /* Version */
+                1 +                     /* Link encoding flags */
+                (lnk->type != H5L_TYPE_HARD ? (size_t)1 : 0) + /* Link type */
+                (lnk->corder_valid ? 8 : 0) + /* Creation order */
+                (lnk->cset != H5T_CSET_ASCII ? 1 : 0) + /* Character set */
+                name_size +             /* Name length */
+                name_len;               /* Name */
+
+    /* Add the appropriate length for each type of link */
+    switch(lnk->type) {
+        case H5L_TYPE_HARD:
+            ret_value += H5F_SIZEOF_ADDR(f);
+            break;
+
+        case H5L_TYPE_SOFT:
+            ret_value += 2 +                            /* Link value length */
+                        HDstrlen(lnk->u.soft.name);     /* Link value */
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_MAX:
+        default: /* Default is user-defined link type */
+            HDassert(lnk->type >= H5L_TYPE_UD_MIN);
+            ret_value += 2 +                            /* User-defined data size */
+                         lnk->u.ud.size;                /* User-defined data */
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_link_reset
+ *
+ * Purpose:	Frees resources within a message, but doesn't free
+ *		the message itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, August 29, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_reset(void *_mesg)
+{
+    H5O_link_t *lnk = (H5O_link_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(lnk) {
+        /* Free information for link (but don't free link pointer) */
+        if(lnk->type == H5L_TYPE_SOFT)
+            lnk->u.soft.name = (char *)H5MM_xfree(lnk->u.soft.name);
+        else if (lnk->type >= H5L_TYPE_UD_MIN) {
+            if(lnk->u.ud.size > 0)
+                lnk->u.ud.udata = H5MM_xfree(lnk->u.ud.udata);
+        } /* end if */
+        lnk->name = (char *)H5MM_xfree(lnk->name);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_link_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_link_free
+ *
+ * Purpose:	Free's the message contents and the message itself
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 29, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_free(void *_mesg)
+{
+    H5O_link_t *lnk = (H5O_link_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(lnk);
+
+    /* Free information for link */
+    H5O_link_reset(lnk);
+    lnk = H5FL_FREE(H5O_link_t, lnk);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_link_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, August 29, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_link_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *_mesg)
+{
+    H5O_link_t *lnk = (H5O_link_t *)_mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(lnk);
+
+    /* Check for adjusting the link count when the link is removed */
+    /* Adjust the reference count of the object when a hard link is removed */
+    if(lnk->type == H5L_TYPE_HARD) {
+        H5O_loc_t oloc;
+
+        /* Construct object location for object, in order to decrement it's ref count */
+        H5O_loc_reset(&oloc);
+        oloc.file = f;
+        HDassert(H5F_addr_defined(lnk->u.hard.addr));
+        oloc.addr = lnk->u.hard.addr;
+
+        /* Decrement the ref count for the object */
+        if(H5O_link(&oloc, -1, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to decrement object link count")
+    } /* end if */
+    /* Perform the "delete" callback when a user-defined link is removed */
+    else if(lnk->type >= H5L_TYPE_UD_MIN) {
+        const H5L_class_t   *link_class;         /* User-defined link class */
+
+        /* Get the link class for this type of link. */
+        if(NULL == (link_class = H5L_find_class(lnk->type)))
+            HGOTO_ERROR(H5E_OHDR, H5E_NOTREGISTERED, FAIL, "link class not registered")
+
+        /* Check for delete callback */
+        if(link_class->del_func) {
+            hid_t file_id;           /* ID for the file the link is located in (passed to user callback) */
+
+            /* Get a file ID for the file the link is in */
+            if((file_id = H5F_get_id(f, FALSE)) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get file ID")
+
+            /* Call user-defined link's 'delete' callback */
+            if((link_class->del_func)(lnk->name, file_id, lnk->u.ud.udata, lnk->u.ud.size) < 0) {
+                H5I_dec_ref(file_id);
+                HGOTO_ERROR(H5E_OHDR, H5E_CALLBACK, FAIL, "link deletion callback returned failure")
+            } /* end if */
+
+            /* Release the file ID */
+            if(H5I_dec_ref(file_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCLOSEFILE, FAIL, "can't close file")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files for link messages.
+ *
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, June 26, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void H5_ATTR_UNUSED *native_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(deleted);
+    HDassert(cpy_info);
+
+    /* If we are performing a 'shallow hierarchy' copy, and this link won't
+     *  be included in the final group, indicate that it should be deleted
+     *  in the destination object header before performing any other actions
+     *  on it.
+     */
+    if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
+        *deleted = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_link_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              November  7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_link_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *native_src, H5F_t H5_ATTR_UNUSED *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *udata, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5O_link_t  *link_src = (H5O_link_t *)native_src;
+    void        *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(link_src);
+    HDassert(cpy_info);
+    HDassert(cpy_info->max_depth < 0 || cpy_info->curr_depth < cpy_info->max_depth);
+
+    /* Sanity check source link type */
+    if(link_src->type > H5L_TYPE_SOFT && link_src->type < H5L_TYPE_UD_MIN)
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, NULL, "unrecognized built-in link type")
+
+    /* Allocate "blank" link for destination */
+    /* (values will be filled in during 'post copy' operation) */
+    if(NULL == (ret_value = H5FL_CALLOC(H5O_link_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_link_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November  7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+    H5O_loc_t *dst_oloc, void *mesg_dst, unsigned H5_ATTR_UNUSED *mesg_flags,
+    hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    const H5O_link_t    *link_src = (const H5O_link_t *)mesg_src;
+    H5O_link_t          *link_dst = (H5O_link_t *)mesg_dst;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(link_src);
+    HDassert(dst_oloc);
+    HDassert(H5F_addr_defined(dst_oloc->addr));
+    HDassert(dst_oloc->file);
+    HDassert(link_dst);
+    HDassert(cpy_info);
+    HDassert(cpy_info->max_depth < 0 || cpy_info->curr_depth < cpy_info->max_depth);
+
+    /* Copy the link (and the object it points to) */
+    if(H5L_link_copy_file(dst_oloc->file, dxpl_id, link_src, src_oloc, link_dst,
+            cpy_info) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy link")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_link_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_link_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at ncsa.uiuc.edu
+ *              Aug 29 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_link_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_link_t    *lnk = (const H5O_link_t *) _mesg;
+    herr_t               ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(lnk);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Link Type:", (lnk->type == H5L_TYPE_HARD ? "Hard" :
+                  (lnk->type == H5L_TYPE_SOFT ? "Soft" :
+                  (lnk->type == H5L_TYPE_EXTERNAL ? "External" :
+                  (lnk->type >= H5L_TYPE_UD_MIN ? "User-defined" : "Unknown")))));
+
+    if(lnk->corder_valid)
+        HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                  "Creation Order:", lnk->corder);
+
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Link Name Character Set:", (lnk->cset == H5T_CSET_ASCII ?
+                "ASCII" : (lnk->cset == H5T_CSET_UTF8 ? "UTF-8" : "Unknown")));
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Link Name:", lnk->name);
+
+    /* Display link-specific information */
+    switch(lnk->type) {
+        case H5L_TYPE_HARD:
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                      "Object address:", lnk->u.hard.addr);
+            break;
+
+        case H5L_TYPE_SOFT:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                      "Link Value:", lnk->u.soft.name);
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_MAX:
+        default:
+            if(lnk->type >= H5L_TYPE_UD_MIN) {
+                if(lnk->type == H5L_TYPE_EXTERNAL) {
+                    const char *objname = (const char *)lnk->u.ud.udata + (HDstrlen((const char *)lnk->u.ud.udata) + 1);
+
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "External File Name:", lnk->u.ud.udata);
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "External Object Name:", objname);
+                } /* end if */
+                else {
+                    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+                              "User-Defined Link Size:", lnk->u.ud.size);
+                } /* end else */
+            } /* end if */
+            else
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type")
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_link_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Omessage.c b/gatb-core/thirdparty/hdf5/src/H5Omessage.c
new file mode 100644
index 0000000..7a946df
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Omessage.c
@@ -0,0 +1,2438 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Omessage.c
+ *			Dec  3 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object header message routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Aprivate.h"		/* Attributes	  			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5SMprivate.h"        /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* User data for iteration while removing a message */
+typedef struct {
+    H5F_t      *f;              /* Pointer to file for insertion */
+    hid_t dxpl_id;              /* DXPL during iteration */
+    int sequence;               /* Sequence # to search for */
+    unsigned nfailed;           /* # of failed message removals */
+    H5O_operator_t op;          /* Callback routine for removal operations */
+    void *op_data;              /* Callback data for removal operations */
+    hbool_t adj_link;           /* Whether to adjust links when removing messages */
+} H5O_iter_rm_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5O_msg_reset_real(const H5O_msg_class_t *type, void *native);
+static herr_t H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned sequence, unsigned *oh_modified, void *_udata/*in,out*/);
+static herr_t H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
+    const H5O_msg_class_t *type, const void *mesg, unsigned mesg_flags,
+    unsigned update_flags);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_create
+ *
+ * Purpose:	Create a new object header message
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  1 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags,
+    unsigned update_flags, void *mesg, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+    HDassert(mesg);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Go append message to object header */
+    if(H5O_msg_append_oh(loc->file, dxpl_id, oh, type_id, mesg_flags, update_flags, mesg) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to append to object header")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_append_oh
+ *
+ * Purpose:	Simplified version of H5O_msg_create, used when creating a new
+ *              object header message (usually during object creation) and
+ *              several messages will be added to the object header at once.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Dec 31 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_append_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
+    unsigned mesg_flags, unsigned update_flags, void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Original H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(H5O_ATTR_ID != type_id);   /* Attributes are modified in another routine */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+    HDassert(mesg);
+
+    /* Append new message to object header */
+    if(H5O_msg_append_real(f, dxpl_id, oh, type, mesg_flags, update_flags, mesg) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create new message in header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_append_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_append_real
+ *
+ * Purpose:	Append a new message to an object header.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_append_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
+    unsigned mesg_flags, unsigned update_flags, void *mesg)
+{
+    size_t idx;                         /* Index of message to modify */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type);
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+    HDassert(mesg);
+
+    /* Allocate space for a new message */
+    if(H5O_msg_alloc(f, dxpl_id, oh, type, &mesg_flags, mesg, &idx) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "unable to create new message")
+
+    /* Copy the information for the message */
+    if(H5O_copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to write message")
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_append_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_write
+ *
+ * Purpose:	Modifies an existing message or creates a new message.
+ *
+ *              The UPDATE_FLAGS argument are flags that allow the caller
+ *              to skip updating the modification time or reseting the message
+ *              data.  This is useful when several calls to H5O_msg_write will be
+ *              made in a sequence.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_write(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags,
+    unsigned update_flags, void *mesg, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header to use */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(H5O_ATTR_ID != type_id);   /* Attributes are modified in another routine */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(mesg);
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Call the "real" modify routine */
+    if(H5O_msg_write_real(loc->file, dxpl_id, oh, type, mesg_flags, update_flags, mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header message")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_write_oh
+ *
+ * Purpose:	Modifies an existing message or creates a new message.
+ *
+ *              The UPDATE_FLAGS argument are flags that allow the caller
+ *              to skip updating the modification time or reseting the message
+ *              data.  This is useful when several calls to H5O_msg_write will be
+ *              made in a sequence.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_write_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
+    unsigned mesg_flags, unsigned update_flags, void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(H5O_ATTR_ID != type_id);   /* Attributes are modified in another routine */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(mesg);
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+
+    /* Call the "real" modify routine */
+    if(H5O_msg_write_real(f, dxpl_id, oh, type, mesg_flags, update_flags, mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_write_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_write_real
+ *
+ * Purpose:	Modifies an existing message or creates a new message.
+ *
+ *              The UPDATE_FLAGS argument are flags that allow the caller
+ *              to skip updating the modification time or reseting the message
+ *              data.  This is useful when several calls to H5O_msg_write will be
+ *              made in a sequence.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_write_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
+    unsigned mesg_flags, unsigned update_flags, void *mesg)
+{
+    H5O_mesg_t         *idx_msg;        /* Pointer to message to modify */
+    size_t		idx;            /* Index of message to modify */
+    herr_t	        ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type);
+    HDassert(type != H5O_MSG_ATTR);
+    HDassert(mesg);
+    HDassert(0 == (mesg_flags & ~H5O_MSG_FLAG_BITS));
+
+    /* Locate message of correct type */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(type == idx_msg->type)
+            break;
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
+
+    /* Check for modifying a constant message */
+    if(!(update_flags & H5O_UPDATE_FORCE) && (idx_msg->flags & H5O_MSG_FLAG_CONSTANT))
+	HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to modify constant message")
+    /* This message is shared, but it's being modified. */
+    else if((idx_msg->flags & H5O_MSG_FLAG_SHARED) || (idx_msg->flags & H5O_MSG_FLAG_SHAREABLE)) {
+        htri_t status;              /* Status of "try share" call */
+
+         /* First, sanity check to make sure it's not a committed message;
+          *     these can't ever be modified.
+          */
+        HDassert(((H5O_shared_t *)idx_msg->native)->type != H5O_SHARE_TYPE_COMMITTED);
+
+        /* Also, sanity check that a message doesn't switch status from being
+         *      shared (or sharable) to being unsharable.  (Which could cause
+         *      a message to increase in size in the object header)
+         */
+        HDassert(!(mesg_flags & H5O_MSG_FLAG_DONTSHARE));
+
+        /* Remove the old message from the SOHM index */
+        /* (It would be more efficient to try to share the message first, then
+         *      delete it (avoiding thrashing the index in the case the ref.
+         *      count on the message is one), but this causes problems when
+         *      the location of the object changes (from in another object's
+         *      header to the SOHM heap), so just delete it first -QAK)
+         */
+        if(H5SM_delete(f, dxpl_id, oh, (H5O_shared_t *)idx_msg->native) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete message from SOHM index")
+
+        /* If we're replacing a shared message, the new message must be shared
+         * (or else it may increase in size!), so pass in NULL for the OH
+         * location.
+         *
+         * XXX: This doesn't handle freeing extra space in object header from
+         *      a message shrinking.
+         */
+        if((status = H5SM_try_share(f, dxpl_id, ((mesg_flags & H5O_MSG_FLAG_SHARED) ? NULL : oh), 0, idx_msg->type->id, mesg, &mesg_flags)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "error while trying to share message")
+        if(status == FALSE && (mesg_flags & H5O_MSG_FLAG_SHARED))
+            HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "message changed sharing status")
+    } /* end if */
+
+    /* Copy the information for the message */
+    if(H5O_copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to write message")
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_write_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_read
+ *
+ * Purpose:	Reads a message from an object header and returns a pointer
+ *		to it.	The caller will usually supply the memory through
+ *		MESG and the return value will be MESG.	 But if MESG is
+ *		the null pointer, then this function will malloc() memory
+ *		to hold the result and return its pointer instead.
+ *
+ * Return:	Success:	Ptr to message in native format.  The message
+ *				should be freed by calling H5O_msg_reset().  If
+ *				MESG is a null pointer then the caller should
+ *				also call H5MM_xfree() on the return value
+ *				after calling H5O_msg_reset().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg,
+    hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header to use */
+    void *ret_value;                    /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
+
+    /* Call the "real" read routine */
+    if(NULL == (ret_value = H5O_msg_read_oh(loc->file, dxpl_id, oh, type_id, mesg)))
+	HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header message")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_read_oh
+ *
+ * Purpose:	Reads a message from an object header and returns a pointer
+ *		to it.	The caller will usually supply the memory through
+ *		MESG and the return value will be MESG.	 But if MESG is
+ *		the null pointer, then this function will malloc() memory
+ *		to hold the result and return its pointer instead.
+ *
+ * Return:	Success:	Ptr to message in native format.  The message
+ *				should be freed by calling H5O_msg_reset().  If
+ *				MESG is a null pointer then the caller should
+ *				also call H5MM_xfree() on the return value
+ *				after calling H5O_msg_reset().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_read_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
+    void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    unsigned       idx;                 /* Message's index in object header */
+    void           *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Scan through the messages looking for the right one */
+    for(idx = 0; idx < oh->nmesgs; idx++)
+	if(type == oh->mesg[idx].type)
+            break;
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, NULL, "message type not found")
+
+    /*
+     * Decode the message if necessary.  If the message is shared then retrieve
+     * native message through the shared interface.
+     */
+    H5O_LOAD_NATIVE(f, dxpl_id, 0, oh, &(oh->mesg[idx]), NULL)
+
+    /*
+     * The object header caches the native message (along with
+     * the raw message) so we must copy the native message before
+     * returning.
+     */
+    if(NULL == (ret_value = (type->copy)(oh->mesg[idx].native, mesg)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy message to user space")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_read_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_reset
+ *
+ * Purpose:	Some message data structures have internal fields that
+ *		need to be freed.  This function does that if appropriate
+ *		but doesn't free NATIVE.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 12 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_reset(unsigned type_id, void *native)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Call the "real" reset routine */
+    if(H5O_msg_reset_real(type, native) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTRESET, FAIL, "unable to reset object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_reset_real
+ *
+ * Purpose:	Some message data structures have internal fields that
+ *		need to be freed.  This function does that if appropriate
+ *		but doesn't free NATIVE.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 12 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_msg_reset_real(const H5O_msg_class_t *type, void *native)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(type);
+
+    if(native) {
+	if(type->reset) {
+	    if((type->reset)(native) < 0)
+		HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "reset method failed")
+	} /* end if */
+        else
+	    HDmemset(native, 0, type->native_size);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_reset_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_free
+ *
+ * Purpose:	Similar to H5O_msg_reset() except it also frees the message
+ *		pointer.
+ *
+ * Return:	Success:	NULL
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_free(unsigned type_id, void *mesg)
+{
+    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
+    void * ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Call the "real" free routine */
+    ret_value = H5O_msg_free_real(type, mesg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_free_mesg
+ *
+ * Purpose:	Call H5O_msg_free_real() on a message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, Sep  6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_free_mesg(H5O_mesg_t *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(mesg);
+
+    /* Free any native information */
+    mesg->native = H5O_msg_free_real(mesg->type, mesg->native);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_msg_free_mesg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_free_real
+ *
+ * Purpose:	Similar to H5O_msg_reset() except it also frees the message
+ *		pointer.
+ *
+ * Return:	Success:	NULL
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_free_real(const H5O_msg_class_t *type, void *msg_native)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(type);
+
+    if(msg_native) {
+        H5O_msg_reset_real(type, msg_native);
+        if(NULL != (type->free))
+            (type->free)(msg_native);
+        else
+            H5MM_xfree(msg_native);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(NULL)
+} /* end H5O_msg_free_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_copy
+ *
+ * Purpose:	Copies a message.  If MESG is is the null pointer then a null
+ *		pointer is returned with no error.
+ *
+ * Return:	Success:	Ptr to the new message
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_copy(unsigned type_id, const void *mesg, void *dst)
+{
+    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
+    void	*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(mesg);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Call the message class's copy routine */
+    if(NULL == (ret_value = (type->copy)(mesg, dst)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy object header message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_count
+ *
+ * Purpose:	Counts the number of messages in an object header which are a
+ *		certain type.
+ *
+ * Return:	Success:	Number of messages of specified type.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, April 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_msg_count(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;           /* Object header to operate on */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    unsigned msg_count;         /* Message count */
+    int	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Load the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Count the messages of the correct type */
+    msg_count = H5O_msg_count_real(oh, type);
+    H5_CHECKED_ASSIGN(ret_value, int, msg_count, unsigned);
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_count_real
+ *
+ * Purpose:	Counts the number of messages in an object header which are a
+ *		certain type.
+ *
+ * Return:	Success:	Number of messages of specified type.
+ *
+ *		Failure:	(can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5O_msg_count_real(const H5O_t *oh, const H5O_msg_class_t *type)
+{
+    unsigned u;                 /* Local index variable */
+    unsigned ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(oh);
+    HDassert(type);
+
+    /* Loop over all messages, counting the ones of the type looked for */
+    for(u = ret_value = 0; u < oh->nmesgs; u++)
+	if(oh->mesg[u].type == type)
+            ret_value++;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_count_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_exists
+ *
+ * Purpose:	Determines if a particular message exists in an object
+ *		header without trying to decode the message.
+ *
+ * Return:	Success:	FALSE if the message does not exist; TRUE if
+ *				th message exists.
+ *
+ *		Failure:	FAIL if the existence of the message could
+ *				not be determined due to some error such as
+ *				not being able to read the object header.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, November  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+    H5O_t	*oh = NULL;             /* Object header for location */
+    htri_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+
+    /* Load the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Call the "real" exists routine */
+    if((ret_value = H5O_msg_exists_oh(oh, type_id)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_READERROR, FAIL, "unable to verify object header message")
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_exists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_exists_oh
+ *
+ * Purpose:	Determines if a particular message exists in an object
+ *		header without trying to decode the message.
+ *
+ * Return:	Success:	FALSE if the message does not exist; TRUE if
+ *				th message exists.
+ *
+ *		Failure:	FAIL if the existence of the message could
+ *				not be determined due to some error such as
+ *				not being able to read the object header.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, November  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_exists_oh(const H5O_t *oh, unsigned type_id)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    unsigned	u;                      /* Local index variable */
+    htri_t      ret_value = FALSE;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(oh);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Scan through the messages looking for the right one */
+    for(u = 0; u < oh->nmesgs; u++)
+	if(type == oh->mesg[u].type)
+            HGOTO_DONE(TRUE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_exists_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_remove
+ *
+ * Purpose:	Removes the specified message from the object header.
+ *		If sequence is H5O_ALL (-1) then all messages of the
+ *		specified type are removed.  Removing a message causes
+ *		the sequence numbers to change for subsequent messages of
+ *		the same type.
+ *
+ *		No attempt is made to join adjacent free areas of the
+ *		object header into a single larger free area.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 28 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_remove(const H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj_link,
+    hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(H5O_ATTR_ID != type_id);   /* Attributes are modified in another routine */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Call the "real" remove routine */
+    if((ret_value = H5O_msg_remove_real(loc->file, oh, type, sequence, NULL, NULL, adj_link, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_remove_op
+ *
+ * Purpose:	Removes messages from the object header that a callback
+ *              routine indicates should be removed.
+ *
+ *		No attempt is made to join adjacent free areas of the
+ *		object header into a single larger free area.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
+    H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Pointer to actual object header */
+    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
+    herr_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(H5O_ATTR_ID != type_id);   /* Attributes are modified in another routine */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Pin the object header */
+    if(NULL == (oh = H5O_pin(loc, dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header")
+
+    /* Call the "real" remove routine */
+    if((ret_value = H5O_msg_remove_real(loc->file, oh, type, sequence, op, op_data, adj_link, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
+
+done:
+    if(oh && H5O_unpin(oh) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_remove_cb
+ *
+ * Purpose:	Object header iterator callback routine to remove messages
+ *              of a particular type that match a particular sequence number,
+ *              or all messages if the sequence number is H5O_ALL (-1).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ * Modifications:
+ *	Vailin Choi; Sept 2011
+ *	Indicate that the object header is modified and might possibly need
+ *	to condense messages in the object header 
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
+    unsigned *oh_modified, void *_udata/*in,out*/)
+{
+    H5O_iter_rm_t *udata = (H5O_iter_rm_t *)_udata;   /* Operator user data */
+    htri_t try_remove = FALSE;         /* Whether to try removing a message */
+    herr_t ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(mesg);
+
+    /* Check for callback routine */
+    if(udata->op) {
+        /* Call the iterator callback */
+        if((try_remove = (udata->op)(mesg->native, sequence, udata->op_data)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "object header message deletion callback failed")
+    } /* end if */
+    else {
+        /* If there's no callback routine, does the sequence # match? */
+        if((int)sequence == udata->sequence || H5O_ALL == udata->sequence)
+            try_remove = TRUE;
+    } /* end else */
+
+    /* Try removing the message, if indicated */
+    if(try_remove) {
+        /*
+         * Keep track of how many times we failed trying to remove constant
+         * messages.
+         * (OK to remove constant messages - QAK)
+         */
+        /* Convert message into a null message */
+        if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, udata->adj_link) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to release message")
+
+        /* Indicate that the object header was modified & might need to condense messages in object header */
+        *oh_modified = H5O_MODIFY_CONDENSE;
+
+        /* Break out now, if we've found the correct message */
+        if(udata->sequence == H5O_FIRST || udata->sequence != H5O_ALL)
+            HGOTO_DONE(H5_ITER_STOP)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_remove_real
+ *
+ * Purpose:	Removes the specified message from the object header.
+ *		If sequence is H5O_ALL (-1) then all messages of the
+ *		specified type are removed.  Removing a message causes
+ *		the sequence numbers to change for subsequent messages of
+ *		the same type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 28 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_remove_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
+    int sequence, H5O_operator_t app_op, void *op_data, hbool_t adj_link,
+    hid_t dxpl_id)
+{
+    H5O_iter_rm_t udata;                /* User data for iterator */
+    H5O_mesg_operator_t op;             /* Wrapper for operator */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type);
+
+    /* Make certain we are allowed to modify the file */
+    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
+	HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /* Set up iterator operator data */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.sequence = sequence;
+    udata.nfailed = 0;
+    udata.op = app_op;
+    udata.op_data = op_data;
+    udata.adj_link = adj_link;
+
+    /* Iterate over the messages, deleting appropriate one(s) */
+    op.op_type = H5O_MESG_OP_LIB;
+    op.u.lib_op = H5O_msg_remove_cb;
+    if(H5O_msg_iterate_real(f, oh, type, &op, &udata, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "error iterating over messages")
+
+    /* Fail if we tried to remove any constant messages */
+    if(udata.nfailed)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to remove constant message(s)")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_iterate
+ *
+ * Purpose:	Iterate through object headers of a certain type.
+ *
+ * Return:	Returns a negative value if something is wrong, the return
+ *      value of the last operator if it was non-zero, or zero if all
+ *      object headers were processed.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Nov 19 2004
+ *
+ * Description:
+ *      This function interates over the object headers of an object
+ *  specified with 'loc' of type 'type_id'.  For each object header of the
+ *  object, the 'op_data' and some additional information (specified below) are
+ *  passed to the 'op' function.
+ *      The operation receives a pointer to the object header message for the
+ *  object being iterated over ('mesg'), and the pointer to the operator data
+ *  passed in to H5O_msg_iterate ('op_data').  The return values from an operator
+ *  are:
+ *      A. Zero causes the iterator to continue, returning zero when all
+ *          object headers of that type have been processed.
+ *      B. Positive causes the iterator to immediately return that positive
+ *          value, indicating short-circuit success.
+ *      C. Negative causes the iterator to immediately return that value,
+ *          indicating failure.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id,
+    const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;               /* Pointer to actual object header */
+    const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
+    herr_t ret_value;               /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(op);
+
+    /* Protect the object header to iterate over */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Call the "real" iterate routine */
+    if((ret_value = H5O_msg_iterate_real(loc->file, oh, type, op, op_data, dxpl_id)) < 0)
+        HERROR(H5E_OHDR, H5E_BADITER, "unable to iterate over object header messages");
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_iterate_real
+ *
+ * Purpose:	Iterate through object headers of a certain type.
+ *
+ * Return:	Returns a negative value if something is wrong, the return
+ *      value of the last operator if it was non-zero, or zero if all
+ *      object headers were processed.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ * Description:
+ *      This function interates over the object headers of an object
+ *  specified with 'ent' of type 'type_id'.  For each object header of the
+ *  object, the 'op_data' and some additional information (specified below) are
+ *  passed to the 'op' function.
+ *      The operation receives a pointer to the object header message for the
+ *  object being iterated over ('mesg'), and the pointer to the operator data
+ *  passed in to H5O_msg_iterate ('op_data').  The return values from an operator
+ *  are:
+ *      A. Zero causes the iterator to continue, returning zero when all
+ *          object headers of that type have been processed.
+ *      B. Positive causes the iterator to immediately return that positive
+ *          value, indicating short-circuit success.
+ *      C. Negative causes the iterator to immediately return that value,
+ *          indicating failure.
+ *
+ * Modifications:
+ *	Vailin Choi; September 2011
+ *	Change "oh_modified" from boolean to unsigned so as to know:
+ *	1) object header is just modified
+ *	2) object header is modified and possibly need to condense messages there
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
+    const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id)
+{
+    H5O_mesg_t         *idx_msg;        /* Pointer to current message */
+    unsigned		idx;            /* Absolute index of current message in all messages */
+    unsigned		sequence;       /* Relative index of current message for messages of type */
+    unsigned		oh_modified = 0;    /* Whether the callback modified the object header */
+    herr_t              ret_value = H5_ITER_CONT;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type);
+    HDassert(op);
+    HDassert(op->u.app_op);
+
+    /* Iterate over messages */
+    for(sequence = 0, idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs && !ret_value; idx++, idx_msg++) {
+	if(type == idx_msg->type) {
+            /* Decode the message if necessary.  */
+            H5O_LOAD_NATIVE(f, dxpl_id, 0, oh, idx_msg, FAIL)
+
+            /* Check for making an "internal" (i.e. within the H5O package) callback */
+            if(op->op_type == H5O_MESG_OP_LIB)
+                ret_value = (op->u.lib_op)(oh, idx_msg, sequence, &oh_modified, op_data);
+            else
+                ret_value = (op->u.app_op)(idx_msg->native, sequence, op_data);
+
+            /* Check for iterator callback indicating to get out of loop */
+            if(ret_value != 0)
+                break;
+
+            /* Increment sequence value for message type */
+            sequence++;
+        } /* end if */
+    } /* end for */
+
+    /* Check for error from iterator */
+    if(ret_value < 0)
+        HERROR(H5E_OHDR, H5E_CANTLIST, "iterator function failed");
+
+done:
+    /* Check if object message was modified */
+    if(oh_modified) {
+        /* Try to condense object header info if the flag indicates so */
+        /* (Since this routine is used to remove messages from an
+         *  object header, the header will be condensed after each
+         *  message removal)
+         */
+	if(oh_modified & H5O_MODIFY_CONDENSE) {
+	    if(H5O_condense_header(f, oh, dxpl_id) < 0)
+		HDONE_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't pack object header")
+	}
+
+        /* Mark object header as changed */
+        if(H5O_touch_oh(f, dxpl_id, oh, FALSE) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+        /* Mark object header as dirty in cache */
+        if(H5AC_mark_entry_dirty(oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_iterate_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_raw_size
+ *
+ * Purpose:	Call the 'raw_size' method for a
+ *              particular class of object header.
+ *
+ * Return:	Size of message on success, 0 on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 13 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_msg_raw_size(const H5F_t *f, unsigned type_id, hbool_t disable_shared,
+    const void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    size_t ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->raw_size);
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Compute the raw data size for the mesg */
+    if(0 == (ret_value = (type->raw_size)(f, disable_shared, mesg)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_raw_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_size_f
+ *
+ * Purpose:	Calculate the final size of an encoded message in an object
+ *              header.
+ *
+ * Note:	This routine assumes that the message size will be used in the
+ *              creation of a new object header.
+ *
+ * Return:	Size of message on success, 0 on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep  6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_msg_size_f(const H5F_t *f, hid_t ocpl_id, unsigned type_id,
+    const void *mesg, size_t extra_raw)
+{
+    const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+    H5P_genplist_t *ocpl;       /* Object Creation Property list */
+    uint8_t oh_flags;           /* Object header status flags */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->raw_size);
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Get the property list */
+    if(NULL == (ocpl = (H5P_genplist_t *)H5I_object(ocpl_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, 0, "not a property list")
+
+    /* Get any object header status flags set by properties */
+    if(H5P_get(ocpl, H5O_CRT_OHDR_FLAGS_NAME, &oh_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "can't get object header flags")
+
+
+    /* Compute the raw data size for the mesg */
+    if((ret_value = (type->raw_size)(f, FALSE, mesg)) == 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
+
+    /* Add in "extra" raw space */
+    ret_value += extra_raw;
+
+    /* Adjust size for alignment, if necessary */
+    ret_value = (size_t)H5O_ALIGN_F(f, ret_value);
+
+    /* Add space for message header */
+    ret_value += (size_t)H5O_SIZEOF_MSGHDR_F(f,
+            (H5F_STORE_MSG_CRT_IDX(f) || oh_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_size_f() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_size_oh
+ *
+ * Purpose:	Calculate the final size of an encoded message in an object
+ *              header.
+ *
+ * Note:	This routine assumes that the message is already used in
+ *              an object header.
+ *
+ * Return:	Size of message on success, 0 on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  7 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_msg_size_oh(const H5F_t *f, const H5O_t *oh, unsigned type_id,
+    const void *mesg, size_t extra_raw)
+{
+    const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->raw_size);
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Compute the raw data size for the mesg */
+    if((ret_value = (type->raw_size)(f, FALSE, mesg)) == 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
+
+    /* Add in "extra" raw space */
+    ret_value += extra_raw;
+
+    /* Adjust size for alignment, if necessary */
+    ret_value = (size_t)H5O_ALIGN_OH(oh, ret_value);
+
+    /* Add space for message header */
+    ret_value += (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_size_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_can_share
+ *
+ * Purpose:     Call the 'can share' method for a
+ *              particular class of object header.  This returns TRUE
+ *              if the message is allowed to be put in the shared message
+ *              heap and false otherwise (e.g., for committed or immutable
+ *              datatypes).
+ *
+ * Return:      Object can be shared:        TRUE
+ *              Object cannot be shared:    FALSE
+ *
+ * Programmer:  James Laird
+ *              January 12 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_can_share(unsigned type_id, const void *mesg)
+{
+    const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
+    htri_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(mesg);
+
+    /* If there is a can_share callback, use it */
+    if(type->can_share)
+        ret_value = (type->can_share)(mesg);
+    else {
+        /* Otherwise, the message can be shared if messages of this type are
+         * shareable in general; i.e., if they have the "is_sharable" flag
+         * in the "share_flags" class member set.
+         */
+        ret_value = (type->share_flags & H5O_SHARE_IS_SHARABLE) ? TRUE : FALSE;
+    } /* end else */
+
+    /* If the message is shareable, both copy_file and post_copy_file must be
+     * defined */
+    HDassert((type->post_copy_file && type->copy_file) || ret_value == FALSE);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_can_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_can_share_in_ohdr
+ *
+ * Purpose:     Check if the message class allows its messages to be shared
+ *              in the object's header.
+ *
+ * Return:      Object can be shared:        TRUE
+ *              Object cannot be shared:    FALSE
+ *
+ * Programmer:  Quincey Koziol
+ *              March 15 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_can_share_in_ohdr(unsigned type_id)
+{
+    const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
+    htri_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Otherwise, the message can be shared if messages of this type are
+     * shareable in general; i.e., if they have the "is_sharable" flag
+     * in the "share_flags" class member set.
+     */
+    ret_value = (type->share_flags & H5O_SHARE_IN_OHDR) ? TRUE : FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_can_share_in_ohdr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_is_shared
+ *
+ * Purpose:     Call the 'is_shared' method for a
+ *              particular class of object header.
+ *
+ * Return:      Object is shared:        TRUE
+ *              Object is not shared:    FALSE
+ *
+ * Programmer:  James Laird
+ *              jlaird at ncsa.uiuc.edu
+ *              April 5 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_is_shared(unsigned type_id, const void *mesg)
+{
+    const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
+    htri_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(mesg);
+
+    /* If messages in a class aren't sharable, then obviously this message isn't shared! :-) */
+    if(type->share_flags & H5O_SHARE_IS_SHARABLE)
+        ret_value = H5O_IS_STORED_SHARED(((const H5O_shared_t *)mesg)->type);
+    else
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_is_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_set_share
+ *
+ * Purpose:	Set the shared information for an object header message.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		jlaird at hdfgroup.org
+ *		November 1 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_set_share(unsigned type_id, const H5O_shared_t *share, void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->share_flags & H5O_SHARE_IS_SHARABLE);
+    HDassert(mesg);
+    HDassert(share);
+    HDassert(share->type != H5O_SHARE_TYPE_UNSHARED);
+
+    /* If there's a special action for this class that needs to be performed
+     *  when setting the shared component, do that
+     */
+    if(type->set_share) {
+        if((type->set_share)(mesg, share) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to set shared message information")
+    } /* end if */
+    else {
+        /* Set this message as the shared component for the message, wiping out
+         * any information that was there before
+         */
+        if(H5O_set_shared((H5O_shared_t *)mesg, share) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to set shared message information")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_set_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_reset_share
+ *
+ * Purpose:	Reset the shared information for an object header message.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *		jlaird at hdfgroup.org
+ *		Oct 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_reset_share(unsigned type_id, void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(type->share_flags & H5O_SHARE_IS_SHARABLE);
+    HDassert(mesg);
+
+    /* Reset the shared component in the message to zero. */
+    HDmemset((H5O_shared_t *)mesg, 0, sizeof(H5O_shared_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_msg_reset_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_get_crt_index
+ *
+ * Purpose:     Call the 'get creation index' method for a message.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              March 15 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_get_crt_index(unsigned type_id, const void *mesg, H5O_msg_crt_idx_t *crt_idx)
+{
+    const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+    HDassert(mesg);
+    HDassert(crt_idx);
+
+    /* If there is a "get_crt_index callback, use it */
+    if(type->get_crt_index) {
+        /* Retrieve the creation index from the native message */
+        if((type->get_crt_index)(mesg, crt_idx) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve creation index")
+    } /* end if */
+    else
+        *crt_idx = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_get_crt_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_encode
+ *
+ * Purpose:	Encode an object(data type and simple data space only)
+ *              description into a buffer.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *		slu at ncsa.uiuc.edu
+ *		July 13, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_encode(H5F_t *f, unsigned type_id, hbool_t disable_shared,
+    unsigned char *buf, const void *mesg)
+{
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Encode */
+    if((type->encode)(f, disable_shared, buf, mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_decode
+ *
+ * Purpose:	Decode a binary object description and return a new
+ *              object handle.
+ *
+ * Return:	Success:        Pointer to object(data type or space)
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Raymond Lu
+ *		slu at ncsa.uiuc.edu
+ *		July 14, 2004
+ *
+ * Modifications: Neil Fortner
+ *              Feb 4 2009
+ *              Added open_oh parameter.  This parameter is optional and
+ *              contains this message's protected object header
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id,
+    const unsigned char *buf)
+{
+    const H5O_msg_class_t   *type;      /* Actual H5O class type for the ID */
+    void *ret_value;                    /* Return value */
+    unsigned ioflags = 0;               /* Flags for decode routine */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* decode */
+    if((ret_value = (type->decode)(f, dxpl_id, open_oh, 0, &ioflags, buf)) == NULL)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_copy_file
+ *
+ * Purpose:     Copies a message to file.  If MESG is is the null pointer then a null
+ *              pointer is returned with no error.
+ *
+ *              Attempts to share the message in the destination and sets
+ *              SHARED to TRUE or FALSE depending on whether this succeeds.
+ *
+ * Return:      Success:        Ptr to the new message
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Peter Cao
+ *              June 4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_copy_file(const H5O_msg_class_t *type, H5F_t *file_src,
+    void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
+    unsigned *mesg_flags, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id)
+{
+    void        *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(type);
+    HDassert(type->copy_file);
+    HDassert(file_src);
+    HDassert(native_src);
+    HDassert(file_dst);
+    HDassert(recompute_size);
+    HDassert(cpy_info);
+
+    /* The copy_file callback will return an H5O_shared_t only if the message
+     * to be copied is a committed datatype.
+     */
+    if(NULL == (ret_value = (type->copy_file)(file_src, native_src, file_dst, recompute_size, mesg_flags, cpy_info, udata, dxpl_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy object header message to file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_alloc
+ *
+ * Purpose:	Create a new message in an object header
+ *
+ * Return:	Success:	Index of message
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, September  3, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
+    unsigned *mesg_flags, void *native, size_t *mesg_idx)
+{
+    size_t new_idx;             /* New index for message */
+    htri_t shared_mesg;         /* Should this message be stored in the Shared Message table? */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(mesg_flags);
+    HDassert(!(*mesg_flags & H5O_MSG_FLAG_SHARED));
+    HDassert(type);
+    HDassert(native);
+    HDassert(mesg_idx);
+
+    /* Check if message is already shared */
+    if((shared_mesg = H5O_msg_is_shared(type->id, native)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "error determining if message is shared")
+    else if(shared_mesg > 0) {
+        /* Increment message's reference count */
+        if(type->link && (type->link)(f, dxpl_id, oh, native) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared message ref count")
+        *mesg_flags |= H5O_MSG_FLAG_SHARED;
+    } /* end if */
+    else {
+        /* Attempt to share message */
+        if(H5SM_try_share(f, dxpl_id, oh, 0, type->id, native, mesg_flags) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
+    } /* end else */
+
+    /* Allocate space in the object header for the message */
+    if(H5O_alloc(f, dxpl_id, oh, type, native, &new_idx) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to allocate space for message")
+
+    /* Get the message's "creation index", if it has one */
+    if(type->get_crt_index) {
+        /* Retrieve the creation index from the native message */
+        if((type->get_crt_index)(native, &oh->mesg[new_idx].crt_idx) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve creation index")
+    } /* end if */
+
+    /* Set new message index */
+    *mesg_idx = new_idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_copy_mesg
+ *
+ * Purpose:	Make a copy of the native object for an object header's
+ *              native message info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, September  3, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
+    const H5O_msg_class_t *type, const void *mesg, unsigned mesg_flags,
+    unsigned update_flags)
+{
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Chunk that message is in */
+    H5O_mesg_t *idx_msg = &oh->mesg[idx];       /* Pointer to message to modify */
+    hbool_t chk_dirtied = FALSE;                /* Flag for unprotecting chunk */
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(type);
+    HDassert(type->copy);
+    HDassert(mesg);
+
+    /* Protect chunk */
+    if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, idx_msg->chunkno)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
+
+    /* Reset existing native information for the header's message */
+    H5O_msg_reset_real(type, idx_msg->native);
+
+    /* Copy the native object for the message */
+    if(NULL == (idx_msg->native = (type->copy)(mesg, idx_msg->native)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to copy message to object header")
+
+    /* Update the message flags */
+    idx_msg->flags = (uint8_t)mesg_flags;
+
+    /* Mark the message as modified */
+    idx_msg->dirty = TRUE;
+    chk_dirtied = TRUE;
+
+    /* Release chunk */
+    if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
+    chk_proxy = NULL;
+
+    /* Update the modification time, if requested */
+    if(update_flags & H5O_UPDATE_TIME)
+        if(H5O_touch_oh(f, dxpl_id, oh, FALSE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUPDATE, FAIL, "unable to update time on object")
+
+done:
+    /* Release chunk, if not already released */
+    if(chk_proxy && H5O_chunk_unprotect(f, dxpl_id, chk_proxy, chk_dirtied) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_copy_mesg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_msg_delete
+ *
+ * Purpose:     Calls a message's delete callback.
+ *
+ *              This is mostly redundant with H5O_delete_mesg below,
+ *              but H5O_delete_mesg only works on messages in object headers
+ *              (while the shared message code needs to delete messages in
+ *              the heap).
+ *
+ *              open_oh is a pointer to a currently open object header so
+ *              that the library doesn't try to re-protect it.  If there is
+ *              no such object header, it should be NULL.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  James Laird
+ *              December 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id,
+    void *mesg)
+{
+    const H5O_msg_class_t   *type;      /* Actual H5O class type for the ID */
+    herr_t ret_value = SUCCEED;                    /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* delete */
+    if((type->del) && (type->del)(f, dxpl_id, open_oh, mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_delete_mesg
+ *
+ * Purpose:	Internal function to:
+ *              Delete an object header message from a file.  This frees the file
+ *              space used for anything referred to in the object header message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		September 26 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_delete_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg)
+{
+    const H5O_msg_class_t *type = mesg->type;  /* Type of object to free */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(oh);
+
+    /* Check if there is a file space deletion callback for this type of message */
+    if(type->del) {
+        /* Decode the message if necessary. */
+        H5O_LOAD_NATIVE(f, dxpl_id, H5O_DECODEIO_NOCHANGE, oh, mesg, FAIL)
+
+        if((type->del)(f, dxpl_id, oh, mesg->native) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_delete_mesg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_flush
+ *
+ * Purpose:	Flushes a message for an object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May 14 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_flush(H5F_t *f, H5O_t *oh, H5O_mesg_t *mesg)
+{
+    uint8_t	*p;             /* Temporary pointer to encode with */
+    unsigned    msg_id;         /* ID for message */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Point into message's chunk's image */
+    p = mesg->raw - H5O_SIZEOF_MSGHDR_OH(oh);
+
+    /* Retrieve actual message ID, for unknown messages */
+    if(mesg->type == H5O_MSG_UNKNOWN)
+        msg_id = *(H5O_unknown_t *)(mesg->native);
+    else
+        msg_id = (uint8_t)mesg->type->id;
+
+    /* Encode the message prefix */
+    if(oh->version == H5O_VERSION_1)
+        UINT16ENCODE(p, msg_id)
+    else
+        *p++ = (uint8_t)msg_id;
+    HDassert(mesg->raw_size < H5O_MESG_MAX_SIZE);
+    UINT16ENCODE(p, mesg->raw_size);
+    *p++ = mesg->flags;
+
+    /* Only encode reserved bytes for version 1 of format */
+    if(oh->version == H5O_VERSION_1) {
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+    } /* end for */
+    /* Only encode creation index for version 2+ of format */
+    else {
+        /* Only encode creation index if they are being tracked */
+        if(oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)
+            UINT16ENCODE(p, mesg->crt_idx);
+    } /* end else */
+    HDassert(p == mesg->raw);
+
+#ifndef NDEBUG
+    /* Make certain that null messages aren't in chunks w/gaps */
+    if(H5O_NULL_ID == msg_id)
+        HDassert(oh->chunk[mesg->chunkno].gap == 0);
+    else
+        /* Non-null messages should always have a native pointer */
+        HDassert(mesg->native);
+#endif /* NDEBUG */
+
+    /* Encode the message itself, if it's not an "unknown" message */
+    if(mesg->native && mesg->type != H5O_MSG_UNKNOWN) {
+        /*
+         * Encode the message.  If the message is shared then we
+         * encode a Shared Object message instead of the object
+         * which is being shared.
+         */
+        HDassert(mesg->raw >= oh->chunk[mesg->chunkno].image);
+        HDassert(mesg->raw_size == H5O_ALIGN_OH(oh, mesg->raw_size));
+        HDassert(mesg->raw + mesg->raw_size <=
+               oh->chunk[mesg->chunkno].image + (oh->chunk[mesg->chunkno].size - H5O_SIZEOF_CHKSUM_OH(oh)));
+#ifndef NDEBUG
+/* Sanity check that the message won't overwrite past it's allocated space */
+{
+    size_t msg_size;
+
+    msg_size = mesg->type->raw_size(f, FALSE, mesg->native);
+    msg_size = H5O_ALIGN_OH(oh, msg_size);
+    HDassert(msg_size <= mesg->raw_size);
+}
+#endif /* NDEBUG */
+        HDassert(mesg->type->encode);
+        if((mesg->type->encode)(f, FALSE, mesg->raw, mesg->native) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode object header message")
+    } /* end if */
+
+    /* Mark the message as clean now */
+    mesg->dirty = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_flush_msgs
+ *
+ * Purpose:	Flushes messages for object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Nov 21 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_flush_msgs(H5F_t *f, H5O_t *oh)
+{
+    H5O_mesg_t *curr_msg;       /* Pointer to current message being operated on */
+    unsigned	u;              /* Local index variable */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Encode any dirty messages */
+    for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++)
+        if(curr_msg->dirty)
+            if(H5O_msg_flush(f, oh, curr_msg) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode object header message")
+
+    /* Sanity check for the correct # of messages in object header */
+    if(oh->nmesgs != u)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "corrupt object header - too few messages")
+
+#ifndef NDEBUG
+        /* Reset the number of messages dirtied by decoding, as they have all
+         * been flushed */
+        oh->ndecode_dirtied = 0;
+#endif /* NDEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_flush_msgs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_chunkno
+ *
+ * Purpose:	Queries the object header chunk index for a message.
+ *
+ * Return:	Success:	>=0 value indicating the chunk number for
+ *                              the message
+ *		Failure:	<0
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Apr 22 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header to use */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    H5O_mesg_t *idx_msg;                /* Pointer to message to modify */
+    unsigned idx;                       /* Index of message to modify */
+    int ret_value;                      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Locate message of correct type */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(type == idx_msg->type)
+            break;
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
+
+    /* Set return value */
+    H5_CHECKED_ASSIGN(ret_value, int, idx_msg->chunkno, unsigned);
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_get_chunkno() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_lock
+ *
+ * Purpose:	Locks a message into a particular chunk, preventing it from
+ *              being moved into another chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Apr 22 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_lock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header to use */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    H5O_mesg_t *idx_msg;                /* Pointer to message to modify */
+    unsigned idx;                       /* Index of message to modify */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Locate message of correct type */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(type == idx_msg->type)
+            break;
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
+
+    /* Fail if the message is already locked */
+    if(idx_msg->locked)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOCK, FAIL, "message already locked")
+
+    /* Make the message locked */
+    idx_msg->locked = TRUE;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_msg_unlock
+ *
+ * Purpose:	Unlocks a message, allowing it to be moved into another chunk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Apr 22 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_unlock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   /* Object header to use */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    H5O_mesg_t *idx_msg;                /* Pointer to message to modify */
+    unsigned idx;                       /* Index of message to modify */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
+    HDassert(type_id < NELMTS(H5O_msg_class_g));
+    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
+    HDassert(type);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Locate message of correct type */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(type == idx_msg->type)
+            break;
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
+
+    /* Fail if the message is not locked */
+    if(!idx_msg->locked)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTUNLOCK, FAIL, "message not locked")
+
+    /* Make the message unlocked */
+    idx_msg->locked = FALSE;
+
+done:
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_unlock() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Omtime.c b/gatb-core/thirdparty/hdf5/src/H5Omtime.c
new file mode 100644
index 0000000..fdd9a31
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Omtime.c
@@ -0,0 +1,536 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Friday, July 24, 1998
+ *
+ * Purpose:	The object modification time message.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+static void *H5O_mtime_new_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_mtime_new_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static size_t H5O_mtime_new_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+
+static void *H5O_mtime_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_mtime_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_mtime_copy(const void *_mesg, void *_dest);
+static size_t H5O_mtime_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_mtime_reset(void *_mesg);
+static herr_t H5O_mtime_free(void *_mesg);
+static herr_t H5O_mtime_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_MTIME[1] = {{
+    H5O_MTIME_ID,		/*message id number		*/
+    "mtime",			/*message name for debugging	*/
+    sizeof(time_t),		/*native message size		*/
+    0,				/* messages are sharable?       */
+    H5O_mtime_decode,		/*decode message		*/
+    H5O_mtime_encode,		/*encode message		*/
+    H5O_mtime_copy,		/*copy the native value		*/
+    H5O_mtime_size,		/*raw message size		*/
+    H5O_mtime_reset,		/* reset method			*/
+    H5O_mtime_free,		/* free method			*/
+    NULL,		        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_mtime_debug		/*debug the message		*/
+}};
+
+/* This message derives from H5O message class */
+/* (Only encode, decode & size routines are different from old mtime routines) */
+const H5O_msg_class_t H5O_MSG_MTIME_NEW[1] = {{
+    H5O_MTIME_NEW_ID,		/*message id number		*/
+    "mtime_new",		/*message name for debugging	*/
+    sizeof(time_t),		/*native message size		*/
+    0,				/* messages are sharable?       */
+    H5O_mtime_new_decode,	/*decode message		*/
+    H5O_mtime_new_encode,	/*encode message		*/
+    H5O_mtime_copy,		/*copy the native value		*/
+    H5O_mtime_new_size,		/*raw message size		*/
+    H5O_mtime_reset,		/* reset method			*/
+    H5O_mtime_free,		/* free method			*/
+    NULL,		        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_mtime_debug		/*debug the message		*/
+}};
+
+/* Current version of new mtime information */
+#define H5O_MTIME_VERSION 	1
+
+/* Track whether tzset routine was called */
+static hbool_t ntzset = FALSE;
+
+/* Declare a free list to manage the time_t struct */
+H5FL_DEFINE(time_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_new_decode
+ *
+ * Purpose:	Decode a new modification time message and return a pointer to a
+ *		new time_t value.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan  3 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    time_t	*mesg;
+    uint32_t    tmp_time;       /* Temporary copy of the time */
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    assert(f);
+    assert(p);
+
+    /* decode */
+    if(*p++ != H5O_MTIME_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for mtime message");
+
+    /* Skip reserved bytes */
+    p+=3;
+
+    /* Get the time_t from the file */
+    UINT32DECODE(p, tmp_time);
+
+    /* The return value */
+    if (NULL==(mesg = H5FL_MALLOC(time_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+    *mesg = (time_t)tmp_time;
+
+    /* Set return value */
+    ret_value=mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_mtime_new_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_decode
+ *
+ * Purpose:	Decode a modification time message and return a pointer to a
+ *		new time_t value.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 24 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    time_t	*mesg, the_time;
+    int	i;
+    struct tm	tm;
+    void        *ret_value = NULL;      /* Return value */
+#if _MSC_VER >= 1900  // VS 2015
+// In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
+// variable declared in time.h. That variable was deprecated and in VS 2015
+// is removed, with _get_timezone replacing it.
+    long timezone = 0;
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Initialize time zone information */
+    if(!ntzset) {
+        HDtzset();
+        ntzset = TRUE;
+    } /* end if */
+
+    /* decode */
+    for(i = 0; i < 14; i++)
+        if(!HDisdigit(p[i]))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "badly formatted modification time message")
+
+    /*
+     * Convert YYYYMMDDhhmmss UTC to a time_t.  This is a little problematic
+     * because mktime() operates on local times.  We convert to local time
+     * and then figure out the adjustment based on the local time zone and
+     * daylight savings setting.
+     */
+    HDmemset(&tm, 0, sizeof tm);
+    tm.tm_year = (p[0]-'0')*1000 + (p[1]-'0')*100 +
+		 (p[2]-'0')*10 + (p[3]-'0') - 1900;
+    tm.tm_mon = (p[4]-'0')*10 + (p[5]-'0') - 1;
+    tm.tm_mday = (p[6]-'0')*10 + (p[7]-'0');
+    tm.tm_hour = (p[8]-'0')*10 + (p[9]-'0');
+    tm.tm_min = (p[10]-'0')*10 + (p[11]-'0');
+    tm.tm_sec = (p[12]-'0')*10 + (p[13]-'0');
+    tm.tm_isdst = -1; /*figure it out*/
+    if((time_t)-1 == (the_time = HDmktime(&tm)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "badly formatted modification time message")
+
+#if defined(H5_HAVE_TM_GMTOFF)
+    /* BSD-like systems */
+    the_time += tm.tm_gmtoff;
+#elif defined(H5_HAVE_TIMEZONE)
+    #if _MSC_VER >= 1900  // VS 2015
+        HDget_timezone(&timezone);
+    #endif
+    /* GNU/Linux systems */
+    the_time -= timezone - (tm.tm_isdst ? 3600 : 0);
+#else
+    /*
+     * The catch-all.  If we can't convert a character string universal
+     * coordinated time to a time_t value reliably then we can't decode the
+     * modification time message. This really isn't as bad as it sounds -- the
+     * only way a user can get the modification time is from our internal
+     * query routines, which can gracefully recover.
+     */
+    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to obtain local timezone information")
+#endif
+
+    /* The return value */
+    if(NULL == (mesg = H5FL_MALLOC(time_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    *mesg = the_time;
+
+    /* Set return value */
+    ret_value = mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_mtime_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_new_encode
+ *
+ * Purpose:	Encodes a new modification time message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan  3 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_new_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const time_t	*mesg = (const time_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    assert(f);
+    assert(p);
+    assert(mesg);
+
+    /* Version */
+    *p++ = H5O_MTIME_VERSION;
+
+    /* Reserved bytes */
+    *p++ = 0;
+    *p++ = 0;
+    *p++ = 0;
+
+    /* Encode time */
+    UINT32ENCODE(p, *mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_mtime_new_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_encode
+ *
+ * Purpose:	Encodes a modification time message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const time_t	*mesg = (const time_t *) _mesg;
+    struct tm		*tm;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    assert(f);
+    assert(p);
+    assert(mesg);
+
+    /* encode */
+    tm = HDgmtime(mesg);
+    sprintf((char*)p, "%04d%02d%02d%02d%02d%02d",
+	    1900+tm->tm_year, 1+tm->tm_mon, tm->tm_mday,
+	    tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_copy(const void *_mesg, void *_dest)
+{
+    const time_t	*mesg = (const time_t *) _mesg;
+    time_t		*dest = (time_t *) _dest;
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    assert(mesg);
+    if (!dest && NULL==(dest = H5FL_MALLOC(time_t)))
+        HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+    /* copy */
+    *dest = *mesg;
+
+    /* Set return value */
+    ret_value=dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_new_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not
+ *		counting the message type or size fields, but only the data
+ *		fields.	 This function doesn't take into account
+ *		alignment.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Jan  3 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_mtime_new_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED * mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    assert(f);
+    assert(mesg);
+
+    FUNC_LEAVE_NOAPI(8)
+} /* end H5O_mtime_new_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not
+ *		counting the message type or size fields, but only the data
+ *		fields.	 This function doesn't take into account
+ *		alignment.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 14 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_mtime_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED * mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    assert(f);
+    assert(mesg);
+
+    FUNC_LEAVE_NOAPI(16)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_reset
+ *
+ * Purpose:	Frees resources within a modification time message, but doesn't free
+ *		the message itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Mondey, December 23, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_reset(void H5_ATTR_UNUSED *_mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 30, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(time_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_mtime_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_mtime_debug
+ *
+ * Purpose:	Prints debugging info for the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+		int indent, int fwidth)
+{
+    const time_t	*mesg = (const time_t *)_mesg;
+    struct tm		*tm;
+    char		buf[128];
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    assert(f);
+    assert(mesg);
+    assert(stream);
+    assert(indent >= 0);
+    assert(fwidth >= 0);
+
+    /* debug */
+    tm = HDlocaltime(mesg);
+
+    HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	    "Time:", buf);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oname.c b/gatb-core/thirdparty/hdf5/src/H5Oname.c
new file mode 100644
index 0000000..2cd9e72
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oname.c
@@ -0,0 +1,308 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Oname.c
+ *                      Aug 12 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Object name message.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_name_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_name_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_name_copy(const void *_mesg, void *_dest);
+static size_t H5O_name_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_name_reset(void *_mesg);
+static herr_t H5O_name_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_NAME[1] = {{
+    H5O_NAME_ID,            	/*message id number             */
+    "name",                 	/*message name for debugging    */
+    sizeof(H5O_name_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_name_decode,        	/*decode message                */
+    H5O_name_encode,        	/*encode message                */
+    H5O_name_copy,          	/*copy the native value         */
+    H5O_name_size,          	/*raw message size              */
+    H5O_name_reset,         	/*free internal memory          */
+    NULL,			/* free method			*/
+    NULL,		        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL,			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_name_debug         	/*debug the message             */
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_decode
+ *
+ * Purpose:     Decode a name message and return a pointer to a new
+ *              native message struct.
+ *
+ * Return:      Success:        Ptr to new message in native struct.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_name_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_name_t          *mesg;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* decode */
+    if(NULL == (mesg = (H5O_name_t *)H5MM_calloc(sizeof(H5O_name_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(NULL == (mesg->s = (char *)H5MM_strdup((const char *)p)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set return value */
+    ret_value = mesg;
+
+done:
+    if(NULL == ret_value) {
+        if(mesg)
+            mesg = (H5O_name_t *)H5MM_xfree(mesg);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_name_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_encode
+ *
+ * Purpose:     Encodes a name message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_name_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_name_t       *mesg = (const H5O_name_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg && mesg->s);
+
+    /* encode */
+    HDstrcpy((char*)p, mesg->s);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_name_copy(const void *_mesg, void *_dest)
+{
+    const H5O_name_t       *mesg = (const H5O_name_t *) _mesg;
+    H5O_name_t             *dest = (H5O_name_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(mesg);
+
+    if(!dest && NULL == (dest = (H5O_name_t *)H5MM_calloc(sizeof(H5O_name_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *mesg;
+    if(NULL == (dest->s = H5MM_xstrdup(mesg->s)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    if(NULL == ret_value)
+        if(dest && NULL == _dest)
+            dest = (H5O_name_t *)H5MM_xfree(dest);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_name_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not
+ *              counting the message typ or size fields, but only the data
+ *              fields.  This function doesn't take into account
+ *              alignment.
+ *
+ * Return:      Success:        Message data size in bytes w/o alignment.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_name_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_name_t       *mesg = (const H5O_name_t *) _mesg;
+    size_t                  ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+
+    ret_value = mesg->s ? HDstrlen(mesg->s) + 1 : 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_reset
+ *
+ * Purpose:     Frees internal pointers and resets the message to an
+ *              initial state.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_name_reset(void *_mesg)
+{
+    H5O_name_t             *mesg = (H5O_name_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(mesg);
+
+    /* reset */
+    mesg->s = (char *)H5MM_xfree(mesg->s);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_name_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_name_debug
+ *
+ * Purpose:     Prints debugging info for the message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_name_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+	       int indent, int fwidth)
+{
+    const H5O_name_t	*mesg = (const H5O_name_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    fprintf(stream, "%*s%-*s `%s'\n", indent, "", fwidth,
+            "Name:",
+            mesg->s);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
diff --git a/gatb-core/thirdparty/hdf5/src/H5Onull.c b/gatb-core/thirdparty/hdf5/src/H5Onull.c
new file mode 100644
index 0000000..a6c6524
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Onull.c
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Onull.c
+ *                      Aug  6 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             The null message.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_NULL[1] = {{
+    H5O_NULL_ID,            	/*message id number             */
+    "null",                 	/*message name for debugging    */
+    0,                      	/*native message size           */
+    0,				/* messages are sharable?       */
+    NULL,                   	/*no decode method              */
+    NULL,                   	/*no encode method              */
+    NULL,                   	/*no copy method                */
+    NULL,                   	/*no size method                */
+    NULL,                   	/*no reset method               */
+    NULL,                   	/*no free method                */
+    NULL,		    	/*no file delete method         */
+    NULL,		    	/*no link method		*/
+    NULL,	            	/*no set share method	        */
+    NULL,		    	/*no can share method		*/
+    NULL,		    	/*no pre copy native value to file */
+    NULL,		    	/*no copy native value to file  */
+    NULL,		    	/*no post copy native value to file */
+    NULL,			/*no get creation index		*/
+    NULL,			/*no set creation index		*/
+    NULL                    	/*no debug method               */
+}};
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Opkg.h b/gatb-core/thirdparty/hdf5/src/H5Opkg.h
new file mode 100644
index 0000000..2c8c5a0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Opkg.h
@@ -0,0 +1,627 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5O_PACKAGE
+#error "Do not include this file outside the H5O package!"
+#endif
+
+#ifndef _H5Opkg_H
+#define _H5Opkg_H
+
+/* Get package's private header */
+#include "H5Oprivate.h"		/* Object headers		  	*/
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5FLprivate.h"	/* Free Lists                           */
+
+/* Object header macros */
+#define H5O_NMESGS	8 		/*initial number of messages	     */
+#define H5O_NCHUNKS	2		/*initial number of chunks	     */
+#define H5O_MIN_SIZE	22		/* Min. obj header data size (must be big enough for a message prefix and a continuation message) */
+#define H5O_MSG_TYPES   24              /* # of types of messages            */
+#define H5O_MAX_CRT_ORDER_IDX 65535     /* Max. creation order index value   */
+
+/* Versions of object header structure */
+
+/* Initial version of the object header format */
+#define H5O_VERSION_1		1
+
+/* Revised version - leaves out reserved bytes and alignment padding, and adds
+ *      magic number as prefix and checksum as suffix for all chunks.
+ */
+#define H5O_VERSION_2		2
+
+/* The latest version of the format.  Look through the 'flush'
+ *      and 'size' callback for places to change when updating this. */
+#define H5O_VERSION_LATEST	H5O_VERSION_2
+
+/*
+ * Align messages on 8-byte boundaries because we would like to copy the
+ * object header chunks directly into memory and operate on them there, even
+ * on 64-bit architectures.  This allows us to reduce the number of disk I/O
+ * requests with a minimum amount of mem-to-mem copies.
+ *
+ * Note: We no longer attempt to do this. - QAK, 10/16/06
+ */
+#define H5O_ALIGN_OLD(X)	(8 * (((X) + 7) / 8))
+#define H5O_ALIGN_VERS(V, X)						      \
+    (((V) == H5O_VERSION_1) ?						      \
+		H5O_ALIGN_OLD(X)					      \
+        :								      \
+		(X)							      \
+    )
+#define H5O_ALIGN_OH(O, X)						      \
+     H5O_ALIGN_VERS((O)->version, X)
+#define H5O_ALIGN_F(F, X)						      \
+     H5O_ALIGN_VERS((H5F_USE_LATEST_FORMAT(F) ? H5O_VERSION_LATEST : H5O_VERSION_1), X)
+
+/* Size of checksum (on disk) */
+#define H5O_SIZEOF_CHKSUM               4
+
+/* ========= Object Creation properties ============ */
+/* Default values for some of the object creation properties */
+/* NOTE: The H5O_CRT_ATTR_MAX_COMPACT_DEF & H5O_CRT_ATTR_MIN_DENSE_DEF values
+ *      are "built into" the file format, make certain existing files with
+ *      default attribute phase change storage are handled correctly if they
+ *      are changed.
+ */
+#define H5O_CRT_ATTR_MAX_COMPACT_DEF    8
+#define H5O_CRT_ATTR_MIN_DENSE_DEF      6
+#define H5O_CRT_OHDR_FLAGS_DEF          H5O_HDR_STORE_TIMES
+
+/* Object header status flag definitions */
+#define H5O_HDR_CHUNK0_1                0x00    /* Use 1-byte value for chunk #0 size */
+#define H5O_HDR_CHUNK0_2                0x01    /* Use 2-byte value for chunk #0 size */
+#define H5O_HDR_CHUNK0_4                0x02    /* Use 4-byte value for chunk #0 size */
+#define H5O_HDR_CHUNK0_8                0x03    /* Use 8-byte value for chunk #0 size */
+
+/*
+ * Size of object header prefix.
+ */
+#define H5O_SIZEOF_HDR(O)						      \
+    (((O)->version == H5O_VERSION_1)  					      \
+        ?								      \
+            H5O_ALIGN_OLD(1 +	/*version number	*/		      \
+                1 +		/*reserved 		*/		      \
+                2 +		/*number of messages	*/		      \
+                4 +		/*reference count	*/		      \
+                4)		/*chunk data size	*/		      \
+        :								      \
+            (H5_SIZEOF_MAGIC +	/*magic number  	*/		      \
+                1 +		/*version number 	*/		      \
+                1 +		/*flags		 	*/		      \
+                (((O)->flags & H5O_HDR_STORE_TIMES) ? (			      \
+                  4 +		/*access time		*/		      \
+                  4 +		/*modification time	*/		      \
+                  4 +		/*change time		*/		      \
+                  4		/*birth time		*/		      \
+                ) : 0) +						      \
+                (((O)->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) ? (	      \
+                  2 +		/*max compact attributes */		      \
+                  2		/*min dense attributes	*/		      \
+                ) : 0) +						      \
+                (1 << ((O)->flags & H5O_HDR_CHUNK0_SIZE)) + /*chunk 0 data size */ \
+                H5O_SIZEOF_CHKSUM) /*checksum size	*/		      \
+    )
+
+/*
+ * Size of object header message prefix
+ */
+#define H5O_SIZEOF_MSGHDR_VERS(V,C)					      \
+    (((V) == H5O_VERSION_1)  						      \
+        ?								      \
+            H5O_ALIGN_OLD(2 +	/*message type		*/		      \
+                2 +		/*sizeof message data	*/		      \
+                1 +		/*flags              	*/		      \
+                3)		/*reserved		*/		      \
+        :								      \
+            (1 +		/*message type		*/		      \
+                2 + 		/*sizeof message data	*/		      \
+                1 +		/*flags              	*/		      \
+                ((C) ? (						      \
+                  2		/*creation index     	*/		      \
+                ) : 0))							      \
+    )
+#define H5O_SIZEOF_MSGHDR_OH(O)						      \
+    H5O_SIZEOF_MSGHDR_VERS((O)->version, (O)->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)
+#define H5O_SIZEOF_MSGHDR_F(F, C)						      \
+    H5O_SIZEOF_MSGHDR_VERS((H5F_USE_LATEST_FORMAT(F) || H5F_STORE_MSG_CRT_IDX(F)) ? H5O_VERSION_LATEST : H5O_VERSION_1, (C))
+
+/*
+ * Size of chunk "header" for each chunk
+ */
+#define H5O_SIZEOF_CHKHDR_VERS(V)					      \
+    (((V) == H5O_VERSION_1)  						      \
+        ?								      \
+            0 +		/*no magic #  */				      \
+                0 	/*no checksum */				      \
+        :								      \
+            H5_SIZEOF_MAGIC + 		/*magic #  */			      \
+                H5O_SIZEOF_CHKSUM 	/*checksum */			      \
+    )
+#define H5O_SIZEOF_CHKHDR_OH(O)						      \
+    H5O_SIZEOF_CHKHDR_VERS((O)->version)
+
+/*
+ * Size of checksum for each chunk
+ */
+#define H5O_SIZEOF_CHKSUM_VERS(V)					      \
+    (((V) == H5O_VERSION_1)  						      \
+        ?								      \
+            0 		/*no checksum */				      \
+        :								      \
+            H5O_SIZEOF_CHKSUM 		/*checksum */			      \
+    )
+#define H5O_SIZEOF_CHKSUM_OH(O)						      \
+    H5O_SIZEOF_CHKSUM_VERS((O)->version)
+
+/* Input/output flags for decode functions */
+#define H5O_DECODEIO_NOCHANGE           0x01u   /* IN: do not modify values */
+#define H5O_DECODEIO_DIRTY              0x02u   /* OUT: message has been changed */
+
+/* Macro to incremend ndecode_dirtied (only if we are debugging) */
+#ifndef NDEBUG
+#define INCR_NDECODE_DIRTIED(OH) (OH)->ndecode_dirtied++;
+#else /* NDEBUG */
+#define INCR_NDECODE_DIRTIED(OH) ;
+#endif /* NDEBUG */
+
+/* Load native information for a message, if it's not already present */
+/* (Only works for messages with decode callback) */
+#define H5O_LOAD_NATIVE(F, DXPL, IOF, OH, MSG, ERR)                           \
+    if(NULL == (MSG)->native) {                                               \
+        const H5O_msg_class_t	*msg_type = (MSG)->type;                      \
+        unsigned                ioflags = (IOF);                              \
+                                                                              \
+        /* Decode the message */                                              \
+        HDassert(msg_type->decode);                                           \
+        if(NULL == ((MSG)->native = (msg_type->decode)((F), (DXPL), (OH), (MSG)->flags, &ioflags, (MSG)->raw))) \
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, ERR, "unable to decode message") \
+                                                                              \
+        /* Mark the message dirty if it was changed by decoding */            \
+        if((ioflags & H5O_DECODEIO_DIRTY) && (H5F_get_intent((F)) & H5F_ACC_RDWR)) { \
+            (MSG)->dirty = TRUE;                                              \
+            /* Increment the count of messages dirtied by decoding, but */    \
+            /* only ifndef NDEBUG */                                          \
+            INCR_NDECODE_DIRTIED(OH)                                          \
+        }                                                                     \
+                                                                              \
+        /* Set the message's "shared info", if it's shareable */	      \
+        if((MSG)->flags & H5O_MSG_FLAG_SHAREABLE) {                           \
+            HDassert(msg_type->share_flags & H5O_SHARE_IS_SHARABLE);          \
+            H5O_UPDATE_SHARED((H5O_shared_t *)(MSG)->native, H5O_SHARE_TYPE_HERE, (F), msg_type->id, (MSG)->crt_idx, (OH)->chunk[0].addr) \
+        } /* end if */                                                        \
+                                                                              \
+        /* Set the message's "creation index", if it has one */		      \
+        if(msg_type->set_crt_index) {				      	      \
+            /* Set the creation index for the message */		      \
+            if((msg_type->set_crt_index)((MSG)->native, (MSG)->crt_idx) < 0)  \
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, ERR, "unable to set creation index") \
+        } /* end if */							      \
+    } /* end if */
+
+/* Flags for a message class's "sharability" */
+#define H5O_SHARE_IS_SHARABLE   0x01
+#define H5O_SHARE_IN_OHDR       0x02
+
+
+/* The "message class" type */
+struct H5O_msg_class_t {
+    unsigned	id;				/*message type ID on disk   */
+    const char	*name;				/*for debugging             */
+    size_t	native_size;			/*size of native message    */
+    unsigned    share_flags;			/* Message sharing settings */
+    void	*(*decode)(H5F_t *, hid_t, H5O_t *, unsigned, unsigned *, const uint8_t *);
+    herr_t	(*encode)(H5F_t *, hbool_t, uint8_t *, const void *);
+    void	*(*copy)(const void *, void *);	/*copy native value         */
+    size_t	(*raw_size)(const H5F_t *, hbool_t, const void *);/*sizeof encoded message	*/
+    herr_t	(*reset)(void *);		/*free nested data structs  */
+    herr_t	(*free)(void *);		/*free main data struct  */
+    herr_t	(*del)(H5F_t *, hid_t, H5O_t *, void *);    /* Delete space in file referenced by this message */
+    herr_t	(*link)(H5F_t *, hid_t, H5O_t *, void *);   /* Increment any links in file reference by this message */
+    herr_t	(*set_share)(void*, const H5O_shared_t*);   /* Set shared information */
+    htri_t	(*can_share)(const void *);	/* Is message allowed to be shared? */
+    herr_t	(*pre_copy_file)(H5F_t *, const void *, hbool_t *, const H5O_copy_t *, void *); /*"pre copy" action when copying native value to file */
+    void	*(*copy_file)(H5F_t *, void *, H5F_t *, hbool_t *, unsigned *, H5O_copy_t *, void *, hid_t); /*copy native value to file */
+    herr_t	(*post_copy_file)(const H5O_loc_t *, const void *, H5O_loc_t *, void *, unsigned *, hid_t, H5O_copy_t *); /*"post copy" action when copying native value to file */
+    herr_t      (*get_crt_index)(const void *, H5O_msg_crt_idx_t *);	/* Get message's creation index */
+    herr_t      (*set_crt_index)(void *, H5O_msg_crt_idx_t);	/* Set message's creation index */
+    herr_t	(*debug)(H5F_t*, hid_t, const void*, FILE*, int, int);
+};
+
+struct H5O_mesg_t {
+    const H5O_msg_class_t	*type;	/*type of message		     */
+    hbool_t		dirty;		/*raw out of date wrt native	     */
+    hbool_t		locked;		/*message is locked into chunk	     */
+    uint8_t		flags;		/*message flags			     */
+    H5O_msg_crt_idx_t   crt_idx;        /*message creation index	     */
+    unsigned		chunkno;	/*chunk number for this mesg	     */
+    void		*native;	/*native format message		     */
+    uint8_t		*raw;		/*ptr to raw data		     */
+    size_t		raw_size;	/*size with alignment		     */
+};
+
+typedef struct H5O_chunk_t {
+    haddr_t	addr;			/*chunk file address		     */
+    size_t	size;			/*chunk size			     */
+    size_t	gap;			/*space at end of chunk too small for null message */
+    uint8_t	*image;			/*image of file			     */
+} H5O_chunk_t;
+
+struct H5O_t {
+    H5AC_info_t cache_info; /* Information for metadata cache functions, _must_ be */
+                            /* first field in structure */
+
+    /* File-specific information (not stored) */
+    size_t      sizeof_size;            /* Size of file sizes 		     */
+    size_t      sizeof_addr;            /* Size of file addresses	     */
+
+    /* Debugging information (not stored) */
+#ifdef H5O_ENABLE_BAD_MESG_COUNT
+    hbool_t     store_bad_mesg_count;   /* Flag to indicate that a bad message count should be stored */
+                                        /* (This is to simulate a bug in earlier
+                                         *      versions of the library)
+                                         */
+#endif /* H5O_ENABLE_BAD_MESG_COUNT */
+#ifndef NDEBUG
+    size_t      ndecode_dirtied;        /* Number of messages dirtied by decoding */
+#endif /* NDEBUG */
+
+    /* Chunk management information (not stored) */
+    size_t      rc;                     /* Reference count of [continuation] chunks using this structure */
+    size_t      chunk0_size;            /* Size of serialized first chunk    */
+    hbool_t     mesgs_modified;         /* Whether any messages were modified when the object header was deserialized */
+    hbool_t     prefix_modified;        /* Whether prefix was modified when the object header was deserialized */
+
+    /* Object information (stored) */
+    hbool_t     has_refcount_msg;       /* Whether the object has a ref. count message */
+    unsigned	nlink;			/*link count			     */
+    uint8_t	version;		/*version number		     */
+    uint8_t	flags;			/*flags				     */
+
+    /* Time information (stored, for versions > 1 & H5O_HDR_STORE_TIMES flag set) */
+    time_t      atime;                  /*access time 			     */
+    time_t      mtime;                  /*modification time 		     */
+    time_t      ctime;                  /*change time 			     */
+    time_t      btime;                  /*birth time 			     */
+
+    /* Attribute information (stored, for versions > 1) */
+    unsigned	max_compact;		/* Maximum # of compact attributes   */
+    unsigned	min_dense;		/* Minimum # of "dense" attributes   */
+
+    /* Message management (stored, encoded in chunks) */
+    size_t	nmesgs;			/*number of messages		     */
+    size_t	alloc_nmesgs;		/*number of message slots	     */
+    H5O_mesg_t	*mesg;			/*array of messages		     */
+    size_t      link_msgs_seen;         /* # of link messages seen when loading header */
+    size_t      attr_msgs_seen;         /* # of attribute messages seen when loading header */
+
+    /* Chunk management (not stored) */
+    size_t	nchunks;		/*number of chunks		     */
+    size_t	alloc_nchunks;		/*chunks allocated		     */
+    H5O_chunk_t *chunk;			/*array of chunks		     */
+};
+
+/* Class for types of objects in file */
+typedef struct H5O_obj_class_t {
+    H5O_type_t	type;				/*object type on disk	     */
+    const char	*name;				/*for debugging		     */
+    void       *(*get_copy_file_udata)(void);	/*retrieve user data for 'copy file' operation */
+    void	(*free_copy_file_udata)(void *); /*free user data for 'copy file' operation */
+    htri_t	(*isa)(H5O_t *);		/*if a header matches an object class */
+    hid_t	(*open)(const H5G_loc_t *, hid_t, hid_t, hbool_t );	/*open an object of this class */
+    void	*(*create)(H5F_t *, void *, H5G_loc_t *, hid_t );	/*create an object of this class */
+    H5O_loc_t	*(*get_oloc)(hid_t );		/*get the object header location for an object */
+    herr_t      (*bh_info)(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info); /*get the index & heap info for an object */
+    herr_t      (*flush)(H5G_loc_t *loc, hid_t dxpl_id); 		/*flush an opened object of this class */
+} H5O_obj_class_t;
+
+/* Node in skip list to map addresses from one file to another during object header copy */
+typedef struct H5O_addr_map_t {
+    H5_obj_t    src_obj_pos;            /* Location of source object */
+    haddr_t     dst_addr;               /* Address of object in destination file */
+    hbool_t     is_locked;              /* Indicate that the destination object is locked currently */
+    hsize_t     inc_ref_count;          /* Number of deferred increments to reference count */
+    const H5O_obj_class_t *obj_class;   /* Object class */
+    void        *udata;                 /* Object class copy file udata */
+} H5O_addr_map_t;
+
+/* Stack of continuation messages to interpret */
+typedef struct H5O_cont_msgs_t {
+    size_t      nmsgs;                  /* Number of continuation messages found so far */
+    size_t	alloc_nmsgs;		/* Continuation messages allocated */
+    H5O_cont_t *msgs;			/* Array of continuation messages */
+} H5O_cont_msgs_t;
+
+/* Common callback information for loading object header prefix from disk */
+typedef struct H5O_common_cache_ud_t {
+    H5F_t *f;                           /* Pointer to file for object header/chunk */
+    hid_t dxpl_id;                      /* DXPL for operation */
+    unsigned file_intent;               /* Read/write intent for file */
+    unsigned merged_null_msgs;          /* Number of null messages merged together */
+    hbool_t mesgs_modified;             /* Whether any messages were modified when the object header was deserialized */
+    H5O_cont_msgs_t *cont_msg_info;     /* Pointer to continuation messages to work on */
+    haddr_t addr;                       /* Address of the prefix or chunk */
+} H5O_common_cache_ud_t;
+
+/* Callback information for loading object header prefix from disk */
+typedef struct H5O_cache_ud_t {
+    hbool_t made_attempt;               /* Whether the deserialize routine was already attempted */
+    unsigned v1_pfx_nmesgs;             /* Number of messages from v1 prefix header */
+    H5O_common_cache_ud_t common;       /* Common object header cache callback info */
+} H5O_cache_ud_t;
+
+/* Structure representing each chunk in the cache */
+typedef struct H5O_chunk_proxy_t {
+    H5AC_info_t cache_info;    /* Information for metadata cache functions, _must_ be */
+                                /* first field in structure */
+
+    H5O_t       *oh;                    /* Object header for this chunk */
+    unsigned    chunkno;                /* Chunk number for this chunk */
+} H5O_chunk_proxy_t;
+
+/* Callback information for loading object header chunk from disk */
+typedef struct H5O_chk_cache_ud_t {
+    hbool_t decoding;                   /* Whether the object header is being decoded */
+    H5O_t *oh;                          /* Object header for this chunk */
+    unsigned chunkno;                   /* Index of chunk being brought in (for re-loads) */
+    size_t size;                        /* Size of chunk in the file */
+    H5O_common_cache_ud_t common;       /* Common object header cache callback info */
+} H5O_chk_cache_ud_t;
+
+
+/* H5O object header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_OHDR[1];
+
+/* H5O object header chunk inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_OHDR_CHK[1];
+
+/* Header message ID to class mapping */
+H5_DLLVAR const H5O_msg_class_t *const H5O_msg_class_g[H5O_MSG_TYPES];
+
+/* Declare external the free list for H5O_t's */
+H5FL_EXTERN(H5O_t);
+
+/* Declare external the free list for H5O_mesg_t sequences */
+H5FL_SEQ_EXTERN(H5O_mesg_t);
+
+/* Declare external the free list for H5O_chunk_t sequences */
+H5FL_SEQ_EXTERN(H5O_chunk_t);
+
+/* Declare external the free list for chunk_image blocks */
+H5FL_BLK_EXTERN(chunk_image);
+
+/*
+ * Object header messages
+ */
+
+/* Null Message. (0x0000) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_NULL[1];
+
+/* Simple Dataspace Message. (0x0001) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_SDSPACE[1];
+
+/* Link Information Message. (0x0002) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_LINFO[1];
+
+/* Datatype Message. (0x0003) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_DTYPE[1];
+
+/* Old Fill Value Message. (0x0004) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_FILL[1];
+
+/* New Fill Value Message. (0x0005) */
+/*
+ * The new fill value message is fill value plus
+ * space allocation time and fill value writing time and whether fill
+ * value is defined.
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_FILL_NEW[1];
+
+/* Link Message. (0x0006) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_LINK[1];
+
+/* External File List Message. (0x0007) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_EFL[1];
+
+/* Data Layout Message. (0x0008) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_LAYOUT[1];
+
+#ifdef H5O_ENABLE_BOGUS
+/* "Bogus" Message. (0x0009) */
+/*
+ * Used for debugging - should never be found in valid HDF5 file.
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_BOGUS[1];
+#endif /* H5O_ENABLE_BOGUS */
+
+/* Group Information Message. (0x000a) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_GINFO[1];
+
+/* Filter pipeline message. (0x000b) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_PLINE[1];
+
+/* Attribute Message. (0x000c) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_ATTR[1];
+
+/* Object name message. (0x000d) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_NAME[1];
+
+/* Modification Time Message. (0x000e) */
+/*
+ * The message is just a `time_t'.
+ * (See also the "new" modification time message)
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_MTIME[1];
+
+/* Shared Message information message (0x000f)
+ * A message for the superblock extension, holding information about
+ * the file-wide shared message "SOHM" table
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_SHMESG[1];
+
+/* Object Header Continuation Message. (0x0010) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_CONT[1];
+
+/* Symbol Table Message. (0x0011) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_STAB[1];
+
+/* New Modification Time Message. (0x0012) */
+/*
+ * The message is just a `time_t'.
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_MTIME_NEW[1];
+
+/* v1 B-tree 'K' value message (0x0013)
+ * A message for the superblock extension, holding information about
+ * the file-wide v1 B-tree 'K' values.
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_BTREEK[1];
+
+/* Driver info message (0x0014)
+ * A message for the superblock extension, holding information about
+ * the file driver settings
+ */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_DRVINFO[1];
+
+/* Attribute Information Message. (0x0015) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_AINFO[1];
+
+/* Reference Count Message. (0x0016) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_REFCOUNT[1];
+
+/* Placeholder for unknown message. (0x0017) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_UNKNOWN[1];
+
+
+/*
+ * Object header "object" types
+ */
+
+/* Group Object. (H5O_TYPE_GROUP - 0) */
+H5_DLLVAR const H5O_obj_class_t H5O_OBJ_GROUP[1];
+
+/* Dataset Object. (H5O_TYPE_DATASET - 1) */
+H5_DLLVAR const H5O_obj_class_t H5O_OBJ_DATASET[1];
+
+/* Datatype Object. (H5O_TYPE_NAMED_DATATYPE - 2) */
+H5_DLLVAR const H5O_obj_class_t H5O_OBJ_DATATYPE[1];
+
+
+/* Package-local function prototypes */
+H5_DLL herr_t H5O_msg_flush(H5F_t *f, H5O_t *oh, H5O_mesg_t *mesg);
+H5_DLL herr_t H5O_flush_msgs(H5F_t *f, H5O_t *oh);
+H5_DLL hid_t H5O_open_by_loc(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t app_ref);
+H5_DLL herr_t H5O_delete_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_mesg_t *mesg);
+H5_DLL const H5O_obj_class_t * H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id);
+H5_DLL int H5O_link_oh(H5F_t *f, int adjust, hid_t dxpl_id, H5O_t *oh, hbool_t *deleted);
+H5_DLL herr_t H5O_inc_rc(H5O_t *oh);
+H5_DLL herr_t H5O_dec_rc(H5O_t *oh);
+H5_DLL herr_t H5O_free(H5O_t *oh);
+
+/* Object header message routines */
+H5_DLL herr_t H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    const H5O_msg_class_t *type, unsigned *mesg_flags, void *mesg,
+    size_t *mesg_idx);
+H5_DLL herr_t H5O_msg_append_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    const H5O_msg_class_t *type, unsigned mesg_flags, unsigned update_flags,
+    void *mesg);
+H5_DLL herr_t H5O_msg_write_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    const H5O_msg_class_t *type, unsigned mesg_flags, unsigned update_flags,
+    void *mesg);
+H5_DLL void *H5O_msg_free_real(const H5O_msg_class_t *type, void *mesg);
+H5_DLL herr_t H5O_msg_free_mesg(H5O_mesg_t *mesg);
+H5_DLL unsigned H5O_msg_count_real(const H5O_t *oh, const H5O_msg_class_t *type);
+H5_DLL herr_t H5O_msg_remove_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
+    int sequence, H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
+H5_DLL void *H5O_msg_copy_file(const H5O_msg_class_t *type, H5F_t *file_src,
+    void *mesg_src, H5F_t *file_dst, hbool_t *recompute_size,
+    unsigned *mesg_flags, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
+    const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id);
+
+/* Object header chunk routines */
+H5_DLL herr_t H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
+H5_DLL H5O_chunk_proxy_t *H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    unsigned idx);
+H5_DLL herr_t H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id,
+    H5O_chunk_proxy_t *chk_proxy, hbool_t chk_dirtied);
+H5_DLL herr_t H5O_chunk_update_idx(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
+H5_DLL herr_t H5O_chunk_resize(H5O_t *oh, H5O_chunk_proxy_t *chk_proxy);
+H5_DLL herr_t H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
+
+/* Collect storage info for btree and heap */
+H5_DLL herr_t H5O_attr_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5_ih_info_t *bh_info);
+
+/* Object header allocation routines */
+H5_DLL herr_t H5O_alloc_msgs(H5O_t *oh, size_t min_alloc);
+H5_DLL herr_t  H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    const H5O_msg_class_t *type, const void *mesg, size_t *mesg_idx);
+H5_DLL herr_t H5O_condense_header(H5F_t *f, H5O_t *oh, hid_t dxpl_id);
+H5_DLL herr_t H5O_release_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    H5O_mesg_t *mesg, hbool_t adj_link);
+
+/* Shared object operators */
+H5_DLL void * H5O_shared_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned *ioflags, const uint8_t *buf, const H5O_msg_class_t *type);
+H5_DLL herr_t H5O_shared_encode(const H5F_t *f, uint8_t *buf/*out*/, const H5O_shared_t *sh_mesg);
+H5_DLL size_t H5O_shared_size(const H5F_t *f, const H5O_shared_t *sh_mesg);
+H5_DLL herr_t H5O_shared_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    const H5O_msg_class_t *mesg_type, H5O_shared_t *sh_mesg);
+H5_DLL herr_t H5O_shared_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    const H5O_msg_class_t *mesg_type, H5O_shared_t *sh_mesg);
+H5_DLL herr_t H5O_shared_copy_file(H5F_t *file_src, H5F_t *file_dst,
+    const H5O_msg_class_t *mesg_type, const void *_native_src, void *_native_dst,
+    hbool_t *recompute_size, unsigned *mesg_flags, H5O_copy_t *cpy_info,
+    void *udata, hid_t dxpl_id);
+H5_DLL herr_t H5O_shared_post_copy_file (H5F_t *f,
+    const H5O_msg_class_t *mesg_type, const H5O_shared_t *shared_src,
+    H5O_shared_t *shared_dst, unsigned *mesg_flags, hid_t dxpl_id,
+    H5O_copy_t *cpy_info);
+H5_DLL herr_t H5O_shared_debug(const H5O_shared_t *mesg, FILE *stream,
+    int indent, int fwidth);
+
+/* Attribute message operators */
+H5_DLL herr_t H5O_attr_reset(void *_mesg);
+H5_DLL herr_t H5O_attr_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg);
+H5_DLL herr_t H5O_attr_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg);
+H5_DLL herr_t H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    hsize_t *nattrs);
+
+
+/* These functions operate on object locations */
+H5_DLL H5O_loc_t *H5O_get_loc(hid_t id);
+
+/* Testing functions */
+#ifdef H5O_TESTING
+H5_DLL htri_t H5O_is_attr_empty_test(hid_t oid);
+H5_DLL htri_t H5O_is_attr_dense_test(hid_t oid);
+H5_DLL herr_t H5O_num_attrs_test(hid_t oid, hsize_t *nattrs);
+H5_DLL herr_t H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count);
+H5_DLL herr_t H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val);
+H5_DLL herr_t H5O_expunge_chunks_test(const H5O_loc_t *oloc, hid_t dxpl_id);
+H5_DLL herr_t H5O_get_rc(const H5O_loc_t *oloc, hid_t dxpl_id, unsigned *rc);
+#endif /* H5O_TESTING */
+
+/* Object header debugging routines */
+#ifdef H5O_DEBUG
+H5_DLL herr_t H5O_assert(const H5O_t *oh);
+#endif /* H5O_DEBUG */
+H5_DLL herr_t H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, int indent, int fwidth);
+
+#endif /* _H5Opkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Opline.c b/gatb-core/thirdparty/hdf5/src/H5Opline.c
new file mode 100644
index 0000000..b79a73c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Opline.c
@@ -0,0 +1,692 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Wednesday, April 15, 1998
+ *
+ * Purpose:	Data filter pipeline message.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5O_pline_encode(H5F_t *f, uint8_t *p, const void *mesg);
+static void *H5O_pline_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static void *H5O_pline_copy(const void *_mesg, void *_dest);
+static size_t H5O_pline_size(const H5F_t *f, const void *_mesg);
+static herr_t H5O_pline_reset(void *_mesg);
+static herr_t H5O_pline_free(void *_mesg);
+static herr_t H5O_pline_pre_copy_file(H5F_t *file_src,
+    const void *mesg_src, hbool_t *deleted, const H5O_copy_t *cpy_info, void *_udata);
+static herr_t H5O_pline_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
+
+/* Set up & include shared message "interface" info */
+#define H5O_SHARED_TYPE			H5O_MSG_PLINE
+#define H5O_SHARED_DECODE		H5O_pline_shared_decode
+#define H5O_SHARED_DECODE_REAL		H5O_pline_decode
+#define H5O_SHARED_ENCODE		H5O_pline_shared_encode
+#define H5O_SHARED_ENCODE_REAL		H5O_pline_encode
+#define H5O_SHARED_SIZE			H5O_pline_shared_size
+#define H5O_SHARED_SIZE_REAL		H5O_pline_size
+#define H5O_SHARED_DELETE		H5O_pline_shared_delete
+#undef H5O_SHARED_DELETE_REAL
+#define H5O_SHARED_LINK			H5O_pline_shared_link
+#undef H5O_SHARED_LINK_REAL
+#define H5O_SHARED_COPY_FILE		H5O_pline_shared_copy_file
+#undef H5O_SHARED_COPY_FILE_REAL
+#define H5O_SHARED_POST_COPY_FILE	H5O_pline_shared_post_copy_file
+#undef H5O_SHARED_POST_COPY_FILE_REAL
+#undef  H5O_SHARED_POST_COPY_FILE_UPD
+#define H5O_SHARED_DEBUG		H5O_pline_shared_debug
+#define H5O_SHARED_DEBUG_REAL		H5O_pline_debug
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_PLINE[1] = {{
+    H5O_PLINE_ID,		/* message id number		*/
+    "filter pipeline",		/* message name for debugging	*/
+    sizeof(H5O_pline_t),	/* native message size		*/
+    H5O_SHARE_IS_SHARABLE|H5O_SHARE_IN_OHDR,	/* messages are sharable?       */
+    H5O_pline_shared_decode,	/* decode message		*/
+    H5O_pline_shared_encode,	/* encode message		*/
+    H5O_pline_copy,		/* copy the native value	*/
+    H5O_pline_shared_size,	/* size of raw message		*/
+    H5O_pline_reset,		/* reset method			*/
+    H5O_pline_free,		/* free method			*/
+    H5O_pline_shared_delete,    /* file delete method		*/
+    H5O_pline_shared_link,	/* link method			*/
+    NULL,			/* set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_pline_pre_copy_file,	/* pre copy native value to file */
+    H5O_pline_shared_copy_file,	/* copy native value to file    */
+    H5O_pline_shared_post_copy_file,	/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_pline_shared_debug	/* debug the message		*/
+}};
+
+
+/* Declare a free list to manage the H5O_pline_t struct */
+H5FL_DEFINE(H5O_pline_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_decode
+ *
+ * Purpose:	Decodes a filter pipeline message.
+ *
+ * Return:	Success:	Ptr to the native message.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_pline_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_pline_t		*pline = NULL;          /* Pipeline message */
+    H5Z_filter_info_t   *filter;                /* Filter to decode */
+    size_t		name_length;            /* Length of filter name */
+    size_t		i;                      /* Local index variable */
+    void		*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(p);
+
+    /* Allocate space for I/O pipeline message */
+    if(NULL == (pline = H5FL_CALLOC(H5O_pline_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Version */
+    pline->version = *p++;
+    if(pline->version < H5O_PLINE_VERSION_1 || pline->version > H5O_PLINE_VERSION_LATEST)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTLOAD, NULL, "bad version number for filter pipeline message")
+
+    /* Number of filters */
+    pline->nused = *p++;
+    if(pline->nused > H5Z_MAX_NFILTERS)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTLOAD, NULL, "filter pipeline message has too many filters")
+
+    /* Reserved */
+    if(pline->version == H5O_PLINE_VERSION_1)
+        p += 6;
+
+    /* Allocate array for filters */
+    pline->nalloc = pline->nused;
+    if(NULL == (pline->filter = (H5Z_filter_info_t *)H5MM_calloc(pline->nalloc * sizeof(pline->filter[0]))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Decode filters */
+    for(i = 0, filter = &pline->filter[0]; i < pline->nused; i++, filter++) {
+        /* Filter ID */
+	UINT16DECODE(p, filter->id);
+
+        /* Length of filter name */
+        if(pline->version > H5O_PLINE_VERSION_1 && filter->id < H5Z_FILTER_RESERVED)
+            name_length = 0;
+        else {
+            UINT16DECODE(p, name_length);
+            if(pline->version == H5O_PLINE_VERSION_1 && name_length % 8)
+                HGOTO_ERROR(H5E_PLINE, H5E_CANTLOAD, NULL, "filter name length is not a multiple of eight")
+        } /* end if */
+
+        /* Filter flags */
+	UINT16DECODE(p, filter->flags);
+
+        /* Number of filter parameters ("client data elements") */
+	UINT16DECODE(p, filter->cd_nelmts);
+
+        /* Filter name, if there is one */
+	if(name_length) {
+            size_t actual_name_length;          /* Actual length of name */
+
+            /* Determine actual name length (without padding, but with null terminator) */
+	    actual_name_length = HDstrlen((const char *)p) + 1;
+	    HDassert(actual_name_length <= name_length);
+
+            /* Allocate space for the filter name, or use the internal buffer */
+            if(actual_name_length > H5Z_COMMON_NAME_LEN) {
+                filter->name = (char *)H5MM_malloc(actual_name_length);
+                if(NULL == filter->name)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for filter name")
+            } /* end if */
+            else
+                filter->name = filter->_name;
+
+	    HDstrncpy(filter->name, (const char *)p, actual_name_length);
+	    p += name_length;
+	} /* end if */
+
+        /* Filter parameters */
+	if(filter->cd_nelmts) {
+            size_t	j;              /* Local index variable */
+
+            /* Allocate space for the client data elements, or use the internal buffer */
+            if(filter->cd_nelmts > H5Z_COMMON_CD_VALUES) {
+                filter->cd_values = (unsigned *)H5MM_malloc(filter->cd_nelmts * sizeof(unsigned));
+                if(NULL == filter->cd_values)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for client data")
+            } /* end if */
+            else
+                filter->cd_values = filter->_cd_values;
+
+	    /*
+	     * Read the client data values and the padding
+	     */
+	    for(j = 0; j < filter->cd_nelmts; j++)
+		UINT32DECODE(p, filter->cd_values[j]);
+            if(pline->version == H5O_PLINE_VERSION_1)
+                if(filter->cd_nelmts % 2)
+                    p += 4; /*padding*/
+	} /* end if */
+    } /* end for */
+
+    /* Set return value */
+    ret_value = pline;
+
+done:
+    if(NULL == ret_value && pline) {
+        H5O_pline_reset(pline);
+        H5O_pline_free(pline);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pline_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_encode
+ *
+ * Purpose:	Encodes message MESG into buffer P.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_pline_encode(H5F_t H5_ATTR_UNUSED *f, uint8_t *p/*out*/, const void *mesg)
+{
+    const H5O_pline_t	*pline = (const H5O_pline_t*)mesg;      /* Pipeline message to encode */
+    const       H5Z_filter_info_t *filter;      /* Filter to encode */
+    size_t	i, j;                   /* Local index variables */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(p);
+    HDassert(mesg);
+
+    /* Message header */
+    *p++ = (uint8_t)pline->version;
+    *p++ = (uint8_t)(pline->nused);
+    if(pline->version == H5O_PLINE_VERSION_1) {
+        *p++ = 0;	/*reserved 1*/
+        *p++ = 0;	/*reserved 2*/
+        *p++ = 0;	/*reserved 3*/
+        *p++ = 0;	/*reserved 4*/
+        *p++ = 0;	/*reserved 5*/
+        *p++ = 0;	/*reserved 6*/
+    } /* end if */
+
+    /* Encode filters */
+    for(i = 0, filter = &pline->filter[0]; i < pline->nused; i++, filter++) {
+        const char	*name;                  /* Filter name */
+        size_t		name_length;            /* Length of filter name */
+
+        /* Filter ID */
+	UINT16ENCODE(p, filter->id);
+
+        /* Skip writing the name length & name if the filter is an internal filter */
+        if(pline->version > H5O_PLINE_VERSION_1 && filter->id < H5Z_FILTER_RESERVED) {
+            name_length = 0;
+            name = NULL;
+        } /* end if */
+        else {
+            H5Z_class2_t	*cls;                   /* Filter class */
+
+            /*
+             * Get the filter name.  If the pipeline message has a name in it then
+             * use that one.  Otherwise try to look up the filter and get the name
+             * as it was registered.
+             */
+            if(NULL == (name = filter->name) && (cls = H5Z_find(filter->id)))
+                name = cls->name;
+            name_length = name ? HDstrlen(name) + 1 : 0;
+
+            /* Filter name length */
+            UINT16ENCODE(p, pline->version == H5O_PLINE_VERSION_1 ? H5O_ALIGN_OLD(name_length) : name_length);
+        } /* end else */
+
+        /* Filter flags */
+	UINT16ENCODE(p, filter->flags);
+
+        /* # of filter parameters */
+	UINT16ENCODE(p, filter->cd_nelmts);
+
+        /* Encode name, if there is one to encode */
+	if(name_length > 0) {
+            /* Store name, with null terminator */
+	    HDmemcpy(p, name, name_length);
+	    p += name_length;
+
+            /* Pad out name to alignment, in older versions */
+            if(pline->version == H5O_PLINE_VERSION_1)
+                while(name_length++ % 8)
+                    *p++ = 0;
+	} /* end if */
+
+        /* Filter parameters */
+	for(j = 0; j < filter->cd_nelmts; j++)
+	    UINT32ENCODE(p, filter->cd_values[j]);
+
+        /* Align the parameters for older versions of the format */
+        if(pline->version == H5O_PLINE_VERSION_1)
+            if(filter->cd_nelmts % 2)
+                UINT32ENCODE(p, 0);
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_pline_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_copy
+ *
+ * Purpose:	Copies a filter pipeline message from SRC to DST allocating
+ *		DST if necessary.  If DST is already allocated then we assume
+ *		that it isn't initialized.
+ *
+ * Return:	Success:	Ptr to DST or allocated result.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_pline_copy(const void *_src, void *_dst/*out*/)
+{
+    const H5O_pline_t	*src = (const H5O_pline_t *)_src;       /* Source pipeline message */
+    H5O_pline_t		*dst = (H5O_pline_t *)_dst;             /* Destination pipeline message */
+    size_t		i;                      /* Local index variable */
+    H5O_pline_t		*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate pipeline message, if not provided */
+    if(!dst && NULL == (dst = H5FL_MALLOC(H5O_pline_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Shallow copy basic fields */
+    *dst = *src;
+
+    /* Copy over filters, if any */
+    dst->nalloc = dst->nused;
+    if(dst->nalloc) {
+        /* Allocate array to hold filters */
+	if(NULL == (dst->filter = (H5Z_filter_info_t *)H5MM_calloc(dst->nalloc * sizeof(dst->filter[0]))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Deep-copy filters */
+        for(i = 0; i < src->nused; i++) {
+            /* Basic filter information */
+            dst->filter[i] = src->filter[i];
+
+            /* Filter name */
+            if(src->filter[i].name) {
+                size_t namelen;         /* Length of source filter name, including null terminator  */
+
+                namelen = HDstrlen(src->filter[i].name) + 1;
+
+                /* Allocate space for the filter name, or use the internal buffer */
+                if(namelen > H5Z_COMMON_NAME_LEN) {
+                    dst->filter[i].name = (char *)H5MM_strdup(src->filter[i].name);
+                    if(NULL == dst->filter[i].name)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for filter name")
+                } /* end if */
+                else
+                    dst->filter[i].name = dst->filter[i]._name;
+            } /* end if */
+
+            /* Filter parameters */
+            if(src->filter[i].cd_nelmts > 0) {
+                /* Allocate space for the client data elements, or use the internal buffer */
+                if(src->filter[i].cd_nelmts > H5Z_COMMON_CD_VALUES) {
+                    if(NULL == (dst->filter[i].cd_values = (unsigned *)H5MM_malloc(src->filter[i].cd_nelmts* sizeof(unsigned))))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+                    HDmemcpy(dst->filter[i].cd_values, src->filter[i].cd_values,
+                            src->filter[i].cd_nelmts * sizeof(unsigned));
+                } /* end if */
+                else
+                    dst->filter[i].cd_values = dst->filter[i]._cd_values;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+    else
+	dst->filter = NULL;
+
+    /* Set return value */
+    ret_value = dst;
+
+done:
+    if(!ret_value && dst) {
+        H5O_pline_reset(dst);
+	if(!_dst)
+            H5O_pline_free(dst);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pline_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_size
+ *
+ * Purpose:	Determines the size of a raw filter pipeline message.
+ *
+ * Return:	Success:	Size of message.
+ *
+ *		Failure:	zero
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_pline_size(const H5F_t H5_ATTR_UNUSED *f, const void *mesg)
+{
+    const H5O_pline_t	*pline = (const H5O_pline_t*)mesg;      /* Pipeline message */
+    size_t i;                   /* Local index variable */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Message header */
+    ret_value = 1 +			/*version			*/
+	   1 +				/*number of filters		*/
+	   (pline->version == H5O_PLINE_VERSION_1 ? 6 : 0);	/*reserved			*/
+
+    /* Calculate size of each filter in pipeline */
+    for(i = 0; i < pline->nused; i++) {
+        size_t	name_len;               /* Length of filter name */
+        const char *name;               /* Filter name */
+
+        /* Don't write the name length & name if the filter is an internal filter */
+        if(pline->version > H5O_PLINE_VERSION_1 && pline->filter[i].id < H5Z_FILTER_RESERVED)
+            name_len = 0;
+        else {
+            H5Z_class2_t	*cls;                   /* Filter class */
+
+            /* Get the name of the filter, same as done with H5O_pline_encode() */
+            if(NULL == (name = pline->filter[i].name) && (cls = H5Z_find(pline->filter[i].id)))
+                name = cls->name;
+            name_len = name ? HDstrlen(name) + 1 : 0;
+        } /* end else */
+
+	ret_value += 2 +			/*filter identification number	*/
+		(size_t)((pline->version == H5O_PLINE_VERSION_1 || pline->filter[i].id >= H5Z_FILTER_RESERVED) ? 2 : 0) +				/*name length			*/
+		2 +				/*flags				*/
+		2 +				/*number of client data values	*/
+		(pline->version == H5O_PLINE_VERSION_1 ? (size_t)H5O_ALIGN_OLD(name_len) : name_len);	/*length of the filter name	*/
+
+	ret_value += pline->filter[i].cd_nelmts * 4;
+        if(pline->version == H5O_PLINE_VERSION_1)
+            if(pline->filter[i].cd_nelmts % 2)
+                ret_value += 4;
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pline_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_reset
+ *
+ * Purpose:	Resets a filter pipeline message by clearing all filters.
+ *		The MESG buffer is not freed.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_pline_reset(void *mesg)
+{
+    H5O_pline_t	*pline = (H5O_pline_t*)mesg;    /* Pipeline message */
+    size_t	i;                              /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pline);
+
+    /* Free information for each filter */
+    for(i = 0; i < pline->nused; i++) {
+        if(pline->filter[i].name && pline->filter[i].name != pline->filter[i]._name)
+            HDassert((HDstrlen(pline->filter[i].name) + 1) > H5Z_COMMON_NAME_LEN);
+        if(pline->filter[i].name != pline->filter[i]._name)
+            pline->filter[i].name = (char *)H5MM_xfree(pline->filter[i].name);
+        if(pline->filter[i].cd_values && pline->filter[i].cd_values != pline->filter[i]._cd_values)
+            HDassert(pline->filter[i].cd_nelmts > H5Z_COMMON_CD_VALUES);
+        if(pline->filter[i].cd_values != pline->filter[i]._cd_values)
+            pline->filter[i].cd_values = (unsigned *)H5MM_xfree(pline->filter[i].cd_values);
+    } /* end for */
+
+    /* Free filter array */
+    if(pline->filter)
+        pline->filter = (H5Z_filter_info_t *)H5MM_xfree(pline->filter);
+
+    /* Reset # of filters */
+    pline->nused = pline->nalloc = 0;
+
+    /* Reset version # of pipeline message */
+    pline->version = H5O_PLINE_VERSION_1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_pline_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 11, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_pline_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_pline_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_pline_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_pline_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files
+ *
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Peter Cao
+ *              December 27, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_pline_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void *mesg_src,
+    hbool_t H5_ATTR_UNUSED *deleted, const H5O_copy_t H5_ATTR_UNUSED *cpy_info, void *_udata)
+{
+    const H5O_pline_t *pline_src = (const H5O_pline_t *)mesg_src;    /* Source datatype */
+    H5O_copy_file_ud_common_t *udata = (H5O_copy_file_ud_common_t *)_udata; /* Object copying user data */
+    herr_t             ret_value = SUCCEED;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(pline_src);
+
+    /* If the user data is non-NULL, assume we are copying a dataset or group
+     * and make a copy of the filter pipeline for later in
+     * the object copying process.
+     */
+    if(udata)
+        if(NULL == (udata->src_pline = (H5O_pline_t *)H5O_pline_copy(pline_src, NULL)))
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to copy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pline_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_pline_debug
+ *
+ * Purpose:	Prints debugging information for filter pipeline message MESG
+ *		on output stream STREAM.  Each line is indented INDENT
+ *		characters and the field name takes up FWIDTH characters.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_pline_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *mesg, FILE *stream,
+		int indent, int fwidth)
+{
+    const H5O_pline_t	*pline = (const H5O_pline_t *)mesg;
+    size_t		i, j;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(pline);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %Zu/%Zu\n", indent, "", fwidth,
+	    "Number of filters:",
+	    pline->nused,
+	    pline->nalloc);
+
+    /* Loop over all the filters */
+    for(i = 0; i < pline->nused; i++) {
+	char		name[32];
+
+	HDsnprintf(name, sizeof(name), "Filter at position %u", (unsigned)i);
+	HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth, name);
+	HDfprintf(stream, "%*s%-*s 0x%04x\n", indent + 3, "", MAX(0, fwidth - 3),
+		"Filter identification:",
+		(unsigned)(pline->filter[i].id));
+	if(pline->filter[i].name)
+	    HDfprintf(stream, "%*s%-*s \"%s\"\n", indent + 3, "", MAX(0, fwidth - 3),
+		    "Filter name:",
+		    pline->filter[i].name);
+	else
+	    HDfprintf(stream, "%*s%-*s NONE\n", indent + 3, "", MAX(0, fwidth - 3),
+		    "Filter name:");
+	HDfprintf(stream, "%*s%-*s 0x%04x\n", indent + 3, "", MAX(0, fwidth - 3),
+		"Flags:",
+		pline->filter[i].flags);
+	HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", MAX(0, fwidth - 3),
+		"Num CD values:",
+		pline->filter[i].cd_nelmts);
+
+        /* Filter parameters */
+	for(j = 0; j < pline->filter[i].cd_nelmts; j++) {
+	    char	field_name[32];
+
+	    HDsnprintf(field_name, sizeof(field_name), "CD value %lu", (unsigned long)j);
+	    HDfprintf(stream, "%*s%-*s %u\n", indent + 6, "", MAX(0, fwidth - 6),
+		    field_name,
+		    pline->filter[i].cd_values[j]);
+	} /* end for */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_pline_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_pline_set_latest_version
+ *
+ * Purpose:     Set the encoding for a I/O filter pipeline to the latest version.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, July 24, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_pline_set_latest_version(H5O_pline_t *pline)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(pline);
+
+    /* Set encoding of I/O pipeline to latest version */
+    pline->version = H5O_PLINE_VERSION_LATEST;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_pline_set_latest_version() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oprivate.h b/gatb-core/thirdparty/hdf5/src/H5Oprivate.h
new file mode 100644
index 0000000..94ba6a0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oprivate.h
@@ -0,0 +1,745 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Oprivate.h
+ *			Aug  5 1997
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Object header private include file.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Oprivate_H
+#define _H5Oprivate_H
+
+/* Include the public header file for this API */
+#include "H5Opublic.h"          /* Object header functions              */
+
+/* Public headers needed by this file */
+#include "H5Dpublic.h"          /* Dataset functions                    */
+#include "H5Lpublic.h"		/* Link functions                       */
+#include "H5Spublic.h"		/* Dataspace functions			*/
+
+/* Private headers needed by this file */
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5SLprivate.h"	/* Skip lists				*/
+#include "H5Tprivate.h"		/* Datatype functions			*/
+#include "H5Zprivate.h"         /* I/O pipeline filters			*/
+
+/* Forward references of package typedefs */
+typedef struct H5O_msg_class_t H5O_msg_class_t;
+typedef struct H5O_mesg_t H5O_mesg_t;
+typedef struct H5O_t H5O_t;
+
+/* Values used to create the shared message & attribute heaps */
+/* (Note that these parameters have been tuned so that the resulting heap ID
+ *      is exactly 8 bytes.  This is an efficient size as it can be stored
+ *      directly in an 8 byte integer in memory, think carefully before changing it.
+ *      -QAK)
+ */
+#define H5O_FHEAP_MAN_WIDTH                     4
+#define H5O_FHEAP_MAN_START_BLOCK_SIZE          1024
+#define H5O_FHEAP_MAN_MAX_DIRECT_SIZE           (64 * 1024)
+#define H5O_FHEAP_MAN_MAX_INDEX                 40
+#define H5O_FHEAP_MAN_START_ROOT_ROWS           1
+#define H5O_FHEAP_CHECKSUM_DBLOCKS              TRUE
+#define H5O_FHEAP_MAX_MAN_SIZE                  (4 * 1024)
+#define H5O_FHEAP_ID_LEN                        8
+
+/* Object header macros */
+#define H5O_MESG_MAX_SIZE	65536	/*max obj header message size	     */
+#define H5O_ALL		(-1)		/* Operate on all messages of type   */
+#define H5O_FIRST	(-2)		/* Operate on first message of type  */
+
+/* Flags needed when encoding messages */
+#define H5O_MSG_FLAG_CONSTANT	0x01u
+#define H5O_MSG_FLAG_SHARED	0x02u
+#define H5O_MSG_FLAG_DONTSHARE	0x04u
+#define H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE 0x08u
+#define H5O_MSG_FLAG_MARK_IF_UNKNOWN 0x10u
+#define H5O_MSG_FLAG_WAS_UNKNOWN 0x20u
+#define H5O_MSG_FLAG_SHAREABLE  0x40u
+#define H5O_MSG_FLAG_BITS	(H5O_MSG_FLAG_CONSTANT|H5O_MSG_FLAG_SHARED|H5O_MSG_FLAG_DONTSHARE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE|H5O_MSG_FLAG_MARK_IF_UNKNOWN|H5O_MSG_FLAG_WAS_UNKNOWN|H5O_MSG_FLAG_SHAREABLE)
+
+/* Flags for updating messages */
+#define H5O_UPDATE_TIME         0x01u
+#define H5O_UPDATE_FORCE        0x02u   /* Force updating the message */
+
+/* Hash value constants */
+#define H5O_HASH_SIZE 32
+
+/* ========= Object Creation properties ============ */
+#define H5O_CRT_ATTR_MAX_COMPACT_NAME	"max compact attr"      /* Max. # of attributes to store compactly */
+#define H5O_CRT_ATTR_MIN_DENSE_NAME	"min dense attr"	/* Min. # of attributes to store densely */
+#define H5O_CRT_OHDR_FLAGS_NAME		"object header flags"	/* Object header flags */
+#define H5O_CRT_PIPELINE_NAME           "pline"                 /* Filter pipeline */
+#define H5O_CRT_PIPELINE_DEF            {{0, NULL, H5O_NULL_ID, {{0, HADDR_UNDEF}}}, H5O_PLINE_VERSION_1, 0, 0, NULL}
+#ifdef H5O_ENABLE_BOGUS
+#define H5O_BOGUS_MSG_FLAGS_NAME        "bogus msg flags"       /* Flags for 'bogus' message */
+#define H5O_BOGUS_MSG_FLAGS_SIZE        sizeof(uint8_t)
+#endif /* H5O_ENABLE_BOGUS */
+#ifdef H5O_ENABLE_BAD_MESG_COUNT
+#define H5O_BAD_MESG_COUNT_NAME         "bad message count"       /* Flag setting bad message count */
+#define H5O_BAD_MESG_COUNT_SIZE         sizeof(hbool_t)
+#endif /* H5O_ENABLE_BAD_MESG_COUNT */
+
+/* ========= Object Copy properties ============ */
+#define H5O_CPY_OPTION_NAME 		 "copy object"           /* Copy options */
+#define H5O_CPY_MERGE_COMM_DT_LIST_NAME "merge committed dtype list"   /* List of datatype paths to search in the dest file for merging */
+#define H5O_CPY_MCDT_SEARCH_CB_NAME 	 "committed dtype list search" /* Callback function when the search for a matching committed datatype is complete */
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5O_PACKAGE
+#define H5O_OH_GET_ADDR(O)    ((O)->chunk[0].addr)
+#else /* H5O_PACKAGE */
+#define H5O_OH_GET_ADDR(O)    (H5O_get_oh_addr(O))
+#endif /* H5O_PACKAGE */
+
+/* Set the fields in a shared message structure */
+#define H5O_UPDATE_SHARED(SH_MESG, SH_TYPE, F, MSG_TYPE, CRT_IDX, OH_ADDR)    \
+    {                                                                         \
+        (SH_MESG)->type = (SH_TYPE);                                          \
+        (SH_MESG)->file = (F);                                                \
+        (SH_MESG)->msg_type_id = (MSG_TYPE);                                  \
+        (SH_MESG)->u.loc.index = (CRT_IDX);                                   \
+        (SH_MESG)->u.loc.oh_addr = (OH_ADDR);                                 \
+    } /* end block */
+
+
+/* Fractal heap ID type for shared message & attribute heap IDs. */
+typedef union {
+    uint8_t id[H5O_FHEAP_ID_LEN];       /* Buffer to hold ID, for encoding/decoding */
+    uint64_t val;                       /* Value, for quick comparisons */
+} H5O_fheap_id_t;
+
+/* The object location information for an object */
+typedef struct H5O_loc_t {
+    H5F_t       *file;          /* File that object header is located within */
+    haddr_t     addr;           /* File address of object header */
+    hbool_t     holding_file;   /* True if this object header has incremented
+                                 * its file's count of open objects. */
+} H5O_loc_t;
+
+/* Typedef for linked list of datatype merge suggestions */
+typedef struct H5O_copy_dtype_merge_list_t {
+    char *path; /* Path to datatype in destination file */
+    struct H5O_copy_dtype_merge_list_t *next; /* Next object in list */
+} H5O_copy_dtype_merge_list_t;
+
+/* Structure for callback property before searching the global list of committed datatypes at destination */
+typedef struct H5O_mcdt_cb_info_t {
+    H5O_mcdt_search_cb_t 	func;
+    void  			*user_data;
+} H5O_mcdt_cb_info_t;
+
+/* Settings/flags for copying an object */
+typedef struct H5O_copy_t {
+    hbool_t copy_shallow;               /* Flag to perform shallow hierarchy copy */
+    hbool_t expand_soft_link;           /* Flag to expand soft links */
+    hbool_t expand_ext_link;            /* Flag to expand external links */
+    hbool_t expand_ref;                 /* Flag to expand object references */
+    hbool_t copy_without_attr;          /* Flag to not copy attributes */
+    hbool_t preserve_null;              /* Flag to not delete NULL messages */
+    hbool_t merge_comm_dt;             /* Flag to merge committed datatypes in dest file */
+    H5O_copy_dtype_merge_list_t *dst_dt_suggestion_list; /* Suggestions for merging committed datatypes */
+    int     curr_depth;                 /* Current depth in hierarchy copied */
+    int     max_depth;                  /* Maximum depth in hierarchy to copy */
+    H5SL_t  *map_list;                  /* Skip list to hold address mappings */
+    H5SL_t  *dst_dt_list;               /* Skip list to hold committed datatypes in dest file */
+    hbool_t dst_dt_list_complete;       /* Whether the destination datatype list is complete (i.e. not only populated with "suggestions" from H5Padd_merge_committed_dtype_path) */
+    H5O_t   *oh_dst;                    /* The destination object header */
+    H5O_mcdt_search_cb_t mcdt_cb;	/* The callback to invoke before searching the global list of committed datatypes at destination */
+    void *mcdt_ud;			/* User data passed to callback */
+} H5O_copy_t;
+
+/* Header message IDs */
+#define H5O_NULL_ID	0x0000          /* Null Message.  */
+#define H5O_SDSPACE_ID	0x0001          /* Dataspace Message. */
+#define H5O_LINFO_ID    0x0002          /* Link info Message. */
+#define H5O_DTYPE_ID	0x0003          /* Datatype Message.  */
+#define H5O_FILL_ID     0x0004          /* Fill Value Message. (Old)  */
+#define H5O_FILL_NEW_ID 0x0005          /* Fill Value Message. (New)  */
+#define H5O_LINK_ID     0x0006          /* Link Message. */
+#define H5O_EFL_ID	0x0007          /* External File List Message  */
+#define H5O_LAYOUT_ID	0x0008          /* Data Layout Message.  */
+#define H5O_BOGUS_ID	0x0009          /* "Bogus" Message.  */
+#define H5O_GINFO_ID	0x000a          /* Group info Message.  */
+#define H5O_PLINE_ID	0x000b          /* Filter pipeline message.  */
+#define H5O_ATTR_ID	0x000c          /* Attribute Message.  */
+#define H5O_NAME_ID	0x000d          /* Object name message.  */
+#define H5O_MTIME_ID	0x000e          /* Modification time message. (Old)  */
+#define H5O_SHMESG_ID   0x000f          /* Shared message "SOHM" table. */
+#define H5O_CONT_ID	0x0010          /* Object header continuation message.  */
+#define H5O_STAB_ID	0x0011          /* Symbol table message.  */
+#define H5O_MTIME_NEW_ID 0x0012         /* Modification time message. (New)  */
+#define H5O_BTREEK_ID   0x0013          /* v1 B-tree 'K' values message.  */
+#define H5O_DRVINFO_ID  0x0014          /* Driver info message.  */
+#define H5O_AINFO_ID    0x0015          /* Attribute info message.  */
+#define H5O_REFCOUNT_ID 0x0016          /* Reference count message.  */
+#define H5O_UNKNOWN_ID  0x0017          /* Placeholder message ID for unknown message.  */
+                                        /* (this should never exist in a file) */
+
+
+/* Shared object message types.
+ * Shared objects can be committed, in which case the shared message contains
+ * the location of the object header that holds the message, or shared in the
+ * heap, in which case the shared message holds their heap ID.
+ */
+#define H5O_SHARE_TYPE_UNSHARED     0           /* Message is not shared */
+#define H5O_SHARE_TYPE_SOHM         1           /* Message is stored in SOHM heap */
+#define H5O_SHARE_TYPE_COMMITTED    2           /* Message is stored in another object header */
+#define H5O_SHARE_TYPE_HERE         3           /* Message is stored in this object header, but is sharable */
+
+/* Detect messages that aren't stored in message's object header */
+#define H5O_IS_STORED_SHARED(T) ((((T) == H5O_SHARE_TYPE_SOHM) || ((T) == H5O_SHARE_TYPE_COMMITTED)) ? TRUE : FALSE)
+
+/* Detect shared messages that are "tracked" in some other location */
+#define H5O_IS_TRACKED_SHARED(T) ((T) > 0)
+
+
+/* Specify the object header address and index needed
+ *      to locate a message in another object header.
+ */
+typedef struct H5O_mesg_loc_t {
+    H5O_msg_crt_idx_t index;            /* index within object header   */
+    haddr_t oh_addr;                    /* address of object header    */
+} H5O_mesg_loc_t;
+
+
+/*
+ * Shared object header message info.
+ *
+ * (This structure is used in other messages that can be shared and will
+ * include a H5O_shared_t struct as the first field in their "native" type)
+ */
+typedef struct H5O_shared_t {
+    unsigned type;                      /* Type describing how message is shared */
+    H5F_t *file;                        /* File that message is located within */
+    unsigned msg_type_id;               /* Message's type ID */
+    union {
+        H5O_mesg_loc_t	loc;		/* Object location info		     */
+        H5O_fheap_id_t  heap_id;        /* ID within the SOHM heap           */
+    } u;
+} H5O_shared_t;
+
+
+/*
+ * Link Info Message.
+ * (Contains dynamic information about links in a group)
+ * (Data structure in memory)
+ * (if the fields in this struct are changed, remember to change the default
+ *      link info structure in src/H5Gprivate.h - QAK)
+ * (if the fields in this struct are changed, also look at the code that
+ *      creates intermediate groups in src/H5Gtraverse.c - QAK)
+ * (The "max. creation order" field is signed so that we might have an easy
+ *      way to add links to the front of the creation ordering (with negative
+ *      values) as well as the end of the creation ordering - QAK)
+ */
+typedef struct H5O_linfo_t {
+    /* Creation order info */
+    hbool_t     track_corder;           /* Are creation order values tracked on links? */
+    hbool_t     index_corder;           /* Are creation order values indexed on links? */
+    int64_t     max_corder;             /* Current max. creation order value for group */
+    haddr_t     corder_bt2_addr;        /* Address of v2 B-tree for indexing creation order values of links */
+
+    /* Storage management info */
+    hsize_t     nlinks;                 /* Number of links in the group      */
+    haddr_t     fheap_addr;             /* Address of fractal heap for storing "dense" links */
+    haddr_t     name_bt2_addr;          /* Address of v2 B-tree for indexing names of links */
+} H5O_linfo_t;
+
+/* Initial version of the "old" fill value information */
+/* (It doesn't look like this value was ever used in the file -QAK) */
+#define H5O_FILL_VERSION_1 	1
+/* Revised version of the "new" fill value information */
+#define H5O_FILL_VERSION_2 	2
+/* Version of the "new" fill value information with smaller default format */
+#define H5O_FILL_VERSION_3 	3
+
+/* The latest version of the format.  Look through the 'encode', 'decode'
+ *      and 'size' callback for places to change when updating this. */
+#define H5O_FILL_VERSION_LATEST H5O_FILL_VERSION_3
+
+/*
+ * Fill Value Message.
+ * (Data structure in memory for both "old" and "new" fill value messages)
+ *
+ * The fill value message is fill value plus space allocation time, fill value
+ * writing time, whether fill value is defined, and the location of the
+ * message if it's shared.
+ */
+
+typedef struct H5O_fill_t {
+    H5O_shared_t        sh_loc;         /* Shared message info (must be first) */
+
+    unsigned	        version;	/* Encoding version number           */
+    H5T_t		*type;		/*type. Null implies same as dataset */
+    ssize_t		size;		/*number of bytes in the fill value  */
+    void		*buf;		/*the fill value		     */
+    H5D_alloc_time_t	alloc_time;	/* time to allocate space	     */
+    H5D_fill_time_t	fill_time;	/* time to write fill value	     */
+    hbool_t		fill_defined;   /* whether fill value is defined     */
+} H5O_fill_t;
+
+/*
+ * Link message.
+ * (Data structure in memory)
+ */
+typedef struct H5O_link_hard_t {
+    haddr_t	addr;			/* Object header address */
+} H5O_link_hard_t;
+
+typedef struct H5O_link_soft_t {
+    char	*name;			/* Destination name */
+} H5O_link_soft_t;
+
+typedef struct H5O_link_ud_t {
+    void	*udata;			/* Opaque data supplied by the user */
+    size_t       size;                  /* Size of udata */
+} H5O_link_ud_t;
+
+typedef struct H5O_link_t {
+    H5L_type_t  type;                   /* Type of link */
+    hbool_t     corder_valid;           /* Creation order for link is valid (not stored) */
+    int64_t     corder;                 /* Creation order for link (stored if it's valid) */
+    H5T_cset_t  cset;                   /* Character set of link name	*/
+    char	*name;			/* Link name */
+    union {
+        H5O_link_hard_t hard;           /* Information for hard links */
+        H5O_link_soft_t soft;           /* Information for soft links */
+        H5O_link_ud_t ud;               /* Information for user-defined links */
+    } u;
+} H5O_link_t;
+
+/*
+ * External File List Message
+ * (Data structure in memory)
+ */
+#define H5O_EFL_ALLOC		16	/*number of slots to alloc at once   */
+#define H5O_EFL_UNLIMITED	H5F_UNLIMITED /*max possible file size	     */
+
+typedef struct H5O_efl_entry_t {
+    size_t	name_offset;		/*offset of name within heap	     */
+    char	*name;			/*malloc'd name			     */
+    off_t	offset;			/*offset of data within file	     */
+    hsize_t	size;			/*size allocated within file	     */
+} H5O_efl_entry_t;
+
+typedef struct H5O_efl_t {
+    haddr_t	heap_addr;		/*address of name heap		     */
+    size_t	nalloc;			/*number of slots allocated	     */
+    size_t	nused;			/*number of slots used		     */
+    H5O_efl_entry_t *slot;		/*array of external file entries     */
+} H5O_efl_t;
+
+
+/*
+ * Data Layout Message.
+ * (Data structure in file)
+ */
+#define H5O_LAYOUT_NDIMS	(H5S_MAX_RANK+1)
+
+/* Initial version of the layout information.  Used when space is allocated */
+#define H5O_LAYOUT_VERSION_1	1
+
+/* This version added support for delaying allocation */
+#define H5O_LAYOUT_VERSION_2	2
+
+/* This version is revised to store just the information needed for each
+ *      storage type, and to straighten out problems with contiguous layout's
+ *      sizes (was encoding them as 4-byte values when they were really n-byte
+ *      values (where n usually is 8)).
+ */
+#define H5O_LAYOUT_VERSION_3	3
+
+
+/* Forward declaration of structs used below */
+struct H5D_layout_ops_t;                /* Defined in H5Dpkg.h               */
+struct H5D_chunk_ops_t;                 /* Defined in H5Dpkg.h               */
+
+typedef struct H5O_storage_contig_t {
+    haddr_t	addr;			/* File address of data              */
+    hsize_t     size;                   /* Size of data in bytes             */
+} H5O_storage_contig_t;
+
+typedef struct H5O_storage_chunk_btree_t {
+    haddr_t     dset_ohdr_addr;         /* File address dataset's object header */
+    H5RC_t     *shared;			/* Ref-counted shared info for B-tree nodes */
+} H5O_storage_chunk_btree_t;
+
+typedef struct H5O_storage_chunk_t {
+    H5D_chunk_index_t idx_type;		/* Type of chunk index               */
+    haddr_t	idx_addr;		/* File address of chunk index       */
+    const struct H5D_chunk_ops_t *ops;  /* Pointer to chunked storage operations */
+    union {
+        H5O_storage_chunk_btree_t btree; /* Information for v1 B-tree index   */
+    } u;
+} H5O_storage_chunk_t;
+
+typedef struct H5O_storage_compact_t {
+    hbool_t     dirty;                  /* Dirty flag for compact dataset    */
+    size_t      size;                   /* Size of buffer in bytes           */
+    void        *buf;                   /* Buffer for compact dataset        */
+} H5O_storage_compact_t;
+
+typedef struct H5O_storage_t {
+    H5D_layout_t type;			/* Type of layout                    */
+    union {
+        H5O_storage_contig_t contig;    /* Information for contiguous storage */
+        H5O_storage_chunk_t chunk;      /* Information for chunked storage    */
+        H5O_storage_compact_t compact;  /* Information for compact storage    */
+    } u;
+} H5O_storage_t;
+
+typedef struct H5O_layout_chunk_t {
+    unsigned	ndims;			/* Num dimensions in chunk           */
+    uint32_t	dim[H5O_LAYOUT_NDIMS];	/* Size of chunk in elements         */
+    uint32_t    size;                   /* Size of chunk in bytes            */
+    hsize_t     nchunks;                /* Number of chunks in dataset	     */
+    hsize_t     chunks[H5O_LAYOUT_NDIMS]; /* # of chunks in dataset dimensions */
+    hsize_t    	down_chunks[H5O_LAYOUT_NDIMS];	/* "down" size of number of chunks in each dimension */
+} H5O_layout_chunk_t;
+
+typedef struct H5O_layout_t {
+    H5D_layout_t type;			/* Type of layout                    */
+    unsigned version;                   /* Version of message                */
+    const struct H5D_layout_ops_t *ops; /* Pointer to data layout I/O operations */
+    union {
+        H5O_layout_chunk_t chunk;       /* Information for chunked layout    */
+    } u;
+    H5O_storage_t storage;              /* Information for storing dataset elements */
+} H5O_layout_t;
+
+/* Enable reading/writing "bogus" messages */
+/* #define H5O_ENABLE_BOGUS */
+
+#ifdef H5O_ENABLE_BOGUS
+/*
+ * "Bogus" Message.
+ * (Data structure in memory)
+ */
+#define H5O_BOGUS_VALUE         0xdeadbeef
+typedef struct H5O_bogus_t {
+    unsigned u;                         /* Hold the bogus info */
+} H5O_bogus_t;
+#endif /* H5O_ENABLE_BOGUS */
+
+/*
+ * Group info message.
+ * (Contains constant information about a group)
+ * (Data structure in memory)
+ * (if the fields in this struct are changed, remember to change the default
+ *      group info structure in src/H5Gprivate.h - QAK)
+ */
+typedef struct H5O_ginfo_t {
+    /* "Old" format group info (not stored) */
+    uint32_t    lheap_size_hint;        /* Local heap size hint              */
+
+    /* "New" format group info (stored) */
+
+    /* (storage management info) */
+    hbool_t     store_link_phase_change;/* Whether to store the link phase change values */
+    uint16_t	max_compact;		/* Maximum # of compact links        */
+    uint16_t	min_dense;		/* Minimum # of "dense" links        */
+
+    /* (initial object header size info) */
+    hbool_t     store_est_entry_info;   /* Whether to store the est. entry values */
+    uint16_t	est_num_entries;	/* Estimated # of entries in group   */
+    uint16_t	est_name_len;		/* Estimated length of entry name    */
+} H5O_ginfo_t;
+
+/*
+ * Filter pipeline message.
+ * (Data structure in memory)
+ */
+
+/* The initial version of the format */
+#define H5O_PLINE_VERSION_1	1
+
+/* This version encodes the message fields more efficiently */
+/* (Drops the reserved bytes, doesn't align the name and doesn't encode the
+ *      filter name at all if it's a filter provided by the library)
+ */
+#define H5O_PLINE_VERSION_2	2
+
+/* The latest version of the format.  Look through the 'encode' and 'size'
+ *      callbacks for places to change when updating this. */
+#define H5O_PLINE_VERSION_LATEST H5O_PLINE_VERSION_2
+
+typedef struct H5O_pline_t {
+    H5O_shared_t        sh_loc;         /* Shared message info (must be first) */
+
+    unsigned	version;	        /* Encoding version number */
+    size_t	nalloc;			/*num elements in `filter' array     */
+    size_t	nused;			/*num filters defined		     */
+    H5Z_filter_info_t *filter;		/*array of filters		     */
+} H5O_pline_t;
+
+/*
+ * Object name message.
+ * (Data structure in memory)
+ */
+
+typedef struct H5O_name_t {
+    char	*s;			/*ptr to malloc'd memory	     */
+} H5O_name_t;
+
+/*
+ * Shared message table message
+ * Information about file-wide shared message table, stored in superblock
+ * extension
+ * (Data structure in memory)
+ */
+typedef struct H5O_shmesg_table_t {
+    haddr_t		addr;	        /*file address of SOHM table */
+    unsigned		version;	/*SOHM table version number */
+    unsigned		nindexes;	/*number of indexes in the table */
+} H5O_shmesg_table_t;
+
+/*
+ * Object header continuation message.
+ * (Data structure in memory)
+ */
+
+typedef struct H5O_cont_t {
+    haddr_t	addr;			/*address of continuation block	     */
+    size_t	size;			/*size of continuation block	     */
+
+    /* the following field(s) do not appear on disk */
+    unsigned	chunkno;		/*chunk this mesg refers to	     */
+} H5O_cont_t;
+
+/*
+ * Symbol table message.
+ * (Data structure in memory)
+ */
+typedef struct H5O_stab_t {
+    haddr_t	btree_addr;		/*address of B-tree		     */
+    haddr_t	heap_addr;		/*address of name heap		     */
+} H5O_stab_t;
+
+/*
+ * v1 B-tree 'K' value message
+ * Information about file-wide non-default v1 B-tree 'K' values, stored in
+ * superblock extension
+ * (Data structure in memory)
+ */
+typedef struct H5O_btreek_t {
+    unsigned        btree_k[H5B_NUM_BTREE_ID];  /* B-tree internal node 'K' values */
+    unsigned        sym_leaf_k;                 /* Symbol table leaf node's 'K' value */
+} H5O_btreek_t;
+
+/*
+ * Driver info message
+ * Information about driver info, stored in superblock extension
+ * (Data structure in memory)
+ */
+typedef struct H5O_drvinfo_t {
+    char                name[9];                /* Driver name */
+    size_t		len;                    /* Length of encoded buffer */
+    uint8_t            *buf;                    /* Buffer for encoded info */
+} H5O_drvinfo_t;
+
+/*
+ * Attribute Info Message.
+ * (Contains dynamic information about attributes on an object)
+ * (Data structure in memory)
+ */
+typedef struct H5O_ainfo_t {
+    /* Creation order info */
+    hbool_t     track_corder;           /* Are creation order values tracked on attributes? */
+    hbool_t     index_corder;           /* Are creation order values indexed on attributes? */
+    H5O_msg_crt_idx_t max_crt_idx;      /* Maximum attribute creation index used */
+    haddr_t     corder_bt2_addr;        /* Address of v2 B-tree for indexing creation order values of "dense" attributes */
+
+    /* Storage management info */
+    hsize_t     nattrs;                 /* Number of attributes on the object */
+    haddr_t     fheap_addr;             /* Address of fractal heap for storing "dense" attributes */
+    haddr_t     name_bt2_addr;          /* Address of v2 B-tree for indexing names of "dense" attributes */
+} H5O_ainfo_t;
+
+/*
+ * Reference Count Message.
+ * (Data structure in memory)
+ */
+typedef uint32_t H5O_refcount_t;        /* Contains # of links to object, if >1 */
+
+/*
+ * "Unknown" Message.
+ * (Data structure in memory)
+ */
+typedef unsigned H5O_unknown_t;         /* Original message type ID */
+
+
+/* Typedef for "application" iteration operations */
+typedef herr_t (*H5O_operator_t)(const void *mesg/*in*/, unsigned idx,
+    void *operator_data/*in,out*/);
+
+/* Typedef for "internal library" iteration operations */
+typedef herr_t (*H5O_lib_operator_t)(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned sequence, unsigned *oh_modified/*out*/, void *operator_data/*in,out*/);
+
+/* Some syntactic sugar to make the compiler happy with two different kinds of iterator callbacks */
+typedef enum H5O_mesg_operator_type_t {
+    H5O_MESG_OP_APP,            /* Application callback */
+    H5O_MESG_OP_LIB             /* Library internal callback */
+} H5O_mesg_operator_type_t;
+
+/* To indicate that the object header is just modified */
+#define H5O_MODIFY		0x01
+/* To indicate that the object header is modified and might possibly need to condense messages */
+#define H5O_MODIFY_CONDENSE	0x02
+
+typedef struct {
+    H5O_mesg_operator_type_t op_type;
+    union {
+        H5O_operator_t app_op;      /* Application callback for each message */
+        H5O_lib_operator_t lib_op;  /* Library internal callback for each message */
+    } u;
+} H5O_mesg_operator_t;
+
+
+/* Typedef for abstract object creation */
+typedef struct {
+    H5O_type_t obj_type;        /* Type of object to create */
+    void *crt_info;             /* Information for object creation callback */
+    void *new_obj;              /* Pointer to new object created */
+} H5O_obj_create_t;
+
+/* Forward declarations for prototype arguments */
+struct H5P_genplist_t;
+
+/* Object header routines */
+H5_DLL herr_t H5O_init(void);
+H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint,
+    size_t initial_rc, hid_t ocpl_id, H5O_loc_t *loc/*out*/);
+H5_DLL herr_t H5O_open(H5O_loc_t *loc);
+H5_DLL herr_t H5O_close(H5O_loc_t *loc);
+H5_DLL int H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id);
+H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot);
+H5_DLL H5O_t *H5O_pin(const H5O_loc_t *loc, hid_t dxpl_id);
+H5_DLL herr_t H5O_unpin(H5O_t *oh);
+H5_DLL herr_t H5O_dec_rc_by_loc(const H5O_loc_t *loc, hid_t dxpl_id);
+H5_DLL herr_t H5O_unprotect(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh,
+    unsigned oh_flags);
+H5_DLL herr_t H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id);
+H5_DLL herr_t H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    hbool_t force);
+#ifdef H5O_ENABLE_BOGUS
+H5_DLL herr_t H5O_bogus_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned mesg_flags);
+#endif /* H5O_ENABLE_BOGUS */
+H5_DLL herr_t H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+H5_DLL herr_t H5O_get_hdr_info(const H5O_loc_t *oloc, hid_t dxpl_id, H5O_hdr_info_t *hdr);
+H5_DLL herr_t H5O_get_info(const H5O_loc_t *oloc, hid_t dxpl_id, hbool_t want_ih_info,
+    H5O_info_t *oinfo);
+H5_DLL herr_t H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id);
+H5_DLL herr_t H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, struct H5P_genplist_t *oc_plist);
+H5_DLL hid_t H5O_open_name(H5G_loc_t *loc, const char *name, hid_t lapl_id, hbool_t app_ref);
+H5_DLL herr_t H5O_get_nlinks(const H5O_loc_t *loc, hid_t dxpl_id, hsize_t *nlinks);
+H5_DLL void *H5O_obj_create(H5F_t *f, H5O_type_t obj_type, void *crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id);
+H5_DLL haddr_t H5O_get_oh_addr(const H5O_t *oh);
+H5_DLL herr_t H5O_get_rc_and_type(const H5O_loc_t *oloc, hid_t dxpl_id, unsigned *rc, H5O_type_t *otype);
+
+/* Object header message routines */
+H5_DLL herr_t H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags,
+    unsigned update_flags, void *mesg, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_append_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
+    unsigned mesg_flags, unsigned update_flags, void *mesg);
+H5_DLL herr_t H5O_msg_write(const H5O_loc_t *loc, unsigned type_id,
+    unsigned mesg_flags, unsigned update_flags, void *mesg, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_write_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+    unsigned type_id, unsigned mesg_flags, unsigned update_flags, void *mesg);
+H5_DLL void *H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg,
+    hid_t dxpl_id);
+H5_DLL void *H5O_msg_read_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
+    void *mesg);
+H5_DLL herr_t H5O_msg_reset(unsigned type_id, void *native);
+H5_DLL void *H5O_msg_free(unsigned type_id, void *mesg);
+H5_DLL void *H5O_msg_copy(unsigned type_id, const void *mesg, void *dst);
+H5_DLL int H5O_msg_count(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+H5_DLL htri_t H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+H5_DLL htri_t H5O_msg_exists_oh(const H5O_t *oh, unsigned type_id);
+H5_DLL herr_t H5O_msg_remove(const H5O_loc_t *loc, unsigned type_id, int sequence,
+    hbool_t adj_link, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
+    H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id,
+    const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id);
+H5_DLL size_t H5O_msg_raw_size(const H5F_t *f, unsigned type_id,
+    hbool_t disable_shared, const void *mesg);
+H5_DLL size_t H5O_msg_size_f(const H5F_t *f, hid_t ocpl_id, unsigned type_id,
+    const void *mesg, size_t extra_raw);
+H5_DLL size_t H5O_msg_size_oh(const H5F_t *f, const H5O_t *oh, unsigned type_id,
+    const void *mesg, size_t extra_raw);
+H5_DLL htri_t H5O_msg_is_shared(unsigned type_id, const void *mesg);
+H5_DLL htri_t H5O_msg_can_share(unsigned type_id, const void *mesg);
+H5_DLL htri_t H5O_msg_can_share_in_ohdr(unsigned type_id);
+H5_DLL herr_t H5O_msg_set_share(unsigned type_id, const H5O_shared_t *share,
+    void *mesg);
+H5_DLL herr_t H5O_msg_reset_share(unsigned type_id, void *mesg);
+H5_DLL herr_t H5O_msg_get_crt_index(unsigned type_id, const void *mesg,
+    H5O_msg_crt_idx_t *crt_idx);
+H5_DLL herr_t H5O_msg_encode(H5F_t *f, unsigned type_id, hbool_t disable_shared,
+    unsigned char *buf, const void *obj);
+H5_DLL void* H5O_msg_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned type_id, const unsigned char *buf);
+H5_DLL herr_t H5O_msg_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned type_id, void *mesg);
+H5_DLL int H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_lock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_unlock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+
+/* Object copying routines */
+H5_DLL herr_t H5O_copy_header_map(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
+    hid_t dxpl_id, H5O_copy_t *cpy_info, hbool_t inc_depth,
+    H5O_type_t *obj_type, void **udata);
+H5_DLL herr_t H5O_copy_expand_ref(H5F_t *file_src, void *_src_ref, hid_t dxpl_id,
+    H5F_t *file_dst, void *_dst_ref, size_t ref_count, H5R_type_t ref_type,
+    H5O_copy_t *cpy_info);
+
+/* Debugging routines */
+H5_DLL herr_t H5O_debug_id(unsigned type_id, H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream, int indent, int fwidth);
+H5_DLL herr_t H5O_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
+			 int fwidth);
+
+/* These functions operate on object locations */
+H5_DLL herr_t H5O_loc_reset(H5O_loc_t *loc);
+H5_DLL herr_t H5O_loc_copy(H5O_loc_t *dst, H5O_loc_t *src, H5_copy_depth_t depth);
+H5_DLL herr_t H5O_loc_hold_file(H5O_loc_t *loc);
+H5_DLL herr_t H5O_loc_free(H5O_loc_t *loc);
+
+/* EFL operators */
+H5_DLL hsize_t H5O_efl_total_size(H5O_efl_t *efl);
+
+/* Fill value operators */
+H5_DLL herr_t H5O_fill_reset_dyn(H5O_fill_t *fill);
+H5_DLL herr_t H5O_fill_convert(H5O_fill_t *fill, H5T_t *type, hbool_t *fill_changed, hid_t dxpl_id);
+H5_DLL herr_t H5O_fill_set_latest_version(H5O_fill_t *fill);
+
+/* Link operators */
+H5_DLL herr_t H5O_link_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    void *_mesg);
+
+/* Filter pipeline operators */
+H5_DLL herr_t H5O_pline_set_latest_version(H5O_pline_t *pline);
+
+/* Shared message operators */
+H5_DLL herr_t H5O_set_shared(H5O_shared_t *dst, const H5O_shared_t *src);
+
+#endif /* _H5Oprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Opublic.h b/gatb-core/thirdparty/hdf5/src/H5Opublic.h
new file mode 100644
index 0000000..32945e8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Opublic.h
@@ -0,0 +1,212 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Opublic.h
+ *                      Aug  5 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Public declarations for the H5O (object header)
+ *                      package.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _H5Opublic_H
+#define _H5Opublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"		/* Generic Functions			*/
+#include "H5Ipublic.h"		/* IDs			  		*/
+#include "H5Lpublic.h"		/* Links		  		*/
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/* Flags for object copy (H5Ocopy) */
+#define H5O_COPY_SHALLOW_HIERARCHY_FLAG (0x0001u)   /* Copy only immediate members */
+#define H5O_COPY_EXPAND_SOFT_LINK_FLAG  (0x0002u)   /* Expand soft links into new objects */
+#define H5O_COPY_EXPAND_EXT_LINK_FLAG   (0x0004u)   /* Expand external links into new objects */
+#define H5O_COPY_EXPAND_REFERENCE_FLAG	(0x0008u)   /* Copy objects that are pointed by references */
+#define H5O_COPY_WITHOUT_ATTR_FLAG      (0x0010u)   /* Copy object without copying attributes */
+#define H5O_COPY_PRESERVE_NULL_FLAG     (0x0020u)   /* Copy NULL messages (empty space) */
+#define H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG (0x0040u)   /* Merge committed datatypes in dest file */
+#define H5O_COPY_ALL                    (0x007Fu)   /* All object copying flags (for internal checking) */
+
+/* Flags for shared message indexes.
+ * Pass these flags in using the mesg_type_flags parameter in
+ * H5P_set_shared_mesg_index.
+ * (Developers: These flags correspond to object header message type IDs,
+ * but we need to assign each kind of message to a different bit so that
+ * one index can hold multiple types.)
+ */
+#define H5O_SHMESG_NONE_FLAG    0x0000          /* No shared messages */
+#define H5O_SHMESG_SDSPACE_FLAG ((unsigned)1 << 0x0001) /* Simple Dataspace Message.  */
+#define H5O_SHMESG_DTYPE_FLAG   ((unsigned)1 << 0x0003) /* Datatype Message.  */
+#define H5O_SHMESG_FILL_FLAG    ((unsigned)1 << 0x0005) /* Fill Value Message. */
+#define H5O_SHMESG_PLINE_FLAG   ((unsigned)1 << 0x000b) /* Filter pipeline message.  */
+#define H5O_SHMESG_ATTR_FLAG    ((unsigned)1 << 0x000c) /* Attribute Message.  */
+#define H5O_SHMESG_ALL_FLAG     (H5O_SHMESG_SDSPACE_FLAG | H5O_SHMESG_DTYPE_FLAG | H5O_SHMESG_FILL_FLAG | H5O_SHMESG_PLINE_FLAG | H5O_SHMESG_ATTR_FLAG)
+
+/* Object header status flag definitions */
+#define H5O_HDR_CHUNK0_SIZE             0x03    /* 2-bit field indicating # of bytes to store the size of chunk 0's data */
+#define H5O_HDR_ATTR_CRT_ORDER_TRACKED  0x04    /* Attribute creation order is tracked */
+#define H5O_HDR_ATTR_CRT_ORDER_INDEXED  0x08    /* Attribute creation order has index */
+#define H5O_HDR_ATTR_STORE_PHASE_CHANGE 0x10    /* Non-default attribute storage phase change values stored */
+#define H5O_HDR_STORE_TIMES             0x20    /* Store access, modification, change & birth times for object */
+#define H5O_HDR_ALL_FLAGS       (H5O_HDR_CHUNK0_SIZE | H5O_HDR_ATTR_CRT_ORDER_TRACKED | H5O_HDR_ATTR_CRT_ORDER_INDEXED | H5O_HDR_ATTR_STORE_PHASE_CHANGE | H5O_HDR_STORE_TIMES)
+
+/* Maximum shared message values.  Number of indexes is 8 to allow room to add
+ * new types of messages.
+ */
+#define H5O_SHMESG_MAX_NINDEXES 8
+#define H5O_SHMESG_MAX_LIST_SIZE 5000
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/* Types of objects in file */
+typedef enum H5O_type_t {
+    H5O_TYPE_UNKNOWN = -1,	/* Unknown object type		*/
+    H5O_TYPE_GROUP,	        /* Object is a group		*/
+    H5O_TYPE_DATASET,		/* Object is a dataset		*/
+    H5O_TYPE_NAMED_DATATYPE, 	/* Object is a named data type	*/
+    H5O_TYPE_NTYPES             /* Number of different object types (must be last!) */
+} H5O_type_t;
+
+/* Information struct for object header metadata (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) */
+typedef struct H5O_hdr_info_t {
+    unsigned version;		/* Version number of header format in file */
+    unsigned nmesgs;		/* Number of object header messages */
+    unsigned nchunks;		/* Number of object header chunks */
+    unsigned flags;             /* Object header status flags */
+    struct {
+        hsize_t total;		/* Total space for storing object header in file */
+        hsize_t meta;		/* Space within header for object header metadata information */
+        hsize_t mesg;		/* Space within header for actual message information */
+        hsize_t free;		/* Free space within object header */
+    } space;
+    struct {
+        uint64_t present;	/* Flags to indicate presence of message type in header */
+        uint64_t shared;	/* Flags to indicate message type is shared in header */
+    } mesg;
+} H5O_hdr_info_t;
+
+/* Information struct for object (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) */
+typedef struct H5O_info_t {
+    unsigned long 	fileno;		/* File number that object is located in */
+    haddr_t 		addr;		/* Object address in file	*/
+    H5O_type_t 		type;		/* Basic object type (group, dataset, etc.) */
+    unsigned 		rc;		/* Reference count of object    */
+    time_t		atime;		/* Access time			*/
+    time_t		mtime;		/* Modification time		*/
+    time_t		ctime;		/* Change time			*/
+    time_t		btime;		/* Birth time			*/
+    hsize_t 		num_attrs;	/* # of attributes attached to object */
+    H5O_hdr_info_t      hdr;            /* Object header information */
+    /* Extra metadata storage for obj & attributes */
+    struct {
+        H5_ih_info_t   obj;             /* v1/v2 B-tree & local/fractal heap for groups, B-tree for chunked datasets */
+        H5_ih_info_t   attr;            /* v2 B-tree & heap for attributes */
+    } meta_size;
+} H5O_info_t;
+
+/* Typedef for message creation indexes */
+typedef uint32_t H5O_msg_crt_idx_t;
+
+/* Prototype for H5Ovisit/H5Ovisit_by_name() operator */
+typedef herr_t (*H5O_iterate_t)(hid_t obj, const char *name, const H5O_info_t *info,
+    void *op_data);
+
+typedef enum H5O_mcdt_search_ret_t {
+    H5O_MCDT_SEARCH_ERROR = -1,	/* Abort H5Ocopy */
+    H5O_MCDT_SEARCH_CONT,	/* Continue the global search of all committed datatypes in the destination file */
+    H5O_MCDT_SEARCH_STOP	/* Stop the search, but continue copying.  The committed datatype will be copied but not merged. */
+} H5O_mcdt_search_ret_t;
+
+/* Callback to invoke when completing the search for a matching committed datatype from the committed dtype list */
+typedef H5O_mcdt_search_ret_t (*H5O_mcdt_search_cb_t)(void *op_data);
+
+/********************/
+/* Public Variables */
+/********************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************/
+/* Public Prototypes */
+/*********************/
+H5_DLL hid_t H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id);
+H5_DLL hid_t H5Oopen_by_addr(hid_t loc_id, haddr_t addr);
+H5_DLL hid_t H5Oopen_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id);
+H5_DLL htri_t H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id);
+H5_DLL herr_t H5Oget_info(hid_t loc_id, H5O_info_t *oinfo);
+H5_DLL herr_t H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo,
+    hid_t lapl_id);
+H5_DLL herr_t H5Oget_info_by_idx(hid_t loc_id, const char *group_name,
+    H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo,
+    hid_t lapl_id);
+H5_DLL herr_t H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name,
+    hid_t lcpl_id, hid_t lapl_id);
+H5_DLL herr_t H5Oincr_refcount(hid_t object_id);
+H5_DLL herr_t H5Odecr_refcount(hid_t object_id);
+H5_DLL herr_t H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+    const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id);
+H5_DLL herr_t H5Oset_comment(hid_t obj_id, const char *comment);
+H5_DLL herr_t H5Oset_comment_by_name(hid_t loc_id, const char *name,
+    const char *comment, hid_t lapl_id);
+H5_DLL ssize_t H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize);
+H5_DLL ssize_t H5Oget_comment_by_name(hid_t loc_id, const char *name,
+    char *comment, size_t bufsize, hid_t lapl_id);
+H5_DLL herr_t H5Ovisit(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
+    H5O_iterate_t op, void *op_data);
+H5_DLL herr_t H5Ovisit_by_name(hid_t loc_id, const char *obj_name,
+    H5_index_t idx_type, H5_iter_order_t order, H5O_iterate_t op,
+    void *op_data, hid_t lapl_id);
+H5_DLL herr_t H5Oclose(hid_t object_id);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+/* Typedefs */
+
+/* A struct that's part of the H5G_stat_t routine (deprecated) */
+typedef struct H5O_stat_t {
+    hsize_t size;               /* Total size of object header in file */
+    hsize_t free;               /* Free space within object header */
+    unsigned nmesgs;            /* Number of object header messages */
+    unsigned nchunks;           /* Number of object header chunks */
+} H5O_stat_t;
+
+/* Function prototypes */
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Opublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Orefcount.c b/gatb-core/thirdparty/hdf5/src/H5Orefcount.c
new file mode 100644
index 0000000..f5c7e25
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Orefcount.c
@@ -0,0 +1,325 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Orefcount.c
+ *                      Mar 10 2007
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             Object ref. count messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_refcount_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_refcount_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_refcount_copy(const void *_mesg, void *_dest);
+static size_t H5O_refcount_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_refcount_free(void *_mesg);
+static herr_t H5O_refcount_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
+static herr_t H5O_refcount_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+			     FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_REFCOUNT[1] = {{
+    H5O_REFCOUNT_ID,           	/*message id number             */
+    "refcount",                	/*message name for debugging    */
+    sizeof(H5O_refcount_t),    	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_refcount_decode,	/*decode message                */
+    H5O_refcount_encode,	/*encode message                */
+    H5O_refcount_copy,		/*copy the native value         */
+    H5O_refcount_size,		/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_refcount_free,	        /* free method			*/
+    NULL,			/* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_refcount_pre_copy_file,	/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_refcount_debug         	/*debug the message             */
+}};
+
+/* Current version of ref. count information */
+#define H5O_REFCOUNT_VERSION 	0
+
+/* Declare a free list to manage the H5O_refcount_t struct */
+H5FL_DEFINE_STATIC(H5O_refcount_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_decode
+ *
+ * Purpose:     Decode a message and return a pointer to a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native form.
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 10 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_refcount_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_refcount_t *refcount = NULL;  /* Reference count */
+    void        *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_REFCOUNT_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (refcount = H5FL_MALLOC(H5O_refcount_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get ref. count for object */
+    UINT32DECODE(p, *refcount)
+
+    /* Set return value */
+    ret_value = refcount;
+
+done:
+    if(ret_value == NULL && refcount != NULL)
+        refcount = H5FL_FREE(H5O_refcount_t, refcount);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_refcount_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 10 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_refcount_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_refcount_t   *refcount = (const H5O_refcount_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(refcount);
+
+    /* Message version */
+    *p++ = H5O_REFCOUNT_VERSION;
+
+    /* Object's ref. count */
+    UINT32ENCODE(p, *refcount);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_refcount_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 10 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_refcount_copy(const void *_mesg, void *_dest)
+{
+    const H5O_refcount_t   *refcount = (const H5O_refcount_t *)_mesg;
+    H5O_refcount_t         *dest = (H5O_refcount_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(refcount);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_refcount_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *refcount;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_refcount_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *              Failure:        zero
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 10 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_refcount_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared,
+    const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = 1                       /* Version */
+                + 4;                    /* Ref. count */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_refcount_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_refcount_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, March 10, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_refcount_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_refcount_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_refcount_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, March 10, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_refcount_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void H5_ATTR_UNUSED *native_src,
+    hbool_t *deleted, const H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *udata)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(deleted);
+    HDassert(cpy_info);
+
+    /* Always delete this message when copying objects between files.  Let
+     *  the copy routine set the correct ref. count.
+     */
+    *deleted = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_refcount_pre_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refcount_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar  6 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_refcount_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_refcount_t       *refcount = (const H5O_refcount_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(refcount);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of links:", (unsigned)*refcount);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_refcount_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Osdspace.c b/gatb-core/thirdparty/hdf5/src/H5Osdspace.c
new file mode 100644
index 0000000..8d357c2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Osdspace.c
@@ -0,0 +1,541 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5O_PACKAGE	/*suppress error about including H5Opkg	  */
+#define H5S_PACKAGE		/*prevent warning from including H5Spkg.h */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Gprivate.h"		/* Groups			  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"		/* Object headers		  	*/
+#include "H5Spkg.h"		/* Dataspaces 				*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_sdspace_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *_mesg);
+static void *H5O_sdspace_copy(const void *_mesg, void *_dest);
+static size_t H5O_sdspace_size(const H5F_t *f, const void *_mesg);
+static herr_t H5O_sdspace_reset(void *_mesg);
+static herr_t H5O_sdspace_free(void *_mesg);
+static herr_t H5O_sdspace_pre_copy_file(H5F_t *file_src, const void *mesg_src,
+    hbool_t *deleted, const H5O_copy_t *cpy_info, void *_udata);
+static herr_t H5O_sdspace_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+				FILE * stream, int indent, int fwidth);
+
+/* Set up & include shared message "interface" info */
+#define H5O_SHARED_TYPE			H5O_MSG_SDSPACE
+#define H5O_SHARED_DECODE		H5O_sdspace_shared_decode
+#define H5O_SHARED_DECODE_REAL		H5O_sdspace_decode
+#define H5O_SHARED_ENCODE		H5O_sdspace_shared_encode
+#define H5O_SHARED_ENCODE_REAL		H5O_sdspace_encode
+#define H5O_SHARED_SIZE			H5O_sdspace_shared_size
+#define H5O_SHARED_SIZE_REAL		H5O_sdspace_size
+#define H5O_SHARED_DELETE		H5O_sdspace_shared_delete
+#undef H5O_SHARED_DELETE_REAL
+#define H5O_SHARED_LINK			H5O_sdspace_shared_link
+#undef H5O_SHARED_LINK_REAL
+#define H5O_SHARED_COPY_FILE		H5O_sdspace_shared_copy_file
+#undef H5O_SHARED_COPY_FILE_REAL
+#define H5O_SHARED_POST_COPY_FILE	H5O_sdspace_shared_post_copy_file
+#undef H5O_SHARED_POST_COPY_FILE_REAL
+#undef  H5O_SHARED_POST_COPY_FILE_UPD
+#define H5O_SHARED_DEBUG		H5O_sdspace_shared_debug
+#define H5O_SHARED_DEBUG_REAL		H5O_sdspace_debug
+#include "H5Oshared.h"			/* Shared Object Header Message Callbacks */
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_SDSPACE[1] = {{
+    H5O_SDSPACE_ID,	    	/* message id number		    	*/
+    "dataspace",	    	/* message name for debugging	   	*/
+    sizeof(H5S_extent_t),   	/* native message size		    	*/
+    H5O_SHARE_IS_SHARABLE|H5O_SHARE_IN_OHDR,	/* messages are sharable?       */
+    H5O_sdspace_shared_decode,	/* decode message			*/
+    H5O_sdspace_shared_encode,	/* encode message			*/
+    H5O_sdspace_copy,	    	/* copy the native value		*/
+    H5O_sdspace_shared_size,	/* size of symbol table entry	    	*/
+    H5O_sdspace_reset,	    	/* default reset method		    	*/
+    H5O_sdspace_free,		/* free method				*/
+    H5O_sdspace_shared_delete,	/* file delete method		*/
+    H5O_sdspace_shared_link,	/* link method			*/
+    NULL,			/* set share method		*/
+    NULL,		    	/*can share method		*/
+    H5O_sdspace_pre_copy_file,	/* pre copy native value to file */
+    H5O_sdspace_shared_copy_file,/* copy native value to file    */
+    H5O_sdspace_shared_post_copy_file,/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_sdspace_shared_debug	/* debug the message		    	*/
+}};
+
+/* Declare external the free list for H5S_extent_t's */
+H5FL_EXTERN(H5S_extent_t);
+
+/* Declare external the free list for hsize_t arrays */
+H5FL_ARR_EXTERN(hsize_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_sdspace_decode
+ PURPOSE
+    Decode a simple dimensionality message and return a pointer to a memory
+	struct with the decoded information
+ USAGE
+    void *H5O_sdspace_decode(f, dxpl_id, mesg_flags, p)
+	H5F_t *f;	        IN: pointer to the HDF5 file struct
+        hid_t dxpl_id;          IN: DXPL for any I/O
+        unsigned mesg_flags;    IN: Message flags to influence decoding
+	const uint8 *p;		IN: the raw information buffer
+ RETURNS
+    Pointer to the new message in native order on success, NULL on failure
+ DESCRIPTION
+	This function decodes the "raw" disk form of a simple dimensionality
+    message into a struct in memory native format.  The struct is allocated
+    within this function using malloc() and is returned to the caller.
+--------------------------------------------------------------------------*/
+static void *
+H5O_sdspace_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5S_extent_t	*sdim = NULL;/* New extent dimensionality structure */
+    void		*ret_value;
+    unsigned		i;		/* local counting variable */
+    unsigned		flags, version;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* decode */
+    if(NULL == (sdim = H5FL_CALLOC(H5S_extent_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_NOSPACE, NULL, "dataspace structure allocation failed")
+
+    /* Check version */
+    version = *p++;
+    if(version < H5O_SDSPACE_VERSION_1 || version > H5O_SDSPACE_VERSION_2)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "wrong version number in dataspace message")
+    sdim->version = version;
+
+    /* Get rank */
+    sdim->rank = *p++;
+    if(sdim->rank > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "simple dataspace dimensionality is too large")
+
+    /* Get dataspace flags for later */
+    flags = *p++;
+
+    /* Get or determine the type of the extent */
+    if(version >= H5O_SDSPACE_VERSION_2)
+        sdim->type = (H5S_class_t)*p++;
+    else {
+        /* Set the dataspace type to be simple or scalar as appropriate */
+        if(sdim->rank > 0)
+            sdim->type = H5S_SIMPLE;
+        else
+            sdim->type = H5S_SCALAR;
+
+        /* Increment past reserved byte */
+        p++;
+    } /* end else */
+    HDassert(sdim->type != H5S_NULL || sdim->version >= H5O_SDSPACE_VERSION_2);
+
+    /* Only Version 1 has these reserved bytes */
+    if(version == H5O_SDSPACE_VERSION_1)
+        p += 4; /*reserved*/
+
+    /* Decode dimension sizes */
+    if(sdim->rank > 0) {
+        if(NULL == (sdim->size = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)sdim->rank)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        for(i = 0; i < sdim->rank; i++)
+            H5F_DECODE_LENGTH(f, p, sdim->size[i]);
+
+        if(flags & H5S_VALID_MAX) {
+            if(NULL == (sdim->max = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)sdim->rank)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+            for(i = 0; i < sdim->rank; i++)
+                H5F_DECODE_LENGTH (f, p, sdim->max[i]);
+        } /* end if */
+    } /* end if */
+
+    /* Compute the number of elements in the extent */
+    if(sdim->type == H5S_NULL)
+        sdim->nelem = 0;
+    else {
+        for(i = 0, sdim->nelem = 1; i < sdim->rank; i++)
+            sdim->nelem *= sdim->size[i];
+    } /* end else */
+
+    /* Set return value */
+    ret_value = (void*)sdim;	/*success*/
+
+done:
+    if(!ret_value && sdim) {
+        H5S_extent_release(sdim);
+        sdim = H5FL_FREE(H5S_extent_t, sdim);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_sdspace_decode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_sdspace_encode
+ PURPOSE
+    Encode a simple dimensionality message
+ USAGE
+    herr_t H5O_sdspace_encode(f, raw_size, p, mesg)
+	H5F_t *f;	        IN: pointer to the HDF5 file struct
+	size_t raw_size;	IN: size of the raw information buffer
+	const uint8 *p;		IN: the raw information buffer
+	const void *mesg;	IN: Pointer to the extent dimensionality struct
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function encodes the native memory form of the simple
+    dimensionality message in the "raw" disk form.
+
+ MODIFICATIONS
+	Robb Matzke, 1998-04-09
+	The current and maximum dimensions are now H5F_SIZEOF_SIZET bytes
+	instead of just four bytes.
+
+  	Robb Matzke, 1998-07-20
+        Added a version number and reformatted the message for aligment.
+
+        Raymond Lu
+        April 8, 2004
+        Added the type of dataspace into this header message using a reserved
+        byte.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *_mesg)
+{
+    const H5S_extent_t	*sdim = (const H5S_extent_t *)_mesg;
+    unsigned		flags = 0;
+    unsigned		u;  /* Local counting variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(sdim);
+
+    /* Version */
+    HDassert(sdim->version > 0);
+    HDassert(sdim->type != H5S_NULL || sdim->version >= H5O_SDSPACE_VERSION_2);
+    *p++ = (uint8_t)sdim->version;
+
+    /* Rank */
+    *p++ = (uint8_t)sdim->rank;
+
+    /* Flags */
+    if(sdim->max)
+        flags |= H5S_VALID_MAX;
+    *p++ = (uint8_t)flags;
+
+    /* Dataspace type */
+    if(sdim->version > H5O_SDSPACE_VERSION_1)
+        *p++ = sdim->type;
+    else {
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+        *p++ = 0; /*reserved*/
+    } /* end else */
+
+    /* Current & maximum dimensions */
+    if(sdim->rank > 0) {
+        for(u = 0; u < sdim->rank; u++)
+            H5F_ENCODE_LENGTH(f, p, sdim->size[u]);
+        if(flags & H5S_VALID_MAX) {
+            for(u = 0; u < sdim->rank; u++)
+                H5F_ENCODE_LENGTH(f, p, sdim->max[u]);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_sdspace_encode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_sdspace_copy
+ PURPOSE
+    Copies a message from MESG to DEST, allocating DEST if necessary.
+ USAGE
+    void *H5O_sdspace_copy(_mesg, _dest)
+	const void *_mesg;	IN: Pointer to the source extent dimensionality struct
+	const void *_dest;	IN: Pointer to the destination extent dimensionality struct
+ RETURNS
+    Pointer to DEST on success, NULL on failure
+ DESCRIPTION
+	This function copies a native (memory) simple dimensionality message,
+    allocating the destination structure if necessary.
+--------------------------------------------------------------------------*/
+static void *
+H5O_sdspace_copy(const void *_mesg, void *_dest)
+{
+    const H5S_extent_t	   *mesg = (const H5S_extent_t *)_mesg;
+    H5S_extent_t	   *dest = (H5S_extent_t *)_dest;
+    void                   *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(mesg);
+    if(!dest && NULL == (dest = H5FL_CALLOC(H5S_extent_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy extent information */
+    if(H5S_extent_copy(dest, mesg, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy extent")
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    if(NULL == ret_value)
+        if(dest && NULL == _dest)
+            dest = H5FL_FREE(H5S_extent_t, dest);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_sdspace_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_sdspace_size
+ PURPOSE
+    Return the raw message size in bytes
+ USAGE
+    void *H5O_sdspace_size(f, mesg)
+	H5F_t *f;	  IN: pointer to the HDF5 file struct
+	const void *mesg;	IN: Pointer to the source extent dimensionality struct
+ RETURNS
+    Size of message on success, zero on failure
+ DESCRIPTION
+	This function returns the size of the raw simple dimensionality message on
+    success.  (Not counting the message type or size fields, only the data
+    portion of the message).  It doesn't take into account alignment.
+
+ MODIFICATIONS
+	Robb Matzke, 1998-04-09
+	The current and maximum dimensions are now H5F_SIZEOF_SIZET bytes
+	instead of just four bytes.
+--------------------------------------------------------------------------*/
+static size_t
+H5O_sdspace_size(const H5F_t *f, const void *_mesg)
+{
+    const H5S_extent_t	*space = (const H5S_extent_t *)_mesg;
+    size_t		ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Basic information for all dataspace messages */
+    ret_value = 1 +             /* Version */
+            1 +                 /* Rank */
+            1 +                 /* Flags */
+            1 +                 /* Dataspace type/reserved */
+            ((space->version > H5O_SDSPACE_VERSION_1) ? 0 : 4); /* Eliminated/reserved */
+
+    /* Add in the dimension sizes */
+    ret_value += space->rank * H5F_SIZEOF_SIZE(f);
+
+    /* Add in the space for the maximum dimensions, if they are present */
+    ret_value += space->max ? (space->rank * H5F_SIZEOF_SIZE(f)) : 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_sdspace_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_sdspace_reset
+ *
+ * Purpose:	Frees the inside of a dataspace message and resets it to some
+ *		initial value.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 30, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_sdspace_reset(void *_mesg)
+{
+    H5S_extent_t	*mesg = (H5S_extent_t*)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    H5S_extent_release(mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_sdsdpace_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 30, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_sdspace_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5S_extent_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_sdspace_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_sdspace_pre_copy_file
+ *
+ * Purpose:     Perform any necessary actions before copying message between
+ *              files
+ *
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              November 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_sdspace_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void *mesg_src,
+    hbool_t H5_ATTR_UNUSED *deleted, const H5O_copy_t H5_ATTR_UNUSED *cpy_info, void *_udata)
+{
+    const H5S_extent_t *src_space_extent = (const H5S_extent_t *)mesg_src;  /* Source dataspace extent */
+    H5D_copy_file_ud_t *udata = (H5D_copy_file_ud_t *)_udata;   /* Dataset copying user data */
+    herr_t         ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file_src);
+    HDassert(src_space_extent);
+
+    /* If the user data is non-NULL, assume we are copying a dataset
+     * and make a copy of the dataspace extent for later in the object copying
+     * process.  (We currently only need to make a copy of the dataspace extent
+     * if the layout is an early version, but that information isn't
+     * available here, so we just make a copy of it in all cases)
+     */
+    if(udata) {
+        /* Allocate copy of dataspace extent */
+        if(NULL == (udata->src_space_extent = H5FL_CALLOC(H5S_extent_t)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_NOSPACE, FAIL, "dataspace extent allocation failed")
+
+        /* Create a copy of the dataspace extent */
+        if(H5S_extent_copy(udata->src_space_extent, src_space_extent, TRUE) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy extent")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dspace_pre_copy_file() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_sdspace_debug
+ PURPOSE
+    Prints debugging information for a simple dimensionality message
+ USAGE
+    void *H5O_sdspace_debug(f, mesg, stream, indent, fwidth)
+	H5F_t *f;	        IN: pointer to the HDF5 file struct
+	const void *mesg;	IN: Pointer to the source extent dimensionality struct
+	FILE *stream;		IN: Pointer to the stream for output data
+	int indent;		IN: Amount to indent information by
+	int fwidth;		IN: Field width (?)
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function prints debugging output to the stream passed as a
+    parameter.
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_sdspace_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *mesg,
+		  FILE * stream, int indent, int fwidth)
+{
+    const H5S_extent_t	   *sdim = (const H5S_extent_t *)mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(sdim);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+	    "Rank:",
+	    (unsigned long) (sdim->rank));
+
+    if(sdim->rank > 0) {
+        unsigned		    u;	/* local counting variable */
+
+        HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:");
+        for(u = 0; u < sdim->rank; u++)
+            HDfprintf (stream, "%s%Hu", u?", ":"", sdim->size[u]);
+        HDfprintf (stream, "}\n");
+
+        HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Dim Max:");
+        if(sdim->max) {
+            HDfprintf (stream, "{");
+            for(u = 0; u < sdim->rank; u++) {
+                if(H5S_UNLIMITED==sdim->max[u])
+                    HDfprintf (stream, "%sUNLIM", u?", ":"");
+                else
+                    HDfprintf (stream, "%s%Hu", u?", ":"", sdim->max[u]);
+            } /* end for */
+            HDfprintf (stream, "}\n");
+        } /* end if */
+        else
+            HDfprintf (stream, "CONSTANT\n");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_sdspace_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oshared.c b/gatb-core/thirdparty/hdf5/src/H5Oshared.c
new file mode 100644
index 0000000..bd1bb07
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oshared.c
@@ -0,0 +1,758 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Wednesday, April  1, 1998
+ *
+ * Purpose:	Functions that operate on a shared message.  The shared
+ *		message doesn't ever actually appear in the object header as
+ *		a normal message.  Instead, if a message is shared, the
+ *		H5O_FLAG_SHARED bit is set and the message body is that
+ *		defined here for H5O_SHARED.  The message ID is the ID of the
+ *		pointed-to message and the pointed-to message is stored in
+ *		the global heap.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5HFprivate.h"        /* Fractal heap				*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5SMprivate.h"        /* Shared object header messages        */
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* First version, with full symbol table entry as link for object header sharing */
+#define H5O_SHARED_VERSION_1	1
+
+/* Older version, with just address of object as link for object header sharing */
+#define H5O_SHARED_VERSION_2	2
+
+/* Newest version, which recognizes messages that are stored in the SOHM heap */
+#define H5O_SHARED_VERSION_3	3
+#define H5O_SHARED_VERSION_LATEST	H5O_SHARED_VERSION_3
+
+/* Size of stack buffer for serialized messages */
+#define H5O_MESG_BUF_SIZE               128
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_read
+ *
+ * Purpose:	Reads a message referred to by a shared message.
+ *
+ * Return:	Success:	Ptr to message in native format.  The message
+ *				should be freed by calling H5O_msg_reset().
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 24 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_shared_read(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned *ioflags,
+    const H5O_shared_t *shared, const H5O_msg_class_t *type)
+{
+    H5HF_t *fheap = NULL;
+    H5WB_t *wb = NULL;          /* Wrapped buffer for attribute data */
+    uint8_t mesg_buf[H5O_MESG_BUF_SIZE]; /* Buffer for deserializing messages */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(shared);
+    HDassert(type);
+    HDassert(type->share_flags & H5O_SHARE_IS_SHARABLE);
+
+    /* This message could have a heap ID (SOHM) or the address of an object
+     * header on disk (named datatype)
+     */
+    HDassert(H5O_IS_STORED_SHARED(shared->type));
+
+    /* Check for implicit shared object header message */
+    if(shared->type == H5O_SHARE_TYPE_SOHM) {
+        haddr_t fheap_addr;             /* Address of SOHM heap */
+        uint8_t *mesg_ptr;              /* Pointer to raw message in heap */
+        size_t mesg_size;               /* Size of message */
+
+        /* Retrieve the fractal heap address for shared messages */
+        if(H5SM_get_fheap_addr(f, dxpl_id, type->id, &fheap_addr) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "can't get fheap address for shared messages")
+
+        /* Open the fractal heap */
+        if(NULL == (fheap = H5HF_open(f, dxpl_id, fheap_addr)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open fractal heap")
+
+        /* Get the size of the message in the heap */
+        if(H5HF_get_obj_len(fheap, dxpl_id, &(shared->u.heap_id), &mesg_size) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "can't get message size from fractal heap.")
+
+        /* Wrap the local buffer for serialized message */
+        if(NULL == (wb = H5WB_wrap(mesg_buf, sizeof(mesg_buf))))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for message */
+        if(NULL == (mesg_ptr = (uint8_t *)H5WB_actual(wb, mesg_size)))
+            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+        /* Retrieve the message from the heap */
+        if(H5HF_read(fheap, dxpl_id, &(shared->u.heap_id), mesg_ptr) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "can't read message from fractal heap.")
+
+        /* Decode the message */
+        if(NULL == (ret_value = (type->decode)(f, dxpl_id, open_oh, 0, ioflags, mesg_ptr)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode shared message.")
+    } /* end if */
+    else {
+        H5O_loc_t oloc;         /* Location for object header where message is stored */
+
+        HDassert(shared->type == H5O_SHARE_TYPE_COMMITTED);
+
+        /* Build the object location for the shared message's object header */
+        oloc.file = f;
+        oloc.addr = shared->u.loc.oh_addr;
+        oloc.holding_file = FALSE;
+
+        if(open_oh && oloc.addr == H5O_OH_GET_ADDR(open_oh)) {
+            /* The shared message is in the already opened object header.  This
+             * is possible, for example, if an attribute's datatype is shared in
+             * the same object header the attribute is in.  Read the message
+             * directly. */
+            if(NULL == (ret_value = H5O_msg_read_oh(f, dxpl_id, open_oh, type->id, NULL)))
+                HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read message")
+        } else
+            /* The shared message is in another object header */
+            if(NULL == (ret_value = H5O_msg_read(&oloc, type->id, NULL, dxpl_id)))
+                HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read message")
+    } /* end else */
+
+    /* Mark the message as shared */
+    if(H5O_msg_set_share(type->id, shared, ret_value) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to set sharing information")
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "can't close fractal heap")
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_link_adj
+ *
+ * Purpose:	Changes the link count for the object referenced by a shared
+ *              message.
+ *
+ *              This function changes the object header link count and is
+ *              only relevant for committed messages.  Messages shared in
+ *              the heap are re-shared each time they're written, so their
+ *              reference count is stored in the file-wide shared message
+ *              index and is changed in a different place in the code.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 26 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_shared_link_adj(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    const H5O_msg_class_t *type, H5O_shared_t *shared, int adjust)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(shared);
+
+    /* Check for type of shared message */
+    if(shared->type == H5O_SHARE_TYPE_COMMITTED) {
+        H5O_loc_t oloc;         /* Location for object header where message is stored */
+
+        /*
+         * The shared message is stored in some object header.
+         * The other object header must be in the same file as the
+         * new object header. Adjust the reference count on that
+         * object header.
+         */
+        /* Unfortunately, it is possible for the shared->file pointer to become
+         * invalid if the oh is kept in cache (which is contained in
+         * shared->file->shared while shared->file is closed.  Just ignore
+         * shared->file until the "top-level" file pointer is removed at some
+         * point in the future.  -NAF */
+        /* This is related to Jira issue #7638 and should be uncommented after
+         * the library has been refactored to shift to using shared file
+         * pointers for file operations, instead of using top file pointers.
+         * -QAK */
+        /*if(shared->file->shared != f->shared)
+            HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "interfile hard links are not allowed")*/
+
+        /* Build the object location for the shared message's object header */
+        oloc.file = f;
+        oloc.addr = shared->u.loc.oh_addr;
+        oloc.holding_file = FALSE;
+
+        if(open_oh && oloc.addr == H5O_OH_GET_ADDR(open_oh)) {
+            /* The shared message is in the already opened object header.  This
+             * is possible, for example, if an attribute's datatype is shared in
+             * the same object header the attribute is in.  Adjust the link
+             * count directly. */
+            hbool_t deleted = FALSE; /* This is used only to satisfy H5O_link_oh */
+
+            if(H5O_link_oh(f, adjust, dxpl_id, open_oh, &deleted) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count")
+
+            HDassert(!deleted);
+        } else
+            /* The shared message is in another object header */
+            if(H5O_link(&oloc, adjust, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count")
+    } /* end if */
+    else {
+        HDassert(shared->type == H5O_SHARE_TYPE_SOHM || shared->type == H5O_SHARE_TYPE_HERE);
+
+        /* Check for decrementing reference count on shared message */
+        if(adjust < 0) {
+            if(H5SM_delete(f, dxpl_id, open_oh, shared) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to delete message from SOHM table")
+        } /* end if */
+        /* Check for incrementing reference count on message */
+        else if(adjust > 0) {
+            if(H5SM_try_share(f, dxpl_id, open_oh, 0, type->id, shared, NULL) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "error trying to share message")
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_link_adj() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_decode
+ *
+ * Purpose:	Decodes a shared object message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, January 22, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_shared_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned *ioflags,
+    const uint8_t *buf, const H5O_msg_class_t *type)
+{
+    H5O_shared_t sh_mesg;       /* Shared message info */
+    unsigned version;           /* Shared message version */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(buf);
+    HDassert(type);
+
+    /* Version */
+    version = *buf++;
+    if(version < H5O_SHARED_VERSION_1 || version > H5O_SHARED_VERSION_LATEST)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for shared object message")
+
+    /* Get the shared information type
+     * Flags are unused before version 3.
+     */
+    if(version >= H5O_SHARED_VERSION_2)
+        sh_mesg.type = *buf++;
+    else {
+        sh_mesg.type = H5O_SHARE_TYPE_COMMITTED;
+        buf++;
+    } /* end else */
+
+    /* Skip reserved bytes (for version 1) */
+    if(version == H5O_SHARED_VERSION_1)
+        buf += 6;
+
+    /* Body */
+    if(version == H5O_SHARED_VERSION_1) {
+        /* Initialize other location fields */
+        sh_mesg.u.loc.index = 0;
+
+        /* Decode stored "symbol table entry" into message location */
+        buf += H5F_SIZEOF_SIZE(f);          /* Skip over local heap address */
+        H5F_addr_decode(f, &buf, &(sh_mesg.u.loc.oh_addr));
+    } /* end if */
+    else if (version >= H5O_SHARED_VERSION_2) {
+        /* If this message is in the heap, copy a heap ID.
+         * Otherwise, it is a named datatype, so copy an H5O_loc_t.
+         */
+        if(sh_mesg.type == H5O_SHARE_TYPE_SOHM) {
+            HDassert(version >= H5O_SHARED_VERSION_3);
+            HDmemcpy(&sh_mesg.u.heap_id, buf, sizeof(sh_mesg.u.heap_id));
+        } /* end if */
+        else {
+            /* The H5O_COMMITTED_FLAG should be set if this message
+             * is from an older version before the flag existed.
+             */
+            if(version < H5O_SHARED_VERSION_3)
+                sh_mesg.type = H5O_SHARE_TYPE_COMMITTED;
+
+            sh_mesg.u.loc.index = 0;
+            H5F_addr_decode(f, &buf, &sh_mesg.u.loc.oh_addr);
+        } /* end else */
+    } /* end else if */
+
+    /* Set file pointer & message type for all types of shared messages */
+    sh_mesg.file = f;
+    sh_mesg.msg_type_id = type->id;
+
+    /* Retrieve actual message, through decoded shared message info */
+    if(NULL == (ret_value = H5O_shared_read(f, dxpl_id, open_oh, ioflags, &sh_mesg, type)))
+        HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to retrieve native message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_encode
+ *
+ * Purpose:	Encodes message _MESG into buffer BUF.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_encode(const H5F_t *f, uint8_t *buf/*out*/, const H5O_shared_t *sh_mesg)
+{
+    unsigned    version;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(f);
+    HDassert(buf);
+    HDassert(sh_mesg);
+
+    /* If this message is shared in the heap, we need to use version 3 of the
+     * encoding and encode the SHARED_IN_HEAP flag.
+     */
+    if(sh_mesg->type == H5O_SHARE_TYPE_SOHM)
+        version = H5O_SHARED_VERSION_LATEST;
+    else {
+        HDassert(sh_mesg->type == H5O_SHARE_TYPE_COMMITTED);
+        version = H5O_SHARED_VERSION_2; /* version 1 is no longer used */
+    } /* end else */
+
+    *buf++ = (uint8_t)version;
+    *buf++ = (uint8_t)sh_mesg->type;
+
+    /* Encode either the heap ID of the message or the address of the
+     * object header that holds it.
+     */
+    if(sh_mesg->type == H5O_SHARE_TYPE_SOHM)
+        HDmemcpy(buf, &(sh_mesg->u.heap_id), sizeof(sh_mesg->u.heap_id));
+    else
+        H5F_addr_encode(f, &buf, sh_mesg->u.loc.oh_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_shared_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_set_shared
+ *
+ * Purpose:	Sets the shared component for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Sep 26 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_set_shared(H5O_shared_t *dst, const H5O_shared_t *src)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(dst);
+    HDassert(src);
+
+    /* copy */
+    *dst = *src;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_set_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_size
+ *
+ * Purpose:	Returns the length of a shared object message.
+ *
+ * Return:	Success:	Length
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_shared_size(const H5F_t *f, const H5O_shared_t *sh_mesg)
+{
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(sh_mesg->type == H5O_SHARE_TYPE_COMMITTED) {
+        ret_value = (size_t)1 +		/*version			*/
+            (size_t)1 +			/*the type field		*/
+            (size_t)H5F_SIZEOF_ADDR(f);	/*sharing by another obj hdr	*/
+    } /* end if */
+    else {
+        HDassert(sh_mesg->type == H5O_SHARE_TYPE_SOHM);
+        ret_value = 1 +			/*version			*/
+            1 +				/*the type field		*/
+            H5O_FHEAP_ID_LEN;		/* Shared in the heap		*/
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_shared_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, September 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    const H5O_msg_class_t *type, H5O_shared_t *sh_mesg)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(sh_mesg);
+
+    /*
+     * Committed datatypes increment the OH of the original message when they
+     * are written (in H5O_shared_link) and decrement it here.
+     * SOHMs in the heap behave differently; their refcount is incremented
+     * during H5SM_share when they are going to be written (in H5O_msg_append
+     * or H5O_msg_write). Their refcount in the SOHM indexes still needs to
+     * be decremented when they're deleted (in H5O_shared_link_adj).
+     */
+
+    /* Decrement the reference count on the shared object */
+    if(H5O_shared_link_adj(f, dxpl_id, open_oh, type, sh_mesg, -1) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_shared_link
+ *
+ * Purpose:     Increment reference count on any objects referenced by
+ *              message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, September 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    const H5O_msg_class_t *type, H5O_shared_t *sh_mesg)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(sh_mesg);
+
+    /* Increment the reference count on the shared object */
+    if(H5O_shared_link_adj(f, dxpl_id, open_oh, type, sh_mesg, 1) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_shared_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              January 22, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_copy_file(H5F_t *file_src, H5F_t *file_dst,
+    const H5O_msg_class_t *mesg_type, const void *_native_src, void *_native_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned *mesg_flags, H5O_copy_t *cpy_info,
+    void H5_ATTR_UNUSED *udata, hid_t dxpl_id)
+{
+    const H5O_shared_t  *shared_src = (const H5O_shared_t *)_native_src; /* Alias to shared info in native source */
+    H5O_shared_t        *shared_dst = (H5O_shared_t *)_native_dst; /* Alias to shared info in native destination message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(file_src);
+    HDassert(file_dst);
+    HDassert(mesg_type);
+    HDassert(shared_src);
+    HDassert(shared_dst);
+    HDassert(recompute_size);
+    HDassert(cpy_info);
+
+    /* Committed shared messages create a shared message at the destination
+     * and also copy the committed object that they point to.
+     *
+     * Other messages simulate sharing the destination message to determine how
+     * it will eventually be shared (if at all), but do not actually share the
+     * message until "post copy".  The "H5O_shared_t" part of the message will
+     * be updated (to allow calculation of the final size) but the message is
+     * not actually shared.
+     */
+    if(shared_src->type != H5O_SHARE_TYPE_COMMITTED) {
+        /* Simulate trying to share new message in the destination file. */
+        if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_DEFER, mesg_type->id, _native_dst, mesg_flags) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to determine if message should be shared")
+    } /* end if */
+    else {
+        /* Mark the message as committed - as it will be committed in post copy
+         */
+        H5O_UPDATE_SHARED(shared_dst, H5O_SHARE_TYPE_COMMITTED, file_dst, mesg_type->id, 0, HADDR_UNDEF)
+        *mesg_flags |= H5O_MSG_FLAG_SHARED;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_shared_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_shared_post_copy_file
+ *
+ * Purpose:     Delate a shared message and replace with a new one.
+ *              The function is needed at cases such as coping a shared reg_ref attribute.
+ *              When a shared reg_ref attribute is copied from one file to
+ *              another, the values in file need to be replaced. The only way
+ *              to complish that is to delete the old message and write the
+ *              new message with the correct values.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              xcao at hdfgroup.org
+ *              May 24 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_post_copy_file(H5F_t *f, const H5O_msg_class_t *mesg_type,
+    const H5O_shared_t *shared_src, H5O_shared_t *shared_dst,
+    unsigned *mesg_flags, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(shared_src);
+    HDassert(shared_dst);
+
+    /* Copy the target of committed messages, try to share others */
+    if(shared_src->type == H5O_SHARE_TYPE_COMMITTED) {
+        H5O_loc_t dst_oloc;
+        H5O_loc_t src_oloc;
+
+        /* Copy the shared object from source to destination */
+        H5O_loc_reset(&dst_oloc);
+        dst_oloc.file = f;
+        src_oloc.file = shared_src->file;
+        src_oloc.addr = shared_src->u.loc.oh_addr;
+        if(H5O_copy_header_map(&src_oloc, &dst_oloc, dxpl_id, cpy_info, FALSE,
+                NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
+
+        /* Set up destination message's shared info */
+        H5O_UPDATE_SHARED(shared_dst, H5O_SHARE_TYPE_COMMITTED, f, mesg_type->id, 0, dst_oloc.addr)
+    } /* end if */
+    else
+        /* Share the message */
+        if(H5SM_try_share(f, dxpl_id, NULL, H5SM_WAS_DEFERRED, mesg_type->id,
+                shared_dst, mesg_flags) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't share message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shared_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shared_debug
+ *
+ * Purpose:	Prints debugging info for the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_shared_debug(const H5O_shared_t *mesg, FILE *stream, int indent, int fwidth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    switch(mesg->type) {
+        case H5O_SHARE_TYPE_UNSHARED:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Shared Message type:",
+                    "Unshared");
+            break;
+
+        case H5O_SHARE_TYPE_COMMITTED:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Shared Message type:",
+                    "Obj Hdr");
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                    "Object address:",
+                    mesg->u.loc.oh_addr);
+            break;
+
+        case H5O_SHARE_TYPE_SOHM:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Shared Message type:",
+                    "SOHM");
+            HDfprintf(stream, "%*s%-*s %016llx\n", indent, "", fwidth,
+                    "Heap ID:",
+                    (unsigned long long)mesg->u.heap_id.val);
+            break;
+
+        case H5O_SHARE_TYPE_HERE:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                    "Shared Message type:",
+                    "Here");
+            break;
+
+        default:
+            HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
+                    "Shared Message type:",
+                    "Unknown", (unsigned)mesg->type);
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_shared_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oshared.h b/gatb-core/thirdparty/hdf5/src/H5Oshared.h
new file mode 100644
index 0000000..2ac2a98
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oshared.h
@@ -0,0 +1,491 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Friday, January 19, 2007
+ *
+ * Purpose:	This file contains inline definitions for "generic" routines
+ *		supporting a "shared message interface" (ala Java) for object
+ *		header messages that can be shared.  This interface is
+ *              dependent on a bunch of macros being defined which define
+ *              the name of the interface and "real" methods which need to
+ *              be implemented for each message class that supports the
+ *              shared message interface.
+ */
+
+#ifndef H5Oshared_H
+#define H5Oshared_H
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_DECODE
+ *
+ * Purpose:     Decode an object header message that may be shared.
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:      Success:        Pointer to the new message in native form
+ *              Failure:        NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE void *
+H5O_SHARED_DECODE(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned mesg_flags,
+    unsigned *ioflags, const uint8_t *p)
+{
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_DECODE
+#error "Need to define H5O_SHARED_DECODE macro!"
+#endif /* H5O_SHARED_DECODE */
+#ifndef H5O_SHARED_DECODE_REAL
+#error "Need to define H5O_SHARED_DECODE_REAL macro!"
+#endif /* H5O_SHARED_DECODE_REAL */
+
+    /* Check for shared message */
+    if(mesg_flags & H5O_MSG_FLAG_SHARED) {
+        /* Retrieve native message info indirectly through shared message */
+        if(NULL == (ret_value = H5O_shared_decode(f, dxpl_id, open_oh, ioflags, p, H5O_SHARED_TYPE)))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode shared message")
+
+        /* We currently do not support automatically fixing shared messages */
+#ifdef H5_STRICT_FORMAT_CHECKS
+        if(*ioflags & H5O_DECODEIO_DIRTY)
+            HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, NULL, "unable to mark shared message dirty")
+#else /* H5_STRICT_FORMAT_CHECKS */
+        *ioflags &= ~H5O_DECODEIO_DIRTY;
+#endif /* H5_STRICT_FORMAT_CHECKS */
+    } /* end if */
+    else {
+        /* Decode native message directly */
+        if(NULL == (ret_value = H5O_SHARED_DECODE_REAL(f, dxpl_id, open_oh, mesg_flags, ioflags, p)))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode native message")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_DECODE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_ENCODE
+ *
+ * Purpose:     Encode an object header message that may be shared.
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE herr_t
+H5O_SHARED_ENCODE(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_shared_t *sh_mesg = (const H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_ENCODE
+#error "Need to define H5O_SHARED_ENCODE macro!"
+#endif /* H5O_SHARED_ENCODE */
+#ifndef H5O_SHARED_ENCODE_REAL
+#error "Need to define H5O_SHARED_ENCODE_REAL macro!"
+#endif /* H5O_SHARED_ENCODE_REAL */
+
+    /* Sanity check */
+    HDassert(sh_mesg->type == H5O_SHARE_TYPE_UNSHARED || sh_mesg->msg_type_id == H5O_SHARED_TYPE->id);
+
+    /* Check for message stored elsewhere */
+    if(H5O_IS_STORED_SHARED(sh_mesg->type) && !disable_shared) {
+        /* Encode shared message into buffer */
+        if(H5O_shared_encode(f, p, sh_mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode shared message")
+    } /* end if */
+    else {
+        /* Encode native message directly */
+        if(H5O_SHARED_ENCODE_REAL(f, p, _mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode native message")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_ENCODE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_SIZE
+ *
+ * Purpose:	Returns the length of an encoded message.
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:	Success:	Length
+ *		Failure:	0
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE size_t
+H5O_SHARED_SIZE(const H5F_t *f, hbool_t disable_shared, const void *_mesg)
+{
+    const H5O_shared_t *sh_mesg = (const H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_SIZE
+#error "Need to define H5O_SHARED_SIZE macro!"
+#endif /* H5O_SHARED_SIZE */
+#ifndef H5O_SHARED_SIZE_REAL
+#error "Need to define H5O_SHARED_SIZE_REAL macro!"
+#endif /* H5O_SHARED_SIZE_REAL */
+
+    /* Check for message stored elsewhere */
+    if(H5O_IS_STORED_SHARED(sh_mesg->type) && !disable_shared) {
+        /* Retrieve encoded size of shared message */
+        if(0 == (ret_value = H5O_shared_size(f, sh_mesg)))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, 0, "unable to retrieve encoded size of shared message")
+    } /* end if */
+    else {
+        /* Retrieve size of native message directly */
+        if(0 == (ret_value = H5O_SHARED_SIZE_REAL(f, _mesg)))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, 0, "unable to retrieve encoded size of native message")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_SIZE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_DELETE
+ *
+ * Purpose:     Decrement reference count on any objects referenced by
+ *              message
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE herr_t
+H5O_SHARED_DELETE(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+{
+    H5O_shared_t *sh_mesg = (H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_DELETE
+#error "Need to define H5O_SHARED_DELETE macro!"
+#endif /* H5O_SHARED_DELETE */
+
+    /* Check for message tracked elsewhere */
+    if(H5O_IS_TRACKED_SHARED(sh_mesg->type)) {
+        /* Decrement the reference count on the shared message/object */
+        if(H5O_shared_delete(f, dxpl_id, open_oh, H5O_SHARED_TYPE, sh_mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement ref count for shared message")
+    } /* end if */
+#ifdef H5O_SHARED_DELETE_REAL
+    else {
+        /* Decrement the reference count on the native message directly */
+        if(H5O_SHARED_DELETE_REAL(f, dxpl_id, open_oh, _mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "unable to decrement ref count for native message")
+    } /* end else */
+#endif /* H5O_SHARED_DELETE_REAL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_DELETE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_LINK
+ *
+ * Purpose:     Increment reference count on any objects referenced by
+ *              message
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE herr_t
+H5O_SHARED_LINK(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+{
+    H5O_shared_t *sh_mesg = (H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_LINK
+#error "Need to define H5O_SHARED_LINK macro!"
+#endif /* H5O_SHARED_LINK */
+
+    /* Check for message tracked elsewhere */
+    if(H5O_IS_TRACKED_SHARED(sh_mesg->type)) {
+        /* Increment the reference count on the shared message/object */
+        if(H5O_shared_link(f, dxpl_id, open_oh, H5O_SHARED_TYPE, sh_mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "unable to increment ref count for shared message")
+    } /* end if */
+#ifdef H5O_SHARED_LINK_REAL
+    else {
+        /* Increment the reference count on the native message directly */
+        if(H5O_SHARED_LINK_REAL(f, dxpl_id, open_oh, _mesg) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "unable to increment ref count for native message")
+    } /* end else */
+#endif /* H5O_SHARED_LINK_REAL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_LINK() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_COPY_FILE
+ *
+ * Purpose:     Copies a message from _SRC to _DEST in file
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, January 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE void *
+H5O_SHARED_COPY_FILE(H5F_t *file_src, void *_native_src, H5F_t *file_dst,
+    hbool_t *recompute_size, unsigned *mesg_flags, H5O_copy_t *cpy_info,
+    void *udata, hid_t dxpl_id)
+{
+    void *dst_mesg = NULL;      /* Destination message */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_COPY_FILE
+#error "Need to define H5O_SHARED_COPY_FILE macro!"
+#endif /* H5O_SHARED_COPY_FILE */
+
+#ifdef H5O_SHARED_COPY_FILE_REAL
+    /* Call native message's copy file callback to copy the message */
+    if(NULL == (dst_mesg = H5O_SHARED_COPY_FILE_REAL(file_src, H5O_SHARED_TYPE, _native_src, file_dst, recompute_size, cpy_info, udata, dxpl_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy native message to another file")
+#else /* H5O_SHARED_COPY_FILE_REAL */
+    /* No copy file callback defined, just copy the message itself */
+    if(NULL == (dst_mesg = (H5O_SHARED_TYPE->copy)(_native_src, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy native message")
+#endif /* H5O_SHARED_COPY_FILE_REAL */
+
+    /* Reset shared message info for new message */
+    HDmemset(dst_mesg, 0, sizeof(H5O_shared_t));
+
+    /* Handle sharing destination message */
+    if(H5O_shared_copy_file(file_src, file_dst, H5O_SHARED_TYPE, _native_src,
+            dst_mesg, recompute_size, mesg_flags, cpy_info, udata, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "unable to determine if message should be shared")
+
+    /* Set return value */
+    ret_value = dst_mesg;
+
+done:
+    if(!ret_value)
+        if(dst_mesg)
+            H5O_msg_free(H5O_SHARED_TYPE->id, dst_mesg);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_COPY_FILE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_POST_COPY_FILE
+ *
+ * Purpose:     Copies a message from _SRC to _DEST in file
+ *
+ * Note:        The actual name of this routine can be different in each source
+ *              file that this header file is included in, and must be defined
+ *              prior to including this header file.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Peter Cao
+ *              May 25, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE herr_t
+H5O_SHARED_POST_COPY_FILE(const H5O_loc_t *oloc_src, const void *mesg_src,
+    H5O_loc_t *oloc_dst, void *mesg_dst, unsigned *mesg_flags, hid_t dxpl_id,
+    H5O_copy_t *cpy_info)
+{
+    const H5O_shared_t  *shared_src = (const H5O_shared_t *)mesg_src; /* Alias to shared info in native source */
+    H5O_shared_t        *shared_dst = (H5O_shared_t *)mesg_dst; /* Alias to shared info in native destination */
+    herr_t              ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(oloc_src->file);
+    HDassert(oloc_dst->file);
+    HDassert(mesg_src);
+    HDassert(mesg_dst);
+    HDassert(cpy_info);
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_POST_COPY_FILE
+#error "Need to define H5O_SHARED_POST_COPY_FILE macro!"
+#endif /* H5O_SHARED_POST_COPY_FILE */
+
+#ifdef H5O_SHARED_POST_COPY_FILE_REAL
+    /* Call native message's post copy file callback to copy the message */
+    if(H5O_SHARED_POST_COPY_FILE_REAL(oloc_src, mesg_src, oloc_dst, mesg_dst, dxpl_id, cpy_info) <0 )
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy native message to another file")
+#endif /* H5O_SHARED_POST_COPY_FILE_REAL */
+
+    /* Update shared message after the post copy - will short circuit in
+     * production if the DEFER pass determined it will not be shared; debug mode
+     * verifies that it is indeed the case */
+    if(H5O_shared_post_copy_file(oloc_dst->file, H5O_SHARED_TYPE,
+            shared_src, shared_dst, mesg_flags, dxpl_id, cpy_info) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to fix shared message in post copy")
+
+#ifdef H5O_SHARED_POST_COPY_FILE_UPD
+    /* Call native message's post copy file update callback to update the
+     * message */
+    if(H5O_SHARED_POST_COPY_FILE_UPD(oloc_src, mesg_src, oloc_dst, mesg_dst, dxpl_id, cpy_info) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to update native message")
+#endif /* H5O_SHARED_POST_COPY_FILE_UPD */
+
+    /* Make sure that if the the source or destination is committed, both are
+     * committed */
+    HDassert((shared_src->type == H5O_SHARE_TYPE_COMMITTED)
+            == (shared_dst->type == H5O_SHARE_TYPE_COMMITTED));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_POST_COPY_FILE() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_SHARED_DEBUG
+ *
+ * Purpose:     Prints debugging info for a potentially shared message.
+ *
+ * Note:	The actual name of this routine can be different in each source
+ *		file that this header file is included in, and must be defined
+ *		prior to including this header file.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, February  3, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE herr_t
+H5O_SHARED_DEBUG(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+    int indent, int fwidth)
+{
+    const H5O_shared_t *sh_mesg = (const H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
+    herr_t ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifndef H5O_SHARED_TYPE
+#error "Need to define H5O_SHARED_TYPE macro!"
+#endif /* H5O_SHARED_TYPE */
+#ifndef H5O_SHARED_DEBUG
+#error "Need to define H5O_SHARED_DEBUG macro!"
+#endif /* H5O_SHARED_DEBUG */
+#ifndef H5O_SHARED_DEBUG_REAL
+#error "Need to define H5O_SHARED_DEBUG_REAL macro!"
+#endif /* H5O_SHARED_DEBUG_REAL */
+
+    /* Check for message stored elsewhere */
+    if(H5O_IS_STORED_SHARED(sh_mesg->type)) {
+        /* Print shared message information */
+        if(H5O_shared_debug(sh_mesg, stream, indent, fwidth) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display shared message info")
+    } /* end if */
+
+    /* Call native message's debug callback */
+    if(H5O_SHARED_DEBUG_REAL(f, dxpl_id, _mesg, stream, indent, fwidth) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to display native message info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_SHARED_DEBUG() */
+
+#endif /* H5Oshared_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Oshmesg.c b/gatb-core/thirdparty/hdf5/src/H5Oshmesg.c
new file mode 100644
index 0000000..deb10ab
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Oshmesg.c
@@ -0,0 +1,248 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* Programmer:  James Laird <jlaird at hdfgroup.org>
+ *              Monday, January 29, 2007
+ *
+ * Purpose:	A message holding "implicitly shared object header message"
+ *              information in the superblock extension.
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+static void  *H5O_shmesg_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_shmesg_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void  *H5O_shmesg_copy(const void *_mesg, void *_dest);
+static size_t H5O_shmesg_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_shmesg_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+			     int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_SHMESG[1] = {{
+    H5O_SHMESG_ID,              /*message id number                     */
+    "shared message table",     /*message name for debugging            */
+    sizeof(H5O_shmesg_table_t),	/*native message size                   */
+    0,				/* messages are sharable?       */
+    H5O_shmesg_decode,		/*decode message                        */
+    H5O_shmesg_encode,		/*encode message                        */
+    H5O_shmesg_copy,            /*copy the native value                 */
+    H5O_shmesg_size,		/*raw message size			*/
+    NULL,                       /*free internal memory			*/
+    NULL,                       /* free method				*/
+    NULL,			/* file delete method			*/
+    NULL,			/* link method				*/
+    NULL,	                /* set share method			*/
+    NULL,		    	/*can share method		        */
+    NULL,			/* pre copy native value to file	*/
+    NULL,			/* copy native value to file		*/
+    NULL,			/* post copy native value to file	*/
+    NULL,			/* get creation index		        */
+    NULL,			/* set creation index		        */
+    H5O_shmesg_debug              /*debug the message			*/
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shmesg_decode
+ *
+ * Purpose:	Decode a shared message table message and return a pointer
+ *              to a newly allocated H5O_shmesg_table_t struct.
+ *
+ * Return:	Success:	Ptr to new message in native struct.
+ *		Failure:	NULL
+ *
+ * Programmer:  James Laird
+ *              Jan 29, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_shmesg_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_shmesg_table_t	*mesg;          /* Native message */
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+
+    if(NULL == (mesg = (H5O_shmesg_table_t *)H5MM_calloc(sizeof(H5O_shmesg_table_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message")
+
+    /* Retrieve version, table address, and number of indexes */
+    mesg->version = *p++;
+    H5F_addr_decode(f, &p, &(mesg->addr));
+    mesg->nindexes = *p++;
+
+    /* Set return value */
+    ret_value = (void *)mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shmesg_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shmesg_encode
+ *
+ * Purpose:	Encode a shared message table message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Jan 29, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_shmesg_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_shmesg_table_t *mesg = (const H5O_shmesg_table_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
+
+    /* Store version, table address, and number of indexes */
+    *p++ = (uint8_t)mesg->version;
+    H5F_addr_encode(f, &p, mesg->addr);
+    *p++ = (uint8_t)mesg->nindexes;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_shmesg_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shmesg_copy
+ *
+ * Purpose:	Copies a message from _MESG to _DEST, allocating _DEST if
+ *		necessary.
+ *
+ * Return:	Success:	Ptr to _DEST
+ *		Failure:	NULL
+ *
+ * Programmer:  James Laird
+ *              Jan 29, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_shmesg_copy(const void *_mesg, void *_dest)
+{
+    const H5O_shmesg_table_t	*mesg = (const H5O_shmesg_table_t *)_mesg;
+    H5O_shmesg_table_t		*dest = (H5O_shmesg_table_t *)_dest;
+    void			*ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(mesg);
+
+    if(!dest && NULL == (dest = (H5O_shmesg_table_t *)H5MM_malloc(sizeof(H5O_shmesg_table_t))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message")
+
+    /* All this message requires is a shallow copy */
+    *dest = *mesg;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shmesg_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shmesg_size
+ *
+ * Purpose:	Returns the size of the raw message in bytes not counting the
+ *		message type or size fields, but only the data fields.
+ *
+ * Return:	Success:	Message data size in bytes w/o alignment.
+ *		Failure:	0
+ *
+ * Programmer:  James Laird
+ *              Jan 29, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_shmesg_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t                   ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+
+    ret_value = (size_t)(1 +                     /* Version number        */
+		H5F_SIZEOF_ADDR(f) +    /* Table address */
+		1);                      /* Number of indexes */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_shmesg_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_shmesg_debug
+ *
+ * Purpose:	Prints debugging info for the message.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Jan 29, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_shmesg_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+    int indent, int fwidth)
+{
+    const H5O_shmesg_table_t *mesg = (const H5O_shmesg_table_t *)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Version:", mesg->version);
+    HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth,
+	      "Shared message table address:", mesg->addr);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Number of indexes:", mesg->nindexes);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_shmesg_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ostab.c b/gatb-core/thirdparty/hdf5/src/H5Ostab.c
new file mode 100644
index 0000000..cfbaacb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ostab.c
@@ -0,0 +1,444 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Ostab.c
+ *                      Aug  6 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Symbol table messages.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Gpkg.h"		/* Groups				*/
+#include "H5HLprivate.h"	/* Local Heaps				*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_stab_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_stab_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_stab_copy(const void *_mesg, void *_dest);
+static size_t H5O_stab_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_stab_free(void *_mesg);
+static herr_t H5O_stab_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg);
+static void *H5O_stab_copy_file(H5F_t *file_src, void *native_src,
+    H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
+    H5O_copy_t *cpy_info, void *_udata, hid_t dxpl_id);
+static herr_t H5O_stab_post_copy_file(const H5O_loc_t *src_oloc,
+    const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst,
+    unsigned *mesg_flags, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_stab_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_STAB[1] = {{
+    H5O_STAB_ID,            	/*message id number             */
+    "stab",                 	/*message name for debugging    */
+    sizeof(H5O_stab_t),     	/*native message size           */
+    0,				/* messages are sharable?       */
+    H5O_stab_decode,        	/*decode message                */
+    H5O_stab_encode,        	/*encode message                */
+    H5O_stab_copy,          	/*copy the native value         */
+    H5O_stab_size,          	/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_stab_free,	        /* free method			*/
+    H5O_stab_delete,	        /* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    H5O_stab_copy_file,		/* copy native value to file    */
+    H5O_stab_post_copy_file,	/* post copy native value to file    */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    H5O_stab_debug         	/*debug the message             */
+}};
+
+/* Declare a free list to manage the H5O_stab_t struct */
+H5FL_DEFINE_STATIC(H5O_stab_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_decode
+ *
+ * Purpose:     Decode a symbol table message and return a pointer to
+ *              a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native order.
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_stab_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_stab_t          *stab = NULL;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* decode */
+    if(NULL == (stab = H5FL_CALLOC(H5O_stab_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    H5F_addr_decode(f, &p, &(stab->btree_addr));
+    H5F_addr_decode(f, &p, &(stab->heap_addr));
+
+    /* Set return value */
+    ret_value = stab;
+
+done:
+    if(ret_value == NULL) {
+        if(stab != NULL)
+            stab = H5FL_FREE(H5O_stab_t, stab);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_stab_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_encode
+ *
+ * Purpose:     Encodes a symbol table message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_stab_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_stab_t       *stab = (const H5O_stab_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(stab);
+
+    /* encode */
+    H5F_addr_encode(f, &p, stab->btree_addr);
+    H5F_addr_encode(f, &p, stab->heap_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_stab_copy(const void *_mesg, void *_dest)
+{
+    const H5O_stab_t       *stab = (const H5O_stab_t *) _mesg;
+    H5O_stab_t             *dest = (H5O_stab_t *) _dest;
+    void                *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(stab);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_stab_t)))
+	HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+    /* copy */
+    *dest = *stab;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_stab_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *
+ *              Failure:        zero
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_stab_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)(2 * H5F_SIZEOF_ADDR(f));
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_stab_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, March 30, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_stab_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_stab_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_stab_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, March 20, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_stab_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *mesg)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(mesg);
+
+    /* Free the file space for the symbol table */
+    if(H5G__stab_delete(f, dxpl_id, (const H5O_stab_t *)mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free symbol table")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_stab_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_copy_file
+ *
+ * Purpose:     Copies a message from _MESG to _DEST in file
+ *
+ * Return:      Success:        Ptr to _DEST
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  Peter Cao
+ *              September 10, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_stab_copy_file(H5F_t *file_src, void *native_src, H5F_t *file_dst,
+    hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
+    H5O_copy_t H5_ATTR_UNUSED *cpy_info, void *_udata, hid_t dxpl_id)
+{
+    H5O_stab_t          *stab_src = (H5O_stab_t *) native_src;
+    H5O_stab_t          *stab_dst = NULL;
+    H5G_copy_file_ud_t  *udata = (H5G_copy_file_ud_t *)_udata;
+    size_t              size_hint;              /* Local heap initial size */
+    void                *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(stab_src);
+    HDassert(file_dst);
+
+    /* Allocate space for the destination stab */
+    if(NULL == (stab_dst = H5FL_MALLOC(H5O_stab_t)))
+        HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Get the old local heap's size and use that as the hint for the new heap */
+    if(H5HL_get_size(file_src, dxpl_id, stab_src->heap_addr, &size_hint) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, NULL, "can't query local heap size")
+
+    /* Create components of symbol table message */
+    if(H5G__stab_create_components(file_dst, stab_dst, size_hint, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't create symbol table components")
+
+    /* Cache stab in udata */
+    udata->cache_type = H5G_CACHED_STAB;
+    udata->cache.stab.btree_addr = stab_dst->btree_addr;
+    udata->cache.stab.heap_addr = stab_dst->heap_addr;
+
+    /* Set return value */
+    ret_value = stab_dst;
+
+done:
+    if(!ret_value)
+        if(stab_dst)
+            stab_dst = H5FL_FREE(H5O_stab_t, stab_dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_stab_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_post_copy_file
+ *
+ * Purpose:     Finish copying a message from between files
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              September 28, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_stab_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+    H5O_loc_t *dst_oloc, void *mesg_dst, unsigned H5_ATTR_UNUSED *mesg_flags,
+    hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+    const H5O_stab_t    *stab_src = (const H5O_stab_t *)mesg_src;
+    H5O_stab_t          *stab_dst = (H5O_stab_t *)mesg_dst;
+    H5G_bt_it_cpy_t     udata;      /* B-tree user data */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(stab_src);
+    HDassert(H5F_addr_defined(dst_oloc->addr));
+    HDassert(dst_oloc->file);
+    HDassert(stab_dst);
+    HDassert(cpy_info);
+
+    /* If we are performing a 'shallow hierarchy' copy, get out now */
+    if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
+        HGOTO_DONE(SUCCEED)
+
+    /* Set up B-tree iteration user data */
+    udata.src_oloc = src_oloc;
+    udata.src_heap_addr = stab_src->heap_addr;
+    udata.dst_file = dst_oloc->file;
+    udata.dst_stab = stab_dst;
+    udata.cpy_info = cpy_info;
+
+    /* Iterate over objects in group, copying them */
+    if((H5B_iterate(src_oloc->file, dxpl_id, H5B_SNODE, stab_src->btree_addr, H5G__node_copy, &udata)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_stab_post_copy_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_stab_debug
+ *
+ * Purpose:     Prints debugging info for a symbol table message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  6 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_stab_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_stab_t       *stab = (const H5O_stab_t *) _mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(stab);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "B-tree address:", stab->btree_addr);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Name heap address:", stab->heap_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Otest.c b/gatb-core/thirdparty/hdf5/src/H5Otest.c
new file mode 100644
index 0000000..0b33e49
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Otest.c
@@ -0,0 +1,569 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Monday, December 4, 2006
+ *
+ * Purpose:	Object header testing functions.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5O_TESTING		/*suppress warning about H5O testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Apkg.h"		/* Attributes	  			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_is_attr_dense_test
+ PURPOSE
+    Determine whether attributes for an object are stored "densely"
+ USAGE
+    htri_t H5O_is_attr_dense_test(oid)
+        hid_t oid;              IN: object to check
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the object is storing attributes in the "dense" or
+    "compact" form.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5O_is_attr_dense_test(hid_t oid)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5O_ainfo_t ainfo;          /* Attribute information for object */
+    H5O_loc_t *loc;             /* Pointer to object's location */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check if dense storage is being used */
+    if(H5F_addr_defined(ainfo.fheap_addr)) {
+        /* Check for any messages in object header */
+        HDassert(H5O_msg_count_real(oh, H5O_MSG_ATTR) == 0);
+
+        ret_value = TRUE;
+    } /* end if */
+    else
+        ret_value = FALSE;
+
+done:
+    if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_is_attr_dense_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_is_attr_empty_test
+ PURPOSE
+    Determine whether there are any attributes for an object
+ USAGE
+    htri_t H5O_is_attr_empty_test(oid)
+        hid_t oid;              IN: object to check
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the object is storing any attributes.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5O_is_attr_empty_test(hid_t oid)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5O_ainfo_t ainfo;          /* Attribute information for object */
+    htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
+    H5O_loc_t *loc;            /* Pointer to object's location */
+    hsize_t nattrs;             /* Number of attributes */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if((ainfo_exists = H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo)) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Retrieve the number of attribute messages in header */
+    nattrs = H5O_msg_count_real(oh, H5O_MSG_ATTR);
+
+    /* Check for later version of object header format & attribute info available */
+    if(oh->version > H5O_VERSION_1) {
+        if(ainfo_exists) {
+            /* Check for using dense storage */
+            if(H5F_addr_defined(ainfo.fheap_addr)) {
+                /* Check for any messages in object header */
+                HDassert(nattrs == 0);
+
+                /* Open the name index v2 B-tree */
+                if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+                /* Retrieve # of records in name index */
+                if(H5B2_get_nrec(bt2_name, &nattrs) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+            } /* end if */
+
+            /* Verify that attribute count in object header is correct */
+            HDassert(nattrs == ainfo.nattrs);
+        } /* end if */
+        else
+            HDassert(nattrs == 0);
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = (nattrs == 0) ? TRUE : FALSE;
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, H5AC_ind_dxpl_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_is_attr_empty_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_num_attrs_test
+ PURPOSE
+    Determine whether there are any attributes for an object
+ USAGE
+    herr_t H5O_num_attrs_test(oid, nattrs)
+        hid_t oid;              IN: object to check
+        hsize_t *nattrs;        OUT: Number of attributes on object
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the # of attributes on an object
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_num_attrs_test(hid_t oid, hsize_t *nattrs)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5O_ainfo_t ainfo;          /* Attribute information for object */
+    H5O_loc_t *loc;            /* Pointer to object's location */
+    hsize_t obj_nattrs;         /* Number of attributes */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Retrieve the number of attribute messages in header */
+    obj_nattrs = H5O_msg_count_real(oh, H5O_MSG_ATTR);
+
+    /* Check for later version of object header format */
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for using dense storage */
+        if(H5F_addr_defined(ainfo.fheap_addr)) {
+            /* Check for any messages in object header */
+            HDassert(obj_nattrs == 0);
+
+            /* Open the name index v2 B-tree */
+            if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+            /* Retrieve # of records in name index */
+            if(H5B2_get_nrec(bt2_name, &obj_nattrs) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+        } /* end if */
+
+        /* Verify that attribute count in object header is correct */
+        HDassert(obj_nattrs == ainfo.nattrs);
+    } /* end if */
+
+    /* Set the number of attributes */
+    *nattrs = obj_nattrs;
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, H5AC_ind_dxpl_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_num_attrs_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_attr_dense_info_test
+ PURPOSE
+    Retrieve information about the state of the "dense" storage for attributes
+ USAGE
+    herr_t H5O_attr_dense_info_test(oid, name_count, corder_count)
+        hid_t oid;              IN: Object to check
+        hsize_t *name_count;    OUT: Number of attributes in name index
+        hsize_t *corder_count;  OUT: Number of attributes in creation order index
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Currently, just retrieves the number of attributes in each index and returns
+    them.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
+    H5B2_t *bt2_corder = NULL;  /* v2 B-tree handle for creation order index */
+    H5O_ainfo_t ainfo;          /* Attribute information for object */
+    H5O_loc_t *loc;            /* Pointer to object's location */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Check for attribute info stored */
+    ainfo.fheap_addr = HADDR_UNDEF;
+    if(oh->version > H5O_VERSION_1) {
+        /* Check for (& retrieve if available) attribute info */
+        if(H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo) < 0)
+            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+    } /* end if */
+
+    /* Check for 'dense' attribute storage file addresses being defined */
+    if(!H5F_addr_defined(ainfo.fheap_addr))
+        HGOTO_DONE(FAIL)
+    if(!H5F_addr_defined(ainfo.name_bt2_addr))
+        HGOTO_DONE(FAIL)
+
+    /* Open the name index v2 B-tree */
+    if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+    /* Retrieve # of records in name index */
+    if(H5B2_get_nrec(bt2_name, name_count) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+
+    /* Check if there is a creation order index */
+    if(H5F_addr_defined(ainfo.corder_bt2_addr)) {
+        /* Open the creation order index v2 B-tree */
+        if(NULL == (bt2_corder = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.corder_bt2_addr, NULL)))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+
+        /* Retrieve # of records in creation order index */
+        if(H5B2_get_nrec(bt2_corder, corder_count) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
+    } /* end if */
+    else
+        *corder_count = 0;
+
+done:
+    /* Release resources */
+    if(bt2_name && H5B2_close(bt2_name, H5AC_ind_dxpl_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for name index")
+    if(bt2_corder && H5B2_close(bt2_corder, H5AC_ind_dxpl_id) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for creation order index")
+    if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_attr_dense_info_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_check_msg_marked_test
+ PURPOSE
+    Check if an unknown message with the "mark if unknown" flag actually gets
+    marked.
+ USAGE
+    herr_t H5O_check_msg_marked_test(oid, flag_val)
+        hid_t oid;              IN: Object to check
+        hbool_t flag_val;       IN: Desired flag value
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Locates the "unknown" message and checks that the "was unknown" flag is set
+    correctly.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5O_loc_t *loc;            /* Pointer to object's location */
+    H5O_mesg_t *idx_msg;        /* Pointer to message */
+    unsigned idx;               /* Index of message */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Locate "unknown" message  */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(idx_msg->type->id == H5O_UNKNOWN_ID) {
+            /* Check for "unknown" message having the correct flags */
+            if(((idx_msg->flags & H5O_MSG_FLAG_WAS_UNKNOWN) > 0) != flag_val)
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "'unknown' message has incorrect 'was unknown' flag value")
+
+            /* Break out of loop, to indicate that the "unknown" message was found */
+            break;
+        } /* end if */
+
+    /* Check for not finding an "unknown" message */
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "'unknown' message type not found")
+
+done:
+    if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_check_msg_marked_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_expunge_chunks_test
+ PURPOSE
+    Expunge all the chunks for an object header from the cache.
+ USAGE
+    herr_t H5O_expunge_chunks_test(f, dxpl_id, loc)
+        H5F_t *f;               IN: Pointer to file that object is within
+        hid_t dxpl_id;          IN: DXPL to use for operation
+        H5O_loc_t *loc;         IN: Object location for object header to expunge
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Iterates over all the chunks for an object header an expunges each from the
+    metadata cache.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_expunge_chunks_test(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    haddr_t chk_addr[16];       /* Array of chunk addresses */
+    size_t nchunks;             /* Number of chunks in object header */
+    size_t u;                   /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Safety check */
+    nchunks = oh->nchunks;
+    HDassert(0 < nchunks && nchunks < NELMTS(chk_addr));
+
+    /* Iterate over all the chunks, saving the chunk addresses */
+    for(u = 0; u < oh->nchunks; u++)
+        chk_addr[u] = oh->chunk[u].addr;
+
+    /* Release the object header */
+    if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header")
+
+    /* Iterate over all the saved chunk addresses, evicting them from the cache */
+    /* (in reverse order, so that chunk #0 is unpinned) */
+    for(u = nchunks - 1; u < nchunks; u--)
+        if(H5AC_expunge_entry(loc->file, dxpl_id, (u == 0 ? H5AC_OHDR : H5AC_OHDR_CHK), chk_addr[u], H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTEXPUNGE, FAIL, "unable to expunge object header chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_expunge_chunks_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_get_rc
+ PURPOSE
+    Retrieve the refcount for the object header
+ USAGE
+    herr_t H5O_expunge_chunks_test(loc, dxpl_id, rc)
+        const H5O_loc_t *loc;   IN: Object location for object header to query
+        hid_t dxpl_id;          IN: DXPL to use for operation
+        unsigned *rc;           OUT: Pointer to refcount for object header
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Protects object header, retrieves the object header's refcount, and
+    unprotects object header.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_get_rc(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(loc);
+    HDassert(rc);
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Save the refcount for the object header */
+    *rc = oh->nlink;
+
+done:
+    /* Release the object header */
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5O_expunge_chunks_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ounknown.c b/gatb-core/thirdparty/hdf5/src/H5Ounknown.c
new file mode 100644
index 0000000..548f74d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ounknown.c
@@ -0,0 +1,89 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Ounknown.c
+ *                      Apr 19 2007
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             Handle unknown message classes in a minimal way.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Opkg.h"             /* Object headers			*/
+
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5O_unknown_free(void *_mesg);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_UNKNOWN[1] = {{
+    H5O_UNKNOWN_ID,           	/*message id number             */
+    "unknown",                	/*message name for debugging    */
+    0,				/*native message size           */
+    0,			        /* messages are sharable?       */
+    NULL,			/*decode message                */
+    NULL,			/*encode message                */
+    NULL,			/*copy the native value         */
+    NULL,			/*size of symbol table entry    */
+    NULL,                   	/*default reset method          */
+    H5O_unknown_free,	        /* free method			*/
+    NULL,			/* file delete method		*/
+    NULL,			/* link method			*/
+    NULL, 			/*set share method		*/
+    NULL,		    	/*can share method		*/
+    NULL,			/* pre copy native value to file */
+    NULL,			/* copy native value to file    */
+    NULL,			/* post copy native value to file */
+    NULL,			/* get creation index		*/
+    NULL,			/* set creation index		*/
+    NULL			/*debug the message             */
+}};
+
+/* Declare a free list to manage the H5O_unknown_t struct */
+H5FL_DEFINE(H5O_unknown_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_unknown_free
+ *
+ * Purpose:	Free's the message
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, May 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_unknown_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_unknown_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_unknown_free() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5P.c b/gatb-core/thirdparty/hdf5/src/H5P.c
new file mode 100644
index 0000000..fc19dd1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5P.c
@@ -0,0 +1,1620 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:	Generic Property Functions
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5P__init_pub_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for property iterator callback */
+typedef struct {
+    H5P_iterate_t iter_func;    /* Iterator callback */
+    hid_t id;                   /* Property list or class ID */
+    void *iter_data;            /* Iterator callback pointer */
+} H5P_iter_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5P__init_pub_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5P__init_pub_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5P_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__init_pub_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5P_init())
+} /* H5P__init_pub_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5P__term_pub_interface -- Terminate interface
+USAGE
+    herr_t H5P__term_pub_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5P__term_pub_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5P__term_pub_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pcopy
+ PURPOSE
+    Routine to copy a property list or class
+ USAGE
+    hid_t H5Pcopy(id)
+        hid_t id;           IN: Property list or class ID to copy
+ RETURNS
+    Success: valid property list ID on success (non-negative)
+    Failure: negative
+ DESCRIPTION
+    Copy a property list or class and return the ID.  This routine calls the
+    class 'copy' callback after any property 'copy' callbacks are called
+    (assuming all property 'copy' callbacks return successfully).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pcopy(hid_t id)
+{
+    void *obj;                  /* Property object to copy */
+    hid_t ret_value=FALSE;      /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", id);
+
+    if(H5P_DEFAULT==id)
+        HGOTO_DONE(H5P_DEFAULT);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property object");
+    if(NULL == (obj = H5I_object(id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist");
+
+    /* Compare property lists */
+    if(H5I_GENPROP_LST == H5I_get_type(id)) {
+        if((ret_value = H5P_copy_plist((H5P_genplist_t *)obj, TRUE)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property list");
+    } /* end if */
+    /* Must be property classes */
+    else {
+        H5P_genclass_t *copy_class;      /* Copy of class */
+
+        /* Copy the class */
+        if((copy_class = H5P_copy_pclass((H5P_genclass_t *)obj)) == NULL)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property class");
+
+        /* Get an atom for the copied class */
+        if((ret_value = H5I_register(H5I_GENPROP_CLS, copy_class, TRUE)) < 0) {
+            H5P_close_class(copy_class);
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class");
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pcopy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pcreate_class
+ PURPOSE
+    Create a new property list class.
+ USAGE
+    hid_t H5Pcreate_class(parent, name, cls_create, create_data,
+                cls_close, close_data)
+        hid_t parent;       IN: Property list class ID of parent class
+        const char *name;   IN: Name of class we are creating
+        H5P_cls_create_func_t cls_create;   IN: The callback function to call
+                                    when each property list in this class is
+                                    created.
+        void *create_data;  IN: Pointer to user data to pass along to class
+                                    creation callback.
+        H5P_cls_copy_func_t cls_copy;   IN: The callback function to call
+                                    when each property list in this class is
+                                    copied.
+        void *copy_data;  IN: Pointer to user data to pass along to class
+                                    copy callback.
+        H5P_cls_close_func_t cls_close;     IN: The callback function to call
+                                    when each property list in this class is
+                                    closed.
+        void *close_data;   IN: Pointer to user data to pass along to class
+                                    close callback.
+ RETURNS
+    Returns a valid property list class ID on success, NULL on failure.
+ DESCRIPTION
+    Allocates memory and attaches a class to the property list class hierarchy.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pcreate_class(hid_t parent, const char *name,
+    H5P_cls_create_func_t cls_create, void *create_data,
+    H5P_cls_copy_func_t cls_copy, void *copy_data,
+    H5P_cls_close_func_t cls_close, void *close_data
+    )
+{
+    H5P_genclass_t	*par_class = NULL;  /* Pointer to the parent class */
+    H5P_genclass_t	*pclass = NULL;     /* Property list class created */
+    hid_t	ret_value;                  /* Return value		   */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("i", "i*sx*xx*xx*x", parent, name, cls_create, create_data, cls_copy,
+             copy_data, cls_close, close_data);
+
+    /* Check arguments. */
+    if(H5P_DEFAULT!=parent && (H5I_GENPROP_CLS!=H5I_get_type(parent)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid class name")
+    if((create_data != NULL && cls_create == NULL)
+            || (copy_data != NULL && cls_copy == NULL)
+            || (close_data != NULL && cls_close == NULL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data specified, but no callback provided")
+
+    /* Get the pointer to the parent class */
+    if(parent == H5P_DEFAULT)
+        par_class = NULL;
+    else if(NULL == (par_class = (H5P_genclass_t *)H5I_object(parent)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't retrieve parent class")
+
+    /* Create the new property list class */
+    if(NULL == (pclass = H5P_create_class(par_class, name, H5P_TYPE_USER, cls_create, create_data, cls_copy, copy_data, cls_close, close_data)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list class")
+
+    /* Get an atom for the class */
+    if((ret_value = H5I_register(H5I_GENPROP_CLS, pclass, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class")
+
+done:
+    if(ret_value < 0 && pclass)
+        H5P_close_class(pclass);
+
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pcreate_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pcreate
+ PURPOSE
+    Routine to create a new property list of a property list class.
+ USAGE
+    hid_t H5Pcreate(cls_id)
+        hid_t cls_id;       IN: Property list class create list from
+ RETURNS
+    Returns a valid property list ID on success, FAIL on failure.
+ DESCRIPTION
+        Creates a property list of a given class.  If a 'create' callback
+    exists for the property list class, it is called before the
+    property list is passed back to the user.  If 'create' callbacks exist for
+    any individual properties in the property list, they are called before the
+    class 'create' callback.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pcreate(hid_t cls_id)
+{
+    H5P_genclass_t	*pclass;   /* Property list class to modify */
+    hid_t ret_value;               /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", cls_id);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(cls_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class");
+
+    /* Create the new property list */
+    if((ret_value = H5P_create_id(pclass, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pcreate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pregister2
+ PURPOSE
+    Routine to register a new property in a property list class.
+ USAGE
+    herr_t H5Pregister2(class, name, size, default, prp_create, prp_set, prp_get, prp_close)
+        hid_t class;            IN: Property list class to close
+        const char *name;       IN: Name of property to register
+        size_t size;            IN: Size of property in bytes
+        void *def_value;        IN: Pointer to buffer containing default value
+                                    for property in newly created property lists
+        H5P_prp_create_func_t prp_create;   IN: Function pointer to property
+                                    creation callback
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Registers a new property with a property list class.  The property will
+    exist in all property list objects of that class after this routine is
+    finished.  The name of the property must not already exist.  The default
+    property value must be provided and all new property lists created with this
+    property will have the property value set to the default provided.  Any of
+    the callback routines may be set to NULL if they are not needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'default' pointer for a
+    zero-sized property may be set to NULL.  The property 'create' & 'close'
+    callbacks are called for zero-sized properties, but the 'set' and 'get'
+    callbacks are never called.
+
+        The 'create' callback is called when a new property list with this
+    property is being created.  H5P_prp_create_func_t is defined as:
+        typedef herr_t (*H5P_prp_create_func_t)(hid_t prop_id, const char *name,
+                size_t size, void *initial_value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being created.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *initial_value; IN/OUT: The initial value for the property being created.
+                                (The 'default' value passed to H5Pregister2)
+    The 'create' routine may modify the value to be set and those changes will
+    be stored as the initial value of the property.  If the 'create' routine
+    returns a negative value, the new property value is not copied into the
+    property and the property list creation routine returns an error value.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pregister2(hid_t cls_id, const char *name, size_t size, void *def_value,
+    H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close)
+{
+    H5P_genclass_t *pclass;     /* Property list class to modify */
+    H5P_genclass_t *orig_pclass; /* Original property class */
+    herr_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE11("e", "i*sz*xxxxxxxx", cls_id, name, size, def_value, prp_create,
+             prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(cls_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid class name")
+    if(size > 0 && def_value == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default")
+
+    /* Create the new property list class */
+    orig_pclass = pclass;
+    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in class")
+
+    /* Check if the property class changed and needs to be substituted in the ID */
+    if(pclass != orig_pclass) {
+        H5P_genclass_t *old_pclass;     /* Old property class */
+
+        /* Substitute the new property class in the ID */
+        if(NULL == (old_pclass = (H5P_genclass_t *)H5I_subst(cls_id, pclass)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to substitute property class in ID")
+        HDassert(old_pclass == orig_pclass);
+
+        /* Close the previous class */
+        if(H5P_close_class(old_pclass) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "unable to close original property class after substitution")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pregister2() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pinsert2
+ PURPOSE
+    Routine to insert a new property in a property list.
+ USAGE
+    herr_t H5Pinsert2(plist, name, size, value, prp_set, prp_get, prp_close)
+        hid_t plist;            IN: Property list to add property to
+        const char *name;       IN: Name of property to add
+        size_t size;            IN: Size of property in bytes
+        void *value;            IN: Pointer to the value for the property
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Inserts a temporary property into a property list.  The property will
+    exist only in this property list object.  The name of the property must not
+    already exist.  The value must be provided unless the property is zero-
+    sized.  Any of the callback routines may be set to NULL if they are not
+    needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'value' pointer for a
+    zero-sized property may be set to NULL.  The property 'close' callback is
+    called for zero-sized properties, but the 'set' and 'get' callbacks are
+    never called.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        There is no 'create' callback routine for temporary property list
+    objects, the initial value is assumed to have any necessary setup already
+    performed on it.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pinsert2(hid_t plist_id, const char *name, size_t size, void *value,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close)
+{
+    H5P_genplist_t	*plist;    /* Property list to modify */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE10("e", "i*sz*xxxxxxx", plist_id, name, size, value, prp_set, prp_get,
+             prp_delete, prp_copy, prp_cmp, prp_close);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name")
+    if(size > 0 && value == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default")
+
+    /* Create the new property list class */
+    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in plist")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pinsert2() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pset
+ PURPOSE
+    Routine to set a property's value in a property list.
+ USAGE
+    herr_t H5P_set(plist_id, name, value)
+        hid_t plist_id;         IN: Property list to find property in
+        const char *name;       IN: Name of property to set
+        void *value;            IN: Pointer to the value for the property
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Sets a new value for a property in a property list.  The property name
+    must exist or this routine will fail.  If there is a 'set' callback routine
+    registered for this property, the 'value' will be passed to that routine and
+    any changes to the 'value' will be used when setting the property value.
+    The information pointed at by the 'value' pointer (possibly modified by the
+    'set' callback) is copied into the property list value and may be changed
+    by the application making the H5Pset call without affecting the property
+    value.
+
+        If the 'set' callback routine returns an error, the property value will
+    not be modified.  This routine may not be called for zero-sized properties
+    and will return an error in that case.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pset(hid_t plist_id, const char *name, void *value)
+{
+    H5P_genplist_t *plist;      /* Property list to modify */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*x", plist_id, name, value);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+    if(value==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalied property value");
+
+    /* Go set the value */
+    if(H5P_set(plist,name,value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to set value in plist");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pexist
+ PURPOSE
+    Routine to query the existance of a property in a property object.
+ USAGE
+    htri_t H5P_exist(id, name)
+        hid_t id;           IN: Property object ID to check
+        const char *name;   IN: Name of property to check for
+ RETURNS
+    Success: Positive if the property exists in the property object, zero
+            if the property does not exist.
+    Failure: negative value
+ DESCRIPTION
+        This routine checks if a property exists within a property list or
+    class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5Pexist(hid_t id, const char *name)
+{
+    H5P_genplist_t	*plist;    /* Property list to query */
+    H5P_genclass_t	*pclass;   /* Property class to query */
+    htri_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "i*s", id, name);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+
+    /* Check for the existance of the property in the list or class */
+    if(H5I_GENPROP_LST == H5I_get_type(id)) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+        if((ret_value = H5P_exist_plist(plist, name)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "property does not exist in list");
+    } /* end if */
+    else
+        if(H5I_GENPROP_CLS == H5I_get_type(id)) {
+            if(NULL == (pclass = (H5P_genclass_t *)H5I_object(id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property class");
+            if((ret_value = H5P_exist_pclass(pclass, name)) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "property does not exist in class");
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pexist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget_size
+ PURPOSE
+    Routine to query the size of a property in a property list or class.
+ USAGE
+    herr_t H5Pget_size(id, name)
+        hid_t id;               IN: ID of property list or class to check
+        const char *name;       IN: Name of property to query
+        size_t *size;           OUT: Size of property
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This routine retrieves the size of a property's value in bytes.  Zero-
+    sized properties are allowed and return a value of 0.  This function works
+    for both property lists and classes.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pget_size(hid_t id, const char *name, size_t *size)
+{
+    H5P_genclass_t	*pclass;   /* Property class to query */
+    H5P_genplist_t	*plist;    /* Property list to query */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*z", id, name, size);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+    if(size==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property size");
+
+    if(H5I_GENPROP_LST == H5I_get_type(id)) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+
+        /* Check the property size */
+        if((ret_value = H5P_get_size_plist(plist, name, size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to query size in plist");
+    } /* end if */
+    else
+        if(H5I_GENPROP_CLS == H5I_get_type(id)) {
+            if(NULL == (pclass = (H5P_genclass_t *)H5I_object(id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+
+            /* Check the property size */
+            if((ret_value = H5P_get_size_pclass(pclass, name, size)) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to query size in plist");
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget_class
+ PURPOSE
+    Routine to query the class of a generic property list
+ USAGE
+    hid_t H5Pget_class(plist_id)
+        hid_t plist_id;         IN: Property list to query
+ RETURNS
+    Success: ID of class object
+    Failure: negative
+ DESCRIPTION
+    This routine retrieves the class of a property list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Change the name of this function to H5Pget_class (and remove old H5Pget_class)
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pget_class(hid_t plist_id)
+{
+    H5P_genplist_t	*plist;         /* Property list to query */
+    H5P_genclass_t	*pclass=NULL;   /* Property list class */
+    hid_t ret_value=FAIL;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", plist_id);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+
+    /* Retrieve the property list class */
+    if((pclass = H5P_get_class(plist)) == NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "unable to query class of property list");
+
+    /* Increment the outstanding references to the class object */
+    if(H5P_access_class(pclass, H5P_MOD_INC_REF) < 0)
+        HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL,"Can't increment class ID ref count");
+
+    /* Get an atom for the class */
+    if((ret_value = H5I_register(H5I_GENPROP_CLS, pclass, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class");
+
+done:
+    if(ret_value<0 && pclass)
+        H5P_close_class(pclass);
+
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget_nprops
+ PURPOSE
+    Routine to query the size of a property in a property list or class.
+ USAGE
+    herr_t H5Pget_nprops(id, nprops)
+        hid_t id;               IN: ID of Property list or class to check
+        size_t *nprops;         OUT: Number of properties in the property object
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This routine retrieves the number of properties in a property list or
+    class.  If a property class ID is given, the number of registered properties
+    in the class is returned in NPROPS.  If a property list ID is given, the
+    current number of properties in the list is returned in NPROPS.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pget_nprops(hid_t id, size_t *nprops)
+{
+    H5P_genplist_t	*plist;    /* Property list to query */
+    H5P_genclass_t	*pclass;   /* Property class to query */
+    herr_t ret_value=SUCCEED;      /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*z", id, nprops);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+    if(nprops==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property nprops pointer");
+
+    if(H5I_GENPROP_LST == H5I_get_type(id)) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object(id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+        if(H5P_get_nprops_plist(plist, nprops) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to query # of properties in plist");
+    } /* end if */
+    else
+        if(H5I_GENPROP_CLS == H5I_get_type(id)) {
+            if(NULL == (pclass = (H5P_genclass_t *)H5I_object(id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property class");
+            if(H5P_get_nprops_pclass(pclass, nprops, FALSE) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to query # of properties in pclass");
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget_nprops() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pequal
+ PURPOSE
+    Routine to query whether two property lists or two property classes are equal
+ USAGE
+    htri_t H5Pequal(id1, id2)
+        hid_t id1;         IN: Property list or class ID to compare
+        hid_t id2;         IN: Property list or class ID to compare
+ RETURNS
+    Success: TRUE if equal, FALSE if unequal
+    Failure: negative
+ DESCRIPTION
+    Determines whether two property lists or two property classes are equal.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5Pequal(hid_t id1, hid_t id2)
+{
+    void *obj1, *obj2;          /* Property objects to compare */
+    htri_t ret_value = FALSE;     /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "ii", id1, id2);
+
+    /* Check arguments. */
+    if((H5I_GENPROP_LST != H5I_get_type(id1) && H5I_GENPROP_CLS != H5I_get_type(id1))
+            || (H5I_GENPROP_LST != H5I_get_type(id2) && H5I_GENPROP_CLS != H5I_get_type(id2)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property objects")
+    if(H5I_get_type(id1) != H5I_get_type(id2))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not the same kind of property objects")
+    if(NULL == (obj1 = H5I_object(id1)) || NULL == (obj2 = H5I_object(id2)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist")
+
+    /* Compare property lists */
+    if(H5I_GENPROP_LST == H5I_get_type(id1)) {
+        int cmp_ret = 0;
+
+        if(H5P_cmp_plist((const H5P_genplist_t *)obj1, (const H5P_genplist_t *)obj2, &cmp_ret) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOMPARE, FAIL, "can't compare property lists")
+
+        /* Set return value */
+        ret_value = cmp_ret == 0 ? TRUE : FALSE;
+    } /* end if */
+    /* Must be property classes */
+    else {
+        if(H5P_cmp_class((const H5P_genclass_t *)obj1, (const H5P_genclass_t *)obj2) == 0)
+            ret_value = TRUE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pequal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pisa_class
+ PURPOSE
+    Routine to query whether a property list is a certain class
+ USAGE
+    hid_t H5Pisa_class(plist_id, pclass_id)
+        hid_t plist_id;         IN: Property list to query
+        hid_t pclass_id;        IN: Property class to query
+ RETURNS
+    Success: TRUE (1) or FALSE (0)
+    Failure: negative
+ DESCRIPTION
+    This routine queries whether a property list is a member of the property
+    list class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    What about returning a value indicating that the property class is further
+    up the class hierarchy?
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5Pisa_class(hid_t plist_id, hid_t pclass_id)
+{
+    htri_t ret_value;                   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "ii", plist_id, pclass_id);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(plist_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+    if(H5I_GENPROP_CLS != H5I_get_type(pclass_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property class");
+
+    /* Compare the property list's class against the other class */
+    if((ret_value = H5P_isa_class(plist_id, pclass_id)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to compare property list classes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pisa_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__iterate_cb
+ PURPOSE
+    Internal callback routine when iterating over properties in property list
+    or class
+ USAGE
+    int H5P__iterate_cb(prop, udata)
+        H5P_genprop_t *prop;        IN: Pointer to the property
+        void *udata;                IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC
+    Failure: negative value
+ DESCRIPTION
+    This routine calls the actual callback routine for the property in the
+property list or class.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__iterate_cb(H5P_genprop_t *prop, void *_udata)
+{
+    H5P_iter_ud_t *udata = (H5P_iter_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = 0;                                  /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(prop);
+    HDassert(udata);
+
+    /* Call the user's callback routine */
+    ret_value = (*udata->iter_func)(udata->id, prop->name, udata->iter_data);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__iterate_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Piterate
+ PURPOSE
+    Routine to iterate over the properties in a property list or class
+ USAGE
+    int H5Piterate(pclass_id, idx, iter_func, iter_data)
+        hid_t id;                   IN: ID of property object to iterate over
+        int *idx;                   IN/OUT: Index of the property to begin with
+        H5P_iterate_t iter_func;    IN: Function pointer to function to be
+                                        called with each property iterated over.
+        void *iter_data;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC if it was
+                non-zero, or zero if all properties have been processed.
+    Failure: negative value
+ DESCRIPTION
+    This routine iterates over the properties in the property object specified
+with ID.  The properties in both property lists and classes may be iterated
+over with this function.  For each property in the object, the ITER_DATA and
+some additional information, specified below, are passed to the ITER_FUNC
+function.  The iteration begins with the IDX property in the object and the
+next element to be processed by the operator is returned in IDX.  If IDX is
+NULL, then the iterator starts at the first property; since no stopping point
+is returned in this case, the iterator cannot be restarted if one of the calls
+to its operator returns non-zero.  The IDX value is 0-based (ie. to start at
+the "first" property, the IDX value should be 0).
+
+The prototype for H5P_iterate_t is:
+    typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
+The operation receives the property list or class identifier for the object
+being iterated over, ID, the name of the current property within the object,
+NAME, and the pointer to the operator data passed in to H5Piterate, ITER_DATA.
+
+The return values from an operator are:
+    Zero causes the iterator to continue, returning zero when all properties
+        have been processed.
+    Positive causes the iterator to immediately return that positive value,
+        indicating short-circuit success. The iterator can be restarted at the
+        index of the next property.
+    Negative causes the iterator to immediately return that value, indicating
+        failure. The iterator can be restarted at the index of the next
+        property.
+
+H5Piterate assumes that the properties in the object identified by ID remains
+unchanged through the iteration.  If the membership changes during the
+iteration, the function's behavior is undefined.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5Piterate(hid_t id, int *idx, H5P_iterate_t iter_func, void *iter_data)
+{
+    H5P_iter_ud_t udata;    /* User data for internal iterator callback */
+    int fake_idx = 0;       /* Index when user doesn't provide one */
+    void *obj;              /* Property object to copy */
+    int ret_value;          /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Is", "i*Isx*x", id, idx, iter_func, iter_data);
+
+    /* Check arguments. */
+    if(H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+    if(NULL == (obj = H5I_object(id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist");
+    if(iter_func == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration callback");
+
+    /* Set up user data */
+    udata.iter_func = iter_func;
+    udata.id = id;
+    udata.iter_data = iter_data;
+
+    if(H5I_GENPROP_LST == H5I_get_type(id)) {
+        /* Iterate over a property list */
+        if((ret_value = H5P_iterate_plist((H5P_genplist_t *)obj, TRUE, (idx ? idx : &fake_idx), H5P__iterate_cb, &udata)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to iterate over list");
+    } /* end if */
+    else
+        if(H5I_GENPROP_CLS == H5I_get_type(id)) {
+            /* Iterate over a property class */
+            if((ret_value = H5P_iterate_pclass((H5P_genclass_t *)obj, (idx ? idx : &fake_idx), H5P__iterate_cb, &udata)) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to iterate over class");
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property object");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Piterate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget
+ PURPOSE
+    Routine to query the value of a property in a property list.
+ USAGE
+    herr_t H5Pget(plist_id, name, value)
+        hid_t plist_id;         IN: Property list to check
+        const char *name;       IN: Name of property to query
+        void *value;            OUT: Pointer to the buffer for the property value
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Retrieves a copy of the value for a property in a property list.  The
+    property name must exist or this routine will fail.  If there is a
+    'get' callback routine registered for this property, the copy of the
+    value of the property will first be passed to that routine and any changes
+    to the copy of the value will be used when returning the property value
+    from this routine.
+        If the 'get' callback routine returns an error, 'value' will not be
+    modified and this routine will return an error.  This routine may not be
+    called for zero-sized properties.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pget(hid_t plist_id, const char *name, void *value)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*x", plist_id, name, value);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+    if(value==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalied property value");
+
+    /* Go get the value */
+    if(H5P_get(plist,name,value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query property value");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Premove
+ PURPOSE
+    Routine to remove a property from a property list.
+ USAGE
+    herr_t H5Premove(plist_id, name)
+        hid_t plist_id;         IN: Property list to modify
+        const char *name;       IN: Name of property to remove
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Removes a property from a property list.  Both properties which were
+    in existance when the property list was created (i.e. properties registered
+    with H5Pregister2) and properties added to the list after it was created
+    (i.e. added with H5Pinsert2) may be removed from a property list.
+    Properties do not need to be removed a property list before the list itself
+    is closed, they will be released automatically when H5Pclose is called.
+    The 'close' callback for this property is called before the property is
+    release, if the callback exists.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Premove(hid_t plist_id, const char *name)
+{
+    H5P_genplist_t	*plist;    /* Property list to modify */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", plist_id, name);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+
+    /* Create the new property list class */
+    if((ret_value = H5P_remove(plist_id,plist,name)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Premove() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pcopy_prop
+ PURPOSE
+    Routine to copy a property from one list or class to another
+ USAGE
+    herr_t H5Pcopy_prop(dst_id, src_id, name)
+        hid_t dst_id;               IN: ID of destination property list or class
+        hid_t src_id;               IN: ID of source property list or class
+        const char *name;           IN: Name of property to copy
+ RETURNS
+    Success: non-negative value.
+    Failure: negative value.
+ DESCRIPTION
+    Copies a property from one property list or class to another.
+
+    If a property is copied from one class to another, all the property
+    information will be first deleted from the destination class and then the
+    property information will be copied from the source class into the
+    destination class.
+
+    If a property is copied from one list to another, the property will be
+    first deleted from the destination list (generating a call to the 'close'
+    callback for the property, if one exists) and then the property is copied
+    from the source list to the destination list (generating a call to the
+    'copy' callback for the property, if one exists).
+
+    If the property does not exist in the destination class or list, this call
+    is equivalent to calling H5Pregister2 or H5Pinsert2 (for a class or list, as
+    appropriate) and the 'create' callback will be called in the case of the
+    property being copied into a list (if such a callback exists for the
+    property).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pcopy_prop(hid_t dst_id, hid_t src_id, const char *name)
+{
+    H5I_type_t src_id_type, dst_id_type;        /* ID types */
+    herr_t ret_value = SUCCEED;     /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii*s", dst_id, src_id, name);
+
+    /* Check arguments. */
+    if((src_id_type = H5I_get_type(src_id)) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid source ID")
+    if((dst_id_type = H5I_get_type(dst_id)) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid destination ID")
+    if((H5I_GENPROP_LST != src_id_type && H5I_GENPROP_CLS != src_id_type)
+            || (H5I_GENPROP_LST != dst_id_type && H5I_GENPROP_CLS != dst_id_type))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property objects")
+    if(src_id_type != dst_id_type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not the same kind of property objects")
+    if(!name || !*name)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name given")
+
+    /* Compare property lists */
+    if(H5I_GENPROP_LST == src_id_type) {
+        if(H5P_copy_prop_plist(dst_id, src_id, name) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property between lists")
+    } /* end if */
+    /* Must be property classes */
+    else {
+        if(H5P_copy_prop_pclass(dst_id, src_id, name) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property between classes")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pcopy_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Punregister
+ PURPOSE
+    Routine to remove a property from a property list class.
+ USAGE
+    herr_t H5Punregister(pclass_id, name)
+        hid_t pclass_id;         IN: Property list class to modify
+        const char *name;       IN: Name of property to remove
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Removes a property from a property list class.  Future property lists
+    created of that class will not contain this property.  Existing property
+    lists containing this property are not affected.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Punregister(hid_t pclass_id, const char *name)
+{
+    H5P_genclass_t	*pclass;   /* Property list class to modify */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", pclass_id, name);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(pclass_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
+
+    /* Remove the property list from class */
+    if((ret_value = H5P_unregister(pclass, name)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to remove property from class");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Punregister() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pclose
+ PURPOSE
+    Routine to close a property list.
+ USAGE
+    herr_t H5Pclose(plist_id)
+        hid_t plist_id;       IN: Property list to close
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Closes a property list.  If a 'close' callback exists for the property
+    list class, it is called before the property list is destroyed.  If 'close'
+    callbacks exist for any individual properties in the property list, they are
+    called after the class 'close' callback.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pclose(hid_t plist_id)
+{
+    herr_t ret_value = SUCCEED;      /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", plist_id);
+
+    /* Allow default property lists to pass through without throwing an error */
+    if(H5P_DEFAULT != plist_id) {
+        /* Check arguments. */
+        if(H5I_GENPROP_LST != H5I_get_type(plist_id))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+        /* Close the property list */
+        if(H5I_dec_app_ref(plist_id) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't close")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pclose() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget_class_name
+ PURPOSE
+    Routine to query the name of a generic property list class
+ USAGE
+    char *H5Pget_class_name(pclass_id)
+        hid_t pclass_id;         IN: Property class to query
+ RETURNS
+    Success: Pointer to a malloc'ed string containing the class name
+    Failure: NULL
+ DESCRIPTION
+        This routine retrieves the name of a generic property list class.
+    The pointer to the name must be free'd by the user for successful calls.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+char *
+H5Pget_class_name(hid_t pclass_id)
+{
+    H5P_genclass_t	*pclass;    /* Property class to query */
+    char *ret_value;       /* return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE1("*s", "i", pclass_id);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(pclass_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property class");
+
+    /* Get the property list class name */
+    if((ret_value = H5P_get_class_name(pclass)) == NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, NULL, "unable to query name of class");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget_class_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pget_class_parent
+ PURPOSE
+    routine to query the parent class of a generic property class
+ USAGE
+    hid_t H5Pget_class_parent(pclass_id)
+        hid_t pclass_id;         IN: Property class to query
+ RETURNS
+    Success: ID of parent class object
+    Failure: NULL
+ DESCRIPTION
+    This routine retrieves an ID for the parent class of a property class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pget_class_parent(hid_t pclass_id)
+{
+    H5P_genclass_t	*pclass;    /* Property class to query */
+    H5P_genclass_t	*parent = NULL;   /* Parent's property class */
+    hid_t ret_value;       /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", pclass_id);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(pclass_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property class")
+
+    /* Retrieve the property class's parent */
+    if(NULL == (parent = H5P_get_class_parent(pclass)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "unable to query class of property list")
+
+    /* Increment the outstanding references to the class object */
+    if(H5P_access_class(parent, H5P_MOD_INC_REF) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Can't increment class ID ref count")
+
+    /* Get an atom for the class */
+    if((ret_value = H5I_register(H5I_GENPROP_CLS, parent, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class")
+
+done:
+    if(ret_value < 0 && parent)
+        H5P_close_class(parent);
+
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pget_class_parent() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pclose_class
+ PURPOSE
+    Close a property list class.
+ USAGE
+    herr_t H5Pclose_class(cls_id)
+        hid_t cls_id;       IN: Property list class ID to class
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Releases memory and de-attach a class from the property list class hierarchy.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pclose_class(hid_t cls_id)
+{
+    hid_t	ret_value = SUCCEED;    /* Return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", cls_id);
+
+    /* Check arguments */
+    if(H5I_GENPROP_CLS != H5I_get_type(cls_id))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class")
+
+    /* Close the property list class */
+    if(H5I_dec_app_ref(cls_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't close")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pclose_class() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5PL.c b/gatb-core/thirdparty/hdf5/src/H5PL.c
new file mode 100644
index 0000000..82075f4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5PL.c
@@ -0,0 +1,746 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5. The full HDF5 copyright notice, including      *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic document set and is     *
+ * linked from the top-level documents page.  It can also be found at        *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access   *
+ * to either file, you may request a copy from help at hdfgroup.org.            *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC    H5PL__init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5MMprivate.h"    /* Memory management            */
+#include "H5PLprivate.h"    /* Plugin                       */
+#include "H5Zprivate.h"     /* Filter pipeline              */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5PL_MAX_PATH_NUM       16
+
+/****************************/
+/* Macros for supporting
+ * both Windows and Unix */
+/****************************/
+/* Windows support
+ *
+ * SPECIAL WINDOWS NOTE
+ *
+ * Some of the Win32 API functions expand to fooA or fooW depending on
+ * whether UNICODE or _UNICODE are defined. You MUST explicitly use
+ * the A version of the functions to force char * behavior until we
+ * work out a scheme for proper Windows Unicode support.
+ *
+ * If you do not do this, people will be unable to incorporate our
+ * source code into their own CMake builds if they define UNICODE.
+ */
+
+#ifdef H5_HAVE_WIN32_API
+
+#define H5PL_PATH_SEPARATOR     ";"
+
+/* Handle for dynamic library */
+#define H5PL_HANDLE HINSTANCE
+
+/* Get a handle to a plugin library.  Windows: TEXT macro handles Unicode strings */
+#define H5PL_OPEN_DLIB(S) LoadLibraryExA(S, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
+
+/* Get the address of a symbol in dynamic library */
+#define H5PL_GET_LIB_FUNC(H,N) GetProcAddress(H,N)
+
+/* Close dynamic library */
+#define H5PL_CLOSE_LIB(H) FreeLibrary(H)
+
+/* Clear error - nothing to do */
+#define H5PL_CLR_ERROR
+
+/* maximum size for expanding env vars */
+#define EXPAND_BUFFER_SIZE 32767
+
+typedef const void *(__cdecl *H5PL_get_plugin_info_t)(void);
+
+/* Unix support */
+#else /* H5_HAVE_WIN32_API */
+
+#define H5PL_PATH_SEPARATOR     ":"
+
+/* Handle for dynamic library */
+#define H5PL_HANDLE void *
+
+/* Get a handle to a plugin library.  Windows: TEXT macro handles Unicode strings */
+#define H5PL_OPEN_DLIB(S) dlopen(S, RTLD_NOW)
+
+/* Get the address of a symbol in dynamic library */
+#define H5PL_GET_LIB_FUNC(H,N) dlsym(H,N)
+
+/* Close dynamic library */
+#define H5PL_CLOSE_LIB(H) dlclose(H)
+
+/* Clear error */
+#define H5PL_CLR_ERROR dlerror()
+
+typedef const void *(*H5PL_get_plugin_info_t)(void);
+#endif /* H5_HAVE_WIN32_API */
+
+/* Whether to preload pathnames for plugin libraries */
+#define H5PL_DEFAULT_PATH       H5_DEFAULT_PLUGINDIR
+
+/* Special symbol to indicate no plugin loading */
+#define H5PL_NO_PLUGIN          "::"
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Type for the list of info for opened plugin libraries */
+typedef struct H5PL_table_t {
+    H5PL_type_t pl_type;            /* plugin type          */
+    int         pl_id;              /* ID for the plugin    */
+    H5PL_HANDLE handle;             /* plugin handle        */
+} H5PL_table_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5PL__init_path_table(void);
+static htri_t H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info);
+static htri_t H5PL__open(H5PL_type_t pl_type, char *libname, int plugin_id, const void **pl_info);
+static htri_t H5PL__search_table(H5PL_type_t plugin_type, int type_id, const void **info);
+static herr_t H5PL__close(H5PL_HANDLE handle);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Table for opened plugin libraries */
+static size_t           H5PL_table_alloc_g = 0;
+static size_t           H5PL_table_used_g = 0;
+static H5PL_table_t     *H5PL_table_g = NULL;
+
+/* Table of location paths for plugin libraries */
+static char             *H5PL_path_table_g[H5PL_MAX_PATH_NUM];
+static size_t           H5PL_num_paths_g = 0;
+static hbool_t          H5PL_path_found_g = FALSE;
+
+/* Enable all plugin libraries */
+static unsigned int     H5PL_plugin_g = H5PL_ALL_PLUGIN;
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5PL__init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5PL__init_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5PL__init_interface(void)
+{
+    char        *preload_path;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Retrieve pathnames from HDF5_PLUGIN_PRELOAD if the user sets it
+     * to tell the library to load plugin libraries without search.
+     */
+    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD"))) {
+        /* Special symbal "::" means no plugin during data reading. */
+        if(!HDstrcmp(preload_path, H5PL_NO_PLUGIN))
+            H5PL_plugin_g = 0;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5PL__init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5PLset_loading_state
+ *
+ * Purpose: Control the loading of dynamic plugin types.
+ *
+ * This function will not allow plugin types if the pathname from the HDF5_PLUGIN_PRELOAD
+ * environment variable is set to the special "::" string.
+ *
+ * plugin bit = 0, will prevent the use of that dynamic plugin type.
+ * plugin bit = 1, will allow the use of that dynamic plugin type.
+ *
+ * H5PL_TYPE_FILTER changes just dynamic filters
+ * A H5PL_ALL_PLUGIN will enable all dynamic plugin types
+ * A zero value will disable all dynamic plugin types
+ *
+ * Return: Non-negative or success
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLset_loading_state(unsigned int plugin_type)
+{
+    char *preload_path;
+    herr_t ret_value = SUCCEED; /* Return value */
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "Iu", plugin_type);
+    /* change the bit value of the requested plugin type(s) */
+    H5PL_plugin_g = plugin_type;
+    /* check if special ENV variable is set and disable all plugin types */
+    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD"))) {
+        /* Special symbol "::" means no plugin during data reading. */
+        if(!HDstrcmp(preload_path, H5PL_NO_PLUGIN))
+            H5PL_plugin_g = 0;
+    }
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLset_loading_state() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5PLget_loading_state
+ *
+ * Purpose: Query state of the loading of dynamic plugin types.
+ *
+ * This function will return the state of the global flag.
+ *
+ * Return: Zero if all plugin types are disabled, negative if all
+ * plugin types are enabled, positive if one or more of the plugin types are enabled.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLget_loading_state(unsigned int *plugin_type)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*Iu", plugin_type);
+
+    if(plugin_type)
+        *plugin_type = H5PL_plugin_g;
+    done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLget_loading_state() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL_term_interface
+ *
+ * Purpose:     Terminate the H5PL interface: release all memory, reset all
+ *              global variables to initial values. This only happens if all
+ *              types have been destroyed from other interfaces.
+ *
+ * Return:      Success:    Positive if any action was taken that might
+ *                          affect some other interface; zero otherwise.
+ *
+ *              Failure:    Negative.
+ *
+ * Programmer:  Raymond Lu
+ *              20 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5PL_term_interface(void)
+{
+    int  i = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        size_t u;       /* Local index variable */
+
+        /* Close opened dynamic libraries */
+        for(u = 0; u < H5PL_table_used_g; u++)
+            H5PL__close((H5PL_table_g[u]).handle);
+
+        /* Free the table of dynamic libraries */
+        H5PL_table_g = (H5PL_table_t *)H5MM_xfree(H5PL_table_g);
+        H5PL_table_used_g = H5PL_table_alloc_g = 0;
+
+        /* Free the table of search paths */
+        for(u = 0; u < H5PL_num_paths_g; u++)
+            if(H5PL_path_table_g[u])
+                H5PL_path_table_g[u] = (char *)H5MM_xfree(H5PL_path_table_g[u]);
+        H5PL_num_paths_g = 0;
+        H5PL_path_found_g = FALSE;
+
+        H5_interface_initialize_g = 0;
+        i = 1;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(i)
+} /* end H5PL_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL_load
+ *
+ * Purpose:     Given the plugin type and identifier, this function searches
+ *              and/or loads a dynamic plugin library first among the already
+ *              opened libraries then in the designated location paths.
+ *
+ * Return:      Non-NULL on success/NULL on failure
+ *
+ * Programmer:  Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+const void *
+H5PL_load(H5PL_type_t type, int id)
+{
+    htri_t      found;               /* Whether the plugin was found */
+    const void  *plugin_info = NULL;
+    const void  *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    switch(type) {
+        case H5PL_TYPE_FILTER:
+            if((H5PL_plugin_g & H5PL_FILTER_PLUGIN) == 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin filter '%d' is not available", id)
+            break;
+
+        case H5PL_TYPE_ERROR:
+        case H5PL_TYPE_NONE:
+        default:
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin '%d' is not valid", id)
+    } /* end switch */
+
+    /* Initialize the location paths for dynamic libraries, if they aren't
+     * already set up.
+     */
+    if(FALSE == H5PL_path_found_g)
+        if(H5PL__init_path_table() < 0)
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTINIT, NULL, "can't initialize search path table")
+
+    /* Search in the table of already loaded plugin libraries */
+    if((found = H5PL__search_table(type, id, &plugin_info)) < 0)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in table failed")
+
+    /* If not found, iterate through the path table to find the right dynamic library */
+    if(!found) {
+        size_t       i;                   /* Local index variable */
+
+        for(i = 0; i < H5PL_num_paths_g; i++) {
+            if((found = H5PL__find(type, id, H5PL_path_table_g[i], &plugin_info)) < 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in paths failed")
+
+            /* Break out if found */
+            if(found) {
+                HDassert(plugin_info);
+                break;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+    /* Check if we found the plugin */
+    if(found)
+        ret_value = plugin_info;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL__init_path_table
+ *
+ * Purpose:     Initialize the path table.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              18 March 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PL__init_path_table(void)
+{
+    char        *dl_path = NULL;
+    char        *origin_dl_path;
+    char        *dir;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Retrieve paths from HDF5_PLUGIN_PATH if the user sets it
+     * or from the default paths if it isn't set.
+     */
+    origin_dl_path = HDgetenv("HDF5_PLUGIN_PATH");
+    if(NULL == origin_dl_path)
+        dl_path = HDstrdup(H5PL_DEFAULT_PATH);
+    else
+        dl_path = HDstrdup(origin_dl_path);
+    if(NULL == dl_path)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+#ifdef H5_HAVE_WIN32_API
+    else { /* Expand windows env var*/
+        long bufCharCount;
+        char tempbuf[EXPAND_BUFFER_SIZE];
+        if((bufCharCount = ExpandEnvironmentStrings(dl_path, tempbuf, EXPAND_BUFFER_SIZE)) > EXPAND_BUFFER_SIZE)
+            HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "expanded path is too long")
+        if(bufCharCount == 0)
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "failed to expand path")
+        dl_path = (char *)H5MM_xfree(dl_path);
+        dl_path = H5MM_strdup(tempbuf);
+    }
+#endif H5_HAVE_WIN32_API
+
+    /* Put paths in the path table.  They are separated by ":" */
+    dir = HDstrtok(dl_path, H5PL_PATH_SEPARATOR);
+    while(dir) {
+        /* Check for too many directories in path */
+        if(H5PL_num_paths_g == H5PL_MAX_PATH_NUM)
+            HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
+        if(NULL == (H5PL_path_table_g[H5PL_num_paths_g] = HDstrdup(dir)))
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+        H5PL_num_paths_g++;
+        dir = HDstrtok(NULL, H5PL_PATH_SEPARATOR);
+    } /* end while */
+
+    H5PL_path_found_g = TRUE;
+
+done:
+    if(dl_path)
+        dl_path = (char *)H5MM_xfree(dl_path);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL__init_path_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL__find
+ *
+ * Purpose:     Given a path, this function opens the directory and envokes
+ *              another function to go through all files to find the right
+ *              plugin library. Two function definitions are for Unix and
+ *              Windows.
+ *
+ * Return:      TRUE on success,
+ *              FALSE on not found,
+ *              negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef H5_HAVE_WIN32_API
+static htri_t
+H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info)
+{
+    char           *pathname = NULL;
+    DIR            *dirp = NULL;
+    struct dirent  *dp;
+    htri_t         ret_value = FALSE;
+
+    FUNC_ENTER_STATIC
+
+    /* Open the directory */
+    if(!(dirp = HDopendir(dir)))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory: %s", dir)
+
+    /* Iterates through all entries in the directory to find the right plugin library */
+    while(NULL != (dp = HDreaddir(dirp))) {
+        /* The library we are looking for should be called libxxx.so... on Unix
+         * or libxxx.xxx.dylib on Mac.
+         */
+#ifndef __CYGWIN__
+        if(!HDstrncmp(dp->d_name, "lib", (size_t)3) &&
+                (HDstrstr(dp->d_name, ".so") || HDstrstr(dp->d_name, ".dylib"))) {
+#else
+        if(!HDstrncmp(dp->d_name, "cyg", (size_t)3) &&
+                HDstrstr(dp->d_name, ".dll") ) {
+
+#endif
+            h5_stat_t   my_stat;
+            size_t      pathname_len;
+            htri_t      found_in_dir;
+
+            /* Allocate & initialize the path name */
+            pathname_len = HDstrlen(dir) + HDstrlen(dp->d_name) + 2;
+            if(NULL == (pathname = (char *)H5MM_malloc(pathname_len)))
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+            HDsnprintf(pathname, pathname_len, "%s/%s", dir, dp->d_name);
+
+            /* Get info for directory entry */
+            if(HDstat(pathname, &my_stat) == -1)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't stat file: %s", HDstrerror(errno))
+
+            /* If it is a directory, skip it */
+            if(S_ISDIR(my_stat.st_mode))
+                continue;
+
+            /* Attempt to open the dynamic library as a filter library */
+            if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
+            if(found_in_dir) {
+                /* Indicate success */
+                HGOTO_DONE(TRUE)
+            } /* end if */
+            else {
+                HDassert(pathname);
+                pathname = (char *)H5MM_xfree(pathname);
+            }
+        } /* end if */
+    } /* end while */
+
+done:
+    if(dirp)
+        if(HDclosedir(dirp) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CLOSEERROR, FAIL, "can't close directory: %s", HDstrerror(errno))
+    if(pathname)
+        pathname = (char *)H5MM_xfree(pathname);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL__find() */
+#else /* H5_HAVE_WIN32_API */
+static htri_t
+H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info)
+{
+    WIN32_FIND_DATAA    fdFile;
+    HANDLE              hFind;
+    char                *pathname = NULL;
+    char                service[2048];
+    htri_t              ret_value = FALSE;
+
+    FUNC_ENTER_STATIC
+
+    /* Specify a file mask. *.* = We want everything! */
+    sprintf(service, "%s\\*.dll", dir);
+    if((hFind = FindFirstFileA(service, &fdFile)) == INVALID_HANDLE_VALUE)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory")
+
+    do {
+        /* Find first file will always return "."
+         * and ".." as the first two directories.
+         */
+        if(HDstrcmp(fdFile.cFileName, ".") != 0 && HDstrcmp(fdFile.cFileName, "..") != 0) {
+            size_t      pathname_len;
+            htri_t      found_in_dir;
+
+            /* Allocate & initialize the path name */
+            pathname_len = HDstrlen(dir) + HDstrlen(fdFile.cFileName) + 2;
+            if(NULL == (pathname = (char *)H5MM_malloc(pathname_len)))
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+            HDsnprintf(pathname, pathname_len, "%s\\%s", dir, fdFile.cFileName);
+
+            /* Is the entity a File or Folder? */
+            if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+                continue;
+
+            if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
+            if(found_in_dir) {
+                /* Indicate success */
+                HGOTO_DONE(TRUE)
+            } /* end if */
+            else {
+                HDassert(pathname);
+                pathname = (char *)H5MM_xfree(pathname);
+            }
+        } /* end if */
+    } while(FindNextFileA(hFind, &fdFile)); /* Find the next file. */
+
+done:
+    if(hFind)
+        FindClose(hFind);
+    if(pathname)
+        pathname = (char *)H5MM_xfree(pathname);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL__find() */
+#endif /* H5_HAVE_WIN32_API */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL__open
+ *
+ * Purpose:     Iterates through all files to find the right plugin library.
+ *              It loads the dynamic plugin library and keeps it on the list
+ *              of loaded libraries.
+ *
+ * Return:      TRUE on success,
+ *              FALSE on not found,
+ *              negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5PL__open(H5PL_type_t pl_type, char *libname, int pl_id, const void **pl_info)
+{
+    H5PL_HANDLE    handle = NULL;
+    htri_t         ret_value = FALSE;
+
+    FUNC_ENTER_STATIC
+
+    /* There are different reasons why a library can't be open, e.g. wrong architecture.
+     * simply continue if we can't open it.
+     */
+    if(NULL == (handle = H5PL_OPEN_DLIB(libname))) {
+        H5PL_CLR_ERROR; /* clear error */
+    } /* end if */
+    else {
+        H5PL_get_plugin_info_t get_plugin_info = NULL;
+
+        /* Return a handle for the function H5PLget_plugin_info in the dynamic library.
+         * The plugin library is suppose to define this function.
+         */
+        if(NULL == (get_plugin_info = (H5PL_get_plugin_info_t)H5PL_GET_LIB_FUNC(handle, "H5PLget_plugin_info"))) {
+            if(H5PL__close(handle) < 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+        } /* end if */
+        else {
+            const H5Z_class2_t *plugin_info;
+
+            /* Invoke H5PLget_plugin_info to verify this is the right library we are looking for.
+             * Move on if it isn't.
+             */
+            if(NULL == (plugin_info = (const H5Z_class2_t *)(*get_plugin_info)())) {
+                if(H5PL__close(handle) < 0)
+                    HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "can't get plugin info")
+            } /* end if */
+
+            /* Successfully found plugin library, check if it's the right one */
+            if(plugin_info->id == pl_id) {
+                /* Expand the table if it is too small */
+                if(H5PL_table_used_g >= H5PL_table_alloc_g) {
+                    size_t n = MAX(H5Z_MAX_NFILTERS, 2 * H5PL_table_alloc_g);
+                    H5PL_table_t *table = (H5PL_table_t *)H5MM_realloc(H5PL_table_g, n * sizeof(H5PL_table_t));
+
+                    if(!table)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to extend dynamic library table")
+
+                    H5PL_table_g = table;
+                    H5PL_table_alloc_g = n;
+                } /* end if */
+
+                (H5PL_table_g[H5PL_table_used_g]).handle = handle;
+                (H5PL_table_g[H5PL_table_used_g]).pl_type = pl_type;
+                (H5PL_table_g[H5PL_table_used_g]).pl_id = plugin_info->id;
+                H5PL_table_used_g++;
+
+                /* Set the plugin info to return */
+                *pl_info = (const void *)plugin_info;
+
+                /* Indicate success */
+                ret_value = TRUE;
+            } /* end if */
+            else
+                if(H5PL__close(handle) < 0)
+                    HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL__open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL__search_table
+ *
+ * Purpose:     Search in the list of already opened dynamic libraries
+ *              to see if the one we are looking for is already opened.
+ *
+ * Return:      TRUE on success,
+ *              FALSE on not found,
+ *              Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5PL__search_table(H5PL_type_t plugin_type, int type_id, const void **info)
+{
+    htri_t         ret_value = FALSE;
+
+    FUNC_ENTER_STATIC
+
+    /* Search in the table of already opened dynamic libraries */
+    if(H5PL_table_used_g > 0) {
+        size_t         i;
+
+        for(i = 0; i < H5PL_table_used_g; i++) {
+            if((plugin_type == (H5PL_table_g[i]).pl_type) && (type_id == (H5PL_table_g[i]).pl_id)) {
+                H5PL_get_plugin_info_t get_plugin_info;
+                const H5Z_class2_t   *plugin_info;
+
+                if(NULL == (get_plugin_info = (H5PL_get_plugin_info_t)H5PL_GET_LIB_FUNC((H5PL_table_g[i]).handle, "H5PLget_plugin_info")))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get function for H5PLget_plugin_info")
+
+                if(NULL == (plugin_info = (const H5Z_class2_t *)(*get_plugin_info)()))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get plugin info")
+
+                *info = plugin_info;
+                HGOTO_DONE(TRUE)
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL__search_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL__close
+ *
+ * Purpose:     Closes the handle for dynamic library
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PL__close(H5PL_HANDLE handle)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    H5PL_CLOSE_LIB(handle);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5PL__close() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5PLextern.h b/gatb-core/thirdparty/hdf5/src/H5PLextern.h
new file mode 100644
index 0000000..3264435
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5PLextern.h
@@ -0,0 +1,46 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5. The full HDF5 copyright notice, including      *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic document set and is     *
+ * linked from the top-level documents page.  It can also be found at        *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access   *
+ * to either file, you may request a copy from help at hdfgroup.org.            *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu <songyulu at hdfgroup.org>
+ *              13 February 2013
+ */
+#ifndef _H5PLextern_H
+#define _H5PLextern_H
+
+/* Include HDF5 header */
+#include "hdf5.h"
+
+/* plugins always export */
+#if defined (_MSC_VER)  /* MSVC Compiler Case */
+  #define H5PLUGIN_DLL __declspec(dllexport)
+#elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+  #define H5PLUGIN_DLL __attribute__ ((visibility("default")))
+#else
+  #define H5PLUGIN_DLL
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5PLUGIN_DLL H5PL_type_t H5PLget_plugin_type(void);
+H5PLUGIN_DLL const void *H5PLget_plugin_info(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5PLextern_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5PLprivate.h b/gatb-core/thirdparty/hdf5/src/H5PLprivate.h
new file mode 100644
index 0000000..77e115b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5PLprivate.h
@@ -0,0 +1,52 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5. The full HDF5 copyright notice, including      *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic document set and is     *
+ * linked from the top-level documents page.  It can also be found at        *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access   *
+ * to either file, you may request a copy from help at hdfgroup.org.            *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Raymond Lu <songyulu at hdfgroup.org>
+ *              13 February 2013
+ */
+
+#ifndef _H5PLprivate_H
+#define _H5PLprivate_H
+
+/* Include package's public header */
+#include "H5PLpublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"          /* Generic Functions                    */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* Internal API routines */
+H5_DLL const void *H5PL_load(H5PL_type_t plugin_type, int type_id);
+
+#endif /* _H5PLprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5PLpublic.h b/gatb-core/thirdparty/hdf5/src/H5PLpublic.h
new file mode 100644
index 0000000..0296819
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5PLpublic.h
@@ -0,0 +1,53 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5. The full HDF5 copyright notice, including      *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic document set and is     *
+ * linked from the top-level documents page.  It can also be found at        *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access   *
+ * to either file, you may request a copy from help at hdfgroup.org.            *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Raymond Lu <songyulu at hdfgroup.org>
+ *              13 February 2013
+ */
+
+#ifndef _H5PLpublic_H
+#define _H5PLpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"          /* Generic Functions                    */
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+/* Plugin type used by the plugin library */
+typedef enum H5PL_type_t {
+    H5PL_TYPE_ERROR        = -1,  /*error                    */
+    H5PL_TYPE_FILTER       = 0,   /*filter                   */
+    H5PL_TYPE_NONE         = 1    /*this must be last!       */
+} H5PL_type_t;
+
+/* Common dynamic plugin type flags used by the set/get_loading_state functions */
+#define H5PL_FILTER_PLUGIN 0x0001
+#define H5PL_ALL_PLUGIN 0xFFFF
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* plugin state */
+H5_DLL herr_t H5PLset_loading_state(unsigned int plugin_type);
+H5_DLL herr_t H5PLget_loading_state(unsigned int *plugin_type/*out*/);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5PLpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pacpl.c b/gatb-core/thirdparty/hdf5/src/H5Pacpl.c
new file mode 100644
index 0000000..0a0641c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pacpl.c
@@ -0,0 +1,88 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pacpl.c
+ *			January  2 2006
+ *			James Laird <jlaird at ncsa.uiuc.edu>
+ *
+ * Purpose:		Attribute creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Attribute creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_ACRT[1] = {{
+    "attribute create",		/* Class name for debugging     */
+    H5P_TYPE_ATTRIBUTE_CREATE,  /* Class type                   */
+
+    &H5P_CLS_STRING_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_ATTRIBUTE_CREATE_g, /* Pointer to class            */
+    &H5P_CLS_ATTRIBUTE_CREATE_ID_g, /* Pointer to class ID          */
+    &H5P_LST_ATTRIBUTE_CREATE_ID_g, /* Pointer to default property list ID */
+    NULL,			/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pdapl.c b/gatb-core/thirdparty/hdf5/src/H5Pdapl.c
new file mode 100644
index 0000000..2a58c08
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pdapl.c
@@ -0,0 +1,548 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pdapl.c
+ *              October 27, 2008
+ *              Neil Fortner <nfortne2 at hdfgroup.org>
+ *
+ * Purpose:		Dataset access property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions */
+#include "H5Dprivate.h"		/* Datasets */
+#include "H5Eprivate.h"		/* Error handling */
+#include "H5Fprivate.h"		/* Files */
+#include "H5Iprivate.h"		/* IDs */
+#include "H5Ppkg.h"         /* Property lists */
+#include "H5MMprivate.h"	/* Memory management */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========= Dataset Access properties ============ */
+/* Definitions for size of raw data chunk cache(slots) */
+#define H5D_ACS_DATA_CACHE_NUM_SLOTS_SIZE       sizeof(size_t)
+#define H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF        H5D_CHUNK_CACHE_NSLOTS_DEFAULT
+/* Definition for size of raw data chunk cache(bytes) */
+#define H5D_ACS_DATA_CACHE_BYTE_SIZE_SIZE       sizeof(size_t)
+#define H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF        H5D_CHUNK_CACHE_NBYTES_DEFAULT
+/* Definition for preemption read chunks first */
+#define H5D_ACS_PREEMPT_READ_CHUNKS_SIZE        sizeof(double)
+#define H5D_ACS_PREEMPT_READ_CHUNKS_DEF         H5D_CHUNK_CACHE_W0_DEFAULT
+/* Definitions for external file prefix */
+#define H5D_ACS_EFILE_PREFIX_SIZE               sizeof(char *)
+#define H5D_ACS_EFILE_PREFIX_DEF                NULL /*default is no prefix */
+#define H5D_ACS_EFILE_PREFIX_SET                H5P__dapl_efile_pref_set
+#define H5D_ACS_EFILE_PREFIX_GET                H5P__dapl_efile_pref_get
+#define H5D_ACS_EFILE_PREFIX_DEL                H5P__dapl_efile_pref_del
+#define H5D_ACS_EFILE_PREFIX_COPY               H5P__dapl_efile_pref_copy
+#define H5D_ACS_EFILE_PREFIX_CMP                H5P__dapl_efile_pref_cmp
+#define H5D_ACS_EFILE_PREFIX_CLOSE              H5P__dapl_efile_pref_close
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P__dacc_reg_prop(H5P_genclass_t *pclass);
+
+/* Property list callbacks */
+static herr_t H5P__dapl_efile_pref_set(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dapl_efile_pref_get(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dapl_efile_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dapl_efile_pref_copy(const char* name, size_t size, void* value);
+static int H5P__dapl_efile_pref_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__dapl_efile_pref_close(const char* name, size_t size, void* value);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Dataset access property list class library initialization object */
+const H5P_libclass_t H5P_CLS_DACC[1] = {{
+    "dataset access",		/* Class name for debugging     */
+    H5P_TYPE_DATASET_ACCESS,    /* Class type                   */
+
+    &H5P_CLS_LINK_ACCESS_g,	/* Parent class                 */
+    &H5P_CLS_DATASET_ACCESS_g,	/* Pointer to class             */
+    &H5P_CLS_DATASET_ACCESS_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_DATASET_ACCESS_ID_g,	/* Pointer to default property list ID */
+    H5P__dacc_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,		        /* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,		        /* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Property value defaults */
+static const char *H5D_def_efile_prefix_g = H5D_ACS_EFILE_PREFIX_DEF; /* Default external file prefix string */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dacc_reg_prop
+ *
+ * Purpose:     Register the dataset access property list class's
+ *              properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              October 27, 2008
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dacc_reg_prop(H5P_genclass_t *pclass)
+{
+    size_t rdcc_nslots = H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF;      /* Default raw data chunk cache # of slots */
+    size_t rdcc_nbytes = H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF;      /* Default raw data chunk cache # of bytes */
+    double rdcc_w0 = H5D_ACS_PREEMPT_READ_CHUNKS_DEF;           /* Default raw data chunk cache dirty ratio */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register the size of raw data chunk cache (elements) */
+    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5D_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &rdcc_nslots, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the size of raw data chunk cache(bytes) */
+    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5D_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the preemption for reading chunks */
+    if(H5P_register_real(pclass, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, H5D_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register property for external file prefix */
+    if(H5P_register_real(pclass, H5D_ACS_EFILE_PREFIX_NAME, H5D_ACS_EFILE_PREFIX_SIZE, &H5D_def_efile_prefix_g, 
+            NULL, H5D_ACS_EFILE_PREFIX_SET, H5D_ACS_EFILE_PREFIX_GET,
+            H5D_ACS_EFILE_PREFIX_DEL, H5D_ACS_EFILE_PREFIX_COPY, H5D_ACS_EFILE_PREFIX_CMP, H5D_ACS_EFILE_PREFIX_CLOSE) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dacc_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dapl_efile_pref_set
+ *
+ * Purpose:     Copies an external file prefix property when it's set
+ *              for a property list
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dapl_efile_pref_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Copy the prefix */
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dapl_efile_pref_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dapl_efile_pref_get
+ *
+ * Purpose:     Copies an external file prefix property when it's retrieved
+ *              from a property list
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dapl_efile_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Copy the prefix */
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dapl_efile_pref_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dapl_efile_pref_del
+ *
+ * Purpose:     Frees memory used to store the external file prefix string
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dapl_efile_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dapl_efile_pref_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dapl_efile_pref_copy
+ *
+ * Purpose:     Creates a copy of the external file prefix string
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dapl_efile_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dapl_efile_pref_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dapl_efile_pref_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the efile prefix
+ *                 property in the dataset creation property list is
+ *                 compared.
+ *
+ * Return:         zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__dapl_efile_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+    const char *pref1 = *(const char * const *)value1;
+    const char *pref2 = *(const char * const *)value2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(NULL == pref1 && NULL != pref2)
+        HGOTO_DONE(1);
+    if(NULL != pref1 && NULL == pref2)
+        HGOTO_DONE(-1);
+    if(NULL != pref1 && NULL != pref2)
+        ret_value = HDstrcmp(pref1, pref2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dapl_efile_pref_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dapl_efile_pref_close
+ *
+ * Purpose:     Frees memory used to store the external file prefix string
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dapl_efile_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dapl_efile_pref_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_chunk_cache
+ *
+ * Purpose:	Set the number of objects in the meta data cache and the
+ *		maximum number of chunks and bytes in the raw data chunk cache.
+ *      Once set, these values will override the values in the file access
+ *      property list.  Each of thhese values can be individually unset
+ *      (or not set at all) by passing the macros:
+ *      H5D_CHUNK_CACHE_NCHUNKS_DEFAULT,
+ *      H5D_CHUNK_CACHE_NSLOTS_DEFAULT, and/or
+ *      H5D_CHUNK_CACHE_W0_DEFAULT
+ *      as appropriate.
+ *
+ * 		The RDCC_W0 value should be between 0 and 1 inclusive and
+ *		indicates how much chunks that have been fully read or fully
+ *		written are favored for preemption.  A value of zero means
+ *		fully read or written chunks are treated no differently than
+ *		other chunks (the preemption is strictly LRU) while a value
+ *		of one means fully read chunks are always preempted before
+ *		other chunks.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *              Monday, October 27, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_chunk_cache(hid_t dapl_id, size_t rdcc_nslots, size_t rdcc_nbytes, double rdcc_w0)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "izzd", dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0);
+
+    /* Check arguments.  Note that we allow negative values - they are
+     * considered to "unset" the property. */
+    if(rdcc_w0 > (double)1.0f)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "raw data cache w0 value must be between 0.0 and 1.0 inclusive, or H5D_CHUNK_CACHE_W0_DEFAULT");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(dapl_id,H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Set sizes */
+    if(H5P_set(plist, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, &rdcc_nslots) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set data cache number of chunks");
+    if(H5P_set(plist, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, &rdcc_nbytes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set data cache byte size");
+    if(H5P_set(plist, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, &rdcc_w0) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set preempt read chunks");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_chunk_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_chunk_cache
+ *
+ * Purpose:	Retrieves the maximum possible number of elements in the meta
+ *		data cache and the maximum possible number of elements and
+ *		bytes and the RDCC_W0 value in the raw data chunk cache.  Any
+ *		(or all) arguments may be null pointers in which case the
+ *		corresponding datum is not returned.  If these properties have
+ *      not been set on this property list, the default values for a
+ *      file access property list are returned.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *              Monday, October 27, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_chunk_cache(hid_t dapl_id, size_t *rdcc_nslots, size_t *rdcc_nbytes, double *rdcc_w0)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5P_genplist_t *def_plist;  /* Default file access property list */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*z*z*d", dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0);
+
+    /* Get the plist structure */
+    if (NULL == (plist = H5P_object_verify(dapl_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Get default file access plist */
+    if (NULL == (def_plist = (H5P_genplist_t *)H5I_object(H5P_FILE_ACCESS_DEFAULT)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for default fapl ID");
+
+    /* Get the properties.  If a property is set to the default value, the value
+     * from the default fapl is used. */
+    if (rdcc_nslots) {
+        if (H5P_get(plist, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, rdcc_nslots) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache number of slots");
+        if (*rdcc_nslots == H5D_CHUNK_CACHE_NSLOTS_DEFAULT)
+            if (H5P_get(def_plist, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, rdcc_nslots) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get default data cache number of slots");
+    } /* end if */
+    if (rdcc_nbytes) {
+        if (H5P_get(plist, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, rdcc_nbytes) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache byte size");
+        if (*rdcc_nbytes == H5D_CHUNK_CACHE_NBYTES_DEFAULT)
+            if (H5P_get(def_plist, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, rdcc_nbytes) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get default data cache byte size");
+    } /* end if */
+    if (rdcc_w0) {
+        if (H5P_get(plist, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, rdcc_w0) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get preempt read chunks");
+        if (*rdcc_w0 < 0)
+            if (H5P_get(def_plist, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, rdcc_w0) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get default preempt read chunks");
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_efile_prefix
+ *
+ * Purpose:     Set a prefix to be used for any external files.
+ *
+ *              If the prefix starts with ${ORIGIN}, this will be replaced by
+ *              the absolute path of the directory of the HDF5 file containing
+ *              the dataset.
+ *
+ *              If the prefix is ".", no prefix will be applied.
+ *
+ *              This property can be overwritten by the environment variable
+ *              HDF5_EXTFILE_PREFIX.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_efile_prefix(hid_t plist_id, const char *prefix)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", plist_id, prefix);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set prefix */
+    if(H5P_set(plist, H5D_ACS_EFILE_PREFIX_NAME, &prefix) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set prefix info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_efile_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_efile_prefix
+ *
+ * Purpose:	Gets the prefix to be used for any external files.
+ *
+ *              If the pointer is not NULL, it points to a user-allocated
+ *              buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Pget_efile_prefix(hid_t plist_id, char *prefix, size_t size)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char *my_prefix;                    /* Library's copy of the prefix */
+    size_t	len;                    /* Length of prefix string */
+    ssize_t 	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "i*sz", plist_id, prefix, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the current prefix */
+    /* No error checking possible */
+    my_prefix = (char *)H5P_peek_voidp(plist, H5D_ACS_EFILE_PREFIX_NAME);
+
+    /* Check for prefix being set */
+    if(my_prefix) {
+        /* Copy to user's buffer, if given */
+        len = HDstrlen(my_prefix);
+        if(prefix) {
+            HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
+            if(len >= size)
+                prefix[size - 1] = '\0';
+        } /* end if */
+    } /* end if */
+    else
+        len = 0;
+
+    /* Set return value */
+    ret_value = (ssize_t)len;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_efile_prefix() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pdcpl.c b/gatb-core/thirdparty/hdf5/src/H5Pdcpl.c
new file mode 100644
index 0000000..071ce41
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pdcpl.c
@@ -0,0 +1,1967 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pdcpl.c
+ *			February 26 1998
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Dataset creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Define default layout information */
+#define H5D_DEF_STORAGE_COMPACT_INIT  {(hbool_t)FALSE, (size_t)0, NULL}
+#define H5D_DEF_STORAGE_CONTIG_INIT   {HADDR_UNDEF, (hsize_t)0}
+#define H5D_DEF_STORAGE_CHUNK_INIT    {H5D_CHUNK_BTREE, HADDR_UNDEF,  NULL, {{HADDR_UNDEF, NULL}}}
+#define H5D_DEF_LAYOUT_CHUNK_INIT    {(unsigned)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, (uint32_t)0, (hsize_t)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
+#ifdef H5_HAVE_C99_DESIGNATED_INITIALIZER
+#define H5D_DEF_STORAGE_COMPACT  {H5D_COMPACT, { .compact = H5D_DEF_STORAGE_COMPACT_INIT }}
+#define H5D_DEF_STORAGE_CONTIG   {H5D_CONTIGUOUS, { .contig = H5D_DEF_STORAGE_CONTIG_INIT }}
+#define H5D_DEF_STORAGE_CHUNK    {H5D_CHUNKED, { .chunk = H5D_DEF_STORAGE_CHUNK_INIT }}
+#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_COMPACT}
+#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CONTIG}
+#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CHUNK}
+#else /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+/* Note that the compact & chunked layout initialization values are using the
+ *      contiguous layout initialization in the union, because the contiguous
+ *      layout is first in the union.  These values are overridden in the
+ *      H5P__init_def_layout() routine. -QAK
+ */
+#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+/* ========  Dataset creation properties ======== */
+/* Definitions for storage layout property */
+#define H5D_CRT_LAYOUT_SIZE        sizeof(H5O_layout_t)
+#define H5D_CRT_LAYOUT_DEF         H5D_DEF_LAYOUT_CONTIG
+#define H5D_CRT_LAYOUT_CMP         H5P__dcrt_layout_cmp
+/* Definitions for fill value.  size=0 means fill value will be 0 as
+ * library default; size=-1 means fill value is undefined. */
+#define H5D_CRT_FILL_VALUE_SIZE    sizeof(H5O_fill_t)
+#define H5D_CRT_FILL_VALUE_DEF     {{0, NULL, H5O_NULL_ID, {{0, HADDR_UNDEF}}}, H5O_FILL_VERSION_2, NULL, 0, NULL, H5D_ALLOC_TIME_LATE, H5D_FILL_TIME_IFSET, FALSE}
+#define H5D_CRT_FILL_VALUE_CMP     H5P_fill_value_cmp
+/* Definitions for space allocation time state */
+#define H5D_CRT_ALLOC_TIME_STATE_SIZE   sizeof(unsigned)
+#define H5D_CRT_ALLOC_TIME_STATE_DEF    1
+/* Definitions for external file list */
+#define H5D_CRT_EXT_FILE_LIST_SIZE sizeof(H5O_efl_t)
+#define H5D_CRT_EXT_FILE_LIST_DEF  {HADDR_UNDEF, 0, 0, NULL}
+#define H5D_CRT_EXT_FILE_LIST_CMP  H5P__dcrt_ext_file_list_cmp
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* General routines */
+static herr_t H5P__set_layout(H5P_genplist_t *plist, const H5O_layout_t *layout);
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+static herr_t H5P__init_def_layout(void);
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+/* Property class callbacks */
+static herr_t H5P__dcrt_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P__dcrt_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
+static herr_t H5P__dcrt_close(hid_t dxpl_id, void *close_data);
+
+/* Property callbacks */
+static int H5P__dcrt_layout_cmp(const void *value1, const void *value2, size_t size);
+static int H5P__dcrt_ext_file_list_cmp(const void *value1, const void *value2, size_t size);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Dataset creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_DCRT[1] = {{
+    "dataset create",		/* Class name for debugging     */
+    H5P_TYPE_DATASET_CREATE,    /* Class type                   */
+
+    &H5P_CLS_OBJECT_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_DATASET_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_DATASET_CREATE_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_DATASET_CREATE_ID_g,	/* Pointer to default property list ID */
+    H5P__dcrt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    H5P__dcrt_copy,		/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    H5P__dcrt_close,		/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Declare extern the free list to manage blocks of type conversion data */
+H5FL_BLK_EXTERN(type_conv);
+
+/* Defaults for each type of layout */
+#ifdef H5_HAVE_C99_DESIGNATED_INITIALIZER
+static const H5O_layout_t H5D_def_layout_compact_g = H5D_DEF_LAYOUT_COMPACT;
+static const H5O_layout_t H5D_def_layout_contig_g = H5D_DEF_LAYOUT_CONTIG;
+static const H5O_layout_t H5D_def_layout_chunk_g = H5D_DEF_LAYOUT_CHUNK;
+#else /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+static H5O_layout_t H5D_def_layout_compact_g = H5D_DEF_LAYOUT_COMPACT;
+static H5O_layout_t H5D_def_layout_contig_g = H5D_DEF_LAYOUT_CONTIG;
+static H5O_layout_t H5D_def_layout_chunk_g = H5D_DEF_LAYOUT_CHUNK;
+static hbool_t H5P_dcrt_def_layout_init_g = FALSE;
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_reg_prop
+ *
+ * Purpose:     Register the dataset creation property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_reg_prop(H5P_genclass_t *pclass)
+{
+    H5O_layout_t layout = H5D_CRT_LAYOUT_DEF;          /* Default storage layout */
+    H5O_fill_t fill = H5D_CRT_FILL_VALUE_DEF;           /* Default fill value */
+    unsigned alloc_time_state = H5D_CRT_ALLOC_TIME_STATE_DEF;   /* Default allocation time state */
+    H5O_efl_t efl = H5D_CRT_EXT_FILE_LIST_DEF;          /* Default external file list */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register the storage layout property */
+    if(H5P_register_real(pclass, H5D_CRT_LAYOUT_NAME, H5D_CRT_LAYOUT_SIZE, &layout, NULL, NULL, NULL, NULL, NULL, H5D_CRT_LAYOUT_CMP, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the fill value property */
+    if(H5P_register_real(pclass, H5D_CRT_FILL_VALUE_NAME, H5D_CRT_FILL_VALUE_SIZE, &fill, NULL, NULL, NULL, NULL, NULL, H5D_CRT_FILL_VALUE_CMP, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the space allocation time state property */
+    if(H5P_register_real(pclass, H5D_CRT_ALLOC_TIME_STATE_NAME, H5D_CRT_ALLOC_TIME_STATE_SIZE, &alloc_time_state, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the external file list property */
+    if(H5P_register_real(pclass, H5D_CRT_EXT_FILE_LIST_NAME, H5D_CRT_EXT_FILE_LIST_SIZE, &efl, NULL, NULL, NULL, NULL, NULL, H5D_CRT_EXT_FILE_LIST_CMP, NULL) < 0)
+       HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_copy
+ *
+ * Purpose:        Callback routine which is called whenever any dataset
+ *                 creation property list is copied.  This routine copies
+ *                 the properties from the old list to the new list.
+ *
+ * Return:         Success:        Non-negative
+ *                 Failure:        Negative
+ *
+ * Programmer:     Raymond Lu
+ *                 Tuesday, October 2, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__dcrt_copy(hid_t dst_plist_id, hid_t src_plist_id, void H5_ATTR_UNUSED *copy_data)
+{
+    H5O_fill_t     src_fill, dst_fill;          /* Source & destination fill values */
+    H5O_efl_t      src_efl, dst_efl;            /* Source & destination external file lists */
+    H5O_layout_t   src_layout, dst_layout;      /* Source & destination layout */
+    H5P_genplist_t *src_plist;                  /* Pointer to source property list */
+    H5P_genplist_t *dst_plist;                  /* Pointer to destination property list */
+    herr_t         ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Verify property list IDs */
+    if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_plist_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_plist_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* Get the layout, fill value, external file list, and data pipeline
+     *  properties from the old property list
+     */
+    if(H5P_get(src_plist, H5D_CRT_LAYOUT_NAME, &src_layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
+    if(H5P_get(src_plist, H5D_CRT_FILL_VALUE_NAME, &src_fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+    if(H5P_get(src_plist, H5D_CRT_EXT_FILE_LIST_NAME, &src_efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+    /* Make copy of layout */
+    if(NULL == H5O_msg_copy(H5O_LAYOUT_ID, &src_layout, &dst_layout))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy layout")
+
+    /* Reset layout values set when dataset is created */
+    dst_layout.ops = NULL;
+    switch(dst_layout.type) {
+        case H5D_COMPACT:
+            dst_layout.storage.u.compact.buf = H5MM_xfree(dst_layout.storage.u.compact.buf);
+            HDmemset(&dst_layout.storage.u.compact, 0, sizeof(dst_layout.storage.u.compact));
+            break;
+
+        case H5D_CONTIGUOUS:
+            dst_layout.storage.u.contig.addr = HADDR_UNDEF;
+            dst_layout.storage.u.contig.size = 0;
+            break;
+
+        case H5D_CHUNKED:
+            /* Reset chunk size */
+            dst_layout.u.chunk.size = 0;
+
+            /* Reset index info, if the chunk ops are set */
+            if(dst_layout.storage.u.chunk.ops)
+		/* Reset address and pointer of the array struct for the chunked storage index */
+                if(H5D_chunk_idx_reset(&dst_layout.storage.u.chunk, TRUE) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to reset chunked storage index in dest")
+
+            /* Reset chunk index ops */
+            dst_layout.storage.u.chunk.ops = NULL;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HDassert(0 && "Unknown layout type!");
+    } /* end switch */
+
+    /* Make copy of fill value */
+    if(NULL == H5O_msg_copy(H5O_FILL_ID, &src_fill, &dst_fill))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy fill value")
+
+    /* Make copy of external file list */
+    HDmemset(&dst_efl, 0, sizeof(H5O_efl_t));
+    if(NULL == H5O_msg_copy(H5O_EFL_ID, &src_efl, &dst_efl))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy external file list")
+
+    /* Reset efl name_offset and heap_addr, these are the values when the dataset is created */
+    if(dst_efl.slot) {
+        unsigned int i;
+
+        dst_efl.heap_addr = HADDR_UNDEF;
+        for(i = 0; i < dst_efl.nused; i++)
+            dst_efl.slot[i].name_offset = 0;
+    } /* end if */
+
+    /* Set the layout, fill value, external file list, and data pipeline
+     *  properties for the destination property list
+     */
+    if(H5P_set(dst_plist, H5D_CRT_LAYOUT_NAME, &dst_layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+    if(H5P_set(dst_plist, H5D_CRT_FILL_VALUE_NAME, &dst_fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
+    if(H5P_set(dst_plist, H5D_CRT_EXT_FILE_LIST_NAME, &dst_efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set external file list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P__dcrt_close
+ *
+ * Purpose:	Callback routine which is called whenever any dataset create
+ *              property list is closed.  This routine performs any generic
+ *              cleanup needed on the properties the library put into the list.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, July 11, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__dcrt_close(hid_t dcpl_id, void H5_ATTR_UNUSED *close_data)
+{
+    H5O_fill_t      fill;               /* Fill value */
+    H5O_efl_t       efl;                /* External file list */
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* Get the fill value, external file list, and data pipeline properties
+     * from the old property list */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+    /* Clean up any values set for the fill-value and external file-list */
+    if(H5O_msg_reset(H5O_FILL_ID, &fill) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release fill info")
+    if(H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release external file list info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_layout_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the layout
+ *                 property in the dataset creation property list is
+ *                 compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Tuesday, December 23, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2, size_t H5_ATTR_UNUSED size)
+{
+    const H5O_layout_t *layout1 = (const H5O_layout_t *)_layout1,     /* Create local aliases for values */
+        *layout2 = (const H5O_layout_t *)_layout2;
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(layout1);
+    HDassert(layout2);
+    HDassert(size == sizeof(H5O_layout_t));
+
+    /* Check for different layout type */
+    if(layout1->type < layout2->type) HGOTO_DONE(-1)
+    if(layout1->type > layout2->type) HGOTO_DONE(1)
+
+    /* Check for different layout version */
+    if(layout1->version < layout2->version) HGOTO_DONE(-1)
+    if(layout1->version > layout2->version) HGOTO_DONE(1)
+
+    /* Compare non-dataset-specific fields in layout info */
+    switch(layout1->type) {
+        case H5D_COMPACT:
+        case H5D_CONTIGUOUS:
+            break;
+
+        case H5D_CHUNKED:
+            {
+                unsigned u;     /* Local index variable */
+
+                /* Check the number of dimensions */
+                if(layout1->u.chunk.ndims < layout2->u.chunk.ndims) HGOTO_DONE(-1)
+                if(layout1->u.chunk.ndims > layout2->u.chunk.ndims) HGOTO_DONE(1)
+
+                /* Compare the chunk dims */
+                for(u = 0; u < layout1->u.chunk.ndims - 1; u++) {
+                    if(layout1->u.chunk.dim[u] < layout2->u.chunk.dim[u]) HGOTO_DONE(-1)
+                    if(layout1->u.chunk.dim[u] > layout2->u.chunk.dim[u]) HGOTO_DONE(1)
+                } /* end for */
+            } /* end case */
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HDassert(0 && "Unknown layout type!");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_layout_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_fill_value_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the fill value
+ *                 property in the dataset creation property list is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, January 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5P_fill_value_cmp(const void *_fill1, const void *_fill2, size_t H5_ATTR_UNUSED size)
+{
+    const H5O_fill_t *fill1 = (const H5O_fill_t *)_fill1,     /* Create local aliases for values */
+        *fill2 = (const H5O_fill_t *)_fill2;
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(fill1);
+    HDassert(fill2);
+    HDassert(size == sizeof(H5O_fill_t));
+
+    /* Check the size of fill values */
+    if(fill1->size < fill2->size) HGOTO_DONE(-1);
+    if(fill1->size > fill2->size) HGOTO_DONE(1);
+
+    /* Check the types of the fill values */
+    if(fill1->type == NULL && fill2->type != NULL) HGOTO_DONE(-1);
+    if(fill1->type != NULL && fill2->type == NULL) HGOTO_DONE(1);
+    if(fill1->type != NULL)
+        if((cmp_value = H5T_cmp(fill1->type, fill2->type, FALSE)) != 0)
+            HGOTO_DONE(cmp_value);
+
+    /* Check the fill values in the buffers */
+    if(fill1->buf == NULL && fill2->buf != NULL) HGOTO_DONE(-1);
+    if(fill1->buf != NULL && fill2->buf == NULL) HGOTO_DONE(1);
+    if(fill1->buf != NULL)
+        if((cmp_value = HDmemcmp(fill1->buf, fill2->buf, (size_t)fill1->size)) != 0)
+            HGOTO_DONE(cmp_value);
+
+    /* Check the allocation time for the fill values */
+    if(fill1->alloc_time < fill2->alloc_time) HGOTO_DONE(-1);
+    if(fill1->alloc_time > fill2->alloc_time) HGOTO_DONE(1);
+
+    /* Check the fill time for the fill values */
+    if(fill1->fill_time < fill2->fill_time) HGOTO_DONE(-1);
+    if(fill1->fill_time > fill2->fill_time) HGOTO_DONE(1);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_fill_value_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_ext_file_list_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the external file
+ *                 list property in the dataset creation property list is
+ *                 compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, January 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__dcrt_ext_file_list_cmp(const void *_efl1, const void *_efl2, size_t H5_ATTR_UNUSED size)
+{
+    const H5O_efl_t *efl1 = (const H5O_efl_t *)_efl1,     /* Create local aliases for values */
+        *efl2 = (const H5O_efl_t *)_efl2;
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(efl1);
+    HDassert(efl2);
+    HDassert(size == sizeof(H5O_efl_t));
+
+    /* Check the heap address of external file lists */
+    if(H5F_addr_defined(efl1->heap_addr) || H5F_addr_defined(efl2->heap_addr)) {
+        if(!H5F_addr_defined(efl1->heap_addr) && H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(-1);
+        if(H5F_addr_defined(efl1->heap_addr) && !H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(1);
+        if((cmp_value = H5F_addr_cmp(efl1->heap_addr, efl2->heap_addr)) != 0)
+            HGOTO_DONE(cmp_value);
+    } /* end if */
+
+    /* Check the number of allocated efl entries */
+    if(efl1->nalloc < efl2->nalloc) HGOTO_DONE(-1);
+    if(efl1->nalloc > efl2->nalloc) HGOTO_DONE(1);
+
+    /* Check the number of used efl entries */
+    if(efl1->nused < efl2->nused) HGOTO_DONE(-1);
+    if(efl1->nused > efl2->nused) HGOTO_DONE(1);
+
+    /* Check the efl entry information */
+    if(efl1->slot == NULL && efl2->slot != NULL) HGOTO_DONE(-1);
+    if(efl1->slot != NULL && efl2->slot == NULL) HGOTO_DONE(1);
+    if(efl1->slot != NULL && efl1->nused > 0) {
+        size_t u;       /* Local index variable */
+
+        /* Loop through all entries, comparing them */
+        for(u = 0; u < efl1->nused; u++) {
+            /* Check the name offset of the efl entry */
+            if(efl1->slot[u].name_offset < efl2->slot[u].name_offset) HGOTO_DONE(-1);
+            if(efl1->slot[u].name_offset > efl2->slot[u].name_offset) HGOTO_DONE(1);
+
+            /* Check the name of the efl entry */
+            if(efl1->slot[u].name == NULL && efl2->slot[u].name != NULL) HGOTO_DONE(-1);
+            if(efl1->slot[u].name != NULL && efl2->slot[u].name == NULL) HGOTO_DONE(1);
+            if(efl1->slot[u].name != NULL)
+                if((cmp_value = HDstrcmp(efl1->slot[u].name, efl2->slot[u].name)) != 0)
+                    HGOTO_DONE(cmp_value);
+
+            /* Check the file offset of the efl entry */
+            if(efl1->slot[u].offset < efl2->slot[u].offset) HGOTO_DONE(-1);
+            if(efl1->slot[u].offset > efl2->slot[u].offset) HGOTO_DONE(1);
+
+            /* Check the file size of the efl entry */
+            if(efl1->slot[u].size < efl2->slot[u].size) HGOTO_DONE(-1);
+            if(efl1->slot[u].size > efl2->slot[u].size) HGOTO_DONE(1);
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5P__set_layout
+ *
+ * Purpose:   Sets the layout of raw data in the file.
+ *
+ * Return:    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__set_layout(H5P_genplist_t *plist, const H5O_layout_t *layout)
+{
+    unsigned alloc_time_state;          /* State of allocation time property */
+    herr_t ret_value = SUCCEED;         /* return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the allocation time state */
+    if(H5P_get(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get space allocation time state")
+
+    /* If we still have the "default" allocation time, change it according to the new layout */
+    if(alloc_time_state) {
+        H5O_fill_t fill;            /* Fill value */
+
+        /* Get current fill value info */
+        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+        /* Set the default based on layout */
+        switch(layout->type) {
+            case H5D_COMPACT:
+                fill.alloc_time = H5D_ALLOC_TIME_EARLY;
+                break;
+
+            case H5D_CONTIGUOUS:
+                fill.alloc_time = H5D_ALLOC_TIME_LATE;
+                break;
+
+            case H5D_CHUNKED:
+                fill.alloc_time = H5D_ALLOC_TIME_INCR;
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
+        } /* end switch */
+
+        /* Set updated fill value info */
+        if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set space allocation time")
+    } /* end if */
+
+    /* Set layout value */
+    if(H5P_set(plist, H5D_CRT_LAYOUT_NAME, layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__set_layout() */
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+

+/*-------------------------------------------------------------------------
+ * Function:  H5P__init_def_layout
+ *
+ * Purpose:   Set the default layout information for the various types of
+ *              dataset layouts
+ *
+ * Return:    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, January 13, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__init_def_layout(void)
+{
+    const H5O_layout_chunk_t def_layout_chunk = H5D_DEF_LAYOUT_CHUNK_INIT;
+    const H5O_storage_compact_t def_store_compact = H5D_DEF_STORAGE_COMPACT_INIT;
+    const H5O_storage_chunk_t def_store_chunk = H5D_DEF_STORAGE_CHUNK_INIT;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Initialize the default layout info for non-contigous layouts */
+    H5D_def_layout_compact_g.storage.u.compact = def_store_compact;
+    H5D_def_layout_chunk_g.u.chunk = def_layout_chunk;
+    H5D_def_layout_chunk_g.storage.u.chunk = def_store_chunk;
+
+    /* Note that we've initialized the default values */
+    H5P_dcrt_def_layout_init_g = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__init_def_layout() */
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_layout
+ *
+ * Purpose:	Sets the layout of raw data in the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_layout(hid_t plist_id, H5D_layout_t layout_type)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    const H5O_layout_t *layout;         /* Pointer to default layout information for type specified */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDl", plist_id, layout_type);
+
+    /* Check arguments */
+    if(layout_type < 0 || layout_type >= H5D_NLAYOUTS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "raw data layout method is not valid")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+    /* Get pointer to correct default layout */
+    switch(layout_type) {
+        case H5D_COMPACT:
+            layout = &H5D_def_layout_compact_g;
+            break;
+
+        case H5D_CONTIGUOUS:
+            layout = &H5D_def_layout_contig_g;
+            break;
+
+        case H5D_CHUNKED:
+            layout = &H5D_def_layout_chunk_g;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
+    } /* end switch */
+
+    /* Set value */
+    if(H5P__set_layout(plist, layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_layout
+ *
+ * Purpose:	Retrieves layout type of a dataset creation property list.
+ *
+ * Return:	Success:	The layout type
+ *
+ *		Failure:	H5D_LAYOUT_ERROR (negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and get property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_layout_t
+H5Pget_layout(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout property */
+    H5D_layout_t ret_value;     /* Return value */
+
+    FUNC_ENTER_API(H5D_LAYOUT_ERROR)
+    H5TRACE1("Dl", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5D_LAYOUT_ERROR, "can't find object for ID")
+
+    /* Get layout property */
+    if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5D_LAYOUT_ERROR, "can't get layout")
+
+    /* Set return value */
+    ret_value = layout.type;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* ed H5Pget_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_chunk
+ *
+ * Purpose:	Sets the number of dimensions and the size of each chunk to
+ *		the values specified.  The dimensionality of the chunk should
+ *		match the dimensionality of the dataspace.
+ *
+ *		As a side effect, the layout method is changed to
+ *		H5D_CHUNKED.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/])
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t chunk_layout;  /* Layout information for setting chunk info */
+    uint64_t chunk_nelmts;      /* Number of elements in chunk */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIs*[a1]h", plist_id, ndims, dim);
+
+    /* Check arguments */
+    if(ndims <= 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality must be positive")
+    if(ndims > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality is too large")
+    if(!dim)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no chunk dimensions specified")
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+    /* Verify & initialize property's chunk dims */
+    HDmemcpy(&chunk_layout, &H5D_def_layout_chunk_g, sizeof(H5D_def_layout_chunk_g));
+    HDmemset(&chunk_layout.u.chunk.dim, 0, sizeof(chunk_layout.u.chunk.dim));
+    chunk_nelmts = 1;
+    for(u = 0; u < (unsigned)ndims; u++) {
+        if(dim[u] == 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be positive")
+        if(dim[u] != (dim[u] & 0xffffffff))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be less than 2^32")
+        chunk_nelmts *= dim[u];
+        if(chunk_nelmts > (uint64_t)0xffffffff)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "number of elements in chunk must be < 4GB")
+        chunk_layout.u.chunk.dim[u] = (uint32_t)dim[u]; /* Store user's chunk dimensions */
+    } /* end for */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set chunk information in property list */
+    chunk_layout.u.chunk.ndims = (unsigned)ndims;
+    if(H5P__set_layout(plist, &chunk_layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_chunk
+ *
+ * Purpose:	Retrieves the chunk size of chunked layout.  The chunk
+ *		dimensionality is returned and the chunk size in each
+ *		dimension is returned through the DIM argument.	 At most
+ *		MAX_NDIMS elements of DIM will be initialized.
+ *
+ * Return:	Success:	Positive Chunk dimensionality.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Is", "iIsx", plist_id, max_ndims, dim);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Retrieve the layout property */
+    if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_CHUNKED != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a chunked storage layout")
+
+    if(dim) {
+        unsigned	u;      /* Local index variable */
+
+        /* Get the dimension sizes */
+        for(u = 0; u < layout.u.chunk.ndims && u < (unsigned)max_ndims; u++)
+            dim[u] = layout.u.chunk.dim[u];
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = (int)layout.u.chunk.ndims;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_external
+ *
+ * Purpose:	Adds an external file to the list of external files. PLIST_ID
+ *		should be an object ID for a dataset creation property list.
+ *		NAME is the name of an external file, OFFSET is the location
+ *		where the data starts in that file, and SIZE is the number of
+ *		bytes reserved in the file for the data.
+ *
+ *		If a dataset is split across multiple files then the files
+ *		should be defined in order. The total size of the dataset is
+ *		the sum of the SIZE arguments for all the external files.  If
+ *		the total size is larger than the size of a dataset then the
+ *		dataset can be extended (provided the dataspace also allows
+ *		the extending).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, March	3, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_external(hid_t plist_id, const char *name, off_t offset, hsize_t size)
+{
+    size_t		idx;
+    hsize_t		total, tmp;
+    H5O_efl_t           efl;
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*soh", plist_id, name, offset, size);
+
+    /* Check arguments */
+    if(!name || !*name)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name given")
+    if(offset < 0)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "negative external file offset")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+    if(efl.nused > 0 && H5O_EFL_UNLIMITED == efl.slot[efl.nused - 1].size)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "previous file size is unlimited")
+
+    if(H5O_EFL_UNLIMITED != size) {
+        for(idx = 0, total = size; idx < efl.nused; idx++, total = tmp) {
+            tmp = total + efl.slot[idx].size;
+            if(tmp <= total)
+                HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "total external data size overflowed")
+        } /* end for */
+    } /* end if */
+
+
+    /* Add to the list */
+    if(efl.nused >= efl.nalloc) {
+        size_t na = efl.nalloc + H5O_EFL_ALLOC;
+        H5O_efl_entry_t *x = (H5O_efl_entry_t *)H5MM_realloc(efl.slot, na * sizeof(H5O_efl_entry_t));
+
+        if(!x)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        efl.nalloc = na;
+        efl.slot = x;
+    } /* end if */
+    idx = efl.nused;
+    efl.slot[idx].name_offset = 0; /*not entered into heap yet*/
+    efl.slot[idx].name = H5MM_xstrdup(name);
+    efl.slot[idx].offset = offset;
+    efl.slot[idx].size = size;
+    efl.nused++;
+
+    if(H5P_set(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set external file list")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_external() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_external_count
+ *
+ * Purpose:	Returns the number of external files for this dataset.
+ *
+ * Return:	Success:	Number of external files
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March  3, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_external_count(hid_t plist_id)
+{
+    H5O_efl_t           efl;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    int ret_value;              /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+    /* Set return value */
+    ret_value = (int)efl.nused;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_external_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_external
+ *
+ * Purpose:	Returns information about an external file.  External files
+ *		are numbered from zero to N-1 where N is the value returned
+ *		by H5Pget_external_count().  At most NAME_SIZE characters are
+ *		copied into the NAME array.  If the external file name is
+ *		longer than NAME_SIZE with the null terminator, then the
+ *		return value is not null terminated (similar to strncpy()).
+ *
+ *		If NAME_SIZE is zero or NAME is the null pointer then the
+ *		external file name is not returned.  If OFFSET or SIZE are
+ *		null pointers then the corresponding information is not
+ *		returned.
+ *
+ * See Also:	H5Pset_external()
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March  3, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and get property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_external(hid_t plist_id, unsigned idx, size_t name_size, char *name/*out*/,
+		 off_t *offset/*out*/, hsize_t *size/*out*/)
+{
+    H5O_efl_t           efl;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iIuzxxx", plist_id, idx, name_size, name, offset, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+    if(idx >= efl.nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "external file index is out of range")
+
+    /* Return values */
+    if(name_size>0 && name)
+        HDstrncpy(name, efl.slot[idx].name, name_size);
+    if(offset)
+        *offset = efl.slot[idx].offset;
+    if(size)
+        *size = efl.slot[idx].size;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_external() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_szip
+ *
+ * Purpose:	Sets the compression method for a permanent or transient
+ *		filter pipeline (depending on whether PLIST_ID is a dataset
+ *		creation or transfer property list) to H5Z_FILTER_SZIP
+ *		Szip is a special compression package that is said to be good
+ *              for scientific data.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Kent Yang
+ *              Tuesday, April 1, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_szip(hid_t plist_id, unsigned options_mask, unsigned pixels_per_block)
+{
+    H5O_pline_t         pline;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    unsigned cd_values[2];      /* Filter parameters */
+    unsigned int config_flags;
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, options_mask, pixels_per_block);
+
+    if(H5Z_get_filter_info(H5Z_FILTER_SZIP, &config_flags) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't get filter info")
+
+    if(!(config_flags & H5Z_FILTER_CONFIG_ENCODE_ENABLED))
+        HGOTO_ERROR(H5E_PLINE, H5E_NOENCODER, FAIL, "Filter present but encoding is disabled.")
+
+    /* Check arguments */
+    if((pixels_per_block % 2) == 1)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "pixels_per_block is not even")
+    if(pixels_per_block > H5_SZIP_MAX_PIXELS_PER_BLOCK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "pixels_per_block is too large")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Always set K13 compression (and un-set CHIP compression) */
+    options_mask &= (unsigned)(~H5_SZIP_CHIP_OPTION_MASK);
+    options_mask |= H5_SZIP_ALLOW_K13_OPTION_MASK;
+
+    /* Always set "raw" (no szip header) flag for data */
+    options_mask |= H5_SZIP_RAW_OPTION_MASK;
+
+    /* Mask off the LSB and MSB options, if they were given */
+    /* (The HDF5 library sets them internally, as needed) */
+    options_mask &= (unsigned)(~(H5_SZIP_LSB_OPTION_MASK | H5_SZIP_MSB_OPTION_MASK));
+
+    /* Set the parameters for the filter */
+    cd_values[0]=options_mask;
+    cd_values[1]=pixels_per_block;
+
+    /* Add the filter */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+    if(H5Z_append(&pline, H5Z_FILTER_SZIP, H5Z_FLAG_OPTIONAL, (size_t)2, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add szip filter to pipeline")
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_szip() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_shuffle
+ *
+ * Purpose:	Sets the shuffling method for a permanent
+ *		filter to H5Z_FILTER_SHUFFLE
+ *		and bytes of the datatype of the array to be shuffled
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Kent Yang
+ *              Wednesday, November 13, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_shuffle(hid_t plist_id)
+{
+    H5O_pline_t         pline;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", plist_id);
+
+    /* Check arguments */
+    if(TRUE != H5P_isa_class(plist_id, H5P_DATASET_CREATE))
+        HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* Get the plist structure */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(plist_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Add the filter */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+    if(H5Z_append(&pline, H5Z_FILTER_SHUFFLE, H5Z_FLAG_OPTIONAL, (size_t)0, NULL) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to shuffle the data")
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_shuffle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_nbit
+ *
+ * Purpose:     Sets nbit filter for a dataset creation property list
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Xiaowen Wu
+ *              Wednesday, December 22, 2004
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_nbit(hid_t plist_id)
+{
+    H5O_pline_t         pline;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", plist_id);
+
+    /* Check arguments */
+    if(TRUE != H5P_isa_class(plist_id, H5P_DATASET_CREATE))
+        HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* Get the plist structure */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(plist_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Add the nbit filter */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+    if(H5Z_append(&pline, H5Z_FILTER_NBIT, H5Z_FLAG_OPTIONAL, (size_t)0, NULL) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add nbit filter to pipeline")
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_nbit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_scaleoffset
+ *
+ * Purpose:     Sets scaleoffset filter for a dataset creation property list
+ *              and user-supplied parameters
+ *
+ * Parameters:  scale_factor:
+                              for integer datatype,
+                              this parameter will be
+                              minimum-bits, if this value is set to 0,
+                              scaleoffset filter will calculate the minimum-bits.
+
+                              For floating-point datatype,
+                              For variable-minimum-bits method, this will be
+                              the decimal precision of the filter,
+                              For fixed-minimum-bits method, this will be
+                              the minimum-bit of the filter.
+                scale_type:   0 for floating-point variable-minimum-bits,
+                              1 for floating-point fixed-minimum-bits,
+                              other values, for integer datatype
+
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Xiaowen Wu
+ *              Thursday, April 14, 2005
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_scaleoffset(hid_t plist_id, H5Z_SO_scale_type_t scale_type, int scale_factor)
+{
+    H5O_pline_t         pline;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    unsigned cd_values[2];      /* Filter parameters */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iZaIs", plist_id, scale_type, scale_factor);
+
+    /* Check arguments */
+    if(TRUE != H5P_isa_class(plist_id, H5P_DATASET_CREATE))
+        HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    if(scale_factor < 0)
+       HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "scale factor must be >= 0")
+    if(scale_type!=H5Z_SO_FLOAT_DSCALE && scale_type!=H5Z_SO_FLOAT_ESCALE && scale_type!=H5Z_SO_INT)
+       HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid scale type")
+
+    /* Get the plist structure */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(plist_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set parameters for the filter
+     * scale_type = 0:     floating-point type, filter uses variable-minimum-bits method,
+     *                     scale_factor is decimal scale factor
+     * scale_type = 1:     floating-point type, filter uses fixed-minimum-bits method,
+     *                     scale_factor is the fixed minimum number of bits
+     * scale type = other: integer type, scale_factor is minimum number of bits
+     *                     if scale_factor = 0, then filter calculates minimum number of bits
+     */
+    cd_values[0] = scale_type;
+    cd_values[1] = (unsigned)scale_factor;
+
+    /* Add the scaleoffset filter */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+    if(H5Z_append(&pline, H5Z_FILTER_SCALEOFFSET, H5Z_FLAG_OPTIONAL, (size_t)2, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add scaleoffset filter to pipeline")
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_scaleoffset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_fill_value
+ *
+ * Purpose:	Set the fill value for a dataset creation property list. The
+ *		VALUE is interpretted as being of type TYPE, which need not
+ *		be the same type as the dataset but the library must be able
+ *		to convert VALUE to the dataset type when the dataset is
+ *		created.  If VALUE is NULL, it will be interpreted as
+ *		undefining fill value.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fill_value(hid_t plist_id, hid_t type_id, const void *value)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    H5O_fill_t fill;                    /* Fill value to modify */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii*x", plist_id, type_id, value);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the current fill value */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+    /* Release the dynamic fill value components */
+    H5O_fill_reset_dyn(&fill);
+
+    if(value) {
+        H5T_t *type;            /* Datatype for fill value */
+        H5T_path_t *tpath;      /* Conversion information */
+
+        /* Retrieve pointer to datatype */
+	if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+	/* Set the fill value */
+        if(NULL == (fill.type = H5T_copy(type, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy datatype")
+        fill.size = (ssize_t)H5T_get_size(type);
+        if(NULL == (fill.buf = H5MM_malloc((size_t)fill.size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "memory allocation failed for fill value")
+        HDmemcpy(fill.buf, value, (size_t)fill.size);
+
+        /* Set up type conversion function */
+        if(NULL == (tpath = H5T_path_find(type, type, NULL, NULL, H5AC_ind_dxpl_id, FALSE)))
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types")
+
+        /* If necessary, convert fill value datatypes (which copies VL components, etc.) */
+        if(!H5T_path_noop(tpath)) {
+            uint8_t *bkg_buf = NULL;    /* Background conversion buffer */
+
+            /* Allocate a background buffer */
+            if(H5T_path_bkg(tpath) && NULL == (bkg_buf = H5FL_BLK_CALLOC(type_conv, (size_t)fill.size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Convert the fill value */
+            if(H5T_convert(tpath, type_id, type_id, (size_t)1, (size_t)0, (size_t)0, fill.buf, bkg_buf, H5AC_ind_dxpl_id) < 0) {
+                if(bkg_buf)
+                    bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "datatype conversion failed")
+            } /* end if */
+
+            /* Release the background buffer */
+            if(bkg_buf)
+                bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf);
+        } /* end if */
+    }  /* end if */
+    else
+        fill.size = (-1);
+
+    /* Update fill value in property list */
+    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set fill value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fill_value() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_fill_value
+ *
+ * Purpose:	Queries the fill value property of a dataset creation
+ *		property list.  The fill value is returned through the VALUE
+ *		pointer and the memory is allocated by the caller.  The fill
+ *		value will be converted from its current datatype to the
+ *		specified TYPE.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_get_fill_value(H5P_genplist_t *plist, const H5T_t *type, void *value/*out*/,
+    hid_t dxpl_id)
+{
+    H5O_fill_t          fill;                   /* Fill value to retrieve */
+    H5T_path_t		*tpath;		        /*type conversion info	*/
+    void		*buf = NULL;		/*conversion buffer	*/
+    void		*bkg = NULL;		/*conversion buffer	*/
+    hid_t		src_id = -1;		/*source datatype id	*/
+    hid_t		dst_id = -1;		/*destination datatype id	*/
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * If no fill value is defined then return an error.  We can't even
+     * return zero because we don't know the datatype of the dataset and
+     * datatype conversion might not have resulted in zero.  If fill value
+     * is undefined, also return error.
+     */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+    if(fill.size == -1)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "fill value is undefined")
+
+    /* Check for "default" fill value */
+    if(fill.size == 0) {
+	HDmemset(value, 0, H5T_get_size(type));
+   	HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+     /*
+     * Can we convert between the source and destination datatypes?
+     */
+    if(NULL == (tpath = H5T_path_find(fill.type, type, NULL, NULL, dxpl_id, FALSE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
+    if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(fill.type, H5T_COPY_TRANSIENT), FALSE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
+
+    /*
+     * Data type conversions are always done in place, so we need a buffer
+     * other than the fill value buffer that is large enough for both source
+     * and destination.  The app-supplied buffer might do okay.
+     */
+    if(H5T_get_size(type) >= H5T_get_size(fill.type)) {
+        buf = value;
+        if(H5T_path_bkg(tpath) && NULL == (bkg = H5MM_malloc(H5T_get_size(type))))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for type conversion")
+    } /* end if */
+    else {
+        if(NULL == (buf = H5MM_malloc(H5T_get_size(fill.type))))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for type conversion")
+        if(H5T_path_bkg(tpath) && NULL == (bkg = H5MM_malloc(H5T_get_size(fill.type))))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for type conversion")
+    } /* end else */
+    HDmemcpy(buf, fill.buf, H5T_get_size(fill.type));
+
+    /* Do the conversion */
+    if((dst_id = H5I_register(H5I_DATATYPE, H5T_copy(type, H5T_COPY_TRANSIENT), FALSE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
+    if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, buf, bkg, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "datatype conversion failed")
+    if(buf != value)
+        HDmemcpy(value, buf, H5T_get_size(type));
+
+done:
+    if(buf != value)
+        H5MM_xfree(buf);
+    if(bkg != value)
+        H5MM_xfree(bkg);
+    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_PLIST, H5E_CANTDEC, FAIL, "can't decrement ref count of temp ID")
+    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_PLIST, H5E_CANTDEC, FAIL, "can't decrement ref count of temp ID")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_get_fill_value() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_fill_value
+ *
+ * Purpose:	Queries the fill value property of a dataset creation
+ *		property list.  The fill value is returned through the VALUE
+ *		pointer and the memory is allocated by the caller.  The fill
+ *		value will be converted from its current datatype to the
+ *		specified TYPE.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, October  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fill_value(hid_t plist_id, hid_t type_id, void *value/*out*/)
+{
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    H5T_t		*type;		        /* Datatype		*/
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iix", plist_id, type_id, value);
+
+    /* Check arguments */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(!value)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,"no fill value output buffer")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the fill value */
+    if(H5P_get_fill_value(plist, type, value, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_fill_value() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_is_fill_value_defined
+ *
+ * Purpose:	Check if fill value is defined.  Internal version of function
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, January 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_is_fill_value_defined(const H5O_fill_t *fill, H5D_fill_value_t *status)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(fill);
+    HDassert(status);
+
+    /* Check if the fill value was "unset" */
+    if(fill->size == -1 && !fill->buf)
+	*status = H5D_FILL_VALUE_UNDEFINED;
+    /* Check if the fill value was set to the default fill value by the library */
+    else if(fill->size == 0 && !fill->buf)
+	*status = H5D_FILL_VALUE_DEFAULT;
+    /* Check if the fill value was set by the application */
+    else if(fill->size > 0 && fill->buf)
+	*status = H5D_FILL_VALUE_USER_DEFINED;
+    else {
+	*status = H5D_FILL_VALUE_ERROR;
+        HGOTO_ERROR(H5E_PLIST, H5E_BADRANGE, FAIL, "invalid combination of fill-value info")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_is_fill_value_defined() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_fill_value_defined
+ *
+ * Purpose:	Check if fill value is defined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_fill_value_defined(H5P_genplist_t *plist, H5D_fill_value_t *status)
+{
+    H5O_fill_t	        fill;                   /* Fill value to query */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(status);
+
+    /* Get the fill value struct */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+    /* Get the fill-value status */
+    if(H5P_is_fill_value_defined(&fill, status) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't check fill value status")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_fill_value_defined() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pfill_value_defined
+ *
+ * Purpose:	Check if fill value is defined.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, January 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pfill_value_defined(hid_t plist_id, H5D_fill_value_t *status)
+{
+    H5P_genplist_t 	*plist;                 /* Property list to query */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*DF", plist_id, status);
+
+    HDassert(status);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the fill-value status */
+    if(H5P_fill_value_defined(plist, status) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't check fill value status")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pfill_value_defined() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_alloc_time
+ *
+ * Purpose:     Set space allocation time for dataset during creation.
+ *		Valid values are H5D_ALLOC_TIME_DEFAULT, H5D_ALLOC_TIME_EARLY,
+ *			H5D_ALLOC_TIME_LATE, H5D_ALLOC_TIME_INCR
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ * 		Wednesday, January 16, 2002
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t alloc_time)
+{
+    H5P_genplist_t *plist; 	/* Property list pointer */
+    H5O_fill_t fill;            /* Fill value property to modify */
+    unsigned alloc_time_state;  /* State of allocation time property */
+    herr_t ret_value = SUCCEED; /* return value 	 */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDa", plist_id, alloc_time);
+
+    /* Check arguments */
+    if(alloc_time < H5D_ALLOC_TIME_DEFAULT || alloc_time > H5D_ALLOC_TIME_INCR)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid allocation time setting")
+
+    /* Get the property list structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Check for resetting to default for layout type */
+    if(alloc_time == H5D_ALLOC_TIME_DEFAULT) {
+        H5O_layout_t layout;            /* Type of storage layout */
+
+        /* Retrieve the storage layout */
+        if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
+
+        /* Set the default based on layout */
+        switch(layout.type) {
+            case H5D_COMPACT:
+                alloc_time = H5D_ALLOC_TIME_EARLY;
+                break;
+
+            case H5D_CONTIGUOUS:
+                alloc_time = H5D_ALLOC_TIME_LATE;
+                break;
+
+            case H5D_CHUNKED:
+                alloc_time = H5D_ALLOC_TIME_INCR;
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
+        } /* end switch */
+
+        /* Reset the "state" of the allocation time property back to the "default" */
+        alloc_time_state = 1;
+    } /* end if */
+    else
+        /* Set the "state" of the allocation time property to indicate the user modified it */
+        alloc_time_state = 0;
+
+    /* Retrieve previous fill value settings */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+    /* Update property value */
+    fill.alloc_time = alloc_time;
+
+    /* Set values */
+    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
+    if(H5P_set(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set space allocation time")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_alloc_time() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_alloc_time
+ *
+ * Purpose:     Get space allocation time for dataset creation.
+ *		Valid values are H5D_ALLOC_TIME_DEFAULT, H5D_ALLOC_TIME_EARLY,
+ *			H5D_ALLOC_TIME_LATE, H5D_ALLOC_TIME_INCR
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, January 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_alloc_time(hid_t plist_id, H5D_alloc_time_t *alloc_time/*out*/)
+{
+    herr_t ret_value = SUCCEED; /* return value          */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, alloc_time);
+
+    /* Get values */
+    if(alloc_time) {
+        H5P_genplist_t *plist;  /* Property list pointer */
+        H5O_fill_t fill;        /* Fill value property to query */
+
+        /* Get the property list structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Retrieve fill value settings */
+        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+        /* Set user's value */
+        *alloc_time = fill.alloc_time;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_alloc_time() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fill_time
+ *
+ * Purpose:	Set fill value writing time for dataset.  Valid values are
+ *		H5D_FILL_TIME_ALLOC and H5D_FILL_TIME_NEVER.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, January 16, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fill_time(hid_t plist_id, H5D_fill_time_t fill_time)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_fill_t fill;            /* Fill value property to modify */
+    herr_t ret_value = SUCCEED; /* return value          */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDf", plist_id, fill_time);
+
+    /* Check arguments */
+    if(fill_time < H5D_FILL_TIME_ALLOC || fill_time > H5D_FILL_TIME_IFSET)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid fill time setting")
+
+    /* Get the property list structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Retrieve previous fill value settings */
+    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+    /* Update property value */
+    fill.fill_time = fill_time;
+
+    /* Set values */
+    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fill_time() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_fill_time
+ *
+ * Purpose:	Get fill value writing time.  Valid values are H5D_NEVER
+ *		and H5D_ALLOC.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              Wednesday, January 16, 2002
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fill_time(hid_t plist_id, H5D_fill_time_t *fill_time/*out*/)
+{
+    herr_t ret_value = SUCCEED; /* return value          */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, fill_time);
+
+    /* Set values */
+    if(fill_time) {
+        H5P_genplist_t *plist;  /* Property list pointer */
+        H5O_fill_t fill;        /* Fill value property to query */
+
+        /* Get the property list structure */
+        if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Retrieve fill value settings */
+        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+        /* Set user's value */
+        *fill_time = fill.fill_time;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_fill_time() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pdeprec.c b/gatb-core/thirdparty/hdf5/src/H5Pdeprec.c
new file mode 100644
index 0000000..e265c50
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pdeprec.c
@@ -0,0 +1,485 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Pdeprec.c
+ *		October 11 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5P interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5P__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files		  	        */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5P__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5P__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5P_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5P_init())
+} /* H5P__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5P__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5P__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5P__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5P__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pregister1
+ PURPOSE
+    Routine to register a new property in a property list class.
+ USAGE
+    herr_t H5Pregister1(class, name, size, default, prp_create, prp_set, prp_get, prp_close)
+        hid_t class;            IN: Property list class to close
+        const char *name;       IN: Name of property to register
+        size_t size;            IN: Size of property in bytes
+        void *def_value;        IN: Pointer to buffer containing default value
+                                    for property in newly created property lists
+        H5P_prp_create_func_t prp_create;   IN: Function pointer to property
+                                    creation callback
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Registers a new property with a property list class.  The property will
+    exist in all property list objects of that class after this routine is
+    finished.  The name of the property must not already exist.  The default
+    property value must be provided and all new property lists created with this
+    property will have the property value set to the default provided.  Any of
+    the callback routines may be set to NULL if they are not needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'default' pointer for a
+    zero-sized property may be set to NULL.  The property 'create' & 'close'
+    callbacks are called for zero-sized properties, but the 'set' and 'get'
+    callbacks are never called.
+
+        The 'create' callback is called when a new property list with this
+    property is being created.  H5P_prp_create_func_t is defined as:
+        typedef herr_t (*H5P_prp_create_func_t)(hid_t prop_id, const char *name,
+                size_t size, void *initial_value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being created.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *initial_value; IN/OUT: The initial value for the property being created.
+                                (The 'default' value passed to H5Pregister1)
+    The 'create' routine may modify the value to be set and those changes will
+    be stored as the initial value of the property.  If the 'create' routine
+    returns a negative value, the new property value is not copied into the
+    property and the property list creation routine returns an error value.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pregister1(hid_t cls_id, const char *name, size_t size, void *def_value,
+    H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close)
+{
+    H5P_genclass_t *pclass;         /* Property list class to modify */
+    H5P_genclass_t *orig_pclass;    /* Original property class */
+    herr_t ret_value;               /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE10("e", "i*sz*xxxxxxx", cls_id, name, size, def_value, prp_create,
+             prp_set, prp_get, prp_delete, prp_copy, prp_close);
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(cls_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class");
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid class name");
+    if(size > 0 && def_value == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default");
+
+    /* Create the new property list class */
+    orig_pclass = pclass;
+    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, NULL, prp_close)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in class");
+
+    /* Check if the property class changed and needs to be substituted in the ID */
+    if(pclass != orig_pclass) {
+        H5P_genclass_t *old_pclass;     /* Old property class */
+
+        /* Substitute the new property class in the ID */
+        if(NULL == (old_pclass = (H5P_genclass_t *)H5I_subst(cls_id, pclass)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to substitute property class in ID")
+        HDassert(old_pclass == orig_pclass);
+
+        /* Close the previous class */
+        if(H5P_close_class(orig_pclass) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "unable to close original property class after substitution")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pregister1() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pinsert1
+ PURPOSE
+    Routine to insert a new property in a property list.
+ USAGE
+    herr_t H5Pinsert1(plist, name, size, value, prp_set, prp_get, prp_close)
+        hid_t plist;            IN: Property list to add property to
+        const char *name;       IN: Name of property to add
+        size_t size;            IN: Size of property in bytes
+        void *value;            IN: Pointer to the value for the property
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Inserts a temporary property into a property list.  The property will
+    exist only in this property list object.  The name of the property must not
+    already exist.  The value must be provided unless the property is zero-
+    sized.  Any of the callback routines may be set to NULL if they are not
+    needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'value' pointer for a
+    zero-sized property may be set to NULL.  The property 'close' callback is
+    called for zero-sized properties, but the 'set' and 'get' callbacks are
+    never called.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        There is no 'create' callback routine for temporary property list
+    objects, the initial value is assumed to have any necessary setup already
+    performed on it.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pinsert1(hid_t plist_id, const char *name, size_t size, void *value,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_close_func_t prp_close)
+{
+    H5P_genplist_t	*plist;    /* Property list to modify */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE9("e", "i*sz*xxxxxx", plist_id, name, size, value, prp_set, prp_get,
+             prp_delete, prp_copy, prp_close);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name")
+    if(size > 0 && value == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default")
+
+    /* Create the new property list class */
+    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get, prp_delete, prp_copy, NULL, prp_close)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in plist")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pinsert1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pdxpl.c b/gatb-core/thirdparty/hdf5/src/H5Pdxpl.c
new file mode 100644
index 0000000..ce16036
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pdxpl.c
@@ -0,0 +1,1453 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pdxpl.c
+ *			March 16 1998
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		Data transfer property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ======== Data transfer properties ======== */
+/* Definitions for maximum temp buffer size property */
+#define H5D_XFER_MAX_TEMP_BUF_SIZE      sizeof(size_t)
+#define H5D_XFER_MAX_TEMP_BUF_DEF       H5D_TEMP_BUF_SIZE
+/* Definitions for type conversion buffer property */
+#define H5D_XFER_TCONV_BUF_SIZE         sizeof(void *)
+#define H5D_XFER_TCONV_BUF_DEF          NULL
+/* Definitions for background buffer property */
+#define H5D_XFER_BKGR_BUF_SIZE          sizeof(void *)
+#define H5D_XFER_BKGR_BUF_DEF           NULL
+/* Definitions for background buffer type property */
+#define H5D_XFER_BKGR_BUF_TYPE_SIZE     sizeof(H5T_bkg_t)
+#define H5D_XFER_BKGR_BUF_TYPE_DEF      H5T_BKG_NO
+/* Definitions for B-tree node splitting ratio property */
+/* (These default B-tree node splitting ratios are also used for splitting
+ * group's B-trees as well as chunked dataset's B-trees - QAK)
+ */
+#define H5D_XFER_BTREE_SPLIT_RATIO_SIZE sizeof(double[3])
+#define H5D_XFER_BTREE_SPLIT_RATIO_DEF  {0.1F, 0.5F, 0.9F}
+/* Definitions for vlen allocation function property */
+#define H5D_XFER_VLEN_ALLOC_SIZE        sizeof(H5MM_allocate_t)
+#define H5D_XFER_VLEN_ALLOC_DEF         H5D_VLEN_ALLOC
+/* Definitions for vlen allocation info property */
+#define H5D_XFER_VLEN_ALLOC_INFO_SIZE   sizeof(void *)
+#define H5D_XFER_VLEN_ALLOC_INFO_DEF    H5D_VLEN_ALLOC_INFO
+/* Definitions for vlen free function property */
+#define H5D_XFER_VLEN_FREE_SIZE         sizeof(H5MM_free_t)
+#define H5D_XFER_VLEN_FREE_DEF          H5D_VLEN_FREE
+/* Definitions for vlen free info property */
+#define H5D_XFER_VLEN_FREE_INFO_SIZE    sizeof(void *)
+#define H5D_XFER_VLEN_FREE_INFO_DEF     H5D_VLEN_FREE_INFO
+/* Definitions for hyperslab vector size property */
+/* (Be cautious about increasing the default size, there are arrays allocated
+ *      on the stack which depend on it - QAK)
+ */
+#define H5D_XFER_HYPER_VECTOR_SIZE_SIZE sizeof(size_t)
+#define H5D_XFER_HYPER_VECTOR_SIZE_DEF  H5D_IO_VECTOR_SIZE
+
+#ifdef H5_HAVE_PARALLEL
+/* Definitions for I/O transfer mode property */
+#define H5D_XFER_IO_XFER_MODE_SIZE      sizeof(H5FD_mpio_xfer_t)
+#define H5D_XFER_IO_XFER_MODE_DEF       H5FD_MPIO_INDEPENDENT
+/* Definitions for optimization of MPI-IO transfer mode property */
+#define H5D_XFER_MPIO_COLLECTIVE_OPT_SIZE       sizeof(H5FD_mpio_collective_opt_t)
+#define H5D_XFER_MPIO_COLLECTIVE_OPT_DEF        H5FD_MPIO_COLLECTIVE_IO
+#define H5D_XFER_MPIO_CHUNK_OPT_HARD_SIZE       sizeof(H5FD_mpio_chunk_opt_t)
+#define H5D_XFER_MPIO_CHUNK_OPT_HARD_DEF        H5FD_MPIO_CHUNK_DEFAULT
+#define H5D_XFER_MPIO_CHUNK_OPT_NUM_SIZE        sizeof(unsigned)
+#define H5D_XFER_MPIO_CHUNK_OPT_NUM_DEF         H5D_ONE_LINK_CHUNK_IO_THRESHOLD
+#define H5D_XFER_MPIO_CHUNK_OPT_RATIO_SIZE      sizeof(unsigned)
+#define H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEF       H5D_MULTI_CHUNK_IO_COL_THRESHOLD
+/* Definitions for chunk opt mode property. */
+#define H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_SIZE     sizeof(H5D_mpio_actual_chunk_opt_mode_t)
+#define H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_DEF      H5D_MPIO_NO_CHUNK_OPTIMIZATION
+/* Definitions for chunk io mode property. */
+#define H5D_MPIO_ACTUAL_IO_MODE_SIZE    sizeof(H5D_mpio_actual_io_mode_t)
+#define H5D_MPIO_ACTUAL_IO_MODE_DEF     H5D_MPIO_NO_COLLECTIVE
+/* Definitions for cause of broken collective io property */
+#define H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE   sizeof(uint32_t)
+#define H5D_MPIO_NO_COLLECTIVE_CAUSE_DEF   H5D_MPIO_COLLECTIVE 
+/* Definitions for memory MPI type property */
+#define H5FD_MPI_XFER_MEM_MPI_TYPE_SIZE        sizeof(MPI_Datatype)
+#define H5FD_MPI_XFER_MEM_MPI_TYPE_DEF         MPI_DATATYPE_NULL
+/* Definitions for file MPI type property */
+#define H5FD_MPI_XFER_FILE_MPI_TYPE_SIZE       sizeof(MPI_Datatype)
+#define H5FD_MPI_XFER_FILE_MPI_TYPE_DEF        MPI_DATATYPE_NULL
+#endif /* H5_HAVE_PARALLEL */
+
+/* Definitions for EDC property */
+#define H5D_XFER_EDC_SIZE           sizeof(H5Z_EDC_t)
+#define H5D_XFER_EDC_DEF            H5Z_ENABLE_EDC
+/* Definitions for filter callback function property */
+#define H5D_XFER_FILTER_CB_SIZE     sizeof(H5Z_cb_t)
+#define H5D_XFER_FILTER_CB_DEF      {NULL,NULL}
+/* Definitions for type conversion callback function property */
+#define H5D_XFER_CONV_CB_SIZE       sizeof(H5T_conv_cb_t)
+#define H5D_XFER_CONV_CB_DEF        {NULL,NULL}
+/* Definitions for data transform property */
+#define H5D_XFER_XFORM_SIZE         sizeof(void *)
+#define H5D_XFER_XFORM_DEF          NULL
+#define H5D_XFER_XFORM_DEL          H5P__dxfr_xform_del
+#define H5D_XFER_XFORM_COPY         H5P__dxfr_xform_copy
+#define H5D_XFER_XFORM_CMP          H5P__dxfr_xform_cmp
+#define H5D_XFER_XFORM_CLOSE        H5P__dxfr_xform_close
+/* Definitions for properties of direct chunk write */
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE		sizeof(hbool_t)
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF		FALSE
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE	sizeof(uint32_t)
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF		0
+#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE		sizeof(hsize_t *)
+#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF		NULL
+#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE	sizeof(uint32_t)
+#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF	0
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P__dxfr_reg_prop(H5P_genclass_t *pclass);
+
+/* Property list callbacks */
+static herr_t H5P__dxfr_xform_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dxfr_xform_copy(const char* name, size_t size, void* value);
+static int H5P__dxfr_xform_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__dxfr_xform_close(const char* name, size_t size, void* value);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Data transfer property list class library initialization object */
+const H5P_libclass_t H5P_CLS_DXFR[1] = {{
+    "data transfer",		/* Class name for debugging     */
+    H5P_TYPE_DATASET_XFER,      /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_DATASET_XFER_g,	/* Pointer to class             */
+    &H5P_CLS_DATASET_XFER_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_DATASET_XFER_ID_g,	/* Pointer to default property list ID */
+    H5P__dxfr_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/***************************/
+/* Local Private Variables */
+/***************************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dxfr_reg_prop
+ *
+ * Purpose:     Register the data transfer property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
+{
+    size_t def_max_temp_buf = H5D_XFER_MAX_TEMP_BUF_DEF;        /* Default value for maximum temp buffer size */
+    void *def_tconv_buf = H5D_XFER_TCONV_BUF_DEF;               /* Default value for type conversion buffer */
+    void *def_bkgr_buf = H5D_XFER_BKGR_BUF_DEF;                 /* Default value for background buffer */
+    H5T_bkg_t def_bkgr_buf_type = H5D_XFER_BKGR_BUF_TYPE_DEF;
+    double def_btree_split_ratio[3] = H5D_XFER_BTREE_SPLIT_RATIO_DEF;   /* Default value for B-tree node split ratios */
+    H5MM_allocate_t def_vlen_alloc = H5D_XFER_VLEN_ALLOC_DEF;   /* Default value for vlen allocation function */
+    void *def_vlen_alloc_info = H5D_XFER_VLEN_ALLOC_INFO_DEF;   /* Default value for vlen allocation information */
+    H5MM_free_t def_vlen_free = H5D_XFER_VLEN_FREE_DEF;         /* Default value for vlen free function */
+    void *def_vlen_free_info = H5D_XFER_VLEN_FREE_INFO_DEF;     /* Default value for vlen free information */
+    size_t def_hyp_vec_size = H5D_XFER_HYPER_VECTOR_SIZE_DEF;   /* Default value for vector size */
+#ifdef H5_HAVE_PARALLEL
+    H5FD_mpio_xfer_t def_io_xfer_mode = H5D_XFER_IO_XFER_MODE_DEF;      /* Default value for I/O transfer mode */
+    H5FD_mpio_chunk_opt_t def_mpio_chunk_opt_mode = H5D_XFER_MPIO_CHUNK_OPT_HARD_DEF;
+    H5FD_mpio_collective_opt_t def_mpio_collective_opt_mode = H5D_XFER_MPIO_COLLECTIVE_OPT_DEF;
+    unsigned def_mpio_chunk_opt_num = H5D_XFER_MPIO_CHUNK_OPT_NUM_DEF;
+    unsigned def_mpio_chunk_opt_ratio = H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEF;
+    H5D_mpio_actual_chunk_opt_mode_t def_mpio_actual_chunk_opt_mode = H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_DEF;
+    H5D_mpio_actual_io_mode_t def_mpio_actual_io_mode = H5D_MPIO_ACTUAL_IO_MODE_DEF;
+    H5D_mpio_no_collective_cause_t def_mpio_no_collective_cause = H5D_MPIO_NO_COLLECTIVE_CAUSE_DEF; 
+    MPI_Datatype btype = H5FD_MPI_XFER_MEM_MPI_TYPE_DEF;  /* Default value for MPI buffer type */
+    MPI_Datatype ftype = H5FD_MPI_XFER_FILE_MPI_TYPE_DEF; /* Default value for MPI file type */
+#endif /* H5_HAVE_PARALLEL */
+    H5Z_EDC_t enable_edc = H5D_XFER_EDC_DEF;            /* Default value for EDC property */
+    H5Z_cb_t filter_cb = H5D_XFER_FILTER_CB_DEF;        /* Default value for filter callback */
+    H5T_conv_cb_t conv_cb = H5D_XFER_CONV_CB_DEF;       /* Default value for datatype conversion callback */
+    void *def_xfer_xform = H5D_XFER_XFORM_DEF;          /* Default value for data transform */
+    hbool_t direct_chunk_flag = H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF; 	        /* Default value for the flag of direct chunk write */
+    uint32_t direct_chunk_filters = H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF;	/* Default value for the filters of direct chunk write */
+    hsize_t *direct_chunk_offset = H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF; 	/* Default value for the offset of direct chunk write */
+    uint32_t direct_chunk_datasize = H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF;    /* Default value for the datasize of direct chunk write */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register the max. temp buffer size property */
+    if(H5P_register_real(pclass, H5D_XFER_MAX_TEMP_BUF_NAME, H5D_XFER_MAX_TEMP_BUF_SIZE, &def_max_temp_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the type conversion buffer property */
+    if(H5P_register_real(pclass, H5D_XFER_TCONV_BUF_NAME, H5D_XFER_TCONV_BUF_SIZE, &def_tconv_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the background buffer property */
+    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_NAME, H5D_XFER_BKGR_BUF_SIZE, &def_bkgr_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the background buffer type property */
+    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_TYPE_NAME, H5D_XFER_BKGR_BUF_TYPE_SIZE, &def_bkgr_buf_type, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the B-Tree node splitting ratios property */
+    if(H5P_register_real(pclass, H5D_XFER_BTREE_SPLIT_RATIO_NAME, H5D_XFER_BTREE_SPLIT_RATIO_SIZE, def_btree_split_ratio, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the vlen allocation function property */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_NAME, H5D_XFER_VLEN_ALLOC_SIZE, &def_vlen_alloc, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the vlen allocation information property */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_INFO_NAME, H5D_XFER_VLEN_ALLOC_INFO_SIZE, &def_vlen_alloc_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the vlen free function property */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_NAME, H5D_XFER_VLEN_FREE_SIZE, &def_vlen_free, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the vlen free information property */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_INFO_NAME, H5D_XFER_VLEN_FREE_INFO_SIZE, &def_vlen_free_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the vector size property */
+    if(H5P_register_real(pclass, H5D_XFER_HYPER_VECTOR_SIZE_NAME, H5D_XFER_HYPER_VECTOR_SIZE_SIZE, &def_hyp_vec_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+#ifdef H5_HAVE_PARALLEL
+    /* Register the I/O transfer mode properties */
+    if(H5P_register_real(pclass, H5D_XFER_IO_XFER_MODE_NAME, H5D_XFER_IO_XFER_MODE_SIZE, &def_io_xfer_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, H5D_XFER_MPIO_COLLECTIVE_OPT_SIZE, &def_mpio_collective_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, H5D_XFER_MPIO_CHUNK_OPT_HARD_SIZE, &def_mpio_chunk_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, H5D_XFER_MPIO_CHUNK_OPT_NUM_SIZE, &def_mpio_chunk_opt_num, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, H5D_XFER_MPIO_CHUNK_OPT_RATIO_SIZE, &def_mpio_chunk_opt_ratio, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the chunk optimization mode property. */
+    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_SIZE, &def_mpio_actual_chunk_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the actual I/O mode property. */
+    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_IO_MODE_NAME, H5D_MPIO_ACTUAL_IO_MODE_SIZE, &def_mpio_actual_io_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the local cause of broken collective I/O */
+    if(H5P_register_real(pclass, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &def_mpio_no_collective_cause, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the global cause of broken collective I/O */
+    if(H5P_register_real(pclass, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &def_mpio_no_collective_cause, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the MPI memory type property */
+    if(H5P_register_real(pclass, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, H5FD_MPI_XFER_MEM_MPI_TYPE_SIZE, 
+                         &btype, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the MPI file type property */
+    if(H5P_register_real(pclass, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, H5FD_MPI_XFER_FILE_MPI_TYPE_SIZE, 
+                         &ftype, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Register the EDC property */
+    if(H5P_register_real(pclass, H5D_XFER_EDC_NAME, H5D_XFER_EDC_SIZE, &enable_edc, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the filter callback property */
+    if(H5P_register_real(pclass, H5D_XFER_FILTER_CB_NAME, H5D_XFER_FILTER_CB_SIZE, &filter_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the type conversion callback property */
+    if(H5P_register_real(pclass, H5D_XFER_CONV_CB_NAME, H5D_XFER_CONV_CB_SIZE, &conv_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the data transform property */
+    if(H5P_register_real(pclass, H5D_XFER_XFORM_NAME, H5D_XFER_XFORM_SIZE, &def_xfer_xform, NULL, NULL, NULL, H5D_XFER_XFORM_DEL, H5D_XFER_XFORM_COPY, H5D_XFER_XFORM_CMP, H5D_XFER_XFORM_CLOSE) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the property of flag for direct chunk write */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE, &direct_chunk_flag,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the property of filter for direct chunk write */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE, &direct_chunk_filters,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the property of offset for direct chunk write */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE, &direct_chunk_offset,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the property of datasize for direct chunk write */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE, &direct_chunk_datasize,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P_dxfr_xform_del
+ *
+ * Purpose: Frees memory allocated by H5P_dxfr_xform_set
+ *
+ * Return: Success: SUCCEED, Failure: FAIL
+ *
+ * Programmer: Leon Arber larber at uiuc.edu
+ *
+ * Date: April 9, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__dxfr_xform_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(value);
+
+    if(H5Z_xform_destroy(*(H5Z_data_xform_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "error closing the parse tree")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P__dxfr_xform_copy
+ *
+ * Purpose: Creates a copy of the user's data transform string and its
+ *              associated parse tree.
+ *
+ * Return: Success: SUCCEED, Failure: FAIL
+ *
+ * Programmer: Leon Arber larber at uiuc.edu
+ *
+ * Date: April 9, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__dxfr_xform_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(value);
+
+    if(H5Z_xform_copy((H5Z_data_xform_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "error copying the data transform info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P__dxfr_xform_cmp
+ *
+ * Purpose: Compare two data transforms.
+ *
+ * Return: positive if VALUE1 is greater than VALUE2, negative if VALUE2 is
+ *		greater than VALUE1 and zero if VALUE1 and VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__dxfr_xform_cmp(const void *_xform1, const void *_xform2, size_t H5_ATTR_UNUSED size)
+{
+    const H5Z_data_xform_t * const *xform1 = (const H5Z_data_xform_t * const *)_xform1; /* Create local aliases for values */
+    const H5Z_data_xform_t * const *xform2 = (const H5Z_data_xform_t * const *)_xform2; /* Create local aliases for values */
+    const char *pexp1, *pexp2;          /* Pointers to transform expressions */
+    herr_t ret_value = 0;               /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(xform1);
+    HDassert(xform2);
+    HDassert(size == sizeof(H5Z_data_xform_t *));
+
+    /* Check for a property being set */
+    if(*xform1 == NULL && *xform2 != NULL) HGOTO_DONE(-1);
+    if(*xform1 != NULL && *xform2 == NULL) HGOTO_DONE(1);
+
+    if(*xform1) {
+        HDassert(*xform2);
+    
+        /* Get the transform expressions */
+        pexp1 = H5Z_xform_extract_xform_str(*xform1);
+        pexp2 = H5Z_xform_extract_xform_str(*xform2);
+
+        /* Check for property expressions */
+        if(pexp1 == NULL && pexp2 != NULL) HGOTO_DONE(-1);
+        if(pexp1 != NULL && pexp2 == NULL) HGOTO_DONE(1);
+
+        if(pexp1) {
+            HDassert(pexp2);
+            ret_value = HDstrcmp(pexp1, pexp2);
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P__dxfr_xform_close
+ *
+ * Purpose: Frees memory allocated by H5P_dxfr_xform_set
+ *
+ * Return: Success: SUCCEED, Failure: FAIL
+ *
+ * Programmer: Leon Arber larber at uiuc.edu
+ *
+ * Date: April 9, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__dxfr_xform_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(value);
+
+    if(H5Z_xform_destroy(*(H5Z_data_xform_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "error closing the parse tree")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_data_transform
+ *
+ * Purpose:	Sets data transform expression.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Leon Arber
+ *              Monday, March 07, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_data_transform(hid_t plist_id, const char *expression)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5Z_data_xform_t *data_xform_prop = NULL;    /* New data xform property */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", plist_id, expression);
+
+    /* Check arguments */
+    if(expression == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "expression cannot be NULL")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* See if a data transform is already set, and free it if it is */
+    if(H5P_get(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data transform expression")
+
+    /* Destroy previous data transform property */
+    if(H5Z_xform_destroy(data_xform_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CLOSEERROR, FAIL, "unable to release data transform expression")
+
+    /* Create data transform info from expression */
+    if(NULL == (data_xform_prop = H5Z_xform_create(expression)))
+        HGOTO_ERROR(H5E_PLINE, H5E_NOSPACE, FAIL, "unable to create data transform info")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "Error setting data transform expression")
+
+done:
+    if(ret_value <  0) {
+        if(data_xform_prop && H5Z_xform_destroy(data_xform_prop) <  0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "unable to release data transform expression")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_data_transform() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_data_transform
+ *
+ * Purpose:	Gets data transform expression.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Comments:
+ *  If `expression' is non-NULL then write up to `size' bytes into that
+ *  buffer and always return the length of the transform name.
+ *  Otherwise `size' is ignored and the function does not store the expression,
+ *  just returning the number of characters required to store the expression.
+ *  If an error occurs then the buffer pointed to by `expression' (NULL or non-NULL)
+ *  is unchanged and the function returns a negative value.
+ *  If a zero is returned for the name's length, then there is no name
+ *  associated with the ID.
+ *
+ * Programmer:	Leon Arber
+ *              August 27, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Pget_data_transform(hid_t plist_id, char *expression /*out*/, size_t size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5Z_data_xform_t *data_xform_prop = NULL;    /* New data xform property */
+    size_t	len;
+    const char*	pexp;
+    ssize_t 	ret_value;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "ixz", plist_id, expression, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(H5P_get(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data transform expression")
+
+    if(NULL == data_xform_prop)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "data transform has not been set")
+
+    /* Get the data transform string */
+    if(NULL == (pexp = H5Z_xform_extract_xform_str(data_xform_prop)))
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "failed to retrieve transform expression")
+
+    len = HDstrlen(pexp);
+    if(expression) {
+	HDstrncpy(expression, pexp, MIN(len + 1, size));
+        if(len >= size)
+            expression[size - 1] = '\0';
+    } /* end if */
+
+    ret_value = (ssize_t)len;
+
+done:
+    if(ret_value < 0) {
+	if(data_xform_prop && H5Z_xform_destroy(data_xform_prop) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "unable to release data transform expression")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_data_transform() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_buffer
+ *
+ * Purpose:	Given a dataset transfer property list, set the maximum size
+ *		for the type conversion buffer and background buffer and
+ *		optionally supply pointers to application-allocated buffers.
+ *		If the buffer size is smaller than the entire amount of data
+ *		being transfered between application and file, and a type
+ *		conversion buffer or background buffer is required then
+ *		strip mining will be used.
+ *
+ *		If TCONV and/or BKG are null pointers then buffers will be
+ *		allocated and freed during the data transfer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, March 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, void *bkg)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iz*x*x", plist_id, size, tconv, bkg);
+
+    /* Check arguments */
+    if(size == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buffer size must not be zero")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_XFER_MAX_TEMP_BUF_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "Can't set transfer buffer size")
+    if(H5P_set(plist, H5D_XFER_TCONV_BUF_NAME, &tconv) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "Can't set transfer type conversion buffer")
+    if(H5P_set(plist, H5D_XFER_BKGR_BUF_NAME, &bkg) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "Can't set background type conversion buffer")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_buffer() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_buffer
+ *
+ * Purpose:	Reads values previously set with H5Pset_buffer().
+ *
+ * Return:	Success:	Buffer size.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, March 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, void **bkg/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    size_t size;                /* Type conversion buffer size */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE3("z", "ixx", plist_id, tconv, bkg);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, 0, "can't find object for ID")
+
+    /* Return values */
+    if(tconv)
+        if(H5P_get(plist, H5D_XFER_TCONV_BUF_NAME, tconv) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "Can't get transfer type conversion buffer")
+    if(bkg)
+        if(H5P_get(plist, H5D_XFER_BKGR_BUF_NAME, bkg) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "Can't get background type conversion buffer")
+
+    /* Get the size */
+    if(H5P_get(plist, H5D_XFER_MAX_TEMP_BUF_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, 0, "Can't set transfer buffer size")
+
+    /* Set the return value */
+    ret_value = size;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_buffer() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_preserve
+ *
+ * Purpose:	When reading or writing compound data types and the
+ *		destination is partially initialized and the read/write is
+ *		intended to initialize the other members, one must set this
+ *		property to TRUE.  Otherwise the I/O pipeline treats the
+ *		destination datapoints as completely uninitialized.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March 17, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_preserve(hid_t plist_id, hbool_t status)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5T_bkg_t need_bkg;         /* Value for background buffer type */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ib", plist_id, status);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    need_bkg = status ? H5T_BKG_YES : H5T_BKG_NO;
+    if(H5P_set(plist, H5D_XFER_BKGR_BUF_TYPE_NAME, &need_bkg) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_preserve() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_preserve
+ *
+ * Purpose:	The inverse of H5Pset_preserve()
+ *
+ * Return:	Success:	TRUE or FALSE
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, March 17, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_preserve(hid_t plist_id)
+{
+    H5T_bkg_t need_bkg;         /* Background value */
+    H5P_genplist_t *plist;      /* Property list pointer */
+    int ret_value;              /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(H5P_get(plist, H5D_XFER_BKGR_BUF_TYPE_NAME, &need_bkg) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+    /* Set return value */
+    ret_value = need_bkg ? TRUE : FALSE;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_preserve() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_edc_check
+ *
+ * Purpose:     Enable or disable error-detecting for a dataset reading
+ *              process.  This error-detecting algorithm is whichever
+ *              user chooses earlier.  This function cannot control
+ *              writing process.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Jan 3, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_edc_check(hid_t plist_id, H5Z_EDC_t check)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iZe", plist_id, check);
+
+    /* Check argument */
+    if(check != H5Z_ENABLE_EDC && check != H5Z_DISABLE_EDC)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid value")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_XFER_EDC_NAME, &check) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_edc_check() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_edc_check
+ *
+ * Purpose:     Enable or disable error-detecting for a dataset reading
+ *              process.  This error-detecting algorithm is whichever
+ *              user chooses earlier.  This function cannot control
+ *              writing process.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Jan 3, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_EDC_t
+H5Pget_edc_check(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5Z_EDC_t      ret_value;   /* Return value */
+
+    FUNC_ENTER_API(H5Z_ERROR_EDC)
+    H5TRACE1("Ze", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_ERROR_EDC, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_get(plist, H5D_XFER_EDC_NAME, &ret_value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, H5Z_ERROR_EDC, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_edc_check() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_filter_callback
+ *
+ * Purpose:     Sets user's callback function for dataset transfer property
+ *              list.  This callback function defines what user wants to do
+ *              if certain filter fails.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Jan 14, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_filter_callback(hid_t plist_id, H5Z_filter_func_t func, void *op_data)
+{
+    H5P_genplist_t      *plist;      /* Property list pointer */
+    herr_t              ret_value=SUCCEED;   /* return value */
+    H5Z_cb_t            cb_struct;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ix*x", plist_id, func, op_data);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    cb_struct.func = func;
+    cb_struct.op_data = op_data;
+
+    if (H5P_set(plist,H5D_XFER_FILTER_CB_NAME,&cb_struct)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_type_conv_cb
+ *
+ * Purpose:     Sets user's callback function for dataset transfer property
+ *              list.  This callback function defines what user wants to do
+ *              if there's exception during datatype conversion.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              April 15, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_type_conv_cb(hid_t plist_id, H5T_conv_except_func_t op, void *operate_data)
+{
+    H5P_genplist_t      *plist;      /* Property list pointer */
+    herr_t              ret_value=SUCCEED;   /* return value */
+    H5T_conv_cb_t       cb_struct;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ix*x", plist_id, op, operate_data);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    cb_struct.func = op;
+    cb_struct.user_data = operate_data;
+
+    if (H5P_set(plist,H5D_XFER_CONV_CB_NAME,&cb_struct)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_type_conv_cb
+ *
+ * Purpose:     Gets callback function for dataset transfer property
+ *              list.  This callback function defines what user wants to do
+ *              if there's exception during datatype conversion.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              April 15, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_type_conv_cb(hid_t plist_id, H5T_conv_except_func_t *op, void **operate_data)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5T_conv_cb_t       cb_struct;
+    herr_t              ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x**x", plist_id, op, operate_data);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get property */
+    if (H5P_get(plist,H5D_XFER_CONV_CB_NAME,&cb_struct)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+    /* Assign return value */
+    *op = cb_struct.func;
+    *operate_data = cb_struct.user_data;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_btree_ratios
+ *
+ * Purpose:	Queries B-tree split ratios.  See H5Pset_btree_ratios().
+ *
+ * Return:	Success:	Non-negative with split ratios returned through
+ *				the non-null arguments.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, September 28, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_btree_ratios(hid_t plist_id, double *left/*out*/, double *middle/*out*/,
+    double *right/*out*/)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    double btree_split_ratio[3];        /* B-tree node split ratios */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "ixxx", plist_id, left, middle, right);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the split ratios */
+    if(H5P_get(plist, H5D_XFER_BTREE_SPLIT_RATIO_NAME, &btree_split_ratio) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+    /* Get values */
+    if(left)
+        *left = btree_split_ratio[0];
+    if(middle)
+        *middle = btree_split_ratio[1];
+    if(right)
+        *right = btree_split_ratio[2];
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_btree_ratios() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_btree_ratios
+ *
+ * Purpose:	Sets B-tree split ratios for a dataset transfer property
+ *		list. The split ratios determine what percent of children go
+ *		in the first node when a node splits.  The LEFT ratio is
+ *		used when the splitting node is the left-most node at its
+ *		level in the tree; the RIGHT ratio is when the splitting node
+ *		is the right-most node at its level; and the MIDDLE ratio for
+ *		all other cases.  A node which is the only node at its level
+ *		in the tree uses the RIGHT ratio when it splits.  All ratios
+ *		are real numbers between 0 and 1, inclusive.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, September 28, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_btree_ratios(hid_t plist_id, double left, double middle,
+    double right)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    double split_ratio[3];      /* B-tree node split ratios */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iddd", plist_id, left, middle, right);
+
+    /* Check arguments */
+    if(left < (double)0.0f || left > (double)1.0f
+            || middle < (double)0.0f || middle > (double)1.0f
+            || right < (double)0.0f || right > (double)1.0f)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "split ratio must satisfy 0.0<=X<=1.0")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    split_ratio[0] = left;
+    split_ratio[1] = middle;
+    split_ratio[2] = right;
+
+    /* Set the split ratios */
+    if(H5P_set(plist, H5D_XFER_BTREE_SPLIT_RATIO_NAME, &split_ratio) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_btree_ratios() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_set_vlen_mem_manager
+ *
+ * Purpose:	Sets the memory allocate/free pair for VL datatypes.  The
+ *		allocation routine is called when data is read into a new
+ *		array and the free routine is called when H5Dvlen_reclaim is
+ *		called.  The alloc_info and free_info are user parameters
+ *		which are passed to the allocation and freeing functions
+ *		respectively.  To reset the allocate/free functions to the
+ *		default setting of using the system's malloc/free functions,
+ *		call this routine with alloc_func and free_func set to NULL.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 1, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_set_vlen_mem_manager(H5P_genplist_t *plist, H5MM_allocate_t alloc_func,
+    void *alloc_info, H5MM_free_t free_func, void *free_info)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(plist);
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_XFER_VLEN_ALLOC_NAME, &alloc_func) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+    if(H5P_set(plist, H5D_XFER_VLEN_ALLOC_INFO_NAME, &alloc_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+    if(H5P_set(plist, H5D_XFER_VLEN_FREE_NAME, &free_func) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+    if(H5P_set(plist, H5D_XFER_VLEN_FREE_INFO_NAME, &free_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_set_vlen_mem_manager() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_vlen_mem_manager
+ *
+ * Purpose:	Sets the memory allocate/free pair for VL datatypes.  The
+ *		allocation routine is called when data is read into a new
+ *		array and the free routine is called when H5Dvlen_reclaim is
+ *		called.  The alloc_info and free_info are user parameters
+ *		which are passed to the allocation and freeing functions
+ *		respectively.  To reset the allocate/free functions to the
+ *		default setting of using the system's malloc/free functions,
+ *		call this routine with alloc_func and free_func set to NULL.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 1, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t alloc_func,
+    void *alloc_info, H5MM_free_t free_func, void *free_info)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ix*xx*x", plist_id, alloc_func, alloc_info, free_func,
+             free_info);
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+    /* Update property list */
+    if(H5P_set_vlen_mem_manager(plist, alloc_func, alloc_info, free_func, free_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set values")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_vlen_mem_manager() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_vlen_mem_manager
+ *
+ * Purpose:	The inverse of H5Pset_vlen_mem_manager()
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 1, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func/*out*/,
+    void **alloc_info/*out*/, H5MM_free_t *free_func/*out*/, void **free_info/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ixxxx", plist_id, alloc_func, alloc_info, free_func, free_info);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(alloc_func)
+        if(H5P_get(plist, H5D_XFER_VLEN_ALLOC_NAME, alloc_func) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+    if(alloc_info)
+        if(H5P_get(plist, H5D_XFER_VLEN_ALLOC_INFO_NAME, alloc_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+    if(free_func)
+        if(H5P_get(plist, H5D_XFER_VLEN_FREE_NAME, free_func) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+    if(free_info)
+        if(H5P_get(plist, H5D_XFER_VLEN_FREE_INFO_NAME, free_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_vlen_mem_manager() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_hyper_vector_size
+ *
+ * Purpose:	Given a dataset transfer property list, set the number of
+ *              "I/O vectors" (offset and length pairs) which are to be
+ *              accumulated in memory before being issued to the lower levels
+ *              of the library for reading or writing the actual data.
+ *              Increasing the number should give better performance, but use
+ *              more memory during hyperslab I/O.  The vector size must be
+ *              greater than 1.
+ *
+ *		The default is to use 1024 vectors for I/O during hyperslab
+ *              reading/writing.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 9, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_hyper_vector_size(hid_t plist_id, size_t vector_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", plist_id, vector_size);
+
+    /* Check arguments */
+    if(vector_size < 1)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "vector size too small")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_XFER_HYPER_VECTOR_SIZE_NAME, &vector_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_hyper_vector_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_hyper_vector_size
+ *
+ * Purpose:	Reads values previously set with H5Pset_hyper_vector_size().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, July 9, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_hyper_vector_size(hid_t plist_id, size_t *vector_size/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, vector_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Return values */
+    if(vector_size)
+        if(H5P_get(plist, H5D_XFER_HYPER_VECTOR_SIZE_NAME, vector_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_hyper_vector_size() */
+
+#ifdef H5_HAVE_PARALLEL
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mpio_actual_chunk_opt_mode
+ *
+ * Purpose:	Retrieves the chunked io optimization scheme that library chose
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Jacob Gruber
+ *              Wednesday, May 4, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mpio_actual_chunk_opt_mode(hid_t plist_id, H5D_mpio_actual_chunk_opt_mode_t *actual_chunk_opt_mode)
+{
+    H5P_genplist_t     *plist;
+    herr_t ret_value = SUCCEED;   /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Do", plist_id, actual_chunk_opt_mode);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Return values */
+    if(actual_chunk_opt_mode)
+        if(H5P_get(plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, actual_chunk_opt_mode) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_mpio_actual_chunk_opt_mode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mpio_actual_io_mode
+ *
+ * Purpose:	Retrieves the type of I/O actually preformed when collective I/O
+ *		is requested.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Jacob Gruber
+ *              Wednesday, May 4, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mpio_actual_io_mode(hid_t plist_id, H5D_mpio_actual_io_mode_t *actual_io_mode)
+{
+    H5P_genplist_t     *plist;
+    herr_t ret_value = SUCCEED;   /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Di", plist_id, actual_io_mode);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Return values */
+    if(actual_io_mode)
+        if(H5P_get(plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, actual_io_mode) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_mpio_actual_io_mode() */
+
+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mpio_no_collective_cause
+ *
+ * Purpose:	Retrieves cause for the broke collective I/O
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Jonathan Kim
+ *              Aug 3, 2012
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mpio_no_collective_cause(hid_t plist_id, uint32_t *local_no_collective_cause, uint32_t *global_no_collective_cause)
+{
+    H5P_genplist_t     *plist;
+    herr_t ret_value = SUCCEED;   /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*Iu*Iu", plist_id, local_no_collective_cause,
+             global_no_collective_cause);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Return values */
+    if(local_no_collective_cause)
+        if(H5P_get(plist, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, local_no_collective_cause) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get local value")
+    if(global_no_collective_cause)
+        if(H5P_get(plist, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, global_no_collective_cause) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get global value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_mpio_no_collective_cause() */
+
+
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pfapl.c b/gatb-core/thirdparty/hdf5/src/H5Pfapl.c
new file mode 100644
index 0000000..3c9dcc4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pfapl.c
@@ -0,0 +1,2446 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pfapl.c
+ *			February 26 1998
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		File access property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files		  	        */
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory Management                    */
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+/* Includes needed to set as default file driver */
+#include "H5FDsec2.h"		/* Posix unbuffered I/O	file driver	*/
+#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
+#ifdef H5_HAVE_WINDOWS
+#include "H5FDwindows.h"        /* Windows buffered I/O                 */
+#endif
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========= File Access properties ============ */
+/* Definitions for the initial metadata cache resize configuration */
+#define H5F_ACS_META_CACHE_INIT_CONFIG_SIZE	sizeof(H5AC_cache_config_t)
+#define H5F_ACS_META_CACHE_INIT_CONFIG_DEF	H5AC__DEFAULT_CACHE_CONFIG
+/* Definitions for size of raw data chunk cache(slots) */
+#define H5F_ACS_DATA_CACHE_NUM_SLOTS_SIZE       sizeof(size_t)
+#define H5F_ACS_DATA_CACHE_NUM_SLOTS_DEF        521
+/* Definition for size of raw data chunk cache(bytes) */
+#define H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE       sizeof(size_t)
+#define H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF        (1024*1024)
+/* Definition for preemption read chunks first */
+#define H5F_ACS_PREEMPT_READ_CHUNKS_SIZE        sizeof(double)
+#define H5F_ACS_PREEMPT_READ_CHUNKS_DEF         0.75f
+/* Definition for threshold for alignment */
+#define H5F_ACS_ALIGN_THRHD_SIZE                sizeof(hsize_t)
+#define H5F_ACS_ALIGN_THRHD_DEF                 1
+/* Definition for alignment */
+#define H5F_ACS_ALIGN_SIZE                      sizeof(hsize_t)
+#define H5F_ACS_ALIGN_DEF                       1
+/* Definition for minimum metadata allocation block size (when
+   aggregating metadata allocations. */
+#define H5F_ACS_META_BLOCK_SIZE_SIZE            sizeof(hsize_t)
+#define H5F_ACS_META_BLOCK_SIZE_DEF             2048
+/* Definition for maximum sieve buffer size (when data sieving
+   is allowed by file driver */
+#define H5F_ACS_SIEVE_BUF_SIZE_SIZE             sizeof(size_t)
+#define H5F_ACS_SIEVE_BUF_SIZE_DEF              (64*1024)
+/* Definition for minimum "small data" allocation block size (when
+   aggregating "small" raw data allocations. */
+#define H5F_ACS_SDATA_BLOCK_SIZE_SIZE           sizeof(hsize_t)
+#define H5F_ACS_SDATA_BLOCK_SIZE_DEF            2048
+/* Definition for garbage-collect references */
+#define H5F_ACS_GARBG_COLCT_REF_SIZE            sizeof(unsigned)
+#define H5F_ACS_GARBG_COLCT_REF_DEF             0
+/* Definition for file driver ID */
+#define H5F_ACS_FILE_DRV_ID_SIZE                sizeof(hid_t)
+#define H5F_ACS_FILE_DRV_ID_DEF                 H5_DEFAULT_VFD
+/* Definition for file driver info */
+#define H5F_ACS_FILE_DRV_INFO_SIZE              sizeof(void*)
+#define H5F_ACS_FILE_DRV_INFO_DEF               NULL
+/* Definition for file close degree */
+#define H5F_CLOSE_DEGREE_SIZE		        sizeof(H5F_close_degree_t)
+#define H5F_CLOSE_DEGREE_DEF		        H5F_CLOSE_DEFAULT
+/* Definition for offset position in file for family file driver */
+#define H5F_ACS_FAMILY_OFFSET_SIZE              sizeof(hsize_t)
+#define H5F_ACS_FAMILY_OFFSET_DEF               0
+/* Definition for new member size of family driver. It's private
+ * property only used by h5repart */
+#define H5F_ACS_FAMILY_NEWSIZE_SIZE             sizeof(hsize_t)
+#define H5F_ACS_FAMILY_NEWSIZE_DEF              0
+/* Definition for whether to convert family to sec2 driver. It's private
+ * property only used by h5repart */
+#define H5F_ACS_FAMILY_TO_SEC2_SIZE             sizeof(hbool_t)
+#define H5F_ACS_FAMILY_TO_SEC2_DEF              FALSE
+/* Definition for data type in multi file driver */
+#define H5F_ACS_MULTI_TYPE_SIZE                 sizeof(H5FD_mem_t)
+#define H5F_ACS_MULTI_TYPE_DEF                  H5FD_MEM_DEFAULT
+/* Definition for 'use latest format version' flag */
+#define H5F_ACS_LATEST_FORMAT_SIZE              sizeof(hbool_t)
+#define H5F_ACS_LATEST_FORMAT_DEF               FALSE
+/* Definition for whether to query the file descriptor from the core VFD
+ * instead of the memory address.  (Private to library)
+ */
+#define H5F_ACS_WANT_POSIX_FD_SIZE              sizeof(hbool_t)
+#define H5F_ACS_WANT_POSIX_FD_DEF               FALSE
+/* Definition for external file cache size */
+#define H5F_ACS_EFC_SIZE_SIZE                   sizeof(unsigned)
+#define H5F_ACS_EFC_SIZE_DEF                    0
+/* Definition of pointer to initial file image info */
+#define H5F_ACS_FILE_IMAGE_INFO_SIZE            sizeof(H5FD_file_image_info_t)
+#define H5F_ACS_FILE_IMAGE_INFO_DEF             H5FD_DEFAULT_FILE_IMAGE_INFO
+#define H5F_ACS_FILE_IMAGE_INFO_DEL             H5P_file_image_info_del
+#define H5F_ACS_FILE_IMAGE_INFO_COPY            H5P_file_image_info_copy
+#define H5F_ACS_FILE_IMAGE_INFO_CLOSE           H5P_file_image_info_close
+/* Definition of core VFD write tracking flag */
+#define H5F_ACS_CORE_WRITE_TRACKING_FLAG_SIZE   sizeof(hbool_t)
+#define H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEF    FALSE
+/* Definition of core VFD write tracking page size */
+#define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_SIZE      sizeof(size_t)
+#define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEF       524288
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P_facc_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P_facc_create(hid_t fapl_id, void *copy_data);
+static herr_t H5P_facc_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
+
+/* File image info property callbacks */
+static herr_t H5P_file_image_info_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P_file_image_info_copy(const char *name, size_t size, void *value);
+static herr_t H5P_file_image_info_close(const char *name, size_t size, void *value);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* File access property list class library initialization object */
+const H5P_libclass_t H5P_CLS_FACC[1] = {{
+    "file access",		/* Class name for debugging     */
+    H5P_TYPE_FILE_ACCESS,       /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_FILE_ACCESS_g,	/* Pointer to class             */
+    &H5P_CLS_FILE_ACCESS_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_FILE_ACCESS_ID_g,	/* Pointer to default property list ID */
+    H5P_facc_reg_prop,		/* Default property registration routine */
+
+    H5P_facc_create,		/* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    H5P_facc_copy,		/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    H5P_facc_close,		/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_facc_reg_prop
+ *
+ * Purpose:     Register the file access property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_reg_prop(H5P_genclass_t *pclass)
+{
+    H5AC_cache_config_t mdc_initCacheCfg = H5F_ACS_META_CACHE_INIT_CONFIG_DEF;  /* Default metadata cache settings */
+    size_t rdcc_nslots = H5F_ACS_DATA_CACHE_NUM_SLOTS_DEF;      /* Default raw data chunk cache # of slots */
+    size_t rdcc_nbytes = H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF;      /* Default raw data chunk cache # of bytes */
+    double rdcc_w0 = H5F_ACS_PREEMPT_READ_CHUNKS_DEF;           /* Default raw data chunk cache dirty ratio */
+    hsize_t threshold = H5F_ACS_ALIGN_THRHD_DEF;                /* Default allocation alignment threshold */
+    hsize_t alignment = H5F_ACS_ALIGN_DEF;                      /* Default allocation alignment value */
+    hsize_t meta_block_size = H5F_ACS_META_BLOCK_SIZE_DEF;      /* Default metadata allocation block size */
+    size_t sieve_buf_size = H5F_ACS_SIEVE_BUF_SIZE_DEF;         /* Default raw data I/O sieve buffer size */
+    hsize_t sdata_block_size = H5F_ACS_SDATA_BLOCK_SIZE_DEF;    /* Default small data allocation block size */
+    unsigned gc_ref = H5F_ACS_GARBG_COLCT_REF_DEF;              /* Default garbage collection for references setting */
+    hid_t driver_id = H5F_ACS_FILE_DRV_ID_DEF;                  /* Default VFL driver ID */
+    void *driver_info = H5F_ACS_FILE_DRV_INFO_DEF;              /* Default VFL driver info */
+    H5F_close_degree_t close_degree = H5F_CLOSE_DEGREE_DEF;     /* Default file close degree */
+    hsize_t family_offset = H5F_ACS_FAMILY_OFFSET_DEF;          /* Default offset for family VFD */
+    hsize_t family_newsize = H5F_ACS_FAMILY_NEWSIZE_DEF;        /* Default size of new files for family VFD */
+    hbool_t family_to_sec2 = H5F_ACS_FAMILY_TO_SEC2_DEF;        /* Default ?? for family VFD */
+    H5FD_mem_t mem_type = H5F_ACS_MULTI_TYPE_DEF;               /* Default file space type for multi VFD */
+    hbool_t latest_format = H5F_ACS_LATEST_FORMAT_DEF;          /* Default setting for "use the latest version of the format" flag */
+    hbool_t want_posix_fd = H5F_ACS_WANT_POSIX_FD_DEF;          /* Default setting for retrieving 'handle' from core VFD */
+    unsigned efc_size = H5F_ACS_EFC_SIZE_DEF;                   /* Default external file cache size */
+    H5FD_file_image_info_t file_image_info = H5F_ACS_FILE_IMAGE_INFO_DEF;  /* Default file image info and callbacks */
+    hbool_t core_write_tracking_flag = H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEF;              /* Default setting for core VFD write tracking */
+    size_t core_write_tracking_page_size = H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEF;     /* Default core VFD write tracking page size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Register the initial metadata cache resize configuration */
+    if(H5P_register_real(pclass, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, H5F_ACS_META_CACHE_INIT_CONFIG_SIZE, &mdc_initCacheCfg, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the size of raw data chunk cache (elements) */
+    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5F_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &rdcc_nslots, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the size of raw data chunk cache(bytes) */
+    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the preemption for reading chunks */
+    if(H5P_register_real(pclass, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, H5F_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the threshold for alignment */
+    if(H5P_register_real(pclass, H5F_ACS_ALIGN_THRHD_NAME, H5F_ACS_ALIGN_THRHD_SIZE, &threshold, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the alignment */
+    if(H5P_register_real(pclass, H5F_ACS_ALIGN_NAME, H5F_ACS_ALIGN_SIZE, &alignment, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the minimum metadata allocation block size */
+    if(H5P_register_real(pclass, H5F_ACS_META_BLOCK_SIZE_NAME, H5F_ACS_META_BLOCK_SIZE_SIZE, &meta_block_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the maximum sieve buffer size */
+    if(H5P_register_real(pclass, H5F_ACS_SIEVE_BUF_SIZE_NAME, H5F_ACS_SIEVE_BUF_SIZE_SIZE, &sieve_buf_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the minimum "small data" allocation block size */
+    if(H5P_register_real(pclass, H5F_ACS_SDATA_BLOCK_SIZE_NAME, H5F_ACS_SDATA_BLOCK_SIZE_SIZE, &sdata_block_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the garbage collection reference */
+    if(H5P_register_real(pclass, H5F_ACS_GARBG_COLCT_REF_NAME, H5F_ACS_GARBG_COLCT_REF_SIZE, &gc_ref, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the file driver ID */
+    if(H5P_register_real(pclass, H5F_ACS_FILE_DRV_ID_NAME, H5F_ACS_FILE_DRV_ID_SIZE, &driver_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the file driver info */
+    if(H5P_register_real(pclass, H5F_ACS_FILE_DRV_INFO_NAME, H5F_ACS_FILE_DRV_INFO_SIZE, &driver_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the file close degree */
+    if(H5P_register_real(pclass, H5F_ACS_CLOSE_DEGREE_NAME, H5F_CLOSE_DEGREE_SIZE, &close_degree, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the offset of family driver info */
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_OFFSET_NAME, H5F_ACS_FAMILY_OFFSET_SIZE, &family_offset, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the private property of new family file size. It's used by h5repart only. */
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_NEWSIZE_NAME, H5F_ACS_FAMILY_NEWSIZE_SIZE, &family_newsize, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the private property of whether convert family to sec2 driver. It's used by h5repart only. */
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_TO_SEC2_NAME, H5F_ACS_FAMILY_TO_SEC2_SIZE, &family_to_sec2, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the data type of multi driver info */
+    if(H5P_register_real(pclass, H5F_ACS_MULTI_TYPE_NAME, H5F_ACS_MULTI_TYPE_SIZE, &mem_type, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the 'use the latest version of the format' flag */
+    if(H5P_register_real(pclass, H5F_ACS_LATEST_FORMAT_NAME, H5F_ACS_LATEST_FORMAT_SIZE, &latest_format, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the private property of whether to retrieve the file descriptor from the core VFD */
+    /* (used internally to the library only) */
+    if(H5P_register_real(pclass, H5F_ACS_WANT_POSIX_FD_NAME, H5F_ACS_WANT_POSIX_FD_SIZE, &want_posix_fd, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the external file cache size */
+    if(H5P_register_real(pclass, H5F_ACS_EFC_SIZE_NAME, H5F_ACS_EFC_SIZE_SIZE, &efc_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the initial file image info */
+    if(H5P_register_real(pclass, H5F_ACS_FILE_IMAGE_INFO_NAME, H5F_ACS_FILE_IMAGE_INFO_SIZE, &file_image_info, NULL, NULL, NULL, H5F_ACS_FILE_IMAGE_INFO_DEL, H5F_ACS_FILE_IMAGE_INFO_COPY, NULL, H5F_ACS_FILE_IMAGE_INFO_CLOSE) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the core VFD backing store write tracking flag */
+    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, H5F_ACS_CORE_WRITE_TRACKING_FLAG_SIZE, &core_write_tracking_flag, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the size of the core VFD backing store page size */
+    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_SIZE, &core_write_tracking_page_size, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_reg_prop() */
+
+

+/*----------------------------------------------------------------------------
+ * Function:	H5P_facc_create
+ *
+ * Purpose:	Callback routine which is called whenever a file access
+ *		property list is closed.  This routine performs any generic
+ * 		initialization needed on the properties the library put into
+ * 		the list.
+ *
+ * Return:	Success:		Non-negative
+ * 		Failure:		Negative
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *
+ *----------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_facc_create(hid_t fapl_id, void H5_ATTR_UNUSED *copy_data)
+{
+    hid_t          driver_id;
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check argument */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Retrieve driver ID property */
+    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
+
+    if(driver_id > 0) {
+        void *driver_info;
+
+        /* Retrieve driver info property */
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver info")
+
+        /* Set the driver for the property list */
+        if(H5FD_fapl_open(plist, driver_id, driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_create() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P_facc_copy
+ *
+ * Purpose:	Callback routine which is called whenever a file access
+ * 		property list is copied.  This routine performs any generic
+ * 	 	copy needed on the properties.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *
+ *--------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_facc_copy(hid_t dst_fapl_id, hid_t src_fapl_id, void H5_ATTR_UNUSED *copy_data)
+{
+    hid_t          driver_id;
+    H5P_genplist_t *src_plist;              /* Source property list */
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get driver ID from source property list */
+    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(H5P_get(src_plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
+
+    if(driver_id > 0) {
+        H5P_genplist_t *dst_plist;              /* Destination property list */
+        void *driver_info;
+
+        /* Get driver info from source property list */
+        if(H5P_get(src_plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver info")
+
+        /* Set the driver for the destination property list */
+        if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_fapl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(H5FD_fapl_open(dst_plist, driver_id, driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_copy() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P_facc_close
+ *
+ * Purpose:	Callback routine which is called whenever a file access
+ *		property list is closed.  This routine performs any generic
+ *		cleanup needed on the properties.
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *
+ *---------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+herr_t
+H5P_facc_close(hid_t fapl_id, void H5_ATTR_UNUSED *close_data)
+{
+    hid_t      driver_id;
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t     ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check argument */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get driver ID property */
+    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+        HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
+
+    if(driver_id > 0) {
+        void *driver_info;
+
+        /* Get driver info property */
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
+            HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
+
+        /* Close the driver for the property list */
+        if(H5FD_fapl_close(driver_id, driver_info) < 0)
+            HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_alignment
+ *
+ * Purpose:	Sets the alignment properties of a file access property list
+ *		so that any file object >= THRESHOLD bytes will be aligned on
+ *		an address which is a multiple of ALIGNMENT.  The addresses
+ *		are relative to the end of the user block; the alignment is
+ *		calculated by subtracting the user block size from the
+ *		absolute file address and then adjusting the address to be a
+ *		multiple of ALIGNMENT.
+ *
+ *		Default values for THRESHOLD and ALIGNMENT are one, implying
+ *		no alignment.  Generally the default values will result in
+ *		the best performance for single-process access to the file.
+ *		For MPI-IO and other parallel systems, choose an alignment
+ *		which is a multiple of the disk block size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, June  9, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *		Changed file access property list mechanism to the new
+ *		generic property list.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_alignment(hid_t fapl_id, hsize_t threshold, hsize_t alignment)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ihh", fapl_id, threshold, alignment);
+
+    /* Check args */
+    if(alignment < 1)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "alignment must be positive")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_ALIGN_THRHD_NAME, &threshold) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set threshold")
+    if(H5P_set(plist, H5F_ACS_ALIGN_NAME, &alignment) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set alignment")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_alignment
+ *
+ * Purpose:	Returns the current settings for alignment properties from a
+ *		file access property list.  The THRESHOLD and/or ALIGNMENT
+ *		pointers may be null pointers.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, June  9, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_alignment(hid_t fapl_id, hsize_t *threshold/*out*/,
+    hsize_t *alignment/*out*/)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", fapl_id, threshold, alignment);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(threshold)
+        if(H5P_get(plist, H5F_ACS_ALIGN_THRHD_NAME, threshold) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get threshold")
+    if(alignment)
+        if(H5P_get(plist, H5F_ACS_ALIGN_NAME, alignment) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get alignment")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_alignment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_set_driver
+ *
+ * Purpose:	Set the file driver (DRIVER_ID) for a file access 
+ *		property list (PLIST_ID) and supply an optional
+ *		struct containing the driver-specific properites
+ *		(DRIVER_INFO).  The driver properties will be copied into the
+ *		property list and the reference count on the driver will be
+ *		incremented, allowing the caller to close the driver ID but
+ *		still use the property list.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  3, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id, const void *new_driver_info)
+{
+    hid_t driver_id;            /* VFL driver ID */
+    void *driver_info;          /* VFL driver info */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(NULL == H5I_object_verify(new_driver_id, H5I_VFL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID")
+
+    if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
+        /* Get the current driver information */
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL,"can't get driver info")
+
+        /* Close the driver for the property list */
+        if(H5FD_fapl_close(driver_id, driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't reset driver")
+
+        /* Set the driver for the property list */
+        if(H5FD_fapl_open(plist, new_driver_id, new_driver_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_set_driver() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_driver
+ *
+ * Purpose:	Set the file driver (DRIVER_ID) for a file access 
+ *		property list (PLIST_ID) and supply an optional
+ *		struct containing the driver-specific properites
+ *		(DRIVER_INFO).  The driver properties will be copied into the
+ *		property list and the reference count on the driver will be
+ *		incremented, allowing the caller to close the driver ID but
+ *		still use the property list.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  3, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_driver(hid_t plist_id, hid_t new_driver_id, const void *new_driver_info)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ii*x", plist_id, new_driver_id, new_driver_info);
+
+    /* Check arguments */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if(NULL == H5I_object_verify(new_driver_id, H5I_VFL))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID")
+
+    /* Set the driver */
+    if(H5P_set_driver(plist, new_driver_id, new_driver_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_driver() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_driver
+ *
+ * Purpose:	Return the ID of the low-level file driver.  PLIST_ID should
+ *		be a file access property list.
+ *
+ * Return:	Success:	A low-level driver ID which is the same ID
+ *				used when the driver was set for the property
+ *				list. The driver ID is only valid as long as
+ *				the file driver remains registered.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, February 26, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5P_get_driver(H5P_genplist_t *plist)
+{
+    hid_t ret_value = FAIL;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the current driver ID */
+    if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &ret_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+
+    if(H5FD_VFD_DEFAULT == ret_value)
+        ret_value = H5_DEFAULT_VFD;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_get_driver() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_driver
+ *
+ * Purpose:	Return the ID of the low-level file driver.  PLIST_ID should
+ *		be a file access property list.
+ *
+ * Return:	Success:	A low-level driver ID which is the same ID
+ *				used when the driver was set for the property
+ *				list. The driver ID is only valid as long as
+ *				the file driver remains registered.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, February 26, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Pget_driver(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    hid_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", plist_id);
+
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get the driver */
+    if((ret_value = H5P_get_driver(plist)) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_driver() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_driver_info
+ *
+ * Purpose:	Returns a pointer directly to the file driver-specific
+ *		information of a file access.
+ *
+ * Return:	Success:	Ptr to *uncopied* driver specific data
+ *				structure if any.
+ *
+ *		Failure:	NULL. Null is also returned if the driver has
+ *				not registered any driver-specific properties
+ *				although no error is pushed on the stack in
+ *				this case.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5P_get_driver_info(H5P_genplist_t *plist)
+{
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Get the current driver info */
+    if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
+        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &ret_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver info")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_get_driver_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_driver_info
+ *
+ * Purpose:	Returns a pointer directly to the file driver-specific
+ *		information of a file access.
+ *
+ * Return:	Success:	Ptr to *uncopied* driver specific data
+ *				structure if any.
+ *
+ *		Failure:	NULL. Null is also returned if the driver has
+ *				not registered any driver-specific properties
+ *				although no error is pushed on the stack in
+ *				this case.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5Pget_driver_info(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE1("*x", "i", plist_id);
+
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
+
+    /* Get the driver info */
+    if(NULL == (ret_value = H5P_get_driver_info(plist)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_driver_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_family_offset
+ *
+ * Purpose:     Set offset for family driver.  This file access property
+ *              list will be passed to H5Fget_vfd_handle or H5FDget_vfd_handle
+ *              to retrieve VFD file handle.
+ *
+ * Return:      Success:        Non-negative value.
+ *              Failure:        Negative value.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep 17, 2002
+ *
+ *-------------------------------------------------------------------------
+*/
+herr_t
+H5Pset_family_offset(hid_t fapl_id, hsize_t offset)
+{
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", fapl_id, offset);
+
+    /* Get the plist structure */
+    if(H5P_DEFAULT == fapl_id)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't modify default property list")
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    if(H5P_set(plist, H5F_ACS_FAMILY_OFFSET_NAME, &offset) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set offset for family file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_family_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_family_offset
+ *
+ * Purpose:     Get offset for family driver.  This file access property
+ *              list will be passed to H5Fget_vfd_handle or H5FDget_vfd_handle
+ *              to retrieve VFD file handle.
+ *
+ * Return:      Success:        Non-negative value.
+ *              Failure:        Negative value.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep 17, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_family_offset(hid_t fapl_id, hsize_t *offset)
+{
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", fapl_id, offset);
+
+    /* Get the plist structure */
+    if(H5P_DEFAULT == fapl_id)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't modify default property list")
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(offset) {
+        if(H5P_get(plist, H5F_ACS_FAMILY_OFFSET_NAME, offset) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set offset for family file")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_family_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_multi_type
+ *
+ * Purpose:     Set data type for multi driver.  This file access property
+ *              list will be passed to H5Fget_vfd_handle or H5FDget_vfd_handle
+ *              to retrieve VFD file handle.
+ *
+ * Return:      Success:        Non-negative value.
+ *              Failure:        Negative value.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep 17, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_multi_type(hid_t fapl_id, H5FD_mem_t type)
+{
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    herr_t              ret_value = SUCCEED;      /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iMt", fapl_id, type);
+
+    /* Get the plist structure */
+    if(H5P_DEFAULT == fapl_id)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't modify default property list")
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+     if(H5P_set(plist, H5F_ACS_MULTI_TYPE_NAME, &type) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set type for multi driver")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_multi_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_multi_type
+ *
+ * Purpose:     Get data type for multi driver.  This file access property
+ *              list will be passed to H5Fget_vfd_handle or H5FDget_vfd_handle
+ *              to retrieve VFD file handle.
+ *
+ * Return:      Success:        Non-negative value.
+ *              Failure:        Negative value.
+ *
+ * Programmer:  Raymond Lu
+ *              Sep 17, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_multi_type(hid_t fapl_id, H5FD_mem_t *type)
+{
+    H5P_genplist_t      *plist;                 /* Property list pointer */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Mt", fapl_id, type);
+
+    /* Get the plist structure */
+    if(H5P_DEFAULT == fapl_id)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't modify default property list")
+    if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(type) {
+        if(H5P_get(plist, H5F_ACS_MULTI_TYPE_NAME, type) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't get type for multi driver")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_multi_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_cache
+ *
+ * Purpose:	Set the number of objects in the meta data cache and the
+ *		maximum number of chunks and bytes in the raw data chunk
+ *		cache.
+ *
+ * 		The RDCC_W0 value should be between 0 and 1 inclusive and
+ *		indicates how much chunks that have been fully read or fully
+ *		written are favored for preemption.  A value of zero means
+ *		fully read or written chunks are treated no differently than
+ *		other chunks (the preemption is strictly LRU) while a value
+ *		of one means fully read chunks are always preempted before
+ *		other chunks.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, May 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_cache(hid_t plist_id, int H5_ATTR_UNUSED mdc_nelmts,
+	     size_t rdcc_nslots, size_t rdcc_nbytes, double rdcc_w0)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iIszzd", plist_id, mdc_nelmts, rdcc_nslots, rdcc_nbytes,
+             rdcc_w0);
+
+    /* Check arguments */
+    if(rdcc_w0 < (double)0.0f || rdcc_w0 > (double)1.0f)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "raw data cache w0 value must be between 0.0 and 1.0 inclusive")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set sizes */
+    if(H5P_set(plist, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, &rdcc_nslots) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set data cache number of slots")
+    if(H5P_set(plist, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, &rdcc_nbytes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set data cache byte size")
+    if(H5P_set(plist, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, &rdcc_w0) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set preempt read chunks")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_cache
+ *
+ * Purpose:	Retrieves the maximum possible number of elements in the meta
+ *		data cache and the maximum possible number of elements and
+ *		bytes and the RDCC_W0 value in the raw data chunk cache.  Any
+ *		(or all) arguments may be null pointers in which case the
+ *		corresponding datum is not returned.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, May 19, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_cache(hid_t plist_id, int *mdc_nelmts,
+	     size_t *rdcc_nslots, size_t *rdcc_nbytes, double *rdcc_w0)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*Is*z*z*d", plist_id, mdc_nelmts, rdcc_nslots, rdcc_nbytes,
+             rdcc_w0);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get sizes */
+
+    /* the mdc_nelmts FAPL entry no longer exists, so just return a constant */
+    if(mdc_nelmts)
+        *mdc_nelmts = 0;
+
+    if(rdcc_nslots)
+        if(H5P_get(plist, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, rdcc_nslots) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache number of slots")
+    if(rdcc_nbytes)
+        if(H5P_get(plist, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, rdcc_nbytes) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache byte size")
+    if(rdcc_w0)
+        if(H5P_get(plist, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, rdcc_w0) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get preempt read chunks")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_mdc_config
+ *
+ * Purpose:	Set the initial metadata cache resize configuration in the
+ *		target FAPL.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	J. Mainzer
+ *              Thursday, April 7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_mdc_config(hid_t plist_id, H5AC_cache_config_t *config_ptr)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", plist_id, config_ptr);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* validate the new configuration */
+    if(H5AC_validate_config(config_ptr) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid metadata cache configuration")
+
+    /* set the modified config */
+
+    /* If we ever support multiple versions of H5AC_cache_config_t, we
+     * will have to test the version and do translation here.
+     */
+
+    if(H5P_set(plist, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, config_ptr) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set metadata cache initial config")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_mdc_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mdc_config
+ *
+ * Purpose:	Retrieve the metadata cache initial resize configuration
+ *		from the target FAPL.
+ *
+ *		Observe that the function will fail if config_ptr is
+ *		NULL, or if config_ptr->version specifies an unknown
+ *		version of H5AC_cache_config_t.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	J. Mainzer
+ *              Thursday, April 7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mdc_config(hid_t plist_id, H5AC_cache_config_t *config_ptr)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", plist_id, config_ptr);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* validate the config_ptr */
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
+
+    if(config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.")
+
+    /* If we ever support multiple versions of H5AC_cache_config_t, we
+     * will have to get the cannonical version here, and then translate
+     * to the version of the structure supplied.
+     */
+
+    /* Get the current initial metadata cache resize configuration */
+    if(H5P_get(plist, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, config_ptr) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get metadata cache initial resize config")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_mdc_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_gc_references
+ *
+ * Purpose:	Sets the flag for garbage collecting references for the file.
+ *		Dataset region references (and other reference types
+ *		probably) use space in the file heap.  If garbage collection
+ *		is on and the user passes in an uninitialized value in a
+ *		reference structure, the heap might get corrupted.  When
+ *		garbage collection is off however and the user re-uses a
+ *		reference, the previous heap block will be orphaned and not
+ *		returned to the free heap space.  When garbage collection is
+ *		on, the user must initialize the reference structures to 0 or
+ *		risk heap corruption.
+ *
+ *		Default value for garbage collecting references is off, just
+ *		to be on the safe side.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		June, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_gc_references(hid_t plist_id, unsigned gc_ref)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, gc_ref);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_GARBG_COLCT_REF_NAME, &gc_ref) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set garbage collect reference")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_gc_references
+ *
+ * Purpose:	Returns the current setting for the garbage collection
+ *		references property from a file access property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              June, 1999
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_gc_references(hid_t plist_id, unsigned *gc_ref/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, gc_ref);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(gc_ref)
+        if(H5P_get(plist, H5F_ACS_GARBG_COLCT_REF_NAME, gc_ref) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get garbage collect reference")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fclose_degree
+ *
+ * Purpose:     Sets the degree for the file close behavior.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              November, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fclose_degree(hid_t plist_id, H5F_close_degree_t degree)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iFd", plist_id, degree);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_CLOSE_DEGREE_NAME, &degree) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fclose_degree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_fclose_degree
+ *
+ * Purpose:     Returns the degree for the file close behavior.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Raymond Lu
+ *              November, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_fclose_degree(hid_t plist_id, H5F_close_degree_t *degree)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Fd", plist_id, degree);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(degree && H5P_get(plist, H5F_ACS_CLOSE_DEGREE_NAME, degree) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file close degree")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_fclose_degree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_meta_block_size
+ *
+ * Purpose:	Sets the minimum size of metadata block allocations when
+ *      the H5FD_FEAT_AGGREGATE_METADATA is set by a VFL driver.
+ *      Each "raw" metadata block is allocated to be this size and then
+ *      specific pieces of metadata (object headers, local heaps, B-trees, etc)
+ *      are sub-allocated from this block.
+ *
+ *		The default value is set to 2048 (bytes), indicating that metadata
+ *      will be attempted to be bunched together in (at least) 2K blocks in
+ *      the file.  Setting the value to 0 with this API function will
+ *      turn off the metadata aggregation, even if the VFL driver attempts to
+ *      use that strategy.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 25, 2000
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ *		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_meta_block_size(hid_t plist_id, hsize_t size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_META_BLOCK_SIZE_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set meta data block size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_meta_block_size
+ *
+ * Purpose:	Returns the current settings for the metadata block allocation
+ *      property from a file access property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 29, 2000
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_meta_block_size(hid_t plist_id, hsize_t *size/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(size) {
+        if(H5P_get(plist, H5F_ACS_META_BLOCK_SIZE_NAME, size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get meta data block size")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_sieve_buf_size
+ *
+ * Purpose:	Sets the maximum size of the data seive buffer used for file
+ *      drivers which are capable of using data sieving.  The data sieve
+ *      buffer is used when performing I/O on datasets in the file.  Using a
+ *      buffer which is large anough to hold several pieces of the dataset
+ *      being read in for hyperslab selections boosts performance by quite a
+ *      bit.
+ *
+ *		The default value is set to 64KB, indicating that file I/O for raw data
+ *      reads and writes will occur in at least 64KB blocks.
+ *      Setting the value to 0 with this API function will turn off the
+ *      data sieving, even if the VFL driver attempts to use that strategy.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 21, 2000
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_sieve_buf_size(hid_t plist_id, size_t size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_SIEVE_BUF_SIZE_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set sieve buffer size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_sieve_buf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_sieve_buf_size
+ *
+ * Purpose:	Returns the current settings for the data sieve buffer size
+ *      property from a file access property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 21, 2000
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ * 		Tuesday, Oct 23, 2001
+ *		Changed the file access list to the new generic property
+ *		list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_sieve_buf_size(hid_t plist_id, size_t *size/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(size)
+        if(H5P_get(plist, H5F_ACS_SIEVE_BUF_SIZE_NAME, size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get sieve buffer size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_sieve_buf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_small_data_block_size
+ *
+ * Purpose:	Sets the minimum size of "small" raw data block allocations
+ *      when the H5FD_FEAT_AGGREGATE_SMALLDATA is set by a VFL driver.
+ *      Each "small" raw data block is allocated to be this size and then
+ *      pieces of raw data which are small enough to fit are sub-allocated from
+ *      this block.
+ *
+ *	The default value is set to 2048 (bytes), indicating that raw data
+ *      smaller than this value will be attempted to be bunched together in (at
+ *      least) 2K blocks in the file.  Setting the value to 0 with this API
+ *      function will turn off the "small" raw data aggregation, even if the
+ *      VFL driver attempts to use that strategy.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, June 5, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_small_data_block_size(hid_t plist_id, hsize_t size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_SDATA_BLOCK_SIZE_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'small data' block size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_small_data_block_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_small_data_block_size
+ *
+ * Purpose:	Returns the current settings for the "small" raw data block
+ *      allocation property from a file access property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, June 5, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_small_data_block_size(hid_t plist_id, hsize_t *size/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(size) {
+        if(H5P_get(plist, H5F_ACS_SDATA_BLOCK_SIZE_NAME, size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get 'small data' block size")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_small_data_block_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_libver_bounds
+ *
+ * Purpose:	Indicates which versions of the file format the library should
+ *      use when creating objects.  LOW is the earliest version of the HDF5
+ *      library that is guaranteed to be able to access the objects created
+ *      (the format of some objects in an HDF5 file may not have changed between
+ *      versions of the HDF5 library, possibly allowing earlier versions of the
+ *      HDF5 library to access those objects) and HIGH is the latest version
+ *      of the library required to access the objects created (later versions
+ *      of the HDF5 library will also be able to access those objects).
+ *
+ *      LOW is used to require that objects use a more modern format and HIGH
+ *      is used to restrict objects from using a more modern format.
+ *
+ *      The special values of H5F_FORMAT_EARLIEST and H5F_FORMAT_LATEST can be
+ *      used in the following manner:  Setting LOW and HIGH to H5F_FORMAT_LATEST
+ *      will produce files whose objects use the latest version of the file
+ *      format available in the current HDF5 library for each object created.
+ *      Setting LOW and HIGH to H5F_FORMAT_EARLIEST will produce files that that
+ *      always require the use of the earliest version of the file format for
+ *      each object created. [NOTE!  LOW=HIGH=H5F_FORMAT_EARLIEST is not
+ *      implemented as of version 1.8.0 and setting LOW and HIGH to
+ *      H5F_FORMAT_EARLIEST will produce an error currently].
+ *
+ *      Currently, the only two valid combinations for this routine are:
+ *      LOW = H5F_FORMAT_EARLIEST and HIGH = H5F_FORMAT_LATEST (the default
+ *      setting, which creates objects with the ealiest version possible for
+ *      each object, but no upper limit on the version allowed to be created if
+ *      a newer version of an object's format is required to support a feature
+ *      requested with an HDF5 library API routine), and LOW = H5F_FORMAT_LATEST
+ *      and HIGH = H5F_FORMAT_LATEST (which is described above).
+ *
+ *      The LOW and HIGH values set with this routine at imposed with each
+ *      HDF5 library API call that creates objects in the file.  API calls that
+ *      would violate the LOW or HIGH format bound will fail.
+ *
+ *      Setting the LOW and HIGH values will not affect reading/writing existing
+ *      objects, only the creation of new objects.
+ *
+ * Note: Eventually we want to add more values to the H5F_libver_t
+ *      enumerated type that indicate library release values where the file
+ *      format was changed (like "H5F_FORMAT_1_2_0" for the file format changes
+ *      in the 1.2.x release branch and possily even "H5F_FORMAT_1_4_2" for
+ *      a change mid-way through the 1.4.x release branch, etc).
+ *
+ *      Adding more values will allow applications to make settings like the
+ *      following:
+ *          LOW = H5F_FORMAT_EARLIEST, HIGH = H5F_FORMAT_1_2_0 => Create objects
+ *              with the earliest possible format and don't allow any objects
+ *              to be created that require a library version greater than 1.2.x
+ *              (This is the "make certain that <application> linked with v1.2.x
+ *              of the library can read the file produced" use case)
+ *
+ *          LOW = H5F_FORMAT_1_4_2, HIGH = H5F_FORMAT_LATEST => create objects
+ *              with at least the version of their format that the 1.4.2 library
+ *              uses and allow any later version of the object's format
+ *              necessary to represent features used.
+ *              (This is the "make certain to take advantage of <new feature>
+ *              in the file format" use case (maybe <new feature> is smaller
+ *              or scales better than an ealier version, which would otherwise
+ *              be used))
+ *
+ *         LOW = H5F_FORMAT_1_2_0, HIGH = H5F_FORMAT_1_6_0 => creates objects
+ *              with at least the version of their format that the 1.2.x library
+ *              uses and don't allow any objects to be created that require a
+ *              library version greater than 1.6.x.
+ *              (Not certain of a particular use case for these settings,
+ *              although its probably just the logical combination of the
+ *              previous two; it just falls out as possible/logical (if it turns
+ *              out to be hard to implement in some way, we can always disallow
+ *              it))
+ *
+ * Note #2:     We talked about whether to include enum values for only library
+ *      versions where the format changed and decided it would be less confusing
+ *      for application developers if we include enum values for _all_ library
+ *      releases and then map down to the previous actual library release which
+ *      had a format change.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, December 30, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_libver_bounds(hid_t plist_id, H5F_libver_t low,
+    H5F_libver_t high)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    hbool_t latest;             /* Whether to use the latest version or not */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iFvFv", plist_id, low, high);
+
+    /* Check args */
+    /* (Note that this is _really_ restricted right now, we'll want to loosen
+     *  this up more as we add features - QAK)
+     */
+    if(high != H5F_LIBVER_LATEST)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid high library version bound")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    latest = (hbool_t)((low == H5F_LIBVER_LATEST) ? TRUE : FALSE);
+    if(H5P_set(plist, H5F_ACS_LATEST_FORMAT_NAME, &latest) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set library version bounds")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_libver_bounds() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_libver_bounds
+ *
+ * Purpose:	Returns the current settings for the library version format bounds
+ *      from a file access property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 3, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_libver_bounds(hid_t plist_id, H5F_libver_t *low/*out*/,
+    H5F_libver_t *high/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    hbool_t latest;             /* Whether to use the latest version or not */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", plist_id, low, high);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(H5P_get(plist, H5F_ACS_LATEST_FORMAT_NAME, &latest) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get library version bounds")
+
+    /* Check for setting values to return */
+    /* (Again, this is restricted now, we'll need to open it up later -QAK) */
+    if(low)
+        *low = latest ? H5F_LIBVER_LATEST : H5F_LIBVER_EARLIEST;
+    if(high)
+        *high = H5F_LIBVER_LATEST;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_libver_bounds() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_elink_file_cache_size
+ *
+ * Purpose:     Sets the number of files opened through external links
+ *              from the file associated with this fapl to be held open
+ *              in that file's external file cache.  When the maximum
+ *              number of files is reached, the least recently used file
+ *              is closed (unless it is opened from somewhere else).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, December 17, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_elink_file_cache_size(hid_t plist_id, unsigned efc_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, efc_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    if(H5P_set(plist, H5F_ACS_EFC_SIZE_NAME, &efc_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set elink file cache size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_elink_file_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_elink_file_cache_size
+ *
+ * Purpose:     Gets the number of files opened through external links
+ *              from the file associated with this fapl to be held open
+ *              in that file's external file cache.  When the maximum
+ *              number of files is reached, the least recently used file
+ *              is closed (unless it is opened from somewhere else).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, December 17, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_elink_file_cache_size(hid_t plist_id, unsigned *efc_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", plist_id, efc_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(efc_size)
+        if(H5P_get(plist, H5F_ACS_EFC_SIZE_NAME, efc_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get elink file cache size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_elink_file_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Pset_file_image
+ *
+ * Purpose:     Sets the initial file image. Some file drivers can initialize 
+ *              the starting data in a file from a buffer. 
+ *              
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len)
+{
+    H5P_genplist_t *fapl;               /* Property list pointer */
+    H5FD_file_image_info_t image_info;  /* File image info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*xz", fapl_id, buf_ptr, buf_len);
+
+    /* validate parameters */
+    if(!(((buf_ptr == NULL) && (buf_len == 0)) || ((buf_ptr != NULL) && (buf_len > 0))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "inconsistant buf_ptr and buf_len")
+   
+    /* Get the plist structure */
+    if(NULL == (fapl = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+        
+    /* Get old image info */
+    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get old file image pointer")
+        
+    /* Release previous buffer, if it exists */
+    if(image_info.buffer != NULL) {
+        if(image_info.callbacks.image_free) {
+            if(SUCCEED != image_info.callbacks.image_free(image_info.buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET, image_info.callbacks.udata))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "image_free callback failed")
+        } /* end if */
+        else
+            H5MM_xfree(image_info.buffer);
+    } /* end if */  
+    
+    /* Update struct */
+    if(buf_ptr) {
+        /* Allocate memory */
+        if(image_info.callbacks.image_malloc) {
+            if(NULL == (image_info.buffer = image_info.callbacks.image_malloc(buf_len,
+                    H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET, image_info.callbacks.udata)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "image malloc callback failed")
+         } /* end if */
+         else
+            if(NULL == (image_info.buffer = H5MM_malloc(buf_len)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory block")
+    
+        /* Copy data */
+        if(image_info.callbacks.image_memcpy) {
+            if(image_info.buffer != image_info.callbacks.image_memcpy(image_info.buffer, 
+                   buf_ptr, buf_len, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET, 
+                   image_info.callbacks.udata))
+	        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, "image_memcpy callback failed")
+        } /* end if */
+	else
+            HDmemcpy(image_info.buffer, buf_ptr, buf_len);
+    } /* end if */
+    else
+        image_info.buffer = NULL;
+
+    image_info.size = buf_len;
+
+    /* Set values */
+    if(H5P_set(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file image info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_file_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Pget_file_image
+ *
+ * Purpose:     If the file image exists and buf_ptr_ptr is not NULL, 
+ *		allocate a buffer of the correct size, copy the image into 
+ *		the new buffer, and return the buffer to the caller in 
+ *		*buf_ptr_ptr.  Do this using the file image callbacks
+ *		if defined.  
+ *
+ *		NB: It is the responsibility of the caller to free the 
+ *		buffer whose address is returned in *buf_ptr_ptr.  Do
+ *		this using free if the file image callbacks are not 
+ *		defined, or with whatever method is appropriate if 
+ *		the callbacks are defined.
+ *
+ *              If buf_ptr_ptr is not NULL, and no image exists, set 
+ *		*buf_ptr_ptr to NULL.
+ *
+ *		If buf_len_ptr is not NULL, set *buf_len_ptr equal
+ *		to the length of the file image if it exists, and 
+ *		to 0 if it does not.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr)
+{
+    H5P_genplist_t *fapl;               /* Property list pointer */
+    H5FD_file_image_info_t image_info;  /* File image info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i**x*z", fapl_id, buf_ptr_ptr, buf_len_ptr);
+
+    /* Get the plist structure */
+    if(NULL == (fapl = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file image info")
+
+    /* verify file image field consistancy */
+    HDassert(((image_info.buffer != NULL) && (image_info.size > 0)) || 
+             ((image_info.buffer == NULL) && (image_info.size == 0)));
+
+    /* Set output size */
+    if(buf_len_ptr != NULL)
+        *buf_len_ptr = image_info.size;
+
+    /* Duplicate the image if desired, using callbacks if available */
+    if(buf_ptr_ptr != NULL) {
+        void * copy_ptr = NULL;         /* Copy of memory image */
+
+        if(image_info.buffer != NULL) {
+            /* Allocate memory */
+            if(image_info.callbacks.image_malloc) {
+                if(NULL == (copy_ptr = image_info.callbacks.image_malloc(image_info.size,
+                        H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET, image_info.callbacks.udata)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "image malloc callback failed")
+            } /* end if */
+            else
+                if(NULL == (copy_ptr = H5MM_malloc(image_info.size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate copy")
+    
+            /* Copy data */
+            if(image_info.callbacks.image_memcpy) {
+                if(copy_ptr != image_info.callbacks.image_memcpy(copy_ptr, image_info.buffer,
+                        image_info.size, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET, 
+                        image_info.callbacks.udata))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, "image_memcpy callback failed")
+            } /* end if */
+	    else
+                HDmemcpy(copy_ptr, image_info.buffer, image_info.size);
+        } /* end if */
+
+        *buf_ptr_ptr = copy_ptr;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_file_image */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Pset_file_image_callbacks
+ *
+ * Purpose:     Sets the callbacks for file images. Some file drivers allow
+ *              the use of user-defined callbacks for allocating, freeing and
+ *              copying the drivers internal buffer, potentially allowing a 
+ *              clever user to do optimizations such as avoiding large mallocs
+ *              and memcpys or to perform detailed logging.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callbacks_ptr)
+{
+    H5P_genplist_t *fapl;               /* Property list pointer */
+    H5FD_file_image_info_t info;        /* File image info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", fapl_id, callbacks_ptr);
+
+    /* Get the plist structure */
+    if(NULL == (fapl = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get old info */
+    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get old file image info")
+
+    /* verify file image field consistancy */
+    HDassert(((info.buffer != NULL) && (info.size > 0)) || 
+             ((info.buffer == NULL) && (info.size == 0)));
+
+    /* Make sure a file image hasn't already been set */
+    if(info.buffer != NULL || info.size > 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_SETDISALLOWED, FAIL, "setting callbacks when an image is already set is forbidden. It could cause memory leaks.")
+
+    /* verify that callbacks_ptr is not NULL */
+    if(NULL == callbacks_ptr)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL callbacks_ptr")
+
+    /* Make sure udata callbacks are going to be set if udata is going to be set */
+    if(callbacks_ptr->udata)
+        if(callbacks_ptr->udata_copy == NULL || callbacks_ptr->udata_free == NULL)
+            HGOTO_ERROR(H5E_PLIST, H5E_SETDISALLOWED, FAIL, "udata callbacks must be set if udata is set")
+
+    /* Release old udata if it exists */
+    if(info.callbacks.udata != NULL) {
+        HDassert(info.callbacks.udata_free);
+        if(info.callbacks.udata_free(info.callbacks.udata) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "udata_free callback failed")
+    } /* end if */
+
+    /* Update struct */
+    info.callbacks = *callbacks_ptr;
+
+    if(callbacks_ptr->udata) {
+        HDassert(callbacks_ptr->udata_copy);
+        HDassert(callbacks_ptr->udata_free);
+        if((info.callbacks.udata = callbacks_ptr->udata_copy(callbacks_ptr->udata)) == NULL)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't copy the suppplied udata")
+    } /* end if */
+
+    /* Set values */
+    if(H5P_set(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file image info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_file_image_callbacks() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Pget_file_image_callbacks
+ *
+ * Purpose:     Sets the callbacks for file images. Some file drivers allow
+ *              the use of user-defined callbacks for allocating, freeing and
+ *              copying the drivers internal buffer, potentially allowing a 
+ *              clever user to do optimizations such as avoiding large mallocs
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callbacks_ptr)
+{
+    H5P_genplist_t *fapl;               /* Property list pointer */
+    H5FD_file_image_info_t info;        /* File image info */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", fapl_id, callbacks_ptr);
+
+    /* Get the plist structure */
+    if(NULL == (fapl = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get old info */
+    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file image info")
+
+    /* verify file image field consistancy */
+    HDassert(((info.buffer != NULL) && (info.size > 0)) || 
+             ((info.buffer == NULL) && (info.size == 0)));
+
+    /* verify that callbacks_ptr is not NULL */
+    if(NULL == callbacks_ptr)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL callbacks_ptr")
+
+    /* Transfer values to parameters */
+    *callbacks_ptr = info.callbacks;
+
+    /* Copy udata if it exists */
+    if(info.callbacks.udata != NULL) {
+        HDassert(info.callbacks.udata_copy);
+        if((callbacks_ptr->udata = info.callbacks.udata_copy(info.callbacks.udata)) == 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't copy udata")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_file_image_callbacks() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P_file_image_info_del
+ *
+ * Purpose:     Delete callback for the file image info property, called
+ *              when the property is deleted from the plist. The buffer
+ *              and udata may need to be freed, possibly using their 
+ *              respective callbacks so the default free won't work.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_file_image_info_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5FD_file_image_info_t info;        /* Image info struct */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(value) {
+        info = *(H5FD_file_image_info_t *)value;
+
+        /* verify file image field consistancy */
+        HDassert(((info.buffer != NULL) && (info.size > 0)) || 
+                 ((info.buffer == NULL) && (info.size == 0)));
+
+        if(info.buffer && info.size > 0) {
+            /* Free buffer */
+            if(info.callbacks.image_free) {
+                if(info.callbacks.image_free(info.buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE, info.callbacks.udata) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "image_free callback failed")
+            } /* end if */
+            else
+                HDfree(info.buffer);
+        } /* end if */
+
+        /* Free udata if it exists */
+        if(info.callbacks.udata) {
+            if(NULL == info.callbacks.udata_free)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_free not defined")
+
+            if(info.callbacks.udata_free(info.callbacks.udata) < 0)
+	        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "udata_free callback failed")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_file_image_info_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P_file_image_info_copy
+ *
+ * Purpose:     Copy callback for the file image info property. The buffer
+ *              and udata may need to be copied, possibly using their 
+ *              respective callbacks so the default copy won't work.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_file_image_info_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(value) {
+        H5FD_file_image_info_t *info;   /* Image info struct */
+
+        info = (H5FD_file_image_info_t *)value;
+
+        /* verify file image field consistancy */
+        HDassert(((info->buffer != NULL) && (info->size > 0)) || 
+                 ((info->buffer == NULL) && (info->size == 0)));
+
+        if(info->buffer && info->size > 0) {
+            void *old_buffer;            /* Pointer to old image buffer */
+
+            /* Store the old buffer */
+            old_buffer = info->buffer;
+
+            /* Allocate new buffer */
+            if(info->callbacks.image_malloc) {
+                if(NULL == (info->buffer = info->callbacks.image_malloc(info->size,
+                        H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, info->callbacks.udata)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "image malloc callback failed")
+            } /* end if */
+            else {
+                if(NULL == (info->buffer = H5MM_malloc(info->size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory block")
+            } /* end else */
+            
+            /* Copy data to new buffer */
+            if(info->callbacks.image_memcpy) {
+                if(info->buffer != info->callbacks.image_memcpy(info->buffer, old_buffer, 
+			info->size, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, 
+			info->callbacks.udata))
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, "image_memcpy callback failed")
+            } /* end if */
+	    else
+                HDmemcpy(info->buffer, old_buffer, info->size);
+        } /* end if */
+
+        /* Copy udata if it exists */
+        if(info->callbacks.udata) {
+            void *old_udata = info->callbacks.udata;
+
+            if(NULL == info->callbacks.udata_copy)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_copy not defined")
+
+            info->callbacks.udata = info->callbacks.udata_copy(old_udata);
+        } /* end if */
+
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_file_image_info_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P_file_image_info_close
+ *
+ * Purpose:     Close callback for the file image info property. The buffer
+ *              and udata may need to be freed, possibly using their 
+ *              respective callbacks so the standard free won't work.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_file_image_info_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(value) {
+        H5FD_file_image_info_t *info;        /* Image info struct */
+
+        info = (H5FD_file_image_info_t *)value;
+             
+        if(info->buffer != NULL && info->size > 0) { 
+            /* Free buffer */
+            if(info->callbacks.image_free) {
+                if(info->callbacks.image_free(info->buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
+                        info->callbacks.udata) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "image_free callback failed")
+            } /* end if */
+            else
+                H5MM_xfree(info->buffer);
+        } /* end if */
+
+        /* Free udata if it exists */
+        if(info->callbacks.udata) {
+            if(NULL == info->callbacks.udata_free)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_free not defined")
+            if(info->callbacks.udata_free(info->callbacks.udata) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "udata_free callback failed")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_file_image_info_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_core_write_tracking
+ *
+ * Purpose:	Enables/disables core VFD write tracking and page
+ *              aggregation size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_core_write_tracking(hid_t plist_id, hbool_t is_enabled, size_t page_size)
+{
+    H5P_genplist_t *plist;        /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ibz", plist_id, is_enabled, page_size);
+
+    /* The page size cannot be zero */
+    if(page_size == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "page_size cannot be zero")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, &is_enabled) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking flag")
+    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, &page_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking page size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_core_write_tracking
+ *
+ * Purpose:	Gets information about core VFD write tracking and page
+ *              aggregation size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_core_write_tracking(hid_t plist_id, hbool_t *is_enabled, size_t *page_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*b*z", plist_id, is_enabled, page_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(is_enabled) {
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, is_enabled) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking flag")
+    } /* end if */
+
+    if(page_size) {
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, page_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking page size")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pfcpl.c b/gatb-core/thirdparty/hdf5/src/H5Pfcpl.c
new file mode 100644
index 0000000..a054471
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pfcpl.c
@@ -0,0 +1,963 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pfcpl.c
+ *			January  6 1998
+ *			Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:		File creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bprivate.h"		/* B-tree subclass names		*/
+#include "H5Eprivate.h"		/* Error handling			*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5SMprivate.h"        /* Shared object header messages	*/
+#include "H5Ppkg.h"		/* Property lists		 	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========= File Creation properties ============ */
+/* Definitions for the size of the file user block in bytes */
+#define H5F_CRT_USER_BLOCK_SIZE      sizeof(hsize_t)
+#define H5F_CRT_USER_BLOCK_DEF       0
+/* Definitions for the 1/2 rank for symbol table leaf nodes */
+#define H5F_CRT_SYM_LEAF_SIZE        sizeof(unsigned)
+/* Definitions for the 1/2 rank for btree internal nodes    */
+#define H5F_CRT_BTREE_RANK_SIZE      sizeof(unsigned[H5B_NUM_BTREE_ID])
+#define H5F_CRT_BTREE_RANK_DEF       {HDF5_BTREE_SNODE_IK_DEF,HDF5_BTREE_CHUNK_IK_DEF}
+/* Definitions for byte number in an address                */
+#define H5F_CRT_ADDR_BYTE_NUM_SIZE   sizeof(uint8_t)
+#define H5F_CRT_ADDR_BYTE_NUM_DEF    H5F_OBJ_ADDR_SIZE
+/* Definitions for byte number for object size              */
+#define H5F_CRT_OBJ_BYTE_NUM_SIZE     sizeof(uint8_t)
+#define H5F_CRT_OBJ_BYTE_NUM_DEF      H5F_OBJ_SIZE_SIZE
+/* Definitions for version number of the superblock         */
+#define H5F_CRT_SUPER_VERS_SIZE       sizeof(unsigned)
+#define H5F_CRT_SUPER_VERS_DEF        HDF5_SUPERBLOCK_VERSION_DEF
+/* Definitions for shared object header messages */
+#define H5F_CRT_SHMSG_NINDEXES_SIZE    sizeof(unsigned)
+#define H5F_CRT_SHMSG_NINDEXES_DEF     (0)
+#define H5F_CRT_SHMSG_INDEX_TYPES_SIZE sizeof(unsigned[H5O_SHMESG_MAX_NINDEXES])
+#define H5F_CRT_SHMSG_INDEX_TYPES_DEF  {0,0,0,0,0,0}
+#define H5F_CRT_SHMSG_INDEX_MINSIZE_SIZE sizeof(unsigned[H5O_SHMESG_MAX_NINDEXES])
+#define H5F_CRT_SHMSG_INDEX_MINSIZE_DEF {250,250,250,250,250,250}
+/* Definitions for shared object header list/btree phase change cutoffs */
+#define H5F_CRT_SHMSG_LIST_MAX_SIZE     sizeof(unsigned)
+#define H5F_CRT_SHMSG_LIST_MAX_DEF      (50)
+#define H5F_CRT_SHMSG_BTREE_MIN_SIZE    sizeof(unsigned)
+#define H5F_CRT_SHMSG_BTREE_MIN_DEF     (40)
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P_fcrt_reg_prop(H5P_genclass_t *pclass);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* File creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_FCRT[1] = {{
+    "file create",		/* Class name for debugging     */
+    H5P_TYPE_FILE_CREATE,       /* Class type                   */
+
+    &H5P_CLS_GROUP_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_FILE_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_FILE_CREATE_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_FILE_CREATE_ID_g,	/* Pointer to default property list ID */
+    H5P_fcrt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_fcrt_reg_prop
+ *
+ * Purpose:     Register the file creation property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_fcrt_reg_prop(H5P_genclass_t *pclass)
+{
+    hsize_t userblock_size = H5F_CRT_USER_BLOCK_DEF;    /* Default userblock size */
+    unsigned sym_leaf_k = H5F_CRT_SYM_LEAF_DEF;         /* Default size for symbol table leaf nodes */
+    unsigned btree_k[H5B_NUM_BTREE_ID] = H5F_CRT_BTREE_RANK_DEF;    /* Default 'K' values for B-trees in file */
+    uint8_t sizeof_addr = H5F_CRT_ADDR_BYTE_NUM_DEF;     /* Default size of addresses in the file */
+    uint8_t sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF;      /* Default size of sizes in the file */
+    unsigned superblock_ver = H5F_CRT_SUPER_VERS_DEF;   /* Default superblock version # */
+    unsigned num_sohm_indexes    = H5F_CRT_SHMSG_NINDEXES_DEF;
+    unsigned sohm_index_flags[H5O_SHMESG_MAX_NINDEXES]    = H5F_CRT_SHMSG_INDEX_TYPES_DEF;
+    unsigned sohm_index_minsizes[H5O_SHMESG_MAX_NINDEXES] = H5F_CRT_SHMSG_INDEX_MINSIZE_DEF;
+    unsigned sohm_list_max  = H5F_CRT_SHMSG_LIST_MAX_DEF;
+    unsigned sohm_btree_min  = H5F_CRT_SHMSG_BTREE_MIN_DEF;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Register the user block size */
+    if(H5P_register_real(pclass, H5F_CRT_USER_BLOCK_NAME, H5F_CRT_USER_BLOCK_SIZE, &userblock_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the 1/2 rank for symbol table leaf nodes */
+    if(H5P_register_real(pclass, H5F_CRT_SYM_LEAF_NAME, H5F_CRT_SYM_LEAF_SIZE, &sym_leaf_k, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the 1/2 rank for btree internal nodes */
+    if(H5P_register_real(pclass, H5F_CRT_BTREE_RANK_NAME, H5F_CRT_BTREE_RANK_SIZE, btree_k, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the byte number for an address */
+    if(H5P_register_real(pclass, H5F_CRT_ADDR_BYTE_NUM_NAME, H5F_CRT_ADDR_BYTE_NUM_SIZE, &sizeof_addr, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the byte number for object size */
+    if(H5P_register_real(pclass, H5F_CRT_OBJ_BYTE_NUM_NAME, H5F_CRT_OBJ_BYTE_NUM_SIZE, &sizeof_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the superblock version number */
+    if(H5P_register_real(pclass, H5F_CRT_SUPER_VERS_NAME, H5F_CRT_SUPER_VERS_SIZE, &superblock_ver, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the shared OH message information */
+    if(H5P_register_real(pclass,H5F_CRT_SHMSG_NINDEXES_NAME, H5F_CRT_SHMSG_NINDEXES_SIZE, &num_sohm_indexes,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass,H5F_CRT_SHMSG_INDEX_TYPES_NAME, H5F_CRT_SHMSG_INDEX_TYPES_SIZE, &sohm_index_flags,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass,H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, H5F_CRT_SHMSG_INDEX_MINSIZE_SIZE, &sohm_index_minsizes,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the shared OH cutoff size information */
+    if(H5P_register_real(pclass,H5F_CRT_SHMSG_LIST_MAX_NAME, H5F_CRT_SHMSG_LIST_MAX_SIZE, &sohm_list_max,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass,H5F_CRT_SHMSG_BTREE_MIN_NAME, H5F_CRT_SHMSG_BTREE_MIN_SIZE, &sohm_btree_min,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_fcrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_version
+ *
+ * Purpose:	Retrieves version information for various parts of a file.
+ *
+ *		SUPER:		The file super block.
+ *		FREELIST:	The global free list.
+ *		STAB:		The root symbol table entry.
+ *		SHHDR:		Shared object headers.
+ *
+ *		Any (or even all) of the output arguments can be null
+ *		pointers.
+ *
+ * Return:	Success:	Non-negative, version information is returned
+ *				through the arguments.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_version(hid_t plist_id, unsigned *super/*out*/, unsigned *freelist/*out*/,
+    unsigned *stab/*out*/, unsigned *shhdr/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ixxxx", plist_id, super, freelist, stab, shhdr);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(super)
+        if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, super) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get superblock version")
+    if(freelist)
+        *freelist = HDF5_FREESPACE_VERSION;     /* (hard-wired) */
+    if(stab)
+        *stab = HDF5_OBJECTDIR_VERSION;         /* (hard-wired) */
+    if(shhdr)
+        *shhdr = HDF5_SHAREDHEADER_VERSION;     /* (hard-wired) */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_userblock
+ *
+ * Purpose:	Sets the userblock size field of a file creation property
+ *		list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_userblock(hid_t plist_id, hsize_t size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", plist_id, size);
+
+    /* Sanity check non-zero userblock sizes */
+    if(size > 0) {
+        /* Check that the userblock size is >=512 */
+        if(size < 512)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "userblock size is non-zero and less than 512")
+
+        /* Check that the userblock size is a power of two */
+        if(!POWER_OF_TWO(size))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "userblock size is non-zero and not a power of two")
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    if(H5P_set(plist, H5F_CRT_USER_BLOCK_NAME, &size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set user block")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_userblock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_userblock
+ *
+ * Purpose:	Queries the size of a user block in a file creation property
+ *		list.
+ *
+ * Return:	Success:	Non-negative, size returned through SIZE argument.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu, Oct 14, 2001
+ *		Changed to the new generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_userblock(hid_t plist_id, hsize_t *size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", plist_id, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Get value */
+    if (size)
+        if(H5P_get(plist, H5F_CRT_USER_BLOCK_NAME, size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL,"can't get user block");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_sizes
+ *
+ * Purpose:	Sets file size-of addresses and sizes.	PLIST_ID should be a
+ *		file creation property list.  A value of zero causes the
+ *		property to not change.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_sizes(hid_t plist_id, size_t sizeof_addr, size_t sizeof_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "izz", plist_id, sizeof_addr, sizeof_size);
+
+    /* Check arguments */
+    if(sizeof_addr) {
+        if(sizeof_addr != 2 && sizeof_addr != 4 && sizeof_addr != 8 && sizeof_addr != 16)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file haddr_t size is not valid")
+    } /* end if */
+    if(sizeof_size) {
+        if(sizeof_size != 2 && sizeof_size != 4 && sizeof_size != 8 && sizeof_size != 16)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file size_t size is not valid")
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    if(sizeof_addr) {
+        uint8_t tmp_sizeof_addr = (uint8_t)sizeof_addr;
+
+        if(H5P_set(plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &tmp_sizeof_addr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set byte number for an address")
+    } /* end if */
+    if(sizeof_size) {
+        uint8_t tmp_sizeof_size = (uint8_t)sizeof_size;
+
+        if(H5P_set(plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &tmp_sizeof_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set byte number for object ")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_sizes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_sizes
+ *
+ * Purpose:	Returns the size of address and size quantities stored in a
+ *		file according to a file creation property list.  Either (or
+ *		even both) SIZEOF_ADDR and SIZEOF_SIZE may be null pointers.
+ *
+ * Return:	Success:	Non-negative, sizes returned through arguments.
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_sizes(hid_t plist_id, size_t *sizeof_addr, size_t *sizeof_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*z*z", plist_id, sizeof_addr, sizeof_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(sizeof_addr) {
+        uint8_t tmp_sizeof_addr;
+
+        if(H5P_get(plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &tmp_sizeof_addr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get byte number for an address")
+        *sizeof_addr = tmp_sizeof_addr;
+    } /* end if */
+    if(sizeof_size) {
+        uint8_t tmp_sizeof_size;
+
+        if(H5P_get(plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &tmp_sizeof_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get byte number for object ")
+        *sizeof_size = tmp_sizeof_size;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_sizes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_sym_k
+ *
+ * Purpose:	IK is one half the rank of a tree that stores a symbol
+ *		table for a group.  Internal nodes of the symbol table are on
+ *		average 75% full.  That is, the average rank of the tree is
+ *		1.5 times the value of IK.
+ *
+ *		LK is one half of the number of symbols that can be stored in
+ *		a symbol table node.  A symbol table node is the leaf of a
+ *		symbol table tree which is used to store a group.  When
+ *		symbols are inserted randomly into a group, the group's
+ *		symbol table nodes are 75% full on average.  That is, they
+ *		contain 1.5 times the number of symbols specified by LK.
+ *
+ *		Either (or even both) of IK and LK can be zero in which case
+ *		that value is left unchanged.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu, Oct 14, 2001
+ *         	Changed to the new generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_sym_k(hid_t plist_id, unsigned ik, unsigned lk)
+{
+    unsigned btree_k[H5B_NUM_BTREE_ID];
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, ik, lk);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Set values */
+    if (ik > 0) {
+	if((ik * 2) >= HDF5_BTREE_IK_MAX_ENTRIES)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "istore IK value exceeds maximum B-tree entries");
+
+        if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get rank for btree interanl nodes");
+        btree_k[H5B_SNODE_ID] = ik;
+        if(H5P_set(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set rank for btree nodes");
+    }
+    if (lk > 0)
+        if(H5P_set(plist, H5F_CRT_SYM_LEAF_NAME, &lk) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set rank for symbol table leaf nodes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_sym_k
+ *
+ * Purpose:	Retrieves the symbol table B-tree 1/2 rank (IK) and the
+ *		symbol table leaf node 1/2 size (LK).  See H5Pset_sym_k() for
+ *		details. Either (or even both) IK and LK may be null
+ *		pointers.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu
+ *		Changed to the new generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_sym_k(hid_t plist_id, unsigned *ik /*out */ , unsigned *lk /*out */ )
+{
+    unsigned btree_k[H5B_NUM_BTREE_ID];
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", plist_id, ik, lk);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Get values */
+    if (ik) {
+        if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get rank for btree nodes");
+        *ik = btree_k[H5B_SNODE_ID];
+    }
+    if (lk)
+        if(H5P_get(plist, H5F_CRT_SYM_LEAF_NAME, lk) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get rank for symbol table leaf nodes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_istore_k
+ *
+ * Purpose:	IK is one half the rank of a tree that stores chunked raw
+ *		data.  On average, such a tree will be 75% full, or have an
+ *		average rank of 1.5 times the value of IK.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu, Oct 14, 2001
+ *		Changed to the new generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_istore_k(hid_t plist_id, unsigned ik)
+{
+    unsigned btree_k[H5B_NUM_BTREE_ID];
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, ik);
+
+    /* Check arguments */
+    if (ik == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "istore IK value must be positive");
+
+    if((ik * 2) >= HDF5_BTREE_IK_MAX_ENTRIES)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "istore IK value exceeds maximum B-tree entries");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Set value */
+    if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get rank for btree interanl nodes");
+    btree_k[H5B_CHUNK_ID] = ik;
+    if(H5P_set(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set rank for btree interanl nodes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_istore_k
+ *
+ * Purpose:	Queries the 1/2 rank of an indexed storage B-tree.  See
+ *		H5Pset_istore_k() for details.	The argument IK may be the
+ *		null pointer.
+ *
+ * Return:	Success:	Non-negative, size returned through IK
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *		Raymond Lu, Oct 14, 2001
+ *		Changed to the new generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_istore_k(hid_t plist_id, unsigned *ik /*out */ )
+{
+    unsigned btree_k[H5B_NUM_BTREE_ID];
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, ik);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Get value */
+    if(ik) {
+        if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get rank for btree interanl nodes");
+        *ik = btree_k[H5B_CHUNK_ID];
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_istore_k() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_shared_mesg_nindexes
+ *
+ * Purpose:	Set the number of Shared Object Header Message (SOHM)
+ *              indexes specified in this property list.  If this is
+ *              zero then shared object header messages are disabled
+ *              for this file.
+ *
+ *              These indexes can then be configured with
+ *              H5Pset_shared_mesg_index.  H5Pset_shared_mesg_phase_chage
+ *              also controls settings for all indexes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Monday, October 9, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_shared_mesg_nindexes(hid_t plist_id, unsigned nindexes)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, nindexes);
+
+    /* Check argument */
+    if (nindexes > H5O_SHMESG_MAX_NINDEXES)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "number of indexes is greater than H5O_SHMESG_MAX_NINDEXES");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    if(H5P_set(plist, H5F_CRT_SHMSG_NINDEXES_NAME, &nindexes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set number of indexes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_shared_mesg_nindexes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_shared_mesg_nindexes
+ *
+ * Purpose:	Get the number of Shared Object Header Message (SOHM)
+ *              indexes specified in this property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Monday, October 9, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_shared_mesg_nindexes(hid_t plist_id, unsigned *nindexes)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", plist_id, nindexes);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    if(H5P_get(plist, H5F_CRT_SHMSG_NINDEXES_NAME, nindexes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of indexes");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_shared_mesg_nindexes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_shared_mesg_index
+ *
+ * Purpose:	Configure a given shared message index.  Sets the types of
+ *              message that should be stored in this index and the minimum
+ *              size of a message in the index.
+ *
+ *              INDEX_NUM is zero-indexed (in a file with three indexes,
+ *              they are numbered 0, 1, and 2).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Wednesday, April 5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned mesg_type_flags, unsigned min_mesg_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    unsigned    nindexes;               /* Number of SOHM indexes */
+    unsigned    type_flags[H5O_SHMESG_MAX_NINDEXES]; /* Array of mesg_type_flags*/
+    unsigned    minsizes[H5O_SHMESG_MAX_NINDEXES]; /* Array of min_mesg_sizes*/
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iIuIuIu", plist_id, index_num, mesg_type_flags, min_mesg_size);
+
+    /* Check arguments */
+    if(mesg_type_flags > H5O_SHMESG_ALL_FLAG)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "unrecognized flags in mesg_type_flags")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Read the current number of indexes */
+    if(H5P_get(plist, H5F_CRT_SHMSG_NINDEXES_NAME, &nindexes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of indexes")
+
+    /* Range check */
+    if(index_num >= nindexes)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "index_num is too large; no such index");
+
+    /* Get arrays of type flags and message sizes */
+    if(H5P_get(plist, H5F_CRT_SHMSG_INDEX_TYPES_NAME, type_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get current index type flags")
+    if(H5P_get(plist, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, minsizes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get current min sizes")
+
+    /* Set values in arrays */
+    type_flags[index_num] = mesg_type_flags;
+    minsizes[index_num] = min_mesg_size;
+
+    /* Write arrays back to plist */
+    if(H5P_set(plist, H5F_CRT_SHMSG_INDEX_TYPES_NAME, type_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set index type flags")
+    if(H5P_set(plist, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, minsizes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set min mesg sizes")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_shared_mesg_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_shared_mesg_index
+ *
+ * Purpose:	Get information about a given shared message index.  Gets
+ *              the types of message that are stored in the index and the
+ *              minimum size of a message in the index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Wednesday, April 5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned *mesg_type_flags, unsigned *min_mesg_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    unsigned    nindexes;               /* Number of SOHM indexes */
+    unsigned    type_flags[H5O_SHMESG_MAX_NINDEXES]; /* Array of mesg_type_flags*/
+    unsigned    minsizes[H5O_SHMESG_MAX_NINDEXES]; /* Array of min_mesg_sizes*/
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iIu*Iu*Iu", plist_id, index_num, mesg_type_flags,
+             min_mesg_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Read the current number of indexes */
+    if(H5P_get(plist, H5F_CRT_SHMSG_NINDEXES_NAME, &nindexes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of indexes")
+
+    if(index_num >= nindexes)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "index_num is greater than number of indexes in property list")
+
+    /* Get arrays of type flags and message sizes */
+    if(H5P_get(plist, H5F_CRT_SHMSG_INDEX_TYPES_NAME, type_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get current index type flags")
+    if(H5P_get(plist, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, minsizes) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get current min sizes")
+
+    /* Get values from arrays */
+    if(mesg_type_flags)
+        *mesg_type_flags = type_flags[index_num];
+    if(min_mesg_size)
+        *min_mesg_size = minsizes[index_num];
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_shared_mesg_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_shared_mesg_phase_change
+ *
+ * Purpose:	Sets the cutoff values for indexes storing shared object
+ *              header messages in this file.  If more than max_list
+ *              messages are in an index, that index will become a B-tree.
+ *              Likewise, a B-tree index containing fewer than min_btree
+ *              messages will be converted to a list.
+ *
+ *              If the max_list is zero then SOHM indexes in this file will
+ *              never be lists but will be created as B-trees.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Wednesday, April 5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_shared_mesg_phase_change(hid_t plist_id, unsigned max_list, unsigned min_btree)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, max_list, min_btree);
+
+    /* Check that values are sensible.  The min_btree value must be no greater
+     * than the max list plus one.
+     *
+     * Range check to make certain they will fit into encoded form.
+     */
+    if(max_list + 1 < min_btree)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "minimum B-tree value is greater than maximum list value")
+    if(max_list > H5O_SHMESG_MAX_LIST_SIZE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max list value is larger than H5O_SHMESG_MAX_LIST_SIZE")
+    if(min_btree > H5O_SHMESG_MAX_LIST_SIZE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "min btree value is larger than H5O_SHMESG_MAX_LIST_SIZE")
+
+    /* Avoid the strange case where max_list == 0 and min_btree == 1, so deleting the
+     * last message in a B-tree makes it become an empty list.
+     */
+    if(max_list == 0)
+        min_btree = 0;
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    if(H5P_set(plist, H5F_CRT_SHMSG_LIST_MAX_NAME, &max_list) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set list maximum in property list");
+    if(H5P_set(plist, H5F_CRT_SHMSG_BTREE_MIN_NAME, &min_btree) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set B-tree minimum in property list");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_shared_mesg_phase_change() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_shared_mesg_phase_change
+ *
+ * Purpose:	Gets the maximum size of a SOHM list index before it becomes
+ *              a B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		Wednesday, April 5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_shared_mesg_phase_change(hid_t plist_id, unsigned *max_list, unsigned *min_btree)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*Iu*Iu", plist_id, max_list, min_btree);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
+
+    /* Get value */
+    if (max_list) {
+        if(H5P_get(plist, H5F_CRT_SHMSG_LIST_MAX_NAME, max_list) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get list maximum");
+    }
+    if (min_btree) {
+        if(H5P_get(plist, H5F_CRT_SHMSG_BTREE_MIN_NAME, min_btree) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get SOHM information");
+    }
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_shared_mesg_phase_change() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pfmpl.c b/gatb-core/thirdparty/hdf5/src/H5Pfmpl.c
new file mode 100644
index 0000000..3d1f9b2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pfmpl.c
@@ -0,0 +1,127 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pmtpl.c
+ *			November  1 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		File mount property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files		  	        */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ======================== File Mount properties ====================*/
+/* Definition for whether absolute symlinks local to file. */
+#define H5F_MNT_SYM_LOCAL_SIZE		sizeof(hbool_t)
+#define H5F_MNT_SYM_LOCAL_DEF	 	FALSE
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P_fmnt_reg_prop(H5P_genclass_t *pclass);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* File mount property list class library initialization object */
+const H5P_libclass_t H5P_CLS_FMNT[1] = {{
+    "file mount",		/* Class name for debugging     */
+    H5P_TYPE_FILE_MOUNT,        /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_FILE_MOUNT_g,	/* Pointer to class             */
+    &H5P_CLS_FILE_MOUNT_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_FILE_MOUNT_ID_g,	/* Pointer to default property list ID */
+    H5P_fmnt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_fmnt_reg_prop
+ *
+ * Purpose:     Register the file mount property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_fmnt_reg_prop(H5P_genclass_t *pclass)
+{
+    hbool_t local = H5F_MNT_SYM_LOCAL_DEF;      /* Whether symlinks are local to file */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Register property of whether symlinks is local to file */
+    if(H5P_register_real(pclass, H5F_MNT_SYM_LOCAL_NAME, H5F_MNT_SYM_LOCAL_SIZE, &local, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_fmnt_reg_prop() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pgcpl.c b/gatb-core/thirdparty/hdf5/src/H5Pgcpl.c
new file mode 100644
index 0000000..bf29f28
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pgcpl.c
@@ -0,0 +1,513 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pgcpl.c
+ *			August 29 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Group creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gprivate.h"         /* Groups                               */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P__gcrt_reg_prop(H5P_genclass_t *pclass);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Group creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_GCRT[1] = {{
+    "group create",		/* Class name for debugging     */
+    H5P_TYPE_GROUP_CREATE,      /* Class type                   */
+
+    &H5P_CLS_OBJECT_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_GROUP_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_GROUP_CREATE_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_GROUP_CREATE_ID_g,	/* Pointer to default property list ID */
+    H5P__gcrt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__gcrt_reg_prop
+ *
+ * Purpose:     Initialize the group creation property list class
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__gcrt_reg_prop(H5P_genclass_t *pclass)
+{
+    H5O_ginfo_t ginfo = H5G_CRT_GROUP_INFO_DEF;     /* Default group info settings */
+    H5O_linfo_t linfo = H5G_CRT_LINK_INFO_DEF;      /* Default link info settings */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register group info property */
+    if(H5P_register_real(pclass, H5G_CRT_GROUP_INFO_NAME, H5G_CRT_GROUP_INFO_SIZE, &ginfo, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register link info property */
+    if(H5P_register_real(pclass, H5G_CRT_LINK_INFO_NAME, H5G_CRT_LINK_INFO_SIZE, &linfo, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__gcrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_local_heap_size_hint
+ *
+ * Purpose:     Set the "size hint" for creating local heaps for a group.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              August 29, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_local_heap_size_hint(hid_t plist_id, size_t size_hint)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_ginfo_t ginfo;          /* Group information structure */
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", plist_id, size_hint);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Update field */
+    H5_CHECKED_ASSIGN(ginfo.lheap_size_hint, uint32_t, size_hint, size_t);
+
+    /* Set value */
+    if(H5P_set(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_local_heap_size_hint() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_local_heap_size_hint
+ *
+ * Purpose:     Returns the local heap size hint, which is used for creating
+ *              groups
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              August 29, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_local_heap_size_hint(hid_t plist_id, size_t *size_hint /*out*/)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, size_hint);
+
+    if(size_hint) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        H5O_ginfo_t ginfo;          /* Group information structure */
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get value */
+        if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+        /* Update field */
+        *size_hint = ginfo.lheap_size_hint;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_local_heap_size_hint() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_link_phase_change
+ *
+ * Purpose:     Set the maximum # of links to store "compactly" and the
+ *              minimum # of links to store "densely".  (These should
+ *              overlap).
+ *
+ * Note:        Currently both of these must be updated at the same time.
+ *
+ * Note:        Come up with better name & description! -QAK
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              August 29, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_link_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    H5O_ginfo_t ginfo;                  /* Group information structure */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, max_compact, min_dense);
+
+    /* Range check values */
+    if(max_compact < min_dense)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be >= min dense value")
+    if(max_compact > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be < 65536")
+    if(min_dense > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "min dense value must be < 65536")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get group info */
+    if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Update fields */
+    if(max_compact != H5G_CRT_GINFO_MAX_COMPACT || min_dense != H5G_CRT_GINFO_MIN_DENSE)
+        ginfo.store_link_phase_change = TRUE;
+    else
+        ginfo.store_link_phase_change = FALSE;
+    ginfo.max_compact = (uint16_t)max_compact;
+    ginfo.min_dense = (uint16_t)min_dense;
+
+    /* Set group info */
+    if(H5P_set(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_link_phase_change() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_link_phase_change
+ *
+ * Purpose:     Returns the max. # of compact links & the min. # of dense
+ *              links, which are used for storing groups
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              August 29, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_link_phase_change(hid_t plist_id, unsigned *max_compact /*out*/, unsigned *min_dense /*out*/)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", plist_id, max_compact, min_dense);
+
+    /* Get values */
+    if(max_compact || min_dense) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        H5O_ginfo_t ginfo;          /* Group information structure */
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get group info */
+        if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+        if(max_compact)
+            *max_compact = ginfo.max_compact;
+        if(min_dense)
+            *min_dense = ginfo.min_dense;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_link_phase_change() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_est_link_info
+ *
+ * Purpose:     Set the estimates for the number of entries and length of each
+ *              entry name in a group.
+ *
+ * Note:        Currently both of these must be updated at the same time.
+ *
+ * Note:        EST_NUM_ENTRIES applies only when the number of entries is less
+ *              than the MAX_COMPACT # of entries (from H5Pset_link_phase_change).
+ *
+ * Note:        Come up with better name & description? -QAK
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September  6, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_est_link_info(hid_t plist_id, unsigned est_num_entries, unsigned est_name_len)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    H5O_ginfo_t ginfo;                  /* Group information structure */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, est_num_entries, est_name_len);
+
+    /* Range check values */
+    if(est_num_entries > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "est. number of entries must be < 65536")
+    if(est_name_len > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "est. name length must be < 65536")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get group info */
+    if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+    /* Update fields */
+    if(est_num_entries != H5G_CRT_GINFO_EST_NUM_ENTRIES || est_name_len != H5G_CRT_GINFO_EST_NAME_LEN)
+        ginfo.store_est_entry_info = TRUE;
+    else
+        ginfo.store_est_entry_info = FALSE;
+    ginfo.est_num_entries = (uint16_t)est_num_entries;
+    ginfo.est_name_len = (uint16_t)est_name_len;
+
+    /* Set group info */
+    if(H5P_set(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_est_link_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_est_link_info
+ *
+ * Purpose:     Returns the est. # of links in a group & the est. length of
+ *              the name of each link.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September  6, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_est_link_info(hid_t plist_id, unsigned *est_num_entries /*out*/, unsigned *est_name_len /*out*/)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", plist_id, est_num_entries, est_name_len);
+
+    /* Get values */
+    if(est_num_entries || est_name_len) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        H5O_ginfo_t ginfo;          /* Group information structure */
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get group info */
+        if(H5P_get(plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get group info")
+
+        if(est_num_entries)
+            *est_num_entries = ginfo.est_num_entries;
+        if(est_name_len)
+            *est_name_len = ginfo.est_name_len;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_est_link_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_link_creation_order
+ *
+ * Purpose:     Set the flags for creation order of links in a group
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 12, 2006
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_link_creation_order(hid_t plist_id, unsigned crt_order_flags)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    H5O_linfo_t linfo;                  /* Link information structure */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, crt_order_flags);
+
+        /* Check for bad combination of flags */
+    if(!(crt_order_flags & H5P_CRT_ORDER_TRACKED) && (crt_order_flags & H5P_CRT_ORDER_INDEXED))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tracking creation order is required for index")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get link info */
+    if(H5P_get(plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get link info")
+
+    /* Update fields */
+    linfo.track_corder = (hbool_t)((crt_order_flags & H5P_CRT_ORDER_TRACKED) ? TRUE : FALSE);
+    linfo.index_corder = (hbool_t)((crt_order_flags & H5P_CRT_ORDER_INDEXED) ? TRUE : FALSE);
+
+    /* Set link info */
+    if(H5P_set(plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_link_creation_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_link_creation_order
+ *
+ * Purpose:     Returns the flag indicating that creation order is tracked
+ *              for links in a group.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 12, 2006
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_link_creation_order(hid_t plist_id, unsigned *crt_order_flags /*out*/)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, crt_order_flags);
+
+    /* Get values */
+    if(crt_order_flags) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        H5O_linfo_t linfo;          /* Link information structure */
+
+        /* Reset the value to return */
+        *crt_order_flags = 0;
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get link info */
+        if(H5P_get(plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get link info")
+
+        *crt_order_flags |= linfo.track_corder ? H5P_CRT_ORDER_TRACKED : 0;
+        *crt_order_flags |= linfo.index_corder ? H5P_CRT_ORDER_INDEXED : 0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_link_creation_order() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pint.c b/gatb-core/thirdparty/hdf5/src/H5Pint.c
new file mode 100644
index 0000000..abd204e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pint.c
@@ -0,0 +1,4935 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:	Generic Property Functions
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5P_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for checking for duplicate class names in parent class */
+typedef struct {
+    const H5P_genclass_t *parent;       /* Pointer to parent class */
+    const char *name;                   /* Pointer to name to check */
+    H5P_genclass_t *new_class;          /* Pointer to class during path traversal */
+} H5P_check_class_t;
+
+/* Typedef for property list iterator callback */
+typedef struct {
+    H5P_iterate_int_t cb_func;  /* Iterator callback */
+    void *udata;                /* Iterator callback pointer */
+    const H5P_genplist_t *plist;      /* Property list pointer */
+    H5SL_t *seen;               /* Skip list to hold names of properties already seen */
+    int *curr_idx_ptr;          /* Pointer to current iteration index */
+    int prev_idx;               /* Previous iteration index */
+} H5P_iter_plist_ud_t;
+
+/* Typedef for property list class iterator callback */
+typedef struct {
+    H5P_iterate_int_t cb_func;  /* Iterator callback */
+    void *udata;                /* Iterator callback pointer */
+    int *curr_idx_ptr;          /* Pointer to current iteration index */
+    int prev_idx;               /* Previous iteration index */
+} H5P_iter_pclass_ud_t;
+
+/* Typedef for property list comparison callback */
+typedef struct {
+    const H5P_genplist_t *plist2;       /* Pointer to second property list */
+    int cmp_value;              /* Value from property comparison */
+} H5P_plist_cmp_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* General helper routines */
+static H5P_genprop_t *H5P_dup_prop(H5P_genprop_t *oprop, H5P_prop_within_t type);
+static herr_t H5P_free_prop(H5P_genprop_t *prop);
+static int H5P_cmp_prop(const H5P_genprop_t *prop1, const H5P_genprop_t *prop2);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/*
+ * Predefined property list classes. These are initialized at runtime by
+ * H5P_init_interface() in this source file.
+ */
+hid_t H5P_CLS_ROOT_ID_g                         = FAIL;
+H5P_genclass_t *H5P_CLS_ROOT_g                  = NULL;
+hid_t H5P_CLS_OBJECT_CREATE_ID_g                = FAIL;
+H5P_genclass_t *H5P_CLS_OBJECT_CREATE_g         = NULL;
+hid_t H5P_CLS_FILE_CREATE_ID_g                  = FAIL;
+H5P_genclass_t *H5P_CLS_FILE_CREATE_g           = NULL;
+hid_t H5P_CLS_FILE_ACCESS_ID_g                  = FAIL;
+H5P_genclass_t *H5P_CLS_FILE_ACCESS_g           = NULL;
+hid_t H5P_CLS_DATASET_CREATE_ID_g               = FAIL;
+H5P_genclass_t *H5P_CLS_DATASET_CREATE_g        = NULL;
+hid_t H5P_CLS_DATASET_ACCESS_ID_g               = FAIL;
+H5P_genclass_t *H5P_CLS_DATASET_ACCESS_g        = NULL;
+hid_t H5P_CLS_DATASET_XFER_ID_g                 = FAIL;
+H5P_genclass_t *H5P_CLS_DATASET_XFER_g          = NULL;
+hid_t H5P_CLS_FILE_MOUNT_ID_g                   = FAIL;
+H5P_genclass_t *H5P_CLS_FILE_MOUNT_g            = NULL;
+hid_t H5P_CLS_GROUP_CREATE_ID_g                 = FAIL;
+H5P_genclass_t *H5P_CLS_GROUP_CREATE_g          = NULL;
+hid_t H5P_CLS_GROUP_ACCESS_ID_g                 = FAIL;
+H5P_genclass_t *H5P_CLS_GROUP_ACCESS_g          = NULL;
+hid_t H5P_CLS_DATATYPE_CREATE_ID_g              = FAIL;
+H5P_genclass_t *H5P_CLS_DATATYPE_CREATE_g       = NULL;
+hid_t H5P_CLS_DATATYPE_ACCESS_ID_g              = FAIL;
+H5P_genclass_t *H5P_CLS_DATATYPE_ACCESS_g       = NULL;
+hid_t H5P_CLS_ATTRIBUTE_CREATE_ID_g             = FAIL;
+H5P_genclass_t *H5P_CLS_ATTRIBUTE_CREATE_g      = NULL;
+hid_t H5P_CLS_OBJECT_COPY_ID_g                  = FAIL;
+H5P_genclass_t *H5P_CLS_OBJECT_COPY_g           = NULL;
+hid_t H5P_CLS_LINK_CREATE_ID_g                  = FAIL;
+H5P_genclass_t *H5P_CLS_LINK_CREATE_g           = NULL;
+hid_t H5P_CLS_LINK_ACCESS_ID_g                  = FAIL;
+H5P_genclass_t *H5P_CLS_LINK_ACCESS_g           = NULL;
+hid_t H5P_CLS_STRING_CREATE_ID_g                = FAIL;
+H5P_genclass_t *H5P_CLS_STRING_CREATE_g         = NULL;
+
+/*
+ * Predefined property lists for each predefined class. These are initialized
+ * at runtime by H5P_init_interface() in this source file.
+ */
+hid_t H5P_LST_FILE_CREATE_ID_g          = FAIL;
+hid_t H5P_LST_FILE_ACCESS_ID_g          = FAIL;
+hid_t H5P_LST_DATASET_CREATE_ID_g       = FAIL;
+hid_t H5P_LST_DATASET_ACCESS_ID_g       = FAIL;
+hid_t H5P_LST_DATASET_XFER_ID_g         = FAIL;
+hid_t H5P_LST_FILE_MOUNT_ID_g           = FAIL;
+hid_t H5P_LST_GROUP_CREATE_ID_g         = FAIL;
+hid_t H5P_LST_GROUP_ACCESS_ID_g         = FAIL;
+hid_t H5P_LST_DATATYPE_CREATE_ID_g      = FAIL;
+hid_t H5P_LST_DATATYPE_ACCESS_ID_g      = FAIL;
+hid_t H5P_LST_ATTRIBUTE_CREATE_ID_g     = FAIL;
+hid_t H5P_LST_OBJECT_COPY_ID_g          = FAIL;
+hid_t H5P_LST_LINK_CREATE_ID_g          = FAIL;
+hid_t H5P_LST_LINK_ACCESS_ID_g          = FAIL;
+
+/* Root property list class library initialization object */
+const H5P_libclass_t H5P_CLS_ROOT[1] = {{
+    "root",			/* Class name for debugging     */
+    H5P_TYPE_ROOT,              /* Class type                   */
+
+    NULL,			/* Parent class                 */
+    &H5P_CLS_ROOT_g,		/* Pointer to class             */
+    &H5P_CLS_ROOT_ID_g,		/* Pointer to class ID          */
+    NULL,			/* Pointer to default property list ID */
+    NULL,			/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+/* Group access property list class library initialization object */
+/* (move to proper source code file when used for real) */
+const H5P_libclass_t H5P_CLS_GACC[1] = {{
+    "group access",		/* Class name for debugging     */
+    H5P_TYPE_GROUP_ACCESS,      /* Class type                   */
+
+    &H5P_CLS_LINK_ACCESS_g,	/* Parent class                 */
+    &H5P_CLS_GROUP_ACCESS_g,	/* Pointer to class             */
+    &H5P_CLS_GROUP_ACCESS_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_GROUP_ACCESS_ID_g,	/* Pointer to default property list ID */
+    NULL,			/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+/* Datatype creation property list class library initialization object */
+/* (move to proper source code file when used for real) */
+const H5P_libclass_t H5P_CLS_TCRT[1] = {{
+    "datatype create",		/* Class name for debugging     */
+    H5P_TYPE_DATATYPE_CREATE,   /* Class type                   */
+
+    &H5P_CLS_OBJECT_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_DATATYPE_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_DATATYPE_CREATE_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_DATATYPE_CREATE_ID_g,	/* Pointer to default property list ID */
+    NULL,			/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+/* Datatype access property list class library initialization object */
+/* (move to proper source code file when used for real) */
+const H5P_libclass_t H5P_CLS_TACC[1] = {{
+    "datatype access",		/* Class name for debugging     */
+    H5P_TYPE_DATATYPE_ACCESS,   /* Class type                   */
+
+    &H5P_CLS_LINK_ACCESS_g,	/* Parent class                 */
+    &H5P_CLS_DATATYPE_ACCESS_g,	/* Pointer to class             */
+    &H5P_CLS_DATATYPE_ACCESS_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_DATATYPE_ACCESS_ID_g,	/* Pointer to default property list ID */
+    NULL,			/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/* Library property list classes defined in other code modules */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_OCRT[1];         /* Object creation */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_STRCRT[1];       /* String create */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_LACC[1];         /* Link access */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_GCRT[1];         /* Group create */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_OCPY[1];         /* Object copy */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_FCRT[1];         /* File creation */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_FACC[1];         /* File access */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_DCRT[1];         /* Dataset creation */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_DACC[1];         /* Dataset access */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_DXFR[1];         /* Data transfer */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_FMNT[1];         /* File mount */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_ACRT[1];         /* Attribute creation */
+H5_DLLVAR const H5P_libclass_t H5P_CLS_LCRT[1];         /* Link creation */
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Track the revision count of a class, to make comparisons faster */
+static unsigned H5P_next_rev = 0;
+#define H5P_GET_NEXT_REV        (H5P_next_rev++)
+
+/* List of all property list classes in the library */
+/* (order here is not important, they will be initialized in the proper
+ *      order according to their parent class dependencies)
+ */
+static H5P_libclass_t const * const init_class[] = {
+    H5P_CLS_ROOT,       /* Root */
+    H5P_CLS_OCRT,       /* Object create */
+    H5P_CLS_STRCRT,     /* String create */
+    H5P_CLS_LACC,       /* Link access */
+    H5P_CLS_GCRT,       /* Group create */
+    H5P_CLS_OCPY,       /* Object copy */
+    H5P_CLS_GACC,       /* Group access */
+    H5P_CLS_FCRT,       /* File creation */
+    H5P_CLS_FACC,       /* File access */
+    H5P_CLS_DCRT,       /* Dataset creation */
+    H5P_CLS_DACC,       /* Dataset access */
+    H5P_CLS_DXFR,       /* Data transfer */
+    H5P_CLS_FMNT,       /* File mount */
+    H5P_CLS_TCRT,       /* Datatype creation */
+    H5P_CLS_TACC,       /* Datatype access */
+    H5P_CLS_ACRT,       /* Attribute creation */
+    H5P_CLS_LCRT        /* Link creation */
+};
+
+/* Declare a free list to manage the H5P_genclass_t struct */
+H5FL_DEFINE_STATIC(H5P_genclass_t);
+
+/* Declare a free list to manage the H5P_genprop_t struct */
+H5FL_DEFINE_STATIC(H5P_genprop_t);
+
+/* Declare a free list to manage the H5P_genplist_t struct */
+H5FL_DEFINE_STATIC(H5P_genplist_t);
+
+/* Generic Property Class ID class */
+static const H5I_class_t H5I_GENPROPCLS_CLS[1] = {{
+    H5I_GENPROP_CLS,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5P_close_class	/* Callback routine for closing objects of this class */
+}};
+
+/* Generic Property List ID class */
+static const H5I_class_t H5I_GENPROPLST_CLS[1] = {{
+    H5I_GENPROP_LST,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    (H5I_free_t)H5P_close	/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_do_prop_cb1
+ PURPOSE
+    Internal routine to call a property list callback routine and update
+    the property list accordingly.
+ USAGE
+    herr_t H5P_do_prop_cb1(slist,prop,cb)
+        H5SL_t *slist;          IN/OUT: Skip list to hold changed properties
+        H5P_genprop_t *prop;    IN: Property to call callback for
+        H5P_prp_cb1_t *cb;      IN: Callback routine to call
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Calls the callback routine passed in.  If the callback routine changes
+    the property value, then the property is duplicated and added to skip list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P_do_prop_cb1(H5SL_t *slist, H5P_genprop_t *prop, H5P_prp_cb1_t cb)
+{
+    void *tmp_value=NULL;       /* Temporary value buffer */
+    H5P_genprop_t *pcopy=NULL;  /* Copy of property to insert into skip list */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate space for a temporary copy of the property value */
+    if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for temporary property value")
+    HDmemcpy(tmp_value,prop->value,prop->size);
+
+    /* Call "type 1" callback ('create', 'copy' or 'close') */
+    if(cb(prop->name,prop->size,tmp_value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Property callback failed")
+
+    /* Check if the property value changed */
+    if((prop->cmp)(tmp_value,prop->value,prop->size)) {
+        /* Make a copy of the class's property */
+        if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
+
+        /* Copy the changed value into the new property */
+        HDmemcpy(pcopy->value,tmp_value,prop->size);
+
+        /* Insert the changed property into the property list */
+        if(H5P_add_prop(slist,pcopy) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into skip list")
+    } /* end if */
+
+done:
+    /* Release the temporary value buffer */
+    if(tmp_value!=NULL)
+        H5MM_xfree(tmp_value);
+
+    /* Cleanup on failure */
+    if(ret_value<0) {
+        if(pcopy!=NULL)
+            H5P_free_prop(pcopy);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_do_prop_cb1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_init
+ *
+ * Purpose:	Initialize the interface from some other layer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, March 4, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_init() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5P_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5P_init_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+--------------------------------------------------------------------------*/
+static herr_t
+H5P_init_interface(void)
+{
+    size_t tot_init;                    /* Total # of classes initialized */
+    size_t pass_init;                   /* # of classes initialized in each pass */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Initialize the Generic Property class & object groups.
+     */
+    if(H5I_register_type(H5I_GENPROPCLS_CLS) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group")
+    if(H5I_register_type(H5I_GENPROPLST_CLS) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group")
+
+    /* Repeatedly pass over the list of property list classes for the library,
+     *  initializing each class if it's parent class is initialized, until no
+     *  more progress is made.
+     */
+    tot_init = 0;
+    do {
+        size_t u;                           /* Local index variable */
+
+        /* Reset pass initialization counter */
+        pass_init = 0;
+
+        /* Make a pass over all the library's property list classes */
+        for(u = 0; u < NELMTS(init_class); u++) {
+            H5P_libclass_t const *lib_class = init_class[u]; /* Current class to operate on */
+
+            /* Check if the current class hasn't been initialized and can be now */
+            HDassert(lib_class->class_id);
+            if(*lib_class->class_id == (-1) && (lib_class->par_pclass == NULL
+                        || *lib_class->par_pclass != NULL)) {
+                /* Sanity check - only the root class is not allowed to have a parent class */
+                HDassert(lib_class->par_pclass || lib_class == H5P_CLS_ROOT);
+
+                /* Allocate the new class */
+                if(NULL == (*lib_class->pclass = H5P_create_class(lib_class->par_pclass ? *lib_class->par_pclass : NULL, lib_class->name, lib_class->type, lib_class->create_func, lib_class->create_data, lib_class->copy_func, lib_class->copy_data, lib_class->close_func, lib_class->close_data)))
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed")
+
+                /* Call routine to register properties for class */
+                if(lib_class->reg_prop_func && (*lib_class->reg_prop_func)(*lib_class->pclass) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register properties")
+
+                /* Register the new class */
+                if((*lib_class->class_id = H5I_register(H5I_GENPROP_CLS, *lib_class->pclass, FALSE)) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class")
+
+                /* Only register the default property list if it hasn't been created yet */
+                if(lib_class->def_plist_id && *lib_class->def_plist_id == (-1)) {
+                    /* Register the default property list for the new class*/
+                    if((*lib_class->def_plist_id = H5P_create_id(*lib_class->pclass, FALSE)) < 0)
+                         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register default property list for class")
+                } /* end if */
+
+                /* Increment class initialization counters */
+                pass_init++;
+                tot_init++;
+            } /* end if */
+        } /* end for */
+    } while(pass_init > 0);
+
+    /* Verify that all classes were initialized */
+    HDassert(tot_init == NELMTS(init_class));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_init_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_term_interface
+ PURPOSE
+    Terminate various H5P objects
+ USAGE
+    void H5P_term_interface()
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Release the atom group and any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5P_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        int	nlist, nclass;
+
+        /* Destroy HDF5 library property classes & lists */
+
+        /* Check if there are any open property list classes or lists */
+        nclass = H5I_nmembers(H5I_GENPROP_CLS);
+        nlist = H5I_nmembers(H5I_GENPROP_LST);
+
+        /* If there are any open classes or groups, attempt to get rid of them. */
+        if((nclass + nlist) > 0) {
+            /* Clear the lists */
+            if(nlist > 0) {
+                (void)H5I_clear_type(H5I_GENPROP_LST, FALSE, FALSE);
+
+                /* Reset the default property lists, if they've been closed */
+                if(H5I_nmembers(H5I_GENPROP_LST) == 0) {
+                    H5P_LST_FILE_CREATE_ID_g =
+                        H5P_LST_FILE_ACCESS_ID_g =
+                        H5P_LST_DATASET_CREATE_ID_g =
+                        H5P_LST_DATASET_ACCESS_ID_g =
+                        H5P_LST_DATASET_XFER_ID_g =
+                        H5P_LST_GROUP_CREATE_ID_g =
+                        H5P_LST_GROUP_ACCESS_ID_g =
+                        H5P_LST_DATATYPE_CREATE_ID_g =
+                        H5P_LST_DATATYPE_ACCESS_ID_g =
+                        H5P_LST_ATTRIBUTE_CREATE_ID_g =
+                        H5P_LST_OBJECT_COPY_ID_g =
+                        H5P_LST_LINK_CREATE_ID_g =
+                        H5P_LST_LINK_ACCESS_ID_g =
+                        H5P_LST_FILE_MOUNT_ID_g = (-1);
+                } /* end if */
+            } /* end if */
+
+            /* Only attempt to close the classes after all the lists are closed */
+            if(nlist == 0 && nclass > 0) {
+                (void)H5I_clear_type(H5I_GENPROP_CLS, FALSE, FALSE);
+
+                /* Reset the default property lists, if they've been closed */
+                if(H5I_nmembers(H5I_GENPROP_CLS) == 0) {
+                        H5P_CLS_ROOT_g =
+                        H5P_CLS_OBJECT_CREATE_g =
+                        H5P_CLS_FILE_CREATE_g =
+                        H5P_CLS_FILE_ACCESS_g =
+                        H5P_CLS_DATASET_CREATE_g =
+                        H5P_CLS_DATASET_ACCESS_g =
+                        H5P_CLS_DATASET_XFER_g =
+                        H5P_CLS_GROUP_CREATE_g =
+                        H5P_CLS_GROUP_ACCESS_g =
+                        H5P_CLS_DATATYPE_CREATE_g =
+                        H5P_CLS_DATATYPE_ACCESS_g =
+                        H5P_CLS_STRING_CREATE_g =
+                        H5P_CLS_ATTRIBUTE_CREATE_g =
+                        H5P_CLS_OBJECT_COPY_g =
+                        H5P_CLS_LINK_CREATE_g =
+                        H5P_CLS_LINK_ACCESS_g =
+                        H5P_CLS_FILE_MOUNT_g = NULL;
+
+                        H5P_CLS_ROOT_ID_g =
+                        H5P_CLS_OBJECT_CREATE_ID_g =
+                        H5P_CLS_FILE_CREATE_ID_g =
+                        H5P_CLS_FILE_ACCESS_ID_g =
+                        H5P_CLS_DATASET_CREATE_ID_g =
+                        H5P_CLS_DATASET_ACCESS_ID_g =
+                        H5P_CLS_DATASET_XFER_ID_g =
+                        H5P_CLS_GROUP_CREATE_ID_g =
+                        H5P_CLS_GROUP_ACCESS_ID_g =
+                        H5P_CLS_DATATYPE_CREATE_ID_g =
+                        H5P_CLS_DATATYPE_ACCESS_ID_g =
+                        H5P_CLS_STRING_CREATE_ID_g =
+                        H5P_CLS_ATTRIBUTE_CREATE_ID_g =
+                        H5P_CLS_OBJECT_COPY_ID_g =
+                        H5P_CLS_LINK_CREATE_ID_g =
+                        H5P_CLS_LINK_ACCESS_ID_g =
+                        H5P_CLS_FILE_MOUNT_ID_g = (-1);
+                } /* end if */
+            } /* end if */
+
+            n++; /*H5I*/
+        } else {
+            /* Close public interface */
+            n += H5P__term_pub_interface();
+
+            /* Close deprecated interface */
+            n += H5P__term_deprec_interface();
+
+            /* Destroy the property list and class id groups */
+            (void)H5I_dec_type_ref(H5I_GENPROP_LST);
+            n++; /*H5I*/
+            (void)H5I_dec_type_ref(H5I_GENPROP_CLS);
+            n++; /*H5I*/
+
+            /* Mark closed */
+            H5_interface_initialize_g = 0;
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5P_term_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_copy_pclass
+ PURPOSE
+    Internal routine to copy a generic property class
+ USAGE
+    hid_t H5P_copy_pclass(pclass)
+        H5P_genclass_t *pclass;      IN: Property class to copy
+ RETURNS
+    Success: valid property class ID on success (non-negative)
+    Failure: negative
+ DESCRIPTION
+    Copy a property class and return the ID.  This routine does not make
+    any callbacks.  (They are only make when operating on property lists).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genclass_t *
+H5P_copy_pclass(H5P_genclass_t *pclass)
+{
+    H5P_genclass_t *new_pclass = NULL;  /* Property list class copied */
+    H5P_genprop_t *pcopy;               /* Copy of property to insert into class */
+    H5P_genclass_t *ret_value=NULL;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+
+    /*
+     * Create new property class object
+     */
+
+    /* Create the new property list class */
+    if(NULL == (new_pclass = H5P_create_class(pclass->parent, pclass->name, pclass->type, pclass->create_func, pclass->create_data, pclass->copy_func, pclass->copy_data, pclass->close_func, pclass->close_data)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, NULL, "unable to create property list class")
+
+    /* Copy the properties registered for this class */
+    if(pclass->nprops > 0) {
+        H5SL_node_t *curr_node;   /* Current node in skip list */
+
+        /* Walk through the properties in the old class */
+        curr_node=H5SL_first(pclass->props);
+        while(curr_node!=NULL) {
+            /* Make a copy of the class's property */
+            if(NULL == (pcopy = H5P_dup_prop((H5P_genprop_t *)H5SL_item(curr_node), H5P_PROP_WITHIN_CLASS)))
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, NULL,"Can't copy property")
+
+            /* Insert the initialized property into the property list */
+            if(H5P_add_prop(new_pclass->props,pcopy) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, NULL,"Can't insert property into class")
+
+            /* Increment property count for class */
+            new_pclass->nprops++;
+
+            /* Get the next property node in the list */
+            curr_node=H5SL_next(curr_node);
+        } /* end while */
+    } /* end if */
+
+    /* Set the return value */
+    ret_value=new_pclass;
+
+done:
+    if(ret_value==NULL && new_pclass)
+        H5P_close_class(new_pclass);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_copy_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_copy_plist
+ PURPOSE
+    Internal routine to copy a generic property list
+ USAGE
+        hid_t H5P_copy_plist(old_plist_id)
+            hid_t old_plist_id;             IN: Property list ID to copy
+ RETURNS
+    Success: valid property list ID on success (non-negative)
+    Failure: negative
+ DESCRIPTION
+    Copy a property list and return the ID.  This routine calls the
+    class 'copy' callback after any property 'copy' callbacks are called
+    (assuming all property 'copy' callbacks return successfully).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5P_copy_plist(const H5P_genplist_t *old_plist, hbool_t app_ref)
+{
+    H5P_genclass_t *tclass;     /* Temporary class pointer */
+    H5P_genplist_t *new_plist=NULL;  /* New property list generated from copy */
+    H5P_genprop_t *tmp;         /* Temporary pointer to properties */
+    H5P_genprop_t *new_prop;    /* New property created for copy */
+    hid_t new_plist_id;         /* Property list ID of new list created */
+    H5SL_node_t *curr_node;     /* Current node in skip list */
+    H5SL_t *seen=NULL;          /* Skip list containing properties already seen */
+    size_t nseen;               /* Number of items 'seen' */
+    hbool_t has_parent_class;   /* Flag to indicate that this property list's class has a parent */
+    hid_t ret_value=FAIL;       /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(old_plist);
+
+    /*
+     * Create new property list object
+     */
+
+    /* Allocate room for the property list */
+    if(NULL==(new_plist = H5FL_CALLOC(H5P_genplist_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,"memory allocation failed")
+
+    /* Set class state */
+    new_plist->pclass = old_plist->pclass;
+    new_plist->nprops = 0;      /* Initially the plist has the same number of properties as the class */
+    new_plist->class_init = FALSE;  /* Initially, wait until the class callback finishes to set */
+
+    /* Initialize the skip list to hold the changed properties */
+    if((new_plist->props = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,FAIL,"can't create skip list for changed properties")
+
+    /* Create the skip list for deleted properties */
+    if((new_plist->del = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,FAIL,"can't create skip list for deleted properties")
+
+    /* Create the skip list to hold names of properties already seen
+     * (This prevents a property in the class hierarchy from having it's
+     * 'create' callback called, if a property in the class hierarchy has
+     * already been seen)
+     */
+    if((seen = H5SL_create(H5SL_TYPE_STR, NULL))== NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,FAIL,"can't create skip list for seen properties")
+    nseen = 0;
+
+    /* Cycle through the deleted properties & copy them into the new list's deleted section */
+    if(H5SL_count(old_plist->del)>0) {
+        curr_node=H5SL_first(old_plist->del);
+        while(curr_node) {
+            char *new_name;   /* Pointer to new name */
+
+            /* Duplicate string for insertion into new deleted property skip list */
+            if((new_name=H5MM_xstrdup((char *)H5SL_item(curr_node))) == NULL)
+                HGOTO_ERROR(H5E_RESOURCE,H5E_NOSPACE,FAIL,"memory allocation failed")
+
+            /* Insert property name into deleted list */
+            if(H5SL_insert(new_plist->del,new_name,new_name) < 0)
+                HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into deleted skip list")
+
+            /* Add property name to "seen" list */
+            if(H5SL_insert(seen,new_name,new_name) < 0)
+                HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into seen skip list")
+            nseen++;
+
+            /* Get the next property node in the skip list */
+            curr_node=H5SL_next(curr_node);
+        } /* end while */
+    } /* end if */
+
+    /* Cycle through the properties and copy them also */
+    if(H5SL_count(old_plist->props)>0) {
+        curr_node=H5SL_first(old_plist->props);
+        while(curr_node) {
+            /* Get a pointer to the node's property */
+            tmp = (H5P_genprop_t *)H5SL_item(curr_node);
+
+            /* Make a copy of the list's property */
+            if(NULL == (new_prop = H5P_dup_prop(tmp, H5P_PROP_WITHIN_LIST)))
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
+
+            /* Call property copy callback, if it exists */
+            if(new_prop->copy) {
+                if((new_prop->copy)(new_prop->name,new_prop->size,new_prop->value) < 0) {
+                    H5P_free_prop(new_prop);
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
+                } /* end if */
+            } /* end if */
+
+            /* Insert the initialized property into the property list */
+            if(H5P_add_prop(new_plist->props,new_prop) < 0) {
+                H5P_free_prop(new_prop);
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into list")
+            } /* end if */
+
+            /* Add property name to "seen" list */
+            if(H5SL_insert(seen,new_prop->name,new_prop->name) < 0)
+                HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into seen skip list")
+            nseen++;
+
+            /* Increment the number of properties in list */
+            new_plist->nprops++;
+
+            /* Get the next property node in the skip list */
+            curr_node=H5SL_next(curr_node);
+        } /* end while */
+    } /* end if */
+
+    /*
+     * Check for copying class properties (up through list of parent classes also),
+     * initialize each with default value & make property 'copy' callback.
+     */
+    tclass=old_plist->pclass;
+    has_parent_class = (hbool_t)(tclass != NULL && tclass->parent != NULL && tclass->parent->nprops > 0);
+    while(tclass!=NULL) {
+        if(tclass->nprops>0) {
+            /* Walk through the properties in the old class */
+            curr_node=H5SL_first(tclass->props);
+            while(curr_node!=NULL) {
+                /* Get pointer to property from node */
+                tmp = (H5P_genprop_t *)H5SL_item(curr_node);
+
+                /* Only "copy" properties we haven't seen before */
+                if(nseen==0 || H5SL_search(seen,tmp->name) == NULL) {
+                    /* Call property creation callback, if it exists */
+                    if(tmp->copy) {
+                        /* Call the callback & insert changed value into skip list (if necessary) */
+                        if(H5P_do_prop_cb1(new_plist->props,tmp,tmp->copy) < 0)
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't create property")
+                    } /* end if */
+
+                    /* Add property name to "seen" list, if we have other classes to work on */
+                    if(has_parent_class) {
+                        if(H5SL_insert(seen,tmp->name,tmp->name) < 0)
+                            HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into seen skip list")
+                        nseen++;
+                    } /* end if */
+
+                    /* Increment the number of properties in list */
+                    new_plist->nprops++;
+                } /* end if */
+
+                /* Get the next property node in the skip list */
+                curr_node=H5SL_next(curr_node);
+            } /* end while */
+        } /* end if */
+
+        /* Go up to parent class */
+        tclass=tclass->parent;
+    } /* end while */
+
+    /* Increment the number of property lists derived from class */
+    if(H5P_access_class(new_plist->pclass, H5P_MOD_INC_LST) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "Can't increment class ref count")
+
+    /* Get an atom for the property list */
+    if((new_plist_id = H5I_register(H5I_GENPROP_LST, new_plist, app_ref)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list")
+
+    /* Save the property list ID in the property list struct, for use in the property class's 'close' callback */
+    new_plist->plist_id=new_plist_id;
+
+    /* Call the class callback (if it exists) now that we have the property list ID
+     * (up through chain of parent classes also)
+     */
+    tclass = new_plist->pclass;
+    while(NULL != tclass) {
+        if(NULL != tclass->copy_func) {
+            if((tclass->copy_func)(new_plist_id, old_plist->plist_id, old_plist->pclass->copy_data) < 0) {
+                /* Delete ID, ignore return value */
+                H5I_remove(new_plist_id);
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Can't initialize property")
+            } /* end if */
+        } /* end if */
+
+        /* Go up to parent class */
+        tclass = tclass->parent;
+    } /* end while */
+
+    /* Set the class initialization flag */
+    new_plist->class_init = TRUE;
+
+    /* Set the return value */
+    ret_value=new_plist_id;
+
+done:
+    /* Release the list of 'seen' properties */
+    if(seen!=NULL)
+        H5SL_close(seen);
+
+    if(ret_value<0 && new_plist)
+        H5P_close(new_plist);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_copy_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_dup_prop
+ PURPOSE
+    Internal routine to duplicate a property
+ USAGE
+    H5P_genprop_t *H5P_dup_prop(oprop)
+        H5P_genprop_t *oprop;   IN: Pointer to property to copy
+        H5P_prop_within_t type; IN: Type of object the property will be inserted into
+ RETURNS
+    Returns a pointer to the newly created duplicate of a property on success,
+        NULL on failure.
+ DESCRIPTION
+    Allocates memory and copies property information into a new property object.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5P_genprop_t *
+H5P_dup_prop(H5P_genprop_t *oprop, H5P_prop_within_t type)
+{
+    H5P_genprop_t *prop = NULL;      /* Pointer to new property copied */
+    H5P_genprop_t *ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(oprop);
+    HDassert(type != H5P_PROP_WITHIN_UNKNOWN);
+
+    /* Allocate the new property */
+    if(NULL == (prop = H5FL_MALLOC(H5P_genprop_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy basic property information */
+    HDmemcpy(prop, oprop, sizeof(H5P_genprop_t));
+
+    /* Check if we should duplicate the name or share it */
+
+    /* Duplicating property for a class */
+    if(type == H5P_PROP_WITHIN_CLASS) {
+        HDassert(oprop->type == H5P_PROP_WITHIN_CLASS);
+        HDassert(oprop->shared_name == FALSE);
+
+        /* Duplicate name */
+        prop->name = H5MM_xstrdup(oprop->name);
+    } /* end if */
+    /* Duplicating property for a list */
+    else {
+        /* Check if we are duplicating a property from a list or a class */
+
+        /* Duplicating a property from a list */
+        if(oprop->type == H5P_PROP_WITHIN_LIST) {
+            /* If the old property's name wasn't shared, we have to copy it here also */
+            if(!oprop->shared_name)
+                prop->name = H5MM_xstrdup(oprop->name);
+        } /* end if */
+        /* Duplicating a property from a class */
+        else {
+            HDassert(oprop->type == H5P_PROP_WITHIN_CLASS);
+            HDassert(oprop->shared_name == FALSE);
+
+            /* Share the name */
+            prop->shared_name = TRUE;
+
+            /* Set the type */
+            prop->type = type;
+        } /* end else */
+    } /* end else */
+
+    /* Duplicate current value, if it exists */
+    if(oprop->value != NULL) {
+        HDassert(prop->size > 0);
+        if(NULL == (prop->value = H5MM_malloc(prop->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HDmemcpy(prop->value, oprop->value, prop->size);
+    } /* end if */
+
+    /* Set return value */
+    ret_value = prop;
+
+done:
+    /* Free any resources allocated */
+    if(ret_value == NULL) {
+        if(prop != NULL) {
+            if(prop->name != NULL)
+                H5MM_xfree(prop->name);
+            if(prop->value != NULL)
+                H5MM_xfree(prop->value);
+            prop = H5FL_FREE(H5P_genprop_t, prop);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_dup_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_create_prop
+ PURPOSE
+    Internal routine to create a new property
+ USAGE
+    H5P_genprop_t *H5P_create_prop(name,size,type,value,prp_create,prp_set,
+            prp_get,prp_delete,prp_close)
+        const char *name;       IN: Name of property to register
+        size_t size;            IN: Size of property in bytes
+        H5P_prop_within_t type; IN: Type of object the property will be inserted into
+        void *value;            IN: Pointer to buffer containing value for property
+        H5P_prp_create_func_t prp_create;   IN: Function pointer to property
+                                    creation callback
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns a pointer to the newly created property on success,
+        NULL on failure.
+ DESCRIPTION
+    Allocates memory and copies property information into a new property object.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5P_genprop_t *
+H5P_create_prop(const char *name, size_t size, H5P_prop_within_t type,
+    const void *value,
+    H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close)
+{
+    H5P_genprop_t *prop = NULL;        /* Pointer to new property copied */
+    H5P_genprop_t *ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(name);
+    HDassert((size > 0 && value != NULL) || (size == 0));
+    HDassert(type != H5P_PROP_WITHIN_UNKNOWN);
+
+    /* Allocate the new property */
+    if(NULL == (prop = H5FL_MALLOC(H5P_genprop_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the property initial values */
+    prop->name = H5MM_xstrdup(name); /* Duplicate name */
+    prop->shared_name = FALSE;
+    prop->size = size;
+    prop->type = type;
+
+    /* Duplicate value, if it exists */
+    if(value != NULL) {
+        if(NULL == (prop->value = H5MM_malloc (prop->size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HDmemcpy(prop->value, value, prop->size);
+    } /* end if */
+    else
+        prop->value = NULL;
+
+    /* Set the function pointers */
+    prop->create = prp_create;
+    prop->set = prp_set;
+    prop->get = prp_get;
+    prop->del = prp_delete;
+    prop->copy = prp_copy;
+    /* Use custom comparison routine if available, otherwise default to memcmp() */
+    if(prp_cmp != NULL)
+        prop->cmp = prp_cmp;
+    else
+        prop->cmp = &memcmp;
+    prop->close = prp_close;
+
+    /* Set return value */
+    ret_value = prop;
+
+done:
+    /* Free any resources allocated */
+    if(ret_value == NULL) {
+        if(prop != NULL) {
+            if(prop->name != NULL)
+                H5MM_xfree(prop->name);
+            if(prop->value != NULL)
+                H5MM_xfree(prop->value);
+            prop = H5FL_FREE(H5P_genprop_t, prop);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_create_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_add_prop
+ PURPOSE
+    Internal routine to insert a property into a property skip list
+ USAGE
+    herr_t H5P_add_prop(slist, prop)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list of properties
+        H5P_genprop_t *prop;    IN: Pointer to property to insert
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Inserts a property into a skip list of properties.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_add_prop(H5SL_t *slist, H5P_genprop_t *prop)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(slist);
+    HDassert(prop);
+    HDassert(prop->type != H5P_PROP_WITHIN_UNKNOWN);
+
+    /* Insert property into skip list */
+    if(H5SL_insert(slist, prop, prop->name) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into skip list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5P_add_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__find_prop_plist
+ PURPOSE
+    Internal routine to check for a property in a property list's skip list
+ USAGE
+    H5P_genprop_t *H5P_find_prop(plist, name)
+        const H5P_genplist_t *plist;  IN: Pointer to property list to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Returns pointer to property on success, NULL on failure.
+ DESCRIPTION
+    Checks for a property in a property list's skip list of properties.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genprop_t *
+H5P__find_prop_plist(const H5P_genplist_t *plist, const char *name)
+{
+    H5P_genprop_t *ret_value;   /* Property pointer return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Check if the property has been deleted from list */
+    if(H5SL_search(plist->del,name) != NULL) {
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, NULL, "can't find property in skip list")
+    } /* end if */
+    else {
+        /* Get the property data from the skip list */
+        if(NULL == (ret_value = (H5P_genprop_t *)H5SL_search(plist->props, name))) {
+            H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+            /* Couldn't find property in list itself, start searching through class info */
+            tclass = plist->pclass;
+            while(tclass != NULL) {
+                /* Find the property in the class */
+                if(NULL != (ret_value = (H5P_genprop_t *)H5SL_search(tclass->props, name)))
+                    /* Got pointer to property - leave now */
+                    break;
+
+                /* Go up to parent class */
+                tclass = tclass->parent;
+            } /* end while */
+
+            /* Check if we haven't found the property */
+            if(ret_value == NULL)
+                HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,NULL,"can't find property in skip list")
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P__find_prop_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_find_prop_pclass
+ PURPOSE
+    Internal routine to check for a property in a class skip list
+ USAGE
+    H5P_genprop_t *H5P_find_prop_class(pclass, name)
+        H5P_genclass *pclass;   IN: Pointer generic property class to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Returns pointer to property on success, NULL on failure.
+ DESCRIPTION
+    Checks for a property in a class's skip list of properties.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5P_genprop_t *
+H5P_find_prop_pclass(H5P_genclass_t *pclass, const char *name)
+{
+    H5P_genprop_t *ret_value;   /* Property pointer return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+    HDassert(name);
+
+    /* Get the property from the skip list */
+    if(NULL == (ret_value = (H5P_genprop_t *)H5SL_search(pclass->props, name)))
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,NULL,"can't find property in skip list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_find_prop_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_free_prop
+ PURPOSE
+    Internal routine to destroy a property node
+ USAGE
+    herr_t H5P_free_prop(prop)
+        H5P_genprop_t *prop;    IN: Pointer to property to destroy
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Releases all the memory for a property list.  Does _not_ call the
+    properties 'close' callback, that should already have been done.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P_free_prop(H5P_genprop_t *prop)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(prop);
+
+    /* Release the property value if it exists */
+    if(prop->value)
+        H5MM_xfree(prop->value);
+
+    /* Only free the name if we own it */
+    if(!prop->shared_name)
+        H5MM_xfree(prop->name);
+
+    prop = H5FL_FREE(H5P_genprop_t, prop);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5P_free_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_free_prop_cb
+ PURPOSE
+    Internal routine to properties from a property skip list
+ USAGE
+    herr_t H5P_free_prop_cb(item, key, op_data)
+        void *item;             IN/OUT: Pointer to property
+        void *key;              IN/OUT: Pointer to property key
+        void *_make_cb;         IN: Whether to make property callbacks or not
+ RETURNS
+    Returns zero on success, negative on failure.
+ DESCRIPTION
+        Calls the property 'close' callback for a property & frees property
+    info.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P_free_prop_cb(void *item, void H5_ATTR_UNUSED *key, void *op_data)
+{
+    H5P_genprop_t *tprop=(H5P_genprop_t *)item; /* Temporary pointer to property */
+    hbool_t make_cb = *(hbool_t *)op_data;      /* Whether to make property 'close' callback */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(tprop);
+
+    /* Call the close callback and ignore the return value, there's nothing we can do about it */
+    if(make_cb && tprop->close != NULL)
+        (tprop->close)(tprop->name, tprop->size, tprop->value);
+
+    /* Free the property, ignoring return value, nothing we can do */
+    H5P_free_prop(tprop);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5P_free_prop_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_free_del_name_cb
+ PURPOSE
+    Internal routine to free 'deleted' property name
+ USAGE
+    herr_t H5P_free_del_name_cb(item, key, op_data)
+        void *item;             IN/OUT: Pointer to deleted name
+        void *key;              IN/OUT: Pointer to key
+        void *op_data;          IN: Operator callback data (unused)
+ RETURNS
+    Returns zero on success, negative on failure.
+ DESCRIPTION
+    Frees the deleted property name
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P_free_del_name_cb(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op_data)
+{
+    char *del_name=(char *)item;       /* Temporary pointer to deleted name */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(del_name);
+
+    /* Free the name */
+    H5MM_xfree(del_name);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5P_free_del_name_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_access_class
+ PURPOSE
+    Internal routine to increment or decrement list & class dependancies on a
+        property list class
+ USAGE
+    herr_t H5P_access_class(pclass,mod)
+        H5P_genclass_t *pclass;     IN: Pointer to class to modify
+        H5P_class_mod_t mod;        IN: Type of modification to class
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Increment/Decrement the class or list dependancies for a given class.
+    This routine is the final arbiter on decisions about actually releasing a
+    class in memory, such action is only taken when the reference counts for
+    both dependent classes & lists reach zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_access_class(H5P_genclass_t *pclass, H5P_class_mod_t mod)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pclass);
+    HDassert(mod > H5P_MOD_ERR && mod < H5P_MOD_MAX);
+
+    switch(mod) {
+        case H5P_MOD_INC_CLS:        /* Increment the dependant class count*/
+            pclass->classes++;
+            break;
+
+        case H5P_MOD_DEC_CLS:        /* Decrement the dependant class count*/
+            pclass->classes--;
+            break;
+
+        case H5P_MOD_INC_LST:        /* Increment the dependant list count*/
+            pclass->plists++;
+            break;
+
+        case H5P_MOD_DEC_LST:        /* Decrement the dependant list count*/
+            pclass->plists--;
+            break;
+
+        case H5P_MOD_INC_REF:        /* Increment the ID reference count*/
+            /* Reset the deleted flag if incrementing the reference count */
+            if(pclass->deleted)
+                pclass->deleted = FALSE;
+            pclass->ref_count++;
+            break;
+
+        case H5P_MOD_DEC_REF:        /* Decrement the ID reference count*/
+            pclass->ref_count--;
+
+            /* Mark the class object as deleted if reference count drops to zero */
+            if(pclass->ref_count == 0)
+                pclass->deleted = TRUE;
+            break;
+
+        case H5P_MOD_ERR:
+        case H5P_MOD_MAX:
+        default:
+            HDassert(0 && "Invalid H5P class modification");
+    } /* end switch */
+
+    /* Check if we can release the class information now */
+    if(pclass->deleted && pclass->plists == 0 && pclass->classes == 0) {
+        H5P_genclass_t *par_class = pclass->parent;       /* Pointer to class's parent */
+
+        HDassert(pclass->name);
+        H5MM_xfree(pclass->name);
+
+        /* Free the class properties without making callbacks */
+        if(pclass->props) {
+            hbool_t make_cb = FALSE;
+
+            H5SL_destroy(pclass->props, H5P_free_prop_cb, &make_cb);
+        } /* end if */
+
+        pclass = H5FL_FREE(H5P_genclass_t, pclass);
+
+        /* Reduce the number of dependent classes on parent class also */
+        if(par_class != NULL)
+            H5P_access_class(par_class, H5P_MOD_DEC_CLS);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5P_access_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_open_class_path_cb
+ PURPOSE
+    Internal callback routine to check for duplicated names in parent class.
+ USAGE
+    int H5P_open_class_path_cb(obj, id, key)
+        H5P_genclass_t *obj;    IN: Pointer to class
+        hid_t id;               IN: ID of object being looked at
+        const void *key;        IN: Pointer to information used to compare
+                                    classes.
+ RETURNS
+    Returns >0 on match, 0 on no match and <0 on failure.
+ DESCRIPTION
+    Checks whether a property list class has the same parent and name as a
+    new class being created.  This is a callback routine for H5I_search()
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P_open_class_path_cb(void *_obj, hid_t H5_ATTR_UNUSED id, void *_key)
+{
+    H5P_genclass_t *obj = (H5P_genclass_t *)_obj; /* Pointer to the class for this ID */
+    H5P_check_class_t *key = (H5P_check_class_t *)_key; /* Pointer to key information for comparison */
+    int ret_value = 0;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(obj);
+    HDassert(H5I_GENPROP_CLS == H5I_get_type(id));
+    HDassert(key);
+
+    /* Check if the class object has the same parent as the new class */
+    if(obj->parent == key->parent) {
+        /* Check if they have the same name */
+        if(HDstrcmp(obj->name, key->name) == 0) {
+            key->new_class = obj;
+            ret_value = 1;        /* Indicate a match */
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_open_class_path_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_create_class
+ PURPOSE
+    Internal routine to create a new property list class.
+ USAGE
+    H5P_genclass_t H5P_create_class(par_class, name, type,
+                cls_create, create_data, cls_close, close_data)
+        H5P_genclass_t *par_class;  IN: Pointer to parent class
+        const char *name;       IN: Name of class we are creating
+        H5P_plist_type_t type;  IN: Type of class we are creating
+        H5P_cls_create_func_t;  IN: The callback function to call when each
+                                    property list in this class is created.
+        void *create_data;      IN: Pointer to user data to pass along to class
+                                    creation callback.
+        H5P_cls_copy_func_t;    IN: The callback function to call when each
+                                    property list in this class is copied.
+        void *copy_data;        IN: Pointer to user data to pass along to class
+                                    copy callback.
+        H5P_cls_close_func_t;   IN: The callback function to call when each
+                                    property list in this class is closed.
+        void *close_data;       IN: Pointer to user data to pass along to class
+                                    close callback.
+ RETURNS
+    Returns a pointer to the newly created property list class on success,
+        NULL on failure.
+ DESCRIPTION
+    Allocates memory and attaches a class to the property list class hierarchy.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genclass_t *
+H5P_create_class(H5P_genclass_t *par_class, const char *name, H5P_plist_type_t type,
+    H5P_cls_create_func_t cls_create, void *create_data,
+    H5P_cls_copy_func_t cls_copy, void *copy_data,
+    H5P_cls_close_func_t cls_close, void *close_data)
+{
+    H5P_genclass_t *pclass=NULL;   /* Property list class created */
+    H5P_genclass_t *ret_value;     /* return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(name);
+    /* Allow internal classes to break some rules */
+    /* (This allows the root of the tree to be created with this routine -QAK) */
+    if(type == H5P_TYPE_USER)
+        HDassert(par_class);
+
+    /* Allocate room for the class */
+    if(NULL == (pclass = H5FL_CALLOC(H5P_genclass_t)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, NULL, "propery list class allocation failed")
+
+    /* Set class state */
+    pclass->parent = par_class;
+    if(NULL == (pclass->name = H5MM_xstrdup(name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, NULL, "propery list class name allocation failed")
+    pclass->type = type;
+    pclass->nprops = 0;     /* Classes are created without properties initially */
+    pclass->plists = 0;     /* No properties lists of this class yet */
+    pclass->classes = 0;    /* No classes derived from this class yet */
+    pclass->ref_count = 1;  /* This is the first reference to the new class */
+    pclass->deleted = FALSE;    /* Not deleted yet... :-) */
+    pclass->revision = H5P_GET_NEXT_REV;        /* Get a revision number for the class */
+
+    /* Create the skip list for properties */
+    if(NULL == (pclass->props = H5SL_create(H5SL_TYPE_STR, NULL)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, NULL, "can't create skip list for properties")
+
+    /* Set callback functions and pass-along data */
+    pclass->create_func = cls_create;
+    pclass->create_data = create_data;
+    pclass->copy_func = cls_copy;
+    pclass->copy_data = copy_data;
+    pclass->close_func = cls_close;
+    pclass->close_data = close_data;
+
+    /* Increment parent class's derived class value */
+    if(par_class != NULL) {
+        if(H5P_access_class(par_class, H5P_MOD_INC_CLS) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, NULL, "Can't increment parent class ref count")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = pclass;
+
+done:
+    /* Free any resources allocated */
+    if(ret_value == NULL)
+        if(pclass) {
+            if(pclass->name)
+                H5MM_xfree(pclass->name);
+            if(pclass->props) {
+                hbool_t make_cb = FALSE;
+
+                H5SL_destroy(pclass->props, H5P_free_prop_cb, &make_cb);
+            } /* end if */
+            pclass = H5FL_FREE(H5P_genclass_t, pclass);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_create_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_create
+ PURPOSE
+    Internal routine to create a new property list of a property list class.
+ USAGE
+    H5P_genplist_t *H5P_create(class)
+        H5P_genclass_t *class;  IN: Property list class create list from
+ RETURNS
+    Returns a pointer to the newly created property list on success,
+        NULL on failure.
+ DESCRIPTION
+        Creates a property list of a given class.  If a 'create' callback
+    exists for the property list class, it is called before the
+    property list is passed back to the user.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        If this routine is called from a library routine other than
+    H5P_c, the calling routine is responsible for getting an ID for
+    the property list and calling the class 'create' callback (if one exists)
+    and also setting the "class_init" flag.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5P_genplist_t *
+H5P_create(H5P_genclass_t *pclass)
+{
+    H5P_genclass_t *tclass;         /* Temporary class pointer */
+    H5P_genplist_t *plist=NULL;     /* New property list created */
+    H5P_genprop_t *tmp;             /* Temporary pointer to parent class properties */
+    H5SL_t *seen=NULL;              /* Skip list to hold names of properties already seen */
+    H5P_genplist_t *ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+
+    /*
+     * Create new property list object
+     */
+
+    /* Allocate room for the property list */
+    if(NULL==(plist = H5FL_CALLOC(H5P_genplist_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL,"memory allocation failed")
+
+    /* Set class state */
+    plist->pclass = pclass;
+    plist->nprops = 0;      /* Initially the plist has the same number of properties as the class */
+    plist->class_init = FALSE;  /* Initially, wait until the class callback finishes to set */
+
+    /* Create the skip list for changed properties */
+    if((plist->props = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,NULL,"can't create skip list for changed properties")
+
+    /* Create the skip list for deleted properties */
+    if((plist->del = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,NULL,"can't create skip list for deleted properties")
+
+    /* Create the skip list to hold names of properties already seen
+     * (This prevents a property in the class hierarchy from having it's
+     * 'create' callback called, if a property in the class hierarchy has
+     * already been seen)
+     */
+    if((seen = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,NULL,"can't create skip list for seen properties")
+
+    /*
+     * Check if we should copy class properties (up through list of parent classes also),
+     * initialize each with default value & make property 'create' callback.
+     */
+    tclass=pclass;
+    while(tclass!=NULL) {
+        if(tclass->nprops>0) {
+            H5SL_node_t *curr_node;   /* Current node in skip list */
+
+            /* Walk through the properties in the old class */
+            curr_node=H5SL_first(tclass->props);
+            while(curr_node!=NULL) {
+                /* Get pointer to property from node */
+                tmp = (H5P_genprop_t *)H5SL_item(curr_node);
+
+                /* Only "create" properties we haven't seen before */
+                if(H5SL_search(seen,tmp->name) == NULL) {
+                    /* Call property creation callback, if it exists */
+                    if(tmp->create) {
+                        /* Call the callback & insert changed value into skip list (if necessary) */
+                        if(H5P_do_prop_cb1(plist->props,tmp,tmp->create) < 0)
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, NULL,"Can't create property")
+                    } /* end if */
+
+                    /* Add property name to "seen" list */
+                    if(H5SL_insert(seen,tmp->name,tmp->name) < 0)
+                        HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,NULL,"can't insert property into seen skip list")
+
+                    /* Increment the number of properties in list */
+                    plist->nprops++;
+                } /* end if */
+
+                /* Get the next property node in the skip list */
+                curr_node=H5SL_next(curr_node);
+            } /* end while */
+        } /* end if */
+
+        /* Go up to parent class */
+        tclass=tclass->parent;
+    } /* end while */
+
+    /* Increment the number of property lists derived from class */
+    if(H5P_access_class(plist->pclass,H5P_MOD_INC_LST) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, NULL,"Can't increment class ref count")
+
+    /* Set return value */
+    ret_value=plist;
+
+done:
+    /* Release the skip list of 'seen' properties */
+    if(seen!=NULL)
+        H5SL_close(seen);
+
+    /* Release resources allocated on failure */
+    if(ret_value==NULL) {
+        if(plist!=NULL) {
+            /* Close & free any changed properties */
+            if(plist->props) {
+                unsigned make_cb=1;
+
+                H5SL_destroy(plist->props,H5P_free_prop_cb,&make_cb);
+            } /* end if */
+
+            /* Close the deleted property skip list */
+            if(plist->del)
+                H5SL_close(plist->del);
+
+            /* Release the property list itself */
+            plist = H5FL_FREE(H5P_genplist_t, plist);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_create_id
+ PURPOSE
+    Internal routine to create a new property list of a property list class.
+ USAGE
+    hid_t H5P_create_id(pclass)
+        H5P_genclass_t *pclass;       IN: Property list class create list from
+ RETURNS
+    Returns a valid property list ID on success, FAIL on failure.
+ DESCRIPTION
+        Creates a property list of a given class.  If a 'create' callback
+    exists for the property list class, it is called before the
+    property list is passed back to the user.  If 'create' callbacks exist for
+    any individual properties in the property list, they are called before the
+    class 'create' callback.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5P_create_id(H5P_genclass_t *pclass, hbool_t app_ref)
+{
+    H5P_genclass_t *tclass;         /* Temporary class pointer */
+    H5P_genplist_t *plist = NULL;   /* Property list created */
+    hid_t plist_id = FAIL;      /* Property list ID */
+    hid_t ret_value;            /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pclass);
+
+    /* Create the new property list */
+    if((plist=H5P_create(pclass)) == NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list")
+
+    /* Get an atom for the property list */
+    if((plist_id = H5I_register(H5I_GENPROP_LST, plist, app_ref)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list")
+
+    /* Save the property list ID in the property list struct, for use in the property class's 'close' callback */
+    plist->plist_id=plist_id;
+
+    /* Call the class callback (if it exists) now that we have the property list ID
+     * (up through chain of parent classes also)
+     */
+    tclass = plist->pclass;
+    while(NULL != tclass) {
+        if(NULL != tclass->create_func) {
+            if((tclass->create_func)(plist_id, tclass->create_data) < 0) {
+                /* Delete ID, ignore return value */
+                H5I_remove(plist_id);
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Can't initialize property")
+            } /* end if */
+        } /* end if */
+
+        /* Go up to parent class */
+        tclass = tclass->parent;
+    } /* end while */
+
+    /* Set the class initialization flag */
+    plist->class_init = TRUE;
+
+    /* Set the return value */
+    ret_value=plist_id;
+
+done:
+    if(ret_value<0 && plist)
+        H5P_close(plist);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_create_id() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_register_real
+ PURPOSE
+    Internal routine to register a new property in a property list class.
+ USAGE
+    herr_t H5P_register_real(class, name, size, default, prp_create, prp_set, prp_get, prp_close)
+        H5P_genclass_t *class;  IN: Property list class to modify
+        const char *name;       IN: Name of property to register
+        size_t size;            IN: Size of property in bytes
+        void *def_value;        IN: Pointer to buffer containing default value
+                                    for property in newly created property lists
+        H5P_prp_create_func_t prp_create;   IN: Function pointer to property
+                                    creation callback
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Registers a new property with a property list class.  The property will
+    exist in all property list objects of that class after this routine is
+    finished.  The name of the property must not already exist.  The default
+    property value must be provided and all new property lists created with this
+    property will have the property value set to the default provided.  Any of
+    the callback routines may be set to NULL if they are not needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'default' pointer for a
+    zero-sized property may be set to NULL.  The property 'create' & 'close'
+    callbacks are called for zero-sized properties, but the 'set' and 'get'
+    callbacks are never called.
+
+        The 'create' callback is called when a new property list with this
+    property is being created.  H5P_prp_create_func_t is defined as:
+        typedef herr_t (*H5P_prp_create_func_t)(hid_t prop_id, const char *name,
+                size_t size, void *initial_value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being created.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *initial_value; IN/OUT: The initial value for the property being created.
+                                (The 'default' value passed to H5Pregister2)
+    The 'create' routine may modify the value to be set and those changes will
+    be stored as the initial value of the property.  If the 'create' routine
+    returns a negative value, the new property value is not copied into the
+    property and the property list creation routine returns an error value.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_register_real(H5P_genclass_t *pclass, const char *name, size_t size,
+    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close)
+{
+    H5P_genprop_t *new_prop = NULL;     /* Temporary property pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pclass);
+    HDassert(0 == pclass->plists);
+    HDassert(0 == pclass->classes);
+    HDassert(name);
+    HDassert((size > 0 && def_value != NULL) || (size == 0));
+
+    /* Check for duplicate named properties */
+    if(NULL != H5SL_search(pclass->props, name))
+        HGOTO_ERROR(H5E_PLIST, H5E_EXISTS, FAIL, "property already exists")
+
+    /* Create property object from parameters */
+    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_CLASS, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property")
+
+    /* Insert property into property list class */
+    if(H5P_add_prop(pclass->props, new_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into class")
+
+    /* Increment property count for class */
+    pclass->nprops++;
+
+    /* Update the revision for the class */
+    pclass->revision = H5P_GET_NEXT_REV;
+
+done:
+    if(ret_value < 0)
+        if(new_prop && H5P_free_prop(new_prop) < 0)
+            HDONE_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close property")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_register_real() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_register
+ PURPOSE
+    Internal routine to register a new property in a property list class.
+ USAGE
+    herr_t H5P_register(class, name, size, default, prp_create, prp_set, prp_get, prp_close)
+        H5P_genclass_t **class; IN: Property list class to modify
+        const char *name;       IN: Name of property to register
+        size_t size;            IN: Size of property in bytes
+        void *def_value;        IN: Pointer to buffer containing default value
+                                    for property in newly created property lists
+        H5P_prp_create_func_t prp_create;   IN: Function pointer to property
+                                    creation callback
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Registers a new property with a property list class.  The property will
+    exist in all property list objects of that class after this routine is
+    finished.  The name of the property must not already exist.  The default
+    property value must be provided and all new property lists created with this
+    property will have the property value set to the default provided.  Any of
+    the callback routines may be set to NULL if they are not needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'default' pointer for a
+    zero-sized property may be set to NULL.  The property 'create' & 'close'
+    callbacks are called for zero-sized properties, but the 'set' and 'get'
+    callbacks are never called.
+
+        The 'create' callback is called when a new property list with this
+    property is being created.  H5P_prp_create_func_t is defined as:
+        typedef herr_t (*H5P_prp_create_func_t)(hid_t prop_id, const char *name,
+                size_t size, void *initial_value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being created.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *initial_value; IN/OUT: The initial value for the property being created.
+                                (The 'default' value passed to H5Pregister2)
+    The 'create' routine may modify the value to be set and those changes will
+    be stored as the initial value of the property.  If the 'create' routine
+    returns a negative value, the new property value is not copied into the
+    property and the property list creation routine returns an error value.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_register(H5P_genclass_t **ppclass, const char *name, size_t size,
+    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close)
+{
+    H5P_genclass_t *pclass = *ppclass;  /* Pointer to class to modify */
+    H5P_genclass_t *new_class = NULL;   /* New class pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(ppclass);
+    HDassert(pclass);
+
+    /* Check if class needs to be split because property lists or classes have
+     *  been created since the last modification was made to the class.
+     */
+    if(pclass->plists > 0 || pclass->classes > 0) {
+        if(NULL == (new_class = H5P_create_class(pclass->parent, pclass->name,
+                pclass->type, pclass->create_func, pclass->create_data,
+                pclass->copy_func, pclass->copy_data,
+                pclass->close_func, pclass->close_data)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy class")
+
+        /* Walk through the skip list of the old class and copy properties */
+        if(pclass->nprops > 0) {
+            H5SL_node_t *curr_node;   /* Current node in skip list */
+
+            /* Walk through the properties in the old class */
+            curr_node = H5SL_first(pclass->props);
+            while(curr_node != NULL) {
+                H5P_genprop_t *pcopy;               /* Property copy */
+
+                /* Make a copy of the class's property */
+                if(NULL == (pcopy = H5P_dup_prop((H5P_genprop_t *)H5SL_item(curr_node), H5P_PROP_WITHIN_CLASS)))
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "Can't copy property")
+
+                /* Insert the initialized property into the property class */
+                if(H5P_add_prop(new_class->props, pcopy) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into class")
+
+                /* Increment property count for class */
+                new_class->nprops++;
+
+                /* Get the next property node in the skip list */
+                curr_node = H5SL_next(curr_node);
+            } /* end while */
+        } /* end if */
+
+        /* Use the new class instead of the old one */
+        pclass = new_class;
+    } /* end if */
+
+    /* Really register the property in the class */
+    if(H5P_register_real(pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "can't register property")
+
+    /* Update pointer to pointer to class, if a new one was generated */
+    if(new_class)
+        *ppclass = pclass;
+
+done:
+    if(ret_value < 0)
+        if(new_class && H5P_close_class(new_class) < 0)
+            HDONE_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close new property class")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_register() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_insert
+ PURPOSE
+    Internal routine to insert a new property in a property list.
+ USAGE
+    herr_t H5P_insert(plist, name, size, value, prp_set, prp_get, prp_close)
+        H5P_genplist_t *plist;  IN: Property list to add property to
+        const char *name;       IN: Name of property to add
+        size_t size;            IN: Size of property in bytes
+        void *value;            IN: Pointer to the value for the property
+        H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
+        H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+        H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
+        H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
+        H5P_prp_close_func_t prp_close; IN: Function pointer to property close
+                                    callback
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Inserts a temporary property into a property list.  The property will
+    exist only in this property list object.  The name of the property must not
+    already exist.  The value must be provided unless the property is zero-
+    sized.  Any of the callback routines may be set to NULL if they are not
+    needed.
+
+        Zero-sized properties are allowed and do not store any data in the
+    property list.  These may be used as flags to indicate the presence or
+    absence of a particular piece of information.  The 'value' pointer for a
+    zero-sized property may be set to NULL.  The property 'close' callback is
+    called for zero-sized properties, but the 'set' and 'get' callbacks are
+    never called.
+
+        The 'set' callback is called before a new value is copied into the
+    property.  H5P_prp_set_func_t is defined as:
+        typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being modified.
+        const char *name;   IN: The name of the property being modified.
+        size_t size;        IN: The size of the property value
+        void *new_value;    IN/OUT: The value being set for the property.
+    The 'set' routine may modify the value to be set and those changes will be
+    stored as the value of the property.  If the 'set' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list set routine returns an error value.
+
+        The 'get' callback is called before a value is retrieved from the
+    property.  H5P_prp_get_func_t is defined as:
+        typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list being queried.
+        const char *name;   IN: The name of the property being queried.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value being retrieved for the property.
+    The 'get' routine may modify the value to be retrieved and those changes
+    will be returned to the calling function.  If the 'get' routine returns a
+    negative value, the property value is returned and the property list get
+    routine returns an error value.
+
+        The 'delete' callback is called when a property is deleted from a
+    property list.  H5P_prp_del_func_t is defined as:
+        typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
+            size_t size, void *value);
+    where the parameters to the callback function are:
+        hid_t prop_id;      IN: The ID of the property list the property is deleted from.
+        const char *name;   IN: The name of the property being deleted.
+        size_t size;        IN: The size of the property value
+        void *value;        IN/OUT: The value of the property being deleted.
+    The 'delete' routine may modify the value passed in, but the value is not
+    used by the library when the 'delete' routine returns.  If the
+    'delete' routine returns a negative value, the property list deletion
+    routine returns an error value but the property is still deleted.
+
+        The 'copy' callback is called when a property list with this
+    property is copied.  H5P_prp_copy_func_t is defined as:
+        typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being copied.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being copied.
+    The 'copy' routine may modify the value to be copied and those changes will be
+    stored as the value of the property.  If the 'copy' routine returns a
+    negative value, the new property value is not copied into the property and
+    the property list copy routine returns an error value.
+
+        The 'compare' callback is called when a property list with this
+    property is compared to another property list.  H5P_prp_compare_func_t is
+    defined as:
+        typedef int (*H5P_prp_compare_func_t)( void *value1, void *value2,
+            size_t size);
+    where the parameters to the callback function are:
+        const void *value1; IN: The value of the first property being compared.
+        const void *value2; IN: The value of the second property being compared.
+        size_t size;        IN: The size of the property value
+    The 'compare' routine may not modify the values to be compared.  The
+    'compare' routine should return a positive value if VALUE1 is greater than
+    VALUE2, a negative value if VALUE2 is greater than VALUE1 and zero if VALUE1
+    and VALUE2 are equal.
+
+        The 'close' callback is called when a property list with this
+    property is being destroyed.  H5P_prp_close_func_t is defined as:
+        typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size,
+            void *value);
+    where the parameters to the callback function are:
+        const char *name;   IN: The name of the property being closed.
+        size_t size;        IN: The size of the property value
+        void *value;        IN: The value of the property being closed.
+    The 'close' routine may modify the value passed in, but the value is not
+    used by the library when the 'close' routine returns.  If the
+    'close' routine returns a negative value, the property list close
+    routine returns an error value but the property list is still closed.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The 'set' callback function may be useful to range check the value being
+    set for the property or may perform some tranformation/translation of the
+    value set.  The 'get' callback would then [probably] reverse the
+    transformation, etc.  A single 'get' or 'set' callback could handle
+    multiple properties by performing different actions based on the property
+    name or other properties in the property list.
+
+        There is no 'create' callback routine for temporary property list
+    objects, the initial value is assumed to have any necessary setup already
+    performed on it.
+
+        I would like to say "the property list is not closed" when a 'close'
+    routine fails, but I don't think that's possible due to other properties in
+    the list being successfully closed & removed from the property list.  I
+    suppose that it would be possible to just remove the properties which have
+    successful 'close' callbacks, but I'm not happy with the ramifications
+    of a mangled, un-closable property list hanging around...  Any comments? -QAK
+
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
+    void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close)
+{
+    H5P_genprop_t *new_prop = NULL;     /* Temporary property pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(plist);
+    HDassert(name);
+    HDassert((size > 0 && value != NULL) || (size == 0));
+
+    /* Check for duplicate named properties */
+    if(NULL != H5SL_search(plist->props, name))
+        HGOTO_ERROR(H5E_PLIST, H5E_EXISTS, FAIL, "property already exists")
+
+    /* Check if the property has been deleted */
+    if(NULL != H5SL_search(plist->del, name)) {
+        char *temp_name = NULL;
+
+        /* Remove the property name from the deleted property skip list */
+        if(NULL == (temp_name = (char *)H5SL_remove(plist->del, name)))
+            HGOTO_ERROR(H5E_PLIST,H5E_CANTDELETE,FAIL,"can't remove property from deleted skip list")
+
+        /* free the name of the removed property */
+        H5MM_xfree(temp_name);
+    } /* end if */
+    else {
+        H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+        /* Check if the property is already in the class hierarchy */
+        tclass = plist->pclass;
+        while(tclass) {
+            if(tclass->nprops > 0) {
+                /* Find the property in the class */
+                if(NULL != H5SL_search(tclass->props, name))
+                    HGOTO_ERROR(H5E_PLIST, H5E_EXISTS, FAIL, "property already exists")
+            } /* end if */
+
+            /* Go up to parent class */
+            tclass = tclass->parent;
+        } /* end while */
+    } /* end else */
+
+    /* Ok to add to property list */
+
+    /* Create property object from parameters */
+    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_LIST, value, NULL, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "Can't create property")
+
+    /* Insert property into property list class */
+    if(H5P_add_prop(plist->props, new_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "Can't insert property into class")
+
+    /* Increment property count for class */
+    plist->nprops++;
+
+done:
+    if(ret_value < 0)
+        if(new_prop && H5P_free_prop(new_prop) < 0)
+            HDONE_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close property")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5P_insert() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_set
+ PURPOSE
+    Internal routine to set a property's value in a property list.
+ USAGE
+    herr_t H5P_set(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to find property in
+        const char *name;       IN: Name of property to set
+        void *value;            IN: Pointer to the value for the property
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Sets a new value for a property in a property list.  The property name
+    must exist or this routine will fail.  If there is a 'set' callback routine
+    registered for this property, the 'value' will be passed to that routine and
+    any changes to the 'value' will be used when setting the property value.
+    The information pointed at by the 'value' pointer (possibly modified by the
+    'set' callback) is copied into the property list value and may be changed
+    by the application making the H5Pset call without affecting the property
+    value.
+
+        If the 'set' callback routine returns an error, the property value will
+    not be modified.  This routine may not be called for zero-sized properties
+    and will return an error in that case.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_set(H5P_genplist_t *plist, const char *name, const void *value)
+{
+    H5P_genclass_t *tclass;     /* Temporary class pointer */
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(plist);
+    HDassert(name);
+    HDassert(value);
+
+    /* Check if the property has been deleted */
+    if(H5SL_search(plist->del,name)!=NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
+
+    /* Find property in changed list */
+    if(NULL != (prop = (H5P_genprop_t *)H5SL_search(plist->props, name))) {
+        /* Check for property size >0 */
+        if(prop->size==0)
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+        /* Make a copy of the value and pass to 'set' callback */
+        if(prop->set!=NULL) {
+            void *tmp_value;            /* Temporary value for property */
+
+            /* Make a copy of the current value, in case the callback fails */
+            if(NULL==(tmp_value=H5MM_malloc(prop->size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
+            HDmemcpy(tmp_value,value,prop->size);
+
+            /* Call user's callback */
+            if((*(prop->set))(plist->plist_id,name,prop->size,tmp_value) < 0) {
+                H5MM_xfree(tmp_value);
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+            } /* end if */
+
+            /* Copy new [possibly unchanged] value into property value */
+            HDmemcpy(prop->value,tmp_value,prop->size);
+
+            /* Free the temporary value buffer */
+            H5MM_xfree(tmp_value);
+        } /* end if */
+        /* No 'set' callback, just copy value */
+        else
+            HDmemcpy(prop->value,value,prop->size);
+    } /* end if */
+    else {
+        /*
+         * Check if we should set class properties (up through list of parent classes also),
+         * & make property 'set' callback.
+         */
+        tclass=plist->pclass;
+        while(tclass!=NULL) {
+            if(tclass->nprops>0) {
+                /* Find the property in the class */
+                if((prop = (H5P_genprop_t *)H5SL_search(tclass->props,name))!=NULL) {
+                    H5P_genprop_t *pcopy;  /* Copy of property to insert into skip list */
+
+                    /* Check for property size >0 */
+                    if(prop->size==0)
+                        HGOTO_ERROR(H5E_PLIST,H5E_BADVALUE,FAIL,"property has zero size")
+
+                    /* Make a copy of the value and pass to 'set' callback */
+                    if(prop->set!=NULL) {
+                        void *tmp_value;            /* Temporary value for property */
+
+                        /* Make a copy of the current value, in case the callback fails */
+                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
+                        HDmemcpy(tmp_value,value,prop->size);
+
+                        /* Call user's callback */
+                        if((*(prop->set))(plist->plist_id,name,prop->size,tmp_value) < 0) {
+                            H5MM_xfree(tmp_value);
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+                        } /* end if */
+
+                        if((prop->cmp)(tmp_value,prop->value,prop->size)) {
+                            /* Make a copy of the class's property */
+                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
+                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
+
+                            /* Copy new value into property value */
+                            HDmemcpy(pcopy->value,tmp_value,pcopy->size);
+
+                            /* Insert the changed property into the property list */
+                            if(H5P_add_prop(plist->props,pcopy) < 0)
+                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
+                        } /* end if */
+
+                        /* Free the temporary value buffer */
+                        H5MM_xfree(tmp_value);
+                    } /* end if */
+                    /* No 'set' callback, just copy value */
+                    else {
+                        if((prop->cmp)(value,prop->value,prop->size)) {
+                            /* Make a copy of the class's property */
+                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
+                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
+
+                            HDmemcpy(pcopy->value,value,pcopy->size);
+
+                            /* Insert the changed property into the property list */
+                            if(H5P_add_prop(plist->props,pcopy) < 0)
+                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
+                        } /* end if */
+                    } /* end else */
+
+                    /* Leave */
+                    HGOTO_DONE(SUCCEED);
+                } /* end while */
+            } /* end if */
+
+            /* Go up to parent class */
+            tclass=tclass->parent;
+        } /* end while */
+
+        /* If we get this far, then it wasn't in the list of changed properties,
+         * nor in the properties in the class hierarchy, indicate an error
+         */
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_set() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_exist_plist
+ PURPOSE
+    Internal routine to query the existance of a property in a property list.
+ USAGE
+    htri_t H5P_exist_plist(plist, name)
+        const H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Success: Positive if the property exists in the property list, zero
+            if the property does not exist.
+    Failure: negative value
+ DESCRIPTION
+        This routine checks if a property exists within a property list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_exist_plist(const H5P_genplist_t *plist, const char *name)
+{
+    htri_t ret_value = FAIL;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Check for property in deleted property list */
+    if(H5SL_search(plist->del, name) != NULL)
+        ret_value = FALSE;
+    else {
+        /* Check for property in changed property list */
+        if(H5SL_search(plist->props, name) != NULL)
+            ret_value = TRUE;
+        else {
+            H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+            tclass = plist->pclass;
+            while(tclass != NULL) {
+                if(H5SL_search(tclass->props, name) != NULL)
+                    HGOTO_DONE(TRUE)
+
+                /* Go up to parent class */
+                tclass = tclass->parent;
+            } /* end while */
+
+            /* If we've reached here, we couldn't find the property */
+            ret_value = FALSE;
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_exist_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_exist_pclass
+ PURPOSE
+    Internal routine to query the existance of a property in a property class.
+ USAGE
+    herr_t H5P_exist_pclass(pclass, name)
+        H5P_genclass_t *pclass;  IN: Property class to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Success: Positive if the property exists in the property class, zero
+            if the property does not exist.
+    Failure: negative value
+ DESCRIPTION
+        This routine checks if a property exists within a property class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_exist_pclass(H5P_genclass_t *pclass, const char *name)
+{
+    htri_t ret_value = FAIL;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pclass);
+    HDassert(name);
+
+    /* Check for property in property list */
+    if(H5SL_search(pclass->props, name) != NULL)
+        ret_value = TRUE;
+    else {
+        H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+        tclass = pclass->parent;
+        while(tclass != NULL) {
+            if(H5SL_search(tclass->props, name) != NULL)
+                HGOTO_DONE(TRUE)
+
+            /* Go up to parent class */
+            tclass = tclass->parent;
+        } /* end while */
+
+        /* If we've reached here, we couldn't find the property */
+        ret_value = FALSE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_exist_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_size_plist
+ PURPOSE
+    Internal routine to query the size of a property in a property list.
+ USAGE
+    herr_t H5P_get_size_plist(plist, name)
+        const H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+        size_t *size;           OUT: Size of property
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This routine retrieves the size of a property's value in bytes.  Zero-
+    sized properties are allowed and return a value of 0.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_get_size_plist(const H5P_genplist_t *plist, const char *name, size_t *size)
+{
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    herr_t ret_value=SUCCEED;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(plist);
+    HDassert(name);
+    HDassert(size);
+
+    /* Find property */
+    if(NULL == (prop = H5P__find_prop_plist(plist, name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
+
+    /* Get property size */
+    *size = prop->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_size_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_size_pclass
+ PURPOSE
+    Internal routine to query the size of a property in a property class.
+ USAGE
+    herr_t H5P_get_size_pclass(pclass, name)
+        H5P_genclass_t *pclass; IN: Property class to check
+        const char *name;       IN: Name of property to query
+        size_t *size;           OUT: Size of property
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This routine retrieves the size of a property's value in bytes.  Zero-
+    sized properties are allowed and return a value of 0.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_get_size_pclass(H5P_genclass_t *pclass, const char *name, size_t *size)
+{
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    herr_t ret_value=SUCCEED;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+    HDassert(name);
+    HDassert(size);
+
+    /* Find property */
+    if((prop=H5P_find_prop_pclass(pclass,name)) == NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
+
+    /* Get property size */
+    *size=prop->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_size_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_nprops_plist
+ PURPOSE
+    Internal routine to query the number of properties in a property list
+ USAGE
+    herr_t H5P_get_nprops_plist(plist, nprops)
+        H5P_genplist_t *plist;  IN: Property list to check
+        size_t *nprops;         OUT: Number of properties in the property list
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This routine retrieves the number of a properties in a property list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_get_nprops_plist(const H5P_genplist_t *plist, size_t *nprops)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(plist);
+    HDassert(nprops);
+
+    /* Get property size */
+    *nprops = plist->nprops;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5P_get_nprops_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_nprops_pclass
+ PURPOSE
+    Internal routine to query the number of properties in a property class
+ USAGE
+    herr_t H5P_get_nprops_pclass(pclass, nprops)
+        H5P_genclass_t *pclass;  IN: Property class to check
+        size_t *nprops;         OUT: Number of properties in the property list
+        hbool_t recurse;        IN: Include properties in parent class(es) also
+ RETURNS
+    Success: non-negative value (can't fail)
+    Failure: negative value
+ DESCRIPTION
+    This routine retrieves the number of a properties in a property class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops, hbool_t recurse)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pclass);
+    HDassert(nprops);
+
+    /* Get number of properties */
+    *nprops = pclass->nprops;
+
+    /* Check if the class is derived, and walk up the chain, if so */
+    if(recurse)
+	while(pclass->parent != NULL) {
+	    pclass = pclass->parent;
+	    *nprops += pclass->nprops;
+	} /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_nprops_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_cmp_prop
+ PURPOSE
+    Internal routine to compare two generic properties
+ USAGE
+    int H5P_cmp_prop(prop1, prop2)
+        H5P_genprop_t *prop1;    IN: 1st property to compare
+        H5P_genprop_t *prop1;    IN: 2nd property to compare
+ RETURNS
+    Success: negative if prop1 "less" than prop2, positive if prop1 "greater"
+        than prop2, zero if prop1 is "equal" to prop2
+    Failure: can't fail
+ DESCRIPTION
+        This function compares two generic properties together to see if
+    they are the same property.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P_cmp_prop(const H5P_genprop_t *prop1, const H5P_genprop_t *prop2)
+{
+    int cmp_value;             /* Value from comparison */
+    int ret_value = 0;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(prop1);
+    HDassert(prop2);
+
+    /* Check the name */
+    if((cmp_value = HDstrcmp(prop1->name, prop2->name)) != 0)
+        HGOTO_DONE(cmp_value);
+
+    /* Check the size of properties */
+    if(prop1->size < prop2->size) HGOTO_DONE(-1);
+    if(prop1->size > prop2->size) HGOTO_DONE(1);
+
+    /* Check if they both have the same 'create' callback */
+    if(prop1->create == NULL && prop2->create != NULL) HGOTO_DONE(-1);
+    if(prop1->create != NULL && prop2->create == NULL) HGOTO_DONE(1);
+    if(prop1->create != prop2->create) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'set' callback */
+    if(prop1->set == NULL && prop2->set != NULL) HGOTO_DONE(-1);
+    if(prop1->set != NULL && prop2->set == NULL) HGOTO_DONE(1);
+    if(prop1->set != prop2->set) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'get' callback */
+    if(prop1->get == NULL && prop2->get != NULL) HGOTO_DONE(-1);
+    if(prop1->get != NULL && prop2->get == NULL) HGOTO_DONE(1);
+    if(prop1->get != prop2->get) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'delete' callback */
+    if(prop1->del == NULL && prop2->del != NULL) HGOTO_DONE(-1);
+    if(prop1->del != NULL && prop2->del == NULL) HGOTO_DONE(1);
+    if(prop1->del != prop2->del) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'copy' callback */
+    if(prop1->copy == NULL && prop2->copy != NULL) HGOTO_DONE(-1);
+    if(prop1->copy != NULL && prop2->copy == NULL) HGOTO_DONE(1);
+    if(prop1->copy != prop2->copy) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'compare' callback */
+    if(prop1->cmp == NULL && prop2->cmp != NULL) HGOTO_DONE(-1);
+    if(prop1->cmp != NULL && prop2->cmp == NULL) HGOTO_DONE(1);
+    if(prop1->cmp != prop2->cmp) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'close' callback */
+    if(prop1->close == NULL && prop2->close != NULL) HGOTO_DONE(-1);
+    if(prop1->close != NULL && prop2->close == NULL) HGOTO_DONE(1);
+    if(prop1->close != prop2->close) HGOTO_DONE(-1);
+
+    /* Check if they both have values allocated (or not allocated) */
+    if(prop1->value == NULL && prop2->value != NULL) HGOTO_DONE(-1);
+    if(prop1->value != NULL && prop2->value == NULL) HGOTO_DONE(1);
+    if(prop1->value != NULL) {
+        /* Call comparison routine */
+        if((cmp_value = prop1->cmp(prop1->value, prop2->value, prop1->size)) != 0)
+            HGOTO_DONE(cmp_value);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_cmp_prop() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_cmp_class
+ PURPOSE
+    Internal routine to compare two generic property classes
+ USAGE
+    int H5P_cmp_class(pclass1, pclass2)
+        H5P_genclass_t *pclass1;    IN: 1st property class to compare
+        H5P_genclass_t *pclass2;    IN: 2nd property class to compare
+ RETURNS
+    Success: negative if class1 "less" than class2, positive if class1 "greater"
+        than class2, zero if class1 is "equal" to class2
+    Failure: can't fail
+ DESCRIPTION
+        This function compares two generic property classes together to see if
+    they are the same class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5P_cmp_class(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2)
+{
+    H5SL_node_t *tnode1, *tnode2;   /* Temporary pointer to property nodes */
+    int cmp_value;                  /* Value from comparison */
+    int ret_value = 0;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pclass1);
+    HDassert(pclass2);
+
+    /* Use the revision number to quickly check for identical classes */
+    if(pclass1->revision == pclass2->revision)
+        HGOTO_DONE(0);
+
+    /* Check the name */
+    if((cmp_value = HDstrcmp(pclass1->name, pclass2->name)) != 0)
+        HGOTO_DONE(cmp_value);
+
+    /* Check the number of properties */
+    if(pclass1->nprops < pclass2->nprops) HGOTO_DONE(-1);
+    if(pclass1->nprops > pclass2->nprops) HGOTO_DONE(1);
+
+    /* Check the number of property lists created from the class */
+    if(pclass1->plists < pclass2->plists) HGOTO_DONE(-1);
+    if(pclass1->plists > pclass2->plists) HGOTO_DONE(1);
+
+    /* Check the number of classes derived from the class */
+    if(pclass1->classes < pclass2->classes) HGOTO_DONE(-1);
+    if(pclass1->classes > pclass2->classes) HGOTO_DONE(1);
+
+    /* Check the number of ID references open on the class */
+    if(pclass1->ref_count < pclass2->ref_count) HGOTO_DONE(-1);
+    if(pclass1->ref_count > pclass2->ref_count) HGOTO_DONE(1);
+
+    /* Check the property list types */
+    if(pclass1->type < pclass2->type) HGOTO_DONE(-1);
+    if(pclass1->type > pclass2->type) HGOTO_DONE(1);
+
+    /* Check whether they are deleted or not */
+    if(pclass1->deleted < pclass2->deleted) HGOTO_DONE(-1);
+    if(pclass1->deleted > pclass2->deleted) HGOTO_DONE(1);
+
+    /* Check whether they have creation callback functions & data */
+    if(pclass1->create_func == NULL && pclass2->create_func != NULL) HGOTO_DONE(-1);
+    if(pclass1->create_func != NULL && pclass2->create_func == NULL) HGOTO_DONE(1);
+    if(pclass1->create_func != pclass2->create_func) HGOTO_DONE(-1);
+    if(pclass1->create_data < pclass2->create_data) HGOTO_DONE(-1);
+    if(pclass1->create_data > pclass2->create_data) HGOTO_DONE(1);
+
+    /* Check whether they have close callback functions & data */
+    if(pclass1->close_func == NULL && pclass2->close_func != NULL) HGOTO_DONE(-1);
+    if(pclass1->close_func != NULL && pclass2->close_func == NULL) HGOTO_DONE(1);
+    if(pclass1->close_func != pclass2->close_func) HGOTO_DONE(-1);
+    if(pclass1->close_data < pclass2->close_data) HGOTO_DONE(-1);
+    if(pclass1->close_data > pclass2->close_data) HGOTO_DONE(1);
+
+    /* Cycle through the properties and compare them also */
+    tnode1 = H5SL_first(pclass1->props);
+    tnode2 = H5SL_first(pclass2->props);
+    while(tnode1 || tnode2) {
+        H5P_genprop_t *prop1, *prop2;   /* Property for node */
+
+        /* Check if they both have properties in this skip list node */
+        if(tnode1 == NULL && tnode2 != NULL) HGOTO_DONE(-1);
+        if(tnode1 != NULL && tnode2 == NULL) HGOTO_DONE(1);
+
+        /* Compare the two properties */
+        prop1 = (H5P_genprop_t *)H5SL_item(tnode1);
+        prop2 = (H5P_genprop_t *)H5SL_item(tnode2);
+        if((cmp_value = H5P_cmp_prop(prop1, prop2)) != 0)
+            HGOTO_DONE(cmp_value);
+
+        /* Advance the pointers */
+        tnode1 = H5SL_next(tnode1);
+        tnode2 = H5SL_next(tnode2);
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_cmp_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__cmp_plist_cb
+ PURPOSE
+    Internal callback routine when iterating over properties in property list
+    to compare them for equality
+ USAGE
+    int H5P__cmp_plist_cb(prop, udata)
+        H5P_genprop_t *prop;        IN: Pointer to the property
+        void *udata;                IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns whether to continue (H5_ITER_CONT) or stop (H5_ITER_STOP)
+            iterating over the property lists.
+    Failure: Negative value (H5_ITER_ERROR)
+ DESCRIPTION
+    This routine compares a property from one property list (the one being
+    iterated over, to a property from the second property list (which is
+    looked up).  Iteration is stopped if the comparison is non-equal.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__cmp_plist_cb(H5P_genprop_t *prop, void *_udata)
+{
+    H5P_plist_cmp_ud_t *udata = (H5P_plist_cmp_ud_t *)_udata;   /* Pointer to user data */
+    htri_t prop2_exist;                 /* Whether the property exists in the second property list */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(prop);
+    HDassert(udata);
+
+    /* Check if the property exists in the second property list */
+    if((prop2_exist = H5P_exist_plist(udata->plist2, prop->name)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, H5_ITER_ERROR, "can't lookup existance of property?")
+    if(prop2_exist) {
+        const H5P_genprop_t *prop2;         /* Pointer to property in second plist */
+
+        /* Look up same property in second property list */
+        if(NULL == (prop2 = H5P__find_prop_plist(udata->plist2, prop->name)))
+            HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, H5_ITER_ERROR, "property doesn't exist")
+
+        /* Compare the two properties */
+        if((udata->cmp_value = H5P_cmp_prop(prop, prop2)) != 0)
+            HGOTO_DONE(H5_ITER_STOP);
+    } /* end if */
+    else {
+        /* Property exists in first list, but not second */
+        udata->cmp_value = 1;
+        HGOTO_DONE(H5_ITER_STOP);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__cmp_plist_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_cmp_plist
+ PURPOSE
+    Internal routine to compare two generic property lists
+ USAGE
+    herr_t H5P_cmp_plist(plist1, plist2, cmp_ret)
+        H5P_genplist_t *plist1;    IN: 1st property list to compare
+        H5P_genplist_t *plist2;    IN: 2nd property list to compare
+        int *cmp_ret;              OUT: Comparison value for two property lists
+                                        Negative if list1 "less" than list2,
+                                        positive if list1 "greater" than list2,
+                                        zero if list1 is "equal" to list2
+ RETURNS
+    Success: non-negative value
+    Failure: negative value
+ DESCRIPTION
+        This function compares two generic property lists together to see if
+    they are equal.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_cmp_plist(const H5P_genplist_t *plist1, const H5P_genplist_t *plist2,
+    int *cmp_ret)
+{
+    H5P_plist_cmp_ud_t udata;   /* User data for callback */
+    int idx = 0;                /* Index of property to begin with */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(plist1);
+    HDassert(plist2);
+    HDassert(cmp_ret);
+
+    /* Check the number of properties */
+    if(plist1->nprops < plist2->nprops) {
+        *cmp_ret = -1;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
+    if(plist1->nprops > plist2->nprops) {
+        *cmp_ret = 1;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+    /* Check whether they've been initialized */
+    if(plist1->class_init < plist2->class_init) {
+        *cmp_ret = -1;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
+    if(plist1->class_init > plist2->class_init) {
+        *cmp_ret = 1;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+    /* Set up iterator callback info */
+    udata.cmp_value = 0;
+    udata.plist2 = plist2;
+
+    /* Iterate over properties in first property list */
+    if((ret_value = H5P_iterate_plist(plist1, TRUE, &idx, H5P__cmp_plist_cb, &udata)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to iterate over list")
+    if(ret_value != 0) {
+        *cmp_ret = udata.cmp_value;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
+
+    /* Check the parent classes */
+    if((*cmp_ret = H5P_cmp_class(plist1->pclass, plist2->pclass)) != 0)
+        HGOTO_DONE(SUCCEED);
+
+    /* Property lists must be equal, set comparison value to 0 */
+    *cmp_ret = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_cmp_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_class_isa
+ PURPOSE
+    Internal routine to query whether a property class is the same as another
+    class.
+ USAGE
+    htri_t H5P_class_isa(pclass1, pclass2)
+        H5P_genclass_t *pclass1;   IN: Property class to check
+        H5P_genclass_t *pclass2;   IN: Property class to compare with
+ RETURNS
+    Success: TRUE (1) or FALSE (0)
+    Failure: negative value
+ DESCRIPTION
+    This routine queries whether a property class is the same as another class,
+    and walks up the hierarchy of derived classes, checking if the first class
+    is derived from the second class also.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2)
+{
+    htri_t ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pclass1);
+    HDassert(pclass2);
+
+    /* Compare property classes */
+    if(H5P_cmp_class(pclass1, pclass2) == 0) {
+        HGOTO_DONE(TRUE);
+    } else {
+        /* Check if the class is derived, and walk up the chain, if so */
+        if(pclass1->parent != NULL)
+            ret_value = H5P_class_isa(pclass1->parent, pclass2);
+        else
+            HGOTO_DONE(FALSE);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_class_isa() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_isa_class
+ PURPOSE
+    Internal routine to query whether a property list is a certain class
+ USAGE
+    hid_t H5P_isa_class(plist_id, pclass_id)
+        hid_t plist_id;         IN: Property list to query
+        hid_t pclass_id;        IN: Property class to query
+ RETURNS
+    Success: TRUE (1) or FALSE (0)
+    Failure: negative
+ DESCRIPTION
+    This routine queries whether a property list is a member of the property
+    list class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This function is special in that it is an internal library function, but
+    accepts hid_t's as parameters.  Since it is used in basically the same way
+    as the H5I functions, this should be OK.  Don't make more library functions
+    which accept hid_t's without thorough discussion. -QAK
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_isa_class(hid_t plist_id, hid_t pclass_id)
+{
+    H5P_genplist_t	*plist;         /* Property list to query */
+    H5P_genclass_t	*pclass;        /* Property list class */
+    htri_t ret_value;                   /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(pclass_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property class")
+
+    /* Compare the property list's class against the other class */
+    if((ret_value = H5P_class_isa(plist->pclass, pclass)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to compare property list classes")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_isa_class() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_object_verify
+ PURPOSE
+    Internal routine to query whether a property list is a certain class and
+        retrieve the property list object associated with it.
+ USAGE
+    void *H5P_object_verify(plist_id, pclass_id)
+        hid_t plist_id;         IN: Property list to query
+        hid_t pclass_id;        IN: Property class to query
+ RETURNS
+    Success: valid pointer to a property list object
+    Failure: NULL
+ DESCRIPTION
+    This routine queries whether a property list is member of a certain class
+    and retrieves the property list object associated with it.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This function is special in that it is an internal library function, but
+    accepts hid_t's as parameters.  Since it is used in basically the same way
+    as the H5I functions, this should be OK.  Don't make more library functions
+    which accept hid_t's without thorough discussion. -QAK
+
+    This function is similar (in spirit) to H5I_object_verify()
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genplist_t *
+H5P_object_verify(hid_t plist_id, hid_t pclass_id)
+{
+    H5P_genplist_t *ret_value;                   /* return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Compare the property list's class against the other class */
+    if(H5P_isa_class(plist_id, pclass_id) != TRUE)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, NULL, "property list is not a member of the class")
+
+    /* Get the plist structure */
+    if(NULL == (ret_value = (H5P_genplist_t *)H5I_object(plist_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "can't find object for ID")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_object_verify() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__iterate_plist_cb
+ PURPOSE
+    Internal callback routine when iterating over properties in property list
+ USAGE
+    int H5P__iterate_plist_cb(item, key, udata)
+        void *item;                 IN: Pointer to the property
+        void *key;                  IN: Pointer to the property's name
+        void *udata;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC
+ DESCRIPTION
+    This routine calls the actual callback routine for the property in the
+property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__iterate_plist_cb(void *_item, void *_key, void *_udata)
+{
+    H5P_genprop_t *item = (H5P_genprop_t *)_item;       /* Pointer to the property */
+    char *key = (char *)_key;                           /* Pointer to the property's name */
+    H5P_iter_plist_ud_t *udata = (H5P_iter_plist_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = H5_ITER_CONT;                       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(item);
+    HDassert(key);
+
+    /* Check if we've found the correctly indexed property */
+    if(*udata->curr_idx_ptr >= udata->prev_idx) {
+        /* Call the callback function */
+        ret_value = (*udata->cb_func)(item, udata->udata);
+        if(ret_value != 0)
+            HGOTO_DONE(ret_value);
+    } /* end if */
+
+    /* Increment the current index */
+    (*udata->curr_idx_ptr)++;
+
+    /* Add property name to 'seen' list */
+    if(H5SL_insert(udata->seen, key, key) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, H5_ITER_ERROR, "can't insert property into 'seen' skip list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__iterate_plist_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__iterate_plist_pclass_cb
+ PURPOSE
+    Internal callback routine when iterating over properties in property class
+ USAGE
+    int H5P__iterate_plist_pclass_cb(item, key, udata)
+        void *item;                 IN: Pointer to the property
+        void *key;                  IN: Pointer to the property's name
+        void *udata;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC
+ DESCRIPTION
+    This routine verifies that the property hasn't already been seen or was
+deleted, and then chains to the property list callback.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__iterate_plist_pclass_cb(void *_item, void *_key, void *_udata)
+{
+    H5P_genprop_t *item = (H5P_genprop_t *)_item;       /* Pointer to the property */
+    char *key = (char *)_key;                           /* Pointer to the property's name */
+    H5P_iter_plist_ud_t *udata = (H5P_iter_plist_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = H5_ITER_CONT;                       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(item);
+    HDassert(key);
+
+    /* Only call iterator callback for properties we haven't seen
+     * before and that haven't been deleted.
+     */
+    if(NULL == H5SL_search(udata->seen, key) &&
+            NULL == H5SL_search(udata->plist->del, key))
+        ret_value = H5P__iterate_plist_cb(item, key, udata);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__iterate_plist_pclass_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_iterate_plist
+ PURPOSE
+    Internal routine to iterate over the properties in a property list
+ USAGE
+    int H5P_iterate_plist(plist, iter_all_prop, idx, cb_func, iter_data)
+        const H5P_genplist_t *plist; IN: Property list to iterate over
+        hbool_t iter_all_prop;      IN: Whether to iterate over all properties
+                                        (TRUE), or just non-default (i.e. changed)
+                                        properties (FALSE).
+        int *idx;                   IN/OUT: Index of the property to begin with
+        H5P_iterate_t cb_func;    IN: Function pointer to function to be
+                                        called with each property iterated over.
+        void *iter_data;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC if it was
+                non-zero, or zero if all properties have been processed.
+    Failure: negative value
+ DESCRIPTION
+    This routine iterates over the properties in the property object specified
+with PLIST_ID.  For each property in the object, the ITER_DATA and some
+additional information, specified below, are passed to the ITER_FUNC function.
+The iteration begins with the IDX property in the object and the next element
+to be processed by the operator is returned in IDX.  If IDX is NULL, then the
+iterator starts at the first property; since no stopping point is returned in
+this case, the iterator cannot be restarted if one of the calls to its operator
+returns non-zero.
+
+The prototype for H5P_iterate_t is:
+    typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
+The operation receives the property list or class identifier for the object
+being iterated over, ID, the name of the current property within the object,
+NAME, and the pointer to the operator data passed in to H5Piterate, ITER_DATA.
+
+The return values from an operator are:
+    Zero causes the iterator to continue, returning zero when all properties
+        have been processed.
+    Positive causes the iterator to immediately return that positive value,
+        indicating short-circuit success. The iterator can be restarted at the
+        index of the next property.
+    Negative causes the iterator to immediately return that value, indicating
+        failure. The iterator can be restarted at the index of the next
+        property.
+
+H5Piterate assumes that the properties in the object identified by ID remains
+unchanged through the iteration.  If the membership changes during the
+iteration, the function's behavior is undefined.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5P_iterate_plist(const H5P_genplist_t *plist, hbool_t iter_all_prop, int *idx,
+    H5P_iterate_int_t cb_func, void *udata)
+{
+    H5P_genclass_t *tclass;     /* Temporary class pointer */
+    H5P_iter_plist_ud_t udata_int;        /* User data for skip list iterator */
+    H5SL_t *seen = NULL;        /* Skip list to hold names of properties already seen */
+    int curr_idx = 0;           /* Current iteration index */
+    int ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(idx);
+    HDassert(cb_func);
+
+    /* Create the skip list to hold names of properties already seen */
+    if(NULL == (seen = H5SL_create(H5SL_TYPE_STR, NULL)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "can't create skip list for seen properties")
+
+    /* Set up iterator callback info */
+    udata_int.plist = plist;
+    udata_int.cb_func = cb_func;
+    udata_int.udata = udata;
+    udata_int.seen = seen;
+    udata_int.curr_idx_ptr = &curr_idx;
+    udata_int.prev_idx = *idx;
+
+    /* Iterate over properties in property list proper */
+    /* (Will be only the non-default (i.e. changed) properties) */
+    ret_value = H5SL_iterate(plist->props, H5P__iterate_plist_cb, &udata_int);
+    if(ret_value != 0)
+        HGOTO_DONE(ret_value);
+
+    /* Check for iterating over all properties, or just non-default ones */
+    if(iter_all_prop) {
+        /* Walk up the class hiearchy */
+        tclass = plist->pclass;
+        while(tclass != NULL) {
+            /* Iterate over properties in property list class */
+            ret_value = H5SL_iterate(tclass->props, H5P__iterate_plist_pclass_cb, &udata_int);
+            if(ret_value != 0)
+                HGOTO_DONE(ret_value);
+
+            /* Go up to parent class */
+            tclass = tclass->parent;
+        } /* end while */
+    } /* end if */
+
+done:
+    /* Set the index we stopped at */
+    *idx = curr_idx;
+
+    /* Release the skip list of 'seen' properties */
+    if(seen != NULL)
+        H5SL_close(seen);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_iterate_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__iterate_pclass_cb
+ PURPOSE
+    Internal callback routine when iterating over properties in property list
+    class
+ USAGE
+    int H5P__iterate_pclass_cb(item, key, udata)
+        void *item;                 IN: Pointer to the property
+        void *key;                  IN: Pointer to the property's name
+        void *udata;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC
+ DESCRIPTION
+    This routine calls the actual callback routine for the property in the
+property list class.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__iterate_pclass_cb(void *_item, void *_key, void *_udata)
+{
+    H5P_genprop_t *item = (H5P_genprop_t *)_item;       /* Pointer to the property */
+    char *key = (char *)_key;                           /* Pointer to the property's name */
+    H5P_iter_pclass_ud_t *udata = (H5P_iter_pclass_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = 0;                                  /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(item);
+    HDassert(key);
+
+    /* Check if we've found the correctly indexed property */
+    if(*udata->curr_idx_ptr >= udata->prev_idx) {
+        /* Call the callback function */
+        ret_value = (*udata->cb_func)(item, udata->udata);
+        if(ret_value != 0)
+            HGOTO_DONE(ret_value);
+    } /* end if */
+
+    /* Increment the current index */
+    (*udata->curr_idx_ptr)++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__iterate_pclass_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_iterate_pclass
+ PURPOSE
+    Internal routine to iterate over the properties in a property class
+ USAGE
+    herr_t H5P_iterate_pclass(pclass, idx, cb_func, iter_data)
+        const H5P_genpclass_t *pclass; IN: Property list class to iterate over
+        int *idx;                   IN/OUT: Index of the property to begin with
+        H5P_iterate_t cb_func;    IN: Function pointer to function to be
+                                        called with each property iterated over.
+        void *iter_data;            IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: Returns the return value of the last call to ITER_FUNC if it was
+                non-zero, or zero if all properties have been processed.
+    Failure: negative value
+ DESCRIPTION
+    This routine iterates over the properties in the property object specified
+with PCLASS_ID.  For each property in the object, the ITER_DATA and some
+additional information, specified below, are passed to the ITER_FUNC function.
+The iteration begins with the IDX property in the object and the next element
+to be processed by the operator is returned in IDX.  If IDX is NULL, then the
+iterator starts at the first property; since no stopping point is returned in
+this case, the iterator cannot be restarted if one of the calls to its operator
+returns non-zero.
+
+The prototype for H5P_iterate_t is:
+    typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
+The operation receives the property list or class identifier for the object
+being iterated over, ID, the name of the current property within the object,
+NAME, and the pointer to the operator data passed in to H5Piterate, ITER_DATA.
+
+The return values from an operator are:
+    Zero causes the iterator to continue, returning zero when all properties
+        have been processed.
+    Positive causes the iterator to immediately return that positive value,
+        indicating short-circuit success. The iterator can be restarted at the
+        index of the next property.
+    Negative causes the iterator to immediately return that value, indicating
+        failure. The iterator can be restarted at the index of the next
+        property.
+
+H5Piterate assumes that the properties in the object identified by ID remains
+unchanged through the iteration.  If the membership changes during the
+iteration, the function's behavior is undefined.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5P_iterate_pclass(const H5P_genclass_t *pclass, int *idx,
+    H5P_iterate_int_t cb_func, void *udata)
+{
+    H5P_iter_pclass_ud_t udata_int; /* User data for skip list iterator */
+    int curr_idx = 0;           /* Current iteration index */
+    int ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(pclass);
+    HDassert(idx);
+    HDassert(cb_func);
+
+    /* Set up iterator callback info */
+    udata_int.cb_func = cb_func;
+    udata_int.udata = udata;
+    udata_int.curr_idx_ptr = &curr_idx;
+    udata_int.prev_idx = *idx;
+
+    /* Iterate over properties in property list class proper */
+    ret_value = H5SL_iterate(pclass->props, H5P__iterate_pclass_cb, &udata_int);
+    if(ret_value != 0)
+        HGOTO_DONE(ret_value);
+
+done:
+    /* Set the index we stopped at */
+    *idx = curr_idx;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_iterate_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_peek_unsigned
+ PURPOSE
+    Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+    int H5P_peek_unsigned(plist, name)
+        H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+ RETURNS
+    Directly returns the value of the property in the list
+ DESCRIPTION
+        This function directly returns the value of a property in a property
+    list.  Because this function is only able to just copy a particular property
+    value to the return value, there is no way to check for errors.  We attempt
+    to make certain that bad things don't happen by validating that the size of
+    the property is the same as the size of the return type, but that can't
+    catch all errors.
+        This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    No error checking!
+    Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+unsigned
+H5P_peek_unsigned(H5P_genplist_t *plist, const char *name)
+{
+    unsigned ret_value;            /* return value */
+
+    FUNC_ENTER_NOAPI(UFAIL)
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Get the value to return, don't worry about the return value, we can't return it */
+    H5P_get(plist,name,&ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_peek_unsigned() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_peek_hid_t
+ PURPOSE
+    Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+    hid_t H5P_peek_hid_t(plist, name)
+        H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+ RETURNS
+    Directly returns the value of the property in the list
+ DESCRIPTION
+        This function directly returns the value of a property in a property
+    list.  Because this function is only able to just copy a particular property
+    value to the return value, there is no way to check for errors.  We attempt
+    to make certain that bad things don't happen by validating that the size of
+    the property is the same as the size of the return type, but that can't
+    catch all errors.
+        This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    No error checking!
+    Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5P_peek_hid_t(H5P_genplist_t *plist, const char *name)
+{
+    hid_t ret_value;            /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Get the value to return, don't worry about the return value, we can't return it */
+    H5P_get(plist,name,&ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_peek_hid_t() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_peek_voidp
+ PURPOSE
+    Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+    void *H5P_peek_voidp(plist, name)
+        H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+ RETURNS
+    Directly returns the value of the property in the list
+ DESCRIPTION
+        This function directly returns the value of a property in a property
+    list.  Because this function is only able to just copy a particular property
+    value to the return value, there is no way to check for errors.  We attempt
+    to make certain that bad things don't happen by validating that the size of
+    the property is the same as the size of the return type, but that can't
+    catch all errors.
+        This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    No error checking!
+    Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5P_peek_voidp(H5P_genplist_t *plist, const char *name)
+{
+    void * ret_value;            /* return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Get the value to return, don't worry about the return value, we can't return it */
+    H5P_get(plist,name,&ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_peek_voidp() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_peek_size_t
+ PURPOSE
+    Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+    hsize_t H5P_peek_size_t(plist, name)
+        H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+ RETURNS
+    Directly returns the value of the property in the list
+ DESCRIPTION
+        This function directly returns the value of a property in a property
+    list.  Because this function is only able to just copy a particular property
+    value to the return value, there is no way to check for errors.  We attempt
+    to make certain that bad things don't happen by validating that the size of
+    the property is the same as the size of the return type, but that can't
+    catch all errors.
+        This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    No error checking!
+    Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+size_t
+H5P_peek_size_t(H5P_genplist_t *plist, const char *name)
+{
+    size_t ret_value;            /* return value */
+
+    FUNC_ENTER_NOAPI(UFAIL)
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Get the value to return, don't worry about the return value, we can't return it */
+    H5P_get(plist,name,&ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_peek_size_t() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get
+ PURPOSE
+    Internal routine to query the value of a property in a property list.
+ USAGE
+    herr_t H5P_get(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to query
+        void *value;            OUT: Pointer to the buffer for the property value
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Retrieves a copy of the value for a property in a property list.  The
+    property name must exist or this routine will fail.  If there is a
+    'get' callback routine registered for this property, the copy of the
+    value of the property will first be passed to that routine and any changes
+    to the copy of the value will be used when returning the property value
+    from this routine.
+        If the 'get' callback routine returns an error, 'value' will not be
+    modified and this routine will return an error.  This routine may not be
+    called for zero-sized properties.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_get(const H5P_genplist_t *plist, const char *name, void *value)
+{
+    H5P_genclass_t *tclass;     /* Temporary class pointer */
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(plist);
+    HDassert(name);
+    HDassert(value);
+
+    /* Check if the property has been deleted */
+    if(H5SL_search(plist->del,name)!=NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
+
+    /* Find property */
+    if((prop = (H5P_genprop_t *)H5SL_search(plist->props,name))!=NULL) {
+        /* Check for property size >0 */
+        if(prop->size==0)
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+        /* Make a copy of the value and pass to 'get' callback */
+        if(prop->get!=NULL) {
+            void *tmp_value;            /* Temporary value for property */
+
+            /* Make a copy of the current value, in case the callback fails */
+            if(NULL==(tmp_value=H5MM_malloc(prop->size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
+            HDmemcpy(tmp_value,prop->value,prop->size);
+
+            /* Call user's callback */
+            if((*(prop->get))(plist->plist_id,name,prop->size,tmp_value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't get property value")
+
+            /* Copy new [possibly unchanged] value into return value */
+            HDmemcpy(value,tmp_value,prop->size);
+
+            /* Free the temporary value buffer */
+            H5MM_xfree(tmp_value);
+        } /* end if */
+        /* No 'get' callback, just copy value */
+        else
+            HDmemcpy(value,prop->value,prop->size);
+    } /* end if */
+    else {
+        /*
+         * Check if we should get class properties (up through list of parent classes also),
+         * & make property 'get' callback.
+         */
+        tclass=plist->pclass;
+        while(tclass!=NULL) {
+            if(tclass->nprops>0) {
+                /* Find the property in the class */
+                if((prop = (H5P_genprop_t *)H5SL_search(tclass->props,name))!=NULL) {
+                    /* Check for property size >0 */
+                    if(prop->size==0)
+                        HGOTO_ERROR(H5E_PLIST,H5E_BADVALUE,FAIL,"property has zero size")
+
+                    /* Call the 'get' callback, if there is one */
+                    if(prop->get!=NULL) {
+                        void *tmp_value;            /* Temporary value for property */
+
+                        /* Make a copy of the current value, in case the callback fails */
+                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
+                        HDmemcpy(tmp_value,prop->value,prop->size);
+
+                        /* Call user's callback */
+                        if((*(prop->get))(plist->plist_id,name,prop->size,tmp_value) < 0) {
+                            H5MM_xfree(tmp_value);
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+                        } /* end if */
+
+                        if((prop->cmp)(tmp_value,prop->value,prop->size)) {
+                            H5P_genprop_t *pcopy;  /* Copy of property to insert into skip list */
+
+                            /* Make a copy of the class's property */
+                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
+                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
+
+                            /* Copy new value into property value */
+                            HDmemcpy(pcopy->value,tmp_value,prop->size);
+
+                            /* Insert the changed property into the property list */
+                            if(H5P_add_prop(plist->props,pcopy) < 0)
+                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
+                        } /* end if */
+
+                        /* Copy new [possibly unchanged] value into return value */
+                        HDmemcpy(value,tmp_value,prop->size);
+
+                        /* Free the temporary value buffer */
+                        H5MM_xfree(tmp_value);
+                    } /* end if */
+                    /* No 'get' callback, just copy value */
+                    else
+                        HDmemcpy(value,prop->value,prop->size);
+
+                    /* Leave */
+                    HGOTO_DONE(SUCCEED);
+                } /* end while */
+            } /* end if */
+
+            /* Go up to parent class */
+            tclass=tclass->parent;
+        } /* end while */
+
+        /* If we get this far, then it wasn't in the list of changed properties,
+         * nor in the properties in the class hierarchy, indicate an error
+         */
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_remove
+ PURPOSE
+    Internal routine to remove a property from a property list.
+ USAGE
+    herr_t H5P_remove(plist, name)
+        H5P_genplist_t *plist;  IN: Property list to modify
+        const char *name;       IN: Name of property to remove
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Removes a property from a property list.  Both properties which were
+    in existance when the property list was created (i.e. properties registered
+    with H5Pregister2) and properties added to the list after it was created
+    (i.e. added with H5Pinsert2) may be removed from a property list.
+    Properties do not need to be removed a property list before the list itself
+    is closed, they will be released automatically when H5Pclose is called.
+    The 'close' callback for this property is called before the property is
+    release, if the callback exists.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_remove(hid_t plist_id, H5P_genplist_t *plist, const char *name)
+{
+    H5P_genclass_t *tclass;     /* Temporary class pointer */
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    char *del_name;             /* Pointer to deleted name */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Indicate that the property isn't in the list if it has been deleted already */
+    if(H5SL_search(plist->del,name)!=NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+
+    /* Get the property node from the changed property skip list */
+    if((prop = (H5P_genprop_t *)H5SL_search(plist->props,name))!=NULL) {
+        /* Pass value to 'close' callback, if it exists */
+        if(prop->del!=NULL) {
+            /* Call user's callback */
+            if((*(prop->del))(plist_id,name,prop->size,prop->value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value")
+        } /* end if */
+
+        /* Duplicate string for insertion into new deleted property skip list */
+        if((del_name=H5MM_xstrdup(name)) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE,H5E_NOSPACE,FAIL,"memory allocation failed")
+
+        /* Insert property name into deleted list */
+        if(H5SL_insert(plist->del,del_name,del_name) < 0)
+            HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into deleted skip list")
+
+        /* Remove the property from the skip list */
+        if(H5SL_remove(plist->props,prop->name) == NULL)
+            HGOTO_ERROR(H5E_PLIST,H5E_CANTDELETE,FAIL,"can't remove property from skip list")
+
+        /* Free the property, ignoring return value, nothing we can do */
+        H5P_free_prop(prop);
+
+        /* Decrement the number of properties in list */
+        plist->nprops--;
+    } /* end if */
+    /* Walk through all the properties in the class hierarchy, looking for the property */
+    else {
+        /*
+         * Check if we should delete class properties (up through list of parent classes also),
+         * & make property 'delete' callback.
+         */
+        tclass=plist->pclass;
+        while(tclass!=NULL) {
+            if(tclass->nprops>0) {
+                /* Find the property in the class */
+                if((prop=H5P_find_prop_pclass(tclass,name))!=NULL) {
+                    /* Pass value to 'del' callback, if it exists */
+                    if(prop->del!=NULL) {
+                        void *tmp_value;       /* Temporary value buffer */
+
+                        /* Allocate space for a temporary copy of the property value */
+                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for temporary property value")
+                        HDmemcpy(tmp_value,prop->value,prop->size);
+
+                        /* Call user's callback */
+                        if((*(prop->del))(plist_id,name,prop->size,tmp_value) < 0) {
+                            H5MM_xfree(tmp_value);
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value")
+                        } /* end if */
+
+                        /* Release the temporary value buffer */
+                        H5MM_xfree(tmp_value);
+                    } /* end if */
+
+                    /* Duplicate string for insertion into new deleted property skip list */
+                    if((del_name=H5MM_xstrdup(name)) == NULL)
+                        HGOTO_ERROR(H5E_RESOURCE,H5E_NOSPACE,FAIL,"memory allocation failed")
+
+                    /* Insert property name into deleted list */
+                    if(H5SL_insert(plist->del,del_name,del_name) < 0)
+                        HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into deleted skip list")
+
+                    /* Decrement the number of properties in list */
+                    plist->nprops--;
+
+                    /* Leave */
+                    HGOTO_DONE(SUCCEED);
+                } /* end while */
+            } /* end if */
+
+            /* Go up to parent class */
+            tclass=tclass->parent;
+        } /* end while */
+
+        /* If we get this far, then it wasn't in the list of changed properties,
+         * nor in the properties in the class hierarchy, indicate an error
+         */
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_remove() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_copy_prop_plist
+ PURPOSE
+    Internal routine to copy a property from one list to another
+ USAGE
+    herr_t H5P_copy_prop_plist(dst_plist, src_plist, name)
+        hid_t dst_id;               IN: ID of destination property list or class
+        hid_t src_id;               IN: ID of source property list or class
+        const char *name;           IN: Name of property to copy
+ RETURNS
+    Success: non-negative value.
+    Failure: negative value.
+ DESCRIPTION
+    Copies a property from one property list to another.
+
+    If a property is copied from one list to another, the property will be
+    first deleted from the destination list (generating a call to the 'close'
+    callback for the property, if one exists) and then the property is copied
+    from the source list to the destination list (generating a call to the
+    'copy' callback for the property, if one exists).
+
+    If the property does not exist in the destination list, this call is
+    equivalent to calling H5Pinsert2 and the 'create' callback will be called
+    (if such a callback exists for the property).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_copy_prop_plist(hid_t dst_id, hid_t src_id, const char *name)
+{
+    H5P_genplist_t *dst_plist;      /* Pointer to destination property list */
+    H5P_genplist_t *src_plist;      /* Pointer to source property list */
+    H5P_genprop_t *prop;            /* Temporary property pointer */
+    H5P_genprop_t *new_prop=NULL;   /* Pointer to new property */
+    herr_t ret_value=SUCCEED;       /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(name);
+
+    /* Get the objects to operate on */
+    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_id)) || NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist")
+
+    /* If the property exists in the destination alread */
+    if(NULL != H5P__find_prop_plist(dst_plist, name)) {
+        /* Delete the property from the destination list, calling the 'close' callback if necessary */
+        if(H5P_remove(dst_id,dst_plist,name) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property")
+
+        /* Get the pointer to the source property */
+        prop = H5P__find_prop_plist(src_plist, name);
+
+        /* Make a copy of the source property */
+        if((new_prop=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
+
+        /* Call property copy callback, if it exists */
+        if(new_prop->copy) {
+            if((new_prop->copy)(new_prop->name,new_prop->size,new_prop->value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
+        } /* end if */
+
+        /* Insert the initialized property into the property list */
+        if(H5P_add_prop(dst_plist->props,new_prop) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into list")
+
+        /* Increment the number of properties in list */
+        dst_plist->nprops++;
+    } /* end if */
+    /* If not, get the information required to do an H5Pinsert2 with the property into the destination list */
+    else {
+        /* Get the pointer to the source property */
+        prop = H5P__find_prop_plist(src_plist, name);
+
+        /* Create property object from parameters */
+        if(NULL == (new_prop = H5P_create_prop(prop->name, prop->size, H5P_PROP_WITHIN_LIST, prop->value,
+                prop->create, prop->set, prop->get,
+                prop->del, prop->copy, prop->cmp, prop->close)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property")
+
+        /* Call property creation callback, if it exists */
+        if(new_prop->create) {
+            if((new_prop->create)(new_prop->name, new_prop->size, new_prop->value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Can't initialize property")
+        } /* end if */
+
+        /* Insert property into property list class */
+        if(H5P_add_prop(dst_plist->props, new_prop) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into class")
+
+        /* Increment property count for class */
+        dst_plist->nprops++;
+    } /* end else */
+
+done:
+    /* Cleanup, if necessary */
+    if(ret_value<0) {
+        if(new_prop!=NULL)
+            H5P_free_prop(new_prop);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_copy_prop_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_copy_prop_pclass
+ PURPOSE
+    Internal routine to copy a property from one class to another
+ USAGE
+    herr_t H5P_copy_prop_pclass(dst_pclass, src_pclass, name)
+        H5P_genclass_t	*dst_pclass;    IN: Pointer to destination class
+        H5P_genclass_t	*src_pclass;    IN: Pointer to source class
+        const char *name;               IN: Name of property to copy
+ RETURNS
+    Success: non-negative value.
+    Failure: negative value.
+ DESCRIPTION
+    Copies a property from one property class to another.
+
+    If a property is copied from one class to another, all the property
+    information will be first deleted from the destination class and then the
+    property information will be copied from the source class into the
+    destination class.
+
+    If the property does not exist in the destination class or list, this call
+    is equivalent to calling H5Pregister2.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_copy_prop_pclass(hid_t dst_id, hid_t src_id, const char *name)
+{
+    H5P_genclass_t *src_pclass;     /* Source property class, containing property to copy */
+    H5P_genclass_t *dst_pclass;     /* Destination property class */
+    H5P_genclass_t *orig_dst_pclass; /* Original destination property class */
+    H5P_genprop_t *prop;            /* Temporary property pointer */
+    herr_t ret_value = SUCCEED;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(name);
+
+    /* Get propery list classes */
+    if(NULL == (src_pclass = (H5P_genclass_t *)H5I_object(src_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "source property class object doesn't exist")
+    if(NULL == (dst_pclass = (H5P_genclass_t *)H5I_object(dst_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "destination property class object doesn't exist")
+
+    /* Get the property from the source */
+    if(NULL == (prop = H5P_find_prop_pclass(src_pclass, name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "unable to locate property")
+
+    /* If the property exists in the destination already */
+    if(H5P_exist_pclass(dst_pclass, name)) {
+        /* Delete the old property from the destination class */
+        if(H5P_unregister(dst_pclass, name) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property")
+    } /* end if */
+
+    /* Register the property into the destination */
+    orig_dst_pclass = dst_pclass;
+    if(H5P_register(&dst_pclass, name, prop->size, prop->value, prop->create, prop->set, prop->get,
+            prop->del, prop->copy, prop->cmp, prop->close) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property")
+
+    /* Check if the property class changed and needs to be substituted in the ID */
+    if(dst_pclass != orig_dst_pclass) {
+        H5P_genclass_t *old_dst_pclass;     /* Old destination property class */
+
+        /* Substitute the new destination property class in the ID */
+        if(NULL == (old_dst_pclass = (H5P_genclass_t *)H5I_subst(dst_id, dst_pclass)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to substitute property class in ID")
+        HDassert(old_dst_pclass == orig_dst_pclass);
+
+        /* Close the previous class */
+        if(H5P_close_class(old_dst_pclass) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "unable to close original property class after substitution")
+    } /* end if */
+
+done:
+    /* Cleanup, if necessary */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_copy_prop_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_unregister
+ PURPOSE
+    Internal routine to remove a property from a property list class.
+ USAGE
+    herr_t H5P_unregister(pclass, name)
+        H5P_genclass_t *pclass; IN: Property list class to modify
+        const char *name;       IN: Name of property to remove
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Removes a property from a property list class.  Future property lists
+    created of that class will not contain this property.  Existing property
+    lists containing this property are not affected.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_unregister(H5P_genclass_t *pclass, const char *name)
+{
+    H5P_genprop_t *prop;        /* Temporary property pointer */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+    HDassert(name);
+
+    /* Get the property node from the skip list */
+    if((prop = (H5P_genprop_t *)H5SL_search(pclass->props,name)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+
+    /* Remove the property from the skip list */
+    if(H5SL_remove(pclass->props,prop->name) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTDELETE,FAIL,"can't remove property from skip list")
+
+    /* Free the property, ignoring return value, nothing we can do */
+    H5P_free_prop(prop);
+
+    /* Decrement the number of registered properties in class */
+    pclass->nprops--;
+
+    /* Update the revision for the class */
+    pclass->revision = H5P_GET_NEXT_REV;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_unregister() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_close
+ PURPOSE
+    Internal routine to close a property list.
+ USAGE
+    herr_t H5P_close(plist)
+        H5P_genplist_t *plist;  IN: Property list to close
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Closes a property list.  If a 'close' callback exists for the property
+    list class, it is called before the property list is destroyed.  If 'close'
+    callbacks exist for any individual properties in the property list, they are
+    called after the class 'close' callback.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The property list class 'close' callback routine is not called from
+    here, it must have been check for and called properly prior to this routine
+    being called
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_close(void *_plist)
+{
+    H5P_genclass_t *tclass;         /* Temporary class pointer */
+    H5P_genplist_t *plist=(H5P_genplist_t *)_plist;
+    H5SL_t *seen=NULL;              /* Skip list to hold names of properties already seen */
+    size_t nseen;                   /* Number of items 'seen' */
+    hbool_t has_parent_class;       /* Flag to indicate that this property list's class has a parent */
+    size_t ndel;                    /* Number of items deleted */
+    H5SL_node_t *curr_node;         /* Current node in skip list */
+    H5P_genprop_t *tmp;             /* Temporary pointer to properties */
+    unsigned make_cb=0;             /* Operator data for property free callback */
+    herr_t ret_value=SUCCEED;       /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(plist);
+
+    /* Make call to property list class close callback, if needed
+     * (up through chain of parent classes also)
+     */
+    if(plist->class_init) {
+        tclass = plist->pclass;
+        while(NULL != tclass) {
+            if(NULL != tclass->close_func) {
+                /* Call user's "close" callback function, ignoring return value */
+                (tclass->close_func)(plist->plist_id, tclass->close_data);
+            } /* end if */
+
+            /* Go up to parent class */
+            tclass = tclass->parent;
+        } /* end while */
+    } /* end if */
+
+    /* Create the skip list to hold names of properties already seen
+     * (This prevents a property in the class hierarchy from having it's
+     * 'close' callback called, if a property in the class hierarchy has
+     * already been seen)
+     */
+    if((seen = H5SL_create(H5SL_TYPE_STR, NULL)) == NULL)
+        HGOTO_ERROR(H5E_PLIST,H5E_CANTCREATE,FAIL,"can't create skip list for seen properties")
+    nseen = 0;
+
+    /* Walk through the changed properties in the list */
+    if(H5SL_count(plist->props)>0) {
+        curr_node=H5SL_first(plist->props);
+        while(curr_node!=NULL) {
+            /* Get pointer to property from node */
+            tmp = (H5P_genprop_t *)H5SL_item(curr_node);
+
+            /* Call property close callback, if it exists */
+            if(tmp->close) {
+                /* Call the 'close' callback */
+                (tmp->close)(tmp->name,tmp->size,tmp->value);
+            } /* end if */
+
+            /* Add property name to "seen" list */
+            if(H5SL_insert(seen,tmp->name,tmp->name) < 0)
+                HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into seen skip list")
+            nseen++;
+
+            /* Get the next property node in the skip list */
+            curr_node=H5SL_next(curr_node);
+        } /* end while */
+    } /* end if */
+
+    /* Determine number of deleted items from property list */
+    ndel=H5SL_count(plist->del);
+
+    /*
+     * Check if we should remove class properties (up through list of parent classes also),
+     * initialize each with default value & make property 'remove' callback.
+     */
+    tclass=plist->pclass;
+    has_parent_class = (hbool_t)(tclass != NULL && tclass->parent != NULL && tclass->parent->nprops > 0);
+    while(tclass!=NULL) {
+        if(tclass->nprops>0) {
+            /* Walk through the properties in the class */
+            curr_node=H5SL_first(tclass->props);
+            while(curr_node!=NULL) {
+                /* Get pointer to property from node */
+                tmp = (H5P_genprop_t *)H5SL_item(curr_node);
+
+                /* Only "delete" properties we haven't seen before
+                 * and that haven't already been deleted
+                 */
+                if((nseen==0 || H5SL_search(seen,tmp->name) == NULL) &&
+                        (ndel==0 || H5SL_search(plist->del,tmp->name) == NULL)) {
+
+                    /* Call property close callback, if it exists */
+                    if(tmp->close) {
+                        void *tmp_value;       /* Temporary value buffer */
+
+                        /* Allocate space for a temporary copy of the property value */
+                        if(NULL==(tmp_value=H5MM_malloc(tmp->size)))
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for temporary property value")
+                        HDmemcpy(tmp_value,tmp->value,tmp->size);
+
+                        /* Call the 'close' callback */
+                        (tmp->close)(tmp->name,tmp->size,tmp_value);
+
+                        /* Release the temporary value buffer */
+                        H5MM_xfree(tmp_value);
+                    } /* end if */
+
+                    /* Add property name to "seen" list, if we have other classes to work on */
+                    if(has_parent_class) {
+                        if(H5SL_insert(seen,tmp->name,tmp->name) < 0)
+                            HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into seen skip list")
+                        nseen++;
+                    } /* end if */
+                } /* end if */
+
+                /* Get the next property node in the skip list */
+                curr_node=H5SL_next(curr_node);
+            } /* end while */
+        } /* end if */
+
+        /* Go up to parent class */
+        tclass=tclass->parent;
+    } /* end while */
+
+    /* Decrement class's dependant property list value! */
+    if(H5P_access_class(plist->pclass,H5P_MOD_DEC_LST) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "Can't decrement class ref count")
+
+    /* Free the list of 'seen' properties */
+    H5SL_close(seen);
+    seen=NULL;
+
+    /* Free the list of deleted property names */
+    H5SL_destroy(plist->del,H5P_free_del_name_cb,NULL);
+
+    /* Free the properties */
+    H5SL_destroy(plist->props,H5P_free_prop_cb,&make_cb);
+
+    /* Destroy property list object */
+    plist = H5FL_FREE(H5P_genplist_t, plist);
+
+done:
+    /* Release the skip list of 'seen' properties */
+    if(seen != NULL)
+        H5SL_close(seen);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_close() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_class_name
+ PURPOSE
+    Internal routine to query the name of a generic property list class
+ USAGE
+    char *H5P_get_class_name(pclass)
+        H5P_genclass_t *pclass;    IN: Property list class to check
+ RETURNS
+    Success: Pointer to a malloc'ed string containing the class name
+    Failure: NULL
+ DESCRIPTION
+        This routine retrieves the name of a generic property list class.
+    The pointer to the name must be free'd by the user for successful calls.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+char *
+H5P_get_class_name(H5P_genclass_t *pclass)
+{
+    char *ret_value;      /* return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(pclass);
+
+    /* Get class name */
+    ret_value=H5MM_xstrdup(pclass->name);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_class_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_class_path
+ PURPOSE
+    Internal routine to query the full path of a generic property list class
+ USAGE
+    char *H5P_get_class_name(pclass)
+        H5P_genclass_t *pclass;    IN: Property list class to check
+ RETURNS
+    Success: Pointer to a malloc'ed string containing the full path of class
+    Failure: NULL
+ DESCRIPTION
+        This routine retrieves the full path name of a generic property list
+    class, starting with the root of the class hierarchy.
+    The pointer to the name must be free'd by the user for successful calls.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+char *
+H5P_get_class_path(H5P_genclass_t *pclass)
+{
+    char *ret_value;    /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+
+    /* Recursively build the full path */
+    if(pclass->parent != NULL) {
+        char *par_path;     /* Parent class's full path */
+
+        /* Get the parent class's path */
+        par_path = H5P_get_class_path(pclass->parent);
+        if(par_path != NULL) {
+            size_t ret_str_len;
+
+            /* Allocate enough space for the parent class's path, plus the '/'
+             * separator, this class's name and the string terminator
+             */
+            ret_str_len = HDstrlen(par_path) + 1 + HDstrlen(pclass->name) + 1;
+            if(NULL == (ret_value = (char *)H5MM_malloc(ret_str_len)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for class name")
+
+            /* Build the full path for this class */
+            HDsnprintf(ret_value, ret_str_len, "%s/%s", par_path, pclass->name);
+
+            /* Free the parent class's path */
+            H5MM_xfree(par_path);
+        } /* end if */
+        else
+            ret_value = H5MM_xstrdup(pclass->name);
+    } /* end if */
+    else
+        ret_value = H5MM_xstrdup(pclass->name);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_class_path() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_open_class_path
+ PURPOSE
+    Internal routine to open [a copy of] a class with its full path name
+ USAGE
+    H5P_genclass_t *H5P_open_class_path(path)
+        const char *path;       IN: Full path name of class to open [copy of]
+ RETURNS
+    Success: Pointer to a generic property class object
+    Failure: NULL
+ DESCRIPTION
+    This routine opens [a copy] of the class indicated by the full path.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genclass_t *
+H5P_open_class_path(const char *path)
+{
+    char *tmp_path = NULL;      /* Temporary copy of the path */
+    char *curr_name;            /* Pointer to current component of path name */
+    char *delimit;              /* Pointer to path delimiter during traversal */
+    H5P_genclass_t *curr_class; /* Pointer to class during path traversal */
+    H5P_check_class_t check_info;   /* Structure to hold the information for checking duplicate names */
+    H5P_genclass_t *ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(path);
+
+    /* Duplicate the path to use */
+    tmp_path = H5MM_xstrdup(path);
+    HDassert(tmp_path);
+
+    /* Find the generic property class with this full path */
+    curr_name = tmp_path;
+    curr_class = NULL;
+    while(NULL != (delimit = HDstrchr(curr_name, '/'))) {
+        /* Change the delimiter to terminate the string */
+        *delimit = '\0';
+
+        /* Set up the search structure */
+        check_info.parent = curr_class;
+        check_info.name = curr_name;
+        check_info.new_class = NULL;
+
+        /* Find the class with this name & parent by iterating over the open classes */
+        if(H5I_iterate(H5I_GENPROP_CLS, H5P_open_class_path_cb, &check_info, FALSE) < 0)
+	    HGOTO_ERROR(H5E_PLIST, H5E_BADITER, NULL, "can't iterate over classes")
+	else if(NULL == check_info.new_class)
+	    HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, NULL, "can't locate class")
+
+        /* Advance the pointer in the path to the start of the next component */
+        curr_class = check_info.new_class;
+        curr_name = delimit + 1;
+    } /* end while */
+
+    /* Should be pointing to the last component in the path name now... */
+
+    /* Set up the search structure */
+    check_info.parent = curr_class;
+    check_info.name = curr_name;
+    check_info.new_class = NULL;
+
+    /* Find the class with this name & parent by iterating over the open classes */
+    if(H5I_iterate(H5I_GENPROP_CLS, H5P_open_class_path_cb, &check_info, FALSE) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADITER, NULL, "can't iterate over classes")
+    else if(NULL == check_info.new_class)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, NULL, "can't locate class")
+
+    /* Copy it */
+    if(NULL == (ret_value = H5P_copy_pclass(check_info.new_class)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, NULL, "can't copy property class")
+
+done:
+    /* Free the duplicated path */
+    H5MM_xfree(tmp_path);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5P_open_class_path() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_class_parent
+ PURPOSE
+    Internal routine to query the parent class of a generic property class
+ USAGE
+    H5P_genclass_t *H5P_get_class_parent(pclass)
+        H5P_genclass_t *pclass;    IN: Property class to check
+ RETURNS
+    Success: Pointer to the parent class of a property class
+    Failure: NULL
+ DESCRIPTION
+    This routine retrieves a pointer to the parent class for a property class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5P_genclass_t *
+H5P_get_class_parent(const H5P_genclass_t *pclass)
+{
+    H5P_genclass_t *ret_value;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pclass);
+
+    /* Get property size */
+    ret_value = pclass->parent;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_class_parent() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_close_class
+ PURPOSE
+    Internal routine to close a property list class.
+ USAGE
+    herr_t H5P_close_class(class)
+        H5P_genclass_t *class;  IN: Property list class to close
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Releases memory and de-attach a class from the property list class hierarchy.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_close_class(void *_pclass)
+{
+    H5P_genclass_t *pclass = (H5P_genclass_t *)_pclass;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pclass);
+
+    /* Decrement the reference count & check if the object should go away */
+    if(H5P_access_class(pclass, H5P_MOD_DEC_REF) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "can't decrement ID ref count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_close_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_plist_id
+ *
+ * Purpose:	Quick and dirty routine to retrieve property list ID from
+ *		property list structure.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5P_genplist_t data structure)
+ *
+ * Return:      Success:        Non-negative ID of property list.
+ *              Failure:        negative.
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		April 22, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5P_get_plist_id(const H5P_genplist_t *plist)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(plist);
+
+    FUNC_LEAVE_NOAPI(plist->plist_id)
+} /* end H5P_get_plist_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_class
+ *
+ * Purpose:	Quick and dirty routine to retrieve property list class from
+ *		property list structure.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5P_genplist_t data structure)
+ *
+ * Return:      Success:        Non-NULL class of property list.
+ *              Failure:        NULL
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		April 22, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+H5P_genclass_t *
+H5P_get_class(const H5P_genplist_t *plist)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(plist);
+
+    FUNC_LEAVE_NOAPI(plist->pclass)
+} /* end H5P_get_class() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Plapl.c b/gatb-core/thirdparty/hdf5/src/H5Plapl.c
new file mode 100644
index 0000000..7628a13
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Plapl.c
@@ -0,0 +1,908 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Plapl.c
+ *			July 14 2006
+ *			James Laird <jlaird at ncsa.uiuc.edu>
+ *
+ * Purpose:		Link access property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links		  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========  Link access properties ======== */
+/* Definitions for number of soft links to traverse */
+#define H5L_ACS_NLINKS_SIZE        sizeof(size_t)
+#define H5L_ACS_NLINKS_DEF         H5L_NUM_LINKS /*max symlinks to follow per lookup  */
+
+/* Definitions for external link prefix */
+#define H5L_ACS_ELINK_PREFIX_SIZE        sizeof(char *)
+#define H5L_ACS_ELINK_PREFIX_DEF         NULL /*default is no prefix */
+#define H5L_ACS_ELINK_PREFIX_DEL         H5P_lacc_elink_pref_del
+#define H5L_ACS_ELINK_PREFIX_COPY        H5P_lacc_elink_pref_copy
+#define H5L_ACS_ELINK_PREFIX_CMP         H5P_lacc_elink_pref_cmp
+#define H5L_ACS_ELINK_PREFIX_CLOSE       H5P_lacc_elink_pref_close
+
+/* Definitions for setting fapl of external link access */
+#define H5L_ACS_ELINK_FAPL_SIZE        	sizeof(hid_t)
+#define H5L_ACS_ELINK_FAPL_DEF         	H5P_DEFAULT
+#define H5L_ACS_ELINK_FAPL_DEL		H5P_lacc_elink_fapl_del
+#define H5L_ACS_ELINK_FAPL_COPY        	H5P_lacc_elink_fapl_copy
+#define H5L_ACS_ELINK_FAPL_CMP        	H5P_lacc_elink_fapl_cmp
+#define H5L_ACS_ELINK_FAPL_CLOSE       	H5P_lacc_elink_fapl_close
+
+/* Definitions for file access flags for external link traversal */
+#define H5L_ACS_ELINK_FLAGS_SIZE        sizeof(unsigned)
+#define H5L_ACS_ELINK_FLAGS_DEF         H5F_ACC_DEFAULT
+
+/* Definitions for callback function for external link traversal */
+#define H5L_ACS_ELINK_CB_SIZE           sizeof(H5L_elink_cb_t)
+#define H5L_ACS_ELINK_CB_DEF            {NULL,NULL}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P_lacc_reg_prop(H5P_genclass_t *pclass);
+
+/* Property list callbacks */
+static herr_t H5P_lacc_elink_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P_lacc_elink_pref_copy(const char* name, size_t size, void* value);
+static int H5P_lacc_elink_pref_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P_lacc_elink_pref_close(const char* name, size_t size, void* value);
+static herr_t H5P_lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P_lacc_elink_fapl_copy(const char* name, size_t size, void* value);
+static int H5P_lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P_lacc_elink_fapl_close(const char* name, size_t size, void* value);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Dataset creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_LACC[1] = {{
+    "link access",		/* Class name for debugging     */
+    H5P_TYPE_LINK_ACCESS,       /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_LINK_ACCESS_g,	/* Pointer to class             */
+    &H5P_CLS_LINK_ACCESS_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_LINK_ACCESS_ID_g,	/* Pointer to default property list ID */
+    H5P_lacc_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_lacc_reg_prop
+ *
+ * Purpose:     Register the dataset creation property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *
+ * Modifications:
+ *	Vailin Choi, Sept. 12th 2008
+ *	Register the setting of file access property list for link access
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_lacc_reg_prop(H5P_genclass_t *pclass)
+{
+    size_t nlinks = H5L_ACS_NLINKS_DEF; 	   /* Default number of soft links to traverse */
+    char *elink_prefix = H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */
+    hid_t def_fapl_id = H5L_ACS_ELINK_FAPL_DEF;    /* Default fapl for external link access */
+    unsigned elink_flags = H5L_ACS_ELINK_FLAGS_DEF; /* Default file access flags for external link traversal */
+    H5L_elink_cb_t elink_cb = H5L_ACS_ELINK_CB_DEF; /* Default external link traversal callback */
+
+    herr_t ret_value = SUCCEED;         	   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Register property for number of links traversed */
+    if(H5P_register_real(pclass, H5L_ACS_NLINKS_NAME, H5L_ACS_NLINKS_SIZE, &nlinks, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register property for external link prefix */
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_PREFIX_NAME, H5L_ACS_ELINK_PREFIX_SIZE, &elink_prefix, NULL, NULL, NULL, H5L_ACS_ELINK_PREFIX_DEL, H5L_ACS_ELINK_PREFIX_COPY, H5L_ACS_ELINK_PREFIX_CMP, H5L_ACS_ELINK_PREFIX_CLOSE) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register fapl for link access */
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &def_fapl_id, NULL, NULL, NULL, H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY, H5L_ACS_ELINK_FAPL_CMP, H5L_ACS_ELINK_FAPL_CLOSE) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register property for external link file access flags */
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_FLAGS_NAME, H5L_ACS_ELINK_FLAGS_SIZE, &elink_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register property for external link file traversal callback */
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_CB_NAME, H5L_ACS_ELINK_CB_SIZE, &elink_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_reg_prop() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P_lacc_elink_fapl_del
+ *
+ * Purpose:	Close the FAPL for link access
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi
+ *		Tuesday, Sept 23, 2008
+ *
+ *--------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_lacc_elink_fapl_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    hid_t          l_fapl_id;
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(value);
+
+    l_fapl_id = (*(const hid_t *)value);
+
+    if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_elink_fapl_del() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P_lacc_elink_fapl_copy
+ *
+ * Purpose:	Copy the FAPL for link access
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi
+ *		Tuesday, Sept 23, 2008
+ *
+ *--------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_lacc_elink_fapl_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    hid_t          l_fapl_id;
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(value);
+
+    l_fapl_id = (*(const hid_t *)value);
+
+    if(l_fapl_id > H5P_DEFAULT) {
+        H5P_genplist_t *l_fapl_plist;
+
+        if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+	if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+	    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_elink_fapl_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_lacc_elink_fapl_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the elink FAPL
+ *                 property in the link access property list is
+ *                 compared.
+ *
+ * Return:         zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P_lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+    const hid_t *fapl1 = (const hid_t *)value1;
+    const hid_t *fapl2 = (const hid_t *)value2;
+    H5P_genplist_t *obj1, *obj2;          /* Property lists to compare */
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check for comparison with default value */
+    if(*fapl1 == 0 && *fapl2 > 0) HGOTO_DONE(1);
+    if(*fapl1 > 0 && *fapl2 == 0) HGOTO_DONE(-1);
+
+    /* Get the property list objects */
+    obj1 = (H5P_genplist_t *)H5I_object(*fapl1);
+    obj2 = (H5P_genplist_t *)H5I_object(*fapl2);
+
+    /* Check for NULL property lists */
+    if(obj1 == NULL && obj2 != NULL) HGOTO_DONE(1);
+    if(obj1 != NULL && obj2 == NULL) HGOTO_DONE(-1);
+    if(obj1 && obj2) {
+        herr_t status;
+
+        status = H5P_cmp_plist(obj1, obj2, &ret_value);
+        HDassert(status >= 0);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_elink_fapl_cmp() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P_lacc_elink_fapl_close
+ *
+ * Purpose:	Close the FAPL for link access
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi
+ *		Tuesday, Sept 23, 2008
+ *
+ *---------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_lacc_elink_fapl_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    hid_t		l_fapl_id;
+    herr_t     		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(value);
+
+    l_fapl_id = (*(const hid_t *)value);
+    if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_elink_fapl_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_lacc_elink_pref_del
+ *
+ * Purpose:     Frees memory used to store the external link prefix string
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_lacc_elink_pref_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_lacc_elink_pref_copy
+ *
+ * Purpose:     Creates a copy of the external link prefix string
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_lacc_elink_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_lacc_elink_pref_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_lacc_elink_pref_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the elink prefix
+ *                 property in the dataset creation property list is
+ *                 compared.
+ *
+ * Return:         zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Thursday, November 3, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P_lacc_elink_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+    const char *pref1 = *(const char * const *)value1;
+    const char *pref2 = *(const char * const *)value2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(NULL == pref1 && NULL != pref2)
+        HGOTO_DONE(1);
+    if(NULL != pref1 && NULL == pref2)
+        HGOTO_DONE(-1);
+    if(NULL != pref1 && NULL != pref2)
+        ret_value = HDstrcmp(pref1, pref2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lacc_elink_pref_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_lacc_elink_pref_close
+ *
+ * Purpose:     Frees memory used to store the external link prefix string
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P_lacc_elink_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_lacc_elink_pref_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_nlinks
+ *
+ * Purpose:     Set the number of soft or UD link traversals allowed before
+ *              the library assumes it has found a cycle and aborts the
+ *              traversal.
+ *
+ *              The limit on soft or UD link traversals is designed to
+ *              terminate link traversal if one or more links form a cycle.
+ *              However, users may have a file with a legitimate path
+ *              formed of a large number of soft or user-defined links.
+ *              This property can be used to allow traversal of as many
+ *              links as desired.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Friday, July 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_nlinks(hid_t plist_id, size_t nlinks)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", plist_id, nlinks);
+
+    if(nlinks <= 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "number of links must be positive");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set number of links */
+    if(H5P_set(plist, H5L_ACS_NLINKS_NAME, &nlinks) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set nlink info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_nlinks() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_nlinks
+ *
+ * Purpose:	Gets the number of soft or user-defined links that can be
+ *              traversed before a failure occurs.
+ *
+ *              Retrieves the current setting for the nlinks property on
+ *              the given property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Friday, July 14, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_nlinks(hid_t plist_id, size_t *nlinks)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*z", plist_id, nlinks);
+
+    if(!nlinks)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer passed in");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the current number of links */
+    if(H5P_get(plist, H5L_ACS_NLINKS_NAME, nlinks) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of links")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_elink_prefix
+ *
+ * Purpose:     Set a prefix to be applied to the path of any external links
+ *              traversed.  The prefix is appended to the filename stored
+ *              in the external link.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Thursday, August 3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_elink_prefix(hid_t plist_id, const char *prefix)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char *my_prefix;                    /* Copy of prefix string */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", plist_id, prefix);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get current prefix value */
+    if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get prefix info")
+
+    /* Free existing prefix, if there is one */
+    H5MM_xfree(my_prefix);
+
+    /* Make a copy of the user's prefix string */
+    if(NULL == (my_prefix = H5MM_xstrdup(prefix)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy prefix")
+
+    /* Set prefix */
+    if(H5P_set(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set prefix info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_elink_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_elink_prefix
+ *
+ * Purpose:	Gets the prefix to be applied to any external link
+ *              traversals made using this property list.
+ *
+ *              If the pointer is not NULL, it points to a user-allocated
+ *              buffer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Thursday, August 3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char *my_prefix;                    /* Library's copy of the prefix */
+    size_t	len;                    /* Length of prefix string */
+    ssize_t 	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "i*sz", plist_id, prefix, size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the current prefix */
+    if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external link prefix")
+
+    /* Check for prefix being set */
+    if(my_prefix) {
+        /* Copy to user's buffer, if given */
+        len = HDstrlen(my_prefix);
+        if(prefix) {
+            HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
+            if(len >= size)
+                prefix[size - 1] = '\0';
+        } /* end if */
+    } /* end if */
+    else
+        len = 0;
+
+    /* Set return value */
+    ret_value = (ssize_t)len;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_elink_prefix() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_elink_fapl
+ *
+ * Purpose:     Sets the file access property list for link access
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:
+ *              Vailin Choi; Tuesday, September 12th, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id)
+{
+    H5P_genplist_t 	*plist, *fapl_plist;	/* Property list pointer */
+    hid_t		l_fapl_id, new_fapl_id;
+    herr_t 		ret_value = SUCCEED;         		/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ii", lapl_id, fapl_id);
+
+    /* Check arguments */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link access property list");
+
+    /* Get the current file access property list for the link access */
+    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl")
+
+    /* Close the current file access property list if set */
+    if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+
+    if(NULL == (fapl_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
+	HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access property list");
+
+    /* Make a copy of the property list for FAPL_ID */
+    if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy file access properties")
+
+    /* Set the file access property list for the link access */
+    if(H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &new_fapl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fapl for link")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_elink_fapl() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_elink_fapl
+ *
+ * Purpose:	Gets the file access property list identifier that is
+ *		set for link access property.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:
+ *              Vailin Choi; Tuesday, September 12th, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Pget_elink_fapl(hid_t lapl_id)
+{
+    H5P_genplist_t 	*plist, *fapl_plist; 	/* Property list pointer */
+    hid_t		l_fapl_id;
+    hid_t		ret_value=FAIL;		/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", lapl_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links")
+
+    if(l_fapl_id > H5P_DEFAULT) {
+	if(NULL==(fapl_plist = H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
+
+	if((ret_value = H5P_copy_plist(fapl_plist, TRUE)) < 0)
+	    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
+    } else
+	ret_value = l_fapl_id;
+
+done:
+    FUNC_LEAVE_API(ret_value);
+} /* end H5Pget_elink_fapl() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_elink_acc_flags
+ *
+ * Purpose:     Sets the file access flags to be used when traversing an
+ *              external link.  This should be either H5F_ACC_RDONLY or
+ *              H5F_ACC_RDWR, or H5F_ACC_DEFAULT to unset the value.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 9, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_elink_acc_flags(hid_t lapl_id, unsigned flags)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", lapl_id, flags);
+
+    /* Check that flags are valid */
+    if((flags != H5F_ACC_RDWR) && (flags != H5F_ACC_RDONLY) && (flags != H5F_ACC_DEFAULT))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set flags */
+    if(H5P_set(plist, H5L_ACS_ELINK_FLAGS_NAME, &flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set access flags")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_elink_acc_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_elink_acc_flags
+ *
+ * Purpose:     Gets the file access flags to be used when traversing an
+ *              external link.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 9, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", lapl_id, flags);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get flags */
+    if (flags)
+        if(H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, flags)<0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "can't get access flags")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_elink_acc_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_elink_cb
+ *
+ * Purpose:     Sets the file access flags to be used when traversing an
+ *              external link.  This should be either H5F_ACC_RDONLY or
+ *              H5F_ACC_RDWR.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 15, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_elink_cb(hid_t lapl_id, H5L_elink_traverse_t func, void *op_data)
+{
+    H5P_genplist_t  *plist;                 /* Property list pointer */
+    H5L_elink_cb_t  cb_info;                /* Callback info struct */
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ix*x", lapl_id, func, op_data);
+
+    /* Check if the callback function is NULL and the user data is non-NULL.
+     * This is almost certainly an error as the user data will not be used. */
+    if(!func && op_data)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback is NULL while user data is not")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Populate the callback info struct */
+    cb_info.func = func;
+    cb_info.user_data = op_data;
+
+    /* Set callback info */
+    if(H5P_set(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set callback info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_elink_acc_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_elink_cb
+ *
+ * Purpose:     Gets the file access flags to be used when traversing an
+ *              external link.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, December 15, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data)
+{
+    H5P_genplist_t  *plist;                 /* Property list pointer */
+    H5L_elink_cb_t  cb_info;                /* Callback info struct */
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x**x", lapl_id, func, op_data);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get callback_info */
+    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info)<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get callback info")
+
+    if(func)
+        *func = cb_info.func;
+
+    if(op_data)
+        *op_data = cb_info.user_data;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_elink_cb() */
+
+

diff --git a/gatb-core/thirdparty/hdf5/src/H5Plcpl.c b/gatb-core/thirdparty/hdf5/src/H5Plcpl.c
new file mode 100644
index 0000000..21ee74b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Plcpl.c
@@ -0,0 +1,204 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Plcpl.c
+ *			May  8 2006
+ *			Peter Cao <xcao at ncsa.uiuc.edu>
+ *
+ * Purpose:		Link creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Lprivate.h"		/* Links        		  	*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========  Link creation properties ======== */
+/* Definitions for create intermediate groups flag */
+#define H5L_CRT_INTERMEDIATE_GROUP_SIZE         sizeof(unsigned)
+#define H5L_CRT_INTERMEDIATE_GROUP_DEF          0
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P_lcrt_reg_prop(H5P_genclass_t *pclass);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Link creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_LCRT[1] = {{
+    "link create",		/* Class name for debugging     */
+    H5P_TYPE_LINK_CREATE,       /* Class type                   */
+
+    &H5P_CLS_STRING_CREATE_g,	/* Parent class                 */
+    &H5P_CLS_LINK_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_LINK_CREATE_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_LINK_CREATE_ID_g,	/* Pointer to default property list ID */
+    H5P_lcrt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_lcrt_reg_prop
+ *
+ * Purpose:     Register the dataset creation property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_lcrt_reg_prop(H5P_genclass_t *pclass)
+{
+    unsigned intmd_group = H5L_CRT_INTERMEDIATE_GROUP_DEF;      /* Default setting for creating intermediate groups */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Register create intermediate groups property */
+    if(H5P_register_real(pclass, H5L_CRT_INTERMEDIATE_GROUP_NAME, H5L_CRT_INTERMEDIATE_GROUP_SIZE, &intmd_group, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_lcrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_create_intermediate_group
+ *
+ * Purpose:     set crt_intmd_group so that H5Lcreate_*, H5Olink, etc.
+ *              will create missing groups along the given path "name"
+ *
+ * Note:        XXX: This property should really be an access property. -QAK
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              May 08, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_create_intermediate_group(hid_t plist_id, unsigned crt_intmd_group)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, crt_intmd_group);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    crt_intmd_group = (unsigned)(crt_intmd_group > 0 ? 1 : 0);
+    if(H5P_set(plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, &crt_intmd_group) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set intermediate group creation flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_create_intermediate_group() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_create_intermediate_group
+ *
+ * Purpose:     Returns the crt_intmd_group, which is set to create missing
+ *              groups during H5Olink, etc.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              May 08, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_create_intermediate_group(hid_t plist_id, unsigned *crt_intmd_group /*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, crt_intmd_group);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(crt_intmd_group)
+        if(H5P_get(plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, crt_intmd_group) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get intermediate group creation flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_create_intermediate_group() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pocpl.c b/gatb-core/thirdparty/hdf5/src/H5Pocpl.c
new file mode 100644
index 0000000..74b0bc7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pocpl.c
@@ -0,0 +1,1679 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pocpl.c
+ *			Nov 28 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Object creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+#include "H5PLprivate.h"	/* Dynamic plugin			*/
+#include "H5Zprivate.h"	        /* Filter pipeline			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========= Object Creation properties ============ */
+/* Definitions for the max. # of attributes to store compactly */
+#define H5O_CRT_ATTR_MAX_COMPACT_SIZE   sizeof(unsigned)
+/* Definitions for the min. # of attributes to store densely */
+#define H5O_CRT_ATTR_MIN_DENSE_SIZE     sizeof(unsigned)
+/* Definitions for object header flags */
+#define H5O_CRT_OHDR_FLAGS_SIZE         sizeof(uint8_t)
+/* Definitions for filter pipeline */
+#define H5O_CRT_PIPELINE_SIZE sizeof(H5O_pline_t)
+#define H5O_CRT_PIPELINE_CMP            H5P__ocrt_pipeline_cmp
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P__ocrt_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P__ocrt_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
+static herr_t H5P__ocrt_close(hid_t dxpl_id, void *close_data);
+
+/* Property callbacks */
+static int H5P__ocrt_pipeline_cmp(const void *value1, const void *value2, size_t size);
+
+/* Local routines */
+static herr_t H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, 
+    unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/]);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Object creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_OCRT[1] = {{
+    "object create",		/* Class name for debugging     */
+    H5P_TYPE_OBJECT_CREATE,     /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_OBJECT_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_OBJECT_CREATE_ID_g,	/* Pointer to class ID          */
+    NULL,			/* Pointer to default property list ID */
+    H5P__ocrt_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    H5P__ocrt_copy,		/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    H5P__ocrt_close,		/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocrt_reg_prop
+ *
+ * Purpose:     Initialize the object creation property list class
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_reg_prop(H5P_genclass_t *pclass)
+{
+    unsigned attr_max_compact = H5O_CRT_ATTR_MAX_COMPACT_DEF;   /* Default max. compact attribute storage settings */
+    unsigned attr_min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF;       /* Default min. dense attribute storage settings */
+    uint8_t ohdr_flags = H5O_CRT_OHDR_FLAGS_DEF;        /* Default object header flag settings */
+    H5O_pline_t pline = H5O_CRT_PIPELINE_DEF;           /* Default I/O pipeline setting */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register max. compact attribute storage property */
+    if(H5P_register_real(pclass, H5O_CRT_ATTR_MAX_COMPACT_NAME, H5O_CRT_ATTR_MAX_COMPACT_SIZE, &attr_max_compact, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register min. dense attribute storage property */
+    if(H5P_register_real(pclass, H5O_CRT_ATTR_MIN_DENSE_NAME, H5O_CRT_ATTR_MIN_DENSE_SIZE, &attr_min_dense, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register object header flags property */
+    if(H5P_register_real(pclass, H5O_CRT_OHDR_FLAGS_NAME, H5O_CRT_OHDR_FLAGS_SIZE, &ohdr_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the pipeline property */
+    if(H5P_register_real(pclass, H5O_CRT_PIPELINE_NAME, H5O_CRT_PIPELINE_SIZE, &pline, NULL, NULL, NULL, NULL, NULL, H5O_CRT_PIPELINE_CMP, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocrt_copy
+ *
+ * Purpose:        Callback routine which is called whenever any object
+ *                 creation property list is copied.  This routine copies
+ *                 the properties from the old list to the new list.
+ *
+ * Return:         Success:        Non-negative
+ *                 Failure:        Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Monday, September 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__ocrt_copy(hid_t dst_plist_id, hid_t src_plist_id, void H5_ATTR_UNUSED *copy_data)
+{
+    H5O_pline_t    src_pline, dst_pline;        /* Source & destination pipelines */
+    H5P_genplist_t *src_plist;                  /* Pointer to source property list */
+    H5P_genplist_t *dst_plist;                  /* Pointer to destination property list */
+    herr_t         ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Verify property list IDs */
+    if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_plist_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
+    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_plist_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
+
+    /* Get the link pipeline property from the old property list */
+    if(H5P_get(src_plist, H5O_CRT_PIPELINE_NAME, &src_pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Make copy of link pipeline */
+    if(NULL == H5O_msg_copy(H5O_PLINE_ID, &src_pline, &dst_pline))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy link pipeline")
+
+    /* Set the link pipeline property for the destination property list */
+    if(H5P_set(dst_plist, H5O_CRT_PIPELINE_NAME, &dst_pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P__ocrt_close
+ *
+ * Purpose:	Callback routine which is called whenever any object create
+ *              property list is closed.  This routine performs any generic
+ *              cleanup needed on the properties the library put into the list.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Monday, September 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__ocrt_close(hid_t dcpl_id, void H5_ATTR_UNUSED *close_data)
+{
+    H5O_pline_t     pline;              /* I/O pipeline */
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
+
+    /* Get the link pipeline property from the old property list */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Clean up any values set for the link pipeline */
+    if(H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't release pipeline info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_attr_phase_change
+ *
+ * Purpose:	Sets the cutoff values for indexes storing attributes
+ *              in object headers for this file.  If more than max_compact
+ *              attributes are in an object header, the attributes will be
+ *              moved to a heap and indexed with a B-tree.
+ *              Likewise, an object header containing fewer than min_dense
+ *              attributes will be converted back to storing the attributes
+ *              directly in the object header.
+ *
+ *              If the max_compact is zero then attributes for this object will
+ *              never be stored in the object header but will be always be
+ *              stored in a heap.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, November 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_attr_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIuIu", plist_id, max_compact, min_dense);
+
+    /* Range check values */
+    if(max_compact < min_dense)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be >= min dense value")
+    if(max_compact > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be < 65536")
+    if(min_dense > 65535)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "min dense value must be < 65536")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set property values */
+    if(H5P_set(plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, &max_compact) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set max. # of compact attributes in property list")
+    if(H5P_set(plist, H5O_CRT_ATTR_MIN_DENSE_NAME, &min_dense) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set min. # of dense attributes in property list")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_attr_phase_change */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_attr_phase_change
+ *
+ * Purpose:	Gets the phase change values for attribute storage
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, November 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_attr_phase_change(hid_t plist_id, unsigned *max_compact, unsigned *min_dense)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*Iu*Iu", plist_id, max_compact, min_dense);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(max_compact) {
+        if(H5P_get(plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, max_compact) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get max. # of compact attributes")
+    } /* end if */
+    if(min_dense) {
+        if(H5P_get(plist, H5O_CRT_ATTR_MIN_DENSE_NAME, min_dense) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get min. # of dense attributes")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_attr_phase_change() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_attr_creation_order
+ *
+ * Purpose:     Set the flags for creation order of attributes on an object
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    uint8_t ohdr_flags;                 /* Object header flags */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, crt_order_flags);
+
+    /* Check for bad combination of flags */
+    if(!(crt_order_flags & H5P_CRT_ORDER_TRACKED) && (crt_order_flags & H5P_CRT_ORDER_INDEXED))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tracking creation order is required for index")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get object header flags */
+    if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+    /* Mask off previous attribute creation order flag settings */
+    ohdr_flags &= (uint8_t)~(H5O_HDR_ATTR_CRT_ORDER_TRACKED | H5O_HDR_ATTR_CRT_ORDER_INDEXED);
+
+    /* Update with new attribute creation order flags */
+    ohdr_flags = (uint8_t)(ohdr_flags | ((crt_order_flags & H5P_CRT_ORDER_TRACKED) ? H5O_HDR_ATTR_CRT_ORDER_TRACKED : 0));
+    ohdr_flags = (uint8_t)(ohdr_flags | ((crt_order_flags & H5P_CRT_ORDER_INDEXED) ? H5O_HDR_ATTR_CRT_ORDER_INDEXED : 0));
+
+    /* Set object header flags */
+    if(H5P_set(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_attr_creation_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_attr_creation_order
+ *
+ * Purpose:     Returns the flags indicating creation order is tracked/indexed
+ *              for attributes on an object.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              February  6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Iu", plist_id, crt_order_flags);
+
+    /* Get values */
+    if(crt_order_flags) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        uint8_t ohdr_flags;         /* Object header flags */
+
+        /* Reset the value to return */
+        *crt_order_flags = 0;
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get object header flags */
+        if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+        /* Set creation order flags to return */
+        *crt_order_flags |= (ohdr_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED) ? H5P_CRT_ORDER_TRACKED : 0;
+        *crt_order_flags |= (ohdr_flags & H5O_HDR_ATTR_CRT_ORDER_INDEXED) ? H5P_CRT_ORDER_INDEXED : 0;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_attr_creation_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_obj_track_times
+ *
+ * Purpose:     Set whether the birth, access, modification & change times for
+ *              an object are stored.
+ *
+ *              Birth time is the time the object was created.  Access time is
+ *              the last time that metadata or raw data was read from this
+ *              object.  Modification time is the last time the data for
+ *              this object was changed (either writing raw data to a dataset
+ *              or inserting/modifying/deleting a link in a group).  Change
+ *              time is the last time the metadata for this object was written
+ *              (adding/modifying/deleting an attribute on an object, extending
+ *              the size of a dataset, etc).
+ *
+ *              If these times are not tracked, they will be reported as
+ *              12:00 AM UDT, Jan. 1, 1970 (i.e. 0 seconds past the UNIX
+ *              epoch) when queried.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              March  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_obj_track_times(hid_t plist_id, hbool_t track_times)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    uint8_t ohdr_flags;                 /* Object header flags */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ib", plist_id, track_times);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get object header flags */
+    if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+    /* Mask off previous time tracking flag settings */
+    ohdr_flags &= (uint8_t)~H5O_HDR_STORE_TIMES;
+
+    /* Update with new time tracking flag */
+    ohdr_flags = (uint8_t)(ohdr_flags | (track_times ? H5O_HDR_STORE_TIMES : 0));
+
+    /* Set object header flags */
+    if(H5P_set(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_obj_track_times() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_obj_track_times
+ *
+ * Purpose:     Returns whether times are tracked for an object.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              March  1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_obj_track_times(hid_t plist_id, hbool_t *track_times)
+{
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*b", plist_id, track_times);
+
+    /* Get values */
+    if(track_times) {
+        H5P_genplist_t *plist;      /* Property list pointer */
+        uint8_t ohdr_flags;         /* Object header flags */
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Get object header flags */
+        if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+        /* Set track times flag to return */
+        *track_times = (hbool_t)((ohdr_flags & H5O_HDR_STORE_TIMES) ? TRUE : FALSE);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_obj_track_times() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_modify_filter
+ *
+ * Purpose:	Modifies the specified FILTER in the
+ *		transient or permanent output filter pipeline
+ *		depending on whether PLIST is a dataset creation or dataset
+ *		transfer property list.  The FLAGS argument specifies certain
+ *		general properties of the filter and is documented below.
+ *		The CD_VALUES is an array of CD_NELMTS integers which are
+ *		auxiliary data for the filter.  The integer vlues will be
+ *		stored in the dataset object header as part of the filter
+ *		information.
+ *
+ * 		The FLAGS argument is a bit vector of the following fields:
+ *
+ * 		H5Z_FLAG_OPTIONAL(0x0001)
+ *		If this bit is set then the filter is optional.  If the
+ *		filter fails during an H5Dwrite() operation then the filter
+ *		is just excluded from the pipeline for the chunk for which it
+ *		failed; the filter will not participate in the pipeline
+ *		during an H5Dread() of the chunk.  If this bit is clear and
+ *		the filter fails then the entire I/O operation fails.
+ *      If this bit is set but encoding is disabled for a filter,
+ *      attempting to write will generate an error.
+ *
+ * Note:	This function currently supports only the permanent filter
+ *		pipeline.  That is, PLIST_ID must be a dataset creation
+ *		property list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_modify_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned flags,
+    size_t cd_nelmts, const unsigned cd_values[/*cd_nelmts*/])
+{
+    H5O_pline_t         pline;
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the pipeline property to modify */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Modify the filter parameters of the I/O pipeline */
+    if(H5Z_modify(&pline, filter, flags, cd_nelmts, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
+
+    /* Put the I/O pipeline information back into the property list */
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_modify_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pmodify_filter
+ *
+ * Purpose:     Modifies the specified FILTER in the
+ *              transient or permanent output filter pipeline
+ *              depending on whether PLIST is a dataset creation or dataset
+ *              transfer property list.  The FLAGS argument specifies certain
+ *              general properties of the filter and is documented below.
+ *              The CD_VALUES is an array of CD_NELMTS integers which are
+ *              auxiliary data for the filter.  The integer vlues will be
+ *              stored in the dataset object header as part of the filter
+ *              information.
+ *
+ *              The FLAGS argument is a bit vector of the following fields:
+ *
+ *              H5Z_FLAG_OPTIONAL(0x0001)
+ *              If this bit is set then the filter is optional.  If the
+ *              filter fails during an H5Dwrite() operation then the filter
+ *              is just excluded from the pipeline for the chunk for which it
+ *              failed; the filter will not participate in the pipeline
+ *              during an H5Dread() of the chunk.  If this bit is clear and
+ *              the filter fails then the entire I/O operation fails.
+ *      If this bit is set but encoding is disabled for a filter,
+ *      attempting to write will generate an error.
+ *
+ * Note:        This function currently supports only the permanent filter
+ *              pipeline.  That is, PLIST_ID must be a dataset creation
+ *              property list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Thursday, March 26, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pmodify_filter(hid_t plist_id, H5Z_filter_t filter, unsigned int flags,
+               size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/])
+{
+    H5P_genplist_t  *plist;                 /* Property list */
+    herr_t          ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iZfIuz*[a3]Iu", plist_id, filter, flags, cd_nelmts, cd_values);
+
+    /* Check args */
+    if (filter<0 || filter>H5Z_FILTER_MAX)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identifier")
+    if (flags & ~((unsigned)H5Z_FLAG_DEFMASK))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
+    if (cd_nelmts>0 && !cd_values)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no client data values supplied")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+
+    /* Modify the filter parameters of the I/O pipeline */
+    if(H5P_modify_filter(plist, filter, flags, cd_nelmts, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't modify filter")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pmodify_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_filter
+ *
+ * Purpose:	Adds the specified FILTER and corresponding properties to the
+ *		end of the data or link output filter pipeline
+ *		depending on whether PLIST is a dataset creation or group
+ *		creation property list.  The FLAGS argument specifies certain
+ *		general properties of the filter and is documented below.
+ *		The CD_VALUES is an array of CD_NELMTS integers which are
+ *		auxiliary data for the filter.  The integer vlues will be
+ *		stored in the dataset object header as part of the filter
+ *		information.
+ *
+ * 		The FLAGS argument is a bit vector of the following fields:
+ *
+ * 		H5Z_FLAG_OPTIONAL(0x0001)
+ *		If this bit is set then the filter is optional.  If the
+ *		filter fails during an H5Dwrite() operation then the filter
+ *		is just excluded from the pipeline for the chunk for which it
+ *		failed; the filter will not participate in the pipeline
+ *		during an H5Dread() of the chunk.  If this bit is clear and
+ *		the filter fails then the entire I/O operation fails.
+ *      If this bit is set but encoding is disabled for a filter,
+ *      attempting to write will generate an error.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *              Neil Fortner
+ *              Wednesday, May 20, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_filter(hid_t plist_id, H5Z_filter_t filter, unsigned int flags,
+	       size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/])
+{
+    H5P_genplist_t  *plist;             /* Property list */
+    herr_t          ret_value=SUCCEED;  /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iZfIuz*[a3]Iu", plist_id, filter, flags, cd_nelmts, cd_values);
+
+    /* Check args */
+    if (filter<0 || filter>H5Z_FILTER_MAX)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identifier")
+    if (flags & ~((unsigned)H5Z_FLAG_DEFMASK))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
+    if (cd_nelmts>0 && !cd_values)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no client data values supplied")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Call the private function */
+    if(H5P__set_filter(plist, filter, flags, cd_nelmts, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "failed to call private function")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P__set_filter
+ *
+ * Purpose:	Adds the specified FILTER and corresponding properties to the
+ *		end of the data or link output filter pipeline
+ *		depending on whether PLIST is a dataset creation or group
+ *		creation property list.  The FLAGS argument specifies certain
+ *		general properties of the filter and is documented below.
+ *		The CD_VALUES is an array of CD_NELMTS integers which are
+ *		auxiliary data for the filter.  The integer vlues will be
+ *		stored in the dataset object header as part of the filter
+ *		information.
+ *
+ * 		The FLAGS argument is a bit vector of the following fields:
+ *
+ * 		H5Z_FLAG_OPTIONAL(0x0001)
+ *		If this bit is set then the filter is optional.  If the
+ *		filter fails during an H5Dwrite() operation then the filter
+ *		is just excluded from the pipeline for the chunk for which it
+ *		failed; the filter will not participate in the pipeline
+ *		during an H5Dread() of the chunk.  If this bit is clear and
+ *		the filter fails then the entire I/O operation fails.
+ *		If this bit is set but encoding is disabled for a filter,
+ *		attempting to write will generate an error.
+ *
+ *              If the filter is not registered, this function tries to load 
+ *              it dynamically during run time.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned int flags,
+	       size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/])
+{
+    H5O_pline_t     pline;                  /* Filter pipeline */
+    htri_t          filter_avail;           /* Filter availability */
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check if filter is already available */
+    if((filter_avail = H5Z_filter_avail(filter)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't check filter availability")
+
+    /* If filter is not available, try to dynamically load it */
+    if(!filter_avail) {
+        const H5Z_class2_t *filter_info;
+
+        if(NULL == (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)filter)))
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTLOAD, FAIL, "failed to load dynamically loaded plugin")
+        if(H5Z_register(filter_info) < 0)
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register dynamic filter")
+    } /* end if */
+
+    /* Get the pipeline property to append to */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Add the filter to the I/O pipeline */
+    if(H5Z_append(&pline, filter, flags, cd_nelmts, cd_values) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
+
+    /* Put the I/O pipeline information back into the property list */
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__set_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_nfilters
+ *
+ * Purpose:	Returns the number of filters in the data or link
+ *		pipeline depending on whether PLIST_ID is a dataset creation
+ *		or group creation property list.  In each pipeline the
+ *		filters are numbered from zero through N-1 where N is the
+ *		value returned by this function.  During output to the file
+ *		the filters of a pipeline are applied in increasing order
+ *		(the inverse is true for input).
+ *
+ * Return:	Success:	Number of filters or zero if there are none.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  4, 1998
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Wednesday, May 20, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_nfilters(hid_t plist_id)
+{
+    H5P_genplist_t  *plist;         /* Property list */
+    H5O_pline_t     pline;          /* Filter pipeline */
+    int             ret_value;      /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the pipeline property to query */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Set return value */
+    ret_value=(int)(pline.nused);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_nfilters */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_filter2
+ *
+ * Purpose:	This is the query counterpart of H5Pset_filter() and returns
+ *		information about a particular filter number in a permanent
+ *		or transient pipeline depending on whether PLIST_ID is a
+ *		dataset creation or transfer property list.  On input,
+ *		CD_NELMTS indicates the number of entries in the CD_VALUES
+ *		array allocated by the caller while on exit it contains the
+ *		number of values defined by the filter.  FILTER_CONFIG is a bit
+ *      field contaning encode/decode flags from H5Zpublic.h.  The IDX
+ *      should be a value between zero and N-1 as described for
+ *      H5Pget_nfilters() and the function will return failure if the
+ *      filter number is out of range.
+ *
+ * Return:	Success:	Filter identification number.
+ *
+ *		Failure:	H5Z_FILTER_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Wednesday, May 20, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_filter_t
+H5Pget_filter2(hid_t plist_id, unsigned idx, unsigned int *flags/*out*/,
+	       size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+	       size_t namelen, char name[]/*out*/,
+               unsigned *filter_config /*out*/)
+{
+    H5P_genplist_t  *plist;             /* Property list */
+    H5O_pline_t     pline;              /* Filter pipeline */
+    const H5Z_filter_info_t *filter;    /* Pointer to filter information */
+    H5Z_filter_t    ret_value;          /* return value */
+
+    FUNC_ENTER_API(H5Z_FILTER_ERROR)
+    H5TRACE8("Zf", "iIux*zxzxx", plist_id, idx, flags, cd_nelmts, cd_values,
+             namelen, name, filter_config);
+
+    /* Check args */
+    if(cd_nelmts || cd_values) {
+        /*
+         * It's likely that users forget to initialize this on input, so
+         * we'll check that it has a reasonable value.  The actual number
+         * is unimportant because the H5O layer will detect when a message
+         * is too large.
+         */
+        if(cd_nelmts && *cd_nelmts > 256)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "probable uninitialized *cd_nelmts argument")
+        if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "client data values not supplied")
+
+        /*
+         * If cd_nelmts is null but cd_values is non-null then just ignore
+         * cd_values
+         */
+        if(!cd_nelmts)
+            cd_values = NULL;
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
+
+    /* Get the pipeline property to query */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
+
+    /* Check index */
+    if(idx >= pline.nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "filter number is invalid")
+
+    /* Set pointer to particular filter to query */
+    filter = &pline.filter[idx];
+
+    /* Get filter information */
+    if(H5P_get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, filter_config) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get filter info")
+
+    /* Set return value */
+    ret_value = filter->id;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_filter2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_filter_by_id
+ *
+ * Purpose:	This is an additional query counterpart of H5Pset_filter() and
+ *              returns information about a particular filter in a permanent
+ *		or transient pipeline depending on whether PLIST_ID is a
+ *		dataset creation or transfer property list.  On input,
+ *		CD_NELMTS indicates the number of entries in the CD_VALUES
+ *		array allocated by the caller while on exit it contains the
+ *		number of values defined by the filter.  FILTER_CONFIG is a bit
+ *      field contaning encode/decode flags from H5Zpublic.h.  The ID
+ *      should be the filter ID to retrieve the parameters for.  If the
+ *      filter is not set for the property list, an error will be returned.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_get_filter_by_id(H5P_genplist_t *plist, H5Z_filter_t id, unsigned int *flags/*out*/,
+    size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+    size_t namelen, char name[]/*out*/, unsigned *filter_config)
+{
+    H5O_pline_t         pline;  /* Filter pipeline */
+    H5Z_filter_info_t *filter;  /* Pointer to filter information */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get pipeline info */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Get pointer to filter in pipeline */
+    if(NULL == (filter = H5Z_filter_info(&pline, id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "filter ID is invalid")
+
+    /* Get filter information */
+    if(H5P_get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, filter_config) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_get_filter_by_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_filter_by_id2
+ *
+ * Purpose:	This is an additional query counterpart of H5Pset_filter() and
+ *              returns information about a particular filter in a permanent
+ *		or transient pipeline depending on whether PLIST_ID is a
+ *		dataset creation or transfer property list.  On input,
+ *		CD_NELMTS indicates the number of entries in the CD_VALUES
+ *		array allocated by the caller while on exit it contains the
+ *		number of values defined by the filter.  FILTER_CONFIG is a bit
+ *      field contaning encode/decode flags from H5Zpublic.h.  The ID
+ *      should be the filter ID to retrieve the parameters for.  If the
+ *      filter is not set for the property list, an error will be returned.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Thursday, May 21, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_filter_by_id2(hid_t plist_id, H5Z_filter_t id, unsigned int *flags/*out*/,
+    size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+    size_t namelen, char name[]/*out*/, unsigned *filter_config)
+{
+    H5P_genplist_t  *plist;                 /* Property list */
+    H5O_pline_t     pline;                  /* Filter pipeline */
+    const H5Z_filter_info_t *filter;        /* Pointer to filter information */
+    herr_t          ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE8("e", "iZfx*zxzx*Iu", plist_id, id, flags, cd_nelmts, cd_values,
+             namelen, name, filter_config);
+
+    /* Check args */
+    if(cd_nelmts || cd_values) {
+        /*
+         * It's likely that users forget to initialize this on input, so
+         * we'll check that it has a reasonable value.  The actual number
+         * is unimportant because the H5O layer will detect when a message
+         * is too large.
+         */
+        if(cd_nelmts && *cd_nelmts > 256)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "probable uninitialized *cd_nelmts argument")
+        if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "client data values not supplied")
+
+        /*
+         * If cd_nelmts is null but cd_values is non-null then just ignore
+         * cd_values
+         */
+        if(!cd_nelmts)
+            cd_values = NULL;
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get filter information */
+    if(H5P_get_filter_by_id(plist, id, flags, cd_nelmts, cd_values, namelen,
+            name, filter_config) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_filter_by_id2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pall_filters_avail
+ *
+ * Purpose:	This is a query routine to verify that all the filters set
+ *              in the dataset creation property list are available currently.
+ *
+ * Return:	Success:	TRUE if all filters available, FALSE if one or
+ *                              more filters not currently available.
+ *		Failure:	FAIL on error
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April  8, 2003
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Thursday, May 21, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Pall_filters_avail(hid_t plist_id)
+{
+    H5P_genplist_t  *plist;         /* Property list */
+    H5O_pline_t     pline;          /* Filter pipeline */
+    htri_t          ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the pipeline property to query */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Check if all filters are available */
+    if((ret_value = H5Z_all_filters_avail(&pline)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "can't check pipeline information")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pall_filters_avail() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_filter_in_pline
+ *
+ * Purpose:	Check whether the filter is in the pipeline of the object
+ *              creation property list.  
+ *
+ * Return:	TRUE:		found
+ *		FALSE:		not found
+ *              FAIL: 		error
+ *
+ * Programmer:	Raymond Lu
+ *              14 May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5P_filter_in_pline(H5P_genplist_t *plist, H5Z_filter_t id)
+{
+    H5O_pline_t         pline;  /* Filter pipeline */
+    htri_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get pipeline info */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Check if the file is in the pipeline */
+    if((ret_value = H5Z_filter_in_pline(&pline, id)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTCOMPARE, FAIL, "can't find filter")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_get_filter_by_id() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Premove_filter
+ *
+ * Purpose: Deletes a filter from the dataset creation property list;
+ *  deletes all filters if FILTER is H5Z_FILTER_NONE
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer:  Pedro Vicente
+ *              January 26, 2004
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Thursday, May 21, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Premove_filter(hid_t plist_id, H5Z_filter_t filter)
+{
+    H5P_genplist_t  *plist;                 /* Property list */
+    H5O_pline_t     pline;                  /* Filter pipeline */
+    herr_t          ret_value = SUCCEED;    /* return value          */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iZf", plist_id, filter);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the pipeline property to modify */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Check if there are any filters */
+    if (pline.filter) {
+        /* Delete filter */
+        if(H5Z_delete(&pline, filter) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't delete filter")
+
+        /* Put the I/O pipeline information back into the property list */
+        if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Premove_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_deflate
+ *
+ * Purpose:     Sets the compression method for a dataset or group link
+ *              filter pipeline (depending on whether PLIST_ID is a dataset
+ *              creation or group creation property list) to H5Z_FILTER_DEFLATE
+ *              and the compression level to LEVEL which should be a value
+ *              between zero and nine, inclusive.  Lower compression levels
+ *              are faster but result in less compression.  This is the same
+ *              algorithm as used by the GNU gzip program.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *              Neil Fortner
+ *              Thursday, March 26, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_deflate(hid_t plist_id, unsigned level)
+{
+    H5P_genplist_t  *plist;                 /* Property list */
+    H5O_pline_t     pline;                  /* Filter pipeline */
+    herr_t          ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, level);
+
+    /* Check arguments */
+    if(level > 9)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid deflate level")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the pipeline property to append to */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Add the filter */
+    if(H5Z_append(&pline, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, (size_t)1, &level) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add deflate filter to pipeline")
+
+    /* Put the I/O pipeline information back into the property list */
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_deflate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_fletcher32
+ *
+ * Purpose:     Sets Fletcher32 checksum of EDC for a dataset creation
+ *              property list or group creation property list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              Dec 19, 2002
+ *
+ * Modifications:
+ *
+ *              Neil Fortner
+ *              Wednesday, May 6, 2009
+ *              Overloaded to accept gcpl's as well as dcpl's and moved to
+ *              H5Pocpl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_fletcher32(hid_t plist_id)
+{
+    H5P_genplist_t  *plist;             /* Property list */
+    H5O_pline_t     pline;              /* Filter pipeline */
+    herr_t          ret_value=SUCCEED;  /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the pipeline property to append to */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
+
+    /* Add the Fletcher32 checksum as a filter */
+    if(H5Z_append(&pline, H5Z_FILTER_FLETCHER32, H5Z_FLAG_MANDATORY, (size_t)0, NULL) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add fletcher32 filter to pipeline")
+
+    /* Put the I/O pipeline information back into the property list */
+    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_fletcher32() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5P_get_filter
+ *
+ * Purpose:	Internal component of H5Pget_filter & H5Pget_filter_id
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, October 23, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P_get_filter(const H5Z_filter_info_t *filter, unsigned int *flags/*out*/,
+    size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+    size_t namelen, char name[]/*out*/,
+    unsigned *filter_config /*out*/)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(filter);
+
+    /* Filter flags */
+    if(flags)
+        *flags = filter->flags;
+
+    /* Filter parameters */
+    if(cd_values) {
+        size_t	i;                      /* Local index variable */
+
+        for(i = 0; i < filter->cd_nelmts && i < *cd_nelmts; i++)
+            cd_values[i] = filter->cd_values[i];
+    } /* end if */
+
+    /* Number of filter parameters */
+    if(cd_nelmts)
+        *cd_nelmts = filter->cd_nelmts;
+
+    /* Filter name */
+    if(namelen > 0 && name) {
+        const char *s = filter->name;
+
+        /* If there's no name on the filter, use the class's filter name */
+        if(!s) {
+            H5Z_class2_t *cls = H5Z_find(filter->id);
+
+            if(cls)
+                s = cls->name;
+        } /* end if */
+
+        /* Check for actual name */
+        if(s) {
+            HDstrncpy(name, s, namelen);
+            name[namelen - 1] = '\0';
+        } /* end if */
+        else {
+            /* Check for unknown library filter */
+            /* (probably from a future version of the library) */
+            if(filter->id < 256) {
+                HDstrncpy(name, "Unknown library filter", namelen);
+                name[namelen - 1] = '\0';
+            } /* end if */
+            else
+                name[0] = '\0';
+        } /* end if */
+    } /* end if */
+
+    /* Filter configuration (assume filter ID has already been checked) */
+    if(filter_config)
+        H5Z_get_filter_info(filter->id, filter_config);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_get_filter() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocrt_pipeline_cmp
+ *
+ * Purpose:        Callback routine which is called whenever a filter pipeline
+ *                 property in a property list is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, January 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__ocrt_pipeline_cmp(const void *_pline1, const void *_pline2, size_t H5_ATTR_UNUSED size)
+{
+    const H5O_pline_t *pline1 = (const H5O_pline_t *)_pline1,     /* Create local aliases for values */
+        *pline2 = (const H5O_pline_t *)_pline2;
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0; /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(pline1);
+    HDassert(pline2);
+    HDassert(size == sizeof(H5O_pline_t));
+
+    /* Check the number of used pipeline entries */
+    if(pline1->nused < pline2->nused) HGOTO_DONE(-1);
+    if(pline1->nused > pline2->nused) HGOTO_DONE(1);
+
+    /* Check the filter entry information */
+    if(pline1->filter == NULL && pline2->filter != NULL) HGOTO_DONE(-1);
+    if(pline1->filter != NULL && pline2->filter == NULL) HGOTO_DONE(1);
+    if(pline1->filter != NULL && pline1->nused > 0) {
+        size_t u;       /* Local index variable */
+
+        /* Loop through all filters, comparing them */
+        for(u = 0; u < pline1->nused; u++) {
+            /* Check the ID of the filter */
+            if(pline1->filter[u].id < pline2->filter[u].id) HGOTO_DONE(-1);
+            if(pline1->filter[u].id > pline2->filter[u].id) HGOTO_DONE(1);
+
+            /* Check the flags for the filter */
+            if(pline1->filter[u].flags < pline2->filter[u].flags) HGOTO_DONE(-1);
+            if(pline1->filter[u].flags > pline2->filter[u].flags) HGOTO_DONE(1);
+
+            /* Check the name of the filter */
+            if(pline1->filter[u].name == NULL && pline2->filter[u].name != NULL) HGOTO_DONE(-1);
+            if(pline1->filter[u].name != NULL && pline2->filter[u].name == NULL) HGOTO_DONE(1);
+            if(pline1->filter[u].name != NULL)
+                if((cmp_value = HDstrcmp(pline1->filter[u].name, pline2->filter[u].name)) != 0)
+                    HGOTO_DONE(cmp_value);
+
+            /* Check the number of parameters for the filter */
+            if(pline1->filter[u].cd_nelmts < pline2->filter[u].cd_nelmts) HGOTO_DONE(-1);
+            if(pline1->filter[u].cd_nelmts > pline2->filter[u].cd_nelmts) HGOTO_DONE(1);
+
+            /* Check the filter parameter information */
+            if(pline1->filter[u].cd_values == NULL && pline2->filter[u].cd_values != NULL) HGOTO_DONE(-1);
+            if(pline1->filter[u].cd_values != NULL && pline2->filter[u].cd_values == NULL) HGOTO_DONE(1);
+            if(pline1->filter[u].cd_values != NULL && pline1->filter[u].cd_nelmts > 0) {
+                size_t v;       /* Local index variable */
+
+                /* Loop through all parameters, comparing them */
+                for(v = 0; v < pline1->filter[u].cd_nelmts; v++) {
+                    /* Check each parameter for the filter */
+                    if(pline1->filter[u].cd_values[v] < pline2->filter[u].cd_values[v]) HGOTO_DONE(-1);
+                    if(pline1->filter[u].cd_values[v] > pline2->filter[u].cd_values[v]) HGOTO_DONE(1);
+                } /* end for */
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_cmp() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_filter1
+ *
+ * Purpose:	This is the query counterpart of H5Pset_filter() and returns
+ *		information about a particular filter number in a permanent
+ *		or transient pipeline depending on whether PLIST_ID is a
+ *		dataset creation or transfer property list.  On input,
+ *		CD_NELMTS indicates the number of entries in the CD_VALUES
+ *		array allocated by the caller while on exit it contains the
+ *		number of values defined by the filter.  The IDX
+ *      should be a value between zero and N-1 as described for
+ *      H5Pget_nfilters() and the function will return failure if the
+ *      filter number is out of range.
+ *
+ * Return:	Success:	Filter identification number.
+ *
+ *		Failure:	H5Z_FILTER_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April 15, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_filter_t
+H5Pget_filter1(hid_t plist_id, unsigned idx, unsigned int *flags/*out*/,
+	       size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+	       size_t namelen, char name[]/*out*/)
+{
+    H5O_pline_t         pline;  /* Filter pipeline */
+    const H5Z_filter_info_t *filter;  /* Pointer to filter information */
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5Z_filter_t ret_value;     /* return value */
+
+    FUNC_ENTER_API(H5Z_FILTER_ERROR)
+    H5TRACE7("Zf", "iIux*zxzx", plist_id, idx, flags, cd_nelmts, cd_values, namelen,
+             name);
+
+    /* Check args */
+    if(cd_nelmts || cd_values) {
+        /*
+         * It's likely that users forget to initialize this on input, so
+         * we'll check that it has a reasonable value.  The actual number
+         * is unimportant because the H5O layer will detect when a message
+         * is too large.
+         */
+        if(cd_nelmts && *cd_nelmts > 256)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "probable uninitialized *cd_nelmts argument")
+        if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "client data values not supplied")
+
+        /*
+         * If cd_nelmts is null but cd_values is non-null then just ignore
+         * cd_values
+         */
+        if(!cd_nelmts)
+            cd_values = NULL;
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
+
+    /* Get pipeline info */
+    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
+
+    /* Check more args */
+    if(idx >= pline.nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "filter number is invalid")
+
+    /* Set pointer to particular filter to query */
+    filter = &pline.filter[idx];
+
+    /* Get filter information */
+    if(H5P_get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get filter info")
+
+    /* Set return value */
+    ret_value = filter->id;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_filter1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_filter_by_id1
+ *
+ * Purpose:	This is an additional query counterpart of H5Pset_filter() and
+ *              returns information about a particular filter in a permanent
+ *		or transient pipeline depending on whether PLIST_ID is a
+ *		dataset creation or transfer property list.  On input,
+ *		CD_NELMTS indicates the number of entries in the CD_VALUES
+ *		array allocated by the caller while on exit it contains the
+ *		number of values defined by the filter.  The ID
+ *      should be the filter ID to retrieve the parameters for.  If the
+ *      filter is not set for the property list, an error will be returned.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id, unsigned int *flags/*out*/,
+    size_t *cd_nelmts/*in_out*/, unsigned cd_values[]/*out*/,
+    size_t namelen, char name[]/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE7("e", "iZfx*zxzx", plist_id, id, flags, cd_nelmts, cd_values, namelen,
+             name);
+
+    /* Check args */
+    if(cd_nelmts || cd_values) {
+        /*
+         * It's likely that users forget to initialize this on input, so
+         * we'll check that it has a reasonable value.  The actual number
+         * is unimportant because the H5O layer will detect when a message
+         * is too large.
+         */
+        if(cd_nelmts && *cd_nelmts > 256)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "probable uninitialized *cd_nelmts argument")
+        if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "client data values not supplied")
+
+        /*
+         * If cd_nelmts is null but cd_values is non-null then just ignore
+         * cd_values
+         */
+        if(!cd_nelmts)
+            cd_values = NULL;
+    } /* end if */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get filter info */
+    if(H5P_get_filter_by_id(plist, id, flags, cd_nelmts, cd_values, namelen, name, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_filter_by_id1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pocpypl.c b/gatb-core/thirdparty/hdf5/src/H5Pocpypl.c
new file mode 100644
index 0000000..3de20ff
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pocpypl.c
@@ -0,0 +1,630 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pocpypl.c
+ *			Mar 13 2006
+ *			Peter Cao <xcao at ncsa.uiuc.edu>
+ *
+ * Purpose:		Object copying property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========= Object Copy properties ============ */
+/* Definitions for copy options */
+#define H5O_CPY_OPTION_SIZE			sizeof(unsigned)
+#define H5O_CPY_OPTION_DEF			0
+/* Definitions for merge committed dtype list */
+#define H5O_CPY_MERGE_COMM_DT_LIST_SIZE        sizeof(char *)
+#define H5O_CPY_MERGE_COMM_DT_LIST_DEF         NULL
+#define H5O_CPY_MERGE_COMM_DT_LIST_COPY        H5P__ocpy_merge_comm_dt_list_copy
+#define H5O_CPY_MERGE_COMM_DT_LIST_CMP         H5P__ocpy_merge_comm_dt_list_cmp
+#define H5O_CPY_MERGE_COMM_DT_LIST_CLOSE       H5P__ocpy_merge_comm_dt_list_close
+/* Definitions for callback function when completing the search for a matching committed datatype from the committed dtype list */
+#define H5O_CPY_MCDT_SEARCH_CB_SIZE           sizeof(H5O_mcdt_cb_info_t)
+#define H5O_CPY_MCDT_SEARCH_CB_DEF            {NULL,NULL} 
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* General routines */
+static H5O_copy_dtype_merge_list_t *H5P__free_merge_comm_dtype_list(H5O_copy_dtype_merge_list_t *dt_list);
+
+/* Property class callbacks */
+static herr_t H5P__ocpy_reg_prop(H5P_genclass_t *pclass);
+
+/* Property callbacks */
+static herr_t H5P__ocpy_merge_comm_dt_list_copy(const char* name, size_t size, void* value);
+static int H5P__ocpy_merge_comm_dt_list_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__ocpy_merge_comm_dt_list_close(const char* name, size_t size, void* value);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Object copy property list class library initialization object */
+const H5P_libclass_t H5P_CLS_OCPY[1] = {{
+    "object copy",		/* Class name for debugging     */
+    H5P_TYPE_OBJECT_COPY,       /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_OBJECT_COPY_g,	/* Pointer to class             */
+    &H5P_CLS_OBJECT_COPY_ID_g,	/* Pointer to class ID          */
+    &H5P_LST_OBJECT_COPY_ID_g,	/* Pointer to default property list ID */
+    H5P__ocpy_reg_prop,		/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5O_copy_dtype_merge_list_t struct */
+H5FL_DEFINE(H5O_copy_dtype_merge_list_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocpy_reg_prop
+ *
+ * Purpose:     Initialize the object copy property list class
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_reg_prop(H5P_genclass_t *pclass)
+{
+    unsigned ocpy_option = H5O_CPY_OPTION_DEF;  /* Default object copy flags */
+    H5O_copy_dtype_merge_list_t *merge_comm_dtype_list = H5O_CPY_MERGE_COMM_DT_LIST_DEF; /* Default merge committed dtype list */
+    H5O_mcdt_cb_info_t mcdt_cb = H5O_CPY_MCDT_SEARCH_CB_DEF; /* Default callback before searching the global list of committed datatypes at destination */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register copy options property */
+    if(H5P_register_real(pclass, H5O_CPY_OPTION_NAME, H5O_CPY_OPTION_SIZE, &ocpy_option, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register merge named dtype list property */
+    if(H5P_register_real(pclass, H5O_CPY_MERGE_COMM_DT_LIST_NAME, H5O_CPY_MERGE_COMM_DT_LIST_SIZE, &merge_comm_dtype_list, NULL, NULL, NULL, NULL, H5O_CPY_MERGE_COMM_DT_LIST_COPY, H5O_CPY_MERGE_COMM_DT_LIST_CMP, H5O_CPY_MERGE_COMM_DT_LIST_CLOSE) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register property for callback when completing the search for a matching named datatype from the named dtype list */
+    if(H5P_register_real(pclass, H5O_CPY_MCDT_SEARCH_CB_NAME, H5O_CPY_MCDT_SEARCH_CB_SIZE, &mcdt_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocpy_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__free_merge_comm_dtype_list
+ *
+ * Purpose:     Frees the provided merge named dtype list
+ *
+ * Return:      NULL
+ *
+ * Programmer:  Neil Fortner
+ *              October 27, 2011
+ *-------------------------------------------------------------------------
+ */
+static H5O_copy_dtype_merge_list_t *
+H5P__free_merge_comm_dtype_list(H5O_copy_dtype_merge_list_t *dt_list)
+{
+    H5O_copy_dtype_merge_list_t *tmp_node;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Free the list */
+    while(dt_list) {
+        tmp_node = dt_list->next;
+        (void)H5MM_xfree(dt_list->path);
+        (void)H5FL_FREE(H5O_copy_dtype_merge_list_t, dt_list);
+        dt_list = tmp_node;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(NULL);
+} /* H5P__free_merge_comm_dtype_list */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P__ocpy_merge_comm_dt_list_copy
+ *
+ * Purpose:	Copy the merge committed datatype list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, August 31, 2012
+ *
+ *--------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    const H5O_copy_dtype_merge_list_t *src_dt_list;     /* Source merge named datatype lists */
+    H5O_copy_dtype_merge_list_t *dst_dt_list = NULL;    /* Destination merge named datatype lists */
+    H5O_copy_dtype_merge_list_t *dst_dt_list_tail = NULL, *tmp_dt_list = NULL; /* temporary merge named datatype lists */
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    HDassert(value);
+
+    /* Make copy of merge committed dtype list */
+    src_dt_list = *(const H5O_copy_dtype_merge_list_t **)value;
+    while(src_dt_list) {
+        /* Copy src_dt_list */
+        if(NULL == (tmp_dt_list = H5FL_CALLOC(H5O_copy_dtype_merge_list_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        if(NULL == (tmp_dt_list->path = H5MM_strdup(src_dt_list->path)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Add copied node to dest dtype list */
+        if(dst_dt_list_tail) {
+            dst_dt_list_tail->next = tmp_dt_list;
+            dst_dt_list_tail = tmp_dt_list;
+        } /* end if */
+        else {
+            dst_dt_list = tmp_dt_list;
+            dst_dt_list_tail = tmp_dt_list;
+        } /* end else */
+        tmp_dt_list = NULL;
+
+        /* Advance src_dt_list pointer */
+        src_dt_list = src_dt_list->next;
+    } /* end while */
+
+    /* Set the merge named dtype list property for the destination property list */
+    *(H5O_copy_dtype_merge_list_t **)value = dst_dt_list;
+
+done:
+    if(ret_value < 0) {
+        dst_dt_list = H5P__free_merge_comm_dtype_list(dst_dt_list);
+        if(tmp_dt_list) {
+            tmp_dt_list->path = (char *)H5MM_xfree(tmp_dt_list->path);
+            tmp_dt_list = H5FL_FREE(H5O_copy_dtype_merge_list_t, tmp_dt_list);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocpy_merge_comm_dt_list_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocpy_merge_comm_dt_list_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the merge
+ *                 named dtype property in the object copy property list
+ *                 is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Neil Fortner
+ *                 Friday, October 28, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__ocpy_merge_comm_dt_list_cmp(const void *_dt_list1, const void *_dt_list2,
+    size_t H5_ATTR_UNUSED size)
+{
+    const H5O_copy_dtype_merge_list_t *dt_list1 = *(H5O_copy_dtype_merge_list_t * const *)_dt_list1,     /* Create local aliases for values */
+        *dt_list2 = *(H5O_copy_dtype_merge_list_t * const *)_dt_list2;
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(_dt_list1);
+    HDassert(_dt_list2);
+    HDassert(size == sizeof(H5O_copy_dtype_merge_list_t *));
+
+    /* Walk through the lists, comparing each path.  For the lists to be the
+     * same, the paths must be in the same order. */
+    while(dt_list1 && dt_list2) {
+        /* Compare paths */
+        ret_value = HDstrcmp(dt_list1->path, dt_list2->path);
+        if(ret_value != 0) HGOTO_DONE(ret_value)
+
+        /* Advance to next node */
+        dt_list1 = dt_list1->next;
+        dt_list2 = dt_list2->next;
+    } /* end while */
+
+    /* Check if one list is longer than the other */
+    if(dt_list1) HGOTO_DONE(1)
+    if(dt_list2) HGOTO_DONE(-1)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocpy_merge_comm_dt_list_cmp() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P__ocpy_merge_comm_dt_list_close
+ *
+ * Purpose:	Close the merge common datatype list property
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, August 31, 2012
+ *
+ *---------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(value);
+
+    /* Free the merge named dtype list */
+    H5P__free_merge_comm_dtype_list(*(H5O_copy_dtype_merge_list_t **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__ocpy_merge_comm_dt_list_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_copy_object
+ *
+ * Purpose:     Set properties when copying an object (group, dataset, and datatype)
+ *              from one location to another
+ *
+ * Usage:       H5Pset_copy_group(plist_id, cpy_option)
+ *              hid_t plist_id;			IN: Property list to copy object
+ *              unsigned cpy_option; 		IN: Options to copy object such as
+ *                  H5O_COPY_SHALLOW_HIERARCHY_FLAG    -- Copy only immediate members
+ *                  H5O_COPY_EXPAND_SOFT_LINK_FLAG     -- Expand soft links into new objects/
+ *                  H5O_COPY_EXPAND_EXT_LINK_FLAG      -- Expand external links into new objects
+ *                  H5O_COPY_EXPAND_REFERENCE_FLAG -- Copy objects that are pointed by references
+ *                  H5O_COPY_WITHOUT_ATTR_FLAG         -- Copy object without copying attributes
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              March 13, 2006
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_copy_object(hid_t plist_id, unsigned cpy_option)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, cpy_option);
+
+    /* Check parameters */
+    if(cpy_option & ~H5O_COPY_ALL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown option specified")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value */
+    if(H5P_set(plist, H5O_CPY_OPTION_NAME, &cpy_option) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set copy object flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_copy_object() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_copy_object
+ *
+ * Purpose:     Returns the cpy_option, which is set for H5Ocopy(hid_t loc_id,
+ *              const char* name, ... ) for copying objects
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              March 13, 2006
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_copy_object(hid_t plist_id, unsigned *cpy_option /*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, cpy_option);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(cpy_option)
+        if(H5P_get(plist, H5O_CPY_OPTION_NAME, cpy_option) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object copy flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_copy_object() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Padd_merge_committed_dtype_path
+ *
+ * Purpose:     Adds path to the list of paths to search first in the
+ *              target file when merging committed datatypes during H5Ocopy
+ *              (i.e. when using the H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG flag
+ *              as set by H5Pset_copy_object).  If the source named
+ *              dataype is not found in the list of paths created by this
+ *              function, the entire file will be searched.
+ *
+ * Usage:       H5Padd_merge_committed_dtype_path(plist_id, path)
+ *              hid_t plist_id;                 IN: Property list to copy object
+ *              const char *path;               IN: Path to add to list
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              October 27, 2011
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_copy_dtype_merge_list_t *old_list; 	/* Merge committed dtype list currently present */
+    H5O_copy_dtype_merge_list_t *new_obj = NULL; /* New object to add to list */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", plist_id, path);
+
+    /* Check parameters */
+    if(!path)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no path specified")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get dtype list */
+    if(H5P_get(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &old_list) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge named dtype list")
+
+    /* Add the new path to the list */
+    if(NULL == (new_obj = H5FL_CALLOC(H5O_copy_dtype_merge_list_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    if(NULL == (new_obj->path = H5MM_strdup(path)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    new_obj->next = old_list;
+
+    /* Update the list stored in the property list */
+    if(H5P_set(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &new_obj) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set merge named dtype list")
+
+done:
+    if(ret_value < 0)
+        if(new_obj) {
+            new_obj->path = (char *)H5MM_xfree(new_obj->path);
+            new_obj = H5FL_FREE(H5O_copy_dtype_merge_list_t, new_obj);
+        } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Padd_merge_committed_dtype_path() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pfree_merge_committed_dtype_paths
+ *
+ * Purpose:     Frees and clears the list of paths created by
+ *              H5Padd_merge_committed_dtype_path.  A new list may then be
+ *              created by calling H5Padd_merge_committed_dtype_path again.
+ *
+ * Usage:       H5Pfree_merge_committed_dtype_paths(plist_id)
+ *              hid_t plist_id;                 IN: Property list to copy object
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              October 27, 2011
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pfree_merge_committed_dtype_paths(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_copy_dtype_merge_list_t *dt_list; /* Merge committed dtype list currently present */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get dtype list */
+    if(H5P_get(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge committed dtype list")
+
+    /* Free dtype list */
+    dt_list = H5P__free_merge_comm_dtype_list(dt_list);
+
+    /* Update the list stored in the property list (to NULL) */
+    if(H5P_set(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set merge committed dtype list")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pfree_merge_committed_dtype_paths() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_mcdt_search_cb
+ *
+ * Purpose:     Set the callback function when a matching committed datatype is not found
+ *		from the list of paths stored in the object copy property list.
+ * 		H5Ocopy will invoke this callback before searching all committed datatypes
+ *		at destination.
+ *
+ * Usage:       H5Pset_mcdt_search_cb(plist_id, H5O_mcdt_search_cb_t func, void *op_data)
+ *              hid_t plist_id;                 IN: Property list to copy object
+ *              H5O_mcdt_search_cb_t func;      IN: The callback function
+ *              void *op_data;      		IN: The user data
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; November 28, 2011
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t func, void *op_data)
+{
+    H5P_genplist_t *plist;      	/* Property list pointer */
+    H5O_mcdt_cb_info_t cb_info;		/* Callback info struct */
+    herr_t ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ix*x", plist_id, func, op_data);
+
+    /* Check if the callback function is NULL and the user data is non-NULL.
+     * This is almost certainly an error as the user data will not be used. */
+    if(!func && op_data)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback is NULL while user data is not")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+     /* Populate the callback info struct */
+    cb_info.func = func;
+    cb_info.user_data = op_data;
+
+    /* Set callback info */
+    if(H5P_set(plist, H5O_CPY_MCDT_SEARCH_CB_NAME, &cb_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set callback info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_mcdt_search_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_mcdt_search_cb
+ *
+ * Purpose:     Retrieves the callback function and user data from the specified 
+ *		object copy property list.
+ *
+ * Usage:       H5Pget_mcdt_search_cb(plist_id, H5O_mcdt_search_cb_t *func, void **op_data)
+ *              hid_t plist_id;                 IN: Property list to copy object
+ *		H5O_mcdt_search_cb_t *func;	OUT: The callback function
+ *		void **op_data;			OUT: The user data
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; November 29, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t *func, void **op_data)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_mcdt_cb_info_t cb_info;	/* Callback info struct */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x**x", plist_id, func, op_data);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get callback info */
+    if(H5P_get(plist, H5O_CPY_MCDT_SEARCH_CB_NAME, &cb_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get callback info")
+    
+    if(func)
+	*func = cb_info.func;
+
+    if(op_data)
+	*op_data = cb_info.user_data;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_mcdt_search_cb() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ppkg.h b/gatb-core/thirdparty/hdf5/src/H5Ppkg.h
new file mode 100644
index 0000000..44ef473
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ppkg.h
@@ -0,0 +1,214 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Friday, November 16, 2001
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5P package.  Source files outside the H5P package should
+ *		include H5Pprivate.h instead.
+ */
+#ifndef H5P_PACKAGE
+#error "Do not include this file outside the H5P package!"
+#endif
+
+#ifndef _H5Ppkg_H
+#define _H5Ppkg_H
+
+/* Get package's private header */
+#include "H5Pprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5SLprivate.h"	/* Skip lists				*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Define enum for type of object that property is within */
+typedef enum {
+    H5P_PROP_WITHIN_UNKNOWN=0,  /* Property container is unknown */
+    H5P_PROP_WITHIN_LIST,       /* Property is within a list */
+    H5P_PROP_WITHIN_CLASS       /* Property is within a class */
+} H5P_prop_within_t;
+
+/* Define enum for modifications to class */
+typedef enum {
+    H5P_MOD_ERR=(-1),   /* Indicate an error */
+    H5P_MOD_INC_CLS,    /* Increment the dependant class count*/
+    H5P_MOD_DEC_CLS,    /* Decrement the dependant class count*/
+    H5P_MOD_INC_LST,    /* Increment the dependant list count*/
+    H5P_MOD_DEC_LST,    /* Decrement the dependant list count*/
+    H5P_MOD_INC_REF,    /* Increment the ID reference count*/
+    H5P_MOD_DEC_REF,    /* Decrement the ID reference count*/
+    H5P_MOD_MAX         /* Upper limit on class modifications */
+} H5P_class_mod_t;
+
+/* Define structure to hold property information */
+typedef struct H5P_genprop_t {
+    /* Values for this property */
+    char *name;         /* Name of property */
+    size_t size;        /* Size of property value */
+    void *value;        /* Pointer to property value */
+    H5P_prop_within_t type;     /* Type of object the property is within */
+    hbool_t shared_name;   /* Whether the name is shared or not */
+
+    /* Callback function pointers & info */
+    H5P_prp_create_func_t create;   /* Function to call when a property is created */
+    H5P_prp_set_func_t set; /* Function to call when a property value is set */
+    H5P_prp_get_func_t get; /* Function to call when a property value is retrieved */
+    H5P_prp_delete_func_t del; /* Function to call when a property is deleted */
+    H5P_prp_copy_func_t copy;  /* Function to call when a property is copied */
+    H5P_prp_compare_func_t cmp; /* Function to call when a property is compared */
+    H5P_prp_close_func_t close; /* Function to call when a property is closed */
+} H5P_genprop_t;
+
+/* Define structure to hold class information */
+struct H5P_genclass_t {
+    struct H5P_genclass_t *parent;     /* Pointer to parent class */
+    char      *name;       /* Name of property list class */
+    H5P_plist_type_t type; /* Type of property */
+    size_t     nprops;     /* Number of properties in class */
+    unsigned   plists;     /* Number of property lists that have been created since the last modification to the class */
+    unsigned   classes;    /* Number of classes that have been derived since the last modification to the class */
+    unsigned   ref_count;  /* Number of oustanding ID's open on this class object */
+    hbool_t    deleted;    /* Whether this class has been deleted and is waiting for dependent classes & proplists to close */
+    unsigned   revision;   /* Revision number of a particular class (global) */
+    H5SL_t    *props;      /* Skip list containing properties */
+
+    /* Callback function pointers & info */
+    H5P_cls_create_func_t create_func;  /* Function to call when a property list is created */
+    void *create_data;     /* Pointer to user data to pass along to create callback */
+    H5P_cls_copy_func_t copy_func;      /* Function to call when a property list is copied */
+    void *copy_data;       /* Pointer to user data to pass along to copy callback */
+    H5P_cls_close_func_t close_func;    /* Function to call when a property list is closed */
+    void *close_data;      /* Pointer to user data to pass along to close callback */
+};
+
+/* Define structure to hold property list information */
+struct H5P_genplist_t {
+    H5P_genclass_t *pclass; /* Pointer to class info */
+    hid_t   plist_id;   /* Copy of the property list ID (for use in close callback) */
+    size_t  nprops;     /* Number of properties in class */
+    hbool_t class_init; /* Whether the class initialization callback finished successfully */
+    H5SL_t *del;        /* Skip list containing names of deleted properties */
+    H5SL_t *props;      /* Skip list containing properties */
+};
+
+/* Function pointer for library classes with properties to register */
+typedef herr_t (*H5P_init_class_op_t)(H5P_genclass_t *pclass);
+typedef herr_t (*H5P_reg_prop_func_t)(H5P_genclass_t *pclass);
+
+/*
+ * Each library property list class has a variable of this type that contains
+ * class variables and methods used to initialize the class.
+ */
+typedef struct H5P_libclass_t {
+    const char	*name;		        /* Class name */
+    H5P_plist_type_t type;              /* Class type */
+
+    H5P_genclass_t * * par_pclass;      /* Pointer to global parent class property list class */
+    H5P_genclass_t * * pclass;          /* Pointer to global property list class */
+    hid_t * const class_id;             /* Pointer to global property list class ID */
+    hid_t * const def_plist_id;         /* Pointer to global default property list ID */
+    H5P_reg_prop_func_t reg_prop_func;  /* Register class's properties */
+
+    /* Class callback function pointers & info */
+    H5P_cls_create_func_t create_func;  /* Function to call when a property list is created */
+    void *create_data;                  /* Pointer to user data to pass along to create callback */
+    H5P_cls_copy_func_t copy_func;      /* Function to call when a property list is copied */
+    void *copy_data;                    /* Pointer to user data to pass along to copy callback */
+    H5P_cls_close_func_t close_func;    /* Function to call when a property list is closed */
+    void *close_data;                   /* Pointer to user data to pass along to close callback */
+} H5P_libclass_t;
+
+/* Property list/class iterator callback function pointer */
+typedef int (*H5P_iterate_int_t)(H5P_genprop_t *prop, void *udata);
+
+/* Forward declarations (for prototypes & struct definitions) */
+struct H5Z_filter_info_t;
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Private functions, not part of the publicly documented API */
+H5_DLL herr_t H5P__term_pub_interface(void);
+H5_DLL herr_t H5P__term_deprec_interface(void);
+H5_DLL H5P_genclass_t *H5P_create_class(H5P_genclass_t *par_class,
+    const char *name, H5P_plist_type_t type,
+    H5P_cls_create_func_t cls_create, void *create_data,
+    H5P_cls_copy_func_t cls_copy, void *copy_data,
+    H5P_cls_close_func_t cls_close, void *close_data);
+H5_DLL H5P_genclass_t *H5P_copy_pclass(H5P_genclass_t *pclass);
+H5_DLL herr_t H5P_register_real(H5P_genclass_t *pclass, const char *name, size_t size,
+    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5P_register(H5P_genclass_t **pclass, const char *name, size_t size,
+    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
+    H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5P_add_prop(H5SL_t *props, H5P_genprop_t *prop);
+H5_DLL herr_t H5P_access_class(H5P_genclass_t *pclass, H5P_class_mod_t mod);
+H5_DLL htri_t H5P_exist_pclass(H5P_genclass_t *pclass, const char *name);
+H5_DLL herr_t H5P_get_size_plist(const H5P_genplist_t *plist, const char *name,
+    size_t *size);
+H5_DLL herr_t H5P_get_size_pclass(H5P_genclass_t *pclass, const char *name,
+    size_t *size);
+H5_DLL herr_t H5P_get_nprops_plist(const H5P_genplist_t *plist, size_t *nprops);
+H5_DLL int H5P_cmp_class(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2);
+H5_DLL herr_t H5P_cmp_plist(const H5P_genplist_t *plist1, const H5P_genplist_t *plist2,
+    int *cmp_ret);
+H5_DLL int H5P_iterate_plist(const H5P_genplist_t *plist, hbool_t iter_all_prop,
+    int *idx, H5P_iterate_int_t iter_func, void *iter_data);
+H5_DLL int H5P_iterate_pclass(const H5P_genclass_t *pclass, int *idx,
+    H5P_iterate_int_t iter_func, void *iter_data);
+H5_DLL herr_t H5P_copy_prop_plist(hid_t dst_id, hid_t src_id, const char *name);
+H5_DLL herr_t H5P_copy_prop_pclass(hid_t dst_id, hid_t src_id, const char *name);
+H5_DLL herr_t H5P_unregister(H5P_genclass_t *pclass, const char *name);
+H5_DLL char *H5P_get_class_path(H5P_genclass_t *pclass);
+H5_DLL H5P_genclass_t *H5P_open_class_path(const char *path);
+H5_DLL H5P_genclass_t *H5P_get_class_parent(const H5P_genclass_t *pclass);
+H5_DLL herr_t H5P_close_class(void *_pclass);
+H5_DLL H5P_genprop_t *H5P__find_prop_plist(const H5P_genplist_t *plist, const char *name);
+
+/* Private OCPL routines */
+H5_DLL herr_t H5P_get_filter(const struct H5Z_filter_info_t *filter,
+    unsigned int *flags, size_t *cd_nelmts, unsigned cd_values[],
+    size_t namelen, char name[], unsigned *filter_config);
+
+/* Testing functions */
+#ifdef H5P_TESTING
+H5_DLL char *H5P_get_class_path_test(hid_t pclass_id);
+H5_DLL hid_t H5P_open_class_path_test(const char *path);
+H5_DLL herr_t H5P_reset_external_file_test(hid_t dcpl_id);
+#endif /* H5P_TESTING */
+
+#endif /* _H5Ppkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pprivate.h b/gatb-core/thirdparty/hdf5/src/H5Pprivate.h
new file mode 100644
index 0000000..542fd52
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pprivate.h
@@ -0,0 +1,165 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5P module
+ */
+#ifndef _H5Pprivate_H
+#define _H5Pprivate_H
+
+/* Include package's public header */
+#include "H5Ppublic.h"
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* ========  String creation property names ======== */
+#define H5P_STRCRT_CHAR_ENCODING_NAME  "character_encoding"     /* Character set encoding for string */
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5P_PACKAGE
+#define H5P_PLIST_ID(P)     ((P)->plist_id)
+#define H5P_CLASS(P)        ((P)->pclass)
+#else /* H5F_PACKAGE */
+#define H5P_PLIST_ID(P)     (H5P_get_plist_id(P))
+#define H5P_CLASS(P)        (H5P_get_class(P))
+#endif /* H5P_PACKAGE */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Forward declarations (for prototypes & type definitions) */
+struct H5O_fill_t;
+struct H5T_t;
+
+/* Forward declarations for anonymous H5P objects */
+typedef struct H5P_genplist_t H5P_genplist_t;
+typedef struct H5P_genclass_t H5P_genclass_t;
+
+typedef enum H5P_plist_type_t {
+    H5P_TYPE_USER              = 0,
+    H5P_TYPE_ROOT              = 1,
+    H5P_TYPE_OBJECT_CREATE     = 2,
+    H5P_TYPE_FILE_CREATE       = 3,
+    H5P_TYPE_FILE_ACCESS       = 4,
+    H5P_TYPE_DATASET_CREATE    = 5,
+    H5P_TYPE_DATASET_ACCESS    = 6,
+    H5P_TYPE_DATASET_XFER      = 7,
+    H5P_TYPE_FILE_MOUNT        = 8,
+    H5P_TYPE_GROUP_CREATE      = 9,
+    H5P_TYPE_GROUP_ACCESS      = 10,
+    H5P_TYPE_DATATYPE_CREATE   = 11,
+    H5P_TYPE_DATATYPE_ACCESS   = 12,
+    H5P_TYPE_STRING_CREATE     = 13,
+    H5P_TYPE_ATTRIBUTE_CREATE  = 14,
+    H5P_TYPE_OBJECT_COPY       = 15,
+    H5P_TYPE_LINK_CREATE       = 16,
+    H5P_TYPE_LINK_ACCESS       = 17,
+    H5P_TYPE_MAX_TYPE
+} H5P_plist_type_t;
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Predefined property list classes. */
+H5_DLLVAR H5P_genclass_t *H5P_CLS_ROOT_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_OBJECT_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_FILE_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_FILE_ACCESS_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_DATASET_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_DATASET_ACCESS_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_DATASET_XFER_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_FILE_MOUNT_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_GROUP_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_GROUP_ACCESS_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_DATATYPE_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_DATATYPE_ACCESS_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_ATTRIBUTE_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_OBJECT_COPY_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_LINK_CREATE_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_LINK_ACCESS_g;
+H5_DLLVAR H5P_genclass_t *H5P_CLS_STRING_CREATE_g;
+
+
+/******************************/
+/* Library Private Prototypes */
+/******************************/
+
+/* Package initialization routine */
+H5_DLL herr_t H5P_init(void);
+
+/* Internal versions of API routines */
+H5_DLL herr_t H5P_close(void *_plist);
+H5_DLL hid_t H5P_create_id(H5P_genclass_t *pclass, hbool_t app_ref);
+H5_DLL hid_t H5P_copy_plist(const H5P_genplist_t *old_plist, hbool_t app_ref);
+H5_DLL herr_t H5P_get(const H5P_genplist_t *plist, const char *name, void *value);
+H5_DLL herr_t H5P_set(H5P_genplist_t *plist, const char *name, const void *value);
+H5_DLL herr_t H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
+    void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5P_remove(hid_t plist_id, H5P_genplist_t *plist, const char *name);
+H5_DLL htri_t H5P_exist_plist(const H5P_genplist_t *plist, const char *name);
+H5_DLL htri_t H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2);
+H5_DLL char *H5P_get_class_name(H5P_genclass_t *pclass);
+H5_DLL herr_t H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops,
+    hbool_t recurse);
+H5_DLL hid_t H5P_get_driver(H5P_genplist_t *plist);
+H5_DLL void * H5P_get_driver_info(H5P_genplist_t *plist);
+H5_DLL herr_t H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id,
+            const void *new_driver_info);
+H5_DLL herr_t H5P_set_vlen_mem_manager(H5P_genplist_t *plist,
+        H5MM_allocate_t alloc_func, void *alloc_info, H5MM_free_t free_func,
+        void *free_info);
+H5_DLL herr_t H5P_is_fill_value_defined(const struct H5O_fill_t *fill,
+        H5D_fill_value_t *status);
+H5_DLL int H5P_fill_value_cmp(const void *value1, const void *value2,
+    size_t size);
+H5_DLL herr_t H5P_modify_filter(H5P_genplist_t *plist, H5Z_filter_t filter,
+    unsigned flags, size_t cd_nelmts, const unsigned cd_values[]);
+H5_DLL herr_t H5P_get_filter_by_id(H5P_genplist_t *plist, H5Z_filter_t id,
+    unsigned int *flags, size_t *cd_nelmts, unsigned cd_values[],
+    size_t namelen, char name[], unsigned *filter_config);
+H5_DLL htri_t H5P_filter_in_pline(H5P_genplist_t *plist, H5Z_filter_t id);
+
+/* Query internal fields of the property list struct */
+H5_DLL hid_t H5P_get_plist_id(const H5P_genplist_t *plist);
+H5_DLL H5P_genclass_t *H5P_get_class(const H5P_genplist_t *plist);
+
+/* *SPECIAL* Don't make more of these! -QAK */
+H5_DLL htri_t H5P_isa_class(hid_t plist_id, hid_t pclass_id);
+H5_DLL H5P_genplist_t *H5P_object_verify(hid_t plist_id, hid_t pclass_id);
+
+/* Private functions to "peek" at properties of a certain type */
+H5_DLL unsigned H5P_peek_unsigned(H5P_genplist_t *plist, const char *name);
+H5_DLL hid_t H5P_peek_hid_t(H5P_genplist_t *plist, const char *name);
+H5_DLL void *H5P_peek_voidp(H5P_genplist_t *plist, const char *name);
+H5_DLL size_t H5P_peek_size_t(H5P_genplist_t *plist, const char *name);
+
+/* Private DCPL routines */
+H5_DLL herr_t H5P_fill_value_defined(H5P_genplist_t *plist,
+    H5D_fill_value_t *status);
+H5_DLL herr_t H5P_get_fill_value(H5P_genplist_t *plist, const struct H5T_t *type,
+    void *value, hid_t dxpl_id);
+
+#endif /* _H5Pprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ppublic.h b/gatb-core/thirdparty/hdf5/src/H5Ppublic.h
new file mode 100644
index 0000000..4a703d0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ppublic.h
@@ -0,0 +1,500 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains function prototypes for each exported function in the
+ * H5P module.
+ */
+#ifndef _H5Ppublic_H
+#define _H5Ppublic_H
+
+/* System headers needed by this file */
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5ACpublic.h"
+#include "H5Dpublic.h"
+#include "H5Fpublic.h"
+#include "H5FDpublic.h"
+#include "H5Ipublic.h"
+#include "H5Lpublic.h"
+#include "H5Opublic.h"
+#include "H5MMpublic.h"
+#include "H5Tpublic.h"
+#include "H5Zpublic.h"
+
+
+/*****************/
+/* Public Macros */
+/*****************/
+
+/* When this header is included from a private HDF5 header, don't make calls to H5open() */
+#undef H5OPEN
+#ifndef _H5private_H
+#define H5OPEN        H5open(),
+#else   /* _H5private_H */
+#define H5OPEN
+#endif  /* _H5private_H */
+
+/*
+ * The library's property list classes
+ */
+
+#define H5P_ROOT		   	(H5OPEN H5P_CLS_ROOT_ID_g)
+#define H5P_OBJECT_CREATE 		(H5OPEN H5P_CLS_OBJECT_CREATE_ID_g)
+#define H5P_FILE_CREATE 		(H5OPEN H5P_CLS_FILE_CREATE_ID_g)
+#define H5P_FILE_ACCESS 		(H5OPEN H5P_CLS_FILE_ACCESS_ID_g)
+#define H5P_DATASET_CREATE     		(H5OPEN H5P_CLS_DATASET_CREATE_ID_g)
+#define H5P_DATASET_ACCESS     		(H5OPEN H5P_CLS_DATASET_ACCESS_ID_g)
+#define H5P_DATASET_XFER       		(H5OPEN H5P_CLS_DATASET_XFER_ID_g)
+#define H5P_FILE_MOUNT       		(H5OPEN H5P_CLS_FILE_MOUNT_ID_g)
+#define H5P_GROUP_CREATE 		(H5OPEN H5P_CLS_GROUP_CREATE_ID_g)
+#define H5P_GROUP_ACCESS 		(H5OPEN H5P_CLS_GROUP_ACCESS_ID_g)
+#define H5P_DATATYPE_CREATE 		(H5OPEN H5P_CLS_DATATYPE_CREATE_ID_g)
+#define H5P_DATATYPE_ACCESS 		(H5OPEN H5P_CLS_DATATYPE_ACCESS_ID_g)
+#define H5P_STRING_CREATE 		(H5OPEN H5P_CLS_STRING_CREATE_ID_g)
+#define H5P_ATTRIBUTE_CREATE 		(H5OPEN H5P_CLS_ATTRIBUTE_CREATE_ID_g)
+#define H5P_OBJECT_COPY	 		(H5OPEN H5P_CLS_OBJECT_COPY_ID_g)
+#define H5P_LINK_CREATE 		(H5OPEN H5P_CLS_LINK_CREATE_ID_g)
+#define H5P_LINK_ACCESS 		(H5OPEN H5P_CLS_LINK_ACCESS_ID_g)
+
+/*
+ * The library's default property lists
+ */
+#define H5P_FILE_CREATE_DEFAULT		(H5OPEN H5P_LST_FILE_CREATE_ID_g)
+#define H5P_FILE_ACCESS_DEFAULT 	(H5OPEN H5P_LST_FILE_ACCESS_ID_g)
+#define H5P_DATASET_CREATE_DEFAULT  	(H5OPEN H5P_LST_DATASET_CREATE_ID_g)
+#define H5P_DATASET_ACCESS_DEFAULT  	(H5OPEN H5P_LST_DATASET_ACCESS_ID_g)
+#define H5P_DATASET_XFER_DEFAULT   	(H5OPEN H5P_LST_DATASET_XFER_ID_g)
+#define H5P_FILE_MOUNT_DEFAULT       	(H5OPEN H5P_LST_FILE_MOUNT_ID_g)
+#define H5P_GROUP_CREATE_DEFAULT	(H5OPEN H5P_LST_GROUP_CREATE_ID_g)
+#define H5P_GROUP_ACCESS_DEFAULT 	(H5OPEN H5P_LST_GROUP_ACCESS_ID_g)
+#define H5P_DATATYPE_CREATE_DEFAULT	(H5OPEN H5P_LST_DATATYPE_CREATE_ID_g)
+#define H5P_DATATYPE_ACCESS_DEFAULT 	(H5OPEN H5P_LST_DATATYPE_ACCESS_ID_g)
+#define H5P_ATTRIBUTE_CREATE_DEFAULT	(H5OPEN H5P_LST_ATTRIBUTE_CREATE_ID_g)
+#define H5P_OBJECT_COPY_DEFAULT		(H5OPEN H5P_LST_OBJECT_COPY_ID_g)
+#define H5P_LINK_CREATE_DEFAULT		(H5OPEN H5P_LST_LINK_CREATE_ID_g)
+#define H5P_LINK_ACCESS_DEFAULT		(H5OPEN H5P_LST_LINK_ACCESS_ID_g)
+
+/* Common creation order flags (for links in groups and attributes on objects) */
+#define H5P_CRT_ORDER_TRACKED           0x0001
+#define H5P_CRT_ORDER_INDEXED           0x0002
+
+/* Default value for all property list classes */
+#define H5P_DEFAULT     (hid_t)0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************/
+/* Public Typedefs */
+/*******************/
+
+
+/* Define property list class callback function pointer types */
+typedef herr_t (*H5P_cls_create_func_t)(hid_t prop_id, void *create_data);
+typedef herr_t (*H5P_cls_copy_func_t)(hid_t new_prop_id, hid_t old_prop_id,
+                                      void *copy_data);
+typedef herr_t (*H5P_cls_close_func_t)(hid_t prop_id, void *close_data);
+
+/* Define property list callback function pointer types */
+typedef herr_t (*H5P_prp_cb1_t)(const char *name, size_t size, void *value);
+typedef herr_t (*H5P_prp_cb2_t)(hid_t prop_id, const char *name, size_t size, void *value);
+typedef H5P_prp_cb1_t H5P_prp_create_func_t;
+typedef H5P_prp_cb2_t H5P_prp_set_func_t;
+typedef H5P_prp_cb2_t H5P_prp_get_func_t;
+typedef H5P_prp_cb2_t H5P_prp_delete_func_t;
+typedef H5P_prp_cb1_t H5P_prp_copy_func_t;
+typedef int (*H5P_prp_compare_func_t)(const void *value1, const void *value2, size_t size);
+typedef H5P_prp_cb1_t H5P_prp_close_func_t;
+
+/* Define property list iteration function type */
+typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
+
+/* Actual IO mode property */
+typedef enum H5D_mpio_actual_chunk_opt_mode_t {
+    /* The default value, H5D_MPIO_NO_CHUNK_OPTIMIZATION, is used for all I/O
+     * operations that do not use chunk optimizations, including non-collective
+     * I/O and contiguous collective I/O.
+     */
+    H5D_MPIO_NO_CHUNK_OPTIMIZATION = 0,
+    H5D_MPIO_LINK_CHUNK,
+    H5D_MPIO_MULTI_CHUNK
+}  H5D_mpio_actual_chunk_opt_mode_t;
+
+typedef enum H5D_mpio_actual_io_mode_t {
+    /* The following four values are conveniently defined as a bit field so that
+     * we can switch from the default to indpendent or collective and then to
+     * mixed without having to check the original value. 
+     * 
+     * NO_COLLECTIVE means that either collective I/O wasn't requested or that 
+     * no I/O took place.
+     *
+     * CHUNK_INDEPENDENT means that collective I/O was requested, but the
+     * chunk optimization scheme chose independent I/O for each chunk.
+     */
+    H5D_MPIO_NO_COLLECTIVE = 0x0,
+    H5D_MPIO_CHUNK_INDEPENDENT = 0x1,
+    H5D_MPIO_CHUNK_COLLECTIVE = 0x2,
+    H5D_MPIO_CHUNK_MIXED = 0x1 | 0x2,
+
+    /* The contiguous case is separate from the bit field. */
+    H5D_MPIO_CONTIGUOUS_COLLECTIVE = 0x4
+} H5D_mpio_actual_io_mode_t; 
+
+/* Broken collective IO property */
+typedef enum H5D_mpio_no_collective_cause_t {
+    H5D_MPIO_COLLECTIVE = 0x00,
+    H5D_MPIO_SET_INDEPENDENT = 0x01,
+    H5D_MPIO_DATATYPE_CONVERSION = 0x02,
+    H5D_MPIO_DATA_TRANSFORMS = 0x04,
+    H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED = 0x08,
+    H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES = 0x10,
+    H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET = 0x20,
+    H5D_MPIO_FILTERS = 0x40
+} H5D_mpio_no_collective_cause_t;
+
+/********************/
+/* Public Variables */
+/********************/
+
+/* Property list class IDs */
+/* (Internal to library, do not use!  Use macros above) */
+H5_DLLVAR hid_t H5P_CLS_ROOT_ID_g;
+H5_DLLVAR hid_t H5P_CLS_OBJECT_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_FILE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_FILE_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_CLS_DATASET_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_DATASET_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_CLS_DATASET_XFER_ID_g;
+H5_DLLVAR hid_t H5P_CLS_FILE_MOUNT_ID_g;
+H5_DLLVAR hid_t H5P_CLS_GROUP_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_GROUP_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_CLS_DATATYPE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_DATATYPE_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_CLS_STRING_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_ATTRIBUTE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_OBJECT_COPY_ID_g;
+H5_DLLVAR hid_t H5P_CLS_LINK_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_CLS_LINK_ACCESS_ID_g;
+
+/* Default roperty list IDs */
+/* (Internal to library, do not use!  Use macros above) */
+H5_DLLVAR hid_t H5P_LST_FILE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_FILE_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_LST_DATASET_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_DATASET_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_LST_DATASET_XFER_ID_g;
+H5_DLLVAR hid_t H5P_LST_FILE_MOUNT_ID_g;
+H5_DLLVAR hid_t H5P_LST_GROUP_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_GROUP_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_LST_DATATYPE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_DATATYPE_ACCESS_ID_g;
+H5_DLLVAR hid_t H5P_LST_ATTRIBUTE_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_OBJECT_COPY_ID_g;
+H5_DLLVAR hid_t H5P_LST_LINK_CREATE_ID_g;
+H5_DLLVAR hid_t H5P_LST_LINK_ACCESS_ID_g;
+
+/*********************/
+/* Public Prototypes */
+/*********************/
+
+/* Generic property list routines */
+H5_DLL hid_t H5Pcreate_class(hid_t parent, const char *name,
+    H5P_cls_create_func_t cls_create, void *create_data,
+    H5P_cls_copy_func_t cls_copy, void *copy_data,
+    H5P_cls_close_func_t cls_close, void *close_data);
+H5_DLL char *H5Pget_class_name(hid_t pclass_id);
+H5_DLL hid_t H5Pcreate(hid_t cls_id);
+H5_DLL herr_t H5Pregister2(hid_t cls_id, const char *name, size_t size,
+    void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size,
+    void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, void *value);
+H5_DLL htri_t H5Pexist(hid_t plist_id, const char *name);
+H5_DLL herr_t H5Pget_size(hid_t id, const char *name, size_t *size);
+H5_DLL herr_t H5Pget_nprops(hid_t id, size_t *nprops);
+H5_DLL hid_t H5Pget_class(hid_t plist_id);
+H5_DLL hid_t H5Pget_class_parent(hid_t pclass_id);
+H5_DLL herr_t H5Pget(hid_t plist_id, const char *name, void * value);
+H5_DLL htri_t H5Pequal(hid_t id1, hid_t id2);
+H5_DLL htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id);
+H5_DLL int H5Piterate(hid_t id, int *idx, H5P_iterate_t iter_func,
+            void *iter_data);
+H5_DLL herr_t H5Pcopy_prop(hid_t dst_id, hid_t src_id, const char *name);
+H5_DLL herr_t H5Premove(hid_t plist_id, const char *name);
+H5_DLL herr_t H5Punregister(hid_t pclass_id, const char *name);
+H5_DLL herr_t H5Pclose_class(hid_t plist_id);
+H5_DLL herr_t H5Pclose(hid_t plist_id);
+H5_DLL hid_t H5Pcopy(hid_t plist_id);
+
+/* Object creation property list (OCPL) routines */
+H5_DLL herr_t H5Pset_attr_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense);
+H5_DLL herr_t H5Pget_attr_phase_change(hid_t plist_id, unsigned *max_compact, unsigned *min_dense);
+H5_DLL herr_t H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags);
+H5_DLL herr_t H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags);
+H5_DLL herr_t H5Pset_obj_track_times(hid_t plist_id, hbool_t track_times);
+H5_DLL herr_t H5Pget_obj_track_times(hid_t plist_id, hbool_t *track_times);
+H5_DLL herr_t H5Pmodify_filter(hid_t plist_id, H5Z_filter_t filter,
+        unsigned int flags, size_t cd_nelmts,
+        const unsigned int cd_values[/*cd_nelmts*/]);
+H5_DLL herr_t H5Pset_filter(hid_t plist_id, H5Z_filter_t filter,
+        unsigned int flags, size_t cd_nelmts,
+        const unsigned int c_values[]);
+H5_DLL int H5Pget_nfilters(hid_t plist_id);
+H5_DLL H5Z_filter_t H5Pget_filter2(hid_t plist_id, unsigned filter,
+       unsigned int *flags/*out*/,
+       size_t *cd_nelmts/*out*/,
+       unsigned cd_values[]/*out*/,
+       size_t namelen, char name[],
+       unsigned *filter_config /*out*/);
+H5_DLL herr_t H5Pget_filter_by_id2(hid_t plist_id, H5Z_filter_t id,
+       unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/,
+       unsigned cd_values[]/*out*/, size_t namelen, char name[]/*out*/,
+       unsigned *filter_config/*out*/);
+H5_DLL htri_t H5Pall_filters_avail(hid_t plist_id);
+H5_DLL herr_t H5Premove_filter(hid_t plist_id, H5Z_filter_t filter);
+H5_DLL herr_t H5Pset_deflate(hid_t plist_id, unsigned aggression);
+H5_DLL herr_t H5Pset_fletcher32(hid_t plist_id);
+
+/* File creation property list (FCPL) routines */
+H5_DLL herr_t H5Pget_version(hid_t plist_id, unsigned *boot/*out*/,
+         unsigned *freelist/*out*/, unsigned *stab/*out*/,
+         unsigned *shhdr/*out*/);
+H5_DLL herr_t H5Pset_userblock(hid_t plist_id, hsize_t size);
+H5_DLL herr_t H5Pget_userblock(hid_t plist_id, hsize_t *size);
+H5_DLL herr_t H5Pset_sizes(hid_t plist_id, size_t sizeof_addr,
+       size_t sizeof_size);
+H5_DLL herr_t H5Pget_sizes(hid_t plist_id, size_t *sizeof_addr/*out*/,
+       size_t *sizeof_size/*out*/);
+H5_DLL herr_t H5Pset_sym_k(hid_t plist_id, unsigned ik, unsigned lk);
+H5_DLL herr_t H5Pget_sym_k(hid_t plist_id, unsigned *ik/*out*/, unsigned *lk/*out*/);
+H5_DLL herr_t H5Pset_istore_k(hid_t plist_id, unsigned ik);
+H5_DLL herr_t H5Pget_istore_k(hid_t plist_id, unsigned *ik/*out*/);
+H5_DLL herr_t H5Pset_shared_mesg_nindexes(hid_t plist_id, unsigned nindexes);
+H5_DLL herr_t H5Pget_shared_mesg_nindexes(hid_t plist_id, unsigned *nindexes);
+H5_DLL herr_t H5Pset_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned mesg_type_flags, unsigned min_mesg_size);
+H5_DLL herr_t H5Pget_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned *mesg_type_flags, unsigned *min_mesg_size);
+H5_DLL herr_t H5Pset_shared_mesg_phase_change(hid_t plist_id, unsigned max_list, unsigned min_btree);
+H5_DLL herr_t H5Pget_shared_mesg_phase_change(hid_t plist_id, unsigned *max_list, unsigned *min_btree);
+
+/* File access property list (FAPL) routines */
+H5_DLL herr_t H5Pset_alignment(hid_t fapl_id, hsize_t threshold,
+    hsize_t alignment);
+H5_DLL herr_t H5Pget_alignment(hid_t fapl_id, hsize_t *threshold/*out*/,
+    hsize_t *alignment/*out*/);
+H5_DLL herr_t H5Pset_driver(hid_t plist_id, hid_t driver_id,
+        const void *driver_info);
+H5_DLL hid_t H5Pget_driver(hid_t plist_id);
+H5_DLL void *H5Pget_driver_info(hid_t plist_id);
+H5_DLL herr_t H5Pset_family_offset(hid_t fapl_id, hsize_t offset);
+H5_DLL herr_t H5Pget_family_offset(hid_t fapl_id, hsize_t *offset);
+H5_DLL herr_t H5Pset_multi_type(hid_t fapl_id, H5FD_mem_t type);
+H5_DLL herr_t H5Pget_multi_type(hid_t fapl_id, H5FD_mem_t *type);
+H5_DLL herr_t H5Pset_cache(hid_t plist_id, int mdc_nelmts,
+       size_t rdcc_nslots, size_t rdcc_nbytes,
+       double rdcc_w0);
+H5_DLL herr_t H5Pget_cache(hid_t plist_id,
+       int *mdc_nelmts, /* out */
+       size_t *rdcc_nslots/*out*/,
+       size_t *rdcc_nbytes/*out*/, double *rdcc_w0);
+H5_DLL herr_t H5Pset_mdc_config(hid_t    plist_id,
+       H5AC_cache_config_t * config_ptr);
+H5_DLL herr_t H5Pget_mdc_config(hid_t     plist_id,
+       H5AC_cache_config_t * config_ptr);	/* out */
+H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref);
+H5_DLL herr_t H5Pget_gc_references(hid_t fapl_id, unsigned *gc_ref/*out*/);
+H5_DLL herr_t H5Pset_fclose_degree(hid_t fapl_id, H5F_close_degree_t degree);
+H5_DLL herr_t H5Pget_fclose_degree(hid_t fapl_id, H5F_close_degree_t *degree);
+H5_DLL herr_t H5Pset_meta_block_size(hid_t fapl_id, hsize_t size);
+H5_DLL herr_t H5Pget_meta_block_size(hid_t fapl_id, hsize_t *size/*out*/);
+H5_DLL herr_t H5Pset_sieve_buf_size(hid_t fapl_id, size_t size);
+H5_DLL herr_t H5Pget_sieve_buf_size(hid_t fapl_id, size_t *size/*out*/);
+H5_DLL herr_t H5Pset_small_data_block_size(hid_t fapl_id, hsize_t size);
+H5_DLL herr_t H5Pget_small_data_block_size(hid_t fapl_id, hsize_t *size/*out*/);
+H5_DLL herr_t H5Pset_libver_bounds(hid_t plist_id, H5F_libver_t low,
+    H5F_libver_t high);
+H5_DLL herr_t H5Pget_libver_bounds(hid_t plist_id, H5F_libver_t *low,
+    H5F_libver_t *high);
+H5_DLL herr_t H5Pset_elink_file_cache_size(hid_t plist_id, unsigned efc_size);
+H5_DLL herr_t H5Pget_elink_file_cache_size(hid_t plist_id, unsigned *efc_size);
+H5_DLL herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len);
+H5_DLL herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr);
+H5_DLL herr_t H5Pset_file_image_callbacks(hid_t fapl_id,
+       H5FD_file_image_callbacks_t *callbacks_ptr);
+H5_DLL herr_t H5Pget_file_image_callbacks(hid_t fapl_id,
+       H5FD_file_image_callbacks_t *callbacks_ptr);
+
+H5_DLL herr_t H5Pset_core_write_tracking(hid_t fapl_id, hbool_t is_enabled, size_t page_size);
+H5_DLL herr_t H5Pget_core_write_tracking(hid_t fapl_id, hbool_t *is_enabled, size_t *page_size);
+
+/* Dataset creation property list (DCPL) routines */
+H5_DLL herr_t H5Pset_layout(hid_t plist_id, H5D_layout_t layout);
+H5_DLL H5D_layout_t H5Pget_layout(hid_t plist_id);
+H5_DLL herr_t H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/]);
+H5_DLL int H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/);
+H5_DLL herr_t H5Pset_external(hid_t plist_id, const char *name, off_t offset,
+          hsize_t size);
+H5_DLL int H5Pget_external_count(hid_t plist_id);
+H5_DLL herr_t H5Pget_external(hid_t plist_id, unsigned idx, size_t name_size,
+          char *name/*out*/, off_t *offset/*out*/,
+          hsize_t *size/*out*/);
+H5_DLL herr_t H5Pset_szip(hid_t plist_id, unsigned options_mask, unsigned pixels_per_block);
+H5_DLL herr_t H5Pset_shuffle(hid_t plist_id);
+H5_DLL herr_t H5Pset_nbit(hid_t plist_id);
+H5_DLL herr_t H5Pset_scaleoffset(hid_t plist_id, H5Z_SO_scale_type_t scale_type, int scale_factor);
+H5_DLL herr_t H5Pset_fill_value(hid_t plist_id, hid_t type_id,
+     const void *value);
+H5_DLL herr_t H5Pget_fill_value(hid_t plist_id, hid_t type_id,
+     void *value/*out*/);
+H5_DLL herr_t H5Pfill_value_defined(hid_t plist, H5D_fill_value_t *status);
+H5_DLL herr_t H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t
+	alloc_time);
+H5_DLL herr_t H5Pget_alloc_time(hid_t plist_id, H5D_alloc_time_t
+	*alloc_time/*out*/);
+H5_DLL herr_t H5Pset_fill_time(hid_t plist_id, H5D_fill_time_t fill_time);
+H5_DLL herr_t H5Pget_fill_time(hid_t plist_id, H5D_fill_time_t
+	*fill_time/*out*/);
+
+/* Dataset access property list (DAPL) routines */
+H5_DLL herr_t H5Pset_chunk_cache(hid_t dapl_id, size_t rdcc_nslots,
+       size_t rdcc_nbytes, double rdcc_w0);
+H5_DLL herr_t H5Pget_chunk_cache(hid_t dapl_id,
+       size_t *rdcc_nslots/*out*/,
+       size_t *rdcc_nbytes/*out*/,
+       double *rdcc_w0/*out*/);
+H5_DLL herr_t H5Pset_efile_prefix(hid_t dapl_id, const char* prefix);
+H5_DLL ssize_t H5Pget_efile_prefix(hid_t dapl_id, char* prefix /*out*/, size_t size);
+
+/* Dataset xfer property list (DXPL) routines */
+H5_DLL herr_t H5Pset_data_transform(hid_t plist_id, const char* expression);
+H5_DLL ssize_t H5Pget_data_transform(hid_t plist_id, char* expression /*out*/, size_t size);
+H5_DLL herr_t H5Pset_buffer(hid_t plist_id, size_t size, void *tconv,
+        void *bkg);
+H5_DLL size_t H5Pget_buffer(hid_t plist_id, void **tconv/*out*/,
+        void **bkg/*out*/);
+H5_DLL herr_t H5Pset_preserve(hid_t plist_id, hbool_t status);
+H5_DLL int H5Pget_preserve(hid_t plist_id);
+H5_DLL herr_t H5Pset_edc_check(hid_t plist_id, H5Z_EDC_t check);
+H5_DLL H5Z_EDC_t H5Pget_edc_check(hid_t plist_id);
+H5_DLL herr_t H5Pset_filter_callback(hid_t plist_id, H5Z_filter_func_t func,
+                                     void* op_data);
+H5_DLL herr_t H5Pset_btree_ratios(hid_t plist_id, double left, double middle,
+       double right);
+H5_DLL herr_t H5Pget_btree_ratios(hid_t plist_id, double *left/*out*/,
+       double *middle/*out*/,
+       double *right/*out*/);
+H5_DLL herr_t H5Pset_vlen_mem_manager(hid_t plist_id,
+                                       H5MM_allocate_t alloc_func,
+                                       void *alloc_info, H5MM_free_t free_func,
+                                       void *free_info);
+H5_DLL herr_t H5Pget_vlen_mem_manager(hid_t plist_id,
+                                       H5MM_allocate_t *alloc_func,
+                                       void **alloc_info,
+                                       H5MM_free_t *free_func,
+                                       void **free_info);
+H5_DLL herr_t H5Pset_hyper_vector_size(hid_t fapl_id, size_t size);
+H5_DLL herr_t H5Pget_hyper_vector_size(hid_t fapl_id, size_t *size/*out*/);
+H5_DLL herr_t H5Pset_type_conv_cb(hid_t dxpl_id, H5T_conv_except_func_t op, void* operate_data);
+H5_DLL herr_t H5Pget_type_conv_cb(hid_t dxpl_id, H5T_conv_except_func_t *op, void** operate_data);
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5Pget_mpio_actual_chunk_opt_mode(hid_t plist_id, H5D_mpio_actual_chunk_opt_mode_t *actual_chunk_opt_mode);
+H5_DLL herr_t H5Pget_mpio_actual_io_mode(hid_t plist_id, H5D_mpio_actual_io_mode_t *actual_io_mode);
+H5_DLL herr_t H5Pget_mpio_no_collective_cause(hid_t plist_id, uint32_t *local_no_collective_cause, uint32_t *global_no_collective_cause);
+#endif /* H5_HAVE_PARALLEL */
+
+/* Link creation property list (LCPL) routines */
+H5_DLL herr_t H5Pset_create_intermediate_group(hid_t plist_id, unsigned crt_intmd);
+H5_DLL herr_t H5Pget_create_intermediate_group(hid_t plist_id, unsigned *crt_intmd /*out*/);
+
+/* Group creation property list (GCPL) routines */
+H5_DLL herr_t H5Pset_local_heap_size_hint(hid_t plist_id, size_t size_hint);
+H5_DLL herr_t H5Pget_local_heap_size_hint(hid_t plist_id, size_t *size_hint /*out*/);
+H5_DLL herr_t H5Pset_link_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense);
+H5_DLL herr_t H5Pget_link_phase_change(hid_t plist_id, unsigned *max_compact /*out*/, unsigned *min_dense /*out*/);
+H5_DLL herr_t H5Pset_est_link_info(hid_t plist_id, unsigned est_num_entries, unsigned est_name_len);
+H5_DLL herr_t H5Pget_est_link_info(hid_t plist_id, unsigned *est_num_entries /* out */, unsigned *est_name_len /* out */);
+H5_DLL herr_t H5Pset_link_creation_order(hid_t plist_id, unsigned crt_order_flags);
+H5_DLL herr_t H5Pget_link_creation_order(hid_t plist_id, unsigned *crt_order_flags /* out */);
+
+/* String creation property list (STRCPL) routines */
+H5_DLL herr_t H5Pset_char_encoding(hid_t plist_id, H5T_cset_t encoding);
+H5_DLL herr_t H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/);
+
+/* Link access property list (LAPL) routines */
+H5_DLL herr_t H5Pset_nlinks(hid_t plist_id, size_t nlinks);
+H5_DLL herr_t H5Pget_nlinks(hid_t plist_id, size_t *nlinks);
+H5_DLL herr_t H5Pset_elink_prefix(hid_t plist_id, const char *prefix);
+H5_DLL ssize_t H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size);
+H5_DLL hid_t H5Pget_elink_fapl(hid_t lapl_id);
+H5_DLL herr_t H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id);
+H5_DLL herr_t H5Pset_elink_acc_flags(hid_t lapl_id, unsigned flags);
+H5_DLL herr_t H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags);
+H5_DLL herr_t H5Pset_elink_cb(hid_t lapl_id, H5L_elink_traverse_t func, void *op_data);
+H5_DLL herr_t H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data);
+
+/* Object copy property list (OCPYPL) routines */
+H5_DLL herr_t H5Pset_copy_object(hid_t plist_id, unsigned crt_intmd);
+H5_DLL herr_t H5Pget_copy_object(hid_t plist_id, unsigned *crt_intmd /*out*/);
+H5_DLL herr_t H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path);
+H5_DLL herr_t H5Pfree_merge_committed_dtype_paths(hid_t plist_id);
+H5_DLL herr_t H5Pset_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t func, void *op_data);
+H5_DLL herr_t H5Pget_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t *func, void **op_data);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+/* We renamed the "root" of the property list class hierarchy */
+#define H5P_NO_CLASS            H5P_ROOT
+
+
+/* Typedefs */
+
+
+/* Function prototypes */
+H5_DLL herr_t H5Pregister1(hid_t cls_id, const char *name, size_t size,
+    void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_close_func_t prp_close);
+H5_DLL herr_t H5Pinsert1(hid_t plist_id, const char *name, size_t size,
+    void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+    H5P_prp_close_func_t prp_close);
+H5_DLL H5Z_filter_t H5Pget_filter1(hid_t plist_id, unsigned filter,
+    unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/,
+    unsigned cd_values[]/*out*/, size_t namelen, char name[]);
+H5_DLL herr_t H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id,
+    unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/,
+    unsigned cd_values[]/*out*/, size_t namelen, char name[]/*out*/);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Ppublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Pstrcpl.c b/gatb-core/thirdparty/hdf5/src/H5Pstrcpl.c
new file mode 100644
index 0000000..cc845af
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Pstrcpl.c
@@ -0,0 +1,202 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Pstrcpl.c
+ *			October 26 2005
+ *			James Laird <jlaird at ncsa.uiuc.edu>
+ *
+ * Purpose:		String creation property list class routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* ========  String creation properties ======== */
+/* Definitions for character set encoding property */
+#define H5P_STRCRT_CHAR_ENCODING_SIZE  sizeof(H5T_cset_t)
+#define H5P_STRCRT_CHAR_ENCODING_DEF   H5F_DEFAULT_CSET
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Property class callbacks */
+static herr_t H5P__strcrt_reg_prop(H5P_genclass_t *pclass);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* String creation property list class library initialization object */
+const H5P_libclass_t H5P_CLS_STRCRT[1] = {{
+    "string create",		/* Class name for debugging     */
+    H5P_TYPE_STRING_CREATE,     /* Class type                   */
+
+    &H5P_CLS_ROOT_g,		/* Parent class                 */
+    &H5P_CLS_STRING_CREATE_g,	/* Pointer to class             */
+    &H5P_CLS_STRING_CREATE_ID_g,	/* Pointer to class ID          */
+    NULL,			/* Pointer to default property list ID */
+    H5P__strcrt_reg_prop,	/* Default property registration routine */
+
+    NULL,		        /* Class creation callback      */
+    NULL,		        /* Class creation callback info */
+    NULL,			/* Class copy callback          */
+    NULL,		        /* Class copy callback info     */
+    NULL,			/* Class close callback         */
+    NULL 		        /* Class close callback info    */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__strcrt_reg_prop
+ *
+ * Purpose:     Register the string creation property list class's properties
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              October 31, 2006
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__strcrt_reg_prop(H5P_genclass_t *pclass)
+{
+    H5T_cset_t char_encoding = H5P_STRCRT_CHAR_ENCODING_DEF;  /* Default character set encoding */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Register character encoding */
+    if(H5P_register_real(pclass, H5P_STRCRT_CHAR_ENCODING_NAME, H5P_STRCRT_CHAR_ENCODING_SIZE, &char_encoding, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__strcrt_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_char_encoding
+ *
+ * Purpose:     Sets the character encoding of the string.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Wednesday, October 26, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_char_encoding(hid_t plist_id, H5T_cset_t encoding)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTc", plist_id, encoding);
+
+    /* Check arguments */
+    if (encoding <= H5T_CSET_ERROR || encoding >= H5T_NCSET)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "character encoding is not valid")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_STRING_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set the character encoding */
+    if(H5P_set(plist, H5P_STRCRT_CHAR_ENCODING_NAME, &encoding) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set character encoding")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5P_set_char_encoding() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_char_encoding
+ *
+ * Purpose:     Gets the character encoding of the string.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              November 1, 2005
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, encoding);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_STRING_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value */
+    if(encoding)
+        if(H5P_get(plist, H5P_STRCRT_CHAR_ENCODING_NAME, encoding) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get character encoding flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_char_encoding() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ptest.c b/gatb-core/thirdparty/hdf5/src/H5Ptest.c
new file mode 100644
index 0000000..b36da6a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ptest.c
@@ -0,0 +1,173 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Saturday May 31, 2003
+ *
+ * Purpose:	Generic Property Testing Functions
+ */
+
+#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+#define H5P_TESTING		/*suppress warning about H5P testing funcs*/
+
+
+/* Private header files */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+#include "H5Dprivate.h"		/* Dataset		  		*/
+
+/* Local variables */
+
+/* Local typedefs */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_class_path_test
+ PURPOSE
+    Routine to query the full path of a generic property list class
+ USAGE
+    char *H5P_get_class_name_test(pclass_id)
+        hid_t pclass_id;         IN: Property class to query
+ RETURNS
+    Success: Pointer to a malloc'ed string containing the full path of class
+    Failure: NULL
+ DESCRIPTION
+        This routine retrieves the full path name of a generic property list
+    class, starting with the root of the class hierarchy.
+    The pointer to the name must be free'd by the user for successful calls.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING H5P_get_class_path()
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+char *
+H5P_get_class_path_test(hid_t pclass_id)
+{
+    H5P_genclass_t	*pclass;    /* Property class to query */
+    char *ret_value;       /* return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check arguments. */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object_verify(pclass_id, H5I_GENPROP_CLS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property class");
+
+    /* Get the property list class path */
+    if(NULL == (ret_value = H5P_get_class_path(pclass)))
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, NULL, "unable to query full path of class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_get_class_path_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_open_class_path_test
+ PURPOSE
+    Routine to open a [copy of] a class with its full path name
+ USAGE
+    hid_t H5P_open_class_name_test(path)
+        const char *path;       IN: Full path name of class to open [copy of]
+ RETURNS
+    Success: ID of generic property class
+    Failure: NULL
+ DESCRIPTION
+    This routine opens [a copy] of the class indicated by the full path.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING H5P_open_class_path()
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5P_open_class_path_test(const char *path)
+{
+    H5P_genclass_t *pclass=NULL;/* Property class to query */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    if (NULL == path || *path=='\0')
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid class path");
+
+    /* Open the property list class */
+    if ((pclass=H5P_open_class_path(path))==NULL)
+        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "unable to find class with full path");
+
+    /* Get an atom for the class */
+    if ((ret_value=H5I_register(H5I_GENPROP_CLS, pclass, TRUE))<0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class");
+
+done:
+    if(ret_value<0 && pclass)
+        H5P_close_class(pclass);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_open_class_path_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_reset_external_file_test
+ PURPOSE
+    Routine to reset external file list
+ USAGE
+    herr_t H5P_reset_external_file_test(plist)
+           hid_t dcpl_id; IN: the property list
+
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ PROGRAMMER
+    Peter Cao
+    April 30, 2007
+--------------------------------------------------------------------------*/
+herr_t
+H5P_reset_external_file_test(hid_t dcpl_id)
+{
+    H5O_efl_t       efl;                /* External file list */
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* get external file list */
+    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+    /* Clean up any values set for the external file-list */
+    if(H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release external file list info")
+
+    /* set external file list */
+    if(H5P_set(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_reset_external_file_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5R.c b/gatb-core/thirdparty/hdf5/src/H5R.c
new file mode 100644
index 0000000..a2b310c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5R.c
@@ -0,0 +1,1014 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5R_PACKAGE		/*suppress error about including H5Rpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5R_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5HGprivate.h"	/* Global Heaps				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Rpkg.h"		/* References				*/
+#include "H5Sprivate.h"		/* Dataspaces 				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5R_create(void *ref, H5G_loc_t *loc, const char *name,
+        H5R_type_t ref_type, H5S_t *space, hid_t dxpl_id);
+static hid_t H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type,
+    const void *_ref, hbool_t app_ref);
+static H5S_t * H5R_get_region(H5F_t *file, hid_t dxpl_id, const void *_ref);
+static ssize_t H5R_get_name(H5F_t *file, hid_t lapl_id, hid_t dxpl_id, hid_t id,
+    H5R_type_t ref_type, const void *_ref, char *name, size_t size);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Reference ID class */
+static const H5I_class_t H5I_REFERENCE_CLS[1] = {{
+    H5I_REFERENCE,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* # of reserved IDs for class */
+    NULL			/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5R_init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5R_init(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5R_init() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5R_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5R_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5R_init_interface(void)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize the atom group for the file IDs */
+    if(H5I_register_type(H5I_REFERENCE_CLS) < 0)
+	HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to initialize interface");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_term_interface
+ PURPOSE
+    Terminate various H5R objects
+ USAGE
+    void H5R_term_interface()
+ RETURNS
+    void
+ DESCRIPTION
+    Release the atom group and any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5R_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_REFERENCE) > 0) {
+	    (void)H5I_clear_type(H5I_REFERENCE, FALSE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Close deprecated interface */
+            n += H5R__term_deprec_interface();
+
+            /* Destroy the reference id group */
+	    (void)H5I_dec_type_ref(H5I_REFERENCE);
+            n++; /*H5I*/
+
+            /* Mark closed */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5R_term_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_create
+ PURPOSE
+    Creates a particular kind of reference for the user
+ USAGE
+    herr_t H5R_create(ref, loc, name, ref_type, space)
+        void *ref;          OUT: Reference created
+        H5G_loc_t *loc;     IN: File location used to locate object pointed to
+        const char *name;   IN: Name of object at location LOC_ID of object
+                                    pointed to
+        H5R_type_t ref_type;    IN: Type of reference to create
+        H5S_t *space;       IN: Dataspace ID with selection, used for Dataset
+                                    Region references.
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Creates a particular type of reference specified with REF_TYPE, in the
+    space pointed to by REF.  The LOC_ID and NAME are used to locate the object
+    pointed to and the SPACE_ID is used to choose the region pointed to (for
+    Dataset Region references).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5R_create(void *_ref, H5G_loc_t *loc, const char *name, H5R_type_t ref_type, H5S_t *space, hid_t dxpl_id)
+{
+    H5G_loc_t	obj_loc;		/* Group hier. location of object */
+    H5G_name_t  path;            	/* Object group hier. path */
+    H5O_loc_t   oloc;            	/* Object object location */
+    hbool_t     obj_found = FALSE;      /* Object location found */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(_ref);
+    HDassert(loc);
+    HDassert(name);
+    HDassert(ref_type > H5R_BADTYPE && ref_type < H5R_MAXTYPE);
+
+    /* Set up object location to fill in */
+    obj_loc.oloc = &oloc;
+    obj_loc.path = &path;
+    H5G_loc_reset(&obj_loc);
+
+    /* Find the object */
+    if(H5G_loc_find(loc, name, &obj_loc, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_NOTFOUND, FAIL, "object not found")
+    obj_found = TRUE;
+
+    switch(ref_type) {
+        case H5R_OBJECT:
+        {
+            hobj_ref_t *ref = (hobj_ref_t *)_ref; /* Get pointer to correct type of reference struct */
+
+            *ref = obj_loc.oloc->addr;
+            break;
+        }
+
+        case H5R_DATASET_REGION:
+        {
+            H5HG_t hobjid;      /* Heap object ID */
+            hdset_reg_ref_t *ref = (hdset_reg_ref_t *)_ref; /* Get pointer to correct type of reference struct */
+            hssize_t buf_size;  /* Size of buffer needed to serialize selection */
+            uint8_t *p;       /* Pointer to OID to store */
+            uint8_t *buf;     /* Buffer to store serialized selection in */
+            unsigned heapid_found;  /* Flag for non-zero heap ID found */
+            unsigned u;        /* local index */
+
+            /* Set up information for dataset region */
+
+            /* Return any previous heap block to the free list if we are garbage collecting */
+            if(H5F_GC_REF(loc->oloc->file)) {
+                /* Check for an existing heap ID in the reference */
+                for(u = 0, heapid_found = 0, p = (uint8_t *)ref; u < H5R_DSET_REG_REF_BUF_SIZE; u++)
+                    if(p[u] != 0) {
+                        heapid_found = 1;
+                        break;
+                    } /* end if */
+
+                if(heapid_found != 0) {
+/* Return heap block to free list */
+                } /* end if */
+            } /* end if */
+
+            /* Zero the heap ID out, may leak heap space if user is re-using reference and doesn't have garbage collection on */
+            HDmemset(ref, 0, H5R_DSET_REG_REF_BUF_SIZE);
+
+            /* Get the amount of space required to serialize the selection */
+            if((buf_size = H5S_SELECT_SERIAL_SIZE(space)) < 0)
+                HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "Invalid amount of space for serializing selection")
+
+            /* Increase buffer size to allow for the dataset OID */
+            buf_size += (hssize_t)sizeof(haddr_t);
+
+            /* Allocate the space to store the serialized information */
+            H5_CHECK_OVERFLOW(buf_size, hssize_t, size_t);
+            if(NULL == (buf = (uint8_t *)H5MM_malloc((size_t)buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Serialize information for dataset OID into heap buffer */
+            p = (uint8_t *)buf;
+            H5F_addr_encode(loc->oloc->file, &p, obj_loc.oloc->addr);
+
+            /* Serialize the selection into heap buffer */
+            if(H5S_SELECT_SERIALIZE(space, p) < 0)
+                HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCOPY, FAIL, "Unable to serialize selection")
+
+            /* Save the serialized buffer for later */
+            H5_CHECK_OVERFLOW(buf_size, hssize_t, size_t);
+            if(H5HG_insert(loc->oloc->file, dxpl_id, (size_t)buf_size, buf, &hobjid) < 0)
+                HGOTO_ERROR(H5E_REFERENCE, H5E_WRITEERROR, FAIL, "Unable to serialize selection")
+
+            /* Serialize the heap ID and index for storage in the file */
+            p = (uint8_t *)ref;
+            H5F_addr_encode(loc->oloc->file, &p, hobjid.addr);
+            UINT32ENCODE(p, hobjid.idx);
+
+            /* Free the buffer we serialized data in */
+            H5MM_xfree(buf);
+            break;
+        }
+
+        case H5R_BADTYPE:
+        case H5R_MAXTYPE:
+        default:
+            HDassert("unknown reference type" && 0);
+            HGOTO_ERROR(H5E_REFERENCE, H5E_UNSUPPORTED, FAIL, "internal error (unknown reference type)")
+    } /* end switch */
+
+done:
+    if(obj_found)
+        H5G_loc_free(&obj_loc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5R_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rcreate
+ PURPOSE
+    Creates a particular kind of reference for the user
+ USAGE
+    herr_t H5Rcreate(ref, loc_id, name, ref_type, space_id)
+        void *ref;          OUT: Reference created
+        hid_t loc_id;       IN: Location ID used to locate object pointed to
+        const char *name;   IN: Name of object at location LOC_ID of object
+                                    pointed to
+        H5R_type_t ref_type;    IN: Type of reference to create
+        hid_t space_id;     IN: Dataspace ID with selection, used for Dataset
+                                    Region references.
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Creates a particular type of reference specified with REF_TYPE, in the
+    space pointed to by REF.  The LOC_ID and NAME are used to locate the object
+    pointed to and the SPACE_ID is used to choose the region pointed to (for
+    Dataset Region references).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t space_id)
+{
+    H5G_loc_t   loc;            /* File location */
+    H5S_t      *space = NULL;   /* Pointer to dataspace containing region */
+    herr_t      ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "*xi*sRti", ref, loc_id, name, ref_type, space_id);
+
+    /* Check args */
+    if(ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name given")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(ref_type != H5R_OBJECT && ref_type != H5R_DATASET_REGION)
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "reference type not supported")
+    if(space_id == (-1) && ref_type == H5R_DATASET_REGION)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "reference region dataspace id must be valid")
+    if(space_id != (-1) && (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Create reference */
+    if((ret_value = H5R_create(ref, &loc, name, ref_type, space, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to create reference")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rcreate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_dereference
+ PURPOSE
+    Opens the HDF5 object referenced.
+ USAGE
+    hid_t H5R_dereference(ref)
+        H5F_t *file;        IN: File the object being dereferenced is within
+        H5R_type_t ref_type;    IN: Type of reference
+        void *ref;          IN: Reference to open.
+
+ RETURNS
+    Valid ID on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, open that object and return an ID for
+    that object.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Currently only set up to work with references to datasets
+ EXAMPLES
+ REVISION LOG
+
+    M. Scot Breitenfeld
+    3 March 2015
+    Added a check for undefined reference pointer.
+--------------------------------------------------------------------------*/
+static hid_t
+H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, const void *_ref, hbool_t app_ref)
+{
+    H5O_loc_t oloc;             /* Object location */
+    H5G_name_t path;            /* Path of object */
+    H5G_loc_t loc;              /* Group location */
+    unsigned rc;		/* Reference count of object */
+    H5O_type_t obj_type;        /* Type of object */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(_ref);
+    HDassert(ref_type > H5R_BADTYPE && ref_type < H5R_MAXTYPE);
+    HDassert(file);
+
+    /* Initialize the object location */
+    H5O_loc_reset(&oloc);
+    oloc.file = file;
+
+    switch(ref_type) {
+        case H5R_OBJECT:
+            oloc.addr = *(const hobj_ref_t *)_ref; /* Only object references currently supported */
+	    if(!H5F_addr_defined(oloc.addr) || oloc.addr == 0)
+	      HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Undefined reference pointer")
+	      break;
+            
+        case H5R_DATASET_REGION:
+        {
+            H5HG_t hobjid;  /* Heap object ID */
+            uint8_t *buf;   /* Buffer to store serialized selection in */
+            const uint8_t *p;           /* Pointer to OID to store */
+
+            /* Get the heap ID for the dataset region */
+            p = (const uint8_t *)_ref;
+            H5F_addr_decode(oloc.file, &p, &(hobjid.addr));
+            UINT32DECODE(p, hobjid.idx);
+
+            if(!H5F_addr_defined(hobjid.addr) || hobjid.addr == 0)
+	      HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Undefined reference pointer")
+
+            /* Get the dataset region from the heap (allocate inside routine) */
+            if(NULL == (buf = (uint8_t *)H5HG_read(oloc.file, dxpl_id, &hobjid, NULL, NULL)))
+                HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
+
+            /* Get the object oid for the dataset */
+            p = buf;
+            H5F_addr_decode(oloc.file, &p, &(oloc.addr));
+
+            /* Free the buffer allocated in H5HG_read() */
+            H5MM_xfree(buf);
+        } /* end case */
+        break;
+
+        case H5R_BADTYPE:
+        case H5R_MAXTYPE:
+        default:
+            HDassert("unknown reference type" && 0);
+            HGOTO_ERROR(H5E_REFERENCE, H5E_UNSUPPORTED, FAIL, "internal error (unknown reference type)")
+    } /* end switch */
+
+    /* Get the # of links for object, and its type */
+    /* (To check to make certain that this object hasn't been deleted since the reference was created) */
+    if(H5O_get_rc_and_type(&oloc, dxpl_id, &rc, &obj_type) < 0 || 0 == rc)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_LINKCOUNT, FAIL, "dereferencing deleted object")
+
+    /* Construct a group location for opening the object */
+    H5G_name_reset(&path);
+    loc.oloc = &oloc;
+    loc.path = &path;
+
+    /* Open the object */
+    switch(obj_type) {
+        case H5O_TYPE_GROUP:
+            {
+                H5G_t *group;               /* Pointer to group to open */
+
+                if(NULL == (group = H5G_open(&loc, dxpl_id)))
+                    HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "not found")
+
+                /* Create an atom for the group */
+                if((ret_value = H5I_register(H5I_GROUP, group, app_ref)) < 0) {
+                    H5G_close(group);
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTREGISTER, FAIL, "can't register group")
+                } /* end if */
+            } /* end case */
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            {
+                H5T_t *type;                /* Pointer to datatype to open */
+
+                if(NULL == (type = H5T_open(&loc, dxpl_id)))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "not found")
+
+                /* Create an atom for the datatype */
+                if((ret_value = H5I_register(H5I_DATATYPE, type, app_ref)) < 0) {
+                    H5T_close(type);
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "can't register datatype")
+                } /* end if */
+            } /* end case */
+            break;
+
+        case H5O_TYPE_DATASET:
+            {
+                hid_t dapl_id = H5P_DATASET_ACCESS_DEFAULT; /* dapl to use to open dataset */
+                H5D_t *dset;                /* Pointer to dataset to open */
+
+                /* Open the dataset */
+                if(NULL == (dset = H5D_open(&loc, dapl_id, dxpl_id)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
+
+                /* Create an atom for the dataset */
+                if((ret_value = H5I_register(H5I_DATASET, dset, app_ref)) < 0) {
+                    H5D_close(dset);
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "can't register dataset")
+                } /* end if */
+            } /* end case */
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_REFERENCE, H5E_BADTYPE, FAIL, "can't identify type of object referenced")
+     } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5R_dereference() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rdereference
+ PURPOSE
+    Opens the HDF5 object referenced.
+ USAGE
+    hid_t H5Rdereference(ref)
+        hid_t id;       IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference to create
+        void *ref;      IN: Reference to open.
+
+ RETURNS
+    Valid ID on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, open that object and return an ID for
+    that object.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Rdereference(hid_t id, H5R_type_t ref_type, const void *_ref)
+{
+    H5G_loc_t loc;      /* Group location */
+    H5F_t *file = NULL; /* File object */
+    hid_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iRt*x", id, ref_type, _ref);
+
+    /* Check args */
+    if(H5G_loc(id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(_ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+
+    /* Get the file pointer from the entry */
+    file = loc.oloc->file;
+
+    /* Create reference */
+    if((ret_value = H5R_dereference(file, H5AC_ind_dxpl_id, ref_type, _ref, TRUE)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to dereference object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rdereference() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_get_region
+ PURPOSE
+    Retrieves a dataspace with the region pointed to selected.
+ USAGE
+    H5S_t *H5R_get_region(file, ref_type, ref)
+        H5F_t *file;        IN: File the object being dereferenced is within
+        void *ref;          IN: Reference to open.
+
+ RETURNS
+    Pointer to the dataspace on success, NULL on failure
+ DESCRIPTION
+    Given a reference to some object, creates a copy of the dataset pointed
+    to's dataspace and defines a selection in the copy which is the region
+    pointed to.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_t *
+H5R_get_region(H5F_t *file, hid_t dxpl_id, const void *_ref)
+{
+    H5O_loc_t oloc;             /* Object location */
+    const uint8_t *p;           /* Pointer to OID to store */
+    H5HG_t hobjid;              /* Heap object ID */
+    uint8_t *buf = NULL;        /* Buffer to store serialized selection in */
+    H5S_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(_ref);
+    HDassert(file);
+
+    /* Initialize the object location */
+    H5O_loc_reset(&oloc);
+    oloc.file = file;
+
+    /* Get the heap ID for the dataset region */
+    p = (const uint8_t *)_ref;
+    H5F_addr_decode(oloc.file, &p, &(hobjid.addr));
+    UINT32DECODE(p, hobjid.idx);
+
+    /* Get the dataset region from the heap (allocate inside routine) */
+    if((buf = (uint8_t *)H5HG_read(oloc.file, dxpl_id, &hobjid, NULL, NULL)) == NULL)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, NULL, "Unable to read dataset region information")
+
+    /* Get the object oid for the dataset */
+    p = buf;
+    H5F_addr_decode(oloc.file, &p, &(oloc.addr));
+
+    /* Open and copy the dataset's dataspace */
+    if((ret_value = H5S_read(&oloc, dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_NOTFOUND, NULL, "not found")
+
+    /* Unserialize the selection */
+    if(H5S_select_deserialize(ret_value, p) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTDECODE, NULL, "can't deserialize selection")
+
+done:
+    /* Free the buffer allocated in H5HG_read() */
+    if(buf)
+        H5MM_xfree(buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5R_get_region() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rget_region
+ PURPOSE
+    Retrieves a dataspace with the region pointed to selected.
+ USAGE
+    hid_t H5Rget_region(id, ref_type, ref)
+        hid_t id;       IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference to get region of
+        void *ref;        IN: Reference to open.
+
+ RETURNS
+    Valid ID on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, creates a copy of the dataset pointed
+    to's dataspace and defines a selection in the copy which is the region
+    pointed to.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Rget_region(hid_t id, H5R_type_t ref_type, const void *ref)
+{
+    H5G_loc_t loc;          /* Object's group location */
+    H5S_t *space = NULL;    /* Dataspace object */
+    hid_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iRt*x", id, ref_type, ref);
+
+    /* Check args */
+    if(H5G_loc(id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(ref_type != H5R_DATASET_REGION)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+
+    /* Get the dataspace with the correct region selected */
+    if((space = H5R_get_region(loc.oloc->file, H5AC_ind_dxpl_id, ref)) == NULL)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCREATE, FAIL, "unable to create dataspace")
+
+    /* Atomize */
+    if((ret_value = H5I_register (H5I_DATASPACE, space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rget_region() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_get_obj_type
+ PURPOSE
+    Retrieves the type of object that an object reference points to
+ USAGE
+    H5O_type_t H5R_get_obj_type(file, ref_type, ref)
+        H5F_t *file;        IN: File the object being dereferenced is within
+        H5R_type_t ref_type;    IN: Type of reference to query
+        void *ref;          IN: Reference to query.
+
+ RETURNS
+    Success:	An object type defined in H5Gpublic.h
+    Failure:	H5G_UNKNOWN
+ DESCRIPTION
+    Given a reference to some object, this function returns the type of object
+    pointed to.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5R_get_obj_type(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type,
+    const void *_ref, H5O_type_t *obj_type)
+{
+    H5O_loc_t oloc;             /* Object location */
+    unsigned rc;		/* Reference count of object    */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+    HDassert(_ref);
+
+    /* Initialize the symbol table entry */
+    H5O_loc_reset(&oloc);
+    oloc.file = file;
+
+    switch(ref_type) {
+        case H5R_OBJECT:
+            /* Get the object oid */
+            oloc.addr = *(const hobj_ref_t *)_ref; /* Only object references currently supported */
+            break;
+
+        case H5R_DATASET_REGION:
+        {
+            H5HG_t hobjid;      /* Heap object ID */
+            const uint8_t *p;   /* Pointer to reference to decode */
+            uint8_t *buf;       /* Buffer to store serialized selection in */
+
+            /* Get the heap ID for the dataset region */
+            p = (const uint8_t *)_ref;
+            H5F_addr_decode(oloc.file, &p, &(hobjid.addr));
+            UINT32DECODE(p, hobjid.idx);
+
+            /* Get the dataset region from the heap (allocate inside routine) */
+            if((buf = (uint8_t *)H5HG_read(oloc.file, dxpl_id, &hobjid, NULL, NULL)) == NULL)
+                HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
+
+            /* Get the object oid for the dataset */
+            p = buf;
+            H5F_addr_decode(oloc.file, &p, &(oloc.addr));
+
+            /* Free the buffer allocated in H5HG_read() */
+            H5MM_xfree(buf);
+        } /* end case */
+        break;
+
+        case H5R_BADTYPE:
+        case H5R_MAXTYPE:
+        default:
+            HDassert("unknown reference type" && 0);
+            HGOTO_ERROR(H5E_REFERENCE, H5E_UNSUPPORTED, FAIL, "internal error (unknown reference type)")
+    } /* end switch */
+
+    /* Get the # of links for object, and its type */
+    /* (To check to make certain that this object hasn't been deleted since the reference was created) */
+    if(H5O_get_rc_and_type(&oloc, dxpl_id, &rc, obj_type) < 0 || 0 == rc)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_LINKCOUNT, FAIL, "dereferencing deleted object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5R_get_obj_type() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rget_obj_type2
+ PURPOSE
+    Retrieves the type of object that an object reference points to
+ USAGE
+    herr_t H5Rget_obj_type2(id, ref_type, ref, obj_type)
+        hid_t id;       IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference to query
+        void *ref;          IN: Reference to query.
+        H5O_type_t *obj_type;   OUT: Type of object reference points to
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Given a reference to some object, this function retrieves the type of
+    object pointed to.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *ref,
+    H5O_type_t *obj_type)
+{
+    H5G_loc_t loc;              /* Object location */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iRt*x*Ot", id, ref_type, ref, obj_type);
+
+    /* Check args */
+    if(H5G_loc(id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+
+    /* Get the object information */
+    if(H5R_get_obj_type(loc.oloc->file, H5AC_ind_dxpl_id, ref_type, ref, obj_type) < 0)
+	HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to determine object type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rget_obj_type2() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_get_name
+ PURPOSE
+    Internal routine to determine a name for the object referenced
+ USAGE
+    ssize_t H5R_get_name(f, dxpl_id, ref_type, ref, name, size)
+        H5F_t *f;       IN: Pointer to the file that the reference is pointing
+                            into
+        hid_t lapl_id;  IN: LAPL to use for operation
+        hid_t dxpl_id;  IN: DXPL to use for operation
+        hid_t id;       IN: Location ID given for reference
+        H5R_type_t ref_type;    IN: Type of reference
+        void *ref;      IN: Reference to query.
+        char *name;     OUT: Buffer to place name of object referenced
+        size_t size;    IN: Size of name buffer
+
+ RETURNS
+    Non-negative length of the path on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, determine a path to the object
+    referenced in the file.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This may not be the only path to that object.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static ssize_t
+H5R_get_name(H5F_t *f, hid_t lapl_id, hid_t dxpl_id, hid_t id, H5R_type_t ref_type,
+    const void *_ref, char *name, size_t size)
+{
+    hid_t file_id = (-1);       /* ID for file that the reference is in */
+    H5O_loc_t oloc;             /* Object location describing object for reference */
+    ssize_t ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(f);
+    HDassert(_ref);
+    HDassert(name);
+
+    /* Initialize the object location */
+    H5O_loc_reset(&oloc);
+    oloc.file = f;
+
+    /* Get address for reference */
+    switch(ref_type) {
+        case H5R_OBJECT:
+            oloc.addr = *(const hobj_ref_t *)_ref;
+            break;
+
+        case H5R_DATASET_REGION:
+        {
+            H5HG_t hobjid;  /* Heap object ID */
+            uint8_t *buf;   /* Buffer to store serialized selection in */
+            const uint8_t *p;           /* Pointer to OID to store */
+
+            /* Get the heap ID for the dataset region */
+            p = (const uint8_t *)_ref;
+            H5F_addr_decode(oloc.file, &p, &(hobjid.addr));
+            UINT32DECODE(p, hobjid.idx);
+
+            /* Get the dataset region from the heap (allocate inside routine) */
+            if((buf = (uint8_t *)H5HG_read(oloc.file, dxpl_id, &hobjid, NULL, NULL)) == NULL)
+                HGOTO_ERROR(H5E_REFERENCE, H5E_READERROR, FAIL, "Unable to read dataset region information")
+
+            /* Get the object oid for the dataset */
+            p = buf;
+            H5F_addr_decode(oloc.file, &p, &(oloc.addr));
+
+            /* Free the buffer allocated in H5HG_read() */
+            H5MM_xfree(buf);
+        } /* end case */
+        break;
+
+        case H5R_BADTYPE:
+        case H5R_MAXTYPE:
+        default:
+            HDassert("unknown reference type" && 0);
+            HGOTO_ERROR(H5E_REFERENCE, H5E_UNSUPPORTED, FAIL, "internal error (unknown reference type)")
+    } /* end switch */
+
+    /* Retrieve file ID for name search */
+    if((file_id = H5I_get_file_id(id, FALSE)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, FAIL, "can't retrieve file ID")
+
+    /* Get name, length, etc. */
+    if((ret_value = H5G_get_name_by_addr(file_id, lapl_id, dxpl_id, &oloc, name, size)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, FAIL, "can't determine name")
+
+done:
+    /* Close file ID used for search */
+    if(file_id > 0 && H5I_dec_ref(file_id) < 0)
+        HDONE_ERROR(H5E_REFERENCE, H5E_CANTDEC, FAIL, "can't decrement ref count of temp ID")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5R_get_name() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rget_name
+ PURPOSE
+    Determines a name for the object referenced
+ USAGE
+    ssize_t H5Rget_name(loc_id, ref_type, ref, name, size)
+        hid_t loc_id;   IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference
+        void *ref;      IN: Reference to query.
+        char *name;     OUT: Buffer to place name of object referenced
+        size_t size;    IN: Size of name buffer
+
+ RETURNS
+    Non-negative length of the path on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, determine a path to the object
+    referenced in the file.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This may not be the only path to that object.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+ssize_t
+H5Rget_name(hid_t id, H5R_type_t ref_type, const void *_ref, char *name,
+    size_t size)
+{
+    H5G_loc_t loc;      /* Group location */
+    H5F_t *file;        /* File object */
+    ssize_t ret_value;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("Zs", "iRt*x*sz", id, ref_type, _ref, name, size);
+
+    /* Check args */
+    if(H5G_loc(id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(_ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+
+    /* Get the file pointer from the entry */
+    file = loc.oloc->file;
+
+    /* Get name */
+    if((ret_value = H5R_get_name(file, H5P_DEFAULT, H5AC_ind_dxpl_id, id, ref_type, _ref, name, size)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to determine object path")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Rget_name() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5RC.c b/gatb-core/thirdparty/hdf5/src/H5RC.c
new file mode 100644
index 0000000..6abe837
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5RC.c
@@ -0,0 +1,127 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Reference counting buffer algorithms.
+ *
+ * These are used for various internal buffers which are shared.
+ *
+ */
+
+
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5RCprivate.h"        /* Reference-counted buffers            */
+
+/* Private typedefs & structs */
+
+/* Declare a free list to manage the H5RC_t struct */
+H5FL_DEFINE_STATIC(H5RC_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RC_create
+ PURPOSE
+    Create a reference counted object
+ USAGE
+    H5RC_t *H5RC_create(o,free)
+        const void *o;          IN: Object to initialize ref-counted object with
+        H5RC_free_func_t free;  IN: Function to call when ref-count drop to zero
+
+ RETURNS
+    Returns a pointer to a new ref-counted object on success, NULL on failure.
+ DESCRIPTION
+    Create a reference counted object.  The object is not duplicated, it is
+    assumed to be owned by the reference counted object now and will be freed
+    with the 'free' function when the reference count drops to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RC_t *
+H5RC_create(void *o, H5RC_free_func_t free_func)
+{
+    H5RC_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(o);
+    HDassert(free_func);
+
+    /* Allocate ref-counted string structure */
+    if(NULL == (ret_value = H5FL_MALLOC(H5RC_t)))
+        HGOTO_ERROR(H5E_RS,H5E_NOSPACE,NULL,"memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->o = o;
+    ret_value->n = 1;
+    ret_value->free_func = free_func;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RC_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RC_decr
+ PURPOSE
+    Decrement the reference count for a ref-counted object
+ USAGE
+    herr_t H5RC_decr(rc)
+        H5RC_t *rc;             IN: Ref-counted object to decrement count for
+
+ RETURNS
+    SUCCEED/FAIL
+ DESCRIPTION
+    Decrements the reference count for a ref-counted object, calling the
+    object's free function if ref-count drops to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5RC_decr(H5RC_t *rc)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(rc);
+    HDassert(rc->o);
+    HDassert(rc->n > 0);
+    HDassert(rc->free_func);
+
+    /* Decrement reference count */
+    rc->n--;
+
+    /* Check if we should delete this object now */
+    if(rc->n == 0) {
+        if((rc->free_func)(rc->o) < 0) {
+            rc = H5FL_FREE(H5RC_t, rc);
+            HGOTO_ERROR(H5E_RS, H5E_CANTFREE, FAIL, "memory release failed")
+        } /* end if */
+        rc = H5FL_FREE(H5RC_t, rc);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RC_decr() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5RCprivate.h b/gatb-core/thirdparty/hdf5/src/H5RCprivate.h
new file mode 100644
index 0000000..2fe3551
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5RCprivate.h
@@ -0,0 +1,63 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5RC module
+ */
+#ifndef _H5RCprivate_H
+#define _H5RCprivate_H
+
+/**************************************/
+/* Public headers needed by this file */
+/**************************************/
+#ifdef LATER
+#include "H5RCpublic.h"
+#endif /* LATER */
+
+/***************************************/
+/* Private headers needed by this file */
+/***************************************/
+#include "H5private.h"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Typedef for function to release object when reference count drops to zero */
+typedef herr_t (*H5RC_free_func_t)(void *o);
+
+/* Typedef for reference counted objects */
+typedef struct H5RC_t {
+    void *o;            /* Object to be reference counted */
+    size_t n;           /* Reference count of number of pointers sharing object */
+    H5RC_free_func_t free_func; /* Function to free object */
+} H5RC_t;
+
+/**********/
+/* Macros */
+/**********/
+#define H5RC_INC(rc)            ((rc)->n++)
+#define H5RC_DEC(rc)            (H5RC_decr(rc))
+#define H5RC_GET_OBJ(rc)        ((rc)->o)
+
+/********************/
+/* Private routines */
+/********************/
+H5_DLL H5RC_t *H5RC_create(void *s, H5RC_free_func_t free_func);
+H5_DLL herr_t H5RC_decr(H5RC_t *rc);
+
+#endif /* _H5RSprivate_H */
+
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5RS.c b/gatb-core/thirdparty/hdf5/src/H5RS.c
new file mode 100644
index 0000000..5bbdabd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5RS.c
@@ -0,0 +1,499 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Reference counted string algorithms.
+ *
+ * These are used for various internal strings which get copied multiple times.
+ *
+ */
+
+
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5RSprivate.h"        /* Reference-counted strings            */
+
+/* Private typedefs & structs */
+struct H5RS_str_t {
+    char *s;            /* String to be reference counted */
+    unsigned wrapped;   /* Indicates that the string to be ref-counted is not copied */
+    unsigned n;         /* Reference count of number of pointers sharing string */
+};
+
+/* Declare a free list to manage the H5RS_str_t struct */
+H5FL_DEFINE_STATIC(H5RS_str_t);
+
+/* Declare the PQ free list for the wrapped strings */
+H5FL_BLK_DEFINE(str_buf);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_xstrdup
+ PURPOSE
+    Duplicate the string being reference counted
+ USAGE
+    char *H5RS_xstrdup(s)
+        const char *s;          IN: String to duplicate
+
+ RETURNS
+    Returns a pointer to a new string on success, NULL on failure.
+ DESCRIPTION
+    Duplicate a string buffer being reference counted.  Use this instead of
+    [H5MM_][x]strdup, in order to use the free-list memory routines.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static char *
+H5RS_xstrdup(const char *s)
+{
+    char *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(s) {
+        size_t len = HDstrlen(s) + 1;
+
+        ret_value = (char *)H5FL_BLK_MALLOC(str_buf, len);
+        HDassert(ret_value);
+        HDstrncpy(ret_value, s, len);
+    } /* end if */
+    else
+        ret_value = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_xstrdup() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_create
+ PURPOSE
+    Create a reference counted string
+ USAGE
+    H5RS_str_t *H5RS_create(s)
+        const char *s;          IN: String to initialize ref-counted string with
+
+ RETURNS
+    Returns a pointer to a new ref-counted string on success, NULL on failure.
+ DESCRIPTION
+    Create a reference counted string.  The string passed in is copied into an
+    internal buffer.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RS_str_t *
+H5RS_create(const char *s)
+{
+    H5RS_str_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate ref-counted string structure */
+    if(NULL == (ret_value = H5FL_MALLOC(H5RS_str_t)))
+        HGOTO_ERROR(H5E_RS, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->s = H5RS_xstrdup(s);
+    ret_value->wrapped = 0;
+    ret_value->n = 1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_wrap
+ PURPOSE
+    "Wrap" a reference counted string around an existing string
+ USAGE
+    H5RS_str_t *H5RS_wrap(s)
+        const char *s;          IN: String to wrap ref-counted string around
+
+ RETURNS
+    Returns a pointer to a new ref-counted string on success, NULL on failure.
+ DESCRIPTION
+    Wrap a reference counted string around an existing string, which is not
+    duplicated, unless its reference count gets incremented.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RS_str_t *
+H5RS_wrap(char *s)
+{
+    H5RS_str_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate ref-counted string structure */
+    if(NULL == (ret_value = H5FL_MALLOC(H5RS_str_t)))
+        HGOTO_ERROR(H5E_RS, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->s = s;
+    ret_value->wrapped = 1;
+    ret_value->n = 1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_wrap() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_own
+ PURPOSE
+    Transfer ownership of a regular string to a reference counted string
+ USAGE
+    H5RS_str_t *H5RS_own(s)
+        const char *s;          IN: String to transfer ownership of
+
+ RETURNS
+    Returns a pointer to a new ref-counted string on success, NULL on failure.
+ DESCRIPTION
+    Transfer ownership of a dynamically allocated string to a reference counted
+    string.  The routine which passed in the string should not attempt to free
+    it, the reference counting string routines will do that when the reference
+    count drops to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RS_str_t *
+H5RS_own(char *s)
+{
+    H5RS_str_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate ref-counted string structure */
+    if(NULL == (ret_value = H5FL_MALLOC(H5RS_str_t)))
+        HGOTO_ERROR(H5E_RS, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->s = s;
+    ret_value->wrapped = 0;
+    ret_value->n = 1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_own() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_decr
+ PURPOSE
+    Decrement the reference count for a ref-counted string
+ USAGE
+    herr_t H5RS_decr(rs)
+        H5RS_str_t *rs;     IN/OUT: Ref-counted string to decrement count of
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Decrement the reference count for a reference counted string.  If the
+    reference count drops to zero, the reference counted string is deleted.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5RS_decr(H5RS_str_t *rs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs);
+    HDassert(rs->n > 0);
+
+    /* Decrement reference count for string */
+    if((--rs->n) == 0) {
+        if(!rs->wrapped)
+            rs->s = (char *)H5FL_BLK_FREE(str_buf, rs->s);
+        rs = H5FL_FREE(H5RS_str_t, rs);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5RS_decr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_incr
+ PURPOSE
+    Increment the reference count for a ref-counted string
+ USAGE
+    herr_t H5RS_incr(rs)
+        H5RS_str_t *rs;     IN/OUT: Ref-counted string to increment count of
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Increment the reference count for a reference counted string.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5RS_incr(H5RS_str_t *rs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs);
+    HDassert(rs->n > 0);
+
+    /* If the ref-counted string started life as a wrapper around an existing
+     * string, duplicate the string now, so that the wrapped string can go out
+     * scope appropriately.
+     */
+    if(rs->wrapped) {
+        rs->s = H5RS_xstrdup(rs->s);
+        rs->wrapped = 0;
+    } /* end if */
+
+    /* Increment reference count for string */
+    rs->n++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5RS_incr() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_dup
+ PURPOSE
+    "Duplicate" a ref-counted string
+ USAGE
+    H5RS_str_t H5RS_dup(rs)
+        H5RS_str_t *rs;     IN/OUT: Ref-counted string to "duplicate"
+
+ RETURNS
+    Returns a pointer to ref-counted string on success, NULL on failure.
+ DESCRIPTION
+    Increment the reference count for the reference counted string and return
+    a pointer to it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RS_str_t *
+H5RS_dup(H5RS_str_t *ret_value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check for valid reference counted string */
+    if(ret_value != NULL)
+        /* Increment reference count for string */
+        ret_value->n++;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_dup() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_dup_str
+ PURPOSE
+    "Duplicate" a regular string into a ref-counted string
+ USAGE
+    H5RS_str_t H5RS_dup_str(s)
+        const char *s;     IN: Regular string to duplicate
+
+ RETURNS
+    Returns a pointer to ref-counted string on success, NULL on failure.
+ DESCRIPTION
+    Duplicate a regular string into a ref-counted string.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5RS_str_t *
+H5RS_dup_str(const char *s)
+{
+    char *new_str;              /* Duplicate of string */
+    size_t path_len;            /* Length of the path */
+    H5RS_str_t *ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(s);
+
+    /* Get the length of the string */
+    path_len = HDstrlen(s);
+
+    /* Allocate space for the string */
+    if(NULL == (new_str = (char *)H5FL_BLK_MALLOC(str_buf, path_len + 1)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy name for full path */
+    HDstrncpy(new_str, s, (path_len + 1));
+
+    /* Create reference counted string for path */
+    ret_value = H5RS_own(new_str);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5RS_dup_str() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_cmp
+ PURPOSE
+    Compare two ref-counted strings
+ USAGE
+    int H5RS_cmp(rs1,rs2)
+        const H5RS_str_t *rs1;  IN: First Ref-counted string to compare
+        const H5RS_str_t *rs2;  IN: Second Ref-counted string to compare
+
+ RETURNS
+    Returns positive, negative or 0 for comparison of two r-strings [same as
+    strcmp()]
+ DESCRIPTION
+    Compare two ref-counted strings and return a value indicating their sort
+    order [same as strcmp()]
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5RS_cmp(const H5RS_str_t *rs1, const H5RS_str_t *rs2)
+{
+    /* Can't return invalid value from this function */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs1);
+    HDassert(rs1->s);
+    HDassert(rs2);
+    HDassert(rs2->s);
+
+    FUNC_LEAVE_NOAPI(HDstrcmp(rs1->s, rs2->s))
+} /* end H5RS_cmp() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_len
+ PURPOSE
+    Compute the length of a ref-counted string
+ USAGE
+    ssize_t H5RS_cmp(rs)
+        const H5RS_str_t *rs;  IN: Ref-counted string to compute length of
+
+ RETURNS
+    Returns non-negative value on success, negative value on failure
+ DESCRIPTION
+    Compute the length of a ref-counted string.  [same as strlen()]
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+ssize_t
+H5RS_len(const H5RS_str_t *rs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs);
+    HDassert(rs->s);
+
+    FUNC_LEAVE_NOAPI((ssize_t)HDstrlen(rs->s))
+} /* end H5RS_len() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_get_str
+ PURPOSE
+    Get a pointer to the internal string contained in a ref-counted string
+ USAGE
+    char *H5RS_get_str(rs)
+        const H5RS_str_t *rs;   IN: Ref-counted string to get internal string from
+
+ RETURNS
+    Returns a pointer to the internal string being ref-counted on success,
+        NULL on failure.
+ DESCRIPTION
+    Gets a pointer to the internal string being reference counted.  This
+    pointer is volatile and might be invalid is further calls to the H5RS
+    API are made.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+char *
+H5RS_get_str(const H5RS_str_t *rs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs);
+    HDassert(rs->s);
+
+    FUNC_LEAVE_NOAPI(rs->s)
+} /* end H5RS_get_str() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5RS_get_count
+ PURPOSE
+    Get the reference count for a ref-counted string
+ USAGE
+    unsigned H5RS_get_count(rs)
+        const H5RS_str_t *rs;   IN: Ref-counted string to get internal count from
+
+ RETURNS
+    Returns the number of references to the internal string being ref-counted on success,
+        0 on failure.
+ DESCRIPTION
+    Gets the count of references to the reference counted string.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+unsigned
+H5RS_get_count(const H5RS_str_t *rs)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(rs);
+    HDassert(rs->n > 0);
+
+    FUNC_LEAVE_NOAPI(rs->n)
+} /* end H5RS_get_count() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5RSprivate.h b/gatb-core/thirdparty/hdf5/src/H5RSprivate.h
new file mode 100644
index 0000000..757e0e4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5RSprivate.h
@@ -0,0 +1,61 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5RS module
+ */
+#ifndef _H5RSprivate_H
+#define _H5RSprivate_H
+
+/**************************************/
+/* Public headers needed by this file */
+/**************************************/
+#ifdef LATER
+#include "H5RSpublic.h"
+#endif /* LATER */
+
+/***************************************/
+/* Private headers needed by this file */
+/***************************************/
+#include "H5private.h"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Typedef for reference counted string (defined in H5RS.c) */
+typedef struct H5RS_str_t H5RS_str_t;
+
+/**********/
+/* Macros */
+/**********/
+
+/********************/
+/* Private routines */
+/********************/
+H5_DLL H5RS_str_t *H5RS_create(const char *s);
+H5_DLL H5RS_str_t *H5RS_wrap(char *s);
+H5_DLL H5RS_str_t *H5RS_own(char *s);
+H5_DLL herr_t H5RS_decr(H5RS_str_t *rs);
+H5_DLL herr_t H5RS_incr(H5RS_str_t *rs);
+H5_DLL H5RS_str_t *H5RS_dup(H5RS_str_t *s);
+H5_DLL H5RS_str_t *H5RS_dup_str(const char *s);
+H5_DLL int H5RS_cmp(const H5RS_str_t *rs1, const H5RS_str_t *rs2);
+H5_DLL ssize_t H5RS_len(const H5RS_str_t *rs);
+H5_DLL char *H5RS_get_str(const H5RS_str_t *rs);
+H5_DLL unsigned H5RS_get_count(const H5RS_str_t *rs);
+
+#endif /* _H5RSprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Rdeprec.c b/gatb-core/thirdparty/hdf5/src/H5Rdeprec.c
new file mode 100644
index 0000000..049792e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Rdeprec.c
@@ -0,0 +1,186 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Rdeprec.c
+ *		September 13 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5R interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5R_PACKAGE		/*suppress error about including H5Rpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5R__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Rpkg.h"		/* References				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5R__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5R__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5R_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5R__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5R_init())
+} /* H5R__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5R__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5R__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5R__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5R__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rget_obj_type1
+ PURPOSE
+    Retrieves the type of object that an object reference points to
+ USAGE
+    H5G_obj_t H5Rget_obj_type1(id, ref_type, ref)
+        hid_t id;       IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference to query
+        void *ref;          IN: Reference to query.
+
+ RETURNS
+    Success:	An object type defined in H5Gpublic.h
+    Failure:	H5G_UNKNOWN
+ DESCRIPTION
+    Given a reference to some object, this function returns the type of object
+    pointed to.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5G_obj_t
+H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *ref)
+{
+    H5G_loc_t loc;              /* Object location */
+    H5O_type_t obj_type;        /* Object type */
+    H5G_obj_t ret_value;        /* Return value */
+
+    FUNC_ENTER_API(H5G_UNKNOWN)
+    H5TRACE3("Go", "iRt*x", id, ref_type, ref);
+
+    /* Check args */
+    if(H5G_loc(id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "not a location")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "invalid reference type")
+    if(ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "invalid reference pointer")
+
+    /* Get the object information */
+    if(H5R_get_obj_type(loc.oloc->file, H5AC_ind_dxpl_id, ref_type, ref, &obj_type) < 0)
+	HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, H5G_UNKNOWN, "unable to determine object type")
+
+    /* Set return value */
+    ret_value = H5G_map_obj_type(obj_type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rget_obj_type1() */
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Rpkg.h b/gatb-core/thirdparty/hdf5/src/H5Rpkg.h
new file mode 100644
index 0000000..2ff1c2c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Rpkg.h
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Quincey Koziol <koziol at hdfgroup.org>
+ *             Thursday, September 13, 2007
+ *
+ * Purpose:     This file contains declarations which are visible
+ *              only within the H5R package. Source files outside the
+ *              H5R package should include H5Rprivate.h instead.
+ */
+#ifndef H5R_PACKAGE
+#error "Do not include this file outside the H5R package!"
+#endif
+
+#ifndef _H5Rpkg_H
+#define _H5Rpkg_H
+
+/* Get package's private header */
+#include "H5Rprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5Fprivate.h"         /* File access				*/
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* General functions */
+H5_DLL herr_t H5R_init(void);
+H5_DLL herr_t H5R__term_deprec_interface(void);
+H5_DLL herr_t H5R_get_obj_type(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type,
+    const void *_ref, H5O_type_t *obj_type);
+
+
+#endif /* _H5Rpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Rprivate.h b/gatb-core/thirdparty/hdf5/src/H5Rprivate.h
new file mode 100644
index 0000000..60df636
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Rprivate.h
@@ -0,0 +1,31 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5R module
+ */
+#ifndef _H5Rprivate_H
+#define _H5Rprivate_H
+
+#include "H5Rpublic.h"
+
+/* Private headers needed by this file */
+
+/* Internal data structures */
+
+/* Private functions */
+
+#endif  /* _H5Rprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Rpublic.h b/gatb-core/thirdparty/hdf5/src/H5Rpublic.h
new file mode 100644
index 0000000..04d319b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Rpublic.h
@@ -0,0 +1,92 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5S module.
+ */
+#ifndef _H5Rpublic_H
+#define _H5Rpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Gpublic.h"
+#include "H5Ipublic.h"
+
+/*
+ * Reference types allowed.
+ */
+typedef enum {
+    H5R_BADTYPE     =   (-1),   /*invalid Reference Type                     */
+    H5R_OBJECT,                 /*Object reference                           */
+    H5R_DATASET_REGION,         /*Dataset Region Reference                   */
+    H5R_MAXTYPE                 /*highest type (Invalid as true type)	     */
+} H5R_type_t;
+
+/* Note! Be careful with the sizes of the references because they should really
+ * depend on the run-time values in the file.  Unfortunately, the arrays need
+ * to be defined at compile-time, so we have to go with the worst case sizes for
+ * them.  -QAK
+ */
+#define H5R_OBJ_REF_BUF_SIZE    sizeof(haddr_t)
+/* Object reference structure for user's code */
+typedef haddr_t hobj_ref_t; /* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) */
+
+#define H5R_DSET_REG_REF_BUF_SIZE    (sizeof(haddr_t)+4)
+/* 4 is used instead of sizeof(int) to permit portability between
+   the Crays and other machines (the heap ID is always encoded as an int32 anyway)
+*/
+/* Dataset Region reference structure for user's code */
+typedef unsigned char hdset_reg_ref_t[H5R_DSET_REG_REF_BUF_SIZE];/* Buffer to store heap ID and index */
+/* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) plus an int */
+
+/* Publicly visible data structures */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Functions in H5R.c */
+H5_DLL herr_t H5Rcreate(void *ref, hid_t loc_id, const char *name,
+			 H5R_type_t ref_type, hid_t space_id);
+H5_DLL hid_t H5Rdereference(hid_t dataset, H5R_type_t ref_type, const void *ref);
+H5_DLL hid_t H5Rget_region(hid_t dataset, H5R_type_t ref_type, const void *ref);
+H5_DLL herr_t H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *_ref,
+    H5O_type_t *obj_type);
+H5_DLL ssize_t H5Rget_name(hid_t loc_id, H5R_type_t ref_type, const void *ref,
+    char *name/*out*/, size_t size);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+
+/* Typedefs */
+
+
+/* Function prototypes */
+H5_DLL H5G_obj_t H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *_ref);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _H5Rpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5S.c b/gatb-core/thirdparty/hdf5/src/H5S.c
new file mode 100644
index 0000000..5eb4425
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5S.c
@@ -0,0 +1,2182 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5S_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Spkg.h"		/* Dataspaces 				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Version of datatype encoding */
+#define H5S_ENCODE_VERSION      0
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5S_set_extent_simple (H5S_t *space, unsigned rank,
+    const hsize_t *dims, const hsize_t *max);
+static htri_t H5S_is_simple(const H5S_t *sdim);
+static herr_t H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc);
+static H5S_t *H5S_decode(const unsigned char *buf);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5S_extent_t struct */
+H5FL_DEFINE(H5S_extent_t);
+
+/* Declare a free list to manage the H5S_t struct */
+H5FL_DEFINE(H5S_t);
+
+/* Declare a free list to manage the array's of hsize_t's */
+H5FL_ARR_DEFINE(hsize_t,H5S_MAX_RANK);
+
+/* Dataspace ID class */
+static const H5I_class_t H5I_DATASPACE_CLS[1] = {{
+    H5I_DATASPACE,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    2,				/* # of reserved IDs for class */
+    (H5I_free_t)H5S_close	/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5S_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5S_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_init_interface(void)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize the atom group for the file IDs */
+    if(H5I_register_type(H5I_DATASPACE_CLS) < 0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_init_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_term_interface
+ PURPOSE
+    Terminate various H5S objects
+ USAGE
+    void H5S_term_interface()
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Release the atom group and any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5S_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+	if(H5I_nmembers(H5I_DATASPACE) > 0) {
+	    (void)H5I_clear_type(H5I_DATASPACE, FALSE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
+        else {
+            /* Destroy the dataspace object id group */
+	    (void)H5I_dec_type_ref(H5I_DATASPACE);
+            n++; /*H5I*/
+
+	    /* Shut down interface */
+	    H5_interface_initialize_g = 0;
+	} /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5S_term_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_create
+ PURPOSE
+    Create empty, typed dataspace
+ USAGE
+   H5S_t *H5S_create(type)
+    H5S_type_t  type;           IN: Dataspace type to create
+ RETURNS
+    Pointer to dataspace on success, NULL on failure
+ DESCRIPTION
+    Creates a new dataspace of a given type.  The extent is undefined and the
+    selection is set to the "all" selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5S_t *
+H5S_create(H5S_class_t type)
+{
+    H5S_t *new_ds = NULL;    /* New dataspace created */
+    H5S_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Create a new dataspace */
+    if(NULL == (new_ds = H5FL_CALLOC(H5S_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Initialize default dataspace state */
+    new_ds->extent.type = type;
+    if(type == H5S_NULL)
+        new_ds->extent.version = H5O_SDSPACE_VERSION_2;
+    else
+        new_ds->extent.version = H5O_SDSPACE_VERSION_1;
+    new_ds->extent.rank = 0;
+    new_ds->extent.size = new_ds->extent.max = NULL;
+
+    switch(type) {
+        case H5S_SCALAR:
+            new_ds->extent.nelem = 1;
+            break;
+
+        case H5S_SIMPLE:
+        case H5S_NULL:
+            new_ds->extent.nelem = 0;
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown dataspace (extent) type" && 0);
+            break;
+    } /* end switch */
+
+    /* Start with "all" selection */
+    if(H5S_select_all(new_ds, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection")
+
+    /* Reset common selection info pointer */
+    new_ds->select.sel_info.hslab = NULL;
+
+    /* Reset "shared" info on extent */
+    if(H5O_msg_reset_share(H5O_SDSPACE_ID, &(new_ds->extent.sh_loc)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRESET, NULL, "unable to reset shared component info")
+
+    /* Set return value */
+    ret_value = new_ds;
+
+done:
+    if(ret_value == NULL) {
+        if(new_ds && H5S_close(new_ds) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, NULL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Screate
+ PURPOSE
+    Create empty, typed dataspace
+ USAGE
+   hid_t  H5Screate(type)
+    H5S_type_t  type;           IN: Dataspace type to create
+ RETURNS
+    Valid dataspace ID on success, negative on failure
+ DESCRIPTION
+    Creates a new dataspace of a given type.  The extent & selection are
+    undefined
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Screate(H5S_class_t type)
+{
+    H5S_t *new_ds=NULL;         /* New dataspace structure */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "Sc", type);
+
+    /* Check args */
+    if(type <= H5S_NO_CLASS || type > H5S_NULL)  /* don't allow complex dataspace yet */
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dataspace type")
+
+    if(NULL == (new_ds = H5S_create(type)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create dataspace")
+
+    /* Atomize */
+    if((ret_value = H5I_register (H5I_DATASPACE, new_ds, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    if(ret_value < 0) {
+        if(new_ds && H5S_close(new_ds) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Screate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_extent_release
+ *
+ * Purpose:	Releases all memory associated with a dataspace extent.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, July 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_extent_release(H5S_extent_t *extent)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(extent);
+
+    /* Release extent */
+    if(extent->type == H5S_SIMPLE) {
+        if(extent->size)
+            extent->size = H5FL_ARR_FREE(hsize_t, extent->size);
+        if(extent->max)
+            extent->max = H5FL_ARR_FREE(hsize_t, extent->max);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_extent_release() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_close
+ *
+ * Purpose:	Releases all memory associated with a dataspace.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_close(H5S_t *ds)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(ds);
+
+    /* Release selection (this should come before the extent release) */
+    if(H5S_SELECT_RELEASE(ds) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace selection")
+
+    /* Release extent */
+    if(H5S_extent_release(&ds->extent) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace extent")
+
+    /* Release the main structure */
+    ds = H5FL_FREE(H5S_t, ds);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sclose
+ *
+ * Purpose:	Release access to a dataspace object.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Errors:
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Sclose(hid_t space_id)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", space_id);
+
+    /* Check args */
+    if (NULL == H5I_object_verify(space_id,H5I_DATASPACE))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* When the reference count reaches zero the resources are freed */
+    if(H5I_dec_app_ref(space_id) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing id")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Scopy
+ *
+ * Purpose:	Copies a dataspace.
+ *
+ * Return:	Success:	ID of the new dataspace
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January 30, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Scopy(hid_t space_id)
+{
+    H5S_t	*src;
+    H5S_t	*dst = NULL;
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", space_id);
+
+    /* Check args */
+    if(NULL == (src = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Copy */
+    if(NULL == (dst = H5S_copy(src, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to copy dataspace")
+
+    /* Atomize */
+    if((ret_value = H5I_register (H5I_DATASPACE, dst, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    if(ret_value < 0) {
+        if(dst && H5S_close(dst) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Scopy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sextent_copy
+ *
+ * Purpose:	Copies a dataspace extent.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, July 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Sextent_copy(hid_t dst_id,hid_t src_id)
+{
+    H5S_t	*src;
+    H5S_t	*dst;
+    hid_t	ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ii", dst_id, src_id);
+
+    /* Check args */
+    if(NULL == (src = (H5S_t *)H5I_object_verify(src_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(NULL == (dst = (H5S_t *)H5I_object_verify(dst_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Copy */
+    if(H5S_extent_copy(&(dst->extent), &(src->extent), TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy extent")
+
+    /* If the selection is 'all', update the number of elements selected in the
+     * destination space */
+    if(H5S_SEL_ALL == H5S_GET_SELECT_TYPE(dst))
+        if(H5S_select_all(dst, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sextent_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_extent_copy
+ *
+ * Purpose:	Copies a dataspace extent
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June  3, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_extent_copy(H5S_extent_t *dst, const H5S_extent_t *src, hbool_t copy_max)
+{
+    unsigned u;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Release destination extent before we copy over it */
+    if(H5S_extent_release(dst) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace extent")
+
+    /* Copy the regular fields */
+    dst->type = src->type;
+    dst->version = src->version;
+    dst->nelem = src->nelem;
+    dst->rank = src->rank;
+
+    switch (src->type) {
+        case H5S_NULL:
+        case H5S_SCALAR:
+            dst->size = NULL;
+            dst->max = NULL;
+            break;
+
+        case H5S_SIMPLE:
+            if(src->size) {
+                dst->size = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)src->rank);
+                for(u = 0; u < src->rank; u++)
+                    dst->size[u] = src->size[u];
+            } /* end if */
+            else
+                dst->size = NULL;
+            if(copy_max && src->max) {
+                dst->max = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)src->rank);
+                for(u = 0; u < src->rank; u++)
+                    dst->max[u] = src->max[u];
+            } /* end if */
+            else
+                dst->max = NULL;
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown dataspace type" && 0);
+            break;
+    } /* end switch */
+
+    /* Copy the shared object info */
+    if(H5O_set_shared(&(dst->sh_loc), &(src->sh_loc)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy shared information")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extent_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_copy
+ *
+ * Purpose:	Copies a dataspace, by copying the extent and selection through
+ *          H5S_extent_copy and H5S_select_copy.  If the SHARE_SELECTION flag
+ *          is set, then the selection can be shared between the source and
+ *          destination dataspaces.  (This should only occur in situations
+ *          where the destination dataspace will immediately change to a new
+ *          selection)
+ *
+ * Return:	Success:	A pointer to a new copy of SRC
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_t *
+H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max)
+{
+    H5S_t		   *dst = NULL;
+    H5S_t		   *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(NULL == (dst = H5FL_CALLOC(H5S_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Copy the source dataspace's extent */
+    if(H5S_extent_copy(&(dst->extent), &(src->extent), copy_max) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy extent")
+
+    /* Copy the source dataspace's selection */
+    if(H5S_select_copy(dst, src, share_selection) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy select")
+
+    /* Set the return value */
+    ret_value = dst;
+
+done:
+    if(NULL == ret_value)
+        if(dst)
+            dst = H5FL_FREE(H5S_t, dst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_get_simple_extent_npoints
+ *
+ * Purpose:	Determines how many data points a dataset extent has.
+ *
+ * Return:	Success:	Number of data points in the dataset extent.
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Note:        This routine participates in the "Inlining C function pointers"
+ *              pattern, don't call it directly, use the appropriate macro
+ *              defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *  Changed Name - QAK 7/7/98
+ *
+ *-------------------------------------------------------------------------
+ */
+hssize_t
+H5S_get_simple_extent_npoints(const H5S_t *ds)
+{
+    hssize_t    ret_value;
+
+    FUNC_ENTER_NOAPI(-1)
+
+    /* check args */
+    HDassert(ds);
+
+    /* Get the number of elements in extent */
+    ret_value = (hssize_t)ds->extent.nelem;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_get_simple_extent_npoints() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sget_simple_extent_npoints
+ *
+ * Purpose:	Determines how many data points a dataset extent has.
+ *
+ * Return:	Success:	Number of data points in the dataset.
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *  Changed Name - QAK 7/7/98
+ *
+ *-------------------------------------------------------------------------
+ */
+hssize_t
+H5Sget_simple_extent_npoints(hid_t space_id)
+{
+    H5S_t		   *ds;
+    hssize_t		    ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Hs", "i", space_id);
+
+    /* Check args */
+    if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = (hssize_t)H5S_GET_EXTENT_NPOINTS(ds);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sget_simple_extent_npoints() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_get_npoints_max
+ *
+ * Purpose:	Determines the maximum number of data points a dataspace may
+ *		have.  If the `max' array is null then the maximum number of
+ *		data points is the same as the current number of data points
+ *		without regard to the hyperslab.  If any element of the `max'
+ *		array is zero then the maximum possible size is returned.
+ *
+ * Return:	Success:	Maximum number of data points the dataspace
+ *				may have.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5S_get_npoints_max(const H5S_t *ds)
+{
+    hsize_t	    ret_value;
+    unsigned	    u;
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* check args */
+    HDassert(ds);
+
+    switch (H5S_GET_EXTENT_TYPE(ds)) {
+        case H5S_NULL:
+            ret_value = 0;
+            break;
+
+        case H5S_SCALAR:
+            ret_value = 1;
+            break;
+
+        case H5S_SIMPLE:
+            if (ds->extent.max) {
+                for (ret_value=1, u=0; u<ds->extent.rank; u++) {
+                    if (H5S_UNLIMITED==ds->extent.max[u]) {
+                        ret_value = HSIZET_MAX;
+                        break;
+                    }
+                    else
+                        ret_value *= ds->extent.max[u];
+                }
+            }
+            else {
+                for (ret_value=1, u=0; u<ds->extent.rank; u++)
+                    ret_value *= ds->extent.size[u];
+            }
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown dataspace class" && 0);
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, "internal error (unknown dataspace class)")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sget_simple_extent_ndims
+ *
+ * Purpose:	Determines the dimensionality of a dataspace.
+ *
+ * Return:	Success:	The number of dimensions in a dataspace.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Sget_simple_extent_ndims(hid_t space_id)
+{
+    H5S_t		   *ds;
+    int		   ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", space_id);
+
+    /* Check args */
+    if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = (int)H5S_GET_EXTENT_NDIMS(ds);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sget_simple_extent_ndims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_get_simple_extent_ndims
+ *
+ * Purpose:	Returns the number of dimensions in a dataspace.
+ *
+ * Return:	Success:	Non-negative number of dimensions.  Zero
+ *				implies a scalar.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December 11, 1997
+ *
+ * Note:        This routine participates in the "Inlining C function pointers"
+ *              pattern, don't call it directly, use the appropriate macro
+ *              defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5S_get_simple_extent_ndims(const H5S_t *ds)
+{
+    int	ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(ds);
+
+    switch(H5S_GET_EXTENT_TYPE(ds)) {
+        case H5S_NULL:
+        case H5S_SCALAR:
+        case H5S_SIMPLE:
+            ret_value = (int)ds->extent.rank;
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown dataspace class" && 0);
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "internal error (unknown dataspace class)")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_get_simple_extent_ndims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sget_simple_extent_dims
+ *
+ * Purpose:	Returns the size and maximum sizes in each dimension of
+ *		a dataspace DS through	the DIMS and MAXDIMS arguments.
+ *
+ * Return:	Success:	Number of dimensions, the same value as
+ *				returned by H5Sget_simple_extent_ndims().
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December 11, 1997
+ *
+ * Modifications:
+ *		June 18, 1998	Albert Cheng
+ *		Added maxdims argument.  Removed dims argument check
+ *		since it can still return ndims even if both dims and
+ *		maxdims are NULLs.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Sget_simple_extent_dims(hid_t space_id, hsize_t dims[]/*out*/,
+			  hsize_t maxdims[]/*out*/)
+{
+    H5S_t		   *ds;
+    int		   ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Is", "ixx", space_id, dims, maxdims);
+
+    /* Check args */
+    if (NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = H5S_get_simple_extent_dims(ds, dims, maxdims);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_extent_get_dims
+ *
+ * Purpose:	Returns the size in each dimension of a dataspace.  This
+ *		function may not be meaningful for all types of dataspaces.
+ *
+ * Return:	Success:	Number of dimensions.  Zero implies scalar.
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, June 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5S_extent_get_dims(const H5S_extent_t *ext, hsize_t dims[], hsize_t max_dims[])
+{
+    int	i;              /* Local index variable */
+    int	ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(ext);
+
+    switch(ext->type) {
+        case H5S_NULL:
+        case H5S_SCALAR:
+            ret_value = 0;
+            break;
+
+        case H5S_SIMPLE:
+            ret_value = (int)ext->rank;
+            for(i = 0; i < ret_value; i++) {
+                if(dims)
+                    dims[i] = ext->size[i];
+                if(max_dims) {
+                    if(ext->max)
+                        max_dims[i] = ext->max[i];
+                    else
+                        max_dims[i] = ext->size[i];
+                } /* end if */
+            } /* end for */
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown dataspace class" && 0);
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "internal error (unknown dataspace class)")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extent_get_dims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_get_simple_extent_dims
+ *
+ * Purpose:	Returns the size in each dimension of a dataspace.  This
+ *		function may not be meaningful for all types of dataspaces.
+ *
+ * Return:	Success:	Number of dimensions.  Zero implies scalar.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[], hsize_t max_dims[])
+{
+    int	ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(ds);
+
+    /* Get dims for extent */
+    if((ret_value = H5S_extent_get_dims(&ds->extent, dims, max_dims)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve dataspace extent dims")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_get_simple_extent_dims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_write
+ *
+ * Purpose:	Updates a dataspace by writing a message to an object
+ *		header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_write(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned update_flags, H5S_t *ds)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(oh);
+    HDassert(ds);
+    HDassert(H5S_GET_EXTENT_TYPE(ds) >= 0);
+
+    /* Write the current dataspace extent to the dataspace message */
+    if(H5O_msg_write_oh(f, dxpl_id, oh, H5O_SDSPACE_ID, 0, update_flags, &(ds->extent)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't update simple dataspace message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_append
+ *
+ * Purpose:	Updates a dataspace by adding a message to an object
+ *		header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, December 31, 2002
+ *
+ * Modifications:
+ *
+ *              John Mainzer, 6/6/05
+ *              Updated function to use the new dirtied parameter of
+ *              H5AC_unprotect() instead of manipulating the is_dirty
+ *              field of the cache info.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_append(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5S_t *ds)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(oh);
+    HDassert(ds);
+    HDassert(H5S_GET_EXTENT_TYPE(ds) >= 0);
+
+    /* Add the dataspace message to the object header */
+    if(H5O_msg_append_oh(f, dxpl_id, oh, H5O_SDSPACE_ID, 0, 0, &(ds->extent)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't add simple dataspace message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_append() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_read
+ *
+ * Purpose:	Reads the dataspace from an object header.
+ *
+ * Return:	Success:	Pointer to a new dataspace.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_t *
+H5S_read(const H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5S_t	   *ds = NULL;          /* Dataspace to return */
+    H5S_t	   *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+
+    if(NULL == (ds = H5FL_CALLOC(H5S_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    if(H5O_msg_read(loc, H5O_SDSPACE_ID, &(ds->extent), dxpl_id) == NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "unable to load dataspace info from dataset header")
+
+    /* Default to entire dataspace being selected */
+    if(H5S_select_all(ds, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection")
+
+    /* Set the value for successful return */
+    ret_value = ds;
+
+done:
+    if(ret_value == NULL) {
+        if(ds != NULL)
+            ds = H5FL_FREE(H5S_t, ds);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_read() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_is_simple
+ PURPOSE
+    Check if a dataspace is simple (internal)
+ USAGE
+    htri_t H5S_is_simple(sdim)
+	H5S_t *sdim;		IN: Pointer to dataspace object to query
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+	This function determines the if a dataspace is "simple". ie. if it
+    has orthogonal, evenly spaced dimensions.
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_is_simple(const H5S_t *sdim)
+{
+    htri_t		    ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args and all the boring stuff. */
+    HDassert(sdim);
+
+    /* H5S_NULL shouldn't be simple dataspace */
+    ret_value = (H5S_GET_EXTENT_TYPE(sdim) == H5S_SIMPLE ||
+	  H5S_GET_EXTENT_TYPE(sdim) == H5S_SCALAR) ? TRUE : FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_is_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sis_simple
+ PURPOSE
+    Check if a dataspace is simple
+ USAGE
+    htri_t H5Sis_simple(space_id)
+	hid_t space_id;	      IN: ID of dataspace object to query
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+	This function determines the if a dataspace is "simple". ie. if it
+    has orthogonal, evenly spaced dimensions.
+--------------------------------------------------------------------------*/
+htri_t
+H5Sis_simple(hid_t space_id)
+{
+    H5S_t		   *space;	/* dataspace to modify */
+    htri_t		    ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", space_id);
+
+    /* Check args and all the boring stuff. */
+    if ((space = (H5S_t *)H5I_object_verify(space_id,H5I_DATASPACE)) == NULL)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
+
+    ret_value = H5S_is_simple(space);
+
+  done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sset_extent_simple
+ PURPOSE
+    Sets the size of a simple dataspace
+ USAGE
+    herr_t H5Sset_extent_simple(space_id, rank, dims, max)
+        hid_t space_id;	      IN: Dataspace object to query
+        int rank;	      IN: # of dimensions for the dataspace
+        const size_t *dims;   IN: Size of each dimension for the dataspace
+ 	const size_t *max;    IN: Maximum size of each dimension for the
+ 				  dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function sets the number and size of each dimension in the
+    dataspace. Setting RANK to a value of zero converts the dataspace to a
+    scalar dataspace.  Dimensions are specified from slowest to fastest
+    changing in the DIMS array (i.e. 'C' order).  Setting the size of a
+    dimension in the MAX array to zero indicates that the dimension is of
+    unlimited size and should be allowed to expand.  If MAX is NULL, the
+    dimensions in the DIMS array are used as the maximum dimensions.
+    Currently, only the first dimension in the array (the slowest) may be
+    unlimited in size.
+
+ MODIFICATION
+    A null dataspace cannot be created from simple space with this function.
+
+    Christian Chilan 01/17/2007
+    Verifies that each element of DIMS is not equal to H5S_UNLIMITED.
+
+    Raymond Lu 03/30/2011
+    We allow 0 dimension size for non-unlimited dimension starting from 1.8.7
+    release.
+--------------------------------------------------------------------------*/
+herr_t
+H5Sset_extent_simple(hid_t space_id, int rank, const hsize_t dims[/*rank*/],
+		      const hsize_t max[/*rank*/])
+{
+    H5S_t	*space;	/* dataspace to modify */
+    int	        u;	/* local counting variable */
+    herr_t      ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iIs*[a1]h*[a1]h", space_id, rank, dims, max);
+
+    /* Check args */
+    if ((space = (H5S_t *)H5I_object_verify(space_id,H5I_DATASPACE)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
+    if (rank > 0 && dims == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified")
+    if (rank<0 || rank>H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid rank")
+    if (dims) {
+        for (u=0; u<rank; u++) {
+            if (H5S_UNLIMITED==dims[u])
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "current dimension must have a specific size, not H5S_UNLIMITED")
+        }
+    }
+    if (max!=NULL) {
+        if(dims==NULL)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "maximum dimension specified, but no current dimensions specified")
+        for (u=0; u<rank; u++) {
+            if (max[u]!=H5S_UNLIMITED && max[u]<dims[u])
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid maximum dimension size")
+        }
+    }
+
+    /* Do it */
+    if (H5S_set_extent_simple(space, (unsigned)rank, dims, max)<0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set simple extent")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_set_extent_simple
+ *
+ * Purpose:	This is where the real work happens for
+ *		H5Sset_extent_simple().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke (copied from H5Sset_extent_simple)
+ *              Wednesday, July  8, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_set_extent_simple(H5S_t *space, unsigned rank, const hsize_t *dims,
+		       const hsize_t *max)
+{
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(rank <= H5S_MAX_RANK);
+    HDassert(0 == rank || dims);
+
+    /* shift out of the previous state to a "simple" dataspace.  */
+    if(H5S_extent_release(&space->extent) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "failed to release previous dataspace extent")
+
+    if(rank == 0) {		/* scalar variable */
+        space->extent.type = H5S_SCALAR;
+        space->extent.nelem = 1;
+        space->extent.rank = 0;	/* set to scalar rank */
+    } /* end if */
+    else {
+        hsize_t nelem;  /* Number of elements in extent */
+
+        space->extent.type = H5S_SIMPLE;
+
+        /* Set the rank and allocate space for the dims */
+        space->extent.rank = rank;
+        space->extent.size = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)rank);
+
+        /* Copy the dimensions & compute the number of elements in the extent */
+        for(u = 0, nelem = 1; u < space->extent.rank; u++) {
+            space->extent.size[u] = dims[u];
+            nelem *= dims[u];
+        } /* end for */
+        space->extent.nelem = nelem;
+
+        /* Copy the maximum dimensions if specified. Otherwise, the maximal dimensions are the 
+         * same as the dimension */
+        space->extent.max = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)rank);
+        if(max != NULL) {
+            HDmemcpy(space->extent.max, max, sizeof(hsize_t) * rank);
+        } else {
+            for(u = 0; u < space->extent.rank; u++)
+                space->extent.max[u] = dims[u];
+        }
+    } /* end else */
+
+    /* Selection related cleanup */
+
+    /* Set offset to zeros */
+    HDmemset(space->select.offset, 0, sizeof(hsize_t) * space->extent.rank);
+    space->select.offset_changed = FALSE;
+
+    /* If the selection is 'all', update the number of elements selected */
+    if(H5S_GET_SELECT_TYPE(space) == H5S_SEL_ALL)
+        if(H5S_select_all(space, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_set_extent_simple() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Screate_simple
+ *
+ * Purpose:	Creates a new simple dataspace object and opens it for
+ *		access. The DIMS argument is the size of the simple dataset
+ *		and the MAXDIMS argument is the upper limit on the size of
+ *		the dataset.  MAXDIMS may be the null pointer in which case
+ *		the upper limit is the same as DIMS.  If an element of
+ *		MAXDIMS is H5S_UNLIMITED then the corresponding dimension is
+ *		unlimited, otherwise no element of MAXDIMS should be smaller
+ *		than the corresponding element of DIMS.
+ *
+ * Return:	Success:	The ID for the new simple dataspace object.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, January  27, 1998
+ *
+ * Modification:
+ *              Raymond Lu 03/30/2011
+ *              We allow 0-dimension for non-unlimited dimension starting 
+ *              from 1.8.7 release.
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Screate_simple(int rank, const hsize_t dims[/*rank*/],
+		  const hsize_t maxdims[/*rank*/])
+{
+    H5S_t	*space = NULL;
+    int		i;
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "Is*[a0]h*[a0]h", rank, dims, maxdims);
+
+    /* Check arguments */
+    if(rank < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimensionality cannot be negative")
+    if(rank > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimensionality is too large")
+
+    /* We allow users to use this function to create scalar or null dataspace.
+     * Check DIMS isn't set when the RANK is 0.
+     */
+    if(!dims && rank != 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dataspace information")
+
+    /* Check whether the current dimensions are valid */
+    for(i = 0; i < rank; i++) {
+        if(H5S_UNLIMITED == dims[i])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "current dimension must have a specific size, not H5S_UNLIMITED")
+        if(maxdims && H5S_UNLIMITED != maxdims[i] && maxdims[i]<dims[i])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "maxdims is smaller than dims")
+    } /* end for */
+
+    /* Create the space and set the extent */
+    if(NULL == (space = H5S_create_simple((unsigned)rank,dims,maxdims)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+    /* Atomize */
+    if((ret_value = H5I_register (H5I_DATASPACE, space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+
+done:
+    if(ret_value < 0) {
+        if(space && H5S_close(space) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Screate_simple() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_create_simple
+ *
+ * Purpose:	Internal function to create simple dataspace
+ *
+ * Return:	Success:	The ID for the new simple dataspace object.
+ *		Failure:	Negative
+ *
+ * Errors:
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, April  3, 2003
+ *
+ * Modifications:
+ *              Extracted from H5Screate_simple
+ *              Quincey Koziol, Thursday, April  3, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_t *
+H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/],
+		  const hsize_t maxdims[/*rank*/])
+{
+    H5S_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check arguments */
+    HDassert(rank <=H5S_MAX_RANK);
+
+    /* Create the space and set the extent */
+    if(NULL==(ret_value=H5S_create(H5S_SIMPLE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, NULL, "can't create simple dataspace")
+    if(H5S_set_extent_simple(ret_value,rank,dims,maxdims)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "can't set dimensions")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_create_simple() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sencode
+ *
+ * Purpose:	Given a dataspace ID, converts the object description
+ *              (including selection) into binary in a buffer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Sencode(hid_t obj_id, void *buf, size_t *nalloc)
+{
+    H5S_t       *dspace;
+    herr_t      ret_value=SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x*z", obj_id, buf, nalloc);
+
+    /* Check argument and retrieve object */
+    if (NULL==(dspace=(H5S_t *)H5I_object_verify(obj_id, H5I_DATASPACE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    if(H5S_encode(dspace, (unsigned char *)buf, nalloc)<0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_encode
+ *
+ * Purpose:	Private function for H5Sencode.  Converts an object
+ *              description for dataspace and its selection into binary
+ *              in a buffer.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
+{
+    size_t      extent_size;    /* Size of serialized dataspace extent */
+    hssize_t    sselect_size;   /* Signed size of serialized dataspace selection */
+    size_t      select_size;    /* Size of serialized dataspace selection */
+    H5F_t       *f = NULL;      /* Fake file structure*/
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate "fake" file structure */
+    if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
+
+    /* Find out the size of buffer needed for extent */
+    if((extent_size = H5O_msg_raw_size(f, H5O_SDSPACE_ID, TRUE, obj)) == 0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace size")
+
+    /* Find out the size of buffer needed for selection */
+    if((sselect_size = H5S_SELECT_SERIAL_SIZE(obj)) < 0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace selection size")
+    H5_CHECKED_ASSIGN(select_size, size_t, sselect_size, hssize_t);
+
+    /* Verify the size of buffer.  If it's not big enough, simply return the
+     * right size without filling the buffer. */
+    if(!buf || *nalloc < (extent_size + select_size + 1 + 1 + 1 + 4))
+        *nalloc = extent_size + select_size + 1 + 1 + 1 + 4;
+    else {
+        /* Encode the type of the information */
+        *buf++ = H5O_SDSPACE_ID;
+
+        /* Encode the version of the dataspace information */
+        *buf++ = H5S_ENCODE_VERSION;
+
+        /* Encode the "size of size" information */
+        *buf++ = (unsigned char)H5F_SIZEOF_SIZE(f);
+
+        /* Encode size of extent information. Pointer is actually moved in this macro. */
+        UINT32ENCODE(buf, extent_size);
+
+        /* Encode the extent part of dataspace */
+        if(H5O_msg_encode(f, H5O_SDSPACE_ID, TRUE, buf, obj) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space")
+        buf += extent_size;
+
+        /* Encode the selection part of dataspace.  */
+        if(H5S_SELECT_SERIALIZE(obj, buf) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space")
+    } /* end else */
+
+done:
+    /* Release fake file structure */
+    if(f && H5F_fake_free(f) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release fake file struct")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sdecode
+ *
+ * Purpose:	Decode a binary object description of dataspace and
+ *              return a new object handle.
+ *
+ * Return:	Success:	dataspace ID(non-negative)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Sdecode(const void *buf)
+{
+    H5S_t       *ds;
+    hid_t       ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "*x", buf);
+
+    if(buf == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer")
+
+    if((ds = H5S_decode((const unsigned char *)buf)) == NULL)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, FAIL, "can't decode object")
+
+    /* Register the type and return the ID */
+    if((ret_value = H5I_register(H5I_DATASPACE, ds, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTREGISTER, FAIL, "unable to register dataspace")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sdecode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_decode
+ *
+ * Purpose:	Private function for H5Sdecode.  Reconstructs a binary
+ *              description of dataspace and returns a new object handle.
+ *
+ * Return:	Success:	dataspace ID(non-negative)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5S_t*
+H5S_decode(const unsigned char *buf)
+{
+    H5S_t       *ds;
+    H5S_extent_t *extent;
+    size_t      extent_size;            /* size of the extent message*/
+    H5F_t       *f = NULL;              /* Fake file structure*/
+    uint8_t     sizeof_size;            /* 'Size of sizes' for file */
+    H5S_t       *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Decode the type of the information */
+    if(*buf++ != H5O_SDSPACE_ID)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_BADMESG, NULL, "not an encoded dataspace")
+
+    /* Decode the version of the dataspace information */
+    if(*buf++ != H5S_ENCODE_VERSION)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_VERSION, NULL, "unknown version of encoded dataspace")
+
+    /* Decode the "size of size" information */
+    sizeof_size = *buf++;
+
+    /* Allocate "fake" file structure */
+    if(NULL == (f = H5F_fake_alloc(sizeof_size)))
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
+
+    /* Decode size of extent information */
+    UINT32DECODE(buf, extent_size);
+
+    /* Decode the extent part of dataspace */
+    /* (pass mostly bogus file pointer and bogus DXPL) */
+    if((extent = (H5S_extent_t *)H5O_msg_decode(f, H5P_DEFAULT, NULL, H5O_SDSPACE_ID, buf))==NULL)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode object")
+    buf += extent_size;
+
+    /* Copy the extent into dataspace structure */
+    if((ds = H5FL_CALLOC(H5S_t))==NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for dataspace conversion path table")
+    if(H5O_msg_copy(H5O_SDSPACE_ID, extent, &(ds->extent)) == NULL)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy object")
+    if(H5S_extent_release(extent) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTDELETE, NULL, "can't release previous dataspace")
+    extent = H5FL_FREE(H5S_extent_t, extent);
+
+    /* Initialize to "all" selection. Deserialization relies on valid existing selection. */
+    if(H5S_select_all(ds, FALSE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection")
+
+    /* Decode the select part of dataspace.  I believe this part always exists. */
+    if(H5S_SELECT_DESERIALIZE(ds, buf) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode space selection")
+
+    /* Set return value */
+    ret_value = ds;
+
+done:
+    /* Release fake file structure */
+    if(f && H5F_fake_free(f) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, NULL, "unable to release fake file struct")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_get_simple_extent_type
+ *
+ * Purpose:	Internal function for retrieving the type of extent for a dataspace object
+ *
+ * Return:	Success:	The class of the dataspace object
+ *
+ *		Failure:	N5S_NO_CLASS
+ *
+ * Errors:
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 28, 2000
+ *
+ * Note:        This routine participates in the "Inlining C function pointers"
+ *              pattern, don't call it directly, use the appropriate macro
+ *              defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_class_t
+H5S_get_simple_extent_type(const H5S_t *space)
+{
+    H5S_class_t	ret_value;
+
+    FUNC_ENTER_NOAPI(H5S_NO_CLASS)
+
+    HDassert(space);
+
+    ret_value=H5S_GET_EXTENT_TYPE(space);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sget_simple_extent_type
+ *
+ * Purpose:	Retrieves the type of extent for a dataspace object
+ *
+ * Return:	Success:	The class of the dataspace object
+ *
+ *		Failure:	N5S_NO_CLASS
+ *
+ * Errors:
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, July 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5S_class_t
+H5Sget_simple_extent_type(hid_t sid)
+{
+    H5S_t	*space;
+    H5S_class_t	ret_value;
+
+    FUNC_ENTER_API(H5S_NO_CLASS)
+    H5TRACE1("Sc", "i", sid);
+
+    /* Check arguments */
+    if (NULL == (space = (H5S_t *)H5I_object_verify(sid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5S_NO_CLASS, "not a dataspace")
+
+    ret_value=H5S_GET_EXTENT_TYPE(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sset_extent_none
+ PURPOSE
+    Resets the extent of a dataspace back to "none"
+ USAGE
+    herr_t H5Sset_extent_none(space_id)
+        hid_t space_id;	      IN: Dataspace object to reset
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function resets the type of a dataspace back to "none" with no
+    extent information stored for the dataspace.
+--------------------------------------------------------------------------*/
+herr_t
+H5Sset_extent_none(hid_t space_id)
+{
+    H5S_t		   *space;	/* dataspace to modify */
+    herr_t                  ret_value=SUCCEED;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", space_id);
+
+    /* Check args */
+    if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
+
+    /* Clear the previous extent from the dataspace */
+    if(H5S_extent_release(&space->extent)<0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTDELETE, FAIL, "can't release previous dataspace")
+
+    space->extent.type=H5S_NO_CLASS;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Sset_extent_none() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Soffset_simple
+ PURPOSE
+    Changes the offset of a selection within a simple dataspace extent
+ USAGE
+    herr_t H5Soffset_simple(space_id, offset)
+        hid_t space_id;	        IN: Dataspace object to reset
+        const hssize_t *offset; IN: Offset to position the selection at
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+	This function creates an offset for the selection within an extent, allowing
+    the same shaped selection to be moved to different locations within a
+    dataspace without requiring it to be re-defined.
+--------------------------------------------------------------------------*/
+herr_t
+H5Soffset_simple(hid_t space_id, const hssize_t *offset)
+{
+    H5S_t		   *space;	/* dataspace to modify */
+    herr_t                  ret_value=SUCCEED;  /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Hs", space_id, offset);
+
+    /* Check args */
+    if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
+    if (space->extent.rank==0 || (H5S_GET_EXTENT_TYPE(space)==H5S_SCALAR
+            || H5S_GET_EXTENT_TYPE(space)==H5S_NULL))
+        HGOTO_ERROR(H5E_ATOM, H5E_UNSUPPORTED, FAIL, "can't set offset on scalar or null dataspace")
+    if (offset == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no offset specified")
+
+    /* Set the selection offset */
+    if(H5S_select_offset(space,offset)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set offset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Soffset_simple() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5S_set_extent
+ *
+ * Purpose:     Modify the dimensions of a dataspace. Based on H5S_extend
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Pedro Vicente, pvn at ncsa.uiuc.edu
+ *              March 13, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5S_set_extent(H5S_t *space, const hsize_t *size)
+{
+    unsigned u;                 /* Local index variable */
+    htri_t ret_value = FALSE;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space && H5S_SIMPLE == H5S_GET_EXTENT_TYPE(space));
+    HDassert(size);
+
+    /* Verify that the dimensions being changed are allowed to change */
+    for(u = 0; u < space->extent.rank; u++) {
+        if(space->extent.size[u] != size[u]) {
+            /* Check for invalid dimension size modification */
+            if(space->extent.max && H5S_UNLIMITED != space->extent.max[u] &&
+                     space->extent.max[u] < size[u])
+                 HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "dimension cannot exceed the existing maximal size (new: %llu max: %llu)", (unsigned long long)size[u], (unsigned long long)space->extent.max[u])
+
+            /* Indicate that dimension size can be modified */
+            ret_value = TRUE;
+        } /* end if */
+    } /* end for */
+
+    /* Update dimension size(s) */
+    if(ret_value)
+        if(H5S_set_extent_real(space, size) < 0)
+             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "failed to change dimension size(s)")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_set_extent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5S_has_extent
+ *
+ * Purpose: Determines if a simple dataspace's extent has been set (e.g.,
+ *          by H5Sset_extent_simple() ).  Helps avoid write errors.
+ *
+ * Return: TRUE if dataspace has extent set
+ *         FALSE if dataspace's extent is uninitialized
+ *
+ * Programmer: James Laird
+ *
+ * Date: July 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5S_has_extent(const H5S_t *ds)
+{
+    hbool_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(ds);
+
+    if(0 == ds->extent.rank && 0 == ds->extent.nelem && H5S_NULL != ds->extent.type)
+        ret_value = FALSE;
+    else
+        ret_value = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_has_extent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5S_set_extent_real
+ *
+ * Purpose:     Modify the dimensions of a dataspace. Based on H5S_extend
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Pedro Vicente, pvn at ncsa.uiuc.edu
+ *              March 13, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_set_extent_real(H5S_t *space, const hsize_t *size)
+{
+    hsize_t nelem;      /* Number of elements in extent */
+    unsigned u;         /* Local index variable */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space && H5S_SIMPLE == H5S_GET_EXTENT_TYPE(space));
+    HDassert(size);
+
+    /* Change the dataspace size & re-compute the number of elements in the extent */
+    for(u = 0, nelem = 1; u < space->extent.rank; u++ ) {
+        space->extent.size[u] = size[u];
+        nelem *= size[u];
+    } /* end for */
+    space->extent.nelem = nelem;
+
+    /* If the selection is 'all', update the number of elements selected */
+    if(H5S_SEL_ALL == H5S_GET_SELECT_TYPE(space))
+        if(H5S_select_all(space, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+    /* Mark the dataspace as no longer shared if it was before */
+    if(H5O_msg_reset_share(H5O_SDSPACE_ID, space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRESET, FAIL, "can't stop sharing dataspace")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_set_extent_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Sextent_equal
+ *
+ * Purpose:	Determines if two dataspace extents are equal.
+ *
+ * Return:	Success:	TRUE if equal, FALSE if unequal
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, October 24, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Sextent_equal(hid_t space1_id, hid_t space2_id)
+{
+    const H5S_t	*ds1, *ds2;     /* Dataspaces to compare */
+    htri_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "ii", space1_id, space2_id);
+
+    /* check args */
+    if(NULL == (ds1 = (const H5S_t *)H5I_object_verify(space1_id, H5I_DATASPACE)) ||
+            NULL == (ds2 = (const H5S_t *)H5I_object_verify(space2_id, H5I_DATASPACE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Check dataspaces for extent's equality */
+    if((ret_value = H5S_extent_equal(ds1, ds2)) < 0)
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "dataspace comparison failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sextent_equal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_extent_equal
+ PURPOSE
+    Check if two dataspaces have equal extents
+ USAGE
+    htri_t H5S_extent_equal(ds1, ds2)
+        H5S_t *ds1, *ds2;	        IN: Dataspace objects to compare
+ RETURNS
+     TRUE if equal, FALSE if unequal on succeess/Negative on failure
+ DESCRIPTION
+	Compare two dataspaces if their extents are identical.
+--------------------------------------------------------------------------*/
+htri_t
+H5S_extent_equal(const H5S_t *ds1, const H5S_t *ds2)
+{
+    unsigned u;                 /* Local index variable */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(ds1);
+    HDassert(ds2);
+
+    /* Make certain the dataspaces are the same type */
+    if(ds1->extent.type != ds2->extent.type)
+        HGOTO_DONE(FALSE)
+
+    /* Make certain the dataspaces are the same rank */
+    if(ds1->extent.rank != ds2->extent.rank)
+        HGOTO_DONE(FALSE)
+
+    /* Make certain the dataspaces' current dimensions are the same size */
+    if(ds1->extent.rank > 0) {
+        HDassert(ds1->extent.size);
+        HDassert(ds2->extent.size);
+        for(u = 0; u < ds1->extent.rank; u++)
+            if(ds1->extent.size[u] != ds2->extent.size[u])
+                HGOTO_DONE(FALSE)
+    } /* end if */
+
+    /* Make certain the dataspaces' maximum dimensions are the same size */
+    if(ds1->extent.rank > 0) {
+        /* Check for no maximum dimensions on dataspaces */
+        if(ds1->extent.max != NULL && ds2->extent.max != NULL) {
+            for(u = 0; u < ds1->extent.rank; u++)
+                if(ds1->extent.max[u] != ds2->extent.max[u])
+                    HGOTO_DONE(FALSE)
+        } /* end if */
+        else
+            if((ds1->extent.max == NULL && ds2->extent.max != NULL) ||
+                    (ds1->extent.max != NULL && ds2->extent.max == NULL))
+                HGOTO_DONE(FALSE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extent_equal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_extent_nelem
+ *
+ * Purpose:	Determines how many elements a dataset extent describes.
+ *
+ * Return:	Success:	Number of data points in the dataset extent.
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, November 30, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5S_extent_nelem(const H5S_extent_t *ext)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(ext);
+
+    /* Return the number of elements in extent */
+    FUNC_LEAVE_NOAPI(ext->nelem)
+} /* end H5S_extent_nelem() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5S_set_latest_version
+ *
+ * Purpose:     Set the encoding for a dataspace to the latest version.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, July 24, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_set_latest_version(H5S_t *ds)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ds);
+
+    /* Set encoding of extent to latest version */
+    ds->extent.version = H5O_SDSPACE_VERSION_LATEST;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_set_latest_version() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_extend
+ *
+ * Purpose:	Extend the dimensions of a dataspace.
+ *
+ * Return:	Success:	Number of dimensions whose size increased.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January 30, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5S_extend(H5S_t *space, const hsize_t *size)
+{
+    unsigned	u;
+    int	ret_value = 0;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space && H5S_SIMPLE == H5S_GET_EXTENT_TYPE(space));
+    HDassert(size);
+
+    /* Check through all the dimensions to see if modifying the dataspace is allowed */
+    for(u = 0; u < space->extent.rank; u++) {
+        if(space->extent.size[u]<size[u]) {
+            if(space->extent.max && H5S_UNLIMITED!=space->extent.max[u] &&
+                    space->extent.max[u]<size[u])
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimension cannot be increased")
+            ret_value++;
+        } /* end if */
+    } /* end for */
+
+    /* Update */
+    if(ret_value) {
+        hsize_t nelem;  /* Number of elements in extent */
+
+        /* Change the dataspace size & re-compute the number of elements in the extent */
+        for(u = 0, nelem = 1; u < space->extent.rank; u++) {
+            if(space->extent.size[u] < size[u])
+                space->extent.size[u] = size[u];
+
+            nelem *= space->extent.size[u];
+        } /* end for */
+        space->extent.nelem = nelem;
+
+        /* If the selection is 'all', update the number of elements selected */
+        if(H5S_GET_SELECT_TYPE(space) == H5S_SEL_ALL)
+            if(H5S_select_all(space, FALSE) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+        /* Mark the dataspace as no longer shared if it was before */
+        if(H5O_msg_reset_share(H5O_SDSPACE_ID, space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRESET, FAIL, "can't stop sharing dataspace")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extend() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SL.c b/gatb-core/thirdparty/hdf5/src/H5SL.c
new file mode 100644
index 0000000..d766066
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SL.c
@@ -0,0 +1,2558 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:	Provides a skip list abstract data type.
+ *
+ *              (See "Deterministic Skip Lists" by Munro, Papadakis & Sedgewick)
+ *
+ *              (Implementation changed to a deterministic skip list from a
+ *               probabilistic one.  This implementation uses a 1-2-3 skip list
+ *               using arrays, as described by Munro, Papadakis & Sedgewick.
+ *
+ *               Arrays are allocated using a free list factory for each size
+ *               that is a power of two.  Factories are created as soon as they
+ *               are needed, and are never destroyed until the package is shut
+ *               down.  There is no longer a maximum level or "p" value.
+ *               -NAF 2008/11/05)
+ *
+ *              (See "Skip Lists: A Probabilistic Alternative to Balanced Trees"
+ *               by William Pugh for additional information)
+ *
+ *              (This implementation has the optimization for reducing key
+ *               key comparisons mentioned in section 3.5 of "A Skip List
+ *               Cookbook" by William Pugh
+ *              -Removed as our implementation of this was useless for a 1-2-3
+ *               skip list.  The implementation in that document hurts
+ *               performance, at least for integer keys. -NAF)
+ *
+ *              (Also, this implementation has a couple of home-grown
+ *               optimizations, including setting the "update" vector to the
+ *               actual 'forward' pointer to update, instead of the node
+ *               containing the forward pointer -QAK
+ *              -No longer uses update vector, as insertions/deletions are now
+ *               always at level 0. -NAF)
+ *
+ *              (Note: This implementation does not have the information for
+ *               implementing the "Linear List Operations" (like insert/delete/
+ *               search by position) in section 3.4 of "A Skip List Cookbook",
+ *               but they shouldn't be that hard to add, if necessary)
+ *
+ *              (This implementation has an additional backward pointer, which
+ *               allows the list to be iterated in reverse)
+ *
+ *              (There's also an article on "Alternating Skip Lists", which
+ *              are similar to deterministic skip lists, in the August 2000
+ *              issue of Dr. Dobb's Journal)
+ *
+ */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5SL_init_interface
+
+
+/* Private headers needed */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5SLprivate.h"	/* Skip list routines			*/
+#include "H5MMprivate.h"    /* Memory management                    */
+
+/* Local Macros */
+
+/* Define the code template for searches for the "OP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_SEARCH_FOUND(SLIST, X, I)                   \
+{                                                                              \
+    HDassert(!X->removed);                                                     \
+    HGOTO_DONE(X->item);                                                       \
+} /* end block */
+
+/* Define the code template for deferred removals for the "OP" in the
+ * H5SL_LOCATE macro */
+#define H5SL_LOCATE_SEARCH_DEFER_REMOVE_FOUND(SLIST, X, I)      \
+{                                                                              \
+    HDassert(!X->removed);                                                     \
+    X->removed = TRUE;                                                         \
+    HGOTO_DONE(X->item);                                                       \
+} /* end block */
+
+/* Define the code template for finds for the "OP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_FIND_FOUND(SLIST, X, I)                     \
+{                                                                              \
+    HDassert(!X->removed);                                                     \
+    HGOTO_DONE(X);                                                             \
+} /* end block */
+
+
+/* Define a code template for comparing scalar keys for the "CMP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_SCALAR_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)              \
+        (*(TYPE *)((PNODE)->key) < *(TYPE *)PKEY)
+
+/* Define a code template for comparing string keys for the "CMP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_STRING_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)              \
+        (((PNODE)->hashval == HASHVAL) ?                                \
+            (HDstrcmp((const char *)(PNODE)->key, (const char *)PKEY) < 0) : \
+            ((PNODE)->hashval < HASHVAL))
+
+/* Define a code template for comparing H5_obj_t keys for the "CMP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_OBJ_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)                 \
+        ((((TYPE *)((PNODE)->key))->fileno == ((TYPE *)PKEY)->fileno)          \
+        ? (((TYPE *)((PNODE)->key))->addr < ((TYPE *)PKEY)->addr)              \
+        : (((TYPE *)((PNODE)->key))->fileno < ((TYPE *)PKEY)->fileno))
+
+/* Define a code template for comparing generic keys for the "CMP" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_GENERIC_CMP(SLIST, TYPE, PNODE, PKEY, HASHVAL)             \
+        ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) < 0)
+
+
+/* Define a code template for comparing scalar keys for the "EQ" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_SCALAR_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)               \
+        (*(TYPE *)((PNODE)->key) == *(TYPE *)PKEY)
+
+/* Define a code template for comparing string keys for the "EQ" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_STRING_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)               \
+        (((PNODE)->hashval == HASHVAL) && (HDstrcmp((const char *)(PNODE)->key, (const char *)PKEY) == 0))
+
+/* Define a code template for comparing H5_obj_t keys for the "EQ" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_OBJ_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)                  \
+        ((((TYPE *)((PNODE)->key))->fileno == ((TYPE *)PKEY)->fileno) && (((TYPE *)((PNODE)->key))->addr == ((TYPE *)PKEY)->addr))
+
+/* Define a code template for comparing generic keys for the "EQ" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_GENERIC_EQ(SLIST, TYPE, PNODE, PKEY, HASHVAL)             \
+        ((SLIST)->cmp((TYPE *)((PNODE)->key), (TYPE *)PKEY) == 0)
+
+
+/* Define a code template for initializing the hash value for scalar keys for the "HASHINIT" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_SCALAR_HASHINIT(KEY, HASHVAL)
+
+/* Define a code template for initializing the hash value for string keys for the "HASHINIT" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_STRING_HASHINIT(KEY, HASHVAL)                       \
+    HASHVAL = H5_hash_string((const char *)KEY);
+
+/* Define a code template for initializing the hash value for H5_obj_t keys for the "HASHINIT" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_OBJ_HASHINIT(KEY, HASHVAL)
+
+/* Define a code template for initializing the hash value for generic keys for the "HASHINIT" in the H5SL_LOCATE macro */
+#define H5SL_LOCATE_GENERIC_HASHINIT(KEY, HASHVAL)
+
+
+/* Macro used to find node for operation, if all keys are valid */
+#define H5SL_LOCATE_OPT(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)      \
+{                                                                       \
+    int _i;                     /* Local index variable */              \
+    unsigned _count;            /* Num nodes searched at this height */ \
+                                                                        \
+    H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL)                  \
+    for(_i = (int)SLIST->curr_level; _i >= 0; _i--) {                   \
+        _count = 0;                                                     \
+        while(_count < 3 && X->forward[_i] &&                           \
+                H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X->forward[_i], KEY, HASHVAL) ) { \
+            X = X->forward[_i];                                         \
+            _count++;                                                   \
+        } /* end while */                                               \
+    } /* end for */                                                     \
+    X = X->forward[0];                                                  \
+    if(X != NULL && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, X, KEY, HASHVAL) ) { \
+        /* What to do when a node is found */                           \
+        H5_GLUE3(H5SL_LOCATE_,OP,_FOUND)(SLIST, X, _i)                  \
+    } /* end if */                                                      \
+}
+
+/* Macro used to find node for operation, if there may be "removed" nodes in the
+ * list (whose keys cannot be read) */
+#define H5SL_LOCATE_SAFE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)      \
+{                                                                       \
+    int _i;                     /* Local index variable */              \
+    H5SL_node_t *_low = X;                                              \
+    H5SL_node_t *_high = NULL;                                          \
+                                                                        \
+    H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL)                  \
+    for(_i = (int)SLIST->curr_level; _i >= 0; _i--) {                   \
+        X = _low->forward[_i];                                          \
+        while(X != _high) {                                             \
+            if(!X->removed) {                                            \
+                if(H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X, KEY, HASHVAL)) \
+                    _low = X;                                           \
+                else                                                    \
+                    break;                                              \
+            } /* end if */                                              \
+            X = X->forward[_i];                                         \
+        } /* end while */                                               \
+        _high = X;                                                      \
+        if(X != NULL && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, X, KEY, HASHVAL) ) { \
+            /* What to do when a node is found */                       \
+            H5_GLUE3(H5SL_LOCATE_,OP,_FOUND)(SLIST, X, _i)              \
+            break;                                                      \
+        } /* end if */                                                  \
+    } /* end for */                                                     \
+}
+
+/* Macro used to find node for operation */
+#define H5SL_LOCATE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)              \
+{                                                                       \
+    if((SLIST)->safe_iterating)                                         \
+        H5SL_LOCATE_SAFE(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)         \
+    else                                                                \
+        H5SL_LOCATE_OPT(OP, CMP, SLIST, X, TYPE, KEY, HASHVAL)          \
+}
+
+
+/* Macro used to grow a node by 1.  Does not update pointers. LVL is the current
+ * level of X.  Does not update LVL but does update X->lvl. */
+#define H5SL_GROW(X, LVL, ERR)                                                 \
+{                                                                              \
+    /* Check if we need to increase allocation of forward pointers */          \
+    if(LVL + 1 >= 1u << X->log_nalloc) {                                       \
+        H5SL_node_t **_tmp;                                                    \
+        HDassert(LVL + 1 == 1u << X->log_nalloc);                              \
+        /* Double the amount of allocated space */                             \
+        X->log_nalloc++;                                                       \
+                                                                               \
+        /* Check if we need to create a new factory */                         \
+        if(X->log_nalloc >= H5SL_fac_nused_g) {                                \
+            HDassert(X->log_nalloc == H5SL_fac_nused_g);                       \
+                                                                               \
+            /* Check if we need to allocate space for the factory pointer*/    \
+            if(H5SL_fac_nused_g >= H5SL_fac_nalloc_g) {                        \
+                HDassert(H5SL_fac_nused_g == H5SL_fac_nalloc_g);               \
+                /* Double the size of the array of factory pointers */         \
+                H5SL_fac_nalloc_g *= 2;                                        \
+                if(NULL == (H5SL_fac_g = (H5FL_fac_head_t **)H5MM_realloc(     \
+                        (void *)H5SL_fac_g, H5SL_fac_nalloc_g                  \
+                        * sizeof(H5FL_fac_head_t *))))                         \
+                    HGOTO_ERROR(H5E_SLIST, H5E_CANTALLOC, ERR, "memory allocation failed") \
+            } /* end if */                                                     \
+                                                                               \
+            /* Create the new factory */                                       \
+            H5SL_fac_g[H5SL_fac_nused_g] = H5FL_fac_init((1u << H5SL_fac_nused_g) * sizeof(H5SL_node_t *)); \
+            H5SL_fac_nused_g++;                                                \
+        } /* end if */                                                         \
+                                                                               \
+        /* Allocate space for new forward pointers */                          \
+        if(NULL == (_tmp = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[X->log_nalloc]))) \
+            HGOTO_ERROR(H5E_SLIST, H5E_CANTALLOC, ERR, "memory allocation failed") \
+        HDmemcpy((void *)_tmp, (const void *)X->forward, (LVL + 1) * sizeof(H5SL_node_t *)); \
+        X->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[X->log_nalloc-1], (void *)X->forward);  \
+        X->forward = _tmp;                                                     \
+    } /* end if */                                                             \
+                                                                               \
+    X->level++;                                                                \
+}
+
+
+/* Macro used to shrink a node by 1.  Does not update pointers.  LVL is the
+ * current level of X.  Does not update LVL but does update X->level. */
+#define H5SL_SHRINK(X, LVL)                                                    \
+{                                                                              \
+    /* Check if we can reduce the allocation of forward pointers */            \
+    if(LVL <= 1u << (X->log_nalloc - 1)) {                                     \
+        H5SL_node_t **_tmp;                                                    \
+        HDassert(LVL == 1u << (X->log_nalloc - 1));                            \
+        X->log_nalloc--;                                                       \
+                                                                               \
+        /* Allocate space for new forward pointers */                          \
+        if(NULL == (_tmp = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[X->log_nalloc]))) \
+            HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, NULL, "memory allocation failed") \
+        HDmemcpy((void *)_tmp, (const void *)X->forward, (LVL) * sizeof(H5SL_node_t *)); \
+        X->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[X->log_nalloc+1], (void *)X->forward);  \
+        X->forward = _tmp;                                                     \
+    } /* end if */                                                             \
+                                                                               \
+    X->level--;                                                                \
+}
+
+
+/* Macro used to grow the level of a node by 1, with appropriate changes to the
+ * head node if necessary.  PREV is the previous node of the height that X is to
+ * grow to. */
+#define H5SL_PROMOTE(SLIST, X, PREV, ERR)                                      \
+{                                                                              \
+    size_t _lvl = X->level;                                                    \
+                                                                               \
+    H5SL_GROW(X, _lvl, ERR);                                                   \
+                                                                               \
+    if(_lvl == (size_t) SLIST->curr_level) {                                   \
+        HDassert(PREV == SLIST->header);                                       \
+        /* Grow the head */                                                    \
+        H5SL_GROW(PREV, _lvl, ERR)                                             \
+        SLIST->curr_level++;                                                   \
+        X->forward[_lvl+1] = NULL;                                             \
+    } else {                                                                   \
+        HDassert(_lvl < (size_t) SLIST->curr_level);                           \
+        X->forward[_lvl+1] = PREV->forward[_lvl+1];                            \
+    } /* end else */                                                           \
+    PREV->forward[_lvl+1] = X;                                                 \
+}
+
+
+/* Macro used to reduce the level of a node by 1.  Does not update the head node
+ * "current level".  PREV is the previous node of the currrent height of X. */
+#define H5SL_DEMOTE(X, PREV)                                                   \
+{                                                                              \
+    size_t _lvl = X->level;                                                    \
+                                                                               \
+    HDassert(PREV->forward[_lvl] == X);                                        \
+    PREV->forward[_lvl] = X->forward[_lvl];                                    \
+    H5SL_SHRINK(X, _lvl);                                                      \
+}
+
+
+/* Macro used to insert node.  Does not actually insert the node.  After running
+ * this macro, X will contain the node before where the new node should be
+ * inserted (at level 0). */
+#define H5SL_INSERT(CMP, SLIST, X, TYPE, KEY, HASHVAL)                         \
+{                                                                              \
+    H5SL_node_t *_last = X;     /* Lowest node in the current gap */           \
+    H5SL_node_t *_next = NULL;  /* Highest node in the currect gap */          \
+    H5SL_node_t *_drop;         /* Low node of the gap to drop into */         \
+    int         _count;         /* Number of nodes in the current gap */       \
+    int         _i;                                                            \
+                                                                               \
+    H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL)                         \
+    for(_i = (int)SLIST->curr_level; _i >= 0; _i--) {                          \
+        /* Search for the node to drop into, also count the number of nodes */ \
+        /* of height _i in this gap */                                         \
+        _drop = NULL;                                                          \
+        for(_count = 0; ; _count++) {                                          \
+            /* Terminate if this is the last node in the gap */                \
+            if(X->forward[_i] == _next) {                                      \
+                if(!_drop)                                                     \
+                    _drop = X;                                                 \
+                break;                                                         \
+            } /* end if */                                                     \
+                                                                               \
+            /* Check if this node is the start of the next gap */              \
+            if(!_drop && !H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X->forward[_i], KEY, HASHVAL)) \
+                _drop = X;                                                     \
+                                                                               \
+            /* No need to check the last node in the gap if there are 3, as */ \
+            /* there cannot be a fourth */                                     \
+            if(_count == 2) {                                                  \
+                if(!_drop)                                                     \
+                    _drop = X->forward[_i];                                    \
+                _count = 3;                                                    \
+                break;                                                         \
+            }                                                                  \
+            X = X->forward[_i];                                                \
+        } /* end for */                                                        \
+        HDassert(!_drop->forward[_i] ||                                        \
+                !H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, _drop->forward[_i], KEY, HASHVAL)); \
+                                                                               \
+        /* Promote the middle node if necessary */                             \
+        if(_count == 3) {                                                      \
+            HDassert(X == _last->forward[_i]->forward[_i]);                    \
+            H5SL_PROMOTE(SLIST, X, _last, NULL)                                \
+        }                                                                      \
+                                                                               \
+        /* Prepare to drop down */                                             \
+        X = _last = _drop;                                                     \
+        _next = _drop->forward[_i];                                            \
+    } /* end for */                                                            \
+                                                                               \
+    if(_next && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, _next, KEY, HASHVAL)) \
+        HGOTO_ERROR(H5E_SLIST, H5E_CANTINSERT, NULL, "can't insert duplicate key") \
+}
+
+
+/* Macro used to remove node */
+#define H5SL_REMOVE(CMP, SLIST, X, TYPE, KEY, HASHVAL)                         \
+{                                                                              \
+    /* Check for deferred removal */                                           \
+    if(SLIST->safe_iterating)                                                  \
+        H5SL_LOCATE(SEARCH_DEFER_REMOVE, CMP, SLIST, X, TYPE, KEY, HASHVAL)           \
+    else {                                                                     \
+        H5SL_node_t *_last = X;     /* Lowest node in the current gap */       \
+        H5SL_node_t *_llast = X;    /* Lowest node in the previous gap */      \
+        H5SL_node_t *_next = NULL;  /* Highest node in the currect gap */      \
+        H5SL_node_t *_drop = NULL;  /* Low node of the gap to drop into */     \
+        H5SL_node_t *_ldrop = NULL; /* Low node of gap before the one to drop into */ \
+        H5SL_node_t *_head = SLIST->header; /* Head of the skip list */        \
+        int         _count;         /* Number of nodes in the current gap */   \
+        int         _i = (int)SLIST->curr_level;                               \
+                                                                               \
+        if(_i < 0)                                                             \
+            HGOTO_DONE(NULL);                                                  \
+                                                                               \
+        H5_GLUE3(H5SL_LOCATE_,CMP,_HASHINIT)(KEY, HASHVAL)                     \
+                                                                               \
+        /* Find the gap to drop in to at the highest level */                  \
+        while(X && (!X->key || H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X, KEY, HASHVAL))) { \
+            _llast = _last;                                                    \
+            _last = X;                                                         \
+            X = X->forward[_i];                                                \
+        }                                                                      \
+        _next = X;                                                             \
+                                                                               \
+        /* Main loop */                                                        \
+        for(_i--; _i >= 0; _i--) {                                             \
+            /* Search for the node to drop into, also count the number of */   \
+            /* nodes of height _i in this gap and keep track of of the node */ \
+            /* before the one to drop into (_ldrop will become _llast, */      \
+            /* _drop will become _last). */                                    \
+            X = _ldrop = _last;                                                \
+            _drop = NULL;                                                      \
+            for(_count = 0; ; _count++) {                                      \
+                /* Terminate if this is the last node in the gap */            \
+                if(X->forward[_i] == _next) {                                  \
+                    if(!_drop)                                                 \
+                        _drop = X;                                             \
+                    break;                                                     \
+                } /* end if */                                                 \
+                                                                               \
+                /* If we have already found the node to drop into and there */ \
+                /* is more than one node in this gap, we can stop searching */ \
+                if(_drop) {                                                    \
+                    HDassert(_count >= 1);                                     \
+                    _count = 2;                                                \
+                    break;                                                     \
+                } else { /* !_drop */                                          \
+                    /* Check if this node is the start of the next gap */      \
+                    if (!H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, X->forward[_i], KEY, HASHVAL)) { \
+                        _drop = X;                                             \
+                        /* Again check if we can stop searching */             \
+                        if(_count) {                                           \
+                            _count = 2;                                        \
+                            break;                                             \
+                        } /* end if */                                         \
+                    } /* end if */                                             \
+                    else                                                       \
+                        _ldrop = X;                                            \
+                } /* end else */                                               \
+                                                                               \
+                /* No need to check the last node in the gap if there are */   \
+                /* 3, as there cannot be a fourth */                           \
+                if(_count == 2) {                                              \
+                    if(!_drop)                                                 \
+                        _drop = X->forward[_i];                                \
+                    break;                                                     \
+                } /* end if */                                                 \
+                X = X->forward[_i];                                            \
+            } /* end for */                                                    \
+            HDassert(_count >= 1 && _count <= 3);                              \
+            HDassert(!_drop->forward[_i] ||                                    \
+                    !H5_GLUE3(H5SL_LOCATE_,CMP,_CMP)(SLIST, TYPE, _drop->forward[_i], KEY, HASHVAL)); \
+                                                                               \
+            /* Check if we need to adjust node heights */                      \
+            if(_count == 1) {                                                  \
+                /* Check if we are in the first gap */                         \
+                if(_llast == _last) {                                          \
+                    /* We are in the first gap, count the number of nodes */   \
+                    /* of height _i in the next gap.  We need only check */    \
+                    /* onenode to see if we should promote the first node */   \
+                    /* in the next gap */                                      \
+                    _llast = _next->forward[_i+1];                             \
+                                                                               \
+                    /* Demote the separator node */                            \
+                    H5SL_DEMOTE(_next, _last)                                  \
+                                                                               \
+                    /* If there are 2 or more nodes, promote the first */      \
+                    if(_next->forward[_i]->forward[_i] != _llast) {            \
+                        X = _next->forward[_i];                                \
+                        H5SL_PROMOTE(SLIST, X, _last, NULL)                    \
+                    } else if(!_head->forward[_i+1]) {                         \
+                        /* shrink the header */                                \
+                        HDassert(_i == SLIST->curr_level - 1);                 \
+                        HDassert((size_t) SLIST->curr_level == _head->level);  \
+                                                                               \
+                        H5SL_SHRINK(_head, (size_t) (_i+1))                    \
+                        SLIST->curr_level--;                                   \
+                    } /* end else */                                           \
+                } else {                                                       \
+                    /* We are not in the first gap, count the number of */     \
+                    /* nodes of height _i in the previous gap.  Note we */     \
+                    /* "look ahead" in this loop so X has the value of the */  \
+                    /* last node in the previous gap. */                       \
+                    X = _llast->forward[_i];                                   \
+                    for(_count = 1; _count < 3 && X->forward[_i] != _last; _count++) \
+                        X = X->forward[_i];                                    \
+                    HDassert(X->forward[_i] == _last);                         \
+                                                                               \
+                    /* Demote the separator node */                            \
+                    H5SL_DEMOTE(_last, _llast)                                 \
+                                                                               \
+                    /* If there are 2 or more nodes, promote the last */       \
+                    if(_count >= 2)                                            \
+                        H5SL_PROMOTE(SLIST, X, _llast, NULL)                   \
+                    else if(!_head->forward[_i+1]) {                           \
+                        /* shrink the header */                                \
+                        HDassert(_i == SLIST->curr_level - 1);                 \
+                        HDassert((size_t) SLIST->curr_level == _head->level);  \
+                                                                               \
+                        H5SL_SHRINK(_head, (size_t) (_i+1))                    \
+                        SLIST->curr_level--;                                   \
+                    } /* end else */                                           \
+                } /* end else */                                               \
+            } /* end if */                                                     \
+                                                                               \
+            /* Prepare to drop down */                                         \
+            _llast = _ldrop;                                                   \
+            _last = _drop;                                                     \
+            _next = _drop->forward[_i];                                        \
+        } /* end for */                                                        \
+                                                                               \
+        /* Check if we've found the node */                                    \
+        if(_next && H5_GLUE3(H5SL_LOCATE_,CMP,_EQ)(SLIST, TYPE, _next, KEY, HASHVAL)) { \
+            void *tmp = _next->item;                                           \
+            X = _next;                                                         \
+                                                                               \
+            /* If the node has a height > 0, swap it with its (lower) */       \
+            /* neighbor */                                                     \
+            if(X->level) {                                                     \
+                X = X->backward;                                               \
+                _next->key = X->key;                                           \
+                _next->item = X->item;                                         \
+                _next->hashval = X->hashval;                                   \
+            } /* end if */                                                     \
+            HDassert(!X->level);                                               \
+                                                                               \
+            /* Remove the node */                                              \
+            X->backward->forward[0] = X->forward[0];                           \
+            if(SLIST->last == X)                                               \
+                SLIST->last = X->backward;                                     \
+            else                                                               \
+                X->forward[0]->backward = X->backward;                         \
+            SLIST->nobjs--;                                                    \
+            X->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[0], X->forward); \
+            X = H5FL_FREE(H5SL_node_t, X);                                     \
+                                                                               \
+            HGOTO_DONE(tmp);                                                   \
+        } /* end if */                                                         \
+    } /* end else */                                                           \
+}
+
+
+/* Macro used to search for node */
+#define H5SL_SEARCH(CMP, SLIST, X, TYPE, KEY, HASHVAL)          \
+    H5SL_LOCATE(SEARCH, CMP, SLIST, X, TYPE, KEY, HASHVAL)
+
+/* Macro used to find a node */
+#define H5SL_FIND(CMP, SLIST, X, TYPE, KEY, HASHVAL)            \
+    H5SL_LOCATE(FIND, CMP, SLIST, X, TYPE, KEY, HASHVAL)
+
+
+/* Private typedefs & structs */
+
+/* Skip list node data structure */
+struct H5SL_node_t {
+    const void *key;                    /* Pointer to node's key */
+    void *item;                         /* Pointer to node's item */
+    size_t level;                       /* The level of this node */
+    size_t log_nalloc;                  /* log2(Number of slots allocated in forward) */
+    uint32_t hashval;                   /* Hash value for key (only for strings, currently) */
+    hbool_t removed;                    /* Whether the node is "removed" (actual removal deferred) */
+    struct H5SL_node_t **forward;       /* Array of forward pointers from this node */
+    struct H5SL_node_t *backward;       /* Backward pointer from this node */
+};
+
+/* Main skip list data structure */
+struct H5SL_t {
+    /* Static values for each list */
+    H5SL_type_t type;   /* Type of skip list */
+    H5SL_cmp_t cmp;     /* Comparison callback, if type is H5SL_TYPE_GENERIC */
+
+    /* Dynamic values for each list */
+    int curr_level;             /* Current top level used in list */
+    size_t nobjs;               /* Number of active objects in skip list */
+    H5SL_node_t *header;        /* Header for nodes in skip list */
+    H5SL_node_t *last;          /* Pointer to last node in skip list */
+    hbool_t safe_iterating;     /* Whether a routine is "safely" iterating over the list and removals should be deferred */
+};
+
+/* Static functions */
+static H5SL_node_t * H5SL_new_node(void *item, const void *key, uint32_t hashval);
+static H5SL_node_t *H5SL_insert_common(H5SL_t *slist, void *item, const void *key);
+static herr_t H5SL_release_common(H5SL_t *slist, H5SL_operator_t op, void *op_data);
+static herr_t H5SL_close_common(H5SL_t *slist, H5SL_operator_t op, void *op_data);
+
+/* Declare a free list to manage the H5SL_t struct */
+H5FL_DEFINE_STATIC(H5SL_t);
+
+/* Declare a free list to manage the H5SL_node_t struct */
+H5FL_DEFINE_STATIC(H5SL_node_t);
+
+/* Global variables */
+static H5FL_fac_head_t **H5SL_fac_g;
+static size_t H5SL_fac_nused_g;
+static size_t H5SL_fac_nalloc_g;
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_init_interface
+ PURPOSE
+    Initialize interface-specific information
+ USAGE
+    herr_t H5SL_init_interface()
+
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Initializes any interface-specific data or routines.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5SL_init_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Allocate space for array of factories */
+    H5SL_fac_g = (H5FL_fac_head_t **)H5MM_malloc(sizeof(H5FL_fac_head_t *));
+    HDassert(H5SL_fac_g);
+    H5SL_fac_nalloc_g = 1;
+
+    /* Initialize first factory */
+    H5SL_fac_g[0] = H5FL_fac_init(sizeof(H5SL_node_t *));
+    HDassert(H5SL_fac_g[0]);
+    H5SL_fac_nused_g = 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SL_init_interface() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_new_node
+ PURPOSE
+    Create a new skip list node of level 0
+ USAGE
+    H5SL_node_t *H5SL_new_node(item,key,hasval)
+        void *item;             IN: Pointer to item info for node
+        void *key;              IN: Pointer to key info for node
+        uint32_t hashval;       IN: Hash value for node
+
+ RETURNS
+    Returns a pointer to a skip list node on success, NULL on failure.
+ DESCRIPTION
+    Create a new skip list node of the height 0, setting the item
+    and key values internally.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine does _not_ initialize the 'forward' pointers
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5SL_node_t *
+H5SL_new_node(void *item, const void *key, uint32_t hashval)
+{
+    H5SL_node_t *ret_value;      /* New skip list node */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate the node */
+    if(NULL == (ret_value = (H5SL_node_t *)H5FL_MALLOC(H5SL_node_t)))
+        HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Initialize node */
+    ret_value->key = key;
+    ret_value->item = item;
+    ret_value->level = 0;
+    ret_value->hashval = hashval;
+    ret_value->removed = FALSE;
+    if(NULL == (ret_value->forward = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[0]))) {
+        ret_value = H5FL_FREE(H5SL_node_t, ret_value);
+        HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, NULL, "memory allocation failed")
+    } /* end if */
+    ret_value->log_nalloc = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_new_node() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_insert_common
+ PURPOSE
+    Common code for inserting an object into a skip list
+ USAGE
+    H5SL_node_t *H5SL_insert_common(slist,item,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *item;             IN: Item to insert
+        void *key;              IN: Key for item to insert
+
+ RETURNS
+    Returns pointer to new node on success, NULL on failure.
+ DESCRIPTION
+    Common code for inserting an element into a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Inserting an item with the same key as an existing object fails.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5SL_node_t *
+H5SL_insert_common(H5SL_t *slist, void *item, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    H5SL_node_t *prev;                          /* Node before the new node */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    H5SL_node_t *ret_value;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    prev=slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_INSERT(SCALAR, slist, prev, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_INSERT(SCALAR, slist, prev, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_INSERT(STRING, slist, prev, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_INSERT(SCALAR, slist, prev, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_INSERT(SCALAR, slist, prev, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_INSERT(SCALAR, slist, prev, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_INSERT(OBJ, slist, prev, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_INSERT(SCALAR, slist, prev, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_INSERT(GENERIC, slist, prev, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+
+    /* 'key' must not have been found in existing list, if we get here */
+
+    if(slist->curr_level < 0)
+        slist->curr_level = 0;
+
+    /* Create new node of level 0 */
+    if(NULL == (x = H5SL_new_node(item, key, hashval)))
+        HGOTO_ERROR(H5E_SLIST ,H5E_NOSPACE, NULL, "can't create new skip list node")
+
+    /* Update the links */
+    x->backward = prev;
+    x->forward[0] = prev->forward[0];
+    prev->forward[0] = x;
+    if(x->forward[0])
+        x->forward[0]->backward = x;
+    else {
+        HDassert(slist->last == prev);
+        slist->last = x;
+    }
+
+    /* Increment the number of nodes in the skip list */
+    slist->nobjs++;
+
+    /* Set return value */
+    ret_value=x;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_insert_common() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_release_common
+ PURPOSE
+    Release all nodes from a skip list, optionally calling a 'free' operator
+ USAGE
+    herr_t H5SL_release_common(slist,op,opdata)
+        H5SL_t *slist;            IN/OUT: Pointer to skip list to release nodes
+        H5SL_operator_t op;     IN: Callback function to free item & key
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Release all the nodes in a skip list.  The 'op' routine is called for
+    each node in the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The return value from the 'op' routine is ignored.
+
+    The skip list itself is still valid, it just has all its nodes removed.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5SL_release_common(H5SL_t *slist, H5SL_operator_t op, void *op_data)
+{
+    H5SL_node_t *node, *next_node;      /* Pointers to skip list nodes */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Free skip list nodes */
+    node = slist->header->forward[0];
+    while(node) {
+        next_node = node->forward[0];
+
+        /* Call callback, if one is given */
+        if(op)
+            /* Casting away const OK -QAK */
+            (void)(op)(node->item, (void *)node->key, op_data);
+
+        node->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[node->log_nalloc], node->forward);
+        node = H5FL_FREE(H5SL_node_t, node);
+        node = next_node;
+    } /* end while */
+
+    /* Reset the header pointers */
+    slist->header->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[slist->header->log_nalloc], slist->header->forward);
+    if(NULL == (slist->header->forward = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[0])))
+        HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, FAIL, "memory allocation failed")
+    slist->header->forward[0] = NULL;
+    slist->header->log_nalloc = 0;
+    slist->header->level = 0;
+
+    /* Reset the last pointer */
+    slist->last = slist->header;
+
+    /* Reset the dynamic internal fields */
+    slist->curr_level = -1;
+    slist->nobjs = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_release_common() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_close_common
+ PURPOSE
+    Close a skip list, deallocating it and potentially freeing all its nodes.
+ USAGE
+    herr_t H5SL_close_common(slist,op,opdata)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list to close
+        H5SL_operator_t op;     IN: Callback function to free item & key
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a skip list, freeing all internal information.  Any objects left in
+    the skip list have the 'op' routine called for each.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    If the 'op' routine returns non-zero, only the nodes up to that
+    point in the list are released and the list is still valid.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5SL_close_common(H5SL_t *slist, H5SL_operator_t op, void *op_data)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Free skip list nodes */
+    if(H5SL_release_common(slist, op, op_data) < 0)
+        HGOTO_ERROR(H5E_SLIST, H5E_CANTFREE, FAIL, "can't release skip list nodes")
+
+    /* Release header node */
+    slist->header->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[slist->header->log_nalloc], slist->header->forward);
+    slist->header = H5FL_FREE(H5SL_node_t, slist->header);
+
+    /* Free skip list object */
+    slist = H5FL_FREE(H5SL_t, slist);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_close_common() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_create
+ PURPOSE
+    Create a skip list
+ USAGE
+    H5SL_t *H5SL_create(H5SL_type_t type, H5SL_cmp_t cmp)
+
+ RETURNS
+    Returns a pointer to a skip list on success, NULL on failure.
+ DESCRIPTION
+    Create a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_t *
+H5SL_create(H5SL_type_t type, H5SL_cmp_t cmp)
+{
+    H5SL_t *new_slist = NULL;   /* Pointer to new skip list object created */
+    H5SL_node_t *header;        /* Pointer to skip list header node */
+    H5SL_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check args */
+    HDassert(type >= H5SL_TYPE_INT && type <= H5SL_TYPE_GENERIC);
+
+    /* Allocate skip list structure */
+    if(NULL == (new_slist = H5FL_MALLOC(H5SL_t)))
+        HGOTO_ERROR(H5E_SLIST, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the static internal fields */
+    new_slist->type = type;
+    HDassert((type == H5SL_TYPE_GENERIC) == !!cmp);
+    new_slist->cmp = cmp;
+
+    /* Set the dynamic internal fields */
+    new_slist->curr_level = -1;
+    new_slist->nobjs = 0;
+    new_slist->safe_iterating = FALSE;
+
+    /* Allocate the header node */
+    if(NULL == (header = H5SL_new_node(NULL, NULL, (uint32_t)ULONG_MAX)))
+        HGOTO_ERROR(H5E_SLIST ,H5E_NOSPACE, NULL, "can't create new skip list node")
+
+    /* Initialize header node's forward pointer */
+    header->forward[0] = NULL;
+
+    /* Initialize header node's backward pointer */
+    header->backward = NULL;
+
+    /* Attach the header */
+    new_slist->header = header;
+    new_slist->last = header;
+
+    /* Set the return value */
+    ret_value = new_slist;
+
+done:
+    /* Error cleanup */
+    if(ret_value == NULL) {
+        if(new_slist != NULL)
+            new_slist = H5FL_FREE(H5SL_t, new_slist);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_count
+ PURPOSE
+    Count the number of objects in a skip list
+ USAGE
+    size_t H5SL_count(slist)
+        H5SL_t *slist;            IN: Pointer to skip list to count
+
+ RETURNS
+    Returns number of objects on success, can't fail
+ DESCRIPTION
+    Count elements in a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+size_t
+H5SL_count(H5SL_t *slist)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    FUNC_LEAVE_NOAPI(slist->nobjs)
+} /* end H5SL_count() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_insert
+ PURPOSE
+    Insert an object into a skip list
+ USAGE
+    herr_t H5SL_insert(slist,item,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *item;             IN: Item to insert
+        void *key;              IN: Key for item to insert
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Insert element into a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Inserting an item with the same key as an existing object fails.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_insert(H5SL_t *slist, void *item, const void *key)
+{
+    herr_t ret_value=SUCCEED;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+    if(H5SL_insert_common(slist,item,key)==NULL)
+        HGOTO_ERROR(H5E_SLIST,H5E_CANTINSERT,FAIL,"can't create new skip list node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_insert() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_add
+ PURPOSE
+    Insert an object into a skip list
+ USAGE
+    H5SL_node_t *H5SL_add(slist,item,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *item;             IN: Item to insert
+        void *key;              IN: Key for item to insert
+
+ RETURNS
+    Returns pointer to new skip list node on success, NULL on failure.
+ DESCRIPTION
+    Insert element into a skip list and return the skip list node for the
+    new element in the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Inserting an item with the same key as an existing object fails.
+
+    This routine is a useful starting point for next/prev calls
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_add(H5SL_t *slist, void *item, const void *key)
+{
+    H5SL_node_t *ret_value;                   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+    if((ret_value=H5SL_insert_common(slist,item,key))==NULL)
+        HGOTO_ERROR(H5E_SLIST,H5E_CANTINSERT,NULL,"can't create new skip list node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_add() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_remove
+ PURPOSE
+    Removes an object from a skip list
+ USAGE
+    void *H5SL_remove(slist,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to remove
+
+ RETURNS
+    Returns pointer to item removed on success, NULL on failure.
+ DESCRIPTION
+    Remove element from a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_remove(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    void *ret_value = NULL;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Remove item from skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to remove
+     */
+    x = slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_REMOVE(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_REMOVE(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_REMOVE(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_REMOVE(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_REMOVE(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_REMOVE(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_REMOVE(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_REMOVE(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_REMOVE(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_remove() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_remove_first
+ PURPOSE
+    Removes the first object from a skip list
+ USAGE
+    void *H5SL_remove_first(slist)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+
+ RETURNS
+    Returns pointer to item removed on success, NULL on failure.
+ DESCRIPTION
+    Remove first element from a skip list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_remove_first(H5SL_t *slist)
+{
+    void *ret_value = NULL;                     /* Return value */
+    H5SL_node_t *head = slist->header;          /* Skip list header */
+    H5SL_node_t *tmp = slist->header->forward[0]; /* Temporary node pointer */
+    H5SL_node_t *next;                          /* Next node to search for */
+    size_t      level = slist->curr_level;      /* Skip list level */
+    size_t      i;                              /* Index */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Remove item from skip list */
+
+    /* Check for empty list */
+    if(slist->last != slist->header) {
+
+        /* Assign return value */
+        ret_value = tmp->item;
+        HDassert(level == head->level);
+        HDassert(0 == tmp->level);
+
+        /* Remove the first node */
+        head->forward[0] = tmp->forward[0];
+        if(slist->last == tmp)
+            slist->last = head;
+        else
+            tmp->forward[0]->backward = head;
+        slist->nobjs--;
+        /* Free memory */
+        tmp->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[0], tmp->forward);
+        tmp = H5FL_FREE(H5SL_node_t, tmp);
+
+        /* Reshape the skip list as necessary to maintain 1-2-3 condition */
+        for(i=0; i < level; i++) {
+            next = head->forward[i+1];
+            HDassert(next);
+
+            /* Check if  head->forward[i] == head->forward[i+1] (illegal) */
+            if(head->forward[i] == next) {
+                tmp = next;
+                next = next->forward[i+1];
+
+                HDassert(tmp->level == i+1);
+
+                /* Demote head->forward[i] */
+                H5SL_DEMOTE(tmp, head)
+
+                /* Check if we need to promote the following node to maintain
+                 * 1-2-3 condition */
+                if(tmp->forward[i]->forward[i] != next) {
+                    HDassert(tmp->forward[i]->forward[i]->forward[i] == next ||
+                        tmp->forward[i]->forward[i]->forward[i]->forward[i] == next);
+                    tmp = tmp->forward[i];
+                    H5SL_PROMOTE(slist, tmp, head, NULL);
+                    /* In this case, since there is a node of height = i+1 here
+                     * now (tmp), we know the skip list must be valid and can
+                     * break */
+                    break;
+                } else if(!head->forward[i+1]) {
+                    /* We just shrunk the largest node, shrink the header */
+                    HDassert(i == level - 1);
+
+                    H5SL_SHRINK(head, level)
+                    slist->curr_level--;
+                } /* end else */
+            } else
+                break;
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_remove_first() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_search
+ PURPOSE
+    Search for object in a skip list
+ USAGE
+    void *H5SL_search(slist,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to item on success, NULL on failure
+ DESCRIPTION
+    Search for an object in a skip list, according to it's key
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_search(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    void *ret_value;                            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x=slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_SEARCH(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_SEARCH(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_SEARCH(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_SEARCH(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_SEARCH(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_SEARCH(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_SEARCH(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* 'key' must not have been found in list, if we get here */
+    ret_value=NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_search() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_less
+ PURPOSE
+    Search for object in a skip list that is less than or equal to 'key'
+ USAGE
+    void *H5SL_less(slist,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to item who key is less than or equal to 'key' on success,
+        NULL on failure
+ DESCRIPTION
+    Search for an object in a skip list, according to it's key, returning the
+    object itself (for an exact match), or the object with the next highest
+    key that is less than 'key'
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_less(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    void *ret_value;                            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x=slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_SEARCH(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_SEARCH(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_SEARCH(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_SEARCH(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_SEARCH(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_SEARCH(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_SEARCH(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* An exact match for 'key' must not have been found in list, if we get here */
+    /* Check for a node with a key that is less than the given 'key' */
+    if(x==NULL) {
+        /* Check for walking off the list */
+        if(slist->last!=slist->header)
+            ret_value=slist->last->item;
+        else
+            ret_value=NULL;
+    } /* end if */
+    else {
+        if(x->backward!=slist->header)
+            ret_value=x->backward->item;
+        else
+            ret_value=NULL;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_less() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_greater
+ PURPOSE
+    Search for object in a skip list that is greater than or equal to 'key'
+ USAGE
+    void *H5SL_greater(slist, key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to item who key is greater than or equal to 'key' on success,
+        NULL on failure
+ DESCRIPTION
+    Search for an object in a skip list, according to it's key, returning the
+    object itself (for an exact match), or the object with the next lowest
+    key that is greater than 'key'
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_greater(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    void *ret_value;                            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x = slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_SEARCH(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_SEARCH(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_SEARCH(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_SEARCH(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_SEARCH(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_SEARCH(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_SEARCH(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_SEARCH(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* An exact match for 'key' must not have been found in list, if we get here */
+    /* ('x' must be the next node with a key greater than the 'key', or NULL) */
+    if(x)
+        ret_value = x->item;
+    else
+        ret_value = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_greater() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_find
+ PURPOSE
+    Search for _node_ in a skip list
+ USAGE
+    H5SL_node_t *H5SL_node(slist,key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to _node_ matching key on success, NULL on failure
+ DESCRIPTION
+    Search for an object in a skip list, according to it's key and returns
+    the node that the object is attached to
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine is a useful starting point for next/prev calls
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_find(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    H5SL_node_t *ret_value;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x=slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_FIND(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_FIND(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_FIND(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_FIND(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_FIND(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_FIND(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_FIND(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_FIND(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_FIND(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* 'key' must not have been found in list, if we get here */
+    ret_value=NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_find() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_below
+ PURPOSE
+    Search for _node_ in a skip list whose object is less than or equal to 'key'
+ USAGE
+    H5SL_node_t *H5SL_below(slist, key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to _node_ who key is less than or equal to 'key' on success,
+        NULL on failure
+ DESCRIPTION
+    Search for a node with an object in a skip list, according to it's key,
+    returning the node itself (for an exact match), or the node with the next
+    highest key that is less than 'key'
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_below(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    H5SL_node_t *ret_value;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x = slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_FIND(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_FIND(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_FIND(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_FIND(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_FIND(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_FIND(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_FIND(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_FIND(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_FIND(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* An exact match for 'key' must not have been found in list, if we get here */
+    /* Check for a node with a key that is less than the given 'key' */
+    if(NULL == x) {
+        /* Check for walking off the list */
+        if(slist->last != slist->header)
+            ret_value = slist->last;
+        else
+            ret_value = NULL;
+    } /* end if */
+    else {
+        if(x->backward != slist->header)
+            ret_value = x->backward;
+        else
+            ret_value = NULL;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_below() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_above
+ PURPOSE
+    Search for _node_ in a skip list whose object is greater than or equal to 'key'
+ USAGE
+    H5SL_node_t *H5SL_above(slist, key)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list
+        void *key;              IN: Key for item to search for
+
+ RETURNS
+    Returns pointer to _node_ with object that has a key is greater than or
+        equal to 'key' on success, NULL on failure
+ DESCRIPTION
+    Search for a node with an object in a skip list, according to it's key,
+    returning the node itself (for an exact match), or the node with the next
+    lowest key that is greater than 'key'
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_above(H5SL_t *slist, const void *key)
+{
+    H5SL_node_t *x;                             /* Current node to examine */
+    uint32_t hashval = 0;                       /* Hash value for key */
+    H5SL_node_t *ret_value;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(key);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Insert item into skip list */
+
+    /* Work through the forward pointers for a node, finding the node at each
+     * level that is before the location to insert
+     */
+    x = slist->header;
+    switch(slist->type) {
+        case H5SL_TYPE_INT:
+            H5SL_FIND(SCALAR, slist, x, const int, key, -)
+            break;
+
+        case H5SL_TYPE_HADDR:
+            H5SL_FIND(SCALAR, slist, x, const haddr_t, key, -)
+            break;
+
+        case H5SL_TYPE_STR:
+            H5SL_FIND(STRING, slist, x, char *, key, hashval)
+            break;
+
+        case H5SL_TYPE_HSIZE:
+            H5SL_FIND(SCALAR, slist, x, const hsize_t, key, -)
+            break;
+
+        case H5SL_TYPE_UNSIGNED:
+            H5SL_FIND(SCALAR, slist, x, const unsigned, key, -)
+            break;
+
+        case H5SL_TYPE_SIZE:
+            H5SL_FIND(SCALAR, slist, x, const size_t, key, -)
+            break;
+
+        case H5SL_TYPE_OBJ:
+            H5SL_FIND(OBJ, slist, x, const H5_obj_t, key, -)
+            break;
+
+        case H5SL_TYPE_HID:
+            H5SL_FIND(SCALAR, slist, x, const hid_t, key, -)
+            break;
+
+        case H5SL_TYPE_GENERIC:
+            H5SL_FIND(GENERIC, slist, x, const void, key, -)
+            break;
+
+        default:
+            HDassert(0 && "Unknown skiplist type!");
+    } /* end switch */
+
+    /* An exact match for 'key' must not have been found in list, if we get here */
+    /* ('x' must be the next node with a key greater than the 'key', or NULL) */
+    if(x)
+        ret_value = x;
+    else
+        ret_value = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_above() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_first
+ PURPOSE
+    Gets a pointer to the first node in a skip list
+ USAGE
+    H5SL_node_t *H5SL_first(slist)
+        H5SL_t *slist;          IN: Pointer to skip list
+
+ RETURNS
+    Returns pointer to first node in skip list on success, NULL on failure.
+ DESCRIPTION
+    Retrieves a pointer to the first node in a skip list, for iterating over
+    the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_first(H5SL_t *slist)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    FUNC_LEAVE_NOAPI(slist->header->forward[0])
+} /* end H5SL_first() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_next
+ PURPOSE
+    Gets a pointer to the next node in a skip list
+ USAGE
+    H5SL_node_t *H5SL_next(slist_node)
+        H5SL_node_t *slist_node;          IN: Pointer to skip list node
+
+ RETURNS
+    Returns pointer to node after slist_node in skip list on success, NULL on failure.
+ DESCRIPTION
+    Retrieves a pointer to the next node in a skip list, for iterating over
+    the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_next(H5SL_node_t *slist_node)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist_node);
+
+    /* Not currently supported */
+    HDassert(!slist_node->removed);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    FUNC_LEAVE_NOAPI(slist_node->forward[0])
+} /* end H5SL_next() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_prev
+ PURPOSE
+    Gets a pointer to the previos node in a skip list
+ USAGE
+    H5SL_node_t *H5SL_prev(slist_node)
+        H5SL_node_t *slist_node;          IN: Pointer to skip list node
+
+ RETURNS
+    Returns pointer to node before slist_node in skip list on success, NULL on failure.
+ DESCRIPTION
+    Retrieves a pointer to the previous node in a skip list, for iterating over
+    the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_prev(H5SL_node_t *slist_node)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist_node);
+
+    /* Not currently supported */
+    HDassert(!slist_node->removed);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Walk backward, detecting the header node (which has it's key set to NULL) */
+    FUNC_LEAVE_NOAPI(slist_node->backward->key==NULL ? NULL : slist_node->backward)
+} /* end H5SL_prev() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_last
+ PURPOSE
+    Gets a pointer to the last node in a skip list
+ USAGE
+    H5SL_node_t *H5SL_last(slist)
+        H5SL_t *slist;          IN: Pointer to skip list
+
+ RETURNS
+    Returns pointer to last node in skip list on success, NULL on failure.
+ DESCRIPTION
+    Retrieves a pointer to the last node in a skip list, for iterating over
+    the list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5SL_node_t *
+H5SL_last(H5SL_t *slist)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Find last node, avoiding the header node */
+    FUNC_LEAVE_NOAPI(slist->last==slist->header ? NULL : slist->last)
+} /* end H5SL_last() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_item
+ PURPOSE
+    Gets pointer to the 'item' for a skip list node
+ USAGE
+    void *H5SL_item(slist_node)
+        H5SL_node_t *slist_node;          IN: Pointer to skip list node
+
+ RETURNS
+    Returns pointer to node 'item' on success, NULL on failure.
+ DESCRIPTION
+    Retrieves a node's 'item'
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5SL_item(H5SL_node_t *slist_node)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist_node);
+
+    /* Not currently supported */
+    HDassert(!slist_node->removed);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    FUNC_LEAVE_NOAPI(slist_node->item)
+} /* end H5SL_item() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_iterate
+ PURPOSE
+    Iterate over all nodes in a skip list
+ USAGE
+    herr_t H5SL_iterate(slist, op, op_data)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list to iterate over
+        H5SL_operator_t op;     IN: Callback function for iteration
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns a negative value if something is wrong, the return
+        value of the last operator if it was non-zero, or zero if all
+        nodes were processed.
+ DESCRIPTION
+    Iterate over all the nodes in a skip list, calling an application callback
+    with the item, key and any operator data.
+
+    The operator callback receives a pointer to the item and key for the list
+    being iterated over ('mesg'), and the pointer to the operator data passed
+    in to H5SL_iterate ('op_data').  The return values from an operator are:
+        A. Zero causes the iterator to continue, returning zero when all
+            nodes of that type have been processed.
+        B. Positive causes the iterator to immediately return that positive
+            value, indicating short-circuit success.
+        C. Negative causes the iterator to immediately return that value,
+            indicating failure.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_iterate(H5SL_t *slist, H5SL_operator_t op, void *op_data)
+{
+    H5SL_node_t *node;  /* Pointer to current skip list node */
+    H5SL_node_t *next;  /* Pointer to next skip list node */
+    herr_t ret_value = 0; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Free skip list nodes */
+    node = slist->header->forward[0];
+    while(node != NULL) {
+        /* Protect against the node being deleted by the callback */
+        next = node->forward[0];
+
+        /* Call the iterator callback */
+        /* Casting away const OK -QAK */
+        if(!node->removed)
+            if((ret_value = (op)(node->item, (void *)node->key, op_data)) != 0)
+                break;
+
+        /* Advance to next node */
+        node = next;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_iterate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_release
+ PURPOSE
+    Release all nodes from a skip list
+ USAGE
+    herr_t H5SL_release(slist)
+        H5SL_t *slist;            IN/OUT: Pointer to skip list to release nodes
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Release all the nodes in a skip list.  Any objects left in the skip list
+    nodes are not deallocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The skip list itself is still valid, it just has all its nodes removed.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_release(H5SL_t *slist)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Free skip list nodes */
+    H5SL_release_common(slist,NULL,NULL); /* always succeeds */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SL_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_free
+ PURPOSE
+    Release all nodes from a skip list, freeing all nodes
+ USAGE
+    herr_t H5SL_free(slist,op,op_data)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list to release nodes
+        H5SL_operator_t op;     IN: Callback function to free item & key
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Release all the nodes in a skip list.  Any objects left in
+    the skip list have the 'op' routine called for each.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The skip list itself is still valid, it just has all its nodes removed.
+
+    The return value from the 'op' routine is ignored.
+
+    This routine is essentially a combination of iterating over all the nodes
+    (where the iterator callback is supposed to free the items and/or keys)
+    followed by a call to H5SL_release().
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_free(H5SL_t *slist, H5SL_operator_t op, void *op_data)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Free skip list nodes */
+    H5SL_release_common(slist,op,op_data); /* always succeeds */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SL_free() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_try_free_safe
+ PURPOSE
+    Makes the supplied callback on all nodes in the skip list, freeing each
+    node that the callback returns TRUE for.
+ USAGE
+    herr_t PURPOSE(slist,op,opdata)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list to release nodes
+        H5SL_try_free_op_t op;  IN: Callback function to try to free item & key
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Makes the supplied callback on all nodes in the skip list, freeing each
+    node that the callback returns TRUE for.  The iteration is performed in
+    a safe manner, such that the callback can call H5SL_remove(),
+    H5SL_search(), H5SL_find(), and H5SL_iterate() on nodes in this
+    skiplist, except H5SL_remove() may not be call on *this* node.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This function is written to be most efficient when most nodes are
+    removed from the skiplist, as it rebuilds the nodes afterwards.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_try_free_safe(H5SL_t *slist, H5SL_try_free_op_t op, void *op_data)
+{
+    H5SL_node_t *node, *next_node, *last_node; /* Pointers to skip list nodes */
+    htri_t op_ret;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(slist);
+    HDassert(op);
+
+    /* Not currently supported */
+    HDassert(!slist->safe_iterating);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Mark skip list as safe iterating, so nodes aren't freed out from under
+     * us */
+    slist->safe_iterating = TRUE;
+
+    /* Iterate over skip list nodes, making the callback for each and marking
+     * them as removed if requested by the callback */
+    node = slist->header->forward[0];
+    while(node) {
+        /* Check if the node was already removed */
+        if(!node->removed) {
+            /* Call callback */
+            /* Casting away const OK -NAF */
+            if((op_ret = (op)(node->item , (void *)node->key, op_data)) < 0)
+                HGOTO_ERROR(H5E_SLIST, H5E_CALLBACK, FAIL, "callback operation failed")
+
+            /* Check if op indicated that the node should be removed */
+            if(op_ret)
+                /* Mark the node as removed */
+                node->removed = TRUE;
+        } /* end if */
+
+        /* Advance node */
+        node = node->forward[0];
+    } /* end while */
+
+    /* Reset safe_iterating */
+    slist->safe_iterating = FALSE;
+
+    /* Iterate over nodes, freeing ones marked as removed */
+    node = slist->header->forward[0];
+    last_node = slist->header;
+    while(node) {
+        /* Save next node */
+        next_node = node->forward[0];
+
+        /* Check if the node was marked as removed */
+        if(node->removed) {
+            /* Remove the node */
+            node->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[node->log_nalloc], node->forward);
+            node = H5FL_FREE(H5SL_node_t, node);
+            slist->nobjs--;
+        } /* end if */
+        else {
+            /* Update backwards and forwards[0] pointers, and set the level to
+             * 0.  Since the list is flattened we must rebuild the skiplist
+             * afterwards. */
+            /* Set level to 0.  Note there is no need to preserve
+             * node->forward[0] since it was cached above and will always be
+             * updated later. */
+            if(node->level > 0) {
+                node->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[node->log_nalloc], (void *)node->forward);
+                if(NULL == (node->forward = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[0])))
+                    HGOTO_ERROR(H5E_SLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
+                node->log_nalloc = 0;
+                node->level = 0;
+            } /* end if */
+
+            /* Update pointers */
+            last_node->forward[0] = node;
+            node->backward = last_node;
+            last_node = node;
+        } /* end else */
+
+        /* Advance node */
+        node = next_node;
+    } /* end while */
+
+    /* Final pointer update */
+    last_node->forward[0] = NULL;
+    slist->last = last_node;
+
+    /* Demote skip list to level 0 */
+    if(slist->curr_level > 0) {
+        HDassert(slist->header->level == (size_t)slist->curr_level);
+
+        node = slist->header->forward[0];
+        slist->header->forward = (H5SL_node_t **)H5FL_FAC_FREE(H5SL_fac_g[slist->header->log_nalloc], (void *)slist->header->forward);
+        if(NULL == (slist->header->forward = (H5SL_node_t **)H5FL_FAC_MALLOC(H5SL_fac_g[0])))
+            HGOTO_ERROR(H5E_SLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        slist->header->forward[0] = node;
+        slist->header->log_nalloc = 0;
+        slist->header->level = 0;
+    } /* end if */
+
+    /* Check if there are any nodes left */
+    if(slist->nobjs > 0) {
+        int i;
+
+        HDassert(slist->header->forward[0]);
+
+        /* Set skiplist level to 0 */
+        slist->curr_level = 0;
+
+        /* Rebuild the forward arrays */
+        for(i = 0; slist->curr_level >= i; i++) {
+            HDassert(slist->curr_level == i);
+
+            /* Promote every third node this level until we run out of nodes */
+            node = last_node = slist->header;
+            while(1) {
+                /* Check second node in gap, if not present, no need to promote
+                 * further this level. */
+                HDassert(node->forward[i]);
+                node = node->forward[i]->forward[i];
+                if(!node)
+                    break;
+
+                /* Check third and fourth node in gap, if either is not present,
+                 * no need to promote further this level. */
+                node = node->forward[i];
+                if(!node || !node->forward[i])
+                    break;
+
+                /* Promote the third node in the gap */
+                H5SL_PROMOTE(slist, node, last_node, FAIL)
+                last_node = node;
+            } /* end while */
+        } /* end for */
+    } /* end if */
+    else {
+        HDassert(!slist->header->forward[0]);
+        HDassert(slist->last == slist->header);
+        HDassert(slist->nobjs == 0);
+
+        /* Reset the skiplist level */
+        slist->curr_level = -1;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_try_free_safe() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_destroy
+ PURPOSE
+    Close a skip list, deallocating it and freeing all its nodes.
+ USAGE
+    herr_t H5SL_destroy(slist,op,opdata)
+        H5SL_t *slist;          IN/OUT: Pointer to skip list to close
+        H5SL_operator_t op;     IN: Callback function to free item & key
+        void *op_data;          IN/OUT: Pointer to application data for callback
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a skip list, freeing all internal information.  Any objects left in
+    the skip list have the 'op' routine called for each.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The return value from the 'op' routine is ignored.
+
+    This routine is essentially a combination of iterating over all the nodes
+    (where the iterator callback is supposed to free the items and/or keys)
+    followed by a call to H5SL_close().
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_destroy(H5SL_t *slist, H5SL_operator_t op, void *op_data)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Close skip list */
+    (void)H5SL_close_common(slist,op,op_data); /* always succeeds */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SL_destroy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_close
+ PURPOSE
+    Close a skip list, deallocating it.
+ USAGE
+    herr_t H5SL_close(slist)
+        H5SL_t *slist;            IN/OUT: Pointer to skip list to close
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a skip list, freeing all internal information.  Any objects left in
+    the skip list are not deallocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5SL_close(H5SL_t *slist)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(slist);
+
+    /* Check internal consistency */
+    /* (Pre-condition) */
+
+    /* Close skip list */
+    (void)H5SL_close_common(slist,NULL,NULL); /* always succeeds */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SL_close() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_term_interface
+ PURPOSE
+    Terminate all the H5FL factories used in this package, and clear memory
+ USAGE
+    int H5SL_term_interface()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int H5SL_term_interface(void)
+{
+    size_t  i;
+    herr_t  ret;
+    int     n = H5_interface_initialize_g ? 1 : 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(n) {
+        /* Terminate all the factories */
+        for(i=0; i<H5SL_fac_nused_g; i++) {
+            ret = H5FL_fac_term(H5SL_fac_g[i]);
+            HDassert(ret >= 0);
+        }
+        H5SL_fac_nused_g = 0;
+
+        /* Free the list of factories */
+        H5SL_fac_g = (H5FL_fac_head_t **)H5MM_xfree((void *)H5SL_fac_g);
+        H5SL_fac_nalloc_g = 0;
+
+        /* Mark the interface as uninitialized */
+        H5_interface_initialize_g = 0;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* H5SL_term_interface() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SLprivate.h b/gatb-core/thirdparty/hdf5/src/H5SLprivate.h
new file mode 100644
index 0000000..856099b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SLprivate.h
@@ -0,0 +1,100 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5SL module
+ */
+#ifndef _H5SLprivate_H
+#define _H5SLprivate_H
+
+/**************************************/
+/* Public headers needed by this file */
+/**************************************/
+#ifdef LATER
+#include "H5SLpublic.h"
+#endif /* LATER */
+
+/***************************************/
+/* Private headers needed by this file */
+/***************************************/
+#include "H5private.h"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Typedefs for skip list struct (defined in H5SL.c) */
+typedef struct H5SL_t H5SL_t;
+typedef struct H5SL_node_t H5SL_node_t;
+
+/* Typedef for kinds of skip lists supported */
+typedef enum {
+    H5SL_TYPE_INT,      /* Skip list keys are 'int's */
+    H5SL_TYPE_HADDR,    /* Skip list keys are 'haddr_t's */
+    H5SL_TYPE_STR,      /* Skip list keys are 'char *'s (ie. strings) */
+    H5SL_TYPE_HSIZE,    /* Skip list keys are 'hsize_t's */
+    H5SL_TYPE_UNSIGNED, /* Skip list keys are 'unsigned's */
+    H5SL_TYPE_SIZE,     /* Skip list keys are 'size_t's */
+    H5SL_TYPE_OBJ,      /* Skip list keys are 'H5_obj_t's */
+    H5SL_TYPE_HID,      /* Skip list keys are 'hid_t's */
+    H5SL_TYPE_GENERIC   /* Skip list keys are unknown, comparison callback supplied */
+} H5SL_type_t;
+
+/**********/
+/* Macros */
+/**********/
+
+/* Typedef for comparison operations */
+typedef int (*H5SL_cmp_t)(const void *key1, const void *key2);
+
+/* Typedef for iteration operations */
+typedef herr_t (*H5SL_operator_t)(void *item, void *key,
+    void *operator_data/*in,out*/);
+
+/* Typedef for H5SL_try_free_safe operation callback */
+typedef htri_t (*H5SL_try_free_op_t)(void *item, void *key,
+    void *operator_data/*in,out*/);
+
+/********************/
+/* Private routines */
+/********************/
+H5_DLL H5SL_t *H5SL_create(H5SL_type_t type, H5SL_cmp_t cmp);
+H5_DLL size_t H5SL_count(H5SL_t *slist);
+H5_DLL herr_t H5SL_insert(H5SL_t *slist, void *item, const void *key);
+H5_DLL H5SL_node_t *H5SL_add(H5SL_t *slist, void *item, const void *key);
+H5_DLL void *H5SL_remove(H5SL_t *slist, const void *key);
+H5_DLL void *H5SL_remove_first(H5SL_t *slist);
+H5_DLL void *H5SL_search(H5SL_t *slist, const void *key);
+H5_DLL void *H5SL_less(H5SL_t *slist, const void *key);
+H5_DLL void *H5SL_greater(H5SL_t *slist, const void *key);
+H5_DLL H5SL_node_t *H5SL_find(H5SL_t *slist, const void *key);
+H5_DLL H5SL_node_t *H5SL_below(H5SL_t *slist, const void *key);
+H5_DLL H5SL_node_t *H5SL_above(H5SL_t *slist, const void *key);
+H5_DLL H5SL_node_t *H5SL_first(H5SL_t *slist);
+H5_DLL H5SL_node_t *H5SL_next(H5SL_node_t *slist_node);
+H5_DLL H5SL_node_t *H5SL_prev(H5SL_node_t *slist_node);
+H5_DLL H5SL_node_t *H5SL_last(H5SL_t *slist);
+H5_DLL void *H5SL_item(H5SL_node_t *slist_node);
+H5_DLL herr_t H5SL_iterate(H5SL_t *slist, H5SL_operator_t op, void *op_data);
+H5_DLL herr_t H5SL_release(H5SL_t *slist);
+H5_DLL herr_t H5SL_free(H5SL_t *slist, H5SL_operator_t op, void *op_data);
+H5_DLL herr_t H5SL_try_free_safe(H5SL_t *slist, H5SL_try_free_op_t op,
+    void *op_data);
+H5_DLL herr_t H5SL_close(H5SL_t *slist);
+H5_DLL herr_t H5SL_destroy(H5SL_t *slist, H5SL_operator_t op, void *op_data);
+H5_DLL int H5SL_term_interface(void);
+
+#endif /* _H5SLprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SM.c b/gatb-core/thirdparty/hdf5/src/H5SM.c
new file mode 100644
index 0000000..861853d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SM.c
@@ -0,0 +1,2776 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access                          */
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"        /* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Opkg.h"             /* Object Headers                       */
+#include "H5SMpkg.h"            /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Udata struct for calls to H5SM_read_iter_op */
+typedef struct H5SM_read_udata_t {
+    H5F_t *file;                    /* File in which sharing is happening (in) */
+    H5O_msg_crt_idx_t idx;          /* Creation index of this message (in) */
+    size_t buf_size;                /* Size of the encoded message (out) */
+    void *encoding_buf;             /* The encoded message (out) */
+} H5SM_read_udata_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5SM_create_index(H5F_t *f, H5SM_index_header_t *header,
+                                hid_t dxpl_id);
+static herr_t H5SM_delete_index(H5F_t *f, H5SM_index_header_t *header,
+                                hid_t dxpl_id, hbool_t delete_heap);
+static haddr_t H5SM_create_list(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id);
+static herr_t H5SM_find_in_list(const H5SM_list_t *list, const H5SM_mesg_key_t *key, 
+                                size_t *empty_pos, size_t *list_pos);
+static herr_t H5SM_convert_list_to_btree(H5F_t * f, H5SM_index_header_t * header,
+                H5SM_list_t **_list, H5HF_t *fheap, H5O_t *open_oh, hid_t dxpl_id);
+static herr_t H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_id);
+static herr_t H5SM_incr_ref(void *record, void *_op_data, hbool_t *changed);
+static herr_t H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    H5SM_index_header_t *header, hbool_t defer, unsigned type_id, void *mesg,
+    unsigned *cache_flags_ptr);
+static herr_t H5SM_decr_ref(void *record, void *op_data, hbool_t *changed);
+static herr_t H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    H5SM_index_header_t *header, const H5O_shared_t * mesg,
+    unsigned *cache_flags, void ** /*out*/ encoded_mesg);
+static herr_t H5SM_type_to_flag(unsigned type_id, unsigned *type_flag);
+static herr_t H5SM_read_iter_op(H5O_t *oh, H5O_mesg_t *mesg, unsigned sequence,
+    unsigned *oh_modified, void *_udata);
+static herr_t H5SM_read_mesg_fh_cb(const void *obj, size_t obj_len, void *_udata);
+static herr_t H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap,
+               H5O_t * open_oh, hid_t dxpl_id, size_t *encoding_size /*out*/,
+               void ** encoded_mesg /*out*/);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+H5FL_DEFINE(H5SM_master_table_t);
+H5FL_ARR_DEFINE(H5SM_index_header_t, H5O_SHMESG_MAX_NINDEXES);
+H5FL_DEFINE(H5SM_list_t);
+H5FL_ARR_DEFINE(H5SM_sohm_t, H5O_SHMESG_MAX_LIST_SIZE);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_init
+ *
+ * Purpose:     Initializes the Shared Message interface.
+ *
+ *              Creates a master SOHM table in the file and in the cache.
+ *              This function should not be called for files that have
+ *              SOHMs disabled in the FCPL.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t dxpl_id)
+{
+    H5O_shmesg_table_t sohm_table;      /* SOHM message for superblock extension */
+    H5SM_master_table_t *table = NULL;  /* SOHM master table for file */
+    haddr_t table_addr = HADDR_UNDEF;   /* Address of SOHM master table in file */
+    unsigned list_max, btree_min;       /* Phase change limits for SOHM indices */
+    unsigned index_type_flags[H5O_SHMESG_MAX_NINDEXES]; /* Messages types stored in each index */
+    unsigned minsizes[H5O_SHMESG_MAX_NINDEXES]; /* Message size sharing threshhold for each index */
+    unsigned type_flags_used;           /* Message type flags used, for sanity checking */
+    unsigned x;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(f);
+    /* File should not already have a SOHM table */
+    HDassert(!H5F_addr_defined(H5F_SOHM_ADDR(f)));
+
+    /* Initialize master table */
+    if(NULL == (table = H5FL_MALLOC(H5SM_master_table_t)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTALLOC, FAIL, "memory allocation failed for SOHM table")
+    table->num_indexes = H5F_SOHM_NINDEXES(f);
+    table->table_size = H5SM_TABLE_SIZE(f);
+
+    /* Get information from fcpl */
+    if(H5P_get(fc_plist, H5F_CRT_SHMSG_INDEX_TYPES_NAME, &index_type_flags) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get SOHM type flags")
+    if(H5P_get(fc_plist, H5F_CRT_SHMSG_LIST_MAX_NAME, &list_max) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get SOHM list maximum")
+    if(H5P_get(fc_plist, H5F_CRT_SHMSG_BTREE_MIN_NAME, &btree_min) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get SOHM btree minimum")
+    if(H5P_get(fc_plist, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, &minsizes) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get SOHM message min sizes")
+
+    /* Verify that values are valid */
+    if(table->num_indexes > H5O_SHMESG_MAX_NINDEXES)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADRANGE, FAIL, "number of indexes in property list is too large")
+
+    /* Check that type flags weren't duplicated anywhere */
+    type_flags_used = 0;
+    for(x = 0; x < table->num_indexes; ++x) {
+        if(index_type_flags[x] & type_flags_used)
+            HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "the same shared message type flag is assigned to more than one index")
+        type_flags_used |= index_type_flags[x];
+    } /* end for */
+
+    /* Check that number of indexes in table and in superblock make sense.
+     * Right now we just use one byte to hold the number of indexes.
+     */
+    HDassert(table->num_indexes < 256);
+
+    /* Check that list and btree cutoffs make sense.  There can't be any
+     * values greater than the list max but less than the btree min; the
+     * list max has to be greater than or equal to one less than the btree
+     * min.
+     */
+    HDassert(list_max + 1 >= btree_min);
+    HDassert(table->num_indexes > 0 && table->num_indexes <= H5O_SHMESG_MAX_NINDEXES);
+
+    /* Allocate the SOHM indexes as an array. */
+    if(NULL == (table->indexes = (H5SM_index_header_t *)H5FL_ARR_MALLOC(H5SM_index_header_t, (size_t)table->num_indexes)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "memory allocation failed for SOHM indexes")
+
+    /* Initialize all of the indexes, but don't allocate space for them to
+     * hold messages until we actually need to write to them.
+     */
+    for(x = 0; x < table->num_indexes; x++) {
+        table->indexes[x].btree_min = btree_min;
+        table->indexes[x].list_max = list_max;
+        table->indexes[x].mesg_types = index_type_flags[x];
+        table->indexes[x].min_mesg_size = minsizes[x];
+        table->indexes[x].index_addr = HADDR_UNDEF;
+        table->indexes[x].heap_addr = HADDR_UNDEF;
+        table->indexes[x].num_messages = 0;
+
+        /* Indexes start as lists unless the list-to-btree threshold is zero */
+        if(table->indexes[x].list_max > 0)
+            table->indexes[x].index_type = H5SM_LIST;
+        else
+            table->indexes[x].index_type = H5SM_BTREE;
+
+        /* Compute the size of a list index for this SOHM index */
+        table->indexes[x].list_size = H5SM_LIST_SIZE(f, list_max);
+    } /* end for */
+
+    /* Allocate space for the table on disk */
+    if(HADDR_UNDEF == (table_addr = H5MF_alloc(f, H5FD_MEM_SOHM_TABLE, dxpl_id, (hsize_t)table->table_size)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "file allocation failed for SOHM table")
+
+    /* Cache the new table */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, table, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTINS, FAIL, "can't add SOHM table to cache")
+
+    /* Record the address of the master table in the file */
+    H5F_SET_SOHM_ADDR(f, table_addr);
+
+    /* Check for sharing attributes in this file, which means that creation
+     *  indices must be tracked on object header message in the file.
+     */
+    if(type_flags_used & H5O_SHMESG_ATTR_FLAG)
+        H5F_SET_STORE_MSG_CRT_IDX(f, TRUE);
+
+    /* Write shared message information to the superblock extension */
+    sohm_table.addr = H5F_SOHM_ADDR(f);
+    sohm_table.version = H5F_SOHM_VERS(f);
+    sohm_table.nindexes = H5F_SOHM_NINDEXES(f);
+    if(H5O_msg_create(ext_loc, H5O_SHMESG_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &sohm_table, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to update SOHM header message")
+
+done:
+    if(ret_value < 0) {
+        if(table_addr != HADDR_UNDEF)
+            H5MF_xfree(f, H5FD_MEM_SOHM_TABLE, dxpl_id, table_addr, (hsize_t)table->table_size);
+        if(table != NULL)
+            table = H5FL_FREE(H5SM_master_table_t, table);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_type_to_flag
+ *
+ * Purpose:     Get the shared message flag for a given message type.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, October 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_type_to_flag(unsigned type_id, unsigned *type_flag)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Translate the H5O type_id into an H5SM type flag */
+    switch(type_id) {
+        case H5O_FILL_ID:
+            type_id = H5O_FILL_NEW_ID;
+            /* Fall through... */
+
+        case H5O_SDSPACE_ID:
+        case H5O_DTYPE_ID:
+        case H5O_FILL_NEW_ID:
+        case H5O_PLINE_ID:
+        case H5O_ATTR_ID:
+            *type_flag = (unsigned)1 << type_id;
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "unknown message type ID")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_type_to_flag() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_get_index
+ *
+ * Purpose:     Get the index number for a given message type.
+ *
+ *              Returns the number of the index in the supplied table
+ *              that holds messages of type type_id, or negative if
+ *              there is no index for this message type.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, October 10, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id)
+{
+    size_t x;
+    unsigned type_flag;
+    ssize_t ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Translate the H5O type_id into an H5SM type flag */
+    if(H5SM_type_to_flag(type_id, &type_flag) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't map message type to flag")
+
+    /* Search the indexes until we find one that matches this flag or we've
+     * searched them all.
+     */
+    for(x = 0; x < table->num_indexes; ++x)
+        if(table->indexes[x].mesg_types & type_flag)
+            HGOTO_DONE((ssize_t)x)
+
+    /* At this point, ret_value is either the location of the correct
+     * index or it's still FAIL because we didn't find an index.
+     */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_type_shared
+ *
+ * Purpose:     Check if a given message type is shared in a file.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, December 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id)
+{
+    H5SM_master_table_t *table = NULL;  /* Shared object master table */
+    unsigned type_flag;                 /* Flag corresponding to message type */
+    size_t u;                           /* Local index variable */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Translate the H5O type_id into an H5SM type flag */
+    if(H5SM_type_to_flag(type_id, &type_flag) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't map message type to flag")
+
+    /* Look up the master SOHM table */
+    if(H5F_addr_defined(H5F_SOHM_ADDR(f))) {
+        H5SM_table_cache_ud_t cache_udata;      /* User-data for callback */
+
+        /* Set up user data for callback */
+        cache_udata.f = f;
+
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+    } /* end if */
+    else
+        /* No shared messages of any type */
+        HGOTO_DONE(FALSE)
+
+    /* Search the indexes until we find one that matches this flag or we've
+     * searched them all.
+     */
+    for(u = 0; u < table->num_indexes; u++)
+        if(table->indexes[u].mesg_types & type_flag)
+            HGOTO_DONE(TRUE)
+
+done:
+    /* Release the master SOHM table */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_type_shared() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_get_fheap_addr
+ *
+ * Purpose:     Gets the address of the fractal heap used to store
+ *              messages of type type_id.
+ *
+ * Return:      Non-negative on success/negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, October 3, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id, haddr_t *fheap_addr)
+{
+    H5SM_master_table_t *table = NULL;  /* Shared object master table */
+    H5SM_table_cache_ud_t cache_udata;  /* User-data for callback */
+    ssize_t index_num;                  /* Which index */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(fheap_addr);
+
+    /* Set up user data for callback */
+    cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* Look up index for message type */
+    if((index_num = H5SM_get_index(table, type_id)) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to find correct SOHM index")
+
+    /* Retrieve heap address for index */
+    *fheap_addr = table->indexes[index_num].heap_addr;
+
+done:
+    /* Release the master SOHM table */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_fheap_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_create_index
+ *
+ * Purpose:     Allocates storage for an index, populating the HEADER struct.
+ *
+ * Return:      Non-negative on success/negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_create_index(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
+{
+    H5HF_create_t fheap_cparam;         /* Fractal heap creation parameters */
+    H5HF_t *fheap = NULL;               /* Fractal heap handle */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(header);
+    HDassert(header->index_addr == HADDR_UNDEF);
+    HDassert(header->btree_min <= header->list_max + 1);
+
+    /* In most cases, the index starts as a list */
+    if(header->list_max > 0) {
+        haddr_t list_addr = HADDR_UNDEF;    /* Address of SOHM list */
+
+        /* Create the list index */
+        if((list_addr = H5SM_create_list(f, header, dxpl_id)) == HADDR_UNDEF)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTCREATE, FAIL, "list creation failed for SOHM index")
+
+        /* Set the index type & address */
+        header->index_type = H5SM_LIST;
+        header->index_addr = list_addr;
+    } /* end if */
+    /* index is a B-tree */
+    else {
+        H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+        haddr_t tree_addr = HADDR_UNDEF;    /* Address of SOHM B-tree */
+
+        /* Create the v2 B-tree index */
+        bt2_cparam.cls = H5SM_INDEX;
+        bt2_cparam.node_size = (uint32_t)H5SM_B2_NODE_SIZE;
+        bt2_cparam.rrec_size = (uint32_t)H5SM_SOHM_ENTRY_SIZE(f);
+        bt2_cparam.split_percent = H5SM_B2_SPLIT_PERCENT;
+        bt2_cparam.merge_percent = H5SM_B2_MERGE_PERCENT;
+        if(NULL == (bt2 = H5B2_create(f, dxpl_id, &bt2_cparam, f)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTCREATE, FAIL, "B-tree creation failed for SOHM index")
+
+        /* Retrieve the v2 B-tree's address in the file */
+        if(H5B2_get_addr(bt2, &tree_addr) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get v2 B-tree address for SOHM index")
+
+        /* Set the index type & address */
+        header->index_type = H5SM_BTREE;
+        header->index_addr = tree_addr;
+    } /* end else */
+
+    /* Create a heap to hold the shared messages that the list or B-tree will index */
+    HDmemset(&fheap_cparam, 0, sizeof(fheap_cparam));
+    fheap_cparam.managed.width = H5O_FHEAP_MAN_WIDTH;
+    fheap_cparam.managed.start_block_size = H5O_FHEAP_MAN_START_BLOCK_SIZE;
+    fheap_cparam.managed.max_direct_size = H5O_FHEAP_MAN_MAX_DIRECT_SIZE;
+    fheap_cparam.managed.max_index = H5O_FHEAP_MAN_MAX_INDEX;
+    fheap_cparam.managed.start_root_rows = H5O_FHEAP_MAN_START_ROOT_ROWS;
+    fheap_cparam.checksum_dblocks = H5O_FHEAP_CHECKSUM_DBLOCKS;
+    fheap_cparam.id_len = 0;
+    fheap_cparam.max_man_size = H5O_FHEAP_MAX_MAN_SIZE;
+    if(NULL == (fheap = H5HF_create(f, dxpl_id, &fheap_cparam)))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create fractal heap")
+
+    if(H5HF_get_heap_addr(fheap, &(header->heap_addr)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGETSIZE, FAIL, "can't get fractal heap address")
+
+#ifndef NDEBUG
+{
+    size_t fheap_id_len;             /* Size of a fractal heap ID */
+
+    /* Sanity check ID length */
+    if(H5HF_get_id_len(fheap, &fheap_id_len) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGETSIZE, FAIL, "can't get fractal heap ID length")
+    HDassert(fheap_id_len == H5O_FHEAP_ID_LEN);
+}
+#endif /* NDEBUG */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_create_index */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_delete_index
+ *
+ * Purpose:     De-allocates storage for an index whose header is HEADER.
+ *
+ *              If DELETE_HEAP is TRUE, deletes the index's heap, eliminating
+ *              it completely.
+ *
+ *              If DELETE_HEAP is FALSE, the heap is not deleted.  This is
+ *              useful when deleting only the index header as the index is
+ *              converted from a list to a B-tree and back again.
+ *
+ * Return:      Non-negative on success/negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, January 4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_delete_index(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id,
+    hbool_t delete_heap)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Determine whether index is a list or a B-tree. */
+    if(header->index_type == H5SM_LIST) {
+        unsigned index_status = 0;         /* Index list's status in the metadata cache */
+
+        /* Check the index list's status in the metadata cache */
+        if(H5AC_get_entry_status(f, header->index_addr, &index_status) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "unable to check metadata cache status for direct block")
+
+        /* If the index list is in the cache, expunge it now */
+        if(index_status & H5AC_ES__IN_CACHE) {
+            /* Sanity checks on index list */
+            HDassert(!(index_status & H5AC_ES__IS_PINNED));
+            HDassert(!(index_status & H5AC_ES__IS_PROTECTED));
+
+            /* Evict the index list from the metadata cache */
+            if(H5AC_expunge_entry(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, H5AC__FREE_FILE_SPACE_FLAG) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTREMOVE, FAIL, "unable to remove list index from cache")
+        } /* end if */
+    } /* end if */
+    else {
+        HDassert(header->index_type == H5SM_BTREE);
+
+        /* Delete the B-tree. */
+        if(H5B2_delete(f, dxpl_id, header->index_addr, f, NULL, NULL) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to delete B-tree")
+
+        /* Revert to list unless B-trees can have zero records */
+        if(header->btree_min > 0)
+            header->index_type = H5SM_LIST;
+    } /* end else */
+
+    /* Free the index's heap if requested. */
+    if(delete_heap == TRUE) {
+        if(H5HF_delete(f, dxpl_id, header->heap_addr) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")
+        header->heap_addr = HADDR_UNDEF;
+    } /* end if */
+
+    /* Reset index info */
+    header->index_addr = HADDR_UNDEF;
+    header->num_messages = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_delete_index */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_create_list
+ *
+ * Purpose:     Creates a list of SOHM messages.
+ *
+ *              Called when a new index is created from scratch or when a
+ *              B-tree needs to be converted back into a list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Monday, August 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5SM_create_list(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
+{
+    H5SM_list_t *list = NULL;   /* List of messages */
+    hsize_t x;                  /* Counter variable */
+    size_t num_entries;         /* Number of messages to create in list */
+    haddr_t addr = HADDR_UNDEF; /* Address of the list on disk */
+    haddr_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(header);
+
+    num_entries = header->list_max;
+
+    /* Allocate list in memory */
+    if(NULL == (list = H5FL_MALLOC(H5SM_list_t)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
+    if(NULL == (list->messages = (H5SM_sohm_t *)H5FL_ARR_CALLOC(H5SM_sohm_t, num_entries)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
+
+    /* Initialize messages in list */
+    for(x = 0; x < num_entries; x++)
+        list->messages[x].location = H5SM_NO_LOC;
+
+    /* Point list at header passed in */
+    list->header = header;
+
+    /* Allocate space for the list on disk */
+    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_SOHM_INDEX, dxpl_id, (hsize_t)header->list_size)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
+
+    /* Put the list into the cache */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_SOHM_LIST, addr, list, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTINS, HADDR_UNDEF, "can't add SOHM list to cache")
+
+    /* Set return value */
+    ret_value = addr;
+
+done:
+    if(ret_value == HADDR_UNDEF) {
+        if(list != NULL) {
+            if(list->messages != NULL)
+                list->messages = H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
+            list = H5FL_FREE(H5SM_list_t, list);
+        } /* end if */
+        if(addr != HADDR_UNDEF)
+            H5MF_xfree(f, H5FD_MEM_SOHM_INDEX, dxpl_id, addr, (hsize_t)header->list_size);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_create_list */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_convert_list_to_btree
+ *
+ * Purpose:     Given a list index, turns it into a B-tree index.  This is
+ *              done when too many messages are added to the list.
+ *
+ *              Requires that *_LIST be a valid list and currently protected
+ *              in the cache.  Unprotects (and expunges) *_LIST from the cache.
+ *
+ *              _LIST needs to be a double pointer so that the calling function
+ *              knows if it is released from the cache if this function exits
+ *              in error.  Trying to free it again will trigger an assert.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, January 4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_convert_list_to_btree(H5F_t *f, H5SM_index_header_t *header,
+    H5SM_list_t **_list, H5HF_t *fheap, H5O_t *open_oh, hid_t dxpl_id)
+{
+    H5SM_list_t *list;                  /* Pointer to the existing message list */
+    H5SM_mesg_key_t key;                /* Key for inserting records in v2 B-tree */
+    H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    haddr_t     tree_addr;              /* New v2 B-tree's address */
+    size_t      num_messages;		/* Number of messages being tracked */
+    size_t      x;
+    void *      encoding_buf = NULL;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(_list && *_list);
+    HDassert(header);
+
+    /* Get pointer to list of messages to convert */
+    list = *_list;
+
+    /* Create the new v2 B-tree for tracking the messages */
+    bt2_cparam.cls = H5SM_INDEX;
+    bt2_cparam.node_size = (uint32_t)H5SM_B2_NODE_SIZE;
+    bt2_cparam.rrec_size = (uint32_t)H5SM_SOHM_ENTRY_SIZE(f);
+    bt2_cparam.split_percent = H5SM_B2_SPLIT_PERCENT;
+    bt2_cparam.merge_percent = H5SM_B2_MERGE_PERCENT;
+    if(NULL == (bt2 = H5B2_create(f, dxpl_id, &bt2_cparam, f)))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTCREATE, FAIL, "B-tree creation failed for SOHM index")
+
+    /* Retrieve the v2 B-tree's address in the file */
+    if(H5B2_get_addr(bt2, &tree_addr) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't get v2 B-tree address for SOHM index")
+
+    /* Set up key values that all messages will use.  Since these messages
+     * are in the heap, they have a heap ID and no encoding or type_id.
+     */
+    key.file = f;
+    key.dxpl_id = dxpl_id;
+    key.fheap = fheap;
+    key.encoding_size = 0;
+    key.encoding = NULL;
+
+    /* Insert each record into the new B-tree */
+    for(x = 0; x < header->list_max; x++) {
+        if(list->messages[x].location != H5SM_NO_LOC) {
+            /* Copy message into key */
+            key.message = list->messages[x];
+
+            /* Get the encoded message */
+            if(H5SM_read_mesg(f, &(key.message), fheap, open_oh, dxpl_id, &key.encoding_size, &encoding_buf) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, FAIL, "Couldn't read SOHM message in list")
+
+            key.encoding = encoding_buf;
+
+            /* Insert the message into the B-tree */
+            if(H5B2_insert(bt2, dxpl_id, &key) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "couldn't add SOHM to B-tree")
+
+            /* Free buffer from H5SM_read_mesg */
+            if(encoding_buf)
+                encoding_buf = H5MM_xfree(encoding_buf);
+        } /* end if */
+    } /* end for */
+
+    /* Unprotect list in cache and release heap */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to release SOHM list")
+    *_list = list = NULL;
+
+    /* Delete the old list index (but not its heap, which the new index is
+     * still using!)
+     */
+    num_messages = header->num_messages;        /* preserve this across the index deletion */
+    if(H5SM_delete_index(f, header, dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "can't free list index")
+
+    /* Set/restore header info */
+    header->index_addr = tree_addr;
+    header->index_type = H5SM_BTREE;
+    header->num_messages = num_messages;
+
+done:
+    /* Release resources */
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+    if(encoding_buf)
+        encoding_buf = H5MM_xfree(encoding_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5SM_convert_list_to_btree() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_convert_btree_to_list
+ *
+ * Purpose:     Given a B-tree index, turns it into a list index.  This is
+ *              done when too many messages are deleted from the B-tree.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, January 4, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_id)
+{
+    H5SM_list_t     *list = NULL;
+    H5SM_list_cache_ud_t cache_udata;   /* User-data for metadata cache callback */
+    haddr_t          btree_addr;
+    herr_t           ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Remember the address of the old B-tree, but change the header over to be
+     * a list..
+     */
+    btree_addr = header->index_addr;
+
+    header->num_messages = 0;
+    header->index_type = H5SM_LIST;
+
+    /* Create a new list index */
+    if(HADDR_UNDEF == (header->index_addr = H5SM_create_list(f, header, dxpl_id)))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create shared message list")
+
+    /* Set up user data for metadata cache callback */
+    cache_udata.f = f;
+    cache_udata.header = header;
+
+    /* Protect the SOHM list */
+    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC_WRITE)))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM list index")
+
+    /* Delete the B-tree and have messages copy themselves to the
+     * list as they're deleted
+     */
+    if(H5B2_delete(f, dxpl_id, btree_addr, f, H5SM_bt2_convert_to_list_op, list) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to delete B-tree")
+
+done:
+    /* Release the SOHM list from the cache */
+    if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to unprotect SOHM index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_convert_btree_to_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_can_share_common
+ *
+ * Purpose:     "trivial" checks for determining if a message can be shared.
+ *
+ * Note:	These checks are common to the "can share" and "try share"
+ *		routines and are the "fast" checks before we need to protect
+ *		the SOHM master table.
+ *
+ * Return:      TRUE if message could be a SOHM
+ *              FALSE if this message couldn't be a SOHM
+ *              Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, February 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5SM_can_share_common(const H5F_t *f, unsigned type_id, const void *mesg)
+{
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check whether this message ought to be shared or not */
+    /* If sharing is disabled in this file, don't share the message */
+    if(!H5F_addr_defined(H5F_SOHM_ADDR(f)))
+        HGOTO_DONE(FALSE)
+
+    /* Type-specific check */
+    if((ret_value = H5O_msg_can_share(type_id, mesg)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "can_share callback returned error")
+    if(ret_value == FALSE)
+        HGOTO_DONE(FALSE)
+
+    /* At this point, the message passes the "trivial" checks and is worth
+     *  further checks.
+     */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_can_share_common() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_can_share
+ *
+ * Purpose:     Checks if an object header message would be shared or is
+ *		already shared.
+ *
+ *              If not, returns FALSE and does nothing.
+ *
+ * Return:      TRUE if message will be a SOHM
+ *              FALSE if this message won't be a SOHM
+ *              Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, February 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table,
+    ssize_t *sohm_index_num, unsigned type_id, const void *mesg)
+{
+    size_t              mesg_size;
+    H5SM_master_table_t *my_table = NULL;
+    ssize_t             index_num;
+    htri_t              tri_ret;
+    htri_t              ret_value = TRUE;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* "trivial" sharing checks */
+    if((tri_ret = H5SM_can_share_common(f, type_id, mesg)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "'trivial' sharing checks returned error")
+    if(tri_ret == FALSE)
+        HGOTO_DONE(FALSE)
+
+    /* Look up the master SOHM table */
+    /* (use incoming master SOHM table if possible) */
+    if(table)
+        my_table = table;
+    else {
+        H5SM_table_cache_ud_t cache_udata;      /* User-data for callback */
+
+        /* Set up user data for callback */
+        cache_udata.f = f;
+
+        if(NULL == (my_table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+    } /* end if */
+
+    /* Find the right index for this message type.  If there is no such index
+     * then this type of message isn't shareable
+     */
+    if((index_num = H5SM_get_index(my_table, type_id)) < 0) {
+        H5E_clear_stack(NULL); /*ignore error*/
+        HGOTO_DONE(FALSE)
+    } /* end if */
+
+    /* If the message isn't big enough, don't bother sharing it */
+    if(0 == (mesg_size = H5O_msg_raw_size(f, type_id, TRUE, mesg)))
+        HGOTO_ERROR(H5E_SOHM, H5E_BADMESG, FAIL, "unable to get OH message size")
+    if(mesg_size < my_table->indexes[index_num].min_mesg_size)
+        HGOTO_DONE(FALSE)
+
+    /* At this point, the message will be shared, set the index number if requested. */
+    if(sohm_index_num)
+        *sohm_index_num = index_num;
+
+done:
+    /* Release the master SOHM table, if we protected it */
+    if(my_table && my_table != table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), my_table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_can_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_try_share
+ *
+ * Purpose:     Attempts to share an object header message.
+ *
+ *              MESG_LOC is an H5O_mesg_loc_t struct that gives the message's
+ *              location in an object header (address and index).  This
+ *              function sets the type_id in MESG_LOC.
+ *              If MESG_LOC is not NULL, this message will be "unique but
+ *              shareable" and will be entered in the index but not actually
+ *              shared.  If it is NULL, this message will be fully shared if
+ *              it is shareable at all.
+ *
+ *              OPEN_OH is the object header that is currently open and
+ *              protected.  If NULL, the SM module will protect any object
+ *              header it needs (which can cause an error if that OH is
+ *              already protected!).
+ *
+ *              DEFER_FLAGS indicates whether the sharing operation should
+ *              actually occur, or whether this is just a set up call for a
+ *              future sharing operation.  In the latter case this argument
+ *              should be H5SM_DEFER.  If the message was previously deferred
+ *              this argument should be H5SM_WAS_DEFERRED.
+ *
+ *              MESG_FLAGS will have the H5O_MSG_FLAG_SHAREABLE or
+ *              H5O_MSG_FLAG_SHARED flag set if one is appropriate.  This is
+ *              the only way to tell the difference between a message that
+ *              has just been fully shared and a message that is only
+ *              "shareable" and is still in the object header, so it cannot
+ *              be NULL if MESG_LOC is not NULL.  If MESG_LOC is NULL, then
+ *              the message won't be "unique but shareable" and MESG_FLAGS
+ *              can be NULL as well.
+ *
+ *              If the message should be shared (if sharing has been
+ *              enabled and this message qualifies), this function turns the
+ *              message into a shared message, sets the H5O_MSG_FLAG_SHARED
+ *              flag in mesg_flags, and returns TRUE.
+ *
+ *              If the message isn't shared, returns FALSE.  If the message
+ *              isn't shared but was entered in the shared message index,
+ *              the H5O_MSG_FLAG_SHAREABLE flag will be set in mesg_flags
+ *              and returns TRUE.
+ *
+ *              If this message was already shared, increments its reference
+ *              count, and leaves it otherwise unchanged, returning TRUE and
+ *              setting the H5O_MSG_FLAG_SHARED flag in mesg_flags.
+ *
+ *              If mesg_flags is NULL, the calling function should just look
+ *              at the return value to determine if the message was shared
+ *              or not.  Such messages should never be "unique but shareable."
+ *
+ * Return:      TRUE if message is now a SOHM
+ *              FALSE if this message is not a SOHM
+ *              Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned defer_flags,
+    unsigned type_id, void *mesg, unsigned *mesg_flags)
+{
+    H5SM_master_table_t *table = NULL;
+    H5SM_table_cache_ud_t cache_udata;      /* User-data for callback */
+    unsigned            cache_flags = H5AC__NO_FLAGS_SET;
+    ssize_t             index_num;
+    htri_t              tri_ret;
+#ifndef NDEBUG
+    unsigned            deferred_type = -1u;
+#endif
+    htri_t              ret_value = TRUE;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* If we previously deferred this operation, the saved message type should
+     * be the same as the one we get here.  In debug mode, we make sure this
+     * holds true; otherwise we can leave now if it wasn't shared in the DEFER
+     * pass. */
+    if(defer_flags & H5SM_WAS_DEFERRED)
+#ifndef NDEBUG
+        deferred_type = ((H5O_shared_t *)mesg)->type;
+#else /* NDEBUG */
+        if((((H5O_shared_t *)mesg)->type != H5O_SHARE_TYPE_HERE)
+                && (((H5O_shared_t *)mesg)->type != H5O_SHARE_TYPE_SOHM))
+            HGOTO_DONE(FALSE);
+#endif /* NDEBUG */
+
+    /* "trivial" sharing checks */
+    if(mesg_flags && (*mesg_flags & H5O_MSG_FLAG_DONTSHARE))
+        HGOTO_DONE(FALSE)
+    if((tri_ret = H5SM_can_share_common(f, type_id, mesg)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "'trivial' sharing checks returned error")
+    if(tri_ret == FALSE)
+        HGOTO_DONE(FALSE)
+
+    /* Set up user data for callback */
+    cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* "complex" sharing checks */
+    if((tri_ret = H5SM_can_share(f, dxpl_id, table, &index_num, type_id, mesg)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "'complex' sharing checks returned error")
+    if(tri_ret == FALSE)
+        HGOTO_DONE(FALSE)
+
+    /* At this point, the message will be shared. */
+
+    /* If the index hasn't been allocated yet, create it */
+    if(table->indexes[index_num].index_addr == HADDR_UNDEF) {
+        if(H5SM_create_index(f, &(table->indexes[index_num]), dxpl_id) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create SOHM index")
+        cache_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+
+    /* Write the message as a shared message.  This may or may not cause the
+     * message to become shared (if it is unique, it will not be shared).
+     */
+    if(H5SM_write_mesg(f, dxpl_id, open_oh, &(table->indexes[index_num]),
+            (defer_flags & H5SM_DEFER) != 0, type_id, mesg, &cache_flags) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "can't write shared message")
+
+    /* Set flags if this message was "written" without error and wasn't a
+     * 'defer' attempt; it is now either fully shared or "shareable".
+     */
+    if(mesg_flags) {
+        if(((H5O_shared_t *)mesg)->type == H5O_SHARE_TYPE_HERE)
+            *mesg_flags |= H5O_MSG_FLAG_SHAREABLE;
+        else {
+            HDassert(((H5O_shared_t *)mesg)->type == H5O_SHARE_TYPE_SOHM);
+            *mesg_flags |= H5O_MSG_FLAG_SHARED;
+        } /* end else */
+    } /* end if */
+
+done:
+    HDassert((ret_value != TRUE)
+            || ((H5O_shared_t *)mesg)->type == H5O_SHARE_TYPE_HERE
+            || ((H5O_shared_t *)mesg)->type == H5O_SHARE_TYPE_SOHM);
+#ifndef NDEBUG
+    /* If we previously deferred this operation, make sure the saved message
+     * type is the same as the one we get here. */
+    if(defer_flags & H5SM_WAS_DEFERRED)
+        HDassert(deferred_type == ((H5O_shared_t *)mesg)->type);
+#endif /* NDEBUG */
+
+    /* Release the master SOHM table */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, cache_flags) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_try_share() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_incr_ref
+ *
+ * Purpose:	Increment the reference count for a SOHM message and return
+ *              the message's heap ID.
+ *
+ *              The message pointer is actually returned via op_data, which
+ *              should be a pointer to a H5SM_fheap_id_t.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_incr_ref(void *record, void *_op_data, hbool_t *changed)
+{
+    H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+    H5SM_incr_ref_opdata *op_data = (H5SM_incr_ref_opdata *) _op_data;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(record);
+    HDassert(op_data);
+    HDassert(changed);
+
+    /* If the message was previously shared in an object header, share
+     * it in the heap now.
+     */
+    if(message->location == H5SM_IN_OH) {
+        HDassert(op_data->key && op_data->key->fheap);
+
+        /* Put the message in the heap and record its new heap ID */
+        if(H5HF_insert(op_data->key->fheap, op_data->dxpl_id, op_data->key->encoding_size, op_data->key->encoding, &message->u.heap_loc.fheap_id) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to insert message into fractal heap")
+
+        message->location = H5SM_IN_HEAP;
+        message->u.heap_loc.ref_count = 2;
+    } /* end if */
+    else {
+        HDassert(message->location == H5SM_IN_HEAP);
+        /* If it's already in the heap, just increment the ref count */
+        ++message->u.heap_loc.ref_count;
+    } /* end else */
+
+    /* If we got here, the message has changed */
+    *changed = TRUE;
+
+    /* Check for retrieving the heap ID */
+    if(op_data)
+       op_data->fheap_id = message->u.heap_loc.fheap_id;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_incr_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_write_mesg
+ *
+ * Purpose:     This routine adds a shareable message to an index.
+ *              The behavior is controlled by the DEFER parameter:
+ *
+ *              If DEFER is TRUE, this routine Simulates adding a shareable
+ *              message to an index.  It determines what the outcome would
+ *              be with DEFER set the FALSE and updates the shared message
+ *              info, but does not actually add the message to a heap, list,
+ *              or b-tree.  Assumes that an open object header will be
+ *              available when H5SM_write_mesg is called with DEFER set to
+ *              FALSE.
+ *
+ *              If DEFER is FALSE, this routine adds a shareable message to
+ *              an index.  If this is the first such message and we have an
+ *              object header location for this message, we record it in the
+ *              index but don't modify the message passed in.  If the message
+ *              is already in the index or we don't have an object header
+ *              location for it, it is shared in the heap and this function
+ *              sets its sharing struct to reflect this.
+ *
+ *              The index could be a list or a B-tree.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    H5SM_index_header_t *header, hbool_t defer, unsigned type_id, void *mesg,
+    unsigned *cache_flags_ptr)
+{
+    H5SM_list_t           *list = NULL;     /* List index */
+    H5SM_mesg_key_t       key;              /* Key used to search the index */
+    H5SM_list_cache_ud_t cache_udata;   /* User-data for metadata cache callback */
+    H5O_shared_t          shared;           /* Shared H5O message */
+    hbool_t               found = FALSE;    /* Was the message in the index? */
+    H5HF_t                *fheap = NULL;    /* Fractal heap handle */
+    H5B2_t                *bt2 = NULL;      /* v2 B-tree handle for index */
+    size_t                buf_size;         /* Size of the encoded message */
+    void *                encoding_buf = NULL; /* Buffer for encoded message */
+    size_t                empty_pos = UFAIL; /* Empty entry in list */
+    herr_t                ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(header);
+    HDassert(header->index_type != H5SM_BADTYPE);
+    HDassert(cache_flags_ptr);
+
+    /* Encode the message to be written */
+    if((buf_size = H5O_msg_raw_size(f, type_id, TRUE, mesg)) == 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_BADSIZE, FAIL, "can't find message size")
+    if(NULL == (encoding_buf = H5MM_malloc(buf_size)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "can't allocate buffer for encoding")
+    if(H5O_msg_encode(f, type_id, TRUE, (unsigned char *)encoding_buf, mesg) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTENCODE, FAIL, "can't encode message to be shared")
+
+    /* Open the fractal heap for this index */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Set up a key for the message to be written */
+    key.dxpl_id = dxpl_id;
+    key.file = f;
+    key.fheap = fheap;
+    key.encoding = encoding_buf;
+    key.encoding_size = buf_size;
+    key.message.hash = H5_checksum_lookup3(encoding_buf, buf_size, type_id);
+    key.message.location = H5SM_NO_LOC;
+
+    /* Assume the message is already in the index and try to increment its
+     * reference count.  If this fails, the message isn't in the index after
+     * all and we'll need to add it.
+     */
+    if(header->index_type == H5SM_LIST) {
+        size_t list_pos;        /* Position in a list index */
+
+        /* Set up user data for metadata cache callback */
+        cache_udata.f = f;
+        cache_udata.header = header;
+
+        /* The index is a list; get it from the cache */
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, defer ? H5AC_READ : H5AC_WRITE)))
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
+
+        /* See if the message is already in the index and get its location.
+         * Also record the first empty list position we find in case we need it
+         * later.
+         */
+        if(H5SM_find_in_list(list, &key, &empty_pos, &list_pos) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to search for message in list")
+
+        if(defer) {
+            if(list_pos != UFAIL)
+                found = TRUE;
+        } /* end if */
+        else {
+            if(list_pos != UFAIL) {
+                /* If the message was previously shared in an object header, share
+                 * it in the heap now.
+                 */
+                if(list->messages[list_pos].location == H5SM_IN_OH) {
+                    /* Put the message in the heap and record its new heap ID */
+                    if(H5HF_insert(fheap, dxpl_id, key.encoding_size, key.encoding, &shared.u.heap_id) < 0)
+                        HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to insert message into fractal heap")
+
+                    list->messages[list_pos].location = H5SM_IN_HEAP;
+                    list->messages[list_pos].u.heap_loc.fheap_id = shared.u.heap_id;
+                    list->messages[list_pos].u.heap_loc.ref_count = 2;
+                } /* end if */
+                else {
+                    /* If the message was already in the heap, increase its ref count */
+                    HDassert(list->messages[list_pos].location == H5SM_IN_HEAP);
+                    ++(list->messages[list_pos].u.heap_loc.ref_count);
+                } /* end else */
+
+                /* Set up the shared location to point to the shared location */
+                shared.u.heap_id = list->messages[list_pos].u.heap_loc.fheap_id;
+                found = TRUE;
+            } /* end if */
+        } /* end else */
+    } /* end if */
+    /* Index is a B-tree */
+    else {
+        HDassert(header->index_type == H5SM_BTREE);
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, header->index_addr, f)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+
+        if(defer) {
+            htri_t bt2_find;  /* Result from searching in the v2 B-tree */
+
+            /* If this returns 0, it means that the message wasn't found. */
+            /* If it return 1, set the heap_id in the shared struct.  It will
+             * return a heap ID, since a message with a reference count greater
+             * than 1 is always shared in the heap.
+             */
+            if((bt2_find = H5B2_find(bt2, dxpl_id, &key, NULL, NULL)) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "can't search for message in index")
+            found = (hbool_t)bt2_find;
+        } /* end if */
+        else {
+            H5SM_incr_ref_opdata op_data;
+
+            /* Set up callback info */
+            op_data.key = &key;
+            op_data.dxpl_id = dxpl_id;
+
+            /* If this returns failure, it means that the message wasn't found. */
+            /* If it succeeds, set the heap_id in the shared struct.  It will
+             * return a heap ID, since a message with a reference count greater
+             * than 1 is always shared in the heap.
+             */
+            if(H5B2_modify(bt2, dxpl_id, &key, H5SM_incr_ref, &op_data) >= 0) {
+                shared.u.heap_id = op_data.fheap_id;
+                found = TRUE;
+            } /* end if */
+            else
+                H5E_clear_stack(NULL); /*ignore error*/
+        } /* end else */
+    } /* end else */
+
+    if(found)
+        /* If the message was found, it's shared in the heap (now).  Set up a
+         * shared message so we can mark it as shared.
+         */
+        shared.type = H5O_SHARE_TYPE_SOHM;
+    else {
+        htri_t share_in_ohdr;           /* Whether the new message can be shared in another object's header */
+
+        /* Add the message to the index */
+
+        /* Check if the message can be shared in another object's header */
+        if((share_in_ohdr = H5O_msg_can_share_in_ohdr(type_id)) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_BADTYPE, FAIL, "'share in ohdr' check returned error")
+
+        /* If this message can be shared in an object header location, it is
+         *      "shareable" but not shared in the heap.
+         *
+         * If 'defer' flag is set:
+         *      We will insert it in the index but not modify the original
+         *              message.
+         *      If it can't be shared in an object header location, we will
+         *              insert it in the heap.  Note that we will only share
+         *              the message in the object header if there is an
+         *              "open_oh" available.
+         *
+         * If 'defer' flag is not set:
+         *      Insert it in the index but don't modify the original message.
+         *      If it can't be shared in an object header location or there's
+         *              no object header location available, insert it in the
+         *              heap.
+         */
+        if(share_in_ohdr && open_oh) {
+            /* Set up shared component info */
+            shared.type = H5O_SHARE_TYPE_HERE;
+
+            /* Retrieve any creation index from the native message */
+            if(H5O_msg_get_crt_index(type_id, mesg, &shared.u.loc.index) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "unable to retrieve creation index")
+
+            if(defer)
+                shared.u.loc.oh_addr = HADDR_UNDEF;
+            else {
+                shared.u.loc.oh_addr = H5O_OH_GET_ADDR(open_oh);
+
+                /* Copy shared component info into key for inserting into index */
+                key.message.location = H5SM_IN_OH;
+                key.message.u.mesg_loc = shared.u.loc;
+            } /* end else */
+        } /* end if */
+        else {
+            /* Set up shared component info */
+            /* (heap ID set below, if not deferred) */
+            shared.type = H5O_SHARE_TYPE_SOHM;
+
+            if(!defer) {
+                /* Put the message in the heap and record its new heap ID */
+                if(H5HF_insert(fheap, dxpl_id, key.encoding_size, key.encoding, &shared.u.heap_id) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to insert message into fractal heap")
+
+                key.message.location = H5SM_IN_HEAP;
+                key.message.u.heap_loc.fheap_id = shared.u.heap_id;
+                key.message.u.heap_loc.ref_count = 1;
+            } /* end if */
+        } /* end else */
+
+        if(!defer) {
+            /* Set common information */
+            key.message.msg_type_id = type_id;
+
+            /* Check whether the list has grown enough that it needs to become a B-tree */
+            if(header->index_type == H5SM_LIST && header->num_messages >= header->list_max)
+                if(H5SM_convert_list_to_btree(f, header, &list, fheap, open_oh, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to convert list to B-tree")
+
+            /* Insert the new message into the SOHM index */
+            if(header->index_type == H5SM_LIST) {
+                /* Index is a list.  Find an empty spot if we haven't already */
+                if(empty_pos == UFAIL) {
+                    size_t pos;
+
+                    if(H5SM_find_in_list(list, NULL, &empty_pos, &pos) < 0)
+                        HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to search for message in list")
+
+                    if(pos == UFAIL || empty_pos == UFAIL)
+                        HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "unable to find empty entry in list")
+                }
+                /* Insert message into list */
+                HDassert(list->messages[empty_pos].location == H5SM_NO_LOC);
+                HDassert(key.message.location != H5SM_NO_LOC);
+                list->messages[empty_pos] = key.message;
+            } /* end if */
+            /* Index is a B-tree */
+            else {
+                HDassert(header->index_type == H5SM_BTREE);
+
+                /* Open the index v2 B-tree, if it isn't already */
+                if(NULL == bt2) {
+                    if(NULL == (bt2 = H5B2_open(f, dxpl_id, header->index_addr, f)))
+                        HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+                } /* end if */
+
+                if(H5B2_insert(bt2, dxpl_id, &key) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTINSERT, FAIL, "couldn't add SOHM to B-tree")
+            } /* end else */
+
+            ++(header->num_messages);
+            (*cache_flags_ptr) |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+    } /* end else */
+
+    /* Set the file pointer & message type for the shared component */
+    shared.file = f;
+    shared.msg_type_id = type_id;
+
+    /* Update the original message's shared component */
+    if(H5O_msg_set_share(type_id, &shared, mesg) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADMESG, FAIL, "unable to set sharing information")
+
+done:
+    /* Release the fractal heap & v2 B-tree if we opened them */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+
+    /* If we got a list out of the cache, release it (it is always dirty after writing a message) */
+    if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, defer ? H5AC__NO_FLAGS_SET : H5AC__DIRTIED_FLAG) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+
+    if(encoding_buf)
+        encoding_buf = H5MM_xfree(encoding_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_write_mesg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_delete
+ *
+ * Purpose:     Given an object header message that is being deleted,
+ *              checks if it is a SOHM.  If so, decrements its reference
+ *              count.
+ *
+ *              If an object header is currently protected, it needs to
+ *              be passed in as open_oh so the SM code doesn't try to
+ *              re-protect it.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg)
+{
+    H5SM_master_table_t  *table = NULL;
+    unsigned              cache_flags = H5AC__NO_FLAGS_SET;
+    H5SM_table_cache_ud_t cache_udata;      /* User-data for callback */
+    ssize_t               index_num;
+    void                 *mesg_buf = NULL;
+    void                 *native_mesg = NULL;
+    unsigned              type_id;              /* Message type ID to operate on */
+    herr_t                ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(H5F_addr_defined(H5F_SOHM_ADDR(f)));
+    HDassert(sh_mesg);
+
+    /* Get message type */
+    type_id = sh_mesg->msg_type_id;
+
+    /* Set up user data for callback */
+    cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_WRITE)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* Find the correct index and try to delete from it */
+    if((index_num = H5SM_get_index(table, type_id)) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to find correct SOHM index")
+
+    /* If mesg_buf is not NULL, the message's reference count has reached
+     * zero and any file space it uses needs to be freed.  mesg_buf holds the
+     * serialized form of the message.
+     */
+    if(H5SM_delete_from_index(f, dxpl_id, open_oh, &(table->indexes[index_num]), sh_mesg, &cache_flags, &mesg_buf) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to delete mesage from SOHM index")
+
+    /* Release the master SOHM table */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, cache_flags) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+    table = NULL;
+
+    /* If buf was allocated, delete the message it holds.  This message may
+     * reference other shared messages that also need to be deleted, so the
+     * master table needs to be unprotected when we do this.
+     */
+    if(mesg_buf) {
+        if(NULL == (native_mesg = H5O_msg_decode(f, dxpl_id, open_oh, type_id, (const unsigned char *)mesg_buf)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTDECODE, FAIL, "can't decode shared message.")
+
+        if(H5O_msg_delete(f, dxpl_id, open_oh, type_id, native_mesg) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "can't delete shared message.")
+    } /* end if */
+
+done:
+    /* Release the master SOHM table (should only happen on error) */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, cache_flags) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    /* Release any native message we decoded */
+    if(native_mesg)
+        H5O_msg_free(type_id, native_mesg);
+
+    /* Free encoding buf */
+    if(mesg_buf)
+        mesg_buf = H5MM_xfree(mesg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_find_in_list
+ *
+ * Purpose:     Find a message's location in a list.  Also find the first
+ *              empty location in the list (since if we don't find the
+ *              message, we may want to insert it into an open spot).
+ *
+ *              If KEY is NULL, simply find the first empty location in the
+ *              list.
+ *
+ *              If EMPTY_POS is NULL, don't store anything in it.
+ *
+ * Return:      Message's position in the list on success
+ *              UFAIL if message couldn't be found
+ *              empty_pos set to position of empty message or UFAIL.
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_find_in_list(const H5SM_list_t *list, const H5SM_mesg_key_t *key, size_t *empty_pos, size_t *pos)
+{
+    size_t x;
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(list);
+    /* Both key and empty_pos can be NULL, but not both! */
+    HDassert(key || empty_pos);
+
+    /* Initialize empty_pos to an invalid value */
+    if(empty_pos)
+        *empty_pos = UFAIL;
+
+    /* Find the first (only) message equal to the key passed in.
+     * Also record the first empty position we find.
+     */
+    for(x = 0; x < list->header->list_max; x++) {
+        if(list->messages[x].location != H5SM_NO_LOC) {
+            int cmp;
+
+            if(H5SM_message_compare(key, &(list->messages[x]), &cmp) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTCOMPARE, FAIL, "can't compare message records")
+
+            if(0 == cmp) {
+                *pos = x;
+                HGOTO_DONE(SUCCEED)
+            }
+        }
+        else if(empty_pos && list->messages[x].location == H5SM_NO_LOC) {
+            /* Note position */
+            *empty_pos = x;
+
+            /* Found earlier position possible, don't check any more */
+            empty_pos = NULL;
+        } /* end if */
+    } /* end for */
+
+    /* If we reached this point, we didn't find the message */
+    *pos = UFAIL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_find_in_list */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_get_hash_fh_cb
+ *
+ * Purpose:	Callback for fractal heap operator, to make copy of link when
+ *              when lookup up a link by index
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov  7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_hash_fh_cb(const void *obj, size_t obj_len, void *_udata)
+{
+    H5SM_fh_ud_gh_t *udata = (H5SM_fh_ud_gh_t *)_udata;       /* User data for fractal heap 'op' callback */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Compute hash value on raw message */
+    udata->hash = H5_checksum_lookup3(obj, obj_len, udata->type_id);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_get_hash_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_decr_ref
+ *
+ * Purpose:	Decrement the reference count for a SOHM message.  Doesn't
+ *              remove the record from the B-tree even if the refcount
+ *              reaches zero.
+ *
+ *              The new message is returned through op_data.  If its
+ *              reference count is zero, the calling function should
+ *              remove this record from the B-tree.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_decr_ref(void *record, void *op_data, hbool_t *changed)
+{
+    H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(record);
+    HDassert(op_data);
+    HDassert(changed);
+
+    /* Adjust the message's reference count if it's stored in the heap.
+     * Messages stored in object headers always have refcounts of 1,
+     * so the calling function should know to just delete such a message
+     */
+    if(message->location == H5SM_IN_HEAP) {
+        --message->u.heap_loc.ref_count;
+        *changed = TRUE;
+    } /* end if */
+
+    if(op_data)
+       *(H5SM_sohm_t *)op_data = *message;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_decr_ref() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_delete_from_index
+ *
+ * Purpose:     Decrement the reference count for a particular message in this
+ *              index.  If the reference count reaches zero, allocate a buffer
+ *              to hold the serialized form of this message so that any
+ *              resources it uses can be freed, and return this buffer in
+ *              ENCODED_MESG.
+ *
+ * Return:      Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Tuesday, May 2, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    H5SM_index_header_t *header, const H5O_shared_t *mesg,
+    unsigned *cache_flags, void ** /*out*/ encoded_mesg)
+{
+    H5SM_list_t     *list = NULL;
+    H5SM_mesg_key_t key;
+    H5SM_sohm_t     message;            /* Deleted message returned from index */
+    H5SM_sohm_t    *message_ptr;        /* Pointer to deleted message returned from index */
+    H5HF_t         *fheap = NULL;       /* Fractal heap that contains the message */
+    H5B2_t         *bt2 = NULL;         /* v2 B-tree handle for index */
+    size_t          buf_size;           /* Size of the encoded message (out) */
+    void            *encoding_buf = NULL; /* The encoded message (out) */
+    unsigned        type_id;            /* Message type to operate on */
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(header);
+    HDassert(mesg);
+    HDassert(cache_flags);
+    HDassert(*encoded_mesg == NULL);
+
+    /* Get the message type for later */
+    type_id = mesg->msg_type_id;
+
+    /* Open the heap for this type of message. */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Get the message size and encoded message for the message to be deleted,
+     * either from its OH or from the heap.
+     */
+    if(mesg->type == H5O_SHARE_TYPE_HERE) {
+        key.message.location = H5SM_IN_OH;
+        key.message.msg_type_id = type_id;
+        key.message.u.mesg_loc = mesg->u.loc;
+    } /* end if */
+    else {
+        key.message.location = H5SM_IN_HEAP;
+        key.message.msg_type_id = type_id;
+        key.message.u.heap_loc.ref_count = 0; /* Refcount isn't relevant here */
+        key.message.u.heap_loc.fheap_id = mesg->u.heap_id;
+    } /* end else */
+
+    /* Get the encoded message */
+    if(H5SM_read_mesg(f, &key.message, fheap, open_oh, dxpl_id, &buf_size, &encoding_buf) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Set up key for message to be deleted. */
+    key.file = f;
+    key.dxpl_id = dxpl_id;
+    key.fheap = fheap;
+    key.encoding = encoding_buf;
+    key.encoding_size = buf_size;
+    key.message.hash = H5_checksum_lookup3(encoding_buf, buf_size, type_id);
+
+    /* Try to find the message in the index */
+    if(header->index_type == H5SM_LIST) {
+        H5SM_list_cache_ud_t cache_udata;   /* User-data for metadata cache callback */
+        size_t list_pos;        /* Position of the message in the list */
+
+        /* Set up user data for metadata cache callback */
+        cache_udata.f = f;
+        cache_udata.header = header;
+
+        /* If the index is stored as a list, get it from the cache */
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC_WRITE)))
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
+
+        /* Find the message in the list */
+        if(H5SM_find_in_list(list, &key, NULL, &list_pos) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to search for message in list")
+        if(list_pos == UFAIL)
+	    HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+
+        if(list->messages[list_pos].location == H5SM_IN_HEAP)
+            --(list->messages[list_pos].u.heap_loc.ref_count);
+
+        /* Point to the message */
+        message_ptr = &list->messages[list_pos];
+    } /* end if */
+    else {
+        /* Index is a B-tree */
+        HDassert(header->index_type == H5SM_BTREE);
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, header->index_addr, f)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+
+        /* If this returns failure, it means that the message wasn't found.
+         * If it succeeds, a copy of the modified message will be returned.
+         */
+        if(H5B2_modify(bt2, dxpl_id, &key, H5SM_decr_ref, &message) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+
+        /* Point to the message */
+        message_ptr = &message;
+    } /* end else */
+
+    /* If the ref count is zero or this message was in an OH (which always
+     * has a ref count of 1) delete the message from the index
+     */
+    if(message_ptr->location == H5SM_IN_OH || message_ptr->u.heap_loc.ref_count == 0) {
+        /* Save the location */
+        H5SM_storage_loc_t old_loc = message_ptr->location;
+
+        /* Updated the index header, so set its dirty flag */
+        --header->num_messages;
+        *cache_flags |= H5AC__DIRTIED_FLAG;
+
+        /* Remove the message from the index */
+        if(header->index_type == H5SM_LIST)
+            message_ptr->location = H5SM_NO_LOC;
+        else {
+            /* Open the index v2 B-tree, if it isn't already */
+            if(NULL == bt2) {
+                if(NULL == (bt2 = H5B2_open(f, dxpl_id, header->index_addr, f)))
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+            } /* end if */
+
+            if(H5B2_remove(bt2, dxpl_id, &key, NULL, NULL) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTREMOVE, FAIL, "unable to delete message from index")
+        } /* end else */
+
+        /* Remove the message from the heap if it was stored in the heap*/
+        if(old_loc == H5SM_IN_HEAP)
+            if(H5HF_remove(fheap, dxpl_id, &(message_ptr->u.heap_loc.fheap_id)) < 0)
+	        HGOTO_ERROR(H5E_SOHM, H5E_CANTREMOVE, FAIL, "unable to remove message from heap")
+
+
+        /* Return the message's encoding so anything it references can be freed */
+        *encoded_mesg = encoding_buf;
+
+        /* If there are no messages left in the index, delete it */
+        if(header->num_messages == 0) {
+
+            /* Unprotect cache and release heap */
+            if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+	        HGOTO_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to release SOHM list")
+            list = NULL;
+
+            HDassert(fheap);
+            if(H5HF_close(fheap, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+            fheap = NULL;
+
+            /* Delete the index and its heap */
+            if(H5SM_delete_index(f, header, dxpl_id, TRUE) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "can't delete empty index")
+        }  /* end if */
+        else if(header->index_type == H5SM_BTREE && header->num_messages < header->btree_min) {
+            /* Otherwise, if we've just passed the btree-to-list cutoff, convert
+             * this B-tree into a list
+             */
+           if(H5SM_convert_btree_to_list(f, header, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to convert btree to list")
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the SOHM list */
+    if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+
+    /* Release the fractal heap & v2 B-tree if we opened them */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+
+    /* Free the message encoding, if we're not returning it in encoded_mesg
+     * or if there's been an error.
+     */
+    if(encoding_buf && (NULL == *encoded_mesg || ret_value < 0))
+        encoding_buf = H5MM_xfree(encoding_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_delete_from_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_get_info
+ *
+ * Purpose:     Get the shared message info for a file, if there is any.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, May 11, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id)
+{
+    H5F_t *f = ext_loc->file;           /* File pointer (convenience variable) */
+    H5O_shmesg_table_t sohm_table;      /* SOHM message from superblock extension */
+    H5SM_master_table_t *table = NULL;  /* SOHM master table */
+    unsigned tmp_sohm_nindexes;		/* Number of shared messages indexes in the table */
+    htri_t status;                      /* Status for message existing */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(ext_loc);
+    HDassert(f);
+    HDassert(fc_plist);
+
+    /* Check for the extension having a 'shared message info' message */
+    if((status = H5O_msg_exists(ext_loc, H5O_SHMESG_ID, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "unable to read object header")
+    if(status) {
+        H5SM_table_cache_ud_t cache_udata;      /* User-data for callback */
+        unsigned index_flags[H5O_SHMESG_MAX_NINDEXES];  /* Message flags for each index */
+        unsigned minsizes[H5O_SHMESG_MAX_NINDEXES];     /* Minimum message size for each index */
+        unsigned sohm_l2b;           /* SOHM list-to-btree cutoff */
+        unsigned sohm_b2l;           /* SOHM btree-to-list cutoff */
+        unsigned u;                  /* Local index variable */
+
+        /* Retrieve the 'shared message info' structure */
+        if(NULL == H5O_msg_read(ext_loc, H5O_SHMESG_ID, &sohm_table, dxpl_id))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "shared message info message not present")
+
+        /* Portably initialize the arrays */
+        HDmemset(index_flags, 0, sizeof(index_flags));
+        HDmemset(minsizes, 0, sizeof(minsizes));
+
+        /* Set SOHM info from file */
+        H5F_SET_SOHM_ADDR(f, sohm_table.addr);
+        H5F_SET_SOHM_VERS(f, sohm_table.version);
+        H5F_SET_SOHM_NINDEXES(f, sohm_table.nindexes);
+        HDassert(H5F_addr_defined(H5F_SOHM_ADDR(f)));
+        HDassert(H5F_SOHM_NINDEXES(f) > 0 && H5F_SOHM_NINDEXES(f) <= H5O_SHMESG_MAX_NINDEXES);
+
+        /* Set up user data for callback */
+        cache_udata.f = f;
+
+        /* Read the rest of the SOHM table information from the cache */
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+        /* Get index conversion limits */
+        sohm_l2b = (unsigned)table->indexes[0].list_max;
+        sohm_b2l = (unsigned)table->indexes[0].btree_min;
+
+        /* Iterate through all indices */
+        for(u = 0; u < table->num_indexes; ++u) {
+            /* Pack information about the individual SOHM index */
+            index_flags[u] = table->indexes[u].mesg_types;
+            minsizes[u] = (unsigned)table->indexes[u].min_mesg_size;
+
+            /* Sanity check */
+            HDassert(sohm_l2b == table->indexes[u].list_max);
+            HDassert(sohm_b2l == table->indexes[u].btree_min);
+
+            /* Check for sharing attributes in this file, which means that creation
+             *  indices must be tracked on object header message in the file.
+             */
+            if(index_flags[u] & H5O_SHMESG_ATTR_FLAG)
+                H5F_SET_STORE_MSG_CRT_IDX(f, TRUE);
+        } /* end for */
+
+        /* Set values in the property list */
+        tmp_sohm_nindexes = H5F_SOHM_NINDEXES(f);
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_NINDEXES_NAME, &tmp_sohm_nindexes) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "can't set number of SOHM indexes")
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_INDEX_TYPES_NAME, index_flags) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "can't set type flags for indexes")
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, minsizes) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "can't set type flags for indexes")
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_LIST_MAX_NAME, &sohm_l2b) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't set SOHM cutoff in property list")
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_BTREE_MIN_NAME, &sohm_b2l) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't set SOHM cutoff in property list")
+    } /* end if */
+    else {
+        /* No SOHM info in file */
+        H5F_SET_SOHM_ADDR(f, HADDR_UNDEF);
+        H5F_SET_SOHM_VERS(f, 0);
+        H5F_SET_SOHM_NINDEXES(f, 0);
+
+        /* Shared object header messages are disabled */
+        tmp_sohm_nindexes = H5F_SOHM_NINDEXES(f);
+        if(H5P_set(fc_plist, H5F_CRT_SHMSG_NINDEXES_NAME, &tmp_sohm_nindexes) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "can't set number of SOHM indexes")
+    } /* end else */
+
+done:
+    /* Release the master SOHM table if we took it out of the cache */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_reconstitute
+ *
+ * Purpose:     Reconstitute a shared object header message structure from
+ *              a plain heap ID.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, December 18, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_reconstitute(H5O_shared_t *sh_mesg, H5F_t *f, unsigned msg_type_id,
+    H5O_fheap_id_t heap_id)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check args */
+    HDassert(sh_mesg);
+
+    /* Set flag for shared message */
+    sh_mesg->type = H5O_SHARE_TYPE_SOHM;
+    sh_mesg->file = f;
+    sh_mesg->msg_type_id = msg_type_id;
+    sh_mesg->u.heap_id = heap_id;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_reconstitute() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_get_refcount_bt2_cb
+ *
+ * Purpose:	v2 B-tree 'find' callback to retrieve the record for a message
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_get_refcount_bt2_cb(const void *_record, void *_op_data)
+{
+    const H5SM_sohm_t *record = (const H5SM_sohm_t *)_record;  /* v2 B-tree record for message */
+    H5SM_sohm_t *op_data = (H5SM_sohm_t *)_op_data;       /* "op data" from v2 B-tree find */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(record);
+    HDassert(op_data);
+
+    /* Make a copy of the record */
+    *op_data = *record;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_get_refcount_bt2_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_get_refcount
+ *
+ * Purpose:     Retrieve the reference count for a message shared in the heap
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, December 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+    const H5O_shared_t *sh_mesg, hsize_t *ref_count)
+{
+    H5HF_t *fheap = NULL;               /* Fractal heap that contains shared messages */
+    H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
+    H5SM_master_table_t *table = NULL;  /* SOHM master table */
+    H5SM_table_cache_ud_t tbl_cache_udata;  /* User-data for callback */
+    H5SM_list_t *list = NULL;           /* SOHM index list for message type (if in list form) */
+    H5SM_index_header_t *header=NULL;   /* Index header for message type */
+    H5SM_mesg_key_t key;                /* Key for looking up message */
+    H5SM_sohm_t message;                /* Shared message returned from callback */
+    ssize_t index_num;                  /* Table index for message type */
+    size_t buf_size;                    /* Size of the encoded message */
+    void * encoding_buf = NULL;         /* Buffer for encoded message */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(sh_mesg);
+    HDassert(ref_count);
+
+    /* Set up user data for callback */
+    tbl_cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &tbl_cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* Find the correct index and find the message in it */
+    if((index_num = H5SM_get_index(table, type_id)) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to find correct SOHM index")
+    header = &(table->indexes[index_num]);
+
+    /* Open the heap for this message type */
+    if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Set up a SOHM message to correspond to the shared message passed in */
+    key.message.location = H5SM_IN_HEAP;
+    key.message.u.heap_loc.fheap_id = sh_mesg->u.heap_id;
+    key.message.u.heap_loc.ref_count = 0; /* Ref count isn't needed to find message */
+
+    /* Get the encoded message */
+    if(H5SM_read_mesg(f, &key.message, fheap, NULL, dxpl_id, &buf_size, &encoding_buf) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+    /* Set up key for message to locate */
+    key.file = f;
+    key.dxpl_id = dxpl_id;
+    key.fheap = fheap;
+    key.encoding = encoding_buf;
+    key.encoding_size = buf_size;
+    key.message.hash = H5_checksum_lookup3(encoding_buf, buf_size, type_id);
+
+    /* Try to find the message in the index */
+    if(header->index_type == H5SM_LIST) {
+        H5SM_list_cache_ud_t lst_cache_udata;  /* User-data for metadata cache callback */
+        size_t list_pos;        /* Position of the message in the list */
+
+        /* Set up user data for metadata cache callback */
+        lst_cache_udata.f = f;
+        lst_cache_udata.header = header;
+
+        /* If the index is stored as a list, get it from the cache */
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &lst_cache_udata, H5AC_READ)))
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
+
+        /* Find the message in the list */
+        if(H5SM_find_in_list(list, &key, NULL, &list_pos) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to search for message in list")
+        if(list_pos == UFAIL)
+	    HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+
+        /* Copy the message */
+        message = list->messages[list_pos];
+    } /* end if */
+    else {
+        htri_t msg_exists;      /* Whether the message exists in the v2 B-tree */
+
+        /* Index is a B-tree */
+        HDassert(header->index_type == H5SM_BTREE);
+
+        /* Open the index v2 B-tree */
+        if(NULL == (bt2 = H5B2_open(f, dxpl_id, header->index_addr, f)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+
+        /* Look up the message in the v2 B-tree */
+        if((msg_exists = H5B2_find(bt2, dxpl_id, &key, H5SM_get_refcount_bt2_cb, &message)) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "error finding message in index")
+        if(!msg_exists)
+	    HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+    } /* end else */
+
+    /* Set the refcount for the message */
+    HDassert(message.location == H5SM_IN_HEAP);
+    *ref_count = message.u.heap_loc.ref_count;
+
+done:
+    /* Release resources */
+    if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+    if(encoding_buf)
+        encoding_buf = H5MM_xfree(encoding_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_refcount() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_read_iter_op
+ *
+ * Purpose:	OH iteration callback to get the encoded version of a message
+ *              by index.
+ *
+ *              The buffer needs to be freed.
+ *
+ * Return:	0 if this is not the message we're searching for
+ *              1 if this is the message we're searching for (with encoded
+ *                      value returned in udata)
+ *              negative on error
+ *
+ * Programmer:	James Laird
+ *              Wednesday, February 21, 2006
+ *
+ * Modifications:
+ *      Vailin Choi; September 2011
+ *      Change "oh_modified" from boolean to unsigned
+ *      (See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_read_iter_op(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
+    unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5SM_read_udata_t *udata = (H5SM_read_udata_t *) _udata;
+    herr_t ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(udata);
+    HDassert(NULL == udata->encoding_buf);
+
+    /* Check the creation index for this message */
+    if(sequence == udata->idx) {
+        /* Check if the message is dirty & flush it to the object header if so */
+        if(mesg->dirty)
+            if(H5O_msg_flush(udata->file, oh, mesg) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTENCODE, H5_ITER_ERROR, "unable to encode object header message")
+
+        /* Get the message's encoded size */
+        udata->buf_size = mesg->raw_size;
+        HDassert(udata->buf_size);
+
+        /* Allocate buffer to return the message in */
+        if(NULL == (udata->encoding_buf = H5MM_malloc(udata->buf_size)))
+            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed")
+
+        /* Copy the encoded message into the buffer to return */
+        HDmemcpy(udata->encoding_buf, mesg->raw, udata->buf_size);
+
+        /* Found the message we were looking for */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_read_iter_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_read_mesg_fh_cb
+ *
+ * Purpose:	Callback for H5HF_op, used in H5SM_read_mesg below.
+ *              Makes a copy of the message in the heap data, returned in the
+ *              UDATA struct.
+ *
+ * Return:	Negative on error, non-negative on success
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 26, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_read_mesg_fh_cb(const void *obj, size_t obj_len, void *_udata)
+{
+    H5SM_read_udata_t *udata = (H5SM_read_udata_t *)_udata;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate a buffer to hold the message */
+    if(NULL == (udata->encoding_buf = H5MM_malloc(obj_len)))
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Copy the message from the heap */
+    HDmemcpy(udata->encoding_buf, obj, obj_len);
+    udata->buf_size = obj_len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_read_mesg_fh_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_read_mesg
+ *
+ * Purpose:	Given an H5SM_sohm_t sohm, encodes the message into a buffer.
+ *              This buffer should then be freed.
+ *
+ * Return:	Non-negative on success/negative on error
+ *
+ * Programmer:	James Laird
+ *              Wednesday, February 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap,
+    H5O_t *open_oh, hid_t dxpl_id, size_t *encoding_size /*out*/,
+    void ** encoded_mesg /*out*/)
+{
+    H5SM_read_udata_t udata;    /* User data for callbacks */
+    H5O_loc_t oloc;             /* Object location for message in object header */
+    H5O_t *oh = NULL;           /* Object header for message in object header */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(fheap);
+
+    /* Set up user data for message iteration */
+    udata.file = f;
+    udata.idx = mesg->u.mesg_loc.index;
+    udata.encoding_buf = NULL;
+    udata.idx = 0;
+
+    /* Get the message size and encoded message for the message to be deleted,
+     * either from its OH or from the heap.
+     */
+    if(mesg->location == H5SM_IN_OH) {
+        /* Read message from object header */
+        const H5O_msg_class_t *type = NULL;    /* Actual H5O class type for the ID */
+        H5O_mesg_operator_t op;         /* Wrapper for operator */
+
+        type = H5O_msg_class_g[mesg->msg_type_id];    /* map the type ID to the actual type object */
+        HDassert(type);
+
+        /* Reset object location for operation */
+        if(H5O_loc_reset(&oloc) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTRESET, FAIL, "unable to initialize location")
+
+        if(NULL == open_oh || mesg->u.mesg_loc.oh_addr != H5O_OH_GET_ADDR(open_oh)) {
+            /* Open the object in the file */
+            oloc.file = f;
+            oloc.addr = mesg->u.mesg_loc.oh_addr;
+            if(H5O_open(&oloc) < 0)
+	        HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, FAIL, "unable to open object header")
+
+            /* Load the object header from the cache */
+            if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC_READ)))
+	        HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load object header")
+        } /* end if */
+        else
+            oh = open_oh;
+
+        /* Use the "real" iterate routine so it doesn't try to protect the OH */
+        op.op_type = H5O_MESG_OP_LIB;
+        op.u.lib_op = H5SM_read_iter_op;
+        if((ret_value = H5O_msg_iterate_real(f, oh, type, &op, &udata, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_BADITER, FAIL, "unable to iterate over object header messages")
+    } /* end if */
+    else {
+        HDassert(mesg->location == H5SM_IN_HEAP);
+
+        /* Copy the message from the heap */
+        if(H5HF_op(fheap, dxpl_id, &(mesg->u.heap_loc.fheap_id), H5SM_read_mesg_fh_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, FAIL, "can't read message from fractal heap.")
+    } /* end else */
+    HDassert(udata.encoding_buf);
+    HDassert(udata.buf_size);
+
+    /* Record the returned values */
+    *encoded_mesg = udata.encoding_buf;
+    *encoding_size = udata.buf_size;
+
+done:
+    /* Close the object header if we opened one and had an error */
+    if(oh && oh != open_oh) {
+        if(oh && H5O_unprotect(&oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+        if(H5O_close(&oloc) < 0)
+            HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "unable to close object header")
+    } /* end if */
+
+    /* Release the encoding buffer on error */
+    if(ret_value < 0 && udata.encoding_buf)
+        udata.encoding_buf = H5MM_xfree(udata.encoding_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_read_mesg */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_free
+ *
+ * Purpose:	Frees memory used by the SOHM table.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_table_free(H5SM_master_table_t *table)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(table);
+    HDassert(table->indexes);
+
+    table->indexes = H5FL_ARR_FREE(H5SM_index_header_t, table->indexes);
+
+    table = H5FL_FREE(H5SM_master_table_t, table);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_table_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_free
+ *
+ * Purpose:	Frees all memory used by the list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_list_free(H5SM_list_t *list)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(list);
+    HDassert(list->messages);
+
+    list->messages = H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
+
+    list = H5FL_FREE(H5SM_list_t, list);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_list_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_table_debug
+ *
+ * Purpose:     Print debugging information for the master table.
+ *
+ *              If table_vers and num_indexes are not UFAIL, they are used
+ *              instead of the values in the superblock.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, January 18, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr,
+                         FILE *stream, int indent, int fwidth,
+                         unsigned table_vers, unsigned num_indexes)
+{
+    H5SM_master_table_t *table = NULL;  /* SOHM master table */
+    H5SM_table_cache_ud_t cache_udata;  /* User-data for callback */
+    unsigned x;                         /* Counter variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(table_addr != HADDR_UNDEF);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* If table_vers and num_indexes are UFAIL, replace them with values from
+     * userblock
+     */
+    if(table_vers == UFAIL)
+        table_vers = H5F_SOHM_VERS(f);
+    else if(table_vers != H5F_SOHM_VERS(f))
+	HDfprintf(stream, "*** SOHM TABLE VERSION DOESN'T MATCH VERSION IN SUPERBLOCK!\n");
+    if(num_indexes == UFAIL)
+        num_indexes = H5F_SOHM_NINDEXES(f);
+    else if(num_indexes != H5F_SOHM_NINDEXES(f))
+	HDfprintf(stream, "*** NUMBER OF SOHM INDEXES DOESN'T MATCH VALUE IN SUPERBLOCK!\n");
+
+    /* Check arguments.  Version must be 0, the only version implemented so far */
+    if(table_vers > HDF5_SHAREDHEADER_VERSION)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "unknown shared message table version")
+    if(num_indexes == 0 || num_indexes > H5O_SHMESG_MAX_NINDEXES)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "number of indexes must be between 1 and H5O_SHMESG_MAX_NINDEXES")
+
+    /* Set up user data for callback */
+    cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    HDfprintf(stream, "%*sShared Message Master Table...\n", indent, "");
+    for(x = 0; x < num_indexes; ++x) {
+        HDfprintf(stream, "%*sIndex %d...\n", indent, "", x);
+        HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth,
+                "SOHM Index Type:",
+                (table->indexes[x].index_type == H5SM_LIST ? "List" :
+                (table->indexes[x].index_type == H5SM_BTREE ? "B-Tree" : "Unknown")));
+
+        HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", fwidth,
+                "Address of index:", table->indexes[x].index_addr);
+        HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", fwidth,
+                "Address of index's heap:", table->indexes[x].heap_addr);
+        HDfprintf(stream, "%*s%-*s 0x%08x\n", indent + 3, "", fwidth,
+                "Message type flags:", table->indexes[x].mesg_types);
+        HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+                "Minimum size of messages:", table->indexes[x].min_mesg_size);
+        HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+                "Number of messages:", table->indexes[x].num_messages);
+        HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+                "Maximum list size:", table->indexes[x].list_max);
+        HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+                "Minimum B-tree size:", table->indexes[x].btree_min);
+    } /* end for */
+
+done:
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_table_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_list_debug
+ *
+ * Purpose:     Print debugging information for a SOHM list.
+ *
+ *              Relies on the list version and number of messages passed in.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  James Laird
+ *              Thursday, January 18, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
+                         FILE *stream, int indent, int fwidth,
+                         unsigned table_vers, size_t num_messages)
+{
+
+    H5SM_list_t *list = NULL;           /* SOHM index list for message type (if in list form) */
+    H5SM_index_header_t header;         /* A "false" header used to read the list */
+    H5SM_list_cache_ud_t cache_udata;   /* User-data for metadata cache callback */
+    unsigned x;                         /* Counter variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(list_addr != HADDR_UNDEF);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Check arguments.  Version must be 0, the only version implemented so far */
+    if(table_vers > H5SM_LIST_VERSION)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "unknown shared message list version")
+    if(num_messages == 0 || num_messages > H5O_SHMESG_MAX_LIST_SIZE)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "number of indexes must be between 1 and H5O_SHMESG_MAX_NINDEXES")
+
+    /* Create a temporary header using the arguments.  The cache needs this to load the list. */
+    HDmemset(&header, 0, sizeof(H5SM_index_header_t));
+    header.list_max = header.num_messages = num_messages;
+    header.index_type = H5SM_LIST;
+    header.index_addr = list_addr;
+
+    /* Set up user data for metadata cache callback */
+    cache_udata.f = f;
+    cache_udata.header = &header;
+
+    /* Get the list from the cache */
+    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
+
+    HDfprintf(stream, "%*sShared Message List Index...\n", indent, "");
+    for(x = 0; x < num_messages; ++x) {
+        HDfprintf(stream, "%*sShared Object Header Message %d...\n", indent, "", x);
+        HDfprintf(stream, "%*s%-*s %08lu\n", indent + 3, "", fwidth,
+                "Hash value:", (unsigned long)list->messages[x].hash);
+        if(list->messages[x].location == H5SM_IN_HEAP) {
+            HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth,
+                    "Location:", "in heap");
+            HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+                    "Heap ID:", list->messages[x].u.heap_loc.fheap_id);
+            HDfprintf(stream, "%*s%-*s %u\n", indent + 3, "", fwidth,
+                    "Reference count:", list->messages[x].u.heap_loc.ref_count);
+        } /* end if */
+        else if(list->messages[x].location == H5SM_IN_OH) {
+            HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth,
+                    "Location:", "in object header");
+            HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", fwidth,
+                    "Object header address:", list->messages[x].u.mesg_loc.oh_addr);
+            HDfprintf(stream, "%*s%-*s %u\n", indent + 3, "", fwidth,
+                    "Message creation index:", list->messages[x].u.mesg_loc.oh_addr);
+            HDfprintf(stream, "%*s%-*s %u\n", indent + 3, "", fwidth,
+                    "Message type ID:", list->messages[x].msg_type_id);
+        } /* end if */
+        else
+            HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth,
+                    "Location:", "invalid");
+    } /* end for */
+
+done:
+    if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, list, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_list_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_ih_size
+ *
+ * Purpose:     Loop through the master SOHM table (if there is one) to:
+ *			1. collect storage used for header
+ *                      1. collect storage used for B-tree and List
+ *			   (include btree storage used by huge objects in fractal heap)
+ *                      2. collect fractal heap storage
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              June 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo)
+{
+    H5SM_master_table_t *table = NULL;          /* SOHM master table */
+    H5SM_table_cache_ud_t cache_udata;          /* User-data for callback */
+    H5HF_t              *fheap = NULL;          /* Fractal heap handle */
+    H5B2_t              *bt2 = NULL;            /* v2 B-tree handle for index */
+    unsigned    	u;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(H5F_SOHM_ADDR(f)));
+    HDassert(finfo);
+
+    /* Set up user data for callback */
+    cache_udata.f = f;
+
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* Get SOHM header size */
+    finfo->sohm.hdr_size = table->table_size;
+
+    /* Loop over all the indices for shared messages */
+    for(u = 0; u < table->num_indexes; u++) {
+        /* Get index storage size (for either B-tree or list) */
+	if(table->indexes[u].index_type == H5SM_BTREE) {
+	    if(H5F_addr_defined(table->indexes[u].index_addr)) {
+                /* Open the index v2 B-tree */
+                if(NULL == (bt2 = H5B2_open(f, dxpl_id, table->indexes[u].index_addr, f)))
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
+
+		if(H5B2_size(bt2, dxpl_id, &(finfo->sohm.msgs_info.index_size)) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
+
+                /* Close the v2 B-tree */
+                if(H5B2_close(bt2, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+                bt2 = NULL;
+            } /* end if */
+        } /* end if */
+        else {
+            HDassert(table->indexes[u].index_type == H5SM_LIST);
+	    finfo->sohm.msgs_info.index_size += table->indexes[u].list_size;
+        } /* end else */
+
+        /* Check for heap for this index */
+	if(H5F_addr_defined(table->indexes[u].heap_addr)) {
+            /* Open the fractal heap for this index */
+            if(NULL == (fheap = H5HF_open(f, dxpl_id, table->indexes[u].heap_addr)))
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+            /* Get heap storage size */
+	    if(H5HF_size(fheap, dxpl_id, &(finfo->sohm.msgs_info.heap_size)) < 0)
+		HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't retrieve fractal heap storage info")
+
+            /* Close the fractal heap */
+            if(H5HF_close(fheap, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+            fheap = NULL;
+        } /* end if */
+    } /* end for */
+
+done:
+    /* Release resources */
+    if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close fractal heap")
+    if(bt2 && H5B2_close(bt2, dxpl_id) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for SOHM index")
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_ih_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMbtree2.c b/gatb-core/thirdparty/hdf5/src/H5SMbtree2.c
new file mode 100644
index 0000000..e18e9fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMbtree2.c
@@ -0,0 +1,299 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object Headers                       */
+#include "H5SMpkg.h"            /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* v2 B-tree callbacks */
+static void *H5SM_bt2_crt_context(void *udata);
+static herr_t H5SM_bt2_dst_context(void *ctx);
+static herr_t H5SM_bt2_store(void *native, const void *udata);
+static herr_t H5SM_bt2_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+    int indent, int fwidth, const void *record, const void *_udata);
+static void *H5SM_bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+/* v2 B-tree class for SOHM indexes*/
+const H5B2_class_t H5SM_INDEX[1]={{   /* B-tree class information */
+    H5B2_SOHM_INDEX_ID,               /* Type of B-tree */
+    "H5B2_SOHM_INDEX_ID",             /* Name of B-tree class */
+    sizeof(H5SM_sohm_t),              /* Size of native record */
+    H5SM_bt2_crt_context,             /* Create client callback context */
+    H5SM_bt2_dst_context,             /* Destroy client callback context */
+    H5SM_bt2_store,                   /* Record storage callback */
+    H5SM_message_compare,             /* Record comparison callback */
+    H5SM_message_encode,              /* Record encoding callback */
+    H5SM_message_decode,              /* Record decoding callback */
+    H5SM_bt2_debug,                   /* Record debugging callback */
+    H5SM_bt2_crt_dbg_context,	      /* Create debugging context */
+    H5SM_bt2_dst_context 	      /* Destroy debugging context */
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5SM_bt2_ctx_t struct */
+H5FL_DEFINE_STATIC(H5SM_bt2_ctx_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_crt_context
+ *
+ * Purpose:	Create client callback context
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5SM_bt2_crt_context(void *_f)
+{
+    H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
+    H5SM_bt2_ctx_t *ctx;        /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5SM_bt2_ctx_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses & lengths in the file */
+    ctx->sizeof_addr = H5F_SIZEOF_ADDR(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5SM_bt2_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_dst_context
+ *
+ * Purpose:	Destroy client callback context
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 26, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_bt2_dst_context(void *_ctx)
+{
+    H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Release callback context */
+    ctx = H5FL_FREE(H5SM_bt2_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5SM_bt2_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_store
+ *
+ * Purpose:	Store a H5SM_sohm_t SOHM message in the B-tree.  The message
+ *              comes in UDATA as a H5SM_mesg_key_t* and is copied to
+ *              NATIVE as a H5SM_sohm_t.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_bt2_store(void *native, const void *udata)
+{
+    const H5SM_mesg_key_t *key = (const H5SM_mesg_key_t *)udata;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Copy the source message to the B-tree */
+    *(H5SM_sohm_t *)native = key->message;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_bt2_store */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_debug
+ *
+ * Purpose:	Print debugging information for a H5SM_sohm_t.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_bt2_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    int indent, int fwidth, const void *record, const void H5_ATTR_UNUSED *_udata)
+{
+    const H5SM_sohm_t *sohm = (const H5SM_sohm_t *)record;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(sohm->location == H5SM_IN_HEAP)
+        HDfprintf(stream, "%*s%-*s {%a, %lo, %Hx}\n", indent, "", fwidth,
+            "Shared Message in heap:",
+            sohm->u.heap_loc.fheap_id, sohm->hash, sohm->u.heap_loc.ref_count);
+    else {
+        HDassert(sohm->location == H5SM_IN_OH);
+        HDfprintf(stream, "%*s%-*s {%a, %lo, %Hx, %Hx}\n", indent, "", fwidth,
+            "Shared Message in OH:",
+            sohm->u.mesg_loc.oh_addr, sohm->hash, sohm->msg_type_id, sohm->u.mesg_loc.index);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_bt2_debug */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_crt_dbg_context
+ *
+ * Purpose:	Create context for debugging callback
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5SM_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+{
+    H5SM_bt2_ctx_t *ctx;        /* Callback context structure */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5SM_bt2_ctx_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses & lengths in the file */
+    ctx->sizeof_addr = H5F_SIZEOF_ADDR(f);
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5SM_bt2_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_bt2_convert_to_list_op
+ *
+ * Purpose:	An H5B2_remove_t callback function to convert a SOHM
+ *              B-tree index to a list.
+ *
+ *              Inserts this record into the list passed through op_data.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_bt2_convert_to_list_op(const void * record, void *op_data)
+{
+    const H5SM_sohm_t *message = (const H5SM_sohm_t *)record;
+    const H5SM_list_t *list = (const H5SM_list_t *)op_data;
+    size_t mesg_idx;            /* Index of message to modify */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(record);
+    HDassert(op_data);
+
+    /* Get the message index, and increment the # of messages in list */
+    mesg_idx = list->header->num_messages++;
+    HDassert(list->header->num_messages <= list->header->list_max);
+
+    /* Insert this message at the end of the list */
+    HDassert(list->messages[mesg_idx].location == H5SM_NO_LOC);
+    HDassert(message->location != H5SM_NO_LOC);
+    HDmemcpy(&(list->messages[mesg_idx]), message, sizeof(H5SM_sohm_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_bt2_convert_to_list_op() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMcache.c b/gatb-core/thirdparty/hdf5/src/H5SMcache.c
new file mode 100644
index 0000000..49456d8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMcache.c
@@ -0,0 +1,747 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access                          */
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"        /* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5SMpkg.h"            /* Shared object header messages        */
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Size of stack buffer for serialized tables */
+#define H5SM_TBL_BUF_SIZE       1024
+
+/* Size of stack buffer for serialized list indices */
+#define H5SM_LST_BUF_SIZE       1024
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static H5SM_master_table_t *H5SM_table_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5SM_table_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_master_table_t *table);
+static herr_t H5SM_table_dest(H5F_t *f, H5SM_master_table_t* table);
+static herr_t H5SM_table_clear(H5F_t *f, H5SM_master_table_t *table, hbool_t destroy);
+static herr_t H5SM_table_size(const H5F_t *f, const H5SM_master_table_t *table, size_t *size_ptr);
+static H5SM_list_t *H5SM_list_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
+static herr_t H5SM_list_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_list_t *list);
+static herr_t H5SM_list_dest(H5F_t *f, H5SM_list_t* list);
+static herr_t H5SM_list_clear(H5F_t *f, H5SM_list_t *list, hbool_t destroy);
+static herr_t H5SM_list_size(const H5F_t *f, const H5SM_list_t H5_ATTR_UNUSED *list, size_t *size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+/* H5SM inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_SOHM_TABLE[1] = {{
+    H5AC_SOHM_TABLE_ID,
+    (H5AC_load_func_t)H5SM_table_load,
+    (H5AC_flush_func_t)H5SM_table_flush,
+    (H5AC_dest_func_t)H5SM_table_dest,
+    (H5AC_clear_func_t)H5SM_table_clear,
+    (H5AC_size_func_t)H5SM_table_size,
+}};
+
+const H5AC_class_t H5AC_SOHM_LIST[1] = {{
+    H5AC_SOHM_LIST_ID,
+    (H5AC_load_func_t)H5SM_list_load,
+    (H5AC_flush_func_t)H5SM_list_flush,
+    (H5AC_dest_func_t)H5SM_list_dest,
+    (H5AC_clear_func_t)H5SM_list_clear,
+    (H5AC_size_func_t)H5SM_list_size,
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_load
+ *
+ * Purpose:	Loads the master table of Shared Object Header Message
+ *              indexes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5SM_master_table_t *
+H5SM_table_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void H5_ATTR_UNUSED *udata)
+{
+    H5SM_master_table_t *table = NULL;
+    H5WB_t        *wb = NULL;           /* Wrapped buffer for table data */
+    uint8_t       tbl_buf[H5SM_TBL_BUF_SIZE]; /* Buffer for table */
+    uint8_t       *buf;                 /* Reading buffer */
+    const uint8_t *p;                   /* Pointer into input buffer */
+    uint32_t      stored_chksum;        /* Stored metadata checksum value */
+    uint32_t      computed_chksum;      /* Computed metadata checksum value */
+    size_t        x;                    /* Counter variable for index headers */
+    H5SM_master_table_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Verify that we're reading version 0 of the table; this is the only
+     * version defined so far.
+     */
+    HDassert(H5F_SOHM_VERS(f) == HDF5_SHAREDHEADER_VERSION);
+
+    /* Allocate space for the master table in memory */
+    if(NULL == (table = H5FL_CALLOC(H5SM_master_table_t)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Read number of indexes and version from file superblock */
+    table->num_indexes = H5F_SOHM_NINDEXES(f);
+
+    HDassert(addr == H5F_SOHM_ADDR(f));
+    HDassert(addr != HADDR_UNDEF);
+    HDassert(table->num_indexes > 0);
+
+    /* Wrap the local buffer for serialized table info */
+    if(NULL == (wb = H5WB_wrap(tbl_buf, sizeof(tbl_buf))))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Compute the size of the SOHM table header on disk.  This is the "table"
+     * itself plus each index within the table
+     */
+    table->table_size = H5SM_TABLE_SIZE(f);
+
+    /* Get a pointer to a buffer that's large enough for serialized table */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, table->table_size)))
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read header from disk */
+    if(H5F_block_read(f, H5FD_MEM_SOHM_TABLE, addr, table->table_size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_READERROR, NULL, "can't read SOHM table")
+
+    /* Get temporary pointer to serialized table */
+    p = buf;
+
+    /* Check magic number */
+    if(HDmemcmp(p, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "bad SOHM table signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Allocate space for the index headers in memory*/
+    if(NULL == (table->indexes = (H5SM_index_header_t *)H5FL_ARR_MALLOC(H5SM_index_header_t, (size_t)table->num_indexes)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed for SOHM indexes")
+
+    /* Read in the index headers */
+    for(x = 0; x < table->num_indexes; ++x) {
+        /* Verify correct version of index list */
+        if(H5SM_LIST_VERSION != *p++)
+            HGOTO_ERROR(H5E_SOHM, H5E_VERSION, NULL, "bad shared message list version number")
+
+        /* Type of the index (list or B-tree) */
+        table->indexes[x].index_type= (H5SM_index_type_t)*p++;
+
+        /* Type of messages in the index */
+        UINT16DECODE(p, table->indexes[x].mesg_types);
+
+        /* Minimum size of message to share */
+        UINT32DECODE(p, table->indexes[x].min_mesg_size);
+
+        /* List cutoff; fewer than this number and index becomes a list */
+        UINT16DECODE(p, table->indexes[x].list_max);
+
+        /* B-tree cutoff; more than this number and index becomes a B-tree */
+        UINT16DECODE(p, table->indexes[x].btree_min);
+
+        /* Number of messages shared */
+        UINT16DECODE(p, table->indexes[x].num_messages);
+
+        /* Address of the actual index */
+        H5F_addr_decode(f, &p, &(table->indexes[x].index_addr));
+
+        /* Address of the index's heap */
+        H5F_addr_decode(f, &p, &(table->indexes[x].heap_addr));
+
+        /* Compute the size of a list index for this SOHM index */
+        table->indexes[x].list_size = H5SM_LIST_SIZE(f, table->indexes[x].list_max);
+    } /* end for */
+
+    /* Read in checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(p - (const uint8_t *)buf) == table->table_size);
+
+    /* Compute checksum on entire header */
+    computed_chksum = H5_checksum_metadata(buf, (table->table_size - H5SM_SIZEOF_CHECKSUM), 0);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, NULL, "incorrect metadata checksum for shared message table")
+
+    /* Set return value */
+    ret_value = table;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && table)
+        if(H5SM_table_free(table) < 0)
+	    HDONE_ERROR(H5E_SOHM, H5E_CANTFREE, NULL, "unable to destroy sohm table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_table_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_flush
+ *
+ * Purpose:	Flushes (and destroys) the table of Shared Object Header
+ *              Message indexes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_table_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_master_table_t *table)
+{
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for table data */
+    uint8_t tbl_buf[H5SM_TBL_BUF_SIZE]; /* Buffer for table */
+    herr_t ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(table);
+
+    if(table->cache_info.is_dirty) {
+        uint8_t  *buf;               /* Temporary buffer */
+        uint8_t  *p;                 /* Pointer into raw data buffer */
+        uint32_t computed_chksum;    /* Computed metadata checksum value */
+        size_t   x;                  /* Counter variable */
+
+        /* Verify that we're writing version 0 of the table; this is the only
+         * version defined so far.
+         */
+        HDassert(H5F_SOHM_VERS(f) == HDF5_SHAREDHEADER_VERSION);
+
+        /* Wrap the local buffer for serialized header info */
+        if(NULL == (wb = H5WB_wrap(tbl_buf, sizeof(tbl_buf))))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for serialized table */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, table->table_size)))
+            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to buffer for serialized table */
+        p = buf;
+
+        /* Encode magic number */
+        HDmemcpy(p, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Encode each index header */
+        for(x = 0; x < table->num_indexes; ++x) {
+            /* Version for this list. */
+            *p++ = H5SM_LIST_VERSION;
+
+            /* Is message index a list or a B-tree? */
+            *p++ = table->indexes[x].index_type;
+
+            /* Type of messages in the index */
+            UINT16ENCODE(p, table->indexes[x].mesg_types);
+
+            /* Minimum size of message to share */
+            UINT32ENCODE(p, table->indexes[x].min_mesg_size);
+
+            /* List cutoff; fewer than this number and index becomes a list */
+            UINT16ENCODE(p, table->indexes[x].list_max);
+
+            /* B-tree cutoff; more than this number and index becomes a B-tree */
+            UINT16ENCODE(p, table->indexes[x].btree_min);
+
+            /* Number of messages shared */
+            UINT16ENCODE(p, table->indexes[x].num_messages);
+
+            /* Address of the actual index */
+            H5F_addr_encode(f, &p, table->indexes[x].index_addr);
+
+            /* Address of the index's heap */
+            H5F_addr_encode(f, &p, table->indexes[x].heap_addr);
+        } /* end for */
+
+        /* Compute checksum on buffer */
+        computed_chksum = H5_checksum_metadata(buf, (table->table_size - H5SM_SIZEOF_CHECKSUM), 0);
+        UINT32ENCODE(p, computed_chksum);
+
+        /* Write the table to disk */
+        HDassert((size_t)(p - buf) == table->table_size);
+	if(H5F_block_write(f, H5FD_MEM_SOHM_TABLE, addr, table->table_size, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to save sohm table to disk")
+
+	table->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5SM_table_dest(f, table) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy sohm table")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_table_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_dest
+ *
+ * Purpose:	Frees memory used by the SOHM table.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_table_dest(H5F_t H5_ATTR_UNUSED *f, H5SM_master_table_t* table)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(table);
+    HDassert(table->indexes);
+
+    /* Destroy Shared Object Header Message table */
+    if(H5SM_table_free(table) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTRELEASE, FAIL, "unable to free shared message table")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_table_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_clear
+ *
+ * Purpose:	Mark this table as no longer being dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_table_clear(H5F_t *f, H5SM_master_table_t *table, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(table);
+
+    /* Reset the dirty flag.  */
+    table->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5SM_table_dest(f, table) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to delete SOHM master table")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_table_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_table_size
+ *
+ * Purpose:	Returns the size of the table encoded on disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_table_size(const H5F_t H5_ATTR_UNUSED *f, const H5SM_master_table_t *table, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(table);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = table->table_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_table_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_load
+ *
+ * Purpose:	Loads a list of SOHM messages.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5SM_list_t *
+H5SM_list_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+{
+    H5SM_list_t *list;          /* The SOHM list being read in */
+    H5SM_list_cache_ud_t *udata = (H5SM_list_cache_ud_t *)_udata; /* User data for callback */
+    H5SM_bt2_ctx_t ctx;         /* Message encoding context */
+    H5WB_t *wb = NULL;          /* Wrapped buffer for list index data */
+    uint8_t lst_buf[H5SM_LST_BUF_SIZE]; /* Buffer for list index */
+    uint8_t *buf;               /* Reading buffer */
+    uint8_t *p;                 /* Pointer into input buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    size_t x;                   /* Counter variable for messages in list */
+    H5SM_list_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(udata->header);
+
+    /* Allocate space for the SOHM list data structure */
+    if(NULL == (list = H5FL_MALLOC(H5SM_list_t)))
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
+    HDmemset(&list->cache_info, 0, sizeof(H5AC_info_t));
+
+    /* Allocate list in memory as an array*/
+    if((list->messages = (H5SM_sohm_t *)H5FL_ARR_MALLOC(H5SM_sohm_t, udata->header->list_max)) == NULL)
+	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "file allocation failed for SOHM list")
+
+    list->header = udata->header;
+
+    /* Wrap the local buffer for serialized list index info */
+    if(NULL == (wb = H5WB_wrap(lst_buf, sizeof(lst_buf))))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, NULL, "can't wrap buffer")
+
+    /* Get a pointer to a buffer that's large enough for serialized list index */
+    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, udata->header->list_size)))
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "can't get actual buffer")
+
+    /* Read list from disk */
+    if(H5F_block_read(f, H5FD_MEM_SOHM_INDEX, addr, udata->header->list_size, dxpl_id, buf) < 0)
+	HGOTO_ERROR(H5E_SOHM, H5E_READERROR, NULL, "can't read SOHM list")
+
+    /* Get temporary pointer to serialized list index */
+    p = buf;
+
+    /* Check magic number */
+    if(HDmemcmp(p, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "bad SOHM list signature")
+    p += H5_SIZEOF_MAGIC;
+
+    /* Read messages into the list array */
+    ctx.sizeof_addr = H5F_SIZEOF_ADDR(udata->f);
+    for(x = 0; x < udata->header->num_messages; x++) {
+        if(H5SM_message_decode(p, &(list->messages[x]), &ctx) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "can't decode shared message")
+        p += H5SM_SOHM_ENTRY_SIZE(udata->f);
+    } /* end for */
+
+    /* Read in checksum */
+    UINT32DECODE(p, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(p - buf) <= udata->header->list_size);
+
+    /* Compute checksum on entire header */
+    computed_chksum = H5_checksum_metadata(buf, ((size_t)(p - buf) - H5SM_SIZEOF_CHECKSUM), 0);
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, NULL, "incorrect metadata checksum for shared message list")
+
+    /* Initialize the rest of the array */
+    for(x = udata->header->num_messages; x < udata->header->list_max; x++)
+        list->messages[x].location = H5SM_NO_LOC;
+
+    /* Set return value */
+    ret_value = list;
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
+    if(!ret_value && list) {
+        if(list->messages)
+            list->messages = H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
+        list = H5FL_FREE(H5SM_list_t, list);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_list_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_flush
+ *
+ * Purpose:	Flush this list index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_list_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_list_t *list)
+{
+    H5WB_t *wb = NULL;                  /* Wrapped buffer for list index data */
+    uint8_t lst_buf[H5SM_LST_BUF_SIZE]; /* Buffer for list index */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(list);
+    HDassert(list->header);
+
+    if(list->cache_info.is_dirty) {
+        H5SM_bt2_ctx_t ctx;         /* Message encoding context */
+        uint8_t *buf;               /* Temporary buffer */
+        uint8_t *p;                 /* Pointer into raw data buffer */
+        uint32_t computed_chksum;   /* Computed metadata checksum value */
+        size_t mesgs_written;       /* Number of messages written to list */
+        size_t x;                   /* Local index variable */
+
+        /* Wrap the local buffer for serialized list index info */
+        if(NULL == (wb = H5WB_wrap(lst_buf, sizeof(lst_buf))))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+        /* Get a pointer to a buffer that's large enough for serialized list index */
+        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, list->header->list_size)))
+            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+        /* Get temporary pointer to buffer for serialized list index */
+        p = buf;
+
+        /* Encode magic number */
+        HDmemcpy(p, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+        p += H5_SIZEOF_MAGIC;
+
+        /* Write messages from the messages array to disk */
+        mesgs_written = 0;
+        ctx.sizeof_addr = H5F_SIZEOF_ADDR(f);
+        for(x = 0; x < list->header->list_max && mesgs_written < list->header->num_messages; x++) {
+            if(list->messages[x].location != H5SM_NO_LOC) {
+                if(H5SM_message_encode(p, &(list->messages[x]), &ctx) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to write shared message to disk")
+
+                p += H5SM_SOHM_ENTRY_SIZE(f);
+                ++mesgs_written;
+            } /* end if */
+        } /* end for */
+        HDassert(mesgs_written == list->header->num_messages);
+
+        /* Compute checksum on buffer */
+        computed_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+        UINT32ENCODE(p, computed_chksum);
+#ifdef H5_CLEAR_MEMORY
+HDmemset(p, 0, (list->header->list_size - (size_t)(p - buf)));
+#endif /* H5_CLEAR_MEMORY */
+
+        /* Write the list to disk */
+        HDassert((size_t)(p - buf) <= list->header->list_size);
+	if(H5F_block_write(f, H5FD_MEM_SOHM_INDEX, addr, list->header->list_size, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to save sohm table to disk")
+
+        list->cache_info.is_dirty = FALSE;
+    } /* end if */
+
+    if(destroy)
+        if(H5SM_list_dest(f, list) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy list")
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_list_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_dest
+ *
+ * Purpose:	Frees all memory used by the list.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_list_dest(H5F_t *f, H5SM_list_t* list)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(list);
+    HDassert(list->header);
+    HDassert(list->messages);
+
+    /* If we're going to free the space on disk, the address must be valid */
+    HDassert(!list->cache_info.free_file_space_on_destroy || H5F_addr_defined(list->cache_info.addr));
+
+    /* Check for freeing file space for shared message index list */
+    if(list->cache_info.free_file_space_on_destroy) {
+        /* Release the space on disk */
+        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
+        if(H5MF_xfree(f, H5FD_MEM_SOHM_INDEX, H5AC_dxpl_id, list->cache_info.addr, (hsize_t)list->header->list_size) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "unable to free shared message list")
+    } /* end if */
+
+    /* Destroy Shared Object Header Message list */
+    if(H5SM_list_free(list) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTRELEASE, FAIL, "unable to free shared message list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_list_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_clear
+ *
+ * Purpose:	Marks a list as not dirty.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_list_clear(H5F_t *f, H5SM_list_t *list, hbool_t destroy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(list);
+
+    /* Reset the dirty flag.  */
+    list->cache_info.is_dirty = FALSE;
+
+    if(destroy)
+        if(H5SM_list_dest(f, list) < 0)
+	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy SOHM list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end of H5SM_list_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_list_size
+ *
+ * Purpose:	Gets the size of a list on disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	James Laird
+ *		November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_list_size(const H5F_t H5_ATTR_UNUSED *f, const H5SM_list_t *list, size_t *size_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(list);
+    HDassert(list->header);
+    HDassert(size_ptr);
+
+    /* Set size value */
+    *size_ptr = list->header->list_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_list_size() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMmessage.c b/gatb-core/thirdparty/hdf5/src/H5SMmessage.c
new file mode 100644
index 0000000..e11722d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMmessage.c
@@ -0,0 +1,365 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Opkg.h"             /* Object Headers                       */
+#include "H5SMpkg.h"            /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Udata struct for calls to H5SM_compare_cb and H5SM_compare_iter_op*/
+typedef struct H5SM_compare_udata_t {
+    const H5SM_mesg_key_t *key; /* Key; compare this against stored message */
+    H5O_msg_crt_idx_t idx;      /* Index of the message in the OH, if applicable */
+    herr_t ret;                 /* Return value; set this to result of memcmp */
+} H5SM_compare_udata_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5SM_compare_cb(const void *obj, size_t obj_len, void *udata);
+static herr_t H5SM_compare_iter_op(H5O_t *oh, H5O_mesg_t *mesg, unsigned sequence,
+    unsigned *oh_modified, void *udata);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_compare_cb
+ *
+ * Purpose:	Callback for H5HF_op, used in H5SM_message_compare below.
+ *              Determines whether the search key passed in in _UDATA is
+ *              equal to OBJ or not.
+ *
+ *              Passes back the result in _UDATA->RET
+ *
+ * Return:	Negative on error, non-negative on success
+ *
+ * Programmer:	James Laird
+ *              Monday, January 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_compare_cb(const void *obj, size_t obj_len, void *_udata)
+{
+    H5SM_compare_udata_t *udata = (H5SM_compare_udata_t *)_udata;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* If the encoding sizes are different, it's not the same object */
+    if(udata->key->encoding_size > obj_len)
+        udata->ret = 1;
+    else if(udata->key->encoding_size < obj_len)
+        udata->ret = -1;
+    else
+        /* Sizes are the same.  Return result of memcmp */
+        udata->ret = HDmemcmp(udata->key->encoding, obj, obj_len);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_compare_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_compare_iter_op
+ *
+ * Purpose:	OH iteration callback to compare a key against a message in
+ *              an OH
+ *
+ * Return:	0 if this is not the message we're searching for
+ *              1 if this is the message we're searching for (with memcmp
+ *                      result returned in udata)
+ *              negative on error
+ *
+ * Programmer:	James Laird
+ *              Wednesday, February 7, 2007
+ *
+ * Modifications:
+ *      Vailin Choi; September 2011
+ *      Change "oh_modified" from boolean to unsigned
+ *      (See H5Oprivate.h for possible flags)
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_compare_iter_op(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
+    unsigned H5_ATTR_UNUSED *oh_modified, void *_udata/*in,out*/)
+{
+    H5SM_compare_udata_t *udata = (H5SM_compare_udata_t *) _udata;
+    herr_t ret_value = H5_ITER_CONT;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(oh);
+    HDassert(mesg);
+    HDassert(udata && udata->key);
+
+    /* Check the creation index for this message */
+    if(sequence == udata->idx) {
+        size_t aligned_encoded_size = H5O_ALIGN_OH(oh, udata->key->encoding_size);
+
+        /* Sanity check the message's length */
+        HDassert(mesg->raw_size > 0);
+
+        if(aligned_encoded_size > mesg->raw_size)
+            udata->ret = 1;
+        else if(aligned_encoded_size < mesg->raw_size)
+            udata->ret = -1;
+        else {
+            /* Check if the message is dirty & flush it to the object header if so */
+            if(mesg->dirty)
+                if(H5O_msg_flush(udata->key->file, oh, mesg) < 0)
+                    HGOTO_ERROR(H5E_SOHM, H5E_CANTENCODE, H5_ITER_ERROR, "unable to encode object header message")
+
+            HDassert(udata->key->encoding_size <= mesg->raw_size);
+            udata->ret = HDmemcmp(udata->key->encoding, mesg->raw, udata->key->encoding_size);
+        } /* end else */
+
+        /* Indicate that we found the message we were looking for */
+        ret_value = H5_ITER_STOP;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_compare_iter_op() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_message_compare
+ *
+ * Purpose:	Determine whether the search key rec1 represents a shared
+ *              message that is equal to rec2 or not, and if not, whether
+ *              rec1 is "greater than" or "less than" rec2.
+ *
+ * Return:	0 if rec1 == rec2
+ *              Negative if rec1 < rec2
+ *              Positive if rec1 > rec2
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_compare(const void *rec1, const void *rec2, int *result)
+{
+    const H5SM_mesg_key_t *key = (const H5SM_mesg_key_t *) rec1;
+    const H5SM_sohm_t *mesg = (const H5SM_sohm_t *) rec2;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* If the key has an fheap ID, we're looking for a message that's
+     * already in the index; if the fheap ID matches, we've found the message
+     * and can stop immediately.
+     * Likewise, if the message has an OH location that is matched by the
+     * message in the index, we've found the message.
+     */
+    if(mesg->location == H5SM_IN_HEAP && key->message.location == H5SM_IN_HEAP) {
+        if(key->message.u.heap_loc.fheap_id.val == mesg->u.heap_loc.fheap_id.val) {
+            *result = 0;
+            HGOTO_DONE(SUCCEED);
+        }
+    } /* end if */
+    else if(mesg->location == H5SM_IN_OH && key->message.location == H5SM_IN_OH) {
+        if(key->message.u.mesg_loc.oh_addr == mesg->u.mesg_loc.oh_addr &&
+           key->message.u.mesg_loc.index == mesg->u.mesg_loc.index &&
+           key->message.msg_type_id == mesg->msg_type_id) {
+            *result = 0;
+            HGOTO_DONE(SUCCEED);
+        }
+    } /* end if */
+
+    /* Compare hash values */
+    if(key->message.hash > mesg->hash)
+        *result = 1;
+    else if(key->message.hash < mesg->hash)
+        *result = -1;
+    /* If the hash values match, make sure the messages are really the same */
+    else {
+        /* Hash values match; compare the encoded message with the one in
+         * the index.
+         */
+        H5SM_compare_udata_t udata;
+
+        HDassert(key->message.hash == mesg->hash);
+        HDassert(key->encoding_size > 0 && key->encoding);
+
+        /* Set up user data for callback */
+        udata.key = key;
+
+        /* Compare the encoded message with either the message in the heap or
+         * the message in an object header.
+         */
+        if(mesg->location == H5SM_IN_HEAP) {
+            /* Call heap op routine with comparison callback */
+            if(H5HF_op(key->fheap, key->dxpl_id, &(mesg->u.heap_loc.fheap_id), H5SM_compare_cb, &udata) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        } /* end if */
+        else {
+            H5O_loc_t oloc;             /* Object owning the message */
+            H5O_mesg_operator_t op;             /* Message operator */
+
+            /* Sanity checks */
+            HDassert(key->file);
+            HDassert(mesg->location == H5SM_IN_OH);
+
+            /* Reset the object location */
+            if(H5O_loc_reset(&oloc) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location")
+
+            /* Set up object location */
+            oloc.file = key->file;
+            oloc.addr = mesg->u.mesg_loc.oh_addr;
+
+            /* Finish setting up user data for iterator */
+            udata.idx = mesg->u.mesg_loc.index;
+
+            /* Locate the right message and compare with it */
+            op.op_type = H5O_MESG_OP_LIB;
+            op.u.lib_op = H5SM_compare_iter_op;
+            if(H5O_msg_iterate(&oloc, mesg->msg_type_id, &op, &udata, key->dxpl_id) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over links")
+        } /* end else */
+
+        *result = udata.ret;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_message_compare */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_message_encode
+ *
+ * Purpose:	Serialize a H5SM_sohm_t struct into a buffer RAW.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+{
+    H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    const H5SM_sohm_t *message = (const H5SM_sohm_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    *raw++ = message->location;
+    UINT32ENCODE(raw, message->hash);
+
+    if(message->location == H5SM_IN_HEAP) {
+        UINT32ENCODE(raw, message->u.heap_loc.ref_count);
+        HDmemcpy(raw, message->u.heap_loc.fheap_id.id, (size_t)H5O_FHEAP_ID_LEN);
+    } /* end if */
+    else {
+        HDassert(message->location == H5SM_IN_OH);
+
+        *raw++ = 0;     /* reserved (possible flags byte) */
+        *raw++ = (uint8_t)message->msg_type_id;
+        UINT16ENCODE(raw, message->u.mesg_loc.index);
+        H5F_addr_encode_len((size_t)ctx->sizeof_addr, &raw, message->u.mesg_loc.oh_addr);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_encode */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5SM_message_decode
+ *
+ * Purpose:	Read an encoded SOHM message from RAW into an H5SM_sohm_t struct.
+ *
+ * Return:	Non-negative on success
+ *              Negative on failure
+ *
+ * Programmer:	James Laird
+ *              Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+{
+    H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
+    H5SM_sohm_t *message = (H5SM_sohm_t *)_nrecord;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    message->location = (H5SM_storage_loc_t)*raw++;
+    UINT32DECODE(raw, message->hash);
+
+    if(message->location == H5SM_IN_HEAP) {
+        UINT32DECODE(raw, message->u.heap_loc.ref_count);
+        HDmemcpy(message->u.heap_loc.fheap_id.id, raw, (size_t)H5O_FHEAP_ID_LEN);
+    } /* end if */
+    else {
+        HDassert(message->location == H5SM_IN_OH);
+
+        raw++;          /* reserved */
+        message->msg_type_id = *raw++;
+        UINT16DECODE(raw, message->u.mesg_loc.index);
+        H5F_addr_decode_len((size_t)ctx->sizeof_addr, &raw, &message->u.mesg_loc.oh_addr);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_decode */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMpkg.h b/gatb-core/thirdparty/hdf5/src/H5SMpkg.h
new file mode 100644
index 0000000..dd31ce6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMpkg.h
@@ -0,0 +1,292 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  James Laird <jlaird at ncsa.uiuc.edu>
+ *              Thursday, March 30, 2006
+ *
+ * Purpose:     This file contains declarations which are visible only within
+ *              the H5SM shared object header messages package.  Source files
+ *              outside the H5SM package should	include H5SMprivate.h instead.
+ */
+#ifndef H5SM_PACKAGE
+#error "Do not include this file outside the H5SM package!"
+#endif
+
+#ifndef _H5SMpkg_H
+#define _H5SMpkg_H
+
+/* Get package's private header */
+#include "H5SMprivate.h"	/* Shared Object Header Messages	*/
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"        /* Metadata Cache		  	*/
+#include "H5B2private.h"        /* B-trees                              */
+#include "H5HFprivate.h"        /* Fractal heaps		  	*/
+
+
+/****************************/
+/* Package Macros           */
+/****************************/
+
+/* Size of checksum information (on disk) */
+#define H5SM_SIZEOF_CHECKSUM 4
+
+#define H5SM_HEAP_LOC_SIZE (                                                  \
+        (unsigned)4                     /* Reference count */                 \
+        + sizeof(H5O_fheap_id_t)        /* size of heap ID on disk */         \
+    )
+
+#define H5SM_OH_LOC_SIZE(f) (                                                 \
+        (unsigned)1             /* reserved (possible flags?) */              \
+        + (unsigned)1           /* message type ID */			      \
+        + (unsigned)2           /* creation index of message in OH */         \
+        + H5F_SIZEOF_ADDR(f)    /* address of OH */                           \
+    )
+
+#define H5SM_SOHM_ENTRY_SIZE(f) (                                             \
+        (unsigned)1             /* Message location */                        \
+        + (unsigned)4           /* Hash value */                              \
+        + MAX(H5SM_HEAP_LOC_SIZE, H5SM_OH_LOC_SIZE(f))  /* Entry */           \
+    )
+
+#define H5SM_INDEX_HEADER_SIZE(f) (                                           \
+        (unsigned)1             /* Whether index is a list or B-tree */       \
+        + (unsigned)1           /* Version of index format */                 \
+        + (unsigned)2           /* Type of messages stored in the index */    \
+        + (unsigned)4           /* Minimum size of messages to share */       \
+        + (unsigned)(3 * 2)     /* B-tree cutoff, list cutoff, # of shared messages */ \
+        + H5F_SIZEOF_ADDR(f)    /* Location of list or B-tree */              \
+        + H5F_SIZEOF_ADDR(f)    /* Address of heap */                         \
+    )
+
+/* Format overhead for all SOHM tree metadata in the file */
+#define H5SM_METADATA_PREFIX_SIZE (                                           \
+    H5_SIZEOF_MAGIC             /* Signature */                               \
+    + H5SM_SIZEOF_CHECKSUM      /* Checksum */                                \
+    )
+
+#define H5SM_TABLE_SIZE(f) (                                                  \
+    /* General metadata fields */                                             \
+    H5SM_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Indices */                                                             \
+    + (H5F_SOHM_NINDEXES(f) * H5SM_INDEX_HEADER_SIZE(f))                      \
+    )
+
+#define H5SM_LIST_SIZE(f, num_mesg) (                                         \
+    /* General metadata fields */                                             \
+    H5SM_METADATA_PREFIX_SIZE                                                 \
+                                                                              \
+    /* Message entries */                                                     \
+    + (H5SM_SOHM_ENTRY_SIZE(f) * num_mesg)                                    \
+    )
+
+#define H5SM_B2_NODE_SIZE 512
+#define H5SM_B2_SPLIT_PERCENT 100
+#define H5SM_B2_MERGE_PERCENT 40
+
+#define H5SM_LIST_VERSION	0	/* Verion of Shared Object Header Message List Indexes */
+
+/****************************/
+/* Package Typedefs         */
+/****************************/
+
+/* There are a number of Shared Object Header Message-specific structs here.
+ *
+ * The H5SM_master_table_t is pointed to by the file superblock.  Since a file
+ * can have more than one SOHM index, this table collects all the indexes into
+ * one place.  It holds an array of H5SM_index_header_t structs.
+ *
+ * An H5SM_index_header_t is actually the for a given index.  It holds
+ * the number of messages in the index, the types of messages in the index,
+ * etc.  It also records whether the index is a list or a b-tree, and has
+ * the address of the list or b-tree.
+ *
+ * If the index is a list, the address in the index header should be given
+ * to the cache, which can load it into a H5SM_list_t struct.  This is mostly
+ * just a header for the cache information; it contains a pointer back to
+ * the index header and an unsorted array of messages.
+ *
+ * These messages are H5SM_sohm_t structs.  They hold the actual SOHM's
+ * address, hash value, and refcount.
+ *
+ * If the index is a b-tree, the H5SM_index_header_t struct holds the address
+ * of the b-tree instead of the address of a H5SM_list_t.  The B-tree's nodes
+ * are still 'H5SM_sohm_t's.
+ *
+ * H5SM_mesg_key_t structs are used to search lists and B-trees for a certain
+ * message.  They correspond to a message that hasn't yet been written to
+ * disk.
+ */
+
+/* Where a message is stored */
+typedef enum {
+    H5SM_NO_LOC = -1,
+    H5SM_IN_HEAP = 0,    	/* Message is stored in the heap */
+    H5SM_IN_OH    		/* Message is stored in an object header */
+} H5SM_storage_loc_t;
+
+/* Typedef for a record's location if it's stored in the heap */
+typedef struct {
+    hsize_t ref_count;		/* Number of times this message is used in the file */
+    H5O_fheap_id_t fheap_id;    /* ID of the OHM in the fractal heap */
+} H5SM_heap_loc_t;
+
+/* Typedef for a SOHM index node */
+typedef struct {
+    H5SM_storage_loc_t location;        /* Type of message location */
+    uint32_t hash;		        /* Hash value for encoded OHM */
+    unsigned msg_type_id;               /* Message's type ID */
+    union {
+        H5O_mesg_loc_t mesg_loc;        /* Location of message in object header */
+        H5SM_heap_loc_t heap_loc;       /* Heap ID for message in SOHM heap */
+    } u;
+} H5SM_sohm_t;
+
+/* Types of message indices */
+typedef enum {
+    H5SM_BADTYPE = -1,
+    H5SM_LIST,    		/* Index is an unsorted list */
+    H5SM_BTREE    		/* Index is a sorted B-tree */
+} H5SM_index_type_t;
+
+/* Typedef for a SOHM index header */
+typedef struct {
+/* Stored */
+    unsigned mesg_types;	/* Bit flag vector of message types */
+    size_t min_mesg_size;	/* number of messages being tracked */
+    size_t list_max;		/* >= this many messages, index with a B-tree */
+    size_t btree_min;		/* <= this many messages, index with a list again */
+    size_t num_messages;	/* number of messages being tracked */
+    H5SM_index_type_t index_type; /* Is the index a list or a B-tree? */
+    haddr_t index_addr;		/* Address of the actual index (list or B-tree) */
+    haddr_t heap_addr;		/* Address of the fheap used to store shared messages */
+
+/* Not stored */
+    size_t list_size;           /* Size of list index on disk */
+} H5SM_index_header_t;
+
+/* Typedef for a SOHM list */
+typedef struct {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    H5SM_index_header_t *header;    /* Pointer to the corresponding index header */
+    H5SM_sohm_t *messages;          /* Actual list, stored as an array */
+} H5SM_list_t;
+
+/* Typedef for shared object header message master table */
+struct H5SM_master_table_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    size_t table_size;              /* Size of table on disk */
+    unsigned num_indexes;           /* Number of indexes */
+    H5SM_index_header_t *indexes;   /* Array of num_indexes indexes */
+};
+
+/* Typedef for searching an index (list or B-tree) */
+typedef struct {
+    H5F_t *file;                        /* File in which sharing is happening */
+    hid_t dxpl_id;                      /* DXPL for sharing messages in heap */
+    H5HF_t *fheap;    			/* The heap for this message type, open. */
+    void *encoding; 		        /* The message encoded, or NULL */
+    size_t encoding_size; 		/* Size of the encoding, or 0 */
+    H5SM_sohm_t message;                /* The message to find/insert.
+                                         * If the message doesn't yet have a
+                                         * heap ID, the heap ID will be 0. */
+} H5SM_mesg_key_t;
+
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when computing a hash value for a message.
+ */
+typedef struct {
+    /* downward (internal) */
+    unsigned    type_id;                /* Message type */
+
+    /* upward */
+    uint32_t    hash;                   /* Hash value */
+} H5SM_fh_ud_gh_t;
+
+/* Typedef to increment a reference count in the B-tree */
+typedef struct {
+    H5SM_mesg_key_t *key;       /* IN: key for message being incremented */
+    H5O_fheap_id_t fheap_id;    /* OUT: fheap ID of record */
+    hid_t dxpl_id;
+} H5SM_incr_ref_opdata;
+
+/* v2 B-tree client callback context */
+typedef struct H5SM_bt2_ctx_t {
+    uint8_t     sizeof_addr;    /* Size of file addresses */
+} H5SM_bt2_ctx_t;
+
+/* Callback info for loading a shared message table index into the cache */
+typedef struct H5SM_table_cache_ud_t {
+    H5F_t *f;                   /* File that shared message index stored as a table is in */
+} H5SM_table_cache_ud_t;
+
+/* Callback info for loading a shared message list index into the cache */
+typedef struct H5SM_list_cache_ud_t {
+    H5F_t *f;                   /* File that shared message index stored as a table is in */
+    H5SM_index_header_t *header; /* Index header for this list */
+} H5SM_list_cache_ud_t;
+
+
+/****************************/
+/* Package Variables        */
+/****************************/
+
+/* Declare free lists to manage H5SM structs */
+H5FL_EXTERN(H5SM_master_table_t);
+H5FL_ARR_EXTERN(H5SM_index_header_t);
+H5FL_EXTERN(H5SM_list_t);
+H5FL_ARR_EXTERN(H5SM_sohm_t);
+
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1];
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1];
+H5_DLLVAR const H5B2_class_t H5SM_INDEX[1];
+
+/****************************/
+/* Package Prototypes       */
+/****************************/
+
+/* General routines */
+H5_DLL ssize_t H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id);
+
+/* Encode and decode routines, used for B-tree and cache encoding/decoding */
+H5_DLL herr_t H5SM_message_compare(const void *rec1, const void *rec2, int *result);
+H5_DLL herr_t H5SM_message_encode(uint8_t *raw, const void *native, void *ctx);
+H5_DLL herr_t H5SM_message_decode(const uint8_t *raw, void *native, void *ctx);
+
+/* H5B2_remove_t callback to add messages to a list index */
+H5_DLL herr_t H5SM_bt2_convert_to_list_op(const void * record, void *op_data);
+
+/* Fractal heap 'op' callback to compute hash value for message "in place" */
+H5_DLL herr_t H5SM_get_hash_fh_cb(const void *obj, size_t obj_len, void *_udata);
+
+/* Routines to release data structures */
+herr_t H5SM_table_free(H5SM_master_table_t *table);
+herr_t H5SM_list_free(H5SM_list_t *list);
+
+/* Testing functions */
+#ifdef H5SM_TESTING
+H5_DLL herr_t H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+    size_t *mesg_count);
+#endif /* H5SM_TESTING */
+
+#endif /* _H5SMpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMprivate.h b/gatb-core/thirdparty/hdf5/src/H5SMprivate.h
new file mode 100644
index 0000000..dddc0a8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMprivate.h
@@ -0,0 +1,80 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	James Laird <jlaird at ncsa.uiuc.edu>
+ *		Thursday, March 2, 2006
+ *
+ * Purpose:	This file contains private declarations for the H5SM
+ *              shared object header messages module.
+ */
+#ifndef _H5SMprivate_H
+#define _H5SMprivate_H
+
+#include "H5Oprivate.h"		/* Object headers			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Flags for the "defer_flags" argument to H5SM_try_share
+ */
+#define H5SM_DEFER              0x01u   /* Don't actually write shared message to index, heap; just update shared info */
+#define H5SM_WAS_DEFERRED       0x02u   /* Message was previously updated by a call to H5SM_try_share with H5SM_DEFER */
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Forward references of package typedefs */
+typedef struct H5SM_master_table_t H5SM_master_table_t;
+
+
+/******************************/
+/* Library Private Prototypes */
+/******************************/
+
+/* Generally useful shared message routines */
+H5_DLL herr_t H5SM_init(H5F_t *f, H5P_genplist_t *fc_plist,
+    const H5O_loc_t *ext_loc, hid_t dxpl_id);
+H5_DLL htri_t H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table,
+    ssize_t *sohm_index_num, unsigned type_id, const void *mesg);
+H5_DLL htri_t H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    unsigned defer_flags, unsigned type_id, void *mesg, unsigned *mesg_flags);
+H5_DLL herr_t H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    H5O_shared_t *sh_mesg);
+H5_DLL herr_t H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist,
+    hid_t dxpl_id);
+H5_DLL htri_t H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id);
+H5_DLL herr_t H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+    haddr_t *fheap_addr);
+H5_DLL herr_t H5SM_reconstitute(H5O_shared_t *sh_mesg, H5F_t *f,
+    unsigned msg_type_id, H5O_fheap_id_t heap_id);
+H5_DLL herr_t H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+    const H5O_shared_t *sh_mesg, hsize_t *ref_count);
+H5_DLL herr_t H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *bh_info);
+
+
+/* Debugging routines */
+H5_DLL herr_t H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr,
+    FILE *stream, int indent, int fwidth, unsigned table_vers,
+    unsigned num_indexes);
+H5_DLL herr_t H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
+    FILE *stream, int indent, int fwidth, unsigned list_vers, size_t num_messages);
+
+#endif /*_H5SMprivate_H*/
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5SMtest.c b/gatb-core/thirdparty/hdf5/src/H5SMtest.c
new file mode 100644
index 0000000..d10f8a2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5SMtest.c
@@ -0,0 +1,123 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#define H5SM_TESTING		/*suppress warning about H5SM testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access                          */
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5SMpkg.h"            /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM_get_mesg_count_test
+ *
+ * Purpose:     Retrieve the number of messages tracked of a certain type
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, January  3, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+    size_t *mesg_count)
+{
+    H5SM_master_table_t *table = NULL;  /* SOHM master table */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(mesg_count);
+
+    /* Check for shared messages being enabled */
+    if(H5F_addr_defined(H5F_SOHM_ADDR(f))) {
+        H5SM_index_header_t *header;        /* Index header for message type */
+        H5SM_table_cache_ud_t cache_udata;  /* User-data for callback */
+        ssize_t index_num;                  /* Table index for message type */
+
+        /* Set up user data for callback */
+        cache_udata.f = f;
+
+        /* Look up the master SOHM table */
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+        /* Find the correct index for this message type */
+        if((index_num = H5SM_get_index(table, type_id)) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to find correct SOHM index")
+        header = &(table->indexes[index_num]);
+
+        /* Set the message count for the type */
+        *mesg_count = header->num_messages;
+    } /* end if */
+    else
+        /* No shared messages of any type */
+        *mesg_count = 0;
+
+done:
+    /* Release resources */
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_mesg_count_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5ST.c b/gatb-core/thirdparty/hdf5/src/H5ST.c
new file mode 100644
index 0000000..7b61aa1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5ST.c
@@ -0,0 +1,793 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* TERNARY SEARCH TREE ALGS
+  This code is described in "Ternary Search Trees" by Jon
+Bentley and Robert Sedgewick in the April, 1998, Dr. Dobb's Journal.
+*/
+
+
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5STprivate.h"        /* Ternary search trees                 */
+
+/* Declare a free list to manage the H5ST_node_t struct */
+H5FL_DEFINE_STATIC(H5ST_node_t);
+
+/* Declare a free list to manage the H5ST_tree_t struct */
+H5FL_DEFINE_STATIC(H5ST_tree_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_create
+ PURPOSE
+    Create a TST
+ USAGE
+    H5ST_ptr_t H5ST_create()
+
+ RETURNS
+    Returns a pointer to the new TST tree on success, NULL on failure.
+ DESCRIPTION
+    Create a TST.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5ST_tree_t *
+H5ST_create(void)
+{
+    H5ST_tree_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate wrapper for TST */
+    if(NULL == (ret_value = H5FL_MALLOC(H5ST_tree_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->root = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_close_internal
+ PURPOSE
+    Close a TST, deallocating it.
+ USAGE
+    herr_t H5ST_close(p)
+        H5ST_ptr_t p;        IN/OUT: Root of TST to free
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a TST, freeing all nodes.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5ST_close_internal(H5ST_ptr_t p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Recursively free TST */
+    if(p) {
+        H5ST_close_internal(p->lokid);
+        if(p->splitchar)
+            H5ST_close_internal(p->eqkid);
+        H5ST_close_internal(p->hikid);
+        p = H5FL_FREE(H5ST_node_t, p);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5ST_close_internal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_close
+ PURPOSE
+    Close a TST, deallocating it.
+ USAGE
+    herr_t H5ST_close(tree)
+        H5ST_tree_t *tree;        IN/OUT: TST tree to free
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Close a TST, freeing all nodes.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5ST_close(H5ST_tree_t *tree)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(NULL == tree)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid TST")
+
+    /* Free the TST itself */
+    if(H5ST_close_internal(tree->root) < 0)
+        HGOTO_ERROR(H5E_TST, H5E_CANTFREE, FAIL, "can't free TST")
+
+    /* Free root node itself */
+    tree = H5FL_FREE(H5ST_tree_t, tree);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_close() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_insert
+ PURPOSE
+    Insert a string/object pair into a TST
+ USAGE
+    herr_t H5ST_insert(tree,s,obj)
+        H5ST_tree_t *tree;      IN/OUT: TST to insert string into
+        const char *s;          IN: String to use as key for object
+        void *obj;              IN: Pointer to object to insert
+
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Insert a key (string)/object pair into a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5ST_insert(H5ST_tree_t *tree, const char *s, void *obj)
+{
+    int d;                      /* Comparison value */
+    H5ST_ptr_t pp, *p;          /* Pointer to current node and pointer to that */
+    H5ST_ptr_t parent=NULL;     /* Pointer to parent node */
+    H5ST_ptr_t up=NULL;         /* Pointer to up node */
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Find the correct location to insert object */
+    p = &tree->root;
+    while((pp = *p)) {
+        /* If this node matches the character in the key, then drop down to the lower tree */
+        if(0 == (d = *s - pp->splitchar)) {
+            if(*s++ == 0)
+                HGOTO_ERROR(H5E_TST, H5E_EXISTS, FAIL, "key already in tree")
+            up=pp;
+            p = &(pp->eqkid);
+        } /* end if */
+        else {
+            /* Walk through the current tree, searching for the matching character */
+            parent = pp;
+            if(d < 0)
+                p = &(pp->lokid);
+            else
+                p = &(pp->hikid);
+        } /* end else */
+    } /* end while */
+
+    /* Finish walking through the key string, adding nodes until the end */
+    for (;;) {
+        if(NULL == (*p = H5FL_MALLOC(H5ST_node_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        pp = *p;
+        pp->splitchar = *s;
+        pp->up = up;
+        pp->parent = parent;
+        pp->lokid = pp->eqkid = pp->hikid = NULL;
+
+        /* If this is the end of the key string, break out */
+        if(*s++ == 0) {
+            pp->eqkid = (H5ST_ptr_t)obj;
+            break;
+        } /* end if */
+
+        /* Continue to next character */
+        parent = NULL;
+        up = pp;
+        p = &(pp->eqkid);
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_insert() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_search
+ PURPOSE
+    Determine if a key is in the TST
+ USAGE
+    hbool_t H5ST_search(tree,s)
+        H5ST_tree_t *tree;      IN: TST to find string in
+        const char *s;          IN: String to use as key to locate
+
+ RETURNS
+    Success: TRUE if key string in TST, FALSE if not
+    Failure: negative
+ DESCRIPTION
+    Locate a key (string) in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5ST_search(H5ST_tree_t *tree, const char *s)
+{
+    H5ST_ptr_t p;               /* Temporary pointer to TST node */
+    htri_t ret_value=FALSE;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    p = tree->root;
+    while (p) {
+        if (*s < p->splitchar)
+            p = p->lokid;
+        else if (*s == p->splitchar)  {
+            if (*s++ == 0)
+                HGOTO_DONE(TRUE);
+            p = p->eqkid;
+        } else
+            p = p->hikid;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_search() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_find_internal
+ PURPOSE
+    Find the node matching a particular key string
+ USAGE
+    H5ST_ptr_t H5ST_find(p,s)
+        H5ST_ptr_t p;           IN: TST to find string in
+        const char *s;          IN: String to use as key to locate
+
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Locate a key (string) in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5ST_ptr_t
+H5ST_find_internal(H5ST_ptr_t p, const char *s)
+{
+    H5ST_ptr_t ret_value = NULL;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    while (p) {
+        if (*s < p->splitchar)
+            p = p->lokid;
+        else if (*s == p->splitchar)  {
+            if (*s++ == 0)
+                HGOTO_DONE(p);
+            p = p->eqkid;
+        } else
+            p = p->hikid;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_find_internal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_find
+ PURPOSE
+    Find the node matching a particular key string
+ USAGE
+    H5ST_ptr_t H5ST_find(tree,s)
+        H5ST_tree_t *tree;      IN: TST to find string in
+        const char *s;          IN: String to use as key to locate
+
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Locate a key (string) in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5ST_ptr_t
+H5ST_find(H5ST_tree_t *tree, const char *s)
+{
+    H5ST_ptr_t ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(NULL == (ret_value = H5ST_find_internal(tree->root, s)))
+        HGOTO_ERROR(H5E_TST, H5E_NOTFOUND, NULL, "key not found in TST")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_find() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_locate
+ PURPOSE
+    Find an object in a TST
+ USAGE
+    void *H5ST_locate(tree,s)
+        H5ST_tree_t *tree;  IN: TST to locate object within
+        const char *s;      IN: String of key for object to locate
+ RETURNS
+    Success: Non-NULL, pointer to object stored for key
+    Failure: Negative
+ DESCRIPTION
+    Locate a node in a TST, returning the object from the node.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5ST_locate(H5ST_tree_t *tree, const char *s)
+{
+    H5ST_ptr_t node;    /* Pointer to node located */
+    void *ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Locate the node to remove */
+    if(NULL == (node = H5ST_find_internal(tree->root, s)))
+        HGOTO_ERROR(H5E_TST, H5E_NOTFOUND, NULL, "key not found in TST")
+
+    /* Get the pointer to the object to return */
+    ret_value = node->eqkid;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5ST_locate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_findfirst_internal
+ PURPOSE
+    Find the first node in a TST
+ USAGE
+    H5ST_ptr_t H5ST_findfirst_internal(p)
+        H5ST_ptr_t p;      IN: TST to locate first node within
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Get the first (lexicographically) node in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5ST_ptr_t
+H5ST_findfirst_internal(H5ST_ptr_t p)
+{
+    H5ST_ptr_t ret_value = NULL;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    while(p) {
+        /* Find least node in current tree */
+        while(p->lokid)
+            p = p->lokid;
+
+        /* Is least node '\0'? */
+        if(p->splitchar == '\0') {
+            /* Return it */
+            HGOTO_DONE(p);
+        } /* end if */
+        else {
+            /* Go down to next level of tree */
+            p = p->eqkid;
+        } /* end else */
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_findfirst_internal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_findfirst
+ PURPOSE
+    Find the first node in a TST
+ USAGE
+    H5ST_ptr_t H5ST_findfirst(tree)
+        H5ST_tree_t *tree;      IN: TST to locate first node within
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Get the first (lexicographically) node in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5ST_ptr_t
+H5ST_findfirst(H5ST_tree_t *tree)
+{
+    H5ST_ptr_t ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(NULL == (ret_value = H5ST_findfirst_internal(tree->root)))
+        HGOTO_ERROR(H5E_TST,H5E_NOTFOUND,NULL,"no nodes in TST");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_findfirst() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_getnext
+ PURPOSE
+    Internal routine to find the next node in a given level of a TST
+ USAGE
+    H5ST_ptr_t H5ST_getnext(p)
+        H5ST_ptr_t *p;       IN: Pointer to node to find next node from
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Get the next (lexicographically) node in the current level of a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5ST_ptr_t
+H5ST_getnext(H5ST_ptr_t p)
+{
+    H5ST_ptr_t ret_value = NULL;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* If the node to continue from has higher-valued nodes attached */
+    if(p->hikid) {
+        /* Go to first higher-valued node */
+        p = p->hikid;
+
+        /* Find least node from here */
+        while(p->lokid)
+            p = p->lokid;
+        HGOTO_DONE(p);
+    } /* end if */
+    else {
+        H5ST_ptr_t q;           /* Temporary TST node pointer */
+
+        /* Go up one level in current tree */
+        q = p->parent;
+        if(q == NULL)
+            HGOTO_DONE(NULL);
+
+        /* While the previous node was the higher-valued node, keep backing up the tree */
+        while(q->hikid == p) {
+            p = q;
+            q = p->parent;
+            if(NULL == q)
+                HGOTO_DONE(NULL);
+        } /* end while */
+        HGOTO_DONE(q);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_getnext() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_findnext
+ PURPOSE
+    Find the next node from a node in a TST
+ USAGE
+    H5ST_ptr_t H5ST_findnext(p)
+        H5ST_ptr_t p;       IN: Current node to continue from
+ RETURNS
+    Success: Non-NULL
+    Failure: NULL
+ DESCRIPTION
+    Get the next (lexicographically) node in a TST
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5ST_ptr_t
+H5ST_findnext(H5ST_ptr_t p)
+{
+    H5ST_ptr_t q;               /* Temporary pointer to TST node */
+    H5ST_ptr_t ret_value = NULL;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Find the next node at the current level, or go back up the tree */
+    do {
+        q = H5ST_getnext(p);
+        if(q) {
+            HGOTO_DONE(H5ST_findfirst_internal(q->eqkid));
+        } /* end if */
+        else
+            p = p->up;
+    } while(p);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_findnext() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_delete_internal
+ PURPOSE
+    Delete a node from a TST
+ USAGE
+    herr_t H5ST_delete_internal(root,p)
+        H5ST_ptr_t *root;       IN/OUT: Root of TST to delete node from
+        H5ST_ptr_t p;       IN: Node to delete
+ RETURNS
+    Success: Non-negative
+    Failure: Negative
+ DESCRIPTION
+    Delete a node from a TST.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This should be the final node for a string.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5ST_delete_internal(H5ST_ptr_t *root, H5ST_ptr_t p)
+{
+    H5ST_ptr_t q,               /* Temporary pointer to TST node */
+        newp;                   /* Pointer to node which will replace deleted node in tree */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Find node to replace one being deleted */
+    if(p->lokid) {
+        /* If the deleted node has lo & hi kids, attach them together */
+        if(p->hikid) {
+            q = p->lokid;
+            while(q->hikid)
+                q = q->hikid;
+            q->hikid = p->hikid;
+            p->hikid->parent = q;
+        } /* end if */
+        newp = p->lokid;
+    } /* end if */
+    else if(p->hikid) {
+        newp = p->hikid;
+    } /* end if */
+    else {
+        newp = NULL;
+    } /* end else */
+
+    /* Deleted node is in middle of tree */
+    if(p->parent) {
+        /* Attach new node to correct side of parent */
+        if(p == p->parent->lokid)
+            p->parent->lokid = newp;
+        else
+            p->parent->hikid = newp;
+        if(newp)
+            newp->parent = p->parent;
+    } /* end if */
+    else {
+        if(newp)
+            newp->parent = p->parent;
+        if(p->up) {
+            p->up->eqkid = newp;
+
+            /* If we deleted the last node in the TST, delete the upper node also */
+            if(NULL == newp)
+                H5ST_delete_internal(root, p->up);
+        } /* end if */
+        else /* Deleted last node at top level of tree */
+            *root = newp;
+    } /* end else */
+
+    p = H5FL_FREE(H5ST_node_t, p);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5ST_delete_internal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_delete
+ PURPOSE
+    Delete a node from a TST
+ USAGE
+    herr_t H5ST_delete(tree,p)
+        H5ST_tree_t *tree;  IN/OUT: TST to delete node from
+        H5ST_ptr_t p;       IN: Node to delete
+ RETURNS
+    Success: Non-negative
+    Failure: Negative
+ DESCRIPTION
+    Delete a node from a TST.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This should be the final node for a string.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5ST_delete(H5ST_tree_t *tree, H5ST_ptr_t p)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5ST_delete_internal(&tree->root, p) < 0)
+        HGOTO_ERROR(H5E_TST, H5E_CANTDELETE, FAIL, "can't delete node from TST")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5ST_delete() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_remove
+ PURPOSE
+    Remove a node from a TST
+ USAGE
+    void *H5ST_remove(tree,s)
+        H5ST_tree_t *tree;  IN/OUT: TST to remove node from
+        const char *s;      IN: String of key for node to remove
+ RETURNS
+    Success: Non-NULL, pointer to object stored for key
+    Failure: Negative
+ DESCRIPTION
+    Remove a node from a TST, returning the object from the node.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *
+H5ST_remove(H5ST_tree_t *tree, const char *s)
+{
+    H5ST_ptr_t node;    /* Pointer to node to remove */
+    void *ret_value;    /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Locate the node to remove */
+    if(NULL == (node = H5ST_find_internal(tree->root, s)))
+        HGOTO_ERROR(H5E_TST, H5E_NOTFOUND, NULL, "key not found in TST")
+
+    /* Get the pointer to the object to return */
+    ret_value = node->eqkid;
+
+    /* Remove the node from the TST */
+    if(H5ST_delete_internal(&tree->root, node) < 0)
+        HGOTO_ERROR(H5E_TST, H5E_CANTDELETE, NULL, "can't delete node from TST")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5ST_remove() */
+
+#ifdef H5ST_DEBUG
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_dump_internal
+ PURPOSE
+    Dump all the nodes of a TST
+ USAGE
+    herr_t H5ST_dump(p)
+        H5ST_ptr_t p;   IN: Root of TST to dump
+ RETURNS
+    Success: Non-negative
+    Failure: Negative
+ DESCRIPTION
+    Dump information for a TST.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5ST_dump_internal(H5ST_ptr_t p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(p) {
+        printf("p=%p\n", p);
+        printf("\tp->up=%p\n", p->up);
+        printf("\tp->parent=%p\n", p->parent);
+        printf("\tp->lokid=%p\n", p->lokid);
+        printf("\tp->hikid=%p\n", p->hikid);
+        printf("\tp->eqkid=%p\n", p->eqkid);
+        printf("\tp->splitchar=%c\n", p->splitchar);
+
+        H5ST_dump_internal(p->lokid);
+        if(p->splitchar)
+            H5ST_dump_internal(p->eqkid);
+        else
+            printf("%s\n", (char *)p->eqkid);
+        H5ST_dump_internal(p->hikid);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5ST_dump_internal() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5ST_dump
+ PURPOSE
+    Dump all the nodes of a TST
+ USAGE
+    herr_t H5ST_dump(tree)
+        H5ST_tree_t *tree;      IN: TST to dump
+ RETURNS
+    Success: Non-negative
+    Failure: Negative
+ DESCRIPTION
+    Dump information for a TST.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5ST_dump(H5ST_tree_t *tree)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Dump the tree */
+    H5ST_dump_internal(tree->root);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5ST_dump() */
+#endif /* H5ST_DEBUG */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5STprivate.h b/gatb-core/thirdparty/hdf5/src/H5STprivate.h
new file mode 100644
index 0000000..892f04a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5STprivate.h
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5ST module
+ */
+#ifndef _H5STprivate_H
+#define _H5STprivate_H
+
+#ifdef LATER
+#include "H5STpublic.h"
+#endif /* LATER */
+
+/* Private headers needed by this file */
+#include "H5private.h"
+
+/* Typedefs */
+
+/* Internal nodes for TST */
+typedef struct H5ST_node *H5ST_ptr_t;
+typedef struct H5ST_node {
+    char splitchar;             /* Character represented at node */
+    H5ST_ptr_t up;              /* Pointer to the node in the tree above (before) this node */
+    H5ST_ptr_t parent;          /* Pointer to the next higher tree node in this tree */
+    H5ST_ptr_t lokid;           /* Pointer to the lower node from this one, in this tree */
+    H5ST_ptr_t eqkid;           /* Pointer to the parent node in the next tree down (after) this node */
+    H5ST_ptr_t hikid;           /* Pointer to the higher node from this one, in this tree */
+} H5ST_node_t;
+
+/* Wrapper about TST */
+typedef struct {
+    H5ST_ptr_t root;            /* Pointer to actual TST */
+} H5ST_tree_t;
+
+/* Macro to access "data" pointer in H5ST_node_t's returned from functions */
+#define H5ST_NODE_DATA(p)       ((void *)(p->eqkid))
+
+/* Private routines */
+H5_DLL H5ST_tree_t *H5ST_create(void);
+H5_DLL herr_t H5ST_close(H5ST_tree_t *p);
+H5_DLL herr_t H5ST_insert(H5ST_tree_t *root, const char *s, void *obj);
+H5_DLL htri_t H5ST_search(H5ST_tree_t *root, const char *s);
+H5_DLL H5ST_ptr_t H5ST_find(H5ST_tree_t *root, const char *s);
+H5_DLL void *H5ST_locate(H5ST_tree_t *root, const char *s);
+H5_DLL H5ST_ptr_t H5ST_findfirst(H5ST_tree_t *p);
+H5_DLL H5ST_ptr_t H5ST_findnext(H5ST_ptr_t p);
+H5_DLL void *H5ST_remove(H5ST_tree_t *root, const char *s);
+H5_DLL herr_t H5ST_delete(H5ST_tree_t *root, H5ST_ptr_t p);
+H5_DLL herr_t H5ST_dump(H5ST_ptr_t p);
+
+#endif /* _H5STprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Sall.c b/gatb-core/thirdparty/hdf5/src/H5Sall.c
new file mode 100644
index 0000000..2d2e5fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Sall.c
@@ -0,0 +1,988 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Tuesday, June 16, 1998
+ *
+ * Purpose:	"All" selection data space I/O functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		        */
+#include "H5Iprivate.h"		/* ID Functions		                */
+#include "H5Spkg.h"		/* Dataspace functions			*/
+#include "H5VMprivate.h"         /* Vector functions                     */
+
+/* Static function prototypes */
+
+/* Selection callbacks */
+static herr_t H5S_all_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+static herr_t H5S_all_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+static herr_t H5S_all_release(H5S_t *space);
+static htri_t H5S_all_is_valid(const H5S_t *space);
+static hssize_t H5S_all_serial_size(const H5S_t *space);
+static herr_t H5S_all_serialize(const H5S_t *space, uint8_t *buf);
+static herr_t H5S_all_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_all_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
+static herr_t H5S_all_offset(const H5S_t *space, hsize_t *off);
+static htri_t H5S_all_is_contiguous(const H5S_t *space);
+static htri_t H5S_all_is_single(const H5S_t *space);
+static htri_t H5S_all_is_regular(const H5S_t *space);
+static herr_t H5S_all_adjust_u(H5S_t *space, const hsize_t *offset);
+static herr_t H5S_all_project_scalar(const H5S_t *space, hsize_t *offset);
+static herr_t H5S_all_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+static herr_t H5S_all_iter_init(H5S_sel_iter_t *iter, const H5S_t *space);
+
+/* Selection iteration callbacks */
+static herr_t H5S_all_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
+static herr_t H5S_all_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static hsize_t H5S_all_iter_nelmts(const H5S_sel_iter_t *iter);
+static htri_t H5S_all_iter_has_next_block(const H5S_sel_iter_t *iter);
+static herr_t H5S_all_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
+static herr_t H5S_all_iter_next_block(H5S_sel_iter_t *sel_iter);
+static herr_t H5S_all_iter_release(H5S_sel_iter_t *sel_iter);
+
+/* Selection properties for "all" selections */
+const H5S_select_class_t H5S_sel_all[1] = {{
+    H5S_SEL_ALL,
+
+    /* Methods on selection */
+    H5S_all_copy,
+    H5S_all_get_seq_list,
+    H5S_all_release,
+    H5S_all_is_valid,
+    H5S_all_serial_size,
+    H5S_all_serialize,
+    H5S_all_deserialize,
+    H5S_all_bounds,
+    H5S_all_offset,
+    H5S_all_is_contiguous,
+    H5S_all_is_single,
+    H5S_all_is_regular,
+    H5S_all_adjust_u,
+    H5S_all_project_scalar,
+    H5S_all_project_simple,
+    H5S_all_iter_init,
+}};
+
+/* Iteration properties for "all" selections */
+static const H5S_sel_iter_class_t H5S_sel_iter_all[1] = {{
+    H5S_SEL_ALL,
+
+    /* Methods on selection iterator */
+    H5S_all_iter_coords,
+    H5S_all_iter_block,
+    H5S_all_iter_nelmts,
+    H5S_all_iter_has_next_block,
+    H5S_all_iter_next,
+    H5S_all_iter_next_block,
+    H5S_all_iter_release,
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_iter_init
+ *
+ * Purpose:	Initializes iteration information for "all" selection.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_all_iter_init (H5S_sel_iter_t *iter, const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (space && H5S_SEL_ALL==H5S_GET_SELECT_TYPE(space));
+    HDassert (iter);
+
+    /* Initialize the number of elements to iterate over */
+    iter->elmt_left=H5S_GET_SELECT_NPOINTS(space);
+
+    /* Start at the upper left location */
+    iter->u.all.elmt_offset=0;
+    iter->u.all.byte_offset=0;
+
+    /* Initialize type of selection iterator */
+    iter->type=H5S_sel_iter_all;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_iter_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_iter_coords
+ *
+ * Purpose:	Retrieve the current coordinates of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_all_iter_coords (const H5S_sel_iter_t *iter, hsize_t *coords)
+{
+    herr_t ret_value=SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert (iter);
+    HDassert (coords);
+
+    /* Calculate the coordinates for the current iterator offset */
+    if(H5VM_array_calc(iter->u.all.elmt_offset,iter->rank,iter->dims,coords)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve coordinates");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_all_iter_coords() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_iter_block
+ *
+ * Purpose:	Retrieve the current block of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 2, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_all_iter_block (const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
+{
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+    HDassert (start);
+    HDassert (end);
+
+    for(u=0; u<iter->rank; u++) {
+        /* Set the start of the 'all' block */
+        /* (Always '0' coordinates for now) */
+        start[u]=0;
+
+        /* Compute the end of the 'all' block */
+        /* (Always size of the extent for now) */
+        end[u]=iter->dims[u]-1;
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_iter_coords() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_iter_nelmts
+ *
+ * Purpose:	Return number of elements left to process in iterator
+ *
+ * Return:	non-negative number of elements on success, zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5S_all_iter_nelmts (const H5S_sel_iter_t *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+
+    FUNC_LEAVE_NOAPI(iter->elmt_left)
+}   /* H5S_all_iter_nelmts() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_iter_next
+ PURPOSE
+    Check if there is another block left in the current iterator
+ USAGE
+    htri_t H5S_all_iter_has_next_block(iter)
+        const H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative (TRUE/FALSE) on success/Negative on failure
+ DESCRIPTION
+    Check if there is another block available in the selection iterator.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_all_iter_has_next_block (const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+
+    FUNC_LEAVE_NOAPI(FALSE)
+}   /* H5S_all_iter_has_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_iter_next
+ PURPOSE
+    Increment selection iterator
+ USAGE
+    herr_t H5S_all_iter_next(iter, nelem)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+        size_t nelem;               IN: Number of elements to advance by
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the NELEM'th next element in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_iter_next(H5S_sel_iter_t *iter, size_t nelem)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+    HDassert (nelem>0);
+
+    /* Increment the iterator */
+    iter->u.all.elmt_offset+=nelem;
+    iter->u.all.byte_offset+=(nelem*iter->elmt_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_iter_next() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_iter_next_block
+ PURPOSE
+    Increment selection iterator to next block
+ USAGE
+    herr_t H5S_all_iter_next_block(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the next block in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_iter_next_block(H5S_sel_iter_t H5_ATTR_UNUSED *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_all_iter_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_iter_release
+ PURPOSE
+    Release "all" selection iterator information for a dataspace
+ USAGE
+    herr_t H5S_all_iter_release(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all information for a dataspace "all" selection iterator
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_iter_release (H5S_sel_iter_t H5_ATTR_UNUSED * iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert (iter);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_iter_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_release
+ PURPOSE
+    Release all selection information for a dataspace
+ USAGE
+    herr_t H5S_all_release(space)
+        H5S_t *space;       IN: Pointer to dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases "all" selection information for a dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_release(H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    /* Reset the number of elements in the selection */
+    space->select.num_elem = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_copy
+ PURPOSE
+    Copy a selection from one dataspace to another
+ USAGE
+    herr_t H5S_all_copy(dst, src)
+        H5S_t *dst;  OUT: Pointer to the destination dataspace
+        H5S_t *src;  IN: Pointer to the source dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Copies the 'all' selection information from the source
+    dataspace to the destination dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_copy(H5S_t *dst, const H5S_t H5_ATTR_UNUSED *src, hbool_t H5_ATTR_UNUSED share_selection)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(src);
+    HDassert(dst);
+
+    /* Set number of elements in selection */
+    dst->select.num_elem = (hsize_t)H5S_GET_EXTENT_NPOINTS(dst);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_all_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_is_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_all_is_valid(space);
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.  Offset is irrelevant for this type of selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_all_is_valid (const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+} /* end H5S_all_is_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_serial_size
+ PURPOSE
+    Determine the number of bytes needed to store the serialized "all"
+        selection information.
+ USAGE
+    hssize_t H5S_all_serial_size(space)
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    The number of bytes required on success, negative on an error.
+ DESCRIPTION
+    Determines the number of bytes required to serialize an "all"
+    selection for storage on disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hssize_t
+H5S_all_serial_size (const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Basic number of bytes required to serialize point selection:
+     *  <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+     *      <length (4 bytes)> = 16 bytes
+     */
+    FUNC_LEAVE_NOAPI(16)
+} /* end H5S_all_serial_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_serialize
+ PURPOSE
+    Serialize the current selection into a user-provided buffer.
+ USAGE
+    herr_t H5S_all_serialize(space, buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to serialize
+        uint8 *buf;             OUT: Buffer to put serialized selection into
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Serializes the current element selection into a buffer.  (Primarily for
+    storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_serialize (const H5S_t *space, uint8_t *buf)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Store the preamble information */
+    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the additional information length */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_serialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_deserialize
+ PURPOSE
+    Deserialize the current selection from a user-provided buffer.
+ USAGE
+    herr_t H5S_all_deserialize(space, buf)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
+        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Deserializes the current selection into a buffer.  (Primarily for retrieving
+    from disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_deserialize(H5S_t *space, const uint8_t H5_ATTR_UNUSED *buf)
+{
+    herr_t ret_value;   /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(space);
+
+    /* Change to "all" selection */
+    if((ret_value = H5S_select_all(space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_all_deserialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_all_bounds(space, start, end)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t *start;         OUT: Starting coordinate of bounding box
+        hsize_t *end;           OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).  Calling this function on a "none" selection
+    returns fail.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
+{
+    unsigned rank;                  /* Dataspace rank */
+    unsigned i;                     /* index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    /* Get the dataspace extent rank */
+    rank = space->extent.rank;
+
+    /* Just copy over the complete extent */
+    for(i = 0; i < rank; i++) {
+        start[i] = 0;
+        end[i] = space->extent.size[i] - 1;
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_offset
+ PURPOSE
+    Gets the linear offset of the first element for the selection.
+ USAGE
+    herr_t H5S_all_offset(space, offset)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+        hsize_t *offset;        OUT: Linear offset of first element in selection
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the linear offset (in "units" of elements) of the first element
+    selected within the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Calling this function on a "none" selection returns fail.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_offset(const H5S_t H5_ATTR_UNUSED *space, hsize_t *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(offset);
+
+    /* 'All' selections always start at offset 0 */
+    *offset = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_is_contiguous
+ PURPOSE
+    Check if a "all" selection is contiguous within the dataspace extent.
+ USAGE
+    htri_t H5S_all_is_contiguous(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is contiguous.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_all_is_contiguous(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+}   /* H5S_all_is_contiguous() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_is_single
+ PURPOSE
+    Check if a "all" selection is a single block within the dataspace extent.
+ USAGE
+    htri_t H5S_all_is_single(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is a single block.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_all_is_single(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+}   /* H5S_all_is_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_is_regular
+ PURPOSE
+    Check if a "all" selection is "regular"
+ USAGE
+    htri_t H5S_all_is_regular(space)
+        const H5S_t *space;     IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in a dataspace is the a regular
+    pattern.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_all_is_regular(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+}   /* H5S_all_is_regular() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_adjust_u
+ PURPOSE
+    Adjust an "all" selection by subtracting an offset
+ USAGE
+    herr_t H5S_all_adjust_u(space, offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hsize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_adjust_u(H5S_t H5_ATTR_UNUSED *space, const hsize_t H5_ATTR_UNUSED *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(offset);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_adjust_u() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_project_scalar
+ *
+ * Purpose:	Projects a single element 'all' selection into a scalar
+ *              dataspace
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_all_project_scalar(const H5S_t H5_ATTR_UNUSED *space, hsize_t *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space && H5S_SEL_ALL == H5S_GET_SELECT_TYPE(space));
+    HDassert(offset);
+
+    /* Set offset of selection in projected buffer */
+    *offset = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_all_project_scalar() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_all_project_simple
+ *
+ * Purpose:	Projects an 'all' selection onto/into a simple dataspace
+ *              of a different rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_all_project_simple(const H5S_t *base_space, H5S_t *new_space, hsize_t *offset)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_ALL == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(offset);
+
+    /* Select the entire new space */
+    if(H5S_select_all(new_space, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to set all selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_all_project_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_all
+ PURPOSE
+    Specify the the entire extent is selected
+ USAGE
+    herr_t H5S_select_all(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+        hbool_t rel_prev;      IN: Flag whether to release previous selection or not
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function selects the entire extent for a dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_all(H5S_t *space, hbool_t rel_prev)
+{
+    herr_t ret_value = SUCCEED;  /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+
+    /* Remove current selection first */
+    if(rel_prev)
+        if(H5S_SELECT_RELEASE(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* Set number of elements in selection */
+    space->select.num_elem = (hsize_t)H5S_GET_EXTENT_NPOINTS(space);
+
+    /* Set selection type */
+    space->select.type = H5S_sel_all;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_all() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_all
+ PURPOSE
+    Specify the the entire extent is selected
+ USAGE
+    herr_t H5Sselect_all(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function selects the entire extent for a dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_all(hid_t spaceid)
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+    /* Call internal routine to do the work */
+    if(H5S_select_all(space, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sselect_all() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_all_get_seq_list
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_all_get_seq_list(space,flags,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        unsigned flags;         IN: Flags for extra information about operation
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_all_get_seq_list(const H5S_t H5_ATTR_UNUSED *space, unsigned H5_ATTR_UNUSED flags, H5S_sel_iter_t *iter,
+    size_t H5_ATTR_UNUSED maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    size_t elem_used;           /* The number of elements used */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq>0);
+    HDassert(maxelem>0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Determine the actual number of elements to use */
+    H5_CHECK_OVERFLOW(iter->elmt_left,hsize_t,size_t);
+    elem_used=MIN(maxelem,(size_t)iter->elmt_left);
+
+    /* Compute the offset in the dataset */
+    off[0]=iter->u.all.byte_offset;
+    len[0]=elem_used*iter->elmt_size;
+
+    /* Should only need one sequence for 'all' selections */
+    *nseq=1;
+
+    /* Set the number of elements used */
+    *nelem=elem_used;
+
+    /* Update the iterator */
+    iter->elmt_left-=elem_used;
+    iter->u.all.elmt_offset+=elem_used;
+    iter->u.all.byte_offset+=len[0];
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_all_get_seq_list() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Sdbg.c b/gatb-core/thirdparty/hdf5/src/H5Sdbg.c
new file mode 100644
index 0000000..0cbe4f2
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Sdbg.c
@@ -0,0 +1,125 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Sdbg.c
+ *			Jul 24 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Dump debugging information about a dataspace
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Spkg.h"		/* Dataspaces         			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_debug
+ *
+ * Purpose:	Prints debugging information about a data space.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, July 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream, int indent,
+    int fwidth)
+{
+    const H5S_t	*mesg = (const H5S_t*)_mesg;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    switch(H5S_GET_EXTENT_TYPE(mesg)) {
+        case H5S_NULL:
+            fprintf(stream, "%*s%-*s H5S_NULL\n", indent, "", fwidth,
+                    "Space class:");
+            break;
+
+        case H5S_SCALAR:
+            fprintf(stream, "%*s%-*s H5S_SCALAR\n", indent, "", fwidth,
+                    "Space class:");
+            break;
+
+        case H5S_SIMPLE:
+            fprintf(stream, "%*s%-*s H5S_SIMPLE\n", indent, "", fwidth,
+                    "Space class:");
+            H5O_debug_id(H5O_SDSPACE_ID, f, dxpl_id, &(mesg->extent), stream,
+                                 indent + 3, MAX(0, fwidth - 3));
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            fprintf(stream, "%*s%-*s **UNKNOWN-%ld**\n", indent, "", fwidth,
+                    "Space class:", (long)(H5S_GET_EXTENT_TYPE(mesg)));
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Shyper.c b/gatb-core/thirdparty/hdf5/src/H5Shyper.c
new file mode 100644
index 0000000..cde58e6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Shyper.c
@@ -0,0 +1,8858 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Thursday, June 18, 1998
+ *
+ * Purpose:	Hyperslab selection data space I/O functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling			*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5Iprivate.h"		/* ID Functions				*/
+#include "H5Spkg.h"		/* Dataspace functions			*/
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+/* Local datatypes */
+
+/* Static function prototypes */
+static herr_t H5S_hyper_free_span_info(H5S_hyper_span_info_t *span_info);
+static herr_t H5S_hyper_free_span(H5S_hyper_span_t *span);
+static H5S_hyper_span_info_t *H5S_hyper_copy_span(H5S_hyper_span_info_t *spans);
+static void H5S_hyper_span_scratch(H5S_hyper_span_info_t *spans, void *scr_value);
+static herr_t H5S_hyper_span_precompute(H5S_hyper_span_info_t *spans, size_t elmt_size);
+static herr_t H5S_generate_hyperslab(H5S_t *space, H5S_seloper_t op,
+    const hsize_t start[], const hsize_t stride[], const hsize_t count[], const hsize_t block[]);
+static herr_t H5S_hyper_generate_spans(H5S_t *space);
+/* Needed for use in hyperslab code (H5Shyper.c) */
+#ifdef NEW_HYPERSLAB_API
+static herr_t H5S_select_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2);
+#endif /*NEW_HYPERSLAB_API*/
+
+/* Selection callbacks */
+static herr_t H5S_hyper_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+static herr_t H5S_hyper_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+static herr_t H5S_hyper_release(H5S_t *space);
+static htri_t H5S_hyper_is_valid(const H5S_t *space);
+static hssize_t H5S_hyper_serial_size(const H5S_t *space);
+static herr_t H5S_hyper_serialize(const H5S_t *space, uint8_t *buf);
+static herr_t H5S_hyper_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_hyper_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
+static herr_t H5S_hyper_offset(const H5S_t *space, hsize_t *offset);
+static htri_t H5S_hyper_is_contiguous(const H5S_t *space);
+static htri_t H5S_hyper_is_single(const H5S_t *space);
+static htri_t H5S_hyper_is_regular(const H5S_t *space);
+static herr_t H5S_hyper_adjust_u(H5S_t *space, const hsize_t *offset);
+static herr_t H5S_hyper_project_scalar(const H5S_t *space, hsize_t *offset);
+static herr_t H5S_hyper_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+static herr_t H5S_hyper_iter_init(H5S_sel_iter_t *iter, const H5S_t *space);
+
+/* Selection iteration callbacks */
+static herr_t H5S_hyper_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
+static herr_t H5S_hyper_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static hsize_t H5S_hyper_iter_nelmts(const H5S_sel_iter_t *iter);
+static htri_t H5S_hyper_iter_has_next_block(const H5S_sel_iter_t *sel_iter);
+static herr_t H5S_hyper_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
+static herr_t H5S_hyper_iter_next_block(H5S_sel_iter_t *sel_iter);
+static herr_t H5S_hyper_iter_release(H5S_sel_iter_t *sel_iter);
+
+/* Static function for optimizing hyperslab */
+static hbool_t H5S_hyper_rebuild_helper(const H5S_hyper_span_t *span,
+    H5S_hyper_dim_t span_slab_info[], unsigned rank);
+static htri_t H5S_hyper_rebuild(H5S_t *space);
+
+/* Selection properties for hyperslab selections */
+const H5S_select_class_t H5S_sel_hyper[1] = {{
+    H5S_SEL_HYPERSLABS,
+
+    /* Methods on selection */
+    H5S_hyper_copy,
+    H5S_hyper_get_seq_list,
+    H5S_hyper_release,
+    H5S_hyper_is_valid,
+    H5S_hyper_serial_size,
+    H5S_hyper_serialize,
+    H5S_hyper_deserialize,
+    H5S_hyper_bounds,
+    H5S_hyper_offset,
+    H5S_hyper_is_contiguous,
+    H5S_hyper_is_single,
+    H5S_hyper_is_regular,
+    H5S_hyper_adjust_u,
+    H5S_hyper_project_scalar,
+    H5S_hyper_project_simple,
+    H5S_hyper_iter_init,
+}};
+
+/* Iteration properties for hyperslab selections */
+static const H5S_sel_iter_class_t H5S_sel_iter_hyper[1] = {{
+    H5S_SEL_HYPERSLABS,
+
+    /* Methods on selection iterator */
+    H5S_hyper_iter_coords,
+    H5S_hyper_iter_block,
+    H5S_hyper_iter_nelmts,
+    H5S_hyper_iter_has_next_block,
+    H5S_hyper_iter_next,
+    H5S_hyper_iter_next_block,
+    H5S_hyper_iter_release,
+}};
+
+/* Static variables */
+
+/* Array for default stride, block, etc. */
+static const hsize_t _ones[H5O_LAYOUT_NDIMS]={
+    1,1,1,1, 1,1,1,1,
+    1,1,1,1, 1,1,1,1,
+    1,1,1,1, 1,1,1,1,
+    1,1,1,1, 1,1,1,1,1};
+
+/* Declare a free list to manage the H5S_hyper_sel_t struct */
+H5FL_DEFINE_STATIC(H5S_hyper_sel_t);
+
+/* Declare a free list to manage the H5S_hyper_span_t struct */
+H5FL_DEFINE_STATIC(H5S_hyper_span_t);
+
+/* Declare a free list to manage the H5S_hyper_span_info_t struct */
+H5FL_DEFINE_STATIC(H5S_hyper_span_info_t);
+
+/* #define H5S_HYPER_DEBUG */
+#ifdef H5S_HYPER_DEBUG
+static herr_t
+H5S_hyper_print_spans_helper(FILE *f, struct H5S_hyper_span_t *span,unsigned depth)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    while(span) {
+        HDfprintf(f,"%s: depth=%u, span=%p, (%d, %d), nelem=%u, pstride=%u\n",FUNC,depth,span,(int)span->low,(int)span->high,(unsigned)span->nelem,(unsigned)span->pstride);
+        if(span->down && span->down->head) {
+            HDfprintf(f,"%s: spans=%p, count=%u, scratch=%p, head=%p\n",FUNC,span->down,span->down->count,span->down->scratch,span->down->head);
+            H5S_hyper_print_spans_helper(f,span->down->head,depth+1);
+        } /* end if */
+        span=span->next;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+herr_t
+H5S_hyper_print_spans(FILE *f, const struct H5S_hyper_span_info_t *span_lst)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(span_lst!=NULL) {
+        HDfprintf(f,"%s: spans=%p, count=%u, scratch=%p, head=%p\n",FUNC,span_lst,span_lst->count,span_lst->scratch,span_lst->head);
+        H5S_hyper_print_spans_helper(f,span_lst->head,0);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+herr_t
+H5S_space_print_spans(FILE *f, const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    H5S_hyper_print_spans(f,space->select.sel_info.hslab->span_lst);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+static herr_t
+H5S_hyper_print_diminfo_helper(FILE *f, const char *field, unsigned ndims, const H5S_hyper_dim_t *dinfo)
+{
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(dinfo!=NULL) {
+        HDfprintf(f,"%s: %s: start=[",FUNC,field);
+        for(u=0; u<ndims; u++)
+            HDfprintf(f,"%Hd%s",dinfo[u].start, (u<(ndims-1) ? ", " : "]\n"));
+        HDfprintf(f,"%s: %s: stride=[",FUNC,field);
+        for(u=0; u<ndims; u++)
+            HDfprintf(f,"%Hu%s",dinfo[u].stride, (u<(ndims-1) ? ", " : "]\n"));
+        HDfprintf(f,"%s: %s: count=[",FUNC,field);
+        for(u=0; u<ndims; u++)
+            HDfprintf(f,"%Hu%s",dinfo[u].count, (u<(ndims-1) ? ", " : "]\n"));
+        HDfprintf(f,"%s: %s: block=[",FUNC,field);
+        for(u=0; u<ndims; u++)
+            HDfprintf(f,"%Hu%s",dinfo[u].block, (u<(ndims-1) ? ", " : "]\n"));
+    } /* end if */
+    else
+        HDfprintf(f,"%s: %s==NULL\n",FUNC,field);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+herr_t
+H5S_hyper_print_diminfo(FILE *f, const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    H5S_hyper_print_diminfo_helper(f,"opt_diminfo",space->extent.rank,space->select.sel_info.hslab->opt_diminfo);
+    H5S_hyper_print_diminfo_helper(f,"app_diminfo",space->extent.rank,space->select.sel_info.hslab->app_diminfo);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+#endif /* H5S_HYPER_DEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_init
+ *
+ * Purpose:	Initializes iteration information for hyperslab span tree selection.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, February 24, 2001
+ *
+ * Notes:       If the 'elmt_size' parameter is set to zero, the regular
+ *              hyperslab selection iterator will not be 'flattened'.  This
+ *              is used by the H5S_select_shape_same() code to avoid changing
+ *              the rank and appearance of the selection.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_iter_init(H5S_sel_iter_t *iter, const H5S_t *space)
+{
+    const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+    H5S_hyper_span_info_t *spans;   /* Pointer to hyperslab span info node */
+    unsigned rank;                  /* Dataspace's dimension rank */
+    unsigned u;                     /* Index variable */
+    int i;                          /* Index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(space));
+    HDassert(iter);
+
+    /* Initialize the number of points to iterate over */
+    iter->elmt_left = space->select.num_elem;
+    iter->u.hyp.iter_rank = 0;
+
+    /* Get the rank of the dataspace */
+    rank = space->extent.rank;
+
+    /* Set the temporary pointer to the dimension information */
+    tdiminfo = space->select.sel_info.hslab->opt_diminfo;
+
+    /* Check for the special case of just one H5Sselect_hyperslab call made */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+/* Initialize the information needed for regular hyperslab I/O */
+        const hsize_t *mem_size;    /* Temporary pointer to dataspace extent's dimension sizes */
+        hsize_t acc;                /* Accumulator for "flattened" dimension's sizes */
+        unsigned cont_dim = 0;      /* # of contiguous dimensions */
+
+        /* Set the temporary pointer to the dataspace extent's dimension sizes */
+        mem_size = space->extent.size;
+
+        /*
+         * For a regular hyperslab to be contiguous up to some dimension, it
+         * must have only one block (i.e. count==1 in all dimensions up to that
+         * dimension) and the block size must be the same as the dataspace's
+         * extent in that dimension and all dimensions up to that dimension.
+         */
+
+        /* Don't flatten adjacent elements into contiguous block if the
+         * element size is 0.  This is for the H5S_select_shape_same() code.
+         */
+        if(iter->elmt_size > 0) {
+            /* Check for any "contiguous" blocks that can be flattened */
+            for(u = (rank - 1); u > 0; u--) {
+                if(tdiminfo[u].count == 1 && tdiminfo[u].block == mem_size[u]) {
+                    cont_dim++;
+                    iter->u.hyp.flattened[u] = TRUE;
+                } /* end if */
+                else
+                    iter->u.hyp.flattened[u] = FALSE;
+            } /* end for */
+            iter->u.hyp.flattened[0] = FALSE;
+        } /* end if */
+
+        /* Check if the regular selection can be "flattened" */
+        if(cont_dim > 0) {
+            unsigned last_dim_flattened = 1;    /* Flag to indicate that the last dimension was flattened */
+            unsigned flat_rank = rank-cont_dim; /* Number of dimensions after flattening */
+            unsigned curr_dim;                  /* Current dimension */
+
+            /* Set the iterator's rank to the contiguous dimensions */
+            iter->u.hyp.iter_rank = flat_rank;
+
+            /* "Flatten" dataspace extent and selection information */
+            curr_dim = flat_rank - 1;
+            for(i = (int)rank - 1, acc = 1; i >= 0; i--) {
+                if(tdiminfo[i].block == mem_size[i] && i > 0) {
+                    /* "Flatten" this dimension */
+                    HDassert(tdiminfo[i].start == 0);
+                    acc *= mem_size[i];
+
+                    /* Indicate that the dimension was flattened */
+                    last_dim_flattened = 1;
+                } /* end if */
+                else {
+                    if(last_dim_flattened) {
+                        /* First dimension after flattened dimensions */
+                        iter->u.hyp.diminfo[curr_dim].start = tdiminfo[i].start * acc;
+
+                        /* Special case for single block regular selections */
+                        if(tdiminfo[i].count == 1)
+                            iter->u.hyp.diminfo[curr_dim].stride = 1;
+                        else
+                            iter->u.hyp.diminfo[curr_dim].stride = tdiminfo[i].stride * acc;
+                        iter->u.hyp.diminfo[curr_dim].count = tdiminfo[i].count;
+                        iter->u.hyp.diminfo[curr_dim].block = tdiminfo[i].block * acc;
+                        iter->u.hyp.size[curr_dim] = mem_size[i] * acc;
+                        iter->u.hyp.sel_off[curr_dim] = space->select.offset[i] * (hssize_t)acc;
+
+                        /* Reset the "last dim flattened" flag to avoid flattened any further dimensions */
+                        last_dim_flattened = 0;
+
+                        /* Reset the "accumulator" for possible further dimension flattening */
+                        acc = 1;
+                    } /* end if */
+                    else {
+                        /* All other dimensions */
+                        iter->u.hyp.diminfo[curr_dim].start = tdiminfo[i].start;
+                        iter->u.hyp.diminfo[curr_dim].stride = tdiminfo[i].stride;
+                        iter->u.hyp.diminfo[curr_dim].count = tdiminfo[i].count;
+                        iter->u.hyp.diminfo[curr_dim].block = tdiminfo[i].block;
+                        iter->u.hyp.size[curr_dim] = mem_size[i];
+                        iter->u.hyp.sel_off[curr_dim] = space->select.offset[i];
+                    } /* end else */
+
+                    /* Decrement "current" flattened dimension */
+                    curr_dim--;
+                } /* end if */
+            } /* end for */
+
+            /* Initialize "flattened" iterator offset to initial location and dataspace extent and selection information to correct values */
+            for(u = 0; u < flat_rank; u++)
+                iter->u.hyp.off[u] = iter->u.hyp.diminfo[u].start;
+        } /* end if */
+        else {
+            /* Initialize position to initial location */
+            /* Also make local copy of the regular selection information */
+            for(u = 0; u < rank; u++) {
+                /* Regular selection information */
+                iter->u.hyp.diminfo[u].start = tdiminfo[u].start;
+                iter->u.hyp.diminfo[u].stride = tdiminfo[u].stride;
+                iter->u.hyp.diminfo[u].count = tdiminfo[u].count;
+                iter->u.hyp.diminfo[u].block = tdiminfo[u].block;
+
+                /* Position information */
+                iter->u.hyp.off[u] = tdiminfo[u].start;
+            } /* end if */
+        } /* end else */
+
+        /* Flag the diminfo information as valid in the iterator */
+        iter->u.hyp.diminfo_valid = TRUE;
+
+        /* Initialize irregular region information also (for release) */
+        iter->u.hyp.spans = NULL;
+    } /* end if */
+    else {
+/* Initialize the information needed for non-regular hyperslab I/O */
+        HDassert(space->select.sel_info.hslab->span_lst);
+        /* Make a copy of the span tree to iterate over */
+        iter->u.hyp.spans = H5S_hyper_copy_span(space->select.sel_info.hslab->span_lst);
+
+        /* Set the nelem & pstride values according to the element size */
+        H5S_hyper_span_precompute(iter->u.hyp.spans,iter->elmt_size);
+
+        /* Initialize the starting span_info's and spans */
+        spans = iter->u.hyp.spans;
+        for(u = 0; u < rank; u++) {
+            /* Set the pointers to the initial span in each dimension */
+            HDassert(spans);
+            HDassert(spans->head);
+
+            /* Set the pointer to the first span in the list for this node */
+            iter->u.hyp.span[u] = spans->head;
+
+            /* Set the initial offset to low bound of span */
+            iter->u.hyp.off[u] = iter->u.hyp.span[u]->low;
+
+            /* Get the pointer to the next level down */
+            spans = spans->head->down;
+        } /* end for */
+
+        /* Flag the diminfo information as not valid in the iterator */
+        iter->u.hyp.diminfo_valid = FALSE;
+    } /* end else */
+
+    /* Initialize type of selection iterator */
+    iter->type = H5S_sel_iter_hyper;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_iter_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_coords
+ *
+ * Purpose:	Retrieve the current coordinates of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_iter_coords (const H5S_sel_iter_t *iter, hsize_t *coords)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(coords);
+
+    /* Copy the offset of the current point */
+
+    /* Check for a single "regular" hyperslab */
+    if(iter->u.hyp.diminfo_valid) {
+        /* Check if this is a "flattened" regular hyperslab selection */
+        if(iter->u.hyp.iter_rank != 0 && iter->u.hyp.iter_rank < iter->rank) {
+            int u, v;           /* Dimension indices */
+
+            /* Set the starting rank of both the "natural" & "flattened" dimensions */
+            u = (int)iter->rank - 1;
+            v = (int)iter->u.hyp.iter_rank - 1;
+
+            /* Construct the "natural" dimensions from a set of flattened coordinates */
+            while(u >= 0) {
+                if(iter->u.hyp.flattened[u]) {
+                    int begin = u;      /* The rank of the first flattened dimension */
+
+                    /* Walk up through as many flattened dimensions as possible */
+                    do {
+                        u--;
+                    } while(u >= 0 && iter->u.hyp.flattened[u]);
+
+                    /* Compensate for possibly overshooting dim 0 */
+                    if(u < 0)
+                        u = 0;
+
+                    /* Sanity check */
+                    HDassert(v >= 0);
+
+                    /* Compute the coords for the flattened dimensions */
+                    H5VM_array_calc(iter->u.hyp.off[v], (unsigned)((begin - u) + 1), &(iter->dims[u]), &(coords[u]));
+
+                    /* Continue to faster dimension in both indices */
+                    u--;
+                    v--;
+                } /* end if */
+                else {
+                    /* Walk up through as many non-flattened dimensions as possible */
+                    while(u >= 0 && !iter->u.hyp.flattened[u]) {
+                        /* Sanity check */
+                        HDassert(v >= 0);
+
+                        /* Copy the coordinate */
+                        coords[u] = iter->u.hyp.off[v];
+
+                        /* Continue to faster dimension in both indices */
+                        u--;
+                        v--;
+                    } /* end while */
+                } /* end else */
+            } /* end while */
+            HDassert(v < 0);
+        } /* end if */
+        else
+            HDmemcpy(coords, iter->u.hyp.off, sizeof(hsize_t) * iter->rank);
+    } /* end if */
+    else
+        HDmemcpy(coords, iter->u.hyp.off, sizeof(hsize_t) * iter->rank);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_iter_coords() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_block
+ *
+ * Purpose:	Retrieve the current block of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 2, 2003
+ *
+ * Notes:       This routine assumes that the iterator is always located at
+ *              the beginning of a block.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_iter_block (const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
+{
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(start);
+    HDassert(end);
+
+    /* Copy the offset of the current point */
+
+    /* Check for a single "regular" hyperslab */
+    if(iter->u.hyp.diminfo_valid) {
+        /* Compute the end of the block */
+        for(u=0; u<iter->rank; u++) {
+            start[u]=iter->u.hyp.off[u];
+            end[u]=(start[u]+iter->u.hyp.diminfo[u].block)-1;
+        } /* end for */
+    } /* end if */
+    else {
+        /* Copy the start of the block */
+        for(u=0; u<iter->rank; u++)
+            start[u]=iter->u.hyp.span[u]->low;
+
+        /* Copy the end of the block */
+        for(u=0; u<iter->rank; u++)
+            end[u]=iter->u.hyp.span[u]->high;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_iter_block() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_nelmts
+ *
+ * Purpose:	Return number of elements left to process in iterator
+ *
+ * Return:	non-negative number of elements on success, zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5S_hyper_iter_nelmts (const H5S_sel_iter_t *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(iter->elmt_left)
+}   /* H5S_hyper_iter_nelmts() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_iter_has_next_block
+ PURPOSE
+    Check if there is another block left in the current iterator
+ USAGE
+    htri_t H5S_hyper_iter_has_next_block(iter)
+        const H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative (TRUE/FALSE) on success/Negative on failure
+ DESCRIPTION
+    Check if there is another block available in the selection iterator.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_iter_has_next_block(const H5S_sel_iter_t *iter)
+{
+    unsigned u;                 /* Local index variable */
+    htri_t ret_value = FALSE;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    /* Check for a single "regular" hyperslab */
+    if(iter->u.hyp.diminfo_valid) {
+        const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+        const hsize_t *toff;               /* Temporary offset in selection */
+
+        /* Check if the offset of the iterator is at the last location in all dimensions */
+        tdiminfo = iter->u.hyp.diminfo;
+        toff = iter->u.hyp.off;
+        for(u = 0; u < iter->rank; u++) {
+            /* If there is only one block, continue */
+            if(tdiminfo[u].count == 1)
+                continue;
+            if(toff[u] != (tdiminfo[u].start + ((tdiminfo[u].count - 1) * tdiminfo[u].stride)))
+                HGOTO_DONE(TRUE);
+        } /* end for */
+    } /* end if */
+    else {
+        /* Check for any levels of the tree with more sequences in them */
+        for(u = 0; u < iter->rank; u++)
+            if(iter->u.hyp.span[u]->next != NULL)
+                HGOTO_DONE(TRUE);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_iter_has_next_block() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_next
+ *
+ * Purpose:	Moves a hyperslab iterator to the beginning of the next sequence
+ *      of elements to read.  Handles walking off the end in all dimensions.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, September 8, 2000
+ *
+ * Modifications:
+ *      Modified for both general and optimized hyperslab I/O
+ *      Quincey Koziol, April 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_iter_next(H5S_sel_iter_t *iter, size_t nelem)
+{
+    unsigned ndims;     /* Number of dimensions of dataset */
+    int fast_dim;       /* Rank of the fastest changing dimension for the dataspace */
+    unsigned i;         /* Counters */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check for the special case of just one H5Sselect_hyperslab call made */
+    /* (i.e. a regular hyperslab selection */
+    if(iter->u.hyp.diminfo_valid) {
+        const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+        hsize_t iter_offset[H5O_LAYOUT_NDIMS];
+        hsize_t iter_count[H5O_LAYOUT_NDIMS];
+        int temp_dim;  /* Temporary rank holder */
+
+        /* Check if this is a "flattened" regular hyperslab selection */
+        if(iter->u.hyp.iter_rank!=0 && iter->u.hyp.iter_rank<iter->rank) {
+            /* Set the aliases for the dimension rank */
+            ndims=iter->u.hyp.iter_rank;
+        } /* end if */
+        else {
+            /* Set the aliases for the dimension rank */
+            ndims=iter->rank;
+        } /* end else */
+
+        /* Set the fastest dimension rank */
+        fast_dim = (int)ndims - 1;
+
+        /* Set the local copy of the diminfo pointer */
+        tdiminfo=iter->u.hyp.diminfo;
+
+        /* Calculate the offset and block count for each dimension */
+        for(i=0; i<ndims; i++) {
+            if(tdiminfo[i].count==1) {
+                iter_offset[i]=iter->u.hyp.off[i]-tdiminfo[i].start;
+                iter_count[i]=0;
+            } /* end if */
+            else {
+                iter_offset[i]=(iter->u.hyp.off[i]-tdiminfo[i].start)%tdiminfo[i].stride;
+                iter_count[i]=(iter->u.hyp.off[i]-tdiminfo[i].start)/tdiminfo[i].stride;
+            } /* end else */
+        } /* end for */
+
+        /* Loop through, advancing the offset & counts, until all the nelements are accounted for */
+        while(nelem>0) {
+            /* Start with the fastest changing dimension */
+            temp_dim=fast_dim;
+            while(temp_dim>=0) {
+                if(temp_dim==fast_dim) {
+                    size_t actual_elem;     /* Actual # of elements advanced on each iteration through loop */
+                    hsize_t block_elem;     /* Number of elements left in a block */
+
+                    /* Compute the number of elements left in block */
+                    block_elem=tdiminfo[temp_dim].block-iter_offset[temp_dim];
+
+                    /* Compute the number of actual elements to advance */
+                    actual_elem=(size_t)MIN(nelem,block_elem);
+
+                    /* Move the iterator over as many elements as possible */
+                    iter_offset[temp_dim]+=actual_elem;
+
+                    /* Decrement the number of elements advanced */
+                    nelem-=actual_elem;
+                } /* end if */
+                else {
+                    /* Move to the next row in the current dimension */
+                    iter_offset[temp_dim]++;
+                } /* end else */
+
+                /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                if(iter_offset[temp_dim]<tdiminfo[temp_dim].block)
+                    break;
+                else {
+                    /* Move to the next block in the current dimension */
+                    iter_offset[temp_dim]=0;
+                    iter_count[temp_dim]++;
+
+                    /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                    if(iter_count[temp_dim]<tdiminfo[temp_dim].count)
+                        break;
+                    else
+                        iter_count[temp_dim]=0; /* reset back to the beginning of the line */
+                } /* end else */
+
+                /* Decrement dimension count */
+                temp_dim--;
+            } /* end while */
+        } /* end while */
+
+        /* Translate current iter_offset and iter_count into iterator position */
+        for(i=0; i<ndims; i++)
+            iter->u.hyp.off[i]=tdiminfo[i].start+(tdiminfo[i].stride*iter_count[i])+iter_offset[i];
+    } /* end if */
+    /* Must be an irregular hyperslab selection */
+    else {
+        H5S_hyper_span_t *curr_span;    /* Current hyperslab span node */
+        H5S_hyper_span_t **ispan;       /* Iterator's hyperslab span nodes */
+        hsize_t *abs_arr;              /* Absolute hyperslab span position */
+        int curr_dim;                   /* Temporary rank holder */
+
+        /* Set the rank of the fastest changing dimension */
+        ndims=iter->rank;
+        fast_dim = (int)ndims - 1;
+
+        /* Get the pointers to the current span info and span nodes */
+        abs_arr=iter->u.hyp.off;
+        ispan=iter->u.hyp.span;
+
+        /* Loop through, advancing the span information, until all the nelements are accounted for */
+        while(nelem>0) {
+            /* Start at the fastest dim */
+            curr_dim=fast_dim;
+
+            /* Work back up through the dimensions */
+            while(curr_dim>=0) {
+                /* Reset the current span */
+                curr_span=ispan[curr_dim];
+
+                /* Increment absolute position */
+                if(curr_dim==fast_dim) {
+                    size_t actual_elem;     /* Actual # of elements advanced on each iteration through loop */
+                    hsize_t span_elem;      /* Number of elements left in a span */
+
+                    /* Compute the number of elements left in block */
+                    span_elem=(curr_span->high-abs_arr[curr_dim])+1;
+
+                    /* Compute the number of actual elements to advance */
+                    actual_elem=(size_t)MIN(nelem,span_elem);
+
+                    /* Move the iterator over as many elements as possible */
+                    abs_arr[curr_dim]+=actual_elem;
+
+                    /* Decrement the number of elements advanced */
+                    nelem-=actual_elem;
+                } /* end if */
+                else {
+                    /* Move to the next row in the current dimension */
+                    abs_arr[curr_dim]++;
+                } /* end else */
+
+                /* Check if we are still within the span */
+                if(abs_arr[curr_dim]<=curr_span->high) {
+                    break;
+                } /* end if */
+                /* If we walked off that span, advance to the next span */
+                else {
+                    /* Advance span in this dimension */
+                    curr_span=curr_span->next;
+
+                    /* Check if we have a valid span in this dimension still */
+                    if(curr_span!=NULL) {
+                        /* Reset the span in the current dimension */
+                        ispan[curr_dim]=curr_span;
+
+                        /* Reset absolute position */
+                        abs_arr[curr_dim]=curr_span->low;
+
+                        break;
+                    } /* end if */
+                    else {
+                        /* If we finished the span list in this dimension, decrement the dimension worked on and loop again */
+                        curr_dim--;
+                    } /* end else */
+                } /* end else */
+            } /* end while */
+
+            /* Check if we are finished with the spans in the tree */
+            if(curr_dim>=0) {
+                /* Walk back down the iterator positions, reseting them */
+                while(curr_dim<fast_dim) {
+                    HDassert(curr_span);
+                    HDassert(curr_span->down);
+                    HDassert(curr_span->down->head);
+
+                    /* Increment current dimension */
+                    curr_dim++;
+
+                    /* Set the new span_info & span for this dimension */
+                    ispan[curr_dim]=curr_span->down->head;
+
+                    /* Advance span down the tree */
+                    curr_span=curr_span->down->head;
+
+                    /* Reset the absolute offset for the dim */
+                    abs_arr[curr_dim]=curr_span->low;
+                } /* end while */
+
+                /* Verify that the curr_span points to the fastest dim */
+                HDassert(curr_span==ispan[fast_dim]);
+            } /* end if */
+        } /* end while */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5S_hyper_iter_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_iter_next_block
+ *
+ * Purpose:	Moves a hyperslab iterator to the beginning of the next sequence
+ *      of elements to read.  Handles walking off the end in all dimensions.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_iter_next_block(H5S_sel_iter_t *iter)
+{
+    unsigned ndims;     /* Number of dimensions of dataset */
+    int fast_dim;       /* Rank of the fastest changing dimension for the dataspace */
+    unsigned u;         /* Counters */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check for the special case of just one H5Sselect_hyperslab call made */
+    /* (i.e. a regular hyperslab selection */
+    if(iter->u.hyp.diminfo_valid) {
+        const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+        hsize_t iter_offset[H5O_LAYOUT_NDIMS];
+        hsize_t iter_count[H5O_LAYOUT_NDIMS];
+        int temp_dim;  /* Temporary rank holder */
+
+        /* Check if this is a "flattened" regular hyperslab selection */
+        if(iter->u.hyp.iter_rank!=0 && iter->u.hyp.iter_rank<iter->rank) {
+            /* Set the aliases for the dimension rank */
+            ndims=iter->u.hyp.iter_rank;
+        } /* end if */
+        else {
+            /* Set the aliases for the dimension rank */
+            ndims=iter->rank;
+        } /* end else */
+
+        /* Set the fastest dimension rank */
+        fast_dim = (int)ndims - 1;
+
+        /* Set the local copy of the diminfo pointer */
+        tdiminfo=iter->u.hyp.diminfo;
+
+        /* Calculate the offset and block count for each dimension */
+        for(u=0; u<ndims; u++) {
+            if(tdiminfo[u].count==1) {
+                iter_offset[u]=iter->u.hyp.off[u]-tdiminfo[u].start;
+                iter_count[u]=0;
+            } /* end if */
+            else {
+                iter_offset[u]=(iter->u.hyp.off[u]-tdiminfo[u].start)%tdiminfo[u].stride;
+                iter_count[u]=(iter->u.hyp.off[u]-tdiminfo[u].start)/tdiminfo[u].stride;
+            } /* end else */
+        } /* end for */
+
+        /* Advance one block */
+        temp_dim=fast_dim; /* Start with the fastest changing dimension */
+        while(temp_dim>=0) {
+            if(temp_dim==fast_dim) {
+                /* Move iterator over current block */
+                iter_offset[temp_dim]+=tdiminfo[temp_dim].block;
+            } /* end if */
+            else {
+                /* Move to the next row in the current dimension */
+                iter_offset[temp_dim]++;
+            } /* end else */
+
+            /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+            if(iter_offset[temp_dim]<tdiminfo[temp_dim].block)
+                break;
+            else {
+                /* Move to the next block in the current dimension */
+                iter_offset[temp_dim]=0;
+                iter_count[temp_dim]++;
+
+                /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                if(iter_count[temp_dim]<tdiminfo[temp_dim].count)
+                    break;
+                else
+                    iter_count[temp_dim]=0; /* reset back to the beginning of the line */
+            } /* end else */
+
+            /* Decrement dimension count */
+            temp_dim--;
+        } /* end while */
+
+        /* Translate current iter_offset and iter_count into iterator position */
+        for(u=0; u<ndims; u++)
+            iter->u.hyp.off[u]=tdiminfo[u].start+(tdiminfo[u].stride*iter_count[u])+iter_offset[u];
+    } /* end if */
+    /* Must be an irregular hyperslab selection */
+    else {
+        H5S_hyper_span_t *curr_span;    /* Current hyperslab span node */
+        H5S_hyper_span_t **ispan;       /* Iterator's hyperslab span nodes */
+        hsize_t *abs_arr;              /* Absolute hyperslab span position */
+        int curr_dim;                   /* Temporary rank holder */
+
+        /* Set the rank of the fastest changing dimension */
+        ndims = iter->rank;
+        fast_dim = (int)ndims - 1;
+
+        /* Get the pointers to the current span info and span nodes */
+        abs_arr=iter->u.hyp.off;
+        ispan=iter->u.hyp.span;
+
+        /* Loop through, advancing the span information, until all the nelements are accounted for */
+        curr_dim=fast_dim; /* Start at the fastest dim */
+
+        /* Work back up through the dimensions */
+        while(curr_dim>=0) {
+            /* Reset the current span */
+            curr_span=ispan[curr_dim];
+
+            /* Increment absolute position */
+            if(curr_dim==fast_dim) {
+                /* Move the iterator over rest of element in span */
+                abs_arr[curr_dim]=curr_span->high+1;
+            } /* end if */
+            else {
+                /* Move to the next row in the current dimension */
+                abs_arr[curr_dim]++;
+            } /* end else */
+
+            /* Check if we are still within the span */
+            if(abs_arr[curr_dim]<=curr_span->high) {
+                break;
+            } /* end if */
+            /* If we walked off that span, advance to the next span */
+            else {
+                /* Advance span in this dimension */
+                curr_span=curr_span->next;
+
+                /* Check if we have a valid span in this dimension still */
+                if(curr_span!=NULL) {
+                    /* Reset the span in the current dimension */
+                    ispan[curr_dim]=curr_span;
+
+                    /* Reset absolute position */
+                    abs_arr[curr_dim]=curr_span->low;
+
+                    break;
+                } /* end if */
+                else {
+                    /* If we finished the span list in this dimension, decrement the dimension worked on and loop again */
+                    curr_dim--;
+                } /* end else */
+            } /* end else */
+        } /* end while */
+
+        /* Check if we are finished with the spans in the tree */
+        if(curr_dim>=0) {
+            /* Walk back down the iterator positions, reseting them */
+            while(curr_dim<fast_dim) {
+                HDassert(curr_span);
+                HDassert(curr_span->down);
+                HDassert(curr_span->down->head);
+
+                /* Increment current dimension */
+                curr_dim++;
+
+                /* Set the new span_info & span for this dimension */
+                ispan[curr_dim]=curr_span->down->head;
+
+                /* Advance span down the tree */
+                curr_span=curr_span->down->head;
+
+                /* Reset the absolute offset for the dim */
+                abs_arr[curr_dim]=curr_span->low;
+            } /* end while */
+
+            /* Verify that the curr_span points to the fastest dim */
+            HDassert(curr_span == ispan[fast_dim]);
+        } /* end if */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5S_hyper_iter_next() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_iter_release
+ PURPOSE
+    Release hyperslab selection iterator information for a dataspace
+ USAGE
+    herr_t H5S_hyper_iter_release(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all information for a dataspace hyperslab selection iterator
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_iter_release (H5S_sel_iter_t *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+/* Release the information needed for non-regular hyperslab I/O */
+    /* Free the copy of the selections span tree */
+    if(iter->u.hyp.spans != NULL)
+        H5S_hyper_free_span_info(iter->u.hyp.spans);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_iter_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_new_span
+ PURPOSE
+    Make a new hyperslab span node
+ USAGE
+    H5S_hyper_span_t *H5S_hyper_new_span(low, high, down, next)
+        hsize_t low, high;         IN: Low and high bounds for new span node
+        H5S_hyper_span_info_t *down;     IN: Down span tree for new node
+        H5S_hyper_span_t *next;     IN: Next span for new node
+ RETURNS
+    Pointer to next span node on success, NULL on failure
+ DESCRIPTION
+    Allocate and initialize a new hyperslab span node, filling in the low &
+    high bounds, the down span and next span pointers also.  Increment the
+    reference count of the 'down span' if applicable.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_t *
+H5S_hyper_new_span(hsize_t low, hsize_t high, H5S_hyper_span_info_t *down, H5S_hyper_span_t *next)
+{
+    H5S_hyper_span_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate a new span node */
+    if(NULL == (ret_value = H5FL_MALLOC(H5S_hyper_span_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate hyperslab span")
+
+    /* Copy the span's basic information */
+    ret_value->low = low;
+    ret_value->high = high;
+    ret_value->nelem = (high - low) + 1;
+    ret_value->pstride = 0;
+    ret_value->down = down;
+    ret_value->next = next;
+
+    /* Increment the reference count of the 'down span' if there is one */
+    if(ret_value->down)
+        ret_value->down->count++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_new_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_span_precompute_helper
+ PURPOSE
+    Helper routine to precompute the nelem and pstrides in bytes.
+ USAGE
+    herr_t H5S_hyper_span_precompute_helper(span_info, elmt_size)
+        H5S_hyper_span_info_t *span_info;      IN/OUT: Span tree to work on
+        size_t elmt_size;                      IN: element size to work with
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Change the nelem and pstride values in the span tree from elements to
+    bytes using the elmt_size parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_span_precompute_helper (H5S_hyper_span_info_t *spans, size_t elmt_size)
+{
+    H5S_hyper_span_t *span;     /* Hyperslab span */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(spans);
+
+    /* Check if we've already set this down span tree */
+    if(spans->scratch!=(H5S_hyper_span_info_t *)~((size_t)NULL)) {
+        /* Set the tree's scratch pointer */
+        spans->scratch=(H5S_hyper_span_info_t *)~((size_t)NULL);
+
+        /* Set the scratch pointers in all the nodes */
+        span=spans->head;
+
+        /* Loop over all the spans for this down span tree */
+        while(span!=NULL) {
+            /* If there are down spans, set their scratch value also */
+            if(span->down!=NULL) {
+                if(H5S_hyper_span_precompute_helper(span->down,elmt_size)==FAIL)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "can't reset hyperslab scratch pointer")
+            } /* end if */
+
+            /* Change the nelem & pstride values into bytes */
+            span->nelem *= elmt_size;
+            span->pstride *= elmt_size;
+
+            /* Advance to next span */
+            span=span->next;
+        } /* end while */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_span_precompute_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_span_precompute
+ PURPOSE
+    Precompute the nelem and pstrides in bytes.
+ USAGE
+    herr_t H5S_hyper_span_precompute(span_info, elmt_size)
+        H5S_hyper_span_info_t *span_info;      IN/OUT: Span tree to work on
+        size_t elmt_size;                      IN: element size to work with
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Change the nelem and pstride values in the span tree from elements to
+    bytes using the elmt_size parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_span_precompute(H5S_hyper_span_info_t *spans, size_t elmt_size)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(spans);
+
+    /* Call the helper routine to actually do the work */
+    if(H5S_hyper_span_precompute_helper(spans, elmt_size) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "can't precompute span info")
+
+    /* Reset the scratch pointers for the next routine which needs them */
+    H5S_hyper_span_scratch(spans, NULL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_span_precompute() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_span_scratch
+ PURPOSE
+    Set the scratch pointers on hyperslab span trees
+ USAGE
+    void H5S_hyper_span_scratch(span_info)
+        H5S_hyper_span_info_t *span_info;      IN: Span tree to reset
+ RETURNS
+    <none>
+ DESCRIPTION
+    Set the scratch pointers on a hyperslab span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static void
+H5S_hyper_span_scratch(H5S_hyper_span_info_t *spans, void *scr_value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(spans);
+
+    /* Check if we've already set this down span tree */
+    if(spans->scratch != scr_value) {
+        H5S_hyper_span_t *span;             /* Hyperslab span */
+
+        /* Set the tree's scratch pointer */
+        spans->scratch = (H5S_hyper_span_info_t *)scr_value;
+
+        /* Set the scratch pointers in all the nodes */
+        span = spans->head;
+        while(span != NULL) {
+            /* If there are down spans, set their scratch value also */
+            if(span->down != NULL)
+                H5S_hyper_span_scratch(span->down, scr_value);
+
+            /* Advance to next span */
+            span = span->next;
+        } /* end while */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+}   /* H5S_hyper_span_scratch() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_copy_span_helper
+ PURPOSE
+    Helper routine to copy a hyperslab span tree
+ USAGE
+    H5S_hyper_span_info_t * H5S_hyper_copy_span_helper(spans)
+        H5S_hyper_span_info_t *spans;      IN: Span tree to copy
+ RETURNS
+    Pointer to the copied span tree on success, NULL on failure
+ DESCRIPTION
+    Copy a hyperslab span tree, using reference counting as appropriate.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_info_t *
+H5S_hyper_copy_span_helper (H5S_hyper_span_info_t *spans)
+{
+    H5S_hyper_span_t *span;         /* Hyperslab span */
+    H5S_hyper_span_t *new_span;     /* Temporary hyperslab span */
+    H5S_hyper_span_t *prev_span;    /* Previous hyperslab span */
+    H5S_hyper_span_info_t *new_down;    /* New down span tree */
+    H5S_hyper_span_info_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(spans);
+
+    /* Check if the span tree was already copied */
+    if(spans->scratch != NULL && spans->scratch != (H5S_hyper_span_info_t *)~((size_t)NULL)) {
+        /* Just return the value of the already copied span tree */
+        ret_value = spans->scratch;
+
+        /* Increment the reference count of the span tree */
+        ret_value->count++;
+    } /* end if */
+    else {
+        /* Allocate a new span_info node */
+        if(NULL == (ret_value = H5FL_MALLOC(H5S_hyper_span_info_t)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate hyperslab span info")
+
+        /* Copy the span_info information */
+        ret_value->count = 1;
+        ret_value->scratch = NULL;
+        ret_value->head = NULL;
+
+        /* Set the scratch pointer in the node being copied to the newly allocated node */
+        spans->scratch = ret_value;
+
+        /* Copy over the nodes in the span list */
+        span = spans->head;
+        prev_span = NULL;
+        while(span != NULL) {
+            /* Allocate a new node */
+            if(NULL == (new_span = H5S_hyper_new_span(span->low, span->high, NULL, NULL)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate hyperslab span")
+
+            /* Append to list of spans */
+            if(NULL == prev_span)
+                ret_value->head = new_span;
+            else
+                prev_span->next = new_span;
+
+            /* Copy the pstride */
+            new_span->pstride = span->pstride;
+
+            /* Recurse to copy the 'down' spans, if there are any */
+            if(span->down != NULL) {
+                if(NULL == (new_down = H5S_hyper_copy_span_helper(span->down)))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy hyperslab spans")
+                new_span->down = new_down;
+            } /* end if */
+
+            /* Update the previous (new) span */
+            prev_span = new_span;
+
+            /* Advance to next span */
+            span = span->next;
+        } /* end while */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_copy_span_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_copy_span
+ PURPOSE
+    Copy a hyperslab span tree
+ USAGE
+    H5S_hyper_span_info_t * H5S_hyper_copy_span(span_info)
+        H5S_hyper_span_info_t *span_info;      IN: Span tree to copy
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Copy a hyperslab span tree, using reference counting as appropriate.
+    (Which means that just the nodes in the top span tree are duplicated and
+    the reference counts of their 'down spans' are just incremented)
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_info_t *
+H5S_hyper_copy_span(H5S_hyper_span_info_t *spans)
+{
+    H5S_hyper_span_info_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(spans);
+
+    /* Copy the hyperslab span tree */
+    if(NULL == (ret_value = H5S_hyper_copy_span_helper(spans)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy hyperslab span tree")
+
+    /* Reset the scratch pointers for the next routine which needs them */
+    H5S_hyper_span_scratch(spans, NULL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_copy_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_cmp_spans
+ PURPOSE
+    Check if two hyperslab slabs are the same
+ USAGE
+    htri_d H5S_hyper_cmp_spans(span1, span2)
+        H5S_hyper_span_t *span1;    IN: First span tree to compare
+        H5S_hyper_span_t *span2;    IN: Second span tree to compare
+ RETURNS
+    TRUE (1) or FALSE (0) on success, negative on failure
+ DESCRIPTION
+    Compare two hyperslab slabs to determine if they refer to the same
+    selection.  If span1 & span2 are both NULL, that counts as equal
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_cmp_spans (H5S_hyper_span_info_t *span_info1, H5S_hyper_span_info_t *span_info2)
+{
+    H5S_hyper_span_t *span1;
+    H5S_hyper_span_t *span2;
+    htri_t nest=FAIL;
+    htri_t ret_value=FAIL;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check for redundant comparison */
+    if(span_info1==span_info2)
+        ret_value=TRUE;
+    else {
+        /* Check for both spans being NULL */
+        if(span_info1==NULL && span_info2==NULL)
+            ret_value=TRUE;
+        else {
+            /* Check for one span being NULL */
+            if(span_info1==NULL || span_info2==NULL)
+                ret_value=FALSE;
+            else {
+                /* Get the pointers to the actual lists of spans */
+                span1=span_info1->head;
+                span2=span_info2->head;
+
+                /* Sanity checking */
+                HDassert(span1);
+                HDassert(span2);
+
+                /* infinite loop which must be broken out of */
+                while (1) {
+                    /* Check for both spans being NULL */
+                    if(span1==NULL && span2==NULL) {
+                        ret_value=TRUE;
+                        break;
+                    } /* end if */
+                    else {
+                        /* Check for one span being NULL */
+                        if(span1==NULL || span2==NULL) {
+                            ret_value=FALSE;
+                            break;
+                        } /* end if */
+                        else {
+                            /* Check if the actual low & high span information is the same */
+                            if(span1->low!=span2->low || span1->high!=span2->high) {
+                                ret_value=FALSE;
+                                break;
+                            } /* end if */
+                            else {
+                                if(span1->down!=NULL || span2!=NULL) {
+                                    if((nest=H5S_hyper_cmp_spans(span1->down,span2->down))==FAIL) {
+                                        ret_value=FAIL;
+                                        break;
+                                    } /* end if */
+                                    else {
+                                        if(nest==FALSE) {
+                                            ret_value=FALSE;
+                                            break;
+                                        } /* end if */
+                                        else {
+                                            /* Keep going... */
+                                        } /* end else */
+                                    } /* end else */
+                                } /* end if */
+                                else {
+                                    /* Keep going... */
+                                } /* end else */
+                            } /* end else */
+                        } /* end else */
+                    } /* end else */
+
+                    /* Advance to the next nodes in the span list */
+                    span1=span1->next;
+                    span2=span2->next;
+                } /* end while */
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_cmp_spans() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_free_span_info
+ PURPOSE
+    Free a hyperslab span info node
+ USAGE
+    herr_t H5S_hyper_free_span_info(span_info)
+        H5S_hyper_span_info_t *span_info;      IN: Span info node to free
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Free a hyperslab span info node, along with all the span nodes and the
+    'down spans' from the nodes, if reducing their reference count to zero
+    indicates it is appropriate to do so.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_free_span_info (H5S_hyper_span_info_t *span_info)
+{
+    H5S_hyper_span_t *span, *next_span;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(span_info);
+
+    /* Decrement the span tree's reference count */
+    span_info->count--;
+
+    /* Free the span tree if the reference count drops to zero */
+    if(span_info->count==0) {
+
+        /* Work through the list of spans pointed to by this 'info' node */
+        span=span_info->head;
+        while(span!=NULL) {
+            next_span=span->next;
+            if(H5S_hyper_free_span(span)<0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab span")
+            span=next_span;
+        } /* end while */
+
+        /* Free this span info */
+        span_info = H5FL_FREE(H5S_hyper_span_info_t, span_info);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_free_span_info() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_free_span
+ PURPOSE
+    Free a hyperslab span node
+ USAGE
+    herr_t H5S_hyper_free_span(span)
+        H5S_hyper_span_t *span;      IN: Span node to free
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Free a hyperslab span node, along with the 'down spans' from the node,
+    if reducing their reference count to zero indicates it is appropriate to
+    do so.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_free_span (H5S_hyper_span_t *span)
+{
+    herr_t ret_value=SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(span);
+
+    /* Decrement the reference count of the 'down spans', freeing them if appropriate */
+    if(span->down!=NULL) {
+        if(H5S_hyper_free_span_info(span->down)<0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab span tree")
+    } /* end if */
+
+    /* Free this span */
+    span = H5FL_FREE(H5S_hyper_span_t, span);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_free_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_copy
+ PURPOSE
+    Copy a selection from one dataspace to another
+ USAGE
+    herr_t H5S_hyper_copy(dst, src)
+        H5S_t *dst;  OUT: Pointer to the destination dataspace
+        H5S_t *src;  IN: Pointer to the source dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Copies all the hyperslab selection information from the source
+    dataspace to the destination dataspace.
+
+    If the SHARE_SELECTION flag is set, then the selection can be shared
+    between the source and destination dataspaces.  (This should only occur in
+    situations where the destination dataspace will immediately change to a new
+    selection)
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_copy (H5S_t *dst, const H5S_t *src, hbool_t share_selection)
+{
+    H5S_hyper_sel_t *dst_hslab;         /* Pointer to destination hyperslab info */
+    const H5S_hyper_sel_t *src_hslab;   /* Pointer to source hyperslab info */
+    herr_t ret_value=SUCCEED;   /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(src);
+    HDassert(dst);
+
+    /* Allocate space for the hyperslab selection information */
+    if(NULL == (dst->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+    /* Set temporary pointers */
+    dst_hslab=dst->select.sel_info.hslab;
+    src_hslab=src->select.sel_info.hslab;
+
+    /* Copy the hyperslab information */
+    dst_hslab->diminfo_valid=src_hslab->diminfo_valid;
+    if(src_hslab->diminfo_valid) {
+        size_t u;       /* Local index variable */
+
+        for(u=0; u<src->extent.rank; u++) {
+            dst_hslab->opt_diminfo[u]=src_hslab->opt_diminfo[u];
+            dst_hslab->app_diminfo[u]=src_hslab->app_diminfo[u];
+        } /* end for */
+    } /* end if */
+    dst->select.sel_info.hslab->span_lst=src->select.sel_info.hslab->span_lst;
+
+    /* Check if there is hyperslab span information to copy */
+    /* (Regular hyperslab information is copied with the selection structure) */
+    if(src->select.sel_info.hslab->span_lst!=NULL) {
+        if(share_selection) {
+            /* Share the source's span tree by incrementing the reference count on it */
+            dst->select.sel_info.hslab->span_lst->count++;
+        } /* end if */
+        else
+            /* Copy the hyperslab span information */
+            dst->select.sel_info.hslab->span_lst = H5S_hyper_copy_span(src->select.sel_info.hslab->span_lst);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_is_valid_helper
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_hyper_is_valid_helper(spans, offset, rank);
+        const H5S_hyper_span_info_t *spans; IN: Pointer to current hyperslab span tree
+        const hssize_t *offset;             IN: Pointer to offset array
+        const hsize_t *size;                IN: Pointer to size array
+        hsize_t rank;                       IN: Current rank looking at
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_is_valid_helper (const H5S_hyper_span_info_t *spans, const hssize_t *offset, const hsize_t *size, hsize_t rank)
+{
+    H5S_hyper_span_t *curr;     /* Hyperslab information nodes */
+    htri_t tmp;                 /* temporary return value */
+    htri_t ret_value=TRUE;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(spans);
+    HDassert(offset);
+    HDassert(size);
+    HDassert(rank < H5O_LAYOUT_NDIMS);
+
+    /* Check each point to determine whether selection+offset is within extent */
+    curr=spans->head;
+    while(curr!=NULL && ret_value==TRUE) {
+        /* Check if an offset has been defined */
+        /* Bounds check the selected point + offset against the extent */
+        if((((hssize_t)curr->low+offset[rank])>=(hssize_t)size[rank])
+                || (((hssize_t)curr->low+offset[rank])<0)
+                || (((hssize_t)curr->high+offset[rank])>=(hssize_t)size[rank])
+                || (((hssize_t)curr->high+offset[rank])<0)) {
+            ret_value=FALSE;
+            break;
+        } /* end if */
+
+        /* Recurse if this node has down spans */
+        if(curr->down!=NULL) {
+            if((tmp=H5S_hyper_is_valid_helper(curr->down,offset,size,rank+1))!=TRUE) {
+                ret_value=tmp;
+                break;
+            } /* end if */
+        } /* end if */
+
+        /* Advance to next node */
+        curr=curr->next;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_is_valid_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_is_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_hyper_is_valid(space);
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_is_valid (const H5S_t *space)
+{
+    unsigned u;                    /* Counter */
+    htri_t ret_value=TRUE;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(space);
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo=space->select.sel_info.hslab->opt_diminfo; /* local alias for diminfo */
+        hssize_t end;      /* The high bound of a region in a dimension */
+
+        /* Check each dimension */
+        for(u=0; u<space->extent.rank; u++) {
+            /* if block or count is zero, then can skip the test since */
+            /* no data point is chosen */
+            if (diminfo[u].count && diminfo[u].block) {
+                /* Bounds check the start point in this dimension */
+                if(((hssize_t)diminfo[u].start+space->select.offset[u])<0 ||
+                        ((hssize_t)diminfo[u].start+space->select.offset[u])>=(hssize_t)space->extent.size[u])
+                    HGOTO_DONE(FALSE)
+
+                /* Compute the largest location in this dimension */
+                end=(hssize_t)(diminfo[u].start+diminfo[u].stride*(diminfo[u].count-1)+(diminfo[u].block-1))+space->select.offset[u];
+
+                /* Bounds check the end point in this dimension */
+                if(end<0 || end>=(hssize_t)space->extent.size[u])
+                    HGOTO_DONE(FALSE)
+            } /* end if */
+        } /* end for */
+    } /* end if */
+    else {
+        /* Call the recursive routine to validate the span tree */
+        ret_value=H5S_hyper_is_valid_helper(space->select.sel_info.hslab->span_lst,space->select.offset,space->extent.size,(hsize_t)0);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_is_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_span_nblocks
+ PURPOSE
+    Count the number of blocks in a span tree
+ USAGE
+    hsize_t H5S_hyper_span_nblocks(spans)
+        const H5S_hyper_span_info_t *spans; IN: Hyperslab span tree to count elements of
+ RETURNS
+    Number of blocks in span tree on success; negative on failure
+ DESCRIPTION
+    Counts the number of blocks described by the spans in a span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hsize_t
+H5S_hyper_span_nblocks(H5S_hyper_span_info_t *spans)
+{
+    H5S_hyper_span_t *span;     /* Hyperslab span */
+    hsize_t ret_value = 0;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Count the number of elements in the span tree */
+    if(spans != NULL) {
+        span = spans->head;
+        while(span != NULL) {
+            /* If there are down spans, add the total down span blocks */
+            if(span->down!=NULL)
+                ret_value += H5S_hyper_span_nblocks(span->down);
+            /* If there are no down spans, just count the block in this span */
+            else
+                ret_value++;
+
+            /* Advance to next span */
+            span = span->next;
+        } /* end while */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_span_nblocks() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_hyper_nblocks
+ PURPOSE
+    Get the number of hyperslab blocks in current hyperslab selection
+ USAGE
+    hsize_t H5S_get_select_hyper_nblocks(space)
+        H5S_t *space;             IN: Dataspace ptr of selection to query
+ RETURNS
+    The number of hyperslab blocks in selection on success, negative on failure
+ DESCRIPTION
+    Returns the number of hyperslab blocks in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hsize_t
+H5S_get_select_hyper_nblocks(H5S_t *space)
+{
+    hsize_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        unsigned u;                 /* Local index variable */
+
+        /* Check each dimension */
+        for(ret_value = 1, u = 0; u < space->extent.rank; u++)
+            ret_value *= space->select.sel_info.hslab->app_diminfo[u].count;
+    } /* end if */
+    else
+        ret_value = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_hyper_nblocks() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_hyper_nblocks
+ PURPOSE
+    Get the number of hyperslab blocks in current hyperslab selection
+ USAGE
+    hssize_t H5Sget_select_hyper_nblocks(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+ RETURNS
+    The number of hyperslab blocks in selection on success, negative on failure
+ DESCRIPTION
+    Returns the number of hyperslab blocks in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hssize_t
+H5Sget_select_hyper_nblocks(hid_t spaceid)
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    hssize_t ret_value;         /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Hs", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+
+    ret_value = (hssize_t)H5S_get_select_hyper_nblocks(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_hyper_nblocks() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_serial_size
+ PURPOSE
+    Determine the number of bytes needed to store the serialized hyperslab
+        selection information.
+ USAGE
+    hssize_t H5S_hyper_serial_size(space)
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    The number of bytes required on success, negative on an error.
+ DESCRIPTION
+    Determines the number of bytes required to serialize the current hyperslab
+    selection information for storage on disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hssize_t
+H5S_hyper_serial_size(const H5S_t *space)
+{
+    unsigned u;                 /* Counter */
+    hsize_t block_count;       /* block counter for regular hyperslabs */
+    hssize_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Basic number of bytes required to serialize hyperslab selection:
+     *  <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+     *      <length (4 bytes)> + <rank (4 bytes)> + <# of blocks (4 bytes)> = 24 bytes
+     */
+    ret_value = 24;
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        /* Check each dimension */
+        for(block_count = 1, u = 0; u < space->extent.rank; u++)
+            block_count *= space->select.sel_info.hslab->opt_diminfo[u].count;
+    } /* end if */
+    else
+        /* Spin through hyperslab spans, adding 8 * rank bytes for each block */
+        block_count = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
+
+    H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, hssize_t);
+    ret_value += (hssize_t)(8 * block_count * space->extent.rank);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_serial_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_serialize_helper
+ PURPOSE
+    Serialize the current selection into a user-provided buffer.
+ USAGE
+    herr_t H5S_hyper_serialize_helper(spans, start, end, rank, buf)
+        H5S_hyper_span_info_t *spans;   IN: Hyperslab span tree to serialize
+        hssize_t start[];       IN/OUT: Accumulated start points
+        hssize_t end[];         IN/OUT: Accumulated end points
+        hsize_t rank;           IN: Current rank looking at
+        uint8 *buf;             OUT: Buffer to put serialized selection into
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Serializes the current element selection into a buffer.  (Primarily for
+    storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_serialize_helper (const H5S_hyper_span_info_t *spans, hsize_t *start, hsize_t *end, hsize_t rank, uint8_t **buf)
+{
+    H5S_hyper_span_t *curr;     /* Pointer to current hyperslab span */
+    hsize_t u;                  /* Index variable */
+    herr_t ret_value=SUCCEED;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(spans);
+    HDassert(start);
+    HDassert(end);
+    HDassert(rank < H5O_LAYOUT_NDIMS);
+    HDassert(buf && *buf);
+
+    /* Walk through the list of spans, recursing or outputing them */
+    curr=spans->head;
+    while(curr!=NULL) {
+        /* Recurse if this node has down spans */
+        if(curr->down!=NULL) {
+            /* Add the starting and ending points for this span to the list */
+            start[rank]=curr->low;
+            end[rank]=curr->high;
+
+            /* Recurse down to the next dimension */
+            if(H5S_hyper_serialize_helper(curr->down,start,end,rank+1,buf)<0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+        } /* end if */
+        else {
+            /* Encode all the previous dimensions starting & ending points */
+
+            /* Encode previous starting points */
+            for(u=0; u<rank; u++)
+                UINT32ENCODE(*buf, (uint32_t)start[u]);
+
+            /* Encode starting point for this span */
+            UINT32ENCODE(*buf, (uint32_t)curr->low);
+
+            /* Encode previous ending points */
+            for(u=0; u<rank; u++)
+                UINT32ENCODE(*buf, (uint32_t)end[u]);
+
+            /* Encode starting point for this span */
+            UINT32ENCODE(*buf, (uint32_t)curr->high);
+        } /* end else */
+
+        /* Advance to next node */
+        curr=curr->next;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_serialize_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_serialize
+ PURPOSE
+    Serialize the current selection into a user-provided buffer.
+ USAGE
+    herr_t H5S_hyper_serialize(space, buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to serialize
+        uint8 *buf;             OUT: Buffer to put serialized selection into
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Serializes the current element selection into a buffer.  (Primarily for
+    storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
+{
+    const H5S_hyper_dim_t *diminfo;         /* Alias for dataspace's diminfo information */
+    hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary hyperslab counts */
+    hsize_t offset[H5O_LAYOUT_NDIMS];      /* Offset of element in dataspace */
+    hsize_t start[H5O_LAYOUT_NDIMS];   /* Location of start of hyperslab */
+    hsize_t end[H5O_LAYOUT_NDIMS];     /* Location of end of hyperslab */
+    hsize_t temp_off;            /* Offset in a given dimension */
+    uint8_t *lenp;          /* pointer to length location for later storage */
+    uint32_t len = 0;       /* number of bytes used */
+    hsize_t block_count;    /* block counter for regular hyperslabs */
+    unsigned fast_dim;      /* Rank of the fastest changing dimension for the dataspace */
+    unsigned ndims;         /* Rank of the dataspace */
+    int done;               /* Whether we are done with the iteration */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Store the preamble information */
+    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
+    lenp = buf;           /* keep the pointer to the length location for later */
+    buf += 4;             /* skip over space for length */
+
+    /* Encode number of dimensions */
+    UINT32ENCODE(buf, (uint32_t)space->extent.rank);
+    len += 4;
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        unsigned u;     /* Local counting variable */
+
+        /* Set some convienence values */
+        ndims = space->extent.rank;
+        fast_dim = ndims - 1;
+        diminfo=space->select.sel_info.hslab->opt_diminfo;
+
+        /* Check each dimension */
+        for(block_count = 1, u = 0; u < ndims; u++)
+            block_count *= diminfo[u].count;
+
+        /* Encode number of hyperslabs */
+        H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
+        UINT32ENCODE(buf, (uint32_t)block_count);
+        len+=4;
+
+        /* Now serialize the information for the regular hyperslab */
+
+        /* Build the tables of count sizes as well as the initial offset */
+        for(u = 0; u < ndims; u++) {
+            tmp_count[u] = diminfo[u].count;
+            offset[u] = diminfo[u].start;
+        } /* end for */
+
+        /* We're not done with the iteration */
+        done=0;
+
+        /* Go iterate over the hyperslabs */
+        while(done==0) {
+            /* Iterate over the blocks in the fastest dimension */
+            while(tmp_count[fast_dim]>0) {
+                /* Add 8 bytes times the rank for each hyperslab selected */
+                len+=8*ndims;
+
+                /* Encode hyperslab starting location */
+                for(u = 0; u < ndims; u++)
+                    UINT32ENCODE(buf, (uint32_t)offset[u]);
+
+                /* Encode hyperslab ending location */
+                for(u = 0; u < ndims; u++)
+                    UINT32ENCODE(buf, (uint32_t)(offset[u] + (diminfo[u].block - 1)));
+
+                /* Move the offset to the next sequence to start */
+                offset[fast_dim]+=diminfo[fast_dim].stride;
+
+                /* Decrement the block count */
+                tmp_count[fast_dim]--;
+            } /* end while */
+
+            /* Work on other dimensions if necessary */
+            if(fast_dim > 0) {
+                int temp_dim;           /* Temporary rank holder */
+
+                /* Reset the block counts */
+                tmp_count[fast_dim]=diminfo[fast_dim].count;
+
+                /* Bubble up the decrement to the slower changing dimensions */
+                temp_dim = (int)fast_dim - 1;
+                while(temp_dim >= 0 && done == 0) {
+                    /* Decrement the block count */
+                    tmp_count[temp_dim]--;
+
+                    /* Check if we have more blocks left */
+                    if(tmp_count[temp_dim] > 0)
+                        break;
+
+                    /* Check for getting out of iterator */
+                    if(temp_dim == 0)
+                        done = 1;
+
+                    /* Reset the block count in this dimension */
+                    tmp_count[temp_dim] = diminfo[temp_dim].count;
+
+                    /* Wrapped a dimension, go up to next dimension */
+                    temp_dim--;
+                } /* end while */
+            } /* end if */
+            else
+                break;  /* Break out now, for 1-D selections */
+
+            /* Re-compute offset array */
+            for(u = 0; u < ndims; u++) {
+                temp_off = diminfo[u].start + diminfo[u].stride * (diminfo[u].count - tmp_count[u]);
+                offset[u] = temp_off;
+            } /* end for */
+        } /* end while */
+    } /* end if */
+    else {
+        /* Encode number of hyperslabs */
+        block_count = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
+        H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
+        UINT32ENCODE(buf, (uint32_t)block_count);
+        len+=4;
+
+        /* Add 8 bytes times the rank for each hyperslab selected */
+        H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, size_t);
+        len += (size_t)(8 * space->extent.rank * block_count);
+
+        /* Encode each hyperslab in selection */
+        H5S_hyper_serialize_helper(space->select.sel_info.hslab->span_lst, start, end, (hsize_t)0, &buf);
+    } /* end else */
+
+    /* Encode length */
+    UINT32ENCODE(lenp, (uint32_t)len);  /* Store the length of the extra information */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_serialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_deserialize
+ PURPOSE
+    Deserialize the current selection from a user-provided buffer.
+ USAGE
+    herr_t H5S_hyper_deserialize(space, buf)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
+        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Deserializes the current selection into a buffer.  (Primarily for retrieving
+    from disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_deserialize (H5S_t *space, const uint8_t *buf)
+{
+    uint32_t rank;           	/* rank of points */
+    size_t num_elem=0;      	/* number of elements in selection */
+    hsize_t start[H5O_LAYOUT_NDIMS];	/* hyperslab start information */
+    hsize_t end[H5O_LAYOUT_NDIMS];	/* hyperslab end information */
+    hsize_t stride[H5O_LAYOUT_NDIMS];   /* hyperslab stride information */
+    hsize_t count[H5O_LAYOUT_NDIMS];    /* hyperslab count information */
+    hsize_t block[H5O_LAYOUT_NDIMS];    /* hyperslab block information */
+    hsize_t *tstart=NULL;	/* temporary hyperslab pointers */
+    hsize_t *tend=NULL;		/* temporary hyperslab pointers */
+    hsize_t *tstride=NULL;	/* temporary hyperslab pointers */
+    hsize_t *tcount=NULL;	/* temporary hyperslab pointers */
+    hsize_t *tblock=NULL;	/* temporary hyperslab pointers */
+    unsigned i,j;              	/* local counting variables */
+    herr_t ret_value=FAIL;  	/* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+    HDassert(buf);
+
+    /* Deserialize slabs to select */
+    buf+=16;    /* Skip over selection header */
+    UINT32DECODE(buf,rank);  /* decode the rank of the point selection */
+    if(rank!=space->extent.rank)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "rank of pointer does not match dataspace")
+    UINT32DECODE(buf,num_elem);  /* decode the number of points */
+
+    /* Set the count & stride for all blocks */
+    for(tcount=count,tstride=stride,j=0; j<rank; j++,tstride++,tcount++) {
+        *tcount=1;
+        *tstride=1;
+    } /* end for */
+
+    /* Retrieve the coordinates from the buffer */
+    for(i=0; i<num_elem; i++) {
+        /* Decode the starting points */
+        for(tstart=start,j=0; j<rank; j++,tstart++)
+            UINT32DECODE(buf, *tstart);
+
+        /* Decode the ending points */
+        for(tend=end,j=0; j<rank; j++,tend++)
+            UINT32DECODE(buf, *tend);
+
+        /* Change the ending points into blocks */
+        for(tblock=block,tstart=start,tend=end,j=0; j<(unsigned)rank; j++,tstart++,tend++,tblock++)
+            *tblock=(*tend-*tstart)+1;
+
+        /* Select or add the hyperslab to the current selection */
+        if((ret_value=H5S_select_hyperslab(space,(i==0 ? H5S_SELECT_SET : H5S_SELECT_OR),start,stride,count,block))<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_deserialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_span_blocklist
+ PURPOSE
+    Get a list of hyperslab blocks currently selected
+ USAGE
+    herr_t H5S_hyper_span_blocklist(spans, start, end, rank, startblock, numblocks, buf)
+        H5S_hyper_span_info_t *spans;   IN: Dataspace pointer of selection to query
+        hsize_t start[];       IN/OUT: Accumulated start points
+        hsize_t end[];         IN/OUT: Accumulated end points
+        hsize_t rank;           IN: Rank of dataspace
+        hsize_t *startblock;    IN/OUT: Hyperslab block to start with
+        hsize_t *numblocks;     IN/OUT: Number of hyperslab blocks to get
+        hsize_t **buf;          OUT: List of hyperslab blocks selected
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+        Puts a list of the hyperslab blocks into the user's buffer.  The blocks
+    start with the '*startblock'th block in the list of blocks and put
+    '*numblocks' number of blocks into the user's buffer (or until the end of
+    the list of blocks, whichever happens first)
+        The block coordinates have the same dimensionality (rank) as the
+    dataspace they are located within.  The list of blocks is formatted as
+    follows: <"start" coordinate> immediately followed by <"opposite" corner
+    coordinate>, followed by the next "start" and "opposite" coordinate, etc.
+    until all the block information requested has been put into the user's
+    buffer.
+        No guarantee of any order of the blocks is implied.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_span_blocklist(H5S_hyper_span_info_t *spans, hsize_t start[], hsize_t end[], hsize_t rank, hsize_t *startblock, hsize_t *numblocks, hsize_t **buf)
+{
+    H5S_hyper_span_t *curr;     /* Pointer to current hyperslab span */
+    hsize_t u;                  /* Index variable */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(spans);
+    HDassert(rank < H5O_LAYOUT_NDIMS);
+    HDassert(start);
+    HDassert(end);
+    HDassert(startblock);
+    HDassert(numblocks && *numblocks > 0);
+    HDassert(buf && *buf);
+
+    /* Walk through the list of spans, recursing or outputing them */
+    curr = spans->head;
+    while(curr != NULL && *numblocks > 0) {
+        /* Recurse if this node has down spans */
+        if(curr->down != NULL) {
+            /* Add the starting and ending points for this span to the list */
+            start[rank] = curr->low;
+            end[rank] = curr->high;
+
+            /* Recurse down to the next dimension */
+            if(H5S_hyper_span_blocklist(curr->down, start, end, (rank + 1), startblock, numblocks, buf) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+        } /* end if */
+        else {
+            /* Skip this block if we haven't skipped all the startblocks yet */
+            if(*startblock > 0) {
+                /* Decrement the starting block */
+                (*startblock)--;
+            } /* end if */
+            /* Process this block */
+            else {
+                /* Encode all the previous dimensions starting & ending points */
+
+                /* Copy previous starting points */
+                for(u = 0; u < rank; u++, (*buf)++)
+                    HDmemcpy(*buf, &start[u], sizeof(hsize_t));
+
+                /* Copy starting point for this span */
+                HDmemcpy(*buf, &curr->low, sizeof(hsize_t));
+                (*buf)++;
+
+                /* Copy previous ending points */
+                for(u = 0; u < rank; u++, (*buf)++)
+                    HDmemcpy(*buf, &end[u], sizeof(hsize_t));
+
+                /* Copy starting point for this span */
+                HDmemcpy(*buf, &curr->high, sizeof(hsize_t));
+                (*buf)++;
+
+                /* Decrement the number of blocks processed */
+                (*numblocks)--;
+            } /* end else */
+        } /* end else */
+
+        /* Advance to next node */
+        curr = curr->next;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_span_blocklist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_hyper_blocklist
+ PURPOSE
+    Get the list of hyperslab blocks currently selected
+ USAGE
+    herr_t H5S_get_select_hyper_blocklist(space, startblock, numblocks, buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t startblock;     IN: Hyperslab block to start with
+        hsize_t numblocks;      IN: Number of hyperslab blocks to get
+        hsize_t *buf;           OUT: List of hyperslab blocks selected
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+        Puts a list of the hyperslab blocks into the user's buffer.  The blocks
+    start with the 'startblock'th block in the list of blocks and put
+    'numblocks' number of blocks into the user's buffer (or until the end of
+    the list of blocks, whichever happens first)
+        The block coordinates have the same dimensionality (rank) as the
+    dataspace they are located within.  The list of blocks is formatted as
+    follows: <"start" coordinate> immediately followed by <"opposite" corner
+    coordinate>, followed by the next "start" and "opposite" coordinate, etc.
+    until all the block information requested has been put into the user's
+    buffer.
+        No guarantee of any order of the blocks is implied.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_get_select_hyper_blocklist(H5S_t *space, hbool_t internal, hsize_t startblock, hsize_t numblocks, hsize_t *buf)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(buf);
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo; /* Alias for dataspace's diminfo information */
+        hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary hyperslab counts */
+        hsize_t offset[H5O_LAYOUT_NDIMS];      /* Offset of element in dataspace */
+        unsigned fast_dim;          /* Rank of the fastest changing dimension for the dataspace */
+        unsigned ndims;             /* Rank of the dataspace */
+        hbool_t done;               /* Whether we are done with the iteration */
+        unsigned u;                 /* Counter */
+
+        /* Set some convienence values */
+        ndims = space->extent.rank;
+        fast_dim = ndims - 1;
+
+        /* Check which set of dimension information to use */
+        if(internal)
+            /*
+             * Use the "optimized dimension information" to pass back information
+             * on the blocks set, not the "application information".
+             */
+            diminfo = space->select.sel_info.hslab->opt_diminfo;
+        else
+            /*
+             * Use the "application dimension information" to pass back to the user
+             * the blocks they set, not the optimized, internal information.
+             */
+            diminfo = space->select.sel_info.hslab->app_diminfo;
+
+        /* Build the tables of count sizes as well as the initial offset */
+        for(u = 0; u < ndims; u++) {
+            tmp_count[u] = diminfo[u].count;
+            offset[u] = diminfo[u].start;
+        } /* end for */
+
+        /* We're not done with the iteration */
+        done = FALSE;
+
+        /* Go iterate over the hyperslabs */
+        while(!done && numblocks > 0) {
+            hsize_t temp_off;           /* Offset in a given dimension */
+
+            /* Iterate over the blocks in the fastest dimension */
+            while(tmp_count[fast_dim] > 0 && numblocks > 0) {
+
+                /* Check if we should copy this block information */
+                if(startblock == 0) {
+                    /* Copy the starting location */
+                    HDmemcpy(buf, offset, sizeof(hsize_t) * ndims);
+                    buf += ndims;
+
+                    /* Compute the ending location */
+                    HDmemcpy(buf, offset, sizeof(hsize_t) * ndims);
+                    for(u = 0; u < ndims; u++)
+                        buf[u] += (diminfo[u].block - 1);
+                    buf += ndims;
+
+                    /* Decrement the number of blocks to retrieve */
+                    numblocks--;
+                } /* end if */
+                else
+                    startblock--;
+
+                /* Move the offset to the next sequence to start */
+                offset[fast_dim] += diminfo[fast_dim].stride;
+
+                /* Decrement the block count */
+                tmp_count[fast_dim]--;
+            } /* end while */
+
+            /* Work on other dimensions if necessary */
+            if(fast_dim > 0 && numblocks > 0) {
+                int temp_dim;               /* Temporary rank holder */
+
+                /* Reset the block counts */
+                tmp_count[fast_dim] = diminfo[fast_dim].count;
+
+                /* Bubble up the decrement to the slower changing dimensions */
+                temp_dim = (int)(fast_dim - 1);
+                while(temp_dim >= 0 && !done) {
+                    /* Decrement the block count */
+                    tmp_count[temp_dim]--;
+
+                    /* Check if we have more blocks left */
+                    if(tmp_count[temp_dim] > 0)
+                        break;
+
+                    /* Check for getting out of iterator */
+                    if(temp_dim == 0)
+                        done = TRUE;
+
+                    /* Reset the block count in this dimension */
+                    tmp_count[temp_dim] = diminfo[temp_dim].count;
+
+                    /* Wrapped a dimension, go up to next dimension */
+                    temp_dim--;
+                } /* end while */
+            } /* end if */
+
+            /* Re-compute offset array */
+            for(u = 0; u < ndims; u++) {
+                temp_off = diminfo[u].start + diminfo[u].stride * (diminfo[u].count - tmp_count[u]);
+                offset[u] = temp_off;
+            } /* end for */
+        } /* end while */
+    } /* end if */
+    else {
+        hsize_t start[H5O_LAYOUT_NDIMS];   /* Location of start of hyperslab */
+        hsize_t end[H5O_LAYOUT_NDIMS];     /* Location of end of hyperslab */
+
+        ret_value = H5S_hyper_span_blocklist(space->select.sel_info.hslab->span_lst, start, end, (hsize_t)0, &startblock, &numblocks, &buf);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_hyper_blocklist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_hyper_blocklist
+ PURPOSE
+    Get the list of hyperslab blocks currently selected
+ USAGE
+    herr_t H5Sget_select_hyper_blocklist(dsid, startblock, numblocks, buf)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+        hsize_t startblock;     IN: Hyperslab block to start with
+        hsize_t numblocks;      IN: Number of hyperslab blocks to get
+        hsize_t buf[];          OUT: List of hyperslab blocks selected
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+        Puts a list of the hyperslab blocks into the user's buffer.  The blocks
+    start with the 'startblock'th block in the list of blocks and put
+    'numblocks' number of blocks into the user's buffer (or until the end of
+    the list of blocks, whichever happen first)
+        The block coordinates have the same dimensionality (rank) as the
+    dataspace they are located within.  The list of blocks is formatted as
+    follows: <"start" coordinate> immediately followed by <"opposite" corner
+    coordinate>, followed by the next "start" and "opposite" coordinate, etc.
+    until all the block information requested has been put into the user's
+    buffer.
+        No guarantee of any order of the blocks is implied.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock,
+    hsize_t numblocks, hsize_t buf[/*numblocks*/])
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "ihh*[a2]h", spaceid, startblock, numblocks, buf);
+
+    /* Check args */
+    if(buf == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(H5S_GET_SELECT_TYPE(space)!=H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+
+    /* Go get the correct number of blocks */
+    if(numblocks > 0)
+        ret_value = H5S_get_select_hyper_blocklist(space, 0, startblock, numblocks, buf);
+    else
+        ret_value=SUCCEED;      /* Successfully got 0 blocks... */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_hyper_blocklist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_bounds_helper
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    htri_t H5S_hyper_bounds_helper(spans, offset, rank);
+        const H5S_hyper_span_info_t *spans; IN: Pointer to current hyperslab span tree
+        const hssize_t *offset;         IN: Pointer to offset array
+        hsize_t rank;                   IN: Current rank looking at
+        hsize_t *start;                 OUT: Start array bounds
+        hsize_t *end;                   OUT: End array bounds
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).
+        The bounding box calculations _does_ include the current offset of the
+    selection within the dataspace extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_bounds_helper(const H5S_hyper_span_info_t *spans, const hssize_t *offset, hsize_t rank, hsize_t *start, hsize_t *end)
+{
+    H5S_hyper_span_t *curr;             /* Hyperslab information nodes */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(spans);
+    HDassert(offset);
+    HDassert(rank < H5O_LAYOUT_NDIMS);
+    HDassert(start);
+    HDassert(end);
+
+    /* Check each point to determine whether selection+offset is within extent */
+    curr=spans->head;
+    while(curr!=NULL) {
+        /* Check for offset moving selection negative */
+        if(((hssize_t)curr->low + offset[rank]) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+        /* Check if the current span extends the bounding box */
+        if((curr->low + (hsize_t)offset[rank]) < start[rank])
+            start[rank] = curr->low + (hsize_t)offset[rank];
+        if((curr->high + (hsize_t)offset[rank]) > end[rank])
+            end[rank] = curr->high + (hsize_t)offset[rank];
+
+        /* Recurse if this node has down spans */
+        if(curr->down != NULL) {
+            if(H5S_hyper_bounds_helper(curr->down, offset, (rank + 1), start, end) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "failure in lower dimension")
+        } /* end if */
+
+        /* Advance to next node */
+        curr = curr->next;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_bounds_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_hyper_bounds(space, hsize_t *start, hsize_t *end)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t *start;         OUT: Starting coordinate of bounding box
+        hsize_t *end;           OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).
+        The bounding box calculations _does_ include the current offset of the
+    selection within the dataspace extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
+{
+    unsigned rank;              /* Dataspace rank */
+    unsigned i;                 /* index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    /* Set the start and end arrays up */
+    rank = space->extent.rank;
+    for(i = 0; i < rank; i++) {
+        start[i] = HSIZET_MAX;
+        end[i] = 0;
+    } /* end for */
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo = space->select.sel_info.hslab->opt_diminfo; /* local alias for diminfo */
+
+        /* Check each dimension */
+        for(i = 0; i < rank; i++) {
+            /* Check for offset moving selection negative */
+            if((space->select.offset[i] + (hssize_t)diminfo[i].start) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+            /* Compute the smallest location in this dimension */
+            start[i] = diminfo[i].start + (hsize_t)space->select.offset[i];
+
+            /* Compute the largest location in this dimension */
+            end[i] = diminfo[i].start + diminfo[i].stride * (diminfo[i].count - 1) + (diminfo[i].block - 1) + (hsize_t)space->select.offset[i];
+        } /* end for */
+    } /* end if */
+    else {
+        /* Call the recursive routine to get the bounds for the span tree */
+        ret_value = H5S_hyper_bounds_helper(space->select.sel_info.hslab->span_lst, space->select.offset, (hsize_t)0, start, end);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_offset
+ PURPOSE
+    Gets the linear offset of the first element for the selection.
+ USAGE
+    herr_t H5S_hyper_offset(space, offset)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+        hsize_t *offset;        OUT: Linear offset of first element in selection
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the linear offset (in "units" of elements) of the first element
+    selected within the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Calling this function on a "none" selection returns fail.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_offset(const H5S_t *space, hsize_t *offset)
+{
+    const hssize_t *sel_offset; /* Pointer to the selection's offset */
+    const hsize_t *dim_size;    /* Pointer to a dataspace's extent */
+    hsize_t accum;              /* Accumulator for dimension sizes */
+    unsigned rank;              /* Dataspace rank */
+    int i;                      /* index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(space && space->extent.rank>0);
+    HDassert(offset);
+
+    /* Start at linear offset 0 */
+    *offset = 0;
+
+    /* Set up pointers to arrays of values */
+    rank = space->extent.rank;
+    sel_offset = space->select.offset;
+    dim_size = space->extent.size;
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo = space->select.sel_info.hslab->opt_diminfo; /* Local alias for diminfo */
+
+        /* Loop through starting coordinates, calculating the linear offset */
+        accum = 1;
+        for(i = (int)(rank - 1); i >= 0; i--) {
+            hssize_t hyp_offset = (hssize_t)diminfo[i].start + sel_offset[i]; /* Hyperslab's offset in this dimension */
+
+            /* Check for offset moving selection out of the dataspace */
+            if(hyp_offset < 0 || (hsize_t)hyp_offset >= dim_size[i])
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+            /* Add the hyperslab's offset in this dimension to the total linear offset */
+            *offset += (hsize_t)(hyp_offset * (hssize_t)accum);
+
+            /* Increase the accumulator */
+            accum *= dim_size[i];
+        } /* end for */
+    } /* end if */
+    else {
+        const H5S_hyper_span_t *span;           /* Hyperslab span node */
+        hsize_t dim_accum[H5S_MAX_RANK];        /* Accumulators, for each dimension */
+
+        /* Calculate the accumulator for each dimension */
+        accum = 1;
+        for(i = (int)(rank - 1); i >= 0; i--) {
+            /* Set the accumulator for this dimension */
+            dim_accum[i] = accum;
+
+            /* Increase the accumulator */
+            accum *= dim_size[i];
+        } /* end for */
+
+        /* Get information for the first span, in the slowest changing dimension */
+        span = space->select.sel_info.hslab->span_lst->head;
+
+        /* Work down the spans, computing the linear offset */
+        i = 0;
+        while(span) {
+            hssize_t hyp_offset = (hssize_t)span->low + sel_offset[i]; /* Hyperslab's offset in this dimension */
+
+            /* Check for offset moving selection out of the dataspace */
+            if(hyp_offset < 0 || (hsize_t)hyp_offset >= dim_size[i])
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+            /* Add the hyperslab's offset in this dimension to the total linear offset */
+            *offset += (hsize_t)(hyp_offset * (hssize_t)dim_accum[i]);
+
+            /* Advance to first span in "down" dimension */
+            if(span->down) {
+                HDassert(span->down->head);
+                span = span->down->head;
+            } /* end if */
+            else
+                span = NULL;
+            i++;
+        } /* end while */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_is_contiguous
+ PURPOSE
+    Check if a hyperslab selection is contiguous within the dataspace extent.
+ USAGE
+    htri_t H5S_hyper_is_contiguous(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is contiguous.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_is_contiguous(const H5S_t *space)
+{
+    unsigned small_contiguous,      /* Flag for small contiguous block */
+        large_contiguous;           /* Flag for large contiguous block */
+    unsigned u;                     /* index variable */
+    htri_t ret_value = FALSE;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(space);
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo=space->select.sel_info.hslab->opt_diminfo; /* local alias for diminfo */
+
+        /*
+         * For a regular hyperslab to be contiguous, it must have only one
+         * block (i.e. count==1 in all dimensions) and the block size must be
+         * the same as the dataspace extent's in all but the slowest changing
+         * dimension. (dubbed "large contiguous" block)
+         *
+         * OR
+         *
+         * The selection must have only one block (i.e. count==1) in all
+         * dimensions and the block size must be 1 in all but the fastest
+         * changing dimension. (dubbed "small contiguous" block)
+         */
+
+        /* Initialize flags */
+        large_contiguous=TRUE;	/* assume true and reset if the dimensions don't match */
+        small_contiguous=FALSE;	/* assume false initially */
+
+        /* Check for a "large contigous" block */
+        for(u=0; u<space->extent.rank; u++) {
+            if(diminfo[u].count>1) {
+                large_contiguous=FALSE;
+                break;
+            } /* end if */
+            if(u>0 && diminfo[u].block!=space->extent.size[u]) {
+                large_contiguous=FALSE;
+                break;
+            } /* end if */
+        } /* end for */
+
+        /* If we didn't find a large contiguous block, check for a small one */
+        if(large_contiguous==FALSE) {
+            small_contiguous=TRUE;
+            for(u=0; u<space->extent.rank; u++) {
+                if(diminfo[u].count>1) {
+                    small_contiguous=FALSE;
+                    break;
+                } /* end if */
+                if(u<(space->extent.rank-1) && diminfo[u].block!=1) {
+                    small_contiguous=FALSE;
+                    break;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+
+        /* Indicate true if it's either a large or small contiguous block */
+        if(large_contiguous || small_contiguous)
+            ret_value=TRUE;
+    } /* end if */
+    else {
+        H5S_hyper_span_info_t *spans;   /* Hyperslab span info node */
+        H5S_hyper_span_t *span;         /* Hyperslab span node */
+
+        /*
+         * For a hyperslab to be contiguous, it must have only one block and
+         * (either it's size must be the same as the dataspace extent's in all
+         * but the slowest changing dimension
+         * OR
+         * block size must be 1 in all but the fastest changing dimension).
+         */
+        /* Initialize flags */
+        large_contiguous=TRUE;	/* assume true and reset if the dimensions don't match */
+        small_contiguous=FALSE;	/* assume false initially */
+
+        /* Get information for slowest changing information */
+        spans=space->select.sel_info.hslab->span_lst;
+        span=spans->head;
+
+        /* If there are multiple spans in the slowest changing dimension, the selection isn't contiguous */
+        if(span->next!=NULL)
+            large_contiguous=FALSE;
+        else {
+            /* Now check the rest of the dimensions */
+            if(span->down!=NULL) {
+                u=1;    /* Current dimension working on */
+
+                /* Get the span information for the next fastest dimension */
+                spans=span->down;
+
+                /* Cycle down the spans until we run out of down spans or find a non-contiguous span */
+                while(spans!=NULL) {
+                    span=spans->head;
+
+                    /* Check that this is the only span and it spans the entire dimension */
+                    if(span->next!=NULL) {
+                        large_contiguous=FALSE;
+                        break;
+                    } /* end if */
+                    else {
+                        /* If this span doesn't cover the entire dimension, then this selection isn't contiguous */
+                        if(((span->high-span->low)+1)!=space->extent.size[u]) {
+                            large_contiguous=FALSE;
+                            break;
+                        } /* end if */
+                        else {
+                            /* Walk down to the next span */
+                            spans=span->down;
+
+                            /* Increment dimension */
+                            u++;
+                        } /* end else */
+                    } /* end else */
+                } /* end while */
+            } /* end if */
+        } /* end else */
+
+        /* If we didn't find a large contiguous block, check for a small one */
+        if(large_contiguous==FALSE) {
+            small_contiguous=TRUE;
+
+            /* Get information for slowest changing information */
+            spans=space->select.sel_info.hslab->span_lst;
+            span=spans->head;
+
+            /* Current dimension working on */
+            u=0;
+
+            /* Cycle down the spans until we run out of down spans or find a non-contiguous span */
+            while(spans!=NULL) {
+                span=spans->head;
+
+                /* Check that this is the only span and it spans the entire dimension */
+                if(span->next!=NULL) {
+                    small_contiguous=FALSE;
+                    break;
+                } /* end if */
+                else {
+                    /* If this span doesn't cover the entire dimension, then this selection isn't contiguous */
+                    if(u<(space->extent.rank-1) && ((span->high-span->low)+1)!=1) {
+                        small_contiguous=FALSE;
+                        break;
+                    } /* end if */
+                    else {
+                        /* Walk down to the next span */
+                        spans=span->down;
+
+                        /* Increment dimension */
+                        u++;
+                    } /* end else */
+                } /* end else */
+            } /* end while */
+        } /* end if */
+
+        /* Indicate true if it's either a large or small contiguous block */
+        if(large_contiguous || small_contiguous)
+            ret_value=TRUE;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_is_contiguous() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_is_single
+ PURPOSE
+    Check if a hyperslab selection is a single block within the dataspace extent.
+ USAGE
+    htri_t H5S_hyper_is_single(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is a single block.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_is_single(const H5S_t *space)
+{
+    H5S_hyper_span_info_t *spans;   /* Hyperslab span info node */
+    H5S_hyper_span_t *span;         /* Hyperslab span node */
+    unsigned u;                     /* index variable */
+    htri_t ret_value=TRUE;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(space);
+
+    /* Check for a "single" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        /*
+         * For a regular hyperslab to be single, it must have only one
+         * block (i.e. count==1 in all dimensions)
+         */
+
+        /* Check for a single block */
+        for(u=0; u<space->extent.rank; u++) {
+            if(space->select.sel_info.hslab->opt_diminfo[u].count>1)
+                HGOTO_DONE(FALSE)
+        } /* end for */
+    } /* end if */
+    else {
+        /*
+         * For a region to be single, it must have only one block
+         */
+        /* Get information for slowest changing information */
+        spans=space->select.sel_info.hslab->span_lst;
+
+        /* Cycle down the spans until we run out of down spans or find a non-contiguous span */
+        while(spans!=NULL) {
+            span=spans->head;
+
+            /* Check that this is the only span and it spans the entire dimension */
+            if(span->next!=NULL)
+                HGOTO_DONE(FALSE)
+            else
+                /* Walk down to the next span */
+                spans=span->down;
+        } /* end while */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_is_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_is_regular
+ PURPOSE
+    Check if a hyperslab selection is "regular"
+ USAGE
+    htri_t H5S_hyper_is_regular(space)
+        const H5S_t *space;     IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in a dataspace is the a regular
+    pattern.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Doesn't check for "regular" hyperslab selections composed of spans
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_is_regular(const H5S_t *space)
+{
+    htri_t ret_value;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    /* Only simple check for regular hyperslabs for now... */
+    if(space->select.sel_info.hslab->diminfo_valid)
+        ret_value=TRUE;
+    else
+        ret_value=FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_is_regular() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_release
+ PURPOSE
+    Release hyperslab selection information for a dataspace
+ USAGE
+    herr_t H5S_hyper_release(space)
+        H5S_t *space;       IN: Pointer to dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all hyperslab selection information for a dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+ * 	Robb Matzke, 1998-08-25
+ *	The fields which are freed are set to NULL to prevent them from being
+ *	freed again later.  This fixes some allocation problems where
+ *	changing the hyperslab selection of one data space causes a core dump
+ *	when closing some other data space.
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_release(H5S_t *space)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(space));
+
+    /* Reset the number of points selected */
+    space->select.num_elem = 0;
+
+    /* Release irregular hyperslab information */
+    if(space->select.sel_info.hslab->span_lst != NULL) {
+        if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+    } /* end if */
+
+    /* Release space for the hyperslab selection information */
+    space->select.sel_info.hslab = H5FL_FREE(H5S_hyper_sel_t, space->select.sel_info.hslab);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_recover_span
+ PURPOSE
+    Recover a generated span, if appropriate
+ USAGE
+    herr_t H5S_hyper_recover_span(recover, curr_span, next_span)
+        unsigned *recover;                 IN/OUT: Pointer recover flag
+        H5S_hyper_span_t **curr_span;   IN/OUT: Pointer to current span in list
+        H5S_hyper_span_t *next_span;    IN: Pointer to next span
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Check if the current span needs to be recovered and free it if so.
+    Set the current span to the next span in any case.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_recover_span (unsigned *recover, H5S_hyper_span_t **curr_span, H5S_hyper_span_t *next_span)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(recover);
+    HDassert(curr_span);
+
+    /* Check if the span should be recovered */
+    if(*recover) {
+        H5S_hyper_free_span(*curr_span);
+        *recover=0;
+    } /* end if */
+
+    /* Set the current span to next span */
+    *curr_span=next_span;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_recover_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_coord_to_span
+ PURPOSE
+    Create a span tree for a single element
+ USAGE
+    H5S_hyper_span_t *H5S_hyper_coord_to_span(rank, coords)
+        unsigned rank;                  IN: Number of dimensions of coordinate
+        hsize_t *coords;               IN: Location of element
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Create a span tree for a single element
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_t *
+H5S_hyper_coord_to_span(unsigned rank, hsize_t *coords)
+{
+    H5S_hyper_span_t *new_span;         /* Pointer to new span tree for coordinate */
+    H5S_hyper_span_info_t *down=NULL;   /* Pointer to new span tree for next level down */
+    H5S_hyper_span_t *ret_value=NULL;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(rank > 0);
+    HDassert(coords);
+
+    /* Search for location to insert new element in tree */
+    if(rank>1) {
+        /* Allocate a span info node */
+        if((down = H5FL_MALLOC(H5S_hyper_span_info_t))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+        /* Set the reference count */
+        down->count=0;
+
+        /* Reset the scratch pad space */
+        down->scratch=0;
+
+        /* Build span tree for coordinates below this one */
+        if((down->head=H5S_hyper_coord_to_span(rank-1,&coords[1]))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+    } /* end if */
+
+    /* Build span for this coordinate */
+    if((new_span = H5S_hyper_new_span(coords[0],coords[0],down,NULL))==NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+    /* Set return value */
+    ret_value=new_span;
+
+done:
+    if(ret_value==NULL) {
+        if(down!=NULL)
+            H5S_hyper_free_span_info(down);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_coord_to_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_add_span_element_helper
+ PURPOSE
+    Add a single elment to a span tree
+ USAGE
+    herr_t H5S_hyper_add_span_element_helper(prev_span, span_tree, rank, coords)
+        H5S_hyper_span_info_t *span_tree;  IN/OUT: Pointer to span tree to append to
+        unsigned rank;                  IN: Number of dimensions of coordinates
+        hsize_t *coords;               IN: Location of element to add to span tree
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Add a single element to an existing span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Assumes that the element is not already covered by the span tree
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_add_span_element_helper(H5S_hyper_span_info_t *span_tree, unsigned rank, hsize_t *coords)
+{
+    H5S_hyper_span_info_t *tspan_info;  /* Temporary pointer to span info */
+    H5S_hyper_span_info_t *prev_span_info;  /* Pointer to span info for level above current position */
+    H5S_hyper_span_t *tmp_span;         /* Temporary pointer to a span */
+    H5S_hyper_span_t *tmp2_span;        /* Another temporary pointer to a span */
+    H5S_hyper_span_t *new_span;         /* New span created for element */
+    herr_t ret_value=SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(span_tree);
+    HDassert(rank > 0);
+    HDassert(coords);
+
+    /* Get pointer to last span in span tree */
+    tspan_info=span_tree;
+    if(span_tree->scratch)
+        tmp_span=(H5S_hyper_span_t *)span_tree->scratch;
+    else {
+        tmp_span=span_tree->head;
+        HDassert(tmp_span);
+        span_tree->scratch=(H5S_hyper_span_info_t *)tmp_span;
+    } /* end else */
+
+    /* Find last span tree which includes a portion of the coordinate */
+    prev_span_info=NULL;
+    while(coords[0]>=tmp_span->low && coords[0]<=tmp_span->high) {
+        /* Move rank & coordinate offset down a dimension */
+        rank--;
+        coords++;
+
+        /* Remember the span tree we are descending into */
+        prev_span_info=tspan_info;
+        tspan_info=tmp_span->down;
+
+        /* Get the last span in this span's 'down' tree */
+        if(tspan_info->scratch)
+            tmp_span=(H5S_hyper_span_t *)tspan_info->scratch;
+        else {
+            tmp_span=tspan_info->head;
+            HDassert(tmp_span);
+            tspan_info->scratch=(H5S_hyper_span_info_t *)tmp_span;
+        } /* end else */
+    } /* end while */
+
+    /* Check if we made it all the way to the bottom span in the tree */
+    if(rank>1) {
+        /* Before we create another span at this level in the tree, check if
+         * the last span's "down tree" was equal to any other spans in this
+         * list of spans in the span tree.
+         *
+         * If so, release last span information and make last span merge into
+         * previous span (if possible), or at least share their "down tree"
+         * information.
+         */
+        tmp2_span=tspan_info->head;
+        while(tmp2_span!=tmp_span) {
+            if(H5S_hyper_cmp_spans(tmp2_span->down,tmp_span->down)==TRUE) {
+                /* Check for merging into previous span */
+                if(tmp2_span->high+1==tmp_span->low) {
+                    /* Release last span created */
+                    H5S_hyper_free_span(tmp_span);
+
+                    /* Increase size of previous span */
+                    tmp2_span->high++;
+                    tmp2_span->nelem++;
+
+                    /* Reset the 'tmp_span' for the rest of this block's algorithm */
+                    tmp_span=tmp2_span;
+                } /* end if */
+                /* Span is disjoint, but has the same "down tree" selection */
+                else {
+                    /* Release "down tree" information */
+                    H5S_hyper_free_span_info(tmp_span->down);
+
+                    /* Point at earlier span's "down tree" */
+                    tmp_span->down=tmp2_span->down;
+
+                    /* Increment reference count on shared "down tree" */
+                    tmp_span->down->count++;
+                } /* end else */
+
+                /* Found span to merge into, break out now */
+                break;
+            } /* end if */
+
+            /* Advance to next span to check */
+            tmp2_span=tmp2_span->next;
+        } /* end while */
+
+        /* Make span tree for current coordinates */
+        if((new_span=H5S_hyper_coord_to_span(rank,coords))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Add new span tree as span */
+        HDassert(tmp_span);
+        tmp_span->next=new_span;
+
+        /* Make scratch pointer point to last span in list */
+        HDassert(tspan_info);
+        tspan_info->scratch=(H5S_hyper_span_info_t *)new_span;
+
+        /* Set the proper 'pstride' for new span */
+        new_span->pstride=new_span->low-tmp_span->low;
+    } /* end if */
+    else {
+        /* Does new node adjoin existing node? */
+        if(tmp_span->high+1==coords[0]) {
+            tmp_span->high++;
+            tmp_span->nelem++;
+
+            /* Check if this span tree should now be merged with a level higher in the tree */
+            if(prev_span_info!=NULL) {
+                /* Before we create another span at this level in the tree, check if
+                 * the last span's "down tree" was equal to any other spans in this
+                 * list of spans in the span tree.
+                 *
+                 * If so, release last span information and make last span merge into
+                 * previous span (if possible), or at least share their "down tree"
+                 * information.
+                 */
+                tmp2_span=prev_span_info->head;
+                tmp_span=(H5S_hyper_span_t *)prev_span_info->scratch;
+                while(tmp2_span!=tmp_span) {
+                    if(H5S_hyper_cmp_spans(tmp2_span->down,tmp_span->down)==TRUE) {
+                        /* Check for merging into previous span */
+                        if(tmp2_span->high+1==tmp_span->low) {
+                            /* Release last span created */
+                            H5S_hyper_free_span(tmp_span);
+
+                            /* Increase size of previous span */
+                            tmp2_span->high++;
+                            tmp2_span->nelem++;
+
+                            /* Update pointers */
+                            tmp2_span->next=NULL;
+                            prev_span_info->scratch=(H5S_hyper_span_info_t *)tmp2_span;
+                        } /* end if */
+                        /* Span is disjoint, but has the same "down tree" selection */
+                        else {
+                            /* Release "down tree" information */
+                            H5S_hyper_free_span_info(tmp_span->down);
+
+                            /* Point at earlier span's "down tree" */
+                            tmp_span->down=tmp2_span->down;
+
+                            /* Increment reference count on shared "down tree" */
+                            tmp_span->down->count++;
+                        } /* end else */
+
+                        /* Found span to merge into, break out now */
+                        break;
+                    } /* end if */
+
+                    /* Advance to next span to check */
+                    tmp2_span=tmp2_span->next;
+                } /* end while */
+            } /* end if */
+        } /* end if */
+        else {
+            if((new_span = H5S_hyper_new_span(coords[0],coords[0],NULL,NULL))==NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+            /* Add new span tree as span */
+            HDassert(tmp_span);
+            tmp_span->next=new_span;
+
+            /* Make scratch pointer point to last span in list */
+            tspan_info->scratch=(H5S_hyper_span_info_t *)new_span;
+
+            /* Set the proper 'pstride' for new span */
+            new_span->pstride=new_span->low-tmp_span->low;
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_add_span_element_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_add_span_element
+ PURPOSE
+    Add a single elment to a span tree
+ USAGE
+    herr_t H5S_hyper_add_span_element(space, span_tree, rank, coords)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to add coordinate to
+        unsigned rank;          IN: Number of dimensions of coordinates
+        hsize_t *coords;       IN: Location of element to add to span tree
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Add a single element to an existing span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Assumes that the element is not already in the dataspace's selection
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_add_span_element(H5S_t *space, unsigned rank, hsize_t *coords)
+{
+    H5S_hyper_span_info_t *head = NULL;    /* Pointer to new head of span tree */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(rank > 0);
+    HDassert(coords);
+
+    /* Check if this is the first element in the selection */
+    if(NULL == space->select.sel_info.hslab) {
+        /* Allocate a span info node */
+        if(NULL == (head = H5FL_MALLOC(H5S_hyper_span_info_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Set the reference count */
+        head->count = 1;
+
+        /* Reset the scratch pad space */
+        head->scratch = 0;
+
+        /* Build span tree for this coordinate */
+        if(NULL == (head->head = H5S_hyper_coord_to_span(rank, coords)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Allocate selection info */
+        if(NULL == (space->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+        /* Set the selection to the new span tree */
+        space->select.sel_info.hslab->span_lst = head;
+
+        /* Set selection type */
+        space->select.type = H5S_sel_hyper;
+
+        /* Reset "regular" hyperslab flag */
+        space->select.sel_info.hslab->diminfo_valid = FALSE;
+
+        /* Set # of elements in selection */
+        space->select.num_elem = 1;
+    } /* end if */
+    else {
+        if(H5S_hyper_add_span_element_helper(space->select.sel_info.hslab->span_lst, rank, coords) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Increment # of elements in selection */
+        space->select.num_elem++;
+    } /* end else */
+
+done:
+    if(ret_value < 0)
+        if(head)
+            H5S_hyper_free_span_info(head);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_add_span_element() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_reset_scratch
+ PURPOSE
+    Reset the scratch information for span tree
+ USAGE
+    herr_t H5S_hyper_reset_scratch(space)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to reset scratch pointers
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Resets the "scratch" pointers used for various tasks in computing hyperslab
+    spans.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_reset_scratch(H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Check if there are spans in the span tree */
+    if(space->select.sel_info.hslab->span_lst != NULL)
+        /* Reset the scratch pointers for the next routine which needs them */
+        H5S_hyper_span_scratch(space->select.sel_info.hslab->span_lst, NULL);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_reset_scratch() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_convert
+ PURPOSE
+    Convert a compatible selection to span tree form
+ USAGE
+    herr_t H5S_hyper_convert(space)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to convert
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Converts a compatible selection (currently only "all" selections) to the
+    span-tree form of a hyperslab selection. (Point and "none" selection aren't
+    currently supported and hyperslab selection always have the span-tree form
+    available).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_convert(H5S_t *space)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+
+    /* Check the type of selection */
+    switch(H5S_GET_SELECT_TYPE(space)) {
+        case H5S_SEL_ALL:    /* All elements selected in dataspace */
+            /* Convert current "all" selection to "real" hyperslab selection */
+            {
+                hsize_t tmp_start[H5O_LAYOUT_NDIMS];   /* Temporary start information */
+                hsize_t tmp_stride[H5O_LAYOUT_NDIMS];   /* Temporary stride information */
+                hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary count information */
+                hsize_t tmp_block[H5O_LAYOUT_NDIMS];    /* Temporary block information */
+                unsigned u;                             /* Local index variable */
+
+                /* Fill in temporary information for the dimensions */
+                for(u=0; u<space->extent.rank; u++) {
+                    tmp_start[u]=0;
+                    tmp_stride[u]=1;
+                    tmp_count[u]=1;
+                    tmp_block[u]=space->extent.size[u];
+                } /* end for */
+
+                /* Convert to hyperslab selection */
+                if(H5S_select_hyperslab(space,H5S_SELECT_SET,tmp_start,tmp_stride,tmp_count,tmp_block)<0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+            } /* end case */
+            break;
+
+        case H5S_SEL_HYPERSLABS:        /* Hyperslab selection */
+            break;
+
+        case H5S_SEL_NONE:   /* No elements selected in dataspace */
+        case H5S_SEL_POINTS: /* Point selection */
+        case H5S_SEL_ERROR:  /* Selection error */
+        case H5S_SEL_N:      /* Selection count */
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "can't convert to span tree selection")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_convert() */
+
+#ifdef LATER
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_intersect_helper
+ PURPOSE
+    Helper routine to detect intersections in span trees
+ USAGE
+    htri_t H5S_hyper_intersect_helper(spans1, spans2)
+        H5S_hyper_span_info_t *spans1;     IN: First span tree to operate with
+        H5S_hyper_span_info_t *spans2;     IN: Second span tree to operate with
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Quickly detect intersections between two span trees
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_intersect_helper (H5S_hyper_span_info_t *spans1, H5S_hyper_span_info_t *spans2)
+{
+    H5S_hyper_span_t *curr1;    /* Pointer to current span in 1st span tree */
+    H5S_hyper_span_t *curr2;    /* Pointer to current span in 2nd span tree */
+    htri_t status;              /* Status from recursive call */
+    htri_t ret_value=FALSE;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert((spans1 && spans2) || (spans1 == NULL && spans2 == NULL));
+
+    /* "NULL" span trees compare as overlapping */
+    if(spans1==NULL && spans2==NULL)
+        HGOTO_DONE(TRUE);
+
+    /* Get the span lists for each span in this tree */
+    curr1=spans1->head;
+    curr2=spans2->head;
+
+    /* Iterate over the spans in each tree */
+    while(curr1!=NULL && curr2!=NULL) {
+        /* Check for 1st span entirely before 2nd span */
+        if(curr1->high<curr2->low)
+            curr1=curr1->next;
+        /* Check for 2nd span entirely before 1st span */
+        else if(curr2->high<curr1->low)
+            curr2=curr2->next;
+        /* Spans must overlap */
+        else {
+            /* Recursively check spans in next dimension down */
+            if((status=H5S_hyper_intersect_helper(curr1->down,curr2->down))<0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab intersection check")
+
+            /* If there is a span intersection in the down dimensions, the span trees overlap */
+            if(status==TRUE)
+                HGOTO_DONE(TRUE);
+
+            /* No intersection in down dimensions, advance to next span */
+            if(curr1->high<curr2->high)
+                curr1=curr1->next;
+            else
+                curr2=curr2->next;
+        } /* end else */
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_intersect_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_intersect
+ PURPOSE
+    Detect intersections in span trees
+ USAGE
+    htri_t H5S_hyper_intersect(space1, space2)
+        H5S_t *space1;     IN: First dataspace to operate on span tree
+        H5S_t *space2;     IN: Second dataspace to operate on span tree
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Quickly detect intersections between two span trees
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_hyper_intersect (H5S_t *space1, H5S_t *space2)
+{
+    htri_t ret_value=FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(space1);
+    HDassert(space2);
+
+    /* Check that the space selections both have span trees */
+    if(space1->select.sel_info.hslab->span_lst==NULL ||
+            space2->select.sel_info.hslab->span_lst==NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+    /* Check that the dataspaces are both the same rank */
+    if(space1->extent.rank!=space2->extent.rank)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "dataspace ranks don't match")
+
+    /* Perform the span-by-span intersection check */
+    if((ret_value=H5S_hyper_intersect_helper(space1->select.sel_info.hslab->span_lst,space2->select.sel_info.hslab->span_lst))<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab intersection check")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_intersect() */
+#endif /* LATER */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_intersect_block_helper
+ PURPOSE
+    Helper routine to detect intersections in span trees
+ USAGE
+    htri_t H5S_hyper_intersect_block_helper(spans, start, end)
+        H5S_hyper_span_info_t *spans;     IN: First span tree to operate with
+        hssize_t *offset;   IN: Selection offset coordinate
+        hsize_t *start;    IN: Starting coordinate for block
+        hsize_t *end;      IN: Ending coordinate for block
+ RETURN
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Quickly detect intersections between span tree and block
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_intersect_block_helper (const H5S_hyper_span_info_t *spans, hsize_t *start, hsize_t *end)
+{
+    H5S_hyper_span_t *curr;     /* Pointer to current span in 1st span tree */
+    htri_t status;              /* Status from recursive call */
+    htri_t ret_value=FALSE;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(spans);
+    HDassert(start);
+    HDassert(end);
+
+    /* Get the span list for spans in this tree */
+    curr=spans->head;
+
+    /* Iterate over the spans in the tree */
+    while(curr!=NULL) {
+        /* Check for span entirely before block */
+        if(curr->high < *start)
+            /* Advance to next span in this dimension */
+            curr=curr->next;
+        /* If this span is past the end of the block, then we're done in this dimension */
+        else if(curr->low > *end)
+            HGOTO_DONE(FALSE)
+        /* block & span overlap */
+        else {
+            if(curr->down==NULL)
+                HGOTO_DONE(TRUE)
+            else {
+                /* Recursively check spans in next dimension down */
+                if((status=H5S_hyper_intersect_block_helper(curr->down,start+1,end+1))<0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab intersection check")
+
+                /* If there is a span intersection in the down dimensions, the span trees overlap */
+                if(status==TRUE)
+                    HGOTO_DONE(TRUE);
+
+                /* No intersection in down dimensions, advance to next span */
+                curr=curr->next;
+            } /* end else */
+        } /* end else */
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_intersect_block_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_intersect_block
+ PURPOSE
+    Detect intersections in span trees
+ USAGE
+    htri_t H5S_hyper_intersect_block(space, start, end)
+        H5S_t *space;       IN: First dataspace to operate on span tree
+        hssize_t *start;    IN: Starting coordinate for block
+        hssize_t *end;      IN: Ending coordinate for block
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Quickly detect intersections between span tree and block
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_hyper_intersect_block (H5S_t *space, hsize_t *start, hsize_t *end)
+{
+    htri_t ret_value=FAIL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    /* Check for 'all' selection, instead of a hyperslab selection */
+    /* (Technically, this shouldn't be in the "hyperslab" routines...) */
+    if(H5S_GET_SELECT_TYPE(space)==H5S_SEL_ALL)
+        HGOTO_DONE(TRUE);
+
+    /* Check that the space selection has a span tree */
+    if(space->select.sel_info.hslab->span_lst==NULL)
+        if(H5S_hyper_generate_spans(space)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+    /* Perform the span-by-span intersection check */
+    if((ret_value=H5S_hyper_intersect_block_helper(space->select.sel_info.hslab->span_lst,start,end))<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab intersection check")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_intersect_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_adjust_helper_u
+ PURPOSE
+    Helper routine to adjust offsets in span trees
+ USAGE
+    herr_t H5S_hyper_adjust_helper_u(spans, offset)
+        H5S_hyper_span_info_t *spans;   IN: Span tree to operate with
+        const hsize_t *offset;         IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Adjust the location of the spans in a span tree by subtracting an offset
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_adjust_helper_u (H5S_hyper_span_info_t *spans, const hsize_t *offset)
+{
+    H5S_hyper_span_t *span;     /* Pointer to current span in span tree */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(spans);
+    HDassert(offset);
+
+    /* Check if we've already set this down span tree */
+    if(spans->scratch!=(H5S_hyper_span_info_t *)~((size_t)NULL)) {
+        /* Set the tree's scratch pointer */
+        spans->scratch=(H5S_hyper_span_info_t *)~((size_t)NULL);
+
+        /* Get the span lists for each span in this tree */
+        span=spans->head;
+
+        /* Iterate over the spans in tree */
+        while(span!=NULL) {
+            /* Adjust span offset */
+            HDassert(span->low>=*offset);
+            span->low-=*offset;
+            span->high-=*offset;
+
+            /* Recursively adjust spans in next dimension down */
+            if(span->down!=NULL)
+                H5S_hyper_adjust_helper_u(span->down,offset+1);
+
+            /* Advance to next span in this dimension */
+            span=span->next;
+        } /* end while */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_adjust_helper_u() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_adjust_u
+ PURPOSE
+    Adjust a hyperslab selection by subtracting an offset
+ USAGE
+    herr_t H5S_hyper_adjust_u(space,offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hsize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves a hyperslab selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_adjust_u(H5S_t *space, const hsize_t *offset)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(offset);
+
+    /* Subtract the offset from the "regular" coordinates, if they exist */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        for(u=0; u<space->extent.rank; u++) {
+            HDassert(space->select.sel_info.hslab->opt_diminfo[u].start>=offset[u]);
+            space->select.sel_info.hslab->opt_diminfo[u].start-=offset[u];
+        } /* end for */
+    } /* end if */
+
+    /* Subtract the offset from the span tree coordinates, if they exist */
+    if(space->select.sel_info.hslab->span_lst) {
+        if(H5S_hyper_adjust_helper_u(space->select.sel_info.hslab->span_lst,offset)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab offset adjustment")
+
+        /* Reset the scratch pointers for the next routine which needs them */
+        H5S_hyper_span_scratch(space->select.sel_info.hslab->span_lst, NULL);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_adjust_u() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_project_scalar
+ *
+ * Purpose:	Projects a single element hyperslab selection into a scalar
+ *              dataspace
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_project_scalar(const H5S_t *space, hsize_t *offset)
+{
+    hsize_t block[H5S_MAX_RANK];     /* Block selected in base dataspace */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(space));
+    HDassert(offset);
+
+    /* Check for a "regular" hyperslab selection */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *diminfo = space->select.sel_info.hslab->opt_diminfo; /* Alias for dataspace's diminfo information */
+        unsigned u;                 /* Counter */
+
+        /* Build the table of the initial offset */
+        for(u = 0; u < space->extent.rank; u++) {
+            block[u] = diminfo[u].start;
+
+            /* Check for more than one hyperslab */
+            if(diminfo[u].count > 1 || diminfo[u].block > 1)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "hyperslab selection of one element has more than one node!")
+        } /* end for */
+    } /* end if */
+    else {
+        const H5S_hyper_span_t *curr;           /* Pointer to current hyperslab span */
+        unsigned curr_dim;                      /* Current dimension being operated on */
+
+        /* Advance down selected spans */
+        curr = space->select.sel_info.hslab->span_lst->head;
+        curr_dim = 0;
+        while(curr) {
+            /* Check for more than one span */
+            if(curr->next || curr->low != curr->high)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "hyperslab selection of one element has more than one node!")
+
+            /* Save the location of the selection in current dimension */
+            block[curr_dim] = curr->low;
+
+            /* Advance down to next dimension */
+            curr = curr->down->head;
+            curr_dim++;
+        } /* end while */
+    } /* end else */
+
+    /* Calculate offset of selection in projected buffer */
+    *offset = H5VM_array_offset(space->extent.rank, space->extent.size, block); 
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_project_scalar() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_project_simple_lower
+ *
+ * Purpose:	Projects a hyperslab selection onto/into a simple dataspace
+ *              of a lower rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_project_simple_lower(const H5S_t *base_space, H5S_t *new_space)
+{
+    H5S_hyper_span_info_t *down;        /* Pointer to list of spans */
+    unsigned curr_dim;                  /* Current dimension being operated on */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(new_space->extent.rank < base_space->extent.rank);
+
+    /* Walk down the span tree until we reach the selection to project */
+    down = base_space->select.sel_info.hslab->span_lst;
+    curr_dim = 0;
+    while(down && curr_dim < (base_space->extent.rank - new_space->extent.rank)) {
+        /* Sanity check */
+        HDassert(NULL == down->head->next);
+
+        /* Advance down to next dimension */
+        down = down->head->down;
+        curr_dim++;
+    } /* end while */
+    HDassert(down);
+
+    /* Share the underlying hyperslab span information */
+    new_space->select.sel_info.hslab->span_lst = down;
+    new_space->select.sel_info.hslab->span_lst->count++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_project_simple_lower() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_project_simple_higher
+ *
+ * Purpose:	Projects a hyperslab selection onto/into a simple dataspace
+ *              of a higher rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_project_simple_higher(const H5S_t *base_space, H5S_t *new_space)
+{
+    H5S_hyper_span_t *prev_span = NULL; /* Pointer to previous list of spans */
+    unsigned curr_dim;                  /* Current dimension being operated on */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(new_space->extent.rank > base_space->extent.rank);
+
+    /* Create nodes until reaching the correct # of dimensions */
+    new_space->select.sel_info.hslab->span_lst = NULL;
+    curr_dim = 0;
+    while(curr_dim < (new_space->extent.rank - base_space->extent.rank)) {
+        H5S_hyper_span_info_t *new_span_info;  /* Pointer to list of spans */
+        H5S_hyper_span_t *new_span;     /* Temporary hyperslab span */
+
+        /* Allocate a new span_info node */
+        if(NULL == (new_span_info = H5FL_MALLOC(H5S_hyper_span_info_t))) {
+            if(prev_span)
+                if(H5S_hyper_free_span(prev_span) < 0)
+                    HERROR(H5E_DATASPACE, H5E_CANTFREE, "can't free hyperslab span");
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate hyperslab span info")
+        } /* end if */
+
+        /* Check for linking into higher span */
+        if(prev_span)
+            prev_span->down = new_span_info;
+
+        /* Allocate a new node */
+        if(NULL == (new_span = H5S_hyper_new_span(0, 0, NULL, NULL))) {
+            HDassert(new_span_info);
+            if(!prev_span)
+                (void)H5FL_FREE(H5S_hyper_span_info_t, new_span_info);
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate hyperslab span")
+        } /* end if */
+
+        /* Set the span_info information */
+        new_span_info->count = 1;
+        new_span_info->scratch = NULL;
+        new_span_info->head = new_span;
+
+        /* Attach to new space, if top span info */
+        if(NULL == new_space->select.sel_info.hslab->span_lst)
+            new_space->select.sel_info.hslab->span_lst = new_span_info;
+
+        /* Remember previous span info */
+        prev_span = new_span;
+
+        /* Advance to next dimension */
+        curr_dim++;
+    } /* end while */
+    HDassert(new_space->select.sel_info.hslab->span_lst);
+    HDassert(prev_span);
+
+    /* Share the underlying hyperslab span information */
+    prev_span->down = base_space->select.sel_info.hslab->span_lst;
+    prev_span->down->count++;
+
+done:
+    if(ret_value < 0 && new_space->select.sel_info.hslab->span_lst) {
+        if(new_space->select.sel_info.hslab->span_lst->head)
+            if(H5S_hyper_free_span(
+                    new_space->select.sel_info.hslab->span_lst->head) < 0)
+                HDONE_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "can't free hyperslab span")
+
+        new_space->select.sel_info.hslab->span_lst = H5FL_FREE(H5S_hyper_span_info_t, new_space->select.sel_info.hslab->span_lst);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_project_simple_higher() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_hyper_project_simple
+ *
+ * Purpose:	Projects a hyperslab selection onto/into a simple dataspace
+ *              of a different rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_hyper_project_simple(const H5S_t *base_space, H5S_t *new_space, hsize_t *offset)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(offset);
+
+    /* We are setting a new selection, remove any current selection in new dataspace */
+    if(H5S_SELECT_RELEASE(new_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* Allocate space for the hyperslab selection information */
+    if(NULL == (new_space->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+    /* Check for a "regular" hyperslab selection */
+    if(base_space->select.sel_info.hslab->diminfo_valid) {
+        unsigned base_space_dim;    /* Current dimension in the base dataspace */
+        unsigned new_space_dim;     /* Current dimension in the new dataspace */
+
+        /* Check if the new space's rank is < or > base space's rank */
+        if(new_space->extent.rank < base_space->extent.rank) {
+            const H5S_hyper_dim_t *opt_diminfo = base_space->select.sel_info.hslab->opt_diminfo; /* Alias for dataspace's diminfo information */
+            hsize_t block[H5S_MAX_RANK];     /* Block selected in base dataspace */
+            unsigned u;         /* Local index variable */
+
+            /* Compute the offset for the down-projection */
+            HDmemset(block, 0, sizeof(block));
+            for(u = 0; u < (base_space->extent.rank - new_space->extent.rank); u++)
+                block[u] = opt_diminfo[u].start;
+            *offset = H5VM_array_offset(base_space->extent.rank, base_space->extent.size, block); 
+
+            /* Set the correct dimensions for the base & new spaces */
+            base_space_dim = base_space->extent.rank - new_space->extent.rank;
+            new_space_dim = 0;
+        } /* end if */
+        else {
+            HDassert(new_space->extent.rank > base_space->extent.rank);
+
+            /* The offset is zero when projected into higher dimensions */
+            *offset = 0;
+
+            /* Set the diminfo information for the higher dimensions */
+            for(new_space_dim = 0; new_space_dim < (new_space->extent.rank - base_space->extent.rank); new_space_dim++) {
+                new_space->select.sel_info.hslab->app_diminfo[new_space_dim].start = 0;
+                new_space->select.sel_info.hslab->app_diminfo[new_space_dim].stride = 1;
+                new_space->select.sel_info.hslab->app_diminfo[new_space_dim].count = 1;
+                new_space->select.sel_info.hslab->app_diminfo[new_space_dim].block = 1;
+
+                new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].start = 0;
+                new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].stride = 1;
+                new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].count = 1;
+                new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].block = 1;
+            } /* end for */
+
+            /* Start at beginning of base space's dimension info */
+            base_space_dim = 0;
+        } /* end else */
+
+        /* Copy the diminfo */
+        while(base_space_dim < base_space->extent.rank) {
+            new_space->select.sel_info.hslab->app_diminfo[new_space_dim].start = 
+                    base_space->select.sel_info.hslab->app_diminfo[base_space_dim].start;
+            new_space->select.sel_info.hslab->app_diminfo[new_space_dim].stride = 
+                    base_space->select.sel_info.hslab->app_diminfo[base_space_dim].stride;
+            new_space->select.sel_info.hslab->app_diminfo[new_space_dim].count = 
+                    base_space->select.sel_info.hslab->app_diminfo[base_space_dim].count;
+            new_space->select.sel_info.hslab->app_diminfo[new_space_dim].block = 
+                    base_space->select.sel_info.hslab->app_diminfo[base_space_dim].block;
+
+            new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].start = 
+                    base_space->select.sel_info.hslab->opt_diminfo[base_space_dim].start;
+            new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].stride =
+                    base_space->select.sel_info.hslab->opt_diminfo[base_space_dim].stride;
+            new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].count = 
+                    base_space->select.sel_info.hslab->opt_diminfo[base_space_dim].count;
+            new_space->select.sel_info.hslab->opt_diminfo[new_space_dim].block = 
+                    base_space->select.sel_info.hslab->opt_diminfo[base_space_dim].block;
+
+            /* Advance to next dimensions */
+            base_space_dim++;
+            new_space_dim++;
+        } /* end for */
+
+        /* Indicate that the dimension information is valid */
+        new_space->select.sel_info.hslab->diminfo_valid = TRUE;
+
+        /* Indicate that there's no slab information */
+        new_space->select.sel_info.hslab->span_lst = NULL;
+    } /* end if */
+    else {
+        /* Check if the new space's rank is < or > base space's rank */
+        if(new_space->extent.rank < base_space->extent.rank) {
+            const H5S_hyper_span_t *curr;    /* Pointer to current hyperslab span */
+            hsize_t block[H5S_MAX_RANK];     /* Block selected in base dataspace */
+            unsigned curr_dim;               /* Current dimension being operated on */
+
+            /* Clear the block buffer */
+            HDmemset(block, 0, sizeof(block));
+
+            /* Advance down selected spans */
+            curr = base_space->select.sel_info.hslab->span_lst->head;
+            curr_dim = 0;
+            while(curr && curr_dim < (base_space->extent.rank - new_space->extent.rank)) {
+                /* Save the location of the selection in current dimension */
+                block[curr_dim] = curr->low;
+
+                /* Advance down to next dimension */
+                curr = curr->down->head;
+                curr_dim++;
+            } /* end while */
+
+            /* Compute the offset for the down-projection */
+            *offset = H5VM_array_offset(base_space->extent.rank, base_space->extent.size, block); 
+
+            /* Project the base space's selection down in less dimensions */
+            if(H5S_hyper_project_simple_lower(base_space, new_space) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't project hyperslab selection into less dimensions")
+        } /* end if */
+        else {
+            HDassert(new_space->extent.rank > base_space->extent.rank);
+
+            /* The offset is zero when projected into higher dimensions */
+            *offset = 0;
+
+            /* Project the base space's selection down in less dimensions */
+            if(H5S_hyper_project_simple_higher(base_space, new_space) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't project hyperslab selection into less dimensions")
+        } /* end else */
+
+        /* Indicate that the dimension information is not valid */
+        new_space->select.sel_info.hslab->diminfo_valid = FALSE;
+    } /* end else */
+
+    /* Number of elements selected will be the same */
+    new_space->select.num_elem = base_space->select.num_elem;
+
+    /* Set selection type */
+    new_space->select.type = H5S_sel_hyper;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_project_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_adjust_helper_s
+ PURPOSE
+    Helper routine to adjust offsets in span trees
+ USAGE
+    herr_t H5S_hyper_adjust_helper_s(spans, offset)
+        H5S_hyper_span_info_t *spans;   IN: Span tree to operate with
+        const hssize_t *offset;         IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Adjust the location of the spans in a span tree by subtracting an offset
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_adjust_helper_s(H5S_hyper_span_info_t *spans, const hssize_t *offset)
+{
+    H5S_hyper_span_t *span;     /* Pointer to current span in span tree */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(spans);
+    HDassert(offset);
+
+    /* Check if we've already set this down span tree */
+    if(spans->scratch != (H5S_hyper_span_info_t *)~((size_t)NULL)) {
+        /* Set the tree's scratch pointer */
+        spans->scratch = (H5S_hyper_span_info_t *)~((size_t)NULL);
+
+        /* Get the span lists for each span in this tree */
+        span = spans->head;
+
+        /* Iterate over the spans in tree */
+        while(span != NULL) {
+            /* Adjust span offset */
+            HDassert((hssize_t)span->low >= *offset);
+            span->low = (hsize_t)((hssize_t)span->low - *offset);
+            span->high = (hsize_t)((hssize_t)span->high - *offset);
+
+            /* Recursively adjust spans in next dimension down */
+            if(span->down != NULL)
+                H5S_hyper_adjust_helper_s(span->down, offset + 1);
+
+            /* Advance to next span in this dimension */
+            span = span->next;
+        } /* end while */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_adjust_helper_s() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_adjust_s
+ PURPOSE
+    Adjust a hyperslab selection by subtracting an offset
+ USAGE
+    herr_t H5S_hyper_adjust_s(space,offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hssize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves a hyperslab selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_adjust_s(H5S_t *space, const hssize_t *offset)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(offset);
+
+    /* Subtract the offset from the "regular" coordinates, if they exist */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        for(u = 0; u < space->extent.rank; u++) {
+            HDassert((hssize_t)space->select.sel_info.hslab->opt_diminfo[u].start >= offset[u]);
+            space->select.sel_info.hslab->opt_diminfo[u].start = (hsize_t)((hssize_t)space->select.sel_info.hslab->opt_diminfo[u].start - offset[u]);
+        } /* end for */
+    } /* end if */
+
+    /* Subtract the offset from the span tree coordinates, if they exist */
+    if(space->select.sel_info.hslab->span_lst) {
+        if(H5S_hyper_adjust_helper_s(space->select.sel_info.hslab->span_lst, offset) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab offset adjustment")
+
+        /* Reset the scratch pointers for the next routine which needs them */
+        H5S_hyper_span_scratch(space->select.sel_info.hslab->span_lst, NULL);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_adjust_s() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_normalize_offset
+ PURPOSE
+    "Normalize" a hyperslab selection by adjusting it's coordinates by the
+    amount of the selection offset.
+ USAGE
+    herr_t H5S_hyper_normalize_offset(space, old_offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to move
+        hssize_t *old_offset;   OUT: Pointer to space to store old offset
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Copies the current selection offset into the array provided, then
+    inverts the selection offset, subtracts the offset from the hyperslab
+    selection and resets the offset to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_hyper_normalize_offset(H5S_t *space, hssize_t *old_offset)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+
+    /* Check for hyperslab selection & offset changed */
+    if(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS && space->select.offset_changed) {
+        /* Copy & invert the selection offset */
+        for(u = 0; u<space->extent.rank; u++) {
+            old_offset[u] = space->select.offset[u];
+            space->select.offset[u] = -space->select.offset[u];
+        } /* end for */
+
+        /* Call the existing 'adjust' routine */
+        if(H5S_hyper_adjust_s(space, space->select.offset) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab normalization")
+
+        /* Zero out the selection offset */
+        HDmemset(space->select.offset, 0, sizeof(hssize_t) * space->extent.rank);
+
+        /* Indicate that the offset was normalized */
+        ret_value = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_normalize_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_denormalize_offset
+ PURPOSE
+    "Denormalize" a hyperslab selection by reverse adjusting it's coordinates
+    by the amount of the former selection offset.
+ USAGE
+    herr_t H5S_hyper_normalize_offset(space, old_offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to move
+        hssize_t *old_offset;   IN: Pointer to old offset array
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Subtracts the old offset from the current selection (canceling out the
+    effect of the "normalize" routine), then restores the old offset into
+    the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_denormalize_offset(H5S_t *space, const hssize_t *old_offset)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
+
+    /* Call the existing 'adjust' routine */
+    if(H5S_hyper_adjust_s(space, old_offset) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADSELECT, FAIL, "can't perform hyperslab normalization")
+
+    /* Copy the selection offset over */
+    HDmemcpy(space->select.offset, old_offset, sizeof(hssize_t) * space->extent.rank);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_denormalize_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_append_span
+ PURPOSE
+    Create a new span and append to span list
+ USAGE
+    herr_t H5S_hyper_append_span(prev_span, span_tree, low, high, down, next)
+        H5S_hyper_span_t **prev_span;    IN/OUT: Pointer to previous span in list
+        H5S_hyper_span_info_t **span_tree;  IN/OUT: Pointer to span tree to append to
+        hsize_t low, high;         IN: Low and high bounds for new span node
+        H5S_hyper_span_info_t *down;     IN: Down span tree for new node
+        H5S_hyper_span_t *next;     IN: Next span for new node
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Create a new span node and append to a span list.  Update the previous
+    span in the list also.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_append_span (H5S_hyper_span_t **prev_span, H5S_hyper_span_info_t ** span_tree, hsize_t low, hsize_t high, H5S_hyper_span_info_t *down, H5S_hyper_span_t *next)
+{
+    H5S_hyper_span_t *new_span = NULL;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(prev_span);
+    HDassert(span_tree);
+
+    /* Check for adding first node to merged spans */
+    if(*prev_span==NULL) {
+        /* Allocate new span node to append to list */
+        if((new_span = H5S_hyper_new_span(low,high,down,next))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Make first node in span list */
+
+        /* Check that we haven't already allocated a span tree */
+        HDassert(*span_tree==NULL);
+
+        /* Allocate a new span_info node */
+        if((*span_tree = H5FL_MALLOC(H5S_hyper_span_info_t))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+        /* Set the span tree's basic information */
+        (*span_tree)->count=1;
+        (*span_tree)->scratch=NULL;
+        (*span_tree)->head=new_span;
+
+        /* Update previous merged span */
+        *prev_span=new_span;
+    } /* end if */
+    /* Merge or append to existing merged spans list */
+    else {
+        /* Check if span can just extend the previous merged span */
+        if((((*prev_span)->high+1)==low) &&
+                H5S_hyper_cmp_spans(down,(*prev_span)->down)==TRUE) {
+            /* Extend previous merged span to include new high bound */
+            (*prev_span)->high=high;
+            (*prev_span)->nelem+=(high-low)+1;
+        } /* end if */
+        else {
+            /* Allocate new span node to append to list */
+            if((new_span = H5S_hyper_new_span(low,high,down,next))==NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+            /* Check if there is actually a down span */
+            if(new_span->down) {
+                /* Check if the down spans for the new span node are the same as the previous span node */
+                if(H5S_hyper_cmp_spans(new_span->down,(*prev_span)->down)==TRUE) {
+                    /* Release the down span for the new node */
+                    H5S_hyper_free_span_info(new_span->down);
+
+                    /* Point the new node's down span at the previous node's down span */
+                    new_span->down=(*prev_span)->down;
+
+                    /* Increment the reference count to the shared down span */
+                    new_span->down->count++;
+                } /* end if */
+            } /* end if */
+
+            /* Indicate elements from previous span */
+            new_span->pstride=low-(*prev_span)->low;
+
+            /* Append to end of merged spans list */
+            (*prev_span)->next=new_span;
+            *prev_span=new_span;
+        } /* end else */
+    } /* end else */
+
+done:
+    if(ret_value < 0) {
+        if(new_span)
+            if(H5S_hyper_free_span(new_span) < 0)
+                HDONE_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "failed to release new hyperslab span")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_append_span() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_clip_spans
+ PURPOSE
+    Clip a new span tree against the current spans in the hyperslab selection
+ USAGE
+    herr_t H5S_hyper_clip_spans(span_a, span_b, a_not_b, a_and_b, b_not_a)
+        H5S_hyper_span_t *a_spans;    IN: Span tree 'a' to clip with.
+        H5S_hyper_span_t *b_spans;    IN: Span tree 'b' to clip with.
+        H5S_hyper_span_t **a_not_b;  OUT: Span tree of 'a' hyperslab spans which
+                                            doesn't overlap with 'b' hyperslab
+                                            spans.
+        H5S_hyper_span_t **a_and_b;  OUT: Span tree of 'a' hyperslab spans which
+                                            overlaps with 'b' hyperslab spans.
+        H5S_hyper_span_t **b_not_a;  OUT: Span tree of 'b' hyperslab spans which
+                                            doesn't overlap with 'a' hyperslab
+                                            spans.
+ RETURNS
+    non-negative on success, negative on failure
+ DESCRIPTION
+    Clip one span tree ('a') against another span tree ('b').  Creates span
+    trees for the area defined by the 'a' span tree which does not overlap the
+    'b' span tree, the area defined by the overlap of the 'a' hyperslab span
+    tree and the 'b' span tree, and the area defined by the 'b' hyperslab span
+    tree which does not overlap the 'a' span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_spans,
+    H5S_hyper_span_info_t **a_not_b, H5S_hyper_span_info_t **a_and_b,
+    H5S_hyper_span_info_t **b_not_a)
+{
+    H5S_hyper_span_t *span_a;   /* Pointer to a node in span tree 'a' */
+    H5S_hyper_span_t *span_b;   /* Pointer to a node in span tree 'b' */
+    H5S_hyper_span_t *tmp_span; /* Temporary pointer to new span */
+    H5S_hyper_span_t *last_a_not_b;   /* Pointer to previous node in span tree 'a_not_b' */
+    H5S_hyper_span_t *last_a_and_b;   /* Pointer to previous node in span tree 'a_and_b' */
+    H5S_hyper_span_t *last_b_not_a;   /* Pointer to previous node in span tree 'b_not_a' */
+    H5S_hyper_span_info_t *down_a_not_b; /* Temporary pointer to a_not_b span tree of down spans for overlapping nodes */
+    H5S_hyper_span_info_t *down_a_and_b; /* Temporary pointer to a_and_b span tree of down spans for overlapping nodes */
+    H5S_hyper_span_info_t *down_b_not_a; /* Temporary pointer to b_and_a span tree of down spans for overlapping nodes */
+    unsigned recover_a, recover_b;         /* Flags to indicate when to recover temporary spans */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(a_spans);
+    HDassert(b_spans);
+    HDassert(a_not_b);
+    HDassert(a_and_b);
+    HDassert(b_not_a);
+
+    /* Check if both span trees are not defined */
+    if(a_spans==NULL && b_spans==NULL) {
+        *a_not_b=NULL;
+        *a_and_b=NULL;
+        *b_not_a=NULL;
+    } /* end if */
+    /* If span 'a' is not defined, but 'b' is, copy 'b' and set the other return span trees to empty */
+    else if(a_spans==NULL) {
+        *a_not_b=NULL;
+        *a_and_b=NULL;
+        if((*b_not_a=H5S_hyper_copy_span(b_spans))==NULL)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, FAIL, "can't copy hyperslab span tree")
+    } /* end if */
+    /* If span 'b' is not defined, but 'a' is, copy 'a' and set the other return span trees to empty */
+    else if(b_spans==NULL) {
+        if((*a_not_b=H5S_hyper_copy_span(a_spans))==NULL)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, FAIL, "can't copy hyperslab span tree")
+        *a_and_b=NULL;
+        *b_not_a=NULL;
+    } /* end if */
+    /* If span 'a' and 'b' are both defined, calculate the proper span trees */
+    else {
+        /* Check if both span trees completely overlap */
+        if(H5S_hyper_cmp_spans(a_spans,b_spans)==TRUE) {
+            *a_not_b=NULL;
+            if((*a_and_b=H5S_hyper_copy_span(a_spans))==NULL)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, FAIL, "can't copy hyperslab span tree")
+            *b_not_a=NULL;
+        } /* end if */
+        else {
+            /* Get the pointers to the new and old span lists */
+            span_a=a_spans->head;
+            span_b=b_spans->head;
+
+            /* Set the pointer to the previous spans */
+            last_a_not_b=NULL;
+            last_a_and_b=NULL;
+            last_b_not_a=NULL;
+
+            /* No spans to recover yet */
+            recover_a=recover_b=0;
+
+            /* Work through the list of spans in the new list */
+            while(span_a!=NULL && span_b!=NULL) {
+                /* Check if span 'a' is completely before span 'b' */
+                /*    AAAAAAA                            */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                if(span_a->high<span_b->low) {
+                    /* Copy span 'a' and add to a_not_b list */
+
+                    /* Merge/add span 'a' with/to a_not_b list */
+                    if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Advance span 'a', leave span 'b' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                } /* end if */
+                /* Check if span 'a' overlaps only the lower bound */
+                /*  of span 'b' , up to the upper bound of span 'b' */
+                /*    AAAAAAAAAAAA                       */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                else if(span_a->low<span_b->low && (span_a->high>=span_b->low && span_a->high<=span_b->high)) {
+                    /* Split span 'a' into two parts at the low bound of span 'b' */
+
+                    /* Merge/add lower part of span 'a' with/to a_not_b list */
+                    if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Check for overlaps between upper part of span 'a' and lower part of span 'b' */
+
+                    /* Make certain both spans either have a down span or both don't have one */
+                    HDassert((span_a->down != NULL && span_b->down != NULL) || (span_a->down == NULL && span_b->down == NULL));
+
+                    /* If there are no down spans, just add the overlapping area to the a_and_b list */
+                    if(span_a->down==NULL) {
+                        /* Merge/add overlapped part with/to a_and_b list */
+                        if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_a->high,NULL,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    /* If there are down spans, check for the overlap in them and add to each appropriate list */
+                    else {
+                        /* NULL out the temporary pointers to clipped areas in down spans */
+                        down_a_not_b=NULL;
+                        down_a_and_b=NULL;
+                        down_b_not_a=NULL;
+
+                        /* Check for overlaps in the 'down spans' of span 'a' & 'b' */
+                        if(H5S_hyper_clip_spans(span_a->down,span_b->down,&down_a_not_b,&down_a_and_b,&down_b_not_a)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+                        /* Check for additions to the a_not_b list */
+                        if(down_a_not_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_not_b list */
+                            if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_b->low,span_a->high,down_a_not_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_not_b);
+                        } /* end if */
+
+                        /* Check for additions to the a_and_b list */
+                        if(down_a_and_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_and_b list */
+                            if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_a->high,down_a_and_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_and_b);
+                        } /* end if */
+
+                        /* Check for additions to the b_not_a list */
+                        if(down_b_not_a!=NULL) {
+                            /* Merge/add overlapped part with/to b_not_a list */
+                            if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->high,down_b_not_a,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_b_not_a);
+                        } /* end if */
+                    } /* end else */
+
+                    /* Split off upper part of span 'b' at upper span of span 'a' */
+
+                    /* Check if there is actually an upper part of span 'b' to split off */
+                    if(span_a->high<span_b->high) {
+                        /* Allocate new span node for upper part of span 'b' */
+                        if((tmp_span = H5S_hyper_new_span(span_a->high+1,span_b->high,span_b->down,span_b->next))==NULL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                        /* Advance span 'a' */
+                        H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+
+                        /* Make upper part of span 'b' into new span 'b' */
+                        H5S_hyper_recover_span(&recover_b,&span_b,tmp_span);
+                        recover_b=1;
+                    } /* end if */
+                    /* No upper part of span 'b' to split */
+                    else {
+                        /* Advance both 'a' and 'b' */
+                        H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                        H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                    } /* end else */
+                } /* end if */
+                /* Check if span 'a' overlaps the lower & upper bound */
+                /*  of span 'b' */
+                /*    AAAAAAAAAAAAAAAAAAAAA              */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                else if(span_a->low<span_b->low && span_a->high>span_b->high) {
+                    /* Split off lower part of span 'a' at lower span of span 'b' */
+
+                    /* Merge/add lower part of span 'a' with/to a_not_b list */
+                    if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Check for overlaps between middle part of span 'a' and span 'b' */
+
+                    /* Make certain both spans either have a down span or both don't have one */
+                    HDassert((span_a->down != NULL && span_b->down != NULL) || (span_a->down == NULL && span_b->down == NULL));
+
+                    /* If there are no down spans, just add the overlapping area to the a_and_b list */
+                    if(span_a->down==NULL) {
+                        /* Merge/add overlapped part with/to a_and_b list */
+                        if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_b->high,NULL,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    /* If there are down spans, check for the overlap in them and add to each appropriate list */
+                    else {
+                        /* NULL out the temporary pointers to clipped areas in down spans */
+                        down_a_not_b=NULL;
+                        down_a_and_b=NULL;
+                        down_b_not_a=NULL;
+
+                        /* Check for overlaps in the 'down spans' of span 'a' & 'b' */
+                        if(H5S_hyper_clip_spans(span_a->down,span_b->down,&down_a_not_b,&down_a_and_b,&down_b_not_a)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+                        /* Check for additions to the a_not_b list */
+                        if(down_a_not_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_not_b list */
+                            if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_b->low,span_b->high,down_a_not_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_not_b);
+                        } /* end if */
+
+                        /* Check for additions to the a_and_b list */
+                        if(down_a_and_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_and_b list */
+                            if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_b->high,down_a_and_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_and_b);
+                        } /* end if */
+
+                        /* Check for additions to the b_not_a list */
+                        if(down_b_not_a!=NULL) {
+                            /* Merge/add overlapped part with/to b_not_a list */
+                            if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,down_b_not_a,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_b_not_a);
+                        } /* end if */
+                    } /* end else */
+
+                    /* Split off upper part of span 'a' at upper span of span 'b' */
+
+                    /* Allocate new span node for upper part of span 'a' */
+                    if((tmp_span = H5S_hyper_new_span(span_b->high+1,span_a->high,span_a->down,span_a->next))==NULL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Make upper part of span 'a' the new span 'a' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,tmp_span);
+                    recover_a=1;
+
+                    /* Advance span 'b' */
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end if */
+                /* Check if span 'a' is entirely within span 'b' */
+                /*                AAAAA                  */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                else if(span_a->low>=span_b->low && span_a->high<=span_b->high) {
+                    /* Split off lower part of span 'b' at lower span of span 'a' */
+
+                    /* Check if there is actually a lower part of span 'b' to split off */
+                    if(span_a->low>span_b->low) {
+                        /* Merge/add lower part of span 'b' with/to b_not_a list */
+                        if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    else {
+                        /* Keep going, nothing to split off */
+                    } /* end else */
+
+                    /* Check for overlaps between span 'a' and midle of span 'b' */
+
+                    /* Make certain both spans either have a down span or both don't have one */
+                    HDassert((span_a->down != NULL && span_b->down != NULL) || (span_a->down == NULL && span_b->down == NULL));
+
+                    /* If there are no down spans, just add the overlapping area to the a_and_b list */
+                    if(span_a->down==NULL) {
+                        /* Merge/add overlapped part with/to a_and_b list */
+                        if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_a->high,NULL,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    /* If there are down spans, check for the overlap in them and add to each appropriate list */
+                    else {
+                        /* NULL out the temporary pointers to clipped areas in down spans */
+                        down_a_not_b=NULL;
+                        down_a_and_b=NULL;
+                        down_b_not_a=NULL;
+
+                        /* Check for overlaps in the 'down spans' of span 'a' & 'b' */
+                        if(H5S_hyper_clip_spans(span_a->down,span_b->down,&down_a_not_b,&down_a_and_b,&down_b_not_a)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+                        /* Check for additions to the a_not_b list */
+                        if(down_a_not_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_not_b list */
+                            if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,down_a_not_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_not_b);
+                        } /* end if */
+
+                        /* Check for additions to the a_and_b list */
+                        if(down_a_and_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_and_b list */
+                            if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_a->high,down_a_and_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_and_b);
+                        } /* end if */
+
+                        /* Check for additions to the b_not_a list */
+                        if(down_b_not_a!=NULL) {
+                            /* Merge/add overlapped part with/to b_not_a list */
+                            if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_a->low,span_a->high,down_b_not_a,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_b_not_a);
+                        } /* end if */
+                    } /* end else */
+
+                    /* Check if there is actually an upper part of span 'b' to split off */
+                    if(span_a->high<span_b->high) {
+                        /* Split off upper part of span 'b' at upper span of span 'a' */
+
+                        /* Allocate new span node for upper part of spans 'a' */
+                        if((tmp_span = H5S_hyper_new_span(span_a->high+1,span_b->high,span_b->down,span_b->next))==NULL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                        /* And advance span 'a' */
+                        H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+
+                        /* Make upper part of span 'b' the new span 'b' */
+                        H5S_hyper_recover_span(&recover_b,&span_b,tmp_span);
+                        recover_b=1;
+                    } /* end if */
+                    else {
+                        /* Advance both span 'a' & span 'b' */
+                        H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                        H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                    } /* end else */
+                } /* end if */
+                /* Check if span 'a' overlaps only the upper bound */
+                /*  of span 'b' */
+                /*                AAAAAAAAAA             */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                else if((span_a->low>=span_b->low && span_a->low<=span_b->high) && span_a->high>span_b->high) {
+                    /* Check if there is actually a lower part of span 'b' to split off */
+                    if(span_a->low>span_b->low) {
+                        /* Split off lower part of span 'b' at lower span of span 'a' */
+
+                        /* Merge/add lower part of span 'b' with/to b_not_a list */
+                        if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    else {
+                        /* Keep going, nothing to split off */
+                    } /* end else */
+
+                    /* Check for overlaps between lower part of span 'a' and upper part of span 'b' */
+
+                    /* Make certain both spans either have a down span or both don't have one */
+                    HDassert((span_a->down != NULL && span_b->down != NULL) || (span_a->down == NULL && span_b->down == NULL));
+
+                    /* If there are no down spans, just add the overlapping area to the a_and_b list */
+                    if(span_a->down==NULL) {
+                        /* Merge/add overlapped part with/to a_and_b list */
+                        if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_b->high,NULL,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                    } /* end if */
+                    /* If there are down spans, check for the overlap in them and add to each appropriate list */
+                    else {
+                        /* NULL out the temporary pointers to clipped areas in down spans */
+                        down_a_not_b=NULL;
+                        down_a_and_b=NULL;
+                        down_b_not_a=NULL;
+
+                        /* Check for overlaps in the 'down spans' of span 'a' & 'b' */
+                        if(H5S_hyper_clip_spans(span_a->down,span_b->down,&down_a_not_b,&down_a_and_b,&down_b_not_a)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+                        /* Check for additions to the a_not_b list */
+                        if(down_a_not_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_not_b list */
+                            if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->high,down_a_not_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_not_b);
+                        } /* end if */
+
+                        /* Check for additions to the a_and_b list */
+                        if(down_a_and_b!=NULL) {
+                            /* Merge/add overlapped part with/to a_and_b list */
+                            if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_b->high,down_a_and_b,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_a_and_b);
+                        } /* end if */
+
+                        /* Check for additions to the b_not_a list */
+                        if(down_b_not_a!=NULL) {
+                            /* Merge/add overlapped part with/to b_not_a list */
+                            if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_a->low,span_b->high,down_b_not_a,NULL)==FAIL)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                            /* Release the down span tree generated */
+                            H5S_hyper_free_span_info(down_b_not_a);
+                        } /* end if */
+                    } /* end else */
+
+                    /* Split off upper part of span 'a' at upper span of span 'b' */
+
+                    /* Allocate new span node for upper part of span 'a' */
+                    if((tmp_span = H5S_hyper_new_span(span_b->high+1,span_a->high,span_a->down,span_a->next))==NULL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Make upper part of span 'a' into new span 'a' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,tmp_span);
+                    recover_a=1;
+
+                    /* Advance span 'b' */
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end if */
+                /* span 'a' must be entirely above span 'b' */
+                /*                         AAAAA         */
+                /* <-----------------------------------> */
+                /*             BBBBBBBBBB                */
+                else {
+                    /* Copy span 'b' and add to b_not_a list */
+
+                    /* Merge/add span 'b' with/to b_not_a list */
+                    if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Advance span 'b', leave span 'a' */
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end else */
+            } /* end while */
+
+            /* Clean up 'a' spans which haven't been covered yet */
+            if(span_a!=NULL && span_b==NULL) {
+                while(span_a!=NULL) {
+                    /* Copy span 'a' and add to a_not_b list */
+
+                    /* Merge/add span 'a' with/to a_not_b list */
+                    if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Advance to the next 'a' span */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                } /* end while */
+            } /* end if */
+            /* Clean up 'b' spans which haven't been covered yet */
+            else if(span_a==NULL && span_b!=NULL) {
+                while(span_b!=NULL) {
+                    /* Copy span 'b' and add to b_not_a list */
+
+                    /* Merge/add span 'b' with/to b_not_a list */
+                    if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+                    /* Advance to the next 'b' span */
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end while */
+            } /* end if */
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_clip_spans() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_merge_spans_helper
+ PURPOSE
+    Merge two hyperslab span tree together
+ USAGE
+    H5S_hyper_span_info_t *H5S_hyper_merge_spans_helper(a_spans, b_spans)
+        H5S_hyper_span_info_t *a_spans; IN: First hyperslab spans to merge
+                                                together
+        H5S_hyper_span_info_t *b_spans; IN: Second hyperslab spans to merge
+                                                together
+ RETURNS
+    Pointer to span tree containing the merged spans on success, NULL on failure
+ DESCRIPTION
+    Merge two sets of hyperslab spans together and return the span tree from
+    the merged set.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_info_t *
+H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_spans)
+{
+    H5S_hyper_span_info_t *merged_spans=NULL; /* Pointer to the merged span tree */
+    H5S_hyper_span_info_t *tmp_spans;   /* Pointer to temporary new span tree */
+    H5S_hyper_span_t *tmp_span;         /* Pointer to temporary new span */
+    H5S_hyper_span_t *span_a;           /* Pointer to current span 'a' working on */
+    H5S_hyper_span_t *span_b;           /* Pointer to current span 'b' working on */
+    H5S_hyper_span_t *prev_span_merge;  /* Pointer to previous merged span */
+    unsigned recover_a, recover_b;         /* Flags to indicate when to recover temporary spans */
+    H5S_hyper_span_info_t *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Make certain both 'a' & 'b' spans have down span trees or neither does */
+    HDassert((a_spans != NULL && b_spans != NULL) || (a_spans == NULL && b_spans == NULL));
+
+    /* Check if the span trees for the 'a' span and the 'b' span are the same */
+    if(H5S_hyper_cmp_spans(a_spans,b_spans)==TRUE) {
+        if(a_spans==NULL)
+            merged_spans=NULL;
+        else {
+            /* Copy one of the span trees to return */
+            if((merged_spans=H5S_hyper_copy_span(a_spans))==NULL)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "can't copy hyperslab span tree")
+        } /* end else */
+    } /* end if */
+    else {
+        /* Get the pointers to the 'a' and 'b' span lists */
+        span_a=a_spans->head;
+        span_b=b_spans->head;
+
+        /* Set the pointer to the previous spans */
+        prev_span_merge=NULL;
+
+        /* No spans to recover yet */
+        recover_a=recover_b=0;
+
+        /* Work through the list of spans in the new list */
+        while(span_a!=NULL && span_b!=NULL) {
+            /* Check if the 'a' span is completely before 'b' span */
+            /*    AAAAAAA                            */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            if(span_a->high<span_b->low) {
+                /* Merge/add span 'a' with/to the merged spans */
+                if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Advance span 'a' */
+                H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+            } /* end if */
+            /* Check if span 'a' overlaps only the lower bound */
+            /*  of span 'b', up to the upper bound of span 'b' */
+            /*    AAAAAAAAAAAA                       */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            else if(span_a->low<span_b->low && (span_a->high>=span_b->low && span_a->high<=span_b->high)) {
+                /* Check if span 'a' and span 'b' down spans are equal */
+                if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
+                    /* Merge/add copy of span 'a' with/to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                } /* end if */
+                else {
+                    /* Merge/add lower part of span 'a' with/to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Get merged span tree for overlapped section */
+                    tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
+
+                    /* Merge/add overlapped section to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->high,tmp_spans,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Release merged span tree for overlapped section */
+                    H5S_hyper_free_span_info(tmp_spans);
+                } /* end else */
+
+                /* Check if there is an upper part of span 'b' */
+                if(span_a->high<span_b->high) {
+                    /* Copy upper part of span 'b' as new span 'b' */
+
+                    /* Allocate new span node to append to list */
+                    if((tmp_span = H5S_hyper_new_span(span_a->high+1,span_b->high,span_b->down,span_b->next))==NULL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Advance span 'a' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+
+                    /* Set new span 'b' to tmp_span */
+                    H5S_hyper_recover_span(&recover_b,&span_b,tmp_span);
+                    recover_b=1;
+                } /* end if */
+                else {
+                    /* Advance both span 'a' & 'b' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end else */
+            } /* end if */
+            /* Check if span 'a' overlaps the lower & upper bound */
+            /*  of span 'b' */
+            /*    AAAAAAAAAAAAAAAAAAAAA              */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            else if(span_a->low<span_b->low && span_a->high>span_b->high) {
+                /* Check if span 'a' and span 'b' down spans are equal */
+                if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
+                    /* Merge/add copy of lower & middle parts of span 'a' to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->high,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                } /* end if */
+                else {
+                    /* Merge/add lower part of span 'a' to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Get merged span tree for overlapped section */
+                    tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
+
+                    /* Merge/add overlapped section to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,tmp_spans,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Release merged span tree for overlapped section */
+                    H5S_hyper_free_span_info(tmp_spans);
+                } /* end else */
+
+                /* Copy upper part of span 'a' as new span 'a' (remember to free) */
+
+                /* Allocate new span node to append to list */
+                if((tmp_span = H5S_hyper_new_span(span_b->high+1,span_a->high,span_a->down,span_a->next))==NULL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Set new span 'a' to tmp_span */
+                H5S_hyper_recover_span(&recover_a,&span_a,tmp_span);
+                recover_a=1;
+
+                /* Advance span 'b' */
+                H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+            } /* end if */
+            /* Check if span 'a' is entirely within span 'b' */
+            /*                AAAAA                  */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            else if(span_a->low>=span_b->low && span_a->high<=span_b->high) {
+                /* Check if span 'a' and span 'b' down spans are equal */
+                if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
+                    /* Merge/add copy of lower & middle parts of span 'b' to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->high,span_a->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                } /* end if */
+                else {
+                    /* Check if there is a lower part of span 'b' */
+                    if(span_a->low>span_b->low) {
+                        /* Merge/add lower part of span 'b' to merged spans */
+                        if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    } /* end if */
+                    else {
+                        /* No lower part of span 'b' , keep going... */
+                    } /* end else */
+
+                    /* Get merged span tree for overlapped section */
+                    tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
+
+                    /* Merge/add overlapped section to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,tmp_spans,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Release merged span tree for overlapped section */
+                    H5S_hyper_free_span_info(tmp_spans);
+                } /* end else */
+
+                /* Check if there is an upper part of span 'b' */
+                if(span_a->high<span_b->high) {
+                    /* Copy upper part of span 'b' as new span 'b' (remember to free) */
+
+                    /* Allocate new span node to append to list */
+                    if((tmp_span = H5S_hyper_new_span(span_a->high+1,span_b->high,span_b->down,span_b->next))==NULL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Advance span 'a' */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+
+                    /* Set new span 'b' to tmp_span */
+                    H5S_hyper_recover_span(&recover_b,&span_b,tmp_span);
+                    recover_b=1;
+                } /* end if */
+                else {
+                    /* Advance both spans */
+                    H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+                    H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+                } /* end else */
+            } /* end if */
+            /* Check if span 'a' overlaps only the upper bound */
+            /*  of span 'b' */
+            /*                AAAAAAAAAA             */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            else if((span_a->low>=span_b->low && span_a->low<=span_b->high) && span_a->high>span_b->high) {
+                /* Check if span 'a' and span 'b' down spans are equal */
+                if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
+                    /* Merge/add copy of span 'b' to merged spans if so */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                } /* end if */
+                else {
+                    /* Check if there is a lower part of span 'b' */
+                    if(span_a->low>span_b->low) {
+                        /* Merge/add lower part of span 'b' to merged spans */
+                        if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    } /* end if */
+                    else {
+                        /* No lower part of span 'b' , keep going... */
+                    } /* end else */
+
+                    /* Get merged span tree for overlapped section */
+                    tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
+
+                    /* Merge/add overlapped section to merged spans */
+                    if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->high,tmp_spans,NULL)==FAIL)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                    /* Release merged span tree for overlapped section */
+                    H5S_hyper_free_span_info(tmp_spans);
+                } /* end else */
+
+                /* Copy upper part of span 'a' as new span 'a' */
+
+                /* Allocate new span node to append to list */
+                if((tmp_span = H5S_hyper_new_span(span_b->high+1,span_a->high,span_a->down,span_a->next))==NULL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Set new span 'a' to tmp_span */
+                H5S_hyper_recover_span(&recover_a,&span_a,tmp_span);
+                recover_a=1;
+
+                /* Advance span 'b' */
+                H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+            } /* end if */
+            /* Span 'a' must be entirely above span 'b' */
+            /*                         AAAAA         */
+            /* <-----------------------------------> */
+            /*             BBBBBBBBBB                */
+            else {
+                /* Merge/add span 'b' with the merged spans */
+                if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Advance span 'b' */
+                H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+            } /* end else */
+        } /* end while */
+
+        /* Clean up 'a' spans which haven't been added to the list of merged spans */
+        if(span_a!=NULL && span_b==NULL) {
+            while(span_a!=NULL) {
+                /* Merge/add all 'a' spans into the merged spans */
+                if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Advance to next 'a' span, until all processed */
+                H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
+            } /* end while */
+        } /* end if */
+
+        /* Clean up 'b' spans which haven't been added to the list of merged spans */
+        if(span_a==NULL && span_b!=NULL) {
+            while(span_b!=NULL) {
+                /* Merge/add all 'b' spans into the merged spans */
+                if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+                /* Advance to next 'b' span, until all processed */
+                H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
+            } /* end while */
+        } /* end if */
+    } /* end else */
+
+    /* Set return value */
+    ret_value = merged_spans;
+
+done:
+    if(ret_value == NULL) {
+        if(merged_spans)
+            if(H5S_hyper_free_span_info(merged_spans) < 0)
+                HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, NULL, "failed to release merged hyperslab spans")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_merge_spans_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_merge_spans
+ PURPOSE
+    Merge new hyperslab spans to existing hyperslab selection
+ USAGE
+    herr_t H5S_hyper_merge_spans(space, new_spans, can_own)
+        H5S_t *space;             IN: Dataspace to add new spans to hyperslab
+                                        selection.
+        H5S_hyper_span_t *new_spans;    IN: Span tree of new spans to add to
+                                            hyperslab selection
+        hbool_t can_own;        IN: Flag to indicate that it is OK to point
+                                    directly to the new spans, instead of
+                                    copying them.
+ RETURNS
+    non-negative on success, negative on failure
+ DESCRIPTION
+    Add a set of hyperslab spans to an existing hyperslab selection.  The
+    new spans are required to be non-overlapping with the existing spans in
+    the dataspace's current hyperslab selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_merge_spans (H5S_t *space, H5S_hyper_span_info_t *new_spans, hbool_t can_own)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(new_spans);
+
+    /* If this is the first span tree in the hyperslab selection, just use it */
+    if(space->select.sel_info.hslab->span_lst==NULL) {
+        if(can_own)
+            space->select.sel_info.hslab->span_lst=new_spans;
+        else
+            space->select.sel_info.hslab->span_lst=H5S_hyper_copy_span(new_spans);
+    } /* end if */
+    else {
+        H5S_hyper_span_info_t *merged_spans;
+
+        /* Get the merged spans */
+        merged_spans=H5S_hyper_merge_spans_helper(space->select.sel_info.hslab->span_lst, new_spans);
+
+        /* Sanity checking since we started with some spans, we should still have some after the merge */
+        HDassert(merged_spans);
+
+        /* Free the previous spans */
+        H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst);
+
+        /* Point to the new merged spans */
+        space->select.sel_info.hslab->span_lst=merged_spans;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_hyper_merge_spans() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_spans_nelem
+ PURPOSE
+    Count the number of elements in a span tree
+ USAGE
+    hsize_t H5S_hyper_spans_nelem(spans)
+        const H5S_hyper_span_info_t *spans; IN: Hyperslan span tree to count elements of
+ RETURNS
+    Number of elements in span tree on success; negative on failure
+ DESCRIPTION
+    Counts the number of elements described by the spans in a span tree.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hsize_t
+H5S_hyper_spans_nelem (H5S_hyper_span_info_t *spans)
+{
+    H5S_hyper_span_t *span;     /* Hyperslab span */
+    hsize_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Count the number of elements in the span tree */
+    if(spans==NULL)
+        ret_value=0;
+    else {
+        span=spans->head;
+        ret_value=0;
+        while(span!=NULL) {
+            /* If there are down spans, multiply the size of this span by the total down span elements */
+            if(span->down!=NULL)
+                ret_value+=span->nelem*H5S_hyper_spans_nelem(span->down);
+            /* If there are no down spans, just count the elements in this span */
+            else
+                ret_value+=span->nelem;
+
+            /* Advance to next span */
+            span=span->next;
+        } /* end while */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_spans_nelem() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_make_spans
+ PURPOSE
+    Create a span tree
+ USAGE
+    H5S_hyper_span_t *H5S_hyper_make_spans(rank, start, stride, count, block)
+        unsigned rank;               IN: # of dimensions of the space
+        const hsize_t *start;    IN: Starting location of the hyperslabs
+        const hsize_t *stride;    IN: Stride from the beginning of one block to
+                                        the next
+        const hsize_t *count;     IN: Number of blocks
+        const hsize_t *block;     IN: Size of hyperslab block
+ RETURNS
+    Pointer to new span tree on success, NULL on failure
+ DESCRIPTION
+    Generates a new span tree for the hyperslab parameters specified.
+    Each span tree has a list of the elements spanned in each dimension, with
+    each span node containing a pointer to the list of spans in the next
+    dimension down.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static H5S_hyper_span_info_t *
+H5S_hyper_make_spans(unsigned rank, const hsize_t *start, const hsize_t *stride,
+    const hsize_t *count, const hsize_t *block)
+{
+    H5S_hyper_span_info_t *down = NULL;     /* Pointer to spans in next dimension down */
+    H5S_hyper_span_t      *last_span;       /* Current position in hyperslab span list */
+    H5S_hyper_span_t      *head = NULL;     /* Head of new hyperslab span list */
+    hsize_t                stride_iter;     /* Iterator over the stride values */
+    int                    i;               /* Counters */
+    unsigned               u;               /* Counters */
+    H5S_hyper_span_info_t *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(rank > 0);
+    HDassert(start);
+    HDassert(stride);
+    HDassert(count);
+    HDassert(block);
+
+    /* Start creating spans in fastest changing dimension */
+    for(i = (int)(rank - 1); i >= 0; i--) {
+
+        /* Sanity check */
+        if(0 == count[i])
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, NULL, "count == 0 is invalid")
+
+        /* Start a new list in this dimension */
+        head = NULL;
+        last_span = NULL;
+
+        /* Generate all the span segments for this dimension */
+        for(u = 0, stride_iter = 0; u < count[i]; u++, stride_iter += stride[i]) {
+            H5S_hyper_span_t      *span;            /* New hyperslab span */
+
+            /* Allocate a span node */
+            if(NULL == (span = H5FL_MALLOC(H5S_hyper_span_t)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate hyperslab span")
+
+            /* Set the span's basic information */
+            span->low = start[i] + stride_iter;
+            span->high = span->low + (block[i] - 1);
+            span->nelem = block[i];
+            span->pstride = stride[i];
+            span->next = NULL;
+
+            /* Append to the list of spans in this dimension */
+            if(head == NULL)
+                head = span;
+            else
+                last_span->next = span;
+
+            /* Move current pointer */
+            last_span = span;
+
+            /* Set the information for the next dimension down's spans, if appropriate */
+            if(down != NULL) {
+                span->down = down;
+                down->count++;  /* Increment reference count for shared span */
+            } /* end if */
+            else {
+                span->down = NULL;
+            } /* end else */
+        } /* end for */
+
+        /* Allocate a span info node */
+        if(NULL == (down = H5FL_MALLOC(H5S_hyper_span_info_t)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate hyperslab span")
+
+        /* Set the reference count */
+        down->count = 0;
+
+        /* Reset the scratch pad space */
+        down->scratch = 0;
+
+        /* Keep the pointer to the next dimension down's completed list */
+        down->head = head;
+    } /* end for */
+
+    /* Indicate that there is a pointer to this tree */
+    down->count = 1;
+
+    /* Success!  Return the head of the list in the slowest changing dimension */
+    ret_value = down;
+
+done:
+    /* cleanup if error (ret_value will be NULL) */
+    if(!ret_value) {
+        if(head || down) {
+            if(head && down)
+                if(down->head != head)
+                    down = NULL;
+
+            do {
+                if(down) {
+                    head = down->head;
+                    down = H5FL_FREE(H5S_hyper_span_info_t, down);
+                } /* end if */
+                down = head->down;
+
+                while(head) {
+                    last_span = head->next;
+                    head = H5FL_FREE(H5S_hyper_span_t, head);
+                    head = last_span;
+                } /* end while */
+            } while(down);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_make_spans() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_rebuild_helper
+ PURPOSE
+    Helper routine to rebuild optimized hyperslab information if possible.
+    (It can be recovered with regular selection)
+ USAGE
+    herr_t H5S_hyper_rebuild_helper(space)
+        const H5S_hyper_span_t *span;   IN: Portion of span tree to check
+        H5S_hyper_dim_t span_slab[];    OUT: Rebuilt section of hyperslab description
+        unsigned rank;                  IN: Current dimension to work on
+ RETURNS
+    >=0 on success, <0 on failure
+ DESCRIPTION
+    Examine the span tree for a hyperslab selection and rebuild
+    the start/stride/count/block information for the selection, if possible.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    To be able to recover the optimized information, the span tree must conform
+    to span tree able to be generated from a single H5S_SELECT_SET operation.
+
+ EXAMPLES
+ REVISION LOG
+    KY, 2005/9/22
+--------------------------------------------------------------------------*/
+static hbool_t
+H5S_hyper_rebuild_helper(const H5S_hyper_span_t *span, H5S_hyper_dim_t span_slab_info[],
+    unsigned rank)
+{
+    hsize_t curr_stride, next_stride;
+    hsize_t curr_block, next_block;
+    hsize_t curr_start;
+    hsize_t curr_low;
+    size_t outcount;
+    unsigned u;
+    H5S_hyper_dim_t      canon_down_span_slab_info[H5S_MAX_RANK];
+    hbool_t ret_value = TRUE;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(span) {
+        /* Initialization */
+        curr_stride     = 1;
+        curr_block      = 0;
+        outcount        = 0;
+        curr_low        = 0;
+
+        /* Get "canonical" down span information */
+        if(span->down) {
+            HDassert(span->down->head);
+
+            /* Go to the next down span and check whether the selection can be rebuilt.*/
+            if(!H5S_hyper_rebuild_helper(span->down->head, span_slab_info, rank - 1))
+                HGOTO_DONE(FALSE)
+
+            HDmemcpy(canon_down_span_slab_info, span_slab_info, sizeof(H5S_hyper_dim_t) * rank);
+        } /* end if */
+
+        /* Assign the initial starting point & block size */
+        curr_start = span->low;
+        curr_block = (span->high - span->low) + 1;
+
+        /* Loop the span */
+        while(span) {
+            if(outcount > 0) {
+                if(span->down) {
+                    H5S_hyper_dim_t      *curr_down_span_slab_info;
+
+                    HDassert(span->down->head);
+
+                    /* Go to the next down span and check whether the selection can be rebuilt.*/
+                    if(!H5S_hyper_rebuild_helper(span->down->head, span_slab_info, rank - 1))
+                        HGOTO_DONE(FALSE)
+
+                    /* Compare the slab information of the adjacent spans in the down span tree.
+                       We have to compare all the sub-tree slab information with the canon_down_span_slab_info.*/
+
+                    for( u = 0; u < rank - 1; u++) {
+                       curr_down_span_slab_info = &span_slab_info[u];
+
+                       if(curr_down_span_slab_info->count > 0 && canon_down_span_slab_info[u].count > 0) {
+                          if(curr_down_span_slab_info->start != canon_down_span_slab_info[u].start
+                              || curr_down_span_slab_info->stride != canon_down_span_slab_info[u].stride
+                              || curr_down_span_slab_info->block != canon_down_span_slab_info[u].block
+                              || curr_down_span_slab_info->count != canon_down_span_slab_info[u].count)
+                          HGOTO_DONE(FALSE)
+                       } /* end if */
+                       else if (!((curr_down_span_slab_info->count == 0) && (canon_down_span_slab_info[u].count == 0)))
+                          HGOTO_DONE(FALSE)
+                    }
+                } /* end if */
+            } /* end if */
+
+            /* Obtain values for stride and block */
+            next_stride  = span->low  - curr_low;
+            next_block   = (span->high - span->low) + 1;
+
+            /* Compare stride and block in this span, to compare stride,
+             * three spans are needed. Ignore the first two spans.
+             */
+            if(outcount  > 1  && curr_stride != next_stride)
+                HGOTO_DONE(FALSE)
+            if(outcount != 0  && next_block  != curr_block)
+                HGOTO_DONE(FALSE)
+
+            /* Keep the isolated stride to be 1 */
+            if(outcount != 0)
+                curr_stride = next_stride;
+
+            /* Keep current starting point */
+            curr_low    = span->low;
+
+            /* Advance to next span */
+            span = span->next;
+            outcount++;
+        } /* end while */
+
+        /* Save the span information. */
+        span_slab_info[rank - 1].start  = curr_start;
+        span_slab_info[rank - 1].count  = outcount;
+        span_slab_info[rank - 1].block  = curr_block;
+        span_slab_info[rank - 1].stride = curr_stride;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_rebuild_helper() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_rebuild
+ PURPOSE
+    Rebuild optimized hyperslab information if possible.
+    (It can be recovered with regular selection)
+ USAGE
+    herr_t H5S_hyper_rebuild(space)
+        const H5S_t *space;     IN: Dataspace to check
+ RETURNS
+    >=0 on success, <0 on failure
+ DESCRIPTION
+    Examine the span tree for a hyperslab selection and rebuild
+    the start/stride/count/block information for the selection, if possible.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    To be able to recover the optimized information, the span tree must conform
+    to span tree able to be generated from a single H5S_SELECT_SET operation.
+
+ EXAMPLES
+ REVISION LOG
+
+    This routine is the optimization of the old version. The previous version
+    can only detect a singluar selection. This version is general enough to
+    detect any regular selection.
+    KY, 2005/9/22
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_hyper_rebuild(H5S_t *space)
+{
+    H5S_hyper_dim_t top_span_slab_info[H5O_LAYOUT_NDIMS];
+    H5S_hyper_dim_t *diminfo;
+    H5S_hyper_dim_t *app_diminfo;
+    unsigned rank, curr_dim;
+    htri_t ret_value = TRUE;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(space->select.sel_info.hslab->span_lst);
+
+    /* Check the rank of space */
+    rank = space->extent.rank;
+
+    /* Check whether the slab can be rebuilt. Only regular selection can be rebuilt. If yes, fill in correct values.*/
+    if(!H5S_hyper_rebuild_helper(space->select.sel_info.hslab->span_lst->head, top_span_slab_info, rank)) {
+        HGOTO_DONE(FALSE)
+    } /* end if */
+    else {
+        diminfo=space->select.sel_info.hslab->opt_diminfo;
+        app_diminfo=space->select.sel_info.hslab->app_diminfo;
+
+        for(curr_dim = 0; curr_dim < rank; curr_dim++) {
+
+            app_diminfo[(rank - curr_dim) - 1].start  = diminfo[(rank - curr_dim) - 1].start = top_span_slab_info[curr_dim].start;
+            app_diminfo[(rank - curr_dim) - 1].stride = diminfo[(rank - curr_dim) - 1].stride = top_span_slab_info[curr_dim].stride;
+            app_diminfo[(rank - curr_dim) - 1].count  = diminfo[(rank - curr_dim) - 1].count = top_span_slab_info[curr_dim].count;
+            app_diminfo[(rank - curr_dim) - 1].block  = diminfo[(rank - curr_dim) - 1].block = top_span_slab_info[curr_dim].block;
+
+        } /* end for */
+
+        space->select.sel_info.hslab->diminfo_valid = TRUE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_rebuild() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_generate_spans
+ PURPOSE
+    Create span tree for a regular hyperslab selection
+ USAGE
+    herr_t H5S_hyper_generate_spans(space)
+        H5S_t *space;           IN/OUT: Pointer to dataspace
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Create a span tree representation of a regular hyperslab selection and
+    add it to the information for the hyperslab selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_generate_spans(H5S_t *space)
+{
+    hsize_t tmp_start[H5O_LAYOUT_NDIMS];   /* Temporary start information */
+    hsize_t tmp_stride[H5O_LAYOUT_NDIMS];   /* Temporary stride information */
+    hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary count information */
+    hsize_t tmp_block[H5O_LAYOUT_NDIMS];    /* Temporary block information */
+    unsigned u;                             /* Counter */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
+
+    /* Get the diminfo */
+    for(u=0; u<space->extent.rank; u++) {
+        tmp_start[u]=space->select.sel_info.hslab->opt_diminfo[u].start;
+        tmp_stride[u]=space->select.sel_info.hslab->opt_diminfo[u].stride;
+        tmp_count[u]=space->select.sel_info.hslab->opt_diminfo[u].count;
+        tmp_block[u]=space->select.sel_info.hslab->opt_diminfo[u].block;
+    } /* end for */
+
+    /* Build the hyperslab information also */
+    if(H5S_generate_hyperslab (space, H5S_SELECT_SET, tmp_start, tmp_stride, tmp_count, tmp_block)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't generate hyperslabs")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_hyper_generate_spans() */
+
+#ifndef NEW_HYPERSLAB_API
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_generate_hyperlab
+ *
+ * Purpose:	Generate hyperslab information from H5S_select_hyperslab()
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol (split from HS_select_hyperslab()).
+ *              Tuesday, September 12, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_generate_hyperslab (H5S_t *space, H5S_seloper_t op,
+		      const hsize_t start[],
+		      const hsize_t stride[],
+		      const hsize_t count[],
+		      const hsize_t block[])
+{
+    H5S_hyper_span_info_t *new_spans=NULL;  /* Span tree for new hyperslab */
+    H5S_hyper_span_info_t *a_not_b=NULL;    /* Span tree for hyperslab spans in old span tree and not in new span tree */
+    H5S_hyper_span_info_t *a_and_b=NULL;    /* Span tree for hyperslab spans in both old and new span trees */
+    H5S_hyper_span_info_t *b_not_a=NULL;    /* Span tree for hyperslab spans in new span tree and not in old span tree */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+    HDassert(start);
+    HDassert(stride);
+    HDassert(count);
+    HDassert(block);
+
+    /* Generate span tree for new hyperslab information */
+    if((new_spans=H5S_hyper_make_spans(space->extent.rank,start,stride,count,block))==NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't create hyperslab information")
+
+    /* Generate list of blocks to add/remove based on selection operation */
+    if(op==H5S_SELECT_SET) {
+        /* Add new spans to current selection */
+        if(H5S_hyper_merge_spans(space,new_spans,TRUE)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+        /* Set the number of elements in current selection */
+        space->select.num_elem=H5S_hyper_spans_nelem(new_spans);
+
+        /* Indicate that the new_spans are owned */
+        new_spans=NULL;
+    } /* end if */
+    else {
+        hbool_t updated_spans = FALSE;  /* Whether the spans in the selection were modified */
+
+        /* Generate lists of spans which overlap and don't overlap */
+        if(H5S_hyper_clip_spans(space->select.sel_info.hslab->span_lst,new_spans,&a_not_b,&a_and_b,&b_not_a)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+        switch(op) {
+            case H5S_SELECT_OR:
+                /* Add any new spans from b_not_a to current selection */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(space,b_not_a,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem+=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_AND:
+                /* Free the current selection */
+                if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst)<0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+                space->select.sel_info.hslab->span_lst=NULL;
+
+                /* Reset the number of items in selection */
+                space->select.num_elem=0;
+
+                /* Check if there are any overlapped selections */
+                if(a_and_b!=NULL) {
+                    if(H5S_hyper_merge_spans(space,a_and_b,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem=H5S_hyper_spans_nelem(a_and_b);
+
+                    /* Indicate that the a_and_b spans are owned */
+                    a_and_b=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_XOR:
+                /* Free the current selection */
+                if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst)<0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+                space->select.sel_info.hslab->span_lst=NULL;
+
+                /* Reset the number of items in selection */
+                space->select.num_elem=0;
+
+                /* Check if there are any non-overlapped selections */
+                if(a_not_b!=NULL) {
+                    if(H5S_hyper_merge_spans(space,a_not_b,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem=H5S_hyper_spans_nelem(a_not_b);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(space,b_not_a,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem+=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_NOTB:
+                /* Free the current selection */
+                if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst)<0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+                space->select.sel_info.hslab->span_lst=NULL;
+
+                /* Reset the number of items in selection */
+                space->select.num_elem=0;
+
+                /* Check if there are any non-overlapped selections */
+                if(a_not_b!=NULL) {
+                    if(H5S_hyper_merge_spans(space,a_not_b,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem=H5S_hyper_spans_nelem(a_not_b);
+
+                    /* Indicate that the a_not_b are owned */
+                    a_not_b=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_NOTA:
+                /* Free the current selection */
+                if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst)<0)
+                    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+                space->select.sel_info.hslab->span_lst=NULL;
+
+                /* Reset the number of items in selection */
+                space->select.num_elem=0;
+
+                /* Check if there are any non-overlapped selections */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(space,b_not_a,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    space->select.num_elem=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the b_not_a are owned */
+                    b_not_a=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_NOOP:
+            case H5S_SELECT_SET:
+            case H5S_SELECT_APPEND:
+            case H5S_SELECT_PREPEND:
+            case H5S_SELECT_INVALID:
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+        } /* end switch */
+
+        /* Check if the resulting hyperslab span tree is empty */
+        if(space->select.sel_info.hslab->span_lst==NULL) {
+            H5S_hyper_span_info_t *spans;     /* Empty hyperslab span tree */
+
+            /* Sanity check */
+            HDassert(space->select.num_elem == 0);
+
+            /* Allocate a span info node */
+            if((spans = H5FL_MALLOC(H5S_hyper_span_info_t))==NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+
+            /* Set the reference count */
+            spans->count=1;
+
+            /* Reset the scratch pad space */
+            spans->scratch=0;
+
+            /* Set to empty tree */
+            spans->head=NULL;
+
+            /* Set pointer to empty span tree */
+            space->select.sel_info.hslab->span_lst=spans;
+        } /* end if */
+        else {
+            /* Check if we updated the spans */
+            if(updated_spans) {
+                /* Attempt to rebuild "optimized" start/stride/count/block information.
+                 * from resulting hyperslab span tree
+                 */
+                if(H5S_hyper_rebuild(space) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't rebuild hyperslab info")
+            } /* end if */
+        } /* end else */
+    } /* end else */
+
+done:
+    /* Free resources */
+    if(a_not_b)
+        if(H5S_hyper_free_span_info(a_not_b) < 0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+    if(a_and_b)
+        if(H5S_hyper_free_span_info(a_and_b) < 0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+    if(b_not_a)
+        if(H5S_hyper_free_span_info(b_not_a) < 0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+    if(new_spans)
+        if(H5S_hyper_free_span_info(new_spans) < 0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_generate_hyperslab() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_hyperslab
+ *
+ * Purpose:	Internal version of H5Sselect_hyperslab().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, January 10, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
+		      const hsize_t start[],
+		      const hsize_t *stride,
+		      const hsize_t count[],
+		      const hsize_t *block)
+{
+    hsize_t int_stride[H5O_LAYOUT_NDIMS];   /* Internal storage for stride information */
+    hsize_t int_count[H5O_LAYOUT_NDIMS];    /* Internal storage for count information */
+    hsize_t int_block[H5O_LAYOUT_NDIMS];    /* Internal storage for block information */
+    const hsize_t *opt_stride;      /* Optimized stride information */
+    const hsize_t *opt_count;       /* Optimized count information */
+    const hsize_t *opt_block;       /* Optimized block information */
+    unsigned u;                     /* Counters */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+    HDassert(start);
+    HDassert(count);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+
+    /* Point to the correct stride values */
+    if(stride==NULL)
+        stride = _ones;
+
+    /* Point to the correct block values */
+    if(block==NULL)
+        block = _ones;
+
+    /*
+     * Check new selection.
+     */
+    for(u=0; u<space->extent.rank; u++) {
+        /* Check for overlapping hyperslab blocks in new selection. */
+        if(count[u]>1 && stride[u]<block[u])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab blocks overlap")
+
+        /* Detect zero-sized hyperslabs in new selection */
+        if(count[u] == 0 || block[u] == 0) {
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    /* Convert to "none" selection */
+                    if(H5S_select_none(space)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    HGOTO_DONE(SUCCEED);
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays same */
+
+                case H5S_SELECT_NOOP:
+                case H5S_SELECT_APPEND:
+                case H5S_SELECT_PREPEND:
+                case H5S_SELECT_INVALID:
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+        } /* end if */
+    } /* end for */
+
+    /* Optimize hyperslab parameters to merge contiguous blocks, etc. */
+    if(stride == _ones && block == _ones) {
+        /* Point to existing arrays */
+        opt_stride = _ones;
+        opt_count = _ones;
+        opt_block = count;
+    } /* end if */
+    else {
+        /* Point to local arrays */
+        opt_stride = int_stride;
+        opt_count = int_count;
+        opt_block = int_block;
+        for(u=0; u<space->extent.rank; u++) {
+            /* contiguous hyperslabs have the block size equal to the stride */
+            if(stride[u]==block[u]) {
+                int_count[u]=1;
+                int_stride[u]=1;
+                if(block[u]==1)
+                    int_block[u]=count[u];
+                else
+                    int_block[u]=block[u]*count[u];
+            } /* end if */
+            else {
+                if(count[u]==1)
+                    int_stride[u]=1;
+                else {
+                    HDassert(stride[u] > block[u]);
+                    int_stride[u]=stride[u];
+                } /* end else */
+                int_count[u]=count[u];
+                int_block[u]=block[u];
+            } /* end else */
+        } /* end for */
+    } /* end else */
+
+    /* Fixup operation for non-hyperslab selections */
+    switch(H5S_GET_SELECT_TYPE(space)) {
+        case H5S_SEL_NONE:   /* No elements selected in dataspace */
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                    /* Change "none" selection to hyperslab selection */
+                    break;
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    op=H5S_SELECT_SET; /* Maps to "set" operation when applied to "none" selection */
+                    break;
+
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays "none" */
+
+                case H5S_SELECT_NOOP:
+                case H5S_SELECT_APPEND:
+                case H5S_SELECT_PREPEND:
+                case H5S_SELECT_INVALID:
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+            break;
+
+        case H5S_SEL_ALL:    /* All elements selected in dataspace */
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                    /* Change "all" selection to hyperslab selection */
+                    break;
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays "all" */
+
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                    op=H5S_SELECT_SET; /* Maps to "set" operation when applied to "none" selection */
+                    break;
+
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    /* Convert current "all" selection to "real" hyperslab selection */
+                    /* Then allow operation to proceed */
+                    {
+                        hsize_t tmp_start[H5O_LAYOUT_NDIMS];   /* Temporary start information */
+                        hsize_t tmp_stride[H5O_LAYOUT_NDIMS];   /* Temporary stride information */
+                        hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary count information */
+                        hsize_t tmp_block[H5O_LAYOUT_NDIMS];    /* Temporary block information */
+
+                        /* Fill in temporary information for the dimensions */
+                        for(u=0; u<space->extent.rank; u++) {
+                            tmp_start[u]=0;
+                            tmp_stride[u]=1;
+                            tmp_count[u]=1;
+                            tmp_block[u]=space->extent.size[u];
+                        } /* end for */
+
+                        /* Convert to hyperslab selection */
+                        if(H5S_select_hyperslab(space,H5S_SELECT_SET,tmp_start,tmp_stride,tmp_count,tmp_block)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    } /* end case */
+                    break;
+
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    /* Convert to "none" selection */
+                    if(H5S_select_none(space)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    HGOTO_DONE(SUCCEED);
+
+                case H5S_SELECT_NOOP:
+                case H5S_SELECT_APPEND:
+                case H5S_SELECT_PREPEND:
+                case H5S_SELECT_INVALID:
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+            break;
+
+        case H5S_SEL_HYPERSLABS:
+            /* Hyperslab operation on hyperslab selection, OK */
+            break;
+
+        case H5S_SEL_POINTS: /* Can't combine hyperslab operations and point selections currently */
+            if(op==H5S_SELECT_SET)      /* Allow only "set" operation to proceed */
+                break;
+            /* Else fall through to error */
+
+        case H5S_SEL_ERROR:
+        case H5S_SEL_N:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+    } /* end switch */
+
+    if(op == H5S_SELECT_SET) {
+        /* If we are setting a new selection, remove current selection first */
+        if(H5S_SELECT_RELEASE(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+        /* Allocate space for the hyperslab selection information */
+        if(NULL == (space->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+        /* Save the diminfo */
+        space->select.num_elem = 1;
+        for(u = 0; u < space->extent.rank; u++) {
+            space->select.sel_info.hslab->app_diminfo[u].start = start[u];
+            space->select.sel_info.hslab->app_diminfo[u].stride = stride[u];
+            space->select.sel_info.hslab->app_diminfo[u].count = count[u];
+            space->select.sel_info.hslab->app_diminfo[u].block = block[u];
+
+            space->select.sel_info.hslab->opt_diminfo[u].start = start[u];
+            space->select.sel_info.hslab->opt_diminfo[u].stride = opt_stride[u];
+            space->select.sel_info.hslab->opt_diminfo[u].count = opt_count[u];
+            space->select.sel_info.hslab->opt_diminfo[u].block = opt_block[u];
+
+            space->select.num_elem *= (opt_count[u] * opt_block[u]);
+        } /* end for */
+
+        /* Indicate that the dimension information is valid */
+        space->select.sel_info.hslab->diminfo_valid = TRUE;
+
+        /* Indicate that there's no slab information */
+        space->select.sel_info.hslab->span_lst = NULL;
+    } /* end if */
+    else if(op >= H5S_SELECT_OR && op <= H5S_SELECT_NOTA) {
+        /* Sanity check */
+        HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
+
+        /* Check if there's no hyperslab span information currently */
+        if(NULL == space->select.sel_info.hslab->span_lst)
+            if(H5S_hyper_generate_spans(space) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+        /* Indicate that the regular dimensions are no longer valid */
+        space->select.sel_info.hslab->diminfo_valid = FALSE;
+
+        /* Add in the new hyperslab information */
+        if(H5S_generate_hyperslab(space, op, start, opt_stride, opt_count, opt_block) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't generate hyperslabs")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+
+    /* Set selection type */
+    space->select.type = H5S_sel_hyper;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_hyperslab() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_hyperslab
+ PURPOSE
+    Specify a hyperslab to combine with the current hyperslab selection
+ USAGE
+    herr_t H5Sselect_hyperslab(dsid, op, start, stride, count, block)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+        H5S_seloper_t op;       IN: Operation to perform on current selection
+        const hsize_t *start;        IN: Offset of start of hyperslab
+        const hsize_t *stride;       IN: Hyperslab stride
+        const hsize_t *count;        IN: Number of blocks included in hyperslab
+        const hsize_t *block;        IN: Size of block in hyperslab
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Combines a hyperslab selection with the current selection for a dataspace.
+    If the current selection is not a hyperslab, it is freed and the hyperslab
+    parameters passed in are combined with the H5S_SEL_ALL hyperslab (ie. a
+    selection composing the entire current extent).  If STRIDE or BLOCK is
+    NULL, they are assumed to be set to all '1'.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_t start[],
+         const hsize_t stride[], const hsize_t count[], const hsize_t block[])
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iSs*h*h*h*h", space_id, op, start, stride, count, block);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(H5S_SCALAR == H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_SCALAR space")
+    if(H5S_NULL == H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_NULL space")
+    if(start == NULL || count == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab not specified")
+    if(!(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+    if(stride!=NULL) {
+        /* Check for 0-sized strides */
+        for(u=0; u<space->extent.rank; u++) {
+            if(stride[u]==0)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride==0 value")
+        } /* end for */
+    } /* end if */
+
+    if (H5S_select_hyperslab(space, op, start, stride, count, block)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set hyperslab selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sselect_hyperslab() */
+#else /* NEW_HYPERSLAB_API */ /* Works */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_operate_hyperslab
+ *
+ * Purpose:	Combines two hyperslabs with an operation, putting the
+ *              result into a third hyperslab selection
+ *
+ * Return:	non-negative on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, October 30, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_operate_hyperslab (H5S_t *result, H5S_hyper_span_info_t *spans1, H5S_seloper_t op, H5S_hyper_span_info_t *spans2,
+    hbool_t can_own_span2, hbool_t *span2_owned)
+{
+    H5S_hyper_span_info_t *a_not_b=NULL;    /* Span tree for hyperslab spans in old span tree and not in new span tree */
+    H5S_hyper_span_info_t *a_and_b=NULL;    /* Span tree for hyperslab spans in both old and new span trees */
+    H5S_hyper_span_info_t *b_not_a=NULL;    /* Span tree for hyperslab spans in new span tree and not in old span tree */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(result);
+    HDassert(spans2);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+
+    /* Just copy the selection from spans2 if we are setting the selection */
+    /* ('space1' to 'result' aliasing happens at the next layer up) */
+    if(op==H5S_SELECT_SET) {
+        if(H5S_hyper_merge_spans(result,spans2,can_own_span2)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+        /* Update the number of elements in current selection */
+        result->select.num_elem=H5S_hyper_spans_nelem(spans2);
+
+        /* Indicate that we took ownership of span2, if allowed */
+        if(can_own_span2)
+            *span2_owned=TRUE;
+    } /* end if */
+    else {
+        hbool_t updated_spans = FALSE;  /* Whether the spans in the selection were modified */
+
+        HDassert(spans1);
+
+        /* Generate lists of spans which overlap and don't overlap */
+        if(H5S_hyper_clip_spans(spans1,spans2,&a_not_b,&a_and_b,&b_not_a)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+        /* Switch on the operation */
+        switch(op) {
+            case H5S_SELECT_OR:
+                /* Copy spans from spans1 to current selection */
+                if(spans1!=NULL) {
+                    if(H5S_hyper_merge_spans(result,spans1,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem=H5S_hyper_spans_nelem(spans1);
+                } /* end if */
+
+                /* Add any new spans from spans2 to current selection */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(result,b_not_a,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem+=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_AND:
+                /* Check if there are any overlapped selections */
+                if(a_and_b!=NULL) {
+                    if(H5S_hyper_merge_spans(result,a_and_b,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem=H5S_hyper_spans_nelem(a_and_b);
+
+                    /* Indicate that the result owns the a_and_b spans */
+                    a_and_b=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_XOR:
+                /* Check if there are any non-overlapped selections */
+                if(a_not_b!=NULL) {
+                    if(H5S_hyper_merge_spans(result,a_not_b,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem=H5S_hyper_spans_nelem(a_not_b);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(result,b_not_a,FALSE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem+=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_NOTB:
+                /* Check if there are any non-overlapped selections */
+                if(a_not_b!=NULL) {
+                    if(H5S_hyper_merge_spans(result,a_not_b,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem=H5S_hyper_spans_nelem(a_not_b);
+
+                    /* Indicate that the result owns the a_not_b spans */
+                    a_not_b=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            case H5S_SELECT_NOTA:
+                /* Check if there are any non-overlapped selections */
+                if(b_not_a!=NULL) {
+                    if(H5S_hyper_merge_spans(result,b_not_a,TRUE)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert hyperslabs")
+
+                    /* Update the number of elements in current selection */
+                    result->select.num_elem=H5S_hyper_spans_nelem(b_not_a);
+
+                    /* Indicate that the result owns the b_not_a spans */
+                    b_not_a=NULL;
+
+                    /* Indicate that the spans were updated */
+                    updated_spans = TRUE;
+                } /* end if */
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+        } /* end switch */
+
+        /* Free the hyperslab trees generated from the clipping algorithm */
+        if(a_not_b)
+            H5S_hyper_free_span_info(a_not_b);
+        if(a_and_b)
+            H5S_hyper_free_span_info(a_and_b);
+        if(b_not_a)
+            H5S_hyper_free_span_info(b_not_a);
+
+        /* Check if the resulting hyperslab span tree is empty */
+        if(result->select.sel_info.hslab->span_lst==NULL) {
+            H5S_hyper_span_info_t *spans;     /* Empty hyperslab span tree */
+
+            /* Sanity check */
+            HDassert(result->select.num_elem == 0);
+
+            /* Allocate a span info node */
+            if((spans = H5FL_MALLOC(H5S_hyper_span_info_t))==NULL)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+
+            /* Set the reference count */
+            spans->count=1;
+
+            /* Reset the scratch pad space */
+            spans->scratch=0;
+
+            /* Set to empty tree */
+            spans->head=NULL;
+
+            /* Set pointer to empty span tree */
+            result->select.sel_info.hslab->span_lst=spans;
+        } /* end if */
+        else {
+            /* Check if we updated the spans */
+            if(updated_spans) {
+                /* Attempt to rebuild "optimized" start/stride/count/block information.
+                 * from resulting hyperslab span tree
+                 */
+                if(H5S_hyper_rebuild(result) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't rebuild hyperslab info")
+            } /* end if */
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_operate_hyperslab() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_generate_hyperlab
+ *
+ * Purpose:	Generate hyperslab information from H5S_select_hyperslab()
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol (split from HS_select_hyperslab()).
+ *              Tuesday, September 12, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_generate_hyperslab (H5S_t *space, H5S_seloper_t op,
+		      const hsize_t start[],
+		      const hsize_t stride[],
+		      const hsize_t count[],
+		      const hsize_t block[])
+{
+    H5S_hyper_span_info_t *new_spans=NULL;   /* Span tree for new hyperslab */
+    H5S_hyper_span_info_t *tmp_spans=NULL;   /* Temporary copy of selection */
+    hbool_t span2_owned=FALSE;          /* Flag to indicate that span2 was used in H5S_operate_hyperslab() */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+    HDassert(start);
+    HDassert(stride);
+    HDassert(count);
+    HDassert(block);
+
+    /* Generate span tree for new hyperslab information */
+    if((new_spans=H5S_hyper_make_spans(space->extent.rank,start,stride,count,block))==NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't create hyperslab information")
+
+    /* Copy the original dataspace */
+    if(space->select.sel_info.hslab->span_lst!=NULL) {
+        /* Take ownership of the dataspace's hyperslab spans */
+        /* (These are freed later) */
+        tmp_spans=space->select.sel_info.hslab->span_lst;
+        space->select.sel_info.hslab->span_lst=NULL;
+
+        /* Reset the other dataspace selection information */
+        if(H5S_SELECT_RELEASE(space)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+        /* Allocate space for the hyperslab selection information */
+        if((space->select.sel_info.hslab=H5FL_MALLOC(H5S_hyper_sel_t))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+    } /* end if */
+
+    /* Combine tmp_space (really space) & new_space, with the result in space */
+    if(H5S_operate_hyperslab(space,tmp_spans,op,new_spans,TRUE,&span2_owned)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+done:
+    /* Free temporary data structures */
+    if(tmp_spans!=NULL)
+        if(H5S_hyper_free_span_info(tmp_spans)<0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+    if(new_spans!=NULL && span2_owned==FALSE)
+        if(H5S_hyper_free_span_info(new_spans)<0)
+            HDONE_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release temporary hyperslab spans")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_generate_hyperslab() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_hyperslab
+ *
+ * Purpose:	Internal version of H5Sselect_hyperslab().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, January 10, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
+		      const hsize_t start[],
+		      const hsize_t *stride,
+		      const hsize_t count[],
+		      const hsize_t *block)
+{
+    hsize_t int_stride[H5O_LAYOUT_NDIMS];   /* Internal storage for stride information */
+    hsize_t int_count[H5O_LAYOUT_NDIMS];    /* Internal storage for count information */
+    hsize_t int_block[H5O_LAYOUT_NDIMS];    /* Internal storage for block information */
+    const hsize_t *opt_stride;      /* Optimized stride information */
+    const hsize_t *opt_count;       /* Optimized count information */
+    const hsize_t *opt_block;       /* Optimized block information */
+    unsigned u;                    /* Counters */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+    HDassert(start);
+    HDassert(count);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+
+    /* Point to the correct stride values */
+    if(stride==NULL)
+        stride = _ones;
+
+    /* Point to the correct block values */
+    if(block==NULL)
+        block = _ones;
+
+    /*
+     * Check new selection.
+     */
+    for(u=0; u<space->extent.rank; u++) {
+        /* Check for overlapping hyperslab blocks in new selection. */
+        if(count[u]>1 && stride[u]<block[u])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab blocks overlap")
+
+        /* Detect zero-sized hyperslabs in new selection */
+        if(count[u] == 0 || block[u] == 0) {
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    /* Convert to "none" selection */
+                    if(H5S_select_none(space)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    HGOTO_DONE(SUCCEED);
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays same */
+
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+        } /* end if */
+    } /* end for */
+
+    /* Optimize hyperslab parameters to merge contiguous blocks, etc. */
+    if(stride == _ones && block == _ones) {
+        /* Point to existing arrays */
+        opt_stride = _ones;
+        opt_count = _ones;
+        opt_block = count;
+    } /* end if */
+    else {
+        /* Point to local arrays */
+        opt_stride = int_stride;
+        opt_count = int_count;
+        opt_block = int_block;
+        for(u=0; u<space->extent.rank; u++) {
+            /* contiguous hyperslabs have the block size equal to the stride */
+            if(stride[u]==block[u]) {
+                int_count[u]=1;
+                int_stride[u]=1;
+                if(block[u]==1)
+                    int_block[u]=count[u];
+                else
+                    int_block[u]=block[u]*count[u];
+            } /* end if */
+            else {
+                if(count[u]==1)
+                    int_stride[u]=1;
+                else {
+                    HDassert(stride[u] > block[u]);
+                    int_stride[u]=stride[u];
+                } /* end else */
+                int_count[u]=count[u];
+                int_block[u]=block[u];
+            } /* end else */
+        } /* end for */
+    } /* end else */
+
+    /* Fixup operation for non-hyperslab selections */
+    switch(H5S_GET_SELECT_TYPE(space)) {
+        case H5S_SEL_NONE:   /* No elements selected in dataspace */
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                    /* Change "none" selection to hyperslab selection */
+                    break;
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    op=H5S_SELECT_SET; /* Maps to "set" operation when applied to "none" selection */
+                    break;
+
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays "none" */
+
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+            break;
+
+        case H5S_SEL_ALL:    /* All elements selected in dataspace */
+            switch(op) {
+                case H5S_SELECT_SET:   /* Select "set" operation */
+                    /* Change "all" selection to hyperslab selection */
+                    break;
+
+                case H5S_SELECT_OR:    /* Binary "or" operation for hyperslabs */
+                    HGOTO_DONE(SUCCEED);        /* Selection stays "all" */
+
+                case H5S_SELECT_AND:   /* Binary "and" operation for hyperslabs */
+                    op=H5S_SELECT_SET; /* Maps to "set" operation when applied to "none" selection */
+                    break;
+
+                case H5S_SELECT_XOR:   /* Binary "xor" operation for hyperslabs */
+                case H5S_SELECT_NOTB:  /* Binary "A not B" operation for hyperslabs */
+                    /* Convert current "all" selection to "real" hyperslab selection */
+                    /* Then allow operation to proceed */
+                    {
+                        hsize_t tmp_start[H5O_LAYOUT_NDIMS];   /* Temporary start information */
+                        hsize_t tmp_stride[H5O_LAYOUT_NDIMS];   /* Temporary stride information */
+                        hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary count information */
+                        hsize_t tmp_block[H5O_LAYOUT_NDIMS];    /* Temporary block information */
+
+                        /* Fill in temporary information for the dimensions */
+                        for(u=0; u<space->extent.rank; u++) {
+                            tmp_start[u]=0;
+                            tmp_stride[u]=1;
+                            tmp_count[u]=1;
+                            tmp_block[u]=space->extent.size[u];
+                        } /* end for */
+
+                        /* Convert to hyperslab selection */
+                        if(H5S_select_hyperslab(space,H5S_SELECT_SET,tmp_start,tmp_stride,tmp_count,tmp_block)<0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    } /* end case */
+                    break;
+
+                case H5S_SELECT_NOTA:  /* Binary "B not A" operation for hyperslabs */
+                    /* Convert to "none" selection */
+                    if(H5S_select_none(space)<0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+                    HGOTO_DONE(SUCCEED);
+
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+            } /* end switch */
+            break;
+
+        case H5S_SEL_HYPERSLABS:
+            /* Hyperslab operation on hyperslab selection, OK */
+            break;
+
+        case H5S_SEL_POINTS: /* Can't combine hyperslab operations and point selections currently */
+            if(op==H5S_SELECT_SET)      /* Allow only "set" operation to proceed */
+                break;
+            /* Else fall through to error */
+
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+    } /* end switch */
+
+
+    if(op==H5S_SELECT_SET) {
+        /* If we are setting a new selection, remove current selection first */
+        if(H5S_SELECT_RELEASE(space)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release hyperslab")
+
+        /* Allocate space for the hyperslab selection information */
+        if((space->select.sel_info.hslab=H5FL_MALLOC(H5S_hyper_sel_t))==NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab info")
+
+        /* Save the diminfo */
+        space->select.num_elem=1;
+        for(u=0; u<space->extent.rank; u++) {
+            space->select.sel_info.hslab->app_diminfo[u].start = start[u];
+            space->select.sel_info.hslab->app_diminfo[u].stride = stride[u];
+            space->select.sel_info.hslab->app_diminfo[u].count = count[u];
+            space->select.sel_info.hslab->app_diminfo[u].block = block[u];
+
+            space->select.sel_info.hslab->opt_diminfo[u].start = start[u];
+            space->select.sel_info.hslab->opt_diminfo[u].stride = opt_stride[u];
+            space->select.sel_info.hslab->opt_diminfo[u].count = opt_count[u];
+            space->select.sel_info.hslab->opt_diminfo[u].block = opt_block[u];
+
+            space->select.num_elem*=(opt_count[u]*opt_block[u]);
+        } /* end for */
+
+        /* Indicate that the dimension information is valid */
+        space->select.sel_info.hslab->diminfo_valid=TRUE;
+
+        /* Indicate that there's no slab information */
+        space->select.sel_info.hslab->span_lst=NULL;
+    } /* end if */
+    else if(op>=H5S_SELECT_OR && op<=H5S_SELECT_NOTA) {
+        /* Sanity check */
+        HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
+
+        /* Check if there's no hyperslab span information currently */
+        if(space->select.sel_info.hslab->span_lst==NULL)
+            if(H5S_hyper_generate_spans(space)<0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+        /* Add in the new hyperslab information */
+        if(H5S_generate_hyperslab (space, op, start, opt_stride, opt_count, opt_block)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't generate hyperslabs")
+
+        /* Indicate that the regular dimensions are no longer valid */
+        space->select.sel_info.hslab->diminfo_valid=FALSE;
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+
+    /* Set selection type */
+    space->select.type=H5S_sel_hyper;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_hyperslab() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_hyperslab
+ PURPOSE
+    Specify a hyperslab to combine with the current hyperslab selection
+ USAGE
+    herr_t H5Sselect_hyperslab(dsid, op, start, stride, count, block)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+        H5S_seloper_t op;       IN: Operation to perform on current selection
+        const hsize_t *start;        IN: Offset of start of hyperslab
+        const hsize_t *stride;       IN: Hyperslab stride
+        const hsize_t *count;        IN: Number of blocks included in hyperslab
+        const hsize_t *block;        IN: Size of block in hyperslab
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Combines a hyperslab selection with the current selection for a dataspace.
+    If the current selection is not a hyperslab, it is freed and the hyperslab
+    parameters passed in are combined with the H5S_SEL_ALL hyperslab (ie. a
+    selection composing the entire current extent).  If STRIDE or BLOCK is
+    NULL, they are assumed to be set to all '1'.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_t start[],
+         const hsize_t stride[], const hsize_t count[], const hsize_t block[])
+{
+    H5S_t	*space = NULL;  /* Dataspace to modify selection of */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iSs*h*h*h*h", space_id, op, start, stride, count, block);
+
+    /* Check args */
+    if (NULL == (space=H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if (H5S_SCALAR==H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_SCALAR space")
+    if (H5S_NULL==H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_NULL space")
+    if(start==NULL || count==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab not specified")
+    if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+    if(stride!=NULL) {
+        unsigned u;             /* Local index variable */
+
+        /* Check for 0-sized strides */
+        for(u=0; u<space->extent.rank; u++) {
+            if(stride[u]==0)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride==0 value")
+        } /* end for */
+    } /* end if */
+
+    if (H5S_select_hyperslab(space, op, start, stride, count, block)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set hyperslab selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sselect_hyperslab() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Scombine_hyperslab
+ PURPOSE
+    Specify a hyperslab to combine with the current hyperslab selection and
+    return a new dataspace with the combined selection as the selection in the
+    new dataspace.
+ USAGE
+    hid_t H5Srefine_hyperslab(dsid, op, start, stride, count, block)
+        hid_t dsid;             IN: Dataspace ID of selection to use
+        H5S_seloper_t op;       IN: Operation to perform on current selection
+        const hsize_t *start;        IN: Offset of start of hyperslab
+        const hsize_t *stride;       IN: Hyperslab stride
+        const hsize_t *count;        IN: Number of blocks included in hyperslab
+        const hsize_t *block;        IN: Size of block in hyperslab
+ RETURNS
+    Dataspace ID on success/Negative on failure
+ DESCRIPTION
+    Combines a hyperslab selection with the current selection for a dataspace,
+    creating a new dataspace to return the generated selection.
+    If the current selection is not a hyperslab, it is freed and the hyperslab
+    parameters passed in are combined with the H5S_SEL_ALL hyperslab (ie. a
+    selection composing the entire current extent).  If STRIDE or BLOCK is
+    NULL, they are assumed to be set to all '1'.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_t start[],
+         const hsize_t stride[], const hsize_t count[], const hsize_t block[])
+{
+    H5S_t	*space = NULL;  /* Dataspace to modify selection of */
+    H5S_t	*new_space = NULL;  /* New dataspace created */
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("i", "iSs*h*h*h*h", space_id, op, start, stride, count, block);
+
+    /* Check args */
+    if (NULL == (space=H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(start==NULL || count==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab not specified")
+
+    if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+
+    /* Copy the first dataspace */
+    if (NULL == (new_space = H5S_copy (space, TRUE, TRUE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "unable to copy data space")
+
+    /* Go modify the selection in the new dataspace */
+    if (H5S_select_hyperslab(new_space, op, start, stride, count, block)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set hyperslab selection")
+
+    /* Atomize */
+    if ((ret_value=H5I_register (H5I_DATASPACE, new_space, TRUE))<0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    if (ret_value<0 && new_space)
+        H5S_close(new_space);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Scombine_hyperslab() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_combine_select
+ *
+ * Purpose:	Internal version of H5Scombine_select().
+ *
+ * Return:	New dataspace on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, October 30, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5S_t *
+H5S_combine_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2)
+{
+    H5S_t *new_space=NULL;    /* New dataspace generated */
+    hbool_t span2_owned=FALSE;          /* Flag to indicate that span2 was used in H5S_operate_hyperslab() */
+    H5S_t *ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space1);
+    HDassert(space2);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+
+    /* Check that the space selections both have span trees */
+    if(space1->select.sel_info.hslab->span_lst==NULL)
+        if(H5S_hyper_generate_spans(space1)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, NULL, "dataspace does not have span tree")
+    if(space2->select.sel_info.hslab->span_lst==NULL)
+        if(H5S_hyper_generate_spans(space2)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, NULL, "dataspace does not have span tree")
+
+    /* Copy the first dataspace */
+    if (NULL == (new_space = H5S_copy (space1, TRUE, TRUE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "unable to copy data space")
+
+    /* Free the current selection for the new dataspace */
+    if(H5S_SELECT_RELEASE(new_space)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, NULL, "can't release selection")
+
+    /* Allocate space for the hyperslab selection information */
+    if((new_space->select.sel_info.hslab=H5FL_CALLOC(H5S_hyper_sel_t))==NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab info")
+
+    /* Combine space1 & space2, with the result in new_space */
+    if(H5S_operate_hyperslab(new_space,space1->select.sel_info.hslab->span_lst,op,space2->select.sel_info.hslab->span_lst,FALSE,&span2_owned)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, NULL, "can't clip hyperslab information")
+
+    /* Set return value */
+    ret_value=new_space;
+
+done:
+    if(ret_value==NULL && new_space!=NULL)
+        H5S_close(new_space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_combine_select() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Scombine_select
+ PURPOSE
+    Combine two hyperslab selections with an operation, returning a dataspace
+    with the resulting selection.
+ USAGE
+    hid_t H5Scombine_select(space1, op, space2)
+        hid_t space1;           IN: First Dataspace ID
+        H5S_seloper_t op;       IN: Selection operation
+        hid_t space2;           IN: Second Dataspace ID
+ RETURNS
+    Dataspace ID on success/Negative on failure
+ DESCRIPTION
+    Combine two existing hyperslab selections with an operation, returning
+    a new dataspace with the resulting selection.  The dataspace extent from
+    space1 is copied for the dataspace extent of the newly created dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Scombine_select(hid_t space1_id, H5S_seloper_t op, hid_t space2_id)
+{
+    H5S_t	*space1;                /* First Dataspace */
+    H5S_t	*space2;                /* Second Dataspace */
+    H5S_t	*new_space = NULL;      /* New Dataspace */
+    hid_t	ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iSsi", space1_id, op, space2_id);
+
+    /* Check args */
+    if (NULL == (space1=H5I_object_verify(space1_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if (NULL == (space2=H5I_object_verify(space2_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+
+    /* Check that both dataspaces have the same rank */
+    if(space1->extent.rank!=space2->extent.rank)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspaces not same rank")
+
+    /* Check that both dataspaces have hyperslab selections */
+    if(H5S_GET_SELECT_TYPE(space1)!=H5S_SEL_HYPERSLABS || H5S_GET_SELECT_TYPE(space2)!=H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspaces don't have hyperslab selections")
+
+    /* Go combine the dataspaces */
+    if ((new_space=H5S_combine_select(space1, op, space2))==NULL)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to create hyperslab selection")
+
+    /* Atomize */
+    if ((ret_value=H5I_register (H5I_DATASPACE, new_space, TRUE))<0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
+
+done:
+    if (ret_value<0 && new_space)
+        H5S_close(new_space);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Scombine_select() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_select
+ *
+ * Purpose:	Internal version of H5Sselect_select().
+ *
+ * Return:	New dataspace on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, October 30, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_select_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2)
+{
+    H5S_hyper_span_info_t *tmp_spans=NULL;   /* Temporary copy of selection */
+    hbool_t span2_owned=FALSE;          /* Flag to indicate that span2 was used in H5S_operate_hyperslab() */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space1);
+    HDassert(space2);
+    HDassert(op > H5S_SELECT_NOOP && op < H5S_SELECT_INVALID);
+
+    /* Check that the space selections both have span trees */
+    if(space1->select.sel_info.hslab->span_lst==NULL)
+        if(H5S_hyper_generate_spans(space1)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+    if(space2->select.sel_info.hslab->span_lst==NULL)
+        if(H5S_hyper_generate_spans(space2)<0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+    /* Take ownership of the dataspace's hyperslab spans */
+    /* (These are freed later) */
+    tmp_spans=space1->select.sel_info.hslab->span_lst;
+    space1->select.sel_info.hslab->span_lst=NULL;
+
+    /* Reset the other dataspace selection information */
+    if(H5S_SELECT_RELEASE(space1)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* Allocate space for the hyperslab selection information */
+    if((space1->select.sel_info.hslab=H5FL_CALLOC(H5S_hyper_sel_t))==NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+    /* Combine tmp_spans (from space1) & spans from space2, with the result in space1 */
+    if(H5S_operate_hyperslab(space1,tmp_spans,op,space2->select.sel_info.hslab->span_lst,FALSE,&span2_owned)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+done:
+    if(tmp_spans!=NULL)
+        H5S_hyper_free_span_info(tmp_spans);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_select() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_select
+ PURPOSE
+    Refine a hyperslab selection with an operation using a second hyperslab
+    to modify it.
+ USAGE
+    herr_t H5Sselect_select(space1, op, space2)
+        hid_t space1;           IN/OUT: First Dataspace ID
+        H5S_seloper_t op;       IN: Selection operation
+        hid_t space2;           IN: Second Dataspace ID
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Refine an existing hyperslab selection with an operation, using a second
+    hyperslab.  The first selection is modified to contain the result of
+    space1 operated on by space2.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_select(hid_t space1_id, H5S_seloper_t op, hid_t space2_id)
+{
+    H5S_t	*space1;                /* First Dataspace */
+    H5S_t	*space2;                /* Second Dataspace */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iSsi", space1_id, op, space2_id);
+
+    /* Check args */
+    if (NULL == (space1=H5I_object_verify(space1_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if (NULL == (space2=H5I_object_verify(space2_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
+
+    /* Check that both dataspaces have the same rank */
+    if(space1->extent.rank!=space2->extent.rank)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspaces not same rank")
+
+    /* Check that both dataspaces have hyperslab selections */
+    if(H5S_GET_SELECT_TYPE(space1)!=H5S_SEL_HYPERSLABS || H5S_GET_SELECT_TYPE(space2)!=H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspaces don't have hyperslab selections")
+
+    /* Go refine the first selection */
+    if (H5S_select_select(space1, op, space2)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to modify hyperslab selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sselect_select() */
+#endif /* NEW_HYPERSLAB_API */ /* Works */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_seq_list_gen
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_select_hyper_get_file_list_gen(space,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_get_seq_list_gen(const H5S_t *space,H5S_sel_iter_t *iter,
+    size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    H5S_hyper_span_t *curr_span;    /* Current hyperslab span node */
+    H5S_hyper_span_t **ispan;       /* Iterator's hyperslab span nodes */
+    hsize_t slab[H5O_LAYOUT_NDIMS]; /* Cumulative size of each dimension in bytes */
+    hsize_t acc;       /* Accumulator for computing cumulative sizes */
+    hsize_t loc_off;   /* Element offset in the dataspace */
+    hsize_t last_span_end = 0; /* The offset of the end of the last span */
+    hsize_t *abs_arr;  /* Absolute hyperslab span position */
+    const hssize_t *off_arr;  /* Offset within the dataspace extent */
+    size_t span_size = 0; /* Number of bytes in current span to actually process */
+    size_t io_left;    /* Number of elements left to process */
+    size_t io_bytes_left;   /* Number of bytes left to process */
+    size_t io_used;    /* Number of elements processed */
+    size_t curr_seq = 0; /* Number of sequence/offsets stored in the arrays */
+    size_t elem_size;  /* Size of each element iterating over */
+    unsigned ndims;    /* Number of dimensions of dataset */
+    unsigned fast_dim; /* Rank of the fastest changing dimension for the dataspace */
+    int curr_dim;      /* Current dimension being operated on */
+    unsigned u;        /* Index variable */
+    int i;             /* Index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Set the rank of the fastest changing dimension */
+    ndims = space->extent.rank;
+    fast_dim = (ndims - 1);
+
+    /* Get the pointers to the current span info and span nodes */
+    curr_span = iter->u.hyp.span[fast_dim];
+    abs_arr = iter->u.hyp.off;
+    off_arr = space->select.offset;
+    ispan = iter->u.hyp.span;
+    elem_size = iter->elmt_size;
+
+    /* Set the amount of elements to perform I/O on, etc. */
+    H5_CHECK_OVERFLOW(iter->elmt_left, hsize_t, size_t);
+    io_left = MIN(maxelem, (size_t)iter->elmt_left);
+    io_bytes_left = io_left * elem_size;
+
+    /* Compute the cumulative size of dataspace dimensions */
+    for(i = (int)fast_dim, acc = elem_size; i >= 0; i--) {
+        slab[i] = acc;
+        acc *= space->extent.size[i];
+    } /* end for */
+
+    /* Set the offset of the first element iterated on */
+    for(u = 0, loc_off = 0; u < ndims; u++)
+        /* Compute the sequential element offset */
+        loc_off += ((hsize_t)((hssize_t)abs_arr[u] + off_arr[u])) * slab[u];
+
+    /* Range check against number of elements left in selection */
+    HDassert(io_bytes_left <= (iter->elmt_left * elem_size));
+
+    /* Take care of any partial spans leftover from previous I/Os */
+    if(abs_arr[fast_dim]!=curr_span->low) {
+
+        /* Finish the span in the fastest changing dimension */
+
+        /* Compute the number of bytes to attempt in this span */
+        H5_CHECKED_ASSIGN(span_size, size_t, ((curr_span->high-abs_arr[fast_dim])+1)*elem_size, hsize_t);
+
+        /* Check number of bytes against upper bounds allowed */
+        if(span_size>io_bytes_left)
+            span_size=io_bytes_left;
+
+        /* Add the partial span to the list of sequences */
+        off[curr_seq]=loc_off;
+        len[curr_seq]=span_size;
+
+        /* Increment sequence count */
+        curr_seq++;
+
+        /* Set the location of the last span's end */
+        last_span_end=loc_off+span_size;
+
+        /* Decrement I/O left to perform */
+        io_bytes_left-=span_size;
+
+        /* Advance the hyperslab iterator */
+        /* Check if we are done */
+        if(io_bytes_left > 0) {
+            /* Move to next span in fastest changing dimension */
+            curr_span = curr_span->next;
+
+            if(NULL != curr_span) {
+                /* Move location offset of destination */
+                loc_off += (curr_span->low - abs_arr[fast_dim]) * elem_size;
+
+                /* Move iterator for fastest changing dimension */
+                abs_arr[fast_dim] = curr_span->low;
+            } /* end if */
+        } /* end if */
+        else {
+            abs_arr[fast_dim] += span_size / elem_size;
+
+            /* Check if we are still within the span */
+            if(abs_arr[fast_dim] <= curr_span->high) {
+                iter->u.hyp.span[fast_dim] = curr_span;
+            } /* end if */
+            /* If we walked off that span, advance to the next span */
+            else {
+                /* Advance span in this dimension */
+                curr_span = curr_span->next;
+
+                /* Check if we have a valid span in this dimension still */
+                if(NULL != curr_span) {
+                    /* Reset absolute position */
+                    abs_arr[fast_dim] = curr_span->low;
+                    iter->u.hyp.span[fast_dim] = curr_span;
+                } /* end if */
+            } /* end else */
+        } /* end else */
+
+        /* Adjust iterator pointers */
+
+        if(NULL == curr_span) {
+/* Same as code in main loop */
+            /* Start at the next fastest dim */
+            curr_dim = (int)(fast_dim - 1);
+
+            /* Work back up through the dimensions */
+            while(curr_dim >= 0) {
+                /* Reset the current span */
+                curr_span = iter->u.hyp.span[curr_dim];
+
+                /* Increment absolute position */
+                abs_arr[curr_dim]++;
+
+                /* Check if we are still within the span */
+                if(abs_arr[curr_dim] <= curr_span->high) {
+                    break;
+                } /* end if */
+                /* If we walked off that span, advance to the next span */
+                else {
+                    /* Advance span in this dimension */
+                    curr_span = curr_span->next;
+
+                    /* Check if we have a valid span in this dimension still */
+                    if(NULL != curr_span) {
+                        /* Reset the span in the current dimension */
+                        ispan[curr_dim] = curr_span;
+
+                        /* Reset absolute position */
+                        abs_arr[curr_dim] = curr_span->low;
+
+                        break;
+                    } /* end if */
+                    else {
+                        /* If we finished the span list in this dimension, decrement the dimension worked on and loop again */
+                        curr_dim--;
+                    } /* end else */
+                } /* end else */
+            } /* end while */
+
+            /* Check if we have more spans in the tree */
+            if(curr_dim >= 0) {
+                /* Walk back down the iterator positions, reseting them */
+                while((unsigned)curr_dim < fast_dim) {
+                    HDassert(curr_span);
+                    HDassert(curr_span->down);
+                    HDassert(curr_span->down->head);
+
+                    /* Increment current dimension */
+                    curr_dim++;
+
+                    /* Set the new span_info & span for this dimension */
+                    iter->u.hyp.span[curr_dim] = curr_span->down->head;
+
+                    /* Advance span down the tree */
+                    curr_span = curr_span->down->head;
+
+                    /* Reset the absolute offset for the dim */
+                    abs_arr[curr_dim] = curr_span->low;
+                } /* end while */
+
+                /* Verify that the curr_span points to the fastest dim */
+                HDassert(curr_span == iter->u.hyp.span[fast_dim]);
+
+                /* Reset the buffer offset */
+                for(u = 0, loc_off = 0; u < ndims; u++)
+                    loc_off += ((hsize_t)((hssize_t)abs_arr[u] + off_arr[u])) * slab[u];
+            } /* end else */
+            else
+                /* We had better be done with I/O or bad things are going to happen... */
+                HDassert(io_bytes_left == 0);
+        } /* end if */
+    } /* end if */
+
+    /* Perform the I/O on the elements, based on the position of the iterator */
+    while(io_bytes_left > 0 && curr_seq < maxseq) {
+        /* Sanity check */
+        HDassert(curr_span);
+
+        /* Adjust location offset of destination to compensate for initial increment below */
+        loc_off -= curr_span->pstride;
+
+        /* Loop over all the spans in the fastest changing dimension */
+        while(curr_span != NULL) {
+            /* Move location offset of destination */
+            loc_off += curr_span->pstride;
+
+            /* Compute the number of elements to attempt in this span */
+            H5_CHECKED_ASSIGN(span_size, size_t, curr_span->nelem, hsize_t);
+
+            /* Check number of elements against upper bounds allowed */
+            if(span_size >= io_bytes_left) {
+                /* Trim the number of bytes to output */
+                span_size = io_bytes_left;
+                io_bytes_left = 0;
+
+/* COMMON */
+                /* Store the I/O information for the span */
+
+                /* Check if this is appending onto previous sequence */
+                if(curr_seq > 0 && last_span_end == loc_off)
+                    len[curr_seq - 1] += span_size;
+                else {
+                    off[curr_seq] = loc_off;
+                    len[curr_seq] = span_size;
+
+                    /* Increment the number of sequences in arrays */
+                    curr_seq++;
+                } /* end else */
+
+                /* Set the location of the last span's end */
+                last_span_end = loc_off + span_size;
+/* end COMMON */
+
+                /* Break out now, we are finished with I/O */
+                break;
+            } /* end if */
+            else {
+                /* Decrement I/O left to perform */
+                io_bytes_left -= span_size;
+
+/* COMMON */
+                /* Store the I/O information for the span */
+
+                /* Check if this is appending onto previous sequence */
+                if(curr_seq > 0 && last_span_end == loc_off)
+                    len[curr_seq-1]+=span_size;
+                else {
+                    off[curr_seq] = loc_off;
+                    len[curr_seq] = span_size;
+
+                    /* Increment the number of sequences in arrays */
+                    curr_seq++;
+                } /* end else */
+
+                /* Set the location of the last span's end */
+                last_span_end = loc_off + span_size;
+/* end COMMON */
+
+                /* If the sequence & offset arrays are full, do what? */
+                if(curr_seq >= maxseq) {
+                    /* Break out now, we are finished with sequences */
+                    break;
+                } /* end else */
+            } /* end else */
+
+	    /* Move to next span in fastest changing dimension */
+	    curr_span=curr_span->next;
+        } /* end while */
+
+        /* Check if we are done */
+        if(io_bytes_left==0 || curr_seq>=maxseq) {
+            HDassert(curr_span);
+            abs_arr[fast_dim]=curr_span->low+(span_size/elem_size);
+
+            /* Check if we are still within the span */
+            if(abs_arr[fast_dim]<=curr_span->high) {
+                iter->u.hyp.span[fast_dim]=curr_span;
+                break;
+            } /* end if */
+            /* If we walked off that span, advance to the next span */
+            else {
+                /* Advance span in this dimension */
+                curr_span=curr_span->next;
+
+                /* Check if we have a valid span in this dimension still */
+                if(curr_span!=NULL) {
+                    /* Reset absolute position */
+                    abs_arr[fast_dim]=curr_span->low;
+                    iter->u.hyp.span[fast_dim]=curr_span;
+                    break;
+                } /* end if */
+            } /* end else */
+        } /* end if */
+
+        /* Adjust iterator pointers */
+
+        /* Start at the next fastest dim */
+        curr_dim = (int)(fast_dim - 1);
+
+        /* Work back up through the dimensions */
+        while(curr_dim >= 0) {
+            /* Reset the current span */
+	    curr_span=iter->u.hyp.span[curr_dim];
+
+            /* Increment absolute position */
+            abs_arr[curr_dim]++;
+
+            /* Check if we are still within the span */
+            if(abs_arr[curr_dim]<=curr_span->high) {
+                break;
+            } /* end if */
+            /* If we walked off that span, advance to the next span */
+            else {
+                /* Advance span in this dimension */
+                curr_span=curr_span->next;
+
+                /* Check if we have a valid span in this dimension still */
+                if(curr_span!=NULL) {
+                    /* Reset the span in the current dimension */
+                    ispan[curr_dim]=curr_span;
+
+                    /* Reset absolute position */
+                    abs_arr[curr_dim]=curr_span->low;
+
+                    break;
+                } /* end if */
+                else {
+                    /* If we finished the span list in this dimension, decrement the dimension worked on and loop again */
+                    curr_dim--;
+                } /* end else */
+            } /* end else */
+        } /* end while */
+
+        /* Check if we are finished with the spans in the tree */
+        if(curr_dim < 0) {
+            /* We had better be done with I/O or bad things are going to happen... */
+            HDassert(io_bytes_left == 0);
+            break;
+        } /* end if */
+        else {
+            /* Walk back down the iterator positions, reseting them */
+            while((unsigned)curr_dim < fast_dim) {
+                HDassert(curr_span);
+                HDassert(curr_span->down);
+                HDassert(curr_span->down->head);
+
+                /* Increment current dimension to the next dimension down */
+                curr_dim++;
+
+                /* Set the new span for the next dimension down */
+                iter->u.hyp.span[curr_dim] = curr_span->down->head;
+
+                /* Advance span down the tree */
+                curr_span = curr_span->down->head;
+
+                /* Reset the absolute offset for the dim */
+                abs_arr[curr_dim] = curr_span->low;
+            } /* end while */
+
+            /* Verify that the curr_span points to the fastest dim */
+            HDassert(curr_span == iter->u.hyp.span[fast_dim]);
+        } /* end else */
+
+        /* Reset the buffer offset */
+        for(u = 0, loc_off = 0; u < ndims; u++)
+            loc_off += ((hsize_t)((hssize_t)abs_arr[u] + off_arr[u])) * slab[u];
+    } /* end while */
+
+    /* Decrement number of elements left in iterator */
+    io_used = (io_left - (io_bytes_left / elem_size));
+    iter->elmt_left -= io_used;
+
+    /* Set the number of sequences generated */
+    *nseq = curr_seq;
+
+    /* Set the number of elements used */
+    *nelem = io_used;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_hyper_get_seq_list_gen() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_seq_list_opt
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_select_hyper_get_file_list_opt(space,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_get_seq_list_opt(const H5S_t *space, H5S_sel_iter_t *iter,
+    size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    hsize_t *mem_size;                  /* Size of the source buffer */
+    hsize_t slab[H5O_LAYOUT_NDIMS];     /* Hyperslab size */
+    const hssize_t *sel_off;            /* Selection offset in dataspace */
+    hsize_t offset[H5O_LAYOUT_NDIMS];   /* Coordinate offset in dataspace */
+    hsize_t tmp_count[H5O_LAYOUT_NDIMS];/* Temporary block count */
+    hsize_t tmp_block[H5O_LAYOUT_NDIMS];/* Temporary block offset */
+    hsize_t wrap[H5O_LAYOUT_NDIMS];     /* Bytes to wrap around at the end of a row */
+    hsize_t skip[H5O_LAYOUT_NDIMS];     /* Bytes to skip between blocks */
+    const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+    hsize_t fast_dim_start,    /* Local copies of fastest changing dimension info */
+        fast_dim_stride,
+        fast_dim_block,
+        fast_dim_offset;
+    size_t fast_dim_buf_off;    /* Local copy of amount to move fastest dimension buffer offset */
+    size_t fast_dim_count;      /* Number of blocks left in fastest changing dimension */
+    size_t tot_blk_count;       /* Total number of blocks left to output */
+    size_t act_blk_count;       /* Actual number of blocks to output */
+    size_t total_rows;          /* Total number of entire rows to output */
+    size_t curr_rows;           /* Current number of entire rows to output */
+    unsigned fast_dim;  /* Rank of the fastest changing dimension for the dataspace */
+    unsigned ndims;     /* Number of dimensions of dataset */
+    int temp_dim;       /* Temporary rank holder */
+    hsize_t acc;	/* Accumulator */
+    hsize_t loc;        /* Coordinate offset */
+    size_t curr_seq = 0; /* Current sequence being operated on */
+    size_t actual_elem; /* The actual number of elements to count */
+    size_t actual_bytes;/* The actual number of bytes to copy */
+    size_t io_left;     /* The number of elements left in I/O operation */
+    size_t start_io_left; /* The initial number of elements left in I/O operation */
+    size_t elem_size;   /* Size of each element iterating over */
+    unsigned u;         /* Local index variable */
+    int i;              /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Set the local copy of the diminfo pointer */
+    tdiminfo = iter->u.hyp.diminfo;
+
+    /* Check if this is a "flattened" regular hyperslab selection */
+    if(iter->u.hyp.iter_rank != 0 && iter->u.hyp.iter_rank < space->extent.rank) {
+        /* Set the aliases for a few important dimension ranks */
+        ndims = iter->u.hyp.iter_rank;
+        fast_dim = ndims - 1;
+
+        /* Set the local copy of the selection offset */
+        sel_off = iter->u.hyp.sel_off;
+
+        /* Set up the pointer to the size of the memory space */
+        mem_size = iter->u.hyp.size;
+    } /* end if */
+    else {
+        /* Set the aliases for a few important dimension ranks */
+        ndims = space->extent.rank;
+        fast_dim = ndims - 1;
+
+        /* Set the local copy of the selection offset */
+        sel_off = space->select.offset;
+
+        /* Set up the pointer to the size of the memory space */
+        mem_size = space->extent.size;
+    } /* end else */
+
+    /* initialize row sizes for each dimension */
+    elem_size = iter->elmt_size;
+    for(i = (int)fast_dim, acc = elem_size; i >= 0; i--) {
+        slab[i] = acc;
+        acc *= mem_size[i];
+    } /* end for */
+
+    /* Calculate the number of elements to sequence through */
+    H5_CHECK_OVERFLOW(iter->elmt_left, hsize_t, size_t);
+    io_left = MIN((size_t)iter->elmt_left, maxelem);
+
+    /* Sanity check that there aren't any "remainder" sequences in process */
+    HDassert(!((iter->u.hyp.off[fast_dim] - tdiminfo[fast_dim].start) % tdiminfo[fast_dim].stride != 0 ||
+            ((iter->u.hyp.off[fast_dim] != tdiminfo[fast_dim].start) && tdiminfo[fast_dim].count == 1)));
+
+    /* We've cleared the "remainder" of the previous fastest dimension
+     * sequence before calling this routine, so we must be at the beginning of
+     * a sequence.  Use the fancy algorithm to compute the offsets and run
+     * through as many as possible, until the buffer fills up.
+     */
+
+    /* Keep the number of elements we started with */
+    start_io_left = io_left;
+
+    /* Compute the arrays to perform I/O on */
+
+    /* Copy the location of the point to get */
+    /* (Add in the selection offset) */
+    for(u = 0; u < ndims; u++)
+        offset[u] = (hsize_t)((hssize_t)iter->u.hyp.off[u] + sel_off[u]);
+
+    /* Compute the current "counts" for this location */
+    for(u = 0; u < ndims; u++) {
+        if(tdiminfo[u].count == 1) {
+            tmp_count[u] = 0;
+            tmp_block[u] = iter->u.hyp.off[u] - tdiminfo[u].start;
+        } /* end if */
+        else {
+            tmp_count[u] = (iter->u.hyp.off[u] - tdiminfo[u].start) / tdiminfo[u].stride;
+            tmp_block[u] = (iter->u.hyp.off[u] - tdiminfo[u].start) % tdiminfo[u].stride;
+        } /* end else */
+    } /* end for */
+
+    /* Compute the initial buffer offset */
+    for(u = 0, loc = 0; u < ndims; u++)
+        loc += offset[u] * slab[u];
+
+    /* Set the number of elements to write each time */
+    H5_CHECKED_ASSIGN(actual_elem, size_t, tdiminfo[fast_dim].block, hsize_t);
+
+    /* Set the number of actual bytes */
+    actual_bytes = actual_elem * elem_size;
+
+    /* Set local copies of information for the fastest changing dimension */
+    fast_dim_start = tdiminfo[fast_dim].start;
+    fast_dim_stride = tdiminfo[fast_dim].stride;
+    fast_dim_block = tdiminfo[fast_dim].block;
+    H5_CHECKED_ASSIGN(fast_dim_buf_off, size_t, slab[fast_dim] * fast_dim_stride, hsize_t);
+    fast_dim_offset = (hsize_t)((hssize_t)fast_dim_start + sel_off[fast_dim]);
+
+    /* Compute the number of blocks which would fit into the buffer */
+    H5_CHECK_OVERFLOW(io_left / fast_dim_block, hsize_t, size_t);
+    tot_blk_count = (size_t)(io_left / fast_dim_block);
+
+    /* Don't go over the maximum number of sequences allowed */
+    tot_blk_count = MIN(tot_blk_count, (maxseq - curr_seq));
+
+    /* Compute the amount to wrap at the end of each row */
+    for(u = 0; u < ndims; u++)
+        wrap[u] = (mem_size[u] - (tdiminfo[u].stride * tdiminfo[u].count)) * slab[u];
+
+    /* Compute the amount to skip between blocks */
+    for(u = 0; u < ndims; u++)
+        skip[u] = (tdiminfo[u].stride - tdiminfo[u].block) * slab[u];
+
+    /* Check if there is a partial row left (with full blocks) */
+    if(tmp_count[fast_dim] > 0) {
+        /* Get number of blocks in fastest dimension */
+        H5_CHECKED_ASSIGN(fast_dim_count, size_t, tdiminfo[fast_dim].count - tmp_count[fast_dim], hsize_t);
+
+        /* Make certain this entire row will fit into buffer */
+        fast_dim_count = MIN(fast_dim_count, tot_blk_count);
+
+        /* Number of blocks to sequence over */
+        act_blk_count = fast_dim_count;
+
+        /* Loop over all the blocks in the fastest changing dimension */
+        while(fast_dim_count > 0) {
+            /* Store the sequence information */
+            off[curr_seq] = loc;
+            len[curr_seq] = actual_bytes;
+
+            /* Increment sequence count */
+            curr_seq++;
+
+            /* Increment information to reflect block just processed */
+            loc += fast_dim_buf_off;
+
+            /* Decrement number of blocks */
+            fast_dim_count--;
+        } /* end while */
+
+        /* Decrement number of elements left */
+        io_left -= actual_elem * act_blk_count;
+
+        /* Decrement number of blocks left */
+        tot_blk_count -= act_blk_count;
+
+        /* Increment information to reflect block just processed */
+        tmp_count[fast_dim] += act_blk_count;
+
+        /* Check if we finished the entire row of blocks */
+        if(tmp_count[fast_dim] >= tdiminfo[fast_dim].count) {
+            /* Increment offset in destination buffer */
+            loc += wrap[fast_dim];
+
+            /* Increment information to reflect block just processed */
+            offset[fast_dim] = fast_dim_offset;    /* reset the offset in the fastest dimension */
+            tmp_count[fast_dim] = 0;
+
+            /* Increment the offset and count for the other dimensions */
+            temp_dim = (int)fast_dim - 1;
+            while(temp_dim >= 0) {
+                /* Move to the next row in the curent dimension */
+                offset[temp_dim]++;
+                tmp_block[temp_dim]++;
+
+                /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                if(tmp_block[temp_dim] < tdiminfo[temp_dim].block)
+                    break;
+                else {
+                    /* Move to the next block in the current dimension */
+                    offset[temp_dim] += (tdiminfo[temp_dim].stride - tdiminfo[temp_dim].block);
+                    loc += skip[temp_dim];
+                    tmp_block[temp_dim] = 0;
+                    tmp_count[temp_dim]++;
+
+                    /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                    if(tmp_count[temp_dim] < tdiminfo[temp_dim].count)
+                        break;
+                    else {
+                        offset[temp_dim] = (hsize_t)((hssize_t)tdiminfo[temp_dim].start + sel_off[temp_dim]);
+                        loc += wrap[temp_dim];
+                        tmp_count[temp_dim] = 0; /* reset back to the beginning of the line */
+                        tmp_block[temp_dim] = 0;
+                    } /* end else */
+                } /* end else */
+
+                /* Decrement dimension count */
+                temp_dim--;
+            } /* end while */
+        } /* end if */
+        else {
+            /* Update the offset in the fastest dimension */
+            offset[fast_dim] += (fast_dim_stride * act_blk_count);
+        } /* end else */
+    } /* end if */
+
+    /* Compute the number of entire rows to read in */
+    H5_CHECK_OVERFLOW(tot_blk_count / tdiminfo[fast_dim].count, hsize_t, size_t);
+    curr_rows = total_rows = (size_t)(tot_blk_count / tdiminfo[fast_dim].count);
+
+    /* Reset copy of number of blocks in fastest dimension */
+    H5_CHECKED_ASSIGN(fast_dim_count, size_t, tdiminfo[fast_dim].count, hsize_t);
+
+    /* Read in data until an entire sequence can't be written out any longer */
+    while(curr_rows > 0) {
+
+#define DUFF_GUTS							      \
+/* Store the sequence information */				      \
+off[curr_seq] = loc;						      \
+len[curr_seq] = actual_bytes;					      \
+                                                                          \
+/* Increment sequence count */					      \
+curr_seq++;								      \
+                                                                          \
+/* Increment information to reflect block just processed */		      \
+loc += fast_dim_buf_off;
+
+#ifdef NO_DUFFS_DEVICE
+        /* Loop over all the blocks in the fastest changing dimension */
+        while(fast_dim_count > 0) {
+            DUFF_GUTS
+
+            /* Decrement number of blocks */
+            fast_dim_count--;
+        } /* end while */
+#else /* NO_DUFFS_DEVICE */
+        {
+            size_t duffs_index; /* Counting index for Duff's device */
+
+            duffs_index = (fast_dim_count + 7) / 8;
+            switch (fast_dim_count % 8) {
+                default:
+                    HDassert(0 && "This Should never be executed!");
+                    break;
+                case 0:
+                    do
+                      {
+                        DUFF_GUTS
+                case 7:
+                        DUFF_GUTS
+                case 6:
+                        DUFF_GUTS
+                case 5:
+                        DUFF_GUTS
+                case 4:
+                        DUFF_GUTS
+                case 3:
+                        DUFF_GUTS
+                case 2:
+                        DUFF_GUTS
+                case 1:
+                        DUFF_GUTS
+                  } while (--duffs_index > 0);
+            } /* end switch */
+        }
+#endif /* NO_DUFFS_DEVICE */
+#undef DUFF_GUTS
+
+        /* Increment offset in destination buffer */
+        loc += wrap[fast_dim];
+
+        /* Increment the offset and count for the other dimensions */
+        temp_dim = (int)fast_dim - 1;
+        while(temp_dim >= 0) {
+            /* Move to the next row in the curent dimension */
+            offset[temp_dim]++;
+            tmp_block[temp_dim]++;
+
+            /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+            if(tmp_block[temp_dim] < tdiminfo[temp_dim].block)
+                break;
+            else {
+                /* Move to the next block in the current dimension */
+                offset[temp_dim] += (tdiminfo[temp_dim].stride - tdiminfo[temp_dim].block);
+                loc += skip[temp_dim];
+                tmp_block[temp_dim] = 0;
+                tmp_count[temp_dim]++;
+
+                /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                if(tmp_count[temp_dim] < tdiminfo[temp_dim].count)
+                    break;
+                else {
+                    offset[temp_dim] = (hsize_t)((hssize_t)tdiminfo[temp_dim].start + sel_off[temp_dim]);
+                    loc += wrap[temp_dim];
+                    tmp_count[temp_dim] = 0; /* reset back to the beginning of the line */
+                    tmp_block[temp_dim] = 0;
+                } /* end else */
+            } /* end else */
+
+            /* Decrement dimension count */
+            temp_dim--;
+        } /* end while */
+
+        /* Decrement the number of rows left */
+        curr_rows--;
+    } /* end while */
+
+    /* Adjust the number of blocks & elements left to transfer */
+
+    /* Decrement number of elements left */
+    H5_CHECK_OVERFLOW(actual_elem * (total_rows * tdiminfo[fast_dim].count), hsize_t, size_t);
+    io_left -= (size_t)(actual_elem * (total_rows * tdiminfo[fast_dim].count));
+
+    /* Decrement number of blocks left */
+    H5_CHECK_OVERFLOW((total_rows * tdiminfo[fast_dim].count), hsize_t, size_t);
+    tot_blk_count -= (size_t)(total_rows * tdiminfo[fast_dim].count);
+
+    /* Read in partial row of blocks */
+    if(io_left > 0 && curr_seq < maxseq) {
+        /* Get remaining number of blocks left to output */
+        fast_dim_count = tot_blk_count;
+
+        /* Loop over all the blocks in the fastest changing dimension */
+        while(fast_dim_count > 0) {
+            /* Store the sequence information */
+            off[curr_seq] = loc;
+            len[curr_seq] = actual_bytes;
+
+            /* Increment sequence count */
+            curr_seq++;
+
+            /* Increment information to reflect block just processed */
+            loc += fast_dim_buf_off;
+
+            /* Decrement number of blocks */
+            fast_dim_count--;
+        } /* end while */
+
+        /* Decrement number of elements left */
+        io_left -= actual_elem * tot_blk_count;
+
+        /* Increment information to reflect block just processed */
+        offset[fast_dim] += (fast_dim_stride * tot_blk_count);    /* move the offset in the fastest dimension */
+
+        /* Handle any leftover, partial blocks in this row */
+        if(io_left > 0 && curr_seq < maxseq) {
+            actual_elem = io_left;
+            actual_bytes = actual_elem * elem_size;
+
+            /* Store the sequence information */
+            off[curr_seq] = loc;
+            len[curr_seq] = actual_bytes;
+
+            /* Increment sequence count */
+            curr_seq++;
+
+            /* Decrement the number of elements left */
+            io_left -= actual_elem;
+
+            /* Increment buffer correctly */
+            offset[fast_dim] += actual_elem;
+        } /* end if */
+
+        /* don't bother checking slower dimensions */
+        HDassert(io_left == 0 || curr_seq == maxseq);
+    } /* end if */
+
+    /* Update the iterator */
+
+    /* Update the iterator with the location we stopped */
+    /* (Subtract out the selection offset) */
+    for(u = 0; u < ndims; u++)
+        iter->u.hyp.off[u] = (hsize_t)((hssize_t)offset[u] - sel_off[u]);
+
+    /* Decrement the number of elements left in selection */
+    iter->elmt_left -= (start_io_left - io_left);
+
+    /* Increment the number of sequences generated */
+    *nseq += curr_seq;
+
+    /* Increment the number of elements used */
+    *nelem += start_io_left - io_left;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_hyper_get_seq_list_opt() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_seq_list_single
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_hyper_get_seq_list_single(space, flags, iter, maxseq, maxelem, nseq, nelem, off, len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        unsigned flags;         IN: Flags for extra information about operation
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_get_seq_list_single(const H5S_t *space, H5S_sel_iter_t *iter,
+    size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+    const hssize_t *sel_off;    /* Selection offset in dataspace */
+    hsize_t *mem_size;      /* Size of the source buffer */
+    hsize_t base_offset[H5O_LAYOUT_NDIMS];   /* Base coordinate offset in dataspace */
+    hsize_t offset[H5O_LAYOUT_NDIMS];   /* Coordinate offset in dataspace */
+    hsize_t slab[H5O_LAYOUT_NDIMS];     /* Hyperslab size */
+    hsize_t fast_dim_block;     /* Local copies of fastest changing dimension info */
+    hsize_t acc;	        /* Accumulator */
+    hsize_t loc;                /* Coordinate offset */
+    size_t tot_blk_count;       /* Total number of blocks left to output */
+    size_t elem_size;           /* Size of each element iterating over */
+    size_t io_left;             /* The number of elements left in I/O operation */
+    size_t actual_elem;         /* The actual number of elements to count */
+    unsigned ndims;             /* Number of dimensions of dataset */
+    unsigned fast_dim;          /* Rank of the fastest changing dimension for the dataspace */
+    unsigned skip_dim;          /* Rank of the dimension to skip along */
+    unsigned u;                 /* Local index variable */
+    int i;                      /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Set a local copy of the diminfo pointer */
+    tdiminfo = iter->u.hyp.diminfo;
+
+    /* Check if this is a "flattened" regular hyperslab selection */
+    if(iter->u.hyp.iter_rank != 0 && iter->u.hyp.iter_rank < space->extent.rank) {
+        /* Set the aliases for a few important dimension ranks */
+        ndims = iter->u.hyp.iter_rank;
+
+        /* Set the local copy of the selection offset */
+        sel_off = iter->u.hyp.sel_off;
+
+        /* Set up the pointer to the size of the memory space */
+        mem_size = iter->u.hyp.size;
+    } /* end if */
+    else {
+        /* Set the aliases for a few important dimension ranks */
+        ndims = space->extent.rank;
+
+        /* Set the local copy of the selection offset */
+        sel_off = space->select.offset;
+
+        /* Set up the pointer to the size of the memory space */
+        mem_size = space->extent.size;
+    } /* end else */
+    fast_dim = ndims - 1;
+
+    /* initialize row sizes for each dimension */
+    elem_size = iter->elmt_size;
+    for(i = (int)fast_dim, acc = elem_size; i >= 0; i--) {
+        slab[i] = acc;
+        acc *= mem_size[i];
+    } /* end for */
+
+    /* Copy the base location of the block */
+    /* (Add in the selection offset) */
+    for(u = 0; u < ndims; u++)
+        base_offset[u] = (hsize_t)((hssize_t)tdiminfo[u].start + sel_off[u]);
+
+    /* Copy the location of the point to get */
+    /* (Add in the selection offset) */
+    for(u = 0; u < ndims; u++)
+        offset[u] = (hsize_t)((hssize_t)iter->u.hyp.off[u] + sel_off[u]);
+
+    /* Compute the initial buffer offset */
+    for(u = 0, loc = 0; u < ndims; u++)
+        loc += offset[u] * slab[u];
+
+    /* Set local copies of information for the fastest changing dimension */
+    fast_dim_block = tdiminfo[fast_dim].block;
+
+    /* Calculate the number of elements to sequence through */
+    H5_CHECK_OVERFLOW(iter->elmt_left, hsize_t, size_t);
+    io_left = MIN((size_t)iter->elmt_left, maxelem);
+
+    /* Compute the number of blocks which would fit into the buffer */
+    H5_CHECK_OVERFLOW(io_left / fast_dim_block, hsize_t, size_t);
+    tot_blk_count = (size_t)(io_left / fast_dim_block);
+
+    /* Don't go over the maximum number of sequences allowed */
+    tot_blk_count = MIN(tot_blk_count, maxseq);
+
+    /* Set the number of elements to write each time */
+    H5_CHECKED_ASSIGN(actual_elem, size_t, fast_dim_block, hsize_t);
+
+    /* Check for blocks to operate on */
+    if(tot_blk_count > 0) {
+        size_t actual_bytes;        /* The actual number of bytes to copy */
+
+        /* Set the number of actual bytes */
+        actual_bytes = actual_elem * elem_size;
+
+        /* Check for 1-dim selection */
+        if(0 == fast_dim) {
+            /* Sanity checks */
+            HDassert(1 == tot_blk_count);
+            HDassert(io_left == actual_elem);
+
+            /* Store the sequence information */
+            *off++ = loc;
+            *len++ = actual_bytes;
+        } /* end if */
+        else {
+            hsize_t skip_slab;          /* Temporary copy of slab[fast_dim - 1] */
+            size_t blk_count;           /* Total number of blocks left to output */
+
+            /* Find first dimension w/block >1 */
+            skip_dim = fast_dim;
+            for(i = (int)(fast_dim - 1); i >= 0; i--)
+                if(tdiminfo[i].block > 1) {
+                    skip_dim = (unsigned)i;
+                    break;
+                } /* end if */
+            skip_slab = slab[skip_dim];
+
+            /* Check for being able to use fast algorithm for 1-D */
+            if(0 == skip_dim) {
+                /* Create sequences until an entire row can't be used */
+                blk_count = tot_blk_count;
+                while(blk_count > 0) {
+                    /* Store the sequence information */
+                    *off++ = loc;
+                    *len++ = actual_bytes;
+
+                    /* Increment offset in destination buffer */
+                    loc += skip_slab;
+
+                    /* Decrement block count */
+                    blk_count--;
+                } /* end while */
+
+                /* Move to the next location */
+                offset[skip_dim] += tot_blk_count;
+            } /* end if */
+            else {
+                hsize_t tmp_block[H5O_LAYOUT_NDIMS];/* Temporary block offset */
+                hsize_t skip[H5O_LAYOUT_NDIMS];     /* Bytes to skip between blocks */
+                int temp_dim;               /* Temporary rank holder */
+
+                /* Set the starting block location */
+                for(u = 0; u < ndims; u++)
+                    tmp_block[u] = iter->u.hyp.off[u] - tdiminfo[u].start;
+
+                /* Compute the amount to skip between sequences */
+                for(u = 0; u < ndims; u++)
+                    skip[u] = (mem_size[u] - tdiminfo[u].block) * slab[u];
+
+                /* Create sequences until an entire row can't be used */
+                blk_count = tot_blk_count;
+                while(blk_count > 0) {
+                    /* Store the sequence information */
+                    *off++ = loc;
+                    *len++ = actual_bytes;
+
+                    /* Set temporary dimension for advancing offsets */
+                    temp_dim = (int)skip_dim;
+
+                    /* Increment offset in destination buffer */
+                    loc += skip_slab;
+
+                    /* Increment the offset and count for the other dimensions */
+                    while(temp_dim >= 0) {
+                        /* Move to the next row in the curent dimension */
+                        offset[temp_dim]++;
+                        tmp_block[temp_dim]++;
+
+                        /* If this block is still in the range of blocks to output for the dimension, break out of loop */
+                        if(tmp_block[temp_dim] < tdiminfo[temp_dim].block)
+                            break;
+                        else {
+                            offset[temp_dim] = base_offset[temp_dim];
+                            loc += skip[temp_dim];
+                            tmp_block[temp_dim] = 0;
+                        } /* end else */
+
+                        /* Decrement dimension count */
+                        temp_dim--;
+                    } /* end while */
+
+                    /* Decrement block count */
+                    blk_count--;
+                } /* end while */
+            } /* end else */
+        } /* end else */
+
+        /* Update the iterator, if there were any blocks used */
+
+        /* Decrement the number of elements left in selection */
+        iter->elmt_left -= tot_blk_count * actual_elem;
+
+        /* Check if there are elements left in iterator */
+        if(iter->elmt_left > 0) {
+            /* Update the iterator with the location we stopped */
+            /* (Subtract out the selection offset) */
+            for(u = 0; u < ndims; u++)
+                iter->u.hyp.off[u] = (hsize_t)((hssize_t)offset[u] - sel_off[u]);
+        } /* end if */
+
+        /* Increment the number of sequences generated */
+        *nseq += tot_blk_count;
+
+        /* Increment the number of elements used */
+        *nelem += tot_blk_count * actual_elem;
+    } /* end if */
+
+    /* Check for partial block, with room for another sequence */
+    if(io_left > (tot_blk_count * actual_elem) && tot_blk_count < maxseq) {
+        size_t elmt_remainder;  /* Elements remaining */
+
+        /* Compute elements left */
+        elmt_remainder = io_left - (tot_blk_count * actual_elem);
+        HDassert(elmt_remainder < fast_dim_block);
+        HDassert(elmt_remainder > 0);
+
+        /* Store the sequence information */
+        *off++ = loc;
+        *len++ = elmt_remainder * elem_size;
+
+        /* Update the iterator with the location we stopped */
+        iter->u.hyp.off[fast_dim] += (hsize_t)elmt_remainder;
+
+        /* Decrement the number of elements left in selection */
+        iter->elmt_left -= elmt_remainder;
+
+        /* Increment the number of sequences generated */
+        (*nseq)++;
+
+        /* Increment the number of elements used */
+        *nelem += elmt_remainder;
+    } /* end if */
+
+    /* Sanity check */
+    HDassert(*nseq > 0);
+    HDassert(*nelem > 0);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_hyper_get_seq_list_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_seq_list
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_hyper_get_seq_list(space,flags,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        unsigned flags;         IN: Flags for extra information about operation
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_get_seq_list(const H5S_t *space, unsigned H5_ATTR_UNUSED flags, H5S_sel_iter_t *iter,
+    size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    herr_t ret_value;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(iter->elmt_left > 0);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Check for the special case of just one H5Sselect_hyperslab call made */
+    if(space->select.sel_info.hslab->diminfo_valid) {
+        const H5S_hyper_dim_t *tdiminfo;    /* Temporary pointer to diminfo information */
+        const hssize_t *sel_off;    /* Selection offset in dataspace */
+        hsize_t *mem_size;      /* Size of the source buffer */
+        unsigned ndims;         /* Number of dimensions of dataset */
+        unsigned fast_dim;      /* Rank of the fastest changing dimension for the dataspace */
+        hbool_t single_block;   /* Whether the selection is a single block */
+        unsigned u;             /* Local index variable */
+
+        /* Set a local copy of the diminfo pointer */
+        tdiminfo = iter->u.hyp.diminfo;
+
+        /* Check if this is a "flattened" regular hyperslab selection */
+        if(iter->u.hyp.iter_rank != 0 && iter->u.hyp.iter_rank < space->extent.rank) {
+            /* Set the aliases for a few important dimension ranks */
+            ndims = iter->u.hyp.iter_rank;
+
+            /* Set the local copy of the selection offset */
+            sel_off = iter->u.hyp.sel_off;
+
+            /* Set up the pointer to the size of the memory space */
+            mem_size = iter->u.hyp.size;
+        } /* end if */
+        else {
+            /* Set the aliases for a few important dimension ranks */
+            ndims = space->extent.rank;
+
+            /* Set the local copy of the selection offset */
+            sel_off = space->select.offset;
+
+            /* Set up the pointer to the size of the memory space */
+            mem_size = space->extent.size;
+        } /* end else */
+        fast_dim = ndims - 1;
+
+        /* Check if we stopped in the middle of a sequence of elements */
+        if((iter->u.hyp.off[fast_dim] - tdiminfo[fast_dim].start) % tdiminfo[fast_dim].stride != 0 ||
+                ((iter->u.hyp.off[fast_dim] != tdiminfo[fast_dim].start) && tdiminfo[fast_dim].count == 1)) {
+            hsize_t slab[H5O_LAYOUT_NDIMS];     /* Hyperslab size */
+            hsize_t loc;                /* Coordinate offset */
+            hsize_t acc;	        /* Accumulator */
+            size_t leftover;            /* The number of elements left over from the last sequence */
+            size_t actual_elem;         /* The actual number of elements to count */
+            size_t elem_size;           /* Size of each element iterating over */
+            int i;                      /* Local index variable */
+
+
+            /* Calculate the number of elements left in the sequence */
+            if(tdiminfo[fast_dim].count == 1) {
+                H5_CHECKED_ASSIGN(leftover, size_t, tdiminfo[fast_dim].block - (iter->u.hyp.off[fast_dim] - tdiminfo[fast_dim].start), hsize_t);
+            } /* end if */
+            else {
+                H5_CHECKED_ASSIGN(leftover, size_t, tdiminfo[fast_dim].block - ((iter->u.hyp.off[fast_dim] - tdiminfo[fast_dim].start) % tdiminfo[fast_dim].stride), hsize_t);
+            } /* end else */
+
+            /* Make certain that we don't write too many */
+            actual_elem = MIN3(leftover, (size_t)iter->elmt_left, maxelem);
+
+            /* initialize row sizes for each dimension */
+            elem_size = iter->elmt_size;
+            for(i = (int)fast_dim, acc = elem_size; i >= 0; i--) {
+                slab[i] = acc;
+                acc *= mem_size[i];
+            } /* end for */
+
+            /* Compute the initial buffer offset */
+            for(u = 0, loc = 0; u < ndims; u++)
+                loc += ((hsize_t)((hssize_t)iter->u.hyp.off[u] + sel_off[u])) * slab[u];
+
+            /* Add a new sequence */
+            off[0] = loc;
+            H5_CHECKED_ASSIGN(len[0], size_t, actual_elem * elem_size, hsize_t);
+
+            /* Increment sequence array locations */
+            off++;
+            len++;
+
+            /* Advance the hyperslab iterator */
+            H5S_hyper_iter_next(iter, actual_elem);
+
+            /* Decrement the number of elements left in selection */
+            iter->elmt_left -= actual_elem;
+
+            /* Decrement element/sequence limits */
+            maxelem -= actual_elem;
+            maxseq--;
+
+            /* Set the number of sequences generated and elements used */
+            *nseq = 1;
+            *nelem = actual_elem;
+
+            /* Check for using up all the sequences/elements */
+            if(0 == iter->elmt_left || 0 == maxelem || 0 == maxseq)
+                return(SUCCEED);
+        } /* end if */
+        else {
+            /* Reset the number of sequences generated and elements used */
+            *nseq = 0;
+            *nelem = 0;
+        } /* end else */
+
+        /* Check for a single block selected */
+        single_block = TRUE;
+        for(u = 0; u < ndims; u++)
+            if(1 != tdiminfo[u].count) {
+                single_block = FALSE;
+                break;
+            } /* end if */
+
+        /* Check for single block selection */
+        if(single_block)
+            /* Use single-block optimized call to generate sequence list */
+            ret_value = H5S_hyper_get_seq_list_single(space, iter, maxseq, maxelem, nseq, nelem, off, len);
+        else
+            /* Use optimized call to generate sequence list */
+            ret_value = H5S_hyper_get_seq_list_opt(space, iter, maxseq, maxelem, nseq, nelem, off, len);
+    } /* end if */
+    else
+        /* Call the general sequence generator routine */
+        ret_value = H5S_hyper_get_seq_list_gen(space, iter, maxseq, maxelem, nseq, nelem, off, len);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_get_seq_list() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Smpio.c b/gatb-core/thirdparty/hdf5/src/H5Smpio.c
new file mode 100644
index 0000000..2187f0e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Smpio.c
@@ -0,0 +1,1094 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  rky 980813
+ *
+ * Purpose:	Functions to read/write directly between app buffer and file.
+ *
+ * 		Beware of the ifdef'ed print statements.
+ *		I didn't make them portable.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Spkg.h"		/* Dataspaces 				*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+
+#ifdef H5_HAVE_PARALLEL
+
+static herr_t H5S_mpio_all_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type);
+static herr_t H5S_mpio_none_type(MPI_Datatype *new_type, int *count,
+    hbool_t *is_derived_type);
+static herr_t H5S_mpio_create_point_datatype(size_t elmt_size, hsize_t num_points, 
+    MPI_Aint *disp, MPI_Datatype *new_type);
+static herr_t H5S_mpio_point_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type,
+    hbool_t do_permute, hsize_t **permute_map, hbool_t *is_permuted);
+static herr_t H5S_mpio_permute_type(const H5S_t *space, size_t elmt_size, 
+    hsize_t **permute_map, MPI_Datatype *new_type, int *count,
+    hbool_t *is_derived_type);
+static herr_t H5S_mpio_hyper_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type);
+static herr_t H5S_mpio_span_hyper_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type);
+static herr_t H5S_obtain_datatype(const hsize_t down[], H5S_hyper_span_t* span,
+    const MPI_Datatype *elmt_type, MPI_Datatype *span_type, size_t elmt_size);
+
+#define H5S_MPIO_INITIAL_ALLOC_COUNT    256
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_all_type
+ *
+ * Purpose:	Translate an HDF5 "all" selection into an MPI type.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:	rky 980813
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_all_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type)
+{
+    hsize_t	total_bytes;
+    hssize_t	snelmts;                /* Total number of elmts	(signed) */
+    hsize_t	nelmts;                 /* Total number of elmts	*/
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+
+    /* Just treat the entire extent as a block of bytes */
+    if((snelmts = (hssize_t)H5S_GET_EXTENT_NPOINTS(space)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src dataspace has invalid selection")
+    H5_CHECKED_ASSIGN(nelmts, hsize_t, snelmts, hssize_t);
+
+    total_bytes = (hsize_t)elmt_size * nelmts;
+
+    /* fill in the return values */
+    *new_type = MPI_BYTE;
+    H5_CHECKED_ASSIGN(*count, int, total_bytes, hsize_t);
+    *is_derived_type = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_mpio_all_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_none_type
+ *
+ * Purpose:	Translate an HDF5 "none" selection into an MPI type.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:	Quincey Koziol, October 29, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_none_type(MPI_Datatype *new_type, int *count, hbool_t *is_derived_type)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* fill in the return values */
+    *new_type = MPI_BYTE;
+    *count = 0;
+    *is_derived_type = FALSE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5S_mpio_none_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_create_point_datatype
+ *
+ * Purpose:	Create a derived datatype for point selections.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5S_mpio_create_point_datatype (size_t elmt_size, hsize_t num_points,
+    MPI_Aint *disp, MPI_Datatype *new_type) 
+{
+    MPI_Datatype   elmt_type;           /* MPI datatype for individual element */
+    hbool_t        elmt_type_created = FALSE;   /* Whether the element MPI datatype was created */
+    int            mpi_code;            /* MPI error code */
+    int            *blocks = NULL;      /* Array of block sizes for MPI hindexed create call */
+    hsize_t        u;                   /* Local index variable */
+    herr_t	   ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Create an MPI datatype for an element */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_contiguous((int)elmt_size, MPI_BYTE, &elmt_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
+    elmt_type_created = TRUE;
+    
+    /* Allocate block sizes for MPI datatype call */
+    if(NULL == (blocks = (int *)H5MM_malloc(sizeof(int) * num_points)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of blocks")
+
+    /* Would be nice to have Create_Hindexed_block to avoid this array of all ones */
+    for(u = 0; u < num_points; u++)
+        blocks[u] = 1;
+
+    /* Create an MPI datatype for the whole point selection */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed((int)num_points, blocks, disp, elmt_type, new_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_indexed_block failed", mpi_code)
+
+    /* Commit MPI datatype for later use */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(new_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+
+done:
+    if(elmt_type_created)
+        MPI_Type_free(&elmt_type);
+    if(blocks)
+        H5MM_free(blocks);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_mpio_create_point_datatype() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_point_type
+ *
+ * Purpose:	Translate an HDF5 "point" selection into an MPI type.
+ *              Create a permutation array to handle out-of-order point selections.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *              *permute_map      the permutation of the displacements to create
+ *                                the MPI_Datatype
+ *              *is_permuted      0 if the displacements are permuted, 1 if not
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_point_type(const H5S_t *space, size_t elmt_size, MPI_Datatype *new_type, 
+    int *count, hbool_t *is_derived_type, hbool_t do_permute, hsize_t **permute,
+    hbool_t *is_permuted)
+{
+    MPI_Aint *disp = NULL;      /* Datatype displacement for each point*/
+    H5S_pnt_node_t *curr = NULL; /* Current point being operated on in from the selection */
+    hssize_t snum_points;       /* Signed number of elements in selection */
+    hsize_t num_points;         /* Sumber of points in the selection */
+    hsize_t u;                  /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+
+    /* Get the total number of points selected */
+    if((snum_points = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
+    num_points = (hsize_t)snum_points;
+
+    /* Allocate array for element displacements */
+    if(NULL == (disp = (MPI_Aint *)H5MM_malloc(sizeof(MPI_Aint) * num_points)))
+         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of displacements")
+
+    /* Allocate array for element permutation - returned to caller */
+    if(do_permute)
+        if(NULL == (*permute = (hsize_t *)H5MM_malloc(sizeof(hsize_t) * num_points)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate permutation array")
+
+    /* Iterate through list of elements */
+    curr = space->select.sel_info.pnt_lst->head;
+    for(u = 0 ; u < num_points ; u++) {
+        /* calculate the displacement of the current point */
+        disp[u] = H5VM_array_offset(space->extent.rank, space->extent.size, curr->pnt);
+        disp[u] *= elmt_size;
+
+        /* This is a File Space used to set the file view, so adjust the displacements 
+         * to have them monotonically non-decreasing.
+         * Generate the permutation array by indicating at each point being selected, 
+         * the position it will shifted in the new displacement. Example: 
+         * Suppose 4 points with corresponding are selected 
+         * Pt 1: disp=6 ; Pt 2: disp=3 ; Pt 3: disp=0 ; Pt 4: disp=4 
+         * The permute map to sort the displacements in order will be:
+         * point 1: map[0] = L, indicating that this point is not moved (1st point selected)
+         * point 2: map[1] = 0, indicating that this point is moved to the first position, 
+         *                      since disp_pt1(6) > disp_pt2(3)
+         * point 3: map[2] = 0, move to position 0, bec it has the lowest disp between 
+         *                      the points selected so far.
+         * point 4: map[3] = 2, move the 2nd position since point 1 has a higher disp, 
+         *                      but points 2 and 3 have lower displacements.
+         */
+        if(do_permute) {
+            if(u > 0 && disp[u] < disp[u - 1]) {
+                unsigned s = 0, l = u, m = u / 2;
+
+                *is_permuted = TRUE;
+                do {
+                    if(disp[u] > disp[m])
+                        s = m + 1;
+                    else if(disp[u] < disp[m])
+                        l = m;
+                    else
+                        break;
+                    m = s + ((l - s) / 2);
+                } while(s < l);
+
+                if(m < u) {
+                    MPI_Aint temp;
+
+                    temp = disp[u];
+                    HDmemmove(disp + m + 1, disp + m, (u - m) * sizeof(MPI_Aint));
+                    disp[m] = temp;
+                } /* end if */
+                (*permute)[u] = m;                
+            } /* end if */
+            else
+                (*permute)[u] = num_points;
+        } /* end if */
+        /* this is a memory space, and no permutation is necessary to create
+           the derived datatype */
+        else {
+            ;/* do nothing */
+        } /* end else */
+
+        /* get the next point */
+        curr = curr->next;
+    } /* end for */
+
+    /* Create the MPI datatype for the set of element displacements */
+    if(H5S_mpio_create_point_datatype(elmt_size, num_points, disp, new_type) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create an MPI Datatype from point selection")
+
+    /* Set values about MPI datatype created */
+    *count = 1;
+    *is_derived_type = TRUE;
+
+done:
+    if(NULL != disp)
+        H5MM_free(disp);
+
+    /* Release the permutation buffer, if it wasn't used */
+    if(!(*is_permuted) && (*permute)) {
+        H5MM_free(*permute);
+        *permute = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_mpio_point_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_permute_type
+ *
+ * Purpose:	Translate an HDF5 "all/hyper/point" selection into an MPI type,
+ *              while applying the permutation map. This function is called if
+ *              the file space selection is permuted due to out-of-order point
+ *              selection and so the memory datatype has to be permuted using the
+ *              permutation map created by the file selection.
+ *
+ * Note:	This routine is called from H5S_mpio_space_type(), which is
+ *              called first for the file dataspace and creates
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_permute_type(const H5S_t *space, size_t elmt_size, hsize_t **permute, 
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type)
+{
+    MPI_Aint *disp = NULL;      /* Datatype displacement for each point*/
+    H5S_sel_iter_t sel_iter;    /* Selection iteration info */
+    hbool_t sel_iter_init = FALSE;      /* Selection iteration info has been initialized */
+    hsize_t off[H5D_IO_VECTOR_SIZE];    /* Array to store sequence offsets */
+    size_t len[H5D_IO_VECTOR_SIZE];     /* Array to store sequence lengths */
+    hssize_t snum_points;       /* Signed number of elements in selection */
+    hsize_t num_points;         /* Number of points in the selection */
+    size_t max_elem;            /* Maximum number of elements allowed in sequences */
+    hsize_t u;                  /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+
+    /* Get the total number of points selected */
+    if((snum_points = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
+    num_points = (hsize_t)snum_points;
+
+    /* Allocate array to store point displacements */
+    if(NULL == (disp = (MPI_Aint *)H5MM_malloc(sizeof(MPI_Aint) * num_points)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of displacements")
+
+    /* Initialize selection iterator */
+    if(H5S_select_iter_init(&sel_iter, space, elmt_size) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    sel_iter_init = TRUE;	/* Selection iteration info has been initialized */
+
+    /* Set the number of elements to iterate over */
+    H5_CHECKED_ASSIGN(max_elem, size_t, num_points, hsize_t);
+
+    /* Loop, while elements left in selection */
+    u = 0;
+    while(max_elem > 0) {
+        hsize_t off[H5D_IO_VECTOR_SIZE];        /* Array to store sequence offsets */
+        size_t len[H5D_IO_VECTOR_SIZE];         /* Array to store sequence lengths */
+        size_t nelem;               /* Number of elements used in sequences */
+        size_t nseq;                /* Number of sequences generated */
+        size_t curr_seq;            /* Current sequence being worked on */
+
+        /* Get the sequences of bytes */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, &sel_iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+        /* Loop, while sequences left to process */
+        for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
+            hsize_t curr_off;           /* Current offset within sequence */
+            size_t curr_len;            /* Length of bytes left to process in sequence */
+
+            /* Get the current offset */
+            curr_off = off[curr_seq];
+
+            /* Get the number of bytes in sequence */
+            curr_len = len[curr_seq];
+
+            /* Loop, while bytes left in sequence */
+            while(curr_len > 0) {
+                /* Set the displacement of the current point */
+                disp[u] = curr_off;
+
+                /* This is a memory displacement, so for each point selected, 
+                 * apply the map that was generated by the file selection */
+                if((*permute)[u] != num_points) {
+                    MPI_Aint temp = disp[u];
+
+                    HDmemmove(disp + (*permute)[u] + 1, disp + (*permute)[u], 
+                             (u - (*permute)[u]) * sizeof(MPI_Aint));
+                    disp[(*permute)[u]] = temp;
+                } /* end if */
+
+                /* Advance to next element */
+                u++;
+
+                /* Increment offset in dataspace */
+                curr_off += elmt_size;
+
+                /* Decrement number of bytes left in sequence */
+                curr_len -= elmt_size;
+            } /* end while */
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        max_elem -= nelem;
+    } /* end while */
+
+    /* Create the MPI datatype for the set of element displacements */
+    if(H5S_mpio_create_point_datatype(elmt_size, num_points, disp, new_type) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't create an MPI Datatype from point selection")
+
+    /* Set values about MPI datatype created */
+    *count = 1;
+    *is_derived_type = TRUE;
+
+done:
+    /* Release selection iterator */
+    if(sel_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&sel_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Free memory */
+    if(disp)
+        H5MM_free(disp);
+    if(*permute) {
+        H5MM_free(*permute);
+        *permute = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_mpio_permute_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_hyper_type
+ *
+ * Purpose:	Translate an HDF5 hyperslab selection into an MPI type.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:	rky 980813
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_hyper_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type)
+{
+    H5S_sel_iter_t sel_iter;    /* Selection iteration info */
+    hbool_t sel_iter_init = FALSE;    /* Selection iteration info has been initialized */
+
+    struct dim {	/* less hassle than malloc/free & ilk */
+        hssize_t start;
+        hsize_t strid;
+        hsize_t block;
+        hsize_t xtent;
+        hsize_t count;
+    } d[H5S_MAX_RANK];
+
+    hsize_t		offset[H5S_MAX_RANK];
+    hsize_t		max_xtent[H5S_MAX_RANK];
+    H5S_hyper_dim_t	*diminfo;		/* [rank] */
+    unsigned		rank;
+    MPI_Datatype	inner_type, outer_type;
+    MPI_Aint            extent_len, start_disp, new_extent;
+    MPI_Aint            lb; /* Needed as an argument for MPI_Type_get_extent */
+    unsigned		u;			/* Local index variable */
+    int			i;			/* Local index variable */
+    int                 mpi_code;               /* MPI return code */
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(sizeof(MPI_Aint) >= sizeof(elmt_size));
+
+    /* Initialize selection iterator */
+    if(H5S_select_iter_init(&sel_iter, space, elmt_size) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    sel_iter_init = TRUE;	/* Selection iteration info has been initialized */
+
+    /* Abbreviate args */
+    diminfo = sel_iter.u.hyp.diminfo;
+    HDassert(diminfo);
+
+    /* make a local copy of the dimension info so we can operate with them */
+
+    /* Check if this is a "flattened" regular hyperslab selection */
+    if(sel_iter.u.hyp.iter_rank != 0 && sel_iter.u.hyp.iter_rank < space->extent.rank) {
+        /* Flattened selection */
+        rank = sel_iter.u.hyp.iter_rank;
+        HDassert(rank <= H5S_MAX_RANK);	/* within array bounds */
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+            HDfprintf(H5DEBUG(S), "%s: Flattened selection\n",FUNC);
+#endif
+        for(u = 0; u < rank; ++u) {
+            H5_CHECK_OVERFLOW(diminfo[u].start, hsize_t, hssize_t)
+            d[u].start = (hssize_t)diminfo[u].start + sel_iter.u.hyp.sel_off[u];
+            d[u].strid = diminfo[u].stride;
+            d[u].block = diminfo[u].block;
+            d[u].count = diminfo[u].count;
+            d[u].xtent = sel_iter.u.hyp.size[u];
+#ifdef H5S_DEBUG
+       if(H5DEBUG(S)){
+            HDfprintf(H5DEBUG(S), "%s: start=%Hd  stride=%Hu  count=%Hu  block=%Hu  xtent=%Hu",
+                FUNC, d[u].start, d[u].strid, d[u].count, d[u].block, d[u].xtent );
+            if (u==0)
+                HDfprintf(H5DEBUG(S), "  rank=%u\n", rank );
+            else
+                HDfprintf(H5DEBUG(S), "\n" );
+      }
+#endif
+            if(0 == d[u].block)
+                goto empty;
+            if(0 == d[u].count)
+                goto empty;
+            if(0 == d[u].xtent)
+                goto empty;
+        } /* end for */
+    } /* end if */
+    else {
+        /* Non-flattened selection */
+        rank = space->extent.rank;
+        HDassert(rank <= H5S_MAX_RANK);	/* within array bounds */
+        if(0 == rank)
+            goto empty;
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+            HDfprintf(H5DEBUG(S),"%s: Non-flattened selection\n",FUNC);
+#endif
+        for(u = 0; u < rank; ++u) {
+            H5_CHECK_OVERFLOW(diminfo[u].start, hsize_t, hssize_t)
+            d[u].start = (hssize_t)diminfo[u].start + space->select.offset[u];
+            d[u].strid = diminfo[u].stride;
+            d[u].block = diminfo[u].block;
+            d[u].count = diminfo[u].count;
+            d[u].xtent = space->extent.size[u];
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S)){
+    HDfprintf(H5DEBUG(S), "%s: start=%Hd  stride=%Hu  count=%Hu  block=%Hu  xtent=%Hu",
+              FUNC, d[u].start, d[u].strid, d[u].count, d[u].block, d[u].xtent );
+    if (u==0)
+        HDfprintf(H5DEBUG(S), "  rank=%u\n", rank );
+    else
+        HDfprintf(H5DEBUG(S), "\n" );
+  }
+#endif
+            if(0 == d[u].block)
+                goto empty;
+            if(0 == d[u].count)
+                goto empty;
+            if(0 == d[u].xtent)
+                goto empty;
+        } /* end for */
+    } /* end else */
+
+/**********************************************************************
+    Compute array "offset[rank]" which gives the offsets for a multi-
+    dimensional array with dimensions "d[i].xtent" (i=0,1,...,rank-1).
+**********************************************************************/
+    offset[rank - 1] = 1;
+    max_xtent[rank - 1] = d[rank - 1].xtent;
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S)) {
+     i = ((int)rank) - 1;
+     HDfprintf(H5DEBUG(S), " offset[%2d]=%Hu; max_xtent[%2d]=%Hu\n",
+                          i, offset[i], i, max_xtent[i]);
+  }
+#endif
+    for(i = ((int)rank) - 2; i >= 0; --i) {
+        offset[i] = offset[i + 1] * d[i + 1].xtent;
+        max_xtent[i] = max_xtent[i + 1] * d[i].xtent;
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+    HDfprintf(H5DEBUG(S), " offset[%2d]=%Hu; max_xtent[%2d]=%Hu\n",
+                          i, offset[i], i, max_xtent[i]);
+#endif
+    } /* end for */
+
+    /*  Create a type covering the selected hyperslab.
+     *  Multidimensional dataspaces are stored in row-major order.
+     *  The type is built from the inside out, going from the
+     *  fastest-changing (i.e., inner) dimension * to the slowest (outer). */
+
+/*******************************************************
+*  Construct contig type for inner contig dims:
+*******************************************************/
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S)) {
+    HDfprintf(H5DEBUG(S), "%s: Making contig type %Zu MPI_BYTEs\n", FUNC, elmt_size);
+    for(i = ((int)rank) - 1; i >= 0; --i)
+        HDfprintf(H5DEBUG(S), "d[%d].xtent=%Hu \n", i, d[i].xtent);
+  }
+#endif
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_contiguous((int)elmt_size, MPI_BYTE, &inner_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
+
+/*******************************************************
+*  Construct the type by walking the hyperslab dims
+*  from the inside out:
+*******************************************************/
+    for(i = ((int)rank) - 1; i >= 0; --i) {
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+    HDfprintf(H5DEBUG(S), "%s: Dimension i=%d \n"
+            "start=%Hd count=%Hu block=%Hu stride=%Hu, xtent=%Hu max_xtent=%d\n",
+            FUNC, i, d[i].start, d[i].count, d[i].block, d[i].strid, d[i].xtent, max_xtent[i]);
+#endif
+
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+    HDfprintf(H5DEBUG(S), "%s: i=%d  Making vector-type \n", FUNC,i);
+#endif
+       /****************************************
+       *  Build vector type of the selection.
+       ****************************************/
+	mpi_code = MPI_Type_vector((int)(d[i].count),       /* count */
+				   (int)(d[i].block),       /* blocklength */
+				   (int)(d[i].strid),       /* stride */
+				   inner_type,	            /* old type */
+				   &outer_type);            /* new type */
+
+        MPI_Type_free(&inner_type);
+        if(mpi_code != MPI_SUCCESS)
+            HMPI_GOTO_ERROR(FAIL, "couldn't create MPI vector type", mpi_code)
+
+        /****************************************
+        *  Then build the dimension type as (start, vector type, xtent).
+        ****************************************/
+        /* calculate start and extent values of this dimension */
+	start_disp = d[i].start * offset[i] * elmt_size;
+        new_extent = (MPI_Aint)elmt_size * max_xtent[i];
+        if(MPI_SUCCESS != (mpi_code = MPI_Type_get_extent(outer_type, &lb, &extent_len)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_get_extent failed", mpi_code)
+
+        /*************************************************
+        *  Restructure this datatype ("outer_type")
+        *  so that it still starts at 0, but its extent
+        *  is the full extent in this dimension.
+        *************************************************/
+        if(start_disp > 0 || extent_len < new_extent) {
+            MPI_Datatype interm_type;
+            int block_len = 1;
+
+            HDassert(0 == lb);
+
+            mpi_code = MPI_Type_create_hindexed(1, &block_len, &start_disp, outer_type, &interm_type);
+            MPI_Type_free(&outer_type);
+            if(mpi_code != MPI_SUCCESS)
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
+
+            mpi_code = MPI_Type_create_resized(interm_type, lb, new_extent, &inner_type);
+            MPI_Type_free(&interm_type);
+            if(mpi_code != MPI_SUCCESS)
+                HMPI_GOTO_ERROR(FAIL, "couldn't resize MPI vector type", mpi_code)
+        } /* end if */
+        else
+            inner_type = outer_type;
+    } /* end for */
+/***************************
+*  End of loop, walking
+*  thru dimensions.
+***************************/
+
+    /* At this point inner_type is actually the outermost type, even for 0-trip loop */
+    *new_type = inner_type;
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(new_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+
+    /* fill in the remaining return values */
+    *count = 1;			/* only have to move one of these suckers! */
+    *is_derived_type = TRUE;
+    HGOTO_DONE(SUCCEED);
+
+empty:
+    /* special case: empty hyperslab */
+    *new_type = MPI_BYTE;
+    *count = 0;
+    *is_derived_type = FALSE;
+
+done:
+    /* Release selection iterator */
+    if(sel_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&sel_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+#ifdef H5S_DEBUG
+  if(H5DEBUG(S))
+    HDfprintf(H5DEBUG(S), "Leave %s, count=%ld  is_derived_type=%t\n",
+		FUNC, *count, *is_derived_type );
+#endif
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_mpio_hyper_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_span_hyper_type
+ *
+ * Purpose:	Translate an HDF5 irregular hyperslab selection into an
+                MPI type.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:  kyang
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_mpio_span_hyper_type(const H5S_t *space, size_t elmt_size,
+    MPI_Datatype *new_type, int *count, hbool_t *is_derived_type)
+{
+    MPI_Datatype  elmt_type;            /* MPI datatype for an element */
+    hbool_t elmt_type_is_derived = FALSE;       /* Whether the element type has been created */
+    MPI_Datatype  span_type;            /* MPI datatype for overall span tree */
+    hsize_t       down[H5S_MAX_RANK];   /* 'down' sizes for each dimension */
+    int           mpi_code;             /* MPI return code */
+    herr_t        ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(space->extent.size);
+    HDassert(space->select.sel_info.hslab->span_lst);
+    HDassert(space->select.sel_info.hslab->span_lst->head);
+
+    /* Create the base type for an element */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_contiguous((int)elmt_size, MPI_BYTE, &elmt_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
+    elmt_type_is_derived = TRUE;
+
+    /* Compute 'down' sizes for each dimension */
+    if(H5VM_array_down(space->extent.rank, space->extent.size, down) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGETSIZE, FAIL, "couldn't compute 'down' dimension sizes")
+
+    /* Obtain derived data type */
+    if(H5S_obtain_datatype(down, space->select.sel_info.hslab->span_lst->head, &elmt_type, &span_type, elmt_size) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't obtain  MPI derived data type")
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&span_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+    *new_type = span_type;
+
+    /* fill in the remaining return values */
+    *count = 1;
+    *is_derived_type = TRUE;
+
+done:
+    /* Release resources */
+    if(elmt_type_is_derived)
+        if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&elmt_type)))
+            HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_mpio_span_hyper_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_obtain_datatype
+ *
+ * Purpose:	Obtain an MPI derived datatype based on span-tree
+ *              implementation
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*span_type	 the MPI type corresponding to the selection
+ *
+ * Programmer:  kyang
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_obtain_datatype(const hsize_t *down, H5S_hyper_span_t *span,
+    const MPI_Datatype *elmt_type, MPI_Datatype *span_type, size_t elmt_size)
+{
+    size_t                alloc_count;          /* Number of span tree nodes allocated at this level */
+    size_t                outercount;           /* Number of span tree nodes at this level */
+    MPI_Datatype          *inner_type = NULL;
+    hbool_t inner_types_freed = FALSE;          /* Whether the inner_type MPI datatypes have been freed */
+    hbool_t span_type_valid = FALSE;            /* Whether the span_type MPI datatypes is valid */
+    int                   *blocklen = NULL;
+    MPI_Aint              *disp = NULL;
+    H5S_hyper_span_t      *tspan;               /* Temporary pointer to span tree node */
+    int                   mpi_code;             /* MPI return status code */
+    herr_t                ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(span);
+
+    /* Allocate the initial displacement & block length buffers */
+    alloc_count = H5S_MPIO_INITIAL_ALLOC_COUNT;
+    if(NULL == (disp = (MPI_Aint *)H5MM_malloc(alloc_count * sizeof(MPI_Aint))))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of displacements")
+    if(NULL == (blocklen = (int *)H5MM_malloc(alloc_count * sizeof(int))))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of block lengths")
+
+    /* if this is the fastest changing dimension, it is the base case for derived datatype. */
+    if(NULL == span->down) {
+        tspan = span;
+        outercount = 0;
+        while(tspan) {
+            /* Check if we need to increase the size of the buffers */
+            if(outercount >= alloc_count) {
+                MPI_Aint     *tmp_disp;         /* Temporary pointer to new displacement buffer */
+                int          *tmp_blocklen;     /* Temporary pointer to new block length buffer */
+
+                /* Double the allocation count */
+                alloc_count *= 2;
+
+                /* Re-allocate the buffers */
+                if(NULL == (tmp_disp = (MPI_Aint *)H5MM_realloc(disp, alloc_count * sizeof(MPI_Aint))))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of displacements")
+                disp = tmp_disp;
+                if(NULL == (tmp_blocklen = (int *)H5MM_realloc(blocklen, alloc_count * sizeof(int))))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of block lengths")
+                blocklen = tmp_blocklen;
+            } /* end if */
+
+            /* Store displacement & block length */
+            disp[outercount]      = (MPI_Aint)elmt_size * tspan->low;
+            H5_CHECK_OVERFLOW(tspan->nelem, hsize_t, int)
+            blocklen[outercount]  = (int)tspan->nelem;
+
+            tspan                 = tspan->next;
+            outercount++;
+        } /* end while */
+
+        if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed((int)outercount, blocklen, disp, *elmt_type, span_type)))
+              HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
+        span_type_valid = TRUE;
+    } /* end if */
+    else {
+        size_t u;               /* Local index variable */
+
+        if(NULL == (inner_type = (MPI_Datatype *)H5MM_malloc(alloc_count * sizeof(MPI_Datatype))))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of inner MPI datatypes")
+
+        tspan = span;
+        outercount = 0;
+        while(tspan) {
+            MPI_Datatype down_type;     /* Temporary MPI datatype for a span tree node's children */
+            MPI_Aint stride;            /* Distance between inner MPI datatypes */
+
+            /* Check if we need to increase the size of the buffers */
+            if(outercount >= alloc_count) {
+                MPI_Aint     *tmp_disp;         /* Temporary pointer to new displacement buffer */
+                int          *tmp_blocklen;     /* Temporary pointer to new block length buffer */
+                MPI_Datatype *tmp_inner_type;   /* Temporary pointer to inner MPI datatype buffer */
+
+                /* Double the allocation count */
+                alloc_count *= 2;
+
+                /* Re-allocate the buffers */
+                if(NULL == (tmp_disp = (MPI_Aint *)H5MM_realloc(disp, alloc_count * sizeof(MPI_Aint))))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of displacements")
+                disp = tmp_disp;
+                if(NULL == (tmp_blocklen = (int *)H5MM_realloc(blocklen, alloc_count * sizeof(int))))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of block lengths")
+                blocklen = tmp_blocklen;
+                if(NULL == (tmp_inner_type = (MPI_Datatype *)H5MM_realloc(inner_type, alloc_count * sizeof(MPI_Datatype))))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of inner MPI datatypes")
+                inner_type = tmp_inner_type;
+            } /* end if */
+
+            /* Displacement should be in byte and should have dimension information */
+            /* First using MPI Type vector to build derived data type for this span only */
+            /* Need to calculate the disp in byte for this dimension. */
+            /* Calculate the total bytes of the lower dimension */
+            disp[outercount]      = tspan->low * (*down) * elmt_size;
+            blocklen[outercount]  = 1;
+
+            /* Generate MPI datatype for next dimension down */
+            if(H5S_obtain_datatype(down + 1, tspan->down->head, elmt_type, &down_type, elmt_size) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't obtain  MPI derived data type")
+
+            /* Build the MPI datatype for this node */
+            stride = (*down) * elmt_size;
+            H5_CHECK_OVERFLOW(tspan->nelem, hsize_t, int)
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hvector((int)tspan->nelem, 1, stride, down_type, &inner_type[outercount]))) {
+                MPI_Type_free(&down_type);
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hvector failed", mpi_code)
+            } /* end if */
+
+            /* Release MPI datatype for next dimension down */
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&down_type)))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+
+            tspan = tspan->next;
+            outercount++;
+         } /* end while */
+
+        /* building the whole vector datatype */
+        H5_CHECK_OVERFLOW(outercount, size_t, int)
+        if(MPI_SUCCESS != (mpi_code = MPI_Type_create_struct((int)outercount, blocklen, disp, inner_type, span_type)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_struct failed", mpi_code)
+        span_type_valid = TRUE;
+
+        /* Release inner node types */
+        for(u = 0; u < outercount; u++)
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&inner_type[u])))
+                HMPI_GOTO_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+        inner_types_freed = TRUE;
+    } /* end else */
+
+done:
+    /* General cleanup */
+    if(inner_type != NULL) {
+        if(!inner_types_freed) {
+            size_t u;          /* Local index variable */
+
+            for(u = 0; u < outercount; u++)
+                if(MPI_SUCCESS != (mpi_code = MPI_Type_free(&inner_type[u])))
+                    HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+        } /* end if */
+
+        H5MM_free(inner_type);
+    } /* end if */
+    if(blocklen != NULL)
+        H5MM_free(blocklen);
+    if(disp != NULL)
+        H5MM_free(disp);
+
+    /* Error cleanup */
+    if(ret_value < 0) {
+        if(span_type_valid)
+            if(MPI_SUCCESS != (mpi_code = MPI_Type_free(span_type)))
+                HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code)
+    } /* end if */
+
+  FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_obtain_datatype() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_mpio_space_type
+ *
+ * Purpose:	Translate an HDF5 dataspace selection into an MPI type.
+ *		Currently handle only hyperslab and "all" selections.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Outputs:	*new_type	  the MPI type corresponding to the selection
+ *		*count		  how many objects of the new_type in selection
+ *				  (useful if this is the buffer type for xfer)
+ *		*is_derived_type  0 if MPI primitive type, 1 if derived
+ *
+ * Programmer:	rky 980813
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_mpio_space_type(const H5S_t *space, size_t elmt_size, MPI_Datatype *new_type, 
+    int *count, hbool_t *is_derived_type, hbool_t do_permute, hsize_t **permute_map,
+    hbool_t *is_permuted)
+{
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(elmt_size);
+
+    /* Create MPI type based on the kind of selection */
+    switch(H5S_GET_EXTENT_TYPE(space)) {
+        case H5S_NULL:
+        case H5S_SCALAR:
+        case H5S_SIMPLE:
+            /* If the file space has been permuted previously due to
+             * out-of-order point selection, then permute this selection which
+             * should be a memory selection to match the file space permutation.
+             */
+            if(TRUE == *is_permuted) { 
+                switch(H5S_GET_SELECT_TYPE(space)) {
+                    case H5S_SEL_NONE:
+                        if(H5S_mpio_none_type(new_type, count, is_derived_type) < 0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't convert 'none' selection to MPI type")
+                        break;
+
+                    case H5S_SEL_ALL:
+                    case H5S_SEL_POINTS:
+                    case H5S_SEL_HYPERSLABS:
+                        /* Sanity check */
+                        HDassert(!do_permute);
+
+                        if(H5S_mpio_permute_type(space, elmt_size, permute_map, new_type, count, is_derived_type) < 0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't convert 'all' selection to MPI type")
+                        break;
+
+                    case H5S_SEL_ERROR:
+                    case H5S_SEL_N:
+                    default:
+                        HDassert("unknown selection type" && 0);
+                        break;
+                } /* end switch */
+            } /* end if */
+            /* the file space is not permuted, so do a regular selection */
+            else {
+                switch(H5S_GET_SELECT_TYPE(space)) {
+                    case H5S_SEL_NONE:
+                        if(H5S_mpio_none_type(new_type, count, is_derived_type) < 0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't convert 'none' selection to MPI type")
+                        break;
+
+                    case H5S_SEL_ALL:
+                        if(H5S_mpio_all_type(space, elmt_size, new_type, count, is_derived_type) < 0)
+                            HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't convert 'all' selection to MPI type")
+                        break;
+
+                    case H5S_SEL_POINTS:
+                        if(H5S_mpio_point_type(space, elmt_size, new_type, count, is_derived_type, do_permute, permute_map, is_permuted) < 0)
+                           HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "couldn't convert 'point' selection to MPI type")
+                        break;
+
+                    case H5S_SEL_HYPERSLABS:
+                        if((H5S_SELECT_IS_REGULAR(space) == TRUE)) {
+                            if(H5S_mpio_hyper_type(space, elmt_size, new_type, count, is_derived_type) < 0)
+                                HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't convert regular 'hyperslab' selection to MPI type")
+                        } /* end if */
+                        else {
+                            if(H5S_mpio_span_hyper_type(space, elmt_size, new_type, count, is_derived_type) < 0)
+                                HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't convert irregular 'hyperslab' selection to MPI type")
+                        } /* end else */
+                        break;
+
+                    case H5S_SEL_ERROR:
+                    case H5S_SEL_N:
+                    default:
+                        HDassert("unknown selection type" && 0);
+                        break;
+                } /* end switch */
+            } /* end else */
+            break;
+
+        case H5S_NO_CLASS:
+        default:
+            HDassert("unknown data space type" && 0);
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_mpio_space_type() */
+#endif  /* H5_HAVE_PARALLEL */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Snone.c b/gatb-core/thirdparty/hdf5/src/H5Snone.c
new file mode 100644
index 0000000..5016677
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Snone.c
@@ -0,0 +1,920 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Tuesday, November 10, 1998
+ *
+ * Purpose:	"None" selection data space I/O functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"
+#include "H5Eprivate.h"
+#include "H5Iprivate.h"
+#include "H5Spkg.h"
+#include "H5VMprivate.h"
+#include "H5Dprivate.h"
+
+/* Static function prototypes */
+
+/* Selection callbacks */
+static herr_t H5S_none_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+static herr_t H5S_none_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+static herr_t H5S_none_release(H5S_t *space);
+static htri_t H5S_none_is_valid(const H5S_t *space);
+static hssize_t H5S_none_serial_size(const H5S_t *space);
+static herr_t H5S_none_serialize(const H5S_t *space, uint8_t *buf);
+static herr_t H5S_none_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_none_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
+static herr_t H5S_none_offset(const H5S_t *space, hsize_t *off);
+static htri_t H5S_none_is_contiguous(const H5S_t *space);
+static htri_t H5S_none_is_single(const H5S_t *space);
+static htri_t H5S_none_is_regular(const H5S_t *space);
+static herr_t H5S_none_adjust_u(H5S_t *space, const hsize_t *offset);
+static herr_t H5S_none_project_scalar(const H5S_t *space, hsize_t *offset);
+static herr_t H5S_none_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+static herr_t H5S_none_iter_init(H5S_sel_iter_t *iter, const H5S_t *space);
+
+/* Selection iteration callbacks */
+static herr_t H5S_none_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
+static herr_t H5S_none_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static hsize_t H5S_none_iter_nelmts(const H5S_sel_iter_t *iter);
+static htri_t H5S_none_iter_has_next_block(const H5S_sel_iter_t *iter);
+static herr_t H5S_none_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
+static herr_t H5S_none_iter_next_block(H5S_sel_iter_t *sel_iter);
+static herr_t H5S_none_iter_release(H5S_sel_iter_t *sel_iter);
+
+/* Selection properties for "none" selections */
+const H5S_select_class_t H5S_sel_none[1] = {{
+    H5S_SEL_NONE,
+
+    /* Methods on selection */
+    H5S_none_copy,
+    H5S_none_get_seq_list,
+    H5S_none_release,
+    H5S_none_is_valid,
+    H5S_none_serial_size,
+    H5S_none_serialize,
+    H5S_none_deserialize,
+    H5S_none_bounds,
+    H5S_none_offset,
+    H5S_none_is_contiguous,
+    H5S_none_is_single,
+    H5S_none_is_regular,
+    H5S_none_adjust_u,
+    H5S_none_project_scalar,
+    H5S_none_project_simple,
+    H5S_none_iter_init,
+}};
+
+/* Iteration properties for "none" selections */
+static const H5S_sel_iter_class_t H5S_sel_iter_none[1] = {{
+    H5S_SEL_NONE,
+
+    /* Methods on selection iterator */
+    H5S_none_iter_coords,
+    H5S_none_iter_block,
+    H5S_none_iter_nelmts,
+    H5S_none_iter_has_next_block,
+    H5S_none_iter_next,
+    H5S_none_iter_next_block,
+    H5S_none_iter_release,
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_iter_init
+ *
+ * Purpose:	Initializes iteration information for "none" selection.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_none_iter_init(H5S_sel_iter_t *iter, const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space && H5S_SEL_NONE==H5S_GET_SELECT_TYPE(space));
+    HDassert(iter);
+
+    /* Initialize type of selection iterator */
+    iter->type = H5S_sel_iter_none;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_none_iter_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_iter_coords
+ *
+ * Purpose:	Retrieve the current coordinates of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_none_iter_coords(const H5S_sel_iter_t H5_ATTR_UNUSED *iter, hsize_t H5_ATTR_UNUSED *coords)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(coords);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_iter_coords() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_iter_block
+ *
+ * Purpose:	Retrieve the current block of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 2, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_none_iter_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter, hsize_t H5_ATTR_UNUSED *start, hsize_t H5_ATTR_UNUSED *end)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(start);
+    HDassert(end);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_iter_block() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_iter_nelmts
+ *
+ * Purpose:	Return number of elements left to process in iterator
+ *
+ * Return:	non-negative number of elements on success, zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5S_none_iter_nelmts(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(0)
+}   /* H5S_none_iter_nelmts() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_iter_has_next_block
+ PURPOSE
+    Check if there is another block left in the current iterator
+ USAGE
+    htri_t H5S_none_iter_has_next_block(iter)
+        const H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative (TRUE/FALSE) on success/Negative on failure
+ DESCRIPTION
+    Check if there is another block available in the selection iterator.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_none_iter_has_next_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_iter_has_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_iter_next
+ PURPOSE
+    Increment selection iterator
+ USAGE
+    herr_t H5S_none_iter_next(iter, nelem)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+        size_t nelem;               IN: Number of elements to advance by
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the NELEM'th next element in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_iter_next(H5S_sel_iter_t H5_ATTR_UNUSED *iter, size_t H5_ATTR_UNUSED nelem)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(nelem>0);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_none_iter_next() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_iter_next_block
+ PURPOSE
+    Increment selection iterator to next block
+ USAGE
+    herr_t H5S_none_iter_next(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the next block in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_iter_next_block(H5S_sel_iter_t H5_ATTR_UNUSED *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_iter_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_iter_release
+ PURPOSE
+    Release "none" selection iterator information for a dataspace
+ USAGE
+    herr_t H5S_none_iter_release(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all information for a dataspace "none" selection iterator
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_iter_release(H5S_sel_iter_t H5_ATTR_UNUSED * iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_none_iter_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_release
+ PURPOSE
+    Release none selection information for a dataspace
+ USAGE
+    herr_t H5S_none_release(space)
+        H5S_t *space;       IN: Pointer to dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases "none" selection information for a dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_release(H5S_t H5_ATTR_UNUSED * space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_none_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_copy
+ PURPOSE
+    Copy a selection from one dataspace to another
+ USAGE
+    herr_t H5S_none_copy(dst, src)
+        H5S_t *dst;  OUT: Pointer to the destination dataspace
+        H5S_t *src;  IN: Pointer to the source dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Copies the 'none' selection information from the source
+    dataspace to the destination dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_copy(H5S_t *dst, const H5S_t H5_ATTR_UNUSED *src, hbool_t H5_ATTR_UNUSED share_selection)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(src);
+    HDassert(dst);
+
+    /* Set number of elements in selection */
+    dst->select.num_elem = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_none_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_is_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_none_is_valid(space);
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.  Offset is irrelevant for this type of selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_none_is_valid(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+} /* end H5S_none_is_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_serial_size
+ PURPOSE
+    Determine the number of bytes needed to store the serialized "none"
+        selection information.
+ USAGE
+    hssize_t H5S_none_serial_size(space)
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    The number of bytes required on success, negative on an error.
+ DESCRIPTION
+    Determines the number of bytes required to serialize an "none"
+    selection for storage on disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hssize_t
+H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Basic number of bytes required to serialize point selection:
+     *  <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+     *      <length (4 bytes)> = 16 bytes
+     */
+    FUNC_LEAVE_NOAPI(16)
+} /* end H5S_none_serial_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_serialize
+ PURPOSE
+    Serialize the current selection into a user-provided buffer.
+ USAGE
+    herr_t H5S_none_serialize(space, buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to serialize
+        uint8 *buf;             OUT: Buffer to put serialized selection into
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Serializes the current element selection into a buffer.  (Primarily for
+    storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_serialize(const H5S_t *space, uint8_t *buf)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Store the preamble information */
+    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the additional information length */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_none_serialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_deserialize
+ PURPOSE
+    Deserialize the current selection from a user-provided buffer.
+ USAGE
+    herr_t H5S_none_deserialize(space, buf)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
+        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Deserializes the current selection into a buffer.  (Primarily for retrieving
+    from disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_deserialize(H5S_t *space, const uint8_t H5_ATTR_UNUSED *buf)
+{
+    herr_t ret_value = SUCCEED;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+
+    /* Change to "none" selection */
+    if(H5S_select_none(space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_none_deserialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_none_bounds(space, start, end)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t *start;         OUT: Starting coordinate of bounding box
+        hsize_t *end;           OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).  Calling this function on a "none" selection
+    returns fail.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_bounds(const H5S_t H5_ATTR_UNUSED *space, hsize_t H5_ATTR_UNUSED *start, hsize_t H5_ATTR_UNUSED *end)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5Sget_none_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_offset
+ PURPOSE
+    Gets the linear offset of the first element for the selection.
+ USAGE
+    herr_t H5S_none_offset(space, offset)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+        hsize_t *offset;        OUT: Linear offset of first element in selection
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the linear offset (in "units" of elements) of the first element
+    selected within the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Calling this function on a "none" selection returns fail.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_offset(const H5S_t H5_ATTR_UNUSED *space, hsize_t H5_ATTR_UNUSED *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(offset);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_is_contiguous
+ PURPOSE
+    Check if a "none" selection is contiguous within the dataspace extent.
+ USAGE
+    htri_t H5S_none_is_contiguous(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is contiguous.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_none_is_contiguous(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(FALSE)
+}   /* H5S_none_is_contiguous() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_is_single
+ PURPOSE
+    Check if a "none" selection is a single block within the dataspace extent.
+ USAGE
+    htri_t H5S_none_is_single(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is a single block.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_none_is_single(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(FALSE)
+}   /* H5S_none_is_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_is_regular
+ PURPOSE
+    Check if a "none" selection is "regular"
+ USAGE
+    htri_t H5S_none_is_regular(space)
+        const H5S_t *space;     IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in a dataspace is the a regular
+    pattern.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_none_is_regular(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI(TRUE)
+}   /* H5S_none_is_regular() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_adjust_u
+ PURPOSE
+    Adjust an "none" selection by subtracting an offset
+ USAGE
+    herr_t H5S_none_adjust_u(space, offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hsize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_adjust_u(H5S_t H5_ATTR_UNUSED *space, const hsize_t H5_ATTR_UNUSED *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(offset);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_adjust_u() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_project_scalar
+ *
+ * Purpose:	Projects a 'none' selection into a scalar dataspace
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_none_project_scalar(const H5S_t H5_ATTR_UNUSED *space, hsize_t H5_ATTR_UNUSED *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space && H5S_SEL_NONE == H5S_GET_SELECT_TYPE(space));
+    HDassert(offset);
+
+    FUNC_LEAVE_NOAPI(FAIL)
+}   /* H5S_none_project_scalar() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_none_project_simple
+ *
+ * Purpose:	Projects an 'none' selection onto/into a simple dataspace
+ *              of a different rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_none_project_simple(const H5S_t *base_space, H5S_t *new_space, hsize_t *offset)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_NONE == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(offset);
+
+    /* Select the entire new space */
+    if(H5S_select_none(new_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to set none selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_none_project_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_none
+ PURPOSE
+    Specify that nothing is selected in the extent
+ USAGE
+    herr_t H5S_select_none(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function de-selects the entire extent for a dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_none(H5S_t *space)
+{
+    herr_t ret_value = SUCCEED;  /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+
+    /* Remove current selection first */
+    if(H5S_SELECT_RELEASE(space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release hyperslab")
+
+    /* Set number of elements in selection */
+    space->select.num_elem = 0;
+
+    /* Set selection type */
+    space->select.type = H5S_sel_none;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_none() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_none
+ PURPOSE
+    Specify that nothing is selected in the extent
+ USAGE
+    herr_t H5Sselect_none(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function de-selects the entire extent for a dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_none(hid_t spaceid)
+{
+    H5S_t *space;                       /* Dataspace to modify selection of */
+    herr_t ret_value = SUCCEED;         /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+    /* Change to "none" selection */
+    if(H5S_select_none(space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sselect_none() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_none_get_seq_list
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_none_get_seq_list(space,flags,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        unsigned flags;         IN: Flags for extra information about operation
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_none_get_seq_list(const H5S_t H5_ATTR_UNUSED *space, unsigned H5_ATTR_UNUSED flags, H5S_sel_iter_t H5_ATTR_UNUSED *iter,
+    size_t H5_ATTR_UNUSED maxseq, size_t H5_ATTR_UNUSED maxelem, size_t *nseq, size_t *nelem,
+    hsize_t H5_ATTR_UNUSED *off, size_t H5_ATTR_UNUSED *len)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* "none" selections don't generate sequences of bytes */
+    *nseq = 0;
+
+    /* They don't use any elements, either */
+    *nelem = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5S_none_get_seq_list() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Spkg.h b/gatb-core/thirdparty/hdf5/src/H5Spkg.h
new file mode 100644
index 0000000..0a9df69
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Spkg.h
@@ -0,0 +1,260 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *		Thursday, September 28, 2000
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5S package.  Source files outside the H5S package should
+ *		include H5Sprivate.h instead.
+ */
+#ifndef H5S_PACKAGE
+#error "Do not include this file outside the H5S package!"
+#endif
+
+#ifndef _H5Spkg_H
+#define _H5Spkg_H
+
+#include "H5Sprivate.h"
+
+/* Flags to indicate special dataspace features are active */
+#define H5S_VALID_MAX	0x01
+#define H5S_VALID_PERM	0x02
+
+
+/* Initial version of the dataspace information */
+#define H5O_SDSPACE_VERSION_1	1
+
+/* This version adds support for "null" dataspaces, encodes the type of the
+ *      dataspace in the message and eliminated the rest of the "reserved"
+ *      bytes.
+ */
+#define H5O_SDSPACE_VERSION_2	2
+
+/* The latest version of the format.  Look through the 'encode'
+ *      and 'size' callbacks for places to change when updating this. */
+#define H5O_SDSPACE_VERSION_LATEST H5O_SDSPACE_VERSION_2
+
+
+/*
+ * Dataspace extent information
+ */
+/* Extent container */
+struct H5S_extent_t {
+    H5O_shared_t sh_loc;        /* Shared message info (must be first) */
+
+    H5S_class_t	type;           /* Type of extent */
+    unsigned version;           /* Version of object header message to encode this object with */
+    hsize_t nelem;              /* Number of elements in extent */
+
+    unsigned rank;              /* Number of dimensions */
+    hsize_t *size;              /* Current size of the dimensions */
+    hsize_t *max;               /* Maximum size of the dimensions */
+};
+
+/*
+ * Dataspace selection information
+ */
+/* Node in point selection list (typedef'd in H5Sprivate.h) */
+struct H5S_pnt_node_t {
+    hsize_t *pnt;          /* Pointer to a selected point */
+    struct H5S_pnt_node_t *next;  /* pointer to next point in list */
+};
+
+/* Information about point selection list */
+typedef struct {
+    H5S_pnt_node_t *head;   /* Pointer to head of point list */
+} H5S_pnt_list_t;
+
+/* Information about new-style hyperslab spans */
+
+/* Information a particular hyperslab span */
+struct H5S_hyper_span_t {
+    hsize_t low, high;          /* Low & high bounds of span */
+    hsize_t nelem;              /* Number of elements in span (only needed during I/O) */
+    hsize_t pstride;            /* Pseudo-stride from start of previous span (only used during I/O) */
+    struct H5S_hyper_span_info_t *down;     /* Pointer to list of spans in next dimension down */
+    struct H5S_hyper_span_t *next;     /* Pointer to next span in list */
+};
+
+/* Information about a list of hyperslab spans */
+struct H5S_hyper_span_info_t {
+    unsigned count;                    /* Ref. count of number of spans which share this span */
+    struct H5S_hyper_span_info_t *scratch;  /* Scratch pointer
+                                             * (used during copies, as mark
+                                             * during precomputes for I/O &
+                                             * to point to the last span in a
+                                             * list during single element adds)
+                                             */
+    struct H5S_hyper_span_t *head;  /* Pointer to list of spans in next dimension down */
+};
+
+/* Information about new-style hyperslab selection */
+typedef struct {
+    hbool_t diminfo_valid;                      /* Whether the dataset has valid diminfo */
+    H5S_hyper_dim_t opt_diminfo[H5S_MAX_RANK];  /* per-dim selection info */
+    H5S_hyper_dim_t app_diminfo[H5S_MAX_RANK];  /* per-dim selection info */
+	/* 'opt_diminfo' points to a [potentially] optimized version of the user's
+         * hyperslab information.  'app_diminfo' points to the actual parameters
+         * that the application used for setting the hyperslab selection.  These
+         * are only used for re-gurgitating the original values used to set the
+         * hyperslab to the application when it queries the hyperslab selection
+         * information. */
+    H5S_hyper_span_info_t *span_lst; /* List of hyperslab span information */
+} H5S_hyper_sel_t;
+
+/* Selection information methods */
+/* Method to copy a selection */
+typedef herr_t (*H5S_sel_copy_func_t)(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+/* Method to retrieve a list of offset/length sequences for selection */
+typedef herr_t (*H5S_sel_get_seq_list_func_t)(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+/* Method to release current selection */
+typedef herr_t (*H5S_sel_release_func_t)(H5S_t *space);
+/* Method to determine if current selection is valid for dataspace */
+typedef htri_t (*H5S_sel_is_valid_func_t)(const H5S_t *space);
+/* Method to determine number of bytes required to store current selection */
+typedef hssize_t (*H5S_sel_serial_size_func_t)(const H5S_t *space);
+/* Method to store current selection in "serialized" form (a byte sequence suitable for storing on disk) */
+typedef herr_t (*H5S_sel_serialize_func_t)(const H5S_t *space, uint8_t *buf);
+/* Method to store create selection from "serialized" form (a byte sequence suitable for storing on disk) */
+typedef herr_t (*H5S_sel_deserialize_func_t)(H5S_t *space, const uint8_t *buf);
+/* Method to determine smallest n-D bounding box containing the current selection */
+typedef herr_t (*H5S_sel_bounds_func_t)(const H5S_t *space, hsize_t *start, hsize_t *end);
+/* Method to determine linear offset of initial element in selection within dataspace */
+typedef herr_t (*H5S_sel_offset_func_t)(const H5S_t *space, hsize_t *offset);
+/* Method to determine if current selection is contiguous */
+typedef htri_t (*H5S_sel_is_contiguous_func_t)(const H5S_t *space);
+/* Method to determine if current selection is a single block */
+typedef htri_t (*H5S_sel_is_single_func_t)(const H5S_t *space);
+/* Method to determine if current selection is "regular" */
+typedef htri_t (*H5S_sel_is_regular_func_t)(const H5S_t *space);
+/* Method to adjust a selection by an offset */
+typedef herr_t (*H5S_sel_adjust_u_func_t)(H5S_t *space, const hsize_t *offset);
+/* Method to construct single element projection onto scalar dataspace */
+typedef herr_t (*H5S_sel_project_scalar)(const H5S_t *space, hsize_t *offset);
+/* Method to construct selection projection onto/into simple dataspace */
+typedef herr_t (*H5S_sel_project_simple)(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+/* Method to initialize iterator for current selection */
+typedef herr_t (*H5S_sel_iter_init_func_t)(H5S_sel_iter_t *sel_iter, const H5S_t *space);
+
+/* Selection class information */
+typedef struct {
+    H5S_sel_type type;                          /* Type of selection (all, none, points or hyperslab) */
+
+    /* Methods */
+    H5S_sel_copy_func_t copy;                   /* Method to make a copy of a selection */
+    H5S_sel_get_seq_list_func_t get_seq_list;   /* Method to retrieve a list of offset/length sequences for selection */
+    H5S_sel_release_func_t release;             /* Method to release current selection */
+    H5S_sel_is_valid_func_t is_valid;           /* Method to determine if current selection is valid for dataspace */
+    H5S_sel_serial_size_func_t serial_size;     /* Method to determine number of bytes required to store current selection */
+    H5S_sel_serialize_func_t serialize;         /* Method to store current selection in "serialized" form (a byte sequence suitable for storing on disk) */
+    H5S_sel_deserialize_func_t deserialize;     /* Method to store create selection from "serialized" form (a byte sequence suitable for storing on disk) */
+    H5S_sel_bounds_func_t bounds;               /* Method to determine to smallest n-D bounding box containing the current selection */
+    H5S_sel_offset_func_t offset;               /* Method to determine linear offset of initial element in selection within dataspace */
+    H5S_sel_is_contiguous_func_t is_contiguous; /* Method to determine if current selection is contiguous */
+    H5S_sel_is_single_func_t is_single;         /* Method to determine if current selection is a single block */
+    H5S_sel_is_regular_func_t is_regular;       /* Method to determine if current selection is "regular" */
+    H5S_sel_adjust_u_func_t adjust_u;           /* Method to adjust a selection by an offset */
+    H5S_sel_project_scalar project_scalar;      /* Method to construct scalar dataspace projection */
+    H5S_sel_project_simple project_simple;      /* Method to construct simple dataspace projection */
+    H5S_sel_iter_init_func_t iter_init;         /* Method to initialize iterator for current selection */
+} H5S_select_class_t;
+
+/* Selection information object */
+typedef struct {
+    const H5S_select_class_t *type;     /* Pointer to selection's class info */
+    hbool_t offset_changed;             /* Indicate that the offset for the selection has been changed */
+    hssize_t offset[H5S_MAX_RANK];      /* Offset within the extent */
+    hsize_t num_elem;   /* Number of elements in selection */
+    union {
+        H5S_pnt_list_t *pnt_lst; /* List of selected points (order is important) */
+        H5S_hyper_sel_t *hslab;  /* Info about hyperslab selections */
+    } sel_info;
+} H5S_select_t;
+
+/* Main dataspace structure (typedef'd in H5Sprivate.h) */
+struct H5S_t {
+    H5S_extent_t extent;                /* Dataspace extent (must stay first) */
+    H5S_select_t select;		/* Dataspace selection */
+};
+
+/* Selection iteration methods */
+/* Method to retrieve the current coordinates of iterator for current selection */
+typedef herr_t (*H5S_sel_iter_coords_func_t)(const H5S_sel_iter_t *iter, hsize_t *coords);
+/* Method to retrieve the current block of iterator for current selection */
+typedef herr_t (*H5S_sel_iter_block_func_t)(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+/* Method to determine number of elements left in iterator for current selection */
+typedef hsize_t (*H5S_sel_iter_nelmts_func_t)(const H5S_sel_iter_t *iter);
+/* Method to determine if there are more blocks left in the current selection */
+typedef htri_t (*H5S_sel_iter_has_next_block_func_t)(const H5S_sel_iter_t *iter);
+/* Method to move selection iterator to the next element in the selection */
+typedef herr_t (*H5S_sel_iter_next_func_t)(H5S_sel_iter_t *iter, size_t nelem);
+/* Method to move selection iterator to the next block in the selection */
+typedef herr_t (*H5S_sel_iter_next_block_func_t)(H5S_sel_iter_t *iter);
+/* Method to release iterator for current selection */
+typedef herr_t (*H5S_sel_iter_release_func_t)(H5S_sel_iter_t *iter);
+
+/* Selection iteration class */
+typedef struct H5S_sel_iter_class_t {
+    H5S_sel_type type;                          /* Type of selection (all, none, points or hyperslab) */
+
+    /* Methods on selections */
+    H5S_sel_iter_coords_func_t iter_coords;     /* Method to retrieve the current coordinates of iterator for current selection */
+    H5S_sel_iter_block_func_t iter_block;       /* Method to retrieve the current block of iterator for current selection */
+    H5S_sel_iter_nelmts_func_t iter_nelmts;     /* Method to determine number of elements left in iterator for current selection */
+    H5S_sel_iter_has_next_block_func_t iter_has_next_block;         /* Method to query if there is another block left in the selection */
+    H5S_sel_iter_next_func_t iter_next;         /* Method to move selection iterator to the next element in the selection */
+    H5S_sel_iter_next_block_func_t iter_next_block;     /* Method to move selection iterator to the next block in the selection */
+    H5S_sel_iter_release_func_t iter_release;   /* Method to release iterator for current selection */
+} H5S_sel_iter_class_t;
+
+/*
+ * All selection class methods.
+ */
+H5_DLLVAR const H5S_select_class_t H5S_sel_all[1];
+
+/*
+ * Hyperslab selection class methods.
+ */
+H5_DLLVAR const H5S_select_class_t H5S_sel_hyper[1];
+
+/*
+ * None selection class methods.
+ */
+H5_DLLVAR const H5S_select_class_t H5S_sel_none[1];
+
+/*
+ * Pointer selection class methods.
+ */
+H5_DLLVAR const H5S_select_class_t H5S_sel_point[1];
+
+/* Extent functions */
+H5_DLL herr_t H5S_extent_release(H5S_extent_t *extent);
+H5_DLL herr_t H5S_extent_copy(H5S_extent_t *dst, const H5S_extent_t *src,
+    hbool_t copy_max);
+
+/* Operations on selections */
+
+/* Testing functions */
+#ifdef H5S_TESTING
+H5_DLL htri_t H5S_select_shape_same_test(hid_t sid1, hid_t sid2);
+H5_DLL htri_t H5S_get_rebuild_status_test(hid_t space_id);
+#endif /* H5S_TESTING */
+
+#endif /*_H5Spkg_H*/
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Spoint.c b/gatb-core/thirdparty/hdf5/src/H5Spoint.c
new file mode 100644
index 0000000..de7a316
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Spoint.c
@@ -0,0 +1,1717 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Tuesday, June 16, 1998
+ *
+ * Purpose:	Point selection data space I/O functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			  */
+#include "H5Eprivate.h"		/* Error handling		  */
+#include "H5FLprivate.h"	/* Free Lists	  */
+#include "H5Iprivate.h"		/* ID Functions		  */
+#include "H5MMprivate.h"	/* Memory Management functions		  */
+#include "H5Spkg.h"		/* Dataspace functions			  */
+#include "H5VMprivate.h"         /* Vector functions */
+
+/* Static function prototypes */
+
+/* Selection callbacks */
+static herr_t H5S_point_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+static herr_t H5S_point_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+static herr_t H5S_point_release(H5S_t *space);
+static htri_t H5S_point_is_valid(const H5S_t *space);
+static hssize_t H5S_point_serial_size(const H5S_t *space);
+static herr_t H5S_point_serialize(const H5S_t *space, uint8_t *buf);
+static herr_t H5S_point_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_point_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
+static herr_t H5S_point_offset(const H5S_t *space, hsize_t *off);
+static htri_t H5S_point_is_contiguous(const H5S_t *space);
+static htri_t H5S_point_is_single(const H5S_t *space);
+static htri_t H5S_point_is_regular(const H5S_t *space);
+static herr_t H5S_point_adjust_u(H5S_t *space, const hsize_t *offset);
+static herr_t H5S_point_project_scalar(const H5S_t *space, hsize_t *offset);
+static herr_t H5S_point_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+static herr_t H5S_point_iter_init(H5S_sel_iter_t *iter, const H5S_t *space);
+
+/* Selection iteration callbacks */
+static herr_t H5S_point_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
+static herr_t H5S_point_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static hsize_t H5S_point_iter_nelmts(const H5S_sel_iter_t *iter);
+static htri_t H5S_point_iter_has_next_block(const H5S_sel_iter_t *iter);
+static herr_t H5S_point_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
+static herr_t H5S_point_iter_next_block(H5S_sel_iter_t *sel_iter);
+static herr_t H5S_point_iter_release(H5S_sel_iter_t *sel_iter);
+
+/* Selection properties for point selections */
+const H5S_select_class_t H5S_sel_point[1] = {{
+    H5S_SEL_POINTS,
+
+    /* Methods on selection */
+    H5S_point_copy,
+    H5S_point_get_seq_list,
+    H5S_point_release,
+    H5S_point_is_valid,
+    H5S_point_serial_size,
+    H5S_point_serialize,
+    H5S_point_deserialize,
+    H5S_point_bounds,
+    H5S_point_offset,
+    H5S_point_is_contiguous,
+    H5S_point_is_single,
+    H5S_point_is_regular,
+    H5S_point_adjust_u,
+    H5S_point_project_scalar,
+    H5S_point_project_simple,
+    H5S_point_iter_init,
+}};
+
+/* Iteration properties for point selections */
+static const H5S_sel_iter_class_t H5S_sel_iter_point[1] = {{
+    H5S_SEL_POINTS,
+
+    /* Methods on selection iterator */
+    H5S_point_iter_coords,
+    H5S_point_iter_block,
+    H5S_point_iter_nelmts,
+    H5S_point_iter_has_next_block,
+    H5S_point_iter_next,
+    H5S_point_iter_next_block,
+    H5S_point_iter_release,
+}};
+
+/* Declare a free list to manage the H5S_pnt_node_t struct */
+H5FL_DEFINE_STATIC(H5S_pnt_node_t);
+
+/* Declare a free list to manage the H5S_pnt_list_t struct */
+H5FL_DEFINE_STATIC(H5S_pnt_list_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_iter_init
+ *
+ * Purpose:	Initializes iteration information for point selection.
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_point_iter_init(H5S_sel_iter_t *iter, const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space && H5S_SEL_POINTS==H5S_GET_SELECT_TYPE(space));
+    HDassert(iter);
+
+    /* Initialize the number of points to iterate over */
+    iter->elmt_left=space->select.num_elem;
+
+    /* Start at the head of the list of points */
+    iter->u.pnt.curr=space->select.sel_info.pnt_lst->head;
+
+    /* Initialize type of selection iterator */
+    iter->type=H5S_sel_iter_point;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_iter_coords
+ *
+ * Purpose:	Retrieve the current coordinates of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_point_iter_coords (const H5S_sel_iter_t *iter, hsize_t *coords)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(coords);
+
+    /* Copy the offset of the current point */
+    HDmemcpy(coords,iter->u.pnt.curr->pnt,sizeof(hsize_t)*iter->rank);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_coords() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_iter_block
+ *
+ * Purpose:	Retrieve the current block of iterator for current
+ *              selection
+ *
+ * Return:	non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, June 2, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_point_iter_block (const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(start);
+    HDassert(end);
+
+    /* Copy the current point as a block */
+    HDmemcpy(start,iter->u.pnt.curr->pnt,sizeof(hsize_t)*iter->rank);
+    HDmemcpy(end,iter->u.pnt.curr->pnt,sizeof(hsize_t)*iter->rank);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_block() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_iter_nelmts
+ *
+ * Purpose:	Return number of elements left to process in iterator
+ *
+ * Return:	non-negative number of elements on success, zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t
+H5S_point_iter_nelmts (const H5S_sel_iter_t *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(iter->elmt_left)
+}   /* H5S_point_iter_nelmts() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_iter_has_next_block
+ PURPOSE
+    Check if there is another block left in the current iterator
+ USAGE
+    htri_t H5S_point_iter_has_next_block(iter)
+        const H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative (TRUE/FALSE) on success/Negative on failure
+ DESCRIPTION
+    Check if there is another block available in the selection iterator.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_point_iter_has_next_block(const H5S_sel_iter_t *iter)
+{
+    htri_t ret_value=TRUE;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    /* Check if there is another point in the list */
+    if(iter->u.pnt.curr->next==NULL)
+        HGOTO_DONE(FALSE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_iter_has_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_iter_next
+ PURPOSE
+    Increment selection iterator
+ USAGE
+    herr_t H5S_point_iter_next(iter, nelem)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+        size_t nelem;               IN: Number of elements to advance by
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the NELEM'th next element in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_iter_next(H5S_sel_iter_t *iter, size_t nelem)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(nelem>0);
+
+    /* Increment the iterator */
+    while(nelem>0) {
+        iter->u.pnt.curr=iter->u.pnt.curr->next;
+        nelem--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_next() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_iter_next_block
+ PURPOSE
+    Increment selection iterator to next block
+ USAGE
+    herr_t H5S_point_iter_next_block(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Advance selection iterator to the next block in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_iter_next_block(H5S_sel_iter_t *iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    /* Increment the iterator */
+    iter->u.pnt.curr=iter->u.pnt.curr->next;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_next_block() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_iter_release
+ PURPOSE
+    Release point selection iterator information for a dataspace
+ USAGE
+    herr_t H5S_point_iter_release(iter)
+        H5S_sel_iter_t *iter;       IN: Pointer to selection iterator
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all information for a dataspace point selection iterator
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_iter_release (H5S_sel_iter_t H5_ATTR_UNUSED * iter)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_iter_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_add
+ PURPOSE
+    Add a series of elements to a point selection
+ USAGE
+    herr_t H5S_point_add(space, num_elem, coord)
+        H5S_t *space;           IN: Dataspace of selection to modify
+        size_t num_elem;        IN: Number of elements in COORD array.
+        const hsize_t *coord[];    IN: The location of each element selected
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function adds elements to the current point selection for a dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_add(H5S_t *space, H5S_seloper_t op, size_t num_elem, const hsize_t *coord)
+{
+    H5S_pnt_node_t *top = NULL, *curr = NULL, *new_node = NULL; /* Point selection nodes */
+    unsigned u;                         /* Counter */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(num_elem > 0);
+    HDassert(coord);
+    HDassert(op == H5S_SELECT_SET || op == H5S_SELECT_APPEND || op == H5S_SELECT_PREPEND);
+
+    for(u = 0; u < num_elem; u++) {
+        /* Allocate space for the new node */
+        if(NULL == (new_node = H5FL_MALLOC(H5S_pnt_node_t)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point node")
+
+        /* Initialize fields in node */
+        new_node->next = NULL;
+        if(NULL == (new_node->pnt = (hsize_t *)H5MM_malloc(space->extent.rank * sizeof(hsize_t))))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate coordinate information")
+
+        /* Copy over the coordinates */
+        HDmemcpy(new_node->pnt, coord + (u * space->extent.rank), (space->extent.rank * sizeof(hsize_t)));
+
+        /* Link into list */
+        if(top == NULL)
+            top = new_node;
+        else
+            curr->next = new_node;
+        curr = new_node;
+    } /* end for */
+    new_node = NULL;
+
+    /* Insert the list of points selected in the proper place */
+    if(op == H5S_SELECT_SET || op == H5S_SELECT_PREPEND) {
+        /* Append current list, if there is one */
+        if(space->select.sel_info.pnt_lst->head != NULL)
+            curr->next = space->select.sel_info.pnt_lst->head;
+
+        /* Put new list in point selection */
+        space->select.sel_info.pnt_lst->head = top;
+    } /* end if */
+    else {  /* op==H5S_SELECT_APPEND */
+        H5S_pnt_node_t *tmp_node;       /* Temporary point selection node */
+
+        tmp_node = space->select.sel_info.pnt_lst->head;
+        if(tmp_node != NULL) {
+            while(tmp_node->next != NULL)
+                tmp_node = tmp_node->next;
+
+            /* Append new list to point selection */
+            tmp_node->next = top;
+        } /* end if */
+        else
+            space->select.sel_info.pnt_lst->head = top;
+    } /* end else */
+
+    /* Set the number of elements in the new selection */
+    if(op == H5S_SELECT_SET)
+        space->select.num_elem = num_elem;
+    else
+        space->select.num_elem += num_elem;
+
+done:
+    if(ret_value < 0) {
+        /* Release possibly partially initialized new node */
+        if(new_node)
+            new_node = H5FL_FREE(H5S_pnt_node_t, new_node);
+
+        /* Release possible linked list of nodes */
+        while(top) {
+            curr = top->next; 
+            H5MM_xfree(top->pnt);
+            top = H5FL_FREE(H5S_pnt_node_t, top);
+            top = curr;
+        } /* end while */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_add() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_release
+ PURPOSE
+    Release point selection information for a dataspace
+ USAGE
+    herr_t H5S_point_release(space)
+        H5S_t *space;       IN: Pointer to dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Releases all point selection information for a dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_release (H5S_t *space)
+{
+    H5S_pnt_node_t *curr, *next;        /* Point selection nodes */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    /* Delete all the nodes from the list */
+    curr = space->select.sel_info.pnt_lst->head;
+    while(curr != NULL) {
+        next = curr->next;
+        H5MM_xfree(curr->pnt);
+        curr = H5FL_FREE(H5S_pnt_node_t, curr);
+        curr = next;
+    } /* end while */
+
+    /* Free & reset the point list header */
+    space->select.sel_info.pnt_lst = H5FL_FREE(H5S_pnt_list_t, space->select.sel_info.pnt_lst);
+
+    /* Reset the number of elements in the selection */
+    space->select.num_elem = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_elements
+ PURPOSE
+    Specify a series of elements in the dataspace to select
+ USAGE
+    herr_t H5S_select_elements(dsid, op, num_elem, coord)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+        H5S_seloper_t op;       IN: Operation to perform on current selection
+        size_t num_elem;        IN: Number of elements in COORD array.
+        const hsize_t *coord;   IN: The location of each element selected
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function selects array elements to be included in the selection for
+    the dataspace.  The COORD array is a 2-D array of size <dataspace rank>
+    by NUM_ELEM (ie. a list of coordinates in the dataspace).  The order of
+    the element coordinates in the COORD array specifies the order that the
+    array elements are iterated through when I/O is performed.  Duplicate
+    coordinates are not checked for.  The selection operator, OP, determines
+    how the new selection is to be combined with the existing selection for
+    the dataspace.  Currently, only H5S_SELECT_SET is supported, which replaces
+    the existing selection with the one defined in this call.  When operators
+    other than H5S_SELECT_SET are used to combine a new selection with an
+    existing selection, the selection ordering is reset to 'C' array ordering.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_elements(H5S_t *space, H5S_seloper_t op, size_t num_elem,
+    const hsize_t *coord)
+{
+    herr_t ret_value = SUCCEED;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(num_elem);
+    HDassert(coord);
+    HDassert(op == H5S_SELECT_SET || op == H5S_SELECT_APPEND || op == H5S_SELECT_PREPEND);
+
+    /* If we are setting a new selection, remove current selection first */
+    if(op == H5S_SELECT_SET || H5S_GET_SELECT_TYPE(space) != H5S_SEL_POINTS)
+        if(H5S_SELECT_RELEASE(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release point selection")
+
+    /* Allocate space for the point selection information if necessary */
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_POINTS || space->select.sel_info.pnt_lst == NULL)
+        if(NULL == (space->select.sel_info.pnt_lst = H5FL_CALLOC(H5S_pnt_list_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate element information")
+
+    /* Add points to selection */
+    if(H5S_point_add(space, op, num_elem, coord) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't insert elements")
+
+    /* Set selection type */
+    space->select.type = H5S_sel_point;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_elements() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_copy
+ PURPOSE
+    Copy a selection from one dataspace to another
+ USAGE
+    herr_t H5S_point_copy(dst, src)
+        H5S_t *dst;  OUT: Pointer to the destination dataspace
+        H5S_t *src;  IN: Pointer to the source dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Copies all the point selection information from the source
+    dataspace to the destination dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_copy(H5S_t *dst, const H5S_t *src, hbool_t H5_ATTR_UNUSED share_selection)
+{
+    H5S_pnt_node_t *curr, *new_node, *new_tail;    /* Point information nodes */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(src);
+    HDassert(dst);
+
+    /* Allocate room for the head of the point list */
+    if(NULL == (dst->select.sel_info.pnt_lst = H5FL_MALLOC(H5S_pnt_list_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point list node")
+
+    curr = src->select.sel_info.pnt_lst->head;
+    new_tail = NULL;
+    while(curr) {
+        /* Create new point */
+        if(NULL == (new_node = H5FL_MALLOC(H5S_pnt_node_t)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point node")
+        new_node->next = NULL;
+        if(NULL == (new_node->pnt = (hsize_t *)H5MM_malloc(src->extent.rank * sizeof(hsize_t)))) {
+            new_node = H5FL_FREE(H5S_pnt_node_t, new_node);
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate coordinate information")
+        } /* end if */
+
+        /* Copy over the point's coordinates */
+        HDmemcpy(new_node->pnt, curr->pnt, (src->extent.rank * sizeof(hsize_t)));
+
+        /* Keep the order the same when copying */
+        if(NULL == new_tail)
+            new_tail = dst->select.sel_info.pnt_lst->head = new_node;
+        else {
+            new_tail->next = new_node;
+            new_tail = new_node;
+        } /* end else */
+
+        curr = curr->next;
+    } /* end while */
+
+done:
+    if(ret_value < 0 && dst->select.sel_info.pnt_lst) {
+        /* Traverse the (incomplete?) dst list, freeing all memory */
+        curr = dst->select.sel_info.pnt_lst->head;
+        while(curr) {
+            H5S_pnt_node_t *tmp_node = curr;
+
+            curr->pnt = (hsize_t *)H5MM_xfree(curr->pnt);
+            curr = curr->next;
+            tmp_node = H5FL_FREE(H5S_pnt_node_t, tmp_node);
+        } /* end while */
+
+        dst->select.sel_info.pnt_lst = H5FL_FREE(H5S_pnt_list_t, dst->select.sel_info.pnt_lst);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_point_copy() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_is_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_point_is_valid(space);
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_point_is_valid (const H5S_t *space)
+{
+    H5S_pnt_node_t *curr;      /* Point information nodes */
+    unsigned u;                   /* Counter */
+    htri_t ret_value=TRUE;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Check each point to determine whether selection+offset is within extent */
+    curr = space->select.sel_info.pnt_lst->head;
+    while(curr != NULL) {
+        /* Check each dimension */
+        for(u = 0; u < space->extent.rank; u++) {
+            /* Check if an offset has been defined */
+            /* Bounds check the selected point + offset against the extent */
+            if(((curr->pnt[u] + (hsize_t)space->select.offset[u]) > space->extent.size[u])
+                    || (((hssize_t)curr->pnt[u] + space->select.offset[u]) < 0))
+                HGOTO_DONE(FALSE)
+        } /* end for */
+
+        curr = curr->next;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_point_is_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_elem_npoints
+ PURPOSE
+    Get the number of points in current element selection
+ USAGE
+    hssize_t H5Sget_select_elem_npoints(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+ RETURNS
+    The number of element points in selection on success, negative on failure
+ DESCRIPTION
+    Returns the number of element points in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hssize_t
+H5Sget_select_elem_npoints(hid_t spaceid)
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    hssize_t ret_value;         /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Hs", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_POINTS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an element selection")
+
+    ret_value = (hssize_t)H5S_GET_SELECT_NPOINTS(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_elem_npoints() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_serial_size
+ PURPOSE
+    Determine the number of bytes needed to store the serialized point selection
+    information.
+ USAGE
+    hssize_t H5S_point_serial_size(space)
+        H5S_t *space;             IN: Dataspace pointer to query
+ RETURNS
+    The number of bytes required on success, negative on an error.
+ DESCRIPTION
+    Determines the number of bytes required to serialize the current point
+    selection information for storage on disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hssize_t
+H5S_point_serial_size (const H5S_t *space)
+{
+    H5S_pnt_node_t *curr;       /* Point information nodes */
+    hssize_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Basic number of bytes required to serialize point selection:
+     *  <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+     *      <length (4 bytes)> + <rank (4 bytes)> + <# of points (4 bytes)> = 24 bytes
+     */
+    ret_value=24;
+
+    /* Count points in selection */
+    curr=space->select.sel_info.pnt_lst->head;
+    while(curr!=NULL) {
+        /* Add 4 bytes times the rank for each element selected */
+        ret_value+=4*space->extent.rank;
+        curr=curr->next;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_point_serial_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_serialize
+ PURPOSE
+    Serialize the current selection into a user-provided buffer.
+ USAGE
+    herr_t H5S_point_serialize(space, buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to serialize
+        uint8 *buf;             OUT: Buffer to put serialized selection into
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Serializes the current element selection into a buffer.  (Primarily for
+    storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_serialize (const H5S_t *space, uint8_t *buf)
+{
+    H5S_pnt_node_t *curr;   /* Point information nodes */
+    uint8_t *lenp;          /* pointer to length location for later storage */
+    uint32_t len=0;         /* number of bytes used */
+    unsigned u;                /* local counting variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Store the preamble information */
+    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
+    lenp=buf;           /* keep the pointer to the length location for later */
+    buf+=4;             /* skip over space for length */
+
+    /* Encode number of dimensions */
+    UINT32ENCODE(buf, (uint32_t)space->extent.rank);
+    len+=4;
+
+    /* Encode number of elements */
+    UINT32ENCODE(buf, (uint32_t)space->select.num_elem);
+    len+=4;
+
+    /* Encode each point in selection */
+    curr=space->select.sel_info.pnt_lst->head;
+    while(curr!=NULL) {
+        /* Add 4 bytes times the rank for each element selected */
+        len+=4*space->extent.rank;
+
+        /* Encode each point */
+        for(u=0; u<space->extent.rank; u++)
+            UINT32ENCODE(buf, (uint32_t)curr->pnt[u]);
+
+        curr=curr->next;
+    } /* end while */
+
+    /* Encode length */
+    UINT32ENCODE(lenp, (uint32_t)len);  /* Store the length of the extra information */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_serialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_deserialize
+ PURPOSE
+    Deserialize the current selection from a user-provided buffer.
+ USAGE
+    herr_t H5S_point_deserialize(space, buf)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
+        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Deserializes the current selection into a buffer.  (Primarily for retrieving
+    from disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_deserialize (H5S_t *space, const uint8_t *buf)
+{
+    H5S_seloper_t op=H5S_SELECT_SET;    /* Selection operation */
+    uint32_t rank;           /* Rank of points */
+    size_t num_elem=0;      /* Number of elements in selection */
+    hsize_t *coord=NULL, *tcoord;   /* Pointer to array of elements */
+    unsigned i, j;              /* local counting variables */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(buf);
+
+    /* Deserialize points to select */
+    buf += 16;    /* Skip over selection header */
+    UINT32DECODE(buf, rank);  /* decode the rank of the point selection */
+    if(rank != space->extent.rank)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "rank of pointer does not match dataspace")
+    UINT32DECODE(buf, num_elem);  /* decode the number of points */
+
+    /* Allocate space for the coordinates */
+    if(NULL == (coord = (hsize_t *)H5MM_malloc(num_elem * rank * sizeof(hsize_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate coordinate information")
+
+    /* Retrieve the coordinates from the buffer */
+    for(tcoord = coord, i = 0; i < num_elem; i++)
+        for(j = 0; j < (unsigned)rank; j++, tcoord++)
+            UINT32DECODE(buf, *tcoord);
+
+    /* Select points */
+    if(H5S_select_elements(space, op, num_elem, (const hsize_t *)coord) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+done:
+    /* Free the coordinate array if necessary */
+    if(coord != NULL)
+        H5MM_xfree(coord);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_deserialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_elem_pointlist
+ PURPOSE
+    Get the list of element points currently selected
+ USAGE
+    herr_t H5S_get_select_elem_pointlist(space, hsize_t *buf)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t startpoint;     IN: Element point to start with
+        hsize_t numpoints;      IN: Number of element points to get
+        hsize_t *buf;           OUT: List of element points selected
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+        Puts a list of the element points into the user's buffer.  The points
+    start with the 'startpoint'th block in the list of points and put
+    'numpoints' number of points into the user's buffer (or until the end of
+    the list of points, whichever happen first)
+        The point coordinates have the same dimensionality (rank) as the
+    dataspace they are located within.  The list of points is formatted as
+    follows: <coordinate> followed by the next coordinate, etc. until all the
+    point information in the selection have been put into the user's buffer.
+        The points are returned in the order they will be interated through
+    when a selection is read/written from/to disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_get_select_elem_pointlist(H5S_t *space, hsize_t startpoint, hsize_t numpoints, hsize_t *buf)
+{
+    H5S_pnt_node_t *node;       /* Point node */
+    unsigned rank;              /* Dataspace rank */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(buf);
+
+    /* Get the dataspace extent rank */
+    rank = space->extent.rank;
+
+    /* Get the head of the point list */
+    node = space->select.sel_info.pnt_lst->head;
+
+    /* Iterate to the first point to return */
+    while(node != NULL && startpoint > 0) {
+        startpoint--;
+        node = node->next;
+      } /* end while */
+
+    /* Iterate through the node, copying each point's information */
+    while(node != NULL && numpoints > 0) {
+        HDmemcpy(buf, node->pnt, sizeof(hsize_t) * rank);
+        buf += rank;
+        numpoints--;
+        node = node->next;
+      } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_get_select_elem_pointlist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_elem_pointlist
+ PURPOSE
+    Get the list of element points currently selected
+ USAGE
+    herr_t H5Sget_select_elem_pointlist(dsid, hsize_t *buf)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+        hsize_t startpoint;     IN: Element point to start with
+        hsize_t numpoints;      IN: Number of element points to get
+        hsize_t buf[];          OUT: List of element points selected
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+        Puts a list of the element points into the user's buffer.  The points
+    start with the 'startpoint'th block in the list of points and put
+    'numpoints' number of points into the user's buffer (or until the end of
+    the list of points, whichever happen first)
+        The point coordinates have the same dimensionality (rank) as the
+    dataspace they are located within.  The list of points is formatted as
+    follows: <coordinate> followed by the next coordinate, etc. until all the
+    point information in the selection have been put into the user's buffer.
+        The points are returned in the order they will be interated through
+    when a selection is read/written from/to disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sget_select_elem_pointlist(hid_t spaceid, hsize_t startpoint,
+    hsize_t numpoints, hsize_t buf[/*numpoints*/])
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    herr_t ret_value;           /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "ihh*[a2]h", spaceid, startpoint, numpoints, buf);
+
+    /* Check args */
+    if(NULL == buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_POINTS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a point selection")
+
+    ret_value = H5S_get_select_elem_pointlist(space, startpoint, numpoints, buf);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_elem_pointlist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_point_bounds(space, start, end)
+        H5S_t *space;           IN: Dataspace pointer of selection to query
+        hsize_t *start;         OUT: Starting coordinate of bounding box
+        hsize_t *end;           OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).
+        The bounding box calculations _does_ include the current offset of the
+    selection within the dataspace extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
+{
+    H5S_pnt_node_t *node;       /* Point node */
+    unsigned rank;              /* Dataspace rank */
+    unsigned u;                 /* index variable */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    /* Get the dataspace extent rank */
+    rank = space->extent.rank;
+
+    /* Set the start and end arrays up */
+    for(u = 0; u < rank; u++) {
+        start[u] = HSIZET_MAX;
+        end[u] = 0;
+    } /* end for */
+
+    /* Iterate through the node, checking the bounds on each element */
+    node = space->select.sel_info.pnt_lst->head;
+    while(node != NULL) {
+        for(u = 0; u < rank; u++) {
+            /* Check for offset moving selection negative */
+            if(((hssize_t)node->pnt[u] + space->select.offset[u]) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+            if(start[u] > (node->pnt[u] + space->select.offset[u]))
+                start[u] = node->pnt[u] + space->select.offset[u];
+            if(end[u] < (node->pnt[u] + space->select.offset[u]))
+                end[u] = node->pnt[u] + space->select.offset[u];
+        } /* end for */
+        node = node->next;
+      } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_offset
+ PURPOSE
+    Gets the linear offset of the first element for the selection.
+ USAGE
+    herr_t H5S_point_offset(space, offset)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+        hsize_t *offset;        OUT: Linear offset of first element in selection
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the linear offset (in "units" of elements) of the first element
+    selected within the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Calling this function on a "none" selection returns fail.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_offset(const H5S_t *space, hsize_t *offset)
+{
+    const hsize_t *pnt;         /* Pointer to a selected point's coordinates */
+    const hssize_t *sel_offset; /* Pointer to the selection's offset */
+    const hsize_t *dim_size;    /* Pointer to a dataspace's extent */
+    hsize_t accum;              /* Accumulator for dimension sizes */
+    int i;                      /* index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(space);
+    HDassert(offset);
+
+    /* Start at linear offset 0 */
+    *offset = 0;
+
+    /* Set up pointers to arrays of values */
+    pnt = space->select.sel_info.pnt_lst->head->pnt;
+    sel_offset = space->select.offset;
+    dim_size = space->extent.size;
+
+    /* Loop through coordinates, calculating the linear offset */
+    accum = 1;
+    for(i = (int)space->extent.rank - 1; i >= 0; i--) {
+        hssize_t pnt_offset = (hssize_t)pnt[i] + sel_offset[i]; /* Point's offset in this dimension */
+
+        /* Check for offset moving selection out of the dataspace */
+        if(pnt_offset < 0 || (hsize_t)pnt_offset >= dim_size[i])
+            HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
+
+        /* Add the point's offset in this dimension to the total linear offset */
+        *offset += (hsize_t)pnt_offset * accum;
+
+        /* Increase the accumulator */
+        accum *= dim_size[i];
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_is_contiguous
+ PURPOSE
+    Check if a point selection is contiguous within the dataspace extent.
+ USAGE
+    htri_t H5S_point_is_contiguous(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is contiguous.
+    This is primarily used for reading the entire selection in one swoop.
+    This code currently doesn't properly check for contiguousness when there is
+    more than one point, as that would take a lot of extra coding that we
+    don't need now.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_point_is_contiguous(const H5S_t *space)
+{
+    htri_t ret_value;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* One point is definitely contiguous */
+    if(space->select.num_elem==1)
+    	ret_value=TRUE;
+    else	/* More than one point might be contiguous, but it's complex to check and we don't need it right now */
+    	ret_value=FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_is_contiguous() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_is_single
+ PURPOSE
+    Check if a point selection is single within the dataspace extent.
+ USAGE
+    htri_t H5S_point_is_single(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspace is a single block.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_point_is_single(const H5S_t *space)
+{
+    htri_t ret_value;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* One point is definitely 'single' :-) */
+    if(space->select.num_elem==1)
+    	ret_value=TRUE;
+    else
+    	ret_value=FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_is_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_is_regular
+ PURPOSE
+    Check if a point selection is "regular"
+ USAGE
+    htri_t H5S_point_is_regular(space)
+        const H5S_t *space;     IN: Dataspace pointer to check
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in a dataspace is the a regular
+    pattern.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Doesn't check for points selected to be next to one another in a regular
+    pattern yet.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_point_is_regular(const H5S_t *space)
+{
+    htri_t ret_value;  /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    /* Only simple check for regular points for now... */
+    if(space->select.num_elem==1)
+    	ret_value=TRUE;
+    else
+    	ret_value=FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_is_regular() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_adjust_u
+ PURPOSE
+    Adjust a "point" selection by subtracting an offset
+ USAGE
+    herr_t H5S_point_adjust_u(space, offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hsize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves a point selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_adjust_u(H5S_t *space, const hsize_t *offset)
+{
+    H5S_pnt_node_t *node;               /* Point node */
+    unsigned rank;                      /* Dataspace rank */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(offset);
+
+    /* Iterate through the nodes, checking the bounds on each element */
+    node = space->select.sel_info.pnt_lst->head;
+    rank = space->extent.rank;
+    while(node) {
+        unsigned u;                         /* Local index variable */
+
+        /* Adjust each coordinate for point node */
+        for(u = 0; u < rank; u++) {
+            /* Check for offset moving selection negative */
+            HDassert(node->pnt[u] >= offset[u]);
+
+            /* Adjust node's coordinate location */
+            node->pnt[u] -= offset[u];
+        } /* end for */
+
+        /* Advance to next point node in selection */
+        node = node->next;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_point_adjust_u() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_project_scalar
+ *
+ * Purpose:	Projects a single element point selection into a scalar
+ *              dataspace
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_point_project_scalar(const H5S_t *space, hsize_t *offset)
+{
+    const H5S_pnt_node_t *node;         /* Point node */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space && H5S_SEL_POINTS == H5S_GET_SELECT_TYPE(space));
+    HDassert(offset);
+
+    /* Get the head of the point list */
+    node = space->select.sel_info.pnt_lst->head;
+
+    /* Check for more than one point selected */
+    if(node->next)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "point selection of one element has more than one node!")
+
+    /* Calculate offset of selection in projected buffer */
+    *offset = H5VM_array_offset(space->extent.rank, space->extent.size, node->pnt); 
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_project_scalar() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_point_project_simple
+ *
+ * Purpose:	Projects a point selection onto/into a simple dataspace
+ *              of a different rank
+ *
+ * Return:	non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *              Sunday, July 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5S_point_project_simple(const H5S_t *base_space, H5S_t *new_space, hsize_t *offset)
+{
+    const H5S_pnt_node_t *base_node;    /* Point node in base space */
+    H5S_pnt_node_t *new_node;           /* Point node in new space */
+    H5S_pnt_node_t *prev_node;          /* Previous point node in new space */
+    unsigned rank_diff;                 /* Difference in ranks between spaces */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(base_space && H5S_SEL_POINTS == H5S_GET_SELECT_TYPE(base_space));
+    HDassert(new_space);
+    HDassert(offset);
+
+    /* We are setting a new selection, remove any current selection in new dataspace */
+    if(H5S_SELECT_RELEASE(new_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* Allocate room for the head of the point list */
+    if(NULL == (new_space->select.sel_info.pnt_lst = H5FL_MALLOC(H5S_pnt_list_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point list node")
+
+    /* Check if the new space's rank is < or > base space's rank */
+    if(new_space->extent.rank < base_space->extent.rank) {
+        hsize_t block[H5S_MAX_RANK];     /* Block selected in base dataspace */
+
+        /* Compute the difference in ranks */
+        rank_diff = base_space->extent.rank - new_space->extent.rank;
+
+        /* Calculate offset of selection in projected buffer */
+        HDmemset(block, 0, sizeof(block));
+        HDmemcpy(block, base_space->select.sel_info.pnt_lst->head->pnt, sizeof(hsize_t) * rank_diff);
+        *offset = H5VM_array_offset(base_space->extent.rank, base_space->extent.size, block); 
+
+        /* Iterate through base space's point nodes, copying the point information */
+        base_node = base_space->select.sel_info.pnt_lst->head;
+        prev_node = NULL;
+        while(base_node) {
+            /* Create new point */
+            if(NULL == (new_node = H5FL_MALLOC(H5S_pnt_node_t)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point node")
+            new_node->next = NULL;
+            if(NULL == (new_node->pnt = (hsize_t *)H5MM_malloc(new_space->extent.rank * sizeof(hsize_t)))) {
+                new_node = H5FL_FREE(H5S_pnt_node_t, new_node);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate coordinate information")
+            } /* end if */
+
+            /* Copy over the point's coordinates */
+            HDmemcpy(new_node->pnt, &base_node->pnt[rank_diff], (new_space->extent.rank * sizeof(hsize_t)));
+
+            /* Keep the order the same when copying */
+            if(NULL == prev_node)
+                prev_node = new_space->select.sel_info.pnt_lst->head = new_node;
+            else {
+                prev_node->next = new_node;
+                prev_node = new_node;
+            } /* end else */
+
+            /* Advance to next node */
+            base_node = base_node->next;
+        } /* end while */
+    } /* end if */
+    else {
+        HDassert(new_space->extent.rank > base_space->extent.rank);
+
+        /* Compute the difference in ranks */
+        rank_diff = new_space->extent.rank - base_space->extent.rank;
+
+        /* The offset is zero when projected into higher dimensions */
+        *offset = 0;
+
+        /* Iterate through base space's point nodes, copying the point information */
+        base_node = base_space->select.sel_info.pnt_lst->head;
+        prev_node = NULL;
+        while(base_node) {
+            /* Create new point */
+            if(NULL == (new_node = H5FL_MALLOC(H5S_pnt_node_t)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate point node")
+            new_node->next = NULL;
+            if(NULL == (new_node->pnt = (hsize_t *)H5MM_malloc(new_space->extent.rank * sizeof(hsize_t)))) {
+                new_node = H5FL_FREE(H5S_pnt_node_t, new_node);
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate coordinate information")
+            } /* end if */
+
+            /* Copy over the point's coordinates */
+            HDmemset(new_node->pnt, 0, sizeof(hsize_t) * rank_diff);
+            HDmemcpy(&new_node->pnt[rank_diff], base_node->pnt, (new_space->extent.rank * sizeof(hsize_t)));
+
+            /* Keep the order the same when copying */
+            if(NULL == prev_node)
+                prev_node = new_space->select.sel_info.pnt_lst->head = new_node;
+            else {
+                prev_node->next = new_node;
+                prev_node = new_node;
+            } /* end else */
+
+            /* Advance to next node */
+            base_node = base_node->next;
+        } /* end while */
+    } /* end else */
+
+    /* Number of elements selected will be the same */
+    new_space->select.num_elem = base_space->select.num_elem;
+
+    /* Set selection type */
+    new_space->select.type = H5S_sel_point;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_point_project_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_elements
+ PURPOSE
+    Specify a series of elements in the dataspace to select
+ USAGE
+    herr_t H5Sselect_elements(dsid, op, num_elem, coord)
+        hid_t dsid;             IN: Dataspace ID of selection to modify
+        H5S_seloper_t op;       IN: Operation to perform on current selection
+        size_t num_elem;        IN: Number of elements in COORD array.
+        const hsize_t *coord;   IN: The location of each element selected
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    This function selects array elements to be included in the selection for
+    the dataspace.  The COORD array is a 2-D array of size <dataspace rank>
+    by NUM_ELEM (ie. a list of coordinates in the dataspace).  The order of
+    the element coordinates in the COORD array specifies the order that the
+    array elements are iterated through when I/O is performed.  Duplicate
+    coordinates are not checked for.  The selection operator, OP, determines
+    how the new selection is to be combined with the existing selection for
+    the dataspace.  Currently, only H5S_SELECT_SET is supported, which replaces
+    the existing selection with the one defined in this call.  When operators
+    other than H5S_SELECT_SET are used to combine a new selection with an
+    existing selection, the selection ordering is reset to 'C' array ordering.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sselect_elements(hid_t spaceid, H5S_seloper_t op, size_t num_elem,
+    const hsize_t *coord)
+{
+    H5S_t    *space;               /* Dataspace to modify selection of */
+    herr_t   ret_value;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iSsz*h", spaceid, op, num_elem, coord);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(H5S_SCALAR == H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "point doesn't support H5S_SCALAR space")
+    if(H5S_NULL == H5S_GET_EXTENT_TYPE(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "point doesn't support H5S_NULL space")
+    if(coord == NULL || num_elem == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "elements not specified")
+    if(!(op == H5S_SELECT_SET || op == H5S_SELECT_APPEND || op == H5S_SELECT_PREPEND))
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "unsupported operation attempted")
+
+    /* Call the real element selection routine */
+    if((ret_value = H5S_select_elements(space, op, num_elem, coord)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't select elements")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sselect_elements() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_point_get_seq_list
+ PURPOSE
+    Create a list of offsets & lengths for a selection
+ USAGE
+    herr_t H5S_point_get_seq_list(space,flags,iter,maxseq,maxelem,nseq,nelem,off,len)
+        H5S_t *space;           IN: Dataspace containing selection to use.
+        unsigned flags;         IN: Flags for extra information about operation
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator describing last
+                                    position of interest in selection.
+        size_t maxseq;          IN: Maximum number of sequences to generate
+        size_t maxelem;         IN: Maximum number of elements to include in the
+                                    generated sequences
+        size_t *nseq;           OUT: Actual number of sequences generated
+        size_t *nelem;          OUT: Actual number of elements in sequences generated
+        hsize_t *off;           OUT: Array of offsets
+        size_t *len;            OUT: Array of lengths
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to generate a list of byte offsets and
+    lengths for the region(s) selected.  Start/Restart from the position in the
+    ITER parameter.  The number of sequences generated is limited by the MAXSEQ
+    parameter and the number of sequences actually generated is stored in the
+    NSEQ parameter.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_point_get_seq_list(const H5S_t *space, unsigned flags, H5S_sel_iter_t *iter,
+    size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
+    hsize_t *off, size_t *len)
+{
+    size_t io_left;             /* The number of bytes left in the selection */
+    size_t start_io_left;       /* The initial number of bytes left in the selection */
+    H5S_pnt_node_t *node;       /* Point node */
+    hsize_t dims[H5O_LAYOUT_NDIMS];     /* Total size of memory buf */
+    int	ndims;                  /* Dimensionality of space*/
+    hsize_t	acc;            /* Coordinate accumulator */
+    hsize_t	loc;            /* Coordinate offset */
+    size_t      curr_seq;       /* Current sequence being operated on */
+    int         i;              /* Local index variable */
+    herr_t ret_value=SUCCEED;      /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(iter);
+    HDassert(maxseq > 0);
+    HDassert(maxelem > 0);
+    HDassert(nseq);
+    HDassert(nelem);
+    HDassert(off);
+    HDassert(len);
+
+    /* Choose the minimum number of bytes to sequence through */
+    H5_CHECK_OVERFLOW(iter->elmt_left, hsize_t, size_t);
+    start_io_left = io_left = (size_t)MIN(iter->elmt_left, maxelem);
+
+    /* Get the dataspace dimensions */
+    if((ndims = H5S_get_simple_extent_dims (space, dims, NULL)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to retrieve data space dimensions")
+
+    /* Walk through the points in the selection, starting at the current */
+    /*  location in the iterator */
+    node = iter->u.pnt.curr;
+    curr_seq = 0;
+    while(NULL != node) {
+        /* Compute the offset of each selected point in the buffer */
+        for(i = ndims - 1, acc = iter->elmt_size, loc = 0; i >= 0; i--) {
+            loc += (node->pnt[i] + space->select.offset[i]) * acc;
+            acc *= dims[i];
+        } /* end for */
+
+        /* Check if this is a later point in the selection */
+        if(curr_seq>0) {
+            /* If a sorted sequence is requested, make certain we don't go backwards in the offset */
+            if((flags&H5S_GET_SEQ_LIST_SORTED) && loc<off[curr_seq-1])
+                break;
+
+            /* Check if this point extends the previous sequence */
+            /* (Unlikely, but possible) */
+            if(loc==(off[curr_seq-1]+len[curr_seq-1])) {
+                /* Extend the previous sequence */
+                len[curr_seq-1]+=iter->elmt_size;
+            } /* end if */
+            else {
+                /* Add a new sequence */
+                off[curr_seq]=loc;
+                len[curr_seq]=iter->elmt_size;
+
+                /* Increment sequence count */
+                curr_seq++;
+            } /* end else */
+        } /* end if */
+        else {
+            /* Add a new sequence */
+            off[curr_seq]=loc;
+            len[curr_seq]=iter->elmt_size;
+
+            /* Increment sequence count */
+            curr_seq++;
+        } /* end else */
+
+        /* Decrement number of elements left to process */
+        io_left--;
+
+        /* Move the iterator */
+        iter->u.pnt.curr=node->next;
+        iter->elmt_left--;
+
+        /* Check if we're finished with all sequences */
+        if(curr_seq==maxseq)
+            break;
+
+        /* Check if we're finished with all the elements available */
+        if(io_left==0)
+            break;
+
+        /* Advance to the next point */
+        node=node->next;
+      } /* end while */
+
+    /* Set the number of sequences generated */
+    *nseq=curr_seq;
+
+    /* Set the number of elements used */
+    *nelem=start_io_left-io_left;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_point_get_seq_list() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Sprivate.h b/gatb-core/thirdparty/hdf5/src/H5Sprivate.h
new file mode 100644
index 0000000..81b30f7
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Sprivate.h
@@ -0,0 +1,305 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5S module
+ */
+#ifndef _H5Sprivate_H
+#define _H5Sprivate_H
+
+/* Include package's public header */
+#include "H5Spublic.h"
+
+/* Public headers needed by this file */
+#include "H5Dpublic.h"		/* Datasets				*/
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5Tprivate.h"		/* Datatypes				*/
+
+/* Flags for H5S_find */
+#define H5S_CONV_PAR_IO_POSSIBLE        0x0001
+/* The storage options are mutually exclusive */
+/* (2-bits reserved for storage type currently) */
+#define H5S_CONV_STORAGE_COMPACT        0x0000  /* i.e. '0' */
+#define H5S_CONV_STORAGE_CONTIGUOUS     0x0002  /* i.e. '1' */
+#define H5S_CONV_STORAGE_CHUNKED        0x0004  /* i.e. '2' */
+#define H5S_CONV_STORAGE_MASK           0x0006
+
+/* Flags for "get_seq_list" methods */
+#define H5S_GET_SEQ_LIST_SORTED         0x0001
+
+/* Forward references of package typedefs */
+typedef struct H5S_t H5S_t;
+typedef struct H5S_extent_t H5S_extent_t;
+typedef struct H5S_pnt_node_t H5S_pnt_node_t;
+typedef struct H5S_hyper_span_t H5S_hyper_span_t;
+typedef struct H5S_hyper_span_info_t H5S_hyper_span_info_t;
+
+/* Information about one dimension in a hyperslab selection */
+typedef struct H5S_hyper_dim_t {
+    hsize_t start;
+    hsize_t stride;
+    hsize_t count;
+    hsize_t block;
+} H5S_hyper_dim_t;
+
+/* Point selection iteration container */
+typedef struct {
+    H5S_pnt_node_t *curr;   /* Pointer to next node to output */
+} H5S_point_iter_t;
+
+/* Hyperslab selection iteration container */
+typedef struct {
+    /* Common fields for all hyperslab selections */
+    hsize_t off[H5S_MAX_RANK];          /* Offset in span node (used as position for regular hyperslabs) */
+    unsigned iter_rank;     /* Rank of iterator information */
+                            /* (This should always be the same as the dataspace
+                             * rank, except for regular hyperslab selections in
+                             * which there are contiguous regions in the lower
+                             * dimensions which have been "flattened" out
+                             */
+    hbool_t diminfo_valid;         /* Whether the dimension information is valid */
+
+    /* "Flattened" regular hyperslab selection fields */
+    H5S_hyper_dim_t diminfo[H5S_MAX_RANK];   /* "Flattened" regular selection information */
+    hsize_t size[H5S_MAX_RANK];         /* "Flattened" dataspace extent information */
+    hssize_t sel_off[H5S_MAX_RANK];     /* "Flattened" selection offset information */
+    hbool_t flattened[H5S_MAX_RANK];    /* Whether this dimension has been flattened */
+
+    /* Irregular hyperslab selection fields */
+    H5S_hyper_span_info_t *spans;  /* Pointer to copy of the span tree */
+    H5S_hyper_span_t *span[H5S_MAX_RANK];/* Array of pointers to span nodes */
+} H5S_hyper_iter_t;
+
+/* "All" selection iteration container */
+typedef struct {
+    hsize_t elmt_offset;         /* Next element to output */
+    hsize_t byte_offset;         /* Next byte to output */
+} H5S_all_iter_t;
+
+/* Forward declaration of selection iteration class */
+struct H5S_sel_iter_class_t;
+
+/* Selection iteration container */
+typedef struct H5S_sel_iter_t {
+    /* Selection class */
+    const struct H5S_sel_iter_class_t *type; /* Selection iteration class info */
+
+    /* Information common to all iterators */
+    unsigned rank;              /* Rank of dataspace the selection iterator is operating on */
+    hsize_t *dims;              /* Dimensions of dataspace the selection is operating on */
+    hsize_t elmt_left;          /* Number of elements left to iterate over */
+    size_t elmt_size;           /* Size of elements to iterate over */
+
+    /* Information specific to each type of iterator */
+    union {
+        H5S_point_iter_t pnt;   /* Point selection iteration information */
+        H5S_hyper_iter_t hyp;   /* New Hyperslab selection iteration information */
+        H5S_all_iter_t all;     /* "All" selection iteration information */
+    } u;
+} H5S_sel_iter_t;
+
+/* Selection iteration operator for internal library callbacks */
+typedef herr_t (*H5S_sel_iter_lib_op_t)(void *elem, const H5T_t *type,
+        unsigned ndim, const hsize_t *point, void *op_data);
+
+/* Describe kind of callback to make */
+typedef enum H5S_sel_iter_op_type_t {
+    H5S_SEL_ITER_OP_APP,                /* Application callback */
+    H5S_SEL_ITER_OP_LIB                 /* Library internal callback */
+} H5S_sel_iter_op_type_t;
+
+typedef struct H5S_sel_iter_app_op_t {
+    H5D_operator_t op;                  /* Callback */
+    hid_t type_id;                      /* Type ID to be passed to callback */
+} H5S_sel_iter_app_op_t;
+
+typedef struct H5S_sel_iter_op_t {
+    H5S_sel_iter_op_type_t op_type;
+    union {
+        H5S_sel_iter_app_op_t app_op;   /* Application callback */
+        H5S_sel_iter_lib_op_t lib_op;   /* Library internal callback */
+    } u;
+} H5S_sel_iter_op_t;
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5S_PACKAGE
+#define H5S_GET_EXTENT_TYPE(S)          ((S)->extent.type)
+#define H5S_GET_EXTENT_NDIMS(S)         ((S)->extent.rank)
+#define H5S_GET_EXTENT_NPOINTS(S)       ((S)->extent.nelem)
+#define H5S_GET_SELECT_NPOINTS(S)       ((S)->select.num_elem)
+#define H5S_GET_SELECT_TYPE(S)          ((S)->select.type->type)
+#define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN)             ((*(S)->select.type->get_seq_list)(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN))
+#define H5S_SELECT_VALID(S)             ((*(S)->select.type->is_valid)(S))
+#define H5S_SELECT_RELEASE(S)           ((*(S)->select.type->release)(S))
+#define H5S_SELECT_SERIAL_SIZE(S)       ((*(S)->select.type->serial_size)(S))
+#define H5S_SELECT_SERIALIZE(S,BUF)     ((*(S)->select.type->serialize)(S,BUF))
+#define H5S_SELECT_BOUNDS(S,START,END)  ((*(S)->select.type->bounds)(S,START,END))
+#define H5S_SELECT_OFFSET(S, OFFSET)    ((*(S)->select.type->offset)(S, OFFSET))
+#define H5S_SELECT_IS_CONTIGUOUS(S)     ((*(S)->select.type->is_contiguous)(S))
+#define H5S_SELECT_IS_SINGLE(S)         ((*(S)->select.type->is_single)(S))
+#define H5S_SELECT_IS_REGULAR(S)        ((*(S)->select.type->is_regular)(S))
+#define H5S_SELECT_ADJUST_U(S,O)        ((*(S)->select.type->adjust_u)(S, O))
+#define H5S_SELECT_PROJECT_SCALAR(S,O)  ((*(S)->select.type->project_scalar)(S, O))
+#define H5S_SELECT_PROJECT_SIMPLE(S,NS, O) ((*(S)->select.type->project_simple)(S, NS, O))
+#define H5S_SELECT_ITER_COORDS(ITER,COORDS)     ((*(ITER)->type->iter_coords)(ITER,COORDS))
+#define H5S_SELECT_ITER_BLOCK(ITER,START,END)   ((*(ITER)->type->iter_block)(ITER,START,END))
+#define H5S_SELECT_ITER_NELMTS(ITER)    ((*(ITER)->type->iter_nelmts)(ITER))
+#define H5S_SELECT_ITER_HAS_NEXT_BLOCK(ITER)    ((*(ITER)->type->iter_has_next_block)(ITER))
+#define H5S_SELECT_ITER_NEXT(ITER,NELEM)((*(ITER)->type->iter_next)(ITER,NELEM))
+#define H5S_SELECT_ITER_NEXT_BLOCK(ITER)        ((*(ITER)->type->iter_next_block)(ITER))
+#define H5S_SELECT_ITER_RELEASE(ITER)   ((*(ITER)->type->iter_release)(ITER))
+#else /* H5S_PACKAGE */
+#define H5S_GET_EXTENT_TYPE(S)          (H5S_get_simple_extent_type(S))
+#define H5S_GET_EXTENT_NDIMS(S)         (H5S_get_simple_extent_ndims(S))
+#define H5S_GET_EXTENT_NPOINTS(S)       (H5S_get_simple_extent_npoints(S))
+#define H5S_GET_SELECT_NPOINTS(S)       (H5S_get_select_npoints(S))
+#define H5S_GET_SELECT_TYPE(S)          (H5S_get_select_type(S))
+#define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN)       (H5S_select_get_seq_list(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN))
+#define H5S_SELECT_VALID(S)             (H5S_select_valid(S))
+#define H5S_SELECT_RELEASE(S)           (H5S_select_release(S))
+#define H5S_SELECT_SERIAL_SIZE(S)       (H5S_select_serial_size(S))
+#define H5S_SELECT_SERIALIZE(S,BUF)     (H5S_select_serialize(S,BUF))
+#define H5S_SELECT_BOUNDS(S,START,END)  (H5S_get_select_bounds(S,START,END))
+#define H5S_SELECT_OFFSET(S, OFFSET)    (H5S_get_select_offset(S, OFFSET))
+#define H5S_SELECT_IS_CONTIGUOUS(S)     (H5S_select_is_contiguous(S))
+#define H5S_SELECT_IS_SINGLE(S)         (H5S_select_is_single(S))
+#define H5S_SELECT_IS_REGULAR(S)        (H5S_select_is_regular(S))
+#define H5S_SELECT_ADJUST_U(S,O)        (H5S_select_adjust_u(S, O))
+#define H5S_SELECT_PROJECT_SCALAR(S,O)  (H5S_select_project_scalar)(S, O))
+#define H5S_SELECT_PROJECT_SIMPLE(S,NS,O) (H5S_select_project_simple)(S, NS, O))
+#define H5S_SELECT_ITER_COORDS(ITER,COORDS)     (H5S_select_iter_coords(ITER,COORDS))
+#define H5S_SELECT_ITER_BLOCK(ITER,START,END)   (H5S_select_iter_block(ITER,START,END))
+#define H5S_SELECT_ITER_NELMTS(ITER)    (H5S_select_iter_nelmts(ITER))
+#define H5S_SELECT_ITER_HAS_NEXT_BLOCK(ITER)    (H5S_select_iter_has_next_block(ITER))
+#define H5S_SELECT_ITER_NEXT(ITER,NELEM)(H5S_select_iter_next(ITER,NELEM))
+#define H5S_SELECT_ITER_NEXT_BLOCK(ITER)        (H5S_select_iter_next_block(ITER))
+#define H5S_SELECT_ITER_RELEASE(ITER)   (H5S_select_iter_release(ITER))
+#endif /* H5S_PACKAGE */
+/* Handle these two callbacks in a special way, since they have prologs that need to be executed */
+#define H5S_SELECT_COPY(DST,SRC,SHARE)  (H5S_select_copy(DST,SRC,SHARE))
+#define H5S_SELECT_DESERIALIZE(S,BUF)   (H5S_select_deserialize(S,BUF))
+
+
+/* Operations on dataspaces */
+H5_DLL H5S_t *H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max);
+H5_DLL herr_t H5S_close(H5S_t *ds);
+H5_DLL H5S_class_t H5S_get_simple_extent_type(const H5S_t *ds);
+H5_DLL hssize_t H5S_get_simple_extent_npoints(const H5S_t *ds);
+H5_DLL hsize_t H5S_get_npoints_max(const H5S_t *ds);
+H5_DLL hbool_t H5S_has_extent(const H5S_t *ds);
+H5_DLL int H5S_get_simple_extent_ndims(const H5S_t *ds);
+H5_DLL int H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[]/*out*/,
+    hsize_t max_dims[]/*out*/);
+H5_DLL herr_t H5S_write(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned update_flags,
+    H5S_t *ds);
+H5_DLL herr_t H5S_append(H5F_t *f, hid_t dxpl_id, struct H5O_t *oh, H5S_t *ds);
+H5_DLL H5S_t *H5S_read(const struct H5O_loc_t *loc, hid_t dxpl_id);
+H5_DLL htri_t H5S_set_extent(H5S_t *space, const hsize_t *size);
+H5_DLL herr_t H5S_set_extent_real(H5S_t *space, const hsize_t *size);
+H5_DLL H5S_t *H5S_create(H5S_class_t type);
+H5_DLL H5S_t *H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/],
+    const hsize_t maxdims[/*rank*/]);
+H5_DLL herr_t H5S_set_latest_version(H5S_t *ds);
+H5_DLL herr_t H5S_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+    int indent, int fwidth);
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+H5_DLL int H5S_extend(H5S_t *space, const hsize_t *size);
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/* Operations on dataspace extents */
+H5_DLL hsize_t H5S_extent_nelem(const H5S_extent_t *ext);
+H5_DLL int H5S_extent_get_dims(const H5S_extent_t *ext, hsize_t dims[], hsize_t max_dims[]);
+H5_DLL htri_t H5S_extent_equal(const H5S_t *ds1, const H5S_t *ds2);
+
+/* Operations on selections */
+H5_DLL herr_t H5S_select_deserialize(H5S_t *space, const uint8_t *buf);
+H5_DLL H5S_sel_type H5S_get_select_type(const H5S_t *space);
+H5_DLL herr_t H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
+    const H5S_sel_iter_op_t *op, void *op_data);
+H5_DLL herr_t H5S_select_fill(const void *fill, size_t fill_size,
+    const H5S_t *space, void *buf);
+H5_DLL htri_t H5S_select_valid(const H5S_t *space);
+H5_DLL hssize_t H5S_get_select_npoints(const H5S_t *space);
+H5_DLL herr_t H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
+H5_DLL herr_t H5S_get_select_offset(const H5S_t *space, hsize_t *offset);
+H5_DLL herr_t H5S_select_offset(H5S_t *space, const hssize_t *offset);
+H5_DLL herr_t H5S_select_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
+H5_DLL htri_t H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2);
+H5_DLL herr_t H5S_select_construct_projection(const H5S_t *base_space,
+    H5S_t **new_space_ptr, unsigned new_space_rank, const void *buf,
+    void const **adj_buf_ptr, hsize_t element_size);
+H5_DLL herr_t H5S_select_release(H5S_t *ds);
+H5_DLL herr_t H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
+H5_DLL hssize_t H5S_select_serial_size(const H5S_t *space);
+H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t *buf);
+H5_DLL htri_t H5S_select_is_contiguous(const H5S_t *space);
+H5_DLL htri_t H5S_select_is_single(const H5S_t *space);
+H5_DLL htri_t H5S_select_is_regular(const H5S_t *space);
+H5_DLL herr_t H5S_select_adjust_u(H5S_t *space, const hsize_t *offset);
+H5_DLL herr_t H5S_select_project_scalar(const H5S_t *space, hsize_t *offset);
+H5_DLL herr_t H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+
+/* Operations on all selections */
+H5_DLL herr_t H5S_select_all(H5S_t *space, hbool_t rel_prev);
+
+/* Operations on none selections */
+H5_DLL herr_t H5S_select_none(H5S_t *space);
+
+/* Operations on point selections */
+H5_DLL herr_t H5S_select_elements(H5S_t *space, H5S_seloper_t op,
+    size_t num_elem, const hsize_t *coord);
+
+/* Operations on hyperslab selections */
+H5_DLL herr_t H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op, const hsize_t start[],
+    const hsize_t *stride, const hsize_t count[], const hsize_t *block);
+H5_DLL herr_t H5S_hyper_add_span_element(H5S_t *space, unsigned rank,
+    hsize_t *coords);
+H5_DLL herr_t H5S_hyper_reset_scratch(H5S_t *space);
+H5_DLL herr_t H5S_hyper_convert(H5S_t *space);
+#ifdef LATER
+H5_DLL htri_t H5S_hyper_intersect (H5S_t *space1, H5S_t *space2);
+#endif /* LATER */
+H5_DLL htri_t H5S_hyper_intersect_block (H5S_t *space, hsize_t *start, hsize_t *end);
+H5_DLL herr_t H5S_hyper_adjust_s(H5S_t *space, const hssize_t *offset);
+H5_DLL htri_t H5S_hyper_normalize_offset(H5S_t *space, hssize_t *old_offset);
+H5_DLL herr_t H5S_hyper_denormalize_offset(H5S_t *space, const hssize_t *old_offset);
+
+/* Operations on selection iterators */
+H5_DLL herr_t H5S_select_iter_init(H5S_sel_iter_t *iter, const H5S_t *space, size_t elmt_size);
+H5_DLL herr_t H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords);
+H5_DLL hsize_t H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter);
+H5_DLL herr_t H5S_select_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
+H5_DLL herr_t H5S_select_iter_release(H5S_sel_iter_t *sel_iter);
+
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5S_mpio_space_type(const H5S_t *space, size_t elmt_size,
+    /* out: */  MPI_Datatype *new_type,
+                int *count,
+                hbool_t *is_derived_type,
+                hbool_t do_permute, 
+                hsize_t **permute_map,
+                hbool_t * is_permuted);
+#endif /* H5_HAVE_PARALLEL */
+
+#endif /* _H5Sprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Spublic.h b/gatb-core/thirdparty/hdf5/src/H5Spublic.h
new file mode 100644
index 0000000..097bf30
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Spublic.h
@@ -0,0 +1,152 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5S module.
+ */
+#ifndef _H5Spublic_H
+#define _H5Spublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Ipublic.h"
+
+/* Define atomic datatypes */
+#define H5S_ALL         (hid_t)0
+#define H5S_UNLIMITED	((hsize_t)(hssize_t)(-1))
+
+/* Define user-level maximum number of dimensions */
+#define H5S_MAX_RANK    32
+
+/* Different types of dataspaces */
+typedef enum H5S_class_t {
+    H5S_NO_CLASS         = -1,  /*error                                      */
+    H5S_SCALAR           = 0,   /*scalar variable                            */
+    H5S_SIMPLE           = 1,   /*simple data space                          */
+    H5S_NULL             = 2    /*null data space                            */
+} H5S_class_t;
+
+/* Different ways of combining selections */
+typedef enum H5S_seloper_t {
+    H5S_SELECT_NOOP      = -1,  /* error                                     */
+    H5S_SELECT_SET       = 0,   /* Select "set" operation 		     */
+    H5S_SELECT_OR,              /* Binary "or" operation for hyperslabs
+                                 * (add new selection to existing selection)
+                                 * Original region:  AAAAAAAAAA
+                                 * New region:             BBBBBBBBBB
+                                 * A or B:           CCCCCCCCCCCCCCCC
+                                 */
+    H5S_SELECT_AND,             /* Binary "and" operation for hyperslabs
+                                 * (only leave overlapped regions in selection)
+                                 * Original region:  AAAAAAAAAA
+                                 * New region:             BBBBBBBBBB
+                                 * A and B:                CCCC
+                                 */
+    H5S_SELECT_XOR,             /* Binary "xor" operation for hyperslabs
+                                 * (only leave non-overlapped regions in selection)
+                                 * Original region:  AAAAAAAAAA
+                                 * New region:             BBBBBBBBBB
+                                 * A xor B:          CCCCCC    CCCCCC
+                                 */
+    H5S_SELECT_NOTB,            /* Binary "not" operation for hyperslabs
+                                 * (only leave non-overlapped regions in original selection)
+                                 * Original region:  AAAAAAAAAA
+                                 * New region:             BBBBBBBBBB
+                                 * A not B:          CCCCCC
+                                 */
+    H5S_SELECT_NOTA,            /* Binary "not" operation for hyperslabs
+                                 * (only leave non-overlapped regions in new selection)
+                                 * Original region:  AAAAAAAAAA
+                                 * New region:             BBBBBBBBBB
+                                 * B not A:                    CCCCCC
+                                 */
+    H5S_SELECT_APPEND,          /* Append elements to end of point selection */
+    H5S_SELECT_PREPEND,         /* Prepend elements to beginning of point selection */
+    H5S_SELECT_INVALID          /* Invalid upper bound on selection operations */
+} H5S_seloper_t;
+
+/* Enumerated type for the type of selection */
+typedef enum {
+    H5S_SEL_ERROR	= -1, 	/* Error			*/
+    H5S_SEL_NONE	= 0,    /* Nothing selected 		*/
+    H5S_SEL_POINTS	= 1,    /* Sequence of points selected	*/
+    H5S_SEL_HYPERSLABS  = 2,    /* "New-style" hyperslab selection defined	*/
+    H5S_SEL_ALL		= 3,    /* Entire extent selected	*/
+    H5S_SEL_N			/*THIS MUST BE LAST		*/
+}H5S_sel_type;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Functions in H5S.c */
+H5_DLL hid_t H5Screate(H5S_class_t type);
+H5_DLL hid_t H5Screate_simple(int rank, const hsize_t dims[],
+			       const hsize_t maxdims[]);
+H5_DLL herr_t H5Sset_extent_simple(hid_t space_id, int rank,
+				    const hsize_t dims[],
+				    const hsize_t max[]);
+H5_DLL hid_t H5Scopy(hid_t space_id);
+H5_DLL herr_t H5Sclose(hid_t space_id);
+H5_DLL herr_t H5Sencode(hid_t obj_id, void *buf, size_t *nalloc);
+H5_DLL hid_t H5Sdecode(const void *buf);
+H5_DLL hssize_t H5Sget_simple_extent_npoints(hid_t space_id);
+H5_DLL int H5Sget_simple_extent_ndims(hid_t space_id);
+H5_DLL int H5Sget_simple_extent_dims(hid_t space_id, hsize_t dims[],
+				      hsize_t maxdims[]);
+H5_DLL htri_t H5Sis_simple(hid_t space_id);
+H5_DLL hssize_t H5Sget_select_npoints(hid_t spaceid);
+H5_DLL herr_t H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op,
+				   const hsize_t start[],
+				   const hsize_t _stride[],
+				   const hsize_t count[],
+				   const hsize_t _block[]);
+/* #define NEW_HYPERSLAB_API */
+#ifdef NEW_HYPERSLAB_API
+H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op,
+				   const hsize_t start[],
+				   const hsize_t _stride[],
+				   const hsize_t count[],
+				   const hsize_t _block[]);
+H5_DLL herr_t H5Sselect_select(hid_t space1_id, H5S_seloper_t op,
+                                  hid_t space2_id);
+H5_DLL hid_t H5Scombine_select(hid_t space1_id, H5S_seloper_t op,
+                                  hid_t space2_id);
+#endif /* NEW_HYPERSLAB_API */
+H5_DLL herr_t H5Sselect_elements(hid_t space_id, H5S_seloper_t op,
+    size_t num_elem, const hsize_t *coord);
+H5_DLL H5S_class_t H5Sget_simple_extent_type(hid_t space_id);
+H5_DLL herr_t H5Sset_extent_none(hid_t space_id);
+H5_DLL herr_t H5Sextent_copy(hid_t dst_id,hid_t src_id);
+H5_DLL htri_t H5Sextent_equal(hid_t sid1, hid_t sid2);
+H5_DLL herr_t H5Sselect_all(hid_t spaceid);
+H5_DLL herr_t H5Sselect_none(hid_t spaceid);
+H5_DLL herr_t H5Soffset_simple(hid_t space_id, const hssize_t *offset);
+H5_DLL htri_t H5Sselect_valid(hid_t spaceid);
+H5_DLL hssize_t H5Sget_select_hyper_nblocks(hid_t spaceid);
+H5_DLL hssize_t H5Sget_select_elem_npoints(hid_t spaceid);
+H5_DLL herr_t H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock,
+    hsize_t numblocks, hsize_t buf[/*numblocks*/]);
+H5_DLL herr_t H5Sget_select_elem_pointlist(hid_t spaceid, hsize_t startpoint,
+    hsize_t numpoints, hsize_t buf[/*numpoints*/]);
+H5_DLL herr_t H5Sget_select_bounds(hid_t spaceid, hsize_t start[],
+    hsize_t end[]);
+H5_DLL H5S_sel_type H5Sget_select_type(hid_t spaceid);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Spublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Sselect.c b/gatb-core/thirdparty/hdf5/src/H5Sselect.c
new file mode 100644
index 0000000..d5cee57
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Sselect.c
@@ -0,0 +1,2066 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.ued>
+ *              Friday, May 29, 1998
+ *
+ * Purpose:	Dataspace selection functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Spkg.h"		/* Dataspaces 				*/
+#include "H5VMprivate.h"		/* Vector and array functions		*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+/* Local functions */
+#ifdef LATER
+static herr_t H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static htri_t H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter);
+static herr_t H5S_select_iter_next_block(H5S_sel_iter_t *iter);
+#endif /* LATER */
+
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_offset
+ PURPOSE
+    Set the selection offset for a datapace
+ USAGE
+    herr_t H5S_select_offset(space, offset)
+        H5S_t *space;	        IN/OUT: Dataspace object to set selection offset
+        const hssize_t *offset; IN: Offset to position the selection at
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Sets the selection offset for the dataspace
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Only works for simple dataspaces currently
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_offset(H5S_t *space, const hssize_t *offset)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(0 < space->extent.rank && space->extent.rank <= H5S_MAX_RANK);
+    HDassert(offset);
+
+    /* Copy the offset over */
+    HDmemcpy(space->select.offset, offset, sizeof(hssize_t)*space->extent.rank);
+
+    /* Indicate that the offset was changed */
+    space->select.offset_changed = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5S_select_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_copy
+ PURPOSE
+    Copy a selection from one dataspace to another
+ USAGE
+    herr_t H5S_select_copy(dst, src)
+        H5S_t *dst;  OUT: Pointer to the destination dataspace
+        H5S_t *src;  IN: Pointer to the source dataspace
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Copies all the selection information (include offset) from the source
+    dataspace to the destination dataspace.
+
+    If the SHARE_SELECTION flag is set, then the selection can be shared
+    between the source and destination dataspaces.  (This should only occur in
+    situations where the destination dataspace will immediately change to a new
+    selection)
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_copy (H5S_t *dst, const H5S_t *src, hbool_t share_selection)
+{
+    herr_t ret_value;     /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(dst);
+    HDassert(src);
+
+    /* Copy regular fields */
+    dst->select=src->select;
+
+    /* Perform correct type of copy based on the type of selection */
+    if((ret_value=(*src->select.type->copy)(dst,src,share_selection))<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy selection specific information")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_release
+ *
+ * Purpose:	Releases all memory associated with a dataspace selection.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, May 30, 2003
+ *
+ * Note: This routine participates in the "Inlining C function pointers"
+ *      pattern, don't call it directly, use the appropriate macro
+ *      defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_select_release(H5S_t *ds)
+{
+    herr_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(ds);
+
+    /* Call the selection type's release function */
+    ret_value=(*ds->select.type->release)(ds);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_release() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_get_seq_list
+ *
+ * Purpose:	Retrieves the next sequence of offset/length pairs for an
+ *              iterator on a dataspace
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, May 18, 2004
+ *
+ * Note: This routine participates in the "Inlining C function pointers"
+ *      pattern, don't call it directly, use the appropriate macro
+ *      defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
+    H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
+    size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len)
+{
+    herr_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Call the selection type's get_seq_list function */
+    ret_value = (*space->select.type->get_seq_list)(space, flags, iter, maxseq, maxbytes, nseq, nbytes, off, len);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_get_seq_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5S_select_serial_size
+ *
+ * Purpose:	Determines the number of bytes required to store the current
+ *              selection
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, May 18, 2004
+ *
+ * Note: This routine participates in the "Inlining C function pointers"
+ *      pattern, don't call it directly, use the appropriate macro
+ *      defined in H5Sprivate.h.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hssize_t
+H5S_select_serial_size(const H5S_t *space)
+{
+    hssize_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    /* Call the selection type's serial_size function */
+    ret_value=(*space->select.type->serial_size)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_serial_size() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_serialize
+ PURPOSE
+    Serialize the selection for a dataspace into a buffer
+ USAGE
+    herr_t H5S_select_serialize(space, buf)
+        const H5S_t *space;     IN: Dataspace with selection to serialize
+        uint8_t *buf;           OUT: Buffer to put serialized selection
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Calls the appropriate dataspace selection callback to serialize the
+    current selection into a buffer.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_serialize(const H5S_t *space, uint8_t *buf)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+    HDassert(buf);
+
+    /* Call the selection type's serialize function */
+    ret_value=(*space->select.type->serialize)(space,buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_serialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_npoints
+ PURPOSE
+    Get the number of elements in current selection
+ USAGE
+    hssize_t H5Sget_select_npoints(dsid)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Returns the number of elements in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hssize_t
+H5Sget_select_npoints(hid_t spaceid)
+{
+    H5S_t *space;               /* Dataspace to modify selection of */
+    hssize_t ret_value;         /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Hs", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = (hssize_t)H5S_GET_SELECT_NPOINTS(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_npoints() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_npoints
+ PURPOSE
+    Get the number of elements in current selection
+ USAGE
+    hssize_t H5Sget_select_npoints(space)
+        H5S_t *space;             IN: Dataspace of selection to query
+ RETURNS
+    The number of elements in selection on success, 0 on failure
+ DESCRIPTION
+    Returns the number of elements in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hssize_t
+H5S_get_select_npoints(const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    FUNC_LEAVE_NOAPI((hssize_t)space->select.num_elem)
+}   /* H5S_get_select_npoints() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sselect_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5Sselect_void(dsid)
+        hid_t dsid;             IN: Dataspace ID to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+    Christian Chilan 01/17/2007
+    Changed the error return value from 0 to FAIL.
+--------------------------------------------------------------------------*/
+htri_t
+H5Sselect_valid(hid_t spaceid)
+{
+    H5S_t *space;       /* Dataspace to modify selection of */
+    htri_t ret_value;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = H5S_SELECT_VALID(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sselect_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_valid
+ PURPOSE
+    Check whether the selection fits within the extent, with the current
+    offset defined.
+ USAGE
+    htri_t H5S_select_void(space)
+        H5S_t *space;           IN: Dataspace to query
+ RETURNS
+    TRUE if the selection fits within the extent, FALSE if it does not and
+        Negative on an error.
+ DESCRIPTION
+    Determines if the current selection at the current offet fits within the
+    extent for the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_valid(const H5S_t *space)
+{
+    htri_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(space);
+
+    ret_value = (*space->select.type->is_valid)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_valid() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_deserialize
+ PURPOSE
+    Deserialize the current selection from a user-provided buffer into a real
+        selection in the dataspace.
+ USAGE
+    herr_t H5S_select_deserialize(space, buf)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
+        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Deserializes the current selection into a buffer.  (Primarily for retrieving
+    from disk).  This routine just hands off to the appropriate routine for each
+    type of selection.  The format of the serialized information is shown in
+    the H5S_select_serialize() header.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_deserialize (H5S_t *space, const uint8_t *buf)
+{
+    const uint8_t *tbuf;    /* Temporary pointer to the selection type */
+    uint32_t sel_type;       /* Pointer to the selection type */
+    herr_t ret_value=FAIL;  /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(space);
+
+    tbuf=buf;
+    UINT32DECODE(tbuf, sel_type);
+    switch(sel_type) {
+        case H5S_SEL_POINTS:         /* Sequence of points selected */
+            ret_value=(*H5S_sel_point->deserialize)(space,buf);
+            break;
+
+        case H5S_SEL_HYPERSLABS:     /* Hyperslab selection defined */
+            ret_value=(*H5S_sel_hyper->deserialize)(space,buf);
+            break;
+
+        case H5S_SEL_ALL:            /* Entire extent selected */
+            ret_value=(*H5S_sel_all->deserialize)(space,buf);
+            break;
+
+        case H5S_SEL_NONE:           /* Nothing selected */
+            ret_value=(*H5S_sel_none->deserialize)(space,buf);
+            break;
+
+        default:
+            break;
+    }
+    if(ret_value<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTLOAD, FAIL, "can't deserialize selection")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_deserialize() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_get_select_bounds(space, start, end)
+        hid_t dsid;             IN: Dataspace ID of selection to query
+        hsize_t start[];        OUT: Starting coordinate of bounding box
+        hsize_t end[];          OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).  Calling this function on a "none" selection
+    returns fail.
+        The bounding box calculations _does_ include the current offset of the
+    selection within the dataspace extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sget_select_bounds(hid_t spaceid, hsize_t start[], hsize_t end[])
+{
+    H5S_t *space;       /* Dataspace to modify selection of */
+    herr_t ret_value;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*h*h", spaceid, start, end);
+
+    /* Check args */
+    if(start == NULL || end == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer")
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = H5S_SELECT_BOUNDS(space, start, end);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_select_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_bounds
+ PURPOSE
+    Gets the bounding box containing the selection.
+ USAGE
+    herr_t H5S_get_select_bounds(space, start, end)
+        H5S_t *space;           IN: Dataspace ID of selection to query
+        hsize_t *start;         OUT: Starting coordinate of bounding box
+        hsize_t *end;           OUT: Opposite coordinate of bounding box
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the bounding box containing the current selection and places
+    it into the user's buffers.  The start and end buffers must be large
+    enough to hold the dataspace rank number of coordinates.  The bounding box
+    exactly contains the selection, ie. if a 2-D element selection is currently
+    defined with the following points: (4,5), (6,8) (10,7), the bounding box
+    with be (4, 5), (10, 8).  Calling this function on a "none" selection
+    returns fail.
+        The bounding box calculations _does_ include the current offset of the
+    selection within the dataspace extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(start);
+    HDassert(end);
+
+    ret_value = (*space->select.type->bounds)(space,start,end);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_bounds() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_offset
+ PURPOSE
+    Gets the linear offset of the first element for the selection.
+ USAGE
+    herr_t H5S_get_select_offset(space, offset)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+        hsize_t *offset;        OUT: Linear offset of first element in selection
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the linear offset (in "units" of elements) of the first element
+    selected within the dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        The offset calculation _does_ include the current offset of the
+    selection within the dataspace extent.
+
+        Calling this function on a "none" selection returns fail.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(offset);
+
+    ret_value = (*space->select.type->offset)(space, offset);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_offset() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_is_contiguous
+ PURPOSE
+    Determines if a selection is contiguous in the dataspace
+ USAGE
+    htri_t H5S_select_is_contiguous(space)
+        const H5S_t *space;             IN: Dataspace of selection to query
+ RETURNS
+    Non-negative (TRUE/FALSE) on success, negative on failure
+ DESCRIPTION
+    Checks the selection to determine if the points to iterated over will be
+    contiguous in the particular dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_is_contiguous(const H5S_t *space)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    ret_value = (*space->select.type->is_contiguous)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_is_contiguous() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_is_single
+ PURPOSE
+    Determines if a selection is a single block in the dataspace
+ USAGE
+    htri_t H5S_select_is_single(space)
+        const H5S_t *space;             IN: Dataspace of selection to query
+ RETURNS
+    Non-negative (TRUE/FALSE) on success, negative on failure
+ DESCRIPTION
+    Checks the selection to determine if it occupies a single block in the
+    particular dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_is_single(const H5S_t *space)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    ret_value = (*space->select.type->is_single)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_is_single() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_is_regular
+ PURPOSE
+    Determines if a selection is "regular"  in the dataspace
+ USAGE
+    htri_t H5S_select_is_regular(space)
+        const H5S_t *space;             IN: Dataspace of selection to query
+ RETURNS
+    Non-negative (TRUE/FALSE) on success, negative on failure
+ DESCRIPTION
+    Checks the selection to determine if it is "regular" (i.e. a single
+    block or a strided pattern) in the particular dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_is_regular(const H5S_t *space)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    ret_value = (*space->select.type->is_regular)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_is_regular() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_adjust_u
+ PURPOSE
+    Adjust a selection by subtracting an offset
+ USAGE
+    herr_t H5S_select_adjust_u(space, offset)
+        H5S_t *space;           IN/OUT: Pointer to dataspace to adjust
+        const hsize_t *offset; IN: Offset to subtract
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves a selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
+{
+    herr_t ret_value;        /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    ret_value = (*space->select.type->adjust_u)(space, offset);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_adjust_u() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_project_scalar
+ PURPOSE
+    Project a single element selection for a scalar dataspace
+ USAGE
+    herr_t H5S_select_project_scalar(space, offset)
+        const H5S_t *space;             IN: Pointer to dataspace to project
+        hsize_t *offset;                IN/OUT: Offset of projected point
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Projects a selection of a single element into a scalar dataspace, computing
+    the offset of the element in the original selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
+{
+    herr_t ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(offset);
+
+    ret_value = (*space->select.type->project_scalar)(space, offset);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_project_scalar() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_project_simple
+ PURPOSE
+    Project a selection onto/into a dataspace of different rank
+ USAGE
+    herr_t H5S_select_project_simple(space, new_space, offset)
+        const H5S_t *space;             IN: Pointer to dataspace to project
+        H5S_t *new_space;               IN/OUT: Pointer to dataspace projected onto
+        hsize_t *offset;                IN/OUT: Offset of projected point
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Projects a selection onto/into a simple dataspace, computing
+    the offset of the first element in the original selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
+{
+    herr_t ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+    HDassert(new_space);
+    HDassert(offset);
+
+    ret_value = (*space->select.type->project_simple)(space, new_space, offset);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_project_simple() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_init
+ PURPOSE
+    Initializes iteration information for a selection.
+ USAGE
+    herr_t H5S_select_iter_init(sel_iter, space, elmt_size)
+        H5S_sel_iter_t *sel_iter; OUT: Selection iterator to initialize.
+        H5S_t *space;           IN: Dataspace object containing selection to
+                                    iterate over
+        size_t elmt_size;       IN: Size of elements in the selection
+ RETURNS
+     Non-negative on success, negative on failure.
+ DESCRIPTION
+    Initialize the selection iterator object to point to the first element
+    in the dataspace's selection.
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space, size_t elmt_size)
+{
+    herr_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(sel_iter);
+    HDassert(space);
+
+    /* Initialize common information */
+
+    /* Save the dataspace's rank */
+    sel_iter->rank = space->extent.rank;
+
+    /* Point to the dataspace dimensions, if there are any */
+    if(sel_iter->rank > 0)
+        sel_iter->dims = space->extent.size;
+    else
+        sel_iter->dims = NULL;
+
+    /* Save the element size */
+    sel_iter->elmt_size = elmt_size;
+
+    /* Call initialization routine for selection type */
+    ret_value = (*space->select.type->iter_init)(sel_iter, space);
+    HDassert(sel_iter->type);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_init() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_coords
+ PURPOSE
+    Get the coordinates of the current iterator position
+ USAGE
+    herr_t H5S_select_iter_coords(sel_iter,coords)
+        H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
+        hsize_t *coords;         OUT: Array to place iterator coordinates in
+ RETURNS
+    Non-negative on success, negative on failure.
+ DESCRIPTION
+    The current location of the iterator within the selection is placed in
+    the COORDS array.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(sel_iter);
+    HDassert(coords);
+
+    /* Call iter_coords routine for selection type */
+    ret_value = (*sel_iter->type->iter_coords)(sel_iter,coords);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_coords() */
+
+#ifdef LATER
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_block
+ PURPOSE
+    Get the block of the current iterator position
+ USAGE
+    herr_t H5S_select_iter_block(sel_iter,start,end)
+        const H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
+        hsize_t *start;    OUT: Array to place iterator start block coordinates
+        hsize_t *end;      OUT: Array to place iterator end block coordinates
+ RETURNS
+    Non-negative on success, negative on failure.
+ DESCRIPTION
+    The current location of the iterator within the selection is placed in
+    the COORDS array.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(start);
+    HDassert(end);
+
+    /* Call iter_block routine for selection type */
+    ret_value = (*iter->type->iter_block)(iter,start,end);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_block() */
+#endif /* LATER */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_nelmts
+ PURPOSE
+    Get the number of elements left to iterate over in selection
+ USAGE
+    hssize_t H5S_select_iter_nelmts(sel_iter)
+        H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
+ RETURNS
+    The number of elements in selection on success, 0 on failure
+ DESCRIPTION
+    Returns the number of elements in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t
+H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter)
+{
+    hsize_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(sel_iter);
+
+    /* Call iter_nelmts routine for selection type */
+    ret_value = (*sel_iter->type->iter_nelmts)(sel_iter);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_nelmts() */
+
+#ifdef LATER
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_has_next_block
+ PURPOSE
+    Check if there is another block available in the selection iterator
+ USAGE
+    htri_t H5S_select_iter_has_next_block(sel_iter)
+        const H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
+ RETURNS
+    Non-negative on success, negative on failure.
+ DESCRIPTION
+    Check if there is another block available to advance to in the selection
+    iterator.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static htri_t
+H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    /* Call iter_has_next_block routine for selection type */
+    ret_value = (*iter->type->iter_has_next_block)(iter);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_has_next_block() */
+#endif /* LATER */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_next
+ PURPOSE
+    Advance selection iterator to next element
+ USAGE
+    herr_t H5S_select_iter_next(iter, nelem)
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator to change
+        size_t nelem;           IN: Number of elements to advance by
+ RETURNS
+    Non-negative on success, negative on failure.
+ DESCRIPTION
+    Move the current element for the selection iterator to the NELEM'th next
+    element in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_iter_next(H5S_sel_iter_t *iter, size_t nelem)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+    HDassert(nelem>0);
+
+    /* Call iter_next routine for selection type */
+    ret_value = (*iter->type->iter_next)(iter,nelem);
+
+    /* Decrement the number of elements left in selection */
+    iter->elmt_left-=nelem;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_next() */
+
+#ifdef LATER
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_next_block
+ PURPOSE
+    Advance selection iterator to next block
+ USAGE
+    herr_t H5S_select_iter_next_block(iter)
+        H5S_sel_iter_t *iter;   IN/OUT: Selection iterator to change
+ RETURNS
+    Non-negative on success, negative on failure.
+ DESCRIPTION
+    Move the current element for the selection iterator to the next
+    block in the selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Doesn't maintain the 'elmt_left' field of the selection iterator.
+
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_select_iter_next_block(H5S_sel_iter_t *iter)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(iter);
+
+    /* Call iter_next_block routine for selection type */
+    ret_value = (*iter->type->iter_next_block)(iter);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_next_block() */
+#endif /* LATER */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iter_release
+ PURPOSE
+    Release a selection iterator's resources.
+ USAGE
+    hssize_t H5S_select_iter_release(sel_iter)
+        H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
+ RETURNS
+    The number of elements in selection on success, 0 on failure
+ DESCRIPTION
+    Returns the number of elements in current selection for dataspace.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_iter_release(H5S_sel_iter_t *sel_iter)
+{
+    herr_t ret_value;         /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(sel_iter);
+
+    /* Call selection type-specific release routine */
+    ret_value = (*sel_iter->type->iter_release)(sel_iter);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_iter_release() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_iterate
+ PURPOSE
+    Iterate over the selected elements in a memory buffer.
+ USAGE
+    herr_t H5S_select_iterate(buf, type, space, operator, operator_data)
+        void *buf;      IN/OUT: Buffer containing elements to iterate over
+        H5T_t *type;    IN: Datatype of BUF array.
+        H5S_t *space;   IN: Dataspace object containing selection to iterate over
+        H5D_operator_t op; IN: Function pointer to the routine to be
+                                called for each element in BUF iterated over.
+        void *operator_data;    IN/OUT: Pointer to any user-defined data
+                                associated with the operation.
+ RETURNS
+    Returns the return value of the last operator if it was non-zero, or zero
+    if all elements were processed. Otherwise returns a negative value.
+ DESCRIPTION
+    Iterates over the selected elements in a memory buffer, calling the user's
+    callback function for each element.  The selection in the dataspace is
+    modified so that any elements already iterated over are removed from the
+    selection if the iteration is interrupted (by the H5D_operator_t function
+    returning non-zero) in the "middle" of the iteration and may be re-started
+    by the user where it left off.
+
+    NOTE: Until "subtracting" elements from a selection is implemented,
+        the selection is not modified.
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
+    const H5S_sel_iter_op_t *op, void *op_data)
+{
+    H5S_sel_iter_t iter;        /* Selection iteration info */
+    hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
+    hssize_t nelmts;            /* Number of elements in selection */
+    hsize_t space_size[H5O_LAYOUT_NDIMS]; /* Dataspace size */
+    size_t max_elem;            /* Maximum number of elements allowed in sequences */
+    size_t elmt_size;           /* Datatype size */
+    unsigned ndims;             /* Number of dimensions in dataspace */
+    herr_t user_ret = 0;        /* User's return value */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(buf);
+    HDassert(type);
+    HDassert(space);
+    HDassert(op);
+
+    /* Get the datatype size */
+    if(0 == (elmt_size = H5T_get_size(type)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "datatype size invalid")
+
+    /* Initialize iterator */
+    if(H5S_select_iter_init(&iter, space, elmt_size) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    iter_init = TRUE;	/* Selection iteration info has been initialized */
+
+    /* Get the number of elements in selection */
+    if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
+
+    /* Get the rank of the dataspace */
+    ndims = space->extent.rank;
+
+    if(ndims > 0) {
+	/* Copy the size of the space */
+	HDassert(space->extent.size);
+	HDmemcpy(space_size, space->extent.size, ndims * sizeof(hsize_t));
+    } /* end if */
+    space_size[ndims] = elmt_size;
+
+    /* Compute the maximum number of bytes required */
+    H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
+
+    /* Loop, while elements left in selection */
+    while(max_elem > 0 && user_ret == 0) {
+        hsize_t off[H5D_IO_VECTOR_SIZE];        /* Array to store sequence offsets */
+        size_t len[H5D_IO_VECTOR_SIZE];         /* Array to store sequence lengths */
+        size_t nelem;               /* Number of elements used in sequences */
+        size_t nseq;                /* Number of sequences generated */
+        size_t curr_seq;            /* Current sequence being worked on */
+
+        /* Get the sequences of bytes */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, &iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+        /* Loop, while sequences left to process */
+        for(curr_seq = 0; curr_seq < nseq && user_ret == 0; curr_seq++) {
+            hsize_t curr_off;           /* Current offset within sequence */
+            size_t curr_len;            /* Length of bytes left to process in sequence */
+
+            /* Get the current offset */
+            curr_off = off[curr_seq];
+
+            /* Get the number of bytes in sequence */
+            curr_len = len[curr_seq];
+
+            /* Loop, while bytes left in sequence */
+            while(curr_len > 0 && user_ret == 0) {
+                hsize_t coords[H5O_LAYOUT_NDIMS];  /* Coordinates of element in dataspace */
+                hsize_t tmp_off;        /* Temporary offset within sequence */
+                uint8_t *loc;           /* Current element location in buffer */
+                int i;			/* Local Index variable */
+
+                /* Compute the coordinate from the offset */
+                for(i = (int)ndims, tmp_off = curr_off; i >= 0; i--) {
+                    coords[i] = tmp_off % space_size[i];
+                    tmp_off /= space_size[i];
+                } /* end for */
+
+                /* Get the location within the user's buffer */
+                loc = (unsigned char *)buf + curr_off;
+
+                /* Check which type of callback to make */
+                switch(op->op_type) {
+                    case H5S_SEL_ITER_OP_APP:
+                        /* Make the application callback */
+                        user_ret = (op->u.app_op.op)(loc, op->u.app_op.type_id, ndims, coords, op_data);
+                    break;
+                    case H5S_SEL_ITER_OP_LIB:
+                        /* Call the library's callback */
+                        user_ret = (op->u.lib_op)(loc, type, ndims, coords, op_data);
+                    break;
+                    default:
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported op type")
+                } /* end switch */
+
+                /* Increment offset in dataspace */
+                curr_off += elmt_size;
+
+                /* Decrement number of bytes left in sequence */
+                curr_len -= elmt_size;
+            } /* end while */
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        max_elem -= nelem;
+    } /* end while */
+
+    /* Set return value */
+    ret_value = user_ret;
+
+done:
+    /* Release selection iterator */
+    if(iter_init && H5S_SELECT_ITER_RELEASE(&iter) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_select_iterate() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sget_select_type
+ PURPOSE
+    Retrieve the type of selection in a dataspace
+ USAGE
+    H5S_sel_type H5Sget_select_type(space_id)
+        hid_t space_id;	        IN: Dataspace object to query
+ RETURNS
+    Non-negative on success/Negative on failure.  Return value is from the
+    set of values in the H5S_sel_type enumerated type.
+ DESCRIPTION
+	This function retrieves the type of selection currently defined for
+    a dataspace.
+--------------------------------------------------------------------------*/
+H5S_sel_type
+H5Sget_select_type(hid_t space_id)
+{
+    H5S_t *space;	        /* dataspace to modify */
+    H5S_sel_type ret_value;     /* Return value */
+
+    FUNC_ENTER_API(H5S_SEL_ERROR)
+    H5TRACE1("St", "i", space_id);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5S_SEL_ERROR, "not a dataspace")
+
+    /* Set return value */
+    ret_value = H5S_GET_SELECT_TYPE(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Sget_select_type() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_type
+ PURPOSE
+    Retrieve the type of selection in a dataspace
+ USAGE
+    H5S_sel_type H5Sget_select_type(space)
+        const H5S_t *space;	        IN: Dataspace object to query
+ RETURNS
+    Non-negative on success/Negative on failure.  Return value is from the
+    set of values in the H5S_sel_type enumerated type.
+ DESCRIPTION
+	This function retrieves the type of selection currently defined for
+    a dataspace.
+ COMMENTS
+     This routine participates in the "Inlining C function pointers"
+        pattern, don't call it directly, use the appropriate macro
+        defined in H5Sprivate.h.
+--------------------------------------------------------------------------*/
+H5S_sel_type
+H5S_get_select_type(const H5S_t *space)
+{
+    H5S_sel_type        ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    /* Set return value */
+    ret_value=H5S_GET_SELECT_TYPE(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5S_get_select_type() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_shape_same
+ PURPOSE
+    Check if two selections are the same shape
+ USAGE
+    htri_t H5S_select_shape_same(space1, space2)
+        const H5S_t *space1;         IN: 1st Dataspace pointer to compare
+        const H5S_t *space2;         IN: 2nd Dataspace pointer to compare
+ RETURNS
+    TRUE/FALSE/FAIL
+ DESCRIPTION
+    Checks to see if the current selection in the dataspaces are the same
+    dimensionality and shape.
+    This is primarily used for reading the entire selection in one swoop.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Assumes that there is only a single "block" for hyperslab selections.
+ EXAMPLES
+ REVISION LOG
+    Modified function to view identical shapes with different dimensions 
+    as being the same under some circumstances.
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
+{
+    H5S_sel_iter_t iter_a;    /* Selection a iteration info */
+    H5S_sel_iter_t iter_b;    /* Selection b iteration info */
+    hbool_t iter_a_init = 0;  /* Selection a iteration info has been initialized */
+    hbool_t iter_b_init = 0;  /* Selection b iteration info has been initialized */
+    htri_t ret_value = TRUE; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space1);
+    HDassert(space2);
+
+    /* Special case for one or both dataspaces being scalar */
+    if(space1->extent.rank == 0 || space2->extent.rank == 0) {
+        /* Check for different number of elements selected */
+        if(H5S_GET_SELECT_NPOINTS(space1) != H5S_GET_SELECT_NPOINTS(space2))
+            HGOTO_DONE(FALSE)
+    } /* end if */
+    else {
+        const H5S_t *space_a;           /* Dataspace with larger rank */
+        const H5S_t *space_b;           /* Dataspace with smaller rank */
+        unsigned space_a_rank;          /* Number of dimensions of dataspace A */
+        unsigned space_b_rank;          /* Number of dimensions of dataspace B */
+
+        /* need to be able to handle spaces of different rank:
+         *
+         * To simplify logic, let space_a point to the element of the set
+         * {space1, space2} with the largest rank or space1 if the ranks 
+         * are identical.
+         *
+         * Similarly, let space_b point to the element of {space1, space2}
+         * with the smallest rank, or space2 if they are identical.
+         *
+         * Let:  space_a_rank be the rank of space_a, 
+         *       space_b_rank be the rank of space_b,
+         *       delta_rank = space_a_rank - space_b_rank.
+         *
+         * Set all this up below.
+         */
+        if(space1->extent.rank >= space2->extent.rank) {
+            space_a = space1;
+            space_a_rank = space_a->extent.rank;
+
+            space_b = space2;
+            space_b_rank = space_b->extent.rank;
+        } /* end if */
+        else {
+            space_a = space2;
+            space_a_rank = space_a->extent.rank;
+
+            space_b = space1;
+            space_b_rank = space_b->extent.rank;
+        } /* end else */
+        HDassert(space_a_rank >= space_b_rank);
+        HDassert(space_b_rank > 0);
+
+        /* Check for different number of elements selected */
+        if(H5S_GET_SELECT_NPOINTS(space_a) != H5S_GET_SELECT_NPOINTS(space_b))
+            HGOTO_DONE(FALSE)
+
+        /* Check for "easy" cases before getting into generalized block iteration code */
+        if((H5S_GET_SELECT_TYPE(space_a) == H5S_SEL_ALL) && (H5S_GET_SELECT_TYPE(space_b) == H5S_SEL_ALL)) {
+            hsize_t dims1[H5O_LAYOUT_NDIMS];    /* End point of selection block in dataspace #1 */
+            hsize_t dims2[H5O_LAYOUT_NDIMS];    /* End point of selection block in dataspace #2 */
+            int space_a_dim;                /* Current dimension in dataspace A */
+            int space_b_dim;                /* Current dimension in dataspace B */
+
+            if(H5S_get_simple_extent_dims(space_a, dims1, NULL) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality")
+            if(H5S_get_simple_extent_dims(space_b, dims2, NULL) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality")
+
+            space_a_dim = (int)space_a_rank - 1;
+            space_b_dim = (int)space_b_rank - 1;
+
+            /* recall that space_a_rank >= space_b_rank. 
+             *
+             * In the following while loop, we test to see if space_a and space_b
+             * have identical size in all dimensions they have in common.
+             */
+            while(space_b_dim >= 0) {
+                if(dims1[space_a_dim] != dims2[space_b_dim])
+                    HGOTO_DONE(FALSE)
+
+                space_a_dim--;
+                space_b_dim--;
+            } /* end while */
+
+            /* Since we are selecting the entire spaces, we must also verify that space_a 
+             * has size 1 in all dimensions that it does not share with space_b.
+             */
+            while(space_a_dim >= 0) {
+                if(dims1[space_a_dim] != 1)
+                    HGOTO_DONE(FALSE)
+
+                space_a_dim--;
+            } /* end while */
+        } /* end if */
+        else if((H5S_GET_SELECT_TYPE(space1) == H5S_SEL_NONE) || (H5S_GET_SELECT_TYPE(space2) == H5S_SEL_NONE)) {
+            HGOTO_DONE(TRUE)
+        } /* end if */
+        else if((H5S_GET_SELECT_TYPE(space_a) == H5S_SEL_HYPERSLABS && space_a->select.sel_info.hslab->diminfo_valid)
+                && (H5S_GET_SELECT_TYPE(space_b) == H5S_SEL_HYPERSLABS && space_b->select.sel_info.hslab->diminfo_valid)) {
+            int space_a_dim;                /* Current dimension in dataspace A */
+            int space_b_dim;                /* Current dimension in dataspace B */
+
+            space_a_dim = (int)space_a_rank - 1;
+            space_b_dim = (int)space_b_rank - 1;
+
+            /* check that the shapes are the same in the common dimensions, and that
+             * block == 1 in all dimensions that appear only in space_a.
+             */
+            while(space_b_dim >= 0) {
+                if(space_a->select.sel_info.hslab->opt_diminfo[space_a_dim].stride != 
+                        space_b->select.sel_info.hslab->opt_diminfo[space_b_dim].stride)
+                    HGOTO_DONE(FALSE)
+
+                if(space_a->select.sel_info.hslab->opt_diminfo[space_a_dim].count !=
+                        space_b->select.sel_info.hslab->opt_diminfo[space_b_dim].count)
+                    HGOTO_DONE(FALSE)
+
+                if(space_a->select.sel_info.hslab->opt_diminfo[space_a_dim].block != 
+                        space_b->select.sel_info.hslab->opt_diminfo[space_b_dim].block)
+                    HGOTO_DONE(FALSE)
+
+                space_a_dim--;
+                space_b_dim--;
+            } /* end while */
+
+            while(space_a_dim >= 0) {
+                if(space_a->select.sel_info.hslab->opt_diminfo[space_a_dim].block != 1)
+                    HGOTO_DONE(FALSE)
+
+                space_a_dim--;
+            } /* end while */
+        } /* end if */
+        /* Iterate through all the blocks in the selection */
+        else {
+            hsize_t start_a[H5O_LAYOUT_NDIMS]; /* Start point of selection block in dataspace a */
+            hsize_t start_b[H5O_LAYOUT_NDIMS]; /* Start point of selection block in dataspace b */
+            hsize_t end_a[H5O_LAYOUT_NDIMS];   /* End point of selection block in dataspace a */
+            hsize_t end_b[H5O_LAYOUT_NDIMS];   /* End point of selection block in dataspace b */
+            hsize_t off_a[H5O_LAYOUT_NDIMS];   /* Offset of selection a blocks */
+            hsize_t off_b[H5O_LAYOUT_NDIMS];   /* Offset of selection b blocks */
+            hbool_t first_block = TRUE;        /* Flag to indicate the first block */
+
+            /* Initialize iterator for each dataspace selection
+             * Use '0' for element size instead of actual element size to indicate
+             * that the selection iterator shouldn't be "flattened", since we
+             * aren't actually going to be doing I/O with the iterators.
+             */
+            if(H5S_select_iter_init(&iter_a, space_a, (size_t)0) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator a")
+            iter_a_init = 1;
+            if(H5S_select_iter_init(&iter_b, space_b, (size_t)0) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator b")
+            iter_b_init = 1;
+
+            /* Iterate over all the blocks in each selection */
+            while(1) {
+                int space_a_dim;                /* Current dimension in dataspace A */
+                int space_b_dim;                /* Current dimension in dataspace B */
+                htri_t status_a, status_b;      /* Status from next block checks */
+
+                /* Get the current block for each selection iterator */
+                if(H5S_SELECT_ITER_BLOCK(&iter_a, start_a, end_a) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block a")
+                if(H5S_SELECT_ITER_BLOCK(&iter_b, start_b, end_b) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block b")
+
+                space_a_dim = (int)space_a_rank - 1;
+                space_b_dim = (int)space_b_rank - 1;
+
+                /* The first block only compares the sizes and sets the 
+                 * relative offsets for later blocks 
+                 */
+                if(first_block) {
+                    /* If the block sizes in the common dimensions from 
+                     * each selection don't match, get out
+                     */
+                    while(space_b_dim >= 0) {
+                        if((end_a[space_a_dim] - start_a[space_a_dim]) !=
+                                (end_b[space_b_dim] - start_b[space_b_dim]))
+                            HGOTO_DONE(FALSE)
+
+                        /* Set the relative locations of the selections */
+                        off_a[space_a_dim] = start_a[space_a_dim];
+                        off_b[space_b_dim] = start_b[space_b_dim];
+
+                        space_a_dim--;
+                        space_b_dim--;
+                    } /* end while */
+
+                    /* similarly, if the block size in any dimension that appears only
+                     * in space_a is not equal to 1, get out.
+                     */
+                    while(space_a_dim >= 0) {
+                        if((end_a[space_a_dim] - start_a[space_a_dim]) != 0)
+                            HGOTO_DONE(FALSE)
+
+                        /* Set the relative locations of the selections */
+                        off_a[space_a_dim] = start_a[space_a_dim];
+
+                        space_a_dim--;
+                    } /* end while */
+
+                    /* Reset "first block" flag */
+                    first_block = FALSE;
+                } /* end if */
+                /* Check over the blocks for each selection */
+                else {
+                    /* for dimensions that space_a and space_b have in common: */
+                    while(space_b_dim >= 0) {
+                        /* Check if the blocks are in the same relative location */
+                        if((start_a[space_a_dim] - off_a[space_a_dim]) !=
+                                (start_b[space_b_dim] - off_b[space_b_dim]))
+                            HGOTO_DONE(FALSE)
+
+                        /* If the block sizes from each selection doesn't match, get out */
+                        if((end_a[space_a_dim] - start_a[space_a_dim]) !=
+                                (end_b[space_b_dim] - start_b[space_b_dim]))
+                            HGOTO_DONE(FALSE)
+
+                        space_a_dim--;
+                        space_b_dim--;
+                    } /* end while */
+
+                    /* For dimensions that appear only in space_a: */
+                    while(space_a_dim >= 0) {
+                        /* If the block size isn't 1, get out */
+                        if((end_a[space_a_dim] - start_a[space_a_dim]) != 0)
+                            HGOTO_DONE(FALSE)
+
+                        space_a_dim--;
+                    } /* end while */
+                } /* end else */
+
+                /* Check if we are able to advance to the next selection block */
+                if((status_a = H5S_SELECT_ITER_HAS_NEXT_BLOCK(&iter_a)) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block a")
+
+                if((status_b = H5S_SELECT_ITER_HAS_NEXT_BLOCK(&iter_b)) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block b")
+
+                /* Did we run out of blocks at the same time? */
+                if((status_a == FALSE) && (status_b == FALSE))
+                    break;
+                else if(status_a != status_b)
+                    HGOTO_DONE(FALSE)
+                else {
+                    /* Advance to next block in selection iterators */
+                    if(H5S_SELECT_ITER_NEXT_BLOCK(&iter_a) < 0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block a")
+
+                    if(H5S_SELECT_ITER_NEXT_BLOCK(&iter_b) < 0)
+                        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block b")
+                } /* end else */
+            } /* end while */
+        } /* end else */
+    } /* end else */
+
+done:
+    if(iter_a_init)
+        if(H5S_SELECT_ITER_RELEASE(&iter_a) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator a")
+    if(iter_b_init)
+        if(H5S_SELECT_ITER_RELEASE(&iter_b) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator b")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_shape_same() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_construct_projection
+
+ PURPOSE
+    Given a dataspace a of rank n with some selection, construct a new
+    dataspace b of rank m (m != n), with the selection in a being 
+    topologically identical to that in b (as verified by 
+    H5S_select_shape_same().
+
+    This function exists, as some I/O code chokes of topologically 
+    identical selections with different ranks.  At least to begin 
+    with, we will deal with the issue by constructing projections
+    of the memory dataspace with ranks equaling those of the file 
+    dataspace.
+
+    Note that if m > n, it is possible that the starting point in the 
+    buffer associated with the memory dataspace will have to be 
+    adjusted to match the projected dataspace.  If the buf parameter
+    is not NULL, the function must return an adjusted buffer base
+    address in *adj_buf_ptr.
+
+ USAGE
+    htri_t H5S_select_construct_projection(base_space, 
+                                           new_space_ptr,
+                                           new_space_rank,
+                                           buf,
+                                           adj_buf_ptr)
+        const H5S_t *base_space;     IN: Ptr to Dataspace to project
+        H5S_t ** new_space_ptr;     OUT: Ptr to location in which to return
+					 the address of the projected space
+        int new_space_rank;	     IN: Rank of the projected space.
+        const void * buf;            IN: Base address of the buffer 
+					 associated with the base space.
+					 May be NULL.
+        void ** adj_buf_ptr;        OUT: If buf != NULL, store the base
+					 address of the section of buf 
+					 that is described by *new_space_ptr
+					 in *adj_buf_ptr.
+					 
+ RETURNS
+    Non-negative on success/Negative on failure.
+
+ DESCRIPTION
+    Construct a new dataspace and associated selection which is a 
+    projection of the supplied dataspace and associated selection into 
+    the specified rank.  Return it in *new_space_ptr.
+
+    If buf is supplied, computes the base address of the projected 
+    selection in buf, and stores the base address in *adj_buf_ptr.
+    
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The selection in the supplied base_space has thickness 1 in all 
+    dimensions greater than new_space_rank.  Note that here we count
+    dimensions from the fastest changing coordinate to the slowest 
+    changing changing coordinate.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
+    unsigned new_space_rank, const void *buf, void const **adj_buf_ptr, hsize_t element_size)
+{
+    H5S_t * new_space = NULL;           /* New dataspace constructed */
+    hsize_t base_space_dims[H5S_MAX_RANK];      /* Current dimensions of base dataspace */
+    hsize_t base_space_maxdims[H5S_MAX_RANK];   /* Maximum dimensions of base dataspace */
+    int sbase_space_rank;               /* Signed # of dimensions of base dataspace */
+    unsigned base_space_rank;           /* # of dimensions of base dataspace */
+    hsize_t projected_space_element_offset = 0; /* Offset of selected element in projected buffer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(base_space != NULL);
+    HDassert((H5S_GET_EXTENT_TYPE(base_space) == H5S_SCALAR) || (H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE));
+    HDassert(new_space_ptr != NULL);
+    HDassert((new_space_rank != 0) || (H5S_GET_SELECT_NPOINTS(base_space) <= 1));
+    HDassert(new_space_rank <= H5S_MAX_RANK);
+    HDassert((buf == NULL) || (adj_buf_ptr != NULL));
+    HDassert(element_size > 0 );
+
+    /* Get the extent info for the base dataspace */
+    if((sbase_space_rank = H5S_get_simple_extent_dims(base_space, base_space_dims, base_space_maxdims)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality of base space")
+    base_space_rank = (unsigned)sbase_space_rank;
+    HDassert(base_space_rank != new_space_rank);
+
+    /* Check if projected space is scalar */
+    if(new_space_rank == 0) {
+        hssize_t npoints;               /* Number of points selected */
+
+        /* Retreve the number of elements selected */
+        if((npoints = (hssize_t)H5S_GET_SELECT_NPOINTS(base_space)) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get number of points selected")
+        HDassert(npoints <= 1);
+
+        /* Create new scalar dataspace */
+        if(NULL == (new_space = H5S_create(H5S_SCALAR)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create scalar dataspace")
+    
+        /* No need to register the dataspace(i.e. get an ID) as
+         * we will just be discarding it shortly.
+         */
+
+        /* Selection for the new space will be either all or 
+         * none, depending on whether the base space has 0 or
+         * 1 elements selected.
+         *
+         * Observe that the base space can't have more than 
+         * one selected element, since its selection has the
+         * same shape as the file dataspace, and that data 
+         * space is scalar.
+         */
+        if(1 == npoints) {
+            /* Assuming that the selection in the base dataspace is not
+             * empty, we must compute the offset of the selected item in 
+             * the buffer associated with the base dataspace.
+             *
+             * Since the new space rank is zero, we know that the 
+             * the base space must have rank at least 1 -- and 
+             * hence it is a simple dataspace.  However, the 
+             * selection, may be either point, hyperspace, or all.
+             *
+             */
+            if(H5S_SELECT_PROJECT_SCALAR(base_space, &projected_space_element_offset) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to project scalar selection")
+        } /* end if */
+        else {
+            HDassert(0 == npoints);
+
+            if(H5S_select_none(new_space) < 0)
+                 HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't delete default selection")
+        } /* end else */
+    } /* end if */
+    else { /* projected space must be simple */
+        hsize_t new_space_dims[H5S_MAX_RANK];   /* Current dimensions for new dataspace */
+        hsize_t new_space_maxdims[H5S_MAX_RANK];/* Maximum dimensions for new dataspace */
+        unsigned rank_diff;             /* Difference in ranks */
+    
+        /* Set up the dimensions of the new, projected dataspace.
+         *
+         * How we do this depends on whether we are projecting up into 
+         * increased dimensions, or down into a reduced number of 
+         * dimensions.
+         *
+         * If we are projecting up (the first half of the following 
+         * if statement), we copy the dimensions of the base data 
+         * space into the fastest changing dimensions of the new 
+         * projected dataspace, and set the remaining dimensions to
+         * one.
+         *
+         * If we are projecting down (the second half of the following
+         * if statement), we just copy the dimensions with the most 
+         * quickly changing dimensions into the dims for the projected
+         * data set.
+         *
+         * This works, because H5S_select_shape_same() will return 
+         * true on selections of different rank iff:
+         *
+         * 1) the selection in the lower rank dataspace matches that
+         *    in the dimensions with the fastest changing indicies in
+         *    the larger rank dataspace, and
+         *
+         * 2) the selection has thickness 1 in all ranks that appear
+         *    only in the higher rank dataspace (i.e. those with 
+         *    more slowly changing indicies).
+         */ 
+        if(new_space_rank > base_space_rank) {
+            hsize_t tmp_dim_size = 1;   /* Temporary dimension value, for filling arrays */
+
+            /* we must copy the dimensions of the base space into 
+             * the fastest changing dimensions of the new space,
+             * and set the remaining dimensions to 1
+             */
+            rank_diff = new_space_rank - base_space_rank;
+            H5VM_array_fill(new_space_dims, &tmp_dim_size, sizeof(tmp_dim_size), rank_diff);
+            H5VM_array_fill(new_space_maxdims, &tmp_dim_size, sizeof(tmp_dim_size), rank_diff);
+            HDmemcpy(&new_space_dims[rank_diff], base_space_dims, sizeof(new_space_dims[0]) * base_space_rank);
+            HDmemcpy(&new_space_maxdims[rank_diff], base_space_maxdims, sizeof(new_space_maxdims[0]) * base_space_rank);
+        } /* end if */
+        else { /* new_space_rank < base_space_rank */
+            /* we must copy the fastest changing dimension of the 
+             * base space into the dimensions of the new space.
+             */
+            rank_diff = base_space_rank - new_space_rank;
+            HDmemcpy(new_space_dims, &base_space_dims[rank_diff], sizeof(new_space_dims[0]) * new_space_rank);
+            HDmemcpy(new_space_maxdims, &base_space_maxdims[rank_diff], sizeof(new_space_maxdims[0]) * new_space_rank);
+        } /* end else */
+
+        /* now have the new space rank and dimensions set up -- 
+         * so we can create the new simple dataspace.
+         */
+        if(NULL == (new_space = H5S_create_simple(new_space_rank, new_space_dims, new_space_maxdims)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+    
+        /* No need to register the dataspace(i.e. get an ID) as
+         * we will just be discarding it shortly.
+         */
+
+        /* If we get this far, we have successfully created the projected
+         * dataspace.  We must now project the selection in the base
+         * dataspace into the projected dataspace.
+         */
+        if(H5S_SELECT_PROJECT_SIMPLE(base_space, new_space, &projected_space_element_offset) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to project simple selection")
+    
+        /* If we get this far, we have created the new dataspace, and projected
+         * the selection in the base dataspace into the new dataspace.
+         *
+         * If the base dataspace is simple, check to see if the 
+         * offset_changed flag on the base selection has been set -- if so, 
+         * project the offset into the new dataspace and set the 
+         * offset_changed flag.
+         */
+        if(H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE && base_space->select.offset_changed) {
+            if(new_space_rank > base_space_rank) {
+                HDmemset(new_space->select.offset, 0, sizeof(new_space->select.offset[0]) * rank_diff);
+                HDmemcpy(&new_space->select.offset[rank_diff], base_space->select.offset, sizeof(new_space->select.offset[0]) * base_space_rank);
+            } /* end if */
+            else
+                HDmemcpy(new_space->select.offset, &base_space->select.offset[rank_diff], sizeof(new_space->select.offset[0]) * new_space_rank);
+
+            /* Propagate the offset changed flag into the new dataspace. */
+            new_space->select.offset_changed = TRUE;
+        } /* end if */
+    } /* end else */
+
+    /* If we have done the projection correctly, the following assertion
+     * should hold.
+     */
+    HDassert(TRUE == H5S_select_shape_same(base_space, new_space));
+
+    /* load the address of the new space into *new_space_ptr */
+    *new_space_ptr = new_space;
+
+    /* now adjust the buffer if required */
+    if(buf != NULL) {
+        if(new_space_rank < base_space_rank) {
+            /* a bit of pointer magic here:
+             *
+             * Since we can't do pointer arithmetic on void pointers, we first
+             * cast buf to a pointer to byte -- i.e. uint8_t.
+             *
+             * We then multiply the projected space element offset we 
+             * calculated earlier by the supplied element size, add this 
+             * value to the type cast buf pointer, cast the result back 
+             * to a pointer to void, and assign the result to *adj_buf_ptr.
+             */
+            *adj_buf_ptr = (const void *)(((const uint8_t *)buf) + 
+                    ((size_t)(projected_space_element_offset * element_size)));
+        } /* end if */
+        else
+            /* No adjustment necessary */
+            *adj_buf_ptr = buf;
+    } /* end if */
+
+done:
+    /* Cleanup on error */
+    if(ret_value < 0) {
+        if(new_space && H5S_close(new_space) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_construct_projection() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_fill
+ PURPOSE
+    Fill a selection in memory with a value
+ USAGE
+    herr_t H5S_select_fill(fill,fill_size,space,buf)
+        const void *fill;       IN: Pointer to fill value to use
+        size_t fill_size;       IN: Size of elements in memory buffer & size of
+                                    fill value
+        H5S_t *space;           IN: Dataspace describing memory buffer &
+                                    containing selection to use.
+        void *buf;              IN/OUT: Memory buffer to fill selection in
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Use the selection in the dataspace to fill elements in a memory buffer.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The memory buffer elements are assumed to have the same datatype as the
+    fill value being placed into them.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_buf)
+{
+    H5S_sel_iter_t iter;        /* Selection iteration info */
+    hbool_t iter_init = 0;      /* Selection iteration info has been initialized */
+    hssize_t nelmts;            /* Number of elements in selection */
+    size_t max_elem;            /* Total number of elements in selection */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(fill);
+    HDassert(fill_size > 0);
+    HDassert(space);
+    HDassert(_buf);
+
+    /* Initialize iterator */
+    if(H5S_select_iter_init(&iter, space, fill_size) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    iter_init = 1;	/* Selection iteration info has been initialized */
+
+    /* Get the number of elements in selection */
+    if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
+
+    /* Compute the number of bytes to process */
+    H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
+
+    /* Loop, while elements left in selection */
+    while(max_elem > 0) {
+        hsize_t off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
+        size_t len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
+        size_t nseq;                /* Number of sequences generated */
+        size_t curr_seq;            /* Current sequnce being worked on */
+        size_t nelem;               /* Number of elements used in sequences */
+
+        /* Get the sequences of bytes */
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, &iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+
+        /* Loop over sequences */
+        for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
+            uint8_t *buf;               /* Current location in buffer */
+
+            /* Get offset in memory buffer */
+            buf = (uint8_t *)_buf + off[curr_seq];
+
+            /* Fill each sequence in memory with fill value */
+            HDassert((len[curr_seq] % fill_size) == 0);
+            H5VM_array_fill(buf, fill, fill_size, (len[curr_seq] / fill_size));
+        } /* end for */
+
+        /* Decrement number of elements left to process */
+        max_elem -= nelem;
+    } /* end while */
+
+done:
+    /* Release resouces */
+    if(iter_init && H5S_SELECT_ITER_RELEASE(&iter) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_select_fill() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Stest.c b/gatb-core/thirdparty/hdf5/src/H5Stest.c
new file mode 100644
index 0000000..62a4179
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Stest.c
@@ -0,0 +1,111 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *              Saturday, May 31, 2003
+ *
+ * Purpose:	Dataspace selection testing functions.
+ */
+
+#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#define H5S_TESTING		/*suppress warning about H5S testing funcs*/
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Spkg.h"		/* Dataspaces 				*/
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_shape_same_test
+ PURPOSE
+    Determine if two dataspace selections are the same shape
+ USAGE
+    htri_t H5S_select_shape_same_test(sid1, sid2)
+        hid_t sid1;          IN: 1st dataspace to compare
+        hid_t sid2;          IN: 2nd dataspace to compare
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Checks to see if the current selection in the dataspaces are the same
+    dimensionality and shape.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_select_shape_same_test(hid_t sid1, hid_t sid2)
+{
+    H5S_t	*space1;                /* Pointer to 1st dataspace */
+    H5S_t	*space2;                /* Pointer to 2nd dataspace */
+    htri_t      ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get dataspace structures */
+    if(NULL == (space1 = (H5S_t *)H5I_object_verify(sid1, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(NULL == (space2 = (H5S_t *)H5I_object_verify(sid2, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Check if the dataspace selections are the same shape */
+    if((ret_value = H5S_select_shape_same(space1, space2)) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "unable to compare dataspace selections")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_select_shape_same_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_rebuild_status_test
+ PURPOSE
+    Determine the status of hyperslab rebuild
+ USAGE
+    htri_t H5S_inquiry_rebuild_status(hid_t space_id)
+        hid_t space_id;          IN:  dataspace id
+ RETURNS
+    Non-negative TRUE/FALSE on success, negative on failure
+ DESCRIPTION
+    Query the status of rebuilding the hyperslab
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5S_get_rebuild_status_test(hid_t space_id)
+{
+    H5S_t *space;               /* Pointer to 1st dataspace */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+     /* Get dataspace structures */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    ret_value = (htri_t)space->select.sel_info.hslab->diminfo_valid;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_get_rebuild_status_test() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5T.c b/gatb-core/thirdparty/hdf5/src/H5T.c
new file mode 100644
index 0000000..2083e2d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5T.c
@@ -0,0 +1,5525 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains most of the "core" functionality of
+ *      the H5T interface, including the API initialization code, etc.
+ *      Many routines that are infrequently used, or are specialized for
+ *      one particular datatype class are in another module.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5FOprivate.h"	/* File objects				*/
+#include "H5Gprivate.h"		/* Groups				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Tpkg.h"		/* Datatypes 				*/
+
+/* Check for header needed for SGI floating-point code */
+#ifdef H5_HAVE_SYS_FPU_H
+#include <sys/fpu.h>
+#endif /* H5_HAVE_SYS_FPU_H */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define H5T_ENCODE_VERSION      0
+
+/*
+ * Type initialization macros
+ *
+ * These use the "template macro" technique to reduce the amount of gratuitous
+ * duplicated code when initializing the datatypes for the library.  The main
+ * template macro is the H5T_INIT_TYPE() macro below.
+ *
+ */
+
+/* Define the code template for bitfields for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_BITFIELD_CORE {					      \
+    dt->shared->type = H5T_BITFIELD;					      \
+}
+
+/* Define the code template for times for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_TIME_CORE {					      \
+    dt->shared->type = H5T_TIME;					      \
+}
+
+/* Define the code template for types which reset the offset for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_OFFSET_CORE {					      \
+    dt->shared->u.atomic.offset = 0;					      \
+}
+
+/* Define common code for all numeric types (floating-point & int, signed & unsigned) */
+#define H5T_INIT_TYPE_NUM_COMMON(ENDIANNESS) {				      \
+    dt->shared->u.atomic.order = ENDIANNESS;				      \
+    dt->shared->u.atomic.offset = 0;					      \
+    dt->shared->u.atomic.lsb_pad = H5T_PAD_ZERO;			      \
+    dt->shared->u.atomic.msb_pad = H5T_PAD_ZERO;			      \
+}
+
+/* Define the code templates for standard floats for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_FLOAT_COMMON(ENDIANNESS) {			      \
+    H5T_INIT_TYPE_NUM_COMMON(ENDIANNESS)				      \
+    dt->shared->u.atomic.u.f.sign = 31;					      \
+    dt->shared->u.atomic.u.f.epos = 23;					      \
+    dt->shared->u.atomic.u.f.esize = 8;					      \
+    dt->shared->u.atomic.u.f.ebias = 0x7f;				      \
+    dt->shared->u.atomic.u.f.mpos = 0;					      \
+    dt->shared->u.atomic.u.f.msize = 23;				      \
+    dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;			      \
+    dt->shared->u.atomic.u.f.pad = H5T_PAD_ZERO;			      \
+}
+
+#define H5T_INIT_TYPE_FLOATLE_CORE {					      \
+    H5T_INIT_TYPE_FLOAT_COMMON(H5T_ORDER_LE)				      \
+}
+
+#define H5T_INIT_TYPE_FLOATBE_CORE {					      \
+    H5T_INIT_TYPE_FLOAT_COMMON(H5T_ORDER_BE)				      \
+}
+
+/* Define the code templates for standard doubles for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_DOUBLE_COMMON(ENDIANNESS) {			      \
+    H5T_INIT_TYPE_NUM_COMMON(ENDIANNESS)				      \
+    dt->shared->u.atomic.u.f.sign = 63;					      \
+    dt->shared->u.atomic.u.f.epos = 52;					      \
+    dt->shared->u.atomic.u.f.esize = 11;				      \
+    dt->shared->u.atomic.u.f.ebias = 0x03ff;				      \
+    dt->shared->u.atomic.u.f.mpos = 0;					      \
+    dt->shared->u.atomic.u.f.msize = 52;				      \
+    dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;			      \
+    dt->shared->u.atomic.u.f.pad = H5T_PAD_ZERO;			      \
+}
+
+#define H5T_INIT_TYPE_DOUBLELE_CORE {					      \
+    H5T_INIT_TYPE_DOUBLE_COMMON(H5T_ORDER_LE)				      \
+}
+
+#define H5T_INIT_TYPE_DOUBLEBE_CORE {					      \
+    H5T_INIT_TYPE_DOUBLE_COMMON(H5T_ORDER_BE)				      \
+}
+
+/* Define the code templates for VAX float for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_FLOATVAX_CORE {			                      \
+    H5T_INIT_TYPE_NUM_COMMON(H5T_ORDER_VAX)				      \
+    dt->shared->u.atomic.u.f.sign = 31;					      \
+    dt->shared->u.atomic.u.f.epos = 23;					      \
+    dt->shared->u.atomic.u.f.esize = 8;					      \
+    dt->shared->u.atomic.u.f.ebias = 0x81;				      \
+    dt->shared->u.atomic.u.f.mpos = 0;					      \
+    dt->shared->u.atomic.u.f.msize = 23;				      \
+    dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;			      \
+    dt->shared->u.atomic.u.f.pad = H5T_PAD_ZERO;			      \
+    dt->shared->version = H5O_DTYPE_VERSION_3;				      \
+}
+
+/* Define the code templates for VAX double for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_DOUBLEVAX_CORE {                                        \
+    H5T_INIT_TYPE_NUM_COMMON(H5T_ORDER_VAX)				      \
+    dt->shared->u.atomic.u.f.sign = 63;					      \
+    dt->shared->u.atomic.u.f.epos = 52;					      \
+    dt->shared->u.atomic.u.f.esize = 11;				      \
+    dt->shared->u.atomic.u.f.ebias = 0x0401;				      \
+    dt->shared->u.atomic.u.f.mpos = 0;					      \
+    dt->shared->u.atomic.u.f.msize = 52;				      \
+    dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;			      \
+    dt->shared->u.atomic.u.f.pad = H5T_PAD_ZERO;			      \
+    dt->shared->version = H5O_DTYPE_VERSION_3;				      \
+}
+
+/* Define the code templates for standard signed integers for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_SINT_COMMON(ENDIANNESS) {				      \
+    H5T_INIT_TYPE_NUM_COMMON(ENDIANNESS)				      \
+    dt->shared->u.atomic.u.i.sign = H5T_SGN_2;				      \
+}
+
+#define H5T_INIT_TYPE_SINTLE_CORE {					      \
+    H5T_INIT_TYPE_SINT_COMMON(H5T_ORDER_LE)				      \
+}
+
+#define H5T_INIT_TYPE_SINTBE_CORE {					      \
+    H5T_INIT_TYPE_SINT_COMMON(H5T_ORDER_BE)				      \
+}
+
+/* Define the code templates for standard unsigned integers for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_UINT_COMMON(ENDIANNESS) {				      \
+    H5T_INIT_TYPE_NUM_COMMON(ENDIANNESS)				      \
+    dt->shared->u.atomic.u.i.sign = H5T_SGN_NONE;				      \
+}
+
+#define H5T_INIT_TYPE_UINTLE_CORE {					      \
+    H5T_INIT_TYPE_UINT_COMMON(H5T_ORDER_LE)				      \
+}
+
+#define H5T_INIT_TYPE_UINTBE_CORE {					      \
+    H5T_INIT_TYPE_UINT_COMMON(H5T_ORDER_BE)				      \
+}
+
+/* Define a macro for common code for all newly allocate datatypes */
+#define H5T_INIT_TYPE_ALLOC_COMMON(TYPE) {				      \
+    dt->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;				      \
+    dt->shared->type = TYPE;						      \
+}
+
+/* Define the code templates for opaque for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_OPAQ_CORE {					      \
+    H5T_INIT_TYPE_ALLOC_COMMON(H5T_OPAQUE)				      \
+    dt->shared->u.opaque.tag = H5MM_xstrdup("");			      \
+}
+
+/* Define the code templates for strings for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_STRING_COMMON {					      \
+    H5T_INIT_TYPE_ALLOC_COMMON(H5T_STRING)				      \
+    H5T_INIT_TYPE_NUM_COMMON(H5T_ORDER_NONE)				      \
+    dt->shared->u.atomic.u.s.cset = H5F_DEFAULT_CSET;			      \
+}
+
+#define H5T_INIT_TYPE_CSTRING_CORE {					      \
+    H5T_INIT_TYPE_STRING_COMMON						      \
+    dt->shared->u.atomic.u.s.pad = H5T_STR_NULLTERM;			      \
+}
+
+#define H5T_INIT_TYPE_FORSTRING_CORE {					      \
+    H5T_INIT_TYPE_STRING_COMMON						      \
+    dt->shared->u.atomic.u.s.pad = H5T_STR_SPACEPAD;			      \
+}
+
+/* Define the code templates for references for the "GUTS" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_REF_COMMON {					      \
+    H5T_INIT_TYPE_ALLOC_COMMON(H5T_REFERENCE)				      \
+    H5T_INIT_TYPE_NUM_COMMON(H5T_ORDER_NONE)				      \
+}
+
+#define H5T_INIT_TYPE_OBJREF_CORE {					      \
+    H5T_INIT_TYPE_REF_COMMON						      \
+    dt->shared->force_conv = TRUE;					      \
+    dt->shared->u.atomic.u.r.rtype = H5R_OBJECT;			      \
+    dt->shared->u.atomic.u.r.loc = H5T_LOC_MEMORY;			      \
+}
+
+#define H5T_INIT_TYPE_REGREF_CORE {					      \
+    H5T_INIT_TYPE_REF_COMMON						      \
+    dt->shared->u.atomic.u.r.rtype = H5R_DATASET_REGION;		      \
+}
+
+/* Define the code templates for the "SIZE_TMPL" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_SET_SIZE(SIZE) {					      \
+    dt->shared->size = SIZE;						      \
+    dt->shared->u.atomic.prec = 8 * SIZE;				      \
+}
+
+#define H5T_INIT_TYPE_NOSET_SIZE(SIZE) {				      \
+}
+
+/* Define the code templates for the "CRT_TMPL" in the H5T_INIT_TYPE macro */
+#define H5T_INIT_TYPE_COPY_CREATE(BASE) {				      \
+    /* Base off of existing datatype */					      \
+    if(NULL == (dt = H5T_copy(BASE, H5T_COPY_TRANSIENT)))		      \
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, FAIL, "duplicating base type failed") \
+}
+
+#define H5T_INIT_TYPE_ALLOC_CREATE(BASE) {				      \
+    /* Allocate new datatype info */					      \
+    if(NULL == (dt = H5T__alloc()))				              \
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "memory allocation failed") \
+}
+
+
+#define H5T_INIT_TYPE(GUTS,GLOBAL,CRT_TMPL,BASE,SIZE_TMPL,SIZE) {	      \
+    /* Get new datatype struct */					      \
+    H5_GLUE3(H5T_INIT_TYPE_,CRT_TMPL,_CREATE)(BASE)			      \
+									      \
+    /* Adjust information for all types */				      \
+    dt->shared->state = H5T_STATE_IMMUTABLE;				      \
+    H5_GLUE3(H5T_INIT_TYPE_,SIZE_TMPL,_SIZE)(SIZE)			      \
+									      \
+    /* Adjust information for this type */				      \
+    H5_GLUE3(H5T_INIT_TYPE_, GUTS, _CORE)				      \
+									      \
+    /* Atomize result */						      \
+    if((GLOBAL = H5I_register(H5I_DATATYPE, dt, FALSE)) < 0)			      \
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom") \
+}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src,
+                H5T_t *dst, H5T_conv_t func, hid_t dxpl_id);
+static herr_t H5T_register(H5T_pers_t pers, const char *name, H5T_t *src,
+        H5T_t *dst, H5T_conv_t func, hid_t dxpl_id, hbool_t api_call);
+static htri_t H5T_compiler_conv(H5T_t *src, H5T_t *dst);
+static herr_t H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc);
+static H5T_t *H5T_decode(const unsigned char *buf);
+static herr_t H5T_set_size(H5T_t *dt, size_t size);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* The native endianess of the platform */
+H5T_order_t H5T_native_order_g = H5T_ORDER_ERROR;
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/*
+ * Predefined data types. These are initialized at runtime in H5Tinit.c and
+ * by H5T_init_interface() in this source file.
+ *
+ * If more of these are added, the new ones must be added to the list of
+ * types to reset in H5T_term_interface().
+ */
+hid_t H5T_IEEE_F32BE_g			= FAIL;
+hid_t H5T_IEEE_F32LE_g			= FAIL;
+hid_t H5T_IEEE_F64BE_g			= FAIL;
+hid_t H5T_IEEE_F64LE_g			= FAIL;
+
+hid_t H5T_VAX_F32_g			= FAIL;
+hid_t H5T_VAX_F64_g			= FAIL;
+
+hid_t H5T_STD_I8BE_g			= FAIL;
+hid_t H5T_STD_I8LE_g			= FAIL;
+hid_t H5T_STD_I16BE_g			= FAIL;
+hid_t H5T_STD_I16LE_g			= FAIL;
+hid_t H5T_STD_I32BE_g			= FAIL;
+hid_t H5T_STD_I32LE_g			= FAIL;
+hid_t H5T_STD_I64BE_g			= FAIL;
+hid_t H5T_STD_I64LE_g			= FAIL;
+hid_t H5T_STD_U8BE_g			= FAIL;
+hid_t H5T_STD_U8LE_g			= FAIL;
+hid_t H5T_STD_U16BE_g			= FAIL;
+hid_t H5T_STD_U16LE_g			= FAIL;
+hid_t H5T_STD_U32BE_g			= FAIL;
+hid_t H5T_STD_U32LE_g			= FAIL;
+hid_t H5T_STD_U64BE_g			= FAIL;
+hid_t H5T_STD_U64LE_g			= FAIL;
+hid_t H5T_STD_B8BE_g			= FAIL;
+hid_t H5T_STD_B8LE_g			= FAIL;
+hid_t H5T_STD_B16BE_g			= FAIL;
+hid_t H5T_STD_B16LE_g			= FAIL;
+hid_t H5T_STD_B32BE_g			= FAIL;
+hid_t H5T_STD_B32LE_g			= FAIL;
+hid_t H5T_STD_B64BE_g			= FAIL;
+hid_t H5T_STD_B64LE_g 			= FAIL;
+hid_t H5T_STD_REF_OBJ_g 		= FAIL;
+hid_t H5T_STD_REF_DSETREG_g 		= FAIL;
+
+hid_t H5T_UNIX_D32BE_g			= FAIL;
+hid_t H5T_UNIX_D32LE_g			= FAIL;
+hid_t H5T_UNIX_D64BE_g			= FAIL;
+hid_t H5T_UNIX_D64LE_g 			= FAIL;
+
+hid_t H5T_C_S1_g			= FAIL;
+
+hid_t H5T_FORTRAN_S1_g			= FAIL;
+
+hid_t H5T_NATIVE_SCHAR_g		= FAIL;
+hid_t H5T_NATIVE_UCHAR_g		= FAIL;
+hid_t H5T_NATIVE_SHORT_g		= FAIL;
+hid_t H5T_NATIVE_USHORT_g		= FAIL;
+hid_t H5T_NATIVE_INT_g			= FAIL;
+hid_t H5T_NATIVE_UINT_g			= FAIL;
+hid_t H5T_NATIVE_LONG_g			= FAIL;
+hid_t H5T_NATIVE_ULONG_g		= FAIL;
+hid_t H5T_NATIVE_LLONG_g		= FAIL;
+hid_t H5T_NATIVE_ULLONG_g		= FAIL;
+hid_t H5T_NATIVE_FLOAT_g		= FAIL;
+hid_t H5T_NATIVE_DOUBLE_g		= FAIL;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+hid_t H5T_NATIVE_LDOUBLE_g		= FAIL;
+#endif
+hid_t H5T_NATIVE_B8_g			= FAIL;
+hid_t H5T_NATIVE_B16_g			= FAIL;
+hid_t H5T_NATIVE_B32_g			= FAIL;
+hid_t H5T_NATIVE_B64_g			= FAIL;
+hid_t H5T_NATIVE_OPAQUE_g		= FAIL;
+hid_t H5T_NATIVE_HADDR_g		= FAIL;
+hid_t H5T_NATIVE_HSIZE_g		= FAIL;
+hid_t H5T_NATIVE_HSSIZE_g		= FAIL;
+hid_t H5T_NATIVE_HERR_g			= FAIL;
+hid_t H5T_NATIVE_HBOOL_g		= FAIL;
+
+hid_t H5T_NATIVE_INT8_g			= FAIL;
+hid_t H5T_NATIVE_UINT8_g		= FAIL;
+hid_t H5T_NATIVE_INT_LEAST8_g		= FAIL;
+hid_t H5T_NATIVE_UINT_LEAST8_g		= FAIL;
+hid_t H5T_NATIVE_INT_FAST8_g		= FAIL;
+hid_t H5T_NATIVE_UINT_FAST8_g		= FAIL;
+
+hid_t H5T_NATIVE_INT16_g		= FAIL;
+hid_t H5T_NATIVE_UINT16_g		= FAIL;
+hid_t H5T_NATIVE_INT_LEAST16_g		= FAIL;
+hid_t H5T_NATIVE_UINT_LEAST16_g		= FAIL;
+hid_t H5T_NATIVE_INT_FAST16_g		= FAIL;
+hid_t H5T_NATIVE_UINT_FAST16_g		= FAIL;
+
+hid_t H5T_NATIVE_INT32_g		= FAIL;
+hid_t H5T_NATIVE_UINT32_g		= FAIL;
+hid_t H5T_NATIVE_INT_LEAST32_g		= FAIL;
+hid_t H5T_NATIVE_UINT_LEAST32_g		= FAIL;
+hid_t H5T_NATIVE_INT_FAST32_g		= FAIL;
+hid_t H5T_NATIVE_UINT_FAST32_g		= FAIL;
+
+hid_t H5T_NATIVE_INT64_g		= FAIL;
+hid_t H5T_NATIVE_UINT64_g		= FAIL;
+hid_t H5T_NATIVE_INT_LEAST64_g		= FAIL;
+hid_t H5T_NATIVE_UINT_LEAST64_g		= FAIL;
+hid_t H5T_NATIVE_INT_FAST64_g		= FAIL;
+hid_t H5T_NATIVE_UINT_FAST64_g		= FAIL;
+
+/*
+ * Alignment constraints for native types. These are initialized at run time
+ * in H5Tinit.c.  These alignments are mainly for offsets in HDF5 compound
+ * datatype or C structures, which are different from the alignments for memory
+ * address below this group of variables.
+ */
+size_t H5T_NATIVE_SCHAR_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_UCHAR_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_SHORT_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_USHORT_COMP_ALIGN_g   	= 0;
+size_t H5T_NATIVE_INT_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_LONG_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_ULONG_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_LLONG_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_ULLONG_COMP_ALIGN_g	        = 0;
+size_t H5T_NATIVE_FLOAT_COMP_ALIGN_g		= 0;
+size_t H5T_NATIVE_DOUBLE_COMP_ALIGN_g	        = 0;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+size_t H5T_NATIVE_LDOUBLE_COMP_ALIGN_g	        = 0;
+#endif
+
+size_t H5T_POINTER_COMP_ALIGN_g	                = 0;
+size_t H5T_HVL_COMP_ALIGN_g	                = 0;
+size_t H5T_HOBJREF_COMP_ALIGN_g	                = 0;
+size_t H5T_HDSETREGREF_COMP_ALIGN_g	        = 0;
+
+/*
+ * Alignment constraints for native types. These are initialized at run time
+ * in H5Tinit.c
+ */
+size_t H5T_NATIVE_SCHAR_ALIGN_g		= 0;
+size_t H5T_NATIVE_UCHAR_ALIGN_g		= 0;
+size_t H5T_NATIVE_SHORT_ALIGN_g		= 0;
+size_t H5T_NATIVE_USHORT_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT_ALIGN_g		= 0;
+size_t H5T_NATIVE_LONG_ALIGN_g		= 0;
+size_t H5T_NATIVE_ULONG_ALIGN_g		= 0;
+size_t H5T_NATIVE_LLONG_ALIGN_g		= 0;
+size_t H5T_NATIVE_ULLONG_ALIGN_g	= 0;
+size_t H5T_NATIVE_FLOAT_ALIGN_g		= 0;
+size_t H5T_NATIVE_DOUBLE_ALIGN_g	= 0;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+size_t H5T_NATIVE_LDOUBLE_ALIGN_g	= 0;
+#endif
+
+/*
+ * Alignment constraints for C9x types. These are initialized at run time in
+ * H5Tinit.c if the types are provided by the system. Otherwise we set their
+ * values to 0 here (no alignment calculated).
+ */
+size_t H5T_NATIVE_INT8_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT8_ALIGN_g		= 0;
+size_t H5T_NATIVE_INT_LEAST8_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_LEAST8_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_FAST8_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_FAST8_ALIGN_g	= 0;
+
+size_t H5T_NATIVE_INT16_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT16_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_LEAST16_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_LEAST16_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_FAST16_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_FAST16_ALIGN_g	= 0;
+
+size_t H5T_NATIVE_INT32_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT32_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_LEAST32_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_LEAST32_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_FAST32_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_FAST32_ALIGN_g	= 0;
+
+size_t H5T_NATIVE_INT64_ALIGN_g		= 0;
+size_t H5T_NATIVE_UINT64_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_LEAST64_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_LEAST64_ALIGN_g	= 0;
+size_t H5T_NATIVE_INT_FAST64_ALIGN_g	= 0;
+size_t H5T_NATIVE_UINT_FAST64_ALIGN_g	= 0;
+
+/* Useful floating-point values for conversion routines */
+/* (+/- Inf for all floating-point types) */
+float H5T_NATIVE_FLOAT_POS_INF_g        = 0.0f;
+float H5T_NATIVE_FLOAT_NEG_INF_g        = 0.0f;
+double H5T_NATIVE_DOUBLE_POS_INF_g      = (double)0.0f;
+double H5T_NATIVE_DOUBLE_NEG_INF_g      = (double)0.0f;
+
+/* Declare the free list for H5T_t's and H5T_shared_t's */
+H5FL_DEFINE(H5T_t);
+H5FL_DEFINE(H5T_shared_t);
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/*
+ * The path database. Each path has a source and destination data type pair
+ * which is used as the key by which the `entries' array is sorted.
+ */
+static struct {
+    int	npaths;		/*number of paths defined		*/
+    size_t	apaths;		/*number of paths allocated		*/
+    H5T_path_t	**path;		/*sorted array of path pointers		*/
+    int	nsoft;		/*number of soft conversions defined	*/
+    size_t	asoft;		/*number of soft conversions allocated	*/
+    H5T_soft_t	*soft;		/*unsorted array of soft conversions	*/
+} H5T_g;
+
+/* Declare the free list for H5T_path_t's */
+H5FL_DEFINE_STATIC(H5T_path_t);
+
+/* Datatype ID class */
+static const H5I_class_t H5I_DATATYPE_CLS[1] = {{
+    H5I_DATATYPE,		/* ID class value */
+    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    8,				/* # of reserved IDs for class */
+    (H5I_free_t)H5T_close	/* Callback routine for closing objects of this class */
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_init
+ *
+ * Purpose:	Initialize the interface from some other package.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_init(void)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+    /* FUNC_ENTER() does all the work */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_init_inf
+ *
+ * Purpose:	Initialize the +/- Infinity floating-poing values for type
+ *              conversion.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, November 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_init_inf(void)
+{
+    H5T_t	*dst_p;		/* Datatype type operate on */
+    H5T_atomic_t *dst;		/* Datatype's atomic info */
+    uint8_t	*d;             /* Pointer to value to set */
+    size_t	half_size;	/* Half the type size */
+    size_t      u;              /* Local index value */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get the float datatype */
+    if(NULL == (dst_p = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    dst = &dst_p->shared->u.atomic;
+
+    /* Check that we can re-order the bytes correctly */
+    if(H5T_ORDER_LE != H5T_native_order_g && H5T_ORDER_BE != H5T_native_order_g)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+
+    /* +Inf */
+    d = (uint8_t *)&H5T_NATIVE_FLOAT_POS_INF_g;
+    H5T__bit_set(d, dst->u.f.sign, (size_t)1, FALSE);
+    H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, TRUE);
+    H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, FALSE);
+
+    /* Swap the bytes if the machine architecture is big-endian */
+    if (H5T_ORDER_BE == H5T_native_order_g) {
+        half_size = dst_p->shared->size / 2;
+        for(u = 0; u < half_size; u++) {
+            uint8_t tmp = d[dst_p->shared->size - (u + 1)];
+            d[dst_p->shared->size - (u + 1)] = d[u];
+            d[u] = tmp;
+        } /* end for */
+    } /* end if */
+
+    /* -Inf */
+    d = (uint8_t *)&H5T_NATIVE_FLOAT_NEG_INF_g;
+    H5T__bit_set(d, dst->u.f.sign, (size_t)1, TRUE);
+    H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, TRUE);
+    H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, FALSE);
+
+    /* Swap the bytes if the machine architecture is big-endian */
+    if(H5T_ORDER_BE == H5T_native_order_g) {
+        half_size = dst_p->shared->size / 2;
+        for(u = 0; u < half_size; u++) {
+            uint8_t tmp = d[dst_p->shared->size - (u + 1)];
+            d[dst_p->shared->size - (u + 1)] = d[u];
+            d[u] = tmp;
+        } /* end for */
+    } /* end if */
+
+    /* Get the double datatype */
+    if(NULL == (dst_p = (H5T_t *)H5I_object(H5T_NATIVE_DOUBLE_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    dst = &dst_p->shared->u.atomic;
+
+    /* Check that we can re-order the bytes correctly */
+    if(H5T_ORDER_LE != H5T_native_order_g && H5T_ORDER_BE != H5T_native_order_g)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+
+    /* +Inf */
+    d = (uint8_t *)&H5T_NATIVE_DOUBLE_POS_INF_g;
+    H5T__bit_set(d, dst->u.f.sign, (size_t)1, FALSE);
+    H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, TRUE);
+    H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, FALSE);
+
+    /* Swap the bytes if the machine architecture is big-endian */
+    if(H5T_ORDER_BE == H5T_native_order_g) {
+        half_size = dst_p->shared->size / 2;
+        for(u = 0; u < half_size; u++) {
+            uint8_t tmp = d[dst_p->shared->size - (u + 1)];
+            d[dst_p->shared->size - (u + 1)] = d[u];
+            d[u] = tmp;
+        } /* end for */
+    } /* end if */
+
+    /* -Inf */
+    d = (uint8_t *)&H5T_NATIVE_DOUBLE_NEG_INF_g;
+    H5T__bit_set(d, dst->u.f.sign, (size_t)1, TRUE);
+    H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, TRUE);
+    H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, FALSE);
+
+    /* Swap the bytes if the machine architecture is big-endian */
+    if(H5T_ORDER_BE == H5T_native_order_g) {
+        half_size = dst_p->shared->size / 2;
+        for(u = 0; u < half_size; u++) {
+            uint8_t tmp = d[dst_p->shared->size - (u + 1)];
+            d[dst_p->shared->size - (u + 1)] = d[u];
+            d[u] = tmp;
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_init_inf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_init_hw
+ *
+ * Purpose:	Perform hardware specific [floating-point] initialization
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 24, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_init_hw(void)
+{
+#ifdef H5_HAVE_GET_FPC_CSR
+    union fpc_csr csr;          /* Union to hold results of floating-point status register query */
+#endif /* H5_HAVE_GET_FPC_CSR */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef H5_HAVE_GET_FPC_CSR
+    /* [This code is specific to SGI machines] */
+
+    /* Get the floating-point status register */
+    csr.fc_word = get_fpc_csr();
+
+    /* If the "flush denormalized values to zero" flag is set, unset it */
+    if(csr.fc_struct.flush) {
+        csr.fc_struct.flush = 0;
+        set_fpc_csr(csr.fc_word);
+    } /* end if */
+#endif /* H5_HAVE_GET_FPC_CSR */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_init_hw() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_interface(void)
+{
+    H5T_t       *native_schar=NULL;     /* Datatype structure for native signed char */
+    H5T_t       *native_uchar=NULL;     /* Datatype structure for native unsigned char */
+    H5T_t       *native_short=NULL;     /* Datatype structure for native short */
+    H5T_t       *native_ushort=NULL;    /* Datatype structure for native unsigned short */
+    H5T_t       *native_int=NULL;       /* Datatype structure for native int */
+    H5T_t       *native_uint=NULL;      /* Datatype structure for native unsigned int */
+    H5T_t       *native_long=NULL;      /* Datatype structure for native long */
+    H5T_t       *native_ulong=NULL;     /* Datatype structure for native unsigned long */
+    H5T_t       *native_llong=NULL;     /* Datatype structure for native long long */
+    H5T_t       *native_ullong=NULL;    /* Datatype structure for native unsigned long long */
+    H5T_t       *native_float=NULL;     /* Datatype structure for native float */
+    H5T_t       *native_double=NULL;    /* Datatype structure for native double */
+#if H5_SIZEOF_LONG_DOUBLE !=0
+    H5T_t       *native_ldouble=NULL;   /* Datatype structure for native long double */
+#endif
+    H5T_t       *std_u8le=NULL;         /* Datatype structure for unsigned 8-bit little-endian integer */
+    H5T_t       *std_u8be=NULL;         /* Datatype structure for unsigned 8-bit big-endian integer */
+    H5T_t       *std_u16le=NULL;        /* Datatype structure for unsigned 16-bit little-endian integer */
+    H5T_t       *std_u16be=NULL;        /* Datatype structure for unsigned 16-bit big-endian integer */
+    H5T_t       *std_u32le=NULL;        /* Datatype structure for unsigned 32-bit little-endian integer */
+    H5T_t       *std_u32be=NULL;        /* Datatype structure for unsigned 32-bit big-endian integer */
+    H5T_t       *std_u64le=NULL;        /* Datatype structure for unsigned 64-bit little-endian integer */
+    H5T_t       *std_u64be=NULL;        /* Datatype structure for unsigned 64-bit big-endian integer */
+    H5T_t	*dt = NULL;
+    H5T_t	*fixedpt=NULL;          /* Datatype structure for native int */
+    H5T_t	*floatpt=NULL;          /* Datatype structure for native float */
+    H5T_t	*string=NULL;           /* Datatype structure for C string */
+    H5T_t	*bitfield=NULL;         /* Datatype structure for bitfield */
+    H5T_t	*compound=NULL;         /* Datatype structure for compound objects */
+    H5T_t	*enum_type=NULL;        /* Datatype structure for enum objects */
+    H5T_t	*vlen=NULL;             /* Datatype structure for vlen objects */
+    H5T_t	*array=NULL;            /* Datatype structure for array objects */
+    H5T_t	*objref=NULL;           /* Datatype structure for object reference objects */
+    hsize_t     dim[1]={1};             /* Dimension info for array datatype */
+    herr_t	status;
+    unsigned    copied_dtype=1;         /* Flag to indicate whether datatype was copied or allocated (for error cleanup) */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Initialize the atom group for the file IDs */
+    if(H5I_register_type(H5I_DATATYPE_CLS) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /* Make certain there aren't too many classes of datatypes defined */
+    /* Only 16 (numbered 0-15) are supported in the current file format */
+    HDassert(H5T_NCLASSES < 16);
+
+    /* Perform any necessary hardware initializations */
+    if(H5T_init_hw() < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /*
+     * Initialize pre-defined native datatypes from code generated during
+     * the library configuration by H5detect.
+     */
+    if(H5TN_init_interface() < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /* Get the atomic datatype structures needed by the initialization code below */
+    if(NULL == (native_schar = (H5T_t *)H5I_object(H5T_NATIVE_SCHAR_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_uchar = (H5T_t *)H5I_object(H5T_NATIVE_UCHAR_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_short = (H5T_t *)H5I_object(H5T_NATIVE_SHORT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_ushort = (H5T_t *)H5I_object(H5T_NATIVE_USHORT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_int = (H5T_t *)H5I_object(H5T_NATIVE_INT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_uint = (H5T_t *)H5I_object(H5T_NATIVE_UINT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_long = (H5T_t *)H5I_object(H5T_NATIVE_LONG_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_ulong = (H5T_t *)H5I_object(H5T_NATIVE_ULONG_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_llong = (H5T_t *)H5I_object(H5T_NATIVE_LLONG_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_ullong = (H5T_t *)H5I_object(H5T_NATIVE_ULLONG_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_float = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(NULL == (native_double = (H5T_t *)H5I_object(H5T_NATIVE_DOUBLE_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+#if H5_SIZEOF_LONG_DOUBLE !=0
+    if(NULL == (native_ldouble = (H5T_t *)H5I_object(H5T_NATIVE_LDOUBLE_g)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+#endif
+
+    /*------------------------------------------------------------
+     * Derived native types
+     *------------------------------------------------------------
+     */
+
+    /* 1-byte bit field */
+    H5T_INIT_TYPE(BITFIELD,H5T_NATIVE_B8_g,COPY,native_uint,SET,1)
+
+    /* 2-byte bit field */
+    H5T_INIT_TYPE(BITFIELD,H5T_NATIVE_B16_g,COPY,native_uint,SET,2)
+
+    /* 4-byte bit field */
+    H5T_INIT_TYPE(BITFIELD,H5T_NATIVE_B32_g,COPY,native_uint,SET,4)
+
+    /* 8-byte bit field */
+    H5T_INIT_TYPE(BITFIELD,H5T_NATIVE_B64_g,COPY,native_uint,SET,8)
+
+    /* haddr_t */
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HADDR_g,COPY,native_uint,SET,sizeof(haddr_t))
+
+    /* hsize_t */
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HSIZE_g,COPY,native_uint,SET,sizeof(hsize_t))
+
+    /* hssize_t */
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HSSIZE_g,COPY,native_int,SET,sizeof(hssize_t))
+
+    /* herr_t */
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HERR_g,COPY,native_int,SET,sizeof(herr_t))
+
+    /* hbool_t */
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HBOOL_g,COPY,native_int,SET,sizeof(hbool_t))
+
+    /*------------------------------------------------------------
+     * IEEE Types
+     *------------------------------------------------------------
+     */
+
+    /* IEEE 4-byte little-endian float */
+    H5T_INIT_TYPE(FLOATLE,H5T_IEEE_F32LE_g,COPY,native_double,SET,4)
+
+    /* IEEE 4-byte big-endian float */
+    H5T_INIT_TYPE(FLOATBE,H5T_IEEE_F32BE_g,COPY,native_double,SET,4)
+
+    /* IEEE 8-byte little-endian float */
+    H5T_INIT_TYPE(DOUBLELE,H5T_IEEE_F64LE_g,COPY,native_double,SET,8)
+
+    /* IEEE 8-byte big-endian float */
+    H5T_INIT_TYPE(DOUBLEBE,H5T_IEEE_F64BE_g,COPY,native_double,SET,8)
+
+    /*------------------------------------------------------------
+     * VAX Types
+     *------------------------------------------------------------
+     */
+
+    /* VAX 4-byte float */
+    H5T_INIT_TYPE(FLOATVAX,H5T_VAX_F32_g,COPY,native_double,SET,4)
+
+    /* VAX 8-byte double */
+    H5T_INIT_TYPE(DOUBLEVAX,H5T_VAX_F64_g,COPY,native_double,SET,8)
+
+    /*------------------------------------------------------------
+     * C99 types
+     *------------------------------------------------------------
+     */
+
+    /* 1-byte little-endian (endianness is irrelevant) signed integer */
+    H5T_INIT_TYPE(SINTLE,H5T_STD_I8LE_g,COPY,native_int,SET,1)
+
+    /* 1-byte big-endian (endianness is irrelevant) signed integer */
+    H5T_INIT_TYPE(SINTBE,H5T_STD_I8BE_g,COPY,native_int,SET,1)
+
+    /* 2-byte little-endian signed integer */
+    H5T_INIT_TYPE(SINTLE,H5T_STD_I16LE_g,COPY,native_int,SET,2)
+
+    /* 2-byte big-endian signed integer */
+    H5T_INIT_TYPE(SINTBE,H5T_STD_I16BE_g,COPY,native_int,SET,2)
+
+    /* 4-byte little-endian signed integer */
+    H5T_INIT_TYPE(SINTLE,H5T_STD_I32LE_g,COPY,native_int,SET,4)
+
+    /* 4-byte big-endian signed integer */
+    H5T_INIT_TYPE(SINTBE,H5T_STD_I32BE_g,COPY,native_int,SET,4)
+
+    /* 8-byte little-endian signed integer */
+    H5T_INIT_TYPE(SINTLE,H5T_STD_I64LE_g,COPY,native_int,SET,8)
+
+    /* 8-byte big-endian signed integer */
+    H5T_INIT_TYPE(SINTBE,H5T_STD_I64BE_g,COPY,native_int,SET,8)
+
+    /* 1-byte little-endian (endianness is irrelevant) unsigned integer */
+    H5T_INIT_TYPE(UINTLE,H5T_STD_U8LE_g,COPY,native_uint,SET,1)
+    std_u8le=dt;    /* Keep type for later */
+
+    /* 1-byte big-endian (endianness is irrelevant) unsigned integer */
+    H5T_INIT_TYPE(UINTBE,H5T_STD_U8BE_g,COPY,native_uint,SET,1)
+    std_u8be=dt;    /* Keep type for later */
+
+    /* 2-byte little-endian unsigned integer */
+    H5T_INIT_TYPE(UINTLE,H5T_STD_U16LE_g,COPY,native_uint,SET,2)
+    std_u16le=dt;    /* Keep type for later */
+
+    /* 2-byte big-endian unsigned integer */
+    H5T_INIT_TYPE(UINTBE,H5T_STD_U16BE_g,COPY,native_uint,SET,2)
+    std_u16be=dt;    /* Keep type for later */
+
+    /* 4-byte little-endian unsigned integer */
+    H5T_INIT_TYPE(UINTLE,H5T_STD_U32LE_g,COPY,native_uint,SET,4)
+    std_u32le=dt;    /* Keep type for later */
+
+    /* 4-byte big-endian unsigned integer */
+    H5T_INIT_TYPE(UINTBE,H5T_STD_U32BE_g,COPY,native_uint,SET,4)
+    std_u32be=dt;    /* Keep type for later */
+
+    /* 8-byte little-endian unsigned integer */
+    H5T_INIT_TYPE(UINTLE,H5T_STD_U64LE_g,COPY,native_uint,SET,8)
+    std_u64le=dt;    /* Keep type for later */
+
+    /* 8-byte big-endian unsigned integer */
+    H5T_INIT_TYPE(UINTBE,H5T_STD_U64BE_g,COPY,native_uint,SET,8)
+    std_u64be=dt;    /* Keep type for later */
+
+    /*------------------------------------------------------------
+     * Native, Little- & Big-endian bitfields
+     *------------------------------------------------------------
+     */
+
+    /* little-endian (order is irrelevant) 8-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B8LE_g, COPY, std_u8le, NOSET, -)
+    bitfield=dt;    /* Keep type for later */
+
+    /* big-endian (order is irrelevant) 8-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B8BE_g, COPY, std_u8be, NOSET, -)
+
+    /* Little-endian 16-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B16LE_g, COPY, std_u16le, NOSET, -)
+
+    /* Big-endian 16-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B16BE_g, COPY, std_u16be, NOSET, -)
+
+    /* Little-endian 32-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B32LE_g, COPY, std_u32le, NOSET, -)
+
+    /* Big-endian 32-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B32BE_g, COPY, std_u32be, NOSET, -)
+
+    /* Little-endian 64-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B64LE_g, COPY, std_u64le, NOSET, -)
+
+    /* Big-endian 64-bit bitfield */
+    H5T_INIT_TYPE(BITFIELD, H5T_STD_B64BE_g, COPY, std_u64be, NOSET, -)
+
+    /*------------------------------------------------------------
+     * The Unix architecture for dates and times.
+     *------------------------------------------------------------
+     */
+
+    /* Little-endian 32-bit UNIX time_t */
+    H5T_INIT_TYPE(TIME, H5T_UNIX_D32LE_g, COPY, std_u32le, NOSET, -)
+
+    /* Big-endian 32-bit UNIX time_t */
+    H5T_INIT_TYPE(TIME, H5T_UNIX_D32BE_g, COPY, std_u32be, NOSET, -)
+
+    /* Little-endian 64-bit UNIX time_t */
+    H5T_INIT_TYPE(TIME, H5T_UNIX_D64LE_g, COPY, std_u64le, NOSET, -)
+
+    /* Big-endian 64-bit UNIX time_t */
+    H5T_INIT_TYPE(TIME, H5T_UNIX_D64BE_g, COPY, std_u64be, NOSET, -)
+
+
+    /* Indicate that the types that are created from here down are allocated
+     * H5FL_ALLOC(), not copied with H5T_copy()
+     */
+    copied_dtype = FALSE;
+
+    /* Opaque data */
+    H5T_INIT_TYPE(OPAQ, H5T_NATIVE_OPAQUE_g, ALLOC, -, SET, 1)
+
+    /*------------------------------------------------------------
+     * The `C' architecture
+     *------------------------------------------------------------
+     */
+
+    /* One-byte character string */
+    H5T_INIT_TYPE(CSTRING, H5T_C_S1_g, ALLOC, -, SET, 1)
+    string=dt;    /* Keep type for later */
+
+    /*------------------------------------------------------------
+     * The `Fortran' architecture
+     *------------------------------------------------------------
+     */
+
+    /* One-byte character string */
+    H5T_INIT_TYPE(FORSTRING, H5T_FORTRAN_S1_g, ALLOC, -, SET, 1)
+
+    /*------------------------------------------------------------
+     * Reference types
+     *------------------------------------------------------------
+     */
+
+    /* Object reference (i.e. object header address in file) */
+    H5T_INIT_TYPE(OBJREF, H5T_STD_REF_OBJ_g, ALLOC, -, SET, H5R_OBJ_REF_BUF_SIZE)
+    objref=dt;    /* Keep type for later */
+
+    /* Dataset Region reference (i.e. selection inside a dataset) */
+    H5T_INIT_TYPE(REGREF, H5T_STD_REF_DSETREG_g, ALLOC, -, SET, H5R_DSET_REG_REF_BUF_SIZE)
+
+    /*
+     * Register conversion functions beginning with the most general and
+     * ending with the most specific.
+     */
+    fixedpt = native_int;
+    floatpt = native_float;
+    if (NULL == (compound = H5T__create(H5T_COMPOUND, (size_t)1)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (NULL == (enum_type = H5T__create(H5T_ENUM, (size_t)1)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (NULL == (vlen = H5T__vlen_create(native_int)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (NULL == (array = H5T__array_create(native_int, 1, dim)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    status = 0;
+
+    status |= H5T_register(H5T_PERS_SOFT, "i_i", fixedpt, fixedpt, H5T__conv_i_i, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "i_f", fixedpt, floatpt, H5T__conv_i_f, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "f_f", floatpt, floatpt, H5T__conv_f_f, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "f_i", floatpt, fixedpt, H5T__conv_f_i, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "s_s", string, string, H5T__conv_s_s, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "b_b", bitfield, bitfield, H5T__conv_b_b, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "ibo", fixedpt, fixedpt, H5T__conv_order, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "ibo(opt)", fixedpt, fixedpt, H5T__conv_order_opt, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "fbo", floatpt, floatpt, H5T__conv_order, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "fbo(opt)", floatpt, floatpt, H5T__conv_order_opt, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "struct(no-opt)", compound, compound, H5T__conv_struct, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "struct(opt)", compound, compound, H5T__conv_struct_opt, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "enum", enum_type, enum_type, H5T__conv_enum, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "enum_i", enum_type, fixedpt, H5T__conv_enum_numeric, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "enum_f", enum_type, floatpt, H5T__conv_enum_numeric, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "vlen", vlen, vlen, H5T__conv_vlen, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "array", array, array, H5T__conv_array, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_SOFT, "objref", objref, objref, H5T__conv_order_opt, H5AC_ind_dxpl_id, FALSE);
+
+    /*
+     * Native conversions should be listed last since we can use hardware to
+     * perform the conversion.  We list the odd types like `llong', `long',
+     * and `short' before the usual types like `int' and `char' so that when
+     * diagnostics are printed we favor the usual names over the odd names
+     * when two or more types are the same size.
+     */
+
+    /* floating point */
+    status |= H5T_register(H5T_PERS_HARD, "flt_dbl", native_float, native_double, H5T__conv_float_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_flt", native_double, native_float, H5T__conv_double_float, H5AC_ind_dxpl_id, FALSE);
+#if H5_SIZEOF_LONG_DOUBLE != 0
+    status |= H5T_register(H5T_PERS_HARD, "flt_ldbl", native_float, native_ldouble, H5T__conv_float_ldouble, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_ldbl", native_double, native_ldouble, H5T__conv_double_ldouble, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_flt", native_ldouble, native_float, H5T__conv_ldouble_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_dbl", native_ldouble, native_double, H5T__conv_ldouble_double, H5AC_ind_dxpl_id, FALSE);
+#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+
+    /* from long long */
+    status |= H5T_register(H5T_PERS_HARD, "llong_ullong", native_llong, native_ullong, H5T__conv_llong_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_llong", native_ullong, native_llong, H5T__conv_ullong_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_long", native_llong, native_long, H5T__conv_llong_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_ulong", native_llong, native_ulong, H5T__conv_llong_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_long", native_ullong, native_long, H5T__conv_ullong_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_ulong", native_ullong, native_ulong, H5T__conv_ullong_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_short", native_llong, native_short, H5T__conv_llong_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_ushort", native_llong, native_ushort, H5T__conv_llong_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_short", native_ullong, native_short, H5T__conv_ullong_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_ushort", native_ullong, native_ushort, H5T__conv_ullong_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_int", native_llong, native_int, H5T__conv_llong_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_uint", native_llong, native_uint, H5T__conv_llong_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_int", native_ullong, native_int, H5T__conv_ullong_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_uint", native_ullong, native_uint, H5T__conv_ullong_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_schar", native_llong, native_schar, H5T__conv_llong_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_uchar", native_llong, native_uchar, H5T__conv_llong_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_schar", native_ullong, native_schar, H5T__conv_ullong_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_uchar", native_ullong, native_uchar, H5T__conv_ullong_uchar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From long */
+    status |= H5T_register(H5T_PERS_HARD, "long_llong", native_long, native_llong, H5T__conv_long_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_ullong", native_long, native_ullong, H5T__conv_long_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_llong", native_ulong, native_llong, H5T__conv_ulong_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_ullong", native_ulong, native_ullong, H5T__conv_ulong_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_ulong", native_long, native_ulong, H5T__conv_long_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_long", native_ulong, native_long, H5T__conv_ulong_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_short", native_long, native_short, H5T__conv_long_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_ushort", native_long, native_ushort, H5T__conv_long_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_short", native_ulong, native_short, H5T__conv_ulong_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_ushort", native_ulong, native_ushort, H5T__conv_ulong_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_int", native_long, native_int, H5T__conv_long_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_uint", native_long, native_uint, H5T__conv_long_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_int", native_ulong, native_int, H5T__conv_ulong_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_uint", native_ulong, native_uint, H5T__conv_ulong_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_schar", native_long, native_schar, H5T__conv_long_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_uchar", native_long, native_uchar, H5T__conv_long_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_schar", native_ulong, native_schar, H5T__conv_ulong_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_uchar", native_ulong, native_uchar, H5T__conv_ulong_uchar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From short */
+    status |= H5T_register(H5T_PERS_HARD, "short_llong", native_short, native_llong, H5T__conv_short_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_ullong", native_short, native_ullong, H5T__conv_short_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_llong", native_ushort, native_llong, H5T__conv_ushort_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_ullong", native_ushort, native_ullong, H5T__conv_ushort_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_long", native_short, native_long, H5T__conv_short_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_ulong", native_short, native_ulong, H5T__conv_short_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_long", native_ushort, native_long, H5T__conv_ushort_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_ulong", native_ushort, native_ulong, H5T__conv_ushort_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_ushort", native_short, native_ushort, H5T__conv_short_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_short", native_ushort, native_short, H5T__conv_ushort_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_int", native_short, native_int, H5T__conv_short_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_uint", native_short, native_uint, H5T__conv_short_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_int", native_ushort, native_int, H5T__conv_ushort_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_uint", native_ushort, native_uint, H5T__conv_ushort_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_schar", native_short, native_schar, H5T__conv_short_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_uchar", native_short, native_uchar, H5T__conv_short_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_schar", native_ushort, native_schar, H5T__conv_ushort_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_uchar", native_ushort, native_uchar, H5T__conv_ushort_uchar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From int */
+    status |= H5T_register(H5T_PERS_HARD, "int_llong", native_int, native_llong, H5T__conv_int_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_ullong", native_int, native_ullong, H5T__conv_int_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_llong", native_uint, native_llong, H5T__conv_uint_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_ullong", native_uint, native_ullong, H5T__conv_uint_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_long", native_int, native_long, H5T__conv_int_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_ulong", native_int, native_ulong, H5T__conv_int_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_long", native_uint, native_long, H5T__conv_uint_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_ulong", native_uint, native_ulong, H5T__conv_uint_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_short", native_int, native_short, H5T__conv_int_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_ushort", native_int, native_ushort, H5T__conv_int_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_short", native_uint, native_short, H5T__conv_uint_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_ushort", native_uint, native_ushort, H5T__conv_uint_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_uint", native_int, native_uint, H5T__conv_int_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_int", native_uint, native_int, H5T__conv_uint_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_schar", native_int, native_schar, H5T__conv_int_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_uchar", native_int, native_uchar, H5T__conv_int_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_schar", native_uint, native_schar, H5T__conv_uint_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_uchar", native_uint, native_uchar, H5T__conv_uint_uchar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From char */
+    status |= H5T_register(H5T_PERS_HARD, "schar_llong", native_schar, native_llong, H5T__conv_schar_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_ullong", native_schar, native_ullong, H5T__conv_schar_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_llong", native_uchar, native_llong, H5T__conv_uchar_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_ullong", native_uchar, native_ullong, H5T__conv_uchar_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_long", native_schar, native_long, H5T__conv_schar_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_ulong", native_schar, native_ulong, H5T__conv_schar_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_long", native_uchar, native_long, H5T__conv_uchar_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_ulong", native_uchar, native_ulong, H5T__conv_uchar_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_short", native_schar, native_short, H5T__conv_schar_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_ushort", native_schar, native_ushort, H5T__conv_schar_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_short", native_uchar, native_short, H5T__conv_uchar_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_ushort", native_uchar, native_ushort, H5T__conv_uchar_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_int", native_schar, native_int, H5T__conv_schar_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_uint", native_schar, native_uint, H5T__conv_schar_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_int", native_uchar, native_int, H5T__conv_uchar_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_uint", native_uchar, native_uint, H5T__conv_uchar_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_uchar", native_schar, native_uchar, H5T__conv_schar_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_schar", native_uchar, native_schar, H5T__conv_uchar_schar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From char to floats */
+    status |= H5T_register(H5T_PERS_HARD, "schar_flt", native_schar, native_float, H5T__conv_schar_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_dbl", native_schar, native_double, H5T__conv_schar_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "schar_ldbl", native_schar, native_ldouble, H5T__conv_schar_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From unsigned char to floats */
+    status |= H5T_register(H5T_PERS_HARD, "uchar_flt", native_uchar, native_float, H5T__conv_uchar_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_dbl", native_uchar, native_double, H5T__conv_uchar_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uchar_ldbl", native_uchar, native_ldouble, H5T__conv_uchar_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From short to floats */
+    status |= H5T_register(H5T_PERS_HARD, "short_flt", native_short, native_float, H5T__conv_short_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_dbl", native_short, native_double, H5T__conv_short_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "short_ldbl", native_short, native_ldouble, H5T__conv_short_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From unsigned short to floats */
+    status |= H5T_register(H5T_PERS_HARD, "ushort_flt", native_ushort, native_float, H5T__conv_ushort_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_dbl", native_ushort, native_double, H5T__conv_ushort_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ushort_ldbl", native_ushort, native_ldouble, H5T__conv_ushort_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From int to floats */
+    status |= H5T_register(H5T_PERS_HARD, "int_flt", native_int, native_float, H5T__conv_int_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_dbl", native_int, native_double, H5T__conv_int_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "int_ldbl", native_int, native_ldouble, H5T__conv_int_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From unsigned int to floats */
+    status |= H5T_register(H5T_PERS_HARD, "uint_flt", native_uint, native_float, H5T__conv_uint_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_dbl", native_uint, native_double, H5T__conv_uint_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "uint_ldbl", native_uint, native_ldouble, H5T__conv_uint_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From long to floats */
+    status |= H5T_register(H5T_PERS_HARD, "long_flt", native_long, native_float, H5T__conv_long_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_dbl", native_long, native_double, H5T__conv_long_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "long_ldbl", native_long, native_ldouble, H5T__conv_long_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From unsigned long to floats */
+    status |= H5T_register(H5T_PERS_HARD, "ulong_flt", native_ulong, native_float, H5T__conv_ulong_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_dbl", native_ulong, native_double, H5T__conv_ulong_double, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ulong_ldbl", native_ulong, native_ldouble, H5T__conv_ulong_ldouble, H5AC_ind_dxpl_id, FALSE);
+
+    /* From long long to floats */
+    status |= H5T_register(H5T_PERS_HARD, "llong_flt", native_llong, native_float, H5T__conv_llong_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "llong_dbl", native_llong, native_double, H5T__conv_llong_double, H5AC_ind_dxpl_id, FALSE);
+#ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE
+    status |= H5T_register(H5T_PERS_HARD, "llong_ldbl", native_llong, native_ldouble, H5T__conv_llong_ldouble, H5AC_ind_dxpl_id, FALSE);
+#endif /* H5T_CONV_INTERNAL_LLONG_LDOUBLE */
+
+    /* From unsigned long long to floats */
+    status |= H5T_register(H5T_PERS_HARD, "ullong_flt", native_ullong, native_float, H5T__conv_ullong_float, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ullong_dbl", native_ullong, native_double, H5T__conv_ullong_double, H5AC_ind_dxpl_id, FALSE);
+#ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE
+    status |= H5T_register(H5T_PERS_HARD, "ullong_ldbl", native_ullong, native_ldouble, H5T__conv_ullong_ldouble, H5AC_ind_dxpl_id, FALSE);
+#endif /* H5T_CONV_INTERNAL_ULLONG_LDOUBLE */
+
+    /* From floats to char */
+    status |= H5T_register(H5T_PERS_HARD, "flt_schar", native_float, native_schar, H5T__conv_float_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_schar", native_double, native_schar, H5T__conv_double_schar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_schar", native_ldouble, native_schar, H5T__conv_ldouble_schar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to unsigned char */
+    status |= H5T_register(H5T_PERS_HARD, "flt_uchar", native_float, native_uchar, H5T__conv_float_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_uchar", native_double, native_uchar, H5T__conv_double_uchar, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_uchar", native_ldouble, native_uchar, H5T__conv_ldouble_uchar, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to short */
+    status |= H5T_register(H5T_PERS_HARD, "flt_short", native_float, native_short, H5T__conv_float_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_short", native_double, native_short, H5T__conv_double_short, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_short", native_ldouble, native_short, H5T__conv_ldouble_short, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to unsigned short */
+    status |= H5T_register(H5T_PERS_HARD, "flt_ushort", native_float, native_ushort, H5T__conv_float_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_ushort", native_double, native_ushort, H5T__conv_double_ushort, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_ushort", native_ldouble, native_ushort, H5T__conv_ldouble_ushort, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to int */
+    status |= H5T_register(H5T_PERS_HARD, "flt_int", native_float, native_int, H5T__conv_float_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_int", native_double, native_int, H5T__conv_double_int, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_int", native_ldouble, native_int, H5T__conv_ldouble_int, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to unsigned int */
+    status |= H5T_register(H5T_PERS_HARD, "flt_uint", native_float, native_uint, H5T__conv_float_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_uint", native_double, native_uint, H5T__conv_double_uint, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_uint", native_ldouble, native_uint, H5T__conv_ldouble_uint, H5AC_ind_dxpl_id, FALSE);
+
+    status |= H5T_register(H5T_PERS_HARD, "flt_long", native_float, native_long, H5T__conv_float_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_long", native_double, native_long, H5T__conv_double_long, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_long", native_ldouble, native_long, H5T__conv_ldouble_long, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to unsigned long */
+    status |= H5T_register(H5T_PERS_HARD, "flt_ulong", native_float, native_ulong, H5T__conv_float_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_ulong", native_double, native_ulong, H5T__conv_double_ulong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_ulong", native_ldouble, native_ulong, H5T__conv_ldouble_ulong, H5AC_ind_dxpl_id, FALSE);
+
+    /* From floats to long long */
+    status |= H5T_register(H5T_PERS_HARD, "flt_llong", native_float, native_llong, H5T__conv_float_llong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_llong", native_double, native_llong, H5T__conv_double_llong, H5AC_ind_dxpl_id, FALSE);
+#ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_llong", native_ldouble, native_llong, H5T__conv_ldouble_llong, H5AC_ind_dxpl_id, FALSE);
+#endif /* H5T_CONV_INTERNAL_LDOUBLE_LLONG */
+
+    /* From floats to unsigned long long */
+    status |= H5T_register(H5T_PERS_HARD, "flt_ullong", native_float, native_ullong, H5T__conv_float_ullong, H5AC_ind_dxpl_id, FALSE);
+    status |= H5T_register(H5T_PERS_HARD, "dbl_ullong", native_double, native_ullong, H5T__conv_double_ullong, H5AC_ind_dxpl_id, FALSE);
+#if H5T_CONV_INTERNAL_LDOUBLE_ULLONG
+    status |= H5T_register(H5T_PERS_HARD, "ldbl_ullong", native_ldouble, native_ullong, H5T__conv_ldouble_ullong, H5AC_ind_dxpl_id, FALSE);
+#endif /* H5T_CONV_INTERNAL_LDOUBLE_ULLONG */
+
+    /*
+     * The special no-op conversion is the fastest, so we list it last. The
+     * data types we use are not important as long as the source and
+     * destination are equal.
+     */
+    status |= H5T_register(H5T_PERS_HARD, "no-op", native_int, native_int, H5T__conv_noop, H5AC_ind_dxpl_id, FALSE);
+
+    /* Initialize the +/- Infinity values for floating-point types */
+    status |= H5T_init_inf();
+
+    if (status<0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to register conversion function(s)")
+
+    /* Register datatype creation property class properties here.  See similar
+     * code in H5D_init_interface(), etc. for example.
+     */
+
+    /* Only register the default property list if it hasn't been created yet */
+    if(H5P_LST_DATATYPE_CREATE_ID_g == (-1)) {
+        /* ========== Datatype Creation Property Class Initialization ============*/
+        HDassert(H5P_CLS_DATATYPE_CREATE_g != NULL);
+
+        /* Register the default datatype creation property list */
+        if((H5P_LST_DATATYPE_CREATE_ID_g = H5P_create_id(H5P_CLS_DATATYPE_CREATE_g, FALSE)) < 0)
+             HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't insert property into class")
+    } /* end if */
+
+done:
+    /* General cleanup */
+    if(compound != NULL)
+        H5T_close(compound);
+    if(enum_type != NULL)
+        H5T_close(enum_type);
+    if(vlen != NULL)
+        H5T_close(vlen);
+    if(array != NULL)
+        H5T_close(array);
+
+    /* Error cleanup */
+    if(ret_value < 0) {
+        if(dt) {
+            /* Check if we should call H5T_close or H5FL_FREE */
+            if(copied_dtype)
+                H5T_close(dt);
+            else {
+                dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+                dt = H5FL_FREE(H5T_t, dt);
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_init_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_unlock_cb
+ *
+ * Purpose:	Clear the immutable flag for a datatype.  This function is
+ *		called when the library is closing in order to unlock all
+ *		registered datatypes and thus make them free-able.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, April 27, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5T_unlock_cb(void *_dt, hid_t H5_ATTR_UNUSED id, void H5_ATTR_UNUSED *key)
+{
+    H5T_t	*dt = (H5T_t *)_dt;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert (dt && dt->shared);
+    if (H5T_STATE_IMMUTABLE==dt->shared->state)
+	dt->shared->state = H5T_STATE_RDONLY;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T_unlock_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_term_interface
+ *
+ * Purpose:	Close this interface.
+ *
+ * Return:	Success:	Positive if any action might have caused a
+ *				change in some other interface; zero
+ *				otherwise.
+ *
+ * 		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_term_interface(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_interface_initialize_g) {
+        int i, nprint = 0;
+
+	/* Unregister all conversion functions */
+	for(i = 0; i < H5T_g.npaths; i++) {
+            H5T_path_t *path;
+
+	    path = H5T_g.path[i];
+	    HDassert(path);
+	    if(path->func) {
+		H5T__print_stats(path, &nprint/*in,out*/);
+		path->cdata.command = H5T_CONV_FREE;
+		if((path->func)((hid_t)FAIL, (hid_t)FAIL, &(path->cdata), (size_t)0,
+                        (size_t)0, (size_t)0, NULL, NULL,H5AC_ind_dxpl_id) < 0) {
+#ifdef H5T_DEBUG
+		    if (H5DEBUG(T)) {
+			fprintf(H5DEBUG(T), "H5T: conversion function "
+				 "0x%08lx failed to free private data for "
+				 "%s (ignored)\n",
+				 (unsigned long)(path->func), path->name);
+		    } /* end if */
+#endif
+		    H5E_clear_stack(NULL); /*ignore the error*/
+		} /* end if */
+	    } /* end if */
+
+            if(path->src)
+                H5T_close(path->src);
+            if(path->dst)
+                H5T_close(path->dst);
+            path = H5FL_FREE(H5T_path_t, path);
+	    H5T_g.path[i] = NULL;
+	} /* end for */
+
+	/* Clear conversion tables */
+	H5T_g.path = (H5T_path_t **)H5MM_xfree(H5T_g.path);
+	H5T_g.npaths = 0;
+	H5T_g.apaths = 0;
+	H5T_g.soft = (H5T_soft_t *)H5MM_xfree(H5T_g.soft);
+	H5T_g.nsoft = 0;
+	H5T_g.asoft = 0;
+
+	/* Unlock all datatypes, then free them */
+	/* note that we are ignoring the return value from H5I_iterate() */
+	H5I_iterate(H5I_DATATYPE, H5T_unlock_cb, NULL, FALSE);
+
+        /* Close deprecated interface */
+        n += H5T__term_deprec_interface();
+
+        /* Destroy the datatype object id group */
+	(void)H5I_dec_type_ref(H5I_DATATYPE);
+	n++; /*H5I*/
+
+        /* Reset all the datatype IDs */
+        H5T_IEEE_F32BE_g			= FAIL;
+        H5T_IEEE_F32LE_g			= FAIL;
+        H5T_IEEE_F64BE_g			= FAIL;
+        H5T_IEEE_F64LE_g			= FAIL;
+
+        H5T_STD_I8BE_g			= FAIL;
+        H5T_STD_I8LE_g			= FAIL;
+        H5T_STD_I16BE_g			= FAIL;
+        H5T_STD_I16LE_g			= FAIL;
+        H5T_STD_I32BE_g			= FAIL;
+        H5T_STD_I32LE_g			= FAIL;
+        H5T_STD_I64BE_g			= FAIL;
+        H5T_STD_I64LE_g			= FAIL;
+        H5T_STD_U8BE_g			= FAIL;
+        H5T_STD_U8LE_g			= FAIL;
+        H5T_STD_U16BE_g			= FAIL;
+        H5T_STD_U16LE_g			= FAIL;
+        H5T_STD_U32BE_g			= FAIL;
+        H5T_STD_U32LE_g			= FAIL;
+        H5T_STD_U64BE_g			= FAIL;
+        H5T_STD_U64LE_g			= FAIL;
+        H5T_STD_B8BE_g			= FAIL;
+        H5T_STD_B8LE_g			= FAIL;
+        H5T_STD_B16BE_g			= FAIL;
+        H5T_STD_B16LE_g			= FAIL;
+        H5T_STD_B32BE_g			= FAIL;
+        H5T_STD_B32LE_g			= FAIL;
+        H5T_STD_B64BE_g			= FAIL;
+        H5T_STD_B64LE_g 			= FAIL;
+        H5T_STD_REF_OBJ_g 		= FAIL;
+        H5T_STD_REF_DSETREG_g 		= FAIL;
+
+        H5T_UNIX_D32BE_g			= FAIL;
+        H5T_UNIX_D32LE_g			= FAIL;
+        H5T_UNIX_D64BE_g			= FAIL;
+        H5T_UNIX_D64LE_g 			= FAIL;
+
+        H5T_C_S1_g			= FAIL;
+
+        H5T_FORTRAN_S1_g			= FAIL;
+
+        H5T_NATIVE_SCHAR_g		= FAIL;
+        H5T_NATIVE_UCHAR_g		= FAIL;
+        H5T_NATIVE_SHORT_g		= FAIL;
+        H5T_NATIVE_USHORT_g		= FAIL;
+        H5T_NATIVE_INT_g			= FAIL;
+        H5T_NATIVE_UINT_g			= FAIL;
+        H5T_NATIVE_LONG_g			= FAIL;
+        H5T_NATIVE_ULONG_g		= FAIL;
+        H5T_NATIVE_LLONG_g		= FAIL;
+        H5T_NATIVE_ULLONG_g		= FAIL;
+        H5T_NATIVE_FLOAT_g		= FAIL;
+        H5T_NATIVE_DOUBLE_g		= FAIL;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        H5T_NATIVE_LDOUBLE_g		= FAIL;
+#endif
+        H5T_NATIVE_B8_g			= FAIL;
+        H5T_NATIVE_B16_g			= FAIL;
+        H5T_NATIVE_B32_g			= FAIL;
+        H5T_NATIVE_B64_g			= FAIL;
+        H5T_NATIVE_OPAQUE_g		= FAIL;
+        H5T_NATIVE_HADDR_g		= FAIL;
+        H5T_NATIVE_HSIZE_g		= FAIL;
+        H5T_NATIVE_HSSIZE_g		= FAIL;
+        H5T_NATIVE_HERR_g			= FAIL;
+        H5T_NATIVE_HBOOL_g		= FAIL;
+
+        H5T_NATIVE_INT8_g			= FAIL;
+        H5T_NATIVE_UINT8_g		= FAIL;
+        H5T_NATIVE_INT_LEAST8_g		= FAIL;
+        H5T_NATIVE_UINT_LEAST8_g		= FAIL;
+        H5T_NATIVE_INT_FAST8_g		= FAIL;
+        H5T_NATIVE_UINT_FAST8_g		= FAIL;
+
+        H5T_NATIVE_INT16_g		= FAIL;
+        H5T_NATIVE_UINT16_g		= FAIL;
+        H5T_NATIVE_INT_LEAST16_g		= FAIL;
+        H5T_NATIVE_UINT_LEAST16_g		= FAIL;
+        H5T_NATIVE_INT_FAST16_g		= FAIL;
+        H5T_NATIVE_UINT_FAST16_g		= FAIL;
+
+        H5T_NATIVE_INT32_g		= FAIL;
+        H5T_NATIVE_UINT32_g		= FAIL;
+        H5T_NATIVE_INT_LEAST32_g		= FAIL;
+        H5T_NATIVE_UINT_LEAST32_g		= FAIL;
+        H5T_NATIVE_INT_FAST32_g		= FAIL;
+        H5T_NATIVE_UINT_FAST32_g		= FAIL;
+
+        H5T_NATIVE_INT64_g		= FAIL;
+        H5T_NATIVE_UINT64_g		= FAIL;
+        H5T_NATIVE_INT_LEAST64_g		= FAIL;
+        H5T_NATIVE_UINT_LEAST64_g		= FAIL;
+        H5T_NATIVE_INT_FAST64_g		= FAIL;
+        H5T_NATIVE_UINT_FAST64_g		= FAIL;
+
+	/* Mark interface as closed */
+	H5_interface_initialize_g = 0;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5T_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcreate
+ *
+ * Purpose:	Create a new type and initialize it to reasonable values.
+ *		The type is a member of type class TYPE and is SIZE bytes.
+ *
+ * Return:	Success:	A new type identifier.
+ *
+ *		Failure:	Negative
+ *
+ * Errors:
+ *		ARGS	  BADVALUE	Invalid size.
+ *		DATATYPE  CANTINIT	Can't create type.
+ *		DATATYPE  CANTREGISTER	Can't register datatype atom.
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, December  5, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tcreate(H5T_class_t type, size_t size)
+{
+    H5T_t	*dt = NULL;     /* New datatype constructed */
+    hid_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "Ttz", type, size);
+
+    /* check args. We support string (fixed-size or variable-length) now. */
+    if(size <= 0 && size != H5T_VARIABLE)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size must be positive")
+
+    /* create the type */
+    if(NULL == (dt = H5T__create(type, size)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create type")
+
+    /* Get an ID for the datatype */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype ID")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcreate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcopy
+ *
+ * Purpose:	Copies a datatype.  The resulting datatype is not locked.
+ *		The datatype should be closed when no longer needed by
+ *		calling H5Tclose().
+ *
+ * Return:	Success:	The ID of a new datatype.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ * 	Robb Matzke, 4 Jun 1998
+ *	The returned type is always transient and unlocked.  If the TYPE_ID
+ *	argument is a dataset instead of a datatype then this function
+ *	returns a transient, modifiable datatype which is a copy of the
+ *	dataset's datatype.
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tcopy(hid_t type_id)
+{
+    H5T_t	*dt;                    /* Pointer to the datatype to copy */
+    H5T_t	*new_dt = NULL;
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", type_id);
+
+    switch(H5I_get_type(type_id)) {
+        case H5I_DATATYPE:
+            /* The argument is a datatype handle */
+            if(NULL == (dt = (H5T_t *)H5I_object(type_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            break;
+
+        case H5I_DATASET:
+            {
+                H5D_t	*dset;          /* Dataset for datatype */
+
+                /* The argument is a dataset handle */
+                if(NULL == (dset = (H5D_t *)H5I_object(type_id)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+                if(NULL == (dt = H5D_typeof(dset)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get the dataset datatype")
+            }
+            break;
+
+        case H5I_UNINIT:
+        case H5I_BADID:
+        case H5I_FILE:
+        case H5I_GROUP:
+        case H5I_DATASPACE:
+        case H5I_ATTR:
+        case H5I_REFERENCE:
+        case H5I_VFL:
+        case H5I_GENPROP_CLS:
+        case H5I_GENPROP_LST:
+        case H5I_ERROR_CLASS:
+        case H5I_ERROR_MSG:
+        case H5I_ERROR_STACK:
+        case H5I_NTYPES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype or dataset")
+    } /* end switch */
+
+    /* Copy datatype */
+    if(NULL == (new_dt = H5T_copy(dt, H5T_COPY_TRANSIENT)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy");
+
+    /* Atomize result */
+    if((ret_value = H5I_register(H5I_DATATYPE, new_dt, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom")
+
+done:
+    if(ret_value < 0)
+        if(new_dt && H5T_close(new_dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "unable to release datatype info")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcopy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tclose
+ *
+ * Purpose:	Frees a datatype and all associated memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tclose(hid_t type_id)
+{
+    H5T_t	*dt;                    /* Pointer to datatype to close */
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_IMMUTABLE == dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "immutable datatype")
+
+    /* When the reference count reaches zero the resources are freed */
+    if(H5I_dec_app_ref(type_id) < 0)
+	HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "problem freeing id")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tclose() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tequal
+ *
+ * Purpose:	Determines if two datatypes are equal.
+ *
+ * Return:	Success:	TRUE if equal, FALSE if unequal
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, December 10, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Tequal(hid_t type1_id, hid_t type2_id)
+{
+    const H5T_t	*dt1;           /* Pointer to first datatype */
+    const H5T_t	*dt2;           /* Pointer to second datatype */
+    htri_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "ii", type1_id, type2_id);
+
+    /* check args */
+    if(NULL == (dt1 = (H5T_t *)H5I_object_verify(type1_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(NULL == (dt2 = (H5T_t *)H5I_object_verify(type2_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    ret_value = (0 == H5T_cmp(dt1, dt2, FALSE)) ? TRUE : FALSE;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tequal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tlock
+ *
+ * Purpose:	Locks a type, making it read only and non-destructable.	 This
+ *		is normally done by the library for predefined datatypes so
+ *		the application doesn't inadvertently change or delete a
+ *		predefined type.
+ *
+ *		Once a datatype is locked it can never be unlocked unless
+ *		the entire library is closed.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ *
+ * 	Robb Matzke, 1 Jun 1998
+ *	It is illegal to lock a named datatype since we must allow named
+ *	types to be closed (to release file resources) but locking a type
+ *	prevents that.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tlock(hid_t type_id)
+{
+    H5T_t	*dt;                    /* Datatype to operate on */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_NAMED==dt->shared->state || H5T_STATE_OPEN==dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to lock named datatype")
+
+    if(H5T_lock(dt, TRUE) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to lock transient datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tlock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_class
+ *
+ * Purpose:	Returns the datatype class identifier for datatype TYPE_ID.
+ *
+ * Return:	Success:	One of the non-negative datatype class
+ *				constants.
+ *
+ *		Failure:	H5T_NO_CLASS (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_class_t
+H5Tget_class(hid_t type_id)
+{
+    H5T_t	*dt;            /* Pointer to datatype */
+    H5T_class_t ret_value;      /* Return value */
+
+    FUNC_ENTER_API(H5T_NO_CLASS)
+    H5TRACE1("Tt", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a datatype")
+
+    /* Set return value */
+    ret_value = H5T_get_class(dt, FALSE);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_class
+ *
+ * Purpose:	Returns the data type class identifier for a datatype ptr.
+ *
+ * Return:	Success:	One of the non-negative data type class
+ *				constants.
+ *
+ *		Failure:	H5T_NO_CLASS (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ * Modifications:
+ *      Broke out from H5Tget_class - QAK - 6/4/99
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_class_t
+H5T_get_class(const H5T_t *dt, htri_t internal)
+{
+    H5T_class_t ret_value;
+
+    FUNC_ENTER_NOAPI(H5T_NO_CLASS)
+
+    HDassert(dt);
+
+    /* Externally, a VL string is a string; internally, a VL string is a VL. */
+    if(internal) {
+        ret_value=dt->shared->type;
+    } else {
+        if(H5T_IS_VL_STRING(dt->shared))
+            ret_value=H5T_STRING;
+        else
+            ret_value=dt->shared->type;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_get_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tdetect_class
+ *
+ * Purpose:	Check whether a datatype contains (or is) a certain type of
+ *		datatype.
+ *
+ * Return:	TRUE (1) or FALSE (0) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, November 29, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Tdetect_class(hid_t type, H5T_class_t cls)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    htri_t      ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "iTt", type, cls);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a datatype")
+    if(!(cls > H5T_NO_CLASS && cls < H5T_NCLASSES))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a datatype class")
+
+    /* Set return value */
+    if((ret_value = H5T_detect_class(dt, cls, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, H5T_NO_CLASS, "can't get datatype class")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tdetect_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_detect_class
+ *
+ * Purpose:	Check whether a datatype contains (or is) a certain type of
+ *		datatype.
+ *
+ * Return:	TRUE (1) or FALSE (0) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, November 29, 2000
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              4 December 2009
+ *              Added a flag as a parameter to indicate whether the caller is
+ *              H5Tdetect_class.  I also added the check for VL string type
+ *              just like the public function.  Because we want to tell users
+ *              VL string is a string type but we treat it as a VL type
+ *              internally, H5T_detect_class needs to know where the caller
+ *              is from.
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_detect_class(const H5T_t *dt, H5T_class_t cls, hbool_t from_api)
+{
+    unsigned	i;
+    htri_t      ret_value = FALSE;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+    HDassert(cls > H5T_NO_CLASS && cls < H5T_NCLASSES);
+
+    /* Consider VL string as a string for API, as a VL for internal use. */
+    /* (note that this check must be performed before checking if the VL
+     *  string belongs to the H5T_VLEN class, which would otherwise return
+     *  true. -QAK)
+     */
+    if(from_api && H5T_IS_VL_STRING(dt->shared))
+        HGOTO_DONE(H5T_STRING == cls);
+
+    /* Check if this type is the correct type */
+    if(dt->shared->type == cls)
+        HGOTO_DONE(TRUE);
+
+    /* check for types that might have the correct type as a component */
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+            for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                htri_t nested_ret;      /* Return value from nested call */
+
+                /* Check if this field's type is the correct type */
+                if(dt->shared->u.compnd.memb[i].type->shared->type == cls)
+                    HGOTO_DONE(TRUE);
+
+                /* Recurse if it's VL, compound, enum or array */
+                if(H5T_IS_COMPLEX(dt->shared->u.compnd.memb[i].type->shared->type))
+                    if((nested_ret = H5T_detect_class(dt->shared->u.compnd.memb[i].type, cls, from_api)) != FALSE)
+                        HGOTO_DONE(nested_ret);
+            } /* end for */
+            break;
+
+        case H5T_ARRAY:
+        case H5T_VLEN:
+        case H5T_ENUM:
+            HGOTO_DONE(H5T_detect_class(dt->shared->parent, cls, from_api));
+            break;
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_NCLASSES:
+        default:
+            break;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_detect_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tis_variable_str
+ *
+ * Purpose:	Check whether a datatype is a variable-length string
+ *
+ * Return:	TRUE (1) or FALSE (0) on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Tis_variable_str(hid_t dtype_id)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    htri_t      ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", dtype_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Set return value */
+    if((ret_value = H5T_is_variable_str(dt)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "can't determine if datatype is VL-string")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tis_variable_str() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_is_variable_str
+ *
+ * Purpose:	Check whether a datatype is a variable-length string
+ *
+ * Return:	TRUE (1) or FALSE (0) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_variable_str(const H5T_t *dt)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_IS_VL_STRING(dt->shared))
+} /* end H5T_is_variable_str() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_size
+ *
+ * Purpose:	Determines the total size of a datatype in bytes.
+ *
+ * Return:	Success:	Size of the datatype in bytes.	 The size of
+ *				datatype is the size of an instance of that
+ *				datatype.
+ *
+ *		Failure:	0 (valid datatypes are never zero size)
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5Tget_size(hid_t type_id)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    size_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE1("z", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+
+    /* size */
+    ret_value = H5T_GET_SIZE(dt);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_size
+ *
+ * Purpose:	Sets the total size in bytes for a datatype (this operation
+ *		is not permitted on reference datatypes).  If the size is
+ *		decreased so that the significant bits of the datatype
+ *		extend beyond the edge of the new size, then the `offset'
+ *		property is decreased toward zero.  If the `offset' becomes
+ *		zero and the significant bits of the datatype still hang
+ *		over the edge of the new size, then the number of significant
+ *		bits is decreased.
+ *
+ *		Adjusting the size of an H5T_STRING automatically sets the
+ *		precision to 8*size.
+ *
+ *		All datatypes have a positive size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_size(hid_t type_id, size_t size)
+{
+    H5T_t	*dt;                    /* Datatype to modify */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", type_id, size);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
+    if(size <= 0 && size != H5T_VARIABLE)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size must be positive")
+    if(size == H5T_VARIABLE && !H5T_IS_STRING(dt->shared))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "only strings may be variable length")
+    if(H5T_ENUM == dt->shared->type && dt->shared->u.enumer.nmembs > 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+    if(H5T_REFERENCE == dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for this datatype")
+
+    /* Modify the datatype */
+    if(H5T_set_size(dt, size) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set size for datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_super
+ *
+ * Purpose:	Returns the type from which TYPE is derived. In the case of
+ *		an enumeration type the return value is an integer type.
+ *
+ * Return:	Success:	Type ID for base datatype.
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tget_super(hid_t type)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    H5T_t      *super = NULL;  /* Supertype */
+    hid_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", type);
+
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(NULL == (super = H5T_get_super(dt)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "not a datatype")
+    if((ret_value = H5I_register(H5I_DATATYPE, super, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register parent datatype")
+
+done:
+    if(ret_value < 0)
+        if(super && H5T_close(super) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "unable to release super datatype info")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_super() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_super
+ *
+ * Purpose:	Private function for H5Tget_super.  Returns the type from
+ *              which TYPE is derived. In the case of an enumeration type
+ *              the return value is an integer type.
+ *
+ * Return:	Success:	Data type for base data type.
+ *
+ *		Failure:        NULL
+ *
+ * Programmer:	Raymond Lu
+ *              October 9, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T_get_super(const H5T_t *dt)
+{
+    H5T_t	*ret_value=NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(dt);
+
+    if (!dt->shared->parent)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "not a derived data type");
+    if (NULL==(ret_value=H5T_copy(dt->shared->parent, H5T_COPY_ALL)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy parent data type");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_register
+ *
+ * Purpose:	Register a hard or soft conversion function for a data type
+ *		conversion path.  The path is specified by the source and
+ *		destination data types SRC_ID and DST_ID (for soft functions
+ *		only the class of these types is important). If FUNC is a
+ *		hard function then it replaces any previous path; if it's a
+ *		soft function then it replaces all existing paths to which it
+ *		applies and is used for any new path to which it applies as
+ *		long as that path doesn't have a hard function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_register(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst,
+	    H5T_conv_t func, hid_t dxpl_id, hbool_t api_call)
+{
+    hid_t	tmp_sid=-1, tmp_did=-1;/*temporary data type IDs	*/
+    H5T_path_t	*old_path=NULL;		/*existing conversion path	*/
+    H5T_path_t	*new_path=NULL;		/*new conversion path		*/
+    H5T_cdata_t	cdata;			/*temporary conversion data	*/
+    int	nprint=0;		/*number of paths shut down	*/
+    int	i;			/*counter			*/
+    herr_t	ret_value=SUCCEED;		/*return value			*/
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(src);
+    HDassert(dst);
+    HDassert(func);
+    HDassert(H5T_PERS_HARD==pers || H5T_PERS_SOFT==pers);
+    HDassert(name && *name);
+
+    if(H5T_PERS_HARD == pers) {
+        /* Only bother to register the path if it's not a no-op path (for this machine) */
+        if(H5T_cmp(src, dst, FALSE)) {
+            /* Locate or create a new conversion path */
+            if(NULL == (new_path = H5T_path_find(src, dst, name, func, dxpl_id, api_call)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to locate/allocate conversion path")
+
+            /*
+             * Notify all other functions to recalculate private data since some
+             * functions might cache a list of conversion functions.  For
+             * instance, the compound type converter caches a list of conversion
+             * functions for the members, so adding a new function should cause
+             * the list to be recalculated to use the new function.
+             */
+            for(i = 0; i < H5T_g.npaths; i++)
+                if(new_path != H5T_g.path[i])
+                    H5T_g.path[i]->cdata.recalc = TRUE;
+	} /* end if */
+    } /* end if */
+    else {
+        /* Add function to end of soft list */
+        if((size_t)H5T_g.nsoft >= H5T_g.asoft) {
+            size_t na = MAX(32, 2 * H5T_g.asoft);
+            H5T_soft_t *x;
+
+            if(NULL == (x = (H5T_soft_t *)H5MM_realloc(H5T_g.soft, na * sizeof(H5T_soft_t))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            H5T_g.asoft = na;
+            H5T_g.soft = x;
+        } /* end if */
+        HDstrncpy(H5T_g.soft[H5T_g.nsoft].name, name, (size_t)H5T_NAMELEN);
+        H5T_g.soft[H5T_g.nsoft].name[H5T_NAMELEN - 1] = '\0';
+        H5T_g.soft[H5T_g.nsoft].src = src->shared->type;
+        H5T_g.soft[H5T_g.nsoft].dst = dst->shared->type;
+        H5T_g.soft[H5T_g.nsoft].func = func;
+        H5T_g.nsoft++;
+
+        /*
+         * Any existing path (except the no-op path) to which this new soft
+         * conversion function applies should be replaced by a new path that
+         * uses this function.
+         */
+        for (i=1; i<H5T_g.npaths; i++) {
+            old_path = H5T_g.path[i];
+            HDassert(old_path);
+
+            /* Does the new soft conversion function apply to this path? */
+            if (old_path->is_hard ||
+                    old_path->src->shared->type!=src->shared->type ||
+                    old_path->dst->shared->type!=dst->shared->type) {
+                continue;
+            }
+            if((tmp_sid = H5I_register(H5I_DATATYPE, H5T_copy(old_path->src, H5T_COPY_ALL), FALSE)) < 0 ||
+                    (tmp_did = H5I_register(H5I_DATATYPE, H5T_copy(old_path->dst, H5T_COPY_ALL), FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data types for conv query")
+            HDmemset(&cdata, 0, sizeof cdata);
+            cdata.command = H5T_CONV_INIT;
+            if((func)(tmp_sid, tmp_did, &cdata, (size_t)0, (size_t)0, (size_t)0,
+                    NULL, NULL, dxpl_id) < 0) {
+                H5I_dec_ref(tmp_sid);
+                H5I_dec_ref(tmp_did);
+                tmp_sid = tmp_did = -1;
+                H5E_clear_stack(NULL);
+                continue;
+            } /* end if */
+
+            /* Create a new conversion path */
+            if(NULL == (new_path = H5FL_CALLOC(H5T_path_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            HDstrncpy(new_path->name, name, (size_t)H5T_NAMELEN);
+            new_path->name[H5T_NAMELEN - 1] = '\0';
+            if(NULL == (new_path->src = H5T_copy(old_path->src, H5T_COPY_ALL)) ||
+                    NULL == (new_path->dst=H5T_copy(old_path->dst, H5T_COPY_ALL)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy data types")
+            new_path->func = func;
+            new_path->is_hard = FALSE;
+            new_path->cdata = cdata;
+
+            /* Replace previous path */
+            H5T_g.path[i] = new_path;
+            new_path = NULL; /*so we don't free it on error*/
+
+            /* Free old path */
+            H5T__print_stats(old_path, &nprint);
+            old_path->cdata.command = H5T_CONV_FREE;
+            if ((old_path->func)(tmp_sid, tmp_did, &(old_path->cdata),
+                    (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id)<0) {
+#ifdef H5T_DEBUG
+		if (H5DEBUG(T)) {
+		    fprintf (H5DEBUG(T), "H5T: conversion function 0x%08lx "
+			     "failed to free private data for %s (ignored)\n",
+			     (unsigned long)(old_path->func), old_path->name);
+		}
+#endif
+            } /* end if */
+            H5T_close(old_path->src);
+            H5T_close(old_path->dst);
+            old_path = H5FL_FREE(H5T_path_t, old_path);
+
+            /* Release temporary atoms */
+            H5I_dec_ref(tmp_sid);
+            H5I_dec_ref(tmp_did);
+            tmp_sid = tmp_did = -1;
+
+            /* We don't care about any failures during the freeing process */
+	    H5E_clear_stack(NULL);
+        } /* end for */
+    } /* end else */
+
+done:
+    if(ret_value < 0) {
+	if(new_path) {
+	    if(new_path->src)
+                H5T_close(new_path->src);
+	    if(new_path->dst)
+                H5T_close(new_path->dst);
+            new_path = H5FL_FREE(H5T_path_t, new_path);
+	} /* end if */
+	if(tmp_sid >= 0)
+            H5I_dec_ref(tmp_sid);
+	if(tmp_did >= 0)
+            H5I_dec_ref(tmp_did);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_register() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tregister
+ *
+ * Purpose:	Register a hard or soft conversion function for a data type
+ *		conversion path.  The path is specified by the source and
+ *		destination data types SRC_ID and DST_ID (for soft functions
+ *		only the class of these types is important). If FUNC is a
+ *		hard function then it replaces any previous path; if it's a
+ *		soft function then it replaces all existing paths to which it
+ *		applies and is used for any new path to which it applies as
+ *		long as that path doesn't have a hard function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tregister(H5T_pers_t pers, const char *name, hid_t src_id, hid_t dst_id,
+	    H5T_conv_t func)
+{
+    H5T_t	*src;		        /*source data type descriptor	*/
+    H5T_t	*dst;		        /*destination data type desc	*/
+    herr_t	ret_value = SUCCEED;	/*return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "Te*siix", pers, name, src_id, dst_id, func);
+
+    /* Check args */
+    if(H5T_PERS_HARD != pers && H5T_PERS_SOFT != pers)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid function persistence")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "conversion must have a name for debugging")
+    if(NULL == (src = (H5T_t *)H5I_object_verify(src_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(NULL == (dst = (H5T_t *)H5I_object_verify(dst_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(!func)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no conversion function specified")
+
+    /* Go register the function */
+    if(H5T_register(pers, name, src, dst, func, H5AC_ind_dxpl_id, TRUE) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't register conversion function")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_unregister
+ *
+ * Purpose:	Removes conversion paths that match the specified criteria.
+ *		All arguments are optional. Missing arguments are wild cards.
+ *		The special no-op path cannot be removed.
+ *
+ * Return:	Succeess:	non-negative
+ *
+ * 		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January 13, 1998
+ *
+ * Modifications:
+ *      Adapted to non-API function - QAK, 11/17/99
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst,
+	      H5T_conv_t func, hid_t dxpl_id)
+{
+    H5T_path_t	*path = NULL;		/*conversion path		*/
+    H5T_soft_t	*soft = NULL;		/*soft conversion information	*/
+    int	nprint = 0;		/*number of paths shut down	*/
+    int	i;			/*counter			*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Remove matching entries from the soft list */
+    if(H5T_PERS_DONTCARE == pers || H5T_PERS_SOFT == pers) {
+        for(i = H5T_g.nsoft - 1; i >= 0; --i) {
+            soft = H5T_g.soft + i;
+            HDassert(soft);
+            if(name && *name && HDstrcmp(name, soft->name))
+                continue;
+            if(src && src->shared->type != soft->src)
+                continue;
+            if(dst && dst->shared->type != soft->dst)
+                continue;
+            if(func && func != soft->func)
+                continue;
+
+            HDmemmove(H5T_g.soft + i, H5T_g.soft + i + 1, (size_t)(H5T_g.nsoft - (i + 1)) * sizeof(H5T_soft_t));
+            --H5T_g.nsoft;
+        } /* end for */
+    } /* end if */
+
+    /* Remove matching conversion paths, except no-op path */
+    for(i = H5T_g.npaths - 1; i > 0; --i) {
+        path = H5T_g.path[i];
+        HDassert(path);
+
+        /* Not a match */
+        if(((H5T_PERS_SOFT == pers && path->is_hard) ||
+                    (H5T_PERS_HARD == pers && !path->is_hard)) ||
+                (name && *name && HDstrcmp(name, path->name)) ||
+                (src && H5T_cmp(src, path->src, FALSE)) ||
+                (dst && H5T_cmp(dst, path->dst, FALSE)) ||
+                (func && func!=path->func)) {
+            /*
+             * Notify all other functions to recalculate private data since some
+             * functions might cache a list of conversion functions.  For
+             * instance, the compound type converter caches a list of conversion
+             * functions for the members, so removing a function should cause
+             * the list to be recalculated to avoid the removed function.
+             */
+            path->cdata.recalc = TRUE;
+        } /* end if */
+        else {
+            /* Remove from table */
+            HDmemmove(H5T_g.path + i, H5T_g.path + i + 1, (size_t)(H5T_g.npaths - (i + 1)) * sizeof(H5T_path_t*));
+            --H5T_g.npaths;
+
+            /* Shut down path */
+            H5T__print_stats(path, &nprint);
+            path->cdata.command = H5T_CONV_FREE;
+            if((path->func)((hid_t)FAIL, (hid_t)FAIL, &(path->cdata),
+                    (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id) < 0) {
+#ifdef H5T_DEBUG
+                if(H5DEBUG(T)) {
+                    fprintf(H5DEBUG(T), "H5T: conversion function 0x%08lx failed "
+                            "to free private data for %s (ignored)\n",
+                            (unsigned long)(path->func), path->name);
+                }
+#endif
+            }
+            H5T_close(path->src);
+            H5T_close(path->dst);
+            path = H5FL_FREE(H5T_path_t, path);
+            H5E_clear_stack(NULL); /*ignore all shutdown errors*/
+        } /* end else */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T_unregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tunregister
+ *
+ * Purpose:	Removes conversion paths that match the specified criteria.
+ *		All arguments are optional. Missing arguments are wild cards.
+ *		The special no-op path cannot be removed.
+ *
+ * Return:	Succeess:	non-negative
+ *
+ * 		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tunregister(H5T_pers_t pers, const char *name, hid_t src_id, hid_t dst_id,
+	      H5T_conv_t func)
+{
+    H5T_t	*src = NULL, *dst = NULL;	/* Datatype descriptors	*/
+    herr_t      ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "Te*siix", pers, name, src_id, dst_id, func);
+
+    /* Check arguments */
+    if(src_id > 0 && (NULL == (src = (H5T_t *)H5I_object_verify(src_id, H5I_DATATYPE))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "src is not a data type")
+    if(dst_id > 0 && (NULL == (dst = (H5T_t *)H5I_object_verify(dst_id, H5I_DATATYPE))))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dst is not a data type")
+
+    if(H5T_unregister(pers, name, src, dst, func, H5AC_ind_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "internal unregister function failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tunregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tfind
+ *
+ * Purpose:	Finds a conversion function that can handle a conversion from
+ *		type SRC_ID to type DST_ID.  The PCDATA argument is a pointer
+ *		to a pointer to type conversion data which was created and
+ *		initialized by the type conversion function of this path
+ *		when the conversion function was installed on the path.
+ *
+ * Return:	Success:	A pointer to a suitable conversion function.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January 13, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_conv_t
+H5Tfind(hid_t src_id, hid_t dst_id, H5T_cdata_t **pcdata)
+{
+    H5T_t	*src, *dst;
+    H5T_path_t	*path;
+    H5T_conv_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE3("x", "ii**x", src_id, dst_id, pcdata);
+
+    /* Check args */
+    if(NULL == (src = (H5T_t *)H5I_object_verify(src_id, H5I_DATATYPE)) ||
+            NULL == (dst = (H5T_t *)H5I_object_verify(dst_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+    if(!pcdata)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "no address to receive cdata pointer")
+
+    /* Find it */
+    if(NULL == (path = H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id, FALSE)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "conversion function not found")
+
+    if(pcdata)
+        *pcdata = &(path->cdata);
+
+    /* Set return value */
+    ret_value = path->func;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tfind() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcompiler_conv
+ *
+ * Purpose:	Finds out whether the library's conversion function from
+ *              type src_id to type dst_id is a compiler (hard) conversion.
+ *              A hard conversion uses compiler's casting; a soft conversion
+ *              uses the library's own conversion function.
+ *
+ * Return:	TRUE:           hard conversion.
+ *		FALSE:          soft conversion.
+ *		FAIL:           failed.
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Sept 2, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Tcompiler_conv(hid_t src_id, hid_t dst_id)
+{
+    H5T_t	*src, *dst;
+    htri_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("t", "ii", src_id, dst_id);
+
+    /* Check args */
+    if(NULL == (src = (H5T_t *)H5I_object_verify(src_id, H5I_DATATYPE)) ||
+            NULL == (dst = (H5T_t *)H5I_object_verify(dst_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+
+    /* Find it */
+    if((ret_value = H5T_compiler_conv(src, dst)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcompiler_conv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tconvert
+ *
+ * Purpose:	Convert NELMTS elements from type SRC_ID to type DST_ID.  The
+ *		source elements are packed in BUF and on return the
+ *		destination will be packed in BUF.  That is, the conversion
+ *		is performed in place.  The optional background buffer is an
+ *		array of NELMTS values of destination type which are merged
+ *		with the converted values to fill in cracks (for instance,
+ *		BACKGROUND might be an array of structs with the `a' and `b'
+ *		fields already initialized and the conversion of BUF supplies
+ *		the `c' and `d' field values).  The PLIST_ID a dataset transfer
+ *      property list which is passed to the conversion functions.  (It's
+ *      currently only used to pass along the VL datatype custom allocation
+ *      information -QAK 7/1/99)
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, June 10, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tconvert(hid_t src_id, hid_t dst_id, size_t nelmts, void *buf,
+	    void *background, hid_t dxpl_id)
+{
+    H5T_path_t	*tpath;			/*type conversion info	*/
+    H5T_t	*src, *dst;		/*unatomized types	*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "iiz*x*xi", src_id, dst_id, nelmts, buf, background, dxpl_id);
+
+    /* Check args */
+    if(NULL == (src = (H5T_t *)H5I_object_verify(src_id, H5I_DATATYPE)) ||
+            NULL == (dst = (H5T_t *)H5I_object_verify(dst_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset transfer property list")
+
+    /* Find the conversion function */
+    if(NULL == (tpath = H5T_path_find(src, dst, NULL, NULL, dxpl_id, FALSE)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst data types")
+
+    if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, buf, background, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "data type conversion failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tconvert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tencode
+ *
+ * Purpose:	Given an datatype ID, converts the object description into
+ *              binary in a buffer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tencode(hid_t obj_id, void *buf, size_t *nalloc)
+{
+    H5T_t       *dtype;
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x*z", obj_id, buf, nalloc);
+
+    /* Check argument and retrieve object */
+    if(NULL == (dtype = (H5T_t *)H5I_object_verify(obj_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(nalloc == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL pointer for buffer size")
+
+    /* Go encode the datatype */
+    if(H5T_encode(dtype, (unsigned char *)buf, nalloc) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tencode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tdecode
+ *
+ * Purpose:	Decode a binary object description and return a new object
+ *              handle.
+ *
+ * Return:	Success:	datatype ID(non-negative)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ * Modification:Raymond Lu
+ *              songyulu at hdfgroup.org
+ *              17 February 2011
+ *              I changed the value for the APP_REF parameter of H5I_register
+ *              from FALSE to TRUE. 
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tdecode(const void *buf)
+{
+    H5T_t       *dt;
+    hid_t       ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "*x", buf);
+
+    /* Check args */
+    if(buf == NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer")
+
+    /* Create datatype by decoding buffer */
+    if(NULL == (dt = H5T_decode((const unsigned char *)buf)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "can't decode object")
+
+    /* Register the type and return the ID */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tdecode() */
+
+/*-------------------------------------------------------------------------
+ * API functions are above; library-private functions are below...
+ *-------------------------------------------------------------------------
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_encode
+ *
+ * Purpose:	Private function for H5Tencode.  Converts an object
+ *              description into binary in a buffer.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
+{
+    size_t      buf_size;               /* Encoded size of datatype */
+    H5F_t       *f = NULL;              /* Fake file structure*/
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate "fake" file structure */
+    if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
+
+    /* Find out the size of buffer needed */
+    if((buf_size = H5O_msg_raw_size(f, H5O_DTYPE_ID, TRUE, obj)) == 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "can't find datatype size")
+
+    /* Don't encode if buffer size isn't big enough or buffer is empty */
+    if(!buf || *nalloc < (buf_size + 1 + 1))
+        *nalloc = buf_size + 1 + 1;
+    else {
+        /* Encode the type of the information */
+        *buf++ = H5O_DTYPE_ID;
+
+        /* Encode the version of the dataspace information */
+        *buf++ = H5T_ENCODE_VERSION;
+
+        /* Encode into user's buffer */
+        if(H5O_msg_encode(f, H5O_DTYPE_ID, TRUE, buf, obj) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object")
+    } /* end else */
+
+done:
+    /* Release fake file structure */
+    if(f && H5F_fake_free(f) < 0)
+        HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "unable to release fake file struct")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_decode
+ *
+ * Purpose:	Private function for H5Tdecode.  Reconstructs a binary
+ *              description of datatype and returns a new object handle.
+ *
+ * Return:	Success:	datatype ID(non-negative)
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              slu at ncsa.uiuc.edu
+ *              July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t *
+H5T_decode(const unsigned char *buf)
+{
+    H5F_t       *f = NULL;      /* Fake file structure*/
+    H5T_t       *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate "fake" file structure */
+    if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
+
+    /* Decode the type of the information */
+    if(*buf++ != H5O_DTYPE_ID)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADMESG, NULL, "not an encoded datatype")
+
+    /* Decode the version of the datatype information */
+    if(*buf++ != H5T_ENCODE_VERSION)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, NULL, "unknown version of encoded datatype")
+
+    /* Decode the serialized datatype message */
+    if(NULL == (ret_value = (H5T_t *)H5O_msg_decode(f, H5AC_ind_dxpl_id, NULL, H5O_DTYPE_ID, buf)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode object")
+
+    /* Mark datatype as being in memory now */
+    if(H5T_set_loc(ret_value, NULL, H5T_LOC_MEMORY) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+done:
+    /* Release fake file structure */
+    if(f && H5F_fake_free(f) < 0)
+        HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, NULL, "unable to release fake file struct")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__create
+ *
+ * Purpose:	Creates a new data type and initializes it to reasonable
+ *		values.	 The new data type is SIZE bytes and an instance of
+ *		the class TYPE.
+ *
+ * Return:	Success:	Pointer to the new type.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, December  5, 1997
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              19 May 2011
+ *              We support fixed size or variable-length string now.
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T__create(H5T_class_t type, size_t size)
+{
+    H5T_t  *dt = NULL;
+    H5T_t  *ret_value = NULL;
+
+    FUNC_ENTER_PACKAGE
+
+    switch(type) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+            {
+                H5T_t *origin_dt = NULL;
+
+		if(NULL == (origin_dt = (H5T_t *)H5I_object(H5T_C_S1)))
+		    HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, NULL, "can't get structure for string type")
+
+		/* Copy the default string datatype */
+		if(NULL == (dt = H5T_copy(origin_dt, H5T_COPY_TRANSIENT)))
+		    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy");
+
+		/* Modify the datatype */
+		if(H5T_set_size(dt, size) < 0)
+		    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to set size for string type")
+            }
+            break;
+
+        case H5T_BITFIELD:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, "type class is not appropriate - use H5Tcopy()")
+
+        case H5T_OPAQUE:
+        case H5T_COMPOUND:
+            if(NULL == (dt = H5T__alloc()))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+            dt->shared->type = type;
+
+            if(type == H5T_COMPOUND) {
+                dt->shared->u.compnd.packed=FALSE;       /* Start out unpacked */
+                dt->shared->u.compnd.memb_size=0;
+            } /* end if */
+            else if(type == H5T_OPAQUE)
+                /* Initialize the tag in case it's not set later.  A null tag will
+                 * cause problems for later operations. */
+                dt->shared->u.opaque.tag = H5MM_strdup("");
+            break;
+
+        case H5T_ENUM:
+            {
+                hid_t  subtype;
+                H5T_t  *sub_t_obj;
+
+                if(sizeof(char) == size)
+                    subtype = H5T_NATIVE_SCHAR_g;
+                else if(sizeof(short) == size)
+                    subtype = H5T_NATIVE_SHORT_g;
+                else if(sizeof(int) == size)
+                    subtype = H5T_NATIVE_INT_g;
+                else if(sizeof(long) == size)
+                    subtype = H5T_NATIVE_LONG_g;
+                else if(sizeof(long long) == size)
+                    subtype = H5T_NATIVE_LLONG_g;
+                else
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "no applicable native integer type")
+                if(NULL == (dt = H5T__alloc()))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+                dt->shared->type = type;
+                if(NULL == (sub_t_obj = (H5T_t *)H5I_object(subtype)))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, NULL, "unable to get datatype object")
+                if(NULL == (dt->shared->parent = H5T_copy(sub_t_obj, H5T_COPY_ALL)))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "unable to copy base datatype")
+            }
+            break;
+
+        case H5T_VLEN:  /* Variable length datatype */
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, "base type required - use H5Tvlen_create()")
+
+        case H5T_ARRAY:  /* Array datatype */
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, "base type required - use H5Tarray_create2()")
+
+        case H5T_NO_CLASS:
+        case H5T_REFERENCE:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, NULL, "unknown data type class")
+    } /* end switch */
+
+    /* Set the size except VL string */
+    if(H5T_STRING != type || H5T_VARIABLE != size)
+        dt->shared->size = size;
+
+    /* Set return value */
+    ret_value = dt;
+
+done:
+    if(NULL == ret_value) {
+        if(dt) {
+            dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+            dt = H5FL_FREE(H5T_t, dt);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_copy
+ *
+ * Purpose:	Copies datatype OLD_DT.	 The resulting data type is not
+ *		locked and is a transient type.
+ *
+ * Return:	Success:	Pointer to a new copy of the OLD_DT argument.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, December  4, 1997
+ *
+ * Modifications:
+ *
+ * 	Robb Matzke, 4 Jun 1998
+ *	Added the METHOD argument.  If it's H5T_COPY_TRANSIENT then the
+ *	result will be an unlocked transient type.  Otherwise if it's
+ *	H5T_COPY_ALL then the result is a named type if the original is a
+ *	named type, but the result is not opened.  Finally, if it's
+ *	H5T_COPY_REOPEN and the original type is a named type then the result
+ *	is a named type and the type object header is opened again.  The
+ *	H5T_COPY_REOPEN method is used when returning a named type to the
+ *	application.
+ *
+ * 	Robb Matzke, 22 Dec 1998
+ *	Now able to copy enumeration data types.
+ *
+ *      Robb Matzke, 20 May 1999
+ *	Now able to copy opaque types.
+ *
+ *      Pedro Vicente, <pvn at ncsa.uiuc.edu> 21 Sep 2002
+ *      Added a deep copy of the symbol table entry
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T_copy(H5T_t *old_dt, H5T_copy_t method)
+{
+    H5T_t	*new_dt = NULL, *tmp = NULL;
+    H5T_shared_t    *reopened_fo = NULL;
+    unsigned	i;
+    char	*s;
+    H5T_t	*ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(old_dt);
+
+    /* Allocate space */
+    if(NULL == (new_dt = H5FL_MALLOC(H5T_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+    if(NULL == (new_dt->shared = H5FL_MALLOC(H5T_shared_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+    /* Copy shared information (entry information is copied last) */
+    *(new_dt->shared) = *(old_dt->shared);
+
+    /* Check what sort of copy we are making */
+    switch (method) {
+        case H5T_COPY_TRANSIENT:
+            /*
+             * Return an unlocked transient type.
+             */
+            new_dt->shared->state = H5T_STATE_TRANSIENT;
+            break;
+
+        case H5T_COPY_ALL:
+            /*
+             * Return a transient type (locked or unlocked) or an unopened named
+             * type.  Immutable transient types are degraded to read-only.
+             */
+            if(H5T_STATE_OPEN==old_dt->shared->state)
+                new_dt->shared->state = H5T_STATE_NAMED;
+            else if(H5T_STATE_IMMUTABLE==old_dt->shared->state)
+                new_dt->shared->state = H5T_STATE_RDONLY;
+            break;
+
+        case H5T_COPY_REOPEN:
+            /*
+             * Return a transient type (locked or unlocked) or an opened named
+             * type.  Immutable transient types are degraded to read-only.
+             */
+            if(old_dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED) {
+                /* Check if the object is already open */
+                if(NULL == (reopened_fo = (H5T_shared_t *)H5FO_opened(old_dt->sh_loc.file, old_dt->sh_loc.u.loc.oh_addr))) {
+                    /* Clear any errors from H5FO_opened() */
+                    H5E_clear_stack(NULL);
+
+                    /* Open named datatype again */
+                    if(H5O_open(&old_dt->oloc) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to reopen named data type");
+
+                    /* Insert opened named datatype into opened object list for the file */
+                    if(H5FO_insert(old_dt->sh_loc.file, old_dt->sh_loc.u.loc.oh_addr, new_dt->shared, FALSE)<0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, NULL, "can't insert datatype into list of open objects")
+
+                    /* Increment object count for the object in the top file */
+                    if(H5FO_top_incr(old_dt->sh_loc.file, old_dt->sh_loc.u.loc.oh_addr) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, NULL, "can't increment object count")
+
+                    new_dt->shared->fo_count = 1;
+                } /* end if */
+                else {
+                    /* The object is already open.  Free the H5T_shared_t struct
+                     * we had been using and use the one that already exists.
+                     * Not terribly efficient. */
+                    new_dt->shared = H5FL_FREE(H5T_shared_t, new_dt->shared);
+                    new_dt->shared = reopened_fo;
+
+                    reopened_fo->fo_count++;
+
+                    /* Check if the object has been opened through the top file yet */
+                    if(H5FO_top_count(old_dt->sh_loc.file, old_dt->sh_loc.u.loc.oh_addr) == 0) {
+                        /* Open the object through this top file */
+                        if(H5O_open(&old_dt->oloc) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to open object header")
+                    } /* end if */
+
+                    /* Increment object count for the object in the top file */
+                    if(H5FO_top_incr(old_dt->sh_loc.file, old_dt->sh_loc.u.loc.oh_addr) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, NULL, "can't increment object count")
+                } /* end else */
+                new_dt->shared->state = H5T_STATE_OPEN;
+            } else if(H5T_STATE_IMMUTABLE == old_dt->shared->state) {
+                new_dt->shared->state = H5T_STATE_RDONLY;
+            }
+            break;
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, NULL, "invalid copy method type")
+    } /* end switch */
+
+    /* Update fields in the new struct, if we aren't sharing an already opened
+     * committed datatype */
+    if(!reopened_fo) {
+        /* Copy parent information */
+        if(old_dt->shared->parent)
+            new_dt->shared->parent = H5T_copy(old_dt->shared->parent, method);
+
+        switch(new_dt->shared->type) {
+            case H5T_COMPOUND:
+                {
+                ssize_t accum_change = 0; /* Amount of change in the offset of the fields */
+
+                /*
+                * Copy all member fields to new type, then overwrite the
+                * name and type fields of each new member with copied values.
+                * That is, H5T_copy() is a deep copy.
+                */
+                /* Only malloc if space has been allocated for members - NAF */
+                if(new_dt->shared->u.compnd.nalloc > 0) {
+                    new_dt->shared->u.compnd.memb = (H5T_cmemb_t *)H5MM_malloc(new_dt->shared->u.compnd.nalloc *
+                                        sizeof(H5T_cmemb_t));
+                    if (NULL==new_dt->shared->u.compnd.memb)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+                    HDmemcpy(new_dt->shared->u.compnd.memb, old_dt->shared->u.compnd.memb,
+                        new_dt->shared->u.compnd.nmembs * sizeof(H5T_cmemb_t));
+                } /* end if */
+
+                for(i = 0; i < new_dt->shared->u.compnd.nmembs; i++) {
+                    unsigned	j;
+                    int    old_match;
+
+                    s = new_dt->shared->u.compnd.memb[i].name;
+                    new_dt->shared->u.compnd.memb[i].name = H5MM_xstrdup(s);
+                    tmp = H5T_copy (old_dt->shared->u.compnd.memb[i].type, method);
+                    new_dt->shared->u.compnd.memb[i].type = tmp;
+                    HDassert(tmp != NULL);
+
+                    /* Range check against compound member's offset */
+                    if ((accum_change < 0) && ((ssize_t) new_dt->shared->u.compnd.memb[i].offset < accum_change))
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, NULL, "invalid field size in datatype");
+
+                    /* Apply the accumulated size change to the offset of the field */
+                    new_dt->shared->u.compnd.memb[i].offset += (size_t) accum_change;
+
+                    if(old_dt->shared->u.compnd.sorted != H5T_SORT_VALUE) {
+                        for(old_match = -1, j = 0; j < old_dt->shared->u.compnd.nmembs; j++) {
+                            if(!HDstrcmp(new_dt->shared->u.compnd.memb[i].name, old_dt->shared->u.compnd.memb[j].name)) {
+                                old_match = (int) j;
+                                break;
+                            } /* end if */
+                        } /* end for */
+
+                        /* check if we couldn't find a match */
+                        if(old_match < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "fields in datatype corrupted");
+                    } /* end if */
+                    else
+                        old_match = (int) i;
+
+                    /* If the field changed size, add that change to the accumulated size change */
+                    if(new_dt->shared->u.compnd.memb[i].type->shared->size != old_dt->shared->u.compnd.memb[old_match].type->shared->size) {
+                        /* Adjust the size of the member */
+                        new_dt->shared->u.compnd.memb[i].size = (old_dt->shared->u.compnd.memb[old_match].size*tmp->shared->size)/old_dt->shared->u.compnd.memb[old_match].type->shared->size;
+
+                        accum_change += (ssize_t) (new_dt->shared->u.compnd.memb[i].type->shared->size - old_dt->shared->u.compnd.memb[old_match].type->shared->size);
+                    } /* end if */
+                } /* end for */
+
+                /* Range check against datatype size */
+                if ((accum_change < 0) && ((ssize_t) new_dt->shared->size < accum_change))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, NULL, "invalid field size in datatype");
+
+                /* Apply the accumulated size change to the size of the compound struct */
+                new_dt->shared->size += (size_t) accum_change;
+                }
+                break;
+
+            case H5T_ENUM:
+                /*
+                * Copy all member fields to new type, then overwrite the name fields
+                * of each new member with copied values. That is, H5T_copy() is a
+                * deep copy.
+                */
+                new_dt->shared->u.enumer.name = (char **)H5MM_malloc(new_dt->shared->u.enumer.nalloc *
+                                    sizeof(char*));
+                new_dt->shared->u.enumer.value = (uint8_t *)H5MM_malloc(new_dt->shared->u.enumer.nalloc *
+                                    new_dt->shared->size);
+                if(NULL == new_dt->shared->u.enumer.value)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+                HDmemcpy(new_dt->shared->u.enumer.value, old_dt->shared->u.enumer.value,
+                    new_dt->shared->u.enumer.nmembs * new_dt->shared->size);
+                for(i = 0; i < new_dt->shared->u.enumer.nmembs; i++) {
+                    s = old_dt->shared->u.enumer.name[i];
+                    new_dt->shared->u.enumer.name[i] = H5MM_xstrdup(s);
+                } /* end for */
+                break;
+
+            case H5T_VLEN:
+            case H5T_REFERENCE:
+                if(method == H5T_COPY_TRANSIENT || method == H5T_COPY_REOPEN) {
+                    /* H5T_copy converts any type into a memory type */
+                    if(H5T_set_loc(new_dt, NULL, H5T_LOC_MEMORY) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location");
+                } /* end if */
+                break;
+
+            case H5T_OPAQUE:
+                /*
+                * Copy the tag name.
+                */
+                new_dt->shared->u.opaque.tag = H5MM_xstrdup(new_dt->shared->u.opaque.tag);
+                break;
+
+            case H5T_ARRAY:
+                /* Re-compute the array's size, in case it's base type changed size */
+                new_dt->shared->size=new_dt->shared->u.array.nelem*new_dt->shared->parent->shared->size;
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_TIME:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_NCLASSES:
+            default:
+                break;
+        } /* end switch */
+    } /* end if */
+
+    /* Set the cached location & name path if the original type was a named
+     * type and the new type is also named.
+     */
+    if(H5O_loc_reset(&new_dt->oloc) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRESET, NULL, "unable to initialize location")
+    if(H5G_name_reset(&new_dt->path) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to reset path")
+
+    if(new_dt->shared->state == H5T_STATE_NAMED || new_dt->shared->state == H5T_STATE_OPEN) {
+        if(H5O_loc_copy(&(new_dt->oloc), &(old_dt->oloc), H5_COPY_DEEP) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy object location")
+        if(H5G_name_copy(&(new_dt->path), &(old_dt->path), H5_COPY_DEEP) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to copy path")
+    } /* end if */
+
+    /* Copy shared location information if the new type is named or if it is
+     * shared in the heap.
+     */
+    if((old_dt->sh_loc.type == H5O_SHARE_TYPE_SOHM || old_dt->sh_loc.type == H5O_SHARE_TYPE_HERE) ||
+            new_dt->shared->state == H5T_STATE_NAMED || new_dt->shared->state == H5T_STATE_OPEN) {
+        if(H5O_set_shared(&(new_dt->sh_loc), &(old_dt->sh_loc)) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy shared information")
+    } /* end if */
+    else
+        /* Reset shared component info */
+        H5O_msg_reset_share(H5O_DTYPE_ID, new_dt);
+
+    /* Set return value */
+    ret_value = new_dt;
+
+done:
+    if(ret_value == NULL) {
+        if(new_dt) {
+            if(new_dt->shared)
+                new_dt->shared = H5FL_FREE(H5T_shared_t, new_dt->shared);
+            new_dt = H5FL_FREE(H5T_t, new_dt);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_lock
+ *
+ * Purpose:	Lock a transient data type making it read-only.  If IMMUTABLE
+ *		is set then the type cannot be closed except when the library
+ *		itself closes.
+ *
+ *		This function is a no-op if the type is not transient or if
+ *		the type is already read-only or immutable.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, June  4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_lock (H5T_t *dt, hbool_t immutable)
+{
+    herr_t ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert (dt);
+
+    switch (dt->shared->state) {
+        case H5T_STATE_TRANSIENT:
+            dt->shared->state = immutable ? H5T_STATE_IMMUTABLE : H5T_STATE_RDONLY;
+            break;
+        case H5T_STATE_RDONLY:
+            if (immutable) dt->shared->state = H5T_STATE_IMMUTABLE;
+            break;
+        case H5T_STATE_IMMUTABLE:
+        case H5T_STATE_NAMED:
+        case H5T_STATE_OPEN:
+            /*void*/
+            break;
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "invalid datatype state")
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__alloc
+ *
+ * Purpose:	Allocates a new H5T_t structure, initializing it correctly.
+ *
+ * Return:	Pointer to new H5T_t on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, August 29, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T__alloc(void)
+{
+    H5T_t *dt = NULL;           /* Pointer to datatype allocated */
+    H5T_t *ret_value;           /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Allocate & initialize datatype wrapper info */
+    if(NULL == (dt = H5FL_CALLOC(H5T_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    H5O_loc_reset(&(dt->oloc));
+    H5G_name_reset(&(dt->path));
+    H5O_msg_reset_share(H5O_DTYPE_ID, dt);
+
+    /* Allocate & initialize shared datatype structure */
+    if(NULL == (dt->shared = H5FL_CALLOC(H5T_shared_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    dt->shared->version = H5O_DTYPE_VERSION_1;
+
+    /* Assign return value */
+    ret_value = dt;
+
+done:
+    if(ret_value == NULL)
+        if(dt) {
+            if(dt->shared)
+                dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+            dt = H5FL_FREE(H5T_t, dt);
+        } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__free
+ *
+ * Purpose:	Frees all memory associated with a datatype, but does not
+ *              free the H5T_t or H5T_shared_t structures (which should
+ *              be done in H5T_close).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, January  6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__free(H5T_t *dt)
+{
+    unsigned	i;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dt && dt->shared);
+
+    /*
+     * If a named type is being closed then close the object header and
+     * remove from the list of open objects in the file.
+     */
+    if(H5T_STATE_OPEN == dt->shared->state) {
+        HDassert(dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+        HDassert(H5F_addr_defined(dt->sh_loc.u.loc.oh_addr));
+        HDassert(H5F_addr_defined(dt->oloc.addr));
+
+        /* Remove the datatype from the list of opened objects in the file */
+        if(H5FO_top_decr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+        if(H5FO_delete(dt->sh_loc.file, H5AC_dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't remove datatype from list of open objects")
+        if(H5O_close(&dt->oloc) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to close data type object header")
+        dt->shared->state = H5T_STATE_NAMED;
+    } /* end if */
+
+    /* Free the ID to name info */
+    H5G_name_free(&(dt->path));
+
+    /*
+     * Don't free locked datatypes.
+     */
+    if(H5T_STATE_IMMUTABLE==dt->shared->state)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to close immutable datatype")
+
+    /* Close the datatype */
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+            for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                H5MM_xfree(dt->shared->u.compnd.memb[i].name);
+                H5T_close(dt->shared->u.compnd.memb[i].type);
+            } /* end for */
+            H5MM_xfree(dt->shared->u.compnd.memb);
+            break;
+
+        case H5T_ENUM:
+            for(i = 0; i < dt->shared->u.enumer.nmembs; i++)
+                H5MM_xfree(dt->shared->u.enumer.name[i]);
+            H5MM_xfree(dt->shared->u.enumer.name);
+            H5MM_xfree(dt->shared->u.enumer.value);
+            break;
+
+        case H5T_OPAQUE:
+            H5MM_xfree(dt->shared->u.opaque.tag);
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_REFERENCE:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            break;
+    } /* end switch */
+
+    /* Close the parent */
+    HDassert(dt->shared->parent != dt);
+    if(dt->shared->parent && H5T_close(dt->shared->parent) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close parent data type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_close
+ *
+ * Purpose:	Frees a data type and all associated memory.  If the data
+ *		type is locked then nothing happens.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ * Modifications:
+ *      Robb Matzke, 1999-04-27
+ *      This function fails if the datatype state is IMMUTABLE.
+ *
+ *      Robb Matzke, 1999-05-20
+ *      Closes opaque types also.
+ *
+ *      Pedro Vicente, <pvn at ncsa.uiuc.edu> 22 Aug 2002
+ *      Added "ID to name" support
+ *
+ *      Quincey Koziol, 2003-01-06
+ *      Moved "guts" of function to H5T__free()
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_close(H5T_t *dt)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt && dt->shared);
+
+    if(dt->shared->state == H5T_STATE_OPEN)
+        dt->shared->fo_count--;
+
+    if(dt->shared->state != H5T_STATE_OPEN || dt->shared->fo_count == 0) {
+        if(H5T__free(dt) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "unable to free datatype");
+
+        dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+    } else {
+        /*
+         * If a named type is being closed then close the object header and
+         * remove from the list of open objects in the file.
+         */
+        if(H5T_STATE_OPEN == dt->shared->state) {
+            HDassert(dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+
+            /* Decrement the ref. count for this object in the top file */
+            if(H5FO_top_decr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+
+            /* Check reference count for this object in the top file */
+            if(H5FO_top_count(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) == 0) {
+                /* Close object location for named datatype */
+                if(H5O_close(&dt->oloc) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to close")
+            } /* end if */
+            else
+                /* Free object location (i.e. "unhold" the file if appropriate)
+                 */
+                if(H5O_loc_free(&(dt->oloc)) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
+        } /* end if */
+
+        /* Free the group hier. path since we're not calling H5T__free*/
+        H5G_name_free(&(dt->path));
+    } /* end else */
+
+    /* Free the datatype struct */
+    dt = H5FL_FREE(H5T_t, dt);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_set_size
+ *
+ * Purpose:	Sets the total size in bytes for a data type (this operation
+ *		is not permitted on reference data types).  If the size is
+ *		decreased so that the significant bits of the data type
+ *		extend beyond the edge of the new size, then the `offset'
+ *		property is decreased toward zero.  If the `offset' becomes
+ *		zero and the significant bits of the data type still hang
+ *		over the edge of the new size, then the number of significant
+ *		bits is decreased.
+ *
+ *		Adjusting the size of an H5T_STRING automatically sets the
+ *		precision to 8*size.
+ *
+ *		All data types have a positive size.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	nagative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, December 22, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works with derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_set_size(H5T_t *dt, size_t size)
+{
+    size_t	prec, offset;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(size!=0);
+    HDassert(H5T_REFERENCE!=dt->shared->type);
+    HDassert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs));
+
+    if (dt->shared->parent) {
+        if (H5T_set_size(dt->shared->parent, size)<0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set size for parent data type");
+
+        /* Adjust size of datatype appropriately */
+        if(dt->shared->type==H5T_ARRAY)
+            dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem;
+        else if(dt->shared->type!=H5T_VLEN)
+            dt->shared->size = dt->shared->parent->shared->size;
+    } else {
+        if (H5T_IS_ATOMIC(dt->shared)) {
+            offset = dt->shared->u.atomic.offset;
+            prec = dt->shared->u.atomic.prec;
+
+            /* Decrement the offset and precision if necessary */
+            if (prec > 8*size)
+                offset = 0;
+            else
+                if (offset+prec > 8*size)
+                    offset = 8 * size - prec;
+            if (prec > 8*size)
+                prec = 8 * size;
+        } else {
+            prec = offset = 0;
+        }
+
+        switch (dt->shared->type) {
+            case H5T_INTEGER:
+            case H5T_TIME:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+                /* nothing to check */
+                break;
+
+            case H5T_COMPOUND:
+                /* If decreasing size, check the last member isn't being cut. */
+                if(size<dt->shared->size) {
+                    int         num_membs = 0;
+                    unsigned    i, max_index=0;
+                    size_t      memb_offset, max_offset=0;
+                    size_t      max_size;
+
+                    if((num_membs = H5T_get_nmembers(dt))<0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to get number of members");
+
+                    if(num_membs) {
+			for(i=0; i<(unsigned)num_membs; i++) {
+			    memb_offset = H5T_get_member_offset(dt, i);
+			    if(memb_offset > max_offset) {
+			        max_offset = memb_offset;
+				max_index = i;
+			    }
+			}
+
+			max_size = H5T__get_member_size(dt, max_index);
+
+			if(size<(max_offset+max_size))
+			    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size shrinking will cut off last member ");
+                    }
+
+                    /* Compound must not have been packed previously */
+                    /* We will check if resizing changed the packed state of
+                     * this type at the end of this function */
+                    HDassert(!dt->shared->u.compnd.packed);
+                }
+
+                break;
+
+            case H5T_STRING:
+                /* Convert string to variable-length datatype */
+                if(size==H5T_VARIABLE) {
+                    H5T_t	*base = NULL;		/* base data type */
+                    H5T_cset_t  tmp_cset;               /* Temp. cset info */
+                    H5T_str_t   tmp_strpad;             /* Temp. strpad info */
+
+                    /* Get a copy of unsigned char type as the base/parent type */
+                    if(NULL == (base = (H5T_t *)H5I_object(H5T_NATIVE_UCHAR)))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid base datatype");
+                    dt->shared->parent=H5T_copy(base,H5T_COPY_ALL);
+
+                    /* change this datatype into a VL string */
+                    dt->shared->type = H5T_VLEN;
+
+                    /*
+                     * Force conversions (i.e. memory to memory conversions
+		     * should duplicate data, not point to the same VL strings)
+                     */
+                    dt->shared->force_conv = TRUE;
+
+		    /* Before we mess with the info in the union, extract the
+		     * values we need */
+                    tmp_cset=dt->shared->u.atomic.u.s.cset;
+                    tmp_strpad=dt->shared->u.atomic.u.s.pad;
+
+                    /* This is a string, not a sequence */
+                    dt->shared->u.vlen.type = H5T_VLEN_STRING;
+
+                    /* Set character set and padding information */
+                    dt->shared->u.vlen.cset = tmp_cset;
+                    dt->shared->u.vlen.pad  = tmp_strpad;
+
+                    /* Set up VL information */
+                    if (H5T_set_loc(dt, NULL, H5T_LOC_MEMORY)<0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location");
+
+                } else {
+                    prec = 8 * size;
+                    offset = 0;
+                } /* end else */
+                break;
+
+            case H5T_FLOAT:
+                /*
+                 * The sign, mantissa, and exponent fields should be adjusted
+                 * first when decreasing the size of a floating point type.
+                 */
+                if (dt->shared->u.atomic.u.f.sign >= prec+offset ||
+                        dt->shared->u.atomic.u.f.epos + dt->shared->u.atomic.u.f.esize > prec+offset ||
+                        dt->shared->u.atomic.u.f.mpos + dt->shared->u.atomic.u.f.msize > prec+offset) {
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjust sign, mantissa, and exponent fields first");
+                }
+                break;
+
+            case H5T_ENUM:
+            case H5T_VLEN:
+            case H5T_ARRAY:
+            case H5T_REFERENCE:
+                HDassert("can't happen" && 0);
+                break;
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+                HDassert("invalid type" && 0);
+                break;
+            default:
+                HDassert("not implemented yet" && 0);
+                break;
+        }
+
+        /* Commit (if we didn't convert this type to a VL string) */
+        if(dt->shared->type!=H5T_VLEN) {
+            dt->shared->size = size;
+            if (H5T_IS_ATOMIC(dt->shared)) {
+                dt->shared->u.atomic.offset = offset;
+                dt->shared->u.atomic.prec = prec;
+            }
+        } /* end if */
+
+        /* Check if the new compound type is packed */
+        if(dt->shared->type == H5T_COMPOUND)
+            H5T__update_packed(dt);
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_size
+ *
+ * Purpose:	Determines the total size of a data type in bytes.
+ *
+ * Return:	Success:	Size of the data type in bytes.	 The size of
+ *				the data type is the size of an instance of
+ *				that data type.
+ *
+ *		Failure:	0 (valid data types are never zero size)
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, December  9, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5T_get_size(const H5T_t *dt)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(dt);
+
+    FUNC_LEAVE_NOAPI(dt->shared->size)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_cmp
+ *
+ * Purpose:	Compares two data types.
+ *
+ * Return:	Success:	0 if DT1 and DT2 are equal.
+ *				<0 if DT1 is less than DT2.
+ *				>0 if DT1 is greater than DT2.
+ *
+ *		Failure:	0, never fails
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, December 10, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, hbool_t superset)
+{
+    unsigned	*idx1 = NULL, *idx2 = NULL;
+    size_t	base_size;
+    hbool_t	swapped;
+    unsigned u;
+    int	tmp;
+    int	ret_value = 0;
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Sanity check */
+    HDassert(dt1);
+    HDassert(dt2);
+
+    /* the easy case */
+    if(dt1 == dt2)
+        HGOTO_DONE(0);
+
+    /* compare */
+    if(dt1->shared->type < dt2->shared->type)
+        HGOTO_DONE(-1);
+    if(dt1->shared->type > dt2->shared->type)
+        HGOTO_DONE(1);
+
+    if(dt1->shared->size < dt2->shared->size)
+        HGOTO_DONE(-1);
+    if(dt1->shared->size > dt2->shared->size)
+        HGOTO_DONE(1);
+
+    if(dt1->shared->parent && !dt2->shared->parent)
+        HGOTO_DONE(-1);
+    if(!dt1->shared->parent && dt2->shared->parent)
+        HGOTO_DONE(1);
+    if(dt1->shared->parent) {
+	tmp = H5T_cmp(dt1->shared->parent, dt2->shared->parent, superset);
+	if(tmp < 0)
+            HGOTO_DONE(-1);
+	if(tmp > 0)
+            HGOTO_DONE(1);
+    } /* end if */
+
+    switch(dt1->shared->type) {
+        case H5T_COMPOUND:
+            /*
+             * Compound data types...
+             */
+            if(dt1->shared->u.compnd.nmembs < dt2->shared->u.compnd.nmembs)
+                HGOTO_DONE(-1);
+            if(dt1->shared->u.compnd.nmembs > dt2->shared->u.compnd.nmembs)
+                HGOTO_DONE(1);
+
+            /* Build an index for each type so the names are sorted */
+            if(NULL == (idx1 = (unsigned *)H5MM_malloc(dt1->shared->u.compnd.nmembs * sizeof(unsigned))) ||
+                    NULL == (idx2 = (unsigned *)H5MM_malloc(dt2->shared->u.compnd.nmembs * sizeof(unsigned))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed");
+            for(u = 0; u < dt1->shared->u.compnd.nmembs; u++)
+                idx1[u] = idx2[u] = u;
+            if(dt1->shared->u.enumer.nmembs > 1) {
+                int i;
+
+                for(i = (int) dt1->shared->u.compnd.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) {
+                    int j;
+
+                    for(j = 0, swapped=FALSE; j < i; j++)
+                        if(HDstrcmp(dt1->shared->u.compnd.memb[idx1[j]].name,
+                                 dt1->shared->u.compnd.memb[idx1[j + 1]].name) > 0) {
+                            unsigned tmp_idx = idx1[j];
+                            idx1[j] = idx1[j + 1];
+                            idx1[j + 1] = tmp_idx;
+                            swapped = TRUE;
+                        }
+                }
+                for(i = (int) dt2->shared->u.compnd.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) {
+                    int j;
+
+                    for(j = 0, swapped = FALSE; j<i; j++)
+                        if(HDstrcmp(dt2->shared->u.compnd.memb[idx2[j]].name,
+                                 dt2->shared->u.compnd.memb[idx2[j + 1]].name) > 0) {
+                            unsigned tmp_idx = idx2[j];
+                            idx2[j] = idx2[j + 1];
+                            idx2[j + 1] = tmp_idx;
+                            swapped = TRUE;
+                        }
+                }
+            } /* end if */
+
+#ifdef H5T_DEBUG
+            /* I don't quite trust the code above yet :-)  --RPM */
+            for (u=0; u<dt1->shared->u.compnd.nmembs-1; u++) {
+                HDassert(HDstrcmp(dt1->shared->u.compnd.memb[idx1[u]].name,
+                        dt1->shared->u.compnd.memb[idx1[u + 1]].name));
+                HDassert(HDstrcmp(dt2->shared->u.compnd.memb[idx2[u]].name,
+                        dt2->shared->u.compnd.memb[idx2[u + 1]].name));
+            }
+#endif
+
+            /* Compare the members */
+            for (u=0; u<dt1->shared->u.compnd.nmembs; u++) {
+                tmp = HDstrcmp(dt1->shared->u.compnd.memb[idx1[u]].name,
+                       dt2->shared->u.compnd.memb[idx2[u]].name);
+                if (tmp < 0)
+                    HGOTO_DONE(-1);
+                if (tmp > 0)
+                    HGOTO_DONE(1);
+
+                if (dt1->shared->u.compnd.memb[idx1[u]].offset < dt2->shared->u.compnd.memb[idx2[u]].offset) HGOTO_DONE(-1);
+                if (dt1->shared->u.compnd.memb[idx1[u]].offset > dt2->shared->u.compnd.memb[idx2[u]].offset) HGOTO_DONE(1);
+
+                if (dt1->shared->u.compnd.memb[idx1[u]].size < dt2->shared->u.compnd.memb[idx2[u]].size) HGOTO_DONE(-1);
+                if (dt1->shared->u.compnd.memb[idx1[u]].size > dt2->shared->u.compnd.memb[idx2[u]].size) HGOTO_DONE(1);
+
+                tmp = H5T_cmp(dt1->shared->u.compnd.memb[idx1[u]].type,
+                      dt2->shared->u.compnd.memb[idx2[u]].type, superset);
+                if (tmp < 0) HGOTO_DONE(-1);
+                if (tmp > 0) HGOTO_DONE(1);
+            }
+            break;
+
+        case H5T_ENUM:
+            /*
+             * Enumeration data types...
+             */
+
+            /* If we are doing a "superset" comparison, dt2 is allowed to have
+             * more members than dt1
+             */
+            if(superset) {
+                if (dt1->shared->u.enumer.nmembs > dt2->shared->u.enumer.nmembs)
+                    HGOTO_DONE(1);
+            } /* end if */
+            else {
+                if (dt1->shared->u.enumer.nmembs < dt2->shared->u.enumer.nmembs)
+                    HGOTO_DONE(-1);
+                if (dt1->shared->u.enumer.nmembs > dt2->shared->u.enumer.nmembs)
+                    HGOTO_DONE(1);
+            } /* end else */
+
+            /* Build an index for each type so the names are sorted */
+            if(NULL == (idx1 = (unsigned *)H5MM_malloc(dt1->shared->u.enumer.nmembs * sizeof(unsigned))) ||
+                    NULL == (idx2 = (unsigned *)H5MM_malloc(dt2->shared->u.enumer.nmembs * sizeof(unsigned))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed");
+            for (u=0; u<dt1->shared->u.enumer.nmembs; u++)
+                idx1[u] = u;
+            if(dt1->shared->u.enumer.nmembs > 1) {
+                int i;
+                for (i = (int) dt1->shared->u.enumer.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) {
+                    int j;
+
+                    for (j = 0, swapped = FALSE; j < i; j++)
+                        if (HDstrcmp(dt1->shared->u.enumer.name[idx1[j]],
+                                 dt1->shared->u.enumer.name[idx1[j+1]]) > 0) {
+                            unsigned tmp_idx = idx1[j];
+                            idx1[j] = idx1[j+1];
+                            idx1[j+1] = tmp_idx;
+                            swapped = TRUE;
+                        }
+                }
+            }
+            for (u=0; u<dt2->shared->u.enumer.nmembs; u++)
+                idx2[u] = u;
+            if(dt2->shared->u.enumer.nmembs > 1) {
+                int i;
+
+                for (i = (int) dt2->shared->u.enumer.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) {
+                    int j;
+
+                    for (j = 0, swapped = FALSE; j < i; j++)
+                        if (HDstrcmp(dt2->shared->u.enumer.name[idx2[j]],
+                                 dt2->shared->u.enumer.name[idx2[j+1]]) > 0) {
+                            unsigned tmp_idx = idx2[j];
+                            idx2[j] = idx2[j+1];
+                            idx2[j+1] = tmp_idx;
+                            swapped = TRUE;
+                        }
+                }
+            }
+
+#ifdef H5T_DEBUG
+            /* I don't quite trust the code above yet :-)  --RPM */
+            for (u=0; u<dt1->shared->u.enumer.nmembs-1; u++) {
+                HDassert(HDstrcmp(dt1->shared->u.enumer.name[idx1[u]],
+                        dt1->shared->u.enumer.name[idx1[u+1]]));
+                HDassert(HDstrcmp(dt2->shared->u.enumer.name[idx2[u]],
+                        dt2->shared->u.enumer.name[idx2[u+1]]));
+            }
+#endif
+
+            /* Compare the members */
+            base_size = dt1->shared->parent->shared->size;
+            for (u=0; u<dt1->shared->u.enumer.nmembs; u++) {
+                unsigned idx = 0;
+
+                if(superset) {
+                    unsigned    lt = 0, rt;        /* Final, left & right key indices */
+                    int	        cmp = 1;                /* Key comparison value */
+
+                    /* If a superset is allowed, dt2 may have more members
+                     * than dt1, so binary search for matching member name in
+                     * dt2
+                     */
+                    rt = dt2->shared->u.enumer.nmembs;
+
+                    while (lt < rt && cmp) {
+                        idx = (lt + rt) / 2;
+
+                        /* compare */
+                        if ((cmp = HDstrcmp(dt1->shared->u.enumer.name[idx1[u]],
+                                dt2->shared->u.enumer.name[idx2[idx]] ) ) < 0)
+                            rt = idx;
+                        else
+                            lt = idx+1;
+                    }
+                    /* Leave, if we couldn't find match */
+                    if (cmp)
+                        HGOTO_DONE(-1);
+                } /* end if */
+                else {
+                    /* Check for exact member name match when not doing
+                     * "superset" comparison
+                     */
+                    tmp = HDstrcmp(dt1->shared->u.enumer.name[idx1[u]],
+                           dt2->shared->u.enumer.name[idx2[u]]);
+                    if (tmp<0) HGOTO_DONE(-1);
+                    if (tmp>0) HGOTO_DONE(1);
+
+                    /* Set index value appropriately */
+                    idx = u;
+                } /* end else */
+
+                tmp = HDmemcmp(dt1->shared->u.enumer.value+idx1[u]*base_size,
+                       dt2->shared->u.enumer.value+idx2[idx]*base_size,
+                       base_size);
+                if (tmp<0) HGOTO_DONE(-1);
+                if (tmp>0) HGOTO_DONE(1);
+            }
+            break;
+
+        case H5T_VLEN:
+            HDassert(dt1->shared->u.vlen.type>H5T_VLEN_BADTYPE && dt1->shared->u.vlen.type<H5T_VLEN_MAXTYPE);
+            HDassert(dt2->shared->u.vlen.type>H5T_VLEN_BADTYPE && dt2->shared->u.vlen.type<H5T_VLEN_MAXTYPE);
+            HDassert(dt1->shared->u.vlen.loc>=H5T_LOC_BADLOC && dt1->shared->u.vlen.loc<H5T_LOC_MAXLOC);
+            HDassert(dt2->shared->u.vlen.loc>=H5T_LOC_BADLOC && dt2->shared->u.vlen.loc<H5T_LOC_MAXLOC);
+
+            /* Arbitrarily sort sequence VL datatypes before string VL datatypes */
+            if (dt1->shared->u.vlen.type==H5T_VLEN_SEQUENCE &&
+                    dt2->shared->u.vlen.type==H5T_VLEN_STRING) {
+                HGOTO_DONE(-1);
+            } else if (dt1->shared->u.vlen.type==H5T_VLEN_STRING &&
+                    dt2->shared->u.vlen.type==H5T_VLEN_SEQUENCE) {
+                HGOTO_DONE(1);
+            }
+            /* Arbitrarily sort VL datatypes in memory before disk */
+            if (dt1->shared->u.vlen.loc==H5T_LOC_MEMORY &&
+                    dt2->shared->u.vlen.loc==H5T_LOC_DISK) {
+                HGOTO_DONE(-1);
+            } else if (dt1->shared->u.vlen.loc==H5T_LOC_DISK &&
+                    dt2->shared->u.vlen.loc==H5T_LOC_MEMORY) {
+                HGOTO_DONE(1);
+            } else if (dt1->shared->u.vlen.loc==H5T_LOC_BADLOC &&
+                    dt2->shared->u.vlen.loc!=H5T_LOC_BADLOC) {
+                HGOTO_DONE(1);
+            }
+
+            /* Don't allow VL types in different files to compare as equal */
+            if (dt1->shared->u.vlen.f < dt2->shared->u.vlen.f)
+                HGOTO_DONE(-1);
+            if (dt1->shared->u.vlen.f > dt2->shared->u.vlen.f)
+                HGOTO_DONE(1);
+            break;
+
+        case H5T_OPAQUE:
+            if(dt1->shared->u.opaque.tag && dt2->shared->u.opaque.tag)
+                HGOTO_DONE(HDstrcmp(dt1->shared->u.opaque.tag,dt2->shared->u.opaque.tag));
+            break;
+
+        case H5T_ARRAY:
+            if (dt1->shared->u.array.ndims < dt2->shared->u.array.ndims)
+                HGOTO_DONE(-1);
+            if (dt1->shared->u.array.ndims > dt2->shared->u.array.ndims)
+                HGOTO_DONE(1);
+
+            for (u=0; u<dt1->shared->u.array.ndims; u++) {
+                if (dt1->shared->u.array.dim[u] < dt2->shared->u.array.dim[u])
+                    HGOTO_DONE(-1);
+                if (dt1->shared->u.array.dim[u] > dt2->shared->u.array.dim[u])
+                    HGOTO_DONE(1);
+            }
+
+            tmp = H5T_cmp(dt1->shared->parent, dt2->shared->parent, superset);
+            if (tmp < 0)
+                HGOTO_DONE(-1);
+            if (tmp > 0)
+                HGOTO_DONE(1);
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_REFERENCE:
+        case H5T_NCLASSES:
+        default:
+            /*
+             * Atomic datatypes...
+             */
+            if (dt1->shared->u.atomic.order < dt2->shared->u.atomic.order) HGOTO_DONE(-1);
+            if (dt1->shared->u.atomic.order > dt2->shared->u.atomic.order) HGOTO_DONE(1);
+
+            if (dt1->shared->u.atomic.prec < dt2->shared->u.atomic.prec) HGOTO_DONE(-1);
+            if (dt1->shared->u.atomic.prec > dt2->shared->u.atomic.prec) HGOTO_DONE(1);
+
+            if (dt1->shared->u.atomic.offset < dt2->shared->u.atomic.offset) HGOTO_DONE(-1);
+            if (dt1->shared->u.atomic.offset > dt2->shared->u.atomic.offset) HGOTO_DONE(1);
+
+            if (dt1->shared->u.atomic.lsb_pad < dt2->shared->u.atomic.lsb_pad) HGOTO_DONE(-1);
+            if (dt1->shared->u.atomic.lsb_pad > dt2->shared->u.atomic.lsb_pad) HGOTO_DONE(1);
+
+            if (dt1->shared->u.atomic.msb_pad < dt2->shared->u.atomic.msb_pad) HGOTO_DONE(-1);
+            if (dt1->shared->u.atomic.msb_pad > dt2->shared->u.atomic.msb_pad) HGOTO_DONE(1);
+
+            switch (dt1->shared->type) {
+                case H5T_INTEGER:
+                    if (dt1->shared->u.atomic.u.i.sign < dt2->shared->u.atomic.u.i.sign)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.i.sign > dt2->shared->u.atomic.u.i.sign)
+                        HGOTO_DONE(1);
+                    break;
+
+                case H5T_FLOAT:
+                    if (dt1->shared->u.atomic.u.f.sign < dt2->shared->u.atomic.u.f.sign)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.sign > dt2->shared->u.atomic.u.f.sign)
+                        HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.epos < dt2->shared->u.atomic.u.f.epos)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.epos > dt2->shared->u.atomic.u.f.epos)
+                        HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.esize < dt2->shared->u.atomic.u.f.esize) HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.esize > dt2->shared->u.atomic.u.f.esize) HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.ebias < dt2->shared->u.atomic.u.f.ebias) HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.ebias > dt2->shared->u.atomic.u.f.ebias) HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.mpos < dt2->shared->u.atomic.u.f.mpos)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.mpos > dt2->shared->u.atomic.u.f.mpos)
+                        HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.msize < dt2->shared->u.atomic.u.f.msize) HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.msize > dt2->shared->u.atomic.u.f.msize) HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.norm < dt2->shared->u.atomic.u.f.norm)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.norm > dt2->shared->u.atomic.u.f.norm)
+                        HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.f.pad < dt2->shared->u.atomic.u.f.pad)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.f.pad > dt2->shared->u.atomic.u.f.pad)
+                        HGOTO_DONE(1);
+
+                    break;
+
+                case H5T_TIME:  /* order and precision are checked above */
+                    /*void */
+                    break;
+
+                case H5T_STRING:
+                    if (dt1->shared->u.atomic.u.s.cset < dt2->shared->u.atomic.u.s.cset)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.s.cset > dt2->shared->u.atomic.u.s.cset)
+                        HGOTO_DONE(1);
+
+                    if (dt1->shared->u.atomic.u.s.pad < dt2->shared->u.atomic.u.s.pad)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.s.pad > dt2->shared->u.atomic.u.s.pad)
+                        HGOTO_DONE(1);
+
+                    break;
+
+                case H5T_BITFIELD:
+                    /*void */
+                    break;
+
+                case H5T_REFERENCE:
+                    if (dt1->shared->u.atomic.u.r.rtype < dt2->shared->u.atomic.u.r.rtype)
+                        HGOTO_DONE(-1);
+                    if (dt1->shared->u.atomic.u.r.rtype > dt2->shared->u.atomic.u.r.rtype)
+                        HGOTO_DONE(1);
+
+                    switch(dt1->shared->u.atomic.u.r.rtype) {
+                        case H5R_OBJECT:
+                            if (dt1->shared->u.atomic.u.r.loc < dt2->shared->u.atomic.u.r.loc)
+                                HGOTO_DONE(-1);
+                            if (dt1->shared->u.atomic.u.r.loc > dt2->shared->u.atomic.u.r.loc)
+                                HGOTO_DONE(1);
+                            break;
+
+                        case H5R_DATASET_REGION:
+                    /* Does this need more to distinguish it? -QAK 11/30/98 */
+                            /*void */
+                            break;
+
+                        case H5R_BADTYPE:
+                        case H5R_MAXTYPE:
+                            HDassert("invalid type" && 0);
+                            break;
+                        default:
+                            HDassert("not implemented yet" && 0);
+                            break;
+                    }
+                    break;
+
+                case H5T_NO_CLASS:
+                case H5T_OPAQUE:
+                case H5T_COMPOUND:
+                case H5T_ENUM:
+                case H5T_VLEN:
+                case H5T_ARRAY:
+                case H5T_NCLASSES:
+                default:
+                    HDassert("not implemented yet" && 0);
+                    break;
+            }
+        break;
+    } /* end switch */
+
+done:
+    if(NULL != idx1)
+        H5MM_xfree(idx1);
+    if(NULL != idx2)
+        H5MM_xfree(idx2);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_path_find
+ *
+ * Purpose:	Finds the path which converts type SRC_ID to type DST_ID,
+ *		creating a new path if necessary.  If FUNC is non-zero then
+ *		it is set as the hard conversion function for that path
+ *		regardless of whether the path previously existed. Changing
+ *		the conversion function of a path causes statistics to be
+ *		reset to zero after printing them.  The NAME is used only
+ *		when creating a new path and is just for debugging.
+ *
+ *		If SRC and DST are both null pointers then the special no-op
+ *		conversion path is used.  This path is always stored as the
+ *		first path in the path table.
+ *
+ * Return:	Success:	Pointer to the path, valid until the path
+ *				database is modified.
+ *
+ *		Failure:	NULL if the path does not exist and no
+ *				function can be found to apply to the new
+ *				path.
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January 13, 1998
+ *
+ * Modifications:
+ *              Added a parameter IS_API to indicate whether to an API
+ *              function issued a call to this function.  If a API
+ *              function like H5Tregister() is calling this function to
+ *              register a new hard conversion function, IS_API is TRUE
+ *              and the old path is replaced.  If a private function like
+ *              H5T_init_interface() is trying to register hard conversions,
+ *              IS_API is FALSE and the old hard path is not replaced.
+ *              Tuesday, Sept 13, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_path_t *
+H5T_path_find(const H5T_t *src, const H5T_t *dst, const char *name,
+    H5T_conv_t func, hid_t dxpl_id, hbool_t is_api)
+{
+    int	lt, rt;			/*left and right edges		*/
+    int	md;			/*middle			*/
+    int	cmp;			/*comparison result		*/
+    int old_npaths;             /* Previous number of paths in table */
+    H5T_path_t	*table = NULL;		/*path existing in the table	*/
+    H5T_path_t	*path = NULL;		/*new path			*/
+    hid_t	src_id = -1, dst_id = -1;	/*src and dst type identifiers	*/
+    int	i;			/*counter			*/
+    int	nprint = 0;		/*lines of output printed	*/
+    H5T_path_t	*ret_value;	/*return value			*/
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(src);
+    HDassert(dst);
+
+    /*
+     * Make sure the first entry in the table is the no-op conversion path.
+     */
+    if(0 == H5T_g.npaths) {
+	if(NULL == (H5T_g.path = (H5T_path_t **)H5MM_malloc(128 * sizeof(H5T_path_t *))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for type conversion path table")
+	H5T_g.apaths = 128;
+	if(NULL == (H5T_g.path[0] = H5FL_CALLOC(H5T_path_t)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for no-op conversion path")
+        HDsnprintf(H5T_g.path[0]->name, sizeof(H5T_g.path[0]->name), "no-op");
+	H5T_g.path[0]->func = H5T__conv_noop;
+	H5T_g.path[0]->cdata.command = H5T_CONV_INIT;
+	if(H5T__conv_noop((hid_t)FAIL, (hid_t)FAIL, &(H5T_g.path[0]->cdata), (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id) < 0) {
+#ifdef H5T_DEBUG
+	    if(H5DEBUG(T))
+		fprintf(H5DEBUG(T), "H5T: unable to initialize no-op conversion function (ignored)\n");
+#endif
+	    H5E_clear_stack(NULL); /*ignore the error*/
+	} /* end if */
+	H5T_g.path[0]->is_noop = TRUE;
+	H5T_g.npaths = 1;
+    } /* end if */
+
+    /*
+     * Find the conversion path.  If source and destination types are equal
+     * then use entry[0], otherwise do a binary search over the
+     * remaining entries.
+     *
+     * Quincey Koziol, 2 July, 1999
+     * Only allow the no-op conversion to occur if no "force conversion" flags
+     * are set
+     */
+    if(src->shared->force_conv == FALSE && dst->shared->force_conv == FALSE && 0 == H5T_cmp(src, dst, TRUE)) {
+	table = H5T_g.path[0];
+	cmp = 0;
+	md = 0;
+    } /* end if */
+    else {
+	lt = md = 1;
+	rt = H5T_g.npaths;
+	cmp = -1;
+
+	while(cmp && lt < rt) {
+	    md = (lt + rt) / 2;
+	    HDassert(H5T_g.path[md]);
+	    cmp = H5T_cmp(src, H5T_g.path[md]->src, FALSE);
+	    if(0 == cmp)
+                cmp = H5T_cmp(dst, H5T_g.path[md]->dst, FALSE);
+	    if(cmp < 0)
+		rt = md;
+	    else if(cmp > 0)
+		lt = md + 1;
+	    else
+		table = H5T_g.path[md];
+	} /* end while */
+    } /* end else */
+
+    /* Keep a record of the number of paths in the table, in case one of the
+     * initialization calls below (hard or soft) causes more entries to be
+     * added to the table - QAK, 1/26/02
+     */
+    old_npaths = H5T_g.npaths;
+
+    /*
+     * If we didn't find the path, if the caller is an API function specifying
+     * a new hard conversion function, or if the caller is a private function
+     * specifying a new hard conversion and the path is a soft conversion, then
+     * create a new path and add the new function to the path.
+     */
+    if(!table || (table && func && is_api) || (table && !table->is_hard && func && !is_api)) {
+	if(NULL == (path = H5FL_CALLOC(H5T_path_t)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for type conversion path")
+	if(name && *name) {
+	    HDstrncpy(path->name, name, (size_t)H5T_NAMELEN);
+	    path->name[H5T_NAMELEN - 1] = '\0';
+        } /* end if */
+	else
+	    HDsnprintf(path->name, sizeof(path->name), "NONAME");
+	if(NULL == (path->src = H5T_copy(src, H5T_COPY_ALL)))
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy datatype for conversion path")
+        if(NULL == (path->dst = H5T_copy(dst, H5T_COPY_ALL)))
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy datatype for conversion path")
+    } /* end if */
+    else
+	path = table;
+
+    /*
+     * If a hard conversion function is specified and none is defined for the
+     * path, or the caller is an API function, or the caller is a private function but
+     * the existing path is a soft function, then add the new conversion to the path
+     * and initialize its conversion data.
+     */
+    if(func && (!table || (table && is_api) || (table && !table->is_hard && !is_api))) {
+	HDassert(path != table);
+	HDassert(NULL == path->func);
+	if(path->src && (src_id = H5I_register(H5I_DATATYPE, H5T_copy(path->src, H5T_COPY_ALL), FALSE)) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register source conversion type for query")
+	if(path->dst && (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(path->dst, H5T_COPY_ALL), FALSE)) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register destination conversion type for query")
+	path->cdata.command = H5T_CONV_INIT;
+	if((func)(src_id, dst_id, &(path->cdata), (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to initialize conversion function")
+	if(src_id >= 0)
+            H5I_dec_ref(src_id);
+	if(dst_id >= 0)
+            H5I_dec_ref(dst_id);
+	src_id = dst_id = -1;
+	path->func = func;
+	path->is_hard = TRUE;
+    } /* end if */
+
+    /*
+     * If the path doesn't have a function by now (because it's a new path
+     * and the caller didn't supply a hard function) then scan the soft list
+     * for an applicable function and add it to the path.  This can't happen
+     * for the no-op conversion path.
+     */
+    HDassert(path->func || (src && dst));
+    for(i = H5T_g.nsoft - 1; i >= 0 && !path->func; --i) {
+	if(src->shared->type != H5T_g.soft[i].src || dst->shared->type != H5T_g.soft[i].dst)
+	    continue;
+	if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(path->src, H5T_COPY_ALL), FALSE)) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register src conversion type for query")
+        if((dst_id = H5I_register(H5I_DATATYPE, H5T_copy(path->dst, H5T_COPY_ALL), FALSE)) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register dst conversion type for query")
+	path->cdata.command = H5T_CONV_INIT;
+	if((H5T_g.soft[i].func)(src_id, dst_id, &(path->cdata), (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id) < 0) {
+	    HDmemset(&(path->cdata), 0, sizeof(H5T_cdata_t));
+	    H5E_clear_stack(H5E_DEFAULT); /*ignore the error*/
+	} /* end if */
+        else {
+	    HDstrncpy(path->name, H5T_g.soft[i].name, (size_t)H5T_NAMELEN);
+	    path->name[H5T_NAMELEN - 1] = '\0';
+	    path->func = H5T_g.soft[i].func;
+	    path->is_hard = FALSE;
+	} /* end else */
+	H5I_dec_ref(src_id);
+	H5I_dec_ref(dst_id);
+	src_id = dst_id = -1;
+    } /* end for */
+    if(!path->func)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "no appropriate function for conversion path")
+
+    /* Check if paths were inserted into the table through a recursive call
+     * and re-compute the correct location for this path if so. - QAK, 1/26/02
+     */
+    if(old_npaths != H5T_g.npaths) {
+        lt = md = 1;
+        rt = H5T_g.npaths;
+        cmp = -1;
+
+        while(cmp && lt < rt) {
+            md = (lt + rt) / 2;
+            HDassert(H5T_g.path[md]);
+            cmp = H5T_cmp(src, H5T_g.path[md]->src, FALSE);
+            if(0 == cmp)
+                cmp = H5T_cmp(dst, H5T_g.path[md]->dst, FALSE);
+            if(cmp < 0)
+                rt = md;
+            else if(cmp > 0)
+                lt = md + 1;
+            else
+                table = H5T_g.path[md];
+        } /* end while */
+    } /* end if */
+
+    /* Replace an existing table entry or add a new entry */
+    if(table && path != table) {
+	HDassert(table == H5T_g.path[md]);
+	H5T__print_stats(table, &nprint/*in,out*/);
+	table->cdata.command = H5T_CONV_FREE;
+	if((table->func)((hid_t)FAIL, (hid_t)FAIL, &(table->cdata), (size_t)0, (size_t)0, (size_t)0, NULL, NULL, dxpl_id) < 0) {
+#ifdef H5T_DEBUG
+	    if(H5DEBUG(T)) {
+		fprintf(H5DEBUG(T), "H5T: conversion function 0x%08lx free "
+			"failed for %s (ignored)\n",
+			(unsigned long)(path->func), path->name);
+	    } /* end if */
+#endif
+	    H5E_clear_stack(NULL); /*ignore the failure*/
+	} /* end if */
+	if(table->src)
+            H5T_close(table->src);
+	if(table->dst)
+            H5T_close(table->dst);
+        table = H5FL_FREE(H5T_path_t, table);
+	table = path;
+	H5T_g.path[md] = path;
+    } else if(path != table) {
+	HDassert(cmp);
+        if((size_t)H5T_g.npaths >= H5T_g.apaths) {
+            size_t na = MAX(128, 2 * H5T_g.apaths);
+            H5T_path_t **x;
+
+            if(NULL == (x = (H5T_path_t **)H5MM_realloc(H5T_g.path, na * sizeof(H5T_path_t*))))
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+            H5T_g.apaths = na;
+            H5T_g.path = x;
+        } /* end if */
+        if(cmp > 0)
+            md++;
+        HDmemmove(H5T_g.path + md + 1, H5T_g.path + md, (size_t) (H5T_g.npaths - md) * sizeof(H5T_path_t*));
+        H5T_g.npaths++;
+	H5T_g.path[md] = path;
+	table = path;
+    } /* end else-if */
+
+    /* Set the flag to indicate both source and destination types are compound types
+     * for the optimization of data reading (in H5Dio.c). */
+    if(H5T_COMPOUND == H5T_get_class(src, TRUE) && H5T_COMPOUND == H5T_get_class(dst, TRUE))
+        path->are_compounds = TRUE;
+
+    /* Set return value */
+    ret_value = path;
+
+done:
+    if(!ret_value && path && path != table) {
+	if(path->src)
+            H5T_close(path->src);
+	if(path->dst)
+            H5T_close(path->dst);
+        path = H5FL_FREE(H5T_path_t, path);
+    } /* end if */
+    if(src_id >= 0)
+        H5I_dec_ref(src_id);
+    if(dst_id >= 0)
+        H5I_dec_ref(dst_id);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_path_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_path_noop
+ *
+ * Purpose:	Is the path the special no-op path? The no-op function can be
+ *              set by the application and there might be more than one no-op
+ *              path in a multi-threaded application if one thread is using
+ *              the no-op path when some other thread changes its definition.
+ *
+ * Return:	TRUE/FALSE (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, May  8, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5T_path_noop(const H5T_path_t *p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(p);
+
+    FUNC_LEAVE_NOAPI(p->is_noop || (p->is_hard && 0==H5T_cmp(p->src, p->dst, FALSE)))
+} /* end H5T_path_noop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_path_compound_subset
+ *
+ * Purpose:	Checks if the source and destination types are both compound.
+ *              Tells whether whether the source members are a subset of
+ *              destination, and the order is the same, and no conversion
+ *              is needed.  For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *
+ * Return:	A pointer to the subset info struct in p, or NULL if there are
+ *          no compounds.  Points directly into the H5T_path_t structure.
+ *
+ * Programmer:	Raymond Lu
+ *		8 June 2007
+ *
+ * Modifications:  Neil Fortner
+ *      19 September 2008
+ *      Changed return value to H5T_subset_info_t
+ *      (to allow it to return copy_size)
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_subset_info_t *
+H5T_path_compound_subset(const H5T_path_t *p)
+{
+    H5T_subset_info_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(p);
+
+    if(p->are_compounds)
+        ret_value = H5T__conv_struct_subset(&(p->cdata));
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_path_compound_subset */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_path_bkg
+ *
+ * Purpose:	Get the "background" flag for the conversion path.
+ *
+ * Return:	Background flag (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, May  8, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_bkg_t
+H5T_path_bkg(const H5T_path_t *p)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(p);
+
+    FUNC_LEAVE_NOAPI(p->cdata.need_bkg)
+} /* end H5T_path_bkg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_compiler_conv
+ *
+ * Purpose:	Private function for H5Tcompiler_conv.  Finds out whether the
+ *              library's conversion function from type SRC to type DST
+ *              is a hard conversion.
+ *
+ * Return:	TRUE:           hard conversion.
+ *		FALSE:          soft conversion.
+ *		FAIL:           function failed.
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Sept 2, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5T_compiler_conv(H5T_t *src, H5T_t *dst)
+{
+    H5T_path_t	*path;
+    htri_t	ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Find it */
+    if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id, FALSE)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found")
+
+    ret_value = (htri_t)path->is_hard;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_convert
+ *
+ * Purpose:	Call a conversion function to convert from source to
+ *		destination data type and accumulate timing statistics.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, December 15, 1998
+ *
+ * Modifications:
+ * 		Robb Matzke, 1999-06-16
+ *		The timers are updated only if H5T debugging is enabled at
+ *		runtime in addition to compile time.
+ *
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *
+ *              Quincey Koziol, 1999-07-01
+ *              Added dataset transfer properties, to allow custom VL
+ *              datatype allocation function to be passed down to VL
+ *              conversion routine.
+ *
+ *              Robb Matzke, 2000-05-17
+ *              Added the BKG_STRIDE argument which gets passed to all the
+ *              conversion functions. If BUF_STRIDE is non-zero then each
+ *              data element is at a multiple of BUF_STRIDE bytes in BUF
+ *              (on both input and output). If BKG_STRIDE is also set then
+ *              the BKG buffer is used in such a way that temporary space
+ *              for each element is aligned on a BKG_STRIDE byte boundary.
+ *              If either BUF_STRIDE or BKG_STRIDE are zero then the BKG
+ *              buffer will be accessed as though it were a packed array
+ *              of destination datatype.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_convert(H5T_path_t *tpath, hid_t src_id, hid_t dst_id, size_t nelmts,
+	    size_t buf_stride, size_t bkg_stride, void *buf, void *bkg,
+            hid_t dset_xfer_plist)
+{
+#ifdef H5T_DEBUG
+    H5_timer_t		timer;
+#endif
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+#ifdef H5T_DEBUG
+    if (H5DEBUG(T)) H5_timer_begin(&timer);
+#endif
+    tpath->cdata.command = H5T_CONV_CONV;
+    if ((tpath->func)(src_id, dst_id, &(tpath->cdata), nelmts, buf_stride,
+                      bkg_stride, buf, bkg, dset_xfer_plist)<0)
+	HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "data type conversion failed");
+#ifdef H5T_DEBUG
+    if (H5DEBUG(T)) {
+	H5_timer_end(&(tpath->stats.timer), &timer);
+	tpath->stats.ncalls++;
+	tpath->stats.nelmts += nelmts;
+    }
+#endif
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_oloc
+ *
+ * Purpose:	Returns a pointer to the object location for a named datatype.
+ *
+ * Return:	Success:	Ptr directly into named datatype
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, June  5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_loc_t *
+H5T_oloc(H5T_t *dt)
+{
+    H5O_loc_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(dt);
+
+    switch(dt->shared->state) {
+        case H5T_STATE_TRANSIENT:
+        case H5T_STATE_RDONLY:
+        case H5T_STATE_IMMUTABLE:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "not a named datatype")
+        case H5T_STATE_NAMED:
+        case H5T_STATE_OPEN:
+            HDassert(dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+            ret_value = &dt->oloc;
+            break;
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, NULL, "invalid datatype state")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_oloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_nameof
+ *
+ * Purpose:	Returns a pointer to the path for a named datatype.
+ *
+ * Return:	Success:	Ptr directly into named datatype
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, September 12, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5G_name_t *
+H5T_nameof(H5T_t *dt)
+{
+    H5G_name_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(dt);
+
+    switch(dt->shared->state) {
+        case H5T_STATE_TRANSIENT:
+        case H5T_STATE_RDONLY:
+        case H5T_STATE_IMMUTABLE:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "not a named datatype")
+        case H5T_STATE_NAMED:
+        case H5T_STATE_OPEN:
+            ret_value = &(dt->path);
+            break;
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, NULL, "invalid datatype state")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_nameof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_is_immutable
+ *
+ * Purpose:     Check if a datatype is immutable.
+ *
+ * Return:      TRUE
+ *
+ *              FALSE
+ *
+ * Programmer:  Raymond Lu
+ *              Friday, Dec 7, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_immutable(const H5T_t *dt)
+{
+    htri_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+
+    if(dt->shared->state == H5T_STATE_IMMUTABLE)
+        ret_value = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_is_named
+ *
+ * Purpose:     Check if a datatype is named.
+ *
+ * Return:      TRUE
+ *
+ *              FALSE
+ *
+ * Programmer:  Pedro Vicente
+ *              Tuesday, Sep 3, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_named(const H5T_t *dt)
+{
+    htri_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+
+    if(dt->shared->state == H5T_STATE_OPEN || dt->shared->state == H5T_STATE_NAMED)
+        ret_value = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5T_convert_committed_datatype
+ *
+ * Purpose:     To convert the committed datatype "dt" to a transient embedded
+ *		type if the file location associated with the committed datatype is 
+ *		different from the parameter "f".  
+ *		"f" is the file location where the dataset or attribute will be created.
+ *
+ * Notes:       See HDFFV-9940
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_convert_committed_datatype(H5T_t *dt, H5F_t *f)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+    HDassert(f);
+
+    if(H5T_is_named(dt) && (dt->sh_loc.file != f)) {
+       HDassert(dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+
+        H5O_msg_reset_share(H5O_DTYPE_ID, dt);
+        if(H5O_loc_free(&dt->oloc) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRESET, FAIL, "unable to initialize location")
+        if(H5G_name_free(&dt->path) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to reset path")
+
+        dt->shared->state = H5T_STATE_TRANSIENT;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_convert_committed_datatype() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5T_get_ref_type
+ PURPOSE
+    Retrieves the type of reference for a datatype
+ USAGE
+    H5R_type_t H5Tget_ref_type(dt)
+        H5T_t *dt;  IN: datatype pointer for the reference datatype
+
+ RETURNS
+    Success:	A reference type defined in H5Rpublic.h
+    Failure:	H5R_BADTYPE
+ DESCRIPTION
+    Given a reference datatype object, this function returns the reference type
+        of the datatype.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5R_type_t
+H5T_get_ref_type(const H5T_t *dt)
+{
+    H5R_type_t ret_value = H5R_BADTYPE;
+
+    FUNC_ENTER_NOAPI(H5R_BADTYPE)
+
+    HDassert(dt);
+
+    if(dt->shared->type==H5T_REFERENCE)
+        ret_value=dt->shared->u.atomic.u.r.rtype;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_get_ref_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_is_sensible
+ *
+ * Purpose:	Determines if a data type is sensible to store on disk
+ *              (i.e. not partially initialized)
+ *
+ * Return:	Success:	TRUE, FALSE
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, June 11, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_sensible(const H5T_t *dt)
+{
+    htri_t	ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+            /* Only allow compound datatypes with at least one member to be stored on disk */
+            if(dt->shared->u.compnd.nmembs > 0)
+                ret_value=TRUE;
+            else
+                ret_value=FALSE;
+            break;
+
+        case H5T_ENUM:
+            /* Only allow enum datatypes with at least one member to be stored on disk */
+            if(dt->shared->u.enumer.nmembs > 0)
+                ret_value=TRUE;
+            else
+                ret_value=FALSE;
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            /* Assume all other datatype are sensible to store on disk */
+            ret_value=TRUE;
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5T_set_loc
+ PURPOSE
+    Recursively mark any datatypes as on disk/in memory
+ USAGE
+    htri_t H5T_set_loc(dt,f,loc)
+        H5T_t *dt;              IN/OUT: Pointer to the datatype to mark
+        H5F_t *f;               IN: Pointer to the file the datatype is in
+        H5T_vlen_type_t loc     IN: location of type
+
+ RETURNS
+    One of two values on success:
+        TRUE - If the location of any vlen types changed
+        FALSE - If the location of any vlen types is the same
+    <0 is returned on failure
+ DESCRIPTION
+    Recursively descends any VL or compound datatypes to mark all VL datatypes
+    as either on disk or in memory.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5T_set_loc(H5T_t *dt, H5F_t *f, H5T_loc_t loc)
+{
+    htri_t changed;    /* Whether H5T_set_loc changed the type (even if the size didn't change) */
+    htri_t ret_value = 0;   /* Indicate that success, but no location change */
+    unsigned i;             /* Local index variable */
+    size_t old_size;        /* Previous size of a field */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+    HDassert(loc>=H5T_LOC_BADLOC && loc<H5T_LOC_MAXLOC);
+
+    /* Datatypes can't change in size if the force_conv flag is not set */
+    if(dt->shared->force_conv) {
+        /* Check the datatype of this element */
+        switch(dt->shared->type) {
+            case H5T_ARRAY:  /* Recurse on VL, compound and array base element type */
+                /* Recurse if it's VL, compound, enum or array */
+                /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
+                if(dt->shared->parent->shared->force_conv && H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
+                    /* Keep the old base element size for later */
+                    old_size=dt->shared->parent->shared->size;
+
+                    /* Mark the VL, compound or array type */
+                    if((changed=H5T_set_loc(dt->shared->parent,f,loc))<0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
+                    if(changed>0)
+                        ret_value=changed;
+
+                    /* Check if the field changed size */
+                    if(old_size != dt->shared->parent->shared->size) {
+                        /* Adjust the size of the array */
+                        dt->shared->size = dt->shared->u.array.nelem*dt->shared->parent->shared->size;
+                    } /* end if */
+                } /* end if */
+                break;
+
+            case H5T_COMPOUND:  /* Check each field and recurse on VL, compound and array type */
+                {
+                ssize_t accum_change = 0; /* Amount of change in the offset of the fields */
+
+                /* Sort the fields based on offsets */
+                H5T__sort_value(dt, NULL);
+
+                for (i=0; i<dt->shared->u.compnd.nmembs; i++) {
+                    H5T_t *memb_type;   /* Member's datatype pointer */
+
+                    /* Range check against compound member's offset */
+                    if ((accum_change < 0) && ((ssize_t) dt->shared->u.compnd.memb[i].offset < accum_change))
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "invalid field size in datatype");
+
+                    /* Apply the accumulated size change to the offset of the field */
+                    dt->shared->u.compnd.memb[i].offset += (size_t) accum_change;
+
+                    /* Set the member type pointer (for convenience) */
+                    memb_type=dt->shared->u.compnd.memb[i].type;
+
+                    /* Recurse if it's VL, compound, enum or array */
+                    /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
+                    if(memb_type->shared->force_conv && H5T_IS_COMPLEX(memb_type->shared->type)) {
+                        /* Keep the old field size for later */
+                        old_size=memb_type->shared->size;
+
+                        /* Mark the VL, compound, enum or array type */
+                        if((changed=H5T_set_loc(memb_type,f,loc))<0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
+                        if(changed>0)
+                            ret_value=changed;
+
+                        /* Check if the field changed size */
+                        if(old_size != memb_type->shared->size) {
+                            /* Adjust the size of the member */
+                            dt->shared->u.compnd.memb[i].size = (dt->shared->u.compnd.memb[i].size*memb_type->shared->size)/old_size;
+
+                            /* Add that change to the accumulated size change */
+                            accum_change += (ssize_t) (memb_type->shared->size - old_size);
+                        } /* end if */
+                    } /* end if */
+                } /* end for */
+
+                /* Range check against datatype size */
+                if ((accum_change < 0) && ((ssize_t) dt->shared->size < accum_change))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "invalid field size in datatype");
+
+                /* Apply the accumulated size change to the datatype */
+                dt->shared->size += (size_t) accum_change;
+                }
+                break;
+
+            case H5T_VLEN: /* Recurse on the VL information if it's VL, compound or array, then free VL sequence */
+                /* Recurse if it's VL, compound, enum or array */
+                /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
+                if(dt->shared->parent->shared->force_conv && H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
+                    if((changed=H5T_set_loc(dt->shared->parent,f,loc))<0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
+                    if(changed>0)
+                        ret_value=changed;
+                } /* end if */
+
+                /* Mark this VL sequence */
+                if((changed = H5T__vlen_set_loc(dt, f, loc)) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
+                if(changed>0)
+                    ret_value=changed;
+                break;
+
+            case H5T_REFERENCE:
+                /* Only need to change location of object references */
+                if(dt->shared->u.atomic.u.r.rtype==H5R_OBJECT) {
+                    /* Mark this reference */
+                    if(loc!=dt->shared->u.atomic.u.r.loc) {
+                        /* Set the location */
+                        dt->shared->u.atomic.u.r.loc = loc;
+
+                        /* Indicate that the location changed */
+                        ret_value=TRUE;
+                    } /* end if */
+                } /* end if */
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_TIME:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_ENUM:
+            case H5T_NCLASSES:
+            default:
+                break;
+        } /* end switch */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_set_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_is_relocatable
+ *
+ * Purpose:     Check if a datatype will change between disk and memory.
+ *
+ * Notes:       Currently, only variable-length and object references change
+ *              between disk & memory (see cases where things are changed in
+ *              the H5T_set_loc() code above).
+ *
+ * Return:
+ *  One of two values on success:
+ *      TRUE - If the location of any vlen types changed
+ *      FALSE - If the location of any vlen types is the same
+ *  <0 is returned on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, June 24, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_relocatable(const H5T_t *dt)
+{
+    htri_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(dt);
+
+    /* VL and reference datatypes are relocatable */
+    if(H5T_detect_class(dt, H5T_VLEN, FALSE) || H5T_detect_class(dt, H5T_REFERENCE, FALSE))
+        ret_value = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_is_relocatable() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_upgrade_version_cb
+ *
+ * Purpose:     H5T__visit callback to Upgrade the version of a datatype
+ *              (if there's any benefit to doing so)
+ *
+ * Note:	The behavior below is tightly coupled with the "better"
+ *              encodings for datatype messages in the datatype message
+ *              encoding routine.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, July 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_upgrade_version_cb(H5T_t *dt, void *op_value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(dt);
+    HDassert(op_value);
+
+    /* Special behavior for each type of datatype */
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+        case H5T_ARRAY:
+        case H5T_ENUM:
+            /* These types benefit from "upgrading" their version */
+            if(*(unsigned *)op_value > dt->shared->version)
+                dt->shared->version = *(unsigned *)op_value;
+            break;
+
+        case H5T_VLEN:
+            if(dt->shared->parent->shared->version > dt->shared->version)
+                dt->shared->version = dt->shared->parent->shared->version;
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_NCLASSES:
+        default:
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T_upgrade_version_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T__upgrade_version
+ *
+ * Purpose:     Upgrade the version of a datatype (if there's any benefit to
+ *              doing so) and recursively apply to compound members and/or
+ *              parent datatypes.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, July 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__upgrade_version(H5T_t *dt, unsigned new_version)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dt);
+
+    /* Iterate over entire datatype, upgrading the version of components, if it's useful */
+    if(H5T__visit(dt, (H5T_VISIT_SIMPLE | H5T_VISIT_COMPLEX_LAST), H5T_upgrade_version_cb, &new_version) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "iteration to upgrade datatype encoding version failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__upgrade_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_set_latest_version
+ *
+ * Purpose:     Set the encoding for a datatype to the latest version.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, July 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_set_latest_version(H5T_t *dt)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(dt);
+
+    /* Upgrade the format version for the datatype to the latest */
+    if(H5T__upgrade_version(dt, H5O_DTYPE_VERSION_LATEST) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't upgrade datatype encoding")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_set_latest_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_patch_file
+ *
+ * Purpose:     Patch the top-level file pointers contained in dt to point
+ *              to f, if dt is a committed type.  This is possible because
+ *              the top-level file pointer can be closed out from under
+ *              dt while dt is contained in the shared file's cache.
+ *
+ * Return:      SUCCEED
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, July 14, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_patch_file(H5T_t *dt, H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(dt);
+    HDassert(f);
+
+    if(H5T_STATE_OPEN == dt->shared->state || H5T_STATE_NAMED == dt->shared->state) {
+        dt->oloc.file = f;
+        dt->sh_loc.file = f;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_patch_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_patch_vlen_file
+ *
+ * Purpose:     Patch the top-level file pointer contained in (dt->shared->u.vlen.f)
+ *              to point to f.  This is possible because
+ *              the top-level file pointer can be closed out from under
+ *              dt while dt is contained in the shared file's cache.
+ *
+ * Return:      SUCCEED
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_patch_vlen_file(H5T_t *dt, H5F_t *f)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(dt);
+    HDassert(dt->shared);
+    HDassert(f);
+
+    if((dt->shared->type == H5T_VLEN) && dt->shared->u.vlen.f != f)
+        dt->shared->u.vlen.f = f;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T_patch_vlen_file() */
diff --git a/gatb-core/thirdparty/hdf5/src/H5TS.c b/gatb-core/thirdparty/hdf5/src/H5TS.c
new file mode 100644
index 0000000..7df65bf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5TS.c
@@ -0,0 +1,520 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* private headers */
+#include "H5private.h"    /*library                     */
+#include "H5Eprivate.h"    /*error handling              */
+#include "H5MMprivate.h"  /*memory management functions    */
+
+#ifdef H5_HAVE_THREADSAFE
+
+/* Module specific data structures */
+
+/* cancelability structure */
+typedef struct H5TS_cancel_struct {
+    int previous_state;
+    unsigned int cancel_count;
+} H5TS_cancel_t;
+
+/* Global variable definitions */
+#ifdef H5_HAVE_WIN_THREADS
+H5TS_once_t H5TS_first_init_g;
+#else /* H5_HAVE_WIN_THREADS */
+H5TS_once_t H5TS_first_init_g = PTHREAD_ONCE_INIT;
+#endif /* H5_HAVE_WIN_THREADS */
+H5TS_key_t H5TS_errstk_key_g;
+H5TS_key_t H5TS_funcstk_key_g;
+H5TS_key_t H5TS_cancel_key_g;
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_key_destructor
+ *
+ * USAGE
+ *    H5TS_key_destructor()
+ *
+ * RETURNS
+ *
+ * DESCRIPTION
+ *   Frees the memory for a key.  Called by each thread as it exits.
+ *   Currently all the thread-specific information for all keys are simple
+ *   structures allocated with malloc, so we can free them all uniformly.
+ *
+ * PROGRAMMER: Quincey Koziol
+ *             February 7, 2003
+ *
+ *--------------------------------------------------------------------------
+ */
+static void
+H5TS_key_destructor(void *key_val)
+{
+    /* Use HDfree here instead of H5MM_xfree(), to avoid calling the H5CS routines */
+    if(key_val!=NULL)
+        HDfree(key_val);
+}
+
+

+#ifndef H5_HAVE_WIN_THREADS
+
+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_pthread_first_thread_init
+ *
+ * USAGE
+ *    H5TS_pthread_first_thread_init()
+ *
+ * RETURNS
+ *
+ * DESCRIPTION
+ *   Initialization of global API lock, keys for per-thread error stacks and
+ *   cancallability information. Called by the first thread that enters the
+ *   library.
+ *
+ * PROGRAMMER: Chee Wai LEE
+ *             May 2, 2000
+ *
+ *--------------------------------------------------------------------------
+ */
+void
+H5TS_pthread_first_thread_init(void)
+{
+    H5_g.H5_libinit_g = FALSE;
+    
+#ifdef H5_HAVE_WIN32_API
+# ifdef PTW32_STATIC_LIB
+    pthread_win32_process_attach_np();
+# endif
+#endif
+
+    /* initialize global API mutex lock */
+    pthread_mutex_init(&H5_g.init_lock.atomic_lock, NULL);
+    pthread_cond_init(&H5_g.init_lock.cond_var, NULL);
+    H5_g.init_lock.lock_count = 0;
+
+    /* initialize key for thread-specific error stacks */
+    pthread_key_create(&H5TS_errstk_key_g, H5TS_key_destructor);
+
+    /* initialize key for thread-specific function stacks */
+    pthread_key_create(&H5TS_funcstk_key_g, H5TS_key_destructor);
+
+    /* initialize key for thread cancellability mechanism */
+    pthread_key_create(&H5TS_cancel_key_g, H5TS_key_destructor);
+}
+#endif /* H5_HAVE_WIN_THREADS */
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_mutex_lock
+ *
+ * USAGE
+ *    H5TS_mutex_lock(&mutex_var)
+ *
+ * RETURNS
+ *    0 on success and non-zero on error.
+ *
+ * DESCRIPTION
+ *    Recursive lock semantics for HDF5 (locking) -
+ *    Multiple acquisition of a lock by a thread is permitted with a
+ *    corresponding unlock operation required.
+ *
+ * PROGRAMMER: Chee Wai LEE
+ *             May 2, 2000
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_mutex_lock(H5TS_mutex_t *mutex)
+{
+#ifdef  H5_HAVE_WIN_THREADS
+    EnterCriticalSection( &mutex->CriticalSection); 
+    return 0;
+#else /* H5_HAVE_WIN_THREADS */
+    herr_t ret_value = pthread_mutex_lock(&mutex->atomic_lock);
+
+    if (ret_value)
+        return ret_value;
+
+    if(mutex->lock_count && pthread_equal(HDpthread_self(), mutex->owner_thread)) {
+        /* already owned by self - increment count */
+        mutex->lock_count++;
+    } else {
+        /* if owned by other thread, wait for condition signal */
+        while(mutex->lock_count)
+            pthread_cond_wait(&mutex->cond_var, &mutex->atomic_lock);
+
+        /* After we've received the signal, take ownership of the mutex */
+        mutex->owner_thread = HDpthread_self();
+        mutex->lock_count = 1;
+    }
+
+    return pthread_mutex_unlock(&mutex->atomic_lock); 
+#endif /* H5_HAVE_WIN_THREADS */
+}
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_mutex_unlock
+ *
+ * USAGE
+ *    H5TS_mutex_unlock(&mutex_var)
+ *
+ * RETURNS
+ *    0 on success and non-zero on error.
+ *
+ * DESCRIPTION
+ *    Recursive lock semantics for HDF5 (unlocking) -
+ *    Multiple acquisition of a lock by a thread is permitted with a
+ *    corresponding unlock operation required.
+ *
+ * PROGRAMMER: Chee Wai LEE
+ *             May 2, 2000
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_mutex_unlock(H5TS_mutex_t *mutex)
+{
+#ifdef  H5_HAVE_WIN_THREADS
+    /* Releases ownership of the specified critical section object. */
+    LeaveCriticalSection(&mutex->CriticalSection);
+    return 0; 
+#else  /* H5_HAVE_WIN_THREADS */
+    herr_t ret_value = pthread_mutex_lock(&mutex->atomic_lock);
+
+    if(ret_value)
+        return ret_value;
+
+    mutex->lock_count--;
+
+    ret_value = pthread_mutex_unlock(&mutex->atomic_lock);
+
+    if(mutex->lock_count == 0) {
+        int err;
+
+        err = pthread_cond_signal(&mutex->cond_var);
+        if(err != 0)
+            ret_value = err;
+    } /* end if */
+
+    return ret_value; 
+#endif /* H5_HAVE_WIN_THREADS */
+} /* H5TS_mutex_unlock */
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_cancel_count_inc
+ *
+ * USAGE
+ *    H5TS_cancel_count_inc()
+ *
+ * RETURNS
+ *    0 on success non-zero error code on error.
+ *
+ * DESCRIPTION
+ *    Creates a cancelation counter for a thread if it is the first time
+ *    the thread is entering the library.
+ *
+ *    if counter value is zero, then set cancelability type of the thread
+ *    to PTHREAD_CANCEL_DISABLE as thread is entering the library and store
+ *    the previous cancelability type into cancelation counter.
+ *    Increase the counter value by 1.
+ *
+ * PROGRAMMER: Chee Wai LEE
+ *            May 2, 2000
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_cancel_count_inc(void)
+{
+#ifdef  H5_HAVE_WIN_THREADS
+    /* unsupported; just return 0 */
+    return SUCCEED;
+#else /* H5_HAVE_WIN_THREADS */
+    H5TS_cancel_t *cancel_counter;
+    herr_t ret_value = SUCCEED; 
+
+    cancel_counter = (H5TS_cancel_t *)H5TS_get_thread_local_value(H5TS_cancel_key_g); 
+
+    if (!cancel_counter) {
+        /*
+   * First time thread calls library - create new counter and associate
+         * with key
+         */
+  cancel_counter = (H5TS_cancel_t *)H5MM_calloc(sizeof(H5TS_cancel_t));
+
+  if (!cancel_counter) {
+      H5E_push_stack(NULL, "H5TS_cancel_count_inc",
+         __FILE__, __LINE__, H5E_ERR_CLS_g, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed");
+      return FAIL;
+  }
+
+        ret_value = pthread_setspecific(H5TS_cancel_key_g,
+          (void *)cancel_counter);
+    }
+
+    if (cancel_counter->cancel_count == 0)
+        /* thread entering library */
+        ret_value = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
+             &cancel_counter->previous_state);
+
+    ++cancel_counter->cancel_count;
+
+    return ret_value; 
+#endif /* H5_HAVE_WIN_THREADS */
+}
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_cancel_count_dec
+ *
+ * USAGE
+ *    H5TS_cancel_count_dec()
+ *
+ * RETURNS
+ *    0 on success and a non-zero error code on error.
+ *
+ * DESCRIPTION
+ *    If counter value is one, then set cancelability type of the thread
+ *    to the previous cancelability type stored in the cancelation counter.
+ *    (the thread is leaving the library).
+ *
+ *    Decrement the counter value by 1.
+ *
+ * PROGRAMMER: Chee Wai LEE
+ *             May 2, 2000
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_cancel_count_dec(void)
+{
+#ifdef  H5_HAVE_WIN_THREADS 
+    /* unsupported; will just return 0 */
+    return SUCCEED;
+#else /* H5_HAVE_WIN_THREADS */
+    register H5TS_cancel_t *cancel_counter; 
+    herr_t ret_value = SUCCEED;
+
+    cancel_counter = (H5TS_cancel_t *)H5TS_get_thread_local_value(H5TS_cancel_key_g); 
+
+    if (cancel_counter->cancel_count == 1)
+        ret_value = pthread_setcancelstate(cancel_counter->previous_state, NULL);
+
+    --cancel_counter->cancel_count; 
+
+    return ret_value;
+#endif /* H5_HAVE_WIN_THREADS */
+}
+
+

+#ifdef H5_HAVE_WIN_THREADS
+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_win32_process_enter
+ *
+ * RETURNS
+ *    SUCCEED/FAIL
+ *
+ * DESCRIPTION
+ *    Per-process setup on Windows when using Win32 threads.
+ *
+ *--------------------------------------------------------------------------
+ */
+H5_DLL BOOL CALLBACK 
+H5TS_win32_process_enter(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex)
+{
+    BOOL ret_value = TRUE;
+
+    /* Initialize the critical section (can't fail) */
+    InitializeCriticalSection(&H5_g.init_lock.CriticalSection);
+
+    /* Set up thread local storage */
+    if(TLS_OUT_OF_INDEXES == (H5TS_errstk_key_g = TlsAlloc()))
+        ret_value = FALSE;
+
+#ifdef H5_HAVE_CODESTACK
+    if(TLS_OUT_OF_INDEXES == (H5TS_funcstk_key_g = TlsAlloc()))
+        ret_value = FALSE;
+#endif /* H5_HAVE_CODESTACK */
+
+    return ret_value;
+} /* H5TS_win32_process_enter() */
+#endif /* H5_HAVE_WIN_THREADS */
+
+

+#ifdef H5_HAVE_WIN_THREADS
+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_win32_thread_enter
+ *
+ * RETURNS
+ *    SUCCEED/FAIL
+ *
+ * DESCRIPTION
+ *    Per-thread setup on Windows when using Win32 threads.
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_win32_thread_enter(void)
+{
+    herr_t ret_value = SUCCEED;
+
+    /* Currently a placeholder function.  TLS setup is performed
+     * elsewhere in the library.
+     *
+     * WARNING: Do NOT use C standard library functions here.
+     * CRT functions are not allowed in DllMain, which is where this code
+     * is used.
+     */
+
+    return ret_value;
+} /* H5TS_win32_thread_enter() */
+#endif /* H5_HAVE_WIN_THREADS */
+
+

+#ifdef H5_HAVE_WIN_THREADS
+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_win32_process_exit
+ *
+ * RETURNS
+ *    SUCCEED/FAIL
+ *
+ * DESCRIPTION
+ *    Per-process cleanup on Windows when using Win32 threads.
+ *
+ *--------------------------------------------------------------------------
+ */
+void
+H5TS_win32_process_exit(void)
+{
+
+    /* Windows uses a different thread local storage mechanism which does
+     * not support auto-freeing like pthreads' keys.
+     *
+     * This function is currently registered via atexit() and is called
+     * AFTER H5_term_library().
+     */
+
+    /* Clean up critical section resources (can't fail) */
+    DeleteCriticalSection(&H5_g.init_lock.CriticalSection);
+
+    /* Clean up per-process thread local storage */
+    TlsFree(H5TS_errstk_key_g);
+
+#ifdef H5_HAVE_CODESTACK
+    TlsFree(H5TS_funcstk_key_g);
+#endif /* H5_HAVE_CODESTACK */
+
+    return;
+} /* H5TS_win32_process_exit() */
+#endif /* H5_HAVE_WIN_THREADS */
+
+

+#ifdef H5_HAVE_WIN_THREADS
+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_win32_thread_exit
+ *
+ * RETURNS
+ *    SUCCEED/FAIL
+ *
+ * DESCRIPTION
+ *    Per-thread cleanup on Windows when using Win32 threads.
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5TS_win32_thread_exit(void)
+{
+    LPVOID lpvData;
+    herr_t ret_value = SUCCEED;
+
+    /* Windows uses a different thread local storage mechanism which does
+     * not support auto-freeing like pthreads' keys.
+     *
+     * WARNING: Do NOT use C standard library functions here.
+     * CRT functions are not allowed in DllMain, which is where this code
+     * is used.
+     */
+
+    /* Clean up per-thread thread local storage */
+    lpvData = TlsGetValue(H5TS_errstk_key_g);
+    if(lpvData)
+        LocalFree((HLOCAL)lpvData);
+
+#ifdef H5_HAVE_CODESTACK
+    lpvData = TlsGetValue(H5TS_funcstk_key_g);
+    if(lpvData)
+        LocalFree((HLOCAL)lpvData);
+#endif /* H5_HAVE_CODESTACK */
+
+    return ret_value;
+} /* H5TS_win32_thread_exit() */
+#endif /* H5_HAVE_WIN_THREADS */
+
+

+/*--------------------------------------------------------------------------
+ * NAME
+ *    H5TS_create_thread
+ *
+ * RETURNS
+ *    Thread identifier.
+ *
+ * DESCRIPTION
+ *    Spawn off a new thread calling function 'func' with input 'udata'.
+ *
+ * PROGRAMMER: Mike McGreevy
+ *             August 31, 2010
+ *
+ *--------------------------------------------------------------------------
+ */
+H5TS_thread_t
+H5TS_create_thread(void *(*func)(void *), H5TS_attr_t *attr, void *udata)
+{
+    H5TS_thread_t ret_value;
+
+#ifdef  H5_HAVE_WIN_THREADS 
+
+    /* When calling C runtime functions, you should use _beginthread or
+     * _beginthreadex instead of CreateThread.  Threads created with
+     * CreateThread risk being killed in low-memory situations. Since we
+     * only create threads in our test code, this is unlikely to be an issue
+     * and we'll use the easier-to-deal-with CreateThread for now.
+     *
+     * NOTE: _beginthread() auto-recycles its handle when execution completes
+     *       so you can't wait on it, making it unsuitable for the existing
+     *       test code.
+     */
+    ret_value = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, udata, 0, NULL);
+
+#else /* H5_HAVE_WIN_THREADS */
+
+    pthread_create(&ret_value, attr, (void * (*)(void *))func, udata);
+
+#endif /* H5_HAVE_WIN_THREADS */
+
+    return ret_value;
+
+} /* H5TS_create_thread */
+
+#endif  /* H5_HAVE_THREADSAFE */
diff --git a/gatb-core/thirdparty/hdf5/src/H5TSprivate.h b/gatb-core/thirdparty/hdf5/src/H5TSprivate.h
new file mode 100644
index 0000000..5394b77
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5TSprivate.h
@@ -0,0 +1,131 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5TSprivate.h
+ *			May 2 2000
+ *			Chee Wai LEE
+ *
+ * Purpose:		Private non-prototype header.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef H5TSprivate_H_
+#define H5TSprivate_H_
+
+/* Public headers needed by this file */
+#ifdef LATER
+#include "H5TSpublic.h"		/*Public API prototypes */
+#endif /* LATER */
+
+#ifdef H5_HAVE_WIN_THREADS
+
+/* Library level data structures */
+
+/* Mutexes, Threads, and Attributes */
+typedef struct H5TS_mutex_struct {
+	CRITICAL_SECTION CriticalSection;
+} H5TS_mutex_t;
+typedef CRITICAL_SECTION H5TS_mutex_simple_t;
+typedef HANDLE H5TS_thread_t;
+typedef HANDLE H5TS_attr_t;
+typedef DWORD H5TS_key_t;
+typedef INIT_ONCE H5TS_once_t;
+
+/* Defines */
+/* not used on windows side, but need to be defined to something */
+#define H5TS_SCOPE_SYSTEM 0
+#define H5TS_SCOPE_PROCESS 0
+#define H5TS_CALL_CONV WINAPI
+
+/* Functions */
+#define H5TS_get_thread_local_value(key)	TlsGetValue( key )
+#define H5TS_set_thread_local_value(key, value)	TlsSetValue( key, value )
+#define H5TS_attr_init(attr_ptr) 0
+#define H5TS_attr_setscope(attr_ptr, scope) 0
+#define H5TS_attr_destroy(attr_ptr) 0
+#define H5TS_wait_for_thread(thread) WaitForSingleObject(thread, INFINITE)
+#define H5TS_mutex_init(mutex) InitializeCriticalSection(mutex)
+#define H5TS_mutex_lock_simple(mutex) EnterCriticalSection(mutex)
+#define H5TS_mutex_unlock_simple(mutex) LeaveCriticalSection(mutex)
+
+/* Functions called from DllMain */
+H5_DLL BOOL CALLBACK H5TS_win32_process_enter(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex);
+H5_DLL void H5TS_win32_process_exit(void);
+H5_DLL herr_t H5TS_win32_thread_enter(void);
+H5_DLL herr_t H5TS_win32_thread_exit(void);
+
+
+
+#else /* H5_HAVE_WIN_THREADS */
+
+/* Library level data structures */
+
+/* Mutexes, Threads, and Attributes */
+typedef struct H5TS_mutex_struct {
+    pthread_t owner_thread;		/* current lock owner */
+    pthread_mutex_t atomic_lock;	/* lock for atomicity of new mechanism */
+    pthread_cond_t cond_var;		/* condition variable */
+    unsigned int lock_count;
+} H5TS_mutex_t;
+typedef pthread_t      H5TS_thread_t;
+typedef pthread_attr_t H5TS_attr_t;
+typedef pthread_mutex_t H5TS_mutex_simple_t;
+typedef pthread_key_t  H5TS_key_t;
+typedef pthread_once_t H5TS_once_t;
+
+/* Scope Definitions */
+#define H5TS_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM
+#define H5TS_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS
+#define H5TS_CALL_CONV /* unused - Windows only */
+
+/* Functions */
+#define H5TS_get_thread_local_value(key)	pthread_getspecific( key )
+#define H5TS_set_thread_local_value(key, value)	pthread_setspecific( key, value )
+#define H5TS_attr_init(attr_ptr) pthread_attr_init((attr_ptr))
+#define H5TS_attr_setscope(attr_ptr, scope) pthread_attr_setscope(attr_ptr, scope)
+#define H5TS_attr_destroy(attr_ptr) pthread_attr_destroy(attr_ptr)
+#define H5TS_wait_for_thread(thread) pthread_join(thread, NULL)
+#define H5TS_mutex_init(mutex) pthread_mutex_init(mutex, NULL)
+#define H5TS_mutex_lock_simple(mutex) pthread_mutex_lock(mutex)
+#define H5TS_mutex_unlock_simple(mutex) pthread_mutex_unlock(mutex)
+
+#endif /* H5_HAVE_WIN_THREADS */
+
+/* External global variables */
+extern H5TS_once_t H5TS_first_init_g;
+extern H5TS_key_t H5TS_errstk_key_g;
+extern H5TS_key_t H5TS_funcstk_key_g;
+
+#if defined c_plusplus || defined __cplusplus
+extern      "C"
+{
+#endif	/* c_plusplus || __cplusplus */
+
+H5_DLL void   H5TS_pthread_first_thread_init(void);
+H5_DLL herr_t H5TS_mutex_lock(H5TS_mutex_t *mutex);
+H5_DLL herr_t H5TS_mutex_unlock(H5TS_mutex_t *mutex);
+H5_DLL herr_t H5TS_cancel_count_inc(void);
+H5_DLL herr_t H5TS_cancel_count_dec(void);
+H5_DLL H5TS_thread_t H5TS_create_thread(void *(*func)(void *), H5TS_attr_t * attr, void *udata);
+
+#if defined c_plusplus || defined __cplusplus
+}
+#endif	/* c_plusplus || __cplusplus */
+
+#endif	/* H5TSprivate_H_ */
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tarray.c b/gatb-core/thirdparty/hdf5/src/H5Tarray.c
new file mode 100644
index 0000000..752f2aa
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tarray.c
@@ -0,0 +1,454 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for array datatypes in
+ *      the H5T interface.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_array_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling			*/
+#include "H5Iprivate.h"		/* IDs					*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Public Variables */
+/*********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_array_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_array_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_array_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_array_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tarray_create2
+ *
+ * Purpose:	Create a new array datatype based on the specified BASE_TYPE.
+ *		The type is an array with NDIMS dimensionality and the size of the
+ *      array is DIMS. The total member size should be relatively small.
+ *      Array datatypes are currently limited to H5S_MAX_RANK number of
+ *      dimensions and must have the number of dimensions set greater than
+ *      0. (i.e. 0 > ndims <= H5S_MAX_RANK)  All dimensions sizes must be greater
+ *      than 0 also.
+ *
+ * Return:	Success:	ID of new array datatype
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Oct 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tarray_create2(hid_t base_id, unsigned ndims, const hsize_t dim[/* ndims */])
+{
+    H5T_t	*base;		/* base datatype	*/
+    H5T_t	*dt = NULL;	/* new array datatype	*/
+    unsigned    u;              /* local index variable */
+    hid_t	ret_value;	/* return value	*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iIu*h", base_id, ndims, dim);
+
+    /* Check args */
+    if(ndims < 1 || ndims > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dimensionality")
+    if(!dim)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified")
+    for(u = 0; u < ndims; u++)
+        if(!(dim[u] > 0))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "zero-sized dimension specified")
+    if(NULL == (base = (H5T_t *)H5I_object_verify(base_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+
+    /* Create the array datatype */
+    if(NULL == (dt = H5T__array_create(base, ndims, dim)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create datatype")
+
+    /* Atomize the type */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    if(ret_value < 0) {
+        if(dt && H5T_close(dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't release datatype")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Tarray_create2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__array_create
+ *
+ * Purpose:	Internal routine to create a new array data type based on the
+ *      specified BASE_TYPE.  The type is an array with NDIMS dimensionality
+ *      and the size of the array is DIMS.
+ *      Array datatypes are currently limited to H5S_MAX_RANK number
+ *      of dimensions.
+ *
+ * Return:	Success:	ID of new array data type
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Oct 26, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T__array_create(H5T_t *base, unsigned ndims, const hsize_t dim[/* ndims */])
+{
+    H5T_t	*ret_value;	/* new array data type	*/
+    unsigned    u;              /* local index variable */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(base);
+    HDassert(ndims <= H5S_MAX_RANK);
+    HDassert(dim);
+
+    /* Build new type */
+    if(NULL == (ret_value = H5T__alloc()))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    ret_value->shared->type = H5T_ARRAY;
+
+    /* Copy the base type of the array */
+    if(NULL == (ret_value->shared->parent = H5T_copy(base, H5T_COPY_ALL)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "unable to copy base datatype")
+
+    /* Set the array parameters */
+    ret_value->shared->u.array.ndims = ndims;
+
+    /* Copy the array dimensions & compute the # of elements in the array */
+    for(u = 0, ret_value->shared->u.array.nelem = 1; u < ndims; u++) {
+        H5_CHECKED_ASSIGN(ret_value->shared->u.array.dim[u], size_t, dim[u], hsize_t);
+        ret_value->shared->u.array.nelem *= (size_t)dim[u];
+    } /* end for */
+
+    /* Set the array's size (number of elements * element datatype's size) */
+    ret_value->shared->size = ret_value->shared->parent->shared->size * ret_value->shared->u.array.nelem;
+
+    /* Set the "force conversion" flag if the base datatype indicates */
+    if(base->shared->force_conv == TRUE)
+        ret_value->shared->force_conv = TRUE;
+
+    /* Array datatypes need a later version of the datatype object header message */
+    ret_value->shared->version = MAX(base->shared->version, H5O_DTYPE_VERSION_2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T__array_create */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_array_ndims
+ *
+ * Purpose:	Query the number of dimensions for an array datatype.
+ *
+ * Return:	Success:	Number of dimensions of the array datatype
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 6, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_array_ndims(hid_t type_id)
+{
+    H5T_t *dt;		    /* pointer to array datatype	*/
+    int	ret_value;	    /* return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(dt->shared->type != H5T_ARRAY)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an array datatype")
+
+    /* Retrieve the number of dimensions */
+    ret_value = H5T__get_array_ndims(dt);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Tget_array_ndims */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__get_array_ndims
+ *
+ * Purpose:	Private function for H5T__get_array_ndims.  Query the number
+ *              of dimensions for an array datatype.
+ *
+ * Return:	Success:	Number of dimensions of the array datatype
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *              October 10, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T__get_array_ndims(const H5T_t *dt)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(dt);
+    HDassert(dt->shared->type == H5T_ARRAY);
+
+    /* Retrieve the number of dimensions */
+    FUNC_LEAVE_NOAPI((int)dt->shared->u.array.ndims)
+}   /* end H5T__get_array_ndims */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_array_dims2
+ *
+ * Purpose:	Query the sizes of dimensions for an array datatype.
+ *
+ * Return:	Success:	Number of dimensions of the array type
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_array_dims2(hid_t type_id, hsize_t dims[])
+{
+    H5T_t *dt;		/* pointer to array data type	*/
+    int	ret_value;	/* return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("Is", "i*h", type_id, dims);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(dt->shared->type != H5T_ARRAY)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an array datatype")
+
+    /* Retrieve the sizes of the dimensions */
+    if((ret_value = H5T__get_array_dims(dt, dims)) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unable to get dimension sizes")
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Tget_array_dims2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__get_array_dims
+ *
+ * Purpose:	Private function for H5T__get_array_dims.  Query the sizes
+ *              of dimensions for an array datatype.
+ *
+ * Return:	Success:	Number of dimensions of the array type
+ *		Failure:	Negative
+ *
+ * Programmer:  Raymond Lu
+ *              October 10, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T__get_array_dims(const H5T_t *dt, hsize_t dims[])
+{
+    unsigned u;         /* Local index variable */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(dt);
+    HDassert(dt->shared->type == H5T_ARRAY);
+
+    /* Retrieve the sizes of the dimensions */
+    if(dims)
+        for(u = 0; u < dt->shared->u.array.ndims; u++)
+            dims[u] = dt->shared->u.array.dim[u];
+
+    /* Pass along the array rank as the return value */
+    FUNC_LEAVE_NOAPI((int)dt->shared->u.array.ndims)
+}   /* end H5T__get_array_dims */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tarray_create1
+ *
+ * Purpose:	Create a new array datatype based on the specified BASE_TYPE.
+ *		The type is an array with NDIMS dimensionality and the size of the
+ *      array is DIMS. The total member size should be relatively small.
+ *      Array datatypes are currently limited to H5S_MAX_RANK number of
+ *      dimensions and must have the number of dimensions set greater than
+ *      0. (i.e. 0 > ndims <= H5S_MAX_RANK)  All dimensions sizes must be greater
+ *      than 0 also.
+ *
+ * Return:	Success:	ID of new array datatype
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Oct 26, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tarray_create1(hid_t base_id, int ndims, const hsize_t dim[/* ndims */],
+    const int H5_ATTR_UNUSED perm[/* ndims */])
+{
+    H5T_t	*base;		/* base datatype	*/
+    H5T_t	*dt = NULL;	/* new array datatype	*/
+    unsigned    u;              /* local index variable */
+    hid_t	ret_value;	/* return value	*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("i", "iIs*h*Is", base_id, ndims, dim, perm);
+
+    /* Check args */
+    if(ndims < 1 || ndims > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dimensionality")
+    if(!dim)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified")
+    for(u = 0; u < (unsigned)ndims; u++)
+        if(!(dim[u] > 0))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "zero-sized dimension specified")
+    if(NULL == (base = (H5T_t *)H5I_object_verify(base_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+
+    /* Create the array datatype */
+    if(NULL == (dt = H5T__array_create(base, (unsigned)ndims, dim)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create datatype")
+
+    /* Atomize the type */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    if(ret_value < 0) {
+        if(dt && H5T_close(dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't release datatype")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Tarray_create1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_array_dims1
+ *
+ * Purpose:	Query the sizes of dimensions for an array datatype.
+ *
+ * Return:	Success:	Number of dimensions of the array type
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November 6, 2000
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_array_dims1(hid_t type_id, hsize_t dims[], int H5_ATTR_UNUSED perm[])
+{
+    H5T_t *dt;		/* Array datatype to query	*/
+    int	ret_value;	/* return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Is", "i*h*Is", type_id, dims, perm);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object")
+    if(dt->shared->type != H5T_ARRAY)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an array datatype")
+
+    /* Retrieve the sizes of the dimensions */
+    if((ret_value = H5T__get_array_dims(dt, dims)) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unable to get dimension sizes")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Tget_array_dims1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tbit.c b/gatb-core/thirdparty/hdf5/src/H5Tbit.c
new file mode 100644
index 0000000..79cf3a6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tbit.c
@@ -0,0 +1,717 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info:	Operations on bit vectors.  A bit vector is an array of bytes
+ *		with the least-significant bits in the first byte.  That is,
+ *		the bytes are in little-endian order.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Tpkg.h"		/*data-type functions			  */
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_copy
+ *
+ * Purpose:	Copies bits from one vector to another.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, June 10, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T__bit_copy(uint8_t *dst, size_t dst_offset, const uint8_t *src,
+    size_t src_offset, size_t size)
+{
+    size_t  shift;
+    size_t  mask_lo, mask_hi;
+    size_t  s_idx, d_idx;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /*
+     * Normalize the offset to be a byte number and a bit offset within that
+     * byte.
+     */
+    s_idx = src_offset / 8;
+    d_idx = dst_offset / 8;
+    src_offset %= 8;
+    dst_offset %= 8;
+
+    /*
+     * Get things rolling. This means copying bits until we're aligned on a
+     * source byte.  This the following example, five bits are copied to the
+     * destination.
+     *
+     *                      src[s_idx]
+     *   +---------------+---------------+
+     *   |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
+     *   +---------------+---------------+
+     *      ... : : : : : | | | | |
+     *      ... v v v v v V V V V V
+     *      ...+---------------+---------------+
+     *      ...|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
+     *      ...+---------------+---------------+
+     *           dst[d_idx+1]      dst[d_idx]
+     */
+    while(src_offset && size > 0) {
+	size_t nbits = MIN3(size, 8 - dst_offset, 8 - src_offset);
+	size_t mask = ((size_t)1 << nbits) - 1;
+
+	dst[d_idx] &= (uint8_t)~(mask << dst_offset);
+	dst[d_idx] |= (uint8_t)(((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset);
+
+	src_offset += nbits;
+	if(src_offset >= 8) {
+	    s_idx++;
+	    src_offset %= 8;
+	} /* end if */
+
+	dst_offset += nbits;
+	if(dst_offset >= 8) {
+	    d_idx++;
+	    dst_offset %= 8;
+	} /* end if */
+
+	size -= nbits;
+    } /* end while */
+
+    /*
+     * The middle bits. We are aligned on a source byte which needs to be
+     * copied to two (or one in the degenerate case) destination bytes.
+     *
+     * 		      src[s_idx]
+     * 		   +---------------+
+     *  	   |7 6 5 4 3 2 1 0|
+     * 		   +---------------+
+     *              | | | | | | | |
+     * 		    V V V V V V V V
+     *   +---------------+---------------+
+     *   |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
+     *   +---------------+---------------+
+     *     dst[d_idx+1]      dst[d_idx]
+     *
+     *
+     * Calculate shifts and masks.  See diagrams below.  MASK_LO in this
+     * example is 0x1f (the low five bits) and MASK_HI is 0xe0 (the high three
+     * bits). SHIFT is three since the source must be shifted right three bits
+     * to line up with the destination.
+     */
+    shift = dst_offset;
+    mask_lo = ((size_t)1 << (8 - shift)) - 1;
+    mask_hi = (~mask_lo) & 0xff;
+
+    for(/*void*/; size > 8; size -= 8, d_idx++, s_idx++) {
+	if(shift) {
+	    dst[d_idx + 0] &= (uint8_t)(~(mask_lo << shift));
+	    dst[d_idx + 0] |= (uint8_t)((src[s_idx] & mask_lo) << shift);
+	    dst[d_idx + 1] &= (uint8_t)(~(mask_hi >> (8 - shift)));
+	    dst[d_idx + 1] |= (uint8_t)((src[s_idx] & mask_hi) >> (8 - shift));
+	} /* end if */
+        else
+	    dst[d_idx] = src[s_idx];
+    } /* end for */
+
+    /* Finish up */
+    while(size > 0) {
+	size_t nbits = (size_t)MIN3 (size, 8 - dst_offset, 8 - src_offset);
+	size_t mask = ((size_t)1 << nbits) - 1;
+
+	dst[d_idx] &= (uint8_t)(~(mask << dst_offset));
+	dst[d_idx] |= (uint8_t)(((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset);
+
+	src_offset += nbits;
+	if(src_offset >= 8) {
+	    s_idx++;
+	    src_offset %= 8;
+	} /* end if */
+
+	dst_offset += nbits;
+	if(dst_offset >= 8) {
+	    d_idx++;
+	    dst_offset %= 8;
+	} /* end if */
+
+	size -= nbits;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5T__bit_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_shift
+ *
+ * Purpose:	Simulation of hardware shifting.  Shifts a bit vector
+ *              in a way similar to shifting a variable value, like
+ *              value <<= 3, or value >>= 16.  SHIFT_DIST is positive for
+ *              left shift, negative for right shift.  The bit vector starts
+ *              at OFFSET and is SIZE long.  The caller has to make sure
+ *              SIZE+OFFSET doesn't exceed the size of BUF.
+ *
+ *              For example, if we have a bit sequence 00011100, offset=2,
+ *              size=3, shift_dist=2, the result will be 00010000.
+ *
+ * Return:	void
+ *
+ * Programmer:	Raymond Lu
+ *              Monday, April 12, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__bit_shift(uint8_t *buf, ssize_t shift_dist, size_t offset, size_t size)
+{
+    uint8_t tmp_buf[512];       /* Temporary buffer */
+    H5WB_t *wb = NULL;          /* Wrapped buffer for temporary buffer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(buf);
+    HDassert(size);
+
+    if(shift_dist) {
+        size_t abs_shift_dist = (size_t)ABS(shift_dist);
+
+        if(abs_shift_dist >= size)
+            H5T__bit_set(buf, offset, size, 0);
+        else {
+            size_t buf_size = (size / 8) + 1;   /* Size of shift buffer needed */
+            uint8_t *shift_buf;                 /* Pointer to shift buffer */
+
+            /* Wrap the local buffer for serialized header info */
+            if(NULL == (wb = H5WB_wrap(tmp_buf, sizeof(tmp_buf))))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't wrap buffer")
+
+            /* Get a pointer to a buffer that's large enough  */
+            if(NULL == (shift_buf = (uint8_t *)H5WB_actual(wb, buf_size)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, "can't get actual buffer")
+
+            /* Shift vector by making copies */
+            if(shift_dist > 0) { /* left shift */
+                /* Copy part to be shifted to a temporary buffer */
+                H5T__bit_copy(shift_buf, (size_t)0, buf, offset, size - abs_shift_dist);
+
+                /* Copy it back to the original buffer */
+                H5T__bit_copy(buf, offset + abs_shift_dist, shift_buf, (size_t)0, size - abs_shift_dist);
+
+                /* Zero-set the left part*/
+                H5T__bit_set(buf, offset, abs_shift_dist, 0);
+            } /* end if */
+            else { /* right shift */
+                H5T__bit_copy(shift_buf, (size_t)0, buf, offset + abs_shift_dist, size - abs_shift_dist);
+                H5T__bit_copy(buf, offset, shift_buf, (size_t)0, size - abs_shift_dist);
+                H5T__bit_set(buf, offset + size - abs_shift_dist, abs_shift_dist, 0);
+            } /* end else */
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(wb && H5WB_unwrap(wb) < 0)
+        HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__bit_shift() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_get_d
+ *
+ * Purpose:	Return a small bit sequence as a number.  Bit vector starts
+ *              at OFFSET and is SIZE bits long.
+ *
+ * Return:	Success:	The bit sequence interpretted as an unsigned
+ *				integer.
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, June 23, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+uint64_t
+H5T__bit_get_d(uint8_t *buf, size_t offset, size_t size)
+{
+    uint64_t	val = 0;
+    size_t	i, hs;
+    uint64_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(8 * sizeof(val) >= size);
+
+    H5T__bit_copy((uint8_t*)&val, (size_t)0, buf, offset, size);
+    switch(H5T_native_order_g) {
+        case H5T_ORDER_LE:
+            break;
+
+        case H5T_ORDER_BE:
+            for(i = 0, hs = sizeof(val) / 2; i < hs; i++) {
+                uint8_t tmp = ((uint8_t*)&val)[i];
+                ((uint8_t*)&val)[i] = ((uint8_t*)&val)[sizeof(val) - (i + 1)];
+                ((uint8_t*)&val)[sizeof(val) - (i + 1)] = tmp;
+            } /* end for */
+            break;
+
+        case H5T_ORDER_ERROR:
+        case H5T_ORDER_VAX:
+        case H5T_ORDER_NONE:
+        case H5T_ORDER_MIXED:
+        default:
+            /* Unknown endianness. Bail out. */
+            HGOTO_DONE(UFAIL)
+    } /* end switch */
+
+    /* Set return value */
+    ret_value = val;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__bit_get_d() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_set_d
+ *
+ * Purpose:	Sets part of a bit vector to the specified unsigned value.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, June 24, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T__bit_set_d(uint8_t *buf, size_t offset, size_t size, uint64_t val)
+{
+    size_t	i, hs;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(8 * sizeof(val) >= size);
+
+    switch(H5T_native_order_g) {
+        case H5T_ORDER_LE:
+            break;
+
+        case H5T_ORDER_BE:
+            for(i = 0, hs = sizeof(val) / 2; i < hs; i++) {
+                uint8_t tmp = ((uint8_t *)&val)[i];
+                ((uint8_t *)&val)[i] = ((uint8_t *)&val)[sizeof(val) - (i + 1)];
+                ((uint8_t *)&val)[sizeof(val) - (i + 1)] = tmp;
+            } /* end for */
+            break;
+
+        case H5T_ORDER_ERROR:
+        case H5T_ORDER_VAX:
+        case H5T_ORDER_NONE:
+        case H5T_ORDER_MIXED:
+        default:
+            HDabort();
+    } /* end switch */
+
+    H5T__bit_copy(buf, offset, (uint8_t*)&val, (size_t)0, size);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5T__bit_set_d() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_set
+ *
+ * Purpose:	Sets or clears bits in a contiguous region of a vector
+ *		beginning at bit OFFSET and continuing for SIZE bits.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, June 10, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T__bit_set(uint8_t *buf, size_t offset, size_t size, hbool_t value)
+{
+    int	idx;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Normalize */
+    idx = (int)offset / 8;
+    offset %= 8;
+
+    /* The first partial byte */
+    if(size && offset % 8) {
+	size_t nbits = MIN(size, 8 - offset);
+	unsigned mask = ((unsigned)1 << nbits) - 1;
+
+	if(value)
+	    buf[idx++] |= (uint8_t)(mask << offset);
+	else
+	    buf[idx++] &= (uint8_t)(~(mask << offset));
+	size -= nbits;
+    } /* end if */
+
+    /* The middle bytes */
+    while(size >= 8) {
+	buf[idx++] = value ? 0xff : 0x00;
+	size -= 8;
+    } /* end while */
+
+    /* The last partial byte */
+    if(size) {
+	if(value)
+	    buf[idx] |= (uint8_t)(((unsigned)1 << size) - 1);
+	else
+	    buf[idx] &= (uint8_t)(~(((unsigned)1 << size) - 1));
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5T__bit_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_find
+ *
+ * Purpose:	Finds the first bit with the specified VALUE within a region
+ *		of a bit vector.  The region begins at OFFSET and continues
+ *		for SIZE bits, but the region can be searched from the least
+ *		significat end toward the most significant end(H5T_BIT_LSB
+ *		as DIRECTION), or from the most significant end to the least
+ *		significant end(H5T_BIT_MSB as DIRECTION).
+ *
+ * Return:	Success:	The position of the bit found, relative to
+ *				the offset.
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, June 10, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5T__bit_find(uint8_t *buf, size_t offset, size_t size, H5T_sdir_t direction,
+	      hbool_t value)
+{
+    ssize_t	base = (ssize_t)offset;
+    ssize_t	idx, i;
+    size_t	iu;
+    ssize_t     ret_value = (-1);         /* Return value */
+
+    /* Use FUNC_ENTER_PACKAGE_NOERR here to avoid performance issues */
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Some functions call this with value=TRUE */
+    HDassert(TRUE == 1);
+
+    switch(direction) {
+        case H5T_BIT_LSB:
+            /* Calculate index */
+            idx = (ssize_t)(offset / 8);
+            offset %= 8;
+
+            /* Beginning */
+            if(offset) {
+                for(iu = offset; iu < 8 && size > 0; iu++, size--)
+                    if(value == (hbool_t)((buf[idx] >> iu) & 0x01))
+                        HGOTO_DONE(8 * idx + (ssize_t)iu - base);
+
+                offset = 0;
+                idx++;
+            } /* end if */
+
+            /* Middle */
+            while(size >= 8) {
+                if((value ? 0x00 : 0xff) != buf[idx])
+                    for(i = 0; i < 8; i++)
+                        if(value == (hbool_t)((buf[idx] >> i) & 0x01))
+                            HGOTO_DONE(8 * idx + i - base);
+
+                size -= 8;
+                idx++;
+            } /* end while */
+
+            /* End */
+            for(i = 0; i < (ssize_t)size; i++)
+                if(value == (hbool_t)((buf[idx] >> i) & 0x01))
+                    HGOTO_DONE(8 * idx + i - base);
+            break;
+
+        case H5T_BIT_MSB:
+            /* Calculate index */
+            idx = (ssize_t)((offset + size - 1) / 8);
+            offset %= 8;
+
+            /* Beginning */
+            if(size > 8 - offset && (offset + size) % 8) {
+                for(iu = (offset + size) % 8; iu > 0; --iu, --size)
+                    if(value == (hbool_t)((buf[idx] >> (iu - 1)) & 0x01))
+                        HGOTO_DONE(8 * idx + (ssize_t)(iu - 1) - base);
+
+                --idx;
+            } /* end if */
+
+            /* Middle */
+            while(size >= 8) {
+                if((value ? 0x00 : 0xff) != buf[idx]) {
+                    for(i = 7; i >= 0; --i)
+                        if(value == (hbool_t)((buf[idx] >> i) & 0x01))
+                            HGOTO_DONE(8 * idx + i - base);
+                } /* end if */
+
+                size -= 8;
+                --idx;
+            } /* end while */
+
+            /* End */
+            if(size > 0) {
+                for(iu = offset + size; iu > offset; --iu)
+                    if(value == (hbool_t)((buf[idx] >> (iu - 1)) & 0x01))
+                        HGOTO_DONE(8 * idx + (ssize_t)(iu - 1) - base);
+            } /* end if */
+            break;
+
+        default:
+            HDassert(0 && "Unknown bit search direction");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__bit_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_inc
+ *
+ * Purpose:	Increment part of a bit field by adding 1.  The bit field
+ *              starts with bit position START and is SIZE bits long.
+ *
+ * Return:	Success:        The carry-out value.  One if overflows,
+ *                              zero otherwise.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, June 26, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T__bit_inc(uint8_t *buf, size_t start, size_t size)
+{
+    size_t	idx = start / 8;
+    unsigned	carry = 1;
+    unsigned	acc, mask;
+
+    /* Use FUNC_ENTER_PACKAGE_NOERR here to avoid performance issues */
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(buf);
+
+    start %= 8;
+
+    /* The first partial byte */
+    if(start) {
+	if(size + start < 8)
+            mask = ((unsigned)1 << size) - 1;
+	else
+            mask = ((unsigned)1 << (8 - start)) - 1;
+	acc = ((unsigned)buf[idx] >> start) & mask;
+	acc++;
+	carry = acc & ((unsigned)1 << MIN(size, 8 - start));
+	buf[idx] &= (uint8_t)(~(mask << start));
+	buf[idx] |= (uint8_t)((acc & mask) << start);
+	size -= MIN(size, 8 - start);
+	start = 0;
+	idx++;
+    } /* end if */
+
+    /* The middle */
+    while(carry && size >= 8) {
+	acc = buf[idx];
+	acc++;
+	carry = acc & 0x100;
+	buf[idx] = acc & 0xff;
+	idx++;
+	size -= 8;
+    } /* end while */
+
+    /* The last bits */
+    if(carry && size > 0) {
+	mask = ((unsigned)1 << size) - 1;
+	acc = buf[idx] & mask;
+	acc++;
+	carry = acc & ((unsigned)1 << size);
+	buf[idx] &= (uint8_t)(~mask);
+	buf[idx] |= (uint8_t)(acc & mask);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(carry ? TRUE : FALSE)
+} /* end H5T__bit_inc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_dec
+ *
+ * Purpose:	decrement part of a bit field by substracting 1.  The bit
+ *              field starts with bit position START and is SIZE bits long.
+ *
+ * Return:	Success:        The "borrow-in" value. It's one if underflows,
+ *                              zero otherwise.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Raymond Lu
+ *              March 17, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T__bit_dec(uint8_t *buf, size_t start, size_t size)
+{
+    size_t	idx = start / 8;
+    size_t      pos = start % 8;
+    uint8_t     tmp;
+    unsigned	borrow = 0;
+
+    /* Use FUNC_ENTER_PACKAGE_NOERR here to avoid performance issues */
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(buf);
+    HDassert(size);
+
+    /* The first partial byte */
+    if((size + start - 1) / 8 > idx) { /*bit sequence doesn't end in the same byte as starts*/
+        /* Example:  a sequence like 11000100 and start = 3.  We substract 00001000 from
+         * it and get 10111100.  If a sequence is 00000111, we do right shift for START
+         * bits and get 00000000.  So we need to borrow from higher byte when we substract
+         * 00001000.
+         */
+        if(!(buf[idx] >> pos))
+            borrow = 1;
+        buf[idx] = (uint8_t)(buf[idx] - (1 << pos));
+        idx++;
+        size -= (8 - pos);
+
+        /* The middle bytes */
+        while(borrow && size >= 8) {
+            if(buf[idx])
+                borrow = 0;
+            buf[idx]--;
+
+            idx++;
+            size -= 8;
+        } /* end while */
+
+        /* The last partial byte */
+        if(borrow && size > 0) {
+            /* Similar to the first byte case, where sequence ends in the same byte as starts */
+            tmp = buf[idx];
+            buf[idx]--;
+            if((buf[idx] >> size) != tmp >> size)
+                buf[idx] = (uint8_t)(buf[idx] + (1 << size));
+        } /* end if */
+    } /* end if */
+    else { /* bit sequence ends in the same byte as starts */
+        /* Example: a sequence like 11000100 and pos=3, size=3.  We substract 00001000
+         * and get 10111100.  A bit is borrowed from 6th bit(buf[idx]>>6=00000010, tmp>>6=00000011,
+         * not equal).  We need to put this bit back by increment 1000000.
+         */
+        tmp = buf[idx];
+        buf[idx] = (uint8_t)(buf[idx] - (1 << pos));
+        if((buf[idx] >> (pos + size)) != tmp >> (pos + size)) {
+            buf[idx] = (uint8_t)(buf[idx] + (1 << (pos + size)));
+            borrow = 1;
+        } /* end if */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(borrow ? TRUE : FALSE)
+} /* end H5T__bit_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__bit_neg
+ *
+ * Purpose:	negate part of a bit sequence.  The bit
+ *              field starts with bit position START and is SIZE bits long.
+ *
+ * Return:	void
+ *
+ * Programmer:	Raymond Lu
+ *              March 19, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T__bit_neg(uint8_t *buf, size_t start, size_t size)
+{
+    size_t	idx = start / 8;
+    size_t      pos = start % 8;
+    uint8_t     tmp[1];
+
+    /* Use FUNC_ENTER_PACKAGE_NOERR here to avoid performance issues */
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(buf);
+    HDassert(size);
+
+    /* The first partial byte */
+    tmp[0] = (uint8_t)~buf[idx];
+
+    /* Simply copy the negated bit field back to the original byte */
+    if((size + start - 1) / 8 > idx) {   /*bit sequence doesn't end in the same byte as starts*/
+        H5T__bit_copy(&(buf[idx]), pos, tmp, pos, (8-pos));
+        idx++;
+        size -= (8 - pos);
+
+        /* The middle bytes */
+        while(size >= 8) {
+            buf[idx] = (uint8_t)~(buf[idx]);
+            idx++;
+            size -= 8;
+        } /* end while */
+
+        /* The last partial byte */
+        if(size > 0) {
+            /* Similar to the first byte case, where sequence ends in the same byte as starts */
+            tmp[0] = (uint8_t)~buf[idx];
+            H5T__bit_copy(&(buf[idx]), (size_t)0, tmp, (size_t)0, size);
+        } /* end if */
+    } /* end if */
+    else  /* bit sequence ends in the same byte as starts */
+        H5T__bit_copy(&(buf[idx]), pos, tmp, pos, size);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5T__bit_neg() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tcommit.c b/gatb-core/thirdparty/hdf5/src/H5Tcommit.c
new file mode 100644
index 0000000..024cc83
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tcommit.c
@@ -0,0 +1,888 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for committing datatypes
+ *      to a file for the H5T interface.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_commit_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling			*/
+#include "H5FOprivate.h"	/* File objects				*/
+#include "H5Iprivate.h"		/* IDs					*/
+#include "H5Lprivate.h"		/* Links				*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static H5T_t *H5T_open_oid(const H5G_loc_t *loc, hid_t dxpl_id);
+
+
+/*********************/
+/* Public Variables */
+/*********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_commit_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_commit_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_commit_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_commit_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcommit2
+ *
+ * Purpose:	Save a transient datatype to a file and turn the type handle
+ *		into a "named", immutable type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id,
+    hid_t tcpl_id, hid_t tapl_id)
+{
+    H5G_loc_t	loc;                    /* Location to create datatype */
+    H5T_t	*type;                  /* Datatype for ID */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*siiii", loc_id, name, type_id, lcpl_id, tcpl_id, tapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == lcpl_id)
+        lcpl_id = H5P_LINK_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link creation property list")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == tcpl_id)
+        tcpl_id = H5P_DATATYPE_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(tcpl_id, H5P_DATATYPE_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype creation property list")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == tapl_id)
+        tapl_id = H5P_DATATYPE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(tapl_id, H5P_DATATYPE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype access property list")
+
+    /* Commit the type */
+    if(H5T__commit_named(&loc, name, type, lcpl_id, tcpl_id, tapl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcommit2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__commit_named
+ *
+ * Purpose:	Internal routine to save a transient datatype to a file and
+ *              turn the type ID into a "named", immutable type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              April 5, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__commit_named(const H5G_loc_t *loc, const char *name, H5T_t *dt,
+    hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id)
+{
+    H5O_obj_create_t ocrt_info;             /* Information for object creation */
+    H5T_obj_create_t tcrt_info;             /* Information for named datatype creation */
+    H5T_state_t old_state = H5T_STATE_TRANSIENT;        /* The state of the datatype before H5T__commit. */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(loc);
+    HDassert(name && *name);
+    HDassert(dt);
+    HDassert(lcpl_id != H5P_DEFAULT);
+    HDassert(tcpl_id != H5P_DEFAULT);
+    HDassert(tapl_id != H5P_DEFAULT);
+    HDassert(dxpl_id != H5P_DEFAULT);
+
+    /* Record the type's state so that we can revert to it if linking fails */
+    old_state = dt->shared->state;
+
+    /* Set up named datatype creation info */
+    tcrt_info.dt = dt;
+    tcrt_info.tcpl_id = tcpl_id;
+
+    /* Set up object creation information */
+    ocrt_info.obj_type = H5O_TYPE_NAMED_DATATYPE;
+    ocrt_info.crt_info = &tcrt_info;
+    ocrt_info.new_obj = NULL;
+
+    /* Create the new named datatype and link it to its parent group */
+    if(H5L_link_object(loc, name, &ocrt_info, lcpl_id, tapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create and link to named datatype")
+    HDassert(ocrt_info.new_obj);
+
+done:
+    /* If the datatype was committed but something failed after that, we need
+     * to return it to the state it was in before it was committed.
+     */
+    if(ret_value < 0 && (NULL != ocrt_info.new_obj)) {
+	if(dt->shared->state == H5T_STATE_OPEN && dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED) {
+            /* Remove the datatype from the list of opened objects in the file */
+            if(H5FO_top_decr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
+            if(H5FO_delete(dt->sh_loc.file, dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't remove dataset from list of open objects")
+
+            /* Close the datatype object */
+	    if(H5O_close(&(dt->oloc)) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release object header")
+
+            /* Remove the datatype's object header from the file */
+            if(H5O_delete(dt->sh_loc.file, dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to delete object header")
+
+            /* Mark datatype as being back in memory */
+            if(H5T_set_loc(dt, dt->sh_loc.file, H5T_LOC_MEMORY))
+                HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to return datatype to memory")
+	    dt->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
+            dt->shared->state = old_state;
+	} /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__commit_named() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcommit_anon
+ *
+ * Purpose:	Save a transient datatype to a file and turn the type handle
+ *		into a "named", immutable type.
+ *
+ *              The resulting ID should be linked into the file with
+ *              H5Olink or it will be deleted when closed.
+ *
+ * Note:	Datatype access property list is unused currently, but is
+ *		checked for sanity anyway.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Peter Cao
+ *              May 17, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id)
+{
+    H5G_loc_t	loc;                    /* Group location for location */
+    H5T_t	*type = NULL;           /* Datatype created */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "iiii", loc_id, type_id, tcpl_id, tapl_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == tcpl_id)
+        tcpl_id = H5P_DATATYPE_CREATE_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(tcpl_id, H5P_DATATYPE_CREATE))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype creation property list")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == tapl_id)
+        tapl_id = H5P_DATATYPE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(tapl_id, H5P_DATATYPE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype access property list")
+
+    /* Commit the type */
+    if(H5T__commit(loc.oloc->file, type, tcpl_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
+
+    /* Release the datatype's object header */
+    {
+        H5O_loc_t *oloc;         /* Object location for datatype */
+
+        /* Get the new committed datatype's object location */
+        if(NULL == (oloc = H5T_oloc(type)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get object location of committed datatype")
+
+        /* Decrement refcount on committed datatype's object header in memory */
+        if(H5O_dec_rc_by_loc(oloc, H5AC_dxpl_id) < 0)
+           HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcommit_anon() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__commit
+ *
+ * Purpose:	Commit a type, giving it a name and causing it to become
+ *		immutable.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, June  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id, hid_t dxpl_id)
+{
+    H5O_loc_t   temp_oloc;              /* Temporary object header location */
+    H5G_name_t  temp_path;              /* Temporary path */
+    hbool_t     loc_init = FALSE;       /* Have temp_oloc and temp_path been initialized? */
+    size_t      dtype_size;             /* Size of the datatype message */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(file);
+    HDassert(type);
+    HDassert(tcpl_id != H5P_DEFAULT);
+
+    /* Check if we are allowed to write to this file */
+    if(0 == (H5F_INTENT(file) & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+    /*
+     * Check arguments.  We cannot commit an immutable type because H5Tclose()
+     * normally fails on such types (try H5Tclose(H5T_NATIVE_INT)) but closing
+     * a named type should always succeed.
+     */
+    if(H5T_STATE_NAMED == type->shared->state || H5T_STATE_OPEN == type->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "datatype is already committed")
+    if(H5T_STATE_IMMUTABLE == type->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "datatype is immutable")
+
+    /* Check for a "sensible" datatype to store on disk */
+    if(H5T_is_sensible(type) <= 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "datatype is not sensible")
+
+    /* Mark datatype as being on disk now.  This step changes the size of
+     *  datatype as stored on disk.
+     */
+    if(H5T_set_loc(type, file, H5T_LOC_DISK) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype on disk")
+
+    /* Reset datatype location and path */
+    if(H5O_loc_reset(&temp_oloc) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize location")
+    if(H5G_name_reset(&temp_path) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize path")
+    loc_init = TRUE;
+
+    /* Set the latest format, if requested */
+    if(H5F_USE_LATEST_FORMAT(file))
+        if(H5T_set_latest_version(type) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of datatype")
+
+    /* Calculate message size infomation, for creating object header */
+    dtype_size = H5O_msg_size_f(file, tcpl_id, H5O_DTYPE_ID, type, (size_t)0);
+    HDassert(dtype_size);
+
+    /*
+     * Create the object header and open it for write access. Insert the data
+     * type message and then give the object header a name.
+     */
+    if(H5O_create(file, dxpl_id, dtype_size, (size_t)1, tcpl_id, &temp_oloc) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create datatype object header")
+    if(H5O_msg_create(&temp_oloc, H5O_DTYPE_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, type, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to update type header message")
+
+    /* Copy the new object header's location into the datatype, taking ownership of it */
+    if(H5O_loc_copy(&(type->oloc), &temp_oloc, H5_COPY_SHALLOW) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy datatype location")
+    if(H5G_name_copy(&(type->path), &temp_path, H5_COPY_SHALLOW) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy datatype location")
+    loc_init = FALSE;
+
+    /* Set the shared info fields */
+    H5T_update_shared(type);
+    type->shared->state = H5T_STATE_OPEN;
+    type->shared->fo_count = 1;
+
+    /* Add datatype to the list of open objects in the file */
+    if(H5FO_top_incr(type->sh_loc.file, type->sh_loc.u.loc.oh_addr) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, FAIL, "can't incr object ref. count")
+    if(H5FO_insert(type->sh_loc.file, type->sh_loc.u.loc.oh_addr, type->shared, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "can't insert datatype into list of open objects")
+
+    /* Mark datatype as being on memory again.  Since this datatype may still be
+     *  used in memory after committed to disk, change its size back as in memory.
+     */
+    if(H5T_set_loc(type, NULL, H5T_LOC_MEMORY) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype in memory")
+
+done:
+    if(ret_value < 0) {
+        if(loc_init) {
+            H5O_loc_free(&temp_oloc);
+            H5G_name_free(&temp_path);
+        } /* end if */
+        if((type->shared->state == H5T_STATE_TRANSIENT || type->shared->state == H5T_STATE_RDONLY) && (type->sh_loc.type == H5O_SHARE_TYPE_COMMITTED)) {
+            if(H5O_dec_rc_by_loc(&(type->oloc), dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
+	    if(H5O_close(&(type->oloc)) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release object header")
+            if(H5O_delete(file, dxpl_id, type->sh_loc.u.loc.oh_addr) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to delete object header")
+	    type->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
+	} /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5T__commit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcommitted
+ *
+ * Purpose:	Determines if a datatype is committed or not.
+ *
+ * Return:	Success:	TRUE if committed, FALSE otherwise.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, June  4, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Tcommitted(hid_t type_id)
+{
+    H5T_t	*type;          /* Datatype to query */
+    htri_t      ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", type_id);
+
+    /* Check arguments */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Set return value */
+    ret_value = H5T_committed(type);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcommitted() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_committed
+ *
+ * Purpose:	Determines if a datatype is committed or not.
+ *
+ * Return:	Success:	TRUE if committed, FALSE otherwise.
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, September 24, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_committed(const H5T_t *type)
+{
+    /* Use no-init for efficiency */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(type);
+
+    FUNC_LEAVE_NOAPI(H5T_STATE_OPEN == type->shared->state || H5T_STATE_NAMED == type->shared->state)
+} /* end H5T_committed() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_link
+ *
+ * Purpose:	Adjust the link count for an object header by adding
+ *		ADJUST to the link count.
+ *
+ * Return:	Success:	New link count
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, September 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_link(const H5T_t *type, int adjust, hid_t dxpl_id)
+{
+    int ret_value;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(type);
+    HDassert(type->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+
+    /* Adjust the link count on the named datatype */
+    if((ret_value = H5O_link(&type->oloc, adjust, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_LINKCOUNT, FAIL, "unable to adjust named datatype link count")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_link() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Topen2
+ *
+ * Purpose:	Opens a named datatype using a Datatype Access Property
+ *              List.
+ *
+ * Return:	Success:	Object ID of the named datatype.
+ *		Failure:	Negative
+ *
+ * Programmer:	James Laird
+ *              Thursday July 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id)
+{
+    H5T_t      *type = NULL;           /* Datatype opened in file */
+    H5G_loc_t	 loc;                   /* Group location of object to open */
+    H5G_name_t   path;            	/* Datatype group hier. path */
+    H5O_loc_t    oloc;            	/* Datatype object location */
+    H5O_type_t   obj_type;              /* Type of object at location */
+    H5G_loc_t    type_loc;              /* Group object for datatype */
+    hbool_t      obj_found = FALSE;     /* Object at 'name' found */
+    hid_t        dxpl_id = H5AC_ind_dxpl_id; /* dxpl to use to open datatype */
+    hid_t        ret_value = FAIL;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "i*si", loc_id, name, tapl_id);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Get correct property list */
+    if(H5P_DEFAULT == tapl_id)
+        tapl_id = H5P_DATATYPE_ACCESS_DEFAULT;
+    else
+        if(TRUE != H5P_isa_class(tapl_id, H5P_DATATYPE_ACCESS))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype access property list")
+
+    /* Set up datatype location to fill in */
+    type_loc.oloc = &oloc;
+    type_loc.path = &path;
+    H5G_loc_reset(&type_loc);
+
+    /*
+     * Find the named datatype object header and read the datatype message
+     * from it.
+     */
+    if(H5G_loc_find(&loc, name, &type_loc/*out*/, tapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "not found")
+    obj_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_NAMED_DATATYPE)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a named datatype")
+
+    /* Open it */
+    if(NULL == (type = H5T_open(&type_loc, dxpl_id)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open named datatype")
+
+    /* Register the type and return the ID */
+    if((ret_value = H5I_register(H5I_DATATYPE, type, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register named datatype")
+
+done:
+    if(ret_value < 0) {
+        if(type != NULL)
+            H5T_close(type);
+        else {
+            if(obj_found && H5F_addr_defined(type_loc.oloc->addr))
+                H5G_loc_free(&type_loc);
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Topen2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_create_plist
+ *
+ * Purpose:	Returns a copy of the datatype creation property list.
+ *
+ * Return:	Success:	ID for a copy of the datatype creation
+ *				property list.  The property list ID should be
+ *				released by calling H5Pclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, November 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tget_create_plist(hid_t dtype_id)
+{
+    H5T_t	        *type;          /* Datatype object for ID */
+    H5P_genplist_t      *tcpl_plist;    /* Existing datatype creation propertty list */
+    hid_t		new_tcpl_id = FAIL;     /* New datatype creation property list */
+    herr_t              status;         /* Generic status value */
+    hid_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", dtype_id);
+
+    /* Check arguments */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Copy the default datatype creation property list */
+    if(NULL == (tcpl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_DATATYPE_CREATE_ID_g)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get default creation property list")
+    if((new_tcpl_id = H5P_copy_plist(tcpl_plist, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to copy the creation property list")
+
+    /* Check if the datatype is committed */
+    if((status = H5T_committed(type)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't check whether datatype is committed")
+
+    /* Retrieve further information, if the datatype is committed */
+    if(status > 0) {
+        H5P_genplist_t  *new_plist;     /* New datatype creation property list */
+
+        /* Get property list object for new TCPL */
+        if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_tcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+        /* Retrieve any object creation properties */
+        if(H5O_get_create_plist(&type->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get object creation info")
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = new_tcpl_id;
+
+done:
+    if(ret_value < 0)
+        if(new_tcpl_id > 0)
+            if(H5I_dec_app_ref(new_tcpl_id) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL, "unable to close temporary object")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_create_plist() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_open
+ *
+ * Purpose:	Open a named datatype.
+ *
+ * Return:	Success:	Ptr to a new datatype.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, June  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T_open(const H5G_loc_t *loc, hid_t dxpl_id)
+{
+    H5T_shared_t   *shared_fo = NULL;
+    H5T_t          *dt = NULL;
+    H5T_t          *ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(loc);
+
+    /* Check if datatype was already open */
+    if(NULL == (shared_fo = (H5T_shared_t *)H5FO_opened(loc->oloc->file, loc->oloc->addr))) {
+        /* Clear any errors from H5FO_opened() */
+        H5E_clear_stack(NULL);
+
+        /* Open the datatype object */
+        if(NULL == (dt = H5T_open_oid(loc, dxpl_id)))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "not found")
+
+        /* Add the datatype to the list of opened objects in the file */
+        if(H5FO_insert(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr, dt->shared, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, NULL, "can't insert datatype into list of open objects")
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, NULL, "can't increment object count")
+
+        /* Mark any datatypes as being in memory now */
+        if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+        dt->shared->fo_count = 1;
+    } /* end if */
+    else {
+        if(NULL == (dt = H5FL_MALLOC(H5T_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate space for datatype")
+
+#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG)
+        /* Clear object location */
+        if(H5O_loc_reset(&(dt->oloc)) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to reset location")
+
+        /* Clear path name */
+        if(H5G_name_reset(&(dt->path)) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to reset path")
+#endif /* H5_USING_MEMCHECKER */
+
+        /* Shallow copy (take ownership) of the object location object */
+        if(H5O_loc_copy(&dt->oloc, loc->oloc, H5_COPY_SHALLOW) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy object location")
+
+        /* Shallow copy (take ownership) of the group hier. path */
+        if(H5G_name_copy(&(dt->path), loc->path, H5_COPY_SHALLOW) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy path")
+
+        /* Set the shared component info */
+        H5T_update_shared(dt);
+
+        /* Point to shared datatype info */
+        dt->shared = shared_fo;
+
+        /* Mark any datatypes as being in memory now */
+        if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+        /* Increment ref. count on shared info */
+        shared_fo->fo_count++;
+
+        /* Check if the object has been opened through the top file yet */
+        if(H5FO_top_count(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) == 0) {
+            /* Open the object through this top file */
+            if(H5O_open(&(dt->oloc)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to open object header")
+        } /* end if */
+
+        /* Increment object count for the object in the top file */
+        if(H5FO_top_incr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, NULL, "can't increment object count")
+    } /* end else */
+
+    ret_value = dt;
+
+done:
+    if(ret_value == NULL) {
+        if(dt) {
+            if(shared_fo == NULL)   /* Need to free shared fo */
+                dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
+
+            H5O_loc_free(&(dt->oloc));
+            H5G_name_free(&(dt->path));
+
+            dt = H5FL_FREE(H5T_t, dt);
+        } /* end if */
+
+        if(shared_fo)
+            shared_fo->fo_count--;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_open_oid
+ *
+ * Purpose:	Open a named datatype.
+ *
+ * Return:	Success:	Ptr to a new datatype.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, March 17, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t *
+H5T_open_oid(const H5G_loc_t *loc, hid_t dxpl_id)
+{
+    H5T_t *dt = NULL;          /* Datatype from the file */
+    H5T_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(loc);
+
+    /* Open named datatype object in file */
+    if(H5O_open(loc->oloc) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to open named datatype")
+
+    /* Deserialize the datatype message into a datatype in memory */
+    if(NULL == (dt = (H5T_t *)H5O_msg_read(loc->oloc, H5O_DTYPE_ID, NULL, dxpl_id)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to load type message from object header")
+
+    /* Mark the type as named and open */
+    dt->shared->state = H5T_STATE_OPEN;
+
+    /* Shallow copy (take ownership) of the object location object */
+    if(H5O_loc_copy(&dt->oloc, loc->oloc, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy object location")
+
+    /* Shallow copy (take ownership) of the group hier. path */
+    if(H5G_name_copy(&(dt->path), loc->path, H5_COPY_SHALLOW) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy path")
+
+    /* Set the shared component info */
+    H5T_update_shared(dt);
+
+    /* Set return value */
+    ret_value = dt;
+
+done:
+    if(ret_value == NULL)
+        if(dt == NULL)
+            H5O_close(loc->oloc);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_open_oid() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_update_shared
+ *
+ * Purpose:	Update the shared location information from the object location
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April 13, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_update_shared(H5T_t *dt)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(dt);
+
+    /* Set the shared location fields from the named datatype info */
+    H5O_UPDATE_SHARED(&(dt->sh_loc), H5O_SHARE_TYPE_COMMITTED, dt->oloc.file, H5O_DTYPE_ID, 0, dt->oloc.addr)
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5T_update_shared() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tcompound.c b/gatb-core/thirdparty/hdf5/src/H5Tcompound.c
new file mode 100644
index 0000000..b377b29
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tcompound.c
@@ -0,0 +1,671 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for compound datatypes
+ *      in the H5T interface.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_compound_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5MMprivate.h"	/*memory management			  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5T_pack(const H5T_t *dt);
+static htri_t H5T_is_packed(const H5T_t *dt);
+
+
+/*********************/
+/* Public Variables */
+/*********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_compound_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_compound_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init() currently).
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_compound_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_compound_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_member_offset
+ *
+ * Purpose:	Returns the byte offset of the beginning of a member with
+ *		respect to the beginning of the compound datatype datum.
+ *
+ * Return:	Success:	Byte offset.
+ *
+ *		Failure:	Zero. Zero is a valid offset, but this
+ *				function will fail only if a call to
+ *				H5Tget_member_dims() fails with the same
+ *				arguments.
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5Tget_member_offset(hid_t type_id, unsigned membno)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    size_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE2("z", "iIu", type_id, membno);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)) || H5T_COMPOUND != dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a compound datatype")
+    if(membno >= dt->shared->u.compnd.nmembs)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid member number")
+
+    /* Value */
+    ret_value = H5T_GET_MEMBER_OFFSET(dt->shared, membno);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_member_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_member_offset
+ *
+ * Purpose:	Private function for H5Tget_member_offset.  Returns the byte
+ *              offset of the beginning of a member with respect to the
+ *              beginning of the compound datatype datum.
+ *
+ * Return:	Success:	Byte offset.
+ *
+ *		Failure:	Zero. Zero is a valid offset, but this
+ *				function will fail only if a call to
+ *				H5Tget_member_dims() fails with the same
+ *				arguments.
+ *
+ * Programmer:	Raymond Lu
+ *		October 8, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5T_get_member_offset(const H5T_t *dt, unsigned membno)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(dt);
+    HDassert(membno < dt->shared->u.compnd.nmembs);
+
+    FUNC_LEAVE_NOAPI(dt->shared->u.compnd.memb[membno].offset)
+} /* end H5T_get_member_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_member_class
+ *
+ * Purpose:	Returns the datatype class of a member of a compound datatype.
+ *
+ * Return:	Success: Non-negative
+ *
+ *		Failure: H5T_NO_CLASS
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, November  9, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_class_t
+H5Tget_member_class(hid_t type_id, unsigned membno)
+{
+    H5T_t	*dt;            /* Datatype to query */
+    H5T_class_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(H5T_NO_CLASS)
+    H5TRACE2("Tt", "iIu", type_id, membno);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)) || H5T_COMPOUND != dt->shared->type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a compound datatype")
+    if(membno >= dt->shared->u.compnd.nmembs)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5T_NO_CLASS, "invalid member number")
+
+    /* Get the type's class.  We have to use this function to get type class
+     *  because of the concern of variable-length string.
+     */
+    ret_value = H5T_GET_CLASS(dt->shared->u.compnd.memb[membno].type->shared, FALSE);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_member_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_member_type
+ *
+ * Purpose:	Returns the datatype of the specified member.	The caller
+ *		should invoke H5Tclose() to release resources associated with
+ *		the type.
+ *
+ * Return:	Success:	An OID of a copy of the member datatype;
+ *				modifying the returned datatype does not
+ *				modify the member type.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tget_member_type(hid_t type_id, unsigned membno)
+{
+    H5T_t	*dt;                    /* Datatype to query */
+    H5T_t	*memb_dt = NULL;        /* Member datatype */
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "iIu", type_id, membno);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)) || H5T_COMPOUND != dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound datatype")
+    if(membno >= dt->shared->u.compnd.nmembs)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number")
+    if(NULL == (memb_dt = H5T_get_member_type(dt, membno, H5T_COPY_REOPEN)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to retrieve member type")
+    if((ret_value = H5I_register(H5I_DATATYPE, memb_dt, TRUE)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable register datatype atom")
+
+done:
+    if(ret_value < 0)
+        if(memb_dt && H5T_close(memb_dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "can't close datatype")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_member_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_member_type
+ *
+ * Purpose:	Private function for H5Tget_member_type.  Returns the data
+ *              type of the specified member.
+ *
+ * Return:	Success:	A copy of the member datatype;
+ *				modifying the returned datatype does not
+ *				modify the member type.
+ *
+ *		Failure:        NULL
+ *
+ * Programmer:	Raymond Lu
+ *	        October 8, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T_get_member_type(const H5T_t *dt, unsigned membno, H5T_copy_t method)
+{
+    H5T_t	*ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(dt);
+    HDassert(membno < dt->shared->u.compnd.nmembs);
+
+    /* Copy datatype into an atom */
+    if(NULL == (ret_value = H5T_copy(dt->shared->u.compnd.memb[membno].type, method)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy member datatype")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_member_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__get_member_size
+ *
+ * Purpose:	Returns the size of the specified member.
+ *
+ * Return:	Success:	The size in bytes of the member's datatype.
+ *		Failure:        0
+ *
+ * Programmer:	Quincey Koziol
+ *	        October 4, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5T__get_member_size(const H5T_t *dt, unsigned membno)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(dt);
+    HDassert(membno < dt->shared->u.compnd.nmembs);
+
+    FUNC_LEAVE_NOAPI(dt->shared->u.compnd.memb[membno].type->shared->size)
+} /* end H5T__get_member_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tinsert
+ *
+ * Purpose:	Adds another member to the compound datatype PARENT_ID.  The
+ *		new member has a NAME which must be unique within the
+ *		compound datatype. The OFFSET argument defines the start of
+ *		the member in an instance of the compound datatype, and
+ *		MEMBER_ID is the type of the new member.
+ *
+ * Return:	Success:	Non-negative, the PARENT_ID compound data
+ *				type is modified to include a copy of the
+ *				member type MEMBER_ID.
+ *
+ *		Failure:	Negative
+ *
+ * Errors:
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tinsert(hid_t parent_id, const char *name, size_t offset, hid_t member_id)
+{
+    H5T_t	*parent;		/* The compound parent datatype */
+    H5T_t	*member;		/* The member datatype	*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*szi", parent_id, name, offset, member_id);
+
+    /* Check args */
+    if(parent_id == member_id)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't insert compound datatype within itself")
+    if(NULL == (parent = (H5T_t *)H5I_object_verify(parent_id, H5I_DATATYPE)) || H5T_COMPOUND != parent->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound datatype")
+    if(H5T_STATE_TRANSIENT != parent->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "parent type read-only")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no member name")
+    if(NULL == (member = (H5T_t *)H5I_object_verify(member_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Insert */
+    if(H5T__insert(parent, name, offset, member) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "unable to insert member")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tinsert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tpack
+ *
+ * Purpose:	Recursively removes padding from within a compound datatype
+ *		to make it more efficient (space-wise) to store that data.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tpack(hid_t type_id)
+{
+    H5T_t	*dt;                    /* Datatype to modify */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)) || H5T_detect_class(dt, H5T_COMPOUND, TRUE) <= 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound datatype")
+
+    /* Pack */
+    if(H5T_pack(dt) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack compound datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tpack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__insert
+ *
+ * Purpose:	Adds a new MEMBER to the compound datatype PARENT.  The new
+ *		member will have a NAME that is unique within PARENT and an
+ *		instance of PARENT will have the member begin at byte offset
+ *		OFFSET from the beginning.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__insert(H5T_t *parent, const char *name, size_t offset, const H5T_t *member)
+{
+    unsigned	idx;                        /* Index of member to insert */
+    size_t	total_size;
+    unsigned	i;                          /* Local index variable */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(parent && H5T_COMPOUND == parent->shared->type);
+    HDassert(H5T_STATE_TRANSIENT == parent->shared->state);
+    HDassert(member);
+    HDassert(name && *name);
+
+    /* Does NAME already exist in PARENT? */
+    for(i = 0; i < parent->shared->u.compnd.nmembs; i++)
+	if(!HDstrcmp(parent->shared->u.compnd.memb[i].name, name))
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member name is not unique")
+
+    /* Does the new member overlap any existing member ? */
+    total_size = member->shared->size;
+    for(i = 0; i < parent->shared->u.compnd.nmembs; i++)
+        if((offset <= parent->shared->u.compnd.memb[i].offset &&
+                 (offset + total_size) > parent->shared->u.compnd.memb[i].offset) ||
+                (parent->shared->u.compnd.memb[i].offset <= offset &&
+                 (parent->shared->u.compnd.memb[i].offset +
+                 parent->shared->u.compnd.memb[i].size) > offset))
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member overlaps with another member")
+
+    /* Does the new member overlap the end of the compound type? */
+    if((offset + total_size) > parent->shared->size)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member extends past end of compound type")
+
+    /* Increase member array if necessary */
+    if(parent->shared->u.compnd.nmembs >= parent->shared->u.compnd.nalloc) {
+        unsigned na = MAX(1, parent->shared->u.compnd.nalloc * 2);
+        H5T_cmemb_t *x = (H5T_cmemb_t *)H5MM_realloc(parent->shared->u.compnd.memb, na * sizeof(H5T_cmemb_t));
+
+        if(!x)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        parent->shared->u.compnd.nalloc = na;
+        parent->shared->u.compnd.memb = x;
+    } /* end if */
+
+    /* Add member to end of member array */
+    idx = parent->shared->u.compnd.nmembs;
+    parent->shared->u.compnd.memb[idx].name = H5MM_xstrdup(name);
+    parent->shared->u.compnd.memb[idx].offset = offset;
+    parent->shared->u.compnd.memb[idx].size = total_size;
+    parent->shared->u.compnd.memb[idx].type = H5T_copy(member, H5T_COPY_ALL);
+
+    parent->shared->u.compnd.sorted = H5T_SORT_NONE;
+    parent->shared->u.compnd.nmembs++;
+    parent->shared->u.compnd.memb_size+=total_size;
+
+    /* It should not be possible to get this far if the type is already packed
+     * - the new member would overlap something */
+    HDassert(!(parent->shared->u.compnd.packed));
+
+    /* Determine if the compound datatype becomes packed */
+    H5T__update_packed(parent);
+
+    /* Set the "force conversion" flag if the field's datatype indicates */
+    if(member->shared->force_conv == TRUE)
+        parent->shared->force_conv = TRUE;
+
+    /* Check for member having a later version than the parent */
+    if(parent->shared->version < member->shared->version)
+        /* Upgrade parent datatype (and all other members also) */
+        /* (can't use a partial datatype and later versions of the format are
+         *  more efficient, so might as well upgrade all members also... -QAK)
+         */
+        if(H5T__upgrade_version(parent, member->shared->version) < 0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't upgrade member encoding version")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_pack
+ *
+ * Purpose:	Recursively packs a compound datatype by removing padding
+ *		bytes. This is done in place (that is, destructively).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_pack(const H5T_t *dt)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(dt);
+
+    if(H5T_detect_class(dt, H5T_COMPOUND, FALSE) > 0) {
+        /* If datatype has been packed, skip packing it and indicate success */
+        if(TRUE == H5T_is_packed(dt))
+            HGOTO_DONE(SUCCEED)
+
+        /* Check for packing unmodifiable datatype */
+        if(H5T_STATE_TRANSIENT != dt->shared->state)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "datatype is read-only")
+
+        if(dt->shared->parent) {
+            if (H5T_pack(dt->shared->parent) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack parent of datatype")
+
+            /* Adjust size of datatype appropriately */
+            if(dt->shared->type == H5T_ARRAY)
+                dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem;
+            else if(dt->shared->type != H5T_VLEN)
+                dt->shared->size = dt->shared->parent->shared->size;
+        } /* end if */
+        else if(dt->shared->type == H5T_COMPOUND) {
+            size_t	offset;                 /* Offset of member */
+            unsigned i;                     /* Local index variable */
+
+            /* Recursively pack the members */
+            for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                if(H5T_pack(dt->shared->u.compnd.memb[i].type) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack part of a compound datatype")
+
+                /* Update the member size */
+                dt->shared->u.compnd.memb[i].size = (dt->shared->u.compnd.memb[i].type)->shared->size;
+            } /* end for */
+
+            /* Remove padding between members */
+            if(H5T__sort_value(dt, NULL) < 0)
+		HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOMPARE, FAIL, "value sort failed")
+            for(i = 0, offset = 0; i < dt->shared->u.compnd.nmembs; i++) {
+                dt->shared->u.compnd.memb[i].offset = offset;
+                offset += dt->shared->u.compnd.memb[i].size;
+            }
+
+            /* Change total size */
+            dt->shared->size = MAX(1, offset);
+
+            /* Mark the type as packed now */
+            dt->shared->u.compnd.packed = TRUE;
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_pack() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_is_packed
+ *
+ * Purpose:	Checks whether a datatype which is compound (or has compound
+ *              components) is packed.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 11, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5T_is_packed(const H5T_t *dt)
+{
+    htri_t      ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(dt);
+
+    /* Go up the chain as far as possible */
+    while(dt->shared->parent)
+        dt = dt->shared->parent;
+
+    /* If this is a compound datatype, check if it is packed */
+    if(dt->shared->type == H5T_COMPOUND) {
+        ret_value = (htri_t)(dt->shared->u.compnd.packed);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_is_packed() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__update_packed
+ *
+ * Purpose:	Checks whether a datatype which is compound became packed
+ *              after recent changes.  This function does not assume that
+ *              the status of the "packed" field is correct, and sets
+ *              this field to the correct value.
+ *
+ * Return:	void
+ *
+ * Programmer:	Neil Fortner
+ *		Monday, October 19, 2009
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T__update_packed(const H5T_t *dt)
+{
+    unsigned    i;                      /* Index */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(dt);
+    HDassert(dt->shared->type == H5T_COMPOUND);
+
+    /* First check if all space is used in the "top level" type */
+    if(dt->shared->size == dt->shared->u.compnd.memb_size) {
+        /* Set the packed flag to TRUE */
+        dt->shared->u.compnd.packed = TRUE;
+
+        /* Now check if all members are packed */
+        for(i = 0; i < dt->shared->u.compnd.nmembs; i++)
+            if(!H5T_is_packed(dt->shared->u.compnd.memb[i].type)) {
+                dt->shared->u.compnd.packed = FALSE;
+                break;
+            } /* end if */
+    } /* end if */
+    else
+        dt->shared->u.compnd.packed = FALSE;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5T__update_packed() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tconv.c b/gatb-core/thirdparty/hdf5/src/H5Tconv.c
new file mode 100644
index 0000000..49bfeec
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tconv.c
@@ -0,0 +1,9865 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info:	Datatype conversions for the H5T interface.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	     */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_conv_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5HGprivate.h"	/* Global Heaps				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/*
+ * These macros are for the bodies of functions that convert buffers of one
+ * atomic type to another using hardware.
+ *
+ * They all start with `H5T_CONV_' and end with two letters that represent the
+ * source and destination types, respectively. The letters `s' and `S' refer to
+ * signed integers while the letters `u' and `U' refer to unsigned integers, and
+ * the letters `f' and `F' refer to floating-point values.
+ *
+ * The letter which is capitalized indicates that the corresponding type
+ * (source or destination) is at least as large as the other type.
+ *
+ * Certain conversions may experience overflow conditions which arise when the
+ * source value has a magnitude that cannot be represented by the destination
+ * type.
+ *
+ * Suffix	Description
+ * ------	-----------
+ * sS:		Signed integers to signed integers where the destination is
+ *		at least as wide as the source.	 This case cannot generate
+ *		overflows.
+ *
+ * sU:		Signed integers to unsigned integers where the destination is
+ *		at least as wide as the source.	 This case experiences
+ *		overflows when the source value is negative.
+ *
+ * uS:		Unsigned integers to signed integers where the destination is
+ *		at least as wide as the source.	 This case can experience
+ *		overflows when the source and destination are the same size.
+ *
+ * uU:		Unsigned integers to unsigned integers where the destination
+ *		is at least as wide as the source.  Overflows are not
+ *		possible in this case.
+ *
+ * Ss:		Signed integers to signed integers where the source is at
+ *		least as large as the destination.  Overflows can occur when
+ *		the destination is narrower than the source.
+ *
+ * Su:		Signed integers to unsigned integers where the source is at
+ *		least as large as the destination.  Overflows occur when the
+ *		source value is negative and can also occur if the
+ *		destination is narrower than the source.
+ *
+ * Us:		Unsigned integers to signed integers where the source is at
+ *		least as large as the destination.  Overflows can occur for
+ *		all sizes.
+ *
+ * Uu:		Unsigned integers to unsigned integers where the source is at
+ *		least as large as the destination. Overflows can occur if the
+ *		destination is narrower than the source.
+ *
+ * su:		Conversion from signed integers to unsigned integers where
+ *		the source and destination are the same size. Overflow occurs
+ *		when the source value is negative.
+ *
+ * us:		Conversion from unsigned integers to signed integers where
+ *		the source and destination are the same size.  Overflow
+ *		occurs when the source magnitude is too large for the
+ *		destination.
+ *
+ * fF:		Floating-point values to floating-point values where the
+ *              destination is at least as wide as the source.	 This case
+ *              cannot generate overflows.
+ *
+ * Ff:		Floating-point values to floating-point values the source is at
+ *		least as large as the destination.  Overflows can occur when
+ *		the destination is narrower than the source.
+ *
+ * xF:          Integers to float-point(float or double) values where the desination
+ *              is at least as wide as the source.  This case cannot generate
+ *              overflows.
+ *
+ * Fx:          Float-point(float or double) values to integer where the source is
+ *              at least as wide as the destination.  Overflow can occur
+ *              when the source magnitude is too large for the destination.
+ *
+ * The macros take a subset of these arguments in the order listed here:
+ *
+ * CDATA:	A pointer to the H5T_cdata_t structure that was passed to the
+ *		conversion function.
+ *
+ * STYPE:	The hid_t value for the source datatype.
+ *
+ * DTYPE:	The hid_t value for the destination datatype.
+ *
+ * BUF:		A pointer to the conversion buffer.
+ *
+ * NELMTS:	The number of values to be converted.
+ *
+ * ST:		The C name for source datatype (e.g., int)
+ *
+ * DT:		The C name for the destination datatype (e.g., signed char)
+ *
+ * D_MIN:	The minimum possible destination value.	 For unsigned
+ *		destination types this should be zero.	For signed
+ *		destination types it's a negative value with a magnitude that
+ *		is usually one greater than D_MAX.  Source values which are
+ *		smaller than D_MIN generate overflows.
+ *
+ * D_MAX:	The maximum possible destination value. Source values which
+ *		are larger than D_MAX generate overflows.
+ *
+ * The macros are implemented with a generic programming technique, similar
+ * to templates in C++.  The macro which defines the "core" part of the
+ * conversion (which actually moves the data from the source to the destination)
+ * is invoked inside the H5T_CONV "template" macro by "gluing" it together,
+ * which allows the core conversion macro to be invoked as necessary.
+ *
+ * "Core" macros come in two flavors: one which calls the exception handling
+ * routine and one which doesn't (the "_NOEX" variant).  The presence of the
+ * exception handling routine is detected before the loop over the values and
+ * the appropriate core routine loop is executed.
+ *
+ * The generic "core" macros are: (others are specific to particular conversion)
+ *
+ * Suffix	Description
+ * ------	-----------
+ * xX:		Generic Conversion where the destination is at least as
+ *              wide as the source.  This case cannot generate overflows.
+ *
+ * Xx:		Generic signed conversion where the source is at least as large
+ *              as the destination.  Overflows can occur when the destination is
+ *              narrower than the source.
+ *
+ * Ux:		Generic conversion for the `Us', `Uu' & `us' cases
+ *		Overflow occurs when the source magnitude is too large for the
+ *		destination.
+ *
+ */
+#define H5T_CONV_xX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    *(D) = (DT)(*(S));							      \
+}
+#define H5T_CONV_xX_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    *(D) = (DT)(*(S));							      \
+}
+
+/* Added a condition branch(else if (*(S) == (DT)(D_MAX))) which seems redundant.
+ * It handles a special situation when the source is "float" and assigned the value
+ * of "INT_MAX".  A compiler may do roundup making this value "INT_MAX+1".  However,
+ * when do comparison "if (*(S) > (DT)(D_MAX))", the compiler may consider them
+ * equal. In this case, do not return exception but make sure the maximum is assigned
+ * to the destination.   SLU - 2005/06/29
+ */
+#define H5T_CONV_Xx_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (*(S) > (ST)(D_MAX)) {                                                 \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else if (*(S) < (ST)(D_MIN)) {                                          \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MIN);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else 								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_Xx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (*(S) > (ST)(D_MAX)) {                                                 \
+        *(D) = (DT)(D_MAX);						      \
+    } else if (*(S) < (ST)(D_MIN)) {                                          \
+        *(D) = (DT)(D_MIN);						      \
+    } else 								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_Ux_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (*(S) > (ST)(D_MAX)) {                                                 \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_Ux_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (*(S) > (ST)(D_MAX)) {                                                 \
+        *(D) = (DT)(D_MAX);						      \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_sS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_sU_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (*(S) < 0) {                                                           \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = 0;						              \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_sU_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) < 0)                                                              \
+        *(D) = 0;						              \
+    else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_sU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_sU, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_uS_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(sizeof(ST) == sizeof(DT) && *(S) > (DT)(D_MAX)) {                      \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_uS_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (sizeof(ST)==sizeof(DT) && *(S) > (DT)(D_MAX)) {                       \
+        *(D) = (D_MAX);							      \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_uS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_uS, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_uU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_Ss(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)>=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_Xx, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_Su_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) < 0) {                                                            \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = 0;						              \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else if (sizeof(ST)>sizeof(DT) && *(S) > (ST)(D_MAX)) {                 \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_Su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) < 0)                                                              \
+        *(D) = 0;						              \
+    else if (sizeof(ST)>sizeof(DT) && *(S) > (ST)(D_MAX))                     \
+        *(D) = (DT)(D_MAX);						      \
+    else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_Su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)>=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_Su, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_Us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)>=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_Ux, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_Uu(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)>=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_Ux, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_su_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    /* Assumes memory format of unsigned & signed integers is same */	      \
+    if(*(S) < 0) {                                                            \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = 0;						              \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    /* Assumes memory format of unsigned & signed integers is same */	      \
+    if(*(S) < 0)                                                              \
+        *(D) = 0;						              \
+    else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)==sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_su, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_us_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    /* Assumes memory format of unsigned & signed integers is same */	      \
+    if (*(S) > (ST)(D_MAX)) {                                                 \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_us_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    /* Assumes memory format of unsigned & signed integers is same */	      \
+    if(*(S) > (ST)(D_MAX))                                                    \
+        *(D) = (DT)(D_MAX);						      \
+    else								      \
+        *(D) = (DT)(*(S));						      \
+}
+
+#define H5T_CONV_us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)==sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_us, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_CONV_fF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+/* Same as H5T_CONV_Xx_CORE, except that instead of using D_MAX and D_MIN
+ * when an overflow occurs, use the 'float' infinity values.
+ */
+#define H5T_CONV_Ff_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) > (ST)(D_MAX)) {                                                  \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (H5T_NATIVE_FLOAT_POS_INF_g);		              \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else if (*(S) < (ST)(D_MIN)) {                                          \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (H5T_NATIVE_FLOAT_NEG_INF_g);		              \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else								      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_Ff_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) > (ST)(D_MAX))                                                    \
+        *(D) = (H5T_NATIVE_FLOAT_POS_INF_g);		                      \
+    else if (*(S) < (ST)(D_MIN))                                              \
+        *(D) = (H5T_NATIVE_FLOAT_NEG_INF_g);		                      \
+    else								      \
+        *(D) = (DT)(*(S));					              \
+}
+
+#define H5T_CONV_Ff(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    HDcompile_assert(sizeof(ST)>=sizeof(DT));				      \
+    H5T_CONV(H5T_CONV_Ff, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
+}
+
+#define H5T_HI_LO_BIT_SET(TYP, V, LO, HI) {                                   \
+    unsigned count;                                                           \
+    unsigned char p;                                                          \
+    unsigned u;                                                               \
+                                                                              \
+    count = 0;                                                                \
+    for(u = 0; u < sizeof(TYP); u++) {                                        \
+        count = (((unsigned)sizeof(TYP) - 1) - u) * 8;                        \
+        p = (unsigned char)((V) >> count);                                    \
+        if(p > 0) {                                                           \
+            if(p & 0x80)                                                      \
+                count += 7;                                                   \
+            else if(p & 0x40)                                                 \
+                count += 6;                                                   \
+            else if(p & 0x20)                                                 \
+                count += 5;                                                   \
+            else if(p & 0x10)                                                 \
+                count += 4;                                                   \
+            else if(p & 0x08)                                                 \
+                count += 3;                                                   \
+            else if(p & 0x04)                                                 \
+                count += 2;                                                   \
+            else if(p & 0x02)                                                 \
+                count += 1;                                                   \
+            break;                                                            \
+        } /* end if */                                                        \
+    } /* end for */                                                           \
+                                                                              \
+    HI = count;                                                               \
+                                                                              \
+    count = 0;                                                                \
+    for(u = 0; u < sizeof(TYP); u++) {                                        \
+        p = (unsigned char)((V) >> (u * 8));                                  \
+        if(p > 0) {                                                           \
+            count = u * 8;                                                    \
+                                                                              \
+            if(p & 0x01)                                                      \
+                ;                                                             \
+            else if(p & 0x02)                                                 \
+                count += 1;                                                   \
+            else if(p & 0x04)                                                 \
+                count += 2;                                                   \
+            else if(p & 0x08)                                                 \
+                count += 3;                                                   \
+            else if(p & 0x10)                                                 \
+                count += 4;                                                   \
+            else if(p & 0x20)                                                 \
+                count += 5;                                                   \
+            else if(p & 0x40)                                                 \
+                count += 6;                                                   \
+            else if(p & 0x80)                                                 \
+                count += 7;                                                   \
+            break;                                                            \
+        } /* end if */                                                        \
+    } /* end for */                                                           \
+                                                                              \
+    LO = count;                                                               \
+}
+
+#define H5T_CONV_xF_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if (sprec > dprec) {						      \
+        unsigned low_bit_pos, high_bit_pos;                                   \
+                                                                              \
+        /* Detect high & low bits set in source */                            \
+        H5T_HI_LO_BIT_SET(ST, *(S), low_bit_pos, high_bit_pos)                \
+                                                                              \
+        /* Check for more bits of precision in src than available in dst */   \
+        if((high_bit_pos - low_bit_pos) >= dprec) {			      \
+            H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PRECISION,          \
+                    src_id, dst_id, S, D, cb_struct.user_data);               \
+            if(except_ret == H5T_CONV_UNHANDLED)                              \
+                /* Let compiler convert if case is ignored by user handler*/  \
+                *(D) = (DT)(*(S));					      \
+            else if(except_ret == H5T_CONV_ABORT)                             \
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+            /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+        }        							      \
+        else                                                                  \
+            *(D) = (DT)(*(S));						      \
+    }        								      \
+    else                                                                      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_xF_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    *(D) = (DT)(*(S));							      \
+}
+
+#define H5T_CONV_xF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    H5T_CONV(H5T_CONV_xF, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y)                 \
+}
+
+/* Quincey added the condition branch (else if (*(S) != (ST)((DT)(*(S))))).
+ * It handles a special situation when the source is "float" and assigned the value
+ * of "INT_MAX".  Compilers do roundup making this value "INT_MAX+1".  This branch
+ * is to check that situation and return exception for some compilers, mainly GCC.
+ * The branch if (*(S) > (DT)(D_MAX) || (sprec < dprec && *(S) ==
+ * (ST)(D_MAX))) is for some compilers like Sun, HP, IBM, and SGI where under
+ * the same situation the "int" doesn't overflow.  SLU - 2005/9/12
+ */
+#define H5T_CONV_Fx_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) > (ST)(D_MAX) || (sprec < dprec && *(S) == (ST)(D_MAX))) {        \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MAX);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else if (*(S) < (ST)(D_MIN)) {                                          \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(D_MIN);						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    } else if (*(S) != (ST)((DT)(*(S)))) {                                    \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE, \
+                src_id, dst_id, S, D, cb_struct.user_data);                   \
+        if(except_ret == H5T_CONV_UNHANDLED)                                  \
+            /* Let compiler convert if case is ignored by user handler*/      \
+            *(D) = (DT)(*(S));						      \
+        else if(except_ret == H5T_CONV_ABORT)                                 \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
+        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
+    }        								      \
+    else                                                                      \
+        *(D) = (DT)(*(S));						      \
+}
+#define H5T_CONV_Fx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+    if(*(S) > (ST)(D_MAX))                                                    \
+        *(D) = (DT)(D_MAX);						      \
+    else if(*(S) < (ST)(D_MIN))                                               \
+        *(D) = (DT)(D_MIN);						      \
+    else                                                                      \
+        *(D) = (DT)(*(S));					              \
+}
+
+#define H5T_CONV_Fx(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
+    H5T_CONV(H5T_CONV_Fx, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y)              \
+}
+
+/* Since all "no exception" cores do the same thing (assign the value in the
+ * source location to the destination location, using casting), use one "core"
+ * to do them all.
+ */
+#ifndef H5_WANT_DCONV_EXCEPTION
+#define H5T_CONV_NO_EXCEPT_CORE(S,D,ST,DT,D_MIN,D_MAX) {		      \
+    *(D) = (DT)(*(S));		        				      \
+}
+#endif /* H5_WANT_DCONV_EXCEPTION */
+
+
+/* The main part of every integer hardware conversion macro */
+#define H5T_CONV(GUTS,STYPE,DTYPE,ST,DT,D_MIN,D_MAX,PREC)  		      \
+{                                                                             \
+    herr_t      ret_value=SUCCEED;      /* Return value         */            \
+                                                                              \
+    FUNC_ENTER_PACKAGE                                                        \
+                                                                              \
+{                                                                             \
+    size_t	elmtno;			/*element number		*/    \
+    H5T_CONV_DECL_PREC(PREC)            /*declare precision variables, or not */ \
+    uint8_t     *src_buf;		/*'raw' source buffer		*/    \
+    uint8_t     *dst_buf;		/*'raw' destination buffer	*/    \
+    ST	*src, *s;			/*source buffer			*/    \
+    DT	*dst, *d;			/*destination buffer		*/    \
+    H5T_t	*st, *dt;		/*datatype descriptors		*/    \
+    ST	src_aligned;			/*source aligned type		*/    \
+    DT	dst_aligned;			/*destination aligned type	*/    \
+    hbool_t	s_mv, d_mv;		/*move data to align it?	*/    \
+    ssize_t	s_stride, d_stride;	/*src and dst strides		*/    \
+    size_t      safe;                   /*how many elements are safe to process in each pass */ \
+    H5P_genplist_t      *plist;         /*Property list pointer         */    \
+    H5T_conv_cb_t       cb_struct;      /*conversion callback structure */    \
+                                                                              \
+    switch (cdata->command) {						      \
+    case H5T_CONV_INIT:							      \
+	/* Sanity check and initialize statistics */			      \
+	cdata->need_bkg = H5T_BKG_NO;					      \
+        if (NULL==(st=(H5T_t*)H5I_object(src_id)) || NULL==(dt=(H5T_t*)H5I_object(dst_id)))   \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL,		      \
+                          "unable to dereference datatype object ID")	      \
+	if (st->shared->size!=sizeof(ST) || dt->shared->size!=sizeof(DT))     \
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL,		      \
+			  "disagreement about datatype size")		      \
+	CI_ALLOC_PRIV	                                                      \
+	break;								      \
+									      \
+    case H5T_CONV_FREE:							      \
+	/* Print and free statistics */					      \
+	CI_PRINT_STATS(STYPE,DTYPE);					      \
+	CI_FREE_PRIV	                                                      \
+	break;								      \
+									      \
+    case H5T_CONV_CONV:							      \
+	/* Initialize source & destination strides */			      \
+	if (buf_stride) {						      \
+            HDassert(buf_stride >= sizeof(ST));				      \
+            HDassert(buf_stride >= sizeof(DT));				      \
+	    s_stride = d_stride = (ssize_t)buf_stride;			      \
+	} else {							      \
+            s_stride = sizeof(ST);					      \
+            d_stride = sizeof(DT);					      \
+        }								      \
+									      \
+	/* Is alignment required for source or dest? */			      \
+	s_mv = H5T_NATIVE_##STYPE##_ALIGN_g>1 &&			      \
+               ((size_t)buf%H5T_NATIVE_##STYPE##_ALIGN_g ||		      \
+     /* Cray */ ((size_t)((ST*)buf)!=(size_t)buf) ||			      \
+		(size_t)s_stride%H5T_NATIVE_##STYPE##_ALIGN_g);			      \
+	d_mv = H5T_NATIVE_##DTYPE##_ALIGN_g>1 &&			      \
+               ((size_t)buf%H5T_NATIVE_##DTYPE##_ALIGN_g ||		      \
+     /* Cray */ ((size_t)((DT*)buf)!=(size_t)buf) ||			      \
+                (size_t)d_stride%H5T_NATIVE_##DTYPE##_ALIGN_g);			      \
+	CI_INC_SRC(s_mv)						      \
+	CI_INC_DST(d_mv)						      \
+	                                                                      \
+        /* Get the plist structure */                                         \
+        if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))    \
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID") \
+                                                                              \
+        /* Get conversion exception callback property */                      \
+        if(H5P_get(plist, H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)             \
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback") \
+                                                                              \
+        /* Get source and destination datatypes */			      \
+        if(NULL == (st = (H5T_t *)H5I_object(src_id)) || NULL == (dt = (H5T_t *)H5I_object(dst_id))) \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to dereference datatype object ID") \
+									      \
+        H5T_CONV_SET_PREC(PREC)            /*init precision variables, or not */ \
+                                                                              \
+        /* The outer loop of the type conversion macro, controlling which */  \
+        /* direction the buffer is walked */				      \
+        while (nelmts>0) {						      \
+            /* Check if we need to go backwards through the buffer */	      \
+            if(d_stride>s_stride) {					      \
+                /* Compute the number of "safe" destination elements at */    \
+                /* the end of the buffer (Those which don't overlap with */   \
+                /* any source elements at the beginning of the buffer) */     \
+                safe = nelmts - (((nelmts * (size_t)s_stride) + (size_t)(d_stride - 1)) / (size_t)d_stride);      \
+									      \
+                /* If we're down to the last few elements, just wrap up */    \
+                /* with a "real" reverse copy */			      \
+                if(safe<2) {						      \
+                    src = (ST *)(src_buf = (uint8_t *)buf + (nelmts - 1) * (size_t)s_stride); \
+                    dst = (DT *)(dst_buf = (uint8_t *)buf + (nelmts - 1) * (size_t)d_stride); \
+                    s_stride = -s_stride;				      \
+                    d_stride = -d_stride;				      \
+									      \
+                    safe=nelmts;					      \
+                } /* end if */						      \
+                else {							      \
+                    src = (ST *)(src_buf = (uint8_t *)buf + (nelmts - safe) * (size_t)s_stride); \
+                    dst = (DT *)(dst_buf = (uint8_t *)buf + (nelmts - safe) * (size_t)d_stride); \
+                } /* end else */					      \
+            } /* end if */						      \
+            else {							      \
+                /* Single forward pass over all data */			      \
+                src = (ST *)(src_buf = (uint8_t*)buf);			      \
+                dst = (DT *)(dst_buf = (uint8_t*)buf);			      \
+                safe=nelmts;						      \
+            } /* end else */						      \
+                                                                              \
+            /* Perform loop over elements to convert */			      \
+            if (s_mv && d_mv) {						      \
+                /* Alignment is required for both source and dest */	      \
+                s = &src_aligned;					      \
+                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,s,d,ST,DT,D_MIN,D_MAX) \
+            } else if(s_mv) {						      \
+                /* Alignment is required only for source */		      \
+                s = &src_aligned;					      \
+                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,s,dst,ST,DT,D_MIN,D_MAX) \
+            } else if(d_mv) {						      \
+                /* Alignment is required only for destination */	      \
+                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,src,d,ST,DT,D_MIN,D_MAX) \
+            } else {							      \
+                /* Alignment is not required for both source and destination */ \
+                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,src,dst,ST,DT,D_MIN,D_MAX) \
+            }	 	 	 	 	 	 	 	      \
+									      \
+            /* Decrement number of elements left to convert */		      \
+            nelmts-=safe;						      \
+        } /* end while */						      \
+        break;								      \
+									      \
+    default:								      \
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL,		      \
+		      "unknown conversion command");			      \
+    }									      \
+}                                                                             \
+									      \
+done:                                                                         \
+    FUNC_LEAVE_NOAPI(ret_value)                                               \
+}
+
+/* Declare the source & destination precision variables */
+#define H5T_CONV_DECL_PREC(PREC) H5_GLUE(H5T_CONV_DECL_PREC_, PREC)
+
+#define H5T_CONV_DECL_PREC_Y                                                  \
+    size_t	sprec;			/*source precision		*/    \
+    size_t	dprec;			/*destination precision		*/    \
+    H5T_class_t tclass;                 /*datatype's class		*/
+
+#define H5T_CONV_DECL_PREC_N            /*no precision variables        */
+
+/* Initialize the source & destination precision variables */
+#define H5T_CONV_SET_PREC(PREC) H5_GLUE(H5T_CONV_SET_PREC_, PREC)
+
+#define H5T_CONV_SET_PREC_Y                                                   \
+        /* Get source & destination precisions into a variable */	      \
+        tclass = st->shared->type;					      \
+        HDassert(tclass == H5T_INTEGER || tclass == H5T_FLOAT);		      \
+        if(tclass == H5T_INTEGER)					      \
+            sprec = st->shared->u.atomic.prec;				      \
+        else								      \
+            sprec = 1 + st->shared->u.atomic.u.f.msize;			      \
+        tclass = dt->shared->type;					      \
+        HDassert(tclass == H5T_INTEGER || tclass == H5T_FLOAT);		      \
+        if(tclass == H5T_INTEGER)					      \
+            dprec = dt->shared->u.atomic.prec;				      \
+        else								      \
+            dprec = 1 + dt->shared->u.atomic.u.f.msize;
+
+#define H5T_CONV_SET_PREC_N             /*don't init precision variables */
+
+/* Macro defining action on source data which needs to be aligned (before main action) */
+#define H5T_CONV_LOOP_PRE_SALIGN(ST) {					      \
+    HDmemcpy(&src_aligned, src, sizeof(ST));				      \
+}
+
+/* Macro defining action on source data which doesn't need to be aligned (before main action) */
+#define H5T_CONV_LOOP_PRE_SNOALIGN(ST) {				      \
+}
+
+/* Macro defining action on destination data which needs to be aligned (before main action) */
+#define H5T_CONV_LOOP_PRE_DALIGN(DT) {					      \
+    d = &dst_aligned;							      \
+}
+
+/* Macro defining action on destination data which doesn't need to be aligned (before main action) */
+#define H5T_CONV_LOOP_PRE_DNOALIGN(DT) {				      \
+}
+
+/* Macro defining action on source data which needs to be aligned (after main action) */
+#define H5T_CONV_LOOP_POST_SALIGN(ST) {					      \
+}
+
+/* Macro defining action on source data which doesn't need to be aligned (after main action) */
+#define H5T_CONV_LOOP_POST_SNOALIGN(ST) {				      \
+}
+
+/* Macro defining action on destination data which needs to be aligned (after main action) */
+#define H5T_CONV_LOOP_POST_DALIGN(DT) {					      \
+    HDmemcpy(dst, &dst_aligned, sizeof(DT));				      \
+}
+
+/* Macro defining action on destination data which doesn't need to be aligned (after main action) */
+#define H5T_CONV_LOOP_POST_DNOALIGN(DT) {				      \
+}
+
+/* The outer wrapper for the type conversion loop, to check for an exception handling routine */
+#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+    if(cb_struct.func) {			                              \
+        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+    }                                                                         \
+    else {                                                                    \
+        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,H5_GLUE(GUTS,_NOEX),S,D,ST,DT,D_MIN,D_MAX) \
+    }
+
+/* The inner loop of the type conversion macro, actually converting the elements */
+#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+    for (elmtno=0; elmtno<safe; elmtno++) {				      \
+        /* Handle source pre-alignment */				      \
+        H5_GLUE(H5T_CONV_LOOP_,PRE_SALIGN_GUTS)(ST)			      \
+                                                                              \
+        /* Handle destination pre-alignment */				      \
+        H5_GLUE(H5T_CONV_LOOP_,PRE_DALIGN_GUTS)(DT)			      \
+                                                                              \
+        /* ... user-defined stuff here -- the conversion ... */		      \
+        H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
+                                                                              \
+        /* Handle source post-alignment */				      \
+        H5_GLUE(H5T_CONV_LOOP_,POST_SALIGN_GUTS)(ST)			      \
+                                                                              \
+        /* Handle destination post-alignment */				      \
+        H5_GLUE(H5T_CONV_LOOP_,POST_DALIGN_GUTS)(DT)			      \
+                                                                              \
+        /* Advance pointers */						      \
+        src_buf += s_stride;						      \
+        src = (ST *)src_buf;						      \
+        dst_buf += d_stride;						      \
+        dst = (DT *)dst_buf;						      \
+    }
+
+/* Macro to call the actual "guts" of the type conversion, or call the "no exception" guts */
+#ifdef H5_WANT_DCONV_EXCEPTION
+#define H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
+        /* ... user-defined stuff here -- the conversion ... */		      \
+        H5_GLUE(GUTS,_CORE)(S,D,ST,DT,D_MIN,D_MAX)
+#else /* H5_WANT_DCONV_EXCEPTION */
+#define H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
+        H5_GLUE(H5T_CONV_NO_EXCEPT,_CORE)(S,D,ST,DT,D_MIN,D_MAX)
+#endif /* H5_WANT_DCONV_EXCEPTION */
+
+
+#ifdef H5T_DEBUG
+
+/* Print alignment statistics */
+#   define CI_PRINT_STATS(STYPE,DTYPE) {				      \
+    if (H5DEBUG(T) && ((H5T_conv_hw_t *)cdata->priv)->s_aligned) {	      \
+	HDfprintf(H5DEBUG(T),						      \
+		  "      %Hu src elements aligned on %lu-byte boundaries\n",  \
+		  ((H5T_conv_hw_t *)cdata->priv)->s_aligned,		      \
+		  (unsigned long)H5T_NATIVE_##STYPE##_ALIGN_g);		      \
+    }									      \
+    if (H5DEBUG(T) && ((H5T_conv_hw_t *)cdata->priv)->d_aligned) {	      \
+	HDfprintf(H5DEBUG(T),						      \
+		  "      %Hu dst elements aligned on %lu-byte boundaries\n",  \
+		  ((H5T_conv_hw_t *)cdata->priv)->d_aligned,		      \
+		  (unsigned long)H5T_NATIVE_##DTYPE##_ALIGN_g);		      \
+    }									      \
+}
+
+/* Allocate private alignment structure for atomic types */
+#   define CI_ALLOC_PRIV \
+	if (NULL==(cdata->priv=H5MM_calloc(sizeof(H5T_conv_hw_t)))) {	      \
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,		      \
+			  "memory allocation failed");			      \
+	}
+
+/* Free private alignment structure for atomic types */
+#   define CI_FREE_PRIV                                 \
+    if(cdata->priv!=NULL)                               \
+        cdata->priv = H5MM_xfree(cdata->priv);
+
+/* Increment source alignment counter */
+#   define CI_INC_SRC(s)   if (s) ((H5T_conv_hw_t *)cdata->priv)->s_aligned += nelmts;
+
+/* Increment destination alignment counter */
+#   define CI_INC_DST(d)   if (d) ((H5T_conv_hw_t *)cdata->priv)->d_aligned += nelmts;
+#else /* H5T_DEBUG */
+#   define CI_PRINT_STATS(STYPE,DTYPE) /*void*/
+#   define CI_ALLOC_PRIV cdata->priv=NULL;
+#   define CI_FREE_PRIV  /* void */
+#   define CI_INC_SRC(s) /* void */
+#   define CI_INC_DST(d) /* void */
+#endif /* H5T_DEBUG */
+
+/* Swap two elements (I & J) of an array using a temporary variable */
+#define H5_SWAP_BYTES(ARRAY,I,J) {uint8_t _tmp; _tmp=ARRAY[I]; ARRAY[I]=ARRAY[J]; ARRAY[J]=_tmp;}
+
+/* Minimum size of variable-length conversion buffer */
+#define H5T_VLEN_MIN_CONF_BUF_SIZE      4096
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Conversion data for H5T__conv_struct() */
+typedef struct H5T_conv_struct_t {
+    int	*src2dst;		/*mapping from src to dst member num */
+    hid_t	*src_memb_id;		/*source member type ID's	     */
+    hid_t	*dst_memb_id;		/*destination member type ID's	     */
+    H5T_path_t	**memb_path;		/*conversion path for each member    */
+    H5T_subset_info_t   subset_info;    /*info related to compound subsets   */
+    unsigned            src_nmembs;     /*needed by free function            */
+} H5T_conv_struct_t;
+
+/* Conversion data for H5T__conv_enum() */
+typedef struct H5T_enum_struct_t {
+    int	base;			/*lowest `in' value		     */
+    unsigned length;		/*num elements in arrays	     */
+    int	*src2dst;		/*map from src to dst index	     */
+} H5T_enum_struct_t;
+
+/* Conversion data for the hardware conversion functions */
+typedef struct H5T_conv_hw_t {
+    size_t	s_aligned;		/*number source elements aligned     */
+    size_t	d_aligned;		/*number destination elements aligned*/
+} H5T_conv_hw_t;
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5T_reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order);
+
+

+/*********************/
+/* Public Variables */
+/*********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage pieces of vlen data */
+H5FL_BLK_DEFINE_STATIC(vlen_seq);
+
+/* Declare a free list to manage pieces of array data */
+H5FL_BLK_DEFINE_STATIC(array_seq);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_conv_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_conv_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init() currently).
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_conv_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_conv_interface() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_noop
+ *
+ * Purpose:	The no-op conversion.  The library knows about this
+ *		conversion without it being registered.
+ *
+ * Return: 	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January 14, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_noop(hid_t H5_ATTR_UNUSED src_id, hid_t H5_ATTR_UNUSED dst_id, H5T_cdata_t *cdata,
+	      size_t H5_ATTR_UNUSED nelmts, size_t H5_ATTR_UNUSED buf_stride,
+              size_t H5_ATTR_UNUSED bkg_stride, void H5_ATTR_UNUSED *buf,
+	      void H5_ATTR_UNUSED *background, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_CONV:
+            /* Nothing to convert */
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_noop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_order_opt
+ *
+ * Purpose:	Convert one type to another when byte order is the only
+ *		difference. This is the optimized version of H5T__conv_order()
+ *              for a handful of different sizes.
+ *
+ * Note:	This is a soft conversion function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January 25, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_order_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                   size_t nelmts, size_t buf_stride,
+                   size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
+                   void H5_ATTR_UNUSED *background, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    uint8_t	*buf = (uint8_t*)_buf;
+    H5T_t	*src = NULL;
+    H5T_t	*dst = NULL;
+    size_t      i;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /* Capability query */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(src->shared->size != dst->shared->size ||
+                    0 != src->shared->u.atomic.offset ||
+                    0 != dst->shared->u.atomic.offset)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            if((src->shared->type == H5T_REFERENCE && dst->shared->type != H5T_REFERENCE) ||
+                    (dst->shared->type == H5T_REFERENCE && src->shared->type != H5T_REFERENCE))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            if(src->shared->type != H5T_REFERENCE &&
+                    !((H5T_ORDER_BE == src->shared->u.atomic.order && H5T_ORDER_LE == dst->shared->u.atomic.order) ||
+                      (H5T_ORDER_LE == src->shared->u.atomic.order && H5T_ORDER_BE == dst->shared->u.atomic.order)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            if(src->shared->size != 1 && src->shared->size != 2 && src->shared->size != 4 &&
+                    src->shared->size != 8 && src->shared->size != 16)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            switch(src->shared->type) {
+                case H5T_INTEGER:
+                case H5T_BITFIELD:
+                case H5T_REFERENCE:
+                    /* nothing to check */
+                    break;
+
+                case H5T_FLOAT:
+                    if(src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
+                            src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
+                            src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
+                            src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
+                            src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
+                            src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
+                            src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
+                            src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+                    break;
+
+                case H5T_NO_CLASS:
+                case H5T_TIME:
+                case H5T_STRING:
+                case H5T_OPAQUE:
+                case H5T_COMPOUND:
+                case H5T_ENUM:
+                case H5T_VLEN:
+                case H5T_ARRAY:
+                case H5T_NCLASSES:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            }
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_CONV:
+            /* The conversion */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /* Check for "no op" reference conversion */
+            if(src->shared->type == H5T_REFERENCE) {
+                /* Sanity check */
+                if(dst->shared->type != H5T_REFERENCE)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_REFERENCE datatype")
+
+                /* Check if we are on a little-endian machine (the order that
+                 * the addresses in the file must be) and just get out now, there
+                 * is no need to convert the object reference.  Yes, this is
+                 * icky and non-portable, but I can't think of a better way to
+                 * support allowing the objno in the H5O_info_t struct and the
+                 * hobj_ref_t type to be compared directly without introducing a
+                 * "native" hobj_ref_t datatype and I think that would break a
+                 * lot of existing programs.  -QAK
+                 */
+                if(H5T_native_order_g == H5T_ORDER_LE)
+                    break;
+            } /* end if */
+
+            buf_stride = buf_stride ? buf_stride : src->shared->size;
+            switch(src->shared->size) {
+                case 1:
+                    /*no-op*/
+                    break;
+
+                case 2:
+                    for(/*void*/; nelmts >= 20; nelmts -= 20) {
+                        H5_SWAP_BYTES(buf, 0,   1); /*  0 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  1 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  2 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  3 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  4 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  5 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  6 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  7 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  8 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /*  9 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 10 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 11 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 12 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 13 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 14 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 15 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 16 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 17 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 18 */
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf, 0,   1); /* 19 */
+                        buf += buf_stride;
+                    } /* end for */
+                    for(i = 0; i < nelmts; i++, buf += buf_stride)
+                        H5_SWAP_BYTES(buf, 0, 1);
+                    break;
+
+                case 4:
+                    for(/*void*/; nelmts >= 20; nelmts -= 20) {
+                        H5_SWAP_BYTES(buf,  0,  3); /*  0 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  1 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  2 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  3 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  4 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  5 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  6 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  7 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  8 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /*  9 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 10 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 11 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 12 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 13 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 14 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 15 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 16 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 17 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 18 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  3); /* 19 */
+                        H5_SWAP_BYTES(buf,  1,  2);
+                        buf += buf_stride;
+                    } /* end for */
+                    for(i = 0; i < nelmts; i++, buf += buf_stride) {
+                        H5_SWAP_BYTES(buf, 0, 3);
+                        H5_SWAP_BYTES(buf, 1, 2);
+                    } /* end for */
+                    break;
+
+                case 8:
+                    for(/*void*/; nelmts >= 10; nelmts -= 10) {
+                        H5_SWAP_BYTES(buf,  0,  7); /*  0 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  1 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  2 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  3 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  4 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  5 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  6 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  7 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  8 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,  0,  7); /*  9 */
+                        H5_SWAP_BYTES(buf,  1,  6);
+                        H5_SWAP_BYTES(buf,  2,  5);
+                        H5_SWAP_BYTES(buf,  3,  4);
+                        buf += buf_stride;
+                    } /* end for */
+                    for(i = 0; i < nelmts; i++, buf += buf_stride) {
+                        H5_SWAP_BYTES(buf, 0, 7);
+                        H5_SWAP_BYTES(buf, 1, 6);
+                        H5_SWAP_BYTES(buf, 2, 5);
+                        H5_SWAP_BYTES(buf, 3, 4);
+                    } /* end for */
+                    break;
+
+                case 16:
+                    for(/*void*/; nelmts >= 10; nelmts -= 10) {
+                        H5_SWAP_BYTES(buf,   0,  15); /*  0 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  1 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  2 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  3 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  4 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  5 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  6 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  7 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  8 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                        H5_SWAP_BYTES(buf,   0,  15); /*  9 */
+                        H5_SWAP_BYTES(buf,   1,  14);
+                        H5_SWAP_BYTES(buf,   2,  13);
+                        H5_SWAP_BYTES(buf,   3,  12);
+                        H5_SWAP_BYTES(buf,   4,  11);
+                        H5_SWAP_BYTES(buf,   5,  10);
+                        H5_SWAP_BYTES(buf,   6,   9);
+                        H5_SWAP_BYTES(buf,   7,   8);
+                        buf += buf_stride;
+                    } /* end for */
+                    for(i = 0; i < nelmts; i++, buf += buf_stride) {
+                        H5_SWAP_BYTES(buf, 0, 15);
+                        H5_SWAP_BYTES(buf, 1, 14);
+                        H5_SWAP_BYTES(buf, 2, 13);
+                        H5_SWAP_BYTES(buf, 3, 12);
+                        H5_SWAP_BYTES(buf, 4, 11);
+                        H5_SWAP_BYTES(buf, 5, 10);
+                        H5_SWAP_BYTES(buf, 6,  9);
+                        H5_SWAP_BYTES(buf, 7,  8);
+                    } /* end for */
+                    break;
+
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "invalid conversion size")
+            } /* end switch */
+            break;
+
+        case H5T_CONV_FREE:
+            /* Free private data */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_order_opt() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_order
+ *
+ * Purpose:	Convert one type to another when byte order is the only
+ *		difference.
+ *
+ * Note:	This is a soft conversion function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January 13, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-06-16
+ *		Added the `stride' argument. If its value is non-zero then we
+ *		stride through memory converting one value at each location;
+ *		otherwise we assume that the values should be packed.
+ *
+ * 		Robb Matzke, 1999-06-16
+ *		Added support for bitfields.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_order(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	       size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
+               void H5_ATTR_UNUSED *background, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    uint8_t	*buf = (uint8_t*)_buf;
+    H5T_t	*src = NULL;
+    H5T_t	*dst = NULL;
+    size_t	i;
+    size_t	j, md;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /* Capability query */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) ||
+                    NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(src->shared->size != dst->shared->size || 0 != src->shared->u.atomic.offset ||
+                    0 != dst->shared->u.atomic.offset ||
+                    !((H5T_ORDER_BE == src->shared->u.atomic.order &&
+                       H5T_ORDER_LE == dst->shared->u.atomic.order) ||
+                      (H5T_ORDER_LE == src->shared->u.atomic.order &&
+                       H5T_ORDER_BE == dst->shared->u.atomic.order)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            switch(src->shared->type) {
+                case H5T_INTEGER:
+                case H5T_BITFIELD:
+                    /* nothing to check */
+                    break;
+
+                case H5T_FLOAT:
+                    if(src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
+                            src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
+                            src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
+                            src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
+                            src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
+                            src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
+                            src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
+                            src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad) {
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+                    } /* end if */
+                    break;
+
+                case H5T_NO_CLASS:
+                case H5T_TIME:
+                case H5T_STRING:
+                case H5T_OPAQUE:
+                case H5T_COMPOUND:
+                case H5T_REFERENCE:
+                case H5T_ENUM:
+                case H5T_VLEN:
+                case H5T_ARRAY:
+                case H5T_NCLASSES:
+                default:
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
+            } /* end switch */
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_CONV:
+            /* The conversion */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            buf_stride = buf_stride ? buf_stride : src->shared->size;
+            md = src->shared->size / 2;
+            for(i = 0; i < nelmts; i++, buf += buf_stride)
+                for(j = 0; j < md; j++)
+                    H5_SWAP_BYTES(buf, j, src->shared->size - (j + 1));
+            break;
+
+        case H5T_CONV_FREE:
+            /* Free private data */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_b_b
+ *
+ * Purpose:	Convert from one bitfield to any other bitfield.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, May 20, 1999
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_b_b(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	     size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
+             void H5_ATTR_UNUSED *background, hid_t dxpl_id)
+{
+    uint8_t	*buf = (uint8_t*)_buf;
+    H5T_t	*src = NULL, *dst = NULL;	/*source and dest datatypes	*/
+    ssize_t	direction;		/*direction of traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	olap;			/*num overlapping elements	*/
+    size_t	half_size;		/*1/2 of total size for swapping*/
+    uint8_t	*s, *sp, *d, *dp;	/*source and dest traversal ptrs*/
+    uint8_t	dbuf[256];		/*temp destination buffer	*/
+    size_t	msb_pad_offset;		/*offset for dest MSB padding	*/
+    size_t	i;
+    uint8_t     *src_rev=NULL;          /*order-reversed source buffer  */
+    H5P_genplist_t      *plist;         /*property list pointer         */
+    H5T_conv_cb_t       cb_struct = {NULL, NULL};      /*conversion callback structure */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    hbool_t             reverse;        /*if reverse the order of destination        */
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /* Capability query */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) ||
+                    NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_ORDER_LE != src->shared->u.atomic.order &&
+                    H5T_ORDER_BE != src->shared->u.atomic.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(H5T_ORDER_LE != dst->shared->u.atomic.order &&
+                    H5T_ORDER_BE != dst->shared->u.atomic.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if(src->shared->size == dst->shared->size || buf_stride) {
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = nelmts;
+            } else if(src->shared->size >= dst->shared->size) {
+                double olap_d = HDceil((double)(dst->shared->size) /
+                                       (double)(src->shared->size - dst->shared->size));
+
+                olap = (size_t)olap_d;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olap_d = HDceil((double)(src->shared->size) /
+                                       (double)(dst->shared->size - src->shared->size));
+                olap = (size_t)olap_d;
+                sp = (uint8_t*)buf + (nelmts-1) * src->shared->size;
+                dp = (uint8_t*)buf + (nelmts-1) * dst->shared->size;
+                direction = -1;
+            }
+
+            /* Get the plist structure */
+            if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist, H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            /* Allocate space for order-reversed source buffer */
+            src_rev = (uint8_t *)H5MM_calloc(src->shared->size);
+
+            /* The conversion loop */
+            H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if(direction > 0) {
+                    s = sp;
+                    d = elmtno < olap ? dbuf : dp;
+                } /* end if */
+                else {
+                    s = sp;
+                    d = (elmtno + olap) >= nelmts ? dbuf : dp;
+                } /* end else */
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if(d == dbuf)
+                    HDassert((dp >= sp && dp < sp + src->shared->size) ||
+                            (sp >= dp && sp < dp + dst->shared->size));
+                else
+                    HDassert((dp < sp && dp + dst->shared->size<=sp) ||
+                            (sp < dp && sp + src->shared->size<=dp));
+#endif
+
+                /*
+                 * Put the data in little endian order so our loops aren't so
+                 * complicated.  We'll do all the conversion stuff assuming
+                 * little endian and then we'll fix the order at the end.
+                 */
+                if(H5T_ORDER_BE == src->shared->u.atomic.order) {
+                    half_size = src->shared->size / 2;
+                    for(i = 0; i < half_size; i++) {
+                        uint8_t tmp = s[src->shared->size - (i + 1)];
+                        s[src->shared->size - (i + 1)] = s[i];
+                        s[i] = tmp;
+                    } /* end for */
+                } /* end if */
+
+                /* Initiate these variables */
+                except_ret = H5T_CONV_UNHANDLED;
+                reverse    = TRUE;
+
+                /*
+                 * Copy the significant part of the value. If the source is larger
+                 * than the destination then invoke the overflow function or copy
+                 * as many bits as possible. Zero extra bits in the destination.
+                 */
+                if(src->shared->u.atomic.prec > dst->shared->u.atomic.prec) {
+                    /*overflow*/
+                    if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                        H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                src_rev, d, cb_struct.user_data);
+                    } /* end if */
+
+                    if(except_ret == H5T_CONV_UNHANDLED) {
+                        H5T__bit_copy(d, dst->shared->u.atomic.offset,
+                                     s, src->shared->u.atomic.offset, dst->shared->u.atomic.prec);
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    else if(except_ret == H5T_CONV_HANDLED)
+                        /*Don't reverse because user handles it*/
+                        reverse = FALSE;
+                } else {
+                    H5T__bit_copy(d, dst->shared->u.atomic.offset,
+                                 s, src->shared->u.atomic.offset,
+                                 src->shared->u.atomic.prec);
+                    H5T__bit_set(d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
+                                dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
+                }
+
+                /*
+                 * Fill the destination padding areas.
+                 */
+                switch(dst->shared->u.atomic.lsb_pad) {
+                    case H5T_PAD_ZERO:
+                        H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, FALSE);
+                        break;
+
+                    case H5T_PAD_ONE:
+                        H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, TRUE);
+                        break;
+
+                    case H5T_PAD_ERROR:
+                    case H5T_PAD_BACKGROUND:
+                    case H5T_NPAD:
+                    default:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported LSB padding")
+                } /* end switch */
+                msb_pad_offset = dst->shared->u.atomic.offset + dst->shared->u.atomic.prec;
+                switch(dst->shared->u.atomic.msb_pad) {
+                    case H5T_PAD_ZERO:
+                        H5T__bit_set(d, msb_pad_offset, 8 * dst->shared->size - msb_pad_offset, FALSE);
+                        break;
+
+                    case H5T_PAD_ONE:
+                        H5T__bit_set(d, msb_pad_offset, 8 * dst->shared->size - msb_pad_offset, TRUE);
+                        break;
+
+                    case H5T_PAD_ERROR:
+                    case H5T_PAD_BACKGROUND:
+                    case H5T_NPAD:
+                    default:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported MSB padding")
+                } /* end switch */
+
+                /*
+                 * Put the destination in the correct byte order.  See note at
+                 * beginning of loop.
+                 */
+                if(H5T_ORDER_BE == dst->shared->u.atomic.order && reverse) {
+                    half_size = dst->shared->size / 2;
+                    for(i = 0; i < half_size; i++) {
+                        uint8_t tmp = d[dst->shared->size - (i + 1)];
+                        d[dst->shared->size - (i + 1)] = d[i];
+                        d[i] = tmp;
+                    } /* end for */
+                } /* end if */
+
+                /*
+                 * If we had used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+                if(d == dbuf)
+                    HDmemcpy(dp, d, dst->shared->size);
+                if(buf_stride) {
+                    sp += direction * (ssize_t)buf_stride; /* Note that cast is checked with H5_CHECK_OVERFLOW, above */
+                    dp += direction * (ssize_t)buf_stride; /* Note that cast is checked with H5_CHECK_OVERFLOW, above */
+                } /* end if */
+                else {
+                    sp += direction * (ssize_t)src->shared->size; /* Note that cast is checked with H5_CHECK_OVERFLOW, above */
+                    dp += direction * (ssize_t)dst->shared->size; /* Note that cast is checked with H5_CHECK_OVERFLOW, above */
+                } /* end else */
+            } /* end for */
+
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    if(src_rev)
+        H5MM_free(src_rev);
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_b_b() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_conv_struct_free
+ *
+ * Purpose:	Free the private data structure used by the compound
+ *      conversion functions.
+ *
+ * Return:	The result of H5MM_xfree(priv) (NULL)
+ *
+ * Programmer:	Neil Fortner
+ *		Wednesday, October 1, 2008
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_conv_struct_t *
+H5T_conv_struct_free(H5T_conv_struct_t *priv)
+{
+    int         *src2dst = priv->src2dst;
+    hid_t       *src_memb_id = priv->src_memb_id,
+                *dst_memb_id = priv->dst_memb_id;
+    unsigned    i;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    for(i = 0; i < priv->src_nmembs; i++)
+        if(src2dst[i] >= 0) {
+            int status;
+
+            status = H5I_dec_ref(src_memb_id[i]);
+            HDassert(status >= 0);
+            status = H5I_dec_ref(dst_memb_id[src2dst[i]]);
+            HDassert(status >= 0);
+        } /* end if */
+
+    H5MM_xfree(src2dst);
+    H5MM_xfree(src_memb_id);
+    H5MM_xfree(dst_memb_id);
+    H5MM_xfree(priv->memb_path);
+
+    FUNC_LEAVE_NOAPI((H5T_conv_struct_t *)H5MM_xfree(priv))
+} /* end H5T_conv_struct_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_conv_struct_init
+ *
+ * Purpose:	Initialize the `priv' field of `cdata' with conversion
+ *		information that is relatively constant.  If `priv' is
+ *		already initialized then the member conversion functions
+ *		are recalculated.
+ *
+ *		Priv fields are indexed by source member number or
+ *		destination member number depending on whether the field
+ *		contains information about the source datatype or the
+ *		destination datatype (fields that contains the same
+ *		information for both source and destination are indexed by
+ *		source member number).  The src2dst[] priv array maps source
+ *		member numbers to destination member numbers, but if the
+ *		source member doesn't have a corresponding destination member
+ *		then the src2dst[i]=-1.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January 26, 1998
+ *
+ * Modifications:
+ *              Raymond Lu, 3 May 2007
+ *              Added the detection for a special optimization case when the
+ *              source and destination members are a subset of each other, and
+ *              the order is the same, and no conversion is needed.  For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              or
+ *                  struct destination {       struct source {
+ *                      TYPE1 A;      <--          TYPE1 A;
+ *                      TYPE2 B;      <--          TYPE2 B;
+ *                      TYPE3 C;      <--          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              The optimization is simply moving data to the appropriate
+ *              places in the buffer.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_conv_struct_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata, hid_t dxpl_id)
+{
+    H5T_conv_struct_t	*priv = (H5T_conv_struct_t*)(cdata->priv);
+    int		        *src2dst = NULL;
+    unsigned            src_nmembs, dst_nmembs;
+    unsigned		i, j;
+    herr_t              ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    src_nmembs = src->shared->u.compnd.nmembs;
+    dst_nmembs = dst->shared->u.compnd.nmembs;
+
+    if(!priv) {
+        /*
+         * Allocate private data structure and arrays.
+         */
+        if(NULL == (priv = (H5T_conv_struct_t *)(cdata->priv=H5MM_calloc(sizeof(H5T_conv_struct_t)))) ||
+                NULL == (priv->src2dst = (int *)H5MM_malloc(src_nmembs * sizeof(int))) ||
+                NULL == (priv->src_memb_id = (hid_t *)H5MM_malloc(src_nmembs * sizeof(hid_t))) ||
+                NULL == (priv->dst_memb_id = (hid_t *)H5MM_malloc(dst_nmembs * sizeof(hid_t))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        src2dst = priv->src2dst;
+        priv->src_nmembs = src_nmembs;
+
+        /* The flag of special optimization to indicate if source members and destination
+         * members are a subset of each other.  Initialize it to FALSE */
+        priv->subset_info.subset = H5T_SUBSET_FALSE;
+        priv->subset_info.copy_size = 0;
+
+        /*
+         * Insure that members are sorted.
+         */
+        H5T__sort_value(src, NULL);
+        H5T__sort_value(dst, NULL);
+
+        /*
+         * Build a mapping from source member number to destination member
+         * number. If some source member is not a destination member then that
+         * mapping element will be negative.  Also create atoms for each
+         * source and destination member datatype so we can look up the
+         * member datatype conversion functions later.
+         */
+        for(i = 0; i < src_nmembs; i++) {
+            src2dst[i] = -1;
+            for(j = 0; j < dst_nmembs; j++) {
+                if(!HDstrcmp(src->shared->u.compnd.memb[i].name, dst->shared->u.compnd.memb[j].name)) {
+                    H5_CHECKED_ASSIGN(src2dst[i], int, j, unsigned);
+                    break;
+                } /* end if */
+            } /* end for */
+            if(src2dst[i] >= 0) {
+                hid_t	tid;
+                H5T_t	*type;
+
+                type = H5T_copy(src->shared->u.compnd.memb[i].type, H5T_COPY_ALL);
+                tid = H5I_register(H5I_DATATYPE, type, FALSE);
+                HDassert(tid >= 0);
+                priv->src_memb_id[i] = tid;
+
+                type = H5T_copy(dst->shared->u.compnd.memb[src2dst[i]].type, H5T_COPY_ALL);
+                tid = H5I_register(H5I_DATATYPE, type, FALSE);
+                HDassert(tid >= 0);
+                priv->dst_memb_id[src2dst[i]] = tid;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+    else {
+        /* Restore sorted conditions for the datatypes */
+        /* (Required for the src2dst array to be valid) */
+        H5T__sort_value(src, NULL);
+        H5T__sort_value(dst, NULL);
+    } /* end else */
+
+    /*
+     * (Re)build the cache of member conversion functions and pointers to
+     * their cdata entries.
+     */
+    src2dst = priv->src2dst;
+    H5MM_xfree(priv->memb_path);
+    if(NULL == (priv->memb_path = (H5T_path_t **)H5MM_malloc(src->shared->u.compnd.nmembs * sizeof(H5T_path_t*))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    for(i = 0; i < src_nmembs; i++) {
+        if(src2dst[i] >= 0) {
+            H5T_path_t *tpath = H5T_path_find(src->shared->u.compnd.memb[i].type, dst->shared->u.compnd.memb[src2dst[i]].type, NULL, NULL, dxpl_id, FALSE);
+
+            if(NULL == (priv->memb_path[i] = tpath)) {
+                cdata->priv = H5T_conv_struct_free(priv);
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert member datatype")
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    /* The compound conversion functions need a background buffer */
+    cdata->need_bkg = H5T_BKG_YES;
+
+    if(src_nmembs < dst_nmembs) {
+        priv->subset_info.subset = H5T_SUBSET_SRC;
+        for(i = 0; i < src_nmembs; i++) {
+            /* If any of source members doesn't have counterpart in the same
+                * order or there's conversion between members, don't do the
+                * optimization.
+                */
+            if(src2dst[i] != (int)i || (src->shared->u.compnd.memb[i].offset != dst->shared->u.compnd.memb[i].offset) || (priv->memb_path[i])->is_noop == FALSE) {
+                priv->subset_info.subset = H5T_SUBSET_FALSE;
+                break;
+            } /* end if */
+        } /* end for */
+        /* Compute the size of the data to be copied for each element.  It
+            * may be smaller than either src or dst if there is extra space at
+            * the end of src.
+            */
+        if(priv->subset_info.subset == H5T_SUBSET_SRC)
+            priv->subset_info.copy_size = src->shared->u.compnd.memb[src_nmembs - 1].offset
+                + src->shared->u.compnd.memb[src_nmembs - 1].size;
+    } else if(dst_nmembs < src_nmembs) {
+        priv->subset_info.subset = H5T_SUBSET_DST;
+        for(i = 0; i < dst_nmembs; i++) {
+            /* If any of source members doesn't have counterpart in the same order or
+                * there's conversion between members, don't do the optimization. */
+            if(src2dst[i] != (int)i || (src->shared->u.compnd.memb[i].offset != dst->shared->u.compnd.memb[i].offset) || (priv->memb_path[i])->is_noop == FALSE) {
+                priv->subset_info.subset = H5T_SUBSET_FALSE;
+                break;
+            }
+        } /* end for */
+        /* Compute the size of the data to be copied for each element.  It
+            * may be smaller than either src or dst if there is extra space at
+            * the end of dst.
+            */
+        if(priv->subset_info.subset == H5T_SUBSET_DST)
+            priv->subset_info.copy_size = dst->shared->u.compnd.memb[dst_nmembs-1].offset
+                + dst->shared->u.compnd.memb[dst_nmembs-1].size;
+    } else /* If the numbers of source and dest members are equal and no conversion is needed,
+            * the case should have been handled as noop earlier in H5Dio.c. */
+        {;}
+
+    cdata->recalc = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_conv_struct_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_struct_subset
+ *
+ * Purpose:     A quick way to return a field in a struct private in this
+ *              file.  The flag SMEMBS_SUBSET indicates whether the source
+ *              members are a subset of destination or the destination
+ *              members are a subset of the source, and the order is the
+ *              same, and no conversion is needed.  For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *
+ * Return:      A pointer to the subset info struct in p.  Points directly
+ *              into the structure.
+ *
+ * Programmer:	Raymond Lu
+ *		8 June 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_subset_info_t *
+H5T__conv_struct_subset(const H5T_cdata_t *cdata)
+{
+    H5T_conv_struct_t	*priv;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(cdata);
+    HDassert(cdata->priv);
+
+    priv = (H5T_conv_struct_t *)(cdata->priv);
+
+    FUNC_LEAVE_NOAPI((H5T_subset_info_t *) &priv->subset_info)
+} /* end H5T__conv_struct_subset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_struct
+ *
+ * Purpose:	Converts between compound datatypes.  This is a soft
+ *		conversion function.  The algorithm is basically:
+ *
+ * 		For each element do
+ *		  For I=1..NELMTS do
+ *		    If sizeof detination type <= sizeof source type then
+ *		      Convert member to destination type;
+ *		    Move member as far left as possible;
+ *
+ *		  For I=NELMTS..1 do
+ *		    If not destination type then
+ *		      Convert member to destination type;
+ *		    Move member to correct position in BKG
+ *
+ *		  Copy BKG to BUF
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, January 22, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_struct(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t bkg_stride, void *_buf, void *_bkg, hid_t dxpl_id)
+{
+    uint8_t	*buf = (uint8_t *)_buf;	/*cast for pointer arithmetic	*/
+    uint8_t	*bkg = (uint8_t *)_bkg;	/*background pointer arithmetic	*/
+    uint8_t     *xbuf = buf, *xbkg = bkg;   /*temp pointers into buf and bkg*/
+    H5T_t	*src = NULL;		/*source datatype		*/
+    H5T_t	*dst = NULL;		/*destination datatype		*/
+    int	*src2dst = NULL;	/*maps src member to dst member	*/
+    H5T_cmemb_t	*src_memb = NULL;	/*source struct member descript.*/
+    H5T_cmemb_t	*dst_memb = NULL;	/*destination struct memb desc.	*/
+    size_t	offset;			/*byte offset wrt struct	*/
+    ssize_t	src_delta;	        /*source stride	*/
+    ssize_t	bkg_delta;	        /*background stride	*/
+    size_t	elmtno;
+    unsigned	u;		        /*counters			*/
+    int	        i;			/*counters			*/
+    H5T_conv_struct_t *priv = (H5T_conv_struct_t *)(cdata->priv);
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * First, determine if this conversion function applies to the
+             * conversion path SRC_ID-->DST_ID.  If not, return failure;
+             * otherwise initialize the `priv' field of `cdata' with information
+             * that remains (almost) constant for this conversion path.
+             */
+            if (NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_COMPOUND != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
+            if(H5T_COMPOUND != dst->shared->type) 
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
+
+            if(H5T_conv_struct_init(src, dst, cdata, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
+            break;
+
+        case H5T_CONV_FREE:
+            /*
+             * Free the private conversion data.
+             */
+            cdata->priv = H5T_conv_struct_free(priv);
+            break;
+
+        case H5T_CONV_CONV:
+            /*
+             * Conversion.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+            HDassert(priv);
+            HDassert(bkg && cdata->need_bkg);
+
+            if(cdata->recalc && H5T_conv_struct_init(src, dst, cdata, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
+
+            /*
+             * Insure that members are sorted.
+             */
+            H5T__sort_value(src, NULL);
+            H5T__sort_value(dst, NULL);
+            src2dst = priv->src2dst;
+
+            /*
+             * Direction of conversion and striding through background.
+             */
+            if(buf_stride) {
+                H5_CHECKED_ASSIGN(src_delta, ssize_t, buf_stride, size_t);
+                if(!bkg_stride) {
+                    H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
+                } /* end if */
+                else
+                    H5_CHECKED_ASSIGN(bkg_delta, ssize_t, bkg_stride, size_t);
+            } /* end if */
+            else if(dst->shared->size <= src->shared->size) {
+                H5_CHECKED_ASSIGN(src_delta, ssize_t, src->shared->size, size_t);
+                H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
+            } /* end else-if */
+            else {
+                H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+                src_delta = -(ssize_t)src->shared->size;
+                H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+                bkg_delta = -(ssize_t)dst->shared->size;
+                xbuf += (nelmts - 1) * src->shared->size;
+                xbkg += (nelmts - 1) * dst->shared->size;
+            } /* end else */
+
+            /* Conversion loop... */
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                /*
+                 * For each source member which will be present in the
+                 * destination, convert the member to the destination type unless
+                 * it is larger than the source type.  Then move the member to the
+                 * left-most unoccupied position in the buffer.  This makes the
+                 * data point as small as possible with all the free space on the
+                 * right side.
+                 */
+                for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
+                    if(src2dst[u] < 0)
+                        continue; /*subsetting*/
+                    src_memb = src->shared->u.compnd.memb + u;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[u];
+
+                    if(dst_memb->size <= src_memb->size) {
+                        if(H5T_convert(priv->memb_path[u], priv->src_memb_id[u],
+                                priv->dst_memb_id[src2dst[u]],
+                                (size_t)1, (size_t)0, (size_t)0, /*no striding (packed array)*/
+                                xbuf + src_memb->offset, xbkg + dst_memb->offset,
+                                dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
+                        HDmemmove(xbuf + offset, xbuf + src_memb->offset, dst_memb->size);
+                        offset += dst_memb->size;
+                    } /* end if */
+                    else {
+                        HDmemmove (xbuf+offset, xbuf+src_memb->offset,
+                                   src_memb->size);
+                        offset += src_memb->size;
+                    } /* end else */
+                } /* end for */
+
+                /*
+                 * For each source member which will be present in the
+                 * destination, convert the member to the destination type if it
+                 * is larger than the source type (that is, has not been converted
+                 * yet).  Then copy the member to the destination offset in the
+                 * background buffer.
+                 */
+                H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
+                for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
+                    if(src2dst[i] < 0)
+                        continue; /*subsetting*/
+                    src_memb = src->shared->u.compnd.memb + i;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[i];
+
+                    if(dst_memb->size > src_memb->size) {
+                        offset -= src_memb->size;
+                        if(H5T_convert(priv->memb_path[i],
+                                    priv->src_memb_id[i], priv->dst_memb_id[src2dst[i]],
+                                    (size_t)1, (size_t)0, (size_t)0, /*no striding (packed array)*/
+                                    xbuf + offset, xbkg + dst_memb->offset,
+                                    dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
+                    } /* end if */
+                    else
+                        offset -= dst_memb->size;
+                    HDmemmove(xbkg + dst_memb->offset, xbuf + offset, dst_memb->size);
+                } /* end for */
+                HDassert(0 == offset);
+
+                /*
+                 * Update pointers
+                 */
+                xbuf += src_delta;
+                xbkg += bkg_delta;
+            } /* end for */
+
+            /* If the bkg_delta was set to -(dst->shared->size), make it positive now */
+            if(buf_stride == 0 && dst->shared->size > src->shared->size)
+                H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
+
+            /*
+             * Copy the background buffer back into the in-place conversion
+             * buffer.
+             */
+            for(xbuf = buf, xbkg = bkg, elmtno = 0; elmtno < nelmts; elmtno++) {
+                HDmemmove(xbuf, xbkg, dst->shared->size);
+                xbuf += buf_stride ? buf_stride : dst->shared->size;
+                xbkg += bkg_delta;
+            } /* end for */
+            break;
+
+        default:
+            /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_struct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_struct_opt
+ *
+ * Purpose:	Converts between compound datatypes in a manner more
+ *		efficient than the general-purpose H5T__conv_struct()
+ *		function.  This function isn't applicable if the destination
+ *		is larger than the source type. This is a soft conversion
+ *		function.  The algorithm is basically:
+ *
+ * 		For each member of the struct
+ *		  If sizeof detination type <= sizeof source type then
+ *		    Convert member to destination type for all elements
+ *		    Move memb to BKG buffer for all elements
+ *		  Else
+ *		    Move member as far left as possible for all elements
+ *
+ *		For each member of the struct (in reverse order)
+ *		  If not destination type then
+ *		    Convert member to destination type for all elements
+ *		    Move member to correct position in BKG for all elements
+ *
+ *		Copy BKG to BUF for all elements
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, January 22, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-06-16
+ *              Added support for non-zero strides. If BUF_STRIDE is
+ *              non-zero then convert one value at each memory location
+ *              advancing BUF_STRIDE bytes each time; otherwise assume both
+ *              source and destination values are packed.
+ *
+ * 		Robb Matzke, 1999-06-16
+ *		If the source and destination data structs are the same size
+ *		then we can convert on a field-by-field basis instead of an
+ *		element by element basis. In other words, for all struct
+ *		elements being converted by this function call, first convert
+ *		all of the field1's, then all field2's, etc. This can
+ *		drastically reduce the number of calls to H5T_convert() and
+ *		thereby eliminate most of the conversion constant overhead.
+ *
+ *              Robb Matzke, 2000-05-17
+ *              Added the BKG_STRIDE argument to fix a design bug. If
+ *              BUF_STRIDE and BKG_STRIDE are both non-zero then each
+ *              data element converted will be placed temporarily at a
+ *              multiple of BKG_STRIDE in the BKG buffer; otherwise the
+ *              BKG buffer is assumed to be a packed array of destination
+ *              datatype.
+ *
+ *              Raymond Lu, 3 May 2007
+ *              Optimize a special case when the source and destination members
+ *              are a subset of each other, and the order is the same, and no
+ *              conversion is needed.  For example:
+ *                  struct source {            struct destination {
+ *                      TYPE1 A;      -->          TYPE1 A;
+ *                      TYPE2 B;      -->          TYPE2 B;
+ *                      TYPE3 C;      -->          TYPE3 C;
+ *                  };                             TYPE4 D;
+ *                                                 TYPE5 E;
+ *                                             };
+ *              The optimization is simply moving data to the appropriate
+ *              places in the buffer.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_struct_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+    size_t nelmts, size_t buf_stride, size_t bkg_stride, void *_buf,
+    void *_bkg, hid_t dxpl_id)
+{
+    uint8_t	*buf = (uint8_t *)_buf;	/*cast for pointer arithmetic	*/
+    uint8_t	*bkg = (uint8_t *)_bkg;	/*background pointer arithmetic	*/
+    uint8_t	*xbuf = NULL;		/*temporary pointer into `buf'	*/
+    uint8_t	*xbkg = NULL;		/*temporary pointer into `bkg'	*/
+    H5T_t	*src = NULL;		/*source datatype		*/
+    H5T_t	*dst = NULL;		/*destination datatype		*/
+    int	*src2dst = NULL;		/*maps src member to dst member	*/
+    H5T_cmemb_t	*src_memb = NULL;	/*source struct member descript.*/
+    H5T_cmemb_t	*dst_memb = NULL;	/*destination struct memb desc.	*/
+    size_t	offset;			/*byte offset wrt struct	*/
+    size_t	elmtno;			/*element counter		*/
+    size_t      copy_size;              /*size of element for copying   */
+    H5T_conv_struct_t *priv = NULL;	/*private data			*/
+    hbool_t     no_stride = FALSE;      /*flag to indicate no stride    */
+    unsigned	u;			/*counters			*/
+    int		i;			/*counters			*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * First, determine if this conversion function applies to the
+             * conversion path SRC_ID-->DST_ID.  If not, return failure;
+             * otherwise initialize the `priv' field of `cdata' with information
+             * that remains (almost) constant for this conversion path.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_COMPOUND != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
+            if(H5T_COMPOUND != dst->shared->type) 
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
+
+            /* Initialize data which is relatively constant */
+            if(H5T_conv_struct_init(src, dst, cdata, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
+            priv = (H5T_conv_struct_t *)(cdata->priv);
+            src2dst = priv->src2dst;
+
+            /*
+             * If the destination type is not larger than the source type then
+             * this conversion function is guaranteed to work (provided all
+             * members can be converted also). Otherwise the determination is
+             * quite a bit more complicated. Essentially we have to make sure
+             * that there is always room in the source buffer to do the
+             * conversion of a member in place. This is basically the same pair
+             * of loops as in the actual conversion except it checks that there
+             * is room for each conversion instead of actually doing anything.
+             */
+            if(dst->shared->size > src->shared->size) {
+                for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
+                    if(src2dst[u] < 0)
+                        continue;
+                    src_memb = src->shared->u.compnd.memb + u;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[u];
+                    if(dst_memb->size > src_memb->size)
+                        offset += src_memb->size;
+                } /* end for */
+                H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
+                for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
+                    if(src2dst[i] < 0)
+                        continue;
+                    src_memb = src->shared->u.compnd.memb + i;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[i];
+                    if(dst_memb->size > src_memb->size) {
+                        offset -= src_memb->size;
+                        if(dst_memb->size > src->shared->size-offset) {
+                            cdata->priv = H5T_conv_struct_free(priv);
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "convertion is unsupported by this function")
+                        } /* end if */
+                    } /* end if */
+                } /* end for */
+            } /* end if */
+            break;
+
+        case H5T_CONV_FREE:
+            /*
+             * Free the private conversion data.
+             */
+            cdata->priv = H5T_conv_struct_free((H5T_conv_struct_t *)(cdata->priv));
+            break;
+
+        case H5T_CONV_CONV:
+            /*
+             * Conversion.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /* Update cached data if necessary */
+            if(cdata->recalc && H5T_conv_struct_init(src, dst, cdata, dxpl_id)<0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
+            priv = (H5T_conv_struct_t *)(cdata->priv);
+            HDassert(priv);
+            src2dst = priv->src2dst;
+            HDassert(bkg && cdata->need_bkg);
+
+            /*
+             * Insure that members are sorted.
+             */
+            H5T__sort_value(src, NULL);
+            H5T__sort_value(dst, NULL);
+
+            /*
+             * Calculate strides. If BUF_STRIDE is non-zero then convert one
+             * data element at every BUF_STRIDE bytes through the main buffer
+             * (BUF), leaving the result of each conversion at the same
+             * location; otherwise assume the source and destination data are
+             * packed tightly based on src->shared->size and dst->shared->size.  Also, if
+             * BUF_STRIDE and BKG_STRIDE are both non-zero then place
+             * background data into the BKG buffer at multiples of BKG_STRIDE;
+             * otherwise assume BKG buffer is the packed destination datatype.
+             */
+            if(!buf_stride || !bkg_stride)
+                bkg_stride = dst->shared->size;
+            if(!buf_stride) {
+                no_stride = TRUE;
+                buf_stride = src->shared->size;
+            } /* end if */
+
+            if(priv->subset_info.subset == H5T_SUBSET_SRC || priv->subset_info.subset == H5T_SUBSET_DST) {
+                /* If the optimization flag is set to indicate source members are a subset and
+                 * in the top of the destination, simply copy the source members to background buffer.
+                 */
+                xbuf = buf;
+                xbkg = bkg;
+                copy_size = priv->subset_info.copy_size;
+
+                for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                    HDmemmove(xbkg, xbuf, copy_size);
+
+                    /* Update pointers */
+                    xbuf += buf_stride;
+                    xbkg += bkg_stride;
+                } /* end for */
+            } /* end if */
+            else {
+                /*
+                 * For each member where the destination is not larger than the
+                 * source, stride through all the elements converting only that member
+                 * in each element and then copying the element to its final
+                 * destination in the bkg buffer. Otherwise move the element as far
+                 * left as possible in the buffer.
+                 */
+                for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
+                    if(src2dst[u] < 0)
+                        continue; /*subsetting*/
+                    src_memb = src->shared->u.compnd.memb + u;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[u];
+
+                    if(dst_memb->size <= src_memb->size) {
+                        xbuf = buf + src_memb->offset;
+                        xbkg = bkg + dst_memb->offset;
+                        if(H5T_convert(priv->memb_path[u], priv->src_memb_id[u],
+                                priv->dst_memb_id[src2dst[u]], nelmts,
+                                buf_stride, bkg_stride, xbuf, xbkg, dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
+                        for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                            HDmemmove(xbkg, xbuf, dst_memb->size);
+                            xbuf += buf_stride;
+                            xbkg += bkg_stride;
+                        } /* end for */
+                    } /* end if */
+                    else {
+                        for(xbuf = buf, elmtno = 0; elmtno < nelmts; elmtno++) {
+                            HDmemmove(xbuf + offset, xbuf + src_memb->offset, src_memb->size);
+                            xbuf += buf_stride;
+                        } /* end for */
+                        offset += src_memb->size;
+                    } /* end else */
+                } /* end else */
+
+                /*
+                 * Work from right to left, converting those members that weren't
+                 * converted in the previous loop (those members where the destination
+                 * is larger than the source) and them to their final position in the
+                 * bkg buffer.
+                 */
+                H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
+                for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
+                    if(src2dst[i] < 0)
+                        continue;
+                    src_memb = src->shared->u.compnd.memb + i;
+                    dst_memb = dst->shared->u.compnd.memb + src2dst[i];
+
+                    if(dst_memb->size > src_memb->size) {
+                        offset -= src_memb->size;
+                        xbuf = buf + offset;
+                        xbkg = bkg + dst_memb->offset;
+                        if(H5T_convert(priv->memb_path[i], priv->src_memb_id[i],
+                                priv->dst_memb_id[src2dst[i]], nelmts,
+                                buf_stride, bkg_stride, xbuf, xbkg, dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
+                        for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                            HDmemmove(xbkg, xbuf, dst_memb->size);
+                            xbuf += buf_stride;
+                            xbkg += bkg_stride;
+                        } /* end for */
+                    } /* end if */
+                } /* end for */
+            } /* end else */
+
+            if(no_stride)
+                buf_stride = dst->shared->size;
+
+            /* Move background buffer into result buffer */
+            for(xbuf = buf, xbkg = bkg, elmtno = 0; elmtno < nelmts; elmtno++) {
+                HDmemmove(xbuf, xbkg, dst->shared->size);
+                xbuf += buf_stride;
+                xbkg += bkg_stride;
+            } /* end for */
+            break;
+
+        default:
+            /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_struct_opt() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_conv_enum_init
+ *
+ * Purpose:	Initialize information for H5T__conv_enum().
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_conv_enum_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
+{
+    H5T_enum_struct_t	*priv = NULL;	/*private conversion data	*/
+    int		n;		/*src value cast as native int	*/
+    int		domain[2] = {0, 0};	/*min and max source values	*/
+    int		*map = NULL;	/*map from src value to dst idx	*/
+    unsigned	length;		/*nelmts in map array		*/
+    unsigned	i, j;		/*counters			*/
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    cdata->need_bkg = H5T_BKG_NO;
+    if(NULL == (priv = (H5T_enum_struct_t *)(cdata->priv = H5MM_calloc(sizeof(*priv)))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    if(0 == src->shared->u.enumer.nmembs)
+	HGOTO_DONE(SUCCEED);
+
+    /*
+     * Check that the source symbol names are a subset of the destination
+     * symbol names and build a map from source member index to destination
+     * member index.
+     */
+    H5T__sort_name(src, NULL);
+    H5T__sort_name(dst, NULL);
+    if(NULL == (priv->src2dst = (int *)H5MM_malloc(src->shared->u.enumer.nmembs * sizeof(int))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    for(i = 0, j = 0;
+             i < src->shared->u.enumer.nmembs && j < dst->shared->u.enumer.nmembs;
+             i++, j++) {
+	while(j < dst->shared->u.enumer.nmembs &&
+	       HDstrcmp(src->shared->u.enumer.name[i], dst->shared->u.enumer.name[j]))
+            j++;
+	if(j >= dst->shared->u.enumer.nmembs)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "source type is not a subset of destination type")
+	priv->src2dst[i] = (int)j;
+    } /* end for */
+
+    /*
+     * The conversion function will use an O(log N) lookup method for each
+     * value converted. However, if all of the following constraints are met
+     * then we can build a perfect hash table and use an O(1) lookup method.
+     *
+     *	  A: The source datatype size matches one of our native datatype
+     *	     sizes.
+     *
+     *	  B: After casting the source value bit pattern to a native type
+     *	     the size of the range of values is less than 20% larger than
+     *	     the number of values.
+     *
+     * If this special case is met then we use the source bit pattern cast as
+     * a native integer type as an index into the `val2dst'. The values of
+     * that array are the index numbers in the destination type or negative
+     * if the entry is unused.
+     *
+     * (This optimized algorithm doesn't work when the byte orders are different.  
+     * The code such as "n = *((int*)(src->shared->u.enumer.value+i*src->shared->size));"
+     * can change the value significantly. i.g. if the source value is big-endian 0x0000000f,
+     * executing the casting on little-endian machine will get a big number 0x0f000000.
+     * Then it can't meet the condition 
+     * "if(src->shared->u.enumer.nmembs<2 || (double)length/src->shared->u.enumer.nmembs<1.2)"
+     * Because this is the optimized code, we won't fix it. It should still work in some 
+     * situations. SLU - 2011/5/24) 
+     */
+    if(1 == src->shared->size || sizeof(short) == src->shared->size || sizeof(int) == src->shared->size) {
+	for(i = 0; i < src->shared->u.enumer.nmembs; i++) {
+	    if(1 == src->shared->size)
+		n = *((signed char *)(src->shared->u.enumer.value + i));
+	    else if (sizeof(short) == src->shared->size)
+		n = *((short *)(src->shared->u.enumer.value + i * src->shared->size));
+	    else
+		n = *((int *)(src->shared->u.enumer.value + i * src->shared->size));
+	    if(0 == i) {
+		domain[0] = domain[1] = n;
+	    } else {
+		domain[0] = MIN(domain[0], n);
+		domain[1] = MAX(domain[1], n);
+	    }
+	} /* end for */
+
+        HDassert(domain[1] >= domain[0]);
+	length = (unsigned)(domain[1] - domain[0]) + 1;
+	if(src->shared->u.enumer.nmembs < 2 ||
+                (double)length / src->shared->u.enumer.nmembs < (double)(1.2f)) {
+	    priv->base = domain[0];
+	    priv->length = length;
+	    if(NULL == (map = (int *)H5MM_malloc(length * sizeof(int))))
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+	    for(i = 0; i < length; i++)
+                map[i] = -1; /*entry unused*/
+	    for(i = 0; i < src->shared->u.enumer.nmembs; i++) {
+		if(1 == src->shared->size)
+		    n = *((signed char *)(src->shared->u.enumer.value + i));
+		else if(sizeof(short) == src->shared->size)
+		    n = *((short *)(src->shared->u.enumer.value + i * src->shared->size));
+		else
+		    n = *((int *)(src->shared->u.enumer.value + i * src->shared->size));
+		n -= priv->base;
+		HDassert(n >= 0 && (unsigned)n < priv->length);
+		HDassert(map[n] < 0);
+		map[n] = priv->src2dst[i];
+	    } /* end for */
+
+	    /*
+	     * Replace original src2dst array with our new one. The original
+	     * was indexed by source member number while the new one is
+	     * indexed by source values.
+	     */
+	    H5MM_xfree(priv->src2dst);
+	    priv->src2dst = map;
+	    HGOTO_DONE(SUCCEED);
+	}
+    }
+
+    /* Sort source type by value and adjust src2dst[] appropriately */
+    H5T__sort_value(src, priv->src2dst);
+
+done:
+    if (ret_value<0 && priv) {
+	H5MM_xfree(priv->src2dst);
+	H5MM_xfree(priv);
+	cdata->priv = NULL;
+    }
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_enum
+ *
+ * Purpose:	Converts one type of enumerated data to another.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	      size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
+              void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    uint8_t	*buf = (uint8_t*)_buf;	/*cast for pointer arithmetic	*/
+    H5T_t	*src = NULL, *dst = NULL;	/*src and dst datatypes	*/
+    uint8_t	*s = NULL, *d = NULL;	/*src and dst BUF pointers	*/
+    ssize_t	src_delta, dst_delta;	/*conversion strides		*/
+    int	n;			/*src value cast as native int	*/
+    H5T_enum_struct_t *priv = (H5T_enum_struct_t*)(cdata->priv);
+    H5P_genplist_t      *plist;         /*property list pointer         */
+    H5T_conv_cb_t       cb_struct;      /*conversion callback structure */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    size_t	i;			/*counters			*/
+    herr_t      ret_value = SUCCEED;    /* Return value                 */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * Determine if this conversion function applies to the conversion
+             * path SRC_ID->DST_ID.  If not return failure; otherwise initialize
+             * the `priv' field of `cdata' with information about the underlying
+             * integer conversion.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_ENUM != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
+            if(H5T_ENUM != dst->shared->type) 
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
+
+            if(H5T_conv_enum_init(src, dst, cdata) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize private data")
+            break;
+
+        case H5T_CONV_FREE:
+#ifdef H5T_DEBUG
+            if (H5DEBUG(T)) {
+                fprintf(H5DEBUG(T), "      Using %s mapping function%s\n",
+                        priv->length?"O(1)":"O(log N)",
+                        priv->length?"":", where N is the number of enum members");
+            }
+#endif
+            if (priv) {
+                H5MM_xfree(priv->src2dst);
+                H5MM_xfree(priv);
+            }
+            cdata->priv = NULL;
+            break;
+
+        case H5T_CONV_CONV:
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_ENUM != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
+            if(H5T_ENUM != dst->shared->type) 
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
+
+            /* priv->src2dst map was computed for certain sort keys. Make sure those same
+             * sort keys are used here during conversion. See H5T_conv_enum_init(). But
+             * we actually don't care about the source type's order when doing the O(1)
+             * conversion algorithm, which is turned on by non-zero priv->length */
+            H5T__sort_name(dst, NULL);
+            if(!priv->length)
+                H5T__sort_value(src, NULL);
+
+            /*
+             * Direction of conversion.
+             */
+            if(buf_stride) {
+                H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+                src_delta = dst_delta = (ssize_t)buf_stride;
+                s = d = buf;
+            } else if(dst->shared->size <= src->shared->size) {
+                H5_CHECKED_ASSIGN(src_delta, ssize_t, src->shared->size, size_t);
+                H5_CHECKED_ASSIGN(dst_delta, ssize_t, dst->shared->size, size_t);
+                s = d = buf;
+            } else {
+                H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+                H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+                src_delta = -(ssize_t)src->shared->size;
+                dst_delta = -(ssize_t)dst->shared->size;
+                s = buf + (nelmts - 1) * src->shared->size;
+                d = buf + (nelmts - 1) * dst->shared->size;
+            }
+
+            /* Get the plist structure */
+            if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist, H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            for(i = 0; i < nelmts; i++, s += src_delta, d += dst_delta) {
+                if(priv->length) {
+                    /* Use O(1) lookup */
+                    /* (The casting won't work when the byte orders are different. i.g. if the source value
+                     * is big-endian 0x0000000f, the direct casting "n = *((int*)s);" will make it a big
+                     * number 0x0f000000 on little-endian machine. But we won't fix it because it's an 
+                     * optimization code. Please also see the comment in the H5T_conv_enum_init() function.
+                     * SLU - 2011/5/24)
+                     */
+                    if(1 == src->shared->size)
+                        n = *((signed char*)s);
+                    else if(sizeof(short) == src->shared->size)
+                        n = *((short*)s);
+                    else
+                        n = *((int*)s);
+                    n -= priv->base;
+                    if(n < 0 || (unsigned)n >= priv->length || priv->src2dst[n] < 0) {
+                        /*overflow*/
+                        except_ret = H5T_CONV_UNHANDLED;
+                        /*If user's exception handler is present, use it*/
+                        if(cb_struct.func)
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    s, d, cb_struct.user_data);
+
+                        if(except_ret == H5T_CONV_UNHANDLED)
+                            HDmemset(d, 0xff, dst->shared->size);
+                        else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    } else
+                        HDmemcpy(d,
+                                 dst->shared->u.enumer.value + (unsigned)priv->src2dst[n] * dst->shared->size,
+                                 dst->shared->size);
+                } /* end if */
+                else {
+                    /* Use O(log N) lookup */
+                    unsigned lt = 0;
+                    unsigned rt = src->shared->u.enumer.nmembs;
+                    unsigned md;
+                    int cmp;
+
+                    while(lt < rt) {
+                        md = (lt + rt) / 2;
+                        cmp = HDmemcmp(s, src->shared->u.enumer.value + md * src->shared->size,
+                                       src->shared->size);
+                        if(cmp < 0)
+                            rt = md;
+                        else if(cmp > 0)
+                            lt = md + 1;
+                        else
+                            break;
+                    } /* end while */
+                    if(lt >= rt) {
+                        except_ret = H5T_CONV_UNHANDLED;
+                        /*If user's exception handler is present, use it*/
+                        if(cb_struct.func)
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    src, d, cb_struct.user_data);
+
+                        if(except_ret == H5T_CONV_UNHANDLED)
+                            HDmemset(d, 0xff, dst->shared->size);
+                        else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    } /* end if */
+                    else {
+                        HDassert(priv->src2dst[md] >= 0);
+                        HDmemcpy(d,
+                                 dst->shared->u.enumer.value + (unsigned)priv->src2dst[md] * dst->shared->size,
+                                 dst->shared->size);
+                    } /* end else */
+                } /* end else */
+            }
+
+            break;
+
+        default:
+            /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_enum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_enum_numeric
+ *
+ * Purpose:	Converts enumerated data to a numeric type (integer or 
+ *              floating-point number). This function is registered into 
+ *              the conversion table twice in H5T_init_interface in H5T.c.  
+ *              Once for enum-integer conversion. Once for enum-float conversion.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Raymond Lu
+ *              12 October 2012
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_enum_numeric(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	      size_t H5_ATTR_UNUSED buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
+              void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_t	*src, *dst;		/*src and dst datatypes	*/
+    H5T_t	*src_parent;		/*parent type for src           */
+    hid_t       src_parent_id = -1;     /*ID for parent of the source   */
+    H5T_path_t  *tpath;                 /* Conversion information       */
+    herr_t      ret_value = SUCCEED;    /* Return value                 */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * Determine if this conversion function applies to the conversion
+             * path SRC_ID->DST_ID.  If not, return failure.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_ENUM != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "source type is not a H5T_ENUM datatype")
+            if(H5T_INTEGER != dst->shared->type && H5T_FLOAT != dst->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "destination is not an integer type")
+
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            src_parent = src->shared->parent;
+
+            if(NULL == (tpath = H5T_path_find(src_parent, dst, NULL, NULL, dxpl_id, FALSE))) {
+	        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
+            } else if(!H5T_path_noop(tpath)) {
+                if((src_parent_id = H5I_register(H5I_DATATYPE, H5T_copy(src_parent, H5T_COPY_ALL), FALSE)) < 0) 
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+                /* Convert the data */
+                if(H5T_convert(tpath, src_parent_id, dst_id, nelmts, buf_stride, bkg_stride, _buf, bkg, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+            }
+            break;
+
+        default:
+            /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    /* Release the temporary datatype IDs used */
+    if(src_parent_id >= 0)
+        H5I_dec_ref(src_parent_id);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_enum_numeric() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_vlen
+ *
+ * Purpose:	Converts between VL datatypes in memory and on disk.
+ *		This is a soft conversion function.  The algorithm is
+ *		basically:
+ *
+ *      	For every VL struct in the main buffer:
+ *		  1. Allocate space for temporary dst VL data (reuse buffer
+ *		     if possible)
+ *                2. Copy VL data from src buffer into dst buffer
+ *                3. Convert VL data into dst representation
+ *                4. Allocate buffer in dst heap
+ *		  5. Free heap objects storing old data
+ *                6. Write dst VL data into dst heap
+ *                7. Store (heap ID or pointer) and length in main dst buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, May 26, 1999
+ *
+ * Modifications:
+ *
+ *		Quincey Koziol, 2 July, 1999
+ *		Enabled support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *
+ *		Raymond Lu, 26 June, 2002
+ *		Background buffer is used for freeing heap objects storing
+ * 		old data.  At this moment, it only frees the first level of
+ *		VL datatype.  It doesn't handle nested VL datatypes.
+ *
+ *              Raymond Lu, 8 November 2011
+ *              I put a condition check to prevent the conversion of VL strings
+ *              between ASCII and UTF8.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t bkg_stride, void *buf, void *bkg, hid_t dxpl_id)
+{
+    H5T_vlen_alloc_info_t _vl_alloc_info;       /* VL allocation info buffer */
+    H5T_vlen_alloc_info_t *vl_alloc_info = &_vl_alloc_info;   /* VL allocation info */
+    H5T_path_t	*tpath = NULL;		/* Type conversion path		     */
+    hbool_t     noop_conv = FALSE;      /* Flag to indicate a noop conversion */
+    hbool_t     write_to_file = FALSE;  /* Flag to indicate writing to file */
+    htri_t      parent_is_vlen;         /* Flag to indicate parent is vlen datatyp */
+    hid_t   	tsrc_id = -1, tdst_id = -1;/*temporary type atoms	     */
+    H5T_t	*src = NULL;		/*source datatype		     */
+    H5T_t	*dst = NULL;		/*destination datatype		     */
+    H5HG_t	bg_hobjid, parent_hobjid;
+    uint8_t	*s = NULL;		/*source buffer			*/
+    uint8_t	*d = NULL;		/*destination buffer		*/
+    uint8_t	*b = NULL;		/*background buffer		*/
+    ssize_t	s_stride, d_stride;	/*src and dst strides		*/
+    ssize_t	b_stride;	        /*bkg stride			*/
+    size_t      safe;                   /*how many elements are safe to process in each pass */
+    size_t	bg_seq_len = 0;
+    size_t	src_base_size, dst_base_size;/*source & destination base size*/
+    void	*conv_buf = NULL;     	/*temporary conversion buffer 	     */
+    size_t	conv_buf_size = 0;  	/*size of conversion buffer in bytes */
+    void	*tmp_buf = NULL;     	/*temporary background buffer 	     */
+    size_t	tmp_buf_size = 0;	/*size of temporary bkg buffer	     */
+    hbool_t     nested = FALSE;         /*flag of nested VL case             */
+    size_t	elmtno;			/*element number counter	     */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * First, determine if this conversion function applies to the
+             * conversion path SRC_ID-->DST_ID.  If not, return failure;
+             * otherwise initialize the `priv' field of `cdata' with
+             * information that remains (almost) constant for this
+             * conversion path.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_VLEN != src->shared->type)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_VLEN datatype")
+            if(H5T_VLEN != dst->shared->type) 
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_VLEN datatype")
+            if(H5T_VLEN_STRING == src->shared->u.vlen.type && H5T_VLEN_STRING == dst->shared->u.vlen.type) {
+                if((H5T_CSET_ASCII == src->shared->u.vlen.cset && H5T_CSET_UTF8 == dst->shared->u.vlen.cset) 
+                    || (H5T_CSET_ASCII == dst->shared->u.vlen.cset && H5T_CSET_UTF8 == src->shared->u.vlen.cset))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "The library doesn't convert between strings of ASCII and UTF")
+            }
+
+            /* Variable-length types don't need a background buffer */
+            cdata->need_bkg = H5T_BKG_NO;
+
+            break;
+
+        case H5T_CONV_FREE:
+            /* QAK - Nothing to do currently */
+            break;
+
+        case H5T_CONV_CONV:
+            /*
+             * Conversion.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /* Initialize source & destination strides */
+            if(buf_stride) {
+                HDassert(buf_stride >= src->shared->size);
+                HDassert(buf_stride >= dst->shared->size);
+                H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+                s_stride = d_stride = (ssize_t)buf_stride;
+            } /* end if */
+            else {
+                H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+                H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+                s_stride = (ssize_t)src->shared->size;
+                d_stride = (ssize_t)dst->shared->size;
+            } /* end else */
+            if(bkg) {
+                if(bkg_stride)
+                    b_stride = (ssize_t)bkg_stride;
+                else
+                    b_stride = d_stride;
+            } /* end if */
+            else
+                b_stride = 0;
+
+            /* Get the size of the base types in src & dst */
+            src_base_size = H5T_get_size(src->shared->parent);
+            dst_base_size = H5T_get_size(dst->shared->parent);
+
+            /* Set up conversion path for base elements */
+            if(NULL == (tpath = H5T_path_find(src->shared->parent, dst->shared->parent, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatypes")
+            else if(!H5T_path_noop(tpath)) {
+                if((tsrc_id = H5I_register(H5I_DATATYPE, H5T_copy(src->shared->parent, H5T_COPY_ALL), FALSE)) < 0 ||
+                        (tdst_id = H5I_register(H5I_DATATYPE, H5T_copy(dst->shared->parent, H5T_COPY_ALL), FALSE)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+            } /* end else-if */
+            else
+                noop_conv = TRUE;
+
+            /* Check if we need a temporary buffer for this conversion */
+            if((parent_is_vlen = H5T_detect_class(dst->shared->parent, H5T_VLEN, FALSE)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_SYSTEM, FAIL, "internal error when detecting variable-length class")
+            if(tpath->cdata.need_bkg || parent_is_vlen) {
+                /* Set up initial background buffer */
+                tmp_buf_size = MAX(src_base_size, dst_base_size);
+                if(NULL == (tmp_buf = H5FL_BLK_CALLOC(vlen_seq,tmp_buf_size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for type conversion")
+            } /* end if */
+
+            /* Get the allocation info */
+            if(H5T_vlen_get_alloc_info(dxpl_id, &vl_alloc_info) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to retrieve VL allocation info")
+
+            /* Set flags to indicate we are writing to or reading from the file */
+            if(dst->shared->u.vlen.f != NULL)
+                write_to_file = TRUE;
+
+            /* Set the flag for nested VL case */
+            if(write_to_file && parent_is_vlen && bkg != NULL)
+                nested = TRUE;
+
+            /* The outer loop of the type conversion macro, controlling which */
+            /* direction the buffer is walked */
+            while(nelmts > 0) {
+                /* Check if we need to go backwards through the buffer */
+                if(d_stride > s_stride) {
+                    /* Sanity check */
+                    HDassert(s_stride > 0);
+                    HDassert(d_stride > 0);
+                    HDassert(b_stride >= 0);
+
+                    /* Compute the number of "safe" destination elements at */
+                    /* the end of the buffer (Those which don't overlap with */
+                    /* any source elements at the beginning of the buffer) */
+                    safe = nelmts - (((nelmts * (size_t)s_stride) + ((size_t)d_stride - 1)) / (size_t)d_stride);
+
+                    /* If we're down to the last few elements, just wrap up */
+                    /* with a "real" reverse copy */
+                    if(safe < 2) {
+                        s = (uint8_t *)buf + (nelmts - 1) * (size_t)s_stride;
+                        d = (uint8_t *)buf + (nelmts - 1) * (size_t)d_stride;
+                        b = (uint8_t *)bkg + (nelmts - 1) * (size_t)b_stride;
+                        s_stride = -s_stride;
+                        d_stride = -d_stride;
+                        b_stride = -b_stride;
+
+                        safe = nelmts;
+                    } /* end if */
+                    else {
+                        s = (uint8_t *)buf + (nelmts - safe) * (size_t)s_stride;
+                        d = (uint8_t *)buf + (nelmts - safe) * (size_t)d_stride;
+                        b = (uint8_t *)bkg + (nelmts - safe) * (size_t)b_stride;
+                    } /* end else */
+                } /* end if */
+                else {
+                    /* Single forward pass over all data */
+                    s = d = (uint8_t *)buf;
+                    b = (uint8_t *)bkg;
+                    safe = nelmts;
+                } /* end else */
+
+                for(elmtno = 0; elmtno < safe; elmtno++) {
+                    /* Check for "nil" source sequence */
+                    if((*(src->shared->u.vlen.isnull))(src->shared->u.vlen.f, s)) {
+                        /* Write "nil" sequence to destination location */
+                        if((*(dst->shared->u.vlen.setnull))(dst->shared->u.vlen.f, dxpl_id, d, b) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "can't set VL data to 'nil'")
+                    } /* end if */
+                    else {
+                        ssize_t sseq_len;   /* (signed) The number of elements in the current sequence*/
+                        size_t 	seq_len;    /* The number of elements in the current sequence*/
+
+                        /* Get length of element sequences */
+                        if((sseq_len = (*(src->shared->u.vlen.getlen))(s)) < 0)
+                            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "incorrect length")
+                        seq_len = (size_t)sseq_len;
+
+                        /* If we are reading from memory and there is no conversion, just get the pointer to sequence */
+                        if(write_to_file && noop_conv) {
+                            /* Get direct pointer to sequence */
+                            if(NULL == (conv_buf = (*(src->shared->u.vlen.getptr))(s)))
+                                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid source pointer")
+                        } /* end if */
+                        else {
+                            size_t	src_size, dst_size;     /*source & destination total size in bytes*/
+
+                            src_size = seq_len * src_base_size;
+                            dst_size = seq_len * dst_base_size;
+
+                            /* Check if conversion buffer is large enough, resize if
+                             * necessary.  If the SEQ_LEN is 0, allocate a minimal size buffer.
+                             */
+			    if(!seq_len && !conv_buf) {
+                                conv_buf_size = ((1 / H5T_VLEN_MIN_CONF_BUF_SIZE) + 1) * H5T_VLEN_MIN_CONF_BUF_SIZE;
+                                if(NULL == (conv_buf = H5FL_BLK_CALLOC(vlen_seq, conv_buf_size)))
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+			    }
+                            else if(conv_buf_size < MAX(src_size, dst_size)) {
+                                /* Only allocate conversion buffer in H5T_VLEN_MIN_CONF_BUF_SIZE increments */
+                                conv_buf_size = ((MAX(src_size, dst_size) / H5T_VLEN_MIN_CONF_BUF_SIZE) + 1) * H5T_VLEN_MIN_CONF_BUF_SIZE;
+                                if(NULL == (conv_buf = H5FL_BLK_REALLOC(vlen_seq, conv_buf, conv_buf_size)))
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+                                HDmemset(conv_buf, 0, conv_buf_size);
+                            } /* end if */
+
+                            /* Read in VL sequence */
+                            if((*(src->shared->u.vlen.read))(src->shared->u.vlen.f, dxpl_id, s, conv_buf, src_size) < 0)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_READERROR, FAIL, "can't read VL data")
+                        } /* end else */
+
+                        if(!noop_conv) {
+                            /* Check if temporary buffer is large enough, resize if necessary */
+                            /* (Chain off the conversion buffer size) */
+                            if(tmp_buf && tmp_buf_size < conv_buf_size) {
+                                /* Set up initial background buffer */
+                                tmp_buf_size = conv_buf_size;
+                                if(NULL == (tmp_buf = H5FL_BLK_REALLOC(vlen_seq, tmp_buf, tmp_buf_size)))
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+                                HDmemset(tmp_buf, 0, tmp_buf_size);
+                            } /* end if */
+
+                            /* If we are writing and there is a nested VL type, read
+                             * the sequence into the background buffer */
+                            if(nested) {
+                                const uint8_t *tmp = b;
+
+                                UINT32DECODE(tmp, bg_seq_len);
+                                if(bg_seq_len > 0) {
+                                    if(tmp_buf_size < (bg_seq_len * MAX(src_base_size, dst_base_size))) {
+                                        tmp_buf_size = (bg_seq_len * MAX(src_base_size, dst_base_size));
+                                        if(NULL == (tmp_buf = H5FL_BLK_REALLOC(vlen_seq, tmp_buf, tmp_buf_size)))
+                                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+                                        HDmemset(tmp_buf, 0, tmp_buf_size);
+                                    } /* end if */
+                                    H5F_addr_decode(dst->shared->u.vlen.f, &tmp, &(bg_hobjid.addr));
+                                    UINT32DECODE(tmp, bg_hobjid.idx);
+                                    if(NULL == H5HG_read(dst->shared->u.vlen.f, dxpl_id, &bg_hobjid, tmp_buf, NULL))
+                                        HGOTO_ERROR(H5E_DATATYPE, H5E_READERROR, FAIL, "can't read VL sequence into background buffer")
+                                } /* end if */
+
+                                /* If the sequence gets shorter, pad out the original sequence with zeros */
+                                if(bg_seq_len < seq_len)
+                                    HDmemset((uint8_t *)tmp_buf + dst_base_size * bg_seq_len, 0, (seq_len - bg_seq_len) * dst_base_size);
+                            } /* end if */
+
+                            /* Convert VL sequence */
+                            if(H5T_convert(tpath, tsrc_id, tdst_id, seq_len, (size_t)0, (size_t)0, conv_buf, tmp_buf, dxpl_id) < 0)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+                        } /* end if */
+
+                        /* Write sequence to destination location */
+                        if((*(dst->shared->u.vlen.write))(dst->shared->u.vlen.f, dxpl_id, vl_alloc_info, d, conv_buf, b, seq_len, dst_base_size) < 0)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "can't write VL data")
+
+                        if(!noop_conv) {
+                            /* For nested VL case, free leftover heap objects from the deeper level if the length of new data elements is shorter than the old data elements.*/
+                            if(nested && seq_len < bg_seq_len) {
+                                size_t parent_seq_len;
+                                const uint8_t *tmp;
+                                size_t u;
+
+                                /* TMP_P is reset each time in the loop because DST_BASE_SIZE may include some data in addition to VL info. - SLU */
+                                for(u = seq_len; u < bg_seq_len; u++) {
+                                    tmp = (uint8_t *)tmp_buf + u * dst_base_size;
+                                    UINT32DECODE(tmp, parent_seq_len);
+                                    if(parent_seq_len > 0) {
+                                        H5F_addr_decode(dst->shared->u.vlen.f, &tmp, &(parent_hobjid.addr));
+                                        UINT32DECODE(tmp, parent_hobjid.idx);
+                                        if(H5HG_remove(dst->shared->u.vlen.f, dxpl_id, &parent_hobjid) < 0)
+                                            HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "Unable to remove heap object")
+                                    } /* end if */
+                                } /* end for */
+                            } /* end if */
+                        } /* end if */
+                    } /* end else */
+
+                    /* Advance pointers */
+                    s += s_stride;
+                    d += d_stride;
+                    b += b_stride;
+                } /* end for */
+
+                /* Decrement number of elements left to convert */
+                nelmts -= safe;
+            } /* end while */
+
+            /* Release the temporary datatype IDs used */
+            if(tsrc_id >= 0)
+                H5I_dec_ref(tsrc_id);
+            if(tdst_id >= 0)
+                H5I_dec_ref(tdst_id);
+            break;
+
+        default:    /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    }   /* end switch */
+
+done:
+    /* If the conversion buffer doesn't need to be freed, reset its pointer */
+    if(write_to_file && noop_conv)
+        conv_buf = NULL;
+    /* Release the conversion buffer (always allocated, except on errors) */
+    if(conv_buf)
+        conv_buf = H5FL_BLK_FREE(vlen_seq, conv_buf);
+    /* Release the background buffer, if we have one */
+    if(tmp_buf)
+        tmp_buf = H5FL_BLK_FREE(vlen_seq, tmp_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_vlen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_array
+ *
+ * Purpose:	Converts between array datatypes in memory and on disk.
+ *		This is a soft conversion function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, November 6, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_array(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	      size_t buf_stride, size_t bkg_stride, void *_buf,
+              void H5_ATTR_UNUSED *_bkg, hid_t dxpl_id)
+{
+    H5T_path_t	*tpath;		        /* Type conversion path		     */
+    hid_t       tsrc_id = -1, tdst_id = -1;/*temporary type atoms	     */
+    H5T_t	*src = NULL;	        /*source datatype		     */
+    H5T_t	*dst = NULL;	        /*destination datatype		     */
+    uint8_t	*sp, *dp;	        /*source and dest traversal ptrs     */
+    ssize_t	src_delta, dst_delta;	/*source & destination stride	     */
+    int	        direction;		/*direction of traversal	     */
+    size_t	elmtno;			/*element number counter	     */
+    unsigned    u;                      /* local index variable */
+    void	*bkg_buf = NULL;     	/*temporary background buffer 	     */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch (cdata->command) {
+        case H5T_CONV_INIT:
+            /*
+             * First, determine if this conversion function applies to the
+             * conversion path SRC_ID-->DST_ID.  If not, return failure;
+             * otherwise initialize the `priv' field of `cdata' with
+             * information that remains (almost) constant for this
+             * conversion path.
+             */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            HDassert(H5T_ARRAY==src->shared->type);
+            HDassert(H5T_ARRAY==dst->shared->type);
+
+            /* Check the number and sizes of the dimensions */
+            if(src->shared->u.array.ndims != dst->shared->u.array.ndims)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "array datatypes do not have the same number of dimensions")
+            for(u = 0; u < src->shared->u.array.ndims; u++)
+                if(src->shared->u.array.dim[u] != dst->shared->u.array.dim[u])
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "array datatypes do not have the same sizes of dimensions")
+
+            /* Array datatypes don't need a background buffer */
+            cdata->need_bkg = H5T_BKG_NO;
+
+            break;
+
+        case H5T_CONV_FREE:
+            /* QAK - Nothing to do currently */
+            break;
+
+        case H5T_CONV_CONV:
+            /*
+             * Conversion.
+             */
+            if (NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /*
+             * Do we process the values from beginning to end or vice
+             * versa? Also, how many of the elements have the source and
+             * destination areas overlapping?
+             */
+            if(src->shared->size >= dst->shared->size || buf_stride > 0) {
+                sp = dp = (uint8_t*)_buf;
+                direction = 1;
+            } else {
+                sp = (uint8_t*)_buf + (nelmts - 1) *
+                     (buf_stride ? buf_stride : src->shared->size);
+                dp = (uint8_t*)_buf + (nelmts - 1) *
+                     (buf_stride ? buf_stride : dst->shared->size);
+                direction = -1;
+            }
+
+            /*
+             * Direction & size of buffer traversal.
+             */
+            H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+            src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
+            dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
+
+            /* Set up conversion path for base elements */
+            if(NULL == (tpath = H5T_path_find(src->shared->parent, dst->shared->parent, NULL, NULL, dxpl_id, FALSE))) {
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatypes")
+            } else if (!H5T_path_noop(tpath)) {
+                if((tsrc_id = H5I_register(H5I_DATATYPE, H5T_copy(src->shared->parent, H5T_COPY_ALL), FALSE)) < 0 ||
+                        (tdst_id = H5I_register(H5I_DATATYPE, H5T_copy(dst->shared->parent, H5T_COPY_ALL), FALSE)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+            }
+
+            /* Check if we need a background buffer for this conversion */
+            if(tpath->cdata.need_bkg) {
+                size_t	bkg_buf_size;	        /*size of background buffer in bytes */
+
+                /* Allocate background buffer */
+                bkg_buf_size = src->shared->u.array.nelem * MAX(src->shared->size, dst->shared->size);
+                if(NULL == (bkg_buf = H5FL_BLK_CALLOC(array_seq, bkg_buf_size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
+            } /* end if */
+
+            /* Perform the actual conversion */
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                /* Copy the source array into the correct location for the destination */
+                HDmemmove(dp, sp, src->shared->size);
+
+                /* Convert array */
+                if(H5T_convert(tpath, tsrc_id, tdst_id, src->shared->u.array.nelem, (size_t)0, bkg_stride, dp, bkg_buf, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+
+                /* Advance the source & destination pointers */
+                sp += src_delta;
+                dp += dst_delta;
+            } /* end for */
+
+            /* Release the temporary datatype IDs used */
+            if(tsrc_id >= 0)
+                H5I_dec_ref(tsrc_id);
+            if(tdst_id >= 0)
+                H5I_dec_ref(tdst_id);
+            break;
+
+        default:    /* Some other command we don't know about yet.*/
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    /* Release the background buffer, if we have one */
+    if(bkg_buf)
+        bkg_buf = H5FL_BLK_FREE(array_seq, bkg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_i_i
+ *
+ * Purpose:	Convert one integer type to another.  This is the catch-all
+ *		function for integer conversions and is probably not
+ *		particularly fast.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, June 10, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 7 Jul 1998
+ *		Added overflow handling.
+ *
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *
+ *              Raymond Lu
+ *              Wednesday, April 21, 2004
+ *              There is a new design for exception handling like overflow,
+ *              which is passed in as a transfer property.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_i_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+    hid_t dxpl_id)
+{
+    H5T_t	*src = NULL;		/*source datatype		*/
+    H5T_t	*dst = NULL;		/*destination datatype		*/
+    ssize_t	src_delta, dst_delta;	/*source & destination stride	*/
+    int		direction;		/*direction of traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	half_size;		/*half the type size		*/
+    size_t	olap;			/*num overlapping elements	*/
+    uint8_t	*s, *sp, *d, *dp;	/*source and dest traversal ptrs*/
+    uint8_t     *src_rev=NULL;          /*order-reversed source buffer  */
+    uint8_t	dbuf[64];		/*temp destination buffer	*/
+    size_t	first;
+    ssize_t	sfirst;			/*a signed version of `first'	*/
+    size_t	i;                      /*Local index variables         */
+    H5P_genplist_t      *plist;         /*property list pointer         */
+    H5T_conv_cb_t       cb_struct={NULL, NULL};      /*conversion callback structure */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    hbool_t             reverse;        /*if reverse the order of destination        */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(H5T_ORDER_LE != src->shared->u.atomic.order && H5T_ORDER_BE != src->shared->u.atomic.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(H5T_ORDER_LE != dst->shared->u.atomic.order && H5T_ORDER_BE != dst->shared->u.atomic.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(dst->shared->size > sizeof dbuf)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if (src->shared->size==dst->shared->size || buf_stride) {
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = nelmts;
+            } else if (src->shared->size>=dst->shared->size) {
+                double olap_d = HDceil((double)(dst->shared->size)/
+                                       (double)(src->shared->size-dst->shared->size));
+
+                olap = (size_t)olap_d;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olap_d = HDceil((double)(src->shared->size)/
+                                       (double)(dst->shared->size-src->shared->size));
+                olap = (size_t)olap_d;
+                sp = (uint8_t*)buf + (nelmts - 1) * src->shared->size;
+                dp = (uint8_t*)buf + (nelmts - 1) * dst->shared->size;
+                direction = -1;
+            }
+
+            /*
+             * Direction & size of buffer traversal.
+             */
+            H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+            src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
+            dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
+
+            /* Get the plist structure */
+            if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist,H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            /* Allocate space for order-reversed source buffer */
+            src_rev = (uint8_t*)H5MM_calloc(src->shared->size);
+
+            /* The conversion loop */
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if(direction > 0) {
+                    s = sp;
+                    d = elmtno < olap ? dbuf : dp;
+                } else {
+                    s = sp;
+                    d = elmtno + olap >= nelmts ? dbuf : dp;
+                }
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if (d==dbuf) {
+                    HDassert((dp>=sp && dp<sp+src->shared->size) || (sp>=dp && sp<dp+dst->shared->size));
+                } else {
+                    HDassert((dp<sp && dp+dst->shared->size<=sp) || (sp<dp && sp+src->shared->size<=dp));
+                }
+#endif
+
+                /*
+                 * Put the data in little endian order so our loops aren't so
+                 * complicated.  We'll do all the conversion stuff assuming
+                 * little endian and then we'll fix the order at the end.
+                 */
+                if (H5T_ORDER_BE==src->shared->u.atomic.order) {
+                    half_size = src->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        uint8_t tmp = s[src->shared->size-(i+1)];
+                        s[src->shared->size-(i+1)] = s[i];
+                        s[i] = tmp;
+                    }
+                }
+
+                /*
+                 * What is the bit number for the msb bit of S which is set? The
+                 * bit number is relative to the significant part of the number.
+                 */
+                sfirst = H5T__bit_find (s, src->shared->u.atomic.offset, src->shared->u.atomic.prec,
+                                       H5T_BIT_MSB, TRUE);
+                first = (size_t)sfirst;
+
+                /* Set these variables to default */
+                except_ret = H5T_CONV_UNHANDLED;
+                reverse    = TRUE;
+
+                if (sfirst<0) {
+                    /*
+                     * The source has no bits set and must therefore be zero.
+                     * Set the destination to zero.
+                     */
+                    H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, FALSE);
+
+                } else if (H5T_SGN_NONE==src->shared->u.atomic.u.i.sign &&
+                           H5T_SGN_NONE==dst->shared->u.atomic.u.i.sign) {
+                    /*
+                     * Source and destination are both unsigned, but if the
+                     * source has more precision bits than the destination then
+                     * it's possible to overflow.  When overflow occurs the
+                     * destination will be set to the maximum possible value.
+                     */
+                    if (src->shared->u.atomic.prec <= dst->shared->u.atomic.prec) {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              src->shared->u.atomic.prec);
+                        H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
+                             dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
+                    } else if (first>=dst->shared->u.atomic.prec) {
+                        /*overflow*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, TRUE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              dst->shared->u.atomic.prec);
+                    }
+
+                } else if (H5T_SGN_2==src->shared->u.atomic.u.i.sign &&
+                           H5T_SGN_NONE==dst->shared->u.atomic.u.i.sign) {
+                    /*
+                     * If the source is signed and the destination isn't then we
+                     * can have overflow if the source contains more bits than
+                     * the destination (destination is set to the maximum
+                     * possible value) or overflow if the source is negative
+                     * (destination is set to zero).
+                     */
+                    if (first+1 == src->shared->u.atomic.prec) {
+                        /*overflow - source is negative*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, FALSE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else if (src->shared->u.atomic.prec < dst->shared->u.atomic.prec) {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              src->shared->u.atomic.prec-1);
+                        H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec-1,
+                             (dst->shared->u.atomic.prec-src->shared->u.atomic.prec)+1, FALSE);
+                    } else if (first>=dst->shared->u.atomic.prec) {
+                        /*overflow - source is positive*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED)
+                            H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, TRUE);
+                        else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              dst->shared->u.atomic.prec);
+                    }
+
+                } else if (H5T_SGN_NONE==src->shared->u.atomic.u.i.sign &&
+                           H5T_SGN_2==dst->shared->u.atomic.u.i.sign) {
+                    /*
+                     * If the source is not signed but the destination is then
+                     * overflow can occur in which case the destination is set to
+                     * the largest possible value (all bits set except the msb).
+                     */
+                    if (first+1 >= dst->shared->u.atomic.prec) {
+                        /*overflow*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, TRUE);
+                            H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, FALSE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              src->shared->u.atomic.prec);
+                        H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
+                             dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
+                    } else {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              dst->shared->u.atomic.prec);
+                    }
+                } else if (first+1 == src->shared->u.atomic.prec) {
+                    /*
+                     * Both the source and the destination are signed and the
+                     * source value is negative.  We could experience overflow
+                     * if the destination isn't wide enough in which case the
+                     * destination is set to a negative number with the largest
+                     * possible magnitude.
+                     */
+                    ssize_t sfz = H5T__bit_find (s, src->shared->u.atomic.offset,
+                                    src->shared->u.atomic.prec-1, H5T_BIT_MSB, FALSE);
+                    size_t fz = (size_t)sfz;
+
+                    if (sfz>=0 && fz+1>=dst->shared->u.atomic.prec) {
+                        /*overflow*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, FALSE);
+                            H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, TRUE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset, src->shared->u.atomic.prec);
+                        H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec, dst->shared->u.atomic.prec-src->shared->u.atomic.prec, TRUE);
+                    } else {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset, dst->shared->u.atomic.prec);
+                    }
+
+                } else {
+                    /*
+                     * Source and destination are both signed but the source
+                     * value is positive.  We could have an overflow in which
+                     * case the destination is set to the largest possible
+                     * positive value.
+                     */
+                    if (first+1>=dst->shared->u.atomic.prec) {
+                        /*overflow*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order); /*reverse order first*/
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id, src_rev, d,
+                                    cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, TRUE);
+                            H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, FALSE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED)
+                            /*Don't reverse because user handles it already*/
+                            reverse = FALSE;
+                    } else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              src->shared->u.atomic.prec);
+                        H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
+                             dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
+                    } else {
+                        H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
+                              dst->shared->u.atomic.prec);
+                    }
+                }
+
+                /*
+                 * Set padding areas in destination.
+                 */
+                if (dst->shared->u.atomic.offset>0) {
+                    HDassert(H5T_PAD_ZERO==dst->shared->u.atomic.lsb_pad || H5T_PAD_ONE==dst->shared->u.atomic.lsb_pad);
+                    H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, (hbool_t)(H5T_PAD_ONE==dst->shared->u.atomic.lsb_pad));
+                }
+                if (dst->shared->u.atomic.offset+dst->shared->u.atomic.prec!=8*dst->shared->size) {
+                    HDassert(H5T_PAD_ZERO==dst->shared->u.atomic.msb_pad || H5T_PAD_ONE==dst->shared->u.atomic.msb_pad);
+                    H5T__bit_set (d, dst->shared->u.atomic.offset+dst->shared->u.atomic.prec,
+                                 8*dst->shared->size - (dst->shared->u.atomic.offset+ dst->shared->u.atomic.prec),
+                                 (hbool_t)(H5T_PAD_ONE==dst->shared->u.atomic.msb_pad));
+                }
+
+                /*
+                 * Put the destination in the correct byte order.  See note at
+                 * beginning of loop.
+                 */
+                if (H5T_ORDER_BE==dst->shared->u.atomic.order && reverse) {
+                    half_size = dst->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        uint8_t tmp = d[dst->shared->size-(i+1)];
+                        d[dst->shared->size-(i+1)] = d[i];
+                        d[i] = tmp;
+                    }
+                }
+
+                /*
+                 * If we had used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+                if(d==dbuf)
+                    HDmemcpy(dp, d, dst->shared->size);
+
+                /* Advance source & destination pointers by delta amounts */
+                sp += src_delta;
+                dp += dst_delta;
+            } /* end for */
+
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    if(src_rev)
+        H5MM_free(src_rev);
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_i_i() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_f_f
+ *
+ * Purpose:	Convert one floating point type to another.  This is a catch
+ *		all for floating point conversions and is probably not
+ *		particularly fast!
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, June 23, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 7 Jul 1998
+ *		Added overflow handling.
+ *
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *
+ *              Robb Matzke, 2001-02-02
+ *              Oops, forgot to increment the exponent when rounding the
+ *              significand resulted in a carry. Thanks to Guillaume Colin
+ *              de Verdiere for finding this one!
+ *
+ *              Raymond Lu, 2006-03-13
+ *              Added support for VAX floating-point types.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+    hid_t dxpl_id)
+{
+    /* Traversal-related variables */
+    H5T_t	*src_p;			/*source datatype		*/
+    H5T_t	*dst_p;			/*destination datatype		*/
+    H5T_atomic_t src;			/*atomic source info		*/
+    H5T_atomic_t dst;			/*atomic destination info	*/
+    ssize_t	src_delta, dst_delta;	/*source & destination stride	*/
+    int	direction;		        /*forward or backward traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	half_size;		/*half the type size		*/
+    size_t      tsize;                  /*type size for swapping bytes  */
+    size_t	olap;			/*num overlapping elements	*/
+    ssize_t	bitno = 0;		/*bit number			*/
+    uint8_t	*s, *sp, *d, *dp;	/*source and dest traversal ptrs*/
+    uint8_t     *src_rev = NULL;        /*order-reversed source buffer  */
+    uint8_t	dbuf[64];		/*temp destination buffer	*/
+    uint8_t     tmp1, tmp2;             /*temp variables for swapping bytes*/
+
+    /* Conversion-related variables */
+    int64_t	expo;			/*exponent			*/
+    hssize_t	expo_max;		/*maximum possible dst exponent	*/
+    size_t	msize = 0;		/*useful size of mantissa in src*/
+    size_t	mpos;			/*offset to useful mant is src	*/
+    uint64_t    sign;                   /*source sign bit value         */
+    size_t	mrsh;			/*amount to right shift mantissa*/
+    hbool_t	carry = 0;		/*carry after rounding mantissa	*/
+    size_t	i;			/*miscellaneous counters	*/
+    size_t	implied;		/*destination implied bits	*/
+    hbool_t     denormalized = FALSE;   /*is either source or destination denormalized?*/
+    H5P_genplist_t      *plist;         /*property list pointer         */
+    H5T_conv_cb_t       cb_struct = {NULL, NULL};      /*conversion callback structure */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    hbool_t             reverse;        /*if reverse the order of destination        */
+    herr_t      ret_value = SUCCEED;    /*return value                 */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+            if(H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(dst_p->shared->size > sizeof(dbuf))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
+            if(8 * sizeof(expo) - 1 < src.u.f.esize || 8 * sizeof(expo) - 1 < dst.u.f.esize)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+            expo_max = ((hssize_t)1 << dst.u.f.esize) - 1;
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if (src_p->shared->size==dst_p->shared->size || buf_stride) {
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = nelmts;
+            } else if (src_p->shared->size>=dst_p->shared->size) {
+                double olap_d = HDceil((double)(dst_p->shared->size)/
+                                       (double)(src_p->shared->size-dst_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olap_d = HDceil((double)(src_p->shared->size)/
+                                       (double)(dst_p->shared->size-src_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
+                dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
+                direction = -1;
+            }
+
+            /*
+             * Direction & size of buffer traversal.
+             */
+            H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t);
+            src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size);
+            dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size);
+
+            /* Get the plist structure */
+            if(NULL == (plist = H5P_object_verify(dxpl_id,H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist,H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            /* Allocate space for order-reversed source buffer */
+            src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
+
+            /* The conversion loop */
+            for (elmtno=0; elmtno<nelmts; elmtno++) {
+                /* Set these variables to default */
+                except_ret = H5T_CONV_UNHANDLED;
+                reverse    = TRUE;
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if (direction>0) {
+                    s = sp;
+                    d = elmtno<olap ? dbuf : dp;
+                } else {
+                    s = sp;
+                    d = elmtno+olap >= nelmts ? dbuf : dp;
+                }
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if (d==dbuf) {
+                    HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
+                            (sp>=dp && sp<dp+dst_p->shared->size));
+                } else {
+                    HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
+                            (sp<dp && sp+src_p->shared->size<=dp));
+                }
+#endif
+
+                /*
+                 * Put the data in little endian order so our loops aren't so
+                 * complicated.  We'll do all the conversion stuff assuming
+                 * little endian and then we'll fix the order at the end.
+                 */
+                if (H5T_ORDER_BE==src.order) {
+                    half_size = src_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        tmp1 = s[src_p->shared->size-(i+1)];
+                        s[src_p->shared->size-(i+1)] = s[i];
+                        s[i] = tmp1;
+                    }
+                } else if (H5T_ORDER_VAX==src.order) {
+                    tsize = src_p->shared->size;
+                    HDassert(0 == tsize % 2);
+
+                    for (i = 0; i < tsize; i += 4) {
+                        tmp1 = s[i];
+                        tmp2 = s[i+1];
+
+                        s[i] = s[(tsize-2)-i];
+                        s[i+1] = s[(tsize-1)-i];
+
+                        s[(tsize-2)-i] = tmp1;
+                        s[(tsize-1)-i] = tmp2;
+                    }
+                }
+
+                /*
+                 * Find the sign bit value of the source.
+                 */
+                sign = H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
+
+                /*
+                 * Check for special cases: +0, -0, +Inf, -Inf, NaN
+                 */
+                if (H5T__bit_find (s, src.u.f.mpos, src.u.f.msize,
+                                  H5T_BIT_LSB, TRUE)<0) {
+                    if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                      H5T_BIT_LSB, TRUE)<0) {
+                        /* +0 or -0 */
+                        H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
+                        H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, FALSE);
+                        H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                        goto padding;
+                    } else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                             H5T_BIT_LSB, FALSE)<0) {
+                        /* +Inf or -Inf */
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            /*reverse order first*/
+                            H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                            if(sign)
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
+                                    src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            else
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
+                                    src_id, dst_id, src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
+                            H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
+                            H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                            /*If the destination no implied mantissa bit, we'll need to set
+                             *the 1st bit of mantissa to 1.  The Intel-Linux long double is
+                             *this case.*/
+                            if (H5T_NORM_NONE==dst.u.f.norm)
+                                H5T__bit_set (d, dst.u.f.mpos+dst.u.f.msize-1, (size_t)1, TRUE);
+                        } else if(except_ret == H5T_CONV_HANDLED) {
+                            /*No need to reverse the order of destination because user handles it*/
+                            reverse = FALSE;
+                            goto next;
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+
+                        goto padding;
+                    }
+                } else if (H5T_NORM_NONE==src.u.f.norm && H5T__bit_find (s, src.u.f.mpos, src.u.f.msize-1,
+                                  H5T_BIT_LSB, TRUE)<0 && H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                  H5T_BIT_LSB, FALSE)<0) {
+                    /*This is a special case for the source of no implied mantissa bit.
+                     *If the exponent bits are all 1s and only the 1st bit of mantissa
+                     *is set to 1.  It's infinity. The Intel-Linux "long double" is this case.*/
+                    /* +Inf or -Inf */
+                    if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                        /*reverse order first*/
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                        if(sign)
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
+                                src_id, dst_id, src_rev, d, cb_struct.user_data);
+                        else
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
+                                src_id, dst_id, src_rev, d, cb_struct.user_data);
+                    }
+
+                    if(except_ret == H5T_CONV_UNHANDLED) {
+                        H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
+                        H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
+                        H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                        /*If the destination no implied mantissa bit, we'll need to set
+                         *the 1st bit of mantissa to 1.  The Intel-Linux long double is
+                         *this case.*/
+                        if (H5T_NORM_NONE==dst.u.f.norm)
+                            H5T__bit_set (d, dst.u.f.mpos+dst.u.f.msize-1, (size_t)1, TRUE);
+                    } else if(except_ret == H5T_CONV_HANDLED) {
+                        /*No need to reverse the order of destination because user handles it*/
+                        reverse = FALSE;
+                        goto next;
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+
+                    goto padding;
+                /* Temporary solution to handle VAX special values.
+                 * Note that even though we don't support VAX anymore, we
+                 * still need to handle legacy VAX files so this code must
+                 * remain in place.
+                 */
+                } else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                         H5T_BIT_LSB, FALSE)<0) {
+                    /* NaN */
+                    if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                        /*reverse order first*/
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NAN,
+                                src_id, dst_id, src_rev, d, cb_struct.user_data);
+                    }
+
+                    if(except_ret == H5T_CONV_UNHANDLED) {
+                        /* There are many NaN values, so we just set all bits of
+                         * the significand. */
+                        H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
+                        H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
+                        H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, TRUE);
+                    } else if(except_ret == H5T_CONV_HANDLED) {
+                        /*No need to reverse the order of destination because user handles it*/
+                        reverse = FALSE;
+                        goto next;
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+
+                    goto padding;
+                }
+
+                /*
+                 * Get the exponent as an unsigned quantity from the section of
+                 * the source bit field where it's located.	 Don't worry about
+                 * the exponent bias yet.
+                 */
+                expo = (int64_t)H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
+
+                if(expo==0)
+                   denormalized=TRUE;
+
+                /*
+                 * Set markers for the source mantissa, excluding the leading `1'
+                 * (might be implied).
+                 */
+                implied = 1;
+                mpos = src.u.f.mpos;
+                mrsh = 0;
+                if(0 == expo || H5T_NORM_NONE == src.u.f.norm) {
+                    if((bitno = H5T__bit_find(s, src.u.f.mpos, src.u.f.msize, H5T_BIT_MSB, TRUE)) > 0) {
+                        msize = (size_t)bitno;
+                    } else if (0==bitno) {
+                        msize = 1;
+                        H5T__bit_set(s, src.u.f.mpos, (size_t)1, FALSE);
+                    }
+                } else if (H5T_NORM_IMPLIED==src.u.f.norm) {
+                    msize = src.u.f.msize;
+                } else {
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
+                }
+
+                /*
+                 * The sign for the destination is the same as the sign for the
+                 * source in all cases.
+                 */
+                H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
+
+                /*
+                 * Calculate the true source exponent by adjusting according to
+                 * the source exponent bias.
+                 */
+                if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
+                    HDassert(bitno>=0);
+                    expo -= (int64_t)((src.u.f.ebias - 1) + (src.u.f.msize - (size_t)bitno));
+                } else if (H5T_NORM_IMPLIED==src.u.f.norm) {
+                    expo -= (int64_t)src.u.f.ebias;
+                } else {
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
+                }
+
+                /*
+                 * If the destination is not normalized then right shift the
+                 * mantissa by one.
+                 */
+                if (H5T_NORM_NONE==dst.u.f.norm)
+                    mrsh++;
+
+                /*
+                 * Calculate the destination exponent by adding the destination
+                 * bias and clipping by the minimum and maximum possible
+                 * destination exponent values.
+                 */
+                expo += (int64_t)dst.u.f.ebias;
+
+                if (expo < -(hssize_t)(dst.u.f.msize)) {
+                    /* The exponent is way too small.  Result is zero. */
+                    expo = 0;
+                    H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                    msize = 0;
+                } else if (expo<=0) {
+                    /*
+                     * The exponent is too small to fit in the exponent field,
+                     * but by shifting the mantissa to the right we can
+                     * accomodate that value.  The mantissa of course is no
+                     * longer normalized.
+                     */
+                    mrsh += (size_t)(1 - expo);
+                    expo = 0;
+                    denormalized=TRUE;
+                } else if (expo>=expo_max) {
+                    /*
+                     * The exponent is too large to fit in the available region
+                     * or it results in the maximum possible value.	 Use positive
+                     * or negative infinity instead unless the application
+                     * specifies something else.  Before calling the overflow
+                     * handler make sure the source buffer we hand it is in the
+                     * original byte order.
+                     */
+                    if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                        /*reverse order first*/
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                src_rev, d, cb_struct.user_data);
+                    }
+
+                    if(except_ret == H5T_CONV_UNHANDLED) {
+                        expo = expo_max;
+                        H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                        msize = 0;
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    else if(except_ret == H5T_CONV_HANDLED) {
+                        reverse = FALSE;
+                        goto next;
+                    }
+                }
+
+                /*
+                 * If the destination mantissa is smaller than the source
+                 * mantissa then round the source mantissa. Rounding may cause a
+                 * carry in which case the exponent has to be re-evaluated for
+                 * overflow.  That is, if `carry' is clear then the implied
+                 * mantissa bit is `1', else it is `10' binary.
+                 */
+                if (msize>0 && mrsh<=dst.u.f.msize && mrsh+msize>dst.u.f.msize) {
+                    bitno = (ssize_t)(mrsh + msize - dst.u.f.msize);
+                    HDassert(bitno >= 0 && (size_t)bitno <= msize);
+                    /* If the 1st bit being cut off is set and source isn't denormalized.*/
+                    if(H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && !denormalized) {
+                        /* Don't do rounding if exponent is 111...110 and mantissa is 111...11.
+                         * To do rounding and increment exponent in this case will create an infinity value.*/
+                        if((H5T__bit_find(s, mpos + (size_t)bitno, msize - (size_t)bitno, H5T_BIT_LSB, FALSE) >= 0 || expo < expo_max - 1)) {
+                            carry = (hbool_t)H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
+                            if(carry)
+                                implied = 2;
+                        }
+                    } else if(H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && denormalized)
+                        /* For either source or destination, denormalized value doesn't increment carry.*/
+                        H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
+                }
+                else
+                    carry=0;
+
+                /*
+                 * Write the mantissa to the destination
+                 */
+                if (mrsh>dst.u.f.msize+1) {
+                    H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                } else if (mrsh==dst.u.f.msize+1) {
+                    H5T__bit_set(d, dst.u.f.mpos+1, dst.u.f.msize-1, FALSE);
+                    H5T__bit_set(d, dst.u.f.mpos, (size_t)1, TRUE);
+                } else if (mrsh==dst.u.f.msize) {
+                    H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                    H5T__bit_set_d(d, dst.u.f.mpos, MIN(2, dst.u.f.msize), (hsize_t)implied);
+                } else {
+                    if (mrsh>0) {
+                        H5T__bit_set(d, dst.u.f.mpos+dst.u.f.msize-mrsh, mrsh,
+                                    FALSE);
+                        H5T__bit_set_d(d, dst.u.f.mpos+dst.u.f.msize-mrsh, (size_t)2,
+                                      (hsize_t)implied);
+                    }
+                    if (mrsh+msize>=dst.u.f.msize) {
+                        H5T__bit_copy(d, dst.u.f.mpos,
+                                     s, (mpos+msize+mrsh-dst.u.f.msize),
+                                     dst.u.f.msize-mrsh);
+                    } else {
+                        H5T__bit_copy(d, dst.u.f.mpos+dst.u.f.msize-(mrsh+msize),
+                                     s, mpos, msize);
+                        H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize-(mrsh+msize),
+                                    FALSE);
+                    }
+                }
+
+                /* Write the exponent */
+                if (carry) {
+                    expo++;
+                    if (expo>=expo_max) {
+                        /*
+                         * The exponent is too large to fit in the available
+                         * region or it results in the maximum possible value.
+                         * Use positive or negative infinity instead unless the
+                         * application specifies something else.  Before
+                         * calling the overflow handler make sure the source
+                         * buffer we hand it is in the original byte order.
+                         */
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            /*reverse order first*/
+                            H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                    src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            expo = expo_max;
+                            H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED) {
+                            reverse = FALSE;
+                            goto next;
+                        }
+                    }
+                }
+                /*reset CARRY*/
+                carry = 0;
+
+                H5_CHECK_OVERFLOW(expo,hssize_t,hsize_t);
+                H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, (hsize_t)expo);
+
+            padding:
+
+                /*
+                 * Set external padding areas
+                 */
+                if (dst.offset>0) {
+                    HDassert(H5T_PAD_ZERO==dst.lsb_pad || H5T_PAD_ONE==dst.lsb_pad);
+                    H5T__bit_set (d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
+                }
+                if (dst.offset+dst.prec!=8*dst_p->shared->size) {
+                    HDassert(H5T_PAD_ZERO==dst.msb_pad || H5T_PAD_ONE==dst.msb_pad);
+                    H5T__bit_set (d, dst.offset+dst.prec, 8*dst_p->shared->size - (dst.offset+dst.prec),
+                         (hbool_t)(H5T_PAD_ONE==dst.msb_pad));
+                }
+
+                /*
+                 * Put the destination in the correct byte order.  See note at
+                 * beginning of loop.
+                 */
+                if (H5T_ORDER_BE==dst.order && reverse) {
+                    half_size = dst_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        uint8_t tmp = d[dst_p->shared->size-(i+1)];
+                        d[dst_p->shared->size-(i+1)] = d[i];
+                        d[i] = tmp;
+                    }
+                } else if (H5T_ORDER_VAX==dst.order && reverse) {
+                    tsize = dst_p->shared->size;
+                    HDassert(0 == tsize % 2);
+
+                    for (i = 0; i < tsize; i += 4) {
+                        tmp1 = d[i];
+                        tmp2 = d[i+1];
+
+                        d[i] = d[(tsize-2)-i];
+                        d[i+1] = d[(tsize-1)-i];
+
+                        d[(tsize-2)-i] = tmp1;
+                        d[(tsize-1)-i] = tmp2;
+                    }
+                }
+
+                /*
+                 * If we had used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+            next:
+                if(d == dbuf)
+                    HDmemcpy(dp, d, dst_p->shared->size);
+
+                /* Advance source & destination pointers by delta amounts */
+                sp += src_delta;
+                dp += dst_delta;
+            }
+
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    if(src_rev)
+        H5MM_free(src_rev);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_f_f() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_s_s
+ *
+ * Purpose:	Convert one fixed-length string type to another.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, August	7, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *
+ *              Raymond Lu, 8 November 2011
+ *              I put a condition check to prevent the conversion of strings
+ *              between ASCII and UTF8.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_s_s(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+	      size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf,
+              void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_t	*src=NULL;		/*source datatype		*/
+    H5T_t	*dst=NULL;		/*destination datatype		*/
+    ssize_t	src_delta, dst_delta;	/*source & destination stride	*/
+    int	        direction;		/*direction of traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	olap;			/*num overlapping elements	*/
+    size_t	nchars=0;		/*number of characters copied	*/
+    uint8_t	*s, *sp, *d, *dp;	/*src and dst traversal pointers*/
+    uint8_t	*dbuf=NULL;		/*temp buf for overlap convers.	*/
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            if(8 * src->shared->size != src->shared->u.atomic.prec || 8 * dst->shared->size != dst->shared->u.atomic.prec)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad precision")
+            if(0 != src->shared->u.atomic.offset || 0 != dst->shared->u.atomic.offset)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad offset")
+            if(H5T_CSET_ASCII != src->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 != src->shared->u.atomic.u.s.cset)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad source character set")
+            if(H5T_CSET_ASCII != dst->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 != dst->shared->u.atomic.u.s.cset)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad destination character set")
+            if((H5T_CSET_ASCII == src->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 == dst->shared->u.atomic.u.s.cset) 
+                    || (H5T_CSET_ASCII == dst->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 == src->shared->u.atomic.u.s.cset))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "The library doesn't convert between strings of ASCII and UTF")
+            if(src->shared->u.atomic.u.s.pad < 0 || src->shared->u.atomic.u.s.pad >= H5T_NSTR ||
+                    dst->shared->u.atomic.u.s.pad < 0 || dst->shared->u.atomic.u.s.pad >= H5T_NSTR)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad character padding")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if (src->shared->size==dst->shared->size || buf_stride) {
+                /*
+                 * When the source and destination are the same size we can do
+                 * all the conversions in place.
+                 */
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = 0;
+            } else if (src->shared->size>=dst->shared->size) {
+                double olapd = HDceil((double)(dst->shared->size)/
+                          (double)(src->shared->size-dst->shared->size));
+                olap = (size_t)olapd;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olapd = HDceil((double)(src->shared->size)/
+                          (double)(dst->shared->size-src->shared->size));
+                olap = (size_t)olapd;
+                sp = (uint8_t*)buf + (nelmts-1) * src->shared->size;
+                dp = (uint8_t*)buf + (nelmts-1) * dst->shared->size;
+                direction = -1;
+            }
+
+            /*
+             * Direction & size of buffer traversal.
+             */
+            H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
+            H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
+            src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
+            dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
+
+            /* Allocate the overlap buffer */
+            if(NULL == (dbuf = (uint8_t *)H5MM_malloc(dst->shared->size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for string conversion")
+
+            /* The conversion loop. */
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if(direction > 0) {
+                    s = sp;
+                    d = elmtno < olap ? dbuf : dp;
+                } else {
+                    s = sp;
+                    d = elmtno + olap >= nelmts ? dbuf : dp;
+                }
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if (src->shared->size==dst->shared->size || buf_stride) {
+                    HDassert(s==d);
+                } else if (d==dbuf) {
+                    HDassert((dp>=sp && dp<sp+src->shared->size) ||
+                       (sp>=dp && sp<dp+dst->shared->size));
+                } else {
+                    HDassert((dp<sp && dp+dst->shared->size<=sp) ||
+                       (sp<dp && sp+src->shared->size<=dp));
+                }
+#endif
+
+                /* Copy characters from source to destination */
+                switch(src->shared->u.atomic.u.s.pad) {
+                    case H5T_STR_NULLTERM:
+                        for (nchars=0;
+                             nchars<dst->shared->size && nchars<src->shared->size && s[nchars];
+                             nchars++) {
+                            d[nchars] = s[nchars];
+                        }
+                        break;
+
+                    case H5T_STR_NULLPAD:
+                        for (nchars=0;
+                             nchars<dst->shared->size && nchars<src->shared->size && s[nchars];
+                             nchars++) {
+                            d[nchars] = s[nchars];
+                        }
+                        break;
+
+                    case H5T_STR_SPACEPAD:
+                        nchars = src->shared->size;
+                        while (nchars>0 && ' '==s[nchars-1])
+                            --nchars;
+                        nchars = MIN(dst->shared->size, nchars);
+                        if(d != s)
+                            HDmemcpy(d, s, nchars);
+                        break;
+
+                    case H5T_STR_RESERVED_3:
+                    case H5T_STR_RESERVED_4:
+                    case H5T_STR_RESERVED_5:
+                    case H5T_STR_RESERVED_6:
+                    case H5T_STR_RESERVED_7:
+                    case H5T_STR_RESERVED_8:
+                    case H5T_STR_RESERVED_9:
+                    case H5T_STR_RESERVED_10:
+                    case H5T_STR_RESERVED_11:
+                    case H5T_STR_RESERVED_12:
+                    case H5T_STR_RESERVED_13:
+                    case H5T_STR_RESERVED_14:
+                    case H5T_STR_RESERVED_15:
+                    case H5T_STR_ERROR:
+                    default:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "source string padding method not supported")
+                } /* end switch */
+
+                /* Terminate or pad the destination */
+                switch(dst->shared->u.atomic.u.s.pad) {
+                    case H5T_STR_NULLTERM:
+                        while(nchars < dst->shared->size)
+                            d[nchars++] = '\0';
+                        d[dst->shared->size - 1] = '\0';
+                        break;
+
+                    case H5T_STR_NULLPAD:
+                        while(nchars < dst->shared->size)
+                            d[nchars++] = '\0';
+                        break;
+
+                    case H5T_STR_SPACEPAD:
+                        while(nchars < dst->shared->size)
+                            d[nchars++] = ' ';
+                        break;
+
+                    case H5T_STR_RESERVED_3:
+                    case H5T_STR_RESERVED_4:
+                    case H5T_STR_RESERVED_5:
+                    case H5T_STR_RESERVED_6:
+                    case H5T_STR_RESERVED_7:
+                    case H5T_STR_RESERVED_8:
+                    case H5T_STR_RESERVED_9:
+                    case H5T_STR_RESERVED_10:
+                    case H5T_STR_RESERVED_11:
+                    case H5T_STR_RESERVED_12:
+                    case H5T_STR_RESERVED_13:
+                    case H5T_STR_RESERVED_14:
+                    case H5T_STR_RESERVED_15:
+                    case H5T_STR_ERROR:
+                    default:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination string padding method not supported")
+                } /* end switch */
+
+                /*
+                 * If we used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+                if(d == dbuf)
+                    HDmemcpy(dp, d, dst->shared->size);
+
+                /* Advance source & destination pointers by delta amounts */
+                sp += src_delta;
+                dp += dst_delta;
+            } /* end for */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown converson command")
+    } /* end switch */
+
+done:
+    H5MM_xfree(dbuf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_s_s() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_uchar
+ *
+ * Purpose:	Converts `signed char' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_su(SCHAR, UCHAR, signed char, unsigned char, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_schar
+ *
+ * Purpose:	Converts `unsigned char' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_us(UCHAR, SCHAR, unsigned char, signed char, -, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_short
+ *
+ * Purpose:	Converts `signed char' to `short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SCHAR, SHORT, signed char, short, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_ushort
+ *
+ * Purpose:	Converts `signed char' to `unsigned short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SCHAR, USHORT, signed char, unsigned short, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_short
+ *
+ * Purpose:	Converts `unsigned char' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UCHAR, SHORT, unsigned char, short, -, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_ushort
+ *
+ * Purpose:	Converts `unsigned char' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UCHAR, USHORT, unsigned char, unsigned short, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_int
+ *
+ * Purpose:	Converts `signed char' to `int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SCHAR, INT, signed char, int, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_uint
+ *
+ * Purpose:	Converts `signed char' to `unsigned int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SCHAR, UINT, signed char, unsigned, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_int
+ *
+ * Purpose:	Converts `unsigned char' to `int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UCHAR, INT, unsigned char, int, -, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_uint
+ *
+ * Purpose:	Converts `unsigned char' to `unsigned int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UCHAR, UINT, unsigned char, unsigned, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_long
+ *
+ * Purpose:	Converts `signed char' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SCHAR, LONG, signed char, long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_ulong
+ *
+ * Purpose:	Converts `signed char' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SCHAR, ULONG, signed char, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_long
+ *
+ * Purpose:	Converts `unsigned char' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UCHAR, LONG, unsigned char, long, -, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_ulong
+ *
+ * Purpose:	Converts `unsigned char' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UCHAR, ULONG, unsigned char, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_llong
+ *
+ * Purpose:	Converts `signed char' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SCHAR, LLONG, signed char, long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_ullong
+ *
+ * Purpose:	Converts `signed char' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SCHAR, ULLONG, signed char, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_llong
+ *
+ * Purpose:	Converts `unsigned char' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UCHAR, LLONG, unsigned char, long long, -, LLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_ullong
+ *
+ * Purpose:	Converts `unsigned char' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UCHAR, ULLONG, unsigned char, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_schar
+ *
+ * Purpose:	Converts `short' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(SHORT, SCHAR, short, signed char, SCHAR_MIN, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_uchar
+ *
+ * Purpose:	Converts `short' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(SHORT, UCHAR, short, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_schar
+ *
+ * Purpose:	Converts `unsigned short' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(USHORT, SCHAR, unsigned short, signed char, -, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_uchar
+ *
+ * Purpose:	Converts `unsigned short' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(USHORT, UCHAR, unsigned short, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_ushort
+ *
+ * Purpose:	Converts `short' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_su(SHORT, USHORT, short, unsigned short, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_short
+ *
+ * Purpose:	Converts `unsigned short' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_us(USHORT, SHORT, unsigned short, short, -, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_int
+ *
+ * Purpose:	Converts `short' to `int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride,
+                   size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		   hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SHORT, INT, short, int, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_uint
+ *
+ * Purpose:	Converts `short' to `unsigned int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SHORT, UINT, short, unsigned, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_int
+ *
+ * Purpose:	Converts `unsigned short' to `int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(USHORT, INT, unsigned short, int, -, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_uint
+ *
+ * Purpose:	Converts `unsigned short' to `unsigned int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(USHORT, UINT, unsigned short, unsigned, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_long
+ *
+ * Purpose:	Converts `short' to `long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SHORT, LONG, short, long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_ulong
+ *
+ * Purpose:	Converts `short' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SHORT, ULONG, short, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_long
+ *
+ * Purpose:	Converts `unsigned short' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(USHORT, LONG, unsigned short, long, -, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_ulong
+ *
+ * Purpose:	Converts `unsigned short' to `unsigned long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(USHORT, ULONG, unsigned short, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_llong
+ *
+ * Purpose:	Converts `short' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(SHORT, LLONG, short, long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_ullong
+ *
+ * Purpose:	Converts `short' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(SHORT, ULLONG, short, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_llong
+ *
+ * Purpose:	Converts `unsigned short' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(USHORT, LLONG, unsigned short, long long, -, LLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_ullong
+ *
+ * Purpose:	Converts `unsigned short' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(USHORT, ULLONG, unsigned short, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_schar
+ *
+ * Purpose:	Converts `int' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride,
+                   size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		   hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(INT, SCHAR, int, signed char, SCHAR_MIN, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_uchar
+ *
+ * Purpose:	Converts `int' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride,
+                   size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		   hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(INT, UCHAR, int, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_schar
+ *
+ * Purpose:	Converts `unsigned int' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(UINT, SCHAR, unsigned, signed char, -, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_uchar
+ *
+ * Purpose:	Converts `unsigned int' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(UINT, UCHAR, unsigned, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_short
+ *
+ * Purpose:	Converts `int' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride,
+                   size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		   hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(INT, SHORT, int, short, SHRT_MIN, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_ushort
+ *
+ * Purpose:	Converts `int' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(INT, USHORT, int, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_short
+ *
+ * Purpose:	Converts `unsigned int' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride,
+                    size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(UINT, SHORT, unsigned, short, -, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_ushort
+ *
+ * Purpose:	Converts `unsigned int' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(UINT, USHORT, unsigned, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_uint
+ *
+ * Purpose:	Converts `int' to `unsigned int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		  size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                  void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_su(INT, UINT, int, unsigned, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_int
+ *
+ * Purpose:	Converts `unsigned int' to `int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		  size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                  void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_us(UINT, INT, unsigned, int, -, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_long
+ *
+ * Purpose:	Converts `int' to `long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		  size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                  void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(INT, LONG, int, long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_ulong
+ *
+ * Purpose:	Converts `int' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(INT, LONG, int, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_long
+ *
+ * Purpose:	Converts `unsigned int' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UINT, LONG, unsigned, long, -, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_ulong
+ *
+ * Purpose:	Converts `unsigned int' to `unsigned long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UINT, ULONG, unsigned, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_llong
+ *
+ * Purpose:	Converts `int' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(INT, LLONG, int, long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_ullong
+ *
+ * Purpose:	Converts `int' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(INT, ULLONG, int, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_llong
+ *
+ * Purpose:	Converts `unsigned int' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(UINT, LLONG, unsigned, long long, -, LLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_ullong
+ *
+ * Purpose:	Converts `unsigned int' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(UINT, ULLONG, unsigned, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_schar
+ *
+ * Purpose:	Converts `long' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LONG, SCHAR, long, signed char, SCHAR_MIN, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_uchar
+ *
+ * Purpose:	Converts `long' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LONG, UCHAR, long, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_schar
+ *
+ * Purpose:	Converts `unsigned long' to `signed char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULONG, SCHAR, unsigned long, signed char, -, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_uchar
+ *
+ * Purpose:	Converts `unsigned long' to `unsigned char'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULONG, UCHAR, unsigned long, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_short
+ *
+ * Purpose:	Converts `long' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LONG, SHORT, long, short, SHRT_MIN, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_ushort
+ *
+ * Purpose:	Converts `long' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LONG, USHORT, long, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_short
+ *
+ * Purpose:	Converts `unsigned long' to `short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                     void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULONG, SHORT, unsigned long, short, -, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_ushort
+ *
+ * Purpose:	Converts `unsigned long' to `unsigned short'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULONG, USHORT, unsigned long, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_int
+ *
+ * Purpose:	Converts `long' to `int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		  size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                  void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LONG, INT, long, int, INT_MIN, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_uint
+ *
+ * Purpose:	Converts `long' to `unsigned int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LONG, UINT, long, unsigned, -, UINT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_int
+ *
+ * Purpose:	Converts `unsigned long' to `int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULONG, INT, unsigned long, int, -, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_uint
+ *
+ * Purpose:	Converts `unsigned long' to `unsigned int'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULONG, UINT, unsigned long, unsigned, -, UINT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_ulong
+ *
+ * Purpose:	Converts `long' to `unsigned long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_su(LONG, ULONG, long, unsigned long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_long
+ *
+ * Purpose:	Converts `unsigned long' to `long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_us(ULONG, LONG, unsigned long, long, -, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_llong
+ *
+ * Purpose:	Converts `long' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sS(LONG, LLONG, long, long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_ullong
+ *
+ * Purpose:	Converts `long' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_sU(LONG, ULLONG, long, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_llong
+ *
+ * Purpose:	Converts `unsigned long' to `long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uS(ULONG, LLONG, unsigned long, long long, -, LLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_ullong
+ *
+ * Purpose:	Converts `unsigned long' to `unsigned long long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_uU(ULONG, ULLONG, unsigned long, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_schar
+ *
+ * Purpose:	Converts `long long' to `signed char'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LLONG, SCHAR, long long, signed char, SCHAR_MIN, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_uchar
+ *
+ * Purpose:	Converts `long long' to `unsigned char'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LLONG, UCHAR, long long, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_schar
+ *
+ * Purpose:	Converts `unsigned long long' to `signed char'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULLONG, SCHAR, unsigned long long, signed char, -, SCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_uchar
+ *
+ * Purpose:	Converts `unsigned long long' to `unsigned char'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULLONG, UCHAR, unsigned long long, unsigned char, -, UCHAR_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_short
+ *
+ * Purpose:	Converts `long long' to `short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LLONG, SHORT, long long, short, SHRT_MIN, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_ushort
+ *
+ * Purpose:	Converts `long long' to `unsigned short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LLONG, USHORT, long long, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_short
+ *
+ * Purpose:	Converts `unsigned long long' to `short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULLONG, SHORT, unsigned long long, short, -, SHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_ushort
+ *
+ * Purpose:	Converts `unsigned long long' to `unsigned short'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULLONG, USHORT, unsigned long long, unsigned short, -, USHRT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_int
+ *
+ * Purpose:	Converts `long long' to `int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		   size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                   void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LLONG, INT, long long, int, INT_MIN, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_uint
+ *
+ * Purpose:	Converts `long long' to `unsigned int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LLONG, UINT, long long, unsigned, -, UINT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_int
+ *
+ * Purpose:	Converts `unsigned long long' to `int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULLONG, INT, unsigned long long, int, -, INT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_uint
+ *
+ * Purpose:	Converts `unsigned long long' to `unsigned int'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULLONG, UINT, unsigned long long, unsigned, -, UINT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_long
+ *
+ * Purpose:	Converts `long long' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		    size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+                    void *buf, void H5_ATTR_UNUSED *bkg, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ss(LLONG, LONG, long long, long, LONG_MIN, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_ulong
+ *
+ * Purpose:	Converts `long long' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Su(LLONG, ULONG, long long, unsigned long, -, ULONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_long
+ *
+ * Purpose:	Converts `unsigned long long' to `long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		     size_t nelmts, size_t buf_stride,
+                     size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+		     hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Us(ULLONG, LONG, unsigned long long, long, -, LONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_ulong
+ *
+ * Purpose:	Converts `unsigned long long' to `unsigned long'
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, November 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Uu(ULLONG, ULONG, unsigned long long, unsigned long, -, ULONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_ullong
+ *
+ * Purpose:	Converts `long long' to `unsigned long long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_su(LLONG, ULLONG, long long, unsigned long long, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_llong
+ *
+ * Purpose:	Converts `unsigned long long' to `long long'
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, November 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		      size_t nelmts, size_t buf_stride,
+                      size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                      hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_us(ULLONG, LLONG, unsigned long long, long long, -, LLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_double
+ *
+ * Purpose:	Convert native `float' to native `double' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, June 23, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_fF(FLOAT, DOUBLE, float, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_ldouble
+ *
+ * Purpose:	Convert native `float' to native `long double' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Feb 25, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5_SIZEOF_LONG_DOUBLE != 0
+herr_t
+H5T__conv_float_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_fF(FLOAT, LDOUBLE, float, long double, -, -);
+}
+#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_float
+ *
+ * Purpose:	Convert native `double' to native `float' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, June 23, 1998
+ *
+ * Modifications:
+ *		Robb Matzke, 7 Jul 1998
+ *		Added overflow handling.
+ *
+ *		Robb Matzke, 1999-06-16
+ *		Added support for non-zero strides. If BUF_STRIDE is non-zero
+ *		then convert one value at each memory location advancing
+ *		BUF_STRIDE bytes each time; otherwise assume both source and
+ *		destination values are packed.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ff(DOUBLE, FLOAT, double, float, -FLT_MAX, FLT_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_ldouble
+ *
+ * Purpose:	Convert native `double' to native `long double' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Feb 25, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5_SIZEOF_LONG_DOUBLE != 0
+herr_t
+H5T__conv_double_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_fF(DOUBLE, LDOUBLE, double, long double, -, -);
+}
+#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_float
+ *
+ * Purpose:	Convert native `long double' to native `float' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Feb 25, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5_SIZEOF_LONG_DOUBLE != 0
+herr_t
+H5T__conv_ldouble_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ff(LDOUBLE, FLOAT, long double, float, -FLT_MAX, FLT_MAX);
+}
+#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_double
+ *
+ * Purpose:	Convert native `long double' to native `double' using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Feb 25, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5_SIZEOF_LONG_DOUBLE != 0
+herr_t
+H5T__conv_ldouble_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Ff(LDOUBLE, DOUBLE, long double, double, -DBL_MAX, DBL_MAX);
+}
+#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_float
+ *
+ * Purpose:	Convert native signed char to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SCHAR, FLOAT, signed char, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_double
+ *
+ * Purpose:	Convert native signed char to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SCHAR, DOUBLE, signed char, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_schar_ldouble
+ *
+ * Purpose:	Convert native signed char to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_schar_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SCHAR, LDOUBLE, signed char, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_float
+ *
+ * Purpose:	Convert native unsigned char to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UCHAR, FLOAT, unsigned char, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_double
+ *
+ * Purpose:	Convert native unsigned char to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UCHAR, DOUBLE, unsigned char, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uchar_ldouble
+ *
+ * Purpose:	Convert native unsigned char to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uchar_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UCHAR, LDOUBLE, unsigned char, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_float
+ *
+ * Purpose:	Convert native short to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SHORT, FLOAT, short, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_double
+ *
+ * Purpose:	Convert native short to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SHORT, DOUBLE, short, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_short_ldouble
+ *
+ * Purpose:	Convert native short to native long double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_short_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(SHORT, LDOUBLE, short, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_float
+ *
+ * Purpose:	Convert native unsigned short to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(USHORT, FLOAT, unsigned short, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_double
+ *
+ * Purpose:	Convert native unsigned short to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(USHORT, DOUBLE, unsigned short, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ushort_ldouble
+ *
+ * Purpose:	Convert native unsigned short to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ushort_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(USHORT, LDOUBLE, unsigned short, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_float
+ *
+ * Purpose:	Convert native integer to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(INT, FLOAT, int, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_double
+ *
+ * Purpose:	Convert native integer to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(INT, DOUBLE, int, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_int_ldouble
+ *
+ * Purpose:	Convert native integer to native long double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_int_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(INT, LDOUBLE, int, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_float
+ *
+ * Purpose:	Convert native unsigned integer to native float using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UINT, FLOAT, unsigned int, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_double
+ *
+ * Purpose:	Convert native unsigned integer to native double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UINT, DOUBLE, unsigned int, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_uint_ldouble
+ *
+ * Purpose:	Convert native unsigned integer to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_uint_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(UINT, LDOUBLE, unsigned int, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_float
+ *
+ * Purpose:	Convert native long to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LONG, FLOAT, long, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_double
+ *
+ * Purpose:	Convert native long to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LONG, DOUBLE, long, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_long_ldouble
+ *
+ * Purpose:	Convert native long to native long double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_long_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LONG, LDOUBLE, long, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_float
+ *
+ * Purpose:	Convert native unsigned long to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULONG, FLOAT, unsigned long, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_double
+ *
+ * Purpose:	Convert native unsigned long to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULONG, DOUBLE, unsigned long, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ulong_ldouble
+ *
+ * Purpose:	Convert native unsigned long to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ulong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULONG, LDOUBLE, unsigned long, long double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_float
+ *
+ * Purpose:	Convert native long long to native float using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LLONG, FLOAT, long long, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_double
+ *
+ * Purpose:	Convert native long long to native double using hardware.
+ *		This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_llong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LLONG, DOUBLE, long long, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_llong_ldouble
+ *
+ * Purpose:	Convert native long long to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5T_CONV_INTERNAL_LLONG_LDOUBLE
+herr_t
+H5T__conv_llong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(LLONG, LDOUBLE, long long, long double, -, -);
+}
+#endif /* H5T_CONV_INTERNAL_LLONG_LDOUBLE */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_float
+ *
+ * Purpose:	Convert native unsigned long long to native float using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULLONG, FLOAT, unsigned long long, float, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_double
+ *
+ * Purpose:	Convert native unsigned long long to native double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ullong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULLONG, DOUBLE, unsigned long long, double, -, -);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ullong_ldouble
+ *
+ * Purpose:	Convert native unsigned long long to native long double using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5T_CONV_INTERNAL_ULLONG_LDOUBLE
+herr_t
+H5T__conv_ullong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_xF(ULLONG, LDOUBLE, unsigned long long, long double, -, -);
+}
+#endif /*H5T_CONV_INTERNAL_ULLONG_LDOUBLE*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_schar
+ *
+ * Purpose:	Convert native float to native signed char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, SCHAR, float, signed char, SCHAR_MIN, SCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_uchar
+ *
+ * Purpose:	Convert native float to native unsigned char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, UCHAR, float, unsigned char, 0, UCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_schar
+ *
+ * Purpose:	Convert native double to native signed char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, SCHAR, double, signed char, SCHAR_MIN, SCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_uchar
+ *
+ * Purpose:	Convert native double to native unsigned char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, UCHAR, double, unsigned char, 0, UCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_schar
+ *
+ * Purpose:	Convert native long double to native signed char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, SCHAR, long double, signed char, SCHAR_MIN, SCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_uchar
+ *
+ * Purpose:	Convert native long double to native unsigned char using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, UCHAR, long double, unsigned char, 0, UCHAR_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_short
+ *
+ * Purpose:	Convert native float to native short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, SHORT, float, short, SHRT_MIN, SHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_ushort
+ *
+ * Purpose:	Convert native float to native unsigned short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, USHORT, float, unsigned short, 0, USHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_short
+ *
+ * Purpose:	Convert native double to native short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, SHORT, double, short, SHRT_MIN, SHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_ushort
+ *
+ * Purpose:	Convert native double to native unsigned short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, USHORT, double, unsigned short, 0, USHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_short
+ *
+ * Purpose:	Convert native long double to native short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, SHORT, long double, short, SHRT_MIN, SHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_ushort
+ *
+ * Purpose:	Convert native long double to native unsigned short using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, USHORT, long double, unsigned short, 0, USHRT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_int
+ *
+ * Purpose:	Convert native float to native int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, INT, float, int, INT_MIN, INT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_uint
+ *
+ * Purpose:	Convert native float to native unsigned int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, UINT, float, unsigned int, 0, UINT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_int
+ *
+ * Purpose:	Convert native double to native int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, INT, double, int, INT_MIN, INT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_uint
+ *
+ * Purpose:	Convert native double to native unsigned int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, UINT, double, unsigned int, 0, UINT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_int
+ *
+ * Purpose:	Convert native long double to native int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, INT, long double, int, INT_MIN, INT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_uint
+ *
+ * Purpose:	Convert native long double to native unsigned int using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, UINT, long double, unsigned int, 0, UINT_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_long
+ *
+ * Purpose:	Convert native float to native long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, LONG, float, long, LONG_MIN, LONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_ulong
+ *
+ * Purpose:	Convert native float to native unsigned long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, ULONG, float, unsigned long, 0, ULONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_long
+ *
+ * Purpose:	Convert native double to native long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, LONG, double, long, LONG_MIN, LONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_ulong
+ *
+ * Purpose:	Convert native double to native unsigned long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, ULONG, double, unsigned long, 0, ULONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_long
+ *
+ * Purpose:	Convert native long double to native long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, LONG, long double, long, LONG_MIN, LONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_ulong
+ *
+ * Purpose:	Convert native long double to native unsigned long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_ldouble_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, ULONG, long double, unsigned long, 0, ULONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_llong
+ *
+ * Purpose:	Convert native float to native long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(FLOAT, LLONG, float, long long, LLONG_MIN, LLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_float_ullong
+ *
+ * Purpose:	Convert native float to native unsigned long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_float_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    H5T_CONV_Fx(FLOAT, ULLONG, float, unsigned long long, 0, ULLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_llong
+ *
+ * Purpose:	Convert native double to native long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(DOUBLE, LLONG, double, long long, LLONG_MIN, LLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_double_ullong
+ *
+ * Purpose:	Convert native double to native unsigned long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, November 7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_double_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t dxpl_id)
+{
+    H5T_CONV_Fx(DOUBLE, ULLONG, double, unsigned long long, 0, ULLONG_MAX);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_llong
+ *
+ * Purpose:	Convert native long double to native long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5T_CONV_INTERNAL_LDOUBLE_LLONG
+herr_t
+H5T__conv_ldouble_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t H5_ATTR_UNUSED dxpl_id)
+{
+H5_GCC_DIAG_OFF(float-equal)
+    H5T_CONV_Fx(LDOUBLE, LLONG, long double, long long, LLONG_MIN, LLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
+}
+#endif /*H5T_CONV_INTERNAL_LDOUBLE_LLONG*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_ldouble_ullong
+ *
+ * Purpose:	Convert native long double to native unsigned long long using
+ *              hardware.  This is a fast special case.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Tuesday, Febuary 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5T_CONV_INTERNAL_LDOUBLE_ULLONG
+herr_t
+H5T__conv_ldouble_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+		       size_t nelmts, size_t buf_stride,
+                       size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+                       hid_t dxpl_id)
+{
+    H5T_CONV_Fx(LDOUBLE, ULLONG, long double, unsigned long long, 0, ULLONG_MAX);
+}
+#endif /*H5T_CONV_INTERNAL_LDOUBLE_ULLONG*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_f_i
+ *
+ * Purpose:	Convert one floating-point type to an integer.  This is
+ *              the catch-all function for float-integer conversions and
+ *              is probably not particularly fast.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Wednesday, Jan 21, 2004
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Wednesday, April 21, 2004
+ *              There is a new design for exception handling like overflow,
+ *              which is passed in as a transfer property.
+ *
+ *              Raymond Lu
+ *              Monday, March 13, 2006
+ *              Added support for VAX floating-point types.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+    hid_t dxpl_id)
+{
+    /* Traversal-related variables */
+    H5T_t	*src_p;			/*source datatype		*/
+    H5T_t	*dst_p;			/*destination datatype		*/
+    H5T_atomic_t src;			/*atomic source info		*/
+    H5T_atomic_t dst;			/*atomic destination info	*/
+    int	direction;		        /*forward or backward traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	half_size;		/*half the type size		*/
+    size_t      tsize;                  /*type size for swapping bytes  */
+    size_t	olap;			/*num overlapping elements	*/
+    uint8_t	*s, *sp, *d, *dp;	/*source and dest traversal ptrs*/
+    uint8_t     *src_rev=NULL;          /*order-reversed source buffer  */
+    uint8_t	dbuf[64];		/*temp destination buffer	*/
+    uint8_t     tmp1, tmp2;             /*temp variables for swapping bytes*/
+
+    /* Conversion-related variables */
+    hssize_t	expo;			/*source exponent		*/
+    hssize_t    sign;                   /*source sign bit value         */
+    uint8_t     *int_buf=NULL;          /*buffer for temporary value    */
+    size_t      buf_size;               /*buffer size for temporary value */
+    size_t	i;			/*miscellaneous counters	*/
+    size_t	first;                  /*first bit(MSB) in an integer  */
+    ssize_t	sfirst;			/*a signed version of `first'	*/
+    H5P_genplist_t      *plist;         /*Property list pointer         */
+    H5T_conv_cb_t       cb_struct={NULL, NULL};      /*conversion callback structure */
+    hbool_t     truncated;              /*if fraction value is dropped  */
+    hbool_t     reverse;                /*if reverse order of destination at the end */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    herr_t      ret_value=SUCCEED;      /* Return value                 */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            if(NULL == (src_p = (H5T_t*)H5I_object(src_id)) || NULL == (dst_p = (H5T_t*)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+            if(H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(dst_p->shared->size > sizeof(dbuf))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
+            if(8 * sizeof(expo) - 1 < src.u.f.esize)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src_p = (H5T_t*)H5I_object(src_id)) || NULL == (dst_p = (H5T_t*)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if(src_p->shared->size==dst_p->shared->size || buf_stride) {
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = nelmts;
+            } else if (src_p->shared->size>=dst_p->shared->size) {
+                double olap_d = HDceil((double)(dst_p->shared->size)/
+                                       (double)(src_p->shared->size-dst_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olap_d = HDceil((double)(src_p->shared->size)/
+                                       (double)(dst_p->shared->size-src_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
+                dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
+                direction = -1;
+            }
+
+            /* Allocate enough space for the buffer holding temporary
+             * converted value
+             */
+            buf_size = (size_t)HDpow((double)2.0f, (double)src.u.f.esize) / 8 + 1;
+            int_buf = (uint8_t*)H5MM_calloc(buf_size);
+
+            /* Get the plist structure. Do I need to close it? */
+            if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist, H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            /* Allocate space for order-reversed source buffer */
+            src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
+
+            /* The conversion loop */
+            for(elmtno = 0; elmtno < nelmts; elmtno++) {
+                /* Set these variables to default */
+                except_ret = H5T_CONV_UNHANDLED;
+                truncated  = FALSE;
+                reverse    = TRUE;
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if(direction > 0) {
+                    s = sp;
+                    d = elmtno<olap ? dbuf : dp;
+                } else {
+                    s = sp;
+                    d = elmtno+olap >= nelmts ? dbuf : dp;
+                }
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if (d==dbuf) {
+                    HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
+                            (sp>=dp && sp<dp+dst_p->shared->size));
+                } else {
+                    HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
+                            (sp<dp && sp+src_p->shared->size<=dp));
+                }
+#endif
+                /*
+                 * Put the data in little endian order so our loops aren't so
+                 * complicated.  We'll do all the conversion stuff assuming
+                 * little endian and then we'll fix the order at the end.
+                 */
+                if (H5T_ORDER_BE==src.order) {
+                    half_size = src_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        tmp1 = s[src_p->shared->size-(i+1)];
+                        s[src_p->shared->size-(i+1)] = s[i];
+                        s[i] = tmp1;
+                    }
+                } else if (H5T_ORDER_VAX==src.order) {
+                    tsize = src_p->shared->size;
+                    HDassert(0 == tsize % 2);
+
+                    for (i = 0; i < tsize; i += 4) {
+                        tmp1 = s[i];
+                        tmp2 = s[i+1];
+
+                        s[i] = s[(tsize-2)-i];
+                        s[i+1] = s[(tsize-1)-i];
+
+                        s[(tsize-2)-i] = tmp1;
+                        s[(tsize-1)-i] = tmp2;
+                    }
+                }
+
+                /*zero-set all destination bits*/
+                H5T__bit_set (d, dst.offset, dst.prec, FALSE);
+
+                /*
+                 * Find the sign bit value of the source.
+                 */
+                sign = H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
+
+                /*
+                 * Check for special cases: +0, -0, +Inf, -Inf, NaN
+                 */
+                if (H5T__bit_find (s, src.u.f.mpos, src.u.f.msize,
+                                  H5T_BIT_LSB, TRUE)<0) {
+                    if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                      H5T_BIT_LSB, TRUE)<0) {
+                        /* +0 or -0 */
+                        /* Set all bits to zero */
+                        goto padding;
+                    } else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                             H5T_BIT_LSB, FALSE)<0) {
+                        /* +Infinity or -Infinity */
+                        if(sign) { /* -Infinity */
+                            if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED) {
+                                if (H5T_SGN_2==dst.u.i.sign)
+                                    H5T__bit_set (d, dst.prec-1, (size_t)1, TRUE);
+                            } else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        } else { /* +Infinity */
+                            if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED) {
+                                if (H5T_SGN_NONE==dst.u.i.sign)
+                                    H5T__bit_set (d, dst.offset, dst.prec, TRUE);
+                                else if (H5T_SGN_2==dst.u.i.sign)
+                                    H5T__bit_set (d, dst.offset, dst.prec-1, TRUE);
+                            } else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        }
+                        goto padding;
+                    }
+                } else if (H5T_NORM_NONE==src.u.f.norm && H5T__bit_find (s, src.u.f.mpos, src.u.f.msize-1,
+                                  H5T_BIT_LSB, TRUE)<0 && H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                  H5T_BIT_LSB, FALSE)<0) {
+                    /*This is a special case for the source of no implied mantissa bit.
+                     *If the exponent bits are all 1s and only the 1st bit of mantissa
+                     *is set to 1.  It's infinity. The Intel-Linux "long double" is this case.*/
+                    /* +Infinity or -Infinity */
+                    if(sign) { /* -Infinity */
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            /*reverse order first*/
+                            H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
+                                    src_id, dst_id, src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            if (H5T_SGN_2==dst.u.i.sign)
+                                H5T__bit_set (d, dst.prec-1, (size_t)1, TRUE);
+                        } else if(except_ret == H5T_CONV_HANDLED) {
+                            /*No need to reverse the order of destination because user handles it*/
+                            reverse = FALSE;
+                            goto next;
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    } else { /* +Infinity */
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            /*reverse order first*/
+                            H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
+                                    src_id, dst_id, src_rev, d, cb_struct.user_data);
+                        }
+
+                        if(except_ret == H5T_CONV_UNHANDLED) {
+                            if (H5T_SGN_NONE==dst.u.i.sign)
+                                H5T__bit_set (d, dst.offset, dst.prec, TRUE);
+                            else if (H5T_SGN_2==dst.u.i.sign)
+                                H5T__bit_set (d, dst.offset, dst.prec-1, TRUE);
+                        } else if(except_ret == H5T_CONV_HANDLED) {
+                            /*No need to reverse the order of destination because user handles it*/
+                            reverse = FALSE;
+                            goto next;
+                        } else if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                    }
+                    goto padding;
+                } else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
+                                         H5T_BIT_LSB, FALSE)<0) {
+                    /* NaN */
+                    if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                        /*reverse order first*/
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NAN,
+                                src_id, dst_id, src_rev, d, cb_struct.user_data);
+                    }
+
+                    if(except_ret == H5T_CONV_UNHANDLED) {
+                        /*Just set all bits to zero.*/
+                        goto padding;
+                    } else if(except_ret == H5T_CONV_HANDLED) {
+                        /*No need to reverse the order of destination because user handles it*/
+                        reverse = FALSE;
+                        goto next;
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+
+                    goto padding;
+                }
+
+                /*
+                 * Get the exponent as an unsigned quantity from the section of
+                 * the source bit field where it's located.   Not expecting
+                 * exponent to be greater than the maximal value of hssize_t.
+                 */
+                expo = H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
+
+                /*
+                 * Calculate the true source exponent by adjusting according to
+                 * the source exponent bias.
+                 */
+                if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
+                    expo -= (src.u.f.ebias-1);
+                } else if (H5T_NORM_IMPLIED==src.u.f.norm) {
+                    expo -= src.u.f.ebias;
+                } else {
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
+                }
+
+                /*
+                 * Get the mantissa as bit vector from the section of
+                 * the source bit field where it's located.
+                 * Keep the little-endian order in the buffer.
+                 * A sequence 0x01020304 will be like in the buffer,
+                 *      04      03      02      01
+                 *      |       |       |       |
+                 *      V       V       V       V
+                 *    buf[0]  buf[1]  buf[2]  buf[3]
+                 */
+                H5T__bit_copy(int_buf, (size_t)0, s, src.u.f.mpos, src.u.f.msize);
+
+                /*
+                 * Restore the implicit bit for mantissa if it's implied.
+                 * Equivalent to mantissa |= (hsize_t)1<<src.u.f.msize.
+                 */
+                if(H5T_NORM_IMPLIED == src.u.f.norm)
+                    H5T__bit_inc(int_buf, src.u.f.msize, 8 * buf_size - src.u.f.msize);
+
+                /*
+                 * Shift mantissa part by exponent minus mantissa size(right shift),
+                 * or by mantissa size minus exponent(left shift).  Example: Sequence
+                 * 10...010111, expo=20, expo-msize=-3.  Right-shift the sequence, we get
+                 * 00010...10.  The last three bits were dropped.
+                 */
+                H5T__bit_shift(int_buf, (ssize_t)(expo-src.u.f.msize), (size_t)0, buf_size * 8);
+
+                /*
+                 * If expo is less than mantissa size, the frantional value is dropped off
+                 * during conversion.  Set exception type to be "truncate"
+                 */
+                if ((size_t)expo < src.u.f.msize && cb_struct.func)
+                    truncated = TRUE;
+
+                /*
+                 * What is the bit position for the most significant bit(MSB) of S
+                 * which is set?  This is checked before converted to negative
+                 * integer.
+                 */
+                sfirst = H5T__bit_find(int_buf, (size_t)0, 8 * buf_size, H5T_BIT_MSB, TRUE);
+                first = (size_t)sfirst;
+
+                if(sfirst < 0) {
+                    /*
+                     * The source has no bits set and must therefore be zero.
+                     * Set the destination to zero - nothing to do.
+                     */
+                } else if (H5T_SGN_NONE==dst.u.i.sign) { /*destination is unsigned*/
+                    /*
+                     * Destination is unsigned.  Library's default way: If the source value
+                     * is greater than the maximal destination value then it overflows, the
+                     * destination will be set to the maximum possible value.  When the
+                     * source is negative, underflow happens.  Set the destination to be
+                     * zero(do nothing).  If user's exception handler is set, call it and
+                     * let user handle it.
+                     */
+                    if(sign) { /*source is negative*/
+                        if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                            /*reverse order first*/
+                            H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                            except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,
+                                    src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            }
+                        }
+                    } else { /*source is positive*/
+                        if (first>=dst.prec) {
+                            /*overflow*/
+                            if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED)
+                                H5T__bit_set (d, dst.offset, dst.prec, TRUE);
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        } else if (first <dst.prec) {
+                            if(truncated && cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED)
+                                /*copy source value into it if case is ignored by user handler*/
+                                H5T__bit_copy (d, dst.offset, int_buf, (size_t)0, first+1);
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        }
+                    }
+                } else if (H5T_SGN_2==dst.u.i.sign) {  /*Destination is signed*/
+                    if(sign) { /*source is negative*/
+                        if(first < dst.prec-1) {
+                            if(truncated && cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED) { /*If this case ignored by user handler*/
+                                /*Convert to integer representation.  Equivalent to ~(value - 1).*/
+                                H5T__bit_dec(int_buf, (size_t)0, 8 * buf_size);
+                                H5T__bit_neg(int_buf, (size_t)0, 8 * buf_size);
+
+                                /*copy source value into destination*/
+                                H5T__bit_copy(d, dst.offset, int_buf, (size_t)0, dst.prec-1);
+                                H5T__bit_set(d, (dst.offset + dst.prec-1), (size_t)1, TRUE);
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            }
+                        } else {
+                            /* if underflows and no callback, do nothing except turn on
+                             * the sign bit because 0x80...00 is the biggest negative value.
+                             */
+                            if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED)
+                                H5T__bit_set(d, (dst.offset + dst.prec-1), (size_t)1, TRUE);
+                            else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            }
+                        }
+                    } else { /*source is positive*/
+                        if (first >= dst.prec-1) {
+                            /*overflow*/
+                            if(cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED)
+                                H5T__bit_set(d, dst.offset, dst.prec-1, TRUE);
+                            else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            }
+                        } else if(first < dst.prec-1) {
+                            if(truncated && cb_struct.func) { /*If user's exception handler is present, use it*/
+                                /*reverse order first*/
+                                H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
+                                except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
+                                        src_id, dst_id, src_rev, d, cb_struct.user_data);
+                            }
+
+                            if(except_ret == H5T_CONV_UNHANDLED) {
+                                /*copy source value into it if case is ignored by user handler*/
+                                H5T__bit_copy (d, dst.offset, int_buf, (size_t)0, first+1);
+                            } else if(except_ret == H5T_CONV_ABORT)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                            else if(except_ret == H5T_CONV_HANDLED) {
+                                /*No need to reverse the order of destination because user handles it*/
+                                reverse = FALSE;
+                                goto next;
+                            }
+                        }
+                    }
+                }
+
+            padding:
+                /*
+                 * Set padding areas in destination.
+                 */
+                if (dst.offset>0) {
+                    HDassert(H5T_PAD_ZERO==dst.lsb_pad || H5T_PAD_ONE==dst.lsb_pad);
+                    H5T__bit_set(d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
+                }
+                if (dst.offset+dst.prec!=8*dst_p->shared->size) {
+                    HDassert(H5T_PAD_ZERO==dst.msb_pad || H5T_PAD_ONE==dst.msb_pad);
+                    H5T__bit_set(d, dst.offset+dst.prec,
+                                 8*dst_p->shared->size - (dst.offset+ dst.prec),
+                                 (hbool_t)(H5T_PAD_ONE==dst.msb_pad));
+                }
+
+                /*
+                 * Put the destination in the correct byte order.  See note at
+                 * beginning of loop.
+                 */
+                if (H5T_ORDER_BE==dst.order && reverse) {
+                    half_size = dst_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        tmp1 = d[dst_p->shared->size-(i+1)];
+                        d[dst_p->shared->size-(i+1)] = d[i];
+                        d[i] = tmp1;
+                    }
+                }
+
+            next:
+                /*
+                 * If we had used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+                if (d==dbuf)
+                    HDmemcpy (dp, d, dst_p->shared->size);
+                if (buf_stride) {
+                    sp += direction * buf_stride;
+                    dp += direction * buf_stride;
+                } else {
+                    sp += direction * src_p->shared->size;
+                    dp += direction * dst_p->shared->size;
+                }
+
+                HDmemset(int_buf, 0, buf_size);
+            }
+
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    if(int_buf)
+        H5MM_xfree(int_buf);
+    if(src_rev)
+        H5MM_free(src_rev);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_f_i() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__conv_i_f
+ *
+ * Purpose:	Convert one integer type to a floating-point type.  This is
+ *              the catch-all function for integer-float conversions and
+ *              is probably not particularly fast.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Feb 6, 2004
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Wednesday, April 21, 2004
+ *              There is a new design for exception handling like overflow,
+ *              which is passed in as a transfer property.
+ *
+ *              Raymond Lu
+ *              Monday, March 13, 2006
+ *              Added support for VAX floating-point types.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_i_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+    size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
+    hid_t dxpl_id)
+{
+    /* Traversal-related variables */
+    H5T_t	*src_p;			/*source datatype		*/
+    H5T_t	*dst_p;			/*destination datatype		*/
+    H5T_atomic_t src;			/*atomic source info		*/
+    H5T_atomic_t dst;			/*atomic destination info	*/
+    int	direction;		/*forward or backward traversal	*/
+    size_t	elmtno;			/*element number		*/
+    size_t	half_size;		/*half the type size		*/
+    size_t      tsize;                  /*type size for swapping bytes  */
+    size_t	olap;			/*num overlapping elements	*/
+    uint8_t	*s, *sp, *d, *dp;	/*source and dest traversal ptrs*/
+    uint8_t     *src_rev = NULL;        /*order-reversed source buffer  */
+    uint8_t	dbuf[64];		/*temp destination buffer	*/
+    uint8_t     tmp1, tmp2;             /*temp variables for swapping bytes*/
+
+    /* Conversion-related variables */
+    hsize_t	expo;			/*destination exponent		*/
+    hsize_t	expo_max;		/*maximal possible exponent value       */
+    size_t      sign;                   /*source sign bit value         */
+    hbool_t     is_max_neg;             /*source is maximal negative value*/
+    hbool_t     do_round;               /*whether there is roundup      */
+    uint8_t     *int_buf = NULL;        /*buffer for temporary value    */
+    size_t      buf_size;               /*buffer size for temporary value */
+    size_t	i;			/*miscellaneous counters	*/
+    size_t	first;                  /*first bit(MSB) in an integer  */
+    ssize_t	sfirst;			/*a signed version of `first'	*/
+    H5P_genplist_t      *plist;         /*Property list pointer         */
+    H5T_conv_cb_t       cb_struct = {NULL, NULL};      /*conversion callback structure */
+    H5T_conv_ret_t      except_ret;     /*return of callback function   */
+    hbool_t             reverse;        /*if reverse the order of destination   */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    switch(cdata->command) {
+        case H5T_CONV_INIT:
+            if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+            if(H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
+            if(dst_p->shared->size > sizeof(dbuf))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
+            if(8 * sizeof(expo) - 1 < src.u.f.esize)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
+            cdata->need_bkg = H5T_BKG_NO;
+            break;
+
+        case H5T_CONV_FREE:
+            break;
+
+        case H5T_CONV_CONV:
+            /* Get the datatypes */
+            if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+            src = src_p->shared->u.atomic;
+            dst = dst_p->shared->u.atomic;
+
+            /*
+             * Do we process the values from beginning to end or vice versa? Also,
+             * how many of the elements have the source and destination areas
+             * overlapping?
+             */
+            if (src_p->shared->size==dst_p->shared->size || buf_stride) {
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+                olap = nelmts;
+            } else if (src_p->shared->size>=dst_p->shared->size) {
+                double olap_d = HDceil((double)(dst_p->shared->size)/
+                                       (double)(src_p->shared->size-dst_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = dp = (uint8_t*)buf;
+                direction = 1;
+            } else {
+                double olap_d = HDceil((double)(src_p->shared->size)/
+                                       (double)(dst_p->shared->size-src_p->shared->size));
+                olap = (size_t)olap_d;
+                sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
+                dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
+                direction = -1;
+            }
+
+            /* Allocate enough space for the buffer holding temporary
+             * converted value
+             */
+            buf_size = (src.prec > dst.u.f.msize ? src.prec : dst.u.f.msize)/8 + 1;
+            int_buf = (uint8_t*)H5MM_calloc(buf_size);
+
+            /* Get the plist structure */
+            if(NULL == (plist = H5P_object_verify(dxpl_id,H5P_DATASET_XFER)))
+                HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find property list for ID")
+
+            /* Get conversion exception callback property */
+            if(H5P_get(plist,H5D_XFER_CONV_CB_NAME, &cb_struct) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
+
+            /* Allocate space for order-reversed source buffer */
+            src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
+
+            /* The conversion loop */
+            for (elmtno=0; elmtno<nelmts; elmtno++) {
+                /* Set these variables to default */
+                except_ret = H5T_CONV_UNHANDLED;
+                reverse    = TRUE;
+
+                /* Make sure these variables are reset to 0. */
+                sign = 0;               /*source sign bit value         */
+                is_max_neg = 0;         /*source is maximal negative value*/
+                do_round = 0;           /*whether there is roundup      */
+                sfirst = 0;
+
+                /*
+                 * If the source and destination buffers overlap then use a
+                 * temporary buffer for the destination.
+                 */
+                if (direction>0) {
+                    s = sp;
+                    d = elmtno<olap ? dbuf : dp;
+                } else {
+                    s = sp;
+                    d = elmtno+olap >= nelmts ? dbuf : dp;
+                }
+#ifndef NDEBUG
+                /* I don't quite trust the overlap calculations yet --rpm */
+                if (d==dbuf) {
+                    HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
+                            (sp>=dp && sp<dp+dst_p->shared->size));
+                } else {
+                    HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
+                            (sp<dp && sp+src_p->shared->size<=dp));
+                }
+#endif
+
+                /*
+                 * Put the data in little endian order so our loops aren't so
+                 * complicated.  We'll do all the conversion stuff assuming
+                 * little endian and then we'll fix the order at the end.
+                 */
+                if (H5T_ORDER_BE==src.order) {
+                    half_size = src_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        tmp1 = s[src_p->shared->size-(i+1)];
+                        s[src_p->shared->size-(i+1)] = s[i];
+                        s[i] = tmp1;
+                    }
+                }
+
+                /*zero-set all destination bits*/
+                H5T__bit_set (d, dst.offset, dst.prec, FALSE);
+
+                /* Copy source into a temporary buffer */
+                H5T__bit_copy(int_buf, (size_t)0, s, src.offset, src.prec);
+
+                /*
+                 * Find the sign bit value of the source.
+                 */
+                if(H5T_SGN_2 == src.u.i.sign)
+                    sign = (size_t)H5T__bit_get_d(int_buf, src.prec - 1, (size_t)1);
+
+                /*
+                 * What is the bit position(starting from 0 as first one) for the most significant
+		 * bit(MSB) of S which is set?
+                 */
+                if(H5T_SGN_2 == src.u.i.sign) {
+                    sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, TRUE);
+                    if(sign && sfirst < 0)
+			/* The case 0x80...00, which is negative with maximal value */
+                        is_max_neg = 1;
+                } else if(H5T_SGN_NONE == src.u.i.sign)
+                    sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec, H5T_BIT_MSB, TRUE);
+
+                /* Handle special cases here.  Integer is zero */
+                if(!sign && sfirst < 0)
+                    goto padding;
+
+                /*
+                 * Convert source integer if it's negative
+                 */
+                if(H5T_SGN_2 == src.u.i.sign && sign) {
+                    if(!is_max_neg) {
+                        /* Equivalent to ~(i - 1) */
+                        H5T__bit_dec(int_buf, (size_t)0, buf_size * 8);
+                        H5T__bit_neg(int_buf, (size_t)0, buf_size * 8);
+                        sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, TRUE);
+                    } else {
+			/* If it's maximal negative number 0x80...000, treat it as if it overflowed
+			 * (create a carry) to help conversion.  i.e. a character type number 0x80
+			 * is treated as 0x100.
+			 */
+                        sfirst = (ssize_t)(src.prec - 1);
+                        is_max_neg = 0;
+                    }
+                    if(sfirst < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "zero bit not found")
+
+                    /* Sign bit has been negated if bit vector isn't 0x80...00.  Set all bits in front of
+                     * sign bit to 0 in the temporary buffer because they're all negated from the previous
+		     * step. */
+                    H5T__bit_set(int_buf, src.prec, (buf_size * 8) - src.prec, 0);
+
+                    /* Set sign bit in destination */
+                    H5T__bit_set_d(d, dst.u.f.sign, (size_t)1, (hsize_t)sign);
+                } /* end if */
+
+                first = (size_t)sfirst;
+
+                /*
+                 * Calculate the true destination exponent by adjusting according to
+                 * the destination exponent bias.  Implied and non-implied normalization
+                 * should be the same.
+                 */
+                if (H5T_NORM_NONE==dst.u.f.norm || H5T_NORM_IMPLIED==dst.u.f.norm) {
+                    expo = first + dst.u.f.ebias;
+                } else {
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
+                }
+
+                /* Handle mantissa part here */
+                if (H5T_NORM_IMPLIED==dst.u.f.norm) {
+                    /* Imply first bit */
+                    H5T__bit_set(int_buf, first, (size_t)1, 0);
+       		} else if (H5T_NORM_NONE==dst.u.f.norm) {
+		    first++;
+		}
+
+                /* Roundup for mantissa */
+                if(first > dst.u.f.msize) {
+		    /* If the bit sequence is bigger than the mantissa part, there'll be some
+                     * precision loss.  Let user's handler deal with the case if it's present
+                     */
+                    if(cb_struct.func) {
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PRECISION, src_id, dst_id,
+                                src_rev, d, cb_struct.user_data);
+                    }
+
+                    if(except_ret == H5T_CONV_HANDLED) {
+                        reverse = FALSE;
+                        goto padding;
+                    } else if(except_ret == H5T_CONV_ABORT)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+
+		    /* If user's exception handler does deal with it, we do it by dropping off the
+		     * extra bits at the end and do rounding.  If we have .50...0(decimal) after radix
+		     * point, we do roundup when the least significant digit before radix is odd, we do
+		     * rounddown if it's even.
+		     */
+
+                    /* Check 1st dropoff bit, see if it's set. */
+                    if(H5T__bit_get_d(int_buf, ((first - dst.u.f.msize) - 1), (size_t)1)) {
+                    	/* Check all bits after 1st dropoff bit, see if any of them is set. */
+                        if(((first - dst.u.f.msize) - 1) > 0 && H5T__bit_get_d(int_buf, (size_t)0, ((first - dst.u.f.msize) - 1)))
+                            do_round = 1;
+                        else {  /* The .50...0 case */
+                            /* Check if the least significant bit is odd. */
+                            if(H5T__bit_get_d(int_buf, (first - dst.u.f.msize), (size_t)1))
+                               do_round = 1;
+                        }
+		    }
+
+                    /* Right shift to drop off extra bits */
+                    H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, buf_size * 8);
+
+                    if(do_round) {
+                        H5T__bit_inc(int_buf, (size_t)0, buf_size * 8);
+                        do_round = 0;
+
+			/* If integer is like 0x0ff...fff and we need to round up the
+			 * last f, we get 0x100...000.  Treat this special case here.
+			 */
+                    	if(H5T__bit_get_d(int_buf, dst.u.f.msize, (size_t)1)) {
+                	    if (H5T_NORM_IMPLIED==dst.u.f.norm) {
+			        /* The bit at this 1's position was impled already, so this
+			         * number should be 0x200...000.  We need to increment the
+			         * exponent in this case.
+			         */
+			    	expo++;
+       			    } else if (H5T_NORM_NONE==dst.u.f.norm) {
+				/* Right shift 1 bit to let the carried 1 fit in the mantissa,
+				 * and increment exponent by 1.
+				 */
+                                H5T__bit_shift(int_buf, (ssize_t)-1, (size_t)0, buf_size * 8);
+			 	expo++;
+			    }
+			}
+                    }
+                } else {
+                    /* The bit sequence can fit mantissa part.  Left shift to fit in from high-order of
+		     * bit position. */
+                    H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, dst.u.f.msize);
+                }
+
+
+                /* Check if the exponent is too big */
+                expo_max = (hsize_t)HDpow((double)2.0f, (double)dst.u.f.esize) - 1;
+
+                if(expo > expo_max) {  /*overflows*/
+                    if(cb_struct.func) { /*user's exception handler.  Reverse back source order*/
+                        H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/
+                        except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
+                                src_rev, d, cb_struct.user_data);
+
+                        if(except_ret == H5T_CONV_ABORT)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
+                        else if(except_ret == H5T_CONV_HANDLED) {
+                            reverse = FALSE;
+                            goto padding;
+                        }
+                    } else {
+                        /*make destination infinity by setting exponent to maximal number and
+                         *mantissa to zero.*/
+                        expo = expo_max;
+                        HDmemset(int_buf, 0, buf_size);
+                    }
+                }
+
+                if(except_ret == H5T_CONV_UNHANDLED) {
+                    /* Set exponent in destination */
+                    H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, expo);
+
+                    /* Copy mantissa into destination */
+                    H5T__bit_copy(d, dst.u.f.mpos, int_buf, (size_t)0, (buf_size * 8) > dst.u.f.msize ? dst.u.f.msize : buf_size * 8);
+                }
+
+            padding:
+                /*
+                 * Set padding areas in destination.
+                 */
+                if(dst.offset > 0) {
+                    HDassert(H5T_PAD_ZERO == dst.lsb_pad || H5T_PAD_ONE == dst.lsb_pad);
+                    H5T__bit_set(d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
+                }
+                if(dst.offset + dst.prec != 8 * dst_p->shared->size) {
+                    HDassert(H5T_PAD_ZERO == dst.msb_pad || H5T_PAD_ONE == dst.msb_pad);
+                    H5T__bit_set(d, dst.offset + dst.prec,
+                                 8 * dst_p->shared->size - (dst.offset + dst.prec),
+                                 (hbool_t)(H5T_PAD_ONE == dst.msb_pad));
+                }
+
+                /*
+                 * Put the destination in the correct byte order.  See note at
+                 * beginning of loop.
+                 */
+                if (H5T_ORDER_BE==dst.order && reverse) {
+                    half_size = dst_p->shared->size/2;
+                    for (i=0; i<half_size; i++) {
+                        uint8_t tmp = d[dst_p->shared->size-(i+1)];
+                        d[dst_p->shared->size-(i+1)] = d[i];
+                        d[i] = tmp;
+                    }
+                } else if (H5T_ORDER_VAX==dst.order && reverse) {
+                    tsize = dst_p->shared->size;
+                    HDassert(0 == tsize % 2);
+
+                    for (i = 0; i < tsize; i += 4) {
+                        tmp1 = d[i];
+                        tmp2 = d[i+1];
+
+                        d[i] = d[(tsize-2)-i];
+                        d[i+1] = d[(tsize-1)-i];
+
+                        d[(tsize-2)-i] = tmp1;
+                        d[(tsize-1)-i] = tmp2;
+                    }
+                }
+
+                /*
+                 * If we had used a temporary buffer for the destination then we
+                 * should copy the value to the true destination buffer.
+                 */
+                if (d==dbuf)
+                    HDmemcpy (dp, d, dst_p->shared->size);
+                if (buf_stride) {
+                    sp += direction * buf_stride;
+                    dp += direction * buf_stride;
+                } else {
+                    sp += direction * src_p->shared->size;
+                    dp += direction * dst_p->shared->size;
+                }
+
+                HDmemset(int_buf, 0, buf_size);
+            }
+
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+    } /* end switch */
+
+done:
+    if(int_buf)
+        H5MM_xfree(int_buf);
+    if(src_rev)
+        H5MM_free(src_rev);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_i_f() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_reverse_order
+ *
+ * Purpose:	Internal assisting function to reverse the order of
+ *              a sequence of byte when it's big endian or VAX order.
+ *              The byte sequence simulates the endian order.
+ *
+ * Return:      Success:        A pointer to the reversed byte sequence
+ *
+ *              Failure:        Null
+ *
+ * Programmer:	Raymond Lu
+ *		April 26, 2004
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              March 13, 2006
+ *              Add support for VAX floating-point types.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order)
+{
+    size_t      i;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(s);
+    HDassert(size);
+
+    if (H5T_ORDER_VAX == order) {
+        for (i = 0; i < size; i += 2) {
+            rev[i] = s[(size - 2) - i];
+            rev[i + 1] = s[(size - 1) - i];
+        }
+    } else if (H5T_ORDER_BE == order) {
+        for (i=0; i<size; i++)
+            rev[size-(i+1)] = s[i];
+    } else {
+        for (i=0; i<size; i++)
+            rev[i] = s[i];
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tcset.c b/gatb-core/thirdparty/hdf5/src/H5Tcset.c
new file mode 100644
index 0000000..33fb32a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tcset.c
@@ -0,0 +1,151 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the character set (cset) for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_cset_interface
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_cset_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_cset_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_cset_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_cset_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_cset
+ *
+ * Purpose:	HDF5 is able to distinguish between character sets of
+ *		different nationalities and to convert between them to the
+ *		extent possible.
+ *
+ * Return:	Success:	The character set of a string type.
+ *
+ *		Failure:	H5T_CSET_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_cset_t
+H5Tget_cset(hid_t type_id)
+{
+    H5T_t	*dt;
+    H5T_cset_t	ret_value;
+
+    FUNC_ENTER_API(H5T_CSET_ERROR)
+    H5TRACE1("Tc", "i", type_id);
+
+    /* Check args */
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_CSET_ERROR, "not a data type")
+    while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
+        dt = dt->shared->parent;  /*defer to parent*/
+    if (!H5T_IS_STRING(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, H5T_CSET_ERROR, "operation not defined for data type class")
+
+    /* result */
+    if(H5T_IS_FIXED_STRING(dt->shared))
+        ret_value = dt->shared->u.atomic.u.s.cset;
+    else
+        ret_value = dt->shared->u.vlen.cset;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_cset
+ *
+ * Purpose:	HDF5 is able to distinguish between character sets of
+ *		different nationalities and to convert between them to the
+ *		extent possible.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works with derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_cset(hid_t type_id, H5T_cset_t cset)
+{
+    H5T_t	*dt;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTc", type_id, cset);
+
+    /* Check args */
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+    if (cset < H5T_CSET_ASCII || cset >= H5T_NCSET)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal character set type")
+    while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
+        dt = dt->shared->parent;  /*defer to parent*/
+    if (!H5T_IS_STRING(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for data type class")
+
+    /* Commit */
+    if(H5T_IS_FIXED_STRING(dt->shared))
+        dt->shared->u.atomic.u.s.cset = cset;
+    else
+        dt->shared->u.vlen.cset = cset;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tdbg.c b/gatb-core/thirdparty/hdf5/src/H5Tdbg.c
new file mode 100644
index 0000000..375cd6e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tdbg.c
@@ -0,0 +1,402 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Tdbg.c
+ *			Jul 19 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Dump debugging information about a datatype
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Tpkg.h"		/* Datatypes         			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__print_stats
+ *
+ * Purpose:	Print statistics about a conversion path.  Statistics are
+ *		printed only if all the following conditions are true:
+ *
+ * 		1. The library was compiled with H5T_DEBUG defined.
+ *		2. Data type debugging is turned on at run time.
+ *		3. The path was called at least one time.
+ *
+ *		The optional NPRINT argument keeps track of the number of
+ *		conversions paths for which statistics have been shown. If
+ *		its value is zero then table headers are printed before the
+ *		first line of output.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, December 14, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__print_stats(H5T_path_t H5_ATTR_UNUSED * path, int H5_ATTR_UNUSED * nprint/*in,out*/)
+{
+#ifdef H5T_DEBUG
+    hsize_t	nbytes;
+    char	bandwidth[32];
+#endif
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+#ifdef H5T_DEBUG
+    if(H5DEBUG(T) && path->stats.ncalls > 0) {
+	if(nprint && 0 == (*nprint)++) {
+	    HDfprintf(H5DEBUG(T), "H5T: type conversion statistics:\n");
+	    HDfprintf(H5DEBUG(T), "   %-16s %10s %10s %8s %8s %8s %10s\n",
+		       "Conversion", "Elmts", "Calls", "User",
+		       "System", "Elapsed", "Bandwidth");
+	    HDfprintf(H5DEBUG(T), "   %-16s %10s %10s %8s %8s %8s %10s\n",
+		       "----------", "-----", "-----", "----",
+		       "------", "-------", "---------");
+	}
+        if(path->src && path->dst)
+            nbytes = MAX(H5T_get_size(path->src), H5T_get_size(path->dst));
+        else if(path->src)
+            nbytes = H5T_get_size(path->src);
+        else if(path->dst)
+            nbytes = H5T_get_size(path->dst);
+        else
+            nbytes = 0;
+	nbytes *= path->stats.nelmts;
+	H5_bandwidth(bandwidth, (double)nbytes, path->stats.timer.etime);
+	HDfprintf(H5DEBUG(T), "   %-16s %10Hd %10d %8.2f %8.2f %8.2f %10s\n",
+		   path->name,
+		   path->stats.nelmts,
+		   path->stats.ncalls,
+		   path->stats.timer.utime,
+		   path->stats.timer.stime,
+		   path->stats.timer.etime,
+		   bandwidth);
+    }
+#endif
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T__print_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_debug
+ *
+ * Purpose:	Prints information about a data type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_debug(const H5T_t *dt, FILE *stream)
+{
+    const char	*s1 = "", *s2 = "";
+    unsigned	i;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(stream);
+
+    switch(dt->shared->type) {
+        case H5T_INTEGER:
+            s1 = "int";
+            break;
+
+        case H5T_FLOAT:
+            s1 = "float";
+            break;
+
+        case H5T_TIME:
+            s1 = "time";
+            break;
+
+        case H5T_STRING:
+            s1 = "str";
+            break;
+
+        case H5T_BITFIELD:
+            s1 = "bits";
+            break;
+
+        case H5T_OPAQUE:
+            s1 = "opaque";
+            break;
+
+        case H5T_COMPOUND:
+            s1 = "struct";
+            break;
+
+        case H5T_ENUM:
+            s1 = "enum";
+            break;
+
+        case H5T_VLEN:
+            if(H5T_IS_VL_STRING(dt->shared))
+                s1 = "str";
+            else
+                s1 = "vlen";
+            break;
+
+        default:
+            s1 = "";
+            break;
+    } /* end switch */
+
+    switch(dt->shared->state) {
+        case H5T_STATE_TRANSIENT:
+            s2 = "[transient]";
+            break;
+
+        case H5T_STATE_RDONLY:
+            s2 = "[constant]";
+            break;
+
+        case H5T_STATE_IMMUTABLE:
+            s2 = "[predefined]";
+            break;
+
+        case H5T_STATE_NAMED:
+            s2 = "[named,closed]";
+            break;
+
+        case H5T_STATE_OPEN:
+            s2 = "[named,open]";
+            break;
+        default:
+            HDassert(0 && "This Should never be executed!");
+    } /* end switch */
+
+    fprintf(stream, "%s%s {nbytes=%lu", s1, s2, (unsigned long)(dt->shared->size));
+
+    if(H5T_IS_ATOMIC(dt->shared)) {
+        uint64_t	tmp;
+
+	switch(dt->shared->u.atomic.order) {
+            case H5T_ORDER_BE:
+                s1 = "BE";
+                break;
+
+            case H5T_ORDER_LE:
+                s1 = "LE";
+                break;
+
+            case H5T_ORDER_VAX:
+                s1 = "VAX";
+                break;
+
+            case H5T_ORDER_NONE:
+                s1 = "NONE";
+                break;
+
+            default:
+                s1 = "order?";
+                break;
+	} /* end switch */
+
+	fprintf(stream, ", %s", s1);
+
+	if(dt->shared->u.atomic.offset)
+	    fprintf(stream, ", offset=%lu",
+		    (unsigned long) (dt->shared->u.atomic.offset));
+	if(dt->shared->u.atomic.prec != 8 * dt->shared->size)
+	    fprintf(stream, ", prec=%lu",
+		    (unsigned long) (dt->shared->u.atomic.prec));
+	switch(dt->shared->type) {
+            case H5T_INTEGER:
+                switch(dt->shared->u.atomic.u.i.sign) {
+                    case H5T_SGN_NONE:
+                        s1 = "unsigned";
+                        break;
+
+                    case H5T_SGN_2:
+                        s1 = NULL;
+                        break;
+
+                    default:
+                        s1 = "sign?";
+                        break;
+
+                } /* end switch */
+                if(s1)
+                    fprintf(stream, ", %s", s1);
+                break;
+
+            case H5T_FLOAT:
+                switch(dt->shared->u.atomic.u.f.norm) {
+                    case H5T_NORM_IMPLIED:
+                        s1 = "implied";
+                        break;
+
+                    case H5T_NORM_MSBSET:
+                        s1 = "msbset";
+                        break;
+
+                    case H5T_NORM_NONE:
+                        s1 = "no-norm";
+                        break;
+
+                    default:
+                        s1 = "norm?";
+                        break;
+                } /* end switch */
+
+                fprintf(stream, ", sign=%lu+1",
+                        (unsigned long)(dt->shared->u.atomic.u.f.sign));
+                fprintf(stream, ", mant=%lu+%lu (%s)",
+                        (unsigned long)(dt->shared->u.atomic.u.f.mpos),
+                        (unsigned long)(dt->shared->u.atomic.u.f.msize), s1);
+                fprintf(stream, ", exp=%lu+%lu",
+                        (unsigned long)(dt->shared->u.atomic.u.f.epos),
+                        (unsigned long)(dt->shared->u.atomic.u.f.esize));
+                tmp = dt->shared->u.atomic.u.f.ebias >> 32;
+                if(tmp) {
+                    size_t hi = (size_t)tmp;
+                    size_t lo = (size_t)(dt->shared->u.atomic.u.f.ebias & 0xffffffff);
+                    fprintf(stream, " bias=0x%08lx%08lx",
+                            (unsigned long)hi, (unsigned long)lo);
+                } else {
+                    size_t lo = (size_t)(dt->shared->u.atomic.u.f.ebias & 0xffffffff);
+                    fprintf(stream, " bias=0x%08lx", (unsigned long)lo);
+                }
+                break;
+
+            default:
+                /* No additional info */
+                break;
+	} /* end switch */
+    } else if(H5T_COMPOUND == dt->shared->type) {
+	/* Compound data type */
+	for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+	    fprintf(stream, "\n\"%s\" @%lu",
+		    dt->shared->u.compnd.memb[i].name,
+		    (unsigned long)(dt->shared->u.compnd.memb[i].offset));
+	    fprintf(stream, " ");
+	    H5T_debug(dt->shared->u.compnd.memb[i].type, stream);
+	} /* end for */
+	fprintf(stream, "\n");
+    } else if(H5T_VLEN == dt->shared->type) {
+        switch(dt->shared->u.vlen.loc) {
+            case H5T_LOC_MEMORY:
+                fprintf(stream, ", loc=memory");
+                break;
+
+            case H5T_LOC_DISK:
+                fprintf(stream, ", loc=disk");
+                break;
+
+            default:
+                fprintf(stream, ", loc=UNKNOWN");
+                break;
+        } /* end switch */
+
+        if(H5T_IS_VL_STRING(dt->shared))
+            /* Variable length string datatype */
+            fprintf(stream, ", variable-length");
+        else {
+            /* Variable length sequence datatype */
+            fprintf(stream, " VLEN ");
+            H5T_debug(dt->shared->parent, stream);
+            fprintf(stream, "\n");
+        } /* end else */
+    } else if(H5T_ENUM == dt->shared->type) {
+        size_t	base_size;
+
+	/* Enumeration data type */
+	fprintf(stream, " ");
+	H5T_debug(dt->shared->parent, stream);
+	base_size = dt->shared->parent->shared->size;
+	for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
+            size_t	k;
+
+	    fprintf(stream, "\n\"%s\" = 0x", dt->shared->u.enumer.name[i]);
+	    for(k = 0; k < base_size; k++)
+		fprintf(stream, "%02lx",
+			(unsigned long)(dt->shared->u.enumer.value + (i * base_size) + k));
+	} /* end for */
+	fprintf(stream, "\n");
+    } else if(H5T_OPAQUE == dt->shared->type) {
+	fprintf(stream, ", tag=\"%s\"", dt->shared->u.opaque.tag);
+    } else {
+	/* Unknown */
+	fprintf(stream, "unknown class %d\n", (int)(dt->shared->type));
+    }
+    fprintf(stream, "}");
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5T_debug() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tdeprec.c b/gatb-core/thirdparty/hdf5/src/H5Tdeprec.c
new file mode 100644
index 0000000..f1586bd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tdeprec.c
@@ -0,0 +1,255 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Tdeprec.c
+ *		April 5 2007
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5T interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg   */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T__init_deprec_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FOprivate.h"	/* File objects				*/
+#include "H5Iprivate.h"		/* IDs					*/
+#include "H5Ppublic.h"		/* Property Lists			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T__init_deprec_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T__init_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init() currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T__init_deprec_interface(void)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T__init_deprec_interface() */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T__term_deprec_interface -- Terminate interface
+USAGE
+    herr_t H5T__term_deprec_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Terminates interface.  (Just resets H5_interface_initialize_g
+    currently).
+
+--------------------------------------------------------------------------*/
+herr_t
+H5T__term_deprec_interface(void)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Mark closed */
+    H5_interface_initialize_g = 0;
+
+    FUNC_LEAVE_NOAPI(0)
+} /* H5T__term_deprec_interface() */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tcommit1
+ *
+ * Purpose:	Save a transient datatype to a file and turn the type handle
+ *		into a named, immutable type.
+ *
+ * Note:	Deprecated in favor of H5Tcommit2
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, June  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id)
+{
+    H5G_loc_t	loc;                    /* Location to create datatype */
+    H5T_t	*type;                  /* Datatype for ID */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*si", loc_id, name, type_id);
+
+    /* Check arguments */
+    if(H5G_loc(loc_id, &loc) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Commit the datatype to the file, using default property list values */
+    if(H5T__commit_named(&loc, name, type, H5P_LINK_CREATE_DEFAULT,
+            H5P_DATATYPE_CREATE_DEFAULT, H5P_DATATYPE_ACCESS_DEFAULT, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tcommit1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Topen1
+ *
+ * Purpose:	Opens a named datatype.
+ *
+ * Note:	Deprecated in favor of H5Topen2
+ *
+ * Return:	Success:	Object ID of the named datatype.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, June  1, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Topen1(hid_t loc_id, const char *name)
+{
+    H5T_t       *type = NULL;
+    H5G_loc_t	 loc;
+    H5G_name_t   path;            	/* Datatype group hier. path */
+    H5O_loc_t    oloc;            	/* Datatype object location */
+    H5O_type_t   obj_type;              /* Type of object at location */
+    H5G_loc_t    type_loc;              /* Group object for datatype */
+    hbool_t      obj_found = FALSE;     /* Object at 'name' found */
+    hid_t        dxpl_id = H5AC_ind_dxpl_id; /* dxpl to use to open datatype */
+    hid_t        ret_value = FAIL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "i*s", loc_id, name);
+
+    /* Check args */
+    if(H5G_loc(loc_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(!name || !*name)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+
+    /* Set up datatype location to fill in */
+    type_loc.oloc = &oloc;
+    type_loc.path = &path;
+    H5G_loc_reset(&type_loc);
+
+    /*
+     * Find the named datatype object header and read the datatype message
+     * from it.
+     */
+    if(H5G_loc_find(&loc, name, &type_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "not found")
+    obj_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get object type")
+    if(obj_type != H5O_TYPE_NAMED_DATATYPE)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a named datatype")
+
+    /* Open it */
+    if((type = H5T_open(&type_loc, dxpl_id)) == NULL)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open named datatype")
+
+    /* Register the type and return the ID */
+    if((ret_value = H5I_register(H5I_DATATYPE, type, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register named datatype")
+
+done:
+    if(ret_value < 0) {
+        if(type != NULL)
+            H5T_close(type);
+        else {
+            if(obj_found && H5F_addr_defined(type_loc.oloc->addr))
+                H5G_loc_free(&type_loc);
+        } /* end else */
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Topen1() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tenum.c b/gatb-core/thirdparty/hdf5/src/H5Tenum.c
new file mode 100644
index 0000000..2b7563b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tenum.c
@@ -0,0 +1,608 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for enumerated datatypes
+ *      in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_enum_interface
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5MMprivate.h"	/*memory management			  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+/* Static local functions */
+static char *H5T_enum_nameof(const H5T_t *dt, const void *value, char *name/*out*/,
+			      size_t size);
+static herr_t H5T_enum_valueof(const H5T_t *dt, const char *name,
+				void *value/*out*/);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_enum_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_enum_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_enum_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_enum_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tenum_create
+ *
+ * Purpose:	Create a new enumeration data type based on the specified
+ *		TYPE, which must be an integer type.
+ *
+ * Return:	Success:	ID of new enumeration data type
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, December 22, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tenum_create(hid_t parent_id)
+{
+    H5T_t	*parent = NULL;		/*base integer data type	*/
+    H5T_t	*dt = NULL;		/*new enumeration data type	*/
+    hid_t	ret_value;	        /*return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", parent_id);
+
+    /* Check args */
+    if(NULL == (parent = (H5T_t *)H5I_object_verify(parent_id, H5I_DATATYPE)) || H5T_INTEGER != parent->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer data type")
+
+    /* Build new type */
+    if(NULL == (dt = H5T__enum_create(parent)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot create enum type")
+    /* Atomize the type */
+    if ((ret_value=H5I_register(H5I_DATATYPE, dt, TRUE))<0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type atom")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__enum_create
+ *
+ * Purpose:	Private function for H5Tenum_create.  Create a new
+ *              enumeration data type based on the specified
+ *		TYPE, which must be an integer type.
+ *
+ * Return:	Success:	new enumeration data type
+ *
+ *		Failure:        NULL
+ *
+ * Programmer:	Raymond Lu
+ *              October 9, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T__enum_create(const H5T_t *parent)
+{
+    H5T_t	*ret_value;		/*new enumeration data type	*/
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(parent);
+
+    /* Build new type */
+    if(NULL == (ret_value = H5T__alloc()))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    ret_value->shared->type = H5T_ENUM;
+    ret_value->shared->parent = H5T_copy(parent, H5T_COPY_ALL);
+    HDassert(ret_value->shared->parent);
+    ret_value->shared->size = ret_value->shared->parent->shared->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tenum_insert
+ *
+ * Purpose:	Insert a new enumeration data type member into an enumeration
+ *		type. TYPE is the enumeration type, NAME is the name of the
+ *		new member, and VALUE points to the value of the new member.
+ *		The NAME and VALUE must both be unique within the TYPE. VALUE
+ *		points to data which is of the data type defined when the
+ *		enumeration type was created.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tenum_insert(hid_t type, const char *name, const void *value)
+{
+    H5T_t	*dt=NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*s*x", type, name, value);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(H5T_ENUM != dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type")
+    if (!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
+    if (!value)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value specified")
+
+    /* Do work */
+    if(H5T__enum_insert(dt, name, value) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert new enumeration member")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__enum_insert
+ *
+ * Purpose:	Insert a new member having a NAME and VALUE into an
+ *		enumeration data TYPE.  The NAME and VALUE must both be
+ *		unique. The VALUE points to data of the data type defined for
+ *		the enumeration base type.
+ *
+ * Return:	Success:	non-negative
+ *
+ *		Failure:	negative
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__enum_insert(const H5T_t *dt, const char *name, const void *value)
+{
+    unsigned	i;
+    char	**names=NULL;
+    uint8_t	*values=NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dt);
+    HDassert(name && *name);
+    HDassert(value);
+
+    /* The name and value had better not already exist */
+    for (i=0; i<dt->shared->u.enumer.nmembs; i++) {
+	if (!HDstrcmp(dt->shared->u.enumer.name[i], name))
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "name redefinition")
+	if (!HDmemcmp(dt->shared->u.enumer.value+i*dt->shared->size, value, dt->shared->size))
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "value redefinition")
+    }
+
+    /* Increase table sizes */
+    if(dt->shared->u.enumer.nmembs >= dt->shared->u.enumer.nalloc) {
+	unsigned n = MAX(32, 2*dt->shared->u.enumer.nalloc);
+
+	if(NULL == (names = (char **)H5MM_realloc(dt->shared->u.enumer.name, n * sizeof(char *))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+	dt->shared->u.enumer.name = names;
+
+	if(NULL == (values = (uint8_t *)H5MM_realloc(dt->shared->u.enumer.value, n * dt->shared->size)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+	dt->shared->u.enumer.value = values;
+	dt->shared->u.enumer.nalloc = n;
+    }
+
+    /* Insert new member at end of member arrays */
+    dt->shared->u.enumer.sorted = H5T_SORT_NONE;
+    i = dt->shared->u.enumer.nmembs++;
+    dt->shared->u.enumer.name[i] = H5MM_xstrdup(name);
+    HDmemcpy(dt->shared->u.enumer.value+i*dt->shared->size, value, dt->shared->size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_member_value
+ *
+ * Purpose:	Return the value for an enumeration data type member.
+ *
+ * Return:	Success:	non-negative with the member value copied
+ *				into the memory pointed to by VALUE.
+ *
+ *		Failure:	negative, VALUE memory is undefined.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tget_member_value(hid_t type, unsigned membno, void *value/*out*/)
+{
+    H5T_t	*dt=NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIux", type, membno, value);
+
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(H5T_ENUM != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class")
+    if (membno>=dt->shared->u.enumer.nmembs)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number")
+    if (!value)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null value buffer")
+
+    if(H5T__get_member_value(dt, membno, value) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get member value")
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__get_member_value
+ *
+ * Purpose:	Private function for H5T__get_member_value.  Return the
+ *              value for an enumeration data type member.
+ *
+ * Return:	Success:	non-negative with the member value copied
+ *				into the memory pointed to by VALUE.
+ *
+ *		Failure:	negative, VALUE memory is undefined.
+ *
+ * Programmer:	Raymond Lu
+ *              October 9, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__get_member_value(const H5T_t *dt, unsigned membno, void *value/*out*/)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    HDassert(dt);
+    HDassert(value);
+
+    HDmemcpy(value, dt->shared->u.enumer.value + membno*dt->shared->size, dt->shared->size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tenum_nameof
+ *
+ * Purpose:	Finds the symbol name that corresponds to the specified VALUE
+ *		of an enumeration data type TYPE. At most SIZE characters of
+ *		the symbol name are copied into the NAME buffer. If the
+ *		entire symbol anem and null terminator do not fit in the NAME
+ *		buffer then as many characters as possible are copied (not
+ *		null terminated) and the function fails.
+ *
+ * Return:	Success:	Non-negative.
+ *
+ *		Failure:	Negative, first character of NAME is set to
+ *				null if SIZE allows it.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tenum_nameof(hid_t type, const void *value, char *name/*out*/, size_t size)
+{
+    H5T_t	*dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*xxz", type, value, name, size);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(H5T_ENUM != dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type")
+    if (!value)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value supplied")
+    if (!name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name buffer supplied")
+
+    if (NULL==H5T_enum_nameof(dt, value, name, size))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "nameof query failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_enum_nameof
+ *
+ * Purpose:	Finds the symbol name that corresponds the the specified
+ *		VALUE of an enumeration data type DT. At most SIZE characters
+ *		of the symbol name are copied into the NAME buffer. If the
+ *		entire symbol name and null terminator do not fit in the NAME
+ *		buffer then as many characters as possible are copied and the
+ *		function returns failure.
+ *
+ *		If NAME is the null pointer and SIZE is zero then enough
+ *		space is allocated to hold the result and a pointer to that
+ *		memory is returned.
+ *
+ * Return:	Success:	Pointer to NAME
+ *
+ *		Failure:	NULL, name[0] is set to null.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              Wednesday, Febuary 9, 2005
+ *              Made a copy of original datatype and do sorting and search
+ *              on that copy, to protect the original order of members.
+ *-------------------------------------------------------------------------
+ */
+static char *
+H5T_enum_nameof(const H5T_t *dt, const void *value, char *name/*out*/, size_t size)
+{
+    H5T_t       *copied_dt = NULL;      /* Do sorting in copied datatype */
+    unsigned	lt, md = 0, rt;		/* Indices for binary search	*/
+    int	        cmp = (-1);		/* Comparison result		*/
+    hbool_t     alloc_name = FALSE;     /* Whether name has been allocated */
+    char        *ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(dt && H5T_ENUM == dt->shared->type);
+    HDassert(value);
+    HDassert(name || 0 == size);
+
+    if(name && size > 0)
+        *name = '\0';
+
+    /* Sanity check */
+    if(dt->shared->u.enumer.nmembs == 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "datatype has no members")
+
+    /* Do a binary search over the values to find the correct one.  Do sorting
+     * and search on the copied datatype to protect the original order. */
+    if(NULL == (copied_dt = H5T_copy(dt, H5T_COPY_ALL)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy data type")
+    if(H5T__sort_value(copied_dt, NULL) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOMPARE, NULL, "value sort failed")
+
+    lt = 0;
+    rt = copied_dt->shared->u.enumer.nmembs;
+    while(lt < rt) {
+	md = (lt + rt) / 2;
+	cmp = HDmemcmp(value, copied_dt->shared->u.enumer.value + md * copied_dt->shared->size, copied_dt->shared->size);
+	if(cmp < 0)
+	    rt = md;
+	else if(cmp > 0)
+	    lt = md + 1;
+	else
+	    break;
+    } /* end while */
+
+    /* Value was not yet defined. This fixes bug # 774, 2002/06/05 EIP */
+    if(cmp != 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "value is currently not defined")
+
+    /* Save result name */
+    if(!name) {
+        if(NULL == (name = (char *)H5MM_malloc(
+                HDstrlen(copied_dt->shared->u.enumer.name[md]) + 1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+        alloc_name = TRUE;
+    } /* end if */
+    HDstrncpy(name, copied_dt->shared->u.enumer.name[md], size);
+    if(HDstrlen(copied_dt->shared->u.enumer.name[md]) >= size)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, NULL, "name has been truncated")
+
+    /* Set return value */
+    ret_value = name;
+
+done:
+    if(copied_dt)
+        if(H5T_close(copied_dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, NULL, "unable to close data type");
+    if(!ret_value && alloc_name)
+        H5MM_free(name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_enum_nameof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tenum_valueof
+ *
+ * Purpose:	Finds the value that corresponds to the specified NAME f an
+ *		enumeration TYPE. The VALUE argument should be at least as
+ *		large as the value of H5Tget_size(type) in order to hold the
+ *		result.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              Wednesday, Febuary 9, 2005
+ *              Made a copy of original datatype and do sorting and search
+ *              on that copy, to protect the original order of members.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tenum_valueof(hid_t type, const char *name, void *value/*out*/)
+{
+    H5T_t	*dt;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*sx", type, name, value);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if(H5T_ENUM != dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type")
+    if(!name || !*name)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
+    if(!value)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value buffer")
+
+    if(H5T_enum_valueof(dt, name, value) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "valueof query failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Tenum_valueof() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_enum_valueof
+ *
+ * Purpose:	Finds the value that corresponds the the specified symbol
+ *		NAME of an enumeration data type DT and copy it to the VALUE
+ *		result buffer. The VALUE should be allocated by the caller to
+ *		be large enough for the result.
+ *
+ * Return:	Success:	Non-negative, value stored in VALUE.
+ *
+ *		Failure:	Negative, VALUE is undefined.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              Wednesday, Febuary 9, 2005
+ *              Made a copy of original datatype and do sorting and search
+ *              on that copy, to protect the original order of members.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_enum_valueof(const H5T_t *dt, const char *name, void *value/*out*/)
+{
+    unsigned	lt, md=0, rt;		/*indices for binary search	*/
+    int	        cmp=(-1);		/*comparison result		*/
+    H5T_t       *copied_dt = NULL;      /*do sorting in copied datatype */
+    herr_t      ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(dt && H5T_ENUM==dt->shared->type);
+    HDassert(name && *name);
+    HDassert(value);
+
+    /* Sanity check */
+    if (dt->shared->u.enumer.nmembs == 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "datatype has no members")
+
+    /* Do a binary search over the names to find the correct one.  Do sorting
+     * and search on the copied datatype to protect the original order. */
+    if (NULL==(copied_dt=H5T_copy(dt, H5T_COPY_ALL)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy data type");
+    if(H5T__sort_name(copied_dt, NULL) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOMPARE, FAIL, "value sort failed")
+
+    lt = 0;
+    rt = copied_dt->shared->u.enumer.nmembs;
+
+    while (lt<rt) {
+	md = (lt+rt)/2;
+	cmp = HDstrcmp(name, copied_dt->shared->u.enumer.name[md]);
+	if (cmp<0) {
+	    rt = md;
+	} else if (cmp>0) {
+	    lt = md+1;
+	} else {
+	    break;
+	}
+    }
+    /* Value was not yet defined. This fixes bug # 774, 2002/06/05 EIP */
+    if (cmp!=0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "string doesn't exist in the enumeration type")
+
+    HDmemcpy(value, copied_dt->shared->u.enumer.value+md*copied_dt->shared->size, copied_dt->shared->size);
+
+done:
+    if(copied_dt)
+        if(H5T_close(copied_dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close data type")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tfields.c b/gatb-core/thirdparty/hdf5/src/H5Tfields.c
new file mode 100644
index 0000000..fb186fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tfields.c
@@ -0,0 +1,513 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains commond functionality for fields in
+ *      enumerated & compound datatypes in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_fields_interface
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5MMprivate.h"	/*memory management			  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_fields_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_fields_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_fields_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_fields_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_nmembers
+ *
+ * Purpose:	Determines how many members TYPE_ID has.  The type must be
+ *		either a compound datatype or an enumeration datatype.
+ *
+ * Return:	Success:	Number of members defined in the datatype.
+ *
+ *		Failure:	Negative
+ *
+ * Errors:
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, December  8, 1997
+ *
+ * Modifications:
+ *	Robb Matzke, 22 Dec 1998
+ *	Also works with enumeration datatypes.
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_nmembers(hid_t type_id)
+{
+    H5T_t *dt;          /* Datatype to query */
+    int	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("Is", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    if((ret_value = H5T_get_nmembers(dt)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot return member number")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_nmembers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_nmembers
+ *
+ * Purpose:	Private function for H5Tget_nmembers.  Determines how many
+ *              members DTYPE has.  The type must be either a compound data
+ *              type or an enumeration datatype.
+ *
+ * Return:	Success:	Number of members defined in the datatype.
+ *
+ *		Failure:	Negative
+ *
+ * Errors:
+ *
+ * Programmer:  Raymond Lu
+ *	        October 8, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_get_nmembers(const H5T_t *dt)
+{
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+
+    if(H5T_COMPOUND == dt->shared->type)
+	ret_value = (int)dt->shared->u.compnd.nmembs;
+    else if(H5T_ENUM == dt->shared->type)
+	ret_value = (int)dt->shared->u.enumer.nmembs;
+    else
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "operation not supported for type class")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_nmembers() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_member_name
+ *
+ * Purpose:	Returns the name of a member of a compound or enumeration
+ *		datatype. Members are stored in no particular order with
+ *		numbers 0 through N-1 where N is the value returned by
+ *		H5Tget_nmembers().
+ *
+ * Return:	Success:	Ptr to a string allocated with malloc().  The
+ *				caller is responsible for freeing the string.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *	Robb Matzke, 22 Dec 1998
+ *	Also works with enumeration datatypes.
+ *-------------------------------------------------------------------------
+ */
+char *
+H5Tget_member_name(hid_t type_id, unsigned membno)
+{
+    H5T_t	*dt = NULL;
+    char	*ret_value;
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE2("*s", "iIu", type_id, membno);
+
+    /* Check args */
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype")
+
+    if(NULL == (ret_value = H5T__get_member_name(dt, membno)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get member name")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__get_member_name
+ *
+ * Purpose:	Private function for H5Tget_member_name.  Returns the name
+ *              of a member of a compound or enumeration datatype. Members
+ *              are stored in no particular order with numbers 0 through
+ *              N-1 where N is the value returned by H5Tget_nmembers().
+ *
+ * Return:	Success:	Ptr to a string allocated with malloc().  The
+ *				caller is responsible for freeing the string.
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Raymond Lu
+ *              October 9, 2002
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+char *
+H5T__get_member_name(H5T_t const *dt, unsigned membno)
+{
+    char	*ret_value;
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(dt);
+
+    switch (dt->shared->type) {
+        case H5T_COMPOUND:
+            if (membno>=dt->shared->u.compnd.nmembs)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number")
+            ret_value = H5MM_xstrdup(dt->shared->u.compnd.memb[membno].name);
+            break;
+
+        case H5T_ENUM:
+            if (membno>=dt->shared->u.enumer.nmembs)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number")
+            ret_value = H5MM_xstrdup(dt->shared->u.enumer.name[membno]);
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "operation not supported for type class")
+    } /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Tget_member_index
+ *
+ * Purpose:     Returns the index of a member in a compound or enumeration
+ *              datatype by given name.Members are stored in no particular
+ *              order with numbers 0 through N-1 where N is the value
+ *              returned by H5Tget_nmembers().
+ *
+ * Return:      Success:        index of the member if exists.
+ *              Failure:        -1.
+ *
+ * Programmer:  Raymond Lu
+ *              Thursday, April 4, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_member_index(hid_t type_id, const char *name)
+{
+    H5T_t       *dt = NULL;
+    int         ret_value=FAIL;
+    unsigned    i;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("Is", "i*s", type_id, name);
+
+    /* Check arguments */
+    HDassert(name);
+    if(NULL == (dt = (H5T_t*)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Locate member by name */
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+            for(i = 0; i < dt->shared->u.compnd.nmembs; i++)
+                if(!HDstrcmp(dt->shared->u.compnd.memb[i].name, name))
+                    HGOTO_DONE((int)i)
+            break;
+        case H5T_ENUM:
+            for(i = 0; i < dt->shared->u.enumer.nmembs; i++)
+                if(!HDstrcmp(dt->shared->u.enumer.name[i], name))
+                    HGOTO_DONE((int)i)
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "operation not supported for this type")
+    } /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_member_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__sort_value
+ *
+ * Purpose:	Sorts the members of a compound datatype by their offsets;
+ *		sorts the members of an enum type by their values. This even
+ *		works for locked datatypes since it doesn't change the value
+ *		of the type.  MAP is an optional parallel integer array which
+ *		is also swapped along with members of DT.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__sort_value(const H5T_t *dt, int *map)
+{
+    unsigned	nmembs;                 /* Number of members for datatype */
+    size_t	size;
+    hbool_t	swapped;                /* Whether we've swapped fields */
+    uint8_t	tbuf[32];
+    unsigned	i, j;                   /* Local index variables */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(H5T_COMPOUND == dt->shared->type || H5T_ENUM == dt->shared->type);
+
+    /* Use a bubble sort because we can short circuit */
+    if(H5T_COMPOUND == dt->shared->type) {
+	if(H5T_SORT_VALUE != dt->shared->u.compnd.sorted) {
+	    dt->shared->u.compnd.sorted = H5T_SORT_VALUE;
+	    nmembs = dt->shared->u.compnd.nmembs;
+	    for(i = nmembs - 1, swapped = TRUE; i > 0 && swapped; --i) {
+		for(j = 0, swapped = FALSE; j < i; j++) {
+		    if(dt->shared->u.compnd.memb[j].offset > dt->shared->u.compnd.memb[j + 1].offset) {
+                        H5T_cmemb_t tmp = dt->shared->u.compnd.memb[j];
+			dt->shared->u.compnd.memb[j] = dt->shared->u.compnd.memb[j + 1];
+			dt->shared->u.compnd.memb[j + 1] = tmp;
+			if(map) {
+			    int x = map[j];
+
+			    map[j] = map[j + 1];
+			    map[j + 1] = x;
+			} /* end if */
+			swapped = TRUE;
+		    } /* end if */
+		} /* end for */
+	    } /* end for */
+#ifndef NDEBUG
+	    /* I never trust a sort :-) -RPM */
+	    for(i = 0; i < (nmembs - 1); i++)
+		HDassert(dt->shared->u.compnd.memb[i].offset < dt->shared->u.compnd.memb[i + 1].offset);
+#endif
+	} /* end if */
+    } else if(H5T_ENUM == dt->shared->type) {
+	if(H5T_SORT_VALUE != dt->shared->u.enumer.sorted) {
+	    dt->shared->u.enumer.sorted = H5T_SORT_VALUE;
+	    nmembs = dt->shared->u.enumer.nmembs;
+	    size = dt->shared->size;
+	    HDassert(size <= sizeof(tbuf));
+	    for(i = (nmembs - 1), swapped = TRUE; i > 0 && swapped; --i) {
+		for(j = 0, swapped = FALSE; j < i; j++) {
+		    if(HDmemcmp(dt->shared->u.enumer.value + (j * size), dt->shared->u.enumer.value + ((j + 1) * size), size) > 0) {
+			/* Swap names */
+			char *tmp = dt->shared->u.enumer.name[j];
+			dt->shared->u.enumer.name[j] = dt->shared->u.enumer.name[j + 1];
+			dt->shared->u.enumer.name[j + 1] = tmp;
+
+			/* Swap values */
+			HDmemcpy(tbuf, dt->shared->u.enumer.value + (j * size), size);
+			HDmemcpy(dt->shared->u.enumer.value + (j * size),
+				 dt->shared->u.enumer.value + ((j + 1) * size), size);
+			HDmemcpy(dt->shared->u.enumer.value + ((j + 1) * size), tbuf, size);
+
+			/* Swap map */
+			if(map) {
+			    int x = map[j];
+
+			    map[j] = map[j + 1];
+			    map[j + 1] = x;
+			} /* end if */
+
+			swapped = TRUE;
+		    } /* end if */
+		} /* end for */
+	    } /* end for */
+#ifndef NDEBUG
+	    /* I never trust a sort :-) -RPM */
+	    for(i = 0; i < (nmembs - 1); i++)
+		HDassert(HDmemcmp(dt->shared->u.enumer.value + (i * size), dt->shared->u.enumer.value + ((i + 1) * size), size) < 0);
+#endif
+	} /* end if */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__sort_value() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__sort_name
+ *
+ * Purpose:	Sorts members of a compound or enumeration datatype by their
+ *		names. This even works for locked datatypes since it doesn't
+ *		change the value of the types.
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, January  4, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__sort_name(const H5T_t *dt, int *map)
+{
+    unsigned	i, j, nmembs;
+    size_t	size;
+    hbool_t	swapped;
+    uint8_t	tbuf[32];
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(H5T_COMPOUND==dt->shared->type || H5T_ENUM==dt->shared->type);
+
+    /* Use a bubble sort because we can short circuit */
+    if (H5T_COMPOUND==dt->shared->type) {
+	if (H5T_SORT_NAME!=dt->shared->u.compnd.sorted) {
+	    dt->shared->u.compnd.sorted = H5T_SORT_NAME;
+	    nmembs = dt->shared->u.compnd.nmembs;
+	    for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) {
+		for (j=0, swapped=FALSE; j<i; j++) {
+		    if (HDstrcmp(dt->shared->u.compnd.memb[j].name,
+				 dt->shared->u.compnd.memb[j+1].name)>0) {
+			H5T_cmemb_t tmp = dt->shared->u.compnd.memb[j];
+			dt->shared->u.compnd.memb[j] = dt->shared->u.compnd.memb[j+1];
+			dt->shared->u.compnd.memb[j+1] = tmp;
+			swapped = TRUE;
+			if (map) {
+			    int x = map[j];
+			    map[j] = map[j+1];
+			    map[j+1] = x;
+			}
+		    }
+		}
+	    }
+#ifndef NDEBUG
+	    /* I never trust a sort :-) -RPM */
+	    for (i=0; i<nmembs-1; i++) {
+		HDassert(HDstrcmp(dt->shared->u.compnd.memb[i].name,
+				dt->shared->u.compnd.memb[i+1].name)<0);
+	    }
+#endif
+	}
+    } else if (H5T_ENUM==dt->shared->type) {
+	if (H5T_SORT_NAME!=dt->shared->u.enumer.sorted) {
+	    dt->shared->u.enumer.sorted = H5T_SORT_NAME;
+	    nmembs = dt->shared->u.enumer.nmembs;
+	    size = dt->shared->size;
+	    HDassert(size<=sizeof(tbuf));
+	    for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) {
+		for (j=0, swapped=FALSE; j<i; j++) {
+		    if (HDstrcmp(dt->shared->u.enumer.name[j],
+				 dt->shared->u.enumer.name[j+1])>0) {
+			/* Swap names */
+			char *tmp = dt->shared->u.enumer.name[j];
+			dt->shared->u.enumer.name[j] = dt->shared->u.enumer.name[j+1];
+			dt->shared->u.enumer.name[j+1] = tmp;
+
+			/* Swap values */
+			HDmemcpy(tbuf, dt->shared->u.enumer.value+j*size, size);
+			HDmemcpy(dt->shared->u.enumer.value+j*size,
+				 dt->shared->u.enumer.value+(j+1)*size, size);
+			HDmemcpy(dt->shared->u.enumer.value+(j+1)*size, tbuf, size);
+
+			/* Swap map */
+			if (map) {
+			    int x = map[j];
+			    map[j] = map[j+1];
+			    map[j+1] = x;
+			}
+
+			swapped = TRUE;
+		    }
+		}
+	    }
+#ifndef NDEBUG
+	    /* I never trust a sort :-) -RPM */
+	    for (i=0; i<nmembs-1; i++)
+		HDassert(HDstrcmp(dt->shared->u.enumer.name[i], dt->shared->u.enumer.name[i+1])<0);
+#endif
+	}
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tfixed.c b/gatb-core/thirdparty/hdf5/src/H5Tfixed.c
new file mode 100644
index 0000000..b2401d4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tfixed.c
@@ -0,0 +1,180 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for fixed-point (i.e.
+ *      integer) datatypes in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_fixed_interface
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_fixed_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_fixed_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_fixed_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_fixed_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_sign
+ *
+ * Purpose:	Retrieves the sign type for an integer type.
+ *
+ * Return:	Success:	The sign type.
+ *
+ *		Failure:	H5T_SGN_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *	Robb Matzke, 22 Dec 1998
+ *	Also works with derived datatypes.
+ *-------------------------------------------------------------------------
+ */
+H5T_sign_t
+H5Tget_sign(hid_t type_id)
+{
+    H5T_t		*dt = NULL;
+    H5T_sign_t		ret_value;
+
+    FUNC_ENTER_API(H5T_SGN_ERROR)
+    H5TRACE1("Ts", "i", type_id);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, "not an integer datatype")
+
+    ret_value = H5T_get_sign(dt);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_sign
+ *
+ * Purpose:	Private function for H5Tget_sign.  Retrieves the sign type
+ *              for an integer type.
+ *
+ * Return:	Success:	The sign type.
+ *
+ *		Failure:	H5T_SGN_ERROR (Negative)
+ *
+ * Programmer:	Raymond Lu
+ *		October 8, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_sign_t
+H5T_get_sign(H5T_t const *dt)
+{
+    H5T_sign_t		ret_value;
+
+    FUNC_ENTER_NOAPI(H5T_SGN_ERROR)
+
+    HDassert(dt);
+
+    /* Defer to parent */
+    while(dt->shared->parent)
+        dt = dt->shared->parent;
+
+    /* Check args */
+    if (H5T_INTEGER!=dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_SGN_ERROR, "operation not defined for datatype class")
+
+    /* Sign */
+    ret_value = dt->shared->u.atomic.u.i.sign;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_sign
+ *
+ * Purpose:	Sets the sign property for an integer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works with derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_sign(hid_t type_id, H5T_sign_t sign)
+{
+    H5T_t	*dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTs", type_id, sign);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer datatype")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
+    if (sign < H5T_SGN_NONE || sign >= H5T_NSGN)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type")
+    if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+    while (dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if (H5T_INTEGER!=dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class")
+
+    /* Commit */
+    dt->shared->u.atomic.u.i.sign = sign;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tfloat.c b/gatb-core/thirdparty/hdf5/src/H5Tfloat.c
new file mode 100644
index 0000000..fff413d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tfloat.c
@@ -0,0 +1,422 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for floating-point
+ *      datatypes in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_float_interface
+
+
+#include "H5private.h"		/*generic functions			  */
+#include "H5Eprivate.h"		/*error handling			  */
+#include "H5Iprivate.h"		/*ID functions		   		  */
+#include "H5Tpkg.h"		/*data-type functions			  */
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_float_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_float_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_float_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_float_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_fields
+ *
+ * Purpose:	Returns information about the locations of the various bit
+ *		fields of a floating point datatype.  The field positions
+ *		are bit positions in the significant region of the datatype.
+ *		Bits are numbered with the least significant bit number zero.
+ *
+ *		Any (or even all) of the arguments can be null pointers.
+ *
+ * Return:	Success:	Non-negative, field locations and sizes are
+ *				returned through the arguments.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tget_fields(hid_t type_id, size_t *spos/*out*/, size_t *epos/*out*/,
+size_t *esize/*out*/, size_t *mpos/*out*/, size_t *msize/*out*/)
+{
+    H5T_t	*dt;                    /* Datatype */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "ixxxxx", type_id, spos, epos, esize, mpos, msize);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class")
+
+    /* Get values */
+    if(spos)
+        *spos = dt->shared->u.atomic.u.f.sign;
+    if(epos)
+        *epos = dt->shared->u.atomic.u.f.epos;
+    if(esize)
+        *esize = dt->shared->u.atomic.u.f.esize;
+    if(mpos)
+        *mpos = dt->shared->u.atomic.u.f.mpos;
+    if(msize)
+        *msize = dt->shared->u.atomic.u.f.msize;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_fields() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_fields
+ *
+ * Purpose:	Sets the locations and sizes of the various floating point
+ *		bit fields.  The field positions are bit positions in the
+ *		significant region of the datatype.  Bits are numbered with
+ *		the least significant bit number zero.
+ *
+ *		Fields are not allowed to extend beyond the number of bits of
+ *		precision, nor are they allowed to overlap with one another.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize,
+    size_t mpos, size_t msize)
+{
+    H5T_t	*dt;                    /* Datatype */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "izzzzz", type_id, spos, epos, esize, mpos, msize);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_TRANSIENT != dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class")
+    if(epos + esize > dt->shared->u.atomic.prec)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent bit field size/location is invalid")
+    if(mpos + msize > dt->shared->u.atomic.prec)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mantissa bit field size/location is invalid")
+    if(spos >= dt->shared->u.atomic.prec)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign location is not valid")
+
+    /* Check for overlap */
+    if(spos >= epos && spos < epos + esize)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within exponent field")
+    if(spos >= mpos && spos < mpos + msize)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within mantissa field")
+    if((mpos < epos && mpos + msize > epos) || (epos < mpos && epos + esize > mpos))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent and mantissa fields overlap")
+
+    /* Commit */
+    dt->shared->u.atomic.u.f.sign = spos;
+    dt->shared->u.atomic.u.f.epos = epos;
+    dt->shared->u.atomic.u.f.mpos = mpos;
+    dt->shared->u.atomic.u.f.esize = esize;
+    dt->shared->u.atomic.u.f.msize = msize;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_fields() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_ebias
+ *
+ * Purpose:	Retrieves the exponent bias of a floating-point type.
+ *
+ * Return:	Success:	The bias
+ *
+ *		Failure:	0
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5Tget_ebias(hid_t type_id)
+{
+    H5T_t	*dt;                    /* Datatype */
+    size_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_API(0)
+    H5TRACE1("z", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, 0, "operation not defined for datatype class")
+
+    /* bias */
+    H5_CHECKED_ASSIGN(ret_value, size_t, dt->shared->u.atomic.u.f.ebias, uint64_t);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_ebias() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_ebias
+ *
+ * Purpose:	Sets the exponent bias of a floating-point type.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works with derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_ebias(hid_t type_id, size_t ebias)
+{
+    H5T_t	*dt;                    /* Datatype */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", type_id, ebias);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_TRANSIENT != dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class")
+
+    /* Commit */
+    dt->shared->u.atomic.u.f.ebias = ebias;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_ebias() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_norm
+ *
+ * Purpose:	Returns the mantisssa normalization of a floating-point data
+ *		type.
+ *
+ * Return:	Success:	Normalization ID
+ *
+ *		Failure:	H5T_NORM_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_norm_t
+H5Tget_norm(hid_t type_id)
+{
+    H5T_t	*dt;            /* Datatype */
+    H5T_norm_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(H5T_NORM_ERROR)
+    H5TRACE1("Tn", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NORM_ERROR, "not a datatype")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, H5T_NORM_ERROR, "operation not defined for datatype class")
+
+    /* norm */
+    ret_value = dt->shared->u.atomic.u.f.norm;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_norm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_norm
+ *
+ * Purpose:	Sets the mantissa normalization method for a floating point
+ *		datatype.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_norm(hid_t type_id, H5T_norm_t norm)
+{
+    H5T_t	*dt;                    /* Datatype */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTn", type_id, norm);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_TRANSIENT != dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+    if(norm < H5T_NORM_IMPLIED || norm > H5T_NORM_NONE)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal normalization")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class")
+
+    /* Commit */
+    dt->shared->u.atomic.u.f.norm = norm;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_norm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_inpad
+ *
+ * Purpose:	If any internal bits of a floating point type are unused
+ *		(that is, those significant bits which are not part of the
+ *		sign, exponent, or mantissa) then they will be filled
+ *		according to the value of this property.
+ *
+ * Return:	Success:	The internal padding type.
+ *
+ *		Failure:	H5T_PAD_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_pad_t
+H5Tget_inpad(hid_t type_id)
+{
+    H5T_t	*dt;            /* Datatype */
+    H5T_pad_t	ret_value;      /* Return value */
+
+    FUNC_ENTER_API(H5T_PAD_ERROR)
+    H5TRACE1("Tp", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_PAD_ERROR, "not a datatype")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, H5T_PAD_ERROR, "operation not defined for datatype class")
+
+    /* pad */
+    ret_value = dt->shared->u.atomic.u.f.pad;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_inpad() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_inpad
+ *
+ * Purpose:	If any internal bits of a floating point type are unused
+ *		(that is, those significant bits which are not part of the
+ *		sign, exponent, or mantissa) then they will be filled
+ *		according to the value of this property.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_inpad(hid_t type_id, H5T_pad_t pad)
+{
+    H5T_t	*dt;                    /* Datatype */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTp", type_id, pad);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(H5T_STATE_TRANSIENT != dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+    if(pad < H5T_PAD_ZERO || pad >= H5T_NPAD)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal internal pad type")
+    while(dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if(H5T_FLOAT != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class")
+
+    /* Commit */
+    dt->shared->u.atomic.u.f.pad = pad;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_inpad() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tnative.c b/gatb-core/thirdparty/hdf5/src/H5Tnative.c
new file mode 100644
index 0000000..bf6ba08
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tnative.c
@@ -0,0 +1,937 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for querying
+ *      a "native" datatype for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_native_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+/* Static local functions */
+static H5T_t *H5T_get_native_type(H5T_t *dt, H5T_direction_t direction,
+                                  size_t *struct_align, size_t *offset, size_t *comp_size);
+static H5T_t *H5T_get_native_integer(size_t prec, H5T_sign_t sign, H5T_direction_t direction,
+                                     size_t *struct_align, size_t *offset, size_t *comp_size);
+static H5T_t *H5T_get_native_float(size_t size, H5T_direction_t direction,
+                                   size_t *struct_align, size_t *offset, size_t *comp_size);
+static H5T_t* H5T_get_native_bitfield(size_t prec, H5T_direction_t direction,
+                                   size_t *struct_align, size_t *offset, size_t *comp_size);
+static herr_t H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size,
+                         size_t nelems, size_t align, size_t *struct_align);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_native_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_native_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_native_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_native_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Tget_native_type
+ *
+ * Purpose:     High-level API to return the native type of a datatype.
+ *              The native type is chosen by matching the size and class of
+ *              querried datatype from the following native premitive
+ *              datatypes:
+ *                      H5T_NATIVE_CHAR         H5T_NATIVE_UCHAR
+ *                      H5T_NATIVE_SHORT        H5T_NATIVE_USHORT
+ *                      H5T_NATIVE_INT          H5T_NATIVE_UINT
+ *                      H5T_NATIVE_LONG         H5T_NATIVE_ULONG
+ *                      H5T_NATIVE_LLONG        H5T_NATIVE_ULLONG
+ *
+ *                      H5T_NATIVE_FLOAT
+ *                      H5T_NATIVE_DOUBLE
+ *                      H5T_NATIVE_LDOUBLE
+ *
+ *              Compound, array, enum, and VL types all choose among these
+ *              types for theire members.  Time, Bifield, Opaque, Reference
+ *              types are only copy out.
+ *
+ * Return:      Success:        Returns the native data type if successful.
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 3, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tget_native_type(hid_t type_id, H5T_direction_t direction)
+{
+    H5T_t       *dt;                /* Datatype to create native datatype from */
+    H5T_t       *new_dt=NULL;       /* Datatype for native datatype created */
+    size_t      comp_size=0;        /* Compound datatype's size */
+    hid_t       ret_value;          /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "iTd", type_id, direction);
+
+    /* check argument */
+    if(NULL==(dt=(H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+
+    if(direction!=H5T_DIR_DEFAULT && direction!=H5T_DIR_ASCEND
+            && direction!=H5T_DIR_DESCEND)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not valid direction value")
+
+    if((new_dt = H5T_get_native_type(dt, direction, NULL, NULL, &comp_size))==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot retrieve native type")
+
+    if((ret_value=H5I_register(H5I_DATATYPE, new_dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type")
+
+done:
+    /* Error cleanup */
+    if(ret_value<0) {
+        if(new_dt)
+            if(H5T_close(new_dt)<0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_get_native_type
+ *
+ * Purpose:     Returns the native type of a datatype.
+ *
+ * Return:      Success:        Returns the native data type if successful.
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 3, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t *
+H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size)
+{
+    H5T_t       *dt;                /* Datatype to make native */
+    H5T_t       *super_type;        /* Super type of VL, array and enum datatypes */
+    H5T_t       *nat_super_type;    /* Native form of VL, array & enum super datatype */
+    H5T_t       *new_type = NULL;   /* New native datatype */
+    H5T_t       *memb_type = NULL;  /* Datatype of member */
+    H5T_t       **memb_list = NULL; /* List of compound member IDs */
+    size_t      *memb_offset = NULL; /* List of member offsets in compound type, including member size and alignment */
+    char        **comp_mname = NULL; /* List of member names in compound type */
+    char        *memb_name = NULL;  /* Enum's member name */
+    void        *memb_value = NULL; /* Enum's member value */
+    void        *tmp_memb_value = NULL; /* Enum's member value */
+    hsize_t     *dims = NULL;       /* Dimension sizes for array */
+    H5T_class_t h5_class;           /* Class of datatype to make native */
+    size_t      size;               /* Size of datatype to make native */
+    size_t      prec;               /* Precision of datatype to make native */
+    int         snmemb;             /* Number of members in compound & enum types */
+    unsigned    nmemb = 0;          /* Number of members in compound & enum types */
+    unsigned    u;                  /* Local index variable */
+    H5T_t       *ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(dtype);
+
+    if(H5T_NO_CLASS == (h5_class = H5T_get_class(dtype, FALSE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid class")
+
+    if(0 == (size =  H5T_get_size(dtype)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid size")
+
+    switch(h5_class) {
+        case H5T_INTEGER:
+            {
+                H5T_sign_t  sign;       /* Signedness of integer type */
+
+                if(H5T_SGN_ERROR == (sign =  H5T_get_sign(dtype)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid signess")
+
+                prec =  dtype->shared->u.atomic.prec;
+
+                if(NULL == (ret_value = H5T_get_native_integer(prec, sign, direction, struct_align, offset, comp_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve integer type")
+            } /* end case */
+            break;
+
+        case H5T_FLOAT:
+            if(NULL == (ret_value = H5T_get_native_float(size, direction, struct_align, offset, comp_size)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type")
+
+            break;
+
+        case H5T_STRING:
+            if(NULL == (ret_value = H5T_copy(dtype, H5T_COPY_TRANSIENT)))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type")
+
+            if(H5T_IS_VL_STRING(dtype->shared)) {
+                /* Update size, offset and compound alignment for parent. */
+                if(H5T_cmp_offset(comp_size, offset, sizeof(char *), (size_t)1, H5T_POINTER_COMP_ALIGN_g, struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+            } /* end if */
+            else {
+                /* Update size, offset and compound alignment for parent. */
+                if(H5T_cmp_offset(comp_size, offset, sizeof(char), size, H5T_NATIVE_SCHAR_COMP_ALIGN_g, struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+            } /* end else */
+            break;
+
+        /* The time type will be supported in the future.  Simply return "not supported"
+         * message for now.*/
+        case H5T_TIME:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "time type is not supported yet")
+
+        case H5T_BITFIELD:
+            {
+                prec =  dtype->shared->u.atomic.prec;
+
+                if(NULL == (ret_value = H5T_get_native_bitfield(prec, direction, struct_align, offset, comp_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve integer for bitfield type")
+            } /* end case */
+            break;
+
+        case H5T_OPAQUE:
+            if(NULL == (ret_value = H5T_copy(dtype, H5T_COPY_TRANSIENT)))
+                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type")
+
+            /* Update size, offset and compound alignment for parent. */
+            if(H5T_cmp_offset(comp_size, offset, sizeof(char), size, H5T_NATIVE_SCHAR_COMP_ALIGN_g, struct_align) < 0)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+            break;
+
+        case H5T_REFERENCE:
+            {
+                size_t align;
+                size_t ref_size;
+                int    not_equal;
+
+                if(NULL == (ret_value = H5T_copy(dtype, H5T_COPY_TRANSIENT)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type")
+
+                /* Decide if the data type is object or dataset region reference. */
+                if(NULL == (dt = (H5T_t *)H5I_object(H5T_STD_REF_OBJ_g)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+                not_equal = H5T_cmp(ret_value, dt, FALSE);
+
+                /* Update size, offset and compound alignment for parent. */
+                if(!not_equal) {
+                    align = H5T_HOBJREF_COMP_ALIGN_g;
+                    ref_size = sizeof(hobj_ref_t);
+                } /* end if */
+                else {
+                    align = H5T_HDSETREGREF_COMP_ALIGN_g;
+                    ref_size = sizeof(hdset_reg_ref_t);
+                } /* end else */
+
+                if(H5T_cmp_offset(comp_size, offset, ref_size, (size_t)1, align, struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+            } /* end case */
+            break;
+
+        case H5T_COMPOUND:
+            {
+                size_t      children_size = 0;/* Total size of compound members */
+                size_t      children_st_align = 0;    /* The max alignment among compound members.  This'll be the compound alignment */
+
+                if((snmemb = H5T_get_nmembers(dtype)) <= 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "compound data type doesn't have any member")
+                H5_CHECKED_ASSIGN(nmemb, unsigned, snmemb, int);
+
+                if(NULL == (memb_list   = (H5T_t **)H5MM_calloc(nmemb * sizeof(H5T_t *))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+                if(NULL == (memb_offset = (size_t *)H5MM_calloc(nmemb * sizeof(size_t))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+                if(NULL == (comp_mname = (char **)H5MM_calloc(nmemb * sizeof(char *))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+
+                /* Construct child compound type and retrieve a list of their IDs, offsets, total size, and alignment for compound type. */
+                for(u = 0; u < nmemb; u++) {
+                    if(NULL == (memb_type = H5T_get_member_type(dtype, u, H5T_COPY_TRANSIENT)))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member type retrieval failed")
+
+                    if(NULL == (comp_mname[u] = H5T__get_member_name(dtype, u)))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member type retrieval failed")
+
+                    if(NULL == (memb_list[u] = H5T_get_native_type(memb_type, direction, &children_st_align, &(memb_offset[u]), &children_size)))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member identifier retrieval failed")
+
+                    if(H5T_close(memb_type) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype")
+                } /* end for */
+
+                /* The alignment for whole compound type */
+                if(children_st_align && children_size % children_st_align)
+                    children_size += children_st_align - (children_size % children_st_align);
+
+                /* Construct new compound type based on native type */
+                if(NULL == (new_type = H5T__create(H5T_COMPOUND, children_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot create a compound type")
+
+                /* Insert members for the new compound type */
+                for(u = 0; u < nmemb; u++)
+                    if(H5T__insert(new_type, comp_mname[u], memb_offset[u], memb_list[u]) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot insert member to compound datatype")
+
+                /* Update size, offset and compound alignment for parent in the case of
+                 * nested compound type.  The alignment for a compound type as one field in
+                 * a compound type is the biggest compound alignment among all its members.
+                 * e.g. in the structure
+                 *    typedef struct s1 {
+                 *        char            c;
+                 *        int             i;
+                 *        s2              st;
+                 *        unsigned long long       l;
+                 *    } s1;
+                 *    typedef struct s2 {
+                 *        short           c2;
+                 *        long            l2;
+                 *        long long       ll2;
+                 *    } s2;
+                 * The alignment for ST in S1 is the biggest structure alignment of all the
+                 * members of S2, which is probably the LL2 of 'long long'. -SLU 2010/4/28
+                 */
+                if(H5T_cmp_offset(comp_size, offset, children_size, (size_t)1, children_st_align,
+                                  struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+                /* Close member data type */
+                for(u = 0; u < nmemb; u++) {
+                    if(H5T_close(memb_list[u]) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype")
+
+                    /* Free member names in list */
+                    comp_mname[u] = (char *)H5MM_xfree(comp_mname[u]);
+                } /* end for */
+
+                /* Free lists for members */
+                memb_list = (H5T_t **)H5MM_xfree(memb_list);
+                memb_offset = (size_t *)H5MM_xfree(memb_offset);
+                comp_mname = (char **)H5MM_xfree(comp_mname);
+
+                ret_value = new_type;
+            } /* end case */
+            break;
+
+        case H5T_ENUM:
+            {
+                H5T_path_t *tpath;	/* Type conversion info	*/
+                hid_t       super_type_id, nat_super_type_id;
+
+                /* Don't need to do anything special for alignment, offset since the ENUM type usually is integer. */
+
+                /* Retrieve base type for enumerated type */
+                if(NULL == (super_type = H5T_get_super(dtype)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get base type for enumerate type")
+                if(NULL == (nat_super_type = H5T_get_native_type(super_type, direction, struct_align, offset, comp_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "base native type retrieval failed")
+
+                if((super_type_id = H5I_register(H5I_DATATYPE, super_type, FALSE)) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot register datatype")
+                if((nat_super_type_id = H5I_register(H5I_DATATYPE, nat_super_type, FALSE)) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot register datatype")
+
+                /* Allocate room for the enum values */
+                if(NULL == (tmp_memb_value = H5MM_calloc(H5T_get_size(super_type))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+                if(NULL == (memb_value = H5MM_calloc(H5T_get_size(nat_super_type))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+
+                /* Construct new enum type based on native type */
+                if(NULL == (new_type = H5T__enum_create(nat_super_type)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create enum type")
+
+                /* Find the conversion function */
+                if(NULL == (tpath = H5T_path_find(super_type, nat_super_type, NULL, NULL, H5P_DEFAULT, FALSE)))
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between src and dst data types")
+
+                /* Retrieve member info and insert members into new enum type */
+                if((snmemb = H5T_get_nmembers(dtype)) <= 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "enumerate data type doesn't have any member")
+                H5_CHECKED_ASSIGN(nmemb, unsigned, snmemb, int);
+                for(u = 0; u < nmemb; u++) {
+                    if(NULL == (memb_name = H5T__get_member_name(dtype, u)))
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get member name")
+                    if(H5T__get_member_value(dtype, u, tmp_memb_value) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get member value")
+                    HDmemcpy(memb_value, tmp_memb_value, H5T_get_size(super_type));
+
+                    if(H5T_convert(tpath, super_type_id, nat_super_type_id, (size_t)1, (size_t)0, (size_t)0, memb_value, NULL, H5P_DATASET_XFER_DEFAULT) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get member value")
+
+                    if(H5T__enum_insert(new_type, memb_name, memb_value) < 0)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot insert member")
+                    memb_name = (char *)H5MM_xfree(memb_name);
+                }
+                memb_value = H5MM_xfree(memb_value);
+                tmp_memb_value = H5MM_xfree(tmp_memb_value);
+
+                /* Close base type */
+                if(H5I_dec_app_ref(nat_super_type_id) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype")
+                /* Close super type */
+                if(H5I_dec_app_ref(super_type_id) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype")
+
+                ret_value = new_type;
+            } /* end case */
+            break;
+
+        case H5T_ARRAY:
+            {
+                int         sarray_rank;        /* Array's rank */
+                unsigned    array_rank;         /* Array's rank */
+                hsize_t     nelems = 1;
+                size_t      super_offset = 0;
+                size_t      super_size = 0;
+                size_t      super_align = 0;
+
+                /* Retrieve dimension information for array data type */
+                if((sarray_rank = H5T__get_array_ndims(dtype)) <= 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get dimension rank")
+                H5_CHECKED_ASSIGN(array_rank, unsigned, sarray_rank, int);
+                if(NULL == (dims = (hsize_t*)H5MM_malloc(array_rank * sizeof(hsize_t))))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory")
+                if(H5T__get_array_dims(dtype, dims) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get dimension size")
+
+                /* Retrieve base type for array type */
+                if(NULL == (super_type = H5T_get_super(dtype)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for array type")
+                if(NULL == (nat_super_type = H5T_get_native_type(super_type, direction, &super_align,
+                                                         &super_offset, &super_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed")
+
+                /* Close super type */
+                if(H5T_close(super_type) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_CLOSEERROR, NULL, "cannot close datatype")
+
+                /* Create a new array type based on native type */
+                if(NULL == (new_type = H5T__array_create(nat_super_type, array_rank, dims)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create array type")
+
+                /* Close base type */
+                if(H5T_close(nat_super_type) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_CLOSEERROR, NULL, "cannot close datatype")
+
+                for(u = 0; u < array_rank; u++)
+                    nelems *= dims[u];
+                H5_CHECK_OVERFLOW(nelems, hsize_t, size_t);
+                if(H5T_cmp_offset(comp_size, offset, super_size, (size_t)nelems, super_align, struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+                dims = (hsize_t *)H5MM_xfree(dims);
+
+                ret_value = new_type;
+            } /* end case */
+            break;
+
+        case H5T_VLEN:
+            {
+                size_t      vl_align = 0;
+                size_t      vl_size  = 0;
+                size_t      super_size = 0;
+
+                /* Retrieve base type for array type */
+                if(NULL == (super_type = H5T_get_super(dtype)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for VL type")
+                /* Don't need alignment, offset information if this VL isn't a field of compound type.  If it
+                 * is, go to a few steps below to compute the information directly. */
+                if(NULL == (nat_super_type = H5T_get_native_type(super_type, direction, NULL, NULL, &super_size)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed")
+
+                /* Close super type */
+                if(H5T_close(super_type) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_CLOSEERROR, NULL, "cannot close datatype")
+
+                /* Create a new array type based on native type */
+                if(NULL == (new_type = H5T__vlen_create(nat_super_type)))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create VL type")
+
+                /* Close base type */
+                if(H5T_close(nat_super_type) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_CLOSEERROR, NULL, "cannot close datatype")
+
+                /* Update size, offset and compound alignment for parent compound type directly. */
+                vl_align = H5T_HVL_COMP_ALIGN_g;
+                vl_size  = sizeof(hvl_t);
+
+                if(H5T_cmp_offset(comp_size, offset, vl_size, (size_t)1, vl_align, struct_align) < 0)
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+                ret_value = new_type;
+            } /* end case */
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "data type doesn't match any native type")
+    } /* end switch */
+
+done:
+    /* Error cleanup */
+    if(NULL == ret_value) {
+        if(new_type)
+            if(H5T_close(new_type) < 0)
+                HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, NULL, "unable to release datatype")
+
+        /* Free lists for members */
+        if(memb_list) {
+            for(u = 0; u < nmemb; u++)
+                if(memb_list[u] && H5T_close(memb_list[u]) < 0)
+                    HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype")
+
+            memb_list = (H5T_t **)H5MM_xfree(memb_list);
+        } /* end if */
+        memb_offset = (size_t *)H5MM_xfree(memb_offset);
+        if(comp_mname) {
+            for(u = 0; u < nmemb; u++)
+                if(comp_mname[u])
+                    H5MM_xfree(comp_mname[u]);
+            comp_mname = (char **)H5MM_xfree(comp_mname);
+        } /* end if */
+        memb_name = (char *)H5MM_xfree(memb_name);
+        memb_value = H5MM_xfree(memb_value);
+        tmp_memb_value = H5MM_xfree(tmp_memb_value);
+        dims = (hsize_t *)H5MM_xfree(dims);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_native_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_get_native_integer
+ *
+ * Purpose:     Returns the native integer type of a datatype.
+ *
+ * Return:      Success:        Returns the native data type if successful.
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 3, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t *
+H5T_get_native_integer(size_t prec, H5T_sign_t sign, H5T_direction_t direction,
+                       size_t *struct_align, size_t *offset, size_t *comp_size)
+{
+    H5T_t       *dt;            /* Appropriate native datatype to copy */
+    hid_t       tid = (-1);     /* Datatype ID of appropriate native datatype */
+    size_t      align = 0;      /* Alignment necessary for native datatype */
+    size_t  native_size = 0;    /* Datatype size of the native type */
+    enum match_type {           /* The different kinds of integers we can match */
+        H5T_NATIVE_INT_MATCH_CHAR,
+        H5T_NATIVE_INT_MATCH_SHORT,
+        H5T_NATIVE_INT_MATCH_INT,
+        H5T_NATIVE_INT_MATCH_LONG,
+        H5T_NATIVE_INT_MATCH_LLONG,
+        H5T_NATIVE_INT_MATCH_UNKNOWN
+    } match = H5T_NATIVE_INT_MATCH_UNKNOWN;
+    H5T_t       *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) {
+        if(prec <= H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_SCHAR_g))) {
+            match = H5T_NATIVE_INT_MATCH_CHAR;
+            native_size = sizeof(char);
+        } else if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_SHORT_g))) {
+            match = H5T_NATIVE_INT_MATCH_SHORT;
+            native_size = sizeof(short);
+        } else if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_INT_g))) {
+            match = H5T_NATIVE_INT_MATCH_INT;
+            native_size = sizeof(int);
+        } else if(prec <= H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_LONG_g))) {
+            match = H5T_NATIVE_INT_MATCH_LONG;
+            native_size = sizeof(long);
+        } else if(prec <= H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_LLONG_g))) {
+            match = H5T_NATIVE_INT_MATCH_LLONG;
+            native_size = sizeof(long long);
+        } else {  /* If no native type matches the querried datatype, simply choose the type of biggest size. */
+            match = H5T_NATIVE_INT_MATCH_LLONG;
+            native_size = sizeof(long long);
+        }
+    } else if(direction == H5T_DIR_DESCEND) {
+        if(prec > H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_LONG_g))) {
+            match = H5T_NATIVE_INT_MATCH_LLONG;
+            native_size = sizeof(long long);
+        } else if(prec > H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_INT_g))) {
+            match = H5T_NATIVE_INT_MATCH_LONG;
+            native_size = sizeof(long);
+        } else if(prec > H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_SHORT_g))) {
+            match = H5T_NATIVE_INT_MATCH_INT;
+            native_size = sizeof(int);
+        } else if(prec > H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_SCHAR_g))) {
+            match = H5T_NATIVE_INT_MATCH_SHORT;
+            native_size = sizeof(short);
+        } else {
+            match = H5T_NATIVE_INT_MATCH_CHAR;
+            native_size = sizeof(char);
+        }
+    }
+
+    /* Set the appropriate native datatype information */
+    switch(match) {
+        case H5T_NATIVE_INT_MATCH_CHAR:
+            if(sign == H5T_SGN_2)
+                tid = H5T_NATIVE_SCHAR;
+            else
+                tid = H5T_NATIVE_UCHAR;
+
+            align = H5T_NATIVE_SCHAR_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_INT_MATCH_SHORT:
+            if(sign == H5T_SGN_2)
+                tid = H5T_NATIVE_SHORT;
+            else
+                tid = H5T_NATIVE_USHORT;
+            align = H5T_NATIVE_SHORT_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_INT_MATCH_INT:
+            if(sign == H5T_SGN_2)
+                tid = H5T_NATIVE_INT;
+            else
+                tid = H5T_NATIVE_UINT;
+
+            align = H5T_NATIVE_INT_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_INT_MATCH_LONG:
+            if(sign == H5T_SGN_2)
+                tid = H5T_NATIVE_LONG;
+            else
+                tid = H5T_NATIVE_ULONG;
+
+            align = H5T_NATIVE_LONG_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_INT_MATCH_LLONG:
+            if(sign == H5T_SGN_2)
+                tid = H5T_NATIVE_LLONG;
+            else
+                tid = H5T_NATIVE_ULLONG;
+
+            align = H5T_NATIVE_LLONG_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_INT_MATCH_UNKNOWN:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "Unknown native integer match")
+    } /* end switch */
+
+    /* Create new native type */
+    HDassert(tid >= 0);
+    if(NULL == (dt = (H5T_t *)H5I_object(tid)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+
+    if(NULL == (ret_value = H5T_copy(dt, H5T_COPY_TRANSIENT)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot copy type")
+
+    /* compute size and offset of compound type member. */
+    if(H5T_cmp_offset(comp_size, offset, native_size, (size_t)1, align, struct_align) < 0)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_native_integer() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_get_native_float
+ *
+ * Purpose:     Returns the native floatt type of a datatype.
+ *
+ * Return:      Success:        Returns the native data type if successful.
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  Raymond Lu
+ *              Oct 3, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t*
+H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size)
+{
+    H5T_t       *dt=NULL;       /* Appropriate native datatype to copy */
+    hid_t       tid=(-1);       /* Datatype ID of appropriate native datatype */
+    size_t      align=0;        /* Alignment necessary for native datatype */
+    size_t 	native_size=0;  /* Datatype size of the native type */
+    enum match_type {           /* The different kinds of floating point types we can match */
+        H5T_NATIVE_FLOAT_MATCH_FLOAT,
+        H5T_NATIVE_FLOAT_MATCH_DOUBLE,
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        H5T_NATIVE_FLOAT_MATCH_LDOUBLE,
+#endif
+        H5T_NATIVE_FLOAT_MATCH_UNKNOWN
+    } match=H5T_NATIVE_FLOAT_MATCH_UNKNOWN;
+    H5T_t       *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(size>0);
+
+    if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) {
+        if(size<=sizeof(float)) {
+            match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
+	    native_size = sizeof(float);
+        }
+        else if(size<=sizeof(double)) {
+            match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
+	    native_size = sizeof(double);
+        }
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        else if(size<=sizeof(long double)) {
+            match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
+	    native_size = sizeof(long double);
+        }
+#endif
+        else {   /* If not match, return the biggest datatype */
+#if H5_SIZEOF_LONG_DOUBLE !=0
+            match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
+	    native_size = sizeof(long double);
+#else
+            match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
+            native_size = sizeof(double);
+#endif
+	}
+    } else {
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        if(size>sizeof(double)) {
+            match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
+	    native_size = sizeof(long double);
+        }
+        else if(size>sizeof(float)) {
+            match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
+	    native_size = sizeof(double);
+        }
+        else {
+            match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
+	    native_size = sizeof(float);
+	}
+#else
+        if(size>sizeof(float)) {
+            match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
+	    native_size = sizeof(double);
+        }
+        else {
+            match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
+	    native_size = sizeof(float);
+	}
+#endif
+    }
+
+    /* Set the appropriate native floating point information */
+    switch(match) {
+        case H5T_NATIVE_FLOAT_MATCH_FLOAT:
+            tid = H5T_NATIVE_FLOAT;
+            align = H5T_NATIVE_FLOAT_COMP_ALIGN_g;
+            break;
+
+        case H5T_NATIVE_FLOAT_MATCH_DOUBLE:
+            tid = H5T_NATIVE_DOUBLE;
+            align = H5T_NATIVE_DOUBLE_COMP_ALIGN_g;
+            break;
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        case H5T_NATIVE_FLOAT_MATCH_LDOUBLE:
+            tid = H5T_NATIVE_LDOUBLE;
+            align = H5T_NATIVE_LDOUBLE_COMP_ALIGN_g;
+            break;
+#endif
+        case H5T_NATIVE_FLOAT_MATCH_UNKNOWN:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "Unknown native floating-point match")
+    } /* end switch */
+
+    /* Create new native type */
+    HDassert(tid>=0);
+    if(NULL==(dt=(H5T_t *)H5I_object(tid)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+    if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type")
+
+    /* compute offset of compound type member. */
+    if(H5T_cmp_offset(comp_size, offset, native_size, (size_t)1, align, struct_align)<0)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T_get_native_bitfield
+ *
+ * Purpose:     Returns the native bitfield type of a datatype.  Bitfield
+ *              is similar to unsigned integer.
+ *
+ * Return:      Success:        Returns the native data type if successful.
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  Raymond Lu
+ *              1 December 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5T_t*
+H5T_get_native_bitfield(size_t prec, H5T_direction_t direction, size_t *struct_align,
+                        size_t *offset, size_t *comp_size)
+{
+    H5T_t       *dt;            /* Appropriate native datatype to copy */
+    hid_t       tid=(-1);       /* Datatype ID of appropriate native datatype */
+    size_t      align=0;        /* Alignment necessary for native datatype */
+    size_t      native_size=0;  /* Datatype size of the native type */
+    H5T_t       *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) {
+        if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B8_g))) {
+            tid = H5T_NATIVE_B8;
+            native_size = 1;
+            align = H5T_NATIVE_UINT8_ALIGN_g;
+        } else if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B16_g))) {
+            tid = H5T_NATIVE_B16;
+            native_size = 2;
+            align = H5T_NATIVE_UINT16_ALIGN_g;
+        } else if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B32_g))) {
+            tid = H5T_NATIVE_B32;
+            native_size = 4;
+            align = H5T_NATIVE_UINT32_ALIGN_g;
+        } else if(prec<=H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B64_g))) {
+            tid = H5T_NATIVE_B64;
+            native_size = 8;
+            align = H5T_NATIVE_UINT64_ALIGN_g;
+        } else {  /* If no native type matches the querried datatype, simply choose the type of biggest size. */
+            tid = H5T_NATIVE_B64;
+            native_size = 8;
+            align = H5T_NATIVE_UINT64_ALIGN_g;
+        }
+    } else if(direction == H5T_DIR_DESCEND) {
+        if(prec>H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B32_g))) {
+            tid = H5T_NATIVE_B64;
+            native_size = 8;
+            align = H5T_NATIVE_UINT64_ALIGN_g;
+        } else if(prec>H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B16_g))) {
+            tid = H5T_NATIVE_B32;
+            native_size = 4;
+            align = H5T_NATIVE_UINT32_ALIGN_g;
+        } else if(prec>H5T_get_precision((H5T_t *)H5I_object(H5T_NATIVE_B8_g))) {
+            tid = H5T_NATIVE_B16;
+            native_size = 2;
+            align = H5T_NATIVE_UINT16_ALIGN_g;
+        } else {
+            tid = H5T_NATIVE_B8;
+            native_size = 1;
+            align = H5T_NATIVE_UINT8_ALIGN_g;
+        }
+    }
+
+    /* Create new native type */
+    HDassert(tid>=0);
+    if(NULL==(dt=(H5T_t *)H5I_object(tid)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+
+    if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot copy type")
+
+    /* compute size and offset of compound type member. */
+    if(H5T_cmp_offset(comp_size, offset, native_size, (size_t)1, align, struct_align)<0)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_cmp_offset
+ *
+ * Purpose:	This function is only for convenience.  It computes the
+ *              compound type size, offset of the member being considered
+ *              and the alignment for the whole compound type.
+ *
+ * Return:	Success:        Non-negative value.
+ *
+ *		Failure:        Negative value.
+ *
+ * Programmer:	Raymond Lu
+ *		December  10, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size,
+                      size_t nelems, size_t align, size_t *struct_align)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(offset && comp_size) {
+        if(align>1 && *comp_size%align) {
+            /* Add alignment value */
+            *offset = *comp_size +  (align - *comp_size%align);
+            *comp_size += (align - *comp_size%align);
+        } else
+            *offset = *comp_size;
+
+        /* compute size of compound type member. */
+        *comp_size += nelems*elem_size;
+    }
+
+    if(struct_align && *struct_align < align)
+        *struct_align = align;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Toffset.c b/gatb-core/thirdparty/hdf5/src/H5Toffset.c
new file mode 100644
index 0000000..ea4b3b5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Toffset.c
@@ -0,0 +1,300 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the datatype offset for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_offset_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+/* Static local functions */
+static herr_t H5T_set_offset(const H5T_t *dt, size_t offset);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_offset_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_offset_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_offset_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_offset_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_offset
+ *
+ * Purpose:	Retrieves the bit offset of the first significant bit.	The
+ *		signficant bits of an atomic datum can be offset from the
+ *		beginning of the memory for that datum by an amount of
+ *		padding. The `offset' property specifies the number of bits
+ *		of padding that appear to the "right of" the value.  That is,
+ *		if we have a 32-bit datum with 16-bits of precision having
+ *		the value 0x1122 then it will be layed out in memory as (from
+ *		small byte address toward larger byte addresses):
+ *
+ *		    Big	     Big       Little	Little
+ *		    Endian   Endian    Endian	Endian
+ *		    offset=0 offset=16 offset=0 offset=16
+ *
+ *		0:  [ pad]   [0x11]    [0x22]	[ pad]
+ *		1:  [ pad]   [0x22]    [0x11]	[ pad]
+ *		2:  [0x11]   [ pad]    [ pad]	[0x22]
+ *		3:  [0x22]   [ pad]    [ pad]	[0x11]
+ *
+ * Return:	Success:	The offset (non-negative)
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Tget_offset(hid_t type_id)
+{
+    H5T_t	*dt;
+    int	ret_value;
+
+    FUNC_ENTER_API(-1)
+    H5TRACE1("Is", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type")
+
+    /* Get offset */
+    if((ret_value = H5T_get_offset(dt)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "cant't get offset for specified datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_offset
+ *
+ * Purpose:	Retrieves the bit offset of the first significant bit.	The
+ *		signficant bits of an atomic datum can be offset from the
+ *		beginning of the memory for that datum by an amount of
+ *		padding. The `offset' property specifies the number of bits
+ *		of padding that appear to the "right of" the value.  That is,
+ *		if we have a 32-bit datum with 16-bits of precision having
+ *		the value 0x1122 then it will be layed out in memory as (from
+ *		small byte address toward larger byte addresses):
+ *
+ *		    Big	     Big       Little	Little
+ *		    Endian   Endian    Endian	Endian
+ *		    offset=0 offset=16 offset=0 offset=16
+ *
+ *		0:  [ pad]   [0x11]    [0x22]	[ pad]
+ *		1:  [ pad]   [0x22]    [0x11]	[ pad]
+ *		2:  [0x11]   [ pad]    [ pad]	[0x22]
+ *		3:  [0x22]   [ pad]    [ pad]	[0x11]
+ *
+ * Return:	Success:	The offset (non-negative)
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_get_offset(const H5T_t *dt)
+{
+    int	ret_value;
+
+    FUNC_ENTER_NOAPI(-1)
+
+    /* Defer to parent*/
+    while(dt->shared->parent)
+        dt = dt->shared->parent;
+    if(!H5T_IS_ATOMIC(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
+
+    /* Offset */
+    ret_value = (int)dt->shared->u.atomic.offset;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_offset
+ *
+ * Purpose:	Sets the bit offset of the first significant bit.  The
+ *		signficant bits of an atomic datum can be offset from the
+ *		beginning of the memory for that datum by an amount of
+ *		padding. The `offset' property specifies the number of bits
+ *		of padding that appear to the "right of" the value.  That is,
+ *		if we have a 32-bit datum with 16-bits of precision having
+ *		the value 0x1122 then it will be layed out in memory as (from
+ *		small byte address toward larger byte addresses):
+ *
+ *		    Big	     Big       Little	Little
+ *		    Endian   Endian    Endian	Endian
+ *		    offset=0 offset=16 offset=0 offset=16
+ *
+ *		0:  [ pad]   [0x11]    [0x22]	[ pad]
+ *		1:  [ pad]   [0x22]    [0x11]	[ pad]
+ *		2:  [0x11]   [ pad]    [ pad]	[0x22]
+ *		3:  [0x22]   [ pad]    [ pad]	[0x11]
+ *
+ *		If the offset is incremented then the total size is
+ *		incremented also if necessary to prevent significant bits of
+ *		the value from hanging over the edge of the data type.
+ *
+ *		The offset of an H5T_STRING cannot be set to anything but
+ *		zero.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Moved real work to a private function.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_offset(hid_t type_id, size_t offset)
+{
+    H5T_t	*dt;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", type_id, offset);
+
+    /* Check args */
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+    if (H5T_STRING == dt->shared->type && offset != 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset must be zero for this type")
+    if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+    if (H5T_COMPOUND==dt->shared->type || H5T_REFERENCE==dt->shared->type || H5T_OPAQUE==dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for this datatype")
+
+    /* Do the real work */
+    if (H5T_set_offset(dt, offset)<0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set offset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_set_offset
+ *
+ * Purpose:	Sets the bit offset of the first significant bit.  The
+ *		signficant bits of an atomic datum can be offset from the
+ *		beginning of the memory for that datum by an amount of
+ *		padding. The `offset' property specifies the number of bits
+ *		of padding that appear to the "right of" the value.  That is,
+ *		if we have a 32-bit datum with 16-bits of precision having
+ *		the value 0x1122 then it will be layed out in memory as (from
+ *		small byte address toward larger byte addresses):
+ *
+ *		    Big	     Big       Little	Little
+ *		    Endian   Endian    Endian	Endian
+ *		    offset=0 offset=16 offset=0 offset=16
+ *
+ *		0:  [ pad]   [0x11]    [0x22]	[ pad]
+ *		1:  [ pad]   [0x22]    [0x11]	[ pad]
+ *		2:  [0x11]   [ pad]    [ pad]	[0x22]
+ *		3:  [0x22]   [ pad]    [ pad]	[0x11]
+ *
+ *		If the offset is incremented then the total size is
+ *		incremented also if necessary to prevent significant bits of
+ *		the value from hanging over the edge of the data type.
+ *
+ *		The offset of an H5T_STRING cannot be set to anything but
+ *		zero.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_set_offset(const H5T_t *dt, size_t offset)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(H5T_STRING!=dt->shared->type || 0==offset);
+    HDassert(H5T_REFERENCE!=dt->shared->type);
+    HDassert(H5T_OPAQUE!=dt->shared->type);
+    HDassert(H5T_COMPOUND!=dt->shared->type);
+    HDassert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs));
+
+    if (dt->shared->parent) {
+	if (H5T_set_offset(dt->shared->parent, offset)<0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set offset for base type")
+
+        /* Adjust size of datatype appropriately */
+        if(dt->shared->type==H5T_ARRAY)
+            dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem;
+        else if(dt->shared->type!=H5T_VLEN)
+            dt->shared->size = dt->shared->parent->shared->size;
+    } else {
+        if (offset+dt->shared->u.atomic.prec > 8*dt->shared->size)
+            dt->shared->size = (offset + dt->shared->u.atomic.prec + 7) / 8;
+        dt->shared->u.atomic.offset = offset;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Toh.c b/gatb-core/thirdparty/hdf5/src/H5Toh.c
new file mode 100644
index 0000000..abf8a51
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Toh.c
@@ -0,0 +1,235 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Opkg.h"             /* Object headers			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static htri_t H5O_dtype_isa(H5O_t *loc);
+static hid_t H5O_dtype_open(const H5G_loc_t *obj_loc, hid_t lapl_id,
+    hid_t dxpl_id, hbool_t app_ref);
+static void *H5O_dtype_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
+    hid_t dxpl_id);
+static H5O_loc_t *H5O_dtype_get_oloc(hid_t obj_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* This message derives from H5O object class */
+const H5O_obj_class_t H5O_OBJ_DATATYPE[1] = {{
+    H5O_TYPE_NAMED_DATATYPE,	/* object type			*/
+    "named datatype",		/* object name, for debugging	*/
+    NULL,			/* get 'copy file' user data	*/
+    NULL,			/* free 'copy file' user data	*/
+    H5O_dtype_isa, 		/* "isa" 			*/
+    H5O_dtype_open, 		/* open an object of this class */
+    H5O_dtype_create, 		/* create an object of this class */
+    H5O_dtype_get_oloc,		/* get an object header location for an object */
+    NULL,			/* get the index & heap info for an object */
+    NULL 			/* flush an opened object of this class */
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_isa
+ *
+ * Purpose:	Determines if an object has the requisite messages for being
+ *		a datatype.
+ *
+ * Return:	Success:	TRUE if the required data type messages are
+ *				present; FALSE otherwise.
+ *
+ *		Failure:	FAIL if the existence of certain messages
+ *				cannot be determined.
+ *
+ * Programmer:	Robb Matzke
+ *              Monday, November  2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O_dtype_isa(struct H5O_t *oh)
+{
+    htri_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(oh);
+
+    if((ret_value = H5O_msg_exists_oh(oh, H5O_DTYPE_ID)) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to read object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_isa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_open
+ *
+ * Purpose:	Open a datatype at a particular location
+ *
+ * Return:	Success:	Open object identifier
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5O_dtype_open(const H5G_loc_t *obj_loc, hid_t H5_ATTR_UNUSED lapl_id, hid_t dxpl_id, hbool_t app_ref)
+{
+    H5T_t       *type = NULL;           /* Datatype opened */
+    hid_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(obj_loc);
+
+    /* Open the datatype */
+    if(NULL == (type = H5T_open(obj_loc, dxpl_id)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open datatype")
+
+    /* Register an ID for the datatype */
+    if((ret_value = H5I_register(H5I_DATATYPE, type, app_ref)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    if(ret_value < 0)
+        if(type && H5T_close(type) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_create
+ *
+ * Purpose:	Create a named datatype in a file
+ *
+ * Return:	Success:	Pointer to the named datatype data structure
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, April 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_dtype_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+    H5T_obj_create_t *crt_info = (H5T_obj_create_t *)_crt_info; /* Named datatype creation parameters */
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(crt_info);
+    HDassert(obj_loc);
+
+    /* Commit the type to the file */
+    if(H5T__commit(f, crt_info->dt, crt_info->tcpl_id, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to commit datatype")
+
+    /* Set up the new named datatype's location */
+    if(NULL == (obj_loc->oloc = H5T_oloc(crt_info->dt)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get object location of named datatype")
+    if(NULL == (obj_loc->path = H5T_nameof(crt_info->dt)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get path of named datatype")
+
+    /* Set the return value */
+    ret_value = crt_info->dt;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O_dtype_get_oloc
+ *
+ * Purpose:	Retrieve the object header location for an open object
+ *
+ * Return:	Success:	Pointer to object header location
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, November  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_loc_t *
+H5O_dtype_get_oloc(hid_t obj_id)
+{
+    H5T_t       *type;                  /* Datatype opened */
+    H5O_loc_t	*ret_value;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get the datatype */
+    if(NULL == (type = (H5T_t *)H5I_object(obj_id)))
+        HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
+
+    /* Get the datatype's object header location */
+    if(NULL == (ret_value = H5T_oloc(type)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_dtype_get_oloc() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Topaque.c b/gatb-core/thirdparty/hdf5/src/H5Topaque.c
new file mode 100644
index 0000000..e93bf65
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Topaque.c
@@ -0,0 +1,141 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for opaque
+ *      datatypes in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_opaque_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_opaque_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_opaque_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_opaque_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_opaque_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_tag
+ *
+ * Purpose:	Tag an opaque datatype with a unique ASCII identifier.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, May 20, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_tag(hid_t type_id, const char *tag)
+{
+    H5T_t	*dt=NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*s", type_id, tag);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+    while (dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if (H5T_OPAQUE!=dt->shared->type)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an opaque data type")
+    if (!tag)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no tag")
+    if (HDstrlen(tag) >= H5T_OPAQUE_TAG_MAX)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tag too long")
+
+    /* Commit */
+    H5MM_xfree(dt->shared->u.opaque.tag);
+    dt->shared->u.opaque.tag = H5MM_strdup(tag);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_tag
+ *
+ * Purpose:	Get tha tag associated with an opaque datatype.
+ *
+ * Return:	A pointer to an allocated string. The caller should free
+ *              the string. NULL is returned for errors.
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, May 20, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5Tget_tag(hid_t type_id)
+{
+    H5T_t	*dt=NULL;
+    char	*ret_value;
+
+    FUNC_ENTER_API(NULL)
+    H5TRACE1("*s", "i", type_id);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+    while (dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if (H5T_OPAQUE != dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "operation not defined for data type class")
+
+    /* result */
+    if (NULL==(ret_value=H5MM_strdup(dt->shared->u.opaque.tag)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Torder.c b/gatb-core/thirdparty/hdf5/src/H5Torder.c
new file mode 100644
index 0000000..35be454
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Torder.c
@@ -0,0 +1,309 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the datatype byte order for the H5T interface.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_order_interface
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5T_set_order(H5T_t *dtype, H5T_order_t order);
+
+
+/*********************/
+/* Public Variables */
+/*********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_order_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_order_interface()
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_order_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_order_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_order
+ *
+ * Purpose:	Returns the byte order of a datatype.
+ *
+ * Return:	Success:	A byte order constant.  If the type is compound
+ *				and its members have mixed orders, this function
+ *				returns H5T_ORDER_MIXED.
+ *		Failure:	H5T_ORDER_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ * 
+ *-------------------------------------------------------------------------
+ */
+H5T_order_t
+H5Tget_order(hid_t type_id)
+{
+    H5T_t		*dt;            /* Datatype to query */
+    H5T_order_t		ret_value;      /* Return value */
+
+    FUNC_ENTER_API(H5T_ORDER_ERROR)
+    H5TRACE1("To", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, H5T_ORDER_ERROR, "not a datatype")
+
+    /* Get order */
+    if(H5T_ORDER_ERROR == (ret_value = H5T_get_order(dt)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, H5T_ORDER_ERROR, "cant't get order for specified datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_order
+ *
+ * Purpose:	Returns the byte order of a datatype.
+ *
+ * Return:	Success:	A byte order constant
+ *		Failure:	H5T_ORDER_ERROR (Negative)
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_order_t
+H5T_get_order(const H5T_t *dtype)
+{
+    H5T_order_t	ret_value = H5T_ORDER_NONE;      /* Return value */
+
+    FUNC_ENTER_NOAPI(H5T_ORDER_ERROR)
+
+    /* Defer to parent */
+    while(dtype->shared->parent)
+        dtype = dtype->shared->parent;
+
+    /* Set order for atomic type. */
+    if(H5T_IS_ATOMIC(dtype->shared))
+        ret_value = dtype->shared->u.atomic.order;
+    else {
+        /* Check for compound datatype */
+        if(H5T_COMPOUND == dtype->shared->type) {
+            H5T_order_t memb_order = H5T_ORDER_NONE;
+            int nmemb;          /* Number of members in compound & enum types */
+            int i;              /* Local index variable */
+
+            /* Retrieve the number of members */
+            if((nmemb = H5T_get_nmembers(dtype)) < 0)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_ORDER_ERROR, "can't get number of members from compound data type")
+
+            /* Get order for each compound member type. */
+            for(i = 0; i < nmemb; i++) {
+                /* Get order for member */
+                if((memb_order = H5T_get_order(dtype->shared->u.compnd.memb[i].type)) == H5T_ORDER_ERROR)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, H5T_ORDER_ERROR, "can't get order for compound member")
+
+                /* Ignore the H5T_ORDER_NONE, write down the first non H5T_ORDER_NONE order. */
+                if(memb_order != H5T_ORDER_NONE && ret_value == H5T_ORDER_NONE)
+                    ret_value = memb_order;
+
+                /* If the orders are mixed, stop the loop and report it.  
+                 * (H5T_ORDER_NONE is ignored)
+                 */
+                if(memb_order != H5T_ORDER_NONE && ret_value != H5T_ORDER_NONE
+                        && memb_order != ret_value) {
+                    ret_value = H5T_ORDER_MIXED;
+                    break;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_order
+ *
+ * Purpose:	Sets the byte order for a datatype.
+ *
+ * Notes:	There are some restrictions on this operation:
+ *		1. For enum type, members shouldn't be defined yet.
+ *		2. H5T_ORDER_NONE only works for reference and fixed-length
+ *			string.
+ *		3. For opaque type, the order will be ignored.
+ *		4. For compound type, all restrictions above apply to the 
+ *			members.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_order(hid_t type_id, H5T_order_t order)
+{
+    H5T_t	*dt;                    /* Datatype to modify */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTo", type_id, order);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+    if(order < H5T_ORDER_LE || order > H5T_ORDER_NONE || order == H5T_ORDER_MIXED)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "illegal byte order")
+    if(H5T_STATE_TRANSIENT != dt->shared->state)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype is read-only")
+
+    /* Call internal routine to set the order */
+    if(H5T_set_order(dt, order) < 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "can't set order")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tset_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_set_order
+ *
+ * Purpose:	Private function to set the byte order for a datatype.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *		13 August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_set_order(H5T_t *dtype, H5T_order_t order)
+{
+    herr_t      ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5T_ENUM == dtype->shared->type && dtype->shared->u.enumer.nmembs > 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after enum members are defined")
+
+    /* For derived data type, defer to parent */ 
+    while(dtype->shared->parent)
+        dtype = dtype->shared->parent;
+
+    /* Check for setting order on inappropriate datatype */
+    if(order == H5T_ORDER_NONE && !(H5T_REFERENCE == dtype->shared->type || 
+            H5T_OPAQUE == dtype->shared->type || H5T_IS_FIXED_STRING(dtype->shared)))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "illegal byte order for type")
+
+    /* For atomic data type */
+    if(H5T_IS_ATOMIC(dtype->shared))
+        dtype->shared->u.atomic.order = order;
+    else {
+        /* Check for compound datatype */
+        if(H5T_COMPOUND == dtype->shared->type) {
+            int nmemb;          /* Number of members in type */
+            int i;              /* Local index variable */
+
+            /* Retrieve the number of fields in the compound datatype */
+            if((nmemb = H5T_get_nmembers(dtype)) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get number of members from compound data type")
+
+            /* Check for uninitialized compound datatype */
+            if(nmemb == 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_UNINITIALIZED, FAIL, "no member is in the compound data type")
+
+            /* Loop through all fields of compound type, setting the order */
+            for(i = 0; i < nmemb; i++)
+                if(H5T_set_order(dtype->shared->u.compnd.memb[i].type, order) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set order for compound member")
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_set_order() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tpad.c b/gatb-core/thirdparty/hdf5/src/H5Tpad.c
new file mode 100644
index 0000000..88a5e13
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tpad.c
@@ -0,0 +1,147 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the datatype padding for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_pad_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_pad_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_pad_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_pad_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_pad_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_pad
+ *
+ * Purpose:	Gets the least significant pad type and the most significant
+ *		pad type and returns their values through the LSB and MSB
+ *		arguments, either of which may be the null pointer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works with derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tget_pad(hid_t type_id, H5T_pad_t *lsb/*out*/, H5T_pad_t *msb/*out*/)
+{
+    H5T_t	*dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ixx", type_id, lsb, msb);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    while (dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if (!H5T_IS_ATOMIC(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
+
+    /* Get values */
+    if (lsb)
+        *lsb = dt->shared->u.atomic.lsb_pad;
+    if (msb)
+        *msb = dt->shared->u.atomic.msb_pad;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_pad
+ *
+ * Purpose:	Sets the LSB and MSB pad types.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ *	Robb Matzke, 22 Dec 1998
+ *	Also works with derived data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb)
+{
+    H5T_t *dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iTpTp", type_id, lsb, msb);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+    if (lsb < H5T_PAD_ZERO || lsb >= H5T_NPAD || msb < H5T_PAD_ZERO || msb >= H5T_NPAD)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type")
+    if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+    while (dt->shared->parent)
+        dt = dt->shared->parent; /*defer to parent*/
+    if (!H5T_IS_ATOMIC(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
+
+    /* Commit */
+    dt->shared->u.atomic.lsb_pad = lsb;
+    dt->shared->u.atomic.msb_pad = msb;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tpkg.h b/gatb-core/thirdparty/hdf5/src/H5Tpkg.h
new file mode 100644
index 0000000..0b0cd61
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tpkg.h
@@ -0,0 +1,1325 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Robb Matzke <matzke at llnl.gov>
+ *		Monday, December  8, 1997
+ *
+ * Purpose:	This file contains declarations which are visible only within
+ *		the H5T package.  Source files outside the H5T package should
+ *		include H5Tprivate.h instead.
+ */
+#ifndef H5T_PACKAGE
+#error "Do not include this file outside the H5T package!"
+#endif
+
+#ifndef _H5Tpkg_H
+#define _H5Tpkg_H
+
+/*
+ * Define this to enable debugging.
+ */
+#ifdef NDEBUG
+#  undef H5T_DEBUG
+#endif
+
+/* Get package's private header */
+#include "H5Tprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FLprivate.h"	/* Free Lists				*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+
+/* Other public headers needed by this file */
+#include "H5Spublic.h"		/* Dataspace functions			*/
+
+/* Length of debugging name buffer */
+#define H5T_NAMELEN		32
+
+/* Macro to ease detecting "complex" datatypes (i.e. those with base types or fields) */
+#define H5T_IS_COMPLEX(t)       ((t) == H5T_COMPOUND || (t) == H5T_ENUM || (t) == H5T_VLEN || (t) == H5T_ARRAY)
+
+/* Macro to ease detecting fixed "string" datatypes */
+#define H5T_IS_FIXED_STRING(dt) (H5T_STRING == (dt)->type)
+
+/* Macro to ease detecting variable-length "string" datatypes */
+#define H5T_IS_VL_STRING(dt)    (H5T_VLEN == (dt)->type && H5T_VLEN_STRING == (dt)->u.vlen.type)
+
+/* Macro to ease detecting fixed or variable-length "string" datatypes */
+#define H5T_IS_STRING(dt)       (H5T_IS_FIXED_STRING(dt) || H5T_IS_VL_STRING(dt))
+
+/* Macro to ease detecting atomic datatypes */
+#define H5T_IS_ATOMIC(dt)       (!(H5T_IS_COMPLEX((dt)->type) || (dt)->type == H5T_OPAQUE))
+
+/* Macro to ease retrieving class of shared datatype */
+/* (Externally, a VL string is a string; internally, a VL string is a VL.  Lie
+ *      to the user if they have a VL string and tell them it's in the string
+ *      class)
+ */
+#define H5T_GET_CLASS(shared, internal) ((internal) ? (shared)->type : (H5T_IS_VL_STRING(shared) ?  H5T_STRING : (shared)->type))
+
+
+/*
+ * Datatype encoding versions
+ */
+
+/* This is the version to create all datatypes which don't contain
+ * array datatypes (atomic types, compound datatypes without array fields,
+ * vlen sequences of objects which aren't arrays, etc.) or VAX byte-ordered
+ * objects.
+ */
+#define H5O_DTYPE_VERSION_1	1
+
+/* This is the version to create all datatypes which contain H5T_ARRAY
+ * class objects (array definitely, potentially compound & vlen sequences also),
+ * but not VAX byte-ordered objects.
+ */
+#define H5O_DTYPE_VERSION_2	2
+
+/* This is the version to create all datatypes which contain VAX byte-ordered
+ * objects (floating-point types, currently).
+ */
+/* This version also packs compound & enum field names without padding */
+/* This version also encodes the member offset of compound fields more efficiently */
+/* This version also encodes array types more efficiently */
+#define H5O_DTYPE_VERSION_3	3
+
+/* The latest version of the format.  Look through the 'encode helper' routine
+ *      and 'size' callback for places to change when updating this. */
+#define H5O_DTYPE_VERSION_LATEST H5O_DTYPE_VERSION_3
+
+
+/* Flags for visiting datatype */
+#define H5T_VISIT_COMPLEX_FIRST 0x01            /* Visit complex datatype before visiting member/parent datatypes */
+#define H5T_VISIT_COMPLEX_LAST  0x02            /* Visit complex datatype after visiting member/parent datatypes */
+                                                /* (setting both flags will mean visiting complex type twice) */
+#define H5T_VISIT_SIMPLE        0x04            /* Visit simple datatypes (at all) */
+                                                /* (setting H5T_VISIT_SIMPLE and _not_ setting either H5T_VISIT_COMPLEX_FIRST or H5T_VISIT_COMPLEX_LAST will mean visiting _only_ "simple" "leafs" in the "tree" */
+                                                /* (_not_ setting H5T_VISIT_SIMPLE and setting either H5T_VISIT_COMPLEX_FIRST or H5T_VISIT_COMPLEX_LAST will mean visiting all nodes _except_ "simple" "leafs" in the "tree" */
+
+
+/* Define an internal macro for converting long long to long double.  Mac OS 10.4 gives some
+ * incorrect conversions. */
+#if (H5_WANT_DATA_ACCURACY && defined(H5_LLONG_TO_LDOUBLE_CORRECT)) || (!H5_WANT_DATA_ACCURACY)
+#define H5T_CONV_INTERNAL_LLONG_LDOUBLE       1
+#endif
+
+/* Define an internal macro for converting unsigned long long to long double.  SGI compilers give
+ * some incorect conversion.  64-bit Solaris does different rounding.   Windows Visual Studio 6 does
+ * not support unsigned long long.  For FreeBSD(sleipnir), the last 2 bytes of mantissa are lost when
+ * compiler tries to do the conversion.  For Cygwin, compiler doesn't do rounding correctly.
+ * Mac OS 10.4 gives some incorrect result. */
+#if (H5_WANT_DATA_ACCURACY && defined(H5_LLONG_TO_LDOUBLE_CORRECT)) || (!H5_WANT_DATA_ACCURACY)
+#define H5T_CONV_INTERNAL_ULLONG_LDOUBLE         1
+#endif
+
+/* Define an internal macro for converting long double to long long.  SGI compilers give some incorrect
+ * conversions. Mac OS 10.4 gives incorrect conversions. HP-UX 11.00 compiler generates floating exception.
+ * The hard conversion on Windows .NET 2003 has a bug and gives wrong exception value. */
+#if (H5_WANT_DATA_ACCURACY && defined(H5_LDOUBLE_TO_LLONG_ACCURATE)) || \
+    (!H5_WANT_DATA_ACCURACY)
+#define H5T_CONV_INTERNAL_LDOUBLE_LLONG         1
+#endif
+
+/* Define an internal macro for converting long double to unsigned long long.  SGI compilers give some
+ * incorrect conversions.  Mac OS 10.4 gives incorrect conversions. HP-UX 11.00 compiler generates
+ * floating exception. */
+#if (H5_WANT_DATA_ACCURACY && defined(H5_LDOUBLE_TO_LLONG_ACCURATE)) || \
+    (!H5_WANT_DATA_ACCURACY)
+#define H5T_CONV_INTERNAL_LDOUBLE_ULLONG         1
+#else
+#define H5T_CONV_INTERNAL_LDOUBLE_ULLONG         0
+#endif
+
+/* Statistics about a conversion function */
+struct H5T_stats_t {
+    unsigned	ncalls;			/*num calls to conversion function   */
+    hsize_t	nelmts;			/*total data points converted	     */
+    H5_timer_t	timer;			/*total time for conversion	     */
+};
+
+/* The datatype conversion database */
+struct H5T_path_t {
+    char	name[H5T_NAMELEN];	/*name for debugging only	     */
+    H5T_t	*src;			/*source datatype 		     */
+    H5T_t	*dst;			/*destination datatype		     */
+    H5T_conv_t	func;			/*data conversion function	     */
+    hbool_t	is_hard;		/*is it a hard function?	     */
+    hbool_t	is_noop;		/*is it the noop conversion?	     */
+    hbool_t	are_compounds;		/*are source and dest both compounds?*/
+    H5T_stats_t	stats;			/*statistics for the conversion	     */
+    H5T_cdata_t	cdata;			/*data for this function	     */
+};
+
+typedef struct H5T_atomic_t {
+    H5T_order_t		order;	/*byte order				     */
+    size_t		prec;	/*precision in bits			     */
+    size_t		offset; /*bit position of lsb of value		     */
+    H5T_pad_t	        lsb_pad;/*type of lsb padding			     */
+    H5T_pad_t		msb_pad;/*type of msb padding			     */
+    union {
+	struct {
+	    H5T_sign_t	sign;	/*type of integer sign			     */
+	} i;			/*integer; integer types		     */
+
+	struct {
+	    size_t	sign;	/*bit position of sign bit		     */
+	    size_t	epos;	/*position of lsb of exponent		     */
+	    size_t	esize;	/*size of exponent in bits		     */
+	    uint64_t	ebias;	/*exponent bias				     */
+	    size_t	mpos;	/*position of lsb of mantissa		     */
+	    size_t	msize;	/*size of mantissa			     */
+	    H5T_norm_t	norm;	/*normalization				     */
+	    H5T_pad_t	pad;	/*type of padding for internal bits	     */
+	} f;			/*floating-point types			     */
+
+	struct {
+	    H5T_cset_t	cset;	/*character set				     */
+	    H5T_str_t	pad;	/*space or null padding of extra bytes	     */
+	} s;			/*string types				     */
+
+	struct {
+	    H5R_type_t	rtype;	/*type of reference stored		     */
+            H5T_loc_t   loc;    /* Location of data in buffer		     */
+	} r;			/*reference types			     */
+    } u;
+} H5T_atomic_t;
+
+/* How members are sorted for compound or enum datatypes */
+typedef enum H5T_sort_t {
+    H5T_SORT_NONE	= 0,		/*not sorted			     */
+    H5T_SORT_NAME	= 1,		/*sorted by member name		     */
+    H5T_SORT_VALUE	= 2 		/*sorted by memb offset or enum value*/
+} H5T_sort_t;
+
+/* A compound datatype member */
+typedef struct H5T_cmemb_t {
+    char		*name;		/*name of this member		     */
+    size_t		offset;		/*offset from beginning of struct    */
+    size_t		size;		/*size of this member		     */
+    struct H5T_t	*type;		/*type of this member		     */
+} H5T_cmemb_t;
+
+/* A compound datatype */
+typedef struct H5T_compnd_t {
+    unsigned	nalloc;		/*num entries allocated in MEMB array*/
+    unsigned	nmembs;		/*number of members defined in struct*/
+    H5T_sort_t	sorted;		/*how are members sorted?	     */
+    hbool_t     packed;		/*are members packed together?       */
+    H5T_cmemb_t	*memb;		/*array of struct members	     */
+    size_t      memb_size;	/*total of all member sizes          */
+} H5T_compnd_t;
+
+/* An enumeration datatype */
+typedef struct H5T_enum_t {
+    unsigned	nalloc;		/*num entries allocated		     */
+    unsigned	nmembs;		/*number of members defined in enum  */
+    H5T_sort_t	sorted;		/*how are members sorted?	     */
+    uint8_t	*value;		/*array of values		     */
+    char	**name;		/*array of symbol names		     */
+} H5T_enum_t;
+
+/* VL function pointers */
+typedef ssize_t (*H5T_vlen_getlenfunc_t)(const void *vl_addr);
+typedef void * (*H5T_vlen_getptrfunc_t)(void *vl_addr);
+typedef htri_t (*H5T_vlen_isnullfunc_t)(const H5F_t *f, void *vl_addr);
+typedef herr_t (*H5T_vlen_readfunc_t)(H5F_t *f, hid_t dxpl_id, void *_vl, void *buf, size_t len);
+typedef herr_t (*H5T_vlen_writefunc_t)(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *buf, void *_bg, size_t seq_len, size_t base_size);
+typedef herr_t (*H5T_vlen_setnullfunc_t)(H5F_t *f, hid_t dxpl_id, void *_vl, void *_bg);
+
+/* VL types */
+typedef enum {
+    H5T_VLEN_BADTYPE =  -1, /* invalid VL Type */
+    H5T_VLEN_SEQUENCE = 0,  /* VL sequence */
+    H5T_VLEN_STRING,        /* VL string */
+    H5T_VLEN_MAXTYPE        /* highest type (Invalid as true type) */
+} H5T_vlen_type_t;
+
+/* A VL datatype */
+typedef struct H5T_vlen_t {
+    H5T_vlen_type_t     type;   /* Type of VL data in buffer */
+    H5T_loc_t		loc;    /* Location of VL data in buffer */
+    H5T_cset_t          cset;   /* For VL string. character set */
+    H5T_str_t           pad;    /* For VL string.  space or null padding of
+                                 * extra bytes */
+    H5F_t *f;                   /* File ID (if VL data is on disk) */
+    H5T_vlen_getptrfunc_t getptr;   /* Function to get VL sequence pointer */
+    H5T_vlen_getlenfunc_t getlen;   /* Function to get VL sequence size (in element units, not bytes) */
+    H5T_vlen_isnullfunc_t isnull;   /* Function to check if VL value is NIL */
+    H5T_vlen_readfunc_t read;   /* Function to read VL sequence into buffer */
+    H5T_vlen_writefunc_t write; /* Function to write VL sequence from buffer */
+    H5T_vlen_setnullfunc_t setnull; /* Function to set a VL value to NIL */
+} H5T_vlen_t;
+
+/* An opaque datatype */
+typedef struct H5T_opaque_t {
+    char		*tag;		/*short type description string	     */
+} H5T_opaque_t;
+
+/* An array datatype */
+typedef struct H5T_array_t {
+    size_t	nelem;		/* total number of elements in array */
+    unsigned	ndims;		/* member dimensionality        */
+    size_t	dim[H5S_MAX_RANK];  /* size in each dimension       */
+} H5T_array_t;
+
+typedef enum H5T_state_t {
+    H5T_STATE_TRANSIENT, 		/*type is a modifiable, closable transient */
+    H5T_STATE_RDONLY,			/*transient, not modifiable, closable */
+    H5T_STATE_IMMUTABLE,		/*transient, not modifiable, not closable */
+    H5T_STATE_NAMED,			/*named constant, not open	     */
+    H5T_STATE_OPEN			/*named constant, open object header */
+} H5T_state_t;
+
+    /* This struct is shared between all occurances of an open named type */
+typedef struct H5T_shared_t {
+    hsize_t		fo_count; /* number of references to this file object */
+    H5T_state_t		state;	/*current state of the type		     */
+    H5T_class_t		type;	/*which class of type is this?		     */
+    size_t		size;	/*total size of an instance of this type     */
+    unsigned            version;        /* Version of object header message to encode this object with */
+    hbool_t		force_conv;/* Set if this type always needs to be converted and H5T__conv_noop cannot be called */
+    struct H5T_t	*parent;/*parent type for derived datatypes	     */
+    union {
+        H5T_atomic_t	atomic; /* an atomic datatype              */
+        H5T_compnd_t	compnd; /* a compound datatype (struct)    */
+        H5T_enum_t	enumer; /* an enumeration type (enum)       */
+        H5T_vlen_t	vlen;   /* a variable-length datatype       */
+        H5T_opaque_t	opaque; /* an opaque datatype              */
+        H5T_array_t	array;  /* an array datatype                */
+    } u;
+} H5T_shared_t;
+
+struct H5T_t {
+    H5O_shared_t    sh_loc;     /* Shared message info (must be first) */
+
+    H5T_shared_t   *shared;     /* all other information */
+    H5O_loc_t       oloc;       /* Object location, if the type is a named type */
+    H5G_name_t      path;       /* group hier. path if the type is a named type */
+};
+
+/* The master list of soft conversion functions */
+typedef struct H5T_soft_t {
+    char	name[H5T_NAMELEN];	/*name for debugging only	     */
+    H5T_class_t src;			/*source datatype class	     */
+    H5T_class_t dst;			/*destination datatype class	     */
+    H5T_conv_t	func;			/*the conversion function	     */
+} H5T_soft_t;
+
+/* Bit search direction */
+typedef enum H5T_sdir_t {
+    H5T_BIT_LSB,			/*search lsb toward msb		     */
+    H5T_BIT_MSB				/*search msb toward lsb		     */
+} H5T_sdir_t;
+
+/* Typedef for named datatype creation operation */
+typedef struct {
+    H5T_t *dt;                  /* Datatype to commit */
+    hid_t tcpl_id;              /* Named datatype creation property list */
+} H5T_obj_create_t;
+
+/* Typedef for datatype iteration operations */
+typedef herr_t (*H5T_operator_t)(H5T_t *dt, void *op_data/*in,out*/);
+
+/*
+ * Alignment information for native types. A value of N indicates that the
+ * data must be aligned on an address ADDR such that 0 == ADDR mod N. When
+ * N=1 no alignment is required; N=0 implies that alignment constraints were
+ * not calculated.  These alignment info is only for H5Tget_native_type.
+ * These values are used for structure alignment.
+ */
+H5_DLLVAR size_t	H5T_NATIVE_SCHAR_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_SHORT_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_LONG_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_LLONG_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_FLOAT_COMP_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_DOUBLE_COMP_ALIGN_g;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+H5_DLLVAR size_t	H5T_NATIVE_LDOUBLE_COMP_ALIGN_g;
+#endif
+
+H5_DLLVAR size_t H5T_POINTER_COMP_ALIGN_g;
+H5_DLLVAR size_t H5T_HVL_COMP_ALIGN_g;
+H5_DLLVAR size_t H5T_HOBJREF_COMP_ALIGN_g;
+H5_DLLVAR size_t H5T_HDSETREGREF_COMP_ALIGN_g;
+
+/*
+ * Alignment information for native types. A value of N indicates that the
+ * data must be aligned on an address ADDR such that 0 == ADDR mod N. When
+ * N=1 no alignment is required; N=0 implies that alignment constraints were
+ * not calculated.
+ */
+H5_DLLVAR size_t	H5T_NATIVE_SCHAR_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UCHAR_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_SHORT_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_USHORT_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_LONG_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_ULONG_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_LLONG_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_ULLONG_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_FLOAT_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_DOUBLE_ALIGN_g;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+H5_DLLVAR size_t	H5T_NATIVE_LDOUBLE_ALIGN_g;
+#endif
+
+/* C9x alignment constraints */
+H5_DLLVAR size_t	H5T_NATIVE_INT8_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT8_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_LEAST8_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_LEAST8_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_FAST8_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_FAST8_ALIGN_g;
+
+H5_DLLVAR size_t	H5T_NATIVE_INT16_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT16_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_LEAST16_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_LEAST16_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_FAST16_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_FAST16_ALIGN_g;
+
+H5_DLLVAR size_t	H5T_NATIVE_INT32_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT32_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_LEAST32_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_LEAST32_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_FAST32_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_FAST32_ALIGN_g;
+
+H5_DLLVAR size_t	H5T_NATIVE_INT64_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT64_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_LEAST64_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_LEAST64_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_INT_FAST64_ALIGN_g;
+H5_DLLVAR size_t	H5T_NATIVE_UINT_FAST64_ALIGN_g;
+
+/* Useful floating-point values for conversion routines */
+/* (+/- Inf for all floating-point types) */
+H5_DLLVAR float H5T_NATIVE_FLOAT_POS_INF_g;
+H5_DLLVAR float H5T_NATIVE_FLOAT_NEG_INF_g;
+H5_DLLVAR double H5T_NATIVE_DOUBLE_POS_INF_g;
+H5_DLLVAR double H5T_NATIVE_DOUBLE_NEG_INF_g;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+H5_DLLVAR double H5T_NATIVE_LDOUBLE_POS_INF_g;
+H5_DLLVAR double H5T_NATIVE_LDOUBLE_NEG_INF_g;
+#endif
+
+/* Declare extern the free lists for H5T_t's and H5T_shared_t's */
+H5FL_EXTERN(H5T_t);
+H5FL_EXTERN(H5T_shared_t);
+
+/* Common functions */
+H5_DLL herr_t H5T__term_deprec_interface(void);
+H5_DLL H5T_t *H5T__create(H5T_class_t type, size_t size);
+H5_DLL herr_t H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id, hid_t dxpl_id);
+H5_DLL herr_t H5T__commit_named(const H5G_loc_t *loc, const char *name,
+    H5T_t *dt, hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id);
+H5_DLL H5T_t *H5T__alloc(void);
+H5_DLL herr_t H5T__free(H5T_t *dt);
+H5_DLL herr_t H5T__visit(H5T_t *dt, unsigned visit_flags, H5T_operator_t op,
+    void *op_value);
+H5_DLL herr_t H5T__upgrade_version(H5T_t *dt, unsigned new_version);
+
+/* Conversion functions */
+H5_DLL herr_t H5T__conv_noop(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_order(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_order_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_struct(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_struct_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_enum_numeric(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_array(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_i_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_i_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_s_s(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_b_b(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+			    size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *_buf, void *bkg,
+                            hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_schar_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+                            size_t nelmts, size_t buf_stride,
+                            size_t bkg_stride, void *buf, void *bkg,
+                            hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_int(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_uint(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_int(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_uint(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_long(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_ulong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_long(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_ulong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_llong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_llong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_short_schar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_uchar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_schar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_uchar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_short(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_int(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_uint(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_int(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_uint(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_long(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_ulong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_long(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_ulong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_llong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_llong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_ullong(hid_t src_id, hid_t dst_id,
+				      H5T_cdata_t *cdata, size_t nelmts,
+				      size_t buf_stride, size_t bkg_stride,
+                                      void *buf, void *bkg,
+                                      hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_int_schar(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_uchar(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_schar(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_uchar(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_short(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_ushort(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_short(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_ushort(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_uint(hid_t src_id, hid_t dst_id,
+				 H5T_cdata_t *cdata, size_t nelmts,
+				 size_t buf_stride, size_t bkg_stride,
+                                 void *buf, void *bkg,
+                                 hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_int(hid_t src_id, hid_t dst_id,
+				 H5T_cdata_t *cdata, size_t nelmts,
+				 size_t buf_stride, size_t bkg_stride,
+                                 void *buf, void *bkg,
+                                 hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_long(hid_t src_id, hid_t dst_id,
+				 H5T_cdata_t *cdata, size_t nelmts,
+				 size_t buf_stride, size_t bkg_stride,
+                                 void *buf, void *bkg,
+                                 hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_ulong(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_long(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_ulong(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_llong(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_ullong(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_llong(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_ullong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_long_schar(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_uchar(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_schar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_uchar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_short(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_ushort(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_short(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_int(hid_t src_id, hid_t dst_id,
+				 H5T_cdata_t *cdata, size_t nelmts,
+				 size_t buf_stride, size_t bkg_stride,
+                                 void *buf, void *bkg,
+                                 hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_uint(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_int(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_uint(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_ulong(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_long(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_llong(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_ullong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_llong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+
+H5_DLL herr_t H5T__conv_llong_schar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_uchar(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_schar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_uchar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_short(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_short(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_ushort(hid_t src_id, hid_t dst_id,
+				      H5T_cdata_t *cdata, size_t nelmts,
+				      size_t buf_stride, size_t bkg_stride,
+                                      void *buf, void *bkg,
+                                      hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_int(hid_t src_id, hid_t dst_id,
+				  H5T_cdata_t *cdata, size_t nelmts,
+				  size_t buf_stride, size_t bkg_stride,
+                                  void *buf, void *bkg,
+                                  hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_uint(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_int(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_uint(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_long(hid_t src_id, hid_t dst_id,
+				   H5T_cdata_t *cdata, size_t nelmts,
+				   size_t buf_stride, size_t bkg_stride,
+                                   void *buf, void *bkg,
+                                   hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_ulong(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_long(hid_t src_id, hid_t dst_id,
+				    H5T_cdata_t *cdata, size_t nelmts,
+				    size_t buf_stride, size_t bkg_stride,
+                                    void *buf, void *bkg,
+                                    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_ulong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_llong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_schar_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uchar_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_short_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ushort_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_int_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_uint_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_long_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ulong_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_llong_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_float(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_double(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ullong_ldouble(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_schar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_uchar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_short(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_int(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_uint(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_long(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_ulong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_llong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_float_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_schar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_uchar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_short(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_int(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_uint(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_long(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_ulong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_llong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_double_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_schar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_uchar(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_short(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_ushort(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_int(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_uint(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_long(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_ulong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_llong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_ldouble_ullong(hid_t src_id, hid_t dst_id,
+				     H5T_cdata_t *cdata, size_t nelmts,
+				     size_t buf_stride, size_t bkg_stride,
+                                     void *buf, void *bkg,
+                                     hid_t dset_xfer_plist);
+
+/* Bit twiddling functions */
+H5_DLL void H5T__bit_copy(uint8_t *dst, size_t dst_offset, const uint8_t *src,
+			  size_t src_offset, size_t size);
+H5_DLL herr_t H5T__bit_shift(uint8_t *buf, ssize_t shift_dist, size_t offset, size_t size);
+H5_DLL void H5T__bit_set(uint8_t *buf, size_t offset, size_t size,
+			 hbool_t value);
+H5_DLL uint64_t H5T__bit_get_d(uint8_t *buf, size_t offset, size_t size);
+H5_DLL void H5T__bit_set_d(uint8_t *buf, size_t offset, size_t size,
+			   uint64_t val);
+H5_DLL ssize_t H5T__bit_find(uint8_t *buf, size_t offset, size_t size,
+			     H5T_sdir_t direction, hbool_t value);
+H5_DLL htri_t H5T__bit_inc(uint8_t *buf, size_t start, size_t size);
+H5_DLL htri_t H5T__bit_dec(uint8_t *buf, size_t start, size_t size);
+H5_DLL void H5T__bit_neg(uint8_t *buf, size_t start, size_t size);
+
+/* VL functions */
+H5_DLL H5T_t * H5T__vlen_create(const H5T_t *base);
+H5_DLL htri_t H5T__vlen_set_loc(const H5T_t *dt, H5F_t *f, H5T_loc_t loc);
+
+/* Array functions */
+H5_DLL H5T_t *H5T__array_create(H5T_t *base, unsigned ndims, const hsize_t dim[/* ndims */]);
+H5_DLL int    H5T__get_array_ndims(const H5T_t *dt);
+H5_DLL int    H5T__get_array_dims(const H5T_t *dt, hsize_t dims[]);
+
+/* Compound functions */
+H5_DLL herr_t H5T__insert(H5T_t *parent, const char *name, size_t offset,
+        const H5T_t *member);
+H5_DLL size_t H5T__get_member_size(const H5T_t *dt, unsigned membno);
+H5_DLL void H5T__update_packed(const H5T_t *dt);
+H5_DLL H5T_subset_info_t *H5T__conv_struct_subset(const H5T_cdata_t *cdata);
+
+/* Enumerated type functions */
+H5_DLL H5T_t *H5T__enum_create(const H5T_t *parent);
+H5_DLL herr_t H5T__enum_insert(const H5T_t *dt, const char *name, const void *value);
+H5_DLL herr_t H5T__get_member_value(const H5T_t *dt, unsigned membno, void *value);
+
+/* Field functions (for both compound & enumerated types) */
+H5_DLL char  *H5T__get_member_name(H5T_t const *dt, unsigned membno);
+H5_DLL herr_t H5T__sort_value(const H5T_t *dt, int *map);
+H5_DLL herr_t H5T__sort_name(const H5T_t *dt, int *map);
+
+/* Debugging functions */
+H5_DLL herr_t H5T__print_stats(H5T_path_t *path, int *nprint/*in,out*/);
+
+#endif /* _H5Tpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tprecis.c b/gatb-core/thirdparty/hdf5/src/H5Tprecis.c
new file mode 100644
index 0000000..b3975af
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tprecis.c
@@ -0,0 +1,302 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the datatype precision for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_precis_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+/* Static local functions */
+static herr_t H5T_set_precision(const H5T_t *dt, size_t prec);
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_precis_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_precis_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_precis_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_precis_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_precision
+ *
+ * Purpose:	Gets the precision of a datatype.  The precision is
+ *		the number of significant bits which, unless padding is
+ *		present, is 8 times larger than the value returned by
+ *		H5Tget_size().
+ *
+ * Return:	Success:	Number of significant bits
+ *
+ *		Failure:	0 (all atomic types have at least one
+ *				significant bit)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5Tget_precision(hid_t type_id)
+{
+    H5T_t	*dt;
+    size_t	ret_value;
+
+    FUNC_ENTER_API(0)
+    H5TRACE1("z", "i", type_id);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+
+    /* Get precision */
+    if((ret_value = H5T_get_precision(dt)) == 0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, 0, "cant't get precision for specified datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tget_precision() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_get_precision
+ *
+ * Purpose:	Gets the precision of a datatype.  The precision is
+ *		the number of significant bits which, unless padding is
+ *		present, is 8 times larger than the value returned by
+ *		H5Tget_size().
+ *
+ * Return:	Success:	Number of significant bits
+ *		Failure:	0 (all atomic types have at least one
+ *				significant bit)
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, October 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5T_get_precision(const H5T_t *dt)
+{
+    size_t	ret_value;
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Defer to parent*/
+    while(dt->shared->parent)
+        dt = dt->shared->parent;
+    if(!H5T_IS_ATOMIC(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for specified datatype")
+
+    /* Precision */
+    ret_value = dt->shared->u.atomic.prec;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_get_precision() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_precision
+ *
+ * Purpose:	Sets the precision of a datatype.  The precision is
+ *		the number of significant bits which, unless padding is
+ *		present, is 8 times larger than the value returned by
+ *		H5Tget_size().
+ *
+ *		If the precision is increased then the offset is decreased
+ *		and then the size is increased to insure that significant
+ *		bits do not "hang over" the edge of the datatype.
+ *
+ *		The precision property of strings is read-only.
+ *
+ *		When decreasing the precision of a floating point type, set
+ *		the locations and sizes of the sign, mantissa, and exponent
+ *		fields first.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Moved real work to a private function.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_precision(hid_t type_id, size_t prec)
+{
+    H5T_t	*dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iz", type_id, prec);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+    if (prec == 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive")
+    if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after members are defined")
+    if (H5T_STRING==dt->shared->type)
+        HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "precision for this type is read-only")
+    if (H5T_COMPOUND==dt->shared->type || H5T_OPAQUE==dt->shared->type)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype")
+
+    /* Do the work */
+    if (H5T_set_precision(dt, prec)<0)
+	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_set_precision
+ *
+ * Purpose:	Sets the precision of a datatype.  The precision is
+ *		the number of significant bits which, unless padding is
+ *		present, is 8 times larger than the value returned by
+ *		H5Tget_size().
+ *
+ *		If the precision is increased then the offset is decreased
+ *		and then the size is increased to insure that significant
+ *		bits do not "hang over" the edge of the datatype.
+ *
+ *		The precision property of strings is read-only.
+ *
+ *		When decreasing the precision of a floating point type, set
+ *		the locations and sizes of the sign, mantissa, and exponent
+ *		fields first.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_set_precision(const H5T_t *dt, size_t prec)
+{
+    size_t	offset, size;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(dt);
+    HDassert(prec>0);
+    HDassert(H5T_OPAQUE!=dt->shared->type);
+    HDassert(H5T_COMPOUND!=dt->shared->type);
+    HDassert(H5T_STRING!=dt->shared->type);
+    HDassert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs));
+
+    if (dt->shared->parent) {
+	if (H5T_set_precision(dt->shared->parent, prec)<0)
+	    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision for base type")
+
+        /* Adjust size of datatype appropriately */
+        if(dt->shared->type==H5T_ARRAY)
+            dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem;
+        else if(dt->shared->type!=H5T_VLEN)
+            dt->shared->size = dt->shared->parent->shared->size;
+    } else {
+        if (H5T_IS_ATOMIC(dt->shared)) {
+	    /* Adjust the offset and size */
+	    offset = dt->shared->u.atomic.offset;
+	    size = dt->shared->size;
+	    if (prec > 8*size)
+                offset = 0;
+	    else if (offset+prec > 8 * size)
+                offset = 8 * size - prec;
+	    if (prec > 8*size)
+                size = (prec+7) / 8;
+
+	    /* Check that things are still kosher */
+	    switch (dt->shared->type) {
+                case H5T_INTEGER:
+                case H5T_TIME:
+                case H5T_BITFIELD:
+                    /* nothing to check */
+                    break;
+
+                case H5T_FLOAT:
+                    /*
+                     * The sign, mantissa, and exponent fields should be adjusted
+                     * first when decreasing the precision of a floating point
+                     * type.
+                     */
+                    if (dt->shared->u.atomic.u.f.sign >= prec+offset ||
+                            dt->shared->u.atomic.u.f.epos + dt->shared->u.atomic.u.f.esize > prec+offset ||
+                            dt->shared->u.atomic.u.f.mpos + dt->shared->u.atomic.u.f.msize > prec+offset)
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjust sign, mantissa, and exponent fields first")
+                    break;
+                default:
+                    HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
+	    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+	    /* Commit */
+	    dt->shared->size = size;
+            dt->shared->u.atomic.offset = offset;
+            dt->shared->u.atomic.prec = prec;
+	} /* end if */
+        else
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified datatype")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tprivate.h b/gatb-core/thirdparty/hdf5/src/H5Tprivate.h
new file mode 100644
index 0000000..656036f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tprivate.h
@@ -0,0 +1,165 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5T module
+ */
+#ifndef _H5Tprivate_H
+#define _H5Tprivate_H
+
+/* Get package's public header */
+#include "H5Tpublic.h"
+
+/* Other public headers needed by this file */
+#include "H5MMpublic.h"         /* Memory management                    */
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Gprivate.h"		/* Groups 			  	*/
+#include "H5Rprivate.h"		/* References				*/
+
+/* Macro for size of temporary buffers to contain a single element */
+#define H5T_ELEM_BUF_SIZE       256
+
+/* If the module using this macro is allowed access to the private variables, access them directly */
+#ifdef H5T_PACKAGE
+#define H5T_GET_SIZE(T)                 ((T)->shared->size)
+#define H5T_GET_SHARED(T)               ((T)->shared)
+#define H5T_GET_MEMBER_OFFSET(T, I)     ((T)->u.compnd.memb[I].offset)
+#define H5T_GET_MEMBER_SIZE(T, I)       ((T)->u.compnd.memb[I].shared->size)
+#else /* H5T_PACKAGE */
+#define H5T_GET_SIZE(T)                 (H5T_get_size(T))
+#define H5T_GET_SHARED(T)               (H5T_get_shared(T))
+#define H5T_GET_MEMBER_OFFSET(T, I)     (H5T_get_member_offset((T), (I)))
+#define H5T_GET_MEMBER_SIZE(T, I)       (H5T_get_member_size((T), (I)))
+#endif /* H5T_PACKAGE */
+
+/* Forward references of package typedefs (declared in H5Tpkg.h) */
+typedef struct H5T_t H5T_t;
+typedef struct H5T_stats_t H5T_stats_t;
+typedef struct H5T_path_t H5T_path_t;
+
+/* How to copy a datatype */
+typedef enum H5T_copy_t {
+    H5T_COPY_TRANSIENT,
+    H5T_COPY_ALL,
+    H5T_COPY_REOPEN
+} H5T_copy_t;
+
+/* Location of datatype information */
+typedef enum {
+    H5T_LOC_BADLOC =   0,  /* invalid datatype location */
+    H5T_LOC_MEMORY,        /* data stored in memory */
+    H5T_LOC_DISK,          /* data stored on disk */
+    H5T_LOC_MAXLOC         /* highest value (Invalid as true value) */
+} H5T_loc_t;
+
+/* VL allocation information */
+typedef struct {
+    H5MM_allocate_t alloc_func; /* Allocation function */
+    void *alloc_info;           /* Allocation information */
+    H5MM_free_t free_func;      /* Free function */
+    void *free_info;            /* Free information */
+} H5T_vlen_alloc_info_t;
+
+/* Structure for conversion callback property */
+typedef struct H5T_conv_cb_t {
+    H5T_conv_except_func_t      func;
+    void*                       user_data;
+} H5T_conv_cb_t;
+
+/* Values for the optimization of compound data reading and writing.  They indicate
+ * whether the fields of the source and destination are subset of each other and
+ * there is no conversion needed.
+ */
+typedef enum {
+    H5T_SUBSET_BADVALUE = -1,   /* Invalid value */
+    H5T_SUBSET_FALSE = 0,       /* Source and destination aren't subset of each other */
+    H5T_SUBSET_SRC,             /* Source is the subset of dest and no conversion is needed */
+    H5T_SUBSET_DST,             /* Dest is the subset of source and no conversion is needed */
+    H5T_SUBSET_CAP              /* Must be the last value */
+} H5T_subset_t;
+
+typedef struct H5T_subset_info_t {
+    H5T_subset_t    subset;     /* See above */
+    size_t          copy_size;  /* Size in bytes, to copy for each element */
+} H5T_subset_info_t;
+
+/* Forward declarations for prototype arguments */
+struct H5O_t;
+
+/* The native endianess of the platform */
+H5_DLLVAR H5T_order_t H5T_native_order_g;
+
+/* Private functions */
+H5_DLL herr_t H5TN_init_interface(void);
+H5_DLL herr_t H5T_init(void);
+H5_DLL H5T_t *H5T_copy(H5T_t *old_dt, H5T_copy_t method);
+H5_DLL herr_t H5T_lock(H5T_t *dt, hbool_t immutable);
+H5_DLL herr_t H5T_close(H5T_t *dt);
+H5_DLL H5T_t *H5T_get_super(const H5T_t *dt);
+H5_DLL H5T_class_t H5T_get_class(const H5T_t *dt, htri_t internal);
+H5_DLL htri_t H5T_detect_class(const H5T_t *dt, H5T_class_t cls, hbool_t from_api);
+H5_DLL size_t H5T_get_size(const H5T_t *dt);
+H5_DLL int    H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, hbool_t superset);
+H5_DLL herr_t H5T_debug(const H5T_t *dt, FILE * stream);
+H5_DLL struct H5O_loc_t *H5T_oloc(H5T_t *dt);
+H5_DLL H5G_name_t *H5T_nameof(H5T_t *dt);
+H5_DLL htri_t H5T_is_immutable(const H5T_t *dt);
+H5_DLL htri_t H5T_is_named(const H5T_t *dt);
+H5_DLL herr_t H5T_convert_committed_datatype(H5T_t *dt, H5F_t *f);
+H5_DLL htri_t H5T_is_relocatable(const H5T_t *dt);
+H5_DLL H5T_path_t *H5T_path_find(const H5T_t *src, const H5T_t *dst,
+    const char *name, H5T_conv_t func, hid_t dxpl_id, hbool_t is_api);
+H5_DLL hbool_t H5T_path_noop(const H5T_path_t *p);
+H5_DLL H5T_bkg_t H5T_path_bkg(const H5T_path_t *p);
+H5_DLL H5T_subset_info_t *H5T_path_compound_subset(const H5T_path_t *p);
+H5_DLL herr_t H5T_convert(H5T_path_t *tpath, hid_t src_id, hid_t dst_id,
+    size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg,
+    hid_t dset_xfer_plist);
+H5_DLL herr_t H5T_vlen_reclaim(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, void *_op_data);
+H5_DLL herr_t H5T_vlen_reclaim_elmt(void *elem, H5T_t *dt, hid_t dxpl_id);
+H5_DLL herr_t H5T_vlen_get_alloc_info(hid_t dxpl_id, H5T_vlen_alloc_info_t **vl_alloc_info);
+H5_DLL htri_t H5T_set_loc(H5T_t *dt, H5F_t *f, H5T_loc_t loc);
+H5_DLL htri_t H5T_is_sensible(const H5T_t *dt);
+H5_DLL uint32_t H5T_hash(H5F_t * file, const H5T_t *dt);
+H5_DLL herr_t H5T_set_latest_version(H5T_t *dt);
+H5_DLL herr_t H5T_patch_file(H5T_t *dt, H5F_t *f);
+H5_DLL htri_t H5T_is_variable_str(const H5T_t *dt);
+
+/* Reference specific functions */
+H5_DLL H5R_type_t H5T_get_ref_type(const H5T_t *dt);
+
+/* Operations on named datatypes */
+H5_DLL H5T_t *H5T_open(const H5G_loc_t *loc, hid_t dxpl_id);
+H5_DLL htri_t H5T_committed(const H5T_t *type);
+H5_DLL int H5T_link(const H5T_t *type, int adjust, hid_t dxpl_id);
+H5_DLL herr_t H5T_update_shared(H5T_t *type);
+
+/* Field functions (for both compound & enumerated types) */
+H5_DLL int H5T_get_nmembers(const H5T_t *dt);
+H5_DLL H5T_t *H5T_get_member_type(const H5T_t *dt, unsigned membno, H5T_copy_t method);
+H5_DLL size_t H5T_get_member_offset(const H5T_t *dt, unsigned membno);
+
+/* Atomic functions */
+H5_DLL H5T_order_t H5T_get_order(const H5T_t *dt);
+H5_DLL size_t H5T_get_precision(const H5T_t *dt);
+H5_DLL int H5T_get_offset(const H5T_t *dt);
+
+/* Fixed-point functions */
+H5_DLL H5T_sign_t H5T_get_sign(H5T_t const *dt);
+
+#endif /* _H5Tprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tpublic.h b/gatb-core/thirdparty/hdf5/src/H5Tpublic.h
new file mode 100644
index 0000000..d646ef1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tpublic.h
@@ -0,0 +1,621 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the H5T module.
+ */
+#ifndef _H5Tpublic_H
+#define _H5Tpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+#include "H5Ipublic.h"
+
+#define HOFFSET(S,M)    (offsetof(S,M))
+
+/* These are the various classes of datatypes */
+/* If this goes over 16 types (0-15), the file format will need to change) */
+typedef enum H5T_class_t {
+    H5T_NO_CLASS         = -1,  /*error                                      */
+    H5T_INTEGER          = 0,   /*integer types                              */
+    H5T_FLOAT            = 1,   /*floating-point types                       */
+    H5T_TIME             = 2,   /*date and time types                        */
+    H5T_STRING           = 3,   /*character string types                     */
+    H5T_BITFIELD         = 4,   /*bit field types                            */
+    H5T_OPAQUE           = 5,   /*opaque types                               */
+    H5T_COMPOUND         = 6,   /*compound types                             */
+    H5T_REFERENCE        = 7,   /*reference types                            */
+    H5T_ENUM		 = 8,	/*enumeration types                          */
+    H5T_VLEN		 = 9,	/*Variable-Length types                      */
+    H5T_ARRAY	         = 10,	/*Array types                                */
+
+    H5T_NCLASSES                /*this must be last                          */
+} H5T_class_t;
+
+/* Byte orders */
+typedef enum H5T_order_t {
+    H5T_ORDER_ERROR      = -1,  /*error                                      */
+    H5T_ORDER_LE         = 0,   /*little endian                              */
+    H5T_ORDER_BE         = 1,   /*bit endian                                 */
+    H5T_ORDER_VAX        = 2,   /*VAX mixed endian                           */
+    H5T_ORDER_MIXED      = 3,   /*Compound type with mixed member orders     */
+    H5T_ORDER_NONE       = 4    /*no particular order (strings, bits,..)     */
+    /*H5T_ORDER_NONE must be last */
+} H5T_order_t;
+
+/* Types of integer sign schemes */
+typedef enum H5T_sign_t {
+    H5T_SGN_ERROR        = -1,  /*error                                      */
+    H5T_SGN_NONE         = 0,   /*this is an unsigned type                   */
+    H5T_SGN_2            = 1,   /*two's complement                           */
+
+    H5T_NSGN             = 2    /*this must be last!                         */
+} H5T_sign_t;
+
+/* Floating-point normalization schemes */
+typedef enum H5T_norm_t {
+    H5T_NORM_ERROR       = -1,  /*error                                      */
+    H5T_NORM_IMPLIED     = 0,   /*msb of mantissa isn't stored, always 1     */
+    H5T_NORM_MSBSET      = 1,   /*msb of mantissa is always 1                */
+    H5T_NORM_NONE        = 2    /*not normalized                             */
+    /*H5T_NORM_NONE must be last */
+} H5T_norm_t;
+
+/*
+ * Character set to use for text strings.  Do not change these values since
+ * they appear in HDF5 files!
+ */
+typedef enum H5T_cset_t {
+    H5T_CSET_ERROR       = -1,  /*error                                      */
+    H5T_CSET_ASCII       = 0,   /*US ASCII                                   */
+    H5T_CSET_UTF8        = 1,   /*UTF-8 Unicode encoding		     */
+    H5T_CSET_RESERVED_2  = 2,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_3  = 3,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_4  = 4,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_5  = 5,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_6  = 6,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_7  = 7,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_8  = 8,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_9  = 9,   /*reserved for later use		     */
+    H5T_CSET_RESERVED_10 = 10,  /*reserved for later use		     */
+    H5T_CSET_RESERVED_11 = 11,  /*reserved for later use		     */
+    H5T_CSET_RESERVED_12 = 12,  /*reserved for later use		     */
+    H5T_CSET_RESERVED_13 = 13,  /*reserved for later use		     */
+    H5T_CSET_RESERVED_14 = 14,  /*reserved for later use		     */
+    H5T_CSET_RESERVED_15 = 15   /*reserved for later use		     */
+} H5T_cset_t;
+#define H5T_NCSET H5T_CSET_RESERVED_2    		/*Number of character sets actually defined  */
+
+/*
+ * Type of padding to use in character strings.  Do not change these values
+ * since they appear in HDF5 files!
+ */
+typedef enum H5T_str_t {
+    H5T_STR_ERROR        = -1,  /*error                                      */
+    H5T_STR_NULLTERM     = 0,   /*null terminate like in C                   */
+    H5T_STR_NULLPAD      = 1,   /*pad with nulls                             */
+    H5T_STR_SPACEPAD     = 2,   /*pad with spaces like in Fortran            */
+    H5T_STR_RESERVED_3   = 3,   /*reserved for later use		     */
+    H5T_STR_RESERVED_4   = 4,   /*reserved for later use		     */
+    H5T_STR_RESERVED_5   = 5,   /*reserved for later use		     */
+    H5T_STR_RESERVED_6   = 6,   /*reserved for later use		     */
+    H5T_STR_RESERVED_7   = 7,   /*reserved for later use		     */
+    H5T_STR_RESERVED_8   = 8,   /*reserved for later use		     */
+    H5T_STR_RESERVED_9   = 9,   /*reserved for later use		     */
+    H5T_STR_RESERVED_10  = 10,  /*reserved for later use		     */
+    H5T_STR_RESERVED_11  = 11,  /*reserved for later use		     */
+    H5T_STR_RESERVED_12  = 12,  /*reserved for later use		     */
+    H5T_STR_RESERVED_13  = 13,  /*reserved for later use		     */
+    H5T_STR_RESERVED_14  = 14,  /*reserved for later use		     */
+    H5T_STR_RESERVED_15  = 15   /*reserved for later use		     */
+} H5T_str_t;
+#define H5T_NSTR H5T_STR_RESERVED_3		/*num H5T_str_t types actually defined	     */
+
+/* Type of padding to use in other atomic types */
+typedef enum H5T_pad_t {
+    H5T_PAD_ERROR        = -1,  /*error                                      */
+    H5T_PAD_ZERO         = 0,   /*always set to zero                         */
+    H5T_PAD_ONE          = 1,   /*always set to one                          */
+    H5T_PAD_BACKGROUND   = 2,   /*set to background value                    */
+
+    H5T_NPAD             = 3    /*THIS MUST BE LAST                          */
+} H5T_pad_t;
+
+/* Commands sent to conversion functions */
+typedef enum H5T_cmd_t {
+    H5T_CONV_INIT	= 0,	/*query and/or initialize private data	     */
+    H5T_CONV_CONV	= 1, 	/*convert data from source to dest datatype */
+    H5T_CONV_FREE	= 2	/*function is being removed from path	     */
+} H5T_cmd_t;
+
+/* How is the `bkg' buffer used by the conversion function? */
+typedef enum H5T_bkg_t {
+    H5T_BKG_NO		= 0, 	/*background buffer is not needed, send NULL */
+    H5T_BKG_TEMP	= 1,	/*bkg buffer used as temp storage only       */
+    H5T_BKG_YES		= 2	/*init bkg buf with data before conversion   */
+} H5T_bkg_t;
+
+/* Type conversion client data */
+typedef struct H5T_cdata_t {
+    H5T_cmd_t		command;/*what should the conversion function do?    */
+    H5T_bkg_t		need_bkg;/*is the background buffer needed?	     */
+    hbool_t		recalc;	/*recalculate private data		     */
+    void		*priv;	/*private data				     */
+} H5T_cdata_t;
+
+/* Conversion function persistence */
+typedef enum H5T_pers_t {
+    H5T_PERS_DONTCARE	= -1, 	/*wild card				     */
+    H5T_PERS_HARD	= 0,	/*hard conversion function		     */
+    H5T_PERS_SOFT	= 1 	/*soft conversion function		     */
+} H5T_pers_t;
+
+/* The order to retrieve atomic native datatype */
+typedef enum H5T_direction_t {
+    H5T_DIR_DEFAULT     = 0,    /*default direction is inscendent            */
+    H5T_DIR_ASCEND      = 1,    /*in inscendent order                        */
+    H5T_DIR_DESCEND     = 2     /*in descendent order                        */
+} H5T_direction_t;
+
+/* The exception type passed into the conversion callback function */
+typedef enum H5T_conv_except_t {
+    H5T_CONV_EXCEPT_RANGE_HI       = 0,   /*source value is greater than destination's range */
+    H5T_CONV_EXCEPT_RANGE_LOW      = 1,   /*source value is less than destination's range    */
+    H5T_CONV_EXCEPT_PRECISION      = 2,   /*source value loses precision in destination      */
+    H5T_CONV_EXCEPT_TRUNCATE       = 3,   /*source value is truncated in destination         */
+    H5T_CONV_EXCEPT_PINF           = 4,   /*source value is positive infinity(floating number) */
+    H5T_CONV_EXCEPT_NINF           = 5,   /*source value is negative infinity(floating number) */
+    H5T_CONV_EXCEPT_NAN            = 6    /*source value is NaN(floating number)             */
+} H5T_conv_except_t;
+
+/* The return value from conversion callback function H5T_conv_except_func_t */
+typedef enum H5T_conv_ret_t {
+    H5T_CONV_ABORT      = -1,   /*abort conversion                           */
+    H5T_CONV_UNHANDLED  = 0,    /*callback function failed to handle the exception      */
+    H5T_CONV_HANDLED    = 1     /*callback function handled the exception successfully  */
+} H5T_conv_ret_t;
+
+/* Variable Length Datatype struct in memory */
+/* (This is only used for VL sequences, not VL strings, which are stored in char *'s) */
+typedef struct {
+    size_t len; /* Length of VL data (in base type units) */
+    void *p;    /* Pointer to VL data */
+} hvl_t;
+
+/* Variable Length String information */
+#define H5T_VARIABLE    ((size_t)(-1))  /* Indicate that a string is variable length (null-terminated in C, instead of fixed length) */
+
+/* Opaque information */
+#define H5T_OPAQUE_TAG_MAX      256     /* Maximum length of an opaque tag */
+                                        /* This could be raised without too much difficulty */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* All datatype conversion functions are... */
+typedef herr_t (*H5T_conv_t) (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+      size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf,
+      void *bkg, hid_t dset_xfer_plist);
+
+/* Exception handler.  If an exception like overflow happenes during conversion,
+ * this function is called if it's registered through H5Pset_type_conv_cb.
+ */
+typedef H5T_conv_ret_t (*H5T_conv_except_func_t)(H5T_conv_except_t except_type,
+    hid_t src_id, hid_t dst_id, void *src_buf, void *dst_buf, void *user_data);
+
+/* When this header is included from a private header, don't make calls to H5open() */
+#undef H5OPEN
+#ifndef _H5private_H
+#define H5OPEN          H5open(),
+#else   /* _H5private_H */
+#define H5OPEN
+#endif  /* _H5private_H */
+
+/*
+ * The IEEE floating point types in various byte orders.
+ */
+#define H5T_IEEE_F32BE		(H5OPEN H5T_IEEE_F32BE_g)
+#define H5T_IEEE_F32LE		(H5OPEN H5T_IEEE_F32LE_g)
+#define H5T_IEEE_F64BE		(H5OPEN H5T_IEEE_F64BE_g)
+#define H5T_IEEE_F64LE		(H5OPEN H5T_IEEE_F64LE_g)
+H5_DLLVAR hid_t H5T_IEEE_F32BE_g;
+H5_DLLVAR hid_t H5T_IEEE_F32LE_g;
+H5_DLLVAR hid_t H5T_IEEE_F64BE_g;
+H5_DLLVAR hid_t H5T_IEEE_F64LE_g;
+
+/*
+ * These are "standard" types.  For instance, signed (2's complement) and
+ * unsigned integers of various sizes and byte orders.
+ */
+#define H5T_STD_I8BE		(H5OPEN H5T_STD_I8BE_g)
+#define H5T_STD_I8LE		(H5OPEN H5T_STD_I8LE_g)
+#define H5T_STD_I16BE		(H5OPEN H5T_STD_I16BE_g)
+#define H5T_STD_I16LE		(H5OPEN H5T_STD_I16LE_g)
+#define H5T_STD_I32BE		(H5OPEN H5T_STD_I32BE_g)
+#define H5T_STD_I32LE		(H5OPEN H5T_STD_I32LE_g)
+#define H5T_STD_I64BE		(H5OPEN H5T_STD_I64BE_g)
+#define H5T_STD_I64LE		(H5OPEN H5T_STD_I64LE_g)
+#define H5T_STD_U8BE		(H5OPEN H5T_STD_U8BE_g)
+#define H5T_STD_U8LE		(H5OPEN H5T_STD_U8LE_g)
+#define H5T_STD_U16BE		(H5OPEN H5T_STD_U16BE_g)
+#define H5T_STD_U16LE		(H5OPEN H5T_STD_U16LE_g)
+#define H5T_STD_U32BE		(H5OPEN H5T_STD_U32BE_g)
+#define H5T_STD_U32LE		(H5OPEN H5T_STD_U32LE_g)
+#define H5T_STD_U64BE		(H5OPEN H5T_STD_U64BE_g)
+#define H5T_STD_U64LE		(H5OPEN H5T_STD_U64LE_g)
+#define H5T_STD_B8BE		(H5OPEN H5T_STD_B8BE_g)
+#define H5T_STD_B8LE		(H5OPEN H5T_STD_B8LE_g)
+#define H5T_STD_B16BE		(H5OPEN H5T_STD_B16BE_g)
+#define H5T_STD_B16LE		(H5OPEN H5T_STD_B16LE_g)
+#define H5T_STD_B32BE		(H5OPEN H5T_STD_B32BE_g)
+#define H5T_STD_B32LE		(H5OPEN H5T_STD_B32LE_g)
+#define H5T_STD_B64BE		(H5OPEN H5T_STD_B64BE_g)
+#define H5T_STD_B64LE		(H5OPEN H5T_STD_B64LE_g)
+#define H5T_STD_REF_OBJ	        (H5OPEN H5T_STD_REF_OBJ_g)
+#define H5T_STD_REF_DSETREG     (H5OPEN H5T_STD_REF_DSETREG_g)
+H5_DLLVAR hid_t H5T_STD_I8BE_g;
+H5_DLLVAR hid_t H5T_STD_I8LE_g;
+H5_DLLVAR hid_t H5T_STD_I16BE_g;
+H5_DLLVAR hid_t H5T_STD_I16LE_g;
+H5_DLLVAR hid_t H5T_STD_I32BE_g;
+H5_DLLVAR hid_t H5T_STD_I32LE_g;
+H5_DLLVAR hid_t H5T_STD_I64BE_g;
+H5_DLLVAR hid_t H5T_STD_I64LE_g;
+H5_DLLVAR hid_t H5T_STD_U8BE_g;
+H5_DLLVAR hid_t H5T_STD_U8LE_g;
+H5_DLLVAR hid_t H5T_STD_U16BE_g;
+H5_DLLVAR hid_t H5T_STD_U16LE_g;
+H5_DLLVAR hid_t H5T_STD_U32BE_g;
+H5_DLLVAR hid_t H5T_STD_U32LE_g;
+H5_DLLVAR hid_t H5T_STD_U64BE_g;
+H5_DLLVAR hid_t H5T_STD_U64LE_g;
+H5_DLLVAR hid_t H5T_STD_B8BE_g;
+H5_DLLVAR hid_t H5T_STD_B8LE_g;
+H5_DLLVAR hid_t H5T_STD_B16BE_g;
+H5_DLLVAR hid_t H5T_STD_B16LE_g;
+H5_DLLVAR hid_t H5T_STD_B32BE_g;
+H5_DLLVAR hid_t H5T_STD_B32LE_g;
+H5_DLLVAR hid_t H5T_STD_B64BE_g;
+H5_DLLVAR hid_t H5T_STD_B64LE_g;
+H5_DLLVAR hid_t H5T_STD_REF_OBJ_g;
+H5_DLLVAR hid_t H5T_STD_REF_DSETREG_g;
+
+/*
+ * Types which are particular to Unix.
+ */
+#define H5T_UNIX_D32BE		(H5OPEN H5T_UNIX_D32BE_g)
+#define H5T_UNIX_D32LE		(H5OPEN H5T_UNIX_D32LE_g)
+#define H5T_UNIX_D64BE		(H5OPEN H5T_UNIX_D64BE_g)
+#define H5T_UNIX_D64LE		(H5OPEN H5T_UNIX_D64LE_g)
+H5_DLLVAR hid_t H5T_UNIX_D32BE_g;
+H5_DLLVAR hid_t H5T_UNIX_D32LE_g;
+H5_DLLVAR hid_t H5T_UNIX_D64BE_g;
+H5_DLLVAR hid_t H5T_UNIX_D64LE_g;
+
+/*
+ * Types particular to the C language.  String types use `bytes' instead
+ * of `bits' as their size.
+ */
+#define H5T_C_S1		(H5OPEN H5T_C_S1_g)
+H5_DLLVAR hid_t H5T_C_S1_g;
+
+/*
+ * Types particular to Fortran.
+ */
+#define H5T_FORTRAN_S1		(H5OPEN H5T_FORTRAN_S1_g)
+H5_DLLVAR hid_t H5T_FORTRAN_S1_g;
+
+/*
+ * These types are for Intel CPU's.  They are little endian with IEEE
+ * floating point.
+ */
+#define H5T_INTEL_I8		H5T_STD_I8LE
+#define H5T_INTEL_I16		H5T_STD_I16LE
+#define H5T_INTEL_I32		H5T_STD_I32LE
+#define H5T_INTEL_I64		H5T_STD_I64LE
+#define H5T_INTEL_U8		H5T_STD_U8LE
+#define H5T_INTEL_U16		H5T_STD_U16LE
+#define H5T_INTEL_U32		H5T_STD_U32LE
+#define H5T_INTEL_U64		H5T_STD_U64LE
+#define H5T_INTEL_B8		H5T_STD_B8LE
+#define H5T_INTEL_B16		H5T_STD_B16LE
+#define H5T_INTEL_B32		H5T_STD_B32LE
+#define H5T_INTEL_B64		H5T_STD_B64LE
+#define H5T_INTEL_F32		H5T_IEEE_F32LE
+#define H5T_INTEL_F64		H5T_IEEE_F64LE
+
+/*
+ * These types are for DEC Alpha CPU's.  They are little endian with IEEE
+ * floating point.
+ */
+#define H5T_ALPHA_I8		H5T_STD_I8LE
+#define H5T_ALPHA_I16		H5T_STD_I16LE
+#define H5T_ALPHA_I32		H5T_STD_I32LE
+#define H5T_ALPHA_I64		H5T_STD_I64LE
+#define H5T_ALPHA_U8		H5T_STD_U8LE
+#define H5T_ALPHA_U16		H5T_STD_U16LE
+#define H5T_ALPHA_U32		H5T_STD_U32LE
+#define H5T_ALPHA_U64		H5T_STD_U64LE
+#define H5T_ALPHA_B8		H5T_STD_B8LE
+#define H5T_ALPHA_B16		H5T_STD_B16LE
+#define H5T_ALPHA_B32		H5T_STD_B32LE
+#define H5T_ALPHA_B64		H5T_STD_B64LE
+#define H5T_ALPHA_F32		H5T_IEEE_F32LE
+#define H5T_ALPHA_F64		H5T_IEEE_F64LE
+
+/*
+ * These types are for MIPS cpu's commonly used in SGI systems. They are big
+ * endian with IEEE floating point.
+ */
+#define H5T_MIPS_I8		H5T_STD_I8BE
+#define H5T_MIPS_I16		H5T_STD_I16BE
+#define H5T_MIPS_I32		H5T_STD_I32BE
+#define H5T_MIPS_I64		H5T_STD_I64BE
+#define H5T_MIPS_U8		H5T_STD_U8BE
+#define H5T_MIPS_U16		H5T_STD_U16BE
+#define H5T_MIPS_U32		H5T_STD_U32BE
+#define H5T_MIPS_U64		H5T_STD_U64BE
+#define H5T_MIPS_B8		H5T_STD_B8BE
+#define H5T_MIPS_B16		H5T_STD_B16BE
+#define H5T_MIPS_B32		H5T_STD_B32BE
+#define H5T_MIPS_B64		H5T_STD_B64BE
+#define H5T_MIPS_F32		H5T_IEEE_F32BE
+#define H5T_MIPS_F64		H5T_IEEE_F64BE
+
+/*
+ * The VAX floating point types (i.e. in VAX byte order)
+ */
+#define H5T_VAX_F32		(H5OPEN H5T_VAX_F32_g)
+#define H5T_VAX_F64		(H5OPEN H5T_VAX_F64_g)
+H5_DLLVAR hid_t H5T_VAX_F32_g;
+H5_DLLVAR hid_t H5T_VAX_F64_g;
+
+/*
+ * The predefined native types. These are the types detected by H5detect and
+ * they violate the naming scheme a little.  Instead of a class name,
+ * precision and byte order as the last component, they have a C-like type
+ * name.  If the type begins with `U' then it is the unsigned version of the
+ * integer type; other integer types are signed.  The type LLONG corresponds
+ * to C's `long long' and LDOUBLE is `long double' (these types might be the
+ * same as `LONG' and `DOUBLE' respectively).
+ */
+#define H5T_NATIVE_CHAR		(CHAR_MIN?H5T_NATIVE_SCHAR:H5T_NATIVE_UCHAR)
+#define H5T_NATIVE_SCHAR        (H5OPEN H5T_NATIVE_SCHAR_g)
+#define H5T_NATIVE_UCHAR        (H5OPEN H5T_NATIVE_UCHAR_g)
+#define H5T_NATIVE_SHORT        (H5OPEN H5T_NATIVE_SHORT_g)
+#define H5T_NATIVE_USHORT       (H5OPEN H5T_NATIVE_USHORT_g)
+#define H5T_NATIVE_INT          (H5OPEN H5T_NATIVE_INT_g)
+#define H5T_NATIVE_UINT         (H5OPEN H5T_NATIVE_UINT_g)
+#define H5T_NATIVE_LONG         (H5OPEN H5T_NATIVE_LONG_g)
+#define H5T_NATIVE_ULONG        (H5OPEN H5T_NATIVE_ULONG_g)
+#define H5T_NATIVE_LLONG        (H5OPEN H5T_NATIVE_LLONG_g)
+#define H5T_NATIVE_ULLONG       (H5OPEN H5T_NATIVE_ULLONG_g)
+#define H5T_NATIVE_FLOAT        (H5OPEN H5T_NATIVE_FLOAT_g)
+#define H5T_NATIVE_DOUBLE       (H5OPEN H5T_NATIVE_DOUBLE_g)
+#if H5_SIZEOF_LONG_DOUBLE !=0
+#define H5T_NATIVE_LDOUBLE	(H5OPEN H5T_NATIVE_LDOUBLE_g)
+#endif
+#define H5T_NATIVE_B8		(H5OPEN H5T_NATIVE_B8_g)
+#define H5T_NATIVE_B16		(H5OPEN H5T_NATIVE_B16_g)
+#define H5T_NATIVE_B32		(H5OPEN H5T_NATIVE_B32_g)
+#define H5T_NATIVE_B64		(H5OPEN H5T_NATIVE_B64_g)
+#define H5T_NATIVE_OPAQUE       (H5OPEN H5T_NATIVE_OPAQUE_g)
+#define H5T_NATIVE_HADDR	(H5OPEN H5T_NATIVE_HADDR_g)
+#define H5T_NATIVE_HSIZE	(H5OPEN H5T_NATIVE_HSIZE_g)
+#define H5T_NATIVE_HSSIZE	(H5OPEN H5T_NATIVE_HSSIZE_g)
+#define H5T_NATIVE_HERR		(H5OPEN H5T_NATIVE_HERR_g)
+#define H5T_NATIVE_HBOOL	(H5OPEN H5T_NATIVE_HBOOL_g)
+H5_DLLVAR hid_t H5T_NATIVE_SCHAR_g;
+H5_DLLVAR hid_t H5T_NATIVE_UCHAR_g;
+H5_DLLVAR hid_t H5T_NATIVE_SHORT_g;
+H5_DLLVAR hid_t H5T_NATIVE_USHORT_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_g;
+H5_DLLVAR hid_t H5T_NATIVE_LONG_g;
+H5_DLLVAR hid_t H5T_NATIVE_ULONG_g;
+H5_DLLVAR hid_t H5T_NATIVE_LLONG_g;
+H5_DLLVAR hid_t H5T_NATIVE_ULLONG_g;
+H5_DLLVAR hid_t H5T_NATIVE_FLOAT_g;
+H5_DLLVAR hid_t H5T_NATIVE_DOUBLE_g;
+#if H5_SIZEOF_LONG_DOUBLE !=0
+H5_DLLVAR hid_t H5T_NATIVE_LDOUBLE_g;
+#endif
+H5_DLLVAR hid_t H5T_NATIVE_B8_g;
+H5_DLLVAR hid_t H5T_NATIVE_B16_g;
+H5_DLLVAR hid_t H5T_NATIVE_B32_g;
+H5_DLLVAR hid_t H5T_NATIVE_B64_g;
+H5_DLLVAR hid_t H5T_NATIVE_OPAQUE_g;
+H5_DLLVAR hid_t H5T_NATIVE_HADDR_g;
+H5_DLLVAR hid_t H5T_NATIVE_HSIZE_g;
+H5_DLLVAR hid_t H5T_NATIVE_HSSIZE_g;
+H5_DLLVAR hid_t H5T_NATIVE_HERR_g;
+H5_DLLVAR hid_t H5T_NATIVE_HBOOL_g;
+
+/* C9x integer types */
+#define H5T_NATIVE_INT8			(H5OPEN H5T_NATIVE_INT8_g)
+#define H5T_NATIVE_UINT8		(H5OPEN H5T_NATIVE_UINT8_g)
+#define H5T_NATIVE_INT_LEAST8		(H5OPEN H5T_NATIVE_INT_LEAST8_g)
+#define H5T_NATIVE_UINT_LEAST8		(H5OPEN H5T_NATIVE_UINT_LEAST8_g)
+#define H5T_NATIVE_INT_FAST8 		(H5OPEN H5T_NATIVE_INT_FAST8_g)
+#define H5T_NATIVE_UINT_FAST8		(H5OPEN H5T_NATIVE_UINT_FAST8_g)
+H5_DLLVAR hid_t H5T_NATIVE_INT8_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT8_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST8_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST8_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_FAST8_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST8_g;
+
+#define H5T_NATIVE_INT16		(H5OPEN H5T_NATIVE_INT16_g)
+#define H5T_NATIVE_UINT16		(H5OPEN H5T_NATIVE_UINT16_g)
+#define H5T_NATIVE_INT_LEAST16		(H5OPEN H5T_NATIVE_INT_LEAST16_g)
+#define H5T_NATIVE_UINT_LEAST16		(H5OPEN H5T_NATIVE_UINT_LEAST16_g)
+#define H5T_NATIVE_INT_FAST16		(H5OPEN H5T_NATIVE_INT_FAST16_g)
+#define H5T_NATIVE_UINT_FAST16		(H5OPEN H5T_NATIVE_UINT_FAST16_g)
+H5_DLLVAR hid_t H5T_NATIVE_INT16_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT16_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST16_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST16_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_FAST16_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST16_g;
+
+#define H5T_NATIVE_INT32		(H5OPEN H5T_NATIVE_INT32_g)
+#define H5T_NATIVE_UINT32		(H5OPEN H5T_NATIVE_UINT32_g)
+#define H5T_NATIVE_INT_LEAST32		(H5OPEN H5T_NATIVE_INT_LEAST32_g)
+#define H5T_NATIVE_UINT_LEAST32		(H5OPEN H5T_NATIVE_UINT_LEAST32_g)
+#define H5T_NATIVE_INT_FAST32		(H5OPEN H5T_NATIVE_INT_FAST32_g)
+#define H5T_NATIVE_UINT_FAST32		(H5OPEN H5T_NATIVE_UINT_FAST32_g)
+H5_DLLVAR hid_t H5T_NATIVE_INT32_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT32_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST32_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST32_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_FAST32_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST32_g;
+
+#define H5T_NATIVE_INT64		(H5OPEN H5T_NATIVE_INT64_g)
+#define H5T_NATIVE_UINT64		(H5OPEN H5T_NATIVE_UINT64_g)
+#define H5T_NATIVE_INT_LEAST64		(H5OPEN H5T_NATIVE_INT_LEAST64_g)
+#define H5T_NATIVE_UINT_LEAST64 	(H5OPEN H5T_NATIVE_UINT_LEAST64_g)
+#define H5T_NATIVE_INT_FAST64		(H5OPEN H5T_NATIVE_INT_FAST64_g)
+#define H5T_NATIVE_UINT_FAST64		(H5OPEN H5T_NATIVE_UINT_FAST64_g)
+H5_DLLVAR hid_t H5T_NATIVE_INT64_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT64_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST64_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST64_g;
+H5_DLLVAR hid_t H5T_NATIVE_INT_FAST64_g;
+H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST64_g;
+
+/* Operations defined on all datatypes */
+H5_DLL hid_t H5Tcreate(H5T_class_t type, size_t size);
+H5_DLL hid_t H5Tcopy(hid_t type_id);
+H5_DLL herr_t H5Tclose(hid_t type_id);
+H5_DLL htri_t H5Tequal(hid_t type1_id, hid_t type2_id);
+H5_DLL herr_t H5Tlock(hid_t type_id);
+H5_DLL herr_t H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id,
+    hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id);
+H5_DLL hid_t H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id);
+H5_DLL herr_t H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id);
+H5_DLL hid_t H5Tget_create_plist(hid_t type_id);
+H5_DLL htri_t H5Tcommitted(hid_t type_id);
+H5_DLL herr_t H5Tencode(hid_t obj_id, void *buf, size_t *nalloc);
+H5_DLL hid_t H5Tdecode(const void *buf);
+
+/* Operations defined on compound datatypes */
+H5_DLL herr_t H5Tinsert(hid_t parent_id, const char *name, size_t offset,
+			 hid_t member_id);
+H5_DLL herr_t H5Tpack(hid_t type_id);
+
+/* Operations defined on enumeration datatypes */
+H5_DLL hid_t H5Tenum_create(hid_t base_id);
+H5_DLL herr_t H5Tenum_insert(hid_t type, const char *name, const void *value);
+H5_DLL herr_t H5Tenum_nameof(hid_t type, const void *value, char *name/*out*/,
+			     size_t size);
+H5_DLL herr_t H5Tenum_valueof(hid_t type, const char *name,
+			      void *value/*out*/);
+
+/* Operations defined on variable-length datatypes */
+H5_DLL hid_t H5Tvlen_create(hid_t base_id);
+
+/* Operations defined on array datatypes */
+H5_DLL hid_t H5Tarray_create2(hid_t base_id, unsigned ndims,
+            const hsize_t dim[/* ndims */]);
+H5_DLL int H5Tget_array_ndims(hid_t type_id);
+H5_DLL int H5Tget_array_dims2(hid_t type_id, hsize_t dims[]);
+
+/* Operations defined on opaque datatypes */
+H5_DLL herr_t H5Tset_tag(hid_t type, const char *tag);
+H5_DLL char *H5Tget_tag(hid_t type);
+
+/* Querying property values */
+H5_DLL hid_t H5Tget_super(hid_t type);
+H5_DLL H5T_class_t H5Tget_class(hid_t type_id);
+H5_DLL htri_t H5Tdetect_class(hid_t type_id, H5T_class_t cls);
+H5_DLL size_t H5Tget_size(hid_t type_id);
+H5_DLL H5T_order_t H5Tget_order(hid_t type_id);
+H5_DLL size_t H5Tget_precision(hid_t type_id);
+H5_DLL int H5Tget_offset(hid_t type_id);
+H5_DLL herr_t H5Tget_pad(hid_t type_id, H5T_pad_t *lsb/*out*/,
+			  H5T_pad_t *msb/*out*/);
+H5_DLL H5T_sign_t H5Tget_sign(hid_t type_id);
+H5_DLL herr_t H5Tget_fields(hid_t type_id, size_t *spos/*out*/,
+			     size_t *epos/*out*/, size_t *esize/*out*/,
+			     size_t *mpos/*out*/, size_t *msize/*out*/);
+H5_DLL size_t H5Tget_ebias(hid_t type_id);
+H5_DLL H5T_norm_t H5Tget_norm(hid_t type_id);
+H5_DLL H5T_pad_t H5Tget_inpad(hid_t type_id);
+H5_DLL H5T_str_t H5Tget_strpad(hid_t type_id);
+H5_DLL int H5Tget_nmembers(hid_t type_id);
+H5_DLL char *H5Tget_member_name(hid_t type_id, unsigned membno);
+H5_DLL int H5Tget_member_index(hid_t type_id, const char *name);
+H5_DLL size_t H5Tget_member_offset(hid_t type_id, unsigned membno);
+H5_DLL H5T_class_t H5Tget_member_class(hid_t type_id, unsigned membno);
+H5_DLL hid_t H5Tget_member_type(hid_t type_id, unsigned membno);
+H5_DLL herr_t H5Tget_member_value(hid_t type_id, unsigned membno, void *value/*out*/);
+H5_DLL H5T_cset_t H5Tget_cset(hid_t type_id);
+H5_DLL htri_t H5Tis_variable_str(hid_t type_id);
+H5_DLL hid_t H5Tget_native_type(hid_t type_id, H5T_direction_t direction);
+
+/* Setting property values */
+H5_DLL herr_t H5Tset_size(hid_t type_id, size_t size);
+H5_DLL herr_t H5Tset_order(hid_t type_id, H5T_order_t order);
+H5_DLL herr_t H5Tset_precision(hid_t type_id, size_t prec);
+H5_DLL herr_t H5Tset_offset(hid_t type_id, size_t offset);
+H5_DLL herr_t H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb);
+H5_DLL herr_t H5Tset_sign(hid_t type_id, H5T_sign_t sign);
+H5_DLL herr_t H5Tset_fields(hid_t type_id, size_t spos, size_t epos,
+			     size_t esize, size_t mpos, size_t msize);
+H5_DLL herr_t H5Tset_ebias(hid_t type_id, size_t ebias);
+H5_DLL herr_t H5Tset_norm(hid_t type_id, H5T_norm_t norm);
+H5_DLL herr_t H5Tset_inpad(hid_t type_id, H5T_pad_t pad);
+H5_DLL herr_t H5Tset_cset(hid_t type_id, H5T_cset_t cset);
+H5_DLL herr_t H5Tset_strpad(hid_t type_id, H5T_str_t strpad);
+
+/* Type conversion database */
+H5_DLL herr_t H5Tregister(H5T_pers_t pers, const char *name, hid_t src_id,
+			   hid_t dst_id, H5T_conv_t func);
+H5_DLL herr_t H5Tunregister(H5T_pers_t pers, const char *name, hid_t src_id,
+			     hid_t dst_id, H5T_conv_t func);
+H5_DLL H5T_conv_t H5Tfind(hid_t src_id, hid_t dst_id, H5T_cdata_t **pcdata);
+H5_DLL htri_t H5Tcompiler_conv(hid_t src_id, hid_t dst_id);
+H5_DLL herr_t H5Tconvert(hid_t src_id, hid_t dst_id, size_t nelmts,
+			  void *buf, void *background, hid_t plist_id);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+
+
+/* Typedefs */
+
+
+/* Function prototypes */
+H5_DLL herr_t H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id);
+H5_DLL hid_t H5Topen1(hid_t loc_id, const char *name);
+H5_DLL hid_t H5Tarray_create1(hid_t base_id, int ndims,
+            const hsize_t dim[/* ndims */],
+            const int perm[/* ndims */]);
+H5_DLL int H5Tget_array_dims1(hid_t type_id, hsize_t dims[], int perm[]);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5Tpublic_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tstrpad.c b/gatb-core/thirdparty/hdf5/src/H5Tstrpad.c
new file mode 100644
index 0000000..e8ac4f5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tstrpad.c
@@ -0,0 +1,163 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for setting & querying
+ *      the datatype string padding for the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_strpad_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_strpad_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_strpad_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_strpad_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_strpad_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tget_strpad
+ *
+ * Purpose:	The method used to store character strings differs with the
+ *		programming language: C usually null terminates strings while
+ *		Fortran left-justifies and space-pads strings.	This property
+ *		defines the storage mechanism for the string.
+ *
+ * Return:	Success:	The character set of a string type.
+ *
+ *		Failure:	H5T_STR_ERROR (Negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_str_t
+H5Tget_strpad(hid_t type_id)
+{
+    H5T_t	*dt = NULL;
+    H5T_str_t	ret_value;
+
+    FUNC_ENTER_API(H5T_STR_ERROR)
+    H5TRACE1("Tz", "i", type_id);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, "not a datatype")
+    while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
+        dt = dt->shared->parent;  /*defer to parent*/
+    if (!H5T_IS_STRING(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, H5T_STR_ERROR, "operation not defined for datatype class")
+
+    /* result */
+    if(H5T_IS_FIXED_STRING(dt->shared))
+        ret_value = dt->shared->u.atomic.u.s.pad;
+    else
+        ret_value = dt->shared->u.vlen.pad;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tset_strpad
+ *
+ * Purpose:	The method used to store character strings differs with the
+ *		programming language: C usually null terminates strings while
+ *		Fortran left-justifies and space-pads strings.	This property
+ *		defines the storage mechanism for the string.
+ *
+ *		When converting from a long string to a short string if the
+ *		short string is H5T_STR_NULLPAD or H5T_STR_SPACEPAD then the
+ *		string is simply truncated; otherwise if the short string is
+ *		H5T_STR_NULLTERM it will be truncated and a null terminator
+ *		is appended.
+ *
+ *		When converting from a short string to a long string, the
+ *		long string is padded on the end by appending nulls or
+ *		spaces.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, January	 9, 1998
+ *
+ * Modifications:
+ * 	Robb Matzke, 22 Dec 1998
+ *	Also works for derived datatypes.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tset_strpad(hid_t type_id, H5T_str_t strpad)
+{
+    H5T_t	*dt = NULL;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iTz", type_id, strpad);
+
+    /* Check args */
+    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (H5T_STATE_TRANSIENT!=dt->shared->state)
+	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
+    if (strpad < H5T_STR_NULLTERM || strpad >= H5T_NSTR)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type")
+    while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
+        dt = dt->shared->parent;  /*defer to parent*/
+    if (!H5T_IS_STRING(dt->shared))
+	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
+
+    /* Commit */
+    if(H5T_IS_FIXED_STRING(dt->shared))
+        dt->shared->u.atomic.u.s.pad = strpad;
+    else
+        dt->shared->u.vlen.pad = strpad;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tvisit.c b/gatb-core/thirdparty/hdf5/src/H5Tvisit.c
new file mode 100644
index 0000000..68cabda
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tvisit.c
@@ -0,0 +1,155 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains most of the "core" functionality of
+ *      the H5T interface, including the API initialization code, etc.
+ *      Many routines that are infrequently used, or are specialized for
+ *      one particular datatype class are in another module.
+ */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Tvisit.c
+ *			Jul 19 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Visit all the components of a datatype
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Tpkg.h"		/* Datatypes         			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5T__visit
+ *
+ * Purpose:     Visit a datatype and all it's members and/or parents, making
+ *              a callback for each.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, July 19, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__visit(H5T_t *dt, unsigned visit_flags, H5T_operator_t op, void *op_value)
+{
+    hbool_t is_complex;                 /* Flag indicating current datatype is "complex" */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dt);
+    HDassert(op);
+
+    /* Check for complex datatype */
+    is_complex  = H5T_IS_COMPLEX(dt->shared->type);
+
+    /* If the callback is to be made on the datatype first, do that */
+    if(is_complex && (visit_flags & H5T_VISIT_COMPLEX_FIRST))
+        if(op(dt, op_value) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "operator callback failed")
+
+    /* Make callback for each member/child, if requested */
+    switch(dt->shared->type) {
+        case H5T_COMPOUND:
+            {
+                unsigned u;             /* Local index variable */
+
+                /* Visit each member of the compound datatype */
+                for(u = 0; u < dt->shared->u.compnd.nmembs; u++)
+                    if(H5T__visit(dt->shared->u.compnd.memb[u].type, visit_flags, op, op_value) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "can't visit member datatype")
+            } /* end case */
+            break;
+
+        case H5T_ARRAY:
+        case H5T_VLEN:
+        case H5T_ENUM:
+            /* Visit parent type */
+            if(H5T__visit(dt->shared->parent, visit_flags, op, op_value) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "can't visit parent datatype")
+            break;
+
+        default:
+            /* Visit "simple" datatypes here */
+            if(visit_flags & H5T_VISIT_SIMPLE)
+                if(op(dt, op_value) < 0)
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "operator callback failed")
+            break;
+    } /* end switch */
+
+    /* If the callback is to be made on the datatype last, do that */
+    if(is_complex && (visit_flags & H5T_VISIT_COMPLEX_LAST))
+        if(op(dt, op_value) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "operator callback failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__visit() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Tvlen.c b/gatb-core/thirdparty/hdf5/src/H5Tvlen.c
new file mode 100644
index 0000000..4ee3d0d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Tvlen.c
@@ -0,0 +1,1279 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Module Info: This module contains the functionality for variable-length
+ *      datatypes in the H5T interface.
+ */
+
+#define H5T_PACKAGE		/*suppress error about including H5Tpkg	     */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5T_init_vlen_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5HGprivate.h"	/* Global Heaps				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"		/* Property lists			*/
+#include "H5Tpkg.h"		/* Datatypes				*/
+
+/* Local functions */
+static herr_t H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, void *free_info);
+static ssize_t H5T_vlen_seq_mem_getlen(const void *_vl);
+static void * H5T_vlen_seq_mem_getptr(void *_vl);
+static htri_t H5T_vlen_seq_mem_isnull(const H5F_t *f, void *_vl);
+static herr_t H5T_vlen_seq_mem_read(H5F_t *f, hid_t dxpl_id, void *_vl, void *_buf, size_t len);
+static herr_t H5T_vlen_seq_mem_write(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *_buf, void *_bg, size_t seq_len, size_t base_size);
+static herr_t H5T_vlen_seq_mem_setnull(H5F_t *f, hid_t dxpl_id, void *_vl, void *_bg);
+static ssize_t H5T_vlen_str_mem_getlen(const void *_vl);
+static void * H5T_vlen_str_mem_getptr(void *_vl);
+static htri_t H5T_vlen_str_mem_isnull(const H5F_t *f, void *_vl);
+static herr_t H5T_vlen_str_mem_read(H5F_t *f, hid_t dxpl_id, void *_vl, void *_buf, size_t len);
+static herr_t H5T_vlen_str_mem_write(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *_buf, void *_bg, size_t seq_len, size_t base_size);
+static herr_t H5T_vlen_str_mem_setnull(H5F_t *f, hid_t dxpl_id, void *_vl, void *_bg);
+static ssize_t H5T_vlen_disk_getlen(const void *_vl);
+static void * H5T_vlen_disk_getptr(void *_vl);
+static htri_t H5T_vlen_disk_isnull(const H5F_t *f, void *_vl);
+static herr_t H5T_vlen_disk_read(H5F_t *f, hid_t dxpl_id, void *_vl, void *_buf, size_t len);
+static herr_t H5T_vlen_disk_write(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *_buf, void *_bg, size_t seq_len, size_t base_size);
+static herr_t H5T_vlen_disk_setnull(H5F_t *f, hid_t dxpl_id, void *_vl, void *_bg);
+
+/* Local variables */
+
+/* Default settings for variable-length allocation routines */
+static H5T_vlen_alloc_info_t H5T_vlen_def_vl_alloc_info ={
+    H5D_VLEN_ALLOC,
+    H5D_VLEN_ALLOC_INFO,
+    H5D_VLEN_FREE,
+    H5D_VLEN_FREE_INFO
+};
+
+

+/*--------------------------------------------------------------------------
+NAME
+   H5T_init_vlen_interface -- Initialize interface-specific information
+USAGE
+    herr_t H5T_init_vlen_interface()
+
+RETURNS
+    Non-negative on success/Negative on failure
+DESCRIPTION
+    Initializes any interface-specific data or routines.  (Just calls
+    H5T_init_iterface currently).
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_init_vlen_interface(void)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    FUNC_LEAVE_NOAPI(H5T_init())
+} /* H5T_init_vlen_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Tvlen_create
+ *
+ * Purpose:	Create a new variable-length datatype based on the specified
+ *		BASE_TYPE.
+ *
+ * Return:	Success:	ID of new VL datatype
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 20, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Tvlen_create(hid_t base_id)
+{
+    H5T_t	*base = NULL;		/*base datatype	*/
+    H5T_t	*dt = NULL;		/*new datatype	*/
+    hid_t	ret_value;	        /*return value			*/
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "i", base_id);
+
+    /* Check args */
+    if(NULL == (base = H5I_object_verify(base_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
+
+    /* Create up VL datatype */
+    if((dt = H5T__vlen_create(base)) == NULL)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid VL location")
+
+    /* Atomize the type */
+    if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Tvlen_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T__vlen_create
+ *
+ * Purpose:	Create a new variable-length datatype based on the specified
+ *		BASE_TYPE.
+ *
+ * Return:	Success:	new VL datatype
+ *
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 20, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+H5T_t *
+H5T__vlen_create(const H5T_t *base)
+{
+    H5T_t	*dt = NULL;		/*new VL datatype	*/
+    H5T_t	*ret_value;	/*return value			*/
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(base);
+
+    /* Build new type */
+    if(NULL == (dt = H5T__alloc()))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, NULL, "memory allocation failed")
+    dt->shared->type = H5T_VLEN;
+
+    /*
+     * Force conversions (i.e. memory to memory conversions should duplicate
+     * data, not point to the same VL sequences)
+     */
+    dt->shared->force_conv = TRUE;
+    if(NULL == (dt->shared->parent = H5T_copy(base, H5T_COPY_ALL)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy base datatype")
+
+    /* Inherit encoding version from base type */
+    dt->shared->version = base->shared->version;
+
+    /* This is a sequence, not a string */
+    dt->shared->u.vlen.type = H5T_VLEN_SEQUENCE;
+
+    /* Set up VL information */
+    if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
+
+    /* Set return value */
+    ret_value = dt;
+
+done:
+    if(!ret_value)
+        if(dt && H5T_close(dt) < 0)
+            HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, NULL, "unable to release datatype info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__vlen_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5T__vlen_set_loc
+ *
+ * Purpose:	Sets the location of a VL datatype to be either on disk or in memory
+ *
+ * Return:
+ *  One of two values on success:
+ *      TRUE - If the location of any vlen types changed
+ *      FALSE - If the location of any vlen types is the same
+ *  <0 is returned on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, June 4, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T__vlen_set_loc(const H5T_t *dt, H5F_t *f, H5T_loc_t loc)
+{
+    htri_t ret_value = FALSE;   /* Indicate success, but no location change */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check parameters */
+    HDassert(dt);
+    HDassert(loc >= H5T_LOC_BADLOC && loc < H5T_LOC_MAXLOC);
+
+    /* Only change the location if it's different */
+    if(loc != dt->shared->u.vlen.loc || f != dt->shared->u.vlen.f) {
+        switch(loc) {
+            case H5T_LOC_MEMORY:   /* Memory based VL datatype */
+                HDassert(NULL == f);
+
+                /* Mark this type as being stored in memory */
+                dt->shared->u.vlen.loc = H5T_LOC_MEMORY;
+
+                if(dt->shared->u.vlen.type == H5T_VLEN_SEQUENCE) {
+                    /* size in memory, disk size is different */
+                    dt->shared->size = sizeof(hvl_t);
+
+                    /* Set up the function pointers to access the VL sequence in memory */
+                    dt->shared->u.vlen.getlen = H5T_vlen_seq_mem_getlen;
+                    dt->shared->u.vlen.getptr = H5T_vlen_seq_mem_getptr;
+                    dt->shared->u.vlen.isnull = H5T_vlen_seq_mem_isnull;
+                    dt->shared->u.vlen.read = H5T_vlen_seq_mem_read;
+                    dt->shared->u.vlen.write = H5T_vlen_seq_mem_write;
+                    dt->shared->u.vlen.setnull = H5T_vlen_seq_mem_setnull;
+                } else if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
+                    /* size in memory, disk size is different */
+                    dt->shared->size = sizeof(char *);
+
+                    /* Set up the function pointers to access the VL string in memory */
+                    dt->shared->u.vlen.getlen = H5T_vlen_str_mem_getlen;
+                    dt->shared->u.vlen.getptr = H5T_vlen_str_mem_getptr;
+                    dt->shared->u.vlen.isnull = H5T_vlen_str_mem_isnull;
+                    dt->shared->u.vlen.read = H5T_vlen_str_mem_read;
+                    dt->shared->u.vlen.write = H5T_vlen_str_mem_write;
+                    dt->shared->u.vlen.setnull = H5T_vlen_str_mem_setnull;
+                } else {
+                    HDassert(0 && "Invalid VL type");
+                }
+
+                /* Reset file ID (since this VL is in memory) */
+                dt->shared->u.vlen.f = NULL;
+                break;
+
+            case H5T_LOC_DISK:   /* Disk based VL datatype */
+                HDassert(f);
+
+                /* Mark this type as being stored on disk */
+                dt->shared->u.vlen.loc = H5T_LOC_DISK;
+
+                /*
+                 * Size of element on disk is 4 bytes for the length, plus the size
+                 * of an address in this file, plus 4 bytes for the size of a heap
+                 * ID.  Memory size is different
+                 */
+                dt->shared->size = 4 + H5F_SIZEOF_ADDR(f) + 4;
+
+                /* Set up the function pointers to access the VL information on disk */
+                /* VL sequences and VL strings are stored identically on disk, so use the same functions */
+                dt->shared->u.vlen.getlen = H5T_vlen_disk_getlen;
+                dt->shared->u.vlen.getptr = H5T_vlen_disk_getptr;
+                dt->shared->u.vlen.isnull = H5T_vlen_disk_isnull;
+                dt->shared->u.vlen.read = H5T_vlen_disk_read;
+                dt->shared->u.vlen.write = H5T_vlen_disk_write;
+                dt->shared->u.vlen.setnull = H5T_vlen_disk_setnull;
+
+                /* Set file ID (since this VL is on disk) */
+                dt->shared->u.vlen.f = f;
+                break;
+
+            case H5T_LOC_BADLOC:
+                /* Allow undefined location. In H5Odtype.c, H5O_dtype_decode sets undefined
+                 * location for VL type and leaves it for the caller to decide.
+                 */
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADRANGE, FAIL, "invalid VL datatype location")
+        } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+        /* Indicate that the location changed */
+        ret_value = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T__vlen_set_loc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_getlen
+ *
+ * Purpose:	Retrieves the length of a memory based VL element.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5T_vlen_seq_mem_getlen(const void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    const hvl_t *vl=(const hvl_t *)_vl;   /* Pointer to the user's hvl_t information */
+#else
+    hvl_t vl;             /* User's hvl_t information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters, return result */
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(vl);
+
+    FUNC_LEAVE_NOAPI((ssize_t)vl->len)
+#else
+    HDassert(_vl);
+    HDmemcpy(&vl, _vl, sizeof(hvl_t));
+
+    FUNC_LEAVE_NOAPI((ssize_t)vl.len)
+#endif
+}   /* end H5T_vlen_seq_mem_getlen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_getptr
+ *
+ * Purpose:	Retrieves the pointer for a memory based VL element.
+ *
+ * Return:	Non-NULL on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, June 12, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5T_vlen_seq_mem_getptr(void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    const hvl_t *vl=(const hvl_t *)_vl;   /* Pointer to the user's hvl_t information */
+#else
+    hvl_t vl;             /* User's hvl_t information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters, return result */
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(vl);
+
+    FUNC_LEAVE_NOAPI(vl->p)
+#else
+    HDassert(_vl);
+    HDmemcpy(&vl, _vl, sizeof(hvl_t));
+
+    FUNC_LEAVE_NOAPI(vl.p)
+#endif
+}   /* end H5T_vlen_seq_mem_getptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_isnull
+ *
+ * Purpose:	Checks if a memory sequence is the "null" sequence
+ *
+ * Return:	TRUE/FALSE on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static htri_t
+H5T_vlen_seq_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    const hvl_t *vl=(const hvl_t *)_vl;   /* Pointer to the user's hvl_t information */
+#else
+    hvl_t vl;             /* User's hvl_t information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters, return result */
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(vl);
+
+    FUNC_LEAVE_NOAPI((vl->len==0 || vl->p==NULL) ? TRUE : FALSE)
+#else
+    HDassert(_vl);
+    HDmemcpy(&vl, _vl, sizeof(hvl_t));
+
+    FUNC_LEAVE_NOAPI((vl.len==0 || vl.p==NULL) ? TRUE : FALSE)
+#endif
+}   /* end H5T_vlen_seq_mem_isnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_read
+ *
+ * Purpose:	"Reads" the memory based VL sequence into a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_seq_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void *buf, size_t len)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    const hvl_t *vl=(const hvl_t *)_vl;   /* Pointer to the user's hvl_t information */
+#else
+    hvl_t vl;             /* User's hvl_t information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters, copy data */
+    HDassert(buf);
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(vl && vl->p);
+
+    HDmemcpy(buf,vl->p,len);
+#else
+    HDassert(_vl);
+    HDmemcpy(&vl, _vl, sizeof(hvl_t));
+    HDassert(vl.p);
+
+    HDmemcpy(buf,vl.p,len);
+#endif
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5T_vlen_seq_mem_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_write
+ *
+ * Purpose:	"Writes" the memory based VL sequence from a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_seq_mem_write(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *buf, void H5_ATTR_UNUSED *_bg, size_t seq_len, size_t base_size)
+{
+    hvl_t vl;                       /* Temporary hvl_t to use during operation */
+    size_t len;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check parameters */
+    HDassert(_vl);
+    HDassert(buf);
+
+    if(seq_len!=0) {
+        len=seq_len*base_size;
+
+        /* Use the user's memory allocation routine is one is defined */
+        if(vl_alloc_info->alloc_func!=NULL) {
+            if(NULL==(vl.p=(vl_alloc_info->alloc_func)(len,vl_alloc_info->alloc_info)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
+          } /* end if */
+        else {  /* Default to system malloc */
+            if(NULL==(vl.p=H5MM_malloc(len)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
+          } /* end else */
+
+        /* Copy the data into the newly allocated buffer */
+        HDmemcpy(vl.p,buf,len);
+
+    } /* end if */
+    else
+        vl.p=NULL;
+
+    /* Set the sequence length */
+    vl.len=seq_len;
+
+    /* Set pointer in user's buffer with memcpy, to avoid alignment issues */
+    HDmemcpy(_vl,&vl,sizeof(hvl_t));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_seq_mem_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_seq_mem_setnull
+ *
+ * Purpose:	Sets a VL info object in memory to the "nil" value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_seq_mem_setnull(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void H5_ATTR_UNUSED *_bg)
+{
+    hvl_t vl;                       /* Temporary hvl_t to use during operation */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+    HDassert(_vl);
+
+    /* Set the "nil" hvl_t */
+    vl.len=0;
+    vl.p=NULL;
+
+    /* Set pointer in user's buffer with memcpy, to avoid alignment issues */
+    HDmemcpy(_vl,&vl,sizeof(hvl_t));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5T_vlen_seq_mem_setnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_getlen
+ *
+ * Purpose:	Retrieves the length of a memory based VL string.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5T_vlen_str_mem_getlen(const void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    const char *s=*(const char * const *)_vl;   /* Pointer to the user's string information */
+#else
+    const char *s;      /* Pointer to the user's string information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(s);
+#else
+    HDassert(_vl);
+    HDmemcpy(&s, _vl, sizeof(char *));
+#endif
+
+    FUNC_LEAVE_NOAPI((ssize_t)HDstrlen(s))
+}   /* end H5T_vlen_str_mem_getlen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_getptr
+ *
+ * Purpose:	Retrieves the pointer for a memory based VL string.
+ *
+ * Return:	Non-NULL on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, June 12, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5T_vlen_str_mem_getptr(void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    char *s=*(char **)_vl;   /* Pointer to the user's string information */
+#else
+    char *s;      /* Pointer to the user's string information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDassert(s);
+#else
+    HDassert(_vl);
+    HDmemcpy(&s, _vl, sizeof(char *));
+#endif
+
+    FUNC_LEAVE_NOAPI(s)
+}   /* end H5T_vlen_str_mem_getptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_isnull
+ *
+ * Purpose:	Checks if a memory string is a NULL pointer
+ *
+ * Return:	TRUE/FALSE on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static htri_t
+H5T_vlen_str_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    char *s=*(char **)_vl;   /* Pointer to the user's string information */
+#else
+    char *s;      /* Pointer to the user's string information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifndef H5_NO_ALIGNMENT_RESTRICTIONS
+    HDmemcpy(&s, _vl, sizeof(char *));
+#endif
+
+    FUNC_LEAVE_NOAPI(s==NULL ? TRUE : FALSE)
+}   /* end H5T_vlen_str_mem_isnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_read
+ *
+ * Purpose:	"Reads" the memory based VL string into a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_str_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void *buf, size_t len)
+{
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+    char *s=*(char **)_vl;   /* Pointer to the user's string information */
+#else
+    char *s;      /* Pointer to the user's string information */
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(len>0) {
+        /* check parameters */
+        HDassert(buf);
+#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
+        HDassert(s);
+#else
+        HDassert(_vl);
+        HDmemcpy(&s, _vl, sizeof(char *));
+#endif
+
+        HDmemcpy(buf,s,len);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* end H5T_vlen_str_mem_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_write
+ *
+ * Purpose:	"Writes" the memory based VL string from a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_str_mem_write(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *buf, void H5_ATTR_UNUSED *_bg, size_t seq_len, size_t base_size)
+{
+    char *t;                        /* Pointer to temporary buffer allocated */
+    size_t len;                     /* Maximum length of the string to copy */
+    herr_t      ret_value=SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check parameters */
+    HDassert(buf);
+
+    /* Use the user's memory allocation routine if one is defined */
+    if(vl_alloc_info->alloc_func!=NULL) {
+        if(NULL==(t=(vl_alloc_info->alloc_func)((seq_len+1)*base_size,vl_alloc_info->alloc_info)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
+      } /* end if */
+    else {  /* Default to system malloc */
+        if(NULL==(t=H5MM_malloc((seq_len+1)*base_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
+      } /* end else */
+
+    len=(seq_len*base_size);
+    HDmemcpy(t,buf,len);
+    t[len]='\0';
+
+    /* Set pointer in user's buffer with memcpy, to avoid alignment issues */
+    HDmemcpy(_vl,&t,sizeof(char *));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value) /*lint !e429 The pointer in 't' has been copied */
+}   /* end H5T_vlen_str_mem_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_str_mem_setnull
+ *
+ * Purpose:	Sets a VL info object in memory to the "null" value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_str_mem_setnull(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void H5_ATTR_UNUSED *_bg)
+{
+    char *t=NULL;                   /* Pointer to temporary buffer allocated */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set pointer in user's buffer with memcpy, to avoid alignment issues */
+    HDmemcpy(_vl,&t,sizeof(char *));
+
+    FUNC_LEAVE_NOAPI(SUCCEED) /*lint !e429 The pointer in 't' has been copied */
+}   /* end H5T_vlen_str_mem_setnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_getlen
+ *
+ * Purpose:	Retrieves the length of a disk based VL element.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+static ssize_t
+H5T_vlen_disk_getlen(const void *_vl)
+{
+    const uint8_t *vl=(const uint8_t *)_vl; /* Pointer to the disk VL information */
+    size_t	seq_len;        /* Sequence length */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+    HDassert(vl);
+
+    UINT32DECODE(vl, seq_len);
+
+    FUNC_LEAVE_NOAPI((ssize_t)seq_len)
+}   /* end H5T_vlen_disk_getlen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_getptr
+ *
+ * Purpose:	Retrieves the pointer to a disk based VL element.
+ *
+ * Return:	Non-NULL on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, June 12, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static void *
+H5T_vlen_disk_getptr(void H5_ATTR_UNUSED *vl)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+    HDassert(vl);
+
+    FUNC_LEAVE_NOAPI(NULL)
+}   /* end H5T_vlen_disk_getptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_isnull
+ *
+ * Purpose:	Checks if a disk VL info object is the "nil" object
+ *
+ * Return:	TRUE/FALSE on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5T_vlen_disk_isnull(const H5F_t *f, void *_vl)
+{
+    uint8_t *vl=(uint8_t *)_vl; /* Pointer to the disk VL information */
+    haddr_t addr;               /* Sequence's heap address */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check parameters */
+    HDassert(vl);
+
+    /* Skip the sequence's length */
+    vl+=4;
+
+    /* Get the heap address */
+    H5F_addr_decode(f,(const uint8_t **)&vl,&addr);
+
+    FUNC_LEAVE_NOAPI(addr==0 ? TRUE : FALSE)
+}   /* end H5T_vlen_disk_isnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_read
+ *
+ * Purpose:	Reads the disk based VL element into a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_disk_read(H5F_t *f, hid_t dxpl_id, void *_vl, void *buf, size_t H5_ATTR_UNUSED len)
+{
+    uint8_t *vl=(uint8_t *)_vl;   /* Pointer to the user's hvl_t information */
+    H5HG_t hobjid;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check parameters */
+    HDassert(vl);
+    HDassert(buf);
+    HDassert(f);
+
+    /* Skip the length of the sequence */
+    vl += 4;
+
+    /* Get the heap information */
+    H5F_addr_decode(f,(const uint8_t **)&vl,&(hobjid.addr));
+    UINT32DECODE(vl,hobjid.idx);
+
+    /* Check if this sequence actually has any data */
+    if(hobjid.addr>0) {
+        /* Read the VL information from disk */
+        if(H5HG_read(f,dxpl_id,&hobjid,buf, NULL)==NULL)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_READERROR, FAIL, "Unable to read VL information")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_disk_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_write
+ *
+ * Purpose:	Writes the disk based VL element from a buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, June 2, 1999
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5T_vlen_disk_write(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t H5_ATTR_UNUSED *vl_alloc_info,
+    void *_vl, void *buf, void *_bg, size_t seq_len, size_t base_size)
+{
+    uint8_t *vl = (uint8_t *)_vl; /*Pointer to the user's hvl_t information*/
+    uint8_t *bg = (uint8_t *)_bg; /*Pointer to the old data hvl_t          */
+    H5HG_t hobjid;              /* New VL sequence's heap ID */
+    size_t len;                 /* Size of new sequence on disk (in bytes) */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check parameters */
+    HDassert(vl);
+    HDassert(seq_len == 0 || buf);
+    HDassert(f);
+
+    /* Free heap object for old data.  */
+    if(bg!=NULL) {
+        H5HG_t bg_hobjid;       /* "Background" VL info sequence's ID info */
+
+        /* Skip the length of the sequence and heap object ID from background data. */
+        bg += 4;
+
+        /* Get heap information */
+        H5F_addr_decode(f, (const uint8_t **)&bg, &(bg_hobjid.addr));
+        UINT32DECODE(bg, bg_hobjid.idx);
+
+        /* Free heap object for old data */
+        if(bg_hobjid.addr > 0) {
+            /* Free heap object */
+            if(H5HG_remove(f, dxpl_id, &bg_hobjid) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "Unable to remove heap object")
+        } /* end if */
+    } /* end if */
+
+    /* Set the length of the sequence */
+    UINT32ENCODE(vl, seq_len);
+
+    /* Write the VL information to disk (allocates space also) */
+    len = (seq_len*base_size);
+    if(H5HG_insert(f, dxpl_id, len, buf, &hobjid) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "Unable to write VL information")
+
+    /* Encode the heap information */
+    H5F_addr_encode(f, &vl, hobjid.addr);
+    UINT32ENCODE(vl, hobjid.idx);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_disk_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_disk_setnull
+ *
+ * Purpose:	Sets a VL info object on disk to the "nil" value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Saturday, November 8, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5T_vlen_disk_setnull(H5F_t *f, hid_t dxpl_id, void *_vl, void *_bg)
+{
+    uint8_t *vl = (uint8_t *)_vl; /*Pointer to the user's hvl_t information*/
+    uint8_t *bg = (uint8_t *)_bg; /*Pointer to the old data hvl_t          */
+    uint32_t seq_len = 0;         /* Sequence length */
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check parameters */
+    HDassert(f);
+    HDassert(vl);
+
+    /* Free heap object for old data.  */
+    if(bg != NULL) {
+        H5HG_t bg_hobjid;       /* "Background" VL info sequence's ID info */
+
+        /* Skip the length of the sequence and heap object ID from background data. */
+        bg += 4;
+
+        /* Get heap information */
+        H5F_addr_decode(f, (const uint8_t **)&bg, &(bg_hobjid.addr));
+        UINT32DECODE(bg, bg_hobjid.idx);
+
+        /* Free heap object for old data */
+        if(bg_hobjid.addr > 0) {
+            /* Free heap object */
+            if(H5HG_remove(f, dxpl_id, &bg_hobjid) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "Unable to remove heap object")
+         } /* end if */
+    } /* end if */
+
+    /* Set the length of the sequence */
+    UINT32ENCODE(vl, seq_len);
+
+    /* Encode the "nil" heap pointer information */
+    H5F_addr_encode(f, &vl, (haddr_t)0);
+    UINT32ENCODE(vl, 0);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_disk_setnull() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5T_vlen_reclaim_recurse
+ PURPOSE
+    Internal recursive routine to free VL datatypes
+ USAGE
+    herr_t H5T_vlen_reclaim(elem,dt)
+        void *elem;  IN/OUT: Pointer to the dataset element
+        H5T_t *dt;   IN: Datatype of dataset element
+
+ RETURNS
+    SUCCEED/FAIL
+ DESCRIPTION
+    Frees any dynamic memory used by VL datatypes in the current dataset
+    element.  Performs a recursive depth-first traversal of all compound
+    datatypes to free all VL datatype information allocated by any field.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, void *free_info)
+{
+    unsigned u;                     /* Local index variable */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(elem);
+    HDassert(dt);
+
+    /* Check the datatype of this element */
+    switch(dt->shared->type) {
+        case H5T_ARRAY:
+            /* Recurse on each element, if the array's base type is array, VL, enum or compound */
+            if(H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
+                void *off;     /* offset of field */
+
+                /* Calculate the offset member and recurse on it */
+                for(u = 0; u < dt->shared->u.array.nelem; u++) {
+                    off = ((uint8_t *)elem) + u * (dt->shared->parent->shared->size);
+                    if(H5T_vlen_reclaim_recurse(off, dt->shared->parent, free_func, free_info) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free array element")
+                } /* end for */
+            } /* end if */
+            break;
+
+        case H5T_COMPOUND:
+            /* Check each field and recurse on VL, compound, enum or array ones */
+            for(u = 0; u < dt->shared->u.compnd.nmembs; u++) {
+                /* Recurse if it's VL, compound, enum or array */
+                if(H5T_IS_COMPLEX(dt->shared->u.compnd.memb[u].type->shared->type)) {
+                    void *off;     /* offset of field */
+
+                    /* Calculate the offset member and recurse on it */
+                    off = ((uint8_t *)elem) + dt->shared->u.compnd.memb[u].offset;
+                    if(H5T_vlen_reclaim_recurse(off, dt->shared->u.compnd.memb[u].type, free_func, free_info) < 0)
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free compound field")
+                } /* end if */
+            } /* end for */
+            break;
+
+        case H5T_VLEN:
+            /* Recurse on the VL information if it's VL, compound, enum or array, then free VL sequence */
+            if(dt->shared->u.vlen.type == H5T_VLEN_SEQUENCE) {
+                hvl_t *vl = (hvl_t *)elem;    /* Temp. ptr to the vl info */
+
+                /* Check if there is anything actually in this sequence */
+                if(vl->len!=0) {
+                    /* Recurse if it's VL, array, enum or compound */
+                    if(H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
+                        void *off;     /* offset of field */
+
+                        /* Calculate the offset of each array element and recurse on it */
+                        while(vl->len > 0) {
+                            off = ((uint8_t *)vl->p) + (vl->len - 1) * dt->shared->parent->shared->size;
+                            if(H5T_vlen_reclaim_recurse(off, dt->shared->parent, free_func, free_info) < 0)
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free VL element")
+                            vl->len--;
+                        } /* end while */
+                    } /* end if */
+
+                    /* Free the VL sequence */
+                    if(free_func != NULL)
+                        (*free_func)(vl->p, free_info);
+                    else
+                        H5MM_xfree(vl->p);
+                } /* end if */
+            } else if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
+                /* Free the VL string */
+                if(free_func != NULL)
+                    (*free_func)(*(char **)elem, free_info);
+                else
+                    H5MM_xfree(*(char **)elem);
+            } else {
+                HDassert(0 && "Invalid VL type");
+            } /* end else */
+            break;
+
+        default:
+            break;
+    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_reclaim_recurse() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5T_vlen_reclaim
+ PURPOSE
+    Default method to reclaim any VL data for a buffer element
+ USAGE
+    herr_t H5T_vlen_reclaim(elem,type_id,ndim,point,op_data)
+        void *elem;  IN/OUT: Pointer to the dataset element
+        hid_t type_id;   IN: Datatype of dataset element
+        unsigned ndim;    IN: Number of dimensions in dataspace
+        hsize_t *point; IN: Coordinate location of element in dataspace
+        void *op_data    IN: Operator data
+
+ RETURNS
+    SUCCEED/FAIL
+ DESCRIPTION
+    Frees any dynamic memory used by VL datatypes in the current dataset
+    element.  Recursively descends compound datatypes to free all VL datatype
+    information allocated by any field.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+/* ARGSUSED */
+herr_t
+H5T_vlen_reclaim(void *elem, hid_t type_id, unsigned H5_ATTR_UNUSED ndim, const hsize_t H5_ATTR_UNUSED *point, void *op_data)
+{
+    H5T_vlen_alloc_info_t *vl_alloc_info = (H5T_vlen_alloc_info_t *)op_data; /* VL allocation info from iterator */
+    H5T_t	*dt;
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(elem);
+    HDassert(vl_alloc_info);
+    HDassert(H5I_DATATYPE == H5I_get_type(type_id));
+
+    /* Check args */
+    if(NULL == (dt = H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Pull the free function and free info pointer out of the op_data and call the recurse datatype free function */
+    if(H5T_vlen_reclaim_recurse(elem, dt, vl_alloc_info->free_func, vl_alloc_info->free_info) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "can't reclaim vlen elements")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_reclaim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5T_vlen_get_alloc_info
+ PURPOSE
+    Retrieve allocation info for VL datatypes
+ USAGE
+    herr_t H5T_vlen_get_alloc_info(dxpl_id,vl_alloc_info)
+        hid_t dxpl_id;   IN: Data transfer property list to query
+        H5T_vlen_alloc_info_t *vl_alloc_info;  IN/OUT: Pointer to VL allocation information to fill
+
+ RETURNS
+    SUCCEED/FAIL
+ DESCRIPTION
+    Retrieve the VL allocation functions and information from a dataset
+    transfer property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    The VL_ALLOC_INFO pointer should point at already allocated memory to place
+    non-default property list info.  If a default property list is used, the
+    VL_ALLOC_INFO pointer will be changed to point at the default information.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5T_vlen_get_alloc_info(hid_t dxpl_id, H5T_vlen_alloc_info_t **vl_alloc_info)
+{
+    H5P_genplist_t *plist;              /* DX property list */
+    herr_t ret_value=SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
+    HDassert(vl_alloc_info);
+
+    /* Check for the default DXPL */
+    if(dxpl_id==H5P_DATASET_XFER_DEFAULT)
+        *vl_alloc_info=&H5T_vlen_def_vl_alloc_info;
+    else {
+        /* Check args */
+        if(NULL == (plist = H5P_object_verify(dxpl_id,H5P_DATASET_XFER)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+
+        /* Get the allocation functions & information */
+        if (H5P_get(plist,H5D_XFER_VLEN_ALLOC_NAME,&(*vl_alloc_info)->alloc_func) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+        if (H5P_get(plist,H5D_XFER_VLEN_ALLOC_INFO_NAME,&(*vl_alloc_info)->alloc_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+        if (H5P_get(plist,H5D_XFER_VLEN_FREE_NAME,&(*vl_alloc_info)->free_func) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+        if (H5P_get(plist,H5D_XFER_VLEN_FREE_INFO_NAME,&(*vl_alloc_info)->free_info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_vlen_get_alloc_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_vlen_reclaim_elmt
+ *
+ * Purpose: Alternative method to reclaim any VL data for a buffer element.
+ * 
+ *          Use this function when the datatype is already available, but 
+ *          the allocation info is needed from the dxpl_id before jumping
+ *          into recursion.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mike McGreevy
+ *              May 11, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_vlen_reclaim_elmt(void *elem, H5T_t *dt, hid_t dxpl_id)
+{
+    H5T_vlen_alloc_info_t _vl_alloc_info;       /* VL allocation info buffer */
+    H5T_vlen_alloc_info_t *vl_alloc_info = &_vl_alloc_info;   /* VL allocation info */
+    herr_t ret_value = SUCCEED;                  /* return value */
+
+    HDassert(dt);
+    HDassert(elem);
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get VL allocation info */
+    if(H5T_vlen_get_alloc_info(dxpl_id, &vl_alloc_info) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to retrieve VL allocation info")
+
+    /* Recurse on buffer to free dynamic fields */
+    if(H5T_vlen_reclaim_recurse(elem, dt, vl_alloc_info->free_func, vl_alloc_info->free_info) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "can't reclaim vlen elements")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5T_vlen_reclaim_elmt */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5VM.c b/gatb-core/thirdparty/hdf5/src/H5VM.c
new file mode 100644
index 0000000..a1eafb6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5VM.c
@@ -0,0 +1,1712 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Robb Matzke <matzke at llnl.gov>
+ *	       Friday, October 10, 1997
+ */
+
+
+#include "H5private.h"
+#include "H5Eprivate.h"
+#include "H5Oprivate.h"
+#include "H5VMprivate.h"
+
+/* Local typedefs */
+typedef struct H5VM_memcpy_ud_t {
+    unsigned char *dst;         /* Pointer to destination buffer */
+    const unsigned char *src;   /* Pointer to source buffer */
+} H5VM_memcpy_ud_t;
+
+/* Local macros */
+#define H5VM_HYPER_NDIMS H5O_LAYOUT_NDIMS
+
+/* Local prototypes */
+static void
+H5VM_stride_optimize1(unsigned *np/*in,out*/, hsize_t *elmt_size/*in,out*/,
+		     const hsize_t *size, hsize_t *stride1);
+static void
+H5VM_stride_optimize2(unsigned *np/*in,out*/, hsize_t *elmt_size/*in,out*/,
+		     const hsize_t *size, hsize_t *stride1, hsize_t *stride2);
+#ifdef LATER
+static void
+H5VM_stride_copy2(hsize_t nelmts, hsize_t elmt_size,
+     unsigned dst_n, const hsize_t *dst_size, const ssize_t *dst_stride, void *_dst,
+     unsigned src_n, const hsize_t *src_size, const ssize_t *src_stride, const void *_src);
+#endif /* LATER */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_optimize1
+ *
+ * Purpose:	Given a stride vector which references elements of the
+ *		specified size, optimize the dimensionality, the stride
+ *		vector, and the element size to minimize the dimensionality
+ *		and the number of memory accesses.
+ *
+ *		All arguments are passed by reference and their values may be
+ *		modified by this function.
+ *
+ * Return:	None
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5VM_stride_optimize1(unsigned *np/*in,out*/, hsize_t *elmt_size/*in,out*/,
+		     const hsize_t *size, hsize_t *stride1)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * This has to be true because if we optimize the dimensionality down to
+     * zero we still must make one reference.
+     */
+    HDassert(1 == H5VM_vector_reduce_product(0, NULL));
+
+    /*
+     * Combine adjacent memory accesses
+     */
+    while (*np && stride1[*np-1]>0 &&
+           (hsize_t)(stride1[*np-1])==*elmt_size) {
+        *elmt_size *= size[*np-1];
+        if (--*np)
+            stride1[*np-1] += size[*np] * stride1[*np];
+    }
+
+    FUNC_LEAVE_NOAPI_VOID
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_optimize2
+ *
+ * Purpose:	Given two stride vectors which reference elements of the
+ *		specified size, optimize the dimensionality, the stride
+ *		vectors, and the element size to minimize the dimensionality
+ *		and the number of memory accesses.
+ *
+ *		All arguments are passed by reference and their values may be
+ *		modified by this function.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *              Unrolled loops for common cases
+ *              Quincey Koziol
+ *		?, ? ?, 2001?
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5VM_stride_optimize2(unsigned *np/*in,out*/, hsize_t *elmt_size/*in,out*/,
+		     const hsize_t *size, hsize_t *stride1, hsize_t *stride2)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * This has to be true because if we optimize the dimensionality down to
+     * zero we still must make one reference.
+     */
+    HDassert(1 == H5VM_vector_reduce_product(0, NULL));
+    HDassert(*elmt_size>0);
+
+    /*
+     * Combine adjacent memory accesses
+     */
+
+    /* Unroll loop for common cases */
+    switch(*np) {
+        case 1: /* For 0-D datasets (dunno if this ever gets used...) */
+            if(stride1[0] == *elmt_size && stride2[0] == *elmt_size) {
+                *elmt_size *= size[0];
+                --*np;  /* *np decrements to a value of 0 now */
+            } /* end if */
+            break;
+
+        case 2: /* For 1-D datasets */
+            if(stride1[1] == *elmt_size && stride2[1] == *elmt_size) {
+                *elmt_size *= size[1];
+                --*np;  /* *np decrements to a value of 1 now */
+                stride1[0] += size[1] * stride1[1];
+                stride2[0] += size[1] * stride2[1];
+
+                if(stride1[0] == *elmt_size && stride2[0] == *elmt_size) {
+                    *elmt_size *= size[0];
+                    --*np;  /* *np decrements to a value of 0 now */
+                } /* end if */
+            } /* end if */
+            break;
+
+        case 3: /* For 2-D datasets */
+            if(stride1[2] == *elmt_size && stride2[2] == *elmt_size) {
+                *elmt_size *= size[2];
+                --*np;  /* *np decrements to a value of 2 now */
+                stride1[1] += size[2] * stride1[2];
+                stride2[1] += size[2] * stride2[2];
+
+                if(stride1[1] == *elmt_size && stride2[1] == *elmt_size) {
+                    *elmt_size *= size[1];
+                    --*np;  /* *np decrements to a value of 1 now */
+                    stride1[0] += size[1] * stride1[1];
+                    stride2[0] += size[1] * stride2[1];
+
+                    if(stride1[0] == *elmt_size && stride2[0] == *elmt_size) {
+                        *elmt_size *= size[0];
+                        --*np;  /* *np decrements to a value of 0 now */
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+            break;
+
+        case 4: /* For 3-D datasets */
+            if(stride1[3] == *elmt_size && stride2[3] == *elmt_size) {
+                *elmt_size *= size[3];
+                --*np;  /* *np decrements to a value of 3 now */
+                stride1[2] += size[3] * stride1[3];
+                stride2[2] += size[3] * stride2[3];
+
+                if(stride1[2] == *elmt_size && stride2[2] == *elmt_size) {
+                    *elmt_size *= size[2];
+                    --*np;  /* *np decrements to a value of 2 now */
+                    stride1[1] += size[2] * stride1[2];
+                    stride2[1] += size[2] * stride2[2];
+
+                    if(stride1[1] == *elmt_size && stride2[1] == *elmt_size) {
+                        *elmt_size *= size[1];
+                        --*np;  /* *np decrements to a value of 1 now */
+                        stride1[0] += size[1] * stride1[1];
+                        stride2[0] += size[1] * stride2[1];
+
+                        if(stride1[0] == *elmt_size && stride2[0] == *elmt_size) {
+                            *elmt_size *= size[0];
+                            --*np;  /* *np decrements to a value of 0 now */
+                        } /* end if */
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+            break;
+
+        default:
+            while (*np &&
+                    stride1[*np-1] == *elmt_size &&
+                    stride2[*np-1] == *elmt_size) {
+                *elmt_size *= size[*np-1];
+                if (--*np) {
+                    stride1[*np-1] += size[*np] * stride1[*np];
+                    stride2[*np-1] += size[*np] * stride2[*np];
+                }
+            }
+            break;
+    } /* end switch */
+
+    FUNC_LEAVE_NOAPI_VOID
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_hyper_stride
+ *
+ * Purpose:	Given a description of a hyperslab, this function returns
+ *		(through STRIDE[]) the byte strides appropriate for accessing
+ *		all bytes of the hyperslab and the byte offset where the
+ *		striding will begin.  The SIZE can be passed to the various
+ *		stride functions.
+ *
+ *		The dimensionality of the whole array, the hyperslab, and the
+ *		returned stride array is N.  The whole array dimensions are
+ *		TOTAL_SIZE and the hyperslab is at offset OFFSET and has
+ *		dimensions SIZE.
+ *
+ *		The stride and starting point returned will cause the
+ *		hyperslab elements to be referenced in C order.
+ *
+ * Return:	Success:	Byte offset from beginning of array to start
+ *				of striding.
+ *
+ *		Failure:	abort() -- should never fail
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *              Unrolled loops for common cases
+ *              Quincey Koziol
+ *		?, ? ?, 2001?
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5VM_hyper_stride(unsigned n, const hsize_t *size,
+		 const hsize_t *total_size, const hsize_t *offset,
+		 hsize_t *stride/*out*/)
+{
+    hsize_t	    skip;	/*starting point byte offset		*/
+    hsize_t	    acc;	/*accumulator				*/
+    int		i;		/*counter				*/
+    hsize_t	    ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(size);
+    HDassert(total_size);
+    HDassert(stride);
+
+    /* init */
+    HDassert(n>0);
+    stride[n-1] = 1;
+    skip = offset ? offset[n-1] : 0;
+
+    switch(n) {
+        case 2: /* 1-D dataset */
+            HDassert(total_size[1]>=size[1]);
+            stride[0] = total_size[1]-size[1]; /*overflow checked*/
+            acc = total_size[1];
+            skip += acc * (offset ? offset[0] : 0);
+            break;
+
+        case 3: /* 2-D dataset */
+            HDassert(total_size[2]>=size[2]);
+            stride[1] = total_size[2]-size[2]; /*overflow checked*/
+            acc = total_size[2];
+            skip += acc * (offset ? (hsize_t)offset[1] : 0);
+
+            HDassert(total_size[1]>=size[1]);
+            stride[0] = acc * (total_size[1] - size[1]); /*overflow checked*/
+            acc *= total_size[1];
+            skip += acc * (offset ? (hsize_t)offset[0] : 0);
+            break;
+
+        case 4: /* 3-D dataset */
+            HDassert(total_size[3]>=size[3]);
+            stride[2] = total_size[3]-size[3]; /*overflow checked*/
+            acc = total_size[3];
+            skip += acc * (offset ? (hsize_t)offset[2] : 0);
+
+            HDassert(total_size[2]>=size[2]);
+            stride[1] = acc * (total_size[2] - size[2]); /*overflow checked*/
+            acc *= total_size[2];
+            skip += acc * (offset ? (hsize_t)offset[1] : 0);
+
+            HDassert(total_size[1]>=size[1]);
+            stride[0] = acc * (total_size[1] - size[1]); /*overflow checked*/
+            acc *= total_size[1];
+            skip += acc * (offset ? (hsize_t)offset[0] : 0);
+            break;
+
+        default:
+            /* others */
+            for (i=(int)(n-2), acc=1; i>=0; --i) {
+                HDassert(total_size[i+1]>=size[i+1]);
+                stride[i] = acc * (total_size[i+1] - size[i+1]); /*overflow checked*/
+                acc *= total_size[i+1];
+                skip += acc * (offset ? (hsize_t)offset[i] : 0);
+            }
+            break;
+    } /* end switch */
+
+    /* Set return value */
+    ret_value=skip;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_hyper_eq
+ *
+ * Purpose:	Determines whether two hyperslabs are equal.  This function
+ *		assumes that both hyperslabs are relative to the same array,
+ *		for if not, they could not possibly be equal.
+ *
+ * Return:	Success:	TRUE if the hyperslabs are equal (that is,
+ *				both refer to exactly the same elements of an
+ *				array)
+ *
+ *				FALSE otherwise.
+ *
+ *		Failure:	TRUE the rank is zero or if both hyperslabs
+ *				are of zero size.
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, October 17, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5VM_hyper_eq(unsigned n,
+	     const hsize_t *offset1, const hsize_t *size1,
+	     const hsize_t *offset2, const hsize_t *size2)
+{
+    hsize_t	nelmts1 = 1, nelmts2 = 1;
+    unsigned	i;
+    htri_t      ret_value=TRUE;         /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (n == 0) HGOTO_DONE(TRUE)
+
+    for (i=0; i<n; i++) {
+	if ((offset1 ? offset1[i] : 0) != (offset2 ? offset2[i] : 0))
+	    HGOTO_DONE(FALSE)
+	if ((size1 ? size1[i] : 0) != (size2 ? size2[i] : 0))
+	    HGOTO_DONE(FALSE)
+	if (0 == (nelmts1 *= (size1 ? size1[i] : 0)))
+            HGOTO_DONE(FALSE)
+	if (0 == (nelmts2 *= (size2 ? size2[i] : 0)))
+            HGOTO_DONE(FALSE)
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_hyper_disjointp
+ *
+ * Purpose:	Determines if two hyperslabs are disjoint.
+ *
+ * Return:	Success:	FALSE if they are not disjoint.
+ *				TRUE if they are disjoint.
+ *
+ *		Failure:	A hyperslab of zero size is disjoint from all
+ *				other hyperslabs.
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, October 16, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5VM_hyper_disjointp(unsigned n,
+    const hsize_t *offset1, const uint32_t *size1,
+    const hsize_t *offset2, const uint32_t *size2)
+{
+    unsigned	u;
+    htri_t      ret_value = FALSE;        /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(!n || !size1 || !size2)
+        HGOTO_DONE(TRUE)
+
+    for(u = 0; u < n; u++) {
+        HDassert(size1[u] < HSIZET_MAX);
+        HDassert(size2[u] < HSIZET_MAX);
+
+        if(0 == size1[u] || 0 == size2[u])
+            HGOTO_DONE(TRUE)
+        if(((offset1 ? offset1[u] : 0) < (offset2 ? offset2[u] : 0) &&
+                    ((offset1 ? offset1[u] : 0) + size1[u] <= (offset2 ? offset2[u] : 0))) ||
+                ((offset2 ? offset2[u] : 0) < (offset1 ? offset1[u] : 0) &&
+                    ((offset2 ? offset2[u] : 0) + size2[u] <= (offset1 ? offset1[u] : 0))))
+            HGOTO_DONE(TRUE)
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_hyper_disjointp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_hyper_fill
+ *
+ * Purpose:	Similar to memset() except it operates on hyperslabs...
+ *
+ *		Fills a hyperslab of array BUF with some value VAL.  BUF
+ *		is treated like a C-order array with N dimensions where the
+ *		size of each dimension is TOTAL_SIZE[].	 The hyperslab which
+ *		will be filled with VAL begins at byte offset OFFSET[] from
+ *		the minimum corner of BUF and continues for SIZE[] bytes in
+ *		each dimension.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, October 10, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_hyper_fill(unsigned n, const hsize_t *_size,
+	       const hsize_t *total_size, const hsize_t *offset, void *_dst,
+	       unsigned fill_value)
+{
+    uint8_t	*dst = (uint8_t*)_dst;	/*cast for ptr arithmetic	*/
+    hsize_t	size[H5VM_HYPER_NDIMS];	/*a modifiable copy of _size	*/
+    hsize_t	dst_stride[H5VM_HYPER_NDIMS]; /*destination stride info  */
+    hsize_t	dst_start;		/*byte offset to start of stride*/
+    hsize_t	elmt_size = 1;		/*bytes per element		*/
+    herr_t	ret_value;		/*function return status	*/
+#ifndef NDEBUG
+    unsigned	u;
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(n > 0 && n <= H5VM_HYPER_NDIMS);
+    HDassert(_size);
+    HDassert(total_size);
+    HDassert(dst);
+#ifndef NDEBUG
+    for (u = 0; u < n; u++) {
+        HDassert(_size[u] > 0);
+        HDassert(total_size[u] > 0);
+    }
+#endif
+
+    /* Copy the size vector so we can modify it */
+    H5VM_vector_cpy(n, size, _size);
+
+    /* Compute an optimal destination stride vector */
+    dst_start = H5VM_hyper_stride(n, size, total_size, offset, dst_stride);
+    H5VM_stride_optimize1(&n, &elmt_size, size, dst_stride);
+
+    /* Copy */
+    ret_value = H5VM_stride_fill(n, elmt_size, size, dst_stride, dst+dst_start,
+			     fill_value);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_hyper_copy
+ *
+ * Purpose:	Copies a hyperslab from the source to the destination.
+ *
+ *		A hyperslab is a logically contiguous region of
+ *		multi-dimensional size SIZE of an array whose dimensionality
+ *		is N and whose total size is DST_TOTAL_SIZE or SRC_TOTAL_SIZE.
+ *		The minimum corner of the hyperslab begins at a
+ *		multi-dimensional offset from the minimum corner of the DST
+ *		(destination) or SRC (source) array.  The sizes and offsets
+ *		are assumed to be in C order, that is, the first size/offset
+ *		varies the slowest while the last varies the fastest in the
+ *		mapping from N-dimensional space to linear space.  This
+ *		function assumes that the array elements are single bytes (if
+ *		your array has multi-byte elements then add an additional
+ *		dimension whose size is that of your element).
+ *
+ *		The SRC and DST array may be the same array, but the results
+ *		are undefined if the source hyperslab overlaps the
+ *		destination hyperslab.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Friday, October 10, 1997
+ *
+ * Modifications:
+ *              Unrolled loops for common cases
+ *              Quincey Koziol
+ *		?, ? ?, 2001?
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_hyper_copy(unsigned n, const hsize_t *_size,
+
+	       /*destination*/
+	       const hsize_t *dst_size, const hsize_t *dst_offset,
+	       void *_dst,
+
+	       /*source*/
+	       const hsize_t *src_size, const hsize_t *src_offset,
+	       const void *_src)
+{
+    const uint8_t *src = (const uint8_t*)_src;	/*cast for ptr arithmtc */
+    uint8_t	*dst = (uint8_t*) _dst;		/*cast for ptr arithmtc */
+    hsize_t	size[H5VM_HYPER_NDIMS];		/*a modifiable _size	*/
+    hsize_t	src_stride[H5VM_HYPER_NDIMS];	/*source stride info	*/
+    hsize_t	dst_stride[H5VM_HYPER_NDIMS];	/*dest stride info	*/
+    hsize_t	dst_start, src_start;		/*offset to start at	*/
+    hsize_t	elmt_size = 1;			/*element size in bytes */
+    herr_t	ret_value;			/*return status		*/
+#ifndef NDEBUG
+    unsigned	u;
+#endif
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(n > 0 && n <= H5VM_HYPER_NDIMS);
+    HDassert(_size);
+    HDassert(dst_size);
+    HDassert(src_size);
+    HDassert(dst);
+    HDassert(src);
+#ifndef NDEBUG
+    for (u = 0; u < n; u++) {
+        HDassert(_size[u] > 0);
+        HDassert(dst_size[u] > 0);
+        HDassert(src_size[u] > 0);
+    }
+#endif
+
+    /* Copy the size vector so we can modify it */
+    H5VM_vector_cpy(n, size, _size);
+
+    /* Compute stride vectors for source and destination */
+#ifdef NO_INLINED_CODE
+    dst_start = H5VM_hyper_stride(n, size, dst_size, dst_offset, dst_stride);
+    src_start = H5VM_hyper_stride(n, size, src_size, src_offset, src_stride);
+#else /* NO_INLINED_CODE */
+    /* in-line version of two calls to H5VM_hyper_stride() */
+    {
+        hsize_t	    dst_acc;	/*accumulator				*/
+        hsize_t	    src_acc;	/*accumulator				*/
+        int        ii;		    /*counter				*/
+
+        /* init */
+        HDassert(n>0);
+        dst_stride[n-1] = 1;
+        src_stride[n-1] = 1;
+        dst_start = dst_offset ? dst_offset[n-1] : 0;
+        src_start = src_offset ? src_offset[n-1] : 0;
+
+        /* Unroll loop for common cases */
+        switch(n) {
+            case 2:
+                HDassert(dst_size[1]>=size[1]);
+                HDassert(src_size[1]>=size[1]);
+                dst_stride[0] = dst_size[1] - size[1]; /*overflow checked*/
+                src_stride[0] = src_size[1] - size[1]; /*overflow checked*/
+                dst_acc = dst_size[1];
+                src_acc = src_size[1];
+                dst_start += dst_acc * (dst_offset ? dst_offset[0] : 0);
+                src_start += src_acc * (src_offset ? src_offset[0] : 0);
+                break;
+
+            case 3:
+                HDassert(dst_size[2]>=size[2]);
+                HDassert(src_size[2]>=size[2]);
+                dst_stride[1] = dst_size[2] - size[2]; /*overflow checked*/
+                src_stride[1] = src_size[2] - size[2]; /*overflow checked*/
+                dst_acc = dst_size[2];
+                src_acc = src_size[2];
+                dst_start += dst_acc * (dst_offset ? dst_offset[1] : 0);
+                src_start += src_acc * (src_offset ? src_offset[1] : 0);
+
+                HDassert(dst_size[1]>=size[1]);
+                HDassert(src_size[1]>=size[1]);
+                dst_stride[0] = dst_acc * (dst_size[1] - size[1]); /*overflow checked*/
+                src_stride[0] = src_acc * (src_size[1] - size[1]); /*overflow checked*/
+                dst_acc *= dst_size[1];
+                src_acc *= src_size[1];
+                dst_start += dst_acc * (dst_offset ? dst_offset[0] : 0);
+                src_start += src_acc * (src_offset ? src_offset[0] : 0);
+                break;
+
+            case 4:
+                HDassert(dst_size[3]>=size[3]);
+                HDassert(src_size[3]>=size[3]);
+                dst_stride[2] = dst_size[3] - size[3]; /*overflow checked*/
+                src_stride[2] = src_size[3] - size[3]; /*overflow checked*/
+                dst_acc = dst_size[3];
+                src_acc = src_size[3];
+                dst_start += dst_acc * (dst_offset ? dst_offset[2] : 0);
+                src_start += src_acc * (src_offset ? src_offset[2] : 0);
+
+                HDassert(dst_size[2]>=size[2]);
+                HDassert(src_size[2]>=size[2]);
+                dst_stride[1] = dst_acc * (dst_size[2] - size[2]); /*overflow checked*/
+                src_stride[1] = src_acc * (src_size[2] - size[2]); /*overflow checked*/
+                dst_acc *= dst_size[2];
+                src_acc *= src_size[2];
+                dst_start += dst_acc * (dst_offset ? dst_offset[1] : 0);
+                src_start += src_acc * (src_offset ? src_offset[1] : 0);
+
+                HDassert(dst_size[1]>=size[1]);
+                HDassert(src_size[1]>=size[1]);
+                dst_stride[0] = dst_acc * (dst_size[1] - size[1]); /*overflow checked*/
+                src_stride[0] = src_acc * (src_size[1] - size[1]); /*overflow checked*/
+                dst_acc *= dst_size[1];
+                src_acc *= src_size[1];
+                dst_start += dst_acc * (dst_offset ? dst_offset[0] : 0);
+                src_start += src_acc * (src_offset ? src_offset[0] : 0);
+                break;
+
+            default:
+                /* others */
+                for (ii=(int)(n-2), dst_acc=1, src_acc=1; ii>=0; --ii) {
+                    HDassert(dst_size[ii+1]>=size[ii+1]);
+                    HDassert(src_size[ii+1]>=size[ii+1]);
+                    dst_stride[ii] = dst_acc * (dst_size[ii+1] - size[ii+1]); /*overflow checked*/
+                    src_stride[ii] = src_acc * (src_size[ii+1] - size[ii+1]); /*overflow checked*/
+                    dst_acc *= dst_size[ii+1];
+                    src_acc *= src_size[ii+1];
+                    dst_start += dst_acc * (dst_offset ? dst_offset[ii] : 0);
+                    src_start += src_acc * (src_offset ? src_offset[ii] : 0);
+                }
+                break;
+        } /* end switch */
+    }
+#endif /* NO_INLINED_CODE */
+
+    /* Optimize the strides as a pair */
+    H5VM_stride_optimize2(&n, &elmt_size, size, dst_stride, src_stride);
+
+    /* Perform the copy in terms of stride */
+    ret_value = H5VM_stride_copy(n, elmt_size, size,
+             dst_stride, dst+dst_start, src_stride, src+src_start);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_fill
+ *
+ * Purpose:	Fills all bytes of a hyperslab with the same value using
+ *		memset().
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_stride_fill(unsigned n, hsize_t elmt_size, const hsize_t *size,
+		const hsize_t *stride, void *_dst, unsigned fill_value)
+{
+    uint8_t	*dst = (uint8_t*)_dst; 	/*cast for ptr arithmetic	*/
+    hsize_t	idx[H5VM_HYPER_NDIMS]; 	/*1-origin indices		*/
+    hsize_t	nelmts;			/*number of elements to fill	*/
+    hsize_t	i;			/*counter			*/
+    int	j;			/*counter			*/
+    hbool_t	carry;			/*subtraction carray value	*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(elmt_size < SIZET_MAX);
+
+    H5VM_vector_cpy(n, idx, size);
+    nelmts = H5VM_vector_reduce_product(n, size);
+    for (i=0; i<nelmts; i++) {
+        /* Copy an element */
+        H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+        HDmemset(dst, (int)fill_value, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+
+        /* Decrement indices and advance pointer */
+        for (j=(int)(n-1), carry=TRUE; j>=0 && carry; --j) {
+            dst += stride[j];
+
+            if (--idx[j])
+                carry = FALSE;
+            else {
+                HDassert(size);
+                idx[j] = size[j];
+            } /* end else */
+        }
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_copy
+ *
+ * Purpose:	Uses DST_STRIDE and SRC_STRIDE to advance through the arrays
+ *		DST and SRC while copying bytes from SRC to DST.  This
+ *		function minimizes the number of calls to memcpy() by
+ *		combining various strides, but it will never touch memory
+ *		outside the hyperslab defined by the strides.
+ *
+ * Note:	If the src_stride is all zero and elmt_size is one, then it's
+ *		probably more efficient to use H5VM_stride_fill() instead.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_stride_copy(unsigned n, hsize_t elmt_size, const hsize_t *size,
+		const hsize_t *dst_stride, void *_dst,
+		const hsize_t *src_stride, const void *_src)
+{
+    uint8_t	*dst = (uint8_t*)_dst;		/*cast for ptr arithmetic*/
+    const uint8_t *src = (const uint8_t*) _src;	/*cast for ptr arithmetic*/
+    hsize_t	idx[H5VM_HYPER_NDIMS];		/*1-origin indices	*/
+    hsize_t	nelmts;				/*num elements to copy	*/
+    hsize_t	i;				/*counter		*/
+    int	j;				/*counters		*/
+    hbool_t	carry;				/*carray for subtraction*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(elmt_size<SIZET_MAX);
+
+    if (n) {
+        H5VM_vector_cpy(n, idx, size);
+        nelmts = H5VM_vector_reduce_product(n, size);
+        for (i=0; i<nelmts; i++) {
+
+            /* Copy an element */
+            H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+            HDmemcpy(dst, src, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+
+            /* Decrement indices and advance pointers */
+            for (j=(int)(n-1), carry=TRUE; j>=0 && carry; --j) {
+                src += src_stride[j];
+                dst += dst_stride[j];
+
+                if (--idx[j])
+                    carry = FALSE;
+                else {
+                    HDassert(size);
+                    idx[j] = size[j];
+                }
+            }
+        }
+    } else {
+        H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+        HDmemcpy (dst, src, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_copy_s
+ *
+ * Purpose:	Uses DST_STRIDE and SRC_STRIDE to advance through the arrays
+ *		DST and SRC while copying bytes from SRC to DST.  This
+ *		function minimizes the number of calls to memcpy() by
+ *		combining various strides, but it will never touch memory
+ *		outside the hyperslab defined by the strides.
+ *
+ * Note:	If the src_stride is all zero and elmt_size is one, then it's
+ *		probably more efficient to use H5VM_stride_fill() instead.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_stride_copy_s(unsigned n, hsize_t elmt_size, const hsize_t *size,
+		const hssize_t *dst_stride, void *_dst,
+		const hssize_t *src_stride, const void *_src)
+{
+    uint8_t	*dst = (uint8_t*)_dst;		/*cast for ptr arithmetic*/
+    const uint8_t *src = (const uint8_t*) _src;	/*cast for ptr arithmetic*/
+    hsize_t	idx[H5VM_HYPER_NDIMS];		/*1-origin indices	*/
+    hsize_t	nelmts;				/*num elements to copy	*/
+    hsize_t	i;				/*counter		*/
+    int	j;				/*counters		*/
+    hbool_t	carry;				/*carray for subtraction*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(elmt_size<SIZET_MAX);
+
+    if (n) {
+        H5VM_vector_cpy(n, idx, size);
+        nelmts = H5VM_vector_reduce_product(n, size);
+        for (i=0; i<nelmts; i++) {
+
+            /* Copy an element */
+            H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+            HDmemcpy(dst, src, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+
+            /* Decrement indices and advance pointers */
+            for (j=(int)(n-1), carry=TRUE; j>=0 && carry; --j) {
+                src += src_stride[j];
+                dst += dst_stride[j];
+
+                if (--idx[j])
+                    carry = FALSE;
+                else {
+                    HDassert(size);
+                    idx[j] = size[j];
+                }
+            }
+        }
+    } else {
+        H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+        HDmemcpy (dst, src, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+#ifdef LATER
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_stride_copy2
+ *
+ * Purpose:	Similar to H5VM_stride_copy() except the source and
+ *		destination each have their own dimensionality and size and
+ *		we copy exactly NELMTS elements each of size ELMT_SIZE.	 The
+ *		size counters wrap if NELMTS is more than a size counter.
+ *
+ * Return:	None
+ *
+ * Programmer:	Robb Matzke
+ *		Saturday, October 11, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5VM_stride_copy2(hsize_t nelmts, hsize_t elmt_size,
+
+		 /* destination */
+		 unsigned dst_n, const hsize_t *dst_size,
+		 const hsize_t *dst_stride,
+		 void *_dst,
+
+		 /* source */
+		 unsigned src_n, const hsize_t *src_size,
+		 const hsize_t *src_stride,
+		 const void *_src)
+{
+    uint8_t	*dst = (uint8_t *) _dst;
+    const uint8_t *src = (const uint8_t *) _src;
+    hsize_t	dst_idx[H5VM_HYPER_NDIMS];
+    hsize_t	src_idx[H5VM_HYPER_NDIMS];
+    hsize_t	i;              /* Local index variable */
+    int		j;              /* Local index variable */
+    hbool_t	carry;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(elmt_size < SIZET_MAX);
+    HDassert(dst_n>0);
+    HDassert(src_n>0);
+
+    H5VM_vector_cpy(dst_n, dst_idx, dst_size);
+    H5VM_vector_cpy(src_n, src_idx, src_size);
+
+    for (i=0; i<nelmts; i++) {
+
+	/* Copy an element */
+        H5_CHECK_OVERFLOW(elmt_size,hsize_t,size_t);
+	HDmemcpy(dst, src, (size_t)elmt_size); /*lint !e671 The elmt_size will be OK */
+
+	/* Decrement indices and advance pointers */
+	for (j=(int)(dst_n-1), carry=TRUE; j>=0 && carry; --j) {
+	    dst += dst_stride[j];
+	    if (--dst_idx[j])
+                carry = FALSE;
+	    else {
+                HDassert(dst_size);
+                dst_idx[j] = dst_size[j];
+            } /* end else */
+	}
+	for (j=(int)(src_n-1), carry=TRUE; j>=0 && carry; --j) {
+	    src += src_stride[j];
+	    if (--src_idx[j])
+                carry = FALSE;
+	    else {
+                HDassert(src_size);
+                src_idx[j] = src_size[j];
+            } /* end else */
+	}
+    }
+
+    FUNC_LEAVE_NOAPI_VOID
+}
+#endif /* LATER */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_fill
+ *
+ * Purpose:	Fills all bytes of an array with the same value using
+ *		memset(). Increases amount copied by power of two until the
+ *		halfway point is crossed, then copies the rest in one swoop.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, June 18, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_array_fill(void *_dst, const void *src, size_t size, size_t count)
+{
+    size_t      copy_size;          /* size of the buffer to copy	*/
+    size_t      copy_items;         /* number of items currently copying*/
+    size_t      items_left;         /* number of items left to copy 	*/
+    uint8_t     *dst=(uint8_t*)_dst;/* alias for pointer arithmetic	*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(dst);
+    HDassert(src);
+    HDassert(size < SIZET_MAX && size > 0);
+    HDassert(count < SIZET_MAX && count > 0);
+
+    HDmemcpy(dst, src, size);   /* copy first item */
+
+    /* Initialize counters, etc. while compensating for first element copied */
+    copy_size = size;
+    copy_items = 1;
+    items_left = count - 1;
+    dst += size;
+
+    /* copy until we've copied at least half of the items */
+    while (items_left >= copy_items)
+    {
+        HDmemcpy(dst, _dst, copy_size);   /* copy the current chunk */
+        dst += copy_size;     /* move the offset for the next chunk */
+        items_left -= copy_items;   /* decrement the number of items left */
+
+        copy_size *= 2;     /* increase the size of the chunk to copy */
+        copy_items *= 2;    /* increase the count of items we are copying */
+    }   /* end while */
+    if (items_left > 0)   /* if there are any items left to copy */
+        HDmemcpy(dst, _dst, items_left * size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5VM_array_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_down
+ *
+ * Purpose:	Given a set of dimension sizes, calculate the size of each
+ *              "down" slice.  This is the size of the dimensions for all the
+ *              dimensions below the current one, which is used for indexing
+ *              offsets in this dimension.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, April 28, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_array_down(unsigned n, const hsize_t *total_size, hsize_t *down)
+{
+    hsize_t	acc;	                /*accumulator			*/
+    int	        i;		        /*counter			*/
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(total_size);
+    HDassert(down);
+
+    /* Build the sizes of each dimension in the array */
+    /* (From fastest to slowest) */
+    for(i=(int)(n-1),acc=1; i>=0; i--) {
+        down[i]=acc;
+        acc *= total_size[i];
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5VM_array_down() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_offset_pre
+ *
+ * Purpose:	Given a coordinate description of a location in an array, this
+ *      function returns the byte offset of the coordinate.
+ *
+ *		The dimensionality of the whole array, and the offset is N.
+ *              The whole array dimensions are TOTAL_SIZE and the coordinate
+ *              is at offset OFFSET.
+ *
+ * Return:	Success: Byte offset from beginning of array to element offset
+ *		Failure: abort() -- should never fail
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, June 22, 1999
+ *
+ * Modifications:
+ *              Use precomputed accumulator array
+ *              Quincey Koziol
+ *		Saturday, April 26, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5VM_array_offset_pre(unsigned n, const hsize_t *acc, const hsize_t *offset)
+{
+    int             i;		/*counter				*/
+    hsize_t	    ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(acc);
+    HDassert(offset);
+
+    /* Compute offset in array */
+    for(i = (int)(n - 1), ret_value = 0; i >= 0; --i)
+        ret_value += acc[i] * offset[i];
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_array_offset_pre() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_offset
+ *
+ * Purpose:	Given a coordinate description of a location in an array, this
+ *      function returns the byte offset of the coordinate.
+ *
+ *		The dimensionality of the whole array, and the offset is N.
+ *              The whole array dimensions are TOTAL_SIZE and the coordinate
+ *              is at offset OFFSET.
+ *
+ * Return:	Success: Byte offset from beginning of array to element offset
+ *		Failure: abort() -- should never fail
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, June 22, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5VM_array_offset(unsigned n, const hsize_t *total_size, const hsize_t *offset)
+{
+    hsize_t	acc_arr[H5VM_HYPER_NDIMS];	/* Accumulated size of down dimensions */
+    hsize_t	ret_value;  /* Return value */
+
+    FUNC_ENTER_NOAPI((HDabort(), 0)) /*lint !e527 Don't worry about unreachable statement */
+
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(total_size);
+    HDassert(offset);
+
+    /* Build the sizes of each dimension in the array */
+    if(H5VM_array_down(n,total_size,acc_arr)<0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, UFAIL, "can't compute down sizes")
+
+    /* Set return value */
+    ret_value=H5VM_array_offset_pre(n,acc_arr,offset);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_array_offset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_calc_pre
+ *
+ * Purpose:	Given a linear offset in an array, the dimensions of that
+ *              array and the pre-computed 'down' (accumulator) sizes, this
+ *              function computes the coordinates of that offset in the array.
+ *
+ *		The dimensionality of the whole array, and the coordinates is N.
+ *              The array dimensions are TOTAL_SIZE and the coordinates
+ *              are returned in COORD.  The linear offset is in OFFSET.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, July 16, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5VM_array_calc_pre(hsize_t offset, unsigned n, const hsize_t *down,
+    hsize_t *coords)
+{
+    unsigned    u;                      /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(coords);
+
+    /* Compute the coordinates from the offset */
+    for(u = 0; u < n; u++) {
+        coords[u] = offset / down[u];
+        offset %= down[u];
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5VM_array_calc_pre() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_array_calc
+ *
+ * Purpose:	Given a linear offset in an array and the dimensions of that
+ *              array, this function computes the coordinates of that offset
+ *              in the array.
+ *
+ *		The dimensionality of the whole array, and the coordinates is N.
+ *              The array dimensions are TOTAL_SIZE and the coordinates
+ *              are returned in COORD.  The linear offset is in OFFSET.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, April 16, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_array_calc(hsize_t offset, unsigned n, const hsize_t *total_size, hsize_t *coords)
+{
+    hsize_t	idx[H5VM_HYPER_NDIMS];	/* Size of each dimension in bytes */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(n <= H5VM_HYPER_NDIMS);
+    HDassert(total_size);
+    HDassert(coords);
+
+    /* Build the sizes of each dimension in the array */
+    if(H5VM_array_down(n, total_size, idx) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "can't compute down sizes")
+
+    /* Compute the coordinates from the offset */
+    if(H5VM_array_calc_pre(offset, n, idx, coords) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "can't compute coordinates")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_array_calc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_chunk_index
+ *
+ * Purpose:	Given a coordinate offset (COORD), the size of each chunk
+ *              (CHUNK), the number of chunks in each dimension (NCHUNKS)
+ *              and the number of dimensions of all of these (NDIMS), calculate
+ *              a "chunk index" for the chunk that the coordinate offset is
+ *              located in.
+ *
+ *              The chunk index starts at 0 and increases according to the
+ *              fastest changing dimension, then the next fastest, etc.
+ *
+ *              For example, with a 3x5 chunk size and 6 chunks in the fastest
+ *              changing dimension and 3 chunks in the slowest changing
+ *              dimension, the chunk indices are as follows:
+ *
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              |  0  |  1  |  2  |  3  |  4  |  5  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              |  6  |  7  |  8  |  9  | 10  | 11  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              | 12  | 13  | 14  | 15  | 16  | 17  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *
+ *              The chunk index is placed in the CHUNK_IDX location for return
+ *              from this function
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Monday, April 21, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VM_chunk_index(unsigned ndims, const hsize_t *coord, const uint32_t *chunk,
+    const hsize_t *down_nchunks, hsize_t *chunk_idx)
+{
+    hsize_t	scaled_coord[H5VM_HYPER_NDIMS];	/* Scaled, coordinates, in terms of chunks */
+    unsigned    u;                      /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ndims <= H5VM_HYPER_NDIMS);
+    HDassert(coord);
+    HDassert(chunk);
+    HDassert(chunk_idx);
+
+    /* Compute the scaled coordinates for actual coordinates */
+    for(u=0; u<ndims; u++)
+        scaled_coord[u]=coord[u]/chunk[u];
+
+    /* Compute the chunk index */
+    *chunk_idx=H5VM_array_offset_pre(ndims,down_nchunks,scaled_coord); /*lint !e772 scaled_coord will always be initialized */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5VM_chunk_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_opvv
+ *
+ * Purpose:	Perform an operation on a source & destination sequences
+ *		of offset/length pairs.  Each set of sequnces has an array
+ *		of lengths, an array of offsets, the maximum number of
+ *		sequences and the current sequence to start at in the sequence.
+ *
+ *              There may be different numbers of bytes in the source and
+ *              destination sequences, the operation stops when either the
+ *              source or destination sequence runs out of information.
+ *
+ * Note:	The algorithm in this routine is [basically] the same as for
+ *		H5VM_memcpyvv().  Changes should be made to both!
+ *
+ * Return:	Non-negative # of bytes operated on, on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 30, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5VM_opvv(size_t dst_max_nseq, size_t *dst_curr_seq, size_t dst_len_arr[],
+    hsize_t dst_off_arr[],
+    size_t src_max_nseq, size_t *src_curr_seq, size_t src_len_arr[],
+    hsize_t src_off_arr[],
+    H5VM_opvv_func_t op, void *op_data)
+{
+    hsize_t *max_dst_off_ptr, *max_src_off_ptr;  /* Pointers to max. source and destination offset locations */
+    hsize_t *dst_off_ptr, *src_off_ptr; /* Pointers to source and destination offset arrays */
+    size_t *dst_len_ptr, *src_len_ptr;  /* Pointers to source and destination length arrays */
+    hsize_t tmp_dst_off, tmp_src_off;   /* Temporary source and destination offset values */
+    size_t tmp_dst_len, tmp_src_len;    /* Temporary source and destination length values */
+    size_t acc_len;             /* Accumulated length of sequences */
+    ssize_t ret_value = 0;      /* Return value (Total size of sequence in bytes) */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(dst_curr_seq);
+    HDassert(*dst_curr_seq < dst_max_nseq);
+    HDassert(dst_len_arr);
+    HDassert(dst_off_arr);
+    HDassert(src_curr_seq);
+    HDassert(*src_curr_seq < src_max_nseq);
+    HDassert(src_len_arr);
+    HDassert(src_off_arr);
+    HDassert(op);
+
+    /* Set initial offset & length pointers */
+    dst_len_ptr = dst_len_arr + *dst_curr_seq;
+    dst_off_ptr = dst_off_arr + *dst_curr_seq;
+    src_len_ptr = src_len_arr + *src_curr_seq;
+    src_off_ptr = src_off_arr + *src_curr_seq;
+
+    /* Get temporary source & destination sequence offsets & lengths */
+    tmp_dst_len = *dst_len_ptr;
+    tmp_dst_off = *dst_off_ptr;
+    tmp_src_len = *src_len_ptr;
+    tmp_src_off = *src_off_ptr;
+
+    /* Compute maximum offset pointer values */
+    max_dst_off_ptr = dst_off_arr + dst_max_nseq;
+    max_src_off_ptr = src_off_arr + src_max_nseq;
+
+/* Work through the sequences */
+/* (Choose smallest sequence available initially) */
+
+    /* Source sequence is less than destination sequence */
+    if(tmp_src_len < tmp_dst_len) {
+src_smaller:
+        acc_len = 0;
+        do {
+            /* Make operator callback */
+            if((*op)(tmp_dst_off, tmp_src_off, tmp_src_len, op_data) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTOPERATE, FAIL, "can't perform operation")
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_src_len;
+
+            /* Update destination length */
+            tmp_dst_off += tmp_src_len;
+            tmp_dst_len -= tmp_src_len;
+
+            /* Advance source offset & check for being finished */
+            src_off_ptr++;
+            if(src_off_ptr >= max_src_off_ptr) {
+                /* Roll accumulated changes into appropriate counters */
+                *dst_off_ptr = tmp_dst_off;
+                *dst_len_ptr = tmp_dst_len;
+
+                /* Done with sequences */
+                goto finished;
+            } /* end if */
+            tmp_src_off = *src_off_ptr;
+
+            /* Update source information */
+            src_len_ptr++;
+            tmp_src_len = *src_len_ptr;
+        } while(tmp_src_len < tmp_dst_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_dst_len < tmp_src_len)
+            goto dst_smaller;
+        else
+            goto equal;
+    } /* end if */
+    /* Destination sequence is less than source sequence */
+    else if(tmp_dst_len < tmp_src_len) {
+dst_smaller:
+        acc_len = 0;
+        do {
+            /* Make operator callback */
+            if((*op)(tmp_dst_off, tmp_src_off, tmp_dst_len, op_data) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTOPERATE, FAIL, "can't perform operation")
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_dst_len;
+
+            /* Update source length */
+            tmp_src_off += tmp_dst_len;
+            tmp_src_len -= tmp_dst_len;
+
+            /* Advance destination offset & check for being finished */
+            dst_off_ptr++;
+            if(dst_off_ptr >= max_dst_off_ptr) {
+                /* Roll accumulated changes into appropriate counters */
+                *src_off_ptr = tmp_src_off;
+                *src_len_ptr = tmp_src_len;
+
+                /* Done with sequences */
+                goto finished;
+            } /* end if */
+            tmp_dst_off = *dst_off_ptr;
+
+            /* Update destination information */
+            dst_len_ptr++;
+            tmp_dst_len = *dst_len_ptr;
+        } while(tmp_dst_len < tmp_src_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_src_len < tmp_dst_len)
+            goto src_smaller;
+        else
+            goto equal;
+    } /* end else-if */
+    /* Destination sequence and source sequence are same length */
+    else {
+equal:
+        acc_len = 0;
+        do {
+            /* Make operator callback */
+            if((*op)(tmp_dst_off, tmp_src_off, tmp_dst_len, op_data) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTOPERATE, FAIL, "can't perform operation")
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_dst_len;
+
+            /* Advance source & destination offset & check for being finished */
+            src_off_ptr++;
+            dst_off_ptr++;
+            if(src_off_ptr >= max_src_off_ptr || dst_off_ptr >= max_dst_off_ptr)
+                /* Done with sequences */
+                goto finished;
+            tmp_src_off = *src_off_ptr;
+            tmp_dst_off = *dst_off_ptr;
+
+            /* Update source information */
+            src_len_ptr++;
+            tmp_src_len = *src_len_ptr;
+
+            /* Update destination information */
+            dst_len_ptr++;
+            tmp_dst_len = *dst_len_ptr;
+        } while(tmp_dst_len == tmp_src_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_dst_len < tmp_src_len)
+            goto dst_smaller;
+        else
+            goto src_smaller;
+    } /* end else */
+
+finished:
+    /* Roll accumulated sequence lengths into return value */
+    ret_value += (ssize_t)acc_len;
+
+    /* Update current sequence vectors */
+    *dst_curr_seq = (size_t)(dst_off_ptr - dst_off_arr);
+    *src_curr_seq = (size_t)(src_off_ptr - src_off_arr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_opvv() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_memcpyvv
+ *
+ * Purpose:	Given source and destination buffers in memory (SRC & DST)
+ *              copy sequences of from the source buffer into the destination
+ *              buffer.  Each set of sequnces has an array of lengths, an
+ *              array of offsets, the maximum number of sequences and the
+ *              current sequence to start at in the sequence.
+ *
+ *              There may be different numbers of bytes in the source and
+ *              destination sequences, data copying stops when either the
+ *              source or destination buffer runs out of sequence information.
+ *
+ * Note:	The algorithm in this routine is [basically] the same as for
+ *		H5VM_opvv().  Changes should be made to both!
+ *
+ * Return:	Non-negative # of bytes copied on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, May 2, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5VM_memcpyvv(void *_dst,
+    size_t dst_max_nseq, size_t *dst_curr_seq, size_t dst_len_arr[], hsize_t dst_off_arr[],
+    const void *_src,
+    size_t src_max_nseq, size_t *src_curr_seq, size_t src_len_arr[], hsize_t src_off_arr[])
+{
+    unsigned char *dst;         /* Destination buffer pointer */
+    const unsigned char *src;   /* Source buffer pointer */
+    hsize_t *max_dst_off_ptr, *max_src_off_ptr;  /* Pointers to max. source and destination offset locations */
+    hsize_t *dst_off_ptr, *src_off_ptr;  /* Pointers to source and destination offset arrays */
+    size_t *dst_len_ptr, *src_len_ptr;  /* Pointers to source and destination length arrays */
+    size_t tmp_dst_len;         /* Temporary dest. length value */
+    size_t tmp_src_len;         /* Temporary source length value */
+    size_t acc_len;             /* Accumulated length of sequences */
+    ssize_t ret_value = 0;      /* Return value (Total size of sequence in bytes) */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(_dst);
+    HDassert(dst_curr_seq);
+    HDassert(*dst_curr_seq < dst_max_nseq);
+    HDassert(dst_len_arr);
+    HDassert(dst_off_arr);
+    HDassert(_src);
+    HDassert(src_curr_seq);
+    HDassert(*src_curr_seq < src_max_nseq);
+    HDassert(src_len_arr);
+    HDassert(src_off_arr);
+
+    /* Set initial offset & length pointers */
+    dst_len_ptr = dst_len_arr + *dst_curr_seq;
+    dst_off_ptr = dst_off_arr + *dst_curr_seq;
+    src_len_ptr = src_len_arr + *src_curr_seq;
+    src_off_ptr = src_off_arr + *src_curr_seq;
+
+    /* Get temporary source & destination sequence lengths */
+    tmp_dst_len = *dst_len_ptr;
+    tmp_src_len = *src_len_ptr;
+
+    /* Compute maximum offset pointer values */
+    max_dst_off_ptr = dst_off_arr + dst_max_nseq;
+    max_src_off_ptr = src_off_arr + src_max_nseq;
+
+    /* Compute buffer offsets */
+    dst = (unsigned char *)_dst + *dst_off_ptr;
+    src = (const unsigned char *)_src + *src_off_ptr;
+
+/* Work through the sequences */
+/* (Choose smallest sequence available initially) */
+
+    /* Source sequence is less than destination sequence */
+    if(tmp_src_len < tmp_dst_len) {
+src_smaller:
+        acc_len = 0;
+        do {
+            /* Copy data */
+            HDmemcpy(dst, src, tmp_src_len);
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_src_len;
+
+            /* Update destination length */
+            tmp_dst_len -= tmp_src_len;
+
+            /* Advance source offset & check for being finished */
+            src_off_ptr++;
+            if(src_off_ptr >= max_src_off_ptr) {
+                /* Roll accumulated changes into appropriate counters */
+                *dst_off_ptr += acc_len;
+                *dst_len_ptr = tmp_dst_len;
+
+                /* Done with sequences */
+                goto finished;
+            } /* end if */
+
+            /* Update destination pointer */
+            dst += tmp_src_len;
+
+            /* Update source information */
+            src_len_ptr++;
+            tmp_src_len = *src_len_ptr;
+            src = (const unsigned char *)_src + *src_off_ptr;
+        } while(tmp_src_len < tmp_dst_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_dst_len < tmp_src_len)
+            goto dst_smaller;
+        else
+            goto equal;
+    } /* end if */
+    /* Destination sequence is less than source sequence */
+    else if(tmp_dst_len < tmp_src_len) {
+dst_smaller:
+        acc_len = 0;
+        do {
+            /* Copy data */
+            HDmemcpy(dst, src, tmp_dst_len);
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_dst_len;
+
+            /* Update source length */
+            tmp_src_len -= tmp_dst_len;
+
+            /* Advance destination offset & check for being finished */
+            dst_off_ptr++;
+            if(dst_off_ptr >= max_dst_off_ptr) {
+                /* Roll accumulated changes into appropriate counters */
+                *src_off_ptr += acc_len;
+                *src_len_ptr = tmp_src_len;
+
+                /* Done with sequences */
+                goto finished;
+            } /* end if */
+
+            /* Update source pointer */
+            src += tmp_dst_len;
+
+            /* Update destination information */
+            dst_len_ptr++;
+            tmp_dst_len = *dst_len_ptr;
+            dst = (unsigned char *)_dst + *dst_off_ptr;
+        } while(tmp_dst_len < tmp_src_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_src_len < tmp_dst_len)
+            goto src_smaller;
+        else
+            goto equal;
+    } /* end else-if */
+    /* Destination sequence and source sequence are same length */
+    else {
+equal:
+        acc_len = 0;
+        do {
+            /* Copy data */
+            HDmemcpy(dst, src, tmp_dst_len);
+
+            /* Accumulate number of bytes copied */
+            acc_len += tmp_dst_len;
+
+            /* Advance source & destination offset & check for being finished */
+            src_off_ptr++;
+            dst_off_ptr++;
+            if(src_off_ptr >= max_src_off_ptr || dst_off_ptr >= max_dst_off_ptr)
+                /* Done with sequences */
+                goto finished;
+
+            /* Update source information */
+            src_len_ptr++;
+            tmp_src_len = *src_len_ptr;
+            src = (const unsigned char *)_src + *src_off_ptr;
+
+            /* Update destination information */
+            dst_len_ptr++;
+            tmp_dst_len = *dst_len_ptr;
+            dst = (unsigned char *)_dst + *dst_off_ptr;
+        } while(tmp_dst_len == tmp_src_len);
+
+        /* Roll accumulated sequence lengths into return value */
+        ret_value += (ssize_t)acc_len;
+
+        /* Transition to next state */
+        if(tmp_dst_len < tmp_src_len)
+            goto dst_smaller;
+        else
+            goto src_smaller;
+    } /* end else */
+
+finished:
+    /* Roll accumulated sequence lengths into return value */
+    ret_value += (ssize_t)acc_len;
+
+    /* Update current sequence vectors */
+    *dst_curr_seq = (size_t)(dst_off_ptr - dst_off_arr);
+    *src_curr_seq = (size_t)(src_off_ptr - src_off_arr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VM_memcpyvv() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5VMprivate.h b/gatb-core/thirdparty/hdf5/src/H5VMprivate.h
new file mode 100644
index 0000000..78799d8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5VMprivate.h
@@ -0,0 +1,492 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Robb Matzke <matzke at llnl.gov>
+ *             Friday, October 10, 1997
+ */
+#ifndef H5VMprivate_H
+#define H5VMprivate_H
+
+/* Private headers needed by this file */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+
+/* Vector-Vector sequence operation callback */
+typedef herr_t (*H5VM_opvv_func_t)(hsize_t dst_off, hsize_t src_off,
+    size_t len, void *udata);
+
+/* Vector comparison functions like Fortran66 comparison operators */
+#define H5VM_vector_eq_s(N,V1,V2) (H5VM_vector_cmp_s (N, V1, V2)==0)
+#define H5VM_vector_lt_s(N,V1,V2) (H5VM_vector_cmp_s (N, V1, V2)<0)
+#define H5VM_vector_gt_s(N,V1,V2) (H5VM_vector_cmp_s (N, V1, V2)>0)
+#define H5VM_vector_le_s(N,V1,V2) (H5VM_vector_cmp_s (N, V1, V2)<=0)
+#define H5VM_vector_ge_s(N,V1,V2) (H5VM_vector_cmp_s (N, V1, V2)>=0)
+#define H5VM_vector_eq_u(N,V1,V2) (H5VM_vector_cmp_u (N, V1, V2)==0)
+#define H5VM_vector_lt_u(N,V1,V2) (H5VM_vector_cmp_u (N, V1, V2)<0)
+#define H5VM_vector_gt_u(N,V1,V2) (H5VM_vector_cmp_u (N, V1, V2)>0)
+#define H5VM_vector_le_u(N,V1,V2) (H5VM_vector_cmp_u (N, V1, V2)<=0)
+#define H5VM_vector_ge_u(N,V1,V2) (H5VM_vector_cmp_u (N, V1, V2)>=0)
+
+/* Other functions */
+#define H5VM_vector_cpy(N,DST,SRC) {                                           \
+    HDassert(sizeof(*(DST))==sizeof(*(SRC)));				                  \
+    if (SRC) HDmemcpy (DST, SRC, (N)*sizeof(*(DST)));                         \
+    else HDmemset (DST, 0, (N)*sizeof(*(DST)));                               \
+}
+
+#define H5VM_vector_zero(N,DST) HDmemset(DST,0,(N)*sizeof(*(DST)))
+
+/* A null pointer is equivalent to a zero vector */
+#define H5VM_ZERO        NULL
+
+H5_DLL hsize_t H5VM_hyper_stride(unsigned n, const hsize_t *size,
+				 const hsize_t *total_size,
+				 const hsize_t *offset,
+				 hsize_t *stride);
+H5_DLL htri_t H5VM_hyper_disjointp(unsigned n, const hsize_t *offset1,
+    const uint32_t *size1, const hsize_t *offset2, const uint32_t *size2);
+H5_DLL htri_t H5VM_hyper_eq(unsigned n, const hsize_t *offset1,
+			    const hsize_t *size1, const hsize_t *offset2,
+			    const hsize_t *size2);
+H5_DLL herr_t H5VM_hyper_fill(unsigned n, const hsize_t *_size,
+			      const hsize_t *total_size,
+			      const hsize_t *offset, void *_dst,
+			      unsigned fill_value);
+H5_DLL herr_t H5VM_hyper_copy(unsigned n, const hsize_t *size,
+			      const hsize_t *dst_total_size,
+			      const hsize_t *dst_offset, void *_dst,
+			      const hsize_t *src_total_size,
+			      const hsize_t *src_offset, const void *_src);
+H5_DLL herr_t H5VM_stride_fill(unsigned n, hsize_t elmt_size, const hsize_t *size,
+			       const hsize_t *stride, void *_dst,
+			       unsigned fill_value);
+H5_DLL herr_t H5VM_stride_copy(unsigned n, hsize_t elmt_size, const hsize_t *_size,
+			       const hsize_t *dst_stride, void *_dst,
+			       const hsize_t *src_stride, const void *_src);
+H5_DLL herr_t H5VM_stride_copy_s(unsigned n, hsize_t elmt_size, const hsize_t *_size,
+			       const hssize_t *dst_stride, void *_dst,
+			       const hssize_t *src_stride, const void *_src);
+H5_DLL herr_t H5VM_array_fill(void *_dst, const void *src, size_t size,
+			      size_t count);
+H5_DLL herr_t H5VM_array_down(unsigned n, const hsize_t *total_size,
+    hsize_t *down);
+H5_DLL hsize_t H5VM_array_offset_pre(unsigned n,
+    const hsize_t *acc, const hsize_t *offset);
+H5_DLL hsize_t H5VM_array_offset(unsigned n, const hsize_t *total_size,
+    const hsize_t *offset);
+H5_DLL herr_t H5VM_array_calc(hsize_t offset, unsigned n,
+    const hsize_t *total_size, hsize_t *coords);
+H5_DLL herr_t H5VM_chunk_index(unsigned ndims, const hsize_t *coord,
+    const uint32_t *chunk, const hsize_t *down_nchunks, hsize_t *chunk_idx);
+H5_DLL ssize_t H5VM_opvv(size_t dst_max_nseq, size_t *dst_curr_seq, size_t dst_len_arr[],
+    hsize_t dst_off_arr[],
+    size_t src_max_nseq, size_t *src_curr_seq, size_t src_len_arr[],
+    hsize_t src_off_arr[],
+    H5VM_opvv_func_t op, void *op_data);
+H5_DLL ssize_t H5VM_memcpyvv(void *_dst,
+    size_t dst_max_nseq, size_t *dst_curr_seq, size_t dst_len_arr[], hsize_t dst_off_arr[],
+    const void *_src,
+    size_t src_max_nseq, size_t *src_curr_seq, size_t src_len_arr[], hsize_t src_off_arr[]);
+
+
+/*-------------------------------------------------------------------------
+ * Function:    H5VM_vector_reduce_product
+ *
+ * Purpose:     Product reduction of a vector.  Vector elements and return
+ *              value are size_t because we usually want the number of
+ *              elements in an array and array dimensions are always of type
+ *              size_t.
+ *
+ * Return:      Success:        Product of elements
+ *
+ *              Failure:        1 if N is zero
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, October 10, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE hsize_t H5_ATTR_UNUSED
+H5VM_vector_reduce_product(unsigned n, const hsize_t *v)
+{
+    hsize_t                  ret_value = 1;
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (n && !v) HGOTO_DONE(0)
+    while (n--) ret_value *= *v++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5VM_vector_zerop_u
+ *
+ * Purpose:     Determines if all elements of a vector are zero.
+ *
+ * Return:      Success:        TRUE if all elements are zero,
+ *                              FALSE otherwise
+ *
+ *              Failure:        TRUE if N is zero
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, October 10, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE htri_t H5_ATTR_UNUSED
+H5VM_vector_zerop_u(int n, const hsize_t *v)
+{
+    htri_t      ret_value=TRUE;       /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (!v)
+        HGOTO_DONE(TRUE)
+    while (n--)
+	if (*v++)
+            HGOTO_DONE(FALSE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5VM_vector_zerop_s
+ *
+ * Purpose:     Determines if all elements of a vector are zero.
+ *
+ * Return:      Success:        TRUE if all elements are zero,
+ *                              FALSE otherwise
+ *
+ *              Failure:        TRUE if N is zero
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, October 10, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE htri_t H5_ATTR_UNUSED
+H5VM_vector_zerop_s(int n, const hssize_t *v)
+{
+    htri_t      ret_value=TRUE;       /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (!v)
+        HGOTO_DONE(TRUE)
+    while (n--)
+	if (*v++)
+            HGOTO_DONE(FALSE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5VM_vector_cmp_u
+ *
+ * Purpose:     Compares two vectors of the same size and determines if V1 is
+ *              lexicographically less than, equal, or greater than V2.
+ *
+ * Return:      Success:        -1 if V1 is less than V2
+ *                              0 if they are equal
+ *                              1 if V1 is greater than V2
+ *
+ *              Failure:        0 if N is zero
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, October 10, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE int H5_ATTR_UNUSED
+H5VM_vector_cmp_u (unsigned n, const hsize_t *v1, const hsize_t *v2)
+{
+    int ret_value=0;    /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (v1 == v2) HGOTO_DONE(0)
+    if (v1 == NULL) HGOTO_DONE(-1)
+    if (v2 == NULL) HGOTO_DONE(1)
+    while (n--) {
+        if (*v1 < *v2) HGOTO_DONE(-1)
+        if (*v1 > *v2) HGOTO_DONE(1)
+        v1++;
+        v2++;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_vector_cmp_s
+ *
+ * Purpose:     Compares two vectors of the same size and determines if V1 is
+ *              lexicographically less than, equal, or greater than V2.
+ *
+ * Return:      Success:        -1 if V1 is less than V2
+ *                              0 if they are equal
+ *                              1 if V1 is greater than V2
+ *
+ *              Failure:        0 if N is zero
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, April  8, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE int H5_ATTR_UNUSED
+H5VM_vector_cmp_s (unsigned n, const hssize_t *v1, const hssize_t *v2)
+{
+    int ret_value=0;    /* Return value */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (v1 == v2) HGOTO_DONE(0)
+    if (v1 == NULL) HGOTO_DONE(-1)
+    if (v2 == NULL) HGOTO_DONE(1)
+    while (n--) {
+        if (*v1 < *v2) HGOTO_DONE(-1)
+        if (*v1 > *v2) HGOTO_DONE(1)
+        v1++;
+        v2++;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_vector_inc
+ *
+ * Purpose:     Increments V1 by V2
+ *
+ * Return:      void
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, October 13, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE void H5_ATTR_UNUSED
+H5VM_vector_inc(int n, hsize_t *v1, const hsize_t *v2)
+{
+    while (n--) *v1++ += *v2++;
+}
+
+/* Lookup table for general log2(n) routine */
+static const unsigned char LogTable256[] =
+{
+    0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_log2_gen
+ *
+ * Purpose:     Determines the log base two of a number (i.e. log2(n)).
+ *              (i.e. the highest bit set in a number)
+ *
+ * Note:        This is from the "Bit Twiddling Hacks" at:
+ *                  http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup
+ *
+ *              The version on the web-site is for 32-bit quantities and this
+ *              version has been extended for 64-bit quantities.
+ *
+ * Return:      log2(n) (always - no failure condition)
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, March  6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE unsigned H5_ATTR_UNUSED
+H5VM_log2_gen(uint64_t n)
+{
+    unsigned r;                         /* r will be log2(n) */
+    register unsigned int t, tt, ttt;   /* temporaries */
+
+    if((ttt = (unsigned)(n >> 32)))
+        if((tt = (unsigned)(n >> 48)))
+            r = (t = (unsigned)(n >> 56)) ? 56 + (unsigned)LogTable256[t] : 48 + (unsigned)LogTable256[tt & 0xFF];
+        else
+            r = (t = (unsigned)(n >> 40)) ? 40 + (unsigned)LogTable256[t] : 32 + (unsigned)LogTable256[ttt & 0xFF];
+    else
+        if((tt = (unsigned)(n >> 16)))
+            r = (t = (unsigned)(n >> 24)) ? 24 + (unsigned)LogTable256[t] : 16 + (unsigned)LogTable256[tt & 0xFF];
+        else
+            /* Added 'uint8_t' cast to pacify PGCC compiler */
+            r = (t = (unsigned)(n >> 8)) ? 8 + (unsigned)LogTable256[t] : (unsigned)LogTable256[(uint8_t)n];
+
+    return(r);
+} /* H5VM_log2_gen() */
+
+
+/* Lookup table for specialized log2(n) of power of two routine */
+static const unsigned MultiplyDeBruijnBitPosition[32] =
+{
+      0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
+        31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_log2_of2
+ *
+ * Purpose:     Determines the log base two of a number (i.e. log2(n)).
+ *              (i.e. the highest bit set in a number)
+ *
+ * Note:        **N must be a power of two** and is limited to 32-bit quantities.
+ *
+ *              This is from the "Bit Twiddling Hacks" at:
+ *                  http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn
+ *
+ * Return:      log2(n) (always - no failure condition)
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, Febraury 27, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE unsigned H5_ATTR_UNUSED
+H5VM_log2_of2(uint32_t n)
+{
+#ifndef NDEBUG
+    HDassert(POWER_OF_TWO(n));
+#endif /* NDEBUG */
+    return(MultiplyDeBruijnBitPosition[(n * (uint32_t)0x077CB531UL) >> 27]);
+} /* H5VM_log2_of2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_limit_enc_size
+ *
+ * Purpose:     Determine the # of bytes needed to encode values within a
+ *              range from 0 to a given limit
+ *
+ * Return:      Number of bytes needed
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, March 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE unsigned H5_ATTR_UNUSED
+H5VM_limit_enc_size(uint64_t limit)
+{
+    return (H5VM_log2_gen(limit) / 8) + 1;
+} /* end H5VM_limit_enc_size() */
+
+static const unsigned char H5VM_bit_set_g[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+static const unsigned char H5VM_bit_clear_g[8] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_bit_get
+ *
+ * Purpose:     Determine the value of the n'th bit in a buffer.
+ *
+ * Note:	No range checking on <offset> is performed!
+ *
+ * Note #2:	Bits are sequentially stored in the buffer, starting with bit
+ *              offset 0 in the first byte's high-bit position, proceeding down
+ *              to bit offset 7 in the first byte's low-bit position, then to
+ *              bit offset 8 in the second byte's high-bit position, etc.
+ *
+ * Return:      TRUE/FALSE
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, November 25, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE hbool_t H5_ATTR_UNUSED
+H5VM_bit_get(const unsigned char *buf, size_t offset)
+{
+    /* Test the appropriate bit in the buffer */
+    return (hbool_t)((buf[offset / 8] & (H5VM_bit_set_g[offset % 8])) ? TRUE : FALSE);
+} /* end H5VM_bit_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5VM_bit_set
+ *
+ * Purpose:     Set/reset the n'th bit in a buffer.
+ *
+ * Note:	No range checking on <offset> is performed!
+ *
+ * Note #2:	Bits are sequentially stored in the buffer, starting with bit
+ *              offset 0 in the first byte's high-bit position, proceeding down
+ *              to bit offset 7 in the first byte's low-bit position, then to
+ *              bit offset 8 in the second byte's high-bit position, etc.
+ *
+ * Return:      None
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, November 25, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE void H5_ATTR_UNUSED
+H5VM_bit_set(unsigned char *buf, size_t offset, hbool_t val)
+{
+    /* Set/reset the appropriate bit in the buffer */
+    if(val)
+        buf[offset / 8] |= H5VM_bit_set_g[offset % 8];
+    else
+        buf[offset / 8] &= H5VM_bit_clear_g[offset % 8];
+} /* end H5VM_bit_set() */
+
+#endif /* H5VMprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5WB.c b/gatb-core/thirdparty/hdf5/src/H5WB.c
new file mode 100644
index 0000000..978ded4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5WB.c
@@ -0,0 +1,291 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5WB.c
+ *			Jun 26 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implements the "wrapped buffer" code for wrapping
+ *                      an existing [staticly sized] buffer, in order to
+ *                      avoid lots of memory allocation calls.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+/* Typedef for buffer wrapper */
+struct H5WB_t {
+    void *wrapped_buf;          /* Pointer to wrapped buffer */
+    size_t wrapped_size;        /* Size of wrapped buffer */
+    void *actual_buf;           /* Pointer to actual buffer */
+    size_t actual_size;         /* Size of actual buffer used */
+    size_t alloc_size;          /* Size of actual buffer allocated */
+};
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5WB_t struct */
+H5FL_DEFINE_STATIC(H5WB_t);
+
+/* Declare a free list to manage the extra buffer information */
+H5FL_BLK_DEFINE_STATIC(extra_buf);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5WB_wrap
+ *
+ * Purpose:	Wraps an existing [possibly static] buffer
+ *
+ * Return:	Pointer to buffer wrapper info on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 26 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+H5WB_t *
+H5WB_wrap(void *buf, size_t buf_size)
+{
+    H5WB_t *wb = NULL;          /* Wrapped buffer info */
+    H5WB_t *ret_value;          /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(buf);
+    HDassert(buf_size);
+
+    /* Create wrapped buffer info */
+    if(NULL == (wb = H5FL_MALLOC(H5WB_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for wrapped buffer info")
+
+    /* Wrap buffer given */
+    wb->wrapped_buf = buf;
+    wb->wrapped_size = buf_size;
+
+    /* No actual buffer yet */
+    wb->actual_buf = NULL;
+    wb->actual_size = 0;
+    wb->alloc_size = 0;
+
+    /* Set the return value */
+    ret_value = wb;
+
+done:
+    /* Release resources on error */
+    if(!ret_value && wb)
+        wb = H5FL_FREE(H5WB_t, wb);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5WB_wrap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5WB_actual
+ *
+ * Purpose:	Get the pointer to an "actual" buffer, of at least a certain
+ *              size.
+ *
+ * Return:	Pointer to buffer pointer on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 26 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5WB_actual(H5WB_t *wb, size_t need)
+{
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(wb);
+    HDassert(wb->wrapped_buf);
+
+    /* Check for previously allocated buffer */
+    if(wb->actual_buf && wb->actual_buf != wb->wrapped_buf) {
+        /* Sanity check */
+        HDassert(wb->actual_size > wb->wrapped_size);
+
+        /* Check if we can re-use existing buffer */
+        if(need <= wb->alloc_size)
+            HGOTO_DONE(wb->actual_buf)
+        /* Can't re-use existing buffer, free it and proceed */
+        else
+            wb->actual_buf = H5FL_BLK_FREE(extra_buf, wb->actual_buf);
+    } /* end if */
+
+    /* Check if size needed can be fulfilled with wrapped buffer */
+    if(need > wb->wrapped_size) {
+        /* Need to allocate new buffer */
+        if(NULL == (wb->actual_buf = H5FL_BLK_MALLOC(extra_buf, need)))
+            HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, NULL, "memory allocation failed")
+
+        /* Remember size of buffer allocated */
+        wb->alloc_size = need;
+    } /* end if */
+    else {
+        /* Don't have to allocate a new buffer, use the wrapped one */
+        wb->actual_buf = wb->wrapped_buf;
+        wb->alloc_size = 0;
+    } /* end else */
+
+    /* Set the return value */
+    ret_value = wb->actual_buf;
+
+done:
+    /* Remember size of buffer used, if we were successful */
+    if(ret_value)
+        wb->actual_size = need;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5WB_actual() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5WB_actual_clear
+ *
+ * Purpose:	Get the pointer to an "actual" buffer, of at least a certain
+ *              size.  Also, clear actual buffer to zeros.
+ *
+ * Return:	Pointer to buffer pointer on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 26 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5WB_actual_clear(H5WB_t *wb, size_t need)
+{
+    void *ret_value;            /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(wb);
+    HDassert(wb->wrapped_buf);
+
+    /* Get a pointer to an actual buffer */
+    if(NULL == (ret_value = H5WB_actual(wb, need)))
+        HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* Clear the buffer */
+    HDmemset(ret_value, 0, need);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5WB_actual_clear() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5WB_unwrap
+ *
+ * Purpose:	"unwrap" a wrapped buffer, releasing all resources used
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 26 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5WB_unwrap(H5WB_t *wb)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(wb);
+    HDassert(wb->wrapped_buf);
+
+    /* Release any extra buffers allocated */
+    if(wb->actual_buf && wb->actual_buf != wb->wrapped_buf) {
+        /* Sanity check */
+        HDassert(wb->actual_size > wb->wrapped_size);
+
+        wb->actual_buf = H5FL_BLK_FREE(extra_buf, wb->actual_buf);
+    } /* end if */
+
+    /* Release the buffer wrapper info */
+    wb = H5FL_FREE(H5WB_t, wb);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5WB_unwrap() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5WBprivate.h b/gatb-core/thirdparty/hdf5/src/H5WBprivate.h
new file mode 100644
index 0000000..cfa3fcb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5WBprivate.h
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5WBprivate.h
+ *			Jun 26 2007
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Private header for library accessible wrapped buffer routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5WBprivate_H
+#define _H5WBprivate_H
+
+/* Include package's public header */
+/* #include "H5WBpublic.h" */
+
+/* Private headers needed by this file */
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Wrapped buffer info (forward decl - defined in H5WB.c) */
+typedef struct H5WB_t H5WB_t;
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General routines for wrapped buffer operations */
+H5_DLL H5WB_t *H5WB_wrap(void *buf, size_t buf_size);
+H5_DLL void *H5WB_actual(H5WB_t *wb, size_t need);
+H5_DLL void *H5WB_actual_clear(H5WB_t *wb, size_t need);
+H5_DLL herr_t H5WB_unwrap(H5WB_t *wb);
+
+#endif /* _H5WBprivate_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Z.c b/gatb-core/thirdparty/hdf5/src/H5Z.c
new file mode 100644
index 0000000..8d85c81
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Z.c
@@ -0,0 +1,1715 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+/* Interface initialization */
+#define H5_INTERFACE_INIT_FUNC	H5Z_init_interface
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File		  			*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5PLprivate.h"        /* Plugins                              */
+#include "H5Sprivate.h"		/* Dataspace functions			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+#ifdef H5_HAVE_SZLIB_H
+#   include "szlib.h"
+#endif
+
+/* Local typedefs */
+#ifdef H5Z_DEBUG
+typedef struct H5Z_stats_t {
+    struct {
+	hsize_t	total;		/*total number of bytes processed	*/
+	hsize_t	errors;		/*bytes of total attributable to errors	*/
+	H5_timer_t timer;	/*execution time including errors	*/
+    } stats[2];			/*0=output, 1=input			*/
+} H5Z_stats_t;
+#endif /* H5Z_DEBUG */
+
+typedef struct H5Z_object_t {
+    H5Z_filter_t filter_id;     /* ID of the filter we're looking for         */
+    htri_t       found;         /* Whether we find an object using the filter */
+} H5Z_object_t;
+
+/* Enumerated type for dataset creation prelude callbacks */
+typedef enum {
+    H5Z_PRELUDE_CAN_APPLY,      /* Call "can apply" callback */
+    H5Z_PRELUDE_SET_LOCAL       /* Call "set local" callback */
+} H5Z_prelude_type_t;
+
+/* Local variables */
+static size_t		H5Z_table_alloc_g = 0;
+static size_t		H5Z_table_used_g = 0;
+static H5Z_class2_t	*H5Z_table_g = NULL;
+#ifdef H5Z_DEBUG
+static H5Z_stats_t	*H5Z_stat_table_g = NULL;
+#endif /* H5Z_DEBUG */
+
+/* Local functions */
+static int H5Z_find_idx(H5Z_filter_t id);
+static int H5Z__check_unregister_dset_cb(void *obj_ptr, hid_t obj_id, void *key);
+static int H5Z__check_unregister_group_cb(void *obj_ptr, hid_t obj_id, void *key);
+static int H5Z__flush_file_cb(void *obj_ptr, hid_t obj_id, void *key);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_init_interface
+ *
+ * Purpose:	Initializes the data filter layer.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_init_interface (void)
+{
+    herr_t	ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Internal filters */
+    if (H5Z_register (H5Z_SHUFFLE)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register shuffle filter")
+    if (H5Z_register (H5Z_FLETCHER32)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register fletcher32 filter")
+    if (H5Z_register (H5Z_NBIT)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register nbit filter")
+    if (H5Z_register (H5Z_SCALEOFFSET)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register scaleoffset filter")
+
+    /* External filters */
+#ifdef H5_HAVE_FILTER_DEFLATE
+    if (H5Z_register (H5Z_DEFLATE)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register deflate filter")
+#endif /* H5_HAVE_FILTER_DEFLATE */
+#ifdef H5_HAVE_FILTER_SZIP
+    H5Z_SZIP->encoder_present = SZ_encoder_enabled();
+    if (H5Z_register (H5Z_SZIP)<0)
+        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register szip filter")
+#endif /* H5_HAVE_FILTER_SZIP */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_term_interface
+ *
+ * Purpose:	Terminate the H5Z layer.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Z_term_interface(void)
+{
+#ifdef H5Z_DEBUG
+    size_t	i;
+    int		dir, nprint=0;
+    char	comment[16], bandwidth[32];
+#endif
+
+    if(H5_interface_initialize_g) {
+#ifdef H5Z_DEBUG
+	if (H5DEBUG(Z)) {
+	    for (i=0; i<H5Z_table_used_g; i++) {
+		for (dir=0; dir<2; dir++) {
+		    if (0==H5Z_stat_table_g[i].stats[dir].total) continue;
+
+		    if (0==nprint++) {
+			/* Print column headers */
+			HDfprintf (H5DEBUG(Z), "H5Z: filter statistics "
+				   "accumulated over life of library:\n");
+			HDfprintf (H5DEBUG(Z),
+				   "   %-16s %10s %10s %8s %8s %8s %10s\n",
+				   "Filter", "Total", "Errors", "User",
+				   "System", "Elapsed", "Bandwidth");
+			HDfprintf (H5DEBUG(Z),
+				   "   %-16s %10s %10s %8s %8s %8s %10s\n",
+				   "------", "-----", "------", "----",
+				   "------", "-------", "---------");
+		    }
+
+		    /* Truncate the comment to fit in the field */
+		    HDstrncpy(comment, H5Z_table_g[i].name,
+			      sizeof comment);
+		    comment[sizeof(comment)-1] = '\0';
+
+		    /*
+		     * Format bandwidth to have four significant digits and
+		     * units of `B/s', `kB/s', `MB/s', `GB/s', or `TB/s' or
+		     * the word `Inf' if the elapsed time is zero.
+		     */
+		    H5_bandwidth(bandwidth,
+				 (double)(H5Z_stat_table_g[i].stats[dir].total),
+				 H5Z_stat_table_g[i].stats[dir].timer.etime);
+
+		    /* Print the statistics */
+		    HDfprintf (H5DEBUG(Z),
+			       "   %s%-15s %10Hd %10Hd %8.2f %8.2f %8.2f "
+			       "%10s\n", dir?"<":">", comment,
+			       H5Z_stat_table_g[i].stats[dir].total,
+			       H5Z_stat_table_g[i].stats[dir].errors,
+			       H5Z_stat_table_g[i].stats[dir].timer.utime,
+			       H5Z_stat_table_g[i].stats[dir].timer.stime,
+			       H5Z_stat_table_g[i].stats[dir].timer.etime,
+			       bandwidth);
+		}
+	    }
+	}
+#endif /* H5Z_DEBUG */
+	/* Free the table of filters */
+	H5Z_table_g = (H5Z_class2_t *)H5MM_xfree(H5Z_table_g);
+#ifdef H5Z_DEBUG
+	H5Z_stat_table_g = (H5Z_stats_t *)H5MM_xfree(H5Z_stat_table_g);
+#endif /* H5Z_DEBUG */
+	H5Z_table_used_g = H5Z_table_alloc_g = 0;
+	H5_interface_initialize_g = 0;
+    } /* end if */
+
+    return(0);
+} /* end H5Z_term_interface() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Zregister
+ *
+ * Purpose:	This function registers new filter.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ * Modifications:
+ *              Changed to pass in H5Z_class_t struct
+ *              Quincey Koziol, April  5, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Zregister(const void *cls)
+{
+    const H5Z_class2_t  *cls_real = (const H5Z_class2_t *) cls; /* "Real" class pointer */
+    H5Z_class2_t        cls_new;                /* Translated class struct */
+    herr_t              ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*x", cls);
+
+    /* Check args */
+    if (cls_real==NULL)
+	HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter class")
+
+    /* Check H5Z_class_t version number; this is where a function to convert
+     * from an outdated version should be called.
+     *
+     * If the version number is invalid, we assume that the target of cls is the
+     * old style "H5Z_class1_t" structure, which did not contain a version
+     * field.  In this structure, the first field is the id.  Since both version
+     * and id are integers they will have the same value, and since id must be
+     * at least 256, there should be no overlap and the version of the struct
+     * can be determined by the value of the first field.
+     */
+    if(cls_real->version != H5Z_CLASS_T_VERS) {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        /* Assume it is an old "H5Z_class1_t" instead */
+        const H5Z_class1_t *cls_old = (const H5Z_class1_t *) cls;
+
+        /* Translate to new H5Z_class2_t */
+        cls_new.version = H5Z_CLASS_T_VERS;
+        cls_new.id = cls_old->id;
+        cls_new.encoder_present = 1;
+        cls_new.decoder_present = 1;
+        cls_new.name = cls_old->name;
+        cls_new.can_apply = cls_old->can_apply;
+        cls_new.set_local = cls_old->set_local;
+        cls_new.filter = cls_old->filter;
+
+        /* Set cls_real to point to the translated structure */
+        cls_real = &cls_new;
+
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+        /* Deprecated symbols not allowed, throw an error */
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid H5Z_class_t version number");
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    } /* end if */
+
+    if (cls_real->id<0 || cls_real->id>H5Z_FILTER_MAX)
+	HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identification number")
+    if (cls_real->id<H5Z_FILTER_RESERVED)
+	HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "unable to modify predefined filters")
+    if (cls_real->filter==NULL)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no filter function specified")
+
+    /* Do it */
+    if (H5Z_register (cls_real)<0)
+	HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register filter")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_register
+ *
+ * Purpose:	Same as the public version except this one allows filters
+ *		to be set for predefined method numbers <H5Z_FILTER_RESERVED
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_register (const H5Z_class2_t *cls)
+{
+    size_t	i;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cls);
+    HDassert(cls->id >= 0 && cls->id <= H5Z_FILTER_MAX);
+
+    /* Is the filter already registered? */
+    for(i = 0; i < H5Z_table_used_g; i++)
+	if(H5Z_table_g[i].id == cls->id)
+            break;
+
+    /* Filter not already registered */
+    if(i >= H5Z_table_used_g) {
+	if(H5Z_table_used_g >= H5Z_table_alloc_g) {
+	    size_t n = MAX(H5Z_MAX_NFILTERS, 2*H5Z_table_alloc_g);
+	    H5Z_class2_t *table = (H5Z_class2_t *)H5MM_realloc(H5Z_table_g, n * sizeof(H5Z_class2_t));
+#ifdef H5Z_DEBUG
+	    H5Z_stats_t *stat_table = (H5Z_stats_t *)H5MM_realloc(H5Z_stat_table_g, n * sizeof(H5Z_stats_t));
+#endif /* H5Z_DEBUG */
+	    if(!table)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend filter table")
+	    H5Z_table_g = table;
+#ifdef H5Z_DEBUG
+	    if(!stat_table)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend filter statistics table")
+	    H5Z_stat_table_g = stat_table;
+#endif /* H5Z_DEBUG */
+	    H5Z_table_alloc_g = n;
+	} /* end if */
+
+	/* Initialize */
+	i = H5Z_table_used_g++;
+	HDmemcpy(H5Z_table_g+i, cls, sizeof(H5Z_class2_t));
+#ifdef H5Z_DEBUG
+	HDmemset(H5Z_stat_table_g+i, 0, sizeof(H5Z_stats_t));
+#endif /* H5Z_DEBUG */
+    } /* end if */
+    /* Filter already registered */
+    else {
+	/* Replace old contents */
+	HDmemcpy(H5Z_table_g+i, cls, sizeof(H5Z_class2_t));
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Zunregister
+ *
+ * Purpose:	This function unregisters a filter.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 14, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Zunregister(H5Z_filter_t id)
+{
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "Zf", id);
+
+    /* Check args */
+    if(id < 0 || id > H5Z_FILTER_MAX)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identification number")
+    if(id < H5Z_FILTER_RESERVED)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to modify predefined filters")
+
+    /* Do it */
+    if(H5Z_unregister(id) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to unregister filter")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Zunregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_unregister
+ *
+ * Purpose:	Same as the public version except this one allows filters
+ *		to be unset for predefined method numbers <H5Z_FILTER_RESERVED
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 14, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_unregister(H5Z_filter_t filter_id)
+{
+    size_t       filter_index;        /* Local index variable for filter */
+    H5Z_object_t object;
+    herr_t       ret_value=SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(filter_id>=0 && filter_id<=H5Z_FILTER_MAX);
+
+    /* Is the filter already registered? */
+    for (filter_index=0; filter_index<H5Z_table_used_g; filter_index++)
+	if (H5Z_table_g[filter_index].id==filter_id)
+            break;
+
+    /* Fail if filter not found */
+    if (filter_index>=H5Z_table_used_g)
+        HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, FAIL, "filter is not registered")
+
+    /* Initialize the structure object for iteration */
+    object.filter_id = filter_id;
+    object.found = FALSE;
+
+    /* Iterate through all opened datasets, returns a failure if any of them uses the filter */
+    if(H5I_iterate(H5I_DATASET, H5Z__check_unregister_dset_cb, &object, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed")
+
+    if(object.found)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTRELEASE, FAIL, "can't unregister filter because a dataset is still using it")
+
+    /* Iterate through all opened groups, returns a failure if any of them uses the filter */
+    if(H5I_iterate(H5I_GROUP, H5Z__check_unregister_group_cb, &object, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed")
+
+    if(object.found)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTRELEASE, FAIL, "can't unregister filter because a group is still using it")
+
+    /* Iterate through all opened files and flush them */
+    if(H5I_iterate(H5I_FILE, H5Z__flush_file_cb, NULL, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_BADITER, FAIL, "iteration failed")
+
+    /* Remove filter from table */
+    /* Don't worry about shrinking table size (for now) */
+    HDmemmove(&H5Z_table_g[filter_index],&H5Z_table_g[filter_index+1],sizeof(H5Z_class2_t)*((H5Z_table_used_g-1)-filter_index));
+#ifdef H5Z_DEBUG
+    HDmemmove(&H5Z_stat_table_g[filter_index],&H5Z_stat_table_g[filter_index+1],sizeof(H5Z_stats_t)*((H5Z_table_used_g-1)-filter_index));
+#endif /* H5Z_DEBUG */
+    H5Z_table_used_g--;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_unregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z__check_unregister
+ *
+ * Purpose:	Check if an object uses the filter to be unregistered.
+ *
+ * Return:      TRUE if the object uses the filter.
+ *              FALSE if not, NEGATIVE on error.
+ *
+ * Programmer:  Quincey Koziol
+ *              11 May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5Z__check_unregister(hid_t ocpl_id, H5Z_filter_t filter_id)
+{
+    H5P_genplist_t  *plist;                 /* Property list */
+    htri_t          ret_value = FALSE;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the plist structure of object creation */
+    if(NULL == (plist = H5P_object_verify(ocpl_id, H5P_OBJECT_CREATE)))
+        HGOTO_ERROR(H5E_PLINE, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Check if the object creation property list uses the filter */
+    if((ret_value = H5P_filter_in_pline(plist, filter_id)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't check filter in pipeline")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z__check_unregister() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z__check_unregister_group_cb
+ *
+ * Purpose:	The callback function for H5Z_unregister. It iterates 
+ *              through all opened objects.  If the object is a dataset
+ *              or a group and it uses the filter to be unregistered, the 
+ *              function returns TRUE. 
+ *
+ * Return:      TRUE if the object uses the filter.
+ *              FALSE otherwise.
+ *
+ * Programmer:  Raymond Lu
+ *              6 May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5Z__check_unregister_group_cb(void *obj_ptr, hid_t H5_ATTR_UNUSED obj_id, void *key)
+{
+    hid_t           ocpl_id = -1;
+    H5Z_object_t    *object = (H5Z_object_t *)key;
+    htri_t          filter_in_pline = FALSE;
+    int             ret_value = FALSE;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(obj_ptr);
+
+    /* Get the group creation property */
+    if((ocpl_id = H5G_get_create_plist((H5G_t *)obj_ptr)) < 0) 
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get group creation property list")
+
+    /* Check if the filter is in the group creation property list */
+    if((filter_in_pline = H5Z__check_unregister(ocpl_id, object->filter_id)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't check filter in pipeline")
+
+    /* H5I_iterate expects TRUE to stop the loop over objects. Stop the loop and
+     * let H5Z_unregister return failure.
+     */ 
+    if(filter_in_pline) {
+        object->found = TRUE;
+        ret_value = TRUE;
+    } /* end if */
+
+done:
+    if(ocpl_id > 0)
+        if(H5I_dec_app_ref(ocpl_id) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CANTDEC, FAIL, "can't release plist")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z__check_unregister_group_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z__check_unregister_dset_cb
+ *
+ * Purpose:	The callback function for H5Z_unregister. It iterates 
+ *              through all opened objects.  If the object is a dataset
+ *              or a group and it uses the filter to be unregistered, the 
+ *              function returns TRUE. 
+ *
+ * Return:      TRUE if the object uses the filter.
+ *              FALSE otherwise.
+ *
+ * Programmer:  Raymond Lu
+ *              6 May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5Z__check_unregister_dset_cb(void *obj_ptr, hid_t H5_ATTR_UNUSED obj_id, void *key)
+{
+    hid_t           ocpl_id = -1;
+    H5Z_object_t    *object = (H5Z_object_t *)key;
+    htri_t          filter_in_pline = FALSE;
+    int             ret_value = FALSE;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(obj_ptr);
+
+    /* Get the dataset creation property */
+    if((ocpl_id = H5D_get_create_plist((H5D_t *)obj_ptr)) < 0) 
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get dataset creation property list")
+
+    /* Check if the filter is in the dataset creation property list */
+    if((filter_in_pline = H5Z__check_unregister(ocpl_id, object->filter_id)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't check filter in pipeline")
+
+    /* H5I_iterate expects TRUE to stop the loop over objects. Stop the loop and
+     * let H5Z_unregister return failure.
+     */ 
+    if(filter_in_pline) {
+        object->found = TRUE;
+        ret_value = TRUE;
+    } /* end if */
+
+done:
+    if(ocpl_id > 0)
+        if(H5I_dec_app_ref(ocpl_id) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CANTDEC, FAIL, "can't release plist")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z__check_unregister_dset_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z__flush_file_cb
+ *
+ * Purpose:	The callback function for H5Z_unregister. It iterates 
+ *              through all opened files and flush them. 
+ *
+ * Return:      FALSE if finishes flushing and moves on
+ *              FAIL if there is an error
+ *
+ * Programmer:  Raymond Lu
+ *              6 May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5Z__flush_file_cb(void *obj_ptr, hid_t H5_ATTR_UNUSED obj_id, void H5_ATTR_UNUSED *key)
+{
+    int             ret_value = FALSE;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(obj_ptr);
+
+    /* Call the flush routine for mounted file hierarchies. Do a global flush 
+     * if the file is opened for write */
+    if(H5F_ACC_RDWR & H5F_INTENT((H5F_t *)obj_ptr)) {
+        if(H5F_flush_mounts((H5F_t *)obj_ptr, H5AC_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFLUSH, FAIL, "unable to flush file hierarchy")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z__flush_file_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Zfilter_avail
+ *
+ * Purpose:	Check if a filter is available
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 14, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Zfilter_avail(H5Z_filter_t id)
+{
+    htri_t ret_value=FALSE;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "Zf", id);
+
+    /* Check args */
+    if(id<0 || id>H5Z_FILTER_MAX)
+        HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identification number")
+ 
+    if((ret_value = H5Z_filter_avail(id)) < 0)
+    	HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, FAIL, "unable to check the availability of the filter")
+    else if(ret_value == FALSE) {
+        const H5Z_class2_t *filter_info;
+
+        if(NULL != (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)id)))
+        	ret_value = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Zfilter_avail() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_avail
+ *
+ * Purpose:	Private function to check if a filter is available
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Raymond Lu
+ *              13 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Z_filter_avail(H5Z_filter_t id)
+{
+    size_t i;                   /* Local index variable */
+    htri_t ret_value = FALSE;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Is the filter already registered? */
+    for(i = 0; i < H5Z_table_used_g; i++)
+	if(H5Z_table_g[i].id == id)
+	    HGOTO_DONE(TRUE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_filter_avail() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_prelude_callback
+ *
+ * Purpose:	Makes a dataset creation "prelude" callback for the "can_apply"
+ *              or "set_local" routines.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April 4, 2003
+ *
+ * Notes:
+ *              The chunk dimensions are used to create a dataspace, instead
+ *              of passing in the dataset's dataspace, since the chunk
+ *              dimensions are what the I/O filter will actually see
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_prelude_callback(const H5O_pline_t *pline, hid_t dcpl_id, hid_t type_id,
+    hid_t space_id, H5Z_prelude_type_t prelude_type)
+{
+    H5Z_class2_t    *fclass;                /* Individual filter information */
+    size_t          u;                      /* Local index variable */
+    htri_t          ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pline->nused > 0);
+
+    /* Iterate over filters */
+    for(u = 0; u < pline->nused; u++) {
+        /* Get filter information */
+        if(NULL == (fclass = H5Z_find(pline->filter[u].id))) {
+            /* Ignore errors from optional filters */
+            if(pline->filter[u].flags & H5Z_FLAG_OPTIONAL)
+                H5E_clear_stack(NULL);
+            else
+                HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, FAIL, "required filter was not located")
+        } /* end if */
+        else {
+            /* Make correct callback */
+            switch(prelude_type) {
+                case H5Z_PRELUDE_CAN_APPLY:
+                    /* Check if filter is configured to be able to encode */
+                    if(!fclass->encoder_present)
+                        HGOTO_ERROR(H5E_PLINE, H5E_NOENCODER, FAIL, "Filter present but encoding is disabled.");
+
+
+                    /* Check if there is a "can apply" callback */
+                    if(fclass->can_apply) {
+                        /* Make callback to filter's "can apply" function */
+                        htri_t status = (fclass->can_apply)(dcpl_id, type_id, space_id);
+
+                        /* Indicate error during filter callback */
+                        if(status < 0)
+                            HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "error during user callback")
+
+                        /* Indicate filter can't apply to this combination of parameters.  
+                         * If the filter is NOT optional, returns failure. */
+                        if(status == FALSE && !(pline->filter[u].flags & H5Z_FLAG_OPTIONAL))
+                            HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "filter parameters not appropriate")
+                    } /* end if */
+                    break;
+
+                case H5Z_PRELUDE_SET_LOCAL:
+                    /* Check if there is a "set local" callback */
+                    if(fclass->set_local) {
+                        /* Make callback to filter's "set local" function */
+                        if((fclass->set_local)(dcpl_id, type_id, space_id) < 0)
+                            /* Indicate error during filter callback */
+                            HGOTO_ERROR(H5E_PLINE, H5E_SETLOCAL, FAIL, "error during user callback")
+                    } /* end if */
+                    break;
+
+                default:
+                    HDassert("invalid prelude type" && 0);
+            } /* end switch */
+        } /* end else */
+    } /* end for */
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_prelude_callback() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_prepare_prelude_callback_dcpl
+ *
+ * Purpose:	Prepares to make a dataset creation "prelude" callback
+ *              for the "can_apply" or "set_local" routines.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April 4, 2003
+ *
+ * Notes:
+ *              The chunk dimensions are used to create a dataspace, instead
+ *              of passing in the dataset's dataspace, since the chunk
+ *              dimensions are what the I/O filter will actually see
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_prepare_prelude_callback_dcpl(hid_t dcpl_id, hid_t type_id, H5Z_prelude_type_t prelude_type)
+{
+    hid_t space_id = -1;            /* ID for dataspace describing chunk */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(H5I_GENPROP_LST == H5I_get_type(dcpl_id));
+    HDassert(H5I_DATATYPE == H5I_get_type(type_id));
+
+    /* Check if the property list is non-default */
+    if(dcpl_id != H5P_DATASET_CREATE_DEFAULT) {
+        H5P_genplist_t 	*dc_plist;      /* Dataset creation property list object */
+        H5O_layout_t    dcpl_layout;    /* Dataset's layout information */
+
+        /* Get dataset creation property list object */
+        if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
+
+        /* Get layout information */
+        if(H5P_get(dc_plist, H5D_CRT_LAYOUT_NAME, &dcpl_layout) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve layout")
+
+        /* Check if the dataset is chunked */
+        if(H5D_CHUNKED == dcpl_layout.type) {
+            H5O_pline_t     dcpl_pline;     /* Object's I/O pipeline information */
+
+            /* Get I/O pipeline information */
+            if(H5P_get(dc_plist, H5O_CRT_PIPELINE_NAME, &dcpl_pline) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve pipeline filter")
+
+            /* Check if the chunks have filters */
+            if(dcpl_pline.nused > 0) {
+                hsize_t chunk_dims[H5O_LAYOUT_NDIMS];      /* Size of chunk dimensions */
+                H5S_t *space;           /* Dataspace describing chunk */
+                size_t u;               /* Local index variable */
+
+                /* Create a dataspace for a chunk & set the extent */
+                for(u = 0; u < dcpl_layout.u.chunk.ndims; u++)
+                    chunk_dims[u] = dcpl_layout.u.chunk.dim[u];
+                if(NULL == (space = H5S_create_simple(dcpl_layout.u.chunk.ndims, chunk_dims, NULL)))
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
+
+                /* Get ID for dataspace to pass to filter routines */
+                if((space_id = H5I_register(H5I_DATASPACE, space, FALSE)) < 0) {
+                    (void)H5S_close(space);
+                    HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+                } /* end if */
+
+                /* Make the callbacks */
+                if(H5Z_prelude_callback(&dcpl_pline, dcpl_id, type_id, space_id, prelude_type) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "unable to apply filter")
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    if(space_id > 0 && H5I_dec_ref(space_id) < 0)
+        HDONE_ERROR(H5E_PLINE, H5E_CANTRELEASE, FAIL, "unable to close dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_prepare_prelude_callback_dcpl() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_can_apply
+ *
+ * Purpose:	Checks if all the filters defined in the dataset creation
+ *              property list can be applied to a particular combination of
+ *              datatype and dataspace for a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, April 3, 2003
+ *
+ * Notes:
+ *              The chunk dimensions are used to create a dataspace, instead
+ *              of passing in the dataset's dataspace, since the chunk
+ *              dimensions are what the I/O filter will actually see
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_can_apply(hid_t dcpl_id, hid_t type_id)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Make "can apply" callbacks for filters in pipeline */
+    if(H5Z_prepare_prelude_callback_dcpl(dcpl_id, type_id, H5Z_PRELUDE_CAN_APPLY) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "unable to apply filter")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_can_apply() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local
+ *
+ * Purpose:	Makes callbacks to modify dataset creation list property
+ *              settings for filters on a new dataset, based on the datatype
+ *              and dataspace of that dataset (chunk).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April 4, 2003
+ *
+ * Notes:
+ *              The chunk dimensions are used to create a dataspace, instead
+ *              of passing in the dataset's dataspace, since the chunk
+ *              dimensions are what the I/O filter will actually see
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_set_local(hid_t dcpl_id, hid_t type_id)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Make "set local" callbacks for filters in pipeline */
+    if(H5Z_prepare_prelude_callback_dcpl(dcpl_id, type_id, H5Z_PRELUDE_SET_LOCAL) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_SETLOCAL, FAIL, "local filter parameters not set")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_can_apply_direct
+ *
+ * Purpose:	Checks if all the filters defined in the pipeline can be
+ *              applied to an opaque byte stream (currently only a group).
+ *              The pipeline is assumed to have at least one filter.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *              Tuesday, September 22, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_can_apply_direct(const H5O_pline_t *pline)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pline->nused > 0);
+
+    /* Make "can apply" callbacks for filters in pipeline */
+    if(H5Z_prelude_callback(pline, (hid_t)-1, (hid_t)-1, (hid_t)-1, H5Z_PRELUDE_CAN_APPLY) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANAPPLY, FAIL, "unable to apply filter")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_can_apply_direct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local_direct
+ *
+ * Purpose:	Makes callbacks to modify local settings for filters on a
+ *              new opaque object.  The pipeline is assumed to have at
+ *              least one filter.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Neil Fortner
+ *              Tuesday, September 22, 2009
+ *
+ * Notes:
+ *              This callback will almost certainly not do anything
+ *              useful, other than to make certain that the filter will
+ *              accept opque data.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_set_local_direct(const H5O_pline_t *pline)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pline->nused > 0);
+
+    /* Make "set local" callbacks for filters in pipeline */
+    if(H5Z_prelude_callback(pline, (hid_t)-1, (hid_t)-1, (hid_t)-1, H5Z_PRELUDE_SET_LOCAL) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_SETLOCAL, FAIL, "local filter parameters not set")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local_direct() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_modify
+ *
+ * Purpose:	Modify filter parameters for specified pipeline.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_modify(const H5O_pline_t *pline, H5Z_filter_t filter, unsigned flags,
+	   size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/])
+{
+    size_t	idx;                    /* Index of filter in pipeline */
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pline);
+    HDassert(filter >= 0 && filter <= H5Z_FILTER_MAX);
+    HDassert(0 == (flags & ~((unsigned)H5Z_FLAG_DEFMASK)));
+    HDassert(0 == cd_nelmts || cd_values);
+
+    /* Locate the filter in the pipeline */
+    for(idx = 0; idx < pline->nused; idx++)
+        if(pline->filter[idx].id == filter)
+            break;
+
+    /* Check if the filter was not already in the pipeline */
+    if(idx > pline->nused)
+	HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, FAIL, "filter not in pipeline")
+
+    /* Change parameters for filter */
+    pline->filter[idx].flags = flags;
+    pline->filter[idx].cd_nelmts = cd_nelmts;
+
+    /* Free any existing parameters */
+    if(pline->filter[idx].cd_values != NULL && pline->filter[idx].cd_values != pline->filter[idx]._cd_values)
+	H5MM_xfree(pline->filter[idx].cd_values);
+
+    /* Set parameters */
+    if(cd_nelmts > 0) {
+        size_t	i;                      /* Local index variable */
+
+        /* Allocate memory or point at internal buffer */
+        if(cd_nelmts > H5Z_COMMON_CD_VALUES) {
+            pline->filter[idx].cd_values = (unsigned *)H5MM_malloc(cd_nelmts * sizeof(unsigned));
+            if(NULL == pline->filter[idx].cd_values)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for filter parameters")
+        } /* end if */
+        else
+            pline->filter[idx].cd_values = pline->filter[idx]._cd_values;
+
+        /* Copy client data values */
+	for(i = 0; i < cd_nelmts; i++)
+	    pline->filter[idx].cd_values[i] = cd_values[i];
+    } /* end if */
+    else
+       pline->filter[idx].cd_values = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_modify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_append
+ *
+ * Purpose:	Append another filter to the specified pipeline.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_append(H5O_pline_t *pline, H5Z_filter_t filter, unsigned flags,
+	   size_t cd_nelmts, const unsigned int cd_values[/*cd_nelmts*/])
+{
+    size_t	idx;
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pline);
+    HDassert(filter >= 0 && filter <= H5Z_FILTER_MAX);
+    HDassert(0 == (flags & ~((unsigned)H5Z_FLAG_DEFMASK)));
+    HDassert(0 == cd_nelmts || cd_values);
+
+    /*
+     * Check filter limit.  We do it here for early warnings although we may
+     * decide to relax this restriction in the future.
+     */
+    if(pline->nused >= H5Z_MAX_NFILTERS)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "too many filters in pipeline")
+
+    /* Check for freshly allocated filter pipeline */
+    if(pline->version == 0)
+        pline->version = H5O_PLINE_VERSION_1;
+
+    /* Allocate additional space in the pipeline if it's full */
+    if(pline->nused >= pline->nalloc) {
+	H5O_pline_t x;
+        size_t n;
+
+        /* Each filter's data may be stored internally or may be
+         * a separate block of memory.
+         * For each filter, if cd_values points to the internal array
+         * _cd_values, the pointer will need to be updated when the
+         * filter struct is reallocated.  Set these pointers to ~NULL
+         * so that we can reset them after reallocating the filters array.
+         */
+        for(n = 0; n < pline->nalloc; ++n)
+            if(pline->filter[n].cd_values == pline->filter[n]._cd_values)
+                pline->filter[n].cd_values = (unsigned *)((void *) ~((size_t)NULL));
+
+	x.nalloc = MAX(H5Z_MAX_NFILTERS, 2 * pline->nalloc);
+	x.filter = (H5Z_filter_info_t *)H5MM_realloc(pline->filter, x.nalloc * sizeof(x.filter[0]));
+	if(NULL == x.filter)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for filter pipeline")
+
+        /* Fix pointers in previous filters that need to point to their own
+         *      internal data.
+         */
+        for(n = 0; n < pline->nalloc; ++n)
+            if(x.filter[n].cd_values == (void *) ~((size_t) NULL))
+                x.filter[n].cd_values = x.filter[n]._cd_values;
+
+        /* Point to newly allocated buffer */
+	pline->nalloc = x.nalloc;
+	pline->filter = x.filter;
+    } /* end if */
+
+    /* Add the new filter to the pipeline */
+    idx = pline->nused;
+    pline->filter[idx].id = filter;
+    pline->filter[idx].flags = flags;
+    pline->filter[idx].name = NULL; /*we'll pick it up later*/
+    pline->filter[idx].cd_nelmts = cd_nelmts;
+    if(cd_nelmts > 0) {
+        size_t	i;                      /* Local index variable */
+
+        /* Allocate memory or point at internal buffer */
+        if(cd_nelmts > H5Z_COMMON_CD_VALUES) {
+            pline->filter[idx].cd_values = (unsigned *)H5MM_malloc(cd_nelmts * sizeof(unsigned));
+            if(NULL == pline->filter[idx].cd_values)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for filter")
+        } /* end if */
+        else
+            pline->filter[idx].cd_values = pline->filter[idx]._cd_values;
+
+        /* Copy client data values */
+	for(i = 0; i < cd_nelmts; i++)
+	    pline->filter[idx].cd_values[i] = cd_values[i];
+    } /* end if */
+    else
+       pline->filter[idx].cd_values = NULL;
+
+    pline->nused++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_append() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_find_idx
+ *
+ * Purpose:	Given a filter ID return the offset in the global array
+ *              that holds all the registered filters.
+ *
+ * Return:	Success:	Non-negative index of entry in global filter table.
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5Z_find_idx(H5Z_filter_t id)
+{
+    size_t i;                   /* Local index variable */
+    int ret_value=FAIL;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    for (i=0; i<H5Z_table_used_g; i++)
+	if (H5Z_table_g[i].id == id)
+	    HGOTO_DONE((int)i)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_find_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_find
+ *
+ * Purpose:	Given a filter ID return a pointer to a global struct that
+ *		defines the filter.
+ *
+ * Return:	Success:	Ptr to entry in global filter table.
+ *		Failure:	NULL
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  5, 1998
+ *
+ * Modifications:
+ *              Use H5Z_find_idx now
+ *              Quincey Koziol, April  5, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_class2_t *
+H5Z_find(H5Z_filter_t id)
+{
+    int	idx;                            /* Filter index in global table */
+    H5Z_class2_t *ret_value=NULL;        /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Get the index in the global table */
+    if((idx=H5Z_find_idx(id))<0)
+        HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, NULL, "required filter is not registered")
+
+    /* Set return value */
+    ret_value=H5Z_table_g+idx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5Z_find() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_pipeline
+ *
+ * Purpose:	Process data through the filter pipeline.  The FLAGS argument
+ *		is the filter invocation flags (definition flags come from
+ *		the PLINE->filter[].flags).  The filters are processed in
+ *		definition order unless the H5Z_FLAG_REVERSE is set.  The
+ *		FILTER_MASK is a bit-mask to indicate which filters to skip
+ *		and on exit will indicate which filters failed.  Each
+ *		filter has an index number in the pipeline and that index
+ *		number is the filter's bit in the FILTER_MASK.  NBYTES is the
+ *		number of bytes of data to filter and on exit should be the
+ *		number of resulting bytes while BUF_SIZE holds the total
+ *		allocated size of the buffer, which is pointed to BUF.
+ *
+ *		If the buffer must grow during processing of the pipeline
+ *		then the pipeline function should free the original buffer
+ *		and return a fresh buffer, adjusting BUF_SIZE accordingly.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, August  4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_pipeline(const H5O_pline_t *pline, unsigned flags,
+ 	     unsigned *filter_mask/*in,out*/, H5Z_EDC_t edc_read,
+             H5Z_cb_t cb_struct, size_t *nbytes/*in,out*/,
+             size_t *buf_size/*in,out*/, void **buf/*in,out*/)
+{
+    size_t	i, idx, new_nbytes;
+    int fclass_idx;             /* Index of filter class in global table */
+    H5Z_class2_t	*fclass=NULL;   /* Filter class pointer */
+#ifdef H5Z_DEBUG
+    H5Z_stats_t	*fstats=NULL;   /* Filter stats pointer */
+    H5_timer_t	timer;
+#endif
+    unsigned	failed = 0;
+    unsigned	tmp_flags;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(0==(flags & ~((unsigned)H5Z_FLAG_INVMASK)));
+    HDassert(filter_mask);
+    HDassert(nbytes && *nbytes>0);
+    HDassert(buf_size && *buf_size>0);
+    HDassert(buf && *buf);
+    HDassert(!pline || pline->nused<H5Z_MAX_NFILTERS);
+
+    if (pline && (flags & H5Z_FLAG_REVERSE)) { /* Read */
+	for (i=pline->nused; i>0; --i) {
+	    idx = i-1;
+
+	    if (*filter_mask & ((unsigned)1<<idx)) {
+		failed |= (unsigned)1 << idx;
+		continue;/*filter excluded*/
+	    }
+
+            /* If the filter isn't registered and the application doesn't 
+             * indicate no plugin through HDF5_PRELOAD_PLUG (using the symbol "::"), 
+             * try to load it dynamically and register it.  Otherwise, return failure
+             */
+	    if((fclass_idx = H5Z_find_idx(pline->filter[idx].id)) < 0) {
+                hbool_t issue_error = FALSE;
+
+                    const H5Z_class2_t    *filter_info;
+
+                    /* Try loading the filter */
+                    if(NULL != (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)(pline->filter[idx].id)))) {
+                        /* Register the filter we loaded */
+                        if(H5Z_register(filter_info) < 0)
+                            HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register filter")
+
+                        /* Search in the table of registered filters again to find the dynamic filter just loaded and registered */ 
+                        if((fclass_idx = H5Z_find_idx(pline->filter[idx].id)) < 0)
+                            issue_error = TRUE;
+                    } /* end if */
+                    else
+                        issue_error = TRUE;
+
+                /* Check for error */
+                if(issue_error) {
+                    /* Print out the filter name to give more info.  But the name is optional for 
+                     * the filter */
+                    if(pline->filter[idx].name)
+                        HGOTO_ERROR(H5E_PLINE, H5E_READERROR, FAIL, "required filter '%s' is not registered", pline->filter[idx].name)
+                    else
+                        HGOTO_ERROR(H5E_PLINE, H5E_READERROR, FAIL, "required filter (name unavailable) is not registered")
+                } /* end if */
+            } /* end if */
+
+            fclass=&H5Z_table_g[fclass_idx];
+#ifdef H5Z_DEBUG
+            fstats=&H5Z_stat_table_g[fclass_idx];
+	    H5_timer_begin(&timer);
+#endif
+            tmp_flags=flags|(pline->filter[idx].flags);
+            tmp_flags|=(edc_read== H5Z_DISABLE_EDC) ? H5Z_FLAG_SKIP_EDC : 0;
+	    new_nbytes = (fclass->filter)(tmp_flags, pline->filter[idx].cd_nelmts,
+                                        pline->filter[idx].cd_values, *nbytes, buf_size, buf);
+
+#ifdef H5Z_DEBUG
+	    H5_timer_end(&(fstats->stats[1].timer), &timer);
+	    fstats->stats[1].total += MAX(*nbytes, new_nbytes);
+	    if (0==new_nbytes) fstats->stats[1].errors += *nbytes;
+#endif
+
+            if(0==new_nbytes) {
+                if((cb_struct.func && (H5Z_CB_FAIL==cb_struct.func(pline->filter[idx].id, *buf, *buf_size, cb_struct.op_data)))
+                    || !cb_struct.func)
+		      HGOTO_ERROR(H5E_PLINE, H5E_READERROR, FAIL, "filter returned failure during read")
+
+                *nbytes = *buf_size;
+                failed |= (unsigned)1 << idx;
+                H5E_clear_stack(NULL);
+            } else {
+                *nbytes = new_nbytes;
+            }
+	}
+    } else if (pline) { /* Write */
+	for (idx=0; idx<pline->nused; idx++) {
+	    if (*filter_mask & ((unsigned)1<<idx)) {
+		failed |= (unsigned)1 << idx;
+		continue; /*filter excluded*/
+	    }
+	    if ((fclass_idx=H5Z_find_idx(pline->filter[idx].id))<0) {
+                /* Check if filter is optional -- If it isn't, then error */
+		if ((pline->filter[idx].flags & H5Z_FLAG_OPTIONAL) == 0)
+		    HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "required filter is not registered")
+
+		failed |= (unsigned)1 << idx;
+                H5E_clear_stack(NULL);
+		continue; /*filter excluded*/
+	    }
+            fclass=&H5Z_table_g[fclass_idx];
+#ifdef H5Z_DEBUG
+            fstats=&H5Z_stat_table_g[fclass_idx];
+	    H5_timer_begin(&timer);
+#endif
+	    new_nbytes = (fclass->filter)(flags|(pline->filter[idx].flags), pline->filter[idx].cd_nelmts,
+					pline->filter[idx].cd_values, *nbytes, buf_size, buf);
+#ifdef H5Z_DEBUG
+	    H5_timer_end(&(fstats->stats[0].timer), &timer);
+	    fstats->stats[0].total += MAX(*nbytes, new_nbytes);
+	    if (0==new_nbytes) fstats->stats[0].errors += *nbytes;
+#endif
+            if(0==new_nbytes) {
+                if (0==(pline->filter[idx].flags & H5Z_FLAG_OPTIONAL)) {
+                    if((cb_struct.func && (H5Z_CB_FAIL==cb_struct.func(pline->filter[idx].id, *buf, *nbytes, cb_struct.op_data)))
+                            || !cb_struct.func)
+                        HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "filter returned failure")
+
+                    *nbytes = *buf_size;
+                }
+
+                failed |= (unsigned)1 << idx;
+                H5E_clear_stack(NULL);
+            } else {
+                *nbytes = new_nbytes;
+            }
+	}
+    }
+
+    *filter_mask = failed;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_info
+ *
+ * Purpose:	Get pointer to filter info for pipeline
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, April  5, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_filter_info_t *
+H5Z_filter_info(const H5O_pline_t *pline, H5Z_filter_t filter)
+{
+    size_t	idx;                    /* Index of filter in pipeline */
+    H5Z_filter_info_t *ret_value;       /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(pline);
+    HDassert(filter>=0 && filter<=H5Z_FILTER_MAX);
+
+    /* Locate the filter in the pipeline */
+    for(idx=0; idx<pline->nused; idx++)
+        if(pline->filter[idx].id==filter)
+            break;
+
+    /* Check if the filter was not already in the pipeline */
+    if(idx>=pline->nused)
+	HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, NULL, "filter not in pipeline")
+
+    /* Set return value */
+    ret_value=&pline->filter[idx];
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_filter_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_in_pline
+ *
+ * Purpose:	Check wheter a filter is in the filter pipeline using the 
+ *              filter ID.  This function is very similar to H5Z_filter_info
+ *
+ * Return:	TRUE   - found filter
+ *              FALSE  - not found
+ *              FAIL   - error
+ *
+ * Programmer:	Raymond Lu
+ *              26 April 2013
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Z_filter_in_pline(const H5O_pline_t *pline, H5Z_filter_t filter)
+{
+    size_t	idx;                    /* Index of filter in pipeline */
+    htri_t      ret_value = TRUE;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(pline);
+    HDassert(filter>=0 && filter<=H5Z_FILTER_MAX);
+
+    /* Locate the filter in the pipeline */
+    for(idx=0; idx<pline->nused; idx++)
+        if(pline->filter[idx].id==filter)
+            break;
+
+    /* Check if the filter was not already in the pipeline */
+    if(idx>=pline->nused)
+	ret_value = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_filter_in_pline() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_all_filters_avail
+ *
+ * Purpose:	Verify that all the filters in a pipeline are currently
+ *              available (i.e. registered)
+ *
+ * Return:	Non-negative (TRUE/FALSE) on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, April  8, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5Z_all_filters_avail(const H5O_pline_t *pline)
+{
+    size_t i,j;                 /* Local index variable */
+    htri_t ret_value=TRUE;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(pline);
+
+    /* Iterate through all the filters in pipeline */
+    for(i=0; i<pline->nused; i++) {
+
+        /* Look for each filter in the list of registered filters */
+        for(j=0; j<H5Z_table_used_g; j++)
+            if(H5Z_table_g[j].id==pline->filter[i].id)
+                break;
+
+        /* Check if we didn't find the filter */
+        if(j==H5Z_table_used_g)
+            HGOTO_DONE(FALSE)
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_all_filters_avail() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_delete
+ *
+ * Purpose: Delete filter FILTER from pipeline PLINE;
+ *  deletes all filters if FILTER is H5Z_FILTER_NONE
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Pedro Vicente
+ *              Monday, January 26, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_delete(H5O_pline_t *pline, H5Z_filter_t filter)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(pline);
+    HDassert(filter >= 0 && filter <= H5Z_FILTER_MAX);
+
+    /* if the pipeline has no filters, just return */
+    if(pline->nused==0)
+        HGOTO_DONE(SUCCEED)
+
+    /* Delete all filters */
+    if(H5Z_FILTER_ALL == filter) {
+        if(H5O_msg_reset(H5O_PLINE_ID, pline) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFREE, FAIL, "can't release pipeline info")
+    } /* end if */
+    /* Delete filter */
+    else {
+        size_t idx;             /* Index of filter in pipeline */
+        hbool_t found = FALSE;  /* Indicate filter was found in pipeline */
+
+        /* Locate the filter in the pipeline */
+        for(idx = 0; idx < pline->nused; idx++)
+            if(pline->filter[idx].id == filter) {
+                found = TRUE;
+                break;
+            } /* end if */
+
+        /* filter was not found in the pipeline */
+        if(!found)
+            HGOTO_ERROR(H5E_PLINE, H5E_NOTFOUND, FAIL, "filter not in pipeline")
+
+        /* Free information for deleted filter */
+        if(pline->filter[idx].name && pline->filter[idx].name != pline->filter[idx]._name)
+            HDassert((HDstrlen(pline->filter[idx].name) + 1) > H5Z_COMMON_NAME_LEN);
+        if(pline->filter[idx].name != pline->filter[idx]._name)
+            pline->filter[idx].name = (char *)H5MM_xfree(pline->filter[idx].name);
+        if(pline->filter[idx].cd_values && pline->filter[idx].cd_values != pline->filter[idx]._cd_values)
+            HDassert(pline->filter[idx].cd_nelmts > H5Z_COMMON_CD_VALUES);
+        if(pline->filter[idx].cd_values != pline->filter[idx]._cd_values)
+            pline->filter[idx].cd_values = (unsigned *)H5MM_xfree(pline->filter[idx].cd_values);
+
+        /* Remove filter from pipeline array */
+        if((idx + 1) < pline->nused) {
+            /* Copy filters down & fix up any client data value arrays using internal storage */
+            for(; (idx + 1) < pline->nused; idx++) {
+                pline->filter[idx] = pline->filter[idx + 1];
+                if(pline->filter[idx].name && (HDstrlen(pline->filter[idx].name) + 1) <= H5Z_COMMON_NAME_LEN)
+                    pline->filter[idx].name = pline->filter[idx]._name;
+                if(pline->filter[idx].cd_nelmts <= H5Z_COMMON_CD_VALUES)
+                    pline->filter[idx].cd_values = pline->filter[idx]._cd_values;
+            } /* end for */
+        } /* end if */
+
+        /* Decrement number of used filters */
+        pline->nused--;
+
+        /* Reset information for previous last filter in pipeline */
+        HDmemset(&pline->filter[pline->nused], 0, sizeof(H5Z_filter_info_t));
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Zget_filter_info
+ *
+ * Purpose: Gets information about a pipeline data filter and stores it
+ *          in filter_config_flags.
+ *
+ * Return: zero on success / negative on failure
+ *
+ * Programmer: James Laird and Nat Furrer
+ *              Monday, June 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Zget_filter_info(H5Z_filter_t filter, unsigned int *filter_config_flags)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "Zf*Iu", filter, filter_config_flags);
+
+    /* Get the filter info */
+    if(H5Z_get_filter_info(filter, filter_config_flags) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "Filter info not retrieved")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Zget_filter_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_get_filter_info
+ *
+ * Purpose: Gets information about a pipeline data filter and stores it
+ *          in filter_config_flags.
+ *
+ * Return: zero on success / negative on failure
+ *
+ * Programmer: Quincey Koziol
+ *             Saturday, May 11, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_get_filter_info(H5Z_filter_t filter, unsigned int *filter_config_flags)
+{
+    H5Z_class2_t *fclass;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Look up the filter class info */
+    if(NULL == (fclass = H5Z_find(filter)))
+        HGOTO_ERROR(H5E_PLINE, H5E_BADVALUE, FAIL, "Filter not defined")
+
+    /* Set the filter config flags for the application */
+    if(filter_config_flags != NULL) {
+        *filter_config_flags = 0;
+
+        if(fclass->encoder_present)
+            *filter_config_flags |= H5Z_FILTER_CONFIG_ENCODE_ENABLED;
+        if(fclass->decoder_present)
+            *filter_config_flags |= H5Z_FILTER_CONFIG_DECODE_ENABLED;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_get_filter_info() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zdeflate.c b/gatb-core/thirdparty/hdf5/src/H5Zdeflate.c
new file mode 100644
index 0000000..06d9866
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zdeflate.c
@@ -0,0 +1,208 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Friday, August 27, 1999
+ */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+#if defined(H5_HAVE_ZLIB_H) && !defined(H5_ZLIB_HEADER) 
+# define H5_ZLIB_HEADER "zlib.h"
+#endif
+#if defined(H5_ZLIB_HEADER)
+# include H5_ZLIB_HEADER /* "zlib.h" */
+#endif
+
+/* Local function prototypes */
+static size_t H5Z_filter_deflate (unsigned flags, size_t cd_nelmts,
+    const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_DEFLATE[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_DEFLATE,		/* Filter id number		*/
+    1,              /* encoder_present flag (set to true) */
+    1,              /* decoder_present flag (set to true) */
+    "deflate",			/* Filter name for debugging	*/
+    NULL,                       /* The "can apply" callback     */
+    NULL,                       /* The "set local" callback     */
+    H5Z_filter_deflate,         /* The actual filter function	*/
+}};
+
+#define H5Z_DEFLATE_SIZE_ADJUST(s) (HDceil(((double)(s)) * (double)1.001f) + 12)
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_deflate
+ *
+ * Purpose:	Implement an I/O filter around the 'deflate' algorithm in
+ *              libz
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_deflate (unsigned flags, size_t cd_nelmts,
+		    const unsigned cd_values[], size_t nbytes,
+		    size_t *buf_size, void **buf)
+{
+    void	*outbuf = NULL;         /* Pointer to new buffer */
+    int		status;                 /* Status from zlib operation */
+    size_t	ret_value;              /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Sanity check */
+    HDassert(*buf_size > 0);
+    HDassert(buf);
+    HDassert(*buf);
+
+    /* Check arguments */
+    if (cd_nelmts!=1 || cd_values[0]>9)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid deflate aggression level")
+
+    if (flags & H5Z_FLAG_REVERSE) {
+	/* Input; uncompress */
+	z_stream	z_strm;                 /* zlib parameters */
+	size_t		nalloc = *buf_size;     /* Number of bytes for output (compressed) buffer */
+
+        /* Allocate space for the compressed buffer */
+	if (NULL==(outbuf = H5MM_malloc(nalloc)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for deflate uncompression")
+
+        /* Set the uncompression parameters */
+	HDmemset(&z_strm, 0, sizeof(z_strm));
+	z_strm.next_in = (Bytef *)*buf;
+        H5_CHECKED_ASSIGN(z_strm.avail_in, unsigned, nbytes, size_t);
+	z_strm.next_out = (Bytef *)outbuf;
+        H5_CHECKED_ASSIGN(z_strm.avail_out, unsigned, nalloc, size_t);
+
+        /* Initialize the uncompression routines */
+	if (Z_OK!=inflateInit(&z_strm))
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "inflateInit() failed")
+
+        /* Loop to uncompress the buffer */
+	do {
+            /* Uncompress some data */
+	    status = inflate(&z_strm, Z_SYNC_FLUSH);
+
+            /* Check if we are done uncompressing data */
+	    if (Z_STREAM_END==status)
+                break;	/*done*/
+
+            /* Check for error */
+	    if (Z_OK!=status) {
+		(void)inflateEnd(&z_strm);
+		HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "inflate() failed")
+	    }
+            else {
+                /* If we're not done and just ran out of buffer space, get more */
+                if(0 == z_strm.avail_out) {
+                    void	*new_outbuf;         /* Pointer to new output buffer */
+
+                    /* Allocate a buffer twice as big */
+                    nalloc *= 2;
+                    if(NULL == (new_outbuf = H5MM_realloc(outbuf, nalloc))) {
+                        (void)inflateEnd(&z_strm);
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for deflate uncompression")
+                    } /* end if */
+                    outbuf = new_outbuf;
+
+                    /* Update pointers to buffer for next set of uncompressed data */
+                    z_strm.next_out = (unsigned char*)outbuf + z_strm.total_out;
+                    z_strm.avail_out = (uInt)(nalloc - z_strm.total_out);
+                } /* end if */
+            } /* end else */
+	} while(status==Z_OK);
+
+        /* Free the input buffer */
+	H5MM_xfree(*buf);
+
+        /* Set return values */
+	*buf = outbuf;
+	outbuf = NULL;
+	*buf_size = nalloc;
+	ret_value = z_strm.total_out;
+
+        /* Finish uncompressing the stream */
+	(void)inflateEnd(&z_strm);
+    } /* end if */
+    else {
+	/*
+	 * Output; compress but fail if the result would be larger than the
+	 * input.  The library doesn't provide in-place compression, so we
+	 * must allocate a separate buffer for the result.
+	 */
+	const Bytef *z_src = (const Bytef*)(*buf);
+	Bytef	    *z_dst;		/*destination buffer		*/
+	uLongf	     z_dst_nbytes = (uLongf)H5Z_DEFLATE_SIZE_ADJUST(nbytes);
+	uLong	     z_src_nbytes = (uLong)nbytes;
+        int          aggression;     /* Compression aggression setting */
+
+        /* Set the compression aggression level */
+        H5_CHECKED_ASSIGN(aggression, int, cd_values[0], unsigned);
+
+        /* Allocate output (compressed) buffer */
+	if(NULL == (outbuf = H5MM_malloc(z_dst_nbytes)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "unable to allocate deflate destination buffer")
+        z_dst = (Bytef *)outbuf;
+
+        /* Perform compression from the source to the destination buffer */
+	status = compress2(z_dst, &z_dst_nbytes, z_src, z_src_nbytes, aggression);
+
+        /* Check for various zlib errors */
+	if(Z_BUF_ERROR == status)
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "overflow")
+	else if(Z_MEM_ERROR == status)
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "deflate memory error")
+	else if(Z_OK != status)
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "other deflate error")
+        /* Successfully uncompressed the buffer */
+        else {
+            /* Free the input buffer */
+	    H5MM_xfree(*buf);
+
+            /* Set return values */
+	    *buf = outbuf;
+	    outbuf = NULL;
+	    *buf_size = nbytes;
+	    ret_value = z_dst_nbytes;
+	} /* end else */
+    } /* end else */
+
+done:
+    if(outbuf)
+        H5MM_xfree(outbuf);
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zfletcher32.c b/gatb-core/thirdparty/hdf5/src/H5Zfletcher32.c
new file mode 100644
index 0000000..1877ddd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zfletcher32.c
@@ -0,0 +1,167 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu<slu at ncsa.uiuc.edu>
+ *              Jan 3, 2003
+ */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access                          */
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+/* Local function prototypes */
+static size_t H5Z_filter_fletcher32 (unsigned flags, size_t cd_nelmts,
+    const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_FLETCHER32[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_FLETCHER32,	/* Filter id number		*/
+    1,              /* encoder_present flag (set to true) */
+    1,              /* decoder_present flag (set to true) */
+    "fletcher32",		/* Filter name for debugging	*/
+    NULL,                       /* The "can apply" callback     */
+    NULL,                       /* The "set local" callback     */
+    H5Z_filter_fletcher32,	/* The actual filter function	*/
+}};
+
+#define FLETCHER_LEN       4
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_fletcher32
+ *
+ * Purpose:	Implement an I/O filter of Fletcher32 Checksum
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Raymond Lu
+ *              Jan 3, 2003
+ *
+ * Modifications:
+ *              Raymond Lu
+ *              July 8, 2005
+ *              There was a bug in the calculating code of the Fletcher32
+ *              checksum in the library before v1.6.3.  The checksum
+ *              value wasn't consistent between big-endian and little-endian
+ *              systems.  This bug was fixed in Release 1.6.3.  However,
+ *              after fixing the bug, the checksum value is no longer the
+ *              same as before on little-endian system.  We'll check both
+ *              the correct checksum and the wrong checksum to be consistent
+ *              with Release 1.6.2 and before.
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static size_t
+H5Z_filter_fletcher32 (unsigned flags, size_t H5_ATTR_UNUSED cd_nelmts, const unsigned H5_ATTR_UNUSED cd_values[],
+                     size_t nbytes, size_t *buf_size, void **buf)
+{
+    void    *outbuf = NULL;     /* Pointer to new buffer */
+    unsigned char *src = (unsigned char*)(*buf);
+    uint32_t fletcher;          /* Checksum value */
+    uint32_t reversed_fletcher; /* Possible wrong checksum value */
+    uint8_t  c[4];
+    uint8_t  tmp;
+    size_t   ret_value;         /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    HDassert(sizeof(uint32_t)>=4);
+
+    if (flags & H5Z_FLAG_REVERSE) { /* Read */
+        /* Do checksum if it's enabled for read; otherwise skip it
+         * to save performance. */
+        if (!(flags & H5Z_FLAG_SKIP_EDC)) {
+            unsigned char *tmp_src;             /* Pointer to checksum in buffer */
+            size_t  src_nbytes = nbytes;        /* Original number of bytes */
+            uint32_t stored_fletcher;           /* Stored checksum value */
+
+            /* Get the stored checksum */
+            src_nbytes -= FLETCHER_LEN;
+            tmp_src=src+src_nbytes;
+            UINT32DECODE(tmp_src, stored_fletcher);
+
+            /* Compute checksum (can't fail) */
+            fletcher = H5_checksum_fletcher32(src, src_nbytes);
+
+            /* The reversed checksum.  There was a bug in the calculating code of
+             * the Fletcher32 checksum in the library before v1.6.3.  The checksum
+             * value wasn't consistent between big-endian and little-endian systems.
+             * This bug was fixed in Release 1.6.3.  However, after fixing the bug,
+             * the checksum value is no longer the same as before on little-endian
+             * system.  We'll check both the correct checksum and the wrong
+             * checksum to be consistent with Release 1.6.2 and before.
+             */
+            HDmemcpy(c, &fletcher, (size_t)4);
+
+            tmp  = c[1];
+            c[1] = c[0];
+            c[0] = tmp;
+
+            tmp  = c[3];
+            c[3] = c[2];
+            c[2] = tmp;
+
+            HDmemcpy(&reversed_fletcher, c, (size_t)4);
+
+            /* Verify computed checksum matches stored checksum */
+            if(stored_fletcher != fletcher && stored_fletcher != reversed_fletcher)
+	        HGOTO_ERROR(H5E_STORAGE, H5E_READERROR, 0, "data error detected by Fletcher32 checksum")
+        }
+
+        /* Set return values */
+        /* (Re-use the input buffer, just note that the size is smaller by the size of the checksum) */
+        ret_value = nbytes-FLETCHER_LEN;
+    } else { /* Write */
+        unsigned char *dst;     /* Temporary pointer to destination buffer */
+
+        /* Compute checksum (can't fail) */
+        fletcher = H5_checksum_fletcher32(src, nbytes);
+
+	if (NULL == (outbuf = H5MM_malloc(nbytes + FLETCHER_LEN)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "unable to allocate Fletcher32 checksum destination buffer")
+
+        dst = (unsigned char *) outbuf;
+
+        /* Copy raw data */
+        HDmemcpy((void*)dst, (void*)(*buf), nbytes);
+
+        /* Append checksum to raw data for storage */
+        dst += nbytes;
+        UINT32ENCODE(dst, fletcher);
+
+        /* Free input buffer */
+ 	H5MM_xfree(*buf);
+
+        /* Set return values */
+        *buf_size = nbytes + FLETCHER_LEN;
+	*buf = outbuf;
+	outbuf = NULL;
+	ret_value = *buf_size;
+    }
+
+done:
+    if(outbuf)
+        H5MM_xfree(outbuf);
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Znbit.c b/gatb-core/thirdparty/hdf5/src/H5Znbit.c
new file mode 100644
index 0000000..ddcf8fd
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Znbit.c
@@ -0,0 +1,1474 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppublic.h"		/* Property lists			*/
+#include "H5Oprivate.h"         /* Object headers                       */
+#include "H5Sprivate.h"		/* Dataspaces         			*/
+#include "H5Tprivate.h"		/* Datatypes         			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+/* Struct of parameters needed for compressing/decompressing
+ * one nbit atomic datatype: integer or floating-point
+ */
+typedef struct {
+   size_t size;   /* size of datatype */
+   int order;     /* datatype endianness order */
+   int precision; /* datatype precision */
+   int offset;    /* datatype offset */
+} parms_atomic;
+
+/* Local function prototypes */
+static htri_t H5Z_can_apply_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static herr_t H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static size_t H5Z_filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
+                              size_t nbytes, size_t *buf_size, void **buf);
+
+static void H5Z_calc_parms_nooptype(void);
+static void H5Z_calc_parms_atomic(void);
+static herr_t H5Z_calc_parms_array(const H5T_t *type);
+static herr_t H5Z_calc_parms_compound(const H5T_t *type);
+
+static herr_t H5Z_set_parms_nooptype(const H5T_t *type, unsigned cd_values[]);
+static herr_t H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[]);
+static herr_t H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[]);
+static herr_t H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[]);
+
+static void H5Z_nbit_next_byte(size_t *j, int *buf_len);
+static void H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
+int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
+static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
+int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
+static void H5Z_nbit_decompress_one_nooptype(unsigned char *data, size_t data_offset,
+                       unsigned char *buffer, size_t *j, int *buf_len, unsigned size);
+static void H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
+                    unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
+static herr_t H5Z__nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+           unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static herr_t H5Z__nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+              unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static herr_t H5Z__nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+                                const unsigned parms[]);
+static void H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offset,
+                     unsigned char *buffer, size_t *j, int *buf_len, unsigned size);
+static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
+                  unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
+static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset,
+         unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
+            unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+                              size_t *buffer_size, const unsigned parms[]);
+
+/* This message derives from H5Z */
+H5Z_class2_t H5Z_NBIT[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_NBIT,		/* Filter id number		*/
+    1,              /* Assume encoder present: check before registering */
+    1,                  /* decoder_present flag (set to true) */
+    "nbit",			    /* Filter name for debugging	*/
+    H5Z_can_apply_nbit,		/* The "can apply" callback     */
+    H5Z_set_local_nbit,         /* The "set local" callback     */
+    H5Z_filter_nbit,		/* The actual filter function	*/
+}};
+
+/* Local macros */
+#define H5Z_NBIT_ATOMIC          1     /* Atomic datatype class: integer/floating-point */
+#define H5Z_NBIT_ARRAY           2     /* Array datatype class */
+#define H5Z_NBIT_COMPOUND        3     /* Compound datatype class */
+#define H5Z_NBIT_NOOPTYPE        4     /* Other datatype class: nbit does no compression */
+#define H5Z_NBIT_MAX_NPARMS      4096  /* Max number of parameters for filter */
+#define H5Z_NBIT_ORDER_LE        0     /* Little endian for datatype byte order */
+#define H5Z_NBIT_ORDER_BE        1     /* Big endian for datatype byte order */
+
+/* Local variables */
+/*
+ * cd_values_index: index of array cd_values inside function H5Z_set_local_nbit
+ * cd_values_actual_nparms: number of parameters in array cd_values[]
+ * need_not_compress: flag if TRUE indicating no need to do nbit compression
+ * parms_index: index of array parms used by compression/decompression functions
+ */
+static unsigned cd_values_index = 0;
+static size_t cd_values_actual_nparms = 0;
+static unsigned char need_not_compress = FALSE;
+static unsigned parms_index = 0;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_can_apply_nbit
+ *
+ * Purpose:	Check the parameters for nbit compression for validity and
+ *              whether they fit a particular dataset.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Tuesday, December 21, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5Z_can_apply_nbit(hid_t H5_ATTR_UNUSED dcpl_id, hid_t type_id, hid_t H5_ATTR_UNUSED space_id)
+{
+    const H5T_t	*type;                  /* Datatype */
+    htri_t ret_value = TRUE;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get datatype */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get datatype's class, for checking the "datatype class" */
+    if(H5T_get_class(type, TRUE) == H5T_NO_CLASS)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype class")
+
+    /* Get datatype's size, for checking the "datatype size" */
+    if(H5T_get_size(type) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_can_apply_nbit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_calc_parms_nooptype
+ *
+ * Purpose:     Calculate the number of parameters of array cd_values[]
+ *              of datatype that is not integer, nor floating-point, nor
+ *              compound, and nor array.
+ *
+ * Programmer:  Xiaowen Wu
+ *              Thursday, March 3, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void H5Z_calc_parms_nooptype(void)
+{
+    /* Store datatype class code */
+    ++cd_values_actual_nparms;
+
+    /* Store datatype size */
+    ++cd_values_actual_nparms;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_calc_parms_atomic
+ *
+ * Purpose:     Calculate the number of parameters of array cd_values[]
+ *              of atomic datatype whose datatype class is integer
+ *              or floating point
+ *
+ * Programmer:  Xiaowen Wu
+ *              Saturday, January 29, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void H5Z_calc_parms_atomic(void)
+{
+    /* Store datatype class code */
+    ++cd_values_actual_nparms;
+
+    /* Store datatype size */
+    ++cd_values_actual_nparms;
+
+    /* Store datatype endianness */
+    ++cd_values_actual_nparms;
+
+    /* Store datatype's precision */
+    ++cd_values_actual_nparms;
+
+    /* Store datatype's offset */
+    ++cd_values_actual_nparms;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_calc_parms_array
+ *
+ * Purpose:     Calculate the number of parameters of array cd_values[]
+ *              for a given datatype identifier type_id
+ *              if its datatype class is array datatype
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Wednesday, January 19, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_calc_parms_array(const H5T_t *type)
+{
+    H5T_t *dtype_base = NULL;      /* Array datatype's base datatype */
+    H5T_class_t dtype_base_class;  /* Array datatype's base datatype's class */
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Store datatype class code */
+    ++cd_values_actual_nparms;
+
+    /* Store array datatype's size */
+    ++cd_values_actual_nparms;
+
+    /* Get array datatype's base datatype */
+    if(NULL == (dtype_base = H5T_get_super(type)))
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad base datatype")
+
+    /* Get base datatype's class */
+    if((dtype_base_class = H5T_get_class(dtype_base, TRUE)) == H5T_NO_CLASS)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad base datatype class")
+
+    /* Calculate number of the rest parameters according to base datatype's class */
+    switch(dtype_base_class) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+            H5Z_calc_parms_atomic();
+            break;
+
+        case H5T_ARRAY:
+            if(H5Z_calc_parms_array(dtype_base) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+            break;
+
+        case H5T_COMPOUND:
+            if(H5Z_calc_parms_compound(dtype_base) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+            break;
+
+        default: /* Other datatype class: nbit does no compression */
+            H5Z_calc_parms_nooptype();
+            break;
+    } /* end switch */
+
+done:
+    if(dtype_base)
+        if(H5T_close(dtype_base) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close base datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_calc_parms_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_calc_parms_compound
+ *
+ * Purpose:     Calculate the number of parameters of array cd_values[]
+ *              for a given datatype identifier type_id
+ *              if its datatype class is compound datatype
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Wednesday, January 19, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_calc_parms_compound(const H5T_t *type)
+{
+    int         nmembers;           /* Compound datatype's number of members */
+    H5T_t *dtype_member = NULL;     /* Compound datatype's member datatype */
+    H5T_class_t dtype_member_class; /* Compound datatype's member datatype's class */
+    unsigned    u;                  /* Local index variable */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Store compound datatype class code */
+    ++cd_values_actual_nparms;
+
+    /* Store compound datatype's size */
+    ++cd_values_actual_nparms;
+
+    /* Get number of members */
+    if((nmembers = H5T_get_nmembers(type)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype number of members")
+
+    /* Store number of members */
+    ++cd_values_actual_nparms;
+
+    /* For each member, calculate parameters */
+    for(u = 0; u < (unsigned)nmembers; u++) {
+        /* Get member datatype */
+        if(NULL == (dtype_member = H5T_get_member_type(type, u, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype")
+
+        /* Get member datatype's class */
+        if((dtype_member_class = H5T_get_class(dtype_member, TRUE)) == H5T_NO_CLASS)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype class")
+
+        /* Store member offset */
+        ++cd_values_actual_nparms;
+
+        /* Calculate parameters according to member's datatype class */
+        switch(dtype_member_class) {
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+                H5Z_calc_parms_atomic();
+                break;
+
+            case H5T_ARRAY:
+                if(H5Z_calc_parms_array(dtype_member) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+                break;
+
+            case H5T_COMPOUND:
+                if(H5Z_calc_parms_compound(dtype_member) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+                break;
+
+            default: /* Other datatype class: nbit does no compression */
+                H5Z_calc_parms_nooptype();
+                break;
+        } /* end switch */
+
+        /* Close member datatype */
+        if(H5T_close(dtype_member) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close member datatype")
+        dtype_member = NULL;
+    } /* end for */
+
+done:
+    if(dtype_member)
+        if(H5T_close(dtype_member) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close member datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_calc_params_compound */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_set_parms_nooptype
+ *
+ * Purpose:     Set the array cd_values[] for a given datatype identifier
+ *              type_id if its datatype class is not integer, nor
+ *              floating-point, nor array, nor compound, nor VL datatype,
+ *              and nor VL string
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Tuesday, April 5, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_parms_nooptype(const H5T_t *type, unsigned cd_values[])
+{
+    size_t dtype_size;          /* No-op datatype's size (in bytes) */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set datatype class code */
+    cd_values[cd_values_index++] = H5Z_NBIT_NOOPTYPE;
+
+    /* Get datatype's size */
+    if((dtype_size = H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Set "local" parameter for datatype size */
+    cd_values[cd_values_index++] = dtype_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_parms_nooptype() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_set_parms_atomic
+ *
+ * Purpose:     Set the array cd_values[] for a given datatype identifier
+ *              type_id if its datatype class is integer or floating point
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Tuesday, January 11, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
+{
+    H5T_order_t dtype_order;    /* Atomic datatype's endianness order */
+    size_t dtype_size;          /* Atomic datatype's size (in bytes) */
+    size_t dtype_precision;     /* Atomic datatype's precision (in bits) */
+    int dtype_offset;           /* Atomic datatype's offset (in bits) */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set datatype class code */
+    cd_values[cd_values_index++] = H5Z_NBIT_ATOMIC;
+
+    /* Get datatype's size */
+    if((dtype_size = H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Set "local" parameter for datatype size */
+    cd_values[cd_values_index++] = dtype_size;
+
+    /* Get datatype's endianness order */
+    if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+
+    /* Set "local" parameter for datatype endianness */
+    switch(dtype_order) {
+        case H5T_ORDER_LE:      /* Little-endian byte order */
+            cd_values[cd_values_index++] = H5Z_NBIT_ORDER_LE;
+            break;
+
+        case H5T_ORDER_BE:      /* Big-endian byte order */
+            cd_values[cd_values_index++] = H5Z_NBIT_ORDER_BE;
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+    } /* end switch */
+
+    /* Get datatype's precision */
+    if((dtype_precision = H5T_get_precision(type)) == 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype precision")
+
+    /* Get datatype's offset */
+    if((dtype_offset = H5T_get_offset(type)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype offset")
+
+    /* Check values of precision and offset */
+    if(dtype_precision > dtype_size * 8 || (dtype_precision + dtype_offset) > dtype_size * 8
+            || dtype_precision <= 0 || dtype_offset < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+    /* Set "local" parameter for datatype precision */
+    cd_values[cd_values_index++] = dtype_precision;
+
+    /* Set "local" parameter for datatype offset */
+    cd_values[cd_values_index++] = dtype_offset;
+
+    /* If before this point, there is no need to compress, check the need to
+     * compress at this point. If current datatype is not full-precision,
+     * flag need_not_compress should be set to FALSE.
+     */
+    if(need_not_compress) /* so far no need to compress */
+       if(dtype_offset != 0 || dtype_precision != dtype_size * 8)
+          need_not_compress = FALSE;
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_parms_atomic() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_set_parms_array
+ *
+ * Purpose:     Set the array cd_values[] for a given datatype identifier
+ *              type_id if its datatype class is array datatype
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Tuesday, April 5, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
+{
+    H5T_t *dtype_base = NULL;      /* Array datatype's base datatype */
+    H5T_class_t dtype_base_class;  /* Array datatype's base datatype's class */
+    size_t dtype_size;             /* Array datatype's size (in bytes) */
+    htri_t is_vlstring;            /* flag indicating if datatype is varible-length string */
+    herr_t ret_value=SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set datatype class code */
+    cd_values[cd_values_index++] = H5Z_NBIT_ARRAY;
+
+    /* Get array datatype's size */
+    if((dtype_size = H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Set "local" parameter for array datatype's size */
+    cd_values[cd_values_index++]=dtype_size;
+
+    /* Get array datatype's base datatype */
+    if(NULL == (dtype_base = H5T_get_super(type)))
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad base datatype")
+
+    /* Get base datatype's class */
+    if((dtype_base_class = H5T_get_class(dtype_base, TRUE)) == H5T_NO_CLASS)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad base datatype class")
+
+    /* Call appropriate function according to base datatype's class */
+    switch(dtype_base_class) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+            if(H5Z_set_parms_atomic(dtype_base, cd_values) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        case H5T_ARRAY:
+            if(H5Z_set_parms_array(dtype_base, cd_values) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        case H5T_COMPOUND:
+            if(H5Z_set_parms_compound(dtype_base, cd_values) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        default: /* other datatype that nbit does no compression */
+            /* Check if base datatype is a variable-length string */
+            if((is_vlstring = H5T_is_variable_str(dtype_base)) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot determine if datatype is a variable-length string")
+
+            /* base datatype of VL or VL-string is not supported */
+            if(dtype_base_class == H5T_VLEN || is_vlstring)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype not supported by nbit")
+
+            if(H5Z_set_parms_nooptype(dtype_base, cd_values) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+    } /* end switch */
+
+done:
+    if(dtype_base)
+        if(H5T_close(dtype_base) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close base datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_parms_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_set_parms_compound
+ *
+ * Purpose:     Set the array cd_values[] for a given datatype identifier
+ *              type_id if its datatype class is compound datatype
+ *
+ * Return:      Success: Non-negative
+ *              Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Tuesday, April 5, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
+{
+    int         nmembers;           /* Compound datatype's number of members */
+    H5T_t *dtype_member = NULL;     /* Compound datatype's member datatype */
+    H5T_class_t dtype_member_class; /* Compound datatype's member datatype's class */
+    size_t dtype_member_offset;     /* Compound datatype's current member datatype's offset (in bytes) */
+    size_t dtype_next_member_offset;/* Compound datatype's next member datatype's offset (in bytes) */
+    size_t dtype_size;              /* Compound datatype's size (in bytes) */
+    htri_t is_vlstring;             /* flag indicating if datatype is varible-length string */
+    unsigned u;                     /* Local index variable */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Set "local" parameter for compound datatype class code */
+    cd_values[cd_values_index++] = H5Z_NBIT_COMPOUND;
+
+    /* Get datatype's size */
+    if((dtype_size = H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Set "local" parameter for compound datatype size */
+    cd_values[cd_values_index++] = dtype_size;
+
+    /* Get number of members */
+    if((nmembers = H5T_get_nmembers(type)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype number of members")
+
+    /* Set "local" parameter for number of members */
+    cd_values[cd_values_index++] = nmembers;
+
+    /* For each member, set parameters */
+    for(u = 0; u < (unsigned)nmembers; u++) {
+        /* Get member datatype */
+        if(NULL == (dtype_member = H5T_get_member_type(type, u, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype")
+
+        /* Get member datatype's class */
+        if((dtype_member_class = H5T_get_class(dtype_member, TRUE)) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype class")
+
+        /* Get member offset, success if H5T_get_class() success */
+        dtype_member_offset =  H5T_get_member_offset(type, u);
+
+        /* Set "local" parameter for member offset */
+        cd_values[cd_values_index++] = dtype_member_offset;
+
+        /* Call appropriate function according to member's datatype class */
+        switch(dtype_member_class) {
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+                if(H5Z_set_parms_atomic(dtype_member, cd_values) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                break;
+
+            case H5T_ARRAY:
+                if(H5Z_set_parms_array(dtype_member, cd_values) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                break;
+
+            case H5T_COMPOUND:
+                if(H5Z_set_parms_compound(dtype_member, cd_values) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                break;
+
+            default: /* other datatype that nbit does no compression */
+                /* Check if datatype is a variable-length string */
+                if((is_vlstring = H5T_is_variable_str(dtype_member)) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot determine if datatype is a variable-length string")
+
+                /* Because for some no-op datatype (VL datatype and VL string datatype), its
+		 * size can not be retrieved correctly by using function call H5T_get_size,
+		 * special handling is needed for getting the size. Here the difference between
+                 * adjacent member offset is used (if alignment is present, the result can be
+		 * larger, but it does not affect the nbit filter's correctness).
+                 */
+                if(dtype_member_class == H5T_VLEN || is_vlstring) {
+                    /* Set datatype class code */
+                    cd_values[cd_values_index++] = H5Z_NBIT_NOOPTYPE;
+
+                    if(u != (unsigned)nmembers - 1)
+                        dtype_next_member_offset = H5T_get_member_offset(type, u + 1);
+                    else /* current member is the last member */
+                        dtype_next_member_offset = dtype_size;
+
+                    /* Set "local" parameter for datatype size */
+                    cd_values[cd_values_index++] = dtype_next_member_offset - dtype_member_offset;
+                } else
+                    if(H5Z_set_parms_nooptype(dtype_member, cd_values)==FAIL)
+                        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                break;
+        } /* end switch */
+
+        /* Close member datatype */
+        if(H5T_close(dtype_member) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close member datatype")
+        dtype_member = NULL;
+    } /* end for */
+
+done:
+    if(dtype_member)
+        if(H5T_close(dtype_member) < 0)
+            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "Unable to close member datatype")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_params_compound */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local_nbit
+ *
+ * Purpose:	Set the "local" dataset parameters for nbit compression.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Xiaowen Wu
+ *              Tuesday, January 11, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
+{
+    H5P_genplist_t *dcpl_plist;     /* Property list pointer */
+    const H5T_t	*type;              /* Datatype */
+    const H5S_t	*ds;                /* Dataspace */
+    unsigned flags;                 /* Filter flags */
+    size_t cd_nelmts = H5Z_NBIT_USER_NPARMS;  /* Number of filter parameters */
+    unsigned *cd_values = NULL;     /* Filter parameters */
+    hssize_t npoints;               /* Number of points in the dataspace */
+    H5T_class_t dtype_class;        /* Datatype's class */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get datatype */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get datatype's class */
+    if((dtype_class = H5T_get_class(type, TRUE)) == H5T_NO_CLASS)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype class")
+
+    /* Calculate how many parameters will fill the cd_values array
+     * First three parameters reserved for:
+     *   1. number of parameters in array cd_values
+     *   2. flag if TRUE indicating no need to do nbit compression
+     *   3. number of elements in the chunk
+     */
+    cd_values_actual_nparms = 3;
+    switch(dtype_class) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+            H5Z_calc_parms_atomic();
+            break;
+
+        case H5T_ARRAY:
+            if(H5Z_calc_parms_array(type) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+            break;
+
+        case H5T_COMPOUND:
+            if(H5Z_calc_parms_compound(type) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
+            break;
+
+        default: /* no need to calculate other datatypes at top level */
+             break;
+    } /* end switch */
+
+    /* Check if the number of parameters exceed what cd_values[] can store */
+    if(cd_values_actual_nparms > H5Z_NBIT_MAX_NPARMS)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype needs too many nbit parameters")
+
+    /* Allocate memory space for cd_values[] */
+    if(NULL == (cd_values = (unsigned *)H5MM_malloc(cd_values_actual_nparms * sizeof(unsigned))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for cd_values[]")
+
+    /* Get the plist structure */
+    if(NULL == (dcpl_plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the filter's current parameters */
+    if(H5P_get_filter_by_id(dcpl_plist, H5Z_FILTER_NBIT, &flags, &cd_nelmts, cd_values, (size_t)0, NULL, NULL) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get nbit parameters")
+
+    /* Get dataspace */
+    if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+    /* Get total number of elements in the chunk */
+    if((npoints = H5S_GET_EXTENT_NPOINTS(ds)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get number of points in the dataspace")
+    HDassert(npoints);
+
+    /* Initialize index for cd_values array starting from the third entry */
+    cd_values_index = 2;
+
+    /* Set "local" parameter for number of elements in the chunk */
+    H5_CHECKED_ASSIGN(cd_values[cd_values_index++], unsigned, npoints, hssize_t);
+
+    /* Assume no need to compress now, will be changed to FALSE later if not */
+    need_not_compress = TRUE;
+
+    /* Call appropriate function according to the datatype class */
+    switch(dtype_class) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+            if(H5Z_set_parms_atomic(type, cd_values) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        case H5T_ARRAY:
+            if(H5Z_set_parms_array(type, cd_values) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        case H5T_COMPOUND:
+            if(H5Z_set_parms_compound(type, cd_values) < 0)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        default: /* no need to set parameters for other datatypes at top level */
+             break;
+    } /* end switch */
+
+    /* Check if calculation of parameters matches with setting of parameters */
+    HDassert(cd_values_actual_nparms == cd_values_index);
+
+    /* Finally set the first two entries of cd_values[] */
+    cd_values[0] = cd_values_actual_nparms;
+    cd_values[1] = need_not_compress;
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5P_modify_filter(dcpl_plist, H5Z_FILTER_NBIT, flags, cd_values_actual_nparms, cd_values) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "can't set local nbit parameters")
+
+done:
+    if(cd_values)
+	H5MM_xfree(cd_values);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local_nbit() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_nbit
+ *
+ * Purpose:	Implement an I/O filter for storing packed nbit data
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Xiaowen Wu
+ *              Friday, January 21, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
+                size_t nbytes, size_t *buf_size, void **buf)
+{
+    unsigned char *outbuf;      /* pointer to new output buffer */
+    size_t size_out  = 0;       /* size of output buffer */
+    unsigned d_nelmts = 0;      /* number of elements in the chunk */
+    size_t ret_value = 0;       /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments
+     * cd_values[0] stores actual number of parameters in cd_values[]
+     */
+    if(cd_nelmts != cd_values[0])
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid nbit aggression level")
+
+    /* check if need to do nbit compress or decompress
+     * cd_values[1] stores the flag if true indicating no need to compress
+     */
+    if(cd_values[1])
+        HGOTO_DONE(*buf_size)
+
+    /* copy a filter parameter to d_nelmts */
+    d_nelmts = cd_values[2];
+
+    /* input; decompress */
+    if(flags & H5Z_FLAG_REVERSE) {
+        size_out = d_nelmts * cd_values[4]; /* cd_values[4] stores datatype size */
+
+        /* allocate memory space for decompressed buffer */
+        if(NULL == (outbuf = (unsigned char *)H5MM_malloc(size_out)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for nbit decompression")
+
+        /* decompress the buffer */
+        if(H5Z__nbit_decompress(outbuf, d_nelmts, (unsigned char *)*buf, cd_values) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, 0, "can't decompress buffer")
+    } /* end if */
+    /* output; compress */
+    else {
+        HDassert(nbytes == d_nelmts * cd_values[4]);
+
+        size_out = nbytes;
+
+        /* allocate memory space for compressed buffer */
+        if(NULL == (outbuf = (unsigned char *)H5MM_malloc(size_out)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for nbit compression")
+
+        /* compress the buffer, size_out will be changed */
+        H5Z_nbit_compress((unsigned char *)*buf, d_nelmts, outbuf, &size_out, cd_values);
+    } /* end else */
+
+    /* free the input buffer */
+    H5MM_xfree(*buf);
+
+    /* set return values */
+    *buf = outbuf;
+    *buf_size = size_out;
+    ret_value = size_out;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_filter_nbit() */
+
+/* ======== Nbit Algorithm ===============================================
+ * assume one byte has 8 bit
+ * assume padding bit is 0
+ * assume size of unsigned char is one byte
+ * assume one data item of certain datatype is stored continously in bytes
+ * atomic datatype is treated on byte basis
+ */
+
+static void
+H5Z_nbit_next_byte(size_t *j, int *buf_len)
+{
+   ++(*j);
+   *buf_len = 8 * sizeof(unsigned char);
+}
+
+static void
+H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k,
+    int begin_i, int end_i, unsigned char *buffer, size_t *j, int *buf_len,
+    parms_atomic p, int datatype_len)
+{
+   int dat_len; /* dat_len is the number of bits to be copied in each data byte */
+   int uchar_offset;
+   unsigned char val; /* value to be copied in each data byte */
+
+   /* initialize value and bits of unsigned char to be copied */
+   val = buffer[*j];
+   uchar_offset = 0;
+
+   if(begin_i != end_i) { /* significant bits occupy >1 unsigned char */
+      if(k == begin_i)
+         dat_len = 8 - (datatype_len - p.precision - p.offset) % 8;
+      else if(k == end_i) {
+         dat_len = 8 - p.offset %8;
+         uchar_offset = 8 - dat_len;
+      }
+      else
+         dat_len = 8;
+   } else { /* all significant bits in one unsigned char */
+      uchar_offset = p.offset % 8;
+      dat_len = p.precision;
+   }
+
+   if(*buf_len > dat_len) {
+      data[data_offset + k] =
+      ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
+      *buf_len -= dat_len;
+   } else {
+      data[data_offset + k] =
+      ((val & ~(~0 << *buf_len)) << (dat_len - *buf_len)) << uchar_offset;
+      dat_len -= *buf_len;
+      H5Z_nbit_next_byte(j, buf_len);
+      if(dat_len == 0) return;
+
+      val = buffer[*j];
+      data[data_offset + k] |=
+      ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
+      *buf_len -= dat_len;
+   }
+}
+
+static void
+H5Z_nbit_decompress_one_nooptype(unsigned char *data, size_t data_offset,
+                       unsigned char *buffer, size_t *j, int *buf_len, unsigned size)
+{
+   unsigned i;        /* index */
+   unsigned dat_len;  /* dat_len is the number of bits to be copied in each data byte */
+   unsigned char val; /* value to be copied in each data byte */
+
+   for(i = 0; i < size; i++) {
+      /* initialize value and bits of unsigned char to be copied */
+      val = buffer[*j];
+      dat_len = sizeof(unsigned char) * 8;
+
+      data[data_offset + i] = ((val & ~(~0 << *buf_len)) << (dat_len - *buf_len));
+      dat_len -= *buf_len;
+      H5Z_nbit_next_byte(j, buf_len);
+      if(dat_len == 0) continue;
+
+      val = buffer[*j];
+      data[data_offset + i] |= ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      *buf_len -= dat_len;
+   }
+}
+
+static void
+H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
+                    unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
+{
+   /* begin_i: the index of byte having first significant bit
+      end_i: the index of byte having last significant bit */
+   int k, begin_i, end_i, datatype_len;
+
+   datatype_len = p.size * 8;
+
+   if(p.order == H5Z_NBIT_ORDER_LE) { /* little endian */
+      /* calculate begin_i and end_i */
+      if((p.precision + p.offset) % 8 != 0)
+         begin_i = (p.precision + p.offset) / 8;
+      else
+         begin_i = (p.precision + p.offset) / 8 - 1;
+      end_i = p.offset / 8;
+
+      for(k = begin_i; k >= end_i; k--)
+         H5Z_nbit_decompress_one_byte(data, data_offset, k, begin_i, end_i,
+                                      buffer, j, buf_len, p, datatype_len);
+   }
+
+   if(p.order == H5Z_NBIT_ORDER_BE) { /* big endian */
+      /* calculate begin_i and end_i */
+      begin_i = (datatype_len - p.precision - p.offset) / 8;
+      if(p.offset % 8 != 0)
+         end_i = (datatype_len - p.offset) / 8;
+      else
+         end_i = (datatype_len - p.offset) / 8 - 1;
+
+      for(k = begin_i; k <= end_i; k++)
+         H5Z_nbit_decompress_one_byte(data, data_offset, k, begin_i, end_i,
+                                      buffer, j, buf_len, p, datatype_len);
+   }
+}
+
+static herr_t
+H5Z__nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+           unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+{
+   unsigned i, total_size, base_class, base_size, n, begin_index;
+   parms_atomic p;
+   herr_t ret_value = SUCCEED; /* Return value */
+
+   FUNC_ENTER_STATIC
+
+   total_size = parms[parms_index++];
+   base_class = parms[parms_index++];
+
+   switch(base_class) {
+      case H5Z_NBIT_ATOMIC:
+           p.size = parms[parms_index++];
+           p.order = parms[parms_index++];
+           p.precision = parms[parms_index++];
+           p.offset = parms[parms_index++];
+
+           /* Check values of precision and offset */
+           if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+              HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+           n = total_size / p.size;
+           for(i = 0; i < n; i++)
+              H5Z_nbit_decompress_one_atomic(data, data_offset + i*p.size,
+                                             buffer, j, buf_len, p);
+           break;
+      case H5Z_NBIT_ARRAY:
+           base_size = parms[parms_index]; /* read in advance */
+           n = total_size/base_size; /* number of base_type elements inside the array datatype */
+           begin_index = parms_index;
+           for(i = 0; i < n; i++) {
+              if(H5Z__nbit_decompress_one_array(data, data_offset + i * base_size,
+                                            buffer, j, buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
+              parms_index = begin_index;
+           }
+           break;
+      case H5Z_NBIT_COMPOUND:
+           base_size = parms[parms_index]; /* read in advance */
+           n = total_size/base_size; /* number of base_type elements inside the array datatype */
+           begin_index = parms_index;
+           for(i = 0; i < n; i++) {
+              if(H5Z__nbit_decompress_one_compound(data, data_offset + i * base_size,
+                                               buffer, j, buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
+              parms_index = begin_index;
+           }
+           break;
+      case H5Z_NBIT_NOOPTYPE:
+           parms_index++; /* skip size of no-op type */
+           H5Z_nbit_decompress_one_nooptype(data, data_offset, buffer, j, buf_len, total_size);
+           break;
+      default:
+          HDassert(0 && "This Should never be executed!");
+   } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5Z__nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+              unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+{
+   unsigned i, nmembers, member_offset, member_class, member_size, used_size = 0, size;
+   parms_atomic p;
+   herr_t ret_value = SUCCEED; /* Return value */
+
+   FUNC_ENTER_STATIC
+
+   size = parms[parms_index++];
+   nmembers = parms[parms_index++];
+
+   for(i = 0; i < nmembers; i++) {
+      member_offset = parms[parms_index++];
+      member_class = parms[parms_index++];
+
+      /* Check for overflow */
+      member_size = parms[parms_index];
+      used_size += member_size;
+      if(used_size > size)
+         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "compound member offset overflowed compound size")
+      switch(member_class) {
+         case H5Z_NBIT_ATOMIC:
+              p.size = member_size;
+              /* Advance past member size */
+              parms_index++;
+              p.order = parms[parms_index++];
+              p.precision = parms[parms_index++];
+              p.offset = parms[parms_index++];
+
+              /* Check values of precision and offset */
+              if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+              H5Z_nbit_decompress_one_atomic(data, data_offset + member_offset,
+                                             buffer, j, buf_len, p);
+              break;
+         case H5Z_NBIT_ARRAY:
+              if(H5Z__nbit_decompress_one_array(data, data_offset + member_offset,
+                                            buffer, j, buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
+              break;
+         case H5Z_NBIT_COMPOUND:
+              if(H5Z__nbit_decompress_one_compound(data, data_offset+member_offset,
+                                            buffer, j, buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
+              break;
+         case H5Z_NBIT_NOOPTYPE:
+              /* Advance past member size */
+              parms_index++;
+              H5Z_nbit_decompress_one_nooptype(data, data_offset+member_offset,
+                                               buffer, j, buf_len, member_size);
+              break;
+          default:
+              HDassert(0 && "This Should never be executed!");
+      } /* end switch */
+   }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static herr_t
+H5Z__nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+                                const unsigned parms[])
+{
+   /* i: index of data, j: index of buffer,
+      buf_len: number of bits to be filled in current byte */
+   size_t i, j, size;
+   int buf_len;
+   parms_atomic p;
+   herr_t ret_value = SUCCEED; /* Return value */
+
+   FUNC_ENTER_STATIC
+
+   /* may not have to initialize to zeros */
+   for(i = 0; i < d_nelmts*parms[4]; i++) data[i] = 0;
+
+   /* initialization before the loop */
+   j = 0;
+   buf_len = sizeof(unsigned char) * 8;
+
+   switch(parms[3]) {
+      case H5Z_NBIT_ATOMIC:
+           /* set the index before goto function call */
+           p.size = parms[4];
+           p.order = parms[5];
+           p.precision = parms[6];
+           p.offset = parms[7];
+
+           /* Check values of precision and offset */
+           if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+              HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+           for(i = 0; i < d_nelmts; i++) {
+              H5Z_nbit_decompress_one_atomic(data, i*p.size, buffer, &j, &buf_len, p);
+           }
+           break;
+      case H5Z_NBIT_ARRAY:
+           size = parms[4];
+           parms_index = 4;
+           for(i = 0; i < d_nelmts; i++) {
+              if(H5Z__nbit_decompress_one_array(data, i*size, buffer, &j, &buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
+              parms_index = 4;
+           }
+           break;
+      case H5Z_NBIT_COMPOUND:
+           size = parms[4];
+           parms_index = 4;
+           for(i = 0; i < d_nelmts; i++) {
+              if(H5Z__nbit_decompress_one_compound(data, i*size, buffer, &j, &buf_len, parms) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
+              parms_index = 4;
+           }
+           break;
+      default:
+          HDassert(0 && "This Should never be executed!");
+   } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
+int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len)
+{
+   int dat_len; /* dat_len is the number of bits to be copied in each data byte */
+   unsigned char val; /* value to be copied in each data byte */
+
+   /* initialize value and bits of unsigned char to be copied */
+   val = data[data_offset + k];
+   if(begin_i != end_i) { /* significant bits occupy >1 unsigned char */
+      if(k == begin_i)
+         dat_len = 8 - (datatype_len - p.precision - p.offset) % 8;
+      else if(k == end_i) {
+         dat_len = 8 - p.offset % 8;
+         val >>= 8 - dat_len;
+      }
+      else
+         dat_len = 8;
+   } else { /* all significant bits in one unsigned char */
+      val >>= p.offset % 8;
+      dat_len = p.precision;
+   }
+
+   if(*buf_len > dat_len) {
+      buffer[*j] |= (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      *buf_len -= dat_len;
+   } else {
+      buffer[*j] |= (val >> (dat_len - *buf_len)) & ~(~0 << *buf_len);
+      dat_len -= *buf_len;
+      H5Z_nbit_next_byte(j, buf_len);
+      if(dat_len == 0) return;
+
+      buffer[*j] = (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      *buf_len -= dat_len;
+   }
+}
+
+static void H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offset,
+                     unsigned char *buffer, size_t *j, int *buf_len, unsigned size)
+{
+   unsigned i;        /* index */
+   unsigned dat_len;  /* dat_len is the number of bits to be copied in each data byte */
+   unsigned char val; /* value to be copied in each data byte */
+
+   for(i = 0; i < size; i++) {
+      /* initialize value and bits of unsigned char to be copied */
+      val = data[data_offset + i];
+      dat_len = sizeof(unsigned char) * 8;
+
+      buffer[*j] |= (val >> (dat_len - *buf_len)) & ~(~0 << *buf_len);
+      dat_len -= *buf_len;
+      H5Z_nbit_next_byte(j, buf_len);
+      if(dat_len == 0) continue;
+
+      buffer[*j] = (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      *buf_len -= dat_len;
+   }
+}
+
+static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
+                  unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
+{
+   /* begin_i: the index of byte having first significant bit
+      end_i: the index of byte having last significant bit */
+   int k, begin_i, end_i, datatype_len;
+
+   datatype_len = p.size * 8;
+
+   if(p.order == H5Z_NBIT_ORDER_LE) { /* little endian */
+      /* calculate begin_i and end_i */
+      if((p.precision + p.offset) % 8 != 0)
+         begin_i = (p.precision + p.offset) / 8;
+      else
+         begin_i = (p.precision + p.offset) / 8 - 1;
+      end_i = p.offset / 8;
+
+      for(k = begin_i; k >= end_i; k--)
+         H5Z_nbit_compress_one_byte(data, data_offset, k, begin_i, end_i,
+                                    buffer, j, buf_len, p, datatype_len);
+   }
+
+   if(p.order == H5Z_NBIT_ORDER_BE) { /* big endian */
+      /* calculate begin_i and end_i */
+      begin_i = (datatype_len - p.precision - p.offset) / 8;
+      if(p.offset % 8 != 0)
+         end_i = (datatype_len - p.offset) / 8;
+      else
+         end_i = (datatype_len - p.offset) / 8 - 1;
+
+      for(k = begin_i; k <= end_i; k++)
+         H5Z_nbit_compress_one_byte(data, data_offset, k, begin_i, end_i,
+                                    buffer, j, buf_len, p, datatype_len);
+   }
+}
+
+static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset, unsigned char *buffer,
+                                 size_t *j, int *buf_len, const unsigned parms[])
+{
+   unsigned i, total_size, base_class, base_size, n, begin_index;
+   parms_atomic p;
+
+   total_size = parms[parms_index++];
+   base_class = parms[parms_index++];
+
+   switch(base_class) {
+      case H5Z_NBIT_ATOMIC:
+           p.size = parms[parms_index++];
+           p.order = parms[parms_index++];
+           p.precision = parms[parms_index++];
+           p.offset = parms[parms_index++];
+           n = total_size/p.size;
+           for(i = 0; i < n; i++)
+              H5Z_nbit_compress_one_atomic(data, data_offset + i*p.size,
+                                           buffer, j, buf_len, p);
+           break;
+      case H5Z_NBIT_ARRAY:
+           base_size = parms[parms_index]; /* read in advance */
+           n = total_size/base_size; /* number of base_type elements inside the array datatype */
+           begin_index = parms_index;
+           for(i = 0; i < n; i++) {
+              H5Z_nbit_compress_one_array(data, data_offset + i*base_size,
+                                          buffer, j, buf_len, parms);
+              parms_index = begin_index;
+           }
+           break;
+      case H5Z_NBIT_COMPOUND:
+           base_size = parms[parms_index]; /* read in advance */
+           n = total_size/base_size; /* number of base_type elements inside the array datatype */
+           begin_index = parms_index;
+           for(i = 0; i < n; i++) {
+              H5Z_nbit_compress_one_compound(data, data_offset + i*base_size,
+                                             buffer, j, buf_len, parms);
+              parms_index = begin_index;
+           }
+           break;
+      case H5Z_NBIT_NOOPTYPE:
+           parms_index++; /* skip size of no-op type */
+           H5Z_nbit_compress_one_nooptype(data, data_offset, buffer, j, buf_len, total_size);
+           break;
+      default:
+          HDassert(0 && "This Should never be executed!");
+   } /* end switch */
+}
+
+static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
+            unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+{
+   unsigned i, nmembers, member_offset, member_class, size;
+   parms_atomic p;
+
+   parms_index++; /* skip size of compound datatype */
+   nmembers = parms[parms_index++];
+
+   for(i = 0; i < nmembers; i++) {
+      member_offset = parms[parms_index++];
+      member_class = parms[parms_index++];
+
+      switch(member_class) {
+         case H5Z_NBIT_ATOMIC:
+              p.size = parms[parms_index++];
+              p.order = parms[parms_index++];
+              p.precision = parms[parms_index++];
+              p.offset = parms[parms_index++];
+              H5Z_nbit_compress_one_atomic(data, data_offset + member_offset,
+                                           buffer, j, buf_len, p);
+              break;
+         case H5Z_NBIT_ARRAY:
+              H5Z_nbit_compress_one_array(data, data_offset + member_offset,
+                                          buffer, j, buf_len, parms);
+              break;
+         case H5Z_NBIT_COMPOUND:
+              H5Z_nbit_compress_one_compound(data, data_offset+member_offset,
+                                             buffer, j, buf_len, parms);
+              break;
+         case H5Z_NBIT_NOOPTYPE:
+              size = parms[parms_index++];
+              H5Z_nbit_compress_one_nooptype(data, data_offset+member_offset,
+                                             buffer, j, buf_len, size);
+              break;
+         default:
+             HDassert(0 && "This Should never be executed!");
+      } /* end switch */
+   }
+}
+
+static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+                              size_t *buffer_size, const unsigned parms[])
+{
+   /* i: index of data, new_size: index of buffer,
+      buf_len: number of bits to be filled in current byte */
+   size_t i, size;
+   size_t new_size = 0;
+   int buf_len;
+   parms_atomic p;
+
+   /* must initialize buffer to be zeros */
+   HDmemset(buffer, 0, *buffer_size);
+
+   /* initialization before the loop */
+   buf_len = sizeof(unsigned char) * 8;
+
+   switch(parms[3]) {
+      case H5Z_NBIT_ATOMIC:
+           /* set the index before goto function call */
+           p.size = parms[4];
+           p.order = parms[5];
+           p.precision = parms[6];
+           p.offset = parms[7];
+
+           for(i = 0; i < d_nelmts; i++) {
+              H5Z_nbit_compress_one_atomic(data, i*p.size, buffer, &new_size, &buf_len, p);
+           }
+           break;
+      case H5Z_NBIT_ARRAY:
+           size = parms[4];
+           parms_index = 4;
+           for(i = 0; i < d_nelmts; i++) {
+              H5Z_nbit_compress_one_array(data, i*size, buffer, &new_size, &buf_len, parms);
+              parms_index = 4;
+           }
+           break;
+      case H5Z_NBIT_COMPOUND:
+           size = parms[4];
+           parms_index = 4;
+           for(i = 0; i < d_nelmts; i++) {
+              H5Z_nbit_compress_one_compound(data, i*size, buffer, &new_size, &buf_len, parms);
+              parms_index = 4;
+           }
+           break;
+       default:
+           HDassert(0 && "This Should never be executed!");
+   } /* end switch */
+
+   /* Update the size to the new value after compression.  If there are any bits hanging over in
+    * the last byte, increment the value by 1. */
+   *buffer_size = new_size + 1;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zpkg.h b/gatb-core/thirdparty/hdf5/src/H5Zpkg.h
new file mode 100644
index 0000000..e2cec89
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zpkg.h
@@ -0,0 +1,57 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5Z_PACKAGE
+#error "Do not include this file outside the H5Z package!"
+#endif
+
+#ifndef _H5Zpkg_H
+#define _H5Zpkg_H
+
+/* Include private header file */
+#include "H5Zprivate.h"          /* Filter functions                */
+
+/********************/
+/* Internal filters */
+/********************/
+
+/* Shuffle filter */
+H5_DLLVAR const H5Z_class2_t H5Z_SHUFFLE[1];
+
+/* Fletcher32 filter */
+H5_DLLVAR const H5Z_class2_t H5Z_FLETCHER32[1];
+
+/* n-bit filter */
+H5_DLLVAR H5Z_class2_t H5Z_NBIT[1];
+
+/* Scale/offset filter */
+H5_DLLVAR H5Z_class2_t H5Z_SCALEOFFSET[1];
+
+/********************/
+/* External filters */
+/********************/
+
+/* Deflate filter */
+#ifdef H5_HAVE_FILTER_DEFLATE
+H5_DLLVAR const H5Z_class2_t H5Z_DEFLATE[1];
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+/* szip filter */
+#ifdef H5_HAVE_FILTER_SZIP
+H5_DLLVAR H5Z_class2_t H5Z_SZIP[1];
+#endif /* H5_HAVE_FILTER_SZIP */
+
+#endif /* _H5Zpkg_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zprivate.h b/gatb-core/thirdparty/hdf5/src/H5Zprivate.h
new file mode 100644
index 0000000..73d85ac
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zprivate.h
@@ -0,0 +1,111 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, April 16, 1998
+ */
+
+#ifndef _H5Zprivate_H
+#define _H5Zprivate_H
+
+/* Include package's public header */
+#include "H5Zpublic.h"
+
+/* Private headers needed by this file */
+#include "H5Tprivate.h"		/* Datatypes				*/
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+/* Special parameters for szip compression */
+/* [These are aliases for the similar definitions in szlib.h, which we can't
+ * include directly due to the duplication of various symbols with the zlib.h
+ * header file] */
+#define H5_SZIP_LSB_OPTION_MASK         8
+#define H5_SZIP_MSB_OPTION_MASK         16
+#define H5_SZIP_RAW_OPTION_MASK         128
+
+/* Common # of 'client data values' for filters */
+/* (avoids dynamic memory allocation in most cases) */
+#define H5Z_COMMON_CD_VALUES    4
+
+/* Common size of filter name */
+/* (avoids dynamic memory allocation in most cases) */
+#define H5Z_COMMON_NAME_LEN    12
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Structure to store information about each filter's parameters */
+typedef struct H5Z_filter_info_t {
+    H5Z_filter_t	id;		/*filter identification number	     */
+    unsigned		flags;		/*defn and invocation flags	     */
+    char		_name[H5Z_COMMON_NAME_LEN];	/*internal filter name		     */
+    char		*name;		/*optional filter name		     */
+    size_t		cd_nelmts;	/*number of elements in cd_values[]  */
+    unsigned		_cd_values[H5Z_COMMON_CD_VALUES];	/*internal client data values		     */
+    unsigned		*cd_values;	/*client data values		     */
+} H5Z_filter_info_t;
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+struct H5O_pline_t; /*forward decl*/
+
+/* Internal API routines */
+H5_DLL herr_t H5Z_init(void);
+H5_DLL herr_t H5Z_register(const H5Z_class2_t *cls);
+H5_DLL herr_t H5Z_append(struct H5O_pline_t *pline, H5Z_filter_t filter,
+        unsigned flags, size_t cd_nelmts, const unsigned int cd_values[]);
+H5_DLL herr_t H5Z_modify(const struct H5O_pline_t *pline, H5Z_filter_t filter,
+        unsigned flags, size_t cd_nelmts, const unsigned int cd_values[]);
+H5_DLL herr_t H5Z_pipeline(const struct H5O_pline_t *pline,
+			    unsigned flags, unsigned *filter_mask/*in,out*/,
+ 			    H5Z_EDC_t edc_read, H5Z_cb_t cb_struct,
+			    size_t *nbytes/*in,out*/, size_t *buf_size/*in,out*/,
+                            void **buf/*in,out*/);
+H5_DLL H5Z_class2_t *H5Z_find(H5Z_filter_t id);
+H5_DLL herr_t H5Z_can_apply(hid_t dcpl_id, hid_t type_id);
+H5_DLL herr_t H5Z_set_local(hid_t dcpl_id, hid_t type_id);
+H5_DLL herr_t H5Z_can_apply_direct(const struct H5O_pline_t *pline);
+H5_DLL herr_t H5Z_set_local_direct(const struct H5O_pline_t *pline);
+H5_DLL H5Z_filter_info_t *H5Z_filter_info(const struct H5O_pline_t *pline,
+        H5Z_filter_t filter);
+H5_DLL htri_t H5Z_filter_in_pline(const struct H5O_pline_t *pline, H5Z_filter_t filter);
+H5_DLL htri_t H5Z_all_filters_avail(const struct H5O_pline_t *pline);
+H5_DLL herr_t H5Z_unregister(H5Z_filter_t filter_id);
+H5_DLL htri_t H5Z_filter_avail(H5Z_filter_t id);
+H5_DLL herr_t H5Z_delete(struct H5O_pline_t *pline, H5Z_filter_t filter);
+H5_DLL herr_t H5Z_get_filter_info(H5Z_filter_t filter, unsigned int *filter_config_flags);
+
+/* Data Transform Functions */
+typedef struct H5Z_data_xform_t H5Z_data_xform_t; /* Defined in H5Ztrans.c */
+
+H5_DLL H5Z_data_xform_t *H5Z_xform_create(const char *expr);
+H5_DLL herr_t H5Z_xform_copy(H5Z_data_xform_t **data_xform_prop);
+H5_DLL herr_t H5Z_xform_destroy(H5Z_data_xform_t *data_xform_prop);
+H5_DLL herr_t H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void *array,
+    size_t array_size, const H5T_t *buf_type);
+H5_DLL hbool_t H5Z_xform_noop(const H5Z_data_xform_t *data_xform_prop);
+H5_DLL const char *H5Z_xform_extract_xform_str(const H5Z_data_xform_t *data_xform_prop);
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zpublic.h b/gatb-core/thirdparty/hdf5/src/H5Zpublic.h
new file mode 100644
index 0000000..8daa5f4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zpublic.h
@@ -0,0 +1,250 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, April 16, 1998
+ */
+
+#ifndef _H5Zpublic_H
+#define _H5Zpublic_H
+
+/* Public headers needed by this file */
+#include "H5public.h"
+
+/*
+ * Filter identifiers.  Values 0 through 255 are for filters defined by the
+ * HDF5 library.  Values 256 through 511 are available for testing new
+ * filters. Subsequent values should be obtained from the HDF5 development
+ * team at hdf5dev at ncsa.uiuc.edu.  These values will never change because they
+ * appear in the HDF5 files.
+ */
+typedef int H5Z_filter_t;
+
+/* Filter IDs */
+#define H5Z_FILTER_ERROR	(-1)	/*no filter			*/
+#define H5Z_FILTER_NONE		0	/*reserved indefinitely		*/
+#define H5Z_FILTER_DEFLATE	1 	/*deflation like gzip	     	*/
+#define H5Z_FILTER_SHUFFLE      2       /*shuffle the data              */
+#define H5Z_FILTER_FLETCHER32   3       /*fletcher32 checksum of EDC    */
+#define H5Z_FILTER_SZIP         4       /*szip compression              */
+#define H5Z_FILTER_NBIT         5       /*nbit compression              */
+#define H5Z_FILTER_SCALEOFFSET  6       /*scale+offset compression      */
+#define H5Z_FILTER_RESERVED     256	/*filter ids below this value are reserved for library use */
+
+#define H5Z_FILTER_MAX		65535	/*maximum filter id		*/
+
+/* General macros */
+#define H5Z_FILTER_ALL	 	0	/* Symbol to remove all filters in H5Premove_filter */
+#define H5Z_MAX_NFILTERS        32      /* Maximum number of filters allowed in a pipeline */
+                                        /* (should probably be allowed to be an
+                                         * unlimited amount, but currently each
+                                         * filter uses a bit in a 32-bit field,
+                                         * so the format would have to be
+                                         * changed to accomodate that)
+                                         */
+
+/* Flags for filter definition (stored) */
+#define H5Z_FLAG_DEFMASK	0x00ff	/*definition flag mask		*/
+#define H5Z_FLAG_MANDATORY      0x0000  /*filter is mandatory		*/
+#define H5Z_FLAG_OPTIONAL	0x0001	/*filter is optional		*/
+
+/* Additional flags for filter invocation (not stored) */
+#define H5Z_FLAG_INVMASK	0xff00	/*invocation flag mask		*/
+#define H5Z_FLAG_REVERSE	0x0100	/*reverse direction; read	*/
+#define H5Z_FLAG_SKIP_EDC	0x0200	/*skip EDC filters for read	*/
+
+/* Special parameters for szip compression */
+/* [These are aliases for the similar definitions in szlib.h, which we can't
+ * include directly due to the duplication of various symbols with the zlib.h
+ * header file] */
+#define H5_SZIP_ALLOW_K13_OPTION_MASK   1
+#define H5_SZIP_CHIP_OPTION_MASK        2
+#define H5_SZIP_EC_OPTION_MASK          4
+#define H5_SZIP_NN_OPTION_MASK          32
+#define H5_SZIP_MAX_PIXELS_PER_BLOCK    32
+
+/* Macros for the shuffle filter */
+#define H5Z_SHUFFLE_USER_NPARMS    0    /* Number of parameters that users can set */
+#define H5Z_SHUFFLE_TOTAL_NPARMS   1    /* Total number of parameters for filter */
+
+/* Macros for the szip filter */
+#define H5Z_SZIP_USER_NPARMS    2       /* Number of parameters that users can set */
+#define H5Z_SZIP_TOTAL_NPARMS   4       /* Total number of parameters for filter */
+#define H5Z_SZIP_PARM_MASK      0       /* "User" parameter for option mask */
+#define H5Z_SZIP_PARM_PPB       1       /* "User" parameter for pixels-per-block */
+#define H5Z_SZIP_PARM_BPP       2       /* "Local" parameter for bits-per-pixel */
+#define H5Z_SZIP_PARM_PPS       3       /* "Local" parameter for pixels-per-scanline */
+
+/* Macros for the nbit filter */
+#define H5Z_NBIT_USER_NPARMS     0     /* Number of parameters that users can set */
+
+/* Macros for the scale offset filter */
+#define H5Z_SCALEOFFSET_USER_NPARMS      2    /* Number of parameters that users can set */
+
+
+/* Special parameters for ScaleOffset filter*/
+#define H5Z_SO_INT_MINBITS_DEFAULT 0
+typedef enum H5Z_SO_scale_type_t {
+    H5Z_SO_FLOAT_DSCALE = 0,
+    H5Z_SO_FLOAT_ESCALE = 1,
+    H5Z_SO_INT          = 2
+} H5Z_SO_scale_type_t;
+
+/* Current version of the H5Z_class_t struct */
+#define H5Z_CLASS_T_VERS (1)
+
+/* Values to decide if EDC is enabled for reading data */
+typedef enum H5Z_EDC_t {
+    H5Z_ERROR_EDC       = -1,   /* error value */
+    H5Z_DISABLE_EDC     = 0,
+    H5Z_ENABLE_EDC      = 1,
+    H5Z_NO_EDC          = 2     /* must be the last */
+} H5Z_EDC_t;
+
+/* Bit flags for H5Zget_filter_info */
+#define H5Z_FILTER_CONFIG_ENCODE_ENABLED (0x0001)
+#define H5Z_FILTER_CONFIG_DECODE_ENABLED (0x0002)
+
+/* Return values for filter callback function */
+typedef enum H5Z_cb_return_t {
+    H5Z_CB_ERROR  = -1,
+    H5Z_CB_FAIL   = 0,    /* I/O should fail if filter fails. */
+    H5Z_CB_CONT   = 1,    /* I/O continues if filter fails.   */
+    H5Z_CB_NO     = 2
+} H5Z_cb_return_t;
+
+/* Filter callback function definition */
+typedef H5Z_cb_return_t (*H5Z_filter_func_t)(H5Z_filter_t filter, void* buf,
+                                size_t buf_size, void* op_data);
+
+/* Structure for filter callback property */
+typedef struct H5Z_cb_t {
+    H5Z_filter_func_t func;
+    void*              op_data;
+} H5Z_cb_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Before a dataset gets created, the "can_apply" callbacks for any filters used
+ * in the dataset creation property list are called
+ * with the dataset's dataset creation property list, the dataset's datatype and
+ * a dataspace describing a chunk (for chunked dataset storage).
+ *
+ * The "can_apply" callback must determine if the combination of the dataset
+ * creation property list setting, the datatype and the dataspace represent a
+ * valid combination to apply this filter to.  For example, some cases of
+ * invalid combinations may involve the filter not operating correctly on
+ * certain datatypes (or certain datatype sizes), or certain sizes of the chunk
+ * dataspace.
+ *
+ * The "can_apply" callback can be the NULL pointer, in which case, the library
+ * will assume that it can apply to any combination of dataset creation
+ * property list values, datatypes and dataspaces.
+ *
+ * The "can_apply" callback returns positive a valid combination, zero for an
+ * invalid combination and negative for an error.
+ */
+typedef htri_t (*H5Z_can_apply_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+
+/*
+ * After the "can_apply" callbacks are checked for new datasets, the "set_local"
+ * callbacks for any filters used in the dataset creation property list are
+ * called.  These callbacks receive the dataset's private copy of the dataset
+ * creation property list passed in to H5Dcreate (i.e. not the actual property
+ * list passed in to H5Dcreate) and the datatype ID passed in to H5Dcreate
+ * (which is not copied and should not be modified) and a dataspace describing
+ * the chunk (for chunked dataset storage) (which should also not be modified).
+ *
+ * The "set_local" callback must set any parameters that are specific to this
+ * dataset, based on the combination of the dataset creation property list
+ * values, the datatype and the dataspace.  For example, some filters perform
+ * different actions based on different datatypes (or datatype sizes) or
+ * different number of dimensions or dataspace sizes.
+ *
+ * The "set_local" callback can be the NULL pointer, in which case, the library
+ * will assume that there are no dataset-specific settings for this filter.
+ *
+ * The "set_local" callback must return non-negative on success and negative
+ * for an error.
+ */
+typedef herr_t (*H5Z_set_local_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+
+/*
+ * A filter gets definition flags and invocation flags (defined above), the
+ * client data array and size defined when the filter was added to the
+ * pipeline, the size in bytes of the data on which to operate, and pointers
+ * to a buffer and its allocated size.
+ *
+ * The filter should store the result in the supplied buffer if possible,
+ * otherwise it can allocate a new buffer, freeing the original.  The
+ * allocated size of the new buffer should be returned through the BUF_SIZE
+ * pointer and the new buffer through the BUF pointer.
+ *
+ * The return value from the filter is the number of bytes in the output
+ * buffer. If an error occurs then the function should return zero and leave
+ * all pointer arguments unchanged.
+ */
+typedef size_t (*H5Z_func_t)(unsigned int flags, size_t cd_nelmts,
+			     const unsigned int cd_values[], size_t nbytes,
+			     size_t *buf_size, void **buf);
+
+/*
+ * The filter table maps filter identification numbers to structs that
+ * contain a pointers to the filter function and timing statistics.
+ */
+typedef struct H5Z_class2_t {
+    int version;                /* Version number of the H5Z_class_t struct */
+    H5Z_filter_t id;		/* Filter ID number			     */
+    unsigned encoder_present;   /* Does this filter have an encoder? */
+    unsigned decoder_present;   /* Does this filter have a decoder? */
+    const char	*name;		/* Comment for debugging		     */
+    H5Z_can_apply_func_t can_apply; /* The "can apply" callback for a filter */
+    H5Z_set_local_func_t set_local; /* The "set local" callback for a filter */
+    H5Z_func_t filter;		/* The actual filter function		     */
+} H5Z_class2_t;
+
+H5_DLL herr_t H5Zregister(const void *cls);
+H5_DLL herr_t H5Zunregister(H5Z_filter_t id);
+H5_DLL htri_t H5Zfilter_avail(H5Z_filter_t id);
+H5_DLL herr_t H5Zget_filter_info(H5Z_filter_t filter, unsigned int *filter_config_flags);
+
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/*
+ * The filter table maps filter identification numbers to structs that
+ * contain a pointers to the filter function and timing statistics.
+ */
+typedef struct H5Z_class1_t {
+    H5Z_filter_t id;		/* Filter ID number			     */
+    const char	*name;		/* Comment for debugging		     */
+    H5Z_can_apply_func_t can_apply; /* The "can apply" callback for a filter */
+    H5Z_set_local_func_t set_local; /* The "set local" callback for a filter */
+    H5Z_func_t filter;		/* The actual filter function		     */
+} H5Z_class1_t;
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zscaleoffset.c b/gatb-core/thirdparty/hdf5/src/H5Zscaleoffset.c
new file mode 100644
index 0000000..673b9e0
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zscaleoffset.c
@@ -0,0 +1,1723 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Oprivate.h"         /* Object headers                       */
+#include "H5Sprivate.h"		/* Dataspaces         			*/
+#include "H5Tprivate.h"		/* Datatypes         			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+/* Struct of parameters needed for compressing/decompressing one atomic datatype */
+typedef struct {
+   size_t size;        /* datatype size */
+   uint32_t minbits;   /* minimum bits to compress one value of such datatype */
+   unsigned mem_order; /* current memory endianness order */
+} parms_atomic;
+
+enum H5Z_scaleoffset_t {t_bad=0, t_uchar=1, t_ushort, t_uint, t_ulong, t_ulong_long,
+                           t_schar, t_short, t_int, t_long, t_long_long,
+                           t_float, t_double};
+
+/* Local function prototypes */
+static double H5Z_scaleoffset_rnd(double val);
+static htri_t H5Z_can_apply_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static enum H5Z_scaleoffset_t H5Z_scaleoffset_get_type(unsigned dtype_class,
+    unsigned dtype_size, unsigned dtype_sign);
+static herr_t H5Z_scaleoffset_set_parms_fillval(H5P_genplist_t *dcpl_plist,
+    H5T_t *type, enum H5Z_scaleoffset_t scale_type, unsigned cd_values[],
+    int need_convert, hid_t dxpl_id);
+static herr_t H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static size_t H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts,
+    const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
+static void H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, size_t dtype_size);
+static unsigned H5Z_scaleoffset_log2(unsigned long long num);
+static void H5Z_scaleoffset_precompress_i(void *data, unsigned d_nelmts,
+    enum H5Z_scaleoffset_t type, unsigned filavail, const unsigned cd_values[],
+    uint32_t *minbits, unsigned long long *minval);
+static void H5Z_scaleoffset_postdecompress_i(void *data, unsigned d_nelmts,
+    enum H5Z_scaleoffset_t type, unsigned filavail, const unsigned cd_values[],
+    uint32_t minbits, unsigned long long minval);
+static herr_t H5Z_scaleoffset_precompress_fd(void *data, unsigned d_nelmts,
+    enum H5Z_scaleoffset_t type, unsigned filavail, const unsigned cd_values[],
+    uint32_t *minbits, unsigned long long *minval, double D_val);
+static herr_t H5Z_scaleoffset_postdecompress_fd(void *data, unsigned d_nelmts,
+    enum H5Z_scaleoffset_t type, unsigned filavail, const unsigned cd_values[],
+    uint32_t minbits, unsigned long long minval, double D_val);
+static void H5Z_scaleoffset_next_byte(size_t *j, unsigned *buf_len);
+static void H5Z_scaleoffset_decompress_one_byte(unsigned char *data, size_t data_offset,
+    unsigned k, unsigned begin_i, unsigned char *buffer, size_t *j, unsigned *buf_len,
+    parms_atomic p, unsigned dtype_len);
+static void H5Z_scaleoffset_compress_one_byte(unsigned char *data, size_t data_offset,
+    unsigned k, unsigned begin_i, unsigned char *buffer, size_t *j, unsigned *buf_len,
+    parms_atomic p, unsigned dtype_len);
+static void H5Z_scaleoffset_decompress_one_atomic(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, unsigned *buf_len, parms_atomic p);
+static void H5Z_scaleoffset_compress_one_atomic(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, unsigned *buf_len, parms_atomic p);
+static void H5Z_scaleoffset_decompress(unsigned char *data, unsigned d_nelmts,
+    unsigned char *buffer, parms_atomic p);
+static void H5Z_scaleoffset_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+    size_t buffer_size, parms_atomic p);
+
+/* This message derives from H5Z */
+H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_SCALEOFFSET, /* Filter id number		*/
+    1,              /* Assume encoder present: check before registering */
+    1,              /* decoder_present flag (set to true) */
+    "scaleoffset",		/* Filter name for debugging	*/
+    H5Z_can_apply_scaleoffset,	/* The "can apply" callback     */
+    H5Z_set_local_scaleoffset,  /* The "set local" callback     */
+    H5Z_filter_scaleoffset,	/* The actual filter function	*/
+}};
+
+/* Local macros */
+#define H5Z_SCALEOFFSET_TOTAL_NPARMS     20   /* Total number of parameters for filter */
+#define H5Z_SCALEOFFSET_PARM_SCALETYPE   0    /* "User" parameter for scale type */
+#define H5Z_SCALEOFFSET_PARM_SCALEFACTOR 1    /* "User" parameter for scale factor */
+#define H5Z_SCALEOFFSET_PARM_NELMTS      2    /* "Local" parameter for number of elements in the chunk */
+#define H5Z_SCALEOFFSET_PARM_CLASS       3    /* "Local" parameter for datatype class */
+#define H5Z_SCALEOFFSET_PARM_SIZE        4    /* "Local" parameter for datatype size */
+#define H5Z_SCALEOFFSET_PARM_SIGN        5    /* "Local" parameter for integer datatype sign */
+#define H5Z_SCALEOFFSET_PARM_ORDER       6    /* "Local" parameter for datatype byte order */
+#define H5Z_SCALEOFFSET_PARM_FILAVAIL    7    /* "Local" parameter for dataset fill value existence */
+#define H5Z_SCALEOFFSET_PARM_FILVAL      8    /* "Local" parameter for start location to store dataset fill value */
+
+#define H5Z_SCALEOFFSET_CLS_INTEGER      0    /* Integer (datatype class) */
+#define H5Z_SCALEOFFSET_CLS_FLOAT        1    /* Floatig-point (datatype class) */
+
+#define H5Z_SCALEOFFSET_SGN_NONE         0    /* Unsigned integer type */
+#define H5Z_SCALEOFFSET_SGN_2            1    /* Two's complement signed integer type */
+
+#define H5Z_SCALEOFFSET_ORDER_LE         0    /* Little endian (datatype byte order) */
+#define H5Z_SCALEOFFSET_ORDER_BE         1    /* Big endian (datatype byte order) */
+
+#define H5Z_SCALEOFFSET_FILL_UNDEFINED   0    /* Fill value is not defined */
+#define H5Z_SCALEOFFSET_FILL_DEFINED     1    /* Fill value is defined */
+
+/* Store fill value in cd_values[] */
+#define H5Z_scaleoffset_save_filval(type, cd_values, fill_val)                   \
+{                                                                                \
+    unsigned _i = H5Z_SCALEOFFSET_PARM_FILVAL; /* index into cd_values  */       \
+    uint32_t _cd_value;         /* Current cd_value */                           \
+    char *_fv_p;                /* Pointer to current byte in fill_val */        \
+    size_t _copy_size = 4;      /* # of bytes to copy this iteration */          \
+    size_t _size_rem = sizeof(type); /* # of bytes left to copy to cd_values */  \
+                                                                                 \
+    /* Store the fill value as the last entry in cd_values[]                     \
+     * Store byte by byte from least significant byte to most significant byte   \
+     * Plenty of space left for the fill value (from index 8 to 19)              \
+     * H5O_pline_encode will byte-swap each individual cd value, but we still    \
+     * need to swap the cd values as a whole if we are on a BE machine.  Note    \
+     * that we need to make sure to put the data only in the lowest 4 bytes of   \
+     * each, if sizeof(unsigned) > 4.                                            \
+     */                                                                          \
+    if(H5T_native_order_g == H5T_ORDER_LE) {                                     \
+        _fv_p = (char *)&(fill_val);                                             \
+        /* Copy 4 bytes at a time to each cd value */                            \
+        do {                                                                     \
+            if(_size_rem < 4) {                                                  \
+                /* Amount left to copy is smaller than a cd_value, adjust copy   \
+                 * size and initialize cd_value as it will not be fully          \
+                 * overwritten */                                                \
+                _copy_size = _size_rem;                                          \
+                _cd_value = (uint32_t)0;                                         \
+            } /* end if */                                                       \
+                                                                                 \
+            /* Copy the value */                                                 \
+            HDmemcpy(&_cd_value, _fv_p, _copy_size);                             \
+            (cd_values)[_i] = (unsigned)_cd_value;                               \
+                                                                                 \
+            /* Next field */                                                     \
+            _i++;                                                                \
+            _fv_p += _copy_size;                                                 \
+            _size_rem -= _copy_size;                                             \
+        } while(_size_rem);                                                      \
+    } /* end if */                                                               \
+    else {                                                                       \
+        HDassert(H5T_native_order_g == H5T_ORDER_BE);                            \
+                                                                                 \
+        /* Copy 4 bytes at a time to each cd value, but start at the end         \
+         * (highest address) of fill_val */                                      \
+        _fv_p = ((char *)&(fill_val)) + sizeof(type) - MIN(4, _size_rem);        \
+        while(_size_rem >= 4) {                                                  \
+            /* Copy the value */                                                 \
+            HDmemcpy(&_cd_value, _fv_p, _copy_size);                             \
+            (cd_values)[_i] = (unsigned)_cd_value;                               \
+                                                                                 \
+            /* Next field */                                                     \
+            _i++;                                                                \
+            _size_rem -= 4;                                                      \
+            if(_size_rem >= 4)                                                   \
+                _fv_p -= 4;                                                      \
+            else                                                                 \
+                _fv_p -= _size_rem;                                              \
+        } /* end while */                                                        \
+                                                                                 \
+        HDassert(_fv_p == (char *)&(fill_val));                                  \
+        if(_size_rem) {                                                          \
+            /* Amount left to copy is smaller than a cd_value, initialize        \
+             * _cd_value as it will not be fully overwritten and copy to the end \
+             * of _cd value as it is BE. */                                      \
+            _cd_value = (uint32_t)0;                                             \
+            HDmemcpy((char *)&_cd_value + 4 - _size_rem, _fv_p, _size_rem);      \
+            (cd_values)[_i] = (unsigned)_cd_value;                               \
+        } /* end if */                                                           \
+    } /* end else */                                                             \
+}
+
+/* Set the fill value parameter in cd_values[] for unsigned integer type */
+#define H5Z_scaleoffset_set_filval_1(type, dcpl_plist, dt, cd_values, need_convert, dxpl_id)\
+{                                                                                    \
+    type fill_val;                                                                   \
+                                                                                     \
+    /* Get dataset fill value */                                                     \
+    if(H5P_get_fill_value(dcpl_plist, dt, &fill_val, dxpl_id) < 0)                   \
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get fill value")        \
+                                                                                     \
+    if(need_convert)                                                                 \
+       H5Z_scaleoffset_convert(&fill_val, 1, sizeof(type));                          \
+                                                                                     \
+    H5Z_scaleoffset_save_filval(type, cd_values, fill_val)                           \
+}
+
+/* Set the fill value parameter in cd_values[] for signed integer type */
+#define H5Z_scaleoffset_set_filval_2(type, dcpl_plist, dt, cd_values, need_convert, dxpl_id)\
+{                                                                                    \
+    type fill_val;                                                                   \
+                                                                                     \
+    /* Get dataset fill value */                                                     \
+    if(H5P_get_fill_value(dcpl_plist, dt, &fill_val, dxpl_id) < 0)                   \
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get fill value")        \
+                                                                                     \
+    if(need_convert)                                                                 \
+       H5Z_scaleoffset_convert(&fill_val, 1, sizeof(type));                          \
+                                                                                     \
+    H5Z_scaleoffset_save_filval(unsigned type, cd_values, fill_val)                  \
+}
+
+/* Set the fill value parameter in cd_values[] for character integer type */
+#define H5Z_scaleoffset_set_filval_3(type, dcpl_plist, dt, cd_values, need_convert, dxpl_id)\
+{                                                                                    \
+    type fill_val;                                                                   \
+                                                                                     \
+    /* Get dataset fill value */                                                     \
+    if(H5P_get_fill_value(dcpl_plist, dt, &fill_val, dxpl_id) < 0)                   \
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get fill value")        \
+                                                                                     \
+    /* Store the fill value as the last entry in cd_values[] */                      \
+    (cd_values)[H5Z_SCALEOFFSET_PARM_FILVAL] = (unsigned)((unsigned char)fill_val);  \
+}
+
+/* Set the fill value parameter in cd_values[] for floating-point type */
+#define H5Z_scaleoffset_set_filval_4(type, dcpl_plist, dt, cd_values, need_convert, dxpl_id)\
+{                                                                             \
+    type fill_val;                                                            \
+                                                                              \
+    /* Get dataset fill value */                                              \
+    if(H5P_get_fill_value(dcpl_plist, dt, &fill_val, dxpl_id) < 0)            \
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get fill value") \
+                                                                              \
+    if(need_convert)                                                          \
+       H5Z_scaleoffset_convert(&fill_val, 1, sizeof(type));                   \
+                                                                              \
+    H5Z_scaleoffset_save_filval(type, cd_values, fill_val)                    \
+}
+
+/* Get the fill value for integer type */
+#define H5Z_scaleoffset_get_filval_1(type, cd_values, fill_val)                  \
+{                                                                                \
+    unsigned _i = H5Z_SCALEOFFSET_PARM_FILVAL; /* index into cd_values  */       \
+    uint32_t _cd_value;         /* Current cd_value */                           \
+    char *_fv_p;                /* Pointer to current byte in fill_val */        \
+    size_t _copy_size = 4;      /* # of bytes to copy this iteration */          \
+    size_t _size_rem = sizeof(type); /* # of bytes left to copy to filval */     \
+                                                                                 \
+    /* Retrieve the fill value from the last entry in cd_values[]                \
+     * Store byte by byte from least significant byte to most significant byte   \
+     * Plenty of space left for the fill value (from index 8 to 19)              \
+     * H5O_pline_encode will byte-swap each individual cd value, but we still    \
+     * need to swap the cd values as a whole if we are on a BE machine.  Note    \
+     * that we need to make sure to put the data only in the lowest 4 bytes of   \
+     * each, if sizeof(unsigned) > 4.                                            \
+     */                                                                          \
+    if(H5T_native_order_g == H5T_ORDER_LE) {                                     \
+        _fv_p = (char *)&(fill_val);                                             \
+        /* Copy 4 bytes at a time to each cd value */                            \
+        do {                                                                     \
+            if(_size_rem < 4)                                                    \
+                /* Amount left to copy is smaller than a cd_value, adjust copy   \
+                 * size and initialize cd_value as it will not be fully          \
+                 * overwritten */                                                \
+                _copy_size = _size_rem;                                          \
+                                                                                 \
+            /* Copy the value */                                                 \
+            _cd_value = (uint32_t)(cd_values)[_i];                               \
+            HDmemcpy(_fv_p, &_cd_value, _copy_size);                             \
+                                                                                 \
+            /* Next field */                                                     \
+            _i++;                                                                \
+            _fv_p += _copy_size;                                                 \
+            _size_rem -= _copy_size;                                             \
+        } while(_size_rem);                                                      \
+    } /* end if */                                                               \
+    else {                                                                       \
+        HDassert(H5T_native_order_g == H5T_ORDER_BE);                            \
+                                                                                 \
+        /* Copy 4 bytes at a time to each cd value, but start at the end         \
+         * (highest address) of fill_val */                                      \
+        _fv_p = ((char *)&(fill_val)) + sizeof(type) - MIN(4, _size_rem);        \
+        while(_size_rem >= 4) {                                                  \
+            /* Copy the value */                                                 \
+            _cd_value = (uint32_t)(cd_values)[_i];                               \
+            HDmemcpy(_fv_p, &_cd_value, _copy_size);                             \
+                                                                                 \
+            /* Next field */                                                     \
+            _i++;                                                                \
+            _size_rem -= 4;                                                      \
+            if(_size_rem >=4)                                                    \
+                _fv_p -= 4;                                                      \
+            else                                                                 \
+                _fv_p -= _size_rem;                                              \
+        } /* end while */                                                        \
+                                                                                 \
+        HDassert(_fv_p == (char *)&(fill_val));                                  \
+        if(_size_rem) {                                                          \
+            /* Amount left to copy is smaller than a cd_value, initialize        \
+             * _cd_value as it will not be fully overwritten and copy to the end \
+             * of _cd value as it is BE. */                                      \
+            _cd_value = (uint32_t)(cd_values)[_i];                               \
+            HDmemcpy(_fv_p, (char *)&_cd_value + 4 - _size_rem, _size_rem);      \
+        } /* end if */                                                           \
+    } /* end else */                                                             \
+}
+
+/* Get the fill value for floating-point type */
+#define H5Z_scaleoffset_get_filval_2(type, cd_values, filval)                          \
+{                                                                                      \
+   if(sizeof(type) <= sizeof(long long))                                               \
+      H5Z_scaleoffset_get_filval_1(type, cd_values, filval)                            \
+   else                                                                                \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
+}
+
+/* Find maximum and minimum values of a buffer with fill value defined for integer type */
+#define H5Z_scaleoffset_max_min_1(i, d_nelmts, buf, filval, max, min)\
+{                                                                  \
+   i = 0; while(i < d_nelmts && buf[i]== filval) i++;              \
+   if(i < d_nelmts) min = max = buf[i];                            \
+   for(; i < d_nelmts; i++) {                                      \
+      if(buf[i] == filval) continue; /* ignore fill value */       \
+      if(buf[i] > max) max = buf[i];                               \
+      if(buf[i] < min) min = buf[i];                               \
+   }                                                               \
+}
+
+/* Find maximum and minimum values of a buffer with fill value undefined */
+#define H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)\
+{                                                            \
+   min = max = buf[0];                                       \
+   for(i = 0; i < d_nelmts; i++) {                           \
+      if(buf[i] > max) max = buf[i];                         \
+      if(buf[i] < min) min = buf[i];                         \
+   }                                                         \
+}
+
+/* Find maximum and minimum values of a buffer with fill value defined for floating-point type */
+#define H5Z_scaleoffset_max_min_3(i, d_nelmts, buf, filval, max, min, D_val)      \
+{                                                                                 \
+   i = 0; while(i < d_nelmts && HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val)) i++; \
+   if(i < d_nelmts) min = max = buf[i];                                           \
+   for(; i < d_nelmts; i++) {                                                     \
+      if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                          \
+         continue; /* ignore fill value */                                        \
+      if(buf[i] > max) max = buf[i];                                              \
+      if(buf[i] < min) min = buf[i];                                              \
+   }                                                                              \
+}
+
+/* Find minimum value of a buffer with fill value defined for integer type */
+#define H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min) \
+{                                                            \
+   i = 0; while(i < d_nelmts && buf[i]== filval) i++;        \
+   if(i < d_nelmts) min = buf[i];                            \
+   for(; i < d_nelmts; i++) {                                \
+      if(buf[i] == filval) continue; /* ignore fill value */ \
+      if(buf[i] < min) min = buf[i];                         \
+   }                                                         \
+}
+
+/* Find minimum value of a buffer with fill value undefined */
+#define H5Z_scaleoffset_min_2(i, d_nelmts, buf, min)\
+{                                                   \
+   min = buf[0];                                    \
+   for(i = 0; i < d_nelmts; i++)                    \
+      if(buf[i] < min) min = buf[i];                \
+}
+
+/* Check and handle special situation for unsigned integer type */
+#define H5Z_scaleoffset_check_1(type, max, min, minbits) \
+{                                                        \
+   if(max - min > (type)(~(type)0 - 2))                  \
+   { *minbits = sizeof(type)*8; return; }                \
+}
+
+/* Check and handle special situation for signed integer type */
+#define H5Z_scaleoffset_check_2(type, max, min, minbits)                   \
+{                                                                          \
+   if((unsigned type)(max - min) > (unsigned type)(~(unsigned type)0 - 2)) \
+   { *minbits = sizeof(type)*8; return; }                                  \
+}
+
+/* Check and handle special situation for floating-point type */
+#define H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                    \
+{                                                                                     \
+   if(sizeof(type)==sizeof(int)) {                                                    \
+      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
+         > HDpow(2.0f, (double)(sizeof(int)*8 - 1))) {                                \
+         *minbits = sizeof(int)*8; goto done;                                         \
+      }                                                                               \
+   } else if(sizeof(type)==sizeof(long)) {                                            \
+      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
+         > HDpow(2.0f, (double)(sizeof(long)*8 - 1))) {                               \
+         *minbits = sizeof(long)*8; goto done;                                        \
+      }                                                                               \
+   } else if(sizeof(type)==sizeof(long long)) {                                       \
+      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
+         > HDpow(2.0f, (double)(sizeof(long long)*8 - 1))) {                          \
+         *minbits = sizeof(long long)*8; goto done;                                   \
+      }                                                                               \
+   } else                                                                             \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+}
+
+/* Precompress for unsigned integer type */
+#define H5Z_scaleoffset_precompress_1(type, data, d_nelmts, filavail, cd_values, minbits, minval)\
+{                                                                                          \
+    type *buf = (type *)data, min = 0, max = 0, span, filval = 0;                          \
+    unsigned i;                                                                            \
+                                                                                           \
+    if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */                \
+        H5Z_scaleoffset_get_filval_1(type, cd_values, filval)                              \
+        if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT) { /* minbits not set yet, calculate max, min, and minbits */ \
+            H5Z_scaleoffset_max_min_1(i, d_nelmts, buf, filval, max, min)                  \
+            H5Z_scaleoffset_check_1(type, max, min, minbits)                               \
+            span = (type)(max - min + 1);                                                  \
+            *minbits = H5Z_scaleoffset_log2((unsigned long long)(span+1));                 \
+        } else /* minbits already set, only calculate min */                               \
+            H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min)                           \
+        if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */    \
+            for(i = 0; i < d_nelmts; i++)                                                  \
+                buf[i] = (type)((buf[i] == filval) ? (((type)1 << *minbits) - 1) : (buf[i] - min)); \
+    } else { /* fill value undefined */                                                    \
+        if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT ) { /* minbits not set yet, calculate max, min, and minbits */ \
+            H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)                          \
+            H5Z_scaleoffset_check_1(type, max, min, minbits)                               \
+            span = (type)(max - min + 1);                                                  \
+            *minbits = H5Z_scaleoffset_log2((unsigned long long)span);                     \
+        } else /* minbits already set, only calculate min */                               \
+            H5Z_scaleoffset_min_2(i, d_nelmts, buf, min)                                   \
+        if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */    \
+            for(i = 0; i < d_nelmts; i++)                                                  \
+                buf[i] = (type)(buf[i] - min);                                             \
+    }                                                                                      \
+    *minval = min;                                                                         \
+}
+
+/* Precompress for signed integer type */
+#define H5Z_scaleoffset_precompress_2(type, data, d_nelmts, filavail, cd_values, minbits, minval)\
+{                                                                                            \
+   type *buf = (type *)data, min = 0, max = 0, filval = 0;                                   \
+   unsigned type span; unsigned i;                                                           \
+                                                                                             \
+   if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */                   \
+      H5Z_scaleoffset_get_filval_1(type, cd_values, filval)                                  \
+      if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT) { /* minbits not set yet, calculate max, min, and minbits */ \
+         H5Z_scaleoffset_max_min_1(i, d_nelmts, buf, filval, max, min)                       \
+         H5Z_scaleoffset_check_2(type, max, min, minbits)                                    \
+         span = (unsigned type)(max - min + 1);                                              \
+         *minbits = H5Z_scaleoffset_log2((unsigned long long)(span + 1));                    \
+      } else /* minbits already set, only calculate min */                                   \
+         H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min)                                \
+      if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */      \
+         for(i = 0; i < d_nelmts; i++)                                                       \
+            buf[i] = (type)((buf[i] == filval) ? (type)(((unsigned type)1 << *minbits) - 1) : (buf[i] - min)); \
+   } else { /* fill value undefined */                                                       \
+      if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT ) { /* minbits not set yet, calculate max, min, and minbits */\
+         H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)                               \
+         H5Z_scaleoffset_check_2(type, max, min, minbits)                                    \
+         span = (unsigned type)(max - min + 1);                                              \
+         *minbits = H5Z_scaleoffset_log2((unsigned long long)span);                          \
+      } else /* minbits already set, only calculate min */                                   \
+         H5Z_scaleoffset_min_2(i, d_nelmts, buf, min)                                        \
+      if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */      \
+         for(i = 0; i < d_nelmts; i++)                                                       \
+            buf[i] = (type)(buf[i] - min);                                                   \
+   }                                                                                         \
+   *minval = (unsigned long long)min;                                                        \
+}
+
+/* Modify values of data in precompression if fill value defined for floating-point type */
+#define H5Z_scaleoffset_modify_1(i, type, buf, d_nelmts, filval, minbits, min, D_val) \
+{                                                                                     \
+   if(sizeof(type)==sizeof(int))                                                      \
+      for(i = 0; i < d_nelmts; i++) {                                                 \
+         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+            *(int *)&buf[i] = (int)(((unsigned int)1 << *minbits) - 1);               \
+         else                                                                         \
+            *(int *)&buf[i] = H5Z_scaleoffset_rnd(                                    \
+                              buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));  \
+      }                                                                               \
+   else if(sizeof(type)==sizeof(long))                                                \
+      for(i = 0; i < d_nelmts; i++) {                                                 \
+         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+            *(long *)&buf[i] = (long)(((unsigned long)1 << *minbits) - 1);            \
+         else                                                                         \
+            *(long *)&buf[i] = H5Z_scaleoffset_rnd(                                   \
+                               buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+      }                                                                               \
+   else if(sizeof(type)==sizeof(long long))                                           \
+      for(i = 0; i < d_nelmts; i++) {                                                 \
+         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+            *(long long *)&buf[i] = (long long)(((unsigned long long)1 << *minbits) - 1); \
+         else                                                                         \
+            *(long long *)&buf[i] = H5Z_scaleoffset_rnd(                              \
+                                    buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+      }                                                                               \
+   else                                                                               \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+}
+
+/* Modify values of data in precompression if fill value undefined for floating-point type */
+#define H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val)                  \
+{                                                                                     \
+   if(sizeof(type)==sizeof(int))                                                      \
+      for(i = 0; i < d_nelmts; i++)                                                   \
+         *(int *)&buf[i] = H5Z_scaleoffset_rnd(                                       \
+                           buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));     \
+   else if(sizeof(type)==sizeof(long))                                                \
+      for(i = 0; i < d_nelmts; i++)                                                   \
+         *(long *)&buf[i] = H5Z_scaleoffset_rnd(                                      \
+                            buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));    \
+   else if(sizeof(type)==sizeof(long long))                                           \
+      for(i = 0; i < d_nelmts; i++)                                                   \
+         *(long long *)&buf[i] = H5Z_scaleoffset_rnd(                                 \
+                                 buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+   else                                                                               \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+}
+
+/* Save the minimum value for floating-point type */
+#define H5Z_scaleoffset_save_min(i, type, minval, min)                                \
+{                                                                                     \
+    if(sizeof(type) <= sizeof(long long))                                             \
+        /* Save min value to corresponding position                                   \
+         * byte-order will be swapped as appropriate, but be sure to                  \
+         * account for offset in BE if sizes differ                                   \
+         */                                                                           \
+        if(H5T_native_order_g == H5T_ORDER_LE)                                        \
+            HDmemcpy(minval, &min, sizeof(type));                                     \
+        else {                                                                        \
+            HDassert(H5T_native_order_g == H5T_ORDER_BE);                             \
+            HDmemcpy(((char *)minval) + (sizeof(long long) - sizeof(type)),           \
+                    &min, sizeof(type));                                              \
+        } /* end else */                                                              \
+    else                                                                              \
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
+}
+
+/* Precompress for floating-point type using variable-minimum-bits method */
+#define H5Z_scaleoffset_precompress_3(type, data, d_nelmts, filavail, cd_values,         \
+                                      minbits, minval, D_val)                            \
+{                                                                                        \
+   type *buf = (type *)data, min = 0, max = 0, filval = 0;                               \
+   unsigned long long span;                                                              \
+   unsigned i;                                                                           \
+                                                                                         \
+   *minval = 0;                                                                          \
+   if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */               \
+      H5Z_scaleoffset_get_filval_2(type, cd_values, filval)                              \
+      H5Z_scaleoffset_max_min_3(i, d_nelmts, buf, filval, max, min, D_val)               \
+      H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                         \
+      span = H5Z_scaleoffset_rnd(max * HDpow(10.0f, D_val) - min * HDpow(10.0f, D_val)) + 1; \
+      *minbits = H5Z_scaleoffset_log2((unsigned long long)(span + 1));                   \
+      if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */  \
+         H5Z_scaleoffset_modify_1(i, type, buf, d_nelmts, filval, minbits, min, D_val)   \
+   } else { /* fill value undefined */                                                   \
+      H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)                              \
+      H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                         \
+      span = H5Z_scaleoffset_rnd(max * HDpow(10.0f, D_val) - min * HDpow(10.0f, D_val)) + 1; \
+      *minbits = H5Z_scaleoffset_log2((unsigned long long)span);                         \
+      if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */  \
+         H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val)                    \
+   }                                                                                     \
+   H5Z_scaleoffset_save_min(i, type, minval, min)                                        \
+}
+
+/* Postdecompress for unsigned integer type */
+#define H5Z_scaleoffset_postdecompress_1(type, data, d_nelmts, filavail, cd_values, minbits, minval)\
+{                                                                                 \
+   type *buf = (type *)data, filval = 0; unsigned i;                              \
+                                                                                  \
+   if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */        \
+      H5Z_scaleoffset_get_filval_1(type, cd_values, filval)                       \
+      for(i = 0; i < d_nelmts; i++)                                               \
+         buf[i] = (type)((buf[i] == (((type)1 << minbits) - 1)) ? filval : (buf[i] + minval)); \
+   } else /* fill value undefined */                                              \
+      for(i = 0; i < d_nelmts; i++) buf[i] = (type)(buf[i] + (type)(minval));     \
+}
+
+/* Postdecompress for signed integer type */
+#define H5Z_scaleoffset_postdecompress_2(type, data, d_nelmts, filavail, cd_values, minbits, minval)\
+{                                                                                          \
+   type *buf = (type *)data, filval = 0;                                                   \
+   unsigned i;                                                                             \
+                                                                                           \
+   if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */                 \
+      H5Z_scaleoffset_get_filval_1(type, cd_values, filval)                                \
+      for(i = 0; i < d_nelmts; i++)                                                        \
+         buf[i] = (type)(((unsigned type)buf[i] == (((unsigned type)1 << minbits) - 1)) ? filval : (buf[i] + minval));\
+   } else /* fill value undefined */                                                       \
+      for(i = 0; i < d_nelmts; i++)                                                        \
+          buf[i] = (type)(buf[i] + (type)(minval));                                        \
+}
+
+/* Retrive minimum value of floating-point type */
+#define H5Z_scaleoffset_get_min(type, minval, min)                                 \
+{                                                                                  \
+    if(sizeof(type) <= sizeof(long long))                                          \
+        /* retrieve min value from corresponding position                          \
+         * byte-order has already been swapped as appropriate, but be sure to      \
+         * account for offset in BE if sizes differ                                \
+         */                                                                        \
+        if(H5T_native_order_g == H5T_ORDER_LE)                                     \
+            HDmemcpy(&min, &minval, sizeof(type));                                 \
+        else {                                                                     \
+            HDassert(H5T_native_order_g == H5T_ORDER_BE);                          \
+            HDmemcpy(&min, ((char *)&minval) + (sizeof(long long)                  \
+                    - sizeof(type)), sizeof(type));                                \
+        } /* end else */                                                           \
+    else                                                                           \
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
+}
+
+/* Modify values of data in postdecompression if fill value defined for floating-point type */
+#define H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val)     \
+{                                                                                         \
+   if(sizeof(type)==sizeof(int))                                                          \
+      for(i = 0; i < d_nelmts; i++)                                                       \
+         buf[i] = (type)((*(int *)&buf[i] == (int)(((unsigned int)1 << minbits) - 1)) ?   \
+                  filval : (double)(*(int *)&buf[i]) / HDpow(10.0f, D_val) + min);        \
+   else if(sizeof(type)==sizeof(long))                                                    \
+      for(i = 0; i < d_nelmts; i++)                                                       \
+         buf[i] = (type)((*(long *)&buf[i] == (long)(((unsigned long)1 << minbits) - 1)) ? \
+                  filval : (double)(*(long *)&buf[i]) / HDpow(10.0f, D_val) + min);       \
+   else if(sizeof(type)==sizeof(long long))                                               \
+      for(i = 0; i < d_nelmts; i++)                                                       \
+         buf[i] = (type)((*(long long *)&buf[i] == (long long)(((unsigned long long)1 << minbits) - 1)) ? \
+                  filval : (double)(*(long long *)&buf[i]) / HDpow(10.0f, D_val) + min);  \
+   else                                                                                   \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")    \
+}
+
+/* Modify values of data in postdecompression if fill value undefined for floating-point type */
+#define H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val)                   \
+{                                                                                      \
+   if(sizeof(type)==sizeof(int))                                                       \
+      for(i = 0; i < d_nelmts; i++)                                                    \
+         buf[i] = (type)((double)(*(int *)&buf[i]) / HDpow(10.0f, D_val) + min);       \
+   else if(sizeof(type)==sizeof(long))                                                 \
+      for(i = 0; i < d_nelmts; i++)                                                    \
+         buf[i] = (type)((double)(*(long *)&buf[i]) / HDpow(10.0f, D_val) + min);      \
+   else if(sizeof(type)==sizeof(long long))                                            \
+      for(i = 0; i < d_nelmts; i++)                                                    \
+         buf[i] = (type)((double)(*(long long *)&buf[i]) / HDpow(10.0f, D_val) + min); \
+   else                                                                                \
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
+}
+
+/* Postdecompress for floating-point type using variable-minimum-bits method */
+#define H5Z_scaleoffset_postdecompress_3(type, data, d_nelmts, filavail, cd_values,    \
+                                         minbits, minval, D_val)                       \
+{                                                                                      \
+   type *buf = (type *)data, filval = 0, min = 0;                                      \
+   unsigned i;                                                                         \
+                                                                                       \
+   H5Z_scaleoffset_get_min(type, minval, min)                                          \
+                                                                                       \
+   if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */             \
+      H5Z_scaleoffset_get_filval_2(type, cd_values, filval)                            \
+      H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val)    \
+   } else /* fill value undefined */                                                   \
+      H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val)                     \
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_can_apply_scaleoffset
+ *
+ * Purpose:	Check the parameters for scaleoffset compression for
+ *              validity and whether they fit a particular dataset.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Friday, February 4, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5Z_can_apply_scaleoffset(hid_t H5_ATTR_UNUSED dcpl_id, hid_t type_id, hid_t H5_ATTR_UNUSED space_id)
+{
+    const H5T_t	*type;                  /* Datatype */
+    H5T_class_t dtype_class;            /* Datatype's class */
+    H5T_order_t dtype_order;            /* Datatype's endianness order */
+    htri_t ret_value = TRUE;            /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get datatype */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get datatype's class, for checking the "datatype class" */
+    if((dtype_class = H5T_get_class(type, TRUE)) == H5T_NO_CLASS)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype class")
+
+    /* Get datatype's size, for checking the "datatype size" */
+    if(H5T_get_size(type) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    if(dtype_class == H5T_INTEGER || dtype_class == H5T_FLOAT) {
+        /* Get datatype's endianness order */
+        if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
+	    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "can't retrieve datatype endianness order")
+
+        /* Range check datatype's endianness order */
+        if(dtype_order != H5T_ORDER_LE && dtype_order != H5T_ORDER_BE)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FALSE, "bad datatype endianness order")
+    } else
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FALSE, "datatype class not supported by scaleoffset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_can_apply_scaleoffset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_scaleoffset_get_type
+ *
+ * Purpose:	Get the specific integer type based on datatype size and sign
+ *              or floating-point type based on size
+ *
+ * Return:	Success: id number of integer type
+ *		Failure: 0
+ *
+ * Programmer:	Xiaowen Wu
+ *              Wednesday, April 13, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static enum H5Z_scaleoffset_t
+H5Z_scaleoffset_get_type(unsigned dtype_class, unsigned dtype_size, unsigned dtype_sign)
+{
+    enum H5Z_scaleoffset_t type = t_bad; /* integer type */
+    enum H5Z_scaleoffset_t ret_value;             /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(dtype_class==H5Z_SCALEOFFSET_CLS_INTEGER) {
+        if(dtype_sign==H5Z_SCALEOFFSET_SGN_NONE) { /* unsigned integer */
+            if     (dtype_size == sizeof(unsigned char))      type = t_uchar;
+            else if(dtype_size == sizeof(unsigned short))     type = t_ushort;
+            else if(dtype_size == sizeof(unsigned int))       type = t_uint;
+            else if(dtype_size == sizeof(unsigned long))      type = t_ulong;
+            else if(dtype_size == sizeof(unsigned long long)) type = t_ulong_long;
+            else
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, t_bad, "cannot find matched memory dataype")
+        }
+
+        if(dtype_sign==H5Z_SCALEOFFSET_SGN_2) { /* signed integer */
+            if     (dtype_size == sizeof(signed char)) type = t_schar;
+            else if(dtype_size == sizeof(short))       type = t_short;
+            else if(dtype_size == sizeof(int))         type = t_int;
+            else if(dtype_size == sizeof(long))        type = t_long;
+            else if(dtype_size == sizeof(long long))   type = t_long_long;
+            else
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, t_bad, "cannot find matched memory dataype")
+        }
+    }
+
+    if(dtype_class==H5Z_SCALEOFFSET_CLS_FLOAT) {
+        if(dtype_size == sizeof(float))       type = t_float;
+        else if(dtype_size == sizeof(double)) type = t_double;
+        else
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, t_bad, "cannot find matched memory dataype")
+    }
+
+    /* Set return value */
+    ret_value = type;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_scaleoffset_set_parms_fillval
+ *
+ * Purpose:	Get the fill value of the dataset and store in cd_values[]
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:  Xiaowen Wu
+ *              Monday, March 7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_scaleoffset_set_parms_fillval(H5P_genplist_t *dcpl_plist,
+    H5T_t *type, enum H5Z_scaleoffset_t scale_type,
+    unsigned cd_values[], int need_convert, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(scale_type == t_uchar)
+        H5Z_scaleoffset_set_filval_3(unsigned char, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_ushort)
+        H5Z_scaleoffset_set_filval_1(unsigned short, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_uint)
+        H5Z_scaleoffset_set_filval_1(unsigned int, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_ulong)
+        H5Z_scaleoffset_set_filval_1(unsigned long, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_ulong_long)
+        H5Z_scaleoffset_set_filval_1(unsigned long long, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_schar)
+        H5Z_scaleoffset_set_filval_3(signed char, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_short)
+        H5Z_scaleoffset_set_filval_2(short, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_int)
+        H5Z_scaleoffset_set_filval_2(int, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_long)
+        H5Z_scaleoffset_set_filval_2(long, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_long_long)
+        H5Z_scaleoffset_set_filval_2(long long, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_float)
+        H5Z_scaleoffset_set_filval_4(float, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+    else if(scale_type == t_double)
+        H5Z_scaleoffset_set_filval_4(double, dcpl_plist, type, cd_values, need_convert, dxpl_id)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_scaleoffset_set_parms_fillval() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local_scaleoffset
+ *
+ * Purpose:	Set the "local" dataset parameters for scaleoffset
+ *              compression.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Xiaowen Wu
+ *              Friday, February 4, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id)
+{
+    H5P_genplist_t *dcpl_plist;     /* Property list pointer */
+    H5T_t	*type;              /* Datatype */
+    const H5S_t	*ds;                /* Dataspace */
+    unsigned flags;                 /* Filter flags */
+    size_t cd_nelmts = H5Z_SCALEOFFSET_USER_NPARMS;  /* Number of filter parameters */
+    unsigned cd_values[H5Z_SCALEOFFSET_TOTAL_NPARMS]; /* Filter parameters */
+    hssize_t npoints;               /* Number of points in the dataspace */
+    H5T_class_t dtype_class;        /* Datatype's class */
+    H5T_order_t dtype_order;        /* Datatype's endianness order */
+    size_t dtype_size;              /* Datatype's size (in bytes) */
+    H5T_sign_t dtype_sign;          /* Datatype's sign */
+    enum H5Z_scaleoffset_t scale_type; /* Specific datatype */
+    H5D_fill_value_t status;        /* Status of fill value in property list */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Get the plist structure */
+    if(NULL == (dcpl_plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get datatype */
+    if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+#ifdef H5_CLEAR_MEMORY
+    /* Initialize the parameters to a known state */
+    HDmemset(cd_values, 0, sizeof(cd_values));
+#endif /* H5_CLEAR_MEMORY */
+
+    /* Get the filter's current parameters */
+    if(H5P_get_filter_by_id(dcpl_plist, H5Z_FILTER_SCALEOFFSET, &flags, &cd_nelmts, cd_values, (size_t)0, NULL, NULL) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get scaleoffset parameters")
+
+    /* Get dataspace */
+    if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
+
+    /* Get total number of elements in the chunk */
+    if((npoints = H5S_GET_EXTENT_NPOINTS(ds)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get number of points in the dataspace")
+
+    /* Set "local" parameter for this dataset's number of elements */
+    H5_CHECKED_ASSIGN(cd_values[H5Z_SCALEOFFSET_PARM_NELMTS], unsigned, npoints, hssize_t);
+
+    /* Get datatype's class */
+    if((dtype_class = H5T_get_class(type, TRUE)) == H5T_NO_CLASS)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype class")
+
+    /* Set "local" parameter for datatype's class */
+    switch(dtype_class) {
+        case H5T_INTEGER:
+            cd_values[H5Z_SCALEOFFSET_PARM_CLASS] = H5Z_SCALEOFFSET_CLS_INTEGER;
+            break;
+
+        case H5T_FLOAT:
+            cd_values[H5Z_SCALEOFFSET_PARM_CLASS] = H5Z_SCALEOFFSET_CLS_FLOAT;
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_COMPOUND:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by scaleoffset")
+    } /* end switch */
+
+    /* Get datatype's size */
+    if((dtype_size = H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Set "local" parameter for datatype size */
+    cd_values[H5Z_SCALEOFFSET_PARM_SIZE] = dtype_size;
+
+    if(dtype_class == H5T_INTEGER) {
+        /* Get datatype's sign */
+        if((dtype_sign = H5T_get_sign(type)) == H5T_SGN_ERROR)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype sign")
+
+        /* Set "local" parameter for integer datatype sign */
+        switch(dtype_sign) {
+            case H5T_SGN_NONE:
+                cd_values[H5Z_SCALEOFFSET_PARM_SIGN] = H5Z_SCALEOFFSET_SGN_NONE;
+                break;
+
+            case H5T_SGN_2:
+                cd_values[H5Z_SCALEOFFSET_PARM_SIGN] = H5Z_SCALEOFFSET_SGN_2;
+                break;
+
+            case H5T_SGN_ERROR:
+            case H5T_NSGN:
+            default:
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad integer sign")
+        } /* end switch */
+    } /* end if */
+
+    /* Get datatype's endianness order */
+    if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+
+    /* Set "local" parameter for datatype endianness */
+    switch(dtype_order) {
+        case H5T_ORDER_LE:      /* Little-endian byte order */
+            cd_values[H5Z_SCALEOFFSET_PARM_ORDER] = H5Z_SCALEOFFSET_ORDER_LE;
+            break;
+
+        case H5T_ORDER_BE:      /* Big-endian byte order */
+            cd_values[H5Z_SCALEOFFSET_PARM_ORDER] = H5Z_SCALEOFFSET_ORDER_BE;
+            break;
+
+        case H5T_ORDER_ERROR:
+        case H5T_ORDER_VAX:
+        case H5T_ORDER_NONE:
+        default:
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+    } /* end switch */
+
+    /* Check whether fill value is defined for dataset */
+    if(H5P_fill_value_defined(dcpl_plist, &status) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to determine if fill value is defined")
+
+    /* Set local parameter for availability of fill value */
+    if(status == H5D_FILL_VALUE_UNDEFINED)
+        cd_values[H5Z_SCALEOFFSET_PARM_FILAVAIL] = H5Z_SCALEOFFSET_FILL_UNDEFINED;
+    else {
+        int need_convert = FALSE;       /* Flag indicating convertion of byte order */
+
+        cd_values[H5Z_SCALEOFFSET_PARM_FILAVAIL] = H5Z_SCALEOFFSET_FILL_DEFINED;
+
+        /* Check if memory byte order matches dataset datatype byte order */
+        if(H5T_native_order_g != dtype_order)
+            need_convert = TRUE;
+
+        /* Before getting fill value, get its type */
+        if((scale_type = H5Z_scaleoffset_get_type(cd_values[H5Z_SCALEOFFSET_PARM_CLASS],
+                cd_values[H5Z_SCALEOFFSET_PARM_SIZE], cd_values[H5Z_SCALEOFFSET_PARM_SIGN])) == 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot use C integer datatype for cast")
+
+        /* Get dataset fill value and store in cd_values[] */
+        if(H5Z_scaleoffset_set_parms_fillval(dcpl_plist, type, scale_type, cd_values, need_convert, H5AC_ind_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "unable to set fill value")
+    } /* end else */
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5P_modify_filter(dcpl_plist, H5Z_FILTER_SCALEOFFSET, flags, (size_t)H5Z_SCALEOFFSET_TOTAL_NPARMS, cd_values) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "can't set local scaleoffset parameters")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local_scaleoffset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_scaleoffset
+ *
+ * Purpose:	Implement an I/O filter for storing packed integer
+ *              data using scale and offset method.
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Xiaowen Wu
+ *              Monday, February 7, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
+    size_t nbytes, size_t *buf_size, void **buf)
+{
+    size_t ret_value = 0;           /* return value */
+    size_t size_out  = 0;           /* size of output buffer */
+    unsigned d_nelmts = 0;          /* number of data elements in the chunk */
+    unsigned dtype_class;           /* datatype class */
+    unsigned dtype_sign;            /* integer datatype sign */
+    unsigned filavail;              /* flag indicating if fill value is defined or not */
+    H5Z_SO_scale_type_t scale_type = H5Z_SO_FLOAT_DSCALE;/* scale type */
+    int scale_factor = 0;           /* scale factor */
+    double D_val = 0.0f;            /* decimal scale factor */
+    uint32_t minbits = 0;           /* minimum number of bits to store values */
+    unsigned long long minval= 0;   /* minimum value of input buffer */
+    enum H5Z_scaleoffset_t type; /* memory type corresponding to dataset datatype */
+    int need_convert = FALSE;       /* flag indicating convertion of byte order */
+    unsigned char *outbuf = NULL;   /* pointer to new output buffer */
+    unsigned buf_offset = 21;       /* buffer offset because of parameters stored in file */
+    unsigned i;                     /* index */
+    parms_atomic p;                 /* paramters needed for compress/decompress functions */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check arguments */
+    if(cd_nelmts != H5Z_SCALEOFFSET_TOTAL_NPARMS)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid scaleoffset number of paramters")
+
+    /* Check if memory byte order matches dataset datatype byte order */
+    switch(H5T_native_order_g) {
+        case H5T_ORDER_LE:      /* memory is little-endian byte order */
+            if(cd_values[H5Z_SCALEOFFSET_PARM_ORDER] == H5Z_SCALEOFFSET_ORDER_BE)
+                need_convert = TRUE;
+            break;
+
+        case H5T_ORDER_BE:      /* memory is big-endian byte order */
+            if(cd_values[H5Z_SCALEOFFSET_PARM_ORDER] == H5Z_SCALEOFFSET_ORDER_LE)
+                need_convert = TRUE;
+            break;
+
+        case H5T_ORDER_ERROR:
+        case H5T_ORDER_VAX:
+        case H5T_ORDER_NONE:
+        default:
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "bad H5T_NATIVE_INT endianness order")
+    } /* end switch */
+
+    /* copy filter parameters to local variables */
+    d_nelmts     = cd_values[H5Z_SCALEOFFSET_PARM_NELMTS];
+    dtype_class  = cd_values[H5Z_SCALEOFFSET_PARM_CLASS];
+    dtype_sign   = cd_values[H5Z_SCALEOFFSET_PARM_SIGN];
+    filavail     = cd_values[H5Z_SCALEOFFSET_PARM_FILAVAIL];
+    scale_factor = (int)cd_values[H5Z_SCALEOFFSET_PARM_SCALEFACTOR];
+    scale_type   = (H5Z_SO_scale_type_t)cd_values[H5Z_SCALEOFFSET_PARM_SCALETYPE];
+
+    /* check and assign proper values set by user to related parameters
+     * scale type can be H5Z_SO_FLOAT_DSCALE (0), H5Z_SO_FLOAT_ESCALE (1) or H5Z_SO_INT (other)
+     * H5Z_SO_FLOAT_DSCALE : floating-point type, variable-minimum-bits method,
+     *                      scale factor is decimal scale factor
+     * H5Z_SO_FLOAT_ESCALE : floating-point type, fixed-minimum-bits method,
+     *                      scale factor is the fixed minimum number of bits
+     * H5Z_SO_INT          : integer type, scale_factor is minimum number of bits
+     */
+    if(dtype_class==H5Z_SCALEOFFSET_CLS_FLOAT) { /* floating-point type */
+        if(scale_type!=H5Z_SO_FLOAT_DSCALE && scale_type!=H5Z_SO_FLOAT_ESCALE)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid scale type")
+    }
+
+    if(dtype_class==H5Z_SCALEOFFSET_CLS_INTEGER) { /* integer type */
+        if(scale_type!=H5Z_SO_INT)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid scale type")
+
+        /* if scale_factor is less than 0 for integer, library will reset it to 0
+         * in this case, library will calculate the minimum-bits
+         */
+	if(scale_factor < 0) scale_factor = 0;
+    }
+
+    /* fixed-minimum-bits method is not implemented and is forbidden */
+    if(scale_type==H5Z_SO_FLOAT_ESCALE)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "E-scaling method not supported")
+
+    if(scale_type==H5Z_SO_FLOAT_DSCALE) { /* floating-point type, variable-minimum-bits */
+        D_val = (double)scale_factor;
+    } else { /* integer type, or floating-point type with fixed-minimum-bits method */
+        if(scale_factor > (int)(cd_values[H5Z_SCALEOFFSET_PARM_SIZE] * 8))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "minimum number of bits exceeds maximum")
+
+        /* no need to process data */
+        if(scale_factor == (int)(cd_values[H5Z_SCALEOFFSET_PARM_SIZE] * 8)) {
+            ret_value = *buf_size;
+            goto done;
+        }
+        minbits = (uint32_t)scale_factor;
+    }
+
+    /* prepare paramters to pass to compress/decompress functions */
+    p.size = cd_values[H5Z_SCALEOFFSET_PARM_SIZE];
+    p.mem_order = H5T_native_order_g;
+
+    /* input; decompress */
+    if (flags & H5Z_FLAG_REVERSE) {
+        /* retrieve values of minbits and minval from input compressed buffer
+         * retrieve them corresponding to how they are stored during compression
+         */
+        uint32_t minbits_mask = 0;
+        unsigned long long minval_mask = 0;
+        unsigned minval_size = 0;
+
+        minbits = 0;
+        for(i = 0; i < 4; i++) {
+            minbits_mask = ((unsigned char *)*buf)[i];
+            minbits_mask <<= i*8;
+            minbits |= minbits_mask;
+        }
+
+        /* retrieval of minval takes into consideration situation where sizeof
+         * unsigned long long (datatype of minval) may change from compression
+         * to decompression, only smaller size is used
+         */
+        minval_size = sizeof(unsigned long long) <= ((unsigned char *)*buf)[4] ?
+                      sizeof(unsigned long long) : ((unsigned char *)*buf)[4];
+        minval = 0;
+        for(i = 0; i < minval_size; i++) {
+            minval_mask = ((unsigned char *)*buf)[5+i];
+            minval_mask <<= i*8;
+            minval |= minval_mask;
+        }
+
+        HDassert(minbits <= p.size * 8);
+        p.minbits = minbits;
+
+        /* calculate size of output buffer after decompression */
+        size_out = d_nelmts * p.size;
+
+        /* allocate memory space for decompressed buffer */
+        if(NULL == (outbuf = (unsigned char *)H5MM_malloc(size_out)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for scaleoffset decompression")
+
+        /* special case: minbits equal to full precision */
+        if(minbits == p.size * 8) {
+            HDmemcpy(outbuf, (unsigned char*)(*buf)+buf_offset, size_out);
+
+            /* convert to dataset datatype endianness order if needed */
+            if(need_convert)
+                H5Z_scaleoffset_convert(outbuf, d_nelmts, p.size);
+
+            *buf = outbuf;
+            outbuf = NULL;
+            *buf_size = size_out;
+            ret_value = size_out;
+            goto done;
+        }
+
+        /* decompress the buffer if minbits not equal to zero */
+        if(minbits != 0)
+            H5Z_scaleoffset_decompress(outbuf, d_nelmts, (unsigned char*)(*buf)+buf_offset, p);
+        else {
+            /* fill value is not defined and all data elements have the same value */
+            for(i = 0; i < size_out; i++) outbuf[i] = 0;
+        }
+
+        /* before postprocess, get memory type */
+        if((type = H5Z_scaleoffset_get_type(dtype_class, (unsigned)p.size, dtype_sign)) == 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "cannot use C integer datatype for cast")
+
+        /* postprocess after decompression */
+        if(dtype_class==H5Z_SCALEOFFSET_CLS_INTEGER)
+            H5Z_scaleoffset_postdecompress_i(outbuf, d_nelmts, type, filavail,
+                                             cd_values, minbits, minval);
+
+        if(dtype_class==H5Z_SCALEOFFSET_CLS_FLOAT)
+            if(scale_type==0) { /* variable-minimum-bits method */
+                if(H5Z_scaleoffset_postdecompress_fd(outbuf, d_nelmts, type, filavail,
+                        cd_values, minbits, minval, D_val)==FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "post-decompression failed")
+            }
+
+        /* after postprocess, convert to dataset datatype endianness order if needed */
+        if(need_convert)
+            H5Z_scaleoffset_convert(outbuf, d_nelmts, p.size);
+    }
+    /* output; compress */
+    else {
+        HDassert(nbytes == d_nelmts * p.size);
+
+        /* before preprocess, convert to memory endianness order if needed */
+        if(need_convert)
+            H5Z_scaleoffset_convert(*buf, d_nelmts, p.size);
+
+        /* before preprocess, get memory type */
+        if((type = H5Z_scaleoffset_get_type(dtype_class, (unsigned)p.size, dtype_sign))==0)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "cannot use C integer datatype for cast")
+
+        /* preprocess before compression */
+        if(dtype_class==H5Z_SCALEOFFSET_CLS_INTEGER)
+            H5Z_scaleoffset_precompress_i(*buf, d_nelmts, type, filavail,
+                                          cd_values, &minbits, &minval);
+
+        if(dtype_class==H5Z_SCALEOFFSET_CLS_FLOAT)
+            if(scale_type==0) { /* variable-minimum-bits method */
+                if(H5Z_scaleoffset_precompress_fd(*buf, d_nelmts, type, filavail,
+                        cd_values, &minbits, &minval, D_val)==FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "pre-compression failed")
+            }
+
+        HDassert(minbits <= p.size * 8);
+
+        /* calculate buffer size after compression
+         * minbits and minval are stored in the front of the compressed buffer
+         */
+        p.minbits = minbits;
+        size_out = buf_offset + nbytes * p.minbits / (p.size * 8) + 1; /* may be 1 larger */
+
+        /* allocate memory space for compressed buffer */
+        if(NULL == (outbuf = (unsigned char *)H5MM_malloc(size_out)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for scaleoffset compression")
+
+        /* store minbits and minval in the front of output compressed buffer
+         * store byte by byte from least significant byte to most significant byte
+         * constant buffer size (21 bytes) is left for these two parameters
+         * 4 bytes for minbits, 1 byte for size of minval, 16 bytes for minval
+         */
+        for(i = 0; i < 4; i++)
+            ((unsigned char *)outbuf)[i] = (unsigned char)((minbits & ((uint32_t)0xff << i*8)) >> i*8);
+
+        ((unsigned char *)outbuf)[4] = sizeof(unsigned long long);
+
+        for(i = 0; i < sizeof(unsigned long long); i++)
+            ((unsigned char *)outbuf)[5+i] = (unsigned char)((minval & ((unsigned long long)0xff << i*8)) >> i*8);
+
+#ifdef H5_CLEAR_MEMORY
+        /* Zero out remaining, unused bytes */
+        /* (Looks like an error in the original determination of how many
+         *      bytes would be needed for parameters. - QAK, 2010/08/19)
+         */
+        HDmemset(outbuf + 13, 0, (size_t)8);
+#endif /* H5_CLEAR_MEMORY */
+
+        /* special case: minbits equal to full precision */
+        if(minbits == p.size * 8) {
+            HDmemcpy(outbuf + buf_offset, *buf, nbytes);
+            *buf = outbuf;
+            outbuf = NULL;
+            *buf_size = size_out;
+            ret_value = buf_offset + nbytes;
+            goto done;
+        }
+
+        /* compress the buffer if minbits not equal to zero
+         * minbits equal to zero only when fill value is not defined and
+         * all data elements have the same value
+         */
+        if(minbits != 0)
+            H5Z_scaleoffset_compress((unsigned char *)*buf, d_nelmts, outbuf + buf_offset, size_out - buf_offset, p);
+    }
+
+    /* free the input buffer */
+    H5MM_xfree(*buf);
+
+    /* set return values */
+    *buf = outbuf;
+    outbuf = NULL;
+    *buf_size = size_out;
+    ret_value = size_out;
+
+done:
+    if(outbuf)
+        H5MM_xfree(outbuf);
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/* ============ Scaleoffset Algorithm ===============================================
+ * assume one byte has 8 bit
+ * assume padding bit is 0
+ * assume size of unsigned char is one byte
+ * assume one data item of certain datatype is stored continously in bytes
+ * atomic datatype is treated on byte basis
+ */
+
+

+/* change byte order of input buffer either from little-endian to big-endian
+ * or from big-endian to little-endian  2/21/2005
+ */
+static void
+H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, size_t dtype_size)
+{
+   if(dtype_size > 1) {
+       unsigned i, j;
+       unsigned char *buffer, temp;
+
+       buffer = (unsigned char *)buf;
+       for(i = 0; i < d_nelmts * dtype_size; i += dtype_size)
+          for(j = 0; j < dtype_size / 2; j++) {
+             /* swap pair of bytes */
+             temp = buffer[i + j];
+             buffer[i + j] = buffer[i + dtype_size - 1 - j];
+             buffer[i + dtype_size - 1 - j] = temp;
+          } /* end for */
+    } /* end if */
+} /* end H5Z_scaleoffset_convert() */
+
+/* Round a floating-point value to the nearest integer value 4/19/05 */
+/* rounding to the bigger absolute value if val is in the middle,
+ 0.5 -> 1, -0.5 ->-1
+5/9/05, KY */
+static double
+H5Z_scaleoffset_rnd(double val)
+{
+    double u_val, l_val;
+
+    u_val = HDceil(val);
+    l_val = HDfloor(val);
+
+    if(val > 0) {
+        if((u_val - val) <= (val - l_val))
+            return u_val;
+        else
+            return l_val;
+    } /* end if */
+    else {
+        if((val - l_val) <= (u_val - val))
+            return l_val;
+        else
+            return u_val;
+    }
+} /* H5Z_scaleoffset_rnd() */
+
+/* return ceiling of floating-point log2 function
+ * receive unsigned integer as argument 3/10/2005
+ */
+static unsigned
+H5Z_scaleoffset_log2(unsigned long long num)
+{
+   unsigned v = 0;
+   unsigned long long lower_bound = 1; /* is power of 2, largest value <= num */
+   unsigned long long val = num;
+
+   while(val >>= 1) {
+       v++;
+       lower_bound <<= 1;
+   }
+
+   if(num == lower_bound)
+       return v;
+   else
+       return v + 1;
+}
+
+/* precompress for integer type */
+static void
+H5Z_scaleoffset_precompress_i(void *data, unsigned d_nelmts, enum H5Z_scaleoffset_t type,
+    unsigned filavail, const unsigned cd_values[], uint32_t *minbits, unsigned long long *minval)
+{
+    if(type ==  t_uchar)
+        H5Z_scaleoffset_precompress_1(unsigned char, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_ushort)
+        H5Z_scaleoffset_precompress_1(unsigned short, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_uint)
+        H5Z_scaleoffset_precompress_1(unsigned int, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_ulong)
+        H5Z_scaleoffset_precompress_1(unsigned long, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_ulong_long)
+        H5Z_scaleoffset_precompress_1(unsigned long long, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_schar) {
+        signed char *buf = (signed char *)data, min = 0, max = 0, filval = 0;
+        unsigned char span;
+        unsigned i;
+
+        if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */
+            H5Z_scaleoffset_get_filval_1(signed char, cd_values, filval);
+            if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT) { /* minbits not set yet, calculate max, min, and minbits */
+                H5Z_scaleoffset_max_min_1(i, d_nelmts, buf, filval, max, min)
+                if((unsigned char)(max - min) > (unsigned char)(~(unsigned char)0 - 2)) {
+                    *minbits = sizeof(signed char)*8;
+                    return;
+                }
+                span = (unsigned char)(max - min + 1);
+                *minbits = H5Z_scaleoffset_log2((unsigned long long)(span+1));
+            } else /* minbits already set, only calculate min */
+                H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min)
+            if(*minbits != sizeof(signed char)*8) /* change values if minbits != full precision */
+                for(i = 0; i < d_nelmts; i++)
+                    buf[i] = (signed char)((buf[i] == filval) ? (((unsigned char)1 << *minbits) - 1) : (buf[i] - min));
+        } else { /* fill value undefined */
+            if(*minbits == H5Z_SO_INT_MINBITS_DEFAULT) { /* minbits not set yet, calculate max, min, and minbits */
+                H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)
+                if((unsigned char)(max - min) > (unsigned char)(~(unsigned char)0 - 2)) {
+                    *minbits = sizeof(signed char)*8;
+                    *minval = (unsigned long long)min;
+                    return;
+                }
+                span = (unsigned char)(max - min + 1);
+                *minbits = H5Z_scaleoffset_log2((unsigned long long)span);
+            } else /* minbits already set, only calculate min */
+                H5Z_scaleoffset_min_2(i, d_nelmts, buf, min)
+            if(*minbits != sizeof(signed char) * 8) /* change values if minbits != full precision */
+                for(i = 0; i < d_nelmts; i++)
+                    buf[i] = (signed char)(buf[i] - min);
+        }
+        *minval = (unsigned long long)min;
+    }
+    else if(type == t_short)
+        H5Z_scaleoffset_precompress_2(short, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_int)
+        H5Z_scaleoffset_precompress_2(int, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_long)
+        H5Z_scaleoffset_precompress_2(long, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+    else if(type == t_long_long)
+        H5Z_scaleoffset_precompress_2(long long, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval)
+}
+
+/* postdecompress for integer type */
+static void
+H5Z_scaleoffset_postdecompress_i(void *data, unsigned d_nelmts, enum H5Z_scaleoffset_t type,
+    unsigned filavail, const unsigned cd_values[], uint32_t minbits, unsigned long long minval)
+{
+   long long sminval = *(long long*)&minval; /* for signed integer types */
+
+   if(type == t_uchar)
+      H5Z_scaleoffset_postdecompress_1(unsigned char, data, d_nelmts, filavail,
+                                       cd_values, minbits, minval)
+   else if(type == t_ushort)
+      H5Z_scaleoffset_postdecompress_1(unsigned short, data, d_nelmts, filavail,
+                                       cd_values, minbits, minval)
+   else if(type == t_uint)
+      H5Z_scaleoffset_postdecompress_1(unsigned int, data, d_nelmts, filavail,
+                                       cd_values, minbits, minval)
+   else if(type == t_ulong)
+      H5Z_scaleoffset_postdecompress_1(unsigned long, data, d_nelmts, filavail,
+                                       cd_values, minbits, minval)
+   else if(type == t_ulong_long)
+      H5Z_scaleoffset_postdecompress_1(unsigned long long, data, d_nelmts, filavail,
+                                       cd_values, minbits, minval)
+   else if(type == t_schar) {
+      signed char *buf = (signed char *)data, filval = 0;
+      unsigned i;
+
+      if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */
+         H5Z_scaleoffset_get_filval_1(signed char, cd_values, filval)
+         for(i = 0; i < d_nelmts; i++)
+            buf[i] = (signed char)((buf[i] == (((unsigned char)1 << minbits) - 1)) ? filval : (buf[i] + sminval));
+      } else /* fill value undefined */
+         for(i = 0; i < d_nelmts; i++)
+             buf[i] = (signed char)(buf[i] + sminval);
+   }
+   else if(type == t_short)
+      H5Z_scaleoffset_postdecompress_2(short, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval)
+   else if(type == t_int)
+      H5Z_scaleoffset_postdecompress_2(int, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval)
+   else if(type == t_long)
+      H5Z_scaleoffset_postdecompress_2(long, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval)
+   else if(type == t_long_long)
+      H5Z_scaleoffset_postdecompress_2(long long, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval)
+}
+
+/* precompress for floating-point type, variable-minimum-bits method
+   success: non-negative, failure: negative 4/15/05 */
+static herr_t
+H5Z_scaleoffset_precompress_fd(void *data, unsigned d_nelmts, enum H5Z_scaleoffset_t type,
+    unsigned filavail, const unsigned cd_values[], uint32_t *minbits,
+    unsigned long long *minval, double D_val)
+{
+   herr_t ret_value=SUCCEED; /* Return value */
+
+   FUNC_ENTER_NOAPI_NOINIT
+
+   if(type == t_float)
+      H5Z_scaleoffset_precompress_3(float, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval, D_val)
+   else if(type == t_double)
+      H5Z_scaleoffset_precompress_3(double, data, d_nelmts,
+                                    filavail, cd_values, minbits, minval, D_val)
+
+done:
+   FUNC_LEAVE_NOAPI(ret_value)
+}
+
+/* postdecompress for floating-point type, variable-minimum-bits method
+   success: non-negative, failure: negative 4/15/05 */
+static herr_t
+H5Z_scaleoffset_postdecompress_fd(void *data, unsigned d_nelmts, enum H5Z_scaleoffset_t type,
+    unsigned filavail, const unsigned cd_values[], uint32_t minbits,
+    unsigned long long minval, double D_val)
+{
+   long long sminval = (long long)minval;    /* for signed integer types */
+   herr_t ret_value=SUCCEED;                 /* Return value */
+
+   FUNC_ENTER_NOAPI_NOINIT
+
+   if(type == t_float)
+      H5Z_scaleoffset_postdecompress_3(float, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval, D_val)
+   else if(type == t_double)
+      H5Z_scaleoffset_postdecompress_3(double, data, d_nelmts, filavail,
+                                       cd_values, minbits, sminval, D_val)
+
+done:
+   FUNC_LEAVE_NOAPI(ret_value)
+}
+
+static void
+H5Z_scaleoffset_next_byte(size_t *j, unsigned *buf_len)
+{
+   ++(*j);
+   *buf_len = 8 * sizeof(unsigned char);
+}
+
+static void
+H5Z_scaleoffset_decompress_one_byte(unsigned char *data, size_t data_offset,
+    unsigned k, unsigned begin_i, unsigned char *buffer, size_t *j, unsigned *buf_len,
+    parms_atomic p, unsigned dtype_len)
+{
+   unsigned dat_len;    /* dat_len is the number of bits to be copied in each data byte */
+   unsigned char val;   /* value to be copied in each data byte */
+
+   /* initialize value and bits of unsigned char to be copied */
+   val = buffer[*j];
+   if(k == begin_i)
+      dat_len = 8 - (dtype_len - p.minbits) % 8;
+   else
+      dat_len = 8;
+
+   if(*buf_len > dat_len) {
+      data[data_offset + k] = (unsigned char)((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      *buf_len -= dat_len;
+   } /* end if */
+   else {
+      data[data_offset + k] = (unsigned char)((val & ~(~0 << *buf_len)) << (dat_len - *buf_len));
+      dat_len -= *buf_len;
+      H5Z_scaleoffset_next_byte(j, buf_len);
+      if(dat_len == 0)
+          return;
+
+      val = buffer[*j];
+      data[data_offset + k] |= (unsigned char)((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      *buf_len -= dat_len;
+   } /* end else */
+}
+
+static void
+H5Z_scaleoffset_decompress_one_atomic(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, unsigned *buf_len, parms_atomic p)
+{
+   /* begin_i: the index of byte having first significant bit */
+   unsigned begin_i;
+   unsigned dtype_len;
+   int k;
+
+   HDassert(p.minbits > 0);
+
+   dtype_len = p.size * 8;
+
+   if(p.mem_order == H5Z_SCALEOFFSET_ORDER_LE) { /* little endian */
+      begin_i = p.size - 1 - (dtype_len - p.minbits) / 8;
+
+      for(k = (int)begin_i; k >= 0; k--)
+         H5Z_scaleoffset_decompress_one_byte(data, data_offset, (unsigned)k, begin_i,
+                                             buffer, j, buf_len, p, dtype_len);
+   }
+   else { /* big endian */
+      HDassert(p.mem_order == H5Z_SCALEOFFSET_ORDER_BE);
+
+      begin_i = (dtype_len - p.minbits) / 8;
+
+      for(k = (int)begin_i; k <= (int)(p.size - 1); k++)
+         H5Z_scaleoffset_decompress_one_byte(data, data_offset, (unsigned)k, begin_i,
+                                             buffer, j, buf_len, p, dtype_len);
+   }
+}
+
+static void
+H5Z_scaleoffset_decompress(unsigned char *data, unsigned d_nelmts,
+    unsigned char *buffer, parms_atomic p)
+{
+    /* i: index of data, j: index of buffer,
+       buf_len: number of bits to be filled in current byte */
+    size_t i, j;
+    unsigned buf_len;
+
+    /* must initialize to zeros */
+    for(i = 0; i < d_nelmts*p.size; i++)
+        data[i] = 0;
+
+    /* initialization before the loop */
+    j = 0;
+    buf_len = sizeof(unsigned char) * 8;
+
+    /* decompress */
+    for(i = 0; i < d_nelmts; i++)
+        H5Z_scaleoffset_decompress_one_atomic(data, i * p.size, buffer, &j, &buf_len, p);
+}
+
+static void
+H5Z_scaleoffset_compress_one_byte(unsigned char *data, size_t data_offset,
+    unsigned k, unsigned begin_i, unsigned char *buffer, size_t *j, unsigned *buf_len,
+    parms_atomic p, unsigned dtype_len)
+{
+   unsigned dat_len;    /* dat_len is the number of bits to be copied in each data byte */
+   unsigned char val;   /* value to be copied in each data byte */
+
+   /* initialize value and bits of unsigned char to be copied */
+   val = data[data_offset + k];
+   if(k == begin_i)
+      dat_len = 8 - (dtype_len - p.minbits) % 8;
+   else
+      dat_len = 8;
+
+   if(*buf_len > dat_len) {
+      buffer[*j] |= (unsigned char)((val & ~(~0 << dat_len)) << (*buf_len - dat_len));
+      *buf_len -= dat_len;
+   } else {
+      buffer[*j] |= (unsigned char)((val >> (dat_len - *buf_len)) & ~(~0 << *buf_len));
+      dat_len -= *buf_len;
+      H5Z_scaleoffset_next_byte(j, buf_len);
+      if(dat_len == 0)
+          return;
+
+      buffer[*j] = (unsigned char)((val & ~(~0 << dat_len)) << (*buf_len - dat_len));
+      *buf_len -= dat_len;
+   } /* end else */
+}
+
+static void
+H5Z_scaleoffset_compress_one_atomic(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, unsigned *buf_len, parms_atomic p)
+{
+   /* begin_i: the index of byte having first significant bit */
+   unsigned begin_i;
+   unsigned dtype_len;
+   int k;
+
+   HDassert(p.minbits > 0);
+
+   dtype_len = p.size * 8;
+
+   if(p.mem_order == H5Z_SCALEOFFSET_ORDER_LE) { /* little endian */
+      begin_i = p.size - 1 - (dtype_len - p.minbits) / 8;
+
+      for(k = (int)begin_i; k >= 0; k--)
+         H5Z_scaleoffset_compress_one_byte(data, data_offset, (unsigned)k, begin_i,
+                                           buffer, j, buf_len, p, dtype_len);
+   }
+   else { /* big endian */
+      HDassert(p.mem_order == H5Z_SCALEOFFSET_ORDER_BE);
+      begin_i = (dtype_len - p.minbits) / 8;
+
+      for(k = (int)begin_i; k <= (int)(p.size - 1); k++)
+         H5Z_scaleoffset_compress_one_byte(data, data_offset, (unsigned)k, begin_i,
+                                           buffer, j, buf_len, p, dtype_len);
+   }
+}
+
+static void
+H5Z_scaleoffset_compress(unsigned char *data, unsigned d_nelmts,
+    unsigned char *buffer, size_t buffer_size, parms_atomic p)
+{
+   /* i: index of data, j: index of buffer,
+      buf_len: number of bits to be filled in current byte */
+   size_t i, j;
+   unsigned buf_len;
+
+   /* must initialize buffer to be zeros */
+   for(j = 0; j < buffer_size; j++)
+      buffer[j] = 0;
+
+   /* initialization before the loop */
+   j = 0;
+   buf_len = sizeof(unsigned char) * 8;
+
+   /* compress */
+   for(i = 0; i < d_nelmts; i++)
+       H5Z_scaleoffset_compress_one_atomic(data, i * p.size, buffer, &j, &buf_len, p);
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zshuffle.c b/gatb-core/thirdparty/hdf5/src/H5Zshuffle.c
new file mode 100644
index 0000000..654a7d5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zshuffle.c
@@ -0,0 +1,292 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Tprivate.h"		/* Datatypes         			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+/* Local function prototypes */
+static herr_t H5Z_set_local_shuffle(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static size_t H5Z_filter_shuffle(unsigned flags, size_t cd_nelmts,
+    const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_SHUFFLE[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_SHUFFLE,		/* Filter id number		*/
+    1,              /* encoder_present flag (set to true) */
+    1,              /* decoder_present flag (set to true) */
+    "shuffle",			/* Filter name for debugging	*/
+    NULL,                       /* The "can apply" callback     */
+    H5Z_set_local_shuffle,      /* The "set local" callback     */
+    H5Z_filter_shuffle,		/* The actual filter function	*/
+}};
+
+/* Local macros */
+#define H5Z_SHUFFLE_PARM_SIZE      0       /* "Local" parameter for shuffling size */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local_shuffle
+ *
+ * Purpose:	Set the "local" dataset parameter for data shuffling to be
+ *              the size of the datatype.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, April  7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+/* ARGSUSED */
+static herr_t
+H5Z_set_local_shuffle(hid_t dcpl_id, hid_t type_id, hid_t H5_ATTR_UNUSED space_id)
+{
+    H5P_genplist_t *dcpl_plist;     /* Property list pointer */
+    const H5T_t	*type;                  /* Datatype */
+    unsigned flags;                     /* Filter flags */
+    size_t cd_nelmts = H5Z_SHUFFLE_USER_NPARMS;     /* Number of filter parameters */
+    unsigned cd_values[H5Z_SHUFFLE_TOTAL_NPARMS];  /* Filter parameters */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the plist structure */
+    if(NULL == (dcpl_plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get datatype */
+    if(NULL == (type = (const H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get the filter's current parameters */
+    if(H5P_get_filter_by_id(dcpl_plist, H5Z_FILTER_SHUFFLE, &flags, &cd_nelmts, cd_values, (size_t)0, NULL, NULL) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get shuffle parameters")
+
+    /* Set "local" parameter for this dataset */
+    if((cd_values[H5Z_SHUFFLE_PARM_SIZE] = (unsigned)H5T_get_size(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5P_modify_filter(dcpl_plist, H5Z_FILTER_SHUFFLE, flags, (size_t)H5Z_SHUFFLE_TOTAL_NPARMS, cd_values) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "can't set local shuffle parameters")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local_shuffle() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_shuffle
+ *
+ * Purpose:	Implement an I/O filter which "de-interlaces" a block of data
+ *              by putting all the bytes in a byte-position for each element
+ *              together in the block.  For example, for 4-byte elements stored
+ *              as: 012301230123, shuffling will store them as: 000111222333
+ *              Usually, the bytes in each byte position are more related to
+ *              each other and putting them together will increase compression.
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Kent Yang
+ *              Wednesday, November 13, 2002
+ *
+ * Modifications:
+ *              Quincey Koziol, November 13, 2002
+ *              Cleaned up code.
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_shuffle(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
+                   size_t nbytes, size_t *buf_size, void **buf)
+{
+    void *dest = NULL;          /* Buffer to deposit [un]shuffled bytes into */
+    unsigned char *_src=NULL;   /* Alias for source buffer */
+    unsigned char *_dest=NULL;  /* Alias for destination buffer */
+    unsigned bytesoftype;       /* Number of bytes per element */
+    size_t numofelements;       /* Number of elements in buffer */
+    size_t i;                   /* Local index variables */
+#ifdef NO_DUFFS_DEVICE
+    size_t j;                   /* Local index variable */
+#endif /* NO_DUFFS_DEVICE */
+    size_t leftover;            /* Extra bytes at end of buffer */
+    size_t ret_value;           /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check arguments */
+    if (cd_nelmts!=H5Z_SHUFFLE_TOTAL_NPARMS || cd_values[H5Z_SHUFFLE_PARM_SIZE]==0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid shuffle parameters")
+
+    /* Get the number of bytes per element from the parameter block */
+    bytesoftype=cd_values[H5Z_SHUFFLE_PARM_SIZE];
+
+    /* Compute the number of elements in buffer */
+    numofelements=nbytes/bytesoftype;
+
+    /* Don't do anything for 1-byte elements, or "fractional" elements */
+    if(bytesoftype > 1 && numofelements > 1) {
+        /* Compute the leftover bytes if there are any */
+        leftover = nbytes%bytesoftype;
+
+        /* Allocate the destination buffer */
+        if (NULL==(dest = H5MM_malloc(nbytes)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for shuffle buffer")
+
+        if(flags & H5Z_FLAG_REVERSE) {
+            /* Get the pointer to the source buffer */
+            _src =(unsigned char *)(*buf);
+
+            /* Input; unshuffle */
+            for(i=0; i<bytesoftype; i++) {
+                _dest=((unsigned char *)dest)+i;
+#define DUFF_GUTS							    \
+    *_dest=*_src++;                             \
+    _dest+=bytesoftype;
+#ifdef NO_DUFFS_DEVICE
+                j = numofelements;
+                while(j > 0) {
+                    DUFF_GUTS;
+
+                    j--;
+                } /* end for */
+#else /* NO_DUFFS_DEVICE */
+            {
+                size_t duffs_index; /* Counting index for Duff's device */
+
+                duffs_index = (numofelements + 7) / 8;
+                switch (numofelements % 8) {
+                    default:
+                        HDassert(0 && "This Should never be executed!");
+                        break;
+                    case 0:
+                        do
+                          {
+                            DUFF_GUTS
+                    case 7:
+                            DUFF_GUTS
+                    case 6:
+                            DUFF_GUTS
+                    case 5:
+                            DUFF_GUTS
+                    case 4:
+                            DUFF_GUTS
+                    case 3:
+                            DUFF_GUTS
+                    case 2:
+                            DUFF_GUTS
+                    case 1:
+                            DUFF_GUTS
+                      } while (--duffs_index > 0);
+                } /* end switch */
+            }
+#endif /* NO_DUFFS_DEVICE */
+#undef DUFF_GUTS
+            } /* end for */
+
+            /* Add leftover to the end of data */
+            if(leftover>0) {
+                /* Adjust back to end of shuffled bytes */
+                _dest -= (bytesoftype - 1);     /*lint !e794 _dest is initialized */
+                HDmemcpy((void*)_dest, (void*)_src, leftover);
+            }
+        } /* end if */
+        else {
+            /* Get the pointer to the destination buffer */
+            _dest =(unsigned char *)dest;
+
+            /* Output; shuffle */
+            for(i=0; i<bytesoftype; i++) {
+                _src=((unsigned char *)(*buf))+i;
+#define DUFF_GUTS							    \
+    *_dest++=*_src;                             \
+    _src+=bytesoftype;
+#ifdef NO_DUFFS_DEVICE
+                j = numofelements;
+                while(j > 0) {
+                    DUFF_GUTS;
+
+                    j--;
+                } /* end for */
+#else /* NO_DUFFS_DEVICE */
+            {
+                size_t duffs_index; /* Counting index for Duff's device */
+
+                duffs_index = (numofelements + 7) / 8;
+                switch (numofelements % 8) {
+                    default:
+                        HDassert(0 && "This Should never be executed!");
+                        break;
+                    case 0:
+                        do
+                          {
+                            DUFF_GUTS
+                    case 7:
+                            DUFF_GUTS
+                    case 6:
+                            DUFF_GUTS
+                    case 5:
+                            DUFF_GUTS
+                    case 4:
+                            DUFF_GUTS
+                    case 3:
+                            DUFF_GUTS
+                    case 2:
+                            DUFF_GUTS
+                    case 1:
+                            DUFF_GUTS
+                      } while (--duffs_index > 0);
+                } /* end switch */
+            }
+#endif /* NO_DUFFS_DEVICE */
+#undef DUFF_GUTS
+            } /* end for */
+
+            /* Add leftover to the end of data */
+            if(leftover>0) {
+                /* Adjust back to end of shuffled bytes */
+                _src -= (bytesoftype - 1);      /*lint !e794 _src is initialized */
+                HDmemcpy((void*)_dest, (void*)_src, leftover);
+            }
+        } /* end else */
+
+        /* Free the input buffer */
+        H5MM_xfree(*buf);
+
+        /* Set the buffer information to return */
+        *buf = dest;
+        *buf_size=nbytes;
+    } /* end else */
+
+    /* Set the return value */
+    ret_value = nbytes;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Zszip.c b/gatb-core/thirdparty/hdf5/src/H5Zszip.c
new file mode 100644
index 0000000..dc09ebf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Zszip.c
@@ -0,0 +1,373 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"         /* File access                          */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
+#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5Sprivate.h"		/* Dataspaces         			*/
+#include "H5Tprivate.h"		/* Datatypes         			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+#ifdef H5_HAVE_FILTER_SZIP
+
+#ifdef H5_HAVE_SZLIB_H
+#   include "szlib.h"
+#endif
+
+/* Local function prototypes */
+static htri_t H5Z_can_apply_szip(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static herr_t H5Z_set_local_szip(hid_t dcpl_id, hid_t type_id, hid_t space_id);
+static size_t H5Z_filter_szip (unsigned flags, size_t cd_nelmts,
+    const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+H5Z_class2_t H5Z_SZIP[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_SZIP,		/* Filter id number		*/
+    1,              /* Assume encoder present: check before registering */
+    1,                  /* decoder_present flag (set to true) */
+    "szip",			    /* Filter name for debugging	*/
+    H5Z_can_apply_szip,		/* The "can apply" callback     */
+    H5Z_set_local_szip,         /* The "set local" callback     */
+    H5Z_filter_szip,		/* The actual filter function	*/
+}};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_can_apply_szip
+ *
+ * Purpose:	Check the parameters for szip compression for validity and
+ *              whether they fit a particular dataset.
+ *
+ * Note:        This function currently range-checks for datatypes with
+ *              8-bit boundaries (8, 16, 24, etc.).  It appears that the szip
+ *              library can actually handle 1-24, 32 & 64 bit samples.  If
+ *              this becomes important, we should make the checks below more
+ *              sophisticated and have them check for n-bit datatypes of the
+ *              correct size, etc. - QAK
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, April  7, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5Z_can_apply_szip(hid_t H5_ATTR_UNUSED dcpl_id, hid_t type_id, hid_t H5_ATTR_UNUSED space_id)
+{
+    const H5T_t	*type;                  /* Datatype */
+    unsigned dtype_size;                /* Datatype's size (in bits) */
+    H5T_order_t dtype_order;            /* Datatype's endianness order */
+    htri_t ret_value = TRUE;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get datatype */
+    if(NULL == (type = H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get datatype's size, for checking the "bits-per-pixel" */
+    if((dtype_size = (8 * H5T_get_size(type))) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+
+    /* Range check datatype's size */
+    if(dtype_size > 32 && dtype_size != 64)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FALSE, "invalid datatype size")
+
+    /* Get datatype's endianness order */
+    if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "can't retrieve datatype endianness order")
+
+    /* Range check datatype's endianness order */
+    /* (Note: this may not handle non-atomic datatypes well) */
+    if(dtype_order != H5T_ORDER_LE && dtype_order != H5T_ORDER_BE)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FALSE, "invalid datatype endianness order")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_can_apply_szip() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_set_local_szip
+ *
+ * Purpose:	Set the "local" dataset parameters for szip compression.
+ *
+ * Return:	Success: Non-negative
+ *		Failure: Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, April  7, 2003
+ *
+ * Modifications: Used new logic to set the size of the scanline parameter.
+ *                Now SZIP compression can be applied to the chunk
+ *                of any shape and size with only one restriction: the number
+ *                of elements in the chunk has to be not less than number
+ *                of elements (pixels) in the block (cd_values[H5Z_SZIP_PARM_PPB]
+ *                parameter).
+ *                           Elena Pourmal, July 20, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_set_local_szip(hid_t dcpl_id, hid_t type_id, hid_t space_id)
+{
+    H5P_genplist_t *dcpl_plist; /* Property list pointer */
+    const H5T_t	*type;          /* Datatype */
+    const H5S_t	*ds;            /* Dataspace */
+    unsigned flags;             /* Filter flags */
+    size_t cd_nelmts = H5Z_SZIP_USER_NPARMS;     /* Number of filter parameters */
+    unsigned cd_values[H5Z_SZIP_TOTAL_NPARMS];  /* Filter parameters */
+    hsize_t dims[H5O_LAYOUT_NDIMS];             /* Dataspace (i.e. chunk) dimensions */
+    int ndims;                  /* Number of (chunk) dimensions */
+    H5T_order_t dtype_order;    /* Datatype's endianness order */
+    size_t dtype_size;          /* Datatype's size (in bits) */
+    size_t dtype_precision;     /* Datatype's precision (in bits) */
+    size_t dtype_offset;        /* Datatype's offset (in bits) */
+    hsize_t scanline;           /* Size of dataspace's fastest changing dimension */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the plist structure */
+    if(NULL == (dcpl_plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get datatype */
+    if(NULL == (type = H5I_object_verify(type_id, H5I_DATATYPE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+    /* Get the filter's current parameters */
+    if(H5P_get_filter_by_id(dcpl_plist, H5Z_FILTER_SZIP, &flags, &cd_nelmts, cd_values, 0, NULL, NULL) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "can't get szip parameters")
+
+    /* Get datatype's size, for checking the "bits-per-pixel" */
+    if((dtype_size = (8 * H5T_get_size(type))) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size");
+
+    /* Get datatype's precision, in case is less than full bits  */
+    if((dtype_precision = H5T_get_precision(type)) == 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype precision");
+
+    if(dtype_precision < dtype_size) {
+        dtype_offset = H5T_get_offset(type);
+        if(dtype_offset != 0)
+            dtype_precision = dtype_size;
+    } /* end if */
+    if(dtype_precision > 24) {
+	if(dtype_precision <= 32)
+            dtype_precision = 32;
+	else if(dtype_precision <= 64)
+            dtype_precision = 64;
+    } /* end if */
+
+    /* Set "local" parameter for this dataset's "bits-per-pixel" */
+    cd_values[H5Z_SZIP_PARM_BPP] = dtype_precision;
+
+    /* Get dataspace */
+    if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Get dimensions for dataspace */
+    if((ndims = H5S_get_simple_extent_dims(ds, dims, NULL)) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get dataspace dimensions")
+
+    /* Set "local" parameter for this dataset's "pixels-per-scanline" */
+    /* (Use the chunk's fastest changing dimension size) */
+    HDassert(ndims > 0);
+    scanline = dims[ndims - 1];
+
+    /* Adjust scanline if it is smaller than number of pixels per block or
+       if it is bigger than maximum pixels per scanline, or there are more than
+       SZ_MAX_BLOCKS_PER_SCANLINE blocks per scanline  */
+
+    /* Check the pixels per block against the 'scanline' size */
+    if(scanline < cd_values[H5Z_SZIP_PARM_PPB]) {
+        hssize_t npoints;                   /* Number of points in the dataspace */
+
+        /* Get number of elements for the dataspace;  use
+           total number of elements in the chunk to define the new 'scanline' size */
+        if((npoints = H5S_GET_EXTENT_NPOINTS(ds)) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTGET, FAIL, "unable to get number of points in the dataspace")
+        if(npoints < cd_values[H5Z_SZIP_PARM_PPB])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "pixels per block greater than total number of elements in the chunk")
+        scanline = MIN((cd_values[H5Z_SZIP_PARM_PPB] * SZ_MAX_BLOCKS_PER_SCANLINE), npoints);
+    }
+    else {
+        if(scanline <= SZ_MAX_PIXELS_PER_SCANLINE)
+            scanline = MIN((cd_values[H5Z_SZIP_PARM_PPB] * SZ_MAX_BLOCKS_PER_SCANLINE), scanline);
+        else
+            scanline = cd_values[H5Z_SZIP_PARM_PPB] * SZ_MAX_BLOCKS_PER_SCANLINE;
+    } /* end else */
+
+    /* Assign the final value to the scanline */
+    H5_CHECKED_ASSIGN(cd_values[H5Z_SZIP_PARM_PPS], unsigned, scanline, hsize_t);
+
+    /* Get datatype's endianness order */
+    if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
+	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+
+    /* Set the correct endianness flag for szip */
+    /* (Note: this may not handle non-atomic datatypes well) */
+    cd_values[H5Z_SZIP_PARM_MASK] &= ~(SZ_LSB_OPTION_MASK|SZ_MSB_OPTION_MASK);
+    switch(dtype_order) {
+        case H5T_ORDER_LE:      /* Little-endian byte order */
+            cd_values[H5Z_SZIP_PARM_MASK] |= SZ_LSB_OPTION_MASK;
+            break;
+
+        case H5T_ORDER_BE:      /* Big-endian byte order */
+            cd_values[H5Z_SZIP_PARM_MASK] |= SZ_MSB_OPTION_MASK;
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
+    } /* end switch */
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5P_modify_filter(dcpl_plist, H5Z_FILTER_SZIP, flags, H5Z_SZIP_TOTAL_NPARMS, cd_values) < 0)
+	HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "can't set local szip parameters")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_set_local_szip() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Z_filter_szip
+ *
+ * Purpose:	Implement an I/O filter around the 'rice' algorithm in
+ *              libsz
+ *
+ * Return:	Success: Size of buffer filtered
+ *		Failure: 0
+ *
+ * Programmer:	Kent Yang
+ *              Tuesday, April 1, 2003
+ *
+ * Modifications:
+ *              Quincey Koziol, April 2, 2003
+ *              Cleaned up code.
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_szip (unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
+    size_t nbytes, size_t *buf_size, void **buf)
+{
+    size_t ret_value = 0;       /* Return value */
+    size_t size_out  = 0;       /* Size of output buffer */
+    unsigned char *outbuf = NULL;    /* Pointer to new output buffer */
+    unsigned char *newbuf = NULL;    /* Pointer to input buffer */
+    SZ_com_t sz_param;          /* szip parameter block */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Sanity check to make certain that we haven't drifted out of date with
+     * the mask options from the szlib.h header */
+    HDassert(H5_SZIP_ALLOW_K13_OPTION_MASK==SZ_ALLOW_K13_OPTION_MASK);
+    HDassert(H5_SZIP_CHIP_OPTION_MASK==SZ_CHIP_OPTION_MASK);
+    HDassert(H5_SZIP_EC_OPTION_MASK==SZ_EC_OPTION_MASK);
+    HDassert(H5_SZIP_LSB_OPTION_MASK==SZ_LSB_OPTION_MASK);
+    HDassert(H5_SZIP_MSB_OPTION_MASK==SZ_MSB_OPTION_MASK);
+    HDassert(H5_SZIP_NN_OPTION_MASK==SZ_NN_OPTION_MASK);
+    HDassert(H5_SZIP_RAW_OPTION_MASK==SZ_RAW_OPTION_MASK);
+
+    /* Check arguments */
+    if (cd_nelmts!=4)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid deflate aggression level")
+
+    /* Copy the filter parameters into the szip parameter block */
+    H5_CHECKED_ASSIGN(sz_param.options_mask, int, cd_values[H5Z_SZIP_PARM_MASK], unsigned);
+    H5_CHECKED_ASSIGN(sz_param.bits_per_pixel, int, cd_values[H5Z_SZIP_PARM_BPP], unsigned);
+    H5_CHECKED_ASSIGN(sz_param.pixels_per_block, int, cd_values[H5Z_SZIP_PARM_PPB], unsigned);
+    H5_CHECKED_ASSIGN(sz_param.pixels_per_scanline, int, cd_values[H5Z_SZIP_PARM_PPS], unsigned);
+
+    /* Input; uncompress */
+    if (flags & H5Z_FLAG_REVERSE) {
+        uint32_t stored_nalloc;  /* Number of bytes the compressed block will expand into */
+        size_t nalloc;  /* Number of bytes the compressed block will expand into */
+
+        /* Get the size of the uncompressed buffer */
+        newbuf = *buf;
+        UINT32DECODE(newbuf,stored_nalloc);
+        H5_CHECKED_ASSIGN(nalloc, size_t, stored_nalloc, uint32_t);
+
+        /* Allocate space for the uncompressed buffer */
+        if(NULL==(outbuf = H5MM_malloc(nalloc)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for szip decompression")
+
+        /* Decompress the buffer */
+        size_out=nalloc;
+        if(SZ_BufftoBuffDecompress(outbuf, &size_out, newbuf, nbytes-4, &sz_param) != SZ_OK)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "szip_filter: decompression failed")
+        HDassert(size_out==nalloc);
+
+        /* Free the input buffer */
+        H5MM_xfree(*buf);
+
+        /* Set return values */
+        *buf = outbuf;
+        outbuf = NULL;
+        *buf_size = nalloc;
+        ret_value = nalloc;
+    }
+    /* Output; compress */
+    else {
+        unsigned char *dst = NULL;    /* Temporary pointer to new output buffer */
+
+        /* Allocate space for the compressed buffer & header (assume data won't get bigger) */
+        if(NULL==(dst=outbuf = H5MM_malloc(nbytes+4)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "unable to allocate szip destination buffer")
+
+        /* Encode the uncompressed length */
+        H5_CHECK_OVERFLOW(nbytes,size_t,uint32_t);
+        UINT32ENCODE(dst,nbytes);
+
+        /* Compress the buffer */
+        size_out = nbytes;
+        if(SZ_OK!= SZ_BufftoBuffCompress(dst, &size_out, *buf, nbytes, &sz_param))
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, 0, "overflow")
+        HDassert(size_out<=nbytes);
+
+        /* Free the input buffer */
+        H5MM_xfree(*buf);
+
+        /* Set return values */
+        *buf = outbuf;
+        outbuf = NULL;
+        *buf_size = size_out+4;
+        ret_value = size_out+4;
+    }
+
+done:
+    if(outbuf)
+        H5MM_xfree(outbuf);
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+#endif /* H5_HAVE_FILTER_SZIP */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5Ztrans.c b/gatb-core/thirdparty/hdf5/src/H5Ztrans.c
new file mode 100644
index 0000000..7a94487
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5Ztrans.c
@@ -0,0 +1,1718 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5VMprivate.h"		/* H5VM_array_fill			*/
+#include "H5Zpkg.h"		/* Data filters				*/
+
+
+/* Token types */
+typedef enum {
+    H5Z_XFORM_ERROR,
+    H5Z_XFORM_INTEGER, /* this represents an integer type in the data transform expression */
+    H5Z_XFORM_FLOAT,  /* this represents a floating point type in the data transform expression */
+    H5Z_XFORM_SYMBOL,
+    H5Z_XFORM_PLUS,
+    H5Z_XFORM_MINUS,
+    H5Z_XFORM_MULT,
+    H5Z_XFORM_DIVIDE,
+    H5Z_XFORM_LPAREN,
+    H5Z_XFORM_RPAREN,
+    H5Z_XFORM_END
+} H5Z_token_type;
+
+
+typedef struct {
+    unsigned int	num_ptrs;
+    void**	ptr_dat_val;
+} H5Z_datval_ptrs;
+
+
+/* Used to represent values in transform expression */
+typedef union {
+    void   *dat_val;
+    long    int_val;
+    double  float_val;
+} H5Z_num_val;
+
+typedef struct H5Z_node {
+    struct H5Z_node    *lchild;
+    struct H5Z_node    *rchild;
+    H5Z_token_type      type;
+    H5Z_num_val         value;
+} H5Z_node;
+
+struct H5Z_data_xform_t {
+    char*       xform_exp;
+    H5Z_node*       parse_root;
+    H5Z_datval_ptrs*	dat_val_pointers;
+};
+
+typedef struct result {
+    H5Z_token_type type;
+    H5Z_num_val    value;
+} H5Z_result;
+
+
+/* The token */
+typedef struct {
+    const char *tok_expr;       /* Holds the original expression        */
+
+    /* Current token values */
+    H5Z_token_type  tok_type;       /* The type of the current token        */
+    const char *tok_begin;      /* The beginning of the current token   */
+    const char *tok_end;        /* The end of the current token         */
+
+    /* Previous token values */
+    H5Z_token_type  tok_last_type;  /* The type of the last token           */
+    const char *tok_last_begin; /* The beginning of the last token      */
+    const char *tok_last_end;   /* The end of the last token            */
+} H5Z_token;
+
+/* Local function prototypes */
+static H5Z_token *H5Z_get_token(H5Z_token *current);
+static H5Z_node *H5Z_parse_expression(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers);
+static H5Z_node *H5Z_parse_term(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers);
+static H5Z_node *H5Z_parse_factor(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers);
+static H5Z_node *H5Z_new_node(H5Z_token_type type);
+static void H5Z_do_op(H5Z_node* tree);
+static hbool_t H5Z_op_is_numbs(H5Z_node* _tree);
+static hbool_t H5Z_op_is_numbs2(H5Z_node* _tree);
+static hid_t H5Z_xform_find_type(const H5T_t* type);
+static herr_t H5Z_xform_eval_full(H5Z_node *tree, const size_t array_size, const hid_t array_type, H5Z_result* res);
+static void H5Z_xform_destroy_parse_tree(H5Z_node *tree);
+static void* H5Z_xform_parse(const char *expression, H5Z_datval_ptrs* dat_val_pointers);
+static void* H5Z_xform_copy_tree(H5Z_node* tree, H5Z_datval_ptrs* dat_val_pointers, H5Z_datval_ptrs* new_dat_val_pointers);
+static void H5Z_xform_reduce_tree(H5Z_node* tree);
+#ifdef H5Z_XFORM_DEBUG
+static void H5Z_XFORM_DEBUG(H5Z_node *tree);
+static void H5Z_print(H5Z_node *tree, FILE *stream);
+#endif  /* H5Z_XFORM_DEBUG */
+
+/* PGCC (11.8-0) has trouble with the command *p++ = *p OP tree_val. It increments P first before 
+ * doing the operation.  So I break down the command into two lines:
+ *     *p = *p OP tree_val; p++;
+ * Actually, the behavior of *p++ = *p OP tree_val is undefined. (SLU - 2012/3/19) 
+ */
+#define H5Z_XFORM_DO_OP1(RESL,RESR,TYPE,OP,SIZE)                            \
+{   								  	    \
+    size_t u;                                                               \
+                                                                            \
+    if(((RESL).type == H5Z_XFORM_SYMBOL) && ((RESR).type != H5Z_XFORM_SYMBOL)) \
+    {   								    \
+	TYPE* p;                                                            \
+	double tree_val;                                                    \
+		                                                            \
+	tree_val = ((RESR).type==H5Z_XFORM_INTEGER ? (double)(RESR).value.int_val : (RESR).value.float_val); \
+	p = (TYPE*)(RESL).value.dat_val;                                    \
+                                                                            \
+	for(u=0; u<(SIZE); u++) {                                           \
+	    *p = *p OP tree_val;                                            \
+            p++;                                                            \
+        }                                                                   \
+    }									    \
+    else if(((RESR).type == H5Z_XFORM_SYMBOL) && ((RESL).type != H5Z_XFORM_SYMBOL)) \
+    {   								    \
+	TYPE* p;                                                            \
+	double tree_val;                                                    \
+		                                                            \
+        /* The case that the left operand is nothing, like -x or +x */      \
+	if((RESL).type == H5Z_XFORM_ERROR)                                  \
+            tree_val = 0;                                                   \
+	else                                                                \
+	    tree_val = ((RESL).type==H5Z_XFORM_INTEGER ? (double)(RESL).value.int_val : (RESL).value.float_val); \
+                                                                            \
+	p = (TYPE*)(RESR).value.dat_val;                                    \
+	for(u=0; u<(SIZE); u++) {                                           \
+	    *p = tree_val OP *p;                                            \
+            p++;                                                            \
+        }                                                                   \
+    }									    \
+    else if( ((RESL).type == H5Z_XFORM_SYMBOL) && ((RESR).type==H5Z_XFORM_SYMBOL))  \
+    {										\
+	TYPE* pl = (TYPE*)(RESL).value.dat_val;                             	\
+	TYPE* pr = (TYPE*)(RESR).value.dat_val;                             	\
+										\
+	for(u=0; u<(SIZE); u++) {                                            	\
+	    *pl = *pl OP *pr;                                           	\
+            pl++; pr++;                                                         \
+        }                                                                       \
+    }										\
+    else									\
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unexpected type conversion operation")	\
+}
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+#define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
+{									\
+    if((TYPE) == H5T_NATIVE_CHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UCHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SCHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), signed char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SHORT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), short, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_USHORT)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned short, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_INT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), int, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UINT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned int, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_ULONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LLONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_ULLONG)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long long, OP, (SIZE)) \
+    else if((TYPE) == H5T_NATIVE_FLOAT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), float, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_DOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), double, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_LDOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long double, OP, (SIZE))	\
+}
+#else
+#define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
+{									\
+    if((TYPE) == H5T_NATIVE_CHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UCHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SCHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), signed char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SHORT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), short, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_USHORT)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned short, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_INT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), int, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UINT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned int, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_ULONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LLONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_ULLONG)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long long, OP, (SIZE)) \
+    else if((TYPE) == H5T_NATIVE_FLOAT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), float, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_DOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), double, OP, (SIZE))		\
+}
+#endif /*H5_SIZEOF_LONG_DOUBLE */
+
+#define H5Z_XFORM_DO_OP3(OP)                                                                                                                    \
+{                                                                                                                                               \
+        if((tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type==H5Z_XFORM_INTEGER))                                                \
+        {																	\
+            tree->type = H5Z_XFORM_INTEGER;													\
+            tree->value.int_val = tree->lchild->value.int_val OP tree->rchild->value.int_val;							\
+            H5MM_xfree(tree->lchild);														\
+            H5MM_xfree(tree->rchild);														\
+            tree->lchild = NULL;														\
+            tree->rchild = NULL;														\
+        }																	\
+	else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && 					\
+	            ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER)))					\
+	{																	\
+	    tree->type = H5Z_XFORM_FLOAT;													\
+           tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : (double)tree->lchild->value.int_val) OP 	\
+				    ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : (double)tree->rchild->value.int_val);	\
+            H5MM_xfree(tree->lchild);														\
+            H5MM_xfree(tree->rchild);														\
+            tree->lchild = NULL;														\
+            tree->rchild = NULL;														\
+        }																	\
+}
+
+#define H5Z_XFORM_DO_OP4(TYPE)                                                                                          \
+{                                                                                                                       \
+    if ((ret_value = (H5Z_node*) H5MM_malloc(sizeof(H5Z_node))) == NULL)                                                \
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Ran out of memory trying to copy parse tree")                     \
+    else                                                                                                                \
+    {                                                                                                                   \
+        ret_value->type = (TYPE);                                                                                       \
+        ret_value->lchild = (H5Z_node*) H5Z_xform_copy_tree(tree->lchild, dat_val_pointers, new_dat_val_pointers);      \
+        ret_value->rchild = (H5Z_node*) H5Z_xform_copy_tree(tree->rchild, dat_val_pointers, new_dat_val_pointers);      \
+    }                                                                                                                   \
+}
+
+#define H5Z_XFORM_DO_OP5(TYPE, SIZE)                                                               \
+{                                                                                                  \
+    TYPE val = ((tree->type == H5Z_XFORM_INTEGER) ? (TYPE)tree->value.int_val : (TYPE)tree->value.float_val); \
+    H5VM_array_fill(array, &val, sizeof(TYPE), (SIZE));                                             \
+}
+
+/* The difference of this macro from H5Z_XFORM_DO_OP3 is that it handles the operations when the left operand is empty, like -x or +x.  
+ * The reason that it's seperated from H5Z_XFORM_DO_OP3 is because compilers don't accept operations like *x or /x.  So in H5Z_do_op, 
+ * these two macros are called in different ways. (SLU 2012/3/20) 
+ */
+#define H5Z_XFORM_DO_OP6(OP)                                                                                                                    \
+{                                                                                                                                               \
+        if(!tree->lchild && (tree->rchild->type==H5Z_XFORM_INTEGER))                                                                            \
+        {																	\
+            tree->type = H5Z_XFORM_INTEGER;													\
+            tree->value.int_val = OP tree->rchild->value.int_val;							                        \
+            H5MM_xfree(tree->rchild);														\
+            tree->rchild = NULL;														\
+        }	                                                                                                                                \
+        else if(!tree->lchild && (tree->rchild->type==H5Z_XFORM_FLOAT))                                                                         \
+        {																	\
+            tree->type = H5Z_XFORM_FLOAT;													\
+            tree->value.float_val = OP tree->rchild->value.float_val;							                        \
+            H5MM_xfree(tree->rchild);														\
+            tree->rchild = NULL;														\
+        }	                                                                                                                                \
+        else if((tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type==H5Z_XFORM_INTEGER))                                           \
+        {																	\
+            tree->type = H5Z_XFORM_INTEGER;													\
+            tree->value.int_val = tree->lchild->value.int_val OP tree->rchild->value.int_val;							\
+            H5MM_xfree(tree->lchild);														\
+            H5MM_xfree(tree->rchild);														\
+            tree->lchild = NULL;														\
+            tree->rchild = NULL;														\
+        }																	\
+	else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && 					\
+	            ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER)))					\
+	{																	\
+	    tree->type = H5Z_XFORM_FLOAT;													\
+            tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : (double)tree->lchild->value.int_val) OP 	\
+				    ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : (double)tree->rchild->value.int_val);	\
+            H5MM_xfree(tree->lchild);														\
+            H5MM_xfree(tree->rchild);														\
+            tree->lchild = NULL;														\
+            tree->rchild = NULL;														\
+        }																	\
+}
+
+/*
+ *  Programmer: Bill Wendling <wendling at ncsa.uiuc.edu>
+ *              25. August 2003
+ */
+
+/*
+ * This is the context-free grammar for our expressions:
+ *
+ * expr     :=  term    | term '+ term      | term '-' term
+ * term     :=  factor  | factor '*' factor | factor '/' factor
+ * factor   :=  number      |
+ *              symbol      |
+ *              '-' factor  |   // unary minus
+ *              '+' factor  |   // unary plus
+ *              '(' expr ')'
+ * symbol   :=  [a-zA-Z][a-zA-Z0-9]*
+ * number   :=  H5Z_XFORM_INTEGER | FLOAT
+ *      // H5Z_XFORM_INTEGER is a C long int
+ *      // FLOAT is a C double
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_unget_token
+ * Purpose:     Rollback the H5Z_token to the previous H5Z_token retrieved. There
+ *              should only need to be one level of rollback necessary
+ *              for our grammar.
+ * Return:      Always succeeds.
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ * Modifications:
+  *              Leon Arber:  Added FUNC_ENTER / FUNC_LEAVE pairs
+*
+ *-------------------------------------------------------------------------
+ */
+static void
+H5Z_unget_token(H5Z_token *current)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(current);
+
+    current->tok_type = current->tok_last_type;
+    current->tok_begin = current->tok_last_begin;
+    current->tok_end = current->tok_last_end;
+
+    FUNC_LEAVE_NOAPI_VOID
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_get_token
+ *
+ * Purpose:     Determine what the next valid H5Z_token is in the expression
+ *              string. The current position within the H5Z_token string is
+ *              kept internal to the H5Z_token and handled by this and the
+ *              unget_H5Z_token function.
+ *
+ * Return:      Succeess:       The passed in H5Z_token with a valid tok_type
+ *                              field.
+ *              Failure:        The passed in H5Z_token but with the tok_type
+ *                              field set to ERROR.
+ *
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5Z_token *
+H5Z_get_token(H5Z_token *current)
+{
+    H5Z_token *ret_value = current;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(current);
+
+    /* Save the last position for possible ungets */
+    current->tok_last_type = current->tok_type;
+    current->tok_last_begin = current->tok_begin;
+    current->tok_last_end = current->tok_end;
+
+    current->tok_begin = current->tok_end;
+
+    while (current->tok_begin[0] != '\0') {
+        if (HDisspace(current->tok_begin[0])) {
+            /* ignore whitespace */
+        } else if (HDisdigit(current->tok_begin[0]) ||
+                   current->tok_begin[0] == '.') {
+            current->tok_end = current->tok_begin;
+
+            /*
+             * H5Z_XFORM_INTEGER          :=  digit-sequence
+             * digit-sequence   :=  digit | digit digit-sequence
+             * digit            :=  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
+             */
+            if (current->tok_end[0] != '.') {
+                /* is number */
+                current->tok_type = H5Z_XFORM_INTEGER;
+
+                while (HDisdigit(current->tok_end[0]))
+                    ++current->tok_end;
+            }
+
+            /*
+             * float            :=  digit-sequence exponent |
+             *                      dotted-digits exponent?
+             * dotted-digits    :=  digit-sequence '.' digit-sequence?  |
+             *                      '.' digit-sequence
+             * exponent         :=  [Ee] [-+]? digit-sequence
+             */
+            if (current->tok_end[0] == '.' ||
+                    current->tok_end[0] == 'e' ||
+                    current->tok_end[0] == 'E') {
+                current->tok_type = H5Z_XFORM_FLOAT;
+
+                if (current->tok_end[0] == '.')
+                    do {
+                        ++current->tok_end;
+                    } while (HDisdigit(current->tok_end[0]));
+
+                if (current->tok_end[0] == 'e' ||
+                    current->tok_end[0] == 'E') {
+                    ++current->tok_end;
+
+                    if (current->tok_end[0] == '-' ||
+                        current->tok_end[0] == '+')
+                        ++current->tok_end;
+
+                    if (!HDisdigit(current->tok_end[0])) {
+                        current->tok_type = H5Z_XFORM_ERROR;
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, current, "Invalidly formatted floating point number")
+                    }
+
+                    while (HDisdigit(current->tok_end[0]))
+                        ++current->tok_end;
+                }
+
+                /* Check that this is a properly formatted numerical value */
+                if (HDisalpha(current->tok_end[0]) || current->tok_end[0] == '.') {
+                    current->tok_type = H5Z_XFORM_ERROR;
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, current, "Invalidly formatted floating point number")
+                }
+            }
+
+            break;
+        } else if (HDisalpha(current->tok_begin[0])) {
+            /* is symbol */
+            current->tok_type = H5Z_XFORM_SYMBOL;
+            current->tok_end = current->tok_begin;
+
+            while (HDisalnum(current->tok_end[0]))
+                ++current->tok_end;
+
+            break;
+        } else {
+            /* should be +, -, *, /, (, or ) */
+            switch (current->tok_begin[0]) {
+                case '+':   current->tok_type = H5Z_XFORM_PLUS;    break;
+                case '-':   current->tok_type = H5Z_XFORM_MINUS;   break;
+                case '*':   current->tok_type = H5Z_XFORM_MULT;    break;
+                case '/':   current->tok_type = H5Z_XFORM_DIVIDE;  break;
+                case '(':   current->tok_type = H5Z_XFORM_LPAREN;  break;
+                case ')':   current->tok_type = H5Z_XFORM_RPAREN;  break;
+                default:
+                    current->tok_type = H5Z_XFORM_ERROR;
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, current, "Unknown H5Z_token in data transform expression ")
+            }
+
+            current->tok_end = current->tok_begin + 1;
+            break;
+        }
+
+        ++current->tok_begin;
+    }
+
+    if (current->tok_begin[0] == '\0')
+        current->tok_type = H5Z_XFORM_END;
+
+    /* Set return value */
+    ret_value = current;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_xform_destroy_parse_tree
+ * Purpose:     Recursively destroys the expression tree.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling
+ *              25. August 2003
+ * Modifications:
+ *              Leon Arber: Added FUNC_ENTER / FUNC_LEAVE pairs
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5Z_xform_destroy_parse_tree(H5Z_node *tree)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if (tree)
+    {
+	H5Z_xform_destroy_parse_tree(tree->lchild);
+	H5Z_xform_destroy_parse_tree(tree->rchild);
+	H5MM_xfree(tree);
+	tree = NULL;
+    }
+
+    FUNC_LEAVE_NOAPI_VOID
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_parse
+ *
+ * Purpose:     Entry function for parsing the expression string.
+ *
+ * Return:      Success:    Valid H5Z_node ptr to an expression tree.
+ *              NULLure:    NULL
+ *
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5Z_xform_parse(const char *expression, H5Z_datval_ptrs* dat_val_pointers)
+{
+    H5Z_token tok;
+    void* ret_value;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    if(!expression)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "No expression provided?")
+
+    /* Set up the initial H5Z_token for parsing */
+    tok.tok_expr = tok.tok_begin = tok.tok_end = expression;
+
+    ret_value = (void*)H5Z_parse_expression(&tok, dat_val_pointers);
+
+    H5Z_xform_reduce_tree((H5Z_node*)ret_value);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_parse_expression
+ * Purpose:     Beginning of the recursive descent parser to parse the
+ *              expression. An expression is:
+ *
+ *                  expr     :=  term | term '+' term | term '-' term
+ *
+ * Return:      Success:    Valid H5Z_node ptr to expression tree
+ *              NULLure:    NULL
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ * Modifications:
+  *              Leon Arber: Added FUNC_ENTER / FUNC_LEAVE pairs
+*
+ *-------------------------------------------------------------------------
+ */
+static H5Z_node *
+H5Z_parse_expression(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
+{
+    H5Z_node *expr;
+    H5Z_node *ret_value;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    expr = H5Z_parse_term(current, dat_val_pointers);
+
+    for (;;) {
+        H5Z_node *new_node;
+
+        current = H5Z_get_token(current);
+
+        switch(current->tok_type) {
+            case H5Z_XFORM_PLUS:
+                new_node = H5Z_new_node(H5Z_XFORM_PLUS);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(expr);
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+                }
+
+                new_node->lchild = expr;
+                new_node->rchild = H5Z_parse_term(current, dat_val_pointers);
+
+                if (!new_node->rchild) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                expr = new_node;
+                break;
+
+            case H5Z_XFORM_MINUS:
+                new_node = H5Z_new_node(H5Z_XFORM_MINUS);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(expr);
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+                }
+
+                new_node->lchild = expr;
+                new_node->rchild = H5Z_parse_term(current, dat_val_pointers);
+
+                if (!new_node->rchild) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                expr = new_node;
+                break;
+
+            case H5Z_XFORM_RPAREN:
+                H5Z_unget_token(current);
+                HGOTO_DONE(expr)
+
+            case H5Z_XFORM_END:
+                HGOTO_DONE(expr)
+
+            case H5Z_XFORM_ERROR:
+            case H5Z_XFORM_INTEGER:
+            case H5Z_XFORM_FLOAT:
+            case H5Z_XFORM_SYMBOL:
+            case H5Z_XFORM_MULT:
+            case H5Z_XFORM_DIVIDE:
+            case H5Z_XFORM_LPAREN:
+            default:
+                H5Z_xform_destroy_parse_tree(expr);
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+        }
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_parse_term
+ * Purpose:     Parses a term in our expression language. A term is:
+ *
+ *                  term :=  factor | factor '*' factor | factor '/' factor
+ *
+ * Return:      Success:    Valid H5Z_node ptr to expression tree
+ *              NULLure:    NULL
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ * Modifications:
+  *              Leon Arber: Added FUNC_ENTER / FUNC_LEAVE pairs
+*
+ *-------------------------------------------------------------------------
+ */
+static H5Z_node *
+H5Z_parse_term(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
+{
+    H5Z_node *term = NULL;
+    H5Z_node *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    term = H5Z_parse_factor(current, dat_val_pointers);
+
+    for (;;) {
+        H5Z_node *new_node;
+
+        current = H5Z_get_token(current);
+
+        switch (current->tok_type) {
+            case H5Z_XFORM_MULT:
+                new_node = H5Z_new_node(H5Z_XFORM_MULT);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(term);
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+                }
+
+                new_node->lchild = term;
+                new_node->rchild = H5Z_parse_factor(current, dat_val_pointers);
+
+                if (!new_node->rchild) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                term = new_node;
+                break;
+
+            case H5Z_XFORM_DIVIDE:
+                new_node = H5Z_new_node(H5Z_XFORM_DIVIDE);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(term);
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+                }
+
+                new_node->lchild = term;
+                new_node->rchild = H5Z_parse_factor(current, dat_val_pointers);
+                term = new_node;
+
+                if (!new_node->rchild) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+                break;
+
+            case H5Z_XFORM_RPAREN:
+                H5Z_unget_token(current);
+                HGOTO_DONE(term)
+
+            case H5Z_XFORM_END:
+                HGOTO_DONE(term)
+
+            default:
+                H5Z_unget_token(current);
+                HGOTO_DONE(term)
+	}
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_parse_factor
+ * Purpose:     Parses a factor in our expression language. A factor is:
+ *
+ *                  factor   :=  number      |  // C long or double
+ *                               symbol      |  // C identifier
+ *                               '-' factor  |  // unary minus
+ *                               '+' factor  |  // unary plus
+ *                               '(' expr ')'
+ *
+ * Return:      Success:    Valid H5Z_node ptr to expression tree
+ *              NULLure:    NULL
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ * Modifications:
+ *              Leon Arber: Added FUNC_ENTER / FUNC_LEAVE pairs
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5Z_node *
+H5Z_parse_factor(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
+{
+    H5Z_node 	*factor=NULL;
+    H5Z_node 	*new_node;
+    H5Z_node    *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    current = H5Z_get_token(current);
+
+    switch (current->tok_type) {
+	case H5Z_XFORM_INTEGER:
+	    factor = H5Z_new_node(H5Z_XFORM_INTEGER);
+
+	    if (!factor)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            sscanf(current->tok_begin, "%ld", &factor->value.int_val);
+	    break;
+
+	case H5Z_XFORM_FLOAT:
+	    factor = H5Z_new_node(H5Z_XFORM_FLOAT);
+
+	    if (!factor)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            sscanf(current->tok_begin, "%lf", &factor->value.float_val);
+	    break;
+
+	case H5Z_XFORM_SYMBOL:
+	    factor = H5Z_new_node(H5Z_XFORM_SYMBOL);
+
+	    if (!factor)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+
+            factor->value.dat_val = &(dat_val_pointers->ptr_dat_val[dat_val_pointers->num_ptrs]);
+	    dat_val_pointers->num_ptrs++;
+	    break;
+
+	case H5Z_XFORM_LPAREN:
+	    factor = H5Z_parse_expression(current, dat_val_pointers);
+
+	    if (!factor)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+
+            current = H5Z_get_token(current);
+
+	    if (current->tok_type != H5Z_XFORM_RPAREN) {
+		H5Z_xform_destroy_parse_tree(factor);
+		HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error in data transform expression")
+	    }
+	    break;
+
+	case H5Z_XFORM_RPAREN:
+	    /* We shouldn't see a ) right now */
+	    H5Z_xform_destroy_parse_tree(factor);
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error: unexpected ')' ")
+
+	case H5Z_XFORM_PLUS:
+            /* unary + */
+            new_node = H5Z_parse_factor(current, dat_val_pointers);
+
+            if (new_node) {
+                if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
+                        new_node->type != H5Z_XFORM_SYMBOL) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    H5Z_xform_destroy_parse_tree(factor);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                factor = new_node;
+                new_node = H5Z_new_node(H5Z_XFORM_PLUS);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(factor);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                new_node->rchild = factor;
+                factor = new_node;
+            } else {
+                H5Z_xform_destroy_parse_tree(factor);
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+            }
+            break;
+
+	case H5Z_XFORM_MINUS:
+            /* unary - */
+            new_node = H5Z_parse_factor(current, dat_val_pointers);
+
+            if (new_node) {
+                if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
+                        new_node->type != H5Z_XFORM_SYMBOL) {
+                    H5Z_xform_destroy_parse_tree(new_node);
+                    H5Z_xform_destroy_parse_tree(factor);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                factor = new_node;
+                new_node = H5Z_new_node(H5Z_XFORM_MINUS);
+
+                if (!new_node) {
+                    H5Z_xform_destroy_parse_tree(factor);
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                }
+
+                new_node->rchild = factor;
+                factor = new_node;
+            } else {
+                H5Z_xform_destroy_parse_tree(factor);
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+            }
+            break;
+
+	case H5Z_XFORM_END:
+            break;
+
+	default:
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Invalid token while parsing data transform expression")
+
+    }
+
+    /* Set return value */
+    ret_value=factor;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_new_node
+ * Purpose:     Create and initilize a new H5Z_node structure.
+ * Return:      Success:    Valid H5Z_node ptr
+ *              NULLure:    NULL
+ * Programmer:  Bill Wendling
+ *              26. August 2003
+ * Modifications:
+ *              Leon Arber: Added FUNC_ENTER / FUNC_LEAVE pairs
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5Z_node *
+H5Z_new_node(H5Z_token_type type)
+{
+    H5Z_node *ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(NULL == (ret_value = (H5Z_node *)H5MM_calloc(sizeof(H5Z_node))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Ran out of memory trying to allocate space for nodes in the parse tree")
+
+    ret_value->type = type;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_xform_eval
+ * Purpose: 	If the transform is trivial, this function applies it.
+ * 		Otherwise, it calls H5Z_xform_eval_full to do the full
+ * 		transform.
+ * Return:      SUCCEED if transform applied succesfully, FAIL otherwise
+ * Programmer:  Leon Arber
+ * 		5/1/04
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void* array, size_t array_size, const H5T_t *buf_type)
+{
+    H5Z_node *tree;
+    hid_t array_type;
+    H5Z_result res;
+    size_t i;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(data_xform_prop);
+
+    tree = data_xform_prop->parse_root;
+
+    /* Get the datatype ID for the buffer's type */
+    if((array_type = H5Z_xform_find_type(buf_type)) < 0)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Cannot perform data transform on this type.")
+
+    /* After this point, we're assured that the type of the array is handled by the eval code,
+     *  so we no longer have to check for valid types
+     */
+
+    /* If it's a trivial data transform, perform it */
+    if(tree->type == H5Z_XFORM_INTEGER || tree->type == H5Z_XFORM_FLOAT) {
+        if(array_type == H5T_NATIVE_CHAR)
+            H5Z_XFORM_DO_OP5(char, array_size)
+        else if(array_type ==  H5T_NATIVE_UCHAR)
+            H5Z_XFORM_DO_OP5(unsigned char, array_size)
+        else if(array_type == H5T_NATIVE_SCHAR)
+            H5Z_XFORM_DO_OP5(signed char, array_size)
+        else if(array_type == H5T_NATIVE_SHORT)
+            H5Z_XFORM_DO_OP5(short, array_size)
+        else if(array_type == H5T_NATIVE_USHORT)
+            H5Z_XFORM_DO_OP5(unsigned short, array_size)
+        else if(array_type == H5T_NATIVE_INT)
+            H5Z_XFORM_DO_OP5(int, array_size)
+        else if(array_type ==  H5T_NATIVE_UINT)
+            H5Z_XFORM_DO_OP5(unsigned int, array_size)
+        else if(array_type == H5T_NATIVE_LONG)
+            H5Z_XFORM_DO_OP5(long, array_size)
+        else if(array_type == H5T_NATIVE_ULONG)
+            H5Z_XFORM_DO_OP5(unsigned long, array_size)
+        else if(array_type == H5T_NATIVE_LLONG)
+            H5Z_XFORM_DO_OP5(long long, array_size)
+        else if(array_type == H5T_NATIVE_ULLONG)
+            H5Z_XFORM_DO_OP5(unsigned long long, array_size)
+        else if(array_type == H5T_NATIVE_FLOAT)
+            H5Z_XFORM_DO_OP5(float, array_size)
+	else if(array_type == H5T_NATIVE_DOUBLE)
+            H5Z_XFORM_DO_OP5(double, array_size)
+#if H5_SIZEOF_LONG_DOUBLE !=0
+	else if(array_type == H5T_NATIVE_LDOUBLE)
+            H5Z_XFORM_DO_OP5(long double, array_size)
+#endif
+
+    } /* end if */
+    /* Otherwise, do the full data transform */
+    else {
+	/* Optimization for linear transform: */
+	if(data_xform_prop->dat_val_pointers->num_ptrs == 1)
+	    data_xform_prop->dat_val_pointers->ptr_dat_val[0] = array;
+
+	/* If it's a quadratic transform, we have no choice but to store multiple copies of the data */
+	else {
+	    for(i = 0; i < data_xform_prop->dat_val_pointers->num_ptrs; i++) {
+		if(NULL == (data_xform_prop->dat_val_pointers->ptr_dat_val[i] = (void*)H5MM_malloc(array_size * H5T_get_size((H5T_t *)H5I_object(array_type)))))
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "Ran out of memory trying to allocate space for data in data transform")
+
+                HDmemcpy(data_xform_prop->dat_val_pointers->ptr_dat_val[i], array, array_size * H5T_get_size((H5T_t *)H5I_object(array_type)));
+	    } /* end for */
+	} /* end else */
+
+	if(H5Z_xform_eval_full(tree, array_size, array_type, &res) < 0)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while performing data transform")
+
+	if(data_xform_prop->dat_val_pointers->num_ptrs > 1)
+	    HDmemcpy(array, res.value.dat_val, array_size * H5T_get_size((H5T_t *)H5I_object(array_type)));
+
+        /* Free the temporary arrays we used */
+        if(data_xform_prop->dat_val_pointers->num_ptrs > 1)
+            for(i=0; i<data_xform_prop->dat_val_pointers->num_ptrs; i++)
+                HDfree(data_xform_prop->dat_val_pointers->ptr_dat_val[i]);
+    } /* end else */
+
+done:
+    if(ret_value < 0) {
+	/* If we ran out of memory above copying the array for temp storage (which we easily can for
+	 * polynomial transforms of high order) we free those arrays which we already allocated */
+	if(data_xform_prop->dat_val_pointers->num_ptrs > 1)
+	    for(i = 0; i < data_xform_prop->dat_val_pointers->num_ptrs; i++)
+		if(data_xform_prop->dat_val_pointers->ptr_dat_val[i])
+		    HDfree(data_xform_prop->dat_val_pointers->ptr_dat_val[i]);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_xform_eval() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_xform_eval_full
+ * Purpose: 	Does a full evaluation of the parse tree contained in tree
+ * 		and applies this transform to array.
+ * Return:      Nothing
+ * Programmer:  Leon Arber
+ * 		5/1/04
+ * Modifications:
+ *
+ *
+ * Notes:   In the case of a polynomial data transform (ie, the left and right subtree
+ * are both of type H5Z_XFORM_SYMBOL), the convention is that the left hand side
+ * will accumulate changes and, at the end, the new data will be copied from the lhs.
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5Z_xform_eval_full(H5Z_node *tree, const size_t array_size,  const hid_t array_type, H5Z_result *res)
+{
+    H5Z_result resl, resr;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(tree);
+
+    HDmemset(&resl, 0, sizeof(H5Z_result));
+    HDmemset(&resr, 0, sizeof(H5Z_result));
+
+    if (tree->type == H5Z_XFORM_INTEGER) {
+	res->type = H5Z_XFORM_INTEGER;
+	res->value.int_val = tree->value.int_val;
+    } /* end if */
+    else if (tree->type == H5Z_XFORM_FLOAT) {
+	res->type = H5Z_XFORM_FLOAT;
+	res->value.float_val = tree->value.float_val;
+    } /* end if */
+    else if (tree->type == H5Z_XFORM_SYMBOL) {
+	res->type = H5Z_XFORM_SYMBOL;
+
+	/*since dat_val stores the address of the array which is really stored in the dat_val_pointers,
+	 * here we make dat_val store a pointer to the array itself instead of the address of it so that the
+	 * rest of the code below works normally. */
+	res->value.dat_val = *((void**)(tree->value.dat_val));
+    } /* end if */
+    else {
+	if(tree->lchild && H5Z_xform_eval_full(tree->lchild, array_size, array_type, &resl) < 0)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while performing data transform")
+	if(H5Z_xform_eval_full(tree->rchild, array_size, array_type, &resr) < 0)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while performing data transform")
+
+	res->type = H5Z_XFORM_SYMBOL;
+
+	/* For each type of operation:
+	 * 1.  See if "x" is on left hand side, right hand side, or if both sides are "x"
+	 * 2.  Figure out what type of data we're going to be manipulating
+	 * 3.  Do the operation on the data. */
+
+
+	switch (tree->type) {
+	    case H5Z_XFORM_PLUS:
+	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, +, array_size)
+		break;
+
+	    case H5Z_XFORM_MINUS:
+	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, -, array_size)
+		break;
+
+	    case H5Z_XFORM_MULT:
+		H5Z_XFORM_TYPE_OP(resl, resr, array_type, *, array_size)
+		break;
+
+	    case H5Z_XFORM_DIVIDE:
+	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, /, array_size)
+		break;
+
+	    default:
+		HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid expression tree")
+	} /* end switch */
+
+	/* The result stores a pointer to the new data */
+	/* So, if the left hand side got its data modified, the result stores a pointers
+	 * to the left hand side's data, ditto for rhs */
+	if(resl.type ==  H5Z_XFORM_SYMBOL)
+	    res->value.dat_val = resl.value.dat_val;
+	else if(resr.type == H5Z_XFORM_SYMBOL)
+	    res->value.dat_val = resr.value.dat_val;
+	else
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error during transform evaluation")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_xform_eval_full() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_find_type
+ * Return:      Native type of datatype that is passed in
+ * Programmer:  Leon Arber, 4/20/04
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5Z_xform_find_type(const H5T_t* type)
+{
+    H5T_t *tmp;                         /* Temporary datatype */
+    hid_t ret_value = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(type);
+
+    /* Check for SHORT type */
+    if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_SHORT)) 
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_SHORT)
+    /* Check for INT type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_INT)) 
+            && 0 == H5T_cmp(type, tmp, FALSE))
+        HGOTO_DONE(H5T_NATIVE_INT)
+    /* Check for LONG type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_LONG)) 
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_LONG)
+    /* Check for LONGLONG type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_LLONG))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_LLONG)
+    /* Check for UCHAR type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_UCHAR))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_UCHAR)
+    /* Check for CHAR type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_CHAR))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_CHAR)
+    /* Check for SCHAR type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_SCHAR))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_SCHAR)
+    /* Check for USHORT type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_USHORT))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_USHORT)
+    /* Check for UINT type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_UINT))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_UINT)
+    /* Check for ULONG type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_ULONG))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_ULONG)
+    /* Check for ULONGLONG type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_ULLONG))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_ULLONG)
+    /* Check for FLOAT type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_FLOAT)
+    /* Check for DOUBLE type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_DOUBLE))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_DOUBLE)
+#if H5_SIZEOF_LONG_DOUBLE !=0
+    /* Check for LONGDOUBLE type */
+    else if((tmp = (H5T_t *)H5I_object(H5T_NATIVE_LDOUBLE))
+            && 0 == H5T_cmp(type, tmp, FALSE))
+	HGOTO_DONE(H5T_NATIVE_LDOUBLE)
+#endif
+    else
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "could not find matching type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5Z_xform_find_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_xform_copy_tree
+ * Purpose:     Makes a copy of the parse tree passed in.
+ * Return:      A pointer to a root for a new parse tree which is a copy
+ *              of the one passed in.
+ * Programmer:  Leon Arber
+ *              April 1, 2004.
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5Z_xform_copy_tree(H5Z_node* tree, H5Z_datval_ptrs* dat_val_pointers, H5Z_datval_ptrs* new_dat_val_pointers)
+{
+    H5Z_node* ret_value=NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(tree);
+
+    if(tree->type == H5Z_XFORM_INTEGER)
+    {
+        if ((ret_value = (H5Z_node*) H5MM_malloc(sizeof(H5Z_node))) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Ran out of memory trying to copy parse tree")
+        else
+        {
+	    ret_value -> type = H5Z_XFORM_INTEGER;
+	    ret_value ->value.int_val = tree->value.int_val;
+	    ret_value -> lchild = NULL;
+	    ret_value -> rchild = NULL;
+	}
+    }
+    else if (tree->type == H5Z_XFORM_FLOAT)
+    {
+        if ((ret_value = (H5Z_node*) H5MM_malloc(sizeof(H5Z_node))) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Ran out of memory trying to copy parse tree")
+        else
+	{
+	    ret_value -> type = H5Z_XFORM_FLOAT;
+	    ret_value ->value.float_val = tree->value.float_val;
+	    ret_value -> lchild = NULL;
+	    ret_value -> rchild = NULL;
+	}
+    }
+    else if(tree->type == H5Z_XFORM_SYMBOL)
+    {
+        if ((ret_value = (H5Z_node*) H5MM_malloc(sizeof(H5Z_node))) == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Ran out of memory trying to copy parse tree")
+	else
+	{
+	    ret_value -> type = H5Z_XFORM_SYMBOL;
+
+	    ret_value -> value.dat_val = &(new_dat_val_pointers->ptr_dat_val[new_dat_val_pointers->num_ptrs]);
+	    new_dat_val_pointers->num_ptrs++;
+	    ret_value -> lchild = NULL;
+	    ret_value -> rchild = NULL;
+	}
+    }
+    else if(tree->type == H5Z_XFORM_MULT)
+        H5Z_XFORM_DO_OP4(H5Z_XFORM_MULT)
+    else if(tree->type == H5Z_XFORM_PLUS)
+        H5Z_XFORM_DO_OP4(H5Z_XFORM_PLUS)
+    else if(tree->type == H5Z_XFORM_MINUS)
+        H5Z_XFORM_DO_OP4(H5Z_XFORM_MINUS)
+    else if(tree->type == H5Z_XFORM_DIVIDE)
+        H5Z_XFORM_DO_OP4(H5Z_XFORM_DIVIDE)
+
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error in parse tree while trying to copy")
+
+
+
+            done:
+            FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_op_is_numbs
+ * Purpose:     Internal function to facilitate the condition check in 
+ *              H5Z_xform_reduce_tree to reduce the bulkiness of the code.
+ * Return:      TRUE or FALSE
+ * Programmer:  Raymond Lu
+ *              15 March 2012
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5Z_op_is_numbs(H5Z_node* _tree)
+{
+    hbool_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(_tree);
+
+    if(((_tree->lchild->type == H5Z_XFORM_INTEGER) || (_tree->lchild->type == H5Z_XFORM_FLOAT)) && ((_tree->rchild->type == H5Z_XFORM_INTEGER) || (_tree->rchild->type == H5Z_XFORM_FLOAT)))
+      ret_value = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_op_is_numbs2
+ * Purpose:     Internal function to facilitate the condition check in 
+ *              H5Z_xform_reduce_tree to reduce the bulkiness of the code.
+ *              The difference from H5Z_op_is_numbs is that the left child
+ *              can be empty, like -x or +x.
+ * Return:      TRUE or FALSE
+ * Programmer:  Raymond Lu
+ *              15 March 2012
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5Z_op_is_numbs2(H5Z_node* _tree)
+{
+    hbool_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(_tree);
+
+    if((!_tree->lchild && ((_tree->rchild->type == H5Z_XFORM_INTEGER) || (_tree->rchild->type == H5Z_XFORM_FLOAT))) ||
+       ((_tree->lchild && ((_tree->lchild->type == H5Z_XFORM_INTEGER) || (_tree->lchild->type == H5Z_XFORM_FLOAT))) && (_tree->rchild && ((_tree->rchild->type == H5Z_XFORM_INTEGER) || (_tree->rchild->type == H5Z_XFORM_FLOAT)))))
+      ret_value = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_xform_reduce_tree
+ * Purpose:     Simplifies parse tree passed in by performing any obvious
+ *              and trivial arithemtic calculations.
+ *
+ * Return:      None.
+ * Programmer:  Leon Arber
+ *              April 1, 2004.
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5Z_xform_reduce_tree(H5Z_node* tree)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(tree) {
+        if((tree->type == H5Z_XFORM_DIVIDE) || (tree->type == H5Z_XFORM_MULT))
+        {
+            if(H5Z_op_is_numbs(tree))
+                H5Z_do_op(tree);
+            else
+            {
+                H5Z_xform_reduce_tree(tree->lchild);
+                if(H5Z_op_is_numbs(tree))
+                    H5Z_do_op(tree);
+                else {
+                    H5Z_xform_reduce_tree(tree->rchild);
+                    if(H5Z_op_is_numbs(tree))
+                        H5Z_do_op(tree);
+                }
+            }
+        } else if((tree->type == H5Z_XFORM_PLUS) || (tree->type == H5Z_XFORM_MINUS)) {
+            if(H5Z_op_is_numbs2(tree))
+                H5Z_do_op(tree);
+            else
+            {
+                H5Z_xform_reduce_tree(tree->lchild);
+                if(H5Z_op_is_numbs2(tree))
+                    H5Z_do_op(tree);
+                else {
+                    H5Z_xform_reduce_tree(tree->rchild);
+                    if(H5Z_op_is_numbs2(tree))
+                        H5Z_do_op(tree);
+                }
+            }
+        }
+
+    }
+
+    FUNC_LEAVE_NOAPI_VOID;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Z_do_op
+ * Purpose:     If the root of the tree passed in points to a simple
+ *              arithmetic operation and the left and right subtrees are both
+ *              integer or floating point values, this function does that
+ *              operation, free the left and rigt subtrees, and replaces
+ *              the root with the result of the operation.
+ * Return:      None.
+ * Programmer:  Leon Arber
+ *              April 1, 2004.
+ * Modifications:
+ *              Raymond Lu
+ *              15 March 2012
+ *              I added a new macro H5Z_XFORM_DO_OP6 to handle the special
+ *              operations like -x or +x when the left operand is empty.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5Z_do_op(H5Z_node* tree)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(tree->type == H5Z_XFORM_DIVIDE)
+	H5Z_XFORM_DO_OP3(/)
+    else if(tree->type == H5Z_XFORM_MULT)
+	H5Z_XFORM_DO_OP3(*)
+    else if(tree->type == H5Z_XFORM_PLUS)
+	H5Z_XFORM_DO_OP6(+)
+    else if(tree->type == H5Z_XFORM_MINUS)
+	H5Z_XFORM_DO_OP6(-)
+
+    FUNC_LEAVE_NOAPI_VOID;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5D_xform_create
+ *
+ * Purpose: Create a new data transform object from a string.
+ *
+ * Return:
+ *      Success: SUCCEED
+ *      Failure: FAIL
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: May 4, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5Z_data_xform_t *
+H5Z_xform_create(const char *expr)
+{
+    H5Z_data_xform_t *data_xform_prop=NULL;
+    H5Z_data_xform_t *ret_value;
+    unsigned int i;
+    unsigned int count = 0;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    HDassert(expr);
+
+    /* Allocate space for the data transform information */
+    if(NULL == (data_xform_prop = (H5Z_data_xform_t *)H5MM_calloc(sizeof(H5Z_data_xform_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate memory for data transform info")
+
+    if(NULL == (data_xform_prop->dat_val_pointers = (H5Z_datval_ptrs *)H5MM_malloc(sizeof(H5Z_datval_ptrs))))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate memory for data transform array storage")
+
+    /* copy the user's string into the property */
+    if(NULL == (data_xform_prop->xform_exp = (char *)H5MM_xstrdup(expr)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate memory for data transform expression")
+
+    /* Find the number of times "x" is used in this equation, and allocate room for storing that many points */
+    for(i = 0; i < HDstrlen(expr); i++)
+	if(HDisalpha(expr[i]))
+	    count++;
+
+    /* When there are no "x"'s in the equation (ie, simple transform case),
+     * we don't need to allocate any space since no array will have to be
+     * stored */
+    if(count > 0)
+	if(NULL == (data_xform_prop->dat_val_pointers->ptr_dat_val = (void **)H5MM_calloc(count * sizeof(void *))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate memory for pointers in transform array")
+
+    /* Initialize the num_ptrs field, which will be used to keep track of the number of copies
+     * of the data we have for polynomial transforms */
+    data_xform_prop->dat_val_pointers->num_ptrs = 0;
+
+     /* we generate the parse tree right here and store a poitner to its root in the property. */
+    if((data_xform_prop->parse_root = (H5Z_node *)H5Z_xform_parse(expr, data_xform_prop->dat_val_pointers))==NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to generate parse tree from expression")
+
+    /* Sanity check
+     * count should be the same num_ptrs */
+    if(count != data_xform_prop->dat_val_pointers->num_ptrs)
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "error copying the parse tree, did not find correct number of \"variables\"")
+
+    /* Assign return value */
+    ret_value=data_xform_prop;
+
+
+done:
+    /* Clean up on error */
+    if(ret_value==NULL) {
+        if(data_xform_prop) {
+            if(data_xform_prop->parse_root)
+                H5Z_xform_destroy_parse_tree(data_xform_prop->parse_root);
+            if(data_xform_prop->xform_exp)
+                H5MM_xfree(data_xform_prop->xform_exp);
+	    if(count > 0 && data_xform_prop->dat_val_pointers->ptr_dat_val)
+		H5MM_xfree(data_xform_prop->dat_val_pointers->ptr_dat_val);
+	    if(data_xform_prop->dat_val_pointers)
+		H5MM_xfree(data_xform_prop->dat_val_pointers);
+            H5MM_xfree(data_xform_prop);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5Z_xform_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_xform_destroy
+ *
+ * Purpose: Destroy a data transform object.
+ *
+ * Return:
+ *      Success: SUCCEED
+ *      Failure: FAIL
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: May 4, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_xform_destroy(H5Z_data_xform_t *data_xform_prop)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(data_xform_prop) {
+	/* Destroy the parse tree */
+        H5Z_xform_destroy_parse_tree(data_xform_prop->parse_root);
+
+        /* Free the expression */
+        H5MM_xfree(data_xform_prop->xform_exp);
+
+	/* Free the pointers to the temp. arrays, if there are any */
+	if(data_xform_prop->dat_val_pointers->num_ptrs > 0)
+	    H5MM_xfree(data_xform_prop->dat_val_pointers->ptr_dat_val);
+
+	/* Free the data storage struct */
+	H5MM_xfree(data_xform_prop->dat_val_pointers);
+
+        /* Free the node */
+        H5MM_xfree(data_xform_prop);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5Z_xform_destroy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_xform_copy
+ *
+ * Purpose: Clone a data transform object.
+ *
+ * Return:
+ *      Success: SUCCEED
+ *      Failure: FAIL
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: May 4, 2004
+ *
+ * Comments: This is an "in-place" copy, since this routine gets called
+ *      after the top-level copy has been performed and this routine finishes
+ *      the "deep" part of the copy.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Z_xform_copy(H5Z_data_xform_t **data_xform_prop)
+{
+    unsigned int i;
+    unsigned int count = 0;
+    H5Z_data_xform_t *new_data_xform_prop=NULL;
+    herr_t ret_value=SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(*data_xform_prop) {
+        /* Allocate new node */
+        if(NULL == (new_data_xform_prop = (H5Z_data_xform_t *)H5MM_calloc(sizeof(H5Z_data_xform_t))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for data transform info")
+
+        /* Copy string */
+        if(NULL == (new_data_xform_prop->xform_exp = (char *)H5MM_xstrdup((*data_xform_prop)->xform_exp)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for data transform expression")
+
+	if(NULL == (new_data_xform_prop->dat_val_pointers = (H5Z_datval_ptrs *)H5MM_malloc(sizeof(H5Z_datval_ptrs))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for data transform array storage")
+
+	/* Find the number of times "x" is used in this equation, and allocate room for storing that many points */
+	for(i = 0; i < HDstrlen(new_data_xform_prop->xform_exp); i++)
+	    if(HDisalpha(new_data_xform_prop->xform_exp[i]))
+		count++;
+
+	if(count > 0)
+	    if(NULL == (new_data_xform_prop->dat_val_pointers->ptr_dat_val = (void **)H5MM_calloc(count * sizeof(void *))))
+		HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for pointers in transform array")
+
+	/* Zero out num_pointers prior to H5Z_xform_cop_tree call; that call will increment it to the right amount */
+	new_data_xform_prop->dat_val_pointers->num_ptrs = 0;
+
+        /* Copy parse tree */
+        if((new_data_xform_prop->parse_root = (H5Z_node*)H5Z_xform_copy_tree((*data_xform_prop)->parse_root, (*data_xform_prop)->dat_val_pointers, new_data_xform_prop->dat_val_pointers)) == NULL)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "error copying the parse tree")
+
+	/* Sanity check
+	 * count should be the same num_ptrs */
+	if(count != new_data_xform_prop->dat_val_pointers->num_ptrs)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "error copying the parse tree, did not find correct number of \"variables\"")
+
+        /* Copy new information on top of old information */
+        *data_xform_prop=new_data_xform_prop;
+    } /* end if */
+
+done:
+    /* Clean up on error */
+    if(ret_value<0) {
+        if(new_data_xform_prop) {
+            if(new_data_xform_prop->parse_root)
+                H5Z_xform_destroy_parse_tree(new_data_xform_prop->parse_root);
+            if(new_data_xform_prop->xform_exp)
+                H5MM_xfree(new_data_xform_prop->xform_exp);
+            H5MM_xfree(new_data_xform_prop);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5Z_xform_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_xform_noop
+ *
+ * Purpose: Checks if a data transform will be performed
+ *
+ * Return:  TRUE for no data transform, FALSE for a data transform
+ *
+ * Programmer: Quincey Koziol, koziol at ncsa.uiuc.edu
+ *
+ * Date: May 4, 2004
+ *
+ * Comments: Can't fail
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5Z_xform_noop(const H5Z_data_xform_t *data_xform_prop)
+{
+    hbool_t ret_value;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    ret_value=(data_xform_prop ? FALSE : TRUE);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5Z_xform_noop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5Z_xform_extract_xform_str
+ *
+ * Purpose: Extracts the pointer to the data transform strings from the
+ * 		data transform property.`
+ * Return:
+ *          Pointer to a copy of the string in the data_xform property.
+ *
+ * Programmer: Leon Arber, larber at ncsa.uiuc.edu
+ *
+ * Date: Sept. 4, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char *
+H5Z_xform_extract_xform_str(const H5Z_data_xform_t *data_xform_prop)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* There should be no way that this can be NULL since the function
+     * that calls this one checks to make sure it isn't before
+     * pasing them */
+    HDassert(data_xform_prop);
+
+    FUNC_LEAVE_NOAPI(data_xform_prop->xform_exp)
+} /* H5Z_xform_extract_xform_str() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5api_adpt.h b/gatb-core/thirdparty/hdf5/src/H5api_adpt.h
new file mode 100644
index 0000000..ab7287c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5api_adpt.h
@@ -0,0 +1,278 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * H5api_adpt.h
+ * Used for the HDF5 dll project
+ * Created by Patrick Lu on 1/12/99
+ */
+#ifndef H5API_ADPT_H
+#define H5API_ADPT_H
+
+/*
+ * Does the compiler support the __attribute__(()) syntax?  It's no
+ * big deal if we don't.
+ *
+ * Note that Solaris Studio supports attribute, but does not support the
+ * attributes we use.
+ */
+#ifdef __cplusplus
+#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
+#   define H5_ATTR_UNUSED    /*void*/
+#   define H5_ATTR_NORETURN  /*void*/
+#else /* __cplusplus */
+#if defined(H5_HAVE_ATTRIBUTE) && !defined(__SUNPRO_C)
+#   define H5_ATTR_FORMAT(X,Y,Z)  __attribute__((format(X, Y, Z)))
+#   define H5_ATTR_UNUSED    __attribute__((unused))
+#   define H5_ATTR_NORETURN  __attribute__((noreturn))
+#else
+#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
+#   define H5_ATTR_UNUSED    /*void*/
+#   define H5_ATTR_NORETURN  /*void*/
+#endif
+#endif /* __cplusplus */
+
+/* This will only be defined if HDF5 was built with CMake */
+#ifdef H5_BUILT_AS_DYNAMIC_LIB
+
+#if defined(hdf5_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_DLL __declspec(dllexport)
+    #define H5_DLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_DLL __attribute__ ((visibility("default")))
+    #define H5_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_DLL __declspec(dllimport)
+    #define H5_DLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_DLL __attribute__ ((visibility("default")))
+    #define H5_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_DLL
+  #define H5_DLL
+  #define H5_DLLVAR extern
+#endif /* _HDF5DLL_ */
+
+#if defined(hdf5_test_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5TEST_DLL __declspec(dllexport)
+    #define H5TEST_DLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5TEST_DLL __attribute__ ((visibility("default")))
+    #define H5TEST_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5TEST_DLL __declspec(dllimport)
+    #define H5TEST_DLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5TEST_DLL __attribute__ ((visibility("default")))
+    #define H5TEST_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5TEST_DLL
+  #define H5TEST_DLL
+  #define H5TEST_DLLVAR extern
+#endif /* H5TEST_DLL */
+
+#if defined(hdf5_tools_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5TOOLS_DLL __declspec(dllexport)
+    #define H5TOOLS_DLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5TOOLS_DLL __attribute__ ((visibility("default")))
+    #define H5TOOLS_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5TOOLS_DLL __declspec(dllimport)
+    #define H5TOOLS_DLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5TOOLS_DLL __attribute__ ((visibility("default")))
+    #define H5TOOLS_DLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5TOOLS_DLL
+  #define H5TOOLS_DLL
+  #define H5TOOLS_DLLVAR extern
+#endif /* H5TOOLS_DLL */
+
+#if defined(hdf5_cpp_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_DLLCPP __declspec(dllexport)
+    #define H5_DLLCPPVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_DLLCPP __attribute__ ((visibility("default")))
+    #define H5_DLLCPPVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_DLLCPP __declspec(dllimport)
+    #define H5_DLLCPPVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_DLLCPP __attribute__ ((visibility("default")))
+    #define H5_DLLCPPVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_DLLCPP
+  #define H5_DLLCPP
+  #define H5_DLLCPPVAR extern
+#endif /* H5_DLLCPP */
+
+#if defined(hdf5_hl_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_HLDLL __declspec(dllexport)
+    #define H5_HLDLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_HLDLL __attribute__ ((visibility("default")))
+    #define H5_HLDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_HLDLL __declspec(dllimport)
+    #define H5_HLDLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_HLDLL __attribute__ ((visibility("default")))
+    #define H5_HLDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_HLDLL
+  #define H5_HLDLL
+  #define H5_HLDLLVAR extern
+#endif /* H5_HLDLL */
+
+#if defined(hdf5_hl_cpp_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_HLCPPDLL __declspec(dllexport)
+    #define H5_HLCPPDLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_HLCPPDLL __attribute__ ((visibility("default")))
+    #define H5_HLCPPDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_HLCPPDLL __declspec(dllimport)
+    #define H5_HLCPPDLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_HLCPPDLL __attribute__ ((visibility("default")))
+    #define H5_HLCPPDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_HLCPPDLL
+  #define H5_HLCPPDLL
+  #define H5_HLCPPDLLVAR extern
+#endif /* H5_HLCPPDLL */
+
+#if defined(hdf5_f90cstub_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_FCDLL __declspec(dllexport)
+    #define H5_FCDLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_FCDLL __attribute__ ((visibility("default")))
+    #define H5_FCDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_FCDLL __declspec(dllimport)
+    #define H5_FCDLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_FCDLL __attribute__ ((visibility("default")))
+    #define H5_FCDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_FCDLL
+  #define H5_FCDLL
+  #define H5_FCDLLVAR extern
+#endif /* H5_FCDLL */
+
+#if defined(hdf5_test_f90cstub_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_FCTESTDLL __declspec(dllexport)
+    #define H5_FCTESTDLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_FCTESTDLL __attribute__ ((visibility("default")))
+    #define H5_FCTESTDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define H5_FCTESTDLL __declspec(dllimport)
+    #define H5_FCTESTDLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define H5_FCTESTDLL __attribute__ ((visibility("default")))
+    #define H5_FCTESTDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef H5_FCTESTDLL
+  #define H5_FCTESTDLL
+  #define H5_FCTESTDLLVAR extern
+#endif /* H5_FCTESTDLL */
+
+#if defined(hdf5_hl_f90cstub_shared_EXPORTS)
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define HDF5_HL_F90CSTUBDLL __declspec(dllexport)
+    #define HDF5_HL_F90CSTUBDLLVAR extern __declspec(dllexport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define HDF5_HL_F90CSTUBDLL __attribute__ ((visibility("default")))
+    #define HDF5_HL_F90CSTUBDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#else
+  #if defined (_MSC_VER)  /* MSVC Compiler Case */
+    #define HDF5_HL_F90CSTUBDLL __declspec(dllimport)
+    #define HDF5_HL_F90CSTUBDLLVAR __declspec(dllimport)
+  #elif (__GNUC__ >= 4)  /* GCC 4.x has support for visibility options */
+    #define HDF5_HL_F90CSTUBDLL __attribute__ ((visibility("default")))
+    #define HDF5_HL_F90CSTUBDLLVAR extern __attribute__ ((visibility("default")))
+  #endif
+#endif
+
+#ifndef HDF5_HL_F90CSTUBDLL
+  #define HDF5_HL_F90CSTUBDLL
+  #define HDF5_HL_F90CSTUBDLLVAR extern
+#endif /* HDF5_HL_F90CSTUBDLL */
+
+#else
+  #define H5_DLL
+  #define H5_DLLVAR extern
+  #define H5TEST_DLL
+  #define H5TEST_DLLVAR extern
+  #define H5TOOLS_DLL
+  #define H5TOOLS_DLLVAR extern
+  #define H5_DLLCPP
+  #define H5_DLLCPPVAR extern
+  #define H5_HLDLL
+  #define H5_HLDLLVAR extern
+  #define H5_HLCPPDLL
+  #define H5_HLCPPDLLVAR extern
+  #define H5_FCDLL
+  #define H5_FCDLLVAR extern
+  #define H5_FCTESTDLL
+  #define H5_FCTESTDLLVAR extern
+  #define HDF5_HL_F90CSTUBDLL
+  #define HDF5_HL_F90CSTUBDLLVAR extern
+#endif /* H5_BUILT_AS_DYNAMIC_LIB */
+
+#endif /* H5API_ADPT_H */
diff --git a/gatb-core/thirdparty/hdf5/src/H5checksum.c b/gatb-core/thirdparty/hdf5/src/H5checksum.c
new file mode 100644
index 0000000..48e4ce5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5checksum.c
@@ -0,0 +1,496 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5checksum.c
+ *			Aug 21 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal code for computing fletcher32 checksums
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Polynomial quotient */
+/* (same as the IEEE 802.3 (Ethernet) quotient) */
+#define H5_CRC_QUOTIENT 0x04C11DB7
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Table of CRCs of all 8-bit messages. */
+static uint32_t H5_crc_table[256];
+
+/* Flag: has the table been computed? */
+static hbool_t H5_crc_table_computed = FALSE;
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_checksum_fletcher32
+ *
+ * Purpose:	This routine provides a generic, fast checksum algorithm for
+ *              use in the library.
+ *
+ * Note:        See the Wikipedia page for Fletcher's checksum:
+ *                  http://en.wikipedia.org/wiki/Fletcher%27s_checksum
+ *              for more details, etc.
+ *
+ * Note #2:     Per the information in RFC 3309:
+ *                      (http://tools.ietf.org/html/rfc3309)
+ *              Fletcher's checksum is not reliable for small buffers.
+ *
+ * Note #3:     The algorithm below differs from that given in the Wikipedia
+ *              page by copying the data into 'sum1' in a more portable way
+ *              and also by initializing 'sum1' and 'sum2' to 0 instead of
+ *              0xffff (for backward compatibility reasons with earlier
+ *              HDF5 fletcher32 I/O filter routine, mostly).
+ *
+ * Return:	32-bit fletcher checksum of input buffer (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Monday, August 21, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+uint32_t
+H5_checksum_fletcher32(const void *_data, size_t _len)
+{
+    const uint8_t *data = (const uint8_t *)_data;  /* Pointer to the data to be summed */
+    size_t len = _len / 2;      /* Length in 16-bit words */
+    uint32_t sum1 = 0, sum2 = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(_data);
+    HDassert(_len > 0);
+
+    /* Compute checksum for pairs of bytes */
+    /* (the magic "360" value is is the largest number of sums that can be
+     *  performed without numeric overflow)
+     */
+    while (len) {
+        size_t tlen = len > 360 ? 360 : len;
+        len -= tlen;
+        do {
+            sum1 += (uint32_t)(((uint16_t)data[0]) << 8) | ((uint16_t)data[1]);
+            data += 2;
+            sum2 += sum1;
+        } while (--tlen);
+        sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+        sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+    }
+
+    /* Check for odd # of bytes */
+    if(_len % 2) {
+        sum1 += (uint32_t)(((uint16_t)*data) << 8);
+        sum2 += sum1;
+        sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+        sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+    } /* end if */
+
+    /* Second reduction step to reduce sums to 16 bits */
+    sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+    sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+    FUNC_LEAVE_NOAPI((sum2 << 16) | sum1)
+} /* end H5_checksum_fletcher32() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_checksum_crc_make_table
+ *
+ * Purpose:	Compute the CRC table for the CRC checksum algorithm
+ *
+ * Return:	none
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5_checksum_crc_make_table(void)
+{
+    uint32_t c;         /* Checksum for each byte value */
+    unsigned n, k;      /* Local index variables */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Compute the checksum for each possible byte value */
+    for(n = 0; n < 256; n++) {
+        c = (uint32_t) n;
+        for(k = 0; k < 8; k++)
+            if(c & 1)
+                c = H5_CRC_QUOTIENT ^ (c >> 1);
+            else
+                c = c >> 1;
+        H5_crc_table[n] = c;
+    }
+    H5_crc_table_computed = TRUE;
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5_checksum_crc_make_table() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_checksum_crc_make_table
+ *
+ * Purpose:	Update a running CRC with the bytes buf[0..len-1]--the CRC
+ *              should be initialized to all 1's, and the transmitted value
+ *              is the 1's complement of the final running CRC (see the
+ *              H5_checksum_crc() routine below)).
+ *
+ * Return:	32-bit CRC checksum of input buffer (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static uint32_t
+H5_checksum_crc_update(uint32_t crc, const uint8_t *buf, size_t len)
+{
+    size_t n;           /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Initialize the CRC table if necessary */
+    if(!H5_crc_table_computed)
+        H5_checksum_crc_make_table();
+
+    /* Update the CRC with the results from this buffer */
+    for(n = 0; n < len; n++)
+        crc = H5_crc_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8);
+
+    FUNC_LEAVE_NOAPI(crc)
+} /* end H5_checksum_crc_update() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_checksum_crc
+ *
+ * Purpose:	This routine provides a generic checksum algorithm for
+ *              use in the library.
+ *
+ * Note:        This algorithm was based on the implementation described
+ *              in the document describing the PNG image format:
+ *                  http://www.w3.org/TR/PNG/#D-CRCAppendix
+ *
+ * Return:	32-bit CRC checksum of input buffer (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, September  5, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+uint32_t
+H5_checksum_crc(const void *_data, size_t len)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(_data);
+    HDassert(len > 0);
+
+    FUNC_LEAVE_NOAPI(H5_checksum_crc_update((uint32_t)0xffffffffL, (const uint8_t *)_data, len) ^ 0xffffffffL)
+} /* end H5_checksum_crc() */
+
+/*
+-------------------------------------------------------------------------------
+H5_lookup3_mix -- mix 3 32-bit values reversibly.
+
+This is reversible, so any information in (a,b,c) before mix() is
+still in (a,b,c) after mix().
+
+If four pairs of (a,b,c) inputs are run through mix(), or through
+mix() in reverse, there are at least 32 bits of the output that
+are sometimes the same for one pair and different for another pair.
+This was tested for:
+* pairs that differed by one bit, by two bits, in any combination
+  of top bits of (a,b,c), or in any combination of bottom bits of
+  (a,b,c).
+* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
+  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
+  is commonly produced by subtraction) look like a single 1-bit
+  difference.
+* the base values were pseudorandom, all zero but one bit set, or
+  all zero plus a counter that starts at zero.
+
+Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
+satisfy this are
+    4  6  8 16 19  4
+    9 15  3 18 27 15
+   14  9  3  7 17  3
+Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
+for "differ" defined as + with a one-bit base and a two-bit delta.  I
+used http://burtleburtle.net/bob/hash/avalanche.html to choose
+the operations, constants, and arrangements of the variables.
+
+This does not achieve avalanche.  There are input bits of (a,b,c)
+that fail to affect some output bits of (a,b,c), especially of a.  The
+most thoroughly mixed value is c, but it doesn't really even achieve
+avalanche in c.
+
+This allows some parallelism.  Read-after-writes are good at doubling
+the number of bits affected, so the goal of mixing pulls in the opposite
+direction as the goal of parallelism.  I did what I could.  Rotates
+seem to cost as much as shifts on every machine I could lay my hands
+on, and rotates are much kinder to the top and bottom bits, so I used
+rotates.
+-------------------------------------------------------------------------------
+*/
+#define H5_lookup3_rot(x,k) (((x)<<(k)) ^ ((x)>>(32-(k))))
+#define H5_lookup3_mix(a,b,c) \
+{ \
+  a -= c;  a ^= H5_lookup3_rot(c, 4);  c += b; \
+  b -= a;  b ^= H5_lookup3_rot(a, 6);  a += c; \
+  c -= b;  c ^= H5_lookup3_rot(b, 8);  b += a; \
+  a -= c;  a ^= H5_lookup3_rot(c,16);  c += b; \
+  b -= a;  b ^= H5_lookup3_rot(a,19);  a += c; \
+  c -= b;  c ^= H5_lookup3_rot(b, 4);  b += a; \
+}
+
+/*
+-------------------------------------------------------------------------------
+H5_lookup3_final -- final mixing of 3 32-bit values (a,b,c) into c
+
+Pairs of (a,b,c) values differing in only a few bits will usually
+produce values of c that look totally different.  This was tested for
+* pairs that differed by one bit, by two bits, in any combination
+  of top bits of (a,b,c), or in any combination of bottom bits of
+  (a,b,c).
+* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
+  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
+  is commonly produced by subtraction) look like a single 1-bit
+  difference.
+* the base values were pseudorandom, all zero but one bit set, or
+  all zero plus a counter that starts at zero.
+
+These constants passed:
+ 14 11 25 16 4 14 24
+ 12 14 25 16 4 14 24
+and these came close:
+  4  8 15 26 3 22 24
+ 10  8 15 26 3 22 24
+ 11  8 15 26 3 22 24
+-------------------------------------------------------------------------------
+*/
+#define H5_lookup3_final(a,b,c) \
+{ \
+  c ^= b; c -= H5_lookup3_rot(b,14); \
+  a ^= c; a -= H5_lookup3_rot(c,11); \
+  b ^= a; b -= H5_lookup3_rot(a,25); \
+  c ^= b; c -= H5_lookup3_rot(b,16); \
+  a ^= c; a -= H5_lookup3_rot(c,4);  \
+  b ^= a; b -= H5_lookup3_rot(a,14); \
+  c ^= b; c -= H5_lookup3_rot(b,24); \
+}
+
+/*
+-------------------------------------------------------------------------------
+H5_checksum_lookup3() -- hash a variable-length key into a 32-bit value
+  k       : the key (the unaligned variable-length array of bytes)
+  length  : the length of the key, counting by bytes
+  initval : can be any 4-byte value
+Returns a 32-bit value.  Every bit of the key affects every bit of
+the return value.  Two keys differing by one or two bits will have
+totally different hash values.
+
+The best hash table sizes are powers of 2.  There is no need to do
+mod a prime (mod is sooo slow!).  If you need less than 32 bits,
+use a bitmask.  For example, if you need only 10 bits, do
+  h = (h & hashmask(10));
+In which case, the hash table should have hashsize(10) elements.
+
+If you are hashing n strings (uint8_t **)k, do it like this:
+  for (i=0, h=0; i<n; ++i) h = H5_checksum_lookup( k[i], len[i], h);
+
+By Bob Jenkins, 2006.  bob_jenkins at burtleburtle.net.  You may use this
+code any way you wish, private, educational, or commercial.  It's free.
+
+Use for hash table lookup, or anything where one collision in 2^^32 is
+acceptable.  Do NOT use for cryptographic purposes.
+-------------------------------------------------------------------------------
+*/
+
+uint32_t
+H5_checksum_lookup3(const void *key, size_t length, uint32_t initval)
+{
+    const uint8_t *k = (const uint8_t *)key;
+    uint32_t a, b, c;           /* internal state */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(key);
+    HDassert(length > 0);
+
+    /* Set up the internal state */
+    a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
+
+    /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
+    while (length > 12)
+    {
+      a += k[0];
+      a += ((uint32_t)k[1])<<8;
+      a += ((uint32_t)k[2])<<16;
+      a += ((uint32_t)k[3])<<24;
+      b += k[4];
+      b += ((uint32_t)k[5])<<8;
+      b += ((uint32_t)k[6])<<16;
+      b += ((uint32_t)k[7])<<24;
+      c += k[8];
+      c += ((uint32_t)k[9])<<8;
+      c += ((uint32_t)k[10])<<16;
+      c += ((uint32_t)k[11])<<24;
+      H5_lookup3_mix(a, b, c);
+      length -= 12;
+      k += 12;
+    }
+
+    /*-------------------------------- last block: affect all 32 bits of (c) */
+    switch(length)                   /* all the case statements fall through */
+    {
+        case 12: c+=((uint32_t)k[11])<<24;
+        case 11: c+=((uint32_t)k[10])<<16;
+        case 10: c+=((uint32_t)k[9])<<8;
+        case 9 : c+=k[8];
+        case 8 : b+=((uint32_t)k[7])<<24;
+        case 7 : b+=((uint32_t)k[6])<<16;
+        case 6 : b+=((uint32_t)k[5])<<8;
+        case 5 : b+=k[4];
+        case 4 : a+=((uint32_t)k[3])<<24;
+        case 3 : a+=((uint32_t)k[2])<<16;
+        case 2 : a+=((uint32_t)k[1])<<8;
+        case 1 : a+=k[0];
+                 break;
+        case 0 : goto done;
+        default:
+            HDassert(0 && "This Should never be executed!");
+    }
+
+    H5_lookup3_final(a, b, c);
+
+done:
+    FUNC_LEAVE_NOAPI(c)
+} /* end H5_checksum_lookup3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_checksum_metadata
+ *
+ * Purpose:	Provide a more abstract routine for checksumming metadata
+ *              in a file, where the policy of which algorithm to choose
+ *              is centralized.
+ *
+ * Return:	checksum of input buffer (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, August 22, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+uint32_t
+H5_checksum_metadata(const void *data, size_t len, uint32_t initval)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(data);
+    HDassert(len > 0);
+
+    /* Choose the appropriate checksum routine */
+    /* (use Bob Jenkin's "lookup3" algorithm for all buffer sizes) */
+    FUNC_LEAVE_NOAPI(H5_checksum_lookup3(data, len, initval))
+} /* end H5_checksum_metadata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_hash_string
+ *
+ * Purpose:	Provide a simple & fast routine for hashing strings
+ *
+ * Note:        This algorithm is the 'djb2' algorithm described on this page:
+ *              http://www.cse.yorku.ca/~oz/hash.html
+ *
+ * Return:	hash of input string (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, December 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+uint32_t
+H5_hash_string(const char *str)
+{
+    uint32_t hash = 5381;
+    int c;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(str);
+
+    while((c = *str++))
+        hash = ((hash << 5) + hash) + (uint32_t)c; /* hash * 33 + c */
+
+    FUNC_LEAVE_NOAPI(hash)
+} /* end H5_hash_string() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5config.h.in b/gatb-core/thirdparty/hdf5/src/H5config.h.in
new file mode 100644
index 0000000..27b962a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5config.h.in
@@ -0,0 +1,556 @@
+/* src/H5config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define if the memory buffers being written to disk should be cleared before
+   writing. */
+#undef CLEAR_MEMORY
+
+/* Define if C++ compiler recognizes offsetof */
+#undef CXX_HAVE_OFFSETOF
+
+/* Define the default plugins path to compile */
+#undef DEFAULT_PLUGINDIR
+
+/* Define if `dev_t' is a scalar */
+#undef DEV_T_IS_SCALAR
+
+/* Define to dummy `main' function (if any) required to link to the Fortran
+   libraries. */
+#undef FC_DUMMY_MAIN
+
+/* Define if F77 and FC dummy `main' functions are identical. */
+#undef FC_DUMMY_MAIN_EQ_F77
+
+/* Define to a macro mangling the given C identifier (in lower and upper
+   case), which must not contain underscores, for linking with Fortran. */
+#undef FC_FUNC
+
+/* As FC_FUNC, but for C identifiers containing underscores. */
+#undef FC_FUNC_
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have the `asprintf' function. */
+#undef HAVE_ASPRINTF
+
+/* Define if the __attribute__(()) extension is present */
+#undef HAVE_ATTRIBUTE
+
+/* Define if the compiler understands C99 designated initialization of structs
+   and unions */
+#undef HAVE_C99_DESIGNATED_INITIALIZER
+
+/* Define if the compiler understands the __func__ keyword */
+#undef HAVE_C99_FUNC
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define if the function stack tracing code is to be compiled in */
+#undef HAVE_CODESTACK
+
+/* Define if Darwin or Mac OS X */
+#undef HAVE_DARWIN
+
+/* Define to 1 if you have the `difftime' function. */
+#undef HAVE_DIFFTIME
+
+/* Define if the direct I/O virtual file driver (VFD) should be compiled */
+#undef HAVE_DIRECT
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <dmalloc.h> header file. */
+#undef HAVE_DMALLOC_H
+
+/* Define if library information should be embedded in the executables */
+#undef HAVE_EMBEDDED_LIBINFO
+
+/* Define to 1 if you have the <features.h> header file. */
+#undef HAVE_FEATURES_H
+
+/* Define if support for deflate (zlib) filter is enabled */
+#undef HAVE_FILTER_DEFLATE
+
+/* Define if support for szip filter is enabled */
+#undef HAVE_FILTER_SZIP
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `frexpf' function. */
+#undef HAVE_FREXPF
+
+/* Define to 1 if you have the `frexpl' function. */
+#undef HAVE_FREXPL
+
+/* Define if the compiler understands the __FUNCTION__ keyword */
+#undef HAVE_FUNCTION
+
+/* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */
+#undef HAVE_GETCONSOLESCREENBUFFERINFO
+
+/* Define to 1 if you have the `gethostname' function. */
+#undef HAVE_GETHOSTNAME
+
+/* Define to 1 if you have the `getpwuid' function. */
+#undef HAVE_GETPWUID
+
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
+/* Define to 1 if you have the `gettextinfo' function. */
+#undef HAVE_GETTEXTINFO
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if the compiler understands inline */
+#undef HAVE_INLINE
+
+/* Define if library will contain instrumentation to detect correct
+   optimization operation */
+#undef HAVE_INSTRUMENTED_LIBRARY
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `ioctl' function. */
+#undef HAVE_IOCTL
+
+/* Define to 1 if you have the <io.h> header file. */
+#undef HAVE_IO_H
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */
+#undef HAVE_LIBDMALLOC
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the `mpe' library (-lmpe). */
+#undef HAVE_LIBMPE
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the `sz' library (-lsz). */
+#undef HAVE_LIBSZ
+
+/* Define to 1 if you have the `ws2_32' library (-lws2_32). */
+#undef HAVE_LIBWS2_32
+
+/* Define to 1 if you have the `z' library (-lz). */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the `longjmp' function. */
+#undef HAVE_LONGJMP
+
+/* Define to 1 if you have the `lstat' function. */
+#undef HAVE_LSTAT
+
+/* Define to 1 if you have the <mach/mach_time.h> header file. */
+#undef HAVE_MACH_MACH_TIME_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if we have MPE support */
+#undef HAVE_MPE
+
+/* Define to 1 if you have the <mpe.h> header file. */
+#undef HAVE_MPE_H
+
+/* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */
+#undef HAVE_MPI_MULTI_LANG_Comm
+
+/* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */
+#undef HAVE_MPI_MULTI_LANG_Info
+
+/* Define if we have parallel support */
+#undef HAVE_PARALLEL
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the `random' function. */
+#undef HAVE_RANDOM
+
+/* Define to 1 if you have the `rand_r' function. */
+#undef HAVE_RAND_R
+
+/* Define to 1 if you have the `setjmp' function. */
+#undef HAVE_SETJMP
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#undef HAVE_SETJMP_H
+
+/* Define to 1 if you have the `setsysinfo' function. */
+#undef HAVE_SETSYSINFO
+
+/* Define to 1 if you have the `siglongjmp' function. */
+#undef HAVE_SIGLONGJMP
+
+/* Define to 1 if you have the `signal' function. */
+#undef HAVE_SIGNAL
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define to 1 if you have the `sigsetjmp' function. */
+#undef HAVE_SIGSETJMP
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the `srandom' function. */
+#undef HAVE_SRANDOM
+
+/* Define if `struct stat' has the `st_blocks' field */
+#undef HAVE_STAT_ST_BLOCKS
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if `struct text_info' is defined */
+#undef HAVE_STRUCT_TEXT_INFO
+
+/* Define if `struct videoconfig' is defined */
+#undef HAVE_STRUCT_VIDEOCONFIG
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the `system' function. */
+#undef HAVE_SYSTEM
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/timeb.h> header file. */
+#undef HAVE_SYS_TIMEB_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <szlib.h> header file. */
+#undef HAVE_SZLIB_H
+
+/* Define if we have thread safe support */
+#undef HAVE_THREADSAFE
+
+/* Define if `timezone' is a global variable */
+#undef HAVE_TIMEZONE
+
+/* Define if the ioctl TIOCGETD is defined */
+#undef HAVE_TIOCGETD
+
+/* Define if the ioctl TIOGWINSZ is defined */
+#undef HAVE_TIOCGWINSZ
+
+/* Define to 1 if you have the `tmpfile' function. */
+#undef HAVE_TMPFILE
+
+/* Define if `tm_gmtoff' is a member of `struct tm' */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vasprintf' function. */
+#undef HAVE_VASPRINTF
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define if your system has window style path name. */
+#undef HAVE_WINDOW_PATH
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
+/* Define to 1 if you have the `_getvideoconfig' function. */
+#undef HAVE__GETVIDEOCONFIG
+
+/* Define to 1 if you have the `_scrsize' function. */
+#undef HAVE__SCRSIZE
+
+/* Define if the compiler understands __inline */
+#undef HAVE___INLINE
+
+/* Define if the compiler understands __inline__ */
+#undef HAVE___INLINE__
+
+/* Define if HDF5's high-level library headers should be included in hdf5.h */
+#undef INCLUDE_HL
+
+/* Define if your system can convert long double to (unsigned) long long
+   values correctly. */
+#undef LDOUBLE_TO_LLONG_ACCURATE
+
+/* Define if your system converts long double to (unsigned) long values with
+   special algorithm. */
+#undef LDOUBLE_TO_LONG_SPECIAL
+
+/* Define if your system can convert (unsigned) long long to long double
+   values correctly. */
+#undef LLONG_TO_LDOUBLE_CORRECT
+
+/* Define if your system can convert (unsigned) long to long double values
+   with special algorithm. */
+#undef LONG_TO_LDOUBLE_SPECIAL
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Define if the metadata trace file code is to be compiled in */
+#undef METADATA_TRACE_FILE
+
+/* Define if we can violate pointer alignment restrictions */
+#undef NO_ALIGNMENT_RESTRICTIONS
+
+/* Define if deprecated public API symbols are disabled */
+#undef NO_DEPRECATED_SYMBOLS
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Width for printf() for type `long long' or `__int64', use `ll' */
+#undef PRINTF_LL_WIDTH
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `int16_t', as computed by sizeof. */
+#undef SIZEOF_INT16_T
+
+/* The size of `int32_t', as computed by sizeof. */
+#undef SIZEOF_INT32_T
+
+/* The size of `int64_t', as computed by sizeof. */
+#undef SIZEOF_INT64_T
+
+/* The size of `int8_t', as computed by sizeof. */
+#undef SIZEOF_INT8_T
+
+/* The size of `int_fast16_t', as computed by sizeof. */
+#undef SIZEOF_INT_FAST16_T
+
+/* The size of `int_fast32_t', as computed by sizeof. */
+#undef SIZEOF_INT_FAST32_T
+
+/* The size of `int_fast64_t', as computed by sizeof. */
+#undef SIZEOF_INT_FAST64_T
+
+/* The size of `int_fast8_t', as computed by sizeof. */
+#undef SIZEOF_INT_FAST8_T
+
+/* The size of `int_least16_t', as computed by sizeof. */
+#undef SIZEOF_INT_LEAST16_T
+
+/* The size of `int_least32_t', as computed by sizeof. */
+#undef SIZEOF_INT_LEAST32_T
+
+/* The size of `int_least64_t', as computed by sizeof. */
+#undef SIZEOF_INT_LEAST64_T
+
+/* The size of `int_least8_t', as computed by sizeof. */
+#undef SIZEOF_INT_LEAST8_T
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* The size of `ptrdiff_t', as computed by sizeof. */
+#undef SIZEOF_PTRDIFF_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `ssize_t', as computed by sizeof. */
+#undef SIZEOF_SSIZE_T
+
+/* The size of `uint16_t', as computed by sizeof. */
+#undef SIZEOF_UINT16_T
+
+/* The size of `uint32_t', as computed by sizeof. */
+#undef SIZEOF_UINT32_T
+
+/* The size of `uint64_t', as computed by sizeof. */
+#undef SIZEOF_UINT64_T
+
+/* The size of `uint8_t', as computed by sizeof. */
+#undef SIZEOF_UINT8_T
+
+/* The size of `uint_fast16_t', as computed by sizeof. */
+#undef SIZEOF_UINT_FAST16_T
+
+/* The size of `uint_fast32_t', as computed by sizeof. */
+#undef SIZEOF_UINT_FAST32_T
+
+/* The size of `uint_fast64_t', as computed by sizeof. */
+#undef SIZEOF_UINT_FAST64_T
+
+/* The size of `uint_fast8_t', as computed by sizeof. */
+#undef SIZEOF_UINT_FAST8_T
+
+/* The size of `uint_least16_t', as computed by sizeof. */
+#undef SIZEOF_UINT_LEAST16_T
+
+/* The size of `uint_least32_t', as computed by sizeof. */
+#undef SIZEOF_UINT_LEAST32_T
+
+/* The size of `uint_least64_t', as computed by sizeof. */
+#undef SIZEOF_UINT_LEAST64_T
+
+/* The size of `uint_least8_t', as computed by sizeof. */
+#undef SIZEOF_UINT_LEAST8_T
+
+/* The size of `unsigned', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED
+
+/* The size of `__int64', as computed by sizeof. */
+#undef SIZEOF___INT64
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if strict file format checks are enabled */
+#undef STRICT_FORMAT_CHECKS
+
+/* Define if your system supports pthread_attr_setscope(&attribute,
+   PTHREAD_SCOPE_SYSTEM) call. */
+#undef SYSTEM_SCOPE_THREADS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define using v1.6 public API symbols by default */
+#undef USE_16_API_DEFAULT
+
+/* Define if a memory checking tool will be used on the library, to cause
+   library to be very picky about memory operations and also disable the
+   internal free list manager code. */
+#undef USING_MEMCHECKER
+
+/* Version number of package */
+#undef VERSION
+
+/* Data accuracy is prefered to speed during data conversions */
+#undef WANT_DATA_ACCURACY
+
+/* Check exception handling functions during data conversions */
+#undef WANT_DCONV_EXCEPTION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef ptrdiff_t
+
+/* Define to `unsigned long' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef ssize_t
diff --git a/gatb-core/thirdparty/hdf5/src/H5dbg.c b/gatb-core/thirdparty/hdf5/src/H5dbg.c
new file mode 100644
index 0000000..2039a51
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5dbg.c
@@ -0,0 +1,146 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5dbg.c
+ *			Mar  4 2006
+ *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *
+ * Purpose:		Generic debugging routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_buffer_dump
+ *
+ * Purpose:	Dumps a buffer of memory in an octal dump form
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  4 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5_buffer_dump(FILE *stream, int indent, const uint8_t *buf,
+    const uint8_t *marker, size_t buf_offset, size_t buf_size)
+{
+    size_t	u, v;                   /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(buf);
+    HDassert(marker);
+    HDassert(buf_size > 0);
+
+    /*
+     * Print the buffer in a VMS-style octal dump.
+     */
+    HDfprintf(stream, "%*sData follows (`__' indicates free region)...\n",
+	    indent, "");
+    for(u = 0; u < buf_size; u += 16) {
+        uint8_t		c;
+
+	HDfprintf(stream, "%*s %8d: ", indent, "", u + buf_offset);
+
+        /* Print the hex values */
+	for(v = 0; v < 16; v++) {
+	    if(u + v < buf_size) {
+		if(marker[u + v])
+		    HDfprintf(stream, "__ ");
+		else {
+		    c = buf[buf_offset + u + v];
+		    HDfprintf(stream, "%02x ", c);
+		} /* end else */
+	    } /* end if */
+            else
+		fprintf(stream, "   ");
+	    if(7 == v)
+		HDfputc(' ', stream);
+	} /* end for */
+        HDfputc(' ', stream);
+
+        /* Print the character values */
+	for(v = 0; v < 16; v++) {
+	    if(u + v < buf_size) {
+		if(marker[u + v])
+		    HDfputc(' ', stream);
+		else {
+		    c = buf[buf_offset + u + v];
+		    if(HDisprint(c))
+			HDfputc(c, stream);
+		    else
+			HDfputc('.', stream);
+		} /* end else */
+	    } /* end if */
+	    if(7 == v)
+		HDfputc(' ', stream);
+	} /* end for */
+
+	HDfputc('\n', stream);
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5_buffer_dump() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5detect.c b/gatb-core/thirdparty/hdf5/src/H5detect.c
new file mode 100644
index 0000000..299f5fa
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5detect.c
@@ -0,0 +1,1790 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*keep this declaration near the top of this file -RPM*/
+static const char *FileHeader = "\n\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
+ * Copyright by The HDF Group.                                               *\n\
+ * Copyright by the Board of Trustees of the University of Illinois.         *\n\
+ * All rights reserved.                                                      *\n\
+ *                                                                           *\n\
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
+ * terms governing use, modification, and redistribution, is contained in    *\n\
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
+ * of the source code distribution tree; Copyright.html can be found at the  *\n\
+ * root level of an installed copy of the electronic HDF5 document set and   *\n\
+ * is linked from the top-level documents page.  It can also be found at     *\n\
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
+ * access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *";
+/*
+ *
+ * Created:	H5detect.c
+ *		10 Aug 1997
+ *		Robb Matzke
+ *
+ * Purpose:	This code was borrowed heavily from the `detect.c'
+ *		program in the AIO distribution from Lawrence
+ *		Livermore National Laboratory.
+ *
+ *		Detects machine byte order and floating point
+ *		format and generates a C source file (native.c)
+ *		to describe those paramters.
+ *
+ * Assumptions: We have an ANSI compiler.  We're on a Unix like
+ *		system or configure has detected those Unix
+ *		features which aren't available.  We're not
+ *		running on a Vax or other machine with mixed
+ *		endianess.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#undef NDEBUG
+#include "H5private.h"
+#include "H5Tpublic.h"
+#include "H5Rpublic.h"
+
+#define MAXDETECT 64
+
+/* The ALIGNMENT test code may generate the SIGBUS, SIGSEGV, or SIGILL signals. 
+ * We use setjmp/longjmp in the signal handlers for recovery. But setjmp/longjmp
+ * do not necessary restore the signal blocking status while sigsetjmp/siglongjmp
+ * do. If sigsetjmp/siglongjmp are not supported, need to use sigprocmask to
+ * unblock the signal before doing longjmp.
+ */
+/* Define H5SETJMP/H5LONGJMP depending on if sigsetjmp/siglongjmp are */
+/* supported. */
+#if defined(H5_HAVE_SIGSETJMP) && defined(H5_HAVE_SIGLONGJMP)
+/* Always save blocked signals to be restore by siglongjmp. */
+#define H5JMP_BUF	sigjmp_buf
+#define H5SETJMP(buf)	HDsigsetjmp(buf, 1)
+#define H5LONGJMP(buf, val)	HDsiglongjmp(buf, val)
+#define H5HAVE_SIGJMP		/* sigsetjmp/siglongjmp are supported. */
+#elif defined(H5_HAVE_LONGJMP)
+#define H5JMP_BUF	jmp_buf
+#define H5SETJMP(buf)	HDsetjmp(buf)
+#define H5LONGJMP(buf, val)	HDlongjmp(buf, val)
+#endif
+
+/* ALIGNMENT and signal-handling status codes */
+#define STA_NoALIGNMENT		0x0001  /* No ALIGNMENT Test */
+#define STA_NoHandlerVerify	0x0002  /* No signal handler Tests */
+
+
+/*
+ * This structure holds information about a type that
+ * was detected.
+ */
+typedef struct detected_t {
+    const char		*varname;
+    int			size;		/*total byte size		*/
+    int			precision;	/*meaningful bits		*/
+    int			offset;		/*bit offset to meaningful bits	*/
+    int			perm[32];	/*for detection of byte order	*/
+    int                 is_vax;         /*for vax (float & double) only */
+    int			sign;		/*location of sign bit		*/
+    int			mpos, msize, imp;/*information about mantissa	*/
+    int			epos, esize;	/*information about exponent	*/
+    unsigned long	bias;		/*exponent bias for floating pt.*/
+    size_t		align;		/*required byte alignment	*/
+    size_t		comp_align;	/*alignment for structure       */
+} detected_t;
+
+/* This structure holds structure alignment for pointers, hvl_t, hobj_ref_t,
+ * hdset_reg_ref_t */
+typedef struct malign_t {
+    const char          *name;
+    size_t              comp_align;         /*alignment for structure   */
+} malign_t;
+
+/* global variables types detection code */
+static detected_t	d_g[MAXDETECT];
+static malign_t        m_g[MAXDETECT];
+static volatile int	nd_g = 0, na_g = 0;
+
+static void print_results(int nd, detected_t *d, int na, malign_t *m);
+static void iprint(detected_t *);
+static int byte_cmp(int, const void *, const void *, const unsigned char *);
+static int bit_cmp(int, int *, volatile void *, volatile void *,
+    const unsigned char *);
+static void fix_order(int, int, int *, const char **);
+static int imp_bit(int, int *, volatile void *, volatile void *,
+    const unsigned char *);
+static unsigned long find_bias(int, int, int *, volatile void *);
+static void precision (detected_t*);
+static void print_header(void);
+static void detect_C89_integers(void);
+static void detect_C89_floats(void);
+static void detect_C99_integers(void);
+static void detect_C99_floats(void);
+static void detect_C99_integers8(void);
+static void detect_C99_integers16(void);
+static void detect_C99_integers32(void);
+static void detect_C99_integers64(void);
+static void detect_alignments(void);
+static size_t align_g[] = {1, 2, 4, 8, 16};
+static int align_status_g = 0;		/* ALIGNMENT Signal Status */
+static int sigbus_handler_called_g = 0;	/* how many times called */
+static int sigsegv_handler_called_g = 0;/* how many times called */
+static int sigill_handler_called_g = 0;	/* how many times called */
+static int signal_handler_tested_g = 0;	/* how many times tested */
+#if defined(H5SETJMP) && defined(H5_HAVE_SIGNAL)
+static int verify_signal_handlers(int signum, void (*handler)(int));
+#endif
+#ifdef H5JMP_BUF
+static H5JMP_BUF jbuf_g;
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:	precision
+ *
+ * Purpose:	Determine the precision and offset.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, June 18, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+precision (detected_t *d)
+{
+    int		n;
+
+    if (0==d->msize) {
+	/*
+	 * An integer.	The permutation can have negative values at the
+	 * beginning or end which represent padding of bytes.  We must adjust
+	 * the precision and offset accordingly.
+	 */
+	if (d->perm[0] < 0) {
+	    /*
+	     * Lower addresses are padded.
+	     */
+	    for (n=0; n<d->size && d->perm[n]<0; n++) /*void*/;
+	    d->precision = 8*(d->size-n);
+	    d->offset = 0;
+	} else if (d->perm[d->size - 1] < 0) {
+	    /*
+	     * Higher addresses are padded.
+	     */
+	    for (n=0; n<d->size && d->perm[d->size-(n+1)]; n++) /*void*/;
+	    d->precision = 8*(d->size-n);
+	    d->offset = 8*n;
+	} else {
+	    /*
+	     * No padding.
+	     */
+	    d->precision = 8*d->size;
+	    d->offset = 0;
+	}
+    } else {
+	/* A floating point */
+	d->offset = MIN3 (d->mpos, d->epos, d->sign);
+	d->precision = d->msize + d->esize + 1;
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	DETECT_I/DETECT_BYTE
+ *
+ * Purpose:	These macro takes a type like `int' and a base name like
+ *		`nati' and detects the byte order.  The VAR is used to
+ *		construct the names of the C variables defined.
+ *
+ *              DETECT_I is used for types that are larger than one byte,
+ *              DETECT_BYTE is used for types that are exactly one byte.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 12 1996
+ *
+ * Modifications:
+ *
+ *	Robb Matzke, 4 Nov 1996
+ *	The INFO.perm now contains `-1' for bytes that aren't used and
+ *	are always zero.  This happens on the Cray for `short' where
+ *	sizeof(short) is 8, but only the low-order 4 bytes are ever used.
+ *
+ *	Robb Matzke, 4 Nov 1996
+ *	Added a `padding' field to indicate how many zero bytes appear to
+ *	the left (N) or right (-N) of the value.
+ *
+ *	Robb Matzke, 5 Nov 1996
+ *	Removed HFILE and CFILE arguments.
+ *
+ *      Neil Fortner, 6 Sep 2013
+ *      Split macro into DETECT_I and DETECT_BYTE macros, extracted
+ *      common cod einto DETECT_I_BYTE_CORE.  This was done to remove
+ *      "will never be executed" warnings.
+ *
+ *-------------------------------------------------------------------------
+ */
+#define DETECT_I_BYTE_CORE(TYPE,VAR,INFO,DETECT_TYPE) {                       \
+    DETECT_TYPE _v;                                                           \
+    int _i, _j;                                                               \
+    unsigned char *_x;                                                        \
+                                                                              \
+    HDmemset(&INFO, 0, sizeof(INFO));                                         \
+    INFO.varname = #VAR;                                                      \
+    INFO.size = sizeof(TYPE);                                                 \
+                                                                              \
+    for(_i = sizeof(DETECT_TYPE), _v = 0; _i > 0; --_i)                       \
+        _v = (_v << 8) + _i;                                                  \
+    for(_i = 0, _x = (unsigned char *)&_v; _i < (signed)sizeof(DETECT_TYPE); _i++) { \
+        _j = (*_x++) - 1;                                                     \
+        HDassert(_j < (signed)sizeof(DETECT_TYPE));                           \
+        INFO.perm[_i] = _j;                                                   \
+    } /* end for */                                                           \
+                                                                              \
+    INFO.sign = ('U' != *(#VAR));                                             \
+    precision (&(INFO));                                                      \
+    ALIGNMENT(TYPE, INFO);                                                    \
+    if(!HDstrcmp(INFO.varname, "SCHAR")  || !HDstrcmp(INFO.varname, "SHORT") || \
+        !HDstrcmp(INFO.varname, "INT")   || !HDstrcmp(INFO.varname, "LONG")  || \
+        !HDstrcmp(INFO.varname, "LLONG")) {                                   \
+        COMP_ALIGNMENT(TYPE, INFO.comp_align);                                \
+    }                                                                         \
+}
+
+#define DETECT_BYTE(TYPE,VAR,INFO) {                                          \
+    HDcompile_assert(sizeof(TYPE) == 1);                                      \
+                                                                              \
+    DETECT_I_BYTE_CORE(TYPE,VAR,INFO,int)                                     \
+}
+
+#define DETECT_I(TYPE,VAR,INFO) {					      \
+    HDcompile_assert(sizeof(TYPE) > 1);                                       \
+                                                                              \
+    DETECT_I_BYTE_CORE(TYPE,VAR,INFO,TYPE)                                    \
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	DETECT_F
+ *
+ * Purpose:	This macro takes a floating point type like `double' and
+ *		a base name like `natd' and detects byte order, mantissa
+ *		location, exponent location, sign bit location, presence or
+ *		absence of implicit mantissa bit, and exponent bias and
+ *		initializes a detected_t structure with those properties.
+ *
+ * Note:	'volatile' is used for the variables below to prevent the
+ *		compiler from optimizing them away.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 12 1996
+ *
+ *-------------------------------------------------------------------------
+ */
+#define DETECT_F(TYPE,VAR,INFO) {                                             \
+    volatile TYPE _v1, _v2, _v3;                                              \
+    unsigned char _buf1[sizeof(TYPE)], _buf3[sizeof(TYPE)];                   \
+    unsigned char _pad_mask[sizeof(TYPE)];                                    \
+    unsigned char _byte_mask;                                                 \
+    int _i, _j, _last = (-1);                                                 \
+    char *_mesg;                                                              \
+                                                                              \
+    HDmemset(&INFO, 0, sizeof(INFO));                                         \
+    INFO.varname = #VAR;                                                      \
+    INFO.size = sizeof(TYPE);                                                 \
+                                                                              \
+    /* Initialize padding mask */                                             \
+    HDmemset(_pad_mask, 0, sizeof(_pad_mask));                                \
+                                                                              \
+    /* Padding bits.  Set a variable to 4.0, then flip each bit and see if    \
+     * the modified variable is equal ("==") to the original.  Build a        \
+     * padding bitmask to indicate which bits in the type are padding (i.e.   \
+     * have no effect on the value and should be ignored by subsequent        \
+     * steps).  This is necessary because padding bits can change arbitrarily \
+     * and interfere with detection of the various properties below unless we \
+     * know to ignore them. */                                                \
+    _v1 = (TYPE)4.0L;                                                         \
+    HDmemcpy(_buf1, (const void *)&_v1, sizeof(TYPE));                        \
+    for(_i = 0; _i < (int)sizeof(TYPE); _i++)                                 \
+        for(_byte_mask = (unsigned char)1; _byte_mask; _byte_mask <<= 1) {    \
+            _buf1[_i] ^= _byte_mask;                                          \
+            HDmemcpy((void *)&_v2, (const void *)_buf1, sizeof(TYPE));        \
+            if(_v1 != _v2)                                                    \
+                _pad_mask[_i] |= _byte_mask;                                  \
+            _buf1[_i] ^= _byte_mask;                                          \
+        } /* end for */                                                       \
+                                                                              \
+    /* Byte Order */                                                          \
+    for(_i = 0, _v1 = (TYPE)0.0L, _v2 = (TYPE)1.0L; _i < (int)sizeof(TYPE); _i++) {         \
+        _v3 = _v1;                                                            \
+        _v1 += _v2;                                                           \
+        _v2 /= (TYPE)256.0L;                                                  \
+        HDmemcpy(_buf1, (const void *)&_v1, sizeof(TYPE));                    \
+        HDmemcpy(_buf3, (const void *)&_v3, sizeof(TYPE));                    \
+        _j = byte_cmp(sizeof(TYPE), _buf3, _buf1, _pad_mask);                 \
+        if(_j >= 0) {                                                         \
+            INFO.perm[_i] = _j;                                               \
+            _last = _i;                                                       \
+        }                                                                     \
+    }                                                                         \
+    fix_order(sizeof(TYPE), _last, INFO.perm, (const char**)&_mesg);          \
+                                                                              \
+    if(!HDstrcmp(_mesg, "VAX"))                                               \
+        INFO.is_vax = TRUE;                                                   \
+                                                                              \
+    /* Implicit mantissa bit */                                               \
+    _v1 = (TYPE)0.5L;                                                         \
+    _v2 = (TYPE)1.0L;                                                         \
+    INFO.imp = imp_bit (sizeof(TYPE), INFO.perm, &_v1, &_v2, _pad_mask);      \
+                                                                              \
+    /* Sign bit */                                                            \
+    _v1 = (TYPE)1.0L;                                                         \
+    _v2 = (TYPE)-1.0L;                                                        \
+    INFO.sign = bit_cmp (sizeof(TYPE), INFO.perm, &_v1, &_v2, _pad_mask);     \
+                                                                              \
+    /* Mantissa */                                                            \
+    INFO.mpos = 0;                                                            \
+                                                                              \
+    _v1 = (TYPE)1.0L;                                                         \
+    _v2 = (TYPE)1.5L;                                                         \
+    INFO.msize = bit_cmp (sizeof(TYPE), INFO.perm, &_v1, &_v2, _pad_mask);    \
+    INFO.msize += 1 + (INFO.imp?0:1) - INFO.mpos;                             \
+                                                                              \
+    /* Exponent */                                                            \
+    INFO.epos = INFO.mpos + INFO.msize;                                       \
+                                                                              \
+    INFO.esize = INFO.sign - INFO.epos;                                       \
+                                                                              \
+    _v1 = (TYPE)1.0L;                                                         \
+    INFO.bias = find_bias (INFO.epos, INFO.esize, INFO.perm, &_v1);           \
+    precision (&(INFO));                                                      \
+    ALIGNMENT(TYPE, INFO);                                                    \
+    if(!HDstrcmp(INFO.varname, "FLOAT") || !HDstrcmp(INFO.varname, "DOUBLE") || \
+        !HDstrcmp(INFO.varname, "LDOUBLE")) {                                 \
+        COMP_ALIGNMENT(TYPE,INFO.comp_align);                                 \
+    }                                                                         \
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	DETECT_M
+ *
+ * Purpose:	This macro takes only miscellaneous structures or pointer
+ *              (pointer, hvl_t, hobj_ref_t, hdset_reg_ref_t).  It
+ *		constructs the names and decides the alignment in structure.
+ *
+ * Return:	void
+ *
+ * Programmer:	Raymond Lu
+ *		slu at ncsa.uiuc.edu
+ *		Dec 9, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#define DETECT_M(TYPE,VAR,INFO) {					      \
+   INFO.name = #VAR;							      \
+   COMP_ALIGNMENT(TYPE, INFO.comp_align);				      \
+}
+
+/* Detect alignment for C structure */
+#define COMP_ALIGNMENT(TYPE,COMP_ALIGN) {			              \
+    struct {                                                                  \
+        char    c;                                                            \
+        TYPE    x;                                                            \
+    } s;                                                                      \
+                                                                              \
+    COMP_ALIGN = (size_t)((char*)(&(s.x)) - (char*)(&s));                     \
+}
+
+#if defined(H5SETJMP) && defined(H5_HAVE_SIGNAL)
+#define ALIGNMENT(TYPE,INFO) {						      \
+    char		*volatile _buf = NULL;				      \
+    volatile TYPE	_val = 1;						      \
+    volatile TYPE	_val2;						      \
+    volatile size_t	_ano = 0;					      \
+    void		(*_handler)(int) = HDsignal(SIGBUS, sigbus_handler);  \
+    void		(*_handler2)(int) = HDsignal(SIGSEGV, sigsegv_handler);\
+    void		(*_handler3)(int) = HDsignal(SIGILL, sigill_handler);  \
+									      \
+    _buf = (char*)HDmalloc(sizeof(TYPE) + align_g[NELMTS(align_g) - 1]);	      \
+    if(H5SETJMP(jbuf_g)) _ano++;					      \
+    if(_ano < NELMTS(align_g)) {					      \
+	*((TYPE*)(_buf+align_g[_ano])) = _val; /*possible SIGBUS or SEGSEGV*/ \
+	_val2 = *((TYPE*)(_buf+align_g[_ano]));	/*possible SIGBUS or SEGSEGV*/\
+	/* Cray Check: This section helps detect alignment on Cray's */	      \
+        /*              vector machines (like the SV1) which mask off */      \
+	/*              pointer values when pointing to non-word aligned */   \
+	/*              locations with pointers that are supposed to be */    \
+	/*              word aligned. -QAK */                                 \
+	HDmemset(_buf, 0xff, sizeof(TYPE)+align_g[NELMTS(align_g)-1]);	      \
+        /*How to handle VAX types?*/                                          \
+	if(INFO.perm[0]) /* Big-Endian */				      \
+	    HDmemcpy(_buf+align_g[_ano]+(INFO.size-((INFO.offset+INFO.precision)/8)),((char *)&_val)+(INFO.size-((INFO.offset+INFO.precision)/8)),(size_t)(INFO.precision/8)); \
+	else /* Little-Endian */					      \
+	    HDmemcpy(_buf+align_g[_ano]+(INFO.offset/8),((char *)&_val)+(INFO.offset/8),(size_t)(INFO.precision/8)); \
+	_val2 = *((TYPE*)(_buf+align_g[_ano]));				      \
+	if(_val!=_val2)							      \
+	    H5LONGJMP(jbuf_g, 1);		        		      \
+	/* End Cray Check */						      \
+	(INFO.align)=align_g[_ano];					      \
+    } else {								      \
+	(INFO.align)=0;							      \
+	fprintf(stderr, "unable to calculate alignment for %s\n", #TYPE);     \
+    }									      \
+    HDfree(_buf);								      \
+    HDsignal(SIGBUS, _handler); /*restore original handler*/		      \
+    HDsignal(SIGSEGV, _handler2); /*restore original handler*/		      \
+    HDsignal(SIGILL, _handler3); /*restore original handler*/		      \
+}
+#else
+#define ALIGNMENT(TYPE,INFO) {						      \
+    align_status_g |= STA_NoALIGNMENT;					      \
+    (INFO.align)=0;							      \
+}
+#endif
+
+

+#if defined(H5LONGJMP) && defined(H5_HAVE_SIGNAL)
+/*-------------------------------------------------------------------------
+ * Function:	sigsegv_handler
+ *
+ * Purpose:	Handler for SIGSEGV. We use signal() instead of sigaction()
+ *		because it's more portable to non-Posix systems. Although
+ *		it's not nearly as nice to work with, it does the job for
+ *		this simple stuff.
+ *
+ * Return:	Returns via H5LONGJMP to jbuf_g.
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, March 18, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+sigsegv_handler(int H5_ATTR_UNUSED signo)
+{
+#if !defined(H5HAVE_SIGJMP) && defined(H5_HAVE_SIGPROCMASK)
+    /* Use sigprocmask to unblock the signal if sigsetjmp/siglongjmp are not */
+    /* supported. */
+    sigset_t set;
+
+    HDsigemptyset(&set);
+    HDsigaddset(&set, SIGSEGV);
+    HDsigprocmask(SIG_UNBLOCK, &set, NULL);
+#endif
+
+    sigsegv_handler_called_g++;
+    HDsignal(SIGSEGV, sigsegv_handler);
+    H5LONGJMP(jbuf_g, SIGSEGV);
+}
+#endif
+
+

+#if defined(H5LONGJMP) && defined(H5_HAVE_SIGNAL)
+/*-------------------------------------------------------------------------
+ * Function:	sigbus_handler
+ *
+ * Purpose:	Handler for SIGBUS. We use signal() instead of sigaction()
+ *		because it's more portable to non-Posix systems. Although
+ *		it's not nearly as nice to work with, it does the job for
+ *		this simple stuff.
+ *
+ * Return:	Returns via H5LONGJMP to jbuf_g.
+ *
+ * Programmer:	Robb Matzke
+ *		Thursday, March 18, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+sigbus_handler(int H5_ATTR_UNUSED signo)
+{
+#if !defined(H5HAVE_SIGJMP) && defined(H5_HAVE_SIGPROCMASK)
+    /* Use sigprocmask to unblock the signal if sigsetjmp/siglongjmp are not */
+    /* supported. */
+    sigset_t set;
+
+    HDsigemptyset(&set);
+    HDsigaddset(&set, SIGBUS);
+    HDsigprocmask(SIG_UNBLOCK, &set, NULL);
+#endif
+
+    sigbus_handler_called_g++;
+    HDsignal(SIGBUS, sigbus_handler);
+    H5LONGJMP(jbuf_g, SIGBUS);
+}
+#endif
+
+

+#if defined(H5LONGJMP) && defined(H5_HAVE_SIGNAL)
+/*-------------------------------------------------------------------------
+ * Function:	sigill_handler
+ *
+ * Purpose:	Handler for SIGILL. We use signal() instead of sigaction()
+ *		because it's more portable to non-Posix systems. Although
+ *		it's not nearly as nice to work with, it does the job for
+ *		this simple stuff.
+ *
+ * Return:	Returns via H5LONGJMP to jbuf_g.
+ *
+ * Programmer:	Raymond Lu
+ *		28 October 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+sigill_handler(int H5_ATTR_UNUSED signo)
+{
+#if !defined(H5HAVE_SIGJMP) && defined(H5_HAVE_SIGPROCMASK)
+    /* Use sigprocmask to unblock the signal if sigsetjmp/siglongjmp are not */
+    /* supported. */
+    sigset_t set;
+
+    HDsigemptyset(&set);
+    HDsigaddset(&set, SIGILL);
+    HDsigprocmask(SIG_UNBLOCK, &set, NULL);
+#endif
+
+    sigill_handler_called_g++;
+    HDsignal(SIGILL, sigill_handler);
+    H5LONGJMP(jbuf_g, SIGILL);
+}
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:	print_results
+ *
+ * Purpose:	Prints information about the detected data types.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 14, 1996
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_results(int nd, detected_t *d, int na, malign_t *misc_align)
+{
+    int         byte_order=0;   /*byte order of data types*/
+    int		i, j;
+
+    /* Include files */
+    printf("\
+/****************/\n\
+/* Module Setup */\n\
+/****************/\n\
+\n\
+#define H5T_PACKAGE /*suppress error about including H5Tpkg.h*/\n\
+\n\
+\n\
+/***********/\n\
+/* Headers */\n\
+/***********/\n\
+#include \"H5private.h\"		/* Generic Functions			*/\n\
+#include \"H5Eprivate.h\"		/* Error handling		  	*/\n\
+#include \"H5FLprivate.h\"	/* Free Lists				*/\n\
+#include \"H5Iprivate.h\"		/* IDs			  		*/\n\
+#include \"H5Tpkg.h\"		/* Datatypes 				*/\n\
+\n\
+\n\
+/****************/\n\
+/* Local Macros */\n\
+/****************/\n\
+\n\
+\n\
+/******************/\n\
+/* Local Typedefs */\n\
+/******************/\n\
+\n\
+\n\
+/********************/\n\
+/* Package Typedefs */\n\
+/********************/\n\
+\n\
+\n\
+/********************/\n\
+/* Local Prototypes */\n\
+/********************/\n\
+\n\
+\n\
+/********************/\n\
+/* Public Variables */\n\
+/********************/\n\
+\n\
+\n\
+/*****************************/\n\
+/* Library Private Variables */\n\
+/*****************************/\n\
+\n\
+\n\
+/*********************/\n\
+/* Package Variables */\n\
+/*********************/\n\
+\n\
+\n");
+    printf("\n\
+/*******************/\n\
+/* Local Variables */\n\
+/*******************/\n\
+\n");
+
+
+    /* The interface initialization function */
+    printf("\n\
+
\n\
+/*-------------------------------------------------------------------------\n\
+ * Function:	H5TN_init_interface\n\
+ *\n\
+ * Purpose:	Initialize pre-defined native datatypes from code generated\n\
+ *              during the library configuration by H5detect.\n\
+ *\n\
+ * Return:	Success:	non-negative\n\
+ *		Failure:	negative\n\
+ *\n\
+ * Programmer:	Robb Matzke\n\
+ *              Wednesday, December 16, 1998\n\
+ *\n\
+ *-------------------------------------------------------------------------\n\
+ */\n\
+herr_t\n\
+H5TN_init_interface(void)\n\
+{\n\
+    H5T_t	*dt = NULL;\n\
+    herr_t	ret_value = SUCCEED;\n\
+\n\
+    FUNC_ENTER_NOAPI(FAIL)\n");
+
+    for(i = 0; i < nd; i++) {
+        /* The native endianess of this machine */
+        /* The INFO.perm now contains `-1' for bytes that aren't used and
+         * are always zero.  This happens on the Cray for `short' where
+         * sizeof(short) is 8, but only the low-order 4 bytes are ever used.
+         */
+        if(d[i].is_vax)    /* the type is a VAX floating number */
+            byte_order=-1;
+        else {
+            for(j=0; j<32; j++) {
+                /*Find the 1st containing valid data*/
+                if(d[i].perm[j]>-1) {
+                    byte_order=d[i].perm[j];
+                    break;
+                }
+            }
+        }
+
+	/* Print a comment to describe this section of definitions. */
+	printf("\n   /*\n");
+	iprint(d+i);
+	printf("    */\n");
+
+	/* The part common to fixed and floating types */
+	printf("\
+    if(NULL == (dt = H5T__alloc()))\n\
+        HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, \"datatype allocation failed\")\n\
+    dt->shared->state = H5T_STATE_IMMUTABLE;\n\
+    dt->shared->type = H5T_%s;\n\
+    dt->shared->size = %d;\n",
+	       d[i].msize ? "FLOAT" : "INTEGER",/*class			*/
+	       d[i].size);			/*size			*/
+
+        if(byte_order==-1)
+            printf("\
+    dt->shared->u.atomic.order = H5T_ORDER_VAX;\n");
+        else if(byte_order==0)
+            printf("\
+    dt->shared->u.atomic.order = H5T_ORDER_LE;\n");
+        else
+            printf("\
+    dt->shared->u.atomic.order = H5T_ORDER_BE;\n");
+
+        printf("\
+    dt->shared->u.atomic.offset = %d;\n\
+    dt->shared->u.atomic.prec = %d;\n\
+    dt->shared->u.atomic.lsb_pad = H5T_PAD_ZERO;\n\
+    dt->shared->u.atomic.msb_pad = H5T_PAD_ZERO;\n",
+	       d[i].offset,			/*offset		*/
+	       d[i].precision);			/*precision		*/
+    /*HDassert((d[i].perm[0]>0)==(byte_order>0));*/   /* Double-check that byte-order doesn't change */
+
+	if (0 == d[i].msize) {
+	    /* The part unique to fixed point types */
+	    printf("\
+    dt->shared->u.atomic.u.i.sign = H5T_SGN_%s;\n",
+		   d[i].sign ? "2" : "NONE");
+	} else {
+	    /* The part unique to floating point types */
+	    printf("\
+    dt->shared->u.atomic.u.f.sign = %d;\n\
+    dt->shared->u.atomic.u.f.epos = %d;\n\
+    dt->shared->u.atomic.u.f.esize = %d;\n\
+    dt->shared->u.atomic.u.f.ebias = 0x%08lx;\n\
+    dt->shared->u.atomic.u.f.mpos = %d;\n\
+    dt->shared->u.atomic.u.f.msize = %d;\n\
+    dt->shared->u.atomic.u.f.norm = H5T_NORM_%s;\n\
+    dt->shared->u.atomic.u.f.pad = H5T_PAD_ZERO;\n",
+		   d[i].sign,	/*sign location */
+		   d[i].epos,	/*exponent loc	*/
+		   d[i].esize,	/*exponent size */
+		   (unsigned long)(d[i].bias),	 /*exponent bias */
+		   d[i].mpos,	/*mantissa loc	*/
+		   d[i].msize,	/*mantissa size */
+		   d[i].imp ? "IMPLIED" : "NONE");	/*normalization */
+	}
+
+	/* Atomize the type */
+	printf("\
+    if((H5T_NATIVE_%s_g = H5I_register(H5I_DATATYPE, dt, FALSE)) < 0)\n\
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, \"can't register ID for built-in datatype\")\n",
+	       d[i].varname);
+	printf("    H5T_NATIVE_%s_ALIGN_g = %lu;\n",
+	       d[i].varname, (unsigned long)(d[i].align));
+
+        /* Variables for alignment of compound datatype */
+        if(!HDstrcmp(d[i].varname, "SCHAR")  || !HDstrcmp(d[i].varname, "SHORT") ||
+            !HDstrcmp(d[i].varname, "INT")   || !HDstrcmp(d[i].varname, "LONG")  ||
+            !HDstrcmp(d[i].varname, "LLONG") || !HDstrcmp(d[i].varname, "FLOAT") ||
+            !HDstrcmp(d[i].varname, "DOUBLE") || !HDstrcmp(d[i].varname, "LDOUBLE")) {
+            printf("    H5T_NATIVE_%s_COMP_ALIGN_g = %lu;\n",
+                    d[i].varname, (unsigned long)(d[i].comp_align));
+        }
+    }
+
+    /* Consider VAX a little-endian machine */
+    if(byte_order==0 || byte_order==-1) {
+        printf("\n\
+    /* Set the native order for this machine */\n\
+    H5T_native_order_g = H5T_ORDER_%s;\n", "LE");
+    } else {
+        printf("\n\
+    /* Set the native order for this machine */\n\
+    H5T_native_order_g = H5T_ORDER_%s;\n", "BE");
+    }
+
+    /* Structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
+    printf("\n    /* Structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */\n");
+    for(j=0; j<na; j++)
+        printf("    H5T_%s_COMP_ALIGN_g = %lu;\n", misc_align[j].name, (unsigned long)(misc_align[j].comp_align));
+
+    printf("\
+\n\
+done:\n\
+    if(ret_value < 0) {\n\
+        if(dt != NULL) {\n\
+            dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);\n\
+            dt = H5FL_FREE(H5T_t, dt);\n\
+        } /* end if */\n\
+    } /* end if */\n\
+\n\
+    FUNC_LEAVE_NOAPI(ret_value);\n} /* end H5TN_init_interface() */\n");
+
+    /* Print the ALIGNMENT and signal-handling status as comments */
+    printf("\n"
+	"/****************************************/\n"
+	"/* ALIGNMENT and signal-handling status */\n"
+	"/****************************************/\n");
+    if (align_status_g & STA_NoALIGNMENT)
+	printf("/* ALIGNAMENT test is not available */\n");
+    if (align_status_g & STA_NoHandlerVerify)
+	printf("/* Signal handlers verify test is not available */\n");
+    /* The following is available in H5pubconf.h. Printing them here for */
+    /* convenience. */
+#ifdef H5_HAVE_SIGNAL
+	printf("/* Signal() support: yes */\n");
+#else
+	printf("/* Signal() support: no */\n");
+#endif
+#ifdef H5_HAVE_SETJMP
+	printf("/* setjmp() support: yes */\n");
+#else
+	printf("/* setjmp() support: no */\n");
+#endif
+#ifdef H5_HAVE_LONGJMP
+	printf("/* longjmp() support: yes */\n");
+#else
+	printf("/* longjmp() support: no */\n");
+#endif
+#ifdef H5_HAVE_SIGSETJMP
+	printf("/* sigsetjmp() support: yes */\n");
+#else
+	printf("/* sigsetjmp() support: no */\n");
+#endif
+#ifdef H5_HAVE_SIGLONGJMP
+	printf("/* siglongjmp() support: yes */\n");
+#else
+	printf("/* siglongjmp() support: no */\n");
+#endif
+#ifdef H5_HAVE_SIGPROCMASK
+	printf("/* sigprocmask() support: yes */\n");
+#else
+	printf("/* sigprocmask() support: no */\n");
+#endif
+
+    /* Print the statics of signal handlers called for debugging */
+    printf("\n"
+	"/******************************/\n"
+	"/* signal handlers statistics */\n"
+	"/******************************/\n");
+    printf("/* signal_handlers tested: %d times */\n", signal_handler_tested_g);
+    printf("/* sigbus_handler called: %d times */\n", sigbus_handler_called_g);
+    printf("/* sigsegv_handler called: %d times */\n", sigsegv_handler_called_g);
+    printf("/* sigill_handler called: %d times */\n", sigill_handler_called_g);
+} /* end print_results() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	iprint
+ *
+ * Purpose:	Prints information about the fields of a floating point
+ *		format.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 13, 1996
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+iprint(detected_t *d)
+{
+    int		i, j, k, pass;
+
+    for (pass=(d->size-1)/4; pass>=0; --pass) {
+	/*
+	 * Print the byte ordering above the bit fields.
+	 */
+	printf("    * ");
+	for (i=MIN(pass*4+3,d->size-1); i>=pass*4; --i) {
+	    printf ("%4d", d->perm[i]);
+	    if (i>pass*4) HDfputs ("     ", stdout);
+	}
+
+	/*
+	 * Print the bit fields
+	 */
+	printf("\n    * ");
+	for (i=MIN(pass*4+3,d->size-1),
+	     k=MIN(pass*32+31,8*d->size-1);
+	     i>=pass*4; --i) {
+	    for (j=7; j>=0; --j) {
+		if (k==d->sign && d->msize) {
+		    HDputchar('S');
+		} else if (k>=d->epos && k<d->epos+d->esize) {
+		    HDputchar('E');
+		} else if (k>=d->mpos && k<d->mpos+d->msize) {
+		    HDputchar('M');
+		} else if (d->msize) {
+		    HDputchar('?');   /*unknown floating point bit */
+		} else if (d->sign) {
+		    HDputchar('I');
+		} else {
+		    HDputchar('U');
+		}
+		--k;
+	    }
+	    if (i>pass*4) HDputchar(' ');
+	}
+	HDputchar('\n');
+    }
+
+    /*
+     * Is there an implicit bit in the mantissa.
+     */
+    if (d->msize) {
+	printf("    * Implicit bit? %s\n", d->imp ? "yes" : "no");
+    }
+
+    /*
+     * Alignment
+     */
+    if (0==d->align) {
+	printf("    * Alignment: NOT CALCULATED\n");
+    } else if (1==d->align) {
+	printf("    * Alignment: none\n");
+    } else {
+	printf("    * Alignment: %lu\n", (unsigned long)(d->align));
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	byte_cmp
+ *
+ * Purpose:	Compares two chunks of memory A and B and returns the
+ *		byte index into those arrays of the first byte that
+ *		differs between A and B.  Ignores differences where the
+ *              corresponding bit in pad_mask is set to 0.
+ *
+ * Return:	Success:	Index of differing byte.
+ *
+ *		Failure:	-1 if all bytes are the same.
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 12, 1996
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+byte_cmp(int n, const void *_a, const void *_b, const unsigned char *pad_mask)
+{
+    int i;
+    const unsigned char *a = (const unsigned char *) _a;
+    const unsigned char *b = (const unsigned char *) _b;
+
+    for(i = 0; i < n; i++)
+        if((a[i] & pad_mask[i]) != (b[i] & pad_mask[i]))
+            return i;
+
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	bit_cmp
+ *
+ * Purpose:	Compares two bit vectors and returns the index for the
+ *		first bit that differs between the two vectors.	 The
+ *		size of the vector is NBYTES.  PERM is a mapping from
+ *		actual order to little endian.  Ignores differences where
+ *              the corresponding bit in pad_mask is set to 0.
+ *
+ * Return:	Success:	Index of first differing bit.
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 13, 1996
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+bit_cmp(int nbytes, int *perm, volatile void *_a, volatile void *_b,
+    const unsigned char *pad_mask)
+{
+    int                 i, j;
+    volatile unsigned char      *a = (volatile unsigned char *) _a;
+    volatile unsigned char      *b = (volatile unsigned char *) _b;
+    unsigned char       aa, bb;
+
+    for (i = 0; i < nbytes; i++) {
+        HDassert(perm[i] < nbytes);
+        if ((aa = a[perm[i]] & pad_mask[perm[i]])
+                != (bb = b[perm[i]] & pad_mask[perm[i]])) {
+            for (j = 0; j < 8; j++, aa >>= 1, bb >>= 1) {
+                if ((aa & 1) != (bb & 1)) return i * 8 + j;
+            }
+            fprintf(stderr, "INTERNAL ERROR");
+            HDabort();
+        }
+    }
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fix_order
+ *
+ * Purpose:	Given an array PERM with elements FIRST through LAST
+ *		initialized with zero origin byte numbers, this function
+ *		creates a permutation vector that maps the actual order
+ *		of a floating point number to little-endian.
+ *
+ *		This function assumes that the mantissa byte ordering
+ *		implies the total ordering.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 13, 1996
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+fix_order(int n, int last, int *perm, const char **mesg)
+{
+    int		i;
+
+    if (last > 1) {
+	/*
+	 * We have at least three points to consider.
+	 */
+	if (perm[last] < perm[last - 1] && perm[last - 1] < perm[last - 2]) {
+	    /*
+	     * Little endian.
+	     */
+	    if (mesg) *mesg = "Little-endian";
+	    for (i = 0; i < n; i++) perm[i] = i;
+
+	} else if (perm[last] > perm[last-1] && perm[last-1] > perm[last-2]) {
+	    /*
+	     * Big endian.
+	     */
+	    if (mesg) *mesg = "Big-endian";
+	    for (i = 0; i < n; i++) perm[i] = (n - 1) - i;
+
+	} else {
+	    /*
+	     * Bi-endian machines like VAX.
+             * (NOTE: This is not an actual determination of the VAX-endianess.
+             *          It could have some other endianess and fall into this
+             *          case - JKM & QAK)
+	     */
+	    HDassert(0 == n % 2);
+	    if (mesg) *mesg = "VAX";
+	    for (i = 0; i < n; i += 2) {
+		perm[i] = (n - 2) - i;
+		perm[i + 1] = (n - 1) - i;
+	    }
+	}
+    } else {
+	fprintf(stderr,
+	     "Failed to detect byte order of %d-byte floating point.\n", n);
+	HDexit(1);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	imp_bit
+ *
+ * Purpose:	Looks for an implicit bit in the mantissa.  The value
+ *		of _A should be 1.0 and the value of _B should be 0.5.
+ *		Some floating-point formats discard the most significant
+ *		bit of the mantissa after normalizing since it will always
+ *		be a one (except for 0.0).  If this is true for the native
+ *		floating point values stored in _A and _B then the function
+ *		returns non-zero.
+ *
+ *		This function assumes that the exponent occupies higher
+ *		order bits than the mantissa and that the most significant
+ *		bit of the mantissa is next to the least signficant bit
+ *		of the exponent.
+ *
+ *
+ * Return:	Success:	Non-zero if the most significant bit
+ *				of the mantissa is discarded (ie, the
+ *				mantissa has an implicit `one' as the
+ *				most significant bit).	Otherwise,
+ *				returns zero.
+ *
+ *		Failure:	exit(1)
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 13, 1996
+ *
+ * Modifications:
+ *
+ *	Robb Matzke, 6 Nov 1996
+ *	Fixed a bug that occurs with non-implicit architectures.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+imp_bit(int n, int *perm, volatile void *_a, volatile void *_b,
+    const unsigned char *pad_mask)
+{
+    volatile unsigned char      *a = (volatile unsigned char *) _a;
+    volatile unsigned char      *b = (volatile unsigned char *) _b;
+    int                 changed, major, minor;
+    int                 msmb;   /*most significant mantissa bit */
+
+    /*
+     * Look for the least significant bit that has changed between
+     * A and B.  This is the least significant bit of the exponent.
+     */
+    changed = bit_cmp(n, perm, a, b, pad_mask);
+    HDassert(changed >= 0);
+
+    /*
+     * The bit to the right (less significant) of the changed bit should
+     * be the most significant bit of the mantissa.  If it is non-zero
+     * then the format does not remove the leading `1' of the mantissa.
+     */
+    msmb = changed - 1;
+    major = msmb / 8;
+    minor = msmb % 8;
+
+    return (a[perm[major]] >> minor) & 0x01 ? 0 : 1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	find_bias
+ *
+ * Purpose:	Determines the bias of the exponent.  This function should
+ *		be called with _A having a value of `1'.
+ *
+ * Return:	Success:	The exponent bias.
+ *
+ *		Failure:
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 13, 1996
+ *
+ * Modifications:
+ *
+ *	Robb Matzke, 6 Nov 1996
+ *	Fixed a bug with non-implicit architectures returning the
+ *	wrong exponent bias.
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned long
+find_bias(int epos, int esize, int *perm, volatile void *_a)
+{
+    unsigned char	*a = (unsigned char *) _a;
+    unsigned char	mask;
+    unsigned long	b, shift = 0, nbits, bias = 0;
+
+    while (esize > 0) {
+	nbits = MIN(esize, (8 - epos % 8));
+	mask = (1 << nbits) - 1;
+	b = (a[perm[epos / 8]] >> (epos % 8)) & mask;
+	bias |= b << shift;
+
+	shift += nbits;
+	esize -= nbits;
+	epos += nbits;
+    }
+    return bias;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	print_header
+ *
+ * Purpose:	Prints the C file header for the generated file.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Mar 12 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_header(void)
+{
+
+    time_t		now = HDtime(NULL);
+    struct tm		*tm = HDlocaltime(&now);
+    char		real_name[30];
+    char		host_name[256];
+    int			i;
+    const char		*s;
+#ifdef H5_HAVE_GETPWUID
+    struct passwd	*pwd = NULL;
+#else
+    int			pwd = 1;
+#endif
+    static const char	*month_name[] =
+    {
+	"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+    static const char	*purpose = "\
+This machine-generated source code contains\n\
+information about the various integer and\n\
+floating point numeric formats found on this\n\
+architecture.  The parameters below should be\n\
+checked carefully and errors reported to the\n\
+HDF5 maintainer.\n\
+\n\
+Each of the numeric formats listed below are\n\
+printed from most significant bit to least\n\
+significant bit even though the actual bytes\n\
+might be stored in a different order in\n\
+memory.	 The integers above each binary byte\n\
+indicate the relative order of the bytes in\n\
+memory; little-endian machines have\n\
+decreasing numbers while big-endian machines\n\
+have increasing numbers.\n\
+\n\
+The fields of the numbers are printed as\n\
+letters with `S' for the mantissa sign bit,\n\
+`M' for the mantissa magnitude, and `E' for\n\
+the exponent.  The exponent has an associated\n\
+bias which can be subtracted to find the\n\
+true exponent.	The radix point is assumed\n\
+to be before the first `M' bit.	 Any bit\n\
+of a floating-point value not falling into one\n\
+of these categories is printed as a question\n\
+mark.  Bits of integer types are printed as\n\
+`I' for 2's complement and `U' for magnitude.\n\
+\n\
+If the most significant bit of the normalized\n\
+mantissa (always a `1' except for `0.0') is\n\
+not stored then an `implicit=yes' appears\n\
+under the field description.  In thie case,\n\
+the radix point is still assumed to be\n\
+before the first `M' but after the implicit\n\
+bit.\n";
+
+    /*
+     * The real name is the first item from the passwd gecos field.
+     */
+#ifdef H5_HAVE_GETPWUID
+    {
+	size_t n;
+	char *comma;
+	if ((pwd = HDgetpwuid(HDgetuid()))) {
+	    if ((comma = HDstrchr(pwd->pw_gecos, ','))) {
+		n = MIN(sizeof(real_name)-1, (unsigned)(comma-pwd->pw_gecos));
+		HDstrncpy(real_name, pwd->pw_gecos, n);
+		real_name[n] = '\0';
+	    } else {
+		HDstrncpy(real_name, pwd->pw_gecos, sizeof(real_name));
+		real_name[sizeof(real_name) - 1] = '\0';
+	    }
+	} else {
+	    real_name[0] = '\0';
+	}
+    }
+#else
+    real_name[0] = '\0';
+#endif
+
+    /*
+     * The FQDM of this host or the empty string.
+     */
+#ifdef H5_HAVE_GETHOSTNAME
+    if (HDgethostname(host_name, sizeof(host_name)) < 0) {
+	host_name[0] = '\0';
+    }
+#else
+    host_name[0] = '\0';
+#endif
+
+    /*
+     * The file header: warning, copyright notice, build information.
+     */
+    printf("/* Generated automatically by H5detect -- do not edit */\n\n\n");
+    HDputs(FileHeader);		/*the copyright notice--see top of this file */
+
+    printf(" *\n * Created:\t\t%s %2d, %4d\n",
+	   month_name[tm->tm_mon], tm->tm_mday, 1900 + tm->tm_year);
+    if (pwd || real_name[0] || host_name[0]) {
+	printf(" *\t\t\t");
+	if (real_name[0]) printf("%s <", real_name);
+#ifdef H5_HAVE_GETPWUID
+	if (pwd) HDfputs(pwd->pw_name, stdout);
+#endif
+	if (host_name[0]) printf("@%s", host_name);
+	if (real_name[0]) printf(">");
+	HDputchar('\n');
+    }
+    printf(" *\n * Purpose:\t\t");
+    for (s = purpose; *s; s++) {
+	HDputchar(*s);
+	if ('\n' == *s && s[1]) printf(" *\t\t\t");
+    }
+
+    printf(" *\n * Modifications:\n *\n");
+    printf(" *\tDO NOT MAKE MODIFICATIONS TO THIS FILE!\n");
+    printf(" *\tIt was generated by code in `H5detect.c'.\n");
+
+    printf(" *\n *");
+    for (i = 0; i < 73; i++) HDputchar('-');
+    printf("\n */\n\n");
+
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C89_integers
+ *
+ * Purpose:	Detect C89 integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C89_integers(void)
+{
+    DETECT_BYTE(signed char,	  SCHAR,        d_g[nd_g]); nd_g++;
+    DETECT_BYTE(unsigned char,	  UCHAR,        d_g[nd_g]); nd_g++;
+    DETECT_I(short,		  SHORT,        d_g[nd_g]); nd_g++;
+    DETECT_I(unsigned short,	  USHORT,       d_g[nd_g]); nd_g++;
+    DETECT_I(int,		  INT,	        d_g[nd_g]); nd_g++;
+    DETECT_I(unsigned int,	  UINT,	        d_g[nd_g]); nd_g++;
+    DETECT_I(long,		  LONG,	        d_g[nd_g]); nd_g++;
+    DETECT_I(unsigned long,	  ULONG,        d_g[nd_g]); nd_g++;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C89_floats
+ *
+ * Purpose:	Detect C89 floating point types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C89_floats(void)
+{
+    DETECT_F(float,     FLOAT,      d_g[nd_g]); nd_g++;
+    DETECT_F(double,    DOUBLE,     d_g[nd_g]); nd_g++;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_integers8
+ *
+ * Purpose:	Detect C99 8 bit integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers8(void)
+{
+#if H5_SIZEOF_INT8_T>0
+  #if H5_SIZEOF_INT8_T==1
+    DETECT_BYTE(int8_t,           INT8,         d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(int8_t, 		  INT8,         d_g[nd_g]); nd_g++;
+  #endif
+#endif
+#if H5_SIZEOF_UINT8_T>0
+  #if H5_SIZEOF_UINT8_T==1
+    DETECT_BYTE(uint8_t, 	  UINT8,        d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(uint8_t,             UINT8,        d_g[nd_g]); nd_g++;
+  #endif
+#endif
+#if H5_SIZEOF_INT_LEAST8_T>0
+  #if H5_SIZEOF_INT_LEAST8_T==1
+    DETECT_BYTE(int_least8_t,     INT_LEAST8,   d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(int_least8_t, 	  INT_LEAST8,   d_g[nd_g]); nd_g++;
+  #endif
+#endif
+#if H5_SIZEOF_UINT_LEAST8_T>0
+  #if H5_SIZEOF_UINT_LEAST8_T==1
+    DETECT_BYTE(uint_least8_t,    UINT_LEAST8,  d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(uint_least8_t, 	  UINT_LEAST8,  d_g[nd_g]); nd_g++;
+  #endif
+#endif
+#if H5_SIZEOF_INT_FAST8_T>0
+  #if H5_SIZEOF_INT_FAST8_T==1
+    DETECT_BYTE(int_fast8_t,      INT_FAST8,    d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(int_fast8_t, 	  INT_FAST8,    d_g[nd_g]); nd_g++;
+  #endif
+#endif
+#if H5_SIZEOF_UINT_FAST8_T>0
+  #if H5_SIZEOF_UINT_FAST8_T==1
+    DETECT_BYTE(uint_fast8_t, 	  UINT_FAST8,   d_g[nd_g]); nd_g++;
+  #else
+    DETECT_I(uint_fast8_t,     UINT_FAST8,   d_g[nd_g]); nd_g++;
+  #endif
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_integers16
+ *
+ * Purpose:	Detect C99 16 bit integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers16(void)
+{
+#if H5_SIZEOF_INT16_T>0
+    DETECT_I(int16_t, 		  INT16,        d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT16_T>0
+    DETECT_I(uint16_t, 		  UINT16,       d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_LEAST16_T>0
+    DETECT_I(int_least16_t, 	  INT_LEAST16,  d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_LEAST16_T>0
+    DETECT_I(uint_least16_t, 	  UINT_LEAST16, d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_FAST16_T>0
+    DETECT_I(int_fast16_t, 	  INT_FAST16,   d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_FAST16_T>0
+    DETECT_I(uint_fast16_t, 	  UINT_FAST16,  d_g[nd_g]); nd_g++;
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_integers32
+ *
+ * Purpose:	Detect C99 32 bit integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers32(void)
+{
+#if H5_SIZEOF_INT32_T>0
+    DETECT_I(int32_t, 		  INT32,        d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT32_T>0
+    DETECT_I(uint32_t, 		  UINT32,       d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_LEAST32_T>0
+    DETECT_I(int_least32_t, 	  INT_LEAST32,  d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_LEAST32_T>0
+    DETECT_I(uint_least32_t, 	  UINT_LEAST32, d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_FAST32_T>0
+    DETECT_I(int_fast32_t, 	  INT_FAST32,   d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_FAST32_T>0
+    DETECT_I(uint_fast32_t, 	  UINT_FAST32,  d_g[nd_g]); nd_g++;
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_integers64
+ *
+ * Purpose:	Detect C99 64 bit integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers64(void)
+{
+#if H5_SIZEOF_INT64_T>0
+    DETECT_I(int64_t, 		  INT64,        d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT64_T>0
+    DETECT_I(uint64_t, 		  UINT64,       d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_LEAST64_T>0
+    DETECT_I(int_least64_t, 	  INT_LEAST64,  d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_LEAST64_T>0
+    DETECT_I(uint_least64_t, 	  UINT_LEAST64, d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_INT_FAST64_T>0
+    DETECT_I(int_fast64_t, 	  INT_FAST64,   d_g[nd_g]); nd_g++;
+#endif
+#if H5_SIZEOF_UINT_FAST64_T>0
+    DETECT_I(uint_fast64_t, 	  UINT_FAST64,  d_g[nd_g]); nd_g++;
+#endif
+
+#if H5_SIZEOF_LONG_LONG>0
+    DETECT_I(long long,		  LLONG,        d_g[nd_g]); nd_g++;
+    DETECT_I(unsigned long long,  ULLONG,       d_g[nd_g]); nd_g++;
+#else
+    /*
+     * This architecture doesn't support an integer type larger than `long'
+     * so we'll just make H5T_NATIVE_LLONG the same as H5T_NATIVE_LONG since
+     * `long long' is probably equivalent to `long' here anyway.
+     */
+    DETECT_I(long,		  LLONG,        d_g[nd_g]); nd_g++;
+    DETECT_I(unsigned long,	  ULLONG,       d_g[nd_g]); nd_g++;
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_integers
+ *
+ * Purpose:	Detect C99 integer types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers(void)
+{
+    /* break it down to more subroutines so that each module subroutine */
+    /* is smaller and takes less time to compile with optimization on.  */
+    detect_C99_integers8();
+    detect_C99_integers16();
+    detect_C99_integers32();
+    detect_C99_integers64();
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_C99_floats
+ *
+ * Purpose:	Detect C99 floating point types
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_floats(void)
+{
+#if H5_SIZEOF_DOUBLE == H5_SIZEOF_LONG_DOUBLE
+    /*
+     * If sizeof(double)==sizeof(long double) then assume that `long double'
+     * isn't supported and use `double' instead.  This suppresses warnings on
+     * some systems and `long double' is probably the same as `double' here
+     * anyway.
+     */
+    DETECT_F(double,		  LDOUBLE,      d_g[nd_g]); nd_g++;
+#elif H5_SIZEOF_LONG_DOUBLE !=0
+    DETECT_F(long double,	  LDOUBLE,      d_g[nd_g]); nd_g++;
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	detect_alignments
+ *
+ * Purpose:	Detect structure alignments
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_alignments(void)
+{
+    /* Detect structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
+    DETECT_M(void *,              POINTER,      m_g[na_g]); na_g++;
+    DETECT_M(hvl_t,               HVL,          m_g[na_g]); na_g++;
+    DETECT_M(hobj_ref_t,          HOBJREF,      m_g[na_g]); na_g++;
+    DETECT_M(hdset_reg_ref_t,     HDSETREGREF,  m_g[na_g]); na_g++;
+}
+
+

+#if defined(H5SETJMP) && defined(H5_HAVE_SIGNAL)
+/* Verify the signal handler for signal signum works correctly multiple times.
+ * One possible cause of failure is that the signal handling is blocked or
+ * changed to SIG_DFL after H5LONGJMP.
+ * Return  0 for success, -1 for failure.
+ */
+static int verify_signal_handlers(int signum, void (*handler)(int))
+{						      
+    void	(*save_handler)(int) = HDsignal(signum, handler);    
+    int i, val;
+    int ntries=5;
+    volatile int nfailures=0;
+    volatile int nsuccesses=0;
+									      
+    for (i=0;i<ntries; i++){    
+	val=H5SETJMP(jbuf_g);
+	if (val==0)
+	{    
+	    /* send self the signal to trigger the handler */    
+	    signal_handler_tested_g++;
+	    HDraise(signum);    
+	    /* Should not reach here. Record error. */
+	    nfailures++;
+	}else{
+	    if (val==signum){ 
+		/* return from signum handler. Record a sucess. */
+		nsuccesses++;
+	    }else{
+		fprintf(stderr, "Unknown return value (%d) from H5SETJMP",
+		    val);    
+		nfailures++;
+	    }
+	}
+    }    
+    /* restore save handler, check results and report failures */
+    HDsignal(signum, save_handler);
+    if (nfailures>0 || nsuccesses != ntries){
+	fprintf(stderr, "verify_signal_handlers for signal %d did %d tries. "
+	       "Found %d failures and %d successes\n",
+	       signum, ntries, nfailures, nsuccesses);
+	return(-1);
+    }else{
+	/* all succeeded */
+	return(0);
+    }
+}    
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Main entry point.
+ *
+ * Return:	Success:	exit(0)
+ *
+ *		Failure:	exit(1)
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Jun 12, 1996
+ *
+ * Modifications:
+ *	Albert Cheng, 2004/05/20
+ *	Some compilers, e.g., Intel C v7.0, took a long time to compile
+ *      with optimization when a module routine contains many code lines.
+ *      Divide up all those types detections macros into subroutines, both
+ *      to avoid the compiler optimization error and cleaner codes.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+
+#if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
+#if defined(UAC_NOPRINT) && defined(UAC_SIGBUS)
+    /*
+     * Make sure unaligned access generates SIGBUS and doesn't print warning
+     * messages so that we can detect alignment constraints on the DEC Alpha.
+     */
+    int			nvpairs[2];
+    nvpairs[0] = SSIN_UACPROC;
+    nvpairs[1] = UAC_NOPRINT | UAC_SIGBUS;
+    if (setsysinfo(SSI_NVPAIRS, nvpairs, 1, 0, 0)<0) {
+	fprintf(stderr, "H5detect: unable to turn off UAC handling: %s\n",
+		HDstrerror(errno));
+    }
+#endif
+#endif
+
+#if defined(H5SETJMP) && defined(H5_HAVE_SIGNAL)
+    /* verify the SIGBUS and SIGSEGV handlers work properly */
+    if (verify_signal_handlers(SIGBUS, sigbus_handler) != 0) {
+        fprintf(stderr, "Signal handler %s for signal %d failed\n",
+                "sigbus_handler", SIGBUS);
+    }
+    if (verify_signal_handlers(SIGSEGV, sigsegv_handler) != 0) {
+        fprintf(stderr, "Signal handler %s for signal %d failed\n",
+                "sigsegv_handler", SIGSEGV);
+    }
+    if (verify_signal_handlers(SIGILL, sigill_handler) != 0) {
+        fprintf(stderr, "Signal handler %s for signal %d failed\n",
+                "sigill_handler", SIGILL);
+    }
+#else
+    align_status_g |= STA_NoHandlerVerify;
+#endif
+
+    print_header();
+
+    /* C89 integer types */
+    detect_C89_integers();
+
+    /* C99 integer types */
+    detect_C99_integers();
+
+    /* C89 floating point types */
+    detect_C89_floats();
+
+    /* C99 floating point types */
+    detect_C99_floats();
+
+    /* Detect structure alignment */
+    detect_alignments();
+
+    print_results (nd_g, d_g, na_g, m_g);
+
+    return 0;
+}
diff --git a/gatb-core/thirdparty/hdf5/src/H5err.txt b/gatb-core/thirdparty/hdf5/src/H5err.txt
new file mode 100644
index 0000000..e94014d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5err.txt
@@ -0,0 +1,261 @@
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+
+# This file is used to generate the various headers that are needed for the
+# error API.  The bin/make_err script reads in this file and creates the
+# appropriate files in the src/ directory when the generated headers are out
+# of date with respect to this file.
+#
+# Blank lines and lines beginning with '#' are ignored
+#
+# The format of this file is as follows:
+#  <type>,<major section, if minor type, otherwise omitted>,<name>,<description>
+#
+# For example, the following sample input shows two major errors and two minor
+# errors in each section:
+#
+# MAJOR, H5E_ARGS, Invalid arguments to routine
+# MAJOR, H5E_RESOURCE, Resource unavailable
+#
+# SECTION, ARGS, Argument errors
+# SECTION, RESOURCE, Resource errors
+#
+# MINOR, ARGS, H5E_UNINITIALIZED, Information is uinitialized
+# MINOR, ARGS, H5E_UNSUPPORTED, Feature is unsupported
+# MINOR, RESOURCE, H5E_NOSPACE, No space available for allocation
+# MINOR, RESOURCE, H5E_CANTCOPY, unable to copy object
+#
+# The section information is just used for grouping the information in the
+# files created and can have any value.  They generally correspond to the
+# major errors, but don't have to.  The section definition for each minor error
+# must come before any minor error that uses it.
+#
+# Programmer: Quincey Koziol
+# Creation Date: 2003/08/12
+
+# Major errors
+MAJOR, H5E_ARGS, Invalid arguments to routine
+MAJOR, H5E_RESOURCE, Resource unavailable
+MAJOR, H5E_INTERNAL, Internal error (too specific to document in detail)
+MAJOR, H5E_FILE, File accessibilty
+MAJOR, H5E_IO, Low-level I/O
+MAJOR, H5E_FUNC, Function entry/exit
+MAJOR, H5E_ATOM, Object atom
+MAJOR, H5E_CACHE, Object cache
+MAJOR, H5E_LINK, Links
+MAJOR, H5E_BTREE, B-Tree node
+MAJOR, H5E_SYM, Symbol table
+MAJOR, H5E_HEAP, Heap
+MAJOR, H5E_OHDR, Object header
+MAJOR, H5E_DATATYPE, Datatype
+MAJOR, H5E_DATASPACE, Dataspace
+MAJOR, H5E_DATASET, Dataset
+MAJOR, H5E_STORAGE, Data storage
+MAJOR, H5E_PLIST, Property lists
+MAJOR, H5E_ATTR, Attribute
+MAJOR, H5E_PLINE, Data filters
+MAJOR, H5E_EFL, External file list
+MAJOR, H5E_REFERENCE, References
+MAJOR, H5E_VFL, Virtual File Layer
+MAJOR, H5E_TST, Ternary Search Trees
+MAJOR, H5E_RS, Reference Counted Strings
+MAJOR, H5E_ERROR, Error API
+MAJOR, H5E_SLIST, Skip Lists
+MAJOR, H5E_FSPACE, Free Space Manager
+MAJOR, H5E_SOHM, Shared Object Header Messages
+MAJOR, H5E_PLUGIN, Plugin for dynamically loaded library
+MAJOR, H5E_NONE_MAJOR, No error
+
+# Sections (for grouping minor errors)
+SECTION, ARGS, Argument errors
+SECTION, RESOURCE, Resource errors
+SECTION, FILEACC, File accessibilty errors
+SECTION, FILE, Generic low-level file I/O errors
+SECTION, FUNC, Function entry/exit interface errors
+SECTION, ATOM, Object atom related errors
+SECTION, CACHE, Cache related errors
+SECTION, LINK, Link related errors
+SECTION, BTREE, B-tree related errors
+SECTION, OHDR, Object header related errors
+SECTION, GROUP, Group related errors
+SECTION, TYPECONV, Datatype conversion errors
+SECTION, DSPACE, Dataspace errors
+SECTION, PLIST, Property list errors
+SECTION, MPI, Parallel MPI errors
+SECTION, HEAP, Heap errors
+SECTION, FSPACE, Free space errors
+SECTION, PIPELINE, I/O pipeline errors
+SECTION, SYSTEM, System level errors
+SECTION, PLUGIN, Plugin errors
+SECTION, NONE, No error
+
+# Minor errors
+
+# Argument errors
+MINOR, ARGS, H5E_UNINITIALIZED, Information is uinitialized
+MINOR, ARGS, H5E_UNSUPPORTED, Feature is unsupported
+MINOR, ARGS, H5E_BADTYPE, Inappropriate type
+MINOR, ARGS, H5E_BADRANGE, Out of range
+MINOR, ARGS, H5E_BADVALUE, Bad value
+
+# Resource errors
+MINOR, RESOURCE, H5E_NOSPACE, No space available for allocation
+MINOR, RESOURCE, H5E_CANTALLOC, Can't allocate space
+MINOR, RESOURCE, H5E_CANTCOPY, Unable to copy object
+MINOR, RESOURCE, H5E_CANTFREE, Unable to free object
+MINOR, RESOURCE, H5E_ALREADYEXISTS, Object already exists
+MINOR, RESOURCE, H5E_CANTLOCK, Unable to lock object
+MINOR, RESOURCE, H5E_CANTUNLOCK, Unable to unlock object
+MINOR, RESOURCE, H5E_CANTGC, Unable to garbage collect
+MINOR, RESOURCE, H5E_CANTGETSIZE, Unable to compute size
+MINOR, RESOURCE, H5E_OBJOPEN, Object is already open
+
+# File accessibilty errors
+MINOR, FILEACC, H5E_FILEEXISTS, File already exists
+MINOR, FILEACC, H5E_FILEOPEN, File already open
+MINOR, FILEACC, H5E_CANTCREATE, Unable to create file
+MINOR, FILEACC, H5E_CANTOPENFILE, Unable to open file
+MINOR, FILEACC, H5E_CANTCLOSEFILE, Unable to close file
+MINOR, FILEACC, H5E_NOTHDF5, Not an HDF5 file
+MINOR, FILEACC, H5E_BADFILE, Bad file ID accessed
+MINOR, FILEACC, H5E_TRUNCATED, File has been truncated
+MINOR, FILEACC, H5E_MOUNT, File mount error
+
+# Generic low-level file I/O errors
+MINOR, FILE, H5E_SEEKERROR, Seek failed
+MINOR, FILE, H5E_READERROR, Read failed
+MINOR, FILE, H5E_WRITEERROR, Write failed
+MINOR, FILE, H5E_CLOSEERROR, Close failed
+MINOR, FILE, H5E_OVERFLOW, Address overflowed
+MINOR, FILE, H5E_FCNTL, File control (fcntl) failed
+
+# Function entry/exit interface errors
+MINOR, FUNC, H5E_CANTINIT, Unable to initialize object
+MINOR, FUNC, H5E_ALREADYINIT, Object already initialized
+MINOR, FUNC, H5E_CANTRELEASE, Unable to release object
+
+# Object atom related errors
+MINOR, ATOM, H5E_BADATOM, Unable to find atom information (already closed?)
+MINOR, ATOM, H5E_BADGROUP, Unable to find ID group information
+MINOR, ATOM, H5E_CANTREGISTER, Unable to register new atom
+MINOR, ATOM, H5E_CANTINC, Unable to increment reference count
+MINOR, ATOM, H5E_CANTDEC, Unable to decrement reference count
+MINOR, ATOM, H5E_NOIDS, Out of IDs for group
+
+# Cache related errors
+MINOR, CACHE, H5E_CANTFLUSH, Unable to flush data from cache
+MINOR, CACHE, H5E_CANTSERIALIZE, Unable to serialize data from cache
+MINOR, CACHE, H5E_CANTLOAD, Unable to load metadata into cache
+MINOR, CACHE, H5E_PROTECT, Protected metadata error
+MINOR, CACHE, H5E_NOTCACHED, Metadata not currently cached
+MINOR, CACHE, H5E_SYSTEM, Internal error detected
+MINOR, CACHE, H5E_CANTINS, Unable to insert metadata into cache
+MINOR, CACHE, H5E_CANTPROTECT, Unable to protect metadata
+MINOR, CACHE, H5E_CANTUNPROTECT, Unable to unprotect metadata
+MINOR, CACHE, H5E_CANTPIN, Unable to pin cache entry
+MINOR, CACHE, H5E_CANTUNPIN, Unable to un-pin cache entry
+MINOR, CACHE, H5E_CANTMARKDIRTY, Unable to mark a pinned entry as dirty
+MINOR, CACHE, H5E_CANTDIRTY, Unable to mark metadata as dirty
+MINOR, CACHE, H5E_CANTEXPUNGE, Unable to expunge a metadata cache entry
+MINOR, CACHE, H5E_CANTRESIZE, Unable to resize a metadata cache entry
+
+# B-tree related errors
+MINOR, BTREE, H5E_NOTFOUND, Object not found
+MINOR, BTREE, H5E_EXISTS, Object already exists
+MINOR, BTREE, H5E_CANTENCODE, Unable to encode value
+MINOR, BTREE, H5E_CANTDECODE, Unable to decode value
+MINOR, BTREE, H5E_CANTSPLIT, Unable to split node
+MINOR, BTREE, H5E_CANTREDISTRIBUTE, Unable to redistribute records
+MINOR, BTREE, H5E_CANTSWAP, Unable to swap records
+MINOR, BTREE, H5E_CANTINSERT, Unable to insert object
+MINOR, BTREE, H5E_CANTLIST, Unable to list node
+MINOR, BTREE, H5E_CANTMODIFY, Unable to modify record
+MINOR, BTREE, H5E_CANTREMOVE, Unable to remove object
+
+# Object header related errors
+MINOR, OHDR, H5E_LINKCOUNT, Bad object header link count
+MINOR, OHDR, H5E_VERSION, Wrong version number
+MINOR, OHDR, H5E_ALIGNMENT, Alignment error
+MINOR, OHDR, H5E_BADMESG, Unrecognized message
+MINOR, OHDR, H5E_CANTDELETE, Can't delete message
+MINOR, OHDR, H5E_BADITER, Iteration failed
+MINOR, OHDR, H5E_CANTPACK, Can't pack messages
+MINOR, OHDR, H5E_CANTRESET, Can't reset object
+MINOR, OHDR, H5E_CANTRENAME, Unable to rename object
+
+# Group related errors
+MINOR, GROUP, H5E_CANTOPENOBJ, Can't open object
+MINOR, GROUP, H5E_CANTCLOSEOBJ, Can't close object
+MINOR, GROUP, H5E_COMPLEN, Name component is too long
+MINOR, GROUP, H5E_PATH, Problem with path to object
+
+# Datatype conversion errors
+MINOR, TYPECONV, H5E_CANTCONVERT, Can't convert datatypes
+MINOR, TYPECONV, H5E_BADSIZE, Bad size for object
+
+# Dataspace errors
+MINOR, DSPACE, H5E_CANTCLIP, Can't clip hyperslab region
+MINOR, DSPACE, H5E_CANTCOUNT, Can't count elements
+MINOR, DSPACE, H5E_CANTSELECT, Can't select hyperslab
+MINOR, DSPACE, H5E_CANTNEXT, Can't move to next iterator location
+MINOR, DSPACE, H5E_BADSELECT, Invalid selection
+MINOR, DSPACE, H5E_CANTCOMPARE, Can't compare objects
+
+# Property list errors
+MINOR, PLIST, H5E_CANTGET, Can't get value
+MINOR, PLIST, H5E_CANTSET, Can't set value
+MINOR, PLIST, H5E_DUPCLASS, Duplicate class name in parent class
+MINOR, PLIST, H5E_SETDISALLOWED, Disallowed operation
+
+# Link errors
+MINOR, LINK, H5E_TRAVERSE, Link traversal failure
+MINOR, LINK, H5E_NLINKS, Too many soft links in path
+MINOR, LINK, H5E_NOTREGISTERED, Link class not registered
+MINOR, LINK, H5E_CANTMOVE, Can't move object
+MINOR, LINK, H5E_CANTSORT, Can't sort objects
+
+# Parallel MPI errors
+MINOR, MPI, H5E_MPI, Some MPI function failed
+MINOR, MPI, H5E_MPIERRSTR, MPI Error String
+MINOR, MPI, H5E_CANTRECV, Can't receive data
+
+# Heap errors
+MINOR, HEAP, H5E_CANTRESTORE, Can't restore condition
+MINOR, HEAP, H5E_CANTCOMPUTE, Can't compute value
+MINOR, HEAP, H5E_CANTEXTEND, Can't extend heap's space
+MINOR, HEAP, H5E_CANTATTACH, Can't attach object
+MINOR, HEAP, H5E_CANTUPDATE, Can't update object
+MINOR, HEAP, H5E_CANTOPERATE, Can't operate on object
+
+# Free space manager errors
+MINOR, FSPACE, H5E_CANTMERGE, Can't merge objects
+MINOR, FSPACE, H5E_CANTREVIVE, Can't revive object
+MINOR, FSPACE, H5E_CANTSHRINK, Can't shrink container
+
+# I/O pipeline errors
+MINOR, PIPELINE, H5E_NOFILTER, Requested filter is not available
+MINOR, PIPELINE, H5E_CALLBACK, Callback failed
+MINOR, PIPELINE, H5E_CANAPPLY, Error from filter 'can apply' callback
+MINOR, PIPELINE, H5E_SETLOCAL, Error from filter 'set local' callback
+MINOR, PIPELINE, H5E_NOENCODER, Filter present but encoding disabled
+MINOR, PIPELINE, H5E_CANTFILTER, Filter operation failed
+
+# System level errors
+MINOR, SYSTEM, H5E_SYSERRSTR, System error message
+
+# Plugin errors
+MINOR, PLUGIN, H5E_OPENERROR, Can't open directory or file
+
+# No error, for backward compatibility */
+MINOR, NONE, H5E_NONE_MINOR, No error
diff --git a/gatb-core/thirdparty/hdf5/src/H5make_libsettings.c b/gatb-core/thirdparty/hdf5/src/H5make_libsettings.c
new file mode 100644
index 0000000..fa00c64
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5make_libsettings.c
@@ -0,0 +1,298 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*keep this declaration near the top of this file -RPM*/
+static const char *FileHeader = "\n\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
+ * Copyright by The HDF Group.                                               *\n\
+ * Copyright by the Board of Trustees of the University of Illinois.         *\n\
+ * All rights reserved.                                                      *\n\
+ *                                                                           *\n\
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
+ * terms governing use, modification, and redistribution, is contained in    *\n\
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
+ * of the source code distribution tree; Copyright.html can be found at the  *\n\
+ * root level of an installed copy of the electronic HDF5 document set and   *\n\
+ * is linked from the top-level documents page.  It can also be found at     *\n\
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
+ * access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *";
+/*
+ *
+ * Created:	H5make_libsettings.c
+ *		17 Mar 2010
+ *		Quincey Koziol
+ *
+ * Purpose:	Generate the H5libsettings.c file from the
+ *		libhdf5.settings file.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <stdio.h>
+#include <time.h>
+#include "H5private.h"
+
+#define LIBSETTINGSFNAME "libhdf5.settings"
+
+

+/*-------------------------------------------------------------------------
+ * Function:	insert_libhdf5_settings
+ *
+ * Purpose:	insert the contents of libhdf5.settings into a file
+ *		represented by flibinfo.
+ *		Make it an empty string if H5_HAVE_EMBEDDED_LIBINFO is not
+ *		defined, i.e., not enabled.
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		Apr 20, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+insert_libhdf5_settings(FILE *flibinfo)
+{
+#ifdef H5_HAVE_EMBEDDED_LIBINFO
+    FILE *fsettings;	/* for files libhdf5.settings */
+    int inchar;
+    int	bol = 0;	/* indicates the beginning of a new line */
+
+    if(NULL == (fsettings = HDfopen(LIBSETTINGSFNAME, "r"))) {
+        HDperror(LIBSETTINGSFNAME);
+        HDexit(1);
+    } /* end if */
+
+    /* print variable definition and the string */
+    /* Do not use const else AIX strings does not show it. */
+    fprintf(flibinfo, "char H5libhdf5_settings[]=\n");
+    bol++;
+    while(EOF != (inchar = HDgetc(fsettings))) {
+	if(bol) {
+	    /* Start a new line */
+	    fprintf(flibinfo, "\t\"");
+	    bol = 0;
+	} /* end if */
+	if(inchar == '\n') {
+	    /* end of a line */
+	    fprintf(flibinfo, "\\n\"\n");
+	    bol++;
+        } /* end if */
+	else
+	    HDputc(inchar, flibinfo);
+    } /* end while */
+    if(HDfeof(fsettings)) {
+	/* wrap up */
+	if(!bol)
+	    /* EOF found without a new line */
+	    fprintf(flibinfo, "\\n\"\n");
+	fprintf(flibinfo, ";\n\n");
+    } /* end if */
+    else {
+	fprintf(stderr, "Read errors encountered with %s\n", LIBSETTINGSFNAME);
+	HDexit(1);
+    } /* end else */
+    if(0 != HDfclose(fsettings)) {
+	HDperror(LIBSETTINGSFNAME);
+	HDexit(1);
+    } /* end if */
+#else
+    /* print variable definition and an empty string */
+    /* Do not use const else AIX strings does not show it. */
+    fprintf(flibinfo, "char H5libhdf5_settings[]=\"\";\n");
+#endif
+} /* insert_libhdf5_settings() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	make_libinfo
+ *
+ * Purpose:	Create the embedded library information definition.
+ * 		This sets up for a potential extension that the declaration
+ *		is printed to a file different from stdout.
+ *
+ * Return:	void
+ *
+ * Programmer:	Albert Cheng
+ *		Sep 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+make_libinfo(void)
+{
+    /* print variable definition and then the string as a macro. */
+    insert_libhdf5_settings(stdout);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	print_header
+ *
+ * Purpose:	Prints the header for the generated file.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Mar 12 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_header(void)
+{
+    time_t		now = HDtime(NULL);
+    struct tm		*tm = HDlocaltime(&now);
+    char		real_name[30];
+    char		host_name[256];
+    int			i;
+    const char		*s;
+#ifdef H5_HAVE_GETPWUID
+    struct passwd	*pwd = NULL;
+#else
+    int			pwd = 1;
+#endif
+    static const char	*month_name[] =
+    {
+	"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+    static const char	*purpose = "\
+This machine-generated source code contains\n\
+information about the library build configuration\n";
+
+    /*
+     * The real name is the first item from the passwd gecos field.
+     */
+#ifdef H5_HAVE_GETPWUID
+    {
+	size_t n;
+	char *comma;
+
+	if((pwd = HDgetpwuid(HDgetuid()))) {
+	    if((comma = HDstrchr(pwd->pw_gecos, ','))) {
+		n = MIN(sizeof(real_name) - 1, (unsigned)(comma - pwd->pw_gecos));
+		HDstrncpy(real_name, pwd->pw_gecos, n);
+		real_name[n] = '\0';
+	    } /* end if */
+            else {
+		HDstrncpy(real_name, pwd->pw_gecos, sizeof(real_name));
+		real_name[sizeof(real_name) - 1] = '\0';
+	    } /* end else */
+	} /* end if */
+        else
+	    real_name[0] = '\0';
+    }
+#else
+    real_name[0] = '\0';
+#endif
+
+    /*
+     * The FQDM of this host or the empty string.
+     */
+#ifdef H5_HAVE_GETHOSTNAME
+    if(HDgethostname(host_name, sizeof(host_name)) < 0)
+	host_name[0] = '\0';
+#else
+    host_name[0] = '\0';
+#endif
+
+    /*
+     * The file header: warning, copyright notice, build information.
+     */
+    printf("/* Generated automatically by H5make_libsettings -- do not edit */\n\n\n");
+    HDputs(FileHeader);		/*the copyright notice--see top of this file */
+
+    printf(" *\n * Created:\t\t%s %2d, %4d\n",
+	   month_name[tm->tm_mon], tm->tm_mday, 1900 + tm->tm_year);
+    if(pwd || real_name[0] || host_name[0]) {
+	printf(" *\t\t\t");
+	if(real_name[0])
+            printf("%s <", real_name);
+#ifdef H5_HAVE_GETPWUID
+	if(pwd)
+            HDfputs(pwd->pw_name, stdout);
+#endif
+	if(host_name[0])
+            printf("@%s", host_name);
+	if(real_name[0])
+            printf(">");
+	HDputchar('\n');
+    } /* end if */
+    printf(" *\n * Purpose:\t\t");
+    for(s = purpose; *s; s++) {
+	HDputchar(*s);
+	if('\n' == *s && s[1])
+            printf(" *\t\t\t");
+    } /* end for */
+
+    printf(" *\n * Modifications:\n *\n");
+    printf(" *\tDO NOT MAKE MODIFICATIONS TO THIS FILE!\n");
+    printf(" *\tIt was generated by code in `H5make_libsettings.c'.\n");
+
+    printf(" *\n *");
+    for(i = 0; i < 73; i++)
+        HDputchar('-');
+    printf("\n */\n\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	print_footer
+ *
+ * Purpose:	Prints the file footer for the generated file.
+ *
+ * Return:	void
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 31 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_footer(void)
+{
+    /* nothing */
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Main entry point.
+ *
+ * Return:	Success:	exit(0)
+ *
+ *		Failure:	exit(1)
+ *
+ * Programmer:	Albert Cheng
+ *		2010/4/1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    print_header();
+
+    /* Generate embedded library information variable definition */
+    make_libinfo();
+
+    print_footer();
+
+    HDexit(0);
+}
diff --git a/gatb-core/thirdparty/hdf5/src/H5overflow.h b/gatb-core/thirdparty/hdf5/src/H5overflow.h
new file mode 100644
index 0000000..f4064f4
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5overflow.h
@@ -0,0 +1,1939 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_overflow -- do not edit */
+/* Add new types to H5overflow.txt file */
+
+
+#ifndef _H5overflow_H
+#define _H5overflow_H
+
+
+/* Each type in this file is tested for assignment to the other types,
+ *      and range checks are defined for bad assignments at run-time.
+ */
+
+/* Assignment checks for unsigned */
+
+/* src: unsigned, dst: int */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_INT
+    #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_INT
+    #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_INT */
+    #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: int */
+
+/* src: unsigned, dst: uint8_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT8_T
+    #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT8_T
+    #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: uint8_t */
+
+/* src: unsigned, dst: uint16_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT16_T
+    #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT16_T
+    #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: uint16_t */
+
+/* src: unsigned, dst: uint32_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT32_T
+    #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT32_T
+    #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: uint32_t */
+
+/* src: unsigned, dst: uint64_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT64_T
+    #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT64_T
+    #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: uint64_t */
+
+/* src: unsigned, dst: ptrdiff_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: ptrdiff_t */
+
+/* src: unsigned, dst: size_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_SIZE_T
+    #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_SIZE_T
+    #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: size_t */
+
+/* src: unsigned, dst: ssize_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: ssize_t */
+
+/* src: unsigned, dst: haddr_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HADDR_T
+    #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HADDR_T
+    #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: haddr_t */
+
+/* src: unsigned, dst: hsize_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: hsize_t */
+
+/* src: unsigned, dst: hssize_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: hssize_t */
+
+/* src: unsigned, dst: h5_stat_size_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: h5_stat_size_t */
+
+
+/* Assignment checks for int */
+
+/* src: int, dst: unsigned */
+#if H5_SIZEOF_INT < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: unsigned */
+
+/* src: int, dst: uint8_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_UINT8_T
+    #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_UINT8_T
+    #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: uint8_t */
+
+/* src: int, dst: uint16_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_UINT16_T
+    #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_UINT16_T
+    #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: uint16_t */
+
+/* src: int, dst: uint32_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_UINT32_T
+    #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_UINT32_T
+    #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: uint32_t */
+
+/* src: int, dst: uint64_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_UINT64_T
+    #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_UINT64_T
+    #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: uint64_t */
+
+/* src: int, dst: ptrdiff_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: ptrdiff_t */
+
+/* src: int, dst: size_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_SIZE_T
+    #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_SIZE_T
+    #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: size_t */
+
+/* src: int, dst: ssize_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: ssize_t */
+
+/* src: int, dst: haddr_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_HADDR_T
+    #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_HADDR_T
+    #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: haddr_t */
+
+/* src: int, dst: hsize_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: hsize_t */
+
+/* src: int, dst: hssize_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: hssize_t */
+
+/* src: int, dst: h5_stat_size_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: h5_stat_size_t */
+
+
+/* Assignment checks for uint8_t */
+
+/* src: uint8_t, dst: unsigned */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: unsigned */
+
+/* src: uint8_t, dst: int */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_INT
+    #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_INT
+    #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_INT */
+    #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: int */
+
+/* src: uint8_t, dst: uint16_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: uint16_t */
+
+/* src: uint8_t, dst: uint32_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: uint32_t */
+
+/* src: uint8_t, dst: uint64_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: uint64_t */
+
+/* src: uint8_t, dst: ptrdiff_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: ptrdiff_t */
+
+/* src: uint8_t, dst: size_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: size_t */
+
+/* src: uint8_t, dst: ssize_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: ssize_t */
+
+/* src: uint8_t, dst: haddr_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: haddr_t */
+
+/* src: uint8_t, dst: hsize_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: hsize_t */
+
+/* src: uint8_t, dst: hssize_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: hssize_t */
+
+/* src: uint8_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for uint16_t */
+
+/* src: uint16_t, dst: unsigned */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: unsigned */
+
+/* src: uint16_t, dst: int */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_INT
+    #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_INT
+    #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_INT */
+    #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: int */
+
+/* src: uint16_t, dst: uint8_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: uint8_t */
+
+/* src: uint16_t, dst: uint32_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: uint32_t */
+
+/* src: uint16_t, dst: uint64_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: uint64_t */
+
+/* src: uint16_t, dst: ptrdiff_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: ptrdiff_t */
+
+/* src: uint16_t, dst: size_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: size_t */
+
+/* src: uint16_t, dst: ssize_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: ssize_t */
+
+/* src: uint16_t, dst: haddr_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: haddr_t */
+
+/* src: uint16_t, dst: hsize_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: hsize_t */
+
+/* src: uint16_t, dst: hssize_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: hssize_t */
+
+/* src: uint16_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for uint32_t */
+
+/* src: uint32_t, dst: unsigned */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: unsigned */
+
+/* src: uint32_t, dst: int */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_INT
+    #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_INT
+    #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_INT */
+    #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: int */
+
+/* src: uint32_t, dst: uint8_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: uint8_t */
+
+/* src: uint32_t, dst: uint16_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: uint16_t */
+
+/* src: uint32_t, dst: uint64_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: uint64_t */
+
+/* src: uint32_t, dst: ptrdiff_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: ptrdiff_t */
+
+/* src: uint32_t, dst: size_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: size_t */
+
+/* src: uint32_t, dst: ssize_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: ssize_t */
+
+/* src: uint32_t, dst: haddr_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: haddr_t */
+
+/* src: uint32_t, dst: hsize_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: hsize_t */
+
+/* src: uint32_t, dst: hssize_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: hssize_t */
+
+/* src: uint32_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for uint64_t */
+
+/* src: uint64_t, dst: unsigned */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: unsigned */
+
+/* src: uint64_t, dst: int */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_INT
+    #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_INT
+    #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_INT */
+    #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: int */
+
+/* src: uint64_t, dst: uint8_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: uint8_t */
+
+/* src: uint64_t, dst: uint16_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: uint16_t */
+
+/* src: uint64_t, dst: uint32_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: uint32_t */
+
+/* src: uint64_t, dst: ptrdiff_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: ptrdiff_t */
+
+/* src: uint64_t, dst: size_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: size_t */
+
+/* src: uint64_t, dst: ssize_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: ssize_t */
+
+/* src: uint64_t, dst: haddr_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: haddr_t */
+
+/* src: uint64_t, dst: hsize_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: hsize_t */
+
+/* src: uint64_t, dst: hssize_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: hssize_t */
+
+/* src: uint64_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for ptrdiff_t */
+
+/* src: ptrdiff_t, dst: unsigned */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: unsigned */
+
+/* src: ptrdiff_t, dst: int */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_INT
+    #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_INT
+    #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_INT */
+    #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: int */
+
+/* src: ptrdiff_t, dst: uint8_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: uint8_t */
+
+/* src: ptrdiff_t, dst: uint16_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: uint16_t */
+
+/* src: ptrdiff_t, dst: uint32_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: uint32_t */
+
+/* src: ptrdiff_t, dst: uint64_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: uint64_t */
+
+/* src: ptrdiff_t, dst: size_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: size_t */
+
+/* src: ptrdiff_t, dst: ssize_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: ssize_t */
+
+/* src: ptrdiff_t, dst: haddr_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: haddr_t */
+
+/* src: ptrdiff_t, dst: hsize_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: hsize_t */
+
+/* src: ptrdiff_t, dst: hssize_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: hssize_t */
+
+/* src: ptrdiff_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for size_t */
+
+/* src: size_t, dst: unsigned */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: unsigned */
+
+/* src: size_t, dst: int */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_INT
+    #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_INT
+    #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_INT */
+    #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: int */
+
+/* src: size_t, dst: uint8_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: uint8_t */
+
+/* src: size_t, dst: uint16_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: uint16_t */
+
+/* src: size_t, dst: uint32_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: uint32_t */
+
+/* src: size_t, dst: uint64_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: uint64_t */
+
+/* src: size_t, dst: ptrdiff_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: ptrdiff_t */
+
+/* src: size_t, dst: ssize_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: ssize_t */
+
+/* src: size_t, dst: haddr_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: haddr_t */
+
+/* src: size_t, dst: hsize_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: hsize_t */
+
+/* src: size_t, dst: hssize_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: hssize_t */
+
+/* src: size_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for ssize_t */
+
+/* src: ssize_t, dst: unsigned */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: unsigned */
+
+/* src: ssize_t, dst: int */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_INT
+    #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_INT
+    #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_INT */
+    #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: int */
+
+/* src: ssize_t, dst: uint8_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: uint8_t */
+
+/* src: ssize_t, dst: uint16_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: uint16_t */
+
+/* src: ssize_t, dst: uint32_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: uint32_t */
+
+/* src: ssize_t, dst: uint64_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: uint64_t */
+
+/* src: ssize_t, dst: ptrdiff_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: ptrdiff_t */
+
+/* src: ssize_t, dst: size_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: size_t */
+
+/* src: ssize_t, dst: haddr_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: haddr_t */
+
+/* src: ssize_t, dst: hsize_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: hsize_t */
+
+/* src: ssize_t, dst: hssize_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: hssize_t */
+
+/* src: ssize_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for haddr_t */
+
+/* src: haddr_t, dst: unsigned */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: unsigned */
+
+/* src: haddr_t, dst: int */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_INT
+    #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_INT
+    #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_INT */
+    #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: int */
+
+/* src: haddr_t, dst: uint8_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: uint8_t */
+
+/* src: haddr_t, dst: uint16_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: uint16_t */
+
+/* src: haddr_t, dst: uint32_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: uint32_t */
+
+/* src: haddr_t, dst: uint64_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: uint64_t */
+
+/* src: haddr_t, dst: ptrdiff_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: ptrdiff_t */
+
+/* src: haddr_t, dst: size_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: size_t */
+
+/* src: haddr_t, dst: ssize_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: ssize_t */
+
+/* src: haddr_t, dst: hsize_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: hsize_t */
+
+/* src: haddr_t, dst: hssize_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: hssize_t */
+
+/* src: haddr_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for hsize_t */
+
+/* src: hsize_t, dst: unsigned */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: unsigned */
+
+/* src: hsize_t, dst: int */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_INT
+    #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_INT
+    #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_INT */
+    #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: int */
+
+/* src: hsize_t, dst: uint8_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: uint8_t */
+
+/* src: hsize_t, dst: uint16_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: uint16_t */
+
+/* src: hsize_t, dst: uint32_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: uint32_t */
+
+/* src: hsize_t, dst: uint64_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: uint64_t */
+
+/* src: hsize_t, dst: ptrdiff_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: ptrdiff_t */
+
+/* src: hsize_t, dst: size_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: size_t */
+
+/* src: hsize_t, dst: ssize_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: ssize_t */
+
+/* src: hsize_t, dst: haddr_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: haddr_t */
+
+/* src: hsize_t, dst: hssize_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: hssize_t */
+
+/* src: hsize_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for hssize_t */
+
+/* src: hssize_t, dst: unsigned */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: unsigned */
+
+/* src: hssize_t, dst: int */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_INT
+    #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_INT
+    #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_INT */
+    #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: int */
+
+/* src: hssize_t, dst: uint8_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: uint8_t */
+
+/* src: hssize_t, dst: uint16_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: uint16_t */
+
+/* src: hssize_t, dst: uint32_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: uint32_t */
+
+/* src: hssize_t, dst: uint64_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: uint64_t */
+
+/* src: hssize_t, dst: ptrdiff_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: ptrdiff_t */
+
+/* src: hssize_t, dst: size_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: size_t */
+
+/* src: hssize_t, dst: ssize_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: ssize_t */
+
+/* src: hssize_t, dst: haddr_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: haddr_t */
+
+/* src: hssize_t, dst: hsize_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: hsize_t */
+
+/* src: hssize_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: h5_stat_size_t */
+
+
+/* Assignment checks for h5_stat_size_t */
+
+/* src: h5_stat_size_t, dst: unsigned */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: unsigned */
+
+/* src: h5_stat_size_t, dst: int */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_INT
+    #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_INT
+    #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_INT */
+    #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: int */
+
+/* src: h5_stat_size_t, dst: uint8_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: uint8_t */
+
+/* src: h5_stat_size_t, dst: uint16_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: uint16_t */
+
+/* src: h5_stat_size_t, dst: uint32_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: uint32_t */
+
+/* src: h5_stat_size_t, dst: uint64_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: uint64_t */
+
+/* src: h5_stat_size_t, dst: ptrdiff_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: ptrdiff_t */
+
+/* src: h5_stat_size_t, dst: size_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: size_t */
+
+/* src: h5_stat_size_t, dst: ssize_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: ssize_t */
+
+/* src: h5_stat_size_t, dst: haddr_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: haddr_t */
+
+/* src: h5_stat_size_t, dst: hsize_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: hsize_t */
+
+/* src: h5_stat_size_t, dst: hssize_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: hssize_t */
+
+#endif /* H5overflow_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5overflow.txt b/gatb-core/thirdparty/hdf5/src/H5overflow.txt
new file mode 100644
index 0000000..c093fd5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5overflow.txt
@@ -0,0 +1,45 @@
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+
+# This file is used to generate the headers that is needed for detecting
+# overflows between types at run-time
+#
+# The bin/make_overflow script reads in this file and creates the appropriate
+# file in the src/ directory when the generated header is out of date with
+# respect to this file.
+#
+# Blank lines and lines beginning with '#' are ignored
+#
+# The format of this file is as follows:
+#  <type>, <SIGNED|UNSIGNED>;
+#
+# Where <type> is a valid C type (like 'int8_t', 'hssize_t', etc. and whether
+#       the type is signed or unsigned follows.
+#
+# Programmer: Quincey Koziol
+# Creation Date: 2009/04/09
+
+unsigned, UNSIGNED;
+int, SIGNED;
+uint8_t, UNSIGNED;
+uint16_t, UNSIGNED;
+uint32_t, UNSIGNED;
+uint64_t, UNSIGNED;
+ptrdiff_t, SIGNED;
+size_t, UNSIGNED;
+ssize_t, SIGNED;
+haddr_t, UNSIGNED;
+hsize_t, UNSIGNED;
+hssize_t, SIGNED;
+h5_stat_size_t, UNSIGNED;
diff --git a/gatb-core/thirdparty/hdf5/src/H5private.h b/gatb-core/thirdparty/hdf5/src/H5private.h
new file mode 100644
index 0000000..2e2516a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5private.h
@@ -0,0 +1,2122 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Robb Matzke <matzke at llnl.gov>
+ *    Friday, October 30, 1998
+ *
+ * Purpose:  This file is included by all HDF5 library source files to
+ *    define common things which are not defined in the HDF5 API.
+ *    The configuration constants like H5_HAVE_UNISTD_H etc. are
+ *    defined in H5config.h which is included by H5public.h.
+ *
+ */
+
+#ifndef _H5private_H
+#define _H5private_H
+
+#include "H5public.h"    /* Include Public Definitions    */
+
+/* include the pthread header */
+#ifdef H5_HAVE_THREADSAFE
+ #ifdef H5_HAVE_WIN32_API
+  #ifndef H5_HAVE_WIN_THREADS
+   #ifdef H5_HAVE_PTHREAD_H
+    #include <pthread.h>
+   #endif /* H5_HAVE_PTHREAD_H */
+  #endif /* H5_HAVE_WIN_THREADS */
+ #else /* H5_HAVE_WIN32_API */
+  #ifdef H5_HAVE_PTHREAD_H
+   #include <pthread.h>
+  #endif /* H5_HAVE_PTHREAD_H */
+ #endif /* H5_HAVE_WIN32_API */
+#endif /* H5_HAVE_THREADSAFE */
+
+/*
+ * Include ANSI-C header files.
+ */
+#ifdef H5_STDC_HEADERS
+#   include <assert.h>
+#   include <ctype.h>
+#   include <errno.h>
+#   include <fcntl.h>
+#   include <float.h>
+#   include <limits.h>
+#   include <math.h>
+#   include <signal.h>
+#   include <stdarg.h>
+#   include <stdio.h>
+#   include <stdlib.h>
+#   include <string.h>
+#endif
+
+/*
+ * If _POSIX_VERSION is defined in unistd.h then this system is Posix.1
+ * compliant. Otherwise all bets are off.
+ */
+#ifdef H5_HAVE_UNISTD_H
+#   include <sys/types.h>
+#   include <unistd.h>
+#endif
+#ifdef _POSIX_VERSION
+#   include <sys/wait.h>
+#   include <pwd.h>
+#endif
+
+/*
+ * C9x integer types
+ */
+#ifndef __cplusplus
+#ifdef H5_HAVE_STDINT_H
+#   include <stdint.h>
+#endif
+#endif
+
+/*
+ * The `struct stat' data type for stat() and fstat(). This is a Posix file
+ * but often apears on non-Posix systems also.  The `struct stat' is required
+ * for hdf5 to compile, although only a few fields are actually used.
+ */
+#ifdef H5_HAVE_SYS_STAT_H
+#   include <sys/stat.h>
+#endif
+
+/*
+ * If a program may include both `time.h' and `sys/time.h' then
+ * TIME_WITH_SYS_TIME is defined (see AC_HEADER_TIME in configure.ac).
+ * On some older systems, `sys/time.h' includes `time.h' but `time.h' is not
+ * protected against multiple inclusion, so programs should not explicitly
+ * include both files. This macro is useful in programs that use, for example,
+ * `struct timeval' or `struct timezone' as well as `struct tm'.  It is best
+ * used in conjunction with `HAVE_SYS_TIME_H', whose existence is checked
+ * by `AC_CHECK_HEADERS(sys/time.h)' in configure.ac.
+ */
+#if defined(H5_TIME_WITH_SYS_TIME)
+#   include <sys/time.h>
+#   include <time.h>
+#elif defined(H5_HAVE_SYS_TIME_H)
+#   include <sys/time.h>
+#else
+#   include <time.h>
+#endif
+
+/*
+ * Longjumps are used to detect alignment constrants
+ */
+#ifdef H5_HAVE_SETJMP_H
+#   include <setjmp.h>
+#endif
+
+/*
+ * Resource usage is not Posix.1 but HDF5 uses it anyway for some performance
+ * and debugging code if available.
+ */
+#ifdef H5_HAVE_SYS_RESOURCE_H
+#   include <sys/resource.h>
+#endif
+
+/*
+ * Unix ioctls.   These are used by h5ls (and perhaps others) to determine a
+ * resonable output width.
+ */
+#ifdef H5_HAVE_SYS_IOCTL_H
+#   include <sys/ioctl.h>
+#endif
+
+/*
+ * System information. These are needed on the DEC Alpha to turn off fixing
+ * of unaligned accesses by the operating system during detection of
+ * alignment constraints in H5detect.c:main().
+ */
+#ifdef H5_HAVE_SYS_SYSINFO_H
+#   include <sys/sysinfo.h>
+#endif
+#ifdef H5_HAVE_SYS_PROC_H
+#   include <sys/proc.h>
+#endif
+#ifdef H5_HAVE_IO_H
+#   include <io.h>
+#endif
+
+/*
+ * Dynamic library handling.  These are needed for dynamically loading I/O
+ * filters and VFDs.
+ */
+#ifdef H5_HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+#ifdef H5_HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+/* Define the default VFD for this platform.
+ * Since the removal of the Windows VFD, this is sec2 for all platforms.
+ */
+#define H5_DEFAULT_VFD      H5FD_SEC2
+
+#ifdef H5_HAVE_WIN32_API
+/* The following two defines must be before any windows headers are included */
+#define WIN32_LEAN_AND_MEAN    /* Exclude rarely-used stuff from Windows headers */
+#define NOGDI                  /* Exclude Graphic Display Interface macros */
+
+#ifdef H5_HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
+#ifdef H5_HAVE_THREADSAFE
+#include <process.h>            /* For _beginthread() */
+#endif
+
+#include <windows.h>
+#include <direct.h>         /* For _getcwd() */
+
+#endif /*H5_HAVE_WIN32_API*/
+
+/* Various ways that inline functions can be declared */
+#if defined(H5_HAVE___INLINE__)
+    /* GNU (alternative form) */
+    #define H5_INLINE __inline__
+#elif defined(H5_HAVE___INLINE)
+    /* Visual Studio */
+    #define H5_INLINE __inline
+#elif defined(H5_HAVE_INLINE)
+    /* GNU, C++
+     * Use "inline" as a last resort on the off-chance that there will
+     * be C++ problems.
+     */
+    #define H5_INLINE inline
+#else
+    #define H5_INLINE
+#endif /* inline choices */
+
+#ifndef F_OK
+#   define F_OK  00
+#   define W_OK 02
+#   define R_OK 04
+#endif
+
+/*
+ * MPE Instrumentation support
+ */
+#ifdef H5_HAVE_MPE
+/*------------------------------------------------------------------------
+ * Purpose:    Begin to collect MPE log information for a function. It should
+ *             be ahead of the actual function's process.
+ *
+ * Programmer: Long Wang
+ *
+ *------------------------------------------------------------------------
+ */
+#include "mpe.h"
+/*
+ * #define eventa(func_name)   h5_mpe_ ## func_name ## _a
+ * #define eventb(func_name)   h5_mpe_ ## func_name ## _b
+ */
+#define eventa(func_name)   h5_mpe_eventa
+#define eventb(func_name)   h5_mpe_eventb
+#define MPE_LOG_VARS                                                    \
+    static int eventa(FUNC) = -1;                                       \
+    static int eventb(FUNC) = -1;                                       \
+    char p_event_start[128];
+
+/* Hardwire the color to "red", since that's what all the routines are using
+ * now.  In the future, if we want to change that color for a given routine,
+ * we should define a "FUNC_ENTER_API_COLOR" macro which takes an extra 'color'
+ * parameter and then make additional FUNC_ENTER_<foo>_COLOR macros to get that
+ * color information down to the BEGIN_MPE_LOG macro (which should have a new
+ * BEGIN_MPE_LOG_COLOR variant). -QAK
+ */
+
+#define BEGIN_MPE_LOG                                                   \
+    if (H5_MPEinit_g){                                                  \
+        sprintf(p_event_start, "start %s", FUNC);                       \
+        if (eventa(FUNC) == -1 && eventb(FUNC) == -1) {                 \
+            const char* p_color = "red";                                \
+            eventa(FUNC)=MPE_Log_get_event_number();                    \
+            eventb(FUNC)=MPE_Log_get_event_number();                    \
+            MPE_Describe_state(eventa(FUNC), eventb(FUNC), FUNC, p_color); \
+        }                                                               \
+        MPE_Log_event(eventa(FUNC), 0, p_event_start);                  \
+    }
+
+
+/*------------------------------------------------------------------------
+ * Purpose:   Finish the collection of MPE log information for a function.
+ *            It should be after the actual function's process.
+ *
+ * Programmer: Long Wang
+ */
+#define FINISH_MPE_LOG                                                  \
+    if (H5_MPEinit_g) {                                                 \
+        MPE_Log_event(eventb(FUNC), 0, FUNC);                           \
+    }
+
+#else /* H5_HAVE_MPE */
+#define MPE_LOG_VARS /* void */
+#define BEGIN_MPE_LOG /* void */
+#define FINISH_MPE_LOG   /* void */
+
+#endif /* H5_HAVE_MPE */
+
+/*
+ * dmalloc (debugging malloc) support
+ */
+#ifdef H5_HAVE_DMALLOC_H
+#include "dmalloc.h"
+#endif /* H5_HAVE_DMALLOC_H */
+
+/*
+ * NT doesn't define SIGBUS, but since NT only runs on processors
+ * that do not have alignment constraints a SIGBUS would never be
+ * raised, so we just replace it with SIGILL (which also should
+ * never be raised by the hdf5 library).
+ */
+#ifndef SIGBUS
+#  define SIGBUS SIGILL
+#endif
+
+/*
+ * Does the compiler support the __attribute__(()) syntax?  It's no
+ * big deal if we don't.
+ */
+#ifdef __cplusplus
+#   define __attribute__(X)  /*void*/
+#else /* __cplusplus */
+#ifndef H5_HAVE_ATTRIBUTE
+#   define __attribute__(X)  /*void*/
+#endif
+#endif /* __cplusplus */
+
+/*
+ * Status return values for the `herr_t' type.
+ * Since some unix/c routines use 0 and -1 (or more precisely, non-negative
+ * vs. negative) as their return code, and some assumption had been made in
+ * the code about that, it is important to keep these constants the same
+ * values.  When checking the success or failure of an integer-valued
+ * function, remember to compare against zero and not one of these two
+ * values.
+ */
+#define SUCCEED    0
+#define FAIL    (-1)
+#define UFAIL    (unsigned)(-1)
+
+/* number of members in an array */
+#ifndef NELMTS
+#    define NELMTS(X)    (sizeof(X)/sizeof(X[0]))
+#endif
+
+/* minimum of two, three, or four values */
+#undef MIN
+#define MIN(a,b)    (((a)<(b)) ? (a) : (b))
+#define MIN2(a,b)    MIN(a,b)
+#define MIN3(a,b,c)    MIN(a,MIN(b,c))
+#define MIN4(a,b,c,d)    MIN(MIN(a,b),MIN(c,d))
+
+/* maximum of two, three, or four values */
+#undef MAX
+#define MAX(a,b)    (((a)>(b)) ? (a) : (b))
+#define MAX2(a,b)    MAX(a,b)
+#define MAX3(a,b,c)    MAX(a,MAX(b,c))
+#define MAX4(a,b,c,d)    MAX(MAX(a,b),MAX(c,d))
+
+/* limit the middle value to be within a range (inclusive) */
+#define RANGE(LO,X,HI)    MAX(LO,MIN(X,HI))
+
+/* absolute value */
+#ifndef ABS
+#   define ABS(a)    (((a)>=0) ? (a) : -(a))
+#endif
+
+/* sign of argument */
+#ifndef SIGN
+#   define SIGN(a)    ((a)>0 ? 1 : (a)<0 ? -1 : 0)
+#endif
+
+/* test for number that is a power of 2 */
+/* (from: http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2) */
+#  define POWER_OF_TWO(n)  (!(n & (n - 1)) && n)
+
+/*
+ * HDF Boolean type.
+ */
+#ifndef FALSE
+#   define FALSE 0
+#endif
+#ifndef TRUE
+#   define TRUE 1
+#endif
+
+/*
+ * Numeric data types.  Some of these might be defined in Posix.1g, otherwise
+ * we define them with the closest available type which is at least as large
+ * as the number of bits indicated in the type name.  The `int8' types *must*
+ * be exactly one byte wide because we use it for pointer calculations to
+ * void* memory.
+ */
+#if H5_SIZEOF_INT8_T==0
+    typedef signed char int8_t;
+#   undef H5_SIZEOF_INT8_T
+#   define H5_SIZEOF_INT8_T H5_SIZEOF_CHAR
+#elif H5_SIZEOF_INT8_T==1
+#else
+#   error "the int8_t type must be 1 byte wide"
+#endif
+
+#if H5_SIZEOF_UINT8_T==0
+    typedef unsigned char uint8_t;
+#   undef H5_SIZEOF_UINT8_T
+#   define H5_SIZEOF_UINT8_T H5_SIZEOF_CHAR
+#elif H5_SIZEOF_UINT8_T==1
+#else
+#   error "the uint8_t type must be 1 byte wide"
+#endif
+
+#if H5_SIZEOF_INT16_T>=2
+#elif H5_SIZEOF_SHORT>=2
+    typedef short int16_t;
+#   undef H5_SIZEOF_INT16_T
+#   define H5_SIZEOF_INT16_T H5_SIZEOF_SHORT
+#elif H5_SIZEOF_INT>=2
+    typedef int int16_t;
+#   undef H5_SIZEOF_INT16_T
+#   define H5_SIZEOF_INT16_T H5_SIZEOF_INT
+#else
+#   error "nothing appropriate for int16_t"
+#endif
+
+#if H5_SIZEOF_UINT16_T>=2
+#elif H5_SIZEOF_SHORT>=2
+    typedef unsigned short uint16_t;
+#   undef H5_SIZEOF_UINT16_T
+#   define H5_SIZEOF_UINT16_T H5_SIZEOF_SHORT
+#elif H5_SIZEOF_INT>=2
+    typedef unsigned uint16_t;
+#   undef H5_SIZEOF_UINT16_T
+#   define H5_SIZEOF_UINT16_T H5_SIZEOF_INT
+#else
+#   error "nothing appropriate for uint16_t"
+#endif
+
+#if H5_SIZEOF_INT32_T>=4
+#elif H5_SIZEOF_SHORT>=4
+    typedef short int32_t;
+#   undef H5_SIZEOF_INT32_T
+#   define H5_SIZEOF_INT32_T H5_SIZEOF_SHORT
+#elif H5_SIZEOF_INT>=4
+    typedef int int32_t;
+#   undef H5_SIZEOF_INT32_T
+#   define H5_SIZEOF_INT32_T H5_SIZEOF_INT
+#elif H5_SIZEOF_LONG>=4
+    typedef long int32_t;
+#   undef H5_SIZEOF_INT32_T
+#   define H5_SIZEOF_INT32_T H5_SIZEOF_LONG
+#else
+#   error "nothing appropriate for int32_t"
+#endif
+
+/*
+ * Maximum and minimum values.  These should be defined in <limits.h> for the
+ * most part.
+ */
+#ifndef LLONG_MAX
+#   define LLONG_MAX  ((long long)(((unsigned long long)1          \
+              <<(8*sizeof(long long)-1))-1))
+#   define LLONG_MIN    ((long long)(-LLONG_MAX)-1)
+#endif
+#ifndef ULLONG_MAX
+#   define ULLONG_MAX  ((unsigned long long)((long long)(-1)))
+#endif
+#ifndef SIZET_MAX
+#   define SIZET_MAX  ((size_t)(ssize_t)(-1))
+#   define SSIZET_MAX  ((ssize_t)(((size_t)1<<(8*sizeof(ssize_t)-1))-1))
+#endif
+
+/*
+ * Maximum & minimum values for our typedefs.
+ */
+#define HSIZET_MAX   ((hsize_t)ULLONG_MAX)
+#define HSSIZET_MAX  ((hssize_t)LLONG_MAX)
+#define HSSIZET_MIN  (~(HSSIZET_MAX))
+
+/*
+ * Types and max sizes for POSIX I/O.
+ * OS X (Darwin) is odd since the max I/O size does not match the types.
+ */
+#if defined(H5_HAVE_WIN32_API)
+#   define h5_posix_io_t                unsigned int
+#   define h5_posix_io_ret_t            int
+#   define H5_POSIX_MAX_IO_BYTES        INT_MAX
+#elif defined(H5_HAVE_DARWIN)
+#   define h5_posix_io_t                size_t
+#   define h5_posix_io_ret_t            ssize_t
+#   define H5_POSIX_MAX_IO_BYTES        INT_MAX
+#else
+#   define h5_posix_io_t                size_t
+#   define h5_posix_io_ret_t            ssize_t
+#   define H5_POSIX_MAX_IO_BYTES        SSIZET_MAX
+#endif
+
+/*
+ * A macro to portably increment enumerated types.
+ */
+#ifndef H5_INC_ENUM
+#  define H5_INC_ENUM(TYPE,VAR) (VAR)=((TYPE)((VAR)+1))
+#endif
+
+/*
+ * A macro to portably decrement enumerated types.
+ */
+#ifndef H5_DEC_ENUM
+#  define H5_DEC_ENUM(TYPE,VAR) (VAR)=((TYPE)((VAR)-1))
+#endif
+
+/* Double constant wrapper
+ * 
+ * Quiets gcc warnings from -Wunsuffixed-float-constants.
+ *
+ * This is a really annoying warning since the standard specifies that
+ * constants of type double do NOT get a suffix so there's no way
+ * to specify a constant of type double. To quiet gcc, we specify floating
+ * point constants as type long double and cast to double.
+ *
+ * Note that this macro only needs to be used where using a double
+ * is important. For most code, suffixing constants with F will quiet the
+ * compiler and not produce erroneous code.
+ */
+#define H5_DOUBLE(S) ((double) S ## L)
+
+/*
+ * Methods to compare the equality of floating-point values:
+ *
+ *    1. H5_XXX_ABS_EQUAL - check if the difference is smaller than the
+ *       Epsilon value.  The Epsilon values, FLT_EPSILON, DBL_EPSILON,
+ *       and LDBL_EPSILON, are defined by compiler in float.h.
+ *
+ *    2. H5_XXX_REL_EQUAL - check if the relative difference is smaller than a
+ *       predefined value M.  See if two values are relatively equal.
+ *       It's the developer's responsibility not to pass in the value 0, which
+ *       may cause the equation to fail.
+ */
+#define H5_FLT_ABS_EQUAL(X,Y)       (HDfabsf(X-Y) < FLT_EPSILON)
+#define H5_DBL_ABS_EQUAL(X,Y)       (HDfabs (X-Y) < DBL_EPSILON)
+#define H5_LDBL_ABS_EQUAL(X,Y)      (HDfabsl(X-Y) < LDBL_EPSILON)
+
+#define H5_FLT_REL_EQUAL(X,Y,M)     (HDfabsf((Y-X) / X) < M)
+#define H5_DBL_REL_EQUAL(X,Y,M)     (HDfabs ((Y-X) / X) < M)
+#define H5_LDBL_REL_EQUAL(X,Y,M)    (HDfabsl((Y-X) / X) < M)
+
+/* KiB, MiB, GiB, TiB, EiB - Used in profiling and timing code */
+#define H5_KB (1024.0F)
+#define H5_MB (1024.0F * 1024.0F)
+#define H5_GB (1024.0F * 1024.0F * 1024.0F)
+#define H5_TB (1024.0F * 1024.0F * 1024.0F * 1024.0F)
+#define H5_EB (1024.0F * 1024.0F * 1024.0F * 1024.0F * 1024.0F)
+
+/*
+ * Data types and functions for timing certain parts of the library.
+ */
+typedef struct {
+    double  utime;    /*user time      */
+    double  stime;    /*system time      */
+    double  etime;    /*elapsed wall-clock time  */
+} H5_timer_t;
+
+H5_DLL void H5_timer_reset (H5_timer_t *timer);
+H5_DLL void H5_timer_begin (H5_timer_t *timer);
+H5_DLL void H5_timer_end (H5_timer_t *sum/*in,out*/,
+         H5_timer_t *timer/*in,out*/);
+H5_DLL void H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds);
+H5_DLL time_t H5_now(void);
+
+/* Depth of object copy */
+typedef enum {
+    H5_COPY_SHALLOW,    /* Shallow copy from source to destination, just copy field pointers */
+    H5_COPY_DEEP        /* Deep copy from source to destination, including duplicating fields pointed to */
+} H5_copy_depth_t;
+
+/* Common object copying udata (right now only used for groups and datasets) */
+typedef struct H5O_copy_file_ud_common_t {
+    struct H5O_pline_t *src_pline;      /* Copy of filter pipeline for object */
+} H5O_copy_file_ud_common_t;
+
+/* Unique object "position" */
+typedef struct {
+    unsigned long fileno;       /* The unique identifier for the file of the object */
+    haddr_t addr;               /* The unique address of the object's header in that file */
+} H5_obj_t;
+
+/*
+ * Redefine all the POSIX functions.  We should never see a POSIX
+ * function (or any other non-HDF5 function) in the source!
+ */
+
+/* Put all platform-specific definitions in the following file */
+/* so that the following definitions are platform free. */
+#include "H5win32defs.h"  /* For Windows-specific definitions */
+
+#ifndef HDabort
+    #define HDabort()    abort()
+#endif /* HDabort */
+#ifndef HDabs
+    #define HDabs(X)    abs(X)
+#endif /* HDabs */
+#ifndef HDaccess
+    #define HDaccess(F,M)    access(F, M)
+#endif /* HDaccess */
+#ifndef HDacos
+    #define HDacos(X)    acos(X)
+#endif /* HDacos */
+#ifndef HDalarm
+    #ifdef H5_HAVE_ALARM
+        #define HDalarm(N)              alarm(N)
+    #else /* H5_HAVE_ALARM */
+        #define HDalarm(N)              (0)
+    #endif /* H5_HAVE_ALARM */
+#endif /* HDalarm */
+#ifndef HDasctime
+    #define HDasctime(T)    asctime(T)
+#endif /* HDasctime */
+#ifndef HDasin
+    #define HDasin(X)    asin(X)
+#endif /* HDasin */
+#ifndef HDasprintf
+    #define HDasprintf    asprintf /*varargs*/
+#endif /* HDasprintf */
+#ifndef HDassert
+    #define HDassert(X)    assert(X)
+#endif /* HDassert */
+#ifndef HDatan
+    #define HDatan(X)    atan(X)
+#endif /* HDatan */
+#ifndef HDatan2
+    #define HDatan2(X,Y)    atan2(X,Y)
+#endif /* HDatan2 */
+#ifndef HDatexit
+    #define HDatexit(F)    atexit(F)
+#endif /* HDatexit */
+#ifndef HDatof
+    #define HDatof(S)    atof(S)
+#endif /* HDatof */
+#ifndef HDatoi
+    #define HDatoi(S)    atoi(S)
+#endif /* HDatoi */
+#ifndef HDatol
+    #define HDatol(S)    atol(S)
+#endif /* HDatol */
+#ifndef HDbsearch
+    #define HDbsearch(K,B,N,Z,F)  bsearch(K,B,N,Z,F)
+#endif /* HDbsearch */
+#ifndef HDcalloc
+    #define HDcalloc(N,Z)    calloc(N,Z)
+#endif /* HDcalloc */
+#ifndef HDceil
+    #define HDceil(X)    ceil(X)
+#endif /* HDceil */
+#ifndef HDcfgetispeed
+    #define HDcfgetispeed(T)  cfgetispeed(T)
+#endif /* HDcfgetispeed */
+#ifndef HDcfgetospeed
+    #define HDcfgetospeed(T)  cfgetospeed(T)
+#endif /* HDcfgetospeed */
+#ifndef HDcfsetispeed
+    #define HDcfsetispeed(T,S)  cfsetispeed(T,S)
+#endif /* HDcfsetispeed */
+#ifndef HDcfsetospeed
+    #define HDcfsetospeed(T,S)  cfsetospeed(T,S)
+#endif /* HDcfsetospeed */
+#ifndef HDchdir
+    #define HDchdir(S)    chdir(S)
+#endif /* HDchdir */
+#ifndef HDchmod
+    #define HDchmod(S,M)    chmod(S,M)
+#endif /* HDchmod */
+#ifndef HDchown
+    #define HDchown(S,O,G)    chown(S,O,G)
+#endif /* HDchown */
+#ifndef HDclearerr
+    #define HDclearerr(F)    clearerr(F)
+#endif /* HDclearerr */
+#ifndef HDclock
+    #define HDclock()    clock()
+#endif /* HDclock */
+#ifndef HDclose
+    #define HDclose(F)    close(F)
+#endif /* HDclose */
+#ifndef HDclosedir
+    #define HDclosedir(D)    closedir(D)
+#endif /* HDclosedir */
+#ifndef HDcos
+    #define HDcos(X)    cos(X)
+#endif /* HDcos */
+#ifndef HDcosh
+    #define HDcosh(X)    cosh(X)
+#endif /* HDcosh */
+#ifndef HDcreat
+    #define HDcreat(S,M)    creat(S,M)
+#endif /* HDcreat */
+#ifndef HDctermid
+    #define HDctermid(S)    ctermid(S)
+#endif /* HDctermid */
+#ifndef HDctime
+    #define HDctime(T)    ctime(T)
+#endif /* HDctime */
+#ifndef HDcuserid
+    #define HDcuserid(S)    cuserid(S)
+#endif /* HDcuserid */
+#ifndef HDdifftime
+    #ifdef H5_HAVE_DIFFTIME
+        #define HDdifftime(X,Y)    difftime(X,Y)
+    #else /* H5_HAVE_DIFFTIME */
+        #define HDdifftime(X,Y)    ((double)(X)-(double)(Y))
+    #endif /* H5_HAVE_DIFFTIME */
+#endif /* HDdifftime */
+#ifndef HDdiv
+    #define HDdiv(X,Y)    div(X,Y)
+#endif /* HDdiv */
+#ifndef HDdup
+    #define HDdup(F)    dup(F)
+#endif /* HDdup */
+#ifndef HDdup2
+    #define HDdup2(F,I)    dup2(F,I)
+#endif /* HDdup2 */
+/* execl() variable arguments */
+/* execle() variable arguments */
+/* execlp() variable arguments */
+#ifndef HDexecv
+    #define HDexecv(S,AV)    execv(S,AV)
+#endif /* HDexecv */
+#ifndef HDexecve
+    #define HDexecve(S,AV,E)  execve(S,AV,E)
+#endif /* HDexecve */
+#ifndef HDexecvp
+    #define HDexecvp(S,AV)    execvp(S,AV)
+#endif /* HDexecvp */
+#ifndef HDexit
+    #define HDexit(N)    exit(N)
+#endif /* HDexit */
+#ifndef HD_exit
+    #define HD_exit(N)    _exit(N)
+#endif /* HD_exit */
+#ifndef HDexp
+    #define HDexp(X)    exp(X)
+#endif /* HDexp */
+#ifndef HDfabs
+    #define HDfabs(X)    fabs(X)
+#endif /* HDfabs */
+/* use ABS() because fabsf() fabsl() are not common yet. */
+#ifndef HDfabsf
+    #define HDfabsf(X)    ABS(X)
+#endif /* HDfabsf */
+#ifndef HDfabsl
+    #define HDfabsl(X)    ABS(X)
+#endif /* HDfabsl */
+#ifndef HDfclose
+    #define HDfclose(F)    fclose(F)
+#endif /* HDfclose */
+/* fcntl() variable arguments */
+#ifndef HDfdopen
+    #define HDfdopen(N,S)    fdopen(N,S)
+#endif /* HDfdopen */
+#ifndef HDfeof
+    #define HDfeof(F)    feof(F)
+#endif /* HDfeof */
+#ifndef HDferror
+    #define HDferror(F)    ferror(F)
+#endif /* HDferror */
+#ifndef HDfflush
+    #define HDfflush(F)    fflush(F)
+#endif /* HDfflush */
+#ifndef HDfgetc
+    #define HDfgetc(F)    fgetc(F)
+#endif /* HDfgetc */
+#ifndef HDfgetpos
+    #define HDfgetpos(F,P)    fgetpos(F,P)
+#endif /* HDfgetpos */
+#ifndef HDfgets
+    #define HDfgets(S,N,F)    fgets(S,N,F)
+#endif /* HDfgets */
+#ifndef HDfileno
+    #define HDfileno(F)    fileno(F)
+#endif /* HDfileno */
+#ifndef HDfloor
+    #define HDfloor(X)    floor(X)
+#endif /* HDfloor */
+#ifndef HDfmod
+    #define HDfmod(X,Y)    fmod(X,Y)
+#endif /* HDfmod */
+#ifndef HDfopen
+    #define HDfopen(S,M)    fopen(S,M)
+#endif /* HDfopen */
+#ifndef HDfork
+    #define HDfork()    fork()
+#endif /* HDfork */
+#ifndef HDfpathconf
+    #define HDfpathconf(F,N)  fpathconf(F,N)
+#endif /* HDfpathconf */
+H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
+#ifndef HDfputc
+    #define HDfputc(C,F)    fputc(C,F)
+#endif /* HDfputc */
+#ifndef HDfputs
+    #define HDfputs(S,F)    fputs(S,F)
+#endif /* HDfputs */
+#ifndef HDfread
+    #define HDfread(M,Z,N,F)  fread(M,Z,N,F)
+#endif /* HDfread */
+#ifndef HDfree
+    #define HDfree(M)    free(M)
+#endif /* HDfree */
+#ifndef HDfreopen
+    #define HDfreopen(S,M,F)  freopen(S,M,F)
+#endif /* HDfreopen */
+#ifndef HDfrexp
+    #define HDfrexp(X,N)    frexp(X,N)
+#endif /* HDfrexp */
+/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
+#ifndef HDfrexpf
+    #ifdef H5_HAVE_FREXPF
+        #define HDfrexpf(X,N)    frexpf(X,N)
+    #else /* H5_HAVE_FREXPF */
+        #define HDfrexpf(X,N)    frexp(X,N)
+    #endif /* H5_HAVE_FREXPF */
+#endif /* HDfrexpf */
+#ifndef HDfrexpl
+    #ifdef H5_HAVE_FREXPL
+        #define HDfrexpl(X,N)    frexpl(X,N)
+    #else /* H5_HAVE_FREXPL */
+        #define HDfrexpl(X,N)    frexp(X,N)
+    #endif /* H5_HAVE_FREXPL */
+#endif /* HDfrexpl */
+/* fscanf() variable arguments */
+#ifndef HDfseek
+    #define HDfseek(F,O,W)  fseeko(F,O,W)
+#endif /* HDfseek */
+#ifndef HDfsetpos
+    #define HDfsetpos(F,P)    fsetpos(F,P)
+#endif /* HDfsetpos */
+#ifndef HDfstat
+    #define HDfstat(F,B)        fstat(F,B)
+#endif /* HDfstat */
+#ifndef HDlstat
+    #define HDlstat(S,B)    lstat(S,B)
+#endif /* HDlstat */
+#ifndef HDstat
+    #define HDstat(S,B)    stat(S,B)
+#endif /* HDstat */
+
+#ifndef H5_HAVE_WIN32_API
+/* These definitions differ in Windows and are defined in
+ * H5win32defs for that platform.
+ */
+typedef struct stat         h5_stat_t;
+typedef off_t               h5_stat_size_t;
+#define HDoff_t             off_t
+#endif /* H5_HAVE_WIN32_API */
+
+#define H5_SIZEOF_H5_STAT_SIZE_T H5_SIZEOF_OFF_T
+
+#ifndef HDftell
+    #define HDftell(F)    ftello(F)
+#endif /* HDftell */
+#ifndef HDftruncate
+    #define HDftruncate(F,L)        ftruncate(F,L)
+#endif /* HDftruncate */
+#ifndef HDfwrite
+    #define HDfwrite(M,Z,N,F)  fwrite(M,Z,N,F)
+#endif /* HDfwrite */
+#ifndef HDgetc
+    #define HDgetc(F)    getc(F)
+#endif /* HDgetc */
+#ifndef HDgetchar
+    #define HDgetchar()    getchar()
+#endif /* HDgetchar */
+#ifndef HDgetcwd
+    #define HDgetcwd(S,Z)    getcwd(S,Z)
+#endif /* HDgetcwd */
+#ifndef HDgetdcwd
+    #define HDgetdcwd(D,S,Z)  getcwd(S,Z)
+#endif /* HDgetdcwd */
+#ifndef HDgetdrive
+    #define HDgetdrive()    0
+#endif /* HDgetdrive */
+#ifndef HDgetegid
+    #define HDgetegid()    getegid()
+#endif /* HDgetegid() */
+#ifndef HDgetenv
+    #define HDgetenv(S)    getenv(S)
+#endif /* HDgetenv */
+#ifndef HDgeteuid
+    #define HDgeteuid()    geteuid()
+#endif /* HDgeteuid */
+#ifndef HDgetgid
+    #define HDgetgid()    getgid()
+#endif /* HDgetgid */
+#ifndef HDgetgrgid
+    #define HDgetgrgid(G)    getgrgid(G)
+#endif /* HDgetgrgid */
+#ifndef HDgetgrnam
+    #define HDgetgrnam(S)    getgrnam(S)
+#endif /* HDgetgrnam */
+#ifndef HDgetgroups
+    #define HDgetgroups(Z,G)  getgroups(Z,G)
+#endif /* HDgetgroups */
+#ifndef HDgethostname
+    #define HDgethostname(N,L)    gethostname(N,L)
+#endif /* HDgetlogin */
+#ifndef HDgetlogin
+    #define HDgetlogin()    getlogin()
+#endif /* HDgetlogin */
+#ifndef HDgetpgrp
+    #define HDgetpgrp()    getpgrp()
+#endif /* HDgetpgrp */
+#ifndef HDgetpid
+    #define HDgetpid()    getpid()
+#endif /* HDgetpid */
+#ifndef HDgetppid
+    #define HDgetppid()    getppid()
+#endif /* HDgetppid */
+#ifndef HDgetpwnam
+    #define HDgetpwnam(S)    getpwnam(S)
+#endif /* HDgetpwnam */
+#ifndef HDgetpwuid
+    #define HDgetpwuid(U)    getpwuid(U)
+#endif /* HDgetpwuid */
+#ifndef HDgetrusage
+    #define HDgetrusage(X,S)  getrusage(X,S)
+#endif /* HDgetrusage */
+#ifndef HDgets
+    #define HDgets(S)    gets(S)
+#endif /* HDgets */
+#ifndef HDgettimeofday
+    #define HDgettimeofday(S,P)  gettimeofday(S,P)
+#endif /* HDgettimeofday */
+#ifndef HDgetuid
+    #define HDgetuid()    getuid()
+#endif /* HDgetuid */
+#ifndef HDgmtime
+    #define HDgmtime(T)    gmtime(T)
+#endif /* HDgmtime */
+#ifndef HDisalnum
+    #define HDisalnum(C)    isalnum((int)(C)) /*cast for solaris warning*/
+#endif /* HDisalnum */
+#ifndef HDisalpha
+    #define HDisalpha(C)    isalpha((int)(C)) /*cast for solaris warning*/
+#endif /* HDisalpha */
+#ifndef HDisatty
+    #define HDisatty(F)    isatty(F)
+#endif /* HDisatty */
+#ifndef HDiscntrl
+    #define HDiscntrl(C)    iscntrl((int)(C)) /*cast for solaris warning*/
+#endif /* HDiscntrl */
+#ifndef HDisdigit
+    #define HDisdigit(C)    isdigit((int)(C)) /*cast for solaris warning*/
+#endif /* HDisdigit */
+#ifndef HDisgraph
+    #define HDisgraph(C)    isgraph((int)(C)) /*cast for solaris warning*/
+#endif /* HDisgraph */
+#ifndef HDislower
+    #define HDislower(C)    islower((int)(C)) /*cast for solaris warning*/
+#endif /* HDislower */
+#ifndef HDisprint
+    #define HDisprint(C)    isprint((int)(C)) /*cast for solaris warning*/
+#endif /* HDisprint */
+#ifndef HDispunct
+    #define HDispunct(C)    ispunct((int)(C)) /*cast for solaris warning*/
+#endif /* HDispunct */
+#ifndef HDisspace
+    #define HDisspace(C)    isspace((int)(C)) /*cast for solaris warning*/
+#endif /* HDisspace */
+#ifndef HDisupper
+    #define HDisupper(C)    isupper((int)(C)) /*cast for solaris warning*/
+#endif /* HDisupper */
+#ifndef HDisxdigit
+    #define HDisxdigit(C)    isxdigit((int)(C)) /*cast for solaris warning*/
+#endif /* HDisxdigit */
+#ifndef HDkill
+    #define HDkill(P,S)    kill(P,S)
+#endif /* HDkill */
+#ifndef HDlabs
+    #define HDlabs(X)    labs(X)
+#endif /* HDlabs */
+#ifndef HDldexp
+    #define HDldexp(X,N)    ldexp(X,N)
+#endif /* HDldexp */
+#ifndef HDldiv
+    #define HDldiv(X,Y)    ldiv(X,Y)
+#endif /* HDldiv */
+#ifndef HDlink
+    #define HDlink(OLD,NEW)    link(OLD,NEW)
+#endif /* HDlink */
+#ifndef HDlocaleconv
+    #define HDlocaleconv()    localeconv()
+#endif /* HDlocaleconv */
+#ifndef HDlocaltime
+    #define HDlocaltime(T)    localtime(T)
+#endif /* HDlocaltime */
+#ifndef HDlog
+    #define HDlog(X)    log(X)
+#endif /* HDlog */
+#ifndef HDlog10
+    #define HDlog10(X)    log10(X)
+#endif /* HDlog10 */
+#ifndef HDlongjmp
+    #define HDlongjmp(J,N)    longjmp(J,N)
+#endif /* HDlongjmp */
+#ifndef HDlseek
+    #define HDlseek(F,O,W)  lseek(F,O,W)
+#endif /* HDlseek */
+#ifndef HDmalloc
+    #define HDmalloc(Z)    malloc(Z)
+#endif /* HDmalloc */
+#ifndef HDposix_memalign
+    #define HDposix_memalign(P,A,Z) posix_memalign(P,A,Z)
+#endif /* HDposix_memalign */
+#ifndef HDmblen
+    #define HDmblen(S,N)    mblen(S,N)
+#endif /* HDmblen */
+#ifndef HDmbstowcs
+    #define HDmbstowcs(P,S,Z)  mbstowcs(P,S,Z)
+#endif /* HDmbstowcs */
+#ifndef HDmbtowc
+    #define HDmbtowc(P,S,Z)    mbtowc(P,S,Z)
+#endif /* HDmbtowc */
+#ifndef HDmemchr
+    #define HDmemchr(S,C,Z)    memchr(S,C,Z)
+#endif /* HDmemchr */
+#ifndef HDmemcmp
+    #define HDmemcmp(X,Y,Z)    memcmp(X,Y,Z)
+#endif /* HDmemcmp */
+/*
+ * The (char*) casts are required for the DEC when optimizations are turned
+ * on and the source and/or destination are not aligned.
+ */
+#ifndef HDmemcpy
+    #define HDmemcpy(X,Y,Z)    memcpy((char*)(X),(const char*)(Y),Z)
+#endif /* HDmemcpy */
+#ifndef HDmemmove
+    #define HDmemmove(X,Y,Z)  memmove((char*)(X),(const char*)(Y),Z)
+#endif /* HDmemmove */
+#ifndef HDmemset
+    #define HDmemset(X,C,Z)    memset(X,C,Z)
+#endif /* HDmemset */
+#ifndef HDmkdir
+    #define HDmkdir(S,M)    mkdir(S,M)
+#endif /* HDmkdir */
+#ifndef HDmkfifo
+    #define HDmkfifo(S,M)    mkfifo(S,M)
+#endif /* HDmkfifo */
+#ifndef HDmktime
+    #define HDmktime(T)    mktime(T)
+#endif /* HDmktime */
+#ifndef HDmodf
+    #define HDmodf(X,Y)    modf(X,Y)
+#endif /* HDmodf */
+#ifndef HDopen
+    #ifdef _O_BINARY
+        #define HDopen(S,F,M)    open(S,F|_O_BINARY,M)
+    #else
+        #define HDopen(S,F,M)    open(S,F,M)
+    #endif
+#endif /* HDopen */
+#ifndef HDopendir
+    #define HDopendir(S)    opendir(S)
+#endif /* HDopendir */
+#ifndef HDpathconf
+    #define HDpathconf(S,N)    pathconf(S,N)
+#endif /* HDpathconf */
+#ifndef HDpause
+    #define HDpause()    pause()
+#endif /* HDpause */
+#ifndef HDperror
+    #define HDperror(S)    perror(S)
+#endif /* HDperror */
+#ifndef HDpipe
+    #define HDpipe(F)    pipe(F)
+#endif /* HDpipe */
+#ifndef HDpow
+    #define HDpow(X,Y)    pow(X,Y)
+#endif /* HDpow */
+/* printf() variable arguments */
+#ifndef HDputc
+    #define HDputc(C,F)    putc(C,F)
+#endif /* HDputc*/
+#ifndef HDputchar
+    #define HDputchar(C)    putchar(C)
+#endif /* HDputchar */
+#ifndef HDputs
+    #define HDputs(S)    puts(S)
+#endif /* HDputs */
+#ifndef HDqsort
+    #define HDqsort(M,N,Z,F)  qsort(M,N,Z,F)
+#endif /* HDqsort*/
+#ifndef HDraise
+    #define HDraise(N)    raise(N)
+#endif /* HDraise */
+
+#ifdef H5_HAVE_RAND_R
+    #ifndef HDrandom
+        #define HDrandom()    HDrand()
+    #endif /* HDrandom */
+    H5_DLL int HDrand(void);
+#elif H5_HAVE_RANDOM
+    #ifndef HDrand
+        #define HDrand()    random()
+    #endif /* HDrand */
+    #ifndef HDrandom
+        #define HDrandom()    random()
+    #endif /* HDrandom */
+#else /* H5_HAVE_RANDOM */
+    #ifndef HDrand
+        #define HDrand()    rand()
+    #endif /* HDrand */
+    #ifndef HDrandom
+        #define HDrandom()    rand()
+    #endif /* HDrandom */
+#endif /* H5_HAVE_RANDOM */
+
+#ifndef HDread
+    #define HDread(F,M,Z)    read(F,M,Z)
+#endif /* HDread */
+#ifndef HDreaddir
+    #define HDreaddir(D)    readdir(D)
+#endif /* HDreaddir */
+#ifndef HDrealloc
+    #define HDrealloc(M,Z)    realloc(M,Z)
+#endif /* HDrealloc */
+#ifndef HDrealpath
+    #define HDrealpath(F1,F2)    realpath(F1,F2)
+#endif /* HDrealloc */
+#ifndef HDremove
+    #define HDremove(S)    remove(S)
+#endif /* HDremove */
+#ifndef HDrename
+    #define HDrename(OLD,NEW)  rename(OLD,NEW)
+#endif /* HDrename */
+#ifndef HDrewind
+    #define HDrewind(F)    rewind(F)
+#endif /* HDrewind */
+#ifndef HDrewinddir
+    #define HDrewinddir(D)    rewinddir(D)
+#endif /* HDrewinddir */
+#ifndef HDrmdir
+    #define HDrmdir(S)    rmdir(S)
+#endif /* HDrmdir */
+/* scanf() variable arguments */
+#ifndef HDsetbuf
+    #define HDsetbuf(F,S)    setbuf(F,S)
+#endif /* HDsetbuf */
+#ifndef HDsetenv
+    #define HDsetenv(N,V,O)    setenv(N,V,O)
+#endif /* HDsetenv */
+#ifndef HDsetgid
+    #define HDsetgid(G)    setgid(G)
+#endif /* HDsetgid */
+#ifndef HDsetjmp
+    #define HDsetjmp(J)    setjmp(J)
+#endif /* HDsetjmp */
+#ifndef HDsetlocale
+    #define HDsetlocale(N,S)  setlocale(N,S)
+#endif /* HDsetlocale */
+#ifndef HDsetpgid
+    #define HDsetpgid(P,PG)    setpgid(P,PG)
+#endif /* HDsetpgid */
+#ifndef HDsetsid
+    #define HDsetsid()    setsid()
+#endif /* HDsetsid */
+#ifndef HDsetuid
+    #define HDsetuid(U)    setuid(U)
+#endif /* HDsetuid */
+#ifndef HDsetvbuf
+    #define HDsetvbuf(F,S,M,Z)  setvbuf(F,S,M,Z)
+#endif /* HDsetvbuf */
+#ifndef HDsigaddset
+    #define HDsigaddset(S,N)  sigaddset(S,N)
+#endif /* HDsigaddset */
+#ifndef HDsigdelset
+    #define HDsigdelset(S,N)  sigdelset(S,N)
+#endif /* HDsigdelset */
+#ifndef HDsigemptyset
+    #define HDsigemptyset(S)  sigemptyset(S)
+#endif /* HDsigemptyset */
+#ifndef HDsigfillset
+    #define HDsigfillset(S)    sigfillset(S)
+#endif /* HDsigfillset */
+#ifndef HDsigismember
+    #define HDsigismember(S,N)  sigismember(S,N)
+#endif /* HDsigismember */
+#ifndef HDsiglongjmp
+    #define HDsiglongjmp(J,N)  siglongjmp(J,N)
+#endif /* HDsiglongjmp */
+#ifndef HDsignal
+    #define HDsignal(N,F)    signal(N,F)
+#endif /* HDsignal */
+#ifndef HDsigpending
+    #define HDsigpending(S)    sigpending(S)
+#endif /* HDsigpending */
+#ifndef HDsigprocmask
+    #define HDsigprocmask(H,S,O)  sigprocmask(H,S,O)
+#endif /* HDsigprocmask */
+#ifndef HDsigsetjmp
+    #define HDsigsetjmp(J,N)  sigsetjmp(J,N)
+#endif /* HDsigsetjmp */
+#ifndef HDsigsuspend
+    #define HDsigsuspend(S)    sigsuspend(S)
+#endif /* HDsigsuspend */
+#ifndef HDsin
+    #define HDsin(X)    sin(X)
+#endif /* HDsin */
+#ifndef HDsinh
+    #define HDsinh(X)    sinh(X)
+#endif /* HDsinh */
+#ifndef HDsleep
+    #define HDsleep(N)    sleep(N)
+#endif /* HDsleep */
+#ifndef HDsnprintf
+    #define HDsnprintf    snprintf /*varargs*/
+#endif /* HDsnprintf */
+#ifndef HDsprintf
+    #define HDsprintf    sprintf /*varargs*/
+#endif /* HDsprintf */
+#ifndef HDsqrt
+    #define HDsqrt(X)    sqrt(X)
+#endif /* HDsqrt */
+#ifdef H5_HAVE_RAND_R
+    H5_DLL void HDsrand(unsigned int seed);
+    #ifndef HDsrandom
+        #define HDsrandom(S)    HDsrand(S)
+    #endif /* HDsrandom */
+#elif H5_HAVE_RANDOM
+    #ifndef HDsrand
+        #define HDsrand(S)    srandom(S)
+    #endif /* HDsrand */
+    #ifndef HDsrandom
+        #define HDsrandom(S)    srandom(S)
+    #endif /* HDsrandom */
+#else /* H5_HAVE_RAND_R */
+    #ifndef HDsrand
+        #define HDsrand(S)    srand(S)
+    #endif /* HDsrand */
+    #ifndef HDsrandom
+        #define HDsrandom(S)    srand(S)
+    #endif /* HDsrandom */
+#endif /* H5_HAVE_RAND_R */
+/* sscanf() variable arguments */
+
+#ifndef HDstrcat
+    #define HDstrcat(X,Y)    strcat(X,Y)
+#endif /* HDstrcat */
+#ifndef HDstrchr
+    #define HDstrchr(S,C)    strchr(S,C)
+#endif /* HDstrchr */
+#ifndef HDstrcmp
+    #define HDstrcmp(X,Y)    strcmp(X,Y)
+#endif /* HDstrcmp */
+#ifndef HDstrcasecmp
+    #define HDstrcasecmp(X,Y)       strcasecmp(X,Y)
+#endif /* HDstrcasecmp */
+#ifndef HDstrcoll
+    #define HDstrcoll(X,Y)    strcoll(X,Y)
+#endif /* HDstrcoll */
+#ifndef HDstrcpy
+    #define HDstrcpy(X,Y)    strcpy(X,Y)
+#endif /* HDstrcpy */
+#ifndef HDstrcspn
+    #define HDstrcspn(X,Y)    strcspn(X,Y)
+#endif /* HDstrcspn */
+#ifndef HDstrerror
+    #define HDstrerror(N)    strerror(N)
+#endif /* HDstrerror */
+#ifndef HDstrftime
+    #define HDstrftime(S,Z,F,T)  strftime(S,Z,F,T)
+#endif /* HDstrftime */
+#ifndef HDstrlen
+    #define HDstrlen(S)    strlen(S)
+#endif /* HDstrlen */
+#ifndef HDstrncat
+    #define HDstrncat(X,Y,Z)  strncat(X,Y,Z)
+#endif /* HDstrncat */
+#ifndef HDstrncmp
+    #define HDstrncmp(X,Y,Z)  strncmp(X,Y,Z)
+#endif /* HDstrncmp */
+#ifndef HDstrncpy
+    #define HDstrncpy(X,Y,Z)  strncpy(X,Y,Z)
+#endif /* HDstrncpy */
+#ifndef HDstrpbrk
+    #define HDstrpbrk(X,Y)    strpbrk(X,Y)
+#endif /* HDstrpbrk */
+#ifndef HDstrrchr
+    #define HDstrrchr(S,C)    strrchr(S,C)
+#endif /* HDstrrchr */
+#ifndef HDstrspn
+    #define HDstrspn(X,Y)    strspn(X,Y)
+#endif /* HDstrspn */
+#ifndef HDstrstr
+    #define HDstrstr(X,Y)    strstr(X,Y)
+#endif /* HDstrstr */
+#ifndef HDstrtod
+    #define HDstrtod(S,R)    strtod(S,R)
+#endif /* HDstrtod */
+#ifndef HDstrtok
+    #define HDstrtok(X,Y)    strtok(X,Y)
+#endif /* HDstrtok */
+#ifndef HDstrtol
+    #define HDstrtol(S,R,N)    strtol(S,R,N)
+#endif /* HDstrtol */
+H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
+#ifndef HDstrtoul
+    #define HDstrtoul(S,R,N)  strtoul(S,R,N)
+#endif /* HDstrtoul */
+#ifndef HDstrtoull
+    #define HDstrtoull(S,R,N)  strtoull(S,R,N)
+#endif /* HDstrtoul */
+#ifndef HDstrxfrm
+    #define HDstrxfrm(X,Y,Z)  strxfrm(X,Y,Z)
+#endif /* HDstrxfrm */
+#ifdef H5_HAVE_SYMLINK
+    #ifndef HDsymlink
+        #define HDsymlink(F1,F2)  symlink(F1,F2)
+    #endif /* HDsymlink */
+#endif /* H5_HAVE_SYMLINK */
+#ifndef HDsysconf
+    #define HDsysconf(N)    sysconf(N)
+#endif /* HDsysconf */
+#ifndef HDsystem
+    #define HDsystem(S)    system(S)
+#endif /* HDsystem */
+#ifndef HDtan
+    #define HDtan(X)    tan(X)
+#endif /* HDtan */
+#ifndef HDtanh
+    #define HDtanh(X)    tanh(X)
+#endif /* HDtanh */
+#ifndef HDtcdrain
+    #define HDtcdrain(F)    tcdrain(F)
+#endif /* HDtcdrain */
+#ifndef HDtcflow
+    #define HDtcflow(F,A)    tcflow(F,A)
+#endif /* HDtcflow */
+#ifndef HDtcflush
+    #define HDtcflush(F,N)    tcflush(F,N)
+#endif /* HDtcflush */
+#ifndef HDtcgetattr
+    #define HDtcgetattr(F,T)  tcgetattr(F,T)
+#endif /* HDtcgetattr */
+#ifndef HDtcgetpgrp
+    #define HDtcgetpgrp(F)    tcgetpgrp(F)
+#endif /* HDtcgetpgrp */
+#ifndef HDtcsendbreak
+    #define HDtcsendbreak(F,N)  tcsendbreak(F,N)
+#endif /* HDtcsendbreak */
+#ifndef HDtcsetattr
+    #define HDtcsetattr(F,O,T)  tcsetattr(F,O,T)
+#endif /* HDtcsetattr */
+#ifndef HDtcsetpgrp
+    #define HDtcsetpgrp(F,N)  tcsetpgrp(F,N)
+#endif /* HDtcsetpgrp */
+#ifndef HDtime
+    #define HDtime(T)    time(T)
+#endif /* HDtime */
+#ifndef HDtimes
+    #define HDtimes(T)    times(T)
+#endif /* HDtimes*/
+#ifndef HDtmpfile
+    #define HDtmpfile()    tmpfile()
+#endif /* HDtmpfile */
+#ifndef HDtmpnam
+    #define HDtmpnam(S)    tmpnam(S)
+#endif /* HDtmpnam */
+#ifndef HDtolower
+    #define HDtolower(C)    tolower(C)
+#endif /* HDtolower */
+#ifndef HDtoupper
+    #define HDtoupper(C)    toupper(C)
+#endif /* HDtoupper */
+#ifndef HDttyname
+    #define HDttyname(F)    ttyname(F)
+#endif /* HDttyname */
+#ifndef HDtzset
+    #define HDtzset()    tzset()
+#endif /* HDtzset */
+#ifndef HDumask
+    #define HDumask(N)    umask(N)
+#endif /* HDumask */
+#ifndef HDuname
+    #define HDuname(S)    uname(S)
+#endif /* HDuname */
+#ifndef HDungetc
+    #define HDungetc(C,F)    ungetc(C,F)
+#endif /* HDungetc */
+#ifndef HDunlink
+    #define HDunlink(S)    unlink(S)
+#endif /* HDunlink */
+#ifndef HDutime
+    #define HDutime(S,T)    utime(S,T)
+#endif /* HDutime */
+#ifndef HDva_arg
+    #define HDva_arg(A,T)    va_arg(A,T)
+#endif /* HDva_arg */
+#ifndef HDva_end
+    #define HDva_end(A)    va_end(A)
+#endif /* HDva_end */
+#ifndef HDva_start
+    #define HDva_start(A,P)    va_start(A,P)
+#endif /* HDva_start */
+#ifndef HDvasprintf
+    #define HDvasprintf(RET,FMT,A)  vasprintf(RET,FMT,A)
+#endif /* HDvasprintf */
+#ifndef HDvfprintf
+    #define HDvfprintf(F,FMT,A)  vfprintf(F,FMT,A)
+#endif /* HDvfprintf */
+#ifndef HDvprintf
+    #define HDvprintf(FMT,A)  vprintf(FMT,A)
+#endif /* HDvprintf */
+#ifndef HDvsprintf
+    #define HDvsprintf(S,FMT,A)  vsprintf(S,FMT,A)
+#endif /* HDvsprintf */
+#ifndef HDvsnprintf
+    #define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A)
+#endif /* HDvsnprintf */
+#ifndef HDwait
+    #define HDwait(W)    wait(W)
+#endif /* HDwait */
+#ifndef HDwaitpid
+    #define HDwaitpid(P,W,O)  waitpid(P,W,O)
+#endif /* HDwaitpid */
+#ifndef HDwcstombs
+    #define HDwcstombs(S,P,Z)  wcstombs(S,P,Z)
+#endif /* HDwcstombs */
+#ifndef HDwctomb
+    #define HDwctomb(S,C)    wctomb(S,C)
+#endif /* HDwctomb */
+#ifndef HDwrite
+    #define HDwrite(F,M,Z)    write(F,M,Z)
+#endif /* HDwrite */
+
+/*
+ * And now for a couple non-Posix functions...  Watch out for systems that
+ * define these in terms of macros.
+ */
+#if !defined strdup && !defined H5_HAVE_STRDUP
+extern char *strdup(const char *s);
+#endif
+
+#ifndef HDstrdup
+    #define HDstrdup(S)     strdup(S)
+#endif /* HDstrdup */
+
+#ifndef HDpthread_self
+    #define HDpthread_self()    pthread_self()
+#endif /* HDpthread_self */
+
+/* Use this version of pthread_self for printing the thread ID */
+#ifndef HDpthread_self_ulong
+    #define HDpthread_self_ulong()    ((unsigned long)pthread_self())
+#endif /* HDpthread_self_ulong */
+
+/*
+ * A macro for detecting over/under-flow when casting between types
+ */
+#ifndef NDEBUG
+#define H5_CHECK_OVERFLOW(var, vartype, casttype) \
+{                                                 \
+    casttype _tmp_overflow = (casttype)(var);     \
+    assert((var) == (vartype)_tmp_overflow);      \
+}
+#else /* NDEBUG */
+#define H5_CHECK_OVERFLOW(var, vartype, casttype)
+#endif /* NDEBUG */
+
+/*
+ * A macro for detecting over/under-flow when assigning between types
+ */
+#ifndef NDEBUG
+#define ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)       \
+{                                                       \
+    srctype _tmp_src = (srctype)(src);  \
+    dsttype _tmp_dst = (dsttype)(_tmp_src);  \
+    assert(_tmp_src == (srctype)_tmp_dst);   \
+    (dst) = _tmp_dst;                             \
+}
+
+#define ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)       \
+    (dst) = (dsttype)(src);
+
+#define ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)       \
+{                                                       \
+    srctype _tmp_src = (srctype)(src);  \
+    dsttype _tmp_dst = (dsttype)(_tmp_src);  \
+    assert(_tmp_src >= 0);   \
+    assert(_tmp_src == _tmp_dst);   \
+    (dst) = _tmp_dst;                             \
+}
+
+#define ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)       \
+    (dst) = (dsttype)(src);
+
+#define ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)       \
+{                                                       \
+    srctype _tmp_src = (srctype)(src);  \
+    dsttype _tmp_dst = (dsttype)(_tmp_src);  \
+    assert(_tmp_dst >= 0);   \
+    assert(_tmp_src == (srctype)_tmp_dst);   \
+    (dst) = _tmp_dst;                             \
+}
+
+#define ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)       \
+{                                                       \
+    srctype _tmp_src = (srctype)(src);  \
+    dsttype _tmp_dst = (dsttype)(_tmp_src);  \
+    assert(_tmp_src >= 0);   \
+    assert(_tmp_src == (srctype)_tmp_dst);   \
+    (dst) = _tmp_dst;                             \
+}
+
+#define ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)       \
+    (dst) = (dsttype)(src);
+
+/* Include the generated overflow header file */
+#include "H5overflow.h"
+
+/* Assign a variable to one of a different size (think safer dst = (dsttype)src").
+ * The code generated by the macro checks for overflows.
+ */
+#define H5_CHECKED_ASSIGN(dst, dsttype, src, srctype)  \
+    H5_GLUE4(ASSIGN_,srctype,_TO_,dsttype)(dst,dsttype,src,srctype)\
+
+#else /* NDEBUG */
+#define H5_CHECKED_ASSIGN(dst, dsttype, src, srctype)  \
+    (dst) = (dsttype)(src);
+#endif /* NDEBUG */
+
+#if defined(H5_HAVE_WINDOW_PATH)
+
+/* directory delimiter for Windows: slash and backslash are acceptable on Windows */
+#define H5_DIR_SLASH_SEPC       '/'
+#define H5_DIR_SEPC             '\\'
+#define H5_DIR_SEPS             "\\"
+#define H5_CHECK_DELIMITER(SS)     ((SS == H5_DIR_SEPC) || (SS == H5_DIR_SLASH_SEPC))
+#define H5_CHECK_ABSOLUTE(NAME)    ((HDisalpha(NAME[0])) && (NAME[1] == ':') && (H5_CHECK_DELIMITER(NAME[2])))
+#define H5_CHECK_ABS_DRIVE(NAME)   ((HDisalpha(NAME[0])) && (NAME[1] == ':'))
+#define H5_CHECK_ABS_PATH(NAME)    (H5_CHECK_DELIMITER(NAME[0]))
+
+#define H5_GET_LAST_DELIMITER(NAME, ptr) {                 \
+    char        *slash, *backslash;                     \
+                                                        \
+    slash = HDstrrchr(NAME, H5_DIR_SLASH_SEPC);         \
+    backslash = HDstrrchr(NAME, H5_DIR_SEPC);           \
+    if(backslash > slash)                               \
+        (ptr = backslash);                              \
+    else                                                \
+        (ptr = slash);                                  \
+}
+
+#else /* H5_HAVE_WINDOW_PATH */
+
+#define H5_DIR_SEPC             '/'
+#define H5_DIR_SEPS             "/"
+#define H5_CHECK_DELIMITER(SS)     (SS == H5_DIR_SEPC)
+#define H5_CHECK_ABSOLUTE(NAME)    (H5_CHECK_DELIMITER(*NAME))
+#define H5_CHECK_ABS_DRIVE(NAME)   (0)
+#define H5_CHECK_ABS_PATH(NAME)    (0)
+#define H5_GET_LAST_DELIMITER(NAME, ptr)   ptr = HDstrrchr(NAME, H5_DIR_SEPC);
+
+#endif /* H5_HAVE_WINDOW_PATH */
+
+#define   H5_COLON_SEPC  ':'
+
+
+/* Use FUNC to safely handle variations of C99 __func__ keyword handling */
+#ifdef H5_HAVE_C99_FUNC
+#define FUNC __func__
+#elif defined(H5_HAVE_FUNCTION)
+#define FUNC __FUNCTION__
+#else
+#error "We need __func__ or __FUNCTION__ to test function names!"
+#endif
+
+/*
+ * These macros check whether debugging has been requested for a certain
+ * package at run-time.   Code for debugging is conditionally compiled by
+ * defining constants like `H5X_DEBUG'.   In order to see the output though
+ * the code must be enabled at run-time with an environment variable
+ * HDF5_DEBUG which is a list of packages to debug.
+ *
+ * Note:  If you add/remove items from this enum then be sure to update the
+ *    information about the package in H5_init_library().
+ */
+typedef enum {
+    H5_PKG_A,        /*Attributes      */
+    H5_PKG_AC,        /*Meta data cache    */
+    H5_PKG_B,        /*B-trees      */
+    H5_PKG_D,        /*Datasets      */
+    H5_PKG_E,        /*Error handling    */
+    H5_PKG_F,        /*Files        */
+    H5_PKG_G,        /*Groups      */
+    H5_PKG_HG,        /*Global heap      */
+    H5_PKG_HL,        /*Local heap      */
+    H5_PKG_I,        /*Interface      */
+    H5_PKG_MF,        /*File memory management  */
+    H5_PKG_MM,        /*Core memory management  */
+    H5_PKG_O,        /*Object headers    */
+    H5_PKG_P,        /*Property lists    */
+    H5_PKG_S,        /*Data spaces      */
+    H5_PKG_T,        /*Data types      */
+    H5_PKG_V,        /*Vector functions    */
+    H5_PKG_Z,        /*Raw data filters    */
+    H5_NPKGS        /*Must be last      */
+} H5_pkg_t;
+
+typedef struct H5_debug_open_stream_t {
+    FILE        *stream;                /* Open output stream */
+    struct H5_debug_open_stream_t *next; /* Next open output stream */
+} H5_debug_open_stream_t;
+
+typedef struct H5_debug_t {
+    FILE    *trace;    /*API trace output stream  */
+    hbool_t             ttop;           /*Show only top-level calls?    */
+    hbool_t             ttimes;         /*Show trace event times?       */
+    struct {
+  const char  *name;    /*package name      */
+  FILE    *stream;  /*output stream  or NULL    */
+    } pkg[H5_NPKGS];
+    H5_debug_open_stream_t *open_stream; /* Stack of open output streams */
+} H5_debug_t;
+
+extern H5_debug_t    H5_debug_g;
+#define H5DEBUG(X)    (H5_debug_g.pkg[H5_PKG_##X].stream)
+/* Do not use const else AIX strings does not show it. */
+extern char H5libhdf5_settings[]; /* embedded library information */
+
+/*-------------------------------------------------------------------------
+ * Purpose:  These macros are inserted automatically just after the
+ *    FUNC_ENTER() macro of API functions and are used to trace
+ *    application program execution. Unless H5_DEBUG_API has been
+ *    defined they are no-ops.
+ *
+ * Arguments:  R  - Return type encoded as a string
+ *    T  - Argument types encoded as a string
+ *    A0-An  - Arguments.  The number at the end of the macro name
+ *        indicates the number of arguments.
+ *
+ * Programmer:  Robb Matzke
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_DEBUG_API
+#define H5TRACE_DECL         const char *RTYPE=NULL;                                      \
+                                           double CALLTIME;
+#define H5TRACE0(R,T)         RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T)
+#define H5TRACE1(R,T,A0)       RTYPE=R;                                      \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0)
+#define H5TRACE2(R,T,A0,A1)       RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1)
+#define H5TRACE3(R,T,A0,A1,A2)       RTYPE=R;                                      \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2)
+#define H5TRACE4(R,T,A0,A1,A2,A3)     RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3)
+#define H5TRACE5(R,T,A0,A1,A2,A3,A4)     RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4)
+#define H5TRACE6(R,T,A0,A1,A2,A3,A4,A5)     RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5)
+#define H5TRACE7(R,T,A0,A1,A2,A3,A4,A5,A6) RTYPE=R;                                                     \
+             CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5,#A6,A6)
+#define H5TRACE8(R,T,A0,A1,A2,A3,A4,A5,A6,A7) RTYPE=R;                                                  \
+                                           CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5,#A6,A6,#A7,A7)
+#define H5TRACE9(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8) RTYPE=R;                                               \
+                                           CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5,#A6,A6,#A7,A7,#A8,A8)
+#define H5TRACE10(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9) RTYPE=R;                                           \
+                                           CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5,#A6,A6,#A7,A7,#A8,A8,#A9,A9)
+#define H5TRACE11(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10) RTYPE=R;                                       \
+                                           CALLTIME=H5_trace(NULL,FUNC,T,#A0,A0,#A1,A1,#A2,A2,#A3,A3,   \
+                                                             #A4,A4,#A5,A5,#A6,A6,#A7,A7,#A8,A8,#A9,A9, \
+                                                             #A10,A10)
+#define H5TRACE_RETURN(V)       if (RTYPE) {                                                 \
+                H5_trace(&CALLTIME,FUNC,RTYPE,NULL,V);                    \
+                RTYPE=NULL;                                               \
+             }
+#else
+#define H5TRACE_DECL                      /*void*/
+#define H5TRACE0(R,T)                      /*void*/
+#define H5TRACE1(R,T,A0)                    /*void*/
+#define H5TRACE2(R,T,A0,A1)                    /*void*/
+#define H5TRACE3(R,T,A0,A1,A2)                    /*void*/
+#define H5TRACE4(R,T,A0,A1,A2,A3)                  /*void*/
+#define H5TRACE5(R,T,A0,A1,A2,A3,A4)                  /*void*/
+#define H5TRACE6(R,T,A0,A1,A2,A3,A4,A5)                  /*void*/
+#define H5TRACE7(R,T,A0,A1,A2,A3,A4,A5,A6)              /*void*/
+#define H5TRACE8(R,T,A0,A1,A2,A3,A4,A5,A6,A7)           /*void*/
+#define H5TRACE9(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8)        /*void*/
+#define H5TRACE10(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9)    /*void*/
+#define H5TRACE11(R,T,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10) /*void*/
+#define H5TRACE_RETURN(V)                    /*void*/
+#endif
+
+H5_DLL double H5_trace(const double *calltime, const char *func, const char *type, ...);
+
+
+/*-------------------------------------------------------------------------
+ * Purpose:  Register function entry for library initialization and code
+ *    profiling.
+ *
+ * Notes:  Every file must have a file-scope variable called
+ *    `initialize_interface_g' of type hbool_t which is initialized
+ *    to FALSE.
+ *
+ *    Don't use local variable initializers which contain
+ *    calls to other library functions since the initializer
+ *    would happen before the FUNC_ENTER() gets called.  Don't
+ *    use initializers that require special cleanup code to
+ *    execute if FUNC_ENTER() fails since a failing FUNC_ENTER()
+ *    returns immediately without branching to the `done' label.
+ *
+ * Programmer:  Quincey Koziol
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/* `S' is the name of a function which is being tested to check if it's
+ *  an API function.
+ *
+ *  BADNESS:
+ *      - Underscore at positions 2 or 3 (0-indexed string). Handles
+ *        H5_ and H5X_.
+ *      - Underscore at position 4 if position 3 is uppercase or a digit.
+ *        Handles H5XY_.
+ */
+#define H5_IS_API(S) (\
+    '_'!=((const char *)S)[2]       /* underscore at position 2     */  \
+    && '_'!=((const char *)S)[3]    /* underscore at position 3     */  \
+    && !(                                       /* NOT              */  \
+        ((const char *)S)[4]                    /* pos 4 exists     */  \
+        && (HDisupper(S[3]) || HDisdigit(S[3])) /* pos 3 dig | uc   */  \
+        && '_'==((const char *)S)[4]            /* pos 4 underscore */  \
+    )\
+)
+
+/* `S' is the name of a function which is being tested to check if it's */
+/*      a public API function */
+#define H5_IS_PUB(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && HDislower(S[2])) || \
+    ((HDisdigit(S[2]) || HDisupper(S[2])) && HDislower(S[3])) || \
+    (!S[4] || ((HDisdigit(S[3]) || HDisupper(S[3])) && HDislower(S[4]))))
+
+/* `S' is the name of a function which is being tested to check if it's */
+/*      a private library function */
+#define H5_IS_PRIV(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && '_' == S[2] && HDislower(S[3])) || \
+    ((HDisdigit(S[2]) || HDisupper(S[2])) && '_' == S[3] && HDislower(S[4])) || \
+    ((HDisdigit(S[3]) || HDisupper(S[3])) && '_' == S[4] && HDislower(S[5])))
+
+/* `S' is the name of a function which is being tested to check if it's */
+/*      a package private function */
+#define H5_IS_PKG(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && '_' == S[2] && '_' == S[3] && HDislower(S[4])) || \
+    ((HDisdigit(S[2]) || HDisupper(S[2])) && '_' == S[3] && '_' == S[4] && HDislower(S[5])) || \
+    ((HDisdigit(S[3]) || HDisupper(S[3])) && '_' == S[4] && '_' == S[5] && HDislower(S[6])))
+
+/* global library version information string */
+extern char  H5_lib_vers_info_g[];
+
+/* Lock headers */
+#ifdef H5_HAVE_THREADSAFE
+
+/* Include required thread-safety header */
+#include "H5TSprivate.h"
+
+/* replacement structure for original global variable */
+typedef struct H5_api_struct {
+    H5TS_mutex_t init_lock;  /* API entrance mutex */
+    hbool_t H5_libinit_g;    /* Has the library been initialized? */
+} H5_api_t;
+
+/* Macros for accessing the global variables */
+#define H5_INIT_GLOBAL H5_g.H5_libinit_g
+
+/* Macro for first thread initialization */
+#ifdef H5_HAVE_WIN_THREADS
+#define H5_FIRST_THREAD_INIT InitOnceExecuteOnce(&H5TS_first_init_g, H5TS_win32_process_enter, NULL, NULL);
+#else
+#define H5_FIRST_THREAD_INIT pthread_once(&H5TS_first_init_g, H5TS_pthread_first_thread_init);
+#endif
+
+/* Macros for threadsafe HDF-5 Phase I locks */
+#define H5_API_LOCK                                                           \
+     H5TS_mutex_lock(&H5_g.init_lock);
+#define H5_API_UNLOCK                                                         \
+     H5TS_mutex_unlock(&H5_g.init_lock);
+
+/* Macros for thread cancellation-safe mechanism */
+#define H5_API_UNSET_CANCEL                                                   \
+    H5TS_cancel_count_inc();
+
+#define H5_API_SET_CANCEL                                                     \
+    H5TS_cancel_count_dec();
+
+extern H5_api_t H5_g;
+
+#else /* H5_HAVE_THREADSAFE */
+
+/* disable any first thread init mechanism */
+#define H5_FIRST_THREAD_INIT
+
+/* disable locks (sequential version) */
+#define H5_API_LOCK
+#define H5_API_UNLOCK
+
+/* disable cancelability (sequential version) */
+#define H5_API_UNSET_CANCEL
+#define H5_API_SET_CANCEL
+
+/* extern global variables */
+extern hbool_t H5_libinit_g;    /* Has the library been initialized? */
+
+/* Macros for accessing the global variables */
+#define H5_INIT_GLOBAL H5_libinit_g
+
+#endif /* H5_HAVE_THREADSAFE */
+
+#ifdef H5_HAVE_CODESTACK
+
+/* Include required function stack header */
+#include "H5CSprivate.h"
+
+#define H5_PUSH_FUNC            H5CS_push(FUNC);
+#define H5_POP_FUNC             H5CS_pop();
+#else /* H5_HAVE_CODESTACK */
+#define H5_PUSH_FUNC            /* void */
+#define H5_POP_FUNC             /* void */
+#endif /* H5_HAVE_CODESTACK */
+
+#ifdef H5_HAVE_MPE
+extern hbool_t H5_MPEinit_g;   /* Has the MPE Library been initialized? */
+#endif
+
+/* Macros for defining interface initialization routines */
+#ifdef H5_INTERFACE_INIT_FUNC
+static int    H5_interface_initialize_g = 0;
+static herr_t    H5_INTERFACE_INIT_FUNC(void);
+#define H5_INTERFACE_INIT(err)                  \
+   /* Initialize this interface or bust */              \
+   if (!H5_interface_initialize_g) {                \
+      H5_interface_initialize_g = 1;                \
+      if (H5_INTERFACE_INIT_FUNC()<0) {                \
+         H5_interface_initialize_g = 0;                      \
+         HGOTO_ERROR (H5E_FUNC, H5E_CANTINIT, err,                  \
+            "interface initialization failed")                          \
+      }                              \
+   }
+#else /* H5_INTERFACE_INIT_FUNC */
+#define H5_INTERFACE_INIT(err)
+#endif /* H5_INTERFACE_INIT_FUNC */
+
+
+#ifndef NDEBUG
+#define FUNC_ENTER_CHECK_NAME(asrt)                \
+    {                                \
+        static hbool_t func_check = FALSE;                      \
+                                                                              \
+        if(!func_check) {                     \
+            /* Check function naming status */              \
+            HDassert(asrt);                                    \
+                                                                              \
+            /* Don't check again */                             \
+            func_check = TRUE;                  \
+        } /* end if */                    \
+    } /* end scope */
+#else /* NDEBUG */
+#define FUNC_ENTER_CHECK_NAME(asrt)
+#endif /* NDEBUG */
+
+
+#define FUNC_ENTER_COMMON(asrt)                                    \
+    hbool_t err_occurred = FALSE;                \
+    FUNC_ENTER_CHECK_NAME(asrt);
+
+#define FUNC_ENTER_COMMON_NOERR(asrt)                              \
+    FUNC_ENTER_CHECK_NAME(asrt);
+
+/* Threadsafety initialization code for API routines */
+#define FUNC_ENTER_API_THREADSAFE                                             \
+   /* Initialize the thread-safe code */              \
+   H5_FIRST_THREAD_INIT                                                       \
+                        \
+   /* Grab the mutex for the library */               \
+   H5_API_UNSET_CANCEL                                                        \
+   H5_API_LOCK
+
+/* Local variables for API routines */
+#define FUNC_ENTER_API_VARS                                                   \
+    MPE_LOG_VARS                                                  \
+    H5TRACE_DECL
+
+#define FUNC_ENTER_API_COMMON                         \
+    FUNC_ENTER_API_VARS                                                       \
+    FUNC_ENTER_COMMON(H5_IS_API(FUNC));                      \
+    FUNC_ENTER_API_THREADSAFE;
+
+#define FUNC_ENTER_API_INIT(err)                     \
+   /* Initialize the library */                         \
+   if(!(H5_INIT_GLOBAL)) {                                                    \
+       H5_INIT_GLOBAL = TRUE;                                                 \
+       if(H5_init_library() < 0)                  \
+          HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, err,                  \
+            "library initialization failed")                          \
+   }                              \
+                                                                              \
+   /* Initialize the interface, if appropriate */                  \
+   H5_INTERFACE_INIT(err)                  \
+                                                                              \
+   /* Push the name of this function on the function stack */                 \
+   H5_PUSH_FUNC                                                               \
+                                                                              \
+   BEGIN_MPE_LOG
+
+/* Use this macro for all "normal" API functions */
+#define FUNC_ENTER_API(err) {{                                      \
+    FUNC_ENTER_API_COMMON                                                     \
+    FUNC_ENTER_API_INIT(err);                            \
+    /* Clear thread error stack entering public functions */          \
+    H5E_clear_stack(NULL);                              \
+    {
+
+/*
+ * Use this macro for API functions that shouldn't clear the error stack
+ *      like H5Eprint and H5Ewalk.
+ */
+#define FUNC_ENTER_API_NOCLEAR(err) {{                              \
+    FUNC_ENTER_API_COMMON                                                     \
+    FUNC_ENTER_API_INIT(err);                            \
+    {
+
+/*
+ * Use this macro for API functions that shouldn't perform _any_ initialization
+ *      of the library or an interface, just perform tracing, etc.  Examples
+ *      are: H5check_version, etc.
+ *
+ */
+#define FUNC_ENTER_API_NOINIT {{                                   \
+    FUNC_ENTER_API_COMMON                                                     \
+    H5_PUSH_FUNC                                                              \
+    BEGIN_MPE_LOG                                                             \
+    {
+
+/*
+ * Use this macro for API functions that shouldn't perform _any_ initialization
+ *      of the library or an interface or push themselves on the function
+ *      stack, just perform tracing, etc.  Examples
+ *      are: H5close, H5check_version, etc.
+ *
+ */
+#define FUNC_ENTER_API_NOINIT_NOERR_NOFS {{                       \
+    FUNC_ENTER_API_VARS                                                       \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_API(FUNC));                      \
+    FUNC_ENTER_API_THREADSAFE;                  \
+    BEGIN_MPE_LOG                                                             \
+    {
+
+/* Note: this macro only works when there's _no_ interface initialization routine for the module */
+#define FUNC_ENTER_NOAPI_INIT(err)                     \
+   /* Initialize the interface, if appropriate */                  \
+   H5_INTERFACE_INIT(err)                  \
+                                                                              \
+   /* Push the name of this function on the function stack */                 \
+   H5_PUSH_FUNC            
+
+/* Use this macro for all "normal" non-API functions */
+#define FUNC_ENTER_NOAPI(err) {                                     \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                     \
+    FUNC_ENTER_NOAPI_INIT(err)                          \
+    {
+
+/* Use this macro for all "normal" package-level functions */
+#define FUNC_ENTER_PACKAGE {                                                  \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/* Use this macro for package-level functions which propgate errors, but don't issue them */
+#define FUNC_ENTER_PACKAGE_NOERR {                                            \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/* Use this macro for all "normal" staticly-scoped functions */
+#define FUNC_ENTER_STATIC {                                                   \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/* Use this macro for staticly-scoped functions which propgate errors, but don't issue them */
+#define FUNC_ENTER_STATIC_NOERR {                                             \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/* Use this macro for all non-API functions, which propagate errors, but don't issue them */
+#define FUNC_ENTER_NOAPI_NOERR {                               \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
+    FUNC_ENTER_NOAPI_INIT(-)                          \
+    {
+
+/*
+ * Use this macro for non-API functions which fall into these categories:
+ *      - static functions, since they must be called from a function in the
+ *              interface, the library and interface must already be
+ *              initialized.
+ *      - functions which are called during library shutdown, since we don't
+ *              want to re-initialize the library.
+ */
+#define FUNC_ENTER_NOAPI_NOINIT {                                  \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                     \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/*
+ * Use this macro for non-API functions which fall into these categories:
+ *      - static functions, since they must be called from a function in the
+ *              interface, the library and interface must already be
+ *              initialized.
+ *      - functions which are called during library shutdown, since we don't
+ *              want to re-initialize the library.
+ *      - functions that propagate, but don't issue errors
+ */
+#define FUNC_ENTER_NOAPI_NOINIT_NOERR {                            \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
+    H5_PUSH_FUNC                                                              \
+    {
+
+/*
+ * Use this macro for non-API functions which fall into these categories:
+ *      - functions which shouldn't push their name on the function stack
+ *              (so far, just the H5CS routines themselves)
+ *
+ * This macro is used for functions which fit the above categories _and_
+ * also don't use the 'FUNC' variable (i.e. don't push errors on the error stack)
+ *
+ */
+#define FUNC_ENTER_NOAPI_NOERR_NOFS {                             \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
+    {
+
+/*-------------------------------------------------------------------------
+ * Purpose:  Register function exit for code profiling.  This should be
+ *    the last statement executed by a function.
+ *
+ * Programmer:  Quincey Koziol
+ *
+ *-------------------------------------------------------------------------
+ */
+/* Threadsafety termination code for API routines */
+#define FUNC_LEAVE_API_THREADSAFE                                             \
+    H5_API_UNLOCK                                                             \
+    H5_API_SET_CANCEL
+
+#define FUNC_LEAVE_API(ret_value)                                             \
+        FINISH_MPE_LOG                                                       \
+        H5TRACE_RETURN(ret_value);                \
+        H5_POP_FUNC                                                           \
+        if(err_occurred)                  \
+           (void)H5E_dump_api_stack(TRUE);              \
+        FUNC_LEAVE_API_THREADSAFE                                             \
+        return(ret_value);                  \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+}} /*end scope from beginning of FUNC_ENTER*/
+
+/* Use this macro to match the FUNC_ENTER_API_NOFS macro */
+#define FUNC_LEAVE_API_NOFS(ret_value)                                        \
+        FINISH_MPE_LOG                                                       \
+        H5TRACE_RETURN(ret_value);                \
+        FUNC_LEAVE_API_THREADSAFE                                             \
+        return(ret_value);                  \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+}} /*end scope from beginning of FUNC_ENTER*/
+
+#define FUNC_LEAVE_NOAPI(ret_value)                                           \
+        H5_POP_FUNC                                                           \
+        return(ret_value);                  \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+} /*end scope from beginning of FUNC_ENTER*/
+
+#define FUNC_LEAVE_NOAPI_VOID                                                 \
+        H5_POP_FUNC                                                           \
+        return;                                  \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+} /*end scope from beginning of FUNC_ENTER*/
+
+/*
+ * Use this macro for non-API functions which fall into these categories:
+ *      - functions which didn't push their name on the function stack
+ *              (so far, just the H5CS routines themselves)
+ */
+#define FUNC_LEAVE_NOAPI_NOFS(ret_value)                                      \
+        return(ret_value);                  \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+} /*end scope from beginning of FUNC_ENTER*/
+
+
+/* Macro for "glueing" together items, for re-scanning macros */
+#define H5_GLUE(x,y)       x##y
+#define H5_GLUE3(x,y,z)    x##y##z
+#define H5_GLUE4(w,x,y,z)  w##x##y##z
+
+/* Compile-time "assert" macro */
+#define HDcompile_assert(e)     ((void)sizeof(char[ !!(e) ? 1 : -1]))
+/* Variants that are correct, but generate compile-time warnings in some circumstances:
+  #define HDcompile_assert(e)     do { enum { compile_assert__ = 1 / (e) }; } while(0)
+  #define HDcompile_assert(e)     do { typedef struct { unsigned int b: (e); } x; } while(0)
+*/
+
+/* Private functions, not part of the publicly documented API */
+H5_DLL herr_t H5_init_library(void);
+H5_DLL void H5_term_library(void);
+
+/* Functions to terminate interfaces */
+H5_DLL int H5A_term_interface(void);
+H5_DLL int H5AC_term_interface(void);
+H5_DLL int H5D_term_interface(void);
+H5_DLL int H5E_term_interface(void);
+H5_DLL int H5F_term_interface(void);
+H5_DLL int H5FS_term_interface(void);
+H5_DLL int H5G_term_interface(void);
+H5_DLL int H5I_term_interface(void);
+H5_DLL int H5L_term_interface(void);
+H5_DLL int H5P_term_interface(void);
+H5_DLL int H5PL_term_interface(void);
+H5_DLL int H5R_term_interface(void);
+H5_DLL int H5S_term_interface(void);
+H5_DLL int H5T_term_interface(void);
+H5_DLL int H5Z_term_interface(void);
+
+/* Checksum functions */
+H5_DLL uint32_t H5_checksum_fletcher32(const void *data, size_t len);
+H5_DLL uint32_t H5_checksum_crc(const void *data, size_t len);
+H5_DLL uint32_t H5_checksum_lookup3(const void *data, size_t len, uint32_t initval);
+H5_DLL uint32_t H5_checksum_metadata(const void *data, size_t len, uint32_t initval);
+H5_DLL uint32_t H5_hash_string(const char *str);
+
+/* Functions for building paths, etc. */
+H5_DLL herr_t   H5_build_extpath(const char *name, char **extpath /*out*/);
+H5_DLL herr_t   H5_combine_path(const char *path1, const char *path2, char **full_name /*out*/);
+
+/* Functions for debugging */
+H5_DLL herr_t H5_buffer_dump(FILE *stream, int indent, const uint8_t *buf,
+    const uint8_t *marker, size_t buf_offset, size_t buf_size);
+
+#endif /* _H5private_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5public.h b/gatb-core/thirdparty/hdf5/src/H5public.h
new file mode 100644
index 0000000..df25286
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5public.h
@@ -0,0 +1,344 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains public declarations for the HDF5 module.
+ */
+#ifndef _H5public_H
+#define _H5public_H
+
+/* Include files for public use... */
+/*
+ * Since H5pubconf.h is a generated header file, it is messy to try
+ * to put a #ifndef _H5pubconf_H ... #endif guard in it.
+ * HDF5 has set an internal rule that it is being included here.
+ * Source files should NOT include H5pubconf.h directly but include
+ * it via H5public.h.  The #ifndef _H5public_H guard above would
+ * prevent repeated include.
+ */
+#include "H5pubconf.h"		/*from configure                             */
+
+/* API Version macro wrapper definitions */
+#include "H5version.h"
+
+#ifdef H5_HAVE_FEATURES_H
+#include <features.h>           /*for setting POSIX, BSD, etc. compatibility */
+#endif
+#ifdef H5_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef H5_STDC_HEADERS
+#   include <limits.h>		/*for H5T_NATIVE_CHAR defn in H5Tpublic.h    */
+#endif
+#ifndef __cplusplus
+# ifdef H5_HAVE_STDINT_H
+#   include <stdint.h>		/*for C9x types				     */
+# endif
+#else
+# ifdef H5_HAVE_STDINT_H_CXX
+#   include <stdint.h>		/*for C9x types	when include from C++	     */
+# endif
+#endif
+#ifdef H5_HAVE_INTTYPES_H
+#   include <inttypes.h>        /* For uint64_t on some platforms            */
+#endif
+#ifdef H5_HAVE_STDDEF_H
+#   include <stddef.h>
+#endif
+#ifdef H5_HAVE_PARALLEL
+#   include <mpi.h>
+#ifndef MPI_FILE_NULL		/*MPIO may be defined in mpi.h already       */
+#   include <mpio.h>
+#endif
+#endif
+
+
+/* Include the Windows API adapter header early */
+#include "H5api_adpt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Macros for enabling/disabling particular GCC warnings */
+/* (see the following web-sites for more info:
+ *      http://www.dbp-consulting.com/tutorials/SuppressingGCCWarnings.html
+ *      http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
+ */
+/* These pragmas are only implemented usefully in gcc 4.6+ */
+#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
+    #define H5_GCC_DIAG_STR(s) #s
+    #define H5_GCC_DIAG_JOINSTR(x,y) H5_GCC_DIAG_STR(x ## y)
+    #define H5_GCC_DIAG_DO_PRAGMA(x) _Pragma (#x)
+    #define H5_GCC_DIAG_PRAGMA(x) H5_GCC_DIAG_DO_PRAGMA(GCC diagnostic x)
+
+    #define H5_GCC_DIAG_OFF(x) H5_GCC_DIAG_PRAGMA(push) H5_GCC_DIAG_PRAGMA(ignored H5_GCC_DIAG_JOINSTR(-W,x))
+    #define H5_GCC_DIAG_ON(x) H5_GCC_DIAG_PRAGMA(pop)
+#else
+    #define H5_GCC_DIAG_OFF(x)
+    #define H5_GCC_DIAG_ON(x)
+#endif
+
+/* Version numbers */
+#define H5_VERS_MAJOR	1	/* For major interface/format changes  	     */
+#define H5_VERS_MINOR	8	/* For minor interface/format changes  	     */
+#define H5_VERS_RELEASE	18	/* For tweaks, bug-fixes, or development     */
+#define H5_VERS_SUBRELEASE ""	/* For pre-releases like snap0       */
+				/* Empty string for real releases.           */
+#define H5_VERS_INFO    "HDF5 library version: 1.8.18"      /* Full version string */
+
+#define H5check()	H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR,	      \
+				        H5_VERS_RELEASE)
+
+/* macros for comparing the version */
+#define H5_VERSION_GE(Maj,Min,Rel) \
+       (((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR==Min) && (H5_VERS_RELEASE>=Rel)) || \
+        ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR>Min)) || \
+        (H5_VERS_MAJOR>Maj))
+
+#define H5_VERSION_LE(Maj,Min,Rel) \
+       (((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR==Min) && (H5_VERS_RELEASE<=Rel)) || \
+        ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR<Min)) || \
+        (H5_VERS_MAJOR<Maj))
+
+/*
+ * Status return values.  Failed integer functions in HDF5 result almost
+ * always in a negative value (unsigned failing functions sometimes return
+ * zero for failure) while successfull return is non-negative (often zero).
+ * The negative failure value is most commonly -1, but don't bet on it.  The
+ * proper way to detect failure is something like:
+ *
+ * 	if((dset = H5Dopen2(file, name)) < 0)
+ *	    fprintf(stderr, "unable to open the requested dataset\n");
+ */
+typedef int herr_t;
+
+
+/*
+ * Boolean type.  Successful return values are zero (false) or positive
+ * (true). The typical true value is 1 but don't bet on it.  Boolean
+ * functions cannot fail.  Functions that return `htri_t' however return zero
+ * (false), positive (true), or negative (failure). The proper way to test
+ * for truth from a htri_t function is:
+ *
+ * 	if ((retval = H5Tcommitted(type))>0) {
+ *	    printf("data type is committed\n");
+ *	} else if (!retval) {
+ * 	    printf("data type is not committed\n");
+ *	} else {
+ * 	    printf("error determining whether data type is committed\n");
+ *	}
+ */
+typedef unsigned int hbool_t;
+typedef int htri_t;
+
+/* Define the ssize_t type if it not is defined */
+#if H5_SIZEOF_SSIZE_T==0
+/* Undefine this size, we will re-define it in one of the sections below */
+#undef H5_SIZEOF_SSIZE_T
+#if H5_SIZEOF_SIZE_T==H5_SIZEOF_INT
+typedef int ssize_t;
+#       define H5_SIZEOF_SSIZE_T H5_SIZEOF_INT
+#elif H5_SIZEOF_SIZE_T==H5_SIZEOF_LONG
+typedef long ssize_t;
+#       define H5_SIZEOF_SSIZE_T H5_SIZEOF_LONG
+#elif H5_SIZEOF_SIZE_T==H5_SIZEOF_LONG_LONG
+typedef long long ssize_t;
+#       define H5_SIZEOF_SSIZE_T H5_SIZEOF_LONG_LONG
+#else /* Can't find matching type for ssize_t */
+#   error "nothing appropriate for ssize_t"
+#endif
+#endif
+
+/*
+ * The sizes of file objects have their own types defined here, use a 64-bit
+ * type.
+ */
+#if H5_SIZEOF_LONG_LONG >= 8
+H5_GCC_DIAG_OFF(long-long)
+typedef unsigned long long 	hsize_t;
+typedef signed long long	hssize_t;
+H5_GCC_DIAG_ON(long-long)
+#       define H5_SIZEOF_HSIZE_T H5_SIZEOF_LONG_LONG
+#       define H5_SIZEOF_HSSIZE_T H5_SIZEOF_LONG_LONG
+#else
+#   error "nothing appropriate for hsize_t"
+#endif
+
+/*
+ * File addresses have their own types.
+ */
+#if H5_SIZEOF_INT64_T>=8
+    typedef uint64_t                haddr_t;
+#   define HADDR_UNDEF              ((haddr_t)(int64_t)(-1))
+#   define H5_SIZEOF_HADDR_T        H5_SIZEOF_INT64_T
+#   ifdef H5_HAVE_PARALLEL
+#       define HADDR_AS_MPI_TYPE    MPI_LONG_LONG_INT
+#   endif  /* H5_HAVE_PARALLEL */
+#elif H5_SIZEOF_INT>=8
+    typedef unsigned                haddr_t;
+#   define HADDR_UNDEF              ((haddr_t)(-1))
+#   define H5_SIZEOF_HADDR_T        H5_SIZEOF_INT
+#   ifdef H5_HAVE_PARALLEL
+#       define HADDR_AS_MPI_TYPE    MPI_UNSIGNED
+#   endif  /* H5_HAVE_PARALLEL */
+#elif H5_SIZEOF_LONG>=8
+    typedef unsigned long           haddr_t;
+#   define HADDR_UNDEF              ((haddr_t)(long)(-1))
+#   define H5_SIZEOF_HADDR_T        H5_SIZEOF_LONG
+#   ifdef H5_HAVE_PARALLEL
+#       define HADDR_AS_MPI_TYPE    MPI_UNSIGNED_LONG
+#   endif  /* H5_HAVE_PARALLEL */
+#elif H5_SIZEOF_LONG_LONG>=8
+    typedef unsigned long long      haddr_t;
+#   define HADDR_UNDEF              ((haddr_t)(long long)(-1))
+#   define H5_SIZEOF_HADDR_T        H5_SIZEOF_LONG_LONG
+#   ifdef H5_HAVE_PARALLEL
+#       define HADDR_AS_MPI_TYPE    MPI_LONG_LONG_INT
+#   endif  /* H5_HAVE_PARALLEL */
+#else
+#   error "nothing appropriate for haddr_t"
+#endif
+#if H5_SIZEOF_HADDR_T ==H5_SIZEOF_INT
+#   define H5_PRINTF_HADDR_FMT  "%u"
+#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG
+#   define H5_PRINTF_HADDR_FMT  "%lu"
+#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG_LONG
+#   define H5_PRINTF_HADDR_FMT  "%" H5_PRINTF_LL_WIDTH "u"
+#else
+#   error "nothing appropriate for H5_PRINTF_HADDR_FMT"
+#endif
+#define HADDR_MAX		(HADDR_UNDEF-1)
+
+/* uint32_t type is used for creation order field for messages.  It may be
+ * defined in Posix.1g, otherwise it is defined here.
+ */
+#if H5_SIZEOF_UINT32_T>=4
+#elif H5_SIZEOF_SHORT>=4
+    typedef short uint32_t;
+#   undef H5_SIZEOF_UINT32_T
+#   define H5_SIZEOF_UINT32_T H5_SIZEOF_SHORT
+#elif H5_SIZEOF_INT>=4
+    typedef unsigned int uint32_t;
+#   undef H5_SIZEOF_UINT32_T
+#   define H5_SIZEOF_UINT32_T H5_SIZEOF_INT
+#elif H5_SIZEOF_LONG>=4
+    typedef unsigned long uint32_t;
+#   undef H5_SIZEOF_UINT32_T
+#   define H5_SIZEOF_UINT32_T H5_SIZEOF_LONG
+#else
+#   error "nothing appropriate for uint32_t"
+#endif
+
+/* int64_t type is used for creation order field for links.  It may be
+ * defined in Posix.1g, otherwise it is defined here.
+ */
+#if H5_SIZEOF_INT64_T>=8
+#elif H5_SIZEOF_INT>=8
+    typedef int int64_t;
+#   undef H5_SIZEOF_INT64_T
+#   define H5_SIZEOF_INT64_T H5_SIZEOF_INT
+#elif H5_SIZEOF_LONG>=8
+    typedef long int64_t;
+#   undef H5_SIZEOF_INT64_T
+#   define H5_SIZEOF_INT64_T H5_SIZEOF_LONG
+#elif H5_SIZEOF_LONG_LONG>=8
+    typedef long long int64_t;
+#   undef H5_SIZEOF_INT64_T
+#   define H5_SIZEOF_INT64_T H5_SIZEOF_LONG_LONG
+#else
+#   error "nothing appropriate for int64_t"
+#endif
+
+/* uint64_t type is used for fields for H5O_info_t.  It may be
+ * defined in Posix.1g, otherwise it is defined here.
+ */
+#if H5_SIZEOF_UINT64_T>=8
+#elif H5_SIZEOF_INT>=8
+    typedef unsigned uint64_t;
+#   undef H5_SIZEOF_UINT64_T
+#   define H5_SIZEOF_UINT64_T H5_SIZEOF_INT
+#elif H5_SIZEOF_LONG>=8
+    typedef unsigned long uint64_t;
+#   undef H5_SIZEOF_UINT64_T
+#   define H5_SIZEOF_UINT64_T H5_SIZEOF_LONG
+#elif H5_SIZEOF_LONG_LONG>=8
+    typedef unsigned long long uint64_t;
+#   undef H5_SIZEOF_UINT64_T
+#   define H5_SIZEOF_UINT64_T H5_SIZEOF_LONG_LONG
+#else
+#   error "nothing appropriate for uint64_t"
+#endif
+
+/* Common iteration orders */
+typedef enum {
+    H5_ITER_UNKNOWN = -1,       /* Unknown order */
+    H5_ITER_INC,                /* Increasing order */
+    H5_ITER_DEC,                /* Decreasing order */
+    H5_ITER_NATIVE,             /* No particular order, whatever is fastest */
+    H5_ITER_N		        /* Number of iteration orders */
+} H5_iter_order_t;
+
+/* Iteration callback values */
+/* (Actually, any postive value will cause the iterator to stop and pass back
+ *      that positive value to the function that called the iterator)
+ */
+#define H5_ITER_ERROR   (-1)
+#define H5_ITER_CONT    (0)
+#define H5_ITER_STOP    (1)
+
+/*
+ * The types of indices on links in groups/attributes on objects.
+ * Primarily used for "<do> <foo> by index" routines and for iterating over
+ * links in groups/attributes on objects.
+ */
+typedef enum H5_index_t {
+    H5_INDEX_UNKNOWN = -1,	/* Unknown index type			*/
+    H5_INDEX_NAME,		/* Index on names 			*/
+    H5_INDEX_CRT_ORDER,		/* Index on creation order 		*/
+    H5_INDEX_N			/* Number of indices defined 		*/
+} H5_index_t;
+
+/*
+ * Storage info struct used by H5O_info_t and H5F_info_t
+ */
+typedef struct H5_ih_info_t {
+    hsize_t     index_size;     /* btree and/or list */
+    hsize_t     heap_size;
+} H5_ih_info_t;
+
+/* Functions in H5.c */
+H5_DLL herr_t H5open(void);
+H5_DLL herr_t H5close(void);
+H5_DLL herr_t H5dont_atexit(void);
+H5_DLL herr_t H5garbage_collect(void);
+H5_DLL herr_t H5set_free_list_limits (int reg_global_lim, int reg_list_lim,
+                int arr_global_lim, int arr_list_lim, int blk_global_lim,
+                int blk_list_lim);
+H5_DLL herr_t H5get_libversion(unsigned *majnum, unsigned *minnum,
+				unsigned *relnum);
+H5_DLL herr_t H5check_version(unsigned majnum, unsigned minnum,
+			       unsigned relnum);
+H5_DLL herr_t H5is_library_threadsafe(hbool_t *is_ts);
+H5_DLL herr_t H5free_memory(void *mem);
+H5_DLL void *H5allocate_memory(size_t size, hbool_t clear);
+H5_DLL void *H5resize_memory(void *mem, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _H5public_H */
+ 
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5system.c b/gatb-core/thirdparty/hdf5/src/H5system.c
new file mode 100644
index 0000000..3d43a7d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5system.c
@@ -0,0 +1,919 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:    H5system.c
+ *      Aug 21 2006
+ *      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:    System call wrapper implementations.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"    /* Generic Functions      */
+#include "H5Fprivate.h"    /* File access        */
+#include "H5MMprivate.h"  /* Memory management      */
+#include "H5Eprivate.h"
+
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:  HDfprintf
+ *
+ * Purpose:  Prints the optional arguments under the control of the format
+ *    string FMT to the stream STREAM.  This function takes the
+ *    same format as fprintf(3c) with a few added features:
+ *
+ *    The conversion modifier `H' refers to the size of an
+ *    `hsize_t' or `hssize_t' type.  For instance, "0x%018Hx"
+ *    prints an `hsize_t' value as a hex number right justified and
+ *    zero filled in an 18-character field.
+ *
+ *    The conversion `a' refers to an `haddr_t' type.
+ *
+ * Return:  Success:  Number of characters printed
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, April  9, 1998
+ *
+ * Modifications:
+ *    Robb Matzke, 1999-07-27
+ *    The `%a' format refers to an argument of `haddr_t' type
+ *    instead of `haddr_t*' and the return value is correct.
+ *-------------------------------------------------------------------------
+ */
+int
+HDfprintf(FILE *stream, const char *fmt, ...)
+{
+    int    n=0, nout = 0;
+    int    fwidth, prec;
+    int    zerofill;
+    int    leftjust;
+    int    plussign;
+    int    ldspace;
+    int    prefix;
+    char  modifier[8];
+    int    conv;
+    char  *rest, format_templ[128];
+    int    len;
+    const char  *s;
+    va_list  ap;
+
+    HDassert(stream);
+    HDassert(fmt);
+
+    va_start (ap, fmt);
+    while (*fmt) {
+        fwidth = prec = 0;
+        zerofill = 0;
+        leftjust = 0;
+        plussign = 0;
+        prefix = 0;
+        ldspace = 0;
+        modifier[0] = '\0';
+
+        if ('%'==fmt[0] && '%'==fmt[1]) {
+            HDputc ('%', stream);
+            fmt += 2;
+            nout++;
+        } else if ('%'==fmt[0]) {
+            s = fmt + 1;
+
+            /* Flags */
+            while(HDstrchr("-+ #", *s)) {
+                switch(*s) {
+                    case '-':
+                        leftjust = 1;
+                        break;
+
+                    case '+':
+                        plussign = 1;
+                        break;
+
+                    case ' ':
+                        ldspace = 1;
+                        break;
+
+                    case '#':
+                        prefix = 1;
+                        break;
+
+                    default:
+                        HDassert(0 && "Unknown format flag");
+                } /* end switch */ /*lint !e744 Switch statement doesn't _need_ default */
+                s++;
+            } /* end while */
+
+            /* Field width */
+            if(HDisdigit(*s)) {
+                zerofill = ('0' == *s);
+                fwidth = (int)HDstrtol (s, &rest, 10);
+                s = rest;
+            } /* end if */
+            else if ('*'==*s) {
+                fwidth = va_arg (ap, int);
+                if(fwidth < 0) {
+                    leftjust = 1;
+                    fwidth = -fwidth;
+                }
+                s++;
+            }
+
+            /* Precision */
+            if('.'==*s) {
+                s++;
+                if(HDisdigit(*s)) {
+                    prec = (int)HDstrtol(s, &rest, 10);
+                    s = rest;
+                } else if('*'==*s) {
+                    prec = va_arg(ap, int);
+                    s++;
+                }
+                if(prec < 1)
+                    prec = 1;
+            }
+
+            /* Extra type modifiers */
+            if(HDstrchr("zZHhlqLI", *s)) {
+                switch(*s) {
+                    /*lint --e{506} Don't issue warnings about constant value booleans */
+                    /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */
+                    case 'H':
+                        if(sizeof(hsize_t) < sizeof(long))
+                            modifier[0] = '\0';
+                        else if(sizeof(hsize_t) == sizeof(long)) {
+                            HDstrncpy(modifier, "l", sizeof(modifier));
+                            modifier[sizeof(modifier) - 1] = '\0';
+                        } /* end if */
+                        else {
+                            HDstrncpy(modifier, H5_PRINTF_LL_WIDTH, sizeof(modifier));
+                            modifier[sizeof(modifier) - 1] = '\0';
+                        } /* end else */
+                        break;
+
+                    case 'Z':
+                    case 'z':
+                        if(sizeof(size_t) < sizeof(long))
+                            modifier[0] = '\0';
+                        else if(sizeof(size_t) == sizeof(long)) {
+                            HDstrncpy(modifier, "l", sizeof(modifier));
+                            modifier[sizeof(modifier) - 1] = '\0';
+                        } /* end if */
+                        else {
+                            HDstrncpy(modifier, H5_PRINTF_LL_WIDTH, sizeof(modifier));
+                            modifier[sizeof(modifier) - 1] = '\0';
+                        } /* end else */
+                        break;
+
+                    default:
+                        /* Handle 'I64' modifier for Microsoft's "__int64" type */
+                        if(*s=='I' && *(s+1)=='6' && *(s+2)=='4') {
+                            modifier[0] = *s;
+                            modifier[1] = *(s+1);
+                            modifier[2] = *(s+2);
+                            modifier[3] = '\0';
+                            s += 2; /* Increment over 'I6', the '4' is taken care of below */
+                        } /* end if */
+                        else {
+                            /* Handle 'll' for long long types */
+                            if(*s=='l' && *(s+1)=='l') {
+                                modifier[0] = *s;
+                                modifier[1] = *s;
+                                modifier[2] = '\0';
+                                s++; /* Increment over first 'l', second is taken care of below */
+                            } /* end if */
+                            else {
+                                modifier[0] = *s;
+                                modifier[1] = '\0';
+                            } /* end else */
+                        } /* end else */
+                        break;
+                }
+                s++;
+            }
+
+            /* Conversion */
+            conv = *s++;
+
+            /* Create the format template */
+            len = 0;
+            len += HDsnprintf(format_templ, (sizeof(format_templ) - (size_t)(len + 1)), "%%%s%s%s%s%s", (leftjust ? "-" : ""),
+                    (plussign ? "+" : ""), (ldspace ? " " : ""),
+                    (prefix ? "#" : ""), (zerofill ? "0" : ""));
+            if(fwidth > 0)
+                len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%d", fwidth);
+            if(prec > 0)
+                len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), ".%d", prec);
+            if(*modifier)
+                len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%s", modifier);
+            HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%c", conv);
+
+
+            /* Conversion */
+            switch (conv) {
+                case 'd':
+                case 'i':
+                    if(!HDstrcmp(modifier, "h")) {
+                        short x = (short)va_arg (ap, int);
+                        n = fprintf (stream, format_templ, x);
+                    } else if(!*modifier) {
+                        int x = va_arg (ap, int);
+                        n = fprintf (stream, format_templ, x);
+                    } else if(!HDstrcmp (modifier, "l")) {
+                        long x = va_arg (ap, long);
+                        n = fprintf (stream, format_templ, x);
+                    } else {
+                        int64_t x = va_arg(ap, int64_t);
+                        n = fprintf (stream, format_templ, x);
+                    }
+                    break;
+
+                case 'o':
+                case 'u':
+                case 'x':
+                case 'X':
+                    if(!HDstrcmp(modifier, "h")) {
+                        unsigned short x = (unsigned short)va_arg (ap, unsigned int);
+                        n = fprintf(stream, format_templ, x);
+                    } else if(!*modifier) {
+                        unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */
+                        n = fprintf(stream, format_templ, x);
+                    } else if(!HDstrcmp(modifier, "l")) {
+                        unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
+                        n = fprintf(stream, format_templ, x);
+                    } else {
+                        uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */
+                        n = fprintf(stream, format_templ, x);
+                    }
+                    break;
+
+                case 'f':
+                case 'e':
+                case 'E':
+                case 'g':
+                case 'G':
+                    if(!HDstrcmp(modifier, "h")) {
+                        float x = (float)va_arg(ap, double);
+                        n = fprintf(stream, format_templ, x);
+                    } else if(!*modifier || !HDstrcmp(modifier, "l")) {
+                        double x = va_arg(ap, double);
+                        n = fprintf(stream, format_templ, x);
+                    } else {
+                    /*
+                    * Some compilers complain when `long double' and
+                    * `double' are the same thing.
+                    */
+#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE
+                        long double x = va_arg(ap, long double);
+                        n = fprintf(stream, format_templ, x);
+#else
+                        double x = va_arg(ap, double);
+                        n = fprintf(stream, format_templ, x);
+#endif
+                    }
+                    break;
+
+                case 'a':
+                    {
+                        haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
+
+                        if(H5F_addr_defined(x)) {
+                            len = 0;
+                            len += HDsnprintf(format_templ, (sizeof(format_templ) - (size_t)(len + 1)), "%%%s%s%s%s%s",
+                                (leftjust ? "-" : ""), (plussign ? "+" : ""),
+                                (ldspace ? " " : ""), (prefix ? "#" : ""),
+                                (zerofill ? "0" : ""));
+                            if(fwidth > 0)
+                                len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%d", fwidth);
+
+                            /*lint --e{506} Don't issue warnings about constant value booleans */
+                            /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */
+                            if(sizeof(x) == H5_SIZEOF_INT) {
+                                HDstrncat(format_templ, "u", (sizeof(format_templ) - (size_t)(len + 1)));
+                                len++;
+                            } /* end if */
+                            else if(sizeof(x) == H5_SIZEOF_LONG) {
+                                HDstrncat(format_templ, "lu", (sizeof(format_templ) - (size_t)(len + 1)));
+                                len++;
+                            } /* end if */
+                            else if(sizeof(x) == H5_SIZEOF_LONG_LONG) {
+                                HDstrncat(format_templ, H5_PRINTF_LL_WIDTH, (sizeof(format_templ) - (size_t)(len + 1)));
+                                len += (int)sizeof(H5_PRINTF_LL_WIDTH);
+                                HDstrncat(format_templ, "u", (sizeof(format_templ) - (size_t)(len + 1)));
+                                len++;
+                            }
+                            n = fprintf(stream, format_templ, x);
+                        } else {
+                            len = 0;
+                            HDstrncpy(format_templ, "%", (sizeof(format_templ) - (size_t)(len + 1)));
+                            len++;
+                            if(leftjust) {
+                                HDstrncat(format_templ, "-", (sizeof(format_templ) - (size_t)(len + 1)));
+                                len++;
+                            } /* end if */
+                            if(fwidth)
+                                len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)),  "%d", fwidth);
+                            HDstrncat(format_templ, "s", (sizeof(format_templ) - (size_t)(len + 1)));
+                            fprintf(stream, format_templ, "UNDEF");
+                        }
+                    }
+                    break;
+
+                case 'c':
+                    {
+                        char x = (char)va_arg(ap, int);
+                        n = fprintf(stream, format_templ, x);
+                    }
+                    break;
+
+                case 's':
+                case 'p':
+                    {
+                        char *x = va_arg(ap, char*); /*lint !e64 Type mismatch not really occuring */
+                        n = fprintf(stream, format_templ, x);
+                    }
+                    break;
+
+                case 'n':
+                    format_templ[HDstrlen(format_templ) - 1] = 'u';
+                    n = fprintf(stream, format_templ, nout);
+                    break;
+
+                case 't':
+                    {
+                        htri_t tri_var = va_arg(ap, htri_t);
+
+                        if(tri_var > 0)
+                            fprintf (stream, "TRUE");
+                        else if(!tri_var)
+                            fprintf(stream, "FALSE");
+                        else
+                            fprintf(stream, "FAIL(%d)", (int)tri_var);
+                    }
+                    break;
+
+                default:
+                    HDfputs(format_templ, stream);
+                    n = (int)HDstrlen(format_templ);
+                    break;
+            }
+            nout += n;
+            fmt = s;
+        } else {
+            HDputc(*fmt, stream);
+            fmt++;
+            nout++;
+        }
+    }
+    va_end(ap);
+    return nout;
+} /* end HDfprintf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  HDstrtoll
+ *
+ * Purpose:  Converts the string S to an int64_t value according to the
+ *    given BASE, which must be between 2 and 36 inclusive, or be
+ *    the special value zero.
+ *
+ *    The string must begin with an arbitrary amount of white space
+ *    (as determined by isspace(3c)) followed by a single optional
+ *              `+' or `-' sign.  If BASE is zero or 16 the string may then
+ *    include a `0x' or `0X' prefix, and the number will be read in
+ *    base 16; otherwise a zero BASE is taken as 10 (decimal)
+ *    unless the next character is a `0', in which case it is taken
+ *    as 8 (octal).
+ *
+ *    The remainder of the string is converted to an int64_t in the
+ *    obvious manner, stopping at the first character which is not
+ *    a valid digit in the given base.  (In bases above 10, the
+ *    letter `A' in either upper or lower case represetns 10, `B'
+ *    represents 11, and so forth, with `Z' representing 35.)
+ *
+ *    If REST is not null, the address of the first invalid
+ *    character in S is stored in *REST.  If there were no digits
+ *    at all, the original value of S is stored in *REST.  Thus, if
+ *    *S is not `\0' but **REST is `\0' on return the entire string
+ *    was valid.
+ *
+ * Return:  Success:  The result.
+ *
+ *    Failure:  If the input string does not contain any
+ *        digits then zero is returned and REST points
+ *        to the original value of S.  If an overflow
+ *        or underflow occurs then the maximum or
+ *        minimum possible value is returned and the
+ *        global `errno' is set to ERANGE.  If BASE is
+ *        incorrect then zero is returned.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, April  9, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int64_t
+HDstrtoll(const char *s, const char **rest, int base)
+{
+    int64_t  sign=1, acc=0;
+    hbool_t  overflow = FALSE;
+
+    errno = 0;
+    if (!s || (base && (base<2 || base>36))) {
+        if (rest)
+            *rest = s;
+        return 0;
+    }
+
+    /* Skip white space */
+    while (HDisspace (*s)) s++;
+
+    /* Optional minus or plus sign */
+    if ('+'==*s) {
+        s++;
+    } else if ('-'==*s) {
+        sign = -1;
+        s++;
+    }
+
+    /* Zero base prefix */
+    if (0==base && '0'==*s && ('x'==s[1] || 'X'==s[1])) {
+        base = 16;
+        s += 2;
+    } else if (0==base && '0'==*s) {
+        base = 8;
+        s++;
+    } else if (0==base) {
+        base = 10;
+    }
+
+    /* Digits */
+    while ((base<=10 && *s>='0' && *s<'0'+base) ||
+     (base>10 && ((*s>='0' && *s<='9') ||
+      (*s>='a' && *s<'a'+base-10) ||
+      (*s>='A' && *s<'A'+base-10)))) {
+        if (!overflow) {
+            int64_t digit = 0;
+
+            if (*s>='0' && *s<='9')
+                digit = *s - '0';
+            else if (*s>='a' && *s<='z')
+                digit = (*s-'a')+10;
+            else
+                digit = (*s-'A')+10;
+
+            if (acc*base+digit < acc) {
+                overflow = TRUE;
+            } else {
+                acc = acc*base + digit;
+            }
+        }
+        s++;
+    }
+
+    /* Overflow */
+    if (overflow) {
+        if (sign>0) {
+            acc = ((uint64_t)1<<(8*sizeof(int64_t)-1))-1;
+        } else {
+            acc = (int64_t)((uint64_t)1<<(8*sizeof(int64_t)-1));
+        }
+        errno = ERANGE;
+    }
+
+    /* Return values */
+    acc *= sign;
+    if (rest)
+        *rest = s;
+    return acc;
+} /* end HDstrtoll() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  HDrand/HDsrand
+ *
+ * Purpose:  Wrapper function for rand.  If rand_r exists on this system,
+ *     use it.
+ *
+ *     Wrapper function for srand.  If rand_r is available, it will keep
+ *     track of the seed locally instead of using srand() which modifies
+ *     global state and can break other programs.
+ *
+ * Return:  Success:  Random number from 0 to RAND_MAX
+ *
+ *    Failure:  Cannot fail.
+ *
+ * Programmer:  Leon Arber
+ *              March 6, 2006.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_RAND_R
+
+static unsigned int g_seed = 42;
+
+int HDrand(void)
+{
+    return rand_r(&g_seed);
+}
+
+void HDsrand(unsigned int seed)
+{
+    g_seed = seed;
+}
+#endif /* H5_HAVE_RAND_R */
+
+
+/*-------------------------------------------------------------------------
+ * Function:  Wgettimeofday
+ *
+ * Purpose:  Wrapper function for gettimeofday on Windows systems
+ *
+ *     This function can get the time as well as a timezone
+ *
+ * Return:  0
+ *
+ *      This implementation is taken from the Cygwin source distribution at
+ *          src/winsup/mingw/mingwex/gettimeofday.c
+ *
+ *      The original source code was contributed by
+ *          Danny Smith <dannysmith at users.sourceforge.net>
+ *      and released in the public domain.
+ *
+ * Programmer:  Scott Wegner
+ *              May 19, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_VISUAL_STUDIO
+
+/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosecond units */
+#define _W32_FT_OFFSET (116444736000000000ULL)
+
+int
+Wgettimeofday(struct timeval *tv, struct timezone *tz)
+{
+  union {
+    unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */
+    FILETIME ft;
+  }  _now;
+
+    static int tzsetflag;
+
+    if(tv) {
+      GetSystemTimeAsFileTime (&_now.ft);
+      tv->tv_usec=(long)((_now.ns100 / 10ULL) % 1000000ULL );
+      tv->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000ULL);
+    }
+
+    if(tz) {
+        if(!tzsetflag) {
+            _tzset();
+            tzsetflag = 1;
+        }
+        tz->tz_minuteswest = _timezone / 60;
+        tz->tz_dsttime = _daylight;
+    }
+
+  /* Always return 0 as per Open Group Base Specifications Issue 6.
+     Do not set errno on error.  */
+  return 0;
+} /* end Wgettimeofday() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    Wsetenv
+ *
+ * Purpose:     Wrapper function for setenv on Windows systems.
+ *              Interestingly, getenv *is* available in the Windows
+ *              POSIX layer, just not setenv.
+ *
+ * Return:      Success:    0
+ *              Failure:    non-zero error code
+ *
+ * Programmer:  Dana Robinson
+ *              February 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+Wsetenv(const char *name, const char *value, int overwrite)
+{
+    size_t bufsize;
+    errno_t err;
+
+    /* If we're not overwriting, check if the environment variable exists.
+     * If it does (i.e.: the required buffer size to store the variable's
+     * value is non-zero), then return an error code.
+     */
+    if(!overwrite) {
+        err = getenv_s(&bufsize, NULL, 0, name);
+        if (err || bufsize)
+            return (int)err;
+    } /* end if */
+
+    return (int)_putenv_s(name, value);
+} /* end Wsetenv() */
+
+#ifdef H5_HAVE_WINSOCK2_H
+#pragma comment(lib, "advapi32.lib")
+#endif
+
+#define WloginBuffer_count 256
+static char Wlogin_buffer[WloginBuffer_count];
+
+char*
+Wgetlogin()
+{
+
+#ifdef H5_HAVE_WINSOCK2_H
+    long bufferCount = WloginBuffer_count;
+    if (GetUserName(Wlogin_buffer, &bufferCount) == 0)
+        return (Wlogin_buffer);
+    else
+#endif /* H5_HAVE_WINSOCK2_H */
+        return NULL;
+}
+
+int c99_snprintf(char* str, size_t size, const char* format, ...)
+{
+    int count;
+    va_list ap;
+
+    va_start(ap, format);
+    count = c99_vsnprintf(str, size, format, ap);
+    va_end(ap);
+
+    return count;
+}
+
+int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
+{
+    int count = -1;
+
+    if (size != 0)
+        count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
+    if (count == -1)
+        count = _vscprintf(format, ap);
+
+    return count;
+}
+
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5_build_extpath
+ *
+ * Purpose:     To build the path for later searching of target file for external
+ *              links and external files.  This path can be either:
+ *                  1. The absolute path of NAME
+ *                      or
+ *                  2. The current working directory + relative path of NAME
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              April 2, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+#define MAX_PATH_LEN     1024
+
+herr_t
+H5_build_extpath(const char *name, char **extpath /*out*/)
+{
+    char        *full_path = NULL;      /* Pointer to the full path, as built or passed in */
+    char        *cwdpath = NULL;        /* Pointer to the current working directory path */
+    char        *new_name = NULL;       /* Pointer to the name of the file */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(name);
+    HDassert(extpath);
+
+    /* Clear external path pointer to begin with */
+    *extpath = NULL;
+
+    /*
+     * Unix: name[0] is a "/"
+     * Windows: name[0-2] is "<drive letter>:\" or "<drive-letter>:/"
+     */
+    if(H5_CHECK_ABSOLUTE(name)) {
+        if(NULL == (full_path = (char *)H5MM_strdup(name)))
+            HGOTO_ERROR(H5E_INTERNAL, H5E_NOSPACE, FAIL, "memory allocation failed")
+    } /* end if */
+    else { /* relative pathname */
+        char *retcwd;
+        size_t name_len;
+        int drive;
+
+        if(NULL == (cwdpath = (char *)H5MM_malloc(MAX_PATH_LEN)))
+            HGOTO_ERROR(H5E_INTERNAL, H5E_NOSPACE, FAIL, "memory allocation failed")
+        name_len = HDstrlen(name) + 1;
+        if(NULL == (new_name = (char *)H5MM_malloc(name_len)))
+            HGOTO_ERROR(H5E_INTERNAL, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /*
+         * Windows: name[0-1] is "<drive-letter>:"
+         *   Get current working directory on the drive specified in NAME
+         * Unix: does not apply
+         */
+        if(H5_CHECK_ABS_DRIVE(name)) {
+            drive = name[0] - 'A' + 1;
+            retcwd = HDgetdcwd(drive, cwdpath, MAX_PATH_LEN);
+            HDstrncpy(new_name, &name[2], name_len);
+        } /* end if */
+       /*
+        * Windows: name[0] is a '/' or '\'
+        *  Get current drive
+        * Unix: does not apply
+        */
+        else if(H5_CHECK_ABS_PATH(name) && (0 != (drive = HDgetdrive()))) {
+            HDsnprintf(cwdpath, MAX_PATH_LEN, "%c:%c", (drive + 'A' - 1), name[0]);
+            retcwd = cwdpath;
+            HDstrncpy(new_name, &name[1], name_len);
+        }
+        /* totally relative for Unix and Windows: get current working directory  */
+        else {
+            retcwd = HDgetcwd(cwdpath, MAX_PATH_LEN);
+            HDstrncpy(new_name, name, name_len);
+        } /* end if */
+
+        if(retcwd != NULL) {
+            size_t cwdlen;
+            size_t path_len;
+
+            HDassert(cwdpath);
+            cwdlen = HDstrlen(cwdpath);
+            HDassert(cwdlen);
+            HDassert(new_name);
+            path_len = cwdlen + HDstrlen(new_name) + 2;
+            if(NULL == (full_path = (char *)H5MM_malloc(path_len)))
+                HGOTO_ERROR(H5E_INTERNAL, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            HDstrncpy(full_path, cwdpath, cwdlen + 1);
+            if(!H5_CHECK_DELIMITER(cwdpath[cwdlen - 1]))
+                HDstrncat(full_path, H5_DIR_SEPS, HDstrlen(H5_DIR_SEPS));
+            HDstrncat(full_path, new_name, HDstrlen(new_name));
+        } /* end if */
+    } /* end else */
+
+    /* strip out the last component (the file name itself) from the path */
+    if(full_path) {
+        char *ptr = NULL;
+
+        H5_GET_LAST_DELIMITER(full_path, ptr)
+        HDassert(ptr);
+        *++ptr = '\0';
+        *extpath = full_path;
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(cwdpath)
+        H5MM_xfree(cwdpath);
+    if(new_name)
+        H5MM_xfree(new_name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5_build_extpath() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5_combine_path
+ *
+ * Purpose:     If path2 is relative, interpret path2 as relative to path1
+ *              and store the result in full_name. Otherwise store path2
+ *              in full_name.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Steffen Kiess
+ *              June 22, 2015
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5_combine_path(const char* path1, const char* path2, char **full_name /*out*/)
+{
+    size_t      path1_len;            /* length of path1 */
+    size_t      path2_len;            /* length of path2 */
+    herr_t      ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(path1);
+    HDassert(path2);
+
+    path1_len = HDstrlen(path1);
+    path2_len = HDstrlen(path2);
+
+    if(*path1 == '\0' || H5_CHECK_ABSOLUTE(path2)) {
+
+        /* If path1 is empty or path2 is absolute, simply use path2 */
+        if(NULL == (*full_name = (char *)H5MM_strdup(path2)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    } /* end if */ 
+    else if(H5_CHECK_ABS_PATH(path2)) {
+
+        /* On windows path2 is a path absolute name */
+        if (H5_CHECK_ABSOLUTE(path1) || H5_CHECK_ABS_DRIVE(path1)) {
+            /* path1 is absolute or drive absolute and path2 is path absolute.
+             * Use the drive letter of path1 + path2
+             */
+            if(NULL == (*full_name = (char *)H5MM_malloc(path2_len + 3)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate path2 buffer")
+            HDsnprintf(*full_name, (path2_len + 3), "%c:%s", path1[0], path2);
+        } /* end if */
+        else {
+            /* On windows path2 is path absolute name ("\foo\bar"),
+             * path1 does not have a drive letter (i.e. is "a\b" or "\a\b").
+             * Use path2.
+             */
+            if(NULL == (*full_name = (char *)H5MM_strdup(path2)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        } /* end else */
+
+    } /* end else if */
+    else {
+
+        /* Relative path2:
+         * Allocate a buffer to hold path1 + path2 + possibly the delimiter
+         *      + terminating null byte
+         */
+        if(NULL == (*full_name = (char *)H5MM_malloc(path1_len + path2_len + 2)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate filename buffer")
+
+        /* Compose the full file name */
+        HDsnprintf(*full_name, (path1_len + path2_len + 2), "%s%s%s", path1,
+                   (H5_CHECK_DELIMITER(path1[path1_len - 1]) ? "" : H5_DIR_SEPS), path2);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5_combine_name() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5timer.c b/gatb-core/thirdparty/hdf5/src/H5timer.c
new file mode 100644
index 0000000..94f2883
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5timer.c
@@ -0,0 +1,273 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5timer.c
+ *			Aug 21 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal 'timer' routines & support routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+
+/* We need this for the struct rusage declaration */
+#if defined(H5_HAVE_GETRUSAGE) && defined(H5_HAVE_SYS_RESOURCE_H)
+#   include <sys/resource.h>
+#endif
+
+#if defined(H5_HAVE_GETTIMEOFDAY) && defined(H5_HAVE_SYS_TIME_H)
+#include <sys/time.h>
+#endif
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_timer_reset
+ *
+ * Purpose:	Resets the timer struct to zero.  Use this to reset a timer
+ *		that's being used as an accumulator for summing times.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5_timer_reset (H5_timer_t *timer)
+{
+    HDassert(timer);
+    HDmemset(timer, 0, sizeof *timer);
+} /* end H5_timer_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_timer_begin
+ *
+ * Purpose:	Initialize a timer to time something.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5_timer_begin (H5_timer_t *timer)
+{
+#ifdef H5_HAVE_GETRUSAGE
+    struct rusage	rusage;
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval	etime;
+#endif
+
+    HDassert(timer);
+
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage (RUSAGE_SELF, &rusage);
+    timer->utime = (double)rusage.ru_utime.tv_sec +
+                   ((double)rusage.ru_utime.tv_usec / 1e6F);
+    timer->stime = (double)rusage.ru_stime.tv_sec +
+                   ((double)rusage.ru_stime.tv_usec / 1e6F);
+#else
+    timer->utime = 0.0F;
+    timer->stime = 0.0F;
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday (&etime, NULL);
+    timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec / 1e6F);
+#else
+    timer->etime = 0.0F;
+#endif
+} /* end H5_timer_begin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_timer_end
+ *
+ * Purpose:	This function should be called at the end of a timed region.
+ *		The SUM is an optional pointer which will accumulate times.
+ *		TMS is the same struct that was passed to H5_timer_start().
+ *		On return, TMS will contain total times for the timed region.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, April 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5_timer_end (H5_timer_t *sum/*in,out*/, H5_timer_t *timer/*in,out*/)
+{
+    H5_timer_t		now;
+
+    HDassert(timer);
+    H5_timer_begin(&now);
+
+    timer->utime = MAX(0.0F, now.utime - timer->utime);
+    timer->stime = MAX(0.0F, now.stime - timer->stime);
+    timer->etime = MAX(0.0F, now.etime - timer->etime);
+
+    if (sum) {
+        sum->utime += timer->utime;
+        sum->stime += timer->stime;
+        sum->etime += timer->etime;
+    }
+} /* end H5_timer_end() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_bandwidth
+ *
+ * Purpose:	Prints the bandwidth (bytes per second) in a field 10
+ *		characters wide widh four digits of precision like this:
+ *
+ * 			       NaN	If <=0 seconds
+ *			1234. TB/s
+ * 			123.4 TB/s
+ *			12.34 GB/s
+ *			1.234 MB/s
+ *			4.000 kB/s
+ *			1.000  B/s
+ *			0.000  B/s	If NBYTES==0
+ *			1.2345e-10	For bandwidth less than 1
+ *			6.7893e+94	For exceptionally large values
+ *			6.678e+106	For really big values
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, August  5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds)
+{
+    double	bw;
+
+    if(nseconds <= 0.0F)
+        HDstrcpy(buf, "       NaN");
+    else {
+        bw = nbytes/nseconds;
+        if(H5_DBL_ABS_EQUAL(bw, 0.0F))
+	        HDstrcpy(buf, "0.000  B/s");
+        else if(bw < 1.0F)
+            sprintf(buf, "%10.4e", bw);
+        else if(bw < H5_KB) {
+            sprintf(buf, "%05.4f", bw);
+            HDstrcpy(buf+5, "  B/s");
+        } else if(bw < H5_MB) {
+            sprintf(buf, "%05.4f", bw / H5_KB);
+            HDstrcpy(buf+5, " kB/s");
+        } else if(bw < H5_GB) {
+            sprintf(buf, "%05.4f", bw / H5_MB);
+            HDstrcpy(buf+5, " MB/s");
+        } else if(bw < H5_TB) {
+            sprintf(buf, "%05.4f", bw / H5_GB);
+            HDstrcpy(buf+5, " GB/s");
+        } else if(bw < H5_EB) {
+            sprintf(buf, "%05.4f", bw / H5_TB);
+            HDstrcpy(buf+5, " TB/s");
+        } else {
+            sprintf(buf, "%10.4e", bw);
+            if(HDstrlen(buf) > 10)
+                sprintf(buf, "%10.3e", bw);
+        }
+    }
+} /* end H5_bandwidth() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_now
+ *
+ * Purpose:	Retrieves the current time, as seconds after the UNIX epoch.
+ *
+ * Return:	# of seconds from the epoch (can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 28, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+time_t
+H5_now(void)
+{
+    time_t	now;                    /* Current time */
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+    {
+        struct timeval now_tv;
+
+        HDgettimeofday(&now_tv, NULL);
+        now = now_tv.tv_sec;
+    }
+#else /* H5_HAVE_GETTIMEOFDAY */
+    now = HDtime(NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    return(now);
+} /* end H5_now() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5trace.c b/gatb-core/thirdparty/hdf5/src/H5trace.c
new file mode 100644
index 0000000..2ee6367
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5trace.c
@@ -0,0 +1,2538 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5trace.c
+ *			Aug 21 2006
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal code for tracing API calls
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Ipkg.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+#ifdef H5_HAVE_PARALLEL
+/* datatypes of predefined drivers needed by H5_trace() */
+#include "H5FDmpio.h"
+#endif /* H5_HAVE_PARALLEL */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_trace
+ *
+ * Purpose:	This function is called whenever an API function is called
+ *		and tracing is turned on.  If RETURNING is non-zero then
+ *		the caller is about to return and RETURNING points to the
+ *              time for the corresponding function call event.  Otherwise
+ *              we print the function name and the arguments.
+ *
+ *		The TYPE argument is a string which gives the type of each of
+ *		the following argument pairs.  Each type is zero or more
+ *		asterisks (one for each level of indirection, although some
+ *		types have one level of indirection already implied) followed
+ *		by either one letter (lower case) or two letters (first one
+ *		uppercase).
+ *
+ *		The variable argument list consists of pairs of values. Each
+ *		pair is a string which is the formal argument name in the
+ *		calling function, followed by the argument value.  The type
+ *		of the argument value is given by the TYPE string.
+ *
+ * Note:	The TYPE string is meant to be terse and is generated by a
+ *		separate perl script.
+ *
+ * WARNING:	DO NOT CALL ANY HDF5 FUNCTION THAT CALLS FUNC_ENTER(). DOING
+ *		SO MAY CAUSE H5_trace() TO BE INVOKED RECURSIVELY OR MAY
+ *		CAUSE LIBRARY INITIALIZATIONS THAT ARE NOT DESIRED.
+ *
+ * Return:	Execution time for an API call
+ *
+ * Programmer:	Robb Matzke
+ *              Tuesday, June 16, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+double
+H5_trace(const double *returning, const char *func, const char *type, ...)
+{
+    va_list		ap;
+    char		buf[64], *rest;
+    const char		*argname;
+    int			argno = 0, ptr, asize_idx;
+    hssize_t		asize[16];
+    hssize_t		i;
+    void		*vp = NULL;
+    FILE		*out = H5_debug_g.trace;
+    H5_timer_t          event_time;
+    static H5_timer_t   first_time = {0.0F, 0.0F, 0.0F};
+    static int          current_depth = 0;
+    static int          last_call_depth = 0;
+
+    /* FUNC_ENTER() should not be called */
+
+    if(!out)
+        return 0.0F;	/*tracing is off*/
+    va_start(ap, type);
+
+    if(H5_debug_g.ttop) {
+        if(returning) {
+            if(current_depth > 1) {
+                --current_depth;
+                return 0.0F;
+            } /* end if */
+        } /* end if */
+        else {
+            if(current_depth > 0) {
+                /*do not update last_call_depth*/
+                current_depth++;
+                return 0.0F;
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+    /* Get time for event */
+    if(HDfabs(first_time.etime) < 0.0000000001F)
+        /* That is == 0.0, but direct comparison between floats is bad */
+        H5_timer_begin(&first_time);
+    if(H5_debug_g.ttimes)
+        H5_timer_begin(&event_time);
+    else
+        HDmemset(&event_time, 0, sizeof event_time);
+
+    /* Print the first part of the line.  This is the indication of the
+     * nesting depth followed by the function name and either start of
+     * argument list or start of return value.  If this call is for a
+     * function return and no other calls have been made to H5_trace()
+     * since the one for the function call, then we're continuing
+     * the same line. */
+    if(returning) {
+        HDassert(current_depth > 0);
+        --current_depth;
+        if(current_depth < last_call_depth) {
+            /* We are at the beginning of a line */
+            if(H5_debug_g.ttimes) {
+                char tmp[128];
+
+                sprintf(tmp, "%.6f", event_time.etime-first_time.etime);
+                fprintf(out, " %*s ", (int)HDstrlen(tmp), "");
+            } /* end if */
+            for(i = 0; i < current_depth; i++)
+                HDfputc('+', out);
+            fprintf(out, "%*s%s = ", 2*current_depth, "", func);
+        } /* end if */
+        else {
+            /* Continue current line with return value */
+            fprintf(out, " = ");
+        } /* end else */
+    } /* end if */
+    else {
+        if(current_depth>last_call_depth)
+            HDfputs(" = <delayed>\n", out);
+        if(H5_debug_g.ttimes)
+            fprintf(out, "@%.6f ", event_time.etime - first_time.etime);
+        for(i = 0; i < current_depth; i++)
+            HDfputc('+', out);
+        fprintf(out, "%*s%s(", 2*current_depth, "", func);
+    } /* end else */
+
+    /* Clear array sizes */
+    for(i = 0; i < (hssize_t)NELMTS(asize); i++)
+        asize[i] = -1;
+
+    /* Parse the argument types */
+    for(argno = 0; *type; argno++, type += (HDisupper(*type) ? 2 : 1)) {
+	/* Count levels of indirection */
+	for(ptr = 0; '*' == *type; type++)
+            ptr++;
+	if('[' == *type) {
+	    if('a' == type[1]) {
+		asize_idx = (int)HDstrtol(type + 2, &rest, 10);
+                HDassert(0 <= asize_idx && asize_idx < (int) NELMTS(asize));
+		HDassert(']'==*rest);
+		type = rest + 1;
+	    } else {
+		rest = (char *)HDstrchr(type, ']');
+		HDassert(rest);
+		type = rest + 1;
+		asize_idx = -1;
+	    }
+	} /* end if */
+        else
+	    asize_idx = -1;
+
+	/*
+	 * The argument name.  Leave off the `_id' part.  If the argument
+	 * name is the null pointer then don't print the argument or the
+	 * following `='.  This is used for return values.
+	 */
+	argname = va_arg(ap, char *); /*lint !e64 Type mismatch not really occuring */
+	if(argname) {
+	    unsigned n = (unsigned)MAX (0, (int)HDstrlen(argname) - 3); /*lint !e666 Allow expression with side effects */
+
+	    if(!HDstrcmp(argname + n, "_id")) {
+		HDstrncpy(buf, argname, (size_t)MIN((int)sizeof(buf) - 1, n));
+		buf[MIN((int)sizeof(buf) - 1, n)] = '\0';
+		argname = buf;
+	    } /* end if */
+	    fprintf(out, "%s%s=", argno?", ":"", argname);
+	} /* end if */
+        else
+	    argname = "";
+
+	/* The value */
+	if(ptr)
+            vp = va_arg(ap, void *); /*lint !e64 Type mismatch not really occuring */
+	switch(type[0]) {
+            case 'a':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    haddr_t addr = va_arg(ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
+
+                    HDfprintf(out, "%a", addr);
+                } /* end else */
+                break;
+
+            case 'b':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    hbool_t bool_var = va_arg(ap, hbool_t); /*lint !e732 Loss of sign not really occuring */
+
+                    if(TRUE == bool_var)
+                        fprintf(out, "TRUE");
+                    else if(!bool_var)
+                        fprintf(out, "FALSE");
+                    else
+                        fprintf(out, "TRUE(%u)", (unsigned)bool_var);
+                }
+                break;
+
+            case 'd':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    double dbl = va_arg(ap, double);
+
+                    fprintf(out, "%g", dbl);
+                } /* end else */
+                break;
+
+            case 'D':
+                switch(type[1]) {
+                    case 'a':
+                        if(ptr) {
+                            if(vp)
+                                fprintf (out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_alloc_time_t alloc_time = (H5D_alloc_time_t)va_arg(ap, int);
+
+                            switch(alloc_time) {
+                                case H5D_ALLOC_TIME_ERROR:
+                                    fprintf(out, "H5D_ALLOC_TIME_ERROR");
+                                    break;
+
+                                case H5D_ALLOC_TIME_DEFAULT:
+                                    fprintf(out, "H5D_ALLOC_TIME_DEFAULT");
+                                    break;
+
+                                case H5D_ALLOC_TIME_EARLY:
+                                    fprintf(out, "H5D_ALLOC_TIME_EARLY");
+                                    break;
+
+                                case H5D_ALLOC_TIME_LATE:
+                                    fprintf(out, "H5D_ALLOC_TIME_LATE");
+                                    break;
+
+                                case H5D_ALLOC_TIME_INCR:
+                                    fprintf(out, "H5D_ALLOC_TIME_INCR");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)alloc_time);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'c':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5FD_mpio_collective_opt_t opt = (H5FD_mpio_collective_opt_t)va_arg(ap, int);
+
+                            switch(opt) {
+                                case H5FD_MPIO_COLLECTIVE_IO:
+                                    fprintf(out, "H5FD_MPIO_COLLECTIVE_IO");
+                                    break;
+
+                                case H5FD_MPIO_INDIVIDUAL_IO:
+                                    fprintf(out, "H5FD_MPIO_INDIVIDUAL_IO");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)opt);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'f':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_fill_time_t fill_time = (H5D_fill_time_t)va_arg(ap, int);
+
+                            switch(fill_time) {
+                                case H5D_FILL_TIME_ERROR:
+                                    fprintf(out, "H5D_FILL_TIME_ERROR");
+                                    break;
+
+                                case H5D_FILL_TIME_ALLOC:
+                                    fprintf(out, "H5D_FILL_TIME_ALLOC");
+                                    break;
+
+                                case H5D_FILL_TIME_NEVER:
+                                    fprintf(out, "H5D_FILL_TIME_NEVER");
+                                    break;
+
+                                case H5D_FILL_TIME_IFSET:
+                                    fprintf(out, "H5D_FILL_TIME_IFSET");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)fill_time);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'F':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_fill_value_t fill_value = (H5D_fill_value_t)va_arg(ap, int);
+
+                            switch(fill_value) {
+                                case H5D_FILL_VALUE_ERROR:
+                                    fprintf(out, "H5D_FILL_VALUE_ERROR");
+                                    break;
+
+                                case H5D_FILL_VALUE_UNDEFINED:
+                                    fprintf(out, "H5D_FILL_VALUE_UNDEFINED");
+                                    break;
+
+                                case H5D_FILL_VALUE_DEFAULT:
+                                    fprintf(out, "H5D_FILL_VALUE_DEFAULT");
+                                    break;
+
+                                case H5D_FILL_VALUE_USER_DEFINED:
+                                    fprintf(out, "H5D_FILL_VALUE_USER_DEFINED");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)fill_value);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'h':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5FD_mpio_chunk_opt_t opt = (H5FD_mpio_chunk_opt_t)va_arg(ap, int);
+
+                            switch(opt) {
+                                case H5FD_MPIO_CHUNK_DEFAULT:
+                                    fprintf(out, "H5FD_MPIO_CHUNK_DEFAULT");
+                                    break;
+
+                                case H5FD_MPIO_CHUNK_ONE_IO:
+                                    fprintf(out, "H5FD_MPIO_CHUNK_ONE_IO");
+                                    break;
+
+                                case H5FD_MPIO_CHUNK_MULTI_IO:
+                                    fprintf(out, "H5FD_MPIO_CHUNK_MULTI_IO");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)opt);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'i':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_mpio_actual_io_mode_t actual_io_mode = (H5D_mpio_actual_io_mode_t)va_arg(ap, int);
+
+                            switch(actual_io_mode) {
+                                case H5D_MPIO_NO_COLLECTIVE:
+                                    fprintf(out, "H5D_MPIO_NO_COLLECTIVE");
+                                    break;
+
+                                case H5D_MPIO_CHUNK_INDEPENDENT:
+                                    fprintf(out, "H5D_MPIO_CHUNK_INDEPENDENT");
+                                    break;
+
+                                case H5D_MPIO_CHUNK_COLLECTIVE:
+                                    fprintf(out, "H5D_MPIO_CHUNK_COLLECTIVE");
+                                    break;
+
+                                case H5D_MPIO_CHUNK_MIXED:
+                                    fprintf(out, "H5D_MPIO_CHUNK_MIXED");
+                                    break;
+
+                                case H5D_MPIO_CONTIGUOUS_COLLECTIVE:
+                                    fprintf(out, "H5D_MPIO_CONTIGUOUS_COLLECTIVE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)actual_io_mode);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'l':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_layout_t layout = (H5D_layout_t)va_arg(ap, int);
+
+                            switch(layout) {
+                                case H5D_LAYOUT_ERROR:
+                                    fprintf(out, "H5D_LAYOUT_ERROR");
+                                    break;
+
+                                case H5D_COMPACT:
+                                    fprintf(out, "H5D_COMPACT");
+                                    break;
+
+                                case H5D_CONTIGUOUS:
+                                    fprintf(out, "H5D_CONTIGUOUS");
+                                    break;
+
+                                case H5D_CHUNKED:
+                                    fprintf(out, "H5D_CHUNKED");
+                                    break;
+
+                                case H5D_NLAYOUTS:
+                                    fprintf(out, "H5D_NLAYOUTS");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)layout);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'n':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_mpio_no_collective_cause_t nocol_cause_mode = (H5D_mpio_no_collective_cause_t)va_arg(ap, int);
+                            hbool_t flag_already_displayed = FALSE;
+
+                            /* Check for all bit-flags which might be set */
+                            if(nocol_cause_mode & H5D_MPIO_COLLECTIVE) {
+                                fprintf(out, "H5D_MPIO_COLLECTIVE");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_SET_INDEPENDENT) {
+                                fprintf(out, "%sH5D_MPIO_SET_INDEPENDENT", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_DATATYPE_CONVERSION) {
+                                fprintf(out, "%sH5D_MPIO_DATATYPE_CONVERSION", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_DATA_TRANSFORMS) {
+                                fprintf(out, "%sH5D_MPIO_DATA_TRANSFORMS", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED) {
+                                fprintf(out, "%sH5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES) {
+                                fprintf(out, "%sH5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET) {
+                                fprintf(out, "%sH5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+                            if(nocol_cause_mode & H5D_MPIO_FILTERS) {
+                                fprintf(out, "%sH5D_MPIO_FILTERS", flag_already_displayed ? " | " : "");
+                                flag_already_displayed = TRUE;
+                            } /* end if */
+
+                            /* Display '<none>' if there's no flags set */
+                            if(!flag_already_displayed)
+                                fprintf(out, "<none>");
+                        } /* end else */
+                        break;
+
+                    case 'o':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_mpio_actual_chunk_opt_mode_t chunk_opt_mode = (H5D_mpio_actual_chunk_opt_mode_t)va_arg(ap, int);
+
+                            switch(chunk_opt_mode) {
+                                case H5D_MPIO_NO_CHUNK_OPTIMIZATION:
+                                    fprintf(out, "H5D_MPIO_NO_CHUNK_OPTIMIZATION");
+                                    break;
+
+                                case H5D_MPIO_LINK_CHUNK:
+                                    fprintf(out, "H5D_MPIO_LINK_CHUNK");
+                                    break;
+
+                                case H5D_MPIO_MULTI_CHUNK:
+                                    fprintf(out, "H5D_MPIO_MULTI_CHUNK");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)chunk_opt_mode);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_space_status_t space_status = (H5D_space_status_t)va_arg(ap, int);
+
+                            switch(space_status) {
+                                case H5D_SPACE_STATUS_NOT_ALLOCATED:
+                                    fprintf(out, "H5D_SPACE_STATUS_NOT_ALLOCATED");
+                                    break;
+
+                                case H5D_SPACE_STATUS_PART_ALLOCATED:
+                                    fprintf(out, "H5D_SPACE_STATUS_PART_ALLOCATED");
+                                    break;
+
+                                case H5D_SPACE_STATUS_ALLOCATED:
+                                    fprintf(out, "H5D_SPACE_STATUS_ALLOCATED");
+                                    break;
+
+                                case H5D_SPACE_STATUS_ERROR:
+                                    fprintf(out, "H5D_SPACE_STATUS_ERROR");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)space_status);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5FD_mpio_xfer_t transfer = (H5FD_mpio_xfer_t)va_arg(ap, int);
+
+                            switch(transfer) {
+                                case H5FD_MPIO_INDEPENDENT:
+                                    fprintf(out, "H5FD_MPIO_INDEPENDENT");
+                                    break;
+
+                                case H5FD_MPIO_COLLECTIVE:
+                                    fprintf(out, "H5FD_MPIO_COLLECTIVE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)transfer);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf (out, "BADTYPE(D%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'e':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    herr_t status = va_arg(ap, herr_t);
+
+                    if(status >= 0)
+                        fprintf(out, "SUCCEED");
+                    else 
+                        fprintf(out, "FAIL");
+                } /* end else */
+                break;
+
+            case 'E':
+                switch(type[1]) {
+                    case 'd':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5E_direction_t direction = (H5E_direction_t)va_arg(ap, int);
+
+                            switch(direction) {
+                                case H5E_WALK_UPWARD:
+                                    fprintf(out, "H5E_WALK_UPWARD");
+                                    break;
+
+                                case H5E_WALK_DOWNWARD:
+                                    fprintf(out, "H5E_WALK_DOWNWARD");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)direction);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'e':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5E_error2_t *error = va_arg(ap, H5E_error2_t *); /*lint !e64 Type mismatch not really occuring */
+
+                            fprintf(out, "0x%lx", (unsigned long)error);
+                        } /* end else */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5E_type_t etype = (H5E_type_t)va_arg(ap, int);
+
+                            switch(etype) {
+                                case H5E_MAJOR:
+                                    fprintf(out, "H5E_MAJOR");
+                                    break;
+
+                                case H5E_MINOR:
+                                    fprintf(out, "H5E_MINOR");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)etype);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(E%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'F':
+                switch(type[1]) {
+                    case 'd':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5F_close_degree_t degree = (H5F_close_degree_t)va_arg(ap, int);
+
+                            switch(degree) {
+                                case H5F_CLOSE_DEFAULT:
+                                    fprintf(out, "H5F_CLOSE_DEFAULT");
+                                    break;
+
+                                case H5F_CLOSE_WEAK:
+                                    fprintf(out, "H5F_CLOSE_WEAK");
+                                    break;
+
+                                case H5F_CLOSE_SEMI:
+                                    fprintf(out, "H5F_CLOSE_SEMI");
+                                    break;
+
+                                case H5F_CLOSE_STRONG:
+                                    fprintf(out, "H5F_CLOSE_STRONG");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)degree);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'm':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5F_mem_t mem_type = (H5F_mem_t)va_arg(ap, int);
+
+                            switch(mem_type) {
+                                case H5FD_MEM_NOLIST:
+                                    fprintf(out, "H5FD_MEM_NOLIST");
+                                    break;
+
+                                case H5FD_MEM_DEFAULT:
+                                    fprintf(out, "H5FD_MEM_DEFAULT");
+                                    break;
+
+                                case H5FD_MEM_SUPER:
+                                    fprintf(out, "H5FD_MEM_SUPER");
+                                    break;
+
+                                case H5FD_MEM_BTREE:
+                                    fprintf(out, "H5FD_MEM_BTREE");
+                                    break;
+
+                                case H5FD_MEM_DRAW:
+                                    fprintf(out, "H5FD_MEM_DRAW");
+                                    break;
+
+                                case H5FD_MEM_GHEAP:
+                                    fprintf(out, "H5FD_MEM_GHEAP");
+                                    break;
+
+                                case H5FD_MEM_LHEAP:
+                                    fprintf(out, "H5FD_MEM_LHEAP");
+                                    break;
+
+                                case H5FD_MEM_OHDR:
+                                    fprintf(out, "H5FD_MEM_OHDR");
+                                    break;
+
+                                case H5FD_MEM_NTYPES:
+                                default:
+                                    fprintf(out, "%ld", (long)mem_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5F_scope_t scope = (H5F_scope_t)va_arg(ap, int);
+
+                            switch(scope) {
+                                case H5F_SCOPE_LOCAL:
+                                    fprintf(out, "H5F_SCOPE_LOCAL");
+                                    break;
+
+                                case H5F_SCOPE_GLOBAL:
+                                    fprintf(out, "H5F_SCOPE_GLOBAL");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)scope);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'v':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5F_libver_t libver_vers = (H5F_libver_t)va_arg(ap, int);
+
+                            switch(libver_vers) {
+                                case H5F_LIBVER_EARLIEST:
+                                    fprintf(out, "H5F_LIBVER_EARLIEST");
+                                    break;
+
+                                case H5F_LIBVER_LATEST:
+                                    fprintf(out, "H5F_LIBVER_LATEST");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)libver_vers);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(F%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'G':
+                switch(type[1]) {
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+                    case 'o':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5G_obj_t obj_type = (H5G_obj_t)va_arg(ap, int);
+
+                            switch(obj_type) {
+                                case H5G_UNKNOWN:
+                                    fprintf(out, "H5G_UNKNOWN");
+                                    break;
+
+                                case H5G_GROUP:
+                                    fprintf(out, "H5G_GROUP");
+                                    break;
+
+                                case H5G_DATASET:
+                                    fprintf(out, "H5G_DATASET");
+                                    break;
+
+                                case H5G_TYPE:
+                                    fprintf(out, "H5G_TYPE");
+                                    break;
+
+                                case H5G_LINK:
+                                    fprintf(out, "H5G_LINK");
+                                    break;
+
+                                case H5G_UDLINK:
+                                    fprintf(out, "H5G_UDLINK");
+                                    break;
+
+                                case H5G_RESERVED_5:
+                                case H5G_RESERVED_6:
+                                case H5G_RESERVED_7:
+                                    fprintf(out, "H5G_RESERVED(%ld)", (long)obj_type);
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)obj_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp)
+                                fprintf (out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5G_stat_t *statbuf = va_arg(ap, H5G_stat_t*); /*lint !e64 Type mismatch not really occuring */
+
+                            fprintf(out, "0x%lx", (unsigned long)statbuf);
+                        }
+                        break;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+                    default:
+                        fprintf(out, "BADTYPE(G%c)", type[1]);
+                        goto error;
+                }
+                break;
+
+            case 'h':
+                if(ptr) {
+                    if(vp) {
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                        if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                            hsize_t *p = (hsize_t *)vp;
+
+                            fprintf(out, " {");
+                            for(i = 0; i < asize[asize_idx]; i++) {
+                                if(H5S_UNLIMITED == p[i])
+                                    HDfprintf(out, "%sH5S_UNLIMITED", (i ? ", " : ""));
+                                else
+                                    HDfprintf(out, "%s%Hu", (i ? ", " : ""), p[i]);
+                            } /* end for */
+                            fprintf(out, "}");
+                        } /* end if */
+                    } /* end if */
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    hsize_t hsize = va_arg(ap, hsize_t); /*lint !e732 Loss of sign not really occuring */
+
+                    if(H5S_UNLIMITED == hsize)
+                        HDfprintf(out, "H5S_UNLIMITED");
+                    else {
+                        HDfprintf(out, "%Hu", hsize);
+                        asize[argno] = (hssize_t)hsize;
+                    } /* end else */
+                } /* end else */
+                break;
+
+            case 'H':
+                switch(type[1]) {
+                    case 's':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    hssize_t *p = (hssize_t *)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        HDfprintf(out, "%s%Hd", (i ? ", " : ""), p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            hssize_t hssize = va_arg(ap, hssize_t);
+
+                            HDfprintf(out, "%Hd", hssize);
+                            asize[argno] = (hssize_t)hssize;
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf (out, "BADTYPE(H%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'i':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    hid_t obj = va_arg(ap, hid_t);
+
+                    if(H5P_DEFAULT == obj)
+                        fprintf(out, "H5P_DEFAULT");
+                    else if(obj < 0)
+                        fprintf(out, "FAIL");
+                    else {
+                        switch(H5I_TYPE(obj)) { /* Use internal H5I macro instead of function call */
+                            case H5I_UNINIT:
+                                fprintf(out, "%ld (uninit - error)", (long)obj);
+                                break;
+
+                            case H5I_BADID:
+                                fprintf(out, "%ld (error)", (long)obj);
+                                break;
+
+                            case H5I_FILE:
+                                fprintf(out, "%ld (file)", (long)obj);
+                                break;
+
+                            case H5I_GROUP:
+                                fprintf(out, "%ld (group)", (long)obj);
+                                break;
+
+                            case H5I_DATATYPE:
+                                if(obj == H5T_NATIVE_SCHAR_g)
+                                    fprintf(out, "H5T_NATIVE_SCHAR");
+                                else if(obj == H5T_NATIVE_UCHAR_g)
+                                    fprintf(out, "H5T_NATIVE_UCHAR");
+                                else if(obj == H5T_NATIVE_SHORT_g)
+                                    fprintf(out, "H5T_NATIVE_SHORT");
+                                else if(obj == H5T_NATIVE_USHORT_g)
+                                    fprintf(out, "H5T_NATIVE_USHORT");
+                                else if(obj == H5T_NATIVE_INT_g)
+                                    fprintf(out, "H5T_NATIVE_INT");
+                                else if(obj == H5T_NATIVE_UINT_g)
+                                    fprintf(out, "H5T_NATIVE_UINT");
+                                else if(obj == H5T_NATIVE_LONG_g)
+                                    fprintf(out, "H5T_NATIVE_LONG");
+                                else if(obj == H5T_NATIVE_ULONG_g)
+                                    fprintf(out, "H5T_NATIVE_ULONG");
+                                else if(obj == H5T_NATIVE_LLONG_g)
+                                    fprintf(out, "H5T_NATIVE_LLONG");
+                                else if(obj == H5T_NATIVE_ULLONG_g)
+                                    fprintf(out, "H5T_NATIVE_ULLONG");
+                                else if(obj == H5T_NATIVE_FLOAT_g)
+                                    fprintf(out, "H5T_NATIVE_FLOAT");
+                                else if(obj == H5T_NATIVE_DOUBLE_g)
+                                    fprintf(out, "H5T_NATIVE_DOUBLE");
+#if H5_SIZEOF_LONG_DOUBLE !=0
+                                else if(obj == H5T_NATIVE_LDOUBLE_g)
+                                    fprintf(out, "H5T_NATIVE_LDOUBLE");
+#endif
+                                else if(obj == H5T_IEEE_F32BE_g)
+                                    fprintf(out, "H5T_IEEE_F32BE");
+                                else if(obj == H5T_IEEE_F32LE_g)
+                                    fprintf(out, "H5T_IEEE_F32LE");
+                                else if(obj == H5T_IEEE_F64BE_g)
+                                    fprintf(out, "H5T_IEEE_F64BE");
+                                else if(obj == H5T_IEEE_F64LE_g)
+                                    fprintf(out, "H5T_IEEE_F64LE");
+                                else if(obj == H5T_STD_I8BE_g)
+                                    fprintf(out, "H5T_STD_I8BE");
+                                else if(obj == H5T_STD_I8LE_g)
+                                    fprintf(out, "H5T_STD_I8LE");
+                                else if(obj == H5T_STD_I16BE_g)
+                                    fprintf(out, "H5T_STD_I16BE");
+                                else if(obj == H5T_STD_I16LE_g)
+                                    fprintf(out, "H5T_STD_I16LE");
+                                else if(obj == H5T_STD_I32BE_g)
+                                    fprintf(out, "H5T_STD_I32BE");
+                                else if(obj == H5T_STD_I32LE_g)
+                                    fprintf(out, "H5T_STD_I32LE");
+                                else if(obj == H5T_STD_I64BE_g)
+                                    fprintf(out, "H5T_STD_I64BE");
+                                else if(obj == H5T_STD_I64LE_g)
+                                    fprintf(out, "H5T_STD_I64LE");
+                                else if(obj == H5T_STD_U8BE_g)
+                                    fprintf(out, "H5T_STD_U8BE");
+                                else if(obj == H5T_STD_U8LE_g)
+                                    fprintf(out, "H5T_STD_U8LE");
+                                else if(obj == H5T_STD_U16BE_g)
+                                    fprintf(out, "H5T_STD_U16BE");
+                                else if(obj == H5T_STD_U16LE_g)
+                                    fprintf(out, "H5T_STD_U16LE");
+                                else if(obj == H5T_STD_U32BE_g)
+                                    fprintf(out, "H5T_STD_U32BE");
+                                else if(obj == H5T_STD_U32LE_g)
+                                    fprintf(out, "H5T_STD_U32LE");
+                                else if(obj == H5T_STD_U64BE_g)
+                                    fprintf(out, "H5T_STD_U64BE");
+                                else if(obj == H5T_STD_U64LE_g)
+                                    fprintf(out, "H5T_STD_U64LE");
+                                else if(obj == H5T_STD_B8BE_g)
+                                    fprintf(out, "H5T_STD_B8BE");
+                                else if(obj == H5T_STD_B8LE_g)
+                                    fprintf(out, "H5T_STD_B8LE");
+                                else if(obj == H5T_STD_B16BE_g)
+                                    fprintf(out, "H5T_STD_B16BE");
+                                else if(obj == H5T_STD_B16LE_g)
+                                    fprintf(out, "H5T_STD_B16LE");
+                                else if(obj == H5T_STD_B32BE_g)
+                                    fprintf(out, "H5T_STD_B32BE");
+                                else if(obj == H5T_STD_B32LE_g)
+                                    fprintf(out, "H5T_STD_B32LE");
+                                else if(obj == H5T_STD_B64BE_g)
+                                    fprintf(out, "H5T_STD_B64BE");
+                                else if(obj == H5T_STD_B64LE_g)
+                                    fprintf(out, "H5T_STD_B64LE");
+                                else if(obj == H5T_C_S1_g)
+                                    fprintf(out, "H5T_C_S1");
+                                else if(obj == H5T_FORTRAN_S1_g)
+                                    fprintf(out, "H5T_FORTRAN_S1");
+                                else
+                                    fprintf(out, "%ld (dtype)", (long)obj);
+                                break;
+
+                            case H5I_DATASPACE:
+                                fprintf(out, "%ld (dspace)", (long)obj);
+                                /* Save the rank of simple dataspaces for arrays */
+                                /* This may generate recursive call to the library... -QAK */
+                                {
+                                    H5S_t *space;
+
+                                    if(NULL != (space = (H5S_t *)H5I_object(obj)))
+                                        if(H5S_SIMPLE == H5S_GET_EXTENT_TYPE(space))
+                                            asize[argno] = H5S_GET_EXTENT_NDIMS(space);
+                                }
+                                break;
+
+                            case H5I_DATASET:
+                                fprintf(out, "%ld (dset)", (long)obj);
+                                break;
+
+                            case H5I_ATTR:
+                                fprintf(out, "%ld (attr)", (long)obj);
+                                break;
+
+                            case H5I_REFERENCE:
+                                fprintf(out, "%ld (reference)", (long)obj);
+                                break;
+
+                            case H5I_VFL:
+                                fprintf(out, "%ld (file driver)", (long)obj);
+                                break;
+
+                            case H5I_GENPROP_CLS:
+                                fprintf(out, "%ld (genprop class)", (long)obj);
+                                break;
+
+                            case H5I_GENPROP_LST:
+                                fprintf(out, "%ld (genprop list)", (long)obj);
+                                break;
+
+                            case H5I_ERROR_CLASS:
+                                fprintf(out, "%ld (err class)", (long)obj);
+                                break;
+
+                            case H5I_ERROR_MSG:
+                                fprintf(out, "%ld (err msg)", (long)obj);
+                                break;
+
+                            case H5I_ERROR_STACK:
+                                fprintf(out, "%ld (err stack)", (long)obj);
+                                break;
+
+                            case H5I_NTYPES:
+                                fprintf (out, "%ld (ntypes - error)", (long)obj);
+                                break;
+
+                            default:
+                                fprintf(out, "%ld (unknown class)", (long)obj);
+                                break;
+                        } /* end switch */
+                    } /* end else */
+                } /* end else */
+                break;
+
+            case 'I':
+                switch (type[1]) {
+                    case 'i':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5_index_t idx_type = (H5_index_t)va_arg(ap, int);
+
+                            switch(idx_type) {
+                                case H5_INDEX_UNKNOWN:
+                                    fprintf(out, "H5_INDEX_UNKNOWN");
+                                    break;
+
+                                case H5_INDEX_NAME:
+                                    fprintf(out, "H5_INDEX_NAME");
+                                    break;
+
+                                case H5_INDEX_CRT_ORDER:
+                                    fprintf(out, "H5_INDEX_CRT_ORDER");
+                                    break;
+
+                                case H5_INDEX_N:
+                                    fprintf(out, "H5_INDEX_N");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)idx_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'o':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5_iter_order_t order = (H5_iter_order_t)va_arg(ap, int);
+
+                            switch(order) {
+                                case H5_ITER_UNKNOWN:
+                                    fprintf(out, "H5_ITER_UNKNOWN");
+                                    break;
+
+                                case H5_ITER_INC:
+                                    fprintf(out, "H5_ITER_INC");
+                                    break;
+
+                                case H5_ITER_DEC:
+                                    fprintf(out, "H5_ITER_DEC");
+                                    break;
+
+                                case H5_ITER_NATIVE:
+                                    fprintf(out, "H5_ITER_NATIVE");
+                                    break;
+
+                                case H5_ITER_N:
+                                    fprintf(out, "H5_ITER_N");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)order);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    int *p = (int*)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        fprintf(out, "%s%d", (i ? ", " : ""), p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            int is = va_arg(ap, int);
+
+                            fprintf (out, "%d", is);
+                            asize[argno] = is;
+                        } /* end else */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5I_type_t id_type = (H5I_type_t)va_arg(ap, int);
+
+                            switch (id_type) {
+                                case H5I_UNINIT:
+                                    fprintf(out, "H5I_UNINIT");
+                                    break;
+
+                                case H5I_BADID:
+                                    fprintf(out, "H5I_BADID");
+                                    break;
+
+                                case H5I_FILE:
+                                    fprintf(out, "H5I_FILE");
+                                    break;
+
+                                case H5I_GROUP:
+                                    fprintf(out, "H5I_GROUP");
+                                    break;
+
+                                case H5I_DATATYPE:
+                                    fprintf(out, "H5I_DATATYPE");
+                                    break;
+
+                                case H5I_DATASPACE:
+                                    fprintf(out, "H5I_DATASPACE");
+                                    break;
+
+                                case H5I_DATASET:
+                                    fprintf(out, "H5I_DATASET");
+                                    break;
+
+                                case H5I_ATTR:
+                                    fprintf(out, "H5I_ATTR");
+                                    break;
+
+                                case H5I_REFERENCE:
+                                    fprintf(out, "H5I_REFERENCE");
+                                    break;
+
+                                case H5I_VFL:
+                                    fprintf(out, "H5I_VFL");
+                                    break;
+
+                                case H5I_GENPROP_CLS:
+                                    fprintf(out, "H5I_GENPROP_CLS");
+                                    break;
+
+                                case H5I_GENPROP_LST:
+                                    fprintf(out, "H5I_GENPROP_LST");
+                                    break;
+
+                                case H5I_ERROR_CLASS:
+                                    fprintf(out, "H5I_ERROR_CLASS");
+                                    break;
+
+                                case H5I_ERROR_MSG:
+                                    fprintf(out, "H5I_ERROR_MSG");
+                                    break;
+
+                                case H5I_ERROR_STACK:
+                                    fprintf(out, "H5I_ERROR_STACK");
+                                    break;
+
+                                case H5I_NTYPES:
+                                    fprintf(out, "H5I_NTYPES");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)id_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'u':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    unsigned *p = (unsigned*)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        HDfprintf(out, "%s%u", i?", ":"", p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            unsigned iu = va_arg(ap, unsigned); /*lint !e732 Loss of sign not really occuring */
+
+                            fprintf(out, "%u", iu);
+                            asize[argno] = iu;
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf (out, "BADTYPE(I%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'L':
+                switch(type[1]) {
+                    case 'l':
+                        if(ptr) {
+                            if(vp)
+                                fprintf (out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5L_type_t link_type = (H5L_type_t)va_arg(ap, int);
+
+                            switch(link_type) {
+                                case H5L_TYPE_ERROR:
+                                    fprintf(out, "H5L_TYPE_ERROR");
+                                    break;
+
+                                case H5L_TYPE_HARD:
+                                    fprintf(out, "H5L_TYPE_HARD");
+                                    break;
+
+                                case H5L_TYPE_SOFT:
+                                    fprintf(out, "H5L_TYPE_SOFT");
+                                    break;
+
+                                case H5L_TYPE_EXTERNAL:
+                                    fprintf(out, "H5L_TYPE_EXTERNAL");
+                                    break;
+
+                                case H5L_TYPE_MAX:
+                                    fprintf(out, "H5L_TYPE_MAX");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)link_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(G%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'M':
+                switch(type[1]) {
+                    case 'c':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+#ifdef H5_HAVE_PARALLEL
+                        else {
+                            MPI_Comm comm = va_arg(ap, MPI_Comm);
+
+                            fprintf(out, "%ld", (long)comm);
+                        } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+                        break;
+
+                    case 'i':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+#ifdef H5_HAVE_PARALLEL
+                        else {
+                            MPI_Info info = va_arg(ap, MPI_Info);
+
+                            fprintf(out, "%ld", (long)info);
+                        } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5FD_mem_t mt = (H5FD_mem_t)va_arg(ap, int);
+
+                            switch(mt) {
+                                case H5FD_MEM_NOLIST:
+                                    fprintf(out, "H5FD_MEM_NOLIST");
+                                    break;
+
+                                case H5FD_MEM_DEFAULT:
+                                    fprintf(out, "H5FD_MEM_DEFAULT");
+                                    break;
+
+                                case H5FD_MEM_SUPER:
+                                    fprintf(out, "H5FD_MEM_SUPER");
+                                    break;
+
+                                case H5FD_MEM_BTREE:
+                                    fprintf(out, "H5FD_MEM_BTREE");
+                                    break;
+
+                                case H5FD_MEM_DRAW:
+                                    fprintf(out, "H5FD_MEM_DRAW");
+                                    break;
+
+                                case H5FD_MEM_GHEAP:
+                                    fprintf(out, "H5FD_MEM_GHEAP");
+                                    break;
+
+                                case H5FD_MEM_LHEAP:
+                                    fprintf(out, "H5FD_MEM_LHEAP");
+                                    break;
+
+                                case H5FD_MEM_OHDR:
+                                    fprintf(out, "H5FD_MEM_OHDR");
+                                    break;
+
+                                case H5FD_MEM_NTYPES:
+                                    fprintf(out, "H5FD_MEM_NTYPES");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)mt);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'o':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    off_t offset = va_arg(ap, off_t);
+
+                    fprintf (out, "%ld", (long)offset);
+                } /* end else */
+                break;
+
+            case 'O':
+                switch(type[1]) {
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5O_type_t objtype = (H5O_type_t)va_arg(ap, int);
+
+                            switch(objtype) {
+                                case H5O_TYPE_UNKNOWN:
+                                    fprintf(out, "H5O_TYPE_UNKNOWN");
+                                    break;
+
+                                case H5O_TYPE_GROUP:
+                                    fprintf(out, "H5O_TYPE_GROUP");
+                                    break;
+
+                                case H5O_TYPE_DATASET:
+                                    fprintf(out, "H5O_TYPE_DATASET");
+                                    break;
+
+                                case H5O_TYPE_NAMED_DATATYPE:
+                                    fprintf(out, "H5O_TYPE_NAMED_DATATYPE");
+                                    break;
+
+                                case H5O_TYPE_NTYPES:
+                                    fprintf(out, "H5O_TYPE_TYPES");
+                                    break;
+
+                                default:
+                                    fprintf(out, "BADTYPE(%ld)", (long)objtype);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(S%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'p':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    hid_t pclass_id = va_arg(ap, hid_t);
+                    char *class_name = NULL;
+                    H5P_genclass_t *pclass;
+
+                    /* Get the class name and print it */
+                    /* (This may generate recursive call to the library... -QAK) */
+                    if(NULL != (pclass = (H5P_genclass_t *)H5I_object(pclass_id)) &&
+                            NULL != (class_name = H5P_get_class_name(pclass))) {
+                        fprintf(out, "%s", class_name);
+                        H5MM_xfree(class_name);
+                    } /* end if */
+                    else
+                        fprintf(out, "%ld", (long)pclass_id);
+                } /* end else */
+                break;
+
+            case 'r':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    hobj_ref_t ref = va_arg(ap, hobj_ref_t); /*lint !e732 Loss of sign not really occuring */
+
+                    HDfprintf(out, "Reference Object=%a", ref);
+                } /* end else */
+                break;
+
+            case 'R':
+                switch(type[1]) {
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5R_type_t reftype = (H5R_type_t)va_arg(ap, int);
+
+                            switch(reftype) {
+                                case H5R_BADTYPE:
+                                    fprintf(out, "H5R_BADTYPE");
+                                    break;
+
+                                case H5R_OBJECT:
+                                    fprintf(out, "H5R_OBJECT");
+                                    break;
+
+                                case H5R_DATASET_REGION:
+                                    fprintf(out, "H5R_DATASET_REGION");
+                                    break;
+
+                                case H5R_MAXTYPE:
+                                    fprintf(out, "H5R_MAXTYPE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "BADTYPE(%ld)", (long)reftype);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(S%c)", type[1]);
+                        goto error;
+                }
+                break;
+
+            case 'S':
+                switch(type[1]) {
+                    case 'c':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5S_class_t cls = (H5S_class_t)va_arg(ap, int);
+
+                            switch(cls) {
+                                case H5S_NO_CLASS:
+                                    fprintf(out, "H5S_NO_CLASS");
+                                    break;
+
+                                case H5S_SCALAR:
+                                    fprintf(out, "H5S_SCALAR");
+                                    break;
+
+                                case H5S_SIMPLE:
+                                    fprintf(out, "H5S_SIMPLE");
+                                    break;
+
+                                case H5S_NULL:
+                                    fprintf(out, "H5S_NULL");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)cls);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5S_seloper_t so = (H5S_seloper_t)va_arg(ap, int);
+
+                            switch(so) {
+                                case H5S_SELECT_NOOP:
+                                    fprintf(out, "H5S_NOOP");
+                                    break;
+
+                                case H5S_SELECT_SET:
+                                    fprintf(out, "H5S_SELECT_SET");
+                                    break;
+
+                                case H5S_SELECT_OR:
+                                    fprintf(out, "H5S_SELECT_OR");
+                                    break;
+
+                                case H5S_SELECT_AND:
+                                    fprintf(out, "H5S_SELECT_AND");
+                                    break;
+
+                                case H5S_SELECT_XOR:
+                                    fprintf(out, "H5S_SELECT_XOR");
+                                    break;
+
+                                case H5S_SELECT_NOTB:
+                                    fprintf(out, "H5S_SELECT_NOTB");
+                                    break;
+
+                                case H5S_SELECT_NOTA:
+                                    fprintf(out, "H5S_SELECT_NOTA");
+                                    break;
+
+                                case H5S_SELECT_APPEND:
+                                    fprintf(out, "H5S_SELECT_APPEND");
+                                    break;
+
+                                case H5S_SELECT_PREPEND:
+                                    fprintf(out, "H5S_SELECT_PREPEND");
+                                    break;
+
+                                case H5S_SELECT_INVALID:
+                                    fprintf(out, "H5S_SELECT_INVALID");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)so);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5S_sel_type st = (H5S_sel_type)va_arg(ap, int);
+
+                            switch(st) {
+                                case H5S_SEL_ERROR:
+                                    fprintf(out, "H5S_SEL_ERROR");
+                                    break;
+
+                                case H5S_SEL_NONE:
+                                    fprintf(out, "H5S_SEL_NONE");
+                                    break;
+
+                                case H5S_SEL_POINTS:
+                                    fprintf(out, "H5S_SEL_POINTS");
+                                    break;
+
+                                case H5S_SEL_HYPERSLABS:
+                                    fprintf(out, "H5S_SEL_HYPERSLABS");
+                                    break;
+
+                                case H5S_SEL_ALL:
+                                    fprintf(out, "H5S_SEL_ALL");
+                                    break;
+
+                                case H5S_SEL_N:
+                                    fprintf(out, "H5S_SEL_N");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)st);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(S%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 's':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    const char *str = va_arg(ap, const char *); /*lint !e64 Type mismatch not really occuring */
+
+                    fprintf(out, "\"%s\"", str);
+                } /* end else */
+                break;
+
+            case 'T':
+                switch(type[1]) {
+                    case 'c':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_cset_t cset = (H5T_cset_t)va_arg(ap, int);
+
+                            switch(cset) {
+                                case H5T_CSET_ERROR:
+                                    fprintf(out, "H5T_CSET_ERROR");
+                                    break;
+
+                                case H5T_CSET_ASCII:
+                                    fprintf(out, "H5T_CSET_ASCII");
+                                    break;
+
+                                case H5T_CSET_UTF8:
+                                    fprintf(out, "H5T_CSET_UTF8");
+                                    break;
+
+                                case H5T_CSET_RESERVED_2:
+                                case H5T_CSET_RESERVED_3:
+                                case H5T_CSET_RESERVED_4:
+                                case H5T_CSET_RESERVED_5:
+                                case H5T_CSET_RESERVED_6:
+                                case H5T_CSET_RESERVED_7:
+                                case H5T_CSET_RESERVED_8:
+                                case H5T_CSET_RESERVED_9:
+                                case H5T_CSET_RESERVED_10:
+                                case H5T_CSET_RESERVED_11:
+                                case H5T_CSET_RESERVED_12:
+                                case H5T_CSET_RESERVED_13:
+                                case H5T_CSET_RESERVED_14:
+                                case H5T_CSET_RESERVED_15:
+                                    fprintf(out, "H5T_CSET_RESERVED_%ld", (long)cset);
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)cset);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'd':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_direction_t direct = (H5T_direction_t)va_arg(ap, int);
+
+                            switch(direct) {
+                                case H5T_DIR_DEFAULT:
+                                    fprintf(out, "H5T_DIR_DEFAULT");
+                                    break;
+
+                                case H5T_DIR_ASCEND:
+                                    fprintf(out, "H5T_DIR_ASCEND");
+                                    break;
+
+                                case H5T_DIR_DESCEND:
+                                    fprintf(out, "H5T_DIR_DESCEND");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)direct);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'e':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_pers_t pers = (H5T_pers_t)va_arg(ap, int);
+
+                            switch(pers) {
+                                case H5T_PERS_DONTCARE:
+                                    fprintf(out, "H5T_PERS_DONTCARE");
+                                    break;
+
+                                case H5T_PERS_SOFT:
+                                    fprintf(out, "H5T_PERS_SOFT");
+                                    break;
+
+                                case H5T_PERS_HARD:
+                                    fprintf(out, "H5T_PERS_HARD");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)pers);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'n':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_norm_t norm = (H5T_norm_t)va_arg(ap, int);
+
+                            switch(norm) {
+                                case H5T_NORM_ERROR:
+                                    fprintf(out, "H5T_NORM_ERROR");
+                                    break;
+
+                                case H5T_NORM_IMPLIED:
+                                    fprintf(out, "H5T_NORM_IMPLIED");
+                                    break;
+
+                                case H5T_NORM_MSBSET:
+                                    fprintf(out, "H5T_NORM_MSBSET");
+                                    break;
+
+                                case H5T_NORM_NONE:
+                                    fprintf(out, "H5T_NORM_NONE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)norm);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'o':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_order_t order = (H5T_order_t)va_arg(ap, int);
+
+                            switch(order) {
+                                case H5T_ORDER_ERROR:
+                                    fprintf(out, "H5T_ORDER_ERROR");
+                                    break;
+
+                                case H5T_ORDER_LE:
+                                    fprintf(out, "H5T_ORDER_LE");
+                                    break;
+
+                                case H5T_ORDER_BE:
+                                    fprintf(out, "H5T_ORDER_BE");
+                                    break;
+
+                                case H5T_ORDER_VAX:
+                                    fprintf(out, "H5T_ORDER_VAX");
+                                    break;
+
+                                case H5T_ORDER_MIXED:
+                                    fprintf(out, "H5T_ORDER_MIXED");
+                                    break;
+
+                                case H5T_ORDER_NONE:
+                                    fprintf(out, "H5T_ORDER_NONE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)order);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'p':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_pad_t pad = (H5T_pad_t)va_arg(ap, int);
+
+                            switch(pad) {
+                                case H5T_PAD_ERROR:
+                                    fprintf(out, "H5T_PAD_ERROR");
+                                    break;
+
+                                case H5T_PAD_ZERO:
+                                    fprintf(out, "H5T_PAD_ZERO");
+                                    break;
+
+                                case H5T_PAD_ONE:
+                                    fprintf(out, "H5T_PAD_ONE");
+                                    break;
+
+                                case H5T_PAD_BACKGROUND:
+                                    fprintf(out, "H5T_PAD_BACKGROUND");
+                                    break;
+
+                                case H5T_NPAD:
+                                    fprintf(out, "H5T_NPAD");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)pad);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_sign_t sign = (H5T_sign_t)va_arg(ap, int);
+
+                            switch(sign) {
+                                case H5T_SGN_ERROR:
+                                    fprintf(out, "H5T_SGN_ERROR");
+                                    break;
+
+                                case H5T_SGN_NONE:
+                                    fprintf(out, "H5T_SGN_NONE");
+                                    break;
+
+                                case H5T_SGN_2:
+                                    fprintf(out, "H5T_SGN_2");
+                                    break;
+
+                                case H5T_NSGN:
+                                    fprintf(out, "H5T_NSGN");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)sign);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_class_t type_class = (H5T_class_t)va_arg(ap, int);
+
+                            switch(type_class) {
+                                case H5T_NO_CLASS:
+                                    fprintf(out, "H5T_NO_CLASS");
+                                    break;
+
+                                case H5T_INTEGER:
+                                    fprintf(out, "H5T_INTEGER");
+                                    break;
+
+                                case H5T_FLOAT:
+                                    fprintf(out, "H5T_FLOAT");
+                                    break;
+
+                                case H5T_TIME:
+                                    fprintf(out, "H5T_TIME");
+                                    break;
+
+                                case H5T_STRING:
+                                    fprintf(out, "H5T_STRING");
+                                    break;
+
+                                case H5T_BITFIELD:
+                                    fprintf(out, "H5T_BITFIELD");
+                                    break;
+
+                                case H5T_OPAQUE:
+                                    fprintf(out, "H5T_OPAQUE");
+                                    break;
+
+                                case H5T_COMPOUND:
+                                    fprintf(out, "H5T_COMPOUND");
+                                    break;
+
+                                case H5T_REFERENCE:
+                                    fprintf(out, "H5T_REFERENCE");
+                                    break;
+
+                                case H5T_ENUM:
+                                    fprintf(out, "H5T_ENUM");
+                                    break;
+
+                                case H5T_VLEN:
+                                    fprintf(out, "H5T_VLEN");
+                                    break;
+
+                                case H5T_ARRAY:
+                                    fprintf(out, "H5T_ARRAY");
+                                    break;
+
+                                case H5T_NCLASSES:
+                                    fprintf(out, "H5T_NCLASSES");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)type_class);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'z':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5T_str_t str = (H5T_str_t)va_arg(ap, int);
+
+                            switch(str) {
+                                case H5T_STR_ERROR:
+                                    fprintf(out, "H5T_STR_ERROR");
+                                    break;
+
+                                case H5T_STR_NULLTERM:
+                                    fprintf(out, "H5T_STR_NULLTERM");
+                                    break;
+
+                                case H5T_STR_NULLPAD:
+                                    fprintf(out, "H5T_STR_NULLPAD");
+                                    break;
+
+                                case H5T_STR_SPACEPAD:
+                                    fprintf(out, "H5T_STR_SPACEPAD");
+                                    break;
+
+                                case H5T_STR_RESERVED_3:
+                                case H5T_STR_RESERVED_4:
+                                case H5T_STR_RESERVED_5:
+                                case H5T_STR_RESERVED_6:
+                                case H5T_STR_RESERVED_7:
+                                case H5T_STR_RESERVED_8:
+                                case H5T_STR_RESERVED_9:
+                                case H5T_STR_RESERVED_10:
+                                case H5T_STR_RESERVED_11:
+                                case H5T_STR_RESERVED_12:
+                                case H5T_STR_RESERVED_13:
+                                case H5T_STR_RESERVED_14:
+                                case H5T_STR_RESERVED_15:
+                                    fprintf(out, "H5T_STR_RESERVED(%ld)",(long)str);
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)str);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf (out, "BADTYPE(T%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 't':
+                if(ptr) {
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    htri_t tri_var = va_arg (ap, htri_t);
+
+                    if(tri_var>0)
+                        fprintf (out, "TRUE");
+                    else if(!tri_var)
+                        fprintf (out, "FALSE");
+                    else
+                        fprintf(out, "FAIL(%d)", (int)tri_var);
+                } /* end else */
+                break;
+
+            case 'U':
+                switch(type[1]) {
+                    case 'l':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    unsigned long *p = (unsigned long *)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        HDfprintf(out, "%s%lu", i?", ":"", p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            unsigned long iul = va_arg(ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
+
+                            fprintf(out, "%lu", iul);
+                            asize[argno] = iul;
+                        } /* end else */
+                        break;
+
+                    case 'L':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    unsigned long long *p = (unsigned long long *)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        HDfprintf(out, "%s%llu", i?", ":"", p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            unsigned long long iull = va_arg(ap, unsigned long long); /*lint !e732 Loss of sign not really occuring */
+
+                            fprintf(out, "%llu", iull);
+                            asize[argno] = iull;
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf (out, "BADTYPE(U%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            case 'x':
+                if(ptr) {
+                    if(vp) {
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                        if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                            void **p = (void**)vp;
+
+                            fprintf(out, " {");
+                            for(i = 0; i < asize[asize_idx]; i++) {
+                                if(p[i])
+                                    fprintf(out, "%s0x%lx", (i ? ", " : ""), (unsigned long)(p[i]));
+                                else
+                                    fprintf(out, "%sNULL", (i ? ", " : ""));
+                            } /* end for */
+                            fprintf(out, "}");
+                        } /* end if */
+                    } /* end if */
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    vp = va_arg (ap, void *); /*lint !e64 Type mismatch not really occuring */
+
+                    if(vp)
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                    else
+                        fprintf(out, "NULL");
+                } /* end else */
+                break;
+
+            case 'z':
+                if(ptr) {
+                    if(vp) {
+                        fprintf(out, "0x%lx", (unsigned long)vp);
+                        if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                            size_t *p = (size_t *)vp;
+
+                            fprintf(out, " {");
+                            for(i = 0; i < asize[asize_idx]; i++)
+                                HDfprintf(out, "%s%Zu", (i ? ", " : ""), p[i]);
+                            fprintf(out, "}");
+                        } /* end if */
+                    } /* end if */
+                    else
+                        fprintf(out, "NULL");
+                } /* end if */
+                else {
+                    size_t size = va_arg(ap, size_t); /*lint !e732 Loss of sign not really occuring */
+
+                    HDfprintf(out, "%Zu", size);
+                    asize[argno] = (hssize_t)size;
+                } /* end else */
+                break;
+
+            case 'Z':
+                switch (type[1]) {
+                    case 'a':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5Z_SO_scale_type_t scale_type = (H5Z_SO_scale_type_t)va_arg(ap, int);
+
+                            switch(scale_type) {
+                                case H5Z_SO_FLOAT_DSCALE:
+                                    fprintf(out, "H5Z_SO_FLOAT_DSCALE");
+                                    break;
+
+                                case H5Z_SO_FLOAT_ESCALE:
+                                    fprintf(out, "H5Z_SO_FLOAT_ESCALE");
+                                    break;
+
+                                case H5Z_SO_INT:
+                                    fprintf(out, "H5Z_SO_INT");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)scale_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
+                    case 'c':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5Z_class2_t *filter = va_arg(ap, H5Z_class2_t*); /*lint !e64 Type mismatch not really occuring */
+
+                            fprintf(out, "0x%lx", (unsigned long)filter);
+                        } /* end else */
+                        break;
+
+                    case 'e':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5Z_EDC_t edc = (H5Z_EDC_t)va_arg(ap, int);
+
+                            if(H5Z_DISABLE_EDC == edc)
+                                fprintf(out, "H5Z_DISABLE_EDC");
+                            else if (H5Z_ENABLE_EDC == edc)
+                                fprintf(out, "H5Z_ENABLE_EDC");
+                            else
+                                fprintf(out, "%ld", (long)edc);
+                        } /* end else */
+                        break;
+
+                    case 'f':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5Z_filter_t id = va_arg(ap, H5Z_filter_t);
+
+                            if(H5Z_FILTER_DEFLATE == id)
+                                fprintf(out, "H5Z_FILTER_DEFLATE");
+                            else
+                                fprintf(out, "%ld", (long)id);
+                        } /* end else */
+                        break;
+
+                    case 's':
+                        if(ptr) {
+                            if(vp) {
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                                if(asize_idx >= 0 && asize[asize_idx] >= 0) {
+                                    ssize_t *p = (ssize_t *)vp;
+
+                                    fprintf(out, " {");
+                                    for(i = 0; i < asize[asize_idx]; i++)
+                                        HDfprintf(out, "%s%Zd", (i ? ", " : ""), p[i]);
+                                    fprintf(out, "}");
+                                } /* end if */
+                            } /* end if */
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            ssize_t ssize = va_arg(ap, ssize_t);
+
+                            HDfprintf(out, "%Zd", ssize);
+                            asize[argno] = (hssize_t)ssize;
+                        } /* end else */
+                        break;
+
+                    default:
+                        fprintf(out, "BADTYPE(Z%c)", type[1]);
+                        goto error;
+                } /* end switch */
+                break;
+
+            default:
+                if(HDisupper(type[0]))
+                    fprintf(out, "BADTYPE(%c%c)", type[0], type[1]);
+                else
+                    fprintf(out, "BADTYPE(%c)", type[0]);
+                goto error;
+	} /* end switch */
+    } /* end for */
+
+    /* Display event time for return */
+    if(returning && H5_debug_g.ttimes)
+        fprintf(out, " @%.6f [dt=%.6f]", (event_time.etime - first_time.etime),
+                (event_time.etime - *returning));
+
+error:
+    va_end(ap);
+    if(returning)
+	fprintf(out, ";\n");
+    else {
+	last_call_depth = current_depth++;
+	fprintf (out, ")");
+    } /* end else */
+    HDfflush(out);
+
+    return event_time.etime;
+} /* end H5_trace() */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5vers.txt b/gatb-core/thirdparty/hdf5/src/H5vers.txt
new file mode 100644
index 0000000..18a88d9
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5vers.txt
@@ -0,0 +1,75 @@
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+
+# This file is used to generate the various headers that are needed for
+# versioning the public symbols for the library.
+#
+# The bin/make_vers script reads in this file and creates the appropriate files
+# in the src/ directory when the generated headers are out of date with respect
+# to this file.
+#
+# Blank lines and lines beginning with '#' are ignored
+#
+# The format of this file is as follows:
+#  <type>: <base routine name>; <list of parameter types for function>; <version introduced>, <list of revised versions>
+#
+# Where <type> is either 'FUNCTION' or 'TYPEDEF'
+#
+# For example, the following sample input shows two functions with different
+# API versions for each.  The example below shows H5Gfoo being added to the
+# library in the v1.0 branch and revised in the v1.4 and v1.8 branches (so
+# there should be three versioned names for the routine: H5Gfoo1, H5Gfoo2 and
+# H5Gfoo3).  H5Gbar is shown as being added to the library in the v1.2 branch
+# (so the "base" version of the API name wouldn't appear if the library
+# was configured with the default API interface corresponding to v1.0) and
+# revised in the v1.6 branch (so there should be two versioned names for the
+# routine: H5Gbar1 and H5Gbar2).
+#
+# FUNCTION: H5Gfoo; ; v10, v14, v18
+# FUNCTION: H5Gbar; ; v12, v16
+#
+# Programmer: Quincey Koziol
+# Creation Date: 2007/07/10
+
+# API function names
+# (although not required, it's easier to compare this file with the headers
+#       generated if the list below is in alphanumeric sort order - QAK)
+FUNCTION: H5Acreate; ; v10, v18
+FUNCTION: H5Aiterate; H5A_operator; v10, v18
+FUNCTION: H5Dcreate; ; v10, v18
+FUNCTION: H5Dopen; ; v10, v18
+FUNCTION: H5Eclear; ; v10, v18
+FUNCTION: H5Eget_auto; ; v10, v18
+FUNCTION: H5Eprint; ; v10, v18
+FUNCTION: H5Epush; ; v14, v18
+FUNCTION: H5Eset_auto; ; v10, v18
+FUNCTION: H5Ewalk; H5E_walk, H5E_error; v10, v18
+FUNCTION: H5Gcreate; ; v10, v18
+FUNCTION: H5Gopen; ; v10, v18
+FUNCTION: H5Pget_filter; ; v10, v18
+FUNCTION: H5Pget_filter_by_id; ; v16, v18
+FUNCTION: H5Pinsert; ; v14, v18
+FUNCTION: H5Pregister; ; v14, v18
+FUNCTION: H5Rget_obj_type; ; v16, v18
+FUNCTION: H5Tarray_create; ; v14, v18
+FUNCTION: H5Tcommit; ; v10, v18
+FUNCTION: H5Tget_array_dims; ; v14, v18
+FUNCTION: H5Topen; ; v10, v18
+
+# API typedefs
+# (although not required, it's easier to compare this file with the headers
+#       generated if the list below is in alphanumeric sort order - QAK)
+TYPEDEF: H5E_auto; v10, v18
+TYPEDEF: H5Z_class; v16, v18
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5version.h b/gatb-core/thirdparty/hdf5/src/H5version.h
new file mode 100644
index 0000000..58de2ab
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5version.h
@@ -0,0 +1,419 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Generated automatically by bin/make_vers -- do not edit */
+/* Add new versioned symbols to H5vers.txt file */
+
+
+#ifndef _H5version_H
+#define _H5version_H
+
+/* Issue error if contradicting macros have been defined. */
+#if defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS)
+#error "Can't choose old API versions when deprecated APIs are disabled"
+#endif /* defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS) */
+
+
+/* If a particular "global" version of the library's interfaces is chosen,
+ *      set the versions for the API symbols affected.
+ *
+ * Note: If an application has already chosen a particular version for an
+ *      API symbol, the individual API version macro takes priority.
+ */
+#if defined(H5_USE_16_API_DEFAULT) && !defined(H5_USE_16_API)
+#define H5_USE_16_API 1
+#endif /* H5_USE_16_API_DEFAULT && !H5_USE_16_API */
+
+#ifdef H5_USE_16_API
+
+/*************/
+/* Functions */
+/*************/
+
+#if !defined(H5Acreate_vers)
+#define H5Acreate_vers 1
+#endif /* !defined(H5Acreate_vers) */
+
+#if !defined(H5Aiterate_vers)
+#define H5Aiterate_vers 1
+#endif /* !defined(H5Aiterate_vers) */
+
+#if !defined(H5Dcreate_vers)
+#define H5Dcreate_vers 1
+#endif /* !defined(H5Dcreate_vers) */
+
+#if !defined(H5Dopen_vers)
+#define H5Dopen_vers 1
+#endif /* !defined(H5Dopen_vers) */
+
+#if !defined(H5Eclear_vers)
+#define H5Eclear_vers 1
+#endif /* !defined(H5Eclear_vers) */
+
+#if !defined(H5Eget_auto_vers)
+#define H5Eget_auto_vers 1
+#endif /* !defined(H5Eget_auto_vers) */
+
+#if !defined(H5Eprint_vers)
+#define H5Eprint_vers 1
+#endif /* !defined(H5Eprint_vers) */
+
+#if !defined(H5Epush_vers)
+#define H5Epush_vers 1
+#endif /* !defined(H5Epush_vers) */
+
+#if !defined(H5Eset_auto_vers)
+#define H5Eset_auto_vers 1
+#endif /* !defined(H5Eset_auto_vers) */
+
+#if !defined(H5Ewalk_vers)
+#define H5Ewalk_vers 1
+#endif /* !defined(H5Ewalk_vers) */
+
+#if !defined(H5Gcreate_vers)
+#define H5Gcreate_vers 1
+#endif /* !defined(H5Gcreate_vers) */
+
+#if !defined(H5Gopen_vers)
+#define H5Gopen_vers 1
+#endif /* !defined(H5Gopen_vers) */
+
+#if !defined(H5Pget_filter_vers)
+#define H5Pget_filter_vers 1
+#endif /* !defined(H5Pget_filter_vers) */
+
+#if !defined(H5Pget_filter_by_id_vers)
+#define H5Pget_filter_by_id_vers 1
+#endif /* !defined(H5Pget_filter_by_id_vers) */
+
+#if !defined(H5Pinsert_vers)
+#define H5Pinsert_vers 1
+#endif /* !defined(H5Pinsert_vers) */
+
+#if !defined(H5Pregister_vers)
+#define H5Pregister_vers 1
+#endif /* !defined(H5Pregister_vers) */
+
+#if !defined(H5Rget_obj_type_vers)
+#define H5Rget_obj_type_vers 1
+#endif /* !defined(H5Rget_obj_type_vers) */
+
+#if !defined(H5Tarray_create_vers)
+#define H5Tarray_create_vers 1
+#endif /* !defined(H5Tarray_create_vers) */
+
+#if !defined(H5Tcommit_vers)
+#define H5Tcommit_vers 1
+#endif /* !defined(H5Tcommit_vers) */
+
+#if !defined(H5Tget_array_dims_vers)
+#define H5Tget_array_dims_vers 1
+#endif /* !defined(H5Tget_array_dims_vers) */
+
+#if !defined(H5Topen_vers)
+#define H5Topen_vers 1
+#endif /* !defined(H5Topen_vers) */
+
+/************/
+/* Typedefs */
+/************/
+
+#if !defined(H5E_auto_t_vers)
+#define H5E_auto_t_vers 1
+#endif /* !defined(H5E_auto_t_vers) */
+
+#if !defined(H5Z_class_t_vers)
+#define H5Z_class_t_vers 1
+#endif /* !defined(H5Z_class_t_vers) */
+
+#endif /* H5_USE_16_API */
+
+
+/* Choose the correct version of each API symbol, defaulting to the latest
+ *      version of each.  The "best" name for API parameters/data structures
+ *      that have changed definitions is also set.  An error is issued for
+ *      specifying an invalid API version.
+ */
+
+/*************/
+/* Functions */
+/*************/
+
+#if !defined(H5Acreate_vers) || H5Acreate_vers == 2
+#ifndef H5Acreate_vers
+#define H5Acreate_vers 2
+#endif /* H5Acreate_vers */
+#define H5Acreate H5Acreate2
+#elif H5Acreate_vers == 1
+#define H5Acreate H5Acreate1
+#else /* H5Acreate_vers */
+#error "H5Acreate_vers set to invalid value"
+#endif /* H5Acreate_vers */
+
+#if !defined(H5Aiterate_vers) || H5Aiterate_vers == 2
+#ifndef H5Aiterate_vers
+#define H5Aiterate_vers 2
+#endif /* H5Aiterate_vers */
+#define H5Aiterate H5Aiterate2
+#define H5A_operator_t H5A_operator2_t
+#elif H5Aiterate_vers == 1
+#define H5Aiterate H5Aiterate1
+#define H5A_operator_t H5A_operator1_t
+#else /* H5Aiterate_vers */
+#error "H5Aiterate_vers set to invalid value"
+#endif /* H5Aiterate_vers */
+
+#if !defined(H5Dcreate_vers) || H5Dcreate_vers == 2
+#ifndef H5Dcreate_vers
+#define H5Dcreate_vers 2
+#endif /* H5Dcreate_vers */
+#define H5Dcreate H5Dcreate2
+#elif H5Dcreate_vers == 1
+#define H5Dcreate H5Dcreate1
+#else /* H5Dcreate_vers */
+#error "H5Dcreate_vers set to invalid value"
+#endif /* H5Dcreate_vers */
+
+#if !defined(H5Dopen_vers) || H5Dopen_vers == 2
+#ifndef H5Dopen_vers
+#define H5Dopen_vers 2
+#endif /* H5Dopen_vers */
+#define H5Dopen H5Dopen2
+#elif H5Dopen_vers == 1
+#define H5Dopen H5Dopen1
+#else /* H5Dopen_vers */
+#error "H5Dopen_vers set to invalid value"
+#endif /* H5Dopen_vers */
+
+#if !defined(H5Eclear_vers) || H5Eclear_vers == 2
+#ifndef H5Eclear_vers
+#define H5Eclear_vers 2
+#endif /* H5Eclear_vers */
+#define H5Eclear H5Eclear2
+#elif H5Eclear_vers == 1
+#define H5Eclear H5Eclear1
+#else /* H5Eclear_vers */
+#error "H5Eclear_vers set to invalid value"
+#endif /* H5Eclear_vers */
+
+#if !defined(H5Eget_auto_vers) || H5Eget_auto_vers == 2
+#ifndef H5Eget_auto_vers
+#define H5Eget_auto_vers 2
+#endif /* H5Eget_auto_vers */
+#define H5Eget_auto H5Eget_auto2
+#elif H5Eget_auto_vers == 1
+#define H5Eget_auto H5Eget_auto1
+#else /* H5Eget_auto_vers */
+#error "H5Eget_auto_vers set to invalid value"
+#endif /* H5Eget_auto_vers */
+
+#if !defined(H5Eprint_vers) || H5Eprint_vers == 2
+#ifndef H5Eprint_vers
+#define H5Eprint_vers 2
+#endif /* H5Eprint_vers */
+#define H5Eprint H5Eprint2
+#elif H5Eprint_vers == 1
+#define H5Eprint H5Eprint1
+#else /* H5Eprint_vers */
+#error "H5Eprint_vers set to invalid value"
+#endif /* H5Eprint_vers */
+
+#if !defined(H5Epush_vers) || H5Epush_vers == 2
+#ifndef H5Epush_vers
+#define H5Epush_vers 2
+#endif /* H5Epush_vers */
+#define H5Epush H5Epush2
+#elif H5Epush_vers == 1
+#define H5Epush H5Epush1
+#else /* H5Epush_vers */
+#error "H5Epush_vers set to invalid value"
+#endif /* H5Epush_vers */
+
+#if !defined(H5Eset_auto_vers) || H5Eset_auto_vers == 2
+#ifndef H5Eset_auto_vers
+#define H5Eset_auto_vers 2
+#endif /* H5Eset_auto_vers */
+#define H5Eset_auto H5Eset_auto2
+#elif H5Eset_auto_vers == 1
+#define H5Eset_auto H5Eset_auto1
+#else /* H5Eset_auto_vers */
+#error "H5Eset_auto_vers set to invalid value"
+#endif /* H5Eset_auto_vers */
+
+#if !defined(H5Ewalk_vers) || H5Ewalk_vers == 2
+#ifndef H5Ewalk_vers
+#define H5Ewalk_vers 2
+#endif /* H5Ewalk_vers */
+#define H5Ewalk H5Ewalk2
+#define H5E_error_t H5E_error2_t
+#define H5E_walk_t H5E_walk2_t
+#elif H5Ewalk_vers == 1
+#define H5Ewalk H5Ewalk1
+#define H5E_error_t H5E_error1_t
+#define H5E_walk_t H5E_walk1_t
+#else /* H5Ewalk_vers */
+#error "H5Ewalk_vers set to invalid value"
+#endif /* H5Ewalk_vers */
+
+#if !defined(H5Gcreate_vers) || H5Gcreate_vers == 2
+#ifndef H5Gcreate_vers
+#define H5Gcreate_vers 2
+#endif /* H5Gcreate_vers */
+#define H5Gcreate H5Gcreate2
+#elif H5Gcreate_vers == 1
+#define H5Gcreate H5Gcreate1
+#else /* H5Gcreate_vers */
+#error "H5Gcreate_vers set to invalid value"
+#endif /* H5Gcreate_vers */
+
+#if !defined(H5Gopen_vers) || H5Gopen_vers == 2
+#ifndef H5Gopen_vers
+#define H5Gopen_vers 2
+#endif /* H5Gopen_vers */
+#define H5Gopen H5Gopen2
+#elif H5Gopen_vers == 1
+#define H5Gopen H5Gopen1
+#else /* H5Gopen_vers */
+#error "H5Gopen_vers set to invalid value"
+#endif /* H5Gopen_vers */
+
+#if !defined(H5Pget_filter_vers) || H5Pget_filter_vers == 2
+#ifndef H5Pget_filter_vers
+#define H5Pget_filter_vers 2
+#endif /* H5Pget_filter_vers */
+#define H5Pget_filter H5Pget_filter2
+#elif H5Pget_filter_vers == 1
+#define H5Pget_filter H5Pget_filter1
+#else /* H5Pget_filter_vers */
+#error "H5Pget_filter_vers set to invalid value"
+#endif /* H5Pget_filter_vers */
+
+#if !defined(H5Pget_filter_by_id_vers) || H5Pget_filter_by_id_vers == 2
+#ifndef H5Pget_filter_by_id_vers
+#define H5Pget_filter_by_id_vers 2
+#endif /* H5Pget_filter_by_id_vers */
+#define H5Pget_filter_by_id H5Pget_filter_by_id2
+#elif H5Pget_filter_by_id_vers == 1
+#define H5Pget_filter_by_id H5Pget_filter_by_id1
+#else /* H5Pget_filter_by_id_vers */
+#error "H5Pget_filter_by_id_vers set to invalid value"
+#endif /* H5Pget_filter_by_id_vers */
+
+#if !defined(H5Pinsert_vers) || H5Pinsert_vers == 2
+#ifndef H5Pinsert_vers
+#define H5Pinsert_vers 2
+#endif /* H5Pinsert_vers */
+#define H5Pinsert H5Pinsert2
+#elif H5Pinsert_vers == 1
+#define H5Pinsert H5Pinsert1
+#else /* H5Pinsert_vers */
+#error "H5Pinsert_vers set to invalid value"
+#endif /* H5Pinsert_vers */
+
+#if !defined(H5Pregister_vers) || H5Pregister_vers == 2
+#ifndef H5Pregister_vers
+#define H5Pregister_vers 2
+#endif /* H5Pregister_vers */
+#define H5Pregister H5Pregister2
+#elif H5Pregister_vers == 1
+#define H5Pregister H5Pregister1
+#else /* H5Pregister_vers */
+#error "H5Pregister_vers set to invalid value"
+#endif /* H5Pregister_vers */
+
+#if !defined(H5Rget_obj_type_vers) || H5Rget_obj_type_vers == 2
+#ifndef H5Rget_obj_type_vers
+#define H5Rget_obj_type_vers 2
+#endif /* H5Rget_obj_type_vers */
+#define H5Rget_obj_type H5Rget_obj_type2
+#elif H5Rget_obj_type_vers == 1
+#define H5Rget_obj_type H5Rget_obj_type1
+#else /* H5Rget_obj_type_vers */
+#error "H5Rget_obj_type_vers set to invalid value"
+#endif /* H5Rget_obj_type_vers */
+
+#if !defined(H5Tarray_create_vers) || H5Tarray_create_vers == 2
+#ifndef H5Tarray_create_vers
+#define H5Tarray_create_vers 2
+#endif /* H5Tarray_create_vers */
+#define H5Tarray_create H5Tarray_create2
+#elif H5Tarray_create_vers == 1
+#define H5Tarray_create H5Tarray_create1
+#else /* H5Tarray_create_vers */
+#error "H5Tarray_create_vers set to invalid value"
+#endif /* H5Tarray_create_vers */
+
+#if !defined(H5Tcommit_vers) || H5Tcommit_vers == 2
+#ifndef H5Tcommit_vers
+#define H5Tcommit_vers 2
+#endif /* H5Tcommit_vers */
+#define H5Tcommit H5Tcommit2
+#elif H5Tcommit_vers == 1
+#define H5Tcommit H5Tcommit1
+#else /* H5Tcommit_vers */
+#error "H5Tcommit_vers set to invalid value"
+#endif /* H5Tcommit_vers */
+
+#if !defined(H5Tget_array_dims_vers) || H5Tget_array_dims_vers == 2
+#ifndef H5Tget_array_dims_vers
+#define H5Tget_array_dims_vers 2
+#endif /* H5Tget_array_dims_vers */
+#define H5Tget_array_dims H5Tget_array_dims2
+#elif H5Tget_array_dims_vers == 1
+#define H5Tget_array_dims H5Tget_array_dims1
+#else /* H5Tget_array_dims_vers */
+#error "H5Tget_array_dims_vers set to invalid value"
+#endif /* H5Tget_array_dims_vers */
+
+#if !defined(H5Topen_vers) || H5Topen_vers == 2
+#ifndef H5Topen_vers
+#define H5Topen_vers 2
+#endif /* H5Topen_vers */
+#define H5Topen H5Topen2
+#elif H5Topen_vers == 1
+#define H5Topen H5Topen1
+#else /* H5Topen_vers */
+#error "H5Topen_vers set to invalid value"
+#endif /* H5Topen_vers */
+
+/************/
+/* Typedefs */
+/************/
+
+#if !defined(H5E_auto_t_vers) || H5E_auto_t_vers == 2
+#ifndef H5E_auto_t_vers
+#define H5E_auto_t_vers 2
+#endif /* H5E_auto_t_vers */
+#define H5E_auto_t H5E_auto2_t
+#elif H5E_auto_t_vers == 1
+#define H5E_auto_t H5E_auto1_t
+#else /* H5E_auto_t_vers */
+#error "H5E_auto_t_vers set to invalid value"
+#endif /* H5E_auto_t_vers */
+
+
+#if !defined(H5Z_class_t_vers) || H5Z_class_t_vers == 2
+#ifndef H5Z_class_t_vers
+#define H5Z_class_t_vers 2
+#endif /* H5Z_class_t_vers */
+#define H5Z_class_t H5Z_class2_t
+#elif H5Z_class_t_vers == 1
+#define H5Z_class_t H5Z_class1_t
+#else /* H5Z_class_t_vers */
+#error "H5Z_class_t_vers set to invalid value"
+#endif /* H5Z_class_t_vers */
+
+#endif /* H5version_H */
+
diff --git a/gatb-core/thirdparty/hdf5/src/H5win32defs.h b/gatb-core/thirdparty/hdf5/src/H5win32defs.h
new file mode 100644
index 0000000..3dab8de
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/H5win32defs.h
@@ -0,0 +1,112 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Scott Wegner
+ *              June 3, 2008
+ *
+ * Purpose: This file is used to map HDF macros to Windows functions.  This
+ *          should get included H5private mappings, so as to override them.
+ *          Any macro not mapped here, however, will receive a similar mapping
+ *          inside H5private.h
+ *
+ */
+
+#ifdef H5_HAVE_WIN32_API
+
+typedef struct _stati64     h5_stat_t;
+typedef __int64             h5_stat_size_t;
+
+#define HDaccess(F,M)       _access(F,M)
+#define HDchdir(S)          _chdir(S)
+#define HDclose(F)          _close(F)
+#define HDdup(F)            _dup(F)
+#define HDfdopen(N,S)       _fdopen(N,S)
+#define HDfileno(F)         _fileno(F)
+#define HDfstat(F,B)        _fstati64(F,B)
+#define HDisatty(F)         _isatty(F)
+#define HDgetcwd(S,Z)       _getcwd(S,Z)
+#define HDgetdcwd(D,S,Z)    _getdcwd(D,S,Z)
+#define HDgetdrive()        _getdrive()
+#define HDlseek(F,O,W)      _lseeki64(F,O,W)
+#define HDlstat(S,B)        _lstati64(S,B)
+#define HDmkdir(S,M)        _mkdir(S)
+#define HDoff_t             __int64
+/* _O_BINARY must be set in Windows to avoid CR-LF <-> LF EOL
+ * transformations when performing I/O.
+ */
+#define HDopen(S,F,M)       _open(S,F|_O_BINARY,M)
+#define HDread(F,M,Z)       _read(F,M,Z)
+#define HDrmdir(S)          _rmdir(S)
+#define HDsetvbuf(F,S,M,Z)  setvbuf(F,S,M,(Z>1?Z:2))
+#define HDsleep(S)          Sleep(S*1000)
+#define HDstat(S,B)         _stati64(S,B)
+#define HDstrcasecmp(A,B)   _stricmp(A,B)
+#define HDstrtoull(S,R,N)   _strtoui64(S,R,N)
+#define HDstrdup(S)         _strdup(S)
+#define HDtzset()           _tzset()
+#define HDunlink(S)         _unlink(S)
+#define HDwrite(F,M,Z)      _write(F,M,Z)
+
+#ifdef H5_HAVE_VISUAL_STUDIO
+/*
+ * The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
+ */
+#define HDmemset(X,C,Z)     memset((void*)(X),C,Z)
+
+struct timezone {
+    int tz_minuteswest;
+    int tz_dsttime;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+    H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
+    H5_DLL int Wsetenv(const char *name, const char *value, int overwrite);
+    H5_DLL char* Wgetlogin(void);
+    H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...);
+    H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
+#define HDsetenv(N,V,O)     Wsetenv(N,V,O)
+#define HDgetlogin()        Wgetlogin()
+#define HDsnprintf          c99_snprintf /*varargs*/
+#define HDvsnprintf         c99_vsnprintf /*varargs*/
+#if _MSC_VER >= 1900  /* VS 2015 */
+    /* In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
+     * variable declared in time.h. That variable was deprecated and in VS 2015
+     * is removed, with _get_timezone replacing it.
+     */
+    #define HDget_timezone(V)    _get_timezone(V);
+#endif
+
+#endif /* H5_HAVE_VISUAL_STUDIO */
+
+/* Non-POSIX functions */
+
+/* Don't use actual pthread_self on Windows because the return
+ * type cannot be cast as a ulong like other systems. */
+#define HDpthread_self_ulong() ((unsigned long)GetCurrentThreadId())
+
+#ifndef H5_HAVE_MINGW
+#define HDftruncate(F,L)    _chsize_s(F,L)
+#define HDfseek(F,O,W)      _fseeki64(F,O,W)
+#endif /* H5_HAVE_MINGW */
+
+#endif /* H5_HAVE_WIN32_API */
+
diff --git a/gatb-core/thirdparty/hdf5/src/hdf5.h b/gatb-core/thirdparty/hdf5/src/hdf5.h
new file mode 100644
index 0000000..fb41007
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/hdf5.h
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This is the main public HDF5 include file.  Put further information in
+ * a particular header file and include that here, don't fill this file with
+ * lots of gunk...
+ */
+#ifndef _HDF5_H
+#define _HDF5_H
+
+#include "H5public.h"
+#include "H5Apublic.h"		/* Attributes				*/
+#include "H5ACpublic.h"		/* Metadata cache			*/
+#include "H5Dpublic.h"		/* Datasets				*/
+#include "H5Epublic.h"		/* Errors				*/
+#include "H5Fpublic.h"		/* Files				*/
+#include "H5FDpublic.h"		/* File drivers				*/
+#include "H5Gpublic.h"		/* Groups				*/
+#include "H5Ipublic.h"		/* ID management			*/
+#include "H5Lpublic.h"		/* Links				*/
+#include "H5MMpublic.h"		/* Memory management			*/
+#include "H5Opublic.h"		/* Object headers			*/
+#include "H5Ppublic.h"      /* Property lists           */
+#include "H5PLpublic.h"     /* Plugins           */
+#include "H5Rpublic.h"		/* References				*/
+#include "H5Spublic.h"		/* Dataspaces				*/
+#include "H5Tpublic.h"		/* Datatypes				*/
+#include "H5Zpublic.h"		/* Data filters				*/
+
+/* Predefined file drivers */
+#include "H5FDcore.h"		/* Files stored entirely in memory	*/
+#include "H5FDfamily.h"		/* File families 			*/
+#include "H5FDlog.h"        	/* sec2 driver with I/O logging (for debugging) */
+#include "H5FDmpi.h"            /* MPI-based file drivers		*/
+#include "H5FDmulti.h"		/* Usage-partitioned file family	*/
+#include "H5FDsec2.h"		/* POSIX unbuffered file I/O		*/
+#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
+#ifdef H5_HAVE_WINDOWS
+#include "H5FDwindows.h"        /* Windows buffered I/O     */
+#endif
+#include "H5FDdirect.h"     	/* Linux direct I/O			*/
+
+#endif
diff --git a/gatb-core/thirdparty/hdf5/src/libhdf5.settings.in b/gatb-core/thirdparty/hdf5/src/libhdf5.settings.in
new file mode 100644
index 0000000..01e0403
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/src/libhdf5.settings.in
@@ -0,0 +1,72 @@
+	    SUMMARY OF THE HDF5 CONFIGURATION
+	    =================================
+
+General Information:
+-------------------
+		   HDF5 Version: @H5_VERSION@
+		  Configured on: @CONFIG_DATE@
+		  Configured by: @CONFIG_USER@
+		 Configure mode: @CONFIG_MODE@
+		    Host system: @host_cpu at -@host_vendor at -@host_os@
+	      Uname information: @UNAME_INFO@
+		       Byte sex: @BYTESEX@
+		      Libraries: @STATIC_SHARED@
+	     Installation point: @prefix@
+
+Compiling Options:
+------------------
+               Compilation Mode: @CONFIG_MODE@
+                     C Compiler: @CC_VERSION@
+                         CFLAGS: @CFLAGS@
+                      H5_CFLAGS: @H5_CFLAGS@
+                      AM_CFLAGS: @AM_CFLAGS@
+                       CPPFLAGS: @CPPFLAGS@
+                    H5_CPPFLAGS: @H5_CPPFLAGS@
+                    AM_CPPFLAGS: @AM_CPPFLAGS@
+               Shared C Library: @enable_shared@
+               Static C Library: @enable_static@
+  Statically Linked Executables: @STATIC_EXEC@
+                        LDFLAGS: @LDFLAGS@
+                     H5_LDFLAGS: @H5_LDFLAGS@
+                     AM_LDFLAGS: @AM_LDFLAGS@
+ 	 	Extra libraries: @LIBS@
+ 		       Archiver: @AR@
+ 		 	 Ranlib: @RANLIB@
+ 	      Debugged Packages: @DEBUG_PKG@
+		    API Tracing: @TRACE_API@
+
+Languages:
+----------
+                        Fortran: @HDF_FORTRAN@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               Fortran Compiler: @FC_VERSION@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@          Fortran 2003 Compiler: @HAVE_FORTRAN_2003@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@                  Fortran Flags: @FCFLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               H5 Fortran Flags: @H5_FCFLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@               AM Fortran Flags: @AM_FCFLAGS@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@         Shared Fortran Library: @H5_FORTRAN_SHARED@
+ at BUILD_FORTRAN_CONDITIONAL_TRUE@         Static Fortran Library: @enable_static@
+
+                            C++: @HDF_CXX@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   C++ Compiler: @CXX_VERSION@
+ at BUILD_CXX_CONDITIONAL_TRUE@                      C++ Flags: @CXXFLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   H5 C++ Flags: @H5_CXXFLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@                   AM C++ Flags: @AM_CXXFLAGS@
+ at BUILD_CXX_CONDITIONAL_TRUE@             Shared C++ Library: @enable_shared@
+ at BUILD_CXX_CONDITIONAL_TRUE@             Static C++ Library: @enable_static@
+
+Features:
+---------
+                  Parallel HDF5: @PARALLEL@
+             High Level library: @HDF5_HL@
+                   Threadsafety: @THREADSAFE@
+            Default API Mapping: @DEFAULT_API_VERSION@
+ With Deprecated Public Symbols: @DEPRECATED_SYMBOLS@
+         I/O filters (external): @EXTERNAL_FILTERS@
+                            MPE: @MPE@
+                     Direct VFD: @DIRECT_VFD@
+                        dmalloc: @HAVE_DMALLOC@
+Clear file buffers before write: @CLEARFILEBUF@
+           Using memory checker: @USINGMEMCHECKER@
+         Function Stack Tracing: @CODESTACK@
+      Strict File Format Checks: @STRICT_FORMAT_CHECKS@
+   Optimization Instrumentation: @INSTRUMENT@
diff --git a/gatb-core/thirdparty/hdf5/tools/CMakeLists.txt b/gatb-core/thirdparty/hdf5/tools/CMakeLists.txt
new file mode 100644
index 0000000..97cd79c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/CMakeLists.txt
@@ -0,0 +1,55 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_TOOLS)
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_SOURCE_DIR}/lib)
+
+# --------------------------------------------------------------------
+# If testing was NOT enabled, then we need to build the tools library
+# --------------------------------------------------------------------
+# Patrick added: as stated in hdf5-1.8.18/release_docs/INSTALL_CMake.txt
+#   hdf5 lib has to be built using:  
+#     cmake [...] -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON [...]
+#   within gatb-core, we do set HDF5_BUILD_TOOLS to true in 
+#   gatb-core/gatb-core/thirdparty/CMakeLists.txt, but we not use BUILD_TESTING. 
+#   So, we need to compile the  tools library.
+#if (NOT BUILD_TESTING)
+  add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/lib)
+#endif (NOT BUILD_TESTING)
+
+#-- Add the h5diff and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5diff)
+
+#-- Add the h5ls executable
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5ls)
+
+#-- Misc Executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/misc)
+
+#-- Add the h5import and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5import)
+
+#-- h5Repack executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5repack)
+
+#-- Add the h5dump and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5jam)
+
+#-- Add the h5copy and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5copy)
+
+#-- Add the h5stat and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5stat)
+
+#-- Add the h5dump and test executables
+add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5dump)
+
+#-- Add the perform and test executables
+#add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/perform)
diff --git a/gatb-core/thirdparty/hdf5/tools/COPYING b/gatb-core/thirdparty/hdf5/tools/COPYING
new file mode 100644
index 0000000..6903daf
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/COPYING
@@ -0,0 +1,16 @@
+
+  Copyright by  The HDF Group and 
+                The Board of Trustees of the University of Illinois. 
+  All rights reserved. 
+
+  The files and subdirectories in this directory are part of HDF5.  
+  The full HDF5 copyright notice, including terms governing use, 
+  modification, and redistribution, is contained in the files COPYING 
+  and Copyright.html.  COPYING can be found at the root of the source 
+  code distribution tree; Copyright.html can be found at the root 
+  level of an installed copy of the electronic HDF5 document set and 
+  is linked from the top-level documents page.  It can also be found 
+  at http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not 
+  have access to either file, you may request a copy from 
+  help at hdfgroup.org. 
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/CMakeLists.txt b/gatb-core/thirdparty/hdf5/tools/h5dump/CMakeLists.txt
new file mode 100644
index 0000000..dbac8a8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/CMakeLists.txt
@@ -0,0 +1,80 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_TOOLS_H5DUMP)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5dump executables
+# --------------------------------------------------------------------
+add_executable (gatb-h5dump
+    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump.c
+    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump_ddl.c
+    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump_xml.c
+)
+TARGET_NAMING (gatb-h5dump STATIC)
+TARGET_C_PROPERTIES (gatb-h5dump STATIC " " " ")
+target_link_libraries (gatb-h5dump  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (gatb-h5dump PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};gatb-h5dump")
+
+# (rayan) attempt at static linking, not sure if it works properly
+if (static)
+    set_target_properties(gatb-h5dump PROPERTIES LINK_SEARCH_START_STATIC 1)
+    set_target_properties(gatb-h5dump PROPERTIES LINK_SEARCH_END_STATIC 1)
+    set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+    if (APPLE)
+        set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++") #removed -static because doesn't work on mac's
+    else()
+        set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static")
+    endif()
+   message ("STATIC BINARIES for gatb-h5dump")
+else()
+   message ("DYNAMIC BINARIES for gatb-h5dump")
+endif()
+
+
+set (H5_DEP_EXECUTABLES gatb-h5dump)
+
+#if (BUILD_TESTING)
+#  # --------------------------------------------------------------------
+#  # Add the h5dump test executable
+#  # --------------------------------------------------------------------
+#  if (HDF5_BUILD_GENERATORS)
+#    add_executable (h5dumpgentest ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dumpgentest.c)
+#    TARGET_NAMING (h5dumpgentest STATIC)
+#    TARGET_C_PROPERTIES (h5dumpgentest STATIC " " " ")
+#    target_link_libraries (h5dumpgentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+#    set_target_properties (h5dumpgentest PROPERTIES FOLDER generator/tools)
+#
+#   #add_test (NAME h5dumpgentest COMMAND $<TARGET_FILE:h5dumpgentest>)
+#  endif (HDF5_BUILD_GENERATORS)
+#
+#  include (CMakeTests.cmake)
+#
+#  include (CMakeTestsPBITS.cmake)
+#
+#  include (CMakeTestsXML.cmake)
+#endif (BUILD_TESTING)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+
+#INSTALL_PROGRAM_PDB (gatb-h5dump ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+install (
+    TARGETS
+        gatb-h5dump
+    EXPORT
+        ${HDF5_EXPORTED_TARGETS}
+    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+)
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/binread.c b/gatb-core/thirdparty/hdf5/tools/h5dump/binread.c
new file mode 100644
index 0000000..74db92c
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/binread.c
@@ -0,0 +1,97 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ This program reads binary output from h5dump (-b option).
+ To use change the following 3 symbols accordingly.
+ For example, to read 2 elements of a float type , define
+
+  #define NELMTS     2
+  #define TYPE       float
+  #define FORMAT     "%f "
+
+*/
+
+#define NELMTS     6
+#define TYPE       int
+#define FORMAT     "%d "
+
+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (void)
+{
+    fprintf(stderr, "usage: binread FILE_NAME\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: main program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+main (int argc, const char *argv[])
+{
+    FILE  *stream;
+    size_t numread;
+    TYPE   buf[NELMTS];
+    size_t i, nelmts = NELMTS;
+    char  *fname=NULL;
+
+    if (argc != 2) {
+        usage();
+        exit(1);
+    }
+
+    fname = strdup(argv[1]);
+
+    if((stream = fopen(fname, "rb")) != NULL) {
+        numread = fread(buf, sizeof( TYPE ), nelmts, stream);
+        printf("Number of items read = %llu\n", (unsigned long long)numread);
+
+        for (i = 0; i < nelmts; i++) {
+            printf(FORMAT,buf[i]);
+        }
+        printf("\n");
+
+        fclose(stream);
+    }
+    else
+        printf("File %s could not be opened\n", fname);
+
+    free(fname);
+
+    return 0;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.c b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.c
new file mode 100644
index 0000000..9efb6db
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.c
@@ -0,0 +1,1788 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "h5dump.h"
+#include "h5dump_ddl.h"
+#include "h5dump_xml.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5dump"
+
+static const char   *driver = NULL;      /* The driver to open the file with. */
+const char          *outfname=NULL;
+static int           doxml = 0;
+static int           useschema = 1;
+static const char   *xml_dtd_uri = NULL;
+
+/* module-scoped variables for XML option */
+#define DEFAULT_XSD     "http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd"
+#define DEFAULT_DTD     "http://www.hdfgroup.org/HDF5/XML/DTD/HDF5-File.dtd"
+
+/* Standard DDL output */
+static const dump_functions ddl_function_table = {
+    dump_group,
+    dump_named_datatype,
+    dump_dataset,
+    dump_dataspace,
+    dump_datatype,
+    dump_attr_cb,
+    dump_data
+};
+
+/* XML output */
+static const dump_functions xml_function_table = {
+    xml_dump_group,
+    xml_dump_named_datatype,
+    xml_dump_dataset,
+    xml_dump_dataspace,
+    xml_dump_datatype,
+    xml_dump_attr,
+    xml_dump_data
+};
+
+/* internal functions */
+static void     init_prefix(char **prfx, size_t prfx_len);
+
+/* a structure for handling the order command-line parameters come in */
+struct handler_t {
+    void (*func)(hid_t, const char *, void *, int, const char *);
+    char *obj;
+    struct subset_t *subset_info;
+};
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters. The long-named ones can be partially spelled. When
+ * adding more, make sure that they don't clash with each other.
+ */
+/* The following initialization makes use of C language cancatenating */
+/* "xxx" "yyy" into "xxxyyy". */
+static const char *s_opts = "hn*peyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o*b*F:s:S:A*q:z:m:RECM:O*N:";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    { "contents", optional_arg, 'n' },
+    { "properties", no_arg, 'p' },
+    { "superblock", no_arg, 'B' },
+    { "boot-block", no_arg, 'B' },
+    { "boot-bloc", no_arg, 'B' },
+    { "boot-blo", no_arg, 'B' },
+    { "boot-bl", no_arg, 'B' },
+    { "boot-b", no_arg, 'B' },
+    { "boot", no_arg, 'B' },
+    { "boo", no_arg, 'B' },
+    { "bo", no_arg, 'B' },
+    { "header", no_arg, 'H' },
+    { "heade", no_arg, 'H' },
+    { "head", no_arg, 'H' },
+    { "hea", no_arg, 'H' },
+    { "object-ids", no_arg, 'i' },
+    { "object-id", no_arg, 'i' },
+    { "object-i", no_arg, 'i' },
+    { "object", no_arg, 'i' },
+    { "objec", no_arg, 'i' },
+    { "obje", no_arg, 'i' },
+    { "obj", no_arg, 'i' },
+    { "ob", no_arg, 'i' },
+    { "version", no_arg, 'V' },
+    { "versio", no_arg, 'V' },
+    { "versi", no_arg, 'V' },
+    { "vers", no_arg, 'V' },
+    { "ver", no_arg, 'V' },
+    { "ve", no_arg, 'V' },
+    { "attribute", require_arg, 'a' },
+    { "attribut", require_arg, 'a' },
+    { "attribu", require_arg, 'a' },
+    { "attrib", require_arg, 'a' },
+    { "attri", require_arg, 'a' },
+    { "attr", require_arg, 'a' },
+    { "att", require_arg, 'a' },
+    { "at", require_arg, 'a' },
+    { "block", require_arg, 'k' },
+    { "bloc", require_arg, 'k' },
+    { "blo", require_arg, 'k' },
+    { "bl", require_arg, 'k' },
+    { "count", require_arg, 'c' },
+    { "coun", require_arg, 'c' },
+    { "cou", require_arg, 'c' },
+    { "co", require_arg, 'c' },
+    { "dataset", require_arg, 'd' },
+    { "datase", require_arg, 'd' },
+    { "datas", require_arg, 'd' },
+    { "datatype", require_arg, 't' },
+    { "datatyp", require_arg, 't' },
+    { "dataty", require_arg, 't' },
+    { "datat", require_arg, 't' },
+    { "filedriver", require_arg, 'f' },
+    { "filedrive", require_arg, 'f' },
+    { "filedriv", require_arg, 'f' },
+    { "filedri", require_arg, 'f' },
+    { "filedr", require_arg, 'f' },
+    { "filed", require_arg, 'f' },
+    { "file", require_arg, 'f' },
+    { "fil", require_arg, 'f' },
+    { "fi", require_arg, 'f' },
+    { "group", require_arg, 'g' },
+    { "grou", require_arg, 'g' },
+    { "gro", require_arg, 'g' },
+    { "gr", require_arg, 'g' },
+    { "output", optional_arg, 'o' },
+    { "outpu", optional_arg, 'o' },
+    { "outp", optional_arg, 'o' },
+    { "out", optional_arg, 'o' },
+    { "ou", optional_arg, 'o' },
+    { "soft-link", require_arg, 'l' },
+    { "soft-lin", require_arg, 'l' },
+    { "soft-li", require_arg, 'l' },
+    { "soft-l", require_arg, 'l' },
+    { "soft", require_arg, 'l' },
+    { "sof", require_arg, 'l' },
+    { "start", require_arg, 's' },
+    { "star", require_arg, 's' },
+    { "sta", require_arg, 's' },
+    { "stride", require_arg, 'S' },
+    { "strid", require_arg, 'S' },
+    { "string", no_arg, 'r' },
+    { "strin", no_arg, 'r' },
+    { "use-dtd", no_arg, 'u' },
+    { "use-dt", no_arg, 'u' },
+    { "use-d", no_arg, 'u' },
+    { "use-", no_arg, 'u' },
+    { "use", no_arg, 'u' },
+    { "us", no_arg, 'u' },
+    { "u", no_arg, 'u' },
+    { "width", require_arg, 'w' },
+    { "widt", require_arg, 'w' },
+    { "wid", require_arg, 'w' },
+    { "wi", require_arg, 'w' },
+    { "xml-dtd", require_arg, 'D' },
+    { "xml-dt", require_arg, 'D' },
+    { "xml-d", require_arg, 'D' },
+    { "xml-ns", require_arg, 'X' },
+    { "xml-n", require_arg, 'X' },
+    { "xml", no_arg, 'x' },
+    { "xm", no_arg, 'x' },
+    { "onlyattr", optional_arg, 'A' },
+    { "escape", no_arg, 'e' },
+    { "noindex", no_arg, 'y' },
+    { "binary", optional_arg, 'b' },
+    { "form", require_arg, 'F' },
+    { "sort_by", require_arg, 'q' },
+    { "sort_order", require_arg, 'z' },
+    { "format", require_arg, 'm' },
+    { "region", no_arg, 'R' },
+    { "enable-error-stack", no_arg, 'E' },
+    { "packed-bits", require_arg, 'M' },
+    { "no-compact-subset", no_arg, 'C' },
+    { "ddl", optional_arg, 'O' },
+    { "any_path", require_arg, 'N' },
+    { NULL, 0, '\0' }
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown MPI & HDF5 and call exit()
+ *
+ * Return:      Does not return
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, 31. January 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    HDexit(ret);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message about dumper
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(const char *prog)
+{
+    FLUSHSTREAM(rawoutstream);
+    PRINTSTREAM(rawoutstream, "usage: %s [OPTIONS] files\n", prog);
+    PRINTVALSTREAM(rawoutstream, "  OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "     -h,   --help         Print a usage message and exit\n");
+    PRINTVALSTREAM(rawoutstream, "     -V,   --version      Print version number and exit\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- File Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -n,   --contents     Print a list of the file contents and exit\n");
+    PRINTVALSTREAM(rawoutstream, "                          Optional value 1 also prints attributes.\n");
+    PRINTVALSTREAM(rawoutstream, "     -B,   --superblock   Print the content of the super block\n");
+    PRINTVALSTREAM(rawoutstream, "     -H,   --header       Print the header only; no data is displayed\n");
+    PRINTVALSTREAM(rawoutstream, "     -f D, --filedriver=D Specify which driver to open the file with\n");
+    PRINTVALSTREAM(rawoutstream, "     -o F, --output=F     Output raw data into file F\n");
+    PRINTVALSTREAM(rawoutstream, "     -b B, --binary=B     Binary file output, of form B\n");
+    PRINTVALSTREAM(rawoutstream, "     -O F, --ddl=F        Output ddl text into file F\n");
+    PRINTVALSTREAM(rawoutstream, "                          Use blank(empty) filename F to suppress ddl display\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Object Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -a P, --attribute=P  Print the specified attribute\n");
+    PRINTVALSTREAM(rawoutstream, "                          If an attribute name contains a slash (/), escape the\n");
+    PRINTVALSTREAM(rawoutstream, "                          slash with a preceding backslash (\\).\n");
+    PRINTVALSTREAM(rawoutstream, "                          (See example section below.)\n");
+    PRINTVALSTREAM(rawoutstream, "     -d P, --dataset=P    Print the specified dataset\n");
+    PRINTVALSTREAM(rawoutstream, "     -g P, --group=P      Print the specified group and all members\n");
+    PRINTVALSTREAM(rawoutstream, "     -l P, --soft-link=P  Print the value(s) of the specified soft link\n");
+    PRINTVALSTREAM(rawoutstream, "     -t P, --datatype=P   Print the specified named datatype\n");
+    PRINTVALSTREAM(rawoutstream, "     -N P, --any_path=P   Print any attribute, dataset, group, datatype, or link that matches P\n");
+    PRINTVALSTREAM(rawoutstream, "                          P can be the absolute path or just a relative path.\n");
+    PRINTVALSTREAM(rawoutstream, "     -A,   --onlyattr     Print the header and value of attributes\n");
+    PRINTVALSTREAM(rawoutstream, "                          Optional value 0 suppresses printing attributes.\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Object Property Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -i,   --object-ids   Print the object ids\n");
+    PRINTVALSTREAM(rawoutstream, "     -p,   --properties   Print dataset filters, storage layout and fill value\n");
+    PRINTVALSTREAM(rawoutstream, "     -M L, --packedbits=L Print packed bits as unsigned integers, using mask\n");
+    PRINTVALSTREAM(rawoutstream, "                          format L for an integer dataset specified with\n");
+    PRINTVALSTREAM(rawoutstream, "                          option -d. L is a list of offset,length values,\n");
+    PRINTVALSTREAM(rawoutstream, "                          separated by commas. Offset is the beginning bit in\n");
+    PRINTVALSTREAM(rawoutstream, "                          the data value and length is the number of bits of\n");
+    PRINTVALSTREAM(rawoutstream, "                          the mask.\n");
+    PRINTVALSTREAM(rawoutstream, "     -R,   --region       Print dataset pointed by region references\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Formatting Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -e,   --escape       Escape non printing characters\n");
+    PRINTVALSTREAM(rawoutstream, "     -r,   --string       Print 1-byte integer datasets as ASCII\n");
+    PRINTVALSTREAM(rawoutstream, "     -y,   --noindex      Do not print array indices with the data\n");
+    PRINTVALSTREAM(rawoutstream, "     -m T, --format=T     Set the floating point output format\n");
+    PRINTVALSTREAM(rawoutstream, "     -q Q, --sort_by=Q    Sort groups and attributes by index Q\n");
+    PRINTVALSTREAM(rawoutstream, "     -z Z, --sort_order=Z Sort groups and attributes by order Z\n");
+    PRINTVALSTREAM(rawoutstream, "     --enable-error-stack Prints messages from the HDF5 error stack as they\n");
+    PRINTVALSTREAM(rawoutstream, "                          occur.\n");
+    PRINTVALSTREAM(rawoutstream, "     --no-compact-subset  Disable compact form of subsetting and allow the use\n");
+    PRINTVALSTREAM(rawoutstream, "                          of \"[\" in dataset names.\n");
+    PRINTVALSTREAM(rawoutstream, "     -w N, --width=N      Set the number of columns of output. A value of 0 (zero)\n");
+    PRINTVALSTREAM(rawoutstream, "                          sets the number of columns to the maximum (65535).\n");
+    PRINTVALSTREAM(rawoutstream, "                          Default width is 80 columns.\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- XML Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -x,   --xml          Output in XML using Schema\n");
+    PRINTVALSTREAM(rawoutstream, "     -u,   --use-dtd      Output in XML using DTD\n");
+    PRINTVALSTREAM(rawoutstream, "     -D U, --xml-dtd=U    Use the DTD or schema at U\n");
+    PRINTVALSTREAM(rawoutstream, "     -X S, --xml-ns=S     (XML Schema) Use qualified names n the XML\n");
+    PRINTVALSTREAM(rawoutstream, "                          \":\": no namespace, default: \"hdf5:\"\n");
+    PRINTVALSTREAM(rawoutstream, "                          E.g., to dump a file called `-f', use h5dump -- -f\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Subsetting Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, " Subsetting is available by using the following options with a dataset\n");
+    PRINTVALSTREAM(rawoutstream, " option. Subsetting is done by selecting a hyperslab from the data.\n");
+    PRINTVALSTREAM(rawoutstream, " Thus, the options mirror those for performing a hyperslab selection.\n");
+    PRINTVALSTREAM(rawoutstream, " One of the START, COUNT, STRIDE, or BLOCK parameters are mandatory if you do subsetting.\n");
+    PRINTVALSTREAM(rawoutstream, " The STRIDE, COUNT, and BLOCK parameters are optional and will default to 1 in\n");
+    PRINTVALSTREAM(rawoutstream, " each dimension. START is optional and will default to 0 in each dimension.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      -s START,  --start=START    Offset of start of subsetting selection\n");
+    PRINTVALSTREAM(rawoutstream, "      -S STRIDE, --stride=STRIDE  Hyperslab stride\n");
+    PRINTVALSTREAM(rawoutstream, "      -c COUNT,  --count=COUNT    Number of blocks to include in selection\n");
+    PRINTVALSTREAM(rawoutstream, "      -k BLOCK,  --block=BLOCK    Size of block in hyperslab\n");
+    PRINTVALSTREAM(rawoutstream, "  START, COUNT, STRIDE, and BLOCK - is a list of integers the number of which are equal to the\n");
+    PRINTVALSTREAM(rawoutstream, "      number of dimensions in the dataspace being queried\n");
+    PRINTVALSTREAM(rawoutstream, "      (Alternate compact form of subsetting is described in the Reference Manual)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Option Argument Conventions ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "  D - is the file driver to use in opening the file. Acceptable values\n");
+    PRINTVALSTREAM(rawoutstream, "      are \"sec2\", \"family\", \"split\", \"multi\", \"direct\", and \"stream\". Without\n");
+    PRINTVALSTREAM(rawoutstream, "      the file driver flag, the file will be opened with each driver in\n");
+    PRINTVALSTREAM(rawoutstream, "      turn and in the order specified above until one driver succeeds\n");
+    PRINTVALSTREAM(rawoutstream, "      in opening the file.\n");
+    PRINTVALSTREAM(rawoutstream, "      See examples below for family, split, and multi driver special file name usage.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  F - is a filename.\n");
+    PRINTVALSTREAM(rawoutstream, "  P - is the full path from the root group to the object.\n");
+    PRINTVALSTREAM(rawoutstream, "  N - is an integer greater than 1.\n");
+    PRINTVALSTREAM(rawoutstream, "  T - is a string containing the floating point format, e.g '%%.3f'\n");
+    PRINTVALSTREAM(rawoutstream, "  U - is a URI reference (as defined in [IETF RFC 2396],\n");
+    PRINTVALSTREAM(rawoutstream, "        updated by [IETF RFC 2732])\n");
+    PRINTVALSTREAM(rawoutstream, "  B - is the form of binary output: NATIVE for a memory type, FILE for the\n");
+    PRINTVALSTREAM(rawoutstream, "        file type, LE or BE for pre-existing little or big endian types.\n");
+    PRINTVALSTREAM(rawoutstream, "        Must be used with -o (output file) and it is recommended that\n");
+    PRINTVALSTREAM(rawoutstream, "        -d (dataset) is used. B is an optional argument, defaults to NATIVE\n");
+    PRINTVALSTREAM(rawoutstream, "  Q - is the sort index type. It can be \"creation_order\" or \"name\" (default)\n");
+    PRINTVALSTREAM(rawoutstream, "  Z - is the sort order type. It can be \"descending\" or \"ascending\" (default)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Examples ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  1) Attribute foo of the group /bar_none in file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -a /bar_none/foo quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "     Attribute \"high/low\" of the group /bar_none in the file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -a \"/bar_none/high\\/low\" quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  2) Selecting a subset from dataset /foo in file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -s \"0,1\" -S \"1,1\" -c \"2,3\" -k \"2,2\" quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  3) Saving dataset 'dset' in file quux.h5 to binary file 'out.bin'\n");
+    PRINTVALSTREAM(rawoutstream, "        using a little-endian type\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -b LE -o out.bin quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  4) Display two packed bits (bits 0-1 and bits 4-6) in the dataset /dset\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -M 0,1,4,3 quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  5) Dataset foo in files file1.h5 file2.h5 file3.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo file1.h5 file2.h5 file3.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  6) Dataset foo in split files splitfile-m.h5 splitfile-r.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f split splitfile\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  7) Dataset foo in multi files mf-s.h5, mf-b.h5, mf-r.h5, mf-g.h5, mf-l.h5 and mf-o.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f multi mf\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  8) Dataset foo in family files fam00000.h5 fam00001.h5 and fam00002.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f family fam%%05d.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_add
+ *
+ * Purpose: Add a new set of tables
+ *
+ * Return: index of added table on success, -1 on failure
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_add in h5trav.c by Quincey Koziol
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+table_list_add(hid_t oid, unsigned long file_no)
+{
+    size_t      idx;         /* Index of table to use */
+    find_objs_t info;
+
+    /* Allocate space if necessary */
+    if(table_list.nused == table_list.nalloc) {
+        h5dump_table_items_t    *tmp_ptr;
+
+        table_list.nalloc = MAX(1, table_list.nalloc * 2);
+        if(NULL == (tmp_ptr = (h5dump_table_items_t *)HDrealloc(table_list.tables, table_list.nalloc * sizeof(table_list.tables[0]))))
+            return -1;
+        table_list.tables = tmp_ptr;
+    } /* end if */
+
+    /* Append it */
+    idx = table_list.nused++;
+    table_list.tables[idx].fileno = file_no;
+    table_list.tables[idx].oid = oid;
+    if(H5Iinc_ref(oid) < 0) {
+        table_list.nused--;
+        return -1;
+    }
+    if(init_objs(oid, &info, &table_list.tables[idx].group_table,
+                 &table_list.tables[idx].dset_table, &table_list.tables[idx].type_table) < 0) {
+        H5Idec_ref(oid);
+        table_list.nused--;
+        return -1;
+    }
+
+#ifdef H5DUMP_DEBUG
+    dump_tables(&info);
+#endif /* H5DUMP_DEBUG */
+
+    return((ssize_t) idx);
+} /* end table_list_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_visited
+ *
+ * Purpose: Check if a table already exists for the specified fileno
+ *
+ * Return: The index of the matching table, or -1 if no matches found
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_visited in h5trav.c by Quincey Koziol
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+table_list_visited(unsigned long file_no)
+{
+    size_t u;           /* Local index variable */
+
+    /* Look for table */
+    for(u = 0; u < table_list.nused; u++)
+        /* Check for fileno value already in array */
+        if(table_list.tables[u].fileno == file_no)
+            return((ssize_t) u);
+
+    /* Didn't find table */
+    return(-1);
+} /* end table_list_visited() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_free
+ *
+ * Purpose: Frees the table list
+ *
+ * Return: void
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+table_list_free(void)
+{
+    size_t u;           /* Local index variable */
+
+    /* Iterate over tables */
+    for(u = 0; u < table_list.nused; u++) {
+        /* Release object id */
+        if(H5Idec_ref(table_list.tables[u].oid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+
+        /* Free each table */
+        free_table(table_list.tables[u].group_table);
+        HDfree(table_list.tables[u].group_table);
+        free_table(table_list.tables[u].dset_table);
+        HDfree(table_list.tables[u].dset_table);
+        free_table(table_list.tables[u].type_table);
+        HDfree(table_list.tables[u].type_table);
+    }
+
+    /* Free the table list */
+    HDfree(table_list.tables);
+    table_list.tables = NULL;
+    table_list.nalloc = table_list.nused = 0;
+} /* end table_list_free() */
+
+/*-------------------------------------------------------------------------
+ * Function:    set_binary_form
+ *
+ * Purpose: set the binary form of output by translating from a string input
+ *          parameter to a integer return value
+ *
+ * Return: integer form of binary output or -1 if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *             June 28, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+set_binary_form(const char *form)
+{
+    int bform = -1;
+
+    if (HDstrcmp(form,"NATIVE") == 0 || HDstrcmp(form,"MEMORY") == 0) {
+        /* native form */
+        bform = 0;
+    }
+    else if (HDstrcmp(form,"FILE") == 0) /* file type form */
+        bform = 1;
+    else if (HDstrcmp(form,"LE") == 0) /* convert to little endian */
+        bform = 2;
+    else if (HDstrcmp(form,"BE") == 0) /* convert to big endian */
+        bform = 3;
+
+    return bform;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    set_sort_by
+ *
+ * Purpose: set the "by" form of sorting by translating from a string input
+ *          parameter to a H5_index_t return value
+ *          current sort values are [creation_order | name]
+ *
+ * Return: H5_index_t form of sort or H5_INDEX_UNKNOWN if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *              October 1, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_index_t
+set_sort_by(const char *form)
+{
+    H5_index_t idx_type = H5_INDEX_UNKNOWN;
+
+    if (HDstrcmp(form,"name")==0) /* H5_INDEX_NAME */
+        idx_type = H5_INDEX_NAME;
+    else if (HDstrcmp(form,"creation_order")==0) /* H5_INDEX_CRT_ORDER */
+        idx_type = H5_INDEX_CRT_ORDER;
+
+    return idx_type;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    set_sort_order
+ *
+ * Purpose: set the order of sorting by translating from a string input
+ *          parameter to a H5_iter_order_t return value
+ *          current order values are [ascending | descending ]
+ *
+ * Return: H5_iter_order_t form of order or H5_ITER_UNKNOWN if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *              October 1, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_iter_order_t
+set_sort_order(const char *form)
+{
+    H5_iter_order_t iter_order = H5_ITER_UNKNOWN;
+
+    if (HDstrcmp(form,"ascending")==0) /* H5_ITER_INC */
+        iter_order = H5_ITER_INC;
+    else if (HDstrcmp(form,"descending")==0) /* H5_ITER_DEC */
+        iter_order = H5_ITER_DEC;
+
+    return iter_order;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_hsize_list
+ *
+ * Purpose:     Parse a list of comma or space separated integers and return
+ *              them in a list. The string being passed into this function
+ *              should be at the start of the list you want to parse. You are
+ *              responsible for freeing the array returned from here.
+ *
+ *              Lists in the so-called "terse" syntax are separated by
+ *              semicolons (;). The lists themselves can be separated by
+ *              either commas (,) or white spaces.
+ *
+ * Return:      <none>
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 6. February 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+parse_hsize_list(const char *h_list, subset_d *d)
+{
+    hsize_t        *p_list;
+    const char     *ptr;
+    unsigned int    size_count = 0;
+    unsigned int    i = 0;
+    unsigned int    last_digit = 0;
+
+    if (!h_list || !*h_list || *h_list == ';')
+        return;
+
+    /* count how many integers do we have */
+    for (ptr = h_list; ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
+        if (HDisdigit(*ptr)) {
+            if (!last_digit)
+                /* the last read character wasn't a digit */
+                size_count++;
+
+            last_digit = 1;
+        }
+        else
+            last_digit = 0;
+
+    if (size_count == 0)
+        /* there aren't any integers to read */
+        return;
+
+    /* allocate an array for the integers in the list */
+    p_list = (hsize_t *)HDcalloc(size_count, sizeof(hsize_t));
+
+    for (ptr = h_list; i < size_count && ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
+        if(HDisdigit(*ptr)) {
+            /* we should have an integer now */
+            p_list[i++] = (hsize_t)HDstrtoull(ptr, NULL, 0);
+
+            while (HDisdigit(*ptr))
+                /* scroll to end of integer */
+                ptr++;
+        }
+    d->data = p_list;
+    d->len = size_count;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_subset_params
+ *
+ * Purpose:     Parse the so-called "terse" syntax for specifying subsetting
+ *              parameters.
+ *
+ * Return:      Success:    struct subset_t object
+ *              Failure:    NULL
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 6. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static struct subset_t *
+parse_subset_params(char *dset)
+{
+    struct subset_t *s = NULL;
+    char   *brace;
+
+    if (!disable_compact_subset && ((brace = HDstrrchr(dset, '[')) != NULL)) {
+        *brace++ = '\0';
+
+        s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
+        parse_hsize_list(brace, &s->start);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->stride);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->count);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->block);
+    }
+
+    return s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_mask_list
+ *
+ * Purpose:     Parse a list of comma or space separated integers and fill
+ *              the packed_bits list and counter. The string being passed into this function
+ *              should be at the start of the list you want to parse.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_mask_list(const char *h_list)
+{
+    int                soffset_value;
+    unsigned           offset_value;
+    int                slength_value;
+    unsigned           length_value;
+    unsigned long long temp_mask;
+    const char        *ptr = NULL;
+
+    /* sanity check */
+    HDassert(h_list);
+
+    HDmemset(packed_mask,0,sizeof(packed_mask));
+
+    packed_bits_num = 0;
+    /* scan in pair of offset,length separated by commas. */
+    ptr = h_list;
+    while (*ptr) {
+        /* scan for an offset which is an unsigned int */
+        if (!HDisdigit(*ptr)) {
+            error_msg("Bad mask list(%s)\n", h_list);
+            return FAIL;
+        }
+        soffset_value = HDatoi(ptr);
+        offset_value = (unsigned)soffset_value;
+        if (soffset_value < 0 || offset_value >= PACKED_BITS_SIZE_MAX) {
+            error_msg("Packed Bit offset value(%d) must be between 0 and %u\n",
+                    soffset_value, (unsigned)(PACKED_BITS_SIZE_MAX - 1));
+            return FAIL;
+        }
+
+        /* skip to end of integer */
+        while (HDisdigit(*++ptr))
+            ;
+        /* Look for the common separator */
+        if (*ptr++ != ',') {
+            error_msg("Bad mask list(%s), missing expected comma separator.\n", h_list);
+            return FAIL;
+        }
+
+        /* scan for a length which is a positive int */
+        if (!HDisdigit(*ptr)) {
+            error_msg("Bad mask list(%s)\n", h_list);
+            return FAIL;
+        }
+        slength_value = HDatoi(ptr);
+        if (slength_value <= 0) {
+            error_msg("Packed Bit length value(%d) must be positive.\n", slength_value);
+            return FAIL;
+        }
+        length_value = (unsigned)slength_value;
+        if ((offset_value + length_value) > PACKED_BITS_SIZE_MAX) {
+            error_msg("Packed Bit offset+length value(%u) too large. Max is %u\n",
+                       offset_value+length_value, (unsigned)PACKED_BITS_SIZE_MAX);
+            return FAIL;
+        }
+
+        /* skip to end of int */
+        while (HDisdigit(*++ptr))
+            ;
+
+        /* store the offset,length pair */
+        if (packed_bits_num >= PACKED_BITS_MAX) {
+            /* too many requests */
+            error_msg("Too many masks requested (max. %d). Mask list(%s)\n", PACKED_BITS_MAX, h_list);
+            return FAIL;
+        }
+        packed_offset[packed_bits_num] = offset_value;
+        packed_length[packed_bits_num] = length_value;
+        /* create the bit mask by left shift 1's by length, then negate it. */
+        /* After packed_mask is calculated, packed_length is not needed but  */
+        /* keep it for debug purpose. */
+        temp_mask = ~0ULL;
+        if(length_value < (int)(8 *sizeof(unsigned long long))) {
+            temp_mask = temp_mask << length_value;
+            packed_mask[packed_bits_num] = ~temp_mask;
+        }
+        else
+            packed_mask[packed_bits_num] = temp_mask;
+        packed_bits_num++;
+
+        /* skip a possible comma separator */
+        if (*ptr == ',') {
+            if (!(*++ptr)) {
+                /* unexpected end of string */
+                error_msg("Bad mask list(%s), unexpected end of string.\n", h_list);
+                return FAIL;
+            }
+        }
+    }
+    HDassert(packed_bits_num <= PACKED_BITS_MAX);
+    if (packed_bits_num == 0) {
+        /* got no masks! */
+        error_msg("Bad mask list(%s)\n", h_list);
+        return FAIL;
+    }
+    return SUCCEED;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    free_handler
+ *
+ * Purpose:     Convenience function to free the handler_t structures. Needs a
+ *              length variable (LEN) to know how many in the array it needs
+ *              to free
+ *
+ * Return:      Nothing
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+free_handler(struct handler_t *hand, int len)
+{
+    int i;
+
+    if(hand) {
+        for (i = 0; i < len; i++) {
+            if(hand[i].obj) {
+                HDfree(hand[i].obj);
+                hand[i].obj=NULL;
+            }
+
+            if (hand[i].subset_info) {
+                if(hand[i].subset_info->start.data)
+                    HDfree(hand[i].subset_info->start.data);
+                if(hand[i].subset_info->stride.data)
+                    HDfree(hand[i].subset_info->stride.data);
+                if(hand[i].subset_info->count.data)
+                    HDfree(hand[i].subset_info->count.data);
+                if(hand[i].subset_info->block.data)
+                    HDfree(hand[i].subset_info->block.data);
+
+                HDfree(hand[i].subset_info);
+                hand[i].subset_info=NULL;
+            }
+        }
+
+        HDfree(hand);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:    A pointer to an array of handler_t structures.
+ *                          These contain all the information needed to dump
+ *                          the necessary object.
+ *
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *  pvn June, 1, 2006. Add a switch for binary output
+ *
+ *-------------------------------------------------------------------------
+ */
+static struct handler_t *
+parse_command_line(int argc, const char *argv[])
+{
+    struct handler_t   *hand = NULL;
+    struct handler_t   *last_dset = NULL;
+    int                 i;
+    int                 opt;
+    int                 last_was_dset = FALSE;
+
+     /* no arguments */
+    if (argc == 1) {
+        usage(h5tools_getprogname());
+        goto error;
+    }
+
+    /* this will be plenty big enough to hold the info */
+    if((hand = (struct handler_t *)HDcalloc((size_t)argc, sizeof(struct handler_t)))==NULL) {
+        goto error;
+    }
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+parse_start:
+        switch ((char)opt) {
+        case 'R':
+            display_region = TRUE;
+            region_output = TRUE;
+            break;
+        case 'B':
+            display_bb = TRUE;
+            last_was_dset = FALSE;
+            break;
+        case 'n':
+            display_fi = TRUE;
+            last_was_dset = FALSE;
+            if ( opt_arg != NULL) {
+                h5trav_set_verbose(HDatoi(opt_arg));
+            }
+            break;
+        case 'p':
+            display_dcpl = TRUE;
+            break;
+        case 'y':
+            display_ai = FALSE;
+            break;
+        case 'e':
+            display_escape = TRUE;
+            break;
+        case 'H':
+            display_data = FALSE;
+            display_attr_data = FALSE;
+            last_was_dset = FALSE;
+            break;
+        case 'A':
+            if ( opt_arg != NULL) {
+                if(0 == HDatoi(opt_arg)) include_attrs = FALSE;
+            }
+            else {
+                display_data = FALSE;
+                display_attr_data = TRUE;
+                last_was_dset = FALSE;
+            }
+            break;
+        case 'i':
+            display_oid = TRUE;
+            last_was_dset = FALSE;
+            break;
+        case 'r':
+            display_char = TRUE;
+            break;
+        case 'V':
+            print_version(h5tools_getprogname());
+            free_handler(hand, argc);
+            hand = NULL;
+            h5tools_setstatus(EXIT_SUCCESS);
+            goto done;
+            break;
+        case 'w':
+            {
+                int sh5tools_nCols = HDatoi(opt_arg);
+
+                if (sh5tools_nCols <= 0)
+                    h5tools_nCols = 65535;
+                else
+                    h5tools_nCols = (unsigned)sh5tools_nCols;
+                last_was_dset = FALSE;
+            }
+            break;
+        case 'N':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_paths;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'a':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_attributes;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'd':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_datasets;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    hand[i].subset_info = parse_subset_params(hand[i].obj);
+                    last_dset = &hand[i];
+                    break;
+                }
+
+            last_was_dset = TRUE;
+            break;
+        case 'f':
+            driver = opt_arg;
+            break;
+        case 'g':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_groups;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'l':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_links;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 't':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_datatypes;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+
+        case 'O':
+            if (h5tools_set_output_file(opt_arg, 0) < 0) {
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'o':
+            if ( bin_output ) {
+                if (h5tools_set_data_output_file(opt_arg, 1) < 0) {
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+            }
+            else {
+                if(display_attr_data && !display_data) {
+                    if (h5tools_set_attr_output_file(opt_arg, 0) < 0) {
+                        usage(h5tools_getprogname());
+                        goto error;
+                    }
+                }
+                if(display_data || display_all) {
+                    if (h5tools_set_data_output_file(opt_arg, 0) < 0) {
+                        usage(h5tools_getprogname());
+                        goto error;
+                    }
+                }
+            }
+
+            usingdasho = TRUE;
+            last_was_dset = FALSE;
+            outfname = opt_arg;
+            break;
+
+        case 'b':
+            if ( opt_arg != NULL) {
+                if ( ( bin_form = set_binary_form(opt_arg)) < 0) {
+                    /* failed to set binary form */
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+            }
+            bin_output = TRUE;
+            if (outfname!=NULL) {
+                if (h5tools_set_data_output_file(outfname, 1) < 0)  {
+                    /* failed to set output file */
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+
+                last_was_dset = FALSE;
+            }
+            break;
+
+        case 'q':
+            if ( ( sort_by = set_sort_by(opt_arg)) < 0) {
+                /* failed to set "sort by" form */
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'z':
+            if ( ( sort_order = set_sort_order(opt_arg)) < 0) {
+                /* failed to set "sort order" form */
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'M':
+            if (!last_was_dset) {
+                error_msg("option `-%c' can only be used after --dataset option\n", opt);
+                goto error;
+            }
+            if (parse_mask_list(opt_arg) != SUCCEED){
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            display_packed_bits = TRUE;
+            break;
+
+        /** begin XML parameters **/
+        case 'x':
+            /* select XML output */
+            doxml = TRUE;
+            useschema = TRUE;
+            h5tools_dump_header_format = NULL;
+            dump_function_table = &xml_function_table;
+            h5tools_nCols = 0;
+            break;
+        case 'u':
+            doxml = TRUE;
+            useschema = FALSE;
+            xmlnsprefix = "";
+            h5tools_dump_header_format = NULL;
+            dump_function_table = &xml_function_table;
+            h5tools_nCols = 0;
+            break;
+        case 'D':
+            /* specify alternative XML DTD or schema */
+            /* To Do: check format of this value?  */
+            xml_dtd_uri = opt_arg;
+            h5tools_nCols = 0;
+            break;
+
+        case 'm':
+            /* specify alternative floating point printing format */
+            fp_format = opt_arg;
+            h5tools_nCols = 0;
+            break;
+
+        case 'X':
+            /* specify XML namespace (default="hdf5:"), or none */
+            /* To Do: check format of this value?  */
+            if (!useschema) {
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            if (HDstrcmp(opt_arg,":") == 0)
+                xmlnsprefix = "";
+            else
+                xmlnsprefix = opt_arg;
+            h5tools_nCols = 0;
+            break;
+        /** end XML parameters **/
+
+        /** begin subsetting parameters **/
+        case 's':
+        case 'S':
+        case 'c':
+        case 'k': {
+            struct subset_t *s;
+
+            if (!last_was_dset) {
+                error_msg("option `-%c' can only be used after --dataset option\n", opt);
+                goto error;
+            }
+
+            if (last_dset->subset_info) {
+                /*
+                 * This overrides the "terse" syntax if they actually mixed
+                 * the two.
+                 */
+                s = last_dset->subset_info;
+            }
+            else {
+                last_dset->subset_info = s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
+            }
+
+            /*
+             * slightly convoluted, but...we are only interested in options
+             * for subsetting: "--start", "--stride", "--count", and "--block"
+             * which can come in any order. If we run out of parameters (EOF)
+             * or run into one which isn't a subsetting parameter (NOT s, S,
+             * c, or K), then we exit the do-while look, set the subset_info
+             * to the structure we've been filling. If we've reached the end
+             * of the options, we exit the parsing (goto parse_end) otherwise,
+             * since we've "read" the next option, we need to parse it. So we
+             * jump to the beginning of the switch statement (goto parse_start).
+             */
+            do {
+                switch ((char)opt) {
+                case 's':
+                    if (s->start.data) {
+                        HDfree(s->start.data);
+                        s->start.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->start);
+                    break;
+                case 'S':
+                    if (s->stride.data) {
+                        HDfree(s->stride.data);
+                        s->stride.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->stride);
+                    break;
+                case 'c':
+                    if (s->count.data) {
+                        HDfree(s->count.data);
+                        s->count.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->count);
+                    break;
+                case 'k':
+                    if (s->block.data) {
+                        HDfree(s->block.data);
+                        s->block.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->block);
+                    break;
+                default:
+                    goto end_collect;
+                }
+            } while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF);
+
+end_collect:
+            last_was_dset = FALSE;
+
+            if (opt != EOF)
+                goto parse_start;
+            else
+                goto parse_end;
+        }
+        /** end subsetting parameters **/
+
+        case 'E':
+            enable_error_stack = TRUE;
+            break;
+        case 'C':
+            disable_compact_subset = TRUE;
+            break;
+        case 'h':
+            usage(h5tools_getprogname());
+            free_handler(hand, argc);
+            hand = NULL;
+            h5tools_setstatus(EXIT_SUCCESS);
+            goto done;
+        case '?':
+        default:
+            usage(h5tools_getprogname());
+            goto error;
+        }
+    }
+
+parse_end:
+    /* check for file name to be processed */
+    if (argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        goto error;
+    }
+done:
+    return hand;
+
+error:
+    if (hand) {
+        free_handler(hand, argc);
+        hand = NULL;
+    }
+    h5tools_setstatus(EXIT_FAILURE);
+
+    return hand;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     HDF5 dumper
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *        Albert Cheng
+ *        30. September 2000
+ *        Add the -o option--output file for datasets raw data
+ *
+ *        REMcG
+ *        November 2000
+ *        Changes to support XML.
+ *
+ *        Bill Wendling
+ *        Wednesday, 10. January 2001
+ *        Modified the way command line parameters are interpreted. They go
+ *        through one function call now (get_option).
+ *
+ *        Bill Wendling
+ *        Tuesday, 20. February 2001
+ *        Moved command line parsing to separate function. Made various
+ *        "display_*" flags global.
+ *
+ *        REMcG
+ *        August 2003
+ *        Major upgrade to XML support.
+ *
+ *        Pedro Vicente
+ *        September 2007
+ *        list objects in requested order (creation order or alphabetically)
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    hid_t               fid = -1;
+    hid_t               gid = -1;
+    H5E_auto2_t         func;
+    H5E_auto2_t         tools_func;
+    H5O_info_t          oi;
+    struct handler_t   *hand = NULL;
+    int                 i;
+    unsigned            u;
+    void               *edata;
+    void               *tools_edata;
+    char               *fname = NULL;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+    h5tools_dump_header_format = &h5tools_standardformat;
+    dump_function_table = &ddl_function_table;
+    dump_indent = 0;
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* Disable tools error reporting */
+    H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
+    H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL);
+
+    if((hand = parse_command_line(argc, argv))==NULL) {
+        goto done;
+    }
+
+    if (bin_output && outfname == NULL) {
+        error_msg("binary output requires a file name, use -o <filename>\n");
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    if (enable_error_stack) {
+        H5Eset_auto2(H5E_DEFAULT, func, edata);
+        H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata);
+    }
+
+    /* Check for conflicting options */
+    if (doxml) {
+        if (!display_all) {
+            error_msg("option \"%s\" not available for XML\n",
+                    "to display selected objects");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_bb) {
+            error_msg("option \"%s\" not available for XML\n", "--boot-block");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_oid == 1) {
+            error_msg("option \"%s\" not available for XML\n", "--object-ids");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_char == TRUE) {
+            error_msg("option \"%s\" not available for XML\n", "--string");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (usingdasho) {
+            error_msg("option \"%s\" not available for XML\n", "--output");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+    }
+    else {
+        if (xml_dtd_uri) {
+            warn_msg("option \"%s\" only applies with XML: %s\n", "--xml-dtd", xml_dtd_uri);
+        }
+    }
+
+    if (argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+    /* Initialize indexing options */
+    h5trav_set_index(sort_by, sort_order);
+
+    while(opt_ind < argc) {
+        fname = HDstrdup(argv[opt_ind++]);
+
+        fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, driver, NULL, 0);
+
+        if (fid < 0) {
+            error_msg("unable to open file \"%s\"\n", fname);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+
+        /* allocate and initialize internal data structure */
+        init_prefix(&prefix, prefix_len);
+
+        /* Prepare to find objects that might be targets of a reference */
+        fill_ref_path_table(fid);
+
+        if(doxml) {
+            /* initialize XML */
+            /* reset prefix! */
+            HDstrcpy(prefix, "");
+
+            /* make sure the URI is initialized to something */
+            if (xml_dtd_uri == NULL) {
+                if (useschema) {
+                    xml_dtd_uri = DEFAULT_XSD;
+                }
+                else {
+                    xml_dtd_uri = DEFAULT_DTD;
+                    xmlnsprefix = "";
+                }
+            }
+            else {
+                if (useschema && HDstrcmp(xmlnsprefix,"")) {
+                    error_msg("Cannot set Schema URL for a qualified namespace--use -X or -U option with -D \n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    goto done;
+                }
+            }
+        }
+
+        /* Get object info for root group */
+        if(H5Oget_info_by_name(fid, "/", &oi, H5P_DEFAULT) < 0) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+
+        /* Initialize object tables */
+        if(table_list_add(fid, oi.fileno) < 0) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        group_table = table_list.tables[0].group_table;
+        dset_table = table_list.tables[0].dset_table;
+        type_table = table_list.tables[0].type_table;
+
+        /* does there exist unamed committed datatype */
+        for (u = 0; u < type_table->nobjs; u++)
+            if (!type_table->objs[u].recorded) {
+                unamedtype = 1;
+                break;
+            } /* end if */
+
+        /* start to dump - display file header information */
+        if (!doxml) {
+            begin_obj(h5tools_dump_header_format->filebegin, fname, h5tools_dump_header_format->fileblockbegin);
+        }
+        else {
+            PRINTVALSTREAM(rawoutstream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+
+            /* alternative first element, depending on schema or DTD. */
+            if (useschema) {
+                if (HDstrcmp(xmlnsprefix,"") == 0) {
+                    PRINTSTREAM(rawoutstream, "<HDF5-File xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"%s\">\n",
+                            xml_dtd_uri);
+                }
+                else {
+                    /*  TO DO: make -url option work in this case (may need new option) */
+                    char *ns;
+                    char *indx;
+
+                    ns = HDstrdup(xmlnsprefix);
+                    indx = HDstrrchr(ns,(int)':');
+                    if (indx) *indx = '\0';
+
+                    PRINTSTREAM(rawoutstream, "<%sHDF5-File xmlns:%s=\"http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd\" "
+                            "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                            "xsi:schemaLocation=\"http://hdfgroup.org/HDF5/XML/schema/HDF5-File "
+                            "http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd\">\n",xmlnsprefix,ns);
+                    HDfree(ns);
+                }
+            }
+            else {
+                PRINTSTREAM(rawoutstream, "<!DOCTYPE HDF5-File PUBLIC \"HDF5-File.dtd\" \"%s\">\n", xml_dtd_uri);
+                PRINTVALSTREAM(rawoutstream, "<HDF5-File>\n");
+            }
+        }
+
+        if (!doxml) {
+            if (display_fi) {
+                PRINTVALSTREAM(rawoutstream, "\n");
+                dump_fcontents(fid);
+                end_obj(h5tools_dump_header_format->fileend,h5tools_dump_header_format->fileblockend);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                goto done;
+            }
+
+            if (display_bb)
+                dump_fcpl(fid);
+        }
+
+        if(display_all) {
+            if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
+                error_msg("unable to open root group\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            else {
+                if (!doxml)
+                    dump_indent += COL;
+                dump_function_table->dump_group_function(gid, "/" );
+                if (!doxml)
+                    dump_indent -= COL;
+                PRINTVALSTREAM(rawoutstream, "\n");
+            }
+
+            if(H5Gclose(gid) < 0) {
+                error_msg("unable to close root group\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+
+        }
+        else {
+            /* Note: this option is not supported for XML */
+            if(doxml) {
+                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+            } /* end if */
+
+            for(i = 0; i < argc; i++) {
+                if(hand[i].func) {
+                    hand[i].func(fid, hand[i].obj, hand[i].subset_info, 1, NULL);
+                }
+            }
+            PRINTVALSTREAM(rawoutstream, "\n");
+        }
+
+        if (!doxml) {
+            end_obj(h5tools_dump_header_format->fileend, h5tools_dump_header_format->fileblockend);
+            PRINTVALSTREAM(rawoutstream, "\n");
+        }
+        else {
+            PRINTSTREAM(rawoutstream, "</%sHDF5-File>\n", xmlnsprefix);
+        }
+        /* Free tables for objects */
+        table_list_free();
+
+        if(fid >=0)
+            if (H5Fclose(fid) < 0)
+                h5tools_setstatus(EXIT_FAILURE);
+
+        if(prefix) {
+            HDfree(prefix);
+            prefix = NULL;
+        }
+        if(fname) {
+            HDfree(fname);
+            fname = NULL;
+        }
+    } /* end while */
+
+    if(hand)
+        free_handler(hand, argc);
+
+    /* To Do:  clean up XML table */
+
+    leave(h5tools_getstatus());
+
+done:
+    /* Free tables for objects */
+    table_list_free();
+
+    if(fid >=0)
+        if (H5Fclose(fid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+
+    if(prefix) {
+        HDfree(prefix);
+        prefix = NULL;
+    }
+    if(fname) {
+        HDfree(fname);
+        fname = NULL;
+    }
+
+    if(hand)
+        free_handler(hand, argc);
+
+    /* To Do:  clean up XML table */
+
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
+    leave(h5tools_getstatus());
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5_fileaccess
+ *
+ * Purpose: Returns a file access template which is the default template
+ *      but with a file driver set according to the constant or
+ *      environment variable HDF5_DRIVER
+ *
+ * Return:  Success:    A file access property list
+ *
+ *      Failure:    -1
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, November 19, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5_fileaccess(void)
+{
+    static const char *multi_letters = "msbrglo";
+    const char  *val = NULL;
+    const char  *name;
+    char         s[1024];
+    hid_t        fapl = -1;
+
+    /* First use the environment variable, then the constant */
+    val = HDgetenv("HDF5_DRIVER");
+#ifdef HDF5_DRIVER
+    if (!val) val = HDF5_DRIVER;
+#endif
+
+    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1;
+    if (!val || !*val) return fapl; /*use default*/
+
+    HDstrncpy(s, val, sizeof s);
+    s[sizeof(s)-1] = '\0';
+    if (NULL==(name=HDstrtok(s, " \t\n\r"))) return fapl;
+
+    if (!HDstrcmp(name, "sec2")) {
+        /* Unix read() and write() system calls */
+        if (H5Pset_fapl_sec2(fapl)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "stdio")) {
+        /* Standard C fread() and fwrite() system calls */
+        if (H5Pset_fapl_stdio(fapl)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "core")) {
+        /* In-core temporary file with 1MB increment */
+        if (H5Pset_fapl_core(fapl, 1024*1024, FALSE)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "split")) {
+        /* Split meta data and raw data each using default driver */
+        if (H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "multi")) {
+        /* Multi-file driver, general case of the split driver */
+        H5FD_mem_t      memb_map[H5FD_MEM_NTYPES];
+        hid_t           memb_fapl[H5FD_MEM_NTYPES];
+        const char     *memb_name[H5FD_MEM_NTYPES];
+        char            sv[H5FD_MEM_NTYPES][1024];
+        haddr_t         memb_addr[H5FD_MEM_NTYPES];
+        H5FD_mem_t      mt;
+
+        HDmemset(memb_map, 0, sizeof memb_map);
+        HDmemset(memb_fapl, 0, sizeof memb_fapl);
+        HDmemset(memb_name, 0, sizeof memb_name);
+        HDmemset(memb_addr, 0, sizeof memb_addr);
+
+        HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
+        for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+            memb_fapl[mt] = H5P_DEFAULT;
+            memb_map[mt] = mt;
+            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+            memb_name[mt] = sv[mt];
+            memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
+        }
+
+        if (H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "family")) {
+        hsize_t fam_size = 100*1024*1024; /*100 MB*/
+
+        /* Family of files, each 1MB and using the default driver */
+        if ((val=HDstrtok(NULL, " \t\n\r")))
+            fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024);
+        if (H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT)<0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "log")) {
+        long log_flags = H5FD_LOG_LOC_IO;
+
+        /* Log file access */
+        if ((val = HDstrtok(NULL, " \t\n\r")))
+            log_flags = HDstrtol(val, NULL, 0);
+
+        if (H5Pset_fapl_log(fapl, NULL, (unsigned)log_flags, 0) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "direct")) {
+        /* Substitute Direct I/O driver with sec2 driver temporarily because
+         * some output has sec2 driver as the standard. */
+        if (H5Pset_fapl_sec2(fapl)<0) return -1;
+    }
+    else {
+        /* Unknown driver */
+        return -1;
+    }
+
+    return fapl;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    init_prefix
+ *
+ * Purpose:     allocate and initialize prefix
+ *
+ * Return:      void
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+init_prefix(char **prfx, size_t prfx_len)
+{
+    HDassert(prfx_len > 0);
+    *prfx = (char *)HDcalloc(prfx_len, 1);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_prefix
+ *
+ * Purpose:     Add object to prefix
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+add_prefix(char **prfx, size_t *prfx_len, const char *name)
+{
+    size_t new_len = HDstrlen(*prfx) + HDstrlen(name) + 2;
+
+    /* Check if we need more space */
+    if(*prfx_len <= new_len) {
+        *prfx_len = new_len + 1;
+        *prfx = (char *)HDrealloc(*prfx, *prfx_len);
+    }
+
+    /* Append object name to prefix */
+    HDstrcat(HDstrcat(*prfx, "/"), name);
+} /* end add_prefix */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.h b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.h
new file mode 100644
index 0000000..e9b8233
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump.h
@@ -0,0 +1,113 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_H__
+#define H5DUMP_H__
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_defines.h"
+
+/**
+ **  This is the global dispatch table for the dump functions.
+ **/
+/* the table of dump functions */
+typedef struct dump_functions_t {
+    void     (*dump_group_function) (hid_t, const char *);
+    void     (*dump_named_datatype_function) (hid_t, const char *);
+    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
+    void     (*dump_dataspace_function) (hid_t);
+    void     (*dump_datatype_function) (hid_t);
+    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
+    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
+} dump_functions;
+
+/* List of table structures.  There is one table structure for each file */
+typedef struct h5dump_table_items_t {
+    unsigned long   fileno;         /* File number that these tables refer to */
+    hid_t           oid;            /* ID of an object in this file, held open so fileno is consistent */
+    table_t         *group_table;   /* Table of groups */
+    table_t         *dset_table;    /* Table of datasets */
+    table_t         *type_table;    /* Table of datatypes */
+} h5dump_table_items_t;
+typedef struct h5dump_table_list_t {
+    size_t                  nalloc;
+    size_t                  nused;
+    h5dump_table_items_t    *tables;
+} h5dump_table_list_t;
+
+h5dump_table_list_t  table_list = {0, 0, NULL};
+table_t             *group_table = NULL, *dset_table = NULL, *type_table = NULL;
+unsigned            dump_indent = 0;              /*how far in to indent the line         */
+
+int          unamedtype = 0;     /* shared datatype with no name */
+hbool_t      hit_elink = FALSE;  /* whether we have traversed an external link */
+size_t       prefix_len = 1024;
+char         *prefix = NULL;
+const char   *fp_format = NULL;
+
+/* things to display or which are set via command line parameters */
+int          display_all       = TRUE;
+int          display_oid       = FALSE;
+int          display_data      = TRUE;
+int          display_attr_data = TRUE;
+int          display_char      = FALSE; /*print 1-byte numbers as ASCII */
+int          usingdasho        = FALSE;
+int          display_bb        = FALSE; /*superblock */
+int          display_dcpl      = FALSE; /*dcpl */
+int          display_fi        = FALSE; /*file index */
+int          display_ai        = TRUE;  /*array index */
+int          display_escape    = FALSE; /*escape non printable characters */
+int          display_region    = FALSE; /*print region reference data */
+int          disable_compact_subset= FALSE; /* disable compact form of subset notation */
+int          display_packed_bits = FALSE; /*print 1-8 byte numbers as packed bits*/
+int          include_attrs     = TRUE; /* Display attributes */
+
+/* sort parameters */
+H5_index_t   sort_by           = H5_INDEX_NAME; /*sort_by [creation_order | name]  */
+H5_iter_order_t sort_order     = H5_ITER_INC; /*sort_order [ascending | descending]   */
+
+#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
+#define PACKED_BITS_SIZE_MAX    (8*sizeof(long long))  /* Maximum bits size of integer types of packed-bits */
+/* mask list for packed bits */
+unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
+
+/* packed bits display parameters */
+unsigned packed_offset[PACKED_BITS_MAX];
+unsigned packed_length[PACKED_BITS_MAX];
+
+/*
+ * The global table is set to either ddl_function_table or
+ * xml_function_table in the initialization.
+ */
+const dump_functions *dump_function_table;
+
+#ifdef __cplusplus
+"C" {
+#endif
+
+void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
+hid_t    h5_fileaccess(void);
+ssize_t  table_list_add(hid_t oid, unsigned long file_no);
+ssize_t  table_list_visited(unsigned long file_no);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.c b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.c
new file mode 100644
index 0000000..c0b1833
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.c
@@ -0,0 +1,2128 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_extern.h"
+#include "h5dump_ddl.h"
+
+typedef struct {
+    hid_t fid;                      /* File ID being traversed */
+    const char *op_name;            /* Object name wanted */
+} trav_handle_udata_t;
+
+typedef struct {
+    const char *path;                 /* Path of object being searched */
+    const char *op_name;              /* Object name wanted */
+} trav_attr_udata_t;
+
+/* callback function used by H5Literate() */
+static herr_t   dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void *op_data);
+static int      dump_extlink(hid_t group, const char *linkname, const char *objname);
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_datatype
+ *
+ * Purpose:     Dump the datatype. Datatype can be HDF5 predefined
+ *              atomic datatype or committed/transient datatype.
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_datatype(hid_t type)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
+    h5dump_type_table = NULL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dataspace
+ *
+ * Purpose:     Dump the dataspace. Dataspace can be named dataspace,
+ *              array, or others.
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_dataspace(hid_t space)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_attr_cb
+ *
+ * Purpose:     attribute function callback called by H5Aiterate2, displays the attribute
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications: Pedro Vicente, October 4, 2007
+ *  Added H5A_info_t parameter to conform with H5Aiterate2
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+dump_attr_cb(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info, void H5_ATTR_UNUSED *_op_data)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+
+    hid_t       attr_id;
+    herr_t      ret = SUCCEED;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
+    oid_output = display_oid;
+    data_output = display_data;
+    attr_data_output = display_attr_data;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
+    h5dump_type_table = NULL;
+
+    if(attr_id < 0) {
+        h5tools_setstatus(EXIT_FAILURE);
+        ret = FAIL;
+    }
+
+    return ret;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_all_cb
+ *
+ * Purpose:     function callback called by H5Literate,
+ *                displays everything in the specified object
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  RMcG, November 2000
+ *   Added XML support. Also, optionally checks the op_data argument
+ *
+ * PVN, May 2008
+ *   Dump external links
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
+{
+    hid_t       obj;
+    herr_t      ret = SUCCEED;
+    char       *obj_path = NULL;    /* Full path of object */
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    /* Build the object's path name */
+    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    if(!obj_path) {
+        ret = FAIL;
+        goto done;
+    }
+
+    HDstrcpy(obj_path, prefix);
+    HDstrcat(obj_path, "/");
+    HDstrcat(obj_path, name);
+
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5O_info_t  oinfo;
+
+        /* Stat the object */
+        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
+            error_msg("unable to get object information for \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+            goto done;
+        } /* end if */
+
+        switch(oinfo.type) {
+        case H5O_TYPE_GROUP:
+            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
+                error_msg("unable to dump group \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                char *old_prefix; /* Pointer to previous prefix */
+
+                /* Keep copy of prefix before iterating into group */
+                old_prefix = HDstrdup(prefix);
+                HDassert(old_prefix);
+
+                /* Append group name to prefix */
+                add_prefix(&prefix, &prefix_len, name);
+
+                /* Iterate into group */
+                dump_function_table->dump_group_function(obj, name);
+
+                /* Restore old prefix name */
+                HDstrcpy(prefix, old_prefix);
+                HDfree(old_prefix);
+
+                /* Close group */
+                H5Gclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_DATASET:
+            if((obj = H5Dopen2(group, name, H5P_DEFAULT)) >= 0) {
+                if(oinfo.rc > 1 || hit_elink) {
+                    obj_t  *found_obj;    /* Found object */
+
+                    found_obj = search_obj(dset_table, oinfo.addr);
+
+                    if(found_obj == NULL) {
+                        ctx.indent_level++;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        h5tools_setstatus(EXIT_FAILURE);
+                        ret = FAIL;
+                        H5Dclose(obj);
+                        goto done;
+                    }
+                    else if(found_obj->displayed) {
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level++;
+
+                        ctx.need_prefix = TRUE;
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        H5Dclose(obj);
+                        goto done;
+                    }
+                    else {
+                        found_obj->displayed = TRUE;
+                    }
+                } /* end if */
+
+                dump_function_table->dump_dataset_function(obj, name, NULL);
+                H5Dclose(obj);
+            }
+            else {
+                error_msg("unable to dump dataset \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
+                error_msg("unable to dump datatype \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                dump_function_table->dump_named_datatype_function(obj, name);
+                H5Tclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            error_msg("unknown object \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+        }
+    } /* end if */
+    else {
+        char       *targbuf;
+
+        switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            ctx.need_prefix = TRUE;
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\" %s",
+                    h5tools_dump_header_format->softlinkbegin, name,
+                    h5tools_dump_header_format->softlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                /* print the value of a soft link */
+                /* Standard DDL: no modification */
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "LINKTARGET \"%s\"", targbuf);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->softlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->softlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->softlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\" %s",
+                    h5tools_dump_header_format->extlinkbegin, name,
+                    h5tools_dump_header_format->extlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                indentation(dump_indent);
+                error_msg("unable to get external link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } /* end if */
+            else {
+                const char *filename;
+                const char *targname;
+
+                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
+                    indentation(dump_indent);
+                    error_msg("unable to unpack external link value\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret = FAIL;
+                } /* end if */
+                else {
+                    ctx.indent_level++;
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "TARGETFILE \"%s\"", filename);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "TARGETPATH \"%s\"", targname);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    /* dump the external link */
+                    dump_extlink(group, name, targname);
+                    ctx.indent_level--;
+                } /* end else */
+            } /* end else */
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->extlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->extlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->extlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
+        default:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\" %s",
+                    h5tools_dump_header_format->udlinkbegin, name,
+                    h5tools_dump_header_format->udlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "LINKCLASS %d", linfo->type);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->udlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->udlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->udlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            break;
+        } /* end switch */
+    } /* end else */
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    if(obj_path)
+        HDfree(obj_path);
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    attr_iteration
+ *
+ * Purpose:     Iterate and display attributes within the specified group
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+attr_iteration(hid_t gid, unsigned attr_crt_order_flags)
+{
+    /* attribute iteration: if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
+       in the group for attributes, then, sort by creation order, otherwise by name */
+    if(include_attrs) {
+        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_attr_cb, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else {
+            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_attr_cb, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end else */
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    link_iteration
+ *
+ * Purpose:     Iterate and display links within the specified group
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+link_iteration(hid_t gid, unsigned crt_order_flags)
+{
+
+    /* if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
+       in the group, then, sort by creation order, otherwise by name */
+    if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+        H5Literate(gid, sort_by, sort_order, NULL, dump_all_cb, NULL);
+    else
+        H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, dump_all_cb, NULL);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_named_datatype
+ *
+ * Purpose:     Dump named datatype
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  Pedro Vicente, March 27, 2006
+ *   added display of attributes
+ *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
+ *   other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_named_datatype(hid_t tid, const char *name)
+{
+    H5O_info_t        oinfo;
+    unsigned          attr_crt_order_flags;
+    hid_t             tcpl_id = -1;  /* datatype creation property list ID */
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if ((tcpl_id = H5Tget_create_plist(tid)) < 0) {
+        error_msg("error in getting creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the creation properties for attributes */
+    if (H5Pget_attr_creation_order(tcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(tcpl_id) < 0) {
+        error_msg("error in closing creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    ctx.need_prefix = TRUE;
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+                        h5tools_dump_header_format->datatypebegin, name,
+                        h5tools_dump_header_format->datatypeblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    H5Oget_info(tid, &oinfo);
+
+    /* Must check for uniqueness of all objects if we've traversed an elink,
+     * otherwise only check if the reference count > 1.
+     */
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (found_obj->displayed) {
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;
+        }
+        else
+            found_obj->displayed = TRUE;
+    } /* end if */
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_print_datatype(rawoutstream, &buffer, outputformat, &ctx, tid, FALSE);
+
+    if(H5Tget_class(tid) != H5T_COMPOUND) {
+        h5tools_str_append(&buffer, ";");
+    }
+
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /* print attributes */
+    dump_indent += COL;
+
+    attr_iteration(tid, attr_crt_order_flags);
+
+    dump_indent -= COL;
+
+done:
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeblockend);
+        if(HDstrlen(h5tools_dump_header_format->datatypeend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->datatypeend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_group
+ *
+ * Purpose:     Dump everything within the specified group
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ * Call to dump_all_cb -- add parameter to select everything.
+ *
+ * Pedro Vicente, October 1, 2007
+ *  handle several iteration orders for attributes and groups
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_group(hid_t gid, const char *name)
+{
+    H5O_info_t  oinfo;
+    hid_t       dset;
+    hid_t       type;
+    hid_t       gcpl_id;
+    unsigned    crt_order_flags;
+    unsigned    attr_crt_order_flags;
+    char        type_name[1024];
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+        error_msg("error in getting group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties for attributes */
+    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties */
+    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(gcpl_id) < 0) {
+        error_msg("error in closing group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.need_prefix = TRUE;
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+                        h5tools_dump_header_format->groupbegin, name,
+                        h5tools_dump_header_format->groupblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if(!HDstrcmp(name, "/") && unamedtype) {
+        unsigned    u;  /* Local index variable */
+
+        /* dump unamed type in root group */
+        for(u = 0; u < type_table->nobjs; u++)
+            if(!type_table->objs[u].recorded) {
+                dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                type = H5Dget_type(dset);
+                sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                dump_function_table->dump_named_datatype_function(type, type_name);
+                H5Tclose(type);
+                H5Dclose(dset);
+            }
+    } /* end if */
+
+    if(display_oid)
+        h5tools_dump_oid(rawoutstream, outputformat, &ctx, gid);
+
+    h5tools_dump_comment(rawoutstream, outputformat, &ctx, gid);
+
+    H5Oget_info(gid, &oinfo);
+
+    /* Must check for uniqueness of all objects if we've traversed an elink,
+     * otherwise only check if the reference count > 1.
+     */
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(group_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+        else if (found_obj->displayed) {
+            ctx.need_prefix = TRUE;
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            found_obj->displayed = TRUE;
+            attr_iteration(gid, attr_crt_order_flags);
+            link_iteration(gid, crt_order_flags);
+        }
+    }
+    else {
+        attr_iteration(gid, attr_crt_order_flags);
+        link_iteration(gid, crt_order_flags);
+    }
+
+    dump_indent -= COL;
+    ctx.indent_level--;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->groupblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupblockend);
+        if(HDstrlen(h5tools_dump_header_format->groupend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->groupend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dataset
+ *
+ * Purpose:     Dump the specified data set
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  Pedro Vicente, 2004, added dataset creation property list display
+ *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
+ *   other  iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_dataset(hid_t did, const char *name, struct subset_t *sset)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hid_t       type, space;
+    unsigned    attr_crt_order_flags;
+    hid_t       dcpl_id;  /* dataset creation property list ID */
+    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t       curr_pos = 0;        /* total data element position   */
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if ((dcpl_id = H5Dget_create_plist(did)) < 0) {
+        error_msg("error in getting creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the creation properties for attributes */
+    if (H5Pget_attr_creation_order(dcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+     /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+                        h5tools_dump_header_format->datasetbegin, name,
+                        h5tools_dump_header_format->datasetblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_dump_comment(rawoutstream, outputformat, &ctx, did);
+
+    dump_indent += COL;
+    ctx.indent_level++;
+
+    type = H5Dget_type(did);
+    h5dump_type_table = type_table;
+    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
+    h5dump_type_table = NULL;
+
+    space = H5Dget_space(did);
+    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
+    H5Sclose(space);
+
+    if(display_oid) {
+        h5tools_dump_oid(rawoutstream, outputformat, &ctx, did);
+    }
+
+    if(display_dcpl) {
+        h5dump_type_table = type_table;
+        h5tools_dump_dcpl(rawoutstream, outputformat, &ctx, dcpl_id, type, did);
+        h5dump_type_table = NULL;
+    }
+    H5Pclose(dcpl_id);
+
+    if(display_data) {
+        unsigned  data_loop = 1;
+        unsigned  u;
+
+        if(display_packed_bits)
+            data_loop = packed_bits_num;
+        for(u = 0; u < data_loop; u++) {
+            if(display_packed_bits) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                packed_data_mask = packed_mask[u];
+                packed_data_offset = packed_offset[u];
+                packed_data_length = packed_length[u];
+                h5tools_print_packed_bits(&buffer, type);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            switch(H5Tget_class(type)) {
+            case H5T_TIME:
+                ctx.indent_level++;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "DATA{ not yet implemented.}");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.indent_level--;
+                break;
+
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_COMPOUND:
+            case H5T_REFERENCE:
+            case H5T_ENUM:
+            case H5T_VLEN:
+            case H5T_ARRAY:
+                {
+                    h5tools_dump_data(rawoutstream, outputformat, &ctx, did, TRUE, sset, display_ai, display_char);
+                }
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                HDassert(0);
+                break;
+            } /* end switch */
+        } /* for(u=0; u<data_loop; u++) */
+    }
+    H5Tclose(type);
+
+    if (!bin_output) {
+        attr_iteration(did, attr_crt_order_flags);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+        if(HDstrlen(h5tools_dump_header_format->datasetend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->datasetend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_data
+ *
+ * Purpose:     Dump attribute or dataset data
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications: pvn, print the matrix indices
+ *  Albert Cheng, 2004/11/18
+ *  Add --string printing for attributes too.
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_data(hid_t obj_id, int obj_data, struct subset_t *sset, int display_index)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    int               print_dataset = FALSE;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    if(obj_data == DATASET_DATA)
+        print_dataset = TRUE;
+    h5tools_dump_data(rawoutstream, outputformat, &ctx, obj_id, print_dataset, sset, display_index, display_char);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_fcpl
+ *
+ * Purpose:     prints file creation property list information
+ *
+ * Return:      void
+ *
+ * Programmer:  pvn
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_fcpl(hid_t fid)
+{
+    hid_t    fcpl;      /* file creation property list ID */
+    hsize_t  userblock; /* userblock size retrieved from FCPL */
+    size_t   off_size;  /* size of offsets in the file */
+    size_t   len_size;  /* size of lengths in the file */
+    unsigned super;     /* superblock version # */
+    unsigned freelist;  /* free list version # */
+    unsigned stab;      /* symbol table entry version # */
+    unsigned shhdr;     /* shared object header version # */
+#ifdef SHOW_FILE_DRIVER
+    hid_t    fapl;      /* file access property list ID */
+    hid_t    fdriver;   /* file driver */
+    char     dname[32]; /* buffer to store driver name */
+#endif
+    unsigned sym_lk;    /* symbol table B-tree leaf 'K' value */
+    unsigned sym_ik;    /* symbol table B-tree internal 'K' value */
+    unsigned istore_ik; /* indexed storage B-tree internal 'K' value */
+
+    fcpl=H5Fget_create_plist(fid);
+    H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
+    H5Pget_userblock(fcpl,&userblock);
+    H5Pget_sizes(fcpl,&off_size,&len_size);
+    H5Pget_sym_k(fcpl,&sym_ik,&sym_lk);
+    H5Pget_istore_k(fcpl,&istore_ik);
+    H5Pclose(fcpl);
+#ifdef SHOW_FILE_DRIVER
+    fapl=h5_fileaccess();
+    fdriver=H5Pget_driver(fapl);
+    H5Pclose(fapl);
+#endif
+
+   /*-------------------------------------------------------------------------
+    * SUPER_BLOCK
+    *-------------------------------------------------------------------------
+    */
+    PRINTSTREAM(rawoutstream, "\n%s %s\n",SUPER_BLOCK, BEGIN);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","SUPERBLOCK_VERSION", super);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","FREELIST_VERSION", freelist);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","SYMBOLTABLE_VERSION", stab);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","OBJECTHEADER_VERSION", shhdr);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream,"%s %zu\n","OFFSET_SIZE", off_size);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream,"%s %zu\n","LENGTH_SIZE", len_size);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","BTREE_RANK", sym_ik);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %d\n","BTREE_LEAF", sym_lk);
+
+#ifdef SHOW_FILE_DRIVER
+    if(H5FD_CORE==fdriver)
+        HDstrcpy(dname,"H5FD_CORE");
+#ifdef H5_HAVE_DIRECT
+    else if(H5FD_DIRECT==fdriver)
+        HDstrcpy(dname,"H5FD_DIRECT");
+#endif
+    else if(H5FD_FAMILY==fdriver)
+        HDstrcpy(dname,"H5FD_FAMILY");
+    else if(H5FD_LOG==fdriver)
+        HDstrcpy(dname,"H5FD_LOG");
+    else if(H5FD_MPIO==fdriver)
+        HDstrcpy(dname,"H5FD_MPIO");
+    else if(H5FD_MULTI==fdriver)
+        HDstrcpy(dname,"H5FD_MULTI");
+    else if(H5FD_SEC2==fdriver)
+        HDstrcpy(dname,"H5FD_SEC2");
+    else if(H5FD_STDIO==fdriver)
+        HDstrcpy(dname,"H5FD_STDIO");
+    else
+        HDstrcpy(dname,"Unknown driver");
+
+    /* Take out this because the driver used can be different from the
+     * standard output. */
+    /*indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %s\n","FILE_DRIVER", dname);*/
+#endif
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","ISTORE_K", istore_ik);
+
+    /*-------------------------------------------------------------------------
+    * USER_BLOCK
+    *-------------------------------------------------------------------------
+    */
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "USER_BLOCK %s\n",BEGIN);
+    indentation(dump_indent + COL + COL);
+    PRINTSTREAM(rawoutstream,"%s %Hu\n","USERBLOCK_SIZE", userblock);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s\n",END);
+
+    PRINTSTREAM(rawoutstream, "%s",END);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_fcontents
+ *
+ * Purpose:     prints all objects
+ *
+ * Return:      void
+ *
+ * Programmer:  pvn
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_fcontents(hid_t fid)
+{
+    PRINTSTREAM(rawoutstream, "%s %s\n",FILE_CONTENTS, BEGIN);
+
+    /* special case of unamed types in root group */
+    if (unamedtype) {
+        unsigned u;
+
+        for (u = 0; u < type_table->nobjs; u++) {
+            if (!type_table->objs[u].recorded)
+                PRINTSTREAM(rawoutstream, " %-10s /#"H5_PRINTF_HADDR_FMT"\n", "datatype", type_table->objs[u].objno);
+        }
+    }
+
+    /* print objects in the files */
+    h5trav_print(fid);
+
+    PRINTSTREAM(rawoutstream, " %s\n",END);
+}
+
+static herr_t
+attr_search(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *_op_data)
+{
+    herr_t              ret = SUCCEED;
+    int                 j;
+    char               *obj_op_name;
+    char               *obj_name;
+    trav_attr_udata_t  *attr_data = (trav_attr_udata_t*)_op_data;
+    const char         *buf = attr_data->path;
+    const char         *op_name = attr_data->op_name;
+
+    j = (int)HDstrlen(op_name) - 1;
+    /* find the last / */
+    while(j >= 0) {
+        if(op_name[j] == '/' && (j == 0 || (j > 0 && op_name[j - 1] != '\\')))
+            break;
+        j--;
+    }
+
+    obj_op_name = h5tools_str_replace(op_name + j + 1, "\\/", "/");
+
+    if(obj_op_name == NULL) {
+        h5tools_setstatus(EXIT_FAILURE);
+        ret = FAIL;
+    }
+    else {
+        if(HDstrcmp(attr_name, obj_op_name)==0) {
+            size_t u, v, w;
+
+            /* object name */
+            u = HDstrlen(buf);
+            v = HDstrlen(op_name);
+            w = u + 1 + v + 1 + 2;
+            obj_name = (char *)HDmalloc(w);
+            if(obj_name == NULL) {
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                HDmemset(obj_name, '\0', w);
+                if(op_name[0] != '/') {
+                    HDstrncat(obj_name, buf, u + 1);
+                    if(buf[u - 1] != '/')
+                        HDstrncat(obj_name, "/", (size_t)2);
+                }
+                HDstrncat(obj_name, op_name, v + 1);
+
+                handle_attributes(oid, obj_name, NULL, 0, NULL);
+                HDfree(obj_name);
+            }
+        }
+        HDfree(obj_op_name);
+    }
+    return ret;
+} /* end attr_search() */
+
+static herr_t
+obj_search(const char *path, const H5O_info_t *oi, const char H5_ATTR_UNUSED *already_visited, void *_op_data)
+{
+    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
+    const char *op_name = handle_data->op_name;
+    trav_attr_udata_t  attr_data;
+
+    attr_data.path = path;
+    attr_data.op_name = op_name;
+    H5Aiterate_by_name(handle_data->fid, path, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_search, (void*)&attr_data, H5P_DEFAULT);
+
+    if(HDstrcmp(path, op_name) == 0) {
+        switch(oi->type) {
+            case H5O_TYPE_GROUP:
+                handle_groups(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_DATASET:
+                handle_datasets(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_NAMED_DATATYPE:
+                handle_datatypes(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_UNKNOWN:
+            case H5O_TYPE_NTYPES:
+            default:
+                error_msg("unknown object type value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+        } /* end switch */
+    }
+
+    return 0;
+} /* end obj_search() */
+
+static herr_t
+lnk_search(const char *path, const H5L_info_t *li, void *_op_data)
+{
+    size_t      search_len;
+    size_t      k;
+    char       *search_name;
+    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
+    const char *op_name = handle_data->op_name;
+
+    search_len = HDstrlen(op_name);
+    if(search_len > 0 && op_name[0] != '/')
+        k = 2;
+    else
+        k = 1;
+    search_name = (char *)HDmalloc(search_len + k);
+    if(search_name == NULL) {
+        error_msg("creating temporary link\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        if (k == 2) {
+            HDstrcpy(search_name, "/");
+            HDstrncat(search_name, op_name, search_len + 1);
+        }
+        else
+            HDstrncpy(search_name, op_name, search_len + 1);
+        search_name[search_len + k - 1] = '\0';
+
+        if(HDstrcmp(path, search_name) == 0) {
+            switch(li->type) {
+            case H5L_TYPE_SOFT:
+            case H5L_TYPE_EXTERNAL:
+                handle_links(handle_data->fid, op_name, NULL, 0, NULL);
+                break;
+
+            case H5L_TYPE_HARD:
+            case H5L_TYPE_MAX:
+            case H5L_TYPE_ERROR:
+            default:
+                error_msg("unknown link type value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                break;
+            } /* end switch() */
+        }
+        HDfree(search_name);
+    }
+    return 0;
+} /* end lnk_search() */
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_paths
+ *
+ * Purpose:     Handle objects from the command.
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_paths(hid_t fid, const char *path_name, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
+{
+    hid_t  gid = -1;
+
+    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
+        error_msg("unable to open root group\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        hid_t       gcpl_id;
+        unsigned    crt_order_flags;
+        unsigned    attr_crt_order_flags;
+        trav_handle_udata_t handle_udata;     /* User data for traversal */
+
+        if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+            error_msg("error in getting group creation property list ID\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        /* query the group creation properties for attributes */
+        if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+            error_msg("error in getting group creation properties\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        /* query the group creation properties */
+        if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+            error_msg("error in getting group creation properties\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        if(H5Pclose(gcpl_id) < 0) {
+            error_msg("error in closing group creation property list ID\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        handle_udata.fid = fid;
+        handle_udata.op_name = path_name;
+        if(h5trav_visit(fid, "/", TRUE, TRUE, obj_search, lnk_search, &handle_udata) < 0) {
+            error_msg("error traversing information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_attributes
+ *
+ * Purpose:     Handle the attributes from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ * PVN, May 2008
+ *   add an extra parameter PE, to allow printing/not printing of error messages
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_attributes(hid_t fid, const char *attr, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
+{
+    hid_t  oid          = -1;
+    hid_t  attr_id      = -1;
+    char *obj_name      = NULL;
+    char *attr_name     = NULL;
+    int j;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    j = (int)HDstrlen(attr) - 1;
+    obj_name = (char *)HDmalloc((size_t)j + 2);
+    if(obj_name == NULL)
+        goto error;
+
+    /* find the last / */
+    while(j >= 0) {
+        if (attr[j] == '/' && (j==0 || (j>0 && attr[j-1]!='\\')))
+            break;
+        j--;
+    }
+
+    /* object name */
+    if(j == -1)
+        HDstrcpy(obj_name, "/");
+    else {
+        HDstrncpy(obj_name, attr, (size_t)j + 1);
+        obj_name[j + 1] = '\0';
+    } /* end else */
+
+    dump_indent += COL;
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    attr_name = h5tools_str_replace(attr + j + 1, "\\/", "/");
+
+    /* handle error case: cannot open the object with the attribute */
+    if((oid = H5Oopen(fid, obj_name, H5P_DEFAULT)) < 0) {
+        /* setup */
+        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "%s \"%s\" %s",
+                h5tools_dump_header_format->attributebegin, attr,
+                h5tools_dump_header_format->attributeblockbegin);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        error_msg("unable to open object \"%s\"\n", obj_name);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        if(HDstrlen(h5tools_dump_header_format->attributeblockend)) {
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeblockend);
+            if(HDstrlen(h5tools_dump_header_format->attributeend))
+                h5tools_str_append(&buffer, " ");
+        }
+        if(HDstrlen(h5tools_dump_header_format->attributeend))
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeend);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+
+        goto error;
+    } /* end if */
+
+    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
+    oid_output = display_oid;
+    data_output = display_data;
+    attr_data_output = display_attr_data;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
+    h5dump_type_table = NULL;
+
+    if(attr_id < 0) {
+        goto error;
+    }
+
+    /* Close object */
+    if(H5Oclose(oid) < 0) {
+        goto error;
+    } /* end if */
+
+    HDfree(obj_name);
+    HDfree(attr_name);
+    dump_indent -= COL;
+    return;
+
+error:
+    h5tools_setstatus(EXIT_FAILURE);
+    if(obj_name)
+        HDfree(obj_name);
+
+    if (attr_name)
+        HDfree(attr_name);
+
+    H5E_BEGIN_TRY {
+        H5Oclose(oid);
+        H5Aclose(attr_id);
+    } H5E_END_TRY;
+    dump_indent -= COL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_datasets
+ *
+ * Purpose:     Handle the datasets from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *  Pedro Vicente, Tuesday, January 15, 2008
+ *  check for block overlap\
+ *
+ *  Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_datasets(hid_t fid, const char *dset, void *data, int pe, const char *display_name)
+{
+    H5O_info_t       oinfo;
+    hid_t            dsetid;
+    struct subset_t *sset = (struct subset_t *)data;
+    const char      *real_name = display_name ? display_name : dset;
+
+    if((dsetid = H5Dopen2(fid, dset, H5P_DEFAULT)) < 0) {
+        if (pe) {
+            handle_links(fid, dset, data, pe, display_name);
+        }
+        return;
+    } /* end if */
+
+    if(sset) {
+        unsigned int i;
+        unsigned int ndims;
+        hid_t sid = H5Dget_space(dsetid);
+        int ndims_res = H5Sget_simple_extent_ndims(sid);
+
+        H5Sclose(sid);
+        if(ndims_res < 0) {
+            error_msg("H5Sget_simple_extent_ndims failed\n");
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        ndims = (unsigned)ndims_res;
+
+        if(!sset->start.data || !sset->stride.data || !sset->count.data || !sset->block.data) {
+            /* they didn't specify a ``stride'' or ``block''. default to 1 in all
+             * dimensions */
+            if(!sset->start.data) {
+                /* default to (0, 0, ...) for the start coord */
+                sset->start.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->start.len = ndims;
+            }
+
+            if(!sset->stride.data) {
+                sset->stride.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->stride.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->stride.data[i] = 1;
+            }
+
+            if(!sset->count.data) {
+                sset->count.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->count.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->count.data[i] = 1;
+            }
+
+            if(!sset->block.data) {
+                sset->block.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->block.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->block.data[i] = 1;
+            }
+        }
+
+        /*-------------------------------------------------------------------------
+         * check for dimension overflow
+         *-------------------------------------------------------------------------
+         */
+        if(sset->start.len > ndims) {
+            error_msg("number of start dims (%u) exceed dataset dims (%u)\n", sset->start.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->stride.len > ndims) {
+            error_msg("number of stride dims (%u) exceed dataset dims (%u)\n", sset->stride.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->count.len > ndims) {
+            error_msg("number of count dims (%u) exceed dataset dims (%u)\n", sset->count.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->block.len > ndims) {
+            error_msg("number of block dims (%u) exceed dataset dims (%u)\n", sset->block.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+
+        /*-------------------------------------------------------------------------
+         * check for block overlap
+         *-------------------------------------------------------------------------
+         */
+        for(i = 0; i < ndims; i++) {
+            if(sset->count.data[i] > 1) {
+                if(sset->stride.data[i] < sset->block.data[i]) {
+                    error_msg("wrong subset selection; blocks overlap\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    return;
+                } /* end if */
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+
+    H5Oget_info(dsetid, &oinfo);
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(dset_table, oinfo.addr);
+
+        if(found_obj) {
+            if (found_obj->displayed) {
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(dump_indent);
+                begin_obj(h5tools_dump_header_format->datasetbegin, real_name, h5tools_dump_header_format->datasetblockbegin);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(dump_indent + COL);
+                PRINTSTREAM(rawoutstream, "%s \"%s\"\n", HARDLINK, found_obj->objname);
+                indentation(dump_indent);
+                end_obj(h5tools_dump_header_format->datasetend, h5tools_dump_header_format->datasetblockend);
+            }
+            else {
+                found_obj->displayed = TRUE;
+                dump_indent += COL;
+                dump_dataset(dsetid, real_name, sset);
+                dump_indent -= COL;
+            }
+        }
+        else
+            h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        dump_indent += COL;
+        dump_dataset(dsetid, real_name, sset);
+        dump_indent -= COL;
+    }
+
+    if(H5Dclose(dsetid) < 0)
+        h5tools_setstatus(EXIT_FAILURE);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_groups
+ *
+ * Purpose:     Handle the groups from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications: Pedro Vicente, September 26, 2007
+ *  handle creation order
+ *
+ * Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name)
+{
+    hid_t       gid;
+    const char  *real_name = display_name ? display_name : group;
+
+    if((gid = H5Gopen2(fid, group, H5P_DEFAULT)) < 0) {
+        if (pe) {
+            PRINTVALSTREAM(rawoutstream, "\n");
+            begin_obj(h5tools_dump_header_format->groupbegin, real_name, h5tools_dump_header_format->groupblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            error_msg("unable to open group \"%s\"\n", real_name);
+            end_obj(h5tools_dump_header_format->groupend, h5tools_dump_header_format->groupblockend);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    }
+    else {
+        size_t new_len = HDstrlen(group) + 1;
+
+        if(prefix_len <= new_len) {
+            prefix_len = new_len;
+            prefix = (char *)HDrealloc(prefix, prefix_len);
+        } /* end if */
+
+        HDstrcpy(prefix, group);
+
+        dump_indent += COL;
+        dump_group(gid, real_name);
+        dump_indent -= COL;
+
+        if(H5Gclose(gid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+    } /* end else */
+} /* end handle_groups() */
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_links
+ *
+ * Purpose:     Handle soft or UD links from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
+{
+    H5L_info_t linfo;
+
+    if(H5Lget_info(fid, links, &linfo, H5P_DEFAULT) < 0) {
+        error_msg("unable to get link info from \"%s\"\n", links);
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else if(linfo.type == H5L_TYPE_HARD) {
+        error_msg("\"%s\" is a hard link\n", links);
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        char *buf = (char *)HDmalloc(linfo.u.val_size);
+        PRINTVALSTREAM(rawoutstream, "\n");
+
+        switch(linfo.type) {
+        case H5L_TYPE_SOFT:    /* Soft link */
+            begin_obj(h5tools_dump_header_format->softlinkbegin, links, h5tools_dump_header_format->softlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
+                PRINTSTREAM(rawoutstream, "LINKTARGET \"%s\"\n", buf);
+            }
+            else {
+                error_msg("h5dump error: unable to get link value for \"%s\"\n", links);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            end_obj(h5tools_dump_header_format->softlinkend, h5tools_dump_header_format->softlinkblockend);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            begin_obj(h5tools_dump_header_format->extlinkbegin, links, h5tools_dump_header_format->extlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
+                const char *elink_file;
+                const char *elink_path;
+
+                if(H5Lunpack_elink_val(buf, linfo.u.val_size, NULL, &elink_file, &elink_path)>=0) {
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "TARGETFILE \"%s\"\n", elink_file);
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "TARGETPATH \"%s\"\n", elink_path);
+                }
+                else {
+                    error_msg("h5dump error: unable to unpack external link value for \"%s\"\n", links);
+                    h5tools_setstatus(EXIT_FAILURE);
+                }
+            }
+            else {
+                error_msg("h5dump error: unable to get external link value for \"%s\"\n", links);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            end_obj(h5tools_dump_header_format->extlinkend, h5tools_dump_header_format->extlinkblockend);
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
+        default:
+            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
+            end_obj(h5tools_dump_header_format->udlinkend, h5tools_dump_header_format->udlinkblockend);
+            break;
+        } /* end switch */
+        HDfree(buf);
+    } /* end else */
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_datatypes
+ *
+ * Purpose:     Handle the datatypes from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ *  Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name)
+{
+    hid_t       type_id;
+    const char  *real_name = display_name ? display_name : type;
+
+    if((type_id = H5Topen2(fid, type, H5P_DEFAULT)) < 0) {
+        /* check if type is unamed datatype */
+        unsigned idx = 0;
+
+        while(idx < type_table->nobjs ) {
+            char name[128];
+
+            if(!type_table->objs[idx].recorded) {
+                /* unamed datatype */
+                sprintf(name, "/#"H5_PRINTF_HADDR_FMT, type_table->objs[idx].objno);
+
+                if(!HDstrcmp(name, real_name))
+                    break;
+            } /* end if */
+
+            idx++;
+        } /* end while */
+
+        if(idx == type_table->nobjs) {
+            if (pe) {
+                /* unknown type */
+                PRINTVALSTREAM(rawoutstream, "\n");
+                begin_obj(h5tools_dump_header_format->datatypebegin, real_name, h5tools_dump_header_format->datatypeblockbegin);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(COL);
+                error_msg("unable to open datatype \"%s\"\n", real_name);
+                end_obj(h5tools_dump_header_format->datatypeend, h5tools_dump_header_format->datatypeblockend);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+        }
+        else {
+            hid_t dsetid = H5Dopen2(fid, type_table->objs[idx].objname, H5P_DEFAULT);
+            type_id = H5Dget_type(dsetid);
+
+            dump_indent += COL;
+            dump_named_datatype(type_id, real_name);
+            dump_indent -= COL;
+
+            H5Tclose(type_id);
+            H5Dclose(dsetid);
+        }
+    }
+    else {
+        dump_indent += COL;
+        dump_named_datatype(type_id, real_name);
+        dump_indent -= COL;
+
+        if(H5Tclose(type_id) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_extlink
+ *
+ * made by: PVN
+ *
+ * Purpose:     Dump an external link
+ *  Since external links are soft links, they are dumped on a trial error
+ *   basis, attempting to dump as a dataset, as a group and as a named datatype
+ *   Error messages are supressed
+ *
+ * Modifications:
+ *      Neil Fortner
+ *      13 October 2008
+ *      Function basically rewritten.  No longer directly opens the target file,
+ *      now initializes a new set of tables for the external file.  No longer
+ *      dumps on a trial and error basis, but errors are still suppressed.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+dump_extlink(hid_t group, const char *linkname, const char *objname)
+{
+    hid_t       oid;
+    H5O_info_t  oi;
+    table_t     *old_group_table = group_table;
+    table_t     *old_dset_table = dset_table;
+    table_t     *old_type_table = type_table;
+    hbool_t     old_hit_elink;
+    ssize_t     idx;
+
+    /* Open target object */
+    if ((oid = H5Oopen(group, linkname, H5P_DEFAULT)) < 0)
+        goto fail;
+
+    /* Get object info */
+    if (H5Oget_info(oid, &oi) < 0) {
+        H5Oclose(oid);
+        goto fail;
+    }
+
+    /* Check if we have visited this file already */
+    if ((idx = table_list_visited(oi.fileno)) < 0) {
+        /* We have not visited this file, build object tables */
+        if ((idx = table_list_add(oid, oi.fileno)) < 0) {
+            H5Oclose(oid);
+            goto fail;
+        }
+    }
+
+    /* Do not recurse through an external link into the original file (idx=0) */
+    if (idx) {
+        /* Update table pointers */
+        group_table = table_list.tables[idx].group_table;
+        dset_table = table_list.tables[idx].dset_table;
+        type_table = table_list.tables[idx].type_table;
+
+        /* We will now traverse the external link, set this global to indicate this */
+        old_hit_elink = hit_elink;
+        hit_elink = TRUE;
+
+        /* add some indentation to distinguish that these objects are external */
+        dump_indent += COL;
+
+        /* Recurse into the external file */
+        switch (oi.type) {
+            case H5O_TYPE_GROUP:
+                handle_groups(group, linkname, NULL, 0, objname);
+                break;
+
+            case H5O_TYPE_DATASET:
+                handle_datasets(group, linkname, NULL, 0, objname);
+                break;
+
+            case H5O_TYPE_NAMED_DATATYPE:
+                handle_datatypes(group, linkname, NULL, 0, objname);
+                break;
+
+            case H5O_TYPE_UNKNOWN:
+            case H5O_TYPE_NTYPES:
+            default:
+                h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        dump_indent -= COL;
+
+        /* Reset table pointers */
+        group_table = old_group_table;
+        dset_table = old_dset_table;
+        type_table = old_type_table;
+
+        /* Reset hit_elink */
+        hit_elink = old_hit_elink;
+    } /* end if */
+
+    if (H5Idec_ref(oid) < 0)
+        h5tools_setstatus(EXIT_FAILURE);
+
+    return SUCCEED;
+
+fail:
+    return FAIL;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.h b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.h
new file mode 100644
index 0000000..2b3f61e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_ddl.h
@@ -0,0 +1,52 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5DUMP_DDL_H__
+#define H5DUMP_DDL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The dump functions of the dump_function_table */
+/* standard format:  no change */
+void      dump_group(hid_t, const char *);
+void      dump_named_datatype(hid_t, const char *);
+void      dump_dataset(hid_t, const char *, struct subset_t *);
+void      dump_dataspace(hid_t space);
+void      dump_datatype(hid_t type);
+void      dump_data(hid_t, int, struct subset_t *, int);
+void      dump_fcpl(hid_t fid);
+void      dump_fcontents(hid_t fid);
+
+/* callback function used by H5Aiterate2() */
+herr_t    dump_attr_cb(hid_t loc_id, const char *attr_name, const H5A_info_t *info, void *_op_data);
+
+/* other iteration functions */
+void link_iteration(hid_t gid, unsigned crt_order_flags);
+void attr_iteration(hid_t gid, unsigned attr_crt_order_flags);
+
+void handle_paths(hid_t fid, const char *path_name, void *data, int pe, const char *display_name);
+void handle_datasets(hid_t fid, const char *dset, void *data, int pe, const char *display_name);
+void handle_attributes(hid_t fid, const char *attr, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name);
+void handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name);
+void handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name);
+void handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_DDL_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_defines.h b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_defines.h
new file mode 100644
index 0000000..3493de1
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_defines.h
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_DEFINES_H__
+#define H5DUMP_DEFINES_H__
+
+#define H5DUMP_MAX_RANK     H5S_MAX_RANK
+
+#define ATTRIBUTE_DATA  0
+#define DATASET_DATA    1
+#define ENUM_DATA       2
+#define COL             3
+
+/* Macros for displaying objects */
+#define begin_obj(obj,name,begin)                                                \
+    do {                                                                         \
+        if ((name)) {                                                            \
+            PRINTSTREAM(rawoutstream, "%s \"%s\" %s", (obj), (name), (begin));   \
+        }                                                                   \
+        else {                                                              \
+            PRINTSTREAM(rawoutstream, "%s %s", (obj), (begin));                  \
+        }                                                                        \
+    } while(0);
+
+#define end_obj(obj,end)                               \
+    do {                                               \
+        if(HDstrlen(end)) {                            \
+            PRINTSTREAM(rawoutstream, "%s", end);      \
+            if(HDstrlen(obj))                                               \
+                PRINTVALSTREAM(rawoutstream, " ");     \
+            }                                          \
+        if(HDstrlen(obj))                                                   \
+            PRINTSTREAM(rawoutstream, "%s", obj);      \
+    } while(0);
+
+
+/* 3 private values: can't be set, but can be read.
+   Note: these are defined in H5Zprivate, they are
+   duplicated here.
+ */
+#define H5_SZIP_LSB_OPTION_MASK         8
+#define H5_SZIP_MSB_OPTION_MASK         16
+#define H5_SZIP_RAW_OPTION_MASK         128
+
+#endif  /* !H5DUMP_DEFINES_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_extern.h b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_extern.h
new file mode 100644
index 0000000..08f9e36
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_extern.h
@@ -0,0 +1,113 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_EXTERN_H__
+#define H5DUMP_EXTERN_H__
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_defines.h"
+
+/**
+ **  This is the global dispatch table for the dump functions.
+ **/
+/* the table of dump functions */
+typedef struct dump_functions_t {
+    void     (*dump_group_function) (hid_t, const char *);
+    void     (*dump_named_datatype_function) (hid_t, const char *);
+    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
+    void     (*dump_dataspace_function) (hid_t);
+    void     (*dump_datatype_function) (hid_t);
+    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
+    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
+} dump_functions;
+
+/* List of table structures.  There is one table structure for each file */
+typedef struct h5dump_table_list_t {
+    size_t      nalloc;
+    size_t      nused;
+    struct {
+        unsigned long   fileno;         /* File number that these tables refer to */
+        hid_t           oid;            /* ID of an object in this file, held open so fileno is consistent */
+        table_t         *group_table;   /* Table of groups */
+        table_t         *dset_table;    /* Table of datasets */
+        table_t         *type_table;    /* Table of datatypes */
+    } *tables;
+} h5dump_table_list_t;
+
+extern h5dump_table_list_t  table_list;
+extern table_t             *group_table, *dset_table, *type_table;
+extern int                  dump_indent;              /*how far in to indent the line         */
+
+extern int          unamedtype;     /* shared datatype with no name */
+extern hbool_t      hit_elink;  /* whether we have traversed an external link */
+extern size_t       prefix_len;
+extern char         *prefix;
+extern const char   *fp_format;
+
+/* things to display or which are set via command line parameters */
+extern int          display_all;
+extern int          display_oid;
+extern int          display_data;
+extern int          display_attr_data;
+extern int          display_char; /*print 1-byte numbers as ASCII */
+extern int          usingdasho;
+extern int          display_bb; /*superblock */
+extern int          display_dcpl; /*dcpl */
+extern int          display_fi; /*file index */
+extern int          display_ai;  /*array index */
+extern int          display_escape; /*escape non printable characters */
+extern int          display_region; /*print region reference data */
+extern int          enable_error_stack; /* re-enable error stack */
+extern int          disable_compact_subset; /* disable compact form of subset notation */
+extern int          display_packed_bits; /*print 1-8 byte numbers as packed bits*/
+extern int          include_attrs; /* Display attributes */
+
+/* sort parameters */
+extern H5_index_t   sort_by; /*sort_by [creation_order | name]  */
+extern H5_iter_order_t sort_order; /*sort_order [ascending | descending]   */
+
+#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
+#define PACKED_BITS_SIZE_MAX    8*sizeof(long long)  /* Maximum bits size of integer types of packed-bits */
+/* mask list for packed bits */
+extern unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
+
+/* packed bits display parameters */
+extern int packed_offset[PACKED_BITS_MAX];
+extern int packed_length[PACKED_BITS_MAX];
+
+/*
+ * The global table is set to either ddl_function_table or
+ * xml_function_table in the initialization.
+ */
+extern const dump_functions *dump_function_table;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
+hid_t    h5_fileaccess(void);
+ssize_t  table_list_add(hid_t oid, unsigned long file_no);
+ssize_t  table_list_visited(unsigned long file_no);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_EXTERN_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.c b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.c
new file mode 100644
index 0000000..8ad76e6
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.c
@@ -0,0 +1,4582 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_extern.h"
+#include "h5dump_xml.h"
+
+const char       *xmlnsprefix="hdf5:";
+
+/*
+ *  Alternative formating for data dumped to XML
+ *  In general, the numbers are the same, but separators
+ *  except spaces are not used.
+ *
+ *  Some of these are not used, as some kinds of data are
+ *  dumped in completely new subroutines.
+ *
+ *  Some of this formatting may yet need to change.
+ *
+ *  This table only affects XML output.
+ */
+static h5tool_format_t         xml_dataformat = {
+    0,              /*raw */
+
+    "",             /*fmt_raw */
+    "%d",           /*fmt_int */
+    "%u",           /*fmt_uint */
+    "%hhd",           /*fmt_schar */
+    "%u",           /*fmt_uchar */
+    "%d",           /*fmt_short */
+    "%u",           /*fmt_ushort */
+    "%ld",          /*fmt_long */
+    "%lu",          /*fmt_ulong */
+    NULL,           /*fmt_llong */
+    NULL,           /*fmt_ullong */
+    "%g",           /*fmt_double */
+    "%g",           /*fmt_float */
+
+    0,              /*ascii */
+    0,              /*str_locale */
+    0,              /*str_repeat */
+
+    "",            /*arr_pre */
+    "",             /*arr_sep */
+    "",             /*arr_suf */
+    1,              /*arr_linebreak */
+
+    "",             /*cmpd_name */
+    "",             /*cmpd_sep */
+    "",             /*cmpd_pre */
+    "",             /*cmpd_suf */
+    "",             /*cmpd_end */
+
+    " ",            /*vlen_sep */
+    " ",            /*vlen_pre */
+    "",             /*vlen_suf */
+    "",             /*vlen_end */
+
+    "%s",           /*elmt_fmt */
+    "",             /*elmt_suf1 */
+    " ",            /*elmt_suf2 */
+
+    "",             /*idx_n_fmt */
+    "",             /*idx_sep */
+    "",             /*idx_fmt */
+
+    80,             /*line_ncols *//*standard default columns */
+    0,              /*line_per_line */
+    "",             /*line_pre */
+    "%s",           /*line_1st */
+    "%s",           /*line_cont */
+    "",             /*line_suf */
+    "",             /*line_sep */
+    1,              /*line_multi_new */
+    "   ",          /*line_indent */
+
+    1,              /*skip_first */
+
+    1,              /*obj_hidefileno */
+    " "H5_PRINTF_HADDR_FMT, /*obj_format */
+
+    1,              /*dset_hidefileno */
+    "DATASET %s ",  /*dset_format */
+    "%s",           /*dset_blockformat_pre */
+    "%s",           /*dset_ptformat_pre */
+    "%s",           /*dset_ptformat */
+     0,             /*array indices */
+     0              /*escape non printable characters */
+};
+
+
+/* internal functions */
+static int      xml_name_to_XID(const char *, char *, int , int );
+
+/* internal functions used by XML option */
+static void             xml_print_datatype(hid_t, unsigned);
+static void             xml_print_enum(hid_t);
+static int              xml_print_refs(hid_t, int);
+static int              xml_print_strs(hid_t, int);
+static char            *xml_escape_the_string(const char *, int);
+static char            *xml_escape_the_name(const char *);
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_all_cb
+ *
+ * Purpose:     function callback called by H5Literate,
+ *                displays everything in the specified object
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  RMcG, November 2000
+ *   Added XML support. Also, optionally checks the op_data argument
+ *
+ * PVN, May 2008
+ *   Dump external links
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
+{
+    hid_t       obj;
+    herr_t      ret = SUCCEED;
+    char       *obj_path = NULL;    /* Full path of object */
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    /* Build the object's path name */
+    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    if(!obj_path) {
+        ret = FAIL;
+        goto done;
+    } 
+
+    HDstrcpy(obj_path, prefix);
+    HDstrcat(obj_path, "/");
+    HDstrcat(obj_path, name);
+
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5O_info_t  oinfo;
+
+        /* Stat the object */
+        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
+            error_msg("unable to get object information for \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+            goto done;
+        } /* end if */
+
+        switch(oinfo.type) {
+        case H5O_TYPE_GROUP:
+            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
+                error_msg("unable to dump group \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                char *old_prefix; /* Pointer to previous prefix */
+
+                /* Keep copy of prefix before iterating into group */
+                old_prefix = HDstrdup(prefix);
+                HDassert(old_prefix);
+
+                /* Append group name to prefix */
+                add_prefix(&prefix, &prefix_len, name);
+
+                /* Iterate into group */
+                dump_function_table->dump_group_function(obj, name);
+
+                /* Restore old prefix name */
+                HDstrcpy(prefix, old_prefix);
+                HDfree(old_prefix);
+
+                /* Close group */
+                H5Gclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_DATASET:
+            if((obj = H5Dopen2(group, name, H5P_DEFAULT)) >= 0) {
+                if(oinfo.rc > 1 || hit_elink) {
+                    obj_t  *found_obj;    /* Found object */
+
+                    found_obj = search_obj(dset_table, oinfo.addr);
+
+                    if(found_obj == NULL) {
+                        ctx.indent_level++;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        h5tools_setstatus(EXIT_FAILURE);
+                        ret = FAIL;
+                        H5Dclose(obj);
+                        goto done;
+                    } 
+                    else if(found_obj->displayed) {
+                        /* the XML version */
+                        char *t_obj_path = xml_escape_the_name(obj_path);
+                        char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                        char *t_name = xml_escape_the_name(name);
+                        char *t_objname = xml_escape_the_name(found_obj->objname);
+                        char dsetxid[100];
+                        char parentxid[100];
+                        char pointerxid[100];
+
+                        /* Create OBJ-XIDs for the parent and object */
+                        xml_name_to_XID(obj_path, dsetxid, (int)sizeof(dsetxid), 1);
+                        xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "<%sDataset Name=\"%s\" OBJ-XID=\"%s-%d\" "
+                                "H5Path=\"%s\" Parents=\"%s\" "
+                                "H5ParentPaths=\"%s\">",
+                                xmlnsprefix,
+                                t_name,                     /* Dataset Name */
+                                dsetxid, get_next_xid(),    /* OBJ-XID */
+                                t_obj_path,                 /* H5Path */
+                                parentxid,                  /* Parents */
+                                t_prefix);                  /* H5ParentPaths */
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
+
+                        ctx.indent_level++;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "<%sDatasetPtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
+                                xmlnsprefix,
+                                pointerxid,t_objname);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "</%sDataset>", xmlnsprefix);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        HDfree(t_name);
+                        HDfree(t_obj_path);
+                        HDfree(t_prefix);
+                        HDfree(t_objname);
+
+                        H5Dclose(obj);
+                        goto done;
+                    } 
+                    else {
+                        found_obj->displayed = TRUE;
+                    }
+                } /* end if */
+
+                dump_function_table->dump_dataset_function(obj, name, NULL);
+                H5Dclose(obj);
+            } 
+            else {
+                error_msg("unable to dump dataset \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
+                error_msg("unable to dump datatype \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } 
+            else {
+                dump_function_table->dump_named_datatype_function(obj, name);
+                H5Tclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            error_msg("unknown object \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+        }
+    } /* end if */
+    else {
+        char       *targbuf;
+
+        switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } 
+            else {
+                /* print the value of a soft link */
+                /* XML */
+                char linkxid[100];
+                char parentxid[100];
+                char targetxid[100];
+                char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                char *t_name = xml_escape_the_name(name);
+                char *t_targbuf = xml_escape_the_name(targbuf);
+                char *t_obj_path = xml_escape_the_name(obj_path);
+                char *t_link_path;
+                int res;
+
+                t_link_path = (char *)HDmalloc(HDstrlen(prefix) + linfo->u.val_size + 1);
+                if(targbuf[0] == '/')
+                    HDstrcpy(t_link_path, targbuf);
+                else {
+                    HDstrcpy(t_link_path, prefix);
+                    HDstrcat(HDstrcat(t_link_path, "/"), targbuf);
+                } /* end else */
+
+                /* Create OBJ-XIDs for the parent and object */
+                xml_name_to_XID(t_obj_path, linkxid, (int)sizeof(linkxid), 1);
+                xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
+
+                /* Try to create an OBJ-XID for the object pointed to */
+                res = xml_name_to_XID(t_link_path, targetxid, (int)sizeof(targetxid), 0);
+                if (res == 0) {
+                    /* target obj found */
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sSoftLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetPath=\"%s\" TargetObj=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            t_targbuf,      /* TargetPath */
+                            targetxid,      /* TargetObj */
+                            parentxid,      /* Parents */
+                            t_prefix);      /* H5ParentPaths */
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                } 
+                else {
+                    /* dangling link -- omit from xml attributes */
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sSoftLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetPath=\"%s\"  "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            t_targbuf,      /* TargetPath */
+                            parentxid,      /* Parents */
+                            t_prefix);      /* H5ParentPaths */
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+
+                HDfree(t_prefix);
+                HDfree(t_name);
+                HDfree(t_targbuf);
+                HDfree(t_obj_path);
+                HDfree(t_link_path);
+            }
+
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get external link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } /* end if */
+            else {
+                const char *filename;
+                const char *targname;
+
+                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
+                    error_msg("unable to unpack external link value\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret = FAIL;
+                } /* end if */
+                else {
+                    char linkxid[100];
+                    char parentxid[100];
+                    char *t_name = xml_escape_the_name(name);
+                    char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                    char *t_obj_path = xml_escape_the_name(obj_path);
+                    char *t_filename = xml_escape_the_name(filename);
+                    char *t_targname = xml_escape_the_name(targname);
+
+                    /* Create OBJ-XIDs for the parent and object */
+                    xml_name_to_XID(t_obj_path, linkxid, (int)sizeof(linkxid), 1);
+                    xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sExternalLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetFilename=\"%s\"  "
+                            "TargetPath=\"%s\"  "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            filename,       /* TargetFilename */
+                            targname,       /* TargetPath*/
+                            parentxid,      /* Parents */
+                            t_prefix);      /* H5ParentPaths */
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    
+                    HDfree(t_prefix);
+                    HDfree(t_name);
+                    HDfree(t_filename);
+                    HDfree(t_targname);
+                    HDfree(t_obj_path);
+                } /* end else */
+            } /* end else */
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
+        default:
+        {
+            char linkxid[100];
+            char parentxid[100];
+            char *t_name = xml_escape_the_name(name);
+            char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+            char *t_obj_path = xml_escape_the_name(obj_path);
+
+            /* Create OBJ-XIDs for the parent and object */
+            xml_name_to_XID(t_obj_path, linkxid, (int)sizeof(linkxid), 1);
+            xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sUserDefined LinkName=\"%s\" "
+                    "OBJ-XID=\"%s\" "
+                    "H5SourcePath=\"%s\" "
+                    "LinkClass=\"%d\"  "
+                    "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                    xmlnsprefix,
+                    t_name,             /* LinkName */
+                    linkxid,            /* OBJ-XID */
+                    t_obj_path,         /* H5SourcePath */
+                    linfo->type,        /* LinkClass */
+                    parentxid,          /* Parents */
+                    t_prefix);          /* H5ParentPaths */
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            
+            HDfree(t_prefix);
+            HDfree(t_name);
+            HDfree(t_obj_path);
+        }
+        break;
+        } /* end switch */
+    } /* end else */
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    if(obj_path)
+        HDfree(obj_path);
+    return ret;
+}
+
+/*
+ * create a string suitable for and XML NCNAME.  Uses the
+ * object reference to create the string.
+ *
+ *  'gen'; 0 - return null if not found
+ *         1 - generate a fake entry and return fake id.
+ */
+int
+xml_name_to_XID(const char *str , char *outstr, int outlen, int gen)
+{
+    haddr_t objno;      /* Object ID for object at path */
+
+    if (outlen < 22) return 1;
+
+    objno = ref_path_table_lookup(str);
+    if (objno == HADDR_UNDEF) {
+        if (HDstrlen(str) == 0) {
+            objno = ref_path_table_lookup("/");
+            if (objno == HADDR_UNDEF) {
+                if (gen) {
+                    objno = ref_path_table_gen_fake(str);
+                    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+                    return 0;
+                } 
+                else {
+                    return 1;
+                }
+            }
+        } 
+        else {
+            if (gen) {
+                objno = ref_path_table_gen_fake(str);
+                sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+                return 0;
+            } 
+            else {
+                return 1;
+            }
+        }
+    }
+
+    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+
+    return(0);
+}
+
+static const char      *quote = """;
+static const char      *amp = "&";
+static const char      *lt = "<";
+static const char      *gt = ">";
+static const char      *apos = "'";
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_escape_the_name
+ *
+ * Purpose:     Escape XML reserved chars in a name, so HDF5 strings
+ *              and paths can be correctly read back in XML element.
+ *
+ * Return:      The revised string.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char                   *
+xml_escape_the_name(const char *str)
+{
+    size_t      extra;
+    size_t      len;
+    size_t      i;
+    const char *cp;
+    char       *ncp;
+    char       *rcp;
+    size_t      ncp_len;
+
+    if (!str)
+        return NULL;
+
+    cp = str;
+    len = HDstrlen(str);
+    extra = 0;
+
+    for (i = 0; i < len; i++) {
+        if (*cp == '\"')
+            extra += (HDstrlen(quote) - 1);
+        else if (*cp == '\'')
+            extra += (HDstrlen(apos) - 1);
+        else if (*cp == '<')
+            extra += (HDstrlen(lt) - 1);
+        else if (*cp == '>')
+            extra += (HDstrlen(gt) - 1);
+        else if (*cp == '&')
+            extra += (HDstrlen(amp) - 1);
+
+        cp++;
+    }
+
+    if (extra == 0)
+        return HDstrdup(str);
+
+    cp = str;
+    ncp_len = len + extra + 1;
+    rcp = ncp = (char *)HDmalloc(ncp_len);
+
+    if (!ncp)
+        return NULL;    /* ?? */
+
+    for (i = 0; i < len; i++) {
+        size_t esc_len;
+
+        HDassert(ncp_len);
+        if (*cp == '\'') {
+            HDstrncpy(ncp, apos, ncp_len);
+            esc_len = HDstrlen(apos);
+        } 
+        else if (*cp == '<') {
+            HDstrncpy(ncp, lt, ncp_len);
+            esc_len = HDstrlen(lt);
+        } 
+        else if (*cp == '>') {
+            HDstrncpy(ncp, gt, ncp_len);
+            esc_len = HDstrlen(gt);
+        } 
+        else if (*cp == '\"') {
+            HDstrncpy(ncp, quote, ncp_len);
+            esc_len = HDstrlen(quote);
+        } 
+        else if (*cp == '&') {
+            HDstrncpy(ncp, amp, ncp_len);
+            esc_len = HDstrlen(amp);
+        } 
+        else {
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        ncp += esc_len;
+        ncp_len -= esc_len;
+        cp++;
+    }
+
+    *ncp = '\0';
+    return rcp;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_escape_the_string
+ *
+ * Purpose:     Escape XML reserved chars in a string, so HDF5 strings
+ *              and paths can be correctly read back in XML CDATA.
+ *
+ * Return:      The revised string.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char                   *
+xml_escape_the_string(const char *str, int slen)
+{
+    size_t      extra;
+    size_t      len;
+    size_t      i;
+    const char *cp;
+    char       *ncp;
+    char       *rcp;
+    size_t      ncp_len;
+
+    if (!str)
+        return NULL;
+
+    cp = str;
+
+    if (slen < 0)
+        len = HDstrlen(str);
+    else
+        len = slen;
+
+    extra = 0;
+
+    for (i = 0; i < len; i++) {
+        if (*cp == '\\')
+            extra++;
+        else if (*cp == '\"')
+            extra++;
+        else if (*cp == '\'')
+            extra += (HDstrlen(apos) - 1);
+        else if (*cp == '<')
+            extra += (HDstrlen(lt) - 1);
+        else if (*cp == '>')
+            extra += (HDstrlen(gt) - 1);
+        else if (*cp == '&')
+            extra += (HDstrlen(amp) - 1);
+        cp++;
+    }
+
+    cp = str;
+    ncp_len = len + extra + 1;
+    rcp = ncp = (char *) HDcalloc(ncp_len, sizeof(char));
+
+    if (ncp == NULL)
+        return NULL; /* ?? */
+
+    for (i = 0; i < len; i++) {
+        size_t esc_len;
+
+        HDassert(ncp_len);
+        if (*cp == '\\') {
+            *ncp++ = '\\';
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        else if (*cp == '\"') {
+            *ncp++ = '\\';
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        else if (*cp == '\'') {
+            HDstrncpy(ncp, apos, ncp_len);
+            esc_len = HDstrlen(apos);
+        }
+        else if (*cp == '<') {
+            HDstrncpy(ncp, lt, ncp_len);
+            esc_len = HDstrlen(lt);
+        }
+        else if (*cp == '>') {
+            HDstrncpy(ncp, gt, ncp_len);
+            esc_len = HDstrlen(gt);
+        }
+        else if (*cp == '&') {
+            HDstrncpy(ncp, amp, ncp_len);
+            esc_len = HDstrlen(amp);
+        }
+        else {
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        ncp += esc_len;
+        ncp_len -= esc_len;
+        cp++;
+    }
+
+    *ncp = '\0';
+    return rcp;
+}
+
+/**
+ **  XML print functions--these replace some functions in the
+ **  h5tools.c suite.
+ **/
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_datatype
+ *
+ * Purpose:     Print description of a datatype in XML.
+ *              Note:  this is called inside a <DataType> element.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+xml_print_datatype(hid_t type, unsigned in_group)
+{
+    char                   *mname;
+    hid_t                   mtype;
+    unsigned                nmembers;
+    unsigned                ndims;
+    unsigned                i;
+    size_t                  size;
+    hsize_t                 dims[H5DUMP_MAX_RANK];
+    H5T_str_t               str_pad;
+    H5T_cset_t              cset;
+    hid_t                   super;
+    H5T_order_t             ord;
+    H5T_sign_t              sgn;
+    size_t                  sz;
+    size_t                  spos;
+    size_t                  epos;
+    size_t                  esize;
+    size_t                  mpos;
+    size_t                  msize;
+    int                     nmembs;
+    htri_t                  is_vlstr=FALSE;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if(!in_group && H5Tcommitted(type) > 0) {
+        H5O_info_t oinfo;
+        obj_t  *found_obj;    /* Found object */
+
+        /* detect a shared datatype, output only once */
+        H5Oget_info(type, &oinfo);
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if(found_obj) {
+            /* This should be defined somewhere else */
+            /* These 2 cases are handled the same right now, but
+               probably will have something different eventually */
+            char * dtxid = (char *)HDmalloc((size_t)100);
+
+            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
+            if (!found_obj->recorded) {
+                /* 'anonymous' NDT.  Use it's object num.
+                   as it's name.  */
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNamedDataTypePtr OBJ-XID=\"/%s\"/>",
+                        xmlnsprefix, dtxid);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                /* point to the NDT by name */
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
+                        xmlnsprefix, dtxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+            }
+            HDfree(dtxid);
+        } 
+        else {
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- h5dump error: unknown committed type. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    } 
+    else {
+
+        switch (H5Tget_class(type)) {
+        case H5T_INTEGER:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+
+            /* <hdf5:IntegerType ByteOrder="bo" Sign="torf" Size="bytes"/> */
+            ord = H5Tget_order(type);
+            sgn = H5Tget_sign(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sIntegerType ByteOrder=\"",xmlnsprefix);
+            switch (ord) {
+            case H5T_ORDER_LE:
+                h5tools_str_append(&buffer, "LE");
+                break;
+            case H5T_ORDER_BE:
+                h5tools_str_append(&buffer, "BE");
+                break;
+            case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+            default:
+                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+                    break;
+            } /* end switch */
+            
+            h5tools_str_append(&buffer, "\" Sign=\"");
+            
+            switch (sgn) {
+            case H5T_SGN_NONE:
+                h5tools_str_append(&buffer, "false");
+                break;
+            case H5T_SGN_2:
+                h5tools_str_append(&buffer, "true");
+                break;
+                case H5T_SGN_ERROR:
+                case H5T_NSGN:
+            default:
+                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+                    break;
+            } /* end switch */
+            
+            h5tools_str_append(&buffer, "\" Size=\"");
+            sz = H5Tget_size(type);
+            h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
+            h5tools_str_append(&buffer, "\" />");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_FLOAT:
+            /* <hdf5:FloatType ByteOrder="bo" Size="bytes"
+               SignBitLocation="bytes"
+               ExponentBits="eb" ExponentLocation="el"
+               MantissaBits="mb" MantissaLocation="ml" /> */
+            ord = H5Tget_order(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sFloatType ByteOrder=\"",xmlnsprefix);
+            
+            switch (ord) {
+            case H5T_ORDER_LE:
+                h5tools_str_append(&buffer, "LE");
+                break;
+            case H5T_ORDER_BE:
+                h5tools_str_append(&buffer, "BE");
+                break;
+            case H5T_ORDER_VAX:
+                h5tools_str_append(&buffer, "VAX");
+                break;
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+            default:
+                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+            } /* end switch */
+            
+            h5tools_str_append(&buffer, "\" Size=\"");
+            sz = H5Tget_size(type);
+            h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
+            H5Tget_fields(type, &spos, &epos, &esize, &mpos, &msize);
+            h5tools_str_append(&buffer, "\" SignBitLocation=\"%lu\" ", (unsigned long)spos);
+            h5tools_str_append(&buffer, "ExponentBits=\"%lu\" ExponentLocation=\"%lu\" ", (unsigned long)esize, (unsigned long)epos);
+            h5tools_str_append(&buffer, "MantissaBits=\"%lu\" MantissaLocation=\"%lu\" />", (unsigned long)msize, (unsigned long)mpos);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_TIME:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sTimeType />",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            h5tools_str_append(&buffer, "<!-- H5T_TIME: not yet implemented -->");
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_STRING:
+            /* <hdf5:StringType Cset="cs" StrSize="chars" StrPad="pad" /> */
+            size = H5Tget_size(type);
+            str_pad = H5Tget_strpad(type);
+            cset = H5Tget_cset(type);
+            is_vlstr = H5Tis_variable_str(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sStringType Cset=\"",xmlnsprefix);
+            if (cset == H5T_CSET_ASCII) {
+                h5tools_str_append(&buffer, "H5T_CSET_ASCII\" ");
+            } 
+            else {
+                h5tools_str_append(&buffer, "unknown_cset\" ");
+            }
+            if(is_vlstr)
+                h5tools_str_append(&buffer, "StrSize=\"H5T_VARIABLE\" StrPad=\"");
+            else
+                h5tools_str_append(&buffer, "StrSize=\"%d\" StrPad=\"", (int) size);
+            if (str_pad == H5T_STR_NULLTERM) {
+                h5tools_str_append(&buffer, "H5T_STR_NULLTERM\"/>");
+            } 
+            else if (str_pad == H5T_STR_NULLPAD) {
+                h5tools_str_append(&buffer, "H5T_STR_NULLPAD\"/>");
+            } 
+            else if (str_pad == H5T_STR_SPACEPAD) {
+                h5tools_str_append(&buffer, "H5T_STR_SPACEPAD\"/>");
+            } 
+            else {
+                h5tools_str_append(&buffer, "H5T_STR_ERROR\"/>");
+            }
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_BITFIELD:
+            /* <hdf5:BitfieldType ByteOrder="bo" Size="bytes"/> */
+            ord = H5Tget_order(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sBitfieldType ByteOrder=\"",xmlnsprefix);
+            
+            switch (ord) {
+            case H5T_ORDER_LE:
+                h5tools_str_append(&buffer, "LE");
+                break;
+            case H5T_ORDER_BE:
+                h5tools_str_append(&buffer, "BE");
+                break;
+            case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+            default:
+                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+            } /* end switch */
+            
+            size = H5Tget_size(type);
+            h5tools_str_append(&buffer, "\" Size=\"%lu\"/>", (unsigned long)size);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_OPAQUE:
+            /* <hdf5:OpaqueType Tag="tag" Size="bytes" /> */
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+            mname = H5Tget_tag(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sOpaqueType Tag=\"%s\" ",xmlnsprefix, mname);
+            H5free_memory(mname);
+            size = H5Tget_size(type);
+            h5tools_str_append(&buffer, "Size=\"%lu\"/>", (unsigned long)size);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_COMPOUND:
+            /* recursively describe the components of a compound datatype */
+
+            /* type of a dataset */
+            nmembers = H5Tget_nmembers(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sCompoundType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* List each member Field of the type */
+            /*   <hdf5:Field FieldName="name" > */
+            /*   <hdf5:DataType > */
+            ctx.indent_level++;
+            dump_indent += COL;
+            for (i = 0; i < nmembers; i++) {
+                char *t_fname;
+
+                mname = H5Tget_member_name(type, i);
+                mtype = H5Tget_member_type(type, i);
+                t_fname = xml_escape_the_name(mname);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sField FieldName=\"%s\">",xmlnsprefix, t_fname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                H5free_memory(mname);
+                HDfree(t_fname);
+                dump_indent += COL;
+                ctx.indent_level++;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+                dump_indent += COL;
+                xml_print_datatype(mtype,0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sField>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sCompoundType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_REFERENCE:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+            /*  Only Object references supported at this time */
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sReferenceType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sObjectReferenceType />",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sReferenceType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_ENUM:
+            /*  <hdf5:EnumType Nelems="ne" > list Name, values of enum */
+            nmembs = H5Tget_nmembers(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent += COL;
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sEnumType Nelems=\"%d\">",xmlnsprefix, nmembs);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            xml_print_enum(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sEnumType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sAtomicType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_VLEN:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sVLType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            super = H5Tget_super(type);
+            dump_indent += COL;
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent += COL;
+            ctx.indent_level++;
+            xml_print_datatype(super,0);
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sVLType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            H5Tclose(super);
+
+            break;
+
+        case H5T_ARRAY:
+            /* Get array base type */
+            super = H5Tget_super(type);
+
+            /* Print lead-in */
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sArrayType Ndims=\"",xmlnsprefix);
+            ndims = H5Tget_array_ndims(type);
+            h5tools_str_append(&buffer, "%u\">", ndims);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* Get array information */
+            H5Tget_array_dims2(type, dims);
+
+            /* list of dimensions */
+            ctx.indent_level++;
+            for (i = 0; i < ndims; i++) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sArrayDimension DimSize=\"%u\"/>", xmlnsprefix, (int) dims[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            ctx.indent_level--;
+
+            dump_indent += COL;
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent += COL;
+            ctx.indent_level++;
+            xml_print_datatype(super,0);
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            dump_indent -= COL;
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sArrayType>",xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            /* Close array base type */
+            H5Tclose(super);
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
+        default:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- unknown datatype -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            h5tools_setstatus(EXIT_FAILURE);
+            break;
+        }
+    } /* end else */
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_datatype
+ *
+ * Purpose:     Dump description of a datatype in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_datatype(hid_t type)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if(H5Tcommitted(type) > 0) {
+        H5O_info_t oinfo;
+        obj_t  *found_obj;    /* Found object */
+
+        /* Datatype is a shared or named datatype */
+        H5Oget_info(type, &oinfo);
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if(found_obj) {
+            /* Shared datatype, must be entered as an object  */
+            /* These 2 cases are the same now, but may change */
+            char *dtxid = (char *)HDmalloc((size_t)100);
+
+            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
+            if (!found_obj->recorded) {
+                /* anonymous stored datatype:
+                   following the dumper's current
+                   practice:
+                   use it's object ref as its name
+                 */
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNamedDataTypePtr OBJ-XID=\"%s\"/>",
+                        xmlnsprefix, dtxid);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                /* pointer to a named datatype already in XML */
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\" />",
+                        xmlnsprefix, dtxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+            }
+            HDfree(dtxid);
+        } 
+        else {
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- h5dump error: unknown committed type. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+    }
+    else {
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sDataType>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        dump_indent += COL;
+        xml_print_datatype(type, 0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sDataType>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_dataspace
+ *
+ * Purpose:     Dump description of a dataspace in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_dataspace(hid_t space)
+{
+    hsize_t         size[H5DUMP_MAX_RANK];
+    hsize_t         maxsize[H5DUMP_MAX_RANK];
+    int             i;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+    
+    int             ndims = H5Sget_simple_extent_dims(space, size, maxsize);
+    H5S_class_t     space_type = H5Sget_simple_extent_type(space);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sDataspace>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level++;
+
+    switch (space_type) {
+    case H5S_SCALAR:
+        /* scalar dataspace (just a tag, no XML attrs. defined */
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sScalarDataspace />",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        break;
+
+    case H5S_SIMPLE:
+        /* simple dataspace */
+        /* <hdf5:SimpleDataspace Ndims="nd"> */
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sSimpleDataspace Ndims=\"%d\">",xmlnsprefix, ndims);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* print the <hdf5:Dimension> elements */
+        ctx.indent_level++;
+        for (i = 0; i < ndims; i++) {
+            if (maxsize[i] == H5S_UNLIMITED) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"UNLIMITED\"/>",
+                        xmlnsprefix,size[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else if (maxsize[i] == (hsize_t) 0) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
+                        xmlnsprefix,size[i], size[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
+                        xmlnsprefix, size[i], maxsize[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+        }
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sSimpleDataspace>", xmlnsprefix );
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        break;
+
+#ifdef TMP
+        /* Commented out: wait until the schema is updated first */
+    case H5S_NULL:
+        /* null dataspace (just a tag, no XML attrs. defined */
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNullDataspace />",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+       break;
+#endif /* TMP */
+
+    case H5S_NULL:
+    case H5S_NO_CLASS:
+    default:
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<!-- unknown dataspace -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+    ctx.indent_level--;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataspace>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level--;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_data
+ *
+ * Purpose:     Dump description of data in XML.
+ *              Note that this calls the h5dump_xxx calls in
+ *              the h5tools library.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_data(hid_t obj_id, int obj_data, struct subset_t H5_ATTR_UNUSED * sset, int H5_ATTR_UNUSED pindex)
+{
+    hid_t               space = -1;
+    hid_t               type = -1;
+    hid_t               p_type = -1;
+    hsize_t             size[64];
+    hsize_t             nelmts = 1;
+    int                 ndims;
+    int                 i;
+    int                 status = -1;
+    void               *buf = NULL;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *outputformat = &xml_dataformat;
+    h5tool_format_t     string_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    /* Print all the values. */
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+    string_dataformat.cmpd_sep = " ";
+    string_dataformat.cmpd_pre = "";
+    string_dataformat.cmpd_suf = "";
+    string_dataformat.cmpd_end = "";
+    string_dataformat.arr_linebreak = 0;
+    string_dataformat.arr_pre = "";
+    outputformat = &string_dataformat;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    
+    dump_indent += COL;
+    ctx.indent_level++;
+
+    if (obj_data == DATASET_DATA) {
+        type = H5Dget_type(obj_id);
+        if (H5Tget_class(type) == H5T_REFERENCE) {
+            status = xml_print_refs(obj_id, DATASET_DATA);
+        } 
+        else if (H5Tget_class(type) == H5T_STRING) {
+            status = xml_print_strs(obj_id, DATASET_DATA);
+        } 
+        else {
+            h5tools_context_t datactx;
+            HDmemset(&datactx, 0, sizeof(datactx));
+            datactx.need_prefix = TRUE;
+            datactx.indent_level = ctx.indent_level;
+            datactx.cur_column = ctx.cur_column;
+            status = h5tools_dump_dset(rawoutstream, outputformat, &datactx, obj_id, NULL);
+        }
+    } 
+    else {
+        /* Attribute data */
+        type = H5Aget_type(obj_id);
+
+        if (H5Tget_class(type) == H5T_REFERENCE) {
+            /* references are done differently than
+               the standard output:
+               XML dumps a path to the object
+               referenced.
+             */
+            status = xml_print_refs(obj_id, ATTRIBUTE_DATA);
+            H5Tclose(type);
+        } 
+        else if (H5Tget_class(type) == H5T_STRING) {
+            status = xml_print_strs(obj_id, ATTRIBUTE_DATA);
+        } 
+        else {  /* all other data */
+            /* VL data special information */
+            unsigned int vl_data = 0; /* contains VL datatypes */
+            
+            p_type = h5tools_get_native_type(type);
+
+            /* Check if we have VL data in the dataset's datatype */
+            if (h5tools_detect_vlen(p_type) == TRUE)
+                vl_data = TRUE;
+
+            H5Tclose(type);
+
+            space = H5Aget_space(obj_id);
+
+            ndims = H5Sget_simple_extent_dims(space, size, NULL);
+
+            for (i = 0; i < ndims; i++)
+                nelmts *= size[i];
+
+            buf = HDmalloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))));
+            HDassert(buf);
+            
+            if (H5Aread(obj_id, p_type, buf) >= 0) {
+                h5tools_context_t datactx;
+                HDmemset(&datactx, 0, sizeof(datactx));
+                datactx.need_prefix = TRUE;
+                datactx.indent_level = ctx.indent_level;
+                datactx.cur_column = ctx.cur_column;
+                status = h5tools_dump_mem(rawoutstream, outputformat, &datactx, obj_id, p_type, space, buf);
+            }
+            /* Reclaim any VL memory, if necessary */
+            if (vl_data)
+                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
+
+            HDfree(buf);
+            H5Tclose(p_type);
+            H5Sclose(space);
+            H5Tclose(type);
+        }
+    }
+
+    if (status == FAIL) {
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "Unable to print data.");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+
+        status = 1;
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.indent_level++;
+
+    ctx.need_prefix = TRUE;
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataFromFile>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_attr
+ *
+ * Purpose:     Dump a description of an HDF5 attribute in XML.
+ *
+ * Return:      herr_t
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+xml_dump_attr(hid_t attr, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info,
+    void H5_ATTR_UNUSED * op_data)
+{
+    hid_t             attr_id = -1;
+    hid_t             type = -1;
+    hid_t             space = -1;
+    H5S_class_t       space_type;
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;           /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    
+    char *t_aname = xml_escape_the_name(attr_name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sAttribute Name=\"%s\">", xmlnsprefix, t_aname);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    HDfree(t_aname);
+
+    if ((attr_id = H5Aopen(attr, attr_name, H5P_DEFAULT)) >= 0) {
+        type = H5Aget_type(attr_id);
+        space = H5Aget_space(attr_id);
+        space_type = H5Sget_simple_extent_type(space);
+
+        dump_function_table->dump_dataspace_function(space);
+        dump_function_table->dump_datatype_function(type);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        if (display_attr_data && space_type != H5S_NULL) {
+            switch (H5Tget_class(type)) {
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_ENUM:
+            case H5T_ARRAY:
+                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
+                break;
+
+            case H5T_TIME:
+                ctx.indent_level++;
+                dump_indent += COL;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- Time data not yet implemented. -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<hdf5:Data>");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.indent_level--;
+                dump_indent -= COL;
+                break;
+
+            case H5T_COMPOUND:
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- Note: format of compound data not specified -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
+                break;
+
+            case H5T_REFERENCE:
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                    
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<!-- Note: Region references not supported -->");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                    
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                    
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    xml_print_refs(attr_id, ATTRIBUTE_DATA);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                    
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_VLEN:
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- Note: format of VL data not specified -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
+                break;
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+                HDassert(0);
+                /* fall through */
+            default:
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+            }
+        }
+        else {
+            /* The case of an attribute never yet written ??
+             * Or dataspace is H5S_NULL. */
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Aclose(attr_id);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sAttribute>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+        return SUCCEED;
+    }
+    else {
+        /* ?? failed */
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<!-- h5dump error: unable to open attribute. -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sAttribute>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+        
+        h5tools_setstatus(EXIT_FAILURE);
+        return FAIL;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_named_datatype
+ *
+ * Purpose:     Dump a description of an HDF5 NDT in XML.
+ *
+ * Return:      herr_t
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_named_datatype(hid_t type, const char *name)
+{
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    char             *tmp;
+    char             *dtxid;
+    char             *parentxid;
+    char             *t_tmp;
+    char             *t_prefix;
+    char             *t_name;
+
+    tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    HDstrcpy(tmp, prefix);
+    HDstrcat(tmp, "/");
+    HDstrcat(tmp, name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    dtxid = (char *)HDmalloc((size_t)100);
+    parentxid = (char *)HDmalloc((size_t)100);
+    t_tmp = xml_escape_the_name(tmp);
+    t_prefix = xml_escape_the_name(prefix);
+    t_name = xml_escape_the_name(name);
+
+    xml_name_to_XID(tmp, dtxid, 100, 1);
+    xml_name_to_XID(prefix, parentxid, 100, 1);
+    if(HDstrncmp(name, "#", (size_t)1) == 0) {
+        /*  Special:  this is an 'anonymous' NDT, deleted but
+           still in use.
+           We follow the dumper's undocumented practice, and
+           use its object id as its name.
+           Exactly the same as normal, but a separate case
+           in the event we want to do something else in
+           the future.
+         */
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
+                "Parents=\"%s\" H5ParentPaths=\"%s\">",
+                xmlnsprefix,
+                name, dtxid,
+                parentxid, HDstrcmp(prefix,"") ? t_prefix : "/");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    } 
+    else {
+        H5O_info_t  oinfo;          /* Object info */
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
+                "H5Path=\"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
+                xmlnsprefix,
+                t_name, dtxid,
+                t_tmp, parentxid, (HDstrcmp(prefix, "") ? t_prefix : "/"));
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Check uniqueness of named datatype */
+        H5Oget_info(type, &oinfo);
+        if(oinfo.rc > 1) {
+            obj_t       *found_obj;     /* Found object */
+
+            /* Group with more than one link to it... */
+            found_obj = search_obj(type_table, oinfo.addr);
+
+            if (found_obj == NULL) {
+                indentation(dump_indent);
+                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+            } 
+            else if(found_obj->displayed) {
+                /* We have already printed this named datatype, print it as a
+                 * NamedDatatypePtr
+                 */
+                char pointerxid[100];
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                ctx.indent_level++;
+                
+                xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNamedDatatypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>", xmlnsprefix, pointerxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                
+                ctx.indent_level--;
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sNamedDataType>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+                goto done;
+            } 
+            else
+                found_obj->displayed = TRUE;
+        }
+    }
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+    xml_print_datatype(type,1);
+    ctx.indent_level--;
+    dump_indent -= COL;
+    
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sNamedDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    HDfree(dtxid);
+    HDfree(parentxid);
+    HDfree(t_tmp);
+    HDfree(t_prefix);
+    HDfree(t_name);
+    HDfree(tmp);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_group
+ *
+ * Purpose:     Dump a description of an HDF5 Group (and its members) in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *  Pedro Vicente, October 9, 2007
+ *   added parameters to H5A(L)iterate to allow for other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_group(hid_t gid, const char *name)
+{
+    H5O_info_t              oinfo;
+    hid_t                   gcpl_id;
+    hid_t                   dset, type;
+    unsigned                crt_order_flags;
+    unsigned                attr_crt_order_flags;
+    int                     isRoot = 0;
+    char                    type_name[1024];
+    char                   *t_objname = NULL;
+    char                   *par_name = NULL;
+    char                   *cp = NULL;
+    char                   *tmp = NULL;
+    char                   *par = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+        error_msg("error in getting group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties for attributes */
+    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties */
+    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(gcpl_id) < 0) {
+        error_msg("error in closing group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if(HDstrcmp(name, "/") == 0) {
+        isRoot = 1;
+        tmp = HDstrdup("/");
+    }
+    else {
+        tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+        HDstrcpy(tmp, prefix);
+        par = HDstrdup(tmp);
+        cp = HDstrrchr(par, '/');
+        if(cp) {
+            if((cp == par) && HDstrlen(par) > 1)
+                *(cp + 1) = '\0';
+            else
+                *cp = '\0';
+        }
+    }
+
+    H5Oget_info(gid, &oinfo);
+
+    if(oinfo.rc > 1) {
+        obj_t *found_obj;    /* Found object */
+
+        /* Group with more than one link to it... */
+        found_obj = search_obj(group_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            indentation(dump_indent);
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+        else {
+            char *t_name = xml_escape_the_name(name);
+            char *grpxid = (char *)HDmalloc((size_t)100);
+            char *parentxid = (char *)HDmalloc((size_t)100);
+
+            if(found_obj->displayed) {
+                char *ptrstr = (char *)HDmalloc((size_t)100);
+
+                /* already seen: enter a groupptr */
+                if(isRoot) {
+                    /* probably can't happen! */
+                    xml_name_to_XID("/", grpxid, 100, 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
+                            xmlnsprefix, grpxid, "/");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    t_objname = xml_escape_the_name(found_obj->objname);
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(tmp, grpxid, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sGroup Name=\"%s\" OBJ-XID=\"%s-%d\" H5Path=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\">",
+                            xmlnsprefix,t_name, grpxid, get_next_xid(),
+                            t_objname, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    HDfree(t_objname);
+                    HDfree(par_name);
+                    
+                    ctx.indent_level++;
+
+                    t_objname = xml_escape_the_name(found_obj->objname);/* point to the NDT by name */
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(found_obj->objname, ptrstr, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sGroupPtr OBJ-XID=\"%s\" H5Path=\"%s\" "
+                                "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                                xmlnsprefix,
+                                ptrstr, t_objname, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    
+                    ctx.indent_level--;
+
+                    HDfree(t_objname);
+                    HDfree(par_name);
+                }
+                HDfree(ptrstr);
+            }
+            else {
+
+                /* first time this group has been seen -- describe it  */
+                if(isRoot) {
+                    xml_name_to_XID("/", grpxid, 100, 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
+                            xmlnsprefix, grpxid, "/");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    char *t_tmp = xml_escape_the_name(tmp);
+
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(tmp, grpxid, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    ctx.need_prefix = TRUE;
+                    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" >",
+                            xmlnsprefix,t_name, grpxid, t_tmp, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    HDfree(t_tmp);
+                    HDfree(par_name);
+                }
+                found_obj->displayed = TRUE;
+
+                /* 1.  do all the attributes of the group */
+                
+                ctx.indent_level++;
+                dump_indent += COL;
+
+                if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+                    if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                        error_msg("error getting attribute information\n");
+                        h5tools_setstatus(EXIT_FAILURE);
+                    } /* end if */
+                } /* end if */
+                else {
+                    if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                        error_msg("error getting attribute information\n");
+                        h5tools_setstatus(EXIT_FAILURE);
+                    } /* end if */
+                } /* end else */
+
+                if(isRoot && unamedtype) {
+                    unsigned u;
+
+                    /* Very special case: dump unamed type in root group */
+                    for(u = 0; u < type_table->nobjs; u++) {
+                        if(!type_table->objs[u].recorded) {
+                            dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                            type = H5Dget_type(dset);
+                            sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                            dump_function_table->dump_named_datatype_function(type, type_name);
+                            H5Tclose(type);
+                            H5Dclose(dset);
+                        }
+                    }
+                }
+
+                /* iterate through all the links */
+
+                if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+                    H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
+                else
+                    H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
+
+                dump_indent -= COL;
+                ctx.indent_level--;
+            }
+            HDfree(t_name);
+            HDfree(grpxid);
+            HDfree(parentxid);
+        }
+    }
+    else {
+        /* only link -- must be first time! */
+        char *t_name = xml_escape_the_name(name);
+        char *grpxid = (char *)HDmalloc((size_t)100);
+        char *parentxid = (char *)HDmalloc((size_t)100);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+
+        if(isRoot) {
+            xml_name_to_XID("/", grpxid, 100, 1);
+            h5tools_str_append(&buffer, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">", xmlnsprefix, grpxid, "/");
+        }
+        else {
+            char *t_tmp = xml_escape_the_name(tmp);
+
+            par_name = xml_escape_the_name(par);
+            xml_name_to_XID(tmp, grpxid, 100, 1);
+            xml_name_to_XID(par, parentxid, 100, 1);
+            h5tools_str_append(&buffer, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
+                    "Parents=\"%s\" H5ParentPaths=\"%s\" >",
+                    xmlnsprefix, t_name, grpxid, t_tmp, parentxid, par_name);
+            HDfree(t_tmp);
+            HDfree(par_name);
+        }
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        HDfree(t_name);
+        HDfree(grpxid);
+        HDfree(parentxid);
+
+        /* 1.  do all the attributes of the group */
+        
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else {
+            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end else */
+
+        if(isRoot && unamedtype) {
+            unsigned u;
+
+            /* Very special case: dump unamed type in root group */
+            for(u = 0; u < type_table->nobjs; u++) {
+                if(!type_table->objs[u].recorded) {
+                    dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                    type = H5Dget_type(dset);
+                    sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                    dump_function_table->dump_named_datatype_function(type, type_name);
+                    H5Tclose(type);
+                    H5Dclose(dset);
+                }
+            }
+        }
+
+        /* iterate through all the links */
+
+        if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+            H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
+        else
+            H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
+
+        dump_indent -= COL;
+        ctx.indent_level--;
+    }
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(isRoot)
+        h5tools_str_append(&buffer, "</%sRootGroup>", xmlnsprefix);
+    else
+        h5tools_str_append(&buffer, "</%sGroup>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+    
+    if(par)
+        HDfree(par);
+    if(tmp)
+        HDfree(tmp);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_refs
+ *
+ * Purpose:     Print a path to the objects referenced by HDF5 Referneces.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+xml_print_refs(hid_t did, int source)
+{
+    herr_t      e;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
+    hsize_t     i;
+    size_t      tsiz;
+    hobj_ref_t *refbuf = NULL;
+    char       *buf = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if (source == DATASET_DATA) {
+        type = H5Dget_type(did);
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        type = H5Aget_type(did);
+    }
+    else {
+        /* return an error */
+        return FAIL;
+    }
+    if (H5Tget_class(type) != H5T_REFERENCE) {
+        /* return an error */
+        goto error;
+    }
+    if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+        /* region ref not supported yet... */
+        /* return an error */
+        goto error;
+    }
+    if (source == DATASET_DATA) {
+        space = H5Dget_space(did);
+        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if ((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = (char *) HDcalloc((size_t)(ssiz * tsiz), sizeof(char));
+        if (buf == NULL)
+            goto error;
+        e = H5Dread(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+        /* need to check result here */
+        if (e < 0) {
+            goto error;
+        }
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        space = H5Aget_space(did);
+        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if ((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = (char *) HDcalloc((size_t)(ssiz * tsiz), sizeof(char));
+        if (buf == NULL) {
+            goto error;
+        }
+        e = H5Aread(did, H5T_STD_REF_OBJ, buf);
+        /* need to check the result here */
+        if (e < 0) {
+            goto error;
+        }
+    }
+
+    refbuf = (hobj_ref_t *) buf;
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    for (i = 0; i < (hsize_t)ssiz; i++) {
+        const char *path = lookup_ref_path(*refbuf);
+        ctx.indent_level++;
+
+        if (!path) {
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%s\"", "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_path = xml_escape_the_string(path, -1);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%s\"", t_path);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            HDfree(t_path);
+        }
+        ctx.indent_level--;
+
+        refbuf++;
+    }
+
+    h5tools_str_close(&buffer);
+
+    HDfree(buf);
+    H5Tclose(type);
+    H5Sclose(space);
+    return SUCCEED;
+    
+error:
+    if(buf)
+        HDfree(buf);
+
+    H5E_BEGIN_TRY {
+        H5Tclose(type);
+        H5Sclose(space);
+    } H5E_END_TRY;
+    return FAIL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_strs
+ *
+ * Purpose:     Print strings.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+xml_print_strs(hid_t did, int source)
+{
+    herr_t      e;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
+    htri_t      is_vlstr = FALSE;
+    size_t      tsiz    = 0;
+    size_t      i;
+    size_t      str_size = 0;
+    char       *bp = NULL;
+    char       *onestring = NULL;
+    void       *buf = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if (source == DATASET_DATA) {
+        type = H5Dget_type(did);
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        type = H5Aget_type(did);
+    }
+    else {
+        /* return an error */
+        return FAIL;
+    }
+    if (H5Tget_class(type) != H5T_STRING) {
+        /* return an error */
+        goto error;
+    }
+    /* Check if we have VL data in the dataset's datatype */
+    is_vlstr = H5Tis_variable_str(type);
+
+    if (source == DATASET_DATA) {
+        space = H5Dget_space(did);
+        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = HDmalloc((size_t)(ssiz * tsiz));
+        if (buf == NULL)
+            goto error;
+
+        e = H5Dread(did, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+        if (e < 0) {
+            goto error;
+        }
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        space = H5Aget_space(did);
+        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = HDmalloc((size_t)(ssiz * tsiz));
+        if (buf == NULL)
+            goto error;
+
+        e = H5Aread(did, type, buf);
+        if (e < 0) {
+            goto error;
+        }
+    }
+
+    bp = (char*) buf;
+    if (!is_vlstr)
+        onestring = (char *) HDcalloc(tsiz, sizeof(char));
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    for (i = 0; i < ssiz; i++) {
+        if (is_vlstr) {
+            onestring = *(char **) bp;
+            if (onestring)
+                str_size = (size_t) HDstrlen(onestring);
+        }
+        else {
+            HDstrncpy(onestring, bp, tsiz);
+            str_size = tsiz;
+        }
+
+        if (!onestring) {
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_onestring = xml_escape_the_string(onestring, (int) str_size);
+            if (t_onestring) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "\"%s\"", t_onestring);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_onestring);
+            }
+        }
+        bp += tsiz;
+    }
+
+    h5tools_str_close(&buffer);
+
+    /* Reclaim any VL memory, if necessary */
+    if (!is_vlstr)
+        if (onestring)
+            HDfree(onestring);
+    if (buf) {
+        if (is_vlstr)
+            H5Dvlen_reclaim(type, space, H5P_DEFAULT, buf);
+        HDfree(buf);
+    }
+    H5Tclose(type);
+    H5Sclose(space);
+    return SUCCEED;
+    
+error:
+    if(buf)
+        HDfree(buf);
+
+    H5E_BEGIN_TRY {
+        H5Tclose(type);
+        H5Sclose(space);
+    } H5E_END_TRY;
+    return FAIL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    check_filters
+ *
+ * Purpose:     private function to check for the filters and
+ *              put tags in the XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+check_filters(hid_t dcpl)
+{
+    int             nfilt;
+    int             i;
+    H5Z_filter_t    filter;
+    char            namebuf[120];
+    size_t          cd_nelmts = 20;
+    unsigned int    cd_values[20];
+    unsigned int    flags;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    nfilt = H5Pget_nfilters(dcpl);
+    if (nfilt <= 0)
+        return;
+    for (i = 0; i < nfilt; i++) {
+        filter = H5Pget_filter2(dcpl, (unsigned) i, &flags, (size_t *) &cd_nelmts, cd_values, (size_t)120, namebuf, NULL);
+        if (filter == H5Z_FILTER_DEFLATE) {
+            ctx.indent_level++;
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDeflate Level=\"", xmlnsprefix);
+            if (cd_nelmts < 1) {
+                /* not sure what this means? */
+                h5tools_str_append(&buffer, "6");
+            }
+            else {
+                h5tools_str_append(&buffer, "%d", cd_values[0]);
+            }
+            h5tools_str_append(&buffer, "\"/>");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_FLETCHER32) {
+            ctx.indent_level++;
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sFletcher32 />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_SHUFFLE) {
+            ctx.indent_level++;
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sShuffle />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_SZIP) {
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sSZIP ", xmlnsprefix);
+            if (cd_nelmts < 2) {
+                /* no pixels ? */
+                h5tools_str_append(&buffer, "Pixels_per_block=\"-1\" ");
+            }
+            else {
+                h5tools_str_append(&buffer, "Pixels_per_block=\"%d\" ", cd_values[1]);
+            }
+            /* analyse the options mask */
+            if (cd_values[0] & H5_SZIP_CHIP_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Mode =\"Hardware\" ");
+            }
+            else if (cd_values[0] & H5_SZIP_ALLOW_K13_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Mode =\"K13\" ");
+            }
+            h5tools_str_append(&buffer, "Coding=\"");
+            if (cd_values[0] & H5_SZIP_EC_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Entropy");
+            }
+            else if (cd_values[0] & H5_SZIP_NN_OPTION_MASK) {
+                h5tools_str_append(&buffer, "NN");
+            }
+            h5tools_str_append(&buffer, "\" ");
+
+            h5tools_str_append(&buffer, "ByteOrder=\"");
+            if (cd_values[0] & H5_SZIP_LSB_OPTION_MASK) {
+                h5tools_str_append(&buffer, "LSB");
+            }
+            else if (cd_values[0] & H5_SZIP_MSB_OPTION_MASK) {
+                h5tools_str_append(&buffer, "MSB");
+            }
+            h5tools_str_append(&buffer, "\" ");
+
+            if (cd_values[0] & H5_SZIP_RAW_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Header=\"Raw\"");
+            }
+            h5tools_str_append(&buffer, "/>");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else {
+            /* unknown option */
+        }
+    }
+
+    h5tools_str_close(&buffer);
+}
+
+static void
+xml_dump_fill_value(hid_t dcpl, hid_t type)
+{
+    size_t      sz;
+    size_t      i;
+    hsize_t     space;
+    void       *buf;
+    char       *name;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t           curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else 
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    space = H5Tget_size(type);
+    buf = HDmalloc((size_t) space);
+
+    H5Pget_fill_value(dcpl, type, buf);
+
+    if (H5Tget_class(type) == H5T_REFERENCE) {
+        const char * path = lookup_ref_path(*(hobj_ref_t *) buf);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        if (!path) {
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%s\"", "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_path = xml_escape_the_string(path, -1);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%s\"", t_path);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            HDfree(t_path);
+        }
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    else if (H5Tget_class(type) == H5T_STRING) {
+        /* ????? */
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<!-- String fill values not yet implemented. -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    else {
+        /* all other data */
+        switch (H5Tget_class(type)) {
+        case H5T_INTEGER:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%d\"", *(int *) buf);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_FLOAT:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%f\"", (double)*(float *)buf);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            sz = H5Tget_size(type);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"");
+            for (i = 0; i < sz; i++) {
+                h5tools_str_append(&buffer, "%x ", *(unsigned int *) buf);
+                buf = (char *) buf + sizeof(unsigned int);
+            }
+            h5tools_str_append(&buffer, "\"");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_ENUM:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            name = H5Tget_member_name(type, *(unsigned *) buf);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"%s\"", name);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            if(name)
+                H5free_memory(name);
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_ARRAY:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Array fill values not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_TIME:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Time fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_COMPOUND:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Compound fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_VLEN:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- VL fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
+        case H5T_STRING:
+        case H5T_REFERENCE:
+        default:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Unknown fill datatype: %d -->", H5Tget_class(type));
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        }
+    }
+    HDfree(buf);
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_dataset
+ *
+ * Purpose:     Dump a description of an HDF5 dataset in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *  Pedro Vicente, October 9, 2007
+ *   added parameters to H5Aiterate2 to allow for other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_dataset(hid_t did, const char *name, struct subset_t H5_ATTR_UNUSED * sset)
+{
+    hid_t               type;
+    hid_t               space;
+    hid_t               dcpl;
+    H5D_fill_value_t    fvstatus;
+    int                 maxdims;
+    hsize_t            *chsize;
+    int                 ndims;
+    int                 i;
+    H5D_alloc_time_t    at;
+    H5D_fill_time_t     ft;
+    hsize_t             tempi;
+    char               *tmp;
+    char               *t_name;
+    char               *t_tmp;
+    char               *t_prefix;
+    unsigned            attr_crt_order_flags;
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;            /* print context  */
+    h5tool_format_t    *outputformat = &xml_dataformat;
+    h5tool_format_t     string_dataformat;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    
+    char *rstr = (char*) HDmalloc((size_t)100);
+    char *pstr = (char*) HDmalloc((size_t)100);
+
+    tmp = (char*) HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    HDstrcpy(tmp, prefix);
+    HDstrcat(tmp, "/");
+    HDstrcat(tmp, name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+
+    t_name = xml_escape_the_name(name);
+    t_tmp = xml_escape_the_name(tmp);
+    t_prefix = xml_escape_the_name(prefix);
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    xml_name_to_XID(tmp, rstr, 100, 1);
+    xml_name_to_XID(prefix, pstr, 100, 1);
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sDataset Name=\"%s\" OBJ-XID=\"%s\" H5Path= \"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
+            xmlnsprefix, t_name, rstr, t_tmp, pstr,
+            strcmp(prefix, "") ? t_prefix : "/");
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    HDfree(t_name);
+    HDfree(t_tmp);
+    HDfree(t_prefix);
+    HDfree(rstr);
+    HDfree(pstr);
+    HDfree(tmp);
+
+    dcpl = H5Dget_create_plist(did);
+    type = H5Dget_type(did);
+    space = H5Dget_space(did);
+
+    /* query the creation properties for attributes */
+    H5Pget_attr_creation_order(dcpl, &attr_crt_order_flags);
+
+    /* Print information about storage layout */
+    if (H5D_CHUNKED == H5Pget_layout(dcpl)) {
+        maxdims = H5Sget_simple_extent_ndims(space);
+        HDassert(maxdims >= 0);
+        chsize = (hsize_t *)HDmalloc((size_t)maxdims * sizeof(hsize_t));
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sChunkedLayout ", xmlnsprefix);
+        ndims = H5Pget_chunk(dcpl, maxdims, chsize);
+        h5tools_str_append(&buffer, "Ndims=\"%d\">", ndims);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        for (i = 0; i < ndims; i++) {
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sChunkDimension DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" />", xmlnsprefix, chsize[i]);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sRequiredFilter>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+        check_filters(dcpl);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sRequiredFilter>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+        dump_indent -= COL;
+        
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sChunkedLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+        HDfree(chsize);
+    }
+    else if (H5D_CONTIGUOUS == H5Pget_layout(dcpl)) {
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sContiguousLayout/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    else if (H5D_COMPACT == H5Pget_layout(dcpl)) {
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sCompactLayout/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    /* and check for external.... ?? */
+
+    /* fill value */
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sFillValueInfo ", xmlnsprefix);
+    H5Pget_fill_time(dcpl, &ft);
+    h5tools_str_append(&buffer, "FillTime=\"");
+    switch (ft) {
+    case H5D_FILL_TIME_ALLOC:
+        h5tools_str_append(&buffer, "FillOnAlloc");
+        break;
+    case H5D_FILL_TIME_NEVER:
+        h5tools_str_append(&buffer, "FillNever");
+        break;
+    case H5D_FILL_TIME_IFSET:
+        h5tools_str_append(&buffer, "FillIfSet");
+        break;
+        case H5D_FILL_TIME_ERROR:
+            HDassert(0);
+            /* fall through */
+    default:
+        h5tools_str_append(&buffer, "?");
+        break;
+    } /* end switch */
+    h5tools_str_append(&buffer, "\" ");
+    H5Pget_alloc_time(dcpl, &at);
+    h5tools_str_append(&buffer, "AllocationTime=\"");
+    switch (at) {
+    case H5D_ALLOC_TIME_EARLY:
+        h5tools_str_append(&buffer, "Early");
+        break;
+    case H5D_ALLOC_TIME_INCR:
+        h5tools_str_append(&buffer, "Incremental");
+        break;
+    case H5D_ALLOC_TIME_LATE:
+        h5tools_str_append(&buffer, "Late");
+        break;
+    case H5D_ALLOC_TIME_DEFAULT:
+        case H5D_ALLOC_TIME_ERROR:
+            HDassert(0);
+            /* fall through */
+    default:
+        h5tools_str_append(&buffer, "?");
+        break;
+    } /* end switch */
+    h5tools_str_append(&buffer, "\"");
+    h5tools_str_append(&buffer, ">");
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sFillValue>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    H5Pfill_value_defined(dcpl, &fvstatus);
+    if (fvstatus == H5D_FILL_VALUE_UNDEFINED || (fvstatus == H5D_FILL_VALUE_DEFAULT && ft == H5D_FILL_TIME_IFSET)) {
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNoFill/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    else {
+        xml_dump_fill_value(dcpl, type);
+    }
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sFillValue>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sFillValueInfo>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    dump_function_table->dump_dataspace_function(space);
+    dump_function_table->dump_datatype_function(type);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if ((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+        if (H5Aiterate2(did, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+            error_msg("error getting attribute information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        } /* end if */
+    } /* end if */
+    else {
+        if (H5Aiterate2(did, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+            error_msg("error getting attribute information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        } /* end if */
+    } /* end else */
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+    tempi = H5Dget_storage_size(did);
+
+    if (display_data && (tempi > 0)) {
+        switch (H5Tget_class(type)) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_ENUM:
+        case H5T_ARRAY:
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            ctx.indent_level--;
+            dump_indent -= COL;
+            break;
+
+        case H5T_TIME:
+            ctx.indent_level++;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Time data not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+            break;
+
+        case H5T_COMPOUND:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Note: format of compound data not specified -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            ctx.indent_level--;
+            dump_indent -= COL;
+            break;
+
+        case H5T_REFERENCE:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- Note: Region references not supported -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            else {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sDataFromFile>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                xml_print_refs(did, DATASET_DATA);
+
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_VLEN:
+            ctx.indent_level--;
+            dump_indent -= COL;
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Note: format of VL data not specified -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+            dump_indent += COL;
+
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            ctx.indent_level--;
+            dump_indent -= COL;
+            break;
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
+
+        default:
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        }
+    }
+    else {
+        /* no data written */
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sNoData/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sData>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Pclose(dcpl);
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataset>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_enum
+ *
+ * Purpose:     Print the values of an HDF5 ENUM in XML.
+ *              Very similar to regular DDL output.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+xml_print_enum(hid_t type)
+{
+    char              **name = NULL;    /*member names                   */
+    unsigned char      *value = NULL;   /*value array                    */
+    unsigned            nmembs;         /*number of members              */
+    hid_t               super;          /*enum base integer type         */
+    hid_t               native = -1;    /*native integer datatype        */
+    size_t              dst_size;       /*destination value type size    */
+    unsigned            i;              /*miscellaneous counters         */
+    size_t              j;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent/COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    nmembs = (unsigned)H5Tget_nmembers(type);
+    super = H5Tget_super(type);
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "<%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    xml_print_datatype(super,0);
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /*
+     * Determine what datatype to use for the native values.  To simplify
+     * things we entertain three possibilities:
+     *  1. long long -- the largest native signed integer
+     *    2. unsigned long long -- the largest native unsigned integer
+     *    3. raw format
+     */
+    if (H5Tget_size(type) <= sizeof(long long)) {
+        dst_size = sizeof(long long);
+
+        if (H5T_SGN_NONE == H5Tget_sign(type)) {
+            native = H5T_NATIVE_ULLONG;
+        } 
+        else {
+            native = H5T_NATIVE_LLONG;
+        }
+    } 
+    else {
+        dst_size = H5Tget_size(type);
+    }
+
+    /* Get the names and raw values of all members */
+    name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
+    value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
+
+    for (i = 0; i < nmembs; i++) {
+        name[i] = H5Tget_member_name(type, i);
+        H5Tget_member_value(type, i, value + i * H5Tget_size(type));
+    }
+
+    /* Convert values to native datatype */
+    if (native > 0)
+        H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT);
+
+    /* Sort members by increasing value */
+    /*not implemented yet */
+
+    /* Print members */
+    ctx.indent_level++;
+    dump_indent += COL;
+    for (i = 0; i < nmembs; i++) {
+        char *t_name = xml_escape_the_name(name[i]);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sEnumElement>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "%s", t_name);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        HDfree(t_name);
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sEnumElement>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "<%sEnumValue>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        if (native < 0) {
+            h5tools_str_append(&buffer, "0x");
+
+            for (j = 0; j < dst_size; j++)
+                h5tools_str_append(&buffer, "%02x", value[i * dst_size + j]);
+        } 
+        else if (H5T_SGN_NONE == H5Tget_sign(native)) {
+            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "u", *((unsigned long long *)
+                       ((void *) (value + i * dst_size))));
+        } 
+        else {
+            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "d",
+                      *((long long *) ((void *) (value + i * dst_size))));
+        }
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "</%sEnumValue>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+
+    /* Release resources */
+    for (i = 0; i < nmembs; i++)
+        H5free_memory(name[i]);
+
+    HDfree(name);
+    HDfree(value);
+    H5Tclose(super);
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.h b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.h
new file mode 100644
index 0000000..c1d6c62
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dump_xml.h
@@ -0,0 +1,39 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_XML_H__
+#define H5DUMP_XML_H__
+
+extern const char       *xmlnsprefix;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The dump functions of the dump_function_table */
+/* XML format:   same interface, alternative output */
+
+void      xml_dump_group(hid_t, const char *);
+void      xml_dump_named_datatype(hid_t, const char *);
+void      xml_dump_dataset(hid_t, const char *, struct subset_t *);
+void      xml_dump_dataspace(hid_t space);
+void      xml_dump_datatype(hid_t type);
+herr_t    xml_dump_attr(hid_t, const char *, const H5A_info_t *, void *);
+void      xml_dump_data(hid_t, int, struct subset_t *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_XML_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/h5dumpgentest.c b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dumpgentest.c
new file mode 100644
index 0000000..058ea90
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/h5dumpgentest.c
@@ -0,0 +1,10232 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Generate the binary hdf5 files for the h5dump tests.
+ * Usage: just execute the program without any arguments will
+ * generate all the binary hdf5 files in the local directory.
+ *
+ * If you regenerate the test files (e.g., changing some code,
+ * trying it on a new platform, ...), you need to verify the correctness
+ * of the expected output and update the corresponding *.ddl files.
+ */
+#include <limits.h>
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+
+#define FILE1 "tgroup.h5"
+#define FILE2 "tdset.h5"
+#define FILE3 "tattr.h5"
+#define FILE4 "tslink.h5"
+#define FILE4_1 "tsoftlinks.h5"
+#define FILE5 "thlink.h5"
+#define FILE6 "tcompound.h5"
+#define FILE7 "tall.h5"
+#define FILE8 "tdset2.h5"
+#define FILE9 "tcompound2.h5"
+#define FILE10 "tloop.h5"
+#define FILE11 "tloop2.h5"
+#define FILE12 "tmany.h5"
+#define FILE13 "tstr.h5"
+#define FILE14 "tstr2.h5"
+#define FILE15 "tenum.h5"
+#define FILE16 "tobjref.h5"
+#define FILE17 "tdatareg.h5"
+#define FILE18 "tnestedcomp.h5"
+#define FILE19 "topaque.h5"
+#define FILE20 "tbitfields.h5"
+#define FILE21 "tvldtypes1.h5"
+#define FILE22 "tvldtypes2.h5"
+#define FILE23 "tvldtypes3.h5"
+#define FILE24 "tvldtypes4.h5"
+#define FILE25 "tarray1.h5"
+#define FILE25_BIG "tarray1_big.h5"
+#define FILE26 "tarray2.h5"
+#define FILE27 "tarray3.h5"
+#define FILE28 "tarray4.h5"
+#define FILE29 "tarray5.h5"
+#define FILE30 "tarray6.h5"
+#define FILE31 "tarray7.h5"
+#define FILE32 "tempty.h5"
+#define FILE33  "tgrp_comments.h5"
+#define FILE34  "tsplit_file"
+#define FILE35  "tfamily%05d.h5"
+#define FILE36  "tmulti"
+#define FILE37  "tlarge_objname.h5"
+#define FILE38  "tvlstr.h5"
+#define FILE39  "tchar.h5"
+#define FILE40  "tattr2.h5"
+#define FILE41  "tcompound_complex.h5"
+#define FILE42  "tnamed_dtype_attr.h5"
+#define FILE43  "tvldtypes5.h5"
+#define FILE44  "tfilters.h5"
+#define FILE45  "tnullspace.h5"
+#define FILE46  "tfcontents1.h5"
+#define FILE47  "tfcontents2.h5"
+#define FILE48  "tfvalues.h5"
+#define FILE49  "tstr3.h5"
+#define FILE50  "taindices.h5"
+#define FILE51  "tlonglinks.h5"
+#define FILE52  "tldouble.h5"
+#define FILE53  "textlink.h5"
+#define FILE54  "tudlink.h5"
+#define FILE55  "tbinary.h5"
+#define FILE56  "tbigdims.h5"
+#define FILE57  "thyperslab.h5"
+#define FILE58  "tordergr.h5"
+#define FILE59  "torderattr.h5"
+#define FILE60  "tfpformat.h5"
+#define FILE61  "textlinksrc.h5"
+#define FILE62  "textlinktar.h5"
+#define FILE63  "textlinkfar.h5"
+#define FILE64  "tarray8.h5"
+#define FILE65  "tattrreg.h5"
+#define FILE66  "packedbits.h5"
+#define FILE67  "zerodim.h5"
+#define FILE68  "charsets.h5"
+#define FILE69  "tattrintsize.h5"
+#define FILE70  "tcmpdintsize.h5"
+#define FILE71  "tcmpdattrintsize.h5"
+#define FILE72  "tnestedcmpddt.h5"
+#define FILE73  "tscalarintsize.h5"
+#define FILE74  "tscalarattrintsize.h5"
+#define FILE75  "tscalarstring.h5"
+#define FILE76  "tcmpdintarray.h5"
+#define FILE77  "tcmpdints.h5"
+#define FILE78  "tscalarintattrsize.h5"
+#define FILE79  "tintsattrs.h5"
+#define FILE80  "tbitnopaque.h5"
+#define FILE81  "tints4dims.h5"
+#define FILE82  "tcompound_complex2.h5"
+#define FILE83  "tvlenstr_array.h5"
+
+/*-------------------------------------------------------------------------
+ * prototypes
+ *-------------------------------------------------------------------------
+ */
+
+/* utility functions */
+static int
+make_dset(hid_t loc_id, const char *name, hid_t sid, hid_t tid, hid_t dcpl, void *buf);
+static int
+write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
+        hid_t tid, void *buf);
+static int
+write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
+        hid_t tid, void *buf );
+
+/* a filter operation callback function */
+static size_t
+myfilter(unsigned int H5_ATTR_UNUSED flags, size_t H5_ATTR_UNUSED cd_nelmts,
+        const unsigned int H5_ATTR_UNUSED *cd_values, size_t nbytes,
+        size_t H5_ATTR_UNUSED *buf_size, void H5_ATTR_UNUSED **buf);
+
+/* a "set local" callback     */
+static herr_t
+set_local_myfilter(hid_t dcpl_id, hid_t tid, hid_t H5_ATTR_UNUSED sid);
+
+#define MYFILTER_ID 405
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_MYFILTER[1] = {{
+        H5Z_CLASS_T_VERS,
+        MYFILTER_ID,               /* Filter id number      */
+        1, 1,
+        "myfilter",                /* Filter name for debugging */
+        NULL,                /* The "can apply" callback     */
+        set_local_myfilter,  /* The "set local" callback     */
+        myfilter,            /* The actual filter function */
+}};
+
+
+/* A UD link traversal function.  Shouldn't actually be called. */
+static hid_t UD_traverse(H5_ATTR_UNUSED const char * link_name, H5_ATTR_UNUSED hid_t cur_group,
+        H5_ATTR_UNUSED const void * udata, H5_ATTR_UNUSED size_t udata_size, H5_ATTR_UNUSED hid_t lapl_id)
+{
+    return -1;
+}
+
+#define MY_LINKCLASS 187
+
+const H5L_class_t UD_link_class[1] = {{
+        H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
+        (H5L_type_t)MY_LINKCLASS, /* Link type id number            */
+        "UD link class",          /* name for debugging             */
+        NULL,                     /* Creation callback              */
+        NULL,                     /* Move/rename callback           */
+        NULL,                     /* Copy callback                  */
+        UD_traverse,              /* The actual traversal function  */
+        NULL,                     /* Deletion callback              */
+        NULL                      /* Query callback                 */
+}};
+
+
+#define LENSTR  50
+#define LENSTR2  11
+
+#define SPACE2_RANK 2
+#define SPACE2_DIM1 10
+#define SPACE2_DIM2 10
+
+#define SPACE1_RANK 1
+#define SPACE1_DIM1 4
+
+#define DIM1  20
+#define DIM2  10
+#define CDIM1 DIM1/2
+#define CDIM2 DIM2/2
+#define RANK  2
+
+/* Dataspace of 0 dimension size */
+#define SPACE3_RANK 2
+#define SPACE3_DIM1 0
+#define SPACE3_DIM2 0
+
+/* Element selection information */
+#define POINT1_NPOINTS 10
+
+typedef enum{
+    RED,
+    GREEN,
+    BLUE,
+    WHITE,
+    BLACK
+} enumtype;
+
+/* Compound datatype */
+typedef struct s1_t {
+        unsigned int a;
+        unsigned int b;
+        float c;
+} s1_t;
+
+
+/* 1-D array datatype */
+#define ARRAY1_RANK 1
+#define ARRAY1_DIM1 4
+
+/* 3-D array datatype */
+#define ARRAY2_RANK 3
+#define ARRAY2_DIM1 3
+#define ARRAY2_DIM2 4
+#define ARRAY2_DIM3 5
+
+/* 2-D array datatype */
+#define ARRAY3_RANK 2
+#define ARRAY3_DIM1 6
+#define ARRAY3_DIM2 3
+
+/* "File 41" macros */
+/* Name of dataset to create in datafile                              */
+#define F41_DATASETNAME   "CompoundComplex"
+/* Dataset dimensions                                                 */
+#define F41_LENGTH         6
+#define F41_RANK           1
+#define F41_ARRAY_RANK     1
+#define F41_ARRAY_RANKd    2
+#define F41_DIMb           4
+#define F41_ARRAY_DIMc     6
+#define F41_ARRAY_DIMd1    5
+#define F41_ARRAY_DIMd2    6
+#define F41_ARRAY_DIMf     10
+
+/* "File 42" macros */
+/* Name of dataset to create in datafile                              */
+#define F42_DSETNAME "Dataset"
+#define F42_TYPENAME "Datatype"
+#define F42_ATTRNAME "Attribute"
+#define F42_LINKNAME "Link_to_Datatype"
+
+/* "File 43" macros */
+/* Name of dataset to create in datafile                              */
+#define F43_DSETNAME "Dataset"
+
+/* "File 51" macros */
+#define F51_MAX_NAME_LEN    ((64*1024)+1024)
+
+/* "File 64" macros */
+#define F64_DATASET         "DS1"
+#define F64_DIM0            1
+#define F64_ARRAY_BUF_LEN   (4*1024)
+#define F64_DIM1            (F64_ARRAY_BUF_LEN / sizeof(int) + 1)
+
+/* "FILE66" macros and for FILE69 */
+#define F66_XDIM        8
+#define F66_DATASETU08        "DU08BITS"
+#define F66_DATASETS08        "DS08BITS"
+#define F66_YDIM8        8
+#define F66_DATASETU16       "DU16BITS"
+#define F66_DATASETS16       "DS16BITS"
+#define F66_YDIM16        16
+#define F66_DATASETU32       "DU32BITS"
+#define F66_DATASETS32       "DS32BITS"
+#define F66_YDIM32        32
+#define F66_DATASETU64       "DU64BITS"
+#define F66_DATASETS64       "DS64BITS"
+#define F66_YDIM64      64
+#define F66_DUMMYDBL        "DummyDBL"
+
+/* "FILE70" macros and for FILE71 */
+/* Name of dataset to create in datafile   */
+#define F70_DATASETNAME   "CompoundIntSize"
+#define F70_LENGTH      4
+#define F70_RANK        1
+#define F70_ARRAY_RANK  2
+#define F70_XDIM        8
+#define F70_DATASETU08        "DU08BITS"
+#define F70_DATASETS08        "DS08BITS"
+#define F70_YDIM8       8
+#define F70_DATASETU16       "DU16BITS"
+#define F70_DATASETS16       "DS16BITS"
+#define F70_YDIM16      16
+#define F70_DATASETU32       "DU32BITS"
+#define F70_DATASETS32       "DS32BITS"
+#define F70_YDIM32      32
+#define F70_DATASETU64       "DU64BITS"
+#define F70_DATASETS64       "DS64BITS"
+#define F70_YDIM64      64
+#define F70_DUMMYDBL        "DummyDBL"
+/* Name of dataset to create in datafile   */
+#define F71_DATASETNAME   "CompoundAttrIntSize"
+
+/* "FILE73" macros and for FILE69 and FILE78 */
+#define F73_ARRAY_RANK  2
+#define F73_XDIM        8
+#define F73_DATASETU08        "DU08BITS"
+#define F73_DATASETS08        "DS08BITS"
+#define F73_YDIM8       8
+#define F73_DATASETU16       "DU16BITS"
+#define F73_DATASETS16       "DS16BITS"
+#define F73_YDIM16      16
+#define F73_DATASETU32       "DU32BITS"
+#define F73_DATASETS32       "DS32BITS"
+#define F73_YDIM32      32
+#define F73_DATASETU64       "DU64BITS"
+#define F73_DATASETS64       "DS64BITS"
+#define F73_YDIM64      64
+#define F73_DUMMYDBL        "DummyDBL"
+
+/* "FILE76 and FILE77 */
+/* Name of dataset to create in datafile   */
+#define F76_DATASETNAME   "CompoundIntArray"
+#define F76_LENGTH      4
+#define F76_RANK        1
+#define F76_ARRAY_RANK  1
+#define F76_DATASETU08        "DU08BITS"
+#define F76_DATASETS08        "DS08BITS"
+#define F76_DIM8       8
+#define F76_DATASETU16       "DU16BITS"
+#define F76_DATASETS16       "DS16BITS"
+#define F76_DIM16      16
+#define F76_DATASETU32       "DU32BITS"
+#define F76_DATASETS32       "DS32BITS"
+#define F76_DIM32      32
+#define F76_DATASETU64       "DU64BITS"
+#define F76_DATASETS64       "DS64BITS"
+#define F76_DIM64      64
+#define F76_DUMMYDBL        "DummyDBL"
+/* Name of dataset to create in datafile   */
+#define F77_DATASETNAME1   "CompoundInts"
+#define F77_DATASETNAME2   "CompoundRInts"
+#define F77_LENGTH      64
+
+#define F80_DIM32      32
+
+#define F81_DATASETNAME   "FourDimInts"
+#define F81_RANK        4
+#define F81_WDIM        10
+#define F81_XDIM        8
+#define F81_YDIM        6
+#define F81_ZDIM        4
+
+/* "File 82" macros */
+/* Name of dataset to create in datafile                              */
+#define F82_DATASETNAME    "CompoundComplex1D"
+#define F82_DATASETNAME2   "CompoundComplex2D"
+#define F82_DATASETNAME3   "CompoundComplex3D"
+#define F82_DATASETNAME4   "CompoundComplex4D"
+/* Dataset dimensions                                                 */
+#define F82_DIM32          32
+#define F82_RANK           1
+#define F82_RANK2          2
+#define F82_RANK3          3
+#define F82_RANK4          4
+
+/* "File 83" macros */
+/* Name of dataset to create in datafile                              */
+#define F83_DATASETNAME    "ScalarArrayOfVlenStr"
+#define F83_DATASETNAME2   "CompoundArrayOfVlenStr"
+/* Dataset dimensions                                                 */
+#define F83_DIM            5
+#define F83_RANK           1
+#define F83_ARRAYDIM       3
+
+static void
+gent_group(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* / */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g1 */
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2 */
+    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g3 */
+    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2/g2.1 */
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+static void
+gent_dataset(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    int dset1[10][20];
+    double dset2[30][20];
+    int i, j;
+
+    fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* dset1 */
+    dims[0] = 10; dims[1] = 20;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 20; j++)
+            dset1[i][j] = j + i;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2 */
+    dims[0] = 30; dims[1] = 20;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 30; i++)
+        for(j = 0; j < 20; j++)
+            dset2[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+static void
+gent_dataset2(void)
+{
+    hid_t fid, dataset, space, create_plist;
+    hsize_t dims[2];
+    hsize_t maxdims[2];
+    int dset1[10][20];
+    double dset2[30][10];
+    int i, j;
+
+    fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+    dims[0] = 5; dims[1] = 5;
+    H5Pset_chunk(create_plist, 2, dims);
+
+    /* dset1 */
+    dims[0] = 10; dims[1] = 20;
+    maxdims[0] = H5S_UNLIMITED; maxdims[1] = 20;
+    space = H5Screate_simple(2, dims,  maxdims);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 20; j++)
+            dset1[i][j] = j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2 */
+    dims[0] = 30; dims[1] = 10;
+    maxdims[0] = 30; maxdims[1] = H5S_UNLIMITED;
+    space = H5Screate_simple(2, dims, maxdims);
+    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    for(i = 0; i < 30; i++)
+        for(j = 0; j < 10; j++)
+            dset2[i][j] = j;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Pclose(create_plist);
+    H5Fclose(fid);
+}
+
+static void
+gent_attribute(void)
+{
+    hid_t fid, root, space, attr, type;
+    hsize_t dims[2];
+    char buf[60];
+    int i, data[10];
+    double d[10];
+    char string[]= "string attribute";
+    int point = 100;
+
+    fid = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* attribute 1 */
+    dims[0] = 24;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "/attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "attribute of root group");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 2 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++) data[i] = i+1;
+
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 3 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "attr3", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++) d[i] = 0.1F * (float)i;
+
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 4 */
+    space = H5Screate(H5S_SCALAR);
+    attr = H5Acreate2(root, "attr4", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 5 */
+    space = H5Screate(H5S_SCALAR);
+    type = H5Tcopy(H5T_C_S1);
+    H5Tset_size(type, 17);
+    attr = H5Acreate2(root, "attr5", type, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, type, string);
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+static void gent_softlink(void)
+{
+    hid_t fid, root;
+
+    fid = H5Fcreate(FILE4, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+    H5Lcreate_soft("somevalue", root, "slink1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_soft("linkvalue", root, "slink2", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_softlink2
+ *
+ * Purpose: Create soft links to various objects.
+ * Return:
+ *    SUCCEED
+ *    FAIL
+ * Programmer: Jonathan Kim
+ * Date: May 26, 2010
+ *-------------------------------------------------------------------------*/
+#define NX 4
+#define NY 2
+static int gent_softlink2(void)
+{
+    hid_t       fileid1 = -1;
+    hid_t       gid1 = -1, gid2 = -1;
+    hid_t       datatype = -1;
+    hid_t       dset1 = -1, dset2 = -1;
+    hid_t       dataspace = -1;
+    hsize_t     dimsf[2];              /* dataset dimensions */
+    int data1[NX][NY] = {{0,0},{1,1},{2,2},{3,3}};
+    int data2[NX][NY] = {{0,0},{0,1},{0,2},{3,3}};
+    herr_t      status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+     * FILE
+     *------------------------------------------------------------------------*/
+    /* Create a new file */
+    fileid1 = H5Fcreate(FILE4_1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fileid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Groups
+     *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fileid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2 = H5Gcreate2(fileid1, "group_empty", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Named datatype
+     *------------------------------------------------------------------------*/
+    datatype = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(fileid1, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Datasets
+     *------------------------------------------------------------------------*/
+    /*
+     * Describe the size of the array and create the data space for fixed
+     * size dataset.
+     */
+    dimsf[0] = NX;
+    dimsf[1] = NY;
+    dataspace = H5Screate_simple(2, dimsf, NULL);
+
+    /*
+     * We will store little endian INT numbers.
+     */
+
+    /*---------------
+     * dset1
+     */
+    /* Create a new dataset as sample object */
+    dset1 = H5Dcreate2(fileid1, "/dset1", H5T_NATIVE_INT, dataspace,
+            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (dset1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*---------------
+     * dset2
+     */
+    /* Create a new dataset as sample object */
+    dset2 = H5Dcreate2(fileid1, "/dset2", H5T_NATIVE_INT, dataspace,
+            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (dset2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Soft links
+     *------------------------------------------------------------------------*/
+    /*
+     * create various soft links under  '/' root
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft("/dset1", fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to data type */
+    status = H5Lcreate_soft("/dtype", fileid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to group1 */
+    status = H5Lcreate_soft("/group1", fileid1, "soft_group1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to empty group */
+    status = H5Lcreate_soft("/group_empty", fileid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* dangling link */
+    status = H5Lcreate_soft("not_yet", fileid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------
+     * create various soft links under a group
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft("/dset1", gid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to dset2 */
+    status = H5Lcreate_soft("/dset2", gid1, "soft_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to data type */
+    status = H5Lcreate_soft("/dtype", gid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to empty group */
+    status = H5Lcreate_soft("/group_empty", gid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* dangling link  */
+    status = H5Lcreate_soft("not_yet", gid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    out:
+    /*
+     * Close/release resources.
+     */
+    if(dataspace >= 0 && H5Sclose(dataspace) < 0) {
+        fprintf(stderr, "Error: %s> H5Sclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(gid1 >= 0 && H5Gclose(gid1) < 0) {
+        fprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(gid2 >= 0 && H5Gclose(gid2) < 0) {
+        fprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(datatype >= 0 && H5Tclose(datatype) < 0) {
+        fprintf(stderr, "Error: %s> H5Tclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(dset1 >= 0 && H5Dclose(dset1) < 0) {
+        fprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(dset2 >= 0 && H5Dclose(dset2) < 0) {
+        fprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(fileid1 >= 0 && H5Fclose(fileid1) < 0) {
+        fprintf(stderr, "Error: %s> H5Fclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+
+    return status;
+}
+
+/*
+            /
+
+       /    |   \      the dataset is hardlinked to three names
+                       /dset1, /g1/dset2, and /g1/g1.1/dset3
+     dset1 g1    g2
+                       /g2 and /g1/g1.1 are hardlinked to the same object.
+          /  \
+       dset2 g1.1
+              |
+             dset3
+ */
+
+static void gent_hardlink(void)
+{
+    hid_t fid, group, dataset, space;
+    hsize_t dim = 5;
+    int i, dset[5];
+
+    fid = H5Fcreate(FILE5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1, &dim, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 5; i++) dset[i] = i;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g1", H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create a link to the root group */
+    H5Lcreate_hard(fid, "/", H5L_SAME_LOC, "g3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Fclose(fid);
+}
+
+static void gent_extlink(void)
+{
+    hid_t fid;
+
+    /* This external link will dangle, but that's okay */
+    fid = H5Fcreate(FILE53, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external("filename", "objname", fid, "extlink1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external("anotherfile", "anotherobj", fid, "extlink2", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+static void gent_udlink(void)
+{
+    hid_t fid;
+    char buf[4];
+
+    H5Lregister(UD_link_class);
+
+    /* This ud link will dangle, but that's okay */
+    fid = H5Fcreate(FILE54, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_ud(fid, "udlink1", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+    strcpy(buf, "foo");
+    H5Lcreate_ud(fid, "udlink2", (H5L_type_t)MY_LINKCLASS, buf, 4, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+
+/*
+               /
+     /     |       \     \
+   dset1  group1  type1 type2
+           |
+          dset2
+
+ */
+static void gent_compound_dt(void) {       /* test compound data type */
+    hid_t fid, group, dataset, space, space3, type, type2;
+    hid_t array_dt;
+    typedef struct {
+            int a;
+            float b;
+            double c;
+    } dset1_t;
+    dset1_t dset1[5];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset2_t;
+    dset2_t dset2[5];
+
+    typedef struct {
+            int a[4];
+            float b[5][6];
+    } dset3_t;
+    dset3_t dset3[3][6];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset4_t;
+    dset4_t dset4[5];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset5_t;
+    dset5_t dset5[5];
+
+    int i, j, k, l;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim = 5;
+    hsize_t dset3_dim[2];
+
+
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+        dset1[i].c = (float)(1.0F/(float)(i+1));
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i+ (float)i*0.1F);
+
+        dset4[i].a = i;
+        dset4[i].b = (float)(i+3);
+
+        dset5[i].a = i;
+        dset5[i].b = (float)((float)i*0.1F);
+    }
+
+
+    fid = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1, &sdim, NULL);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset1[0]));
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
+    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
+    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Tclose(type2);
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+    /* shared data type 1 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+    H5Tclose(type2);
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+
+    /* shared data type 2 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 4;
+
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
+    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, ndims, dim);
+    H5Tinsert(type2, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
+    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, dim);
+    H5Tinsert(type2, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+
+    dset3_dim[0] = 3;  dset3_dim[1] = 6;
+    space3 = H5Screate_simple(2, dset3_dim, NULL);
+    dataset = H5Dcreate2(group, "dset3", type, space3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < (int)dset3_dim[0]; i++)
+        for(j = 0; j < (int)dset3_dim[1]; j++) {
+            for(k = 0; k < 4; k++)
+                dset3[i][j].a[k] = k + j + i;
+            for(k = 0; k < 5; k++)
+                for(l = 0; l < 6; l++)
+                    dset3[i][j].b[k][l] = (float)((k + 1) + l + j + i);
+        }
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+    H5Sclose(space3);
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+
+    /* shared data type 3 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
+    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    /* unamed data type */
+    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
+    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
+
+    H5Ldelete(group, "type4", H5P_DEFAULT);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Sclose(space);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+/*
+               /
+     /     |       \     \
+   dset1  group1  type1 type2
+           |
+          dset2
+
+ */
+static void gent_compound_dt2(void) {       /* test compound data type */
+    hid_t fid, group, dataset, space, type, create_plist, type2;
+    hid_t array_dt;
+
+    typedef struct {
+            int a;
+            float b;
+            double c;
+    } dset1_t;
+    dset1_t dset1[10];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset2_t;
+    dset2_t dset2[10];
+
+    typedef struct {
+            int a[4];
+            float b[5][6];
+    } dset3_t;
+
+    typedef struct {
+            int a;
+            float b;
+    } dset4_t;
+    dset4_t dset4[10];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset5_t;
+    dset5_t dset5[10];
+
+    int i;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim, maxdim;
+
+    sdim = 10;
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+        dset1[i].c = (float)(1.0F / (float)(i+ 1));
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i + (float)i * 0.1F);
+
+        dset4[i].a = i;
+        dset4[i].b = (float)((float)i * 1.0F);
+
+        dset5[i].a = i;
+        dset5[i].b = (float)((float)i * 1.0F);
+    }
+
+    fid = H5Fcreate(FILE9, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
+    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
+
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    sdim = 6;
+    maxdim = 10;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    /* shared data type 1 */
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+
+
+    /* shared data type 2 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 4;
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
+    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
+    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(type);
+
+    /* shared data type 3 */
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    /* unamed data type */
+    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
+
+    H5Ldelete(group, "type4", H5P_DEFAULT);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Sclose(space);
+    H5Gclose(group);
+    H5Pclose(create_plist);
+
+    H5Fclose(fid);
+
+}
+
+
+/*
+
+/ : g1  g2  attr1  attr2
+g1 : g1.1  g1.2
+g1.1 : dset1.1.1(attr1, attr2)   dset1.1.2
+g1.2 : g1.2.1 extlink
+g1.2.1 : slink
+g2 : dset2.1  dset2.2 udlink
+
+ */
+
+static void gent_all(void)
+{
+    hid_t fid, group, attr, dataset, space;
+    hsize_t dims[2];
+    int data[2][2], dset1[10][10], dset2[20];
+    char buf[60];
+    int i, j;
+    float dset2_1[10], dset2_2[3][5];
+
+    fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create groups */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* root attributes */
+    group = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "abcdefghi");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    dims[0] = 2; dims[1] = 2;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
+
+    /* dset1.1.1 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset1[i][j] = j * i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+
+    /* attributes of dset1.1.1 */
+    dims[0] = 27;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "1st attribute of dset1.1.1");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    dims[0] = 27;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "2nd attribute of dset1.1.1");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Dclose(dataset);
+
+    /* dset1.1.2 */
+    dims[0] = 20;
+    space = H5Screate_simple(1, dims, NULL);
+    dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 20; i++)
+        dset2[i] = i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Gclose(group);
+
+    /* external link */
+    H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* soft link */
+    group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
+    H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
+
+    /* dset2.1 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        dset2_1[i] = (float)((float)i * 0.1F + 1);
+    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2.2 */
+    dims[0] = 3; dims[1] = 5;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 5; j++)
+            dset2_2[i][j] = (float)((float)(i + 1) * (float)j * 0.1F);
+    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Gclose(group);
+
+    /* user-defined link */
+    H5Lregister(UD_link_class);
+    H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+/*
+            o
+          /___\
+      g1 o/   \o g2
+          \___/
+
+
+o - group objects
+
+ */
+
+static void gent_loop(void) {
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE10, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(fid, "/g1", H5L_SAME_LOC, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+static void gent_loop2(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE11, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create group object g1 and implcit path from root object */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create group object g2 and implcit path from root object */
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create path from object at /g1 to object at /g2 and name it g1.1 */
+    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create path from object at /g2 to object at /g1 and name it g2.1 */
+    H5Lcreate_soft("/g1", fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+/*
+                  /
+     |       |       |   \    \    \     \      \
+     g1     g2      g3   g4   g5    g6    g7     g8
+    / \      |       |    \     \    \      \      \
+ g1.1 g1.2 slink2  link3 dset2 slink4 dset3 slink5   elink
+  |    |    (g1)  (dset2)      (dset3)      (elink)  udlink
+ dset1 link1                                slink6
+      (dset1)                               (udlink)
+ */
+
+static void
+gent_many(void)
+{
+    hid_t fid, group, attr, dataset, space, space2, type, create_plist, type2;
+    hid_t array_dt;
+    hsize_t dims[2];
+    int data[2][2], dset2[10][10], dset3[10][10];
+    double d[10];
+
+    char buf[60];
+    int i, j;
+    int i0, i1, i2, i3;
+    hsize_t sdim, maxdim;
+
+    typedef struct { /* compound type has members with rank > 1 */
+            int a[2][2][2][2]; /* arrays are 2x2x2x2    */
+            double b[2][2][2][2];
+            double c[2][2][2][2];
+    } dset1_t;
+    dset1_t dset1[6];
+
+    hsize_t dim[4];
+    herr_t ret;
+
+    fid = H5Fcreate(FILE12, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    dim[0] = dim[1] = dim[2] = dim[3] = 2;
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, 4, dim);
+    H5Tinsert(type, "a_array", HOFFSET(dset1_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
+    H5Tinsert(type, "b_array", HOFFSET(dset1_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
+    H5Tinsert(type, "c_array", HOFFSET(dset1_t, c), array_dt);
+    H5Tclose(array_dt);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 4, dim);
+    H5Tinsert(type2, "a_array", HOFFSET(dset1_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
+    H5Tinsert(type2, "b_array", HOFFSET(dset1_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
+    H5Tinsert(type2, "c_array", HOFFSET(dset1_t, c), array_dt);
+    H5Tclose(array_dt);
+
+
+    /* dset1 */
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+    space = H5Screate_simple(1, &sdim, &maxdim);
+    dataset = H5Dcreate2(group, "dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    /* add attributes to dset1 */
+    dims[0] = 10;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "abcdefghi");
+    H5Awrite(attr, H5T_NATIVE_CHAR, buf);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    dims[0] = 2; dims[1] = 2;
+    space2 = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(dataset, "attr2", H5T_STD_I32BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    dims[0] = 10;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr3", H5T_IEEE_F64BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        d[i] = 0.1F * (float)i;
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    for(j=0; j<(int)sdim; j++) {
+        for(i3 = 0; i3 < 2; i3++) {
+            for(i2 = 0; i2 < 2; i2++) {
+                for(i1 = 0; i1 < 2; i1++) {
+                    for(i0 = 0; i0 < 2; i0++) {
+                        dset1[j].a[i3][i2][i1][i0] = i0 + j;
+                        dset1[j].b[i3][i2][i1][i0] = (double)(i0 + j);
+                        dset1[j].c[i3][i2][i1][i0] = (double)((hsize_t)i0 + (hsize_t)j + sdim);
+                    }
+                }
+            }
+        }
+    }
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Dclose(dataset);
+    H5Sclose(space);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g1/g1.1/dset1", H5L_SAME_LOC, "link1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_soft("/g1", group, "slink2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* dset2 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+
+    dataset = H5Dcreate2(group, "dset2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset2[i][j] = j;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Dclose(dataset);
+
+    H5Sclose(space);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g3", H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g4/dset2", H5L_SAME_LOC, "link3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* dset3 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+
+    dataset = H5Dcreate2(group, "dset3", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset3[i][j] = i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+
+    H5Dclose(dataset);
+
+    H5Sclose(space);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g5", H5P_DEFAULT);
+    H5Lcreate_soft("/g6/dset3", group, "slink4", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    H5Pclose(create_plist);
+
+    group = H5Gcreate2(fid, "/g7", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g8", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* Create dangling external and UD links */
+    H5Lcreate_external("somefile", "somepath", fid, "/g8/elink", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lregister(UD_link_class);
+    H5Lcreate_ud(fid, "/g8/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create links to external and UD links */
+    ret = H5Lcreate_soft("/g8/elink", fid, "/g7/slink5", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Lcreate_soft("/g8/udlink", fid, "/g7/slink6", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    H5Fclose(fid);
+}
+
+static hid_t mkstr(int size, H5T_str_t pad) {
+    hid_t type;
+
+    if((type=H5Tcopy(H5T_C_S1)) < 0) return -1;
+    if(H5Tset_size(type, (size_t)size) < 0) return -1;
+    if(H5Tset_strpad(type, pad) < 0) return -1;
+
+    return type;
+}
+
+static void gent_str(void) {
+    hid_t fid, dataset, space, f_type, m_type, str_type, f_type2;
+    hid_t array_dt;
+
+    hsize_t dims1[] = { 3, 4};
+    char string1[12][3] = {"s1","s2","s3","s4","s5","s6","s7","s8","s9",
+            "s0","s1","s2"};
+
+    hsize_t dims2[]={20};
+    char string2[20][10] = {"ab cd ef1", "ab cd ef2", "ab cd ef3", "ab cd ef4",
+            "ab cd ef5", "ab cd ef6", "ab cd ef7", "ab cd ef8",
+            "ab cd ef9", "ab cd ef0", "ab cd ef1", "ab cd ef2",
+            "ab cd ef3", "ab cd ef4", "ab cd ef5", "ab cd ef6",
+            "ab cd ef7", "ab cd ef8", "ab cd ef9", "ab cd ef0"};
+
+    hsize_t dims3[] = { 27};
+    char string3[27][6] = {"abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6", "abcd7",
+            "abcd8", "abcd9", "abcd0", "abcd1",
+            "abcd2", "abcd3", "abcd4", "abcd5",
+            "abcd6", "abcd7", "abcd8", "abcd9",
+            "abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6"};
+
+    int i, j, k, l;
+
+    hsize_t dims4[] = { 3 };
+    char string4[3][21] = { "s1234567890123456789", "s1234567890123456789",
+            "s1234567890123456789"};
+
+    hsize_t dims5[] = { 3, 6};
+    typedef struct {
+            int a[8][10];
+            char s[12][33];
+    } compound_t;
+    compound_t comp1[3][6];
+    hsize_t mdims[2];
+
+    fid = H5Fcreate(FILE13, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* string 1 : nullterm string */
+    space = H5Screate_simple(2, dims1, NULL);
+    f_type = mkstr(5, H5T_STR_NULLTERM);
+    m_type = mkstr(3, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string1);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 2 : space pad string */
+    space = H5Screate_simple(1, dims2, NULL);
+    f_type = mkstr(11, H5T_STR_SPACEPAD);
+    m_type = mkstr(10, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string2", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string2);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 3 : null pad string */
+    space = H5Screate_simple(1, dims3, NULL);
+    f_type = mkstr(8, H5T_STR_NULLPAD);
+    m_type = mkstr(6, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string3", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string3);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 4 : space pad long string */
+    space = H5Screate_simple(1, dims4, NULL);
+    f_type = mkstr(168, H5T_STR_SPACEPAD);
+    m_type = mkstr(21, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string4", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string4);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* compound data */
+    space = H5Screate_simple(2, dims5, NULL);
+    f_type = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
+    f_type2 = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
+
+    mdims[0] = 8; mdims[1] = 10;
+
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, 2, mdims);
+    H5Tinsert(f_type, "int_array", HOFFSET(compound_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 2, mdims);
+    H5Tinsert(f_type2, "int_array", HOFFSET(compound_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    mdims[0] = 3; mdims[1] = 4;
+
+    str_type = mkstr(32, H5T_STR_SPACEPAD);
+    array_dt = H5Tarray_create2(str_type, 2, mdims);
+    H5Tinsert(f_type, "string", HOFFSET(compound_t, s), array_dt);
+    H5Tclose(array_dt);
+    H5Tclose(str_type);
+
+    str_type = mkstr(33, H5T_STR_NULLTERM);
+    array_dt = H5Tarray_create2(str_type, 2, mdims);
+    H5Tinsert(f_type2, "string", HOFFSET(compound_t, s), array_dt);
+    H5Tclose(array_dt);
+    H5Tclose(str_type);
+
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 6; j++) {
+            for(k = 0 ; k < 8; k++)
+                for(l = 0; l < 10; l++)
+                    comp1[i][j].a[k][l] = (l + j + k) * (l + j + k);
+            for(k = 0 ; k < 12; k++)
+                strcpy(comp1[i][j].s[k], "abcdefgh12345678abcdefgh12345678");
+        }
+
+    dataset = H5Dcreate2(fid, "/comp1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, f_type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, comp1);
+
+    H5Tclose(f_type);
+    H5Tclose(f_type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Fclose(fid);
+}
+
+/*
+                      /
+       /     /     |    \    \     \
+     g1     g2    g3    g4    g5    g6
+     |       |     |     |     \     \
+  string1       string3       string5
+         string2       string4       string6
+ */
+
+static void gent_str2(void)
+{
+    hid_t fid, group, attr, dataset, space, space2, mem_space, hyper_space;
+    hid_t fxdlenstr, fxdlenstr2, memtype;
+    hsize_t dims[1], size[1], stride[1], count[1], block[1];
+    hsize_t start[1];
+
+
+    int i;
+    char buf[LENSTR+10];
+    char buf2[3*LENSTR2];
+    hsize_t sdim;
+
+    fid = H5Fcreate(FILE14, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_NULLTERM);
+
+    memtype = H5Tcopy(H5T_C_S1);
+    H5Tset_size(memtype, LENSTR);
+    H5Tset_cset(memtype, H5T_CSET_ASCII);
+    H5Tset_strpad(memtype, H5T_STR_NULLTERM);
+
+    sdim = 10;
+    size[0] = sdim;
+    space = H5Screate_simple(1, size, NULL);
+    size[0] = 1;
+    mem_space = H5Screate_simple(1,size,NULL);
+    hyper_space = H5Scopy(space);
+
+    /* dset1 */
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset1", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* add attributes to dset1 */
+
+    fxdlenstr2 = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr2, LENSTR2);
+    H5Tset_cset(fxdlenstr2, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr2, H5T_STR_NULLTERM);
+
+    dims[0] = 3;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", fxdlenstr2, space2, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(&(buf2[0*LENSTR2]), "0123456789");
+    sprintf(&(buf2[1*LENSTR2]), "abcdefghij");
+    sprintf(&(buf2[2*LENSTR2]), "ABCDEFGHIJ");
+    H5Awrite(attr, fxdlenstr2, buf2);
+    H5Sclose(space2);
+    H5Tclose(fxdlenstr2);
+    H5Aclose(attr);
+
+    stride[0]=1;
+    count[0]=1;
+    block[0]=1;
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset2", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    H5Tclose(fxdlenstr);
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_NULLPAD);
+
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset3", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0;(hsize_t) i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset4", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    H5Tclose(fxdlenstr);
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_SPACEPAD);
+
+    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset5", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of", i);
+        H5Tset_size(memtype, HDstrlen(buf) + 1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset6", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf) + 1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+
+    H5Dclose(dataset);
+    H5Gclose(group);
+    H5Tclose(fxdlenstr);
+    H5Tclose(memtype);
+    H5Sclose(mem_space);
+    H5Sclose(hyper_space);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+static void gent_enum(void)
+{
+    /*some code is taken from enum.c in the test dir */
+    hid_t file, type, space, dset;
+    int val;
+    enumtype data[] = {RED,   GREEN, BLUE,  GREEN, WHITE,
+            WHITE, BLACK, GREEN, BLUE,  RED,
+            RED,   BLUE,  GREEN, BLACK, WHITE,
+            RED,   WHITE, GREEN, GREEN, BLUE};
+    hsize_t size[1] = {NELMTS(data)};
+
+    file = H5Fcreate(FILE15,H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Try to test names with special characters */
+    type = H5Tcreate(H5T_ENUM, sizeof(enumtype));
+    H5Tenum_insert(type, "RED",   (val = 0, &val));
+    H5Tenum_insert(type, "GREEN\ngreen", (val = 1, &val));
+    H5Tenum_insert(type, "BLUE blue",  (val = 2, &val));
+    H5Tenum_insert(type, "WHITE \"white\"", (val = 3, &val));
+    H5Tenum_insert(type, "BLACK \'black\'", (val = 4, &val));
+    H5Tcommit2(file, "enum normal", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1,size,NULL);
+    dset = H5Dcreate2(file,"table",type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dset, type, space, space, H5P_DEFAULT, data);
+
+    H5Dclose(dset);
+    H5Sclose(space);
+    H5Fclose(file);
+}
+
+static void gent_objref(void)
+{
+    /*some code is taken from enum.c in the test dir */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+
+    hid_t  group;      /* Group ID             */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    hobj_ref_t *wbuf,      /* buffer to write to disk */
+    *rbuf,       /* buffer read from disk */
+    *tbuf;       /* temp. buffer read from disk */
+    uint32_t   *tu32;      /* Temporary pointer to uint32 data */
+    int        i;          /* counting variables */
+    const char *write_comment = "Foo!"; /* Comments for group */
+
+    /* Allocate write & read buffers */
+    wbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+    rbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+    tbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE16, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a group */
+    group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Set group's comment */
+    H5Oset_comment(group, write_comment);
+
+    /* Create a dataset (inside Group1) */
+    dataset = H5Dcreate2(group, "Dataset1", H5T_STD_U32BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu32 = (uint32_t *)((void*)wbuf), i = 0; i < SPACE1_DIM1; i++)
+        *tu32++ = (uint32_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Create another dataset (inside Group1) */
+    dataset = H5Dcreate2(group, "Dataset2", H5T_STD_U8BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+
+    /* Insert fields */
+    H5Tinsert(tid1, "a", HOFFSET(s1_t,a), H5T_STD_I32BE);
+
+    H5Tinsert(tid1, "b", HOFFSET(s1_t,b), H5T_IEEE_F32BE);
+
+    H5Tinsert(tid1, "c", HOFFSET(s1_t,c), H5T_IEEE_F32BE);
+
+    /* Save datatype for later */
+    H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Close datatype */
+    H5Tclose(tid1);
+
+    /* Close group */
+    H5Gclose(group);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create reference to dataset */
+    H5Rcreate(&wbuf[0], fid1, "/Group1/Dataset1", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to dataset */
+    H5Rcreate(&wbuf[1], fid1, "/Group1/Dataset2", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to group */
+    H5Rcreate(&wbuf[2], fid1, "/Group1", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to named datatype */
+    H5Rcreate(&wbuf[3], fid1, "/Group1/Datatype1", H5R_OBJECT, (hid_t)-1);
+
+    /* Write selection to disk */
+    H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+
+    /* Close disk dataspace */
+    H5Sclose(sid1);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(tbuf);
+}
+
+static void gent_datareg(void)
+{
+    /*some code is taken from enum.c in the test dir */
+
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dset1, /* Dataset ID   */
+    dset2;      /* Dereferenced dataset ID */
+    hid_t  sid1,       /* Dataspace ID #1  */
+    sid2;       /* Dataspace ID #2  */
+    hsize_t  dims1[] = {SPACE1_DIM1},
+            dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
+    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
+    hdset_reg_ref_t      *wbuf,      /* buffer to write to disk */
+    *rbuf;       /* buffer read from disk */
+    uint8_t    *dwbuf,      /* Buffer for writing numeric data to disk */
+    *drbuf;      /* Buffer for reading numeric data from disk */
+    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
+    int        i;          /* counting variables */
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
+    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
+    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE17, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
+        *tu8++ = (uint8_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
+
+    /* Close Dataset */
+    H5Dclose(dset2);
+
+    /* Create dataspace for the reference dataset */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a dataset */
+    dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create references */
+
+    /* Select 6x6 hyperslab for first reference */
+    start[0] = 2; start[1] = 2;
+    stride[0] = 1; stride[1] = 1;
+    count[0] = 6; count[1] = 6;
+    block[0] = 1; block[1] = 1;
+    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store first dataset region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
+
+    /* Select sequence of ten points for second reference */
+    coord1[0][0]=6; coord1[0][1]=9;
+    coord1[1][0]=2; coord1[1][1]=2;
+    coord1[2][0]=8; coord1[2][1]=4;
+    coord1[3][0]=1; coord1[3][1]=6;
+    coord1[4][0]=2; coord1[4][1]=8;
+    coord1[5][0]=3; coord1[5][1]=2;
+    coord1[6][0]=0; coord1[6][1]=4;
+    coord1[7][0]=9; coord1[7][1]=0;
+    coord1[8][0]=7; coord1[8][1]=1;
+    coord1[9][0]=3; coord1[9][1]=3;
+    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store second dataset region */
+    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
+
+    /* Write selection to disk */
+    H5Dwrite(dset1,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+
+    /* Close disk dataspace */
+    H5Sclose(sid1);
+
+    /* Close Dataset */
+    H5Dclose(dset1);
+
+    /* Close uint8 dataset dataspace */
+    H5Sclose(sid2);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(dwbuf);
+    HDfree(drbuf);
+}
+
+static void gent_attrreg(void)
+{
+    /*some code is taken from enum.c in the test dir */
+
+    hid_t  fid1;        /* HDF5 File IDs  */
+    hid_t  dset1;       /* Dataset ID   */
+    hid_t  dset2;       /* Dereferenced dataset ID */
+    hid_t  sid1;        /* Dataspace ID #1  */
+    hid_t  sid2;        /* Dataspace ID #2  */
+    hid_t  sid3;        /* Dataspace ID #3  */
+    hid_t  attr1;       /* Attribute ID  */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    hsize_t  dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
+    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
+    hdset_reg_ref_t      *wbuf;      /* buffer to write to disk */
+    hdset_reg_ref_t      *rbuf;      /* buffer read from disk */
+    uint8_t    *dwbuf;      /* Buffer for writing numeric data to disk */
+    uint8_t    *drbuf;      /* Buffer for reading numeric data from disk */
+    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
+    int        i;           /* counting variables */
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
+    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
+    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE64, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
+        *tu8++ = (uint8_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
+
+    /* Close Dataset */
+    H5Dclose(dset2);
+
+    /*
+     * Create dataset with a null dataspace to serve as the parent for
+     * the attribute.
+     */
+    sid1 = H5Screate (H5S_NULL);
+    dset1 = H5Dcreate2 (fid1, "Dataset1", H5T_STD_I32LE, sid1, H5P_DEFAULT,
+            H5P_DEFAULT, H5P_DEFAULT);
+    H5Sclose (sid1);
+
+    /* Create references */
+
+    /* Select 6x6 hyperslab for first reference */
+    start[0] = 2; start[1] = 2;
+    stride[0] = 1; stride[1] = 1;
+    count[0] = 6; count[1] = 6;
+    block[0] = 1; block[1] = 1;
+    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store first dataset region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
+
+    /* Select sequence of ten points for second reference */
+    coord1[0][0]=6; coord1[0][1]=9;
+    coord1[1][0]=2; coord1[1][1]=2;
+    coord1[2][0]=8; coord1[2][1]=4;
+    coord1[3][0]=1; coord1[3][1]=6;
+    coord1[4][0]=2; coord1[4][1]=8;
+    coord1[5][0]=3; coord1[5][1]=2;
+    coord1[6][0]=0; coord1[6][1]=4;
+    coord1[7][0]=9; coord1[7][1]=0;
+    coord1[8][0]=7; coord1[8][1]=1;
+    coord1[9][0]=3; coord1[9][1]=3;
+    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store second dataset region */
+    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
+
+    /* Create dataspace for the attribute */
+    sid3 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create the attribute and write the region references to it. */
+    attr1 = H5Acreate2 (dset1, "Attribute1", H5T_STD_REF_DSETREG, sid3, H5P_DEFAULT,
+            H5P_DEFAULT);
+    H5Awrite (attr1, H5T_STD_REF_DSETREG, wbuf);
+
+    /* Close attribute dataspace */
+    H5Sclose(sid3);
+
+    /* Close attribute */
+    H5Aclose (attr1);
+
+    /* Close Dataset */
+    H5Dclose(dset1);
+
+    /* Close uint8 dataset dataspace */
+    H5Sclose(sid2);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(dwbuf);
+    HDfree(drbuf);
+}
+
+/*taken from Elena's compound test file*/
+static void gent_nestcomp(void)
+{
+    /* Compound memeber of the compound datatype*/
+    typedef struct cmp_t {
+            char   a;
+            float  b[2];
+    } cmp_t;
+
+    /* First structure  and dataset*/
+    typedef struct s1_t {
+            int    a;
+            float  b;
+            double c;
+            cmp_t  d;
+    } s2_t;
+    hid_t      cmp_tid;    /* Handle for the compound datatype */
+    hid_t      char_id;    /* Handle for the string datatype */
+    hid_t      array_dt;
+    hsize_t     array_dims[] = {2};    /* Dataspace dimensions */
+    unsigned    ndims = 1;    /* Number of dimensions in the array field */
+
+    s2_t       s1[10];
+    hid_t      s2_tid;     /* File datatype identifier */
+
+    int        i;
+    hid_t      file, dataset, space; /* Handles */
+    herr_t     status;
+    hsize_t    dim[] = {10};   /* Dataspace dimensions */
+
+    char datasetname[] = "ArrayOfStructures";
+
+
+    /*
+     * Initialize the data
+     */
+    for(i = 0; i< 10; i++) {
+        s1[i].a = i;
+        s1[i].b = (float)(i*i);
+        s1[i].c = 1.0F/(float)(i + 1);
+        s1[i].d.a = (char)(65 + i);
+        s1[i].d.b[0] = -100.0F;
+        s1[i].d.b[1] =  100.0F;
+    }
+
+    /*
+     * Create the data space.
+     */
+    space = H5Screate_simple(1, dim, NULL);
+
+    /*
+     * Create the file.
+     */
+    file = H5Fcreate(FILE18, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create the memory data type.
+     */
+    /*
+     * Create a datatype for compound field first.
+     */
+    cmp_tid = H5Tcreate (H5T_COMPOUND, sizeof(cmp_t));
+
+    /* We are using C string of length one to represent "real" character */
+    char_id = H5Tcopy(H5T_C_S1);
+    H5Tset_strpad(char_id, H5T_STR_NULLTERM);
+    H5Tinsert(cmp_tid, "char_name", HOFFSET(cmp_t, a), char_id);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, array_dims);
+    H5Tinsert(cmp_tid, "array_name", HOFFSET(cmp_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
+    H5Tinsert(s2_tid, "a_name", HOFFSET(s2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE);
+    H5Tinsert(s2_tid, "b_name", HOFFSET(s2_t, b), H5T_NATIVE_FLOAT);
+
+    /* Insert compound memeber created above */
+    H5Tinsert(s2_tid, "d_name", HOFFSET(s2_t, d), cmp_tid);
+
+    /*
+     * Create the dataset.
+     */
+    dataset = H5Dcreate2(file, datasetname, s2_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Wtite data to the dataset;
+     */
+    status = H5Dwrite(dataset, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1);
+    if(status < 0)
+        fprintf(stderr, "gent_nestcomp H5Dwrite failed\n");
+
+    /*
+     * Release resources
+     */
+    H5Tclose(s2_tid);
+    H5Tclose(cmp_tid);
+    H5Tclose(char_id);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(file);
+}
+
+static void gent_opaque(void)
+{
+    hid_t file, type, dataset, space;
+    char test[100][2];
+    int x;
+    hsize_t dim = 2;
+
+    for(x = 0; x < 100; x++){
+        test[x][0] = (char)x;
+        test[x][1] = (char)(99 - x);
+    }
+
+    /*
+     * Create the data space.
+     */
+    space = H5Screate_simple(1, &dim, NULL);
+
+    /*
+     * Create the file.
+     */
+    file = H5Fcreate(FILE19, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create the memory datatype.
+     */
+    type = H5Tcreate(H5T_OPAQUE, sizeof(char) * 100 * 2);
+    H5Tset_tag(type, "test opaque type");
+
+    /*
+     * Create the dataset.
+     */
+    dataset = H5Dcreate2(file, "opaque test", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write data to the dataset;
+     */
+    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, test);
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(file);
+}
+
+static void gent_bitfields(void)
+{
+    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
+    size_t  i;
+    hsize_t  nelmts;
+    unsigned char buf[32];
+
+    file = H5Fcreate(FILE20, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if((grp = H5Gcreate2(file, "typetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
+
+    /* bitfield_1 */
+    nelmts = sizeof(buf);
+    if((type = H5Tcopy(H5T_STD_B8LE)) < 0 ||
+            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
+            (dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    for(i = 0; i < sizeof buf; i++)
+        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+    if(H5Sclose(space) < 0) goto error;
+    if(H5Tclose(type) < 0) goto error;
+    if(H5Dclose(dset) < 0) goto error;
+
+    /* bitfield_2 */
+    nelmts = sizeof(buf)/2;
+    if((type = H5Tcopy(H5T_STD_B16LE)) < 0 ||
+            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
+            (dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+    for(i = 0; i < sizeof buf; i++)
+        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+    if(H5Sclose(space) < 0) goto error;
+    if(H5Tclose(type) < 0) goto error;
+    if(H5Dclose(dset) < 0) goto error;
+    if(H5Gclose(grp) < 0) goto error;
+    H5Fclose(file);
+
+    error:
+    H5E_BEGIN_TRY {
+        H5Gclose(grp);
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Dclose(dset);
+    } H5E_END_TRY;
+}
+
+static void gent_vldatatypes(void)
+{
+    hvl_t adata, wdata[SPACE1_DIM1];
+    hid_t file, dset, space, type;
+    hsize_t dims[] = { SPACE1_DIM1 };
+    int i;
+    herr_t ret=0;
+
+    file = H5Fcreate(FILE21, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Allocate and initialize VL dataset to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        int j;
+
+        wdata[i].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+        wdata[i].len = (size_t)(i + 1);
+
+        for(j = 0; j < i + 1; j++)
+            ((int *)wdata[i].p)[j] = i * 10 + j;
+    }
+
+    /* write out the integers in little-endian format */
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    /* Allocate and initialize VL dataset to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        int j;
+
+        wdata[i].p = HDmalloc((size_t)(i + 1) * sizeof(float));
+        wdata[i].len = (size_t)(i + 1);
+
+        for(j = 0; j < i + 1; j++)
+            ((float *)wdata[i].p)[j] = (float)((float)(i * 10) + ((float)j) / 10.0F);
+    } /* end for */
+
+    /* write out the floats in little-endian format */
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_FLOAT);
+    dset = H5Dcreate2(file, "Dataset2.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    /* Allocate and initialize a scalar VL dataset to write */
+    adata.p = HDmalloc(37 * sizeof(int));
+    adata.len = 37;
+
+    for(i = 0; i < 37; i++)
+        ((int *)adata.p)[i] = i * 2;
+
+    /* write out scalar VL dataset in little-endian format */
+    space = H5Screate_simple(0, NULL, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset3.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &adata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, &adata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+    ret = H5Fclose(file);
+    HDassert(ret >= 0);
+}
+
+static void
+gent_vldatatypes2(void)
+{
+    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
+    hvl_t *t1;              /* Temporary pointer to VL information */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        wdata[i].p = (hvl_t *)HDmalloc((i + 1) * sizeof(hvl_t));
+        if(wdata[i].p == NULL) {
+            printf("Cannot allocate memory for VL data! i=%u\n", i);
+            return;
+        } /* end if */
+        wdata[i].len = i + 1;
+        for(t1 = (hvl_t *)wdata[i].p, j = 0; j < (i + 1); j++, t1++) {
+            t1->p = (unsigned *)HDmalloc((j + 1) * sizeof(unsigned));
+            if(t1->p == NULL) {
+                printf("Cannot allocate memory for VL data! i=%u, j=%u\n",i,j);
+                return;
+            } /* end if */
+            t1->len=j+1;
+            for(k=0; k<(j+1); k++)
+                ((unsigned int *)t1->p)[k]=i*100+j*10+k;
+        } /* end for */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE22, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create the base VL type */
+    tid2 = H5Tvlen_create(tid1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+
+}
+
+static void gent_vldatatypes3(void)
+{
+    typedef struct {             /* Struct that the VL sequences are composed of */
+        int i;
+        float f;
+        hvl_t v;
+    } s1;
+    s1 wdata[SPACE1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        wdata[i].i = (int)(i * 10);
+        wdata[i].f = (float)((float)(i * 20)/3.0F);
+        wdata[i].v.p = HDmalloc((size_t)(i + 1) * sizeof(unsigned int));
+        wdata[i].v.len = (size_t)(i + 1);
+        for(j = 0; j < (i + 1); j++)
+            ((unsigned int *)wdata[i].v.p)[j] = i * 10 + j;
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE23, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create the base compound type */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_vldatatypes4(void)
+{
+    typedef struct {             /* Struct that the VL sequences are composed of */
+        int i;
+        float f;
+    } s1;
+    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        wdata[i].p = HDmalloc((i + 1) * sizeof(s1));
+        wdata[i].len = i + 1;
+        for(j = 0; j < (i + 1); j++) {
+            ((s1 *)wdata[i].p)[j].i = (int)(i * 10 + j);
+            ((s1 *)wdata[i].p)[j].f = (float)((float)(i * 20 + j) / 3.0F);
+        } /* end for */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE24, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create the base compound type */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tvlen_create(tid2);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+/* Generate a variable-length dataset with NULL values in it */
+static void gent_vldatatypes5(void)
+{
+    hvl_t wdata [SPACE1_DIM1];
+    hid_t  fid1;
+    hid_t  dataset;
+    hid_t  sid1;
+    hid_t  tid1;
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    int                 i,j;          /* counting variable */
+    herr_t  ret;  /* Generic return value  */
+
+    /* initialize data for dataset */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        if(i%2) {
+            wdata[i].len=0;
+            wdata[i].p=NULL;
+        } /* end if */
+        else {
+            wdata[i].len = (size_t)(i + 5);
+            wdata[i].p = HDmalloc(sizeof(unsigned) * (size_t)(i + 5));
+            for(j = 0; j < i + 5; j++)
+                ((unsigned *)wdata[i].p)[j] = (unsigned)(j * 2);
+        } /* end else */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE43, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid1>0);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+    HDassert(sid1>0);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+    HDassert(tid1>0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, F43_DSETNAME, tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(dataset>0);
+
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+
+    ret = H5Sclose (sid1);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose (fid1);
+    HDassert(ret >= 0);
+}
+
+/* This is big enough to make h5dump to use hyperslap to read
+   from file and display portion by portion. This also prints out array indices
+   via region reference for testing refion reference output.
+   Note: this was added originally prepared for bug2092. before the fix h5dump didn't
+         display array indices every 262 x N (N > 0) based on 2000x1000 dims.
+ */
+#define SPACE_ARRAY1BIG_DIM 2000
+#define ARRAY1BIG_DIM 1000
+
+static void gent_array1_big(void)
+{
+    int *wdata;   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE_ARRAY1BIG_DIM};
+    hsize_t  tdims1[] = {ARRAY1BIG_DIM};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+
+    /* for region reference dataset */
+    hid_t  dset2;
+    hid_t  sid2;
+    hsize_t  dims2[] = {SPACE1_DIM1};
+    hsize_t  start[SPACE1_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE1_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE1_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE1_RANK];     /* Block size of hyperslab */
+    hdset_reg_ref_t   *wbuf;         /* buffer to write to disk */
+
+    start[0] = 0;
+    stride[0] = 1;
+    count[0] = 999;
+    block[0] = 1;
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    wdata = (int *)HDmalloc(sizeof(int) * (size_t)(SPACE_ARRAY1BIG_DIM * ARRAY1BIG_DIM));
+
+    /* Allocate and initialize array data to write */
+    for(i = 0; i < SPACE_ARRAY1BIG_DIM; i++)
+        for(j = 0; j < ARRAY1BIG_DIM; j++)
+            *(wdata + (i * ARRAY1BIG_DIM) + j) = i * 1;
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE25_BIG, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------
+     * Array type dataset
+     */
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /*---------------------------
+     * Region Reference dataset
+     */
+    /* Create dataspace for the reference dataset */
+    sid2 = H5Screate_simple(SPACE1_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_REF_DSETREG, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create references */
+    H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid1);
+
+    /* Create Dataset1 region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset1", H5R_DATASET_REGION, sid1);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+
+    /* Release memory */
+    HDfree(wbuf);
+    HDfree(wdata);
+}
+
+static void gent_array1(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++)
+            wdata[i][j]=i*10+j;
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE25, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array2(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY2_DIM1][ARRAY2_DIM2][ARRAY2_DIM3];   /* Information to write */
+    hid_t  fid;        /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid;        /* Dataspace ID   */
+    hid_t  tid;        /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims2[] = {ARRAY2_DIM1,ARRAY2_DIM2,ARRAY2_DIM3};
+    int        i,j,k,l;    /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY2_DIM1; j++)
+            for(k=0; k<ARRAY2_DIM2; k++)
+                for(l=0; l<ARRAY2_DIM3; l++)
+                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
+
+    /* Create file */
+    fid = H5Fcreate(FILE26, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, ARRAY2_RANK, tdims2);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid, "Dataset1", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+static void gent_array3(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY1_DIM1][ARRAY3_DIM1][ARRAY3_DIM2];   /* Information to write */
+    hid_t  fid;        /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid;        /* Dataspace ID   */
+    hid_t  tid1;       /* 1-D array Datatype ID */
+    hid_t  tid2;       /* 2-D array Datatype ID */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    hsize_t  tdims2[] = {ARRAY3_DIM1,ARRAY3_DIM2};
+    int        i,j,k,l;    /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++)
+            for(k=0; k<ARRAY3_DIM1; k++)
+                for(l=0; l<ARRAY3_DIM2; l++)
+                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
+
+    /* Create file */
+    fid = H5Fcreate(FILE27, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a 2-D datatype to refer to */
+    tid2 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY3_RANK, tdims2);
+
+    /* Create a 1-D datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+static void gent_array4(void)
+{
+    typedef struct {        /* Typedef for compound datatype */
+            int i;
+            float f;
+    } s2_t;
+    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* Compound Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].i = i * 10 + j;
+            wdata[i][j].f = (float)((float)i * 2.5F + (float)j);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE28, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s2_t, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+
+    /* Insert float field */
+    ret = H5Tinsert(tid2, "f", HOFFSET(s2_t, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close compound datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array5(void)
+{
+    typedef struct {        /* Typedef for compound datatype */
+            int i;
+            float f[ARRAY1_DIM1];
+    } s2_t;
+    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID */
+    hid_t  tid2;       /* Compound Datatype ID */
+    hid_t  tid3;       /* Nested Array Datatype ID */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].i = i * 10 + j;
+            for(k=0; k<ARRAY1_DIM1; k++)
+                wdata[i][j].f[k] = (float)((float)i * 10 + (float)j * 2.5F + (float)k);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE29, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert (tid2, "i", HOFFSET(s2_t,i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+
+    /* Create an array of floats datatype */
+    tid3 = H5Tarray_create2(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1);
+
+    /* Insert float array field */
+    ret = H5Tinsert (tid2, "f", HOFFSET(s2_t,f), tid3);
+    HDassert(ret >= 0);
+
+    /* Close array of floats field datatype */
+    ret = H5Tclose(tid3);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close compound datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array6(void)
+{
+    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* VL Datatype ID       */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].p = HDmalloc((size_t)(i + j + 1) * sizeof(unsigned int));
+            wdata[i][j].len = (size_t)(i + j + 1);
+            for(k = 0; k < (i + j + 1); k++)
+                ((unsigned int *)wdata[i][j].p)[k] = (unsigned)(i * 100 + j * 10 + k);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE30, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close VL datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array7(void)
+{
+    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* VL Datatype ID       */
+    hid_t  tid3;       /* Nested Array Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k,l;    /* Index variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].p = HDmalloc((size_t)(i + j + 1) * (sizeof(unsigned int) * ARRAY1_DIM1));
+            wdata[i][j].len = (size_t)(i + j + 1);
+            for(k = 0; k < (i + j + 1); k++)
+                for(l = 0; l<ARRAY1_DIM1; l++)
+                    ((unsigned int *)wdata[i][j].p)[k * ARRAY1_DIM1 + l] = (unsigned)(i * 1000+j * 100+k * 10 + l);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE31, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create the nested array datatype to refer to */
+    tid3 = H5Tarray_create2(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1);
+
+    /* Create a VL datatype of 1-D arrays to refer to */
+    tid2 = H5Tvlen_create(tid3);
+
+    /* Close nested array datatype */
+    ret = H5Tclose(tid3);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close VL datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+/* Test the boundary of the display output buffer at the reallocation event */
+static void gent_array8(void)
+{
+    hid_t       file = -1; /* Handles */
+    hid_t       filetype = -1; /* Handles */
+    hid_t       space = -1; /* Handles */
+    hid_t       dset = -1; /* Handles */
+    herr_t      status = -1;
+    hsize_t sdims[] = {F64_DIM0};
+    hsize_t tdims[] = {F64_DIM1};
+    int         wdata[F64_DIM1];      /* Write buffer */
+    unsigned int i;
+
+    /*
+     * Initialize data.  i is the element in the dataspace, j and k the
+     * elements within the array datatype.
+     */
+    for (i = 0; i < F64_DIM1; i++)
+        wdata[i] = (int)i;
+
+    /*
+     * Create a new file using the default properties.
+     */
+    file = H5Fcreate (FILE64, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create array datatypes for file and memory.
+     */
+    filetype = H5Tarray_create2 (H5T_NATIVE_INT, 1, tdims);
+
+    /*
+     * Create dataspace.  Setting maximum size to NULL sets the maximum
+     * size to be the current size.
+     */
+    space = H5Screate_simple (1, sdims, NULL);
+
+    /*
+     * Create the dataset and write the array data to it.
+     */
+    if(file>=0 && filetype>=0 && space>=0) {
+        dset = H5Dcreate2 (file, F64_DATASET, filetype, space, H5P_DEFAULT, H5P_DEFAULT,
+                H5P_DEFAULT);
+        if(dset>=0)
+            status = H5Dwrite (dset, filetype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+            HDassert(status >= 0);
+    }
+    /*
+     * Close and release resources.
+     */
+    status = H5Dclose (dset);
+    HDassert(status >= 0);
+    status = H5Sclose (space);
+    HDassert(status >= 0);
+    status = H5Tclose (filetype);
+    HDassert(status >= 0);
+    status = H5Fclose (file);
+    HDassert(status >= 0);
+}
+
+static void gent_empty(void)
+{
+    typedef struct {
+            int a;
+            float b;
+            char c;
+    } empty_struct;
+    hid_t file, dset, space, type;
+    hsize_t dims[] = { SPACE1_DIM1 };
+    herr_t ret=0;
+
+    file = H5Fcreate(FILE32, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+
+    /* write out an empty vlen dataset */
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    /* write out an empty native integer dataset dataset */
+    dset = H5Dcreate2(file, "Dataset2.0", H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+
+    /* write out an empty native floating-point dataset dataset */
+    dset = H5Dcreate2(file, "Dataset3.0", H5T_NATIVE_FLOAT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+
+    /* write out an empty array dataset */
+    type = H5Tarray_create2(H5T_NATIVE_INT, SPACE1_RANK, dims);
+    dset = H5Dcreate2(file, "Dataset4.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    /* write out an empty compound dataset */
+    type = H5Tcreate(H5T_COMPOUND,sizeof(empty_struct));
+    H5Tinsert(type, "a", HOFFSET(empty_struct, a),H5T_NATIVE_INT);
+    H5Tinsert(type, "b", HOFFSET(empty_struct, b),H5T_NATIVE_FLOAT);
+    H5Tinsert(type, "c", HOFFSET(empty_struct, c),H5T_NATIVE_CHAR);
+    dset = H5Dcreate2(file, "Dataset5.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose(file);
+    HDassert(ret >= 0);
+}
+
+static void
+gent_group_comments(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE33, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* / */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1", "Comment for group /g1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2", "Comment for group /g2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3", "Comment for group /g3", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g1 */
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1/g1.1", "Comment for group /g1/g1.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1/g1.2", "Comment for group /g1/g1.2", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2 */
+    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1", "Comment for group /g2/g2.1", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g3 */
+    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.1", "Comment for group /g3/g3.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.2", "Comment for group /g3/g3.2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.3", "Comment for group /g3/g3.3", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.4", "Comment for group /g3/g3.4", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2/g2.1 */
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.1", "Comment for group /g2/g2.1/g2.1.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.2", "Comment for group /g2/g2.1/g2.1.2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.3", "Comment for group /g2/g2.1/g2.1.3", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /glongcomment */
+    group = H5Gcreate2(fid, "/glongcomment", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/glongcomment", "Comment for group /glongcomment with a really, really, really long, long, long comment", H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+static
+void gent_split_file(void)
+{
+    hid_t fapl, fid, root, attr, space, dataset, atype;
+    char meta[] = "this is some metadata on this file";
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
+    fid = H5Fcreate(FILE34, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    atype = H5Tcopy(H5T_C_S1);
+    H5Tset_size(atype, HDstrlen(meta) + 1);
+    H5Tset_strpad(atype, H5T_STR_NULLTERM);
+
+    dims[0] = 1;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "Metadata", atype, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, atype, meta);
+    H5Tclose(atype);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Gclose(root);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static
+void gent_family(void)
+{
+    hid_t fapl, fid, space, dataset;
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+#define FAMILY_SIZE     256
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT);
+
+    fid = H5Fcreate(FILE35, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static const char *multi_letters = "msbrglo";
+
+static
+void gent_multi(void)
+{
+    hid_t fapl, fid, space, dataset;
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+    /* Multi-file driver, general case of the split driver */
+    H5FD_mem_t mt, memb_map[H5FD_MEM_NTYPES];
+    hid_t memb_fapl[H5FD_MEM_NTYPES];
+    const char *memb_name[H5FD_MEM_NTYPES];
+    char sv[H5FD_MEM_NTYPES][1024];
+    haddr_t memb_addr[H5FD_MEM_NTYPES];
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+
+    HDmemset(memb_map, 0, sizeof memb_map);
+    HDmemset(memb_fapl, 0, sizeof memb_fapl);
+    HDmemset(memb_name, 0, sizeof memb_name);
+    HDmemset(memb_addr, 0, sizeof memb_addr);
+
+    HDassert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
+
+    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+        memb_fapl[mt] = H5P_DEFAULT;
+        memb_map[mt] = mt;
+        sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+        memb_name[mt] = sv[mt];
+        /*printf("memb_name[%d]=%s, memb_map[%d]=%d; ", mt, memb_name[mt], mt, memb_map[mt]);*/
+        memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
+    }
+    memb_map[H5FD_MEM_DEFAULT] = H5FD_MEM_SUPER;
+
+    H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
+            memb_addr, FALSE);
+
+    fid = H5Fcreate(FILE36, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static void gent_large_objname(void)
+{
+    hid_t fid, group, group2;
+    char grp_name[128];
+    register int i;
+
+    fid = H5Fcreate(FILE37, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "this_is_a_large_group_name", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 50; ++i) {
+        sprintf(grp_name, "this_is_a_large_group_name%d", i);
+        group2 = H5Gcreate2(group, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Gclose(group2);
+    }
+
+    H5Gclose(group);
+    H5Fclose(fid);
+}
+
+static void gent_vlstr(void)
+{
+    const char *wdata[SPACE1_DIM1]= {
+            "Four score and seven years ago our forefathers brought forth on this continent a new nation,",
+            "conceived in liberty and dedicated to the proposition that all men are created equal.",
+            "",
+            NULL
+    };   /* Information to write */
+    const char *string_att= "This is the string for the attribute";
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset, root; /* Dataset ID   */
+    hid_t  sid1, dataspace;/* Dataspace ID   */
+    hid_t  tid1, att;      /* Datatype ID   */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE38, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL string datatype to refer to */
+    tid1 = H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid1, H5T_VARIABLE);
+
+    /* Create a dataset and write VL string to it. */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    H5Dclose(dataset);
+
+    /* Create a named VL string type.  Change padding of datatype */
+    H5Tset_strpad(tid1, H5T_STR_NULLPAD);
+    H5Tcommit2(fid1, "vl_string_type", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create an group attribute of VL string type */
+    root = H5Gopen2(fid1, "/", H5P_DEFAULT);
+    dataspace = H5Screate(H5S_SCALAR);
+
+    att = H5Acreate2(root, "test_scalar", tid1, dataspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(att, tid1, &string_att);
+
+    /* Close */
+    H5Tclose(tid1);
+    H5Sclose(sid1);
+    H5Sclose(dataspace);
+    H5Aclose(att);
+    H5Gclose(root);
+    H5Fclose(fid1);
+}
+
+static void gent_char(void)
+{
+    const char *wdata =
+            "Four score and seven years ago our forefathers brought "
+            "forth on this continent a new nation, conceived in "
+            "liberty and dedicated to the proposition that all "
+            "men are created equal. Now we are engaged in a great "
+            "civil war, testing whether that nation or any nation "
+            "so conceived and so dedicated can long endure.";
+    hid_t       fid1;               /* HDF5 File IDs    */
+    hid_t       dataset;            /* Dataset ID       */
+    hid_t       sid1;               /* Dataspace ID     */
+    hsize_t     dims1[1];
+
+    dims1[0] = HDstrlen(wdata);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE39, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid1 = H5Screate_simple(1, dims1, NULL);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_CHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write some characters to it. */
+    H5Dwrite(dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+
+    /* Close */
+    H5Dclose(dataset);
+    H5Sclose(sid1);
+    H5Fclose(fid1);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_attr_in
+ *
+ * Purpose: write attributes in LOC_ID (dataset, group, named datatype)
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void write_attr_in(hid_t loc_id,
+        const char* dset_name, /* for saving reference to dataset*/
+        hid_t fid)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+            char   a;
+            double b;
+    } s_t;
+
+    typedef enum
+    {
+        E_RED,
+        E_GREEN
+    } e_t;
+
+    hid_t   aid;
+    hid_t   sid;
+    hid_t   tid;
+    herr_t  status;
+    int     val, i, j, k, n;
+    float   f;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+            "rs","tu","vw","xz","AB","CD","EF","GH",
+            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+     * 1D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,1,dims,"enum",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc(1 * sizeof(int));
+    ((int *)buf5[0].p)[0] = 1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc(2 * sizeof(int));
+    ((int *)buf5[1].p)[0] = 2;
+    ((int *)buf5[1].p)[1] = 3;
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf5);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_attr(loc_id, 1, dims, "integer", H5T_NATIVE_INT, buf7);
+    write_attr(loc_id, 1, dims, "float", H5T_NATIVE_FLOAT, buf8);
+
+
+    /*-------------------------------------------------------------------------
+     * 2D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 3; i++) {
+            for(j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,2,dims2,"enum2D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            int l;
+
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                ((int *)buf52[i][j].p)[l] = n++;
+        }
+    }
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf52);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_attr(loc_id, 2, dims2, "integer2D", H5T_NATIVE_INT, buf72);
+    write_attr(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
+
+
+    /*-------------------------------------------------------------------------
+     * 3D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf23[i][j][k] = (char)n++;
+            }
+        }
+    }
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf33[i][j][k].a = (char)n++;
+                buf33[i][j][k].b=n++;
+            }
+        }
+    }
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 4; i++) {
+            for(j = 0; j < 3; j++) {
+                for(k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,3,dims3,"enum3D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                int l;
+
+                buf53[i][j][k].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++)
+                    ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+        }
+    }
+
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf53);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    n = 1;
+    for(i = 0; i < 24; i++)
+        for(j = 0; j < (int)dimarray[0]; j++)
+            buf63[i][j] = n++;
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    n=1; f=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf73[i][j][k]=n++;
+                buf83[i][j][k]=f++;
+            }
+        }
+    }
+    write_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset_in
+ *
+ * Purpose: write datasets in LOC_ID
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void write_dset_in(hid_t loc_id,
+        const char* dset_name, /* for saving reference to dataset*/
+        hid_t fid)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+            char   a;
+            double b;
+    } s_t;
+
+    typedef enum
+    {
+        E_RED,
+        E_GREEN
+    } e_t;
+
+    hid_t   did;
+    hid_t   sid;
+    hid_t   tid;
+    hid_t   plist_id;
+    herr_t  status;
+    int     val, i, j, k, n;
+    float   f;
+    int     fillvalue=2;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+            "rs","tu","vw","xz","AB","CD","EF","GH",
+            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+     * 1D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,1,dims,"enum",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf5[1].p)[0]=2;
+    ((int *)buf5[1].p)[1]=3;
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
+    write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+
+
+    /*-------------------------------------------------------------------------
+     * 2D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 3; i++) {
+            for(j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,2,dims2,"enum2D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 2; j++) {
+            int l;
+
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                ((int *)buf52[i][j].p)[l] = n++;
+        }
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER, write a fill value
+     *-------------------------------------------------------------------------
+     */
+    plist_id = H5Pcreate(H5P_DATASET_CREATE);
+    status = H5Pset_fill_value(plist_id, H5T_NATIVE_INT, &fillvalue);
+    sid = H5Screate_simple(2, dims2, NULL);
+    did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, plist_id, H5P_DEFAULT);
+    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72);
+    status = H5Pclose(plist_id);
+    status = H5Dclose(did);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+
+    write_dset(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
+
+
+    /*-------------------------------------------------------------------------
+     * 3D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++)
+                buf23[i][j][k] = (char)n++;
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++) {
+                buf33[i][j][k].a = (char)n++;
+                buf33[i][j][k].b = n++;
+            }
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 4; i++) {
+            for(j = 0; j < 3; j++) {
+                for(k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,3,dims3,"enum3D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++) {
+                int l;
+
+                buf53[i][j][k].p = HDmalloc(((size_t)i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++)
+                    ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    n=1;
+    for(i = 0; i < 24; i++) {
+        for(j = 0; j < (int)dimarray[0]; j++) {
+            buf63[i][j]=n++;
+        }
+    }
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    n=1; f=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf73[i][j][k]=n++;
+                buf83[i][j][k]=f++;
+            }
+        }
+    }
+    write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_attr_all
+ *
+ * Purpose: generate all datatype attributes
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void gent_attr_all(void)
+{
+    hid_t   fid;
+    hid_t   did;
+    hid_t   group_id;
+    hid_t   group2_id;
+    hid_t   root_id;
+    hid_t   sid;
+    hsize_t dims[1] = {2};
+    herr_t  status;
+
+    /* Create a file and a dataset */
+    fid = H5Fcreate(FILE40, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create a 1D dataset */
+    sid = H5Screate_simple(1,dims,NULL);
+    did = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Sclose(sid);
+    HDassert(status >= 0);
+
+    /* Create groups */
+    group_id  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    group2_id = H5Gcreate2(fid, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    root_id   = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+     * write a series of attributes on the dataset, group
+     *-------------------------------------------------------------------------
+     */
+
+    write_attr_in(did,"dset",fid);
+    write_attr_in(group_id,NULL,(hid_t)0);
+    write_attr_in(root_id,NULL,(hid_t)0);
+
+    /*-------------------------------------------------------------------------
+     * write a series of datasets on group 2
+     *-------------------------------------------------------------------------
+     */
+
+    write_dset_in(group2_id,"/dset",fid);
+
+    /* Close */
+    status = H5Dclose(did);
+    HDassert(status >= 0);
+    status = H5Gclose(group_id);
+    HDassert(status >= 0);
+    status = H5Gclose(group2_id);
+    HDassert(status >= 0);
+    status = H5Gclose(root_id);
+    HDassert(status >= 0);
+
+    /* Close file */
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_attr
+ *
+ * Purpose: utility function to write an attribute
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
+        hid_t tid, void *buf)
+{
+    hid_t   aid;
+    hid_t   sid;
+    herr_t  status;
+
+    /* Create a buf space  */
+    sid = H5Screate_simple(rank, dims, NULL);
+
+    /* Create the attribute */
+    aid = H5Acreate2(loc_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write the buf */
+    if(buf)
+        status = H5Awrite(aid, tid, buf);
+
+    /* Close */
+    status = H5Aclose(aid);
+    status = H5Sclose(sid);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ * Return:
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 27, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
+        hid_t tid, void *buf )
+{
+    hid_t   did;
+    hid_t   sid;
+    herr_t  status;
+
+    /* Create a buf space  */
+    sid = H5Screate_simple(rank, dims, NULL);
+
+    /* Create a dataset */
+    did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write the buf */
+    if(buf)
+        status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* Close */
+    status = H5Dclose(did);
+    status = H5Sclose(sid);
+
+    return status;
+}
+
+
+static void gent_compound_complex(void)
+{
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            int                a;
+            const char         *b[F41_DIMb];
+            char               c[F41_ARRAY_DIMc];
+            short              d[F41_ARRAY_DIMd1][F41_ARRAY_DIMd2];
+            float              e;
+            double             f[F41_ARRAY_DIMf];
+            char               g;
+    } Array1Struct;
+    Array1Struct       Array1[F41_LENGTH];
+
+    /* Define the value of the string array                           */
+    const char *quote [F41_DIMb] = {
+            "A fight is a contract that takes two people to honor.",
+            "A combative stance means that you've accepted the contract.",
+            "In which case, you deserve what you get.",
+            "  --  Professor Cheng Man-ch'ing"
+    };
+
+    /* Define the value of the character array                        */
+    char chararray [F41_ARRAY_DIMc] = {'H', 'e', 'l', 'l', 'o', '!'};
+
+
+    hid_t      Array1Structid;            /* File datatype identifier */
+    hid_t      array_tid;                 /* Array datatype handle    */
+    hid_t      array1_tid;                /* Array datatype handle    */
+    hid_t      array2_tid;                /* Array datatype handle    */
+    hid_t      array4_tid;                /* Array datatype handle    */
+    hid_t      datafile, dataset;         /* Datafile/dataset handles */
+    hid_t      dataspace;                 /* Dataspace handle         */
+    herr_t     status;                    /* Error checking variable */
+    hsize_t    dim[] = {F41_LENGTH};          /* Dataspace dimensions     */
+    hsize_t    array_dimb[] = {F41_DIMb};     /* Array dimensions         */
+    hsize_t    array_dimd[]={F41_ARRAY_DIMd1,F41_ARRAY_DIMd2}; /* Array dimensions         */
+    hsize_t    array_dimf[]={F41_ARRAY_DIMf}; /* Array dimensions         */
+    hid_t      str_array_id;
+
+    int        m, n, o;                   /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for(m = 0; m< F41_LENGTH; m++) {
+        Array1[m].a = m;
+
+        for(n = 0; n < F41_DIMb; n++)
+            Array1[m].b[n] = quote[n];
+
+        for(n = 0; n < F41_ARRAY_DIMc; n++)
+            Array1[m].c[n] = chararray[n];
+
+        for(n = 0; n < F41_ARRAY_DIMd1; n++)
+            for(o = 0; o < F41_ARRAY_DIMd2; o++)
+                Array1[m].d[n][o] = (short)(m + n + o);
+
+        Array1[m].e = (float)((float)m * 0.96F );
+
+        for(n = 0; n < F41_ARRAY_DIMf; n++)
+            Array1[m].f[n] = ((float)m * 1024.9637F );
+
+        Array1[m].g = 'm';
+    }
+
+    /* Create the dataspace                                           */
+    dataspace = H5Screate_simple(F41_RANK, dim, NULL);
+    HDassert(dataspace >= 0);
+
+    /* Create the file                                                */
+    datafile = H5Fcreate(FILE41, H5F_ACC_TRUNC, H5P_DEFAULT,
+            H5P_DEFAULT);
+    HDassert(datafile >= 0);
+
+    /* Copy the array data type for the string array                  */
+    array_tid = H5Tcopy (H5T_C_S1);
+    HDassert(array_tid >= 0);
+
+    /* Set the string array size to Variable                          */
+    status = H5Tset_size (array_tid,H5T_VARIABLE);
+    HDassert(status >= 0);
+
+    /* Create the array data type for the string array                */
+    str_array_id = H5Tarray_create2(array_tid, F41_ARRAY_RANK, array_dimb);
+    HDassert(str_array_id >= 0);
+
+    /* Copy the array data type for the character array               */
+    array1_tid = H5Tcopy (H5T_C_S1);
+    HDassert(array1_tid >= 0);
+
+    /* Set the character array size                                   */
+    status = H5Tset_size (array1_tid, F41_ARRAY_DIMc);
+    HDassert(status >= 0);
+
+    /* Create the array data type for the character array             */
+    array2_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F41_ARRAY_RANKd, array_dimd);
+    HDassert(array2_tid >= 0);
+
+    /* Create the array data type for the character array             */
+    array4_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F41_ARRAY_RANK, array_dimf);
+    HDassert(array4_tid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate (H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, "a_name",
+            HOFFSET(Array1Struct, a), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "b_name",
+            HOFFSET(Array1Struct, b), str_array_id);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "c_name",
+            HOFFSET(Array1Struct, c), array1_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "d_name",
+            HOFFSET(Array1Struct, d), array2_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "e_name",
+            HOFFSET(Array1Struct, e), H5T_NATIVE_FLOAT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "f_name",
+            HOFFSET(Array1Struct, f), array4_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "g_name",
+            HOFFSET(Array1Struct, g), H5T_NATIVE_CHAR);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(datafile, F41_DATASETNAME, Array1Structid,
+            dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL,
+            H5P_DEFAULT, Array1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array1_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array2_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array4_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(str_array_id);
+    HDassert(status >= 0);
+
+    status = H5Sclose(dataspace);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(datafile);
+    HDassert(status >= 0);
+}
+
+
+static void gent_named_dtype_attr(void)
+{
+    hid_t fid;
+    hid_t did;
+    hid_t sid;
+    hid_t tid;
+    hid_t aid;
+    hid_t gid;
+    int data=8;
+    herr_t ret;
+
+    /* Create a file */
+    fid=H5Fcreate(FILE42, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>0);
+
+    /*-------------------------------------------------------------------------
+     * datatype
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create a datatype to commit and use */
+    tid=H5Tcopy(H5T_NATIVE_INT);
+    HDassert(tid>0);
+
+    /* Commit datatype to file */
+    ret = H5Tcommit2(fid, F42_TYPENAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* Create a hard link to the datatype */
+    ret = H5Lcreate_hard(fid, F42_TYPENAME, fid, F42_LINKNAME, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* Create a scalar dataspace used for all objects */
+    sid = H5Screate(H5S_SCALAR);
+    HDassert(sid > 0);
+
+    /* Create attribute on commited datatype */
+    aid = H5Acreate2(tid, F42_ATTRNAME, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create dataset */
+    did = H5Dcreate2(fid, F42_DSETNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(did > 0);
+
+    /* Create attribute on dataset */
+    aid = H5Acreate2(did, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * group
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create a group */
+    gid = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid > 0);
+
+    /* Create attribute on group */
+    aid = H5Acreate2(gid, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+    /* Close attribute */
+    ret = H5Aclose(aid);
+    HDassert(ret >= 0);
+
+    /* Close dataset */
+    ret = H5Dclose(did);
+    HDassert(ret >= 0);
+
+    /* Close dataspace */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /* Close datatype */
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /* Close file */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_null_space
+ *
+ * Purpose: generates dataset and attribute of null dataspace
+ *-------------------------------------------------------------------------
+ */
+static void gent_null_space(void)
+{
+    hid_t fid, root, dataset, space, attr;
+    int dset_buf = 10;
+    int point = 4;
+
+    fid = H5Fcreate(FILE45, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* null space */
+    space = H5Screate(H5S_NULL);
+
+    /* dataset */
+    dataset = H5Dcreate2(fid, "dset", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* nothing should be written */
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
+
+    /* attribute */
+    attr = H5Acreate2(root, "attr", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
+
+    H5Dclose(dataset);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_zero_dim_size
+ *
+ * Purpose: generates dataset and attribute with dataspace of 0 dimension size
+ *-------------------------------------------------------------------------
+ */
+static void gent_zero_dim_size(void)
+{
+    hid_t fid, root, dataset, space, attr;
+    hsize_t  dims1[] = {SPACE3_DIM1, SPACE3_DIM2};
+    int dset_buf = 10;
+    int point = 4;
+
+    fid = H5Fcreate(FILE67, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* dataspace of 0 dimension size */
+    space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
+
+    /* dataset */
+    dataset = H5Dcreate2(fid, "dset of 0 dimension size", H5T_STD_I32BE, space, H5P_DEFAULT,
+            H5P_DEFAULT, H5P_DEFAULT);
+    /* nothing should be written */
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
+
+    /* attribute */
+    attr = H5Acreate2(root, "attr of 0 dimension size", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
+
+    H5Dclose(dataset);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: make_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int make_dset(hid_t loc_id,
+        const char *name,
+        hid_t sid,
+        hid_t tid,
+        hid_t dcpl,
+        void *buf)
+{
+    hid_t   dsid;
+
+    /* create the dataset */
+    if((dsid = H5Dcreate2(loc_id, name, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* write */
+    if(H5Dwrite(dsid, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+
+    /* close */
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    return 0;
+
+    out:
+    H5E_BEGIN_TRY {
+        H5Dclose(dsid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: make_external
+ *
+ * Purpose: make a dataset with external storage
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+make_external(hid_t fid)
+{
+    hid_t   dcpl;         /*dataset creation property list */
+    hid_t   sid;          /*dataspace ID */
+    hid_t   dsid;         /*dataset ID   */
+    hsize_t cur_size[1];  /*data space current size */
+    hsize_t max_size[1];  /*data space maximum size */
+    hsize_t size;         /*bytes reserved for data in the external file*/
+    int     ret;
+
+    cur_size[0] = max_size[0] = 100;
+    size = (max_size[0]*sizeof(int)/2);
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    ret = H5Pset_external(dcpl, "ext1.bin", (off_t)0, size);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_external(dcpl, "ext2.bin", (off_t)0, size);
+    HDassert(ret >= 0);
+
+    sid = H5Screate_simple(1, cur_size, max_size);
+    HDassert(ret >= 0);
+
+    dsid = H5Dcreate2(fid, "external", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    H5Dclose(dsid);
+    HDassert(ret >= 0);
+
+    H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    H5Pclose(dcpl);
+    HDassert(ret >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_filters
+ *
+ * Purpose: make several datasets with filters, external dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_filters(void)
+{
+    hid_t    fid;  /* file id */
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    tid;  /* datatype ID */
+#ifdef H5_HAVE_FILTER_SZIP
+    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
+    unsigned szip_pixels_per_block=4;
+#endif /* H5_HAVE_FILTER_SZIP */
+    hsize_t  dims1[RANK]      = {DIM1,DIM2};
+    hsize_t  chunk_dims[RANK] = {CDIM1,CDIM2};
+    int      buf1[DIM1][DIM2];
+    int      i, j, n, ret;
+
+    for(i=n=0; i<DIM1; i++){
+        for(j=0; j<DIM2; j++){
+            buf1[i][j]=n++;
+        }
+    }
+
+    /* create a file */
+    fid  = H5Fcreate(FILE44, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /* create a space */
+    sid = H5Screate_simple(SPACE2_RANK, dims1, NULL);
+
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    /*-------------------------------------------------------------------------
+     * create a compact and contiguous storage layout dataset
+     * add a comment to the datasets
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_layout(dcpl, H5D_COMPACT);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"compact",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "compact", "This is a dataset with compact storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_layout(dcpl, H5D_CONTIGUOUS);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"contiguous",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "contiguous", "This is a dataset with contiguous storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_layout(dcpl, H5D_CHUNKED);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"chunked",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "chunked", "This is a dataset with chunked storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * make several dataset with filters
+     *-------------------------------------------------------------------------
+     */
+
+    /* set up chunk */
+    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * SZIP
+     *-------------------------------------------------------------------------
+     */
+#ifdef H5_HAVE_FILTER_SZIP
+    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
+        /* remove the filters from the dcpl */
+        ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+        HDassert(ret >= 0);
+
+        /* set szip data */
+        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
+        HDassert(ret >= 0);
+
+        ret=make_dset(fid,"szip",sid,H5T_NATIVE_INT,dcpl,buf1);
+        HDassert(ret >= 0);
+    }
+#endif /* H5_HAVE_FILTER_SZIP */
+
+    /*-------------------------------------------------------------------------
+     * GZIP
+     *-------------------------------------------------------------------------
+     */
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set deflate data */
+    ret = H5Pset_deflate(dcpl, 9);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"deflate",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+#endif
+
+
+    /*-------------------------------------------------------------------------
+     * shuffle
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the shuffle filter */
+    ret = H5Pset_shuffle(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"shuffle",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * checksum
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the checksum filter */
+    ret = H5Pset_fletcher32(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fletcher32",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * nbit
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the checksum filter */
+    ret = H5Pset_nbit(dcpl);
+    HDassert(ret >= 0);
+
+    tid=H5Tcopy(H5T_NATIVE_INT);
+    H5Tset_precision(tid,H5Tget_size(tid)-1);
+    ret=make_dset(fid,"nbit",sid,tid,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * scaleoffset
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the scaleoffset filter */
+    ret = H5Pset_scaleoffset(dcpl,H5Z_SO_INT,(int)H5Tget_size(H5T_NATIVE_INT));
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"scaleoffset",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * all filters
+     *-------------------------------------------------------------------------
+     */
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the shuffle filter */
+    ret = H5Pset_shuffle(dcpl);
+    HDassert(ret >= 0);
+
+#ifdef H5_HAVE_FILTER_SZIP
+    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
+        szip_options_mask=H5_SZIP_CHIP_OPTION_MASK | H5_SZIP_EC_OPTION_MASK;
+        /* set szip data */
+        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
+        HDassert(ret >= 0);
+    }
+#endif /* H5_HAVE_FILTER_SZIP */
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    ret = H5Pset_deflate(dcpl, 5);
+    HDassert(ret >= 0);
+#endif
+
+    /* set the checksum filter */
+    ret = H5Pset_fletcher32(dcpl);
+    HDassert(ret >= 0);
+
+    /* set the nbit filter */
+    ret = H5Pset_nbit(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"all",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * user defined filter
+     *-------------------------------------------------------------------------
+     */
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    ret = H5Zregister (H5Z_MYFILTER);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_filter (dcpl, MYFILTER_ID, 0, 0, NULL);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"myfilter",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * make an external dataset
+     *-------------------------------------------------------------------------
+     */
+    make_external(fid);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_EARLY
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_early",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_INCR
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_incr",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_LATE
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_late",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * commit a H5G_TYPE type with a comment
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "mytype", "This is a commited datatype", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: myfilter
+ *
+ * Purpose: filter operation callback function; the filter does nothing
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+myfilter(unsigned int H5_ATTR_UNUSED flags, size_t H5_ATTR_UNUSED cd_nelmts,
+        const unsigned int H5_ATTR_UNUSED *cd_values, size_t nbytes,
+        size_t H5_ATTR_UNUSED *buf_size, void H5_ATTR_UNUSED **buf)
+{
+    return nbytes;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: set_local_myfilter
+ *
+ * Purpose: filter operation "set local" callback
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+set_local_myfilter(hid_t dcpl_id, hid_t H5_ATTR_UNUSED tid, hid_t H5_ATTR_UNUSED sid)
+{
+    unsigned flags;                        /* Filter flags */
+    size_t   cd_nelmts = 0;                /* Number of filter parameters */
+    unsigned cd_values[2] = {5, 6};        /* Filter parameters */
+
+    /* Get the filter's current parameters */
+    if(H5Pget_filter_by_id2(dcpl_id, MYFILTER_ID, &flags, &cd_nelmts, cd_values, 0, NULL, NULL) < 0)
+        return(FAIL);
+
+    cd_nelmts = 2;
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5Pmodify_filter(dcpl_id, MYFILTER_ID, flags, cd_nelmts, cd_values) < 0)
+        return(FAIL);
+
+    return(SUCCEED);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_fcontents
+ *
+ * Purpose: generate several files to list its contents
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_fcontents(void)
+{
+    hid_t    fid;   /* file id */
+    hid_t    gid1;  /* group ID */
+    hid_t    tid;   /* datatype ID */
+    hsize_t  dims[1]={4};
+    int      buf[4]={1,2,3,4};
+    int      ret;
+
+
+    /* create a file */
+    fid  = H5Fcreate(FILE46, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+
+    write_dset(fid,1,dims,"dset",H5T_NATIVE_INT,buf);
+
+
+    /*-------------------------------------------------------------------------
+     * links
+     *-------------------------------------------------------------------------
+     */
+
+
+    /* hard link to "dset" */
+    gid1 = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "dset" */
+    gid1 = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "g2" */
+    gid1 = H5Gopen2(fid, "/g1", H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "dset" */
+    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* hard link to "dset" */
+    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset4", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* soft link to itself */
+    ret = H5Lcreate_soft("mylink", fid, "mylink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* soft link to "dset" */
+    ret = H5Lcreate_soft("/dset", fid, "softlink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* dangling external link */
+    ret = H5Lcreate_external("fname", "oname", fid, "extlink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* dangling udlink */
+    ret = H5Lcreate_ud(fid, "udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * datatypes
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+
+    /* no name datatype */
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    ret = H5Tcommit2(fid, "mytype2", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    write_dset(fid, 1, dims, "dsetmytype2", tid, buf);
+    ret = H5Ldelete(fid, "mytype2", H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+
+    /* create a file for the bootblock test */
+    fid  = H5Fcreate(FILE47, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_fvalues
+ *
+ * Purpose: generate a file for the fill values test
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_fvalues(void)
+{
+    /* compound datatype */
+    typedef struct c_t
+    {
+            char   a;
+            double b;
+    } c_t;
+
+
+    hid_t      fid;  /* file id */
+    hid_t      dcpl; /* dataset creation property list */
+    hid_t      sid;  /* dataspace ID */
+    hid_t      tid;  /* datatype ID */
+    hid_t      did;  /* datasetID */
+    hsize_t    dims[1]={2};
+    int        buf[2]={1,2};                   /* integer */
+    int        fillval1=-99;                   /* integer fill value */
+    c_t        buf2[2]={{1,2},{3,4}};          /* compound */
+    c_t        fillval2[1]={{1,2}};            /* compound fill value */
+    hvl_t      buf3[2];                        /* vlen */
+    hvl_t      fillval3;                       /* vlen fill value */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf4[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        ret;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE48, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /* create a space */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create a dataset creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    /*-------------------------------------------------------------------------
+     * make datasets with fill value combinations
+     * H5D_FILL_TIME_IFSET
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_IFSET);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_ifset",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_FILL_TIME_NEVER
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_never",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_FILL_TIME_ALLOC
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_alloc",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with no fill value
+     *-------------------------------------------------------------------------
+     */
+    write_dset(fid,1,dims,"no_fill",H5T_NATIVE_INT,buf);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_COMPOUND fill value
+     *-------------------------------------------------------------------------
+     */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
+    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(c_t, b), H5T_NATIVE_DOUBLE);
+    ret = H5Pset_fill_value(dcpl, tid, &fillval2);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"fill_compound",sid,tid,dcpl,buf2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_VLEN fill value
+     *-------------------------------------------------------------------------
+     */
+    buf3[0].len = 1;
+    buf3[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf3[0].p)[0]=1;
+    buf3[1].len = 2;
+    buf3[1].p = HDmalloc(2 * sizeof(int));
+    ((int *)buf3[1].p)[0] = 2;
+    ((int *)buf3[1].p)[1] = 3;
+
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    fillval3.p=NULL; fillval3.len=0;
+    ret = H5Pset_fill_value(dcpl, tid, &fillval3);
+    HDassert(ret >= 0);
+
+    did = H5Dcreate2(fid, "fill_vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf3);
+    HDassert(ret >= 0);
+    ret = H5Dclose(did);
+    ret = H5Tclose(tid);
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_ARRAY fill value
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(fid, 1, dims, "fill_array", tid, buf4);
+    ret = H5Tclose(tid);
+
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_string
+ *
+ * Purpose: make several datasets for the string with escape/not escape test
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_string(void)
+{
+    /* compound datatype */
+    typedef struct c_t
+    {
+            int    a;
+            char   str[255];
+    } c_t;
+
+    hid_t    fid;      /* file id */
+    hid_t    sid;      /* dataspace ID */
+    hid_t    tid;      /* datatype ID */
+    hid_t    str_tid;  /* datatype ID */
+    hid_t    did;      /* dataset ID */
+    char     buf1[]={"quote \"  backspace\b form feed\f new line\n tab\t new line\n carriage return\r"};
+    const char *buf2[SPACE1_DIM1]= {
+            "Four score and seven\n years ago our forefathers brought forth on this continent a new nation,",
+            "conceived in liberty\n and dedicated to the proposition that all men are created equal.",
+            "Now we are engaged\n in a great civil war,",
+            "testing whether that\n nation or any nation so conceived and so dedicated can long endure."
+    };
+    c_t      buf3 = {24, "Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
+    char     buf4[] = {"Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
+    hsize_t  dims1[]  = {1};
+    hsize_t        dims2[]  = {SPACE1_DIM1};
+    hsize_t        dims4[1];
+    int      ret;
+
+    dims4[0] = sizeof(buf4);
+
+    /* create a file */
+    fid  = H5Fcreate(FILE49, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /*-------------------------------------------------------------------------
+     * str1
+     *-------------------------------------------------------------------------
+     */
+
+    tid=H5Tcopy(H5T_C_S1);
+    ret = H5Tset_size(tid, sizeof(buf1));
+    HDassert(ret >= 0);
+    write_dset(fid,1,dims1,"str1",tid,buf1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str2
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims2, NULL);
+    tid = H5Tcopy(H5T_C_S1);
+    ret = H5Tset_size(tid, H5T_VARIABLE);
+    HDassert(ret >= 0);
+    did = H5Dcreate2(fid, "str2", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Dclose(did);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str3
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
+    str_tid = H5Tcopy( H5T_C_S1 );
+    H5Tset_size( str_tid, 255 );
+    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_INT);
+    H5Tinsert(tid, "str", HOFFSET(c_t, str), str_tid );
+    ret=make_dset(fid,"str3",sid,tid,H5P_DEFAULT,&buf3);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Tclose(str_tid);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str4
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims4, NULL);
+    ret=make_dset(fid,"str4",sid,H5T_NATIVE_CHAR,H5P_DEFAULT,buf4);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_aindices
+ *
+ * Purpose: make several datasets for the array indices and subsetting tests
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_aindices(void)
+{
+    hid_t    fid;     /* file id */
+    hid_t    gid[6];  /* group ids */
+    hsize_t  dims1[1]  = {100};
+    hsize_t  dims2[2]  = {10,10};
+    hsize_t  dims3[3]  = {2,10,10};
+    hsize_t  dims4[4]  = {2,2,10,10};
+    int      buf1[100];
+    int      buf2[10][10];
+    int      buf3[2][10][10];
+    int      buf4[2][2][10][10];
+    int      i, j, k, l, n, ret;
+
+    for(i = n = 0; i < 100; i++)
+        buf1[i] = n++;
+
+    for(i = n = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            buf2[i][j] = n++;
+    for(i = n = 0; i < 2; i++)
+        for(j = 0; j < 10; j++)
+            for(k = 0; k < 10; k++)
+                buf3[i][j][k] = n++;
+    for(i = n = 0; i < 2; i++)
+        for(j = 0; j < 2; j++)
+            for(k = 0; k < 10; k++)
+                for(l = 0; l < 10; l++)
+                    buf4[i][j][k][l] = n++;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE50, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /*-------------------------------------------------------------------------
+     * root datasets
+     *-------------------------------------------------------------------------
+     */
+    write_dset(fid,1,dims1,"1d",H5T_NATIVE_INT,buf1);
+    write_dset(fid,2,dims2,"2d",H5T_NATIVE_INT,buf2);
+    write_dset(fid,3,dims3,"3d",H5T_NATIVE_INT,buf3);
+    write_dset(fid,4,dims4,"4d",H5T_NATIVE_INT,buf4);
+
+    /*-------------------------------------------------------------------------
+     * test with group indentation
+     *-------------------------------------------------------------------------
+     */
+    gid[0] = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[1] = H5Gcreate2(fid, "g1/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[2] = H5Gcreate2(fid, "g1/g2/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[3] = H5Gcreate2(fid, "g1/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[4] = H5Gcreate2(fid, "g1/g2/g3/g4/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[5] = H5Gcreate2(fid, "g1/g2/g3/g4/g5/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    write_dset(gid[5],1,dims1,"1d",H5T_NATIVE_INT,buf1);
+    write_dset(gid[5],2,dims2,"2d",H5T_NATIVE_INT,buf2);
+    write_dset(gid[5],3,dims3,"3d",H5T_NATIVE_INT,buf3);
+    write_dset(gid[5],4,dims4,"4d",H5T_NATIVE_INT,buf4);
+    for(i = 0; i < 6; i++)
+        H5Gclose(gid[i]);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_longlinks
+ *
+ * Purpose: make file with very long names for objects
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_longlinks(void)
+{
+    hid_t       fid = (-1);     /* File ID */
+    hid_t       gid = (-1);     /* Group ID */
+    hid_t       gid2 = (-1);    /* Datatype ID */
+    char               *objname = NULL; /* Name of object [Long] */
+    size_t              u;              /* Local index variable */
+
+    /* Create files */
+    fid = H5Fcreate(FILE51, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create group with short name in file (used as target for hard links) */
+    gid = H5Gcreate2(fid, "grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid >= 0);
+
+    /* Construct very long file name */
+    objname = (char*) HDmalloc((size_t)(F51_MAX_NAME_LEN + 1));
+    HDassert(objname);
+    for(u = 0; u < F51_MAX_NAME_LEN; u++)
+        objname[u] = 'a';
+    objname[F51_MAX_NAME_LEN] = '\0';
+
+    /* Create hard link to existing object */
+    HDassert(H5Lcreate_hard(fid, "grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
+
+    /* Create soft link to existing object */
+    objname[0] = 'b';
+    HDassert(H5Lcreate_soft("grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
+
+    /* Create group with long name in existing group */
+    gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid2 >= 0);
+
+    /* Close objects */
+    HDassert(H5Gclose(gid2) >= 0);
+    HDassert(H5Gclose(gid) >= 0);
+    HDassert(H5Fclose(fid) >= 0);
+
+    /* Release memory */
+    HDfree(objname);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_ldouble
+ *
+ * Purpose: make file with a long double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static int gent_ldouble(void)
+{
+    hid_t       fid;
+    hid_t       did;
+    hid_t       tid;
+    hid_t       sid;
+    hsize_t     dims[1] = {3};
+    long double buf[3] = {1,2,3};
+
+    if((fid = H5Fcreate(FILE52, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto error;
+
+    if((tid = H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0)
+        goto error;
+
+    if(H5Tget_size(tid) == 0)
+        goto error;
+
+    if((did = H5Dcreate2(fid, "dset", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+
+    if(H5Sclose(sid) < 0)
+        goto error;
+    if(H5Tclose(tid) < 0)
+        goto error;
+    if(H5Dclose(did) < 0)
+        goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+
+    return 0;
+
+    error:
+    printf("error !\n");
+    return -1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_binary
+ *
+ * Purpose:     Generate a file to be used in the binary output test
+ *              Contains:
+ *              1) an integer dataset
+ *              2) a float dataset
+ *              3) a double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_binary(void)
+{
+    hid_t    fid, sid, did, aid;
+    hsize_t  dims[1]  = {6};
+    int      ibuf[6]  = {1,2,3,4,5,6};
+    float    fbuf[6]  = {1,2,3,4,5,6};
+    double   dbuf[6]  = {1,2,3,4,5,6};
+
+    fid = H5Fcreate(FILE55, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid = H5Screate_simple(1, dims, NULL);
+
+
+    /*-------------------------------------------------------------------------
+     * integer
+     *-------------------------------------------------------------------------
+     */
+
+    did = H5Dcreate2(fid, "integer", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf);
+    H5Dclose(did);
+
+    /*-------------------------------------------------------------------------
+     * float
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
+    H5Dclose(did);
+
+    /*-------------------------------------------------------------------------
+     * double
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+    /* create an attribute */
+    aid = H5Acreate2(did, "attr", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT);
+    H5Aclose(aid);
+    H5Dclose(did);
+
+
+    /* close */
+    H5Sclose(sid);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_bigdims
+ *
+ * Purpose: generate a dataset with dimensions greater than 4GB
+ *          and write one hyperslab on the boundary
+ *
+ *-------------------------------------------------------------------------
+ */
+#define GB4LL    ((unsigned long long) 4*1024*1024*1024)
+#define DIM_4GB  (GB4LL + 10)
+
+static void
+gent_bigdims(void)
+{
+    hid_t   fid = -1;
+    hid_t   did = -1;
+    hid_t   f_sid = -1;
+    hid_t   m_sid = -1;
+    hid_t   tid = -1;
+    hid_t   dcpl = -1;
+    hsize_t dims[1]={DIM_4GB};                 /* dataset dimensions */
+    hsize_t chunk_dims[1]={1024};              /* chunk dimensions */
+    hsize_t hs_start[1];
+    hsize_t hs_size[1];                        /* hyperslab dimensions */
+    size_t  size;
+    char    fillvalue=0;
+    char    *buf=NULL;
+    hsize_t i;
+    char    c;
+    size_t  nelmts;
+    int     ret;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE56, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* create dataset */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_SCHAR, &fillvalue) < 0)
+        goto out;
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        goto out;
+    if((f_sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if((did = H5Dcreate2(fid, "dset4gb", H5T_NATIVE_SCHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if((tid = H5Dget_type(did)) < 0)
+        goto out;
+    if((size = H5Tget_size(tid)) <= 0)
+        goto out;
+
+    /* select an hyperslab */
+    nelmts = 20;
+    hs_start[0] = GB4LL - 10;
+    hs_size[0]  = nelmts;
+
+    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
+        goto out;
+
+    buf=(char *) HDmalloc((unsigned)(nelmts*size));
+
+    for(i=0, c=0; i<nelmts; i++, c++)
+    {
+        buf[i] = c;
+    }
+
+    if(H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size,NULL) < 0)
+        goto out;
+    if(H5Dwrite (did,H5T_NATIVE_SCHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
+        goto out;
+
+
+    HDfree(buf);
+    buf=NULL;
+
+    /* close */
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+    if(H5Sclose(f_sid) < 0)
+        goto out;
+    f_sid = -1;
+    if(H5Sclose(m_sid) < 0)
+        goto out;
+    m_sid = -1;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    dcpl = -1;
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(f_sid);
+        H5Sclose(m_sid);
+        H5Tclose(tid);
+        H5Dclose(did);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_hyperslab
+ *
+ * Purpose: make a dataset for hyperslab read
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_hyperslab(void)
+{
+    hid_t    fid;     /* file id */
+    hsize_t  dims[2]  = {32,4097}; /* big enough data size to force a second stripmine read */
+    double   *buf;
+    int      i, ret;
+
+    buf = (double*) HDmalloc(32 * 4097 * sizeof(double) );
+    for(i = 0; i < 32 * 4097; i++)
+        buf[i] = 1;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE57, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    write_dset(fid,2,dims,"stripmine",H5T_NATIVE_DOUBLE,buf);
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+    HDfree(buf);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_group_creation_order
+ *
+ * Purpose: generate a file with several groups with creation order set and not
+ *  set tru its hierarchy
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_group_creation_order(void)
+{
+    hid_t    fid = -1;      /* file ID */
+    hid_t    gid = -1;      /* group ID */
+    hid_t    gcpl_id = -1;  /* group creation property list ID */
+    hid_t    fcpl_id = -1;  /* file creation property list ID (to set root group order) */
+
+    if((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto out;
+
+    if(H5Pset_link_creation_order(fcpl_id, H5P_CRT_ORDER_TRACKED ) < 0)
+        goto out;
+
+    if((fid = H5Fcreate(FILE58, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+
+    /* create group creation property list */
+    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+     * create a group "2"
+     *-------------------------------------------------------------------------
+     */
+
+
+    if((gid = H5Gcreate2(fid, "2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+
+    /*-------------------------------------------------------------------------
+     * create a group "1" with H5P_CRT_ORDER_TRACKED set
+     *-------------------------------------------------------------------------
+     */
+    if(H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+
+    if((gid = H5Gcreate2(fid, "1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+
+    if(H5Pclose(gcpl_id) < 0)
+        goto out;
+    gcpl_id = -1;
+    if(H5Pclose(fcpl_id) < 0)
+        goto out;
+    fcpl_id = -1;
+    if(H5Fclose(fid) < 0)
+        goto out;
+    fid = -1;
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Gclose(gid);
+        H5Pclose(gcpl_id);
+        H5Pclose(fcpl_id);
+        H5Fclose(fid);
+
+    } H5E_END_TRY;
+    return;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_attr_creation_order
+ *
+ * Purpose: generate a file with several objects with attributes with creation
+ *  order set and not set
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_creation_order(void)
+{
+    hid_t    fid = -1;      /* file id */
+    hid_t    gid = -1;      /* group id */
+    hid_t    did = -1;      /* dataset id */
+    hid_t    sid = -1;      /* space id */
+    hid_t    aid = -1;      /* attribute id */
+    hid_t    tid = -1;      /* datatype id */
+    hid_t    gcpl_id = -1;  /* group creation property list ID */
+    hid_t    dcpl_id = -1;  /* dataset creation property list ID */
+    hid_t    tcpl_id = -1;  /* datatype creation property list ID */
+    int      i;
+    const char *attr_name[3] = {"c", "b", "a" };
+
+    if((fid = H5Fcreate(FILE59, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* create group creation property list */
+    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        goto out;
+
+    /* create dataset creation property list */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+
+    /* create dataset creation property list */
+    if((tcpl_id = H5Pcreate(H5P_DATATYPE_CREATE)) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on dataset property list */
+    if(H5Pset_attr_creation_order(dcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on group property list */
+    if(H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on datatype property list */
+    if(H5Pset_attr_creation_order(tcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* create a dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+     * create a dataset with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    /* create a dataset */
+    if((did = H5Dcreate2(fid, "dt", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+
+    /*-------------------------------------------------------------------------
+     * create a dataset without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    /* create a dataset */
+    if((did = H5Dcreate2(fid, "d", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+
+
+    /*-------------------------------------------------------------------------
+     * create a group with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((gid = H5Gcreate2(fid, "gt", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a group without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((gid = H5Gcreate2(fid, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a named datatype with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto out;
+
+    if((H5Tcommit2(fid, "tt", tid, H5P_DEFAULT, tcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a named datatype without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto out;
+
+    if((H5Tcommit2(fid, "t", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+     * add some attributes to the root group
+     *-------------------------------------------------------------------------
+     */
+    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    sid = -1;
+    if(H5Pclose(dcpl_id) < 0)
+        goto out;
+    dcpl_id = -1;
+    if(H5Pclose(gcpl_id) < 0)
+        goto out;
+    gcpl_id = -1;
+    if(H5Pclose(tcpl_id) < 0)
+        goto out;
+    tcpl_id = -1;
+    if(H5Fclose(fid) < 0)
+        goto out;
+    fid = -1;
+
+
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Gclose(gid);
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Pclose(gcpl_id);
+        H5Pclose(dcpl_id);
+        H5Pclose(tcpl_id);
+        H5Fclose(fid);
+
+    } H5E_END_TRY;
+    return;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_fpformat
+ *
+ * Purpose:     Generate a file to be used in the floating point format test
+ *              Contains:
+ *              1) a float dataset
+ *              2) a double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_fpformat(void)
+{
+    hid_t    fid, sid, did;
+    hsize_t  dims[1]  = {6};
+    double   dbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
+    float    fbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
+
+    fid = H5Fcreate(FILE60, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /*-------------------------------------------------------------------------
+     * double
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+    H5Dclose(did);
+
+
+    /*-------------------------------------------------------------------------
+     * float
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
+    H5Dclose(did);
+
+
+    /* close */
+    H5Sclose(sid);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_extlinks
+ *
+ * Purpose:     Generate 3 files to be used in the external links test
+ *   External links point from one HDF5 file to an object (Group, Dataset,
+ *    or committed Datatype) in another file.  Try to create cycles.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_extlinks(void)
+{
+    hid_t    source_fid, target_fid, far_fid, sid, did, gid, gid2, tid;
+    hsize_t  dims[1]  = {6};
+    int      buf[6]  = {1, 2, 3, 4, 5, 6};
+
+    /* create two files, a source and a target */
+    source_fid = H5Fcreate(FILE61, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    target_fid = H5Fcreate(FILE62, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    far_fid = H5Fcreate(FILE63, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+
+    /*-------------------------------------------------------------------------
+     * create Groups, a Dataset, a committed Datatype, external links, and a
+     * cycle in the target
+     *-------------------------------------------------------------------------
+     */
+
+    gid = H5Gcreate2(target_fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(H5Gcreate2(target_fid, "empty_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT));
+    sid = H5Screate_simple(1, dims, NULL);
+    did = H5Dcreate2(gid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    H5Lcreate_external(FILE61, "/", gid, "elink_t1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE61, "/ext_link4", gid, "elink_t2", H5P_DEFAULT, H5P_DEFAULT);
+
+    gid2 = H5Gcreate2(gid, "subgroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(target_fid, "/group", gid2, "link_to_group", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Dclose(did);
+    H5Sclose(sid);
+    H5Gclose(gid2);
+    H5Gclose(gid);
+
+
+    sid = H5Screate_simple(1, dims, NULL);
+    did = H5Dcreate2(target_fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    H5Dclose(did);
+    H5Sclose(sid);
+
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    H5Tcommit2(target_fid, "type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * create external links in the source file pointing to the target objects
+     *-------------------------------------------------------------------------
+     */
+
+    H5Lcreate_external(FILE62, "group", source_fid, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "dset", source_fid, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "type", source_fid, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "group/elink_t2", source_fid, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "empty_group", source_fid, "ext_link5", H5P_DEFAULT, H5P_DEFAULT);
+    /* external link to soft link which linked to a dataset */
+    H5Lcreate_external(FILE4_1, "/soft_dset1", source_fid, "ext2soft_link1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* external link to dangle soft link  */
+    H5Lcreate_external(FILE4_1, "/soft_dangle", source_fid, "ext2softdangle_link1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+     * create external link in the "far" file pointing to the source file
+     *-------------------------------------------------------------------------
+     */
+    H5Lcreate_external(FILE61, "/", far_fid, "src_file", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* close */
+    H5Fclose(source_fid);
+    H5Fclose(target_fid);
+    H5Fclose(far_fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_packedbits
+ *
+ * Purpose:     Generate a file to be used in the h5dump packed bits tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ * Created:  Albert Cheng, 2010/5/10.
+ * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_packedbits(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE66, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j - 1] << 1);
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++)
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++)
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++)
+            dset32[i][j] = dset32[i][j-1] << 1;
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++)
+            dset64[i][j] = dset64[i][j-1] << 1;
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_attr_packedbits
+ *
+ * Purpose:     Generate a file to be used in the h5dump packed bits tests.
+ *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_intsize(void)
+{
+    hid_t fid, attr, space, root;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE69, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Attribute of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT8, dsetu8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT16, dsetu16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT32, dsetu32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT64, dsetu64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT8, dset8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT16, dset16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT32, dset32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT64, dset64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, dsetdbl);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_charsets
+ *
+ * Purpose:     Generate a file to be used in the character set test
+ *              Contains:
+ *              1) a ascii datatype
+ *              2) a utf8 datatype
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_charsets(void)
+{
+    hid_t fid, did, sid;
+    herr_t status;
+    hsize_t dim[] = {1}; /* Dataspace dimensions */
+    typedef struct CharSetInfo {
+            const char *ascii_p_;
+            const char *utf8_p_;
+    } CharSetInfo;
+
+    hid_t charset_dtid = H5Tcreate( H5T_COMPOUND, sizeof( CharSetInfo ) );
+    hid_t ascii_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
+    hid_t utf8_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
+    const char * writeData[] = { "ascii", "utf8", };
+
+    sid = H5Screate_simple( 1, dim, NULL );
+    fid = H5Fcreate( FILE68, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
+    status = H5Tset_cset( ascii_dtid, H5T_CSET_ASCII );
+    HDassert(status >= 0);
+    H5Tinsert( charset_dtid, "ascii", HOFFSET(CharSetInfo, ascii_p_ ), ascii_dtid );
+
+    status = H5Tset_cset( utf8_dtid, H5T_CSET_UTF8 );
+    HDassert(status >= 0);
+    H5Tinsert( charset_dtid, "utf8", HOFFSET( CharSetInfo, utf8_p_ ), utf8_dtid );
+
+    did = H5Dcreate2( fid, "CharSets", charset_dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
+
+    status = H5Dwrite( did, charset_dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, writeData );
+    HDassert(status >= 0);
+
+    H5Tclose( charset_dtid );
+    H5Tclose( ascii_dtid );
+    H5Tclose( utf8_dtid );
+    H5Sclose( sid );
+    H5Dclose( did );
+    H5Fclose( fid );
+}
+
+static void gent_compound_intsizes(void) {
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
+            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
+            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
+            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
+            int8_t  dset8[F70_XDIM][F70_YDIM8];
+            int16_t dset16[F70_XDIM][F70_YDIM16];
+            int32_t dset32[F70_XDIM][F70_YDIM32];
+            int64_t dset64[F70_XDIM][F70_YDIM64];
+            double  dsetdbl[F70_XDIM][F70_YDIM8];
+    } Array1Struct;
+    Array1Struct Array1[F70_LENGTH];
+
+    hid_t Array1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n, o; /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F70_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu8[n][0] = valu8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu8[n][o] = (uint8_t)(Array1[m].dsetu8[n][o-1] << 1);
+            }
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu16[n][0] = valu16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu16[n][o] = (uint16_t)(Array1[m].dsetu16[n][o-1] << 1);
+            }
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu32[n][0] = valu32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
+            }
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu64[n][0] = valu64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
+            }
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset8[n][0] = val8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset8[n][o] = (int8_t)(Array1[m].dset8[n][o-1] << 1);
+            }
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset16[n][0] = val16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset16[n][o] = (int16_t)(Array1[m].dset16[n][o-1] << 1);
+            }
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset32[n][0] = val32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
+            }
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset64[n][0] = val64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
+            }
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            for(o = 0; o < (int)dims[1]; o++)
+                Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F70_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE70, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F70_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Array1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+static void gent_compound_attr_intsizes(void) {
+    hid_t fid, attr, space, root;
+    hsize_t dims[2];
+    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
+            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
+            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
+            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
+            int8_t  dset8[F70_XDIM][F70_YDIM8];
+            int16_t dset16[F70_XDIM][F70_YDIM16];
+            int32_t dset32[F70_XDIM][F70_YDIM32];
+            int64_t dset64[F70_XDIM][F70_YDIM64];
+            double  dsetdbl[F70_XDIM][F70_YDIM8];
+    } Array1Struct;
+    Array1Struct Array1[F70_LENGTH];
+
+    hid_t Array1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n, o; /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F70_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu8[n][0] = valu8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu8[n][o] = (uint8_t)(Array1[m].dsetu8[n][o-1] << 1);
+            }
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu16[n][0] = valu16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu16[n][o] = (uint16_t)(Array1[m].dsetu16[n][o-1] << 1);
+            }
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu32[n][0] = valu32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
+            }
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu64[n][0] = valu64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
+            }
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset8[n][0] = val8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset8[n][o] = (int8_t)(Array1[m].dset8[n][o-1] << 1);
+            }
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset16[n][0] = val16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset16[n][o] = (int16_t)(Array1[m].dset16[n][o-1] << 1);
+            }
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset32[n][0] = val32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
+            }
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset64[n][0] = val64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
+            }
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            for(o = 0; o < (int)dims[1]; o++)
+                Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F70_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE71, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Create the Attribute  */
+    attr = H5Acreate2(root, F71_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the attribute                                      */
+    status = H5Awrite(attr, Array1Structid, Array1);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Aclose(attr);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+static void gent_nested_compound_dt(void) {       /* test nested data type */
+    hid_t fid, group, dataset, space, type, create_plist, type1, type2;
+    hid_t array_dt, enum_dt;
+    enumtype val;
+
+    typedef struct {
+            int a;
+            float b;
+    } dset1_t;
+    dset1_t dset1[10];
+
+    typedef struct {
+            int a;
+            float b;
+            enumtype c;
+    } dset2_t;
+    dset2_t dset2[10];
+
+    typedef struct {
+            int a[5];
+            float b[5][6];
+            dset1_t c;
+    } dset3_t;
+    dset3_t dset3[10];
+
+    enumtype dset4[] = {RED, GREEN, BLUE, GREEN, WHITE, BLUE};
+
+    int i, j, k;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim, maxdim;
+
+    sdim = 10;
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i + (float)i * 0.1F);
+        dset2[i].c = GREEN;
+
+        for(j = 0; j < 5; j++) {
+            dset3[i].a[j] = i * j;
+            for(k = 0; k < 6; k++) {
+                dset3[i].b[j][k] = (float)((float)i * (float)j * (float)k * 1.0F);
+            }
+        }
+        dset3[i].c.a = i;
+        dset3[i].c.b = (float)((float)i * 1.0F);
+    }
+
+    fid = H5Fcreate(FILE72, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
+
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+    /* Create the shared enumerated datatype. */
+    enum_dt = H5Tenum_create (H5T_NATIVE_INT);
+    val = (enumtype) RED;
+    H5Tenum_insert (enum_dt, "Red", &val);
+    val = (enumtype) GREEN;
+    H5Tenum_insert (enum_dt, "Green", &val);
+    val = (enumtype) BLUE;
+    H5Tenum_insert (enum_dt, "Blue", &val);
+    val = (enumtype) WHITE;
+    H5Tenum_insert (enum_dt, "White", &val);
+    val = (enumtype) BLACK;
+    H5Tenum_insert (enum_dt, "Black", &val);
+    H5Tcommit2(fid, "enumtype", enum_dt,  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2[0]));
+
+    H5Tinsert(type2, "a_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset2_t, c), enum_dt);
+
+    dataset = H5Dcreate2(fid, "/dset2", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Tclose(type2);
+
+    dataset = H5Dcreate2(fid, "/dset4", enum_dt, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    H5Dwrite(dataset, enum_dt, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(enum_dt);
+    H5Dclose(dataset);
+
+    /* shared data type 1 */
+    type1 = H5Tcreate(H5T_COMPOUND, sizeof(dset1_t));
+    H5Tinsert(type1, "int_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
+    H5Tinsert(type1, "float_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
+    H5Tcommit2(fid, "type1", type1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 5;
+    array_dt = H5Tarray_create2(H5T_STD_I32LE, ndims, dim);
+    H5Tinsert(type2, "int_name", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+    array_dt = H5Tarray_create2(H5T_IEEE_F32LE, ndims, dim);
+    H5Tinsert(type2, "float_name", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tinsert (type2, "cmpd_name", HOFFSET (dset3_t, c), type1);
+
+    dataset = H5Dcreate2(group, "dset3", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+
+    dataset = H5Dcreate2(fid, "/dset5", type1, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    H5Dwrite(dataset, type1, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type1);
+    H5Tclose(type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    H5Pclose(create_plist);
+
+    H5Fclose(fid);
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump scalar tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intscalars(void)
+{
+    hid_t fid, dataset, space, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE73, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_attr_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump attribute scalar tests.
+ *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_intscalars(void)
+{
+    hid_t fid, attr, space, root, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE74, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Attribute of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Awrite(attr, tid, dsetu8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Awrite(attr, tid, dsetu16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dsetu32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dsetu64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Awrite(attr, tid, dset8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Awrite(attr, tid, dset16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dset32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dset64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Awrite(attr, tid, dsetdbl);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_string_scalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump string scalar tests.
+ *   A dataset of string types are created.
+ *   An attribute of string types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_string_scalars(void)
+{
+    hid_t fid, attr, dataset, space, tid, root;
+    hsize_t dims[2];
+    char  string[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE75, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* string scalar */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tcopy(H5T_C_S1);
+    H5Tset_size(tid, F73_XDIM * F73_YDIM8);
+
+    memset(string, ' ', F73_XDIM * F73_YDIM8);
+    for(i = 0; i < dims[0]; i++) {
+        string[i][0] = (char)('A' + i);
+        for(j = 1; j < dims[1]; j++) {
+            string[i][j] = (char)(string[i][j-1] + 1);
+        }
+    }
+    string[dims[0]-1][dims[1]-1] = 0;
+
+    /* Dataset of string scalar */
+    dataset = H5Dcreate2(fid, "the_str", tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, string);
+    H5Dclose(dataset);
+
+    /* attribute of string scalar */
+    attr = H5Acreate2(root, "attr_str", tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, string);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+static void gent_compound_int_array(void) {
+    hid_t fid, dataset, space;
+    hsize_t dims[1];
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    hsize_t    array_dim8[]={F76_DIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F76_DIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F76_DIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F76_DIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    /* Structure and array for compound types                             */
+    typedef struct Cmpd1Struct {
+            uint8_t  dsetu8[F76_DIM8];
+            uint16_t dsetu16[F76_DIM16];
+            uint32_t dsetu32[F76_DIM32];
+            uint64_t dsetu64[F76_DIM64];
+            int8_t  dset8[F76_DIM8];
+            int16_t dset16[F76_DIM16];
+            int32_t dset32[F76_DIM32];
+            int64_t dset64[F76_DIM64];
+            double  dsetdbl[F76_DIM8];
+    } Cmpd1Struct;
+    Cmpd1Struct Cmpd1[F76_LENGTH];
+
+    hid_t Cmpd1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F76_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n; /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F76_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F76_DIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu8[n] = valu8bits;
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F76_DIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu16[n] = valu16bits;
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F76_DIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu32[n] = valu32bits;
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F76_DIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu64[n] = valu64bits;
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F76_DIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset8[n] = val8bits;
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F76_DIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset16[n] = val16bits;
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F76_DIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset32[n] = val32bits;
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F76_DIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset64[n] = val64bits;
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F76_DIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            Cmpd1[m].dsetdbl[n] = 0.0001F + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F76_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F76_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F76_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F76_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F76_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F76_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F76_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F76_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F76_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE76, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
+    HDassert(Cmpd1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F76_DATASETNAME, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+static void gent_compound_ints(void) {
+    hid_t fid, dataset, space;
+    uint8_t  valu8bits = (uint8_t) ~0u;  /* all 1s */
+    uint16_t valu16bits = (uint16_t) ~0u;  /* all 1s */
+    uint32_t valu32bits = (uint32_t) ~0u;  /* all 1s */
+    uint64_t valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+    int8_t  val8bits = (int8_t) ~0;  /* all 1s */
+    int16_t val16bits = (int16_t) ~0;  /* all 1s */
+    int32_t val32bits = (int32_t) ~0;  /* all 1s */
+    int64_t val64bits = (int64_t) ~0L;  /* all 1s */
+    /* Structure and array for compound types                             */
+    typedef struct Cmpd1Struct {
+            uint8_t  dsetu8;
+            uint16_t dsetu16;
+            uint32_t dsetu32;
+            uint64_t dsetu64;
+            int8_t  dset8;
+            int16_t dset16;
+            int32_t dset32;
+            int64_t dset64;
+            double  dsetdbl;
+    } Cmpd1Struct;
+    Cmpd1Struct Cmpd1[F77_LENGTH];
+
+    typedef struct Cmpd2Struct {
+            uint64_t dsetu64;
+            uint32_t dsetu32;
+            uint16_t dsetu16;
+            uint8_t  dsetu8;
+            int64_t dset64;
+            int32_t dset32;
+            int16_t dset16;
+            int8_t  dset8;
+            double  dsetdbl;
+    } Cmpd2Struct;
+    Cmpd2Struct Cmpd2[F77_LENGTH];
+
+    hid_t Cmpd1Structid; /* File datatype identifier */
+    hid_t Cmpd2Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F77_LENGTH }; /* Dataspace dimensions     */
+
+    int m; /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F77_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        if((m % F76_DIM8) == 0)
+            valu8bits = (uint8_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu8 = valu8bits;
+        Cmpd2[m].dsetu8 = valu8bits;
+        valu8bits = (uint8_t)(valu8bits << 1);
+
+        /* Array of 16 bits unsigned int */
+        if((m % F76_DIM16) == 0)
+            valu16bits = (uint16_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu16 = valu16bits;
+        Cmpd2[m].dsetu16 = valu16bits;
+        valu16bits = (uint16_t)(valu16bits << 1);
+
+        /* Array of 32 bits unsigned int */
+        if((m % F76_DIM32) == 0)
+            valu32bits = (uint32_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu32 = valu32bits;
+        Cmpd2[m].dsetu32 = valu32bits;
+        valu32bits <<= 1;
+
+        /* Array of 64 bits unsigned int */
+        if((m % F76_DIM64) == 0)
+            valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        Cmpd1[m].dsetu64 = valu64bits;
+        Cmpd2[m].dsetu64 = valu64bits;
+        valu64bits <<= 1;
+
+        /* Array of 8 bits signed int */
+        if((m % F76_DIM8) == 0)
+            val8bits = (int8_t) ~0;  /* all 1s */
+        Cmpd1[m].dset8 = val8bits;
+        Cmpd2[m].dset8 = val8bits;
+        val8bits = (int8_t)(val8bits << 1);
+
+        /* Array of 16 bits signed int */
+        if((m % F76_DIM16) == 0)
+            val16bits = (int16_t) ~0;  /* all 1s */
+        Cmpd1[m].dset16 = val16bits;
+        Cmpd2[m].dset16 = val16bits;
+        val16bits = (int16_t)(val16bits << 1);
+
+        /* Array of 32 bits signed int */
+        if((m % F76_DIM32) == 0)
+            val32bits = (int32_t) ~0;  /* all 1s */
+        Cmpd1[m].dset32 = val32bits;
+        Cmpd2[m].dset32 = val32bits;
+        val32bits <<= 1;
+
+        /* Array of 64 bits signed int */
+        if((m % F76_DIM64) == 0)
+            val64bits = (int64_t) ~0L;  /* all 1s */
+        Cmpd1[m].dset64 = val64bits;
+        Cmpd2[m].dset64 = val64bits;
+        val64bits <<= 1;
+
+        /* Double Dummy set for failure tests */
+        Cmpd1[m].dsetdbl = 0.0001F + (float)m;
+        Cmpd2[m].dsetdbl = 0.0001F + (float)m;
+    }
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE77, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
+    HDassert(Cmpd1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), H5T_NATIVE_UCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), H5T_NATIVE_USHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), H5T_NATIVE_UINT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), H5T_NATIVE_ULONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), H5T_NATIVE_SCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), H5T_NATIVE_SHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), H5T_NATIVE_LONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), H5T_NATIVE_DOUBLE);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F77_DATASETNAME1, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd1Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd2Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd2Struct));
+    HDassert(Cmpd2Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU64, HOFFSET(Cmpd2Struct, dsetu64), H5T_NATIVE_ULONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU32, HOFFSET(Cmpd2Struct, dsetu32), H5T_NATIVE_UINT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU16, HOFFSET(Cmpd2Struct, dsetu16), H5T_NATIVE_USHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU08, HOFFSET(Cmpd2Struct, dsetu8), H5T_NATIVE_UCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS64, HOFFSET(Cmpd2Struct, dset64), H5T_NATIVE_LONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS32, HOFFSET(Cmpd2Struct, dset32), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS16, HOFFSET(Cmpd2Struct, dset16), H5T_NATIVE_SHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS08, HOFFSET(Cmpd2Struct, dset8), H5T_NATIVE_SCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DUMMYDBL, HOFFSET(Cmpd2Struct, dsetdbl), H5T_NATIVE_DOUBLE);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F77_DATASETNAME2, Cmpd2Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd2Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd2);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd2Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump scalar with attribute tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intattrscalars(void)
+{
+    hid_t fid, attr, dataset, space, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE78, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    /* Attribute of 8 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu8);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    /* Attribute of 16 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu16);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    /* Attribute of 32 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu32);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    /* Attribute of 64 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu64);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    /* Attribute of 8 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset8);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    /* Attribute of 16 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset16);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    /* Attribute of 32 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset32);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    /* Attribute of 64 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset64);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+    /* Attribute of double */
+    attr = H5Acreate2(dataset, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetdbl);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_packedbits
+ *
+ * Purpose:     Generate a file to be used in the h5dump packed bits tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ * Created:  Albert Cheng, 2010/5/10.
+ * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intsattrs(void)
+{
+    hid_t fid, attr, dataset, space, aspace;
+    hsize_t dims[2], adims[1];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   asetu8[F66_XDIM*F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], asetu16[F66_XDIM*F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], asetu32[F66_XDIM*F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], asetu64[F66_XDIM*F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   aset8[F66_XDIM*F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], aset16[F66_XDIM*F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], aset32[F66_XDIM*F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], aset64[F66_XDIM*F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8], asetdbl[F66_XDIM*F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE79, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        asetu8[i*dims[1]] = dsetu8[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+            asetu8[i*dims[1]+j] = dsetu8[i][j];
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    /* Attribute of 8 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU08, H5T_STD_U8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT8, asetu8);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        asetu16[i*dims[1]] = dsetu16[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+            asetu16[i*dims[1]+j] = dsetu16[i][j];
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    /* Attribute of 16 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM16;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU16, H5T_STD_U16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT16, asetu16);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        asetu32[i*dims[1]] = dsetu32[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+            asetu32[i*dims[1]+j] = dsetu32[i][j];
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    /* Attribute of 32 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM32;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU32, H5T_STD_U32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT32, asetu32);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        asetu64[i*dims[1]] = dsetu64[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+            asetu64[i*dims[1]+j] = dsetu64[i][j];
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    /* Attribute of 64 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM64;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU64, H5T_STD_U64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT64, asetu64);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        aset8[i*dims[1]] = dset8[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+            aset8[i*dims[1]+j] = dset8[i][j];
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    /* Attribute of 8 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS08, H5T_STD_I8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT8, aset8);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        aset16[i*dims[1]] = dset16[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+            aset16[i*dims[1]+j] = dset16[i][j];
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    /* Attribute of 16 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM16;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS16, H5T_STD_I16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT16, aset16);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        aset32[i*dims[1]] = dset32[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+            aset32[i*dims[1]+j] = dset32[i][j];
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    /* Attribute of 32 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM32;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS32, H5T_STD_I32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT32, aset32);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        aset64[i*dims[1]] = dset64[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+            aset64[i*dims[1]+j] = dset64[i][j];
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    /* Attribute of 64 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM64;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS64, H5T_STD_I64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT64, aset64);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++) {
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+            asetdbl[i*dims[1]+j] = dsetdbl[i][j];
+        }
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+    /* Attribute of double */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DUMMYDBL, H5T_IEEE_F64BE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, asetdbl);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+static void gent_bitnopaquefields(void)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+        unsigned char   a;
+        unsigned int    b;
+        unsigned long    c;
+        unsigned long long    d;
+    } s_t;
+    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
+    size_t  i;
+    hsize_t  nelmts = F80_DIM32;
+    unsigned char buf[F80_DIM32];    /* bitfield, opaque */
+    unsigned int buf2[F80_DIM32];    /* bitfield, opaque */
+    unsigned long buf3[F80_DIM32];    /* bitfield, opaque */
+    unsigned long long buf4[F80_DIM32];    /* bitfield, opaque */
+    s_t      buf5[F80_DIM32];        /* compound */
+
+    file = H5Fcreate(FILE80, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((grp = H5Gcreate2(file, "bittypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* bitfield_1 */
+        if ((type = H5Tcopy(H5T_STD_B8LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_2 */
+        if ((type = H5Tcopy(H5T_STD_B16LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_3 */
+        if ((type = H5Tcopy(H5T_STD_B32LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_3", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf3[i] = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_4 */
+        if ((type = H5Tcopy(H5T_STD_B64LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf4[i] = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf4);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        H5Gclose(grp);
+    }
+
+    if ((grp = H5Gcreate2(file, "opaquetypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* opaque_1 */
+        if ((type = H5Tcreate(H5T_OPAQUE, 1)) >= 0) {
+            if ((H5Tset_tag(type, "1-byte opaque type")) >= 0) {
+                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                    if ((dset = H5Dcreate2(grp, "opaque_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                        for(i = 0; i < nelmts; i++)
+                            buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+                        H5Dclose(dset);
+                    }
+                    H5Sclose(space);
+                }
+            }
+            H5Tclose(type);
+        }
+
+        /* opaque_2 */
+        if ((type = H5Tcreate(H5T_OPAQUE, 2)) >= 0) {
+            if ((H5Tset_tag(type, "2-byte opaque type")) >= 0) {
+                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                    if ((dset = H5Dcreate2(grp, "opaque_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                        for(i = 0; i < nelmts; i++)
+                            buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+
+                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+                        H5Dclose(dset);
+                    }
+                    H5Sclose(space);
+                }
+            }
+            H5Tclose(type);
+        }
+        H5Gclose(grp);
+    }
+
+    if ((grp = H5Gcreate2(file, "cmpdtypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* compound_1 */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+            H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+            H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+            H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+            H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for(i = 0; i < nelmts; i++) {
+                        buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+                        buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                        buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                        buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                    }
+
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+        H5Gclose(grp);
+    }
+
+    H5Fclose(file);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intsfourdims
+ *
+ * Purpose:     Generate a file to be used in the h5dump subsetting tests.
+ *   One datasets of unsigned int types are created in four dimensions 2,4,6,10.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intsfourdims(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[F81_RANK];
+    uint32_t dset1[F81_ZDIM][F81_YDIM][F81_XDIM][F81_WDIM];
+    unsigned int i, j, k, l;
+
+    fid = H5Fcreate(FILE81, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F81_ZDIM; dims[1] = F81_YDIM; dims[2] = F81_XDIM; dims[3] = F81_WDIM;
+    space = H5Screate_simple(F81_RANK, dims, NULL);
+    dataset = H5Dcreate2(fid, F81_DATASETNAME, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < F81_ZDIM; i++)
+        for(j = 0; j < F81_YDIM; j++)
+            for(k = 0; k < F81_XDIM; k++)
+                for(l = 0; l < F81_WDIM; l++)
+            dset1[i][j][k][l] = i*F81_YDIM*F81_XDIM*F81_WDIM + j*F81_XDIM*F81_WDIM + k*F81_WDIM + l;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_compound_complex2
+ *
+ * Purpose:     Generate a file to be used in testing compound datatypes of
+ *   various sizes, dimensions, member types and nesting.
+ *-------------------------------------------------------------------------
+ */
+static void gent_compound_complex2(void)
+{
+    /* Third-level nested compound */
+    typedef struct {
+        short  deep_nested_short[10];
+        int    deep_nested_int[10];
+        long   deep_nested_long[10];
+        double deep_nested_double[10];
+        float  deep_nested_float[10];
+    } third_level_compound;
+
+    /* Second-level multiply-nested compounds */
+    typedef struct {
+        unsigned int  multiple_nested_a[5];
+        int           multiple_nested_b[5];
+        unsigned long multiple_nested_c[5];
+        long          multiple_nested_d[5];
+    } further_nested;
+
+    typedef struct {
+        char further_nested_string[11];
+        char further_nested_string_array[4][13];
+        third_level_compound deep_nest;
+    } further_nested2;
+
+    /* First First-level nested compound */
+    typedef struct
+    {
+        double nested_a;
+        char   nested_string[23];
+        char   nested_string_array[4][12];
+    } nested_compound;
+
+    /* Second First-level nested compound */
+    typedef struct
+    {
+        float           a;
+        further_nested  b;
+        further_nested2 c;
+    } multiple_nested_compound;
+
+    /* Compound datatype with different member types */
+    typedef struct
+    {
+        /* Arrays nested inside compound */
+        unsigned int             a[4];
+        int                      b[6];
+        float                    c[2][4];
+        nested_compound          d;   /* Compound inside compound */
+        multiple_nested_compound e;   /* Compound inside compound with further nested compound */
+    } compound;
+
+    compound        buf[F82_DIM32];        /* compound */
+
+    hid_t file, grp=-1, type=-1, space=-1, dset=-1;
+    hid_t dset_array_a, dset_array_b, dset_array_c;
+    hid_t cmpd_tid1, cmpd_tid2, cmpd_tid3;
+    size_t  i;
+    size_t j, k;
+    unsigned dset_array_ndims;
+    hsize_t  dset_array_a_dims[1], dset_array_b_dims[1], dset_array_c_dims[2];
+    hsize_t  nelmts = F82_DIM32;
+
+    file = H5Fcreate(FILE82, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((space = H5Screate_simple(F82_RANK, &nelmts, NULL)) >= 0) {
+        /* CompoundComplex1D */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(compound))) >= 0) {
+            /* Insert top-level array members */
+            dset_array_ndims = 1; dset_array_a_dims[0] = 4;
+            dset_array_a = H5Tarray_create2(H5T_STD_U32LE, dset_array_ndims, dset_array_a_dims);
+            H5Tinsert(type, "a", HOFFSET(compound, a), dset_array_a);
+            H5Tclose(dset_array_a);
+
+            dset_array_ndims = 1; dset_array_b_dims[0] = 6;
+            dset_array_b = H5Tarray_create2(H5T_STD_I32LE, dset_array_ndims, dset_array_b_dims);
+            H5Tinsert(type, "b", HOFFSET(compound, b), dset_array_b);
+            H5Tclose(dset_array_b);
+
+            dset_array_ndims = 2; dset_array_c_dims[0] = 2; dset_array_c_dims[1] = 4;
+            dset_array_c = H5Tarray_create2(H5T_IEEE_F32LE, dset_array_ndims, dset_array_c_dims);
+            H5Tinsert(type, "c", HOFFSET(compound, c), dset_array_c);
+            H5Tclose(dset_array_c);
+
+            /* Insert first nested compound */
+            hid_t str_type, array;
+            hsize_t dims[1];
+            cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(nested_compound));
+
+            H5Tinsert(cmpd_tid1, "nested_double", HOFFSET(nested_compound, nested_a), H5T_IEEE_F64LE);
+
+            dims[0] = 1;
+            str_type = mkstr(23, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(cmpd_tid1, "nested_string", HOFFSET(nested_compound, nested_string), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            dims[0] = 4;
+            str_type = mkstr(12, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(cmpd_tid1, "nested_string_array", HOFFSET(nested_compound, nested_string_array), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            H5Tinsert(type, "nested_compound", HOFFSET(compound, d), cmpd_tid1);
+
+            /* Insert second nested compound */
+            hid_t nest1, nest2;
+            cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(multiple_nested_compound));
+
+            H5Tinsert(cmpd_tid2, "nested_float", HOFFSET(multiple_nested_compound, a), H5T_IEEE_F32LE);
+
+            /* Add first further nested compound */
+            nest1 = H5Tcreate(H5T_COMPOUND, sizeof(further_nested));
+
+            dims[0] = 5;
+            array = H5Tarray_create2(H5T_STD_U32LE, 1, dims);
+            H5Tinsert(nest1, "nested_unsigned_int", HOFFSET(further_nested, multiple_nested_a), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I32LE, 1, dims);
+            H5Tinsert(nest1, "nested_int", HOFFSET(further_nested, multiple_nested_b), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_U64LE, 1, dims);
+            H5Tinsert(nest1, "nested_unsigned_long", HOFFSET(further_nested, multiple_nested_c), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I64LE, 1, dims);
+            H5Tinsert(nest1, "nested_long", HOFFSET(further_nested, multiple_nested_d), array);
+            H5Tclose(array);
+
+            H5Tinsert(cmpd_tid2, "further_nested_compoundA", HOFFSET(multiple_nested_compound, b), nest1);
+            H5Tclose(nest1);
+
+            /* Add second further nested compound */
+            nest2 = H5Tcreate(H5T_COMPOUND, sizeof(further_nested2));
+
+            dims[0] = 1;
+            str_type = mkstr(11, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(nest2, "nested_string", HOFFSET(further_nested2, further_nested_string), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            dims[0] = 4;
+            str_type = mkstr(13, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(nest2, "nested_string_array", HOFFSET(further_nested2, further_nested_string_array), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            /* Add a final third-level nested compound to this second-level compound */
+            cmpd_tid3 = H5Tcreate(H5T_COMPOUND, sizeof(third_level_compound));
+
+            dims[0] = 10;
+            array = H5Tarray_create2(H5T_STD_I16LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_short", HOFFSET(third_level_compound, deep_nested_short), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I32LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_int", HOFFSET(third_level_compound, deep_nested_int), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I64LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_long", HOFFSET(third_level_compound, deep_nested_long), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_IEEE_F64LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_double", HOFFSET(third_level_compound, deep_nested_double), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_IEEE_F32LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_float", HOFFSET(third_level_compound, deep_nested_float), array);
+            H5Tclose(array);
+
+            H5Tinsert(nest2, "deep_nested_compound", HOFFSET(further_nested2, deep_nest), cmpd_tid3);
+
+            H5Tinsert(cmpd_tid2, "further_nested_compoundB", HOFFSET(multiple_nested_compound, c), nest2);
+            H5Tclose(nest2);
+
+            H5Tinsert(type, "multiple_nested_compound", HOFFSET(compound, e), cmpd_tid2);
+
+
+            if ((dset = H5Dcreate2(file, F82_DATASETNAME, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                for(i = 0; i < nelmts; i++) {
+                    for (j = 0; j < dset_array_a_dims[0]; j++)
+                        buf[i].a[j] = (unsigned int)(j + i*10);
+                    for (j = 0; j < dset_array_b_dims[0]; j++)
+                        buf[i].b[j] = (int)(j - i*10);
+                    for (j = 0; j < dset_array_c_dims[0]; j++)
+                        for (k = 0; k < dset_array_c_dims[1]; k++)
+                            buf[i].c[j][k] = (float)(j + k + i*10) + (float)(j) * 0.1F;
+
+                    /* Set up first nested compound */
+                    buf[i].d.nested_a = (double) i;
+
+                    strcpy(buf[i].d.nested_string, "This is a test string.");
+
+                    for (j = 0; j < 4; j++)
+                        strcpy(buf[i].d.nested_string_array[j], "String test");
+
+                    /* Set up multiple nested compound */
+                    buf[i].e.a = (float) i;
+
+                    for (j = 0; j < 5; j++) {
+                        buf[i].e.b.multiple_nested_a[j] = (unsigned int)(j + i*10);
+                        buf[i].e.b.multiple_nested_b[j] = (int)(j - i*10);
+                        buf[i].e.b.multiple_nested_c[j] = (unsigned long)(j + i*10);
+                        buf[i].e.b.multiple_nested_d[j] = (long)(j - i*10);
+                    }
+
+                    strcpy(buf[i].e.c.further_nested_string, "1234567890");
+                    for (j = 0; j < 4; j++)
+                        strcpy(buf[i].e.c.further_nested_string_array[j], "STRING ARRAY");
+
+                    for (j = 0; j < 10; j++) {
+                        buf[i].e.c.deep_nest.deep_nested_short[j] = (short)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_int[j] = (int)(j - i*10);
+                        buf[i].e.c.deep_nest.deep_nested_long[j] = (long)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_double[j] = (double)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_float[j] = (float)(j + i*10);
+                    }
+                }
+
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                    fprintf(stderr, "gent_tcompound_complex2 H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(type);
+        }
+        H5Tclose(cmpd_tid1);
+        H5Tclose(cmpd_tid2);
+        H5Tclose(cmpd_tid3);
+        H5Sclose(space);
+    }
+
+//    /* CompoundComplex2D */
+//    if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+//        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+//        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+//        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+//        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+//        if ((space = H5Screate_simple(F82_RANK2, &nelmts, NULL)) >= 0) {
+//            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+//                for(i = 0; i < nelmts; i++) {
+//                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+//                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+//                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+//                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+//                }
+//
+//                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+//                H5Dclose(dset);
+//            }
+//            H5Sclose(space);
+//        }
+//        H5Tclose(type);
+//    }
+//
+//    /* CompoundComplex3D */
+//    if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+//        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+//        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+//        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+//        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+//        if ((space = H5Screate_simple(F82_RANK3, &nelmts, NULL)) >= 0) {
+//            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+//                for(i = 0; i < nelmts; i++) {
+//                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+//                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+//                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+//                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+//                }
+//
+//                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+//                H5Dclose(dset);
+//            }
+//            H5Sclose(space);
+//        }
+//        H5Tclose(type);
+//    }
+//
+//    /* CompoundComplex4D */
+//    if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+//        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+//        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+//        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+//        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+//        if ((space = H5Screate_simple(F82_RANK4, &nelmts, NULL)) >= 0) {
+//            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+//                for(i = 0; i < nelmts; i++) {
+//                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+//                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+//                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+//                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+//                }
+//
+//                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+//                H5Dclose(dset);
+//            }
+//            H5Sclose(space);
+//        }
+//        H5Tclose(type);
+//    }
+
+    H5Fclose(file);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_vlenstr_array
+ *
+ * Purpose:     Generate a file to be used in testing Arrays of variable
+ *              length strings.
+ *-------------------------------------------------------------------------
+ */
+static void gent_vlenstr_array(void)
+{
+    /* Compound datatype with different member types */
+    typedef struct compound
+    {
+        /* Array of variable-length strings*/
+        const char *vlen_array[F83_ARRAYDIM];
+    } compound;
+    compound        buf[F83_DIM];
+
+    const char *test[F83_ARRAYDIM] = {
+            "This is a variable-length test string.",
+            "This test string is also variable-length.",
+            "A final test of variable-length strings. This string is longer than the others."
+    };
+    const char    *buffer[F83_DIM*F83_ARRAYDIM];
+
+    hid_t  file, type=-1, space=-1, dset=-1;
+    hid_t cmpd_tid1, array_tid;
+    int i, j;
+
+    hsize_t dims[] = {F83_DIM}, arraydim[] = {F83_ARRAYDIM};
+    /* Initialize scalar data */
+    for (i = 0; i < F83_DIM; i++)
+        for (j = 0; j < 3; j++)
+            buffer[j + 3*i] = test[j];
+
+    /* Initialize compound data */
+    for (i = 0; i < F83_DIM; i++)
+        for (j = 0; j < 3; j++)
+            buf[i].vlen_array[j] = test[j];
+
+    file = H5Fcreate(FILE83, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((space = H5Screate_simple(F83_RANK, dims, NULL)) >= 0) {
+        array_tid = H5Tcopy(H5T_C_S1);
+        H5Tset_size(array_tid, H5T_VARIABLE);
+
+        /* ScalarArrayOfVlenStr */
+        if ((type = H5Tarray_create2(array_tid, F83_RANK, arraydim)) >= 0) {
+            if ((dset = H5Dcreate2(file, F83_DATASETNAME, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer) < 0)
+                    fprintf(stderr, "gent_vlenstr_array H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(type);
+        }
+        H5Tclose(array_tid);
+        H5Sclose(space);
+    }
+
+    if ((space = H5Screate_simple(F83_RANK, dims, NULL)) >= 0) {
+        /* CompoundArrayOfVlenStr */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(compound))) >= 0) {
+            cmpd_tid1 = H5Tcopy(H5T_C_S1);
+            H5Tset_size(cmpd_tid1, H5T_VARIABLE);
+
+            array_tid = H5Tarray_create2(cmpd_tid1, F83_RANK, arraydim);
+            H5Tinsert(type, "vlen_str_array", HOFFSET(compound, vlen_array), array_tid);
+
+            if ((dset = H5Dcreate2(file, F83_DATASETNAME2, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                    fprintf(stderr, "gent_vlenstr_array H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(cmpd_tid1);
+            H5Tclose(type);
+        }
+        H5Sclose(space);
+    }
+
+    H5Fclose(file);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int main(void)
+{
+    gent_group();
+    gent_attribute();
+    gent_softlink();
+    gent_softlink2();
+    gent_dataset();
+    gent_hardlink();
+    gent_extlink();
+    gent_udlink();
+    gent_compound_dt();
+    gent_all();
+    gent_loop();
+    gent_dataset2();
+    gent_compound_dt2();
+    gent_loop2();
+    gent_many();
+    gent_str();
+    gent_str2();
+    gent_enum();
+    gent_objref();
+    gent_datareg();
+    gent_attrreg();
+    gent_nestcomp();
+    gent_opaque();
+    gent_bitfields();
+    gent_vldatatypes();
+    gent_vldatatypes2();
+    gent_vldatatypes3();
+    gent_vldatatypes4();
+    gent_vldatatypes5();
+    gent_array1_big();
+    gent_array1();
+    gent_array2();
+    gent_array3();
+    gent_array4();
+    gent_array5();
+    gent_array6();
+    gent_array7();
+    gent_array8();
+    gent_empty();
+    gent_group_comments();
+    gent_split_file();
+    gent_family();
+    gent_multi();
+    gent_large_objname();
+    gent_vlstr();
+    gent_vlenstr_array();
+    gent_char();
+    gent_attr_all();
+    gent_compound_complex();
+    gent_compound_complex2();
+    gent_named_dtype_attr();
+    gent_null_space();
+    gent_zero_dim_size();
+
+    gent_filters();
+    gent_fvalues();
+    gent_fcontents();
+    gent_string();
+    gent_aindices();
+    gent_longlinks();
+    gent_ldouble();
+    gent_binary();
+    gent_bigdims();
+    gent_hyperslab();
+    gent_group_creation_order();
+    gent_attr_creation_order();
+    gent_fpformat();
+    gent_extlinks();
+    gent_packedbits();
+    gent_attr_intsize();
+    gent_charsets();
+    gent_compound_intsizes();
+    gent_compound_attr_intsizes();
+
+    gent_nested_compound_dt();
+    gent_intscalars();
+    gent_attr_intscalars();
+    gent_string_scalars();
+    gent_compound_int_array();
+    gent_compound_ints();
+    gent_intattrscalars();
+    gent_intsattrs();
+    gent_bitnopaquefields();
+
+    gent_intsfourdims();
+
+    return 0;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dump.sh.in b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dump.sh.in
new file mode 100644
index 0000000..a5e8c4e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dump.sh.in
@@ -0,0 +1,1342 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5dump tool
+
+srcdir=@srcdir@
+
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5dump
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../h5diff/h5diff           # The h5diff tool name 
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../h5import/h5import     # The h5import tool name 
+H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
+
+RM='rm -rf'
+CMP='cmp'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# Skip plugin module to test missing filter
+ENVCMD="env HDF5_PLUGIN_PRELOAD=::"
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/../"
+
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_ERRORFILES="$srcdir/errfiles"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/std
+test -d $TEST_P_DIR || mkdir -p $TEST_P_DIR
+test -d $TESTDIR || mkdir -p $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/charsets.h5
+$SRC_H5DUMP_TESTFILES/filter_fail.h5
+$SRC_H5DUMP_TESTFILES/packedbits.h5
+$SRC_H5DUMP_TESTFILES/taindices.h5
+$SRC_H5DUMP_TESTFILES/tall.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tarray1_big.h5
+$SRC_H5DUMP_TESTFILES/tarray2.h5
+$SRC_H5DUMP_TESTFILES/tarray3.h5
+$SRC_H5DUMP_TESTFILES/tarray4.h5
+$SRC_H5DUMP_TESTFILES/tarray5.h5
+$SRC_H5DUMP_TESTFILES/tarray6.h5
+$SRC_H5DUMP_TESTFILES/tarray7.h5
+$SRC_H5DUMP_TESTFILES/tarray8.h5
+$SRC_H5DUMP_TESTFILES/tattr.h5
+$SRC_H5DUMP_TESTFILES/tattr2.h5
+$SRC_H5DUMP_TESTFILES/tattr4_be.h5
+$SRC_H5DUMP_TESTFILES/tattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tattrreg.h5
+$SRC_H5DUMP_TESTFILES/tbigdims.h5
+$SRC_H5DUMP_TESTFILES/tbinary.h5
+$SRC_H5DUMP_TESTFILES/tchar.h5
+$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tcmpdintsize.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex2.h5
+$SRC_H5DUMP_TESTFILES/tdatareg.h5
+$SRC_H5DUMP_TESTFILES/tdset.h5
+$SRC_H5DUMP_TESTFILES/tempty.h5
+$SRC_H5DUMP_TESTFILES/tsoftlinks.h5
+$SRC_H5DUMP_TESTFILES/textlinkfar.h5
+$SRC_H5DUMP_TESTFILES/textlinksrc.h5
+$SRC_H5DUMP_TESTFILES/textlinktar.h5
+$SRC_H5DUMP_TESTFILES/textlink.h5
+$SRC_H5DUMP_TESTFILES/tfamily00000.h5
+$SRC_H5DUMP_TESTFILES/tfamily00001.h5
+$SRC_H5DUMP_TESTFILES/tfamily00002.h5
+$SRC_H5DUMP_TESTFILES/tfamily00003.h5
+$SRC_H5DUMP_TESTFILES/tfamily00004.h5
+$SRC_H5DUMP_TESTFILES/tfamily00005.h5
+$SRC_H5DUMP_TESTFILES/tfamily00006.h5
+$SRC_H5DUMP_TESTFILES/tfamily00007.h5
+$SRC_H5DUMP_TESTFILES/tfamily00008.h5
+$SRC_H5DUMP_TESTFILES/tfamily00009.h5
+$SRC_H5DUMP_TESTFILES/tfamily00010.h5
+$SRC_H5DUMP_TESTFILES/tfcontents1.h5
+$SRC_H5DUMP_TESTFILES/tfcontents2.h5
+$SRC_H5DUMP_TESTFILES/tfilters.h5
+$SRC_H5DUMP_TESTFILES/tfpformat.h5
+$SRC_H5DUMP_TESTFILES/tfvalues.h5
+$SRC_H5DUMP_TESTFILES/tgroup.h5
+$SRC_H5DUMP_TESTFILES/tgrp_comments.h5
+$SRC_H5DUMP_TESTFILES/thlink.h5
+$SRC_H5DUMP_TESTFILES/thyperslab.h5
+$SRC_H5DUMP_TESTFILES/tintsattrs.h5
+$SRC_H5DUMP_TESTFILES/tints4dims.h5
+$SRC_H5DUMP_TESTFILES/tlarge_objname.h5
+#$SRC_H5DUMP_TESTFILES/tldouble.h5
+$SRC_H5DUMP_TESTFILES/tlonglinks.h5
+$SRC_H5DUMP_TESTFILES/tloop.h5
+$SRC_H5DUMP_TESTFILES/tmulti-b.h5
+$SRC_H5DUMP_TESTFILES/tmulti-g.h5
+$SRC_H5DUMP_TESTFILES/tmulti-l.h5
+$SRC_H5DUMP_TESTFILES/tmulti-o.h5
+$SRC_H5DUMP_TESTFILES/tmulti-r.h5
+$SRC_H5DUMP_TESTFILES/tmulti-s.h5
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
+$SRC_H5DUMP_TESTFILES/tnestedcmpddt.h5
+$SRC_H5DUMP_TESTFILES/tno-subset.h5
+$SRC_H5DUMP_TESTFILES/tnullspace.h5
+$SRC_H5DUMP_TESTFILES/zerodim.h5
+$SRC_H5DUMP_TESTFILES/torderattr.h5
+$SRC_H5DUMP_TESTFILES/tordergr.h5
+$SRC_H5DUMP_TESTFILES/tsaf.h5
+$SRC_H5DUMP_TESTFILES/tscalarattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarintattrsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarintsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarstring.h5
+$SRC_H5DUMP_TESTFILES/tslink.h5
+$SRC_H5DUMP_TESTFILES/tsplit_file-m.h5
+$SRC_H5DUMP_TESTFILES/tsplit_file-r.h5
+$SRC_H5DUMP_TESTFILES/tstr.h5
+$SRC_H5DUMP_TESTFILES/tstr2.h5
+$SRC_H5DUMP_TESTFILES/tstr3.h5
+$SRC_H5DUMP_TESTFILES/tudlink.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
+$SRC_H5DUMP_TESTFILES/tvlenstr_array.h5
+$SRC_H5DUMP_TESTFILES/tvlstr.h5
+$SRC_H5DUMP_TESTFILES/tvms.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/charsets.ddl
+$SRC_H5DUMP_TESTFILES/filter_fail.ddl
+$SRC_H5DUMP_TESTFILES/non_existing.ddl
+$SRC_H5DUMP_TESTFILES/packedbits.ddl
+$SRC_H5DUMP_TESTFILES/tall-1.ddl
+$SRC_H5DUMP_TESTFILES/tall-2.ddl
+$SRC_H5DUMP_TESTFILES/tall-2A.ddl
+$SRC_H5DUMP_TESTFILES/tall-2A0.ddl
+$SRC_H5DUMP_TESTFILES/tall-2B.ddl
+$SRC_H5DUMP_TESTFILES/tall-3.ddl
+$SRC_H5DUMP_TESTFILES/tall-4s.ddl
+$SRC_H5DUMP_TESTFILES/tall-5s.ddl
+$SRC_H5DUMP_TESTFILES/tall-6.ddl
+$SRC_H5DUMP_TESTFILES/tall-6.exp
+$SRC_H5DUMP_TESTFILES/tall-7.ddl
+$SRC_H5DUMP_TESTFILES/tall-7N.ddl
+$SRC_H5DUMP_TESTFILES/tallfilters.ddl
+$SRC_H5DUMP_TESTFILES/tarray1.ddl
+$SRC_H5DUMP_TESTFILES/tarray1_big.ddl
+$SRC_H5DUMP_TESTFILES/tarray2.ddl
+$SRC_H5DUMP_TESTFILES/tarray3.ddl
+$SRC_H5DUMP_TESTFILES/tarray4.ddl
+$SRC_H5DUMP_TESTFILES/tarray5.ddl
+$SRC_H5DUMP_TESTFILES/tarray6.ddl
+$SRC_H5DUMP_TESTFILES/tarray7.ddl
+$SRC_H5DUMP_TESTFILES/tarray8.ddl
+$SRC_H5DUMP_TESTFILES/tattr-1.ddl
+$SRC_H5DUMP_TESTFILES/tattr-2.ddl
+$SRC_H5DUMP_TESTFILES/tattr-3.ddl
+$SRC_H5DUMP_TESTFILES/tattr-4_be.ddl
+$SRC_H5DUMP_TESTFILES/tattrcontents1.ddl
+$SRC_H5DUMP_TESTFILES/tattrcontents2.ddl
+$SRC_H5DUMP_TESTFILES/tattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tattrreg.ddl
+$SRC_H5DUMP_TESTFILES/tattrregR.ddl
+$SRC_H5DUMP_TESTFILES/tbin1.ddl
+$SRC_H5DUMP_TESTFILES/tbin1.ddl
+$SRC_H5DUMP_TESTFILES/tbin2.ddl
+$SRC_H5DUMP_TESTFILES/tbin3.ddl
+$SRC_H5DUMP_TESTFILES/tbin4.ddl
+$SRC_H5DUMP_TESTFILES/tbinregR.ddl
+$SRC_H5DUMP_TESTFILES/tbigdims.ddl
+$SRC_H5DUMP_TESTFILES/tboot1.ddl
+$SRC_H5DUMP_TESTFILES/tboot2.ddl
+$SRC_H5DUMP_TESTFILES/tboot2A.ddl
+$SRC_H5DUMP_TESTFILES/tboot2B.ddl
+$SRC_H5DUMP_TESTFILES/tchar1.ddl
+$SRC_H5DUMP_TESTFILES/tchunked.ddl
+$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tcmpdintsize.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-1.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-2.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-3.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-4.ddl
+$SRC_H5DUMP_TESTFILES/tcompound_complex2.ddl
+$SRC_H5DUMP_TESTFILES/tcompact.ddl
+$SRC_H5DUMP_TESTFILES/tcontents.ddl
+$SRC_H5DUMP_TESTFILES/tcontiguos.ddl
+$SRC_H5DUMP_TESTFILES/tdatareg.ddl
+$SRC_H5DUMP_TESTFILES/tdataregR.ddl
+$SRC_H5DUMP_TESTFILES/tdeflate.ddl
+$SRC_H5DUMP_TESTFILES/tdset-1.ddl
+$SRC_H5DUMP_TESTFILES/tdset-2.ddl
+$SRC_H5DUMP_TESTFILES/tdset-3s.ddl
+$SRC_H5DUMP_TESTFILES/tempty.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubstart.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubcount.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubstride.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubblock.ddl
+$SRC_H5DUMP_TESTFILES/texternal.ddl
+$SRC_H5DUMP_TESTFILES/textlinksrc.ddl
+$SRC_H5DUMP_TESTFILES/textlinkfar.ddl
+$SRC_H5DUMP_TESTFILES/textlink.ddl
+$SRC_H5DUMP_TESTFILES/tfamily.ddl
+$SRC_H5DUMP_TESTFILES/tfill.ddl
+$SRC_H5DUMP_TESTFILES/tfletcher32.ddl
+$SRC_H5DUMP_TESTFILES/tfpformat.ddl
+$SRC_H5DUMP_TESTFILES/tgroup-1.ddl
+$SRC_H5DUMP_TESTFILES/tgroup-2.ddl
+$SRC_H5DUMP_TESTFILES/tgrp_comments.ddl
+$SRC_H5DUMP_TESTFILES/thlink-1.ddl
+$SRC_H5DUMP_TESTFILES/thlink-2.ddl
+$SRC_H5DUMP_TESTFILES/thlink-3.ddl
+$SRC_H5DUMP_TESTFILES/thlink-4.ddl
+$SRC_H5DUMP_TESTFILES/thlink-5.ddl
+$SRC_H5DUMP_TESTFILES/thyperslab.ddl
+$SRC_H5DUMP_TESTFILES/tindicesno.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub1.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub2.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub3.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub4.ddl
+$SRC_H5DUMP_TESTFILES/tindicesyes.ddl
+$SRC_H5DUMP_TESTFILES/tints4dims.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsBlock2.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsBlockEq.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsCount2.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsCountEq.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsStride2.ddl
+$SRC_H5DUMP_TESTFILES/tintsattrs.ddl
+$SRC_H5DUMP_TESTFILES/tlarge_objname.ddl
+#$SRC_H5DUMP_TESTFILES/tldouble.ddl 
+$SRC_H5DUMP_TESTFILES/tlonglinks.ddl
+$SRC_H5DUMP_TESTFILES/tloop-1.ddl
+$SRC_H5DUMP_TESTFILES/tmulti.ddl
+$SRC_H5DUMP_TESTFILES/tmultifile.ddl
+$SRC_H5DUMP_TESTFILES/tqmarkfile.ddl
+$SRC_H5DUMP_TESTFILES/tstarfile.ddl
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.ddl
+$SRC_H5DUMP_TESTFILES/tnestcomp-1.ddl
+$SRC_H5DUMP_TESTFILES/tnestedcmpddt.ddl
+$SRC_H5DUMP_TESTFILES/tnbit.ddl
+$SRC_H5DUMP_TESTFILES/tnoattrdata.ddl
+$SRC_H5DUMP_TESTFILES/tnoattrddl.ddl
+$SRC_H5DUMP_TESTFILES/tnodata.ddl
+$SRC_H5DUMP_TESTFILES/tnoddl.ddl
+$SRC_H5DUMP_TESTFILES/tnoddlfile.ddl
+$SRC_H5DUMP_TESTFILES/tnoddlfile.exp
+$SRC_H5DUMP_TESTFILES/tno-subset.ddl
+$SRC_H5DUMP_TESTFILES/tnullspace.ddl
+$SRC_H5DUMP_TESTFILES/trawdatafile.ddl
+$SRC_H5DUMP_TESTFILES/trawdatafile.exp
+$SRC_H5DUMP_TESTFILES/trawssetfile.ddl
+$SRC_H5DUMP_TESTFILES/trawssetfile.exp
+$SRC_H5DUMP_TESTFILES/zerodim.ddl
+$SRC_H5DUMP_TESTFILES/tordergr1.ddl
+$SRC_H5DUMP_TESTFILES/tordergr2.ddl
+$SRC_H5DUMP_TESTFILES/tordergr3.ddl
+$SRC_H5DUMP_TESTFILES/tordergr4.ddl
+$SRC_H5DUMP_TESTFILES/tordergr5.ddl
+$SRC_H5DUMP_TESTFILES/torderattr1.ddl
+$SRC_H5DUMP_TESTFILES/torderattr2.ddl
+$SRC_H5DUMP_TESTFILES/torderattr3.ddl
+$SRC_H5DUMP_TESTFILES/torderattr4.ddl
+$SRC_H5DUMP_TESTFILES/tordercontents1.ddl
+$SRC_H5DUMP_TESTFILES/tordercontents2.ddl
+$SRC_H5DUMP_TESTFILES/torderlinks1.ddl
+$SRC_H5DUMP_TESTFILES/torderlinks2.ddl
+$SRC_H5DUMP_TESTFILES/tperror.ddl
+$SRC_H5DUMP_TESTFILES/treadfilter.ddl
+$SRC_H5DUMP_TESTFILES/treadintfilter.ddl
+$SRC_H5DUMP_TESTFILES/treference.ddl
+$SRC_H5DUMP_TESTFILES/tsaf.ddl
+$SRC_H5DUMP_TESTFILES/tscalarattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarintattrsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarintsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarstring.ddl
+$SRC_H5DUMP_TESTFILES/tscaleoffset.ddl
+$SRC_H5DUMP_TESTFILES/tshuffle.ddl
+$SRC_H5DUMP_TESTFILES/tslink-1.ddl
+$SRC_H5DUMP_TESTFILES/tslink-2.ddl
+$SRC_H5DUMP_TESTFILES/tslink-D.ddl
+$SRC_H5DUMP_TESTFILES/tsplit_file.ddl
+$SRC_H5DUMP_TESTFILES/tstr-1.ddl
+$SRC_H5DUMP_TESTFILES/tstr-2.ddl
+$SRC_H5DUMP_TESTFILES/tstr2bin2.exp
+$SRC_H5DUMP_TESTFILES/tstr2bin6.exp
+$SRC_H5DUMP_TESTFILES/tstring.ddl
+$SRC_H5DUMP_TESTFILES/tstring2.ddl
+$SRC_H5DUMP_TESTFILES/tstringe.ddl
+$SRC_H5DUMP_TESTFILES/tszip.ddl
+$SRC_H5DUMP_TESTFILES/tudlink-1.ddl
+$SRC_H5DUMP_TESTFILES/tudlink-2.ddl
+$SRC_H5DUMP_TESTFILES/tuserfilter.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes1.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes2.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes3.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes4.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes5.ddl
+$SRC_H5DUMP_TESTFILES/tvlenstr_array.ddl
+$SRC_H5DUMP_TESTFILES/tvlstr.ddl
+$SRC_H5DUMP_TESTFILES/tvms.ddl
+$SRC_H5DUMP_TESTFILES/twidedisplay.ddl
+$SRC_H5DUMP_TESTFILES/twithddl.exp
+$SRC_H5DUMP_TESTFILES/twithddlfile.ddl
+$SRC_H5DUMP_TESTFILES/twithddlfile.exp
+$SRC_H5DUMP_TESTFILES/h5dump-help.txt
+$SRC_H5DUMP_TESTFILES/out3.h5import
+$SRC_H5DUMP_TESTFILES/tbinregR.exp
+"
+
+LIST_ERROR_TEST_FILES="
+${SRC_H5DUMP_ERRORFILES}/filter_fail.err
+${SRC_H5DUMP_ERRORFILES}/non_existing.err
+${SRC_H5DUMP_ERRORFILES}/tall-1.err
+${SRC_H5DUMP_ERRORFILES}/tall-2A.err
+${SRC_H5DUMP_ERRORFILES}/tall-2A0.err
+${SRC_H5DUMP_ERRORFILES}/tall-2B.err
+${SRC_H5DUMP_ERRORFILES}/tarray1_big.err
+${SRC_H5DUMP_ERRORFILES}/tattr-3.err
+${SRC_H5DUMP_ERRORFILES}/tattrregR.err
+${SRC_H5DUMP_ERRORFILES}/tcomp-3.err
+${SRC_H5DUMP_ERRORFILES}/tdataregR.err
+${SRC_H5DUMP_ERRORFILES}/tdset-2.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubblock.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubcount.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubstart.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubstride.err
+${SRC_H5DUMP_ERRORFILES}/textlink.err
+${SRC_H5DUMP_ERRORFILES}/textlinkfar.err
+${SRC_H5DUMP_ERRORFILES}/textlinksrc.err
+${SRC_H5DUMP_ERRORFILES}/tgroup-2.err
+${SRC_H5DUMP_ERRORFILES}/torderlinks1.err
+${SRC_H5DUMP_ERRORFILES}/torderlinks2.err
+${SRC_H5DUMP_ERRORFILES}/tperror.err
+${SRC_H5DUMP_ERRORFILES}/tqmarkfile.err
+${SRC_H5DUMP_ERRORFILES}/tslink-D.err
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES $LIST_ERROR_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+    	        $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+                
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+# If $1 == ignorecase then do caseless CMP and DIFF.
+# ADD_H5_TEST
+TOOLTEST() {
+    # check if caseless compare and diff requested
+    if [ "$1" = ignorecase ]; then
+	caseless="-i"
+	# replace cmp with diff which runs much longer.
+	xCMP="$DIFF -i"
+	shift
+    else
+	caseless=""
+	# stick with faster cmp if ignorecase is not requested.
+	xCMP="$CMP"
+    fi
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+    cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+
+  if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $xCMP $expect $actual > /dev/null 2>&1 ; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $caseless $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actual_err $actual_sav $actual_err_sav $actual_ext
+    fi
+
+}
+
+
+# same as TOOLTEST1 but compares generated file to expected output
+#                   and compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o without -b
+# ADD_H5_EXPORT_TEST
+TOOLTEST2() {
+
+    expectdata="$TESTDIR/$1"
+    expect="$TESTDIR/`basename $1 .exp`.ddl"
+    actualdata="$TESTDIR/`basename $1 .exp`.txt"
+    actual="$TESTDIR/`basename $1 .exp`.out"
+    actual_err="$TESTDIR/`basename $1 .exp`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+      if [ ! -f $expectdata ]; then
+      # Create the expect data file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actualdata $expectdata
+      elif $CMP $expectdata $actualdata; then
+        echo " PASSED"
+      else
+        echo "*FAILED*"
+        echo "    Expected datafile (*.exp) differs from actual datafile (*.txt)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expectdata $actualdata |sed 's/^/    /'
+      fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+    
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actualdata $actual_err
+    fi
+
+}
+
+# same as TOOLTEST2 but compares generated file to expected ddl file 
+#                   and compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o without -b
+# ADD_H5_TEST_EXPORT
+TOOLTEST2A() {
+
+    expectdata="$TESTDIR/$1"
+    expect="$TESTDIR/`basename $1 .exp`.ddl"
+    actualdata="$TESTDIR/`basename $1 .exp`.txt"
+    actual="$TESTDIR/`basename $1 .exp`.out"
+    actual_err="$TESTDIR/`basename $1 .exp`.err"
+    shift
+    expectmeta="$TESTDIR/$1"
+    actualmeta="$TESTDIR/`basename $1 .exp`.txt"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+      if [ ! -f $expectdata ]; then
+      # Create the expect data file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actualdata $expectdata
+      elif $DIFF $expectdata $actualdata; then
+        if [ ! -f $expectmeta ]; then
+        # Create the expect meta file if it doesn't yet exist.
+          echo " CREATED"
+          cp $actualmeta $expectmeta
+        elif $CMP $expectmeta $actualmeta; then
+          echo " PASSED"
+        else
+          echo "*FAILED*"
+          echo "    Expected metafile (*.ddl) differs from actual metafile (*.txt)"
+          nerrors="`expr $nerrors + 1`"
+          test yes = "$verbose" && $DIFF $expectmeta $actualmeta |sed 's/^/    /'
+        fi
+      else
+        echo "*FAILED*"
+        echo "    Expected datafile (*.exp) differs from actual datafile (*.txt)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expectdata $actualdata |sed 's/^/    /'
+      fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+    
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actualdata $actual_err $actualmeta
+    fi
+
+}
+
+# same as TOOLTEST2 but only compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o with -b
+# ADD_H5_EXPORT_TEST
+TOOLTEST2B() {
+
+    expectdata="$TESTDIR/$1"
+    actualdata="$TESTDIR/`basename $1 .exp`.txt"
+    actual="$TESTDIR/`basename $1 .exp`.out"
+    actual_err="$TESTDIR/`basename $1 .exp`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expectdata ]; then
+    # Create the expect data file if it doesn't yet exist.
+      echo " CREATED"
+      cp $actualdata $expectdata
+    elif $CMP $expectdata $actualdata; then
+      echo " PASSED"
+    else
+      echo "*FAILED*"
+      echo "    Expected datafile (*.exp) differs from actual datafile (*.txt)"
+      nerrors="`expr $nerrors + 1`"
+      test yes = "$verbose" && $DIFF $expectdata $actualdata |sed 's/^/    /'
+    fi
+    
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actualdata $actual_err
+    fi
+
+}
+
+# same as TOOLTEST but filters error stack outp
+# Extract file name, line number, version and thread IDs because they may be different
+TOOLTEST3() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# same as TOOLTEST3 but filters error stack output and compares to an error file
+# Extract file name, line number, version and thread IDs because they may be different
+# ADD_H5ERR_MASK_TEST
+TOOLTEST4() {
+
+    expect="$TESTDIR/$1"
+    expect_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.oerr"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    #cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     if $CMP $expect_err $actual_ext; then
+      echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.err) differs from actual result (*.oerr)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect_err $actual_ext |sed 's/^/    /'
+    fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# same as TOOLTEST4 but disables plugin filter loading
+# silences extra error output on some platforms
+# ADD_H5ERR_MASK_TEST
+TOOLTEST5() {
+
+    expect="$TESTDIR/$1"
+    expect_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.oerr"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $ENVCMD $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    #cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     if $CMP $expect_err $actual_ext; then
+      echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.err) differs from actual result (*.oerr)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect_err $actual_ext |sed 's/^/    /'
+    fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+# ADD_HELP_TEST
+TOOLTEST_HELP() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .txt`.out"
+    actual_err="$TESTDIR/`basename $1 .txt`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expectdata ]; then
+    # Create the expect data file if it doesn't yet exist.
+      echo " CREATED"
+      cp $actual $expect-CREATED
+    elif $CMP $expect $actual; then
+      echo " PASSED"
+    else
+      echo "*FAILED*"
+      echo "    Expected output (*.txt) differs from actual output (*.out)"
+      nerrors="`expr $nerrors + 1`"
+    fi
+    
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actual_err
+    fi
+
+}
+
+# Print a "SKIP" message
+SKIP() {
+   TESTING $DUMPER $@
+    echo  " -SKIP-"
+}
+  
+# Print a line-line message left justified in a field of 70 characters
+#
+PRINT_H5DIFF() {
+ SPACES="                                                               "
+ echo " Running h5diff $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+
+# Call the h5diff tool
+#
+DIFFTEST() 
+{
+    PRINT_H5DIFF  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5DIFF_BIN "$@" -q
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+        
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+PRINT_H5IMPORT() {
+ SPACES="                                                               "
+ echo " Running h5import $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Call the h5import tool
+#
+IMPORTTEST() 
+{
+    # remove the output hdf5 file if it exists
+    hdf5_file="$TESTDIR/$5"
+    if [ -f $hdf5_file ]; then
+     rm -f $hdf5_file
+    fi
+
+    PRINT_H5IMPORT  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5IMPORT_BIN "$@" 
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+        
+}
+
+
+##############################################################################
+##############################################################################
+###        T H E   T E S T S                                               ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+TOOLTEST_HELP h5dump-help.txt -h
+
+# test data output redirection
+TOOLTEST tnoddl.ddl --enable-error-stack --ddl -y packedbits.h5
+TOOLTEST tnodata.ddl --enable-error-stack --output packedbits.h5
+TOOLTEST tnoattrddl.ddl --enable-error-stack -O -y tattr.h5
+TOOLTEST tnoattrdata.ddl --enable-error-stack -A -o tattr.h5
+TOOLTEST2 trawdatafile.exp --enable-error-stack -y -o trawdatafile.txt packedbits.h5
+TOOLTEST2 tnoddlfile.exp --enable-error-stack -O -y -o tnoddlfile.txt packedbits.h5
+TOOLTEST2A twithddlfile.exp twithddl.exp --enable-error-stack --ddl=twithddl.txt -y -o twithddlfile.txt packedbits.h5
+TOOLTEST2 trawssetfile.exp --enable-error-stack -d "/dset1[1,1;;;]" -y -o trawssetfile.txt tdset.h5
+
+# test for maximum display datasets
+TOOLTEST twidedisplay.ddl --enable-error-stack -w0 packedbits.h5
+
+# test for signed/unsigned datasets
+TOOLTEST packedbits.ddl --enable-error-stack packedbits.h5
+# test for compound signed/unsigned datasets
+TOOLTEST tcmpdintsize.ddl --enable-error-stack tcmpdintsize.h5
+# test for signed/unsigned scalar datasets
+TOOLTEST tscalarintsize.ddl --enable-error-stack tscalarintsize.h5
+# test for signed/unsigned attributes
+TOOLTEST tattrintsize.ddl --enable-error-stack tattrintsize.h5
+# test for compound signed/unsigned attributes
+TOOLTEST tcmpdattrintsize.ddl --enable-error-stack tcmpdattrintsize.h5
+# test for signed/unsigned scalar attributes
+TOOLTEST tscalarattrintsize.ddl --enable-error-stack tscalarattrintsize.h5
+# test for signed/unsigned scalar datasets with attributes
+TOOLTEST tscalarintattrsize.ddl --enable-error-stack tscalarintattrsize.h5
+# test for signed/unsigned datasets attributes
+TOOLTEST tintsattrs.ddl --enable-error-stack tintsattrs.h5
+# test for string scalar dataset attribute
+TOOLTEST tscalarstring.ddl --enable-error-stack tscalarstring.h5
+# test for displaying groups
+TOOLTEST tgroup-1.ddl --enable-error-stack tgroup.h5
+# test for displaying the selected groups
+TOOLTEST4 tgroup-2.ddl --enable-error-stack --group=/g2 --group / -g /y tgroup.h5
+
+# test for displaying simple space datasets
+TOOLTEST tdset-1.ddl --enable-error-stack tdset.h5
+# test for displaying selected datasets
+TOOLTEST4 tdset-2.ddl --enable-error-stack -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5
+
+# test for displaying attributes
+TOOLTEST tattr-1.ddl --enable-error-stack tattr.h5
+# test for displaying the selected attributes of string type and scalar space
+TOOLTEST tattr-2.ddl --enable-error-stack -a "/\/attr1" --attribute /attr4 --attribute=/attr5 tattr.h5
+TOOLTEST tattr-2.ddl --enable-error-stack -N "/\/attr1" --any_path /attr4 --any_path=/attr5 tattr.h5
+# test for header and error messages
+TOOLTEST4 tattr-3.ddl --enable-error-stack --header -a /attr2 --attribute=/attr tattr.h5
+# test for displaying at least 9 attributes on root from a BE machine
+TOOLTEST tattr-4_be.ddl --enable-error-stack tattr4_be.h5
+# test for displaying attributes in shared datatype (also in group and dataset)
+TOOLTEST tnamed_dtype_attr.ddl --enable-error-stack tnamed_dtype_attr.h5
+
+# test for displaying soft links and user-defined links
+TOOLTEST tslink-1.ddl --enable-error-stack tslink.h5
+TOOLTEST tudlink-1.ddl --enable-error-stack tudlink.h5
+# test for displaying the selected link
+TOOLTEST tslink-2.ddl --enable-error-stack -l slink2 tslink.h5
+TOOLTEST tslink-2.ddl --enable-error-stack -N slink2 tslink.h5
+TOOLTEST tudlink-2.ddl --enable-error-stack -l udlink2 tudlink.h5
+# test for displaying dangling soft links
+TOOLTEST4 tslink-D.ddl --enable-error-stack -d /slink1 tslink.h5
+
+# tests for hard links
+TOOLTEST thlink-1.ddl --enable-error-stack thlink.h5
+TOOLTEST thlink-2.ddl --enable-error-stack -d /g1/dset2 --dataset /dset1 --dataset=/g1/g1.1/dset3 thlink.h5
+TOOLTEST thlink-3.ddl --enable-error-stack -d /g1/g1.1/dset3 --dataset /g1/dset2 --dataset=/dset1 thlink.h5
+TOOLTEST thlink-4.ddl --enable-error-stack -g /g1 thlink.h5
+TOOLTEST thlink-4.ddl --enable-error-stack -N /g1 thlink.h5
+TOOLTEST thlink-5.ddl --enable-error-stack -d /dset1 -g /g2 -d /g1/dset2 thlink.h5
+TOOLTEST thlink-5.ddl --enable-error-stack -N /dset1 -N /g2 -N /g1/dset2 thlink.h5
+
+# tests for compound data types
+TOOLTEST tcomp-1.ddl --enable-error-stack tcompound.h5
+# test for named data types
+TOOLTEST tcomp-2.ddl --enable-error-stack -t /type1 --datatype /type2 --datatype=/group1/type3 tcompound.h5
+TOOLTEST tcomp-2.ddl --enable-error-stack -N /type1 --any_path /type2 --any_path=/group1/type3 tcompound.h5
+# test for unamed type 
+TOOLTEST4 tcomp-3.ddl --enable-error-stack -t /#6632 -g /group2 tcompound.h5
+# test complicated compound datatype
+TOOLTEST tcomp-4.ddl --enable-error-stack tcompound_complex.h5
+TOOLTEST tcompound_complex.ddl --enable-error-stack tcompound_complex2.h5
+# tests for bitfields and opaque data types
+TOOLTEST tbitnopaque.ddl --enable-error-stack tbitnopaque.h5
+
+#test for the nested compound type
+TOOLTEST tnestcomp-1.ddl --enable-error-stack tnestedcomp.h5
+TOOLTEST tnestedcmpddt.ddl --enable-error-stack tnestedcmpddt.h5
+
+# test for options
+TOOLTEST4 tall-1.ddl --enable-error-stack tall.h5
+TOOLTEST tall-2.ddl --enable-error-stack --header -g /g1/g1.1 -a attr2 tall.h5
+TOOLTEST tall-3.ddl --enable-error-stack -d /g2/dset2.1 -l /g1/g1.2/g1.2.1/slink tall.h5
+TOOLTEST tall-3.ddl --enable-error-stack -N /g2/dset2.1 -N /g1/g1.2/g1.2.1/slink tall.h5
+TOOLTEST tall-7.ddl --enable-error-stack -a attr1 tall.h5
+TOOLTEST tall-7N.ddl --enable-error-stack -N attr1 tall.h5
+
+# test for loop detection
+TOOLTEST tloop-1.ddl --enable-error-stack tloop.h5
+
+# test for string 
+TOOLTEST tstr-1.ddl --enable-error-stack tstr.h5
+TOOLTEST tstr-2.ddl --enable-error-stack tstr2.h5
+
+# test for file created by Lib SAF team
+TOOLTEST tsaf.ddl --enable-error-stack tsaf.h5
+
+# test for file with variable length data
+TOOLTEST tvldtypes1.ddl --enable-error-stack tvldtypes1.h5
+TOOLTEST tvldtypes2.ddl --enable-error-stack tvldtypes2.h5
+TOOLTEST tvldtypes3.ddl --enable-error-stack tvldtypes3.h5
+TOOLTEST tvldtypes4.ddl --enable-error-stack tvldtypes4.h5
+TOOLTEST tvldtypes5.ddl --enable-error-stack tvldtypes5.h5
+
+#test for file with variable length string data
+TOOLTEST tvlstr.ddl --enable-error-stack tvlstr.h5
+TOOLTEST tvlenstr_array.ddl --enable-error-stack tvlenstr_array.h5
+
+# test for files with array data
+TOOLTEST tarray1.ddl --enable-error-stack tarray1.h5
+# # added for bug# 2092 - tarray1_big.h
+TOOLTEST4 tarray1_big.ddl --enable-error-stack -R tarray1_big.h5
+TOOLTEST tarray2.ddl --enable-error-stack tarray2.h5
+TOOLTEST tarray3.ddl --enable-error-stack tarray3.h5
+TOOLTEST tarray4.ddl --enable-error-stack tarray4.h5
+TOOLTEST tarray5.ddl --enable-error-stack tarray5.h5
+TOOLTEST tarray6.ddl --enable-error-stack tarray6.h5
+TOOLTEST tarray7.ddl --enable-error-stack tarray7.h5
+TOOLTEST tarray8.ddl --enable-error-stack tarray8.h5
+
+# test for wildcards in filename (does not work with cmake)
+# inconsistent across platforms TOOLTEST3 tstarfile.ddl --enable-error-stack -H -d Dataset1 tarr*.h5
+#TOOLTEST4 tqmarkfile.ddl --enable-error-stack -H -d Dataset1 tarray?.h5
+TOOLTEST tmultifile.ddl --enable-error-stack -H -d Dataset1 tarray2.h5 tarray3.h5 tarray4.h5 tarray5.h5 tarray6.h5 tarray7.h5
+
+# test for files with empty data
+TOOLTEST tempty.ddl --enable-error-stack tempty.h5
+
+# test for files with groups that have comments
+TOOLTEST tgrp_comments.ddl --enable-error-stack tgrp_comments.h5
+
+# test the --filedriver flag
+TOOLTEST tsplit_file.ddl --enable-error-stack --filedriver=split tsplit_file
+TOOLTEST tfamily.ddl --enable-error-stack --filedriver=family tfamily%05d.h5
+TOOLTEST tmulti.ddl --enable-error-stack --filedriver=multi tmulti
+
+# test for files with group names which reach > 1024 bytes in size
+TOOLTEST tlarge_objname.ddl --enable-error-stack -w157 tlarge_objname.h5
+
+# test '-A' to suppress data but print attr's
+TOOLTEST4 tall-2A.ddl --enable-error-stack -A tall.h5
+
+# test '-A' to suppress attr's but print data
+TOOLTEST4 tall-2A0.ddl --enable-error-stack -A 0 tall.h5
+
+# test '-r' to print attributes in ASCII instead of decimal
+TOOLTEST4 tall-2B.ddl --enable-error-stack -A -r tall.h5
+
+# test Subsetting
+TOOLTEST tall-4s.ddl --enable-error-stack --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5
+TOOLTEST tall-5s.ddl --enable-error-stack -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5
+TOOLTEST tdset-3s.ddl --enable-error-stack -d "/dset1[1,1;;;]" tdset.h5
+TOOLTEST tno-subset.ddl --enable-error-stack --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0" tno-subset.h5
+
+TOOLTEST tints4dimsCount2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsBlock2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 1,1,1,1 -k 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsStride2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,2,2 -c 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsCountEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -k 1,2,1,1 -c 2,2,4,4 tints4dims.h5
+TOOLTEST tints4dimsBlockEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -c 2,2,1,1 -k 1,2,4,4 tints4dims.h5
+
+# test printing characters in ASCII instead of decimal
+TOOLTEST tchar1.ddl --enable-error-stack -r tchar.h5
+
+# test datatypes in ASCII and UTF8
+TOOLTEST charsets.ddl --enable-error-stack charsets.h5
+
+# rev. 2004
+
+# tests for super block
+TOOLTEST tboot1.ddl --enable-error-stack -H -B -d dset tfcontents1.h5
+TOOLTEST tboot2.ddl --enable-error-stack -B tfcontents2.h5
+TOOLTEST tboot2A.ddl --enable-error-stack --boot-block tfcontents2.h5
+TOOLTEST tboot2B.ddl --enable-error-stack --superblock tfcontents2.h5
+
+# test -p with a non existing dataset
+TOOLTEST4 tperror.ddl --enable-error-stack -p -d bogus tfcontents1.h5
+
+# test for file contents
+TOOLTEST tcontents.ddl --enable-error-stack -n tfcontents1.h5
+TOOLTEST tordercontents1.ddl --enable-error-stack -n --sort_by=name --sort_order=ascending tfcontents1.h5
+TOOLTEST tordercontents2.ddl --enable-error-stack -n --sort_by=name --sort_order=descending tfcontents1.h5
+TOOLTEST tattrcontents1.ddl --enable-error-stack -n 1 --sort_order=ascending tall.h5
+TOOLTEST tattrcontents2.ddl --enable-error-stack -n 1 --sort_order=descending tall.h5
+
+# tests for storage layout
+# compact
+TOOLTEST tcompact.ddl --enable-error-stack -H -p -d compact tfilters.h5
+# contiguous
+TOOLTEST tcontiguos.ddl --enable-error-stack -H -p -d contiguous tfilters.h5
+# chunked
+TOOLTEST tchunked.ddl --enable-error-stack -H -p -d chunked tfilters.h5
+# external 
+TOOLTEST texternal.ddl --enable-error-stack -H -p -d external tfilters.h5
+
+# fill values
+TOOLTEST tfill.ddl --enable-error-stack -p tfvalues.h5
+
+# several datatype, with references , print path
+TOOLTEST treference.ddl --enable-error-stack tattr2.h5
+
+# escape/not escape non printable characters
+TOOLTEST tstringe.ddl --enable-error-stack -e tstr3.h5
+TOOLTEST tstring.ddl --enable-error-stack tstr3.h5
+# char data as ASCII with non escape
+TOOLTEST tstring2.ddl --enable-error-stack -r -d str4 tstr3.h5
+
+# array indices print/not print
+TOOLTEST tindicesyes.ddl --enable-error-stack taindices.h5
+TOOLTEST tindicesno.ddl --enable-error-stack -y taindices.h5
+
+########## array indices with subsetting
+# 1D case
+TOOLTEST tindicessub1.ddl --enable-error-stack -d 1d -s 1 -S 10 -c 2  -k 3 taindices.h5
+
+# 2D case
+TOOLTEST tindicessub2.ddl --enable-error-stack -d 2d -s 1,2  -S 3,3 -c 3,2 -k 2,2 taindices.h5
+
+# 3D case
+TOOLTEST tindicessub3.ddl --enable-error-stack -d 3d -s 0,1,2 -S 1,3,3 -c 2,2,2  -k 1,2,2  taindices.h5
+
+# 4D case
+TOOLTEST tindicessub4.ddl --enable-error-stack -d 4d -s 0,0,1,2  -c 2,2,3,2 -S 1,1,3,3 -k 1,1,2,2  taindices.h5
+
+#Exceed the dimensions for subsetting
+TOOLTEST texceedsubstart.ddl --enable-error-stack -d 1d -s 1,3 taindices.h5
+TOOLTEST texceedsubcount.ddl --enable-error-stack -d 1d -c 1,3 taindices.h5
+TOOLTEST texceedsubstride.ddl --enable-error-stack -d 1d -S 1,3 taindices.h5
+TOOLTEST texceedsubblock.ddl --enable-error-stack -d 1d -k 1,3 taindices.h5
+
+
+# tests for filters
+# SZIP
+TOOLTEST tszip.ddl --enable-error-stack -H -p -d szip tfilters.h5
+# deflate
+TOOLTEST tdeflate.ddl --enable-error-stack -H -p -d deflate tfilters.h5
+# shuffle
+TOOLTEST tshuffle.ddl --enable-error-stack -H -p -d shuffle tfilters.h5
+# fletcher32
+TOOLTEST tfletcher32.ddl --enable-error-stack -H -p -d fletcher32  tfilters.h5
+# nbit
+TOOLTEST tnbit.ddl --enable-error-stack -H -p -d nbit  tfilters.h5
+# scaleoffset
+TOOLTEST tscaleoffset.ddl --enable-error-stack -H -p -d scaleoffset  tfilters.h5
+# all
+TOOLTEST tallfilters.ddl --enable-error-stack -H -p -d all  tfilters.h5
+# user defined
+TOOLTEST tuserfilter.ddl --enable-error-stack -H  -p -d myfilter  tfilters.h5
+
+if test $USE_FILTER_DEFLATE = "yes" ; then
+  # data read internal filters
+  TOOLTEST treadintfilter.ddl --enable-error-stack -d deflate -d shuffle -d fletcher32 -d nbit -d scaleoffset tfilters.h5
+  if test $USE_FILTER_SZIP = "yes"; then
+    # data read
+    TOOLTEST treadfilter.ddl --enable-error-stack -d all -d szip tfilters.h5
+  fi
+fi
+
+# test for displaying objects with very long names
+TOOLTEST tlonglinks.ddl --enable-error-stack tlonglinks.h5
+
+# dimensions over 4GB, print boundary 
+TOOLTEST tbigdims.ddl --enable-error-stack -d dset4gb -s 4294967284 -c 22 tbigdims.h5
+
+# hyperslab read
+TOOLTEST thyperslab.ddl --enable-error-stack thyperslab.h5
+
+
+#
+    
+# test for displaying dataset and attribute of null space
+TOOLTEST tnullspace.ddl --enable-error-stack tnullspace.h5
+
+# test for displaying dataset and attribute of space with 0 dimension size
+TOOLTEST zerodim.ddl --enable-error-stack zerodim.h5
+
+# test for long double (some systems do not have long double)
+#TOOLTEST tldouble.ddl --enable-error-stack tldouble.h5
+
+# test for vms
+TOOLTEST tvms.ddl --enable-error-stack tvms.h5
+
+# test for binary output
+TOOLTEST tbin1.ddl --enable-error-stack -d integer -o out1.bin -b LE tbinary.h5
+
+# test for string binary output
+TOOLTEST2B tstr2bin2.exp --enable-error-stack -d /g2/dset2 -b -o tstr2bin2.txt tstr2.h5
+TOOLTEST2B tstr2bin6.exp --enable-error-stack -d /g6/dset6 -b -o tstr2bin6.txt tstr2.h5
+
+# NATIVE default. the NATIVE test can be validated with h5import/h5diff
+TOOLTEST   tbin1.ddl --enable-error-stack -d integer -o out1.bin  -b  tbinary.h5
+IMPORTTEST out1.bin -c out3.h5import -o out1.h5
+DIFFTEST   tbinary.h5 out1.h5 /integer /integer
+# Same but use h5dump as input to h5import
+IMPORTTEST out1.bin -c tbin1.ddl -o out1D.h5
+DIFFTEST   tbinary.h5 out1D.h5 /integer /integer
+
+TOOLTEST   tbin2.ddl --enable-error-stack -b BE -d float  -o out2.bin  tbinary.h5
+
+# the NATIVE test can be validated with h5import/h5diff
+TOOLTEST   tbin3.ddl --enable-error-stack -d integer -o out3.bin -b NATIVE tbinary.h5
+IMPORTTEST out3.bin -c out3.h5import -o out3.h5
+DIFFTEST   tbinary.h5 out3.h5 /integer /integer
+# Same but use h5dump as input to h5import
+IMPORTTEST out3.bin -c tbin3.ddl -o out3D.h5
+DIFFTEST   tbinary.h5 out3D.h5 /integer /integer
+
+TOOLTEST   tbin4.ddl --enable-error-stack -d double  -b FILE -o out4.bin    tbinary.h5
+   
+# Clean up binary output files
+if test -z "$HDF5_NOCLEANUP"; then
+ rm -f out[1-4].bin
+ rm -f out1.h5
+ rm -f out3.h5
+fi
+
+# test for dataset region references 
+TOOLTEST  tdatareg.ddl --enable-error-stack tdatareg.h5
+TOOLTEST4 tdataregR.ddl --enable-error-stack -R tdatareg.h5
+TOOLTEST  tattrreg.ddl --enable-error-stack tattrreg.h5
+TOOLTEST4 tattrregR.ddl --enable-error-stack -R tattrreg.h5
+TOOLTEST2 tbinregR.exp --enable-error-stack -d /Dataset1 -s 0 -R -y -o tbinregR.txt    tdatareg.h5
+
+# Clean up text output files
+if test -z "$HDF5_NOCLEANUP"; then
+ rm -f tbinregR.txt
+fi
+
+# tests for group creation order
+# "1" tracked, "2" name, root tracked
+TOOLTEST tordergr1.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=ascending tordergr.h5
+TOOLTEST tordergr2.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=descending tordergr.h5
+TOOLTEST tordergr3.ddl --enable-error-stack -g 2 -q name -z ascending tordergr.h5
+TOOLTEST tordergr4.ddl --enable-error-stack -g 2 -q name -z descending tordergr.h5
+TOOLTEST tordergr5.ddl --enable-error-stack -q creation_order tordergr.h5
+
+# tests for attribute order
+TOOLTEST torderattr1.ddl --enable-error-stack -H --sort_by=name --sort_order=ascending torderattr.h5
+TOOLTEST torderattr2.ddl --enable-error-stack -H --sort_by=name --sort_order=descending torderattr.h5
+TOOLTEST torderattr3.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=ascending torderattr.h5
+TOOLTEST torderattr4.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=descending torderattr.h5
+
+# tests for link references and order
+TOOLTEST4 torderlinks1.ddl --enable-error-stack --sort_by=name --sort_order=ascending tfcontents1.h5
+TOOLTEST4 torderlinks2.ddl --enable-error-stack --sort_by=name --sort_order=descending tfcontents1.h5
+
+# tests for floating point user defined printf format
+TOOLTEST tfpformat.ddl --enable-error-stack -m %.7f tfpformat.h5
+
+# tests for traversal of external links
+TOOLTEST4 textlinksrc.ddl --enable-error-stack textlinksrc.h5
+TOOLTEST4 textlinkfar.ddl --enable-error-stack textlinkfar.h5
+
+# test for dangling external links
+TOOLTEST4 textlink.ddl --enable-error-stack textlink.h5
+
+# test for error stack display (BZ2048)
+TOOLTEST5 filter_fail.ddl --enable-error-stack filter_fail.h5
+
+# test for -o -y for dataset with attributes
+TOOLTEST2 tall-6.exp --enable-error-stack -y -o tall-6.txt -d /g1/g1.1/dset1.1.1 tall.h5
+
+# test for non-existing file
+TOOLTEST3 non_existing.ddl --enable-error-stack tgroup.h5 non_existing.h5
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Report test results and exit
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumppbits.sh.in b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumppbits.sh.in
new file mode 100644
index 0000000..4211c63
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumppbits.sh.in
@@ -0,0 +1,598 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5dump tool with packed bits type files
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5dump
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../h5import/h5import     # The h5import tool name
+H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/../"
+
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_ERRORFILES="$srcdir/errfiles"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/pbits
+test -d $TEST_P_DIR || mkdir -p $TEST_P_DIR
+test -d $TESTDIR || mkdir -p $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/packedbits.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/pbits/tnofilename-with-packed-bits.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsArray.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCompound.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIncomplete.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthPositive.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsMax.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsMaxExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetNegative.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOverlapped.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedIntWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedIntWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole1.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole1.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole63.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole63.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong32.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong32.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned2.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned2.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong16.ddl
+"
+
+LIST_ERROR_TEST_FILES="
+${SRC_H5DUMP_ERRORFILES}/tnofilename-with-packed-bits.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsCharLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsCharOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIncomplete.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIntLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIntOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLengthPositive.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLongLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLongOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsMaxExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetNegative.err
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES $LIST_ERROR_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+              $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+#
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+    cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+
+  if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+   nerrors="`expr $nerrors + 1`"
+   test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav $actual_ext
+    fi
+
+}
+
+
+# same as TOOLTEST1 but compares generated file to expected output
+#                   and compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o without -b
+TOOLTEST2() {
+
+    expectdata="$TESTDIR/$1"
+    expect="$TESTDIR/`basename $1 .exp`.ddl"
+    actualdata="$TESTDIR/`basename $1 .exp`.txt"
+    actual="$TESTDIR/`basename $1 .exp`.out"
+    actual_err="$TESTDIR/`basename $1 .exp`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+      if [ ! -f $expectdata ]; then
+      # Create the expect data file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actualdata $expectdata
+      elif $CMP $expectdata $actualdata; then
+        echo " PASSED"
+      else
+        echo "*FAILED*"
+        echo "    Expected datafile (*.exp) differs from actual datafile (*.txt)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expectdata $actualdata |sed 's/^/    /'
+      fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actualdata $actual_err
+    fi
+
+}
+
+# same as TOOLTEST but filters error stack outp
+# Extract file name, line number, version and thread IDs because they may be different
+TOOLTEST3() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# same as TOOLTEST3 but filters error stack output and compares to an error file
+# Extract file name, line number, version and thread IDs because they may be different
+TOOLTEST4() {
+
+    expect="$TESTDIR/$1"
+    expect_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.oerr"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    #cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     if $CMP $expect_err $actual_ext; then
+      echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.err) differs from actual result (*.oerr)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect_err $actual_ext |sed 's/^/    /'
+    fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# Print a "SKIP" message
+SKIP() {
+   TESTING $DUMPER $@
+    echo  " -SKIP-"
+}
+
+# Print a line-line message left justified in a field of 70 characters
+#
+PRINT_H5DIFF() {
+ SPACES="                                                               "
+ echo " Running h5diff $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+
+# Call the h5diff tool
+#
+DIFFTEST()
+{
+    PRINT_H5DIFF  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5DIFF_BIN "$@" -q
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+PRINT_H5IMPORT() {
+ SPACES="                                                               "
+ echo " Running h5import $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Call the h5import tool
+#
+IMPORTTEST()
+{
+    # remove the output hdf5 file if it exists
+    hdf5_file="$TESTDIR/$5"
+    if [ -f $hdf5_file ]; then
+     rm -f $hdf5_file
+    fi
+
+    PRINT_H5IMPORT  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5IMPORT_BIN "$@"
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+
+}
+
+
+##############################################################################
+##############################################################################
+###        T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+####### test for dataset packed bits ######
+
+# test failure handling
+# Missing file name
+TOOLTEST tnofilename-with-packed-bits.ddl --enable-error-stack
+# Limits:
+# Maximum number of packed bits is 8 (for now).
+# Maximum integer size is 64 (for now).
+# Maximun Offset is 63 (Maximum size - 1).
+# Maximum Offset+Length is 64 (Maximum size).
+# Tests:
+# Normal operation on both signed and unsigned int datasets.
+# Sanity check
+# Their rawdata output should be the same.
+TOOLTEST tpbitsSignedWhole.ddl --enable-error-stack -d /DS08BITS -M 0,8 packedbits.h5
+TOOLTEST tpbitsUnsignedWhole.ddl --enable-error-stack -d /DU08BITS -M 0,8 packedbits.h5
+TOOLTEST tpbitsSignedIntWhole.ddl --enable-error-stack -d /DS16BITS -M 0,16 packedbits.h5
+TOOLTEST tpbitsUnsignedIntWhole.ddl --enable-error-stack -d /DU16BITS -M 0,16 packedbits.h5
+TOOLTEST tpbitsSignedLongWhole.ddl --enable-error-stack -d /DS32BITS -M 0,32 packedbits.h5
+TOOLTEST tpbitsUnsignedLongWhole.ddl --enable-error-stack -d /DU32BITS -M 0,32 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole.ddl --enable-error-stack -d /DS64BITS -M 0,64 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole.ddl --enable-error-stack -d /DU64BITS -M 0,64 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole63.ddl --enable-error-stack -d /DS64BITS -M 0,63 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole63.ddl --enable-error-stack -d /DU64BITS -M 0,63 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole1.ddl --enable-error-stack -d /DS64BITS -M 1,63 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole1.ddl --enable-error-stack -d /DU64BITS -M 1,63 packedbits.h5
+# Half sections
+TOOLTEST tpbitsSigned4.ddl --enable-error-stack -d /DS08BITS -M 0,4,4,4 packedbits.h5
+TOOLTEST tpbitsUnsigned4.ddl --enable-error-stack -d /DU08BITS -M 0,4,4,4 packedbits.h5
+TOOLTEST tpbitsSignedInt8.ddl --enable-error-stack -d /DS16BITS -M 0,8,8,8 packedbits.h5
+TOOLTEST tpbitsUnsignedInt8.ddl --enable-error-stack -d /DU16BITS -M 0,8,8,8 packedbits.h5
+TOOLTEST tpbitsSignedLong16.ddl --enable-error-stack -d /DS32BITS -M 0,16,16,16 packedbits.h5
+TOOLTEST tpbitsUnsignedLong16.ddl --enable-error-stack -d /DU32BITS -M 0,16,16,16 packedbits.h5
+TOOLTEST tpbitsSignedLongLong32.ddl --enable-error-stack -d /DS64BITS -M 0,32,32,32 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong32.ddl --enable-error-stack -d /DU64BITS -M 0,32,32,32 packedbits.h5
+# Quarter sections
+TOOLTEST tpbitsSigned2.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
+TOOLTEST tpbitsUnsigned2.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
+TOOLTEST tpbitsSignedInt4.ddl --enable-error-stack -d /DS16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
+TOOLTEST tpbitsUnsignedInt4.ddl --enable-error-stack -d /DU16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
+TOOLTEST tpbitsSignedLong8.ddl --enable-error-stack -d /DS32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
+TOOLTEST tpbitsUnsignedLong8.ddl --enable-error-stack -d /DU32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
+TOOLTEST tpbitsSignedLongLong16.ddl --enable-error-stack -d /DS64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong16.ddl --enable-error-stack -d /DU64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
+# Begin and End
+TOOLTEST tpbitsSigned.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,6 packedbits.h5
+TOOLTEST tpbitsUnsigned.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,6 packedbits.h5
+TOOLTEST tpbitsSignedInt.ddl --enable-error-stack -d /DS16BITS -M 0,2,10,6 packedbits.h5
+TOOLTEST tpbitsUnsignedInt.ddl --enable-error-stack -d /DU16BITS -M 0,2,10,6 packedbits.h5
+TOOLTEST tpbitsSignedLong.ddl --enable-error-stack -d /DS32BITS -M 0,2,26,6 packedbits.h5
+TOOLTEST tpbitsUnsignedLong.ddl --enable-error-stack -d /DU32BITS -M 0,2,26,6 packedbits.h5
+TOOLTEST tpbitsSignedLongLong.ddl --enable-error-stack -d /DS64BITS -M 0,2,58,6 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong.ddl --enable-error-stack -d /DU64BITS -M 0,2,58,6 packedbits.h5
+# Overlapped packed bits.
+TOOLTEST tpbitsOverlapped.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,0,3 packedbits.h5
+# Maximum number of packed bits.
+TOOLTEST tpbitsMax.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
+# Compound type.
+TOOLTEST tpbitsCompound.ddl --enable-error-stack -d /dset1 -M 0,1,1,1 tcompound.h5
+# Array type.
+TOOLTEST tpbitsArray.ddl --enable-error-stack -d /Dataset1 -M 0,1,1,1 tarray1.h5
+# Test Error handling.
+# Too many packed bits requested. Max is 8 for now.
+TOOLTEST tpbitsMaxExceeded.ddl --enable-error-stack -d /DS08BITS -M 0,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
+# Offset too large. Max is 7 (8-1) for now.
+TOOLTEST tpbitsOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 64,1 packedbits.h5
+TOOLTEST tpbitsCharOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 8,1 packedbits.h5
+TOOLTEST tpbitsIntOffsetExceeded.ddl --enable-error-stack -d /DS16BITS -M 16,1 packedbits.h5
+TOOLTEST tpbitsLongOffsetExceeded.ddl --enable-error-stack -d /DS32BITS -M 32,1 packedbits.h5
+# Bad offset, must not be negative.
+TOOLTEST tpbitsOffsetNegative.ddl --enable-error-stack -d /DS08BITS -M -1,1 packedbits.h5
+# Bad length, must not be positive.
+TOOLTEST tpbitsLengthPositive.ddl --enable-error-stack -d /DS08BITS -M 4,0 packedbits.h5
+# Offset+Length is too large. Max is 8 for now.
+TOOLTEST tpbitsLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 37,28 packedbits.h5
+TOOLTEST tpbitsCharLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 2,7 packedbits.h5
+TOOLTEST tpbitsIntLengthExceeded.ddl --enable-error-stack -d /DS16BITS -M 10,7 packedbits.h5
+TOOLTEST tpbitsLongLengthExceeded.ddl --enable-error-stack -d /DS32BITS -M 26,7 packedbits.h5
+# Incomplete pair of packed bits request.
+TOOLTEST tpbitsIncomplete.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,1,0,2,2, packedbits.h5
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Report test results and exit
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumpxml.sh.in b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumpxml.sh.in
new file mode 100644
index 0000000..1efde85
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5dump/testh5dumpxml.sh.in
@@ -0,0 +1,388 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5dump tool
+
+srcdir=@srcdir@
+
+TESTNAME=h5dumpxml
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=h5dump               # The tool name
+DUMPER_BIN=`pwd`/$DUMPER    # The path of the tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/../"
+
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/xml
+test -d $TEST_P_DIR || mkdir -p $TEST_P_DIR
+test -d $TESTDIR || mkdir -p $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES_XML="
+$SRC_H5DUMP_TESTFILES/tall.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tarray2.h5
+$SRC_H5DUMP_TESTFILES/tarray3.h5
+$SRC_H5DUMP_TESTFILES/tarray6.h5
+$SRC_H5DUMP_TESTFILES/tarray7.h5
+$SRC_H5DUMP_TESTFILES/tattr.h5
+$SRC_H5DUMP_TESTFILES/tbitfields.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+$SRC_H5DUMP_TESTFILES/tcompound2.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
+$SRC_H5DUMP_TESTFILES/tdatareg.h5
+$SRC_H5DUMP_TESTFILES/tdset.h5
+$SRC_H5DUMP_TESTFILES/tdset2.h5
+$SRC_H5DUMP_TESTFILES/tempty.h5
+$SRC_H5DUMP_TESTFILES/tenum.h5
+$SRC_H5DUMP_TESTFILES/textlink.h5
+$SRC_H5DUMP_TESTFILES/tfpformat.h5
+$SRC_H5DUMP_TESTFILES/tgroup.h5
+$SRC_H5DUMP_TESTFILES/thlink.h5
+$SRC_H5DUMP_TESTFILES/tloop.h5
+$SRC_H5DUMP_TESTFILES/tloop2.h5
+$SRC_H5DUMP_TESTFILES/tmany.h5
+$SRC_H5DUMP_TESTFILES/tname-amp.h5
+$SRC_H5DUMP_TESTFILES/tname-apos.h5
+$SRC_H5DUMP_TESTFILES/tname-gt.h5
+$SRC_H5DUMP_TESTFILES/tname-lt.h5
+$SRC_H5DUMP_TESTFILES/tname-quot.h5
+$SRC_H5DUMP_TESTFILES/tname-sp.h5
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
+$SRC_H5DUMP_TESTFILES/tnodata.h5
+$SRC_H5DUMP_TESTFILES/tobjref.h5
+$SRC_H5DUMP_TESTFILES/topaque.h5
+$SRC_H5DUMP_TESTFILES/torderattr.h5
+$SRC_H5DUMP_TESTFILES/tref.h5
+$SRC_H5DUMP_TESTFILES/tref-escapes.h5
+$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5
+$SRC_H5DUMP_TESTFILES/tsaf.h5
+$SRC_H5DUMP_TESTFILES/tslink.h5
+$SRC_H5DUMP_TESTFILES/tstring.h5
+$SRC_H5DUMP_TESTFILES/tstring-at.h5
+$SRC_H5DUMP_TESTFILES/tstr.h5
+$SRC_H5DUMP_TESTFILES/tstr2.h5
+$SRC_H5DUMP_TESTFILES/tudlink.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
+$SRC_H5DUMP_TESTFILES/tvlstr.h5
+"
+
+LIST_OTHER_TEST_FILES_XML="
+$SRC_H5DUMP_TESTFILES/tall.h5.xml
+$SRC_H5DUMP_TESTFILES/tall-2A.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray1.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray2.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray3.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray6.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray7.h5.xml
+$SRC_H5DUMP_TESTFILES/tattr.h5.xml
+$SRC_H5DUMP_TESTFILES/tbitfields.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound2.h5.xml
+$SRC_H5DUMP_TESTFILES/tdatareg.h5.xml
+$SRC_H5DUMP_TESTFILES/tdset.h5.xml
+$SRC_H5DUMP_TESTFILES/tdset2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd-uri.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons-uri.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-ns.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-ns-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tenum.h5.xml
+$SRC_H5DUMP_TESTFILES/textlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tfpformat.h5.xml
+$SRC_H5DUMP_TESTFILES/tgroup.h5.xml
+$SRC_H5DUMP_TESTFILES/thlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tloop.h5.xml
+$SRC_H5DUMP_TESTFILES/tloop2.h5.xml
+$SRC_H5DUMP_TESTFILES/tmany.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-amp.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-apos.h5.xml
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-gt.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-lt.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-quot.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-sp.h5.xml
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5.xml
+$SRC_H5DUMP_TESTFILES/tnodata.h5.xml
+$SRC_H5DUMP_TESTFILES/tobjref.h5.xml
+$SRC_H5DUMP_TESTFILES/topaque.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr1.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr2.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr3.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr4.h5.xml
+$SRC_H5DUMP_TESTFILES/tref.h5.xml
+$SRC_H5DUMP_TESTFILES/tref-escapes.h5.xml
+$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5.xml
+$SRC_H5DUMP_TESTFILES/tsaf.h5.xml
+$SRC_H5DUMP_TESTFILES/tslink.h5.xml
+$SRC_H5DUMP_TESTFILES/tstr.h5.xml
+$SRC_H5DUMP_TESTFILES/tstr2.h5.xml
+$SRC_H5DUMP_TESTFILES/tstring.h5.xml
+$SRC_H5DUMP_TESTFILES/tstring-at.h5.xml
+$SRC_H5DUMP_TESTFILES/tudlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5.xml
+$SRC_H5DUMP_TESTFILES/tvlstr.h5.xml
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES_XML $LIST_OTHER_TEST_FILES_XML"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+    	        $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+                
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+#
+TOOLTEST() {
+   expect="$TESTDIR/$1"
+   actual="$TESTDIR/`basename $1 .xml`.out"
+   actual_err="$TESTDIR/`basename $1 .xml`.err"
+   shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+    cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+
+   if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+    echo " CREATED"
+     cp $actual $expect      
+   elif  $CMP $expect $actual; then
+      echo " PASSED"
+   else
+      echo "*FAILED*"
+      echo "    Expected result (*.xml) differs from actual result (*.out)"
+      nerrors="`expr $nerrors + 1`"
+      test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+   fi
+
+   # Clean up output file
+   if test -z "$HDF5_NOCLEANUP"; then
+      rm -f $actual $actual_err
+   fi
+}
+
+# Print a "SKIP" message    
+SKIP() {
+         TESTING $DUMPER $@
+          echo  " -SKIP-"
+}
+
+
+##############################################################################
+##############################################################################
+###        T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# test XML
+TOOLTEST tall.h5.xml --xml tall.h5
+TOOLTEST tattr.h5.xml --xml tattr.h5
+TOOLTEST tbitfields.h5.xml --xml tbitfields.h5
+TOOLTEST tcompound.h5.xml --xml tcompound.h5
+TOOLTEST tcompound2.h5.xml --xml tcompound2.h5
+TOOLTEST tdatareg.h5.xml --xml tdatareg.h5
+TOOLTEST tdset.h5.xml --xml tdset.h5
+TOOLTEST tdset2.h5.xml --xml tdset2.h5
+TOOLTEST tenum.h5.xml --xml tenum.h5
+TOOLTEST tgroup.h5.xml --xml tgroup.h5
+TOOLTEST thlink.h5.xml --xml thlink.h5
+TOOLTEST tloop.h5.xml --xml tloop.h5
+TOOLTEST tloop2.h5.xml --xml tloop2.h5
+TOOLTEST tmany.h5.xml --xml tmany.h5
+TOOLTEST tnestedcomp.h5.xml --xml tnestedcomp.h5
+TOOLTEST tcompound_complex.h5.xml --xml tcompound_complex.h5
+TOOLTEST tobjref.h5.xml --xml tobjref.h5
+TOOLTEST topaque.h5.xml --xml topaque.h5
+TOOLTEST tslink.h5.xml --xml tslink.h5
+TOOLTEST tudlink.h5.xml --xml tudlink.h5
+TOOLTEST textlink.h5.xml --xml textlink.h5
+TOOLTEST tstr.h5.xml --xml tstr.h5
+TOOLTEST tstr2.h5.xml --xml tstr2.h5
+TOOLTEST tref.h5.xml --xml tref.h5
+TOOLTEST tname-amp.h5.xml --xml tname-amp.h5
+TOOLTEST tname-apos.h5.xml --xml tname-apos.h5
+TOOLTEST tname-gt.h5.xml --xml tname-gt.h5
+TOOLTEST tname-lt.h5.xml --xml tname-lt.h5
+TOOLTEST tname-quot.h5.xml --xml tname-quot.h5
+TOOLTEST tname-sp.h5.xml --xml tname-sp.h5
+TOOLTEST tstring.h5.xml --xml tstring.h5
+TOOLTEST tstring-at.h5.xml --xml tstring-at.h5
+TOOLTEST tref-escapes.h5.xml --xml tref-escapes.h5
+TOOLTEST tref-escapes-at.h5.xml --xml tref-escapes-at.h5
+TOOLTEST tnodata.h5.xml --xml tnodata.h5
+TOOLTEST tarray1.h5.xml --xml tarray1.h5
+TOOLTEST tarray2.h5.xml --xml tarray2.h5
+TOOLTEST tarray3.h5.xml --xml tarray3.h5
+TOOLTEST tarray6.h5.xml --xml tarray6.h5
+TOOLTEST tarray7.h5.xml --xml tarray7.h5
+TOOLTEST tvldtypes1.h5.xml --xml tvldtypes1.h5
+TOOLTEST tvldtypes2.h5.xml --xml tvldtypes2.h5
+TOOLTEST tvldtypes3.h5.xml --xml tvldtypes3.h5
+TOOLTEST tvldtypes4.h5.xml --xml tvldtypes4.h5
+TOOLTEST tvldtypes5.h5.xml --xml tvldtypes5.h5
+TOOLTEST tvlstr.h5.xml --xml tvlstr.h5
+TOOLTEST tsaf.h5.xml --xml tsaf.h5
+TOOLTEST tempty.h5.xml --xml tempty.h5
+TOOLTEST tnamed_dtype_attr.h5.xml --xml tnamed_dtype_attr.h5
+##Test dataset and attribute of null space.  Commented out:
+## wait until the XML schema is updated for null space. 
+##TOOLTEST tnullspace.h5.xml --xml tnulspace.h5
+
+# other options for xml
+
+TOOLTEST tempty-dtd.h5.xml --xml --use-dtd tempty.h5
+TOOLTEST tempty-dtd-2.h5.xml --xml -u tempty.h5
+TOOLTEST tempty-nons.h5.xml --xml -X ":" tempty.h5
+TOOLTEST tempty-nons-2.h5.xml --xml --xml-ns=":" tempty.h5
+
+## Some of these combinations are syntactically correct but
+##  the URLs are dummies 
+TOOLTEST tempty-ns.h5.xml --xml -X "thing:" tempty.h5
+TOOLTEST tempty-ns-2.h5.xml --xml --xml-ns="thing:" tempty.h5
+TOOLTEST tempty-nons-uri.h5.xml --xml --xml-ns=":" --xml-dtd="http://somewhere.net" tempty.h5
+TOOLTEST tempty-dtd-uri.h5.xml --xml --use-dtd --xml-dtd="http://somewhere.net" tempty.h5
+
+TOOLTEST tall-2A.h5.xml --xml -A tall.h5
+
+
+# tests for attribute order
+TOOLTEST torderattr1.h5.xml --xml -H --sort_by=name --sort_order=ascending torderattr.h5
+TOOLTEST torderattr2.h5.xml --xml -H --sort_by=name --sort_order=descending torderattr.h5
+TOOLTEST torderattr3.h5.xml --xml -H --sort_by=creation_order --sort_order=ascending torderattr.h5
+TOOLTEST torderattr4.h5.xml --xml -H --sort_by=creation_order --sort_order=descending torderattr.h5
+
+# tests for floating point user defined printf format
+TOOLTEST tfpformat.h5.xml -u -m %.7f tfpformat.h5
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeLists.txt b/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeLists.txt
new file mode 100644
index 0000000..139f440
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeLists.txt
@@ -0,0 +1,47 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_TOOLS_H5LS)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
+
+#-----------------------------------------------------------------------------
+# Add the h5ls executable
+#-----------------------------------------------------------------------------
+add_executable (h5ls ${HDF5_TOOLS_H5LS_SOURCE_DIR}/h5ls.c)
+TARGET_NAMING (h5ls STATIC)
+TARGET_C_PROPERTIES (h5ls STATIC " " " ")
+target_link_libraries (h5ls  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5ls PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5ls")
+
+set (H5_DEP_EXECUTABLES
+    h5ls
+)
+
+if (BUILD_TESTING)
+
+  include (CMakeTests.cmake)
+
+endif (BUILD_TESTING)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+
+#INSTALL_PROGRAM_PDB (h5ls ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+install (
+    TARGETS
+        h5ls
+    EXPORT
+        ${HDF5_EXPORTED_TARGETS}
+    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+)
diff --git a/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeTests.cmake b/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeTests.cmake
new file mode 100644
index 0000000..eda990d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5ls/CMakeTests.cmake
@@ -0,0 +1,395 @@
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the test files from source directory to test directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr2.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinktar.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcomp.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-3.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/nosuchfile.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg_le.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg_be.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdataregbe.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdataregle.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-3.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-4.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-5.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-6.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-7.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-1-old.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-2-old.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-3-old.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-6-old.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-7-old.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-3.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-4.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-5.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-nodangle-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-nodangle-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-nodangle-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlinks-nodangle-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-3.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmultifile.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-2.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-3.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-4.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink-1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2le.ls
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2be.ls
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+
+  # copy the list of test files
+  foreach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+    get_filename_component(fname "${listfiles}" NAME)
+    HDFTEST_COPY_FILE("${listfiles}" "${PROJECT_BINARY_DIR}/testfiles/${fname}" "h5ls_files")
+  endforeach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+  add_custom_target(h5ls_files ALL COMMENT "Copying files needed by h5ls tests" DEPENDS ${h5ls_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  MACRO (ADD_H5_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5LS-${resultfile} COMMAND $<TARGET_FILE:h5ls> ${ARGN})
+      set_tests_properties (H5LS-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5LS-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/${resultfile}.out ./testfiles/${resultfile}.out.err
+      )
+      add_test (
+          NAME H5LS-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5ls>"
+              -D "TEST_ARGS=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ls"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS "H5LS-${resultfile}-clear-objects")
+    endif (HDF5_ENABLE_USING_MEMCHECKER)
+  ENDMACRO (ADD_H5_TEST file)
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    # Remove any output file left over from previous test run
+    add_test (
+      NAME H5LS-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          help-1.out
+          help-1.out.err
+          help-2.out
+          help-2.out.err
+          help-3.out
+          help-3.out.err
+          nosuchfile.out
+          nosuchfile.out.err
+          tall-1.out
+          tall-1.out.err
+          tall-2.out
+          tall-2.out.err
+          tarray1.out
+          tarray1.out.err
+          tattr2.out
+          tattr2.out.err
+          tcomp-1.out
+          tcomp-1.out.err
+          tdataregbe.out
+          tdataregbe.out.err
+          tdataregle.out
+          tdataregle.out.err
+          tdset-1.out
+          tdset-1.out.err
+          tempty.out
+          tempty.out.err
+          textlink-1.out
+          textlink-1.out.err
+          textlinksrc-1.out
+          textlinksrc-1.out.err
+          textlinksrc-2.out
+          textlinksrc-2.out.err
+          textlinksrc-3.out
+          textlinksrc-3.out.err
+          textlinksrc-4.out
+          textlinksrc-4.out.err
+          textlinksrc-5.out
+          textlinksrc-5.out.err
+          textlinksrc-6.out
+          textlinksrc-6.out.err
+          textlinksrc-7.out
+          textlinksrc-7.out.err
+          textlinksrc-1-old.out
+          textlinksrc-1-old.out.err
+          textlinksrc-2-old.out
+          textlinksrc-2-old.out.err
+          textlinksrc-3-old.out
+          textlinksrc-3-old.out.err
+          textlinksrc-6-old.out
+          textlinksrc-6-old.out.err
+          textlinksrc-7-old.out
+          textlinksrc-7-old.out.err
+          tgrp_comments.out
+          tgrp_comments.out.err
+          tsoftlinks-1.out
+          tsoftlinks-1.out.err
+          tsoftlinks-2.out
+          tsoftlinks-2.out.err
+          tsoftlinks-3.out
+          tsoftlinks-3.out.err
+          tsoftlinks-4.out
+          tsoftlinks-4.out.err
+          tsoftlinks-5.out
+          tsoftlinks-5.out.err
+          textlinksrc-nodangle-1.out
+          textlinksrc-nodangle-1.out.err
+          textlinksrc-nodangle-2.out
+          textlinksrc-nodangle-2.out.err
+          tsoftlinks-nodangle-1.out
+          tsoftlinks-nodangle-1.out.err
+          thlinks-nodangle-1.out
+          thlinks-nodangle-1.out.err
+          tgroup.out
+          tgroup.out.err
+          tgroup-1.out
+          tgroup-1.out.err
+          tgroup-2.out
+          tgroup-2.out.err
+          tgroup-3.out
+          tgroup-3.out.err
+          thlink-1.out
+          thlink-1.out.err
+          tloop-1.out
+          tloop-1.out.err
+          tnestcomp-1.out
+          tnestcomp-1.out.err
+          tnestcomp-2.out
+          tnestcomp-2.out.err
+          tnestcomp-3.out
+          tnestcomp-3.out.err
+          tnestcomp-4.out
+          tnestcomp-4.out.err
+          tsaf.out
+          tsaf.out.err
+          tslink-1.out
+          tslink-1.out.err
+          tstr-1.out
+          tstr-1.out.err
+          tudlink-1.out
+          tudlink-1.out.err
+          tvldtypes1.out
+          tvldtypes1.out.err
+          tvldtypes2le.out
+          tvldtypes2le.out.err
+          tvldtypes2be.out
+          tvldtypes2be.out.err
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5LS-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif (NOT "${last_test}" STREQUAL "")
+    set (last_test "H5LS-clearall-objects")
+  endif (HDF5_ENABLE_USING_MEMCHECKER)
+
+  # test the help syntax
+  ADD_H5_TEST (help-1 0 -w80 -h)
+  ADD_H5_TEST (help-2 0 -w80 --help)
+  ADD_H5_TEST (help-3 0 -w80 -?)
+
+  # test simple command
+  ADD_H5_TEST (tall-1 0 -w80 tall.h5)
+  ADD_H5_TEST (tall-2 0 -w80 -r -d tall.h5)
+  ADD_H5_TEST (tgroup 0 -w80 tgroup.h5)
+  ADD_H5_TEST (tgroup-3 0 -w80 tgroup.h5/g1)
+
+  # test for displaying groups
+  # The following combination of arguments is expected to return an error message
+  # and return value 1
+  ADD_H5_TEST (tgroup-1 1 -w80 -r -g tgroup.h5)
+  ADD_H5_TEST (tgroup-2 0 -w80 -g tgroup.h5/g1)
+
+  # test for files with groups that have long comments
+  ADD_H5_TEST (tgrp_comments 0 -w80 -v -g tgrp_comments.h5/glongcomment)
+
+  # test for displaying simple space datasets
+  ADD_H5_TEST (tdset-1 0 -w80 -r -d tdset.h5)
+
+  # test for displaying soft links (dangle)
+  ADD_H5_TEST (tslink-1 0 -w80 -r tslink.h5)
+
+  # test for displaying more soft links with --follow-symlinks
+  ADD_H5_TEST (tsoftlinks-1 0 --follow-symlinks tsoftlinks.h5)
+  ADD_H5_TEST (tsoftlinks-2 0 --follow-symlinks -r tsoftlinks.h5)
+  ADD_H5_TEST (tsoftlinks-3 0 --follow-symlinks tsoftlinks.h5/group1)
+  ADD_H5_TEST (tsoftlinks-4 0 --follow-symlinks -r tsoftlinks.h5/group1)
+  ADD_H5_TEST (tsoftlinks-5 0 --follow-symlinks tsoftlinks.h5/soft_dset1)
+
+  # test for displaying external and user-defined links with --follow-symlinks
+  ADD_H5_TEST (textlink-1 0 -w80 -r textlink.h5)
+  ADD_H5_TEST (textlinksrc-1 0 -w80 --follow-symlinks -r textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-2 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5)
+  ADD_H5_TEST (textlinksrc-3 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-4 0 -w80 -r textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-5 0 -w80 -r textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-6 0 -w80 --follow-symlinks textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-7 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (tudlink-1 0 -w80 -r tudlink.h5)
+
+  # test for displaying external links with -E
+  # the option -E will be depriciated but keep it for backward compatibility
+  ADD_H5_TEST (textlinksrc-1-old 0 -w80 -Er textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-2-old 0 -w80 -Erv textlinksrc.h5/ext_link5)
+  ADD_H5_TEST (textlinksrc-3-old 0 -w80 -Er textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-6-old 0 -w80 -E textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-7-old 0 -w80 -E textlinksrc.h5/ext_link1)
+
+  # tests for no-dangling-links
+  # if this option is given on dangling link, h5ls should return exit code 1
+  # when used alone , expect to print out help and return exit code 1
+  ADD_H5_TEST (textlinksrc-nodangle-1 1 -w80 --no-dangling-links textlinksrc.h5)
+  # external dangling link - expected exit code 1
+  ADD_H5_TEST (textlinksrc-nodangle-2 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5)
+  # soft dangling link - expected exit code 1
+  ADD_H5_TEST (tsoftlinks-nodangle-1 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5)
+  # when used file with no dangling links - expected exit code 0
+  ADD_H5_TEST (thlinks-nodangle-1 0 -w80 --follow-symlinks --no-dangling-links thlink.h5)
+
+# test for wildcards in filename (does not work with cmake)
+#  ADD_H5_TEST (tstarfile 0 -w80 t*link.h5)
+#  ADD_H5_TEST (tqmarkfile 0 -w80 t?link.h5)
+  ADD_H5_TEST (tmultifile 0 -w80 thlink.h5 tslink.h5)
+
+  # tests for hard links
+  ADD_H5_TEST (thlink-1 0 -w80 thlink.h5)
+
+  # tests for compound data types
+  ADD_H5_TEST (tcomp-1 0 -w80 -r -d tcompound.h5)
+
+  #test for the nested compound type
+  ADD_H5_TEST (tnestcomp-1 0 -w80 -r -d tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-2 0 -w80 -r -d -S tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-3 0 -w80 -r -d -l tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-4 0 -w80 -r -d -l -S tnestedcomp.h5)
+
+  # test for loop detection
+  ADD_H5_TEST (tloop-1 0 -w80 -r -d tloop.h5)
+
+  # test for string
+  ADD_H5_TEST (tstr-1 0 -w80 -r -d tstr.h5)
+
+  # test test file created from lib SAF team
+  ADD_H5_TEST (tsaf 0 -w80 -r -d tsaf.h5)
+
+  # test for variable length data types
+  ADD_H5_TEST (tvldtypes1 0 -w80 -r -d tvldtypes1.h5)
+
+  # test for array data types
+  ADD_H5_TEST (tarray1 0 -w80 -r -d tarray1.h5)
+
+  # test for empty data
+  ADD_H5_TEST (tempty 0 -w80 -d tempty.h5)
+
+  # test for all dataset types written to attributes
+  # enable -S for avoiding printing NATIVE types
+  ADD_H5_TEST (tattr2 0 -w80 -v -S tattr2.h5)
+
+  # test for attribute with region references wo verbose mode
+  # ( HDFFV-7838, )
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tattrreg_be 0 -w80 -v -d tattrreg.h5)
+  else (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tattrreg_le 0 -w80 -v -d tattrreg.h5)
+  endif (H5_WORDS_BIGENDIAN)
+
+  # test for non-existing file
+  ADD_H5_TEST (nosuchfile 1 nosuchfile.h5)
+
+  # test for variable length data types in verbose mode
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tvldtypes2be 0 -v tvldtypes1.h5)
+  else (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tvldtypes2le 0 -v tvldtypes1.h5)
+  endif (H5_WORDS_BIGENDIAN)
+
+  # test for dataset region references data types in verbose mode
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tdataregbe 0 -v tdatareg.h5)
+  else (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tdataregle 0 -v tdatareg.h5)
+  endif (H5_WORDS_BIGENDIAN)
diff --git a/gatb-core/thirdparty/hdf5/tools/h5ls/h5ls.c b/gatb-core/thirdparty/hdf5/tools/h5ls/h5ls.c
new file mode 100644
index 0000000..4ab4f22
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5ls/h5ls.c
@@ -0,0 +1,2914 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, March 23, 1998
+ */
+
+
+/*
+ * We include the private header file so we can get to the uniform
+ * programming environment it declares.  Other than that, h5ls only calls
+ * HDF5 API functions (except for H5G_basename())
+ */
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_dump.h"
+#include "h5trav.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5ls"
+
+#define NAME_BUF_SIZE   2048
+/*
+ *  Alternative formating for data dumped by H5LS
+ *
+ *  This table only affects H5LS output.
+ */
+static h5tool_format_t         ls_dataformat = {
+        0, /*raw */
+
+        "", /*fmt_raw */
+        "%d", /*fmt_int */
+        "%u", /*fmt_uint */
+        "%hhd", /*fmt_schar */
+        "%u", /*fmt_uchar */
+        "%d", /*fmt_short */
+        "%u", /*fmt_ushort */
+        "%ld", /*fmt_long */
+        "%lu", /*fmt_ulong */
+        NULL, /*fmt_llong */
+        NULL, /*fmt_ullong */
+        "%g", /*fmt_double */
+        "%g", /*fmt_float */
+
+        0, /*ascii */
+        0, /*str_locale */
+        0, /*str_repeat */
+
+        "[", /*arr_pre */
+        ",", /*arr_sep */
+        "]", /*arr_suf */
+        1, /*arr_linebreak */
+
+        "", /*cmpd_name */
+        ",", /*cmpd_sep */
+        "{", /*cmpd_pre */
+        "}", /*cmpd_suf */
+        "", /*cmpd_end */
+
+        ",", /*vlen_sep */
+        "(", /*vlen_pre */
+        ")", /*vlen_suf */
+        "", /*vlen_end */
+
+        "%s", /*elmt_fmt */
+        ",", /*elmt_suf1 */
+        " ", /*elmt_suf2 */
+
+        HSIZE_T_FORMAT, /*idx_n_fmt */
+        ",", /*idx_sep */
+        "(%s)", /*idx_fmt */
+
+        65535, /*line_ncols *//*standard default columns */
+        0, /*line_per_line */
+        "", /*line_pre */
+        "%s", /*line_1st */
+        "%s", /*line_cont */
+        "", /*line_suf */
+        "", /*line_sep */
+        1, /*line_multi_new */
+        "", /*line_indent */
+
+        0, /*skip_first */
+
+        0, /*obj_hidefileno */
+        "-%lu:"H5_PRINTF_HADDR_FMT, /*obj_format */
+
+        0, /*dset_hidefileno */
+        "DSET-%s ", /*dset_format */
+        "%sBlk%lu: ", /*dset_blockformat_pre */
+        "%sPt%lu: ", /*dset_ptformat_pre */
+        "%s", /*dset_ptformat */
+        1, /*array indices */
+        1 /*escape non printable characters */
+};
+
+/* Struct to pass through to visitors */
+typedef struct {
+    const char *fname;                  /* Filename */
+    hid_t fid;                          /* File ID */
+    hid_t gid;                          /* Group ID */
+    hbool_t symlink_target;                 /* Whether this is the target of an symbolic link */
+    symlink_trav_t *symlink_list;       /* List of visited symbolic links */
+    size_t base_len;                    /* Length of base path name, if not root */
+    size_t name_start;                  /* # of leading characters to strip off path names on output */
+}iter_t;
+
+/* Command-line switches */
+static int      verbose_g = 0;            /* lots of extra output */
+static int      width_g = 80;             /* output width in characters */
+static hbool_t  address_g = FALSE;        /* print raw data addresses */
+static hbool_t  data_g = FALSE;           /* display dataset values? */
+static hbool_t  label_g = FALSE;          /* label compound values? */
+static hbool_t  string_g = FALSE;         /* print 1-byte numbers as ASCII? */
+static hbool_t  fullname_g = FALSE;       /* print full path names */
+static hbool_t  recursive_g = FALSE;      /* recursive descent listing */
+static hbool_t  follow_symlink_g = FALSE; /* follow symbolic links */
+static hbool_t  no_dangling_link_g = FALSE; /* treat dangling link is error */
+static hbool_t  follow_elink_g = FALSE;   /* follow external links */
+static hbool_t  grp_literal_g = FALSE;    /* list group, not contents */
+static hbool_t  hexdump_g = FALSE;        /* show data as raw hexadecimal */
+static hbool_t  show_errors_g = FALSE;    /* print HDF5 error messages */
+static hbool_t  simple_output_g = FALSE;  /* make output more machine-readable */
+static hbool_t  show_file_name_g = FALSE; /* show file name for full names */
+static hbool_t  no_line_wrap_g = FALSE;   /* show data content without line wrap */
+static hbool_t  display_root_g = FALSE;   /* show root group in output? */
+
+/* Information about how to display each type of object */
+static struct dispatch_t {
+    const char *name;
+    hid_t (*open)(hid_t loc, const char *name, hid_t apl_id);
+    herr_t (*close)(hid_t obj);
+    herr_t (*list1)(hid_t obj);
+    herr_t (*list2)(hid_t obj, const char *name);
+} dispatch_g[H5O_TYPE_NTYPES];
+
+#define DISPATCH(TYPE, NAME, LIST1, LIST2) {         \
+    dispatch_g[TYPE].name = (NAME);             \
+    dispatch_g[TYPE].list1 = (LIST1);           \
+    dispatch_g[TYPE].list2 = (LIST2);           \
+}
+
+static void print_type(h5tools_str_t *buffer, hid_t type, int ind);
+static hbool_t print_int_type(h5tools_str_t *buffer, hid_t type, int ind);
+static hbool_t print_float_type(h5tools_str_t *buffer, hid_t type, int ind);
+static herr_t visit_obj(hid_t file, const char *oname, iter_t *iter);
+
+

+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, July 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (void)
+{
+    HDfprintf(rawerrorstream, "\
+usage: %s [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]\n\
+  OPTIONS\n\
+   -h, -?, --help  Print a usage message and exit\n\
+   -a, --address   Print raw data address.  If dataset is contiguous, address\n\
+                   is offset in file of beginning of raw data. If chunked,\n\
+                   returned list of addresses indicates offset of each chunk.\n\
+                   Must be used with -v, --verbose option.\n\
+                   Provides no information for non-dataset objects.\n\
+   -d, --data      Print the values of datasets\n\
+   --enable-error-stack\n\
+                   Prints messages from the HDF5 error stack as they occur.\n\
+   --follow-symlinks\n\
+                   Follow symbolic links (soft links and external links)\n\
+                   to display target object information.\n\
+                   Without this option, h5ls identifies a symbolic link\n\
+                   as a soft link or external link and prints the value\n\
+                   assigned to the symbolic link; it does not provide any\n\
+                   information regarding the target object or determine\n\
+                   whether the link is a dangling link.\n\
+   --no-dangling-links\n\
+                   Must be used with --follow-symlinks option;\n\
+                   otherwise, h5ls shows error message and returns an exit\n\
+                   code of 1. \n\
+                   Check for any symbolic links (soft links or external links)\n\
+                   that do not resolve to an existing object (dataset, group,\n\
+                   or named datatype).\n\
+                   If any dangling link is found, this situation is treated\n\
+                   as an error and h5ls returns an exit code of 1.\n\
+   -f, --full      Print full path names instead of base names\n\
+   -g, --group     Show information about a group, not its contents\n\
+   -l, --label     Label members of compound datasets\n\
+   -r, --recursive List all groups recursively, avoiding cycles\n\
+   -s, --string    Print 1-byte integer datasets as ASCII\n\
+   -S, --simple    Use a machine-readable output format\n\
+   -wN, --width=N  Set the number of columns of output\n\
+   -v, --verbose   Generate more verbose output\n\
+   -V, --version   Print version number and exit\n\
+   --vfd=DRIVER    Use the specified virtual file driver\n\
+   -x, --hexdump   Show raw data in hexadecimal format\n\
+\n\
+  file/OBJECT\n\
+    Each object consists of an HDF5 file name optionally followed by a\n\
+    slash and an object name within the file (if no object is specified\n\
+    within the file then the contents of the root group are displayed).\n\
+    The file name may include a printf(3C) integer format such as\n\
+    \"%%05d\" to open a file family.\n\
+\n\
+  Deprecated Options\n\
+    The following options have been deprecated in HDF5. While they remain\n\
+    available, they have been superseded as indicated and may be removed\n\
+    from HDF5 in the future. Use the indicated replacement option in all\n\
+    new work; where possible, existing scripts, et cetera, should also be\n\
+    updated to use the replacement option.\n\
+\n\
+   -E or --external   Follow external links.\n\
+                      Replaced by --follow-symlinks.\n\
+   -e, --errors       Show all HDF5 error reporting\n\
+                      Replaced by --enable-error-stack.\n",
+     h5tools_getprogname());
+}
+
+

+
+/*-------------------------------------------------------------------------
+ * Function: print_string
+ *
+ * Purpose: Print a string value by escaping unusual characters. If
+ *  STREAM is null then we only count how large the output would
+ *  be.
+ *
+ * Return: Number of characters printed.
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+print_string(h5tools_str_t *buffer, const char *s, hbool_t escape_spaces)
+{
+    int  nprint=0;
+
+    for (/*void*/; s && *s; s++) {
+        switch (*s) {
+            case '"':
+                if (buffer) h5tools_str_append(buffer, "\\\"");
+                nprint += 2;
+                break;
+            case '\\':
+                if (buffer) h5tools_str_append(buffer, "\\\\");
+                nprint += 2;
+                break;
+            case '\b':
+                if (buffer) h5tools_str_append(buffer, "\\b");
+                nprint += 2;
+                break;
+            case '\f':
+                if (buffer) h5tools_str_append(buffer, "\\f");
+                nprint += 2;
+                break;
+            case '\n':
+                if (buffer) h5tools_str_append(buffer, "\\n");
+                nprint += 2;
+                break;
+            case '\r':
+                if (buffer) h5tools_str_append(buffer, "\\r");
+                nprint += 2;
+                break;
+            case '\t':
+                if (buffer) h5tools_str_append(buffer, "\\t");
+                nprint += 2;
+                break;
+            case ' ':
+                if (escape_spaces) {
+                    if (buffer) h5tools_str_append(buffer, "\\ ");
+                    nprint += 2;
+                }
+                else {
+                    if (buffer) h5tools_str_append(buffer, " ");
+                    nprint++;
+                }
+                break;
+            default:
+                if (isprint((int)*s)) {
+                    if (buffer) h5tools_str_append(buffer, "%c", *s);
+                    nprint++;
+                }
+                else {
+                    if (buffer) h5tools_str_append(buffer, "\\%03o", *((const unsigned char*)s));
+                    nprint += 4;
+                }
+                break;
+        }
+    }
+    return nprint;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_obj_name
+ *
+ * Purpose: Print an object name and another string.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, November  6, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+print_obj_name(h5tools_str_t *buffer, const iter_t *iter, const char *oname,
+    const char *s)
+{
+    static char fullname[NAME_BUF_SIZE];     /* Buffer for file and/or object name */
+    const char *name = fullname;                /* Pointer to buffer for printing */
+    int  n;
+
+    if(show_file_name_g)
+        HDsnprintf(fullname, sizeof(fullname), "%s/%s", iter->fname, oname + iter->name_start);
+    else
+        name = oname + iter->name_start;
+
+    /* Print the object name, either full name or base name */
+    if(fullname_g)
+        n = print_string(buffer, name, TRUE);
+    else {
+        const char *last_sep;   /* The location of the last group separator */
+
+        /* Find the last component of the path name */
+        if(NULL == (last_sep = HDstrrchr(name, '/')))
+            last_sep = name;
+        else {
+            last_sep++;
+        } /* end else */
+        n = print_string(buffer, last_sep, TRUE);
+    } /* end else */
+    h5tools_str_append(buffer, "%*s ", MAX(0, (24 - n)), s);
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_native_type
+ *
+ * Purpose: Prints the name of a native C data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed.
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-11
+ *  Added the C9x types, but we still prefer to display the types
+ *  from the C language itself (like `int' vs. `int32_t').
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_native_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    if(!simple_output_g) {
+        if (H5Tequal(type, H5T_NATIVE_SCHAR)==TRUE) {
+            h5tools_str_append(buffer, "native signed char");
+        } else if (H5Tequal(type, H5T_NATIVE_UCHAR)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned char");
+        } else if (H5Tequal(type, H5T_NATIVE_INT)==TRUE) {
+            h5tools_str_append(buffer, "native int");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned int");
+        } else if (H5Tequal(type, H5T_NATIVE_SHORT)==TRUE) {
+            h5tools_str_append(buffer, "native short");
+        } else if (H5Tequal(type, H5T_NATIVE_USHORT)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned short");
+        } else if (H5Tequal(type, H5T_NATIVE_LONG)==TRUE) {
+            h5tools_str_append(buffer, "native long");
+        } else if (H5Tequal(type, H5T_NATIVE_ULONG)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned long");
+        } else if (H5Tequal(type, H5T_NATIVE_LLONG)==TRUE) {
+            h5tools_str_append(buffer, "native long long");
+        } else if (H5Tequal(type, H5T_NATIVE_ULLONG)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned long long");
+        } else if (H5Tequal(type, H5T_NATIVE_FLOAT)==TRUE) {
+            h5tools_str_append(buffer, "native float");
+        } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)==TRUE) {
+            h5tools_str_append(buffer, "native double");
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)==TRUE) {
+            h5tools_str_append(buffer, "native long double");
+#endif
+        } else if (H5Tequal(type, H5T_NATIVE_INT8)==TRUE) {
+            h5tools_str_append(buffer, "native int8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT8)==TRUE) {
+            h5tools_str_append(buffer, "native uint8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT16)==TRUE) {
+            h5tools_str_append(buffer, "native int16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT16)==TRUE) {
+            h5tools_str_append(buffer, "native uint16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT32)==TRUE) {
+            h5tools_str_append(buffer, "native int32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT32)==TRUE) {
+            h5tools_str_append(buffer, "native uint32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT64)==TRUE) {
+            h5tools_str_append(buffer, "native int64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT64)==TRUE) {
+            h5tools_str_append(buffer, "native uint64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST8)==TRUE) {
+            h5tools_str_append(buffer, "native int_least8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST8)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST16)==TRUE) {
+            h5tools_str_append(buffer, "native int_least16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST16)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST32)==TRUE) {
+            h5tools_str_append(buffer, "native int_least32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST32)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST64)==TRUE) {
+            h5tools_str_append(buffer, "native int_least64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST64)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST8)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST8)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST16)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST16)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST32)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST32)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST64)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST64)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_B8)==TRUE) {
+            h5tools_str_append(buffer, "native 8-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B16)==TRUE) {
+            h5tools_str_append(buffer, "native 16-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B32)==TRUE) {
+            h5tools_str_append(buffer, "native 32-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B64)==TRUE) {
+            h5tools_str_append(buffer, "native 64-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_HSIZE)==TRUE) {
+            h5tools_str_append(buffer, "native hsize_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HSSIZE)==TRUE) {
+            h5tools_str_append(buffer, "native hssize_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HERR)==TRUE) {
+            h5tools_str_append(buffer, "native herr_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HBOOL)==TRUE) {
+            h5tools_str_append(buffer, "native hbool_t");
+        } else {
+            return print_int_type(buffer, type, ind);
+        }
+    } else {
+        return print_int_type(buffer, type, ind);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_ieee_type
+ *
+ * Purpose: Print the name of an IEEE floating-point data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_ieee_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    if (H5Tequal(type, H5T_IEEE_F32BE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 32-bit big-endian float");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F32LE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 32-bit little-endian float");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F64BE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 64-bit big-endian float");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F64LE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 64-bit little-endian float");
+    }
+    else {
+        return print_float_type(buffer, type, ind);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_precision
+ *
+ * Purpose: Prints information on the next line about precision and
+ *  padding if the precision is less than the total data type
+ *  size.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_precision(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    size_t      prec;           /* precision */
+    H5T_pad_t   plsb, pmsb;     /* lsb and msb padding */
+    const char  *plsb_s=NULL;   /* lsb padding string */
+    const char  *pmsb_s=NULL;   /* msb padding string */
+    size_t      nbits;          /* number of bits */
+
+    /* If the precision is less than the total size then show the precision
+     * and offset on the following line.  Also display the padding
+     * information. */
+    if(8 * H5Tget_size(type) != (prec = H5Tget_precision(type))) {
+        h5tools_str_append(buffer, "\n%*s(%lu bit%s of precision beginning at bit %lu)",
+            ind, "", (unsigned long)prec, 1 == prec ? "" : "s",
+            (unsigned long)H5Tget_offset(type));
+
+        H5Tget_pad(type, &plsb, &pmsb);
+        if(H5Tget_offset(type) > 0) {
+            switch(plsb) {
+                case H5T_PAD_ZERO:
+                    plsb_s = "zero";
+                    break;
+                case H5T_PAD_ONE:
+                    plsb_s = "one";
+                    break;
+                case H5T_PAD_BACKGROUND:
+                    plsb_s = "bkg";
+                    break;
+                case H5T_PAD_ERROR:
+                case H5T_NPAD:
+                    plsb_s = "unknown";
+                    break;
+                default:
+                    break;
+            }
+        }
+        if((unsigned)H5Tget_offset(type) + prec < 8 * H5Tget_size(type)) {
+            switch(pmsb) {
+                case H5T_PAD_ZERO:
+                    pmsb_s = "zero";
+                    break;
+                case H5T_PAD_ONE:
+                    pmsb_s = "one";
+                    break;
+                case H5T_PAD_BACKGROUND:
+                    pmsb_s = "bkg";
+                    break;
+                case H5T_PAD_ERROR:
+                case H5T_NPAD:
+                    pmsb_s = "unknown";
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (plsb_s || pmsb_s) {
+            h5tools_str_append(buffer, "\n%*s(", ind, "");
+            if (plsb_s) {
+                nbits = (unsigned)H5Tget_offset(type);
+                h5tools_str_append(buffer, "%lu %s bit%s at bit 0",
+                        (unsigned long)nbits, plsb_s, 1 == nbits ? "" : "s");
+            }
+            if (plsb_s && pmsb_s) h5tools_str_append(buffer, ", ");
+            if (pmsb_s) {
+                nbits = (8 * H5Tget_size(type)) - ((unsigned)H5Tget_offset(type) + prec);
+                h5tools_str_append(buffer, "%lu %s bit%s at bit %lu",
+                        (unsigned long)nbits, pmsb_s, 1 == nbits ? "" : "s",
+                        (unsigned long)(8 * H5Tget_size(type) - nbits));
+            }
+            h5tools_str_append(buffer, ")");
+        }
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_int_type
+ *
+ * Purpose: Print the name of an integer data type.  Common information
+ *  like number of bits, byte order, and sign scheme appear on
+ *  the first line. Additional information might appear in
+ *  parentheses on the following lines.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_int_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+    H5T_sign_t  sign;           /* sign scheme value */
+    const char  *sign_s=NULL;   /* sign scheme string */
+
+    if (H5T_INTEGER!=H5Tget_class(type)) return FALSE;
+
+    /* Byte order */
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        }
+        else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        }
+        else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        }
+        else {
+            order_s = " unknown-byte-order";
+        }
+    }
+    else {
+        order_s = "";
+    }
+
+    /* Sign */
+    if ((sign=H5Tget_sign(type))>=0) {
+        if (H5T_SGN_NONE==sign) {
+            sign_s = " unsigned";
+        }
+        else if (H5T_SGN_2==sign) {
+            sign_s = "";
+        }
+        else {
+            sign_s = " unknown-sign";
+        }
+    }
+    else {
+        sign_s = " unknown-sign";
+    }
+
+    /* Print size, order, and sign on first line, precision and padding
+     * information on the subsequent lines */
+    h5tools_str_append(buffer, "%lu-bit%s%s integer",
+            (unsigned long)(8*H5Tget_size(type)), order_s, sign_s);
+    print_precision(buffer, type, ind);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_float_type
+ *
+ * Purpose: Print info about a floating point data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_float_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+    size_t      spos;           /* sign bit position */
+    size_t      esize, epos;    /* exponent size and position */
+    size_t      msize, mpos;    /* significand size and position */
+    size_t      ebias;          /* exponent bias */
+    H5T_norm_t  norm;           /* significand normalization */
+    const char  *norm_s=NULL;   /* normalization string */
+    H5T_pad_t   pad;            /* internal padding value */
+    const char  *pad_s=NULL;    /* internal padding string */
+
+    if (H5T_FLOAT!=H5Tget_class(type)) return FALSE;
+
+    /* Byte order */
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        }
+        else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        }
+        else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        }
+        else {
+            order_s = " unknown-byte-order";
+        }
+    }
+    else {
+        order_s = "";
+    }
+
+    /* Print size and byte order on first line, precision and padding on
+     * subsequent lines. */
+    h5tools_str_append(buffer, "%lu-bit%s floating-point",
+        (unsigned long)(8*H5Tget_size(type)), order_s);
+    print_precision(buffer, type, ind);
+
+    /* Print sizes, locations, and other information about each field */
+    H5Tget_fields (type, &spos, &epos, &esize, &mpos, &msize);
+    ebias = H5Tget_ebias(type);
+    norm = H5Tget_norm(type);
+    switch (norm) {
+        case H5T_NORM_IMPLIED:
+            norm_s = ", msb implied";
+            break;
+        case H5T_NORM_MSBSET:
+            norm_s = ", msb always set";
+            break;
+        case H5T_NORM_NONE:
+            norm_s = ", no normalization";
+            break;
+        case H5T_NORM_ERROR:
+            norm_s = ", unknown normalization";
+            break;
+        default:
+            ;
+        break;
+    }
+    h5tools_str_append(buffer, "\n%*s(significant for %lu bit%s at bit %lu%s)", ind, "",
+            (unsigned long)msize, 1==msize?"":"s", (unsigned long)mpos,
+            norm_s);
+    h5tools_str_append(buffer, "\n%*s(exponent for %lu bit%s at bit %lu, bias is 0x%lx)",
+            ind, "", (unsigned long)esize, 1==esize?"":"s",
+            (unsigned long)epos, (unsigned long)ebias);
+    h5tools_str_append(buffer, "\n%*s(sign bit at %lu)", ind, "", (unsigned long)spos);
+
+    /* Display internal padding */
+    if (1+esize+msize<H5Tget_precision(type)) {
+        pad = H5Tget_inpad(type);
+        switch (pad) {
+            case H5T_PAD_ZERO:
+                pad_s = "zero";
+                break;
+            case H5T_PAD_ONE:
+                pad_s = "one";
+                break;
+            case H5T_PAD_BACKGROUND:
+                pad_s = "bkg";
+                break;
+            case H5T_PAD_ERROR:
+            case H5T_NPAD:
+                pad_s = "unknown";
+                break;
+            default:
+                ;
+            break;
+        }
+        h5tools_str_append(buffer, "\n%*s(internal padding bits are %s)", ind, "", pad_s);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_cmpd_type
+ *
+ * Purpose: Print info about a compound data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_cmpd_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    char        *name=NULL;     /* member name */
+    size_t      size;           /* total size of type in bytes */
+    hid_t       subtype;        /* member data type */
+    int         nmembs;         /* number of members */
+    int         n;              /* miscellaneous counters */
+    unsigned    i;              /* miscellaneous counters */
+
+    if(H5T_COMPOUND != H5Tget_class(type))
+        return FALSE;
+    if((nmembs = H5Tget_nmembers(type)) < 0)
+        return FALSE;
+
+    h5tools_str_append(buffer, "struct {");
+    for(i = 0; i < (unsigned)nmembs; i++) {
+
+        /* Name and offset */
+        name = H5Tget_member_name(type, i);
+        h5tools_str_append(buffer, "\n%*s\"", ind+4, "");
+        n = print_string(buffer, name, FALSE);
+        h5tools_str_append(buffer, "\"%*s +%-4lu ", MAX(0, 16-n), "",
+               (unsigned long)H5Tget_member_offset(type, i));
+        H5free_memory(name);
+
+        /* Member's type */
+        subtype = H5Tget_member_type(type, i);
+        print_type(buffer, subtype, ind+4);
+        H5Tclose(subtype);
+    }
+    size = H5Tget_size(type);
+    h5tools_str_append(buffer, "\n%*s} %lu byte%s",
+                ind, "", (unsigned long)size, 1==size?"":"s");
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_enum_type
+ *
+ * Purpose: Print info about an enumeration data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_enum_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    int         nmembs;         /* number of members */
+    hid_t       super;          /* enum base integer type */
+
+    if(H5T_ENUM != H5Tget_class(type))
+        return FALSE;
+    if((nmembs = H5Tget_nmembers(type)) < 0)
+        return FALSE;
+
+    super = H5Tget_super(type);
+    h5tools_str_append(buffer, "enum ");
+    print_type(buffer, super, ind + 4);
+    h5tools_str_append(buffer, " {");
+
+    if(nmembs > 0) {
+        char        **name;         /* member names */
+        unsigned char *value;       /* value array */
+        hid_t       native = -1;    /* native integer data type */
+        size_t      dst_size;       /* destination value type size */
+        unsigned    i;              /* miscellaneous counters */
+
+        /* Determine what data type to use for the native values.  To simplify
+         * things we entertain three possibilities:
+         *  1. long long -- the largest native signed integer
+         *  2. unsigned long long -- the largest native unsigned integer
+         *  3. raw format */
+        if(H5Tget_size(type) <= sizeof(long long)) {
+            dst_size = sizeof(long long);
+            if(H5T_SGN_NONE == H5Tget_sign(type))
+                native = H5T_NATIVE_ULLONG;
+            else
+                native = H5T_NATIVE_LLONG;
+        } /* end if */
+        else
+            dst_size = H5Tget_size(type);
+
+        /* Get the names and raw values of all members */
+        name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
+        value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
+        for(i = 0; i < (unsigned)nmembs; i++) {
+            name[i] = H5Tget_member_name(type, i);
+            H5Tget_member_value(type, i, value + i * H5Tget_size(type));
+        }
+
+        /* Convert values to native data type */
+        if(native > 0)
+            if(H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT) < 0) {
+                /* Release resources */
+                for(i = 0; i < (unsigned)nmembs; i++)
+                    H5free_memory(name[i]);
+                HDfree(name);
+                HDfree(value);
+
+                return FALSE;
+            }
+
+        /* Sort members by increasing value */
+        /*not implemented yet*/
+
+        /* Print members */
+        for(i = 0; i < (unsigned)nmembs; i++) {
+            unsigned char *copy;        /* a pointer to value array */
+            int         nchars;         /* number of output characters */
+
+            h5tools_str_append(buffer, "\n%*s", ind+4, "");
+            nchars = print_string(buffer, name[i], TRUE);
+            h5tools_str_append(buffer, "%*s = ", MAX(0, 16 - nchars), "");
+
+            if(native < 0) {
+                size_t j;
+
+                h5tools_str_append(buffer, "0x");
+                for(j = 0; j < dst_size; j++)
+                    h5tools_str_append(buffer, "%02x", value[i*dst_size+j]);
+            }
+            else if(H5T_SGN_NONE == H5Tget_sign(native)) {
+                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+                 *strangely, unless use another pointer "copy".*/
+                copy = value + i * dst_size;
+                h5tools_str_append(buffer, HSIZE_T_FORMAT, *((unsigned long long*)((void*)copy)));
+            }
+            else {
+                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+                 *strangely, unless use another pointer "copy".*/
+                copy = value + i * dst_size;
+                h5tools_str_append(buffer, "%"H5_PRINTF_LL_WIDTH"d",
+                        *((long long*)((void*)copy)));
+            }
+        }
+
+        /* Release resources */
+        for(i = 0; i < (unsigned)nmembs; i++)
+            H5free_memory(name[i]);
+        HDfree(name);
+        HDfree(value);
+    }
+    else
+        h5tools_str_append(buffer, "\n%*s <empty>", ind+4, "");
+
+    h5tools_str_append(buffer, "\n%*s}", ind, "");
+
+    H5Tclose(super);
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_string_type
+ *
+ * Purpose: Print information about a string data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_string_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    H5T_str_t  pad;
+    const char  *pad_s=NULL;
+    H5T_cset_t  cset;
+    const char  *cset_s=NULL;
+
+    if (H5T_STRING!=H5Tget_class(type)) return FALSE;
+
+    /* Padding */
+    pad = H5Tget_strpad(type);
+    switch (pad) {
+        case H5T_STR_NULLTERM:
+            pad_s = "null-terminated";
+            break;
+        case H5T_STR_NULLPAD:
+            pad_s = "null-padded";
+            break;
+        case H5T_STR_SPACEPAD:
+            pad_s = "space-padded";
+            break;
+        case H5T_STR_RESERVED_3:
+        case H5T_STR_RESERVED_4:
+        case H5T_STR_RESERVED_5:
+        case H5T_STR_RESERVED_6:
+        case H5T_STR_RESERVED_7:
+        case H5T_STR_RESERVED_8:
+        case H5T_STR_RESERVED_9:
+        case H5T_STR_RESERVED_10:
+        case H5T_STR_RESERVED_11:
+        case H5T_STR_RESERVED_12:
+        case H5T_STR_RESERVED_13:
+        case H5T_STR_RESERVED_14:
+        case H5T_STR_RESERVED_15:
+        case H5T_STR_ERROR:
+            pad_s = "unknown-format";
+            break;
+        default:
+            ;
+        break;
+    }
+
+    /* Character set */
+    cset = H5Tget_cset(type);
+    switch (cset) {
+        case H5T_CSET_ASCII:
+            cset_s = "ASCII";
+            break;
+        case H5T_CSET_UTF8:
+            cset_s = "UTF-8";
+            break;
+        case H5T_CSET_RESERVED_2:
+        case H5T_CSET_RESERVED_3:
+        case H5T_CSET_RESERVED_4:
+        case H5T_CSET_RESERVED_5:
+        case H5T_CSET_RESERVED_6:
+        case H5T_CSET_RESERVED_7:
+        case H5T_CSET_RESERVED_8:
+        case H5T_CSET_RESERVED_9:
+        case H5T_CSET_RESERVED_10:
+        case H5T_CSET_RESERVED_11:
+        case H5T_CSET_RESERVED_12:
+        case H5T_CSET_RESERVED_13:
+        case H5T_CSET_RESERVED_14:
+        case H5T_CSET_RESERVED_15:
+        case H5T_CSET_ERROR:
+            cset_s = "unknown-character-set";
+            break;
+        default:
+            ;
+        break;
+    }
+
+    if (H5Tis_variable_str(type)) {
+        h5tools_str_append(buffer, "variable-length");
+    }
+    else {
+        h5tools_str_append(buffer, "%lu-byte", (unsigned long)H5Tget_size(type));
+    }
+    h5tools_str_append(buffer, " %s %s string", pad_s, cset_s);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_reference_type
+ *
+ * Purpose: Prints information about a reference data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-04
+ *  Knows about object and dataset region references.
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_reference_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    if (H5T_REFERENCE!=H5Tget_class(type)) return FALSE;
+
+    if (H5Tequal(type, H5T_STD_REF_OBJ)==TRUE) {
+        h5tools_str_append(buffer, "object reference");
+    }
+    else if (H5Tequal(type, H5T_STD_REF_DSETREG)==TRUE) {
+        h5tools_str_append(buffer, "dataset region reference");
+    }
+    else {
+        h5tools_str_append(buffer, "%lu-byte unknown reference",
+                (unsigned long)H5Tget_size(type));
+    }
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_opaque_type
+ *
+ * Purpose: Prints information about an opaque data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Monday, June  7, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_opaque_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    char *tag;
+    size_t size;
+
+    if (H5T_OPAQUE!=H5Tget_class(type)) return FALSE;
+
+    size = H5Tget_size(type);
+    h5tools_str_append(buffer, "%lu-byte opaque type", (unsigned long)size);
+    if ((tag=H5Tget_tag(type))) {
+        h5tools_str_append(buffer, "\n%*s(tag = \"", ind, "");
+        print_string(buffer, tag, FALSE);
+        h5tools_str_append(buffer, "\")");
+        H5free_memory(tag);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_vlen_type
+ *
+ * Purpose:     Print information about a variable-length type
+ *
+ * Return:      Success:        TRUE
+ *
+ *              Failure:        FALSE
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, December  1, 2000
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_vlen_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    hid_t       super;
+
+    if (H5T_VLEN!=H5Tget_class(type)) return FALSE;
+
+    h5tools_str_append(buffer, "variable length of\n%*s", ind+4, "");
+    super = H5Tget_super(type);
+    print_type(buffer, super, ind+4);
+    H5Tclose(super);
+    return TRUE;
+}
+
+

+/*---------------------------------------------------------------------------
+ * Purpose:     Print information about an array type
+ *
+ * Return:      Success:        TRUE
+ *
+ *              Failure:        FALSE
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, January 31, 2002
+ *
+ * Modifications:
+ *---------------------------------------------------------------------------
+ */
+static hbool_t
+print_array_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    hid_t       super;
+    int         ndims, i;
+    hsize_t     *dims=NULL;
+
+    if (H5T_ARRAY!=H5Tget_class(type))
+        return FALSE;
+    ndims = H5Tget_array_ndims(type);
+    if (ndims) {
+        dims = (hsize_t *)HDmalloc((unsigned)ndims * sizeof(dims[0]));
+        H5Tget_array_dims2(type, dims);
+
+        /* Print dimensions */
+        for (i=0; i<ndims; i++)
+            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT , i?",":"[", dims[i]);
+        h5tools_str_append(buffer, "]");
+
+        HDfree(dims);
+    }
+    else
+        h5tools_str_append(buffer, " [SCALAR]\n", rawoutstream);
+
+
+    /* Print parent type */
+    h5tools_str_append(buffer, " ");
+    super = H5Tget_super(type);
+    print_type(buffer, super, ind+4);
+    H5Tclose(super);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_bitfield_type
+ *
+ * Purpose: Print information about a bitfield type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Pedro Vicente
+ *              Tuesday, May  20, 2003
+ *
+ * Modifications:
+ *              Robb Matzke, LLNL 2003-06-05
+ *              Generalized Pedro's original if/then/else.  Also display
+ *              precision/offset information.
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_bitfield_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+
+    if (H5T_BITFIELD!=H5Tget_class(type)) return FALSE;
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        } else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        } else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        } else {
+            order_s = "unknown-byte-order";
+        }
+    } else {
+        order_s = "";
+    }
+
+    h5tools_str_append(buffer, "%lu-bit%s bitfield",
+           (unsigned long)(8*H5Tget_size(type)), order_s);
+    print_precision(buffer, type, ind);
+    return TRUE;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_type
+ *
+ * Purpose: Prints a data type definition.  The definition is printed
+ *  without any leading space or trailing line-feed (although
+ *  there might be line-feeds inside the type definition).  The
+ *  first line is assumed to have IND characters before it on
+ *  the same line (printed by the caller).
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-11
+ *  Prints the OID of shared data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_class_t  data_class = H5Tget_class(type);
+
+    /* Bad data type */
+    if (type<0) {
+        h5tools_str_append(buffer,"<ERROR>");
+        return;
+    }
+
+    /* Shared? If so then print the type's OID */
+    if(H5Tcommitted(type)) {
+        H5O_info_t  oi;
+
+        if(H5Oget_info(type, &oi) >= 0)
+            h5tools_str_append(buffer,"shared-%lu:"H5_PRINTF_HADDR_FMT" ",
+                    oi.fileno, oi.addr);
+        else
+            h5tools_str_append(buffer,"shared ");
+    } /* end if */
+
+    /* Print the type */
+    if(print_native_type(buffer, type, ind) ||
+            print_ieee_type(buffer, type, ind) ||
+            print_cmpd_type(buffer, type, ind) ||
+            print_enum_type(buffer, type, ind) ||
+            print_string_type(buffer, type, ind) ||
+            print_reference_type(buffer, type, ind) ||
+            print_vlen_type(buffer, type, ind) ||
+            print_array_type(buffer, type, ind) ||
+            print_opaque_type(buffer, type, ind) ||
+            print_bitfield_type(buffer, type, ind))
+        return;
+
+    /* Unknown type */
+    h5tools_str_append(buffer,"%lu-byte class-%u unknown",
+            (unsigned long)H5Tget_size(type), (unsigned)data_class);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dump_dataset_values
+ *
+ * Purpose: Prints all values of a dataset.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Tuesday, July 21, 1998
+ *
+ * Modifications:
+ *  Robb Matzke, 1999-09-27
+ *  Understands the simple_output_g switch which causes data to
+ *  be displayed in a more machine-readable format.
+ *-------------------------------------------------------------------------
+ */
+static void
+dump_dataset_values(hid_t dset)
+{
+    char                string_prefix[64];
+    static char         fmt_double[16];
+    static char         fmt_float[16];
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t     outputformat;
+    h5tool_format_t    *info = &ls_dataformat;
+
+    hid_t  f_type = H5Dget_type(dset);
+    size_t  size = H5Tget_size(f_type);
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    outputformat = *info;
+    outputformat.line_1st  = NULL;
+    if (simple_output_g) {
+        outputformat.idx_fmt = "";
+        outputformat.line_per_line = 1;
+        outputformat.line_multi_new = 0;
+        outputformat.line_pre  = "        ";
+        outputformat.line_cont = "         ";
+
+        outputformat.arr_pre = "";
+        outputformat.arr_suf = "";
+        outputformat.arr_sep = " ";
+
+        if (!label_g) {
+            outputformat.cmpd_pre = "";
+            outputformat.cmpd_suf = "";
+        }
+        outputformat.cmpd_sep = " ";
+
+        if (label_g) outputformat.cmpd_name = "%s=";
+
+        outputformat.elmt_suf1 = " ";
+        outputformat.str_locale = ESCAPE_HTML;
+
+    }
+    else {
+        if (no_line_wrap_g) {
+            outputformat.line_per_line = 1;
+        }
+        else {
+            outputformat.line_ncols = (unsigned)width_g;
+        }
+        if (label_g) outputformat.cmpd_name = "%s=";
+        outputformat.line_pre  = "        %s ";
+        outputformat.line_cont = "        %s  ";
+        outputformat.str_repeat = 8;
+
+        outputformat.arr_pre = NULL;
+        outputformat.arr_suf = NULL;
+        outputformat.arr_sep = NULL;
+
+        outputformat.cmpd_pre = NULL;
+        outputformat.cmpd_suf = NULL;
+        outputformat.cmpd_sep = NULL;
+
+        outputformat.vlen_sep = NULL;
+        outputformat.vlen_pre = NULL;
+        outputformat.vlen_suf = NULL;
+        outputformat.vlen_end = NULL;
+    }
+    outputformat.arr_linebreak = 0;
+    /* Floating point types should display full precision */
+    HDsnprintf(fmt_float, sizeof(fmt_float), "%%1.%dg", FLT_DIG);
+    outputformat.fmt_float = fmt_float;
+    HDsnprintf(fmt_double, sizeof(fmt_double), "%%1.%dg", DBL_DIG);
+    outputformat.fmt_double = fmt_double;
+
+    if (hexdump_g) {
+        /* Print all data in hexadecimal format if the `-x' or `--hexdump'
+         * command line switch was given. */
+        outputformat.raw = TRUE;
+    }
+    else if (string_g && 1==size && H5T_INTEGER==H5Tget_class(f_type)) {
+        /* Print 1-byte integer data as an ASCI character string instead of
+         * integers if the `-s' or `--string' command-line option was given. */
+        outputformat.ascii = TRUE;
+        outputformat.elmt_suf1 = "";
+        outputformat.elmt_suf2 = "";
+        HDsnprintf(string_prefix, sizeof(string_prefix), "%s\"", outputformat.line_pre);
+        outputformat.line_pre = string_prefix;
+        outputformat.line_suf = "\"";
+    }
+    info = &outputformat;
+
+    ctx.indent_level = 2;
+    ctx.cur_column = (size_t)curr_pos;
+    /* Print all the values. */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "    Data:\n");
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.need_prefix = TRUE;
+    ctx.cur_column = (size_t)curr_pos;
+    if (h5tools_dump_dset(rawoutstream, info, &ctx, dset, NULL) < 0) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "        Unable to print data.");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+    H5Tclose(f_type);
+
+    h5tools_str_close(&buffer);
+
+    PRINTVALSTREAM(rawoutstream, "\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_attr
+ *
+ * Purpose: Prints information about attributes.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Friday, June  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_attr(hid_t obj, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo,
+    void H5_ATTR_UNUSED *op_data)
+{
+    hid_t               attr = -1;
+    hid_t               space = -1;
+    hid_t               type = -1;
+    hid_t               p_type = -1;
+    hsize_t             size[H5S_MAX_RANK];
+    hsize_t             nelmts = 1;
+    hsize_t             temp_need;
+    size_t              need;
+    int                 ndims;
+    int                 i;
+    void               *buf;
+    H5S_class_t         space_type;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+    h5tool_format_t     outputformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "    Attribute: ");
+
+    print_string(&buffer, attr_name, TRUE);
+
+    if((attr = H5Aopen(obj, attr_name, H5P_DEFAULT))) {
+        space = H5Aget_space(attr);
+        type = H5Aget_type(attr);
+
+        /* Data space */
+        ndims = H5Sget_simple_extent_dims(space, size, NULL);
+        space_type = H5Sget_simple_extent_type(space);
+        switch(space_type) {
+            case H5S_SCALAR:
+                /* scalar dataspace */
+                h5tools_str_append(&buffer, " scalar\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_SIMPLE:
+                /* simple dataspace */
+                h5tools_str_append(&buffer, " {");
+                for (i=0; i<ndims; i++) {
+                    h5tools_str_append(&buffer, "%s" HSIZE_T_FORMAT, i?", ":"", size[i]);
+                    nelmts *= size[i];
+                }
+                h5tools_str_append(&buffer, "}\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_NULL:
+                /* null dataspace */
+                h5tools_str_append(&buffer, " null\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_NO_CLASS:
+            default:
+                /* Unknown dataspace type */
+                h5tools_str_append(&buffer, " unknown\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+        } /* end switch */
+
+        /* Data type */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "        Type:      ");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Data */
+        outputformat = *info;
+
+        if(nelmts < 5) {
+            outputformat.idx_fmt = "";
+            outputformat.line_1st  = "        Data:  ";
+            outputformat.line_pre  = "               ";
+            outputformat.line_cont = "                ";
+            outputformat.str_repeat = 8;
+
+        }
+        else {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "        Data:\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            outputformat.line_1st  = NULL;
+            outputformat.line_pre  = "            %s ";
+            outputformat.line_cont = "            %s  ";
+            outputformat.str_repeat = 8;
+        }
+
+        outputformat.line_ncols = (unsigned)width_g;
+        if(label_g)
+            outputformat.cmpd_name = "%s=";
+        if(string_g && 1==H5Tget_size(type) &&
+                H5T_INTEGER==H5Tget_class(type)) {
+            outputformat.ascii = TRUE;
+            outputformat.elmt_suf1 = "";
+            outputformat.elmt_suf2 = "";
+            outputformat.line_pre = "            %s \"";
+            outputformat.line_suf = "\"";
+        } /* end if */
+
+
+        outputformat.arr_pre = NULL;
+        outputformat.arr_suf = NULL;
+        outputformat.arr_sep = NULL;
+
+        outputformat.cmpd_pre = NULL;
+        outputformat.cmpd_suf = NULL;
+        outputformat.cmpd_sep = NULL;
+
+        outputformat.vlen_sep = NULL;
+        outputformat.vlen_pre = NULL;
+        outputformat.vlen_suf = NULL;
+        outputformat.vlen_end = NULL;
+
+        info = &outputformat;
+
+        if(hexdump_g)
+           p_type = H5Tcopy(type);
+        else
+           p_type = h5tools_get_native_type(type);
+
+        if(p_type >= 0) {
+            /* VL data special information */
+            unsigned int        vl_data = 0; /* contains VL datatypes */
+
+            /* Check if we have VL data in the dataset's datatype */
+            if (h5tools_detect_vlen(p_type) == TRUE)
+                vl_data = TRUE;
+
+            temp_need= nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
+            HDassert(temp_need == (hsize_t)((size_t)temp_need));
+            need = (size_t)temp_need;
+            buf = HDmalloc(need);
+            HDassert(buf);
+            if(H5Aread(attr, p_type, buf) >= 0) {
+                ctx.need_prefix = TRUE;
+                ctx.indent_level = 2;
+                ctx.cur_column = (size_t)curr_pos;
+                h5tools_dump_mem(rawoutstream, info, &ctx, attr, p_type, space, buf);
+            }
+
+            /* Reclaim any VL memory, if necessary */
+            if (vl_data)
+                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
+
+            HDfree(buf);
+            H5Tclose(p_type);
+        } /* end if */
+
+        H5Sclose(space);
+        H5Tclose(type);
+        H5Aclose(attr);
+    }
+    h5tools_str_close(&buffer);
+
+    PRINTVALSTREAM(rawoutstream, "\n");
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dataset_list1
+ *
+ * Purpose: List information about a dataset which should appear on the
+ *  same line as the dataset name.  This information will precede
+ *  information which is applicable to all objects which will be
+ *  printed by the caller.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, August 27, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dataset_list1(hid_t dset)
+{
+    hsize_t     cur_size[H5S_MAX_RANK];   /* current dataset dimensions */
+    hsize_t     max_size[H5S_MAX_RANK];   /* maximum dataset dimensions */
+    hid_t       space;          /* data space                 */
+    int         ndims;          /* dimensionality             */
+    H5S_class_t space_type;     /* type of dataspace          */
+    int   i;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Information that goes on the same row as the name.  The name has
+     * already been printed. */
+    space = H5Dget_space(dset);
+    space_type = H5Sget_simple_extent_type(space);
+    ndims = H5Sget_simple_extent_dims(space, cur_size, max_size);
+    h5tools_str_append(&buffer, " {");
+    for (i=0; i<ndims; i++) {
+        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", cur_size[i]);
+        if (max_size[i]==H5S_UNLIMITED) {
+            h5tools_str_append(&buffer, "/%s", "Inf");
+        }
+        else if (max_size[i]!=cur_size[i] || verbose_g>0) {
+            h5tools_str_append(&buffer, "/"HSIZE_T_FORMAT, max_size[i]);
+        }
+    }
+    if (space_type==H5S_SCALAR) h5tools_str_append(&buffer, "SCALAR");
+    else if (space_type==H5S_NULL) h5tools_str_append(&buffer, "NULL");
+    h5tools_str_append(&buffer, "}");
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    H5Sclose (space);
+
+    h5tools_str_close(&buffer);
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dataset_list2
+ *
+ * Purpose: List information about a dataset which should appear after
+ *  information which is general to all objects.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, August 27, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dataset_list2(hid_t dset, const char H5_ATTR_UNUSED *name)
+{
+    hid_t       dcpl;           /* dataset creation property list */
+    hid_t       type;           /* data type of dataset */
+    hid_t       space;          /* data space of dataset */
+    int         nf;             /* number of filters */
+    unsigned    filt_flags;     /* filter flags */
+    H5Z_filter_t filt_id;       /* filter identification number */
+    unsigned    cd_values[20];  /* filter client data values */
+    size_t      cd_nelmts;      /* filter client number of values */
+    size_t      cd_num;         /* filter client data counter */
+    char        f_name[256];    /* filter/file name */
+    char        dset_name[256];    /* filter/file name */
+    char        s[64];          /* temporary string buffer */
+    off_t       f_offset;       /* offset in external file */
+    hsize_t     f_size;         /* bytes used in external file */
+    hsize_t     total, used;    /* total size or offset */
+    int         ndims;          /* dimensionality */
+    int         n, max_len;     /* max extern file name length */
+    double      utilization;    /* percent utilization of storage */
+    H5T_class_t tclass;         /* datatype class identifier */
+    int         i;
+    H5D_layout_t     stl;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    if(verbose_g > 0) {
+        dcpl = H5Dget_create_plist(dset);
+        space = H5Dget_space(dset);
+        type = H5Dget_type(dset);
+
+        stl = H5Pget_layout(dcpl);
+        switch (stl) {
+            case H5D_CHUNKED:
+                {
+                    hsize_t     chsize[64];     /* chunk size in elements */
+
+                    ndims = H5Pget_chunk(dcpl, (int)NELMTS(chsize), chsize/*out*/);
+                    h5tools_str_append(&buffer, "    %-10s {", "Chunks:");
+                    total = H5Tget_size(type);
+                    for (i=0; i<ndims; i++) {
+                        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", chsize[i]);
+                        total *= chsize[i];
+                    }
+                    h5tools_str_append(&buffer, "} "HSIZE_T_FORMAT" bytes\n", total);
+                }
+                break;
+            case H5D_COMPACT:
+                break;
+            case H5D_CONTIGUOUS:
+                /* Print information about external storage */
+                if((nf = H5Pget_external_count(dcpl)) > 0) {
+                    for(i = 0, max_len = 0; i < nf; i++) {
+                        if(H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, NULL, NULL) < 0)
+                            continue;
+                        n = print_string(NULL, f_name, TRUE);
+                        max_len = MAX(max_len, n);
+                    } /* end for */
+                    h5tools_str_append(&buffer, "    %-10s %d external file%s\n",
+                            "Extern:", nf, 1==nf?"":"s");
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s %s\n",
+                            "ID", "DSet-Addr", "File-Addr", "Bytes", "File");
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
+                            "----", "----------", "----------", "----------");
+                    for (i=0; i<max_len; i++) h5tools_str_append(&buffer, "-");
+                    h5tools_str_append(&buffer, "\n");
+                    for (i=0, total=0; i<nf; i++) {
+                        if (H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, &f_offset, &f_size)<0) {
+                            h5tools_str_append(&buffer,
+                                    "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10s %10s ***ERROR*** %s\n",
+                                    i, total, "", "",
+                                    i+1<nf?"Following addresses are incorrect":"");
+                        }
+                        else if (H5S_UNLIMITED==f_size) {
+                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10s ",
+                                    i, total, (hsize_t)f_offset, "INF");
+                            print_string(&buffer, f_name, TRUE);
+                        }
+                        else {
+                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u ",
+                                    i, total, (hsize_t)f_offset, f_size);
+                            print_string(&buffer, f_name, TRUE);
+                        }
+                        h5tools_str_append(&buffer, "\n");
+                        total += f_size;
+                    }
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
+                            "----", "----------", "----------", "----------");
+                    for (i=0; i<max_len; i++)
+                        h5tools_str_append(&buffer, "-");
+                    h5tools_str_append(&buffer, "\n");
+                } /* end if */
+                break;
+            default:
+                HDassert(0);
+                break;
+        }
+        /* Print total raw storage size */
+        total = (hsize_t)H5Sget_simple_extent_npoints(space) * H5Tget_size(type);
+        used = H5Dget_storage_size(dset);
+        tclass = H5Tget_class(type);
+        h5tools_str_append(&buffer, "    %-10s ", "Storage:");
+        switch (tclass)
+        {
+
+        case H5T_VLEN:
+            h5tools_str_append(&buffer, "information not available");
+            break;
+
+        case H5T_REFERENCE:
+            if ( H5Tequal(type, H5T_STD_REF_DSETREG))
+            {
+                h5tools_str_append(&buffer, "information not available");
+            }
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_COMPOUND:
+        case H5T_ENUM:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            h5tools_str_append(&buffer, HSIZE_T_FORMAT" logical byte%s, "HSIZE_T_FORMAT" allocated byte%s",
+                total, 1==total?"":"s",
+                used, 1==used?"":"s");
+            if (used>0)
+            {
+                utilization = ((double)total * (double)100.0f) / (double)used;
+                h5tools_str_append(&buffer, ", %1.2f%% utilization", utilization);
+            }
+        }
+
+        h5tools_str_append(&buffer, "\n");
+
+        /* Print information about raw data filters */
+        if((nf = H5Pget_nfilters(dcpl)) > 0) {
+            for(i = 0; i < nf; i++) {
+                cd_nelmts = NELMTS(cd_values);
+                filt_id = H5Pget_filter2(dcpl, (unsigned)i, &filt_flags, &cd_nelmts,
+                        cd_values, sizeof(f_name), f_name, NULL);
+                f_name[sizeof(f_name) - 1] = '\0';
+                HDsnprintf(s, sizeof(s), "Filter-%d:", i);
+                h5tools_str_append(&buffer, "    %-10s %s-%u %s {", s,
+                        (f_name[0] ? f_name : "method"),
+                        (unsigned)filt_id,
+                        ((filt_flags & H5Z_FLAG_OPTIONAL) ? "OPT" : ""));
+                for(cd_num = 0; cd_num < cd_nelmts; cd_num++)
+                    h5tools_str_append(&buffer, "%s%u", (cd_num ? ", " : ""), cd_values[cd_num]);
+                h5tools_str_append(&buffer, "}\n");
+            } /* end for */
+        } /* end if */
+
+        /* Print data type */
+        h5tools_str_append(&buffer, "    %-10s ", "Type:");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Print address information */
+        if(address_g)
+            H5Ddebug(dset);
+
+        /* Close stuff */
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Pclose(dcpl);
+    } /* end if */
+
+    h5tools_str_close(&buffer);
+
+    if(data_g)
+        dump_dataset_values(dset);
+
+    return 0;
+} /* end dataset_list2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: datatype_list2
+ *
+ * Purpose: List information about a datatype which should appear after
+ *  information which is general to all objects.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+datatype_list2(hid_t type, const char H5_ATTR_UNUSED *name)
+{
+    if (verbose_g>0) {
+        hsize_t             curr_pos = 0;        /* total data element position   */
+        h5tools_str_t       buffer;          /* string into which to render   */
+        h5tools_context_t   ctx;             /* print context  */
+        h5tool_format_t    *info = &ls_dataformat;
+
+        HDmemset(&ctx, 0, sizeof(ctx));
+        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+        h5tools_str_reset(&buffer);
+
+        h5tools_str_append(&buffer, "    %-10s ", "Type:");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+    }
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_obj
+ *
+ * Purpose: Prints information about an object
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, November 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_obj(const char *name, const H5O_info_t *oinfo, const char *first_seen, void *_iter)
+{
+    H5O_type_t          obj_type = oinfo->type;          /* Type of the object */
+    iter_t             *iter = (iter_t*)_iter;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Print the link's name, either full name or base name */
+    if(!iter->symlink_target)
+        print_obj_name(&buffer, iter, name, "");
+
+    /* Check object information */
+    if(oinfo->type < 0 || oinfo->type >= H5O_TYPE_NTYPES) {
+        h5tools_str_append(&buffer, "Unknown type(%d)", (int)oinfo->type);
+        obj_type = H5O_TYPE_UNKNOWN;
+    }
+    if(iter->symlink_target)
+        h5tools_str_append(&buffer, "{");
+    if(obj_type >= 0 && dispatch_g[obj_type].name)
+        h5tools_str_append(&buffer, "%s", dispatch_g[obj_type].name);
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /* Check if we've seen this object before */
+    if(first_seen) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, ", same as ");
+        print_string(&buffer, first_seen, TRUE);
+        if(!iter->symlink_target) {
+            h5tools_str_append(&buffer, "\n");
+        }
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    } /* end if */
+    else {
+        hid_t obj = (-1);               /* ID of object opened */
+
+        /* Open the object.  Not all objects can be opened.  If this is the case
+         * then return right away.
+         */
+        if(obj_type >= 0 && (obj = H5Oopen(iter->fid, name, H5P_DEFAULT)) < 0) {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, " *ERROR*\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;
+        } /* end if */
+
+        /* List the first line of information for the object. */
+        if(obj_type >= 0 && dispatch_g[obj_type].list1)
+            (dispatch_g[obj_type].list1)(obj);
+        if(!iter->symlink_target || (verbose_g > 0)) {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+
+        /* Show detailed information about the object, beginning with information
+         * which is common to all objects. */
+        if(verbose_g > 0) {
+            size_t buf_size = 0;
+            char* comment = NULL;
+            ssize_t cmt_bufsize = -1;
+
+            /* Display attributes */
+            if(obj_type >= 0)
+                H5Aiterate2(obj, H5_INDEX_NAME, H5_ITER_INC, NULL, list_attr, NULL);
+
+            /* Object location & reference count */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "    %-10s %lu:"H5_PRINTF_HADDR_FMT"\n", "Location:", oinfo->fileno, oinfo->addr);
+            h5tools_str_append(&buffer, "    %-10s %u\n", "Links:", (unsigned)oinfo->rc);
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* Modification time */
+            if(oinfo->mtime > 0) {
+                char buf[256];
+                struct tm *tm;
+
+                if(simple_output_g)
+                    tm = HDgmtime(&(oinfo->mtime));
+                else
+                    tm = HDlocaltime(&(oinfo->mtime));
+                if(tm) {
+                    HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "    %-10s %s\n", "Modified:", buf);
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                } /* end if */
+            } /* end if */
+
+            /* Object comment */
+            cmt_bufsize = H5Oget_comment(obj, comment, buf_size);
+
+            /* if the actual length of the comment is longer than cmt_bufsize, then call
+             * H5Oget_comment again with the correct value.
+             * If the call to H5Oget_comment returned an error, skip this block */
+            if (cmt_bufsize > 0) {
+                comment = (char *)HDmalloc((size_t)cmt_bufsize + 1); /* new_size including null terminator */
+                if(comment) {
+                    cmt_bufsize = H5Oget_comment(obj, comment, (size_t)cmt_bufsize);
+                    if(cmt_bufsize > 0) {
+                        comment[cmt_bufsize] = 0;
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "    %-10s \"", "Comment:");
+                        print_string(&buffer, comment, FALSE);
+                        h5tools_str_append(&buffer, "\"\n");
+                        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    } /* end if */
+                    HDfree(comment);
+                }
+            }
+        } /* end if */
+
+        /* Detailed list for object */
+        if(obj_type >= 0 && dispatch_g[obj_type].list2)
+            (dispatch_g[obj_type].list2)(obj, name);
+
+        /* Close the object. */
+        if(obj_type >= 0)
+            H5Oclose(obj);
+    } /* end else */
+
+done:
+    if(iter->symlink_target) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "}\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        iter->symlink_target = FALSE;
+    }
+    h5tools_str_close(&buffer);
+
+    return 0;
+} /* end list_obj() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_lnk
+ *
+ * Purpose: Prints information about a link
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *              Thursday, November 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_lnk(const char *name, const H5L_info_t *linfo, void *_iter)
+{
+    char *buf=NULL;
+    iter_t *iter = (iter_t*)_iter;
+    int ret;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tool_link_info_t lnk_info;
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* init linkinfo struct */
+    HDmemset(&lnk_info, 0, sizeof(h5tool_link_info_t));
+
+    /* if verbose, make H5tools_get_symlink_info() display more */
+    if (verbose_g)
+        lnk_info.opt.msg_mode=1;
+
+    /* Print the link's name, either full name or base name */
+    print_obj_name(&buffer, iter, name, "");
+
+    switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_symlink_g);
+            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
+             * so it will be freed via buf later */
+            buf = (char*)lnk_info.trg_path;
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (no_dangling_link_g && ret == 0)
+                iter->symlink_list->dangle_link = TRUE;
+
+            h5tools_str_append(&buffer, "Soft Link {");
+            h5tools_str_append(&buffer, buf);
+            h5tools_str_append(&buffer, "}");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            if(follow_symlink_g)
+            {
+                hbool_t orig_grp_literal = grp_literal_g;
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, " ");
+
+                /* Check if we have already seen this softlink */
+                if(symlink_is_visited(iter->symlink_list, linfo->type, NULL, buf))
+                {
+                    h5tools_str_append(&buffer, "{Already Visited}\n");
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    goto done;
+                }
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* Add this link to the list of seen softlinks */
+                if(symlink_visit_add(iter->symlink_list, linfo->type, NULL, buf) < 0)
+                    goto done;
+
+                /* Adjust user data to specify that we are operating on the
+                 * target of an soft link */
+                iter->symlink_target = TRUE;
+
+                /* Prevent recursive listing of soft link target if
+                 * recursive_g is off */
+                if(!recursive_g)
+                    grp_literal_g = TRUE;
+                /* Recurse through the soft link */
+                if(visit_obj(iter->fid, name, iter) < 0)
+                {
+                    grp_literal_g = orig_grp_literal;
+                    goto done;
+                }
+
+                grp_literal_g = orig_grp_literal;
+            }
+            else {
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            {
+            const char *filename;
+            const char *path;
+            hbool_t follow_link = follow_symlink_g || follow_elink_g;
+
+            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_link);
+            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
+             * so it will be freed via buf later */
+            buf = (char*)lnk_info.trg_path;
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (no_dangling_link_g && ret == 0)
+                iter->symlink_list->dangle_link = TRUE;
+
+            if(H5Lunpack_elink_val(buf, linfo->u.val_size, NULL, &filename, &path) < 0)
+                goto done;
+
+            h5tools_str_append(&buffer, "External Link {");
+            h5tools_str_append(&buffer, filename);
+            h5tools_str_append(&buffer, "/");
+            if(*path != '/')
+                h5tools_str_append(&buffer, "/");
+                        h5tools_str_append(&buffer, path);
+            h5tools_str_append(&buffer, "}");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* Recurse through the external link */
+            /* keep the follow_elink_g for backward compatibility with -E */
+            if(follow_link)
+            {
+                hbool_t orig_grp_literal = grp_literal_g;
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, " ");
+
+                /* Check if we have already seen this elink */
+                if(symlink_is_visited(iter->symlink_list, linfo->type, filename, path))
+                {
+                    h5tools_str_append(&buffer, "{Already Visited}\n");
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    goto done;
+                }
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* Add this link to the list of seen elinks */
+                if(symlink_visit_add(iter->symlink_list, linfo->type, filename, path) < 0)
+                {
+                    goto done;
+                }
+
+                /* Adjust user data to specify that we are operating on the
+                 * target of an external link */
+                iter->symlink_target = TRUE;
+
+                /* Prevent recursive listing of external link target if
+                 * recursive_g is off */
+                if(!recursive_g)
+                    grp_literal_g = TRUE;
+
+                /* Recurse through the external link */
+                if(visit_obj(iter->fid, name, iter) < 0) {
+                    grp_literal_g = orig_grp_literal;
+                    goto done;
+                }
+
+                grp_literal_g = orig_grp_literal;
+            }
+            else
+                PRINTVALSTREAM(rawoutstream, "\n");
+            }
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_HARD:
+        case H5L_TYPE_MAX:
+        default:
+            h5tools_str_append(&buffer, "UD Link {cannot follow UD links}\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+    } /* end switch */
+
+done:
+    h5tools_str_close(&buffer);
+
+    if (buf)
+        HDfree(buf);
+    return 0;
+} /* end list_lnk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: visit_obj
+ *
+ * Purpose: Begins iteration on an object
+ *
+ * Return:
+ *  Success: 0
+ *  Failure: -1
+ *
+ * Programmer: Neil Fortner
+ *              Wednesday, August 21, 2008
+ *             Mostly copied from main()
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+visit_obj(hid_t file, const char *oname, iter_t *iter)
+{
+    int retval = 0;
+    H5O_info_t oi;              /* Information for object */
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Retrieve info for object to list */
+    if(H5Oget_info_by_name(file, oname, &oi, H5P_DEFAULT) < 0) {
+        if(iter->symlink_target) {
+            h5tools_str_append(&buffer, "{**NOT FOUND**}\n");
+            iter->symlink_target = FALSE;
+        }
+        else
+            print_obj_name(&buffer, iter, oname, "**NOT FOUND**");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        retval = -1;
+        goto done;
+    } /* end if */
+
+    /* Check for group iteration */
+    if(H5O_TYPE_GROUP == oi.type && !grp_literal_g) {
+        /* Get ID for group */
+        if(!iter->symlink_target && (iter->gid = H5Gopen2(file, oname, H5P_DEFAULT)) < 0) {
+            h5tools_str_append(&buffer, "%s: unable to open '%s' as group\n", iter->fname, oname);
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;   /* Previously "continue", when this code was in main().
+                         * We don't "continue" here in order to close the file
+                         * and free the file name properly. */
+        } /* end if */
+
+        /* Delay specifying the name start point so the original object name is
+         * displayed if it is a link or non-group object */
+        iter->name_start = iter->base_len;
+
+        /* Specified name is a group. List the complete contents of the group. */
+        h5trav_visit(file, oname, (hbool_t) (display_root_g || iter->symlink_target), recursive_g, list_obj, list_lnk, iter);
+
+        /* Close group */
+        if(!iter->symlink_target)
+            H5Gclose(iter->gid);
+    } /* end if */
+    else {
+        /* Use file ID for root group ID */
+        iter->gid = file;
+
+        /* Specified name is a non-group object -- list that object */
+        list_obj(oname, &oi, NULL, iter);
+    } /* end else */
+
+done:
+    h5tools_str_close(&buffer);
+
+    return retval;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: get_width
+ *
+ * Purpose: Figure out how wide the screen is.  This is highly
+ *  unportable, but the user can always override the width we
+ *  detect by giving a command-line option. These code snippets
+ *  were borrowed from the GNU less(1).
+ *
+ * Return: Success: Number of columns.
+ *
+ *  Failure: Some default number of columms.
+ *
+ * Programmer: Robb Matzke
+ *              Friday, November  6, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+get_width(void)
+{
+    int  width = 80;  /*the default   */
+    char *s;
+
+    /* Try to get it from the COLUMNS environment variable first since it's
+     * value is sometimes wrong. */
+    if ((s=HDgetenv("COLUMNS")) && *s && isdigit((int)*s))
+        width = (int)HDstrtol(s, NULL, 0);
+
+#if defined(H5_HAVE_STRUCT_VIDEOCONFIG) && defined(H5_HAVE__GETVIDEOCONFIG)
+    {
+        /* Microsoft C */
+        struct videoconfig w;
+        _getvideoconfig(&w);
+        width = w.numtextcols;
+    }
+#elif defined(H5_HAVE_STRUCT_TEXT_INFO) && defined(H5_HAVE_GETTEXTINFO)
+    {
+        /* Borland C or DJGPPC */
+        struct text_info w;
+        gettextinfo(&w);
+        width = w.screenwidth;
+    }
+#elif defined(H5_HAVE_GETCONSOLESCREENBUFFERINFO)
+    {
+        /* Win32 C */
+        CONSOLE_SCREEN_BUFFER_INFO scr;
+        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &scr);
+        width = scr.srWindow.Right - scr.srWindow.Left + 1;
+    }
+#elif defined(H5_HAVE__SCRSIZE)
+    {
+        /* OS/2 */
+        int w[2];
+        _scrsize(w);
+        width = w[0];
+    }
+#elif defined(H5_HAVE_TIOCGWINSZ) && defined(H5_HAVE_IOCTL)
+    {
+        /* Unix with ioctl(TIOCGWINSZ) */
+        struct winsize w;
+        if (ioctl(2, (int)TIOCGWINSZ, &w)>=0 && w.ws_col>0)
+            width = w.ws_col;
+    }
+#elif defined(H5_HAVE_TIOCGETD) && defined(H5_HAVE_IOCTL)
+    {
+        /* Unix with ioctl(TIOCGETD) */
+        struct uwdata w;
+        if (ioctl(2, WIOCGETD, &w)>=0 && w.uw_width>0)
+            width = w.uw_width / w.uw_hs;
+    }
+#endif
+
+    /* Set to at least 1 */
+    if (width<1) width = 1;
+    return width;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: is_valid_args
+ *
+ * Purpose: check if command line arguments are valid
+ *
+ * Return:
+ *  Success: TRUE (1)
+ *  Failure: FALSE (0)
+ *
+ * Programmer:
+ *  Jonathan Kim  (06/15/2010)
+ *
+ *-------------------------------------------------------------------------*/
+static hbool_t
+is_valid_args(void)
+{
+    hbool_t ret = TRUE;
+
+    if(recursive_g && grp_literal_g)
+    {
+        HDfprintf(rawerrorstream, "Error: 'recursive' option not compatible with 'group info' option!\n\n");
+        ret = FALSE;
+        goto out;
+    }
+
+    if(no_dangling_link_g && !follow_symlink_g)
+    {
+        HDfprintf(rawerrorstream, "Error: --no-dangling-links must be used along with --follow-symlinks option!\n\n");
+        ret = FALSE;
+        goto out;
+    }
+
+out:
+    return ret;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: leave
+ *
+ * Purpose: Close HDF5 and MPI and call exit()
+ *
+ * Return: Does not return
+ *
+ * Programmer: Quincey Koziol
+ *              Saturday, January 31, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    HDexit(ret);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Opens a file and lists the specified group
+ *
+ * Return: Success: 0
+ *
+ *  Failure: 1
+ *
+ * Programmer: Robb Matzke
+ *              Monday, March 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    hid_t file = -1;
+    char *fname = NULL, *oname = NULL, *x;
+    const char *s = NULL;
+    char *rest;
+    int  argno;
+    static char root_name[] = "/";
+    char        drivername[50];
+    const char *preferred_driver = NULL;
+    int err_exit = 0;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* Build object display table */
+    DISPATCH(H5O_TYPE_GROUP, "Group", NULL, NULL);
+    DISPATCH(H5O_TYPE_DATASET, "Dataset", dataset_list1, dataset_list2);
+    DISPATCH(H5O_TYPE_NAMED_DATATYPE, "Type", NULL, datatype_list2);
+
+    /* Default output width */
+    width_g = get_width();
+
+    /* Switches come before non-switch arguments */
+    for(argno = 1; argno < argc && '-' == argv[argno][0]; argno++) {
+        if(!HDstrcmp(argv[argno], "--")) {
+            /* Last switch */
+            argno++;
+            break;
+        } else if(!HDstrcmp(argv[argno], "--help")) {
+            usage();
+            leave(EXIT_SUCCESS);
+        } else if(!HDstrcmp(argv[argno], "--address")) {
+            address_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--data")) {
+            data_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--enable-error-stack")) {
+            show_errors_g = TRUE;
+        /* deprecated --errors */
+        } else if(!HDstrcmp(argv[argno], "--errors")) {
+            show_errors_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--follow-symlinks")) {
+            follow_symlink_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--no-dangling-links")) {
+            no_dangling_link_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--external")) {
+            follow_elink_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--full")) {
+            fullname_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--group")) {
+            grp_literal_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--label")) {
+            label_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--recursive")) {
+            recursive_g = TRUE;
+            fullname_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--simple")) {
+            simple_output_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--string")) {
+            string_g = TRUE;
+        } else if(!HDstrncmp(argv[argno], "--vfd=", (size_t)6)) {
+            preferred_driver = argv[argno]+6;
+        } else if(!HDstrncmp(argv[argno], "--width=", (size_t)8)) {
+            width_g = (int)HDstrtol(argv[argno]+8, &rest, 0);
+
+            if(0 == width_g)
+                no_line_wrap_g = TRUE;
+            else if(width_g < 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if(!HDstrcmp(argv[argno], "--width")) {
+            if((argno + 1) >= argc) {
+                usage();
+                leave(EXIT_FAILURE);
+            } else {
+                s = argv[++argno];
+            }
+            width_g = (int)HDstrtol(s, &rest, 0);
+            if(width_g <= 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if(!HDstrcmp(argv[argno], "--verbose")) {
+            verbose_g++;
+        } else if(!HDstrcmp(argv[argno], "--version")) {
+            print_version(h5tools_getprogname());
+            leave(EXIT_SUCCESS);
+        } else if(!HDstrcmp(argv[argno], "--hexdump")) {
+            hexdump_g = TRUE;
+        } else if(!HDstrncmp(argv[argno], "-w", (size_t)2)) {
+            if(argv[argno][2]) {
+                s = argv[argno] + 2;
+            } else if((argno + 1) >= argc) {
+                usage();
+                leave(EXIT_FAILURE);
+            } else {
+                s = argv[++argno];
+            }
+            width_g = (int)HDstrtol(s, &rest, 0);
+
+            if(0 == width_g)
+                no_line_wrap_g = TRUE;
+            else if(width_g < 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if('-'!=argv[argno][1]) {
+            /* Single-letter switches */
+            for(s = argv[argno] + 1; *s; s++) {
+                switch(*s) {
+                    case '?':
+                    case 'h': /* --help */
+                        usage();
+                        leave(EXIT_SUCCESS);
+
+                    case 'a': /* --address */
+                        address_g = TRUE;
+                        break;
+
+                    case 'd': /* --data */
+                        data_g = TRUE;
+                        break;
+
+                    /* deprecated -e */
+                    case 'e': /* --errors */
+                        show_errors_g = TRUE;
+                        break;
+
+                    case 'E': /* --external */
+                        follow_elink_g = TRUE;
+                        break;
+
+                    case 'f': /* --full */
+                        fullname_g = TRUE;
+                        break;
+
+                    case 'g': /* --group */
+                        grp_literal_g = TRUE;
+                        break;
+
+                    case 'l': /* --label */
+                        label_g = TRUE;
+                        break;
+
+                    case 'r': /* --recursive */
+                        recursive_g = TRUE;
+                        fullname_g = TRUE;
+                        break;
+
+                    case 'S': /* --simple */
+                        simple_output_g = TRUE;
+                        break;
+
+                    case 's': /* --string */
+                        string_g = TRUE;
+                        break;
+
+                    case 'v': /* --verbose */
+                        verbose_g++;
+                        break;
+
+                    case 'V': /* --version */
+                        print_version(h5tools_getprogname());
+                        leave(EXIT_SUCCESS);
+
+                    case 'x': /* --hexdump */
+                        hexdump_g = TRUE;
+                        break;
+
+                    default:
+                        usage();
+                        leave(EXIT_FAILURE);
+                } /* end switch */
+            } /* end for */
+        } else {
+            usage();
+            leave(EXIT_FAILURE);
+        }
+    } /* end for */
+
+    /* If no arguments remain then print a usage message (instead of doing
+     * absolutely nothing ;-) */
+    if(argno >= argc) {
+        usage();
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Check for conflicting arguments */
+    if (!is_valid_args())
+    {
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    /* Turn off HDF5's automatic error printing unless you're debugging h5ls */
+    if(!show_errors_g)
+        H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+
+    /* Each remaining argument is an hdf5 file followed by an optional slash
+     * and object name.
+     *
+     * Example: ../dir1/foo/bar/baz
+     *          \_________/\______/
+     *             file       obj
+     *
+     * The dichotomy is determined by calling H5Fopen() repeatedly until it
+     * succeeds. The first call uses the entire name and each subsequent call
+     * chops off the last component. If we reach the beginning of the name
+     * then there must have been something wrong with the file (perhaps it
+     * doesn't exist). */
+    show_file_name_g = (argc-argno > 1); /*show file names if more than one*/
+    while(argno < argc) {
+        H5L_info_t li;
+        iter_t iter;
+        symlink_trav_t symlink_list;
+        size_t u;
+
+        fname = HDstrdup(argv[argno++]);
+        oname = NULL;
+        file = -1;
+
+        while(fname && *fname) {
+            file = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, preferred_driver, drivername, sizeof drivername);
+
+            if(file >= 0) {
+                if(verbose_g) {
+                    PRINTSTREAM(rawoutstream, "Opened \"%s\" with %s driver.\n", fname, drivername);
+                }
+                break; /*success*/
+            } /* end if */
+
+            /* Shorten the file name; lengthen the object name */
+            x = oname;
+            oname = HDstrrchr(fname, '/');
+            if(x)
+                *x = '/';
+            if(!oname)
+                break;
+            *oname = '\0';
+        } /* end while */
+
+        if(file < 0) {
+            HDfprintf(rawerrorstream, "%s: unable to open file\n", argv[argno-1]);
+            HDfree(fname);
+            err_exit = 1;
+            continue;
+        } /* end if */
+        if(oname) {
+            /* Always use absolute paths to avoid confusion, keep track of where
+             * to begin path name output */
+            *oname = '/';
+            iter.base_len = HDstrlen(oname);
+            iter.base_len -= oname[iter.base_len-1] == '/';
+            x = oname;
+            if(NULL == (oname = HDstrdup(oname))) {
+                HDfprintf(rawerrorstream, "memory allocation failed\n");
+                leave(EXIT_FAILURE);
+            }
+            *x = '\0';
+            /* Delay specifying the name start point so the original object name
+             * is displayed if it is a link or non-group object */
+            iter.name_start = 1;
+        }
+        if(!oname || !*oname) {
+            oname = root_name;
+            if(recursive_g)
+                display_root_g = TRUE;
+            iter.base_len = 0;
+            iter.name_start = 0;
+            /* Use x to remember if we have allocated space in oname */
+            x = NULL;
+        } /* end if */
+
+        /* Remember the file information for later */
+        iter.fname = fname;
+        iter.fid = file;
+        iter.gid = -1;
+        iter.symlink_target = FALSE;
+        iter.symlink_list = &symlink_list;
+        iter.symlink_list->dangle_link = FALSE;
+
+        /* Initialize list of visited symbolic links */
+        symlink_list.nused = symlink_list.nalloc = 0;
+        symlink_list.objs = NULL;
+
+        /* Check for root group as object name */
+        if(HDstrcmp(oname, root_name)) {
+            /* Check the type of link given */
+            if(H5Lget_info(file, oname, &li, H5P_DEFAULT) < 0) {
+                hsize_t             curr_pos = 0;        /* total data element position   */
+                h5tools_str_t       buffer;          /* string into which to render   */
+                h5tools_context_t   ctx;             /* print context  */
+                h5tool_format_t    *info = &ls_dataformat;
+
+                HDmemset(&ctx, 0, sizeof(ctx));
+                HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+                h5tools_str_reset(&buffer);
+                print_obj_name(&buffer, &iter, oname, "**NOT FOUND**");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                leave(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else
+            li.type = H5L_TYPE_HARD;
+
+        /* Open the object and display it's information */
+        if(li.type == H5L_TYPE_HARD) {
+            if(visit_obj(file, oname, &iter) < 0)
+                leave(EXIT_FAILURE);
+        } /* end if(li.type == H5L_TYPE_HARD) */
+        else {
+            /* Specified name is not for object -- list that link */
+            /* Use file ID for root group ID */
+            iter.gid = file;
+            list_lnk(oname, &li, &iter);
+        }
+        H5Fclose(file);
+        HDfree(fname);
+        if(x)
+            HDfree(oname);
+
+        for(u=0; u < symlink_list.nused; u++)
+        {
+            if (symlink_list.objs[u].type == H5L_TYPE_EXTERNAL)
+                HDfree(symlink_list.objs[u].file);
+
+            HDfree(symlink_list.objs[u].path);
+        }
+        HDfree(symlink_list.objs);
+
+        /* if no-dangling-links option specified and dangling link found */
+        if (no_dangling_link_g && iter.symlink_list->dangle_link)
+            err_exit = 1;
+    } /* end while */
+
+    if (err_exit)
+        leave(EXIT_FAILURE);
+    else
+        leave(EXIT_SUCCESS);
+} /* end main() */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/h5ls/testh5ls.sh.in b/gatb-core/thirdparty/hdf5/tools/h5ls/testh5ls.sh.in
new file mode 100644
index 0000000..bf40bfa
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/h5ls/testh5ls.sh.in
@@ -0,0 +1,430 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5ls tool
+
+srcdir=@srcdir@
+
+TESTNAME=h5ls
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5LS=h5ls               # The tool name
+H5LS_BIN=`pwd`/$H5LS    # The path of the tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+NLINES=20          # Max. lines of output to display if test fails
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+WORDS_BIGENDIAN="@WORDS_BIGENDIAN@"
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes      # default is yes
+
+# source dirs
+SRC_TOOLS="$srcdir/.."
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TESTDIR=./testfiles
+test -d $TESTDIR || mkdir $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5LS_TESTFILES/tall.h5
+$SRC_H5LS_TESTFILES/tarray1.h5
+$SRC_H5LS_TESTFILES/tattr2.h5
+$SRC_H5LS_TESTFILES/tattrreg.h5
+$SRC_H5LS_TESTFILES/tcompound.h5
+$SRC_H5LS_TESTFILES/tdatareg.h5
+$SRC_H5LS_TESTFILES/tdset.h5
+$SRC_H5LS_TESTFILES/tempty.h5
+$SRC_H5LS_TESTFILES/textlink.h5
+$SRC_H5LS_TESTFILES/textlinksrc.h5
+$SRC_H5LS_TESTFILES/textlinktar.h5
+$SRC_H5LS_TESTFILES/tgroup.h5
+$SRC_H5LS_TESTFILES/tgrp_comments.h5
+$SRC_H5LS_TESTFILES/thlink.h5
+$SRC_H5LS_TESTFILES/tloop.h5
+$SRC_H5LS_TESTFILES/tnestedcomp.h5
+$SRC_H5LS_TESTFILES/tsaf.h5
+$SRC_H5LS_TESTFILES/tslink.h5
+$SRC_H5LS_TESTFILES/tsoftlinks.h5
+$SRC_H5LS_TESTFILES/tstr.h5
+$SRC_H5LS_TESTFILES/tudlink.h5
+$SRC_H5LS_TESTFILES/tvldtypes1.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5LS_TESTFILES/help-1.ls
+$SRC_H5LS_TESTFILES/help-2.ls
+$SRC_H5LS_TESTFILES/help-3.ls
+$SRC_H5LS_TESTFILES/nosuchfile.ls
+$SRC_H5LS_TESTFILES/tall-1.ls
+$SRC_H5LS_TESTFILES/tall-2.ls
+$SRC_H5LS_TESTFILES/tarray1.ls
+$SRC_H5LS_TESTFILES/tattr2.ls
+$SRC_H5LS_TESTFILES/tattrreg_le.ls
+$SRC_H5LS_TESTFILES/tattrreg_be.ls
+$SRC_H5LS_TESTFILES/tcomp-1.ls
+$SRC_H5LS_TESTFILES/tdataregbe.ls
+$SRC_H5LS_TESTFILES/tdataregle.ls
+$SRC_H5LS_TESTFILES/tdset-1.ls
+$SRC_H5LS_TESTFILES/tempty.ls
+$SRC_H5LS_TESTFILES/textlink-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-2.ls
+$SRC_H5LS_TESTFILES/textlinksrc-3.ls
+$SRC_H5LS_TESTFILES/textlinksrc-4.ls
+$SRC_H5LS_TESTFILES/textlinksrc-5.ls
+$SRC_H5LS_TESTFILES/textlinksrc-6.ls
+$SRC_H5LS_TESTFILES/textlinksrc-7.ls
+$SRC_H5LS_TESTFILES/textlinksrc-1-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-2-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-3-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-6-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-7-old.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-1.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-2.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-3.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-4.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-5.ls
+$SRC_H5LS_TESTFILES/textlinksrc-nodangle-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-nodangle-2.ls
+$SRC_H5LS_TESTFILES/tgrp_comments.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-nodangle-1.ls
+$SRC_H5LS_TESTFILES/thlinks-nodangle-1.ls
+$SRC_H5LS_TESTFILES/tgroup.ls
+$SRC_H5LS_TESTFILES/tgroup-1.ls
+$SRC_H5LS_TESTFILES/tgroup-2.ls
+$SRC_H5LS_TESTFILES/tgroup-3.ls
+$SRC_H5LS_TESTFILES/thlink-1.ls
+$SRC_H5LS_TESTFILES/tloop-1.ls
+$SRC_H5LS_TESTFILES/tmultifile.ls
+$SRC_H5LS_TESTFILES/tnestcomp-1.ls
+$SRC_H5LS_TESTFILES/tnestcomp-2.ls
+$SRC_H5LS_TESTFILES/tnestcomp-3.ls
+$SRC_H5LS_TESTFILES/tnestcomp-4.ls
+$SRC_H5LS_TESTFILES/tsaf.ls
+$SRC_H5LS_TESTFILES/tslink-1.ls
+$SRC_H5LS_TESTFILES/tstr-1.ls
+$SRC_H5LS_TESTFILES/tudlink-1.ls
+$SRC_H5LS_TESTFILES/tvldtypes1.ls
+$SRC_H5LS_TESTFILES/tvldtypes2le.ls
+$SRC_H5LS_TESTFILES/tvldtypes2be.ls
+"
+
+
+# RUNSERIAL is used. Check if it can return exit code from executalbe correctly.
+if [ -n "$RUNSERIAL_NOEXITCODE" ]; then
+    echo "***Warning*** Serial Exit Code is not passed back to shell corretly."
+    echo "***Warning*** Exit code checking is skipped."
+    h5haveexitcode=no
+fi
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+    	        $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+                
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+TESTING() {
+    SPACES="                                                               "
+    echo "Testing $* $SPACES" |cut -c1-70 |tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*. For now, if h5ls can complete
+# with exit status 0, consider it pass. If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display up to $NLINS
+# lines of the actual output from the tool test.  The actual output is not
+# removed if $HDF5_NOCLEANUP has a non-zero value.
+# Arguemnts:
+# $1 -- actual output filename to use
+# $2 and on -- argument for the h5ls tool
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ls`.out"
+    actual_err="$TESTDIR/`basename $1 .ls`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+    retvalexpect=$1
+    shift
+
+    # Run test.
+    # Stderr is included in stdout so that the diff can detect
+    # any unexpected output from that stream too.
+    TESTING $H5LS $@
+    (
+	cd $TESTDIR
+        $RUNSERIAL $H5LS_BIN "$@"
+    ) >$actual 2>$actual_err 
+    
+    exitcode=$?
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+    if [ $h5haveexitcode = 'yes' -a $exitcode -ne $retvalexpect ]; then
+	echo "*FAILED*"
+	nerrors="`expr $nerrors + 1`"
+	if [ yes = "$verbose" ]; then
+	    echo "test returned with exit code $exitcode"
+	    echo "test output: (up to $NLINES lines)"
+	    head -$NLINES $actual
+	    echo "***end of test output***"
+	    echo ""
+	fi
+    elif [ ! -f $expect ]; then
+	# Create the expect file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actual $expect
+    elif $CMP $expect $actual; then
+        echo " PASSED"
+    else
+        echo "*FAILED*"
+	echo "    Expected result differs from actual result"
+	nerrors="`expr $nerrors + 1`"
+	test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# Toss in a bunch of tests.  Not sure if they are the right kinds.
+# test the help syntax
+TOOLTEST help-1.ls 0 -w80 -h
+TOOLTEST help-2.ls 0 -w80 -help
+TOOLTEST help-3.ls 0 -w80 -?
+
+# test simple command
+TOOLTEST tall-1.ls 0 -w80 tall.h5
+TOOLTEST tall-2.ls 0 -w80 -r -d tall.h5
+TOOLTEST tgroup.ls 0 -w80 tgroup.h5
+TOOLTEST tgroup-3.ls 0 -w80 tgroup.h5/g1
+
+# test for displaying groups
+# The following combination of arguments is expected to return an error message
+# and return value 1
+TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
+TOOLTEST tgroup-2.ls 0 -w80 -g tgroup.h5/g1
+
+# test for files with groups that have long comments
+TOOLTEST tgrp_comments.ls 0 -w80 -v -g tgrp_comments.h5/glongcomment
+
+# test for displaying simple space datasets
+TOOLTEST tdset-1.ls 0 -w80 -r -d tdset.h5
+
+# test for displaying soft links
+TOOLTEST tslink-1.ls 0 -w80 -r tslink.h5
+
+# test for displaying more soft links with --follow-symlinks
+TOOLTEST tsoftlinks-1.ls 0 --follow-symlinks tsoftlinks.h5
+TOOLTEST tsoftlinks-2.ls 0 --follow-symlinks -r tsoftlinks.h5
+TOOLTEST tsoftlinks-3.ls 0 --follow-symlinks tsoftlinks.h5/group1
+TOOLTEST tsoftlinks-4.ls 0 --follow-symlinks -r tsoftlinks.h5/group1
+TOOLTEST tsoftlinks-5.ls 0 --follow-symlinks tsoftlinks.h5/soft_dset1
+
+# test for displaying external and user-defined links with --follow-symlinks
+TOOLTEST textlink-1.ls 0 -w80 -r textlink.h5
+TOOLTEST textlinksrc-1.ls 0 -w80 --follow-symlinks -r textlinksrc.h5
+TOOLTEST textlinksrc-2.ls 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5
+TOOLTEST textlinksrc-3.ls 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-4.ls 0 -w80 -r textlinksrc.h5
+TOOLTEST textlinksrc-5.ls 0 -w80 -r textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-6.ls 0 -w80 --follow-symlinks textlinksrc.h5
+TOOLTEST textlinksrc-7.ls 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1
+TOOLTEST tudlink-1.ls 0 -w80 -r tudlink.h5
+
+# test for displaying external links with -E
+# the option -E will be depriciated but keep it for backward compatibility
+TOOLTEST textlinksrc-1-old.ls 0 -w80 -Er textlinksrc.h5
+TOOLTEST textlinksrc-2-old.ls 0 -w80 -Erv textlinksrc.h5/ext_link5
+TOOLTEST textlinksrc-3-old.ls 0 -w80 -Er textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-6-old.ls 0 -w80 -E textlinksrc.h5
+TOOLTEST textlinksrc-7-old.ls 0 -w80 -E textlinksrc.h5/ext_link1
+
+# tests for no-dangling-links 
+# if this option is given on dangling link, h5ls should return exit code 1
+# when used alone , expect to print out help and return exit code 1
+TOOLTEST textlinksrc-nodangle-1.ls 1 -w80 --no-dangling-links textlinksrc.h5
+# external dangling link - expected exit code 1
+TOOLTEST textlinksrc-nodangle-2.ls 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5
+# soft dangling link - expected exit code 1
+TOOLTEST tsoftlinks-nodangle-1.ls 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5
+# when used file with no dangling links - expected exit code 0
+TOOLTEST thlinks-nodangle-1.ls 0 -w80 --follow-symlinks --no-dangling-links thlink.h5
+
+# test for wildcards in filename (does not work with cmake)
+# this h5ls test script does not pass the filename properly like the h5dump test script???
+#TOOLTEST tstarfile.ls 0 -w80 t*link.h5
+#TOOLTEST tqmarkfile.ls 0 -w80 t?link.h5
+TOOLTEST tmultifile.ls 0 -w80 thlink.h5 tslink.h5
+
+# tests for hard links
+TOOLTEST thlink-1.ls 0 -w80 thlink.h5
+
+# tests for compound data types
+TOOLTEST tcomp-1.ls 0 -w80 -r -d tcompound.h5
+
+#test for the nested compound type
+TOOLTEST tnestcomp-1.ls 0 -w80 -r -d tnestedcomp.h5
+
+TOOLTEST tnestcomp-2.ls 0 -w80 -r -d -S tnestedcomp.h5
+
+TOOLTEST tnestcomp-3.ls 0 -w80 -r -d -l tnestedcomp.h5
+
+TOOLTEST tnestcomp-4.ls 0 -w80 -r -d -l -S tnestedcomp.h5
+
+# test for loop detection
+TOOLTEST tloop-1.ls 0 -w80 -r -d tloop.h5
+
+# test for string 
+TOOLTEST tstr-1.ls 0 -w80 -r -d tstr.h5
+
+# test test file created from lib SAF team
+TOOLTEST tsaf.ls 0 -w80 -r -d tsaf.h5
+
+# test for variable length data types
+TOOLTEST tvldtypes1.ls 0 -w80 -r -d tvldtypes1.h5
+
+# test for array data types
+TOOLTEST tarray1.ls 0 -w80 -r -d tarray1.h5
+
+# test for empty data
+TOOLTEST tempty.ls 0 -w80 -d tempty.h5
+
+# test for all dataset types written to attributes
+# enable -S for avoiding printing NATIVE types
+TOOLTEST tattr2.ls 0 -w80 -v -S tattr2.h5
+
+# test for attribute with region references without verbose mode
+# ( HDFFV-7838, )
+if test $WORDS_BIGENDIAN != "yes"; then
+TOOLTEST tattrreg_le.ls 0 -w80 -v -d tattrreg.h5
+else
+TOOLTEST tattrreg_be.ls 0 -w80 -v -d tattrreg.h5
+fi
+
+# tests for error handling.
+# test for non-existing file
+TOOLTEST nosuchfile.ls 1 nosuchfile.h5
+
+# test for variable length data types in verbose mode 
+if test $WORDS_BIGENDIAN != "yes"; then
+ TOOLTEST tvldtypes2le.ls 0 -v tvldtypes1.h5
+else
+ TOOLTEST tvldtypes2be.ls 0 -v tvldtypes1.h5
+fi 
+
+
+# test for dataset region references data types in verbose mode 
+if test $WORDS_BIGENDIAN != "yes"; then
+ TOOLTEST tdataregle.ls 0 -v tdatareg.h5
+else
+ TOOLTEST tdataregbe.ls 0 -v tdatareg.h5
+fi 
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/CMakeLists.txt b/gatb-core/thirdparty/hdf5/tools/lib/CMakeLists.txt
new file mode 100644
index 0000000..d04d099
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/CMakeLists.txt
@@ -0,0 +1,105 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_TOOLS_LIB)
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-----------------------------------------------------------------------------
+# Define Sources
+#-----------------------------------------------------------------------------
+
+set (H5_TOOLS_LIB_SRCS
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_array.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_attr.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_dset.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_util.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_dump.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_filters.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_ref.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_str.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_type.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_utils.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5trav.c
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/io_timer.c
+)
+
+set (H5_TOOLS_LIB_HDRS
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5trav.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_dump.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_utils.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_str.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_ref.h
+    ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff.h
+)
+
+add_library (${HDF5_TOOLS_LIB_TARGET} STATIC ${H5_TOOLS_LIB_SRCS} ${H5_TOOLS_LIB_HDRS})
+TARGET_C_PROPERTIES (${HDF5_TOOLS_LIB_TARGET} STATIC " " " ")
+target_link_libraries (${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_TOOLS_LIB_TARGET}")
+H5_SET_LIB_OPTIONS (${HDF5_TOOLS_LIB_TARGET} ${HDF5_TOOLS_LIB_NAME} STATIC)
+set_target_properties (${HDF5_TOOLS_LIB_TARGET} PROPERTIES
+    FOLDER libraries/tools
+    INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
+)
+#set_property (TARGET ${HDF5_TOOLS_LIB_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS H5DIFF_DEBUG)
+set (install_targets ${HDF5_TOOLS_LIB_TARGET})
+
+if (BUILD_SHARED_LIBS)
+  add_library (${HDF5_TOOLS_LIBSH_TARGET} SHARED ${H5_TOOLS_LIB_SRCS} ${H5_TOOLS_LIB_HDRS})
+  TARGET_C_PROPERTIES (${HDF5_TOOLS_LIBSH_TARGET} SHARED " " " ")
+  target_link_libraries (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_TOOLS_LIBSH_TARGET}")
+  H5_SET_LIB_OPTIONS (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_TOOLS_LIB_NAME} SHARED ${HDF5_TOOLS_PACKAGE_SOVERSION})
+  set_target_properties (${HDF5_TOOLS_LIBSH_TARGET} PROPERTIES
+      FOLDER libraries/tools
+      COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
+      INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
+      INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
+  )
+  #set_property (TARGET ${HDF5_TOOLS_LIBSH_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS H5DIFF_DEBUG)
+  set (install_targets ${install_targets} ${HDF5_TOOLS_LIBSH_TARGET})
+endif (BUILD_SHARED_LIBS)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Add file(s) to CMake Install
+#-----------------------------------------------------------------------------
+install (
+    FILES
+        ${H5_TOOLS_LIB_HDRS}
+    DESTINATION
+        ${HDF5_INSTALL_INCLUDE_DIR}
+    COMPONENT
+        toolsheaders
+)
+
+#-----------------------------------------------------------------------------
+# Add Target(s) to CMake Install for import into other projects
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_TARGET_PDB (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} toolslibraries)
+  endif (BUILD_SHARED_LIBS)
+
+  install (
+      TARGETS
+          ${install_targets}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      LIBRARY DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT toolslibraries
+      ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT toolslibraries
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolslibraries
+      FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT toolslibraries
+      INCLUDES DESTINATION include
+  )
+endif (HDF5_EXPORTED_TARGETS)
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff.c b/gatb-core/thirdparty/hdf5/tools/lib/h5diff.c
new file mode 100644
index 0000000..2eb66f9
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff.c
@@ -0,0 +1,1941 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdlib.h>
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5diff.h"
+#include "ph5diff.h"
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_objname
+ *
+ * Purpose: check if object name is to be printed, only when:
+ *  1) verbose mode
+ *  2) when diff was found (normal mode)
+ *-------------------------------------------------------------------------
+ */
+int print_objname (diff_opt_t * options, hsize_t nfound)
+{
+    return ((options->m_verbose || nfound) && !options->m_quiet) ? 1 : 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: do_print_objname
+ *
+ * Purpose: print object name
+ *
+ *-------------------------------------------------------------------------
+ */
+void do_print_objname (const char *OBJ, const char *path1, const char *path2, diff_opt_t * opts)
+{
+    /* if verbose level is higher than 0, put space line before
+     * displaying any object or symbolic links. This improves
+     * readability of the output. 
+     */
+    if (opts->m_verbose_level >= 1)
+        parallel_print("\n");
+    parallel_print("%-7s: <%s> and <%s>\n", OBJ, path1, path2);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: do_print_attrname
+ *
+ * Purpose: print attribute name
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+do_print_attrname (const char *attr, const char *path1, const char *path2)
+{
+    parallel_print("%-7s: <%s> and <%s>\n", attr, path1, path2);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_warn
+ *
+ * Purpose: check print warning condition.
+ * Return: 
+ *    1 if verbose mode
+ *    0 if not verbos mode
+ * Programmer: Jonathan Kim
+ * Date: Feb 4, 2010
+ *-------------------------------------------------------------------------
+ */
+static int print_warn(diff_opt_t *options)
+{
+    return ((options->m_verbose))?1:0;
+}
+
+
+#ifdef H5_HAVE_PARALLEL
+/*-------------------------------------------------------------------------
+ * Function: phdiff_dismiss_workers
+ *
+ * Purpose: tell all workers to end.
+ *
+ * Return: none
+ *
+ * Programmer: Albert Cheng
+ *
+ * Date: Feb 6, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void phdiff_dismiss_workers(void)
+{
+    int i;
+    for(i=1; i<g_nTasks; i++)
+        MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_incoming_data
+ *
+ * Purpose: special function that prints any output that has been sent to the manager
+ *      and is currently sitting in the incoming message queue
+ *
+ * Return: none
+ *
+ * Programmer: Leon Arber
+ *
+ * Date: March 7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void print_incoming_data(void)
+{
+    char data[PRINT_DATA_MAX_SIZE+1];
+    int  incomingMessage;
+    MPI_Status Status;
+
+    do
+    {
+        MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &incomingMessage, &Status);
+        if(incomingMessage)
+        {
+            HDmemset(data, 0, PRINT_DATA_MAX_SIZE+1);
+            MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
+
+            printf("%s", data);
+        }
+    } while(incomingMessage);
+}
+#endif
+
+/*-------------------------------------------------------------------------
+ * Function: is_valid_options
+ *
+ * Purpose: check if options are valid
+ *
+ * Return: 
+ *  1 : Valid
+ *  0 : Not valid
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: Feb 17, 2010
+ *
+ *------------------------------------------------------------------------*/
+static int is_valid_options(diff_opt_t *options)
+{
+    int ret=1; /* init to valid */
+
+    /*-----------------------------------------------
+     * no -q(quiet) with -v (verbose) or -r (report) */
+    if(options->m_quiet && (options->m_verbose || options->m_report))
+    {
+        parallel_print("Error: -q (quiet mode) cannot be added to verbose or report modes\n");
+        options->err_stat=1;
+        ret = 0;
+        goto out;
+    }
+
+    /* -------------------------------------------------------
+     * only allow --no-dangling-links along with --follow-symlinks */
+    if(options->no_dangle_links && !options->follow_links)
+    {
+        parallel_print("Error: --no-dangling-links must be used along with --follow-symlinks option.\n");
+        options->err_stat=1;
+        ret = 0;
+        goto out;
+    }
+
+out:
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: is_exclude_path
+ *
+ * Purpose: check if 'paths' are part of exclude path list
+ *
+ * Return:  
+ *   1 - excluded path
+ *   0 - not excluded path
+ * 
+ * Programmer: Jonathan Kim
+ * Date: Aug 23, 2010
+ *------------------------------------------------------------------------*/
+static int is_exclude_path (char * path, h5trav_type_t type, diff_opt_t *options)
+{
+    struct exclude_path_list * exclude_path_ptr;
+    int ret_cmp;
+    int ret = 0;
+
+    /* check if exclude path option is given */
+    if (!options->exclude_path)
+        goto out;
+
+    /* assign to local exclude list pointer */
+    exclude_path_ptr = options->exclude;
+
+    /* search objects in exclude list */
+    while (NULL != exclude_path_ptr)
+    {
+        /* if exclude path is is group, exclude its members as well */
+        if (exclude_path_ptr->obj_type == H5TRAV_TYPE_GROUP)
+        {
+            ret_cmp = HDstrncmp(exclude_path_ptr->obj_path, path,
+                                HDstrlen(exclude_path_ptr->obj_path));
+            if (ret_cmp == 0)  /* found matching members */
+            {
+                size_t len_grp;
+
+                /* check if given path belong to an excluding group, if so 
+                 * exclude it as well.
+                 * This verifies if “/grp1/dset1” is only under “/grp1”, but
+                 * not under “/grp1xxx/” group.  
+                 */ 
+                len_grp = HDstrlen(exclude_path_ptr->obj_path);
+                if (path[len_grp] == '/')
+                {
+                    /* belong to excluded group! */
+                    ret = 1;
+                    break;  /* while */
+                }
+            }
+        }
+        /* exclude target is not group, just exclude the object */
+        else  
+        {
+            ret_cmp = HDstrcmp(exclude_path_ptr->obj_path, path);
+            if (ret_cmp == 0)  /* found matching object */
+            {
+                /* excluded non-group object */
+                ret = 1;
+                /* remember the type of this maching object. 
+                 * if it's group, it can be used for excluding its member 
+                 * objects in this while() loop */
+                exclude_path_ptr->obj_type = type;
+                break; /* while */
+            }
+        }
+        exclude_path_ptr = exclude_path_ptr->next;
+    }
+
+out:
+    return  ret;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: free_exclude_path_list
+ *
+ * Purpose: free exclud object list from diff options
+ *
+ * Programmer: Jonathan Kim
+ * Date: Aug 23, 2010
+ *------------------------------------------------------------------------*/
+static void free_exclude_path_list(diff_opt_t *options)
+{
+    struct exclude_path_list * curr = options->exclude;
+    struct exclude_path_list * next;
+
+    while (NULL != curr)
+    {
+        next = curr->next;
+        HDfree(curr);
+        curr = next;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: build_match_list
+ *
+ * Purpose: get list of matching path_name from info1 and info2
+ *
+ * Note:
+ *  Find common objects; the algorithm used for this search is the
+ *  cosequential match algorithm and is described in
+ *  Folk, Michael; Zoellick, Bill. (1992). File Structures. Addison-Wesley.
+ *  Moved out from diff_match() to make code more flexible.
+ *
+ * Parameter:
+ *  table_out [OUT] : return the list
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: Aug 18, 2010
+ *------------------------------------------------------------------------*/
+static void build_match_list (const char *objname1, trav_info_t *info1, const char *objname2, trav_info_t *info2, trav_table_t ** table_out, diff_opt_t *options)
+{
+    size_t curr1 = 0;
+    size_t curr2 = 0;
+    unsigned infile[2];
+    char * path1_lp;
+    char * path2_lp;
+    h5trav_type_t type1_l;
+    h5trav_type_t type2_l;
+    size_t path1_offset = 0;
+    size_t path2_offset = 0;
+    int cmp;
+    trav_table_t *table;
+    size_t  idx;
+
+    /* init */
+    trav_table_init( &table );
+
+    /*
+     * This is necessary for the case that given objects are group and
+     * have different names (ex: obj1 is /grp1 and obj2 is /grp5).
+     * All the objects belong to given groups are the cadidates.
+     * So prepare to compare paths without the group names.
+     */
+
+    /* if obj1 is not root */
+    if (HDstrcmp (objname1,"/") != 0)
+        path1_offset = HDstrlen(objname1);
+    /* if obj2 is not root */
+    if (HDstrcmp (objname2,"/") != 0)
+        path2_offset = HDstrlen(objname2);
+
+    /*--------------------------------------------------
+    * build the list
+    */
+    while(curr1 < info1->nused && curr2 < info2->nused)
+    {
+        path1_lp = (info1->paths[curr1].path) + path1_offset;
+        path2_lp = (info2->paths[curr2].path) + path2_offset;
+        type1_l = info1->paths[curr1].type;
+        type2_l = info2->paths[curr2].type;
+        
+        /* criteria is string compare */
+        cmp = HDstrcmp(path1_lp, path2_lp);
+
+        if(cmp == 0)
+        {
+            if(!is_exclude_path(path1_lp, type1_l, options))
+            {
+                infile[0] = 1;
+                infile[1] = 1;
+                trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+                /* if the two point to the same target object,
+                 * mark that in table */
+                if (info1->paths[curr1].fileno == info2->paths[curr2].fileno &&
+                    info1->paths[curr1].objno == info2->paths[curr2].objno )
+                {
+                    idx = table->nobjs - 1;
+                    table->objs[idx].is_same_trgobj = 1;
+                }
+            }
+            curr1++;
+            curr2++;
+        } /* end if */
+        else if(cmp < 0)
+        {
+            if(!is_exclude_path(path1_lp, type1_l, options))
+            {
+                infile[0] = 1;
+                infile[1] = 0;
+                trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+            }
+            curr1++;
+        } /* end else-if */
+        else
+        {
+            if (!is_exclude_path(path2_lp, type2_l, options))
+            {
+                infile[0] = 0;
+                infile[1] = 1;
+                trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+            }
+            curr2++;
+        } /* end else */
+    } /* end while */
+
+    /* list1 did not end */
+    infile[0] = 1;
+    infile[1] = 0;
+    while(curr1 < info1->nused)
+    {
+        path1_lp = (info1->paths[curr1].path) + path1_offset;
+        type1_l = info1->paths[curr1].type;
+
+        if(!is_exclude_path(path1_lp, type1_l, options))
+        {
+            trav_table_addflags(infile, path1_lp, info1->paths[curr1].type, table);
+        }
+        curr1++;
+    } /* end while */
+
+    /* list2 did not end */
+    infile[0] = 0;
+    infile[1] = 1;
+    while(curr2 < info2->nused)
+    {
+        path2_lp = (info2->paths[curr2].path) + path2_offset;
+        type2_l = info2->paths[curr2].type;
+
+        if (!is_exclude_path(path2_lp, type2_l, options))
+        {
+            trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
+        } 
+        curr2++;
+    } /* end while */
+
+    free_exclude_path_list (options);
+
+    *table_out = table;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_grp_objs
+ *
+ * Purpose: 
+ *  Call back function from h5trav_visit(). 
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: Aug 16, 2010
+ *------------------------------------------------------------------------*/
+static herr_t trav_grp_objs(const char *path, const H5O_info_t *oinfo,
+    const char *already_visited, void *udata)
+{
+    trav_info_visit_obj(path, oinfo, already_visited, udata);
+
+    return 0;
+} 
+
+/*-------------------------------------------------------------------------
+ * Function: trav_grp_symlinks
+ *
+ * Purpose: 
+ *  Call back function from h5trav_visit(). 
+ *  Track and extra checkings while visiting all symbolic-links.
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: Aug 16, 2010
+ *------------------------------------------------------------------------*/
+static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo, 
+                               void *udata)
+{                               
+    trav_info_t *tinfo = (trav_info_t *)udata;
+    diff_opt_t *opts = (diff_opt_t *)tinfo->opts;
+    int ret;
+    h5tool_link_info_t lnk_info;
+    const char *ext_fname;
+    const char *ext_path;
+
+    /* init linkinfo struct */
+    HDmemset(&lnk_info, 0, sizeof(h5tool_link_info_t));
+
+    if (!opts->follow_links)
+    {
+        trav_info_visit_lnk(path, linfo, tinfo);
+        goto done;
+    }
+
+    switch(linfo->type)
+    {
+        case H5L_TYPE_SOFT:
+            ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (ret == 0)
+            {
+                tinfo->symlink_visited.dangle_link = TRUE;
+                trav_info_visit_lnk(path, linfo, tinfo);
+                if (opts->no_dangle_links)
+                    opts->err_stat = 1; /* make dgangling link is error */
+                goto done;
+            }
+
+            /* check if already visit the target object */        
+            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path)) 
+                goto done;
+
+            /* add this link as visited link */
+            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path) < 0) 
+                goto done;
+                    
+            if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
+                         trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
+            {
+                parallel_print("Error: Could not get file contents\n");
+                opts->err_stat = 1;
+                goto done;
+            }
+            break;
+        
+        case H5L_TYPE_EXTERNAL:    
+            ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (ret == 0)
+            {
+                tinfo->symlink_visited.dangle_link = TRUE;
+                trav_info_visit_lnk(path, linfo, tinfo);
+                if (opts->no_dangle_links)
+                    opts->err_stat = 1; /* make dgangling link is error */
+                goto done;
+            }
+
+            if(H5Lunpack_elink_val(lnk_info.trg_path, linfo->u.val_size, NULL, &ext_fname, &ext_path) < 0) 
+                goto done;
+
+            /* check if already visit the target object */        
+            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path)) 
+                goto done;
+
+            /* add this link as visited link */
+            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path) < 0) 
+                goto done;
+                    
+            if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
+                            trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
+            {
+                parallel_print("Error: Could not get file contents\n");
+                opts->err_stat = 1;
+                goto done;
+            }
+            break;
+
+        case H5L_TYPE_HARD:
+        case H5L_TYPE_MAX:
+        case H5L_TYPE_ERROR:
+        default:
+            parallel_print("Error: Invalid link type\n");
+            opts->err_stat = 1;
+            goto done;
+            break;
+    } /* end of switch */
+
+done:    
+    if (lnk_info.trg_path)
+        HDfree((char *)lnk_info.trg_path);
+    return 0;
+}    
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5diff
+ *
+ * Purpose: public function, can be called in an application program.
+ *   return differences between 2 HDF5 files
+ *
+ * Return: Number of differences found.
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: October 22, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t h5diff(const char *fname1,
+               const char *fname2,
+               const char *objname1,
+               const char *objname2,
+               diff_opt_t *options)
+{
+    hid_t        file1_id = (-1);
+    hid_t        file2_id = (-1);
+    char         filenames[2][MAX_FILENAME];
+    hsize_t      nfound = 0;
+    int l_ret1 = -1;
+    int l_ret2 = -1;
+    char * obj1fullname = NULL;
+    char * obj2fullname = NULL;
+    int both_objs_grp = 0;
+    /* init to group type */
+    h5trav_type_t obj1type = H5TRAV_TYPE_GROUP;
+    h5trav_type_t obj2type = H5TRAV_TYPE_GROUP;
+    /* for single object */
+    H5O_info_t oinfo1, oinfo2; /* object info */
+    trav_info_t  *info1_obj = NULL;
+    trav_info_t  *info2_obj = NULL;
+    /* for group object */
+    trav_info_t  *info1_grp = NULL;
+    trav_info_t  *info2_grp = NULL;
+    /* local pointer */
+    trav_info_t  *info1_lp;
+    trav_info_t  *info2_lp;
+    /* link info from specified object */
+    H5L_info_t src_linfo1;
+    H5L_info_t src_linfo2;
+    /* link info from member object */
+    h5tool_link_info_t trg_linfo1;
+    h5tool_link_info_t trg_linfo2;
+    /* list for common objects */
+    trav_table_t *match_list = NULL;
+
+    /* init filenames */
+    HDmemset(filenames, 0, MAX_FILENAME * 2);
+    /* init link info struct */
+    HDmemset(&trg_linfo1, 0, sizeof(h5tool_link_info_t));
+    HDmemset(&trg_linfo2, 0, sizeof(h5tool_link_info_t));
+
+   /*-------------------------------------------------------------------------
+    * check invalid combination of options
+    *-----------------------------------------------------------------------*/
+    if(!is_valid_options(options))
+        goto out;
+
+    options->cmn_objs = 1; /* eliminate warning */
+
+    /*-------------------------------------------------------------------------
+    * open the files first; if they are not valid, no point in continuing
+    *-------------------------------------------------------------------------
+    */
+
+    /* disable error reporting */
+    H5E_BEGIN_TRY
+    {
+        /* open file 1 */
+        if((file1_id = h5tools_fopen(fname1, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) 
+        {
+            parallel_print("h5diff: <%s>: unable to open file\n", fname1);
+            options->err_stat = 1;
+            goto out;
+        } /* end if */
+
+
+        /* open file 2 */
+        if((file2_id = h5tools_fopen(fname2, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) 
+        {
+            parallel_print("h5diff: <%s>: unable to open file\n", fname2);
+            options->err_stat = 1;
+            goto out;
+        } /* end if */
+    /* enable error reporting */
+    } H5E_END_TRY;
+
+    /*-------------------------------------------------------------------------
+    * Initialize the info structs
+    *-------------------------------------------------------------------------
+    */
+    trav_info_init(fname1, file1_id, &info1_obj);
+    trav_info_init(fname2, file2_id, &info2_obj);
+
+    /* if any object is specified */
+    if (objname1)
+    {
+        /* make the given object1 fullpath, start with "/"  */
+        if (HDstrncmp(objname1, "/", 1))
+        {
+#ifdef H5_HAVE_ASPRINTF
+            /* Use the asprintf() routine, since it does what we're trying to do below */
+            HDasprintf(&obj1fullname, "/%s", objname1);
+#else /* H5_HAVE_ASPRINTF */
+            /* (malloc 2 more for "/" and end-of-line) */
+            obj1fullname = (char*)HDmalloc(HDstrlen(objname1) + 2);
+            HDstrcpy(obj1fullname, "/");
+            HDstrcat(obj1fullname, objname1);
+#endif /* H5_HAVE_ASPRINTF */
+        }
+        else
+            obj1fullname = HDstrdup(objname1);
+
+        /* make the given object2 fullpath, start with "/" */
+        if (HDstrncmp(objname2, "/", 1))
+        {
+#ifdef H5_HAVE_ASPRINTF
+            /* Use the asprintf() routine, since it does what we're trying to do below */
+            HDasprintf(&obj2fullname, "/%s", objname2);
+#else /* H5_HAVE_ASPRINTF */
+            /* (malloc 2 more for "/" and end-of-line) */
+            obj2fullname = (char*)HDmalloc(HDstrlen(objname2) + 2);
+            HDstrcpy(obj2fullname, "/");
+            HDstrcat(obj2fullname, objname2);
+#endif /* H5_HAVE_ASPRINTF */
+        }
+        else
+            obj2fullname = HDstrdup(objname2);
+
+        /*----------------------------------------------------------
+         * check if obj1 is root, group, single object or symlink
+         */
+        if(!HDstrcmp(obj1fullname, "/"))
+        {
+            obj1type = H5TRAV_TYPE_GROUP;
+        }
+        else
+        {
+            /* check if link itself exist */
+            if(H5Lexists(file1_id, obj1fullname, H5P_DEFAULT) <= 0) 
+            {
+                parallel_print ("Object <%s> could not be found in <%s>\n", obj1fullname, fname1);
+                options->err_stat = 1;
+                goto out;
+            }
+            /* get info from link */
+            if(H5Lget_info(file1_id, obj1fullname, &src_linfo1, H5P_DEFAULT) < 0) 
+            {
+                parallel_print("Unable to get link info from <%s>\n", obj1fullname);
+                goto out;
+            }
+
+            info1_lp = info1_obj;
+
+            /* 
+             * check the type of specified path for hard and symbolic links
+             */
+            if(src_linfo1.type == H5L_TYPE_HARD)
+            {
+                size_t idx;
+
+                /* optional data pass */
+                info1_obj->opts = (diff_opt_t*)options;
+
+                if(H5Oget_info_by_name(file1_id, obj1fullname, &oinfo1, H5P_DEFAULT) < 0)
+                {
+                    parallel_print("Error: Could not get file contents\n");
+                    options->err_stat = 1;
+                    goto out;
+                }
+                obj1type = (h5trav_type_t)oinfo1.type;
+                trav_info_add(info1_obj, obj1fullname, obj1type);
+                idx = info1_obj->nused - 1;
+                info1_obj->paths[idx].objno = oinfo1.addr;
+                info1_obj->paths[idx].fileno = oinfo1.fileno;
+            }
+            else if (src_linfo1.type == H5L_TYPE_SOFT)
+            {
+                obj1type = H5TRAV_TYPE_LINK;
+                trav_info_add(info1_obj, obj1fullname, obj1type);
+            }
+            else if (src_linfo1.type == H5L_TYPE_EXTERNAL)
+            {
+                obj1type = H5TRAV_TYPE_UDLINK;
+                trav_info_add(info1_obj, obj1fullname, obj1type);
+            }
+        }
+
+        /*----------------------------------------------------------
+         * check if obj2 is root, group, single object or symlink
+         */
+        if(!HDstrcmp(obj2fullname, "/"))
+        {
+            obj2type = H5TRAV_TYPE_GROUP;
+        }
+        else
+        {
+            /* check if link itself exist */
+            if(H5Lexists(file2_id, obj2fullname, H5P_DEFAULT) <= 0) 
+            {
+                parallel_print ("Object <%s> could not be found in <%s>\n", obj2fullname, fname2);
+                options->err_stat = 1;
+                goto out;
+            }
+            /* get info from link */
+            if(H5Lget_info(file2_id, obj2fullname, &src_linfo2, H5P_DEFAULT) < 0) 
+            {
+                parallel_print("Unable to get link info from <%s>\n", obj2fullname);
+                goto out;
+            }
+
+            info2_lp = info2_obj;
+
+            /* 
+             * check the type of specified path for hard and symbolic links
+             */
+            if(src_linfo2.type == H5L_TYPE_HARD)
+            {
+                size_t idx;
+
+                /* optional data pass */
+                info2_obj->opts = (diff_opt_t*)options;
+
+                if(H5Oget_info_by_name(file2_id, obj2fullname, &oinfo2, H5P_DEFAULT) < 0)
+                {
+                    parallel_print("Error: Could not get file contents\n");
+                    options->err_stat = 1;
+                    goto out;
+                }
+                obj2type = (h5trav_type_t)oinfo2.type;
+                trav_info_add(info2_obj, obj2fullname, obj2type);
+                idx = info2_obj->nused - 1;
+                info2_obj->paths[idx].objno = oinfo2.addr;
+                info2_obj->paths[idx].fileno = oinfo2.fileno;
+            }
+            else if (src_linfo2.type == H5L_TYPE_SOFT)
+            {
+                obj2type = H5TRAV_TYPE_LINK;
+                trav_info_add(info2_obj, obj2fullname, obj2type);
+            }
+            else if (src_linfo2.type == H5L_TYPE_EXTERNAL)
+            {
+                obj2type = H5TRAV_TYPE_UDLINK;
+                trav_info_add(info2_obj, obj2fullname, obj2type);
+            }
+        }           
+    }
+    /* if no object specified */
+    else
+    {
+        /* set root group */
+        obj1fullname = (char*)HDstrdup("/");
+        obj1type = H5TRAV_TYPE_GROUP;
+        obj2fullname = (char*)HDstrdup("/");
+        obj2type = H5TRAV_TYPE_GROUP;
+    }
+
+
+    /* get any symbolic links info */
+    l_ret1 = H5tools_get_symlink_info(file1_id, obj1fullname, &trg_linfo1, options->follow_links);
+    l_ret2 = H5tools_get_symlink_info(file2_id, obj2fullname, &trg_linfo2, options->follow_links);
+
+    /*---------------------------------------------
+     * check for following symlinks 
+     */
+    if (options->follow_links)
+    {
+        /* pass how to handle printing warning to linkinfo option */
+        if(print_warn(options))
+            trg_linfo1.opt.msg_mode = trg_linfo2.opt.msg_mode = 1;
+
+        /*-------------------------------
+         * check symbolic link (object1)
+         */
+        /* dangling link */
+        if (l_ret1 == 0)
+        {
+            if (options->no_dangle_links)
+            {
+                /* treat dangling link is error */
+                if(options->m_verbose)
+                    parallel_print("Warning: <%s> is a dangling link.\n", obj1fullname);
+                options->err_stat = 1;
+                goto out;
+            }
+            else
+            {
+                if(options->m_verbose)
+                    parallel_print("obj1 <%s> is a dangling link.\n", obj1fullname);
+                if (l_ret1 != 0 ||  l_ret2 != 0)
+                {
+                    nfound++;
+                    print_found(nfound);
+                    goto out;
+                }
+            }
+        }
+        else if(l_ret1 < 0) /* fail */
+        {
+            parallel_print ("Object <%s> could not be found in <%s>\n", obj1fullname, fname1);
+            options->err_stat = 1;
+            goto out;
+        }
+        else if(l_ret1 != 2) /* symbolic link */
+        {
+            obj1type = (h5trav_type_t)trg_linfo1.trg_type;
+            if (info1_lp != NULL) {
+                size_t idx = info1_lp->nused - 1;
+
+                info1_lp->paths[idx].type = (h5trav_type_t)trg_linfo1.trg_type;
+                info1_lp->paths[idx].objno = trg_linfo1.objno;
+                info1_lp->paths[idx].fileno = trg_linfo1.fileno;
+            }
+        }
+
+        /*-------------------------------
+         * check symbolic link (object2)
+         */
+
+        /* dangling link */
+        if (l_ret2 == 0)
+        {
+            if (options->no_dangle_links)
+            {
+                /* treat dangling link is error */
+                if(options->m_verbose)
+                    parallel_print("Warning: <%s> is a dangling link.\n", obj2fullname);
+                options->err_stat = 1;
+                goto out;
+            }
+            else
+            {
+                if(options->m_verbose)
+                    parallel_print("obj2 <%s> is a dangling link.\n", obj2fullname);
+                if (l_ret1 != 0 ||  l_ret2 != 0)
+                {
+                    nfound++;
+                    print_found(nfound);
+                    goto out;
+                }
+            }
+        }
+        else if(l_ret2 < 0) /* fail */ 
+        {
+            parallel_print ("Object <%s> could not be found in <%s>\n", obj2fullname, fname2);
+            options->err_stat = 1;
+            goto out;
+        }
+        else if(l_ret2 != 2)  /* symbolic link */
+        {
+            obj2type = (h5trav_type_t)trg_linfo2.trg_type;
+            if (info2_lp != NULL) {
+                size_t idx = info2_lp->nused - 1;
+
+                info2_lp->paths[idx].type = (h5trav_type_t)trg_linfo2.trg_type;
+                info2_lp->paths[idx].objno = trg_linfo2.objno;
+                info2_lp->paths[idx].fileno = trg_linfo2.fileno;
+            }
+        }
+    } /* end of if follow symlinks */
+
+   /* 
+    * If verbose options is not used, don't need to traverse through the list
+    * of objects in the group to display objects information,
+    * So use h5tools_is_obj_same() to improve performance by skipping 
+    * comparing details of same objects. 
+    */
+
+    if(!(options->m_verbose || options->m_report))
+    {
+        /* if no danglink links */
+        if ( l_ret1 > 0 && l_ret2 > 0 )
+            if (h5tools_is_obj_same(file1_id, obj1fullname, file2_id, obj2fullname)!=0)
+                goto out;
+    }
+
+    both_objs_grp = (obj1type == H5TRAV_TYPE_GROUP && obj2type == H5TRAV_TYPE_GROUP);
+    if (both_objs_grp)
+    {
+        /*
+         * traverse group1
+         */
+        trav_info_init(fname1, file1_id, &info1_grp);
+        /* optional data pass */
+        info1_grp->opts = (diff_opt_t*)options;
+
+        if(h5trav_visit(file1_id, obj1fullname, TRUE, TRUE,
+                        trav_grp_objs, trav_grp_symlinks, info1_grp) < 0)
+        {
+            parallel_print("Error: Could not get file contents\n");
+            options->err_stat = 1;
+            goto out;
+        }
+        info1_lp = info1_grp;
+
+        /*
+         * traverse group2
+         */
+        trav_info_init(fname2, file2_id, &info2_grp);
+        /* optional data pass */
+        info2_grp->opts = (diff_opt_t*)options;
+
+        if(h5trav_visit(file2_id, obj2fullname, TRUE, TRUE,
+                        trav_grp_objs, trav_grp_symlinks, info2_grp) < 0)
+        {
+            parallel_print("Error: Could not get file contents\n");
+            options->err_stat = 1;
+            goto out;
+        } /* end if */
+        info2_lp = info2_grp;
+    }
+
+#ifdef H5_HAVE_PARALLEL
+    if(g_Parallel)
+    {
+        int i;
+
+        if((HDstrlen(fname1) > MAX_FILENAME) || (HDstrlen(fname2) > MAX_FILENAME))
+        {
+            HDfprintf(stderr, "The parallel diff only supports path names up to %d characters\n", MAX_FILENAME);
+            MPI_Abort(MPI_COMM_WORLD, 0);
+        } /* end if */
+
+        HDstrcpy(filenames[0], fname1);
+        HDstrcpy(filenames[1], fname2);
+
+        /* Alert the worker tasks that there's going to be work. */
+        for(i = 1; i < g_nTasks; i++)
+            MPI_Send(filenames, (MAX_FILENAME * 2), MPI_CHAR, i, MPI_TAG_PARALLEL, MPI_COMM_WORLD);
+    } /* end if */
+#endif
+
+    /* process the objects */
+    build_match_list (obj1fullname, info1_lp, obj2fullname, info2_lp,
+                     &match_list, options);
+    if (both_objs_grp)
+    {
+        /*------------------------------------------------------
+         * print the list
+         */
+         if(options->m_verbose)
+         {
+             unsigned u;
+
+             parallel_print("\n");
+             /* if given objects is group under root */
+             if (HDstrcmp (obj1fullname,"/") || HDstrcmp (obj2fullname,"/"))
+                 parallel_print("group1   group2\n");
+             else
+                 parallel_print("file1     file2\n");
+             parallel_print("---------------------------------------\n");
+             for(u = 0; u < match_list->nobjs; u++)
+             {
+                 char c1, c2;
+                 c1 = (match_list->objs[u].flags[0]) ? 'x' : ' ';
+                 c2 = (match_list->objs[u].flags[1]) ? 'x' : ' ';
+                 parallel_print("%5c %6c    %-15s\n", c1, c2, match_list->objs[u].name);
+             } /* end for */
+             parallel_print ("\n");
+         } /* end if */
+    }
+    nfound = diff_match(file1_id, obj1fullname, info1_lp,
+                        file2_id, obj2fullname, info2_lp,
+                        match_list, options);
+
+out:
+#ifdef H5_HAVE_PARALLEL
+    if(g_Parallel)
+        /* All done at this point, let tasks know that they won't be needed */
+        phdiff_dismiss_workers();
+#endif
+    /* free buffers in trav_info structures */
+    if (info1_obj)
+        trav_info_free(info1_obj);
+    if (info2_obj)
+        trav_info_free(info2_obj);
+
+    if (info1_grp)
+        trav_info_free(info1_grp);
+    if (info2_grp)
+        trav_info_free(info2_grp);
+
+    /* free buffers */
+    if (obj1fullname)
+        HDfree(obj1fullname);
+    if (obj2fullname)
+        HDfree(obj2fullname);
+
+    /* free link info buffer */
+    if (trg_linfo1.trg_path)
+        HDfree((char *)trg_linfo1.trg_path);
+    if (trg_linfo2.trg_path)
+        HDfree((char *)trg_linfo2.trg_path);
+
+    /* close */
+    H5E_BEGIN_TRY
+    {
+        H5Fclose(file1_id);
+        H5Fclose(file2_id);
+    } H5E_END_TRY;
+
+    return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_match
+ *
+ * Purpose: 
+ *  Compare common objects in given groups according to table structure. 
+ *  The table structure has flags which can be used to find common objects 
+ *  and will be compared. 
+ *  Common object means same name (absolute path) objects in both location.
+ *
+ * Return: Number of differences found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Modifications: Jan 2005 Leon Arber, larber at uiuc.edu
+ *    Added support for parallel diffing
+ *
+ * Pedro Vicente, pvn at hdfgroup.org, Nov 4, 2008
+ *    Compare the graph and make h5diff return 1 for difference if
+ * 1) the number of objects in file1 is not the same as in file2
+ * 2) the graph does not match, i.e same names (absolute path)
+ * 3) objects with the same name are not of the same type
+ *-------------------------------------------------------------------------
+ */
+hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
+                   hid_t file2_id, const char *grp2, trav_info_t *info2,
+                   trav_table_t *table, diff_opt_t *options)
+{
+    hsize_t      nfound = 0;
+    unsigned     i;
+
+    const char * grp1_path = "";
+    const char * grp2_path = "";
+    char * obj1_fullpath = NULL;
+    char * obj2_fullpath = NULL;
+    diff_args_t argdata;
+    size_t idx1 = 0;
+    size_t idx2 = 0;
+
+
+    /* 
+     * if not root, prepare object name to be pre-appended to group path to
+     * make full path
+     */
+    if(HDstrcmp(grp1, "/"))
+        grp1_path = grp1;
+    if(HDstrcmp(grp2, "/"))
+        grp2_path = grp2;
+
+    /*-------------------------------------------------------------------------
+    * regarding the return value of h5diff (0, no difference in files, 1 difference )
+    * 1) the number of objects in file1 must be the same as in file2
+    * 2) the graph must match, i.e same names (absolute path)
+    * 3) objects with the same name must be of the same type
+    *-------------------------------------------------------------------------
+    */     
+       
+    /* not valid compare used when --exclude-path option is used */
+    if (!options->exclude_path)
+    {
+        /* number of different objects */
+        if ( info1->nused != info2->nused )
+        {
+            options->contents = 0;
+        }
+    }
+    
+    /* objects in one file and not the other */
+    for( i = 0; i < table->nobjs; i++)
+    {
+        if( table->objs[i].flags[0] != table->objs[i].flags[1] )
+        {
+            options->contents = 0;
+            break;
+        }
+    }
+
+
+    /*-------------------------------------------------------------------------
+    * do the diff for common objects
+    *-------------------------------------------------------------------------
+    */
+#ifdef H5_HAVE_PARALLEL
+    {
+    char *workerTasks = (char*)HDmalloc((g_nTasks - 1) * sizeof(char));
+    int n;
+    int busyTasks = 0;
+    struct diffs_found nFoundbyWorker;
+    struct diff_mpi_args args;
+    int havePrintToken = 1;
+    MPI_Status Status;
+
+    /*set all tasks as free */
+    HDmemset(workerTasks, 1, (g_nTasks - 1));
+#endif
+
+    for(i = 0; i < table->nobjs; i++)
+    {
+        if( table->objs[i].flags[0] && table->objs[i].flags[1])
+        {
+            /* make full path for obj1 */
+#ifdef H5_HAVE_ASPRINTF
+            /* Use the asprintf() routine, since it does what we're trying to do below */
+            HDasprintf(&obj1_fullpath, "%s%s", grp1_path, table->objs[i].name);
+#else /* H5_HAVE_ASPRINTF */
+            obj1_fullpath = (char*)HDmalloc(HDstrlen(grp1_path) + HDstrlen(table->objs[i].name) + 1);
+            HDstrcpy(obj1_fullpath, grp1_path);
+            HDstrcat(obj1_fullpath, table->objs[i].name);
+#endif /* H5_HAVE_ASPRINTF */
+
+            /* make full path for obj2 */
+#ifdef H5_HAVE_ASPRINTF
+            /* Use the asprintf() routine, since it does what we're trying to do below */
+            HDasprintf(&obj2_fullpath, "%s%s", grp2_path, table->objs[i].name);
+#else /* H5_HAVE_ASPRINTF */
+            obj2_fullpath = (char*)HDmalloc(HDstrlen(grp2_path) + HDstrlen(table->objs[i].name) + 1);
+            HDstrcpy(obj2_fullpath, grp2_path);
+            HDstrcat(obj2_fullpath, table->objs[i].name);
+#endif /* H5_HAVE_ASPRINTF */
+
+            /* get index to figure out type of the object in file1 */
+            while(info1->paths[idx1].path && 
+                    (HDstrcmp(obj1_fullpath, info1->paths[idx1].path) != 0))
+                idx1++;
+            /* get index to figure out type of the object in file2 */
+            while(info2->paths[idx2].path &&
+                    (HDstrcmp(obj2_fullpath, info2->paths[idx2].path) != 0))
+                idx2++;
+
+            /* Set argdata to pass other args into diff() */
+            argdata.type[0] = info1->paths[idx1].type;
+            argdata.type[1] = info2->paths[idx2].type;
+            argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
+
+            options->cmn_objs = 1;
+            if(!g_Parallel)
+            {
+                nfound += diff(file1_id, obj1_fullpath,
+                               file2_id, obj2_fullpath, 
+                               options, &argdata);
+            } /* end if */
+#ifdef H5_HAVE_PARALLEL
+            else
+            {
+                int workerFound = 0;
+
+                /* We're in parallel mode */
+                /* Since the data type of diff value is hsize_t which can
+                * be arbitary large such that there is no MPI type that
+                * matches it, the value is passed between processes as
+                * an array of bytes in order to be portable.  But this
+                * may not work in non-homogeneous MPI environments.
+                */
+
+                /*Set up args to pass to worker task. */
+                if(HDstrlen(obj1_fullpath) > 255 || 
+                   HDstrlen(obj2_fullpath) > 255)
+                {
+                    printf("The parallel diff only supports object names up to 255 characters\n");
+                    MPI_Abort(MPI_COMM_WORLD, 0);
+                } /* end if */
+
+                /* set args struct to pass */
+                HDstrcpy(args.name1, obj1_fullpath);
+                HDstrcpy(args.name2, obj2_fullpath);
+                args.options = *options;
+                args.argdata.type[0] = info1->paths[idx1].type;
+                args.argdata.type[1] = info2->paths[idx2].type;
+                args.argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
+
+                /* if there are any outstanding print requests, let's handle one. */
+                if(busyTasks > 0)
+                {
+                    int incomingMessage;
+
+                    /* check if any tasks freed up, and didn't need to print. */
+                    MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+                    /* first block*/
+                    if(incomingMessage)
+                    {
+                        workerTasks[Status.MPI_SOURCE - 1] = 1;
+                        MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+                        nfound += nFoundbyWorker.nfound;
+                        options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                        busyTasks--;
+                    } /* end if */
+
+                    /* check to see if the print token was returned. */
+                    if(!havePrintToken)
+                    {
+                        /* If we don't have the token, someone is probably sending us output */
+                        print_incoming_data();
+
+                        /* check incoming queue for token */
+                        MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+                        /* incoming token implies free task. */
+                        if(incomingMessage) {
+                            workerTasks[Status.MPI_SOURCE - 1] = 1;
+                            MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                            nfound += nFoundbyWorker.nfound;
+                            options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                            busyTasks--;
+                            havePrintToken = 1;
+                        } /* end if */
+                    } /* end if */
+
+                    /* check to see if anyone needs the print token. */
+                    if(havePrintToken)
+                    {
+                        /* check incoming queue for print token requests */
+                        MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &incomingMessage, &Status);
+                        if(incomingMessage)
+                        {
+                            MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+                            MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+                            havePrintToken = 0;
+                        } /* end if */
+                    } /* end if */
+                } /* end if */
+
+                /* check array of tasks to see which ones are free.
+                * Manager task never does work, so freeTasks[0] is really
+                * worker task 0. */
+                for(n = 1; (n < g_nTasks) && !workerFound; n++)
+                {
+                    if(workerTasks[n-1])
+                    {
+                        /* send file id's and names to first free worker */
+                        MPI_Send(&args, sizeof(args), MPI_BYTE, n, MPI_TAG_ARGS, MPI_COMM_WORLD);
+
+                        /* increment counter for total number of prints. */
+                        busyTasks++;
+
+                        /* mark worker as busy */
+                        workerTasks[n - 1] = 0;
+                        workerFound = 1;
+                    } /* end if */
+                } /* end for */
+
+                if(!workerFound)
+                {
+                    /* if they were all busy, we've got to wait for one free up
+                     *  before we can move on.  If we don't have the token, some
+                     * task is currently printing so we'll wait for that task to
+                     * return it.
+                     */
+
+                    if(!havePrintToken)
+                    {
+                        while(!havePrintToken)
+                        {
+                            int incomingMessage;
+
+                            print_incoming_data();
+                            MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+                            if(incomingMessage)
+                            {
+                                MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                                havePrintToken = 1;
+                                nfound += nFoundbyWorker.nfound;
+                                options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                                /* send this task the work unit. */
+                                MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+                            } /* end if */
+                        } /* end while */
+                    } /* end if */
+                    /* if we do have the token, check for task to free up, or wait for a task to request it */
+                    else
+                    {
+                        /* But first print all the data in our incoming queue */
+                        print_incoming_data();
+                        MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+                        if(Status.MPI_TAG == MPI_TAG_DONE)
+                        {
+                            MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+                            nfound += nFoundbyWorker.nfound;
+                            options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                            MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+                        } /* end if */
+                        else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
+                        {
+                            int incomingMessage;
+
+                            MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+                            MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+
+                            do
+                            {
+                                MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+                                print_incoming_data();
+                            } while(!incomingMessage);
+
+                            MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                            nfound += nFoundbyWorker.nfound;
+                            options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                            MPI_Send(&args, sizeof(args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD);
+                        } /* end else-if */
+                        else
+                        {
+                            printf("ERROR: Invalid tag (%d) received \n", Status.MPI_TAG);
+                            MPI_Abort(MPI_COMM_WORLD, 0);
+                            MPI_Finalize();
+                        } /* end else */
+                    } /* end else */
+                } /* end if */
+            } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+            if(obj1_fullpath)
+                HDfree(obj1_fullpath);
+            if(obj2_fullpath)                
+                HDfree(obj2_fullpath);
+        } /* end if */
+    } /* end for */
+
+#ifdef H5_HAVE_PARALLEL
+    if(g_Parallel)
+    {
+        /* make sure all tasks are done */
+        while(busyTasks > 0)
+        {
+            MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+            if(Status.MPI_TAG == MPI_TAG_DONE)
+            {
+                MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status);
+                nfound += nFoundbyWorker.nfound;
+                options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                busyTasks--;
+            } /* end if */
+            else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST)
+            {
+                MPI_Recv(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD, &Status);
+                if(havePrintToken)
+                {
+                    int incomingMessage;
+
+                    MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+
+                    do {
+                        MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+                        print_incoming_data();
+                    } while(!incomingMessage);
+
+                    MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                    nfound += nFoundbyWorker.nfound;
+                    options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                    busyTasks--;
+                } /* end if */
+                /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */
+                else
+                {
+                    int source = Status.MPI_SOURCE;
+                    int incomingMessage;
+
+                    do
+                    {
+                        MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &incomingMessage, &Status);
+
+                        print_incoming_data();
+                    } while(!incomingMessage);
+
+
+                    MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                    nfound += nFoundbyWorker.nfound;
+                    options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                    busyTasks--;
+                    MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD);
+                } /* end else */
+            } /* end else-if */
+            else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN)
+            {
+                MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status);
+                nfound += nFoundbyWorker.nfound;
+                options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp;
+                busyTasks--;
+                havePrintToken = 1;
+            } /* end else-if */
+            else if(Status.MPI_TAG == MPI_TAG_PRINT_DATA)
+            {
+                char  data[PRINT_DATA_MAX_SIZE + 1];
+                HDmemset(data, 0, PRINT_DATA_MAX_SIZE + 1);
+
+                MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status);
+
+                printf("%s", data);
+            } /* end else-if */
+            else
+            {
+                printf("ph5diff-manager: ERROR!! Invalid tag (%d) received \n", Status.MPI_TAG);
+                MPI_Abort(MPI_COMM_WORLD, 0);
+            } /* end else */
+        } /* end while */
+
+        for(i = 1; i < g_nTasks; i++)
+            MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD);
+
+        /* Print any final data waiting in our queue */
+        print_incoming_data();
+    } /* end if */
+
+    HDfree(workerTasks);
+    }
+#endif /* H5_HAVE_PARALLEL */
+
+    /* free table */
+    if (table)
+        trav_table_free(table);
+
+    return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff
+ *
+ * Purpose: switch between types and choose the diff function
+ * TYPE is either
+ *  H5G_GROUP         Object is a group
+ *  H5G_DATASET       Object is a dataset
+ *  H5G_TYPE          Object is a named data type
+ *  H5G_LINK          Object is a symbolic link
+ *
+ * Return: Number of differences found
+ *
+ * Programmer: Jonathan Kim
+ *  - Move follow symlinks code toward top. (March 2812)
+ *  - Add following symlinks feature (Feb 11,2010)
+ *  - Change to use diff_args_t to pass the rest of args.
+ *    Passing through it instead of individual args provides smoother
+ *    extensibility through its members along with MPI code update for ph5diff
+ *    as it doesn't require interface change.
+ *    (May 6,2011)
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ * Date: May 9, 2003
+ *-------------------------------------------------------------------------
+ */
+
+hsize_t diff(hid_t file1_id,
+              const char *path1,
+              hid_t file2_id,
+              const char *path2,
+              diff_opt_t * options,
+              diff_args_t *argdata)
+{
+    hid_t   dset1_id = (-1);
+    hid_t   dset2_id = (-1);
+    hid_t   type1_id = (-1);
+    hid_t   type2_id = (-1);
+    hid_t   grp1_id = (-1);
+    hid_t   grp2_id = (-1);
+    int     ret;
+    hbool_t     is_dangle_link1 = FALSE;
+    hbool_t     is_dangle_link2 = FALSE;
+    hbool_t     is_hard_link = FALSE;
+    hsize_t nfound = 0;
+    h5trav_type_t object_type;
+
+    /* to get link info */
+    h5tool_link_info_t linkinfo1;
+    h5tool_link_info_t linkinfo2;
+
+    /*init link info struct */
+    HDmemset(&linkinfo1,0,sizeof(h5tool_link_info_t));
+    HDmemset(&linkinfo2,0,sizeof(h5tool_link_info_t));
+
+    /* pass how to handle printing warnings to linkinfo option */
+    if(print_warn(options))
+        linkinfo1.opt.msg_mode = linkinfo2.opt.msg_mode = 1;
+
+    /* for symbolic links, take care follow symlink and no dangling link 
+     * options */
+    if (argdata->type[0] == H5TRAV_TYPE_LINK || 
+        argdata->type[0] == H5TRAV_TYPE_UDLINK ||
+        argdata->type[1] == H5TRAV_TYPE_LINK || 
+        argdata->type[1] == H5TRAV_TYPE_UDLINK )
+    {
+        /* 
+         * check dangling links for path1 and path2
+         */
+
+        /* target object1 - get type and name */
+        ret = H5tools_get_symlink_info(file1_id, path1, &linkinfo1, options->follow_links);
+        /* dangling link */
+        if (ret == 0)
+        {
+            if (options->no_dangle_links)
+            {
+                /* gangling link is error */
+                if(options->m_verbose)
+                    parallel_print("Warning: <%s> is a dangling link.\n", path1);
+                goto out;
+            }
+            else
+                is_dangle_link1 = TRUE;
+        }
+        else if (ret < 0)
+            goto out;
+
+        /* target object2 - get type and name */
+        ret = H5tools_get_symlink_info(file2_id, path2, &linkinfo2, options->follow_links );
+        /* dangling link */
+        if (ret == 0)
+        {
+            if (options->no_dangle_links)
+            {
+                /* gangling link is error */
+                if(options->m_verbose)
+                    parallel_print("Warning: <%s> is a dangling link.\n", path2);
+                goto out;
+            }
+            else
+                is_dangle_link2 = TRUE;
+        }
+        else if (ret < 0)
+            goto out;
+                    
+        /* found dangling link */
+        if (is_dangle_link1 || is_dangle_link2)
+            goto out2;
+
+        /* follow symbolic link option */
+        if (options->follow_links)
+        {
+            if (linkinfo1.linfo.type == H5L_TYPE_SOFT ||
+                    linkinfo1.linfo.type == H5L_TYPE_EXTERNAL)
+                argdata->type[0] = (h5trav_type_t)linkinfo1.trg_type;
+
+            if (linkinfo2.linfo.type == H5L_TYPE_SOFT ||
+                    linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
+                argdata->type[1] = (h5trav_type_t)linkinfo2.trg_type;
+        }
+    }
+    /* if objects are not the same type */
+    if (argdata->type[0] != argdata->type[1])
+    {
+        if (options->m_verbose||options->m_list_not_cmp)
+        {
+            parallel_print("Not comparable: <%s> is of type %s and <%s> is of type %s\n",
+            path1, get_type(argdata->type[0]), 
+            path2, get_type(argdata->type[1]));
+        }
+        options->not_cmp=1;
+        /* TODO: will need to update non-comparable is different
+         * options->contents = 0;
+         */
+        goto out2;
+    }
+    else /* now both object types are same */
+        object_type = argdata->type[0];
+  
+    /* 
+     * If both points to the same target object, skip comparing details inside
+     * of the objects to improve performance.
+     * Always check for the hard links, otherwise if follow symlink option is 
+     * specified.
+     *
+     * Perform this to match the outputs as bypassing.
+     */
+     if (argdata->is_same_trgobj)
+     {
+        is_hard_link = (object_type == H5TRAV_TYPE_DATASET ||
+                        object_type == H5TRAV_TYPE_NAMED_DATATYPE ||
+                        object_type == H5TRAV_TYPE_GROUP);
+        if (options->follow_links || is_hard_link)
+        {
+            /* print information is only verbose option is used */
+            if(options->m_verbose || options->m_report)
+            {
+                switch(object_type)
+                {
+                    case H5TRAV_TYPE_DATASET:
+                        do_print_objname("dataset", path1, path2, options);
+                        break; 
+                    case H5TRAV_TYPE_NAMED_DATATYPE:
+                        do_print_objname("datatype", path1, path2, options);
+                        break;
+                    case H5TRAV_TYPE_GROUP:
+                        do_print_objname("group", path1, path2, options);
+                        break;
+                    case H5TRAV_TYPE_LINK:
+                        do_print_objname("link", path1, path2, options);
+                        break;
+                    case H5TRAV_TYPE_UDLINK:
+                        if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
+                            do_print_objname("external link", path1, path2, options);
+                        else
+                            do_print_objname ("user defined link", path1, path2, options);
+                        break; 
+                    case H5TRAV_TYPE_UNKNOWN:
+                    default:
+                        parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
+                            path1, path2, get_type(object_type) );
+                        options->not_cmp = 1;
+                        break;
+                } /* switch(type)*/
+
+                print_found(nfound);
+            } /* if(options->m_verbose || options->m_report) */
+
+            /* exact same, so comparison is done */
+            goto out2;
+        }
+    }
+
+    switch(object_type)
+    {
+       /*----------------------------------------------------------------------
+        * H5TRAV_TYPE_DATASET
+        *----------------------------------------------------------------------
+        */
+        case H5TRAV_TYPE_DATASET:
+            if((dset1_id = H5Dopen2(file1_id, path1, H5P_DEFAULT)) < 0)
+                goto out;
+            if((dset2_id = H5Dopen2(file2_id, path2, H5P_DEFAULT)) < 0)
+                goto out;
+      /* verbose (-v) and report (-r) mode */
+            if(options->m_verbose || options->m_report)
+            {
+                do_print_objname("dataset", path1, path2, options);
+                nfound = diff_dataset(file1_id, file2_id, path1, path2, options);
+                print_found(nfound);
+            }
+            /* quiet mode (-q), just count differences */
+            else if(options->m_quiet)
+            {
+                nfound = diff_dataset(file1_id, file2_id, path1, path2, options);
+            }
+      /* the rest (-c, none, ...) */
+            else
+            {
+                nfound = diff_dataset(file1_id, file2_id, path1, path2, options);
+                /* print info if difference found  */
+                if (nfound)
+                {
+                    do_print_objname("dataset", path1, path2, options);
+                    print_found(nfound);  
+                }
+            }
+
+
+            /*---------------------------------------------------------
+             * compare attributes
+             * if condition refers to cases when the dataset is a 
+             * referenced object
+             *---------------------------------------------------------
+             */
+            if(path1)
+                nfound += diff_attr(dset1_id, dset2_id, path1, path2, options);
+
+
+            if(H5Dclose(dset1_id) < 0)
+                goto out;
+            if(H5Dclose(dset2_id) < 0)
+                goto out;
+            break;
+
+       /*----------------------------------------------------------------------
+        * H5TRAV_TYPE_NAMED_DATATYPE
+        *----------------------------------------------------------------------
+        */
+        case H5TRAV_TYPE_NAMED_DATATYPE:
+            if((type1_id = H5Topen2(file1_id, path1, H5P_DEFAULT)) < 0)
+                goto out;
+            if((type2_id = H5Topen2(file2_id, path2, H5P_DEFAULT)) < 0)
+                goto out;
+
+            if((ret = H5Tequal(type1_id, type2_id)) < 0)
+                goto out;
+
+            /* if H5Tequal is > 0 then the datatypes refer to the same datatype */
+            nfound = (ret > 0) ? 0 : 1;
+
+            if(print_objname(options,nfound))
+                do_print_objname("datatype", path1, path2, options);
+
+            /* always print the number of differences found in verbose mode */
+            if(options->m_verbose)
+                print_found(nfound);
+
+            /*-----------------------------------------------------------------
+             * compare attributes
+             * the if condition refers to cases when the dataset is a 
+             * referenced object
+             *-----------------------------------------------------------------
+             */
+            if(path1)
+                nfound += diff_attr(type1_id, type2_id, path1, path2, options);
+
+            if(H5Tclose(type1_id) < 0)
+                goto out;
+            if(H5Tclose(type2_id) < 0)
+                goto out;
+            break;
+
+       /*----------------------------------------------------------------------
+        * H5TRAV_TYPE_GROUP
+        *----------------------------------------------------------------------
+        */
+        case H5TRAV_TYPE_GROUP:
+            if(print_objname(options, nfound))
+                do_print_objname("group", path1, path2, options);
+
+            /* always print the number of differences found in verbose mode */
+            if(options->m_verbose)
+                print_found(nfound);
+
+            if((grp1_id = H5Gopen2(file1_id, path1, H5P_DEFAULT)) < 0)
+                goto out;
+            if((grp2_id = H5Gopen2(file2_id, path2, H5P_DEFAULT)) < 0)
+                goto out;
+
+            /*-----------------------------------------------------------------
+             * compare attributes
+             * the if condition refers to cases when the dataset is a 
+             * referenced object
+             *-----------------------------------------------------------------
+             */
+            if(path1)
+                nfound += diff_attr(grp1_id, grp2_id, path1, path2, options);
+
+            if(H5Gclose(grp1_id) < 0)
+                goto out;
+            if(H5Gclose(grp2_id) < 0)
+                goto out;
+            break;
+
+
+       /*----------------------------------------------------------------------
+        * H5TRAV_TYPE_LINK
+        *----------------------------------------------------------------------
+        */
+        case H5TRAV_TYPE_LINK:
+            {
+            ret = HDstrcmp(linkinfo1.trg_path, linkinfo2.trg_path);
+
+            /* if the target link name is not same then the links are "different" */
+            nfound = (ret != 0) ? 1 : 0;
+
+            if(print_objname(options, nfound))
+                do_print_objname("link", path1, path2, options);
+
+            /* always print the number of differences found in verbose mode */
+            if(options->m_verbose)
+                print_found(nfound);
+
+            }
+            break;
+
+       /*----------------------------------------------------------------------
+        * H5TRAV_TYPE_UDLINK
+        *----------------------------------------------------------------------
+        */
+        case H5TRAV_TYPE_UDLINK:
+            {
+            /* Only external links will have a query function registered */
+            if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL) 
+            {
+                /* If the buffers are the same size, compare them */
+                if(linkinfo1.linfo.u.val_size == linkinfo2.linfo.u.val_size) 
+                {
+                    ret = HDmemcmp(linkinfo1.trg_path, linkinfo2.trg_path, linkinfo1.linfo.u.val_size);
+                }
+                else
+                    ret = 1;
+
+                /* if "linkinfo1.trg_path" != "linkinfo2.trg_path" then the links
+                 * are "different" extlinkinfo#.path is combination string of 
+                 * file_name and obj_name
+                 */
+                nfound = (ret != 0) ? 1 : 0;
+
+                if(print_objname(options, nfound))
+                    do_print_objname("external link", path1, path2, options);
+
+            } /* end if */
+            else 
+            {
+                /* If one or both of these links isn't an external link, we can only
+                 * compare information from H5Lget_info since we don't have a query
+                 * function registered for them.
+                 *
+                 * If the link classes or the buffer length are not the
+                 * same, the links are "different"
+                 */
+                if((linkinfo1.linfo.type != linkinfo2.linfo.type) || 
+                   (linkinfo1.linfo.u.val_size != linkinfo2.linfo.u.val_size))
+                    nfound = 1;
+                else
+                    nfound = 0;
+
+                if (print_objname (options, nfound))
+                    do_print_objname ("user defined link", path1, path2, options);
+            } /* end else */
+
+            /* always print the number of differences found in verbose mode */
+            if(options->m_verbose)
+                print_found(nfound);
+            }
+            break;
+
+        case H5TRAV_TYPE_UNKNOWN:
+        default:
+            if(options->m_verbose)
+                parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
+                    path1, path2, get_type(object_type) );
+            options->not_cmp = 1;
+            break;
+     }
+
+    /* free link info buffer */
+    if (linkinfo1.trg_path)
+        HDfree((char *)linkinfo1.trg_path);
+    if (linkinfo2.trg_path)
+        HDfree((char *)linkinfo2.trg_path);
+
+    return nfound;
+
+out:
+    options->err_stat = 1;
+
+out2:
+    /*-----------------------------------
+     * handle dangling link(s) 
+     */
+    /* both path1 and path2 are dangling links */
+    if(is_dangle_link1 && is_dangle_link2)
+    {
+        if(print_objname(options, nfound))
+        {
+            do_print_objname("dangling link", path1, path2, options);
+            print_found(nfound);
+        }
+    }
+    /* path1 is dangling link */
+    else if (is_dangle_link1)
+    {
+        if(options->m_verbose)
+           parallel_print("obj1 <%s> is a dangling link.\n", path1);
+        nfound++;
+        if(print_objname(options, nfound))
+            print_found(nfound);
+    }
+    /* path2 is dangling link */
+    else if (is_dangle_link2)
+    {
+        if(options->m_verbose)
+            parallel_print("obj2 <%s> is a dangling link.\n", path2);
+        nfound++;
+        if(print_objname(options, nfound))
+            print_found(nfound);
+    }
+
+    /* free link info buffer */
+    if (linkinfo1.trg_path)
+        HDfree((char *)linkinfo1.trg_path);
+    if (linkinfo2.trg_path)
+        HDfree((char *)linkinfo2.trg_path);
+
+    /* close */
+    /* disable error reporting */
+    H5E_BEGIN_TRY {
+        H5Tclose(type1_id);
+        H5Tclose(type2_id);
+        H5Gclose(grp1_id);
+        H5Tclose(grp2_id);
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+    return nfound;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff.h b/gatb-core/thirdparty/hdf5/tools/lib/h5diff.h
new file mode 100644
index 0000000..04b640f
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff.h
@@ -0,0 +1,200 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5DIFF_H__
+#define H5DIFF_H__
+
+#include "hdf5.h"
+#include "h5trav.h"
+
+/*
+ * Debug printf macros. The prefix allows output filtering by test scripts.
+ */
+#ifdef H5DIFF_DEBUG
+#define h5difftrace(x) HDfprintf(stderr, "h5diff debug: " x)
+#define h5diffdebug2(x1, x2) HDfprintf(stderr, "h5diff debug: " x1, x2)
+#define h5diffdebug3(x1, x2, x3) HDfprintf(stderr, "h5diff debug: " x1, x2, x3)
+#define h5diffdebug4(x1, x2, x3, x4) HDfprintf(stderr, "h5diff debug: " x1, x2, x3, x4)
+#define h5diffdebug5(x1, x2, x3, x4, x5) HDfprintf(stderr, "h5diff debug: " x1, x2, x3, x4, x5)
+#else
+#define h5difftrace(x)
+#define h5diffdebug2(x1, x2)
+#define h5diffdebug3(x1, x2, x3)
+#define h5diffdebug4(x1, x2, x3, x4)
+#define h5diffdebug5(x1, x2, x3, x4, x5)
+#endif
+
+#define MAX_FILENAME 1024
+
+/*-------------------------------------------------------------------------
+ * This is used to pass multiple args into diff().
+ * Passing this instead of several each arg provides smoother extensibility 
+ * through its members along with MPI code for ph5diff
+ * as it doesn't require interface change.
+ *------------------------------------------------------------------------*/
+typedef struct {
+    h5trav_type_t   type[2];
+    hbool_t is_same_trgobj;
+} diff_args_t;
+/*-------------------------------------------------------------------------
+ * command line options
+ *-------------------------------------------------------------------------
+ */
+/* linked list to keep exclude path list */
+struct exclude_path_list {
+    char  *obj_path;
+    h5trav_type_t obj_type;
+    struct exclude_path_list * next;
+};
+
+typedef struct {
+    int      m_quiet;               /* quiet mide: no output at all */
+    int      m_report;              /* report mode: print the data */
+    int      m_verbose;             /* verbose mode: print the data, list of objcets, warnings */
+    int      m_verbose_level;       /* control verbose details */
+    int      d;                     /* delta, absolute value to compare */
+    double   delta;                 /* delta value */
+    int      p;                     /* relative error to compare*/
+    int      use_system_epsilon;    /* flag to use system epsilon (1 or 0) */
+    double   percent;               /* relative error value */
+    int      n;                     /* count, compare up to count */
+    hsize_t  count;                 /* count value */
+    hbool_t  follow_links;          /* follow symbolic links */
+    int      no_dangle_links;       /* return error when find dangling link */
+    int      err_stat;              /* an error ocurred (1, error, 0, no error) */
+    int      cmn_objs;              /* do we have common objects */
+    int      not_cmp;               /* are the objects comparable */
+    int      contents;              /* equal contents */
+    int      do_nans;               /* consider Nans while diffing floats */
+    int      m_list_not_cmp;        /* list not comparable messages */
+    int      exclude_path;          /* exclude path to an object */
+    struct   exclude_path_list * exclude; /* keep exclude path list */
+} diff_opt_t;
+
+
+/*-------------------------------------------------------------------------
+ * public functions
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5TOOLS_DLL hsize_t  h5diff(const char *fname1,
+                const char *fname2,
+                const char *objname1,
+                const char *objname2,
+                diff_opt_t *options);
+
+H5TOOLS_DLL hsize_t diff( hid_t      file1_id,
+              const char *path1,
+              hid_t      file2_id,
+              const char *path2,
+              diff_opt_t *options,
+              diff_args_t *argdata);
+
+#ifdef H5_HAVE_PARALLEL
+H5TOOLS_DLL void phdiff_dismiss_workers(void);
+H5TOOLS_DLL void print_manager_output(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/*-------------------------------------------------------------------------
+ * private functions
+ *-------------------------------------------------------------------------
+ */
+
+
+hsize_t diff_dataset( hid_t file1_id,
+                      hid_t file2_id,
+                      const char *obj1_name,
+                      const char *obj2_name,
+                      diff_opt_t *options);
+
+hsize_t diff_datasetid( hid_t dset1_id,
+                        hid_t dset2_id,
+                        const char *obj1_name,
+                        const char *obj2_name,
+                        diff_opt_t *options);
+
+
+hsize_t diff_match( hid_t file1_id, const char *grp1, trav_info_t *info1,
+                    hid_t file2_id, const char *grp2, trav_info_t *info2,
+                    trav_table_t *table, diff_opt_t *options );
+
+hsize_t diff_array( void *_mem1,
+                    void *_mem2,
+                    hsize_t nelmts,
+                    hsize_t hyper_start,
+                    int rank,
+                    hsize_t *dims,
+                    diff_opt_t *options,
+                    const char *name1,
+                    const char *name2,
+                    hid_t m_type,
+                    hid_t container1_id,
+                    hid_t container2_id); /* dataset where the reference came from*/
+
+
+int diff_can_type( hid_t       f_type1, /* file data type */
+                   hid_t       f_type2, /* file data type */
+                   int         rank1,
+                   int         rank2,
+                   hsize_t     *dims1,
+                   hsize_t     *dims2,
+                   hsize_t     *maxdim1,
+                   hsize_t     *maxdim2,
+                   const char  *obj1_name,
+                   const char  *obj2_name,
+                   diff_opt_t  *options,
+                   int         is_compound);
+
+
+hsize_t diff_attr(hid_t loc1_id,
+                  hid_t loc2_id,
+                  const char *path1,
+                  const char *path2,
+                  diff_opt_t *options);
+
+
+/*-------------------------------------------------------------------------
+ * utility functions
+ *-------------------------------------------------------------------------
+ */
+
+/* in h5diff_util.c */
+void        print_found(hsize_t nfound);
+void        print_type(hid_t type);
+const char* diff_basename(const char *name);
+const char* get_type(h5trav_type_t type);
+const char* get_class(H5T_class_t tclass);
+const char* get_sign(H5T_sign_t sign);
+void        print_dimensions (int rank, hsize_t *dims);
+herr_t      match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id,
+                              hid_t *m_tid1, hid_t *m_tid2, 
+                              size_t *m_size1, size_t  *m_size2);
+/* in h5diff.c */
+int         print_objname(diff_opt_t *options, hsize_t nfound);
+void        do_print_objname (const char *OBJ, const char *path1, const char *path2, diff_opt_t * opts);
+void        do_print_attrname (const char *attr, const char *path1, const char *path2);
+
+#endif  /* H5DIFF_H__ */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff_array.c b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_array.c
new file mode 100644
index 0000000..1ee9054
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_array.c
@@ -0,0 +1,6339 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <math.h>
+#include <time.h>
+#include <sys/timeb.h>
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5diff.h"
+#include "ph5diff.h"
+
+
+/*-------------------------------------------------------------------------
+ * printf formatting
+ *-------------------------------------------------------------------------
+ */
+
+#define F_FORMAT      "%-15g %-15g %-15g\n"
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+#define LD_FORMAT     "%-15Lf %-15Lf %-15Lf\n"
+#endif
+
+#define I_FORMAT      "%-15d %-15d %-15d\n"
+#define S_FORMAT      "%-16s %-17s\n"
+#define UI_FORMAT     "%-15u %-15u %-15u\n"
+#define LI_FORMAT     "%-15ld %-15ld %-15ld\n"
+#define ULI_FORMAT    "%-15lu %-15lu %-15lu\n"
+#define LLI_FORMAT    "%-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d\n"
+#define ULLI_FORMAT   "%-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "u\n"
+
+/* with -p option */
+#define F_FORMAT_P    "%-15.10g %-15.10g %-15.10g %-14.10g\n"
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+#define LD_FORMAT_P    "%-15.10Lf %-15.10Lf %-15.10Lf %-14.10Lf\n"
+#endif
+
+#define I_FORMAT_P    "%-15d %-15d %-15d %-14f\n"
+#define UI_FORMAT_P   "%-15u %-15u %-15u %-14f\n"
+#define LI_FORMAT_P   "%-15ld %-15ld %-15ld %-14f\n"
+#define ULI_FORMAT_P  "%-15lu %-15lu %-15lu %-14f\n"
+#define LLI_FORMAT_P  "%-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d %-14f\n"
+#define ULLI_FORMAT_P "%-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "d %-14f\n"
+#define SPACES        "          "
+
+/* not comparable */
+#define F_FORMAT_P_NOTCOMP  "%-15.10g %-15.10g %-15.10g not comparable\n"
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+#define LD_FORMAT_P_NOTCOMP  "%-15.10Lf %-15.10Lf %-15.10Lf not comparable\n"
+#endif
+
+#define I_FORMAT_P_NOTCOMP  "%-15d %-15d %-15d not comparable\n"
+#define UI_FORMAT_P_NOTCOMP   "%-15u %-15u %-15u not comparable\n"
+#define LI_FORMAT_P_NOTCOMP   "%-15ld %-15ld %-15ld not comparable\n"
+#define ULI_FORMAT_P_NOTCOMP  "%-15lu %-15lu %-15lu not comparable\n"
+#define LLI_FORMAT_P_NOTCOMP  "%-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d %-15" H5_PRINTF_LL_WIDTH "d not comparable\n"
+#define ULLI_FORMAT_P_NOTCOMP "%-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "u %-15" H5_PRINTF_LL_WIDTH "d not comparable\n"
+
+
+/* if system EPSILON is defined, use the system EPSILON; otherwise, use
+   constants that are close to most EPSILON values */
+
+#ifndef FLT_EPSILON
+#define FLT_EPSILON 1.19209E-07
+#endif
+
+#ifndef DBL_EPSILON
+#define DBL_EPSILON 2.22045E-16
+#endif
+
+
+/*-------------------------------------------------------------------------
+ * -p relative error formula
+ *
+ * We assume the true value of a quantity to be A (value in first dataset)
+ *  and the measured or inferred value to be B (value in second dataset).
+ *  The relative error is defined by
+ *
+ *  B - A
+ * --------
+ *    A
+ *
+
+ *-------------------------------------------------------------------------
+ */
+
+static hbool_t not_comparable;
+
+#define PER(A,B) {                                   \
+    per = -1;                                        \
+    not_comparable = FALSE;                          \
+    both_zero = FALSE;                               \
+    if(0 == (A) && 0 == (B))                         \
+        both_zero = TRUE;                            \
+    if(0 != (A))                                     \
+        per = (double)ABS((double)((B) - (A)) / (double)(A)); \
+    else                                             \
+        not_comparable = TRUE;                       \
+}
+
+
+#define PER_UNSIGN(TYPE,A,B) {                       \
+    per = -1;                                        \
+    not_comparable = FALSE;                          \
+    both_zero = FALSE;                               \
+    if((A) == 0 && (B) == 0)                         \
+        both_zero = TRUE;                            \
+    if((A) != 0)                                     \
+        per = ABS((double)((TYPE)((B) - (A))) / (double)(A)) ; \
+    else                                             \
+        not_comparable = TRUE;                       \
+}
+
+
+#define PDIFF(a,b)    (((b) > (a)) ? ((b) - (a)) : ((a) -(b)))
+
+typedef struct mcomp_t
+{
+    unsigned        n;      /* number of members */
+    hid_t           *ids;   /* member type id */
+    size_t          *offsets;   
+    struct mcomp_t  **m;     /* members */
+}mcomp_t;
+
+
+/*-------------------------------------------------------------------------
+ * local prototypes
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_region(hid_t obj1_id, hid_t obj2_id,hid_t region1_id, hid_t region2_id, diff_opt_t *options);
+static hbool_t all_zero(const void *_mem, size_t size);
+static int     ull2float(unsigned long long ull_value, float *f_value);
+static hsize_t character_compare(char *mem1,char *mem2,hsize_t i,unsigned u,int rank,hsize_t *dims,hsize_t *acc,hsize_t *pos,diff_opt_t *options,const char *obj1,const char *obj2,int *ph);
+static hsize_t character_compare_opt(unsigned char *mem1,unsigned char *mem2,hsize_t i,int rank,hsize_t *dims,hsize_t *acc,hsize_t *pos,diff_opt_t *options,const char *obj1,const char *obj2,int *ph);
+static hbool_t equal_float(float value, float expected, diff_opt_t *options);
+static hbool_t equal_double(double value, double expected, diff_opt_t *options);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+static hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *options);
+#endif
+static int print_data(diff_opt_t *options);
+static void print_pos(int *ph,int pp,hsize_t curr_pos,hsize_t *acc,hsize_t *pos,int rank,hsize_t *dims,const char *obj1,const char *obj2 );
+static void print_char_pos(int *ph,int pp,hsize_t curr_pos,unsigned u,hsize_t *acc,hsize_t *pos,int rank,hsize_t *dims,const char *obj1,const char *obj2 );
+static void h5diff_print_char(char ch);
+static hsize_t diff_datum(void       *_mem1,
+                   void       *_mem2,
+                   hid_t      m_type,
+                   hsize_t    i,
+                   int        rank,
+                   hsize_t    *dims,
+                   hsize_t    *acc,
+                   hsize_t    *pos,
+                   diff_opt_t *options,
+                   const char *obj1,
+                   const char *obj2,
+                   hid_t      container1_id,
+                   hid_t      container2_id, /*where the reference came from*/
+                   int        *ph,           /*print header */
+                   mcomp_t    *members);      /*compound members */
+static hsize_t diff_float(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_double(unsigned char *mem1,
+                    unsigned char *mem2,
+                    hsize_t       nelmts,
+                    hsize_t       hyper_start,
+                    int           rank,
+                    hsize_t       *dims,
+                    hsize_t       *acc,
+                    hsize_t       *pos,
+                    diff_opt_t    *options,
+                    const char    *obj1,
+                    const char    *obj2,
+                    int           *ph);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+static hsize_t diff_ldouble(unsigned char *mem1,
+                     unsigned char *mem2,
+                     hsize_t       nelmts,
+                     hsize_t       hyper_start,
+                     int           rank,
+                     hsize_t       *dims,
+                     hsize_t       *acc,
+                     hsize_t       *pos,
+                     diff_opt_t    *options,
+                     const char    *obj1,
+                     const char    *obj2,
+                     int           *ph);
+#endif
+static hsize_t diff_schar(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_uchar(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_short(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_ushort(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_int(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_uint(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_long(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_ulong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_llong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+static hsize_t diff_ullong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph);
+
+
+/*-------------------------------------------------------------------------
+ * NaN detection
+ *-------------------------------------------------------------------------
+ */
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+typedef enum dtype_t
+{
+    FLT_FLOAT,
+    FLT_DOUBLE,
+    FLT_LDOUBLE
+} dtype_t;
+#else
+
+typedef enum dtype_t
+{
+    FLT_FLOAT,
+    FLT_DOUBLE
+} dtype_t;
+#endif
+
+static hbool_t my_isnan(dtype_t type, void *val);
+
+/*-------------------------------------------------------------------------
+ * XCAO, 11/10/2010
+ * added to improve performance for compound datasets
+ */
+static void get_member_types(hid_t tid, mcomp_t *members);
+static void close_member_types(mcomp_t *members);
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_array
+ *
+ * Purpose: compare two memory buffers;
+ *
+ * Return: number of differences found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 12, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+hsize_t diff_array( void *_mem1,
+                    void *_mem2,
+                    hsize_t nelmts,
+                    hsize_t hyper_start,
+                    int rank,
+                    hsize_t *dims,
+                    diff_opt_t *options,
+                    const char *name1,
+                    const char *name2,
+                    hid_t m_type,
+                    hid_t container1_id,
+                    hid_t container2_id) /* dataset where the reference came from*/
+{
+    hsize_t       nfound=0;          /* number of differences found */
+    size_t        size;              /* size of datum */
+    unsigned char *mem1 = (unsigned char*)_mem1;
+    unsigned char *mem2 = (unsigned char*)_mem2;
+    hsize_t       acc[32];    /* accumulator position */
+    hsize_t       pos[32];    /* matrix position */
+    int           ph=1;       /* print header  */
+    hsize_t       i;
+    int           j;
+    mcomp_t       members;
+    H5T_class_t   type_class;
+
+    /* get the size. */
+    size = H5Tget_size( m_type );
+    type_class = H5Tget_class(m_type);
+
+    /* Fast comparison first for atomic type by memcmp().
+     * It is OK not to list non-atomic type here because it will not be caught
+     * by the condition, but it gives more clarity for code planning
+     */
+    if (type_class != H5T_REFERENCE &&
+        type_class != H5T_COMPOUND &&
+        type_class != H5T_STRING &&
+        type_class != H5T_VLEN &&
+        HDmemcmp(mem1, mem2, size*nelmts)==0)
+        return 0;
+
+    if ( rank > 0 )
+    {
+
+        acc[rank-1]=1;
+        for(j=(rank-2); j>=0; j--)
+        {
+            acc[j]=acc[j+1]*dims[j+1];
+        }
+        for ( j = 0; j < rank; j++)
+            pos[j]=0;
+    }
+
+    switch (type_class)
+    {
+    case H5T_NO_CLASS:
+    case H5T_TIME:
+    case H5T_NCLASSES:
+    default:
+        HDassert(0);
+        break;
+
+   /*-------------------------------------------------------------------------
+    * float and integer atomic types
+    *-------------------------------------------------------------------------
+    */
+
+    case H5T_FLOAT:
+        if (H5Tequal(m_type, H5T_NATIVE_FLOAT))
+            nfound=diff_float(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_DOUBLE))
+            nfound=diff_double(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        else if (H5Tequal(m_type, H5T_NATIVE_LDOUBLE))
+            nfound=diff_ldouble(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+#endif
+        break;
+
+    case H5T_INTEGER:
+
+        if (H5Tequal(m_type, H5T_NATIVE_SCHAR))
+            nfound=diff_schar(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_UCHAR))
+            nfound=diff_uchar(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_SHORT))
+            nfound=diff_short(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_USHORT))
+            nfound=diff_ushort(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_INT))
+            nfound=diff_int(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_UINT))
+            nfound=diff_uint(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_LONG))
+            nfound=diff_long(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_ULONG))
+            nfound=diff_ulong(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_LLONG))
+            nfound=diff_llong(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+        else if (H5Tequal(m_type, H5T_NATIVE_ULLONG))
+            nfound=diff_ullong(mem1,mem2,nelmts,hyper_start,rank,dims,acc,pos,options,name1,name2,&ph);
+
+        break;
+
+    /*-------------------------------------------------------------------------
+     * Other types than float and integer
+     *-------------------------------------------------------------------------
+     */
+
+    case H5T_COMPOUND:
+    case H5T_STRING:
+    case H5T_BITFIELD:
+    case H5T_OPAQUE:
+    case H5T_ENUM:
+    case H5T_ARRAY:
+    case H5T_VLEN:
+    case H5T_REFERENCE:
+        HDmemset(&members, 0, sizeof (mcomp_t));
+        get_member_types(m_type, &members);
+        for ( i = 0; i < nelmts; i++)
+        {
+            nfound+=diff_datum(
+                mem1 + i * size,
+                mem2 + i * size, /* offset */
+                m_type,
+                i,
+                rank,
+                dims,
+                acc,
+                pos,
+                options,
+                name1,
+                name2,
+                container1_id,
+                container2_id,
+                &ph, &members);
+            if (options->n && nfound>=options->count)
+            {
+                close_member_types(&members);
+                return nfound;
+            }
+        } /* i */
+        close_member_types(&members);
+    } /* switch */
+
+    return nfound;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: diff_datum
+ *
+ * Purpose: compare the values pointed to in _MEM1 and _MEM2 of type M_TYPE
+ *
+ * Return: number of differences found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: October 29, 2003
+ *
+ * The comparison of the 2 buffers read from the files is made datum by datum.
+ *
+ * H5T_INTEGER and H5T_FLOAT
+ *  Copy the buffer into a compatible local datum and do a numerical
+ *  compare of this datum
+ * H5T_COMPOUND
+ *  Recursively call this function for each member
+ * H5T_ARRAY
+ *  Recursively call this function for each element
+ * H5T_VLEN
+ *  Recursively call this function for each element
+ * H5T_STRING
+ *  compare byte by byte in a cycle from 0 to type_size. this type_size is the
+ *  value obtained by the get_size function but it is the string lenght for
+ *  variable sized strings
+ * H5T_OPAQUE
+ *  compare byte by byte in a cycle from 0 to type_size
+ * H5T_BITFIELD
+ *  compare byte by byte in a cycle from 0 to type_size
+ * H5T_ENUM
+ *  for each pair of elements being compared, both bit patterns are converted to
+ *  their corresponding enumeration constant and a string comparison is made
+ * H5T_REFERENCE
+ *  Dereference the object and compare the type (basic object type).
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_datum(void       *_mem1,
+                          void       *_mem2,
+                          hid_t      m_type,
+                          hsize_t    i,
+                          int        rank,
+                          hsize_t    *dims,
+                          hsize_t    *acc,
+                          hsize_t    *pos,
+                          diff_opt_t *options,
+                          const char *obj1,
+                          const char *obj2,
+                          hid_t      container1_id,
+                          hid_t      container2_id, /*where the reference came from*/
+                          int        *ph,           /*print header */
+                          mcomp_t    *members)      /*compound members */
+{
+    unsigned char *mem1 = (unsigned char*)_mem1;
+    unsigned char *mem2 = (unsigned char*)_mem2;
+    unsigned      u;
+    hid_t         memb_type;
+    size_t        type_size;
+    H5T_sign_t    type_sign;
+    H5T_class_t   type_class;
+    size_t        offset;
+    unsigned      nmembs;
+    unsigned      j;
+    hsize_t       nelmts;
+    size_t        size=0;
+    hbool_t       iszero1;
+    hbool_t       iszero2;
+    hid_t         obj1_id;
+    hid_t         obj2_id;
+    hsize_t       nfound=0;   /* differences found */
+    int           ret=0;      /* check return error */
+    float         f1, f2;
+    double        per;
+    hbool_t       both_zero;
+
+    type_size = H5Tget_size( m_type );
+    type_class = H5Tget_class(m_type);
+
+    /* Fast comparison first for atomic type by memcmp().
+     * It is OK not to list non-atomic type here because it will not be caught
+     * by the confition, but it gives more clarity for code planning
+     */
+    if (type_class != H5T_REFERENCE &&
+        type_class != H5T_COMPOUND &&
+        type_class != H5T_STRING &&
+        type_class != H5T_VLEN &&
+        HDmemcmp(mem1, mem2, type_size)==0)
+        return 0;
+
+    switch (H5Tget_class(m_type))
+    {
+    case H5T_NO_CLASS:
+    case H5T_TIME:
+    case H5T_NCLASSES:
+    default:
+        HDassert(0);
+        break;
+
+   /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+    case H5T_COMPOUND:
+
+        nmembs = members->n;
+
+
+        for (j = 0; j < nmembs; j++)
+        {
+            offset    = members->offsets[j];
+            memb_type = members->ids[j];
+
+            nfound+=diff_datum(
+                mem1 + offset,
+                mem2 + offset,
+                memb_type,
+                i,
+                rank,
+                dims,
+                acc,
+                pos,
+                options,
+                obj1,
+                obj2,
+                container1_id,
+                container2_id,
+                ph, members->m[j]);
+        }
+        break;
+
+   /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+    case H5T_STRING:
+
+        {
+            H5T_str_t pad;
+            char      *s;
+            char *s1;
+            char *s2;
+            size_t size1;
+            size_t size2;
+
+            /* if variable length string */
+            if(H5Tis_variable_str(m_type))
+            {
+                /* Get pointer to first string */
+                s1 = *(char**) mem1;
+                size1 = HDstrlen(s1);
+                /* Get pointer to second string */
+                s2 = *(char**) mem2;
+                size2 = HDstrlen(s2);
+            }
+            else
+            {
+                /* Get pointer to first string */
+                s1 = (char *)mem1;
+                size1 = H5Tget_size(m_type);
+                /* Get pointer to second string */
+                s2 = (char *)mem2;
+                size2 = H5Tget_size(m_type);
+            }
+
+            /*
+             * compare for shorter string
+             * TODO: this code need to be improved to handle the difference
+             *       of length of strings.
+             *       For now mimic the previous way.
+             */
+            if(size1 < size2)
+            {
+                size = size1;
+                s = s1;
+            }
+            else
+            {
+                size = size2;
+                s = s2;
+            }
+
+            /* check for NULL pointer for string */
+            if(s!=NULL)
+            {
+                /* try fast compare first */
+                if (HDmemcmp(s1, s2, size)==0)
+                    break;
+
+                pad = H5Tget_strpad(m_type);
+
+                for (u=0; u<size && (s[u] || pad!=H5T_STR_NULLTERM); u++)
+                    nfound+=character_compare(
+                        s1 + u,
+                        s2 + u, /* offset */
+                        i,        /* index position */
+                        u,        /* string character position */
+                        rank,
+                        dims,
+                        acc,
+                        pos,
+                        options,
+                        obj1,
+                        obj2,
+                        ph);
+            }
+
+        }
+        break;
+
+   /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+    case H5T_BITFIELD:
+
+        /* byte-by-byte comparison */
+        for (u=0; u<type_size; u++)
+            nfound+=character_compare_opt(
+            mem1 + u,
+            mem2 + u, /* offset */
+            i,        /* index position */
+            rank,
+            dims,
+            acc,
+            pos,
+            options,
+            obj1,
+            obj2,
+            ph);
+
+        break;
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    case H5T_OPAQUE:
+
+        /* byte-by-byte comparison */
+        for (u=0; u<type_size; u++)
+            nfound+=character_compare_opt(
+            mem1 + u,
+            mem2 + u, /* offset */
+            i,        /* index position */
+            rank,
+            dims,
+            acc,
+            pos,
+            options,
+            obj1,
+            obj2,
+            ph);
+
+        break;
+
+
+   /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    case H5T_ENUM:
+
+    /* For enumeration types we compare the names instead of the
+    integer values.  For each pair of elements being
+    compared, we convert both bit patterns to their corresponding
+    enumeration constant and do a string comparison
+        */
+
+        {
+            char enum_name1[1024];
+            char enum_name2[1024];
+
+            herr_t err1;
+            herr_t err2;
+
+            /* disable error reporting */
+            H5E_BEGIN_TRY {
+
+                /* If the enum value cannot be converted to a string
+                 * it is set to an error string for later output.
+                 */
+                err1 = H5Tenum_nameof(m_type, mem1, enum_name1, sizeof enum_name1);
+                if(err1 < 0)
+                    HDsnprintf(enum_name1, sizeof(enum_name1), "**INVALID VALUE**");
+
+                err2 = H5Tenum_nameof(m_type, mem2, enum_name2, sizeof enum_name2);
+                if(err2 < 0)
+                    HDsnprintf(enum_name2, sizeof(enum_name2), "**INVALID VALUE**");
+
+                if(err1 < 0 || err2 < 0)
+                {
+                    /* One or more bad enum values */
+
+                    /* If the two values cannot be converted to a string
+                     * (probably due to them being invalid enum values),
+                     * don't attempt to convert them - just report errors.
+                     */
+                    nfound += 1;
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(S_FORMAT,enum_name1,enum_name2);
+                    }
+                }
+                else
+                {
+                    /* Both enum values were valid */
+
+                    if (HDstrcmp(enum_name1,enum_name2)!=0)
+                    {
+                        nfound=1;
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(S_FORMAT,enum_name1,enum_name2);
+                        }
+                    }
+                    else
+                    {
+                        for (u=0; u<type_size; u++)
+                            nfound+=character_compare_opt(
+                            mem1 + u,
+                            mem2 + u, /* offset */
+                            i,        /* index position */
+                            rank,
+                            dims,
+                            acc,
+                            pos,
+                            options,
+                            obj1,
+                            obj2,
+                            ph);
+                    }
+                }
+                /* enable error reporting */
+            } H5E_END_TRY;
+        }
+
+
+        break;
+
+   /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+    case H5T_ARRAY:
+
+        {
+            hsize_t adims[H5S_MAX_RANK];
+            int       ndims;
+
+            /* get the array's base datatype for each element */
+            memb_type = H5Tget_super(m_type);
+            size      = H5Tget_size(memb_type);
+            ndims     = H5Tget_array_ndims(m_type);
+            H5Tget_array_dims2(m_type, adims);
+            HDassert(ndims >= 1 && ndims <= H5S_MAX_RANK);
+
+            /* calculate the number of array elements */
+            for (u = 0, nelmts = 1; u < (unsigned)ndims; u++)
+                nelmts *= adims[u];
+            for (u = 0; u < nelmts; u++) {
+               nfound += diff_datum(
+                   mem1 + u * size,
+                   mem2 + u * size, /* offset */
+                   memb_type,
+                   i,               /* index position */
+                   rank,
+                   dims,
+                   acc,
+                   pos,
+                   options,
+                   obj1,
+                   obj2,
+                   container1_id,
+                   container2_id,
+                   ph, members);
+            }
+            H5Tclose(memb_type);
+        }
+        break;
+
+
+
+   /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+
+    case H5T_REFERENCE:
+
+        iszero1=all_zero(_mem1, H5Tget_size(m_type));
+        iszero2=all_zero(_mem2, H5Tget_size(m_type));
+        if (iszero1 != iszero2)
+        {
+            return 1;
+        }
+        else if (!iszero1 && !iszero2)
+        {
+
+        /*-------------------------------------------------------------------------
+        * H5T_STD_REF_DSETREG
+        * Dataset region reference
+        *-------------------------------------------------------------------------
+            */
+            if (type_size==H5R_DSET_REG_REF_BUF_SIZE)
+            {
+                hid_t  region1_id;
+                hid_t  region2_id;
+
+                if ((obj1_id = H5Rdereference(container1_id, H5R_DATASET_REGION, _mem1))<0)
+                    ret= -1;
+                if ((obj2_id = H5Rdereference(container2_id, H5R_DATASET_REGION, _mem2))<0)
+                    ret= -1;
+                if ((region1_id = H5Rget_region(container1_id, H5R_DATASET_REGION, _mem1))<0)
+                    ret= -1;
+                if ((region2_id = H5Rget_region(container2_id, H5R_DATASET_REGION, _mem2))<0)
+                    ret= -1;
+
+                if (ret==-1) {
+                    options->err_stat=1;
+                    return 0;
+                }
+
+                nfound = diff_region(obj1_id,obj2_id,region1_id,region2_id,options);
+
+                H5Oclose(obj1_id);
+                H5Oclose(obj2_id);
+                H5Sclose(region1_id);
+                H5Sclose(region2_id);
+
+            }/*dataset reference*/
+
+
+           /*-------------------------------------------------------------------------
+            * H5T_STD_REF_OBJ
+            * Object references. get the type and OID of the referenced object
+            *-------------------------------------------------------------------------
+            */
+            else if (type_size == H5R_OBJ_REF_BUF_SIZE)
+            {
+                H5O_type_t     obj1_type;
+                H5O_type_t     obj2_type;
+
+                if(H5Rget_obj_type2(container1_id, H5R_OBJECT, _mem1, &obj1_type) < 0)
+                    ret = -1;
+                if(H5Rget_obj_type2(container2_id, H5R_OBJECT, _mem2, &obj2_type) < 0)
+                    ret = -1;
+                if(ret == -1) {
+                    options->err_stat = 1;
+                    return 0;
+                } /* end if */
+
+                /* check object type */
+                if(obj1_type != obj2_type)
+                {
+                    parallel_print("Different object types referenced: <%s> and <%s>", obj1, obj2);
+                    options->not_cmp = 1;
+                    return 0;
+                }
+
+                if((obj1_id = H5Rdereference(container1_id, H5R_OBJECT, _mem1)) < 0)
+                    ret = -1;
+                if((obj2_id = H5Rdereference(container2_id, H5R_OBJECT, _mem2)) < 0)
+                    ret = -1;
+                if(ret == -1) {
+                    options->err_stat = 1;
+                    return 0;
+                } /* end if */
+
+                /* compare */
+                if(obj1_type == H5O_TYPE_DATASET)
+                    nfound = diff_datasetid(obj1_id,
+                    obj2_id,
+                    NULL,
+                    NULL,
+                    options);
+                else {
+                    if(options->m_verbose)
+                        parallel_print("Warning: Comparison not possible of object types referenced: <%s> and <%s>\n",
+                        obj1, obj2);
+                    options->not_cmp = 1;
+                }
+
+                H5Oclose(obj1_id);
+                H5Oclose(obj2_id);
+
+            }/*object reference*/
+
+        }/*is zero*/
+
+
+        break;
+
+   /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    case H5T_VLEN:
+
+        /* get the VL sequences's base datatype for each element */
+        memb_type = H5Tget_super(m_type);
+        size      = H5Tget_size(memb_type);
+
+        /* get the number of sequence elements */
+        nelmts = ((hvl_t *)mem1)->len;
+
+        for (j = 0; j < nelmts; j++)
+            nfound += diff_datum(
+                ((char *)(((hvl_t *)mem1)->p)) + j * size,
+                ((char *)(((hvl_t *)mem2)->p)) + j * size, /* offset */
+                memb_type,
+                i,         /* index position */
+                rank,
+                dims,
+                acc,
+                pos,
+                options,
+                obj1,
+                obj2,
+                container1_id,
+                container2_id,
+                ph, members);
+
+        H5Tclose(memb_type);
+
+        break;
+
+
+
+   /*-------------------------------------------------------------------------
+    * H5T_INTEGER
+    *-------------------------------------------------------------------------
+    */
+
+    case H5T_INTEGER:
+        type_sign = H5Tget_sign(m_type);
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_SCHAR
+        *-------------------------------------------------------------------------
+        */
+        if (type_size==1 && type_sign!=H5T_SGN_NONE)
+        {
+            char        temp1_char;
+            char        temp2_char;
+            HDassert(type_size==sizeof(char));
+            HDmemcpy(&temp1_char, mem1, sizeof(char));
+            HDmemcpy(&temp2_char, mem2, sizeof(char));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if (ABS(temp1_char-temp2_char) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER(temp1_char,temp2_char);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_char,temp2_char,ABS(temp1_char-temp2_char),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER(temp1_char,temp2_char);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_char-temp2_char) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_char,temp2_char,ABS(temp1_char-temp2_char),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_char != temp2_char)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                }
+                nfound++;
+            }
+
+        } /*H5T_NATIVE_SCHAR*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_UCHAR
+        *-------------------------------------------------------------------------
+        */
+        else if (type_size==1 && type_sign==H5T_SGN_NONE)
+        {
+            unsigned char      temp1_uchar;
+            unsigned char      temp2_uchar;
+            HDassert(type_size==sizeof(unsigned char));
+
+            HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+            HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if ( PDIFF(temp1_uchar,temp2_uchar) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && PDIFF(temp1_uchar,temp2_uchar) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_uchar != temp2_uchar)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                }
+                nfound++;
+            }
+
+        } /*H5T_NATIVE_UCHAR*/
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_SHORT
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==2 && type_sign!=H5T_SGN_NONE)
+        {
+            short       temp1_short;
+            short       temp2_short;
+            HDassert(type_size==sizeof(short));
+
+            HDmemcpy(&temp1_short, mem1, sizeof(short));
+            HDmemcpy(&temp2_short, mem2, sizeof(short));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if (ABS(temp1_short-temp2_short) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER(temp1_short,temp2_short);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_short,temp2_short,ABS(temp1_short-temp2_short),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER(temp1_short,temp2_short);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_short-temp2_short) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_short,temp2_short,ABS(temp1_short-temp2_short),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_short != temp2_short)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                }
+                nfound++;
+            }
+
+
+        } /*H5T_NATIVE_SHORT*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_USHORT
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==2 && type_sign==H5T_SGN_NONE)
+        {
+            unsigned short       temp1_ushort;
+            unsigned short       temp2_ushort;
+            HDassert(type_size==sizeof(short));
+
+            HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+            HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if ( PDIFF(temp1_ushort,temp2_ushort) > options->delta)
+                {
+
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
+                            PDIFF(temp1_ushort,temp2_ushort));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && PDIFF(temp1_ushort,temp2_ushort) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_ushort != temp2_ushort)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+                }
+                nfound++;
+            }
+        } /*H5T_NATIVE_USHORT*/
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_INT
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==4 && type_sign!=H5T_SGN_NONE)
+        {
+            int         temp1_int;
+            int         temp2_int;
+            HDassert(type_size==sizeof(int));
+
+            HDmemcpy(&temp1_int, mem1, sizeof(int));
+            HDmemcpy(&temp2_int, mem2, sizeof(int));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if (ABS(temp1_int-temp2_int) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER(temp1_int,temp2_int);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_int,temp2_int,ABS(temp1_int-temp2_int),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER(temp1_int,temp2_int);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_int-temp2_int) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(I_FORMAT_P,temp1_int,temp2_int,ABS(temp1_int-temp2_int),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_int != temp2_int)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                }
+                nfound++;
+            }
+        } /*H5T_NATIVE_INT*/
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_UINT
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==4 && type_sign==H5T_SGN_NONE)
+        {
+            unsigned int         temp1_uint;
+            unsigned int         temp2_uint;
+            HDassert(type_size==sizeof(int));
+
+            HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+            HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if ( PDIFF(temp1_uint,temp2_uint) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(UI_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(UI_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(UI_FORMAT_P,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(UI_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && PDIFF(temp1_uint,temp2_uint) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(UI_FORMAT_P,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_uint != temp2_uint)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(UI_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                }
+                nfound++;
+            }
+        } /*H5T_NATIVE_UINT*/
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_LONG
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8 && type_sign!=H5T_SGN_NONE)
+        {
+            long        temp1_long;
+            long        temp2_long;
+            HDassert(type_size==sizeof(long));
+
+            HDmemcpy(&temp1_long, mem1, sizeof(long));
+            HDmemcpy(&temp2_long, mem2, sizeof(long));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if (ABS(temp1_long-temp2_long) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER(temp1_long,temp2_long);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
+                            ABS(temp1_long-temp2_long));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LI_FORMAT_P,temp1_long,temp2_long,ABS(temp1_long-temp2_long),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER(temp1_long,temp2_long);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_long-temp2_long) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
+                                ABS(temp1_long-temp2_long),
+                                per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_long != temp2_long)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                }
+                nfound++;
+            }
+        } /*H5T_NATIVE_LONG*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_ULONG
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8 && type_sign==H5T_SGN_NONE)
+        {
+            unsigned long        temp1_ulong;
+            unsigned long        temp2_ulong;
+            HDassert(type_size==sizeof(unsigned long));
+
+            HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+            HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if ( PDIFF(temp1_ulong,temp2_ulong) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(ULI_FORMAT_P,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && PDIFF(temp1_ulong,temp2_ulong) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(ULI_FORMAT_P,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_ulong != temp2_ulong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                }
+                nfound++;
+            }
+
+
+        } /*H5T_NATIVE_ULONG*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_LLONG
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8 && type_sign!=H5T_SGN_NONE)
+        {
+            long long        temp1_llong;
+            long long        temp2_llong;
+            HDassert(type_size==sizeof(long long));
+
+            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if (ABS(temp1_llong-temp2_llong) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                PER(temp1_llong,temp2_llong);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                PER(temp1_llong,temp2_llong);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent  && ABS(temp1_llong-temp2_llong) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_llong != temp2_llong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                }
+                nfound++;
+            }
+
+        } /*H5T_NATIVE_LLONG*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_ULLONG
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8 && type_sign==H5T_SGN_NONE)
+        {
+            unsigned long long        temp1_ullong;
+            unsigned long long        temp2_ullong;
+            HDassert(type_size==sizeof(unsigned long long));
+
+            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+            /* -d and !-p */
+            if (options->d && !options->p)
+            {
+                if ( PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                    }
+                    nfound++;
+                }
+            }
+            /* !-d and -p */
+            else if (!options->d && options->p)
+            {
+                ull2float(temp1_ullong,&f1);
+                ull2float(temp2_ullong,&f2);
+                PER(f1,f2);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            /* -d and -p */
+            else if ( options->d && options->p)
+            {
+                ull2float(temp1_ullong,&f1);
+                ull2float(temp2_ullong,&f2);
+                PER(f1,f2);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta )
+                    {
+
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+
+                            parallel_print(SPACES);
+                            parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                        }
+                        nfound++;
+                    }
+            }
+            else if (temp1_ullong != temp2_ullong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                }
+                nfound++;
+            }
+
+        } /*H5T_NATIVE_ULLONG*/
+
+
+        break; /* H5T_INTEGER class */
+
+
+   /*-------------------------------------------------------------------------
+    * H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    case H5T_FLOAT:
+
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_FLOAT
+        *-------------------------------------------------------------------------
+        */
+        if (type_size==4)
+        {
+            float temp1_float;
+            float temp2_float;
+            hbool_t   isnan1 = FALSE;
+            hbool_t   isnan2 = FALSE;
+
+            HDassert(type_size==sizeof(float));
+
+            HDmemcpy(&temp1_float, mem1, sizeof(float));
+            HDmemcpy(&temp2_float, mem2, sizeof(float));
+
+            /* logic for detecting NaNs is different with options -d, -p and no options */
+
+           /*-------------------------------------------------------------------------
+            * -d and !-p
+            *-------------------------------------------------------------------------
+            */
+            if (options->d && !options->p)
+            {
+
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                    isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+                }
+
+                 /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    if (ABS(temp1_float-temp2_float) > (float)options->delta)
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT,(double)temp1_float,(double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                        }
+                        nfound++;
+                    }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+
+                }
+            }
+           /*-------------------------------------------------------------------------
+            * !-d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (!options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                    isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+                }
+
+                /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_float,temp2_float);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P_NOTCOMP, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent && (double)ABS(temp1_float-temp2_float) > options->delta )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(F_FORMAT_P, (double)temp1_float, (double)temp2_float,
+                                    (double)ABS(temp1_float - temp2_float),
+                                    (double)ABS(1 - temp2_float / temp1_float));
+                            }
+                            nfound++;
+                        }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * -d and -p
+            *-------------------------------------------------------------------------
+            */
+
+            else if ( options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                    isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+                }
+
+                 /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_float,temp2_float);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P_NOTCOMP, (double)temp1_float, (double)temp2_float,
+                                (double)ABS(temp1_float - temp2_float));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(F_FORMAT_P, (double)temp1_float, (double)temp2_float,
+                                    (double)ABS(temp1_float - temp2_float),
+                                    (double)ABS(1 - temp2_float / temp1_float));
+                            }
+                            nfound++;
+                        }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * no -d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (equal_float(temp1_float,temp2_float,options)==FALSE)
+            {
+
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                }
+                nfound++;
+            }
+        } /*H5T_NATIVE_FLOAT*/
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_DOUBLE
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8)
+        {
+            double temp1_double;
+            double temp2_double;
+            hbool_t    isnan1 = FALSE;
+            hbool_t    isnan2 = FALSE;
+
+            HDassert(type_size==sizeof(double));
+
+            HDmemcpy(&temp1_double, mem1, sizeof(double));
+            HDmemcpy(&temp2_double, mem2, sizeof(double));
+
+           /* logic for detecting NaNs is different with options -d, -p and no options */
+
+           /*-------------------------------------------------------------------------
+            * -d and !-p
+            *-------------------------------------------------------------------------
+            */
+            if (options->d && !options->p)
+            {
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+                }
+
+                /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    if (ABS(temp1_double-temp2_double) > options->delta)
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+
+                }
+            } /* options->d && !options->p */
+
+           /*-------------------------------------------------------------------------
+            * !-d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (!options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+                }
+
+                /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_double,temp2_double);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                    ABS(temp1_double-temp2_double),
+                                    ABS(1-temp2_double/temp1_double));
+                            }
+                            nfound++;
+                        }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * -d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if ( options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+                }
+
+                /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_double,temp2_double);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent &&
+                            ABS(temp1_double-temp2_double) > options->delta )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                    ABS(temp1_double-temp2_double),
+                                    ABS(1-temp2_double/temp1_double));
+                            }
+                            nfound++;
+                        }
+
+                }
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * no -d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (equal_double(temp1_double,temp2_double,options)==FALSE)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+            }
+    } /*H5T_NATIVE_DOUBLE*/
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+
+
+       /*-------------------------------------------------------------------------
+        * H5T_NATIVE_LDOUBLE
+        *-------------------------------------------------------------------------
+        */
+
+        else if (type_size==8)
+        {
+            long double temp1_double;
+            long double temp2_double;
+            hbool_t         isnan1 = FALSE;
+            hbool_t         isnan2 = FALSE;
+
+
+            HDassert(type_size==sizeof(long double));
+
+            HDmemcpy(&temp1_double, mem1, sizeof(long double));
+            HDmemcpy(&temp2_double, mem2, sizeof(long double));
+
+           /* logic for detecting NaNs is different with options -d, -p and no options */
+
+           /*-------------------------------------------------------------------------
+            * -d and !-p
+            *-------------------------------------------------------------------------
+            */
+            if (options->d && !options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+                }
+
+                 /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    if (ABS(temp1_double-temp2_double) > options->delta)
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LD_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+                } /* NaN */
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * !-d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (!options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+                }
+
+                 /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_double,temp2_double);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LD_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(LD_FORMAT_P,temp1_double,temp2_double,
+                                    ABS(temp1_double-temp2_double),
+                                    ABS(1-temp2_double/temp1_double));
+                            }
+                            nfound++;
+                        }
+
+                } /* NaN */
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+           }
+
+           /*-------------------------------------------------------------------------
+            * -d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if ( options->d && options->p)
+            {
+
+               /*-------------------------------------------------------------------------
+                * detect NaNs
+                *-------------------------------------------------------------------------
+                */
+                if ( options->do_nans )
+                {
+                    isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                    isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+                }
+
+                 /* both not NaN, do the comparison */
+                if ( !isnan1 && !isnan2)
+                {
+
+                    PER(temp1_double,temp2_double);
+
+                    if (not_comparable && !both_zero) /* not comparable */
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(LD_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double));
+                        }
+                        nfound++;
+                    }
+
+                    else
+
+                        if ( per > options->percent &&
+                            ABS(temp1_double-temp2_double) > options->delta )
+                        {
+                            if ( print_data(options) )
+                            {
+                                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                                parallel_print(SPACES);
+                                parallel_print(LD_FORMAT_P,temp1_double,temp2_double,
+                                    ABS(temp1_double-temp2_double),
+                                    ABS(1-temp2_double/temp1_double));
+                            }
+                            nfound++;
+                        }
+
+                } /* NaN */
+                /* only one is NaN, assume difference */
+                else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+            }
+
+           /*-------------------------------------------------------------------------
+            * no -d and -p
+            *-------------------------------------------------------------------------
+            */
+            else if (equal_ldouble(temp1_double,temp2_double,options)==FALSE)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LD_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+            }
+    } /*H5T_NATIVE_DOUBLE*/
+
+
+#endif  /* H5_SIZEOF_LONG_DOUBLE */
+
+
+
+    break; /* H5T_FLOAT class */
+
+ } /* switch */
+
+ return nfound;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: all_zero
+ *
+ * Purpose: Determines if memory is initialized to all zero bytes.
+ *
+ * Return: TRUE if all bytes are zero; FALSE otherwise
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static hbool_t all_zero(const void *_mem, size_t size)
+{
+    const unsigned char *mem = (const unsigned char *)_mem;
+
+    while(size-- > 0)
+        if(mem[size])
+            return FALSE;
+
+    return TRUE;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_region_block
+ *
+ * Purpose: print start coordinates and opposite corner of a region block
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+void print_region_block(int i, hsize_t *ptdata, int ndims)
+{
+    int j;
+
+    parallel_print("        ");
+    for (j = 0; j < ndims; j++)
+        parallel_print("%s%lu", j ? "," : "   (",
+        (unsigned long)ptdata[i * 2 * ndims + j]);
+    for (j = 0; j < ndims; j++)
+        parallel_print("%s%lu", j ? "," : ")-(",
+        (unsigned long)ptdata[i * 2 * ndims + j + ndims]);
+    parallel_print(")");
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_points
+ *
+ * Purpose: print points of a region reference
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+void print_points(int i, hsize_t *ptdata, int ndims)
+{
+    int j;
+
+    parallel_print("              ");
+    for (j = 0; j < ndims; j++)
+        parallel_print("%s%lu", j ? "," : "(",
+        (unsigned long)(ptdata[i * ndims + j]));
+    parallel_print(")");
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: diff_region
+ *
+ * Purpose: diff a dataspace region
+ *
+ * Return: number of differences
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+hsize_t diff_region(hid_t obj1_id,
+                    hid_t obj2_id,
+                    hid_t region1_id,
+                    hid_t region2_id,
+                    diff_opt_t *options)
+
+{
+    hssize_t   nblocks1, npoints1;
+    hssize_t   nblocks2, npoints2;
+    hsize_t    alloc_size;
+    hsize_t    *ptdata1;
+    hsize_t    *ptdata2;
+    int        ndims1;
+    int        ndims2;
+    int        i, j;
+    hsize_t    nfound_b = 0;     /* block differences found */
+    hsize_t    nfound_p = 0;     /* point differences found */
+
+    ndims1 = H5Sget_simple_extent_ndims(region1_id);
+    ndims2 = H5Sget_simple_extent_ndims(region2_id);
+
+    /*
+    * These two functions fail if the region does not have blocks or points,
+    * respectively. They do not currently know how to translate from one to
+    * the other.
+    */
+    H5E_BEGIN_TRY {
+        nblocks1 = H5Sget_select_hyper_nblocks(region1_id);
+        nblocks2 = H5Sget_select_hyper_nblocks(region2_id);
+
+        npoints1 = H5Sget_select_elem_npoints(region1_id);
+        npoints2 = H5Sget_select_elem_npoints(region2_id);
+    } H5E_END_TRY;
+
+    if(nblocks1 != nblocks2 || npoints1 != npoints2 || ndims1 != ndims2) {
+        options->not_cmp = 1;
+        return 0;
+    }
+
+    /*-------------------------------------------------------------------------
+    * compare block information
+    *-------------------------------------------------------------------------
+    */
+    if(nblocks1 > 0) {
+        HDassert(ndims1 > 0);
+        alloc_size = (hsize_t)nblocks1 * (unsigned)ndims1 * 2 * sizeof(ptdata1[0]);
+        HDassert(alloc_size == (hsize_t)((size_t)alloc_size)); /*check for overflow*/
+
+        ptdata1 = (hsize_t *)HDmalloc((size_t)alloc_size);
+        H5_CHECK_OVERFLOW(nblocks1, hssize_t, hsize_t);
+        H5Sget_select_hyper_blocklist(region1_id, (hsize_t)0, (hsize_t)nblocks1, ptdata1);
+
+        ptdata2 = (hsize_t *)HDmalloc((size_t)alloc_size);
+        H5_CHECK_OVERFLOW(nblocks2, hssize_t, hsize_t);
+        H5Sget_select_hyper_blocklist(region2_id, (hsize_t)0, (hsize_t)nblocks2, ptdata2);
+
+        for (i = 0; i < nblocks1; i++) {
+            /* start coordinates and opposite corner */
+            for (j = 0; j < ndims1; j++) {
+                hsize_t start1, start2, end1, end2;
+
+                start1 = ptdata1[i * 2 * ndims1 + j];
+                start2 = ptdata2[i * 2 * ndims1 + j];
+                end1   = ptdata1[i * 2 * ndims1 + j + ndims1];
+                end2   = ptdata2[i * 2 * ndims1 + j + ndims1];
+                if (start1 != start2 || end1 != end2)
+                    nfound_b++;
+            }
+        }
+
+
+        /* print differences if found */
+        if (nfound_b && options->m_verbose) {
+            H5O_info_t oi1, oi2;
+
+            H5Oget_info(obj1_id, &oi1);
+            H5Oget_info(obj2_id, &oi2);
+
+            parallel_print("Referenced dataset      %lu            %lu\n",
+                    (unsigned long)oi1.addr, (unsigned long)oi2.addr);
+            parallel_print("------------------------------------------------------------\n");
+
+            parallel_print("Region blocks\n");
+            for (i = 0; i < nblocks1; i++) {
+                parallel_print("block #%d", i);
+                print_region_block(i, ptdata1, ndims1);
+                print_region_block(i, ptdata2, ndims1);
+                parallel_print("\n");
+            }
+        }
+
+        HDfree(ptdata1);
+        HDfree(ptdata2);
+    }
+
+    /*-------------------------------------------------------------------------
+    * compare point information
+    *-------------------------------------------------------------------------
+    */
+    if(npoints1 > 0) {
+        alloc_size = (hsize_t)npoints1 * (unsigned)ndims1 * sizeof(ptdata1[0]);
+        HDassert(alloc_size == (hsize_t)((size_t)alloc_size)); /*check for overflow*/
+
+        ptdata1 = (hsize_t *)HDmalloc((size_t)alloc_size);
+        H5_CHECK_OVERFLOW(npoints1,hssize_t,hsize_t);
+        H5Sget_select_elem_pointlist(region1_id, (hsize_t)0, (hsize_t)npoints1, ptdata1);
+
+        ptdata2 = (hsize_t *)HDmalloc((size_t)alloc_size);
+        H5_CHECK_OVERFLOW(npoints1,hssize_t,hsize_t);
+        H5Sget_select_elem_pointlist(region2_id, (hsize_t)0, (hsize_t)npoints2, ptdata2);
+
+        for(i = 0; i < npoints1; i++) {
+            hsize_t pt1, pt2;
+
+            for(j = 0; j < ndims1; j++) {
+                pt1 = ptdata1[i * ndims1 + j];
+                pt2 = ptdata2[i * ndims1 + j];
+                if(pt1 != pt2)
+                    nfound_p++;
+            }
+        }
+
+        if(nfound_p && options->m_verbose) {
+            parallel_print("Region points\n");
+            for(i = 0; i < npoints1; i++) {
+                hsize_t pt1, pt2;
+                int     diff_data = 0;
+
+                for(j = 0; j < ndims1; j++) {
+                    pt1 = ptdata1[i * ndims1 + j];
+                    pt2 = ptdata2[i * ndims1 + j];
+                    if(pt1 != pt2) {
+                        diff_data = 1;
+                        break;
+                    }
+                }
+                if(diff_data) {
+                    parallel_print("point #%d", i);
+                    print_points(i, ptdata1, ndims1);
+                    print_points(i, ptdata2, ndims1);
+                    parallel_print("\n");
+                }
+            }
+        }
+
+
+#if defined (H5DIFF_DEBUG)
+        for (i = 0; i < npoints1; i++) {
+            int j;
+
+            parallel_print("%sPt%lu: " , i ? "," : "", (unsigned long)i);
+
+            for (j = 0; j < ndims1; j++)
+                parallel_print("%s%lu", j ? "," : "(",
+                        (unsigned long)(ptdata1[i * ndims1 + j]));
+
+            parallel_print(")");
+        }
+#endif
+
+        HDfree(ptdata1);
+        HDfree(ptdata2);
+    }
+
+    nfound_b = nfound_b / (unsigned)ndims1;
+    nfound_p = nfound_p / (unsigned)ndims1;
+    return (nfound_p + nfound_b);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: character_compare
+ *
+ * Purpose: do a byte-by-byte comparison and print in char format
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+hsize_t character_compare(char *mem1,
+                  char *mem2,
+                  hsize_t       i,
+                  unsigned      u,
+                  int           rank,
+                  hsize_t       *dims,
+                  hsize_t       *acc,
+                  hsize_t       *pos,
+                  diff_opt_t    *options,
+                  const char    *obj1,
+                  const char    *obj2,
+                  int           *ph)
+{
+    hsize_t            nfound=0;  /* differences found */
+    char      temp1_uchar;
+    char      temp2_uchar;
+
+    HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+    HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+    if (temp1_uchar != temp2_uchar)
+    {
+        if ( print_data(options) )
+        {
+            print_char_pos(ph,0,i,u,acc,pos,rank,dims,obj1,obj2);
+            parallel_print("            ");
+            h5diff_print_char(temp1_uchar);
+            parallel_print("            ");
+            h5diff_print_char(temp2_uchar);
+            parallel_print("\n");
+        }
+        nfound++;
+    }
+
+    return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: character_compare_opt
+ *
+ * Purpose: do a byte-by-byte comparison and print in numerical format
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static hsize_t character_compare_opt(unsigned char *mem1,
+                          unsigned char *mem2,
+                          hsize_t       i,
+                          int           rank,
+                          hsize_t       *dims,
+                          hsize_t       *acc,
+                          hsize_t       *pos,
+                          diff_opt_t    *options,
+                          const char    *obj1,
+                          const char    *obj2,
+                          int           *ph)
+{
+    hsize_t            nfound=0;  /* differences found */
+    unsigned char      temp1_uchar;
+    unsigned char      temp2_uchar;
+    double             per;
+    hbool_t            both_zero;
+
+    HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+    HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+    /* -d and !-p */
+
+    if (options->d && !options->p)
+    {
+        if ( PDIFF(temp1_uchar,temp2_uchar) > options->delta)
+        {
+            if ( print_data(options) )
+            {
+                print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+                parallel_print(SPACES);
+                parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+            }
+            nfound++;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+        if ( per > options->percent )
+        {
+            if ( print_data(options) )
+            {
+                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                parallel_print(SPACES);
+                parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar),per);
+            }
+            nfound++;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+        if ( per > options->percent && PDIFF(temp1_uchar,temp2_uchar) > options->delta )
+        {
+            if ( print_data(options) )
+            {
+                print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
+                parallel_print(SPACES);
+                parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar),per);
+            }
+            nfound++;
+        }
+    }
+    else if (temp1_uchar != temp2_uchar)
+    {
+        if ( print_data(options) )
+        {
+            print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
+            parallel_print(SPACES);
+            parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+        }
+        nfound++;
+    }
+
+    return nfound;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_float
+ *
+ * Purpose: diff a H5T_NATIVE_FLOAT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_float(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+    hsize_t     nfound=0;          /* number of differences found */
+    float       temp1_float;
+    float       temp2_float;
+    hsize_t     i;
+    double      per;
+    hbool_t     both_zero;
+    hbool_t     isnan1 = FALSE;
+    hbool_t     isnan2 = FALSE;
+
+
+ /*-------------------------------------------------------------------------
+  * -d and !-p
+  *-------------------------------------------------------------------------
+  */
+
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_float, mem1, sizeof(float));
+            HDmemcpy(&temp2_float, mem2, sizeof(float));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+                if ((double)ABS(temp1_float-temp2_float) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+                }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(float);
+            mem2+=sizeof(float);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * !-d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_float, mem1, sizeof(float));
+            HDmemcpy(&temp2_float, mem2, sizeof(float));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+            }
+            /* both not NaN, do the comparison */
+            if ( (!isnan1 && !isnan2))
+            {
+
+                PER(temp1_float,temp2_float);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP, (double)temp1_float, (double)temp2_float,
+                            (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P, (double)temp1_float, (double)temp2_float,
+                                (double)ABS(temp1_float - temp2_float),
+                                (double)ABS(1 - temp2_float / temp1_float));
+                        }
+                        nfound++;
+                    }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(float);
+            mem2+=sizeof(float);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if ( options->d && options->p)
+    {
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_float, mem1, sizeof(float));
+            HDmemcpy(&temp2_float, mem2, sizeof(float));
+
+            /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_FLOAT,&temp1_float);
+                isnan2 = my_isnan(FLT_FLOAT,&temp2_float);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+
+                PER(temp1_float,temp2_float);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP, (double)temp1_float, (double)temp2_float,
+                            (double)ABS(temp1_float - temp2_float));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && (double)ABS(temp1_float - temp2_float) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P, (double)temp1_float, (double)temp2_float,
+                                (double)ABS(temp1_float - temp2_float),
+                                (double)ABS(1 - temp2_float / temp1_float));
+                        }
+                        nfound++;
+                    }
+
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(float);
+            mem2+=sizeof(float);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * no -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_float, mem1, sizeof(float));
+            HDmemcpy(&temp2_float, mem2, sizeof(float));
+
+            if (equal_float(temp1_float,temp2_float,options)==FALSE)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT, (double)temp1_float, (double)temp2_float, (double)ABS(temp1_float - temp2_float));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(float);
+            mem2+=sizeof(float);
+            if (options->n && nfound>=options->count)
+                return nfound;
+
+        } /* nelmts */
+
+
+
+
+
+    }
+
+    return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_double
+ *
+ * Purpose: diff a H5T_NATIVE_DOUBLE type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_double(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+    hsize_t     nfound=0;          /* number of differences found */
+    double      temp1_double;
+    double      temp2_double;
+    hsize_t     i;
+    double      per;
+    hbool_t     both_zero;
+    hbool_t     isnan1 = FALSE;
+    hbool_t     isnan2 = FALSE;
+
+ /*-------------------------------------------------------------------------
+  * -d and !-p
+  *-------------------------------------------------------------------------
+  */
+
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(double));
+            HDmemcpy(&temp2_double, mem2, sizeof(double));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+                if (ABS(temp1_double-temp2_double) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2) || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(double);
+            mem2+=sizeof(double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * !-d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(double));
+            HDmemcpy(&temp2_double, mem2, sizeof(double));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+            }
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+
+                PER(temp1_double,temp2_double);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                            ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double),
+                                ABS(1-temp2_double/temp1_double));
+                        }
+                        nfound++;
+                    }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(double);
+            mem2+=sizeof(double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if ( options->d && options->p)
+    {
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(double));
+            HDmemcpy(&temp2_double, mem2, sizeof(double));
+
+            /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_DOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_DOUBLE,&temp2_double);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+
+                PER(temp1_double,temp2_double);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                            ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_double-temp2_double) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double),
+                                ABS(1-temp2_double/temp1_double));
+                        }
+                        nfound++;
+                    }
+
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2) || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(double);
+            mem2+=sizeof(double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * no -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else
+    {
+
+
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(double));
+            HDmemcpy(&temp2_double, mem2, sizeof(double));
+
+
+            if (equal_double(temp1_double,temp2_double,options)==FALSE)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(double);
+            mem2+=sizeof(double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+
+        } /* nelmts */
+
+
+
+
+
+    }
+
+    return nfound;
+}
+
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_ldouble
+ *
+ * Purpose: diff a H5T_NATIVE_LDOUBLE type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5_SIZEOF_LONG_DOUBLE !=0
+
+static hsize_t diff_ldouble(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+    hsize_t     nfound=0;          /* number of differences found */
+    long double temp1_double;
+    long double temp2_double;
+    hsize_t     i;
+    double      per;
+    hbool_t     both_zero;
+    hbool_t     isnan1 = FALSE;
+    hbool_t     isnan2 = FALSE;
+
+
+ /*-------------------------------------------------------------------------
+  * -d and !-p
+  *-------------------------------------------------------------------------
+  */
+
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(long double));
+            HDmemcpy(&temp2_double, mem2, sizeof(long double));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+                if (ABS(temp1_double-temp2_double) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(long double);
+            mem2+=sizeof(long double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * !-d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(long double));
+            HDmemcpy(&temp2_double, mem2, sizeof(long double));
+
+           /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+            }
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+
+                PER(temp1_double,temp2_double);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                            ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double),
+                                ABS(1-temp2_double/temp1_double));
+                        }
+                        nfound++;
+                    }
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(long double);
+            mem2+=sizeof(long double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else if ( options->d && options->p)
+    {
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(long double));
+            HDmemcpy(&temp2_double, mem2, sizeof(long double));
+
+            /*-------------------------------------------------------------------------
+            * detect NaNs
+            *-------------------------------------------------------------------------
+            */
+            if ( options->do_nans )
+            {
+                isnan1 = my_isnan(FLT_LDOUBLE,&temp1_double);
+                isnan2 = my_isnan(FLT_LDOUBLE,&temp2_double);
+            }
+
+            /* both not NaN, do the comparison */
+            if ( !isnan1 && !isnan2)
+            {
+
+                PER(temp1_double,temp2_double);
+
+                if (not_comparable && !both_zero) /* not comparable */
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(F_FORMAT_P_NOTCOMP,temp1_double,temp2_double,
+                            ABS(temp1_double-temp2_double));
+                    }
+                    nfound++;
+                }
+
+                else
+
+                    if ( per > options->percent && ABS(temp1_double-temp2_double) > options->delta )
+                    {
+                        if ( print_data(options) )
+                        {
+                            print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                            parallel_print(SPACES);
+                            parallel_print(F_FORMAT_P,temp1_double,temp2_double,
+                                ABS(temp1_double-temp2_double),
+                                ABS(1-temp2_double/temp1_double));
+                        }
+                        nfound++;
+                    }
+
+            }
+            /* only one is NaN, assume difference */
+            else if ((isnan1 && !isnan2)  || (!isnan1 && isnan2))
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+
+            }
+            mem1+=sizeof(long double);
+            mem2+=sizeof(long double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* i */
+    }
+
+ /*-------------------------------------------------------------------------
+  * no -d and -p
+  *-------------------------------------------------------------------------
+  */
+    else
+    {
+
+
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_double, mem1, sizeof(long double));
+            HDmemcpy(&temp2_double, mem2, sizeof(long double));
+
+
+            if (equal_ldouble(temp1_double,temp2_double,options)==FALSE)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(F_FORMAT,temp1_double,temp2_double,ABS(temp1_double-temp2_double));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(long double);
+            mem2+=sizeof(long double);
+            if (options->n && nfound>=options->count)
+                return nfound;
+
+        } /* nelmts */
+
+
+
+
+
+    }
+
+    return nfound;
+}
+#endif /* H5_SIZEOF_LONG_DOUBLE */
+
+
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_schar
+ *
+ * Purpose: diff a H5T_NATIVE_SCHAR type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_schar(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+ hsize_t     nfound=0;          /* number of differences found */
+ char        temp1_char;
+ char        temp2_char;
+ hsize_t     i;
+ double      per;
+ hbool_t     both_zero;
+
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_char, mem1, sizeof(char));
+         HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+         if (ABS(temp1_char-temp2_char) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(char);
+         mem2+=sizeof(char);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_char, mem1, sizeof(char));
+         HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+         PER(temp1_char,temp2_char);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
+                     ABS(temp1_char-temp2_char));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_char,temp2_char,
+                         ABS(temp1_char-temp2_char),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(char);
+             mem2+=sizeof(char);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_char, mem1, sizeof(char));
+         HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+         PER(temp1_char,temp2_char);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
+                     ABS(temp1_char-temp2_char));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && ABS(temp1_char-temp2_char) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_char,temp2_char,
+                         ABS(temp1_char-temp2_char),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(char);
+             mem2+=sizeof(char);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_char, mem1, sizeof(char));
+         HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+         if (temp1_char != temp2_char)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(char);
+         mem2+=sizeof(char);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_uchar
+ *
+ * Purpose: diff a H5T_NATIVE_UCHAR type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_uchar(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+ hsize_t       nfound=0;          /* number of differences found */
+ unsigned char temp1_uchar;
+ unsigned char temp2_uchar;
+ hsize_t       i;
+ double        per;
+ hbool_t       both_zero;
+
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+         if ( PDIFF(temp1_uchar,temp2_uchar) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(unsigned char);
+         mem2+=sizeof(unsigned char);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+         PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
+                     PDIFF(temp1_uchar,temp2_uchar));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
+                         PDIFF(temp1_uchar,temp2_uchar),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned char);
+             mem2+=sizeof(unsigned char);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+         PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
+                     PDIFF(temp1_uchar,temp2_uchar));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && PDIFF(temp1_uchar,temp2_uchar) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
+                         PDIFF(temp1_uchar,temp2_uchar),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned char);
+             mem2+=sizeof(unsigned char);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+         if (temp1_uchar != temp2_uchar)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(unsigned char);
+         mem2+=sizeof(unsigned char);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: diff_short
+ *
+ * Purpose: diff a H5T_NATIVE_SHORT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_short(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+ hsize_t       nfound=0;          /* number of differences found */
+ short         temp1_short;
+ short         temp2_short;
+ hsize_t       i;
+ double        per;
+ hbool_t       both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_short, mem1, sizeof(short));
+         HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+         if (ABS(temp1_short-temp2_short) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(short);
+         mem2+=sizeof(short);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_short, mem1, sizeof(short));
+         HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+         PER(temp1_short,temp2_short);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
+                     ABS(temp1_short-temp2_short));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_short,temp2_short,
+                         ABS(temp1_short-temp2_short),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(short);
+             mem2+=sizeof(short);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_short, mem1, sizeof(short));
+         HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+         PER(temp1_short,temp2_short);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
+                     ABS(temp1_short-temp2_short));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && ABS(temp1_short-temp2_short) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_short,temp2_short,
+                         ABS(temp1_short-temp2_short),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(short);
+             mem2+=sizeof(short);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_short, mem1, sizeof(short));
+         HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+         if (temp1_short != temp2_short)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(short);
+         mem2+=sizeof(short);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_ushort
+ *
+ * Purpose: diff a H5T_NATIVE_USHORT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_ushort(unsigned char *mem1,
+                    unsigned char *mem2,
+                    hsize_t       nelmts,
+                    hsize_t       hyper_start,
+                    int           rank,
+                    hsize_t       *dims,
+                    hsize_t       *acc,
+                    hsize_t       *pos,
+                    diff_opt_t    *options,
+                    const char    *obj1,
+                    const char    *obj2,
+                    int           *ph)
+
+{
+ hsize_t        nfound=0;          /* number of differences found */
+ unsigned short temp1_ushort;
+ unsigned short temp2_ushort;
+ hsize_t        i;
+ double         per;
+ hbool_t        both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+         if ( PDIFF(temp1_ushort,temp2_ushort) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(unsigned short);
+         mem2+=sizeof(unsigned short);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+         PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
+                     PDIFF(temp1_ushort,temp2_ushort));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
+                         PDIFF(temp1_ushort,temp2_ushort),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned short);
+             mem2+=sizeof(unsigned short);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+         PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
+                     PDIFF(temp1_ushort,temp2_ushort));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && PDIFF(temp1_ushort,temp2_ushort) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
+                         PDIFF(temp1_ushort,temp2_ushort),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned short);
+             mem2+=sizeof(unsigned short);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+         if (temp1_ushort != temp2_ushort)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(unsigned short);
+         mem2+=sizeof(unsigned short);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_int
+ *
+ * Purpose: diff a H5T_NATIVE_INT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_int(unsigned char *mem1,
+                 unsigned char *mem2,
+                 hsize_t       nelmts,
+                 hsize_t       hyper_start,
+                 int           rank,
+                 hsize_t       *dims,
+                 hsize_t       *acc,
+                 hsize_t       *pos,
+                 diff_opt_t    *options,
+                 const char    *obj1,
+                 const char    *obj2,
+                 int           *ph)
+
+{
+ hsize_t       nfound=0;          /* number of differences found */
+ int           temp1_int;
+ int           temp2_int;
+ hsize_t       i;
+ double        per;
+ hbool_t       both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_int, mem1, sizeof(int));
+         HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+         if (ABS(temp1_int-temp2_int) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(int);
+         mem2+=sizeof(int);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_int, mem1, sizeof(int));
+         HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+         PER(temp1_int,temp2_int);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
+                     ABS(temp1_int-temp2_int));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_int,temp2_int,
+                         ABS(temp1_int-temp2_int),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(int);
+             mem2+=sizeof(int);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_int, mem1, sizeof(int));
+         HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+         PER(temp1_int,temp2_int);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
+                     ABS(temp1_int-temp2_int));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && ABS(temp1_int-temp2_int) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_int,temp2_int,
+                         ABS(temp1_int-temp2_int),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(int);
+             mem2+=sizeof(int);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_int, mem1, sizeof(int));
+         HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+         if (temp1_int != temp2_int)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(int);
+         mem2+=sizeof(int);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_uint
+ *
+ * Purpose: diff a H5T_NATIVE_UINT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_uint(unsigned char *mem1,
+                  unsigned char *mem2,
+                  hsize_t       nelmts,
+                  hsize_t       hyper_start,
+                  int           rank,
+                  hsize_t       *dims,
+                  hsize_t       *acc,
+                  hsize_t       *pos,
+                  diff_opt_t    *options,
+                  const char    *obj1,
+                  const char    *obj2,
+                  int           *ph)
+
+{
+ hsize_t        nfound=0;          /* number of differences found */
+ unsigned int   temp1_uint;
+ unsigned int   temp2_uint;
+ hsize_t        i;
+ double         per;
+ hbool_t        both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+         if ( PDIFF(temp1_uint,temp2_uint) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(unsigned int);
+         mem2+=sizeof(unsigned int);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+         PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
+                         PDIFF(temp1_uint,temp2_uint),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned int);
+             mem2+=sizeof(unsigned int);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+         PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && PDIFF(temp1_uint,temp2_uint) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
+                         PDIFF(temp1_uint,temp2_uint),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned int);
+             mem2+=sizeof(unsigned int);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+         if (temp1_uint != temp2_uint)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(unsigned int);
+         mem2+=sizeof(unsigned int);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_long
+ *
+ * Purpose: diff a H5T_NATIVE_LONG type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_long(unsigned char *mem1,
+                  unsigned char *mem2,
+                  hsize_t       nelmts,
+                  hsize_t       hyper_start,
+                  int           rank,
+                  hsize_t       *dims,
+                  hsize_t       *acc,
+                  hsize_t       *pos,
+                  diff_opt_t    *options,
+                  const char    *obj1,
+                  const char    *obj2,
+                  int           *ph)
+
+{
+ hsize_t       nfound=0;          /* number of differences found */
+ long          temp1_long;
+ long          temp2_long;
+ hsize_t       i;
+ double        per;
+ hbool_t       both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+
+         for ( i = 0; i < nelmts; i++)
+         {
+             HDmemcpy(&temp1_long, mem1, sizeof(long));
+             HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+             if (ABS(temp1_long-temp2_long) > options->delta)
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(long);
+             mem2+=sizeof(long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+         }
+     }
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_long, mem1, sizeof(long));
+         HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+         PER(temp1_long,temp2_long);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
+                     ABS(temp1_long-temp2_long));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
+                         ABS(temp1_long-temp2_long),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(long);
+             mem2+=sizeof(long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_long, mem1, sizeof(long));
+         HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+         PER(temp1_long,temp2_long);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
+                     ABS(temp1_long-temp2_long));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && ABS(temp1_long-temp2_long) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
+                         ABS(temp1_long-temp2_long),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(long);
+             mem2+=sizeof(long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_long, mem1, sizeof(long));
+         HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+         if (temp1_long != temp2_long)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(long);
+         mem2+=sizeof(long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_ulong
+ *
+ * Purpose: diff a H5T_NATIVE_ULONG type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_ulong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+ hsize_t        nfound=0;          /* number of differences found */
+ unsigned long  temp1_ulong;
+ unsigned long  temp2_ulong;
+ hsize_t        i;
+ double         per;
+ hbool_t        both_zero;
+
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+
+         for ( i = 0; i < nelmts; i++)
+         {
+             HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+             HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+             if ( PDIFF(temp1_ulong,temp2_ulong) > options->delta)
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned long);
+             mem2+=sizeof(unsigned long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+         }
+
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+         PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
+                         PDIFF(temp1_ulong,temp2_ulong),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned long);
+             mem2+=sizeof(unsigned long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+         PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && PDIFF(temp1_ulong,temp2_ulong) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
+                         PDIFF(temp1_ulong,temp2_ulong),
+                         per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned long);
+             mem2+=sizeof(unsigned long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+         if (temp1_ulong != temp2_ulong)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(unsigned long);
+         mem2+=sizeof(unsigned long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_llong
+ *
+ * Purpose: diff a H5T_NATIVE_LLONG type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_llong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+ hsize_t       nfound=0;          /* number of differences found */
+ long long     temp1_llong;
+ long long     temp2_llong;
+ hsize_t       i;
+ double        per;
+ hbool_t       both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+
+         if (ABS( temp1_llong-temp2_llong) > options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(long long);
+         mem2+=sizeof(long long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+
+         PER(temp1_llong,temp2_llong);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(long long);
+             mem2+=sizeof(long long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+
+         PER(temp1_llong,temp2_llong);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && ABS(temp1_llong-temp2_llong) > options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(long long);
+             mem2+=sizeof(long long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+
+         if (temp1_llong != temp2_llong)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(long long);
+         mem2+=sizeof(long long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_ullong
+ *
+ * Purpose: diff a H5T_NATIVE_ULLONG type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_ullong(unsigned char *mem1,
+                    unsigned char *mem2,
+                    hsize_t       nelmts,
+                    hsize_t       hyper_start,
+                    int           rank,
+                    hsize_t       *dims,
+                    hsize_t       *acc,
+                    hsize_t       *pos,
+                    diff_opt_t    *options,
+                    const char    *obj1,
+                    const char    *obj2,
+                    int           *ph)
+
+{
+ hsize_t             nfound=0;          /* number of differences found */
+ unsigned long long  temp1_ullong;
+ unsigned long long  temp2_ullong;
+ hsize_t             i;
+ float               f1, f2;
+ double              per;
+ hbool_t             both_zero;
+
+ /* -d and !-p */
+ if (options->d && !options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+         if ( PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long) options->delta)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+             }
+             nfound++;
+         }
+         mem1+=sizeof(unsigned long long);
+         mem2+=sizeof(unsigned long long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     }
+
+ }
+
+ /* !-d and -p */
+ else if (!options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+         ull2float(temp1_ullong,&f1);
+         ull2float(temp2_ullong,&f2);
+         PER(f1,f2);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned long long);
+             mem2+=sizeof(unsigned long long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+
+ }
+
+ /* -d and -p */
+ else if ( options->d && options->p)
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+         ull2float(temp1_ullong,&f1);
+         ull2float(temp2_ullong,&f2);
+         PER(f1,f2);
+
+         if (not_comparable && !both_zero) /* not comparable */
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+             }
+             nfound++;
+         }
+
+         else
+
+             if ( per > options->percent && PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta )
+             {
+                 if ( print_data(options) )
+                 {
+                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                     parallel_print(SPACES);
+                     parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                 }
+                 nfound++;
+             }
+             mem1+=sizeof(unsigned long long);
+             mem2+=sizeof(unsigned long long);
+             if (options->n && nfound>=options->count)
+                 return nfound;
+     }
+
+ }
+ else
+ {
+
+     for ( i = 0; i < nelmts; i++)
+     {
+         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+         if (temp1_ullong != temp2_ullong)
+         {
+             if ( print_data(options) )
+             {
+                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                 parallel_print(SPACES);
+                 parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+             }
+             nfound++;
+         }
+
+         mem1+=sizeof(unsigned long long);
+         mem2+=sizeof(unsigned long long);
+         if (options->n && nfound>=options->count)
+             return nfound;
+     } /* nelmts */
+
+ }
+
+ return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ull2float
+ *
+ * Purpose:     convert unsigned long long to float
+ *
+ * Programmer:  pvn
+ *              Mar 22, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int ull2float(unsigned long long ull_value, float *f_value)
+{
+ hid_t          dxpl_id;
+ unsigned char  *buf = NULL;
+ size_t         src_size;
+ size_t         dst_size;
+
+ if((dxpl_id = H5Pcreate(H5P_DATASET_XFER))<0)
+  goto error;
+
+ src_size = H5Tget_size(H5T_NATIVE_ULLONG);
+ dst_size = H5Tget_size(H5T_NATIVE_FLOAT);
+ buf = (unsigned char*)HDcalloc((size_t)1, MAX(src_size, dst_size));
+ if(!buf)
+  goto error;
+
+ HDmemcpy(buf, &ull_value, src_size);
+
+ /* do conversion */
+ if(H5Tconvert(H5T_NATIVE_ULLONG, H5T_NATIVE_FLOAT, (size_t)1, buf, NULL, dxpl_id)<0)
+  goto error;
+
+ HDmemcpy(f_value, buf, dst_size);
+
+ if(buf)
+     HDfree(buf);
+
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+  H5Pclose(dxpl_id);
+ } H5E_END_TRY;
+ if(buf)
+     HDfree(buf);
+
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    equal_double
+ *
+ * Purpose:     use a absolute error formula to deal with floating point
+ *              uncertainty
+ *
+ * Modifications:
+ *  8/1/2007. handle NaNs
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+hbool_t equal_double(double value, double expected, diff_opt_t *options)
+{
+    if ( options->do_nans )
+    {
+
+        /*-------------------------------------------------------------------------
+        * detect NaNs
+        *-------------------------------------------------------------------------
+        */
+        hbool_t isnan1 = my_isnan(FLT_DOUBLE,&value);
+        hbool_t isnan2 = my_isnan(FLT_DOUBLE,&expected);
+
+        /*-------------------------------------------------------------------------
+        * we consider NaN == NaN to be true
+        *-------------------------------------------------------------------------
+        */
+        if ( isnan1 && isnan2 )
+        {
+            return TRUE;
+        }
+
+        /*-------------------------------------------------------------------------
+        * one is a NaN, do not compare but assume difference
+        *-------------------------------------------------------------------------
+        */
+        if ( (isnan1 && !isnan2) || ( !isnan1 && isnan2 ) )
+        {
+            return FALSE;
+        }
+    }
+
+    if (value == expected)
+        return TRUE;
+
+    if (options->use_system_epsilon) {
+        if ( ABS( (value-expected) ) < DBL_EPSILON)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    equal_ldouble
+ *
+ * Purpose:     use a absolute error formula to deal with floating point
+ *              uncertainty
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+static
+hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *options)
+{
+    if ( options->do_nans )
+    {
+
+        /*-------------------------------------------------------------------------
+        * detect NaNs
+        *-------------------------------------------------------------------------
+        */
+        hbool_t isnan1 = my_isnan(FLT_LDOUBLE,&value);
+        hbool_t isnan2 = my_isnan(FLT_LDOUBLE,&expected);
+
+        /*-------------------------------------------------------------------------
+        * we consider NaN == NaN to be true
+        *-------------------------------------------------------------------------
+        */
+        if ( isnan1 && isnan2 )
+        {
+            return TRUE;
+        }
+
+        /*-------------------------------------------------------------------------
+        * one is a NaN, do not compare but assume difference
+        *-------------------------------------------------------------------------
+        */
+        if ( (isnan1 && !isnan2) || ( !isnan1 && isnan2 ) )
+        {
+            return FALSE;
+        }
+    }
+
+    if (value == expected)
+        return TRUE;
+
+    if (options->use_system_epsilon) {
+        if ( ABS( (value-expected) ) < DBL_EPSILON)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+#endif /* #if H5_SIZEOF_LONG_DOUBLE !=0 */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    equal_float
+ *
+ * Purpose:     use a absolute error formula to deal with floating point
+ *              uncertainty
+ *
+ * Modifications:
+ *  8/1/2007. handle NaNs
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+hbool_t equal_float(float value, float expected, diff_opt_t *options)
+{
+    if ( options->do_nans )
+    {
+
+        /*-------------------------------------------------------------------------
+        * detect NaNs
+        *-------------------------------------------------------------------------
+        */
+        hbool_t isnan1 = my_isnan(FLT_FLOAT,&value);
+        hbool_t isnan2 = my_isnan(FLT_FLOAT,&expected);
+
+        /*-------------------------------------------------------------------------
+        * we consider NaN == NaN to be true
+        *-------------------------------------------------------------------------
+        */
+        if ( isnan1 && isnan2 )
+        {
+            return TRUE;
+        }
+
+        /*-------------------------------------------------------------------------
+        * one is a NaN, do not compare but assume difference
+        *-------------------------------------------------------------------------
+        */
+        if ( (isnan1 && !isnan2) || ( !isnan1 && isnan2 ) )
+        {
+            return FALSE;
+        }
+    }
+
+    if (value == expected)
+        return TRUE;
+
+    if (options->use_system_epsilon) {
+        if ( ABS( (value-expected) ) < FLT_EPSILON)
+            return TRUE;
+    }
+
+    return FALSE;
+
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function:  my_isnan
+ *
+ * Purpose:  Determines whether VAL points to NaN.
+ *
+ * Return:  TRUE or FALSE
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, July  6, 1998
+ *
+ * Modifications:
+ *  Pedro Vicente, 12 October 2007.
+ *  Add a string detection type for WIN32
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+my_isnan(dtype_t type, void *val)
+{
+    hbool_t retval = FALSE;
+    char s[256];
+
+    if (FLT_FLOAT==type)
+    {
+        float x;
+
+        HDmemcpy(&x, val, sizeof(float));
+        retval = (x!=x);
+    }
+    else if (FLT_DOUBLE==type)
+    {
+        double x;
+
+        HDmemcpy(&x, val, sizeof(double));
+        retval = (x!=x);
+    }
+#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0
+    else if (FLT_LDOUBLE==type)
+    {
+        long double x;
+
+        HDmemcpy(&x, val, sizeof(long double));
+        retval = (x!=x);
+    }
+#endif
+    else
+    {
+        return FALSE;
+    }
+
+   /*
+    * Sometimes NaN==NaN (e.g., DEC Alpha) so we try to print it and see if
+    * the result contains a NaN string.
+    */
+    if (!retval)
+    {
+        if (FLT_FLOAT==type)
+        {
+            float x;
+
+            HDmemcpy(&x, val, sizeof(float));
+            HDsnprintf(s, sizeof(s), "%g", (double)x);
+        }
+        else if (FLT_DOUBLE==type)
+        {
+            double x;
+
+            HDmemcpy(&x, val, sizeof(double));
+            HDsnprintf(s, sizeof(s), "%g", x);
+        }
+#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0
+        else if (FLT_LDOUBLE==type)
+        {
+            long double x;
+
+            HDmemcpy(&x, val, sizeof(long double));
+            HDsnprintf(s, sizeof(s), "%Lg", x);
+        }
+#endif
+        else
+        {
+            return FALSE;
+        }
+
+        if ( HDstrstr(s, "NaN") ||
+             HDstrstr(s, "NAN") ||
+             HDstrstr(s, "nan") ||
+             HDstrstr(s, "-1.#IND") /* WIN32 */
+           )
+        {
+            retval = TRUE;
+        }
+    }
+
+
+    return retval;
+}
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Local functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: print_data
+ *
+ * Purpose: print data only in report or verbose modes, and do not print in quiet mode
+ *-------------------------------------------------------------------------
+ */
+static
+int print_data(diff_opt_t *options)
+{
+    return ( (options->m_report || options->m_verbose) && !options->m_quiet)?1:0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_header
+ *
+ * Purpose: print header for difference
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+void print_header(int        pp,        /* print percentage */
+                int        rank,
+                hsize_t    *dims,
+                const char *obj1,
+                const char *obj2 )
+{
+    /* print header */
+    parallel_print("%-16s","size:");
+    print_dimensions (rank,dims);
+    parallel_print("%-11s","");
+    print_dimensions (rank,dims);
+    parallel_print("\n");
+
+    if(pp) {
+        parallel_print("%-15s %-15s %-15s %-15s %-15s\n",
+            "position",
+            (obj1!=NULL) ? obj1 : " ",
+            (obj2!=NULL) ? obj2 : " ",
+            "difference",
+            "relative");
+        parallel_print("------------------------------------------------------------------------\n");
+    }
+    else {
+        parallel_print("%-15s %-15s %-15s %-20s\n",
+            "position",
+            (obj1!=NULL) ? obj1 : " ",
+            (obj2!=NULL) ? obj2 : " ",
+            "difference");
+        parallel_print("------------------------------------------------------------\n");
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_pos
+ *
+ * Purpose: print in matrix notation, converting from an array index position
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+void print_pos( int        *ph,       /* print header */
+                int        pp,        /* print percentage */
+                hsize_t    curr_pos,
+                hsize_t    *acc,
+                hsize_t    *pos,
+                int        rank,
+                hsize_t    *dims,
+                const char *obj1,
+                const char *obj2 )
+{
+    int i;
+
+    /* print header */
+    if ( *ph==1 )
+    {
+        *ph=0;
+
+        print_header(pp, rank, dims, obj1, obj2);
+    } /* end print header */
+
+    for ( i = 0; i < rank; i++)
+    {
+        pos[i] = curr_pos/acc[i];
+        curr_pos -= acc[i]*pos[i];
+    }
+    HDassert( curr_pos == 0 );
+
+    if ( rank > 0 )
+    {
+        parallel_print("[ " );
+        for ( i = 0; i < rank; i++)
+        {
+            parallel_print(HSIZE_T_FORMAT, (unsigned long long)pos[i]);
+            parallel_print(" ");
+        }
+        parallel_print("]" );
+    }
+    else
+    {
+     parallel_print("      ");
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_char_pos
+ *
+ * Purpose: print character position in string
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+void print_char_pos( int        *ph,       /* print header */
+                     int        pp,        /* print percentage */
+                     hsize_t    curr_pos,
+                     unsigned   u,
+                     hsize_t    *acc,
+                     hsize_t    *pos,
+                     int        rank,
+                     hsize_t    *dims,
+                     const char *obj1,
+                     const char *obj2 )
+{
+    int i;
+
+    /* print header */
+    if ( *ph==1 )
+    {
+        *ph=0;
+
+        print_header(pp, rank, dims, obj1, obj2);
+    } /* end print header */
+
+    for ( i = 0; i < rank; i++)
+    {
+        pos[i] = curr_pos/acc[i];
+        curr_pos -= acc[i]*pos[i];
+    }
+    HDassert( curr_pos == 0 );
+
+    parallel_print("[ " );
+    if ( rank > 0 )
+    {
+
+        for ( i = 0; i < rank; i++)
+        {
+            parallel_print(HSIZE_T_FORMAT, (unsigned long long)pos[i]);
+            parallel_print(" ");
+        }
+
+    }
+    else
+    {
+        parallel_print("%u", (unsigned)u);
+    }
+    parallel_print("]" );
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5diff_print_char. Adapted from h5tools_print_char
+ *
+ * Purpose: Print a char
+ *
+ *-------------------------------------------------------------------------
+ */
+static void h5diff_print_char(char ch)
+{
+
+    switch (ch)
+    {
+    case '"':
+        parallel_print("\\\"");
+        break;
+    case '\\':
+        parallel_print( "\\\\");
+        break;
+    case '\b':
+        parallel_print("\\b");
+        break;
+    case '\f':
+        parallel_print("\\f");
+        break;
+    case '\n':
+        parallel_print("\\n");
+        break;
+    case '\r':
+        parallel_print("\\r");
+        break;
+    case '\t':
+        parallel_print("\\t");
+        break;
+    default:
+        if (isprint(ch))
+            parallel_print( "%c", ch);
+        else
+            parallel_print( "\\%03o", ch);
+
+        break;
+    }
+}
+
+
+/*-------------------------------------------------------------------------
+ * XCAO, 11/10/2010
+ * added to improve performance for compound datasets
+ * set up compound datatype structures.
+ */
+static void get_member_types(hid_t tid, mcomp_t *members)
+{
+    int tclass;
+    unsigned u;
+
+    if (tid <=0 || !members)
+        return;
+
+    tclass = H5Tget_class(tid);
+    if (tclass == H5T_ARRAY || tclass == H5T_VLEN)
+    {
+        hid_t base_tid = H5Tget_super(tid);
+        get_member_types(base_tid, members);
+        H5Tclose(base_tid);
+    } 
+    else if (tclass == H5T_COMPOUND) 
+    {
+        int      nmembs;
+
+        nmembs = H5Tget_nmembers(tid);
+        if(nmembs <= 0)
+            return;
+        members->n = (unsigned)nmembs;
+
+        members->ids = (hid_t *)HDcalloc((size_t)members->n, sizeof(hid_t));
+        members->offsets = (size_t *)HDcalloc((size_t)members->n, sizeof(size_t));
+        members->m = (mcomp_t **)HDcalloc((size_t)members->n, sizeof(mcomp_t *));
+
+        for(u = 0; u < members->n; u++)
+        {
+             members->ids[u] = H5Tget_member_type( tid, u );
+             members->offsets[u] = H5Tget_member_offset( tid, u );
+             members->m[u] = (mcomp_t *)HDmalloc(sizeof(mcomp_t));
+             HDmemset(members->m[u], 0, sizeof(mcomp_t));
+             get_member_types(members->ids[u], members->m[u]);
+        }  
+    }
+     
+   return;
+
+
+}
+
+/*-------------------------------------------------------------------------
+ * XCAO, 11/10/2010
+ * added to improve performance for compound datasets
+ * clean and close compound members.
+ */
+static void close_member_types(mcomp_t *members)
+{
+    unsigned u;
+
+    if (!members || members->n<=0 || !members->ids)
+        return;
+
+    for(u = 0; u < members->n; u++)
+    {
+        if(members->m[u])
+        {
+            close_member_types(members->m[u]);
+            HDfree(members->m[u]);
+        }
+        H5Tclose(members->ids[u]);
+    }
+
+    HDfree(members->m);
+    HDfree(members->ids);
+    HDfree(members->offsets);
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff_attr.c b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_attr.c
new file mode 100644
index 0000000..c3c9269
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_attr.c
@@ -0,0 +1,599 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5diff.h"
+
+#define ATTR_NAME_MAX 255
+
+typedef struct table_attr_t {
+    char      *name;
+    unsigned   exist[2];
+} match_attr_t;
+
+typedef struct table_attrs_t {
+    size_t      size;
+    size_t      nattrs;
+    size_t      nattrs_only1;
+    size_t      nattrs_only2;
+    match_attr_t *attrs;
+} table_attrs_t;
+
+
+/*-------------------------------------------------------------------------
+ * Function: table_attrs_init
+ *
+ * Purpose: Initialize the table
+ *
+ * Parameter:
+ *  - tbl [OUT]
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: March 15, 2011
+ *------------------------------------------------------------------------*/
+static void table_attrs_init(table_attrs_t **tbl)
+{
+    table_attrs_t* table_attrs = (table_attrs_t*) HDmalloc(sizeof(table_attrs_t));
+
+    table_attrs->size = 0;
+    table_attrs->nattrs = 0;
+    table_attrs->nattrs_only1 = 0;
+    table_attrs->nattrs_only2 = 0;
+    table_attrs->attrs = NULL;
+
+    *tbl = table_attrs;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: table_attrs_free
+ *
+ * Purpose: free given table
+ *
+ * Parameter:
+ *  - table [IN]
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: March 15, 2011
+ *------------------------------------------------------------------------*/
+static void table_attrs_free( table_attrs_t *table )
+{
+    unsigned int i;
+
+    if (table) {
+        if (table->attrs) {
+            for (i = 0; i < table->nattrs; i++) {
+                if (table->attrs[i].name) {
+                    HDfree(table->attrs[i].name);
+                }
+            } /* end for */
+            HDfree(table->attrs);
+            table->attrs = NULL;
+        } /* end if */
+        HDfree(table);
+        table = NULL;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: table_attr_mark_exist
+ *
+ * Purpose: mark given attribute name to table as sign of exsit
+ *
+ * Parameter:
+ *  - exist [IN]
+ *  - name [IN]  : attribute name
+ *  - table [OUT]
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: March 15, 2011
+ *------------------------------------------------------------------------*/
+static void table_attr_mark_exist(unsigned *exist, char *name, table_attrs_t *table)
+{
+    size_t curr_val;
+
+    match_attr_t *new_attrs;
+
+    if(table->nattrs == table->size) {
+        table->size = MAX(1, table->size * 2);
+        new_attrs = (match_attr_t *)HDrealloc(table->attrs, table->size * sizeof(match_attr_t));
+        if(new_attrs)
+            table->attrs = new_attrs;
+    } /* end if */
+
+    if(table->nattrs < table->size) {
+        curr_val = table->nattrs;
+        table->attrs[curr_val].exist[0] = exist[0];
+        table->attrs[curr_val].exist[1] = exist[1];
+        if(name)
+            table->attrs[curr_val].name = (char *)HDstrdup(name);
+        table->nattrs++;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: build_match_list_attrs
+ *
+ * Purpose: get list of matching attribute name from obj1 and obj2
+ *
+ * Note:
+ *  Find common attribute; the algorithm for search is referred from
+ *  build_match_list() in h5diff.c .
+ *
+ * Parameter:
+ *  table_out [OUT] : return the list
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: March 15, 2011
+ *------------------------------------------------------------------------*/
+static herr_t build_match_list_attrs(hid_t loc1_id, hid_t loc2_id, table_attrs_t ** table_out,  diff_opt_t *options)
+{
+    H5O_info_t oinfo1, oinfo2;  /* Object info */
+    hid_t      attr1_id=-1;     /* attr ID */
+    hid_t      attr2_id=-1;     /* attr ID */
+    size_t curr1 = 0;
+    size_t curr2 = 0;
+    unsigned infile[2];
+    char  name1[ATTR_NAME_MAX];
+    char  name2[ATTR_NAME_MAX];
+    int cmp;
+    unsigned i;
+    table_attrs_t *table_lp = NULL;
+
+    if(H5Oget_info(loc1_id, &oinfo1) < 0)
+        goto error;
+    if(H5Oget_info(loc2_id, &oinfo2) < 0)
+        goto error;
+
+    table_attrs_init( &table_lp );
+
+
+    /*--------------------------------------------------
+     * build the list
+     */
+    while (curr1 < oinfo1.num_attrs && curr2 < oinfo2.num_attrs) {
+        /*------------------
+        * open attribute1 */
+        if ((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC,
+                (hsize_t) curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+        /* get name */
+        if (H5Aget_name(attr1_id, (size_t) ATTR_NAME_MAX, name1) < 0)
+            goto error;
+
+        /*------------------
+        * open attribute2 */
+        if ((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC,
+                (hsize_t) curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+        /* get name */
+        if (H5Aget_name(attr2_id, (size_t) ATTR_NAME_MAX, name2) < 0)
+            goto error;
+
+        /* criteria is string compare */
+        cmp = HDstrcmp(name1, name2);
+
+        if (cmp == 0) {
+            infile[0] = 1;
+            infile[1] = 1;
+            table_attr_mark_exist(infile, name1, table_lp);
+            curr1++;
+            curr2++;
+        }
+        else if (cmp < 0) {
+            infile[0] = 1;
+            infile[1] = 0;
+            table_attr_mark_exist(infile, name1, table_lp);
+            table_lp->nattrs_only1++;
+            curr1++;
+        }
+        else {
+            infile[0] = 0;
+            infile[1] = 1;
+            table_attr_mark_exist(infile, name2, table_lp);
+            table_lp->nattrs_only2++;
+            curr2++;
+        }
+
+        /* close for next turn */
+        H5Aclose(attr1_id);
+        attr1_id = -1;
+        H5Aclose(attr2_id);
+        attr2_id = -1;
+    } /* end while */
+
+    /* list1 did not end */
+    infile[0] = 1;
+    infile[1] = 0;
+    while (curr1 < oinfo1.num_attrs) {
+        /*------------------
+        * open attribute1 */
+        if ((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC,
+                (hsize_t) curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+        /* get name */
+        if (H5Aget_name(attr1_id, (size_t) ATTR_NAME_MAX, name1) < 0)
+            goto error;
+
+        table_attr_mark_exist(infile, name1, table_lp);
+        table_lp->nattrs_only1++;
+        curr1++;
+
+        /* close for next turn */
+        H5Aclose(attr1_id);
+        attr1_id = -1;
+    }
+
+    /* list2 did not end */
+    infile[0] = 0;
+    infile[1] = 1;
+    while (curr2 < oinfo2.num_attrs) {
+        /*------------------
+        * open attribute2 */
+        if ((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC,
+                (hsize_t) curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+        /* get name */
+        if (H5Aget_name(attr2_id, (size_t) ATTR_NAME_MAX, name2) < 0)
+            goto error;
+
+        table_attr_mark_exist(infile, name2, table_lp);
+        table_lp->nattrs_only2++;
+        curr2++;
+
+        /* close for next turn */
+        H5Aclose(attr2_id);
+    }
+
+    /*------------------------------------------------------
+     * print the list
+     */
+    if (options->m_verbose_level == 2) {
+        /* if '-v2' is detected */
+        parallel_print("   obj1   obj2\n");
+        parallel_print(" --------------------------------------\n");
+        for (i = 0; i < (unsigned int) table_lp->nattrs; i++) {
+            char c1, c2;
+            c1 = (table_lp->attrs[i].exist[0]) ? 'x' : ' ';
+            c2 = (table_lp->attrs[i].exist[1]) ? 'x' : ' ';
+            parallel_print("%5c %6c    %-15s\n", c1, c2,
+                    table_lp->attrs[i].name);
+        } /* end for */
+    }
+
+    if (options->m_verbose_level >= 1) {
+        parallel_print(
+                "Attributes status:  %d common, %d only in obj1, %d only in obj2\n",
+                table_lp->nattrs - table_lp->nattrs_only1 - table_lp->nattrs_only2,
+                table_lp->nattrs_only1, table_lp->nattrs_only2);
+    }
+
+    *table_out = table_lp;
+
+    return 0;
+
+error:
+    if (0 < attr1_id)
+        H5Aclose(attr1_id);
+    if (0 < attr2_id)
+        H5Aclose(attr2_id);
+
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: diff_attr
+ *
+ * Purpose: compare attributes located in LOC1_ID and LOC2_ID, which are
+ *  obtained either from
+ * loc_id = H5Gopen2(fid, name, H5P_DEFAULT);
+ * loc_id = H5Dopen2(fid, name);
+ * loc_id = H5Topen2(fid, name, H5P_DEFAULT);
+ *
+ * Return: number of differences found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November, 03, 2003
+ *
+ * Modifications:
+ *  March, 02, 2007: return the number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+
+hsize_t diff_attr(hid_t loc1_id,
+                  hid_t loc2_id,
+                  const char *path1,
+                  const char *path2,
+                  diff_opt_t *options)
+{
+    hid_t      attr1_id=-1;     /* attr ID */
+    hid_t      attr2_id=-1;     /* attr ID */
+    hid_t      space1_id=-1;    /* space ID */
+    hid_t      space2_id=-1;    /* space ID */
+    hid_t      ftype1_id=-1;    /* file data type ID */
+    hid_t      ftype2_id=-1;    /* file data type ID */
+    int           vstrtype1=0;     /* ftype1 is a variable string */
+    int           vstrtype2=0;     /* ftype2 is a variable string */
+    hid_t      mtype1_id=-1;    /* memory data type ID */
+    hid_t      mtype2_id=-1;    /* memory data type ID */
+    size_t     msize1;          /* memory size of memory type */
+    size_t     msize2;          /* memory size of memory type */
+    void       *buf1=NULL;      /* data buffer */
+    void       *buf2=NULL;      /* data buffer */
+    int           buf1hasdata=0;    /* buffer has data */
+    int           buf2hasdata=0;    /* buffer has data */
+    hsize_t    nelmts1;         /* number of elements in dataset */
+    int        rank1;           /* rank of dataset */
+    int        rank2;           /* rank of dataset */
+    hsize_t    dims1[H5S_MAX_RANK];/* dimensions of dataset */
+    hsize_t    dims2[H5S_MAX_RANK];/* dimensions of dataset */
+    char       *name1;
+    char       *name2;
+    char       np1[512];
+    char       np2[512];
+    unsigned   u;                  /* Local index variable */
+    hsize_t    nfound = 0;
+    hsize_t    nfound_total = 0;
+    int       j;
+
+    table_attrs_t * match_list_attrs = NULL;
+    if (build_match_list_attrs(loc1_id, loc2_id, &match_list_attrs, options) < 0)
+        goto error;
+
+    /* if detect any unique extra attr */
+    if (match_list_attrs->nattrs_only1 || match_list_attrs->nattrs_only2) {
+        /* exit will be 1 */
+        options->contents = 0;
+    }
+
+    for (u = 0; u < (unsigned) match_list_attrs->nattrs; u++) {
+        if ((match_list_attrs->attrs[u].exist[0]) && (match_list_attrs->attrs[u].exist[1])) {
+            name1 = name2 = match_list_attrs->attrs[u].name;
+
+            /*--------------
+            * attribute 1 */
+            if ((attr1_id = H5Aopen(loc1_id, name1, H5P_DEFAULT)) < 0)
+                goto error;
+
+            /*--------------
+            * attribute 2 */
+            if ((attr2_id = H5Aopen(loc2_id, name2, H5P_DEFAULT)) < 0)
+                goto error;
+
+            /* get the datatypes  */
+            if ((ftype1_id = H5Aget_type(attr1_id)) < 0)
+                goto error;
+            vstrtype1 = H5Tis_variable_str(ftype1_id);
+            if ((ftype2_id = H5Aget_type(attr2_id)) < 0)
+                goto error;
+            vstrtype2 = H5Tis_variable_str(ftype2_id);
+            /* no compare if either one but not both are variable string type */
+            if (vstrtype1 != vstrtype2) {
+                if ((options->m_verbose || options->m_list_not_cmp))
+                    parallel_print("Not comparable: one of attribute <%s/%s> or <%s/%s> is of variable length type\n",
+                            path1, name1, path2, name2);
+                options->not_cmp = 1;
+                if (H5Tclose(ftype1_id) < 0)
+                    goto error;
+                if (H5Tclose(ftype2_id) < 0)
+                    goto error;
+                if (H5Aclose(attr1_id) < 0)
+                    goto error;
+                if (H5Aclose(attr2_id) < 0)
+                    goto error;
+
+                continue;
+            }
+
+            if ((mtype1_id = h5tools_get_native_type(ftype1_id)) < 0)
+                goto error;
+            if ((mtype2_id = h5tools_get_native_type(ftype2_id)) < 0)
+                goto error;
+            if ((msize1 = H5Tget_size(mtype1_id)) == 0)
+                goto error;
+            if ((msize2 = H5Tget_size(mtype2_id)) == 0)
+                goto error;
+
+            /* get the dataspace   */
+            if ((space1_id = H5Aget_space(attr1_id)) < 0)
+                goto error;
+            if ((space2_id = H5Aget_space(attr2_id)) < 0)
+                goto error;
+
+            /* get dimensions  */
+            if ((rank1 = H5Sget_simple_extent_dims(space1_id, dims1, NULL)) < 0)
+                goto error;
+            if ((rank2 = H5Sget_simple_extent_dims(space2_id, dims2, NULL)) < 0)
+                goto error;
+
+            /*----------------------------------------------------------------------
+            * check for comparable TYPE and SPACE
+            *----------------------------------------------------------------------
+            */
+
+            /* pass dims1 and dims2 for maxdims as well since attribute's maxdims
+            * are always same */
+            if (diff_can_type(ftype1_id, ftype2_id, rank1, rank2, dims1, dims2,
+                    dims1, dims2, name1, name2, options, 0) != 1) {
+                if (H5Tclose(ftype1_id) < 0)
+                    goto error;
+                if (H5Tclose(ftype2_id) < 0)
+                    goto error;
+                if (H5Sclose(space1_id) < 0)
+                    goto error;
+                if (H5Sclose(space2_id) < 0)
+                    goto error;
+                if (H5Aclose(attr1_id) < 0)
+                    goto error;
+                if (H5Aclose(attr2_id) < 0)
+                    goto error;
+                if (H5Tclose(mtype1_id) < 0)
+                    goto error;
+                if (H5Tclose(mtype2_id) < 0)
+                    goto error;
+
+                continue;
+            }
+
+            /*-----------------------------------------------------------------
+            * "upgrade" the smaller memory size
+            *------------------------------------------------------------------
+            */
+            if (FAIL == match_up_memsize(ftype1_id, ftype2_id, &mtype1_id,
+                            &mtype2_id, &msize1, &msize2))
+                goto error;
+
+            /*---------------------------------------------------------------------
+            * read
+            *----------------------------------------------------------------------
+            */
+            nelmts1 = 1;
+            for (j = 0; j < rank1; j++)
+                nelmts1 *= dims1[j];
+
+            buf1 = (void *)HDmalloc((size_t)(nelmts1 * msize1));
+            buf2 = (void *)HDmalloc((size_t)(nelmts1 * msize2));
+            if (buf1 == NULL || buf2 == NULL) {
+                parallel_print("cannot read into memory\n");
+                goto error;
+            }
+            if (H5Aread(attr1_id, mtype1_id, buf1) < 0) {
+                parallel_print("Failed reading attribute1 %s/%s\n", path1,
+                        name1);
+                goto error;
+            }
+            else
+                buf1hasdata = 1;
+            if (H5Aread(attr2_id, mtype2_id, buf2) < 0) {
+                parallel_print("Failed reading attribute2 %s/%s\n", path2,
+                        name2);
+                goto error;
+            }
+            else
+                buf2hasdata = 1;
+
+            /* format output string */
+            HDsnprintf(np1, sizeof(np1), "%s of <%s>", name1, path1);
+            HDsnprintf(np2, sizeof(np1), "%s of <%s>", name2, path2);
+
+            /*---------------------------------------------------------------------
+            * array compare
+            *----------------------------------------------------------------------
+            */
+
+            /* always print name */
+            /* verbose (-v) and report (-r) mode */
+            if (options->m_verbose || options->m_report) {
+                do_print_attrname("attribute", np1, np2);
+
+                nfound = diff_array(buf1, buf2, nelmts1, (hsize_t) 0, rank1,
+                        dims1, options, np1, np2, mtype1_id, attr1_id, attr2_id);
+                print_found(nfound);
+            }
+            /* quiet mode (-q), just count differences */
+            else if (options->m_quiet) {
+                nfound = diff_array(buf1, buf2, nelmts1, (hsize_t) 0, rank1,
+                        dims1, options, np1, np2, mtype1_id, attr1_id, attr2_id);
+            }
+            /* the rest (-c, none, ...) */
+            else {
+                nfound = diff_array(buf1, buf2, nelmts1, (hsize_t) 0, rank1,
+                        dims1, options, np1, np2, mtype1_id, attr1_id, attr2_id);
+
+                /* print info if compatible and difference found */
+                if (nfound) {
+                    do_print_attrname("attribute", np1, np2);
+                    print_found(nfound);
+                } /* end if */
+            } /* end else */
+
+            /*----------------------------------------------------------------------
+            * close
+            *----------------------------------------------------------------------
+            */
+
+            /* Free buf1 and buf2, check both VLEN-data VLEN-string to reclaim any
+            * VLEN memory first */
+            if (TRUE == h5tools_detect_vlen(mtype1_id))
+                H5Dvlen_reclaim(mtype1_id, space1_id, H5P_DEFAULT, buf1);
+            HDfree(buf1);
+            buf1 = NULL;
+
+            if (TRUE == h5tools_detect_vlen(mtype2_id))
+                H5Dvlen_reclaim(mtype2_id, space2_id, H5P_DEFAULT, buf2);
+            HDfree(buf2);
+            buf2 = NULL;
+
+            if (H5Tclose(ftype1_id) < 0)
+                goto error;
+            if (H5Tclose(ftype2_id) < 0)
+                goto error;
+            if (H5Sclose(space1_id) < 0)
+                goto error;
+            if (H5Sclose(space2_id) < 0)
+                goto error;
+            if (H5Aclose(attr1_id) < 0)
+                goto error;
+            if (H5Aclose(attr2_id) < 0)
+                goto error;
+            if (H5Tclose(mtype1_id) < 0)
+                goto error;
+            if (H5Tclose(mtype2_id) < 0)
+                goto error;
+
+            nfound_total += nfound;
+        }
+    } /* u */
+
+    table_attrs_free(match_list_attrs);
+
+    return nfound_total;
+
+error:
+    H5E_BEGIN_TRY {
+        if(buf1) {
+            if(buf1hasdata && TRUE == h5tools_detect_vlen(mtype1_id))
+                H5Dvlen_reclaim(mtype1_id, space1_id, H5P_DEFAULT, buf1);
+            HDfree(buf1);
+        } /* end if */
+        if(buf2) {
+            if(buf2hasdata && TRUE == h5tools_detect_vlen(mtype2_id))
+                H5Dvlen_reclaim(mtype2_id, space2_id, H5P_DEFAULT, buf2);
+            HDfree(buf2);
+        } /* end if */
+
+        table_attrs_free(match_list_attrs);
+
+        H5Tclose(ftype1_id);
+        H5Tclose(ftype2_id);
+        H5Tclose(mtype1_id);
+        H5Tclose(mtype2_id);
+        H5Sclose(space1_id);
+        H5Sclose(space2_id);
+        H5Aclose(attr1_id);
+        H5Aclose(attr2_id);
+    } H5E_END_TRY;
+
+    options->err_stat = 1;
+    return nfound_total;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff_dset.c b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_dset.c
new file mode 100644
index 0000000..157978d
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_dset.c
@@ -0,0 +1,953 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+* the files COPYING and Copyright.html.  COPYING can be found at the root   *
+* of the source code distribution tree; Copyright.html can be found at the  *
+* root level of an installed copy of the electronic HDF5 document set and   *
+* is linked from the top-level documents page.  It can also be found at     *
+* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+* access to either file, you may request a copy from help at hdfgroup.org.     *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5diff.h"
+#include "ph5diff.h"
+
+
+/*-------------------------------------------------------------------------
+* Function: diff_dataset
+*
+* Purpose: check for comparable datasets and read into a compatible
+*  memory type
+*
+* Return: Number of differences found
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: May 9, 2003
+*
+*-------------------------------------------------------------------------
+*/
+hsize_t diff_dataset( hid_t file1_id,
+                      hid_t file2_id,
+                      const char *obj1_name,
+                      const char *obj2_name,
+                      diff_opt_t *options)
+{
+    hid_t   did1 = -1;
+    hid_t   did2 = -1;
+    hid_t   dcpl1 = -1;
+    hid_t   dcpl2 = -1;
+    hsize_t nfound = 0;
+
+    /*-------------------------------------------------------------------------
+    * open the handles
+    *-------------------------------------------------------------------------
+    */
+    /* disable error reporting */
+    H5E_BEGIN_TRY
+    {
+        /* Open the datasets */
+        if((did1 = H5Dopen2(file1_id, obj1_name, H5P_DEFAULT)) < 0)
+        {
+            parallel_print("Cannot open dataset <%s>\n", obj1_name);
+            goto error;
+        }
+        if((did2 = H5Dopen2(file2_id, obj2_name, H5P_DEFAULT)) < 0)
+        {
+            parallel_print("Cannot open dataset <%s>\n", obj2_name);
+            goto error;
+        }
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+
+    if((dcpl1 = H5Dget_create_plist(did1)) < 0)
+        goto error;
+    if((dcpl2 = H5Dget_create_plist(did2)) < 0)
+    {
+        goto error;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check if the dataset creation property list has filters that
+    * are not registered in the current configuration
+    * 1) the external filters GZIP and SZIP might not be available
+    * 2) the internal filters might be turned off
+    *-------------------------------------------------------------------------
+    */
+    if ((h5tools_canreadf((options->m_verbose?obj1_name:NULL),dcpl1)==1) &&
+        (h5tools_canreadf((options->m_verbose?obj2_name:NULL),dcpl2)==1))
+    {
+        nfound=diff_datasetid(did1,
+            did2,
+            obj1_name,
+            obj2_name,
+            options);
+    }
+    /*-------------------------------------------------------------------------
+    * close
+    *-------------------------------------------------------------------------
+    */
+    /* disable error reporting */
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl1);
+        H5Pclose(dcpl2);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+
+    return nfound;
+
+error:
+    options->err_stat=1;
+    /* disable error reporting */
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl1);
+        H5Pclose(dcpl2);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+    return nfound;
+}
+
+/*-------------------------------------------------------------------------
+* Function: diff_datasetid
+*
+* Purpose: check for comparable datasets and read into a compatible
+*  memory type
+*
+* Return: Number of differences found
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: May 9, 2003
+*
+* Modifications:
+*
+*
+* October 2006:  Read by hyperslabs for big datasets.
+*
+*  A threshold of H5TOOLS_MALLOCSIZE (128 MB) is the limit upon which I/O hyperslab is done
+*  i.e., if the memory needed to read a dataset is greater than this limit,
+*  then hyperslab I/O is done instead of one operation I/O
+*  For each dataset, the memory needed is calculated according to
+*
+*  memory needed = number of elements * size of each element
+*
+*  if the memory needed is lower than H5TOOLS_MALLOCSIZE, then the following operations
+*  are done
+*
+*  H5Dread( input_dataset1 )
+*  H5Dread( input_dataset2 )
+*
+*  with all elements in the datasets selected. If the memory needed is greater than
+*  H5TOOLS_MALLOCSIZE, then the following operations are done instead:
+*
+*  a strip mine is defined for each dimension k (a strip mine is defined as a
+*  hyperslab whose size is memory manageable) according to the formula
+*
+*  (1) strip_mine_size[k ] = MIN(dimension[k ], H5TOOLS_BUFSIZE / size of memory type)
+*
+*  where H5TOOLS_BUFSIZE is a constant currently defined as 1MB. This formula assures
+*  that for small datasets (small relative to the H5TOOLS_BUFSIZE constant), the strip
+*  mine size k is simply defined as its dimension k, but for larger datasets the
+*  hyperslab size is still memory manageable.
+*  a cycle is done until the number of elements in the dataset is reached. In each
+*  iteration, two parameters are defined for the function H5Sselect_hyperslab,
+*  the start and size of each hyperslab, according to
+*
+*  (2) hyperslab_size [k] = MIN(dimension[k] - hyperslab_offset[k], strip_mine_size [k])
+*
+*  where hyperslab_offset [k] is initially set to zero, and later incremented in
+*  hyperslab_size[k] offsets. The reason for the operation
+*
+*  dimension[k] - hyperslab_offset[k]
+*
+*  in (2) is that, when using the strip mine size, it assures that the "remaining" part
+*  of the dataset that does not fill an entire strip mine is processed.
+*
+*-------------------------------------------------------------------------
+*/
+hsize_t diff_datasetid( hid_t did1,
+                        hid_t did2,
+                        const char *obj1_name,
+                        const char *obj2_name,
+                        diff_opt_t *options)
+{
+    hid_t      sid1=-1;
+    hid_t      sid2=-1;
+    hid_t      f_tid1=-1;
+    hid_t      f_tid2=-1;
+    hid_t      m_tid1=-1;
+    hid_t      m_tid2=-1;
+    size_t     m_size1;
+    size_t     m_size2;
+    H5T_sign_t sign1;
+    H5T_sign_t sign2;
+    int        rank1;
+    int        rank2;
+    hsize_t    nelmts1;
+    hsize_t    nelmts2;
+    hsize_t    dims1[H5S_MAX_RANK];
+    hsize_t    dims2[H5S_MAX_RANK];
+    hsize_t    maxdim1[H5S_MAX_RANK];
+    hsize_t    maxdim2[H5S_MAX_RANK];
+    const char *name1=NULL;            /* relative names */
+    const char *name2=NULL;
+    hsize_t    storage_size1;
+    hsize_t    storage_size2;
+    hsize_t    nfound=0;               /* number of differences found */
+    int        can_compare=1;          /* do diff or not */
+    void       *buf1=NULL;
+    void       *buf2=NULL;
+    void       *sm_buf1=NULL;
+    void       *sm_buf2=NULL;
+    hid_t      sm_space;               /*stripmine data space */
+    size_t     need;                   /* bytes needed for malloc */
+    int        i;
+    unsigned int  vl_data = 0;         /*contains VL datatypes */
+
+    /* Get the dataspace handle */
+    if ( (sid1 = H5Dget_space(did1)) < 0 )
+        goto error;
+
+    /* Get rank */
+    if ( (rank1 = H5Sget_simple_extent_ndims(sid1)) < 0 )
+        goto error;
+
+    /* Get the dataspace handle */
+    if ( (sid2 = H5Dget_space(did2)) < 0 )
+        goto error;
+
+    /* Get rank */
+    if ( (rank2 = H5Sget_simple_extent_ndims(sid2)) < 0 )
+        goto error;
+
+    /* Get dimensions */
+    if ( H5Sget_simple_extent_dims(sid1,dims1,maxdim1) < 0 )
+        goto error;
+
+    /* Get dimensions */
+    if ( H5Sget_simple_extent_dims(sid2,dims2,maxdim2) < 0 )
+    {
+        goto error;
+    }
+
+    /*-------------------------------------------------------------------------
+    * get the file data type
+    *-------------------------------------------------------------------------
+    */
+
+    /* Get the data type */
+    if ( (f_tid1 = H5Dget_type(did1)) < 0 )
+        goto error;
+
+    /* Get the data type */
+    if ( (f_tid2 = H5Dget_type(did2)) < 0 )
+    {
+        goto error;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for empty datasets
+    *-------------------------------------------------------------------------
+    */
+
+    storage_size1=H5Dget_storage_size(did1);
+    storage_size2=H5Dget_storage_size(did2);
+
+    if (storage_size1==0 || storage_size2==0)
+    {
+        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+            parallel_print("Not comparable: <%s> or <%s> is an empty dataset\n", obj1_name, obj2_name);
+        can_compare=0;
+        options->not_cmp=1;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for comparable TYPE and SPACE
+    *-------------------------------------------------------------------------
+    */
+
+    if (diff_can_type(f_tid1,
+        f_tid2,
+        rank1,
+        rank2,
+        dims1,
+        dims2,
+        maxdim1,
+        maxdim2,
+        obj1_name,
+        obj2_name,
+        options,
+        0)!=1)
+    {
+        can_compare=0;
+    }
+
+    /*-------------------------------------------------------------------------
+    * memory type and sizes
+    *-------------------------------------------------------------------------
+    */
+    if ((m_tid1=h5tools_get_native_type(f_tid1)) < 0)
+        goto error;
+
+    if ((m_tid2=h5tools_get_native_type(f_tid2)) < 0)
+        goto error;
+
+    m_size1 = H5Tget_size( m_tid1 );
+    m_size2 = H5Tget_size( m_tid2 );
+
+    /*-------------------------------------------------------------------------
+    * check for different signed/unsigned types
+    *-------------------------------------------------------------------------
+    */
+    if (can_compare)
+    {
+        sign1=H5Tget_sign(m_tid1);
+        sign2=H5Tget_sign(m_tid2);
+        if ( sign1 != sign2 )
+        {
+            if ((options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+            {
+                parallel_print("Not comparable: <%s> has sign %s ", obj1_name, get_sign(sign1));
+                parallel_print("and <%s> has sign %s\n", obj2_name, get_sign(sign2));
+            }
+    
+            can_compare=0;
+            options->not_cmp=1;
+        }
+    }
+
+    /* Check if type is either VLEN-data or VLEN-string to reclaim any
+     * VLEN memory buffer later */
+    if( TRUE == h5tools_detect_vlen(m_tid1) )
+        vl_data = TRUE;
+
+    /*------------------------------------------------------------------------
+    * only attempt to compare if possible
+    *-------------------------------------------------------------------------
+    */
+    if(can_compare) /* it is possible to compare */
+    {
+
+        /*-----------------------------------------------------------------
+        * get number of elements
+        *------------------------------------------------------------------
+        */
+        nelmts1 = 1;
+        for(i = 0; i < rank1; i++)
+            nelmts1 *= dims1[i];
+
+        nelmts2 = 1;
+        for(i = 0; i < rank2; i++)
+            nelmts2 *= dims2[i];
+
+        HDassert(nelmts1 == nelmts2);
+
+        /*-----------------------------------------------------------------
+        * "upgrade" the smaller memory size
+        *------------------------------------------------------------------
+        */
+
+        if (FAIL == match_up_memsize (f_tid1, f_tid2,
+                                      &m_tid1, &m_tid2, 
+                                      &m_size1, &m_size2))
+            goto error;
+
+        /* print names */
+        if(obj1_name)
+            name1 = diff_basename(obj1_name);
+        if(obj2_name)
+            name2 = diff_basename(obj2_name);
+
+
+        /*----------------------------------------------------------------
+        * read/compare
+        *-----------------------------------------------------------------
+        */
+        need = (size_t)(nelmts1 * m_size1);  /* bytes needed */
+        if(need < H5TOOLS_MALLOCSIZE) {
+            buf1 = HDmalloc(need);
+            buf2 = HDmalloc(need);
+        } /* end if */
+
+        if(buf1 != NULL && buf2 != NULL) {
+            if(H5Dread(did1, m_tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1) < 0)
+                goto error;
+            if(H5Dread(did2, m_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2) < 0)
+                goto error;
+
+            /* array diff */
+            nfound = diff_array(buf1, buf2, nelmts1, (hsize_t)0, rank1, dims1,
+                options, name1, name2, m_tid1, did1, did2);
+
+            /* reclaim any VL memory, if necessary */
+            if(vl_data) {
+                H5Dvlen_reclaim(m_tid1, sid1, H5P_DEFAULT, buf1);
+                H5Dvlen_reclaim(m_tid2, sid2, H5P_DEFAULT, buf2);
+            } /* end if */
+        } /* end if */
+        else /* possibly not enough memory, read/compare by hyperslabs */
+        {
+            size_t        p_type_nbytes = m_size1; /*size of memory type */
+            hsize_t       p_nelmts = nelmts1;      /*total selected elmts */
+            hsize_t       elmtno;                  /*counter  */
+            int           carry;                   /*counter carry value */
+
+            /* stripmine info */
+            hsize_t       sm_size[H5S_MAX_RANK];   /*stripmine size */
+            hsize_t       sm_nbytes;               /*bytes per stripmine */
+            hsize_t       sm_nelmts;               /*elements per stripmine*/
+
+            /* hyperslab info */
+            hsize_t       hs_offset[H5S_MAX_RANK]; /*starting offset */
+            hsize_t       hs_size[H5S_MAX_RANK];   /*size this pass */
+            hsize_t       hs_nelmts;               /*elements in request */
+            hsize_t       zero[8];                 /*vector of zeros */
+
+            /*
+             * determine the strip mine size and allocate a buffer. The strip mine is
+             * a hyperslab whose size is manageable.
+             */
+            sm_nbytes = p_type_nbytes;
+
+            for(i = rank1; i > 0; --i) {
+                hsize_t size = H5TOOLS_BUFSIZE / sm_nbytes;
+
+                if(size == 0) /* datum size > H5TOOLS_BUFSIZE */
+                    size = 1;
+                sm_size[i - 1] = MIN(dims1[i - 1], size);
+                sm_nbytes *= sm_size[i - 1];
+                HDassert(sm_nbytes > 0);
+            } /* end for */
+
+            /* malloc return code should be verified.
+             * If fail, need to handle the error.
+             * This else branch should be recoded as a separate function.
+             * Note that there are many "goto error" within this branch
+             * that fails to address freeing other objects created here.
+             * E.g., sm_space.
+             */
+            sm_buf1 = HDmalloc((size_t)sm_nbytes);
+            HDassert(sm_buf1);
+            sm_buf2 = HDmalloc((size_t)sm_nbytes);
+            HDassert(sm_buf2);
+
+            sm_nelmts = sm_nbytes / p_type_nbytes;
+            sm_space = H5Screate_simple(1, &sm_nelmts, NULL);
+
+            /* the stripmine loop */
+            HDmemset(hs_offset, 0, sizeof hs_offset);
+            HDmemset(zero, 0, sizeof zero);
+
+            for(elmtno = 0; elmtno < p_nelmts; elmtno += hs_nelmts) {
+                /* calculate the hyperslab size */
+                if(rank1 > 0) {
+                    for(i = 0, hs_nelmts = 1; i < rank1; i++) {
+                        hs_size[i] = MIN(dims1[i] - hs_offset[i], sm_size[i]);
+                        hs_nelmts *= hs_size[i];
+                    } /* end for */
+                    if(H5Sselect_hyperslab(sid1, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0)
+                        goto error;
+                    if(H5Sselect_hyperslab(sid2, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0)
+                        goto error;
+                    if(H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, zero, NULL, &hs_nelmts, NULL) < 0)
+                        goto error;
+                } /* end if */
+                else
+                    hs_nelmts = 1;
+
+                if(H5Dread(did1,m_tid1,sm_space,sid1,H5P_DEFAULT,sm_buf1) < 0)
+                    goto error;
+                if(H5Dread(did2,m_tid2,sm_space,sid2,H5P_DEFAULT,sm_buf2) < 0)
+                    goto error;
+
+                /* get array differences. in the case of hyperslab read, increment the number of differences
+                found in each hyperslab and pass the position at the beggining for printing */
+                nfound += diff_array(sm_buf1, sm_buf2, hs_nelmts, elmtno, rank1,
+                    dims1, options, name1, name2, m_tid1, did1, did2);
+
+                /* reclaim any VL memory, if necessary */
+                if(vl_data) {
+                    H5Dvlen_reclaim(m_tid1, sm_space, H5P_DEFAULT, sm_buf1);
+                    H5Dvlen_reclaim(m_tid1, sm_space, H5P_DEFAULT, sm_buf2);
+                } /* end if */
+
+                /* calculate the next hyperslab offset */
+                for(i = rank1, carry = 1; i > 0 && carry; --i) {
+                    hs_offset[i - 1] += hs_size[i - 1];
+                    if(hs_offset[i - 1] == dims1[i - 1])
+                        hs_offset[i - 1] = 0;
+                    else
+                        carry = 0;
+                } /* i */
+            } /* elmtno */
+
+            H5Sclose(sm_space);
+        } /* hyperslab read */
+    } /*can_compare*/
+
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+    /* free */
+    if(buf1 != NULL) {
+        HDfree(buf1);
+        buf1 = NULL;
+    } /* end if */
+    if(buf2 != NULL) {
+        HDfree(buf2);
+        buf2 = NULL;
+    } /* end if */
+    if(sm_buf1 != NULL) {
+        HDfree(sm_buf1);
+        sm_buf1 = NULL;
+    } /* end if */
+    if(sm_buf2 != NULL) {
+        HDfree(sm_buf2);
+        sm_buf2 = NULL;
+    } /* end if */
+
+    H5E_BEGIN_TRY {
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Tclose(f_tid1);
+        H5Tclose(f_tid2);
+        H5Tclose(m_tid1);
+        H5Tclose(m_tid2);
+    } H5E_END_TRY;
+
+    return nfound;
+
+error:
+    options->err_stat=1;
+
+    /* free */
+    if (buf1!=NULL)
+    {
+        /* reclaim any VL memory, if necessary */
+        if(vl_data)
+            H5Dvlen_reclaim(m_tid1, sid1, H5P_DEFAULT, buf1);
+        HDfree(buf1);
+        buf1=NULL;
+    }
+    if (buf2!=NULL)
+    {
+        /* reclaim any VL memory, if necessary */
+        if(vl_data)
+            H5Dvlen_reclaim(m_tid2, sid2, H5P_DEFAULT, buf2);
+        HDfree(buf2);
+        buf2=NULL;
+    }
+    if (sm_buf1!=NULL)
+    {
+        /* reclaim any VL memory, if necessary */
+        if(vl_data)
+            H5Dvlen_reclaim(m_tid1, sm_space, H5P_DEFAULT, sm_buf1);
+        HDfree(sm_buf1);
+        sm_buf1=NULL;
+    }
+    if (sm_buf2!=NULL)
+    {
+        /* reclaim any VL memory, if necessary */
+        if(vl_data)
+            H5Dvlen_reclaim(m_tid1, sm_space, H5P_DEFAULT, sm_buf2);
+        HDfree(sm_buf2);
+        sm_buf2=NULL;
+    }
+
+    /* disable error reporting */
+    H5E_BEGIN_TRY {
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Tclose(f_tid1);
+        H5Tclose(f_tid2);
+        H5Tclose(m_tid1);
+        H5Tclose(m_tid2);
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+    return nfound;
+}
+
+/*-------------------------------------------------------------------------
+* Function: diff_can_type
+*
+* Purpose: check for comparable TYPE and SPACE
+*
+* Return:
+*  1, can compare
+*  0, cannot compare
+* -1, error
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 3, 2003
+*
+*-------------------------------------------------------------------------
+*/
+
+int diff_can_type( hid_t       f_tid1, /* file data type */
+                   hid_t       f_tid2, /* file data type */
+                   int         rank1,
+                   int         rank2,
+                   hsize_t     *dims1,
+                   hsize_t     *dims2,
+                   hsize_t     *maxdim1,
+                   hsize_t     *maxdim2,
+                   const char  *obj1_name,
+                   const char  *obj2_name,
+                   diff_opt_t  *options,
+                   int         is_compound)
+{
+
+
+    H5T_class_t  tclass1;
+    H5T_class_t  tclass2;
+    int          maxdim_diff=0;          /* maximum dimensions are different */
+    int          dim_diff=0;             /* current dimensions are different */
+    int          i;
+    int          can_compare = 1;        /* return value */
+
+    /*-------------------------------------------------------------------------
+    * check for the same class
+    *-------------------------------------------------------------------------
+    */
+
+    if ((tclass1=H5Tget_class(f_tid1)) < 0)
+        return -1;
+
+    if ((tclass2=H5Tget_class(f_tid2)) < 0)
+        return -1;
+
+    if ( tclass1 != tclass2 )
+    {
+
+        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+        {
+
+            if ( is_compound )
+            {
+
+                parallel_print("Not comparable: <%s> has a class %s and <%s> has a class %s\n",
+                    obj1_name, get_class(tclass1),
+                    obj2_name, get_class(tclass2) );
+
+            }
+
+            else
+
+            {
+
+                parallel_print("Not comparable: <%s> is of class %s and <%s> is of class %s\n",
+                    obj1_name, get_class(tclass1),
+                    obj2_name, get_class(tclass2) );
+
+            }
+
+        }
+
+
+        can_compare = 0;
+        options->not_cmp = 1;
+        return can_compare;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for non supported classes
+    *-------------------------------------------------------------------------
+    */
+
+    HDassert(tclass1==tclass2);
+    switch (tclass1)
+    {
+    case H5T_INTEGER:
+    case H5T_FLOAT:
+    case H5T_COMPOUND:
+    case H5T_STRING:
+    case H5T_ARRAY:
+    case H5T_BITFIELD:
+    case H5T_OPAQUE:
+    case H5T_ENUM:
+    case H5T_VLEN:
+    case H5T_REFERENCE:
+
+        break;
+
+    default: /*H5T_TIME */
+
+
+        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+        {
+            parallel_print("Not comparable: <%s> and <%s> are of class %s\n",
+                obj1_name,obj2_name,get_class(tclass2) );
+        }
+        can_compare = 0;
+        options->not_cmp = 1;
+        return can_compare;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for equal file datatype; warning only
+    *-------------------------------------------------------------------------
+    */
+
+    if ( (H5Tequal(f_tid1, f_tid2)==0) &&
+        (options->m_verbose) && obj1_name && obj2_name)
+    {
+
+        H5T_class_t cl = H5Tget_class(f_tid1);
+
+
+        parallel_print("Warning: different storage datatype\n");
+        if ( cl == H5T_INTEGER || cl == H5T_FLOAT )
+        {
+            parallel_print("<%s> has file datatype ", obj1_name);
+            print_type(f_tid1);
+            parallel_print("\n");
+            parallel_print("<%s> has file datatype ", obj2_name);
+            print_type(f_tid2);
+            parallel_print("\n");
+        }
+
+
+
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for the same rank
+    *-------------------------------------------------------------------------
+    */
+
+
+    if ( rank1 != rank2 )
+    {
+
+        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+        {
+            parallel_print("Not comparable: <%s> has rank %d, dimensions ", obj1_name, rank1);
+            print_dimensions(rank1,dims1);
+            parallel_print(", max dimensions ");
+            print_dimensions(rank1,maxdim1);
+            parallel_print("\n" );
+            parallel_print("and <%s> has rank %d, dimensions ", obj2_name, rank2);
+            print_dimensions(rank2,dims2);
+            parallel_print(", max dimensions ");
+            print_dimensions(rank2,maxdim2);
+            parallel_print("\n");
+        }
+
+        can_compare = 0;
+        options->not_cmp = 1;
+        return can_compare;
+    }
+
+    /*-------------------------------------------------------------------------
+    * check for different dimensions
+    *-------------------------------------------------------------------------
+    */
+
+    HDassert(rank1==rank2);
+    for ( i=0; i<rank1; i++)
+    {
+        if (maxdim1 && maxdim2)
+        {
+            if ( maxdim1[i] != maxdim2[i] )
+                maxdim_diff=1;
+        }
+        if ( dims1[i] != dims2[i] )
+            dim_diff=1;
+    }
+
+    /*-------------------------------------------------------------------------
+    * current dimensions
+    *-------------------------------------------------------------------------
+    */
+
+    if (dim_diff==1)
+    {
+        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+        {
+            parallel_print("Not comparable: <%s> has rank %d, dimensions ", obj1_name, rank1);
+            print_dimensions(rank1,dims1);
+            if (maxdim1 && maxdim2)
+            {
+                parallel_print(", max dimensions ");
+                print_dimensions(rank1,maxdim1);
+                parallel_print("\n" );
+                parallel_print("and <%s> has rank %d, dimensions ", obj2_name, rank2);
+                print_dimensions(rank2,dims2);
+                parallel_print(", max dimensions ");
+                print_dimensions(rank2,maxdim2);
+                parallel_print("\n");
+            }
+        }
+
+
+        can_compare = 0;
+        options->not_cmp = 1;
+        return can_compare;
+
+
+
+    }
+
+    /*-------------------------------------------------------------------------
+    * maximum dimensions; just give a warning
+    *-------------------------------------------------------------------------
+    */
+    if (maxdim1 && maxdim2 && maxdim_diff==1 && obj1_name )
+    {
+        if (options->m_verbose) {
+            parallel_print( "Warning: different maximum dimensions\n");
+            parallel_print("<%s> has max dimensions ", obj1_name);
+            print_dimensions(rank1,maxdim1);
+            parallel_print("\n");
+            parallel_print("<%s> has max dimensions ", obj2_name);
+            print_dimensions(rank2,maxdim2);
+            parallel_print("\n");
+        }
+    }
+
+
+    if ( tclass1 == H5T_COMPOUND )
+    {
+
+        int   nmembs1;
+        int   nmembs2;
+        int   j;
+        hid_t memb_type1;
+        hid_t memb_type2;
+
+        nmembs1 = H5Tget_nmembers(f_tid1);
+        nmembs2 = H5Tget_nmembers(f_tid2);
+
+        if ( nmembs1 != nmembs2 )
+        {
+
+            if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
+            {
+                parallel_print("Not comparable: <%s> has %d members ", obj1_name, nmembs1);
+                parallel_print("<%s> has %d members ", obj2_name, nmembs2);
+                parallel_print("\n");
+            }
+
+            can_compare = 0;
+            options->not_cmp = 1;
+            return can_compare;
+        }
+
+        for (j = 0; j < nmembs1; j++)
+        {
+            memb_type1 = H5Tget_member_type(f_tid1, (unsigned)j);
+            memb_type2 = H5Tget_member_type(f_tid2, (unsigned)j);
+
+            if (diff_can_type(memb_type1,
+                memb_type2,
+                rank1,
+                rank2,
+                dims1,
+                dims2,
+                maxdim1,
+                maxdim2,
+                obj1_name,
+                obj2_name,
+                options,
+                1)!=1)
+            {
+                can_compare = 0;
+                options->not_cmp = 1;
+                H5Tclose(memb_type1);
+                H5Tclose(memb_type2);
+                return can_compare;
+            }
+
+            H5Tclose(memb_type1);
+            H5Tclose(memb_type2);
+
+        }
+
+
+
+
+
+    }
+
+
+
+
+
+    return can_compare;
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+* Function: print_sizes
+*
+* Purpose: Print datatype sizes
+*
+*-------------------------------------------------------------------------
+*/
+#if defined (H5DIFF_DEBUG)
+void print_sizes( const char *obj1,
+                  const char *obj2,
+                  hid_t f_tid1,
+                  hid_t f_tid2,
+                  hid_t m_tid1,
+                  hid_t m_tid2 )
+{
+    size_t  f_size1, f_size2;       /* size of type in file */
+    size_t  m_size1, m_size2;       /* size of type in memory */
+
+    f_size1 = H5Tget_size( f_tid1 );
+    f_size2 = H5Tget_size( f_tid2 );
+    m_size1 = H5Tget_size( m_tid1 );
+    m_size2 = H5Tget_size( m_tid2 );
+
+    parallel_print("\n");
+    parallel_print("------------------\n");
+    parallel_print("sizeof(char)   %u\n", sizeof(char) );
+    parallel_print("sizeof(short)  %u\n", sizeof(short) );
+    parallel_print("sizeof(int)    %u\n", sizeof(int) );
+    parallel_print("sizeof(long)   %u\n", sizeof(long) );
+    parallel_print("<%s> ------------------\n", obj1);
+    parallel_print("type on file   ");
+    print_type(f_tid1);
+    parallel_print("\n");
+    parallel_print("size on file   %u\n", f_size1 );
+
+    parallel_print("type on memory ");
+    print_type(m_tid1);
+    parallel_print("\n");
+    parallel_print("size on memory %u\n", m_size1 );
+
+    parallel_print("<%s> ------------------\n", obj2);
+    parallel_print("type on file   ");
+    print_type(f_tid2);
+    parallel_print("\n");
+    parallel_print("size on file   %u\n", f_size2 );
+
+    parallel_print("type on memory ");
+    print_type(m_tid2);
+    parallel_print("\n");
+    parallel_print("size on memory %u\n", m_size2 );
+    parallel_print("\n");
+}
+#endif /* H5DIFF_DEBUG */
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5diff_util.c b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_util.c
new file mode 100644
index 0000000..ab3e1ce
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5diff_util.c
@@ -0,0 +1,397 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5diff.h"
+#include "ph5diff.h"
+
+
+/* global variables */
+int      g_nTasks = 1;
+
+/*-------------------------------------------------------------------------
+ * Function: print_dimensions
+ *
+ * Purpose: print dimensions
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+print_dimensions (int rank, hsize_t *dims)
+{
+    int  i;
+
+    if ( rank <= 0 ) 
+    {
+        parallel_print("H5S_SCALAR" );
+    }
+    else 
+    {
+        if (!dims)
+            parallel_print("dimension is NULL");
+        else 
+        {
+            parallel_print("[");
+            for ( i = 0; i < rank-1; i++)
+            {
+                parallel_print(HSIZE_T_FORMAT, dims[i]);
+                parallel_print("x");
+            }
+
+            parallel_print(HSIZE_T_FORMAT,  dims[rank-1]);
+            parallel_print("]" );
+        }
+    }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_type
+ *
+ * Purpose: Print name of datatype
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments: Adapted from h5dump for H5T_INTEGER and H5T_FLOAT classes only
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_type(hid_t type)
+{
+    switch (H5Tget_class(type))
+    {
+    case H5T_INTEGER:
+        if (H5Tequal(type, H5T_STD_I8BE)) {
+            parallel_print("H5T_STD_I8BE");
+        } else if (H5Tequal(type, H5T_STD_I8LE)) {
+            parallel_print("H5T_STD_I8LE");
+        } else if (H5Tequal(type, H5T_STD_I16BE)) {
+            parallel_print("H5T_STD_I16BE");
+        } else if (H5Tequal(type, H5T_STD_I16LE)) {
+            parallel_print("H5T_STD_I16LE");
+        } else if (H5Tequal(type, H5T_STD_I32BE)) {
+            parallel_print("H5T_STD_I32BE");
+        } else if (H5Tequal(type, H5T_STD_I32LE)) {
+            parallel_print("H5T_STD_I32LE");
+        } else if (H5Tequal(type, H5T_STD_I64BE)) {
+            parallel_print("H5T_STD_I64BE");
+        } else if (H5Tequal(type, H5T_STD_I64LE)) {
+            parallel_print("H5T_STD_I64LE");
+        } else if (H5Tequal(type, H5T_STD_U8BE)) {
+            parallel_print("H5T_STD_U8BE");
+        } else if (H5Tequal(type, H5T_STD_U8LE)) {
+            parallel_print("H5T_STD_U8LE");
+        } else if (H5Tequal(type, H5T_STD_U16BE)) {
+            parallel_print("H5T_STD_U16BE");
+        } else if (H5Tequal(type, H5T_STD_U16LE)) {
+            parallel_print("H5T_STD_U16LE");
+        } else if (H5Tequal(type, H5T_STD_U32BE)) {
+            parallel_print("H5T_STD_U32BE");
+        } else if (H5Tequal(type, H5T_STD_U32LE)) {
+            parallel_print("H5T_STD_U32LE");
+        } else if (H5Tequal(type, H5T_STD_U64BE)) {
+            parallel_print("H5T_STD_U64BE");
+        } else if (H5Tequal(type, H5T_STD_U64LE)) {
+            parallel_print("H5T_STD_U64LE");
+        } else if (H5Tequal(type, H5T_NATIVE_SCHAR)) {
+            parallel_print("H5T_NATIVE_SCHAR");
+        } else if (H5Tequal(type, H5T_NATIVE_UCHAR)) {
+            parallel_print("H5T_NATIVE_UCHAR");
+        } else if (H5Tequal(type, H5T_NATIVE_SHORT)) {
+            parallel_print("H5T_NATIVE_SHORT");
+        } else if (H5Tequal(type, H5T_NATIVE_USHORT)) {
+            parallel_print("H5T_NATIVE_USHORT");
+        } else if (H5Tequal(type, H5T_NATIVE_INT)) {
+            parallel_print("H5T_NATIVE_INT");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT)) {
+            parallel_print("H5T_NATIVE_UINT");
+        } else if (H5Tequal(type, H5T_NATIVE_LONG)) {
+            parallel_print("H5T_NATIVE_LONG");
+        } else if (H5Tequal(type, H5T_NATIVE_ULONG)) {
+            parallel_print("H5T_NATIVE_ULONG");
+        } else if (H5Tequal(type, H5T_NATIVE_LLONG)) {
+            parallel_print("H5T_NATIVE_LLONG");
+        } else if (H5Tequal(type, H5T_NATIVE_ULLONG)) {
+            parallel_print("H5T_NATIVE_ULLONG");
+        } else {
+            parallel_print("undefined integer");
+        }
+        break;
+
+    case H5T_FLOAT:
+        if (H5Tequal(type, H5T_IEEE_F32BE)) {
+            parallel_print("H5T_IEEE_F32BE");
+        } else if (H5Tequal(type, H5T_IEEE_F32LE)) {
+            parallel_print("H5T_IEEE_F32LE");
+        } else if (H5Tequal(type, H5T_IEEE_F64BE)) {
+            parallel_print("H5T_IEEE_F64BE");
+        } else if (H5Tequal(type, H5T_IEEE_F64LE)) {
+            parallel_print("H5T_IEEE_F64LE");
+        } else if (H5Tequal(type, H5T_NATIVE_FLOAT)) {
+            parallel_print("H5T_NATIVE_FLOAT");
+        } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)) {
+            parallel_print("H5T_NATIVE_DOUBLE");
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)) {
+            parallel_print("H5T_NATIVE_LDOUBLE");
+#endif
+        } else {
+            parallel_print("undefined float");
+        }
+        break;
+
+    case H5T_TIME:
+    case H5T_STRING:
+    case H5T_BITFIELD:
+    case H5T_OPAQUE:
+    case H5T_COMPOUND:
+    case H5T_REFERENCE:
+    case H5T_ENUM:
+    case H5T_VLEN:
+    case H5T_ARRAY:
+    case H5T_NO_CLASS:
+    case H5T_NCLASSES:
+    default:
+        return;
+
+    } /* end switch */
+}
+
+/*-------------------------------------------------------------------------
+ * Function: diff_basename
+ *
+ * Purpose: Returns a pointer to the last component absolute name
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+diff_basename(const char *name)
+{
+    size_t i;
+
+    if (name == NULL)
+        return NULL;
+
+    /* Find the end of the base name */
+    i = HDstrlen(name);
+    while (i > 0 && '/' == name[i - 1])
+        --i;
+
+    /* Skip backward over base name */
+    while (i > 0 && '/' != name[i - 1])
+        --i;
+
+    return(name+i);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: get_type
+ *
+ * Purpose: Returns the type as a string
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_type(h5trav_type_t type)
+{
+    switch(type) {
+        case H5TRAV_TYPE_DATASET:
+            return("H5G_DATASET");
+
+        case H5TRAV_TYPE_GROUP:
+            return("H5G_GROUP");
+
+        case H5TRAV_TYPE_NAMED_DATATYPE:
+            return("H5G_TYPE");
+
+        case H5TRAV_TYPE_LINK:
+            return("H5G_LINK");
+
+        case H5TRAV_TYPE_UDLINK:
+            return("H5G_UDLINK");
+
+        case H5TRAV_TYPE_UNKNOWN:
+        default:
+            return("unknown type");
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: get_sign
+ *
+ * Purpose: Returns the sign as a string
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_sign(H5T_sign_t sign)
+{
+    switch (sign)
+    {
+        case H5T_SGN_NONE:
+            return "H5T_SGN_NONE";
+
+        case H5T_SGN_2:
+            return "H5T_SGN_2";
+
+        case H5T_SGN_ERROR:
+            return "H5T_SGN_ERROR";
+
+        case H5T_NSGN:
+            return "H5T_NSGN";
+
+        default:
+            HDassert(0);
+            return "unknown sign value";
+    } /* end switch */
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: get_class
+ *
+ * Purpose: Returns the class as a string
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+const char*
+get_class(H5T_class_t tclass)
+{
+    switch (tclass) {
+        case H5T_TIME:
+            return("H5T_TIME");
+
+        case H5T_INTEGER:
+            return("H5T_INTEGER");
+
+        case H5T_FLOAT:
+            return("H5T_FLOAT");
+
+        case H5T_STRING:
+            return("H5T_STRING");
+
+        case H5T_BITFIELD:
+            return("H5T_BITFIELD");
+
+        case H5T_OPAQUE:
+            return("H5T_OPAQUE");
+
+        case H5T_COMPOUND:
+            return("H5T_COMPOUND");
+
+        case H5T_REFERENCE:
+            return("H5T_REFERENCE");
+
+        case H5T_ENUM:
+            return("H5T_ENUM");
+
+        case H5T_VLEN:
+            return("H5T_VLEN");
+
+        case H5T_ARRAY:
+            return("H5T_ARRAY");
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HDassert(0);
+            return("Invalid class");
+    } /* end switch */
+} /* end get_class() */
+
+/*-------------------------------------------------------------------------
+ * Function: print_found
+ *
+ * Purpose: print number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_found(hsize_t nfound)
+{
+    if(g_Parallel)
+        parallel_print("%"H5_PRINTF_LL_WIDTH"u differences found\n", (unsigned long long)nfound);
+    else
+        HDfprintf(stdout,"%Hu differences found\n",nfound);
+}
+
+
+/*-----------------------------------------------------------------
+ * Function: match_up_memsize
+ *  
+ * Purpose: match smaller memory size up to bigger memory size
+ *------------------------------------------------------------------
+ */
+herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id,
+                         hid_t *m_tid1, hid_t *m_tid2, 
+                         size_t *m_size1, size_t  *m_size2)
+{
+    herr_t ret = SUCCEED;
+
+    if( (*m_size1) != (*m_size2) )
+    {
+        if( (*m_size1) < (*m_size2) )
+        {
+            H5Tclose( *m_tid1 );
+
+            if(( (*m_tid1) = h5tools_get_native_type(f_tid2_id)) < 0)
+            {
+                ret = FAIL;
+                goto out;
+            }
+
+            *m_size1 = H5Tget_size( *m_tid1 );
+        } /* end if */
+        else {
+            H5Tclose(*m_tid2);
+
+            if(( (*m_tid2) = h5tools_get_native_type(f_tid1_id)) < 0)
+            {
+                ret = FAIL;
+                goto out;
+            }
+
+            *m_size2 = H5Tget_size(*m_tid2);
+        } /* end else */
+    } /* end if */
+    HDassert( (*m_size1) == (*m_size2) );
+
+out:
+    return ret;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools.c
new file mode 100644
index 0000000..f2123fb
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools.c
@@ -0,0 +1,1856 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, July 23, 1998
+ *
+ * Purpose: A library for displaying the values of a dataset in a human
+ *  readable format.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_ref.h"
+#include "h5tools_utils.h"
+#include "H5private.h"
+
+/* global variables */
+hid_t H5tools_ERR_STACK_g = 0;
+hid_t H5tools_ERR_CLS_g = -1;
+hid_t H5E_tools_g = -1;
+hid_t H5E_tools_min_id_g = -1;
+int         compound_data;
+FILE       *rawattrstream = NULL;      /* should initialize to stdout but gcc moans about it */
+FILE       *rawdatastream = NULL;      /* should initialize to stdout but gcc moans about it */
+FILE       *rawinstream = NULL;        /* should initialize to stdin but gcc moans about it */
+FILE       *rawoutstream = NULL;       /* should initialize to stdout but gcc moans about it */
+FILE       *rawerrorstream = NULL;     /* should initialize to stderr but gcc moans about it */
+int         bin_output;         /* binary output */
+int         bin_form;           /* binary form */
+int         region_output;      /* region output */
+int         oid_output;         /* oid output */
+int         data_output;        /* data output */
+int         attr_data_output;   /* attribute data output */
+unsigned    packed_bits_num;    /* number of packed bits to display */
+unsigned    packed_data_offset; /* offset of packed bits to display */
+unsigned    packed_data_length; /* length of packed bits to display */
+unsigned long long packed_data_mask;  /* mask in which packed bits to display */
+int          enable_error_stack= FALSE; /* re-enable error stack */
+
+/* module-scoped variables */
+static int  h5tools_init_g;     /* if h5tools lib has been initialized */
+
+/* Names of VFDs */
+static const char *drivernames[]={
+    "sec2",
+    "family",
+    "split",
+    "multi",
+#ifdef H5_HAVE_PARALLEL
+    "mpio",
+#endif /* H5_HAVE_PARALLEL */
+};
+
+/* This enum should match the entries in the above drivers_list since they
+ * are indexes into the drivers_list array. */
+typedef enum {
+    SEC2_IDX = 0
+   ,FAMILY_IDX
+   ,SPLIT_IDX
+   ,MULTI_IDX
+#ifdef H5_HAVE_PARALLEL
+   ,MPIO_IDX
+#endif /* H5_HAVE_PARALLEL */
+} driver_idx;
+#define NUM_DRIVERS     (sizeof(drivernames) / sizeof(drivernames[0]))
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Initialize the H5 Tools library
+ * Description:
+ *      This should be called before any other h5tools function is called.
+ *      Effect of any h5tools function called before this has been called is
+ *      undetermined.
+ * Return:
+ *      None
+ * Programmer:
+ *      Albert Cheng, 2000-10-31
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_init(void)
+{
+    char lib_str[256];
+
+    if (!h5tools_init_g) {
+        /* register the error class */
+        HDsnprintf(lib_str, sizeof(lib_str), "%d.%d.%d",H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE);
+
+        H5tools_ERR_STACK_g = H5Ecreate_stack();
+        H5TOOLS_INIT_ERROR()
+
+        if (!rawattrstream)
+            rawattrstream = stdout;
+        if (!rawdatastream)
+            rawdatastream = stdout;
+        if (!rawinstream)
+            rawinstream = stdin;
+        if (!rawoutstream)
+            rawoutstream = stdout;
+        if (!rawerrorstream)
+            rawerrorstream = stderr;
+
+        h5tools_dump_init();
+
+        h5tools_init_g++;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Close the H5 Tools library
+ * Description:
+ *      Close or release resources such as files opened by the library. This
+ *      should be called after all other h5tools functions have been called.
+ *      Effect of any h5tools function called after this has been called is
+ *      undetermined.
+ * Return:
+ *      None
+ * Programmer:
+ *      Albert Cheng, 2000-10-31
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_close(void)
+{
+    H5E_auto2_t         tools_func;
+    void               *tools_edata;
+    if (h5tools_init_g) {
+        /* special case where only data is output to stdout */
+        if((rawoutstream == NULL) && rawdatastream && (rawdatastream == stdout))
+            HDfprintf(rawdatastream, "\n");
+
+        H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
+        if(tools_func!=NULL)
+            H5Eprint2(H5tools_ERR_STACK_g, rawerrorstream);
+        if (rawattrstream && rawattrstream != stdout) {
+            if (fclose(rawattrstream))
+                perror("closing rawattrstream");
+            else
+                rawattrstream = NULL;
+        }
+        if (rawdatastream && rawdatastream != stdout) {
+            if (fclose(rawdatastream))
+                perror("closing rawdatastream");
+            else
+                rawdatastream = NULL;
+        }
+        if (rawinstream && rawinstream != stdin) {
+            if (fclose(rawinstream))
+                perror("closing rawinstream");
+            else
+                rawinstream = NULL;
+        }
+        if (rawoutstream && rawoutstream != stdout) {
+            if (fclose(rawoutstream))
+                perror("closing rawoutstream");
+            else
+                rawoutstream = NULL;
+        }
+        if (rawerrorstream && rawerrorstream != stderr) {
+            if (fclose(rawerrorstream))
+                perror("closing rawerrorstream");
+            else
+                rawerrorstream = NULL;
+        }
+
+        /* Clean up the reference path table, if it's been used */
+        term_ref_path_table();
+
+        H5TOOLS_CLOSE_ERROR()
+        H5Eclose_stack(H5tools_ERR_STACK_g);
+        /* Shut down the library */
+        H5close();
+
+        h5tools_init_g = 0;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_set_data_output_file
+ *
+ * Purpose:     Open fname as the output file for dataset raw data.
+ *      Set rawdatastream as its file stream.
+ *
+ * Return:      0 -- succeeded
+ *      negative -- failed
+ *
+ * Programmer:  Albert Cheng, 2000/09/30
+ *
+ * Modifications:
+ *  pvn June, 1, 2006. Add a switch for binary output
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_set_data_output_file(const char *fname, int is_bin)
+{
+    int     retvalue = FAIL;
+    FILE    *f;    /* temporary holding place for the stream pointer
+                    * so that rawdatastream is changed only when succeeded */
+
+    if (rawdatastream && rawdatastream != stdout) {
+        if (HDfclose(rawdatastream))
+            HDperror("closing rawdatastream");
+        else
+            rawdatastream = NULL;
+    }
+
+    /* First check if filename is string "NULL" */
+    if (fname != NULL) {
+        /* binary output */
+        if (is_bin) {
+            if ((f = HDfopen(fname, "wb")) != NULL) {
+                rawdatastream = f;
+                retvalue = SUCCEED;
+            }
+        }
+        else {
+            if ((f = HDfopen(fname, "w")) != NULL) {
+                rawdatastream = f;
+                retvalue = SUCCEED;
+            }
+        }
+    }
+    else {
+        rawdatastream = NULL;
+        retvalue = SUCCEED;
+    }
+
+    return retvalue;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_set_attr_output_file
+ *
+ * Purpose:     Open fname as the output file for attribute raw data.
+ *      Set rawattrstream as its file stream.
+ *
+ * Return:      0 -- succeeded
+ *      negative -- failed
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_set_attr_output_file(const char *fname, int is_bin)
+{
+    int     retvalue = FAIL;
+    FILE    *f;    /* temporary holding place for the stream pointer
+                    * so that rawattrstream is changed only when succeeded */
+
+    if (rawattrstream && rawattrstream != stdout) {
+        if (HDfclose(rawattrstream))
+            HDperror("closing rawattrstream");
+        else
+            rawattrstream = NULL;
+    }
+
+    /* First check if filename is string "NULL" */
+    if (fname != NULL) {
+        /* binary output */
+        if (is_bin) {
+			if ((f = HDfopen(fname, "wb")) != NULL) {
+				rawattrstream = f;
+				retvalue = SUCCEED;
+			}
+        }
+        else {
+			if ((f = HDfopen(fname, "w")) != NULL) {
+				rawattrstream = f;
+				retvalue = SUCCEED;
+			}
+        }
+    }
+    else {
+        rawattrstream = NULL;
+        retvalue = SUCCEED;
+    }
+
+    return retvalue;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_set_input_file
+ *
+ * Purpose:     Open fname as the input file for raw input.
+ *      Set rawinstream as its file stream.
+ *
+ * Return:      0 -- succeeded
+ *      negative -- failed
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_set_input_file(const char *fname, int is_bin)
+{
+    int     retvalue = FAIL;
+    FILE    *f;    /* temporary holding place for the stream pointer
+                    * so that rawinstream is changed only when succeeded */
+
+    if (rawinstream && rawinstream != stdin) {
+        if (HDfclose(rawinstream))
+            HDperror("closing rawinstream");
+        else
+        	rawinstream = NULL;
+    }
+    /* First check if filename is string "NULL" */
+    if (fname != NULL) {
+        /* binary output */
+        if (is_bin) {
+			if ((f = HDfopen(fname, "rb")) != NULL) {
+				rawinstream = f;
+				retvalue = SUCCEED;
+			}
+        }
+        else {
+			if ((f = HDfopen(fname, "r")) != NULL) {
+				rawinstream = f;
+				retvalue = SUCCEED;
+			}
+        }
+    }
+    else {
+    	rawinstream = NULL;
+        retvalue = SUCCEED;
+    }
+
+    return retvalue;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_set_output_file
+ *
+ * Purpose:     Open fname as the output file for raw output.
+ *      Set rawoutstream as its file stream.
+ *
+ * Return:      0 -- succeeded
+ *      negative -- failed
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_set_output_file(const char *fname, int is_bin)
+{
+    int     retvalue = FAIL;
+    FILE    *f;    /* temporary holding place for the stream pointer
+                    * so that rawoutstream is changed only when succeeded */
+
+    if (rawoutstream && rawoutstream != stdout) {
+        if (HDfclose(rawoutstream))
+            HDperror("closing rawoutstream");
+        else
+            rawoutstream = NULL;
+    }
+    /* First check if filename is string "NULL" */
+    if (fname != NULL) {
+        /* binary output */
+        if (is_bin) {
+			if ((f = HDfopen(fname, "wb")) != NULL) {
+					rawoutstream = f;
+					retvalue = SUCCEED;
+			}
+        }
+        else {
+			if ((f = HDfopen(fname, "w")) != NULL) {
+					rawoutstream = f;
+					retvalue = SUCCEED;
+			}
+        }
+    }
+    else {
+        rawoutstream = NULL;
+        retvalue = SUCCEED;
+    }
+
+    return retvalue;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_set_error_file
+ *
+ * Purpose:     Open fname as the error output file for dataset raw error.
+ *      Set rawerrorstream as its file stream.
+ *
+ * Return:      0 -- succeeded
+ *      negative -- failed
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_set_error_file(const char *fname, int is_bin)
+{
+    int     retvalue = FAIL;
+    FILE    *f;    /* temporary holding place for the stream pointer
+                    * so that rawerrorstream is changed only when succeeded */
+
+    if (rawerrorstream && rawerrorstream != stderr) {
+        if (HDfclose(rawerrorstream))
+            HDperror("closing rawerrorstream");
+        else
+            rawerrorstream = NULL;
+    }
+
+    /* First check if filename is string "NULL" */
+    if (fname != NULL) {
+    /* binary output */
+		if (is_bin) {
+			if ((f = HDfopen(fname, "wb")) != NULL) {
+				rawerrorstream = f;
+				retvalue = SUCCEED;
+			}
+        }
+        else {
+			if ((f = HDfopen(fname, "w")) != NULL) {
+				rawerrorstream = f;
+				retvalue = SUCCEED;
+			}
+		}
+    }
+    else {
+    	rawerrorstream = NULL;
+        retvalue = SUCCEED;
+    }
+
+    return retvalue;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Private
+ * Chapter:     H5Tools Library
+ * Purpose: Get a FAPL for a driver
+ * Description:
+ *      Get a FAPL for a given VFL driver name.
+ * Return:
+ *      None
+ * Programmer:
+ *      Quincey Koziol, 2004-02-04
+ * Modifications:
+ *      Pedro Vicente Nunes, Thursday, July 27, 2006
+ *   Added error return conditions for the H5Pset_fapl calls
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+h5tools_get_fapl(hid_t fapl, const char *driver, unsigned *drivernum)
+{
+    hid_t new_fapl; /* Copy of file access property list passed in, or new property list */
+
+    /* Make a copy of the FAPL, for the file open call to use, eventually */
+    if (fapl == H5P_DEFAULT) {
+        if ((new_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+            goto error;
+    } /* end if */
+    else {
+        if ((new_fapl = H5Pcopy(fapl)) < 0)
+            goto error;
+    } /* end else */
+
+    /* Determine which driver the user wants to open the file with. Try
+     * that driver. If it can't open it, then fail. */
+    if (!HDstrcmp(driver, drivernames[SEC2_IDX])) {
+        /* SEC2 driver */
+        if (H5Pset_fapl_sec2(new_fapl) < 0)
+            goto error;
+
+        if (drivernum)
+            *drivernum = SEC2_IDX;
+    }
+    else if (!HDstrcmp(driver, drivernames[FAMILY_IDX])) {
+        /* FAMILY Driver */
+
+        /* Set member size to be 0 to indicate the current first member size
+         * is the member size.
+         */
+        if (H5Pset_fapl_family(new_fapl, (hsize_t) 0, H5P_DEFAULT) < 0)
+            goto error;
+
+        if (drivernum)
+            *drivernum = FAMILY_IDX;
+    }
+    else if (!HDstrcmp(driver, drivernames[SPLIT_IDX])) {
+        /* SPLIT Driver */
+        if (H5Pset_fapl_split(new_fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT) < 0)
+            goto error;
+
+        if (drivernum)
+            *drivernum = SPLIT_IDX;
+    }
+    else if (!HDstrcmp(driver, drivernames[MULTI_IDX])) {
+        /* MULTI Driver */
+        if (H5Pset_fapl_multi(new_fapl, NULL, NULL, NULL, NULL, TRUE) < 0)
+        goto error;
+
+        if(drivernum)
+        *drivernum = MULTI_IDX;
+    }
+#ifdef H5_HAVE_PARALLEL
+    else if(!HDstrcmp(driver, drivernames[MPIO_IDX])) {
+        int mpi_initialized, mpi_finalized;
+
+        /* MPI-I/O Driver */
+        /* check if MPI is available. */
+        MPI_Initialized(&mpi_initialized);
+        MPI_Finalized(&mpi_finalized);
+
+        if(mpi_initialized && !mpi_finalized) {
+            if(H5Pset_fapl_mpio(new_fapl, MPI_COMM_WORLD, MPI_INFO_NULL) < 0)
+                goto error;
+            if(drivernum)
+                *drivernum = MPIO_IDX;
+        } /* end if */
+    }
+#endif /* H5_HAVE_PARALLEL */
+    else
+        goto error;
+
+    return(new_fapl);
+
+error:
+    if(new_fapl != H5P_DEFAULT)
+        H5Pclose(new_fapl);
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Open a file with various VFL drivers.
+ * Description:
+ *      Loop through the various types of VFL drivers trying to open FNAME.
+ *      If the HDF5 library is version 1.2 or less, then we have only the SEC2
+ *      driver to try out. If the HDF5 library is greater than version 1.2,
+ *      then we have the FAMILY, SPLIT, and MULTI drivers to play with.
+ *
+ *      If DRIVER is non-NULL, then it will try to open the file with that
+ *      driver first. We assume that the user knows what they are doing so, if
+ *      we fail, then we won't try other file drivers.
+ * Return:
+ *      On success, returns a file id for the opened file. If DRIVERNAME is
+ *      non-null then the first DRIVERNAME_SIZE-1 characters of the driver
+ *      name are copied into the DRIVERNAME array and null terminated.
+ *
+ *      Otherwise, the function returns FAIL. If DRIVERNAME is non-null then
+ *      the first byte is set to the null terminator.
+ * Programmer:
+ *      Lost in the mists of time.
+ * Modifications:
+ *      Robb Matzke, 2000-06-23
+ *      We only have to initialize driver[] on the first call, thereby
+ *      preventing memory leaks from repeated calls to H5Pcreate().
+ *
+ *      Robb Matzke, 2000-06-23
+ *      Added DRIVERNAME_SIZE arg to prevent overflows when writing to
+ *      DRIVERNAME.
+ *
+ *      Robb Matzke, 2000-06-23
+ *      Added test to prevent coredump when the file could not be opened by
+ *      any driver.
+ *
+ *      Robb Matzke, 2000-06-23
+ *      Changed name from H5ToolsFopen() so it jives better with the names we
+ *      already have at the top of this source file.
+ *
+ *      Thomas Radke, 2000-09-12
+ *      Added Stream VFD to the driver[] array.
+ *
+ *      Bill Wendling, 2001-01-10
+ *      Changed macro behavior so that if we have a version other than 1.2.x
+ *      (i.e., > 1.2), then we do the drivers check.
+ *
+ *      Bill Wendling, 2001-07-30
+ *      Added DRIVER parameter so that the user can specify "try this driver"
+ *      instead of the default behaviour. If it fails to open the file with
+ *      that driver, this will fail completely (i.e., we won't try the other
+ *      drivers). We're assuming the user knows what they're doing. How UNIX
+ *      of us.
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5tools_fopen(const char *fname, unsigned flags, hid_t fapl, const char *driver,
+    char *drivername, size_t drivername_size)
+{
+    unsigned    drivernum;
+    hid_t       fid = FAIL;
+    hid_t       my_fapl = H5P_DEFAULT;
+
+    if (driver && *driver) {
+        /* Get the correct FAPL for the given driver */
+        if ((my_fapl = h5tools_get_fapl(fapl, driver, &drivernum)) < 0)
+            goto done;
+
+        H5E_BEGIN_TRY {
+            fid = H5Fopen(fname, flags, my_fapl);
+        } H5E_END_TRY;
+
+        if (fid == FAIL)
+            goto done;
+
+    }
+    else {
+        /* Try to open the file using each of the drivers */
+        for (drivernum = 0; drivernum < NUM_DRIVERS; drivernum++) {
+            /* Get the correct FAPL for the given driver */
+            if((my_fapl = h5tools_get_fapl(fapl, drivernames[drivernum], NULL)) < 0)
+                goto done;
+
+            H5E_BEGIN_TRY {
+                fid = H5Fopen(fname, flags, my_fapl);
+            } H5E_END_TRY;
+
+            if (fid != FAIL)
+                break;
+            else {
+                /* Close the FAPL */
+                H5Pclose(my_fapl);
+                my_fapl = H5P_DEFAULT;
+            } /* end else */
+        }
+    }
+
+    /* Save the driver name */
+    if (drivername && drivername_size) {
+        if (fid != FAIL) {
+            HDstrncpy(drivername, drivernames[drivernum], drivername_size);
+            drivername[drivername_size - 1] = '\0';
+        }
+        else {
+            /*no file opened*/
+            drivername[0] = '\0';
+        }
+    }
+
+done:
+    if(my_fapl != H5P_DEFAULT)
+        H5Pclose(my_fapl);
+
+    return fid;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Count the number of columns in a string.
+ * Description:
+ *      Count the number of columns in a string. This is the number of
+ *      characters in the string not counting line-control characters.
+ * Return:
+ *      On success, returns the width of the string. Otherwise this function
+ *      returns 0.
+ * Programmer:
+ *       Robb Matzke, Tuesday, April 27, 1999
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+static size_t
+h5tools_count_ncols(const char *s)
+{
+    register size_t i;
+
+    for (i = 0; *s; s++)
+        if (*s >= ' ')
+            i++;
+
+    return i;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_detect_vlen
+ *
+ * Purpose: Recursive check for any variable length data in given type.
+ *
+ * Return:
+ *    TRUE : type conatains any variable length data
+ *    FALSE : type doesn't contain any variable length data
+ *    Negative value: error occur
+ *
+ * Programmer: Jonathan Kim  March 18, 2011
+ *-------------------------------------------------------------------------
+ */
+htri_t
+h5tools_detect_vlen(hid_t tid)
+{
+    htri_t ret;
+
+    /* recursive detect any vlen data values in type (compound, array ...) */
+    ret = H5Tdetect_class(tid, H5T_VLEN);
+    if((ret == TRUE) || (ret < 0))
+        goto done;
+
+    /* recursive detect any vlen string in type (compound, array ...) */
+    ret = h5tools_detect_vlen_str(tid);
+    if((ret == TRUE) || (ret < 0))
+        goto done;
+
+done:
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_detect_vlen_str
+ *
+ * Purpose: Recursive check for variable length string of a datatype.
+ *
+ * Return:
+ *    TRUE : type conatains any variable length string
+ *    FALSE : type doesn't contain any variable length string
+ *    Negative value: error occur
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+h5tools_detect_vlen_str(hid_t tid)
+{
+    H5T_class_t tclass = -1;
+    htri_t ret = FALSE;
+
+    ret = H5Tis_variable_str(tid);
+    if((ret == TRUE) || (ret < 0))
+        goto done;
+
+    tclass = H5Tget_class(tid);
+    if(tclass == H5T_ARRAY || tclass == H5T_VLEN) {
+        hid_t btid = H5Tget_super(tid);
+
+        if(btid < 0) {
+            ret = (htri_t)btid;
+            goto done;
+        }
+        ret = h5tools_detect_vlen_str(btid);
+        if((ret == TRUE) || (ret < 0)) {
+            H5Tclose(btid);
+            goto done;
+        }
+    }
+    else if(tclass == H5T_COMPOUND) {
+        unsigned nmembs;
+        int snmembs = H5Tget_nmembers(tid);
+        unsigned u;
+
+        if(snmembs < 0) {
+            ret = FAIL;
+            goto done;
+        }
+        nmembs = (unsigned)snmembs;
+
+        for(u = 0; u < nmembs; u++) {
+            hid_t mtid = H5Tget_member_type(tid, u);
+
+            ret = h5tools_detect_vlen_str(mtid);
+            if((ret == TRUE) || (ret < 0)) {
+                H5Tclose(mtid);
+                goto done;
+            }
+            H5Tclose(mtid);
+        }
+    }
+
+done:
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Emit a simple prefix to STREAM.
+ * Description:
+ *      If /ctx->need_prefix/ is set then terminate the current line (if
+ *      applicable), calculate the prefix string, and display it at the start
+ *      of a line.
+ * Return:
+ *      None
+ * Programmer:
+ *      Robb Matzke, Monday, April 26, 1999
+ * Modifications:
+ *      Robb Matzke, 1999-09-29
+ * If a new prefix is printed then the current element number is set back
+ * to zero.
+ *      pvn, 2004-07-08
+ * Added support for printing array indices:
+ *  the indentation is printed before the prefix (printed one indentation
+ *  level before)
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
+                      h5tools_context_t *ctx, hsize_t elmtno, int secnum)
+{
+    h5tools_str_t prefix;
+    h5tools_str_t str; /*temporary for indentation */
+    size_t templength = 0;
+    unsigned u, indentlevel = 0;
+
+    if (stream == NULL)
+        return;
+
+    if (!ctx->need_prefix)
+        return;
+
+    HDmemset(&prefix, 0, sizeof(h5tools_str_t));
+    HDmemset(&str, 0, sizeof(h5tools_str_t));
+
+    /* Terminate previous line, if any */
+    if (ctx->cur_column) {
+        PUTSTREAM(OPT(info->line_suf, ""), stream);
+        HDputc('\n', stream);
+        PUTSTREAM(OPT(info->line_sep, ""), stream);
+    }
+
+    /* Calculate new prefix */
+    h5tools_str_prefix(&prefix, info, elmtno, ctx->ndims, ctx);
+
+    /* Write new prefix to output */
+    if (ctx->indent_level > 0)
+        indentlevel = ctx->indent_level;
+    else
+        /*
+         * This is because sometimes we don't print out all the header
+         * info for the data (like the tattr-2.ddl example). If that happens
+         * the ctx->indent_level is negative so we need to skip the above and
+         * just print out the default indent levels.
+         */
+        indentlevel = ctx->default_indent_level;
+
+    /* when printing array indices, print the indentation before the prefix
+       the prefix is printed one indentation level before */
+    if (info->pindex)
+        for (u = 0; u < indentlevel - 1; u++)
+            PUTSTREAM(h5tools_str_fmt(&str, (size_t)0, info->line_indent), stream);
+
+    if (elmtno == 0 && secnum == 0 && info->line_1st)
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_1st), stream);
+    else if (secnum && info->line_cont)
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_cont), stream);
+    else
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_pre), stream);
+
+    templength = h5tools_str_len(&prefix);
+
+    for (u = 0; u < indentlevel; u++)
+        /*we already made the indent for the array indices case */
+        if (!info->pindex) {
+            PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_indent), stream);
+            templength += h5tools_str_len(&prefix);
+        }
+        else {
+            /*we cannot count the prefix for the array indices case */
+            templength += h5tools_str_len(&str);
+        }
+
+    ctx->cur_column = ctx->prev_prefix_len = templength;
+    ctx->cur_elmt = 0;
+    ctx->need_prefix = 0;
+
+    /* Free string */
+    h5tools_str_close(&prefix);
+    h5tools_str_close(&str);
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Emit a simple prefix to STREAM.
+ * Description:
+ *      If /ctx->need_prefix/ is set then terminate the current line (if
+ *      applicable), calculate the prefix string, and display it at the start
+ *      of a line. Calls region specific function.
+ * Return:
+ *      None
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hsize_t elmtno, hsize_t *ptdata, int secnum)
+{
+    h5tools_str_t prefix;
+    h5tools_str_t str; /*temporary for indentation */
+    size_t templength = 0;
+    unsigned u, indentlevel = 0;
+
+    if (stream == NULL)
+        return;
+
+    if (!ctx->need_prefix)
+        return;
+
+    HDmemset(&prefix, 0, sizeof(h5tools_str_t));
+    HDmemset(&str, 0, sizeof(h5tools_str_t));
+
+    /* Terminate previous line, if any */
+    if (ctx->cur_column) {
+        PUTSTREAM(OPT(info->line_suf, ""), stream);
+        HDputc('\n', stream);
+        PUTSTREAM(OPT(info->line_sep, ""), stream);
+    }
+
+    /* Calculate new prefix */
+    h5tools_str_region_prefix(&prefix, info, elmtno, ptdata, ctx->ndims, ctx->p_max_idx, ctx);
+
+    /* Write new prefix to output */
+    if (ctx->indent_level > 0)
+        indentlevel = ctx->indent_level;
+    else
+        /*
+         * This is because sometimes we don't print out all the header
+         * info for the data (like the tattr-2.ddl example). If that happens
+         * the ctx->indent_level is negative so we need to skip the above and
+         * just print out the default indent levels.
+         */
+        indentlevel = ctx->default_indent_level;
+
+    /* when printing array indices, print the indentation before the prefix
+       the prefix is printed one indentation level before */
+    if (info->pindex)
+        for (u = 0; u < indentlevel - 1; u++)
+            PUTSTREAM(h5tools_str_fmt(&str, (size_t)0, info->line_indent), stream);
+
+    if (elmtno == 0 && secnum == 0 && info->line_1st)
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_1st), stream);
+    else if (secnum && info->line_cont)
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_cont), stream);
+    else
+        PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_pre), stream);
+
+    templength = h5tools_str_len(&prefix);
+
+    for (u = 0; u < indentlevel; u++)
+        /*we already made the indent for the array indices case */
+        if (!info->pindex) {
+            PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_indent), stream);
+            templength += h5tools_str_len(&prefix);
+        }
+        else {
+            /*we cannot count the prefix for the array indices case */
+            templength += h5tools_str_len(&str);
+        }
+
+    ctx->cur_column = ctx->prev_prefix_len = templength;
+    ctx->cur_elmt = 0;
+    ctx->need_prefix = 0;
+
+    /* Free string */
+    h5tools_str_close(&prefix);
+    h5tools_str_close(&str);
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Render an element to output STREAM.
+ * Description:
+ *      Prints the string buffer to the output STREAM. The string is
+ *      printed according to the format described in INFO. The CTX struct
+ *      contains context information shared between calls to this function.
+ *
+ * Return:
+ *      False if a dimension end is reached, otherwise true
+ *
+ * In/Out:
+ *      h5tools_context_t *ctx
+ *      h5tools_str_t *buffer
+ *      hsize_t *curr_pos
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      hsize_t curr_pos is the total data element position
+ *      size_t ncols
+ *      hsize_t local_elmt_counter is the local element loop counter
+ *      hsize_t elmt_count is the data element loop counter
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_render_element(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, h5tools_str_t *buffer, hsize_t *curr_pos,
+        size_t ncols, hsize_t local_elmt_counter, hsize_t elmt_counter)
+{
+    hbool_t  dimension_break = TRUE;
+    char    *s;
+    char    *section; /*a section of output  */
+    int      secnum; /*section sequence number */
+    int      multiline; /*datum was multiline  */
+
+    if (stream == NULL)
+        return dimension_break;
+
+    s = h5tools_str_fmt(buffer, (size_t)0, "%s");
+
+    /*
+     * If the element would split on multiple lines if printed at our
+     * current location...
+     */
+    if (info->line_multi_new == 1 &&
+        (ctx->cur_column + h5tools_count_ncols(s) +
+                HDstrlen(OPT(info->elmt_suf2, " ")) +
+                HDstrlen(OPT(info->line_suf, ""))) > ncols) {
+        if (ctx->prev_multiline) {
+            /*
+             * ... and the previous element also occupied more than one
+             * line, then start this element at the beginning of a line.
+             */
+            ctx->need_prefix = TRUE;
+        }
+        else if ((ctx->prev_prefix_len + h5tools_count_ncols(s) +
+                HDstrlen(OPT(info->elmt_suf2, " ")) +
+                HDstrlen(OPT(info->line_suf, ""))) <= ncols) {
+            /*
+             * ...but *could* fit on one line otherwise, then we
+             * should end the current line and start this element on its
+             * own line.
+             */
+            ctx->need_prefix = TRUE;
+        }
+    }
+
+    /*
+     * We need to break after each row of a dimension---> we should
+     * break at the end of the each last dimension well that is the
+     * way the dumper did it before
+     */
+    if (info->arr_linebreak && ctx->cur_elmt) {
+        if (ctx->size_last_dim && (ctx->cur_elmt % ctx->size_last_dim) == 0)
+            ctx->need_prefix = TRUE;
+
+        if (elmt_counter == ctx->size_last_dim) {
+            ctx->need_prefix = TRUE;
+            dimension_break = FALSE;
+        }
+    }
+
+    /*
+     * If the previous element occupied multiple lines and this element
+     * is too long to fit on a line then start this element at the
+     * beginning of the line.
+     */
+    if (info->line_multi_new == 1 &&
+            ctx->prev_multiline &&
+            (ctx->cur_column +
+            h5tools_count_ncols(s) +
+            HDstrlen(OPT(info->elmt_suf2, " ")) +
+            HDstrlen(OPT(info->line_suf, ""))) > ncols)
+        ctx->need_prefix = TRUE;
+
+    /*
+     * If too many elements have already been printed then we need to
+     * start a new line.
+     */
+    if (info->line_per_line > 0 && ctx->cur_elmt >= info->line_per_line)
+        ctx->need_prefix = TRUE;
+
+    /*
+     * Each OPTIONAL_LINE_BREAK embedded in the rendered string can cause
+     * the data to split across multiple lines.  We display the sections
+     * one-at a time.
+     */
+    multiline = 0;
+    for (secnum = 0, multiline = 0;
+             (section = HDstrtok(secnum ? NULL : s, OPTIONAL_LINE_BREAK));
+             secnum++) {
+        /*
+         * If the current section plus possible suffix and end-of-line
+         * information would cause the output to wrap then we need to
+         * start a new line.
+         */
+
+        /*
+         * check for displaying prefix for each section
+         */
+        if ( (ctx->cur_column + HDstrlen(section) +
+                HDstrlen(OPT(info->elmt_suf2, " ")) +
+                HDstrlen(OPT(info->line_suf, ""))) > ncols)
+            ctx->need_prefix = 1;
+
+        /*
+         * Print the prefix or separate the beginning of this element
+         * from the previous element.
+         */
+        if (ctx->need_prefix) {
+            if (secnum)
+                multiline++;
+
+            /* pass to the prefix in h5tools_simple_prefix the total
+             * position instead of the current stripmine position i;
+             * this is necessary to print the array indices
+             */
+            *curr_pos = ctx->sm_pos + local_elmt_counter;
+
+            h5tools_simple_prefix(stream, info, ctx, *curr_pos, secnum);
+        }
+        else if ((local_elmt_counter || ctx->continuation) && secnum == 0) {
+            PUTSTREAM(OPT(info->elmt_suf2, " "), stream);
+            ctx->cur_column += HDstrlen(OPT(info->elmt_suf2, " "));
+        }
+
+        /* Print the section */
+        PUTSTREAM(section, stream);
+        ctx->cur_column += HDstrlen(section);
+    }
+
+    ctx->prev_multiline = multiline;
+    return dimension_break;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Render a region element to output STREAM.
+ * Description:
+ *      Prints the string buffer to the output STREAM. The string is
+ *      printed according to the format described in INFO. The CTX struct
+ *      contains context information shared between calls to this function.
+ *
+ * Return:
+ *      False if a dimension end is reached, otherwise true
+ *
+ * In/Out:
+ *      h5tools_context_t *ctx
+ *      h5tools_str_t *buffer
+ *      hsize_t *curr_pos
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      hsize_t curr_pos is the total data element position
+ *      size_t ncols
+ *      hsize_t *ptdata
+ *      hsize_t local_elmt_counter is the local element loop counter
+ *      hsize_t elmt_count is the data element loop counter
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_render_region_element(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, h5tools_str_t *buffer, hsize_t *curr_pos,
+        size_t ncols, hsize_t *ptdata, hsize_t local_elmt_counter, hsize_t elmt_counter)
+{
+    hbool_t  dimension_break = TRUE;
+    char    *s;
+    char    *section; /*a section of output  */
+    int      secnum; /*section sequence number */
+    int      multiline; /*datum was multiline  */
+
+    s = h5tools_str_fmt(buffer, (size_t)0, "%s");
+
+    /*
+     * If the element would split on multiple lines if printed at our
+     * current location...
+     */
+    if (info->line_multi_new == 1 &&
+            (ctx->cur_column + h5tools_count_ncols(s) +
+                    HDstrlen(OPT(info->elmt_suf2, " ")) +
+                    HDstrlen(OPT(info->line_suf, ""))) > ncols) {
+        if (ctx->prev_multiline) {
+            /*
+             * ... and the previous element also occupied more than one
+             * line, then start this element at the beginning of a line.
+             */
+            ctx->need_prefix = TRUE;
+        }
+        else if ((ctx->prev_prefix_len + h5tools_count_ncols(s) +
+                HDstrlen(OPT(info->elmt_suf2, " ")) +
+                HDstrlen(OPT(info->line_suf, ""))) <= ncols) {
+            /*
+             * ...but *could* fit on one line otherwise, then we
+             * should end the current line and start this element on its
+             * own line.
+             */
+            ctx->need_prefix = TRUE;
+        }
+    }
+
+    /*
+     * We need to break after each row of a dimension---> we should
+     * break at the end of the each last dimension well that is the
+     * way the dumper did it before
+     */
+    if (info->arr_linebreak && ctx->cur_elmt) {
+        if (ctx->size_last_dim && (ctx->cur_elmt % ctx->size_last_dim) == 0)
+            ctx->need_prefix = TRUE;
+
+        if (elmt_counter == ctx->size_last_dim) {
+            ctx->need_prefix = TRUE;
+            dimension_break = FALSE;
+        }
+    }
+
+    /*
+     * If the previous element occupied multiple lines and this element
+     * is too long to fit on a line then start this element at the
+     * beginning of the line.
+     */
+    if (info->line_multi_new == 1 &&
+            ctx->prev_multiline &&
+            (ctx->cur_column +
+            h5tools_count_ncols(s) +
+            HDstrlen(OPT(info->elmt_suf2, " ")) +
+            HDstrlen(OPT(info->line_suf, ""))) > ncols)
+        ctx->need_prefix = TRUE;
+
+    /*
+     * If too many elements have already been printed then we need to
+     * start a new line.
+     */
+    if (info->line_per_line > 0 && ctx->cur_elmt >= info->line_per_line)
+        ctx->need_prefix = TRUE;
+
+    /*
+     * Each OPTIONAL_LINE_BREAK embedded in the rendered string can cause
+     * the data to split across multiple lines.  We display the sections
+     * one-at a time.
+     */
+    multiline = 0;
+    for (secnum = 0, multiline = 0; (section = HDstrtok(secnum ? NULL : s,
+            OPTIONAL_LINE_BREAK)); secnum++) {
+        /*
+         * If the current section plus possible suffix and end-of-line
+         * information would cause the output to wrap then we need to
+         * start a new line.
+         */
+
+        /*
+         * Added the info->skip_first because the dumper does not want
+         * this check to happen for the first line
+         */
+        if ((!info->skip_first || local_elmt_counter) &&
+                (ctx->cur_column +
+                        HDstrlen(section) +
+                        HDstrlen(OPT(info->elmt_suf2, " ")) +
+                        HDstrlen(OPT(info->line_suf, ""))) > ncols)
+            ctx->need_prefix = 1;
+
+        /*
+         * Print the prefix or separate the beginning of this element
+         * from the previous element.
+         */
+        if (ctx->need_prefix) {
+            if (secnum)
+                multiline++;
+
+            /* pass to the prefix in h5tools_simple_prefix the total
+             * position instead of the current stripmine position i;
+             * this is necessary to print the array indices
+             */
+            *curr_pos = ctx->sm_pos + local_elmt_counter;
+
+            h5tools_region_simple_prefix(stream, info, ctx, local_elmt_counter, ptdata, secnum);
+        }
+        else if ((local_elmt_counter || ctx->continuation) && secnum == 0) {
+            PUTSTREAM(OPT(info->elmt_suf2, " "), stream);
+            ctx->cur_column += HDstrlen(OPT(info->elmt_suf2, " "));
+        }
+
+        /* Print the section */
+        PUTSTREAM(section, stream);
+        ctx->cur_column += HDstrlen(section);
+    }
+
+    ctx->prev_multiline = multiline;
+    return dimension_break;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    init_acc_pos
+ *
+ * Purpose:     initialize accumulator and matrix position
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+void
+init_acc_pos(h5tools_context_t *ctx, hsize_t *dims)
+{
+    int i;
+    unsigned j;
+
+    HDassert(ctx->ndims);
+
+    ctx->acc[ctx->ndims - 1] = 1;
+    for (i = ((int)ctx->ndims - 2); i >= 0; i--)
+        ctx->acc[i] = ctx->acc[i + 1] * dims[i + 1];
+    for (j = 0; j < ctx->ndims; j++)
+        ctx->pos[j] = 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: render_bin_output
+ *
+ * Purpose: Write one element of memory buffer to a binary file stream
+ *
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ *-------------------------------------------------------------------------
+ */
+int
+render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem,  hsize_t block_nelmts)
+{
+    HERR_INIT(int, SUCCEED)
+    unsigned char     *mem  = (unsigned char*)_mem;
+    size_t             size;   /* datum size */
+    hsize_t            block_index;
+    H5T_class_t        type_class;
+
+    if((size = H5Tget_size(tid)) == 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+    if((type_class = H5Tget_class(tid)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_class failed");
+
+    switch (type_class) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_ENUM:
+            block_index = block_nelmts * size;
+            while(block_index > 0) {
+                size_t bytes_in        = 0;    /* # of bytes to write  */
+                size_t bytes_wrote     = 0;    /* # of bytes written   */
+
+                if(block_index > sizeof(size_t))
+                    bytes_in = sizeof(size_t);
+                else
+                    bytes_in = (size_t)block_index;
+
+                bytes_wrote = HDfwrite(mem, 1, bytes_in, stream);
+
+                if(bytes_wrote != bytes_in || (0 == bytes_wrote && HDferror(stream)))
+                    H5E_THROW(FAIL, H5E_tools_min_id_g, "fwrite failed");
+
+                block_index -= (hsize_t)bytes_wrote;
+                mem = mem + bytes_wrote;
+            }
+            break;
+        case H5T_STRING:
+            {
+                unsigned int    i;
+                H5T_str_t       pad;
+                char           *s;
+                unsigned char   tempuchar;
+
+                pad = H5Tget_strpad(tid);
+
+                for (block_index = 0; block_index < block_nelmts; block_index++) {
+                    mem = ((unsigned char*)_mem) + block_index * size;
+
+                    if (H5Tis_variable_str(tid)) {
+                        s = *(char**) mem;
+                        if (s != NULL)
+                            size = HDstrlen(s);
+                        else
+                            H5E_THROW(FAIL, H5E_tools_min_id_g, "NULL string");
+                    }
+                    else {
+                        s = (char *) mem;
+                    }
+                    for (i = 0; i < size && (s[i] || pad != H5T_STR_NULLTERM); i++) {
+                        HDmemcpy(&tempuchar, &s[i], sizeof(unsigned char));
+                        if (1 != HDfwrite(&tempuchar, sizeof(unsigned char), 1, stream))
+                            H5E_THROW(FAIL, H5E_tools_min_id_g, "fwrite failed");
+                    } /* i */
+                } /* for (block_index = 0; block_index < block_nelmts; block_index++) */
+            }
+            break;
+        case H5T_COMPOUND:
+            {
+                int snmembs;
+                unsigned nmembs;
+
+                if((snmembs = H5Tget_nmembers(tid)) < 0)
+                    H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers of compound failed");
+                nmembs = (unsigned)snmembs;
+
+                for (block_index = 0; block_index < block_nelmts; block_index++) {
+                    unsigned j;
+
+                    mem = ((unsigned char*)_mem) + block_index * size;
+                    for (j = 0; j < nmembs; j++) {
+                        hid_t    memb;
+                        size_t   offset;
+
+                        offset = H5Tget_member_offset(tid, j);
+                        memb   = H5Tget_member_type(tid, j);
+
+                        if (render_bin_output(stream, container, memb, mem + offset, 1) < 0) {
+                            H5Tclose(memb);
+                            H5E_THROW(FAIL, H5E_tools_min_id_g, "render_bin_output of compound member failed");
+                        }
+
+                        H5Tclose(memb);
+                    }
+                }
+            }
+            break;
+        case H5T_ARRAY:
+            {
+                int     k, ndims;
+                hsize_t dims[H5S_MAX_RANK], temp_nelmts, nelmts;
+                hid_t   memb;
+
+                /* get the array's base datatype for each element */
+                memb = H5Tget_super(tid);
+                ndims = H5Tget_array_ndims(tid);
+                H5Tget_array_dims2(tid, dims);
+                HDassert(ndims >= 1 && ndims <= H5S_MAX_RANK);
+
+                /* calculate the number of array elements */
+                for (k = 0, nelmts = 1; k < ndims; k++) {
+                    temp_nelmts = nelmts;
+                    temp_nelmts *= dims[k];
+                    nelmts = (size_t) temp_nelmts;
+                }
+
+                for (block_index = 0; block_index < block_nelmts; block_index++) {
+                    mem = ((unsigned char*)_mem) + block_index * size;
+                    /* dump the array element */
+                    if (render_bin_output(stream, container, memb, mem, nelmts) < 0) {
+                        H5Tclose(memb);
+                        H5E_THROW(FAIL, H5E_tools_min_id_g, "render_bin_output failed");
+                    }
+                }
+                H5Tclose(memb);
+            }
+            break;
+        case H5T_VLEN:
+            {
+                hsize_t      nelmts;
+                hid_t        memb;
+
+                /* get the VL sequences's base datatype for each element */
+                memb = H5Tget_super(tid);
+
+                for (block_index = 0; block_index < block_nelmts; block_index++) {
+                    mem = ((unsigned char*)_mem) + block_index * size;
+                    /* Get the number of sequence elements */
+                    nelmts = ((hvl_t *) mem)->len;
+
+                    /* dump the array element */
+                    if (render_bin_output(stream, container, memb, ((char *) (((hvl_t *) mem)->p)), nelmts) < 0) {
+                        H5Tclose(memb);
+                        H5E_THROW(FAIL, H5E_tools_min_id_g, "render_bin_output failed");
+                    }
+                }
+                H5Tclose(memb);
+            }
+            break;
+        case H5T_REFERENCE:
+            {
+                if (size == H5R_DSET_REG_REF_BUF_SIZE) {
+                    /* if (H5Tequal(tid, H5T_STD_REF_DSETREG)) */
+                    if (region_output) {
+                        /* region data */
+                        hid_t   region_id, region_space;
+                        H5S_sel_type region_type;
+
+                        for (block_index = 0; block_index < block_nelmts; block_index++) {
+                            mem = ((unsigned char*)_mem) + block_index * size;
+                            region_id = H5Rdereference(container, H5R_DATASET_REGION, mem);
+                            if (region_id >= 0) {
+                                region_space = H5Rget_region(container, H5R_DATASET_REGION, mem);
+                                if (region_space >= 0) {
+                                    region_type = H5Sget_select_type(region_space);
+                                    if(region_type == H5S_SEL_POINTS)
+                                        render_bin_output_region_points(region_space, region_id, stream, container);
+                                    else
+                                        render_bin_output_region_blocks(region_space, region_id, stream, container);
+                                    H5Sclose(region_space);
+                                } /* end if (region_space >= 0) */
+                                H5Dclose(region_id);
+                            } /* end if (region_id >= 0) */
+                        }
+                    } /* end if (region_output... */
+                }
+                else if (size == H5R_OBJ_REF_BUF_SIZE) {
+                    /* if (H5Tequal(tid, H5T_STD_REF_OBJ)) */
+                    ;
+                }
+            }
+            break;
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+            for (block_index = 0; block_index < block_nelmts; block_index++) {
+                mem = ((unsigned char*)_mem) + block_index * size;
+                if (size != HDfwrite(mem, sizeof(char), size, stream))
+                    H5E_THROW(FAIL, H5E_tools_min_id_g, "fwrite failed");
+            } /* end for */
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "bad type class");
+            break;
+    } /* end switch */
+
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print the data values from a dataset referenced by region blocks.
+ *
+ * Description:
+ *      This is a special case subfunction to print the data in a region reference of type blocks.
+ *
+ * Return:
+ *      The function returns FAIL if there was an error, otherwise SUCEED
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+render_bin_output_region_data_blocks(hid_t region_id, FILE *stream,
+    hid_t container, unsigned ndims, hid_t type_id, hsize_t nblocks, hsize_t *ptdata)
+{
+    hsize_t     *dims1 = NULL;
+    hsize_t     *start = NULL;
+    hsize_t     *count = NULL;
+    hsize_t      numelem;
+    hsize_t      total_size[H5S_MAX_RANK];
+    unsigned     jndx;
+    size_t       type_size;
+    hid_t        mem_space = -1;
+    void        *region_buf = NULL;
+    hsize_t      blkndx;
+    hid_t        sid1 = -1;
+    int          ret_value = SUCCEED;
+
+    /* Get the dataspace of the dataset */
+    if((sid1 = H5Dget_space(region_id)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+
+    /* Allocate space for the dimension array */
+    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
+
+    /* find the dimensions of each data space from the block coordinates */
+    numelem = 1;
+    for (jndx = 0; jndx < ndims; jndx++) {
+        dims1[jndx] = ptdata[jndx + ndims] - ptdata[jndx] + 1;
+        numelem = dims1[jndx] * numelem;
+    }
+
+    /* Create dataspace for reading buffer */
+    if((mem_space = H5Screate_simple((int)ndims, dims1, NULL)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
+
+    if((type_size = H5Tget_size(type_id)) == 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+    if((region_buf = HDmalloc(type_size * (size_t)numelem)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate region buffer");
+
+    /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */
+    /*          1   2        n      1   2        n                                       */
+    if((start = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for start");
+
+    if((count = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for count");
+
+    for (blkndx = 0; blkndx < nblocks; blkndx++) {
+        for (jndx = 0; jndx < ndims; jndx++) {
+            start[jndx] = ptdata[jndx + blkndx * ndims * 2];
+            count[jndx] = dims1[jndx];
+        }
+
+        if(H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+
+        if(H5Dread(region_id, type_id, mem_space, sid1, H5P_DEFAULT, region_buf) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+
+        if(H5Sget_simple_extent_dims(mem_space, total_size, NULL) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+        if(render_bin_output(stream, container, type_id, (char*)region_buf, numelem) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "render_bin_output of data region failed");
+        /* Render the region data element end */
+    } /* end for (blkndx = 0; blkndx < nblocks; blkndx++) */
+
+ done:
+    HDfree(start);
+    HDfree(count);
+    HDfree(region_buf);
+    HDfree(dims1);
+
+    if(H5Sclose(mem_space) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+    if(H5Sclose(sid1) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print some values from a dataset referenced by region blocks.
+ *
+ * Description:
+ *      This is a special case subfunction to dump a region reference using blocks.
+ *
+ * Return:
+ *      The function returns False if ERROR, otherwise True
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
+        FILE *stream, hid_t container)
+{
+    HERR_INIT(hbool_t, TRUE)
+    hssize_t     snblocks;
+    hsize_t      nblocks;
+    hsize_t      alloc_size;
+    hsize_t     *ptdata;
+    int          sndims;
+    unsigned     ndims;
+    hid_t        dtype = -1;
+    hid_t        type_id = -1;
+
+    if((snblocks = H5Sget_select_hyper_nblocks(region_space)) <= 0)
+        H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_select_hyper_nblocks failed");
+    nblocks = (hsize_t)snblocks;
+
+    /* Print block information */
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+        H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
+
+    alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
+    HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
+    if((ptdata = (hsize_t*) HDmalloc((size_t) alloc_size)) == NULL)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
+
+    if(H5Sget_select_hyper_blocklist(region_space, (hsize_t) 0, nblocks, ptdata) < 0)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Rget_select_hyper_blocklist failed");
+
+    if((dtype = H5Dget_type(region_id)) < 0)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Dget_type failed");
+    if((type_id = H5Tget_native_type(dtype, H5T_DIR_DEFAULT)) < 0)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Tget_native_type failed");
+
+    render_bin_output_region_data_blocks(region_id, stream, container, ndims,
+            type_id, nblocks, ptdata);
+
+ done:
+    HDfree(ptdata);
+
+    if(type_id > 0 && H5Tclose(type_id) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    if(dtype > 0 && H5Tclose(dtype) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    H5_LEAVE(TRUE)
+
+ CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print the data values from a dataset referenced by region points.
+ *
+ * Description:
+ *      This is a special case subfunction to print the data in a region reference of type points.
+ *
+ * Return:
+ *      The function returns FAIL on error, otherwise SUCCEED
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      size_t ncols
+ *      int ndims is the number of dimensions of the region element
+ *      hssize_t npoints is the number of points in the region
+ *-------------------------------------------------------------------------
+ */
+int
+render_bin_output_region_data_points(hid_t region_space, hid_t region_id,
+        FILE *stream, hid_t container,
+        unsigned ndims, hid_t type_id, hsize_t npoints)
+{
+    hsize_t *dims1 = NULL;
+    size_t   type_size;
+    hid_t    mem_space = -1;
+    void    *region_buf = NULL;
+    int      ret_value = SUCCEED;
+
+    if((type_size = H5Tget_size(type_id)) == 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+    if((region_buf = HDmalloc(type_size * (size_t)npoints)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for region");
+
+    /* Allocate space for the dimension array */
+    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
+
+    dims1[0] = npoints;
+    if((mem_space = H5Screate_simple(1, dims1, NULL)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
+
+    if(H5Dread(region_id, type_id, mem_space, region_space, H5P_DEFAULT, region_buf) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+    if(H5Sget_simple_extent_dims(region_space, dims1, NULL) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+    if(render_bin_output(stream, container, type_id, (char*)region_buf, npoints) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "render_bin_output of data points failed");
+
+ done:
+    HDfree(region_buf);
+    HDfree(dims1);
+
+    if(H5Sclose(mem_space) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print some values from a dataset referenced by region points.
+ *
+ * Description:
+ *      This is a special case subfunction to dump a region reference using points.
+ *
+ * Return:
+ *      The function returns False if the last dimension has been reached, otherwise True
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+render_bin_output_region_points(hid_t region_space, hid_t region_id,
+        FILE *stream, hid_t container)
+{
+    HERR_INIT(hbool_t, TRUE)
+    hssize_t snpoints;
+    hsize_t  npoints;
+    int      sndims;
+    unsigned ndims;
+    hid_t    dtype = -1;
+    hid_t    type_id = -1;
+
+    if((snpoints = H5Sget_select_elem_npoints(region_space)) <= 0)
+        H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_select_elem_npoints failed");
+    npoints = (hsize_t)snpoints;
+
+    /* Allocate space for the dimension array */
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+        H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
+
+    if((dtype = H5Dget_type(region_id)) < 0)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Dget_type failed");
+
+    if((type_id = H5Tget_native_type(dtype, H5T_DIR_DEFAULT)) < 0)
+        HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Tget_native_type failed");
+
+    render_bin_output_region_data_points(region_space, region_id,
+            stream, container, ndims, type_id, npoints);
+
+ done:
+    if(type_id > 0 && H5Tclose(type_id) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    if(dtype > 0 && H5Tclose(dtype) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    H5_LEAVE(ret_value)
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_is_zero
+ *
+ * Purpose: Determines if memory is initialized to all zero bytes.
+ *
+ * Return:  TRUE if all bytes are zero; FALSE otherwise
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_is_zero(const void *_mem, size_t size)
+{
+    const unsigned char *mem = (const unsigned char *) _mem;
+
+    while (size-- > 0)
+        if (mem[size])
+            return FALSE;
+
+    return TRUE;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_is_obj_same
+ *
+ * Purpose: Check if two given object IDs or link names point to the same object.
+ *
+ * Parameters:
+ *             hid_t loc_id1: location of the first object
+ *             char *name1:   link name of the first object.
+ *                             Use "." or NULL if loc_id1 is the object to be compared.
+ *             hid_t loc_id2: location of the second object
+ *             char *name1:   link name of the first object.
+ *                             Use "." or NULL if loc_id2 is the object to be compared.
+ *
+ * Return:  TRUE if it is the same object; FALSE otherwise.
+ *
+ * Programmer: Peter Cao
+ *             4/27/2011
+  *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_is_obj_same(hid_t loc_id1, const char *name1,
+                        hid_t loc_id2, const char *name2)
+{
+    H5O_info_t oinfo1,  oinfo2;
+    hbool_t ret_val = 0;
+
+    if ( name1 && HDstrcmp(name1, "."))
+      H5Oget_info_by_name(loc_id1, name1, &oinfo1, H5P_DEFAULT);
+    else
+      H5Oget_info(loc_id1, &oinfo1);
+
+    if ( name2 && HDstrcmp(name2, "."))
+      H5Oget_info_by_name(loc_id2, name2, &oinfo2, H5P_DEFAULT);
+    else
+      H5Oget_info(loc_id2, &oinfo2);
+
+    if (oinfo1.fileno == oinfo2.fileno && oinfo1.addr==oinfo2.addr)
+      ret_val = 1;
+
+    return ret_val;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools.h
new file mode 100644
index 0000000..b548100
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools.h
@@ -0,0 +1,605 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, July 23, 1998
+ *
+ * Purpose:     Support functions for the various tools.
+ */
+#ifndef H5TOOLS_H__
+#define H5TOOLS_H__
+
+#include "hdf5.h"
+#include "h5tools_error.h"
+
+#define ESCAPE_HTML             1
+#define OPT(X,S)                ((X) ? (X) : (S))
+#define OPTIONAL_LINE_BREAK     "\001"  /* Special strings embedded in the output */
+#define START_OF_DATA       0x0001
+#define END_OF_DATA     0x0002
+
+/* format for hsize_t */
+#define HSIZE_T_FORMAT   "%" H5_PRINTF_LL_WIDTH "u"
+
+#define H5TOOLS_DUMP_MAX_RANK     H5S_MAX_RANK
+
+/* Stream macros */
+#define FLUSHSTREAM(S)           if(S != NULL) HDfflush(S)
+#define PRINTSTREAM(S, F, ...)   if(S != NULL) HDfprintf(S, F, __VA_ARGS__)
+#define PRINTVALSTREAM(S, V)   if(S != NULL) HDfprintf(S, V)
+#define PUTSTREAM(X,S)          do { if(S != NULL) HDfputs(X, S); } while(0)
+
+/*
+ * Strings for output - these were duplicated from the h5dump.h
+ * file in order to support region reference data display
+ */
+#define ATTRIBUTE       "ATTRIBUTE"
+#define BLOCK           "BLOCK"
+#define SUPER_BLOCK     "SUPER_BLOCK"
+#define COMPRESSION     "COMPRESSION"
+#define CONCATENATOR    "//"
+#define COMPLEX         "COMPLEX"
+#define COUNT           "COUNT"
+#define CSET            "CSET"
+#define CTYPE           "CTYPE"
+#define DATA            "DATA"
+#define DATASPACE       "DATASPACE"
+#define EXTERNAL        "EXTERNAL"
+#define FILENO          "FILENO"
+#define HARDLINK        "HARDLINK"
+#define NLINK           "NLINK"
+#define OBJID           "OBJECTID"
+#define OBJNO           "OBJNO"
+#define S_SCALAR        "SCALAR"
+#define S_SIMPLE        "SIMPLE"
+#define S_NULL          "NULL"
+#define SOFTLINK        "SOFTLINK"
+#define EXTLINK         "EXTERNAL_LINK"
+#define UDLINK          "USERDEFINED_LINK"
+#define START           "START"
+#define STRIDE          "STRIDE"
+#define STRSIZE         "STRSIZE"
+#define STRPAD          "STRPAD"
+#define SUBSET          "SUBSET"
+#define FILTERS         "FILTERS"
+#define DEFLATE         "COMPRESSION DEFLATE"
+#define DEFLATE_LEVEL   "LEVEL"
+#define SHUFFLE         "PREPROCESSING SHUFFLE"
+#define FLETCHER32      "CHECKSUM FLETCHER32"
+#define SZIP            "COMPRESSION SZIP"
+#define NBIT            "COMPRESSION NBIT"
+#define SCALEOFFSET     "COMPRESSION SCALEOFFSET"
+#define SCALEOFFSET_MINBIT            "MIN BITS"
+#define STORAGE_LAYOUT  "STORAGE_LAYOUT"
+#define CONTIGUOUS      "CONTIGUOUS"
+#define COMPACT         "COMPACT"
+#define CHUNKED         "CHUNKED"
+#define EXTERNAL_FILE   "EXTERNAL_FILE"
+#define FILLVALUE       "FILLVALUE"
+#define FILE_CONTENTS   "FILE_CONTENTS"
+#define PACKED_BITS     "PACKED_BITS"
+#define PACKED_OFFSET   "OFFSET"
+#define PACKED_LENGTH   "LENGTH"
+
+#define BEGIN           "{"
+#define END             "}"
+
+/*
+ * dump structure for output - this was duplicated from the h5dump.h
+ * file in order to support region reference data display
+ */
+typedef struct h5tools_dump_header_t {
+    const char *name;
+    const char *filebegin;
+    const char *fileend;
+    const char *bootblockbegin;
+    const char *bootblockend;
+    const char *groupbegin;
+    const char *groupend;
+    const char *datasetbegin;
+    const char *datasetend;
+    const char *attributebegin;
+    const char *attributeend;
+    const char *datatypebegin;
+    const char *datatypeend;
+    const char *dataspacebegin;
+    const char *dataspaceend;
+    const char *databegin;
+    const char *dataend;
+    const char *softlinkbegin;
+    const char *softlinkend;
+    const char *extlinkbegin;
+    const char *extlinkend;
+    const char *udlinkbegin;
+    const char *udlinkend;
+    const char *subsettingbegin;
+    const char *subsettingend;
+    const char *startbegin;
+    const char *startend;
+    const char *stridebegin;
+    const char *strideend;
+    const char *countbegin;
+    const char *countend;
+    const char *blockbegin;
+    const char *blockend;
+
+    const char *fileblockbegin;
+    const char *fileblockend;
+    const char *bootblockblockbegin;
+    const char *bootblockblockend;
+    const char *groupblockbegin;
+    const char *groupblockend;
+    const char *datasetblockbegin;
+    const char *datasetblockend;
+    const char *attributeblockbegin;
+    const char *attributeblockend;
+    const char *datatypeblockbegin;
+    const char *datatypeblockend;
+    const char *dataspaceblockbegin;
+    const char *dataspaceblockend;
+    const char *datablockbegin;
+    const char *datablockend;
+    const char *softlinkblockbegin;
+    const char *softlinkblockend;
+    const char *extlinkblockbegin;
+    const char *extlinkblockend;
+    const char *udlinkblockbegin;
+    const char *udlinkblockend;
+    const char *strblockbegin;
+    const char *strblockend;
+    const char *enumblockbegin;
+    const char *enumblockend;
+    const char *structblockbegin;
+    const char *structblockend;
+    const char *vlenblockbegin;
+    const char *vlenblockend;
+    const char *subsettingblockbegin;
+    const char *subsettingblockend;
+    const char *startblockbegin;
+    const char *startblockend;
+    const char *strideblockbegin;
+    const char *strideblockend;
+    const char *countblockbegin;
+    const char *countblockend;
+    const char *blockblockbegin;
+    const char *blockblockend;
+
+    const char *dataspacedescriptionbegin;
+    const char *dataspacedescriptionend;
+    const char *dataspacedimbegin;
+    const char *dataspacedimend;
+
+} h5tools_dump_header_t;
+
+/*
+ * Information about how to format output.
+ */
+typedef struct h5tool_format_t {
+    /*
+     * Fields associated with formatting numeric data.  If a datatype matches
+     * multiple formats based on its size, then the first applicable format
+     * from this list is used. However, if `raw' is non-zero then dump all
+     * data in hexadecimal format without translating from what appears on
+     * disk.
+     *
+     *   raw:        If set then print all data as hexadecimal without
+     *               performing any conversion from disk.
+     *
+     *   fmt_raw:    The printf() format for each byte of raw data. The
+     *               default is `%02x'.
+     *
+     *   fmt_int:    The printf() format to use when rendering data which is
+     *               typed `int'. The default is `%d'.
+     *
+     *   fmt_uint:   The printf() format to use when rendering data which is
+     *               typed `unsigned'. The default is `%u'.
+     *
+     *   fmt_schar:  The printf() format to use when rendering data which is
+     *               typed `signed char'. The default is `%d'. This format is
+     *               used ony if the `ascii' field is zero.
+     *
+     *   fmt_uchar:  The printf() format to use when rendering data which is
+     *               typed `unsigned char'. The default is `%u'. This format
+     *               is used only if the `ascii' field is zero.
+     *
+     *   fmt_short:  The printf() format to use when rendering data which is
+     *               typed `short'. The default is `%d'.
+     *
+     *   fmt_ushort: The printf() format to use when rendering data which is
+     *               typed `unsigned short'. The default is `%u'.
+     *
+     *   fmt_long:   The printf() format to use when rendering data which is
+     *               typed `long'. The default is `%ld'.
+     *
+     *   fmt_ulong:  The printf() format to use when rendering data which is
+     *               typed `unsigned long'. The default is `%lu'.
+     *
+     *   fmt_llong:  The printf() format to use when rendering data which is
+     *               typed `long long'. The default depends on what printf()
+     *               format is available to print this datatype.
+     *
+     *   fmt_ullong: The printf() format to use when rendering data which is
+     *               typed `unsigned long long'. The default depends on what
+     *               printf() format is available to print this datatype.
+     *
+     *   fmt_double: The printf() format to use when rendering data which is
+     *               typed `double'. The default is `%g'.
+     *
+     *   fmt_float:  The printf() format to use when rendering data which is
+     *               typed `float'. The default is `%g'.
+     *
+     *   ascii:      If set then print 1-byte integer values as an ASCII
+     *               character (no quotes).  If the character is one of the
+     *               standard C escapes then print the escaped version.  If
+     *               the character is unprintable then print a 3-digit octal
+     *               escape.  If `ascii' is zero then then 1-byte integers are
+     *               printed as numeric values.  The default is zero.
+     *
+     *   str_locale: Determines how strings are printed. If zero then strings
+     *               are printed like in C except. If set to ESCAPE_HTML then
+     *               strings are printed using HTML encoding where each
+     *               character not in the class [a-zA-Z0-9] is substituted
+     *               with `%XX' where `X' is a hexadecimal digit.
+     *
+     *   str_repeat: If set to non-zero then any character value repeated N
+     *               or more times is printed as 'C'*N
+     *
+     * Numeric data is also subject to the formats for individual elements.
+     */
+    hbool_t     raw;
+    const char  *fmt_raw;
+    const char  *fmt_int;
+    const char  *fmt_uint;
+    const char  *fmt_schar;
+    const char  *fmt_uchar;
+    const char  *fmt_short;
+    const char  *fmt_ushort;
+    const char  *fmt_long;
+    const char  *fmt_ulong;
+    const char  *fmt_llong;
+    const char  *fmt_ullong;
+    const char  *fmt_double;
+    const char  *fmt_float;
+    int         ascii;
+    int         str_locale;
+    unsigned    str_repeat;
+
+    /*
+     * Fields associated with compound array members.
+     *
+     *   pre:       A string to print at the beginning of each array. The
+     *              default value is the left square bracket `['.
+     *
+     *   sep:       A string to print between array values.  The default
+     *              value is a ",\001" ("\001" indicates an optional line
+     *              break).
+     *
+     *   suf:       A string to print at the end of each array.  The default
+     *              value is a right square bracket `]'.
+     *
+     *   linebreaks: a boolean value to determine if we want to break the line
+     *               after each row of an array.
+     */
+    const char  *arr_pre;
+    const char  *arr_sep;
+    const char  *arr_suf;
+    int         arr_linebreak;
+
+    /*
+     * Fields associated with compound data types.
+     *
+     *   name:      How the name of the struct member is printed in the
+     *              values. By default the name is not printed, but a
+     *              reasonable setting might be "%s=" which prints the name
+     *              followed by an equal sign and then the value.
+     *
+     *   sep:       A string that separates one member from another.  The
+     *              default is ", \001" (the \001 indicates an optional
+     *              line break to allow structs to span multiple lines of
+     *              output).
+     *
+     *   pre:       A string to print at the beginning of a compound type.
+     *              The default is a left curly brace.
+     *
+     *   suf:       A string to print at the end of each compound type.  The
+     *              default is  right curly brace.
+     *
+     *   end:       a string to print after we reach the last element of
+     *              each compound type. prints out before the suf.
+     */
+    const char  *cmpd_name;
+    const char  *cmpd_sep;
+    const char  *cmpd_pre;
+    const char  *cmpd_suf;
+    const char  *cmpd_end;
+
+    /*
+     * Fields associated with vlen data types.
+     *
+     *   sep:       A string that separates one member from another.  The
+     *              default is ", \001" (the \001 indicates an optional
+     *              line break to allow structs to span multiple lines of
+     *              output).
+     *
+     *   pre:       A string to print at the beginning of a vlen type.
+     *              The default is a left parentheses.
+     *
+     *   suf:       A string to print at the end of each vlen type.  The
+     *              default is a right parentheses.
+     *
+     *   end:       a string to print after we reach the last element of
+     *              each compound type. prints out before the suf.
+     */
+    const char  *vlen_sep;
+    const char  *vlen_pre;
+    const char  *vlen_suf;
+    const char  *vlen_end;
+
+    /*
+     * Fields associated with the individual elements.
+     *
+     *   fmt:       A printf(3c) format to use to print the value string
+     *              after it has been rendered.  The default is "%s".
+     *
+     *   suf1:      This string is appended to elements which are followed by
+     *              another element whether the following element is on the
+     *              same line or the next line.  The default is a comma.
+     *
+     *   suf2:      This string is appended (after `suf1') to elements which
+     *              are followed on the same line by another element.  The
+     *              default is a single space.
+     */
+    const char  *elmt_fmt;
+    const char  *elmt_suf1;
+    const char  *elmt_suf2;
+
+    /*
+     * Fields associated with the index values printed at the left edge of
+     * each line of output.
+     *
+     *   n_fmt:     Each index value is printed according to this printf(3c)
+     *              format string which should include a format for a long
+     *              integer.  The default is "%lu".
+     *
+     *   sep:       Each integer in the index list will be separated from the
+     *              others by this string, which defaults to a comma.
+     *
+     *   fmt:       After the index values are formated individually and
+     *              separated from one another by some string, the entire
+     *              resulting string will be formated according to this
+     *              printf(3c) format which should include a format for a
+     *              character string.  The default is "%s".
+     */
+    const char  *idx_n_fmt;             /*index number format           */
+    const char  *idx_sep;               /*separator between numbers     */
+    const char  *idx_fmt;               /*entire index format           */
+
+    /*
+     * Fields associated with entire lines.
+     *
+     *   ncols:     Number of columns per line defaults to 80.
+     *
+     *   per_line:  If this field has a positive value then every Nth element
+     *              will be printed at the beginning of a line.
+     *
+     *   pre:       Each line of output contains an optional prefix area
+     *              before the data. This area can contain the index for the
+     *              first datum (represented by `%s') as well as other
+     *              constant text.  The default value is `%s'.
+     *
+     *   1st:       This is the format to print at the beginning of the first
+     *              line of output. The default value is the current value of
+     *              `pre' described above.
+     *
+     *   cont:      This is the format to print at the beginning of each line
+     *              which was continued because the line was split onto
+     *              multiple lines. This often happens with compound
+     *              data which is longer than one line of output. The default
+     *              value is the current value of the `pre' field
+     *              described above.
+     *
+     *   suf:       This character string will be appended to each line of
+     *              output.  It should not contain line feeds.  The default
+     *              is the empty string.
+     *
+     *   sep:       A character string to be printed after every line feed
+     *              defaulting to the empty string.  It should end with a
+     *              line feed.
+     *
+     *   multi_new: Indicates the algorithm to use when data elements tend to
+     *              occupy more than one line of output. The possible values
+     *              are (zero is the default):
+     *
+     *              0:  No consideration. Each new element is printed
+     *                  beginning where the previous element ended.
+     *
+     *              1:  Print the current element beginning where the
+     *                  previous element left off. But if that would result
+     *                  in the element occupying more than one line and it
+     *                  would only occupy one line if it started at the
+     *                  beginning of a line, then it is printed at the
+     *                  beginning of the next line.
+     *
+     *   multi_new: If an element is continued onto additional lines then
+     *              should the following element begin on the next line? The
+     *              default is to start the next element on the same line
+     *              unless it wouldn't fit.
+     *
+     * indentlevel: a string that shows how far to indent if extra spacing
+     *              is needed. dumper uses it.
+     */
+    unsigned    line_ncols;             /*columns of output             */
+    size_t      line_per_line;          /*max elements per line         */
+    const char  *line_pre;              /*prefix at front of each line  */
+    const char  *line_1st;              /*alternate pre. on first line  */
+    const char  *line_cont;             /*alternate pre. on continuation*/
+    const char  *line_suf;              /*string to append to each line */
+    const char  *line_sep;              /*separates lines               */
+    int         line_multi_new;         /*split multi-line outputs?     */
+    const char  *line_indent;           /*for extra identation if we need it*/
+
+    /*used to skip the first set of checks for line length*/
+    int skip_first;
+
+    /*flag used to hide or show the file number for obj refs*/
+    int obj_hidefileno;
+
+    /*string used to format the output for the obje refs*/
+    const char *obj_format;
+
+    /*flag used to hide or show the file number for dataset regions*/
+    int dset_hidefileno;
+
+    /*string used to format the output for the dataset regions*/
+    const char *dset_format;
+
+    const char *dset_blockformat_pre;
+    const char *dset_ptformat_pre;
+    const char *dset_ptformat;
+
+    /*print array indices in output matrix */
+    int pindex;
+
+    /*escape non printable characters */
+    int do_escape;
+
+} h5tool_format_t;
+
+typedef struct h5tools_context_t {
+    size_t cur_column;                       /*current column for output */
+    size_t cur_elmt;                         /*current element/output line */
+    int  need_prefix;                        /*is line prefix needed? */
+    unsigned ndims;                          /*dimensionality  */
+    hsize_t p_min_idx[H5S_MAX_RANK];         /*min selected index */
+    hsize_t p_max_idx[H5S_MAX_RANK];         /*max selected index */
+    int  prev_multiline;                     /*was prev datum multiline? */
+    size_t prev_prefix_len;                  /*length of previous prefix */
+    int  continuation;                       /*continuation of previous data?*/
+    hsize_t size_last_dim;                   /*the size of the last dimension,
+                                              *needed so we can break after each
+                                              *row */
+    unsigned  indent_level;                /*the number of times we need some
+                                       *extra indentation */
+    unsigned  default_indent_level;        /*this is used when the indent level gets changed */
+    hsize_t acc[H5S_MAX_RANK];        /* accumulator position */
+    hsize_t pos[H5S_MAX_RANK];        /* matrix position */
+    hsize_t sm_pos;                   /* current stripmine element position */
+} h5tools_context_t;
+
+typedef struct subset_d {
+    hsize_t     *data;
+    unsigned int len;
+} subset_d;
+
+/* a structure to hold the subsetting particulars for a dataset */
+struct subset_t {
+    subset_d start;
+    subset_d stride;
+    subset_d count;
+    subset_d block;
+};
+
+/* The following include, h5tools_str.h, must be after the
+ * above stucts are defined. There is a dependency in the following
+ * include that hasn't been identified yet. */
+
+#include "h5tools_str.h"
+
+H5TOOLS_DLLVAR h5tool_format_t h5tools_dataformat;
+H5TOOLS_DLLVAR const h5tools_dump_header_t h5tools_standardformat;
+H5TOOLS_DLLVAR const h5tools_dump_header_t* h5tools_dump_header_format;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5TOOLS_DLLVAR unsigned packed_bits_num;    /* number of packed bits to display */
+H5TOOLS_DLLVAR unsigned packed_data_offset; /* offset of packed bits to display */
+H5TOOLS_DLLVAR unsigned packed_data_length; /* length of packed bits to display */
+H5TOOLS_DLLVAR unsigned long long packed_data_mask;  /* mask in which packed bits to display */
+H5TOOLS_DLLVAR FILE   *rawattrstream;       /* output stream for raw attribute data */
+H5TOOLS_DLLVAR FILE   *rawdatastream;       /* output stream for raw data */
+H5TOOLS_DLLVAR FILE   *rawinstream;         /* input stream for raw input */
+H5TOOLS_DLLVAR FILE   *rawoutstream;        /* output stream for raw output */
+H5TOOLS_DLLVAR FILE   *rawerrorstream;      /* output stream for raw error */
+H5TOOLS_DLLVAR int     bin_output;          /* binary output */
+H5TOOLS_DLLVAR int     bin_form;            /* binary form */
+H5TOOLS_DLLVAR int     region_output;       /* region output */
+H5TOOLS_DLLVAR int     oid_output;          /* oid output */
+H5TOOLS_DLLVAR int     data_output;         /* data output */
+H5TOOLS_DLLVAR int     attr_data_output;    /* attribute data output */
+
+/* things to display or which are set via command line parameters */
+H5TOOLS_DLLVAR int     enable_error_stack; /* re-enable error stack */
+
+/* Strings for output */
+#define H5_TOOLS_GROUP           "GROUP"
+#define H5_TOOLS_DATASET         "DATASET"
+#define H5_TOOLS_DATATYPE        "DATATYPE"
+
+/* Definitions of useful routines */
+H5TOOLS_DLL void    h5tools_init(void);
+H5TOOLS_DLL void    h5tools_close(void);
+H5TOOLS_DLL int     h5tools_set_data_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_attr_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_input_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_error_file(const char *fname, int is_bin);
+H5TOOLS_DLL hid_t   h5tools_fopen(const char *fname, unsigned flags, hid_t fapl,
+                            const char *driver, char *drivername, size_t drivername_len);
+H5TOOLS_DLL hid_t   h5tools_get_native_type(hid_t type);
+H5TOOLS_DLL hid_t   h5tools_get_little_endian_type(hid_t type);
+H5TOOLS_DLL hid_t   h5tools_get_big_endian_type(hid_t type);
+H5TOOLS_DLL htri_t  h5tools_detect_vlen(hid_t tid);
+H5TOOLS_DLL htri_t  h5tools_detect_vlen_str(hid_t tid);
+H5TOOLS_DLL hbool_t h5tools_is_obj_same(hid_t loc_id1, const char *name1, hid_t loc_id2, const char *name2);
+H5TOOLS_DLL void    init_acc_pos(h5tools_context_t *ctx, hsize_t *dims);
+H5TOOLS_DLL hbool_t h5tools_is_zero(const void *_mem, size_t size);
+H5TOOLS_DLL int     h5tools_canreadf(const char* name,  hid_t dcpl_id);
+H5TOOLS_DLL int     h5tools_can_encode(H5Z_filter_t filtn);
+
+H5TOOLS_DLL void    h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx, hsize_t elmtno, int secnum);
+H5TOOLS_DLL void    h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx, hsize_t elmtno, hsize_t *ptdata, int secnum);
+
+H5TOOLS_DLL int     render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hsize_t nelmts);
+H5TOOLS_DLL int     render_bin_output_region_data_blocks(hid_t region_id, FILE *stream,
+                            hid_t container, unsigned ndims, hid_t type_id, hsize_t nblocks, hsize_t *ptdata);
+H5TOOLS_DLL hbool_t render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
+                             FILE *stream, hid_t container);
+H5TOOLS_DLL int     render_bin_output_region_data_points(hid_t region_space, hid_t region_id,
+                            FILE* stream, hid_t container, unsigned ndims, hid_t type_id, hsize_t npoints);
+H5TOOLS_DLL hbool_t render_bin_output_region_points(hid_t region_space, hid_t region_id,
+                             FILE *stream, hid_t container);
+
+H5TOOLS_DLL hbool_t h5tools_render_element(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx, h5tools_str_t *buffer, hsize_t *curr_pos,
+                            size_t ncols, hsize_t local_elmt_counter, hsize_t elmt_counter);
+H5TOOLS_DLL hbool_t h5tools_render_region_element(FILE *stream, const h5tool_format_t *info,
+                h5tools_context_t *ctx/*in,out*/,
+                h5tools_str_t *buffer/*string into which to render */,
+                hsize_t *curr_pos/*total data element position*/,
+                size_t ncols, hsize_t *ptdata,
+                hsize_t local_elmt_counter/*element counter*/,
+                hsize_t elmt_counter);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5TOOLS_H__ */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.c
new file mode 100644
index 0000000..3928837
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.c
@@ -0,0 +1,3953 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, July 23, 1998
+ *
+ * Purpose: A library for displaying the values of a dataset in a human
+ *  readable format.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_ref.h"
+#include "h5tools_utils.h"
+#include "H5private.h"
+
+h5tool_format_t h5tools_dataformat = {
+0, /*raw */
+
+"", /*fmt_raw */
+"%d", /*fmt_int */
+"%u", /*fmt_uint */
+"%hhd", /*fmt_schar */
+"%u", /*fmt_uchar */
+"%d", /*fmt_short */
+"%u", /*fmt_ushort */
+"%ld", /*fmt_long */
+"%lu", /*fmt_ulong */
+NULL, /*fmt_llong */
+NULL, /*fmt_ullong */
+"%g", /*fmt_double */
+"%g", /*fmt_float */
+
+0, /*ascii */
+0, /*str_locale */
+0, /*str_repeat */
+
+"[ ", /*arr_pre */
+",", /*arr_sep */
+" ]", /*arr_suf */
+1, /*arr_linebreak */
+
+"", /*cmpd_name */
+",\n", /*cmpd_sep */
+"{", /*cmpd_pre */
+"}", /*cmpd_suf */
+"\n", /*cmpd_end */
+
+", ", /*vlen_sep */
+"(", /*vlen_pre */
+")", /*vlen_suf */
+"", /*vlen_end */
+
+"%s", /*elmt_fmt */
+",", /*elmt_suf1 */
+" ", /*elmt_suf2 */
+
+"", /*idx_n_fmt */
+"", /*idx_sep */
+"", /*idx_fmt */
+
+80, /*line_ncols *//*standard default columns */
+0, /*line_per_line */
+"", /*line_pre */
+"%s", /*line_1st */
+"%s", /*line_cont */
+"", /*line_suf */
+"", /*line_sep */
+1, /*line_multi_new */
+"   ", /*line_indent */
+
+1, /*skip_first */
+
+1, /*obj_hidefileno */
+" "H5_PRINTF_HADDR_FMT, /*obj_format */
+
+1, /*dset_hidefileno */
+"DATASET %s ", /*dset_format */
+"%s", /*dset_blockformat_pre */
+"%s", /*dset_ptformat_pre */
+"%s", /*dset_ptformat */
+1, /*array indices */
+1 /*escape non printable characters */
+};
+
+const h5tools_dump_header_t h5tools_standardformat = {
+"standardformat", /*name */
+"HDF5", /*fileebgin */
+"", /*fileend */
+SUPER_BLOCK, /*bootblockbegin */
+"", /*bootblockend */
+H5_TOOLS_GROUP, /*groupbegin */
+"", /*groupend */
+H5_TOOLS_DATASET, /*datasetbegin */
+"", /*datasetend */
+ATTRIBUTE, /*attributebegin */
+"", /*attributeend */
+H5_TOOLS_DATATYPE, /*datatypebegin */
+"", /*datatypeend */
+DATASPACE, /*dataspacebegin */
+"", /*dataspaceend */
+DATA, /*databegin */
+"", /*dataend */
+SOFTLINK, /*softlinkbegin */
+"", /*softlinkend */
+EXTLINK, /*extlinkbegin */
+"", /*extlinkend */
+UDLINK, /*udlinkbegin */
+"", /*udlinkend */
+SUBSET, /*subsettingbegin */
+"", /*subsettingend */
+START, /*startbegin */
+"", /*startend */
+STRIDE, /*stridebegin */
+"", /*strideend */
+COUNT, /*countbegin */
+"", /*countend */
+BLOCK, /*blockbegin */
+"", /*blockend */
+
+"{", /*fileblockbegin */
+"}", /*fileblockend */
+"{", /*bootblockblockbegin */
+"}", /*bootblockblockend */
+"{", /*groupblockbegin */
+"}", /*groupblockend */
+"{", /*datasetblockbegin */
+"}", /*datasetblockend */
+"{", /*attributeblockbegin */
+"}", /*attributeblockend */
+"", /*datatypeblockbegin */
+"", /*datatypeblockend */
+"", /*dataspaceblockbegin */
+"", /*dataspaceblockend */
+"{", /*datablockbegin */
+"}", /*datablockend */
+"{", /*softlinkblockbegin */
+"}", /*softlinkblockend */
+"{", /*extlinkblockbegin */
+"}", /*extlinkblockend */
+"{", /*udlinkblockbegin */
+"}", /*udlinkblockend */
+"{", /*strblockbegin */
+"}", /*strblockend */
+"{", /*enumblockbegin */
+"}", /*enumblockend */
+"{", /*structblockbegin */
+"}", /*structblockend */
+"{", /*vlenblockbegin */
+"}", /*vlenblockend */
+"{", /*subsettingblockbegin */
+"}", /*subsettingblockend */
+"(", /*startblockbegin */
+");", /*startblockend */
+"(", /*strideblockbegin */
+");", /*strideblockend */
+"(", /*countblockbegin */
+");", /*countblockend */
+"(", /*blockblockbegin */
+");", /*blockblockend */
+
+"", /*dataspacedescriptionbegin */
+"", /*dataspacedescriptionend */
+"(", /*dataspacedimbegin */
+")", /*dataspacedimend */
+};
+
+const h5tools_dump_header_t* h5tools_dump_header_format;
+table_t *h5dump_type_table = NULL;  /*type table reference for datatype dump  */
+
+/* local prototypes */
+static int h5tools_print_region_data_blocks(hid_t region_id,
+        FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
+        h5tools_str_t *buffer/*string into which to render */, size_t ncols,
+        unsigned ndims, hid_t type_id, hsize_t nblocks, hsize_t *ptdata);
+
+hbool_t h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
+                FILE *stream, const h5tool_format_t *info,
+                h5tools_context_t *ctx/*in,out*/,
+                h5tools_str_t *buffer/*string into which to render */,
+                hsize_t *curr_pos/*total data element position*/,
+                size_t ncols, hsize_t region_elmt_counter/*element counter*/,
+                hsize_t elmt_counter);
+
+static int h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
+        FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
+        h5tools_str_t *buffer, size_t ncols,
+        unsigned ndims, hid_t type_id, hsize_t npoints, hsize_t *ptdata);
+
+hbool_t h5tools_dump_region_data_blocks(hid_t region_space, hid_t region_id,
+                FILE *stream, const h5tool_format_t *info,
+                h5tools_context_t *ctx/*in,out*/,
+                h5tools_str_t *buffer/*string into which to render */,
+                hsize_t *curr_pos/*total data element position*/,
+                size_t ncols, hsize_t region_elmt_counter/*element counter*/,
+                hsize_t elmt_counter);
+
+void h5tools_print_dims(h5tools_str_t *buffer, hsize_t *s, int dims);
+
+void h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, struct subset_t *sset, int dims);
+
+void
+h5tools_dump_init(void)
+{
+    h5tools_dump_header_format = &h5tools_standardformat;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Prints NELMTS data elements to output STREAM.
+ * Description:
+ *      Prints some (NELMTS) data elements to output STREAM. The elements are
+ *      stored in _MEM as type TYPE and are printed according to the format
+ *      described in INFO. The CTX struct contains context information shared
+ *      between calls to this function. The FLAGS is a bit field that
+ *      indicates whether the data supplied in this call falls at the
+ *      beginning or end of the total data to be printed (START_OF_DATA and
+ *      END_OF_DATA).
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ * Programmer:
+ *      Robb Matzke, Monday, April 26, 1999
+ * Modifications:
+ *  Robb Matzke, 1999-06-04
+ * The `container' argument is the optional dataset for reference types.
+ *
+ *  Robb Matzke, 1999-09-29
+ * Understands the `per_line' property which indicates that every Nth
+ * element should begin a new line.
+ *
+ *      Robb Matzke, LLNL, 2003-06-05
+ *      Do not dereference the memory for a variable-length string here.
+ *      Deref in h5tools_str_sprint() instead so recursive types are
+ *      handled correctly.
+ *
+ *      Pedro Vicente Nunes, The HDF Group, 2005-10-19
+ *        pass to the prefix in h5tools_simple_prefix the total position
+ *        instead of the current stripmine position i; this is necessary
+ *        to print the array indices
+ *        new field sm_pos in h5tools_context_t, the current stripmine element position
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t container,
+                         h5tools_context_t *ctx/*in,out*/, unsigned flags,
+                         hsize_t nelmts, hid_t type, void *_mem)
+{
+    int            ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    unsigned char *mem = (unsigned char*) _mem;
+    hsize_t        i;         /*element counter  */
+    size_t         size;      /*size of each datum  */
+    hid_t          region_space = -1;
+    hid_t          region_id = -1;
+    hbool_t        dimension_break = TRUE;
+    H5S_sel_type   region_type;
+    size_t         ncols = 80; /*available output width */
+    h5tools_str_t  buffer;    /*string into which to render */
+    hsize_t        curr_pos = 0;  /* total data element position   */
+    hsize_t        elmt_counter = 0;/*counts the # elements printed.
+                                     *I (ptl?) needed something that
+                                     *isn't going to get reset when a new
+                                     *line is formed. I'm going to use
+                                     *this var to count elements and
+                                     *break after we see a number equal
+                                     *to the ctx->size_last_dim.   */
+
+    /* binary dump */
+    if (bin_output && (rawdatastream != NULL)) {
+        if (render_bin_output(rawdatastream, container, type, _mem, nelmts) < 0) {
+            PRINTVALSTREAM(rawoutstream, "\nError in writing binary stream\n");
+        }
+    } /* end if */
+    else {
+        /* setup */
+        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+        size = H5Tget_size(type);
+
+        if (info->line_ncols > 0)
+            ncols = info->line_ncols;
+
+        /* pass to the prefix in h5tools_simple_prefix the total position
+         * instead of the current stripmine position i; this is necessary
+         * to print the array indices
+         */
+        curr_pos = ctx->sm_pos;
+
+        if (region_output && (size == H5R_DSET_REG_REF_BUF_SIZE)) {
+            for (i = 0; i < nelmts; i++, ctx->cur_elmt++, elmt_counter++) {
+                void* memref = mem + i * size;
+                char ref_name[1024];
+
+                /* region data */
+                region_id = H5Rdereference(container, H5R_DATASET_REGION, memref);
+                if (region_id >= 0) {
+                    region_space = H5Rget_region(container, H5R_DATASET_REGION, memref);
+                    if (region_space >= 0) {
+                        if (h5tools_is_zero(memref, H5Tget_size(type))) {
+                            ctx->need_prefix = TRUE;
+                            h5tools_simple_prefix(rawoutstream, info, ctx, curr_pos, 0);
+
+                            /* Render the region element begin */
+                            h5tools_str_reset(&buffer);
+                            h5tools_str_append(&buffer, "NULL");
+
+                            dimension_break = h5tools_render_element(rawoutstream, info,
+                                       ctx, &buffer, &curr_pos, ncols, i, elmt_counter);
+                        }
+                        else {
+                            if(H5Rget_name(region_id, H5R_DATASET_REGION, memref, (char*) ref_name, (size_t)1024)<0)
+                                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Rget_name failed");
+
+                            ctx->need_prefix = TRUE;
+                            h5tools_simple_prefix(rawoutstream, info, ctx, curr_pos+i, 0);
+
+                            /* Render the region element begin */
+                            h5tools_str_reset(&buffer);
+                            h5tools_str_append(&buffer, info->dset_format, ref_name);
+
+                            dimension_break = h5tools_render_element(rawoutstream, info,
+                                       ctx, &buffer, &curr_pos, ncols, i, elmt_counter);
+
+                            region_type = H5Sget_select_type(region_space);
+                            if(region_type == H5S_SEL_POINTS)
+                                /* Print point information */
+                                dimension_break = h5tools_dump_region_data_points(
+                                                       region_space, region_id, rawoutstream, info, ctx,
+                                                       &buffer, &curr_pos, ncols, i, elmt_counter);
+                            else if(region_type == H5S_SEL_HYPERSLABS)
+                                /* Print block information */
+                                dimension_break = h5tools_dump_region_data_blocks(
+                                                       region_space, region_id, rawoutstream, info, ctx,
+                                                       &buffer, &curr_pos, ncols, i, elmt_counter);
+                            else
+                                HERROR(H5E_tools_g, H5E_tools_min_id_g, "invalid region type");
+                            /* Render the region element end */
+
+                        } /* end else to if (h5tools_is_zero(... */
+                        if(H5Sclose(region_space) < 0)
+                            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+                    } /* end if (region_space >= 0) */
+                    else
+                        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Rget_region failed");
+                    if(H5Dclose(region_id) < 0)
+                        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Dclose failed");
+
+                } /* if (region_id >= 0) */
+                else {
+                    /* if (region_id < 0) - could mean that no reference was written do not throw failure */
+                    H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, H5E_tools_min_id_g, "H5Rdereference failed");
+                }
+
+                ctx->need_prefix = TRUE;
+
+                if(FALSE == dimension_break)
+                    elmt_counter = 0;
+            } /* end for (i = 0; i < nelmts... */
+        } /* end if (region_output... */
+        else {
+            for (i = 0; i < nelmts; i++, ctx->cur_elmt++, elmt_counter++) {
+                void* memref = mem + i * size;
+                /* Render the data element begin*/
+                h5tools_str_reset(&buffer);
+                h5tools_str_sprint(&buffer, info, container, type, memref, ctx);
+
+                if (i + 1 < nelmts || (flags & END_OF_DATA) == 0)
+                    h5tools_str_append(&buffer, "%s", OPT(info->elmt_suf1, ","));
+
+                dimension_break = h5tools_render_element(stream, info, ctx, &buffer,
+                                                           &curr_pos, ncols, i, elmt_counter);
+                /* Render the data element end*/
+                if(FALSE == dimension_break)
+                    elmt_counter = 0;
+            } /* end for (i = 0; i < nelmts... */
+        }
+
+        h5tools_str_close(&buffer);
+    }/* else bin */
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print the data values from a dataset referenced by region blocks.
+ *
+ * Description:
+ *      This is a special case subfunction to print the data in a region reference of type blocks.
+ *
+ * Return:
+ *      The function returns FAIL if there was an error, otherwise SUCEED
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      size_t ncols
+ *      int ndims is the number of dimensions of the region element
+ *      hssize_t nblocks is the number of blocks in the region
+ *-------------------------------------------------------------------------
+ */
+static int
+h5tools_print_region_data_blocks(hid_t region_id,
+        FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
+        h5tools_str_t *buffer/*string into which to render */, size_t ncols,
+        unsigned ndims, hid_t type_id, hsize_t nblocks, hsize_t *ptdata)
+{
+    hbool_t      dimension_break = TRUE;
+    hsize_t     *dims1 = NULL;
+    hsize_t     *start = NULL;
+    hsize_t     *count = NULL;
+    hsize_t      blkndx;
+    hsize_t      total_size[H5S_MAX_RANK];
+    hsize_t      elmtno; /* elemnt index  */
+    hsize_t      curr_pos = 0;
+    unsigned int region_flags; /* buffer extent flags */
+    hsize_t      numelem;
+    hsize_t      numindex;
+    unsigned     indx;
+    unsigned     jndx;
+    size_t       type_size;
+    int          ret_value = SUCCEED;
+    hid_t        mem_space = -1;
+    hid_t        sid1 = -1;
+    h5tools_context_t ctx;
+    void        *region_buf = NULL;
+
+    HDassert(info);
+    HDassert(cur_ctx);
+    HDassert(buffer);
+    HDassert(ptdata);
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+
+    /* Get the dataspace of the dataset */
+    if((sid1 = H5Dget_space(region_id)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+
+    /* Allocate space for the dimension array */
+    if((dims1 = (hsize_t *) HDmalloc((size_t)(sizeof(hsize_t) * ndims))) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
+
+    /* find the dimensions of each data space from the block coordinates */
+    numelem = 1;
+    for (jndx = 0; jndx < ndims; jndx++) {
+        dims1[jndx] = ptdata[jndx + ndims] - ptdata[jndx] + 1;
+        numelem = dims1[jndx] * numelem;
+    }
+
+    /* Create dataspace for reading buffer */
+    if((mem_space = H5Screate_simple((int)ndims, dims1, NULL)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
+
+    if((type_size = H5Tget_size(type_id)) == 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+    if((region_buf = HDmalloc(type_size * (size_t)numelem)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate region buffer");
+
+    /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */
+    /*          1   2        n      1   2        n                                       */
+    if((start = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for start");
+
+    if((count = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for count");
+
+    curr_pos = 0;
+    ctx.indent_level = cur_ctx->indent_level;
+    ctx.cur_column = cur_ctx->cur_column;
+    ctx.prev_multiline = cur_ctx->prev_multiline;
+    ctx.ndims = ndims;
+    for (blkndx = 0; blkndx < nblocks; blkndx++) {
+        ctx.need_prefix = TRUE;
+        ctx.cur_elmt = 0;
+        for (indx = 0; indx < ndims; indx++) {
+            start[indx] = ptdata[indx + blkndx * ndims * 2];
+            count[indx] = dims1[indx];
+        }
+
+        if(H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+
+        if(H5Dread(region_id, type_id, mem_space, sid1, H5P_DEFAULT, region_buf) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Dread failed");
+
+        ctx.indent_level++;
+        if(H5Sget_simple_extent_dims(mem_space, total_size, NULL) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+        /* assume entire data space to be printed */
+        for (indx = 0; indx < (unsigned)ctx.ndims; indx++)
+            ctx.p_min_idx[indx] = start[indx];
+        init_acc_pos(&ctx, total_size);
+
+        /* print the data */
+        region_flags = START_OF_DATA;
+        if (blkndx == nblocks - 1)
+            region_flags |= END_OF_DATA;
+
+        for (indx = 0; indx < (unsigned)ctx.ndims; indx++)
+            ctx.p_max_idx[indx] = dims1[indx];
+
+        curr_pos = 0;
+        ctx.sm_pos = blkndx * 2 * ndims;
+        ctx.size_last_dim = dims1[ndims-1];
+
+        h5tools_region_simple_prefix(stream, info, &ctx, curr_pos, ptdata, 0);
+
+        elmtno = 0;
+        for (numindex = 0; numindex < numelem; numindex++, elmtno++, ctx.cur_elmt++) {
+            /* Render the region data element begin */
+            h5tools_str_reset(buffer);
+
+            h5tools_str_append(buffer, "%s", numindex ? OPTIONAL_LINE_BREAK "" : "");
+            h5tools_str_sprint(buffer, info, region_id, type_id,
+                                ((char*)region_buf + numindex * type_size), &ctx);
+
+            if (numindex + 1 < numelem || (region_flags & END_OF_DATA) == 0)
+                h5tools_str_append(buffer, "%s", OPT(info->elmt_suf1, ","));
+
+            dimension_break = h5tools_render_region_element(stream, info, &ctx, buffer, &curr_pos,
+                                                                    ncols, ptdata, numindex, elmtno);
+            /* Render the region data element end */
+
+            if(FALSE == dimension_break)
+                elmtno = 0;
+        } /* end for (numindex = 0; numindex < numelem; numindex++, elmtno++, ctx.cur_elmt++) */
+
+        ctx.indent_level--;
+    } /* end for (blkndx = 0; blkndx < nblocks; blkndx++) */
+
+ done:
+    HDfree(start);
+    HDfree(count);
+    HDfree(region_buf);
+    HDfree(dims1);
+
+    if(H5Sclose(mem_space) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+    if(H5Sclose(sid1) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print some values from a dataset referenced by region blocks.
+ *
+ * Description:
+ *      This is a special case subfunction to dump a region reference using blocks.
+ *
+ * Return:
+ *      The function returns False if the last dimension has been reached, otherwise True
+ *
+ * In/Out:
+ *      h5tools_context_t *ctx
+ *      hsize_t *curr_pos
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      hsize_t curr_pos is the total data element position
+ *      size_t ncols
+ *      hsize_t region_elmt_counter is the region element loop counter
+ *      hsize_t elmt_count is the data element loop counter
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_dump_region_data_blocks(hid_t region_space, hid_t region_id,
+        FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx/*in,out*/,
+        h5tools_str_t *buffer/*string into which to render */,
+        hsize_t *curr_pos/*total data element position*/,
+        size_t ncols, hsize_t region_elmt_counter/*element counter*/,
+        hsize_t elmt_counter)
+{
+    HERR_INIT(hbool_t, TRUE)
+    hbool_t      dimension_break = TRUE;
+    hssize_t     snblocks;
+    hsize_t      nblocks;
+    hsize_t      alloc_size;
+    hsize_t     *ptdata = NULL;
+    int          sndims;
+    unsigned     ndims;
+    hid_t        dtype = -1;
+    hid_t        type_id = -1;
+    hsize_t      u;
+
+    HDassert(info);
+    HDassert(ctx);
+    HDassert(buffer);
+
+    if((snblocks = H5Sget_select_hyper_nblocks(region_space)) <= 0)
+        H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_select_hyper_nblocks failed");
+    nblocks = (hsize_t)snblocks;
+
+    /* Print block information */
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+        H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
+
+    /* Render the region { element begin */
+    h5tools_str_reset(buffer);
+
+    h5tools_str_append(buffer, "{");
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the region { element end */
+
+    ctx->indent_level++;
+    ctx->need_prefix = TRUE;
+
+    /* Render the region datatype info and indices element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "REGION_TYPE BLOCK  ");
+
+    alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
+    HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
+    if((ptdata = (hsize_t*) HDmalloc((size_t) alloc_size)) == NULL)
+    {
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
+        HGOTO_DONE(dimension_break);
+    }
+
+    if(H5Sget_select_hyper_blocklist(region_space, (hsize_t)0, nblocks, ptdata) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Rget_select_hyper_blocklist failed");
+
+    for(u = 0; u < nblocks; u++) {
+        unsigned v;
+
+        h5tools_str_append(buffer, info->dset_blockformat_pre,
+                            u ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long)u);
+
+        /* Start coordinates and opposite corner */
+        for (v = 0; v < ndims; v++)
+            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT, v ? "," : "(",
+                                ptdata[u * 2 * ndims + v]);
+
+        for (v = 0; v < ndims; v++)
+            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT, v ? "," : ")-(",
+                                ptdata[u * 2 * ndims + v + ndims]);
+
+        h5tools_str_append(buffer, ")");
+    } /* end for (u = 0; u < nblocks; u++) */
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the region datatype info and indices element end */
+
+    ctx->need_prefix = TRUE;
+
+    if((dtype = H5Dget_type(region_id)) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Dget_type failed");
+    if((type_id = H5Tget_native_type(dtype, H5T_DIR_DEFAULT)) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Tget_native_type failed");
+
+    /* Render the datatype element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->datatypebegin,
+                        h5tools_dump_header_format->datatypeblockbegin);
+
+    ctx->indent_level++;
+    h5tools_print_datatype(stream, buffer, info, ctx, dtype, TRUE);
+    ctx->indent_level--;
+
+    if (HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->datatypeblockend);
+        if (HDstrlen(h5tools_dump_header_format->datatypeend))
+            h5tools_str_append(buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->datatypeend))
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->datatypeend);
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the datatype element end */
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the dataspace element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s ", h5tools_dump_header_format->dataspacebegin);
+
+    h5tools_print_dataspace(buffer, region_space);
+
+    if (HDstrlen(h5tools_dump_header_format->dataspaceblockend)) {
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->dataspaceblockend);
+        if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+            h5tools_str_append(buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->dataspaceblockend);
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the dataspace element end */
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the databegin element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->databegin,
+                        h5tools_dump_header_format->datablockbegin);
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the databegin element end */
+
+    ctx->need_prefix = TRUE;
+
+    h5tools_print_region_data_blocks(region_id, rawdatastream, info, ctx,
+        buffer, ncols, ndims, type_id, nblocks, ptdata);
+
+ done:
+    HDfree(ptdata);
+
+    if(H5Tclose(type_id) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    if(H5Tclose(dtype) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the dataend element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->dataend,
+                        h5tools_dump_header_format->datablockend);
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos,
+                                                ncols, region_elmt_counter, elmt_counter);
+    /* Render the dataend element end */
+
+    ctx->indent_level--;
+    ctx->need_prefix = TRUE;
+
+    /* Render the region } element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "}");
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos,
+                                                ncols, region_elmt_counter, elmt_counter);
+    /* Render the region } element end */
+
+    H5_LEAVE(dimension_break)
+
+ CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print the data values from a dataset referenced by region points.
+ *
+ * Description:
+ *      This is a special case subfunction to print the data in a region reference of type points.
+ *
+ * Return:
+ *      The function returns FAIL on error, otherwise SUCCEED
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      size_t ncols
+ *      int ndims is the number of dimensions of the region element
+ *      hssize_t npoints is the number of points in the region
+ *-------------------------------------------------------------------------
+ */
+static int
+h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
+        FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
+        h5tools_str_t *buffer, size_t ncols,
+        unsigned ndims, hid_t type_id, hsize_t npoints, hsize_t *ptdata)
+{
+    hbool_t  dimension_break = TRUE;
+    hsize_t *dims1 = NULL;
+    hsize_t  elmtno; /* elemnt index  */
+    hsize_t  curr_pos = 0;
+    hsize_t  total_size[H5S_MAX_RANK];
+    hsize_t  jndx;
+    unsigned indx;
+    size_t   type_size;
+    int      ret_value = SUCCEED;
+    unsigned int region_flags; /* buffer extent flags */
+    hid_t    mem_space = -1;
+    void    *region_buf = NULL;
+    h5tools_context_t ctx;
+
+    HDassert(info);
+    HDassert(cur_ctx);
+    HDassert(buffer);
+    HDassert(ptdata);
+    HDassert(ndims > 0);
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    /* Allocate space for the dimension array */
+    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
+
+    dims1[0] = npoints;
+
+    /* Create dataspace for reading buffer */
+    if((mem_space = H5Screate_simple(1, dims1, NULL)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
+
+    if((type_size = H5Tget_size(type_id)) == 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+    if((region_buf = HDmalloc(type_size * (size_t)npoints)) == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for region");
+
+    curr_pos = 0;
+    ctx.indent_level = cur_ctx->indent_level;
+    ctx.cur_column = cur_ctx->cur_column;
+    ctx.prev_multiline = cur_ctx->prev_multiline;
+    ctx.ndims = ndims;
+
+    if(H5Dread(region_id, type_id, mem_space, region_space, H5P_DEFAULT, region_buf) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+
+    elmtno = 0;
+    for (jndx = 0; jndx < npoints; jndx++, elmtno++) {
+        ctx.need_prefix = TRUE;
+        ctx.cur_elmt = 0;    /* points are always 0 */
+
+        ctx.indent_level++;
+        if(H5Sget_simple_extent_dims(mem_space, total_size, NULL) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+        /* assume entire data space to be printed */
+        for (indx = 0; indx < ctx.ndims; indx++)
+            ctx.p_min_idx[indx] = 0;
+        init_acc_pos(&ctx, total_size);
+
+        /* print the data */
+        region_flags = START_OF_DATA;
+        if (jndx == npoints - 1)
+            region_flags |= END_OF_DATA;
+
+        for (indx = 0; indx < ctx.ndims; indx++)
+            ctx.p_max_idx[indx] = cur_ctx->p_max_idx[indx];
+
+        ctx.sm_pos = jndx * ndims;
+        if (ctx.ndims > 0)
+            ctx.size_last_dim = ctx.p_max_idx[ctx.ndims - 1];
+        else
+            ctx.size_last_dim = 0;
+
+        curr_pos = 0;    /* points requires constant 0 */
+        h5tools_region_simple_prefix(stream, info, &ctx, curr_pos, ptdata, 0);
+
+        /* Render the point element begin */
+        h5tools_str_reset(buffer);
+
+        h5tools_str_append(buffer, "%s", jndx ? OPTIONAL_LINE_BREAK "" : "");
+        h5tools_str_sprint(buffer, info, region_id, type_id,
+                               ((char*)region_buf + jndx * type_size), &ctx);
+
+        if (jndx + 1 < npoints || (region_flags & END_OF_DATA) == 0)
+            h5tools_str_append(buffer, "%s", OPT(info->elmt_suf1, ","));
+
+        dimension_break = h5tools_render_region_element(stream, info, &ctx, buffer, &curr_pos,
+                                                                ncols, ptdata, (hsize_t)0, elmtno);
+        /* Render the point element end */
+        if(FALSE == dimension_break)
+            elmtno = 0;
+
+        ctx.indent_level--;
+    } /* end for (jndx = 0; jndx < npoints; jndx++, elmtno++) */
+
+ done:
+    HDfree(region_buf);
+    HDfree(dims1);
+
+    if(H5Sclose(mem_space) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print some values from a dataset referenced by region points.
+ *
+ * Description:
+ *      This is a special case subfunction to dump a region reference using points.
+ *
+ * Return:
+ *      The function returns False if the last dimension has been reached, otherwise True
+ *
+ * In/Out:
+ *      h5tools_context_t *ctx
+ *      hsize_t *curr_pos
+ *
+ * Parameters Description:
+ *      h5tools_str_t *buffer is the string into which to render
+ *      hsize_t curr_pos is the total data element position
+ *      size_t ncols
+ *      hsize_t region_elmt_counter is the region element loop counter
+ *      hsize_t elmt_count is the data element loop counter
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
+        FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+        h5tools_str_t *buffer, hsize_t *curr_pos, size_t ncols, hsize_t region_elmt_counter,
+        hsize_t elmt_counter) {
+    HERR_INIT(hbool_t, TRUE)
+    hbool_t  dimension_break = TRUE;
+    hssize_t snpoints;
+    hsize_t  npoints;
+    hsize_t  alloc_size;
+    hsize_t *ptdata;
+    int      sndims;
+    unsigned ndims;
+    hsize_t  indx;
+    hid_t    dtype = -1;
+    hid_t    type_id = -1;
+
+    HDassert(info);
+    HDassert(ctx);
+    HDassert(buffer);
+
+    if((snpoints = H5Sget_select_elem_npoints(region_space)) <= 0)
+        H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_select_elem_npoints failed");
+    npoints = (hsize_t)snpoints;
+
+    /* Allocate space for the dimension array */
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+        H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
+
+    /* Render the region { element begin */
+    h5tools_str_reset(buffer);
+
+    h5tools_str_append(buffer, "{");
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the region { element end */
+
+    /* Render the region datatype info and indices element begin */
+    h5tools_str_reset(buffer);
+
+    ctx->indent_level++;
+    ctx->need_prefix = TRUE;
+    h5tools_str_append(buffer, "REGION_TYPE POINT  ");
+
+    alloc_size = npoints * ndims * sizeof(ptdata[0]);
+    HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
+    if(NULL == (ptdata = (hsize_t *)HDmalloc((size_t) alloc_size)))
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
+
+    if(H5Sget_select_elem_pointlist(region_space, (hsize_t) 0, npoints, ptdata) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Sget_select_elem_pointlist failed");
+
+    for (indx = 0; indx < npoints; indx++) {
+        unsigned loop_indx;
+
+        h5tools_str_append(buffer, info->dset_ptformat_pre,
+                            indx ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long) indx);
+
+        for (loop_indx = 0; loop_indx < ndims; loop_indx++)
+            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT, loop_indx ? "," : "(",
+                                ptdata[indx * ndims + loop_indx]);
+
+        h5tools_str_append(buffer, ")");
+    } /* end for (indx = 0; indx < npoints; indx++) */
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the region datatype info and indices element end */
+
+    ctx->need_prefix = TRUE;
+
+    if((dtype = H5Dget_type(region_id)) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Dget_type failed");
+
+    if((type_id = H5Tget_native_type(dtype, H5T_DIR_DEFAULT)) < 0)
+        HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Tget_native_type failed");
+
+    /* Render the datatype element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->datatypebegin,
+                        h5tools_dump_header_format->datatypeblockbegin);
+
+    ctx->indent_level++;
+    h5tools_print_datatype(stream, buffer, info, ctx, dtype, TRUE);
+    ctx->indent_level--;
+
+    if (HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->datatypeblockend);
+        if (HDstrlen(h5tools_dump_header_format->datatypeend))
+            h5tools_str_append(buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->datatypeend))
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->datatypeend);
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the datatype element end */
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the dataspace element begin */
+    h5tools_str_reset(buffer);
+
+    ctx->need_prefix = TRUE;
+    h5tools_str_append(buffer, "%s ", h5tools_dump_header_format->dataspacebegin);
+
+    h5tools_print_dataspace(buffer, region_space);
+
+    if (HDstrlen(h5tools_dump_header_format->dataspaceblockend)) {
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->dataspaceblockend);
+        if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+            h5tools_str_append(buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->dataspaceblockend);
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+    /* Render the dataspace element end */
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the databegin element begin */
+    h5tools_str_reset(buffer);
+
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->databegin,
+                        h5tools_dump_header_format->datablockbegin);
+
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos, ncols, region_elmt_counter, elmt_counter);
+
+    ctx->need_prefix = TRUE;
+
+    h5tools_print_region_data_points(region_space, region_id,
+            rawdatastream, info, ctx, buffer, ncols, ndims, type_id, npoints, ptdata);
+
+ done:
+    HDfree(ptdata);
+
+    if(type_id > 0 && H5Tclose(type_id) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    if(dtype > 0 && H5Tclose(dtype) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+    ctx->need_prefix = TRUE;
+
+    /* Render the dataend element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "%s %s ",
+                        h5tools_dump_header_format->dataend,
+                        h5tools_dump_header_format->datablockend);
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos,
+                                              ncols, region_elmt_counter, elmt_counter);
+    /* Render the dataend element end*/
+
+    ctx->indent_level--;
+    ctx->need_prefix = TRUE;
+
+    /* Render the region } element begin */
+    h5tools_str_reset(buffer);
+    h5tools_str_append(buffer, "}");
+    dimension_break = h5tools_render_element(stream, info, ctx, buffer, curr_pos,
+                                                ncols, region_elmt_counter, elmt_counter);
+    /* Render the region } element end */
+
+    H5_LEAVE(dimension_break)
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     print out the data for a subset of a dataset.
+ * Description:
+ *
+ *  Select a hyperslab from the dataset DSET using the parameters
+ *   specified in SSET. Dump this out to STREAM.
+ *
+ *  Hyperslabs select "count" blocks of size "block", spaced "stride" elements
+ *   from each other, starting at coordinate "start".
+ *
+ * Return:
+ *      On success, return SUCCEED. Otherwise, the function returns FAIL.
+ *
+ * Algorithm
+ *
+ * The parameters from SSET are translated into temporary
+ * variables so that 1 row is printed at a time (getting the coordinate indices
+ * at each row).
+ * We define the stride, count and block to be 1 in the row dimension to achieve
+ * this and advance until all points are printed.
+ *
+ * The element position is obtained from the matrix according to:
+ *       Given an index I(z,y,x) its position from the beginning of an array
+ *       of sizes A(size_z, size_y,size_x) is given by
+ *       Position of I(z,y,x) = index_z * size_y * size_x
+ *                             + index_y * size_x
+ *                             + index_x
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+h5tools_print_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+                           hid_t dset, hid_t p_type, struct subset_t *sset,
+                           hid_t f_space, hsize_t hyperslab_count,
+                           hsize_t *temp_start,/* start inside offset count loop */
+                           hsize_t *temp_count,/* count inside offset count loop  */
+                           hsize_t *temp_block,/* block size used in loop  */
+                           hsize_t *temp_stride,/* stride size used in loop  */
+                           hsize_t *total_size,/* total size of dataset */
+                           unsigned int row_dim/* index of row_counter dimension */)
+{
+    HERR_INIT(herr_t, SUCCEED)
+    size_t            i;                       /* counters  */
+    size_t            j;                       /* counters  */
+    hsize_t           zero[1] = {0};           /* vector of zeros */
+    unsigned int      flags;                   /* buffer extent flags */
+    hsize_t           elmtno;                  /* elemnt index  */
+    hsize_t           low[H5S_MAX_RANK];       /* low bound of hyperslab */
+    hsize_t           high[H5S_MAX_RANK];      /* higher bound of hyperslab */
+    size_t            p_type_nbytes;           /* size of memory type */
+    hsize_t           sm_size[H5S_MAX_RANK];   /* stripmine size */
+    hsize_t           sm_nbytes;               /* bytes per stripmine */
+    hssize_t          ssm_nelmts;              /* elements per stripmine*/
+    hsize_t           sm_nelmts;               /* elements per stripmine*/
+    unsigned char    *sm_buf = NULL;           /* buffer for raw data */
+    hid_t             sm_space = -1;           /* stripmine data space */
+    hsize_t           size_row_block;          /* size for blocks along rows */
+    hsize_t           row_counter = 0;
+
+    /* VL data special information */
+    unsigned int        vl_data = 0; /* contains VL datatypes */
+
+    if ((size_t) ctx->ndims > NELMTS(sm_size))
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "ndims and sm_size comparision failed");
+
+    if (ctx->ndims > 0)
+        init_acc_pos(ctx, total_size);
+
+    size_row_block = sset->block.data[row_dim];
+
+    /* Check if we have VL data in the dataset's datatype */
+    if (h5tools_detect_vlen(p_type) == TRUE)
+        vl_data = TRUE;
+
+    /* display loop */
+    for (; hyperslab_count > 0; temp_start[row_dim] += temp_stride[row_dim], hyperslab_count--) {
+        /* jump rows if size of block exceeded
+         cases where block > 1 only and stride > block */
+        if (size_row_block > 1
+                && row_counter == size_row_block
+                && sset->stride.data[row_dim] > sset->block.data[row_dim]) {
+
+            hsize_t increase_rows = sset->stride.data[row_dim] - sset->block.data[row_dim];
+            temp_start[row_dim] += increase_rows;
+            row_counter = 0;
+        }
+
+        row_counter++;
+
+        /* calculate the potential number of elements we're going to print */
+        if(H5Sselect_hyperslab(f_space, H5S_SELECT_SET, temp_start, temp_stride, temp_count, temp_block) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+
+        if((ssm_nelmts = H5Sget_select_npoints(f_space)) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_select_npoints failed");
+        sm_nelmts = (hsize_t)ssm_nelmts;
+
+        if (sm_nelmts > 0) {
+            /*
+             * determine the strip mine size and allocate a buffer. the strip mine is
+             * a hyperslab whose size is manageable.
+             */
+            if((sm_nbytes = p_type_nbytes = H5Tget_size(p_type)) == 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+            if (ctx->ndims > 0)
+                for (i = ctx->ndims; i > 0; --i) {
+                    hsize_t size = H5TOOLS_BUFSIZE / sm_nbytes;
+                    if (size == 0) /* datum size > H5TOOLS_BUFSIZE */
+                        size = 1;
+                    sm_size[i - 1] = MIN(total_size[i - 1], size);
+                    sm_nbytes *= sm_size[i - 1];
+                    HDassert(sm_nbytes > 0);
+                }
+
+            HDassert(sm_nbytes == (hsize_t) ((size_t) sm_nbytes)); /*check for overflow*/
+            if(NULL == (sm_buf = (unsigned char *)HDmalloc((size_t) sm_nelmts * p_type_nbytes)))
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for strip-mine");
+
+            if((sm_space = H5Screate_simple(1, &sm_nelmts, NULL)) < 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
+
+            if(H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, zero, NULL, &sm_nelmts, NULL) < 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+
+            /* read the data */
+            if(H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) < 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+
+            /* print the data */
+            flags = START_OF_DATA;
+
+            if (hyperslab_count == 1)
+                flags |= END_OF_DATA;
+
+            for (i = 0; i < ctx->ndims; i++)
+                ctx->p_max_idx[i] = ctx->p_min_idx[i] + MIN(total_size[i], sm_size[i]);
+
+            /* print array indices. get the lower bound of the hyperslab and calulate
+             the element position at the start of hyperslab */
+            if(H5Sget_select_bounds(f_space, low, high) < 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_select_bounds failed");
+
+            elmtno = 0;
+            for (i = 0; i < (size_t) ctx->ndims - 1; i++) {
+                hsize_t offset = 1; /* accumulation of the previous dimensions */
+                for (j = i + 1; j < (size_t) ctx->ndims; j++)
+                    offset *= total_size[j];
+                elmtno += low[i] * offset;
+            }
+            elmtno += low[ctx->ndims - 1];
+
+            /* initialize the current stripmine position; this is necessary to print the array
+             indices */
+            ctx->sm_pos = elmtno;
+
+            ctx->need_prefix = TRUE;
+
+            if(h5tools_dump_simple_data(stream, info, dset, ctx, flags, sm_nelmts, p_type, sm_buf) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "h5tools_dump_simple_data failed");
+
+            /* Reclaim any VL memory, if necessary */
+            if (vl_data)
+                H5Dvlen_reclaim(p_type, sm_space, H5P_DEFAULT, sm_buf);
+
+            if(H5Sclose(sm_space) < 0)
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+            if(sm_buf)
+                HDfree(sm_buf);
+            sm_buf = NULL;
+        }
+        else
+            H5E_THROW(SUCCEED, H5E_tools_min_id_g, "nothing to print");
+
+        ctx->continuation++;
+
+    } /* hyperslab_count loop */
+
+CATCH
+    if(sm_buf)
+        HDfree(sm_buf);
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     print out the data for a subset of a dataset.
+ * Description:
+ *
+ *  Select a hyperslab from the dataset DSET using the parameters
+ *   specified in SSET. Dump this out to STREAM.
+ *
+ *  Hyperslabs select "count" blocks of size "block", spaced "stride" elements
+ *   from each other, starting at coordinate "start".
+ *
+ * Return:
+ *      On success, return SUCCEED. Otherwise, the function returns FAIL.
+ *
+ * Algorithm
+ *
+ * The parameters from SSET are translated into temporary
+ * variables so that 1 row is printed at a time (getting the coordinate indices
+ * at each row).
+ * We define the stride, count and block to be 1 in the row dimension to achieve
+ * this and advance until all points are printed.
+ *
+ * The element position is obtained from the matrix according to:
+ *       Given an index I(z,y,x) its position from the beginning of an array
+ *       of sizes A(size_z, size_y,size_x) is given by
+ *       Position of I(z,y,x) = index_z * size_y * size_x
+ *                             + index_y * size_x
+ *                             + index_x
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+h5tools_display_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+                           hid_t dset, hid_t p_type, struct subset_t *sset,
+                           hid_t f_space, hsize_t *total_size)
+{
+    size_t            i;                       /* counters  */
+    hsize_t           n;                       /* counters  */
+    hsize_t           count;                   /* hyperslab count */
+    hsize_t           outer_count;             /* offset count */
+    unsigned int      row_dim;                 /* index of row_counter dimension */
+    int               current_outer_dim;       /* dimension for start */
+    hsize_t           temp_start[H5S_MAX_RANK];/* temporary start inside offset count loop */
+    hsize_t           max_start[H5S_MAX_RANK]; /* maximum start inside offset count loop */
+    hsize_t           temp_count[H5S_MAX_RANK];/* temporary count inside offset count loop  */
+    hsize_t           temp_block[H5S_MAX_RANK];/* temporary block size used in loop  */
+    hsize_t           temp_stride[H5S_MAX_RANK];/* temporary stride size used in loop  */
+    int               reset_dim;
+    herr_t            ret_value = SUCCEED;
+
+    if (ctx->ndims == 1)
+        row_dim = 0;
+    else
+        row_dim = ctx->ndims - 2;
+
+    /* get the offset count */
+    outer_count = 1;
+    if (ctx->ndims > 2)
+        for (i = 0; i < (size_t) ctx->ndims - 2; i++) {
+            /* block size is handled by containing h5tools_print_simple_subset call */
+            outer_count = outer_count * sset->count.data[i];
+        }
+
+    /* initialize temporary start, count and maximum start */
+    for (i = 0; i < ctx->ndims; i++) {
+        temp_start[i] = sset->start.data[i];
+        temp_count[i] = sset->count.data[i];
+        temp_block[i] = sset->block.data[i];
+        temp_stride[i] = sset->stride.data[i];
+        max_start[i] = 0;
+    }
+
+    if (ctx->ndims > 2) {
+        for (i = 0; i < (size_t) ctx->ndims - 2; i++) {
+            max_start[i] = temp_start[i] + sset->count.data[i] * sset->stride.data[i];
+            temp_count[i] = 1;
+        }
+    }
+
+    /* offset loop */
+    for (n = 0; n < outer_count; n++) {
+        /* number of read iterations in inner loop, read by rows, to match 2D display */
+        if (ctx->ndims > 1) {
+            /* count is the number of iterations to display all the rows,
+             the block size count times */
+            count = sset->count.data[row_dim] * sset->block.data[row_dim];
+
+            /* always 1 row_counter at a time, that is a block of size 1, 1 time */
+            temp_count[row_dim] = 1;
+            temp_block[row_dim] = 1;
+
+            /* advance 1 row_counter at a time  */
+            if (sset->block.data[row_dim] > 1)
+                temp_stride[row_dim] = 1;
+        }
+        /* for the 1D case */
+        else {
+            count = 1;
+        }
+
+        h5tools_print_simple_subset(stream, info, ctx, dset, p_type, sset,
+                                   f_space, count, temp_start, temp_count,
+                                   temp_block, temp_stride, total_size, row_dim);
+
+        if (ctx->ndims > 2) {
+            /* dimension for start */
+            current_outer_dim = (int)(ctx->ndims - 2) - 1;
+
+            /* set start to original from current_outer_dim up */
+            for (i = (size_t)(current_outer_dim + 1); i < ctx->ndims; i++)
+                temp_start[i] = sset->start.data[i];
+
+            /* increment start dimension */
+            do {
+                reset_dim = 0;
+                temp_start[current_outer_dim] += sset->stride.data[current_outer_dim];
+                if (temp_start[current_outer_dim] >= max_start[current_outer_dim]) {
+                    temp_start[current_outer_dim] = sset->start.data[current_outer_dim];
+
+                    current_outer_dim--;
+                    reset_dim = 1;
+                }
+            } while (current_outer_dim >= 0 && reset_dim);
+
+        } /* ctx.ndims > 1 */
+
+    } /* outer_count */
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Dump out a subset of a dataset.
+ * Description:
+ *
+ *  Select a hyperslab from the dataset DSET using the parameters
+ *   specified in SSET. Dump this out to STREAM.
+ *
+ *  Hyperslabs select "count" blocks of size "block", spaced "stride" elements
+ *   from each other, starting at coordinate "start".
+ *
+ * Return:
+ *      On success, return SUCCEED. Otherwise, the function returns FAIL.
+ *
+ * Original programmer:
+ *      Bill Wendling, Wednesday, March 07, 2001
+ *
+ * Rewritten with modified algorithm by:
+ *      Pedro Vicente, Wednesday, January 16, 2008, contributions from Quincey Koziol
+ *
+ * Algorithm
+ *
+ * In a inner loop, the parameters from SSET are translated into temporary
+ * variables so that 1 row is printed at a time (getting the coordinate indices
+ * at each row).
+ * We define the stride, count and block to be 1 in the row dimension to achieve
+ * this and advance until all points are printed.
+ * An outer loop for cases where dimensionality is greater than 2D is made.
+ * In each iteration, the 2D block is displayed in the inner loop. The remaining
+ * slower dimensions above the first 2 are incremented one at a time in the outer loop
+ *
+ * The element position is obtained from the matrix according to:
+ *       Given an index I(z,y,x) its position from the beginning of an array
+ *       of sizes A(size_z, size_y,size_x) is given by
+ *       Position of I(z,y,x) = index_z * size_y * size_x
+ *                             + index_y * size_x
+ *                             + index_x
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx, hid_t dset,
+                           hid_t p_type, struct subset_t *sset)
+{
+    HERR_INIT(herr_t, SUCCEED)
+    int               sndims;
+    hid_t             f_space = -1;            /* file data space */
+    size_t            i;                       /* counters  */
+    hsize_t           total_size[H5S_MAX_RANK];/* total size of dataset*/
+
+    if((f_space = H5Dget_space(dset)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+
+    if((sndims = H5Sget_simple_extent_ndims(f_space)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ctx->ndims = (unsigned)sndims;
+
+    /* assume entire data space to be printed */
+    if (ctx->ndims > 0)
+        for (i = 0; i < (size_t) ctx->ndims; i++)
+            ctx->p_min_idx[i] = 0;
+
+    if(H5Sget_simple_extent_dims(f_space, total_size, NULL) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+    ctx->size_last_dim = total_size[ctx->ndims - 1];
+
+    h5tools_display_simple_subset(stream, info, ctx, dset, p_type, sset, f_space, total_size);
+
+CATCH
+    if(f_space >= 0 && H5Sclose(f_space) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose: Print some values from a dataset with a simple data space.
+ * Description:
+ *      This is a special case of h5tools_dump_dset(). This function only
+ *      intended for dumping datasets -- it does strip mining and some other
+ *      things which are unnecessary for smaller objects such as attributes
+ *      (to print small objects like attributes simply read the attribute and
+ *      call h5tools_dump_simple_mem()).
+ * Return:
+ *      On success, the function returns SUCCEED. Otherwise, the function
+ *      returns FAIL.
+ *-------------------------------------------------------------------------
+ */
+static int
+h5tools_dump_simple_dset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+                         hid_t dset, hid_t p_type)
+{
+    HERR_INIT(herr_t, SUCCEED)
+    hid_t               f_space = -1;                  /* file data space */
+    hsize_t             elmtno;                   /* counter  */
+    size_t              i;                        /* counter  */
+    int                 sndims;                   /* rank of dataspace */
+    int                 carry;                    /* counter carry value */
+    hsize_t             zero[8];                  /* vector of zeros */
+    unsigned int        flags;                    /* buffer extent flags */
+    hsize_t             total_size[H5S_MAX_RANK]; /* total size of dataset*/
+
+    /* Print info */
+    size_t              p_type_nbytes;            /* size of memory type */
+    hsize_t             p_nelmts;                 /* total selected elmts */
+
+    /* Stripmine info */
+    hsize_t             sm_size[H5S_MAX_RANK];    /* stripmine size */
+    hsize_t             sm_nbytes;                /* bytes per stripmine */
+    hsize_t             sm_nelmts;                /* elements per stripmine*/
+    unsigned char      *sm_buf = NULL;            /* buffer for raw data */
+    hid_t               sm_space = -1;                 /* stripmine data space */
+
+    /* Hyperslab info */
+    hsize_t             hs_offset[H5S_MAX_RANK];  /* starting offset */
+    hsize_t             hs_size[H5S_MAX_RANK];    /* size this pass */
+    hsize_t             hs_nelmts;                /* elements in request */
+
+    /* VL data special information */
+    unsigned int        vl_data = 0; /* contains VL datatypes */
+
+    f_space = H5Dget_space(dset);
+
+    if (f_space == FAIL)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+
+    sndims = H5Sget_simple_extent_ndims(f_space);
+    if(sndims < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_simple_extent_ndims failed");
+    ctx->ndims = (unsigned)sndims;
+
+    if ((size_t)ctx->ndims > NELMTS(sm_size))
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "ctx->ndims > NELMTS(sm_size) failed");
+
+    /* Assume entire data space to be printed */
+    if (ctx->ndims > 0)
+        for (i = 0; i < (size_t)ctx->ndims; i++)
+            ctx->p_min_idx[i] = 0;
+
+    H5Sget_simple_extent_dims(f_space, total_size, NULL);
+
+    /* calculate the number of elements we're going to print */
+    p_nelmts = 1;
+
+    if (ctx->ndims > 0) {
+        for (i = 0; i < ctx->ndims; i++)
+            p_nelmts *= total_size[i];
+        ctx->size_last_dim = (total_size[ctx->ndims - 1]);
+    } /* end if */
+    else
+        ctx->size_last_dim = 0;
+
+    if (p_nelmts == 0) {
+        H5_LEAVE(SUCCEED); /* nothing to print */
+    }
+
+    /* Check if we have VL data in the dataset's datatype */
+    if (h5tools_detect_vlen(p_type) == TRUE)
+        vl_data = TRUE;
+
+    /*
+     * Determine the strip mine size and allocate a buffer. The strip mine is
+     * a hyperslab whose size is manageable.
+     */
+    sm_nbytes = p_type_nbytes = H5Tget_size(p_type);
+
+    if (ctx->ndims > 0) {
+        for (i = ctx->ndims; i > 0; --i) {
+            hsize_t size = H5TOOLS_BUFSIZE / sm_nbytes;
+            if ( size == 0) /* datum size > H5TOOLS_BUFSIZE */
+                size = 1;
+            sm_size[i - 1] = MIN(total_size[i - 1], size);
+            sm_nbytes *= sm_size[i - 1];
+            HDassert(sm_nbytes > 0);
+        }
+    }
+
+    if(!sm_nbytes)
+        goto done;
+
+    HDassert(sm_nbytes == (hsize_t)((size_t)sm_nbytes)); /*check for overflow*/
+    sm_buf = (unsigned char *)HDmalloc((size_t)sm_nbytes);
+
+    sm_nelmts = sm_nbytes / p_type_nbytes;
+    sm_space = H5Screate_simple(1, &sm_nelmts, NULL);
+
+    if (ctx->ndims > 0)
+        init_acc_pos(ctx, total_size);
+
+    /* The stripmine loop */
+    HDmemset(hs_offset, 0, sizeof hs_offset);
+    HDmemset(zero, 0, sizeof zero);
+
+    for (elmtno = 0; elmtno < p_nelmts; elmtno += hs_nelmts) {
+        /* Calculate the hyperslab size */
+        if (ctx->ndims > 0) {
+            for (i = 0, hs_nelmts = 1; i < ctx->ndims; i++) {
+                hs_size[i] = MIN(total_size[i] - hs_offset[i], sm_size[i]);
+                ctx->p_max_idx[i] = ctx->p_min_idx[i] + hs_size[i];
+                hs_nelmts *= hs_size[i];
+            }
+
+            H5Sselect_hyperslab(f_space, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL);
+            H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, zero, NULL, &hs_nelmts, NULL);
+        }
+        else {
+            H5Sselect_all(f_space);
+            H5Sselect_all(sm_space);
+            hs_nelmts = 1;
+        }
+
+        /* Read the data */
+        if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) < 0) {
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+        }
+
+        /* Print the data */
+        flags = (elmtno == 0) ? START_OF_DATA : 0;
+        flags |= ((elmtno + hs_nelmts) >= p_nelmts) ? END_OF_DATA : 0;
+
+        /* initialize the current stripmine position; this is necessary to print the array
+         indices */
+        ctx->sm_pos = elmtno;
+
+        if(h5tools_dump_simple_data(stream, info, dset, ctx, flags, hs_nelmts, p_type, sm_buf) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "h5tools_dump_simple_data failed");
+
+        /* Reclaim any VL memory, if necessary */
+        if (vl_data)
+            H5Dvlen_reclaim(p_type, sm_space, H5P_DEFAULT, sm_buf);
+
+        /* Calculate the next hyperslab offset */
+        for (i = ctx->ndims, carry = 1; i > 0 && carry; --i) {
+            ctx->p_min_idx[i - 1] = ctx->p_max_idx[i - 1];
+            hs_offset[i - 1] += hs_size[i - 1];
+
+            if (hs_offset[i - 1] == total_size[i - 1])
+                hs_offset[i - 1] = 0;
+            else
+                carry = 0;
+        }
+
+        ctx->continuation++;
+    }
+
+CATCH
+    if(sm_buf)
+        HDfree(sm_buf);
+
+done:
+    if(sm_space >= 0 && H5Sclose(sm_space) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+    if(f_space >= 0 && H5Sclose(f_space) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_dump_simple_mem
+ *
+ * Purpose: Print some values from memory with a simple data space.
+ *  This is a special case of h5tools_dump_mem().
+ *
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+h5tools_dump_simple_mem(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx, hid_t obj_id,
+                        hid_t type, hid_t space, void *mem)
+{
+    HERR_INIT(herr_t, SUCCEED)
+    int            sndims; /* rank of dataspace */
+    unsigned       i;      /*counters  */
+    hsize_t        nelmts; /*total selected elmts */
+
+    sndims = H5Sget_simple_extent_ndims(space);
+    if(sndims < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_simple_extent_ndims failed");
+    ctx->ndims = (unsigned)sndims;
+
+    if ((size_t) ctx->ndims > NELMTS(ctx->p_min_idx))
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "ctx->ndims > NELMTS(ctx->p_min_idx) failed");
+
+    /* Assume entire data space to be printed */
+    for (i = 0; i < ctx->ndims; i++)
+        ctx->p_min_idx[i] = 0;
+
+    H5Sget_simple_extent_dims(space, ctx->p_max_idx, NULL);
+
+    for (i = 0, nelmts = 1; ctx->ndims != 0 && i < ctx->ndims; i++)
+        nelmts *= ctx->p_max_idx[i] - ctx->p_min_idx[i];
+
+    if (nelmts == 0)
+        H5_LEAVE(SUCCEED); /* nothing to print */
+    if (ctx->ndims > 0) {
+        HDassert(ctx->p_max_idx[ctx->ndims - 1] == (hsize_t) ((int) ctx->p_max_idx[ctx->ndims - 1]));
+        ctx->size_last_dim = ctx->p_max_idx[ctx->ndims - 1];
+    } /* end if */
+    else
+        ctx->size_last_dim = 0;
+
+    if (ctx->ndims > 0)
+        init_acc_pos(ctx, ctx->p_max_idx);
+
+    if(h5tools_dump_simple_data(stream, info, obj_id, ctx, START_OF_DATA | END_OF_DATA, nelmts, type, mem) < 0)
+        HERROR(H5E_tools_g, H5E_tools_min_id_g, "h5tools_dump_simple_data failed");
+
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_dump_dset
+ *
+ * Purpose: Print some values from a dataset DSET to the file STREAM
+ *  after converting all types to P_TYPE (which should be a
+ *  native type).  If P_TYPE is a negative value then it will be
+ *  computed from the dataset type using only native types.
+ *
+ * Note: This function is intended only for datasets since it does
+ *  some things like strip mining which are unnecessary for
+ *  smaller objects such as attributes. The easiest way to print
+ *  small objects is to read the object into memory and call
+ *  h5tools_dump_mem().
+ *
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-07
+ *      If info->raw is set then the memory datatype will be the same
+ *      as the file datatype.
+ *
+ *  Bill Wendling, 2001-02-27
+ *      Renamed to ``h5tools_dump_dset'' and added the subsetting
+ *      parameter.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_dump_dset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+        hid_t dset, struct subset_t *sset)
+{
+    hid_t     f_space = -1;
+    hid_t     p_type = -1;
+    hid_t     f_type = -1;
+    H5S_class_t space_type;
+    int       status = FAIL;
+    h5tool_format_t info_dflt;
+    /* Use default values */
+    if (!stream)
+        stream = rawoutstream;
+
+    if (!info) {
+        HDmemset(&info_dflt, 0, sizeof info_dflt);
+        info = &info_dflt;
+    }
+
+    f_type = H5Dget_type(dset);
+    if (f_type < 0)
+        goto done;
+
+    if (info->raw || bin_form == 1)
+        p_type = H5Tcopy(f_type);
+    else if (bin_form == 2)
+        p_type = h5tools_get_little_endian_type(f_type);
+    else if (bin_form == 3)
+        p_type = h5tools_get_big_endian_type(f_type);
+    else
+        p_type = h5tools_get_native_type(f_type);
+
+    if (p_type < 0)
+        goto done;
+
+    /* Check the data space */
+    f_space = H5Dget_space(dset);
+    if (f_space < 0)
+        goto done;
+
+    space_type = H5Sget_simple_extent_type(f_space);
+
+    /* Print the data */
+    if (space_type == H5S_SIMPLE || space_type == H5S_SCALAR) {
+        if(!sset)
+            status = h5tools_dump_simple_dset(rawdatastream, info, ctx, dset, p_type);
+        else
+            status = h5tools_dump_simple_subset(rawdatastream, info, ctx, dset, p_type, sset);
+    }
+    else
+        /* space is H5S_NULL */
+        status = SUCCEED;
+
+done:
+    if (f_type > 0)
+        H5Tclose(f_type);
+    if (p_type > 0)
+        H5Tclose(p_type);
+    if (f_space > 0)
+        H5Sclose(f_space);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_dump_mem
+ *
+ * Purpose: Displays the data contained in MEM. MEM must have the
+ *  specified data TYPE and SPACE.  Currently only simple data
+ *  spaces are allowed and only the `all' selection.
+ *
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_dump_mem(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
+                hid_t obj_id, hid_t type, hid_t space, void *mem)
+{
+    HERR_INIT(int, SUCCEED)
+    h5tool_format_t    info_dflt;
+
+    /* Use default values */
+    if (!stream)
+        stream = rawoutstream;
+
+    if (!info) {
+        HDmemset(&info_dflt, 0, sizeof(info_dflt));
+        info = &info_dflt;
+    }
+
+    /* Check the data space */
+    if (H5Sis_simple(space) <= 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sis_simple failed")
+
+     H5_LEAVE(h5tools_dump_simple_mem(rawattrstream, info, ctx, obj_id, type, space, mem))
+
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    print_datatype
+ *
+ * Purpose:     print the datatype - do not prefix.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_str_t *buffer
+ *              h5tools_context_t *ctx
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t type, int object_search)
+{
+    HERR_INIT(int, SUCCEED)
+    char        *mname;
+    hid_t        mtype = -1;
+    hid_t        str_type = -1;
+    hid_t        super = -1;
+    hid_t        tmp_type = -1;
+    int          snmembers;
+    int          sndims;
+    unsigned     nmembers;
+    unsigned     i;
+    size_t       size = 0;
+    size_t       ncols = 80; /*available output width */
+    hsize_t      dims[H5TOOLS_DUMP_MAX_RANK];
+    hsize_t      curr_pos = 0;        /* total data element position   */
+    H5T_str_t    str_pad;
+    H5T_cset_t   cset;
+    H5T_order_t  order;
+    H5T_class_t  type_class;
+    H5T_sign_t   sign;           /* sign scheme value */
+    htri_t       is_vlstr = FALSE;
+    const char  *sign_s = NULL;  /* sign scheme string */
+    const char  *order_s = NULL; /* byte order string */
+
+    if((type_class = H5Tget_class(type)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_class failed");
+    if (object_search && H5Tcommitted(type) > 0) {
+        H5O_info_t  oinfo;
+        obj_t      *obj = NULL;    /* Found object */
+
+        H5Oget_info(type, &oinfo);
+        obj = search_obj(h5dump_type_table, oinfo.addr);
+
+        if(obj) {
+            if(!obj->recorded) {
+                h5tools_str_append(buffer,"\"/#"H5_PRINTF_HADDR_FMT"\"", obj->objno);
+            }
+            else
+                h5tools_str_append(buffer, "\"%s\"", obj->objname);
+        }
+        else {
+            error_msg("unknown committed type.\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        return ret_value;
+    }
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    switch (type_class) {
+    case H5T_INTEGER:
+        if (H5Tequal(type, H5T_STD_I8BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I8BE");
+        }
+        else if (H5Tequal(type, H5T_STD_I8LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I8LE");
+        }
+        else if (H5Tequal(type, H5T_STD_I16BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I16BE");
+        }
+        else if (H5Tequal(type, H5T_STD_I16LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I16LE");
+        }
+        else if (H5Tequal(type, H5T_STD_I32BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I32BE");
+        }
+        else if (H5Tequal(type, H5T_STD_I32LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I32LE");
+        }
+        else if (H5Tequal(type, H5T_STD_I64BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I64BE");
+        }
+        else if (H5Tequal(type, H5T_STD_I64LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_I64LE");
+        }
+        else if (H5Tequal(type, H5T_STD_U8BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U8BE");
+        }
+        else if (H5Tequal(type, H5T_STD_U8LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U8LE");
+        }
+        else if (H5Tequal(type, H5T_STD_U16BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U16BE");
+        }
+        else if (H5Tequal(type, H5T_STD_U16LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U16LE");
+        }
+        else if (H5Tequal(type, H5T_STD_U32BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U32BE");
+        }
+        else if (H5Tequal(type, H5T_STD_U32LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U32LE");
+        }
+        else if (H5Tequal(type, H5T_STD_U64BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U64BE");
+        }
+        else if (H5Tequal(type, H5T_STD_U64LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_U64LE");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_SCHAR) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_SCHAR");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_UCHAR) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_UCHAR");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_SHORT) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_SHORT");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_USHORT) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_USHORT");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_INT) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_INT");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_UINT) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_UINT");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_LONG) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_LONG");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_ULONG) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_ULONG");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_LLONG) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_LLONG");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_ULLONG) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_ULLONG");
+        }
+        else {
+
+            /* byte order */
+            if (H5Tget_size(type) > 1) {
+                order = H5Tget_order(type);
+                if (H5T_ORDER_LE == order) {
+                    order_s = " little-endian";
+                }
+                else if (H5T_ORDER_BE == order) {
+                    order_s = " big-endian";
+                }
+                else if (H5T_ORDER_VAX == order) {
+                    order_s = " mixed-endian";
+                }
+                else {
+                    order_s = " unknown-byte-order";
+                }
+            }
+            else {
+                order_s = "";
+            }
+
+            /* sign */
+            if ((sign = H5Tget_sign(type)) >= 0) {
+                if (H5T_SGN_NONE == sign) {
+                    sign_s = " unsigned";
+                }
+                else if (H5T_SGN_2 == sign) {
+                    sign_s = "";
+                }
+                else {
+                    sign_s = " unknown-sign";
+                }
+            }
+            else {
+                sign_s = " unknown-sign";
+            }
+
+            /* print size, order, and sign  */
+            h5tools_str_append(buffer, "%lu-bit%s%s integer",
+                                (unsigned long) (8 * H5Tget_size(type)), order_s, sign_s);
+        }
+        break;
+
+    case H5T_FLOAT:
+        if (H5Tequal(type, H5T_IEEE_F32BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_IEEE_F32BE");
+        }
+        else if (H5Tequal(type, H5T_IEEE_F32LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_IEEE_F32LE");
+        }
+        else if (H5Tequal(type, H5T_IEEE_F64BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_IEEE_F64BE");
+        }
+        else if (H5Tequal(type, H5T_IEEE_F64LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_IEEE_F64LE");
+        }
+        else if (H5Tequal(type, H5T_VAX_F32) == TRUE) {
+            h5tools_str_append(buffer, "H5T_VAX_F32");
+        }
+        else if (H5Tequal(type, H5T_VAX_F64) == TRUE) {
+            h5tools_str_append(buffer, "H5T_VAX_F64");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_FLOAT) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_FLOAT");
+        }
+        else if (H5Tequal(type, H5T_NATIVE_DOUBLE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_DOUBLE");
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        }
+        else if (H5Tequal(type, H5T_NATIVE_LDOUBLE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_NATIVE_LDOUBLE");
+#endif
+        }
+        else {
+
+            /* byte order */
+            if (H5Tget_size(type) > 1) {
+                order = H5Tget_order(type);
+                if (H5T_ORDER_LE == order) {
+                    order_s = " little-endian";
+                }
+                else if (H5T_ORDER_BE == order) {
+                    order_s = " big-endian";
+                }
+                else if (H5T_ORDER_VAX == order) {
+                    order_s = " mixed-endian";
+                }
+                else {
+                    order_s = " unknown-byte-order";
+                }
+            }
+            else {
+                order_s = "";
+            }
+
+            /* print size and byte order */
+            h5tools_str_append(buffer, "%lu-bit%s floating-point",
+                                (unsigned long) (8 * H5Tget_size(type)), order_s);
+
+        }
+        break;
+
+    case H5T_TIME:
+        h5tools_str_append(buffer, "H5T_TIME: not yet implemented");
+        break;
+
+    case H5T_STRING:
+        /* Make a copy of type in memory in case when TYPE is on disk, the size
+         * will be bigger than in memory.  This makes it easier to compare
+         * types in memory. */
+        tmp_type = H5Tcopy(type);
+        size = H5Tget_size(tmp_type);
+        str_pad = H5Tget_strpad(tmp_type);
+        cset = H5Tget_cset(tmp_type);
+        is_vlstr = H5Tis_variable_str(tmp_type);
+
+        curr_pos = ctx->cur_column;
+        h5tools_str_append(buffer, "H5T_STRING %s", h5tools_dump_header_format->strblockbegin);
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx->indent_level++;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+
+        if (is_vlstr)
+            h5tools_str_append(buffer, "%s H5T_VARIABLE;", STRSIZE);
+        else
+            h5tools_str_append(buffer, "%s %d;", STRSIZE, (int) size);
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+
+        h5tools_str_append(buffer, "%s ", STRPAD);
+        switch (str_pad) {
+            case H5T_STR_NULLTERM:
+                h5tools_str_append(buffer, "H5T_STR_NULLTERM;");
+                break;
+            case H5T_STR_NULLPAD:
+                h5tools_str_append(buffer, "H5T_STR_NULLPAD;");
+                break;
+            case H5T_STR_SPACEPAD:
+                h5tools_str_append(buffer, "H5T_STR_SPACEPAD;");
+                break;
+            case H5T_STR_RESERVED_3:
+            case H5T_STR_RESERVED_4:
+            case H5T_STR_RESERVED_5:
+            case H5T_STR_RESERVED_6:
+            case H5T_STR_RESERVED_7:
+            case H5T_STR_RESERVED_8:
+            case H5T_STR_RESERVED_9:
+            case H5T_STR_RESERVED_10:
+            case H5T_STR_RESERVED_11:
+            case H5T_STR_RESERVED_12:
+            case H5T_STR_RESERVED_13:
+            case H5T_STR_RESERVED_14:
+            case H5T_STR_RESERVED_15:
+                h5tools_str_append(buffer, "H5T_STR_UNKNOWN;");
+                break;
+            case H5T_STR_ERROR:
+                h5tools_str_append(buffer, "H5T_STR_ERROR;");
+                break;
+            default:
+                h5tools_str_append(buffer, "ERROR;");
+            break;
+        }
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+
+        h5tools_str_append(buffer, "%s ", CSET);
+
+        switch (cset) {
+            case H5T_CSET_ASCII:
+                h5tools_str_append(buffer, "H5T_CSET_ASCII;");
+                break;
+            case H5T_CSET_UTF8:
+                h5tools_str_append(buffer, "H5T_CSET_UTF8;");
+                break;
+            case H5T_CSET_RESERVED_2:
+            case H5T_CSET_RESERVED_3:
+            case H5T_CSET_RESERVED_4:
+            case H5T_CSET_RESERVED_5:
+            case H5T_CSET_RESERVED_6:
+            case H5T_CSET_RESERVED_7:
+            case H5T_CSET_RESERVED_8:
+            case H5T_CSET_RESERVED_9:
+            case H5T_CSET_RESERVED_10:
+            case H5T_CSET_RESERVED_11:
+            case H5T_CSET_RESERVED_12:
+            case H5T_CSET_RESERVED_13:
+            case H5T_CSET_RESERVED_14:
+            case H5T_CSET_RESERVED_15:
+                h5tools_str_append(buffer, "H5T_CSET_UNKNOWN;");
+                break;
+            case H5T_CSET_ERROR:
+                h5tools_str_append(buffer, "H5T_CSET_ERROR;");
+                break;
+            default:
+                h5tools_str_append(buffer, "ERROR;");
+            break;
+        }
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+
+        str_type = H5Tcopy(H5T_C_S1);
+        if (is_vlstr)
+            H5Tset_size(str_type, H5T_VARIABLE);
+        else
+            H5Tset_size(str_type, size);
+        H5Tset_cset(str_type, cset);
+        H5Tset_strpad(str_type, str_pad);
+
+        h5tools_str_append(buffer, "%s ", CTYPE);
+
+        /* Check C variable-length string first. Are the two types equal? */
+        if (H5Tequal(tmp_type, str_type)) {
+            h5tools_str_append(buffer, "H5T_C_S1;");
+            goto found_string_type;
+        }
+
+        /* Change the endianness and see if they're equal. */
+        order = H5Tget_order(tmp_type);
+        if(order == H5T_ORDER_LE) {
+            if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
+        } /* end if */
+        else if(order == H5T_ORDER_BE) {
+            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
+        } /* end if */
+
+        if(H5Tequal(tmp_type, str_type)) {
+            h5tools_str_append(buffer, "H5T_C_S1;");
+            goto found_string_type;
+        }
+
+        /* If not equal to C variable-length string, check Fortran type. */
+        if(H5Tclose(str_type) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+        str_type = H5Tcopy(H5T_FORTRAN_S1);
+
+        H5Tset_cset(str_type, cset);
+        H5Tset_size(str_type, size);
+        H5Tset_strpad(str_type, str_pad);
+
+        /* Are the two types equal? */
+        if (H5Tequal(tmp_type, str_type)) {
+            h5tools_str_append(buffer, "H5T_FORTRAN_S1;");
+            goto found_string_type;
+        }
+
+        /* Change the endianness and see if they're equal. */
+        order = H5Tget_order(tmp_type);
+        if(order == H5T_ORDER_LE) {
+            if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
+        } /* end if */
+        else if(order == H5T_ORDER_BE) {
+            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
+        } /* end if */
+
+        if(H5Tequal(tmp_type, str_type)) {
+            h5tools_str_append(buffer, "H5T_FORTRAN_S1;");
+            goto found_string_type;
+        }
+
+        /* Type doesn't match any of above. */
+        h5tools_str_append(buffer, "unknown_one_character_type;");
+
+  found_string_type:
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+        ctx->indent_level--;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        if(H5Tclose(str_type) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+        if(H5Tclose(tmp_type) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->strblockend);
+        break;
+
+    case H5T_BITFIELD:
+        if (H5Tequal(type, H5T_STD_B8BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B8BE");
+        }
+        else if (H5Tequal(type, H5T_STD_B8LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B8LE");
+        }
+        else if (H5Tequal(type, H5T_STD_B16BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B16BE");
+        }
+        else if (H5Tequal(type, H5T_STD_B16LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B16LE");
+        }
+        else if (H5Tequal(type, H5T_STD_B32BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B32BE");
+        }
+        else if (H5Tequal(type, H5T_STD_B32LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B32LE");
+        }
+        else if (H5Tequal(type, H5T_STD_B64BE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B64BE");
+        }
+        else if (H5Tequal(type, H5T_STD_B64LE) == TRUE) {
+            h5tools_str_append(buffer, "H5T_STD_B64LE");
+        }
+        else {
+            h5tools_str_append(buffer, "undefined bitfield");
+        }
+        break;
+
+    case H5T_OPAQUE:
+        h5tools_str_append(buffer, "H5T_OPAQUE %s", h5tools_dump_header_format->structblockbegin);
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+        ctx->indent_level++;
+        {
+           char *ttag;
+
+           if(NULL == (ttag = H5Tget_tag(type)))
+              H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_tag failed");
+
+           ctx->need_prefix = TRUE;
+           h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+           h5tools_str_reset(buffer);
+           h5tools_str_append(buffer, "OPAQUE_TAG \"%s\";", ttag);
+           h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+           H5free_memory(ttag);
+        }
+        ctx->indent_level--;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->structblockend);
+        break;
+
+    case H5T_COMPOUND:
+        if((snmembers = H5Tget_nmembers(type)) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers failed");
+        nmembers = (unsigned)snmembers;
+
+        h5tools_str_append(buffer, "H5T_COMPOUND %s", h5tools_dump_header_format->structblockbegin);
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx->indent_level++;
+        for (i = 0; i < nmembers; i++) {
+            mname = H5Tget_member_name(type, i);
+            if((mtype = H5Tget_member_type(type, i)) >= 0) {
+                ctx->need_prefix = TRUE;
+                h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+                h5tools_str_reset(buffer);
+                h5tools_print_datatype(stream, buffer, info, ctx, mtype, TRUE);
+
+                h5tools_str_append(buffer, " \"%s\";", mname);
+                h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                if(H5Tclose(mtype) < 0)
+                    HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+            }
+            else
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tget_member_type failed");
+            H5free_memory(mname);
+        }
+        ctx->indent_level--;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->structblockend);
+        break;
+
+    case H5T_REFERENCE:
+        h5tools_str_append(buffer, "H5T_REFERENCE");
+        if (H5Tequal(type, H5T_STD_REF_DSETREG) == TRUE) {
+            h5tools_str_append(buffer, " { H5T_STD_REF_DSETREG }");
+        }
+        else {
+            h5tools_str_append(buffer, " { H5T_STD_REF_OBJECT }");
+        }
+        break;
+
+    case H5T_ENUM:
+        if((super = H5Tget_super(type)) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_super failed");
+
+        h5tools_str_append(buffer, "H5T_ENUM %s", h5tools_dump_header_format->enumblockbegin);
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+        ctx->indent_level++;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        h5tools_print_datatype(stream, buffer, info, ctx, super, TRUE);
+
+        if(H5Tclose(super) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+        h5tools_str_append(buffer, ";");
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_print_enum(stream, buffer, info, ctx, type);
+
+        ctx->indent_level--;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->enumblockend);
+
+        break;
+
+    case H5T_VLEN:
+        if((super = H5Tget_super(type)) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_super failed");
+
+        h5tools_str_append(buffer, "H5T_VLEN %s ", h5tools_dump_header_format->vlenblockbegin);
+
+        h5tools_print_datatype(stream, buffer, info, ctx, super, TRUE);
+
+        if(H5Tclose(super) < 0)
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+
+        h5tools_str_append(buffer, "%s", h5tools_dump_header_format->vlenblockend);
+
+        break;
+
+    case H5T_ARRAY:
+        h5tools_str_append(buffer, "H5T_ARRAY { ");
+
+        /* Get array information */
+        if((sndims = H5Tget_array_ndims(type)) >= 0) {
+            unsigned     ndims = (unsigned)sndims;
+
+            if(H5Tget_array_dims2(type, dims) >= 0) {
+                /* Print array dimensions */
+                for (i = 0; i < ndims; i++)
+                    h5tools_str_append(buffer, "[" HSIZE_T_FORMAT "]", dims[i]);
+
+                h5tools_str_append(buffer, " ");
+            }
+            else
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tget_array_dims2 failed");
+        }
+        else
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tget_array_ndims failed");
+
+        /* Get array base type */
+        if((super = H5Tget_super(type)) >= 0) {
+            /* Print base type */
+            h5tools_print_datatype(stream, buffer, info, ctx, super, TRUE);
+            /* Close array base type */
+            if(H5Tclose(super) < 0)
+                HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
+        }
+        else
+            HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tget_super failed");
+
+        h5tools_str_append(buffer, " }");
+
+        break;
+
+    case H5T_NO_CLASS:
+    case H5T_NCLASSES:
+    default:
+        h5tools_str_append(buffer, "unknown datatype");
+        break;
+    }
+
+CATCH
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    print_dataspace
+ *
+ * Purpose:     print the dataspace.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_str_t *buffer
+ *              h5tools_context_t *ctx
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5tools_print_dataspace(h5tools_str_t *buffer, hid_t space)
+{
+    HERR_INIT(int, SUCCEED)
+    hsize_t     size[H5TOOLS_DUMP_MAX_RANK];
+    hsize_t     maxsize[H5TOOLS_DUMP_MAX_RANK];
+    int         ndims = -1;
+    H5S_class_t space_type = -1;
+    int         i;
+
+    if((ndims = H5Sget_simple_extent_dims(space, size, maxsize)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+    if((space_type = H5Sget_simple_extent_type(space)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_type failed");
+
+    switch(space_type) {
+    case H5S_SCALAR:
+        /* scalar dataspace */
+        h5tools_str_append(buffer, "%s %s", h5tools_dump_header_format->dataspacedescriptionbegin, S_SCALAR);
+        break;
+
+    case H5S_SIMPLE:
+        /* simple dataspace */
+        h5tools_str_append(buffer, "%s %s { %s " HSIZE_T_FORMAT,
+                            h5tools_dump_header_format->dataspacedescriptionbegin, S_SIMPLE,
+                            h5tools_dump_header_format->dataspacedimbegin, size[0]);
+
+        for(i = 1; i < ndims; i++)
+            h5tools_str_append(buffer, ", " HSIZE_T_FORMAT, size[i]);
+
+        h5tools_str_append(buffer, " %s / ", h5tools_dump_header_format->dataspacedimend);
+
+        if(maxsize[0] == H5S_UNLIMITED)
+            h5tools_str_append(buffer, "%s %s",
+                                h5tools_dump_header_format->dataspacedimbegin, "H5S_UNLIMITED");
+        else
+            h5tools_str_append(buffer, "%s " HSIZE_T_FORMAT,
+                                h5tools_dump_header_format->dataspacedimbegin, maxsize[0]);
+
+        for(i = 1; i < ndims; i++)
+            if(maxsize[i] == H5S_UNLIMITED)
+                h5tools_str_append(buffer, ", %s", "H5S_UNLIMITED");
+            else
+                h5tools_str_append(buffer, ", " HSIZE_T_FORMAT, maxsize[i]);
+
+        h5tools_str_append(buffer, " %s }", h5tools_dump_header_format->dataspacedimend);
+        break;
+
+    case H5S_NULL:
+        /* null dataspace */
+        h5tools_str_append(buffer, "%s %s", h5tools_dump_header_format->dataspacedescriptionbegin, S_NULL);
+        break;
+
+    case H5S_NO_CLASS:
+    default:
+        h5tools_str_append(buffer, "%s unknown dataspace %s\n", BEGIN, END);
+        break;
+    } /* end switch */
+
+CATCH
+    return ret_value;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    print_enum
+ *
+ * Purpose:     prints the enum data
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_str_t *buffer
+ *              h5tools_context_t *ctx
+ *
+ *-----------------------------------------------------------------------*/
+int
+h5tools_print_enum(FILE *stream, h5tools_str_t *buffer, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t type)
+{
+    HERR_INIT(int, SUCCEED)
+    char         **name = NULL;  /*member names                   */
+    unsigned char *value = NULL; /*value array                    */
+    unsigned char *copy = NULL;  /*a pointer to value array       */
+    unsigned       i;
+    unsigned       nmembs = 0;   /*number of members              */
+    int            snmembs;
+    hid_t          super = -1;   /*enum base integer type         */
+    hid_t          native = -1;  /*native integer datatype        */
+    H5T_sign_t     sign_type;    /*sign of value type             */
+    size_t         type_size;    /*value type size                */
+    size_t         dst_size;     /*destination value type size    */
+    size_t         ncols = 80; /*available output width */
+    hsize_t        curr_pos = 0;        /* total data element position   */
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    if((snmembs = H5Tget_nmembers(type)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers failed");
+    nmembs = (unsigned)snmembs;
+    HDassert(nmembs > 0);
+
+    if((super = H5Tget_super(type)) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_super failed");
+
+    if((type_size = H5Tget_size(type)) <= 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_size(type) failed");
+
+    /*
+     * Determine what datatype to use for the native values.  To simplify
+     * things we entertain three possibilities:
+     *  1. long long -- the largest native signed integer
+     *  2. unsigned long long -- the largest native unsigned integer
+     *  3. raw format
+     */
+    if(type_size <= sizeof(long long)) {
+        dst_size = sizeof(long long);
+
+        if((sign_type = H5Tget_sign(type))<0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_sign failed");
+        if(H5T_SGN_NONE == sign_type)
+            native = H5T_NATIVE_ULLONG;
+        else
+            native = H5T_NATIVE_LLONG;
+    } /* end if */
+    else
+        dst_size = type_size;
+
+    /* Get the names and raw values of all members */
+    if(NULL == (name = (char **)HDcalloc((size_t)nmembs, sizeof(char *))))
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for member name");
+    if(NULL == (value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(type_size, dst_size))))
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for member value");
+
+    for (i = 0; i < nmembs; i++) {
+        name[i] = H5Tget_member_name(type, i);
+        if(H5Tget_member_value(type, i, value + i * type_size) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_member_value failed");
+    }
+
+    /* Convert values to native datatype */
+    if (native > 0)
+        if(H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT) < 0)
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tconvert failed");
+
+    /*
+     * Sort members by increasing value
+     *    ***not implemented yet***
+     */
+
+    /* Print members */
+    for (i = 0; i < nmembs; i++) {
+        int nchars;       /*number of output characters    */
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(buffer);
+        h5tools_str_append(buffer, "\"%s\"", name[i]);
+        nchars = (int)HDstrlen(name[i]);
+        h5tools_str_append(buffer, "%*s ", MAX(0, 16 - nchars), "");
+
+        if (native < 0) {
+            size_t j;
+
+            h5tools_str_append(buffer, "0x");
+
+            for (j = 0; j < dst_size; j++)
+                h5tools_str_append(buffer, "%02x", value[i * dst_size + j]);
+        }
+        else if (H5T_SGN_NONE == H5Tget_sign(native)) {
+            /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+             *strangely, unless use another pointer "copy".*/
+            copy = value + i * dst_size;
+            h5tools_str_append(buffer, HSIZE_T_FORMAT, *((unsigned long long *) ((void *) copy)));
+        }
+        else {
+            /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+             *strangely, unless use another pointer "copy".*/
+            copy = value + i * dst_size;
+            h5tools_str_append(buffer, "%" H5_PRINTF_LL_WIDTH "d", *((long long *) ((void *) copy)));
+        }
+
+        h5tools_str_append(buffer, ";");
+        h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+CATCH
+    if(name) {
+        /* Release resources */
+        for(i = 0; i < nmembs; i++)
+            if(name[i])
+                H5free_memory(name[i]);
+        HDfree(name);
+    } /* end if */
+
+    if(value)
+        HDfree(value);
+
+    if(super >= 0 && H5Tclose(super) < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "Could not close datatype's super class");
+
+    if(0 == nmembs)
+        h5tools_str_append(buffer, "\n<empty>");
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_datatype
+ *
+ * Purpose:     Dump the datatype. Datatype can be HDF5 predefined
+ *              atomic datatype or committed/transient datatype.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_context_t *ctx
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_datatype(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t type)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    size_t        ncols = 80;      /* available output width        */
+    hsize_t       curr_pos = ctx->sm_pos;   /* total data element position   */
+                                            /* pass to the prefix in h5tools_simple_prefix the total position
+                                             * instead of the current stripmine position i; this is necessary
+                                             * to print the array indices
+                                             */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    ctx->need_prefix = TRUE;
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s ",
+                        h5tools_dump_header_format->datatypebegin,
+                        h5tools_dump_header_format->datatypeblockbegin);
+    h5tools_print_datatype(stream, &buffer, info, ctx, type, TRUE);
+    if (HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeblockend);
+        if (HDstrlen(h5tools_dump_header_format->datatypeend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->datatypeend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeend);
+
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dataspace
+ *
+ * Purpose:     Dump the dataspace.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_context_t *ctx
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_dataspace(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t type)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    size_t        ncols = 80;      /* available output width        */
+    hsize_t       curr_pos = ctx->sm_pos;   /* total data element position   */
+                                            /* pass to the prefix in h5tools_simple_prefix the total position
+                                             * instead of the current stripmine position i; this is necessary
+                                             * to print the array indices
+                                             */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    ctx->need_prefix = TRUE;
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s ",
+                        h5tools_dump_header_format->dataspacebegin);
+
+    h5tools_print_dataspace(&buffer, type);
+
+    if (HDstrlen(h5tools_dump_header_format->dataspaceblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->dataspaceblockend);
+        if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->dataspaceend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->dataspaceend);
+
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_oid
+ *
+ * Purpose:     Dump the oid.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_context_t *ctx
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_oid(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t oid)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    size_t        ncols = 80;      /* available output width        */
+    hsize_t       curr_pos = ctx->sm_pos;   /* total data element position   */
+                                            /* pass to the prefix in h5tools_simple_prefix the total position
+                                             * instead of the current stripmine position i; this is necessary
+                                             * to print the array indices
+                                             */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s %d %s", OBJID, BEGIN, oid, END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_fill_value
+ *
+ * Purpose:     prints the fill value
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_print_fill_value(h5tools_str_t *buffer/*in,out*/, const h5tool_format_t *info, h5tools_context_t *ctx/*in,out*/, hid_t dcpl, hid_t type_id, hid_t obj_id)
+{
+    size_t            size;
+    hid_t             n_type;
+    void             *buf = NULL;
+
+    n_type = h5tools_get_native_type(type_id);
+
+    size = H5Tget_size(n_type);
+    buf = HDmalloc(size);
+
+    H5Pget_fill_value(dcpl, n_type, buf);
+
+    h5tools_str_sprint(buffer, info, obj_id, n_type, buf, ctx);
+
+    H5Tclose(n_type);
+
+    if (buf)
+        HDfree (buf);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dcpl
+ *
+ * Purpose:     prints several dataset create property list properties
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t dcpl_id, hid_t type_id, hid_t obj_id)
+{
+    int              nfilters;       /* number of filters */
+    int              rank;           /* rank */
+    int              i;
+    unsigned         j;
+    unsigned         filt_flags;     /* filter flags */
+    unsigned         cd_values[20];  /* filter client data values */
+    unsigned         szip_options_mask;
+    unsigned         szip_pixels_per_block;
+    H5Z_filter_t     filtn;          /* filter identification number */
+    H5D_fill_value_t fvstatus;
+    H5D_alloc_time_t at;
+    H5D_fill_time_t  ft;
+    H5D_layout_t     stl;
+    size_t           ncols = 80;      /* available output width        */
+    size_t           cd_nelmts;      /* filter client number of values */
+    off_t            offset;         /* offset of external file     */
+    char             f_name[256];    /* filter name */
+    char             name[256];      /* external or virtual file name       */
+    hsize_t          chsize[64];     /* chunk size in elements */
+    hsize_t          size;           /* size of external file   */
+    hsize_t          storage_size;
+    hsize_t          curr_pos = 0;        /* total data element position   */
+    h5tools_str_t    buffer;          /* string into which to render   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    storage_size = H5Dget_storage_size(obj_id);
+    nfilters = H5Pget_nfilters(dcpl_id);
+    HDstrcpy(f_name,"\0");
+
+    /*-------------------------------------------------------------------------
+    * STORAGE_LAYOUT
+    *-------------------------------------------------------------------------
+    */
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s", STORAGE_LAYOUT, BEGIN);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    stl = H5Pget_layout(dcpl_id);
+    switch (stl) {
+        case H5D_CHUNKED:
+            ctx->indent_level++;
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s ", CHUNKED);
+
+            rank = H5Pget_chunk(dcpl_id, (int) NELMTS(chsize), chsize);
+            h5tools_str_append(&buffer, "%s " HSIZE_T_FORMAT, h5tools_dump_header_format->dataspacedimbegin, chsize[0]);
+            for(i = 1; i < rank; i++)
+                h5tools_str_append(&buffer, ", " HSIZE_T_FORMAT, chsize[i]);
+            h5tools_str_append(&buffer, " %s", h5tools_dump_header_format->dataspacedimend);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
+
+            /* if there are filters, print a compression ratio */
+            if (nfilters) {
+                hsize_t dims[H5S_MAX_RANK];
+                hsize_t nelmts = 1;
+                double ratio = 0;
+                int ok = 0;
+
+                hid_t tid = H5Dget_type(obj_id);
+                hid_t sid = H5Dget_space(obj_id);
+                size_t datum_size = H5Tget_size(tid);
+                int ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
+
+                /* only print the compression ratio for these filters */
+                for (i = 0; i < nfilters && !ok; i++) {
+                    cd_nelmts = NELMTS(cd_values);
+                    filtn = H5Pget_filter2(dcpl_id, (unsigned) i, &filt_flags, &cd_nelmts, cd_values, sizeof(f_name),
+                            f_name, NULL);
+                    ok = (filtn >= 0);
+                }
+
+                if(ndims && ok) {
+                    hsize_t uncomp_size;
+
+                    for(i = 0; i < ndims; i++) {
+                        nelmts *= dims[i];
+                    }
+                    uncomp_size = nelmts * datum_size;
+
+                    /* compression ratio = uncompressed size /  compressed size */
+
+                    if(storage_size != 0)
+                        ratio = (double) uncomp_size / (double) storage_size;
+
+                    h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT" (%.3f:1 COMPRESSION)", storage_size, ratio);
+
+                }
+                else
+                    h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
+
+                H5Sclose(sid);
+                H5Tclose(tid);
+
+            }
+            else {
+                h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
+            }
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+            ctx->indent_level--;
+            break;
+        case H5D_COMPACT:
+            ctx->indent_level++;
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s", COMPACT);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+            ctx->indent_level--;
+            break;
+        case H5D_CONTIGUOUS:
+            {
+                int next;
+
+                next = H5Pget_external_count(dcpl_id);
+
+                /*-------------------------------------------------------------------------
+                 * EXTERNAL_FILE
+                 *-------------------------------------------------------------------------
+                 */
+                ctx->indent_level++;
+                if (next) {
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", CONTIGUOUS);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s %s", EXTERNAL, BEGIN);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                    ctx->indent_level++;
+                    for (j = 0; j < (unsigned) next; j++) {
+                        H5Pget_external(dcpl_id, j, sizeof(name), name, &offset, &size);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "FILENAME %s SIZE " HSIZE_T_FORMAT, name, size);
+                        h5tools_str_append(&buffer, " OFFSET %ld", offset);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                    }
+                    ctx->indent_level--;
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                }
+                else {
+                    haddr_t ioffset;
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", CONTIGUOUS);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer,"SIZE " HSIZE_T_FORMAT, storage_size);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    ioffset = H5Dget_offset(obj_id);
+                    h5tools_str_append(&buffer, "OFFSET "H5_PRINTF_HADDR_FMT, ioffset);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                }
+                ctx->indent_level--;
+            }
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s", "Unknown layout");
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+    }/*switch*/
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s", END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    /*-------------------------------------------------------------------------
+    * FILTERS
+    *-------------------------------------------------------------------------
+    */
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s", FILTERS, BEGIN);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level++;
+
+    if(nfilters) {
+        for(i = 0; i < nfilters; i++) {
+            cd_nelmts = NELMTS(cd_values);
+            filtn = H5Pget_filter2(dcpl_id, (unsigned)i, &filt_flags, &cd_nelmts,
+                cd_values, sizeof(f_name), f_name, NULL);
+
+            if (filtn<0)
+                continue; /* nothing to print for invalid filter */
+
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
+            switch(filtn) {
+                case H5Z_FILTER_DEFLATE:
+                    h5tools_str_append(&buffer, "%s %s %s %d %s", DEFLATE, BEGIN, DEFLATE_LEVEL, cd_values[0], END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+                case H5Z_FILTER_SHUFFLE:
+                    h5tools_str_append(&buffer, "%s", SHUFFLE);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+                case H5Z_FILTER_FLETCHER32:
+                    h5tools_str_append(&buffer, "%s", FLETCHER32);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+                case H5Z_FILTER_SZIP:
+                    {
+                        szip_options_mask = cd_values[0];;
+                        szip_pixels_per_block = cd_values[1];
+
+                        h5tools_str_append(&buffer, "%s %s",SZIP, BEGIN);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx->indent_level++;
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "PIXELS_PER_BLOCK %d", szip_pixels_per_block);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        if(szip_options_mask & H5_SZIP_CHIP_OPTION_MASK)
+                            h5tools_str_append(&buffer, "MODE %s", "HARDWARE");
+                        else if(szip_options_mask & H5_SZIP_ALLOW_K13_OPTION_MASK)
+                            h5tools_str_append(&buffer, "MODE %s", "K13");
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        if(szip_options_mask & H5_SZIP_EC_OPTION_MASK)
+                            h5tools_str_append(&buffer, "CODING %s", "ENTROPY");
+                        else if(szip_options_mask & H5_SZIP_NN_OPTION_MASK)
+                            h5tools_str_append(&buffer, "CODING %s", "NEAREST NEIGHBOUR");
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        if(szip_options_mask & H5_SZIP_LSB_OPTION_MASK)
+                            h5tools_str_append(&buffer, "BYTE_ORDER %s", "LSB");
+                        else if(szip_options_mask & H5_SZIP_MSB_OPTION_MASK)
+                            h5tools_str_append(&buffer, "BYTE_ORDER %s", "MSB");
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                        if(szip_options_mask & H5_SZIP_RAW_OPTION_MASK) {
+                            ctx->need_prefix = TRUE;
+                            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                            h5tools_str_reset(&buffer);
+                            h5tools_str_append(&buffer, "HEADER %s", "RAW");
+                            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                        }
+
+                        ctx->indent_level--;
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s", END);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    }
+                    break;
+                case H5Z_FILTER_NBIT:
+                    h5tools_str_append(&buffer, "%s", NBIT);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+                case H5Z_FILTER_SCALEOFFSET:
+                    h5tools_str_append(&buffer, "%s %s %s %d %s", SCALEOFFSET, BEGIN, SCALEOFFSET_MINBIT, cd_values[0], END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+                default:
+                    h5tools_str_append(&buffer, "%s %s", "USER_DEFINED_FILTER", BEGIN);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                    ctx->indent_level++;
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "FILTER_ID %d", filtn);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                    if(f_name[0] != '\0') {
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "COMMENT %s", f_name);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    }
+                    if (cd_nelmts) {
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %s ","PARAMS", BEGIN);
+                        for (j=0; j<cd_nelmts; j++)
+                            h5tools_str_append(&buffer, "%d ", cd_values[j]);
+                        h5tools_str_append(&buffer, "%s", END);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    }
+                    ctx->indent_level--;
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s",END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    break;
+            }/*switch*/
+        } /*i*/
+    }/*nfilters*/
+    else {
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "NONE");
+        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+    }
+    ctx->indent_level--;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s",END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    /*-------------------------------------------------------------------------
+    * FILLVALUE
+    *-------------------------------------------------------------------------
+    */
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s", FILLVALUE, BEGIN);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level++;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "FILL_TIME ");
+
+    H5Pget_fill_time(dcpl_id, &ft);
+    switch(ft) {
+        case H5D_FILL_TIME_ALLOC:
+            h5tools_str_append(&buffer, "%s", "H5D_FILL_TIME_ALLOC");
+            break;
+        case H5D_FILL_TIME_NEVER:
+            h5tools_str_append(&buffer, "%s", "H5D_FILL_TIME_NEVER");
+            break;
+        case H5D_FILL_TIME_IFSET:
+            h5tools_str_append(&buffer, "%s", "H5D_FILL_TIME_IFSET");
+            break;
+        case H5D_FILL_TIME_ERROR:
+        default:
+            HDassert(0);
+            break;
+    }
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s ", "VALUE ");
+    H5Pfill_value_defined(dcpl_id, &fvstatus);
+    switch (fvstatus) {
+        case H5D_FILL_VALUE_UNDEFINED:
+            h5tools_str_append(&buffer, "%s", "H5D_FILL_VALUE_UNDEFINED");
+            break;
+        case H5D_FILL_VALUE_DEFAULT:
+            h5tools_str_append(&buffer, "%s", "H5D_FILL_VALUE_DEFAULT");
+            break;
+        case H5D_FILL_VALUE_USER_DEFINED:
+            ctx->indent_level--;
+            h5tools_print_fill_value(&buffer, info, ctx, dcpl_id, type_id, obj_id);
+            ctx->indent_level++;
+            break;
+        case H5D_FILL_VALUE_ERROR:
+        default:
+            HDassert(0);
+            break;
+    }
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+    ctx->indent_level--;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s", END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    /*-------------------------------------------------------------------------
+    * ALLOCATION_TIME
+    *-------------------------------------------------------------------------
+    */
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "ALLOCATION_TIME %s", BEGIN);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level++;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    H5Pget_alloc_time(dcpl_id, &at);
+    switch(at) {
+        case H5D_ALLOC_TIME_EARLY:
+            h5tools_str_append(&buffer, "%s", "H5D_ALLOC_TIME_EARLY");
+            break;
+        case H5D_ALLOC_TIME_INCR:
+            h5tools_str_append(&buffer, "%s", "H5D_ALLOC_TIME_INCR");
+            break;
+        case H5D_ALLOC_TIME_LATE:
+            h5tools_str_append(&buffer, "%s", "H5D_ALLOC_TIME_LATE");
+            break;
+        default:
+            HDassert(0);
+            break;
+    }
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level--;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s", END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_comment
+ *
+ * Purpose:     prints the comment for the the object name
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t obj_id)
+{
+    char         *comment = NULL;
+    ssize_t       cmt_bufsize = -1;
+    size_t        buf_size = 0;
+    size_t        ncols = 80;      /* available output width        */
+    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t       curr_pos = ctx->sm_pos;   /* total data element position   */
+                                            /* pass to the prefix in h5tools_simple_prefix the total position
+                                             * instead of the current stripmine position i; this is necessary
+                                             * to print the array indices
+                                             */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    cmt_bufsize = H5Oget_comment(obj_id, comment, buf_size);
+
+    /* call H5Oget_comment again with the correct value.
+     * If the call to H5Oget_comment returned an error, skip this block */
+    if (cmt_bufsize > 0) {
+        comment = (char *)HDmalloc((size_t)(cmt_bufsize+1)); /* new_size including null terminator */
+        if(comment) {
+            cmt_bufsize = H5Oget_comment(obj_id, comment, (size_t)cmt_bufsize);
+            if(cmt_bufsize > 0) {
+                comment[cmt_bufsize] = '\0'; /* necessary because null char is not returned */
+
+                ctx->need_prefix = TRUE;
+
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "COMMENT \"%s\"", comment);
+                h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                h5tools_str_close(&buffer);
+            } /* end if */
+            HDfree(comment);
+        }
+    }
+} /* end dump_comment() */
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_attribute
+ *
+ * Purpose:     Dump the attribute.
+ *
+ * Return:      void
+ *
+ * In/Out:      h5tools_context_t *ctx
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, const char *attr_name, hid_t attr_id,
+        int display_index, int display_char)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    size_t        ncols = 80;      /* available output width        */
+    hsize_t       curr_pos = ctx->sm_pos;   /* total data element position   */
+                                            /* pass to the prefix in h5tools_simple_prefix the total position
+                                             * instead of the current stripmine position i; this is necessary
+                                             * to print the array indices
+                                             */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+            h5tools_dump_header_format->attributebegin, attr_name,
+            h5tools_dump_header_format->attributeblockbegin);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    if(attr_id < 0) {
+        error_msg("unable to open attribute \"%s\"\n", attr_name);
+    }
+    else {
+        hid_t type, space;
+
+        ctx->indent_level++;
+
+        type = H5Aget_type(attr_id);
+        h5tools_dump_datatype(stream, info, ctx, type);
+
+        space = H5Aget_space(attr_id);
+        h5tools_dump_dataspace(stream, info, ctx, space);
+
+        if(oid_output)
+            h5tools_dump_oid(stream, info, ctx, attr_id);
+
+        if(data_output || attr_data_output)
+            h5tools_dump_data(stream, info, ctx, attr_id, FALSE, NULL, display_index, display_char);
+
+        ctx->indent_level--;
+
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Aclose(attr_id);
+    }
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+
+    if (HDstrlen(h5tools_dump_header_format->attributeblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeblockend);
+        if (HDstrlen(h5tools_dump_header_format->attributeend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if (HDstrlen(h5tools_dump_header_format->attributeend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeend);
+
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dims
+ *
+ * Purpose:     Dump the dimensions handed to it in a comma separated list
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 27. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_print_dims(h5tools_str_t *buffer, hsize_t *s, int dims)
+{
+    int i;
+
+    for (i = 0; i < dims; i++) {
+        h5tools_str_append(buffer, HSIZE_T_FORMAT, s[i]);
+
+        if (i + 1 != dims)
+            h5tools_str_append(buffer, ", ");
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    print_packed_bits
+ *
+ * Purpose:     Prints the packed bits offset and length
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_print_packed_bits(h5tools_str_t *buffer, hid_t type)
+{
+    unsigned packed_bits_size = 0;
+    hid_t n_type = h5tools_get_native_type(type);
+
+    if(H5Tget_class(n_type) == H5T_INTEGER) {
+        if(H5Tequal(n_type, H5T_NATIVE_SCHAR) == TRUE)
+            packed_bits_size = 8 * sizeof(char);
+        else if(H5Tequal(n_type, H5T_NATIVE_UCHAR) == TRUE)
+            packed_bits_size = 8 * sizeof(unsigned char);
+        else if(H5Tequal(n_type, H5T_NATIVE_SHORT) == TRUE)
+            packed_bits_size = 8 * sizeof(short);
+        else if(H5Tequal(n_type, H5T_NATIVE_USHORT) == TRUE)
+            packed_bits_size = 8 * sizeof(unsigned short);
+        else if(H5Tequal(n_type, H5T_NATIVE_INT) == TRUE)
+            packed_bits_size = 8 * sizeof(int);
+        else if(H5Tequal(n_type, H5T_NATIVE_UINT) == TRUE)
+            packed_bits_size = 8 * sizeof(unsigned int);
+        else if(H5Tequal(n_type, H5T_NATIVE_LONG) == TRUE)
+            packed_bits_size = 8 * sizeof(long);
+        else if(H5Tequal(n_type, H5T_NATIVE_ULONG) == TRUE)
+            packed_bits_size = 8 * sizeof(unsigned long);
+        else if(H5Tequal(n_type, H5T_NATIVE_LLONG) == TRUE)
+            packed_bits_size = 8 * sizeof(long long);
+        else if(H5Tequal(n_type, H5T_NATIVE_ULLONG) == TRUE)
+            packed_bits_size = 8 * sizeof(unsigned long long);
+        else
+            error_msg("Packed Bit not valid for this datatype");
+    }
+
+    if((packed_bits_size > 0) && (packed_data_offset + packed_data_length) > packed_bits_size) {
+        error_msg("Packed Bit offset+length value(%u) too large. Max is %d\n", packed_data_offset + packed_data_length, packed_bits_size);
+        packed_data_mask = 0;
+    };
+    h5tools_str_append(buffer, "%s %s=%u %s=%u", PACKED_BITS, PACKED_OFFSET, packed_data_offset, PACKED_LENGTH, packed_data_length);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_subsetting_header
+ *
+ * Purpose:     Dump the subsetting header like specified in the DDL.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 27. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, struct subset_t *sset, int dims)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t       curr_pos = 0;        /* total data element position   */
+    size_t        ncols = 80;      /* available output width        */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->subsettingbegin, h5tools_dump_header_format->subsettingblockbegin);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level++;
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s ", h5tools_dump_header_format->startbegin, h5tools_dump_header_format->startblockbegin);
+    h5tools_print_dims(&buffer, sset->start.data, dims);
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->startend, h5tools_dump_header_format->startblockend);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s ", h5tools_dump_header_format->stridebegin, h5tools_dump_header_format->strideblockbegin);
+    h5tools_print_dims(&buffer, sset->stride.data, dims);
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->strideend, h5tools_dump_header_format->strideblockend);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s ", h5tools_dump_header_format->countbegin, h5tools_dump_header_format->countblockbegin);
+
+    if(sset->count.data)
+        h5tools_print_dims(&buffer, sset->count.data, dims);
+    else
+        h5tools_str_append(&buffer, "DEFAULT");
+
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->countend, h5tools_dump_header_format->countblockend);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s ", h5tools_dump_header_format->blockbegin, h5tools_dump_header_format->blockblockbegin);
+
+    if(sset->block.data)
+        h5tools_print_dims(&buffer, sset->block.data, dims);
+    else
+        h5tools_str_append(&buffer, "DEFAULT");
+
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->blockend, h5tools_dump_header_format->blockblockend);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx->indent_level--;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_data
+ *
+ * Purpose:     Dump attribute or dataset data
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx, hid_t obj_id, int obj_data, struct subset_t *sset,
+        int display_index, int display_char)
+{
+    H5S_class_t space_type;
+    int         ndims;
+    int         i;
+    hid_t       space;
+    hid_t       type;
+    hid_t       p_type;
+    hsize_t     size[64];
+    hsize_t     alloc_size;
+    hsize_t     nelmts = 1;
+    int         status = -1;
+    void       *buf = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t       curr_pos = 0;        /* total data element position   */
+    size_t        ncols = 80;      /* available output width        */
+    h5tool_format_t     string_dataformat;
+    h5tool_format_t     outputformat;
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+    if (info->line_ncols > 0)
+        ncols = info->line_ncols;
+
+    outputformat = *info;
+    string_dataformat = *info;
+    /* print the matrix indices */
+    string_dataformat.pindex = display_index;
+
+    /* do not print indices for regions */
+    if(obj_data) {
+        hid_t f_type = H5Dget_type(obj_id);
+
+        if (H5Tequal(f_type, H5T_STD_REF_DSETREG)) {
+            /* For the region option, correct the display of indices */
+            if (region_output) {
+                if (!string_dataformat.pindex) {
+                    string_dataformat.idx_fmt   = "";
+                    string_dataformat.idx_n_fmt = "";
+                    string_dataformat.idx_sep   = "";
+                    string_dataformat.line_pre  = "";
+                }
+            }
+            else
+                string_dataformat.pindex = 0;
+        }
+        H5Tclose(f_type);
+    }
+
+    if (string_dataformat.pindex) {
+        string_dataformat.idx_fmt   = "(%s): ";
+        string_dataformat.idx_n_fmt = HSIZE_T_FORMAT;
+        string_dataformat.idx_sep   = ",";
+        string_dataformat.line_pre  = "%s";
+    }
+    info = &string_dataformat;
+
+    if (sset && obj_data) {
+        hid_t f_space = H5Dget_space(obj_id);
+
+        h5tools_dump_subsetting_header(stream, &outputformat, ctx, sset, H5Sget_simple_extent_ndims(f_space));
+        H5Sclose(f_space);
+
+        ctx->indent_level++;
+    }
+
+    ctx->need_prefix = TRUE;
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->databegin, h5tools_dump_header_format->datablockbegin);
+    h5tools_render_element(stream, &outputformat, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    /* Print all the values. */
+    if(obj_data) {
+        h5tools_context_t datactx = *ctx;            /* print context  */
+        hid_t               f_type = H5Dget_type(obj_id);
+
+        if((display_char && H5Tget_size(f_type) == 1) && (H5Tget_class(f_type) == H5T_INTEGER)) {
+            /*
+             * Print 1-byte integer data as an ASCII character string
+             * instead of integers if the `-r' or `--string' command-line
+             * option was given.
+             *
+             * We don't want to modify the global dataformat, so make a
+             * copy of it instead.
+             */
+            string_dataformat = *info;
+            string_dataformat.idx_fmt = "\"";
+            info = &string_dataformat;
+            datactx.indent_level++;
+            datactx.need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, &datactx, (hsize_t)0, 0);
+
+            string_dataformat = *info;
+            string_dataformat.idx_fmt = "\"";
+            string_dataformat.line_multi_new = 1;
+            string_dataformat.str_repeat = 8;
+            string_dataformat.ascii = TRUE;
+            string_dataformat.elmt_suf1 = "";
+            string_dataformat.elmt_suf2 = "";
+            string_dataformat.line_suf = "\"";
+            info = &string_dataformat;
+        }
+        else
+            datactx.need_prefix = TRUE;
+        status = h5tools_dump_dset(stream, info, &datactx, obj_id, sset);
+        if((display_char && H5Tget_size(f_type) == 1) && (H5Tget_class(f_type) == H5T_INTEGER)) {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\"");
+            h5tools_render_element(stream, &outputformat, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+        }
+        H5Tclose(f_type);
+    }
+    else {
+        h5tools_context_t datactx = *ctx;            /* print context  */
+        /* need to call h5tools_dump_mem for the attribute data */
+        space = H5Aget_space(obj_id);
+        space_type = H5Sget_simple_extent_type(space);
+        if(space_type == H5S_NULL || space_type == H5S_NO_CLASS) {
+            status = SUCCEED;
+        }
+        else {
+            /* VL data special information */
+            unsigned int        vl_data = 0; /* contains VL datatypes */
+
+            type = H5Aget_type(obj_id);
+            p_type = h5tools_get_native_type(type);
+
+            ndims = H5Sget_simple_extent_dims(space, size, NULL);
+
+            /* Check if we have VL data in the dataset's datatype */
+            if (h5tools_detect_vlen(p_type) == TRUE)
+                vl_data = TRUE;
+
+            for (i = 0; i < ndims; i++)
+                nelmts *= size[i];
+
+            alloc_size = nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
+            HDassert(alloc_size == (hsize_t)((size_t)alloc_size)); /*check for overflow*/
+
+            if(alloc_size) {
+                buf = HDmalloc((size_t)alloc_size);
+                HDassert(buf);
+
+                if (H5Aread(obj_id, p_type, buf) >= 0) {
+                    if (display_char && H5Tget_size(type) == 1 && H5Tget_class(type) == H5T_INTEGER) {
+                        /*
+                         * Print 1-byte integer data as an ASCII character string
+                         * instead of integers if the `-r' or `--string' command-line
+                         * option was given.
+                         *
+                         * We don't want to modify the global dataformat, so make a
+                         * copy of it instead.
+                         */
+                        string_dataformat = *info;
+                        string_dataformat.idx_fmt = "\"";
+                        info = &string_dataformat;
+                        datactx.indent_level++;
+                        datactx.need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, &datactx, (hsize_t)0, 0);
+
+                        string_dataformat = *info;
+                        string_dataformat.idx_fmt = "\"";
+                        string_dataformat.line_multi_new = 1;
+                        string_dataformat.str_repeat = 8;
+                        string_dataformat.ascii = TRUE;
+                        string_dataformat.elmt_suf1 = "";
+                        string_dataformat.elmt_suf2 = "";
+                        string_dataformat.line_suf = "\"";
+                        info = &string_dataformat;
+                    }
+                    else
+                        datactx.need_prefix = TRUE;
+                }
+
+                status = h5tools_dump_mem(stream, info, &datactx, obj_id, p_type, space, buf);
+                if (display_char && H5Tget_size(type) == 1 && H5Tget_class(type) == H5T_INTEGER) {
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "\"");
+                    h5tools_render_element(stream, &outputformat, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                }
+
+                /* Reclaim any VL memory, if necessary */
+                if (vl_data)
+                    H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
+
+                HDfree(buf);
+            }
+            else
+                status = SUCCEED;
+
+            H5Tclose(p_type);
+            H5Tclose(type);
+        }
+        H5Sclose(space);
+    }
+
+    if (status == FAIL) {
+        error_msg("unable to print data\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, &outputformat, ctx, (hsize_t)0, 0);
+
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->datablockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datablockend);
+        if(HDstrlen(h5tools_dump_header_format->dataend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->dataend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->dataend);
+    h5tools_render_element(stream, &outputformat, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    if (sset && obj_data) {
+        ctx->indent_level--;
+
+        ctx->need_prefix = TRUE;
+        h5tools_simple_prefix(stream, &outputformat, ctx, (hsize_t)0, 0);
+
+        h5tools_str_reset(&buffer);
+        if(HDstrlen(h5tools_dump_header_format->subsettingblockend)) {
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->subsettingblockend);
+            if(HDstrlen(h5tools_dump_header_format->subsettingend))
+                h5tools_str_append(&buffer, " ");
+        }
+        if(HDstrlen(h5tools_dump_header_format->subsettingend))
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->subsettingend);
+        h5tools_render_element(stream, &outputformat, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+    h5tools_str_close(&buffer);
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.h
new file mode 100644
index 0000000..b05f226
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_dump.h
@@ -0,0 +1,84 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:     Support h5dump functions for the various tools.
+ */
+#ifndef H5TOOLS_DUMP_H__
+#define H5TOOLS_DUMP_H__
+
+#include "h5tools_utils.h"
+
+/* 3 private values: can't be set, but can be read.
+   Note: these are defined in H5Zprivate, they are
+   duplicated here.
+ */
+#define H5_SZIP_LSB_OPTION_MASK         8
+#define H5_SZIP_MSB_OPTION_MASK         16
+#define H5_SZIP_RAW_OPTION_MASK         128
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5TOOLS_DLLVAR table_t *h5dump_type_table;  /*type table reference for datatype dump  */
+
+/* Definitions of useful routines */
+H5TOOLS_DLL void    h5tools_dump_init(void);
+
+H5TOOLS_DLL int     h5tools_dump_dset(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t dset,
+                            struct subset_t *sset);
+H5TOOLS_DLL int     h5tools_dump_mem(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t obj_id,
+                            hid_t type, hid_t space, void *mem);
+H5TOOLS_DLL int     h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t container,
+                            h5tools_context_t *ctx/*in,out*/, unsigned flags,
+                            hsize_t nelmts, hid_t type, void *_mem);
+H5TOOLS_DLL void    h5tools_dump_datatype(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t type);
+H5TOOLS_DLL void    h5tools_dump_dataspace(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t space);
+H5TOOLS_DLL void    h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, const char *attr_name, 
+                            hid_t attr_id, int display_index, int display_char);
+H5TOOLS_DLL void    h5tools_dump_oid(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t oid);
+H5TOOLS_DLL void    h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t dcpl, hid_t type_id, hid_t obj_id);
+H5TOOLS_DLL void    h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx/*in,out*/, hid_t obj_id);
+H5TOOLS_DLL void    h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
+                            h5tools_context_t *ctx, hid_t obj_id,
+                            int obj_data, struct subset_t *sset, int display_index, int display_char);
+
+H5TOOLS_DLL int     h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer/*in,out*/,
+                            const h5tool_format_t *info, h5tools_context_t *ctx/*in,out*/,
+                            hid_t type, int object_search);
+H5TOOLS_DLL int     h5tools_print_dataspace(h5tools_str_t *buffer/*in,out*/,
+                            hid_t space);
+H5TOOLS_DLL int     h5tools_print_enum(FILE *stream, h5tools_str_t *buffer/*in,out*/,
+                            const h5tool_format_t *info, h5tools_context_t *ctx/*in,out*/,
+                            hid_t type);
+H5TOOLS_DLL void    h5tools_print_fill_value(h5tools_str_t *buffer/*in,out*/,
+                            const h5tool_format_t *info, h5tools_context_t *ctx/*in,out*/, 
+                            hid_t dcpl, hid_t type_id, hid_t obj_id);
+H5TOOLS_DLL void    h5tools_print_packed_bits(h5tools_str_t *buffer/*in,out*/, hid_t type);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5TOOLS_DUMP_H__ */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_error.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_error.h
new file mode 100644
index 0000000..749157e
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_error.h
@@ -0,0 +1,124 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ *  Header file for error values, etc.
+ */
+#ifndef H5TOOLS_ERROR_H_
+#define H5TOOLS_ERROR_H_
+
+#include "H5Epublic.h"
+
+/* tools-HDF5 Error variables */
+H5TOOLS_DLLVAR hid_t H5tools_ERR_STACK_g;
+H5TOOLS_DLLVAR hid_t H5tools_ERR_CLS_g;
+H5TOOLS_DLLVAR hid_t H5E_tools_g;
+H5TOOLS_DLLVAR hid_t H5E_tools_min_id_g;
+
+/* Use FUNC to safely handle variations of C99 __func__ keyword handling */
+#ifdef H5_HAVE_C99_FUNC
+#define FUNC __func__
+#elif defined(H5_HAVE_FUNCTION)
+#define FUNC __FUNCTION__
+#else
+#error "We need __func__ or __FUNCTION__ to test function names!"
+#endif
+
+/*
+ * H5TOOLS_INIT_ERROR macro, used to initialize error reporting.
+ */
+#define H5TOOLS_INIT_ERROR() {                                                                      \
+        H5tools_ERR_CLS_g = H5Eregister_class("H5tools", "HDF5:tools", lib_str);                    \
+        H5E_tools_g= H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MAJOR, "Failure in tools library");       \
+        H5E_tools_min_id_g = H5Ecreate_msg(H5tools_ERR_CLS_g, H5E_MINOR, "error in function");      \
+}
+
+/*
+ * H5TOOLS_CLOSE_ERROR macro, used to initialize error reporting.
+ */
+#define H5TOOLS_CLOSE_ERROR() {                                 \
+        H5Eclose_msg(H5E_tools_min_id_g);                       \
+        H5Eclose_msg(H5E_tools_g);                              \
+        H5Eunregister_class(H5tools_ERR_CLS_g);                 \
+}
+
+/*
+ * HERR_INIT macro, used to facilitate error reporting. Declaration and assignments of error variables.
+ * Use at the beginning of a function using error handling macros.
+ */
+#define HERR_INIT(ret_typ, ret_init)                    \
+    hbool_t past_catch = FALSE;                         \
+    ret_typ ret_value = ret_init;
+
+
+/*
+ * HERROR macro, used to facilitate error reporting .  The arguments are the major
+ * error number, the minor error number, and a description of the error.
+ */
+#define HERROR(maj_id, min_id, str) {                                                                        \
+        H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, maj_id, min_id, str);     \
+        ret_value = FAIL;                                                                                    \
+}
+
+
+/* Macro for "catching" flow of control when an error occurs.  Note that the
+ *      H5_LEAVE macro won't jump back here once it's past this point.
+ */
+#define CATCH catch_except:; past_catch = TRUE;
+
+/*
+ * H5_LEAVE macro, used to facilitate control flow between a
+ * BEGIN_FUNC() and an END_FUNC() within a function body.  The argument is
+ * the return value.
+ * The return value is assigned to a variable `ret_value' and control branches
+ * to the `catch_except' label, if we're not already past it.
+ */
+#define H5_LEAVE(v) {                           \
+    ret_value = v;                              \
+    if(!past_catch)                             \
+        goto catch_except;                      \
+}
+
+/*
+ * H5E_THROW macro, used to facilitate error reporting within a function body.
+ * The arguments are the minor error number, and an error string.
+ * The return value is assigned to a variable `ret_value' and control branches
+ * to the `catch_except' label, if we're not already past it.
+ */
+#define H5E_THROW(fail_value, min_id, str) {        \
+    H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, str);     \
+    H5_LEAVE(fail_value)                            \
+}
+
+/*
+ * HGOTO_ERROR macro, used to facilitate error reporting within a function body.  The arguments are
+ * the major error number, the minor error number, the return value, and an
+ * error string.  The return value is assigned to a variable `ret_value' and
+ * control branches to the `done' label.
+ */
+#define HGOTO_ERROR(fail_value, min_id, str) {        \
+   HERROR(H5E_tools_g, min_id, str);                 \
+   HGOTO_DONE(fail_value)                          \
+}
+
+/*
+ * HGOTO_DONE macro, used to facilitate normal return within a function body.
+ * The argument is the return value which is assigned to the `ret_value'
+ * variable.  Control branches to the `done' label.
+ */
+#define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;}
+
+#endif /* H5TOOLS_ERROR_H_ */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_filters.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_filters.c
new file mode 100644
index 0000000..0b42124
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_filters.c
@@ -0,0 +1,210 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+
+/*-------------------------------------------------------------------------
+ * print a warning message
+ *-------------------------------------------------------------------------
+ */
+static void print_warning(const char *dname, const char *fname)
+{
+	fprintf(stderr,
+			"warning: dataset <%s> cannot be read, %s filter is not available\n",
+			dname, fname);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_canreadf
+ *
+ * Purpose: check if the dataset creation property list has filters that
+ * are not registered in the current configuration
+ * 1) the external filters GZIP and SZIP might not be available
+ * 2) the internal filters might be turned off
+ *
+ * Return: 1, can read, 0, cannot, -1 error
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: March 1, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int h5tools_canreadf(const char* name, /* object name, serves also as boolean print */
+                     hid_t dcpl_id)    /* dataset creation property list */
+{
+
+	int nfilters; /* number of filters */
+	H5Z_filter_t filtn; /* filter identification number */
+	int i; /* index */
+	int udfilter_avail; /* index */
+
+	/* get information about filters */
+	if ((nfilters = H5Pget_nfilters(dcpl_id)) < 0)
+		return -1;
+
+	/* if we do not have filters, we can read the dataset safely */
+	if (!nfilters)
+		return 1;
+
+	/* check availability of filters */
+	for (i = 0; i < nfilters; i++) {
+		if ((filtn = H5Pget_filter2(dcpl_id, (unsigned) i, 0, 0, 0, (size_t) 0, 0, NULL)) < 0)
+			return -1;
+
+		switch (filtn) {
+		/*-------------------------------------------------------------------------
+		 * user defined filter
+		 *-------------------------------------------------------------------------
+		 */
+		default:
+			if ((udfilter_avail = H5Zfilter_avail(filtn)) < 0)
+				return -1;
+			else if (udfilter_avail == 0) {
+				if (name)
+					print_warning(name, "user defined");
+				return 0;
+			}
+			break;
+
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_DEFLATE      1 , deflation like gzip
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_DEFLATE:
+#ifndef H5_HAVE_FILTER_DEFLATE
+			if (name)
+				print_warning(name,"deflate");
+			return 0;
+#endif
+			break;
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_SZIP       4 , szip compression
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_SZIP:
+#ifndef H5_HAVE_FILTER_SZIP
+			if (name)
+				print_warning(name,"SZIP");
+			return 0;
+#endif
+			break;
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_SHUFFLE    2 , shuffle the data
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_SHUFFLE:
+			break;
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_FLETCHER32:
+			break;
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_NBIT
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_NBIT:
+			break;
+			/*-------------------------------------------------------------------------
+			 * H5Z_FILTER_SCALEOFFSET
+			 *-------------------------------------------------------------------------
+			 */
+		case H5Z_FILTER_SCALEOFFSET:
+			break;
+		}/*switch*/
+	}/*for*/
+
+	return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_canwritef
+ *
+ * Purpose: check if the filter is available and can write data.
+ * At this time, all filters that are available can write data,
+ * except SZIP, which may be configured decoder-only.
+ *
+ * Return: 1, can write, 0, cannot, -1 error
+ *
+ * Programmer:
+ *
+ * Date: October 5, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int h5tools_can_encode(H5Z_filter_t filtn) {
+	switch (filtn) {
+	/* user defined filter     */
+	default:
+            return 0;
+
+	case H5Z_FILTER_DEFLATE:
+#ifndef H5_HAVE_FILTER_DEFLATE
+            return 0;
+#endif
+            break;
+
+	case H5Z_FILTER_SZIP:
+#ifndef H5_HAVE_FILTER_SZIP
+            return 0;
+#else
+	{
+            unsigned int filter_config_flags;
+
+            if (H5Zget_filter_info(filtn, &filter_config_flags) < 0)
+                return -1;
+            if ((filter_config_flags
+                    & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == 0) {
+                /* filter present but neither encode nor decode is supported (???) */
+                return -1;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_DECODE_ENABLED) {
+                /* decoder only: read but not write */
+                return 0;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_ENCODE_ENABLED) {
+                /* encoder only: write but not read (???) */
+                return -1;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED))
+                        == (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) {
+                return 1;
+            }
+	}
+#endif
+            break;
+
+	case H5Z_FILTER_SHUFFLE:
+            break;
+
+	case H5Z_FILTER_FLETCHER32:
+            break;
+
+	case H5Z_FILTER_NBIT:
+            break;
+
+	case H5Z_FILTER_SCALEOFFSET:
+            break;
+    }/*switch*/
+
+    return 1;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.c
new file mode 100644
index 0000000..8c869c8
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.c
@@ -0,0 +1,330 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "h5tools_ref.h"
+#include "H5private.h"
+#include "H5SLprivate.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5trav.h"
+
+
+/*
+ *  Table to look up a path name for an object
+ *  reference.
+ *
+ *  This table stores mappings of reference -> path
+ *  for all objects in the file that may be the target of
+ *  an object reference.
+ *
+ *  The 'path' is an absolute path by which the object
+ *  can be accessed.  When an object has > 1 such path,
+ *  only one will be used in the table, with no particular
+ *  method of selecting which one.
+ */
+
+typedef struct {
+    haddr_t objno;      /* Object ID (i.e. address) */
+    char *path;         /* Object path */
+} ref_path_node_t;
+
+static H5SL_t *ref_path_table = NULL;   /* the "table" (implemented with a skip list) */
+static hid_t thefile = (-1);
+
+static int ref_path_table_put(const char *, haddr_t objno);
+
+/*-------------------------------------------------------------------------
+ * Function:    free_ref_path_info
+ *
+ * Purpose:     Free the key for a reference path table node
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+free_ref_path_info(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *operator_data/*in,out*/)
+{
+    ref_path_node_t *node = (ref_path_node_t *)item;
+
+    HDfree(node->path);
+    HDfree(node);
+
+    return(0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    init_ref_path_cb
+ *
+ * Purpose:     Called by interator to create references for
+ *              all objects and enter them in the table.
+ *
+ * Return:      Error status.
+ *
+ * Programmer:  REMcG
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+init_ref_path_cb(const char *obj_name, const H5O_info_t *oinfo,
+    const char *already_seen, void H5_ATTR_UNUSED *_udata)
+{
+    /* Check if the object is already in the path table */
+    if(NULL == already_seen) {
+        /* Insert the object into the path table */
+        ref_path_table_put(obj_name, oinfo->addr);
+    } /* end if */
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    init_ref_path_table
+ *
+ * Purpose:     Initalize the reference path table
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+init_ref_path_table(void)
+{
+    /* Sanity check */
+    HDassert(thefile > 0);
+
+    /* Create skip list to store reference path information */
+    if((ref_path_table = H5SL_create(H5SL_TYPE_HADDR, NULL))==NULL)
+        return (-1);
+
+    /* Iterate over objects in this file */
+    if(h5trav_visit(thefile, "/", TRUE, TRUE, init_ref_path_cb, NULL, NULL) < 0) {
+        error_msg("unable to construct reference path table\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    } /* end if */
+
+    return(0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    term_ref_path_table
+ *
+ * Purpose:     Terminate the reference path table
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+term_ref_path_table(void)
+{
+    /* Destroy reference path table, freeing all memory */
+    if(ref_path_table)
+        H5SL_destroy(ref_path_table, free_ref_path_info, NULL);
+
+    return(0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    ref_path_table_lookup
+ *
+ * Purpose:     Looks up a table entry given a path name.
+ *              Used during construction of the table.
+ *
+ * Return:      The table entre (pte) or NULL if not in the
+ *              table.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+ref_path_table_lookup(const char *thepath)
+{
+    H5O_info_t  oi;
+
+    /* Allow lookups on the root group, even though it doesn't have any link info */
+    if(HDstrcmp(thepath, "/")) {
+        H5L_info_t  li;
+
+        /* Check for external link first, so we don't return the OID of an object in another file */
+        if(H5Lget_info(thefile, thepath, &li, H5P_DEFAULT) < 0)
+            return HADDR_UNDEF;
+
+        /* UD links can't be followed, so they always "dangle" like soft links.  */
+        if(li.type >= H5L_TYPE_UD_MIN)
+            return HADDR_UNDEF;
+    } /* end if */
+
+    /* Get the object info now */
+    /* (returns failure for dangling soft links) */
+    if(H5Oget_info_by_name(thefile, thepath, &oi, H5P_DEFAULT) < 0)
+        return HADDR_UNDEF;
+
+    /* Return OID */
+    return(oi.addr);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    ref_path_table_put
+ *
+ * Purpose:     Enter the 'obj' with 'path' in the table (assumes its not
+ *              already there)
+ *
+ *              Create an object reference, pte, and store them
+ *              in the table.
+ *
+ *              NOTE: Takes ownership of the path name string passed in!
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+ref_path_table_put(const char *path, haddr_t objno)
+{
+    ref_path_node_t *new_node;
+
+    HDassert(ref_path_table);
+    HDassert(path);
+
+    if((new_node = (ref_path_node_t *)HDmalloc(sizeof(ref_path_node_t))) == NULL)
+        return(-1);
+
+    new_node->objno = objno;
+    new_node->path = HDstrdup(path);
+
+    return(H5SL_insert(ref_path_table, new_node, &(new_node->objno)));
+}
+
+/*
+ *  counter used to disambiguate multiple instances of same object.
+ */
+int xid = 1;
+
+int get_next_xid(void) {
+    return xid++;
+}
+
+/*
+ *  This counter is used to create fake object ID's
+ *  The idea is to set it to the largest possible offest, which
+ *  minimizes the chance of collision with a real object id.
+ *
+ */
+haddr_t fake_xid = HADDR_MAX;
+haddr_t
+get_fake_xid (void) {
+    return (fake_xid--);
+}
+
+/*
+ * for an object that does not have an object id (e.g., soft link),
+ * create a table entry with a fake object id as the key.
+ *
+ * Assumes 'path' is for an object that is not in the table.
+ *
+ */
+
+haddr_t
+ref_path_table_gen_fake(const char *path)
+{
+    haddr_t fake_objno;
+
+    /* Generate fake ID for string */
+    fake_objno = get_fake_xid();
+
+    /* Create ref path table, if it hasn't already been created */
+    if(ref_path_table == NULL)
+        init_ref_path_table();
+
+    /* Insert "fake" object into table */
+    ref_path_table_put(path, fake_objno);
+
+    return(fake_objno);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    lookup_ref_path
+ *
+ * Purpose:     Lookup the path to the object with refernce 'ref'.
+ *
+ * Return:      Return a path to the object, or NULL if not found.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+const char *
+lookup_ref_path(haddr_t ref)
+{
+    ref_path_node_t *node;
+
+    /* Be safer for h5ls */
+    if(thefile < 0)
+        return(NULL);
+
+    /* Create ref path table, if it hasn't already been created */
+    if(ref_path_table == NULL)
+        init_ref_path_table();
+
+    node = (ref_path_node_t *)H5SL_search(ref_path_table, &ref);
+
+    return(node ? node->path : NULL);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    fill_ref_path_table
+ *
+ * Purpose:     Called by interator to create references for
+ *              all objects and enter them in the table.
+ *
+ * Return:      Error status.
+ *
+ * Programmer:  REMcG
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+fill_ref_path_table(hid_t fid)
+{
+    /* Set file ID for later queries (XXX: this should be fixed) */
+    thefile = fid;
+
+    /* Defer creating the ref path table until it's needed */
+
+    return 0;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.h
new file mode 100644
index 0000000..7ddb91a
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_ref.h
@@ -0,0 +1,38 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5TOOLS_REF_H__
+#define H5TOOLS_REF_H__
+
+#include "hdf5.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5TOOLS_DLL herr_t      fill_ref_path_table(hid_t fid);
+H5TOOLS_DLL const char *lookup_ref_path(haddr_t ref);
+H5TOOLS_DLL int         get_next_xid(void);
+H5TOOLS_DLL haddr_t     get_fake_xid(void);
+H5TOOLS_DLL haddr_t     ref_path_table_lookup(const char *);
+H5TOOLS_DLL haddr_t     ref_path_table_gen_fake(const char *);
+H5TOOLS_DLL int         term_ref_path_table(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.c
new file mode 100644
index 0000000..7f65c91
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.c
@@ -0,0 +1,1420 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Bill Wendling <wendling at ncsa.uiuc.edu>
+ *              Monday, 19. February 2001
+ *
+ * Purpose: These are string functions for us to use and abuse.
+ */
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "H5private.h"
+#include "h5tools.h"            /*for h5tool_format_t structure    */
+#include "h5tools_ref.h"
+#include "h5tools_str.h"        /*function prototypes       */
+
+/*
+ * If REPEAT_VERBOSE is defined then character strings will be printed so
+ * that repeated character sequences like "AAAAAAAAAA" are displayed as
+ *
+ *  'A' repeates 9 times
+ *
+ * Otherwise the format is more Perl-like
+ *
+ *  'A'*10
+ *
+ */
+#define REPEAT_VERBOSE
+
+/* Variable length string datatype */
+#define STR_INIT_LEN    4096    /*initial length            */
+
+static char    *h5tools_escape(char *s, size_t size);
+static hbool_t  h5tools_str_is_zero(const void *_mem, size_t size);
+static void     h5tools_print_char(h5tools_str_t *str, const h5tool_format_t *info, char ch);
+void            h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info, h5tools_context_t *ctx);
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_close
+ *
+ * Purpose: Closes a string by releasing it's memory and setting the size
+ *      information to zero.
+ *
+ * Return:  void
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_str_close(h5tools_str_t *str)
+{
+    if (str && str->nalloc) {
+        HDfree(str->s);
+        HDmemset(str, 0, sizeof(h5tools_str_t));
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_len
+ *
+ * Purpose: Returns the length of the string, not counting the null
+ *      terminator.
+ *
+ * Return:  Success:    Length of string
+ *
+ *      Failure:    0
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+h5tools_str_len(h5tools_str_t *str)
+{
+    return str->len;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_append
+ *
+ * Purpose: Formats variable arguments according to printf() format
+ *      string and appends the result to variable length string STR.
+ *
+ * Return:  Success:    Pointer to buffer containing result.
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *              Major change:  need to check results of vsnprintf to
+ *              handle errors, empty format, and overflows.
+ *
+ * Programmer:  REMcG Matzke
+ *              June 16, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_append(h5tools_str_t *str/*in,out*/, const char *fmt, ...)
+{
+    va_list ap;
+
+    /* Make sure we have some memory into which to print */
+    if (!str->s || str->nalloc <= 0)
+        h5tools_str_reset(str);
+
+    if (HDstrlen(fmt) == 0)
+        /* nothing to print */
+        return str->s;
+
+    /* Format the arguments and append to the value already in `str' */
+    while (1) {
+        /* How many bytes available for new value, counting the new NUL */
+        size_t avail = str->nalloc - str->len;
+        int nchars = -1;
+
+        HDva_start(ap, fmt);
+        nchars = HDvsnprintf(str->s + str->len, avail, fmt, ap);
+        HDva_end(ap);
+
+        /* Note: HDvsnprintf() behaves differently on Windows as Unix, when
+         * buffer is smaller than source string. On Unix, this function
+         * returns length of the source string and copy string upto the
+         * buffer size with NULL at the end of the buffer. However on
+         * Windows with the same condition, this function returns -1 and
+         * doesn't add NULL at the end of the buffer.
+         * Because of this different return results, the strlen of the new string
+         * is used to handle when HDvsnprintf() returns -1 on Windows due
+         * to lack of buffer size, so try one more time after realloc more
+         * buffer size before return NULL.
+         */
+        if (nchars < 0)
+            /* failure, such as bad format */
+            return NULL;
+
+        if ((size_t) nchars >= avail || (0 == nchars && (HDstrcmp(fmt, "%s")))) {
+            /* Truncation return value as documented by C99, or zero return value with either of the
+             * following conditions, each of which indicates that the proper C99 return value probably
+             *  should have been positive when the format string is
+             *  something other than "%s"
+             * Alocate at least twice as much space and try again.
+             */
+            size_t newsize = MAX(str->len + (size_t)nchars + 1, 2 * str->nalloc);
+            HDassert(newsize > str->nalloc); /*overflow*/
+            str->s = (char*)HDrealloc(str->s, newsize);
+            HDassert(str->s);
+            str->nalloc = newsize;
+        }
+        else {
+            /* Success */
+            str->len += (size_t)nchars;
+            break;
+        }
+    }
+    return str->s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_reset
+ *
+ * Purpose: Reset the string to the empty value. If no memory is
+ *      allocated yet then initialize the h5tools_str_t struct.
+ *
+ * Return:  Success:    Ptr to the buffer which contains a null
+ *              character as the first element.
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_reset(h5tools_str_t *str/*in,out*/)
+{
+    if (!str->s || str->nalloc <= 0) {
+        str->nalloc = STR_INIT_LEN;
+        str->s = (char*)HDmalloc(str->nalloc);
+        HDassert(str->s);
+    }
+
+    str->s[0] = '\0';
+    str->len = 0;
+    return str->s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_trunc
+ *
+ * Purpose: Truncate a string to be at most SIZE characters.
+ *
+ * Return:  Success:    Pointer to the string
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_trunc(h5tools_str_t *str/*in,out*/, size_t size)
+{
+    if (size < str->len) {
+        str->len = size;
+        str->s[size] = '\0';
+    }
+
+    return str->s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_fmt
+ *
+ * Purpose: Reformat a string contents beginning at character START
+ *      according to printf format FMT. FMT should contain no format
+ *      specifiers except possibly the `%s' variety. For example, if
+ *      the input string is `hello' and the format is "<<%s>>" then
+ *      the output value will be "<<hello>>".
+ *
+ * Return:  Success:    A pointer to the resulting string.
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_fmt(h5tools_str_t *str/*in,out*/, size_t start, const char *fmt)
+{
+    char _temp[1024], *temp = _temp;
+
+    HDassert(str);
+    HDassert(fmt);
+
+    /* If the format string is simply "%s" then don't bother doing anything */
+    if (!HDstrcmp(fmt, "%s"))
+        return str->s;
+
+    /*
+     * Save the input value if there is a `%' anywhere in FMT.  Otherwise
+     * don't bother because we don't need a temporary copy.
+     */
+    if (HDstrchr(fmt, '%')) {
+        size_t n = sizeof(_temp);
+        if (str->len - start + 1 > n) {
+            n = str->len - start + 1;
+            temp = (char*)HDmalloc(n);
+            HDassert(temp);
+        }
+
+        HDstrncpy(temp, str->s + start, n);
+    }
+
+    /* Reset the output string and append a formatted version */
+    h5tools_str_trunc(str, start);
+    h5tools_str_append(str, fmt, temp);
+
+    /* Free the temp buffer if we allocated one */
+    if (temp != _temp)
+        HDfree(temp);
+
+    return str->s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_prefix
+ *
+ * Purpose: Renders the line prefix value into string STR.
+ *
+ * Return:  Success:    Pointer to the prefix.
+ *
+ *      Failure:    NULL
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_prefix(h5tools_str_t *str/*in,out*/, const h5tool_format_t *info,
+    hsize_t elmtno, unsigned ndims, h5tools_context_t *ctx)
+{
+    size_t i = 0;
+    hsize_t curr_pos = elmtno;
+
+    h5tools_str_reset(str);
+
+    if (ndims > 0) {
+        /*
+         * Calculate the number of elements represented by a unit change in a
+         * certain index position.
+         */
+        for (i = 0; i < (size_t) ndims; i++) {
+            ctx->pos[i] = curr_pos / ctx->acc[i];
+            curr_pos -= ctx->acc[i] * ctx->pos[i];
+        }
+        HDassert(curr_pos == 0);
+
+        /* Print the index values */
+        for (i = 0; i < (size_t) ndims; i++) {
+            if (i)
+                h5tools_str_append(str, "%s", OPT(info->idx_sep, ","));
+
+            h5tools_str_append(str, OPT(info->idx_n_fmt, HSIZE_T_FORMAT),
+                    (hsize_t) ctx->pos[i]);
+
+        }
+    }
+    else {
+        /* Scalar */
+        h5tools_str_append(str, OPT(info->idx_n_fmt, HSIZE_T_FORMAT), (hsize_t) 0);
+    }
+
+    /* Add prefix and suffix to the index */
+    return h5tools_str_fmt(str, (size_t)0, OPT(info->idx_fmt, "%s: "));
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_region_prefix
+ *
+ * Purpose: Renders the line prefix value into string STR. Region reference specific.
+ *
+ * Return:  Success:    Pointer to the prefix.
+ *          Failure:    NULL
+ *
+ * In/Out:
+ *      h5tools_context_t *ctx
+ *      h5tools_str_t     *str
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_region_prefix(h5tools_str_t *str, const h5tool_format_t *info,
+        hsize_t elmtno, hsize_t *ptdata, unsigned ndims, hsize_t max_idx[],
+        h5tools_context_t *ctx)
+{
+    hsize_t p_prod[H5S_MAX_RANK];
+    size_t i = 0;
+    hsize_t curr_pos = elmtno;
+
+    h5tools_str_reset(str);
+
+    if (ndims > 0) {
+        /*
+         * Calculate the number of elements represented by a unit change in a
+         * certain index position.
+         */
+        for (i = ndims - 1, p_prod[ndims - 1] = 1; i > 0; --i)
+            p_prod[i - 1] = (max_idx[i]) * p_prod[i];
+
+        for (i = 0; i < (size_t) ndims; i++) {
+            if(curr_pos > 0) {
+                ctx->pos[i] = curr_pos / p_prod[i];
+                curr_pos -= p_prod[i] * ctx->pos[i];
+            }
+            else
+                ctx->pos[i] = 0;
+            ctx->pos[i] += (unsigned long) ptdata[ctx->sm_pos+i];
+        }
+
+        /* Print the index values */
+        for (i = 0; i < (size_t) ndims; i++) {
+            if (i)
+                h5tools_str_append(str, "%s", OPT(info->idx_sep, ","));
+
+            h5tools_str_append(str, OPT(info->idx_n_fmt, HSIZE_T_FORMAT), (hsize_t) ctx->pos[i]);
+
+        }
+    } /* if (ndims > 0) */
+    else {
+        /* Scalar */
+        h5tools_str_append(str, OPT(info->idx_n_fmt, HSIZE_T_FORMAT), (hsize_t) 0);
+    }
+
+    /* Add prefix and suffix to the index */
+    return h5tools_str_fmt(str, (size_t)0, OPT(info->idx_fmt, "%s: "));
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_dump_space_blocks
+ *
+ * Purpose: Prints information about a dataspace selection by appending
+ *          the information to the specified string.
+ *
+ * Return:  none
+ *
+ * In/Out:
+ *      h5tools_str_t     *str
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_str_dump_space_blocks(h5tools_str_t *str, hid_t rspace,
+        const h5tool_format_t *info)
+{
+    hssize_t   snblocks;
+
+    /*
+     * This function fails if the rspace does not have blocks.
+     */
+    H5E_BEGIN_TRY {
+        snblocks = H5Sget_select_hyper_nblocks(rspace);
+    } H5E_END_TRY;
+
+    /* Print block information */
+    if (snblocks > 0) {
+        hsize_t    nblocks;
+        hsize_t   *ptdata;
+        hsize_t    alloc_size;
+        unsigned   ndims = (unsigned)H5Sget_simple_extent_ndims(rspace);
+        hsize_t u;
+
+        nblocks = (hsize_t)snblocks;
+        alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
+        HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
+        ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
+        H5Sget_select_hyper_blocklist(rspace, (hsize_t)0, nblocks, ptdata);
+
+        for (u = 0; u < nblocks; u++) {
+            unsigned v;
+
+            h5tools_str_append(str, info->dset_blockformat_pre, u ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long)u);
+
+            /* Start coordinates and opposite corner */
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : "(",
+                                    ptdata[u * 2 * ndims + v]);
+
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : ")-(",
+                                    ptdata[u * 2 * ndims + v + ndims]);
+
+            h5tools_str_append(str, ")");
+        }
+
+        HDfree(ptdata);
+    } /* end if (nblocks > 0) */
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_dump_space_points
+ *
+ * Purpose: Prints information about a dataspace selection by appending
+ *          the information to the specified string.
+ *
+ * Return:  none
+ *
+ * In/Out:
+ *      h5tools_str_t     *str
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_str_dump_space_points(h5tools_str_t *str, hid_t rspace,
+        const h5tool_format_t *info)
+{
+    hssize_t   snpoints;
+
+    /*
+     * This function fails if the rspace does not have points.
+     */
+    H5E_BEGIN_TRY {
+        snpoints = H5Sget_select_elem_npoints(rspace);
+    } H5E_END_TRY;
+
+    /* Print point information */
+    if (snpoints > 0) {
+        hsize_t   npoints;
+        hsize_t    alloc_size;
+        hsize_t   *ptdata;
+        unsigned ndims = (unsigned)H5Sget_simple_extent_ndims(rspace);
+        hsize_t u;
+
+        npoints = (hsize_t)snpoints;
+        alloc_size = npoints * ndims * sizeof(ptdata[0]);
+        HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
+        ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
+        H5Sget_select_elem_pointlist(rspace, (hsize_t)0, npoints, ptdata);
+
+        for (u = 0; u < npoints; u++) {
+            unsigned v;
+
+            h5tools_str_append(str, info->dset_ptformat_pre, u ? "," OPTIONAL_LINE_BREAK " " : "",
+                               (unsigned long)u);
+
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : "(",
+                                  (ptdata[u * ndims + v]));
+
+            h5tools_str_append(str, ")");
+        }
+
+        HDfree(ptdata);
+    } /* end if (npoints > 0) */
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_print_char
+ *
+ * Purpose: Shove a character into the STR.
+ *
+ * Return:  Nothing
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+h5tools_print_char(h5tools_str_t *str, const h5tool_format_t *info, char ch)
+{
+    if (info->str_locale == ESCAPE_HTML) {
+        if (ch <= ' ' || ch > '~')
+            h5tools_str_append(str, "%%%02x", ch);
+        else
+            h5tools_str_append(str, "%c", ch);
+    }
+    else {
+        switch (ch) {
+        case '"':
+            if (!info->do_escape)
+                h5tools_str_append(str, "\"");
+            else
+                h5tools_str_append(str, "\\\"");
+            break;
+        case '\\':
+            if (!info->do_escape)
+                h5tools_str_append(str, "\\");
+            else
+                h5tools_str_append(str, "\\\\");
+            break;
+        case '\b':
+            if (!info->do_escape)
+                h5tools_str_append(str, "\b");
+            else
+                h5tools_str_append(str, "\\b");
+            break;
+        case '\f':
+            if (!info->do_escape)
+                h5tools_str_append(str, "\f");
+            else
+                h5tools_str_append(str, "\\f");
+            break;
+        case '\n':
+            if (!info->do_escape) {
+                h5tools_str_append(str, "\n");
+                h5tools_str_append(str, "           ");
+            }
+            else
+                h5tools_str_append(str, "\\n");
+            break;
+        case '\r':
+            if (!info->do_escape) {
+                h5tools_str_append(str, "\r");
+                h5tools_str_append(str, "           ");
+            }
+            else
+                h5tools_str_append(str, "\\r");
+            break;
+        case '\t':
+            if (!info->do_escape)
+                h5tools_str_append(str, "\t");
+            else
+                h5tools_str_append(str, "\\t");
+            break;
+        default:
+            if (isprint(ch))
+                h5tools_str_append(str, "%c", ch);
+            else
+                h5tools_str_append(str, "\\%03o", ch);
+
+            break;
+        }
+    }
+}
+void
+h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info,
+                      h5tools_context_t *ctx)
+{
+    unsigned u, indentlevel = 0;
+
+    /* Write new prefix */
+    if (ctx->indent_level > 0)
+        indentlevel = ctx->indent_level;
+    else
+        /*
+         * This is because sometimes we don't print out all the header
+         * info for the data (like the tattr-2.ddl example). If that happens
+         * the ctx->indent_level is negative so we need to skip the above and
+         * just print out the default indent levels.
+         */
+        indentlevel = ctx->default_indent_level;
+
+    for (u = 0; u < indentlevel; u++)
+        h5tools_str_append(str, "%s", OPT(info->line_indent, ""));
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_sprint
+ *
+ * Purpose: Renders the value pointed to by VP of type TYPE into variable
+ *      length string STR.
+ *
+ * Return:  A pointer to memory containing the result or NULL on error.
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, July 23, 1998
+ *
+ * Modifications:
+ *      Robb Matzke, 1999-04-26
+ *      Made this function safe from overflow problems by allowing it
+ *      to reallocate the output string.
+ *
+ *      Robb Matzke, 1999-06-04
+ *      Added support for object references. The new `container'
+ *      argument is the dataset where the reference came from.
+ *
+ *      Robb Matzke, 1999-06-07
+ *      Added support for printing raw data. If info->raw is non-zero
+ *      then data is printed in hexadecimal format.
+ *
+ *  Robb Matzke, 2003-01-10
+ *  Binary output format is dd:dd:... instead of 0xdddd... so it
+ *  doesn't look like a hexadecimal integer, and thus users will
+ *  be less likely to complain that HDF5 didn't properly byte
+ *  swap their data during type conversion.
+ *
+ *  Robb Matzke, LLNL, 2003-06-05
+ *  If TYPE is a variable length string then the pointer to
+ *  the value to pring (VP) is a pointer to a `char*'.
+ *
+ *  PVN, 28 March 2006
+ *  added H5T_NATIVE_LDOUBLE case
+ *
+ *  Raymond Lu, 2011-09-01
+ *  CLANG compiler complained about the line (about 800):
+ *    tempint = (tempint >> packed_data_offset) & packed_data_mask;
+ *  The right shift may cause undefined behavior if PACKED_DATA_OFFSET is
+ *  32-bit or more. For every kind of native integers, I changed the code
+ *  to make it zero if PACKED_DATA_OFFSET is greater than or equal to the
+ *  size of integer.
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t container,
+                   hid_t type, void *vp, h5tools_context_t *ctx)
+{
+    size_t         nsize, offset, size=0, nelmts, start;
+    H5T_sign_t     nsign;
+    char          *name;
+    unsigned char *ucp_vp = (unsigned char *)vp;
+    char          *cp_vp = (char *)vp;
+    hid_t          memb, obj;
+    static char    fmt_llong[8], fmt_ullong[8];
+    H5T_str_t      pad;
+    H5T_class_t    type_class;
+
+    /* Build default formats for long long types */
+    if (!fmt_llong[0]) {
+        HDsnprintf(fmt_llong, sizeof(fmt_llong), "%%%sd", H5_PRINTF_LL_WIDTH);
+        HDsnprintf(fmt_ullong, sizeof(fmt_ullong), "%%%su", H5_PRINTF_LL_WIDTH);
+    }
+
+    /* Append value depending on data type */
+    start = h5tools_str_len(str);
+
+    nsize = H5Tget_size(type);
+    nsign = H5Tget_sign(type);
+    if (info->raw) {
+        size_t i;
+
+        if (1 == nsize) {
+            h5tools_str_append(str, OPT(info->fmt_raw, "0x%02x"), ucp_vp[0]);
+        }
+        else {
+            for (i = 0; i < nsize; i++) {
+                if (i)
+                    h5tools_str_append(str, ":");
+                h5tools_str_append(str, OPT(info->fmt_raw, "%02x"), ucp_vp[i]);
+            }
+        }
+    }
+    else {
+        if((type_class = H5Tget_class(type)) < 0)
+            return NULL;
+        switch (type_class) {
+            case H5T_FLOAT:
+                if (sizeof(float) == nsize) {
+                    /* if (H5Tequal(type, H5T_NATIVE_FLOAT)) */
+                    float tempfloat;
+
+                    HDmemcpy(&tempfloat, vp, sizeof(float));
+                    h5tools_str_append(str, OPT(info->fmt_float, "%g"), (double)tempfloat);
+                }
+                else if (sizeof(double) == nsize) {
+                    /* if (H5Tequal(type, H5T_NATIVE_DOUBLE)) */
+                    double tempdouble;
+
+                    HDmemcpy(&tempdouble, vp, sizeof(double));
+                    h5tools_str_append(str, OPT(info->fmt_double, "%g"), tempdouble);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+                }
+                else if (sizeof(long double) == nsize) {
+                    /* if (H5Tequal(type, H5T_NATIVE_LDOUBLE)) */
+                    long double templdouble;
+
+                    HDmemcpy(&templdouble, vp, sizeof(long double));
+                    h5tools_str_append(str, "%Lf", templdouble);
+#endif
+                }
+                break;
+
+            case H5T_STRING:
+                {
+                    unsigned int i;
+                    char quote = '\0';
+                    char *s;
+
+                    quote = '\0';
+                    if (H5Tis_variable_str(type)) {
+                        /* cp_vp is the pointer into the struct where a `char*' is stored. So we have
+                         * to dereference the pointer to get the `char*' to pass to HDstrlen(). */
+                        s = *(char**) cp_vp;
+                        if (s != NULL) size = HDstrlen(s);
+                    }
+                    else {
+                        s = cp_vp;
+                        size = H5Tget_size(type);
+                    }
+                    pad = H5Tget_strpad(type);
+
+                    /* Check for NULL pointer for string */
+                    if (s == NULL)
+                        h5tools_str_append(str, "NULL");
+                    else {
+                        for (i = 0; i < size && (s[i] || pad != H5T_STR_NULLTERM); i++) {
+                            unsigned j = 1;
+
+                            /*
+                             * Count how many times the next character repeats. If the
+                             * threshold is zero then that means it can repeat any number
+                             * of times.
+                             */
+                            if (info->str_repeat > 0) while (i + j < size && s[i] == s[i + j])
+                                j++;
+
+                            /*
+                             * Print the opening quote.  If the repeat count is high enough to
+                             * warrant printing the number of repeats instead of enumerating
+                             * the characters, then make sure the character to be repeated is
+                             * in it's own quote.
+                             */
+                            if (info->str_repeat > 0 && j > info->str_repeat) {
+                                if (quote)
+                                    h5tools_str_append(str, "%c", quote);
+
+                                quote = '\'';
+                                h5tools_str_append(str, "%s%c", i ? " " : "", quote);
+                            }
+                            else if (!quote) {
+                                quote = '"';
+                                h5tools_str_append(str, "%s%c", i ? " " : "", quote);
+                            }
+
+                            /* Print the character */
+                            h5tools_print_char(str, info, s[i]);
+
+                            /* Print the repeat count */
+                            if (info->str_repeat && j > info->str_repeat) {
+#ifdef REPEAT_VERBOSE
+                                h5tools_str_append(str, "%c repeats %d times", quote, j - 1);
+#else
+                                h5tools_str_append(str, "%c*%d", quote, j - 1);
+#endif  /* REPEAT_VERBOSE */
+                                quote = '\0';
+                                i += j - 1;
+                            }
+                        }
+
+                        if (quote)
+                            h5tools_str_append(str, "%c", quote);
+
+                        if (i == 0)
+                            /*empty string*/
+                            h5tools_str_append(str, "\"\"");
+                    } /* end else */
+                }
+                break;
+
+            case H5T_INTEGER:
+                if (sizeof(char) == nsize) {
+                    if (info->ascii)
+                        h5tools_print_char(str, info, (char) (*ucp_vp));
+                    else if(H5T_SGN_NONE == nsign) {
+                        unsigned char tempuchar;
+
+                        HDmemcpy(&tempuchar, ucp_vp, sizeof(unsigned char));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(unsigned char))
+                                tempuchar = 0;
+                            else
+                                tempuchar = (unsigned char)((unsigned long long)(tempuchar >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_uchar, "%hhu"), tempuchar);
+                    }
+                    else {
+                        signed char tempchar;
+
+                        HDmemcpy(&tempchar, cp_vp, sizeof(char));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(char))
+                                tempchar = 0;
+                            else
+                                tempchar = (signed char)((unsigned long long)(tempchar >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_schar, "%hhd"), tempchar);
+                    }
+                } /* end if (sizeof(char) == nsize) */
+                else if (sizeof(int) == nsize) {
+                    if(H5T_SGN_NONE == nsign) {
+                        unsigned int       tempuint;
+
+                        HDmemcpy(&tempuint, vp, sizeof(unsigned int));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(unsigned int))
+                                tempuint = 0;
+                            else
+                                tempuint = (unsigned)((tempuint >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_uint, "%u"), tempuint);
+                    }
+                    else {
+                        int                tempint;
+
+                        HDmemcpy(&tempint, vp, sizeof(int));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(int))
+                                tempint = 0;
+                            else
+                                tempint = (int)((unsigned long long)(tempint >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_int, "%d"), tempint);
+                    }
+                } /* end if (sizeof(int) == nsize) */
+                else if (sizeof(short) == nsize) {
+                    if(H5T_SGN_NONE == nsign) {
+                        unsigned short tempushort;
+
+                        HDmemcpy(&tempushort, vp, sizeof(unsigned short));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(unsigned short))
+                                tempushort = 0;
+                            else
+                                tempushort = (unsigned short)((unsigned long long)(tempushort >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_ushort, "%hu"), tempushort);
+                    }
+                    else {
+                        short tempshort;
+
+                        HDmemcpy(&tempshort, vp, sizeof(short));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(short))
+                                tempshort = 0;
+                            else
+                                tempshort = (short)((unsigned long long)(tempshort >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_short, "%hd"), tempshort);
+                    }
+                } /* end if (sizeof(short) == nsize) */
+                else if (sizeof(long) == nsize) {
+                    if(H5T_SGN_NONE == nsign) {
+                        unsigned long      tempulong;
+
+                        HDmemcpy(&tempulong, vp, sizeof(unsigned long));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(unsigned long))
+                                tempulong = 0;
+                            else
+                                tempulong = (tempulong >> packed_data_offset) & packed_data_mask;
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_ulong, "%lu"), tempulong);
+                    }
+                    else {
+                        long               templong;
+
+                        HDmemcpy(&templong, vp, sizeof(long));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(long))
+                                templong = 0;
+                            else
+                                templong = (long)((unsigned long long)(templong >> packed_data_offset) & packed_data_mask);
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_long, "%ld"), templong);
+                    }
+                } /* end if (sizeof(long) == nsize) */
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
+                else if (sizeof(long long) == nsize) {
+                    if(H5T_SGN_NONE == nsign) {
+                        unsigned long long tempullong;
+
+                        HDmemcpy(&tempullong, vp, sizeof(unsigned long long));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(unsigned long long))
+                                tempullong = 0;
+                            else
+                                tempullong = (tempullong >> packed_data_offset) & packed_data_mask;
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_ullong, fmt_ullong), tempullong);
+                    }
+                    else {
+                        long long          templlong;
+
+                        HDmemcpy(&templlong, vp, sizeof(long long));
+                        if (packed_bits_num) {
+                            if (packed_data_offset >= 8 * sizeof(long long))
+                                templlong = 0;
+                            else
+                                templlong = (templlong >> packed_data_offset) & packed_data_mask;
+                        }
+                        h5tools_str_append(str, OPT(info->fmt_llong, fmt_llong), templlong);
+                    }
+                } /* end if (sizeof(long long) == nsize) */
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
+                break;
+
+            case H5T_COMPOUND:
+                {
+                    unsigned nmembs;
+                    unsigned j;
+
+                    nmembs = (unsigned)H5Tget_nmembers(type);
+                    h5tools_str_append(str, "%s", OPT(info->cmpd_pre, "{"));
+
+                    ctx->indent_level++;
+
+                    for (j = 0; j < nmembs; j++) {
+                        if (j)
+                            h5tools_str_append(str, "%s", OPT(info->cmpd_sep, ", "OPTIONAL_LINE_BREAK));
+                        else
+                            h5tools_str_append(str, "%s", OPT(info->cmpd_end, ""));
+
+                        if (info->arr_linebreak)
+                            h5tools_str_indent(str, info, ctx);
+
+                        /* The name */
+                        name = H5Tget_member_name(type, j);
+                        h5tools_str_append(str, OPT(info->cmpd_name, ""), name);
+                        H5free_memory(name);
+
+                        /* The value */
+                        offset = H5Tget_member_offset(type, j);
+                        memb = H5Tget_member_type(type, j);
+
+                        h5tools_str_sprint(str, info, container, memb, cp_vp + offset, ctx);
+
+                        H5Tclose(memb);
+                    }
+                    ctx->indent_level--;
+
+                    if (info->arr_linebreak) {
+                        h5tools_str_append(str, "%s", OPT(info->cmpd_end, ""));
+                        h5tools_str_indent(str, info, ctx);
+                    }
+                    h5tools_str_append(str, "%s", OPT(info->cmpd_suf, "}"));
+                }
+                break;
+
+            case H5T_ENUM:
+                {
+                    char enum_name[1024];
+
+                    if (H5Tenum_nameof(type, vp, enum_name, sizeof enum_name) >= 0) {
+                        h5tools_str_append(str, h5tools_escape(enum_name, sizeof(enum_name)));
+                    }
+                    else {
+                        size_t i;
+                        if (1 == nsize) {
+                            h5tools_str_append(str, "0x%02x", ucp_vp[0]);
+                        }
+                        else {
+                            for (i = 0; i < nsize; i++)
+                                h5tools_str_append(str, "%s%02x", i ? ":" : "", ucp_vp[i]);
+                        }
+                    }
+                }
+                break;
+
+            case H5T_REFERENCE:
+                if (h5tools_str_is_zero(vp, nsize))
+                    h5tools_str_append(str, "NULL");
+                else {
+                    if (nsize == H5R_DSET_REG_REF_BUF_SIZE) {
+                        /* if (H5Tequal(type, H5T_STD_REF_DSETREG)) */
+                        h5tools_str_sprint_region(str, info, container, vp);
+                    }
+                    else if (nsize == H5R_OBJ_REF_BUF_SIZE) {
+                        /* if (H5Tequal(type, H5T_STD_REF_OBJ)) */
+                            /*
+                             * Object references -- show the type and OID of the referenced
+                             * object.
+                             */
+                            H5O_info_t oi;
+                            const char *path;
+
+                        obj = H5Rdereference(container, H5R_OBJECT, vp);
+                            H5Oget_info(obj, &oi);
+
+                            /* Print object type and close object */
+                            switch (oi.type) {
+                                case H5O_TYPE_GROUP:
+                                    h5tools_str_append(str, H5_TOOLS_GROUP);
+                                    break;
+
+                                case H5O_TYPE_DATASET:
+                                    h5tools_str_append(str, H5_TOOLS_DATASET);
+                                    break;
+
+                                case H5O_TYPE_NAMED_DATATYPE:
+                                    h5tools_str_append(str, H5_TOOLS_DATATYPE);
+                                    break;
+
+                                case H5O_TYPE_UNKNOWN:
+                                case H5O_TYPE_NTYPES:
+                                default:
+                                    h5tools_str_append(str, "%u-", (unsigned) oi.type);
+                                    break;
+                            } /* end switch */
+                            H5Oclose(obj);
+
+                            /* Print OID */
+                            if (info->obj_hidefileno)
+                                h5tools_str_append(str, info->obj_format, oi.addr);
+                            else
+                                h5tools_str_append(str, info->obj_format, oi.fileno, oi.addr);
+
+                            /* Print name */
+                            path = lookup_ref_path(*(haddr_t *) vp);
+                            if (path) {
+                                h5tools_str_append(str, " ");
+                                h5tools_str_append(str, path);
+                                h5tools_str_append(str, " ");
+                            } /* end if */
+                    } /* end else if (H5Tequal(type, H5T_STD_REF_OBJ)) */
+                }
+                break;
+
+            case H5T_ARRAY:
+                {
+                    int k, ndims;
+                    hsize_t i, dims[H5S_MAX_RANK], temp_nelmts;
+                    static int is_next_arry_elmt = 0;
+
+                    /* Get the array's base datatype for each element */
+                    memb = H5Tget_super(type);
+                    size = H5Tget_size(memb);
+                    ndims = H5Tget_array_ndims(type);
+                    H5Tget_array_dims2(type, dims);
+                    HDassert(ndims >= 1 && ndims <= H5S_MAX_RANK);
+
+                    /* Calculate the number of array elements */
+                    for (k = 0, nelmts = 1; k < ndims; k++) {
+                        temp_nelmts = nelmts;
+                        temp_nelmts *= dims[k];
+                        HDassert(temp_nelmts == (hsize_t) ((size_t) temp_nelmts));
+                        nelmts = (size_t) temp_nelmts;
+                    }
+                    /* Print the opening bracket */
+                    h5tools_str_append(str, "%s", OPT(info->arr_pre, "["));
+
+                    ctx->indent_level++;
+
+                    for (i = 0; i < nelmts; i++) {
+                        if (i)
+                            h5tools_str_append(str, "%s", OPT(info->arr_sep, "," OPTIONAL_LINE_BREAK));
+
+                        if (info->arr_linebreak && i && i % dims[ndims - 1] == 0) {
+                            h5tools_str_append(str, "%s", "\n");
+                            h5tools_str_indent(str, info, ctx);
+
+                        } /* end if */
+                        else if (i && info->arr_sep) {
+                            /* if next element begin, add next line with indent */
+                            if (is_next_arry_elmt) {
+                                is_next_arry_elmt = 0;
+
+                                h5tools_str_append(str, "%s", "\n ");
+                                h5tools_str_indent(str, info, ctx);
+
+                            }
+                            /* otherwise just add space */
+                            else
+                                h5tools_str_append(str, " ");
+
+                        } /* end else if */
+
+                        /* Dump values in an array element */
+                        is_next_arry_elmt = 0; /* dump all values in the array element, so turn it off */
+                        h5tools_str_sprint(str, info, container, memb, cp_vp + i * size, ctx);
+                    } /* end for */
+
+                    ctx->indent_level--;
+
+                    /* Print the closing bracket */
+                    h5tools_str_append(str, "%s", OPT(info->arr_suf, "]"));
+                    is_next_arry_elmt = 1; /* set for begining of next array element */
+                    H5Tclose(memb);
+                }
+                break;
+
+            case H5T_VLEN:
+                {
+                    unsigned int i;
+
+                    /* Get the VL sequences's base datatype for each element */
+                    memb = H5Tget_super(type);
+                    size = H5Tget_size(memb);
+
+                    /* Print the opening bracket */
+                    h5tools_str_append(str, "%s", OPT(info->vlen_pre, "("));
+
+                    /* Get the number of sequence elements */
+                    nelmts = ((hvl_t *) cp_vp)->len;
+
+                    for (i = 0; i < nelmts; i++) {
+                        if (i) h5tools_str_append(str, "%s", OPT(info->vlen_sep, "," OPTIONAL_LINE_BREAK));
+
+#ifdef LATER
+                        /* Need to fix so VL data breaks at correct location on end of line -QAK */
+                        if (info->arr_linebreak && h5tools_str_len(str)>=info->line_ncols) {
+                            int x;
+
+                            h5tools_str_append(str, "%s", "\n");
+
+                            /* need to indent some more here */
+                            if (ctx->indent_level >= 0)
+                                h5tools_str_append(str, "%s", OPT(info->line_pre, ""));
+
+                            for (x = 0; x < ctx->indent_level + 1; x++)
+                                h5tools_str_append(str,"%s",OPT(info->line_indent,""));
+                        } /* end if */
+#endif /* LATER */
+
+                        ctx->indent_level++;
+
+                        /* Dump the array element */
+                        h5tools_str_sprint(str, info, container, memb, ((char *) (((hvl_t *) cp_vp)->p)) + i * size, ctx);
+
+                        ctx->indent_level--;
+                    } /* end for */
+
+                    h5tools_str_append(str, "%s", OPT(info->vlen_suf, ")"));
+                    H5Tclose(memb);
+                }
+                break;
+
+            case H5T_TIME:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+                {
+                    /* All other types get printed as hexadecimal */
+                    size_t i;
+                    if (1 == nsize) {
+                        h5tools_str_append(str, "0x%02x", ucp_vp[0]);
+                    }
+                    else {
+                        for (i = 0; i < nsize; i++)
+                            h5tools_str_append(str, "%s%02x", i ? ":" : "", ucp_vp[i]);
+                    }
+                }
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                h5tools_str_append(str, "invalid datatype");
+                break;
+        } /* end switch */
+    }
+    return h5tools_str_fmt(str, start, OPT(info->elmt_fmt, "%s"));
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_sprint_region
+ *
+ * Purpose: Dataset region reference -- show the type and data of the referenced object.
+ *
+ * Return:  Nothing
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_str_sprint_region(h5tools_str_t *str, const h5tool_format_t *info,
+        hid_t container, void *vp)
+{
+    hid_t   obj, region;
+    char    ref_name[1024];
+    H5S_sel_type region_type;
+
+    obj = H5Rdereference(container, H5R_DATASET_REGION, vp);
+    if (obj >= 0) {
+        region = H5Rget_region(container, H5R_DATASET_REGION, vp);
+        if (region >= 0) {
+            H5Rget_name(obj, H5R_DATASET_REGION, vp, (char*) ref_name, 1024);
+
+            h5tools_str_append(str, info->dset_format, ref_name);
+
+            h5tools_str_append(str, "{");
+
+            region_type = H5Sget_select_type(region);
+            if(region_type==H5S_SEL_POINTS)
+                h5tools_str_dump_space_points(str, region, info);
+            else
+                h5tools_str_dump_space_blocks(str, region, info);
+
+            h5tools_str_append(str, "}");
+
+            H5Sclose(region);
+        } /* end if (region >= 0) */
+        H5Dclose(obj);
+    } /* end if (obj >= 0) */
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_escape
+ *
+ * Purpose: Changes all "funny" characters in S into standard C escape
+ *      sequences.
+ *
+ * Return:  Success:    S
+ *
+ *      Failure:    NULL if the buffer would overflow. The
+ *              buffer has as many left-to-right escapes as
+ *              possible before overflow would have happened.
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, April 26, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char *
+h5tools_escape(char *s/*in,out*/, size_t size)
+{
+    register size_t i;
+    size_t n = HDstrlen(s);
+    const char *escape;
+    char octal[8];
+
+    for (i = 0; i < n; i++) {
+        switch (s[i]) {
+        case '\'':
+            escape = "\\\'";
+            break;
+        case '\"':
+            escape = "\\\"";
+            break;
+        case '\\':
+            escape = "\\\\";
+            break;
+        case '\?':
+            escape = "\\\?";
+            break;
+        case '\a':
+            escape = "\\a";
+            break;
+        case '\b':
+            escape = "\\b";
+            break;
+        case '\f':
+            escape = "\\f";
+            break;
+        case '\n':
+            escape = "\\n";
+            break;
+        case '\r':
+            escape = "\\r";
+            break;
+        case '\t':
+            escape = "\\t";
+            break;
+        case '\v':
+            escape = "\\v";
+            break;
+        default:
+            if (!isprint(s[i])) {
+                HDsnprintf(octal, sizeof(octal), "\\%03o", (unsigned char) s[i]);
+                escape = octal;
+            }
+            else {
+                escape = NULL;
+            }
+
+            break;
+        }
+
+        if (escape) {
+            size_t esc_size = HDstrlen(escape);
+
+            if (n + esc_size + 1 > size)
+                /*would overflow*/
+                return NULL;
+
+            HDmemmove(s + i + esc_size, s + i + 1, n - i); /*make room*/
+            HDmemcpy(s + i, escape, esc_size); /*insert*/
+            n += esc_size - 1; /* adjust total string size */
+            i += esc_size; /* adjust string position */
+        }
+    }
+
+    return s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_is_zero
+ *
+ * Purpose: Determines if memory is initialized to all zero bytes.
+ *
+ * Return:  TRUE if all bytes are zero; FALSE otherwise
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, June  7, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+h5tools_str_is_zero(const void *_mem, size_t size)
+{
+    const unsigned char *mem = (const unsigned char *) _mem;
+
+    while (size-- > 0)
+        if (mem[size])
+            return FALSE;
+
+    return TRUE;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_replace
+ *
+ * Purpose:     replace all occurrences of substring.
+ *
+ * Return:      char *
+ *
+ * Programmer:  Peter Cao
+ *              March 8, 2012
+ *
+ * Notes:
+ *   Applications need to call free() to free the memoery allocated for
+ *   the return string
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5tools_str_replace ( const char *string, const char *substr, const char *replacement )
+{
+    char *tok = NULL;
+    char *newstr = NULL;
+    char *head = NULL;
+
+    if(substr == NULL || replacement == NULL)
+        return HDstrdup(string);
+    newstr = HDstrdup(string);
+    head = newstr;
+    while((tok = HDstrstr(head, substr))) {
+        char *oldstr;
+
+        oldstr = newstr;
+        newstr = (char *)HDmalloc(HDstrlen(oldstr) - HDstrlen(substr) + HDstrlen(replacement) + 1);
+
+        if(newstr == NULL) {
+        HDfree(oldstr);
+        return NULL;
+        }
+        HDmemcpy(newstr, oldstr, (size_t)(tok - oldstr));
+        HDmemcpy(newstr + (tok - oldstr), replacement, HDstrlen(replacement));
+        HDmemcpy(newstr + (tok - oldstr) + HDstrlen(replacement), tok + HDstrlen(substr), HDstrlen(oldstr) - HDstrlen(substr) - (size_t)(tok - oldstr));
+        HDmemset(newstr + HDstrlen (oldstr) - HDstrlen(substr) + HDstrlen(replacement) , 0, 1);
+        /* move back head right after the last replacement */
+        head = newstr + (tok - oldstr) + HDstrlen(replacement);
+        HDfree(oldstr);
+    }
+
+    return newstr;
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.h
new file mode 100644
index 0000000..8d4c042
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_str.h
@@ -0,0 +1,53 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Bill Wendling <wendling at ncsa.uiuc.edu>
+ *              Monday, 19. February 2001
+ */
+#ifndef H5TOOLS_STR_H__
+#define H5TOOLS_STR_H__
+
+typedef struct h5tools_str_t {
+    char    *s;     /*allocate string       */
+    size_t  len;        /*length of actual value    */
+    size_t  nalloc;     /*allocated size of string  */
+} h5tools_str_t;
+
+H5TOOLS_DLL void     h5tools_str_close(h5tools_str_t *str);
+H5TOOLS_DLL size_t   h5tools_str_len(h5tools_str_t *str);
+H5TOOLS_DLL char    *h5tools_str_append(h5tools_str_t *str, const char *fmt, ...);
+H5TOOLS_DLL char    *h5tools_str_reset(h5tools_str_t *str);
+H5TOOLS_DLL char    *h5tools_str_trunc(h5tools_str_t *str, size_t size);
+H5TOOLS_DLL char    *h5tools_str_fmt(h5tools_str_t *str, size_t start, const char *fmt);
+H5TOOLS_DLL char    *h5tools_str_prefix(h5tools_str_t *str, const h5tool_format_t *info,
+                        hsize_t elmtno, unsigned ndims, h5tools_context_t *ctx);
+/*
+ * new functions needed to display region reference data
+ */
+H5TOOLS_DLL char    *h5tools_str_region_prefix(h5tools_str_t *str, const h5tool_format_t *info,
+                                   hsize_t elmtno, hsize_t *ptdata, unsigned ndims, 
+                                   hsize_t max_idx[], h5tools_context_t *ctx);
+H5TOOLS_DLL void     h5tools_str_dump_space_blocks(h5tools_str_t *, hid_t, const h5tool_format_t *);
+H5TOOLS_DLL void     h5tools_str_dump_space_points(h5tools_str_t *, hid_t, const h5tool_format_t *);
+H5TOOLS_DLL void     h5tools_str_sprint_region(h5tools_str_t *str, const h5tool_format_t *info, hid_t container,
+                                   void *vp);
+H5TOOLS_DLL char    *h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info,
+                                   hid_t container, hid_t type, void *vp,
+                                   h5tools_context_t *ctx);
+H5TOOLS_DLL char    *h5tools_str_replace ( const char *string, const char *substr, 
+									const char *replacement );
+
+#endif  /* H5TOOLS_STR_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_type.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_type.c
new file mode 100644
index 0000000..8a56d29
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_type.c
@@ -0,0 +1,203 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_get_native_type
+ *
+ * Purpose: Wrapper around H5Tget_native_type() to work around
+ *  Problems with bitfields.
+ *
+ * Return: Success:    datatype ID
+ *
+ *  Failure:    FAIL
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, October  5, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5tools_get_native_type(hid_t type)
+{
+    hid_t p_type;
+    H5T_class_t type_class;
+
+    type_class = H5Tget_class(type);
+    if(type_class==H5T_BITFIELD)
+        p_type=H5Tcopy(type);
+    else
+        p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT);
+
+    return(p_type);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_get_little_endian_type
+ *
+ * Purpose: Get a little endian type from a file type
+ *
+ * Return: Success:    datatype ID
+ *         Failure:    FAIL
+ *
+ * Programmer: Pedro Vicente Nunes
+ *             Tuesday, July 18, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5tools_get_little_endian_type(hid_t tid)
+{
+    hid_t       p_type=-1;
+    H5T_class_t type_class;
+    size_t      size;
+    H5T_sign_t  sign;
+
+    type_class = H5Tget_class(tid);
+    size       = H5Tget_size(tid);
+    sign       = H5Tget_sign(tid);
+
+    switch(type_class) {
+        case H5T_INTEGER:
+            if ( size == 1 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I8LE);
+            else if ( size == 2 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I16LE);
+            else if ( size == 4 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I32LE);
+            else if ( size == 8 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I64LE);
+            else if ( size == 1 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U8LE);
+            else if ( size == 2 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U16LE);
+            else if ( size == 4 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U32LE);
+            else if ( size == 8 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U64LE);
+            break;
+
+        case H5T_FLOAT:
+            if ( size == 4)
+                p_type=H5Tcopy(H5T_IEEE_F32LE);
+            else if ( size == 8)
+                p_type=H5Tcopy(H5T_IEEE_F64LE);
+            break;
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_STRING:
+        case H5T_COMPOUND:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HDassert(0);
+            break;
+
+    } /* end switch */
+
+    return p_type;
+} /* end h5tools_get_little_endian_type() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_get_big_endian_type
+ *
+ * Purpose: Get a big endian type from a file type
+ *
+ * Return: Success:    datatype ID
+ *         Failure:    FAIL
+ *
+ * Programmer: Pedro Vicente Nunes
+ *             Tuesday, July 18, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5tools_get_big_endian_type(hid_t tid)
+{
+    hid_t       p_type=-1;
+    H5T_class_t type_class;
+    size_t      size;
+    H5T_sign_t  sign;
+
+    type_class = H5Tget_class(tid);
+    size       = H5Tget_size(tid);
+    sign       = H5Tget_sign(tid);
+
+    switch(type_class) {
+        case H5T_INTEGER:
+            if ( size == 1 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I8BE);
+            else if ( size == 2 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I16BE);
+            else if ( size == 4 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I32BE);
+            else if ( size == 8 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I64BE);
+            else if ( size == 1 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U8BE);
+            else if ( size == 2 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U16BE);
+            else if ( size == 4 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U32BE);
+            else if ( size == 8 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U64BE);
+            break;
+
+        case H5T_FLOAT:
+            if ( size == 4)
+                p_type=H5Tcopy(H5T_IEEE_F32BE);
+            else if ( size == 8)
+                p_type=H5Tcopy(H5T_IEEE_F64BE);
+            break;
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_STRING:
+        case H5T_COMPOUND:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HDassert(0);
+            break;
+    } /* end switch */
+
+    return p_type;
+} /* end h5tools_get_big_endian_type() */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.c b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.c
new file mode 100644
index 0000000..e19926b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.c
@@ -0,0 +1,934 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Bill Wendling <wendling at ncsa.uiuc.edu>
+ *              Tuesday, 6. March 2001
+ */
+
+/*
+ * Portions of this work are derived from _Obfuscated C and Other Mysteries_,
+ * by Don Libes, copyright (c) 1993 by John Wiley & Sons, Inc.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "H5private.h"
+#include "h5trav.h"
+
+/* global variables */
+unsigned h5tools_nCols = 80;
+/* ``get_option'' variables */
+int         opt_err = 1;    /*get_option prints errors if this is on */
+int         opt_ind = 1;    /*token pointer                          */
+const char *opt_arg;        /*flag argument (or value)               */
+static int  h5tools_d_status = 0;
+static const char  *h5tools_progname = "h5tools";
+
+/*
+ * The output functions need a temporary buffer to hold a piece of the
+ * dataset while it's being printed. This constant sets the limit on the
+ * size of that temporary buffer in bytes. For efficiency's sake, choose the
+ * largest value suitable for your machine (for testing use a small value).
+ */
+/* Maximum size used in a call to malloc for a dataset */
+hsize_t H5TOOLS_MALLOCSIZE = (256 * 1024 * 1024);  /* 256 MB */
+/* size of hyperslab buffer when a dataset is bigger than H5TOOLS_MALLOCSIZE */
+hsize_t H5TOOLS_BUFSIZE = ( 32 * 1024 * 1024);  /* 32 MB */
+
+
+/* ``parallel_print'' variables */
+unsigned char  g_Parallel = 0;  /*0 for serial, 1 for parallel */
+char     outBuff[OUTBUFF_SIZE];
+unsigned outBuffOffset;
+FILE*    overflow_file = NULL;
+
+/* local functions */
+static void init_table(table_t **tbl);
+#ifdef H5DUMP_DEBUG
+static void dump_table(char* tablename, table_t *table);
+#endif  /* H5DUMP_DEBUG */
+static void add_obj(table_t *table, haddr_t objno, const char *objname, hbool_t recorded);
+
+/*-------------------------------------------------------------------------
+ * Function: parallel_print
+ *
+ * Purpose: wrapper for printf for use in parallel mode.
+ *
+ * Programmer: Leon Arber
+ *
+ * Date: December 1, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void parallel_print(const char* format, ...)
+{
+    int  bytes_written;
+    va_list ap;
+
+    HDva_start(ap, format);
+
+    if(!g_Parallel)
+        HDvprintf(format, ap);
+    else {
+        if(overflow_file == NULL) /*no overflow has occurred yet */ {
+            bytes_written = HDvsnprintf(outBuff + outBuffOffset, OUTBUFF_SIZE - outBuffOffset, format, ap);
+            HDva_end(ap);
+            HDva_start(ap, format);
+
+            if((bytes_written < 0) || ((unsigned)bytes_written >= (OUTBUFF_SIZE - outBuffOffset))) {
+                /* Terminate the outbuff at the end of the previous output */
+                outBuff[outBuffOffset] = '\0';
+
+                overflow_file = HDtmpfile();
+                if(overflow_file == NULL)
+                    HDfprintf(rawerrorstream, "warning: could not create overflow file.  Output may be truncated.\n");
+                else
+                    bytes_written = HDvfprintf(overflow_file, format, ap);
+            }
+            else
+                outBuffOffset += (unsigned)bytes_written;
+        }
+        else
+            bytes_written = HDvfprintf(overflow_file, format, ap);
+
+    }
+    HDva_end(ap);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    error_msg
+ *
+ * Purpose: Print a nicely formatted error message to stderr flushing the
+ *              stdout stream first.
+ *
+ * Return:  Nothing
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+error_msg(const char *fmt, ...)
+{
+    va_list ap;
+
+    HDva_start(ap, fmt);
+    FLUSHSTREAM(rawattrstream);
+    FLUSHSTREAM(rawdatastream);
+    FLUSHSTREAM(rawoutstream);
+    HDfprintf(rawerrorstream, "%s error: ", h5tools_getprogname());
+    HDvfprintf(rawerrorstream, fmt, ap);
+
+    HDva_end(ap);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    warn_msg
+ *
+ * Purpose: Print a nicely formatted warning message to stderr flushing
+ *              the stdout stream first.
+ *
+ * Return:  Nothing
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+warn_msg(const char *fmt, ...)
+{
+    va_list ap;
+
+    HDva_start(ap, fmt);
+    FLUSHSTREAM(rawattrstream);
+    FLUSHSTREAM(rawdatastream);
+    FLUSHSTREAM(rawoutstream);
+    HDfprintf(rawerrorstream, "%s warning: ", h5tools_getprogname());
+    HDvfprintf(rawerrorstream, fmt, ap);
+    HDva_end(ap);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:  help_ref_msg
+ *
+ * Purpose: Print a message to refer help page
+ *
+ * Return:  Nothing
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+help_ref_msg(FILE *output)
+{
+    HDfprintf(output, "Try '-h' or '--help' for more information or ");
+    HDfprintf(output, "see the <%s> entry in the 'HDF5 Reference Manual'.\n",h5tools_getprogname());
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    get_option
+ *
+ * Purpose: Determine the command-line options a user specified. We can
+ *      accept both short and long type command-lines.
+ *
+ * Return:  Success:    The short valued "name" of the command line
+ *              parameter or EOF if there are no more
+ *              parameters to process.
+ *
+ *      Failure:    A question mark.
+ *
+ * Programmer:  Bill Wendling
+ *              Friday, 5. January 2001
+ *
+ * Modifications: Pedro Vicente
+ *                October, 27 2008
+ * Wilcard "*" argument type
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
+{
+    static int sp = 1;    /* character index in current token */
+    int opt_opt = '?';    /* option character passed back to user */
+
+    if (sp == 1) {
+        /* check for more flag-like tokens */
+        if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
+            return EOF;
+        }
+        else if (HDstrcmp(argv[opt_ind], "--") == 0) {
+            opt_ind++;
+            return EOF;
+        }
+    }
+
+    if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
+        /* long command line option */
+        const char *arg = &argv[opt_ind][2];
+        int i;
+
+        for (i = 0; l_opts && l_opts[i].name; i++) {
+            size_t len = HDstrlen(l_opts[i].name);
+
+            if (HDstrncmp(arg, l_opts[i].name, len) == 0) {
+                /* we've found a matching long command line flag */
+                opt_opt = l_opts[i].shortval;
+
+                if (l_opts[i].has_arg != no_arg) {
+                    if (arg[len] == '=') {
+                        opt_arg = &arg[len + 1];
+                    }
+                    else if (l_opts[i].has_arg != optional_arg) {
+                        if (opt_ind < (argc - 1))
+                            if (argv[opt_ind + 1][0] != '-')
+                                opt_arg = argv[++opt_ind];
+                    }
+                    else if (l_opts[i].has_arg == require_arg) {
+                        if (opt_err)
+                            HDfprintf(rawerrorstream,
+                                    "%s: option required for \"--%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+                    else
+                        opt_arg = NULL;
+                }
+                else {
+                    if (arg[len] == '=') {
+                        if (opt_err)
+                            HDfprintf(rawerrorstream,
+                                    "%s: no option required for \"%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+                    opt_arg = NULL;
+                }
+                break;
+            }
+        }
+
+        if (l_opts[i].name == NULL) {
+            /* exhausted all of the l_opts we have and still didn't match */
+            if (opt_err)
+                HDfprintf(rawerrorstream, "%s: unknown option \"%s\"\n", argv[0], arg);
+
+            opt_opt = '?';
+        }
+
+        opt_ind++;
+        sp = 1;
+    }
+    else {
+        register char *cp;    /* pointer into current token */
+
+        /* short command line option */
+        opt_opt = argv[opt_ind][sp];
+
+        if (opt_opt == ':' || (cp = HDstrchr(opts, opt_opt)) == 0) {
+            if (opt_err)
+                HDfprintf(rawerrorstream, "%s: unknown option \"%c\"\n",
+                        argv[0], opt_opt);
+
+            /* if no chars left in this token, move to next token */
+            if (argv[opt_ind][++sp] == '\0') {
+                opt_ind++;
+                sp = 1;
+            }
+            return '?';
+        }
+
+        if (*++cp == ':') {
+            /* if a value is expected, get it */
+            if (argv[opt_ind][sp + 1] != '\0') {
+                /* flag value is rest of current token */
+                opt_arg = &argv[opt_ind++][sp + 1];
+            }
+            else if (++opt_ind >= argc) {
+                if (opt_err)
+                    HDfprintf(rawerrorstream,
+                            "%s: value expected for option \"%c\"\n",
+                            argv[0], opt_opt);
+
+                opt_opt = '?';
+            }
+            else {
+                /* flag value is next token */
+                opt_arg = argv[opt_ind++];
+            }
+
+            sp = 1;
+        }
+        /* wildcard argument */
+        else if (*cp == '*') {
+            /* check the next argument */
+            opt_ind++;
+            /* we do have an extra argument, check if not last */
+            if ( (opt_ind+1) < argc ) {
+                if ( argv[opt_ind][0] != '-' ) {
+                    opt_arg = argv[opt_ind++];
+                }
+                else {
+                    opt_arg = NULL;
+                }
+            }
+            else {
+                opt_arg = NULL;
+            }
+        }
+        else {
+            /* set up to look at next char in token, next time */
+            if (argv[opt_ind][++sp] == '\0') {
+                /* no more in current token, so setup next token */
+                opt_ind++;
+                sp = 1;
+            }
+            opt_arg = NULL;
+        }
+    }
+
+    /* return the current flag character found */
+    return opt_opt;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    indentation
+ *
+ * Purpose:     Print spaces for indentation
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+indentation(unsigned x)
+{
+    if (x < h5tools_nCols) {
+        while (x-- > 0)
+            PRINTVALSTREAM(rawoutstream, " ");
+    }
+    else {
+        HDfprintf(rawerrorstream, "error: the indentation exceeds the number of cols.\n");
+        HDexit(1);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_version
+ *
+ * Purpose:     Print the program name and the version information which is
+ *      defined the same as the HDF5 library version.
+ *
+ * Return:      void
+ *
+ * Programmer:  unknown
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+print_version(const char *progname)
+{
+    PRINTSTREAM(rawoutstream, "%s: Version %u.%u.%u%s%s\n",
+           progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
+           ((const char *)H5_VERS_SUBRELEASE)[0] ? "-" : "", H5_VERS_SUBRELEASE);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    init_table
+ *
+ * Purpose:     allocate and initialize tables for shared groups, datasets,
+ *              and committed types
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+init_table(table_t **tbl)
+{
+    table_t *table = (table_t *)HDmalloc(sizeof(table_t));
+
+    table->size = 20;
+    table->nobjs = 0;
+    table->objs = (obj_t *)HDmalloc(table->size * sizeof(obj_t));
+
+    *tbl = table;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    free_table
+ *
+ * Purpose:     free tables for shared groups, datasets,
+ *              and committed types
+ *
+ * Return:      void
+ *
+ * Programmer:  Paul Harten
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+free_table(table_t *table)
+{
+    unsigned u;         /* Local index value */
+
+    /* Free the names for the objects in the table */
+    for(u = 0; u < table->nobjs; u++)
+        if(table->objs[u].objname)
+            HDfree(table->objs[u].objname);
+
+    HDfree(table->objs);
+}
+
+#ifdef H5DUMP_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_table
+ *
+ * Purpose:     display the contents of tables for debugging purposes
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+dump_table(char* tablename, table_t *table)
+{
+    unsigned u;
+
+    PRINTSTREAM(rawoutstream,"%s: # of entries = %d\n", tablename,table->nobjs);
+    for (u = 0; u < table->nobjs; u++)
+        PRINTSTREAM(rawoutstream,"%a %s %d %d\n", table->objs[u].objno,
+           table->objs[u].objname,
+           table->objs[u].displayed, table->objs[u].recorded);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_tables
+ *
+ * Purpose:     display the contents of tables for debugging purposes
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_tables(find_objs_t *info)
+{
+    dump_table("group_table", info->group_table);
+    dump_table("dset_table", info->dset_table);
+    dump_table("type_table", info->type_table);
+}
+#endif  /* H5DUMP_DEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    search_obj
+ *
+ * Purpose:     search the object specified by objno in the table
+ *
+ * Return:      Success:    an integer, the location of the object
+ *
+ *              Failure:    FAIL   if object is not found
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+obj_t *
+search_obj(table_t *table, haddr_t objno)
+{
+    unsigned u;
+
+    for(u = 0; u < table->nobjs; u++)
+        if(table->objs[u].objno == objno)
+            return &(table->objs[u]);
+
+    return NULL;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    find_objs_cb
+ *
+ * Purpose:     Callback to find objects, committed types and store them in tables
+ *
+ * Return:      Success:    SUCCEED
+ *
+ *              Failure:    FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+find_objs_cb(const char *name, const H5O_info_t *oinfo, const char *already_seen,
+    void *op_data)
+{
+    find_objs_t *info = (find_objs_t*)op_data;
+    herr_t ret_value = 0;
+
+    switch(oinfo->type) {
+        case H5O_TYPE_GROUP:
+            if(NULL == already_seen)
+                add_obj(info->group_table, oinfo->addr, name, TRUE);
+            break;
+
+        case H5O_TYPE_DATASET:
+            if(NULL == already_seen) {
+                hid_t dset;
+
+                /* Add the dataset to the list of objects */
+                add_obj(info->dset_table, oinfo->addr, name, TRUE);
+
+                /* Check for a dataset that uses a named datatype */
+                if((dset = H5Dopen2(info->fid, name, H5P_DEFAULT)) >= 0) {
+                    hid_t type = H5Dget_type(dset);
+
+                    if(H5Tcommitted(type) > 0) {
+                        H5O_info_t type_oinfo;
+
+                        H5Oget_info(type, &type_oinfo);
+                        if(search_obj(info->type_table, type_oinfo.addr) == NULL)
+                            add_obj(info->type_table, type_oinfo.addr, name, FALSE);
+                    } /* end if */
+
+                    H5Tclose(type);
+                    H5Dclose(dset);
+                } /* end if */
+                else
+                    ret_value = FAIL;
+            } /* end if */
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            if(NULL == already_seen) {
+                obj_t *found_obj;
+
+                if((found_obj = search_obj(info->type_table, oinfo->addr)) == NULL)
+                    add_obj(info->type_table, oinfo->addr, name, TRUE);
+                else {
+                    /* Use latest version of name */
+                    HDfree(found_obj->objname);
+                    found_obj->objname = HDstrdup(name);
+
+                    /* Mark named datatype as having valid name */
+                    found_obj->recorded = TRUE;
+                } /* end else */
+            } /* end if */
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            HDassert(0);
+            break;
+    } /* end switch */
+
+    return ret_value;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    init_objs
+ *
+ * Purpose:     Initialize tables for groups, datasets & named datatypes
+ *
+ * Return:      Success:    SUCCEED
+ *
+ *              Failure:    FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+init_objs(hid_t fid, find_objs_t *info, table_t **group_table,
+    table_t **dset_table, table_t **type_table)
+{
+    /* Initialize the tables */
+    init_table(group_table);
+    init_table(dset_table);
+    init_table(type_table);
+
+    /* Init the find_objs_t */
+    info->fid = fid;
+    info->group_table = *group_table;
+    info->type_table = *type_table;
+    info->dset_table = *dset_table;
+
+    /* Find all shared objects */
+    return(h5trav_visit(fid, "/", TRUE, TRUE, find_objs_cb, NULL, info));
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_obj
+ *
+ * Purpose:     add a shared object to the table
+ *              realloc the table if necessary
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+add_obj(table_t *table, haddr_t objno, const char *objname, hbool_t record)
+{
+    size_t u;
+
+    /* See if we need to make table larger */
+    if(table->nobjs == table->size) {
+        table->size *= 2;
+        table->objs = (struct obj_t *)HDrealloc(table->objs, table->size * sizeof(table->objs[0]));
+    } /* end if */
+
+    /* Increment number of objects in table */
+    u = table->nobjs++;
+
+    /* Set information about object */
+    table->objs[u].objno = objno;
+    table->objs[u].objname = HDstrdup(objname);
+    table->objs[u].recorded = record;
+    table->objs[u].displayed = 0;
+}
+
+

+#ifndef H5_HAVE_TMPFILE
+/*-------------------------------------------------------------------------
+ * Function:    tmpfile
+ *
+ * Purpose:     provide tmpfile() function when it is not supported by the
+ *              system.  Always return NULL for now.
+ *
+ * Return:      a stream description when succeeds.
+ *              NULL if fails.
+ *
+ * Programmer:  Albert Cheng, 2005/8/9
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+FILE *
+tmpfile(void)
+{
+    return NULL;
+}
+
+#endif
+
+/*-------------------------------------------------------------------------
+ * Function: H5tools_get_symlink_info
+ *
+ * Purpose: Get symbolic link (soft, external) info and its target object type
+            (dataset, group, named datatype) and path, if exist
+ *
+ * Patameters:
+ *  - [IN]  fileid : link file id
+ *  - [IN]  linkpath : link path
+ *  - [OUT] link_info: returning target object info (h5tool_link_info_t)
+ *
+ * Return:
+ *   2 : given pathname is object
+ *   1 : Succed to get link info.
+ *   0 : Detected as a dangling link
+ *  -1 : H5 API failed.
+ *
+ * NOTE:
+ *  link_info->trg_path must be freed out of this function
+ *
+ * Programmer: Jonathan Kim
+ *
+ * Date: Feb 8, 2010
+ *-------------------------------------------------------------------------*/
+int
+H5tools_get_symlink_info(hid_t file_id, const char * linkpath, h5tool_link_info_t *link_info,
+    hbool_t get_obj_type)
+{
+    htri_t l_ret;
+    H5O_info_t trg_oinfo;
+    hid_t fapl = H5P_DEFAULT;
+    hid_t lapl = H5P_DEFAULT;
+    int ret = -1; /* init to fail */
+
+    /* init */
+    link_info->trg_type = H5O_TYPE_UNKNOWN;
+
+    /* if path is root, return group type */
+    if(!HDstrcmp(linkpath,"/"))
+    {
+        link_info->trg_type = H5O_TYPE_GROUP;
+        ret = 2;
+        goto out;
+    }
+
+    /* check if link itself exist */
+    if(H5Lexists(file_id, linkpath, H5P_DEFAULT) <= 0) {
+        if(link_info->opt.msg_mode == 1)
+            parallel_print("Warning: link <%s> doesn't exist \n",linkpath);
+        goto out;
+    } /* end if */
+
+    /* get info from link */
+    if(H5Lget_info(file_id, linkpath, &(link_info->linfo), H5P_DEFAULT) < 0) {
+        if(link_info->opt.msg_mode == 1)
+            parallel_print("Warning: unable to get link info from <%s>\n",linkpath);
+        goto out;
+    } /* end if */
+
+    /* given path is hard link (object) */
+    if(link_info->linfo.type == H5L_TYPE_HARD) {
+        ret = 2;
+        goto out;
+    } /* end if */
+
+    /* trg_path must be freed out of this function when finished using */
+    link_info->trg_path = (char*)HDcalloc(link_info->linfo.u.val_size, sizeof(char));
+    HDassert(link_info->trg_path);
+
+    /* get link value */
+    if(H5Lget_val(file_id, linkpath, (void *)link_info->trg_path, link_info->linfo.u.val_size, H5P_DEFAULT) < 0) {
+        if(link_info->opt.msg_mode == 1)
+            parallel_print("Warning: unable to get link value from <%s>\n",linkpath);
+        goto out;
+    } /* end if */
+
+    /*-----------------------------------------------------
+     * if link type is external link use different lapl to
+     * follow object in other file
+     */
+    if(link_info->linfo.type == H5L_TYPE_EXTERNAL) {
+        if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+            goto out;
+        if(H5Pset_fapl_sec2(fapl) < 0)
+            goto out;
+        if((lapl = H5Pcreate(H5P_LINK_ACCESS)) < 0)
+            goto out;
+        if(H5Pset_elink_fapl(lapl, fapl) < 0)
+            goto out;
+    } /* end if */
+
+    /* Check for retrieving object info */
+    if(get_obj_type) {
+        /*--------------------------------------------------------------
+         * if link's target object exist, get type
+         */
+         /* check if target object exist */
+        l_ret = H5Oexists_by_name(file_id, linkpath, lapl);
+
+        /* detect dangling link */
+        if(l_ret == FALSE) {
+            ret = 0;
+            goto out;
+        } /* end if */
+        /* function failed */
+        else if(l_ret < 0)
+            goto out;
+
+        /* get target object info */
+        if(H5Oget_info_by_name(file_id, linkpath, &trg_oinfo, lapl) < 0) {
+            if(link_info->opt.msg_mode == 1)
+                parallel_print("Warning: unable to get object information for <%s>\n", linkpath);
+            goto out;
+        } /* end if */
+
+        /* check unknown type */
+        if(trg_oinfo.type < H5O_TYPE_GROUP || trg_oinfo.type >=H5O_TYPE_NTYPES) {
+            if(link_info->opt.msg_mode == 1)
+                parallel_print("Warning: target object of <%s> is unknown type\n", linkpath);
+            goto out;
+        }  /* end if */
+
+        /* set target obj type to return */
+        link_info->trg_type = trg_oinfo.type;
+        link_info->objno = trg_oinfo.addr;
+        link_info->fileno = trg_oinfo.fileno;
+    } /* end if */
+    else
+        link_info->trg_type = H5O_TYPE_UNKNOWN;
+
+    /* succeed */
+    ret = 1;
+
+out:
+    if(fapl != H5P_DEFAULT)
+        H5Pclose(fapl);
+    if(lapl != H5P_DEFAULT)
+        H5Pclose(lapl);
+
+    return ret;
+} /* end H5tools_get_symlink_info() */
+
+/*-------------------------------------------------------------------------
+ * Audience:    Public
+ * Chapter:     H5Tools Library
+ * Purpose:     Initialize the name and operation status of the H5 Tools library
+ * Description:
+ *      These are utility functions to set/get the program name and operation status.
+ *-------------------------------------------------------------------------
+ */
+void h5tools_setprogname(const char *Progname)
+{
+    h5tools_progname = Progname;
+}
+
+void h5tools_setstatus(int D_status)
+{
+    h5tools_d_status = D_status;
+}
+
+const char*h5tools_getprogname(void)
+{
+   return h5tools_progname;
+}
+
+int h5tools_getstatus(void)
+{
+   return h5tools_d_status;
+}
+
+/*-----------------------------------------------------------
+ * PURPOSE :
+ * if environment variable H5TOOLS_BUFSIZE is set,
+ * update H5TOOLS_BUFSIZE and H5TOOLS_MALLOCSIZE from the env
+ * This can be called from each tools main() as part of initial act.
+ * Note: this is more of debugging purpose for now.
+ */
+int h5tools_getenv_update_hyperslab_bufsize(void)
+{
+    const char *env_str = NULL;
+    long hyperslab_bufsize_mb;
+
+    /* check if environment variable is set for the hyperslab buffer size */
+    if (NULL != (env_str = HDgetenv ("H5TOOLS_BUFSIZE")))
+    {
+        errno = 0;
+        hyperslab_bufsize_mb = HDstrtol(env_str, (char**)NULL, 10);
+        if (errno != 0 || hyperslab_bufsize_mb <= 0)
+        {
+            /* TODO: later when pubilshed
+            HDfprintf(rawerrorstream,"Error: Invalid environment variable \"H5TOOLS_BUFSIZE\" : %s\n", env_str);
+            */
+
+            goto error;
+        }
+
+
+        /* convert MB to byte */
+        H5TOOLS_BUFSIZE = (hsize_t)hyperslab_bufsize_mb * 1024 * 1024;
+
+        H5TOOLS_MALLOCSIZE = MAX(H5TOOLS_BUFSIZE, H5TOOLS_MALLOCSIZE);
+    }
+
+    return (1);
+
+error:
+    return (-1);
+}
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.h b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.h
new file mode 100644
index 0000000..f7ab65b
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5tools_utils.h
@@ -0,0 +1,183 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Bill Wendling <wendling at ncsa.uiuc.edu>
+ *              Tuesday, 6. March 2001
+ *
+ * Purpose:     Support functions for the various tools.
+ */
+#ifndef H5TOOLS_UTILS_H__
+#define H5TOOLS_UTILS_H__
+
+#include "hdf5.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ``parallel_print'' information */
+#define PRINT_DATA_MAX_SIZE     512
+#define OUTBUFF_SIZE        (PRINT_DATA_MAX_SIZE*4)
+
+H5TOOLS_DLLVAR int  g_nTasks;
+H5TOOLS_DLLVAR unsigned char g_Parallel;
+H5TOOLS_DLLVAR char    outBuff[];
+H5TOOLS_DLLVAR unsigned outBuffOffset;
+H5TOOLS_DLLVAR FILE *   overflow_file;
+
+/* Maximum size used in a call to malloc for a dataset */
+H5TOOLS_DLLVAR hsize_t H5TOOLS_MALLOCSIZE;
+/* size of hyperslab buffer when a dataset is bigger than H5TOOLS_MALLOCSIZE */
+H5TOOLS_DLLVAR hsize_t H5TOOLS_BUFSIZE;
+/*
+ * begin get_option section
+ */
+H5TOOLS_DLLVAR int         opt_err;     /* getoption prints errors if this is on    */
+H5TOOLS_DLLVAR int         opt_ind;     /* token pointer                            */
+H5TOOLS_DLLVAR const char *opt_arg;     /* flag argument (or value)                 */
+
+enum {
+    no_arg = 0,         /* doesn't take an argument     */
+    require_arg,        /* requires an argument          */
+    optional_arg        /* argument is optional         */
+};
+
+/*
+ * get_option determines which options are specified on the command line and
+ * returns a pointer to any arguments possibly associated with the option in
+ * the ``opt_arg'' variable. get_option returns the shortname equivalent of
+ * the option. The long options are specified in the following way:
+ *
+ * struct long_options foo[] = {
+ *   { "filename", require_arg, 'f' },
+ *   { "append", no_arg, 'a' },
+ *   { "width", require_arg, 'w' },
+ *   { NULL, 0, 0 }
+ * };
+ *
+ * Long named options can have arguments specified as either:
+ *
+ *   ``--param=arg'' or ``--param arg''
+ *
+ * Short named options can have arguments specified as either:
+ *
+ *   ``-w80'' or ``-w 80''
+ *
+ * and can have more than one short named option specified at one time:
+ *
+ *   -aw80
+ *
+ * in which case those options which expect an argument need to come at the
+ * end.
+ */
+typedef struct long_options {
+    const char  *name;          /* name of the long option              */
+    int          has_arg;       /* whether we should look for an arg    */
+    char         shortval;      /* the shortname equivalent of long arg
+                                 * this gets returned from get_option   */
+} long_options;
+
+H5TOOLS_DLL int    get_option(int argc, const char **argv, const char *opt,
+                         const struct long_options *l_opt);
+/*
+ * end get_option section
+ */
+
+/*struct taken from the dumper. needed in table struct*/
+typedef struct obj_t {
+    haddr_t objno;
+    char *objname;
+    hbool_t displayed;          /* Flag to indicate that the object has been displayed */
+    hbool_t recorded;           /* Flag for named datatypes to indicate they were found in the group hierarchy */
+} obj_t;
+
+/*struct for the tables that the find_objs function uses*/
+typedef struct table_t {
+    size_t size;
+    size_t nobjs;
+    obj_t *objs;
+} table_t;
+
+/*this struct stores the information that is passed to the find_objs function*/
+typedef struct find_objs_t {
+    hid_t fid;
+    table_t *group_table;
+    table_t *type_table;
+    table_t *dset_table;
+} find_objs_t;
+
+H5TOOLS_DLLVAR unsigned h5tools_nCols;               /*max number of columns for outputting  */
+
+/* Definitions of useful routines */
+H5TOOLS_DLL void     indentation(unsigned);
+H5TOOLS_DLL void     print_version(const char *progname);
+H5TOOLS_DLL void     parallel_print(const char* format, ... );
+H5TOOLS_DLL void     error_msg(const char *fmt, ...);
+H5TOOLS_DLL void     warn_msg(const char *fmt, ...);
+H5TOOLS_DLL void     help_ref_msg(FILE *output);
+H5TOOLS_DLL void     free_table(table_t *table);
+#ifdef H5DUMP_DEBUG
+H5TOOLS_DLL void     dump_tables(find_objs_t *info)
+#endif  /* H5DUMP_DEBUG */
+H5TOOLS_DLL herr_t init_objs(hid_t fid, find_objs_t *info, table_t **group_table,
+    table_t **dset_table, table_t **type_table);
+H5TOOLS_DLL obj_t   *search_obj(table_t *temp, haddr_t objno);
+#ifndef H5_HAVE_TMPFILE
+H5TOOLS_DLL FILE *  tmpfile(void);
+#endif
+
+/*************************************************************
+ *
+ * candidate functions to be public
+ *
+ *************************************************************/
+
+/* This code is layout for common code among tools */
+typedef enum toolname_t {
+    TOOL_H5DIFF, TOOL_H5LS, TOOL__H5DUMP /* add as necessary */
+} h5tool_toolname_t;
+
+/* this struct can be used to differntiate among tools */
+typedef struct {
+    h5tool_toolname_t toolname;
+    int msg_mode;
+} h5tool_opt_t;
+
+/* obtain link info from H5tools_get_symlink_info() */
+typedef struct {
+    H5O_type_t  trg_type;  /* OUT: target type */
+    char *trg_path;        /* OUT: target obj path. This must be freed 
+                            *      when used with H5tools_get_symlink_info() */
+    haddr_t     objno;     /* OUT: target object address */
+    unsigned long  fileno; /* OUT: File number that target object is located in */
+    H5L_info_t linfo;      /* OUT: link info */
+    h5tool_opt_t opt;      /* IN: options */
+} h5tool_link_info_t;
+
+
+/* Definitions of routines */
+H5TOOLS_DLL int H5tools_get_symlink_info(hid_t file_id, const char * linkpath,
+    h5tool_link_info_t *link_info, hbool_t get_obj_type);
+H5TOOLS_DLL const char *h5tools_getprogname(void);
+H5TOOLS_DLL void     h5tools_setprogname(const char*progname);
+H5TOOLS_DLL int      h5tools_getstatus(void);
+H5TOOLS_DLL void     h5tools_setstatus(int d_status);
+H5TOOLS_DLL int h5tools_getenv_update_hyperslab_bufsize(void);
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* H5TOOLS_UTILS_H__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5trav.c b/gatb-core/thirdparty/hdf5/tools/lib/h5trav.c
new file mode 100644
index 0000000..86e60c3
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5trav.c
@@ -0,0 +1,1260 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "h5trav.h"
+#include "H5private.h"
+
+/*-------------------------------------------------------------------------
+ * local typedefs
+ *-------------------------------------------------------------------------
+ */
+typedef struct trav_addr_path_t {
+    haddr_t addr;
+    char *path;
+} trav_addr_path_t;
+
+typedef struct trav_addr_t {
+    size_t      nalloc;
+    size_t      nused;
+    trav_addr_path_t *objs;
+} trav_addr_t;
+
+typedef struct {
+    h5trav_obj_func_t visit_obj;        /* Callback for visiting objects */
+    h5trav_lnk_func_t visit_lnk;        /* Callback for visiting links */
+    void *udata;                /* User data to pass to callbacks */
+} trav_visitor_t;
+
+typedef struct {
+    trav_addr_t *seen;              /* List of addresses seen already */
+    const trav_visitor_t *visitor;  /* Information for visiting each link/object */
+    hbool_t is_absolute;            /* Whether the traversal has absolute paths */
+    const char *base_grp_name;      /* Name of the group that serves as the base
+                                     * for iteration */
+} trav_ud_traverse_t;
+
+typedef struct {
+    hid_t fid;                      /* File ID being traversed */
+} trav_print_udata_t;
+
+typedef struct trav_path_op_data_t {
+    const char *path;
+} trav_path_op_data_t;
+
+/* format for hsize_t */
+#ifdef H5TRAV_PRINT_SPACE
+#define HSIZE_T_FORMAT   "%" H5_PRINTF_LL_WIDTH "u"
+#endif /* H5TRAV_PRINT_SPACE */
+
+/*-------------------------------------------------------------------------
+ * local functions
+ *-------------------------------------------------------------------------
+ */
+static void trav_table_add(trav_table_t *table,
+                        const char *objname,
+                        const H5O_info_t *oinfo);
+
+static void trav_table_addlink(trav_table_t *table,
+                        haddr_t objno,
+                        const char *path);
+
+/*-------------------------------------------------------------------------
+ * local variables
+ *-------------------------------------------------------------------------
+ */
+static H5_index_t trav_index_by = H5_INDEX_NAME;
+static H5_iter_order_t trav_index_order = H5_ITER_INC;
+
+static int trav_verbosity = 0;
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_set_index
+ *
+ * Purpose: Set indexing properties for the objects & links in the file
+ *
+ * Return: none
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5trav_set_index(H5_index_t print_index_by, H5_iter_order_t print_index_order)
+{
+    trav_index_by = print_index_by;
+    trav_index_order = print_index_order;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_set_verbose
+ *
+ * Purpose: Set verbosity of file contents 1=>attributes
+ *
+ * Return: none
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5trav_set_verbose(int print_verbose)
+{
+    trav_verbosity = print_verbose;
+}
+
+/*-------------------------------------------------------------------------
+ * "h5trav info" public functions. used in h5diff
+ *-------------------------------------------------------------------------
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_addr_add
+ *
+ * Purpose: Add a hardlink address to visited data structure
+ *
+ * Return: void
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+trav_addr_add(trav_addr_t *visited, haddr_t addr, const char *path)
+{
+    size_t idx;         /* Index of address to use */
+
+    /* Allocate space if necessary */
+    if(visited->nused == visited->nalloc) {
+        visited->nalloc = MAX(1, visited->nalloc * 2);;
+        visited->objs = (trav_addr_path_t *)HDrealloc(visited->objs, visited->nalloc * sizeof(trav_addr_path_t));
+    } /* end if */
+
+    /* Append it */
+    idx = visited->nused++;
+    visited->objs[idx].addr = addr;
+    visited->objs[idx].path = HDstrdup(path);
+} /* end trav_addr_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_addr_visited
+ *
+ * Purpose: Check if an address has already been visited
+ *
+ * Return: TRUE/FALSE
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static const char *
+trav_addr_visited(trav_addr_t *visited, haddr_t addr)
+{
+    size_t u;           /* Local index variable */
+
+    /* Look for address */
+    for(u = 0; u < visited->nused; u++)
+        /* Check for address already in array */
+        if(visited->objs[u].addr == addr)
+            return(visited->objs[u].path);
+
+    /* Didn't find address */
+    return(NULL);
+} /* end trav_addr_visited() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: traverse_cb
+ *
+ * Purpose: Iterator callback for traversing objects in file
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+traverse_cb(hid_t loc_id, const char *path, const H5L_info_t *linfo,
+    void *_udata)
+{
+    trav_ud_traverse_t *udata = (trav_ud_traverse_t *)_udata;     /* User data */
+    char *new_name = NULL;
+    const char *full_name;
+    const char *already_visited = NULL; /* Whether the link/object was already visited */
+
+    /* Create the full path name for the link */
+    if(udata->is_absolute) {
+        size_t base_len = HDstrlen(udata->base_grp_name);
+        size_t add_slash = base_len ? ((udata->base_grp_name)[base_len - 1] != '/') : 1;
+        size_t new_name_len = base_len + add_slash + HDstrlen(path) + 1;
+
+        if(NULL == (new_name = (char*)HDmalloc(new_name_len)))
+            return(H5_ITER_ERROR);
+        if(add_slash)
+            HDsnprintf(new_name, new_name_len, "%s/%s", udata->base_grp_name, path);
+        else
+            HDsnprintf(new_name, new_name_len, "%s%s", udata->base_grp_name, path);
+        full_name = new_name;
+    } /* end if */
+    else
+        full_name = path;
+
+    /* Perform the correct action for different types of links */
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5O_info_t oinfo;
+
+        /* Get information about the object */
+        if(H5Oget_info_by_name(loc_id, path, &oinfo, H5P_DEFAULT) < 0) {
+            if(new_name)
+                HDfree(new_name);
+            return(H5_ITER_ERROR);
+        } /* end if */
+
+        /* If the object has multiple links, add it to the list of addresses
+         *  already visited, if it isn't there already
+         */
+        if(oinfo.rc > 1)
+            if(NULL == (already_visited = trav_addr_visited(udata->seen, oinfo.addr)))
+                trav_addr_add(udata->seen, oinfo.addr, full_name);
+
+        /* Make 'visit object' callback */
+        if(udata->visitor->visit_obj)
+            if((*udata->visitor->visit_obj)(full_name, &oinfo, already_visited, udata->visitor->udata) < 0) {
+                if(new_name)
+                    HDfree(new_name);
+                return(H5_ITER_ERROR);
+            } /* end if */
+    } /* end if */
+    else {
+        /* Make 'visit link' callback */
+        if(udata->visitor->visit_lnk)
+            if((*udata->visitor->visit_lnk)(full_name, linfo, udata->visitor->udata) < 0) {
+                if(new_name)
+                    HDfree(new_name);
+                return(H5_ITER_ERROR);
+            } /* end if */
+    } /* end else */
+
+    if(new_name)
+        HDfree(new_name);
+
+    return(H5_ITER_CONT);
+} /* end traverse_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: traverse
+ *
+ * Purpose: Iterate over all the objects/links in a file.  Conforms to the
+ *      "visitor" pattern.
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+traverse(hid_t file_id, const char *grp_name, hbool_t visit_start,
+    hbool_t recurse, const trav_visitor_t *visitor)
+{
+    H5O_info_t  oinfo;          /* Object info for starting group */
+
+    /* Get info for starting object */
+    if(H5Oget_info_by_name(file_id, grp_name, &oinfo, H5P_DEFAULT) < 0)
+        return -1;
+
+    /* Visit the starting object */
+    if(visit_start && visitor->visit_obj)
+        (*visitor->visit_obj)(grp_name, &oinfo, NULL, visitor->udata);
+
+    /* Go visiting, if the object is a group */
+    if(oinfo.type == H5O_TYPE_GROUP) {
+        trav_addr_t seen;           /* List of addresses seen */
+        trav_ud_traverse_t udata;   /* User data for iteration callback */
+
+        /* Init addresses seen */
+        seen.nused = seen.nalloc = 0;
+        seen.objs = NULL;
+
+        /* Check for multiple links to top group */
+        if(oinfo.rc > 1)
+            trav_addr_add(&seen, oinfo.addr, grp_name);
+
+        /* Set up user data structure */
+        udata.seen = &seen;
+        udata.visitor = visitor;
+        udata.is_absolute = (*grp_name == '/');
+        udata.base_grp_name = grp_name;
+
+        /* Check for iteration of links vs. visiting all links recursively */
+        if(recurse) {
+            /* Visit all links in group, recursively */
+            if(H5Lvisit_by_name(file_id, grp_name, trav_index_by, trav_index_order, traverse_cb, &udata, H5P_DEFAULT) < 0)
+                return -1;
+        } /* end if */
+        else {
+            /* Iterate over links in group */
+            if(H5Literate_by_name(file_id, grp_name, trav_index_by, trav_index_order, NULL, traverse_cb, &udata, H5P_DEFAULT) < 0)
+                return -1;
+        } /* end else */
+
+        /* Free visited addresses table */
+        if(seen.objs) {
+            size_t u;       /* Local index variable */
+
+            /* Free paths to objects */
+            for(u = 0; u < seen.nused; u++)
+                HDfree(seen.objs[u].path);
+            HDfree(seen.objs);
+        } /* end if */
+    } /* end if */
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_info_add
+ *
+ * Purpose: Add a link path & type to info struct
+ *
+ * Return: void
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+trav_info_add(trav_info_t *info, const char *path, h5trav_type_t obj_type)
+{
+    size_t idx;         /* Index of address to use  */
+
+    /* Allocate space if necessary */
+    if(info->nused == info->nalloc) {
+        info->nalloc = MAX(1, info->nalloc * 2);;
+        info->paths = (trav_path_t *)HDrealloc(info->paths, info->nalloc * sizeof(trav_path_t));
+    } /* end if */
+
+    /* Append it */
+    idx = info->nused++;
+    info->paths[idx].path = HDstrdup(path);
+    info->paths[idx].type = obj_type;
+    info->paths[idx].fileno = 0;
+    info->paths[idx].objno = HADDR_UNDEF;
+} /* end trav_info_add() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_fileinfo_add
+ *
+ * Purpose: Add a file addr & fileno to info struct
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+trav_fileinfo_add(trav_info_t *info, hid_t loc_id)
+{
+    H5O_info_t oinfo;
+    size_t idx = info->nused - 1;
+
+    if ( info->paths[idx].path && HDstrcmp(info->paths[idx].path, "."))
+      H5Oget_info_by_name(loc_id, info->paths[idx].path, &oinfo, H5P_DEFAULT);
+    else
+      H5Oget_info(loc_id, &oinfo);
+
+    info->paths[idx].objno = oinfo.addr;
+    info->paths[idx].fileno = oinfo.fileno;
+} /* end trav_fileinfo_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_info_visit_obj
+ *
+ * Purpose: Callback for visiting object, with 'info' structure
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+trav_info_visit_obj(const char *path, const H5O_info_t *oinfo,
+    const char H5_ATTR_UNUSED *already_visited, void *udata)
+{
+    size_t idx;
+    trav_info_t *info_p;
+    /* Add the object to the 'info' struct */
+    /* (object types map directly to "traversal" types) */
+    trav_info_add((trav_info_t *)udata, path, (h5trav_type_t)oinfo->type);
+
+    /* set object addr and fileno. These are for checking same object */
+    info_p = (trav_info_t *) udata;
+    idx = info_p->nused - 1;
+    info_p->paths[idx].objno = oinfo->addr;
+    info_p->paths[idx].fileno = oinfo->fileno;
+
+    return(0);
+} /* end trav_info_visit_obj() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_info_visit_lnk
+ *
+ * Purpose: Callback for visiting link, with 'info' structure
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+trav_info_visit_lnk(const char *path, const H5L_info_t *linfo, void *udata)
+{
+    /* Add the link to the 'info' struct */
+    trav_info_add((trav_info_t *)udata, path, ((linfo->type == H5L_TYPE_SOFT) ? H5TRAV_TYPE_LINK : H5TRAV_TYPE_UDLINK));
+
+    return(0);
+} /* end trav_info_visit_lnk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: h5trav_getinfo
+ *
+ * Purpose: get an array of "trav_info_t" , containing the name and type of
+ *  objects in the file
+ *
+ * Return: number of object names in file
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 6, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5trav_getinfo(hid_t file_id, trav_info_t *info)
+{
+    trav_visitor_t info_visitor;        /* Visitor structure for trav_info_t's */
+
+    /* Init visitor structure */
+    info_visitor.visit_obj = trav_info_visit_obj;
+    info_visitor.visit_lnk = trav_info_visit_lnk;
+    info_visitor.udata = info;
+
+    /* Traverse all objects in the file, visiting each object & link */
+    if(traverse(file_id, "/", TRUE, TRUE, &info_visitor) < 0)
+        return -1;
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_getindex
+ *
+ * Purpose: get index of OBJ in list
+ *
+ * Return: index, -1 if not found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+ssize_t
+h5trav_getindex(const trav_info_t *info, const char *obj)
+{
+    size_t u;           /* Local index variable */
+
+    /* Loop over all paths in 'info' struct, looking for object */
+    for(u = 0; u < info->nused; u++) {
+        /* Check for object name having full path (with leading '/') */
+        if(HDstrcmp(obj, info->paths[u].path) == 0)
+            return((ssize_t)u);
+
+        /* Check for object name without leading '/' */
+        if(HDstrcmp(obj, (info->paths[u].path + 1)) == 0)
+            return((ssize_t)u);
+    } /* end for */
+
+    return((ssize_t)-1);
+} /* end h5trav_getindex() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_info_init
+ *
+ * Purpose: Initialize the info
+ *
+ * Return: void
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+trav_info_init(const char *filename, hid_t fileid, trav_info_t **_info)
+{
+    trav_info_t *info = (trav_info_t *)HDmalloc(sizeof(trav_info_t));
+
+    /* Init info structure */
+    info->nused = info->nalloc = 0;
+    info->paths = NULL;
+    info->fname = filename;
+    info->fid = fileid;
+
+    /* Initialize list of visited symbolic links */
+    info->symlink_visited.nused = 0;
+    info->symlink_visited.nalloc = 0;
+    info->symlink_visited.objs = NULL;
+    info->symlink_visited.dangle_link = FALSE;
+    *_info = info;
+} /* end trav_info_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_info_free
+ *
+ * Purpose: free info memory
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+trav_info_free(trav_info_t *info)
+{
+    size_t u;           /* Local index variable */
+
+    if(info) {
+        /* Free visited symbolic links path and file (if alloc) */
+        for(u=0; u < info->symlink_visited.nused; u++) 
+        {
+            if (info->symlink_visited.objs[u].file)
+                HDfree(info->symlink_visited.objs[u].file);
+
+            HDfree(info->symlink_visited.objs[u].path);
+        }
+        HDfree(info->symlink_visited.objs);
+
+        /* Free path names */
+        for(u = 0; u < info->nused; u++)
+            HDfree(info->paths[u].path);
+        HDfree(info->paths);
+        HDfree(info);
+    } /* end if */
+} /* end trav_info_free() */
+
+
+/*-------------------------------------------------------------------------
+ * "h5trav table" public functions. used in h5repack
+ *-------------------------------------------------------------------------
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_table_visit_obj
+ *
+ * Purpose: Callback for visiting object, with 'table' sructure
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+trav_table_visit_obj(const char *path, const H5O_info_t *oinfo,
+    const char *already_visited, void *udata)
+{
+    trav_table_t *table = (trav_table_t *)udata;
+
+    /* Check if we've already seen this object */
+    if(NULL == already_visited)
+        /* add object to table */
+        trav_table_add(table, path, oinfo);
+    else
+        /* Add alias for object to table */
+        trav_table_addlink(table, oinfo->addr, path);
+
+    return(0);
+} /* end trav_table_visit_obj() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_table_visit_lnk
+ *
+ * Purpose: Callback for visiting link, with 'table' sructure
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+trav_table_visit_lnk(const char *path, const H5L_info_t H5_ATTR_UNUSED *linfo, void *udata)
+{
+    /* Add the link to the 'table' struct */
+    trav_table_add((trav_table_t *)udata, path, NULL);
+
+    return(0);
+} /* end trav_table_visit_lnk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: h5trav_gettable
+ *
+ * Purpose: get the trav_table_t struct
+ *
+ * Return: 0, -1 on error
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+h5trav_gettable(hid_t fid, trav_table_t *table)
+{
+    trav_visitor_t table_visitor;       /* Visitor structure for trav_table_t's */
+
+    /* Init visitor structure */
+    table_visitor.visit_obj = trav_table_visit_obj;
+    table_visitor.visit_lnk = trav_table_visit_lnk;
+    table_visitor.udata = table;
+
+    /* Traverse all objects in the file, visiting each object & link */
+    if(traverse(fid, "/", TRUE, TRUE, &table_visitor) < 0)
+        return -1;
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5trav_getindext
+ *
+ * Purpose: get index of NAME in list
+ *
+ * Return: index, -1 if not found
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 18, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+h5trav_getindext(const char *name, const trav_table_t *table)
+{
+    unsigned int i;
+
+    for(i = 0; i < table->nobjs; i++) {
+        /* Check for object name having full path (with leading '/') */
+        if(HDstrcmp(name, table->objs[i].name) == 0)
+            return((int)i);
+
+        /* Check for object name without leading '/' */
+        if(HDstrcmp(name, table->objs[i].name + 1) == 0)
+            return((int)i);
+
+        /* search also in the list of links */
+        if(table->objs[i].nlinks) {
+            unsigned int j;
+
+            for ( j=0; j<table->objs[i].nlinks; j++) {
+                /* Check for object name having full path (with leading '/') */
+                if(HDstrcmp(name, table->objs[i].links[j].new_name) == 0)
+                    return((int)i);
+
+                /* Check for object name without leading '/' */
+                if(HDstrcmp(name, table->objs[i].links[j].new_name + 1) == 0)
+                    return((int)i);
+            } /* end for */
+        } /* end if */
+    } /* end for */
+
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_add
+ *
+ * Purpose: Add OBJNO, NAME and TYPE of object to table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+trav_table_add(trav_table_t *table,
+                    const char *path,
+                    const H5O_info_t *oinfo)
+{
+    size_t new_obj;
+
+    if(table->nobjs == table->size) {
+        table->size = MAX(1, table->size * 2);
+        table->objs = (trav_obj_t *)HDrealloc(table->objs, table->size * sizeof(trav_obj_t));
+    } /* end if */
+
+    new_obj = table->nobjs++;
+    table->objs[new_obj].objno = oinfo ? oinfo->addr : HADDR_UNDEF;
+    table->objs[new_obj].flags[0] = table->objs[new_obj].flags[1] = 0;
+    table->objs[new_obj].is_same_trgobj = 0;
+    table->objs[new_obj].name = (char *)HDstrdup(path);
+    table->objs[new_obj].type = oinfo ? (h5trav_type_t)oinfo->type : H5TRAV_TYPE_LINK;
+    table->objs[new_obj].nlinks = 0;
+    table->objs[new_obj].sizelinks = 0;
+    table->objs[new_obj].links = NULL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_addlink
+ *
+ * Purpose: Add a hardlink name to the object
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+trav_table_addlink(trav_table_t *table, haddr_t objno, const char *path)
+{
+    size_t i;           /* Local index variable */
+
+    for(i = 0; i < table->nobjs; i++) {
+        if(table->objs[i].objno == objno) {
+            size_t n;
+
+            /* already inserted? */
+            if(HDstrcmp(table->objs[i].name, path) == 0)
+                return;
+
+            /* allocate space if necessary */
+            if(table->objs[i].nlinks == (unsigned)table->objs[i].sizelinks) {
+                table->objs[i].sizelinks = MAX(1, table->objs[i].sizelinks * 2);
+                table->objs[i].links = (trav_link_t *)HDrealloc(table->objs[i].links, table->objs[i].sizelinks * sizeof(trav_link_t));
+            } /* end if */
+
+            /* insert it */
+            n = table->objs[i].nlinks++;
+            table->objs[i].links[n].new_name = (char *)HDstrdup(path);
+
+            return;
+        } /* end for */
+    } /* end for */
+
+    HDassert(0 && "object not in table?!?");
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_addflags
+ *
+ * Purpose: Add FLAGS, NAME and TYPE of object to table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_addflags(unsigned *flags,
+                         char *name,
+                         h5trav_type_t type,
+                         trav_table_t *table)
+{
+    size_t new_obj;
+
+    if(table->nobjs == table->size) {
+        table->size = MAX(1, table->size * 2);
+        table->objs = (trav_obj_t *)HDrealloc(table->objs, table->size * sizeof(trav_obj_t));
+    } /* end if */
+
+    new_obj = table->nobjs++;
+    table->objs[new_obj].objno = 0;
+    table->objs[new_obj].flags[0] = flags[0];
+    table->objs[new_obj].flags[1] = flags[1];
+    table->objs[new_obj].is_same_trgobj = 0;
+    table->objs[new_obj].name = (char *)HDstrdup(name);
+    table->objs[new_obj].type = type;
+    table->objs[new_obj].nlinks = 0;
+    table->objs[new_obj].sizelinks = 0;
+    table->objs[new_obj].links = NULL;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_init
+ *
+ * Purpose: Initialize the table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_init(trav_table_t **tbl)
+{
+    trav_table_t* table = (trav_table_t*) HDmalloc(sizeof(trav_table_t));
+
+    table->size = 0;
+    table->nobjs = 0;
+    table->objs = NULL;
+
+    *tbl = table;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_free
+ *
+ * Purpose: free table memory
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_free( trav_table_t *table )
+{
+    if(table->objs) {
+        unsigned int i;
+
+        for(i = 0; i < table->nobjs; i++) {
+            HDfree(table->objs[i].name );
+            if(table->objs[i].nlinks) {
+                unsigned int j;
+
+                for(j = 0; j < table->objs[i].nlinks; j++)
+                    HDfree(table->objs[i].links[j].new_name);
+
+                HDfree(table->objs[i].links);
+            } /* end if */
+        } /* end for */
+        HDfree(table->objs);
+    } /* end if */
+    HDfree(table);
+}
+
+static herr_t
+trav_attr(hid_t
+#ifndef H5TRAV_PRINT_SPACE
+H5_ATTR_UNUSED
+#endif /* H5TRAV_PRINT_SPACE */
+obj, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *_op_data)
+{
+    trav_path_op_data_t *op_data = (trav_path_op_data_t *)_op_data;
+    const char          *buf = op_data->path;
+
+    if((strlen(buf)==1) && (*buf=='/'))
+        printf(" %-10s %s%s", "attribute", buf, attr_name);
+    else
+        printf(" %-10s %s/%s", "attribute", buf, attr_name);
+
+#ifdef H5TRAV_PRINT_SPACE
+    if(trav_verbosity < 2) {
+#endif
+        printf("\n");
+#ifdef H5TRAV_PRINT_SPACE
+    }
+    else {
+        hid_t               attr = -1;
+        hid_t               space = -1;
+        hsize_t             size[H5S_MAX_RANK];
+        int                 ndims;
+        int                 i;
+        H5S_class_t         space_type;
+
+        if((attr = H5Aopen(obj, attr_name, H5P_DEFAULT))) {
+            space = H5Aget_space(attr);
+
+            /* Data space */
+            ndims = H5Sget_simple_extent_dims(space, size, NULL);
+            space_type = H5Sget_simple_extent_type(space);
+            switch(space_type) {
+                case H5S_SCALAR:
+                    /* scalar dataspace */
+                    printf(" scalar\n");
+                    break;
+
+                case H5S_SIMPLE:
+                    /* simple dataspace */
+                    printf(" {");
+                    for (i=0; i<ndims; i++) {
+                        printf("%s" HSIZE_T_FORMAT, i?", ":"", size[i]);
+                    }
+                    printf("}\n");
+                    break;
+
+                case H5S_NULL:
+                    /* null dataspace */
+                    printf(" null\n");
+                    break;
+
+                default:
+                    /* Unknown dataspace type */
+                    printf(" unknown\n");
+                    break;
+            } /* end switch */
+
+            H5Sclose(space);
+            H5Aclose(attr);
+        }
+    }
+#endif
+
+    return(0);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_print_visit_obj
+ *
+ * Purpose: Callback for visiting object, when printing info
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+trav_print_visit_obj(const char *path, const H5O_info_t *oinfo,
+    const char *already_visited, void *udata)
+{
+    trav_print_udata_t *print_udata = (trav_print_udata_t *)udata;
+    /* Print the name of the object */
+    /* (no new-line, so that objects that we've encountered before can print
+     *  the name of the original object)
+     */
+    switch(oinfo->type) {
+        case H5O_TYPE_GROUP:
+            printf(" %-10s %s", "group", path);
+            break;
+
+        case H5O_TYPE_DATASET:
+            printf(" %-10s %s", "dataset", path);
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            printf(" %-10s %s", "datatype", path);
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            printf(" %-10s %s", "unknown object type", path);
+            break;
+    } /* end switch */
+
+    /* Check if we've already seen this object */
+    if(NULL == already_visited) {
+        trav_path_op_data_t op_data;
+
+        op_data.path = path;
+        /* Finish printing line about object */
+        printf("\n");
+        if(trav_verbosity > 0)
+            H5Aiterate_by_name(print_udata->fid, path, trav_index_by, trav_index_order, 
+                               NULL, trav_attr, &op_data, H5P_DEFAULT);
+    }
+    else
+        /* Print the link's original name */
+        printf(" -> %s\n", already_visited);
+
+    return(0);
+} /* end trav_print_visit_obj() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: trav_print_visit_lnk
+ *
+ * Purpose: Callback for visiting link, when printing info
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+trav_print_visit_lnk(const char *path, const H5L_info_t *linfo, void *udata)
+{
+    trav_print_udata_t *print_udata = (trav_print_udata_t *)udata;
+
+    /* Print appropriate information for the type of link */
+    switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            if(linfo->u.val_size > 0) {
+                char *targbuf = (char*)HDmalloc(linfo->u.val_size + 1);
+                HDassert(targbuf);
+
+                if(H5Lget_val(print_udata->fid, path, targbuf, linfo->u.val_size + 1, H5P_DEFAULT) < 0)
+                    targbuf[0] = 0;
+                printf(" %-10s %s -> %s\n", "link", path, targbuf);
+                HDfree(targbuf);
+            } /* end if */
+            else
+                printf(" %-10s %s ->\n", "link", path);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            if(linfo->u.val_size > 0) {
+                char *targbuf;
+                const char *filename = NULL;
+                const char *objname = NULL;
+
+                targbuf = (char*)HDmalloc(linfo->u.val_size + 1);
+                HDassert(targbuf);
+
+                if(H5Lget_val(print_udata->fid, path, targbuf, linfo->u.val_size + 1, H5P_DEFAULT) < 0)
+                    targbuf[0] = 0;
+                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &objname) >= 0)
+                    printf(" %-10s %s -> %s %s\n", "ext link", path, filename, objname);
+                HDfree(targbuf);
+            } /* end if */
+            else
+                printf(" %-10s %s ->\n", "ext link", path);
+            break;
+
+        case H5L_TYPE_HARD:
+            /* Should be handled elsewhere */
+            return(-1);
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+        default:
+            printf(" %-10s %s -> ???\n", "unknown type of UD link", path);
+            break;
+    } /* end switch() */
+
+    return(0);
+} /* end trav_print_visit_lnk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: h5trav_print
+ *
+ * Purpose: Print information about the objects & links in the file
+ *
+ * Return: 0, -1 on error
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: September 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+h5trav_print(hid_t fid)
+{
+    trav_print_udata_t print_udata;     /* User data for traversal */
+    trav_visitor_t print_visitor;       /* Visitor structure for printing objects */
+
+    /* Init user data for printing */
+    print_udata.fid = fid;
+
+    /* Init visitor structure */
+    print_visitor.visit_obj = trav_print_visit_obj;
+    print_visitor.visit_lnk = trav_print_visit_lnk;
+    print_visitor.udata = &print_udata;
+
+    /* Traverse all objects in the file, visiting each object & link */
+    if(traverse(fid, "/", TRUE, TRUE, &print_visitor) < 0)
+        return -1;
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: h5trav_visit
+ *
+ * Purpose: Generic traversal routine for visiting objects and links
+ *
+ * Return: 0, -1 on error
+ *
+ * Programmer: Quincey Koziol, koziol at hdfgroup.org
+ *
+ * Date: November 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+h5trav_visit(hid_t fid, const char *grp_name, hbool_t visit_start,
+    hbool_t recurse, h5trav_obj_func_t visit_obj, h5trav_lnk_func_t visit_lnk,
+    void *udata)
+{
+    trav_visitor_t visitor;             /* Visitor structure for objects */
+
+    /* Init visitor structure */
+    visitor.visit_obj = visit_obj;
+    visitor.visit_lnk = visit_lnk;
+    visitor.udata = udata;
+
+    /* Traverse all objects in the file, visiting each object & link */
+    if(traverse(fid, grp_name, visit_start, recurse, &visitor) < 0)
+        return -1;
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: symlink_visit_add
+ *
+ * Purpose: Add an symbolic link to visited data structure
+ *
+ * Return: 0 on success, -1 on failure
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_add in h5trav.c by Quincey Koziol
+ *
+ * Date: September 5, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+symlink_visit_add(symlink_trav_t *visited, H5L_type_t type, const char *file, const char *path)
+{
+    size_t  idx;         /* Index of address to use */
+
+    /* Allocate space if necessary */
+    if(visited->nused == visited->nalloc) {
+        void    *tmp_ptr;
+
+        visited->nalloc = MAX(1, visited->nalloc * 2);
+        if(NULL == (tmp_ptr = HDrealloc(visited->objs, visited->nalloc * sizeof(symlink_trav_path_t))))
+            return -1;
+        visited->objs = (symlink_trav_path_t *)tmp_ptr;
+    } /* end if */
+
+    /* Append it */
+    idx = visited->nused++;
+
+    visited->objs[idx].type = type;
+    visited->objs[idx].file = NULL;
+    visited->objs[idx].path = NULL;
+
+    if(type == H5L_TYPE_EXTERNAL) {
+        if(NULL == (visited->objs[idx].file = HDstrdup(file))) {
+            visited->nused--;
+            return -1;
+        } /* end if */
+    } /* end if */
+
+    if(NULL == (visited->objs[idx].path = HDstrdup(path))) {
+        visited->nused--;
+        if(visited->objs[idx].file)
+            HDfree (visited->objs[idx].file);
+        return -1;
+    } /* end if */
+
+    return 0;
+} /* end symlink_visit_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: symlink_is_visited
+ *
+ * Purpose: Check if an symbolic link has already been visited
+ *
+ * Return: TRUE/FALSE
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_visited in h5trav.c by Quincey Koziol
+ *
+ * Date: September 5, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+symlink_is_visited(symlink_trav_t *visited, H5L_type_t type, const char *file, const char *path)
+{
+    size_t u;  /* Local index variable */
+
+    /* Look for symlink */
+    for(u = 0; u < visited->nused; u++) {
+        /* Check for symlink values already in array */
+        /* check type and path pair to distingush between symbolic links */
+        if((visited->objs[u].type == type) && !HDstrcmp(visited->objs[u].path, path)) {
+            /* if external link, file need to be matched as well */
+            if(visited->objs[u].type == H5L_TYPE_EXTERNAL)
+                if(!HDstrcmp(visited->objs[u].file, file))
+                    return(TRUE);
+
+            return (TRUE);
+        } /* end if */
+    } /* end for */
+
+    /* Didn't find symlink */
+    return(FALSE);
+} /* end symlink_is_visited() */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/h5trav.h b/gatb-core/thirdparty/hdf5/tools/lib/h5trav.h
new file mode 100644
index 0000000..352a9e5
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/h5trav.h
@@ -0,0 +1,199 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5TRAV_H__
+#define H5TRAV_H__
+
+#include "hdf5.h"
+
+/* Typedefs for visiting objects */
+typedef herr_t (*h5trav_obj_func_t)(const char *path_name, const H5O_info_t *oinfo,
+        const char *first_seen, void *udata);
+typedef herr_t (*h5trav_lnk_func_t)(const char *path_name, const H5L_info_t *linfo,
+        void *udata);
+
+/*-------------------------------------------------------------------------
+ * public enum to specify type of an object
+ * the TYPE can be:
+ *    H5TRAV_TYPE_UNKNOWN = -1,
+ *    H5TRAV_TYPE_GROUP,            Object is a group
+ *    H5TRAV_TYPE_DATASET,          Object is a dataset
+ *    H5TRAV_TYPE_TYPE,             Object is a named datatype
+ *    H5TRAV_TYPE_LINK,             Object is a symbolic link
+ *    H5TRAV_TYPE_UDLINK,           Object is a user-defined link
+ *-------------------------------------------------------------------------
+ */
+typedef enum {
+    H5TRAV_TYPE_UNKNOWN = -1,        /* Unknown object type */
+    H5TRAV_TYPE_GROUP,          /* Object is a group */
+    H5TRAV_TYPE_DATASET,        /* Object is a dataset */
+    H5TRAV_TYPE_NAMED_DATATYPE, /* Object is a named datatype */
+    H5TRAV_TYPE_LINK,           /* Object is a symbolic link */
+    H5TRAV_TYPE_UDLINK          /* Object is a user-defined link */
+} h5trav_type_t;
+
+/*-------------------------------------------------------------------------
+ * public struct to store name and type of an object
+ *-------------------------------------------------------------------------
+ */
+/* Struct to keep track of symbolic link targets visited.
+ * Functions: symlink_visit_add() and symlink_is_visited()
+ */
+typedef struct symlink_trav_path_t {
+    H5L_type_t  type;
+    char *file;
+    char *path;
+} symlink_trav_path_t;
+
+typedef struct symlink_trav_t {
+    size_t      nalloc;
+    size_t      nused;
+    symlink_trav_path_t *objs;
+    hbool_t dangle_link;
+} symlink_trav_t;
+
+typedef struct trav_path_t {
+    char      *path;
+    h5trav_type_t type;
+    haddr_t     objno;     /* object address */
+    unsigned long 	fileno; /* File number that object is located in */
+} trav_path_t;
+
+typedef struct trav_info_t {
+    size_t      nalloc;
+    size_t      nused;
+    const char *fname;
+    hid_t fid;                          /* File ID */
+    trav_path_t *paths;
+    symlink_trav_t symlink_visited;     /* already visited symbolic links */
+    void * opts;                        /* optional data passing */
+} trav_info_t;
+
+
+/*-------------------------------------------------------------------------
+ * keep record of hard link information
+ *-------------------------------------------------------------------------
+ */
+typedef struct trav_link_t {
+    char      *new_name;
+} trav_link_t;
+
+
+/*-------------------------------------------------------------------------
+ * struct to store basic info needed for the h5trav table traversal algorythm
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct trav_obj_t {
+    haddr_t     objno;     /* object address */
+    unsigned    flags[2];  /* h5diff.object is present or not in both files*/
+    hbool_t     is_same_trgobj; /* same target object? no need to compare */
+    char        *name;     /* name */
+    h5trav_type_t type;    /* type of object */
+    trav_link_t *links;    /* array of possible link names */
+    size_t      sizelinks; /* size of links array */
+    size_t      nlinks;    /* number of links */
+} trav_obj_t;
+
+
+/*-------------------------------------------------------------------------
+ * private struct that stores all objects
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct trav_table_t {
+    size_t      size;
+    size_t      nobjs;
+    trav_obj_t *objs;
+} trav_table_t;
+
+
+/*-------------------------------------------------------------------------
+ * public functions
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------------
+ * "h5trav general" public functions
+ *-------------------------------------------------------------------------
+ */
+H5TOOLS_DLL void h5trav_set_index(H5_index_t print_index_by, H5_iter_order_t print_index_order);
+H5TOOLS_DLL int h5trav_visit(hid_t file_id, const char *grp_name, 
+    hbool_t visit_start, hbool_t recurse, h5trav_obj_func_t visit_obj, 
+    h5trav_lnk_func_t visit_lnk, void *udata);
+H5TOOLS_DLL herr_t symlink_visit_add(symlink_trav_t *visited, H5L_type_t type, const char *file, const char *path);
+H5TOOLS_DLL hbool_t symlink_is_visited(symlink_trav_t *visited, H5L_type_t type, const char *file, const char *path);
+
+/*-------------------------------------------------------------------------
+ * "h5trav info" public functions
+ *-------------------------------------------------------------------------
+ */
+H5TOOLS_DLL int h5trav_getinfo(hid_t file_id, trav_info_t *info);
+H5TOOLS_DLL ssize_t h5trav_getindex(const trav_info_t *info, const char *obj);
+H5TOOLS_DLL int trav_info_visit_obj (const char *path, const H5O_info_t *oinfo, const char *already_visited, void *udata);
+H5TOOLS_DLL int trav_info_visit_lnk (const char *path, const H5L_info_t *linfo, void *udata);
+
+/*-------------------------------------------------------------------------
+ * "h5trav table" public functions
+ *-------------------------------------------------------------------------
+ */
+
+H5TOOLS_DLL int  h5trav_gettable(hid_t fid, trav_table_t *travt);
+H5TOOLS_DLL int  h5trav_getindext(const char *obj, const trav_table_t *travt);
+
+/*-------------------------------------------------------------------------
+ * "h5trav print" public functions
+ *-------------------------------------------------------------------------
+ */
+H5TOOLS_DLL int h5trav_print(hid_t fid);
+H5TOOLS_DLL void h5trav_set_verbose(int print_verbose);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*-------------------------------------------------------------------------
+ * info private functions
+ *-------------------------------------------------------------------------
+ */
+
+H5TOOLS_DLL void trav_info_init(const char *filename, hid_t fileid, trav_info_t **info);
+
+H5TOOLS_DLL void trav_info_free(trav_info_t *info);
+
+H5TOOLS_DLL void trav_info_add(trav_info_t *info, const char *path, h5trav_type_t obj_type);
+
+H5TOOLS_DLL void trav_fileinfo_add(trav_info_t *info, hid_t loc_id);
+
+/*-------------------------------------------------------------------------
+ * table private functions
+ *-------------------------------------------------------------------------
+ */
+
+H5TOOLS_DLL void trav_table_init(trav_table_t **table);
+
+H5TOOLS_DLL void trav_table_free(trav_table_t *table);
+
+H5TOOLS_DLL void trav_table_addflags(unsigned *flags,
+                         char *objname,
+                         h5trav_type_t type,
+                         trav_table_t *table);
+
+#endif  /* H5TRAV_H__ */
+
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/io_timer.c b/gatb-core/thirdparty/hdf5/tools/lib/io_timer.c
new file mode 100644
index 0000000..b8d44de
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/io_timer.c
@@ -0,0 +1,232 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* changes:
+ * rename pio_timer.c as io_timer.c;
+ * Removed pio_perf.h so that it is not dependant on it;
+ * Removed set_timer_type() and get_timer_type() since no one calls them;
+ * Merged sio_timer.c into io_timer.c;
+ */
+
+/*
+ * Purpose:
+ *
+ * This is a module of useful timing functions for performance testing.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "H5private.h"
+#include "hdf5.h"
+
+#ifdef H5_HAVE_PARALLEL
+#include <mpi.h>
+#endif
+
+#include "io_timer.h"
+
+/*
+ * The number to divide the tv_usec field with to get a nice decimal to add to
+ * the number of seconds.
+ */
+#define MICROSECOND     1000000.0F
+
+/* global variables */
+io_time_t   *timer_g;            /* timer: global for stub functions     */
+
+/*
+ * Function:  sub_time
+ * Purpose:   Struct two time values, and return the difference, in microseconds
+ *
+ *         Note that the function assumes that a > b
+ * Programmer: Leon Arber, 1/27/06
+ */
+static double sub_time(struct timeval* a, struct timeval* b)
+{
+    return (((double)a->tv_sec +
+     ((double)a->tv_usec) / MICROSECOND) -
+  ((double)b->tv_sec +
+   ((double)b->tv_usec) / MICROSECOND));
+}
+
+
+/*
+ * Function:    io_time_new
+ * Purpose:     Build us a brand, spankin', new performance time object.
+ *              The object is a black box to the user. They just tell us
+ *              what type of timer they want (MPI_CLOCK for MPI_Wtime or
+ *              SYS_CLOCK for system time).
+ * Return:      Pointer to io_time object
+ * Programmer:  Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+io_time_t *
+io_time_new(clock_type type)
+{
+    io_time_t *pt = (io_time_t *)HDcalloc(1, sizeof(struct io_time_t));
+
+    /* set global timer variable */
+    timer_g = pt;
+
+    pt->type = type;
+    return pt;
+}
+
+/*
+ * Function:    io_time_destroy
+ * Purpose:     Remove the memory allocated for the io_time object. Only
+ *              need to call on a pointer allocated with the ``io_time_new''
+ *              function.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+void
+io_time_destroy(io_time_t *pt)
+{
+    HDfree(pt);
+    /* reset the global timer pointer too. */
+    timer_g = NULL;
+}
+
+#if 0
+/* no one is calling set_timer_type or get_timer_type ???*/
+/*
+ * Function:    set_timer_type
+ * Purpose:     Set the type of the timer to either MPI_CLOCK or SYS_CLOCK.
+ *              This really only needs to be called if you didn't construct a
+ *              timer with the pio_timer_new function (shame!).
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 04. October 2001
+ * Modifications:
+ */
+void
+set_timer_type(io_time_t *pt, clock_type type)
+{
+    pt->type = type;
+}
+
+/*
+ * Function:    get_timer_type
+ * Purpose:     Get the type of the timer.
+ * Return:      MPI_CLOCK or SYS_CLOCK.
+ * Programmer:  Bill Wendling, 04. October 2001
+ * Modifications:
+ */
+clock_type
+get_timer_type(io_time_t *pt)
+{
+    return pt->type;
+}
+#endif
+
+/*
+ * Function:    set_time
+ * Purpose:     Set the time in a ``io_time_t'' object.
+ * Return:      Pointer to the passed in ``io_time_t'' object if SUCCEED; Null otherwise.
+ * Programmer:  Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+io_time_t *
+set_time(io_time_t *pt, timer_type t, int start_stop)
+{
+    /* sanity check */
+    assert(pt);
+
+    switch(pt->type){
+#ifdef H5_HAVE_PARALLEL
+    case MPI_CLOCK:
+	if (start_stop == TSTART) {
+	    pt->mpi_timer[t] = MPI_Wtime();
+
+	    /* When we start the timer for HDF5_FINE_WRITE_FIXED_DIMS or HDF5_FINE_READ_FIXED_DIMS
+	     * we compute the time it took to only open the file */
+	    if(t == HDF5_FINE_WRITE_FIXED_DIMS)
+		pt->total_time[HDF5_FILE_WRITE_OPEN] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_GROSS_WRITE_FIXED_DIMS];
+	    else if(t == HDF5_FINE_READ_FIXED_DIMS)
+		pt->total_time[HDF5_FILE_READ_OPEN] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_GROSS_READ_FIXED_DIMS];
+
+	} else {
+	    pt->total_time[t] += MPI_Wtime() - pt->mpi_timer[t];
+	    pt->mpi_timer[t] = MPI_Wtime();
+
+	    /* When we stop the timer for HDF5_GROSS_WRITE_FIXED_DIMS or HDF5_GROSS_READ_FIXED_DIMS
+	     * we compute the time it took to close the file after the last read/write finished */
+	    if(t == HDF5_GROSS_WRITE_FIXED_DIMS)
+		pt->total_time[HDF5_FILE_WRITE_CLOSE] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_FINE_WRITE_FIXED_DIMS];
+	    else if(t == HDF5_GROSS_READ_FIXED_DIMS)
+		pt->total_time[HDF5_FILE_READ_CLOSE] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_FINE_READ_FIXED_DIMS];
+	}
+	break;
+#endif /* H5_HAVE_PARALLEL */
+    case SYS_CLOCK:
+            if (start_stop == TSTART) {
+                HDgettimeofday(&pt->sys_timer[t], NULL);
+
+		/* When we start the timer for HDF5_FINE_WRITE_FIXED_DIMS or HDF5_FINE_READ_FIXED_DIMS
+		 * we compute the time it took to only open the file */
+		if(t == HDF5_FINE_WRITE_FIXED_DIMS)
+		    pt->total_time[HDF5_FILE_WRITE_OPEN] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_GROSS_WRITE_FIXED_DIMS]));
+		else if(t == HDF5_FINE_READ_FIXED_DIMS)
+		    pt->total_time[HDF5_FILE_READ_OPEN] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_GROSS_READ_FIXED_DIMS]));
+
+
+            } else {
+                struct timeval sys_t;
+
+                HDgettimeofday(&sys_t, NULL);
+                pt->total_time[t] += sub_time(&sys_t, &(pt->sys_timer[t]));
+
+		/* When we stop the timer for HDF5_GROSS_WRITE_FIXED_DIMS or HDF5_GROSS_READ_FIXED_DIMS
+		 * we compute the time it took to close the file after the last read/write finished */
+		if(t == HDF5_GROSS_WRITE_FIXED_DIMS)
+		    pt->total_time[HDF5_FILE_WRITE_CLOSE] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_FINE_WRITE_FIXED_DIMS]));
+		else if(t == HDF5_GROSS_READ_FIXED_DIMS)
+		    pt->total_time[HDF5_FILE_READ_CLOSE] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_FINE_READ_FIXED_DIMS]));
+
+            }
+	break;
+    default:
+	HDfprintf(stderr, "Unknown time clock type (%d)\n", pt->type);
+	return (NULL);
+	break;
+    }
+
+#if 0
+    /* this does not belong here. Need fix in h5perf code when set_time() is called. -AKC- */
+    debug_start_stop_time(pt, t, start_stop);
+#endif
+
+    return pt;
+}
+
+/*
+ * Function:    get_time
+ * Purpose:     Get the time from a ``io_time_t'' object.
+ * Return:      The number of seconds as a DOUBLE.
+ * Programmer:  Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+double
+get_time(io_time_t *pt, timer_type t)
+{
+    return pt->total_time[t];
+}
+
+#if 0
+/* standalone is not working yet. Need fix later. -AKC- */
+#ifdef STANDALONE
+#include "pio_standalone.c"
+#endif
+#endif
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/io_timer.h b/gatb-core/thirdparty/hdf5/tools/lib/io_timer.h
new file mode 100644
index 0000000..4ce0733
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/io_timer.h
@@ -0,0 +1,83 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef IO_TIMER__
+#define IO_TIMER__
+
+#include "hdf5.h"
+
+#if defined(H5_TIME_WITH_SYS_TIME)
+#   include <sys/time.h>
+#   include <time.h>
+#elif defined(H5_HAVE_SYS_TIME_H)
+#   include <sys/time.h>
+#else
+#   include <time.h>
+#endif
+
+#ifdef H5_HAVE_WINSOCK2_H
+#  include <winsock2.h>
+#endif /* H5_HAVE_WINSOCK2_H */
+/* The different types of timers we can have */
+typedef enum timer_type_ {
+    HDF5_FILE_OPENCLOSE,
+    HDF5_DATASET_CREATE,
+    HDF5_MPI_WRITE,
+    HDF5_MPI_READ,
+    HDF5_FILE_READ_OPEN,
+    HDF5_FILE_READ_CLOSE,
+    HDF5_FILE_WRITE_OPEN,
+    HDF5_FILE_WRITE_CLOSE,
+    HDF5_FINE_WRITE_FIXED_DIMS,
+    HDF5_FINE_READ_FIXED_DIMS,
+    HDF5_GROSS_WRITE_FIXED_DIMS,
+    HDF5_GROSS_READ_FIXED_DIMS,
+    HDF5_RAW_WRITE_FIXED_DIMS,
+    HDF5_RAW_READ_FIXED_DIMS,
+    NUM_TIMERS
+} timer_type;
+
+typedef enum clock_type_ {
+    SYS_CLOCK = 0,   /* Use system clock to measure time     */
+    MPI_CLOCK = 1    /* Use MPI clock to measure time        */
+} clock_type;
+
+/* Miscellaneous identifiers */
+enum {
+    TSTART,          /* Start a specified timer              */
+    TSTOP            /* Stop a specified timer               */
+};
+
+/* The performance time structure */
+typedef struct io_time_t {
+    clock_type type;
+    double total_time[NUM_TIMERS];
+    double mpi_timer[NUM_TIMERS];
+    struct timeval sys_timer[NUM_TIMERS];
+} io_time_t;
+
+/* External function declarations */
+#ifdef __cplusplus
+extern "C" {
+#endif  /* __cplusplus */
+H5TOOLS_DLL io_time_t   *io_time_new(clock_type t);
+H5TOOLS_DLL void         io_time_destroy(io_time_t *pt);
+H5TOOLS_DLL io_time_t   *set_time(io_time_t *pt, timer_type t, int start_stop);
+H5TOOLS_DLL double       get_time(io_time_t *pt, timer_type t);
+#ifdef __cplusplus
+}
+#endif  /* __cplusplus */
+
+#endif  /* IO_TIMER__ */
diff --git a/gatb-core/thirdparty/hdf5/tools/lib/ph5diff.h b/gatb-core/thirdparty/hdf5/tools/lib/ph5diff.h
new file mode 100644
index 0000000..2a75228
--- /dev/null
+++ b/gatb-core/thirdparty/hdf5/tools/lib/ph5diff.h
@@ -0,0 +1,52 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _PH5DIFF_H__
+#define _PH5DIFF_H__
+
+/* Send from manager to workers */
+#define MPI_TAG_ARGS            1
+#define MPI_TAG_PRINT_TOK       2
+
+/*Sent from workers to manager */
+#define MPI_TAG_TOK_REQUEST     3
+#define MPI_TAG_DONE            4
+#define MPI_TAG_TOK_RETURN      5
+#define MPI_TAG_PRINT_DATA      6
+
+/* Operational tags used to init and complete diff */
+#define MPI_TAG_END             7
+#define MPI_TAG_PARALLEL        8
+
+struct diff_mpi_args
+{
+    char  name1[256];
+    char  name2[256];
+    diff_opt_t  options;
+    diff_args_t argdata;  /* rest args */
+};
+
+struct diffs_found
+{
+    hsize_t nfound;
+    int      not_cmp;
+};
+
+#ifdef H5_HAVE_PARALLEL
+#include <mpi.h>
+#endif
+
+#endif  /* _PH5DIFF_H__ */
+
diff --git a/gatb-core/thirdparty/json/json.hpp b/gatb-core/thirdparty/json/json.hpp
new file mode 100644
index 0000000..5884083
--- /dev/null
+++ b/gatb-core/thirdparty/json/json.hpp
@@ -0,0 +1,659 @@
+// https://github.com/nbsdx/SimpleJSON/blob/master/json.hpp
+// license: DWTFYWPL
+
+#pragma once
+
+#ifndef  THIRDPARTY_JSON
+#define  THIRDPARTY_JSON
+
+
+#include <cstdint>
+#include <cmath>
+#include <cctype>
+#include <string>
+#include <deque>
+#include <map>
+#include <type_traits>
+#include <initializer_list>
+#include <ostream>
+#include <iostream>
+
+namespace json {
+
+using std::map;
+using std::deque;
+using std::string;
+using std::enable_if;
+using std::initializer_list;
+using std::is_same;
+using std::is_convertible;
+using std::is_integral;
+using std::is_floating_point;
+
+namespace {
+    string json_escape( const string &str ) {
+        string output;
+        for( unsigned i = 0; i < str.length(); ++i )
+            switch( str[i] ) {
+                case '\"': output += "\\\""; break;
+                case '\\': output += "\\\\"; break;
+                case '\b': output += "\\b";  break;
+                case '\f': output += "\\f";  break;
+                case '\n': output += "\\n";  break;
+                case '\r': output += "\\r";  break;
+                case '\t': output += "\\t";  break;
+                default  : output += str[i]; break;
+            }
+        return output;
+    }
+}
+
+class JSON
+{
+    union BackingData {
+        BackingData( double d ) : Float( d ){}
+        BackingData( long   l ) : Int( l ){}
+        BackingData( bool   b ) : Bool( b ){}
+        BackingData( string s ) : String( new string( s ) ){}
+        BackingData()           : Int( 0 ){}
+
+        deque<JSON>        *List;
+        map<string,JSON>   *Map;
+        string             *String;
+        double              Float;
+        long                Int;
+        bool                Bool;
+    } Internal;
+
+    public:
+        enum class Class {
+            Null,
+            Object,
+            Array,
+            String,
+            Floating,
+            Integral,
+            Boolean
+        };
+
+        template <typename Container>
+        class JSONWrapper {
+            Container *object;
+
+            public:
+                JSONWrapper( Container *val ) : object( val ) {}
+                JSONWrapper( std::nullptr_t )  : object( nullptr ) {}
+
+                typename Container::iterator begin() { return object ? object->begin() : typename Container::iterator(); }
+                typename Container::iterator end() { return object ? object->end() : typename Container::iterator(); }
+                typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::iterator(); }
+                typename Container::const_iterator end() const { return object ? object->end() : typename Container::iterator(); }
+        };
+
+        template <typename Container>
+        class JSONConstWrapper {
+            const Container *object;
+
+            public:
+                JSONConstWrapper( const Container *val ) : object( val ) {}
+                JSONConstWrapper( std::nullptr_t )  : object( nullptr ) {}
+
+                typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::const_iterator(); }
+                typename Container::const_iterator end() const { return object ? object->end() : typename Container::const_iterator(); }
+        };
+
+        JSON() : Internal(), Type( Class::Null ){}
+
+        JSON( initializer_list<JSON> list ) 
+            : JSON() 
+        {
+            SetType( Class::Object );
+            for( auto i = list.begin(), e = list.end(); i != e; ++i, ++i )
+                operator[]( i->ToString() ) = *std::next( i );
+        }
+
+        JSON( JSON&& other )
+            : Internal( other.Internal )
+            , Type( other.Type )
+        { other.Type = Class::Null; other.Internal.Map = nullptr; }
+
+        JSON& operator=( JSON&& other ) {
+            ClearInternal();
+            Internal = other.Internal;
+            Type = other.Type;
+            other.Internal.Map = nullptr;
+            other.Type = Class::Null;
+            return *this;
+        }
+
+        JSON( const JSON &other ) {
+            switch( other.Type ) {
+            case Class::Object:
+                Internal.Map = 
+                    new map<string,JSON>( other.Internal.Map->begin(),
+                                          other.Internal.Map->end() );
+                break;
+            case Class::Array:
+                Internal.List = 
+                    new deque<JSON>( other.Internal.List->begin(),
+                                      other.Internal.List->end() );
+                break;
+            case Class::String:
+                Internal.String = 
+                    new string( *other.Internal.String );
+                break;
+            default:
+                Internal = other.Internal;
+            }
+            Type = other.Type;
+        }
+
+        JSON& operator=( const JSON &other ) {
+            ClearInternal();
+            switch( other.Type ) {
+            case Class::Object:
+                Internal.Map = 
+                    new map<string,JSON>( other.Internal.Map->begin(),
+                                          other.Internal.Map->end() );
+                break;
+            case Class::Array:
+                Internal.List = 
+                    new deque<JSON>( other.Internal.List->begin(),
+                                      other.Internal.List->end() );
+                break;
+            case Class::String:
+                Internal.String = 
+                    new string( *other.Internal.String );
+                break;
+            default:
+                Internal = other.Internal;
+            }
+            Type = other.Type;
+            return *this;
+        }
+
+        ~JSON() {
+            switch( Type ) {
+            case Class::Array:
+                delete Internal.List;
+                break;
+            case Class::Object:
+                delete Internal.Map;
+                break;
+            case Class::String:
+                delete Internal.String;
+                break;
+            default:;
+            }
+        }
+
+        template <typename T>
+        JSON( T b, typename enable_if<is_same<T,bool>::value>::type* = 0 ) : Internal( b ), Type( Class::Boolean ){}
+
+        template <typename T>
+        JSON( T i, typename enable_if<is_integral<T>::value && !is_same<T,bool>::value>::type* = 0 ) : Internal( (long)i ), Type( Class::Integral ){}
+
+        template <typename T>
+        JSON( T f, typename enable_if<is_floating_point<T>::value>::type* = 0 ) : Internal( (double)f ), Type( Class::Floating ){}
+
+        template <typename T>
+        JSON( T s, typename enable_if<is_convertible<T,string>::value>::type* = 0 ) : Internal( string( s ) ), Type( Class::String ){}
+
+        JSON( std::nullptr_t ) : Internal(), Type( Class::Null ){}
+
+        static JSON Make( Class type ) {
+            JSON ret; ret.SetType( type );
+            return ret;
+        }
+
+        template <typename T>
+        void append( T arg ) {
+            SetType( Class::Array ); Internal.List->emplace_back( arg );
+        }
+
+        template <typename T, typename... U>
+        void append( T arg, U... args ) {
+            append( arg ); append( args... );
+        }
+
+        template <typename T>
+            typename enable_if<is_same<T,bool>::value, JSON&>::type operator=( T b ) {
+                SetType( Class::Boolean ); Internal.Bool = b; return *this;
+            }
+
+        template <typename T>
+            typename enable_if<is_integral<T>::value && !is_same<T,bool>::value, JSON&>::type operator=( T i ) {
+                SetType( Class::Integral ); Internal.Int = i; return *this;
+            }
+
+        template <typename T>
+            typename enable_if<is_floating_point<T>::value, JSON&>::type operator=( T f ) {
+                SetType( Class::Floating ); Internal.Float = f; return *this;
+            }
+
+        template <typename T>
+            typename enable_if<is_convertible<T,string>::value, JSON&>::type operator=( T s ) {
+                SetType( Class::String ); *Internal.String = string( s ); return *this;
+            }
+
+        JSON& operator[]( const string &key ) {
+            SetType( Class::Object ); return Internal.Map->operator[]( key );
+        }
+
+        JSON& operator[]( unsigned index ) {
+            SetType( Class::Array );
+            if( index >= Internal.List->size() ) Internal.List->resize( index + 1 );
+            return Internal.List->operator[]( index );
+        }
+
+        JSON &at( const string &key ) {
+            return operator[]( key );
+        }
+
+        const JSON &at( const string &key ) const {
+            return Internal.Map->at( key );
+        }
+
+        JSON &at( unsigned index ) {
+            return operator[]( index );
+        }
+
+        const JSON &at( unsigned index ) const {
+            return Internal.List->at( index );
+        }
+
+        int length() const {
+            if( Type == Class::Array )
+                return Internal.List->size();
+            else
+                return -1;
+        }
+
+        bool hasKey( const string &key ) const {
+            if( Type == Class::Object )
+                return Internal.Map->find( key ) != Internal.Map->end();
+            return false;
+        }
+
+        int size() const {
+            if( Type == Class::Object )
+                return Internal.Map->size();
+            else if( Type == Class::Array )
+                return Internal.List->size();
+            else
+                return -1;
+        }
+
+        Class JSONType() const { return Type; }
+
+        /// Functions for getting primitives from the JSON object.
+        bool IsNull() const { return Type == Class::Null; }
+
+        string ToString() const { bool b; return ToString( b ); }
+        string ToString( bool &ok ) const {
+            ok = (Type == Class::String);
+            return ok ? json_escape( *Internal.String ) : string("");
+        }
+
+        double ToFloat() const { bool b; return ToFloat( b ); }
+        double ToFloat( bool &ok ) const {
+            ok = (Type == Class::Floating);
+            return ok ? Internal.Float : 0.0;
+        }
+
+        long ToInt() const { bool b; return ToInt( b ); }
+        long ToInt( bool &ok ) const {
+            ok = (Type == Class::Integral);
+            return ok ? Internal.Int : 0;
+        }
+
+        bool ToBool() const { bool b; return ToBool( b ); }
+        bool ToBool( bool &ok ) const {
+            ok = (Type == Class::Boolean);
+            return ok ? Internal.Bool : false;
+        }
+
+        JSONWrapper<map<string,JSON>> ObjectRange() {
+            if( Type == Class::Object )
+                return JSONWrapper<map<string,JSON>>( Internal.Map );
+            return JSONWrapper<map<string,JSON>>( nullptr );
+        }
+
+        JSONWrapper<deque<JSON>> ArrayRange() {
+            if( Type == Class::Array )
+                return JSONWrapper<deque<JSON>>( Internal.List );
+            return JSONWrapper<deque<JSON>>( nullptr );
+        }
+
+        JSONConstWrapper<map<string,JSON>> ObjectRange() const {
+            if( Type == Class::Object )
+                return JSONConstWrapper<map<string,JSON>>( Internal.Map );
+            return JSONConstWrapper<map<string,JSON>>( nullptr );
+        }
+
+
+        JSONConstWrapper<deque<JSON>> ArrayRange() const { 
+            if( Type == Class::Array )
+                return JSONConstWrapper<deque<JSON>>( Internal.List );
+            return JSONConstWrapper<deque<JSON>>( nullptr );
+        }
+
+        string dump( int depth = 1, string tab = "  ") const {
+            string pad = "";
+            for( int i = 0; i < depth; ++i, pad += tab );
+
+            switch( Type ) {
+                case Class::Null:
+                    return "null";
+                case Class::Object: {
+                    string s = "{\n";
+                    bool skip = true;
+                    for( auto &p : *Internal.Map ) {
+                        if( !skip ) s += ",\n";
+                        s += ( pad + "\"" + p.first + "\" : " + p.second.dump( depth + 1, tab ) );
+                        skip = false;
+                    }
+                    s += ( "\n" + pad.erase( 0, 2 ) + "}" ) ;
+                    return s;
+                }
+                case Class::Array: {
+                    string s = "[";
+                    bool skip = true;
+                    for( auto &p : *Internal.List ) {
+                        if( !skip ) s += ", ";
+                        s += p.dump( depth + 1, tab );
+                        skip = false;
+                    }
+                    s += "]";
+                    return s;
+                }
+                case Class::String:
+                    return "\"" + json_escape( *Internal.String ) + "\"";
+                case Class::Floating:
+                    return std::to_string( Internal.Float );
+                case Class::Integral:
+                    return std::to_string( Internal.Int );
+                case Class::Boolean:
+                    return Internal.Bool ? "true" : "false";
+                default:
+                    return "";
+            }
+            return "";
+        }
+
+        friend std::ostream& operator<<( std::ostream&, const JSON & );
+
+    private:
+        void SetType( Class type ) {
+            if( type == Type )
+                return;
+
+            ClearInternal();
+          
+            switch( type ) {
+            case Class::Null:      Internal.Map    = nullptr;                break;
+            case Class::Object:    Internal.Map    = new map<string,JSON>(); break;
+            case Class::Array:     Internal.List   = new deque<JSON>();     break;
+            case Class::String:    Internal.String = new string();           break;
+            case Class::Floating:  Internal.Float  = 0.0;                    break;
+            case Class::Integral:  Internal.Int    = 0;                      break;
+            case Class::Boolean:   Internal.Bool   = false;                  break;
+            }
+
+            Type = type;
+        }
+
+    private:
+      /* beware: only call if YOU know that Internal is allocated. No checks performed here. 
+         This function should be called in a constructed JSON just before you are going to 
+        overwrite Internal... 
+      */
+      void ClearInternal() {
+        switch( Type ) {
+          case Class::Object: delete Internal.Map;    break;
+          case Class::Array:  delete Internal.List;   break;
+          case Class::String: delete Internal.String; break;
+          default:;
+        }
+      }
+
+    private:
+
+        Class Type = Class::Null;
+};
+
+// not needed in gatb and incompatible with file being included in multiple places anyway
+/*
+JSON Array() {
+    return JSON::Make( JSON::Class::Array );
+}
+
+template <typename... T>
+JSON Array( T... args ) {
+    JSON arr = JSON::Make( JSON::Class::Array );
+    arr.append( args... );
+    return arr;
+}
+
+JSON Object() {
+    return JSON::Make( JSON::Class::Object );
+}
+
+std::ostream& operator<<( std::ostream &os, const JSON &json ) {
+    os << json.dump();
+    return os;
+}
+*/
+
+namespace {
+    JSON parse_next( const string &, size_t & );
+
+    void consume_ws( const string &str, size_t &offset ) {
+        while( isspace( str[offset] ) ) ++offset;
+    }
+
+    JSON parse_object( const string &str, size_t &offset ) {
+        JSON Object = JSON::Make( JSON::Class::Object );
+
+        ++offset;
+        consume_ws( str, offset );
+        if( str[offset] == '}' ) {
+            ++offset; return Object;
+        }
+
+        while( true ) {
+            JSON Key = parse_next( str, offset );
+            consume_ws( str, offset );
+            if( str[offset] != ':' ) {
+                std::cerr << "Error: Object: Expected colon, found '" << str[offset] << "'\n";
+                break;
+            }
+            consume_ws( str, ++offset );
+            JSON Value = parse_next( str, offset );
+            Object[Key.ToString()] = Value;
+            
+            consume_ws( str, offset );
+            if( str[offset] == ',' ) {
+                ++offset; continue;
+            }
+            else if( str[offset] == '}' ) {
+                ++offset; break;
+            }
+            else {
+                std::cerr << "ERROR: Object: Expected comma, found '" << str[offset] << "'\n";
+                break;
+            }
+        }
+
+        return Object;
+    }
+
+    JSON parse_array( const string &str, size_t &offset ) {
+        JSON Array = JSON::Make( JSON::Class::Array );
+        unsigned index = 0;
+        
+        ++offset;
+        consume_ws( str, offset );
+        if( str[offset] == ']' ) {
+            ++offset; return Array;
+        }
+
+        while( true ) {
+            Array[index++] = parse_next( str, offset );
+            consume_ws( str, offset );
+
+            if( str[offset] == ',' ) {
+                ++offset; continue;
+            }
+            else if( str[offset] == ']' ) {
+                ++offset; break;
+            }
+            else {
+                std::cerr << "ERROR: Array: Expected ',' or ']', found '" << str[offset] << "'\n";
+                return JSON::Make( JSON::Class::Array );
+            }
+        }
+
+        return Array;
+    }
+
+    JSON parse_string( const string &str, size_t &offset ) {
+        JSON String;
+        string val;
+        for( char c = str[++offset]; c != '\"' ; c = str[++offset] ) {
+            if( c == '\\' ) {
+                switch( str[ ++offset ] ) {
+                case '\"': val += '\"'; break;
+                case '\\': val += '\\'; break;
+                case '/' : val += '/' ; break;
+                case 'b' : val += '\b'; break;
+                case 'f' : val += '\f'; break;
+                case 'n' : val += '\n'; break;
+                case 'r' : val += '\r'; break;
+                case 't' : val += '\t'; break;
+                case 'u' : {
+                    val += "\\u" ;
+                    for( unsigned i = 1; i <= 4; ++i ) {
+                        c = str[offset+i];
+                        if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') )
+                            val += c;
+                        else {
+                            std::cerr << "ERROR: String: Expected hex character in unicode escape, found '" << c << "'\n";
+                            return JSON::Make( JSON::Class::String );
+                        }
+                    }
+                    offset += 4;
+                } break;
+                default  : val += '\\'; break;
+                }
+            }
+            else
+                val += c;
+        }
+        ++offset;
+        String = val;
+        return String;
+    }
+
+    JSON parse_number( const string &str, size_t &offset ) {
+        JSON Number;
+        string val, exp_str;
+        char c;
+        bool isDouble = false;
+        long exp = 0;
+        while( true ) {
+            c = str[offset++];
+            if( (c == '-') || (c >= '0' && c <= '9') )
+                val += c;
+            else if( c == '.' ) {
+                val += c; 
+                isDouble = true;
+            }
+            else
+                break;
+        }
+        if( c == 'E' || c == 'e' ) {
+            c = str[ offset++ ];
+            if( c == '-' ){ ++offset; exp_str += '-';}
+            while( true ) {
+                c = str[ offset++ ];
+                if( c >= '0' && c <= '9' )
+                    exp_str += c;
+                else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) {
+                    std::cerr << "ERROR: Number: Expected a number for exponent, found '" << c << "'\n";
+                    return JSON::Make( JSON::Class::Null );
+                }
+                else
+                    break;
+            }
+            exp = std::stol( exp_str );
+        }
+        else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) {
+            std::cerr << "ERROR: Number: unexpected character '" << c << "'\n";
+            return JSON::Make( JSON::Class::Null );
+        }
+        --offset;
+        
+        if( isDouble )
+            Number = std::stod( val ) * std::pow( 10, exp );
+        else {
+            if( !exp_str.empty() )
+                Number = std::stol( val ) * std::pow( 10, exp );
+            else
+                Number = std::stol( val );
+        }
+        return Number;
+    }
+
+    JSON parse_bool( const string &str, size_t &offset ) {
+        JSON Bool;
+        if( str.substr( offset, 4 ) == "true" )
+            Bool = true;
+        else if( str.substr( offset, 5 ) == "false" )
+            Bool = false;
+        else {
+            std::cerr << "ERROR: Bool: Expected 'true' or 'false', found '" << str.substr( offset, 5 ) << "'\n";
+            return JSON::Make( JSON::Class::Null );
+        }
+        offset += (Bool.ToBool() ? 4 : 5);
+        return Bool;
+    }
+
+    JSON parse_null( const string &str, size_t &offset ) {
+        JSON Null;
+        if( str.substr( offset, 4 ) != "null" ) {
+            std::cerr << "ERROR: Null: Expected 'null', found '" << str.substr( offset, 4 ) << "'\n";
+            return JSON::Make( JSON::Class::Null );
+        }
+        offset += 4;
+        return Null;
+    }
+
+    JSON parse_next( const string &str, size_t &offset ) {
+        char value;
+        consume_ws( str, offset );
+        value = str[offset];
+        switch( value ) {
+            case '[' : return parse_array( str, offset );
+            case '{' : return parse_object( str, offset );
+            case '\"': return parse_string( str, offset );
+            case 't' :
+            case 'f' : return parse_bool( str, offset );
+            case 'n' : return parse_null( str, offset );
+            default  : if( ( value <= '9' && value >= '0' ) || value == '-' )
+                           return parse_number( str, offset );
+        }
+        std::cerr << "ERROR: Parse: Unknown starting character '" << value << "'\n";
+        return JSON();
+    }
+
+    JSON LoadJson( const string & str){
+            size_t offset = 0;
+            return parse_next( str, offset );
+    }
+}
+
+
+} // End Namespace json
+
+#endif
diff --git a/gatb-core/tools/BankDownload.cpp b/gatb-core/tools/BankDownload.cpp
new file mode 100644
index 0000000..8e95590
--- /dev/null
+++ b/gatb-core/tools/BankDownload.cpp
@@ -0,0 +1,189 @@
+//! [snippet1]
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <iostream>
+
+// We use the required packages
+using namespace std;
+
+static const char* STR_BANK_URL = "-url";
+
+/********************************************************************************/
+/********************************************************************************/
+
+/** This program loads banks from an GET, then iterates the bank to get some
+ * statistics.
+ *
+ * The fine part is that these statistics are saved as metadata of the inode of the
+ * bank file (supported by some file systems). Then, it is possible to get the
+ * statistics with the shell 'getfattr' command.
+ *
+ * NOTE:
+ *  1) if the downloaded file is gzipped, then the final bank is gunzipped
+ *
+ *  2) if the downloaded file is SRA format, then the final bank is converted in FASTA
+ *     (provided the fact that the fastq-dump binary is available on the system)
+ *
+ * EXAMPLE:
+ *      BankDownload -url ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/proteomes/HUMAN.fasta.gz
+ *
+ *      then, you can type "getfattr -d HUMAN.fasta" and get the following information:
+ *
+ *          # file: HUMAN.fasta
+ *          user.bank_name="HUMAN"
+ *          user.bank_type="prot"
+ *          user.data_size="35208089"
+ *          user.download_date="20140612_175614"
+ *          user.download_url="ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/proteomes/HUMAN.fasta.gz"
+ *          user.file_size="44489858"
+ *          user.file_url="/local/databases/ref/proteomes/HUMAN.fasta"
+ *          user.seq_max_size="35991"
+ *          user.seq_min_size="11"
+ *          user.seq_number="88949"
+ */
+
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("BankDownload");
+    parser.push_back (new OptionOneParam (STR_BANK_URL,       "bank url",   true));
+    parser.push_back (new OptionOneParam (STR_URI_OUTPUT_DIR, "output dir", false));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** Shortcuts */
+        string url     = options->getStr(STR_BANK_URL);
+        string dateStr = System::time().getDateString();
+
+        /** We get the bank name from the url. */
+        string bankFile = url;
+        const size_t last_slash_idx = bankFile.find_last_of("\\/");
+        if (std::string::npos != last_slash_idx)  {  bankFile.erase (0, last_slash_idx + 1);  }
+
+        /** We erase the file if already exists. */
+        System::file().remove (bankFile);
+
+        /** We download the bank with wget. */
+        stringstream ss1;     ss1 << "wget '" << url << "'";
+        int res1 = system (ss1.str().c_str());
+        if (res1!=EXIT_SUCCESS)  { throw Exception ("Error with wget command"); }
+
+        /** We test whether we got the file or not. */
+        if (System::file().doesExist(bankFile) == false)  {  throw Exception("Unable to download '%s'", url.c_str());  }
+
+        /** We test whether the file is gzipped, SRA, ... */
+        bool isGzipped = false;
+        bool isSRA     = false;
+        const size_t period_idx = bankFile.rfind('.');
+        string finalBankFile = bankFile;
+        if (std::string::npos != period_idx)
+        {
+            if (bankFile.substr(period_idx).compare(".gz")==0)
+            {
+                isGzipped = true;
+                finalBankFile.erase (period_idx);
+            }
+
+            if (bankFile.substr(period_idx).compare(".sra")==0)
+            {
+                isSRA = true;
+                finalBankFile.erase (period_idx);
+                finalBankFile += ".fasta";
+            }
+        }
+
+        if (isGzipped==true)
+        {
+            /** We erase the file if already exists. */
+            System::file().remove (finalBankFile);
+
+            /** We unzip the file. */
+            stringstream ss2;     ss2 << "gunzip " << bankFile;
+            int res2 = system (ss2.str().c_str());
+            if (res2!=EXIT_SUCCESS)  { throw Exception ("Error with gunzip command"); }
+        }
+
+        if (isSRA==true)
+        {
+            /** We convert the SRA file to FASTA format. */
+            stringstream ss3;     ss3 << "fastq-dump --fasta 60 " << bankFile;
+            int res3 = system (ss3.str().c_str());
+            if (res3!=EXIT_SUCCESS)  { throw Exception ("Error with fastq-dump command"); }
+        }
+
+        // We open the bank
+        BankFasta bank (finalBankFile);
+
+        /** We get information about the bank. */
+        u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0;
+        u_int64_t nbLetters=0, nbNucleotides=0;
+
+        ProgressIterator<Sequence,Progress> it (bank, "iterate", 1000);
+        for (it.first(); !it.isDone(); it.next())
+        {
+            // Shortcuts
+            Sequence& seq = it.item();
+            Data&     data = seq.getData();
+
+            nbSequences ++;
+            if (data.size() > seqMaxSize)  { seqMaxSize = data.size(); }
+            if (data.size() < seqMinSize)  { seqMinSize = data.size(); }
+            dataSize += data.size ();
+
+            for (size_t i=0; i<seq.getDataSize(); i++, nbLetters++)
+            {
+                char c = tolower(seq.getDataBuffer()[i]);
+                if (c=='a' || c=='c' || c=='g' || c=='t') { nbNucleotides ++; }
+            }
+        }
+
+        string dataKind = "??";
+        if (nbLetters > 0)  {  dataKind = (float)nbNucleotides / (float)nbLetters > 0.9 ? "nucl" : "prot"; }
+
+        string bankName = System::file().getBaseName(finalBankFile);
+
+        /** We get the file size. */
+        u_int64_t fileSize = System::file().getSize(finalBankFile);
+
+        /** We move the file if needed. */
+        string finalBankUrl = finalBankFile;
+        if (options->get(STR_URI_OUTPUT_DIR) != 0)
+        {
+            finalBankUrl = options->getStr(STR_URI_OUTPUT_DIR) + "/" + finalBankUrl;
+            system (Stringify::format ("mv %s %s/", finalBankFile.c_str(), options->getStr(STR_URI_OUTPUT_DIR).c_str()).c_str());
+        }
+
+        /** We tag the file with information. */
+        System::file().setAttribute (finalBankUrl, "bank_name",     "%s",  bankName.c_str());
+        System::file().setAttribute (finalBankUrl, "bank_type",     "%s",  dataKind.c_str());
+        System::file().setAttribute (finalBankUrl, "data_size",     "%ld", dataSize);
+        System::file().setAttribute (finalBankUrl, "download_date", "%s",  dateStr.c_str());
+        System::file().setAttribute (finalBankUrl, "download_url",  "%s",  url.c_str());
+        System::file().setAttribute (finalBankUrl, "seq_number",    "%ld", nbSequences);
+        System::file().setAttribute (finalBankUrl, "seq_max_size",  "%ld", seqMaxSize);
+        System::file().setAttribute (finalBankUrl, "seq_min_size",  "%ld", seqMinSize);
+        System::file().setAttribute (finalBankUrl, "file_url",      "%s",  finalBankUrl.c_str());
+        System::file().setAttribute (finalBankUrl, "file_size",     "%ld", fileSize);
+
+        /** Cleanup. */
+        if (isSRA == true)
+        {
+            System::file().remove (bankFile);
+        }
+    }
+
+    catch (OptionFailure& e)
+    {
+        e.getParser().displayErrors (stdout);
+        e.getParser().displayHelp   (stdout);
+        return EXIT_FAILURE;
+    }
+    catch (gatb::core::system::Exception& e)
+    {
+        cerr << "EXCEPTION: " << e.getMessage() << endl;
+    }
+}
+//! [snippet1]
diff --git a/gatb-core/tools/CMakeLists.txt b/gatb-core/tools/CMakeLists.txt
new file mode 100644
index 0000000..92bc536
--- /dev/null
+++ b/gatb-core/tools/CMakeLists.txt
@@ -0,0 +1,47 @@
+################################################################################
+message ("--  ---------- GATB TOOLS ----------")
+################################################################################
+
+################################################################################
+#  TOOLS
+################################################################################
+
+# We add the compilation options for the library
+add_definitions (${gatb-core-flags})
+
+include_directories (${gatb-core-includes})
+
+# We add the path for extra libraries
+link_directories (${gatb-core-extra-libraries-path})
+
+list (APPEND PROGRAMS dbgh5 dbginfo leon)
+
+FOREACH (program ${PROGRAMS})
+  add_executable(${program} ${program}.cpp)
+  target_link_libraries(${program} ${gatb-core-libraries})
+  
+  # (rayan) attempt at static linking, not sure if it works properly
+  # but we need this to distribute binaries that are compatible on old system 
+  # (see lh3's post on Biostar during the 2.0.1 dsk/minia release, he could not
+  # run dsk even though i compiled it on gcc 4.4.7 on genocluster2)
+  if (static)
+     set_target_properties(${program} PROPERTIES LINK_SEARCH_START_STATIC w1)
+      set_target_properties(${program} PROPERTIES LINK_SEARCH_END_STATIC 1)
+      set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+      if (APPLE)
+          set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++") #removed -static because doesn't work on mac's
+      else()
+          set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static")
+      endif()
+      message ("STATIC BINARIES for ${program}")
+  else()
+      message ("DYNAMIC BINARIES for ${program}")
+  endif()
+
+
+ENDFOREACH (program)
+
+################################################################################
+#  INSTALLATION 
+################################################################################
+install (TARGETS dbgh5 dbginfo leon DESTINATION bin)
diff --git a/gatb-core/tools/ClearCache.cpp b/gatb-core/tools/ClearCache.cpp
new file mode 100644
index 0000000..399b23c
--- /dev/null
+++ b/gatb-core/tools/ClearCache.cpp
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/misc/api/Range.hpp>
+#include <gatb/tools/misc/impl/Progress.hpp>
+#include <gatb/tools/designpattern/impl/IteratorHelpers.hpp>
+
+#include <iostream>
+#include <vector>
+
+using namespace std;
+using namespace gatb::core::system::impl;
+using namespace gatb::core::tools::misc;
+using namespace gatb::core::tools::misc::impl;
+using namespace gatb::core::tools::dp::impl;
+
+/********************************************************************************/
+void clear (u_int64_t toErase)
+{
+    u_int64_t totalPhysical = System::info().getMemoryPhysicalTotal();
+
+    if (toErase == 0)  {  toErase = totalPhysical; }
+
+    size_t blockSize = 32*1024;
+
+    u_int32_t nbIter = toErase/blockSize;
+
+    vector<void*> buffers (nbIter, 0);
+
+    SubjectIterator<u_int32_t> it (new Range<u_int32_t>::Iterator (1, nbIter), nbIter/100);
+
+    it.addObserver (new ProgressTimer (nbIter, "clear cache"));
+
+    size_t i=0;
+    for (it.first(); !it.isDone(); it.next())
+    {
+        void* b = calloc (blockSize, 1);
+        if (b != 0)  {  buffers[i]=b; i++; }
+    }
+
+    //#if 0
+    //    size_t j=0;
+    //    for (size_t k=0; k<nbIter; k++)
+    //    {
+    //        void* b = buffers[k];
+    //        if (b != 0)  { free (b); j++; }
+    //    }
+    //#endif
+}
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+    //cout << "totalPhysMem = " << System::info().getMemoryPhysicalTotal() << endl;
+    //cout << "physMemUsed  = " << System::info().getMemoryPhysicalUsed()  << endl;
+    //cout << "buffersMem   = " << System::info().getMemoryBuffers()       << endl;
+
+    /** Provided in MBytes */
+    u_int64_t toErase = 1024 * 1024 * (argc >= 2 ? atol (argv[1]) : 0);
+
+    clear (toErase);
+
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/tools/KmerChecksum.cpp b/gatb-core/tools/KmerChecksum.cpp
new file mode 100644
index 0000000..403a9a1
--- /dev/null
+++ b/gatb-core/tools/KmerChecksum.cpp
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/system/impl/System.hpp>
+#include <gatb/tools/collections/impl/IteratorFile.hpp>
+#include <gatb/kmer/impl/Model.hpp>
+
+#include <iostream>
+#include <vector>
+
+using namespace std;
+using namespace gatb::core::system::impl;
+
+using namespace gatb::core::tools::misc;
+
+using namespace gatb::core::tools::collections;
+using namespace gatb::core::tools::collections::impl;
+
+using namespace gatb::core::kmer;
+using namespace gatb::core::kmer::impl;
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+
+    if (argc < 2)
+    {
+        cerr << "you must provide at least 1 arguments. Arguments are:" << endl;
+        cerr << "   1) uri of the file"  << endl;
+        cerr << "   2) dump (0 default or 1)"  << endl;
+        return EXIT_FAILURE;
+    }
+
+    string filename = argv[1];
+
+    bool dump = (argc >= 3);
+
+    u_int64_t nbItems  = 0;
+    kmer_type checksum = 0;
+
+    IteratorFile<kmer_type> it (filename);
+    for (it.first(); !it.isDone(); it.next())
+    {
+        if (dump)  { cout << "0x" << *it << endl; }
+        checksum = checksum + *it;
+        nbItems ++;
+    }
+
+    cout << "FOUND " << nbItems << " WITH CHECKSUM " << checksum << endl;
+
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/tools/bankgen.cpp b/gatb-core/tools/bankgen.cpp
new file mode 100644
index 0000000..6fceeed
--- /dev/null
+++ b/gatb-core/tools/bankgen.cpp
@@ -0,0 +1,99 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/gatb_core.hpp>
+
+#include <sstream>
+
+/********************************************************************************/
+void SaveAsFasta (IBank* bank, const std::string& uri)
+{
+    BankFasta output (uri);
+
+    Iterator<Sequence>* it = bank->iterator();
+    LOCAL (it);
+
+    std::stringstream ss;
+
+    size_t count=0;
+    for (it->first(); !it->isDone(); it->next())
+    {
+        // Shortcut.
+        Sequence& seq = it->item();
+
+        // We define some decent header
+        ss.str ("");
+        ss << count++ << "__len__" << seq.getDataSize();
+        seq.setComment (ss.str());
+
+        output.insert (seq);
+    }
+}
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser ("bankgen");
+
+    const char* OUTPUT_PREFIX = "-out";
+    const char* SEQ_LEN       = "-seq-len";
+    const char* READ_LEN      = "-read-len";
+    const char* OVERLAP_LEN   = "-overlap-len";
+    const char* COVERAGE      = "-coverage";
+
+    parser.push_back (new OptionOneParam (OUTPUT_PREFIX,  "output prefix",               true));
+    parser.push_back (new OptionOneParam (SEQ_LEN,        "sequence length",             false,  "1000000"));
+    parser.push_back (new OptionOneParam (READ_LEN,       "read length",                 false,  "150" ));
+    parser.push_back (new OptionOneParam (OVERLAP_LEN,    "overlap between two reads",   false,  "50" ));
+    parser.push_back (new OptionOneParam (COVERAGE,       "coverage",                    false,  "3" ));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We create the random sequence. */
+        IBank* randomBank = new BankRandom (1, options->getInt(SEQ_LEN));
+        LOCAL (randomBank);
+
+        /** We create the reads bank. */
+        IBank* readsBank = new BankSplitter (
+            randomBank,
+            options->getInt(READ_LEN),
+            options->getInt(OVERLAP_LEN),
+            options->getInt(COVERAGE)
+        );
+        LOCAL (readsBank);
+
+        /** We save the random bank. */
+        SaveAsFasta (randomBank, options->getStr(OUTPUT_PREFIX) + "_sequence.fa");
+
+        /** We save the reads bank. */
+        SaveAsFasta (readsBank, options->getStr(OUTPUT_PREFIX) + "_reads.fa");
+    }
+    catch (OptionFailure& e)
+    {
+        e.getParser().displayErrors (stdout);
+        e.getParser().displayHelp   (stdout);
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/tools/dbgcheck.cpp b/gatb-core/tools/dbgcheck.cpp
new file mode 100644
index 0000000..42a11ec
--- /dev/null
+++ b/gatb-core/tools/dbgcheck.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+
+struct Stats
+{
+    Stats() :  nbSuccessors(0), abundance(0), nbBranching(0), abundanceBranching(0) {}
+    Integer    checksumNodes;
+    Integer    checksumSuccessors;
+    u_int64_t  nbSuccessors;
+    u_int64_t  abundance;
+    u_int64_t  nbBranching;
+    Integer    checksumBranching;
+    u_int64_t  abundanceBranching;
+
+    Stats& operator+= (const Stats& st)
+    {
+        if (this != &st)
+        {
+            checksumNodes      += st.checksumNodes;
+            checksumSuccessors += st.checksumSuccessors;
+            nbSuccessors       += st.nbSuccessors;
+            abundance          += st.abundance;
+            nbBranching        += st.nbBranching;
+            checksumBranching  += st.checksumBranching;
+            abundanceBranching += st.abundanceBranching;
+        }
+        return *this;
+    }
+};
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser;
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,  "graph file", true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We load the graph from the provided uri. */
+        Graph graph = Graph::load (options->getStr(STR_URI_INPUT));
+
+        /** We want to gather some statistics during the iteration. */
+        ThreadObject<Stats> stats;
+
+        /*********************************************/
+        /**********    ITERATE ALL NODES    **********/
+        /*********************************************/
+        IDispatcher::Status status = Dispatcher().iterate (graph.iterator<Node>(), [&] (const Node& node)
+        {
+            /** We get the Stats object for the current thread. */
+            Stats& s = stats();
+
+            /** We update the statistics. */
+            s.checksumNodes  += node.kmer;
+            s.abundance      += node.abundance;
+
+            /** We retrieve the successors. */
+            Graph::Vector<Node> nodeset = graph.successors<Node> (node);
+
+            s.nbSuccessors += nodeset.size();
+
+            /** We iterate all the successors. */
+            for (size_t i=0; i<nodeset.size(); i++)  {  s.checksumSuccessors += nodeset[i].kmer;  }
+        });
+
+        /*********************************************/
+        /********** ITERATE BRANCHING NODES **********/
+        /*********************************************/
+        Dispatcher().iterate (graph.iterator<BranchingNode>(), [&] (const BranchingNode& node)
+        {
+            /** We get the Stats object for the current thread. */
+            Stats& s = stats();
+
+            /** We update the statistics. */
+            s.nbBranching  ++;
+            s.checksumBranching  += node.kmer;
+            s.abundanceBranching += node.abundance;
+        });
+
+        /** We finalize the gathered statistics. */
+        stats.foreach ([&stats] (const Stats& st)  {  *stats += st;  });
+
+        /** We dump the statistics. */
+        std::cout << std::endl;
+        std::cout << "nbSolids           = " << graph.iterator<Node>().size ()      << "  "  << std::endl
+                  << "nbSuccessors       = " << stats->nbSuccessors                 << "  "  << std::endl
+                  << "nbBranching        = " << stats->nbBranching                  << "  "  << std::endl
+                  << "checkumNodes       = " << stats->checksumNodes                << "  "  << std::endl
+                  << "checksumSuccessors = " << stats->checksumSuccessors           << "  "  << std::endl
+                  << "checksumBranching  = " << stats->checksumBranching            << "  "  << std::endl
+                  << "abundance          = " << stats->abundance                    << "  "  << std::endl
+                  << "abundanceBranching = " << stats->abundanceBranching           << "  "  << std::endl
+                  << "time               = " << status.time                         << "  "  << std::endl
+                  << "nbCores            = " << status.nbCores                      << "  "  << std::endl
+                  << std::endl;
+        std::cout << std::endl;
+    }
+    catch (OptionFailure& e)
+    {
+        e.getParser().displayErrors (stdout);
+        e.getParser().displayHelp   (stdout);
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/tools/dbgh5.cpp b/gatb-core/tools/dbgh5.cpp
new file mode 100644
index 0000000..7685950
--- /dev/null
+++ b/gatb-core/tools/dbgh5.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/gatb_core.hpp>
+#include <sstream>
+
+/********************************************************************************/
+static const char* STR_EMAIL        = "-email";
+static const char* STR_EMAIL_FORMAT = "-email-fmt";
+static const char* STR_CHECK        = "-check";
+static const char* STR_CHECK_DUMP   = "-check-dump";
+
+int    manageException (IProperties* options, const std::string& message);
+void   sendEmail       (IProperties* options, IProperties* graphInfo);
+size_t checkResult     (const Graph& graph, IProperties* inputProps);
+
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    size_t nbErrors = 0;
+
+    /** We create a command line parser. */
+    IOptionsParser* parser = Graph::getOptionsParser();  LOCAL (parser);
+
+    IOptionsParser* parserGeneral = parser->getParser ("general");
+    if (parserGeneral != 0)
+    {
+        /** We add an option to send the statistics by email. */
+        parserGeneral->push_back (new OptionOneParam (STR_EMAIL,        "send statistics to the given email address", false));
+        parserGeneral->push_back (new OptionOneParam (STR_EMAIL_FORMAT, "'raw' or 'xml'",                             false, "raw"));
+        parserGeneral->push_back (new OptionOneParam (STR_CHECK,        "check result with previous result",          false));
+        parserGeneral->push_back (new OptionOneParam (STR_CHECK_DUMP,   "dump some properties of the created graph into a file", false));
+    }
+
+    try
+    {
+        /** We first check that we have at least one argument. Otherwise, we print some information and leave. */
+        if (argc == 1)
+        {
+            std::cerr << LibraryInfo::getInfo();
+            OptionsHelpVisitor visitor (std::cerr);
+            parser->accept (visitor, 0);
+            return EXIT_SUCCESS;
+        }
+
+        /** We parse the user options. */
+        IProperties* props = parser->parse (argc, argv);
+
+        /** We create the graph with the provided options. */
+        Graph graph = Graph::create (props);
+
+        /** We may have to check the result. */
+        if (props->get (STR_CHECK) > 0)  {  nbErrors = checkResult (graph, props);  }
+
+        /** We dump some information about the graph. */
+        if (props->getInt(STR_VERBOSE) > 0)  {  std::cout << graph.getInfo() << std::endl;  }
+
+        /** We may have to send statistics by email. */
+        if (props->get(STR_EMAIL))  {  sendEmail (props, &graph.getInfo());  }
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        return manageException (parser->getProperties(), e.getMessage());
+    }
+    catch (std::string& msg)
+    {
+        return manageException (parser->getProperties(), msg);
+    }
+    catch (const char* msg)
+    {
+        return manageException (parser->getProperties(), msg);
+    }
+
+    return nbErrors == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+/********************************************************************************/
+void sendEmail (IProperties* options, IProperties* graphInfo)
+{
+    std::string outfmt = options->getStr(STR_EMAIL_FORMAT);
+
+    /** We build the mail content. */
+    std::stringstream output;
+    if (outfmt == "raw")
+    {
+        RawDumpPropertiesVisitor visit (output);
+        graphInfo->accept (&visit);
+    }
+    else if (outfmt == "xml")
+    {
+        XmlDumpPropertiesVisitor visit (output);
+        graphInfo->accept (&visit);
+    }
+    else
+    {
+        /** Unknown format. */
+        throw Exception ("Unable to send email because of unknown format '%s'", outfmt.c_str());
+    }
+
+    /** We build the mail command. */
+    std::stringstream cmd;
+    cmd << "echo \"" << output.str()
+        << "\" | mail -s \"[dbgh5] " << System::file().getBaseName(options->getStr(STR_URI_INPUT)) << "\" "
+        << options->getStr(STR_EMAIL);
+
+    /** We execute the command. */
+   ::system (cmd.str().c_str());
+}
+
+/********************************************************************************/
+int manageException (IProperties* options, const std::string& message)
+{
+    std::cout << std::endl << "EXCEPTION: " << message << std::endl;
+
+    if (options && options->get(STR_EMAIL))
+    {
+        Properties props;  props.add(0, "error", message.c_str());
+        sendEmail (options, &props);
+    }
+
+    return EXIT_FAILURE;
+}
+
+/********************************************************************************/
+size_t checkResult (const Graph& graph, IProperties* inputProps)
+{
+    size_t nbErrors = 0;
+
+    string filecheck = inputProps->getStr(STR_CHECK);
+
+    /** We get the graph properties. */
+    IProperties& graphProps = graph.getInfo();
+
+    /** We read the check file. */
+    Properties checkProps;  checkProps.readFile (filecheck);
+
+    /** We need properties for output file if needed. */
+    Properties outputProps;
+    Properties tmpProps;
+
+    /** We get the keys to be checked. */
+    set<string> keys = checkProps.getKeys();
+    for (set<string>::iterator it = keys.begin(); it != keys.end(); ++it)
+    {
+        if (graphProps.get(*it)==0)
+        {
+            tmpProps.add (0, "unknown", "%s", (*it).c_str());
+            continue;
+        }
+
+        string v1 = checkProps.getStr(*it);
+        string v2 = graphProps.getStr(*it);
+
+        if (v1 != v2)
+        {
+            tmpProps.add (0, "diff", "%s", (*it).c_str());
+            tmpProps.add (1, "val",  "%s", v1.c_str());
+            tmpProps.add (1, "val",  "%s", v2.c_str());
+            nbErrors++;
+        }
+
+        /** We put the graph property into the output props. */
+        outputProps.add (0, *it, v2);
+    }
+
+    graphProps.add (1, "check", "%d/%d", keys.size()-nbErrors, keys.size());
+    graphProps.add (2, tmpProps);
+
+    if (inputProps->get(STR_CHECK_DUMP))
+    {
+        ofstream outputFile (inputProps->getStr(STR_CHECK_DUMP).c_str());
+        if (outputFile.is_open())
+        {
+            RawDumpPropertiesVisitor visitor (outputFile, 40, ' ');
+            outputProps.accept (&visitor);
+        }
+    }
+
+    return nbErrors;
+}
diff --git a/gatb-core/tools/dbginfo.cpp b/gatb-core/tools/dbginfo.cpp
new file mode 100644
index 0000000..5b3f855
--- /dev/null
+++ b/gatb-core/tools/dbginfo.cpp
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/gatb_core.hpp>
+
+using namespace std;
+
+/********************************************************************************/
+
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser;
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,  "graph file", true));
+
+    try
+    {
+        /** We parse the user options. */
+        IProperties* options = parser.parse (argc, argv);
+
+        /** We load the graph from the provided uri. */
+        Graph graph = Graph::load (options->getStr(STR_URI_INPUT));
+
+        /** We get information about the graph. */
+        cout << graph.getInfo();
+    }
+    catch (OptionFailure& e)
+    {
+        return e.displayErrors (std::cout);
+    }
+    catch (Exception& e)
+    {
+        cerr << "ERROR : " << e.getMessage() << endl;
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/gatb-core/tools/dbgtopology.cpp b/gatb-core/tools/dbgtopology.cpp
new file mode 100644
index 0000000..aa056b0
--- /dev/null
+++ b/gatb-core/tools/dbgtopology.cpp
@@ -0,0 +1,321 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+// We include what we need for the test
+#include <gatb/gatb_core.hpp>
+#include <map>
+#include <cstdio>
+#include <cstdlib>
+#include <set>
+
+#undef NDEBUG
+#include <cassert>
+
+using namespace std;
+
+/********************************************************************************/
+
+// We define a class that marks nodes in a graph and call tell whether a given node is marked or not.
+// We use a map for the implementation (could be not optimal).
+template<typename T>  class GraphMarker
+{
+public:
+
+    GraphMarker (const Graph& graph) : graph(graph)
+    {
+        // We insert all the nodes into our map.
+        graph.iterator<T>().iterate (IterateNodes(this));
+    }
+
+    void mark (const T& item)  {  markMap [item] = true;  }
+
+    void mark (const set<T>& items)
+    {
+        for (typename set<T>::const_iterator it=items.begin(); it != items.end(); ++it)  {  mark (*it); }
+    }
+
+    bool isMarked (const T& item) const  {  return markMap.find(item)->second;  }
+
+private:
+    const Graph& graph;
+    map<T,bool>  markMap;
+
+    struct IterateNodes
+    {
+        IterateNodes (GraphMarker* marker) : marker(marker) {}
+        GraphMarker* marker;
+        void operator() (const T& item) const  {  marker->markMap[item] = false;  }
+    };
+};
+
+/********************************************************************************/
+
+// We define a class that performs a breadth first search in a graph from a starting node.
+// We need a marker to globally mark the visited nodes from one call to another.
+// The nodes visit is handled by a std::queue object.
+template<typename T>  class BFS
+{
+public:
+
+    BFS (const Graph& graph) : graph(graph) {}
+
+    // Process the BFS started from the provided node. As a result, we get the nodes number in the
+    // found connected component.
+    const set<T>& run (const T& node)
+    {
+        // ALGORITHM (recursion on n)
+        //    We define as C(n) the set of nodes of the connected component to be computed.
+        //    We define as F(n) the set of nodes for which we get neighbors for extending the BFS
+        //    We use the function N(E) that returns the set of neighbors nodes of items in set E
+        //
+        //  Init:
+        //      C(0)={b} and F(0)={b},  where b is the initial node
+        //  Recursion:
+        //      F(n+1) = N(F(n)) - C(n)
+        //      C(n+1) = N(F(n)) + C(n)
+        //  End criteria:
+        //      card(F(n)) = 0
+
+        // We set the initial state for F(0)
+        set<T> frontline;
+        frontline.insert (node);
+
+        // We set the initial state for C(0)
+        connectedComponent.clear();
+        connectedComponent.insert (node);
+
+        // We clear the statistics
+        bfsInfo.clear ();
+
+        // We launch the recursion.
+        while (!frontline.empty())
+        {
+            // We add statistics information for the current depth in the BFS.
+            bfsInfo.push_back (make_pair(frontline.size(), connectedComponent.size()));
+
+            // We get the neighbors for the current front line, ie. we get N(F(n))
+            set<T> neighbors = graph.neighbors<T> (frontline.begin(), frontline.end());
+
+            // We reset the current front line => we reuse it for computing F(n+1)
+            frontline.clear();
+
+            // We compute the recursion for F(n+1) and C(n+1)
+            for (typename set<T>::iterator it = neighbors.begin(); it != neighbors.end(); it++)
+            {
+                if (connectedComponent.find (*it) == connectedComponent.end())
+                {
+                    // F(n+1) = N(F(n)) - C(n)
+                    frontline.insert (*it);
+
+                    // C(n+1) = N(F(n)) + C(n)
+                    connectedComponent.insert (*it);
+                }
+            }
+        }
+
+        // We return the number of nodes for this connected component
+        return connectedComponent;
+    }
+
+    // We provide an accessor to the nodes of the found connected component
+    const set<T>& get() const { return connectedComponent; }
+
+    // Statistics
+    const list<pair<size_t,size_t> >& getStatistics() const { return bfsInfo; }
+
+private:
+    const Graph& graph;
+    set<T>       connectedComponent;
+
+    list<pair<size_t,size_t> > bfsInfo;
+};
+
+/** */
+struct Entry   {  size_t nbOccurs;  size_t nbKmers;    Entry() : nbOccurs(0), nbKmers(0) {} };
+
+/** */
+typedef pair<size_t,size_t> InOut_t;
+bool CompareFct (const pair<InOut_t,size_t>& a, const pair<InOut_t,size_t>& b) { return a.second > b.second; }
+
+/********************************************************************************/
+/*        Computing connected components of the branching nodes subgraph.       */
+/********************************************************************************/
+int main (int argc, char* argv[])
+{
+    /** We create a command line parser. */
+    OptionsParser parser;
+    parser.push_back (new OptionOneParam (STR_URI_INPUT,  "graph file", true));
+
+    IProperties* params = 0;
+
+    try  {
+        /** We parse the user options. */
+        params = parser.parse (argc, argv);
+    }
+    catch (OptionFailure& e)
+    {
+        e.getParser().displayErrors (stdout);
+        e.getParser().displayHelp   (stdout);
+        return EXIT_FAILURE;
+    }
+
+    // We create the graph with the bank and other options
+    Graph graph = Graph::load (params->getStr(STR_URI_INPUT));
+
+    // We create a graph marker.
+    GraphMarker<BranchingNode> marker (graph);
+
+    // We create an object for Breadth First Search for the de Bruijn graph.
+    BFS<BranchingNode> bfs (graph);
+
+    // We want to compute the distribution of connected components of the branching nodes.
+    //    - key is a connected component class (for a given number of branching nodes for this component)
+    //    - value is the number of times this component class occurs in the branching sub graph
+    map<size_t,Entry> distrib;
+
+    // We get an iterator for all nodes of the graph. We use a progress iterator to get some progress feedback
+    ProgressGraphIterator<BranchingNode,ProgressTimer>  itBranching (graph.iterator<BranchingNode>(), "statistics");
+
+    // We want to know the number of connected components
+    size_t nbConnectedComponents = 0;
+
+    // We define some kind of unique identifier for a couple (indegree,outdegree)
+    map <InOut_t, size_t> topology;
+
+    size_t simplePathSizeMin = ~0;
+    size_t simplePathSizeMax =  0;
+
+
+    // We want time duration of the iteration
+    TimeInfo ti;
+    ti.start ("compute");
+
+    // We loop the branching nodes
+    for (itBranching.first(); !itBranching.isDone(); itBranching.next())
+    {
+        // We get branching nodes neighbors for the current branching node.
+        Graph::Vector<BranchingEdge> successors   = graph.successors  <BranchingEdge> (*itBranching);
+        Graph::Vector<BranchingEdge> predecessors = graph.predecessors<BranchingEdge> (*itBranching);
+
+        // We increase the occurrences number for the current couple (in/out) neighbors
+        topology [make_pair(predecessors.size(), successors.size())] ++;
+
+        // We loop the in/out neighbors and update min/max simple path size
+        for (size_t i=0; i<successors.size(); i++)
+        {
+            simplePathSizeMax = std::max (simplePathSizeMax, successors[i].distance);
+            simplePathSizeMin = std::min (simplePathSizeMin, successors[i].distance);
+        }
+        for (size_t i=0; i<predecessors.size(); i++)
+        {
+            simplePathSizeMax = std::max (simplePathSizeMax, predecessors[i].distance);
+            simplePathSizeMin = std::min (simplePathSizeMin, predecessors[i].distance);
+        }
+
+        // We skip already visited nodes.
+        if (marker.isMarked (*itBranching))  { continue; }
+
+        // We launch the breadth first search; we get as a result the set of branching nodes in this component
+        const set<BranchingNode>& component = bfs.run (*itBranching);
+
+        // We mark the nodes for this connected component
+        marker.mark (component);
+
+        // We update our distribution
+        distrib[component.size()].nbOccurs += 1;
+
+        // We update the number of connected components.
+        nbConnectedComponents++;
+    }
+
+    ti.stop ("compute");
+
+    // We compute the total number of branching nodes in all connected components.
+    size_t sumOccurs = 0;
+    size_t sumKmers = 0;
+    for (map<size_t,Entry>::iterator it = distrib.begin(); it != distrib.end(); it++)
+    {
+        sumOccurs += it->first*it->second.nbOccurs;
+        sumKmers  += it->second.nbKmers;
+    }
+
+    // We sort the statistics by decreasing occurrence numbers. Since map have its own ordering, we need to put all
+    // the data into a vector and sort it with our own sorting criteria.
+    vector < pair<InOut_t,size_t> >  stats;
+    for (map <InOut_t, size_t>::iterator it = topology.begin(); it != topology.end(); it++)  { stats.push_back (*it); }
+
+    sort (stats.begin(), stats.end(), CompareFct);
+
+    // Note: it must be equal to the number of branching nodes of the graph
+    assert (sumOccurs == itBranching.size());
+
+    // We aggregate the computed information
+    Properties props ("topology");
+
+    props.add (1, "graph");
+    props.add (2, "name",                    "%s", graph.getName().c_str());
+    props.add (2, "db_input",                "%s", graph.getInfo().getStr("input").c_str());
+    props.add (2, "db_nb_seq",               "%d", graph.getInfo().getInt("sequences_number"));
+    props.add (2, "db_size",                 "%d", graph.getInfo().getInt("sequences_size"));
+    props.add (2, "kmer_size",               "%d", graph.getInfo().getInt("kmer_size"));
+    props.add (2, "kmer_nks",                "%d", graph.getInfo().getInt("nks"));
+    props.add (2, "nb_nodes",                "%d", graph.getInfo().getInt("kmers_nb_solid"));
+    props.add (2, "nb_branching_nodes",      "%d", graph.getInfo().getInt("nb_branching"));
+    props.add (2, "percent_branching_nodes", "%.1f",
+        graph.getInfo().getInt("kmers_nb_solid") > 0 ?
+        100.0 * (float)graph.getInfo().getInt("nb_branching") / (float) graph.getInfo().getInt("kmers_nb_solid") : 0
+    );
+
+    props.add (1, "branching_nodes");
+
+    props.add (2, "simple_path");
+    props.add (3, "size_min", "%d", simplePathSizeMin);
+    props.add (3, "size_max", "%d", simplePathSizeMax);
+
+    props.add (2, "neighborhoods");
+    for (size_t i=0; i<stats.size(); i++)
+    {
+        props.add (3, "neighborhood", "in=%d out=%d", stats[i].first.first, stats[i].first.second);
+        props.add (4, "nb_bnodes",     "%d",    stats[i].second);
+        props.add (4, "percentage",   "%5.2f", itBranching.size() > 0 ?
+            100.0*(float)stats[i].second / (float)itBranching.size() : 0
+        );
+    }
+
+    props.add (2, "connected_components");
+    props.add (3, "nb_classes",    "%d", distrib.size());
+    props.add (3, "nb_components", "%d", nbConnectedComponents);
+    for (map<size_t,Entry>::iterator it = distrib.begin(); it!=distrib.end(); it++)
+    {
+        props.add (3, "component_class");
+        props.add (4, "nb_occurs",    "%d", it->second.nbOccurs);
+        props.add (4, "nb_bnodes",    "%d", it->first);
+        props.add (4, "freq_bnodes",  "%f", sumOccurs > 0 ?
+            100.0*(float)(it->first*it->second.nbOccurs) / (float)sumOccurs : 0
+        );
+    }
+    props.add (1, ti.getProperties("time"));
+
+    // We dump the results in a XML file in the current directory
+    XmlDumpPropertiesVisitor v (graph.getName() + ".xml", false);
+    props.accept (&v);
+
+    return EXIT_SUCCESS;
+}
+//! [snippet1]
diff --git a/gatb-core/tools/leon.cpp b/gatb-core/tools/leon.cpp
new file mode 100644
index 0000000..47a4d88
--- /dev/null
+++ b/gatb-core/tools/leon.cpp
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ *   GATB : Genome Assembly Tool Box
+ *   Copyright (C) 2014  INRIA
+ *   Authors: R.Chikhi, G.Rizk, E.Drezen
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as
+ *  published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <gatb/gatb_core.hpp>
+
+#include <gatb/tools/compression/Leon.hpp>
+
+
+using namespace std;
+
+/********************************************************************************/
+void displayVersion(std::ostream& os){
+	
+	os << "* * * * * * * * * * * * * * * * * * * * * *" << endl;
+	os << "* Leon version "<< LEON_VERSION_MAJOR << "."
+	<< LEON_VERSION_MINOR << "."
+	<< LEON_VERSION_PATCH
+	<< "                      *" << endl; //<< " AGPL licence" <<endl;
+	os << "* Using gatb-core version "<< System::info().getVersion() <<  "           *" << endl;
+	os << "* * * * * * * * * * * * * * * * * * * * * *" << endl;
+}
+
+int main (int argc, char* argv[])
+{
+	
+	if(argc > 1 && (   strcmp(argv[1],STR_VERSION)==0 || strcmp(argv[1],"-v")==0    )     ){
+		displayVersion(cout);
+		return EXIT_FAILURE;
+	}
+		// We define a try/catch block in case some method fails
+	try
+	{
+		Leon ().run (argc, argv);
+		
+	}
+	catch (gatb::core::system::Exception& e)
+	{
+		
+		cerr << "EXCEPTION: " << e.getMessage() << endl;
+		return EXIT_FAILURE;
+	}
+	
+	return EXIT_SUCCESS;
+	
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/gatb-core.git



More information about the debian-med-commit mailing list